diff --git a/TSM_PicoW_Sensor/.gitignore b/TSM_PicoW_Sensor/.gitignore new file mode 100644 index 0000000..d7f22a3 --- /dev/null +++ b/TSM_PicoW_Sensor/.gitignore @@ -0,0 +1,4 @@ +/build/ +/Testing/ +/.vscode/ +/.devcontainer/ diff --git a/TSM_PicoW_Sensor/CMakeLists.txt b/TSM_PicoW_Sensor/CMakeLists.txt new file mode 100644 index 0000000..edb57b5 --- /dev/null +++ b/TSM_PicoW_Sensor/CMakeLists.txt @@ -0,0 +1,120 @@ +cmake_minimum_required(VERSION 3.25...3.30) + +# Toolchain file is set in CMakePresets.json +message(STATUS "Toolchain file is: " ${CMAKE_TOOLCHAIN_FILE}) + +# use pre-built picotool if present: +if(EXISTS "$ENV{PICO_SDK_PATH}/../picotool") + set(picotool_DIR $ENV{PICO_SDK_PATH}/../picotool) + message(STATUS "picotool found in: " ${picotool_DIR}) +else() + message(STATUS "picotool not found, need to build it.") +endif() + +# use pre-built pioasm if present: +if(EXISTS "$ENV{PICO_SDK_PATH}/../pioasm") + set(pioasm_DIR $ENV{PICO_SDK_PATH}/../pioasm) + message(STATUS "pioasm found in: " ${pioasm_DIR}) + add_executable(Pioasm IMPORTED) + set_property(TARGET Pioasm PROPERTY IMPORTED_LOCATION ${pioasm_DIR}) + set(Pioasm_FOUND 1) +else() + message(STATUS "pioasm not found, need to build it.") +endif() + +# Required for McuLib, to know the target system +set( + MCULIB_TARGET RP2040 CACHE STRING + "Select McuLib target: MCUXPRESSO, RP2040 or ESP32" +) + +# turn variable on for verbose output, useful for build debugging. Or run 'ninja --verbose' in the build folder +#set(CMAKE_VERBOSE_MAKEFILE ON CACHE BOOL "ON") + +# settings for the board and hardware used +set(PICO_PLATFORM rp2040) +set(PICO_BOARD pico_w) # pico or pico_w + +# initialize the SDK based on PICO_SDK_PATH +# note: this must happen before project() +# Include build functions from Pico SDK +include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake) + +# set project name ${CMAKE_PROJECT_NAME} +project(TSM_PicoW_Sensor + C CXX ASM +) + +# set C and C++ standard to be used +set(CMAKE_C_STANDARD 11) +set(CMAKE_CXX_STANDARD 17) + +# [Platfrom specific command] Initialize the Raspberry Pi Pico SDK +pico_sdk_init() + +message(STATUS "Pico SDK version is: " ${PICO_SDK_VERSION_STRING}) + +# set variables for directories +set(PROJECT_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}") +set(MCULIB_DIR "${PROJECT_ROOT_DIR}/McuLib") +set(EXECUTABLE ${PROJECT_NAME}.elf) +set(BUILD_DIR "${PROJECT_ROOT_DIR}/build") +set(TEST_EXECUTABLE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.elf") + +add_compile_options(-include "${PROJECT_ROOT_DIR}/src/IncludeMcuLibConfig.h") +include_directories("${MCULIB_DIR}/src") +include_directories("${PROJECT_ROOT_DIR}/src") + +# add linker flags to print cross-reference table in map file and memory usage on console +add_link_options(-Wl,--cref,--print-memory-usage) + +# to avoid that it shows up as 'Reset' USB device, see https://forums.raspberrypi.com/viewtopic.php?t=324909 +add_compile_options(-DPICO_STDIO_USB_ENABLE_RESET_VIA_VENDOR_INTERFACE=0) + +# Check if ENABLE_UNIT_TESTING is set to ON in the CMake preset +if (ENABLE_UNIT_TESTING) + message(STATUS "ENABLE_UNIT_TESTING is ON") + add_compile_options(-DENABLE_UNIT_TESTS=1) # used to enable tests in code +else() + message(STATUS "ENABLE_UNIT_TESTING is OFF") + add_compile_options(-DENABLE_UNIT_TESTS=0) # used to disable tests in code +endif() + +add_executable(${CMAKE_PROJECT_NAME} + # add additional source files here +) + +add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD + COMMAND arm-none-eabi-size "${CMAKE_PROJECT_NAME}.elf" + COMMENT "Printing code and data size" +) + +# add component directories to the list +add_subdirectory(./src srcLib) + +# generate extra files (map/bin/hex/uf2) +pico_add_extra_outputs(${CMAKE_PROJECT_NAME}) + +target_link_libraries( + ${CMAKE_PROJECT_NAME} + PRIVATE pico_stdlib + PUBLIC srcLib +) +################################################################################## +# Unit Test support +if (ENABLE_UNIT_TESTING) + # Adding some options to make CTest more verbose, helpful in case of failures. + list(APPEND CMAKE_CTEST_ARGUMENTS "--output-on-failure") + list(APPEND CMAKE_CTEST_ARGUMENTS "--verbose") + + # Include CTest support + include(CTest) # note: this adds a BUILD_TESTING which defaults to ON, which can be used in other CMakeLists.txt + + # Just a check for the variable + if (BUILD_TESTING) + message(STATUS "BUILD_TESTING is ON") + endif() + + message(STATUS "Adding unity") + add_subdirectory(${MCULIB_DIR}/unity unity) +endif() diff --git a/TSM_PicoW_Sensor/CMakePresets.json b/TSM_PicoW_Sensor/CMakePresets.json new file mode 100644 index 0000000..3fdf907 --- /dev/null +++ b/TSM_PicoW_Sensor/CMakePresets.json @@ -0,0 +1,131 @@ +{ + "version": 6, + "cmakeMinimumRequired": + { + "major": 3, + "minor": 28, + "patch": 0 + }, + "configurePresets": + [ + { + "name": "default", + "displayName": "Default Config", + "hidden": true, + "description": "Default build using Ninja generator", + "generator": "Ninja", + "binaryDir": "${sourceDir}/build/${presetName}", + "toolchainFile": "$env{PICO_SDK_PATH}/cmake/preload/toolchains/pico_arm_cortex_m0plus_gcc.cmake" + }, + { + "name": "Debug", + "inherits": "default", + "displayName": "Debug", + "description": "Debug Configuration", + "cacheVariables": + { + "CMAKE_BUILD_TYPE": "Debug", + "ENABLE_UNIT_TESTING": "OFF" + } + }, + { + "name": "Test", + "displayName": "Test", + "description": "Configuration with tests enabled", + "inherits": "default", + "cacheVariables": + { + "CMAKE_BUILD_TYPE": "Debug", + "ENABLE_UNIT_TESTING": "ON" + } + }, + { + "name": "Release", + "inherits": "default", + "displayName": "Release", + "description": "Release Configuration", + "cacheVariables": + { + "CMAKE_BUILD_TYPE": "Release", + "ENABLE_UNIT_TESTING": "OFF" + } + } + ], + "buildPresets": + [ + { + "name": "default", + "hidden": true, + "displayName": "default build", + "configurePreset": "default" + }, + { + "name": "app-debug", + "displayName": "debug build", + "configurePreset": "Debug", + "configuration": "Debug" + }, + { + "name": "app-release", + "displayName": "release build", + "configurePreset": "Release", + "configuration": "Release" + }, + { + "name": "app-test", + "displayName": "test build", + "configurePreset": "Test", + "configuration": "Test" + } + ], + "testPresets": + [ + { + "name": "Test", + "description": "test preset", + "displayName": "test preset", + "configurePreset": "Test" + } + ], + "packagePresets": + [ + { + "name": "default", + "displayName": "default package preset", + "configurePreset": "default", + "generators": + [ + "TGZ" + ] + }, + { + "name": "releasePackage", + "description": "", + "displayName": "", + "configurePreset": "Release" + } + ], + "workflowPresets": + [ + { + "name": "workflow", + "description": "run test", + "displayName": "testing", + "steps": + [ + { + "type": "configure", + "name": "Test" + }, + { + "type": "build", + "name": "app-test" + }, + { + "type": "test", + "name": "Test" + } + ] + } + ] +} \ No newline at end of file diff --git a/TSM_PicoW_Sensor/LICENSE b/TSM_PicoW_Sensor/LICENSE new file mode 100644 index 0000000..e0daee6 --- /dev/null +++ b/TSM_PicoW_Sensor/LICENSE @@ -0,0 +1,27 @@ +MIT License + +Copyright (c) 2025 Erich Styger + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +IMPORTANT: +There are the following parts which use possible *different* licenses. +Consult the license in information in the follwoing subfolders: +- McuLib: Library with different open source components, see subfolder + diff --git a/TSM_PicoW_Sensor/McuLib/CMakeLists.txt b/TSM_PicoW_Sensor/McuLib/CMakeLists.txt new file mode 100644 index 0000000..896477d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/CMakeLists.txt @@ -0,0 +1,108 @@ + +if (DEFINED PICO_BOARD) + message(STATUS "McuLib for Raspberry Pi Pico (RP2040, RP2350)") + INCLUDE (RPxxxx_CMakeLists.txt) +elseif ( MCULIB_TARGET STREQUAL "MCUXPRESSO" ) + message(STATUS "McuLib for MCUXpresso SDK") + INCLUDE (MCUXpresso_CMakeLists.txt) +else () + message(STATUS "McuLib for ESP32") + # Espressif IDF CMake files are special: cannot include sub file here. + idf_component_register( + SRCS + "fonts/McuFontCour08Bold.c" + "fonts/McuFontCour08Normal.c" + "fonts/McuFontCour10Bold.c" + "fonts/McuFontCour10Normal.c" + "fonts/McuFontCour12Bold.c" + "fonts/McuFontCour12Normal.c" + "fonts/McuFontCour14Bold.c" + "fonts/McuFontCour14Normal.c" + "fonts/McuFontCour18Bold.c" + "fonts/McuFontCour18Normal.c" + "fonts/McuFontCour24Bold.c" + "fonts/McuFontCour24Normal.c" + "fonts/McuFontHelv08Bold.c" + "fonts/McuFontHelv08Normal.c" + "fonts/McuFontHelv10Bold.c" + "fonts/McuFontHelv10Normal.c" + "fonts/McuFontHelv12Bold.c" + "fonts/McuFontHelv12Normal.c" + "fonts/McuFontHelv14Bold.c" + "fonts/McuFontHelv14Normal.c" + "fonts/McuFontHelv18Bold.c" + "fonts/McuFontHelv18Normal.c" + "fonts/McuFontHelv24Bold.c" + "fonts/McuFontHelv24Normal.c" + + "RNet/McuNRF24L01.c" + "RNet/McuRNet.c" + "RNet/Radio.c" + "RNet/RApp.c" + "RNet/RMAC.c" + "RNet/RMSG.c" + "RNet/RNWK.c" + "RNet/RPHY.c" + "RNet/RStack.c" + "RNet/RStdIO.c" + + "src/McuArmTools.c" + "src/McuButton.c" + "src/McuCriticalSection.c" + "src/McuDebounce.c" + "src/McuFXOS8700.c" + "src/McuFontDisplay.c" + "src/McuGenericI2C.c" + "src/McuGDisplaySSD1306.c" + "src/McuGPIO.c" + "src/McuGFont.c" + "src/McuI2cLib.c" + "src/McuINA260.c" + "src/McuLib.c" + "src/McuLED.c" + "src/McuLog.c" + "src/McuRB.c" + "src/McuRTOS.c" + "src/McuShell.c" + "src/McuSPI.c" + "src/McuSHT31.c" + "src/McuSHT40.c" + "src/McuSSD1306.c" + "src/McuTimeDate.c" + "src/McuTimeout.c" + "src/McuTrigger.c" + "src/McuUart485.c" + "src/McuUtility.c" + "src/McuWait.c" + "src/McuXFormat.c" + INCLUDE_DIRS + "./" + "./config" + "./src" + "./fonts" + "./config/fonts" + REQUIRES + driver + ) + +endif () + + +###################################################### +# MCULIB_TARGET needs to be set in main CMakeList.txt, for example: +#set( +# MCULIB_TARGET RP2040 CACHE STRING +# "Select McuLib target: RP2040, MCUXPRESSO or ESP32" +#) +# +###################################################### +# if ( MCULIB_TARGET STREQUAL "ESP32" ) +# message(STATUS "McuLib for ESP32") +# INCLUDE (ESP32_CMakeLists.txt) +# elseif ( MCULIB_TARGET STREQUAL "RP2040" ) +# message(STATUS "McuLib for RP2040") +# INCLUDE (RP2040_CMakeLists.txt) +# else () +# message ( STATUS "Unknown McuLib target: ${MCULIB_TARGET}" ) +# endif () +###################################################### diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/00history.txt b/TSM_PicoW_Sensor/McuLib/FatFS/00history.txt new file mode 100644 index 0000000..464850b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/00history.txt @@ -0,0 +1,254 @@ +---------------------------------------------------------------------------- + Revision history of FatFs module +---------------------------------------------------------------------------- + +R0.00 (February 26, 2006) + + Prototype. + + + +R0.01 (April 29, 2006) + + First stable version. + + + +R0.02 (June 01, 2006) + + Added FAT12 support. + Removed unbuffered mode. + Fixed a problem on small (<32M) partition. + + + +R0.02a (June 10, 2006) + + Added a configuration option (_FS_MINIMUM). + + + +R0.03 (September 22, 2006) + + Added f_rename(). + Changed option _FS_MINIMUM to _FS_MINIMIZE. + + + +R0.03a (December 11, 2006) + + Improved cluster scan algorithm to write files fast. + Fixed f_mkdir() creates incorrect directory on FAT32. + + + +R0.04 (February 04, 2007) + + Added f_mkfs(). + Supported multiple drive system. + Changed some interfaces for multiple drive system. + Changed f_mountdrv() to f_mount(). + + + +R0.04a (April 01, 2007) + + Supported multiple partitions on a physical drive. + Added a capability of extending file size to f_lseek(). + Added minimization level 3. + Fixed an endian sensitive code in f_mkfs(). + + + +R0.04b (May 05, 2007) + + Added a configuration option _USE_NTFLAG. + Added FSINFO support. + Fixed DBCS name can result FR_INVALID_NAME. + Fixed short seek (<= csize) collapses the file object. + + + +R0.05 (August 25, 2007) + + Changed arguments of f_read(), f_write() and f_mkfs(). + Fixed f_mkfs() on FAT32 creates incorrect FSINFO. + Fixed f_mkdir() on FAT32 creates incorrect directory. + + + +R0.05a (February 03, 2008) + + Added f_truncate() and f_utime(). + Fixed off by one error at FAT sub-type determination. + Fixed btr in f_read() can be mistruncated. + Fixed cached sector is not flushed when create and close without write. + + + +R0.06 (April 01, 2008) + + Added fputc(), fputs(), fprintf() and fgets(). + Improved performance of f_lseek() on moving to the same or following cluster. + + + +R0.07 (April 01, 2009) + + Merged Tiny-FatFs as a configuration option. (_FS_TINY) + Added long file name feature. (_USE_LFN) + Added multiple code page feature. (_CODE_PAGE) + Added re-entrancy for multitask operation. (_FS_REENTRANT) + Added auto cluster size selection to f_mkfs(). + Added rewind option to f_readdir(). + Changed result code of critical errors. + Renamed string functions to avoid name collision. + + + +R0.07a (April 14, 2009) + + Septemberarated out OS dependent code on reentrant cfg. + Added multiple sector size feature. + + + +R0.07c (June 21, 2009) + + Fixed f_unlink() can return FR_OK on error. + Fixed wrong cache control in f_lseek(). + Added relative path feature. + Added f_chdir() and f_chdrive(). + Added proper case conversion to extended character. + + + +R0.07e (November 03, 2009) + + Septemberarated out configuration options from ff.h to ffconf.h. + Fixed f_unlink() fails to remove a sub-directory on _FS_RPATH. + Fixed name matching error on the 13 character boundary. + Added a configuration option, _LFN_UNICODE. + Changed f_readdir() to return the SFN with always upper case on non-LFN cfg. + + + +R0.08 (May 15, 2010) + + Added a memory configuration option. (_USE_LFN = 3) + Added file lock feature. (_FS_SHARE) + Added fast seek feature. (_USE_FASTSEEK) + Changed some types on the API, XCHAR->TCHAR. + Changed .fname in the FILINFO structure on Unicode cfg. + String functions support UTF-8 encoding files on Unicode cfg. + + + +R0.08a (August 16, 2010) + + Added f_getcwd(). (_FS_RPATH = 2) + Added sector erase feature. (_USE_ERASE) + Moved file lock semaphore table from fs object to the bss. + Fixed f_mkfs() creates wrong FAT32 volume. + + + +R0.08b (January 15, 2011) + + Fast seek feature is also applied to f_read() and f_write(). + f_lseek() reports required table size on creating CLMP. + Extended format syntax of f_printf(). + Ignores duplicated directory separators in given path name. + + + +R0.09 (September 06, 2011) + + f_mkfs() supports multiple partition to complete the multiple partition feature. + Added f_fdisk(). + + + +R0.09a (August 27, 2012) + + Changed f_open() and f_opendir() reject null object pointer to avoid crash. + Changed option name _FS_SHARE to _FS_LOCK. + Fixed assertion failure due to OS/2 EA on FAT12/16 volume. + + + +R0.09b (January 24, 2013) + + Added f_setlabel() and f_getlabel(). + + + +R0.10 (October 02, 2013) + + Added selection of character encoding on the file. (_STRF_ENCODE) + Added f_closedir(). + Added forced full FAT scan for f_getfree(). (_FS_NOFSINFO) + Added forced mount feature with changes of f_mount(). + Improved behavior of volume auto detection. + Improved write throughput of f_puts() and f_printf(). + Changed argument of f_chdrive(), f_mkfs(), disk_read() and disk_write(). + Fixed f_write() can be truncated when the file size is close to 4GB. + Fixed f_open(), f_mkdir() and f_setlabel() can return incorrect value on error. + + + +R0.10a (January 15, 2014) + + Added arbitrary strings as drive number in the path name. (_STR_VOLUME_ID) + Added a configuration option of minimum sector size. (_MIN_SS) + 2nd argument of f_rename() can have a drive number and it will be ignored. + Fixed f_mount() with forced mount fails when drive number is >= 1. (appeared at R0.10) + Fixed f_close() invalidates the file object without volume lock. + Fixed f_closedir() returns but the volume lock is left acquired. (appeared at R0.10) + Fixed creation of an entry with LFN fails on too many SFN collisions. (appeared at R0.07) + + + +R0.10b (May 19, 2014) + + Fixed a hard error in the disk I/O layer can collapse the directory entry. + Fixed LFN entry is not deleted on delete/rename an object with lossy converted SFN. (appeared at R0.07) + + + +R0.10c (November 09, 2014) + + Added a configuration option for the platforms without RTC. (_FS_NORTC) + Changed option name _USE_ERASE to _USE_TRIM. + Fixed volume label created by Mac OS X cannot be retrieved with f_getlabel(). (appeared at R0.09b) + Fixed a potential problem of FAT access that can appear on disk error. + Fixed null pointer dereference on attempting to delete the root direcotry. (appeared at R0.08) + + + +R0.11 (February 09, 2015) + + Added f_findfirst(), f_findnext() and f_findclose(). (_USE_FIND) + Fixed f_unlink() does not remove cluster chain of the file. (appeared at R0.10c) + Fixed _FS_NORTC option does not work properly. (appeared at R0.10c) + + + +R0.11a (September 05, 2015) + + Fixed wrong media change can lead a deadlock at thread-safe configuration. + Added code page 771, 860, 861, 863, 864, 865 and 869. (_CODE_PAGE) + Removed some code pages actually not exist on the standard systems. (_CODE_PAGE) + Fixed errors in the case conversion teble of code page 437 and 850 (ff.c). + Fixed errors in the case conversion teble of Unicode (cc*.c). + + + +R0.12 (April 12, 2016) + + Added support of exFAT file system. (_FS_EXFAT) + Added f_expand(). (_USE_EXPAND) + Changed some members in FINFO structure and behavior of f_readdir(). + Added an option _USE_CHMOD and removed an option _WORD_ACCESS. + Fixed errors in the case conversion teble of Unicode (cc*.c). + diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/00readme.txt b/TSM_PicoW_Sensor/McuLib/FatFS/00readme.txt new file mode 100644 index 0000000..bd04d18 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/00readme.txt @@ -0,0 +1,21 @@ +FatFs Module Source Files R0.12 + + +FILES + + 00readme.txt This file. + history.txt Revision history. + ffconf.h Configuration file for FatFs module. + ff.h Common include file for FatFs and application module. + ff.c FatFs module. + diskio.h Common include file for FatFs and disk I/O module. + diskio.c An example of glue function to attach existing disk I/O module to FatFs. + integer.h Integer type definitions for FatFs. + option Optional external functions. + + + Low level disk I/O module is not included in this archive because the FatFs + module is only a generic file system layer and not depend on any specific + storage device. You have to provide a low level disk I/O module that written + to control the target storage device. + diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/License_FatFS.txt b/TSM_PicoW_Sensor/McuLib/FatFS/License_FatFS.txt new file mode 100644 index 0000000..42b7fd7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/License_FatFS.txt @@ -0,0 +1,123 @@ +FatFs Module Source Files R0.08a (C)ChaN, 2010 + + +FILES + + ffconf.h Configuration file for FatFs module. + ff.h Common include file for FatFs and application module. + ff.c FatFs module. + diskio.h Common include file for FatFs and disk I/O module. + integer.h Alternative type definitions for integer variables. + option Optional external functions. + + Low level disk I/O module is not included in this archive because the FatFs + module is only a generic file system layer and not depend on any specific + storage device. You have to provide a low level disk I/O module that written + to control your storage device. + + + +AGREEMENTS + + FatFs module is an open source software to implement FAT file system to + small embedded systems. This is a free software and is opened for education, + research and commercial developments under license policy of following trems. + + Copyright (C) 2010, ChaN, all right reserved. + + * The FatFs module is a free software and there is NO WARRANTY. + * No restriction on use. You can use, modify and redistribute it for + personal, non-profit or commercial product UNDER YOUR RESPONSIBILITY. + * Redistributions of source code must retain the above copyright notice. + + + +REVISION HISTORY + + Feb 26, 2006 R0.00 Prototype + + Apr 29, 2006 R0.01 First release. + + Jun 01, 2006 R0.02 Added FAT12. + Removed unbuffered mode. + Fixed a problem on small (<32M) patition. + + Jun 10, 2006 R0.02a Added a configuration option _FS_MINIMUM. + + Sep 22, 2006 R0.03 Added f_rename. + Changed option _FS_MINIMUM to _FS_MINIMIZE. + + Dec 11, 2006 R0.03a Improved cluster scan algolithm to write files fast. + Fixed f_mkdir creates incorrect directory on FAT32. + + Feb 04, 2007 R0.04 Supported multiple drive system. (FatFs) + Changed some APIs for multiple drive system. + Added f_mkfs. (FatFs) + Added _USE_FAT32 option. (Tiny-FatFs) + + Apr 01, 2007 R0.04a Supported multiple partitions on a plysical drive. (FatFs) + Fixed an endian sensitive code in f_mkfs. (FatFs) + Added a capability of extending the file size to f_lseek. + Added minimization level 3. + Fixed a problem that can collapse a sector when recreate an + existing file in any sub-directory at non FAT32 cfg. (Tiny-FatFs) + + May 05, 2007 R0.04b Added _USE_NTFLAG option. + Added FSInfo support. + Fixed some problems corresponds to FAT32. (Tiny-FatFs) + Fixed DBCS name can result FR_INVALID_NAME. + Fixed short seek (0 < ofs <= csize) collapses the file object. + + Aug 25, 2007 R0.05 Changed arguments of f_read, f_write. + Changed arguments of f_mkfs. (FatFs) + Fixed f_mkfs on FAT32 creates incorrect FSInfo. (FatFs) + Fixed f_mkdir on FAT32 creates incorrect directory. (FatFs) + + Feb 03, 2008 R0.05a Added f_truncate(). + Added f_utime(). + Fixed off by one error at FAT sub-type determination. + Fixed btr in f_read() can be mistruncated. + Fixed cached sector is not flushed when create and close without write. + + Apr 01, 2008 R0.06 Added f_forward(). (Tiny-FatFs) + Added string functions: fputc(), fputs(), fprintf() and fgets(). + Improved performance of f_lseek() on move to the same or following cluster. + + Apr 01, 2009, R0.07 Merged Tiny-FatFs as a buffer configuration option. + Added long file name support. + Added multiple code page support. + Added re-entrancy for multitask operation. + Added auto cluster size selection to f_mkfs(). + Added rewind option to f_readdir(). + Changed result code of critical errors. + Renamed string functions to avoid name collision. + + Apr 14, 2009, R0.07a Separated out OS dependent code on reentrant cfg. + Added multiple sector size support. + + Jun 21, 2009, R0.07c Fixed f_unlink() may return FR_OK on error. + Fixed wrong cache control in f_lseek(). + Added relative path feature. + Added f_chdir(). + Added f_chdrive(). + Added proper case conversion for extended characters. + + Nov 03, 2009 R0.07e Separated out configuration options from ff.h to ffconf.h. + Added a configuration option, _LFN_UNICODE. + Fixed f_unlink() fails to remove a sub-dir on _FS_RPATH. + Fixed name matching error on the 13 char boundary. + Changed f_readdir() to return the SFN with always upper case on non-LFN cfg. + + May 15, 2010, R0.08 Added a memory configuration option. (_USE_LFN) + Added file lock feature. (_FS_SHARE) + Added fast seek feature. (_USE_FASTSEEK) + Changed some types on the API, XCHAR->TCHAR. + Changed fname member in the FILINFO structure on Unicode cfg. + String functions support UTF-8 encoding files on Unicode cfg. + + Aug 16,'10 R0.08a Added f_getcwd(). (_FS_RPATH = 2) + Added sector erase feature. (_USE_ERASE) + Moved file lock semaphore table from fs object to the bss. + Fixed a wrong directory entry is created on non-LFN cfg when the given name contains ';'. + Fixed f_mkfs() creates wrong FAT32 volume. + diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/McuFatFS.c b/TSM_PicoW_Sensor/McuLib/FatFS/McuFatFS.c new file mode 100644 index 0000000..9e33e54 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/McuFatFS.c @@ -0,0 +1,3020 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFatFS.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : FAT_FileSystem +** Version : Component 01.214, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2021-05-13, 11:07, # CodeGen: 738 +** Abstract : +** +** Settings : +** Component name : McuFatFS +** FatFs Version : R0.12 (Patch 3, 29-April-2016) +** Tiny : no +** Volumes : 1 +** Drives : 1 +** Drive0 : SDCard +** FS_MINIMIZE : 0 +** Maximum Sector Size : 512 +** Relative Path : Enabled with f_getcwd() +** Code Page : U.S. (OEM) +** File Sharing : 0 +** Multipartion : no +** Fast Seek : yes +** Use Find : Disable (0) +** String Functions : enable +** LFN : Long File Name Support +** Use LFN : Disable +** exFAT : no +** Max LFN Length : 255 +** LFN Unicode : no +** Write enabled : Enabled +** Use TimeDate : Enabled +** Realtime clock : McuTimeDate +** Reentrant : Enabled +** Timeout ticks : 1000 +** Handle : HANDLE +** User Sync Functions : no +** RTOS : Enabled +** RTOS : McuRTOS +** Use dynamic heap : yes +** Utility : McuUtility +** Wait : McuWait +** SDK : McuLib +** Shell : Enabled +** Shell : McuShell +** Card Insert Delay (ms) : 100 +** File print buffer size : 32 +** File copy buffer size : 32 +** Contents : +** open - FRESULT McuFatFS_open(FIL *fp, const XCHAR *path, BYTE mode); +** close - FRESULT McuFatFS_close(FIL *fp); +** read - FRESULT McuFatFS_read(FIL *fp, void *buff, UINT btr, UINT *br); +** write - FRESULT McuFatFS_write(FIL *fp, const *void buff, UINT btw, UINT *bw); +** opendir - FRESULT McuFatFS_opendir(DIR *dj, const XCHAR *path); +** readdir - FRESULT McuFatFS_readdir(DIR *dj, FILINFO *fno); +** lseek - FRESULT McuFatFS_lseek(FIL *fp, DWORD ofs); +** unlink - FRESULT McuFatFS_unlink(const XCHAR *path); +** mount - FRESULT McuFatFS_mount(FATFS *fs, const TCHAR* path, byte opt); +** getfree - FRESULT McuFatFS_getfree(const XCHAR *path, dword *nclst, FATFS **fatfs); +** sync - FRESULT McuFatFS_sync(FIL *fp); +** rename - FRESULT McuFatFS_rename(const XCHAR *path_old, const XCHAR *path_new); +** isWriteProtected - bool McuFatFS_isWriteProtected(uint8_t *drvStr); +** isDiskPresent - bool McuFatFS_isDiskPresent(uint8_t *drvStr); +** mkdir - FRESULT McuFatFS_mkdir(const XCHAR *path); +** chmod - FRESULT McuFatFS_chmod(const TCHAR* FileName, uint8_t Attribute, uint8_t... +** truncate - FRESULT McuFatFS_truncate(FIL *FileObject); +** stat - FRESULT McuFatFS_stat(const TCHAR* FileName, FILINFO* FileInfo); +** utime - FRESULT McuFatFS_utime(const TCHAR* FileName, const FILINFO* TimeDate); +** mkfs - FRESULT McuFatFS_mkfs(byte drive, uint8_t PartitioningRule, UINT AllocSize); +** chdir - FRESULT McuFatFS_chdir(const TCHAR* Path); +** chdrive - FRESULT McuFatFS_chdrive(uint8_t Drive); +** getcwd - FRESULT McuFatFS_getcwd(TCHAR* Buffer, UINT BufferLen); +** errFResultMsg - char* McuFatFS_errFResultMsg(int errNo); +** errDResultMsg - char* McuFatFS_errDResultMsg(int errNo); +** f_gets - McuFatFS_CHARP McuFatFS_f_gets(TCHAR* buff, int len, FIL *fil); +** f_puts - McuFatFS_INT McuFatFS_f_puts(const TCHAR* str, FIL *fil); +** f_putc - McuFatFS_INT McuFatFS_f_putc(TCHAR c, FIL *fil); +** f_printf - McuFatFS_INT McuFatFS_f_printf(FIL* fil, const TCHAR* str, ...); +** f_eof - byte McuFatFS_f_eof(FIL *fil); +** f_error - uint8_t McuFatFS_f_error(FIL *fil); +** f_tell - dword McuFatFS_f_tell(FIL *fil); +** f_size - dword McuFatFS_f_size(FIL *fil); +** f_getlabel - FRESULT McuFatFS_f_getlabel(const TCHAR* path, TCHAR* label, DWORD* vsn); +** f_setlabel - FRESULT McuFatFS_f_setlabel(const TCHAR* label); +** f_expand - FRESULT McuFatFS_f_expand(FIL* fp, FSIZE_t fsz, BYTE opt); +** f_findfirst - FRESULT McuFatFS_f_findfirst(DIR* dp, FILINFO* fno, const TCHAR* path, const... +** f_findnext - FRESULT McuFatFS_f_findnext(DIR* dp, FILINFO* fno); +** f_opendir - FRESULT McuFatFS_f_opendir(DIR* dp, const TCHAR* path); +** f_readdir - FRESULT McuFatFS_f_readdir(DIR *dj, FILINFO *fno); +** f_closedir - FRESULT McuFatFS_f_closedir(DIR* dp); +** get_fattime - uint32_t McuFatFS_get_fattime(void); +** ParseCommand - uint8_t McuFatFS_ParseCommand(const unsigned char *cmd, bool *handled, const... +** StrToDriveNumber - uint8_t McuFatFS_StrToDriveNumber(uint8_t *drvStr); +** CheckCardPresence - uint8_t McuFatFS_CheckCardPresence(bool *cardMounted, uint8_t *drive, FATFS... +** MountFileSystem - uint8_t McuFatFS_MountFileSystem(FATFS *fileSystemObject, uint8_t... +** UnMountFileSystem - uint8_t McuFatFS_UnMountFileSystem(uint8_t *logicalDrive, const... +** PrintDirectory - uint8_t McuFatFS_PrintDirectory(const uint8_t *dirName, const... +** CopyFile - uint8_t McuFatFS_CopyFile(const uint8_t*srcFileName, const uint8_t... +** DeleteFile - uint8_t McuFatFS_DeleteFile(const uint8_t *fileName, const... +** CreateFile - uint8_t McuFatFS_CreateFile(const uint8_t *fileName, const... +** PrintFile - uint8_t McuFatFS_PrintFile(const uint8_t *fileName, const... +** PrintHexFile - uint8_t McuFatFS_PrintHexFile(const uint8_t *fileName, const... +** MakeDirectory - uint8_t McuFatFS_MakeDirectory(const uint8_t *dirName, const... +** ChangeDirectory - uint8_t McuFatFS_ChangeDirectory(const uint8_t *dirName, const... +** RenameFile - uint8_t McuFatFS_RenameFile(const uint8_t *srcFileName, const uint8_t... +** PrintSector - uint8_t McuFatFS_PrintSector(uint8_t drive, uint32_t sectorNo, const... +** PrintDiskInfo - uint8_t McuFatFS_PrintDiskInfo(uint8_t *drive, const... +** Benchmark - uint8_t McuFatFS_Benchmark(const %@Shell@'ModuleName'%.StdIOType *io); +** Deinit - uint8_t McuFatFS_Deinit(void); +** Init - uint8_t McuFatFS_Init(void); +** +** Copyright (c) 2014-2021, Erich Styger +** Web: http://mcuoneclipse.com/ +** SourceForge: https://sourceforge.net/projects/mcuoneclipse +** Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** - Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** - Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFatFS.h +** @version 01.00 +** @brief +** +*/ +/*! +** @addtogroup McuFatFS_module McuFatFS module documentation +** @{ +*/ + +/* MODULE McuFatFS. */ + +#include "ff.h" +#include "McuFatFS.h" + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT +#include "SDCard.h" +#endif + + +/*-----------------------------------------------------------------------*/ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT +/* Initialize a Drive */ +DSTATUS disk_initialize ( + uint8_t drv /* Physical drive number (0..) */ +) +{ + switch(drv) { + case 0: + return SDCard_disk_initialize(drv); + default: + break; + } /* switch */ + return (DSTATUS)RES_PARERR; +} +#endif +/*-----------------------------------------------------------------------*/ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT +/* Return Disk Status */ +DSTATUS disk_status ( + uint8_t drv /* Physical drive number (0..) */ +) +{ + switch(drv) { + case 0: + return SDCard_disk_status(drv); + default: + break; + } /* switch */ + return (DSTATUS)RES_PARERR; +} +#endif +/*-----------------------------------------------------------------------*/ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT +/* Read Sector(s) */ +DRESULT disk_read ( + uint8_t drv, /* Physical drive number (0..) */ + uint8_t *buff, /* Data buffer to store read data */ + uint32_t sector, /* Sector address (LBA) */ + unsigned int count /* Number of sectors to read */ +) +{ + switch(drv) { + case 0: + return SDCard_disk_read(drv, buff, sector, count); + default: + break; + } /* switch */ + return RES_PARERR; +} +#endif +/*-----------------------------------------------------------------------*/ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT +/* Write Sector(s) */ +#if _READONLY == 0 +DRESULT disk_write ( + uint8_t drv, /* Physical drive number (0..) */ + const uint8_t *buff, /* Data to be written */ + uint32_t sector, /* Sector address (LBA) */ + unsigned int count /* Number of sectors to write */ +) +{ + switch(drv) { + case 0: + return SDCard_disk_write(drv, buff, sector, count); + default: + break; + } /* switch */ + return RES_PARERR; +} +#endif /* _READONLY == 0 */ +#endif +/*-----------------------------------------------------------------------*/ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT +DRESULT disk_ioctl ( + uint8_t drv, /* Physical drive number (0..) */ + uint8_t ctrl, /* Control code */ + void *buff /* Buffer to send/receive control data */ +) +{ + switch(drv) { + case 0: + return SDCard_disk_ioctl(drv, ctrl, buff); + default: + break; + } /* switch */ + return RES_PARERR; +} +#endif +/*-----------------------------------------------------------------------*/ +#define McuFatFS_8_3_SIZE sizeof("0:/12345678.txt") /* length of a 8.3 file name (13 including the zero byte) including the optional drive letter */ + +#if McuFatFS_USE_LFN == 0 /* No LFN */ +#define McuFatFS_DEF_NAMEBUF(name) uint8_t name[McuFatFS_8_3_SIZE] +#define McuFatFS_PTR_NAMEBUF(name) &name[0] +#define McuFatFS_SIZE_NAMEBUF(name) sizeof(name) +#define McuFatFS_INIT_NAMEBUF(name) +#define McuFatFS_FREE_NAMEBUF(name) + +#elif McuFatFS_USE_LFN == 1 /* LFN with static LFN working buffer */ +static TCHAR McuFatFS_FileName[McuFatFS_MAX_LFN+1]; +#define McuFatFS_DEF_NAMEBUF(name) +#define McuFatFS_PTR_NAMEBUF(name) &McuFatFS_FileName[0] +#define McuFatFS_SIZE_NAMEBUF(name) sizeof(McuFatFS_FileName) +#define McuFatFS_INIT_NAMEBUF(name) +#define McuFatFS_FREE_NAMEBUF(name) + +#elif McuFatFS_USE_LFN == 2 /* LFN with dynamic LFN working buffer on the stack */ +#define McuFatFS_DEF_NAMEBUF(name) uint8_t name[McuFatFS_MAX_LFN+1] +#define McuFatFS_PTR_NAMEBUF(name) &name[0] +#define McuFatFS_SIZE_NAMEBUF(name) sizeof(name) +#define McuFatFS_INIT_NAMEBUF(name) +#define McuFatFS_FREE_NAMEBUF(name) + +#elif McuFatFS_USE_LFN == 3 /* LFN with dynamic LFN working buffer on the heap */ +#define McuFatFS_DEF_NAMEBUF(name) uint8_t *name +#define McuFatFS_PTR_NAMEBUF(name) name +#define McuFatFS_SIZE_NAMEBUF(name) (McuFatFS_MAX_LFN+1) +#define McuFatFS_INIT_NAMEBUF(name) { name = ff_memalloc(McuFatFS_MAX_LFN+1); \ + if (!name) { \ + McuShell_SendStr((unsigned char*)"ff_memalloc failed!", io->stdErr); \ + return ERR_FAILED; \ + } \ + } +#define McuFatFS_FREE_NAMEBUF(name) ff_memfree(name) + +#else + #error Wrong LFN configuration. +#endif + +static void FatFsFResultMsg(uint8_t *msg, McuFatFS_FRESULT errNo, const McuShell_StdIOType *io) { + unsigned char buf[sizeof("1234")]; + + McuShell_SendStr((unsigned char*)"ERROR: ", io->stdErr); + McuShell_SendStr(msg, io->stdErr); + McuShell_SendStr((unsigned char*)": (", io->stdErr); + McuUtility_Num16sToStr(buf, sizeof(buf), (int16_t)errNo); + McuShell_SendStr(buf, io->stdErr); + McuShell_SendStr((unsigned char*)") ", io->stdErr); + McuShell_SendStr((unsigned char*)McuFatFS_errFResultMsg((int)errNo), io->stdErr); + McuShell_SendStr((unsigned char*)"\r\n", io->stdErr); +} + +static void FatFsDResultMsg(uint8_t *msg, McuFatFS_DRESULT errNo, const McuShell_StdIOType *io) { + unsigned char buf[sizeof("1234")]; + + McuShell_SendStr((unsigned char*)"ERROR: ", io->stdErr); + McuShell_SendStr(msg, io->stdErr); + McuShell_SendStr((unsigned char*)": (", io->stdErr); + McuUtility_Num16sToStr(buf, sizeof(buf), (int16_t)errNo); + McuShell_SendStr(buf, io->stdErr); + McuShell_SendStr((unsigned char*)") ", io->stdErr); + McuShell_SendStr((unsigned char*)McuFatFS_errDResultMsg((int)errNo), io->stdErr); + McuShell_SendStr((unsigned char*)"\r\n", io->stdErr); +} + +static void CmdUsageError(const unsigned char *cmd, uint8_t *usage, const McuShell_StdIOType *io) { + McuShell_SendStr((unsigned char*)"*** error while reading command: ", io->stdErr); + McuShell_SendStr(cmd, io->stdErr); + McuShell_SendStr((unsigned char*)"\r\n*** Usage: ", io->stdErr); + McuShell_SendStr((unsigned char*)usage, io->stdErr); + McuShell_SendStr((unsigned char*)"\r\n", io->stdErr); +} + +static void PrintInASCII(uint8_t *buf, size_t bufSize, size_t LineLen, uint8_t nonASCIIchar, uint8_t fillChar, const McuShell_StdIOType *io) { + unsigned int i; + uint8_t ch; + + /* print in ASCII */ + McuShell_SendCh(' ', io->stdOut); + for (i=0; i= ' ' && ch <= 0x7f) { + McuShell_SendCh(ch, io->stdOut); + } else { + McuShell_SendCh(nonASCIIchar, io->stdOut); /* place holder */ + } + } + for (/*empty*/; istdOut); + } +} + +/*! + * \brief Writes a directory listing of the given path + * \param[in] dirPathPtr Pointer to a directory path string. Pass e.g. "0:/" for the root directory + * \param[in] io Callback to write directory output + * \return Error code, otherwise ERR_OK + */ +static uint8_t PrintDir(const uint8_t *dirPathPtr, const McuShell_StdIOType *io) { + McuFatFS_FILINFO fInfo; + McuFatFS_FRESULT fres; + uint32_t p1; + UINT s1, s2; + McuFatFS_DIR dir; /* Directory object */ + uint8_t buf[sizeof("yyyy-mm-dd hh:ss")+1]; +#if !McuFatFS_FS_READONLY + McuFatFS_FATFS *fs; +#endif + + McuShell_SendStr((unsigned char*)"Directory of ", io->stdOut); + McuShell_SendStr(dirPathPtr, io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + fres = McuFatFS_f_opendir(&dir, (const TCHAR*)dirPathPtr); + if (fres != FR_OK) { + FatFsFResultMsg((unsigned char*)"opendir failed", fres, io); + return ERR_FAULT; + } + p1 = s1 = s2 = 0; + for(;;) { + fres = McuFatFS_readdir(&dir, &fInfo); + if (fres != FR_OK) { + FatFsFResultMsg((unsigned char*)"readdir failed", fres, io); + break; + } + if (!fInfo.fname[0]) { /* end of directory list */ + break; + } + /* file attributes */ + if (fInfo.fattrib & AM_DIR) { /* directory */ + s2++; + io->stdOut('D'); + } else { + s1++; + p1 += fInfo.fsize; + io->stdOut('-'); + } + if (fInfo.fattrib & AM_RDO) { /* read only */ + io->stdOut('R'); + } else { + io->stdOut('-'); + } + if (fInfo.fattrib & AM_HID) { /* hidden */ + io->stdOut('H'); + } else { + io->stdOut('-'); + } + if (fInfo.fattrib & AM_SYS) { /* system */ + io->stdOut('S'); + } else { + io->stdOut('-'); + } + if (fInfo.fattrib & AM_ARC) { /* archive */ + io->stdOut('A'); + } else { + io->stdOut('-'); + } + io->stdOut(' '); + /* file date & time */ + buf[0] = '\0'; + McuUtility_strcatNum16sFormatted(buf, sizeof(buf), (int16_t)((fInfo.fdate >> 9) + 1980), ' ', 4); /* year */ + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"-"); + McuUtility_strcatNum16sFormatted(buf, sizeof(buf), (int16_t)((fInfo.fdate >> 5) & 15), '0', 2); /* month */ + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"-"); + McuUtility_strcatNum16sFormatted(buf, sizeof(buf), (int16_t)(fInfo.fdate & 31), '0', 2); /* day */ + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" "); + McuUtility_strcatNum16sFormatted(buf, sizeof(buf), (int16_t)((fInfo.ftime >> 11)), '0', 2); /* hour */ + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)":"); + McuUtility_strcatNum16sFormatted(buf, sizeof(buf), (int16_t)((fInfo.ftime >> 5) & 63), '0', 2); /* minute */ + McuShell_SendStr(buf, io->stdOut); + io->stdOut(' '); + buf[0] = '\0'; + /* file size */ + McuUtility_strcatNum32uFormatted(buf, sizeof(buf), fInfo.fsize, ' ', 10); /* size */ + McuShell_SendStr(buf, io->stdOut); + /* file name */ + io->stdOut(' '); + McuShell_SendStr((unsigned char*)fInfo.fname, io->stdOut); +#if McuFatFS_USE_LFN + io->stdOut(' '); + McuShell_SendStr((unsigned char*)fInfo.altname, io->stdOut); +#endif + io->stdOut('\r'); + io->stdOut('\n'); + } + /* number of files and bytes used */ + buf[0] = '\0'; + McuUtility_strcatNum16u(buf, sizeof(buf), (uint16_t)s1); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)" File(s), ", io->stdOut); + buf[0] = '\0'; + McuUtility_strcatNum32u(buf, sizeof(buf), p1); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)" bytes total\r\n", io->stdOut); + /* number of directories and number of free bytes */ + buf[0] = '\0'; + McuUtility_strcatNum16u(buf, sizeof(buf), (uint16_t)s2); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)" Dir(s)", io->stdOut); +#if !McuFatFS_FS_READONLY + /* number of free bytes */ + fres = McuFatFS_getfree((const TCHAR*)dirPathPtr, &p1, &fs); + if (fres != FR_OK) { + FatFsFResultMsg((unsigned char*)"getfree failed", fres, io); + } else { + io->stdOut(','); + io->stdOut(' '); + buf[0] = '\0'; + McuUtility_strcatNum32s(buf, sizeof(buf), (long)(p1*fs->csize/2)); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)" KBytes free", io->stdOut); + } +#endif + (void)McuFatFS_f_closedir(&dir); /* close directory */ + io->stdOut('\r'); + io->stdOut('\n'); + return ERR_OK; +} + +static uint8_t DirCmd(const unsigned char *cmd, const McuShell_ConstStdIOType *io) { + /* precondition: cmd starts with "dir" */ + uint8_t res = ERR_OK; + McuFatFS_DEF_NAMEBUF(fileName); + + McuFatFS_INIT_NAMEBUF(fileName); + if (*(cmd+sizeof("dir")-1)== ' ') { /* space after "dir": read name */ + if (McuUtility_ReadEscapedName(cmd+sizeof("dir"), (uint8_t*)McuFatFS_PTR_NAMEBUF(fileName), + McuFatFS_SIZE_NAMEBUF(fileName), NULL, NULL, NULL)==ERR_OK + ) + { + /* ok, have now directory name */ + } else { + McuShell_SendStr((unsigned char*)"reading directory name failed!\r\n", io->stdErr); + res = ERR_FAILED; + } + } else { /* use current directory */ +#if McuFatFS_FS_RPATH >= 2 + McuFatFS_FRESULT fres; + fres = McuFatFS_getcwd((TCHAR*)McuFatFS_PTR_NAMEBUF(fileName), McuFatFS_SIZE_NAMEBUF(fileName)); + if(fres!=FR_OK) { + FatFsFResultMsg((unsigned char*)"getcwd failed", fres, io); + res = ERR_FAILED; + } else { + /* ok, have now directory name */ + } +#else + McuUtility_strcpy(McuFatFS_PTR_NAMEBUF(fileName), McuFatFS_SIZE_NAMEBUF(fileName), (unsigned char*)McuFatFS_CONFIG_DEFAULT_DRIVE_STRING); /* use root */ +#endif + } + if (res == ERR_OK) { + res = McuFatFS_PrintDirectory((const uint8_t*)McuFatFS_PTR_NAMEBUF(fileName), io); + } + McuFatFS_FREE_NAMEBUF(fileName); + return res; +} + +static uint8_t CopyCmd(const unsigned char *cmd, const McuShell_ConstStdIOType *io) { + /* precondition: cmd starts with "copy" */ + uint8_t res = ERR_OK; + size_t lenRead; + McuFatFS_DEF_NAMEBUF(fileName); + McuFatFS_DEF_NAMEBUF(fileName2); + + McuFatFS_INIT_NAMEBUF(fileName); + McuFatFS_INIT_NAMEBUF(fileName2); + if ( (McuUtility_ReadEscapedName(cmd+sizeof("copy"), (uint8_t*)McuFatFS_PTR_NAMEBUF(fileName), + McuFatFS_SIZE_NAMEBUF(fileName), &lenRead, NULL, NULL)==ERR_OK) + && *(cmd+sizeof("copy")+lenRead)==' ' + && (McuUtility_ReadEscapedName(cmd+sizeof("copy")+lenRead+1, (uint8_t*)McuFatFS_PTR_NAMEBUF(fileName2), + McuFatFS_SIZE_NAMEBUF(fileName2), NULL, NULL, NULL)==ERR_OK) + ) + { + res = McuFatFS_CopyFile((uint8_t*)McuFatFS_PTR_NAMEBUF(fileName), McuFatFS_PTR_NAMEBUF(fileName2), io); + } else { + CmdUsageError(cmd, (unsigned char*)"copy srcFileName dstFileName", io); + res = ERR_FAILED; + } + McuFatFS_FREE_NAMEBUF(fileName); + McuFatFS_FREE_NAMEBUF(fileName2); + return res; +} + +static uint8_t DeleteCmd(const unsigned char *cmd, const McuShell_ConstStdIOType *io) { + /* precondition: cmd starts with "delete" */ + uint8_t res = ERR_OK; + McuFatFS_DEF_NAMEBUF(fileName); + + McuFatFS_INIT_NAMEBUF(fileName); + if (McuUtility_ReadEscapedName(cmd+sizeof("delete"), (uint8_t*)McuFatFS_PTR_NAMEBUF(fileName), + McuFatFS_SIZE_NAMEBUF(fileName), NULL, NULL, NULL)==ERR_OK + ) + { + res = McuFatFS_DeleteFile((uint8_t*)McuFatFS_PTR_NAMEBUF(fileName), io); + } else { + CmdUsageError(cmd, (unsigned char*)"delete fileName", io); + res = ERR_FAILED; + } + McuFatFS_FREE_NAMEBUF(fileName); + return res; +} + +static uint8_t MkdirCmd(const unsigned char *cmd, const McuShell_ConstStdIOType *io) { + /* precondition: cmd starts with "mkdir" */ + uint8_t res = ERR_OK; + McuFatFS_DEF_NAMEBUF(fileName); + + McuFatFS_INIT_NAMEBUF(fileName); + if (McuUtility_ReadEscapedName(cmd+sizeof("mkdir"), (uint8_t*)McuFatFS_PTR_NAMEBUF(fileName), + McuFatFS_SIZE_NAMEBUF(fileName), NULL, NULL, NULL)==ERR_OK + ) + { + res = McuFatFS_MakeDirectory((uint8_t*)McuFatFS_PTR_NAMEBUF(fileName), io); + } else { + CmdUsageError(cmd, (unsigned char*)"mkdir directoryName", io); + res = ERR_FAILED; + } + McuFatFS_FREE_NAMEBUF(fileName); + return res; +} + +static uint8_t RenameCmd(const unsigned char *cmd, const McuShell_ConstStdIOType *io) { + /* precondition: cmd starts with "rename" */ + uint8_t res = ERR_OK; + size_t lenRead; + McuFatFS_DEF_NAMEBUF(fileName); + McuFatFS_DEF_NAMEBUF(fileName2); + + McuFatFS_INIT_NAMEBUF(fileName); + McuFatFS_INIT_NAMEBUF(fileName2); + if ( (McuUtility_ReadEscapedName(cmd+sizeof("rename"), (uint8_t*)McuFatFS_PTR_NAMEBUF(fileName), + McuFatFS_SIZE_NAMEBUF(fileName), &lenRead, NULL, NULL)==ERR_OK) + && *(cmd+sizeof("rename")+lenRead)==' ' + && (McuUtility_ReadEscapedName(cmd+sizeof("rename")+lenRead+1, + (uint8_t*)McuFatFS_PTR_NAMEBUF(fileName2), + McuFatFS_SIZE_NAMEBUF(fileName2), NULL, NULL, NULL)==ERR_OK) + ) + { + res = McuFatFS_RenameFile((unsigned char*)McuFatFS_PTR_NAMEBUF(fileName), (unsigned char*)McuFatFS_PTR_NAMEBUF(fileName2), io); + } else { + CmdUsageError(cmd, (unsigned char*)"rename srcFileName dstFileName", io); + res = ERR_FAILED; + } + McuFatFS_FREE_NAMEBUF(fileName); + McuFatFS_FREE_NAMEBUF(fileName2); + return res; +} + +static uint8_t SectorCmd(const unsigned char *cmd, const McuShell_ConstStdIOType *io) { + /* precondition: cmd starts with "sector" */ + uint8_t res; + uint32_t sectorNo; + const unsigned char *p = cmd+sizeof("printsector"); + + res = McuUtility_ScanDecimal32uNumber(&p, §orNo); + if (res == ERR_OK) { /* format fine */ + res = McuFatFS_PrintSector(0, sectorNo, io); + if (res!=ERR_OK) { + return res; + } + } else { + CmdUsageError(cmd, (unsigned char*)"printsector ", io); + return ERR_FAILED; + } + return ERR_OK; +} + +static uint8_t PrintCmd(const unsigned char *cmd, const McuShell_ConstStdIOType *io) { + /* precondition: cmd starts with "print" */ + uint8_t res = ERR_OK; + McuFatFS_DEF_NAMEBUF(fileName); + + McuFatFS_INIT_NAMEBUF(fileName); + if (McuUtility_ReadEscapedName(cmd+sizeof("print"), (uint8_t*)McuFatFS_PTR_NAMEBUF(fileName), + McuFatFS_SIZE_NAMEBUF(fileName), NULL, NULL, NULL)==ERR_OK + ) + { + res = McuFatFS_PrintFile((uint8_t*)McuFatFS_PTR_NAMEBUF(fileName), io); + } else { + CmdUsageError(cmd, (unsigned char*)"print fileName", io); + res = ERR_FAILED; + } + McuFatFS_FREE_NAMEBUF(fileName); + return res; +} + +static uint8_t PrintHexCmd(const unsigned char *cmd, const McuShell_ConstStdIOType *io) { + /* precondition: cmd starts with "printhex" */ + uint8_t res = ERR_OK; + McuFatFS_DEF_NAMEBUF(fileName); + + McuFatFS_INIT_NAMEBUF(fileName); + if (McuUtility_ReadEscapedName(cmd+sizeof("printhex"), (uint8_t*)McuFatFS_PTR_NAMEBUF(fileName), + McuFatFS_SIZE_NAMEBUF(fileName), NULL, NULL, NULL)==ERR_OK + ) + { + res = McuFatFS_PrintHexFile((uint8_t*)McuFatFS_PTR_NAMEBUF(fileName), io); + } else { + CmdUsageError(cmd, (unsigned char*)"printhex fileName", io); + res = ERR_FAILED; + } + McuFatFS_FREE_NAMEBUF(fileName); + return res; +} + +static uint8_t CdCmd(const unsigned char *cmd, const McuShell_ConstStdIOType *io) { + /* precondition: cmd starts with "cd" */ +#if McuFatFS_FS_RPATH > 0 + uint8_t res = ERR_OK; + McuFatFS_DEF_NAMEBUF(fileName); + + McuFatFS_INIT_NAMEBUF(fileName); + if (*(cmd+sizeof("cd")-1)== ' ') { /* space after "cd": read name */ + if (McuUtility_ReadEscapedName(cmd+sizeof("cd"), (uint8_t*)McuFatFS_PTR_NAMEBUF(fileName), + McuFatFS_SIZE_NAMEBUF(fileName), NULL, NULL, NULL)==ERR_OK + ) + { + res = McuFatFS_ChangeDirectory((uint8_t*)McuFatFS_PTR_NAMEBUF(fileName), io); + } else { + McuShell_SendStr((unsigned char*)"reading directory name failed!\r\n", io->stdErr); + res = ERR_FAILED; + } + } else { /* print current directory */ +#if McuFatFS_FS_RPATH >= 2 + McuFatFS_FRESULT fres; + + fres = McuFatFS_getcwd((TCHAR*)McuFatFS_PTR_NAMEBUF(fileName), McuFatFS_SIZE_NAMEBUF(fileName)); + if(fres!=FR_OK) { + FatFsFResultMsg((unsigned char*)"getcwd failed", fres, io); + res = ERR_FAILED; + } else { + McuShell_SendStr((uint8_t*)McuFatFS_PTR_NAMEBUF(fileName), io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + } +#else + McuUtility_strcpy(McuFatFS_PTR_NAMEBUF(fileName), McuFatFS_SIZE_NAMEBUF(fileName), (unsigned char*)McuFatFS_CONFIG_DEFAULT_DRIVE_STRING); /* use root */ +#endif + } + McuFatFS_FREE_NAMEBUF(fileName); + return res; +#else + (void)cmd; + #warning "relative directories not enabled in FatFS!" + McuShell_SendStr((unsigned char*)"relative directories not available in file system\r\n", io->stdErr); + return ERR_FAILED; +#endif +} + + +static uint8_t CreateCmd(const unsigned char *cmd, const McuShell_ConstStdIOType *io) { + /* precondition: cmd starts with "create" */ + uint8_t res = ERR_OK; + McuFatFS_DEF_NAMEBUF(fileName); + + McuFatFS_INIT_NAMEBUF(fileName); + if (McuUtility_ReadEscapedName(cmd+sizeof("create"), (uint8_t*)McuFatFS_PTR_NAMEBUF(fileName), + McuFatFS_SIZE_NAMEBUF(fileName), NULL, NULL, NULL)==ERR_OK + ) + { + res = McuFatFS_CreateFile((uint8_t*)McuFatFS_PTR_NAMEBUF(fileName), io); + } else { + CmdUsageError(cmd, (unsigned char*)"create fileName", io); + res = ERR_FAILED; + } + McuFatFS_FREE_NAMEBUF(fileName); + return res; +} + +static uint8_t PrintStatus(const McuShell_StdIOType *io) { + McuShell_SendStatusStr((unsigned char*)"McuFatFS", (unsigned char*)"FatFs status\r\n", io->stdOut); + McuShell_SendStatusStr((unsigned char*)" present", McuFatFS_isDiskPresent((uint8_t*)"0")?(unsigned char*)"drive0: yes\r\n":(unsigned char*)"drive0: no\r\n", io->stdOut); + McuShell_SendStatusStr((unsigned char*)" protected", McuFatFS_isWriteProtected((uint8_t*)"0")?(unsigned char*)"drive0: yes\r\n":(unsigned char*)"drive0: no\r\n", io->stdOut); + McuShell_SendStatusStr((unsigned char*)" default drv", (unsigned char*)McuFatFS_CONFIG_DEFAULT_DRIVE_STRING "\r\n", io->stdOut); + return ERR_OK; +} + +static uint8_t PrintHelp(const McuShell_StdIOType *io) { + McuShell_SendHelpStr((unsigned char*)"McuFatFS", (unsigned char*)"Group of McuFatFS commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" cd []", (const unsigned char*)"Change the current directory or display the name of the current directory\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" dir []", (const unsigned char*)"Prints a directory\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" copy ", (const unsigned char*)"Copy a file\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" delete ", (const unsigned char*)"Delete a file\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" create ", (const unsigned char*)"Create a file\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" mkdir ", (const unsigned char*)"Create a directory\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" rename ", (const unsigned char*)"Rename a file\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" print ", (const unsigned char*)"Print a file\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" printhex ", (const unsigned char*)"Print a file as hexdump\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" printsector ", (const unsigned char*)"Print disk sector\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" diskinfo", (const unsigned char*)"Print disk information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" benchmark", (const unsigned char*)"Run disk benchmark\r\n", io->stdOut); + return ERR_OK; +} + + +/* Unicode support functions */ +#if McuFatFS_USE_LFN /* Unicode - OEM code conversion */ +#if McuFatFS_USE_LFN == 3 /* Memory functions */ +void *ff_memalloc(UINT size) { /* Allocate memory block */ + /* FreeRTOS */ + return McuRTOS_pvPortMalloc(size); +} + +void ff_memfree (void* ptr) { /* Free memory block */ + /* FreeRTOS */ + McuRTOS_vPortFree(ptr); +} +#endif +#endif + +#if McuFatFS_FS_REENTRANT +/*! +* \brief Create a Synchronization Object +* This function is called in f_mount function to create a new +* synchronization object, such as semaphore and mutex. When a FALSE is +* returned, the f_mount function fails with FR_INT_ERR. +* \param[in] vol Corresponding logical drive being processed +* \param[out] sobj Pointer to return the created sync object +* \return TRUE: Function succeeded, FALSE: Could not create due to any error +*/ +#if configSUPPORT_STATIC_ALLOCATION + static StaticSemaphore_t xMutexBuffer[FF_VOLUMES]; +#endif + +int ff_cre_syncobj(uint8_t vol, McuFatFS_SYNC_t *sobj) { + (void)vol; /* argument not used */ +#if configSUPPORT_STATIC_ALLOCATION + *sobj = xSemaphoreCreateMutexStatic(&xMutexBuffer[vol]); +#else + *sobj = xSemaphoreCreateMutex(); /* create semaphore */ +#endif + if (*sobj!=NULL) { + vQueueAddToRegistry(*sobj, "McuFatFS_Mutex"); + } + return (*sobj != NULL) ? TRUE : FALSE; +} + +/*! +* \brief Delete a Synchronization Object +* This function is called in f_mount function to delete a synchronization +* object that created with ff_cre_syncobj function. When a FALSE is +* returned, the f_mount function fails with FR_INT_ERR. +* \param[out] sobj Sync object tied to the logical drive to be deleted +* \return TRUE: Function succeeded, FALSE: Could not create due to any error +*/ +int ff_del_syncobj(McuFatFS_SYNC_t sobj) { + vQueueUnregisterQueue(sobj); + McuRTOS_vSemaphoreDelete(sobj); /* FreeRTOS: free up memory for semaphore */ + return TRUE; /* everything ok */ +} + +/*! +* \brief Request Grant to Access the Volume +* This function is called on entering file functions to lock the volume. +* When a FALSE is returned, the file function fails with FR_TIMEOUT. +* \param[in] sobj Sync object to wait +* \return TRUE: Function succeeded, FALSE: Could not create due to any error +*/ +int ff_req_grant (McuFatFS_SYNC_t sobj) { + if (McuRTOS_xSemaphoreTake(sobj, McuFatFS_FS_TIMEOUT) == pdTRUE) { + return TRUE; /* success */ + } else { /* failed to get the sync object? */ + return FALSE; /* failure */ + } +} + +/*! +* \brief Release Grant to Access the Volume +* This function is called on leaving file functions to unlock the volume. +* \param[in] sobj Sync object to be signaled +*/ +void ff_rel_grant (McuFatFS_SYNC_t sobj) { + (void)McuRTOS_xSemaphoreGive(sobj); /* FreeRTOS */ +} +#endif /* McuFatFS_FS_REENTRANT */ + +/* +** =================================================================== +** Method : open (component FAT_FileSystem) +** +** Description : +** Open/Create a file +** Parameters : +** NAME - DESCRIPTION +** fp - Pointer to the blank file object structure +** path - Pointer to a null-terminated string that +** specifies the file name to create or open. +** mode - Specifies the type of access and open +** method for the file. It is specified by a +** combination of following flags. +** FA_READ: Specifies read access to the +** object. Data can be read from the file. +** Combine with FA_WRITE for read-write access. +** FA_WRITE: Specifies write access to the +** object. Data can be written to the file. +** Combine with FA_READ for read-write access. +** FA_OPEN_EXISTING: Opens the file. The +** function fails if the file is not existing. +** (Default) +** FA_OPEN_ALWAYS: Opens the file if it is +** existing. If not, a new file is created. To +** append data to the file, use f_lseek +** function after file open in this method. +** FA_CREATE_NEW: Creates a new file. The +** function fails if the file is already +** existing. +** FA_CREATE_ALWAYS: Creates a new file. If +** the file is existing, it is truncated and +** overwritten. +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_open(FIL *fp, const XCHAR *path, BYTE mode) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : close (component FAT_FileSystem) +** +** Description : +** Close a file +** Parameters : +** NAME - DESCRIPTION +** fp - Pointer to the open file object structure to +** be closed. +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_close(FIL *fp) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : read (component FAT_FileSystem) +** +** Description : +** Read file +** Parameters : +** NAME - DESCRIPTION +** fp - Pointer to the file object +** buff - Pointer to the data buffer +** btr - Number of bytes to read +** br - Pointer to the number of bytes read +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_read(FIL *fp, void *buff, UINT btr, UINT *br) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : write (component FAT_FileSystem) +** +** Description : +** Write to a file +** Parameters : +** NAME - DESCRIPTION +** fp - Pointer to the file object structure +** buff - Pointer to the data to be written +** btw - Number of bytes to write +** bw - Pointer to the variable to return number of +** bytes written +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_write(FIL *fp, const *void buff, UINT btw, UINT *bw) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : opendir (component FAT_FileSystem) +** +** Description : +** Open a directory +** Parameters : +** NAME - DESCRIPTION +** dj - Pointer to the blank directory object to be +** created. +** path - Pointer to the null-terminated string +** that specifies the directory name to be +** opened. +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_opendir(DIR *dj, const XCHAR *path) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : readdir (component FAT_FileSystem) +** +** Description : +** Read a directory item +** Parameters : +** NAME - DESCRIPTION +** dir - Pointer to the open directory object +** fno - Pointer to the file information structure +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_readdir(DIR *dj, FILINFO *fno) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : lseek (component FAT_FileSystem) +** +** Description : +** The f_lseek function moves the file read/write pointer of an +** open file object. It can also be used to increase the file +** size (cluster pre-allocation). +** Parameters : +** NAME - DESCRIPTION +** fp - Pointer to the file object +** ofs - File pointer from top of file +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_lseek(FIL *fp, DWORD ofs) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : unlink (component FAT_FileSystem) +** +** Description : +** Remove a file or directory +** Parameters : +** NAME - DESCRIPTION +** path - Pointer to the object name +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_unlink(const XCHAR *path) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : mount (component FAT_FileSystem) +** +** Description : +** Mount/unmount a logical drive +** Parameters : +** NAME - DESCRIPTION +** fs - pointer to the new file system object (NULL +** for unmount) +** * path - Logical drive number to be +** mounted/unmounted +** opt - options: 0:Do not mount (delayed mount), 1: +** Mount immediately +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_mount(FATFS *fs, const TCHAR* path, uint8_t opt) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : getfree (component FAT_FileSystem) +** +** Description : +** Get Number of Free Clusters +** Parameters : +** NAME - DESCRIPTION +** path - Pointer to the logical drive number +** (root dir) +** * nclst - Pointer to the variable to return +** number of free clusters +** fatfs - Pointer to pointer to file system +** object +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_getfree(const XCHAR *path, dword *nclst, FATFS **fatfs) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : sync (component FAT_FileSystem) +** +** Description : +** Flush cached data of a writing file +** Parameters : +** NAME - DESCRIPTION +** fp - Pointer to the file object +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_sync(FIL *fp) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : rename (component FAT_FileSystem) +** +** Description : +** Delete a file or directory +** Parameters : +** NAME - DESCRIPTION +** path_old - Pointer to old object name +** path_new - Pointer to new object name +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_rename(const XCHAR *path_old, const XCHAR *path_new) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : mkdir (component FAT_FileSystem) +** +** Description : +** Creates a directory +** Parameters : +** NAME - DESCRIPTION +** path - Name of directory to be created +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_mkdir(const XCHAR *path) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : chmod (component FAT_FileSystem) +** +** Description : +** Changes the attribute of a file or directory +** Following attribute flags to be set in one or more +** combination of the following flags. The specified flags are +** set and others are cleared. +** AM_RDO Read only +** AM_ARC Archive +** AM_SYS System +** AM_HID Hidden +** Parameters : +** NAME - DESCRIPTION +** FileName - Pointer to the file or directory +** Attribute - Attribute flags. Attribute +** flags to be set in one or more combination +** of the following flags. The specified flags +** are set and others are cleard. +** AttributeMask - Attribute mask. +** Attribute mask that specifies which +** attribute is changed. The specified +** aattributes are set or cleard. +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_chmod(const TCHAR* FileName, uint8_t Attribute, uint8_t AttributeMask) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : truncate (component FAT_FileSystem) +** +** Description : +** Truncates the file size. +** The truncate() function truncates the file size to the +** current file read/write point. This function has no effect +** if the file read/write pointer is already pointing end of +** the file. +** Parameters : +** NAME - DESCRIPTION +** * FileObject - Pointer to the file object +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_truncate(FIL *FileObject) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : stat (component FAT_FileSystem) +** +** Description : +** The f_stat gets the information of a file or directory. For +** details of the infomation, refer to the FILINFO structure +** and f_readdir function. This function is not supported in +** minimization level of >= 1. +** Parameters : +** NAME - DESCRIPTION +** FileName - Pointer to the file or directory +** path +** * FileInfo - Pointer to the FILINFO structure +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_stat(const TCHAR* FileName, FILINFO* FileInfo) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : utime (component FAT_FileSystem) +** +** Description : +** The f_utime function changes the timestamp of a file or +** directory +** Parameters : +** NAME - DESCRIPTION +** * FileName - Pointer to the file or directory +** path +** * TimeDate - Pointer to time and data to be +** set +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_utime(const TCHAR* FileName, const FILINFO* TimeDate) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : mkfs (component FAT_FileSystem) +** +** Description : +** The f_mkfs fucntion creates a file system on the drive. +** Parameters : +** NAME - DESCRIPTION +** drive - Logical drive number +** PartitioningRule - When 0 is given, +** a partition table is created into the +** master boot record and a primary DOS +** partition is created and then an FAT volume +** is created on the partition. This is called +** FDISK format and used for harddisk and +** memory cards. When 1 is given, the FAT +** volume starts from the first sector on the +** drive without partition table. This is +** called SFD format and used for floppy disk +** and most optical disk +** AllocSize - Size of the allocation unit. +** Force the allocation unit (cluster) size in +** unit of byte. The value must be power of 2 +** and between the sector size and 128 times +** sector size. When invalid value is +** specified, the cluster size is determined +** depends on the volume size. +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_mkfs(uint8_t drive, uint8_t PartitioningRule, UINT AllocSize) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : chdir (component FAT_FileSystem) +** +** Description : +** The f_chdir function changes the current directory of the +** logical drive. The current directory of a drive is +** initialized to the root directory when the drive is +** auto-mounted. Note that the current directory is retained in +** the each file system object so that it also affects other +** tasks that using the drive. +** Parameters : +** NAME - DESCRIPTION +** Path - Pointer to the path name +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_chdir(const TCHAR* Path) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : chdrive (component FAT_FileSystem) +** +** Description : +** The f_chdrive function changes the current drive. The +** initial value of the current drive number is 0. Note that +** the current drive is retained in a static variable so that +** it also affects other tasks that using the file functions. +** Parameters : +** NAME - DESCRIPTION +** Drive - Logical drive number +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_chdrive(uint8_t Drive) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : getcwd (component FAT_FileSystem) +** +** Description : +** The f_getcwd function retrieves the current directory of the +** current drive in full path string including drive number. +** Parameters : +** NAME - DESCRIPTION +** Buffer - Pointer to the buffer to receive the +** current directory string. +** BufferLen - Size of the buffer in unit of +** TCHAR. +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_getcwd(TCHAR* Buffer, UINT BufferLen) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : errFResultMsg (component FAT_FileSystem) +** +** Description : +** Returns for a given FatFs FRESULT error code a string +** Parameters : +** NAME - DESCRIPTION +** errNo - FatFs error code +** Returns : +** --- - Error code +** =================================================================== +*/ +char* McuFatFS_errFResultMsg(int errNo) +{ + switch(errNo) { + case FR_OK: return (char*)"Succeeded"; + case FR_DISK_ERR: return (char*)"A hard error occurred in the low level disk I/O layer"; + case FR_INT_ERR: return (char*)"Assertion failed"; + case FR_NOT_READY: return (char*)"The physical drive cannot work"; + case FR_NO_FILE: return (char*)"Could not find the file"; + case FR_NO_PATH: return (char*)"Could not find the path"; + case FR_INVALID_NAME: return (char*)"The path name format is invalid"; + case FR_DENIED: return (char*)"Access denied due to prohibited access or directory full"; + case FR_EXIST: return (char*)"Access denied due to prohibited access"; + case FR_INVALID_OBJECT: return (char*)"The file/directory object is invalid"; + case FR_WRITE_PROTECTED: return (char*)"The physical drive is write protected"; + case FR_INVALID_DRIVE: return (char*)"The logical drive number is invalid"; + case FR_NOT_ENABLED: return (char*)"The volume has no work area"; + case FR_NO_FILESYSTEM: return (char*)"There is no valid FAT volume on the physical drive"; + case FR_MKFS_ABORTED: return (char*)"The f_mkfs() aborted due to any parameter error"; + case FR_TIMEOUT: return (char*)"Could not get a grant to access the volume within defined period"; + case FR_LOCKED: return (char*)"The operation is rejected according to the file sharing policy"; + case FR_NOT_ENOUGH_CORE: return (char*)"LFN working buffer could not be allocated"; + case FR_TOO_MANY_OPEN_FILES: return (char*)"Number of open files > _FS_SHARE"; + /*default: return (char*)"unknown";*/ + } /* switch */ + return (char*)"*error*"; +} + +/* +** =================================================================== +** Method : errDResultMsg (component FAT_FileSystem) +** +** Description : +** Returns for a given FatFs DRESULT error code a string +** Parameters : +** NAME - DESCRIPTION +** errNo - FatFs error code +** Returns : +** --- - Error code +** =================================================================== +*/ +char* McuFatFS_errDResultMsg(int errNo) +{ + switch(errNo) { + case RES_OK: return (char*)"Successful"; + case RES_ERROR: return (char*)"R/W Error"; + case RES_WRPRT: return (char*)"Write Protected"; + case RES_NOTRDY: return (char*)"Not Ready"; + case RES_PARERR: return (char*)"Invalid Parameter"; + /*default: return (char*)"unknown";*/ + } /* switch */ + return (char*)"*error*"; +} + +/* +** =================================================================== +** Method : isWriteProtected (component FAT_FileSystem) +** +** Description : +** Determines if the file system is write protected. +** Parameters : +** NAME - DESCRIPTION +** * drvStr - Pointer to drive string, e.g. "" or +** "0" +** Returns : +** --- - TRUE if file system is write protected +** =================================================================== +*/ +bool McuFatFS_isWriteProtected(uint8_t *drvStr) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT + uint8_t drv; + + drv = McuFatFS_StrToDriveNumber(drvStr); + switch(drv) { + case 0: + return SDCard_isWriteProtected(); + default: + break; + } /* switch */ + return TRUE; +#else + return McuFatFS_CONFIG_IS_WRITE_PROTECTED_CALLBACK(drvStr); +#endif +} + +/* +** =================================================================== +** Method : isDiskPresent (component FAT_FileSystem) +** +** Description : +** Determines if the disk is present or not (e.g. disk inserted). +** Parameters : +** NAME - DESCRIPTION +** * drvStr - drive string, "" or "0" or "1" +** Returns : +** --- - TRUE if file system is write protected +** =================================================================== +*/ +bool McuFatFS_isDiskPresent(uint8_t *drvStr) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT + uint8_t drv; + + drv = McuFatFS_StrToDriveNumber(drvStr); + switch(drv) { + case 0: + return SDCard_CardPresent(); + default: + break; + } /* switch */ + return FALSE; +#else + return McuFatFS_CONFIG_IS_DISK_PRESENT_CALLBACK(drvStr); +#endif +} + +/* +** =================================================================== +** Method : f_gets (component FAT_FileSystem) +** +** Description : +** Get a string from the file +** Parameters : +** NAME - DESCRIPTION +** * buff - Pointer to the string buffer to read +** len - Size of string buffer (characters) +** fil - Pointer to the file object +** Returns : +** --- - zero (NULL) if failed, otherwise a string +** to the buffer is returned. +** =================================================================== +*/ +/* +McuFatFS_CHARP McuFatFS_f_gets(TCHAR* buff, int len, FIL *fil) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : f_puts (component FAT_FileSystem) +** +** Description : +** Put a string to the file +** Parameters : +** NAME - DESCRIPTION +** * buff - A character to be output +** fil - Pointer to the file object +** Returns : +** --- - number of characters written. +** =================================================================== +*/ +/* +McuFatFS_INT McuFatFS_f_puts(const TCHAR* str, FIL *fil) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : f_putc (component FAT_FileSystem) +** +** Description : +** Put a character to the file +** Parameters : +** NAME - DESCRIPTION +** * buff - A character to be output +** fil - Pointer to the file object +** Returns : +** --- - 1 if ok, EOF otherwise +** =================================================================== +*/ +/* +McuFatFS_INT McuFatFS_f_putc(TCHAR c, FIL *fil) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : f_printf (component FAT_FileSystem) +** +** Description : +** Put a formatted string to the file +** Parameters : +** NAME - DESCRIPTION +** Variable_1 - Pointer to the file object +** str - Pointer to the format string +** Variable_2 - Optional arguments... +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +McuFatFS_INT McuFatFS_f_printf(FIL* fil, const TCHAR* str, ...) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : f_eof (component FAT_FileSystem) +** +** Description : +** Wrapper to to the f_eof() macro. Returns 1 if at the end of +** the file, 0 otherwise. +** Parameters : +** NAME - DESCRIPTION +** * fp - Pointer to file object +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +uint8_t McuFatFS_f_eof(FIL *fil) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : f_error (component FAT_FileSystem) +** +** Description : +** Wrapper to to the f_eof() macro. Returns 1 if at the end of +** the file, 0 otherwise. +** Parameters : +** NAME - DESCRIPTION +** * fp - Pointer to file object +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +uint8_t McuFatFS_f_error(FIL *fil) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : f_tell (component FAT_FileSystem) +** +** Description : +** Wrapper to to the f_tell() macro. Returns the file +** read/write pointer (0 on file open). +** Parameters : +** NAME - DESCRIPTION +** * fp - Pointer to file object +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +dword McuFatFS_f_tell(FIL *fil) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : f_size (component FAT_FileSystem) +** +** Description : +** Wrapper to to the f_size() macro. Returns the file size. +** Parameters : +** NAME - DESCRIPTION +** * fp - Pointer to file object +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +dword McuFatFS_f_size(FIL *fil) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : Init (component FAT_FileSystem) +** +** Description : +** Initializes the device driver. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuFatFS_Init(void) +{ + uint8_t res = ERR_OK; +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT + if (SDCard_Init(NULL)!=ERR_OK) { + res = ERR_FAILED; + } +#endif + return res; +} + +/* +** =================================================================== +** Method : Deinit (component FAT_FileSystem) +** +** Description : +** Deinitializes the driver. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuFatFS_Deinit(void) +{ + uint8_t res = ERR_OK; +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT + if (SDCard_Deinit(NULL)!=ERR_OK) { + res = ERR_FAILED; + } +#endif + return res; +} + + +#if !McuFatFS_FS_READONLY +/* +** =================================================================== +** Method : get_fattime (component FAT_FileSystem) +** +** Description : +** Returns the current time +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +uint32_t McuFatFS_get_fattime(void) +{ + /* 31-25: Year(0-127 org.1980), 24-21: Month(1-12), 20-16: Day(1-31) */ + /* 15-11: Hour(0-23), 10-5: Minute(0-59), 4-0: Second(0-29 *2) */ + /* Pack date and time into a uint32_t variable */ + TIMEREC time; + DATEREC date; + uint8_t res; + + res = McuTimeDate_GetTime(&time); /* get time information */ + if (res!=ERR_OK) { + return 0; /* failed */ + } + res = McuTimeDate_GetDate(&date); /* get date information */ + if (res!=ERR_OK) { + return 0; /* failed */ + } + return ((uint32_t)(date.Year - 1980) << 25) + | ((uint32_t)date.Month << 21) + | ((uint32_t)date.Day << 16) + | ((uint32_t)time.Hour << 11) + | ((uint32_t)time.Min << 5) + | ((uint32_t)time.Sec); +} + +uint32_t get_fattime(void) { + return McuFatFS_get_fattime(); +} +#endif /* !McuFatFS_FS_READONLY */ + + +/* +** =================================================================== +** Method : ParseCommand (component FAT_FileSystem) +** +** Description : +** Shell Command Line parser. This method is enabled/disabled +** depending on if you have the Shell enabled/disabled in the +** properties. +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command string +** * handled - Pointer to variable which tells if +** the command has been handled or not +** * io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuFatFS_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) +{ + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, "McuFatFS help")==0) { + *handled = TRUE; + return PrintHelp(io); + } else if ((McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) || (McuUtility_strcmp((char*)cmd, "McuFatFS status")==0)) { + *handled = TRUE; + return PrintStatus(io); + } else if (McuUtility_strncmp((char*)cmd, "McuFatFS cd", sizeof("McuFatFS cd")-1)==0) { + *handled = TRUE; + return CdCmd(cmd+sizeof("McuFatFS"), io); + } else if (McuUtility_strncmp((char*)cmd, "McuFatFS dir", sizeof("McuFatFS dir")-1)==0) { + *handled = TRUE; + return DirCmd(cmd+sizeof("McuFatFS"), io); + } else if (McuUtility_strncmp((char*)cmd, "McuFatFS copy ", sizeof("McuFatFS copy ")-1)==0) { + *handled = TRUE; + return CopyCmd(cmd+sizeof("McuFatFS"), io); + } else if (McuUtility_strncmp((char*)cmd, "McuFatFS delete ", sizeof("McuFatFS delete ")-1)==0) { + *handled = TRUE; + return DeleteCmd(cmd+sizeof("McuFatFS"), io); + } else if (McuUtility_strncmp((char*)cmd, "McuFatFS create ", sizeof("McuFatFS create ")-1)==0) { + *handled = TRUE; + return CreateCmd(cmd+sizeof("McuFatFS"), io); + } else if (McuUtility_strncmp((char*)cmd, "McuFatFS mkdir ", sizeof("McuFatFS mkdir ")-1)==0) { + *handled = TRUE; + return MkdirCmd(cmd+sizeof("McuFatFS"), io); + } else if (McuUtility_strncmp((char*)cmd, "McuFatFS rename ", sizeof("McuFatFS rename ")-1)==0) { + *handled = TRUE; + return RenameCmd(cmd+sizeof("McuFatFS"), io); + } else if (McuUtility_strncmp((char*)cmd, "McuFatFS printhex ", sizeof("McuFatFS printhex ")-1)==0) { + *handled = TRUE; + return PrintHexCmd(cmd+sizeof("McuFatFS"), io); + } else if (McuUtility_strncmp((char*)cmd, "McuFatFS printsector ", sizeof("McuFatFS printsector ")-1)==0) { + *handled = TRUE; + return SectorCmd(cmd+sizeof("McuFatFS"), io); + } else if (McuUtility_strncmp((char*)cmd, "McuFatFS print ", sizeof("McuFatFS print ")-1)==0) { + *handled = TRUE; + return PrintCmd(cmd+sizeof("McuFatFS"), io); + } else if (McuUtility_strcmp((char*)cmd, "McuFatFS diskinfo")==0) { + *handled = TRUE; + return McuFatFS_PrintDiskInfo((unsigned char*)McuFatFS_CONFIG_DEFAULT_DRIVE_STRING, io); + } else if (McuUtility_strcmp((char*)cmd, "McuFatFS benchmark")==0) { + *handled = TRUE; + return McuFatFS_Benchmark(io); + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : CheckCardPresence (component FAT_FileSystem) +** +** Description : +** This method checks if card has been inserted or removed and +** mounts or unmounts the file system. +** Parameters : +** NAME - DESCRIPTION +** * cardMounted - Pointer to initialize this +** variable to FALSE on the caller side the +** first time. +** * drive - drive string, or "" +** * fileSystemObject - Pointer to file +** system object +** io - Pointer to io handler to be used. Can be +** NULL, then no messages are written. +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuFatFS_CheckCardPresence(bool *cardMounted, uint8_t *drive, FATFS *fileSystemObject, const McuShell_StdIOType *io) +{ + if (drive==NULL) { /* backward compatibility with drive numbers before (which could be zero or NULL) */ + drive = (unsigned char*)McuFatFS_CONFIG_DEFAULT_DRIVE_STRING; + } + if (!(*cardMounted) && McuFatFS_isDiskPresent(drive)) { + /* card inserted */ + #if McuFatFS_CONFIG_CARD_INSERT_DELAY_TIME_MS>0 + McuWait_WaitOSms(McuFatFS_CONFIG_CARD_INSERT_DELAY_TIME_MS); /* give card some time to power up */ + #endif + if (McuFatFS_MountFileSystem(fileSystemObject, drive, io)==ERR_OK) { + *cardMounted = TRUE; + if (io!=NULL) { + McuShell_SendStr((unsigned char*)"File System mounted\r\n", io->stdOut); + } + #if (McuFatFS_FS_RPATH >= 1U && McuFatFS_VOLUMES >= 2) + if (f_chdrive((char const *)drive)!=FR_OK) { /* change default drive */ + return ERR_FAILED; + } + #endif + } else { + return ERR_FAILED; + } + } else if (*cardMounted && !McuFatFS_isDiskPresent(drive)) { + /* card removed */ + if (McuFatFS_UnMountFileSystem(drive, io)==ERR_OK) { + *cardMounted = FALSE; + if (io!=NULL) { + McuShell_SendStr((unsigned char*)"File System unmounted\r\n", io->stdOut); + } + } else { + return ERR_FAILED; + } + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : MountFileSystem (component FAT_FileSystem) +** +** Description : +** Mounts a file system +** Parameters : +** NAME - DESCRIPTION +** * fileSystemObject - Pointer to a +** file system object +** * logicalDrive - Pointer to the drive +** string, or "" +** * io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ +/*! + * \brief Mounts the file system for a drive + * \param[in] fileSystemObject Pointer to the file system object + * \param[in] logicalDrive The drive number to be used + * \param[in] io IO handler for output + * \return Error code, ERR_OK for success. + */ +uint8_t McuFatFS_MountFileSystem(FATFS *fileSystemObject, uint8_t *logicalDrive, const McuShell_StdIOType *io) +{ + McuFatFS_FRESULT fres; + + fres = McuFatFS_mount(fileSystemObject, (const TCHAR*)logicalDrive, 1 /* 1: mount immediately; 0: delayed mount */); + if (fres != FR_OK) { + if (io!=NULL) { + FatFsFResultMsg((unsigned char*)"mount failed", fres, io); + } + return ERR_FAILED; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : UnMountFileSystem (component FAT_FileSystem) +** +** Description : +** Mounts a file system +** Parameters : +** NAME - DESCRIPTION +** * logicalDrive - Pointer to the drive +** string, or "" +** * io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ +/*! + * \brief Unmounts the file system for a drive + * \param[in] logicalDrive The drive number to be used + * \param[in] io IO handler for output + * \return Error code, ERR_OK for success. + */ +uint8_t McuFatFS_UnMountFileSystem(uint8_t *logicalDrive, const McuShell_StdIOType *io) +{ + McuFatFS_FRESULT fres; + + fres = McuFatFS_mount(NULL, (const TCHAR*)logicalDrive, 0); + if (fres != FR_OK) { + if (io!=NULL) { + FatFsFResultMsg((unsigned char*)"unmount failed", fres, io); + } + return ERR_FAILED; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : PrintDirectory (component FAT_FileSystem) +** +** Description : +** Prints a directory +** Parameters : +** NAME - DESCRIPTION +** dirName - Directory folder to be printed +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ +/*! + * \brief Prints a directory listing + * \param[in] dirName Directory to be used + * \param[in] io IO handler for output + * \return Error code, ERR_OK for success. + */ +uint8_t McuFatFS_PrintDirectory(const uint8_t *dirName, const McuShell_StdIOType *io) +{ + uint8_t res; + + res = PrintDir(dirName, io); + if (res != ERR_OK) { + McuShell_SendStr((unsigned char*)"PrintDir failed\r\n", io->stdErr); + return res; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : CopyFile (component FAT_FileSystem) +** +** Description : +** Copy a file +** Parameters : +** NAME - DESCRIPTION +** srcFileName - Source file name +** dstFileName - Destination file name +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ +/*! + * \brief Copy the source file to a destination file + * \param[in] srcFileName Source file name + * \param[in] dstFileName Destination file name + * \param[in] io IO handler for output + * \return Error code, ERR_OK for success. + */ +uint8_t McuFatFS_CopyFile(const uint8_t*srcFileName, const uint8_t *dstFileName, const McuShell_StdIOType *io) +{ +#if !McuFatFS_FS_READONLY + McuFatFS_FIL fsrc, fdst; /* file objects */ + McuFatFS_FRESULT fres; + uint8_t buffer[32]; /* copy buffer */ + UINT br, bw; /* file read/write counters */ + uint8_t res = ERR_OK; + + if (McuFatFS_isWriteProtected((uint8_t*)McuFatFS_CONFIG_DEFAULT_DRIVE_STRING)) { + McuShell_SendStr((unsigned char*)"disk is write protected!\r\n", io->stdErr); + return ERR_FAILED; + } + /* open source file */ + fres = McuFatFS_open(&fsrc, (const TCHAR*)srcFileName, FA_OPEN_EXISTING | FA_READ); + if (fres != FR_OK) { + FatFsFResultMsg((unsigned char*)"open source file failed", fres, io); + return ERR_FAILED; + } + /* create destination file */ + fres = McuFatFS_open(&fdst, (const TCHAR*)dstFileName, FA_CREATE_ALWAYS | FA_WRITE); + if (fres != FR_OK) { + (void)McuFatFS_close(&fsrc); /* close the source file which we have open */ + FatFsFResultMsg((unsigned char*)"open destination file failed", fres, io); + return ERR_FAILED; + } + /* now copy source to destination */ + for (;;) { + fres = McuFatFS_read(&fsrc, buffer, sizeof(buffer), &br); + if (fres != FR_OK) { + FatFsFResultMsg((unsigned char*)"reading source file failed", fres, io); + res = ERR_FAILED; + break; + } + if (br == 0) { /* EOF */ + break; /* get out of loop */ + } + fres = McuFatFS_write(&fdst, buffer, br, &bw); + if (fres != FR_OK) { + FatFsFResultMsg((unsigned char*)"writing destination file failed", fres, io); + res = ERR_FAILED; + break; + } + if (bw < br) { + McuShell_SendStr((unsigned char*)"failed writing destination file, or disk full\r\n", io->stdErr); + res = ERR_FAILED; + break; + } + } /* for */ + /* close all files */ + fres = McuFatFS_close(&fsrc); + if (fres != FR_OK) { + FatFsFResultMsg((unsigned char*)"closing source file failed", fres, io); + res = ERR_FAILED; + } + fres = McuFatFS_close(&fdst); + if (fres != FR_OK) { + FatFsFResultMsg((unsigned char*)"closing destination file failed", fres, io); + res = ERR_FAILED; + } + return res; +#else + (void)srcFileName; /* unused argument */ + (void)dstFileName; /* unused argument */ + McuShell_SendStr((unsigned char*)"File System is in Read-Only mode\r\n", io->stdErr); + return ERR_FAILED; +#endif +} + +/* +** =================================================================== +** Method : DeleteFile (component FAT_FileSystem) +** +** Description : +** Deletes a file +** Parameters : +** NAME - DESCRIPTION +** fileName - Filename of file to be deleted +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ +/*! + * \brief Deletes a file + * \param[in] fileName Name of file to be deleted + * \param[in] io IO handler for output + * \return Error code, ERR_OK for success. + */ +uint8_t McuFatFS_DeleteFile(const uint8_t *fileName, const McuShell_StdIOType *io) +{ + McuFatFS_FRESULT fres; + + if (McuFatFS_isWriteProtected((uint8_t*)McuFatFS_CONFIG_DEFAULT_DRIVE_STRING)) { + McuShell_SendStr((unsigned char*)"disk is write protected!\r\n", io->stdErr); + return ERR_FAILED; + } + fres = McuFatFS_unlink((const TCHAR*)fileName); + if (fres != FR_OK) { + FatFsFResultMsg((unsigned char*)"unlink failed", fres, io); + return ERR_FAILED; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : CreateFile (component FAT_FileSystem) +** +** Description : +** Creates an empty file +** Parameters : +** NAME - DESCRIPTION +** fileName - Filename of file to be created +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuFatFS_CreateFile(const uint8_t *fileName, const McuShell_StdIOType *io) +{ + McuFatFS_FRESULT fres; + FIL fp; + + if (McuFatFS_isWriteProtected((uint8_t*)McuFatFS_CONFIG_DEFAULT_DRIVE_STRING)) { + McuShell_SendStr((unsigned char*)"disk is write protected!\r\n", io->stdErr); + return ERR_FAILED; + } + fres = McuFatFS_open(&fp, (const TCHAR*)fileName, FA_CREATE_NEW); + if (fres != FR_OK) { + FatFsFResultMsg((unsigned char*)"creating new file failed", fres, io); + return ERR_FAILED; + } + fres = McuFatFS_close(&fp); + if (fres != FR_OK) { + FatFsFResultMsg((unsigned char*)"closing file failed", fres, io); + return ERR_FAILED; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : PrintFile (component FAT_FileSystem) +** +** Description : +** Prints the content of a file +** Parameters : +** NAME - DESCRIPTION +** fileName - Name of file to be printed +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ +/*! + * \brief Print the content of a file + * \param[in] fileName Name of file to be printed + * \param[in] io IO handler for output + * \return Error code, ERR_OK for success. + */ +uint8_t McuFatFS_PrintFile(const uint8_t *fileName, const McuShell_StdIOType *io) +{ + McuFatFS_FIL file; + McuFatFS_FRESULT fres; + UINT nofRead = 0; + uint8_t buf[32]; + uint8_t res = ERR_OK; + + fres = McuFatFS_open(&file, (const TCHAR *)fileName, FA_READ); + if (fres == FR_OK) { + do { + nofRead = 0; + fres=McuFatFS_read(&file, buf, sizeof(buf)-1, &nofRead); /* read one byte less for zero byte */ + if (fres != FR_OK) { + McuShell_SendStr((unsigned char*)"fread failed\r\n", io->stdErr); + res = ERR_FAILED; + } else { + buf[nofRead] = '\0'; /* terminate buffer */ + McuShell_SendStr(buf, io->stdOut); + } + } while(nofRead>0 && fres==FR_OK); + fres=McuFatFS_close(&file); + if (fres != FR_OK) { + McuShell_SendStr((unsigned char*)"fclose failed\r\n", io->stdErr); + res = ERR_FAILED; + } + } else { + FatFsFResultMsg((unsigned char*)"open file failed", fres, io); + res = ERR_FAILED; + } + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + return res; +} + +/* +** =================================================================== +** Method : PrintHexFile (component FAT_FileSystem) +** +** Description : +** Prints the content of a file in hexadecimal format, useful +** for binary files. +** Parameters : +** NAME - DESCRIPTION +** fileName - Name of file to be printed +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuFatFS_PrintHexFile(const uint8_t *fileName, const McuShell_StdIOType *io) +{ + McuFatFS_FIL file; + McuFatFS_FRESULT fres; + UINT nofRead = 0; + #define PRINT_HEX_NOF_BYTES_PER_LINE 16 + uint8_t filebuf[PRINT_HEX_NOF_BYTES_PER_LINE]; + uint8_t buf[16]; + uint8_t res = ERR_OK; + uint32_t address; + UINT i; + + fres = McuFatFS_open(&file, (const TCHAR *)fileName, FA_READ); + if (fres == FR_OK) { + address = 0; + do { + nofRead = 0; + fres=McuFatFS_read(&file, filebuf, sizeof(filebuf), &nofRead); /* read one byte less for zero byte */ + if (fres != FR_OK) { + McuShell_SendStr((unsigned char*)"fread failed\r\n", io->stdErr); + res = ERR_FAILED; + } else if (nofRead>0) { + for(i=0; istdOut); + buf[0] = '\0'; + McuUtility_strcatNum32Hex(buf, sizeof(buf), address); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)": ", io->stdOut); + address += PRINT_HEX_NOF_BYTES_PER_LINE; + } + buf[0] = '\0'; + McuUtility_strcatNum8Hex(buf, sizeof(buf), filebuf[i]); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)" ", io->stdOut); + } + /* fill up line if not a full line */ + for (/*empty*/; istdOut); + } + /* print in ASCII */ + PrintInASCII(&filebuf[0], nofRead, PRINT_HEX_NOF_BYTES_PER_LINE, '.', '-', io); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + } + } while(nofRead>0 && fres==FR_OK); + fres=McuFatFS_close(&file); + if (fres != FR_OK) { + McuShell_SendStr((unsigned char*)"fclose failed\r\n", io->stdErr); + res = ERR_FAILED; + } + } else { + FatFsFResultMsg((unsigned char*)"open file failed\r\n", fres, io); + res = ERR_FAILED; + } + return res; +} + +/* +** =================================================================== +** Method : MakeDirectory (component FAT_FileSystem) +** +** Description : +** Creates a directory +** Parameters : +** NAME - DESCRIPTION +** dirName - Directory name +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ +/*! + * \brief Creates a new directory + * \param[in] dirName Name of the directory to be created + * \param[in] io IO handler for output + * \return Error code, ERR_OK for success. + */ +uint8_t McuFatFS_MakeDirectory(const uint8_t *dirName, const McuShell_StdIOType *io) +{ + McuFatFS_FRESULT fres; + + if (McuFatFS_isWriteProtected((uint8_t*)McuFatFS_CONFIG_DEFAULT_DRIVE_STRING)) { + McuShell_SendStr((unsigned char*)"disk is write protected!\r\n", io->stdErr); + return ERR_FAILED; + } + fres = McuFatFS_mkdir((const TCHAR*)dirName); + if(fres!=FR_OK) { + FatFsFResultMsg((unsigned char*)"mkdir failed", fres, io); + return ERR_FAILED; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : ChangeDirectory (component FAT_FileSystem) +** +** Description : +** Changes to a directory +** Parameters : +** NAME - DESCRIPTION +** dirName - Directory name +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuFatFS_ChangeDirectory(const uint8_t *dirName, const McuShell_StdIOType *io) +{ +#if McuFatFS_FS_RPATH > 0 + McuFatFS_FRESULT fres; + + if ((fres=McuFatFS_chdir((const TCHAR*)dirName)) != FR_OK) { + FatFsFResultMsg((unsigned char*)"chdir failed", fres, io); + return ERR_FAILED; + } + return ERR_OK; +#else + (void)dirName; + #warning "relative directories not enabled in FatFS!" + McuShell_SendStr((unsigned char*)"cd command not available as relative directories not enable in file system\r\n", io->stdErr); + return ERR_FAILED; +#endif +} + +/* +** =================================================================== +** Method : RenameFile (component FAT_FileSystem) +** +** Description : +** Renames a file +** Parameters : +** NAME - DESCRIPTION +** srcFileName - Source file name +** dstFileName - Destination file name +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ +/*! + * \brief Renames a file + * \param[in] srcFileName Source/existing file name + * \param[in] dstFileName Destination/new file name + * \param[in] io IO handler for output + * \return Error code, ERR_OK for success. + */ +uint8_t McuFatFS_RenameFile(const uint8_t *srcFileName, const uint8_t *dstFileName, const McuShell_StdIOType *io) +{ + McuFatFS_FRESULT fres; + + if (McuFatFS_isWriteProtected((uint8_t*)McuFatFS_CONFIG_DEFAULT_DRIVE_STRING)) { + McuShell_SendStr((unsigned char*)"disk is write protected!\r\n", io->stdErr); + return ERR_FAILED; + } + fres = McuFatFS_rename((const TCHAR*)srcFileName, (const TCHAR*)dstFileName); + if(fres!=FR_OK) { + FatFsFResultMsg((unsigned char*)"rename failed", fres, io); + return ERR_FAILED; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : PrintSector (component FAT_FileSystem) +** +** Description : +** Prints information about the current disk +** Parameters : +** NAME - DESCRIPTION +** drive - drive number, starting with zero +** sectorNo - sector number +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ +#if McuFatFS_USE_RTOS_DYNAMIC_MEMORY +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT + #define SECTOR_BUF_SIZE0 SDCard_BLOCK_SIZE +#else + #define SECTOR_BUF_SIZE0 512 +#endif +#else +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT + static uint8_t print_buf0[SDCard_BLOCK_SIZE]; + #define SECTOR_BUF_SIZE0 sizeof(print_buf0) +#else + static uint8_t print_buf0[512]; + #define SECTOR_BUF_SIZE0 sizeof(print_buf0) +#endif +#endif +uint8_t McuFatFS_PrintSector(uint8_t drive, uint32_t sectorNo, const McuShell_StdIOType *io) +{ + #define PRINT_SECTOR_NOF_BYTES_PER_LINE 16 + uint16_t i; + unsigned char buf[8]; + McuFatFS_DRESULT dres; +#if McuFatFS_USE_RTOS_DYNAMIC_MEMORY + #if configFRTOS_MEMORY_SCHEME==1 /* this scheme does not allow deallocation of memory */ + static unsigned char *print_buf0=NULL; /* use global buffer pointer, allocated only once, and not deallocated! */ + #else + unsigned char *print_buf0; + #endif +#endif + + if ((disk_initialize(drive)&STA_NOINIT)!=(DSTATUS)RES_OK) { + McuShell_SendStr((unsigned char*)"disk initialize failed\r\n", io->stdErr); + return ERR_FAILED; + } +#if McuFatFS_USE_RTOS_DYNAMIC_MEMORY + #if configFRTOS_MEMORY_SCHEME==1 /* this scheme does not allow deallocation of memory */ + if (print_buf0==NULL) { /* only if not allocated yet */ + print_buf0 = pvPortMalloc(SECTOR_BUF_SIZE0); + } + #else + print_buf0 = pvPortMalloc(SECTOR_BUF_SIZE0); + #endif + if (print_buf0 == NULL) { + McuShell_SendStr((unsigned char*)"allocating memory failed\r\n", io->stdErr); + return ERR_FAILED; + } +#endif + dres = disk_read(drive, &print_buf0[0], sectorNo, 1); + if (dres==RES_OK) { /* read one sector */ + McuShell_SendStr((unsigned char*)"dumping disk sector: 0x", io->stdOut); + buf[0] = '\0'; + McuUtility_strcatNum32Hex(buf, sizeof(buf), sectorNo); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)", sector size ", io->stdOut); + McuShell_SendNum32u(SECTOR_BUF_SIZE0, io->stdOut); + for(i=0; istdOut); + buf[0] = '\0'; + McuUtility_strcatNum16Hex(buf, sizeof(buf), i); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)": ", io->stdOut); + } + buf[0] = '\0'; + McuUtility_strcatNum8Hex(buf, sizeof(buf), (uint8_t)print_buf0[i]); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)" ", io->stdOut); + } + PrintInASCII(&print_buf0[i-PRINT_SECTOR_NOF_BYTES_PER_LINE], PRINT_SECTOR_NOF_BYTES_PER_LINE, PRINT_SECTOR_NOF_BYTES_PER_LINE, '.', '-', io); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + } else { + FatFsDResultMsg((unsigned char*)"disk_read failed", dres, io); + } +#if McuFatFS_USE_RTOS_DYNAMIC_MEMORY + #if configFRTOS_MEMORY_SCHEME!=1 /* this scheme does not allow deallocation of memory */ + vPortFree(print_buf0); + #endif +#endif + if (dres==RES_OK) { + return ERR_OK; + } else { + return ERR_FAILED; + } +} + +/* +** =================================================================== +** Method : PrintDiskInfo (component FAT_FileSystem) +** +** Description : +** Prints information about the current disk +** Parameters : +** NAME - DESCRIPTION +** * drive - Drive string, can be NULL or e.g. +** pointing to "0" +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ +/*! + * \brief Prints information about the disk + * \param[in] drive Disk drive number, starting with zero + * \param[in] io IO handler for output + * \return Error code, ERR_OK for success. + */ +uint8_t McuFatFS_PrintDiskInfo(uint8_t *drvStr, const McuShell_StdIOType *io) +{ + /* see for details: + * http://www.retroleum.co.uk/electronics-articles/basic-mmc-card-access/ + */ + uint8_t buf[8]; + int32_t val32; + int16_t val16; + int8_t val8; + uint8_t buff[64]; + uint8_t driverVersion; /* 0: SPI, 1: SDHC_LDD */ + uint8_t driveNr; + + driveNr = McuFatFS_StrToDriveNumber(drvStr); + if (!McuFatFS_isDiskPresent(drvStr)) { + McuShell_SendStr((unsigned char*)"disk not present!\r\n", io->stdErr); + return ERR_FAILED; + } + if ((disk_initialize(McuFatFS_StrToDriveNumber(drvStr))&STA_NOINIT)!=0) { + McuShell_SendStr((unsigned char*)"disk initialize failed!\r\n", io->stdErr); + return ERR_FAILED; + } + if (disk_ioctl(driveNr, MMC_GET_DRIVER_VERSION, &driverVersion)!=RES_OK) { + McuShell_SendStr((unsigned char*)"failed identification of driver version\r\n", io->stdErr); + return ERR_FAILED; + } + McuShell_SendStatusStr((unsigned char*)"Card type", (unsigned char*)"", io->stdOut); + if (disk_ioctl(driveNr, MMC_GET_TYPE, &val8)==RES_OK) { + if (val8&CT_SD1) { + McuShell_SendStr((unsigned char*)"SD1 ", io->stdOut); + } + if (val8&CT_SD2) { + McuShell_SendStr((unsigned char*)"SD2 ", io->stdOut); + } + if (val8&CT_BLOCK) { + McuShell_SendStr((unsigned char*)"BLOCK ", io->stdOut); + } + if (val8&CT_MMC) { + McuShell_SendStr((unsigned char*)"MMC ", io->stdOut); + } + if (val8&CT_SDC) { + McuShell_SendStr((unsigned char*)"SDC ", io->stdOut); + } + if (val8&CT_ATA) { + McuShell_SendStr((unsigned char*)"ATA ", io->stdOut); + } + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + } else { + McuShell_SendStr((unsigned char*)"ERROR\r\n", io->stdOut); + } + if (driverVersion==0) { /* only SPI cards implement this */ + McuShell_SendStatusStr((unsigned char*)"SDC version", (unsigned char*)"", io->stdOut); + if (disk_ioctl(driveNr, MMC_GET_SDC_VERSION, &val8)==RES_OK) { + if (val8==1) { + McuShell_SendStr((unsigned char*)"SDC ver 1.XX or MMC\r\n", io->stdOut); + } else if (val8==2) { + McuShell_SendStr((unsigned char*)"SDC ver 2.00\r\n", io->stdOut); + } else { + McuShell_SendStr((unsigned char*)"unknown\r\n", io->stdOut); + } + } else { + McuShell_SendStr((unsigned char*)"ERROR\r\n", io->stdOut); + } + } + McuShell_SendStatusStr((unsigned char*)"Sector count", (unsigned char*)"", io->stdOut); + if (disk_ioctl(driveNr, GET_SECTOR_COUNT, &val32)==RES_OK) { + McuUtility_Num32sToStr(buf, sizeof(buf), val32); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + } else { + McuShell_SendStr((unsigned char*)"ERROR\r\n", io->stdOut); + } + McuShell_SendStatusStr((unsigned char*)"Sector size", (unsigned char*)"", io->stdOut); + if (disk_ioctl(driveNr, GET_SECTOR_SIZE, &val16)==RES_OK) { + McuUtility_Num16sToStr(buf, sizeof(buf), val16); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + } else { + McuShell_SendStr((unsigned char*)"ERROR\r\n", io->stdOut); + } + McuShell_SendStatusStr((unsigned char*)"READ_BL_LEN", (unsigned char*)"", io->stdOut); + if (disk_ioctl(driveNr, MMC_GET_READ_BL_LEN, &val16)==RES_OK) { + McuUtility_Num16sToStr(buf, sizeof(buf), val16); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + } else { + McuShell_SendStr((unsigned char*)"ERROR\r\n", io->stdOut); + } + if (driverVersion==0) { /* only SPI cards implement this */ + McuShell_SendStatusStr((unsigned char*)"Block size", (unsigned char*)"", io->stdOut); + if (disk_ioctl(driveNr, GET_BLOCK_SIZE, &val32)==RES_OK) { + McuUtility_Num32sToStr(buf, sizeof(buf), val32); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + } else { + McuShell_SendStr((unsigned char*)"ERROR\r\n", io->stdOut); + } + McuShell_SendStatusStr((unsigned char*)"CSD", (unsigned char*)"", io->stdOut); + if (disk_ioctl(driveNr, MMC_GET_CSD, &buff[0])==RES_OK) { + for(val8=0; val8<16; val8++) { + buf[0] = '\0'; + McuUtility_strcatNum8Hex(buf, sizeof(buf), (uint8_t)buff[val8]); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)" ", io->stdOut); + } + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + } else { + McuShell_SendStr((unsigned char*)"ERROR\r\n", io->stdOut); + } + McuShell_SendStatusStr((unsigned char*)"CID", (unsigned char*)"", io->stdOut); + if (disk_ioctl(driveNr, MMC_GET_CID, &buff[0])==RES_OK) { + for(val8=0; val8<16; val8++) { + buf[0] = '\0'; + McuUtility_strcatNum8Hex(buf, sizeof(buf), (uint8_t)buff[val8]); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)" ", io->stdOut); + } + McuShell_SendStr((unsigned char*)"\r\n Manufacturer ", io->stdOut); + for(val8=3; val8<=8; val8++) { + io->stdOut(buff[val8]); + } + McuShell_SendStr((unsigned char*)"\r\n Serial Number ", io->stdOut); + buf[0] = '\0'; + McuUtility_strcatNum32Hex(buf, sizeof(buf), (uint32_t)((buff[0xa]<<24)|(buff[0xb]<<16)|(buff[0xc]<<8)|buff[0xd])); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + } else { + McuShell_SendStr((unsigned char*)"ERROR\r\n", io->stdOut); + } + McuShell_SendStatusStr((unsigned char*)"OCR", (unsigned char*)"", io->stdOut); + if (disk_ioctl(driveNr, MMC_GET_OCR, &buff[0])==RES_OK) { + for(val8=0; val8<4; val8++) { + buf[0] = '\0'; + McuUtility_strcatNum8Hex(buf, sizeof(buf), (uint8_t)buff[val8]); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)" ", io->stdOut); + } + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + } else { + McuShell_SendStr((unsigned char*)"ERROR\r\n", io->stdOut); + } + McuShell_SendStatusStr((unsigned char*)"SD Status", (unsigned char*)"", io->stdOut); + if (disk_ioctl(driveNr, MMC_GET_SDSTAT, &buff[0])==RES_OK) { + for(val8=0; val8<64; val8++) { + buf[0] = '\0'; + if (val8!=0 && (val8%16)==0) { /* new line to make things readable */ + McuShell_SendStr((unsigned char*)"\r\n ", io->stdOut); + } + McuUtility_strcatNum8Hex(buf, sizeof(buf), (uint8_t)buff[val8]); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)" ", io->stdOut); + } + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + } else { + McuShell_SendStr((unsigned char*)"ERROR\r\n", io->stdOut); + } + } + if (driverVersion==1) { /* only LLD_SDHD cards implement this */ + buff[1] = sizeof(buf)-2; /* size of buffer */ + buff[0] = MMC_GET_LLD_CMD_HIGH_CAPACITY; /* cmd */ + if (disk_ioctl(driveNr, MMC_GET_LLD_INFO, &buff[0])==RES_OK) { + McuShell_SendStatusStr((unsigned char*)"High capacity", (unsigned char*)(buff[2]!=0?"yes\r\n":"no\r\n"), io->stdOut); + } + buff[0] = MMC_GET_LLD_CMD_HIGH_SPEED; /* cmd */ + if (disk_ioctl(driveNr, MMC_GET_LLD_INFO, &buff[0])==RES_OK) { + McuShell_SendStatusStr((unsigned char*)"High speed", (unsigned char*)(buff[2]!=0?"yes\r\n":"no\r\n"), io->stdOut); + } + buff[0] = MMC_GET_LLD_CMD_LOW_VOLTAGE; /* cmd */ + if (disk_ioctl(driveNr, MMC_GET_LLD_INFO, &buff[0])==RES_OK) { + McuShell_SendStatusStr((unsigned char*)"Low voltage", (unsigned char*)(buff[2]!=0?"yes\r\n":"no\r\n"), io->stdOut); + } + buff[0] = MMC_GET_LLD_CMD_DATA_WIDTHS; /* cmd */ + if (disk_ioctl(driveNr, MMC_GET_LLD_INFO, &buff[0])==RES_OK) { + McuShell_SendStatusStr((unsigned char*)"Data widths", (unsigned char*)"", io->stdOut); + if (buff[2]&0x1) { + McuShell_SendStr((unsigned char*)"1 ", io->stdOut); + } + if (buff[2]&0x2) { + McuShell_SendStr((unsigned char*)"4 ", io->stdOut); + } + if (buff[2]&0x4) { + McuShell_SendStr((unsigned char*)"8 ", io->stdOut); + } + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + } + buff[0] = MMC_GET_LLD_CMD_OPERATIONS; /* cmd */ + if (disk_ioctl(driveNr, MMC_GET_LLD_INFO, &buff[0])==RES_OK) { + McuShell_SendStatusStr((unsigned char*)"Operations", (unsigned char*)"", io->stdOut); + if (buff[2]&0x1) { + McuShell_SendStr((unsigned char*)"BlockRead ", io->stdOut); + } + if (buff[2]&0x2) { + McuShell_SendStr((unsigned char*)"BlockWrite ", io->stdOut); + } + if (buff[2]&0x4) { + McuShell_SendStr((unsigned char*)"BlockErase ", io->stdOut); + } + if (buff[2]&0x8) { + McuShell_SendStr((unsigned char*)"WriteProtect ", io->stdOut); + } + if (buff[2]&0x10) { + McuShell_SendStr((unsigned char*)"I/O ", io->stdOut); + } + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + } + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : Benchmark (component FAT_FileSystem) +** +** Description : +** Performs a disk benchmark +** Parameters : +** NAME - DESCRIPTION +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ +/*! \brief Simple benchmark function: first we are going to write a file, then we will copy it */ +uint8_t McuFatFS_Benchmark(const McuShell_StdIOType *io) +{ + static FIL fp; + uint16_t i; + UINT bw; + uint8_t read_buf[10]; + TIMEREC time, startTime; + int32_t start_mseconds, mseconds; + + if (McuFatFS_isWriteProtected((uint8_t*)McuFatFS_CONFIG_DEFAULT_DRIVE_STRING)) { + McuShell_SendStr((unsigned char*)"disk is write protected!\r\n", io->stdErr); + return ERR_FAILED; + } + /* write benchmark */ + McuShell_SendStr((const unsigned char*)"Benchmark: write/copy/read a 100kB file:\r\n", io->stdOut); + McuShell_SendStr((const unsigned char*)"Delete existing benchmark files...\r\n", io->stdOut); + (void)McuFatFS_DeleteFile((const unsigned char*)"./bench.txt", io); + (void)McuFatFS_DeleteFile((const unsigned char*)"./copy.txt", io); + + McuShell_SendStr((const unsigned char*)"Create benchmark file...\r\n", io->stdOut); + (void)McuTimeDate_GetTime(&startTime); + if (McuFatFS_open(&fp, (const TCHAR*)"./bench.txt", FA_CREATE_ALWAYS|FA_WRITE)!=FR_OK) { + McuShell_SendStr((const unsigned char*)"*** Failed opening benchmark file!\r\n", io->stdErr); + return ERR_FAILED; + } + for(i=0;i<10240;i++) { + if (McuFatFS_write(&fp, "benchmark ", sizeof("benchmark ")-1, &bw)!=FR_OK) { + McuShell_SendStr((const unsigned char*)"*** Failed writing file!\r\n", io->stdErr); + (void)McuFatFS_close(&fp); + return ERR_FAILED; + } + } + (void)McuFatFS_close(&fp); + (void)McuTimeDate_GetTime(&time); + start_mseconds = startTime.Hour*60*60*1000 + startTime.Min*60*1000 + startTime.Sec*1000 +#if McuTimeDate_HAS_SEC100_IN_TIMEREC + + startTime.Sec100*10 +#endif + ; + mseconds = time.Hour*60*60*1000 + time.Min*60*1000 + time.Sec*1000 +#if McuTimeDate_HAS_SEC100_IN_TIMEREC + + time.Sec100*10 +#endif + - start_mseconds; + McuShell_SendNum32s(mseconds, io->stdOut); + McuShell_SendStr((const unsigned char*)" ms for writing (", io->stdOut); + McuShell_SendNum32s((100*1000)/mseconds, io->stdOut); + McuShell_SendStr((const unsigned char*)" kB/s)\r\n", io->stdOut); + + /* read benchmark */ + McuShell_SendStr((const unsigned char*)"Read 100kB benchmark file...\r\n", io->stdOut); + (void)McuTimeDate_GetTime(&startTime); + if (McuFatFS_open(&fp, (const TCHAR*)"./bench.txt", FA_READ)!=FR_OK) { + McuShell_SendStr((const unsigned char*)"*** Failed opening benchmark file!\r\n", io->stdErr); + return ERR_FAILED; + } + for(i=0;i<10240;i++) { + if (McuFatFS_read(&fp, &read_buf[0], sizeof(read_buf), &bw)!=FR_OK) { + McuShell_SendStr((const unsigned char*)"*** Failed reading file!\r\n", io->stdErr); + (void)McuFatFS_close(&fp); + return ERR_FAILED; + } + } + (void)McuFatFS_close(&fp); + (void)McuTimeDate_GetTime(&time); + start_mseconds = startTime.Hour*60*60*1000 + startTime.Min*60*1000 + startTime.Sec*1000 +#if McuTimeDate_HAS_SEC100_IN_TIMEREC + + startTime.Sec100*10 +#endif + ; + mseconds = time.Hour*60*60*1000 + time.Min*60*1000 + time.Sec*1000 +#if McuTimeDate_HAS_SEC100_IN_TIMEREC + + time.Sec100*10 +#endif + - start_mseconds; + McuShell_SendNum32s(mseconds, io->stdOut); + McuShell_SendStr((const unsigned char*)" ms for reading (", io->stdOut); + McuShell_SendNum32s((100*1000)/mseconds, io->stdOut); + McuShell_SendStr((const unsigned char*)" kB/s)\r\n", io->stdOut); + + /* copy benchmark */ + McuShell_SendStr((const unsigned char*)"Copy 100kB file...\r\n", io->stdOut); + (void)McuTimeDate_GetTime(&startTime); + (void)McuFatFS_CopyFile((const unsigned char*)"./bench.txt", (const unsigned char*)"./copy.txt", io); + (void)McuTimeDate_GetTime(&time); + start_mseconds = startTime.Hour*60*60*1000 + startTime.Min*60*1000 + startTime.Sec*1000 +#if McuTimeDate_HAS_SEC100_IN_TIMEREC + + startTime.Sec100*10 +#endif + ; + mseconds = time.Hour*60*60*1000 + time.Min*60*1000 + time.Sec*1000 +#if McuTimeDate_HAS_SEC100_IN_TIMEREC + + time.Sec100*10 +#endif + - start_mseconds; + McuShell_SendNum32s(mseconds, io->stdOut); + McuShell_SendStr((const unsigned char*)" ms for copy (", io->stdOut); + McuShell_SendNum32s((100*1000)/mseconds, io->stdOut); + McuShell_SendStr((const unsigned char*)" kB/s)\r\n", io->stdOut); + McuShell_SendStr((const unsigned char*)"done!\r\n", io->stdOut); + return ERR_OK; +} + +/* +** =================================================================== +** Method : f_getlabel (component FAT_FileSystem) +** +** Description : +** Get volume label +** Parameters : +** NAME - DESCRIPTION +** * path - Pointer to path name of the logical +** drive number +** * label - Pointer to a buffer to return the +** volume label +** vsn - +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_f_getlabel(const TCHAR* path, TCHAR* label, DWORD* vsn) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : f_setlabel (component FAT_FileSystem) +** +** Description : +** Set Volume Label +** Parameters : +** NAME - DESCRIPTION +** * label - Pointer to the volume label to set +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_f_setlabel(const TCHAR* label) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : f_expand (component FAT_FileSystem) +** +** Description : +** Allocate a Contiguous Blocks to the File +** Parameters : +** NAME - DESCRIPTION +** * fp - Pointer to the file object +** fsz - File size to be expanded to +** opt - Operation mode 0:Find and prepare or 1: +** Find and allocate +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_f_expand(FIL* fp, FSIZE_t fsz, BYTE opt) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : f_findfirst (component FAT_FileSystem) +** +** Description : +** Find FirstFile +** Parameters : +** NAME - DESCRIPTION +** dp - Pointer to the open directory object +** fno - Pointer to the file information structure +** path - Pointer to the directory to open +** pattern - Pointer to the matching pattern +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_f_findfirst(DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : f_findnext (component FAT_FileSystem) +** +** Description : +** Find Next File +** Parameters : +** NAME - DESCRIPTION +** dp - Pointer to the open directory object +** fno - Pointer to the file information structure +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_f_findnext(DIR* dp, FILINFO* fno) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : f_opendir (component FAT_FileSystem) +** +** Description : +** Open a directory +** Parameters : +** NAME - DESCRIPTION +** dp - Pointer to the open directory object +** path - path of directory +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_f_opendir(DIR* dp, const TCHAR* path) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : f_closedir (component FAT_FileSystem) +** +** Description : +** Close a directory +** Parameters : +** NAME - DESCRIPTION +** dp - Pointer to the open directory object +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_f_closedir(DIR* dp) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : f_readdir (component FAT_FileSystem) +** +** Description : +** Read a directory item +** Parameters : +** NAME - DESCRIPTION +** dir - Pointer to the open directory object +** fno - Pointer to the file information structure +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +FRESULT McuFatFS_f_readdir(DIR *dj, FILINFO *fno) +{ + *** method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : StrToDriveNumber (component FAT_FileSystem) +** +** Description : +** Transforms a drive string ("0:/") into a drive number (0) +** Parameters : +** NAME - DESCRIPTION +** * drvStr - Pointer to drive string, e.g. "0:/" +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuFatFS_StrToDriveNumber(uint8_t *drvStr) +{ + uint8_t drv = 0; + const unsigned char *p; + + if (drvStr==NULL || *drvStr=='\0') { /* default, "" */ + drv = 0; + } else { + p = drvStr; + if (McuUtility_ScanDecimal8uNumber(&p, &drv)!=ERR_OK) { /* "0", "1", ... */ + drv = 0; /* error, use default number */ + } + } + return drv; +} + +/* END McuFatFS. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/McuFatFS.h b/TSM_PicoW_Sensor/McuLib/FatFS/McuFatFS.h new file mode 100644 index 0000000..71b50c6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/McuFatFS.h @@ -0,0 +1,1366 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFatFS.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : FAT_FileSystem +** Version : Component 01.214, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2021-05-13, 11:07, # CodeGen: 738 +** Abstract : +** +** Settings : +** Component name : McuFatFS +** FatFs Version : R0.12 (Patch 3, 29-April-2016) +** Tiny : no +** Volumes : 1 +** Drives : 1 +** Drive0 : SDCard +** FS_MINIMIZE : 0 +** Maximum Sector Size : 512 +** Relative Path : Enabled with f_getcwd() +** Code Page : U.S. (OEM) +** File Sharing : 0 +** Multipartion : no +** Fast Seek : yes +** Use Find : Disable (0) +** String Functions : enable +** LFN : Long File Name Support +** Use LFN : Disable +** exFAT : no +** Max LFN Length : 255 +** LFN Unicode : no +** Write enabled : Enabled +** Use TimeDate : Enabled +** Realtime clock : McuTimeDate +** Reentrant : Enabled +** Timeout ticks : 1000 +** Handle : HANDLE +** User Sync Functions : no +** RTOS : Enabled +** RTOS : McuRTOS +** Use dynamic heap : yes +** Utility : McuUtility +** Wait : McuWait +** SDK : McuLib +** Shell : Enabled +** Shell : McuShell +** Card Insert Delay (ms) : 100 +** File print buffer size : 32 +** File copy buffer size : 32 +** Contents : +** open - FRESULT McuFatFS_open(FIL *fp, const XCHAR *path, BYTE mode); +** close - FRESULT McuFatFS_close(FIL *fp); +** read - FRESULT McuFatFS_read(FIL *fp, void *buff, UINT btr, UINT *br); +** write - FRESULT McuFatFS_write(FIL *fp, const *void buff, UINT btw, UINT *bw); +** opendir - FRESULT McuFatFS_opendir(DIR *dj, const XCHAR *path); +** readdir - FRESULT McuFatFS_readdir(DIR *dj, FILINFO *fno); +** lseek - FRESULT McuFatFS_lseek(FIL *fp, DWORD ofs); +** unlink - FRESULT McuFatFS_unlink(const XCHAR *path); +** mount - FRESULT McuFatFS_mount(FATFS *fs, const TCHAR* path, byte opt); +** getfree - FRESULT McuFatFS_getfree(const XCHAR *path, dword *nclst, FATFS **fatfs); +** sync - FRESULT McuFatFS_sync(FIL *fp); +** rename - FRESULT McuFatFS_rename(const XCHAR *path_old, const XCHAR *path_new); +** isWriteProtected - bool McuFatFS_isWriteProtected(uint8_t *drvStr); +** isDiskPresent - bool McuFatFS_isDiskPresent(uint8_t *drvStr); +** mkdir - FRESULT McuFatFS_mkdir(const XCHAR *path); +** chmod - FRESULT McuFatFS_chmod(const TCHAR* FileName, uint8_t Attribute, uint8_t... +** truncate - FRESULT McuFatFS_truncate(FIL *FileObject); +** stat - FRESULT McuFatFS_stat(const TCHAR* FileName, FILINFO* FileInfo); +** utime - FRESULT McuFatFS_utime(const TCHAR* FileName, const FILINFO* TimeDate); +** mkfs - FRESULT McuFatFS_mkfs(byte drive, uint8_t PartitioningRule, UINT AllocSize); +** chdir - FRESULT McuFatFS_chdir(const TCHAR* Path); +** chdrive - FRESULT McuFatFS_chdrive(uint8_t Drive); +** getcwd - FRESULT McuFatFS_getcwd(TCHAR* Buffer, UINT BufferLen); +** errFResultMsg - char* McuFatFS_errFResultMsg(int errNo); +** errDResultMsg - char* McuFatFS_errDResultMsg(int errNo); +** f_gets - McuFatFS_CHARP McuFatFS_f_gets(TCHAR* buff, int len, FIL *fil); +** f_puts - McuFatFS_INT McuFatFS_f_puts(const TCHAR* str, FIL *fil); +** f_putc - McuFatFS_INT McuFatFS_f_putc(TCHAR c, FIL *fil); +** f_printf - McuFatFS_INT McuFatFS_f_printf(FIL* fil, const TCHAR* str, ...); +** f_eof - byte McuFatFS_f_eof(FIL *fil); +** f_error - uint8_t McuFatFS_f_error(FIL *fil); +** f_tell - dword McuFatFS_f_tell(FIL *fil); +** f_size - dword McuFatFS_f_size(FIL *fil); +** f_getlabel - FRESULT McuFatFS_f_getlabel(const TCHAR* path, TCHAR* label, DWORD* vsn); +** f_setlabel - FRESULT McuFatFS_f_setlabel(const TCHAR* label); +** f_expand - FRESULT McuFatFS_f_expand(FIL* fp, FSIZE_t fsz, BYTE opt); +** f_findfirst - FRESULT McuFatFS_f_findfirst(DIR* dp, FILINFO* fno, const TCHAR* path, const... +** f_findnext - FRESULT McuFatFS_f_findnext(DIR* dp, FILINFO* fno); +** f_opendir - FRESULT McuFatFS_f_opendir(DIR* dp, const TCHAR* path); +** f_readdir - FRESULT McuFatFS_f_readdir(DIR *dj, FILINFO *fno); +** f_closedir - FRESULT McuFatFS_f_closedir(DIR* dp); +** get_fattime - uint32_t McuFatFS_get_fattime(void); +** ParseCommand - uint8_t McuFatFS_ParseCommand(const unsigned char *cmd, bool *handled, const... +** StrToDriveNumber - uint8_t McuFatFS_StrToDriveNumber(uint8_t *drvStr); +** CheckCardPresence - uint8_t McuFatFS_CheckCardPresence(bool *cardMounted, uint8_t *drive, FATFS... +** MountFileSystem - uint8_t McuFatFS_MountFileSystem(FATFS *fileSystemObject, uint8_t... +** UnMountFileSystem - uint8_t McuFatFS_UnMountFileSystem(uint8_t *logicalDrive, const... +** PrintDirectory - uint8_t McuFatFS_PrintDirectory(const uint8_t *dirName, const... +** CopyFile - uint8_t McuFatFS_CopyFile(const uint8_t*srcFileName, const uint8_t... +** DeleteFile - uint8_t McuFatFS_DeleteFile(const uint8_t *fileName, const... +** CreateFile - uint8_t McuFatFS_CreateFile(const uint8_t *fileName, const... +** PrintFile - uint8_t McuFatFS_PrintFile(const uint8_t *fileName, const... +** PrintHexFile - uint8_t McuFatFS_PrintHexFile(const uint8_t *fileName, const... +** MakeDirectory - uint8_t McuFatFS_MakeDirectory(const uint8_t *dirName, const... +** ChangeDirectory - uint8_t McuFatFS_ChangeDirectory(const uint8_t *dirName, const... +** RenameFile - uint8_t McuFatFS_RenameFile(const uint8_t *srcFileName, const uint8_t... +** PrintSector - uint8_t McuFatFS_PrintSector(uint8_t drive, uint32_t sectorNo, const... +** PrintDiskInfo - uint8_t McuFatFS_PrintDiskInfo(uint8_t *drive, const... +** Benchmark - uint8_t McuFatFS_Benchmark(const %@Shell@'ModuleName'%.StdIOType *io); +** Deinit - uint8_t McuFatFS_Deinit(void); +** Init - uint8_t McuFatFS_Init(void); +** +** Copyright (c) 2014-2021, Erich Styger +** Web: http://mcuoneclipse.com/ +** SourceForge: https://sourceforge.net/projects/mcuoneclipse +** Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** - Redistributions of source code must retain the above copyright notice, this list +** of conditions and the following disclaimer. +** - Redistributions in binary form must reproduce the above copyright notice, this +** list of conditions and the following disclaimer in the documentation and/or +** other materials provided with the distribution. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFatFS.h +** @version 01.00 +** @brief +** +*/ +/*! +** @addtogroup McuFatFS_module McuFatFS module documentation +** @{ +*/ + +#ifndef __McuFatFS_H +#define __McuFatFS_H + +/* MODULE McuFatFS. */ + +#include "McuLib.h" /* SDK and API used */ +#include "McuFatFSconfig.h" /* configuration */ + +/* Wrappers to FatFS types and constants */ +#define McuFatFS_FATFS FATFS +#define McuFatFS_DIR DIR +#define McuFatFS_FIL FIL +#define McuFatFS_FILINFO FILINFO +#define McuFatFS_FRESULT FRESULT +#define McuFatFS_DRESULT DRESULT +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT + #define McuFatFS_USE_LFN _USE_LFN + #define McuFatFS_MAX_LFN _MAX_LFN + #define McuFatFS_MAX_SS _MAX_SS + #define McuFatFS_FS_RPATH _FS_RPATH + #define McuFatFS_FS_READONLY _FS_READONLY + #define McuFatFS_FS_REENTRANT _FS_REENTRANT + #define McuFatFS_SYNC_t _SYNC_t + #define McuFatFS_FS_TIMEOUT _FS_TIMEOUT + #define McuFatFS_VOLUMES _VOLUMES +#else /* use newer defines in NXP SDK and FatFS */ + #define McuFatFS_USE_LFN FF_USE_LFN + #define McuFatFS_MAX_LFN FF_MAX_LFN + #define McuFatFS_MAX_SS FF_MAX_SS + #define McuFatFS_FS_RPATH FF_FS_RPATH + #define McuFatFS_FS_READONLY FF_FS_READONLY + #define McuFatFS_FS_REENTRANT FF_FS_REENTRANT + #define McuFatFS_SYNC_t FF_SYNC_t + #define McuFatFS_FS_TIMEOUT FF_FS_TIMEOUT + #define McuFatFS_VOLUMES FF_VOLUMES +#endif + +/* prototypes for application callbacks */ +extern bool McuFatFS_CONFIG_IS_DISK_PRESENT_CALLBACK(uint8_t *drvStr); +extern bool McuFatFS_CONFIG_IS_WRITE_PROTECTED_CALLBACK(uint8_t *drvStr); + +#if McuFatFS_CONFIG_SHELL_ENABLED + #include "McuShell.h" +#endif +#include "McuUtility.h" +#include "McuWait.h" +#include "McuTimeDate.h" + +#include "McuRTOS.h" + +#include "ff.h" +#include "diskio.h" + + + +#ifndef __BWUserType_McuFatFS_CHARP +#define __BWUserType_McuFatFS_CHARP + typedef char * McuFatFS_CHARP; /* alias to a char pointer */ +#endif +#ifndef __BWUserType_McuFatFS_INT +#define __BWUserType_McuFatFS_INT + typedef int McuFatFS_INT; /* alias to int type. */ +#endif + +#define McuFatFS_PARSE_COMMAND_ENABLED McuFatFS_CONFIG_SHELL_ENABLED /* set to 1 if method ParseCommand() is present, 0 otherwise */ + +#define McuFatFS_USE_RTOS_DYNAMIC_MEMORY (1 && configSUPPORT_DYNAMIC_ALLOCATION) /* 1: use RTOS dynamic memory allocation, 0: use static memory */ + + + +#define McuFatFS_open(fp, path, mode) \ + f_open(fp, path, mode) +/* +** =================================================================== +** Method : open (component FAT_FileSystem) +** +** Description : +** Open/Create a file +** Parameters : +** NAME - DESCRIPTION +** fp - Pointer to the blank file object structure +** path - Pointer to a null-terminated string that +** specifies the file name to create or open. +** mode - Specifies the type of access and open +** method for the file. It is specified by a +** combination of following flags. +** FA_READ: Specifies read access to the +** object. Data can be read from the file. +** Combine with FA_WRITE for read-write access. +** FA_WRITE: Specifies write access to the +** object. Data can be written to the file. +** Combine with FA_READ for read-write access. +** FA_OPEN_EXISTING: Opens the file. The +** function fails if the file is not existing. +** (Default) +** FA_OPEN_ALWAYS: Opens the file if it is +** existing. If not, a new file is created. To +** append data to the file, use f_lseek +** function after file open in this method. +** FA_CREATE_NEW: Creates a new file. The +** function fails if the file is already +** existing. +** FA_CREATE_ALWAYS: Creates a new file. If +** the file is existing, it is truncated and +** overwritten. +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_close(fp) \ + f_close(fp) + +/* +** =================================================================== +** Method : close (component FAT_FileSystem) +** +** Description : +** Close a file +** Parameters : +** NAME - DESCRIPTION +** fp - Pointer to the open file object structure to +** be closed. +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_read(fp, buff, btr, br) \ + f_read(fp, buff, btr, br) + +/* +** =================================================================== +** Method : read (component FAT_FileSystem) +** +** Description : +** Read file +** Parameters : +** NAME - DESCRIPTION +** fp - Pointer to the file object +** buff - Pointer to the data buffer +** btr - Number of bytes to read +** br - Pointer to the number of bytes read +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_write(fp, buff, btw, bw) \ + f_write(fp, buff, btw, bw) + +/* +** =================================================================== +** Method : write (component FAT_FileSystem) +** +** Description : +** Write to a file +** Parameters : +** NAME - DESCRIPTION +** fp - Pointer to the file object structure +** buff - Pointer to the data to be written +** btw - Number of bytes to write +** bw - Pointer to the variable to return number of +** bytes written +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_opendir(dj, path) \ + f_opendir(dj, path) + +/* +** =================================================================== +** Method : opendir (component FAT_FileSystem) +** +** Description : +** Open a directory +** Parameters : +** NAME - DESCRIPTION +** dj - Pointer to the blank directory object to be +** created. +** path - Pointer to the null-terminated string +** that specifies the directory name to be +** opened. +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_readdir(dj, fno) \ + f_readdir(dj, fno) + +/* +** =================================================================== +** Method : readdir (component FAT_FileSystem) +** +** Description : +** Read a directory item +** Parameters : +** NAME - DESCRIPTION +** dir - Pointer to the open directory object +** fno - Pointer to the file information structure +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_lseek(fp, ofs) \ + f_lseek(fp, ofs) + +/* +** =================================================================== +** Method : lseek (component FAT_FileSystem) +** +** Description : +** The f_lseek function moves the file read/write pointer of an +** open file object. It can also be used to increase the file +** size (cluster pre-allocation). +** Parameters : +** NAME - DESCRIPTION +** fp - Pointer to the file object +** ofs - File pointer from top of file +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_unlink(path) \ + f_unlink(path) + +/* +** =================================================================== +** Method : unlink (component FAT_FileSystem) +** +** Description : +** Remove a file or directory +** Parameters : +** NAME - DESCRIPTION +** path - Pointer to the object name +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_mount(fs, path, opt) \ + f_mount(fs, path, opt) + +/* +** =================================================================== +** Method : mount (component FAT_FileSystem) +** +** Description : +** Mount/unmount a logical drive +** Parameters : +** NAME - DESCRIPTION +** fs - pointer to the new file system object (NULL +** for unmount) +** * path - Logical drive number to be +** mounted/unmounted +** opt - options: 0:Do not mount (delayed mount), 1: +** Mount immediately +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_getfree(path, nclst, fs) f_getfree(path, nclst, fs) +/* +** =================================================================== +** Method : getfree (component FAT_FileSystem) +** +** Description : +** Get Number of Free Clusters +** Parameters : +** NAME - DESCRIPTION +** path - Pointer to the logical drive number +** (root dir) +** * nclst - Pointer to the variable to return +** number of free clusters +** fatfs - Pointer to pointer to file system +** object +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_sync(fp) \ + f_sync(fp) + +/* +** =================================================================== +** Method : sync (component FAT_FileSystem) +** +** Description : +** Flush cached data of a writing file +** Parameters : +** NAME - DESCRIPTION +** fp - Pointer to the file object +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_rename(path_old, path_new) \ + f_rename(path_old, path_new) +/* +** =================================================================== +** Method : rename (component FAT_FileSystem) +** +** Description : +** Delete a file or directory +** Parameters : +** NAME - DESCRIPTION +** path_old - Pointer to old object name +** path_new - Pointer to new object name +** Returns : +** --- - Error code +** =================================================================== +*/ + +bool McuFatFS_isWriteProtected(uint8_t *drvStr); + +/* +** =================================================================== +** Method : isWriteProtected (component FAT_FileSystem) +** +** Description : +** Determines if the file system is write protected. +** Parameters : +** NAME - DESCRIPTION +** * drvStr - Pointer to drive string, e.g. "" or +** "0" +** Returns : +** --- - TRUE if file system is write protected +** =================================================================== +*/ + +#define McuFatFS_mkdir(path) \ + f_mkdir(path) +/* +** =================================================================== +** Method : mkdir (component FAT_FileSystem) +** +** Description : +** Creates a directory +** Parameters : +** NAME - DESCRIPTION +** path - Name of directory to be created +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_chmod(FileName, Attribute, AttributeMask) \ + f_chmod(FileName, Attribute, AttributeMask) + +/* +** =================================================================== +** Method : chmod (component FAT_FileSystem) +** +** Description : +** Changes the attribute of a file or directory +** Following attribute flags to be set in one or more +** combination of the following flags. The specified flags are +** set and others are cleared. +** AM_RDO Read only +** AM_ARC Archive +** AM_SYS System +** AM_HID Hidden +** Parameters : +** NAME - DESCRIPTION +** FileName - Pointer to the file or directory +** Attribute - Attribute flags. Attribute +** flags to be set in one or more combination +** of the following flags. The specified flags +** are set and others are cleard. +** AttributeMask - Attribute mask. +** Attribute mask that specifies which +** attribute is changed. The specified +** aattributes are set or cleard. +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_truncate(FILP) \ + f_truncate(FILP) + +/* +** =================================================================== +** Method : truncate (component FAT_FileSystem) +** +** Description : +** Truncates the file size. +** The truncate() function truncates the file size to the +** current file read/write point. This function has no effect +** if the file read/write pointer is already pointing end of +** the file. +** Parameters : +** NAME - DESCRIPTION +** * FileObject - Pointer to the file object +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_stat(FileName, FileInfo) \ + f_stat(FileName, FileInfo) + +/* +** =================================================================== +** Method : stat (component FAT_FileSystem) +** +** Description : +** The f_stat gets the information of a file or directory. For +** details of the infomation, refer to the FILINFO structure +** and f_readdir function. This function is not supported in +** minimization level of >= 1. +** Parameters : +** NAME - DESCRIPTION +** FileName - Pointer to the file or directory +** path +** * FileInfo - Pointer to the FILINFO structure +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_utime(FileName, TimeDate) \ + f_utime(FileName, TimeDate) + +/* +** =================================================================== +** Method : utime (component FAT_FileSystem) +** +** Description : +** The f_utime function changes the timestamp of a file or +** directory +** Parameters : +** NAME - DESCRIPTION +** * FileName - Pointer to the file or directory +** path +** * TimeDate - Pointer to time and data to be +** set +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_mkfs(drive, PartitioningRule, AllocSize) \ + f_mkfs(drive, PartitioningRule, AllocSize) + +/* +** =================================================================== +** Method : mkfs (component FAT_FileSystem) +** +** Description : +** The f_mkfs fucntion creates a file system on the drive. +** Parameters : +** NAME - DESCRIPTION +** drive - Logical drive number +** PartitioningRule - When 0 is given, +** a partition table is created into the +** master boot record and a primary DOS +** partition is created and then an FAT volume +** is created on the partition. This is called +** FDISK format and used for harddisk and +** memory cards. When 1 is given, the FAT +** volume starts from the first sector on the +** drive without partition table. This is +** called SFD format and used for floppy disk +** and most optical disk +** AllocSize - Size of the allocation unit. +** Force the allocation unit (cluster) size in +** unit of byte. The value must be power of 2 +** and between the sector size and 128 times +** sector size. When invalid value is +** specified, the cluster size is determined +** depends on the volume size. +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_chdir(Path) \ + f_chdir(Path) + +/* +** =================================================================== +** Method : chdir (component FAT_FileSystem) +** +** Description : +** The f_chdir function changes the current directory of the +** logical drive. The current directory of a drive is +** initialized to the root directory when the drive is +** auto-mounted. Note that the current directory is retained in +** the each file system object so that it also affects other +** tasks that using the drive. +** Parameters : +** NAME - DESCRIPTION +** Path - Pointer to the path name +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_chdrive(Drive) \ + f_chdrive(Drive) + +/* +** =================================================================== +** Method : chdrive (component FAT_FileSystem) +** +** Description : +** The f_chdrive function changes the current drive. The +** initial value of the current drive number is 0. Note that +** the current drive is retained in a static variable so that +** it also affects other tasks that using the file functions. +** Parameters : +** NAME - DESCRIPTION +** Drive - Logical drive number +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_getcwd(Buffer, BufferLen) \ + f_getcwd(Buffer, BufferLen) + +/* +** =================================================================== +** Method : getcwd (component FAT_FileSystem) +** +** Description : +** The f_getcwd function retrieves the current directory of the +** current drive in full path string including drive number. +** Parameters : +** NAME - DESCRIPTION +** Buffer - Pointer to the buffer to receive the +** current directory string. +** BufferLen - Size of the buffer in unit of +** TCHAR. +** Returns : +** --- - Error code +** =================================================================== +*/ + +char* McuFatFS_errFResultMsg(int errNo); +/* +** =================================================================== +** Method : errFResultMsg (component FAT_FileSystem) +** +** Description : +** Returns for a given FatFs FRESULT error code a string +** Parameters : +** NAME - DESCRIPTION +** errNo - FatFs error code +** Returns : +** --- - Error code +** =================================================================== +*/ + +char* McuFatFS_errDResultMsg(int errNo); +/* +** =================================================================== +** Method : errDResultMsg (component FAT_FileSystem) +** +** Description : +** Returns for a given FatFs DRESULT error code a string +** Parameters : +** NAME - DESCRIPTION +** errNo - FatFs error code +** Returns : +** --- - Error code +** =================================================================== +*/ + +bool McuFatFS_isDiskPresent(uint8_t *drvStr); + +/* +** =================================================================== +** Method : isDiskPresent (component FAT_FileSystem) +** +** Description : +** Determines if the disk is present or not (e.g. disk inserted). +** Parameters : +** NAME - DESCRIPTION +** * drvStr - drive string, "" or "0" or "1" +** Returns : +** --- - TRUE if file system is write protected +** =================================================================== +*/ + +#define McuFatFS_f_gets(buff, len, fil) \ + f_gets(buff,len,fil) + +/* +** =================================================================== +** Method : f_gets (component FAT_FileSystem) +** +** Description : +** Get a string from the file +** Parameters : +** NAME - DESCRIPTION +** * buff - Pointer to the string buffer to read +** len - Size of string buffer (characters) +** fil - Pointer to the file object +** Returns : +** --- - zero (NULL) if failed, otherwise a string +** to the buffer is returned. +** =================================================================== +*/ + +#define McuFatFS_f_puts(str, fil) \ + f_puts(str, fil) + +/* +** =================================================================== +** Method : f_puts (component FAT_FileSystem) +** +** Description : +** Put a string to the file +** Parameters : +** NAME - DESCRIPTION +** * buff - A character to be output +** fil - Pointer to the file object +** Returns : +** --- - number of characters written. +** =================================================================== +*/ + +#define McuFatFS_f_putc(c, fil) \ + f_putc(c, fil) + +/* +** =================================================================== +** Method : f_putc (component FAT_FileSystem) +** +** Description : +** Put a character to the file +** Parameters : +** NAME - DESCRIPTION +** * buff - A character to be output +** fil - Pointer to the file object +** Returns : +** --- - 1 if ok, EOF otherwise +** =================================================================== +*/ + +#define McuFatFS_f_printf \ + f_printf + +/* +** =================================================================== +** Method : f_printf (component FAT_FileSystem) +** +** Description : +** Put a formatted string to the file +** Parameters : +** NAME - DESCRIPTION +** Variable_1 - Pointer to the file object +** str - Pointer to the format string +** Variable_2 - Optional arguments... +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_f_eof(fp) \ + f_eof(fp) + +/* +** =================================================================== +** Method : f_eof (component FAT_FileSystem) +** +** Description : +** Wrapper to to the f_eof() macro. Returns 1 if at the end of +** the file, 0 otherwise. +** Parameters : +** NAME - DESCRIPTION +** * fp - Pointer to file object +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_f_error(fp) \ + f_error(fp) + +/* +** =================================================================== +** Method : f_error (component FAT_FileSystem) +** +** Description : +** Wrapper to to the f_eof() macro. Returns 1 if at the end of +** the file, 0 otherwise. +** Parameters : +** NAME - DESCRIPTION +** * fp - Pointer to file object +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_f_tell(fp) \ + f_tell(fp) + +/* +** =================================================================== +** Method : f_tell (component FAT_FileSystem) +** +** Description : +** Wrapper to to the f_tell() macro. Returns the file +** read/write pointer (0 on file open). +** Parameters : +** NAME - DESCRIPTION +** * fp - Pointer to file object +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_f_size(fp) \ + f_size(fp) + +/* +** =================================================================== +** Method : f_size (component FAT_FileSystem) +** +** Description : +** Wrapper to to the f_size() macro. Returns the file size. +** Parameters : +** NAME - DESCRIPTION +** * fp - Pointer to file object +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFatFS_Init(void); +/* +** =================================================================== +** Method : Init (component FAT_FileSystem) +** +** Description : +** Initializes the device driver. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFatFS_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component FAT_FileSystem) +** +** Description : +** Deinitializes the driver. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint32_t McuFatFS_get_fattime(void); +/* +** =================================================================== +** Method : get_fattime (component FAT_FileSystem) +** +** Description : +** Returns the current time +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFatFS_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : ParseCommand (component FAT_FileSystem) +** +** Description : +** Shell Command Line parser. This method is enabled/disabled +** depending on if you have the Shell enabled/disabled in the +** properties. +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command string +** * handled - Pointer to variable which tells if +** the command has been handled or not +** * io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFatFS_CheckCardPresence(bool *cardMounted, uint8_t *drive, FATFS *fileSystemObject, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : CheckCardPresence (component FAT_FileSystem) +** +** Description : +** This method checks if card has been inserted or removed and +** mounts or unmounts the file system. +** Parameters : +** NAME - DESCRIPTION +** * cardMounted - Pointer to initialize this +** variable to FALSE on the caller side the +** first time. +** * drive - drive string, or "" +** * fileSystemObject - Pointer to file +** system object +** io - Pointer to io handler to be used. Can be +** NULL, then no messages are written. +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFatFS_MountFileSystem(FATFS *fileSystemObject, uint8_t *logicalDrive, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : MountFileSystem (component FAT_FileSystem) +** +** Description : +** Mounts a file system +** Parameters : +** NAME - DESCRIPTION +** * fileSystemObject - Pointer to a +** file system object +** * logicalDrive - Pointer to the drive +** string, or "" +** * io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFatFS_UnMountFileSystem(uint8_t *logicalDrive, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : UnMountFileSystem (component FAT_FileSystem) +** +** Description : +** Mounts a file system +** Parameters : +** NAME - DESCRIPTION +** * logicalDrive - Pointer to the drive +** string, or "" +** * io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFatFS_PrintDirectory(const uint8_t *dirName, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : PrintDirectory (component FAT_FileSystem) +** +** Description : +** Prints a directory +** Parameters : +** NAME - DESCRIPTION +** dirName - Directory folder to be printed +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFatFS_CopyFile(const uint8_t*srcFileName, const uint8_t *dstFileName, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : CopyFile (component FAT_FileSystem) +** +** Description : +** Copy a file +** Parameters : +** NAME - DESCRIPTION +** srcFileName - Source file name +** dstFileName - Destination file name +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFatFS_DeleteFile(const uint8_t *fileName, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : DeleteFile (component FAT_FileSystem) +** +** Description : +** Deletes a file +** Parameters : +** NAME - DESCRIPTION +** fileName - Filename of file to be deleted +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFatFS_PrintFile(const uint8_t *fileName, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : PrintFile (component FAT_FileSystem) +** +** Description : +** Prints the content of a file +** Parameters : +** NAME - DESCRIPTION +** fileName - Name of file to be printed +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFatFS_MakeDirectory(const uint8_t *dirName, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : MakeDirectory (component FAT_FileSystem) +** +** Description : +** Creates a directory +** Parameters : +** NAME - DESCRIPTION +** dirName - Directory name +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFatFS_ChangeDirectory(const uint8_t *dirName, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : ChangeDirectory (component FAT_FileSystem) +** +** Description : +** Changes to a directory +** Parameters : +** NAME - DESCRIPTION +** dirName - Directory name +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFatFS_RenameFile(const uint8_t *srcFileName, const uint8_t *dstFileName, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : RenameFile (component FAT_FileSystem) +** +** Description : +** Renames a file +** Parameters : +** NAME - DESCRIPTION +** srcFileName - Source file name +** dstFileName - Destination file name +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFatFS_PrintSector(uint8_t drive, uint32_t sectorNo, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : PrintSector (component FAT_FileSystem) +** +** Description : +** Prints information about the current disk +** Parameters : +** NAME - DESCRIPTION +** drive - drive number, starting with zero +** sectorNo - sector number +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFatFS_PrintDiskInfo(uint8_t *drive, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : PrintDiskInfo (component FAT_FileSystem) +** +** Description : +** Prints information about the current disk +** Parameters : +** NAME - DESCRIPTION +** * drive - Drive string, can be NULL or e.g. +** pointing to "0" +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFatFS_Benchmark(const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : Benchmark (component FAT_FileSystem) +** +** Description : +** Performs a disk benchmark +** Parameters : +** NAME - DESCRIPTION +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFatFS_PrintHexFile(const uint8_t *fileName, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : PrintHexFile (component FAT_FileSystem) +** +** Description : +** Prints the content of a file in hexadecimal format, useful +** for binary files. +** Parameters : +** NAME - DESCRIPTION +** fileName - Name of file to be printed +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFatFS_CreateFile(const uint8_t *fileName, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : CreateFile (component FAT_FileSystem) +** +** Description : +** Creates an empty file +** Parameters : +** NAME - DESCRIPTION +** fileName - Filename of file to be created +** io - Pointer to I/O handler +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_f_getlabel(path, label, vsn) \ + f_getlabel(path, label, vsn) +/* +** =================================================================== +** Method : f_getlabel (component FAT_FileSystem) +** +** Description : +** Get volume label +** Parameters : +** NAME - DESCRIPTION +** * path - Pointer to path name of the logical +** drive number +** * label - Pointer to a buffer to return the +** volume label +** vsn - +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_f_setlabel(label) \ + f_setlabel(label); +/* +** =================================================================== +** Method : f_setlabel (component FAT_FileSystem) +** +** Description : +** Set Volume Label +** Parameters : +** NAME - DESCRIPTION +** * label - Pointer to the volume label to set +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_f_expand(fp, fsz, opt) \ + f_expand(fp, fsz, opt); +/* +** =================================================================== +** Method : f_expand (component FAT_FileSystem) +** +** Description : +** Allocate a Contiguous Blocks to the File +** Parameters : +** NAME - DESCRIPTION +** * fp - Pointer to the file object +** fsz - File size to be expanded to +** opt - Operation mode 0:Find and prepare or 1: +** Find and allocate +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_f_findfirst(dp, fno, path, pattern) \ + f_findfirst(dp, fno, path, pattern) +/* +** =================================================================== +** Method : f_findfirst (component FAT_FileSystem) +** +** Description : +** Find FirstFile +** Parameters : +** NAME - DESCRIPTION +** dp - Pointer to the open directory object +** fno - Pointer to the file information structure +** path - Pointer to the directory to open +** pattern - Pointer to the matching pattern +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_f_findnext(dp, fno) \ + f_findnext(dp, fno) +/* +** =================================================================== +** Method : f_findnext (component FAT_FileSystem) +** +** Description : +** Find Next File +** Parameters : +** NAME - DESCRIPTION +** dp - Pointer to the open directory object +** fno - Pointer to the file information structure +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_f_opendir(dp, path) \ + f_opendir(dp, path) +/* +** =================================================================== +** Method : f_opendir (component FAT_FileSystem) +** +** Description : +** Open a directory +** Parameters : +** NAME - DESCRIPTION +** dp - Pointer to the open directory object +** path - path of directory +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_f_closedir(dp) \ + f_closedir(dp) +/* +** =================================================================== +** Method : f_closedir (component FAT_FileSystem) +** +** Description : +** Close a directory +** Parameters : +** NAME - DESCRIPTION +** dp - Pointer to the open directory object +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFatFS_f_readdir(dj, fno) \ + f_readdir(dj, fno) +/* +** =================================================================== +** Method : f_readdir (component FAT_FileSystem) +** +** Description : +** Read a directory item +** Parameters : +** NAME - DESCRIPTION +** dir - Pointer to the open directory object +** fno - Pointer to the file information structure +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFatFS_StrToDriveNumber(uint8_t *drvStr); +/* +** =================================================================== +** Method : StrToDriveNumber (component FAT_FileSystem) +** +** Description : +** Transforms a drive string ("0:/") into a drive number (0) +** Parameters : +** NAME - DESCRIPTION +** * drvStr - Pointer to drive string, e.g. "0:/" +** Returns : +** --- - Error code +** =================================================================== +*/ + +/* END McuFatFS. */ + +#endif +/* ifndef __McuFatFS_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/McuFatFS_CardPins.c b/TSM_PicoW_Sensor/McuLib/FatFS/McuFatFS_CardPins.c new file mode 100644 index 0000000..c2f7a5d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/McuFatFS_CardPins.c @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2021, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "platform.h" +#include "McuFatFS_CardPins.h" +#include "McuGPIO.h" + +#if McuFatFS_CONFIG_HAS_CARD_DETECT_PIN +static McuGPIO_Handle_t McuFatFS_CardDetectPin; +#endif +#if McuFatFS_CONFIG_HAS_WRITE_PROTECT_PIN +static McuGPIO_Handle_t McuFatFS_WriteProtectPin; +#endif + +bool McuFatFS_CardPinDiskPresent(uint8_t *drvStr) { +#if McuFatFS_CONFIG_HAS_CARD_DETECT_PIN +#if McuFatFS_CONFIG_CARD_DETECT_IS_HIGH_ACTIVE + return McuGPIO_IsHigh(McuFatFS_CardDetectPin); /* Pin is high if card is inserted */ +#else + return McuGPIO_IsLow(McuFatFS_CardDetectPin); /* Pin is low if card is inserted */ +#endif +#else + return true; +#endif +} + +bool McuFatFS_CardPinWriteProtected(uint8_t *drvStr) { +#if McuFatFS_CONFIG_HAS_WRITE_PROTECT_PIN +#if McuFatFS_CONFIG_WRITE_PROTECT_IS_HIGH_ACTIVE + return McuGPIO_IsHigh(McuFatFS_WriteProtectPin); /* Pin is high if card is write protected */ +#else + return McuGPIO_IsLow(McuFatFS_WriteProtectPin); /* Pin is low if card is write protected */ +#endif +#else + return false; +#endif +} + +void McuFatFS_CardPinInit(void) { +#if McuFatFS_CONFIG_HAS_CARD_DETECT_PIN || McuFatFS_CONFIG_HAS_WRITE_PROTECT_PIN + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + config.isInput = true; +#endif + /* card detect pin: */ +#if McuFatFS_CONFIG_HAS_CARD_DETECT_PIN + config.hw.gpio = McuFatFS_CONFIG_CARD_DETECT_GPIO; + config.hw.port = McuFatFS_CONFIG_CARD_DETECT_PORT; + config.hw.pin = McuFatFS_CONFIG_CARD_DETECT_PIN; +#if McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0 + config.hw.iocon = McuFatFS_CONFIG_CARD_DETECT_IOCON; +#endif + McuFatFS_CardDetectPin = McuGPIO_InitGPIO(&config); + if (McuFatFS_CONFIG_CARD_DETECT_PULL!=McuGPIO_PULL_DISABLE) { + McuGPIO_SetPullResistor(McuFatFS_CardDetectPin, McuFatFS_CONFIG_CARD_DETECT_PULL); + } +#endif + /* write protect pin: */ +#if McuFatFS_CONFIG_HAS_WRITE_PROTECT_PIN + config.hw.gpio = McuFatFS_CONFIG_WRITE_PROTECT_GPIO; + config.hw.port = McuFatFS_CONFIG_WRITE_PROTECT_PORT; + config.hw.pin = McuFatFS_CONFIG_WRITE_PROTECT_PIN; +#if McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0 + config.hw.iocon = McuFatFS_CONFIG_WRITE_PROTECT_IOCON; +#endif + McuFatFS_WriteProtectPin = McuGPIO_InitGPIO(&config); + if (McuFatFS_CONFIG_WRITE_PROTECT_PULL!=McuGPIO_PULL_DISABLE) { + McuGPIO_SetPullResistor(McuFatFS_WriteProtectPin, McuFatFS_CONFIG_WRITE_PROTECT_PULL); + } +#endif +} + + diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/McuFatFS_CardPins.h b/TSM_PicoW_Sensor/McuLib/FatFS/McuFatFS_CardPins.h new file mode 100644 index 0000000..45b3431 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/McuFatFS_CardPins.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2021, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef FATFS_SDCARD_H_ +#define FATFS_SDCARD_H_ + +#include +#include +#include "McuFatFS_CardPins_config.h" + +#ifdef __cplusplus +extern "C" { +#endif + +bool McuFatFS_CardPinDiskPresent(uint8_t *drvStr); + +bool McuFatFS_CardPinWriteProtected(uint8_t *drvStr); + +void McuFatFS_CardPinInit(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* FATFS_SDCARD_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/McuFatFS_CardPins_config.h b/TSM_PicoW_Sensor/McuLib/FatFS/McuFatFS_CardPins_config.h new file mode 100644 index 0000000..4ad6451 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/McuFatFS_CardPins_config.h @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2021, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MCUFATFS_CARDPINS_CONFIG_H_ +#define MCUFATFS_CARDPINS_CONFIG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "McuLibconfig.h" +#include "McuGPIO.h" + +/* card detect pin */ +#ifndef McuFatFS_CONFIG_HAS_CARD_DETECT_PIN + #define McuFatFS_CONFIG_HAS_CARD_DETECT_PIN (0) + /*!< 1: has card detection pin. 0: no card detection pin */ +#endif +#if McuFatFS_CONFIG_HAS_CARD_DETECT_PIN + #ifndef McuFatFS_CONFIG_CARD_DETECT_GPIO + #define McuFatFS_CONFIG_CARD_DETECT_GPIO GPIOC + #endif + #ifndef McuFatFS_CONFIG_CARD_DETECT_PORT + #define McuFatFS_CONFIG_CARD_DETECT_PORT PORTC + #endif + #ifndef McuFatFS_CONFIG_CARD_DETECT_PIN + #define McuFatFS_CONFIG_CARD_DETECT_PIN 0U + #endif + #ifndef McuFatFS_CONFIG_CARD_DETECT_PULL + #define McuFatFS_CONFIG_CARD_DETECT_PULL McuGPIO_PULL_DOWN + /*!< type of pull, use McuGPIO_PULL_DISABLE for no pull resistor configuration */ + #endif + #ifndef McuFatFS_CONFIG_CARD_DETECT_IOCON + #define McuFatFS_CONFIG_CARD_DETECT_IOCON /*IOCON_INDEX_PIO0_4*/ + /*!< For LPC Cortex-M0 only */ + #endif +#ifndef McuFatFS_CONFIG_CARD_DETECT_IS_HIGH_ACTIVE + #define McuFatFS_CONFIG_CARD_DETECT_IS_HIGH_ACTIVE (1) + /*!< 1: pin is HIGH active for card present; 0: pin is LOW active if card is present */ +#endif + +#endif /* McuFatFS_CONFIG_HAS_CARD_DETECT_PIN */ + + +/* write protection pin */ +#ifndef McuFatFS_CONFIG_HAS_WRITE_PROTECT_PIN + #define McuFatFS_CONFIG_HAS_WRITE_PROTECT_PIN (0) + /*!< 1: has write protection pin. 0: no card write protection pin */ +#endif +#if McuFatFS_CONFIG_HAS_WRITE_PROTECT_PIN + #ifndef McuFatFS_CONFIG_WRITE_PROTECT_GPIO + #define McuFatFS_CONFIG_WRITE_PROTECT_GPIO GPIOC + #endif + #ifndef McuFatFS_CONFIG_WRITE_PROTECT_PORT + #define McuFatFS_CONFIG_WRITE_PROTECT_PORT PORTC + #endif + #ifndef McuFatFS_CONFIG_WRITE_PROTECT_PIN + #define McuFatFS_CONFIG_WRITE_PROTECT_PIN 1U + #endif + #ifndef McuFatFS_CONFIG_WRITE_PROTECT_PULL + #define McuFatFS_CONFIG_WRITE_PROTECT_PULL McuGPIO_PULL_DOWN + /*!< type of pull, use McuGPIO_PULL_DISABLE for no pull resistor configuration */ + #endif + #ifndef McuFatFS_CONFIG_WRITE_PROTECT_IOCON + #define McuFatFS_CONFIG_WRITE_PROTECT_IOCON /*IOCON_INDEX_PIO0_5*/ + /*!< For LPC Cortex-M0 only */ + #endif +#ifndef McuFatFS_CONFIG_WRITE_PROTECT_IS_HIGH_ACTIVE + #define McuFatFS_CONFIG_WRITE_PROTECT_IS_HIGH_ACTIVE (1) + /*!< 1: pin is HIGH active for write protection; 0: pin is LOW active if card is write protected */ +#endif + +#endif /* McuFatFS_CONFIG_HAS_WRITE_PROTECTION_PIN */ + + +/* example configurations below: */ +#if 0 /* tinyK22 */ + #define McuFatFS_CONFIG_HAS_CARD_DETECT_PIN (1) + #define McuFatFS_CONFIG_CARD_DETECT_GPIO GPIOC + #define McuFatFS_CONFIG_CARD_DETECT_PORT PORTC + #define McuFatFS_CONFIG_CARD_DETECT_PIN 0U + #define McuFatFS_CONFIG_CARD_DETECT_PULL McuGPIO_PULL_DOWN + #define McuFatFS_CONFIG_CARD_DETECT_IS_HIGH_ACTIVE (1) + #define McuFatFS_CONFIG_HAS_WRITE_PROTECT_PIN (0) +#elif 0 /* LPC55S16*/ + #define McuFatFS_CONFIG_HAS_CARD_DETECT_PIN (1) + #define McuFatFS_CONFIG_CARD_DETECT_GPIO GPIO + #define McuFatFS_CONFIG_CARD_DETECT_PORT 0 + #define McuFatFS_CONFIG_CARD_DETECT_PIN 16U + #define McuFatFS_CONFIG_CARD_DETECT_PULL McuGPIO_PULL_DISABLE /* https://www.pololu.com/product/2587 */ + #define McuFatFS_CONFIG_CARD_DETECT_IS_HIGH_ACTIVE (1) /* https://www.pololu.com/product/2587 */ + #define McuFatFS_CONFIG_HAS_WRITE_PROTECT_PIN (0) +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MCUFATFS_CARDPINS_CONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/McuFatFSconfig.h b/TSM_PicoW_Sensor/McuLib/FatFS/McuFatFSconfig.h new file mode 100644 index 0000000..8fced3a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/McuFatFSconfig.h @@ -0,0 +1,39 @@ +/** + * \file + * \brief Configuration header file for FAT_FileSystem + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the FAT File System module. + */ + +#ifndef __McuFatFS_CONFIG_H +#define __McuFatFS_CONFIG_H + +#ifndef McuFatFS_CONFIG_CARD_INSERT_DELAY_TIME_MS + #define McuFatFS_CONFIG_CARD_INSERT_DELAY_TIME_MS (100) + /*!< Delay time in milliseconds after insertion of the card detected */ +#endif + +#ifndef McuFatFS_CONFIG_SHELL_ENABLED + #define McuFatFS_CONFIG_SHELL_ENABLED (1) + /*!< 1: Shell support is enabled; 0: no shell support enabled */ +#endif + +#ifndef McuFatFS_CONFIG_IS_DISK_PRESENT_CALLBACK + #define McuFatFS_CONFIG_IS_DISK_PRESENT_CALLBACK McuFatFS_CardPinDiskPresent + /*!< 1: callback name to be used to decide if a device is present or not */ +#endif + +#ifndef McuFatFS_CONFIG_IS_WRITE_PROTECTED_CALLBACK + #define McuFatFS_CONFIG_IS_WRITE_PROTECTED_CALLBACK McuFatFS_CardPinWriteProtected + /*!< 1: callback name to be used to decide if a device is present or not */ +#endif + +#ifndef McuFatFS_CONFIG_DEFAULT_DRIVE_STRING + #define McuFatFS_CONFIG_DEFAULT_DRIVE_STRING "0:/" + /*!< default drive used for commands. The first letter defines the drive */ +#endif + +#endif /* __McuFatFS_CONFIG_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/ffconf_template.h b/TSM_PicoW_Sensor/McuLib/FatFS/ffconf_template.h new file mode 100644 index 0000000..4d7ad28 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/ffconf_template.h @@ -0,0 +1,305 @@ +#ifndef _FFCONF_H_ +#define _FFCONF_H_ + +/*---------------------------------------------------------------------------/ +/ FatFs Functional Configurations +/---------------------------------------------------------------------------*/ + +#define FFCONF_DEF 86604 /* Revision ID */ + +/*---------------------------------------------------------------------------/ +/ MSDK adaptation configuration +/---------------------------------------------------------------------------*/ +#define SDSPI_DISK_ENABLE +/* Available options are: +/ RAM_DISK_ENABLE +/ USB_DISK_ENABLE +/ SD_DISK_ENABLE +/ MMC_DISK_ENABLE +/ SDSPI_DISK_ENABLE +/ NAND_DISK_ENABLE */ + +/*---------------------------------------------------------------------------/ +/ Function Configurations +/---------------------------------------------------------------------------*/ + +#define FF_FS_READONLY 0 +/* This option switches read-only configuration. (0:Read/Write or 1:Read-only) +/ Read-only configuration removes writing API functions, f_write(), f_sync(), +/ f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree() +/ and optional writing functions as well. */ + + +#define FF_FS_MINIMIZE 0 +/* This option defines minimization level to remove some basic API functions. +/ +/ 0: Basic functions are fully enabled. +/ 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename() +/ are removed. +/ 2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1. +/ 3: f_lseek() function is removed in addition to 2. */ + + +#define FF_USE_STRFUNC 1 +/* This option switches string functions, f_gets(), f_putc(), f_puts() and f_printf(). +/ +/ 0: Disable string functions. +/ 1: Enable without LF-CRLF conversion. +/ 2: Enable with LF-CRLF conversion. */ + + +#define FF_USE_FIND 0 +/* This option switches filtered directory read functions, f_findfirst() and +/ f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */ + + +#define FF_USE_MKFS 1 +/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */ + + +#define FF_USE_FASTSEEK 0 +/* This option switches fast seek function. (0:Disable or 1:Enable) */ + + +#define FF_USE_EXPAND 0 +/* This option switches f_expand function. (0:Disable or 1:Enable) */ + + +#define FF_USE_CHMOD 0 +/* This option switches attribute manipulation functions, f_chmod() and f_utime(). +/ (0:Disable or 1:Enable) Also FF_FS_READONLY needs to be 0 to enable this option. */ + + +#define FF_USE_LABEL 0 +/* This option switches volume label functions, f_getlabel() and f_setlabel(). +/ (0:Disable or 1:Enable) */ + + +#define FF_USE_FORWARD 0 +/* This option switches f_forward() function. (0:Disable or 1:Enable) */ + + +/*---------------------------------------------------------------------------/ +/ Locale and Namespace Configurations +/---------------------------------------------------------------------------*/ + +#define FF_CODE_PAGE 932 +/* This option specifies the OEM code page to be used on the target system. +/ Incorrect code page setting can cause a file open failure. +/ +/ 437 - U.S. +/ 720 - Arabic +/ 737 - Greek +/ 771 - KBL +/ 775 - Baltic +/ 850 - Latin 1 +/ 852 - Latin 2 +/ 855 - Cyrillic +/ 857 - Turkish +/ 860 - Portuguese +/ 861 - Icelandic +/ 862 - Hebrew +/ 863 - Canadian French +/ 864 - Arabic +/ 865 - Nordic +/ 866 - Russian +/ 869 - Greek 2 +/ 932 - Japanese (DBCS) +/ 936 - Simplified Chinese (DBCS) +/ 949 - Korean (DBCS) +/ 950 - Traditional Chinese (DBCS) +/ 0 - Include all code pages above and configured by f_setcp() +*/ + + +#define FF_USE_LFN 2 +#define FF_MAX_LFN 255 +/* The FF_USE_LFN switches the support for LFN (long file name). +/ +/ 0: Disable LFN. FF_MAX_LFN has no effect. +/ 1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe. +/ 2: Enable LFN with dynamic working buffer on the STACK. +/ 3: Enable LFN with dynamic working buffer on the HEAP. +/ +/ To enable the LFN, ffunicode.c needs to be added to the project. The LFN function +/ requiers certain internal working buffer occupies (FF_MAX_LFN + 1) * 2 bytes and +/ additional (FF_MAX_LFN + 44) / 15 * 32 bytes when exFAT is enabled. +/ The FF_MAX_LFN defines size of the working buffer in UTF-16 code unit and it can +/ be in range of 12 to 255. It is recommended to be set 255 to fully support LFN +/ specification. +/ When use stack for the working buffer, take care on stack overflow. When use heap +/ memory for the working buffer, memory management functions, ff_memalloc() and +/ ff_memfree() in ffsystem.c, need to be added to the project. */ + + +#define FF_LFN_UNICODE 0 +/* This option switches the character encoding on the API when LFN is enabled. +/ +/ 0: ANSI/OEM in current CP (TCHAR = char) +/ 1: Unicode in UTF-16 (TCHAR = WCHAR) +/ 2: Unicode in UTF-8 (TCHAR = char) +/ 3: Unicode in UTF-32 (TCHAR = DWORD) +/ +/ Also behavior of string I/O functions will be affected by this option. +/ When LFN is not enabled, this option has no effect. */ + + +#define FF_LFN_BUF 255 +#define FF_SFN_BUF 12 +/* This set of options defines size of file name members in the FILINFO structure +/ which is used to read out directory items. These values should be suffcient for +/ the file names to read. The maximum possible length of the read file name depends +/ on character encoding. When LFN is not enabled, these options have no effect. */ + + +#define FF_STRF_ENCODE 3 +/* When FF_LFN_UNICODE >= 1 with LFN enabled, string I/O functions, f_gets(), +/ f_putc(), f_puts and f_printf() convert the character encoding in it. +/ This option selects assumption of character encoding ON THE FILE to be +/ read/written via those functions. +/ +/ 0: ANSI/OEM in current CP +/ 1: Unicode in UTF-16LE +/ 2: Unicode in UTF-16BE +/ 3: Unicode in UTF-8 +*/ + + +#define FF_FS_RPATH 2 +/* This option configures support for relative path. +/ +/ 0: Disable relative path and remove related functions. +/ 1: Enable relative path. f_chdir() and f_chdrive() are available. +/ 2: f_getcwd() function is available in addition to 1. +*/ + + +/*---------------------------------------------------------------------------/ +/ Drive/Volume Configurations +/---------------------------------------------------------------------------*/ + +#define FF_VOLUMES 5 +/* Number of volumes (logical drives) to be used. (1-10) */ + + +#define FF_STR_VOLUME_ID 0 +#define FF_VOLUME_STRS "RAM","NAND","CF","SD","SD2","USB","USB2","USB3" +/* FF_STR_VOLUME_ID switches support for volume ID in arbitrary strings. +/ When FF_STR_VOLUME_ID is set to 1 or 2, arbitrary strings can be used as drive +/ number in the path name. FF_VOLUME_STRS defines the volume ID strings for each +/ logical drives. Number of items must not be less than FF_VOLUMES. Valid +/ characters for the volume ID strings are A-Z, a-z and 0-9, however, they are +/ compared in case-insensitive. If FF_STR_VOLUME_ID >= 1 and FF_VOLUME_STRS is +/ not defined, a user defined volume string table needs to be defined as: +/ +/ const char* VolumeStr[FF_VOLUMES] = {"ram","flash","sd","usb",... +*/ + + +#define FF_MULTI_PARTITION 0 +/* This option switches support for multiple volumes on the physical drive. +/ By default (0), each logical drive number is bound to the same physical drive +/ number and only an FAT volume found on the physical drive will be mounted. +/ When this function is enabled (1), each logical drive number can be bound to +/ arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk() +/ funciton will be available. */ + + +#define FF_MIN_SS 512 +#define FF_MAX_SS 512 +/* This set of options configures the range of sector size to be supported. (512, +/ 1024, 2048 or 4096) Always set both 512 for most systems, generic memory card and +/ harddisk. But a larger value may be required for on-board flash memory and some +/ type of optical media. When FF_MAX_SS is larger than FF_MIN_SS, FatFs is configured +/ for variable sector size mode and disk_ioctl() function needs to implement +/ GET_SECTOR_SIZE command. */ + + +#define FF_USE_TRIM 0 +/* This option switches support for ATA-TRIM. (0:Disable or 1:Enable) +/ To enable Trim function, also CTRL_TRIM command should be implemented to the +/ disk_ioctl() function. */ + + +#define FF_FS_NOFSINFO 0 +/* If you need to know correct free space on the FAT32 volume, set bit 0 of this +/ option, and f_getfree() function at first time after volume mount will force +/ a full FAT scan. Bit 1 controls the use of last allocated cluster number. +/ +/ bit0=0: Use free cluster count in the FSINFO if available. +/ bit0=1: Do not trust free cluster count in the FSINFO. +/ bit1=0: Use last allocated cluster number in the FSINFO if available. +/ bit1=1: Do not trust last allocated cluster number in the FSINFO. +*/ + + + +/*---------------------------------------------------------------------------/ +/ System Configurations +/---------------------------------------------------------------------------*/ + +#define FF_FS_TINY 0 +/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny) +/ At the tiny configuration, size of file object (FIL) is shrinked FF_MAX_SS bytes. +/ Instead of private sector buffer eliminated from the file object, common sector +/ buffer in the filesystem object (FATFS) is used for the file data transfer. */ + + +#define FF_FS_EXFAT 0 +/* This option switches support for exFAT filesystem. (0:Disable or 1:Enable) +/ To enable exFAT, also LFN needs to be enabled. (FF_USE_LFN >= 1) +/ Note that enabling exFAT discards ANSI C (C89) compatibility. */ + + +#define FF_FS_NORTC 0 +#define FF_NORTC_MON 1 +#define FF_NORTC_MDAY 1 +#define FF_NORTC_YEAR 2018 +/* The option FF_FS_NORTC switches timestamp function. If the system does not have +/ any RTC function or valid timestamp is not needed, set FF_FS_NORTC = 1 to disable +/ the timestamp function. Every object modified by FatFs will have a fixed timestamp +/ defined by FF_NORTC_MON, FF_NORTC_MDAY and FF_NORTC_YEAR in local time. +/ To enable timestamp function (FF_FS_NORTC = 0), get_fattime() function need to be +/ added to the project to read current time form real-time clock. FF_NORTC_MON, +/ FF_NORTC_MDAY and FF_NORTC_YEAR have no effect. +/ These options have no effect at read-only configuration (FF_FS_READONLY = 1). */ + + +#define FF_FS_LOCK 0 +/* The option FF_FS_LOCK switches file lock function to control duplicated file open +/ and illegal operation to open objects. This option must be 0 when FF_FS_READONLY +/ is 1. +/ +/ 0: Disable file lock function. To avoid volume corruption, application program +/ should avoid illegal open, remove and rename to the open objects. +/ >0: Enable file lock function. The value defines how many files/sub-directories +/ can be opened simultaneously under file lock control. Note that the file +/ lock control is independent of re-entrancy. */ + + +/* #include // O/S definitions */ +#define FF_FS_REENTRANT 1 +#define FF_FS_TIMEOUT 1000 +#define FF_SYNC_t void* /* Type of sync object used on the OS. In reality it is xSemaphoreHandle */ +/* The option FF_FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs +/ module itself. Note that regardless of this option, file access to different +/ volume is always re-entrant and volume control functions, f_mount(), f_mkfs() +/ and f_fdisk() function, are always not re-entrant. Only file/directory access +/ to the same volume is under control of this function. +/ +/ 0: Disable re-entrancy. FF_FS_TIMEOUT and FF_SYNC_t have no effect. +/ 1: Enable re-entrancy. Also user provided synchronization handlers, +/ ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj() +/ function, must be added to the project. Samples are available in +/ option/syscall.c. +/ +/ The FF_FS_TIMEOUT defines timeout period in unit of time tick. +/ The FF_SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, +/ SemaphoreHandle_t and etc. A header file for O/S definitions needs to be +/ included somewhere in the scope of ff.h. */ + + + +/*--- End of configuration options ---*/ + +#endif /* _FFCONF_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/readme.txt b/TSM_PicoW_Sensor/McuLib/FatFS/readme.txt new file mode 100644 index 0000000..a7ddd7b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/readme.txt @@ -0,0 +1,4 @@ +readme.txt +---------- + +See http://elm-chan.org/fsw/ff/00index_e.html for more information. diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/source/diskio.c b/TSM_PicoW_Sensor/McuLib/FatFS/source/diskio.c new file mode 100644 index 0000000..c90fef7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/source/diskio.c @@ -0,0 +1,303 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2019 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ +/*-----------------------------------------------------------------------*/ +/* Low level disk I/O module skeleton for FatFs (C)ChaN, 2016 */ +/*-----------------------------------------------------------------------*/ +/* If a working storage control module is available, it should be */ +/* attached to the FatFs via a glue function rather than modifying it. */ +/* This is an example of glue functions to attach various exsisting */ +/* storage control modules to the FatFs module with a defined API. */ +/*-----------------------------------------------------------------------*/ +#include "McuLib.h" +#if McuLib_CONFIG_USE_FAT_FS + +#include "ffconf.h" /* FatFs configuration options */ +#include "ff.h" /* Obtains integer types */ +#include "diskio.h" /* Declarations of disk functions */ + +#ifdef RAM_DISK_ENABLE +#include "FatFS/source/fsl_ram_disk/fsl_ram_disk.h" +#endif + +#ifdef USB_DISK_ENABLE +#include "FatFS/source/fsl_usb_disk/fsl_usb_disk.h" +#endif + +#ifdef SD_DISK_ENABLE +#include "fsl_sd_disk.h" +#endif + +#ifdef MMC_DISK_ENABLE +#include "fsl_mmc_disk.h" +#endif + +#ifdef SDSPI_DISK_ENABLE +#include "FatFS/source/fsl_sdspi_disk/fsl_sdspi_disk.h" +#endif + +#ifdef NAND_DISK_ENABLE +#include "fsl_nand_disk.h" +#endif + +/*-----------------------------------------------------------------------*/ +/* Get Drive Status */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_status ( + BYTE pdrv /* Physical drive nmuber to identify the drive */ +) +{ + DSTATUS stat; + switch (pdrv) + { +#ifdef RAM_DISK_ENABLE + case RAMDISK: + stat = ram_disk_status(pdrv); + return stat; +#endif +#ifdef USB_DISK_ENABLE + case USBDISK: + stat = USB_HostMsdGetDiskStatus(pdrv); + return stat; +#endif +#ifdef SD_DISK_ENABLE + case SDDISK: + stat = sd_disk_status(pdrv); + return stat; +#endif +#ifdef MMC_DISK_ENABLE + case MMCDISK: + stat = mmc_disk_status(pdrv); + return stat; +#endif +#ifdef SDSPI_DISK_ENABLE + case SDSPIDISK: + stat = sdspi_disk_status(pdrv); + return stat; +#endif +#ifdef NAND_DISK_ENABLE + case NANDDISK: + stat = nand_disk_status(pdrv); + return stat; +#endif + default: + break; + } + return STA_NOINIT; +} + + + +/*-----------------------------------------------------------------------*/ +/* Inidialize a Drive */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_initialize ( + BYTE pdrv /* Physical drive nmuber to identify the drive */ +) +{ + DSTATUS stat; + switch (pdrv) + { +#ifdef RAM_DISK_ENABLE + case RAMDISK: + stat = ram_disk_initialize(pdrv); + return stat; +#endif +#ifdef USB_DISK_ENABLE + case USBDISK: + stat = USB_HostMsdInitializeDisk(pdrv); + return stat; +#endif +#ifdef SD_DISK_ENABLE + case SDDISK: + stat = sd_disk_initialize(pdrv); + return stat; +#endif +#ifdef MMC_DISK_ENABLE + case MMCDISK: + stat = mmc_disk_initialize(pdrv); + return stat; +#endif +#ifdef SDSPI_DISK_ENABLE + case SDSPIDISK: + stat = sdspi_disk_initialize(pdrv); + return stat; +#endif + +#ifdef NAND_DISK_ENABLE + case NANDDISK: + stat = nand_disk_initialize(pdrv); + return stat; +#endif + default: + break; + } + return STA_NOINIT; +} + + + +/*-----------------------------------------------------------------------*/ +/* Read Sector(s) */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_read ( + BYTE pdrv, /* Physical drive nmuber to identify the drive */ + BYTE *buff, /* Data buffer to store read data */ + DWORD sector, /* Start sector in LBA */ + UINT count /* Number of sectors to read */ +) +{ + DRESULT res; + switch (pdrv) + { +#ifdef RAM_DISK_ENABLE + case RAMDISK: + res = ram_disk_read(pdrv, buff, sector, count); + return res; +#endif +#ifdef USB_DISK_ENABLE + case USBDISK: + res = USB_HostMsdReadDisk(pdrv, buff, sector, count); + return res; +#endif +#ifdef SD_DISK_ENABLE + case SDDISK: + res = sd_disk_read(pdrv, buff, sector, count); + return res; +#endif +#ifdef MMC_DISK_ENABLE + case MMCDISK: + res = mmc_disk_read(pdrv, buff, sector, count); + return res; +#endif +#ifdef SDSPI_DISK_ENABLE + case SDSPIDISK: + res = sdspi_disk_read(pdrv, buff, sector, count); + return res; +#endif + +#ifdef NAND_DISK_ENABLE + case NANDDISK: + res = nand_disk_read(pdrv, buff, sector, count); + return res; +#endif + default: + break; + } + + return RES_PARERR; +} + + + +/*-----------------------------------------------------------------------*/ +/* Write Sector(s) */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_write ( + BYTE pdrv, /* Physical drive nmuber to identify the drive */ + const BYTE *buff, /* Data to be written */ + DWORD sector, /* Start sector in LBA */ + UINT count /* Number of sectors to write */ +) +{ + DRESULT res; + switch (pdrv) + { +#ifdef RAM_DISK_ENABLE + case RAMDISK: + res = ram_disk_write(pdrv, buff, sector, count); + return res; +#endif +#ifdef USB_DISK_ENABLE + case USBDISK: + res = USB_HostMsdWriteDisk(pdrv, buff, sector, count); + return res; +#endif +#ifdef SD_DISK_ENABLE + case SDDISK: + res = sd_disk_write(pdrv, buff, sector, count); + return res; +#endif +#ifdef MMC_DISK_ENABLE + case MMCDISK: + res = mmc_disk_write(pdrv, buff, sector, count); + return res; +#endif +#ifdef SDSPI_DISK_ENABLE + case SDSPIDISK: + res = sdspi_disk_write(pdrv, buff, sector, count); + return res; +#endif + +#ifdef NAND_DISK_ENABLE + case NANDDISK: + res = nand_disk_write(pdrv, buff, sector, count); + return res; +#endif + default: + break; + } + return RES_PARERR; +} + + +/*-----------------------------------------------------------------------*/ +/* Miscellaneous Functions */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_ioctl ( + BYTE pdrv, /* Physical drive nmuber (0..) */ + BYTE cmd, /* Control code */ + void *buff /* Buffer to send/receive control data */ +) +{ + DRESULT res; + switch (pdrv) + { +#ifdef RAM_DISK_ENABLE + case RAMDISK: + res = ram_disk_ioctl(pdrv, cmd, buff); + return res; +#endif +#ifdef USB_DISK_ENABLE + case USBDISK: + res = USB_HostMsdIoctlDisk(pdrv, cmd, buff); + return res; +#endif +#ifdef SD_DISK_ENABLE + case SDDISK: + res = sd_disk_ioctl(pdrv, cmd, buff); + return res; +#endif +#ifdef MMC_DISK_ENABLE + case MMCDISK: + res = mmc_disk_ioctl(pdrv, cmd, buff); + return res; +#endif +#ifdef SDSPI_DISK_ENABLE + case SDSPIDISK: + res = sdspi_disk_ioctl(pdrv, cmd, buff); + return res; +#endif + +#ifdef NAND_DISK_ENABLE + case NANDDISK: + res = nand_disk_ioctl(pdrv, cmd, buff); + return res; +#endif + default: + break; + } + return RES_PARERR; +} + +#endif /* McuLib_CONFIG_USE_FAT_FS */ diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/source/diskio.h b/TSM_PicoW_Sensor/McuLib/FatFS/source/diskio.h new file mode 100644 index 0000000..8b4305c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/source/diskio.h @@ -0,0 +1,118 @@ +/*-----------------------------------------------------------------------/ +/ Low level disk interface modlue include file (C)ChaN, 2014 / +/-----------------------------------------------------------------------*/ + +#ifndef _DISKIO_DEFINED +#define _DISKIO_DEFINED + +#ifdef __cplusplus +extern "C" { +#endif + +/* Definitions of physical drive number for each drive */ +#if 1 /* << EST */ +#define SDSPIDISK 0 /* sdspi disk to physical drive 4 */ +#define USBDISK 1 /* usb disk to physical drive 1 */ +#define RAMDISK 2 /* Example: ram disk to physical drive 0 */ +#define SDDISK 3 /* sd disk to physical drive 2 */ +#define MMCDISK 4 /* mmc disk to physical drive 3 */ +#define NANDDISK 5 /* nand disk to physical drive 5 */ +#else +#define RAMDISK 0 /* Example: ram disk to physical drive 0 */ +#define USBDISK 1 /* usb disk to physical drive 1 */ +#define SDDISK 2 /* sd disk to physical drive 2 */ +#define MMCDISK 3 /* mmc disk to physical drive 3 */ +#define SDSPIDISK 4 /* sdspi disk to physical drive 4 */ +#define NANDDISK 5 /* nand disk to physical drive 5 */ +#endif + + +/* Status of Disk Functions */ +typedef BYTE DSTATUS; + +/* Results of Disk Functions */ +typedef enum { + RES_OK = 0, /* 0: Successful */ + RES_ERROR, /* 1: R/W Error */ + RES_WRPRT, /* 2: Write Protected */ + RES_NOTRDY, /* 3: Not Ready */ + RES_PARERR /* 4: Invalid Parameter */ +} DRESULT; + + +/*---------------------------------------*/ +/* Prototypes for disk control functions */ + + +DSTATUS disk_initialize (BYTE pdrv); +DSTATUS disk_status (BYTE pdrv); +DRESULT disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count); +DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count); +DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff); + + +/* Disk Status Bits (DSTATUS) */ + +#define STA_NOINIT 0x01 /* Drive not initialized */ +#define STA_NODISK 0x02 /* No medium in the drive */ +#define STA_PROTECT 0x04 /* Write protected */ + + +/* Command code for disk_ioctrl function */ + +/* Generic command (Used by FatFs) */ +#define CTRL_SYNC 0 /* Complete pending write process (needed at FF_FS_READONLY == 0) */ +#define GET_SECTOR_COUNT 1 /* Get media size (needed at FF_USE_MKFS == 1) */ +#define GET_SECTOR_SIZE 2 /* Get sector size (needed at FF_MAX_SS != FF_MIN_SS) */ +#define GET_BLOCK_SIZE 3 /* Get erase block size (needed at FF_USE_MKFS == 1) */ +#define CTRL_TRIM 4 /* Inform device that the data on the block of sectors is no longer used (needed at FF_USE_TRIM == 1) */ + +/* Generic command (Not used by FatFs) */ +#define CTRL_POWER 5 /* Get/Set power status */ +#define CTRL_LOCK 6 /* Lock/Unlock media removal */ +#define CTRL_EJECT 7 /* Eject media */ +#define CTRL_FORMAT 8 /* Create physical format on the media */ + +/* MMC/SDC specific ioctl command */ +#define MMC_GET_TYPE 10 /* Get card type */ +/* << EST */ +#define CT_SD1 (1<<0) /* LDD_SDHC_SD, Secure Digital memory card */ +#define CT_SD2 (1<<1) /* LDD_SDHC_SDIO, Secure Digital IO card */ +#define CT_BLOCK (1<<2) +#define CT_MMC (1<<3) /* LDD_SDHC_MMC, MultiMediaCard memory card */ +#define CT_SDC (1<<4) /* LDD_SDHC_SDCOMBO, Combined Secure Digital memory and IO card */ +#define CT_ATA (1<<5) /* LDD_SDHC_CE_ATA, Consumer Electronics ATA card */ +/* << EST */ + +#define MMC_GET_CSD 11 /* Get CSD */ +#define MMC_GET_CID 12 /* Get CID */ +#define MMC_GET_OCR 13 /* Get OCR */ +#define MMC_GET_SDSTAT 14 /* Get SD status */ + +/* << EST */ +#define MMC_GET_SDC_VERSION 15 /* 1 byte */ +#define MMC_GET_READ_BL_LEN 16 /* 2 bytes */ +#define MMC_GET_DRIVER_VERSION 17 /* 1 byte: return: 0 SPI driver, 1 LLD SDHC driver */ +#define MMC_GET_LLD_INFO 18 /* array: 1 byte subcommand, 1 byte bufSize, bufSize*bytes */ + #define MMC_GET_LLD_CMD_HIGH_CAPACITY 0 /* return 1 byte, 0 for no, 1 for yes */ + #define MMC_GET_LLD_CMD_HIGH_SPEED 1 /* return 1 byte, 0 for no, 1 for yes */ + #define MMC_GET_LLD_CMD_LOW_VOLTAGE 2 /* return 1 byte, 0 for no, 1 for yes */ + #define MMC_GET_LLD_CMD_DATA_WIDTHS 3 /* return 1 byte (bitset), 0x1: 1, 0x2: 4, 0x4: 8 */ + #define MMC_GET_LLD_CMD_OPERATIONS 4 /* return 1 byte (bitset), 0x1: block read, 0x2: block write, 0x4: block erase, 0x8: write protection, 0x10: I/O */ +/*<< EST */ + + +#define ISDIO_READ 55 /* Read data form SD iSDIO register */ +#define ISDIO_WRITE 56 /* Write data to SD iSDIO register */ +#define ISDIO_MRITE 57 /* Masked write data to SD iSDIO register */ + +/* ATA/CF specific ioctl command */ +#define ATA_GET_REV 20 /* Get F/W revision */ +#define ATA_GET_MODEL 21 /* Get model name */ +#define ATA_GET_SN 22 /* Get serial number */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/source/ff.c b/TSM_PicoW_Sensor/McuLib/FatFS/source/ff.c new file mode 100644 index 0000000..e44a1ea --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/source/ff.c @@ -0,0 +1,6559 @@ +/*----------------------------------------------------------------------------/ +/ FatFs - Generic FAT Filesystem Module R0.13c / +/-----------------------------------------------------------------------------/ +/ +/ Copyright (C) 2018, ChaN, all right reserved. +/ +/ FatFs module is an open source software. Redistribution and use of FatFs in +/ source and binary forms, with or without modification, are permitted provided +/ that the following condition is met: +/ +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. +/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +/ +/----------------------------------------------------------------------------*/ + +#include "McuLib.h" +#if McuLib_CONFIG_USE_FAT_FS + +#include "ff.h" /* Declarations of FatFs API */ +#include "diskio.h" /* Declarations of device I/O functions */ + + +/*-------------------------------------------------------------------------- + + Module Private Definitions + +---------------------------------------------------------------------------*/ + +#if FF_DEFINED != 86604 /* Revision ID */ +#error Wrong include file (ff.h). +#endif + + +/* Limits and boundaries */ +#define MAX_DIR 0x200000 /* Max size of FAT directory */ +#define MAX_DIR_EX 0x10000000 /* Max size of exFAT directory */ +#define MAX_FAT12 0xFF5 /* Max FAT12 clusters (differs from specs, but right for real DOS/Windows behavior) */ +#define MAX_FAT16 0xFFF5 /* Max FAT16 clusters (differs from specs, but right for real DOS/Windows behavior) */ +#define MAX_FAT32 0x0FFFFFF5 /* Max FAT32 clusters (not specified, practical limit) */ +#define MAX_EXFAT 0x7FFFFFFD /* Max exFAT clusters (differs from specs, implementation limit) */ + + +/* Character code support macros */ +#define IsUpper(c) ((c) >= 'A' && (c) <= 'Z') +#define IsLower(c) ((c) >= 'a' && (c) <= 'z') +#define IsDigit(c) ((c) >= '0' && (c) <= '9') +#define IsSurrogate(c) ((c) >= 0xD800 && (c) <= 0xDFFF) +#define IsSurrogateH(c) ((c) >= 0xD800 && (c) <= 0xDBFF) +#define IsSurrogateL(c) ((c) >= 0xDC00 && (c) <= 0xDFFF) + + +/* Additional file access control and file status flags for internal use */ +#define FA_SEEKEND 0x20 /* Seek to end of the file on file open */ +#define FA_MODIFIED 0x40 /* File has been modified */ +#define FA_DIRTY 0x80 /* FIL.buf[] needs to be written-back */ + + +/* Additional file attribute bits for internal use */ +#define AM_VOL 0x08 /* Volume label */ +#define AM_LFN 0x0F /* LFN entry */ +#define AM_MASK 0x3F /* Mask of defined bits */ + + +/* Name status flags in fn[11] */ +#define NSFLAG 11 /* Index of the name status byte */ +#define NS_LOSS 0x01 /* Out of 8.3 format */ +#define NS_LFN 0x02 /* Force to create LFN entry */ +#define NS_LAST 0x04 /* Last segment */ +#define NS_BODY 0x08 /* Lower case flag (body) */ +#define NS_EXT 0x10 /* Lower case flag (ext) */ +#define NS_DOT 0x20 /* Dot entry */ +#define NS_NOLFN 0x40 /* Do not find LFN */ +#define NS_NONAME 0x80 /* Not followed */ + + +/* exFAT directory entry types */ +#define ET_BITMAP 0x81 /* Allocation bitmap */ +#define ET_UPCASE 0x82 /* Up-case table */ +#define ET_VLABEL 0x83 /* Volume label */ +#define ET_FILEDIR 0x85 /* File and directory */ +#define ET_STREAM 0xC0 /* Stream extension */ +#define ET_FILENAME 0xC1 /* Name extension */ + + +/* FatFs refers the FAT structure as simple byte array instead of structure member +/ because the C structure is not binary compatible between different platforms */ + +#define BS_JmpBoot 0 /* x86 jump instruction (3-byte) */ +#define BS_OEMName 3 /* OEM name (8-byte) */ +#define BPB_BytsPerSec 11 /* Sector size [byte] (WORD) */ +#define BPB_SecPerClus 13 /* Cluster size [sector] (BYTE) */ +#define BPB_RsvdSecCnt 14 /* Size of reserved area [sector] (WORD) */ +#define BPB_NumFATs 16 /* Number of FATs (BYTE) */ +#define BPB_RootEntCnt 17 /* Size of root directory area for FAT [entry] (WORD) */ +#define BPB_TotSec16 19 /* Volume size (16-bit) [sector] (WORD) */ +#define BPB_Media 21 /* Media descriptor byte (BYTE) */ +#define BPB_FATSz16 22 /* FAT size (16-bit) [sector] (WORD) */ +#define BPB_SecPerTrk 24 /* Number of sectors per track for int13h [sector] (WORD) */ +#define BPB_NumHeads 26 /* Number of heads for int13h (WORD) */ +#define BPB_HiddSec 28 /* Volume offset from top of the drive (DWORD) */ +#define BPB_TotSec32 32 /* Volume size (32-bit) [sector] (DWORD) */ +#define BS_DrvNum 36 /* Physical drive number for int13h (BYTE) */ +#define BS_NTres 37 /* WindowsNT error flag (BYTE) */ +#define BS_BootSig 38 /* Extended boot signature (BYTE) */ +#define BS_VolID 39 /* Volume serial number (DWORD) */ +#define BS_VolLab 43 /* Volume label string (8-byte) */ +#define BS_FilSysType 54 /* Filesystem type string (8-byte) */ +#define BS_BootCode 62 /* Boot code (448-byte) */ +#define BS_55AA 510 /* Signature word (WORD) */ + +#define BPB_FATSz32 36 /* FAT32: FAT size [sector] (DWORD) */ +#define BPB_ExtFlags32 40 /* FAT32: Extended flags (WORD) */ +#define BPB_FSVer32 42 /* FAT32: Filesystem version (WORD) */ +#define BPB_RootClus32 44 /* FAT32: Root directory cluster (DWORD) */ +#define BPB_FSInfo32 48 /* FAT32: Offset of FSINFO sector (WORD) */ +#define BPB_BkBootSec32 50 /* FAT32: Offset of backup boot sector (WORD) */ +#define BS_DrvNum32 64 /* FAT32: Physical drive number for int13h (BYTE) */ +#define BS_NTres32 65 /* FAT32: Error flag (BYTE) */ +#define BS_BootSig32 66 /* FAT32: Extended boot signature (BYTE) */ +#define BS_VolID32 67 /* FAT32: Volume serial number (DWORD) */ +#define BS_VolLab32 71 /* FAT32: Volume label string (8-byte) */ +#define BS_FilSysType32 82 /* FAT32: Filesystem type string (8-byte) */ +#define BS_BootCode32 90 /* FAT32: Boot code (420-byte) */ + +#define BPB_ZeroedEx 11 /* exFAT: MBZ field (53-byte) */ +#define BPB_VolOfsEx 64 /* exFAT: Volume offset from top of the drive [sector] (QWORD) */ +#define BPB_TotSecEx 72 /* exFAT: Volume size [sector] (QWORD) */ +#define BPB_FatOfsEx 80 /* exFAT: FAT offset from top of the volume [sector] (DWORD) */ +#define BPB_FatSzEx 84 /* exFAT: FAT size [sector] (DWORD) */ +#define BPB_DataOfsEx 88 /* exFAT: Data offset from top of the volume [sector] (DWORD) */ +#define BPB_NumClusEx 92 /* exFAT: Number of clusters (DWORD) */ +#define BPB_RootClusEx 96 /* exFAT: Root directory start cluster (DWORD) */ +#define BPB_VolIDEx 100 /* exFAT: Volume serial number (DWORD) */ +#define BPB_FSVerEx 104 /* exFAT: Filesystem version (WORD) */ +#define BPB_VolFlagEx 106 /* exFAT: Volume flags (WORD) */ +#define BPB_BytsPerSecEx 108 /* exFAT: Log2 of sector size in unit of byte (BYTE) */ +#define BPB_SecPerClusEx 109 /* exFAT: Log2 of cluster size in unit of sector (BYTE) */ +#define BPB_NumFATsEx 110 /* exFAT: Number of FATs (BYTE) */ +#define BPB_DrvNumEx 111 /* exFAT: Physical drive number for int13h (BYTE) */ +#define BPB_PercInUseEx 112 /* exFAT: Percent in use (BYTE) */ +#define BPB_RsvdEx 113 /* exFAT: Reserved (7-byte) */ +#define BS_BootCodeEx 120 /* exFAT: Boot code (390-byte) */ + +#define DIR_Name 0 /* Short file name (11-byte) */ +#define DIR_Attr 11 /* Attribute (BYTE) */ +#define DIR_NTres 12 /* Lower case flag (BYTE) */ +#define DIR_CrtTime10 13 /* Created time sub-second (BYTE) */ +#define DIR_CrtTime 14 /* Created time (DWORD) */ +#define DIR_LstAccDate 18 /* Last accessed date (WORD) */ +#define DIR_FstClusHI 20 /* Higher 16-bit of first cluster (WORD) */ +#define DIR_ModTime 22 /* Modified time (DWORD) */ +#define DIR_FstClusLO 26 /* Lower 16-bit of first cluster (WORD) */ +#define DIR_FileSize 28 /* File size (DWORD) */ +#define LDIR_Ord 0 /* LFN: LFN order and LLE flag (BYTE) */ +#define LDIR_Attr 11 /* LFN: LFN attribute (BYTE) */ +#define LDIR_Type 12 /* LFN: Entry type (BYTE) */ +#define LDIR_Chksum 13 /* LFN: Checksum of the SFN (BYTE) */ +#define LDIR_FstClusLO 26 /* LFN: MBZ field (WORD) */ +#define XDIR_Type 0 /* exFAT: Type of exFAT directory entry (BYTE) */ +#define XDIR_NumLabel 1 /* exFAT: Number of volume label characters (BYTE) */ +#define XDIR_Label 2 /* exFAT: Volume label (11-WORD) */ +#define XDIR_CaseSum 4 /* exFAT: Sum of case conversion table (DWORD) */ +#define XDIR_NumSec 1 /* exFAT: Number of secondary entries (BYTE) */ +#define XDIR_SetSum 2 /* exFAT: Sum of the set of directory entries (WORD) */ +#define XDIR_Attr 4 /* exFAT: File attribute (WORD) */ +#define XDIR_CrtTime 8 /* exFAT: Created time (DWORD) */ +#define XDIR_ModTime 12 /* exFAT: Modified time (DWORD) */ +#define XDIR_AccTime 16 /* exFAT: Last accessed time (DWORD) */ +#define XDIR_CrtTime10 20 /* exFAT: Created time subsecond (BYTE) */ +#define XDIR_ModTime10 21 /* exFAT: Modified time subsecond (BYTE) */ +#define XDIR_CrtTZ 22 /* exFAT: Created timezone (BYTE) */ +#define XDIR_ModTZ 23 /* exFAT: Modified timezone (BYTE) */ +#define XDIR_AccTZ 24 /* exFAT: Last accessed timezone (BYTE) */ +#define XDIR_GenFlags 33 /* exFAT: General secondary flags (BYTE) */ +#define XDIR_NumName 35 /* exFAT: Number of file name characters (BYTE) */ +#define XDIR_NameHash 36 /* exFAT: Hash of file name (WORD) */ +#define XDIR_ValidFileSize 40 /* exFAT: Valid file size (QWORD) */ +#define XDIR_FstClus 52 /* exFAT: First cluster of the file data (DWORD) */ +#define XDIR_FileSize 56 /* exFAT: File/Directory size (QWORD) */ + +#define SZDIRE 32 /* Size of a directory entry */ +#define DDEM 0xE5 /* Deleted directory entry mark set to DIR_Name[0] */ +#define RDDEM 0x05 /* Replacement of the character collides with DDEM */ +#define LLEF 0x40 /* Last long entry flag in LDIR_Ord */ + +#define FSI_LeadSig 0 /* FAT32 FSI: Leading signature (DWORD) */ +#define FSI_StrucSig 484 /* FAT32 FSI: Structure signature (DWORD) */ +#define FSI_Free_Count 488 /* FAT32 FSI: Number of free clusters (DWORD) */ +#define FSI_Nxt_Free 492 /* FAT32 FSI: Last allocated cluster (DWORD) */ + +#define MBR_Table 446 /* MBR: Offset of partition table in the MBR */ +#define SZ_PTE 16 /* MBR: Size of a partition table entry */ +#define PTE_Boot 0 /* MBR PTE: Boot indicator */ +#define PTE_StHead 1 /* MBR PTE: Start head */ +#define PTE_StSec 2 /* MBR PTE: Start sector */ +#define PTE_StCyl 3 /* MBR PTE: Start cylinder */ +#define PTE_System 4 /* MBR PTE: System ID */ +#define PTE_EdHead 5 /* MBR PTE: End head */ +#define PTE_EdSec 6 /* MBR PTE: End sector */ +#define PTE_EdCyl 7 /* MBR PTE: End cylinder */ +#define PTE_StLba 8 /* MBR PTE: Start in LBA */ +#define PTE_SizLba 12 /* MBR PTE: Size in LBA */ + + +/* Post process on fatal error in the file operations */ +#define ABORT(fs, res) { fp->err = (BYTE)(res); LEAVE_FF(fs, res); } + + +/* Re-entrancy related */ +#if FF_FS_REENTRANT +#if FF_USE_LFN == 1 +#error Static LFN work area cannot be used at thread-safe configuration +#endif +#define LEAVE_FF(fs, res) { unlock_fs(fs, res); return res; } +#else +#define LEAVE_FF(fs, res) return res +#endif + + +/* Definitions of volume - physical location conversion */ +#if FF_MULTI_PARTITION +#define LD2PD(vol) VolToPart[vol].pd /* Get physical drive number */ +#define LD2PT(vol) VolToPart[vol].pt /* Get partition index */ +#else +#define LD2PD(vol) (BYTE)(vol) /* Each logical drive is bound to the same physical drive number */ +#define LD2PT(vol) 0 /* Find first valid partition or in SFD */ +#endif + + +/* Definitions of sector size */ +#if (FF_MAX_SS < FF_MIN_SS) || (FF_MAX_SS != 512 && FF_MAX_SS != 1024 && FF_MAX_SS != 2048 && FF_MAX_SS != 4096) || (FF_MIN_SS != 512 && FF_MIN_SS != 1024 && FF_MIN_SS != 2048 && FF_MIN_SS != 4096) +#error Wrong sector size configuration +#endif +#if FF_MAX_SS == FF_MIN_SS +#define SS(fs) ((UINT)FF_MAX_SS) /* Fixed sector size */ +#else +#define SS(fs) ((fs)->ssize) /* Variable sector size */ +#endif + + +/* Timestamp */ +#if FF_FS_NORTC == 1 +#if FF_NORTC_YEAR < 1980 || FF_NORTC_YEAR > 2107 || FF_NORTC_MON < 1 || FF_NORTC_MON > 12 || FF_NORTC_MDAY < 1 || FF_NORTC_MDAY > 31 +#error Invalid FF_FS_NORTC settings +#endif +#define GET_FATTIME() ((DWORD)(FF_NORTC_YEAR - 1980) << 25 | (DWORD)FF_NORTC_MON << 21 | (DWORD)FF_NORTC_MDAY << 16) +#else +#define GET_FATTIME() get_fattime() +#endif + + +/* File lock controls */ +#if FF_FS_LOCK != 0 +#if FF_FS_READONLY +#error FF_FS_LOCK must be 0 at read-only configuration +#endif +typedef struct { + FATFS *fs; /* Object ID 1, volume (NULL:blank entry) */ + DWORD clu; /* Object ID 2, containing directory (0:root) */ + DWORD ofs; /* Object ID 3, offset in the directory */ + WORD ctr; /* Object open counter, 0:none, 0x01..0xFF:read mode open count, 0x100:write mode */ +} FILESEM; +#endif + + +/* SBCS up-case tables (\x80-\xFF) */ +#define TBL_CT437 {0x80,0x9A,0x45,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT720 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT737 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0x93,0x94,0x95,0x96,0x97,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, \ + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0xAA,0x92,0x93,0x94,0x95,0x96, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x97,0xEA,0xEB,0xEC,0xE4,0xED,0xEE,0xEF,0xF5,0xF0,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT771 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDC,0xDE,0xDE, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFE,0xFF} +#define TBL_CT775 {0x80,0x9A,0x91,0xA0,0x8E,0x95,0x8F,0x80,0xAD,0xED,0x8A,0x8A,0xA1,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0xE2,0x99,0x95,0x96,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xE0,0xA3,0xA3,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xA5,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE3,0xE8,0xE8,0xEA,0xEA,0xEE,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT850 {0x43,0x55,0x45,0x41,0x41,0x41,0x41,0x43,0x45,0x45,0x45,0x49,0x49,0x49,0x41,0x41, \ + 0x45,0x92,0x92,0x4F,0x4F,0x4F,0x55,0x55,0x59,0x4F,0x55,0x4F,0x9C,0x4F,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0x41,0x41,0x41,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0x41,0x41,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0x45,0x45,0x45,0x49,0x49,0x49,0x49,0xD9,0xDA,0xDB,0xDC,0xDD,0x49,0xDF, \ + 0x4F,0xE1,0x4F,0x4F,0x4F,0x4F,0xE6,0xE8,0xE8,0x55,0x55,0x55,0x59,0x59,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT852 {0x80,0x9A,0x90,0xB6,0x8E,0xDE,0x8F,0x80,0x9D,0xD3,0x8A,0x8A,0xD7,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x91,0xE2,0x99,0x95,0x95,0x97,0x97,0x99,0x9A,0x9B,0x9B,0x9D,0x9E,0xAC, \ + 0xB5,0xD6,0xE0,0xE9,0xA4,0xA4,0xA6,0xA6,0xA8,0xA8,0xAA,0x8D,0xAC,0xB8,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBD,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC6,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0xD2,0xD3,0xD2,0xD5,0xD6,0xD7,0xB7,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE3,0xD5,0xE6,0xE6,0xE8,0xE9,0xE8,0xEB,0xED,0xED,0xDD,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xEB,0xFC,0xFC,0xFE,0xFF} +#define TBL_CT855 {0x81,0x81,0x83,0x83,0x85,0x85,0x87,0x87,0x89,0x89,0x8B,0x8B,0x8D,0x8D,0x8F,0x8F, \ + 0x91,0x91,0x93,0x93,0x95,0x95,0x97,0x97,0x99,0x99,0x9B,0x9B,0x9D,0x9D,0x9F,0x9F, \ + 0xA1,0xA1,0xA3,0xA3,0xA5,0xA5,0xA7,0xA7,0xA9,0xA9,0xAB,0xAB,0xAD,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB6,0xB6,0xB8,0xB8,0xB9,0xBA,0xBB,0xBC,0xBE,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0xD3,0xD3,0xD5,0xD5,0xD7,0xD7,0xDD,0xD9,0xDA,0xDB,0xDC,0xDD,0xE0,0xDF, \ + 0xE0,0xE2,0xE2,0xE4,0xE4,0xE6,0xE6,0xE8,0xE8,0xEA,0xEA,0xEC,0xEC,0xEE,0xEE,0xEF, \ + 0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT857 {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x98,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9E, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0x49,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xDE,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT860 {0x80,0x9A,0x90,0x8F,0x8E,0x91,0x86,0x80,0x89,0x89,0x92,0x8B,0x8C,0x98,0x8E,0x8F, \ + 0x90,0x91,0x92,0x8C,0x99,0xA9,0x96,0x9D,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x86,0x8B,0x9F,0x96,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT861 {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x8B,0x8B,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x8D,0x55,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xA4,0xA5,0xA6,0xA7,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT862 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT863 {0x43,0x55,0x45,0x41,0x41,0x41,0x86,0x43,0x45,0x45,0x45,0x49,0x49,0x8D,0x41,0x8F, \ + 0x45,0x45,0x45,0x4F,0x45,0x49,0x55,0x55,0x98,0x4F,0x55,0x9B,0x9C,0x55,0x55,0x9F, \ + 0xA0,0xA1,0x4F,0x55,0xA4,0xA5,0xA6,0xA7,0x49,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT864 {0x80,0x9A,0x45,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT865 {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT866 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT869 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x86,0x9C,0x8D,0x8F,0x90, \ + 0x91,0x90,0x92,0x95,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xA4,0xA5,0xA6,0xD9,0xDA,0xDB,0xDC,0xA7,0xA8,0xDF, \ + 0xA9,0xAA,0xAC,0xAD,0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xCF,0xCF,0xD0,0xEF, \ + 0xF0,0xF1,0xD1,0xD2,0xD3,0xF5,0xD4,0xF7,0xF8,0xF9,0xD5,0x96,0x95,0x98,0xFE,0xFF} + + +/* DBCS code range |----- 1st byte -----| |----------- 2nd byte -----------| */ +#define TBL_DC932 {0x81, 0x9F, 0xE0, 0xFC, 0x40, 0x7E, 0x80, 0xFC, 0x00, 0x00} +#define TBL_DC936 {0x81, 0xFE, 0x00, 0x00, 0x40, 0x7E, 0x80, 0xFE, 0x00, 0x00} +#define TBL_DC949 {0x81, 0xFE, 0x00, 0x00, 0x41, 0x5A, 0x61, 0x7A, 0x81, 0xFE} +#define TBL_DC950 {0x81, 0xFE, 0x00, 0x00, 0x40, 0x7E, 0xA1, 0xFE, 0x00, 0x00} + + +/* Macros for table definitions */ +#define MERGE_2STR(a, b) a ## b +#define MKCVTBL(hd, cp) MERGE_2STR(hd, cp) + + + + +/*-------------------------------------------------------------------------- + + Module Private Work Area + +---------------------------------------------------------------------------*/ +/* Remark: Variables defined here without initial value shall be guaranteed +/ zero/null at start-up. If not, the linker option or start-up routine is +/ not compliance with C standard. */ + +/*--------------------------------*/ +/* File/Volume controls */ +/*--------------------------------*/ + +#if FF_VOLUMES < 1 || FF_VOLUMES > 10 +#error Wrong FF_VOLUMES setting +#endif +static FATFS* FatFs[FF_VOLUMES]; /* Pointer to the filesystem objects (logical drives) */ +static WORD Fsid; /* Filesystem mount ID */ + +#if FF_FS_RPATH != 0 +static BYTE CurrVol; /* Current drive */ +#endif + +#if FF_FS_LOCK != 0 +static FILESEM Files[FF_FS_LOCK]; /* Open object lock semaphores */ +#endif + +#if FF_STR_VOLUME_ID +#ifdef FF_VOLUME_STRS +static const char* const VolumeStr[FF_VOLUMES] = {FF_VOLUME_STRS}; /* Pre-defined volume ID */ +#endif +#endif + + +/*--------------------------------*/ +/* LFN/Directory working buffer */ +/*--------------------------------*/ + +#if FF_USE_LFN == 0 /* Non-LFN configuration */ +#if FF_FS_EXFAT +#error LFN must be enabled when enable exFAT +#endif +#define DEF_NAMBUF +#define INIT_NAMBUF(fs) +#define FREE_NAMBUF() +#define LEAVE_MKFS(res) return res + +#else /* LFN configurations */ +#if FF_MAX_LFN < 12 || FF_MAX_LFN > 255 +#error Wrong setting of FF_MAX_LFN +#endif +#if FF_LFN_BUF < FF_SFN_BUF || FF_SFN_BUF < 12 +#error Wrong setting of FF_LFN_BUF or FF_SFN_BUF +#endif +#if FF_LFN_UNICODE < 0 || FF_LFN_UNICODE > 3 +#error Wrong setting of FF_LFN_UNICODE +#endif +static const BYTE LfnOfs[] = {1,3,5,7,9,14,16,18,20,22,24,28,30}; /* FAT: Offset of LFN characters in the directory entry */ +#define MAXDIRB(nc) ((nc + 44U) / 15 * SZDIRE) /* exFAT: Size of directory entry block scratchpad buffer needed for the name length */ + +#if FF_USE_LFN == 1 /* LFN enabled with static working buffer */ +#if FF_FS_EXFAT +static BYTE DirBuf[MAXDIRB(FF_MAX_LFN)]; /* Directory entry block scratchpad buffer */ +#endif +static WCHAR LfnBuf[FF_MAX_LFN + 1]; /* LFN working buffer */ +#define DEF_NAMBUF +#define INIT_NAMBUF(fs) +#define FREE_NAMBUF() +#define LEAVE_MKFS(res) return res + +#elif FF_USE_LFN == 2 /* LFN enabled with dynamic working buffer on the stack */ +#if FF_FS_EXFAT +#define DEF_NAMBUF WCHAR lbuf[FF_MAX_LFN+1]; BYTE dbuf[MAXDIRB(FF_MAX_LFN)]; /* LFN working buffer and directory entry block scratchpad buffer */ +#define INIT_NAMBUF(fs) { (fs)->lfnbuf = lbuf; (fs)->dirbuf = dbuf; } +#define FREE_NAMBUF() +#else +#define DEF_NAMBUF WCHAR lbuf[FF_MAX_LFN+1]; /* LFN working buffer */ +#define INIT_NAMBUF(fs) { (fs)->lfnbuf = lbuf; } +#define FREE_NAMBUF() +#endif +#define LEAVE_MKFS(res) return res + +#elif FF_USE_LFN == 3 /* LFN enabled with dynamic working buffer on the heap */ +#if FF_FS_EXFAT +#define DEF_NAMBUF WCHAR *lfn; /* Pointer to LFN working buffer and directory entry block scratchpad buffer */ +#define INIT_NAMBUF(fs) { lfn = ff_memalloc((FF_MAX_LFN+1)*2 + MAXDIRB(FF_MAX_LFN)); if (!lfn) LEAVE_FF(fs, FR_NOT_ENOUGH_CORE); (fs)->lfnbuf = lfn; (fs)->dirbuf = (BYTE*)(lfn+FF_MAX_LFN+1); } +#define FREE_NAMBUF() ff_memfree(lfn) +#else +#define DEF_NAMBUF WCHAR *lfn; /* Pointer to LFN working buffer */ +#define INIT_NAMBUF(fs) { lfn = ff_memalloc((FF_MAX_LFN+1)*2); if (!lfn) LEAVE_FF(fs, FR_NOT_ENOUGH_CORE); (fs)->lfnbuf = lfn; } +#define FREE_NAMBUF() ff_memfree(lfn) +#endif +#define LEAVE_MKFS(res) { if (!work) ff_memfree(buf); return res; } +#define MAX_MALLOC 0x8000 /* Must be >=FF_MAX_SS */ + +#else +#error Wrong setting of FF_USE_LFN + +#endif /* FF_USE_LFN == 1 */ +#endif /* FF_USE_LFN == 0 */ + + + +/*--------------------------------*/ +/* Code conversion tables */ +/*--------------------------------*/ + +#if FF_CODE_PAGE == 0 /* Run-time code page configuration */ +#define CODEPAGE CodePage +static WORD CodePage; /* Current code page */ +static const BYTE *ExCvt, *DbcTbl; /* Pointer to current SBCS up-case table and DBCS code range table below */ + +static const BYTE Ct437[] = TBL_CT437; +static const BYTE Ct720[] = TBL_CT720; +static const BYTE Ct737[] = TBL_CT737; +static const BYTE Ct771[] = TBL_CT771; +static const BYTE Ct775[] = TBL_CT775; +static const BYTE Ct850[] = TBL_CT850; +static const BYTE Ct852[] = TBL_CT852; +static const BYTE Ct855[] = TBL_CT855; +static const BYTE Ct857[] = TBL_CT857; +static const BYTE Ct860[] = TBL_CT860; +static const BYTE Ct861[] = TBL_CT861; +static const BYTE Ct862[] = TBL_CT862; +static const BYTE Ct863[] = TBL_CT863; +static const BYTE Ct864[] = TBL_CT864; +static const BYTE Ct865[] = TBL_CT865; +static const BYTE Ct866[] = TBL_CT866; +static const BYTE Ct869[] = TBL_CT869; +static const BYTE Dc932[] = TBL_DC932; +static const BYTE Dc936[] = TBL_DC936; +static const BYTE Dc949[] = TBL_DC949; +static const BYTE Dc950[] = TBL_DC950; + +#elif FF_CODE_PAGE < 900 /* Static code page configuration (SBCS) */ +#define CODEPAGE FF_CODE_PAGE +static const BYTE ExCvt[] = MKCVTBL(TBL_CT, FF_CODE_PAGE); + +#else /* Static code page configuration (DBCS) */ +#define CODEPAGE FF_CODE_PAGE +static const BYTE DbcTbl[] = MKCVTBL(TBL_DC, FF_CODE_PAGE); + +#endif + + + + +/*-------------------------------------------------------------------------- + + Module Private Functions + +---------------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------*/ +/* Load/Store multi-byte word in the FAT structure */ +/*-----------------------------------------------------------------------*/ + +static WORD ld_word (const BYTE* ptr) /* Load a 2-byte little-endian word */ +{ + WORD rv; + + rv = ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} + +static DWORD ld_dword (const BYTE* ptr) /* Load a 4-byte little-endian word */ +{ + DWORD rv; + + rv = ptr[3]; + rv = rv << 8 | ptr[2]; + rv = rv << 8 | ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} + +#if FF_FS_EXFAT +static QWORD ld_qword (const BYTE* ptr) /* Load an 8-byte little-endian word */ +{ + QWORD rv; + + rv = ptr[7]; + rv = rv << 8 | ptr[6]; + rv = rv << 8 | ptr[5]; + rv = rv << 8 | ptr[4]; + rv = rv << 8 | ptr[3]; + rv = rv << 8 | ptr[2]; + rv = rv << 8 | ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} +#endif + +#if !FF_FS_READONLY +static void st_word (BYTE* ptr, WORD val) /* Store a 2-byte word in little-endian */ +{ + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; +} + +static void st_dword (BYTE* ptr, DWORD val) /* Store a 4-byte word in little-endian */ +{ + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; +} + +#if FF_FS_EXFAT +static void st_qword (BYTE* ptr, QWORD val) /* Store an 8-byte word in little-endian */ +{ + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; +} +#endif +#endif /* !FF_FS_READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* String functions */ +/*-----------------------------------------------------------------------*/ + +/* Copy memory to memory */ +static void mem_cpy (void* dst, const void* src, UINT cnt) +{ + BYTE *d = (BYTE*)dst; + const BYTE *s = (const BYTE*)src; + + if (cnt != 0) { + do { + *d++ = *s++; + } while (--cnt); + } +} + + +/* Fill memory block */ +static void mem_set (void* dst, int val, UINT cnt) +{ + BYTE *d = (BYTE*)dst; + + do { + *d++ = (BYTE)val; + } while (--cnt); +} + + +/* Compare memory block */ +static int mem_cmp (const void* dst, const void* src, UINT cnt) /* ZR:same, NZ:different */ +{ + const BYTE *d = (const BYTE *)dst, *s = (const BYTE *)src; + int r = 0; + + do { + r = *d++ - *s++; + } while (--cnt && r == 0); + + return r; +} + + +/* Check if chr is contained in the string */ +static int chk_chr (const char* str, int chr) /* NZ:contained, ZR:not contained */ +{ + while (*str && *str != chr) str++; + return *str; +} + + +/* Test if the character is DBC 1st byte */ +static int dbc_1st (BYTE c) +{ +#if FF_CODE_PAGE == 0 /* Variable code page */ + if (DbcTbl && c >= DbcTbl[0]) { + if (c <= DbcTbl[1]) return 1; /* 1st byte range 1 */ + if (c >= DbcTbl[2] && c <= DbcTbl[3]) return 1; /* 1st byte range 2 */ + } +#elif FF_CODE_PAGE >= 900 /* DBCS fixed code page */ + if (c >= DbcTbl[0]) { + if (c <= DbcTbl[1]) return 1; + if (c >= DbcTbl[2] && c <= DbcTbl[3]) return 1; + } +#else /* SBCS fixed code page */ + if (c != 0) return 0; /* Always false */ +#endif + return 0; +} + + +/* Test if the character is DBC 2nd byte */ +static int dbc_2nd (BYTE c) +{ +#if FF_CODE_PAGE == 0 /* Variable code page */ + if (DbcTbl && c >= DbcTbl[4]) { + if (c <= DbcTbl[5]) return 1; /* 2nd byte range 1 */ + if (c >= DbcTbl[6] && c <= DbcTbl[7]) return 1; /* 2nd byte range 2 */ + if (c >= DbcTbl[8] && c <= DbcTbl[9]) return 1; /* 2nd byte range 3 */ + } +#elif FF_CODE_PAGE >= 900 /* DBCS fixed code page */ + if (c >= DbcTbl[4]) { + if (c <= DbcTbl[5]) return 1; + if (c >= DbcTbl[6] && c <= DbcTbl[7]) return 1; + if (c >= DbcTbl[8] && c <= DbcTbl[9]) return 1; + } +#else /* SBCS fixed code page */ + if (c != 0) return 0; /* Always false */ +#endif + return 0; +} + + +#if FF_USE_LFN + +/* Get a character from TCHAR string in defined API encodeing */ +static DWORD tchar2uni ( /* Returns character in UTF-16 encoding (>=0x10000 on double encoding unit, 0xFFFFFFFF on decode error) */ + const TCHAR** str /* Pointer to pointer to TCHAR string in configured encoding */ +) +{ + DWORD uc; + const TCHAR *p = *str; + +#if FF_LFN_UNICODE == 1 /* UTF-16 input */ + WCHAR wc; + + uc = *p++; /* Get a unit */ + if (IsSurrogate(uc)) { /* Surrogate? */ + wc = *p++; /* Get low surrogate */ + if (!IsSurrogateH(uc) || !IsSurrogateL(wc)) return 0xFFFFFFFF; /* Wrong surrogate? */ + uc = uc << 16 | wc; + } + +#elif FF_LFN_UNICODE == 2 /* UTF-8 input */ + BYTE b; + int nf; + + uc = (BYTE)*p++; /* Get a unit */ + if (uc & 0x80) { /* Multiple byte code? */ + if ((uc & 0xE0) == 0xC0) { /* 2-byte sequence? */ + uc &= 0x1F; nf = 1; + } else { + if ((uc & 0xF0) == 0xE0) { /* 3-byte sequence? */ + uc &= 0x0F; nf = 2; + } else { + if ((uc & 0xF8) == 0xF0) { /* 4-byte sequence? */ + uc &= 0x07; nf = 3; + } else { /* Wrong sequence */ + return 0xFFFFFFFF; + } + } + } + do { /* Get trailing bytes */ + b = (BYTE)*p++; + if ((b & 0xC0) != 0x80) return 0xFFFFFFFF; /* Wrong sequence? */ + uc = uc << 6 | (b & 0x3F); + } while (--nf != 0); + if (uc < 0x80 || IsSurrogate(uc) || uc >= 0x110000) return 0xFFFFFFFF; /* Wrong code? */ + if (uc >= 0x010000) uc = 0xD800DC00 | ((uc - 0x10000) << 6 & 0x3FF0000) | (uc & 0x3FF); /* Make a surrogate pair if needed */ + } + +#elif FF_LFN_UNICODE == 3 /* UTF-32 input */ + uc = (TCHAR)*p++; /* Get a unit */ + if (uc >= 0x110000) return 0xFFFFFFFF; /* Wrong code? */ + if (uc >= 0x010000) uc = 0xD800DC00 | ((uc - 0x10000) << 6 & 0x3FF0000) | (uc & 0x3FF); /* Make a surrogate pair if needed */ + +#else /* ANSI/OEM input */ + BYTE b; + WCHAR wc; + + wc = (BYTE)*p++; /* Get a byte */ + if (dbc_1st((BYTE)wc)) { /* Is it a DBC 1st byte? */ + b = (BYTE)*p++; /* Get 2nd byte */ + if (!dbc_2nd(b)) return 0xFFFFFFFF; /* Invalid code? */ + wc = (wc << 8) + b; /* Make a DBC */ + } + if (wc != 0) { + wc = ff_oem2uni(wc, CODEPAGE); /* ANSI/OEM ==> Unicode */ + if (wc == 0) return 0xFFFFFFFF; /* Invalid code? */ + } + uc = wc; + +#endif + *str = p; /* Next read pointer */ + return uc; +} + + +/* Output a TCHAR string in defined API encoding */ +static BYTE put_utf ( /* Returns number of encoding units written (0:buffer overflow or wrong encoding) */ + DWORD chr, /* UTF-16 encoded character (Double encoding unit char if >=0x10000) */ + TCHAR* buf, /* Output buffer */ + UINT szb /* Size of the buffer */ +) +{ +#if FF_LFN_UNICODE == 1 /* UTF-16 output */ + WCHAR hs, wc; + + hs = (WCHAR)(chr >> 16); + wc = (WCHAR)chr; + if (hs == 0) { /* Single encoding unit? */ + if (szb < 1 || IsSurrogate(wc)) return 0; /* Buffer overflow or wrong code? */ + *buf = wc; + return 1; + } + if (szb < 2 || !IsSurrogateH(hs) || !IsSurrogateL(wc)) return 0; /* Buffer overflow or wrong surrogate? */ + *buf++ = hs; + *buf++ = wc; + return 2; + +#elif FF_LFN_UNICODE == 2 /* UTF-8 output */ + DWORD hc; + + if (chr < 0x80) { /* Single byte code? */ + if (szb < 1) return 0; /* Buffer overflow? */ + *buf = (TCHAR)chr; + return 1; + } + if (chr < 0x800) { /* 2-byte sequence? */ + if (szb < 2) return 0; /* Buffer overflow? */ + *buf++ = (TCHAR)(0xC0 | (chr >> 6 & 0x1F)); + *buf++ = (TCHAR)(0x80 | (chr >> 0 & 0x3F)); + return 2; + } + if (chr < 0x10000) { /* 3-byte sequence? */ + if (szb < 3 || IsSurrogate(chr)) return 0; /* Buffer overflow or wrong code? */ + *buf++ = (TCHAR)(0xE0 | (chr >> 12 & 0x0F)); + *buf++ = (TCHAR)(0x80 | (chr >> 6 & 0x3F)); + *buf++ = (TCHAR)(0x80 | (chr >> 0 & 0x3F)); + return 3; + } + /* 4-byte sequence */ + if (szb < 4) return 0; /* Buffer overflow? */ + hc = ((chr & 0xFFFF0000) - 0xD8000000) >> 6; /* Get high 10 bits */ + chr = (chr & 0xFFFF) - 0xDC00; /* Get low 10 bits */ + if (hc >= 0x100000 || chr >= 0x400) return 0; /* Wrong surrogate? */ + chr = (hc | chr) + 0x10000; + *buf++ = (TCHAR)(0xF0 | (chr >> 18 & 0x07)); + *buf++ = (TCHAR)(0x80 | (chr >> 12 & 0x3F)); + *buf++ = (TCHAR)(0x80 | (chr >> 6 & 0x3F)); + *buf++ = (TCHAR)(0x80 | (chr >> 0 & 0x3F)); + return 4; + +#elif FF_LFN_UNICODE == 3 /* UTF-32 output */ + DWORD hc; + + if (szb < 1) return 0; /* Buffer overflow? */ + if (chr >= 0x10000) { /* Out of BMP? */ + hc = ((chr & 0xFFFF0000) - 0xD8000000) >> 6; /* Get high 10 bits */ + chr = (chr & 0xFFFF) - 0xDC00; /* Get low 10 bits */ + if (hc >= 0x100000 || chr >= 0x400) return 0; /* Wrong surrogate? */ + chr = (hc | chr) + 0x10000; + } + *buf++ = (TCHAR)chr; + return 1; + +#else /* ANSI/OEM output */ + WCHAR wc; + + wc = ff_uni2oem(chr, CODEPAGE); + if (wc >= 0x100) { /* Is this a DBC? */ + if (szb < 2) return 0; + *buf++ = (char)(wc >> 8); /* Store DBC 1st byte */ + *buf++ = (TCHAR)wc; /* Store DBC 2nd byte */ + return 2; + } + if (wc == 0 || szb < 1) return 0; /* Invalid char or buffer overflow? */ + *buf++ = (TCHAR)wc; /* Store the character */ + return 1; +#endif +} +#endif /* FF_USE_LFN */ + + +#if FF_FS_REENTRANT +/*-----------------------------------------------------------------------*/ +/* Request/Release grant to access the volume */ +/*-----------------------------------------------------------------------*/ +static int lock_fs ( /* 1:Ok, 0:timeout */ + FATFS* fs /* Filesystem object */ +) +{ + return ff_req_grant(fs->sobj); +} + + +static void unlock_fs ( + FATFS* fs, /* Filesystem object */ + FRESULT res /* Result code to be returned */ +) +{ + if (fs && res != FR_NOT_ENABLED && res != FR_INVALID_DRIVE && res != FR_TIMEOUT) { + ff_rel_grant(fs->sobj); + } +} + +#endif + + + +#if FF_FS_LOCK != 0 +/*-----------------------------------------------------------------------*/ +/* File lock control functions */ +/*-----------------------------------------------------------------------*/ + +static FRESULT chk_lock ( /* Check if the file can be accessed */ + DIR* dp, /* Directory object pointing the file to be checked */ + int acc /* Desired access type (0:Read mode open, 1:Write mode open, 2:Delete or rename) */ +) +{ + UINT i, be; + + /* Search open object table for the object */ + be = 0; + for (i = 0; i < FF_FS_LOCK; i++) { + if (Files[i].fs) { /* Existing entry */ + if (Files[i].fs == dp->obj.fs && /* Check if the object matches with an open object */ + Files[i].clu == dp->obj.sclust && + Files[i].ofs == dp->dptr) break; + } else { /* Blank entry */ + be = 1; + } + } + if (i == FF_FS_LOCK) { /* The object has not been opened */ + return (!be && acc != 2) ? FR_TOO_MANY_OPEN_FILES : FR_OK; /* Is there a blank entry for new object? */ + } + + /* The object was opened. Reject any open against writing file and all write mode open */ + return (acc != 0 || Files[i].ctr == 0x100) ? FR_LOCKED : FR_OK; +} + + +static int enq_lock (void) /* Check if an entry is available for a new object */ +{ + UINT i; + + for (i = 0; i < FF_FS_LOCK && Files[i].fs; i++) ; + return (i == FF_FS_LOCK) ? 0 : 1; +} + + +static UINT inc_lock ( /* Increment object open counter and returns its index (0:Internal error) */ + DIR* dp, /* Directory object pointing the file to register or increment */ + int acc /* Desired access (0:Read, 1:Write, 2:Delete/Rename) */ +) +{ + UINT i; + + + for (i = 0; i < FF_FS_LOCK; i++) { /* Find the object */ + if (Files[i].fs == dp->obj.fs && + Files[i].clu == dp->obj.sclust && + Files[i].ofs == dp->dptr) break; + } + + if (i == FF_FS_LOCK) { /* Not opened. Register it as new. */ + for (i = 0; i < FF_FS_LOCK && Files[i].fs; i++) ; + if (i == FF_FS_LOCK) return 0; /* No free entry to register (int err) */ + Files[i].fs = dp->obj.fs; + Files[i].clu = dp->obj.sclust; + Files[i].ofs = dp->dptr; + Files[i].ctr = 0; + } + + if (acc >= 1 && Files[i].ctr) return 0; /* Access violation (int err) */ + + Files[i].ctr = acc ? 0x100 : Files[i].ctr + 1; /* Set semaphore value */ + + return i + 1; /* Index number origin from 1 */ +} + + +static FRESULT dec_lock ( /* Decrement object open counter */ + UINT i /* Semaphore index (1..) */ +) +{ + WORD n; + FRESULT res; + + + if (--i < FF_FS_LOCK) { /* Index number origin from 0 */ + n = Files[i].ctr; + if (n == 0x100) n = 0; /* If write mode open, delete the entry */ + if (n > 0) n--; /* Decrement read mode open count */ + Files[i].ctr = n; + if (n == 0) Files[i].fs = 0; /* Delete the entry if open count gets zero */ + res = FR_OK; + } else { + res = FR_INT_ERR; /* Invalid index nunber */ + } + return res; +} + + +static void clear_lock ( /* Clear lock entries of the volume */ + FATFS *fs +) +{ + UINT i; + + for (i = 0; i < FF_FS_LOCK; i++) { + if (Files[i].fs == fs) Files[i].fs = 0; + } +} + +#endif /* FF_FS_LOCK != 0 */ + + + +/*-----------------------------------------------------------------------*/ +/* Move/Flush disk access window in the filesystem object */ +/*-----------------------------------------------------------------------*/ +#if !FF_FS_READONLY +static FRESULT sync_window ( /* Returns FR_OK or FR_DISK_ERR */ + FATFS* fs /* Filesystem object */ +) +{ + FRESULT res = FR_OK; + + + if (fs->wflag) { /* Is the disk access window dirty */ + if (disk_write(fs->pdrv, fs->win, fs->winsect, 1) == RES_OK) { /* Write back the window */ + fs->wflag = 0; /* Clear window dirty flag */ + if (fs->winsect - fs->fatbase < fs->fsize) { /* Is it in the 1st FAT? */ + if (fs->n_fats == 2) disk_write(fs->pdrv, fs->win, fs->winsect + fs->fsize, 1); /* Reflect it to 2nd FAT if needed */ + } + } else { + res = FR_DISK_ERR; + } + } + return res; +} +#endif + + +static FRESULT move_window ( /* Returns FR_OK or FR_DISK_ERR */ + FATFS* fs, /* Filesystem object */ + DWORD sector /* Sector number to make appearance in the fs->win[] */ +) +{ + FRESULT res = FR_OK; + + + if (sector != fs->winsect) { /* Window offset changed? */ +#if !FF_FS_READONLY + res = sync_window(fs); /* Write-back changes */ +#endif + if (res == FR_OK) { /* Fill sector window with new data */ + if (disk_read(fs->pdrv, fs->win, sector, 1) != RES_OK) { + sector = 0xFFFFFFFF; /* Invalidate window if read data is not valid */ + res = FR_DISK_ERR; + } + fs->winsect = sector; + } + } + return res; +} + + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Synchronize filesystem and data on the storage */ +/*-----------------------------------------------------------------------*/ + +static FRESULT sync_fs ( /* Returns FR_OK or FR_DISK_ERR */ + FATFS* fs /* Filesystem object */ +) +{ + FRESULT res; + + + res = sync_window(fs); + if (res == FR_OK) { + if (fs->fs_type == FS_FAT32 && fs->fsi_flag == 1) { /* FAT32: Update FSInfo sector if needed */ + /* Create FSInfo structure */ + mem_set(fs->win, 0, sizeof fs->win); + st_word(fs->win + BS_55AA, 0xAA55); + st_dword(fs->win + FSI_LeadSig, 0x41615252); + st_dword(fs->win + FSI_StrucSig, 0x61417272); + st_dword(fs->win + FSI_Free_Count, fs->free_clst); + st_dword(fs->win + FSI_Nxt_Free, fs->last_clst); + /* Write it into the FSInfo sector */ + fs->winsect = fs->volbase + 1; + disk_write(fs->pdrv, fs->win, fs->winsect, 1); + fs->fsi_flag = 0; + } + /* Make sure that no pending write process in the lower layer */ + if (disk_ioctl(fs->pdrv, CTRL_SYNC, 0) != RES_OK) res = FR_DISK_ERR; + } + + return res; +} + +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Get physical sector number from cluster number */ +/*-----------------------------------------------------------------------*/ + +static DWORD clst2sect ( /* !=0:Sector number, 0:Failed (invalid cluster#) */ + FATFS* fs, /* Filesystem object */ + DWORD clst /* Cluster# to be converted */ +) +{ + clst -= 2; /* Cluster number is origin from 2 */ + if (clst >= fs->n_fatent - 2) return 0; /* Is it invalid cluster number? */ + return fs->database + fs->csize * clst; /* Start sector number of the cluster */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* FAT access - Read value of a FAT entry */ +/*-----------------------------------------------------------------------*/ + +static DWORD get_fat ( /* 0xFFFFFFFF:Disk error, 1:Internal error, 2..0x7FFFFFFF:Cluster status */ + FFOBJID* obj, /* Corresponding object */ + DWORD clst /* Cluster number to get the value */ +) +{ + UINT wc, bc; + DWORD val; + FATFS *fs = obj->fs; + + + if (clst < 2 || clst >= fs->n_fatent) { /* Check if in valid range */ + val = 1; /* Internal error */ + + } else { + val = 0xFFFFFFFF; /* Default value falls on disk error */ + + switch (fs->fs_type) { + case FS_FAT12 : + bc = (UINT)clst; bc += bc / 2; + if (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) break; + wc = fs->win[bc++ % SS(fs)]; /* Get 1st byte of the entry */ + if (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) break; + wc |= fs->win[bc % SS(fs)] << 8; /* Merge 2nd byte of the entry */ + val = (clst & 1) ? (wc >> 4) : (wc & 0xFFF); /* Adjust bit position */ + break; + + case FS_FAT16 : + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))) != FR_OK) break; + val = ld_word(fs->win + clst * 2 % SS(fs)); /* Simple WORD array */ + break; + + case FS_FAT32 : + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))) != FR_OK) break; + val = ld_dword(fs->win + clst * 4 % SS(fs)) & 0x0FFFFFFF; /* Simple DWORD array but mask out upper 4 bits */ + break; +#if FF_FS_EXFAT + case FS_EXFAT : + if ((obj->objsize != 0 && obj->sclust != 0) || obj->stat == 0) { /* Object except root dir must have valid data length */ + DWORD cofs = clst - obj->sclust; /* Offset from start cluster */ + DWORD clen = (DWORD)((obj->objsize - 1) / SS(fs)) / fs->csize; /* Number of clusters - 1 */ + + if (obj->stat == 2 && cofs <= clen) { /* Is it a contiguous chain? */ + val = (cofs == clen) ? 0x7FFFFFFF : clst + 1; /* No data on the FAT, generate the value */ + break; + } + if (obj->stat == 3 && cofs < obj->n_cont) { /* Is it in the 1st fragment? */ + val = clst + 1; /* Generate the value */ + break; + } + if (obj->stat != 2) { /* Get value from FAT if FAT chain is valid */ + if (obj->n_frag != 0) { /* Is it on the growing edge? */ + val = 0x7FFFFFFF; /* Generate EOC */ + } else { + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))) != FR_OK) break; + val = ld_dword(fs->win + clst * 4 % SS(fs)) & 0x7FFFFFFF; + } + break; + } + } + /* go to default */ +#endif + default: + val = 1; /* Internal error */ + } + } + + return val; +} + + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* FAT access - Change value of a FAT entry */ +/*-----------------------------------------------------------------------*/ + +static FRESULT put_fat ( /* FR_OK(0):succeeded, !=0:error */ + FATFS* fs, /* Corresponding filesystem object */ + DWORD clst, /* FAT index number (cluster number) to be changed */ + DWORD val /* New value to be set to the entry */ +) +{ + UINT bc; + BYTE *p; + FRESULT res = FR_INT_ERR; + + + if (clst >= 2 && clst < fs->n_fatent) { /* Check if in valid range */ + switch (fs->fs_type) { + case FS_FAT12 : + bc = (UINT)clst; bc += bc / 2; /* bc: byte offset of the entry */ + res = move_window(fs, fs->fatbase + (bc / SS(fs))); + if (res != FR_OK) break; + p = fs->win + bc++ % SS(fs); + *p = (clst & 1) ? ((*p & 0x0F) | ((BYTE)val << 4)) : (BYTE)val; /* Put 1st byte */ + fs->wflag = 1; + res = move_window(fs, fs->fatbase + (bc / SS(fs))); + if (res != FR_OK) break; + p = fs->win + bc % SS(fs); + *p = (clst & 1) ? (BYTE)(val >> 4) : ((*p & 0xF0) | ((BYTE)(val >> 8) & 0x0F)); /* Put 2nd byte */ + fs->wflag = 1; + break; + + case FS_FAT16 : + res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))); + if (res != FR_OK) break; + st_word(fs->win + clst * 2 % SS(fs), (WORD)val); /* Simple WORD array */ + fs->wflag = 1; + break; + + case FS_FAT32 : +#if FF_FS_EXFAT + case FS_EXFAT : +#endif + res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))); + if (res != FR_OK) break; + if (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) { + val = (val & 0x0FFFFFFF) | (ld_dword(fs->win + clst * 4 % SS(fs)) & 0xF0000000); + } + st_dword(fs->win + clst * 4 % SS(fs), val); + fs->wflag = 1; + break; + } + } + return res; +} + +#endif /* !FF_FS_READONLY */ + + + + +#if FF_FS_EXFAT && !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* exFAT: Accessing FAT and Allocation Bitmap */ +/*-----------------------------------------------------------------------*/ + +/*--------------------------------------*/ +/* Find a contiguous free cluster block */ +/*--------------------------------------*/ + +static DWORD find_bitmap ( /* 0:Not found, 2..:Cluster block found, 0xFFFFFFFF:Disk error */ + FATFS* fs, /* Filesystem object */ + DWORD clst, /* Cluster number to scan from */ + DWORD ncl /* Number of contiguous clusters to find (1..) */ +) +{ + BYTE bm, bv; + UINT i; + DWORD val, scl, ctr; + + + clst -= 2; /* The first bit in the bitmap corresponds to cluster #2 */ + if (clst >= fs->n_fatent - 2) clst = 0; + scl = val = clst; ctr = 0; + for (;;) { + if (move_window(fs, fs->bitbase + val / 8 / SS(fs)) != FR_OK) return 0xFFFFFFFF; + i = val / 8 % SS(fs); bm = 1 << (val % 8); + do { + do { + bv = fs->win[i] & bm; bm <<= 1; /* Get bit value */ + if (++val >= fs->n_fatent - 2) { /* Next cluster (with wrap-around) */ + val = 0; bm = 0; i = SS(fs); + } + if (bv == 0) { /* Is it a free cluster? */ + if (++ctr == ncl) return scl + 2; /* Check if run length is sufficient for required */ + } else { + scl = val; ctr = 0; /* Encountered a cluster in-use, restart to scan */ + } + if (val == clst) return 0; /* All cluster scanned? */ + } while (bm != 0); + bm = 1; + } while (++i < SS(fs)); + } +} + + +/*----------------------------------------*/ +/* Set/Clear a block of allocation bitmap */ +/*----------------------------------------*/ + +static FRESULT change_bitmap ( + FATFS* fs, /* Filesystem object */ + DWORD clst, /* Cluster number to change from */ + DWORD ncl, /* Number of clusters to be changed */ + int bv /* bit value to be set (0 or 1) */ +) +{ + BYTE bm; + UINT i; + DWORD sect; + + + clst -= 2; /* The first bit corresponds to cluster #2 */ + sect = fs->bitbase + clst / 8 / SS(fs); /* Sector address */ + i = clst / 8 % SS(fs); /* Byte offset in the sector */ + bm = 1 << (clst % 8); /* Bit mask in the byte */ + for (;;) { + if (move_window(fs, sect++) != FR_OK) return FR_DISK_ERR; + do { + do { + if (bv == (int)((fs->win[i] & bm) != 0)) return FR_INT_ERR; /* Is the bit expected value? */ + fs->win[i] ^= bm; /* Flip the bit */ + fs->wflag = 1; + if (--ncl == 0) return FR_OK; /* All bits processed? */ + } while (bm <<= 1); /* Next bit */ + bm = 1; + } while (++i < SS(fs)); /* Next byte */ + i = 0; + } +} + + +/*---------------------------------------------*/ +/* Fill the first fragment of the FAT chain */ +/*---------------------------------------------*/ + +static FRESULT fill_first_frag ( + FFOBJID* obj /* Pointer to the corresponding object */ +) +{ + FRESULT res; + DWORD cl, n; + + + if (obj->stat == 3) { /* Has the object been changed 'fragmented' in this session? */ + for (cl = obj->sclust, n = obj->n_cont; n; cl++, n--) { /* Create cluster chain on the FAT */ + res = put_fat(obj->fs, cl, cl + 1); + if (res != FR_OK) return res; + } + obj->stat = 0; /* Change status 'FAT chain is valid' */ + } + return FR_OK; +} + + +/*---------------------------------------------*/ +/* Fill the last fragment of the FAT chain */ +/*---------------------------------------------*/ + +static FRESULT fill_last_frag ( + FFOBJID* obj, /* Pointer to the corresponding object */ + DWORD lcl, /* Last cluster of the fragment */ + DWORD term /* Value to set the last FAT entry */ +) +{ + FRESULT res; + + + while (obj->n_frag > 0) { /* Create the chain of last fragment */ + res = put_fat(obj->fs, lcl - obj->n_frag + 1, (obj->n_frag > 1) ? lcl - obj->n_frag + 2 : term); + if (res != FR_OK) return res; + obj->n_frag--; + } + return FR_OK; +} + +#endif /* FF_FS_EXFAT && !FF_FS_READONLY */ + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* FAT handling - Remove a cluster chain */ +/*-----------------------------------------------------------------------*/ + +static FRESULT remove_chain ( /* FR_OK(0):succeeded, !=0:error */ + FFOBJID* obj, /* Corresponding object */ + DWORD clst, /* Cluster to remove a chain from */ + DWORD pclst /* Previous cluster of clst (0 if entire chain) */ +) +{ + FRESULT res = FR_OK; + DWORD nxt; + FATFS *fs = obj->fs; +#if FF_FS_EXFAT || FF_USE_TRIM + DWORD scl = clst, ecl = clst; +#endif +#if FF_USE_TRIM + DWORD rt[2]; +#endif + + if (clst < 2 || clst >= fs->n_fatent) return FR_INT_ERR; /* Check if in valid range */ + + /* Mark the previous cluster 'EOC' on the FAT if it exists */ + if (pclst != 0 && (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT || obj->stat != 2)) { + res = put_fat(fs, pclst, 0xFFFFFFFF); + if (res != FR_OK) return res; + } + + /* Remove the chain */ + do { + nxt = get_fat(obj, clst); /* Get cluster status */ + if (nxt == 0) break; /* Empty cluster? */ + if (nxt == 1) return FR_INT_ERR; /* Internal error? */ + if (nxt == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error? */ + if (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) { + res = put_fat(fs, clst, 0); /* Mark the cluster 'free' on the FAT */ + if (res != FR_OK) return res; + } + if (fs->free_clst < fs->n_fatent - 2) { /* Update FSINFO */ + fs->free_clst++; + fs->fsi_flag |= 1; + } +#if FF_FS_EXFAT || FF_USE_TRIM + if (ecl + 1 == nxt) { /* Is next cluster contiguous? */ + ecl = nxt; + } else { /* End of contiguous cluster block */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + res = change_bitmap(fs, scl, ecl - scl + 1, 0); /* Mark the cluster block 'free' on the bitmap */ + if (res != FR_OK) return res; + } +#endif +#if FF_USE_TRIM + rt[0] = clst2sect(fs, scl); /* Start of data area freed */ + rt[1] = clst2sect(fs, ecl) + fs->csize - 1; /* End of data area freed */ + disk_ioctl(fs->pdrv, CTRL_TRIM, rt); /* Inform device the data in the block is no longer needed */ +#endif + scl = ecl = nxt; + } +#endif + clst = nxt; /* Next cluster */ + } while (clst < fs->n_fatent); /* Repeat while not the last link */ + +#if FF_FS_EXFAT + /* Some post processes for chain status */ + if (fs->fs_type == FS_EXFAT) { + if (pclst == 0) { /* Has the entire chain been removed? */ + obj->stat = 0; /* Change the chain status 'initial' */ + } else { + if (obj->stat == 0) { /* Is it a fragmented chain from the beginning of this session? */ + clst = obj->sclust; /* Follow the chain to check if it gets contiguous */ + while (clst != pclst) { + nxt = get_fat(obj, clst); + if (nxt < 2) return FR_INT_ERR; + if (nxt == 0xFFFFFFFF) return FR_DISK_ERR; + if (nxt != clst + 1) break; /* Not contiguous? */ + clst++; + } + if (clst == pclst) { /* Has the chain got contiguous again? */ + obj->stat = 2; /* Change the chain status 'contiguous' */ + } + } else { + if (obj->stat == 3 && pclst >= obj->sclust && pclst <= obj->sclust + obj->n_cont) { /* Was the chain fragmented in this session and got contiguous again? */ + obj->stat = 2; /* Change the chain status 'contiguous' */ + } + } + } + } +#endif + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* FAT handling - Stretch a chain or Create a new chain */ +/*-----------------------------------------------------------------------*/ + +static DWORD create_chain ( /* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk error, >=2:New cluster# */ + FFOBJID* obj, /* Corresponding object */ + DWORD clst /* Cluster# to stretch, 0:Create a new chain */ +) +{ + DWORD cs, ncl, scl; + FRESULT res; + FATFS *fs = obj->fs; + + + if (clst == 0) { /* Create a new chain */ + scl = fs->last_clst; /* Suggested cluster to start to find */ + if (scl == 0 || scl >= fs->n_fatent) scl = 1; + } + else { /* Stretch a chain */ + cs = get_fat(obj, clst); /* Check the cluster status */ + if (cs < 2) return 1; /* Test for insanity */ + if (cs == 0xFFFFFFFF) return cs; /* Test for disk error */ + if (cs < fs->n_fatent) return cs; /* It is already followed by next cluster */ + scl = clst; /* Cluster to start to find */ + } + if (fs->free_clst == 0) return 0; /* No free cluster */ + +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + ncl = find_bitmap(fs, scl, 1); /* Find a free cluster */ + if (ncl == 0 || ncl == 0xFFFFFFFF) return ncl; /* No free cluster or hard error? */ + res = change_bitmap(fs, ncl, 1, 1); /* Mark the cluster 'in use' */ + if (res == FR_INT_ERR) return 1; + if (res == FR_DISK_ERR) return 0xFFFFFFFF; + if (clst == 0) { /* Is it a new chain? */ + obj->stat = 2; /* Set status 'contiguous' */ + } else { /* It is a stretched chain */ + if (obj->stat == 2 && ncl != scl + 1) { /* Is the chain got fragmented? */ + obj->n_cont = scl - obj->sclust; /* Set size of the contiguous part */ + obj->stat = 3; /* Change status 'just fragmented' */ + } + } + if (obj->stat != 2) { /* Is the file non-contiguous? */ + if (ncl == clst + 1) { /* Is the cluster next to previous one? */ + obj->n_frag = obj->n_frag ? obj->n_frag + 1 : 2; /* Increment size of last framgent */ + } else { /* New fragment */ + if (obj->n_frag == 0) obj->n_frag = 1; + res = fill_last_frag(obj, clst, ncl); /* Fill last fragment on the FAT and link it to new one */ + if (res == FR_OK) obj->n_frag = 1; + } + } + } else +#endif + { /* On the FAT/FAT32 volume */ + ncl = 0; + if (scl == clst) { /* Stretching an existing chain? */ + ncl = scl + 1; /* Test if next cluster is free */ + if (ncl >= fs->n_fatent) ncl = 2; + cs = get_fat(obj, ncl); /* Get next cluster status */ + if (cs == 1 || cs == 0xFFFFFFFF) return cs; /* Test for error */ + if (cs != 0) { /* Not free? */ + cs = fs->last_clst; /* Start at suggested cluster if it is valid */ + if (cs >= 2 && cs < fs->n_fatent) scl = cs; + ncl = 0; + } + } + if (ncl == 0) { /* The new cluster cannot be contiguous and find another fragment */ + ncl = scl; /* Start cluster */ + for (;;) { + ncl++; /* Next cluster */ + if (ncl >= fs->n_fatent) { /* Check wrap-around */ + ncl = 2; + if (ncl > scl) return 0; /* No free cluster found? */ + } + cs = get_fat(obj, ncl); /* Get the cluster status */ + if (cs == 0) break; /* Found a free cluster? */ + if (cs == 1 || cs == 0xFFFFFFFF) return cs; /* Test for error */ + if (ncl == scl) return 0; /* No free cluster found? */ + } + } + res = put_fat(fs, ncl, 0xFFFFFFFF); /* Mark the new cluster 'EOC' */ + if (res == FR_OK && clst != 0) { + res = put_fat(fs, clst, ncl); /* Link it from the previous one if needed */ + } + } + + if (res == FR_OK) { /* Update FSINFO if function succeeded. */ + fs->last_clst = ncl; + if (fs->free_clst <= fs->n_fatent - 2) fs->free_clst--; + fs->fsi_flag |= 1; + } else { + ncl = (res == FR_DISK_ERR) ? 0xFFFFFFFF : 1; /* Failed. Generate error status */ + } + + return ncl; /* Return new cluster number or error status */ +} + +#endif /* !FF_FS_READONLY */ + + + + +#if FF_USE_FASTSEEK +/*-----------------------------------------------------------------------*/ +/* FAT handling - Convert offset into cluster with link map table */ +/*-----------------------------------------------------------------------*/ + +static DWORD clmt_clust ( /* <2:Error, >=2:Cluster number */ + FIL* fp, /* Pointer to the file object */ + FSIZE_t ofs /* File offset to be converted to cluster# */ +) +{ + DWORD cl, ncl, *tbl; + FATFS *fs = fp->obj.fs; + + + tbl = fp->cltbl + 1; /* Top of CLMT */ + cl = (DWORD)(ofs / SS(fs) / fs->csize); /* Cluster order from top of the file */ + for (;;) { + ncl = *tbl++; /* Number of cluters in the fragment */ + if (ncl == 0) return 0; /* End of table? (error) */ + if (cl < ncl) break; /* In this fragment? */ + cl -= ncl; tbl++; /* Next fragment */ + } + return cl + *tbl; /* Return the cluster number */ +} + +#endif /* FF_USE_FASTSEEK */ + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Fill a cluster with zeros */ +/*-----------------------------------------------------------------------*/ + +#if !FF_FS_READONLY +static FRESULT dir_clear ( /* Returns FR_OK or FR_DISK_ERR */ + FATFS *fs, /* Filesystem object */ + DWORD clst /* Directory table to clear */ +) +{ + DWORD sect; + UINT n, szb; + BYTE *ibuf; + + + if (sync_window(fs) != FR_OK) return FR_DISK_ERR; /* Flush disk access window */ + sect = clst2sect(fs, clst); /* Top of the cluster */ + fs->winsect = sect; /* Set window to top of the cluster */ + mem_set(fs->win, 0, sizeof fs->win); /* Clear window buffer */ +#if FF_USE_LFN == 3 /* Quick table clear by using multi-secter write */ + /* Allocate a temporary buffer */ + for (szb = ((DWORD)fs->csize * SS(fs) >= MAX_MALLOC) ? MAX_MALLOC : fs->csize * SS(fs), ibuf = 0; szb > SS(fs) && (ibuf = ff_memalloc(szb)) == 0; szb /= 2) ; + if (szb > SS(fs)) { /* Buffer allocated? */ + mem_set(ibuf, 0, szb); + szb /= SS(fs); /* Bytes -> Sectors */ + for (n = 0; n < fs->csize && disk_write(fs->pdrv, ibuf, sect + n, szb) == RES_OK; n += szb) ; /* Fill the cluster with 0 */ + ff_memfree(ibuf); + } else +#endif + { + ibuf = fs->win; szb = 1; /* Use window buffer (many single-sector writes may take a time) */ + for (n = 0; n < fs->csize && disk_write(fs->pdrv, ibuf, sect + n, szb) == RES_OK; n += szb) ; /* Fill the cluster with 0 */ + } + return (n == fs->csize) ? FR_OK : FR_DISK_ERR; +} +#endif /* !FF_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Set directory index */ +/*-----------------------------------------------------------------------*/ + +static FRESULT dir_sdi ( /* FR_OK(0):succeeded, !=0:error */ + DIR* dp, /* Pointer to directory object */ + DWORD ofs /* Offset of directory table */ +) +{ + DWORD csz, clst; + FATFS *fs = dp->obj.fs; + + + if (ofs >= (DWORD)((FF_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX : MAX_DIR) || ofs % SZDIRE) { /* Check range of offset and alignment */ + return FR_INT_ERR; + } + dp->dptr = ofs; /* Set current offset */ + clst = dp->obj.sclust; /* Table start cluster (0:root) */ + if (clst == 0 && fs->fs_type >= FS_FAT32) { /* Replace cluster# 0 with root cluster# */ + clst = fs->dirbase; + if (FF_FS_EXFAT) dp->obj.stat = 0; /* exFAT: Root dir has an FAT chain */ + } + + if (clst == 0) { /* Static table (root-directory on the FAT volume) */ + if (ofs / SZDIRE >= fs->n_rootdir) return FR_INT_ERR; /* Is index out of range? */ + dp->sect = fs->dirbase; + + } else { /* Dynamic table (sub-directory or root-directory on the FAT32/exFAT volume) */ + csz = (DWORD)fs->csize * SS(fs); /* Bytes per cluster */ + while (ofs >= csz) { /* Follow cluster chain */ + clst = get_fat(&dp->obj, clst); /* Get next cluster */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (clst < 2 || clst >= fs->n_fatent) return FR_INT_ERR; /* Reached to end of table or internal error */ + ofs -= csz; + } + dp->sect = clst2sect(fs, clst); + } + dp->clust = clst; /* Current cluster# */ + if (dp->sect == 0) return FR_INT_ERR; + dp->sect += ofs / SS(fs); /* Sector# of the directory entry */ + dp->dir = fs->win + (ofs % SS(fs)); /* Pointer to the entry in the win[] */ + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Move directory table index next */ +/*-----------------------------------------------------------------------*/ + +static FRESULT dir_next ( /* FR_OK(0):succeeded, FR_NO_FILE:End of table, FR_DENIED:Could not stretch */ + DIR* dp, /* Pointer to the directory object */ + int stretch /* 0: Do not stretch table, 1: Stretch table if needed */ +) +{ + DWORD ofs, clst; + FATFS *fs = dp->obj.fs; + + + ofs = dp->dptr + SZDIRE; /* Next entry */ + if (ofs >= (DWORD)((FF_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX : MAX_DIR)) dp->sect = 0; /* Disable it if the offset reached the max value */ + if (dp->sect == 0) return FR_NO_FILE; /* Report EOT if it has been disabled */ + + if (ofs % SS(fs) == 0) { /* Sector changed? */ + dp->sect++; /* Next sector */ + + if (dp->clust == 0) { /* Static table */ + if (ofs / SZDIRE >= fs->n_rootdir) { /* Report EOT if it reached end of static table */ + dp->sect = 0; return FR_NO_FILE; + } + } + else { /* Dynamic table */ + if ((ofs / SS(fs) & (fs->csize - 1)) == 0) { /* Cluster changed? */ + clst = get_fat(&dp->obj, dp->clust); /* Get next cluster */ + if (clst <= 1) return FR_INT_ERR; /* Internal error */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (clst >= fs->n_fatent) { /* It reached end of dynamic table */ +#if !FF_FS_READONLY + if (!stretch) { /* If no stretch, report EOT */ + dp->sect = 0; return FR_NO_FILE; + } + clst = create_chain(&dp->obj, dp->clust); /* Allocate a cluster */ + if (clst == 0) return FR_DENIED; /* No free cluster */ + if (clst == 1) return FR_INT_ERR; /* Internal error */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (dir_clear(fs, clst) != FR_OK) return FR_DISK_ERR; /* Clean up the stretched table */ + if (FF_FS_EXFAT) dp->obj.stat |= 4; /* exFAT: The directory has been stretched */ +#else + if (!stretch) dp->sect = 0; /* (this line is to suppress compiler warning) */ + dp->sect = 0; return FR_NO_FILE; /* Report EOT */ +#endif + } + dp->clust = clst; /* Initialize data for new cluster */ + dp->sect = clst2sect(fs, clst); + } + } + } + dp->dptr = ofs; /* Current entry */ + dp->dir = fs->win + ofs % SS(fs); /* Pointer to the entry in the win[] */ + + return FR_OK; +} + + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Directory handling - Reserve a block of directory entries */ +/*-----------------------------------------------------------------------*/ + +static FRESULT dir_alloc ( /* FR_OK(0):succeeded, !=0:error */ + DIR* dp, /* Pointer to the directory object */ + UINT nent /* Number of contiguous entries to allocate */ +) +{ + FRESULT res; + UINT n; + FATFS *fs = dp->obj.fs; + + + res = dir_sdi(dp, 0); + if (res == FR_OK) { + n = 0; + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; +#if FF_FS_EXFAT + if ((fs->fs_type == FS_EXFAT) ? (int)((dp->dir[XDIR_Type] & 0x80) == 0) : (int)(dp->dir[DIR_Name] == DDEM || dp->dir[DIR_Name] == 0)) { +#else + if (dp->dir[DIR_Name] == DDEM || dp->dir[DIR_Name] == 0) { +#endif + if (++n == nent) break; /* A block of contiguous free entries is found */ + } else { + n = 0; /* Not a blank entry. Restart to search */ + } + res = dir_next(dp, 1); + } while (res == FR_OK); /* Next entry with table stretch enabled */ + } + + if (res == FR_NO_FILE) res = FR_DENIED; /* No directory entry to allocate */ + return res; +} + +#endif /* !FF_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* FAT: Directory handling - Load/Store start cluster number */ +/*-----------------------------------------------------------------------*/ + +static DWORD ld_clust ( /* Returns the top cluster value of the SFN entry */ + FATFS* fs, /* Pointer to the fs object */ + const BYTE* dir /* Pointer to the key entry */ +) +{ + DWORD cl; + + cl = ld_word(dir + DIR_FstClusLO); + if (fs->fs_type == FS_FAT32) { + cl |= (DWORD)ld_word(dir + DIR_FstClusHI) << 16; + } + + return cl; +} + + +#if !FF_FS_READONLY +static void st_clust ( + FATFS* fs, /* Pointer to the fs object */ + BYTE* dir, /* Pointer to the key entry */ + DWORD cl /* Value to be set */ +) +{ + st_word(dir + DIR_FstClusLO, (WORD)cl); + if (fs->fs_type == FS_FAT32) { + st_word(dir + DIR_FstClusHI, (WORD)(cl >> 16)); + } +} +#endif + + + +#if FF_USE_LFN +/*--------------------------------------------------------*/ +/* FAT-LFN: Compare a part of file name with an LFN entry */ +/*--------------------------------------------------------*/ + +static int cmp_lfn ( /* 1:matched, 0:not matched */ + const WCHAR* lfnbuf, /* Pointer to the LFN working buffer to be compared */ + BYTE* dir /* Pointer to the directory entry containing the part of LFN */ +) +{ + UINT i, s; + WCHAR wc, uc; + + + if (ld_word(dir + LDIR_FstClusLO) != 0) return 0; /* Check LDIR_FstClusLO */ + + i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13; /* Offset in the LFN buffer */ + + for (wc = 1, s = 0; s < 13; s++) { /* Process all characters in the entry */ + uc = ld_word(dir + LfnOfs[s]); /* Pick an LFN character */ + if (wc != 0) { + if (i >= FF_MAX_LFN + 1 || ff_wtoupper(uc) != ff_wtoupper(lfnbuf[i++])) { /* Compare it */ + return 0; /* Not matched */ + } + wc = uc; + } else { + if (uc != 0xFFFF) return 0; /* Check filler */ + } + } + + if ((dir[LDIR_Ord] & LLEF) && wc && lfnbuf[i]) return 0; /* Last segment matched but different length */ + + return 1; /* The part of LFN matched */ +} + + +#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 || FF_USE_LABEL || FF_FS_EXFAT +/*-----------------------------------------------------*/ +/* FAT-LFN: Pick a part of file name from an LFN entry */ +/*-----------------------------------------------------*/ + +static int pick_lfn ( /* 1:succeeded, 0:buffer overflow or invalid LFN entry */ + WCHAR* lfnbuf, /* Pointer to the LFN working buffer */ + BYTE* dir /* Pointer to the LFN entry */ +) +{ + UINT i, s; + WCHAR wc, uc; + + + if (ld_word(dir + LDIR_FstClusLO) != 0) return 0; /* Check LDIR_FstClusLO is 0 */ + + i = ((dir[LDIR_Ord] & ~LLEF) - 1) * 13; /* Offset in the LFN buffer */ + + for (wc = 1, s = 0; s < 13; s++) { /* Process all characters in the entry */ + uc = ld_word(dir + LfnOfs[s]); /* Pick an LFN character */ + if (wc != 0) { + if (i >= FF_MAX_LFN + 1) return 0; /* Buffer overflow? */ + lfnbuf[i++] = wc = uc; /* Store it */ + } else { + if (uc != 0xFFFF) return 0; /* Check filler */ + } + } + + if (dir[LDIR_Ord] & LLEF && wc != 0) { /* Put terminator if it is the last LFN part and not terminated */ + if (i >= FF_MAX_LFN + 1) return 0; /* Buffer overflow? */ + lfnbuf[i] = 0; + } + + return 1; /* The part of LFN is valid */ +} +#endif + + +#if !FF_FS_READONLY +/*-----------------------------------------*/ +/* FAT-LFN: Create an entry of LFN entries */ +/*-----------------------------------------*/ + +static void put_lfn ( + const WCHAR* lfn, /* Pointer to the LFN */ + BYTE* dir, /* Pointer to the LFN entry to be created */ + BYTE ord, /* LFN order (1-20) */ + BYTE sum /* Checksum of the corresponding SFN */ +) +{ + UINT i, s; + WCHAR wc; + + + dir[LDIR_Chksum] = sum; /* Set checksum */ + dir[LDIR_Attr] = AM_LFN; /* Set attribute. LFN entry */ + dir[LDIR_Type] = 0; + st_word(dir + LDIR_FstClusLO, 0); + + i = (ord - 1) * 13; /* Get offset in the LFN working buffer */ + s = wc = 0; + do { + if (wc != 0xFFFF) wc = lfn[i++]; /* Get an effective character */ + st_word(dir + LfnOfs[s], wc); /* Put it */ + if (wc == 0) wc = 0xFFFF; /* Padding characters for left locations */ + } while (++s < 13); + if (wc == 0xFFFF || !lfn[i]) ord |= LLEF; /* Last LFN part is the start of LFN sequence */ + dir[LDIR_Ord] = ord; /* Set the LFN order */ +} + +#endif /* !FF_FS_READONLY */ +#endif /* FF_USE_LFN */ + + + +#if FF_USE_LFN && !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* FAT-LFN: Create a Numbered SFN */ +/*-----------------------------------------------------------------------*/ + +static void gen_numname ( + BYTE* dst, /* Pointer to the buffer to store numbered SFN */ + const BYTE* src, /* Pointer to SFN */ + const WCHAR* lfn, /* Pointer to LFN */ + UINT seq /* Sequence number */ +) +{ + BYTE ns[8], c; + UINT i, j; + WCHAR wc; + DWORD sr; + + + mem_cpy(dst, src, 11); + + if (seq > 5) { /* In case of many collisions, generate a hash number instead of sequential number */ + sr = seq; + while (*lfn) { /* Create a CRC as hash value */ + wc = *lfn++; + for (i = 0; i < 16; i++) { + sr = (sr << 1) + (wc & 1); + wc >>= 1; + if (sr & 0x10000) sr ^= 0x11021; + } + } + seq = (UINT)sr; + } + + /* itoa (hexdecimal) */ + i = 7; + do { + c = (BYTE)((seq % 16) + '0'); + if (c > '9') c += 7; + ns[i--] = c; + seq /= 16; + } while (seq); + ns[i] = '~'; + + /* Append the number to the SFN body */ + for (j = 0; j < i && dst[j] != ' '; j++) { + if (dbc_1st(dst[j])) { + if (j == i - 1) break; + j++; + } + } + do { + dst[j++] = (i < 8) ? ns[i++] : ' '; + } while (j < 8); +} +#endif /* FF_USE_LFN && !FF_FS_READONLY */ + + + +#if FF_USE_LFN +/*-----------------------------------------------------------------------*/ +/* FAT-LFN: Calculate checksum of an SFN entry */ +/*-----------------------------------------------------------------------*/ + +static BYTE sum_sfn ( + const BYTE* dir /* Pointer to the SFN entry */ +) +{ + BYTE sum = 0; + UINT n = 11; + + do { + sum = (sum >> 1) + (sum << 7) + *dir++; + } while (--n); + return sum; +} + +#endif /* FF_USE_LFN */ + + + +#if FF_FS_EXFAT +/*-----------------------------------------------------------------------*/ +/* exFAT: Checksum */ +/*-----------------------------------------------------------------------*/ + +static WORD xdir_sum ( /* Get checksum of the directoly entry block */ + const BYTE* dir /* Directory entry block to be calculated */ +) +{ + UINT i, szblk; + WORD sum; + + + szblk = (dir[XDIR_NumSec] + 1) * SZDIRE; /* Number of bytes of the entry block */ + for (i = sum = 0; i < szblk; i++) { + if (i == XDIR_SetSum) { /* Skip 2-byte sum field */ + i++; + } else { + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + dir[i]; + } + } + return sum; +} + + + +static WORD xname_sum ( /* Get check sum (to be used as hash) of the file name */ + const WCHAR* name /* File name to be calculated */ +) +{ + WCHAR chr; + WORD sum = 0; + + + while ((chr = *name++) != 0) { + chr = (WCHAR)ff_wtoupper(chr); /* File name needs to be up-case converted */ + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + (chr & 0xFF); + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + (chr >> 8); + } + return sum; +} + + +#if !FF_FS_READONLY && FF_USE_MKFS +static DWORD xsum32 ( /* Returns 32-bit checksum */ + BYTE dat, /* Byte to be calculated (byte-by-byte processing) */ + DWORD sum /* Previous sum value */ +) +{ + sum = ((sum & 1) ? 0x80000000 : 0) + (sum >> 1) + dat; + return sum; +} +#endif + + +#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 +/*------------------------------------------------------*/ +/* exFAT: Get object information from a directory block */ +/*------------------------------------------------------*/ + +static void get_xfileinfo ( + BYTE* dirb, /* Pointer to the direcotry entry block 85+C0+C1s */ + FILINFO* fno /* Buffer to store the extracted file information */ +) +{ + WCHAR wc, hs; + UINT di, si, nc; + + /* Get file name from the entry block */ + si = SZDIRE * 2; /* 1st C1 entry */ + nc = 0; hs = 0; di = 0; + while (nc < dirb[XDIR_NumName]) { + if (si >= MAXDIRB(FF_MAX_LFN)) { di = 0; break; } /* Truncated directory block? */ + if ((si % SZDIRE) == 0) si += 2; /* Skip entry type field */ + wc = ld_word(dirb + si); si += 2; nc++; /* Get a character */ + if (hs == 0 && IsSurrogate(wc)) { /* Is it a surrogate? */ + hs = wc; continue; /* Get low surrogate */ + } + wc = put_utf((DWORD)hs << 16 | wc, &fno->fname[di], FF_LFN_BUF - di); /* Store it in API encoding */ + if (wc == 0) { di = 0; break; } /* Buffer overflow or wrong encoding? */ + di += wc; + hs = 0; + } + if (hs != 0) di = 0; /* Broken surrogate pair? */ + if (di == 0) fno->fname[di++] = '?'; /* Inaccessible object name? */ + fno->fname[di] = 0; /* Terminate the name */ + fno->altname[0] = 0; /* exFAT does not support SFN */ + + fno->fattrib = dirb[XDIR_Attr]; /* Attribute */ + fno->fsize = (fno->fattrib & AM_DIR) ? 0 : ld_qword(dirb + XDIR_FileSize); /* Size */ + fno->ftime = ld_word(dirb + XDIR_ModTime + 0); /* Time */ + fno->fdate = ld_word(dirb + XDIR_ModTime + 2); /* Date */ +} + +#endif /* FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 */ + + +/*-----------------------------------*/ +/* exFAT: Get a directry entry block */ +/*-----------------------------------*/ + +static FRESULT load_xdir ( /* FR_INT_ERR: invalid entry block */ + DIR* dp /* Reading direcotry object pointing top of the entry block to load */ +) +{ + FRESULT res; + UINT i, sz_ent; + BYTE* dirb = dp->obj.fs->dirbuf; /* Pointer to the on-memory direcotry entry block 85+C0+C1s */ + + + /* Load file-directory entry */ + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) return res; + if (dp->dir[XDIR_Type] != ET_FILEDIR) return FR_INT_ERR; /* Invalid order */ + mem_cpy(dirb + 0 * SZDIRE, dp->dir, SZDIRE); + sz_ent = (dirb[XDIR_NumSec] + 1) * SZDIRE; + if (sz_ent < 3 * SZDIRE || sz_ent > 19 * SZDIRE) return FR_INT_ERR; + + /* Load stream-extension entry */ + res = dir_next(dp, 0); + if (res == FR_NO_FILE) res = FR_INT_ERR; /* It cannot be */ + if (res != FR_OK) return res; + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) return res; + if (dp->dir[XDIR_Type] != ET_STREAM) return FR_INT_ERR; /* Invalid order */ + mem_cpy(dirb + 1 * SZDIRE, dp->dir, SZDIRE); + if (MAXDIRB(dirb[XDIR_NumName]) > sz_ent) return FR_INT_ERR; + + /* Load file-name entries */ + i = 2 * SZDIRE; /* Name offset to load */ + do { + res = dir_next(dp, 0); + if (res == FR_NO_FILE) res = FR_INT_ERR; /* It cannot be */ + if (res != FR_OK) return res; + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) return res; + if (dp->dir[XDIR_Type] != ET_FILENAME) return FR_INT_ERR; /* Invalid order */ + if (i < MAXDIRB(FF_MAX_LFN)) mem_cpy(dirb + i, dp->dir, SZDIRE); + } while ((i += SZDIRE) < sz_ent); + + /* Sanity check (do it for only accessible object) */ + if (i <= MAXDIRB(FF_MAX_LFN)) { + if (xdir_sum(dirb) != ld_word(dirb + XDIR_SetSum)) return FR_INT_ERR; + } + return FR_OK; +} + + +/*------------------------------------------------------------------*/ +/* exFAT: Initialize object allocation info with loaded entry block */ +/*------------------------------------------------------------------*/ + +static void init_alloc_info ( + FATFS* fs, /* Filesystem object */ + FFOBJID* obj /* Object allocation information to be initialized */ +) +{ + obj->sclust = ld_dword(fs->dirbuf + XDIR_FstClus); /* Start cluster */ + obj->objsize = ld_qword(fs->dirbuf + XDIR_FileSize); /* Size */ + obj->stat = fs->dirbuf[XDIR_GenFlags] & 2; /* Allocation status */ + obj->n_frag = 0; /* No last fragment info */ +} + + + +#if !FF_FS_READONLY || FF_FS_RPATH != 0 +/*------------------------------------------------*/ +/* exFAT: Load the object's directory entry block */ +/*------------------------------------------------*/ + +static FRESULT load_obj_xdir ( + DIR* dp, /* Blank directory object to be used to access containing direcotry */ + const FFOBJID* obj /* Object with its containing directory information */ +) +{ + FRESULT res; + + /* Open object containing directory */ + dp->obj.fs = obj->fs; + dp->obj.sclust = obj->c_scl; + dp->obj.stat = (BYTE)obj->c_size; + dp->obj.objsize = obj->c_size & 0xFFFFFF00; + dp->obj.n_frag = 0; + dp->blk_ofs = obj->c_ofs; + + res = dir_sdi(dp, dp->blk_ofs); /* Goto object's entry block */ + if (res == FR_OK) { + res = load_xdir(dp); /* Load the object's entry block */ + } + return res; +} +#endif + + +#if !FF_FS_READONLY +/*----------------------------------------*/ +/* exFAT: Store the directory entry block */ +/*----------------------------------------*/ + +static FRESULT store_xdir ( + DIR* dp /* Pointer to the direcotry object */ +) +{ + FRESULT res; + UINT nent; + BYTE* dirb = dp->obj.fs->dirbuf; /* Pointer to the direcotry entry block 85+C0+C1s */ + + /* Create set sum */ + st_word(dirb + XDIR_SetSum, xdir_sum(dirb)); + nent = dirb[XDIR_NumSec] + 1; + + /* Store the direcotry entry block to the directory */ + res = dir_sdi(dp, dp->blk_ofs); + while (res == FR_OK) { + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) break; + mem_cpy(dp->dir, dirb, SZDIRE); + dp->obj.fs->wflag = 1; + if (--nent == 0) break; + dirb += SZDIRE; + res = dir_next(dp, 0); + } + return (res == FR_OK || res == FR_DISK_ERR) ? res : FR_INT_ERR; +} + + + +/*-------------------------------------------*/ +/* exFAT: Create a new directory enrty block */ +/*-------------------------------------------*/ + +static void create_xdir ( + BYTE* dirb, /* Pointer to the direcotry entry block buffer */ + const WCHAR* lfn /* Pointer to the object name */ +) +{ + UINT i; + BYTE nc1, nlen; + WCHAR wc; + + + /* Create file-directory and stream-extension entry */ + mem_set(dirb, 0, 2 * SZDIRE); + dirb[0 * SZDIRE + XDIR_Type] = ET_FILEDIR; + dirb[1 * SZDIRE + XDIR_Type] = ET_STREAM; + + /* Create file-name entries */ + i = SZDIRE * 2; /* Top of file_name entries */ + nlen = nc1 = 0; wc = 1; + do { + dirb[i++] = ET_FILENAME; dirb[i++] = 0; + do { /* Fill name field */ + if (wc != 0 && (wc = lfn[nlen]) != 0) nlen++; /* Get a character if exist */ + st_word(dirb + i, wc); /* Store it */ + i += 2; + } while (i % SZDIRE != 0); + nc1++; + } while (lfn[nlen]); /* Fill next entry if any char follows */ + + dirb[XDIR_NumName] = nlen; /* Set name length */ + dirb[XDIR_NumSec] = 1 + nc1; /* Set secondary count (C0 + C1s) */ + st_word(dirb + XDIR_NameHash, xname_sum(lfn)); /* Set name hash */ +} + +#endif /* !FF_FS_READONLY */ +#endif /* FF_FS_EXFAT */ + + + +#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 || FF_USE_LABEL || FF_FS_EXFAT +/*-----------------------------------------------------------------------*/ +/* Read an object from the directory */ +/*-----------------------------------------------------------------------*/ + +#define DIR_READ_FILE(dp) dir_read(dp, 0) +#define DIR_READ_LABEL(dp) dir_read(dp, 1) + +static FRESULT dir_read ( + DIR* dp, /* Pointer to the directory object */ + int vol /* Filtered by 0:file/directory or 1:volume label */ +) +{ + FRESULT res = FR_NO_FILE; + FATFS *fs = dp->obj.fs; + BYTE attr, b; +#if FF_USE_LFN + BYTE ord = 0xFF, sum = 0xFF; +#endif + + while (dp->sect) { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + b = dp->dir[DIR_Name]; /* Test for the entry type */ + if (b == 0) { + res = FR_NO_FILE; break; /* Reached to end of the directory */ + } +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + if (FF_USE_LABEL && vol) { + if (b == ET_VLABEL) break; /* Volume label entry? */ + } else { + if (b == ET_FILEDIR) { /* Start of the file entry block? */ + dp->blk_ofs = dp->dptr; /* Get location of the block */ + res = load_xdir(dp); /* Load the entry block */ + if (res == FR_OK) { + dp->obj.attr = fs->dirbuf[XDIR_Attr] & AM_MASK; /* Get attribute */ + } + break; + } + } + } else +#endif + { /* On the FAT/FAT32 volume */ + dp->obj.attr = attr = dp->dir[DIR_Attr] & AM_MASK; /* Get attribute */ +#if FF_USE_LFN /* LFN configuration */ + if (b == DDEM || b == '.' || (int)((attr & ~AM_ARC) == AM_VOL) != vol) { /* An entry without valid data */ + ord = 0xFF; + } else { + if (attr == AM_LFN) { /* An LFN entry is found */ + if (b & LLEF) { /* Is it start of an LFN sequence? */ + sum = dp->dir[LDIR_Chksum]; + b &= (BYTE)~LLEF; ord = b; + dp->blk_ofs = dp->dptr; + } + /* Check LFN validity and capture it */ + ord = (b == ord && sum == dp->dir[LDIR_Chksum] && pick_lfn(fs->lfnbuf, dp->dir)) ? ord - 1 : 0xFF; + } else { /* An SFN entry is found */ + if (ord != 0 || sum != sum_sfn(dp->dir)) { /* Is there a valid LFN? */ + dp->blk_ofs = 0xFFFFFFFF; /* It has no LFN. */ + } + break; + } + } +#else /* Non LFN configuration */ + if (b != DDEM && b != '.' && attr != AM_LFN && (int)((attr & ~AM_ARC) == AM_VOL) == vol) { /* Is it a valid entry? */ + break; + } +#endif + } + res = dir_next(dp, 0); /* Next entry */ + if (res != FR_OK) break; + } + + if (res != FR_OK) dp->sect = 0; /* Terminate the read operation on error or EOT */ + return res; +} + +#endif /* FF_FS_MINIMIZE <= 1 || FF_USE_LABEL || FF_FS_RPATH >= 2 */ + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Find an object in the directory */ +/*-----------------------------------------------------------------------*/ + +static FRESULT dir_find ( /* FR_OK(0):succeeded, !=0:error */ + DIR* dp /* Pointer to the directory object with the file name */ +) +{ + FRESULT res; + FATFS *fs = dp->obj.fs; + BYTE c; +#if FF_USE_LFN + BYTE a, ord, sum; +#endif + + res = dir_sdi(dp, 0); /* Rewind directory object */ + if (res != FR_OK) return res; +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + BYTE nc; + UINT di, ni; + WORD hash = xname_sum(fs->lfnbuf); /* Hash value of the name to find */ + + while ((res = DIR_READ_FILE(dp)) == FR_OK) { /* Read an item */ +#if FF_MAX_LFN < 255 + if (fs->dirbuf[XDIR_NumName] > FF_MAX_LFN) continue; /* Skip comparison if inaccessible object name */ +#endif + if (ld_word(fs->dirbuf + XDIR_NameHash) != hash) continue; /* Skip comparison if hash mismatched */ + for (nc = fs->dirbuf[XDIR_NumName], di = SZDIRE * 2, ni = 0; nc; nc--, di += 2, ni++) { /* Compare the name */ + if ((di % SZDIRE) == 0) di += 2; + if (ff_wtoupper(ld_word(fs->dirbuf + di)) != ff_wtoupper(fs->lfnbuf[ni])) break; + } + if (nc == 0 && !fs->lfnbuf[ni]) break; /* Name matched? */ + } + return res; + } +#endif + /* On the FAT/FAT32 volume */ +#if FF_USE_LFN + ord = sum = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ +#endif + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + c = dp->dir[DIR_Name]; + if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ +#if FF_USE_LFN /* LFN configuration */ + dp->obj.attr = a = dp->dir[DIR_Attr] & AM_MASK; + if (c == DDEM || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ + ord = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (!(dp->fn[NSFLAG] & NS_NOLFN)) { + if (c & LLEF) { /* Is it start of LFN sequence? */ + sum = dp->dir[LDIR_Chksum]; + c &= (BYTE)~LLEF; ord = c; /* LFN start order */ + dp->blk_ofs = dp->dptr; /* Start offset of LFN */ + } + /* Check validity of the LFN entry and compare it with given name */ + ord = (c == ord && sum == dp->dir[LDIR_Chksum] && cmp_lfn(fs->lfnbuf, dp->dir)) ? ord - 1 : 0xFF; + } + } else { /* An SFN entry is found */ + if (ord == 0 && sum == sum_sfn(dp->dir)) break; /* LFN matched? */ + if (!(dp->fn[NSFLAG] & NS_LOSS) && !mem_cmp(dp->dir, dp->fn, 11)) break; /* SFN matched? */ + ord = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ + } + } +#else /* Non LFN configuration */ + dp->obj.attr = dp->dir[DIR_Attr] & AM_MASK; + if (!(dp->dir[DIR_Attr] & AM_VOL) && !mem_cmp(dp->dir, dp->fn, 11)) break; /* Is it a valid entry? */ +#endif + res = dir_next(dp, 0); /* Next entry */ + } while (res == FR_OK); + + return res; +} + + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Register an object to the directory */ +/*-----------------------------------------------------------------------*/ + +static FRESULT dir_register ( /* FR_OK:succeeded, FR_DENIED:no free entry or too many SFN collision, FR_DISK_ERR:disk error */ + DIR* dp /* Target directory with object name to be created */ +) +{ + FRESULT res; + FATFS *fs = dp->obj.fs; +#if FF_USE_LFN /* LFN configuration */ + UINT n, nlen, nent; + BYTE sn[12], sum; + + + if (dp->fn[NSFLAG] & (NS_DOT | NS_NONAME)) return FR_INVALID_NAME; /* Check name validity */ + for (nlen = 0; fs->lfnbuf[nlen]; nlen++) ; /* Get lfn length */ + +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + nent = (nlen + 14) / 15 + 2; /* Number of entries to allocate (85+C0+C1s) */ + res = dir_alloc(dp, nent); /* Allocate directory entries */ + if (res != FR_OK) return res; + dp->blk_ofs = dp->dptr - SZDIRE * (nent - 1); /* Set the allocated entry block offset */ + + if (dp->obj.stat & 4) { /* Has the directory been stretched by new allocation? */ + dp->obj.stat &= ~4; + res = fill_first_frag(&dp->obj); /* Fill the first fragment on the FAT if needed */ + if (res != FR_OK) return res; + res = fill_last_frag(&dp->obj, dp->clust, 0xFFFFFFFF); /* Fill the last fragment on the FAT if needed */ + if (res != FR_OK) return res; + if (dp->obj.sclust != 0) { /* Is it a sub-directory? */ + DIR dj; + + res = load_obj_xdir(&dj, &dp->obj); /* Load the object status */ + if (res != FR_OK) return res; + dp->obj.objsize += (DWORD)fs->csize * SS(fs); /* Increase the directory size by cluster size */ + st_qword(fs->dirbuf + XDIR_FileSize, dp->obj.objsize); /* Update the allocation status */ + st_qword(fs->dirbuf + XDIR_ValidFileSize, dp->obj.objsize); + fs->dirbuf[XDIR_GenFlags] = dp->obj.stat | 1; + res = store_xdir(&dj); /* Store the object status */ + if (res != FR_OK) return res; + } + } + + create_xdir(fs->dirbuf, fs->lfnbuf); /* Create on-memory directory block to be written later */ + return FR_OK; + } +#endif + /* On the FAT/FAT32 volume */ + mem_cpy(sn, dp->fn, 12); + if (sn[NSFLAG] & NS_LOSS) { /* When LFN is out of 8.3 format, generate a numbered name */ + dp->fn[NSFLAG] = NS_NOLFN; /* Find only SFN */ + for (n = 1; n < 100; n++) { + gen_numname(dp->fn, sn, fs->lfnbuf, n); /* Generate a numbered name */ + res = dir_find(dp); /* Check if the name collides with existing SFN */ + if (res != FR_OK) break; + } + if (n == 100) return FR_DENIED; /* Abort if too many collisions */ + if (res != FR_NO_FILE) return res; /* Abort if the result is other than 'not collided' */ + dp->fn[NSFLAG] = sn[NSFLAG]; + } + + /* Create an SFN with/without LFNs. */ + nent = (sn[NSFLAG] & NS_LFN) ? (nlen + 12) / 13 + 1 : 1; /* Number of entries to allocate */ + res = dir_alloc(dp, nent); /* Allocate entries */ + if (res == FR_OK && --nent) { /* Set LFN entry if needed */ + res = dir_sdi(dp, dp->dptr - nent * SZDIRE); + if (res == FR_OK) { + sum = sum_sfn(dp->fn); /* Checksum value of the SFN tied to the LFN */ + do { /* Store LFN entries in bottom first */ + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + put_lfn(fs->lfnbuf, dp->dir, (BYTE)nent, sum); + fs->wflag = 1; + res = dir_next(dp, 0); /* Next entry */ + } while (res == FR_OK && --nent); + } + } + +#else /* Non LFN configuration */ + res = dir_alloc(dp, 1); /* Allocate an entry for SFN */ + +#endif + + /* Set SFN entry */ + if (res == FR_OK) { + res = move_window(fs, dp->sect); + if (res == FR_OK) { + mem_set(dp->dir, 0, SZDIRE); /* Clean the entry */ + mem_cpy(dp->dir + DIR_Name, dp->fn, 11); /* Put SFN */ +#if FF_USE_LFN + dp->dir[DIR_NTres] = dp->fn[NSFLAG] & (NS_BODY | NS_EXT); /* Put NT flag */ +#endif + fs->wflag = 1; + } + } + + return res; +} + +#endif /* !FF_FS_READONLY */ + + + +#if !FF_FS_READONLY && FF_FS_MINIMIZE == 0 +/*-----------------------------------------------------------------------*/ +/* Remove an object from the directory */ +/*-----------------------------------------------------------------------*/ + +static FRESULT dir_remove ( /* FR_OK:Succeeded, FR_DISK_ERR:A disk error */ + DIR* dp /* Directory object pointing the entry to be removed */ +) +{ + FRESULT res; + FATFS *fs = dp->obj.fs; +#if FF_USE_LFN /* LFN configuration */ + DWORD last = dp->dptr; + + res = (dp->blk_ofs == 0xFFFFFFFF) ? FR_OK : dir_sdi(dp, dp->blk_ofs); /* Goto top of the entry block if LFN is exist */ + if (res == FR_OK) { + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + if (FF_FS_EXFAT && fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + dp->dir[XDIR_Type] &= 0x7F; /* Clear the entry InUse flag. */ + } else { /* On the FAT/FAT32 volume */ + dp->dir[DIR_Name] = DDEM; /* Mark the entry 'deleted'. */ + } + fs->wflag = 1; + if (dp->dptr >= last) break; /* If reached last entry then all entries of the object has been deleted. */ + res = dir_next(dp, 0); /* Next entry */ + } while (res == FR_OK); + if (res == FR_NO_FILE) res = FR_INT_ERR; + } +#else /* Non LFN configuration */ + + res = move_window(fs, dp->sect); + if (res == FR_OK) { + dp->dir[DIR_Name] = DDEM; /* Mark the entry 'deleted'.*/ + fs->wflag = 1; + } +#endif + + return res; +} + +#endif /* !FF_FS_READONLY && FF_FS_MINIMIZE == 0 */ + + + +#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 +/*-----------------------------------------------------------------------*/ +/* Get file information from directory entry */ +/*-----------------------------------------------------------------------*/ + +static void get_fileinfo ( + DIR* dp, /* Pointer to the directory object */ + FILINFO* fno /* Pointer to the file information to be filled */ +) +{ + UINT si, di; +#if FF_USE_LFN + BYTE lcf; + WCHAR wc, hs; + FATFS *fs = dp->obj.fs; +#else + TCHAR c; +#endif + + + fno->fname[0] = 0; /* Invaidate file info */ + if (dp->sect == 0) return; /* Exit if read pointer has reached end of directory */ + +#if FF_USE_LFN /* LFN configuration */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + get_xfileinfo(fs->dirbuf, fno); + return; + } else +#endif + { /* On the FAT/FAT32 volume */ + if (dp->blk_ofs != 0xFFFFFFFF) { /* Get LFN if available */ + si = di = hs = 0; + while (fs->lfnbuf[si] != 0) { + wc = fs->lfnbuf[si++]; /* Get an LFN character (UTF-16) */ + if (hs == 0 && IsSurrogate(wc)) { /* Is it a surrogate? */ + hs = wc; continue; /* Get low surrogate */ + } + wc = put_utf((DWORD)hs << 16 | wc, &fno->fname[di], FF_LFN_BUF - di); /* Store it in UTF-16 or UTF-8 encoding */ + if (wc == 0) { di = 0; break; } /* Invalid char or buffer overflow? */ + di += wc; + hs = 0; + } + if (hs != 0) di = 0; /* Broken surrogate pair? */ + fno->fname[di] = 0; /* Terminate the LFN (null string means LFN is invalid) */ + } + } + + si = di = 0; + while (si < 11) { /* Get SFN from SFN entry */ + wc = dp->dir[si++]; /* Get a char */ + if (wc == ' ') continue; /* Skip padding spaces */ + if (wc == RDDEM) wc = DDEM; /* Restore replaced DDEM character */ + if (si == 9 && di < FF_SFN_BUF) fno->altname[di++] = '.'; /* Insert a . if extension is exist */ +#if FF_LFN_UNICODE >= 1 /* Unicode output */ + if (dbc_1st((BYTE)wc) && si != 8 && si != 11 && dbc_2nd(dp->dir[si])) { /* Make a DBC if needed */ + wc = wc << 8 | dp->dir[si++]; + } + wc = ff_oem2uni(wc, CODEPAGE); /* ANSI/OEM -> Unicode */ + if (wc == 0) { di = 0; break; } /* Wrong char in the current code page? */ + wc = put_utf(wc, &fno->altname[di], FF_SFN_BUF - di); /* Store it in Unicode */ + if (wc == 0) { di = 0; break; } /* Buffer overflow? */ + di += wc; +#else /* ANSI/OEM output */ + fno->altname[di++] = (TCHAR)wc; /* Store it without any conversion */ +#endif + } + fno->altname[di] = 0; /* Terminate the SFN (null string means SFN is invalid) */ + + if (fno->fname[0] == 0) { /* If LFN is invalid, altname[] needs to be copied to fname[] */ + if (di == 0) { /* If LFN and SFN both are invalid, this object is inaccesible */ + fno->fname[di++] = '?'; + } else { + for (si = di = 0, lcf = NS_BODY; fno->altname[si]; si++, di++) { /* Copy altname[] to fname[] with case information */ + wc = (WCHAR)fno->altname[si]; + if (wc == '.') lcf = NS_EXT; + if (IsUpper(wc) && (dp->dir[DIR_NTres] & lcf)) wc += 0x20; + fno->fname[di] = (TCHAR)wc; + } + } + fno->fname[di] = 0; /* Terminate the LFN */ + if (!dp->dir[DIR_NTres]) fno->altname[0] = 0; /* Altname is not needed if neither LFN nor case info is exist. */ + } + +#else /* Non-LFN configuration */ + si = di = 0; + while (si < 11) { /* Copy name body and extension */ + c = (TCHAR)dp->dir[si++]; + if (c == ' ') continue; /* Skip padding spaces */ + if (c == RDDEM) c = DDEM; /* Restore replaced DDEM character */ + if (si == 9) fno->fname[di++] = '.';/* Insert a . if extension is exist */ + fno->fname[di++] = c; + } + fno->fname[di] = 0; +#endif + + fno->fattrib = dp->dir[DIR_Attr]; /* Attribute */ + fno->fsize = ld_dword(dp->dir + DIR_FileSize); /* Size */ + fno->ftime = ld_word(dp->dir + DIR_ModTime + 0); /* Time */ + fno->fdate = ld_word(dp->dir + DIR_ModTime + 2); /* Date */ +} + +#endif /* FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 */ + + + +#if FF_USE_FIND && FF_FS_MINIMIZE <= 1 +/*-----------------------------------------------------------------------*/ +/* Pattern matching */ +/*-----------------------------------------------------------------------*/ + +static DWORD get_achar ( /* Get a character and advances ptr */ + const TCHAR** ptr /* Pointer to pointer to the ANSI/OEM or Unicode string */ +) +{ + DWORD chr; + + +#if FF_USE_LFN && FF_LFN_UNICODE >= 1 /* Unicode input */ + chr = tchar2uni(ptr); + if (chr == 0xFFFFFFFF) chr = 0; /* Wrong UTF encoding is recognized as end of the string */ + chr = ff_wtoupper(chr); + +#else /* ANSI/OEM input */ + chr = (BYTE)*(*ptr)++; /* Get a byte */ + if (IsLower(chr)) chr -= 0x20; /* To upper ASCII char */ +#if FF_CODE_PAGE == 0 + if (ExCvt && chr >= 0x80) chr = ExCvt[chr - 0x80]; /* To upper SBCS extended char */ +#elif FF_CODE_PAGE < 900 + if (chr >= 0x80) chr = ExCvt[chr - 0x80]; /* To upper SBCS extended char */ +#endif +#if FF_CODE_PAGE == 0 || FF_CODE_PAGE >= 900 + if (dbc_1st((BYTE)chr)) { /* Get DBC 2nd byte if needed */ + chr = dbc_2nd((BYTE)**ptr) ? chr << 8 | (BYTE)*(*ptr)++ : 0; + } +#endif + +#endif + return chr; +} + + +static int pattern_matching ( /* 0:not matched, 1:matched */ + const TCHAR* pat, /* Matching pattern */ + const TCHAR* nam, /* String to be tested */ + int skip, /* Number of pre-skip chars (number of ?s) */ + int inf /* Infinite search (* specified) */ +) +{ + const TCHAR *pp, *np; + DWORD pc, nc; + int nm, nx; + + + while (skip--) { /* Pre-skip name chars */ + if (!get_achar(&nam)) return 0; /* Branch mismatched if less name chars */ + } + if (*pat == 0 && inf) return 1; /* (short circuit) */ + + do { + pp = pat; np = nam; /* Top of pattern and name to match */ + for (;;) { + if (*pp == '?' || *pp == '*') { /* Wildcard? */ + nm = nx = 0; + do { /* Analyze the wildcard block */ + if (*pp++ == '?') nm++; else nx = 1; + } while (*pp == '?' || *pp == '*'); + if (pattern_matching(pp, np, nm, nx)) return 1; /* Test new branch (recurs upto number of wildcard blocks in the pattern) */ + nc = *np; break; /* Branch mismatched */ + } + pc = get_achar(&pp); /* Get a pattern char */ + nc = get_achar(&np); /* Get a name char */ + if (pc != nc) break; /* Branch mismatched? */ + if (pc == 0) return 1; /* Branch matched? (matched at end of both strings) */ + } + get_achar(&nam); /* nam++ */ + } while (inf && nc); /* Retry until end of name if infinite search is specified */ + + return 0; +} + +#endif /* FF_USE_FIND && FF_FS_MINIMIZE <= 1 */ + + + +/*-----------------------------------------------------------------------*/ +/* Pick a top segment and create the object name in directory form */ +/*-----------------------------------------------------------------------*/ + +static FRESULT create_name ( /* FR_OK: successful, FR_INVALID_NAME: could not create */ + DIR* dp, /* Pointer to the directory object */ + const TCHAR** path /* Pointer to pointer to the segment in the path string */ +) +{ +#if FF_USE_LFN /* LFN configuration */ + BYTE b, cf; + WCHAR wc, *lfn; + DWORD uc; + UINT i, ni, si, di; + const TCHAR *p; + + + /* Create LFN into LFN working buffer */ + p = *path; lfn = dp->obj.fs->lfnbuf; di = 0; + for (;;) { + uc = tchar2uni(&p); /* Get a character */ + if (uc == 0xFFFFFFFF) return FR_INVALID_NAME; /* Invalid code or UTF decode error */ + if (uc >= 0x10000) lfn[di++] = (WCHAR)(uc >> 16); /* Store high surrogate if needed */ + wc = (WCHAR)uc; + if (wc < ' ' || wc == '/' || wc == '\\') break; /* Break if end of the path or a separator is found */ + if (wc < 0x80 && chk_chr("\"*:<>\?|\x7F", wc)) return FR_INVALID_NAME; /* Reject illegal characters for LFN */ + if (di >= FF_MAX_LFN) return FR_INVALID_NAME; /* Reject too long name */ + lfn[di++] = wc; /* Store the Unicode character */ + } + while (*p == '/' || *p == '\\') p++; /* Skip duplicated separators if exist */ + *path = p; /* Return pointer to the next segment */ + cf = (wc < ' ') ? NS_LAST : 0; /* Set last segment flag if end of the path */ + +#if FF_FS_RPATH != 0 + if ((di == 1 && lfn[di - 1] == '.') || + (di == 2 && lfn[di - 1] == '.' && lfn[di - 2] == '.')) { /* Is this segment a dot name? */ + lfn[di] = 0; + for (i = 0; i < 11; i++) { /* Create dot name for SFN entry */ + dp->fn[i] = (i < di) ? '.' : ' '; + } + dp->fn[i] = cf | NS_DOT; /* This is a dot entry */ + return FR_OK; + } +#endif + while (di) { /* Snip off trailing spaces and dots if exist */ + wc = lfn[di - 1]; + if (wc != ' ' && wc != '.') break; + di--; + } + lfn[di] = 0; /* LFN is created into the working buffer */ + if (di == 0) return FR_INVALID_NAME; /* Reject null name */ + + /* Create SFN in directory form */ + for (si = 0; lfn[si] == ' '; si++) ; /* Remove leading spaces */ + if (si > 0 || lfn[si] == '.') cf |= NS_LOSS | NS_LFN; /* Is there any leading space or dot? */ + while (di > 0 && lfn[di - 1] != '.') di--; /* Find last dot (di<=si: no extension) */ + + mem_set(dp->fn, ' ', 11); + i = b = 0; ni = 8; + for (;;) { + wc = lfn[si++]; /* Get an LFN character */ + if (wc == 0) break; /* Break on end of the LFN */ + if (wc == ' ' || (wc == '.' && si != di)) { /* Remove embedded spaces and dots */ + cf |= NS_LOSS | NS_LFN; + continue; + } + + if (i >= ni || si == di) { /* End of field? */ + if (ni == 11) { /* Name extension overflow? */ + cf |= NS_LOSS | NS_LFN; + break; + } + if (si != di) cf |= NS_LOSS | NS_LFN; /* Name body overflow? */ + if (si > di) break; /* No name extension? */ + si = di; i = 8; ni = 11; b <<= 2; /* Enter name extension */ + continue; + } + + if (wc >= 0x80) { /* Is this a non-ASCII character? */ + cf |= NS_LFN; /* LFN entry needs to be created */ +#if FF_CODE_PAGE == 0 + if (ExCvt) { /* At SBCS */ + wc = ff_uni2oem(wc, CODEPAGE); /* Unicode ==> ANSI/OEM code */ + if (wc & 0x80) wc = ExCvt[wc & 0x7F]; /* Convert extended character to upper (SBCS) */ + } else { /* At DBCS */ + wc = ff_uni2oem(ff_wtoupper(wc), CODEPAGE); /* Unicode ==> Upper convert ==> ANSI/OEM code */ + } +#elif FF_CODE_PAGE < 900 /* SBCS cfg */ + wc = ff_uni2oem(wc, CODEPAGE); /* Unicode ==> ANSI/OEM code */ + if (wc & 0x80) wc = ExCvt[wc & 0x7F]; /* Convert extended character to upper (SBCS) */ +#else /* DBCS cfg */ + wc = ff_uni2oem(ff_wtoupper(wc), CODEPAGE); /* Unicode ==> Upper convert ==> ANSI/OEM code */ +#endif + } + + if (wc >= 0x100) { /* Is this a DBC? */ + if (i >= ni - 1) { /* Field overflow? */ + cf |= NS_LOSS | NS_LFN; + i = ni; continue; /* Next field */ + } + dp->fn[i++] = (BYTE)(wc >> 8); /* Put 1st byte */ + } else { /* SBC */ + if (wc == 0 || chk_chr("+,;=[]", wc)) { /* Replace illegal characters for SFN if needed */ + wc = '_'; cf |= NS_LOSS | NS_LFN;/* Lossy conversion */ + } else { + if (IsUpper(wc)) { /* ASCII upper case? */ + b |= 2; + } + if (IsLower(wc)) { /* ASCII lower case? */ + b |= 1; wc -= 0x20; + } + } + } + dp->fn[i++] = (BYTE)wc; + } + + if (dp->fn[0] == DDEM) dp->fn[0] = RDDEM; /* If the first character collides with DDEM, replace it with RDDEM */ + + if (ni == 8) b <<= 2; /* Shift capital flags if no extension */ + if ((b & 0x0C) == 0x0C || (b & 0x03) == 0x03) cf |= NS_LFN; /* LFN entry needs to be created if composite capitals */ + if (!(cf & NS_LFN)) { /* When LFN is in 8.3 format without extended character, NT flags are created */ + if (b & 0x01) cf |= NS_EXT; /* NT flag (Extension has small capital letters only) */ + if (b & 0x04) cf |= NS_BODY; /* NT flag (Body has small capital letters only) */ + } + + dp->fn[NSFLAG] = cf; /* SFN is created into dp->fn[] */ + + return FR_OK; + + +#else /* FF_USE_LFN : Non-LFN configuration */ + BYTE c, d, *sfn; + UINT ni, si, i; + const char *p; + + /* Create file name in directory form */ + p = *path; sfn = dp->fn; + mem_set(sfn, ' ', 11); + si = i = 0; ni = 8; +#if FF_FS_RPATH != 0 + if (p[si] == '.') { /* Is this a dot entry? */ + for (;;) { + c = (BYTE)p[si++]; + if (c != '.' || si >= 3) break; + sfn[i++] = c; + } + if (c != '/' && c != '\\' && c > ' ') return FR_INVALID_NAME; + *path = p + si; /* Return pointer to the next segment */ + sfn[NSFLAG] = (c <= ' ') ? NS_LAST | NS_DOT : NS_DOT; /* Set last segment flag if end of the path */ + return FR_OK; + } +#endif + for (;;) { + c = (BYTE)p[si++]; /* Get a byte */ + if (c <= ' ') break; /* Break if end of the path name */ + if (c == '/' || c == '\\') { /* Break if a separator is found */ + while (p[si] == '/' || p[si] == '\\') si++; /* Skip duplicated separator if exist */ + break; + } + if (c == '.' || i >= ni) { /* End of body or field overflow? */ + if (ni == 11 || c != '.') return FR_INVALID_NAME; /* Field overflow or invalid dot? */ + i = 8; ni = 11; /* Enter file extension field */ + continue; + } +#if FF_CODE_PAGE == 0 + if (ExCvt && c >= 0x80) { /* Is SBC extended character? */ + c = ExCvt[c & 0x7F]; /* To upper SBC extended character */ + } +#elif FF_CODE_PAGE < 900 + if (c >= 0x80) { /* Is SBC extended character? */ + c = ExCvt[c & 0x7F]; /* To upper SBC extended character */ + } +#endif + if (dbc_1st(c)) { /* Check if it is a DBC 1st byte */ + d = (BYTE)p[si++]; /* Get 2nd byte */ + if (!dbc_2nd(d) || i >= ni - 1) return FR_INVALID_NAME; /* Reject invalid DBC */ + sfn[i++] = c; + sfn[i++] = d; + } else { /* SBC */ + if (chk_chr("\"*+,:;<=>\?[]|\x7F", c)) return FR_INVALID_NAME; /* Reject illegal chrs for SFN */ + if (IsLower(c)) c -= 0x20; /* To upper */ + sfn[i++] = c; + } + } + *path = p + si; /* Return pointer to the next segment */ + if (i == 0) return FR_INVALID_NAME; /* Reject nul string */ + + if (sfn[0] == DDEM) sfn[0] = RDDEM; /* If the first character collides with DDEM, replace it with RDDEM */ + sfn[NSFLAG] = (c <= ' ') ? NS_LAST : 0; /* Set last segment flag if end of the path */ + + return FR_OK; +#endif /* FF_USE_LFN */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Follow a file path */ +/*-----------------------------------------------------------------------*/ + +static FRESULT follow_path ( /* FR_OK(0): successful, !=0: error code */ + DIR* dp, /* Directory object to return last directory and found object */ + const TCHAR* path /* Full-path string to find a file or directory */ +) +{ + FRESULT res; + BYTE ns; + FATFS *fs = dp->obj.fs; + + +#if FF_FS_RPATH != 0 + if (*path != '/' && *path != '\\') { /* Without heading separator */ + dp->obj.sclust = fs->cdir; /* Start from current directory */ + } else +#endif + { /* With heading separator */ + while (*path == '/' || *path == '\\') path++; /* Strip heading separator */ + dp->obj.sclust = 0; /* Start from root directory */ + } +#if FF_FS_EXFAT + dp->obj.n_frag = 0; /* Invalidate last fragment counter of the object */ +#if FF_FS_RPATH != 0 + if (fs->fs_type == FS_EXFAT && dp->obj.sclust) { /* exFAT: Retrieve the sub-directory's status */ + DIR dj; + + dp->obj.c_scl = fs->cdc_scl; + dp->obj.c_size = fs->cdc_size; + dp->obj.c_ofs = fs->cdc_ofs; + res = load_obj_xdir(&dj, &dp->obj); + if (res != FR_OK) return res; + dp->obj.objsize = ld_dword(fs->dirbuf + XDIR_FileSize); + dp->obj.stat = fs->dirbuf[XDIR_GenFlags] & 2; + } +#endif +#endif + + if ((UINT)*path < ' ') { /* Null path name is the origin directory itself */ + dp->fn[NSFLAG] = NS_NONAME; + res = dir_sdi(dp, 0); + + } else { /* Follow path */ + for (;;) { + res = create_name(dp, &path); /* Get a segment name of the path */ + if (res != FR_OK) break; + res = dir_find(dp); /* Find an object with the segment name */ + ns = dp->fn[NSFLAG]; + if (res != FR_OK) { /* Failed to find the object */ + if (res == FR_NO_FILE) { /* Object is not found */ + if (FF_FS_RPATH && (ns & NS_DOT)) { /* If dot entry is not exist, stay there */ + if (!(ns & NS_LAST)) continue; /* Continue to follow if not last segment */ + dp->fn[NSFLAG] = NS_NONAME; + res = FR_OK; + } else { /* Could not find the object */ + if (!(ns & NS_LAST)) res = FR_NO_PATH; /* Adjust error code if not last segment */ + } + } + break; + } + if (ns & NS_LAST) break; /* Last segment matched. Function completed. */ + /* Get into the sub-directory */ + if (!(dp->obj.attr & AM_DIR)) { /* It is not a sub-directory and cannot follow */ + res = FR_NO_PATH; break; + } +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* Save containing directory information for next dir */ + dp->obj.c_scl = dp->obj.sclust; + dp->obj.c_size = ((DWORD)dp->obj.objsize & 0xFFFFFF00) | dp->obj.stat; + dp->obj.c_ofs = dp->blk_ofs; + init_alloc_info(fs, &dp->obj); /* Open next directory */ + } else +#endif + { + dp->obj.sclust = ld_clust(fs, fs->win + dp->dptr % SS(fs)); /* Open next directory */ + } + } + } + + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Get logical drive number from path name */ +/*-----------------------------------------------------------------------*/ + +static int get_ldnumber ( /* Returns logical drive number (-1:invalid drive number or null pointer) */ + const TCHAR** path /* Pointer to pointer to the path name */ +) +{ + const TCHAR *tp, *tt; + TCHAR tc; + int i, vol = -1; +#if FF_STR_VOLUME_ID /* Find string volume ID */ + const char *sp; + char c; +#endif + + tt = tp = *path; + if (!tp) return vol; /* Invalid path name? */ + do tc = *tt++; while ((UINT)tc >= (FF_USE_LFN ? ' ' : '!') && tc != ':'); /* Find a colon in the path */ + + if (tc == ':') { /* DOS/Windows style volume ID? */ + i = FF_VOLUMES; + if (IsDigit(*tp) && tp + 2 == tt) { /* Is there a numeric volume ID + colon? */ + i = (int)*tp - '0'; /* Get the LD number */ + } +#if FF_STR_VOLUME_ID == 1 /* Arbitrary string is enabled */ + else { + i = 0; + do { + sp = VolumeStr[i]; tp = *path; /* This string volume ID and path name */ + do { /* Compare the volume ID with path name */ + c = *sp++; tc = *tp++; + if (IsLower(c)) c -= 0x20; + if (IsLower(tc)) tc -= 0x20; + } while (c && (TCHAR)c == tc); + } while ((c || tp != tt) && ++i < FF_VOLUMES); /* Repeat for each id until pattern match */ + } +#endif + if (i < FF_VOLUMES) { /* If a volume ID is found, get the drive number and strip it */ + vol = i; /* Drive number */ + *path = tt; /* Snip the drive prefix off */ + } + return vol; + } +#if FF_STR_VOLUME_ID == 2 /* Unix style volume ID is enabled */ + if (*tp == '/') { + i = 0; + do { + sp = VolumeStr[i]; tp = *path; /* This string volume ID and path name */ + do { /* Compare the volume ID with path name */ + c = *sp++; tc = *(++tp); + if (IsLower(c)) c -= 0x20; + if (IsLower(tc)) tc -= 0x20; + } while (c && (TCHAR)c == tc); + } while ((c || (tc != '/' && (UINT)tc >= (FF_USE_LFN ? ' ' : '!'))) && ++i < FF_VOLUMES); /* Repeat for each ID until pattern match */ + if (i < FF_VOLUMES) { /* If a volume ID is found, get the drive number and strip it */ + vol = i; /* Drive number */ + *path = tp; /* Snip the drive prefix off */ + return vol; + } + } +#endif + /* No drive prefix is found */ +#if FF_FS_RPATH != 0 + vol = CurrVol; /* Default drive is current drive */ +#else + vol = 0; /* Default drive is 0 */ +#endif + return vol; /* Return the default drive */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Load a sector and check if it is an FAT VBR */ +/*-----------------------------------------------------------------------*/ + +static BYTE check_fs ( /* 0:FAT, 1:exFAT, 2:Valid BS but not FAT, 3:Not a BS, 4:Disk error */ + FATFS* fs, /* Filesystem object */ + DWORD sect /* Sector# (lba) to load and check if it is an FAT-VBR or not */ +) +{ + fs->wflag = 0; fs->winsect = 0xFFFFFFFF; /* Invaidate window */ + if (move_window(fs, sect) != FR_OK) return 4; /* Load boot record */ + + if (ld_word(fs->win + BS_55AA) != 0xAA55) return 3; /* Check boot record signature (always here regardless of the sector size) */ + +#if FF_FS_EXFAT + if (!mem_cmp(fs->win + BS_JmpBoot, "\xEB\x76\x90" "EXFAT ", 11)) return 1; /* Check if exFAT VBR */ +#endif + if (fs->win[BS_JmpBoot] == 0xE9 || fs->win[BS_JmpBoot] == 0xEB || fs->win[BS_JmpBoot] == 0xE8) { /* Valid JumpBoot code? */ + if (!mem_cmp(fs->win + BS_FilSysType, "FAT", 3)) return 0; /* Is it an FAT VBR? */ + if (!mem_cmp(fs->win + BS_FilSysType32, "FAT32", 5)) return 0; /* Is it an FAT32 VBR? */ + } + return 2; /* Valid BS but not FAT */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Determine logical drive number and mount the volume if needed */ +/*-----------------------------------------------------------------------*/ + +static FRESULT find_volume ( /* FR_OK(0): successful, !=0: an error occurred */ + const TCHAR** path, /* Pointer to pointer to the path name (drive number) */ + FATFS** rfs, /* Pointer to pointer to the found filesystem object */ + BYTE mode /* !=0: Check write protection for write access */ +) +{ + BYTE fmt, *pt; + int vol; + DSTATUS stat; + DWORD bsect, fasize, tsect, sysect, nclst, szbfat, br[4]; + WORD nrsv; + FATFS *fs; + UINT i; + + + /* Get logical drive number */ + *rfs = 0; + vol = get_ldnumber(path); + if (vol < 0) return FR_INVALID_DRIVE; + + /* Check if the filesystem object is valid or not */ + fs = FatFs[vol]; /* Get pointer to the filesystem object */ + if (!fs) return FR_NOT_ENABLED; /* Is the filesystem object available? */ +#if FF_FS_REENTRANT + if (!lock_fs(fs)) return FR_TIMEOUT; /* Lock the volume */ +#endif + *rfs = fs; /* Return pointer to the filesystem object */ + + mode &= (BYTE)~FA_READ; /* Desired access mode, write access or not */ + if (fs->fs_type != 0) { /* If the volume has been mounted */ + stat = disk_status(fs->pdrv); + if (!(stat & STA_NOINIT)) { /* and the physical drive is kept initialized */ + if (!FF_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check write protection if needed */ + return FR_WRITE_PROTECTED; + } + return FR_OK; /* The filesystem object is valid */ + } + } + + /* The filesystem object is not valid. */ + /* Following code attempts to mount the volume. (analyze BPB and initialize the filesystem object) */ + + fs->fs_type = 0; /* Clear the filesystem object */ + fs->pdrv = LD2PD(vol); /* Bind the logical drive and a physical drive */ + stat = disk_initialize(fs->pdrv); /* Initialize the physical drive */ + if (stat & STA_NOINIT) { /* Check if the initialization succeeded */ + return FR_NOT_READY; /* Failed to initialize due to no medium or hard error */ + } + if (!FF_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check disk write protection if needed */ + return FR_WRITE_PROTECTED; + } +#if FF_MAX_SS != FF_MIN_SS /* Get sector size (multiple sector size cfg only) */ + if (disk_ioctl(fs->pdrv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK) return FR_DISK_ERR; + if (SS(fs) > FF_MAX_SS || SS(fs) < FF_MIN_SS || (SS(fs) & (SS(fs) - 1))) return FR_DISK_ERR; +#endif + + /* Find an FAT partition on the drive. Supports only generic partitioning rules, FDISK (MBR) and SFD (w/o partition). */ + bsect = 0; + fmt = check_fs(fs, bsect); /* Load sector 0 and check if it is an FAT-VBR as SFD */ + if (fmt == 2 || (fmt < 2 && LD2PT(vol) != 0)) { /* Not an FAT-VBR or forced partition number */ + for (i = 0; i < 4; i++) { /* Get partition offset */ + pt = fs->win + (MBR_Table + i * SZ_PTE); + br[i] = pt[PTE_System] ? ld_dword(pt + PTE_StLba) : 0; + } + i = LD2PT(vol); /* Partition number: 0:auto, 1-4:forced */ + if (i != 0) i--; + do { /* Find an FAT volume */ + bsect = br[i]; + fmt = bsect ? check_fs(fs, bsect) : 3; /* Check the partition */ + } while (LD2PT(vol) == 0 && fmt >= 2 && ++i < 4); + } + if (fmt == 4) return FR_DISK_ERR; /* An error occured in the disk I/O layer */ + if (fmt >= 2) return FR_NO_FILESYSTEM; /* No FAT volume is found */ + + /* An FAT volume is found (bsect). Following code initializes the filesystem object */ + +#if FF_FS_EXFAT + if (fmt == 1) { + QWORD maxlba; + DWORD so, cv, bcl; + + for (i = BPB_ZeroedEx; i < BPB_ZeroedEx + 53 && fs->win[i] == 0; i++) ; /* Check zero filler */ + if (i < BPB_ZeroedEx + 53) return FR_NO_FILESYSTEM; + + if (ld_word(fs->win + BPB_FSVerEx) != 0x100) return FR_NO_FILESYSTEM; /* Check exFAT version (must be version 1.0) */ + + if (1 << fs->win[BPB_BytsPerSecEx] != SS(fs)) { /* (BPB_BytsPerSecEx must be equal to the physical sector size) */ + return FR_NO_FILESYSTEM; + } + + maxlba = ld_qword(fs->win + BPB_TotSecEx) + bsect; /* Last LBA + 1 of the volume */ + if (maxlba >= 0x100000000) return FR_NO_FILESYSTEM; /* (It cannot be handled in 32-bit LBA) */ + + fs->fsize = ld_dword(fs->win + BPB_FatSzEx); /* Number of sectors per FAT */ + + fs->n_fats = fs->win[BPB_NumFATsEx]; /* Number of FATs */ + if (fs->n_fats != 1) return FR_NO_FILESYSTEM; /* (Supports only 1 FAT) */ + + fs->csize = 1 << fs->win[BPB_SecPerClusEx]; /* Cluster size */ + if (fs->csize == 0) return FR_NO_FILESYSTEM; /* (Must be 1..32768) */ + + nclst = ld_dword(fs->win + BPB_NumClusEx); /* Number of clusters */ + if (nclst > MAX_EXFAT) return FR_NO_FILESYSTEM; /* (Too many clusters) */ + fs->n_fatent = nclst + 2; + + /* Boundaries and Limits */ + fs->volbase = bsect; + fs->database = bsect + ld_dword(fs->win + BPB_DataOfsEx); + fs->fatbase = bsect + ld_dword(fs->win + BPB_FatOfsEx); + if (maxlba < (QWORD)fs->database + nclst * fs->csize) return FR_NO_FILESYSTEM; /* (Volume size must not be smaller than the size requiered) */ + fs->dirbase = ld_dword(fs->win + BPB_RootClusEx); + + /* Get bitmap location and check if it is contiguous (implementation assumption) */ + so = i = 0; + for (;;) { /* Find the bitmap entry in the root directory (in only first cluster) */ + if (i == 0) { + if (so >= fs->csize) return FR_NO_FILESYSTEM; /* Not found? */ + if (move_window(fs, clst2sect(fs, fs->dirbase) + so) != FR_OK) return FR_DISK_ERR; + so++; + } + if (fs->win[i] == ET_BITMAP) break; /* Is it a bitmap entry? */ + i = (i + SZDIRE) % SS(fs); /* Next entry */ + } + bcl = ld_dword(fs->win + i + 20); /* Bitmap cluster */ + if (bcl < 2 || bcl >= fs->n_fatent) return FR_NO_FILESYSTEM; + fs->bitbase = fs->database + fs->csize * (bcl - 2); /* Bitmap sector */ + for (;;) { /* Check if bitmap is contiguous */ + if (move_window(fs, fs->fatbase + bcl / (SS(fs) / 4)) != FR_OK) return FR_DISK_ERR; + cv = ld_dword(fs->win + bcl % (SS(fs) / 4) * 4); + if (cv == 0xFFFFFFFF) break; /* Last link? */ + if (cv != ++bcl) return FR_NO_FILESYSTEM; /* Fragmented? */ + } + +#if !FF_FS_READONLY + fs->last_clst = fs->free_clst = 0xFFFFFFFF; /* Initialize cluster allocation information */ +#endif + fmt = FS_EXFAT; /* FAT sub-type */ + } else +#endif /* FF_FS_EXFAT */ + { + if (ld_word(fs->win + BPB_BytsPerSec) != SS(fs)) return FR_NO_FILESYSTEM; /* (BPB_BytsPerSec must be equal to the physical sector size) */ + + fasize = ld_word(fs->win + BPB_FATSz16); /* Number of sectors per FAT */ + if (fasize == 0) fasize = ld_dword(fs->win + BPB_FATSz32); + fs->fsize = fasize; + + fs->n_fats = fs->win[BPB_NumFATs]; /* Number of FATs */ + if (fs->n_fats != 1 && fs->n_fats != 2) return FR_NO_FILESYSTEM; /* (Must be 1 or 2) */ + fasize *= fs->n_fats; /* Number of sectors for FAT area */ + + fs->csize = fs->win[BPB_SecPerClus]; /* Cluster size */ + if (fs->csize == 0 || (fs->csize & (fs->csize - 1))) return FR_NO_FILESYSTEM; /* (Must be power of 2) */ + + fs->n_rootdir = ld_word(fs->win + BPB_RootEntCnt); /* Number of root directory entries */ + if (fs->n_rootdir % (SS(fs) / SZDIRE)) return FR_NO_FILESYSTEM; /* (Must be sector aligned) */ + + tsect = ld_word(fs->win + BPB_TotSec16); /* Number of sectors on the volume */ + if (tsect == 0) tsect = ld_dword(fs->win + BPB_TotSec32); + + nrsv = ld_word(fs->win + BPB_RsvdSecCnt); /* Number of reserved sectors */ + if (nrsv == 0) return FR_NO_FILESYSTEM; /* (Must not be 0) */ + + /* Determine the FAT sub type */ + sysect = nrsv + fasize + fs->n_rootdir / (SS(fs) / SZDIRE); /* RSV + FAT + DIR */ + if (tsect < sysect) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ + nclst = (tsect - sysect) / fs->csize; /* Number of clusters */ + if (nclst == 0) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ + fmt = 0; + if (nclst <= MAX_FAT32) fmt = FS_FAT32; + if (nclst <= MAX_FAT16) fmt = FS_FAT16; + if (nclst <= MAX_FAT12) fmt = FS_FAT12; + if (fmt == 0) return FR_NO_FILESYSTEM; + + /* Boundaries and Limits */ + fs->n_fatent = nclst + 2; /* Number of FAT entries */ + fs->volbase = bsect; /* Volume start sector */ + fs->fatbase = bsect + nrsv; /* FAT start sector */ + fs->database = bsect + sysect; /* Data start sector */ + if (fmt == FS_FAT32) { + if (ld_word(fs->win + BPB_FSVer32) != 0) return FR_NO_FILESYSTEM; /* (Must be FAT32 revision 0.0) */ + if (fs->n_rootdir != 0) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must be 0) */ + fs->dirbase = ld_dword(fs->win + BPB_RootClus32); /* Root directory start cluster */ + szbfat = fs->n_fatent * 4; /* (Needed FAT size) */ + } else { + if (fs->n_rootdir == 0) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must not be 0) */ + fs->dirbase = fs->fatbase + fasize; /* Root directory start sector */ + szbfat = (fmt == FS_FAT16) ? /* (Needed FAT size) */ + fs->n_fatent * 2 : fs->n_fatent * 3 / 2 + (fs->n_fatent & 1); + } + if (fs->fsize < (szbfat + (SS(fs) - 1)) / SS(fs)) return FR_NO_FILESYSTEM; /* (BPB_FATSz must not be less than the size needed) */ + +#if !FF_FS_READONLY + /* Get FSInfo if available */ + fs->last_clst = fs->free_clst = 0xFFFFFFFF; /* Initialize cluster allocation information */ + fs->fsi_flag = 0x80; +#if (FF_FS_NOFSINFO & 3) != 3 + if (fmt == FS_FAT32 /* Allow to update FSInfo only if BPB_FSInfo32 == 1 */ + && ld_word(fs->win + BPB_FSInfo32) == 1 + && move_window(fs, bsect + 1) == FR_OK) + { + fs->fsi_flag = 0; + if (ld_word(fs->win + BS_55AA) == 0xAA55 /* Load FSInfo data if available */ + && ld_dword(fs->win + FSI_LeadSig) == 0x41615252 + && ld_dword(fs->win + FSI_StrucSig) == 0x61417272) + { +#if (FF_FS_NOFSINFO & 1) == 0 + fs->free_clst = ld_dword(fs->win + FSI_Free_Count); +#endif +#if (FF_FS_NOFSINFO & 2) == 0 + fs->last_clst = ld_dword(fs->win + FSI_Nxt_Free); +#endif + } + } +#endif /* (FF_FS_NOFSINFO & 3) != 3 */ +#endif /* !FF_FS_READONLY */ + } + + fs->fs_type = fmt; /* FAT sub-type */ + fs->id = ++Fsid; /* Volume mount ID */ +#if FF_USE_LFN == 1 + fs->lfnbuf = LfnBuf; /* Static LFN working buffer */ +#if FF_FS_EXFAT + fs->dirbuf = DirBuf; /* Static directory block scratchpad buuffer */ +#endif +#endif +#if FF_FS_RPATH != 0 + fs->cdir = 0; /* Initialize current directory */ +#endif +#if FF_FS_LOCK != 0 /* Clear file lock semaphores */ + clear_lock(fs); +#endif + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Check if the file/directory object is valid or not */ +/*-----------------------------------------------------------------------*/ + +static FRESULT validate ( /* Returns FR_OK or FR_INVALID_OBJECT */ + FFOBJID* obj, /* Pointer to the FFOBJID, the 1st member in the FIL/DIR object, to check validity */ + FATFS** rfs /* Pointer to pointer to the owner filesystem object to return */ +) +{ + FRESULT res = FR_INVALID_OBJECT; + + + if (obj && obj->fs && obj->fs->fs_type && obj->id == obj->fs->id) { /* Test if the object is valid */ +#if FF_FS_REENTRANT + if (lock_fs(obj->fs)) { /* Obtain the filesystem object */ + if (!(disk_status(obj->fs->pdrv) & STA_NOINIT)) { /* Test if the phsical drive is kept initialized */ + res = FR_OK; + } else { + unlock_fs(obj->fs, FR_OK); + } + } else { + res = FR_TIMEOUT; + } +#else + if (!(disk_status(obj->fs->pdrv) & STA_NOINIT)) { /* Test if the phsical drive is kept initialized */ + res = FR_OK; + } +#endif + } + *rfs = (res == FR_OK) ? obj->fs : 0; /* Corresponding filesystem object */ + return res; +} + + + + +/*--------------------------------------------------------------------------- + + Public Functions (FatFs API) + +----------------------------------------------------------------------------*/ + + + +/*-----------------------------------------------------------------------*/ +/* Mount/Unmount a Logical Drive */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mount ( + FATFS* fs, /* Pointer to the filesystem object (NULL:unmount)*/ + const TCHAR* path, /* Logical drive number to be mounted/unmounted */ + BYTE opt /* Mode option 0:Do not mount (delayed mount), 1:Mount immediately */ +) +{ + FATFS *cfs; + int vol; + FRESULT res; + const TCHAR *rp = path; + + + /* Get logical drive number */ + vol = get_ldnumber(&rp); + if (vol < 0) return FR_INVALID_DRIVE; + cfs = FatFs[vol]; /* Pointer to fs object */ + + if (cfs) { +#if FF_FS_LOCK != 0 + clear_lock(cfs); +#endif +#if FF_FS_REENTRANT /* Discard sync object of the current volume */ + if (!ff_del_syncobj(cfs->sobj)) return FR_INT_ERR; +#endif + cfs->fs_type = 0; /* Clear old fs object */ + } + + if (fs) { + fs->fs_type = 0; /* Clear new fs object */ +#if FF_FS_REENTRANT /* Create sync object for the new volume */ + if (!ff_cre_syncobj((BYTE)vol, &fs->sobj)) return FR_INT_ERR; +#endif + } + FatFs[vol] = fs; /* Register new fs object */ + + if (opt == 0) return FR_OK; /* Do not mount now, it will be mounted later */ + + res = find_volume(&path, &fs, 0); /* Force mounted the volume */ + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Open or Create a File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_open ( + FIL* fp, /* Pointer to the blank file object */ + const TCHAR* path, /* Pointer to the file name */ + BYTE mode /* Access mode and file open mode flags */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; +#if !FF_FS_READONLY + DWORD dw, cl, bcs, clst, sc; + FSIZE_t ofs; +#endif + DEF_NAMBUF + + + if (!fp) return FR_INVALID_OBJECT; + + /* Get logical drive number */ + mode &= FF_FS_READONLY ? FA_READ : FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_CREATE_NEW | FA_OPEN_ALWAYS | FA_OPEN_APPEND; + res = find_volume(&path, &fs, mode); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ +#if !FF_FS_READONLY /* Read/Write configuration */ + if (res == FR_OK) { + if (dj.fn[NSFLAG] & NS_NONAME) { /* Origin directory itself? */ + res = FR_INVALID_NAME; + } +#if FF_FS_LOCK != 0 + else { + res = chk_lock(&dj, (mode & ~FA_READ) ? 1 : 0); /* Check if the file can be used */ + } +#endif + } + /* Create or Open a file */ + if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) { + if (res != FR_OK) { /* No file, create new */ + if (res == FR_NO_FILE) { /* There is no file to open, create a new entry */ +#if FF_FS_LOCK != 0 + res = enq_lock() ? dir_register(&dj) : FR_TOO_MANY_OPEN_FILES; +#else + res = dir_register(&dj); +#endif + } + mode |= FA_CREATE_ALWAYS; /* File is created */ + } + else { /* Any object with the same name is already existing */ + if (dj.obj.attr & (AM_RDO | AM_DIR)) { /* Cannot overwrite it (R/O or DIR) */ + res = FR_DENIED; + } else { + if (mode & FA_CREATE_NEW) res = FR_EXIST; /* Cannot create as new file */ + } + } + if (res == FR_OK && (mode & FA_CREATE_ALWAYS)) { /* Truncate the file if overwrite mode */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + /* Get current allocation info */ + fp->obj.fs = fs; + init_alloc_info(fs, &fp->obj); + /* Set directory entry block initial state */ + mem_set(fs->dirbuf + 2, 0, 30); /* Clear 85 entry except for NumSec */ + mem_set(fs->dirbuf + 38, 0, 26); /* Clear C0 entry except for NumName and NameHash */ + fs->dirbuf[XDIR_Attr] = AM_ARC; + st_dword(fs->dirbuf + XDIR_CrtTime, GET_FATTIME()); + fs->dirbuf[XDIR_GenFlags] = 1; + res = store_xdir(&dj); + if (res == FR_OK && fp->obj.sclust != 0) { /* Remove the cluster chain if exist */ + res = remove_chain(&fp->obj, fp->obj.sclust, 0); + fs->last_clst = fp->obj.sclust - 1; /* Reuse the cluster hole */ + } + } else +#endif + { + /* Set directory entry initial state */ + cl = ld_clust(fs, dj.dir); /* Get current cluster chain */ + st_dword(dj.dir + DIR_CrtTime, GET_FATTIME()); /* Set created time */ + dj.dir[DIR_Attr] = AM_ARC; /* Reset attribute */ + st_clust(fs, dj.dir, 0); /* Reset file allocation info */ + st_dword(dj.dir + DIR_FileSize, 0); + fs->wflag = 1; + if (cl != 0) { /* Remove the cluster chain if exist */ + dw = fs->winsect; + res = remove_chain(&dj.obj, cl, 0); + if (res == FR_OK) { + res = move_window(fs, dw); + fs->last_clst = cl - 1; /* Reuse the cluster hole */ + } + } + } + } + } + else { /* Open an existing file */ + if (res == FR_OK) { /* Is the object exsiting? */ + if (dj.obj.attr & AM_DIR) { /* File open against a directory */ + res = FR_NO_FILE; + } else { + if ((mode & FA_WRITE) && (dj.obj.attr & AM_RDO)) { /* Write mode open against R/O file */ + res = FR_DENIED; + } + } + } + } + if (res == FR_OK) { + if (mode & FA_CREATE_ALWAYS) mode |= FA_MODIFIED; /* Set file change flag if created or overwritten */ + fp->dir_sect = fs->winsect; /* Pointer to the directory entry */ + fp->dir_ptr = dj.dir; +#if FF_FS_LOCK != 0 + fp->obj.lockid = inc_lock(&dj, (mode & ~FA_READ) ? 1 : 0); /* Lock the file for this session */ + if (fp->obj.lockid == 0) res = FR_INT_ERR; +#endif + } +#else /* R/O configuration */ + if (res == FR_OK) { + if (dj.fn[NSFLAG] & NS_NONAME) { /* Is it origin directory itself? */ + res = FR_INVALID_NAME; + } else { + if (dj.obj.attr & AM_DIR) { /* Is it a directory? */ + res = FR_NO_FILE; + } + } + } +#endif + + if (res == FR_OK) { +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fp->obj.c_scl = dj.obj.sclust; /* Get containing directory info */ + fp->obj.c_size = ((DWORD)dj.obj.objsize & 0xFFFFFF00) | dj.obj.stat; + fp->obj.c_ofs = dj.blk_ofs; + init_alloc_info(fs, &fp->obj); + } else +#endif + { + fp->obj.sclust = ld_clust(fs, dj.dir); /* Get object allocation info */ + fp->obj.objsize = ld_dword(dj.dir + DIR_FileSize); + } +#if FF_USE_FASTSEEK + fp->cltbl = 0; /* Disable fast seek mode */ +#endif + fp->obj.fs = fs; /* Validate the file object */ + fp->obj.id = fs->id; + fp->flag = mode; /* Set file access mode */ + fp->err = 0; /* Clear error flag */ + fp->sect = 0; /* Invalidate current data sector */ + fp->fptr = 0; /* Set file pointer top of the file */ +#if !FF_FS_READONLY +#if !FF_FS_TINY + mem_set(fp->buf, 0, sizeof fp->buf); /* Clear sector buffer */ +#endif + if ((mode & FA_SEEKEND) && fp->obj.objsize > 0) { /* Seek to end of file if FA_OPEN_APPEND is specified */ + fp->fptr = fp->obj.objsize; /* Offset to seek */ + bcs = (DWORD)fs->csize * SS(fs); /* Cluster size in byte */ + clst = fp->obj.sclust; /* Follow the cluster chain */ + for (ofs = fp->obj.objsize; res == FR_OK && ofs > bcs; ofs -= bcs) { + clst = get_fat(&fp->obj, clst); + if (clst <= 1) res = FR_INT_ERR; + if (clst == 0xFFFFFFFF) res = FR_DISK_ERR; + } + fp->clust = clst; + if (res == FR_OK && ofs % SS(fs)) { /* Fill sector buffer if not on the sector boundary */ + if ((sc = clst2sect(fs, clst)) == 0) { + res = FR_INT_ERR; + } else { + fp->sect = sc + (DWORD)(ofs / SS(fs)); +#if !FF_FS_TINY + if (disk_read(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) res = FR_DISK_ERR; +#endif + } + } + } +#endif + } + + FREE_NAMBUF(); + } + + if (res != FR_OK) fp->obj.fs = 0; /* Invalidate file object on error */ + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_read ( + FIL* fp, /* Pointer to the file object */ + void* buff, /* Pointer to data buffer */ + UINT btr, /* Number of bytes to read */ + UINT* br /* Pointer to number of bytes read */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, sect; + FSIZE_t remain; + UINT rcnt, cc, csect; + BYTE *rbuff = (BYTE*)buff; + + + *br = 0; /* Clear read byte counter */ + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ + if (!(fp->flag & FA_READ)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + remain = fp->obj.objsize - fp->fptr; + if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */ + + for ( ; btr; /* Repeat until btr bytes read */ + btr -= rcnt, *br += rcnt, rbuff += rcnt, fp->fptr += rcnt) { + if (fp->fptr % SS(fs) == 0) { /* On the sector boundary? */ + csect = (UINT)(fp->fptr / SS(fs) & (fs->csize - 1)); /* Sector offset in the cluster */ + if (csect == 0) { /* On the cluster boundary? */ + if (fp->fptr == 0) { /* On the top of the file? */ + clst = fp->obj.sclust; /* Follow cluster chain from the origin */ + } else { /* Middle or end of the file */ +#if FF_USE_FASTSEEK + if (fp->cltbl) { + clst = clmt_clust(fp, fp->fptr); /* Get cluster# from the CLMT */ + } else +#endif + { + clst = get_fat(&fp->obj, fp->clust); /* Follow cluster chain on the FAT */ + } + } + if (clst < 2) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + } + sect = clst2sect(fs, fp->clust); /* Get current sector */ + if (sect == 0) ABORT(fs, FR_INT_ERR); + sect += csect; + cc = btr / SS(fs); /* When remaining bytes >= sector size, */ + if (cc > 0) { /* Read maximum contiguous sectors directly */ + if (csect + cc > fs->csize) { /* Clip at cluster boundary */ + cc = fs->csize - csect; + } + if (disk_read(fs->pdrv, rbuff, sect, cc) != RES_OK) ABORT(fs, FR_DISK_ERR); +#if !FF_FS_READONLY && FF_FS_MINIMIZE <= 2 /* Replace one of the read sectors with cached data if it contains a dirty sector */ +#if FF_FS_TINY + if (fs->wflag && fs->winsect - sect < cc) { + mem_cpy(rbuff + ((fs->winsect - sect) * SS(fs)), fs->win, SS(fs)); + } +#else + if ((fp->flag & FA_DIRTY) && fp->sect - sect < cc) { + mem_cpy(rbuff + ((fp->sect - sect) * SS(fs)), fp->buf, SS(fs)); + } +#endif +#endif + rcnt = SS(fs) * cc; /* Number of bytes transferred */ + continue; + } +#if !FF_FS_TINY + if (fp->sect != sect) { /* Load data sector if not in cache */ +#if !FF_FS_READONLY + if (fp->flag & FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + if (disk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); /* Fill sector cache */ + } +#endif + fp->sect = sect; + } + rcnt = SS(fs) - (UINT)fp->fptr % SS(fs); /* Number of bytes left in the sector */ + if (rcnt > btr) rcnt = btr; /* Clip it by btr if needed */ +#if FF_FS_TINY + if (move_window(fs, fp->sect) != FR_OK) ABORT(fs, FR_DISK_ERR); /* Move sector window */ + mem_cpy(rbuff, fs->win + fp->fptr % SS(fs), rcnt); /* Extract partial sector */ +#else + mem_cpy(rbuff, fp->buf + fp->fptr % SS(fs), rcnt); /* Extract partial sector */ +#endif + } + + LEAVE_FF(fs, FR_OK); +} + + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Write File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_write ( + FIL* fp, /* Pointer to the file object */ + const void* buff, /* Pointer to the data to be written */ + UINT btw, /* Number of bytes to write */ + UINT* bw /* Pointer to number of bytes written */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, sect; + UINT wcnt, cc, csect; + const BYTE *wbuff = (const BYTE*)buff; + + + *bw = 0; /* Clear write byte counter */ + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ + if (!(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + + /* Check fptr wrap-around (file size cannot reach 4 GiB at FAT volume) */ + if ((!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) && (DWORD)(fp->fptr + btw) < (DWORD)fp->fptr) { + btw = (UINT)(0xFFFFFFFF - (DWORD)fp->fptr); + } + + for ( ; btw; /* Repeat until all data written */ + btw -= wcnt, *bw += wcnt, wbuff += wcnt, fp->fptr += wcnt, fp->obj.objsize = (fp->fptr > fp->obj.objsize) ? fp->fptr : fp->obj.objsize) { + if (fp->fptr % SS(fs) == 0) { /* On the sector boundary? */ + csect = (UINT)(fp->fptr / SS(fs)) & (fs->csize - 1); /* Sector offset in the cluster */ + if (csect == 0) { /* On the cluster boundary? */ + if (fp->fptr == 0) { /* On the top of the file? */ + clst = fp->obj.sclust; /* Follow from the origin */ + if (clst == 0) { /* If no cluster is allocated, */ + clst = create_chain(&fp->obj, 0); /* create a new cluster chain */ + } + } else { /* On the middle or end of the file */ +#if FF_USE_FASTSEEK + if (fp->cltbl) { + clst = clmt_clust(fp, fp->fptr); /* Get cluster# from the CLMT */ + } else +#endif + { + clst = create_chain(&fp->obj, fp->clust); /* Follow or stretch cluster chain on the FAT */ + } + } + if (clst == 0) break; /* Could not allocate a new cluster (disk full) */ + if (clst == 1) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + if (fp->obj.sclust == 0) fp->obj.sclust = clst; /* Set start cluster if the first write */ + } +#if FF_FS_TINY + if (fs->winsect == fp->sect && sync_window(fs) != FR_OK) ABORT(fs, FR_DISK_ERR); /* Write-back sector cache */ +#else + if (fp->flag & FA_DIRTY) { /* Write-back sector cache */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + sect = clst2sect(fs, fp->clust); /* Get current sector */ + if (sect == 0) ABORT(fs, FR_INT_ERR); + sect += csect; + cc = btw / SS(fs); /* When remaining bytes >= sector size, */ + if (cc > 0) { /* Write maximum contiguous sectors directly */ + if (csect + cc > fs->csize) { /* Clip at cluster boundary */ + cc = fs->csize - csect; + } + if (disk_write(fs->pdrv, wbuff, sect, cc) != RES_OK) ABORT(fs, FR_DISK_ERR); +#if FF_FS_MINIMIZE <= 2 +#if FF_FS_TINY + if (fs->winsect - sect < cc) { /* Refill sector cache if it gets invalidated by the direct write */ + mem_cpy(fs->win, wbuff + ((fs->winsect - sect) * SS(fs)), SS(fs)); + fs->wflag = 0; + } +#else + if (fp->sect - sect < cc) { /* Refill sector cache if it gets invalidated by the direct write */ + mem_cpy(fp->buf, wbuff + ((fp->sect - sect) * SS(fs)), SS(fs)); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif +#endif + wcnt = SS(fs) * cc; /* Number of bytes transferred */ + continue; + } +#if FF_FS_TINY + if (fp->fptr >= fp->obj.objsize) { /* Avoid silly cache filling on the growing edge */ + if (sync_window(fs) != FR_OK) ABORT(fs, FR_DISK_ERR); + fs->winsect = sect; + } +#else + if (fp->sect != sect && /* Fill sector cache with file data */ + fp->fptr < fp->obj.objsize && + disk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } +#endif + fp->sect = sect; + } + wcnt = SS(fs) - (UINT)fp->fptr % SS(fs); /* Number of bytes left in the sector */ + if (wcnt > btw) wcnt = btw; /* Clip it by btw if needed */ +#if FF_FS_TINY + if (move_window(fs, fp->sect) != FR_OK) ABORT(fs, FR_DISK_ERR); /* Move sector window */ + mem_cpy(fs->win + fp->fptr % SS(fs), wbuff, wcnt); /* Fit data to the sector */ + fs->wflag = 1; +#else + mem_cpy(fp->buf + fp->fptr % SS(fs), wbuff, wcnt); /* Fit data to the sector */ + fp->flag |= FA_DIRTY; +#endif + } + + fp->flag |= FA_MODIFIED; /* Set file change flag */ + + LEAVE_FF(fs, FR_OK); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Synchronize the File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_sync ( + FIL* fp /* Pointer to the file object */ +) +{ + FRESULT res; + FATFS *fs; + DWORD tm; + BYTE *dir; + + + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res == FR_OK) { + if (fp->flag & FA_MODIFIED) { /* Is there any change to the file? */ +#if !FF_FS_TINY + if (fp->flag & FA_DIRTY) { /* Write-back cached data if needed */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) LEAVE_FF(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + /* Update the directory entry */ + tm = GET_FATTIME(); /* Modified time */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + res = fill_first_frag(&fp->obj); /* Fill first fragment on the FAT if needed */ + if (res == FR_OK) { + res = fill_last_frag(&fp->obj, fp->clust, 0xFFFFFFFF); /* Fill last fragment on the FAT if needed */ + } + if (res == FR_OK) { + DIR dj; + DEF_NAMBUF + + INIT_NAMBUF(fs); + res = load_obj_xdir(&dj, &fp->obj); /* Load directory entry block */ + if (res == FR_OK) { + fs->dirbuf[XDIR_Attr] |= AM_ARC; /* Set archive attribute to indicate that the file has been changed */ + fs->dirbuf[XDIR_GenFlags] = fp->obj.stat | 1; /* Update file allocation information */ + st_dword(fs->dirbuf + XDIR_FstClus, fp->obj.sclust); + st_qword(fs->dirbuf + XDIR_FileSize, fp->obj.objsize); + st_qword(fs->dirbuf + XDIR_ValidFileSize, fp->obj.objsize); + st_dword(fs->dirbuf + XDIR_ModTime, tm); /* Update modified time */ + fs->dirbuf[XDIR_ModTime10] = 0; + st_dword(fs->dirbuf + XDIR_AccTime, 0); + res = store_xdir(&dj); /* Restore it to the directory */ + if (res == FR_OK) { + res = sync_fs(fs); + fp->flag &= (BYTE)~FA_MODIFIED; + } + } + FREE_NAMBUF(); + } + } else +#endif + { + res = move_window(fs, fp->dir_sect); + if (res == FR_OK) { + dir = fp->dir_ptr; + dir[DIR_Attr] |= AM_ARC; /* Set archive attribute to indicate that the file has been changed */ + st_clust(fp->obj.fs, dir, fp->obj.sclust); /* Update file allocation information */ + st_dword(dir + DIR_FileSize, (DWORD)fp->obj.objsize); /* Update file size */ + st_dword(dir + DIR_ModTime, tm); /* Update modified time */ + st_word(dir + DIR_LstAccDate, 0); + fs->wflag = 1; + res = sync_fs(fs); /* Restore it to the directory */ + fp->flag &= (BYTE)~FA_MODIFIED; + } + } + } + } + + LEAVE_FF(fs, res); +} + +#endif /* !FF_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Close File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_close ( + FIL* fp /* Pointer to the file object to be closed */ +) +{ + FRESULT res; + FATFS *fs; + +#if !FF_FS_READONLY + res = f_sync(fp); /* Flush cached data */ + if (res == FR_OK) +#endif + { + res = validate(&fp->obj, &fs); /* Lock volume */ + if (res == FR_OK) { +#if FF_FS_LOCK != 0 + res = dec_lock(fp->obj.lockid); /* Decrement file open counter */ + if (res == FR_OK) fp->obj.fs = 0; /* Invalidate file object */ +#else + fp->obj.fs = 0; /* Invalidate file object */ +#endif +#if FF_FS_REENTRANT + unlock_fs(fs, FR_OK); /* Unlock volume */ +#endif + } + } + return res; +} + + + + +#if FF_FS_RPATH >= 1 +/*-----------------------------------------------------------------------*/ +/* Change Current Directory or Current Drive, Get Current Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_chdrive ( + const TCHAR* path /* Drive number to set */ +) +{ + int vol; + + + /* Get logical drive number */ + vol = get_ldnumber(&path); + if (vol < 0) return FR_INVALID_DRIVE; + CurrVol = (BYTE)vol; /* Set it as current volume */ + + return FR_OK; +} + + + +FRESULT f_chdir ( + const TCHAR* path /* Pointer to the directory path */ +) +{ +#if FF_STR_VOLUME_ID == 2 + UINT i; +#endif + FRESULT res; + DIR dj; + FATFS *fs; + DEF_NAMBUF + + + /* Get logical drive */ + res = find_volume(&path, &fs, 0); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the path */ + if (res == FR_OK) { /* Follow completed */ + if (dj.fn[NSFLAG] & NS_NONAME) { /* Is it the start directory itself? */ + fs->cdir = dj.obj.sclust; +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fs->cdc_scl = dj.obj.c_scl; + fs->cdc_size = dj.obj.c_size; + fs->cdc_ofs = dj.obj.c_ofs; + } +#endif + } else { + if (dj.obj.attr & AM_DIR) { /* It is a sub-directory */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fs->cdir = ld_dword(fs->dirbuf + XDIR_FstClus); /* Sub-directory cluster */ + fs->cdc_scl = dj.obj.sclust; /* Save containing directory information */ + fs->cdc_size = ((DWORD)dj.obj.objsize & 0xFFFFFF00) | dj.obj.stat; + fs->cdc_ofs = dj.blk_ofs; + } else +#endif + { + fs->cdir = ld_clust(fs, dj.dir); /* Sub-directory cluster */ + } + } else { + res = FR_NO_PATH; /* Reached but a file */ + } + } + } + FREE_NAMBUF(); + if (res == FR_NO_FILE) res = FR_NO_PATH; +#if FF_STR_VOLUME_ID == 2 /* Also current drive is changed at Unix style volume ID */ + if (res == FR_OK) { + for (i = FF_VOLUMES - 1; i && fs != FatFs[i]; i--) ; /* Set current drive */ + CurrVol = (BYTE)i; + } +#endif + } + + LEAVE_FF(fs, res); +} + + +#if FF_FS_RPATH >= 2 +FRESULT f_getcwd ( + TCHAR* buff, /* Pointer to the directory path */ + UINT len /* Size of buff in unit of TCHAR */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + UINT i, n; + DWORD ccl; + TCHAR *tp = buff; +#if FF_VOLUMES >= 2 + UINT vl; +#if FF_STR_VOLUME_ID + const char *vp; +#endif +#endif + FILINFO fno; + DEF_NAMBUF + + + /* Get logical drive */ + buff[0] = 0; /* Set null string to get current volume */ + res = find_volume((const TCHAR**)&buff, &fs, 0); /* Get current volume */ + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + + /* Follow parent directories and create the path */ + i = len; /* Bottom of buffer (directory stack base) */ + if (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) { /* (Cannot do getcwd on exFAT and returns root path) */ + dj.obj.sclust = fs->cdir; /* Start to follow upper directory from current directory */ + while ((ccl = dj.obj.sclust) != 0) { /* Repeat while current directory is a sub-directory */ + res = dir_sdi(&dj, 1 * SZDIRE); /* Get parent directory */ + if (res != FR_OK) break; + res = move_window(fs, dj.sect); + if (res != FR_OK) break; + dj.obj.sclust = ld_clust(fs, dj.dir); /* Goto parent directory */ + res = dir_sdi(&dj, 0); + if (res != FR_OK) break; + do { /* Find the entry links to the child directory */ + res = DIR_READ_FILE(&dj); + if (res != FR_OK) break; + if (ccl == ld_clust(fs, dj.dir)) break; /* Found the entry */ + res = dir_next(&dj, 0); + } while (res == FR_OK); + if (res == FR_NO_FILE) res = FR_INT_ERR;/* It cannot be 'not found'. */ + if (res != FR_OK) break; + get_fileinfo(&dj, &fno); /* Get the directory name and push it to the buffer */ + for (n = 0; fno.fname[n]; n++) ; /* Name length */ + if (i < n + 1) { /* Insufficient space to store the path name? */ + res = FR_NOT_ENOUGH_CORE; break; + } + while (n) buff[--i] = fno.fname[--n]; /* Stack the name */ + buff[--i] = '/'; + } + } + if (res == FR_OK) { + if (i == len) buff[--i] = '/'; /* Is it the root-directory? */ +#if FF_VOLUMES >= 2 /* Put drive prefix */ + vl = 0; +#if FF_STR_VOLUME_ID >= 1 /* String volume ID */ + for (n = 0, vp = (const char*)VolumeStr[CurrVol]; vp[n]; n++) ; + if (i >= n + 2) { + if (FF_STR_VOLUME_ID == 2) *tp++ = (TCHAR)'/'; + for (vl = 0; vl < n; *tp++ = (TCHAR)vp[vl], vl++) ; + if (FF_STR_VOLUME_ID == 1) *tp++ = (TCHAR)':'; + vl++; + } +#else /* Numeric volume ID */ + if (i >= 3) { + *tp++ = (TCHAR)'0' + CurrVol; + *tp++ = (TCHAR)':'; + vl = 2; + } +#endif + if (vl == 0) res = FR_NOT_ENOUGH_CORE; +#endif + /* Add current directory path */ + if (res == FR_OK) { + do *tp++ = buff[i++]; while (i < len); /* Copy stacked path string */ + } + } + FREE_NAMBUF(); + } + + *tp = 0; + LEAVE_FF(fs, res); +} + +#endif /* FF_FS_RPATH >= 2 */ +#endif /* FF_FS_RPATH >= 1 */ + + + +#if FF_FS_MINIMIZE <= 2 +/*-----------------------------------------------------------------------*/ +/* Seek File Read/Write Pointer */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_lseek ( + FIL* fp, /* Pointer to the file object */ + FSIZE_t ofs /* File pointer from top of file */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, bcs, nsect; + FSIZE_t ifptr; +#if FF_USE_FASTSEEK + DWORD cl, pcl, ncl, tcl, dsc, tlen, ulen, *tbl; +#endif + + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res == FR_OK) res = (FRESULT)fp->err; +#if FF_FS_EXFAT && !FF_FS_READONLY + if (res == FR_OK && fs->fs_type == FS_EXFAT) { + res = fill_last_frag(&fp->obj, fp->clust, 0xFFFFFFFF); /* Fill last fragment on the FAT if needed */ + } +#endif + if (res != FR_OK) LEAVE_FF(fs, res); + +#if FF_USE_FASTSEEK + if (fp->cltbl) { /* Fast seek */ + if (ofs == CREATE_LINKMAP) { /* Create CLMT */ + tbl = fp->cltbl; + tlen = *tbl++; ulen = 2; /* Given table size and required table size */ + cl = fp->obj.sclust; /* Origin of the chain */ + if (cl != 0) { + do { + /* Get a fragment */ + tcl = cl; ncl = 0; ulen += 2; /* Top, length and used items */ + do { + pcl = cl; ncl++; + cl = get_fat(&fp->obj, cl); + if (cl <= 1) ABORT(fs, FR_INT_ERR); + if (cl == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + } while (cl == pcl + 1); + if (ulen <= tlen) { /* Store the length and top of the fragment */ + *tbl++ = ncl; *tbl++ = tcl; + } + } while (cl < fs->n_fatent); /* Repeat until end of chain */ + } + *fp->cltbl = ulen; /* Number of items used */ + if (ulen <= tlen) { + *tbl = 0; /* Terminate table */ + } else { + res = FR_NOT_ENOUGH_CORE; /* Given table size is smaller than required */ + } + } else { /* Fast seek */ + if (ofs > fp->obj.objsize) ofs = fp->obj.objsize; /* Clip offset at the file size */ + fp->fptr = ofs; /* Set file pointer */ + if (ofs > 0) { + fp->clust = clmt_clust(fp, ofs - 1); + dsc = clst2sect(fs, fp->clust); + if (dsc == 0) ABORT(fs, FR_INT_ERR); + dsc += (DWORD)((ofs - 1) / SS(fs)) & (fs->csize - 1); + if (fp->fptr % SS(fs) && dsc != fp->sect) { /* Refill sector cache if needed */ +#if !FF_FS_TINY +#if !FF_FS_READONLY + if (fp->flag & FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + if (disk_read(fs->pdrv, fp->buf, dsc, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); /* Load current sector */ +#endif + fp->sect = dsc; + } + } + } + } else +#endif + + /* Normal Seek */ + { +#if FF_FS_EXFAT + if (fs->fs_type != FS_EXFAT && ofs >= 0x100000000) ofs = 0xFFFFFFFF; /* Clip at 4 GiB - 1 if at FATxx */ +#endif + if (ofs > fp->obj.objsize && (FF_FS_READONLY || !(fp->flag & FA_WRITE))) { /* In read-only mode, clip offset with the file size */ + ofs = fp->obj.objsize; + } + ifptr = fp->fptr; + fp->fptr = nsect = 0; + if (ofs > 0) { + bcs = (DWORD)fs->csize * SS(fs); /* Cluster size (byte) */ + if (ifptr > 0 && + (ofs - 1) / bcs >= (ifptr - 1) / bcs) { /* When seek to same or following cluster, */ + fp->fptr = (ifptr - 1) & ~(FSIZE_t)(bcs - 1); /* start from the current cluster */ + ofs -= fp->fptr; + clst = fp->clust; + } else { /* When seek to back cluster, */ + clst = fp->obj.sclust; /* start from the first cluster */ +#if !FF_FS_READONLY + if (clst == 0) { /* If no cluster chain, create a new chain */ + clst = create_chain(&fp->obj, 0); + if (clst == 1) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->obj.sclust = clst; + } +#endif + fp->clust = clst; + } + if (clst != 0) { + while (ofs > bcs) { /* Cluster following loop */ + ofs -= bcs; fp->fptr += bcs; +#if !FF_FS_READONLY + if (fp->flag & FA_WRITE) { /* Check if in write mode or not */ + if (FF_FS_EXFAT && fp->fptr > fp->obj.objsize) { /* No FAT chain object needs correct objsize to generate FAT value */ + fp->obj.objsize = fp->fptr; + fp->flag |= FA_MODIFIED; + } + clst = create_chain(&fp->obj, clst); /* Follow chain with forceed stretch */ + if (clst == 0) { /* Clip file size in case of disk full */ + ofs = 0; break; + } + } else +#endif + { + clst = get_fat(&fp->obj, clst); /* Follow cluster chain if not in write mode */ + } + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + if (clst <= 1 || clst >= fs->n_fatent) ABORT(fs, FR_INT_ERR); + fp->clust = clst; + } + fp->fptr += ofs; + if (ofs % SS(fs)) { + nsect = clst2sect(fs, clst); /* Current sector */ + if (nsect == 0) ABORT(fs, FR_INT_ERR); + nsect += (DWORD)(ofs / SS(fs)); + } + } + } + if (!FF_FS_READONLY && fp->fptr > fp->obj.objsize) { /* Set file change flag if the file size is extended */ + fp->obj.objsize = fp->fptr; + fp->flag |= FA_MODIFIED; + } + if (fp->fptr % SS(fs) && nsect != fp->sect) { /* Fill sector cache if needed */ +#if !FF_FS_TINY +#if !FF_FS_READONLY + if (fp->flag & FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + if (disk_read(fs->pdrv, fp->buf, nsect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); /* Fill sector cache */ +#endif + fp->sect = nsect; + } + } + + LEAVE_FF(fs, res); +} + + + +#if FF_FS_MINIMIZE <= 1 +/*-----------------------------------------------------------------------*/ +/* Create a Directory Object */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_opendir ( + DIR* dp, /* Pointer to directory object to create */ + const TCHAR* path /* Pointer to the directory path */ +) +{ + FRESULT res; + FATFS *fs; + DEF_NAMBUF + + + if (!dp) return FR_INVALID_OBJECT; + + /* Get logical drive */ + res = find_volume(&path, &fs, 0); + if (res == FR_OK) { + dp->obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(dp, path); /* Follow the path to the directory */ + if (res == FR_OK) { /* Follow completed */ + if (!(dp->fn[NSFLAG] & NS_NONAME)) { /* It is not the origin directory itself */ + if (dp->obj.attr & AM_DIR) { /* This object is a sub-directory */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + dp->obj.c_scl = dp->obj.sclust; /* Get containing directory inforamation */ + dp->obj.c_size = ((DWORD)dp->obj.objsize & 0xFFFFFF00) | dp->obj.stat; + dp->obj.c_ofs = dp->blk_ofs; + init_alloc_info(fs, &dp->obj); /* Get object allocation info */ + } else +#endif + { + dp->obj.sclust = ld_clust(fs, dp->dir); /* Get object allocation info */ + } + } else { /* This object is a file */ + res = FR_NO_PATH; + } + } + if (res == FR_OK) { + dp->obj.id = fs->id; + res = dir_sdi(dp, 0); /* Rewind directory */ +#if FF_FS_LOCK != 0 + if (res == FR_OK) { + if (dp->obj.sclust != 0) { + dp->obj.lockid = inc_lock(dp, 0); /* Lock the sub directory */ + if (!dp->obj.lockid) res = FR_TOO_MANY_OPEN_FILES; + } else { + dp->obj.lockid = 0; /* Root directory need not to be locked */ + } + } +#endif + } + } + FREE_NAMBUF(); + if (res == FR_NO_FILE) res = FR_NO_PATH; + } + if (res != FR_OK) dp->obj.fs = 0; /* Invalidate the directory object if function faild */ + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Close Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_closedir ( + DIR *dp /* Pointer to the directory object to be closed */ +) +{ + FRESULT res; + FATFS *fs; + + + res = validate(&dp->obj, &fs); /* Check validity of the file object */ + if (res == FR_OK) { +#if FF_FS_LOCK != 0 + if (dp->obj.lockid) res = dec_lock(dp->obj.lockid); /* Decrement sub-directory open counter */ + if (res == FR_OK) dp->obj.fs = 0; /* Invalidate directory object */ +#else + dp->obj.fs = 0; /* Invalidate directory object */ +#endif +#if FF_FS_REENTRANT + unlock_fs(fs, FR_OK); /* Unlock volume */ +#endif + } + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read Directory Entries in Sequence */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_readdir ( + DIR* dp, /* Pointer to the open directory object */ + FILINFO* fno /* Pointer to file information to return */ +) +{ + FRESULT res; + FATFS *fs; + DEF_NAMBUF + + + res = validate(&dp->obj, &fs); /* Check validity of the directory object */ + if (res == FR_OK) { + if (!fno) { + res = dir_sdi(dp, 0); /* Rewind the directory object */ + } else { + INIT_NAMBUF(fs); + res = DIR_READ_FILE(dp); /* Read an item */ + if (res == FR_NO_FILE) res = FR_OK; /* Ignore end of directory */ + if (res == FR_OK) { /* A valid entry is found */ + get_fileinfo(dp, fno); /* Get the object information */ + res = dir_next(dp, 0); /* Increment index for next */ + if (res == FR_NO_FILE) res = FR_OK; /* Ignore end of directory now */ + } + FREE_NAMBUF(); + } + } + LEAVE_FF(fs, res); +} + + + +#if FF_USE_FIND +/*-----------------------------------------------------------------------*/ +/* Find Next File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_findnext ( + DIR* dp, /* Pointer to the open directory object */ + FILINFO* fno /* Pointer to the file information structure */ +) +{ + FRESULT res; + + + for (;;) { + res = f_readdir(dp, fno); /* Get a directory item */ + if (res != FR_OK || !fno || !fno->fname[0]) break; /* Terminate if any error or end of directory */ + if (pattern_matching(dp->pat, fno->fname, 0, 0)) break; /* Test for the file name */ +#if FF_USE_LFN && FF_USE_FIND == 2 + if (pattern_matching(dp->pat, fno->altname, 0, 0)) break; /* Test for alternative name if exist */ +#endif + } + return res; +} + + + +/*-----------------------------------------------------------------------*/ +/* Find First File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_findfirst ( + DIR* dp, /* Pointer to the blank directory object */ + FILINFO* fno, /* Pointer to the file information structure */ + const TCHAR* path, /* Pointer to the directory to open */ + const TCHAR* pattern /* Pointer to the matching pattern */ +) +{ + FRESULT res; + + + dp->pat = pattern; /* Save pointer to pattern string */ + res = f_opendir(dp, path); /* Open the target directory */ + if (res == FR_OK) { + res = f_findnext(dp, fno); /* Find the first item */ + } + return res; +} + +#endif /* FF_USE_FIND */ + + + +#if FF_FS_MINIMIZE == 0 +/*-----------------------------------------------------------------------*/ +/* Get File Status */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_stat ( + const TCHAR* path, /* Pointer to the file path */ + FILINFO* fno /* Pointer to file information to return */ +) +{ + FRESULT res; + DIR dj; + DEF_NAMBUF + + + /* Get logical drive */ + res = find_volume(&path, &dj.obj.fs, 0); + if (res == FR_OK) { + INIT_NAMBUF(dj.obj.fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) { /* Follow completed */ + if (dj.fn[NSFLAG] & NS_NONAME) { /* It is origin directory */ + res = FR_INVALID_NAME; + } else { /* Found an object */ + if (fno) get_fileinfo(&dj, fno); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(dj.obj.fs, res); +} + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Get Number of Free Clusters */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_getfree ( + const TCHAR* path, /* Logical drive number */ + DWORD* nclst, /* Pointer to a variable to return number of free clusters */ + FATFS** fatfs /* Pointer to return pointer to corresponding filesystem object */ +) +{ + FRESULT res; + FATFS *fs; + DWORD nfree, clst, sect, stat; + UINT i; + FFOBJID obj; + + + /* Get logical drive */ + res = find_volume(&path, &fs, 0); + if (res == FR_OK) { + *fatfs = fs; /* Return ptr to the fs object */ + /* If free_clst is valid, return it without full FAT scan */ + if (fs->free_clst <= fs->n_fatent - 2) { + *nclst = fs->free_clst; + } else { + /* Scan FAT to obtain number of free clusters */ + nfree = 0; + if (fs->fs_type == FS_FAT12) { /* FAT12: Scan bit field FAT entries */ + clst = 2; obj.fs = fs; + do { + stat = get_fat(&obj, clst); + if (stat == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } + if (stat == 1) { res = FR_INT_ERR; break; } + if (stat == 0) nfree++; + } while (++clst < fs->n_fatent); + } else { +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* exFAT: Scan allocation bitmap */ + BYTE bm; + UINT b; + + clst = fs->n_fatent - 2; /* Number of clusters */ + sect = fs->bitbase; /* Bitmap sector */ + i = 0; /* Offset in the sector */ + do { /* Counts numbuer of bits with zero in the bitmap */ + if (i == 0) { + res = move_window(fs, sect++); + if (res != FR_OK) break; + } + for (b = 8, bm = fs->win[i]; b && clst; b--, clst--) { + if (!(bm & 1)) nfree++; + bm >>= 1; + } + i = (i + 1) % SS(fs); + } while (clst); + } else +#endif + { /* FAT16/32: Scan WORD/DWORD FAT entries */ + clst = fs->n_fatent; /* Number of entries */ + sect = fs->fatbase; /* Top of the FAT */ + i = 0; /* Offset in the sector */ + do { /* Counts numbuer of entries with zero in the FAT */ + if (i == 0) { + res = move_window(fs, sect++); + if (res != FR_OK) break; + } + if (fs->fs_type == FS_FAT16) { + if (ld_word(fs->win + i) == 0) nfree++; + i += 2; + } else { + if ((ld_dword(fs->win + i) & 0x0FFFFFFF) == 0) nfree++; + i += 4; + } + i %= SS(fs); + } while (--clst); + } + } + *nclst = nfree; /* Return the free clusters */ + fs->free_clst = nfree; /* Now free_clst is valid */ + fs->fsi_flag |= 1; /* FAT32: FSInfo is to be updated */ + } + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Truncate File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_truncate ( + FIL* fp /* Pointer to the file object */ +) +{ + FRESULT res; + FATFS *fs; + DWORD ncl; + + + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); + if (!(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + + if (fp->fptr < fp->obj.objsize) { /* Process when fptr is not on the eof */ + if (fp->fptr == 0) { /* When set file size to zero, remove entire cluster chain */ + res = remove_chain(&fp->obj, fp->obj.sclust, 0); + fp->obj.sclust = 0; + } else { /* When truncate a part of the file, remove remaining clusters */ + ncl = get_fat(&fp->obj, fp->clust); + res = FR_OK; + if (ncl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (ncl == 1) res = FR_INT_ERR; + if (res == FR_OK && ncl < fs->n_fatent) { + res = remove_chain(&fp->obj, ncl, fp->clust); + } + } + fp->obj.objsize = fp->fptr; /* Set file size to current read/write point */ + fp->flag |= FA_MODIFIED; +#if !FF_FS_TINY + if (res == FR_OK && (fp->flag & FA_DIRTY)) { + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) { + res = FR_DISK_ERR; + } else { + fp->flag &= (BYTE)~FA_DIRTY; + } + } +#endif + if (res != FR_OK) ABORT(fs, res); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Delete a File/Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_unlink ( + const TCHAR* path /* Pointer to the file or directory path */ +) +{ + FRESULT res; + DIR dj, sdj; + DWORD dclst = 0; + FATFS *fs; +#if FF_FS_EXFAT + FFOBJID obj; +#endif + DEF_NAMBUF + + + /* Get logical drive */ + res = find_volume(&path, &fs, FA_WRITE); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (FF_FS_RPATH && res == FR_OK && (dj.fn[NSFLAG] & NS_DOT)) { + res = FR_INVALID_NAME; /* Cannot remove dot entry */ + } +#if FF_FS_LOCK != 0 + if (res == FR_OK) res = chk_lock(&dj, 2); /* Check if it is an open object */ +#endif + if (res == FR_OK) { /* The object is accessible */ + if (dj.fn[NSFLAG] & NS_NONAME) { + res = FR_INVALID_NAME; /* Cannot remove the origin directory */ + } else { + if (dj.obj.attr & AM_RDO) { + res = FR_DENIED; /* Cannot remove R/O object */ + } + } + if (res == FR_OK) { +#if FF_FS_EXFAT + obj.fs = fs; + if (fs->fs_type == FS_EXFAT) { + init_alloc_info(fs, &obj); + dclst = obj.sclust; + } else +#endif + { + dclst = ld_clust(fs, dj.dir); + } + if (dj.obj.attr & AM_DIR) { /* Is it a sub-directory? */ +#if FF_FS_RPATH != 0 + if (dclst == fs->cdir) { /* Is it the current directory? */ + res = FR_DENIED; + } else +#endif + { + sdj.obj.fs = fs; /* Open the sub-directory */ + sdj.obj.sclust = dclst; +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + sdj.obj.objsize = obj.objsize; + sdj.obj.stat = obj.stat; + } +#endif + res = dir_sdi(&sdj, 0); + if (res == FR_OK) { + res = DIR_READ_FILE(&sdj); /* Test if the directory is empty */ + if (res == FR_OK) res = FR_DENIED; /* Not empty? */ + if (res == FR_NO_FILE) res = FR_OK; /* Empty? */ + } + } + } + } + if (res == FR_OK) { + res = dir_remove(&dj); /* Remove the directory entry */ + if (res == FR_OK && dclst != 0) { /* Remove the cluster chain if exist */ +#if FF_FS_EXFAT + res = remove_chain(&obj, dclst, 0); +#else + res = remove_chain(&dj.obj, dclst, 0); +#endif + } + if (res == FR_OK) res = sync_fs(fs); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Create a Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mkdir ( + const TCHAR* path /* Pointer to the directory path */ +) +{ + FRESULT res; + DIR dj; + FFOBJID sobj; + FATFS *fs; + DWORD dcl, pcl, tm; + DEF_NAMBUF + + + res = find_volume(&path, &fs, FA_WRITE); /* Get logical drive */ + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) res = FR_EXIST; /* Name collision? */ + if (FF_FS_RPATH && res == FR_NO_FILE && (dj.fn[NSFLAG] & NS_DOT)) { /* Invalid name? */ + res = FR_INVALID_NAME; + } + if (res == FR_NO_FILE) { /* It is clear to create a new directory */ + sobj.fs = fs; /* New object id to create a new chain */ + dcl = create_chain(&sobj, 0); /* Allocate a cluster for the new directory */ + res = FR_OK; + if (dcl == 0) res = FR_DENIED; /* No space to allocate a new cluster? */ + if (dcl == 1) res = FR_INT_ERR; /* Any insanity? */ + if (dcl == 0xFFFFFFFF) res = FR_DISK_ERR; /* Disk error? */ + tm = GET_FATTIME(); + if (res == FR_OK) { + res = dir_clear(fs, dcl); /* Clean up the new table */ + if (res == FR_OK) { + if (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) { /* Create dot entries (FAT only) */ + mem_set(fs->win + DIR_Name, ' ', 11); /* Create "." entry */ + fs->win[DIR_Name] = '.'; + fs->win[DIR_Attr] = AM_DIR; + st_dword(fs->win + DIR_ModTime, tm); + st_clust(fs, fs->win, dcl); + mem_cpy(fs->win + SZDIRE, fs->win, SZDIRE); /* Create ".." entry */ + fs->win[SZDIRE + 1] = '.'; pcl = dj.obj.sclust; + st_clust(fs, fs->win + SZDIRE, pcl); + fs->wflag = 1; + } + res = dir_register(&dj); /* Register the object to the parent directoy */ + } + } + if (res == FR_OK) { +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* Initialize directory entry block */ + st_dword(fs->dirbuf + XDIR_ModTime, tm); /* Created time */ + st_dword(fs->dirbuf + XDIR_FstClus, dcl); /* Table start cluster */ + st_dword(fs->dirbuf + XDIR_FileSize, (DWORD)fs->csize * SS(fs)); /* File size needs to be valid */ + st_dword(fs->dirbuf + XDIR_ValidFileSize, (DWORD)fs->csize * SS(fs)); + fs->dirbuf[XDIR_GenFlags] = 3; /* Initialize the object flag */ + fs->dirbuf[XDIR_Attr] = AM_DIR; /* Attribute */ + res = store_xdir(&dj); + } else +#endif + { + st_dword(dj.dir + DIR_ModTime, tm); /* Created time */ + st_clust(fs, dj.dir, dcl); /* Table start cluster */ + dj.dir[DIR_Attr] = AM_DIR; /* Attribute */ + fs->wflag = 1; + } + if (res == FR_OK) { + res = sync_fs(fs); + } + } else { + remove_chain(&sobj, dcl, 0); /* Could not register, remove the allocated cluster */ + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Rename a File/Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_rename ( + const TCHAR* path_old, /* Pointer to the object name to be renamed */ + const TCHAR* path_new /* Pointer to the new name */ +) +{ + FRESULT res; + DIR djo, djn; + FATFS *fs; + BYTE buf[FF_FS_EXFAT ? SZDIRE * 2 : SZDIRE], *dir; + DWORD dw; + DEF_NAMBUF + + + get_ldnumber(&path_new); /* Snip the drive number of new name off */ + res = find_volume(&path_old, &fs, FA_WRITE); /* Get logical drive of the old object */ + if (res == FR_OK) { + djo.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&djo, path_old); /* Check old object */ + if (res == FR_OK && (djo.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME; /* Check validity of name */ +#if FF_FS_LOCK != 0 + if (res == FR_OK) { + res = chk_lock(&djo, 2); + } +#endif + if (res == FR_OK) { /* Object to be renamed is found */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* At exFAT volume */ + BYTE nf, nn; + WORD nh; + + mem_cpy(buf, fs->dirbuf, SZDIRE * 2); /* Save 85+C0 entry of old object */ + mem_cpy(&djn, &djo, sizeof djo); + res = follow_path(&djn, path_new); /* Make sure if new object name is not in use */ + if (res == FR_OK) { /* Is new name already in use by any other object? */ + res = (djn.obj.sclust == djo.obj.sclust && djn.dptr == djo.dptr) ? FR_NO_FILE : FR_EXIST; + } + if (res == FR_NO_FILE) { /* It is a valid path and no name collision */ + res = dir_register(&djn); /* Register the new entry */ + if (res == FR_OK) { + nf = fs->dirbuf[XDIR_NumSec]; nn = fs->dirbuf[XDIR_NumName]; + nh = ld_word(fs->dirbuf + XDIR_NameHash); + mem_cpy(fs->dirbuf, buf, SZDIRE * 2); /* Restore 85+C0 entry */ + fs->dirbuf[XDIR_NumSec] = nf; fs->dirbuf[XDIR_NumName] = nn; + st_word(fs->dirbuf + XDIR_NameHash, nh); + if (!(fs->dirbuf[XDIR_Attr] & AM_DIR)) fs->dirbuf[XDIR_Attr] |= AM_ARC; /* Set archive attribute if it is a file */ +/* Start of critical section where an interruption can cause a cross-link */ + res = store_xdir(&djn); + } + } + } else +#endif + { /* At FAT/FAT32 volume */ + mem_cpy(buf, djo.dir, SZDIRE); /* Save directory entry of the object */ + mem_cpy(&djn, &djo, sizeof (DIR)); /* Duplicate the directory object */ + res = follow_path(&djn, path_new); /* Make sure if new object name is not in use */ + if (res == FR_OK) { /* Is new name already in use by any other object? */ + res = (djn.obj.sclust == djo.obj.sclust && djn.dptr == djo.dptr) ? FR_NO_FILE : FR_EXIST; + } + if (res == FR_NO_FILE) { /* It is a valid path and no name collision */ + res = dir_register(&djn); /* Register the new entry */ + if (res == FR_OK) { + dir = djn.dir; /* Copy directory entry of the object except name */ + mem_cpy(dir + 13, buf + 13, SZDIRE - 13); + dir[DIR_Attr] = buf[DIR_Attr]; + if (!(dir[DIR_Attr] & AM_DIR)) dir[DIR_Attr] |= AM_ARC; /* Set archive attribute if it is a file */ + fs->wflag = 1; + if ((dir[DIR_Attr] & AM_DIR) && djo.obj.sclust != djn.obj.sclust) { /* Update .. entry in the sub-directory if needed */ + dw = clst2sect(fs, ld_clust(fs, dir)); + if (dw == 0) { + res = FR_INT_ERR; + } else { +/* Start of critical section where an interruption can cause a cross-link */ + res = move_window(fs, dw); + dir = fs->win + SZDIRE * 1; /* Ptr to .. entry */ + if (res == FR_OK && dir[1] == '.') { + st_clust(fs, dir, djn.obj.sclust); + fs->wflag = 1; + } + } + } + } + } + } + if (res == FR_OK) { + res = dir_remove(&djo); /* Remove old entry */ + if (res == FR_OK) { + res = sync_fs(fs); + } + } +/* End of the critical section */ + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + +#endif /* !FF_FS_READONLY */ +#endif /* FF_FS_MINIMIZE == 0 */ +#endif /* FF_FS_MINIMIZE <= 1 */ +#endif /* FF_FS_MINIMIZE <= 2 */ + + + +#if FF_USE_CHMOD && !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Change Attribute */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_chmod ( + const TCHAR* path, /* Pointer to the file path */ + BYTE attr, /* Attribute bits */ + BYTE mask /* Attribute mask to change */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + DEF_NAMBUF + + + res = find_volume(&path, &fs, FA_WRITE); /* Get logical drive */ + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK && (dj.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME; /* Check object validity */ + if (res == FR_OK) { + mask &= AM_RDO|AM_HID|AM_SYS|AM_ARC; /* Valid attribute mask */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fs->dirbuf[XDIR_Attr] = (attr & mask) | (fs->dirbuf[XDIR_Attr] & (BYTE)~mask); /* Apply attribute change */ + res = store_xdir(&dj); + } else +#endif + { + dj.dir[DIR_Attr] = (attr & mask) | (dj.dir[DIR_Attr] & (BYTE)~mask); /* Apply attribute change */ + fs->wflag = 1; + } + if (res == FR_OK) { + res = sync_fs(fs); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change Timestamp */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_utime ( + const TCHAR* path, /* Pointer to the file/directory name */ + const FILINFO* fno /* Pointer to the timestamp to be set */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + DEF_NAMBUF + + + res = find_volume(&path, &fs, FA_WRITE); /* Get logical drive */ + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK && (dj.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME; /* Check object validity */ + if (res == FR_OK) { +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + st_dword(fs->dirbuf + XDIR_ModTime, (DWORD)fno->fdate << 16 | fno->ftime); + res = store_xdir(&dj); + } else +#endif + { + st_dword(dj.dir + DIR_ModTime, (DWORD)fno->fdate << 16 | fno->ftime); + fs->wflag = 1; + } + if (res == FR_OK) { + res = sync_fs(fs); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + +#endif /* FF_USE_CHMOD && !FF_FS_READONLY */ + + + +#if FF_USE_LABEL +/*-----------------------------------------------------------------------*/ +/* Get Volume Label */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_getlabel ( + const TCHAR* path, /* Logical drive number */ + TCHAR* label, /* Buffer to store the volume label */ + DWORD* vsn /* Variable to store the volume serial number */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + UINT si, di; + WCHAR wc; + + /* Get logical drive */ + res = find_volume(&path, &fs, 0); + + /* Get volume label */ + if (res == FR_OK && label) { + dj.obj.fs = fs; dj.obj.sclust = 0; /* Open root directory */ + res = dir_sdi(&dj, 0); + if (res == FR_OK) { + res = DIR_READ_LABEL(&dj); /* Find a volume label entry */ + if (res == FR_OK) { +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + WCHAR hs; + + for (si = di = hs = 0; si < dj.dir[XDIR_NumLabel]; si++) { /* Extract volume label from 83 entry */ + wc = ld_word(dj.dir + XDIR_Label + si * 2); + if (hs == 0 && IsSurrogate(wc)) { /* Is the code a surrogate? */ + hs = wc; continue; + } + wc = put_utf((DWORD)hs << 16 | wc, &label[di], 4); + if (wc == 0) { di = 0; break; } + di += wc; + hs = 0; + } + if (hs != 0) di = 0; /* Broken surrogate pair? */ + label[di] = 0; + } else +#endif + { + si = di = 0; /* Extract volume label from AM_VOL entry */ + while (si < 11) { + wc = dj.dir[si++]; +#if FF_USE_LFN && FF_LFN_UNICODE >= 1 /* Unicode output */ + if (dbc_1st((BYTE)wc) && si < 11) wc = wc << 8 | dj.dir[si++]; /* Is it a DBC? */ + wc = ff_oem2uni(wc, CODEPAGE); /* Convert it into Unicode */ + if (wc != 0) wc = put_utf(wc, &label[di], 4); /* Put it in Unicode */ + if (wc == 0) { di = 0; break; } + di += wc; +#else /* ANSI/OEM output */ + label[di++] = (TCHAR)wc; +#endif + } + do { /* Truncate trailing spaces */ + label[di] = 0; + if (di == 0) break; + } while (label[--di] == ' '); + } + } + } + if (res == FR_NO_FILE) { /* No label entry and return nul string */ + label[0] = 0; + res = FR_OK; + } + } + + /* Get volume serial number */ + if (res == FR_OK && vsn) { + res = move_window(fs, fs->volbase); + if (res == FR_OK) { + switch (fs->fs_type) { + case FS_EXFAT: + di = BPB_VolIDEx; break; + + case FS_FAT32: + di = BS_VolID32; break; + + default: + di = BS_VolID; + } + *vsn = ld_dword(fs->win + di); + } + } + + LEAVE_FF(fs, res); +} + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Set Volume Label */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_setlabel ( + const TCHAR* label /* Volume label to set with heading logical drive number */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + BYTE dirvn[22]; + UINT di; + WCHAR wc; + static const char badchr[] = "+.,;=[]/\\\"*:<>\?|\x7F"; /* [0..] for FAT, [7..] for exFAT */ +#if FF_USE_LFN + DWORD dc; +#endif + + /* Get logical drive */ + res = find_volume(&label, &fs, FA_WRITE); + if (res != FR_OK) LEAVE_FF(fs, res); + +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + mem_set(dirvn, 0, 22); + di = 0; + while ((UINT)*label >= ' ') { /* Create volume label */ + dc = tchar2uni(&label); /* Get a Unicode character */ + if (dc >= 0x10000) { + if (dc == 0xFFFFFFFF || di >= 10) { /* Wrong surrogate or buffer overflow */ + dc = 0; + } else { + st_word(dirvn + di * 2, (WCHAR)(dc >> 16)); di++; + } + } + if (dc == 0 || chk_chr(badchr + 7, (int)dc) || di >= 11) { /* Check validity of the volume label */ + LEAVE_FF(fs, FR_INVALID_NAME); + } + st_word(dirvn + di * 2, (WCHAR)dc); di++; + } + } else +#endif + { /* On the FAT/FAT32 volume */ + mem_set(dirvn, ' ', 11); + di = 0; + while ((UINT)*label >= ' ') { /* Create volume label */ +#if FF_USE_LFN + dc = tchar2uni(&label); + wc = (dc < 0x10000) ? ff_uni2oem(ff_wtoupper(dc), CODEPAGE) : 0; +#else /* ANSI/OEM input */ + wc = (BYTE)*label++; + if (dbc_1st((BYTE)wc)) wc = dbc_2nd((BYTE)*label) ? wc << 8 | (BYTE)*label++ : 0; + if (IsLower(wc)) wc -= 0x20; /* To upper ASCII characters */ +#if FF_CODE_PAGE == 0 + if (ExCvt && wc >= 0x80) wc = ExCvt[wc - 0x80]; /* To upper extended characters (SBCS cfg) */ +#elif FF_CODE_PAGE < 900 + if (wc >= 0x80) wc = ExCvt[wc - 0x80]; /* To upper extended characters (SBCS cfg) */ +#endif +#endif + if (wc == 0 || chk_chr(badchr + 0, (int)wc) || di >= (UINT)((wc >= 0x100) ? 10 : 11)) { /* Reject invalid characters for volume label */ + LEAVE_FF(fs, FR_INVALID_NAME); + } + if (wc >= 0x100) dirvn[di++] = (BYTE)(wc >> 8); + dirvn[di++] = (BYTE)wc; + } + if (dirvn[0] == DDEM) LEAVE_FF(fs, FR_INVALID_NAME); /* Reject illegal name (heading DDEM) */ + while (di && dirvn[di - 1] == ' ') di--; /* Snip trailing spaces */ + } + + /* Set volume label */ + dj.obj.fs = fs; dj.obj.sclust = 0; /* Open root directory */ + res = dir_sdi(&dj, 0); + if (res == FR_OK) { + res = DIR_READ_LABEL(&dj); /* Get volume label entry */ + if (res == FR_OK) { + if (FF_FS_EXFAT && fs->fs_type == FS_EXFAT) { + dj.dir[XDIR_NumLabel] = (BYTE)di; /* Change the volume label */ + mem_cpy(dj.dir + XDIR_Label, dirvn, 22); + } else { + if (di != 0) { + mem_cpy(dj.dir, dirvn, 11); /* Change the volume label */ + } else { + dj.dir[DIR_Name] = DDEM; /* Remove the volume label */ + } + } + fs->wflag = 1; + res = sync_fs(fs); + } else { /* No volume label entry or an error */ + if (res == FR_NO_FILE) { + res = FR_OK; + if (di != 0) { /* Create a volume label entry */ + res = dir_alloc(&dj, 1); /* Allocate an entry */ + if (res == FR_OK) { + mem_set(dj.dir, 0, SZDIRE); /* Clean the entry */ + if (FF_FS_EXFAT && fs->fs_type == FS_EXFAT) { + dj.dir[XDIR_Type] = ET_VLABEL; /* Create volume label entry */ + dj.dir[XDIR_NumLabel] = (BYTE)di; + mem_cpy(dj.dir + XDIR_Label, dirvn, 22); + } else { + dj.dir[DIR_Attr] = AM_VOL; /* Create volume label entry */ + mem_cpy(dj.dir, dirvn, 11); + } + fs->wflag = 1; + res = sync_fs(fs); + } + } + } + } + } + + LEAVE_FF(fs, res); +} + +#endif /* !FF_FS_READONLY */ +#endif /* FF_USE_LABEL */ + + + +#if FF_USE_EXPAND && !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Allocate a Contiguous Blocks to the File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_expand ( + FIL* fp, /* Pointer to the file object */ + FSIZE_t fsz, /* File size to be expanded to */ + BYTE opt /* Operation mode 0:Find and prepare or 1:Find and allocate */ +) +{ + FRESULT res; + FATFS *fs; + DWORD n, clst, stcl, scl, ncl, tcl, lclst; + + + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); + if (fsz == 0 || fp->obj.objsize != 0 || !(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED); +#if FF_FS_EXFAT + if (fs->fs_type != FS_EXFAT && fsz >= 0x100000000) LEAVE_FF(fs, FR_DENIED); /* Check if in size limit */ +#endif + n = (DWORD)fs->csize * SS(fs); /* Cluster size */ + tcl = (DWORD)(fsz / n) + ((fsz & (n - 1)) ? 1 : 0); /* Number of clusters required */ + stcl = fs->last_clst; lclst = 0; + if (stcl < 2 || stcl >= fs->n_fatent) stcl = 2; + +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + scl = find_bitmap(fs, stcl, tcl); /* Find a contiguous cluster block */ + if (scl == 0) res = FR_DENIED; /* No contiguous cluster block was found */ + if (scl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (res == FR_OK) { /* A contiguous free area is found */ + if (opt) { /* Allocate it now */ + res = change_bitmap(fs, scl, tcl, 1); /* Mark the cluster block 'in use' */ + lclst = scl + tcl - 1; + } else { /* Set it as suggested point for next allocation */ + lclst = scl - 1; + } + } + } else +#endif + { + scl = clst = stcl; ncl = 0; + for (;;) { /* Find a contiguous cluster block */ + n = get_fat(&fp->obj, clst); + if (++clst >= fs->n_fatent) clst = 2; + if (n == 1) { res = FR_INT_ERR; break; } + if (n == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } + if (n == 0) { /* Is it a free cluster? */ + if (++ncl == tcl) break; /* Break if a contiguous cluster block is found */ + } else { + scl = clst; ncl = 0; /* Not a free cluster */ + } + if (clst == stcl) { res = FR_DENIED; break; } /* No contiguous cluster? */ + } + if (res == FR_OK) { /* A contiguous free area is found */ + if (opt) { /* Allocate it now */ + for (clst = scl, n = tcl; n; clst++, n--) { /* Create a cluster chain on the FAT */ + res = put_fat(fs, clst, (n == 1) ? 0xFFFFFFFF : clst + 1); + if (res != FR_OK) break; + lclst = clst; + } + } else { /* Set it as suggested point for next allocation */ + lclst = scl - 1; + } + } + } + + if (res == FR_OK) { + fs->last_clst = lclst; /* Set suggested start cluster to start next */ + if (opt) { /* Is it allocated now? */ + fp->obj.sclust = scl; /* Update object allocation information */ + fp->obj.objsize = fsz; + if (FF_FS_EXFAT) fp->obj.stat = 2; /* Set status 'contiguous chain' */ + fp->flag |= FA_MODIFIED; + if (fs->free_clst <= fs->n_fatent - 2) { /* Update FSINFO */ + fs->free_clst -= tcl; + fs->fsi_flag |= 1; + } + } + } + + LEAVE_FF(fs, res); +} + +#endif /* FF_USE_EXPAND && !FF_FS_READONLY */ + + + +#if FF_USE_FORWARD +/*-----------------------------------------------------------------------*/ +/* Forward Data to the Stream Directly */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_forward ( + FIL* fp, /* Pointer to the file object */ + UINT (*func)(const BYTE*,UINT), /* Pointer to the streaming function */ + UINT btf, /* Number of bytes to forward */ + UINT* bf /* Pointer to number of bytes forwarded */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, sect; + FSIZE_t remain; + UINT rcnt, csect; + BYTE *dbuf; + + + *bf = 0; /* Clear transfer byte counter */ + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); + if (!(fp->flag & FA_READ)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + + remain = fp->obj.objsize - fp->fptr; + if (btf > remain) btf = (UINT)remain; /* Truncate btf by remaining bytes */ + + for ( ; btf && (*func)(0, 0); /* Repeat until all data transferred or stream goes busy */ + fp->fptr += rcnt, *bf += rcnt, btf -= rcnt) { + csect = (UINT)(fp->fptr / SS(fs) & (fs->csize - 1)); /* Sector offset in the cluster */ + if (fp->fptr % SS(fs) == 0) { /* On the sector boundary? */ + if (csect == 0) { /* On the cluster boundary? */ + clst = (fp->fptr == 0) ? /* On the top of the file? */ + fp->obj.sclust : get_fat(&fp->obj, fp->clust); + if (clst <= 1) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + } + } + sect = clst2sect(fs, fp->clust); /* Get current data sector */ + if (sect == 0) ABORT(fs, FR_INT_ERR); + sect += csect; +#if FF_FS_TINY + if (move_window(fs, sect) != FR_OK) ABORT(fs, FR_DISK_ERR); /* Move sector window to the file data */ + dbuf = fs->win; +#else + if (fp->sect != sect) { /* Fill sector cache with file data */ +#if !FF_FS_READONLY + if (fp->flag & FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + if (disk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + } + dbuf = fp->buf; +#endif + fp->sect = sect; + rcnt = SS(fs) - (UINT)fp->fptr % SS(fs); /* Number of bytes left in the sector */ + if (rcnt > btf) rcnt = btf; /* Clip it by btr if needed */ + rcnt = (*func)(dbuf + ((UINT)fp->fptr % SS(fs)), rcnt); /* Forward the file data */ + if (rcnt == 0) ABORT(fs, FR_INT_ERR); + } + + LEAVE_FF(fs, FR_OK); +} +#endif /* FF_USE_FORWARD */ + + + +#if FF_USE_MKFS && !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Create an FAT/exFAT volume */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mkfs ( + const TCHAR* path, /* Logical drive number */ + BYTE opt, /* Format option */ + DWORD au, /* Size of allocation unit (cluster) [byte] */ + void* work, /* Pointer to working buffer (null: use heap memory) */ + UINT len /* Size of working buffer [byte] */ +) +{ + const UINT n_fats = 1; /* Number of FATs for FAT/FAT32 volume (1 or 2) */ + const UINT n_rootdir = 512; /* Number of root directory entries for FAT volume */ + static const WORD cst[] = {1, 4, 16, 64, 256, 512, 0}; /* Cluster size boundary for FAT volume (4Ks unit) */ + static const WORD cst32[] = {1, 2, 4, 8, 16, 32, 0}; /* Cluster size boundary for FAT32 volume (128Ks unit) */ + BYTE fmt, sys, *buf, *pte, pdrv, part; + WORD ss; /* Sector size */ + DWORD szb_buf, sz_buf, sz_blk, n_clst, pau, sect, nsect, n; + DWORD b_vol, b_fat, b_data; /* Base LBA for volume, fat, data */ + DWORD sz_vol, sz_rsv, sz_fat, sz_dir; /* Size for volume, fat, dir, data */ + UINT i; + int vol; + DSTATUS stat; +#if FF_USE_TRIM || FF_FS_EXFAT + DWORD tbl[3]; +#endif + + + /* Check mounted drive and clear work area */ + vol = get_ldnumber(&path); /* Get target logical drive */ + if (vol < 0) return FR_INVALID_DRIVE; + if (FatFs[vol]) FatFs[vol]->fs_type = 0; /* Clear the volume if mounted */ + pdrv = LD2PD(vol); /* Physical drive */ + part = LD2PT(vol); /* Partition (0:create as new, 1-4:get from partition table) */ + + /* Check physical drive status */ + stat = disk_initialize(pdrv); + if (stat & STA_NOINIT) return FR_NOT_READY; + if (stat & STA_PROTECT) return FR_WRITE_PROTECTED; + if (disk_ioctl(pdrv, GET_BLOCK_SIZE, &sz_blk) != RES_OK || !sz_blk || sz_blk > 32768 || (sz_blk & (sz_blk - 1))) sz_blk = 1; /* Erase block to align data area */ +#if FF_MAX_SS != FF_MIN_SS /* Get sector size of the medium if variable sector size cfg. */ + if (disk_ioctl(pdrv, GET_SECTOR_SIZE, &ss) != RES_OK) return FR_DISK_ERR; + if (ss > FF_MAX_SS || ss < FF_MIN_SS || (ss & (ss - 1))) return FR_DISK_ERR; +#else + ss = FF_MAX_SS; +#endif + if ((au != 0 && au < ss) || au > 0x1000000 || (au & (au - 1))) return FR_INVALID_PARAMETER; /* Check if au is valid */ + au /= ss; /* Cluster size in unit of sector */ + + /* Get working buffer */ +#if FF_USE_LFN == 3 + if (!work) { /* Use heap memory for working buffer */ + for (szb_buf = MAX_MALLOC, buf = 0; szb_buf >= ss && (buf = ff_memalloc(szb_buf)) == 0; szb_buf /= 2) ; + sz_buf = szb_buf / ss; /* Size of working buffer (sector) */ + } else +#endif + { + buf = (BYTE*)work; /* Working buffer */ + sz_buf = len / ss; /* Size of working buffer (sector) */ + szb_buf = sz_buf * ss; /* Size of working buffer (byte) */ + } + if (!buf || sz_buf == 0) return FR_NOT_ENOUGH_CORE; + + /* Determine where the volume to be located (b_vol, sz_vol) */ + if (FF_MULTI_PARTITION && part != 0) { + /* Get partition information from partition table in the MBR */ + if (disk_read(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Load MBR */ + if (ld_word(buf + BS_55AA) != 0xAA55) LEAVE_MKFS(FR_MKFS_ABORTED); /* Check if MBR is valid */ + pte = buf + (MBR_Table + (part - 1) * SZ_PTE); + if (pte[PTE_System] == 0) LEAVE_MKFS(FR_MKFS_ABORTED); /* No partition? */ + b_vol = ld_dword(pte + PTE_StLba); /* Get volume start sector */ + sz_vol = ld_dword(pte + PTE_SizLba); /* Get volume size */ + } else { + /* Create a single-partition in this function */ + if (disk_ioctl(pdrv, GET_SECTOR_COUNT, &sz_vol) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + b_vol = (opt & FM_SFD) ? 0 : 63; /* Volume start sector */ + if (sz_vol < b_vol) LEAVE_MKFS(FR_MKFS_ABORTED); + sz_vol -= b_vol; /* Volume size */ + } + if (sz_vol < 128) LEAVE_MKFS(FR_MKFS_ABORTED); /* Check if volume size is >=128s */ + + /* Pre-determine the FAT type */ + do { + if (FF_FS_EXFAT && (opt & FM_EXFAT)) { /* exFAT possible? */ + if ((opt & FM_ANY) == FM_EXFAT || sz_vol >= 0x4000000 || au > 128) { /* exFAT only, vol >= 64Ms or au > 128s ? */ + fmt = FS_EXFAT; break; + } + } + if (au > 128) LEAVE_MKFS(FR_INVALID_PARAMETER); /* Too large au for FAT/FAT32 */ + if (opt & FM_FAT32) { /* FAT32 possible? */ + if ((opt & FM_ANY) == FM_FAT32 || !(opt & FM_FAT)) { /* FAT32 only or no-FAT? */ + fmt = FS_FAT32; break; + } + } + if (!(opt & FM_FAT)) LEAVE_MKFS(FR_INVALID_PARAMETER); /* no-FAT? */ + fmt = FS_FAT16; + } while (0); + +#if FF_FS_EXFAT + if (fmt == FS_EXFAT) { /* Create an exFAT volume */ + DWORD szb_bit, szb_case, sum, nb, cl; + WCHAR ch, si; + UINT j, st; + BYTE b; + + if (sz_vol < 0x1000) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too small volume? */ +#if FF_USE_TRIM + tbl[0] = b_vol; tbl[1] = b_vol + sz_vol - 1; /* Inform the device the volume area may be erased */ + disk_ioctl(pdrv, CTRL_TRIM, tbl); +#endif + /* Determine FAT location, data location and number of clusters */ + if (au == 0) { /* au auto-selection */ + au = 8; + if (sz_vol >= 0x80000) au = 64; /* >= 512Ks */ + if (sz_vol >= 0x4000000) au = 256; /* >= 64Ms */ + } + b_fat = b_vol + 32; /* FAT start at offset 32 */ + sz_fat = ((sz_vol / au + 2) * 4 + ss - 1) / ss; /* Number of FAT sectors */ + b_data = (b_fat + sz_fat + sz_blk - 1) & ~(sz_blk - 1); /* Align data area to the erase block boundary */ + if (b_data - b_vol >= sz_vol / 2) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too small volume? */ + n_clst = (sz_vol - (b_data - b_vol)) / au; /* Number of clusters */ + if (n_clst <16) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too few clusters? */ + if (n_clst > MAX_EXFAT) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too many clusters? */ + + szb_bit = (n_clst + 7) / 8; /* Size of allocation bitmap */ + tbl[0] = (szb_bit + au * ss - 1) / (au * ss); /* Number of allocation bitmap clusters */ + + /* Create a compressed up-case table */ + sect = b_data + au * tbl[0]; /* Table start sector */ + sum = 0; /* Table checksum to be stored in the 82 entry */ + st = 0; si = 0; i = 0; j = 0; szb_case = 0; + do { + switch (st) { + case 0: + ch = (WCHAR)ff_wtoupper(si); /* Get an up-case char */ + if (ch != si) { + si++; break; /* Store the up-case char if exist */ + } + for (j = 1; (WCHAR)(si + j) && (WCHAR)(si + j) == ff_wtoupper((WCHAR)(si + j)); j++) ; /* Get run length of no-case block */ + if (j >= 128) { + ch = 0xFFFF; st = 2; break; /* Compress the no-case block if run is >= 128 */ + } + st = 1; /* Do not compress short run */ + /* go to next case */ + case 1: + ch = si++; /* Fill the short run */ + if (--j == 0) st = 0; + break; + + default: + ch = (WCHAR)j; si += (WCHAR)j; /* Number of chars to skip */ + st = 0; + } + sum = xsum32(buf[i + 0] = (BYTE)ch, sum); /* Put it into the write buffer */ + sum = xsum32(buf[i + 1] = (BYTE)(ch >> 8), sum); + i += 2; szb_case += 2; + if (si == 0 || i == szb_buf) { /* Write buffered data when buffer full or end of process */ + n = (i + ss - 1) / ss; + if (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + sect += n; i = 0; + } + } while (si); + tbl[1] = (szb_case + au * ss - 1) / (au * ss); /* Number of up-case table clusters */ + tbl[2] = 1; /* Number of root dir clusters */ + + /* Initialize the allocation bitmap */ + sect = b_data; nsect = (szb_bit + ss - 1) / ss; /* Start of bitmap and number of sectors */ + nb = tbl[0] + tbl[1] + tbl[2]; /* Number of clusters in-use by system */ + do { + mem_set(buf, 0, szb_buf); + for (i = 0; nb >= 8 && i < szb_buf; buf[i++] = 0xFF, nb -= 8) ; + for (b = 1; nb != 0 && i < szb_buf; buf[i] |= b, b <<= 1, nb--) ; + n = (nsect > sz_buf) ? sz_buf : nsect; /* Write the buffered data */ + if (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + sect += n; nsect -= n; + } while (nsect); + + /* Initialize the FAT */ + sect = b_fat; nsect = sz_fat; /* Start of FAT and number of FAT sectors */ + j = nb = cl = 0; + do { + mem_set(buf, 0, szb_buf); i = 0; /* Clear work area and reset write index */ + if (cl == 0) { /* Set entry 0 and 1 */ + st_dword(buf + i, 0xFFFFFFF8); i += 4; cl++; + st_dword(buf + i, 0xFFFFFFFF); i += 4; cl++; + } + do { /* Create chains of bitmap, up-case and root dir */ + while (nb != 0 && i < szb_buf) { /* Create a chain */ + st_dword(buf + i, (nb > 1) ? cl + 1 : 0xFFFFFFFF); + i += 4; cl++; nb--; + } + if (nb == 0 && j < 3) nb = tbl[j++]; /* Next chain */ + } while (nb != 0 && i < szb_buf); + n = (nsect > sz_buf) ? sz_buf : nsect; /* Write the buffered data */ + if (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + sect += n; nsect -= n; + } while (nsect); + + /* Initialize the root directory */ + mem_set(buf, 0, szb_buf); + buf[SZDIRE * 0 + 0] = ET_VLABEL; /* Volume label entry */ + buf[SZDIRE * 1 + 0] = ET_BITMAP; /* Bitmap entry */ + st_dword(buf + SZDIRE * 1 + 20, 2); /* cluster */ + st_dword(buf + SZDIRE * 1 + 24, szb_bit); /* size */ + buf[SZDIRE * 2 + 0] = ET_UPCASE; /* Up-case table entry */ + st_dword(buf + SZDIRE * 2 + 4, sum); /* sum */ + st_dword(buf + SZDIRE * 2 + 20, 2 + tbl[0]); /* cluster */ + st_dword(buf + SZDIRE * 2 + 24, szb_case); /* size */ + sect = b_data + au * (tbl[0] + tbl[1]); nsect = au; /* Start of the root directory and number of sectors */ + do { /* Fill root directory sectors */ + n = (nsect > sz_buf) ? sz_buf : nsect; + if (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + mem_set(buf, 0, ss); + sect += n; nsect -= n; + } while (nsect); + + /* Create two set of the exFAT VBR blocks */ + sect = b_vol; + for (n = 0; n < 2; n++) { + /* Main record (+0) */ + mem_set(buf, 0, ss); + mem_cpy(buf + BS_JmpBoot, "\xEB\x76\x90" "EXFAT ", 11); /* Boot jump code (x86), OEM name */ + st_dword(buf + BPB_VolOfsEx, b_vol); /* Volume offset in the physical drive [sector] */ + st_dword(buf + BPB_TotSecEx, sz_vol); /* Volume size [sector] */ + st_dword(buf + BPB_FatOfsEx, b_fat - b_vol); /* FAT offset [sector] */ + st_dword(buf + BPB_FatSzEx, sz_fat); /* FAT size [sector] */ + st_dword(buf + BPB_DataOfsEx, b_data - b_vol); /* Data offset [sector] */ + st_dword(buf + BPB_NumClusEx, n_clst); /* Number of clusters */ + st_dword(buf + BPB_RootClusEx, 2 + tbl[0] + tbl[1]); /* Root dir cluster # */ + st_dword(buf + BPB_VolIDEx, GET_FATTIME()); /* VSN */ + st_word(buf + BPB_FSVerEx, 0x100); /* Filesystem version (1.00) */ + for (buf[BPB_BytsPerSecEx] = 0, i = ss; i >>= 1; buf[BPB_BytsPerSecEx]++) ; /* Log2 of sector size [byte] */ + for (buf[BPB_SecPerClusEx] = 0, i = au; i >>= 1; buf[BPB_SecPerClusEx]++) ; /* Log2 of cluster size [sector] */ + buf[BPB_NumFATsEx] = 1; /* Number of FATs */ + buf[BPB_DrvNumEx] = 0x80; /* Drive number (for int13) */ + st_word(buf + BS_BootCodeEx, 0xFEEB); /* Boot code (x86) */ + st_word(buf + BS_55AA, 0xAA55); /* Signature (placed here regardless of sector size) */ + for (i = sum = 0; i < ss; i++) { /* VBR checksum */ + if (i != BPB_VolFlagEx && i != BPB_VolFlagEx + 1 && i != BPB_PercInUseEx) sum = xsum32(buf[i], sum); + } + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + /* Extended bootstrap record (+1..+8) */ + mem_set(buf, 0, ss); + st_word(buf + ss - 2, 0xAA55); /* Signature (placed at end of sector) */ + for (j = 1; j < 9; j++) { + for (i = 0; i < ss; sum = xsum32(buf[i++], sum)) ; /* VBR checksum */ + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + } + /* OEM/Reserved record (+9..+10) */ + mem_set(buf, 0, ss); + for ( ; j < 11; j++) { + for (i = 0; i < ss; sum = xsum32(buf[i++], sum)) ; /* VBR checksum */ + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + } + /* Sum record (+11) */ + for (i = 0; i < ss; i += 4) st_dword(buf + i, sum); /* Fill with checksum value */ + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + } + + } else +#endif /* FF_FS_EXFAT */ + { /* Create an FAT/FAT32 volume */ + do { + pau = au; + /* Pre-determine number of clusters and FAT sub-type */ + if (fmt == FS_FAT32) { /* FAT32 volume */ + if (pau == 0) { /* au auto-selection */ + n = sz_vol / 0x20000; /* Volume size in unit of 128KS */ + for (i = 0, pau = 1; cst32[i] && cst32[i] <= n; i++, pau <<= 1) ; /* Get from table */ + } + n_clst = sz_vol / pau; /* Number of clusters */ + sz_fat = (n_clst * 4 + 8 + ss - 1) / ss; /* FAT size [sector] */ + sz_rsv = 32; /* Number of reserved sectors */ + sz_dir = 0; /* No static directory */ + if (n_clst <= MAX_FAT16 || n_clst > MAX_FAT32) LEAVE_MKFS(FR_MKFS_ABORTED); + } else { /* FAT volume */ + if (pau == 0) { /* au auto-selection */ + n = sz_vol / 0x1000; /* Volume size in unit of 4KS */ + for (i = 0, pau = 1; cst[i] && cst[i] <= n; i++, pau <<= 1) ; /* Get from table */ + } + n_clst = sz_vol / pau; + if (n_clst > MAX_FAT12) { + n = n_clst * 2 + 4; /* FAT size [byte] */ + } else { + fmt = FS_FAT12; + n = (n_clst * 3 + 1) / 2 + 3; /* FAT size [byte] */ + } + sz_fat = (n + ss - 1) / ss; /* FAT size [sector] */ + sz_rsv = 1; /* Number of reserved sectors */ + sz_dir = (DWORD)n_rootdir * SZDIRE / ss; /* Rootdir size [sector] */ + } + b_fat = b_vol + sz_rsv; /* FAT base */ + b_data = b_fat + sz_fat * n_fats + sz_dir; /* Data base */ + + /* Align data base to erase block boundary (for flash memory media) */ + n = ((b_data + sz_blk - 1) & ~(sz_blk - 1)) - b_data; /* Next nearest erase block from current data base */ + if (fmt == FS_FAT32) { /* FAT32: Move FAT base */ + sz_rsv += n; b_fat += n; + } else { /* FAT: Expand FAT size */ + sz_fat += n / n_fats; + } + + /* Determine number of clusters and final check of validity of the FAT sub-type */ + if (sz_vol < b_data + pau * 16 - b_vol) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too small volume */ + n_clst = (sz_vol - sz_rsv - sz_fat * n_fats - sz_dir) / pau; + if (fmt == FS_FAT32) { + if (n_clst <= MAX_FAT16) { /* Too few clusters for FAT32 */ + if (au == 0 && (au = pau / 2) != 0) continue; /* Adjust cluster size and retry */ + LEAVE_MKFS(FR_MKFS_ABORTED); + } + } + if (fmt == FS_FAT16) { + if (n_clst > MAX_FAT16) { /* Too many clusters for FAT16 */ + if (au == 0 && (pau * 2) <= 64) { + au = pau * 2; continue; /* Adjust cluster size and retry */ + } + if ((opt & FM_FAT32)) { + fmt = FS_FAT32; continue; /* Switch type to FAT32 and retry */ + } + if (au == 0 && (au = pau * 2) <= 128) continue; /* Adjust cluster size and retry */ + LEAVE_MKFS(FR_MKFS_ABORTED); + } + if (n_clst <= MAX_FAT12) { /* Too few clusters for FAT16 */ + if (au == 0 && (au = pau * 2) <= 128) continue; /* Adjust cluster size and retry */ + LEAVE_MKFS(FR_MKFS_ABORTED); + } + } + if (fmt == FS_FAT12 && n_clst > MAX_FAT12) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too many clusters for FAT12 */ + + /* Ok, it is the valid cluster configuration */ + break; + } while (1); + +#if FF_USE_TRIM + tbl[0] = b_vol; tbl[1] = b_vol + sz_vol - 1; /* Inform the device the volume area can be erased */ + disk_ioctl(pdrv, CTRL_TRIM, tbl); +#endif + /* Create FAT VBR */ + mem_set(buf, 0, ss); + mem_cpy(buf + BS_JmpBoot, "\xEB\xFE\x90" "MSDOS5.0", 11);/* Boot jump code (x86), OEM name */ + st_word(buf + BPB_BytsPerSec, ss); /* Sector size [byte] */ + buf[BPB_SecPerClus] = (BYTE)pau; /* Cluster size [sector] */ + st_word(buf + BPB_RsvdSecCnt, (WORD)sz_rsv); /* Size of reserved area */ + buf[BPB_NumFATs] = (BYTE)n_fats; /* Number of FATs */ + st_word(buf + BPB_RootEntCnt, (WORD)((fmt == FS_FAT32) ? 0 : n_rootdir)); /* Number of root directory entries */ + if (sz_vol < 0x10000) { + st_word(buf + BPB_TotSec16, (WORD)sz_vol); /* Volume size in 16-bit LBA */ + } else { + st_dword(buf + BPB_TotSec32, sz_vol); /* Volume size in 32-bit LBA */ + } + buf[BPB_Media] = 0xF8; /* Media descriptor byte */ + st_word(buf + BPB_SecPerTrk, 63); /* Number of sectors per track (for int13) */ + st_word(buf + BPB_NumHeads, 255); /* Number of heads (for int13) */ + st_dword(buf + BPB_HiddSec, b_vol); /* Volume offset in the physical drive [sector] */ + if (fmt == FS_FAT32) { + st_dword(buf + BS_VolID32, GET_FATTIME()); /* VSN */ + st_dword(buf + BPB_FATSz32, sz_fat); /* FAT size [sector] */ + st_dword(buf + BPB_RootClus32, 2); /* Root directory cluster # (2) */ + st_word(buf + BPB_FSInfo32, 1); /* Offset of FSINFO sector (VBR + 1) */ + st_word(buf + BPB_BkBootSec32, 6); /* Offset of backup VBR (VBR + 6) */ + buf[BS_DrvNum32] = 0x80; /* Drive number (for int13) */ + buf[BS_BootSig32] = 0x29; /* Extended boot signature */ + mem_cpy(buf + BS_VolLab32, "NO NAME " "FAT32 ", 19); /* Volume label, FAT signature */ + } else { + st_dword(buf + BS_VolID, GET_FATTIME()); /* VSN */ + st_word(buf + BPB_FATSz16, (WORD)sz_fat); /* FAT size [sector] */ + buf[BS_DrvNum] = 0x80; /* Drive number (for int13) */ + buf[BS_BootSig] = 0x29; /* Extended boot signature */ + mem_cpy(buf + BS_VolLab, "NO NAME " "FAT ", 19); /* Volume label, FAT signature */ + } + st_word(buf + BS_55AA, 0xAA55); /* Signature (offset is fixed here regardless of sector size) */ + if (disk_write(pdrv, buf, b_vol, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Write it to the VBR sector */ + + /* Create FSINFO record if needed */ + if (fmt == FS_FAT32) { + disk_write(pdrv, buf, b_vol + 6, 1); /* Write backup VBR (VBR + 6) */ + mem_set(buf, 0, ss); + st_dword(buf + FSI_LeadSig, 0x41615252); + st_dword(buf + FSI_StrucSig, 0x61417272); + st_dword(buf + FSI_Free_Count, n_clst - 1); /* Number of free clusters */ + st_dword(buf + FSI_Nxt_Free, 2); /* Last allocated cluster# */ + st_word(buf + BS_55AA, 0xAA55); + disk_write(pdrv, buf, b_vol + 7, 1); /* Write backup FSINFO (VBR + 7) */ + disk_write(pdrv, buf, b_vol + 1, 1); /* Write original FSINFO (VBR + 1) */ + } + + /* Initialize FAT area */ + mem_set(buf, 0, (UINT)szb_buf); + sect = b_fat; /* FAT start sector */ + for (i = 0; i < n_fats; i++) { /* Initialize FATs each */ + if (fmt == FS_FAT32) { + st_dword(buf + 0, 0xFFFFFFF8); /* Entry 0 */ + st_dword(buf + 4, 0xFFFFFFFF); /* Entry 1 */ + st_dword(buf + 8, 0x0FFFFFFF); /* Entry 2 (root directory) */ + } else { + st_dword(buf + 0, (fmt == FS_FAT12) ? 0xFFFFF8 : 0xFFFFFFF8); /* Entry 0 and 1 */ + } + nsect = sz_fat; /* Number of FAT sectors */ + do { /* Fill FAT sectors */ + n = (nsect > sz_buf) ? sz_buf : nsect; + if (disk_write(pdrv, buf, sect, (UINT)n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + mem_set(buf, 0, ss); + sect += n; nsect -= n; + } while (nsect); + } + + /* Initialize root directory (fill with zero) */ + nsect = (fmt == FS_FAT32) ? pau : sz_dir; /* Number of root directory sectors */ + do { + n = (nsect > sz_buf) ? sz_buf : nsect; + if (disk_write(pdrv, buf, sect, (UINT)n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + sect += n; nsect -= n; + } while (nsect); + } + + /* Determine system ID in the partition table */ + if (FF_FS_EXFAT && fmt == FS_EXFAT) { + sys = 0x07; /* HPFS/NTFS/exFAT */ + } else { + if (fmt == FS_FAT32) { + sys = 0x0C; /* FAT32X */ + } else { + if (sz_vol >= 0x10000) { + sys = 0x06; /* FAT12/16 (large) */ + } else { + sys = (fmt == FS_FAT16) ? 0x04 : 0x01; /* FAT16 : FAT12 */ + } + } + } + + /* Update partition information */ + if (FF_MULTI_PARTITION && part != 0) { /* Created in the existing partition */ + /* Update system ID in the partition table */ + if (disk_read(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Read the MBR */ + buf[MBR_Table + (part - 1) * SZ_PTE + PTE_System] = sys; /* Set system ID */ + if (disk_write(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Write it back to the MBR */ + } else { /* Created as a new single partition */ + if (!(opt & FM_SFD)) { /* Create partition table if in FDISK format */ + mem_set(buf, 0, ss); + st_word(buf + BS_55AA, 0xAA55); /* MBR signature */ + pte = buf + MBR_Table; /* Create partition table for single partition in the drive */ + pte[PTE_Boot] = 0; /* Boot indicator */ + pte[PTE_StHead] = 1; /* Start head */ + pte[PTE_StSec] = 1; /* Start sector */ + pte[PTE_StCyl] = 0; /* Start cylinder */ + pte[PTE_System] = sys; /* System type */ + n = (b_vol + sz_vol) / (63 * 255); /* (End CHS may be invalid) */ + pte[PTE_EdHead] = 254; /* End head */ + pte[PTE_EdSec] = (BYTE)(((n >> 2) & 0xC0) | 63); /* End sector */ + pte[PTE_EdCyl] = (BYTE)n; /* End cylinder */ + st_dword(pte + PTE_StLba, b_vol); /* Start offset in LBA */ + st_dword(pte + PTE_SizLba, sz_vol); /* Size in sectors */ + if (disk_write(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Write it to the MBR */ + } + } + + if (disk_ioctl(pdrv, CTRL_SYNC, 0) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + + LEAVE_MKFS(FR_OK); +} + + + +#if FF_MULTI_PARTITION +/*-----------------------------------------------------------------------*/ +/* Create Partition Table on the Physical Drive */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_fdisk ( + BYTE pdrv, /* Physical drive number */ + const DWORD* szt, /* Pointer to the size table for each partitions */ + void* work /* Pointer to the working buffer (null: use heap memory) */ +) +{ + UINT i, n, sz_cyl, tot_cyl, b_cyl, e_cyl, p_cyl; + BYTE s_hd, e_hd, *p, *buf = (BYTE*)work; + DSTATUS stat; + DWORD sz_disk, sz_part, s_part; + FRESULT res; + + + stat = disk_initialize(pdrv); + if (stat & STA_NOINIT) return FR_NOT_READY; + if (stat & STA_PROTECT) return FR_WRITE_PROTECTED; + if (disk_ioctl(pdrv, GET_SECTOR_COUNT, &sz_disk)) return FR_DISK_ERR; + + buf = (BYTE*)work; +#if FF_USE_LFN == 3 + if (!buf) buf = ff_memalloc(FF_MAX_SS); /* Use heap memory for working buffer */ +#endif + if (!buf) return FR_NOT_ENOUGH_CORE; + + /* Determine the CHS without any consideration of the drive geometry */ + for (n = 16; n < 256 && sz_disk / n / 63 > 1024; n *= 2) ; + if (n == 256) n--; + e_hd = (BYTE)(n - 1); + sz_cyl = 63 * n; + tot_cyl = sz_disk / sz_cyl; + + /* Create partition table */ + mem_set(buf, 0, FF_MAX_SS); + p = buf + MBR_Table; b_cyl = 0; + for (i = 0; i < 4; i++, p += SZ_PTE) { + p_cyl = (szt[i] <= 100U) ? (DWORD)tot_cyl * szt[i] / 100 : szt[i] / sz_cyl; /* Number of cylinders */ + if (p_cyl == 0) continue; + s_part = (DWORD)sz_cyl * b_cyl; + sz_part = (DWORD)sz_cyl * p_cyl; + if (i == 0) { /* Exclude first track of cylinder 0 */ + s_hd = 1; + s_part += 63; sz_part -= 63; + } else { + s_hd = 0; + } + e_cyl = b_cyl + p_cyl - 1; /* End cylinder */ + if (e_cyl >= tot_cyl) LEAVE_MKFS(FR_INVALID_PARAMETER); + + /* Set partition table */ + p[1] = s_hd; /* Start head */ + p[2] = (BYTE)(((b_cyl >> 2) & 0xC0) | 1); /* Start sector */ + p[3] = (BYTE)b_cyl; /* Start cylinder */ + p[4] = 0x07; /* System type (temporary setting) */ + p[5] = e_hd; /* End head */ + p[6] = (BYTE)(((e_cyl >> 2) & 0xC0) | 63); /* End sector */ + p[7] = (BYTE)e_cyl; /* End cylinder */ + st_dword(p + 8, s_part); /* Start sector in LBA */ + st_dword(p + 12, sz_part); /* Number of sectors */ + + /* Next partition */ + b_cyl += p_cyl; + } + st_word(p, 0xAA55); /* MBR signature (always at offset 510) */ + + /* Write it to the MBR */ + res = (disk_write(pdrv, buf, 0, 1) == RES_OK && disk_ioctl(pdrv, CTRL_SYNC, 0) == RES_OK) ? FR_OK : FR_DISK_ERR; + LEAVE_MKFS(res); +} + +#endif /* FF_MULTI_PARTITION */ +#endif /* FF_USE_MKFS && !FF_FS_READONLY */ + + + + +#if FF_USE_STRFUNC +#if FF_USE_LFN && FF_LFN_UNICODE && (FF_STRF_ENCODE < 0 || FF_STRF_ENCODE > 3) +#error Wrong FF_STRF_ENCODE setting +#endif +/*-----------------------------------------------------------------------*/ +/* Get a String from the File */ +/*-----------------------------------------------------------------------*/ + +TCHAR* f_gets ( + TCHAR* buff, /* Pointer to the string buffer to read */ + int len, /* Size of string buffer (items) */ + FIL* fp /* Pointer to the file object */ +) +{ + int nc = 0; + TCHAR *p = buff; + BYTE s[4]; + UINT rc; + DWORD dc; +#if FF_USE_LFN && FF_LFN_UNICODE && FF_STRF_ENCODE <= 2 + WCHAR wc; +#endif +#if FF_USE_LFN && FF_LFN_UNICODE && FF_STRF_ENCODE == 3 + UINT ct; +#endif + +#if FF_USE_LFN && FF_LFN_UNICODE /* With code conversion (Unicode API) */ + /* Make a room for the character and terminator */ + if (FF_LFN_UNICODE == 1) len -= (FF_STRF_ENCODE == 0) ? 1 : 2; + if (FF_LFN_UNICODE == 2) len -= (FF_STRF_ENCODE == 0) ? 3 : 4; + if (FF_LFN_UNICODE == 3) len -= 1; + while (nc < len) { +#if FF_STRF_ENCODE == 0 /* Read a character in ANSI/OEM */ + f_read(fp, s, 1, &rc); + if (rc != 1) break; + wc = s[0]; + if (dbc_1st((BYTE)wc)) { + f_read(fp, s, 1, &rc); + if (rc != 1 || !dbc_2nd(s[0])) continue; + wc = wc << 8 | s[0]; + } + dc = ff_oem2uni(wc, CODEPAGE); + if (dc == 0) continue; +#elif FF_STRF_ENCODE == 1 || FF_STRF_ENCODE == 2 /* Read a character in UTF-16LE/BE */ + f_read(fp, s, 2, &rc); + if (rc != 2) break; + dc = (FF_STRF_ENCODE == 1) ? ld_word(s) : s[0] << 8 | s[1]; + if (IsSurrogateL(dc)) continue; + if (IsSurrogateH(dc)) { + f_read(fp, s, 2, &rc); + if (rc != 2) break; + wc = (FF_STRF_ENCODE == 1) ? ld_word(s) : s[0] << 8 | s[1]; + if (!IsSurrogateL(wc)) continue; + dc = ((dc & 0x3FF) + 0x40) << 10 | (wc & 0x3FF); + } +#else /* Read a character in UTF-8 */ + f_read(fp, s, 1, &rc); + if (rc != 1) break; + dc = s[0]; + if (dc >= 0x80) { /* Multi-byte character? */ + ct = 0; + if ((dc & 0xE0) == 0xC0) { dc &= 0x1F; ct = 1; } /* 2-byte? */ + if ((dc & 0xF0) == 0xE0) { dc &= 0x0F; ct = 2; } /* 3-byte? */ + if ((dc & 0xF8) == 0xF0) { dc &= 0x07; ct = 3; } /* 4-byte? */ + if (ct == 0) continue; + f_read(fp, s, ct, &rc); /* Get trailing bytes */ + if (rc != ct) break; + rc = 0; + do { /* Merge trailing bytes */ + if ((s[rc] & 0xC0) != 0x80) break; + dc = dc << 6 | (s[rc] & 0x3F); + } while (++rc < ct); + if (rc != ct || dc < 0x80 || IsSurrogate(dc) || dc >= 0x110000) continue; /* Wrong encoding? */ + } +#endif + if (FF_USE_STRFUNC == 2 && dc == '\r') continue; /* Strip \r off if needed */ +#if FF_LFN_UNICODE == 1 || FF_LFN_UNICODE == 3 /* Output it in UTF-16/32 encoding */ + if (FF_LFN_UNICODE == 1 && dc >= 0x10000) { /* Out of BMP at UTF-16? */ + *p++ = (TCHAR)(0xD800 | ((dc >> 10) - 0x40)); nc++; /* Make and output high surrogate */ + dc = 0xDC00 | (dc & 0x3FF); /* Make low surrogate */ + } + *p++ = (TCHAR)dc; nc++; + if (dc == '\n') break; /* End of line? */ +#elif FF_LFN_UNICODE == 2 /* Output it in UTF-8 encoding */ + if (dc < 0x80) { /* 1-byte */ + *p++ = (TCHAR)dc; + nc++; + if (dc == '\n') break; /* End of line? */ + } else { + if (dc < 0x800) { /* 2-byte */ + *p++ = (TCHAR)(0xC0 | (dc >> 6 & 0x1F)); + *p++ = (TCHAR)(0x80 | (dc >> 0 & 0x3F)); + nc += 2; + } else { + if (dc < 0x10000) { /* 3-byte */ + *p++ = (TCHAR)(0xE0 | (dc >> 12 & 0x0F)); + *p++ = (TCHAR)(0x80 | (dc >> 6 & 0x3F)); + *p++ = (TCHAR)(0x80 | (dc >> 0 & 0x3F)); + nc += 3; + } else { /* 4-byte */ + *p++ = (TCHAR)(0xF0 | (dc >> 18 & 0x07)); + *p++ = (TCHAR)(0x80 | (dc >> 12 & 0x3F)); + *p++ = (TCHAR)(0x80 | (dc >> 6 & 0x3F)); + *p++ = (TCHAR)(0x80 | (dc >> 0 & 0x3F)); + nc += 4; + } + } + } +#endif + } + +#else /* Byte-by-byte without any conversion (ANSI/OEM API) */ + len -= 1; /* Make a room for the terminator */ + while (nc < len) { + f_read(fp, s, 1, &rc); + if (rc != 1) break; + dc = s[0]; + if (FF_USE_STRFUNC == 2 && dc == '\r') continue; + *p++ = (TCHAR)dc; nc++; + if (dc == '\n') break; + } +#endif + + *p = 0; /* Terminate the string */ + return nc ? buff : 0; /* When no data read due to EOF or error, return with error. */ +} + + + + +#if !FF_FS_READONLY +#include +/*-----------------------------------------------------------------------*/ +/* Put a Character to the File */ +/*-----------------------------------------------------------------------*/ + +typedef struct { /* Putchar output buffer and work area */ + FIL *fp; /* Ptr to the writing file */ + int idx, nchr; /* Write index of buf[] (-1:error), number of encoding units written */ +#if FF_USE_LFN && FF_LFN_UNICODE == 1 + WCHAR hs; +#elif FF_USE_LFN && FF_LFN_UNICODE == 2 + BYTE bs[4]; + UINT wi, ct; +#endif + BYTE buf[64]; /* Write buffer */ +} putbuff; + + +static void putc_bfd ( /* Buffered write with code conversion */ + putbuff* pb, + TCHAR c +) +{ + UINT n; + int i, nc; +#if FF_USE_LFN && FF_LFN_UNICODE + WCHAR hs, wc; +#if FF_LFN_UNICODE == 2 + DWORD dc; + TCHAR *tp; +#endif +#endif + + if (FF_USE_STRFUNC == 2 && c == '\n') { /* LF -> CRLF conversion */ + putc_bfd(pb, '\r'); + } + + i = pb->idx; /* Write index of pb->buf[] */ + if (i < 0) return; + nc = pb->nchr; /* Write unit counter */ + +#if FF_USE_LFN && FF_LFN_UNICODE +#if FF_LFN_UNICODE == 1 /* UTF-16 input */ + if (IsSurrogateH(c)) { + pb->hs = c; return; + } + hs = pb->hs; pb->hs = 0; + if (hs != 0) { + if (!IsSurrogateL(c)) hs = 0; + } else { + if (IsSurrogateL(c)) return; + } + wc = c; +#elif FF_LFN_UNICODE == 2 /* UTF-8 input */ + for (;;) { + if (pb->ct == 0) { /* Out of multi-byte sequence? */ + pb->bs[pb->wi = 0] = (BYTE)c; /* Save 1st byte */ + if ((BYTE)c < 0x80) break; /* 1-byte? */ + if (((BYTE)c & 0xE0) == 0xC0) pb->ct = 1; /* 2-byte? */ + if (((BYTE)c & 0xF0) == 0xE0) pb->ct = 2; /* 3-byte? */ + if (((BYTE)c & 0xF1) == 0xF0) pb->ct = 3; /* 4-byte? */ + return; + } else { /* In the multi-byte sequence */ + if (((BYTE)c & 0xC0) != 0x80) { /* Broken sequence? */ + pb->ct = 0; continue; + } + pb->bs[++pb->wi] = (BYTE)c; /* Save the trailing byte */ + if (--pb->ct == 0) break; /* End of multi-byte sequence? */ + return; + } + } + tp = (TCHAR*)pb->bs; + dc = tchar2uni(&tp); /* UTF-8 ==> UTF-16 */ + if (dc == 0xFFFFFFFF) return; + wc = (WCHAR)dc; + hs = (WCHAR)(dc >> 16); +#elif FF_LFN_UNICODE == 3 /* UTF-32 input */ + if (IsSurrogate(c) || c >= 0x110000) return; + if (c >= 0x10000) { + hs = (WCHAR)(0xD800 | ((c >> 10) - 0x40)); /* Make high surrogate */ + wc = 0xDC00 | (c & 0x3FF); /* Make low surrogate */ + } else { + hs = 0; + wc = (WCHAR)c; + } +#endif + +#if FF_STRF_ENCODE == 1 /* Write a character in UTF-16LE */ + if (hs != 0) { + st_word(&pb->buf[i], hs); + i += 2; + nc++; + } + st_word(&pb->buf[i], wc); + i += 2; +#elif FF_STRF_ENCODE == 2 /* Write a character in UTF-16BE */ + if (hs != 0) { + pb->buf[i++] = (BYTE)(hs >> 8); + pb->buf[i++] = (BYTE)hs; + nc++; + } + pb->buf[i++] = (BYTE)(wc >> 8); + pb->buf[i++] = (BYTE)wc; +#elif FF_STRF_ENCODE == 3 /* Write it in UTF-8 */ + if (hs != 0) { /* 4-byte */ + nc += 3; + hs = (hs & 0x3FF) + 0x40; + pb->buf[i++] = (BYTE)(0xF0 | hs >> 8); + pb->buf[i++] = (BYTE)(0x80 | (hs >> 2 & 0x3F)); + pb->buf[i++] = (BYTE)(0x80 | (hs & 3) << 4 | (wc >> 6 & 0x0F)); + pb->buf[i++] = (BYTE)(0x80 | (wc & 0x3F)); + } else { + if (wc < 0x80) { /* 1-byte */ + pb->buf[i++] = (BYTE)wc; + } else { + if (wc < 0x800) { /* 2-byte */ + nc += 1; + pb->buf[i++] = (BYTE)(0xC0 | wc >> 6); + } else { /* 3-byte */ + nc += 2; + pb->buf[i++] = (BYTE)(0xE0 | wc >> 12); + pb->buf[i++] = (BYTE)(0x80 | (wc >> 6 & 0x3F)); + } + pb->buf[i++] = (BYTE)(0x80 | (wc & 0x3F)); + } + } +#else /* Write it in ANSI/OEM */ + if (hs != 0) return; + wc = ff_uni2oem(wc, CODEPAGE); /* UTF-16 ==> ANSI/OEM */ + if (wc == 0) return; + if (wc >= 0x100) { + pb->buf[i++] = (BYTE)(wc >> 8); nc++; + } + pb->buf[i++] = (BYTE)wc; +#endif + +#else /* ANSI/OEM input (without re-encode) */ + pb->buf[i++] = (BYTE)c; +#endif + + if (i >= (int)(sizeof pb->buf) - 4) { /* Write buffered characters to the file */ + f_write(pb->fp, pb->buf, (UINT)i, &n); + i = (n == (UINT)i) ? 0 : -1; + } + pb->idx = i; + pb->nchr = nc + 1; +} + + +static int putc_flush ( /* Flush left characters in the buffer */ + putbuff* pb +) +{ + UINT nw; + + if ( pb->idx >= 0 /* Flush buffered characters to the file */ + && f_write(pb->fp, pb->buf, (UINT)pb->idx, &nw) == FR_OK + && (UINT)pb->idx == nw) return pb->nchr; + return EOF; +} + + +static void putc_init ( /* Initialize write buffer */ + putbuff* pb, + FIL* fp +) +{ + mem_set(pb, 0, sizeof (putbuff)); + pb->fp = fp; +} + + + +int f_putc ( + TCHAR c, /* A character to be output */ + FIL* fp /* Pointer to the file object */ +) +{ + putbuff pb; + + + putc_init(&pb, fp); + putc_bfd(&pb, c); /* Put the character */ + return putc_flush(&pb); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a String to the File */ +/*-----------------------------------------------------------------------*/ + +int f_puts ( + const TCHAR* str, /* Pointer to the string to be output */ + FIL* fp /* Pointer to the file object */ +) +{ + putbuff pb; + + + putc_init(&pb, fp); + while (*str) putc_bfd(&pb, *str++); /* Put the string */ + return putc_flush(&pb); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a Formatted String to the File */ +/*-----------------------------------------------------------------------*/ + +int f_printf ( + FIL* fp, /* Pointer to the file object */ + const TCHAR* fmt, /* Pointer to the format string */ + ... /* Optional arguments... */ +) +{ + va_list arp; + putbuff pb; + BYTE f, r; + UINT i, j, w; + DWORD v; + TCHAR c, d, str[32], *p; + + + putc_init(&pb, fp); + + va_start(arp, fmt); + + for (;;) { + c = *fmt++; + if (c == 0) break; /* End of string */ + if (c != '%') { /* Non escape character */ + putc_bfd(&pb, c); + continue; + } + w = f = 0; + c = *fmt++; + if (c == '0') { /* Flag: '0' padding */ + f = 1; c = *fmt++; + } else { + if (c == '-') { /* Flag: left justified */ + f = 2; c = *fmt++; + } + } + if (c == '*') { /* Minimum width by argument */ + w = va_arg(arp, int); + c = *fmt++; + } else { + while (IsDigit(c)) { /* Minimum width */ + w = w * 10 + c - '0'; + c = *fmt++; + } + } + if (c == 'l' || c == 'L') { /* Type prefix: Size is long int */ + f |= 4; c = *fmt++; + } + if (c == 0) break; + d = c; + if (IsLower(d)) d -= 0x20; + switch (d) { /* Atgument type is... */ + case 'S' : /* String */ + p = va_arg(arp, TCHAR*); + for (j = 0; p[j]; j++) ; + if (!(f & 2)) { /* Right padded */ + while (j++ < w) putc_bfd(&pb, ' ') ; + } + while (*p) putc_bfd(&pb, *p++) ; /* String body */ + while (j++ < w) putc_bfd(&pb, ' ') ; /* Left padded */ + continue; + + case 'C' : /* Character */ + putc_bfd(&pb, (TCHAR)va_arg(arp, int)); continue; + + case 'B' : /* Unsigned binary */ + r = 2; break; + + case 'O' : /* Unsigned octal */ + r = 8; break; + + case 'D' : /* Signed decimal */ + case 'U' : /* Unsigned decimal */ + r = 10; break; + + case 'X' : /* Unsigned hexdecimal */ + r = 16; break; + + default: /* Unknown type (pass-through) */ + putc_bfd(&pb, c); continue; + } + + /* Get an argument and put it in numeral */ + v = (f & 4) ? (DWORD)va_arg(arp, long) : ((d == 'D') ? (DWORD)(long)va_arg(arp, int) : (DWORD)va_arg(arp, unsigned int)); + if (d == 'D' && (v & 0x80000000)) { + v = 0 - v; + f |= 8; + } + i = 0; + do { + d = (TCHAR)(v % r); v /= r; + if (d > 9) d += (c == 'x') ? 0x27 : 0x07; + str[i++] = d + '0'; + } while (v && i < sizeof str / sizeof *str); + if (f & 8) str[i++] = '-'; + j = i; d = (f & 1) ? '0' : ' '; + if (!(f & 2)) { + while (j++ < w) putc_bfd(&pb, d); /* Right pad */ + } + do { + putc_bfd(&pb, str[--i]); /* Number body */ + } while (i); + while (j++ < w) putc_bfd(&pb, d); /* Left pad */ + } + + va_end(arp); + + return putc_flush(&pb); +} + +#endif /* !FF_FS_READONLY */ +#endif /* FF_USE_STRFUNC */ + + + +#if FF_CODE_PAGE == 0 +/*-----------------------------------------------------------------------*/ +/* Set Active Codepage for the Path Name */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_setcp ( + WORD cp /* Value to be set as active code page */ +) +{ + static const WORD validcp[] = { 437, 720, 737, 771, 775, 850, 852, 857, 860, 861, 862, 863, 864, 865, 866, 869, 932, 936, 949, 950, 0}; + static const BYTE* const tables[] = {Ct437, Ct720, Ct737, Ct771, Ct775, Ct850, Ct852, Ct857, Ct860, Ct861, Ct862, Ct863, Ct864, Ct865, Ct866, Ct869, Dc932, Dc936, Dc949, Dc950, 0}; + UINT i; + + + for (i = 0; validcp[i] != 0 && validcp[i] != cp; i++) ; /* Find the code page */ + if (validcp[i] != cp) return FR_INVALID_PARAMETER; /* Not found? */ + + CodePage = cp; + if (cp >= 900) { /* DBCS */ + ExCvt = 0; + DbcTbl = tables[i]; + } else { /* SBCS */ + ExCvt = tables[i]; + DbcTbl = 0; + } + return FR_OK; +} +#endif /* FF_CODE_PAGE == 0 */ + +#endif /* McuLib_CONFIG_USE_FAT_FS */ diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/source/ff.h b/TSM_PicoW_Sensor/McuLib/FatFS/source/ff.h new file mode 100644 index 0000000..089dc51 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/source/ff.h @@ -0,0 +1,410 @@ +/*----------------------------------------------------------------------------/ +/ FatFs - Generic FAT Filesystem module R0.13c / +/-----------------------------------------------------------------------------/ +/ +/ Copyright (C) 2018, ChaN, all right reserved. +/ +/ FatFs module is an open source software. Redistribution and use of FatFs in +/ source and binary forms, with or without modification, are permitted provided +/ that the following condition is met: + +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. +/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +/ +/----------------------------------------------------------------------------*/ + + +#ifndef FF_DEFINED +#define FF_DEFINED 86604 /* Revision ID */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "McuLib.h" +#if McuLib_CONFIG_USE_FAT_FS + +#include "ffconf.h" /* FatFs configuration options */ + +#if FF_DEFINED != FFCONF_DEF +#error Wrong configuration file (ffconf.h). +#endif + + +/* Integer types used for FatFs API */ + +#if defined(_WIN32) /* Main development platform */ +#define FF_INTDEF 2 +#include +typedef unsigned __int64 QWORD; +#elif (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__cplusplus) /* C99 or later */ +#define FF_INTDEF 2 +#include +typedef unsigned int UINT; /* int must be 16-bit or 32-bit */ +typedef unsigned char BYTE; /* char must be 8-bit */ +typedef uint16_t WORD; /* 16-bit unsigned integer */ +typedef uint16_t WCHAR; /* 16-bit unsigned integer */ +typedef uint32_t DWORD; /* 32-bit unsigned integer */ +typedef uint64_t QWORD; /* 64-bit unsigned integer */ +#else /* Earlier than C99 */ +#define FF_INTDEF 1 +typedef unsigned int UINT; /* int must be 16-bit or 32-bit */ +typedef unsigned char BYTE; /* char must be 8-bit */ +typedef unsigned short WORD; /* 16-bit unsigned integer */ +typedef unsigned short WCHAR; /* 16-bit unsigned integer */ +typedef unsigned long DWORD; /* 32-bit unsigned integer */ +#endif + + +/* Definitions of volume management */ + +#if FF_MULTI_PARTITION /* Multiple partition configuration */ +typedef struct { + BYTE pd; /* Physical drive number */ + BYTE pt; /* Partition: 0:Auto detect, 1-4:Forced partition) */ +} PARTITION; +extern PARTITION VolToPart[]; /* Volume - Partition resolution table */ +#endif + +#if FF_STR_VOLUME_ID +#ifndef FF_VOLUME_STRS +extern const char* VolumeStr[FF_VOLUMES]; /* User defied volume ID */ +#endif +#endif + + + +/* Type of path name strings on FatFs API */ + +#ifndef _INC_TCHAR +#define _INC_TCHAR + +#if FF_USE_LFN && FF_LFN_UNICODE == 1 /* Unicode in UTF-16 encoding */ +typedef WCHAR TCHAR; +#define _T(x) L ## x +#define _TEXT(x) L ## x +#elif FF_USE_LFN && FF_LFN_UNICODE == 2 /* Unicode in UTF-8 encoding */ +typedef char TCHAR; +#define _T(x) u8 ## x +#define _TEXT(x) u8 ## x +#elif FF_USE_LFN && FF_LFN_UNICODE == 3 /* Unicode in UTF-32 encoding */ +typedef DWORD TCHAR; +#define _T(x) U ## x +#define _TEXT(x) U ## x +#elif FF_USE_LFN && (FF_LFN_UNICODE < 0 || FF_LFN_UNICODE > 3) +#error Wrong FF_LFN_UNICODE setting +#else /* ANSI/OEM code in SBCS/DBCS */ +typedef char TCHAR; +#define _T(x) x +#define _TEXT(x) x +#endif + +#endif + + + +/* Type of file size variables */ + +#if FF_FS_EXFAT +#if FF_INTDEF != 2 +#error exFAT feature wants C99 or later +#endif +typedef QWORD FSIZE_t; +#else +typedef DWORD FSIZE_t; +#endif + + + +/* Filesystem object structure (FATFS) */ + +typedef struct { + BYTE fs_type; /* Filesystem type (0:not mounted) */ + BYTE pdrv; /* Associated physical drive */ + BYTE n_fats; /* Number of FATs (1 or 2) */ + BYTE wflag; /* win[] flag (b0:dirty) */ + BYTE fsi_flag; /* FSINFO flags (b7:disabled, b0:dirty) */ + WORD id; /* Volume mount ID */ + WORD n_rootdir; /* Number of root directory entries (FAT12/16) */ + WORD csize; /* Cluster size [sectors] */ +#if FF_MAX_SS != FF_MIN_SS + WORD ssize; /* Sector size (512, 1024, 2048 or 4096) */ +#endif +#if FF_USE_LFN + WCHAR* lfnbuf; /* LFN working buffer */ +#endif +#if FF_FS_EXFAT + BYTE* dirbuf; /* Directory entry block scratchpad buffer for exFAT */ +#endif +#if FF_FS_REENTRANT + FF_SYNC_t sobj; /* Identifier of sync object */ +#endif +#if !FF_FS_READONLY + DWORD last_clst; /* Last allocated cluster */ + DWORD free_clst; /* Number of free clusters */ +#endif +#if FF_FS_RPATH + DWORD cdir; /* Current directory start cluster (0:root) */ +#if FF_FS_EXFAT + DWORD cdc_scl; /* Containing directory start cluster (invalid when cdir is 0) */ + DWORD cdc_size; /* b31-b8:Size of containing directory, b7-b0: Chain status */ + DWORD cdc_ofs; /* Offset in the containing directory (invalid when cdir is 0) */ +#endif +#endif + DWORD n_fatent; /* Number of FAT entries (number of clusters + 2) */ + DWORD fsize; /* Size of an FAT [sectors] */ + DWORD volbase; /* Volume base sector */ + DWORD fatbase; /* FAT base sector */ + DWORD dirbase; /* Root directory base sector/cluster */ + DWORD database; /* Data base sector */ +#if FF_FS_EXFAT + DWORD bitbase; /* Allocation bitmap base sector */ +#endif + DWORD winsect; /* Current sector appearing in the win[] */ + BYTE win[FF_MAX_SS]; /* Disk access window for Directory, FAT (and file data at tiny cfg) */ +} FATFS; + + + +/* Object ID and allocation information (FFOBJID) */ + +typedef struct { + FATFS* fs; /* Pointer to the hosting volume of this object */ + WORD id; /* Hosting volume mount ID */ + BYTE attr; /* Object attribute */ + BYTE stat; /* Object chain status (b1-0: =0:not contiguous, =2:contiguous, =3:fragmented in this session, b2:sub-directory stretched) */ + DWORD sclust; /* Object data start cluster (0:no cluster or root directory) */ + FSIZE_t objsize; /* Object size (valid when sclust != 0) */ +#if FF_FS_EXFAT + DWORD n_cont; /* Size of first fragment - 1 (valid when stat == 3) */ + DWORD n_frag; /* Size of last fragment needs to be written to FAT (valid when not zero) */ + DWORD c_scl; /* Containing directory start cluster (valid when sclust != 0) */ + DWORD c_size; /* b31-b8:Size of containing directory, b7-b0: Chain status (valid when c_scl != 0) */ + DWORD c_ofs; /* Offset in the containing directory (valid when file object and sclust != 0) */ +#endif +#if FF_FS_LOCK + UINT lockid; /* File lock ID origin from 1 (index of file semaphore table Files[]) */ +#endif +} FFOBJID; + + + +/* File object structure (FIL) */ + +typedef struct { + FFOBJID obj; /* Object identifier (must be the 1st member to detect invalid object pointer) */ + BYTE flag; /* File status flags */ + BYTE err; /* Abort flag (error code) */ + FSIZE_t fptr; /* File read/write pointer (Zeroed on file open) */ + DWORD clust; /* Current cluster of fpter (invalid when fptr is 0) */ + DWORD sect; /* Sector number appearing in buf[] (0:invalid) */ +#if !FF_FS_READONLY + DWORD dir_sect; /* Sector number containing the directory entry (not used at exFAT) */ + BYTE* dir_ptr; /* Pointer to the directory entry in the win[] (not used at exFAT) */ +#endif +#if FF_USE_FASTSEEK + DWORD* cltbl; /* Pointer to the cluster link map table (nulled on open, set by application) */ +#endif +#if !FF_FS_TINY + BYTE buf[FF_MAX_SS]; /* File private data read/write window */ +#endif +} FIL; + + + +/* Directory object structure (DIR) */ + +typedef struct { + FFOBJID obj; /* Object identifier */ + DWORD dptr; /* Current read/write offset */ + DWORD clust; /* Current cluster */ + DWORD sect; /* Current sector (0:Read operation has terminated) */ + BYTE* dir; /* Pointer to the directory item in the win[] */ + BYTE fn[12]; /* SFN (in/out) {body[8],ext[3],status[1]} */ +#if FF_USE_LFN + DWORD blk_ofs; /* Offset of current entry block being processed (0xFFFFFFFF:Invalid) */ +#endif +#if FF_USE_FIND + const TCHAR* pat; /* Pointer to the name matching pattern */ +#endif +} DIR; + + + +/* File information structure (FILINFO) */ + +typedef struct { + FSIZE_t fsize; /* File size */ + WORD fdate; /* Modified date */ + WORD ftime; /* Modified time */ + BYTE fattrib; /* File attribute */ +#if FF_USE_LFN + TCHAR altname[FF_SFN_BUF + 1];/* Altenative file name */ + TCHAR fname[FF_LFN_BUF + 1]; /* Primary file name */ +#else + TCHAR fname[12 + 1]; /* File name */ +#endif +} FILINFO; + + + +/* File function return code (FRESULT) */ + +typedef enum { + FR_OK = 0, /* (0) Succeeded */ + FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */ + FR_INT_ERR, /* (2) Assertion failed */ + FR_NOT_READY, /* (3) The physical drive cannot work */ + FR_NO_FILE, /* (4) Could not find the file */ + FR_NO_PATH, /* (5) Could not find the path */ + FR_INVALID_NAME, /* (6) The path name format is invalid */ + FR_DENIED, /* (7) Access denied due to prohibited access or directory full */ + FR_EXIST, /* (8) Access denied due to prohibited access */ + FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */ + FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */ + FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */ + FR_NOT_ENABLED, /* (12) The volume has no work area */ + FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */ + FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any problem */ + FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */ + FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */ + FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */ + FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > FF_FS_LOCK */ + FR_INVALID_PARAMETER /* (19) Given parameter is invalid */ +} FRESULT; + + + +/*--------------------------------------------------------------*/ +/* FatFs module application interface */ + +FRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode); /* Open or create a file */ +FRESULT f_close (FIL* fp); /* Close an open file object */ +FRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br); /* Read data from the file */ +FRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw); /* Write data to the file */ +FRESULT f_lseek (FIL* fp, FSIZE_t ofs); /* Move file pointer of the file object */ +FRESULT f_truncate (FIL* fp); /* Truncate the file */ +FRESULT f_sync (FIL* fp); /* Flush cached data of the writing file */ +FRESULT f_opendir (DIR* dp, const TCHAR* path); /* Open a directory */ +FRESULT f_closedir (DIR* dp); /* Close an open directory */ +FRESULT f_readdir (DIR* dp, FILINFO* fno); /* Read a directory item */ +FRESULT f_findfirst (DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern); /* Find first file */ +FRESULT f_findnext (DIR* dp, FILINFO* fno); /* Find next file */ +FRESULT f_mkdir (const TCHAR* path); /* Create a sub directory */ +FRESULT f_unlink (const TCHAR* path); /* Delete an existing file or directory */ +FRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new); /* Rename/Move a file or directory */ +FRESULT f_stat (const TCHAR* path, FILINFO* fno); /* Get file status */ +FRESULT f_chmod (const TCHAR* path, BYTE attr, BYTE mask); /* Change attribute of a file/dir */ +FRESULT f_utime (const TCHAR* path, const FILINFO* fno); /* Change timestamp of a file/dir */ +FRESULT f_chdir (const TCHAR* path); /* Change current directory */ +FRESULT f_chdrive (const TCHAR* path); /* Change current drive */ +FRESULT f_getcwd (TCHAR* buff, UINT len); /* Get current directory */ +FRESULT f_getfree (const TCHAR* path, DWORD* nclst, FATFS** fatfs); /* Get number of free clusters on the drive */ +FRESULT f_getlabel (const TCHAR* path, TCHAR* label, DWORD* vsn); /* Get volume label */ +FRESULT f_setlabel (const TCHAR* label); /* Set volume label */ +FRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf); /* Forward data to the stream */ +FRESULT f_expand (FIL* fp, FSIZE_t fsz, BYTE opt); /* Allocate a contiguous block to the file */ +FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt); /* Mount/Unmount a logical drive */ +FRESULT f_mkfs (const TCHAR* path, BYTE opt, DWORD au, void* work, UINT len); /* Create a FAT volume */ +FRESULT f_fdisk (BYTE pdrv, const DWORD* szt, void* work); /* Divide a physical drive into some partitions */ +FRESULT f_setcp (WORD cp); /* Set current code page */ +int f_putc (TCHAR c, FIL* fp); /* Put a character to the file */ +int f_puts (const TCHAR* str, FIL* cp); /* Put a string to the file */ +int f_printf (FIL* fp, const TCHAR* str, ...); /* Put a formatted string to the file */ +TCHAR* f_gets (TCHAR* buff, int len, FIL* fp); /* Get a string from the file */ + +#define f_eof(fp) ((int)((fp)->fptr == (fp)->obj.objsize)) +#define f_error(fp) ((fp)->err) +#define f_tell(fp) ((fp)->fptr) +#define f_size(fp) ((fp)->obj.objsize) +#define f_rewind(fp) f_lseek((fp), 0) +#define f_rewinddir(dp) f_readdir((dp), 0) +#define f_rmdir(path) f_unlink(path) +#define f_unmount(path) f_mount(0, path, 0) + +#ifndef EOF +#define EOF (-1) +#endif + + + + +/*--------------------------------------------------------------*/ +/* Additional user defined functions */ + +/* RTC function */ +#if !FF_FS_READONLY && !FF_FS_NORTC +DWORD get_fattime (void); +#endif + +/* LFN support functions */ +#if FF_USE_LFN >= 1 /* Code conversion (defined in unicode.c) */ +WCHAR ff_oem2uni (WCHAR oem, WORD cp); /* OEM code to Unicode conversion */ +WCHAR ff_uni2oem (DWORD uni, WORD cp); /* Unicode to OEM code conversion */ +DWORD ff_wtoupper (DWORD uni); /* Unicode upper-case conversion */ +#endif +#if FF_USE_LFN == 3 /* Dynamic memory allocation */ +void* ff_memalloc (UINT msize); /* Allocate memory block */ +void ff_memfree (void* mblock); /* Free memory block */ +#endif + +/* Sync functions */ +#if FF_FS_REENTRANT +int ff_cre_syncobj (BYTE vol, FF_SYNC_t* sobj); /* Create a sync object */ +int ff_req_grant (FF_SYNC_t sobj); /* Lock sync object */ +void ff_rel_grant (FF_SYNC_t sobj); /* Unlock sync object */ +int ff_del_syncobj (FF_SYNC_t sobj); /* Delete a sync object */ +#endif + + + + +/*--------------------------------------------------------------*/ +/* Flags and offset address */ + + +/* File access mode and open method flags (3rd argument of f_open) */ +#define FA_READ 0x01 +#define FA_WRITE 0x02 +#define FA_OPEN_EXISTING 0x00 +#define FA_CREATE_NEW 0x04 +#define FA_CREATE_ALWAYS 0x08 +#define FA_OPEN_ALWAYS 0x10 +#define FA_OPEN_APPEND 0x30 + +/* Fast seek controls (2nd argument of f_lseek) */ +#define CREATE_LINKMAP ((FSIZE_t)0 - 1) + +/* Format options (2nd argument of f_mkfs) */ +#define FM_FAT 0x01 +#define FM_FAT32 0x02 +#define FM_EXFAT 0x04 +#define FM_ANY 0x07 +#define FM_SFD 0x08 + +/* Filesystem type (FATFS.fs_type) */ +#define FS_FAT12 1 +#define FS_FAT16 2 +#define FS_FAT32 3 +#define FS_EXFAT 4 + +/* File attribute bits for directory entry (FILINFO.fattrib) */ +#define AM_RDO 0x01 /* Read only */ +#define AM_HID 0x02 /* Hidden */ +#define AM_SYS 0x04 /* System */ +#define AM_DIR 0x10 /* Directory */ +#define AM_ARC 0x20 /* Archive */ + + +#ifdef __cplusplus +} +#endif + +#endif /* FF_DEFINED */ + +#endif /* McuLib_CONFIG_USE_FAT_FS */ diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/source/ffsystem.c b/TSM_PicoW_Sensor/McuLib/FatFS/source/ffsystem.c new file mode 100644 index 0000000..8f26bbe --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/source/ffsystem.c @@ -0,0 +1,170 @@ +/*------------------------------------------------------------------------*/ +/* Sample Code of OS Dependent Functions for FatFs */ +/* (C)ChaN, 2018 */ +/*------------------------------------------------------------------------*/ + + +#include "ff.h" + + +#if FF_USE_LFN == 3 /* Dynamic memory allocation */ + +/*------------------------------------------------------------------------*/ +/* Allocate a memory block */ +/*------------------------------------------------------------------------*/ + +void* ff_memalloc ( /* Returns pointer to the allocated memory block (null if not enough core) */ + UINT msize /* Number of bytes to allocate */ +) +{ + return malloc(msize); /* Allocate a new memory block with POSIX API */ +} + + +/*------------------------------------------------------------------------*/ +/* Free a memory block */ +/*------------------------------------------------------------------------*/ + +void ff_memfree ( + void* mblock /* Pointer to the memory block to free (nothing to do if null) */ +) +{ + free(mblock); /* Free the memory block with POSIX API */ +} + +#endif + + + +#if 0 && FF_FS_REENTRANT /* Mutal exclusion */ + +/*------------------------------------------------------------------------*/ +/* Create a Synchronization Object */ +/*------------------------------------------------------------------------*/ +/* This function is called in f_mount() function to create a new +/ synchronization object for the volume, such as semaphore and mutex. +/ When a 0 is returned, the f_mount() function fails with FR_INT_ERR. +*/ + +//const osMutexDef_t Mutex[FF_VOLUMES]; /* Table of CMSIS-RTOS mutex */ + + +int ff_cre_syncobj ( /* 1:Function succeeded, 0:Could not create the sync object */ + BYTE vol, /* Corresponding volume (logical drive number) */ + FF_SYNC_t* sobj /* Pointer to return the created sync object */ +) +{ + /* Win32 */ + //*sobj = CreateMutex(NULL, FALSE, NULL); + //return (int)(*sobj != INVALID_HANDLE_VALUE); + + /* uITRON */ +// T_CSEM csem = {TA_TPRI,1,1}; +// *sobj = acre_sem(&csem); +// return (int)(*sobj > 0); + + /* uC/OS-II */ +// OS_ERR err; +// *sobj = OSMutexCreate(0, &err); +// return (int)(err == OS_NO_ERR); + + /* FreeRTOS */ + *sobj = xSemaphoreCreateMutex(); + return (int)(*sobj != NULL); + + /* CMSIS-RTOS */ +// *sobj = osMutexCreate(&Mutex[vol]); +// return (int)(*sobj != NULL); +} + + +/*------------------------------------------------------------------------*/ +/* Delete a Synchronization Object */ +/*------------------------------------------------------------------------*/ +/* This function is called in f_mount() function to delete a synchronization +/ object that created with ff_cre_syncobj() function. When a 0 is returned, +/ the f_mount() function fails with FR_INT_ERR. +*/ + +int ff_del_syncobj ( /* 1:Function succeeded, 0:Could not delete due to an error */ + FF_SYNC_t sobj /* Sync object tied to the logical drive to be deleted */ +) +{ + /* Win32 */ + return (int)CloseHandle(sobj); + + /* uITRON */ +// return (int)(del_sem(sobj) == E_OK); + + /* uC/OS-II */ +// OS_ERR err; +// OSMutexDel(sobj, OS_DEL_ALWAYS, &err); +// return (int)(err == OS_NO_ERR); + + /* FreeRTOS */ + vSemaphoreDelete(sobj); + return 1; + + /* CMSIS-RTOS */ +// return (int)(osMutexDelete(sobj) == osOK); +} + + +/*------------------------------------------------------------------------*/ +/* Request Grant to Access the Volume */ +/*------------------------------------------------------------------------*/ +/* This function is called on entering file functions to lock the volume. +/ When a 0 is returned, the file function fails with FR_TIMEOUT. +*/ + +int ff_req_grant ( /* 1:Got a grant to access the volume, 0:Could not get a grant */ + FF_SYNC_t sobj /* Sync object to wait */ +) +{ + /* Win32 */ + //return (int)(WaitForSingleObject(sobj, FF_FS_TIMEOUT) == WAIT_OBJECT_0); + + /* uITRON */ +// return (int)(wai_sem(sobj) == E_OK); + + /* uC/OS-II */ +// OS_ERR err; +// OSMutexPend(sobj, FF_FS_TIMEOUT, &err)); +// return (int)(err == OS_NO_ERR); + + /* FreeRTOS */ + return (int)(xSemaphoreTake(sobj, FF_FS_TIMEOUT) == pdTRUE); + + /* CMSIS-RTOS */ +// return (int)(osMutexWait(sobj, FF_FS_TIMEOUT) == osOK); +} + + +/*------------------------------------------------------------------------*/ +/* Release Grant to Access the Volume */ +/*------------------------------------------------------------------------*/ +/* This function is called on leaving file functions to unlock the volume. +*/ + +void ff_rel_grant ( + FF_SYNC_t sobj /* Sync object to be signaled */ +) +{ + /* Win32 */ + //ReleaseMutex(sobj); + + /* uITRON */ +// sig_sem(sobj); + + /* uC/OS-II */ +// OSMutexPost(sobj); + + /* FreeRTOS */ + xSemaphoreGive(sobj); + + /* CMSIS-RTOS */ +// osMutexRelease(sobj); +} + +#endif + diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/source/ffunicode.c b/TSM_PicoW_Sensor/McuLib/FatFS/source/ffunicode.c new file mode 100644 index 0000000..349901b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/source/ffunicode.c @@ -0,0 +1,15597 @@ +/*------------------------------------------------------------------------*/ +/* Unicode handling functions for FatFs R0.13c */ +/*------------------------------------------------------------------------*/ +/* This module will occupy a huge memory in the .const section when the / +/ FatFs is configured for LFN with DBCS. If the system has any Unicode / +/ utilitiy for the code conversion, this module should be modified to use / +/ that function to avoid silly memory consumption. / +/-------------------------------------------------------------------------*/ +/* +/ Copyright (C) 2018, ChaN, all right reserved. +/ +/ FatFs module is an open source software. Redistribution and use of FatFs in +/ source and binary forms, with or without modification, are permitted provided +/ that the following condition is met: +/ +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. +/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +*/ + + +#include "ff.h" + +#if FF_USE_LFN /* This module will be blanked at non-LFN configuration */ + +#if FF_DEFINED != 86604 /* Revision ID */ +#error Wrong include file (ff.h). +#endif + +#define MERGE2(a, b) a ## b +#define CVTBL(tbl, cp) MERGE2(tbl, cp) + + +/*------------------------------------------------------------------------*/ +/* Code Conversion Tables */ +/*------------------------------------------------------------------------*/ + +#if FF_CODE_PAGE == 932 || FF_CODE_PAGE == 0 /* Japanese */ +static const WCHAR uni2oem932[] = { /* Unicode --> Shift_JIS pairs */ + 0x00A7, 0x8198, 0x00A8, 0x814E, 0x00B0, 0x818B, 0x00B1, 0x817D, 0x00B4, 0x814C, 0x00B6, 0x81F7, 0x00D7, 0x817E, 0x00F7, 0x8180, + 0x0391, 0x839F, 0x0392, 0x83A0, 0x0393, 0x83A1, 0x0394, 0x83A2, 0x0395, 0x83A3, 0x0396, 0x83A4, 0x0397, 0x83A5, 0x0398, 0x83A6, + 0x0399, 0x83A7, 0x039A, 0x83A8, 0x039B, 0x83A9, 0x039C, 0x83AA, 0x039D, 0x83AB, 0x039E, 0x83AC, 0x039F, 0x83AD, 0x03A0, 0x83AE, + 0x03A1, 0x83AF, 0x03A3, 0x83B0, 0x03A4, 0x83B1, 0x03A5, 0x83B2, 0x03A6, 0x83B3, 0x03A7, 0x83B4, 0x03A8, 0x83B5, 0x03A9, 0x83B6, + 0x03B1, 0x83BF, 0x03B2, 0x83C0, 0x03B3, 0x83C1, 0x03B4, 0x83C2, 0x03B5, 0x83C3, 0x03B6, 0x83C4, 0x03B7, 0x83C5, 0x03B8, 0x83C6, + 0x03B9, 0x83C7, 0x03BA, 0x83C8, 0x03BB, 0x83C9, 0x03BC, 0x83CA, 0x03BD, 0x83CB, 0x03BE, 0x83CC, 0x03BF, 0x83CD, 0x03C0, 0x83CE, + 0x03C1, 0x83CF, 0x03C3, 0x83D0, 0x03C4, 0x83D1, 0x03C5, 0x83D2, 0x03C6, 0x83D3, 0x03C7, 0x83D4, 0x03C8, 0x83D5, 0x03C9, 0x83D6, + 0x0401, 0x8446, 0x0410, 0x8440, 0x0411, 0x8441, 0x0412, 0x8442, 0x0413, 0x8443, 0x0414, 0x8444, 0x0415, 0x8445, 0x0416, 0x8447, + 0x0417, 0x8448, 0x0418, 0x8449, 0x0419, 0x844A, 0x041A, 0x844B, 0x041B, 0x844C, 0x041C, 0x844D, 0x041D, 0x844E, 0x041E, 0x844F, + 0x041F, 0x8450, 0x0420, 0x8451, 0x0421, 0x8452, 0x0422, 0x8453, 0x0423, 0x8454, 0x0424, 0x8455, 0x0425, 0x8456, 0x0426, 0x8457, + 0x0427, 0x8458, 0x0428, 0x8459, 0x0429, 0x845A, 0x042A, 0x845B, 0x042B, 0x845C, 0x042C, 0x845D, 0x042D, 0x845E, 0x042E, 0x845F, + 0x042F, 0x8460, 0x0430, 0x8470, 0x0431, 0x8471, 0x0432, 0x8472, 0x0433, 0x8473, 0x0434, 0x8474, 0x0435, 0x8475, 0x0436, 0x8477, + 0x0437, 0x8478, 0x0438, 0x8479, 0x0439, 0x847A, 0x043A, 0x847B, 0x043B, 0x847C, 0x043C, 0x847D, 0x043D, 0x847E, 0x043E, 0x8480, + 0x043F, 0x8481, 0x0440, 0x8482, 0x0441, 0x8483, 0x0442, 0x8484, 0x0443, 0x8485, 0x0444, 0x8486, 0x0445, 0x8487, 0x0446, 0x8488, + 0x0447, 0x8489, 0x0448, 0x848A, 0x0449, 0x848B, 0x044A, 0x848C, 0x044B, 0x848D, 0x044C, 0x848E, 0x044D, 0x848F, 0x044E, 0x8490, + 0x044F, 0x8491, 0x0451, 0x8476, 0x2010, 0x815D, 0x2015, 0x815C, 0x2018, 0x8165, 0x2019, 0x8166, 0x201C, 0x8167, 0x201D, 0x8168, + 0x2020, 0x81F5, 0x2021, 0x81F6, 0x2025, 0x8164, 0x2026, 0x8163, 0x2030, 0x81F1, 0x2032, 0x818C, 0x2033, 0x818D, 0x203B, 0x81A6, + 0x2103, 0x818E, 0x2116, 0x8782, 0x2121, 0x8784, 0x212B, 0x81F0, 0x2160, 0x8754, 0x2161, 0x8755, 0x2162, 0x8756, 0x2163, 0x8757, + 0x2164, 0x8758, 0x2165, 0x8759, 0x2166, 0x875A, 0x2167, 0x875B, 0x2168, 0x875C, 0x2169, 0x875D, 0x2170, 0xFA40, 0x2171, 0xFA41, + 0x2172, 0xFA42, 0x2173, 0xFA43, 0x2174, 0xFA44, 0x2175, 0xFA45, 0x2176, 0xFA46, 0x2177, 0xFA47, 0x2178, 0xFA48, 0x2179, 0xFA49, + 0x2190, 0x81A9, 0x2191, 0x81AA, 0x2192, 0x81A8, 0x2193, 0x81AB, 0x21D2, 0x81CB, 0x21D4, 0x81CC, 0x2200, 0x81CD, 0x2202, 0x81DD, + 0x2203, 0x81CE, 0x2207, 0x81DE, 0x2208, 0x81B8, 0x220B, 0x81B9, 0x2211, 0x8794, 0x221A, 0x81E3, 0x221D, 0x81E5, 0x221E, 0x8187, + 0x221F, 0x8798, 0x2220, 0x81DA, 0x2225, 0x8161, 0x2227, 0x81C8, 0x2228, 0x81C9, 0x2229, 0x81BF, 0x222A, 0x81BE, 0x222B, 0x81E7, + 0x222C, 0x81E8, 0x222E, 0x8793, 0x2234, 0x8188, 0x2235, 0x81E6, 0x223D, 0x81E4, 0x2252, 0x81E0, 0x2260, 0x8182, 0x2261, 0x81DF, + 0x2266, 0x8185, 0x2267, 0x8186, 0x226A, 0x81E1, 0x226B, 0x81E2, 0x2282, 0x81BC, 0x2283, 0x81BD, 0x2286, 0x81BA, 0x2287, 0x81BB, + 0x22A5, 0x81DB, 0x22BF, 0x8799, 0x2312, 0x81DC, 0x2460, 0x8740, 0x2461, 0x8741, 0x2462, 0x8742, 0x2463, 0x8743, 0x2464, 0x8744, + 0x2465, 0x8745, 0x2466, 0x8746, 0x2467, 0x8747, 0x2468, 0x8748, 0x2469, 0x8749, 0x246A, 0x874A, 0x246B, 0x874B, 0x246C, 0x874C, + 0x246D, 0x874D, 0x246E, 0x874E, 0x246F, 0x874F, 0x2470, 0x8750, 0x2471, 0x8751, 0x2472, 0x8752, 0x2473, 0x8753, 0x2500, 0x849F, + 0x2501, 0x84AA, 0x2502, 0x84A0, 0x2503, 0x84AB, 0x250C, 0x84A1, 0x250F, 0x84AC, 0x2510, 0x84A2, 0x2513, 0x84AD, 0x2514, 0x84A4, + 0x2517, 0x84AF, 0x2518, 0x84A3, 0x251B, 0x84AE, 0x251C, 0x84A5, 0x251D, 0x84BA, 0x2520, 0x84B5, 0x2523, 0x84B0, 0x2524, 0x84A7, + 0x2525, 0x84BC, 0x2528, 0x84B7, 0x252B, 0x84B2, 0x252C, 0x84A6, 0x252F, 0x84B6, 0x2530, 0x84BB, 0x2533, 0x84B1, 0x2534, 0x84A8, + 0x2537, 0x84B8, 0x2538, 0x84BD, 0x253B, 0x84B3, 0x253C, 0x84A9, 0x253F, 0x84B9, 0x2542, 0x84BE, 0x254B, 0x84B4, 0x25A0, 0x81A1, + 0x25A1, 0x81A0, 0x25B2, 0x81A3, 0x25B3, 0x81A2, 0x25BC, 0x81A5, 0x25BD, 0x81A4, 0x25C6, 0x819F, 0x25C7, 0x819E, 0x25CB, 0x819B, + 0x25CE, 0x819D, 0x25CF, 0x819C, 0x25EF, 0x81FC, 0x2605, 0x819A, 0x2606, 0x8199, 0x2640, 0x818A, 0x2642, 0x8189, 0x266A, 0x81F4, + 0x266D, 0x81F3, 0x266F, 0x81F2, 0x3000, 0x8140, 0x3001, 0x8141, 0x3002, 0x8142, 0x3003, 0x8156, 0x3005, 0x8158, 0x3006, 0x8159, + 0x3007, 0x815A, 0x3008, 0x8171, 0x3009, 0x8172, 0x300A, 0x8173, 0x300B, 0x8174, 0x300C, 0x8175, 0x300D, 0x8176, 0x300E, 0x8177, + 0x300F, 0x8178, 0x3010, 0x8179, 0x3011, 0x817A, 0x3012, 0x81A7, 0x3013, 0x81AC, 0x3014, 0x816B, 0x3015, 0x816C, 0x301D, 0x8780, + 0x301F, 0x8781, 0x3041, 0x829F, 0x3042, 0x82A0, 0x3043, 0x82A1, 0x3044, 0x82A2, 0x3045, 0x82A3, 0x3046, 0x82A4, 0x3047, 0x82A5, + 0x3048, 0x82A6, 0x3049, 0x82A7, 0x304A, 0x82A8, 0x304B, 0x82A9, 0x304C, 0x82AA, 0x304D, 0x82AB, 0x304E, 0x82AC, 0x304F, 0x82AD, + 0x3050, 0x82AE, 0x3051, 0x82AF, 0x3052, 0x82B0, 0x3053, 0x82B1, 0x3054, 0x82B2, 0x3055, 0x82B3, 0x3056, 0x82B4, 0x3057, 0x82B5, + 0x3058, 0x82B6, 0x3059, 0x82B7, 0x305A, 0x82B8, 0x305B, 0x82B9, 0x305C, 0x82BA, 0x305D, 0x82BB, 0x305E, 0x82BC, 0x305F, 0x82BD, + 0x3060, 0x82BE, 0x3061, 0x82BF, 0x3062, 0x82C0, 0x3063, 0x82C1, 0x3064, 0x82C2, 0x3065, 0x82C3, 0x3066, 0x82C4, 0x3067, 0x82C5, + 0x3068, 0x82C6, 0x3069, 0x82C7, 0x306A, 0x82C8, 0x306B, 0x82C9, 0x306C, 0x82CA, 0x306D, 0x82CB, 0x306E, 0x82CC, 0x306F, 0x82CD, + 0x3070, 0x82CE, 0x3071, 0x82CF, 0x3072, 0x82D0, 0x3073, 0x82D1, 0x3074, 0x82D2, 0x3075, 0x82D3, 0x3076, 0x82D4, 0x3077, 0x82D5, + 0x3078, 0x82D6, 0x3079, 0x82D7, 0x307A, 0x82D8, 0x307B, 0x82D9, 0x307C, 0x82DA, 0x307D, 0x82DB, 0x307E, 0x82DC, 0x307F, 0x82DD, + 0x3080, 0x82DE, 0x3081, 0x82DF, 0x3082, 0x82E0, 0x3083, 0x82E1, 0x3084, 0x82E2, 0x3085, 0x82E3, 0x3086, 0x82E4, 0x3087, 0x82E5, + 0x3088, 0x82E6, 0x3089, 0x82E7, 0x308A, 0x82E8, 0x308B, 0x82E9, 0x308C, 0x82EA, 0x308D, 0x82EB, 0x308E, 0x82EC, 0x308F, 0x82ED, + 0x3090, 0x82EE, 0x3091, 0x82EF, 0x3092, 0x82F0, 0x3093, 0x82F1, 0x309B, 0x814A, 0x309C, 0x814B, 0x309D, 0x8154, 0x309E, 0x8155, + 0x30A1, 0x8340, 0x30A2, 0x8341, 0x30A3, 0x8342, 0x30A4, 0x8343, 0x30A5, 0x8344, 0x30A6, 0x8345, 0x30A7, 0x8346, 0x30A8, 0x8347, + 0x30A9, 0x8348, 0x30AA, 0x8349, 0x30AB, 0x834A, 0x30AC, 0x834B, 0x30AD, 0x834C, 0x30AE, 0x834D, 0x30AF, 0x834E, 0x30B0, 0x834F, + 0x30B1, 0x8350, 0x30B2, 0x8351, 0x30B3, 0x8352, 0x30B4, 0x8353, 0x30B5, 0x8354, 0x30B6, 0x8355, 0x30B7, 0x8356, 0x30B8, 0x8357, + 0x30B9, 0x8358, 0x30BA, 0x8359, 0x30BB, 0x835A, 0x30BC, 0x835B, 0x30BD, 0x835C, 0x30BE, 0x835D, 0x30BF, 0x835E, 0x30C0, 0x835F, + 0x30C1, 0x8360, 0x30C2, 0x8361, 0x30C3, 0x8362, 0x30C4, 0x8363, 0x30C5, 0x8364, 0x30C6, 0x8365, 0x30C7, 0x8366, 0x30C8, 0x8367, + 0x30C9, 0x8368, 0x30CA, 0x8369, 0x30CB, 0x836A, 0x30CC, 0x836B, 0x30CD, 0x836C, 0x30CE, 0x836D, 0x30CF, 0x836E, 0x30D0, 0x836F, + 0x30D1, 0x8370, 0x30D2, 0x8371, 0x30D3, 0x8372, 0x30D4, 0x8373, 0x30D5, 0x8374, 0x30D6, 0x8375, 0x30D7, 0x8376, 0x30D8, 0x8377, + 0x30D9, 0x8378, 0x30DA, 0x8379, 0x30DB, 0x837A, 0x30DC, 0x837B, 0x30DD, 0x837C, 0x30DE, 0x837D, 0x30DF, 0x837E, 0x30E0, 0x8380, + 0x30E1, 0x8381, 0x30E2, 0x8382, 0x30E3, 0x8383, 0x30E4, 0x8384, 0x30E5, 0x8385, 0x30E6, 0x8386, 0x30E7, 0x8387, 0x30E8, 0x8388, + 0x30E9, 0x8389, 0x30EA, 0x838A, 0x30EB, 0x838B, 0x30EC, 0x838C, 0x30ED, 0x838D, 0x30EE, 0x838E, 0x30EF, 0x838F, 0x30F0, 0x8390, + 0x30F1, 0x8391, 0x30F2, 0x8392, 0x30F3, 0x8393, 0x30F4, 0x8394, 0x30F5, 0x8395, 0x30F6, 0x8396, 0x30FB, 0x8145, 0x30FC, 0x815B, + 0x30FD, 0x8152, 0x30FE, 0x8153, 0x3231, 0x878A, 0x3232, 0x878B, 0x3239, 0x878C, 0x32A4, 0x8785, 0x32A5, 0x8786, 0x32A6, 0x8787, + 0x32A7, 0x8788, 0x32A8, 0x8789, 0x3303, 0x8765, 0x330D, 0x8769, 0x3314, 0x8760, 0x3318, 0x8763, 0x3322, 0x8761, 0x3323, 0x876B, + 0x3326, 0x876A, 0x3327, 0x8764, 0x332B, 0x876C, 0x3336, 0x8766, 0x333B, 0x876E, 0x3349, 0x875F, 0x334A, 0x876D, 0x334D, 0x8762, + 0x3351, 0x8767, 0x3357, 0x8768, 0x337B, 0x877E, 0x337C, 0x878F, 0x337D, 0x878E, 0x337E, 0x878D, 0x338E, 0x8772, 0x338F, 0x8773, + 0x339C, 0x876F, 0x339D, 0x8770, 0x339E, 0x8771, 0x33A1, 0x8775, 0x33C4, 0x8774, 0x33CD, 0x8783, 0x4E00, 0x88EA, 0x4E01, 0x929A, + 0x4E03, 0x8EB5, 0x4E07, 0x969C, 0x4E08, 0x8FE4, 0x4E09, 0x8E4F, 0x4E0A, 0x8FE3, 0x4E0B, 0x89BA, 0x4E0D, 0x9573, 0x4E0E, 0x975E, + 0x4E10, 0x98A0, 0x4E11, 0x894E, 0x4E14, 0x8A8E, 0x4E15, 0x98A1, 0x4E16, 0x90A2, 0x4E17, 0x99C0, 0x4E18, 0x8B75, 0x4E19, 0x95B8, + 0x4E1E, 0x8FE5, 0x4E21, 0x97BC, 0x4E26, 0x95C0, 0x4E28, 0xFA68, 0x4E2A, 0x98A2, 0x4E2D, 0x9286, 0x4E31, 0x98A3, 0x4E32, 0x8BF8, + 0x4E36, 0x98A4, 0x4E38, 0x8ADB, 0x4E39, 0x924F, 0x4E3B, 0x8EE5, 0x4E3C, 0x98A5, 0x4E3F, 0x98A6, 0x4E42, 0x98A7, 0x4E43, 0x9454, + 0x4E45, 0x8B76, 0x4E4B, 0x9456, 0x4E4D, 0x93E1, 0x4E4E, 0x8CC1, 0x4E4F, 0x9652, 0x4E55, 0xE568, 0x4E56, 0x98A8, 0x4E57, 0x8FE6, + 0x4E58, 0x98A9, 0x4E59, 0x89B3, 0x4E5D, 0x8BE3, 0x4E5E, 0x8CEE, 0x4E5F, 0x96E7, 0x4E62, 0x9BA4, 0x4E71, 0x9790, 0x4E73, 0x93FB, + 0x4E7E, 0x8AA3, 0x4E80, 0x8B54, 0x4E82, 0x98AA, 0x4E85, 0x98AB, 0x4E86, 0x97B9, 0x4E88, 0x975C, 0x4E89, 0x9188, 0x4E8A, 0x98AD, + 0x4E8B, 0x8E96, 0x4E8C, 0x93F1, 0x4E8E, 0x98B0, 0x4E91, 0x895D, 0x4E92, 0x8CDD, 0x4E94, 0x8CDC, 0x4E95, 0x88E4, 0x4E98, 0x986A, + 0x4E99, 0x9869, 0x4E9B, 0x8DB1, 0x4E9C, 0x889F, 0x4E9E, 0x98B1, 0x4E9F, 0x98B2, 0x4EA0, 0x98B3, 0x4EA1, 0x9653, 0x4EA2, 0x98B4, + 0x4EA4, 0x8CF0, 0x4EA5, 0x88E5, 0x4EA6, 0x9692, 0x4EA8, 0x8B9C, 0x4EAB, 0x8B9D, 0x4EAC, 0x8B9E, 0x4EAD, 0x92E0, 0x4EAE, 0x97BA, + 0x4EB0, 0x98B5, 0x4EB3, 0x98B6, 0x4EB6, 0x98B7, 0x4EBA, 0x906C, 0x4EC0, 0x8F59, 0x4EC1, 0x906D, 0x4EC2, 0x98BC, 0x4EC4, 0x98BA, + 0x4EC6, 0x98BB, 0x4EC7, 0x8B77, 0x4ECA, 0x8DA1, 0x4ECB, 0x89EE, 0x4ECD, 0x98B9, 0x4ECE, 0x98B8, 0x4ECF, 0x95A7, 0x4ED4, 0x8E65, + 0x4ED5, 0x8E64, 0x4ED6, 0x91BC, 0x4ED7, 0x98BD, 0x4ED8, 0x9574, 0x4ED9, 0x90E5, 0x4EDD, 0x8157, 0x4EDE, 0x98BE, 0x4EDF, 0x98C0, + 0x4EE1, 0xFA69, 0x4EE3, 0x91E3, 0x4EE4, 0x97DF, 0x4EE5, 0x88C8, 0x4EED, 0x98BF, 0x4EEE, 0x89BC, 0x4EF0, 0x8BC2, 0x4EF2, 0x9287, + 0x4EF6, 0x8C8F, 0x4EF7, 0x98C1, 0x4EFB, 0x9443, 0x4EFC, 0xFA6A, 0x4F00, 0xFA6B, 0x4F01, 0x8AE9, 0x4F03, 0xFA6C, 0x4F09, 0x98C2, + 0x4F0A, 0x88C9, 0x4F0D, 0x8CDE, 0x4F0E, 0x8AEA, 0x4F0F, 0x959A, 0x4F10, 0x94B0, 0x4F11, 0x8B78, 0x4F1A, 0x89EF, 0x4F1C, 0x98E5, + 0x4F1D, 0x9360, 0x4F2F, 0x948C, 0x4F30, 0x98C4, 0x4F34, 0x94BA, 0x4F36, 0x97E0, 0x4F38, 0x904C, 0x4F39, 0xFA6D, 0x4F3A, 0x8E66, + 0x4F3C, 0x8E97, 0x4F3D, 0x89BE, 0x4F43, 0x92CF, 0x4F46, 0x9241, 0x4F47, 0x98C8, 0x4F4D, 0x88CA, 0x4F4E, 0x92E1, 0x4F4F, 0x8F5A, + 0x4F50, 0x8DB2, 0x4F51, 0x9743, 0x4F53, 0x91CC, 0x4F55, 0x89BD, 0x4F56, 0xFA6E, 0x4F57, 0x98C7, 0x4F59, 0x975D, 0x4F5A, 0x98C3, + 0x4F5B, 0x98C5, 0x4F5C, 0x8DEC, 0x4F5D, 0x98C6, 0x4F5E, 0x9B43, 0x4F69, 0x98CE, 0x4F6F, 0x98D1, 0x4F70, 0x98CF, 0x4F73, 0x89C0, + 0x4F75, 0x95B9, 0x4F76, 0x98C9, 0x4F7B, 0x98CD, 0x4F7C, 0x8CF1, 0x4F7F, 0x8E67, 0x4F83, 0x8AA4, 0x4F86, 0x98D2, 0x4F88, 0x98CA, + 0x4F8A, 0xFA70, 0x4F8B, 0x97E1, 0x4F8D, 0x8E98, 0x4F8F, 0x98CB, 0x4F91, 0x98D0, 0x4F92, 0xFA6F, 0x4F94, 0xFA72, 0x4F96, 0x98D3, + 0x4F98, 0x98CC, 0x4F9A, 0xFA71, 0x4F9B, 0x8B9F, 0x4F9D, 0x88CB, 0x4FA0, 0x8BA0, 0x4FA1, 0x89BF, 0x4FAB, 0x9B44, 0x4FAD, 0x9699, + 0x4FAE, 0x958E, 0x4FAF, 0x8CF2, 0x4FB5, 0x904E, 0x4FB6, 0x97B5, 0x4FBF, 0x95D6, 0x4FC2, 0x8C57, 0x4FC3, 0x91A3, 0x4FC4, 0x89E2, + 0x4FC9, 0xFA61, 0x4FCA, 0x8F72, 0x4FCD, 0xFA73, 0x4FCE, 0x98D7, 0x4FD0, 0x98DC, 0x4FD1, 0x98DA, 0x4FD4, 0x98D5, 0x4FD7, 0x91AD, + 0x4FD8, 0x98D8, 0x4FDA, 0x98DB, 0x4FDB, 0x98D9, 0x4FDD, 0x95DB, 0x4FDF, 0x98D6, 0x4FE1, 0x904D, 0x4FE3, 0x9693, 0x4FE4, 0x98DD, + 0x4FE5, 0x98DE, 0x4FEE, 0x8F43, 0x4FEF, 0x98EB, 0x4FF3, 0x946F, 0x4FF5, 0x9555, 0x4FF6, 0x98E6, 0x4FF8, 0x95EE, 0x4FFA, 0x89B4, + 0x4FFE, 0x98EA, 0x4FFF, 0xFA76, 0x5005, 0x98E4, 0x5006, 0x98ED, 0x5009, 0x9171, 0x500B, 0x8CC2, 0x500D, 0x947B, 0x500F, 0xE0C5, + 0x5011, 0x98EC, 0x5012, 0x937C, 0x5014, 0x98E1, 0x5016, 0x8CF4, 0x5019, 0x8CF3, 0x501A, 0x98DF, 0x501E, 0xFA77, 0x501F, 0x8ED8, + 0x5021, 0x98E7, 0x5022, 0xFA75, 0x5023, 0x95ED, 0x5024, 0x926C, 0x5025, 0x98E3, 0x5026, 0x8C91, 0x5028, 0x98E0, 0x5029, 0x98E8, + 0x502A, 0x98E2, 0x502B, 0x97CF, 0x502C, 0x98E9, 0x502D, 0x9860, 0x5036, 0x8BE4, 0x5039, 0x8C90, 0x5040, 0xFA74, 0x5042, 0xFA7A, + 0x5043, 0x98EE, 0x5046, 0xFA78, 0x5047, 0x98EF, 0x5048, 0x98F3, 0x5049, 0x88CC, 0x504F, 0x95CE, 0x5050, 0x98F2, 0x5055, 0x98F1, + 0x5056, 0x98F5, 0x505A, 0x98F4, 0x505C, 0x92E2, 0x5065, 0x8C92, 0x506C, 0x98F6, 0x5070, 0xFA79, 0x5072, 0x8EC3, 0x5074, 0x91A4, + 0x5075, 0x92E3, 0x5076, 0x8BF4, 0x5078, 0x98F7, 0x507D, 0x8B55, 0x5080, 0x98F8, 0x5085, 0x98FA, 0x508D, 0x9654, 0x5091, 0x8C86, + 0x5094, 0xFA7B, 0x5098, 0x8E50, 0x5099, 0x94F5, 0x509A, 0x98F9, 0x50AC, 0x8DC3, 0x50AD, 0x9762, 0x50B2, 0x98FC, 0x50B3, 0x9942, + 0x50B4, 0x98FB, 0x50B5, 0x8DC2, 0x50B7, 0x8F9D, 0x50BE, 0x8C58, 0x50C2, 0x9943, 0x50C5, 0x8BCD, 0x50C9, 0x9940, 0x50CA, 0x9941, + 0x50CD, 0x93AD, 0x50CF, 0x919C, 0x50D1, 0x8BA1, 0x50D5, 0x966C, 0x50D6, 0x9944, 0x50D8, 0xFA7D, 0x50DA, 0x97BB, 0x50DE, 0x9945, + 0x50E3, 0x9948, 0x50E5, 0x9946, 0x50E7, 0x916D, 0x50ED, 0x9947, 0x50EE, 0x9949, 0x50F4, 0xFA7C, 0x50F5, 0x994B, 0x50F9, 0x994A, + 0x50FB, 0x95C6, 0x5100, 0x8B56, 0x5101, 0x994D, 0x5102, 0x994E, 0x5104, 0x89AD, 0x5109, 0x994C, 0x5112, 0x8EF2, 0x5114, 0x9951, + 0x5115, 0x9950, 0x5116, 0x994F, 0x5118, 0x98D4, 0x511A, 0x9952, 0x511F, 0x8F9E, 0x5121, 0x9953, 0x512A, 0x9744, 0x5132, 0x96D7, + 0x5137, 0x9955, 0x513A, 0x9954, 0x513B, 0x9957, 0x513C, 0x9956, 0x513F, 0x9958, 0x5140, 0x9959, 0x5141, 0x88F2, 0x5143, 0x8CB3, + 0x5144, 0x8C5A, 0x5145, 0x8F5B, 0x5146, 0x929B, 0x5147, 0x8BA2, 0x5148, 0x90E6, 0x5149, 0x8CF5, 0x514A, 0xFA7E, 0x514B, 0x8D8E, + 0x514C, 0x995B, 0x514D, 0x96C6, 0x514E, 0x9365, 0x5150, 0x8E99, 0x5152, 0x995A, 0x5154, 0x995C, 0x515A, 0x937D, 0x515C, 0x8A95, + 0x5162, 0x995D, 0x5164, 0xFA80, 0x5165, 0x93FC, 0x5168, 0x9153, 0x5169, 0x995F, 0x516A, 0x9960, 0x516B, 0x94AA, 0x516C, 0x8CF6, + 0x516D, 0x985A, 0x516E, 0x9961, 0x5171, 0x8BA4, 0x5175, 0x95BA, 0x5176, 0x91B4, 0x5177, 0x8BEF, 0x5178, 0x9354, 0x517C, 0x8C93, + 0x5180, 0x9962, 0x5182, 0x9963, 0x5185, 0x93E0, 0x5186, 0x897E, 0x5189, 0x9966, 0x518A, 0x8DFB, 0x518C, 0x9965, 0x518D, 0x8DC4, + 0x518F, 0x9967, 0x5190, 0xE3EC, 0x5191, 0x9968, 0x5192, 0x9660, 0x5193, 0x9969, 0x5195, 0x996A, 0x5196, 0x996B, 0x5197, 0x8FE7, + 0x5199, 0x8ECA, 0x519D, 0xFA81, 0x51A0, 0x8AA5, 0x51A2, 0x996E, 0x51A4, 0x996C, 0x51A5, 0x96BB, 0x51A6, 0x996D, 0x51A8, 0x9579, + 0x51A9, 0x996F, 0x51AA, 0x9970, 0x51AB, 0x9971, 0x51AC, 0x937E, 0x51B0, 0x9975, 0x51B1, 0x9973, 0x51B2, 0x9974, 0x51B3, 0x9972, + 0x51B4, 0x8DE1, 0x51B5, 0x9976, 0x51B6, 0x96E8, 0x51B7, 0x97E2, 0x51BD, 0x9977, 0x51BE, 0xFA82, 0x51C4, 0x90A6, 0x51C5, 0x9978, + 0x51C6, 0x8F79, 0x51C9, 0x9979, 0x51CB, 0x929C, 0x51CC, 0x97BD, 0x51CD, 0x9380, 0x51D6, 0x99C3, 0x51DB, 0x997A, 0x51DC, 0xEAA3, + 0x51DD, 0x8BC3, 0x51E0, 0x997B, 0x51E1, 0x967D, 0x51E6, 0x8F88, 0x51E7, 0x91FA, 0x51E9, 0x997D, 0x51EA, 0x93E2, 0x51EC, 0xFA83, + 0x51ED, 0x997E, 0x51F0, 0x9980, 0x51F1, 0x8A4D, 0x51F5, 0x9981, 0x51F6, 0x8BA5, 0x51F8, 0x93CA, 0x51F9, 0x899A, 0x51FA, 0x8F6F, + 0x51FD, 0x949F, 0x51FE, 0x9982, 0x5200, 0x9381, 0x5203, 0x906E, 0x5204, 0x9983, 0x5206, 0x95AA, 0x5207, 0x90D8, 0x5208, 0x8AA0, + 0x520A, 0x8AA7, 0x520B, 0x9984, 0x520E, 0x9986, 0x5211, 0x8C59, 0x5214, 0x9985, 0x5215, 0xFA84, 0x5217, 0x97F1, 0x521D, 0x8F89, + 0x5224, 0x94BB, 0x5225, 0x95CA, 0x5227, 0x9987, 0x5229, 0x9798, 0x522A, 0x9988, 0x522E, 0x9989, 0x5230, 0x939E, 0x5233, 0x998A, + 0x5236, 0x90A7, 0x5237, 0x8DFC, 0x5238, 0x8C94, 0x5239, 0x998B, 0x523A, 0x8E68, 0x523B, 0x8D8F, 0x5243, 0x92E4, 0x5244, 0x998D, + 0x5247, 0x91A5, 0x524A, 0x8DED, 0x524B, 0x998E, 0x524C, 0x998F, 0x524D, 0x914F, 0x524F, 0x998C, 0x5254, 0x9991, 0x5256, 0x9655, + 0x525B, 0x8D84, 0x525E, 0x9990, 0x5263, 0x8C95, 0x5264, 0x8DDC, 0x5265, 0x948D, 0x5269, 0x9994, 0x526A, 0x9992, 0x526F, 0x959B, + 0x5270, 0x8FE8, 0x5271, 0x999B, 0x5272, 0x8A84, 0x5273, 0x9995, 0x5274, 0x9993, 0x5275, 0x916E, 0x527D, 0x9997, 0x527F, 0x9996, + 0x5283, 0x8A63, 0x5287, 0x8C80, 0x5288, 0x999C, 0x5289, 0x97AB, 0x528D, 0x9998, 0x5291, 0x999D, 0x5292, 0x999A, 0x5294, 0x9999, + 0x529B, 0x97CD, 0x529C, 0xFA85, 0x529F, 0x8CF7, 0x52A0, 0x89C1, 0x52A3, 0x97F2, 0x52A6, 0xFA86, 0x52A9, 0x8F95, 0x52AA, 0x9377, + 0x52AB, 0x8D85, 0x52AC, 0x99A0, 0x52AD, 0x99A1, 0x52AF, 0xFB77, 0x52B1, 0x97E3, 0x52B4, 0x984A, 0x52B5, 0x99A3, 0x52B9, 0x8CF8, + 0x52BC, 0x99A2, 0x52BE, 0x8A4E, 0x52C0, 0xFA87, 0x52C1, 0x99A4, 0x52C3, 0x9675, 0x52C5, 0x92BA, 0x52C7, 0x9745, 0x52C9, 0x95D7, + 0x52CD, 0x99A5, 0x52D2, 0xE8D3, 0x52D5, 0x93AE, 0x52D7, 0x99A6, 0x52D8, 0x8AA8, 0x52D9, 0x96B1, 0x52DB, 0xFA88, 0x52DD, 0x8F9F, + 0x52DE, 0x99A7, 0x52DF, 0x95E5, 0x52E0, 0x99AB, 0x52E2, 0x90A8, 0x52E3, 0x99A8, 0x52E4, 0x8BCE, 0x52E6, 0x99A9, 0x52E7, 0x8AA9, + 0x52F2, 0x8C4D, 0x52F3, 0x99AC, 0x52F5, 0x99AD, 0x52F8, 0x99AE, 0x52F9, 0x99AF, 0x52FA, 0x8ED9, 0x52FE, 0x8CF9, 0x52FF, 0x96DC, + 0x5300, 0xFA89, 0x5301, 0x96E6, 0x5302, 0x93F5, 0x5305, 0x95EF, 0x5306, 0x99B0, 0x5307, 0xFA8A, 0x5308, 0x99B1, 0x530D, 0x99B3, + 0x530F, 0x99B5, 0x5310, 0x99B4, 0x5315, 0x99B6, 0x5316, 0x89BB, 0x5317, 0x966B, 0x5319, 0x8DFA, 0x531A, 0x99B7, 0x531D, 0x9178, + 0x5320, 0x8FA0, 0x5321, 0x8BA7, 0x5323, 0x99B8, 0x5324, 0xFA8B, 0x532A, 0x94D9, 0x532F, 0x99B9, 0x5331, 0x99BA, 0x5333, 0x99BB, + 0x5338, 0x99BC, 0x5339, 0x9543, 0x533A, 0x8BE6, 0x533B, 0x88E3, 0x533F, 0x93BD, 0x5340, 0x99BD, 0x5341, 0x8F5C, 0x5343, 0x90E7, + 0x5345, 0x99BF, 0x5346, 0x99BE, 0x5347, 0x8FA1, 0x5348, 0x8CDF, 0x5349, 0x99C1, 0x534A, 0x94BC, 0x534D, 0x99C2, 0x5351, 0x94DA, + 0x5352, 0x91B2, 0x5353, 0x91EC, 0x5354, 0x8BA6, 0x5357, 0x93EC, 0x5358, 0x9250, 0x535A, 0x948E, 0x535C, 0x966D, 0x535E, 0x99C4, + 0x5360, 0x90E8, 0x5366, 0x8C54, 0x5369, 0x99C5, 0x536E, 0x99C6, 0x536F, 0x894B, 0x5370, 0x88F3, 0x5371, 0x8AEB, 0x5372, 0xFA8C, + 0x5373, 0x91A6, 0x5374, 0x8B70, 0x5375, 0x9791, 0x5377, 0x99C9, 0x5378, 0x89B5, 0x537B, 0x99C8, 0x537F, 0x8BA8, 0x5382, 0x99CA, + 0x5384, 0x96EF, 0x5393, 0xFA8D, 0x5396, 0x99CB, 0x5398, 0x97D0, 0x539A, 0x8CFA, 0x539F, 0x8CB4, 0x53A0, 0x99CC, 0x53A5, 0x99CE, + 0x53A6, 0x99CD, 0x53A8, 0x907E, 0x53A9, 0x8958, 0x53AD, 0x897D, 0x53AE, 0x99CF, 0x53B0, 0x99D0, 0x53B2, 0xFA8E, 0x53B3, 0x8CB5, + 0x53B6, 0x99D1, 0x53BB, 0x8B8E, 0x53C2, 0x8E51, 0x53C3, 0x99D2, 0x53C8, 0x9694, 0x53C9, 0x8DB3, 0x53CA, 0x8B79, 0x53CB, 0x9746, + 0x53CC, 0x916F, 0x53CD, 0x94BD, 0x53CE, 0x8EFB, 0x53D4, 0x8F66, 0x53D6, 0x8EE6, 0x53D7, 0x8EF3, 0x53D9, 0x8F96, 0x53DB, 0x94BE, + 0x53DD, 0xFA8F, 0x53DF, 0x99D5, 0x53E1, 0x8962, 0x53E2, 0x9170, 0x53E3, 0x8CFB, 0x53E4, 0x8CC3, 0x53E5, 0x8BE5, 0x53E8, 0x99D9, + 0x53E9, 0x9240, 0x53EA, 0x91FC, 0x53EB, 0x8BA9, 0x53EC, 0x8FA2, 0x53ED, 0x99DA, 0x53EE, 0x99D8, 0x53EF, 0x89C2, 0x53F0, 0x91E4, + 0x53F1, 0x8EB6, 0x53F2, 0x8E6A, 0x53F3, 0x8945, 0x53F6, 0x8A90, 0x53F7, 0x8D86, 0x53F8, 0x8E69, 0x53FA, 0x99DB, 0x5401, 0x99DC, + 0x5403, 0x8B68, 0x5404, 0x8A65, 0x5408, 0x8D87, 0x5409, 0x8B67, 0x540A, 0x92DD, 0x540B, 0x8944, 0x540C, 0x93AF, 0x540D, 0x96BC, + 0x540E, 0x8D40, 0x540F, 0x9799, 0x5410, 0x9366, 0x5411, 0x8CFC, 0x541B, 0x8C4E, 0x541D, 0x99E5, 0x541F, 0x8BE1, 0x5420, 0x9669, + 0x5426, 0x94DB, 0x5429, 0x99E4, 0x542B, 0x8ADC, 0x542C, 0x99DF, 0x542D, 0x99E0, 0x542E, 0x99E2, 0x5436, 0x99E3, 0x5438, 0x8B7A, + 0x5439, 0x9081, 0x543B, 0x95AB, 0x543C, 0x99E1, 0x543D, 0x99DD, 0x543E, 0x8CE1, 0x5440, 0x99DE, 0x5442, 0x9843, 0x5446, 0x95F0, + 0x5448, 0x92E6, 0x5449, 0x8CE0, 0x544A, 0x8D90, 0x544E, 0x99E6, 0x5451, 0x93DB, 0x545F, 0x99EA, 0x5468, 0x8EFC, 0x546A, 0x8EF4, + 0x5470, 0x99ED, 0x5471, 0x99EB, 0x5473, 0x96A1, 0x5475, 0x99E8, 0x5476, 0x99F1, 0x5477, 0x99EC, 0x547B, 0x99EF, 0x547C, 0x8CC4, + 0x547D, 0x96BD, 0x5480, 0x99F0, 0x5484, 0x99F2, 0x5486, 0x99F4, 0x548A, 0xFA92, 0x548B, 0x8DEE, 0x548C, 0x9861, 0x548E, 0x99E9, + 0x548F, 0x99E7, 0x5490, 0x99F3, 0x5492, 0x99EE, 0x549C, 0xFA91, 0x54A2, 0x99F6, 0x54A4, 0x9A42, 0x54A5, 0x99F8, 0x54A8, 0x99FC, + 0x54A9, 0xFA93, 0x54AB, 0x9A40, 0x54AC, 0x99F9, 0x54AF, 0x9A5D, 0x54B2, 0x8DE7, 0x54B3, 0x8A50, 0x54B8, 0x99F7, 0x54BC, 0x9A44, + 0x54BD, 0x88F4, 0x54BE, 0x9A43, 0x54C0, 0x88A3, 0x54C1, 0x9569, 0x54C2, 0x9A41, 0x54C4, 0x99FA, 0x54C7, 0x99F5, 0x54C8, 0x99FB, + 0x54C9, 0x8DC6, 0x54D8, 0x9A45, 0x54E1, 0x88F5, 0x54E2, 0x9A4E, 0x54E5, 0x9A46, 0x54E6, 0x9A47, 0x54E8, 0x8FA3, 0x54E9, 0x9689, + 0x54ED, 0x9A4C, 0x54EE, 0x9A4B, 0x54F2, 0x934E, 0x54FA, 0x9A4D, 0x54FD, 0x9A4A, 0x54FF, 0xFA94, 0x5504, 0x8953, 0x5506, 0x8DB4, + 0x5507, 0x904F, 0x550F, 0x9A48, 0x5510, 0x9382, 0x5514, 0x9A49, 0x5516, 0x88A0, 0x552E, 0x9A53, 0x552F, 0x9742, 0x5531, 0x8FA5, + 0x5533, 0x9A59, 0x5538, 0x9A58, 0x5539, 0x9A4F, 0x553E, 0x91C1, 0x5540, 0x9A50, 0x5544, 0x91ED, 0x5545, 0x9A55, 0x5546, 0x8FA4, + 0x554C, 0x9A52, 0x554F, 0x96E2, 0x5553, 0x8C5B, 0x5556, 0x9A56, 0x5557, 0x9A57, 0x555C, 0x9A54, 0x555D, 0x9A5A, 0x5563, 0x9A51, + 0x557B, 0x9A60, 0x557C, 0x9A65, 0x557E, 0x9A61, 0x5580, 0x9A5C, 0x5583, 0x9A66, 0x5584, 0x9150, 0x5586, 0xFA95, 0x5587, 0x9A68, + 0x5589, 0x8D41, 0x558A, 0x9A5E, 0x558B, 0x929D, 0x5598, 0x9A62, 0x5599, 0x9A5B, 0x559A, 0x8AAB, 0x559C, 0x8AEC, 0x559D, 0x8A85, + 0x559E, 0x9A63, 0x559F, 0x9A5F, 0x55A7, 0x8C96, 0x55A8, 0x9A69, 0x55A9, 0x9A67, 0x55AA, 0x9172, 0x55AB, 0x8B69, 0x55AC, 0x8BAA, + 0x55AE, 0x9A64, 0x55B0, 0x8BF2, 0x55B6, 0x8963, 0x55C4, 0x9A6D, 0x55C5, 0x9A6B, 0x55C7, 0x9AA5, 0x55D4, 0x9A70, 0x55DA, 0x9A6A, + 0x55DC, 0x9A6E, 0x55DF, 0x9A6C, 0x55E3, 0x8E6B, 0x55E4, 0x9A6F, 0x55F7, 0x9A72, 0x55F9, 0x9A77, 0x55FD, 0x9A75, 0x55FE, 0x9A74, + 0x5606, 0x9251, 0x5609, 0x89C3, 0x5614, 0x9A71, 0x5616, 0x9A73, 0x5617, 0x8FA6, 0x5618, 0x8952, 0x561B, 0x9A76, 0x5629, 0x89DC, + 0x562F, 0x9A82, 0x5631, 0x8FFA, 0x5632, 0x9A7D, 0x5634, 0x9A7B, 0x5636, 0x9A7C, 0x5638, 0x9A7E, 0x5642, 0x895C, 0x564C, 0x9158, + 0x564E, 0x9A78, 0x5650, 0x9A79, 0x565B, 0x8A9A, 0x5664, 0x9A81, 0x5668, 0x8AED, 0x566A, 0x9A84, 0x566B, 0x9A80, 0x566C, 0x9A83, + 0x5674, 0x95AC, 0x5678, 0x93D3, 0x567A, 0x94B6, 0x5680, 0x9A86, 0x5686, 0x9A85, 0x5687, 0x8A64, 0x568A, 0x9A87, 0x568F, 0x9A8A, + 0x5694, 0x9A89, 0x56A0, 0x9A88, 0x56A2, 0x9458, 0x56A5, 0x9A8B, 0x56AE, 0x9A8C, 0x56B4, 0x9A8E, 0x56B6, 0x9A8D, 0x56BC, 0x9A90, + 0x56C0, 0x9A93, 0x56C1, 0x9A91, 0x56C2, 0x9A8F, 0x56C3, 0x9A92, 0x56C8, 0x9A94, 0x56CE, 0x9A95, 0x56D1, 0x9A96, 0x56D3, 0x9A97, + 0x56D7, 0x9A98, 0x56D8, 0x9964, 0x56DA, 0x8EFA, 0x56DB, 0x8E6C, 0x56DE, 0x89F1, 0x56E0, 0x88F6, 0x56E3, 0x9263, 0x56EE, 0x9A99, + 0x56F0, 0x8DA2, 0x56F2, 0x88CD, 0x56F3, 0x907D, 0x56F9, 0x9A9A, 0x56FA, 0x8CC5, 0x56FD, 0x8D91, 0x56FF, 0x9A9C, 0x5700, 0x9A9B, + 0x5703, 0x95DE, 0x5704, 0x9A9D, 0x5708, 0x9A9F, 0x5709, 0x9A9E, 0x570B, 0x9AA0, 0x570D, 0x9AA1, 0x570F, 0x8C97, 0x5712, 0x8980, + 0x5713, 0x9AA2, 0x5716, 0x9AA4, 0x5718, 0x9AA3, 0x571C, 0x9AA6, 0x571F, 0x9379, 0x5726, 0x9AA7, 0x5727, 0x88B3, 0x5728, 0x8DDD, + 0x572D, 0x8C5C, 0x5730, 0x926E, 0x5737, 0x9AA8, 0x5738, 0x9AA9, 0x573B, 0x9AAB, 0x5740, 0x9AAC, 0x5742, 0x8DE2, 0x5747, 0x8BCF, + 0x574A, 0x9656, 0x574E, 0x9AAA, 0x574F, 0x9AAD, 0x5750, 0x8DBF, 0x5751, 0x8D42, 0x5759, 0xFA96, 0x5761, 0x9AB1, 0x5764, 0x8DA3, + 0x5765, 0xFA97, 0x5766, 0x9252, 0x5769, 0x9AAE, 0x576A, 0x92D8, 0x577F, 0x9AB2, 0x5782, 0x9082, 0x5788, 0x9AB0, 0x5789, 0x9AB3, + 0x578B, 0x8C5E, 0x5793, 0x9AB4, 0x57A0, 0x9AB5, 0x57A2, 0x8D43, 0x57A3, 0x8A5F, 0x57A4, 0x9AB7, 0x57AA, 0x9AB8, 0x57AC, 0xFA98, + 0x57B0, 0x9AB9, 0x57B3, 0x9AB6, 0x57C0, 0x9AAF, 0x57C3, 0x9ABA, 0x57C6, 0x9ABB, 0x57C7, 0xFA9A, 0x57C8, 0xFA99, 0x57CB, 0x9684, + 0x57CE, 0x8FE9, 0x57D2, 0x9ABD, 0x57D3, 0x9ABE, 0x57D4, 0x9ABC, 0x57D6, 0x9AC0, 0x57DC, 0x9457, 0x57DF, 0x88E6, 0x57E0, 0x9575, + 0x57E3, 0x9AC1, 0x57F4, 0x8FFB, 0x57F7, 0x8EB7, 0x57F9, 0x947C, 0x57FA, 0x8AEE, 0x57FC, 0x8DE9, 0x5800, 0x9678, 0x5802, 0x93B0, + 0x5805, 0x8C98, 0x5806, 0x91CD, 0x580A, 0x9ABF, 0x580B, 0x9AC2, 0x5815, 0x91C2, 0x5819, 0x9AC3, 0x581D, 0x9AC4, 0x5821, 0x9AC6, + 0x5824, 0x92E7, 0x582A, 0x8AAC, 0x582F, 0xEA9F, 0x5830, 0x8981, 0x5831, 0x95F1, 0x5834, 0x8FEA, 0x5835, 0x9367, 0x583A, 0x8DE4, + 0x583D, 0x9ACC, 0x5840, 0x95BB, 0x5841, 0x97DB, 0x584A, 0x89F2, 0x584B, 0x9AC8, 0x5851, 0x9159, 0x5852, 0x9ACB, 0x5854, 0x9383, + 0x5857, 0x9368, 0x5858, 0x9384, 0x5859, 0x94B7, 0x585A, 0x92CB, 0x585E, 0x8DC7, 0x5862, 0x9AC7, 0x5869, 0x8996, 0x586B, 0x9355, + 0x5870, 0x9AC9, 0x5872, 0x9AC5, 0x5875, 0x906F, 0x5879, 0x9ACD, 0x587E, 0x8F6D, 0x5883, 0x8BAB, 0x5885, 0x9ACE, 0x5893, 0x95E6, + 0x5897, 0x919D, 0x589C, 0x92C4, 0x589E, 0xFA9D, 0x589F, 0x9AD0, 0x58A8, 0x966E, 0x58AB, 0x9AD1, 0x58AE, 0x9AD6, 0x58B2, 0xFA9E, + 0x58B3, 0x95AD, 0x58B8, 0x9AD5, 0x58B9, 0x9ACF, 0x58BA, 0x9AD2, 0x58BB, 0x9AD4, 0x58BE, 0x8DA4, 0x58C1, 0x95C7, 0x58C5, 0x9AD7, + 0x58C7, 0x9264, 0x58CA, 0x89F3, 0x58CC, 0x8FEB, 0x58D1, 0x9AD9, 0x58D3, 0x9AD8, 0x58D5, 0x8D88, 0x58D7, 0x9ADA, 0x58D8, 0x9ADC, + 0x58D9, 0x9ADB, 0x58DC, 0x9ADE, 0x58DE, 0x9AD3, 0x58DF, 0x9AE0, 0x58E4, 0x9ADF, 0x58E5, 0x9ADD, 0x58EB, 0x8E6D, 0x58EC, 0x9070, + 0x58EE, 0x9173, 0x58EF, 0x9AE1, 0x58F0, 0x90BA, 0x58F1, 0x88EB, 0x58F2, 0x9484, 0x58F7, 0x92D9, 0x58F9, 0x9AE3, 0x58FA, 0x9AE2, + 0x58FB, 0x9AE4, 0x58FC, 0x9AE5, 0x58FD, 0x9AE6, 0x5902, 0x9AE7, 0x5909, 0x95CF, 0x590A, 0x9AE8, 0x590B, 0xFA9F, 0x590F, 0x89C4, + 0x5910, 0x9AE9, 0x5915, 0x975B, 0x5916, 0x8A4F, 0x5918, 0x99C7, 0x5919, 0x8F67, 0x591A, 0x91BD, 0x591B, 0x9AEA, 0x591C, 0x96E9, + 0x5922, 0x96B2, 0x5925, 0x9AEC, 0x5927, 0x91E5, 0x5929, 0x9356, 0x592A, 0x91BE, 0x592B, 0x9576, 0x592C, 0x9AED, 0x592D, 0x9AEE, + 0x592E, 0x899B, 0x5931, 0x8EB8, 0x5932, 0x9AEF, 0x5937, 0x88CE, 0x5938, 0x9AF0, 0x593E, 0x9AF1, 0x5944, 0x8982, 0x5947, 0x8AEF, + 0x5948, 0x93DE, 0x5949, 0x95F2, 0x594E, 0x9AF5, 0x594F, 0x9174, 0x5950, 0x9AF4, 0x5951, 0x8C5F, 0x5953, 0xFAA0, 0x5954, 0x967A, + 0x5955, 0x9AF3, 0x5957, 0x9385, 0x5958, 0x9AF7, 0x595A, 0x9AF6, 0x595B, 0xFAA1, 0x595D, 0xFAA2, 0x5960, 0x9AF9, 0x5962, 0x9AF8, + 0x5963, 0xFAA3, 0x5965, 0x899C, 0x5967, 0x9AFA, 0x5968, 0x8FA7, 0x5969, 0x9AFC, 0x596A, 0x9244, 0x596C, 0x9AFB, 0x596E, 0x95B1, + 0x5973, 0x8F97, 0x5974, 0x937A, 0x5978, 0x9B40, 0x597D, 0x8D44, 0x5981, 0x9B41, 0x5982, 0x9440, 0x5983, 0x94DC, 0x5984, 0x96CF, + 0x598A, 0x9444, 0x598D, 0x9B4A, 0x5993, 0x8B57, 0x5996, 0x9764, 0x5999, 0x96AD, 0x599B, 0x9BAA, 0x599D, 0x9B42, 0x59A3, 0x9B45, + 0x59A4, 0xFAA4, 0x59A5, 0x91C3, 0x59A8, 0x9657, 0x59AC, 0x9369, 0x59B2, 0x9B46, 0x59B9, 0x9685, 0x59BA, 0xFAA5, 0x59BB, 0x8DC8, + 0x59BE, 0x8FA8, 0x59C6, 0x9B47, 0x59C9, 0x8E6F, 0x59CB, 0x8E6E, 0x59D0, 0x88B7, 0x59D1, 0x8CC6, 0x59D3, 0x90A9, 0x59D4, 0x88CF, + 0x59D9, 0x9B4B, 0x59DA, 0x9B4C, 0x59DC, 0x9B49, 0x59E5, 0x8957, 0x59E6, 0x8AAD, 0x59E8, 0x9B48, 0x59EA, 0x96C3, 0x59EB, 0x9550, + 0x59F6, 0x88A6, 0x59FB, 0x88F7, 0x59FF, 0x8E70, 0x5A01, 0x88D0, 0x5A03, 0x88A1, 0x5A09, 0x9B51, 0x5A11, 0x9B4F, 0x5A18, 0x96BA, + 0x5A1A, 0x9B52, 0x5A1C, 0x9B50, 0x5A1F, 0x9B4E, 0x5A20, 0x9050, 0x5A25, 0x9B4D, 0x5A29, 0x95D8, 0x5A2F, 0x8CE2, 0x5A35, 0x9B56, + 0x5A36, 0x9B57, 0x5A3C, 0x8FA9, 0x5A40, 0x9B53, 0x5A41, 0x984B, 0x5A46, 0x946B, 0x5A49, 0x9B55, 0x5A5A, 0x8DA5, 0x5A62, 0x9B58, + 0x5A66, 0x9577, 0x5A6A, 0x9B59, 0x5A6C, 0x9B54, 0x5A7F, 0x96B9, 0x5A92, 0x947D, 0x5A9A, 0x9B5A, 0x5A9B, 0x9551, 0x5ABC, 0x9B5B, + 0x5ABD, 0x9B5F, 0x5ABE, 0x9B5C, 0x5AC1, 0x89C5, 0x5AC2, 0x9B5E, 0x5AC9, 0x8EB9, 0x5ACB, 0x9B5D, 0x5ACC, 0x8C99, 0x5AD0, 0x9B6B, + 0x5AD6, 0x9B64, 0x5AD7, 0x9B61, 0x5AE1, 0x9284, 0x5AE3, 0x9B60, 0x5AE6, 0x9B62, 0x5AE9, 0x9B63, 0x5AFA, 0x9B65, 0x5AFB, 0x9B66, + 0x5B09, 0x8AF0, 0x5B0B, 0x9B68, 0x5B0C, 0x9B67, 0x5B16, 0x9B69, 0x5B22, 0x8FEC, 0x5B2A, 0x9B6C, 0x5B2C, 0x92DA, 0x5B30, 0x8964, + 0x5B32, 0x9B6A, 0x5B36, 0x9B6D, 0x5B3E, 0x9B6E, 0x5B40, 0x9B71, 0x5B43, 0x9B6F, 0x5B45, 0x9B70, 0x5B50, 0x8E71, 0x5B51, 0x9B72, + 0x5B54, 0x8D45, 0x5B55, 0x9B73, 0x5B56, 0xFAA6, 0x5B57, 0x8E9A, 0x5B58, 0x91B6, 0x5B5A, 0x9B74, 0x5B5B, 0x9B75, 0x5B5C, 0x8E79, + 0x5B5D, 0x8D46, 0x5B5F, 0x96D0, 0x5B63, 0x8B47, 0x5B64, 0x8CC7, 0x5B65, 0x9B76, 0x5B66, 0x8A77, 0x5B69, 0x9B77, 0x5B6B, 0x91B7, + 0x5B70, 0x9B78, 0x5B71, 0x9BA1, 0x5B73, 0x9B79, 0x5B75, 0x9B7A, 0x5B78, 0x9B7B, 0x5B7A, 0x9B7D, 0x5B80, 0x9B7E, 0x5B83, 0x9B80, + 0x5B85, 0x91EE, 0x5B87, 0x8946, 0x5B88, 0x8EE7, 0x5B89, 0x88C0, 0x5B8B, 0x9176, 0x5B8C, 0x8AAE, 0x5B8D, 0x8EB3, 0x5B8F, 0x8D47, + 0x5B95, 0x9386, 0x5B97, 0x8F40, 0x5B98, 0x8AAF, 0x5B99, 0x9288, 0x5B9A, 0x92E8, 0x5B9B, 0x88B6, 0x5B9C, 0x8B58, 0x5B9D, 0x95F3, + 0x5B9F, 0x8EC0, 0x5BA2, 0x8B71, 0x5BA3, 0x90E9, 0x5BA4, 0x8EBA, 0x5BA5, 0x9747, 0x5BA6, 0x9B81, 0x5BAE, 0x8B7B, 0x5BB0, 0x8DC9, + 0x5BB3, 0x8A51, 0x5BB4, 0x8983, 0x5BB5, 0x8FAA, 0x5BB6, 0x89C6, 0x5BB8, 0x9B82, 0x5BB9, 0x9765, 0x5BBF, 0x8F68, 0x5BC0, 0xFAA7, + 0x5BC2, 0x8EE2, 0x5BC3, 0x9B83, 0x5BC4, 0x8AF1, 0x5BC5, 0x93D0, 0x5BC6, 0x96A7, 0x5BC7, 0x9B84, 0x5BC9, 0x9B85, 0x5BCC, 0x9578, + 0x5BD0, 0x9B87, 0x5BD2, 0x8AA6, 0x5BD3, 0x8BF5, 0x5BD4, 0x9B86, 0x5BD8, 0xFAA9, 0x5BDB, 0x8AB0, 0x5BDD, 0x9051, 0x5BDE, 0x9B8B, + 0x5BDF, 0x8E40, 0x5BE1, 0x89C7, 0x5BE2, 0x9B8A, 0x5BE4, 0x9B88, 0x5BE5, 0x9B8C, 0x5BE6, 0x9B89, 0x5BE7, 0x944A, 0x5BE8, 0x9ECB, + 0x5BE9, 0x9052, 0x5BEB, 0x9B8D, 0x5BEC, 0xFAAA, 0x5BEE, 0x97BE, 0x5BF0, 0x9B8E, 0x5BF3, 0x9B90, 0x5BF5, 0x929E, 0x5BF6, 0x9B8F, + 0x5BF8, 0x90A1, 0x5BFA, 0x8E9B, 0x5BFE, 0x91CE, 0x5BFF, 0x8EF5, 0x5C01, 0x9595, 0x5C02, 0x90EA, 0x5C04, 0x8ECB, 0x5C05, 0x9B91, + 0x5C06, 0x8FAB, 0x5C07, 0x9B92, 0x5C08, 0x9B93, 0x5C09, 0x88D1, 0x5C0A, 0x91B8, 0x5C0B, 0x9071, 0x5C0D, 0x9B94, 0x5C0E, 0x93B1, + 0x5C0F, 0x8FAC, 0x5C11, 0x8FAD, 0x5C13, 0x9B95, 0x5C16, 0x90EB, 0x5C1A, 0x8FAE, 0x5C1E, 0xFAAB, 0x5C20, 0x9B96, 0x5C22, 0x9B97, + 0x5C24, 0x96DE, 0x5C28, 0x9B98, 0x5C2D, 0x8BC4, 0x5C31, 0x8F41, 0x5C38, 0x9B99, 0x5C39, 0x9B9A, 0x5C3A, 0x8EDA, 0x5C3B, 0x904B, + 0x5C3C, 0x93F2, 0x5C3D, 0x9073, 0x5C3E, 0x94F6, 0x5C3F, 0x9441, 0x5C40, 0x8BC7, 0x5C41, 0x9B9B, 0x5C45, 0x8B8F, 0x5C46, 0x9B9C, + 0x5C48, 0x8BFC, 0x5C4A, 0x93CD, 0x5C4B, 0x89AE, 0x5C4D, 0x8E72, 0x5C4E, 0x9B9D, 0x5C4F, 0x9BA0, 0x5C50, 0x9B9F, 0x5C51, 0x8BFB, + 0x5C53, 0x9B9E, 0x5C55, 0x9357, 0x5C5E, 0x91AE, 0x5C60, 0x936A, 0x5C61, 0x8EC6, 0x5C64, 0x9177, 0x5C65, 0x979A, 0x5C6C, 0x9BA2, + 0x5C6E, 0x9BA3, 0x5C6F, 0x93D4, 0x5C71, 0x8E52, 0x5C76, 0x9BA5, 0x5C79, 0x9BA6, 0x5C8C, 0x9BA7, 0x5C90, 0x8AF2, 0x5C91, 0x9BA8, + 0x5C94, 0x9BA9, 0x5CA1, 0x89AA, 0x5CA6, 0xFAAC, 0x5CA8, 0x915A, 0x5CA9, 0x8AE2, 0x5CAB, 0x9BAB, 0x5CAC, 0x96A6, 0x5CB1, 0x91D0, + 0x5CB3, 0x8A78, 0x5CB6, 0x9BAD, 0x5CB7, 0x9BAF, 0x5CB8, 0x8ADD, 0x5CBA, 0xFAAD, 0x5CBB, 0x9BAC, 0x5CBC, 0x9BAE, 0x5CBE, 0x9BB1, + 0x5CC5, 0x9BB0, 0x5CC7, 0x9BB2, 0x5CD9, 0x9BB3, 0x5CE0, 0x93BB, 0x5CE1, 0x8BAC, 0x5CE8, 0x89E3, 0x5CE9, 0x9BB4, 0x5CEA, 0x9BB9, + 0x5CED, 0x9BB7, 0x5CEF, 0x95F5, 0x5CF0, 0x95F4, 0x5CF5, 0xFAAE, 0x5CF6, 0x9387, 0x5CFA, 0x9BB6, 0x5CFB, 0x8F73, 0x5CFD, 0x9BB5, + 0x5D07, 0x9092, 0x5D0B, 0x9BBA, 0x5D0E, 0x8DE8, 0x5D11, 0x9BC0, 0x5D14, 0x9BC1, 0x5D15, 0x9BBB, 0x5D16, 0x8A52, 0x5D17, 0x9BBC, + 0x5D18, 0x9BC5, 0x5D19, 0x9BC4, 0x5D1A, 0x9BC3, 0x5D1B, 0x9BBF, 0x5D1F, 0x9BBE, 0x5D22, 0x9BC2, 0x5D27, 0xFAAF, 0x5D29, 0x95F6, + 0x5D42, 0xFAB2, 0x5D4B, 0x9BC9, 0x5D4C, 0x9BC6, 0x5D4E, 0x9BC8, 0x5D50, 0x9792, 0x5D52, 0x9BC7, 0x5D53, 0xFAB0, 0x5D5C, 0x9BBD, + 0x5D69, 0x9093, 0x5D6C, 0x9BCA, 0x5D6D, 0xFAB3, 0x5D6F, 0x8DB5, 0x5D73, 0x9BCB, 0x5D76, 0x9BCC, 0x5D82, 0x9BCF, 0x5D84, 0x9BCE, + 0x5D87, 0x9BCD, 0x5D8B, 0x9388, 0x5D8C, 0x9BB8, 0x5D90, 0x9BD5, 0x5D9D, 0x9BD1, 0x5DA2, 0x9BD0, 0x5DAC, 0x9BD2, 0x5DAE, 0x9BD3, + 0x5DB7, 0x9BD6, 0x5DB8, 0xFAB4, 0x5DB9, 0xFAB5, 0x5DBA, 0x97E4, 0x5DBC, 0x9BD7, 0x5DBD, 0x9BD4, 0x5DC9, 0x9BD8, 0x5DCC, 0x8ADE, + 0x5DCD, 0x9BD9, 0x5DD0, 0xFAB6, 0x5DD2, 0x9BDB, 0x5DD3, 0x9BDA, 0x5DD6, 0x9BDC, 0x5DDB, 0x9BDD, 0x5DDD, 0x90EC, 0x5DDE, 0x8F42, + 0x5DE1, 0x8F84, 0x5DE3, 0x9183, 0x5DE5, 0x8D48, 0x5DE6, 0x8DB6, 0x5DE7, 0x8D49, 0x5DE8, 0x8B90, 0x5DEB, 0x9BDE, 0x5DEE, 0x8DB7, + 0x5DF1, 0x8CC8, 0x5DF2, 0x9BDF, 0x5DF3, 0x96A4, 0x5DF4, 0x9462, 0x5DF5, 0x9BE0, 0x5DF7, 0x8D4A, 0x5DFB, 0x8AAA, 0x5DFD, 0x9246, + 0x5DFE, 0x8BD0, 0x5E02, 0x8E73, 0x5E03, 0x957A, 0x5E06, 0x94BF, 0x5E0B, 0x9BE1, 0x5E0C, 0x8AF3, 0x5E11, 0x9BE4, 0x5E16, 0x929F, + 0x5E19, 0x9BE3, 0x5E1A, 0x9BE2, 0x5E1B, 0x9BE5, 0x5E1D, 0x92E9, 0x5E25, 0x9083, 0x5E2B, 0x8E74, 0x5E2D, 0x90C8, 0x5E2F, 0x91D1, + 0x5E30, 0x8B41, 0x5E33, 0x92A0, 0x5E36, 0x9BE6, 0x5E37, 0x9BE7, 0x5E38, 0x8FED, 0x5E3D, 0x9658, 0x5E40, 0x9BEA, 0x5E43, 0x9BE9, + 0x5E44, 0x9BE8, 0x5E45, 0x959D, 0x5E47, 0x9BF1, 0x5E4C, 0x9679, 0x5E4E, 0x9BEB, 0x5E54, 0x9BED, 0x5E55, 0x968B, 0x5E57, 0x9BEC, + 0x5E5F, 0x9BEE, 0x5E61, 0x94A6, 0x5E62, 0x9BEF, 0x5E63, 0x95BC, 0x5E64, 0x9BF0, 0x5E72, 0x8AB1, 0x5E73, 0x95BD, 0x5E74, 0x944E, + 0x5E75, 0x9BF2, 0x5E76, 0x9BF3, 0x5E78, 0x8D4B, 0x5E79, 0x8AB2, 0x5E7A, 0x9BF4, 0x5E7B, 0x8CB6, 0x5E7C, 0x9763, 0x5E7D, 0x9748, + 0x5E7E, 0x8AF4, 0x5E7F, 0x9BF6, 0x5E81, 0x92A1, 0x5E83, 0x8D4C, 0x5E84, 0x8FAF, 0x5E87, 0x94DD, 0x5E8A, 0x8FB0, 0x5E8F, 0x8F98, + 0x5E95, 0x92EA, 0x5E96, 0x95F7, 0x5E97, 0x9358, 0x5E9A, 0x8D4D, 0x5E9C, 0x957B, 0x5EA0, 0x9BF7, 0x5EA6, 0x9378, 0x5EA7, 0x8DC0, + 0x5EAB, 0x8CC9, 0x5EAD, 0x92EB, 0x5EB5, 0x88C1, 0x5EB6, 0x8F8E, 0x5EB7, 0x8D4E, 0x5EB8, 0x9766, 0x5EC1, 0x9BF8, 0x5EC2, 0x9BF9, + 0x5EC3, 0x9470, 0x5EC8, 0x9BFA, 0x5EC9, 0x97F5, 0x5ECA, 0x984C, 0x5ECF, 0x9BFC, 0x5ED0, 0x9BFB, 0x5ED3, 0x8A66, 0x5ED6, 0x9C40, + 0x5EDA, 0x9C43, 0x5EDB, 0x9C44, 0x5EDD, 0x9C42, 0x5EDF, 0x955F, 0x5EE0, 0x8FB1, 0x5EE1, 0x9C46, 0x5EE2, 0x9C45, 0x5EE3, 0x9C41, + 0x5EE8, 0x9C47, 0x5EE9, 0x9C48, 0x5EEC, 0x9C49, 0x5EF0, 0x9C4C, 0x5EF1, 0x9C4A, 0x5EF3, 0x9C4B, 0x5EF4, 0x9C4D, 0x5EF6, 0x8984, + 0x5EF7, 0x92EC, 0x5EF8, 0x9C4E, 0x5EFA, 0x8C9A, 0x5EFB, 0x89F4, 0x5EFC, 0x9455, 0x5EFE, 0x9C4F, 0x5EFF, 0x93F9, 0x5F01, 0x95D9, + 0x5F03, 0x9C50, 0x5F04, 0x984D, 0x5F09, 0x9C51, 0x5F0A, 0x95BE, 0x5F0B, 0x9C54, 0x5F0C, 0x989F, 0x5F0D, 0x98AF, 0x5F0F, 0x8EAE, + 0x5F10, 0x93F3, 0x5F11, 0x9C55, 0x5F13, 0x8B7C, 0x5F14, 0x92A2, 0x5F15, 0x88F8, 0x5F16, 0x9C56, 0x5F17, 0x95A4, 0x5F18, 0x8D4F, + 0x5F1B, 0x926F, 0x5F1F, 0x92ED, 0x5F21, 0xFAB7, 0x5F25, 0x96ED, 0x5F26, 0x8CB7, 0x5F27, 0x8CCA, 0x5F29, 0x9C57, 0x5F2D, 0x9C58, + 0x5F2F, 0x9C5E, 0x5F31, 0x8EE3, 0x5F34, 0xFAB8, 0x5F35, 0x92A3, 0x5F37, 0x8BAD, 0x5F38, 0x9C59, 0x5F3C, 0x954A, 0x5F3E, 0x9265, + 0x5F41, 0x9C5A, 0x5F45, 0xFA67, 0x5F48, 0x9C5B, 0x5F4A, 0x8BAE, 0x5F4C, 0x9C5C, 0x5F4E, 0x9C5D, 0x5F51, 0x9C5F, 0x5F53, 0x9396, + 0x5F56, 0x9C60, 0x5F57, 0x9C61, 0x5F59, 0x9C62, 0x5F5C, 0x9C53, 0x5F5D, 0x9C52, 0x5F61, 0x9C63, 0x5F62, 0x8C60, 0x5F66, 0x9546, + 0x5F67, 0xFAB9, 0x5F69, 0x8DCA, 0x5F6A, 0x9556, 0x5F6B, 0x92A4, 0x5F6C, 0x956A, 0x5F6D, 0x9C64, 0x5F70, 0x8FB2, 0x5F71, 0x8965, + 0x5F73, 0x9C65, 0x5F77, 0x9C66, 0x5F79, 0x96F0, 0x5F7C, 0x94DE, 0x5F7F, 0x9C69, 0x5F80, 0x899D, 0x5F81, 0x90AA, 0x5F82, 0x9C68, + 0x5F83, 0x9C67, 0x5F84, 0x8C61, 0x5F85, 0x91D2, 0x5F87, 0x9C6D, 0x5F88, 0x9C6B, 0x5F8A, 0x9C6A, 0x5F8B, 0x97A5, 0x5F8C, 0x8CE3, + 0x5F90, 0x8F99, 0x5F91, 0x9C6C, 0x5F92, 0x936B, 0x5F93, 0x8F5D, 0x5F97, 0x93BE, 0x5F98, 0x9C70, 0x5F99, 0x9C6F, 0x5F9E, 0x9C6E, + 0x5FA0, 0x9C71, 0x5FA1, 0x8CE4, 0x5FA8, 0x9C72, 0x5FA9, 0x959C, 0x5FAA, 0x8F7A, 0x5FAD, 0x9C73, 0x5FAE, 0x94F7, 0x5FB3, 0x93BF, + 0x5FB4, 0x92A5, 0x5FB7, 0xFABA, 0x5FB9, 0x934F, 0x5FBC, 0x9C74, 0x5FBD, 0x8B4A, 0x5FC3, 0x9053, 0x5FC5, 0x954B, 0x5FCC, 0x8AF5, + 0x5FCD, 0x9445, 0x5FD6, 0x9C75, 0x5FD7, 0x8E75, 0x5FD8, 0x9659, 0x5FD9, 0x965A, 0x5FDC, 0x899E, 0x5FDD, 0x9C7A, 0x5FDE, 0xFABB, + 0x5FE0, 0x9289, 0x5FE4, 0x9C77, 0x5FEB, 0x89F5, 0x5FF0, 0x9CAB, 0x5FF1, 0x9C79, 0x5FF5, 0x944F, 0x5FF8, 0x9C78, 0x5FFB, 0x9C76, + 0x5FFD, 0x8D9A, 0x5FFF, 0x9C7C, 0x600E, 0x9C83, 0x600F, 0x9C89, 0x6010, 0x9C81, 0x6012, 0x937B, 0x6015, 0x9C86, 0x6016, 0x957C, + 0x6019, 0x9C80, 0x601B, 0x9C85, 0x601C, 0x97E5, 0x601D, 0x8E76, 0x6020, 0x91D3, 0x6021, 0x9C7D, 0x6025, 0x8B7D, 0x6026, 0x9C88, + 0x6027, 0x90AB, 0x6028, 0x8985, 0x6029, 0x9C82, 0x602A, 0x89F6, 0x602B, 0x9C87, 0x602F, 0x8BAF, 0x6031, 0x9C84, 0x603A, 0x9C8A, + 0x6041, 0x9C8C, 0x6042, 0x9C96, 0x6043, 0x9C94, 0x6046, 0x9C91, 0x604A, 0x9C90, 0x604B, 0x97F6, 0x604D, 0x9C92, 0x6050, 0x8BB0, + 0x6052, 0x8D50, 0x6055, 0x8F9A, 0x6059, 0x9C99, 0x605A, 0x9C8B, 0x605D, 0xFABC, 0x605F, 0x9C8F, 0x6060, 0x9C7E, 0x6062, 0x89F8, + 0x6063, 0x9C93, 0x6064, 0x9C95, 0x6065, 0x9270, 0x6068, 0x8DA6, 0x6069, 0x89B6, 0x606A, 0x9C8D, 0x606B, 0x9C98, 0x606C, 0x9C97, + 0x606D, 0x8BB1, 0x606F, 0x91A7, 0x6070, 0x8A86, 0x6075, 0x8C62, 0x6077, 0x9C8E, 0x6081, 0x9C9A, 0x6083, 0x9C9D, 0x6084, 0x9C9F, + 0x6085, 0xFABD, 0x6089, 0x8EBB, 0x608A, 0xFABE, 0x608B, 0x9CA5, 0x608C, 0x92EE, 0x608D, 0x9C9B, 0x6092, 0x9CA3, 0x6094, 0x89F7, + 0x6096, 0x9CA1, 0x6097, 0x9CA2, 0x609A, 0x9C9E, 0x609B, 0x9CA0, 0x609F, 0x8CE5, 0x60A0, 0x9749, 0x60A3, 0x8AB3, 0x60A6, 0x8978, + 0x60A7, 0x9CA4, 0x60A9, 0x9459, 0x60AA, 0x88AB, 0x60B2, 0x94DF, 0x60B3, 0x9C7B, 0x60B4, 0x9CAA, 0x60B5, 0x9CAE, 0x60B6, 0x96E3, + 0x60B8, 0x9CA7, 0x60BC, 0x9389, 0x60BD, 0x9CAC, 0x60C5, 0x8FEE, 0x60C6, 0x9CAD, 0x60C7, 0x93D5, 0x60D1, 0x9866, 0x60D3, 0x9CA9, + 0x60D5, 0xFAC0, 0x60D8, 0x9CAF, 0x60DA, 0x8D9B, 0x60DC, 0x90C9, 0x60DE, 0xFABF, 0x60DF, 0x88D2, 0x60E0, 0x9CA8, 0x60E1, 0x9CA6, + 0x60E3, 0x9179, 0x60E7, 0x9C9C, 0x60E8, 0x8E53, 0x60F0, 0x91C4, 0x60F1, 0x9CBB, 0x60F2, 0xFAC2, 0x60F3, 0x917A, 0x60F4, 0x9CB6, + 0x60F6, 0x9CB3, 0x60F7, 0x9CB4, 0x60F9, 0x8EE4, 0x60FA, 0x9CB7, 0x60FB, 0x9CBA, 0x6100, 0x9CB5, 0x6101, 0x8F44, 0x6103, 0x9CB8, + 0x6106, 0x9CB2, 0x6108, 0x96FA, 0x6109, 0x96F9, 0x610D, 0x9CBC, 0x610E, 0x9CBD, 0x610F, 0x88D3, 0x6111, 0xFAC3, 0x6115, 0x9CB1, + 0x611A, 0x8BF0, 0x611B, 0x88A4, 0x611F, 0x8AB4, 0x6120, 0xFAC1, 0x6121, 0x9CB9, 0x6127, 0x9CC1, 0x6128, 0x9CC0, 0x612C, 0x9CC5, + 0x6130, 0xFAC5, 0x6134, 0x9CC6, 0x6137, 0xFAC4, 0x613C, 0x9CC4, 0x613D, 0x9CC7, 0x613E, 0x9CBF, 0x613F, 0x9CC3, 0x6142, 0x9CC8, + 0x6144, 0x9CC9, 0x6147, 0x9CBE, 0x6148, 0x8E9C, 0x614A, 0x9CC2, 0x614B, 0x91D4, 0x614C, 0x8D51, 0x614D, 0x9CB0, 0x614E, 0x9054, + 0x6153, 0x9CD6, 0x6155, 0x95E7, 0x6158, 0x9CCC, 0x6159, 0x9CCD, 0x615A, 0x9CCE, 0x615D, 0x9CD5, 0x615F, 0x9CD4, 0x6162, 0x969D, + 0x6163, 0x8AB5, 0x6165, 0x9CD2, 0x6167, 0x8C64, 0x6168, 0x8A53, 0x616B, 0x9CCF, 0x616E, 0x97B6, 0x616F, 0x9CD1, 0x6170, 0x88D4, + 0x6171, 0x9CD3, 0x6173, 0x9CCA, 0x6174, 0x9CD0, 0x6175, 0x9CD7, 0x6176, 0x8C63, 0x6177, 0x9CCB, 0x617E, 0x977C, 0x6182, 0x974A, + 0x6187, 0x9CDA, 0x618A, 0x9CDE, 0x618E, 0x919E, 0x6190, 0x97F7, 0x6191, 0x9CDF, 0x6194, 0x9CDC, 0x6196, 0x9CD9, 0x6198, 0xFAC6, + 0x6199, 0x9CD8, 0x619A, 0x9CDD, 0x61A4, 0x95AE, 0x61A7, 0x93B2, 0x61A9, 0x8C65, 0x61AB, 0x9CE0, 0x61AC, 0x9CDB, 0x61AE, 0x9CE1, + 0x61B2, 0x8C9B, 0x61B6, 0x89AF, 0x61BA, 0x9CE9, 0x61BE, 0x8AB6, 0x61C3, 0x9CE7, 0x61C6, 0x9CE8, 0x61C7, 0x8DA7, 0x61C8, 0x9CE6, + 0x61C9, 0x9CE4, 0x61CA, 0x9CE3, 0x61CB, 0x9CEA, 0x61CC, 0x9CE2, 0x61CD, 0x9CEC, 0x61D0, 0x89F9, 0x61E3, 0x9CEE, 0x61E6, 0x9CED, + 0x61F2, 0x92A6, 0x61F4, 0x9CF1, 0x61F6, 0x9CEF, 0x61F7, 0x9CE5, 0x61F8, 0x8C9C, 0x61FA, 0x9CF0, 0x61FC, 0x9CF4, 0x61FD, 0x9CF3, + 0x61FE, 0x9CF5, 0x61FF, 0x9CF2, 0x6200, 0x9CF6, 0x6208, 0x9CF7, 0x6209, 0x9CF8, 0x620A, 0x95E8, 0x620C, 0x9CFA, 0x620D, 0x9CF9, + 0x620E, 0x8F5E, 0x6210, 0x90AC, 0x6211, 0x89E4, 0x6212, 0x89FA, 0x6213, 0xFAC7, 0x6214, 0x9CFB, 0x6216, 0x88BD, 0x621A, 0x90CA, + 0x621B, 0x9CFC, 0x621D, 0xE6C1, 0x621E, 0x9D40, 0x621F, 0x8C81, 0x6221, 0x9D41, 0x6226, 0x90ED, 0x622A, 0x9D42, 0x622E, 0x9D43, + 0x622F, 0x8B59, 0x6230, 0x9D44, 0x6232, 0x9D45, 0x6233, 0x9D46, 0x6234, 0x91D5, 0x6238, 0x8CCB, 0x623B, 0x96DF, 0x623F, 0x965B, + 0x6240, 0x8F8A, 0x6241, 0x9D47, 0x6247, 0x90EE, 0x6248, 0xE7BB, 0x6249, 0x94E0, 0x624B, 0x8EE8, 0x624D, 0x8DCB, 0x624E, 0x9D48, + 0x6253, 0x91C5, 0x6255, 0x95A5, 0x6258, 0x91EF, 0x625B, 0x9D4B, 0x625E, 0x9D49, 0x6260, 0x9D4C, 0x6263, 0x9D4A, 0x6268, 0x9D4D, + 0x626E, 0x95AF, 0x6271, 0x88B5, 0x6276, 0x957D, 0x6279, 0x94E1, 0x627C, 0x9D4E, 0x627E, 0x9D51, 0x627F, 0x8FB3, 0x6280, 0x8B5A, + 0x6282, 0x9D4F, 0x6283, 0x9D56, 0x6284, 0x8FB4, 0x6289, 0x9D50, 0x628A, 0x9463, 0x6291, 0x977D, 0x6292, 0x9D52, 0x6293, 0x9D53, + 0x6294, 0x9D57, 0x6295, 0x938A, 0x6296, 0x9D54, 0x6297, 0x8D52, 0x6298, 0x90DC, 0x629B, 0x9D65, 0x629C, 0x94B2, 0x629E, 0x91F0, + 0x62A6, 0xFAC8, 0x62AB, 0x94E2, 0x62AC, 0x9DAB, 0x62B1, 0x95F8, 0x62B5, 0x92EF, 0x62B9, 0x9695, 0x62BB, 0x9D5A, 0x62BC, 0x899F, + 0x62BD, 0x928A, 0x62C2, 0x9D63, 0x62C5, 0x9253, 0x62C6, 0x9D5D, 0x62C7, 0x9D64, 0x62C8, 0x9D5F, 0x62C9, 0x9D66, 0x62CA, 0x9D62, + 0x62CC, 0x9D61, 0x62CD, 0x948F, 0x62CF, 0x9D5B, 0x62D0, 0x89FB, 0x62D1, 0x9D59, 0x62D2, 0x8B91, 0x62D3, 0x91F1, 0x62D4, 0x9D55, + 0x62D7, 0x9D58, 0x62D8, 0x8D53, 0x62D9, 0x90D9, 0x62DB, 0x8FB5, 0x62DC, 0x9D60, 0x62DD, 0x9471, 0x62E0, 0x8B92, 0x62E1, 0x8A67, + 0x62EC, 0x8A87, 0x62ED, 0x9040, 0x62EE, 0x9D68, 0x62EF, 0x9D6D, 0x62F1, 0x9D69, 0x62F3, 0x8C9D, 0x62F5, 0x9D6E, 0x62F6, 0x8E41, + 0x62F7, 0x8D89, 0x62FE, 0x8F45, 0x62FF, 0x9D5C, 0x6301, 0x8E9D, 0x6302, 0x9D6B, 0x6307, 0x8E77, 0x6308, 0x9D6C, 0x6309, 0x88C2, + 0x630C, 0x9D67, 0x6311, 0x92A7, 0x6319, 0x8B93, 0x631F, 0x8BB2, 0x6327, 0x9D6A, 0x6328, 0x88A5, 0x632B, 0x8DC1, 0x632F, 0x9055, + 0x633A, 0x92F0, 0x633D, 0x94D2, 0x633E, 0x9D70, 0x633F, 0x917D, 0x6349, 0x91A8, 0x634C, 0x8E4A, 0x634D, 0x9D71, 0x634F, 0x9D73, + 0x6350, 0x9D6F, 0x6355, 0x95DF, 0x6357, 0x92BB, 0x635C, 0x917B, 0x6367, 0x95F9, 0x6368, 0x8ECC, 0x6369, 0x9D80, 0x636B, 0x9D7E, + 0x636E, 0x9098, 0x6372, 0x8C9E, 0x6376, 0x9D78, 0x6377, 0x8FB7, 0x637A, 0x93E6, 0x637B, 0x9450, 0x6380, 0x9D76, 0x6383, 0x917C, + 0x6388, 0x8EF6, 0x6389, 0x9D7B, 0x638C, 0x8FB6, 0x638E, 0x9D75, 0x638F, 0x9D7A, 0x6392, 0x9472, 0x6396, 0x9D74, 0x6398, 0x8C40, + 0x639B, 0x8A7C, 0x639F, 0x9D7C, 0x63A0, 0x97A9, 0x63A1, 0x8DCC, 0x63A2, 0x9254, 0x63A3, 0x9D79, 0x63A5, 0x90DA, 0x63A7, 0x8D54, + 0x63A8, 0x9084, 0x63A9, 0x8986, 0x63AA, 0x915B, 0x63AB, 0x9D77, 0x63AC, 0x8B64, 0x63B2, 0x8C66, 0x63B4, 0x92CD, 0x63B5, 0x9D7D, + 0x63BB, 0x917E, 0x63BE, 0x9D81, 0x63C0, 0x9D83, 0x63C3, 0x91B5, 0x63C4, 0x9D89, 0x63C6, 0x9D84, 0x63C9, 0x9D86, 0x63CF, 0x9560, + 0x63D0, 0x92F1, 0x63D2, 0x9D87, 0x63D6, 0x974B, 0x63DA, 0x9767, 0x63DB, 0x8AB7, 0x63E1, 0x88AC, 0x63E3, 0x9D85, 0x63E9, 0x9D82, + 0x63EE, 0x8AF6, 0x63F4, 0x8987, 0x63F5, 0xFAC9, 0x63F6, 0x9D88, 0x63FA, 0x9768, 0x6406, 0x9D8C, 0x640D, 0x91B9, 0x640F, 0x9D93, + 0x6413, 0x9D8D, 0x6416, 0x9D8A, 0x6417, 0x9D91, 0x641C, 0x9D72, 0x6426, 0x9D8E, 0x6428, 0x9D92, 0x642C, 0x94C0, 0x642D, 0x938B, + 0x6434, 0x9D8B, 0x6436, 0x9D8F, 0x643A, 0x8C67, 0x643E, 0x8DEF, 0x6442, 0x90DB, 0x644E, 0x9D97, 0x6458, 0x9345, 0x6460, 0xFACA, + 0x6467, 0x9D94, 0x6469, 0x9680, 0x646F, 0x9D95, 0x6476, 0x9D96, 0x6478, 0x96CC, 0x647A, 0x90A0, 0x6483, 0x8C82, 0x6488, 0x9D9D, + 0x6492, 0x8E54, 0x6493, 0x9D9A, 0x6495, 0x9D99, 0x649A, 0x9451, 0x649D, 0xFACB, 0x649E, 0x93B3, 0x64A4, 0x9350, 0x64A5, 0x9D9B, + 0x64A9, 0x9D9C, 0x64AB, 0x958F, 0x64AD, 0x9464, 0x64AE, 0x8E42, 0x64B0, 0x90EF, 0x64B2, 0x966F, 0x64B9, 0x8A68, 0x64BB, 0x9DA3, + 0x64BC, 0x9D9E, 0x64C1, 0x9769, 0x64C2, 0x9DA5, 0x64C5, 0x9DA1, 0x64C7, 0x9DA2, 0x64CD, 0x9180, 0x64CE, 0xFACC, 0x64D2, 0x9DA0, + 0x64D4, 0x9D5E, 0x64D8, 0x9DA4, 0x64DA, 0x9D9F, 0x64E0, 0x9DA9, 0x64E1, 0x9DAA, 0x64E2, 0x9346, 0x64E3, 0x9DAC, 0x64E6, 0x8E43, + 0x64E7, 0x9DA7, 0x64EC, 0x8B5B, 0x64EF, 0x9DAD, 0x64F1, 0x9DA6, 0x64F2, 0x9DB1, 0x64F4, 0x9DB0, 0x64F6, 0x9DAF, 0x64FA, 0x9DB2, + 0x64FD, 0x9DB4, 0x64FE, 0x8FEF, 0x6500, 0x9DB3, 0x6505, 0x9DB7, 0x6518, 0x9DB5, 0x651C, 0x9DB6, 0x651D, 0x9D90, 0x6523, 0x9DB9, + 0x6524, 0x9DB8, 0x652A, 0x9D98, 0x652B, 0x9DBA, 0x652C, 0x9DAE, 0x652F, 0x8E78, 0x6534, 0x9DBB, 0x6535, 0x9DBC, 0x6536, 0x9DBE, + 0x6537, 0x9DBD, 0x6538, 0x9DBF, 0x6539, 0x89FC, 0x653B, 0x8D55, 0x653E, 0x95FA, 0x653F, 0x90AD, 0x6545, 0x8CCC, 0x6548, 0x9DC1, + 0x654D, 0x9DC4, 0x654E, 0xFACD, 0x654F, 0x9571, 0x6551, 0x8B7E, 0x6555, 0x9DC3, 0x6556, 0x9DC2, 0x6557, 0x9473, 0x6558, 0x9DC5, + 0x6559, 0x8BB3, 0x655D, 0x9DC7, 0x655E, 0x9DC6, 0x6562, 0x8AB8, 0x6563, 0x8E55, 0x6566, 0x93D6, 0x656C, 0x8C68, 0x6570, 0x9094, + 0x6572, 0x9DC8, 0x6574, 0x90AE, 0x6575, 0x9347, 0x6577, 0x957E, 0x6578, 0x9DC9, 0x6582, 0x9DCA, 0x6583, 0x9DCB, 0x6587, 0x95B6, + 0x6588, 0x9B7C, 0x6589, 0x90C4, 0x658C, 0x956B, 0x658E, 0x8DD6, 0x6590, 0x94E3, 0x6591, 0x94C1, 0x6597, 0x936C, 0x6599, 0x97BF, + 0x659B, 0x9DCD, 0x659C, 0x8ECE, 0x659F, 0x9DCE, 0x65A1, 0x88B4, 0x65A4, 0x8BD2, 0x65A5, 0x90CB, 0x65A7, 0x9580, 0x65AB, 0x9DCF, + 0x65AC, 0x8E61, 0x65AD, 0x9266, 0x65AF, 0x8E7A, 0x65B0, 0x9056, 0x65B7, 0x9DD0, 0x65B9, 0x95FB, 0x65BC, 0x8997, 0x65BD, 0x8E7B, + 0x65C1, 0x9DD3, 0x65C3, 0x9DD1, 0x65C4, 0x9DD4, 0x65C5, 0x97B7, 0x65C6, 0x9DD2, 0x65CB, 0x90F9, 0x65CC, 0x9DD5, 0x65CF, 0x91B0, + 0x65D2, 0x9DD6, 0x65D7, 0x8AF8, 0x65D9, 0x9DD8, 0x65DB, 0x9DD7, 0x65E0, 0x9DD9, 0x65E1, 0x9DDA, 0x65E2, 0x8AF9, 0x65E5, 0x93FA, + 0x65E6, 0x9255, 0x65E7, 0x8B8C, 0x65E8, 0x8E7C, 0x65E9, 0x9181, 0x65EC, 0x8F7B, 0x65ED, 0x88AE, 0x65F1, 0x9DDB, 0x65FA, 0x89A0, + 0x65FB, 0x9DDF, 0x6600, 0xFACE, 0x6602, 0x8D56, 0x6603, 0x9DDE, 0x6606, 0x8DA9, 0x6607, 0x8FB8, 0x6609, 0xFAD1, 0x660A, 0x9DDD, + 0x660C, 0x8FB9, 0x660E, 0x96BE, 0x660F, 0x8DA8, 0x6613, 0x88D5, 0x6614, 0x90CC, 0x6615, 0xFACF, 0x661C, 0x9DE4, 0x661E, 0xFAD3, + 0x661F, 0x90AF, 0x6620, 0x8966, 0x6624, 0xFAD4, 0x6625, 0x8F74, 0x6627, 0x9686, 0x6628, 0x8DF0, 0x662D, 0x8FBA, 0x662E, 0xFAD2, + 0x662F, 0x90A5, 0x6631, 0xFA63, 0x6634, 0x9DE3, 0x6635, 0x9DE1, 0x6636, 0x9DE2, 0x663B, 0xFAD0, 0x663C, 0x928B, 0x663F, 0x9E45, + 0x6641, 0x9DE8, 0x6642, 0x8E9E, 0x6643, 0x8D57, 0x6644, 0x9DE6, 0x6649, 0x9DE7, 0x664B, 0x9057, 0x664F, 0x9DE5, 0x6652, 0x8E4E, + 0x6657, 0xFAD6, 0x6659, 0xFAD7, 0x665D, 0x9DEA, 0x665E, 0x9DE9, 0x665F, 0x9DEE, 0x6662, 0x9DEF, 0x6664, 0x9DEB, 0x6665, 0xFAD5, + 0x6666, 0x8A41, 0x6667, 0x9DEC, 0x6668, 0x9DED, 0x6669, 0x94D3, 0x666E, 0x9581, 0x666F, 0x8C69, 0x6670, 0x9DF0, 0x6673, 0xFAD9, + 0x6674, 0x90B0, 0x6676, 0x8FBB, 0x667A, 0x9271, 0x6681, 0x8BC5, 0x6683, 0x9DF1, 0x6684, 0x9DF5, 0x6687, 0x89C9, 0x6688, 0x9DF2, + 0x6689, 0x9DF4, 0x668E, 0x9DF3, 0x6691, 0x8F8B, 0x6696, 0x9267, 0x6697, 0x88C3, 0x6698, 0x9DF6, 0x6699, 0xFADA, 0x669D, 0x9DF7, + 0x66A0, 0xFADB, 0x66A2, 0x92A8, 0x66A6, 0x97EF, 0x66AB, 0x8E62, 0x66AE, 0x95E9, 0x66B2, 0xFADC, 0x66B4, 0x965C, 0x66B8, 0x9E41, + 0x66B9, 0x9DF9, 0x66BC, 0x9DFC, 0x66BE, 0x9DFB, 0x66BF, 0xFADD, 0x66C1, 0x9DF8, 0x66C4, 0x9E40, 0x66C7, 0x93DC, 0x66C9, 0x9DFA, + 0x66D6, 0x9E42, 0x66D9, 0x8F8C, 0x66DA, 0x9E43, 0x66DC, 0x976A, 0x66DD, 0x9498, 0x66E0, 0x9E44, 0x66E6, 0x9E46, 0x66E9, 0x9E47, + 0x66F0, 0x9E48, 0x66F2, 0x8BC8, 0x66F3, 0x8967, 0x66F4, 0x8D58, 0x66F5, 0x9E49, 0x66F7, 0x9E4A, 0x66F8, 0x8F91, 0x66F9, 0x9182, + 0x66FA, 0xFADE, 0x66FB, 0xFA66, 0x66FC, 0x99D6, 0x66FD, 0x915D, 0x66FE, 0x915C, 0x66FF, 0x91D6, 0x6700, 0x8DC5, 0x6703, 0x98F0, + 0x6708, 0x8C8E, 0x6709, 0x974C, 0x670B, 0x95FC, 0x670D, 0x959E, 0x670E, 0xFADF, 0x670F, 0x9E4B, 0x6714, 0x8DF1, 0x6715, 0x92BD, + 0x6716, 0x9E4C, 0x6717, 0x984E, 0x671B, 0x965D, 0x671D, 0x92A9, 0x671E, 0x9E4D, 0x671F, 0x8AFA, 0x6726, 0x9E4E, 0x6727, 0x9E4F, + 0x6728, 0x96D8, 0x672A, 0x96A2, 0x672B, 0x9696, 0x672C, 0x967B, 0x672D, 0x8E44, 0x672E, 0x9E51, 0x6731, 0x8EE9, 0x6734, 0x9670, + 0x6736, 0x9E53, 0x6737, 0x9E56, 0x6738, 0x9E55, 0x673A, 0x8AF7, 0x673D, 0x8B80, 0x673F, 0x9E52, 0x6741, 0x9E54, 0x6746, 0x9E57, + 0x6749, 0x9099, 0x674E, 0x979B, 0x674F, 0x88C7, 0x6750, 0x8DDE, 0x6751, 0x91BA, 0x6753, 0x8EDB, 0x6756, 0x8FF1, 0x6759, 0x9E5A, + 0x675C, 0x936D, 0x675E, 0x9E58, 0x675F, 0x91A9, 0x6760, 0x9E59, 0x6761, 0x8FF0, 0x6762, 0x96DB, 0x6763, 0x9E5B, 0x6764, 0x9E5C, + 0x6765, 0x9788, 0x6766, 0xFAE1, 0x676A, 0x9E61, 0x676D, 0x8D59, 0x676F, 0x9474, 0x6770, 0x9E5E, 0x6771, 0x938C, 0x6772, 0x9DDC, + 0x6773, 0x9DE0, 0x6775, 0x8B6E, 0x6777, 0x9466, 0x677C, 0x9E60, 0x677E, 0x8FBC, 0x677F, 0x94C2, 0x6785, 0x9E66, 0x6787, 0x94F8, + 0x6789, 0x9E5D, 0x678B, 0x9E63, 0x678C, 0x9E62, 0x6790, 0x90CD, 0x6795, 0x968D, 0x6797, 0x97D1, 0x679A, 0x9687, 0x679C, 0x89CA, + 0x679D, 0x8E7D, 0x67A0, 0x9867, 0x67A1, 0x9E65, 0x67A2, 0x9095, 0x67A6, 0x9E64, 0x67A9, 0x9E5F, 0x67AF, 0x8CCD, 0x67B3, 0x9E6B, + 0x67B4, 0x9E69, 0x67B6, 0x89CB, 0x67B7, 0x9E67, 0x67B8, 0x9E6D, 0x67B9, 0x9E73, 0x67BB, 0xFAE2, 0x67C0, 0xFAE4, 0x67C1, 0x91C6, + 0x67C4, 0x95BF, 0x67C6, 0x9E75, 0x67CA, 0x9541, 0x67CE, 0x9E74, 0x67CF, 0x9490, 0x67D0, 0x965E, 0x67D1, 0x8AB9, 0x67D3, 0x90F5, + 0x67D4, 0x8F5F, 0x67D8, 0x92D1, 0x67DA, 0x974D, 0x67DD, 0x9E70, 0x67DE, 0x9E6F, 0x67E2, 0x9E71, 0x67E4, 0x9E6E, 0x67E7, 0x9E76, + 0x67E9, 0x9E6C, 0x67EC, 0x9E6A, 0x67EE, 0x9E72, 0x67EF, 0x9E68, 0x67F1, 0x928C, 0x67F3, 0x96F6, 0x67F4, 0x8EC4, 0x67F5, 0x8DF2, + 0x67FB, 0x8DB8, 0x67FE, 0x968F, 0x67FF, 0x8A60, 0x6801, 0xFAE5, 0x6802, 0x92CC, 0x6803, 0x93C8, 0x6804, 0x8968, 0x6813, 0x90F0, + 0x6816, 0x90B2, 0x6817, 0x8C49, 0x681E, 0x9E78, 0x6821, 0x8D5A, 0x6822, 0x8A9C, 0x6829, 0x9E7A, 0x682A, 0x8A94, 0x682B, 0x9E81, + 0x6832, 0x9E7D, 0x6834, 0x90F1, 0x6838, 0x8A6A, 0x6839, 0x8DAA, 0x683C, 0x8A69, 0x683D, 0x8DCD, 0x6840, 0x9E7B, 0x6841, 0x8C85, + 0x6842, 0x8C6A, 0x6843, 0x938D, 0x6844, 0xFAE6, 0x6846, 0x9E79, 0x6848, 0x88C4, 0x684D, 0x9E7C, 0x684E, 0x9E7E, 0x6850, 0x8BCB, + 0x6851, 0x8C4B, 0x6852, 0xFAE3, 0x6853, 0x8ABA, 0x6854, 0x8B6A, 0x6859, 0x9E82, 0x685C, 0x8DF7, 0x685D, 0x9691, 0x685F, 0x8E56, + 0x6863, 0x9E83, 0x6867, 0x954F, 0x6874, 0x9E8F, 0x6876, 0x89B1, 0x6877, 0x9E84, 0x687E, 0x9E95, 0x687F, 0x9E85, 0x6881, 0x97C0, + 0x6883, 0x9E8C, 0x6885, 0x947E, 0x688D, 0x9E94, 0x688F, 0x9E87, 0x6893, 0x88B2, 0x6894, 0x9E89, 0x6897, 0x8D5B, 0x689B, 0x9E8B, + 0x689D, 0x9E8A, 0x689F, 0x9E86, 0x68A0, 0x9E91, 0x68A2, 0x8FBD, 0x68A6, 0x9AEB, 0x68A7, 0x8CE6, 0x68A8, 0x979C, 0x68AD, 0x9E88, + 0x68AF, 0x92F2, 0x68B0, 0x8A42, 0x68B1, 0x8DAB, 0x68B3, 0x9E80, 0x68B5, 0x9E90, 0x68B6, 0x8A81, 0x68B9, 0x9E8E, 0x68BA, 0x9E92, + 0x68BC, 0x938E, 0x68C4, 0x8AFC, 0x68C6, 0x9EB0, 0x68C8, 0xFA64, 0x68C9, 0x96C7, 0x68CA, 0x9E97, 0x68CB, 0x8AFB, 0x68CD, 0x9E9E, + 0x68CF, 0xFAE7, 0x68D2, 0x965F, 0x68D4, 0x9E9F, 0x68D5, 0x9EA1, 0x68D7, 0x9EA5, 0x68D8, 0x9E99, 0x68DA, 0x9249, 0x68DF, 0x938F, + 0x68E0, 0x9EA9, 0x68E1, 0x9E9C, 0x68E3, 0x9EA6, 0x68E7, 0x9EA0, 0x68EE, 0x9058, 0x68EF, 0x9EAA, 0x68F2, 0x90B1, 0x68F9, 0x9EA8, + 0x68FA, 0x8ABB, 0x6900, 0x986F, 0x6901, 0x9E96, 0x6904, 0x9EA4, 0x6905, 0x88D6, 0x6908, 0x9E98, 0x690B, 0x96B8, 0x690C, 0x9E9D, + 0x690D, 0x9041, 0x690E, 0x92C5, 0x690F, 0x9E93, 0x6912, 0x9EA3, 0x6919, 0x909A, 0x691A, 0x9EAD, 0x691B, 0x8A91, 0x691C, 0x8C9F, + 0x6921, 0x9EAF, 0x6922, 0x9E9A, 0x6923, 0x9EAE, 0x6925, 0x9EA7, 0x6926, 0x9E9B, 0x6928, 0x9EAB, 0x692A, 0x9EAC, 0x6930, 0x9EBD, + 0x6934, 0x93CC, 0x6936, 0x9EA2, 0x6939, 0x9EB9, 0x693D, 0x9EBB, 0x693F, 0x92D6, 0x694A, 0x976B, 0x6953, 0x9596, 0x6954, 0x9EB6, + 0x6955, 0x91C8, 0x6959, 0x9EBC, 0x695A, 0x915E, 0x695C, 0x9EB3, 0x695D, 0x9EC0, 0x695E, 0x9EBF, 0x6960, 0x93ED, 0x6961, 0x9EBE, + 0x6962, 0x93E8, 0x6968, 0xFAE9, 0x696A, 0x9EC2, 0x696B, 0x9EB5, 0x696D, 0x8BC6, 0x696E, 0x9EB8, 0x696F, 0x8F7C, 0x6973, 0x9480, + 0x6974, 0x9EBA, 0x6975, 0x8BC9, 0x6977, 0x9EB2, 0x6978, 0x9EB4, 0x6979, 0x9EB1, 0x697C, 0x984F, 0x697D, 0x8A79, 0x697E, 0x9EB7, + 0x6981, 0x9EC1, 0x6982, 0x8A54, 0x698A, 0x8DE5, 0x698E, 0x897C, 0x6991, 0x9ED2, 0x6994, 0x9850, 0x6995, 0x9ED5, 0x6998, 0xFAEB, + 0x699B, 0x9059, 0x699C, 0x9ED4, 0x69A0, 0x9ED3, 0x69A7, 0x9ED0, 0x69AE, 0x9EC4, 0x69B1, 0x9EE1, 0x69B2, 0x9EC3, 0x69B4, 0x9ED6, + 0x69BB, 0x9ECE, 0x69BE, 0x9EC9, 0x69BF, 0x9EC6, 0x69C1, 0x9EC7, 0x69C3, 0x9ECF, 0x69C7, 0xEAA0, 0x69CA, 0x9ECC, 0x69CB, 0x8D5C, + 0x69CC, 0x92C6, 0x69CD, 0x9184, 0x69CE, 0x9ECA, 0x69D0, 0x9EC5, 0x69D3, 0x9EC8, 0x69D8, 0x976C, 0x69D9, 0x968A, 0x69DD, 0x9ECD, + 0x69DE, 0x9ED7, 0x69E2, 0xFAEC, 0x69E7, 0x9EDF, 0x69E8, 0x9ED8, 0x69EB, 0x9EE5, 0x69ED, 0x9EE3, 0x69F2, 0x9EDE, 0x69F9, 0x9EDD, + 0x69FB, 0x92CE, 0x69FD, 0x9185, 0x69FF, 0x9EDB, 0x6A02, 0x9ED9, 0x6A05, 0x9EE0, 0x6A0A, 0x9EE6, 0x6A0B, 0x94F3, 0x6A0C, 0x9EEC, + 0x6A12, 0x9EE7, 0x6A13, 0x9EEA, 0x6A14, 0x9EE4, 0x6A17, 0x9294, 0x6A19, 0x9557, 0x6A1B, 0x9EDA, 0x6A1E, 0x9EE2, 0x6A1F, 0x8FBE, + 0x6A21, 0x96CD, 0x6A22, 0x9EF6, 0x6A23, 0x9EE9, 0x6A29, 0x8CA0, 0x6A2A, 0x89A1, 0x6A2B, 0x8A7E, 0x6A2E, 0x9ED1, 0x6A30, 0xFAED, + 0x6A35, 0x8FBF, 0x6A36, 0x9EEE, 0x6A38, 0x9EF5, 0x6A39, 0x8EF7, 0x6A3A, 0x8A92, 0x6A3D, 0x924D, 0x6A44, 0x9EEB, 0x6A46, 0xFAEF, + 0x6A47, 0x9EF0, 0x6A48, 0x9EF4, 0x6A4B, 0x8BB4, 0x6A58, 0x8B6B, 0x6A59, 0x9EF2, 0x6A5F, 0x8B40, 0x6A61, 0x93C9, 0x6A62, 0x9EF1, + 0x6A66, 0x9EF3, 0x6A6B, 0xFAEE, 0x6A72, 0x9EED, 0x6A73, 0xFAF0, 0x6A78, 0x9EEF, 0x6A7E, 0xFAF1, 0x6A7F, 0x8A80, 0x6A80, 0x9268, + 0x6A84, 0x9EFA, 0x6A8D, 0x9EF8, 0x6A8E, 0x8CE7, 0x6A90, 0x9EF7, 0x6A97, 0x9F40, 0x6A9C, 0x9E77, 0x6AA0, 0x9EF9, 0x6AA2, 0x9EFB, + 0x6AA3, 0x9EFC, 0x6AAA, 0x9F4B, 0x6AAC, 0x9F47, 0x6AAE, 0x9E8D, 0x6AB3, 0x9F46, 0x6AB8, 0x9F45, 0x6ABB, 0x9F42, 0x6AC1, 0x9EE8, + 0x6AC2, 0x9F44, 0x6AC3, 0x9F43, 0x6AD1, 0x9F49, 0x6AD3, 0x9845, 0x6ADA, 0x9F4C, 0x6ADB, 0x8BF9, 0x6ADE, 0x9F48, 0x6ADF, 0x9F4A, + 0x6AE2, 0xFAF2, 0x6AE4, 0xFAF3, 0x6AE8, 0x94A5, 0x6AEA, 0x9F4D, 0x6AFA, 0x9F51, 0x6AFB, 0x9F4E, 0x6B04, 0x9793, 0x6B05, 0x9F4F, + 0x6B0A, 0x9EDC, 0x6B12, 0x9F52, 0x6B16, 0x9F53, 0x6B1D, 0x8954, 0x6B1F, 0x9F55, 0x6B20, 0x8C87, 0x6B21, 0x8E9F, 0x6B23, 0x8BD3, + 0x6B27, 0x89A2, 0x6B32, 0x977E, 0x6B37, 0x9F57, 0x6B38, 0x9F56, 0x6B39, 0x9F59, 0x6B3A, 0x8B5C, 0x6B3D, 0x8BD4, 0x6B3E, 0x8ABC, + 0x6B43, 0x9F5C, 0x6B47, 0x9F5B, 0x6B49, 0x9F5D, 0x6B4C, 0x89CC, 0x6B4E, 0x9256, 0x6B50, 0x9F5E, 0x6B53, 0x8ABD, 0x6B54, 0x9F60, + 0x6B59, 0x9F5F, 0x6B5B, 0x9F61, 0x6B5F, 0x9F62, 0x6B61, 0x9F63, 0x6B62, 0x8E7E, 0x6B63, 0x90B3, 0x6B64, 0x8D9F, 0x6B66, 0x9590, + 0x6B69, 0x95E0, 0x6B6A, 0x9863, 0x6B6F, 0x8E95, 0x6B73, 0x8DCE, 0x6B74, 0x97F0, 0x6B78, 0x9F64, 0x6B79, 0x9F65, 0x6B7B, 0x8E80, + 0x6B7F, 0x9F66, 0x6B80, 0x9F67, 0x6B83, 0x9F69, 0x6B84, 0x9F68, 0x6B86, 0x9677, 0x6B89, 0x8F7D, 0x6B8A, 0x8EEA, 0x6B8B, 0x8E63, + 0x6B8D, 0x9F6A, 0x6B95, 0x9F6C, 0x6B96, 0x9042, 0x6B98, 0x9F6B, 0x6B9E, 0x9F6D, 0x6BA4, 0x9F6E, 0x6BAA, 0x9F6F, 0x6BAB, 0x9F70, + 0x6BAF, 0x9F71, 0x6BB1, 0x9F73, 0x6BB2, 0x9F72, 0x6BB3, 0x9F74, 0x6BB4, 0x89A3, 0x6BB5, 0x9269, 0x6BB7, 0x9F75, 0x6BBA, 0x8E45, + 0x6BBB, 0x8A6B, 0x6BBC, 0x9F76, 0x6BBF, 0x9361, 0x6BC0, 0x9ACA, 0x6BC5, 0x8B42, 0x6BC6, 0x9F77, 0x6BCB, 0x9F78, 0x6BCD, 0x95EA, + 0x6BCE, 0x9688, 0x6BD2, 0x93C5, 0x6BD3, 0x9F79, 0x6BD4, 0x94E4, 0x6BD6, 0xFAF4, 0x6BD8, 0x94F9, 0x6BDB, 0x96D1, 0x6BDF, 0x9F7A, + 0x6BEB, 0x9F7C, 0x6BEC, 0x9F7B, 0x6BEF, 0x9F7E, 0x6BF3, 0x9F7D, 0x6C08, 0x9F81, 0x6C0F, 0x8E81, 0x6C11, 0x96AF, 0x6C13, 0x9F82, + 0x6C14, 0x9F83, 0x6C17, 0x8B43, 0x6C1B, 0x9F84, 0x6C23, 0x9F86, 0x6C24, 0x9F85, 0x6C34, 0x9085, 0x6C37, 0x9558, 0x6C38, 0x8969, + 0x6C3E, 0x94C3, 0x6C3F, 0xFAF5, 0x6C40, 0x92F3, 0x6C41, 0x8F60, 0x6C42, 0x8B81, 0x6C4E, 0x94C4, 0x6C50, 0x8EAC, 0x6C55, 0x9F88, + 0x6C57, 0x8ABE, 0x6C5A, 0x8998, 0x6C5C, 0xFAF6, 0x6C5D, 0x93F0, 0x6C5E, 0x9F87, 0x6C5F, 0x8D5D, 0x6C60, 0x9272, 0x6C62, 0x9F89, + 0x6C68, 0x9F91, 0x6C6A, 0x9F8A, 0x6C6F, 0xFAF8, 0x6C70, 0x91BF, 0x6C72, 0x8B82, 0x6C73, 0x9F92, 0x6C7A, 0x8C88, 0x6C7D, 0x8B44, + 0x6C7E, 0x9F90, 0x6C81, 0x9F8E, 0x6C82, 0x9F8B, 0x6C83, 0x9780, 0x6C86, 0xFAF7, 0x6C88, 0x92BE, 0x6C8C, 0x93D7, 0x6C8D, 0x9F8C, + 0x6C90, 0x9F94, 0x6C92, 0x9F93, 0x6C93, 0x8C42, 0x6C96, 0x89AB, 0x6C99, 0x8DB9, 0x6C9A, 0x9F8D, 0x6C9B, 0x9F8F, 0x6CA1, 0x9676, + 0x6CA2, 0x91F2, 0x6CAB, 0x9697, 0x6CAE, 0x9F9C, 0x6CB1, 0x9F9D, 0x6CB3, 0x89CD, 0x6CB8, 0x95A6, 0x6CB9, 0x96FB, 0x6CBA, 0x9F9F, + 0x6CBB, 0x8EA1, 0x6CBC, 0x8FC0, 0x6CBD, 0x9F98, 0x6CBE, 0x9F9E, 0x6CBF, 0x8988, 0x6CC1, 0x8BB5, 0x6CC4, 0x9F95, 0x6CC5, 0x9F9A, + 0x6CC9, 0x90F2, 0x6CCA, 0x9491, 0x6CCC, 0x94E5, 0x6CD3, 0x9F97, 0x6CD5, 0x9640, 0x6CD7, 0x9F99, 0x6CD9, 0x9FA2, 0x6CDA, 0xFAF9, + 0x6CDB, 0x9FA0, 0x6CDD, 0x9F9B, 0x6CE1, 0x9641, 0x6CE2, 0x9467, 0x6CE3, 0x8B83, 0x6CE5, 0x9344, 0x6CE8, 0x928D, 0x6CEA, 0x9FA3, + 0x6CEF, 0x9FA1, 0x6CF0, 0x91D7, 0x6CF1, 0x9F96, 0x6CF3, 0x896A, 0x6D04, 0xFAFA, 0x6D0B, 0x976D, 0x6D0C, 0x9FAE, 0x6D12, 0x9FAD, + 0x6D17, 0x90F4, 0x6D19, 0x9FAA, 0x6D1B, 0x978C, 0x6D1E, 0x93B4, 0x6D1F, 0x9FA4, 0x6D25, 0x92C3, 0x6D29, 0x896B, 0x6D2A, 0x8D5E, + 0x6D2B, 0x9FA7, 0x6D32, 0x8F46, 0x6D33, 0x9FAC, 0x6D35, 0x9FAB, 0x6D36, 0x9FA6, 0x6D38, 0x9FA9, 0x6D3B, 0x8A88, 0x6D3D, 0x9FA8, + 0x6D3E, 0x9468, 0x6D41, 0x97AC, 0x6D44, 0x8FF2, 0x6D45, 0x90F3, 0x6D59, 0x9FB4, 0x6D5A, 0x9FB2, 0x6D5C, 0x956C, 0x6D63, 0x9FAF, + 0x6D64, 0x9FB1, 0x6D66, 0x8959, 0x6D69, 0x8D5F, 0x6D6A, 0x9851, 0x6D6C, 0x8A5C, 0x6D6E, 0x9582, 0x6D6F, 0xFAFC, 0x6D74, 0x9781, + 0x6D77, 0x8A43, 0x6D78, 0x905A, 0x6D79, 0x9FB3, 0x6D85, 0x9FB8, 0x6D87, 0xFAFB, 0x6D88, 0x8FC1, 0x6D8C, 0x974F, 0x6D8E, 0x9FB5, + 0x6D93, 0x9FB0, 0x6D95, 0x9FB6, 0x6D96, 0xFB40, 0x6D99, 0x97DC, 0x6D9B, 0x9393, 0x6D9C, 0x93C0, 0x6DAC, 0xFB41, 0x6DAF, 0x8A55, + 0x6DB2, 0x8974, 0x6DB5, 0x9FBC, 0x6DB8, 0x9FBF, 0x6DBC, 0x97C1, 0x6DC0, 0x9784, 0x6DC5, 0x9FC6, 0x6DC6, 0x9FC0, 0x6DC7, 0x9FBD, + 0x6DCB, 0x97D2, 0x6DCC, 0x9FC3, 0x6DCF, 0xFB42, 0x6DD1, 0x8F69, 0x6DD2, 0x9FC5, 0x6DD5, 0x9FCA, 0x6DD8, 0x9391, 0x6DD9, 0x9FC8, + 0x6DDE, 0x9FC2, 0x6DE1, 0x9257, 0x6DE4, 0x9FC9, 0x6DE6, 0x9FBE, 0x6DE8, 0x9FC4, 0x6DEA, 0x9FCB, 0x6DEB, 0x88FA, 0x6DEC, 0x9FC1, + 0x6DEE, 0x9FCC, 0x6DF1, 0x905B, 0x6DF2, 0xFB44, 0x6DF3, 0x8F7E, 0x6DF5, 0x95A3, 0x6DF7, 0x8DAC, 0x6DF8, 0xFB43, 0x6DF9, 0x9FB9, + 0x6DFA, 0x9FC7, 0x6DFB, 0x9359, 0x6DFC, 0xFB45, 0x6E05, 0x90B4, 0x6E07, 0x8A89, 0x6E08, 0x8DCF, 0x6E09, 0x8FC2, 0x6E0A, 0x9FBB, + 0x6E0B, 0x8F61, 0x6E13, 0x8C6B, 0x6E15, 0x9FBA, 0x6E19, 0x9FD0, 0x6E1A, 0x8F8D, 0x6E1B, 0x8CB8, 0x6E1D, 0x9FDF, 0x6E1F, 0x9FD9, + 0x6E20, 0x8B94, 0x6E21, 0x936E, 0x6E23, 0x9FD4, 0x6E24, 0x9FDD, 0x6E25, 0x88AD, 0x6E26, 0x8951, 0x6E27, 0xFB48, 0x6E29, 0x89B7, + 0x6E2B, 0x9FD6, 0x6E2C, 0x91AA, 0x6E2D, 0x9FCD, 0x6E2E, 0x9FCF, 0x6E2F, 0x8D60, 0x6E38, 0x9FE0, 0x6E39, 0xFB46, 0x6E3A, 0x9FDB, + 0x6E3C, 0xFB49, 0x6E3E, 0x9FD3, 0x6E43, 0x9FDA, 0x6E4A, 0x96A9, 0x6E4D, 0x9FD8, 0x6E4E, 0x9FDC, 0x6E56, 0x8CCE, 0x6E58, 0x8FC3, + 0x6E5B, 0x9258, 0x6E5C, 0xFB47, 0x6E5F, 0x9FD2, 0x6E67, 0x974E, 0x6E6B, 0x9FD5, 0x6E6E, 0x9FCE, 0x6E6F, 0x9392, 0x6E72, 0x9FD1, + 0x6E76, 0x9FD7, 0x6E7E, 0x9870, 0x6E7F, 0x8EBC, 0x6E80, 0x969E, 0x6E82, 0x9FE1, 0x6E8C, 0x94AC, 0x6E8F, 0x9FED, 0x6E90, 0x8CB9, + 0x6E96, 0x8F80, 0x6E98, 0x9FE3, 0x6E9C, 0x97AD, 0x6E9D, 0x8D61, 0x6E9F, 0x9FF0, 0x6EA2, 0x88EC, 0x6EA5, 0x9FEE, 0x6EAA, 0x9FE2, + 0x6EAF, 0x9FE8, 0x6EB2, 0x9FEA, 0x6EB6, 0x976E, 0x6EB7, 0x9FE5, 0x6EBA, 0x934D, 0x6EBD, 0x9FE7, 0x6EBF, 0xFB4A, 0x6EC2, 0x9FEF, + 0x6EC4, 0x9FE9, 0x6EC5, 0x96C5, 0x6EC9, 0x9FE4, 0x6ECB, 0x8EA0, 0x6ECC, 0x9FFC, 0x6ED1, 0x8A8A, 0x6ED3, 0x9FE6, 0x6ED4, 0x9FEB, + 0x6ED5, 0x9FEC, 0x6EDD, 0x91EA, 0x6EDE, 0x91D8, 0x6EEC, 0x9FF4, 0x6EEF, 0x9FFA, 0x6EF2, 0x9FF8, 0x6EF4, 0x9348, 0x6EF7, 0xE042, + 0x6EF8, 0x9FF5, 0x6EFE, 0x9FF6, 0x6EFF, 0x9FDE, 0x6F01, 0x8B99, 0x6F02, 0x9559, 0x6F06, 0x8EBD, 0x6F09, 0x8D97, 0x6F0F, 0x9852, + 0x6F11, 0x9FF2, 0x6F13, 0xE041, 0x6F14, 0x8989, 0x6F15, 0x9186, 0x6F20, 0x9499, 0x6F22, 0x8ABF, 0x6F23, 0x97F8, 0x6F2B, 0x969F, + 0x6F2C, 0x92D0, 0x6F31, 0x9FF9, 0x6F32, 0x9FFB, 0x6F38, 0x9151, 0x6F3E, 0xE040, 0x6F3F, 0x9FF7, 0x6F41, 0x9FF1, 0x6F45, 0x8AC1, + 0x6F54, 0x8C89, 0x6F58, 0xE04E, 0x6F5B, 0xE049, 0x6F5C, 0x90F6, 0x6F5F, 0x8A83, 0x6F64, 0x8F81, 0x6F66, 0xE052, 0x6F6D, 0xE04B, + 0x6F6E, 0x92AA, 0x6F6F, 0xE048, 0x6F70, 0x92D7, 0x6F74, 0xE06B, 0x6F78, 0xE045, 0x6F7A, 0xE044, 0x6F7C, 0xE04D, 0x6F80, 0xE047, + 0x6F81, 0xE046, 0x6F82, 0xE04C, 0x6F84, 0x909F, 0x6F86, 0xE043, 0x6F88, 0xFB4B, 0x6F8E, 0xE04F, 0x6F91, 0xE050, 0x6F97, 0x8AC0, + 0x6FA1, 0xE055, 0x6FA3, 0xE054, 0x6FA4, 0xE056, 0x6FAA, 0xE059, 0x6FB1, 0x9362, 0x6FB3, 0xE053, 0x6FB5, 0xFB4C, 0x6FB9, 0xE057, + 0x6FC0, 0x8C83, 0x6FC1, 0x91F7, 0x6FC2, 0xE051, 0x6FC3, 0x945A, 0x6FC6, 0xE058, 0x6FD4, 0xE05D, 0x6FD5, 0xE05B, 0x6FD8, 0xE05E, + 0x6FDB, 0xE061, 0x6FDF, 0xE05A, 0x6FE0, 0x8D8A, 0x6FE1, 0x9447, 0x6FE4, 0x9FB7, 0x6FEB, 0x9794, 0x6FEC, 0xE05C, 0x6FEE, 0xE060, + 0x6FEF, 0x91F3, 0x6FF1, 0xE05F, 0x6FF3, 0xE04A, 0x6FF5, 0xFB4D, 0x6FF6, 0xE889, 0x6FFA, 0xE064, 0x6FFE, 0xE068, 0x7001, 0xE066, + 0x7005, 0xFB4E, 0x7007, 0xFB4F, 0x7009, 0xE062, 0x700B, 0xE063, 0x700F, 0xE067, 0x7011, 0xE065, 0x7015, 0x956D, 0x7018, 0xE06D, + 0x701A, 0xE06A, 0x701B, 0xE069, 0x701D, 0xE06C, 0x701E, 0x93D2, 0x701F, 0xE06E, 0x7026, 0x9295, 0x7027, 0x91EB, 0x7028, 0xFB50, + 0x702C, 0x90A3, 0x7030, 0xE06F, 0x7032, 0xE071, 0x703E, 0xE070, 0x704C, 0x9FF3, 0x7051, 0xE072, 0x7058, 0x93E5, 0x7063, 0xE073, + 0x706B, 0x89CE, 0x706F, 0x9394, 0x7070, 0x8A44, 0x7078, 0x8B84, 0x707C, 0x8EDC, 0x707D, 0x8DD0, 0x7085, 0xFB51, 0x7089, 0x9846, + 0x708A, 0x9086, 0x708E, 0x898A, 0x7092, 0xE075, 0x7099, 0xE074, 0x70AB, 0xFB52, 0x70AC, 0xE078, 0x70AD, 0x9259, 0x70AE, 0xE07B, + 0x70AF, 0xE076, 0x70B3, 0xE07A, 0x70B8, 0xE079, 0x70B9, 0x935F, 0x70BA, 0x88D7, 0x70BB, 0xFA62, 0x70C8, 0x97F3, 0x70CB, 0xE07D, + 0x70CF, 0x8947, 0x70D9, 0xE080, 0x70DD, 0xE07E, 0x70DF, 0xE07C, 0x70F1, 0xE077, 0x70F9, 0x9642, 0x70FD, 0xE082, 0x7104, 0xFB54, + 0x7109, 0xE081, 0x710F, 0xFB53, 0x7114, 0x898B, 0x7119, 0xE084, 0x711A, 0x95B0, 0x711C, 0xE083, 0x7121, 0x96B3, 0x7126, 0x8FC5, + 0x7136, 0x9152, 0x713C, 0x8FC4, 0x7146, 0xFB56, 0x7147, 0xFB57, 0x7149, 0x97F9, 0x714C, 0xE08A, 0x714E, 0x90F7, 0x7155, 0xE086, + 0x7156, 0xE08B, 0x7159, 0x898C, 0x715C, 0xFB55, 0x7162, 0xE089, 0x7164, 0x9481, 0x7165, 0xE085, 0x7166, 0xE088, 0x7167, 0x8FC6, + 0x7169, 0x94CF, 0x716C, 0xE08C, 0x716E, 0x8ECF, 0x717D, 0x90F8, 0x7184, 0xE08F, 0x7188, 0xE087, 0x718A, 0x8C46, 0x718F, 0xE08D, + 0x7194, 0x976F, 0x7195, 0xE090, 0x7199, 0xEAA4, 0x719F, 0x8F6E, 0x71A8, 0xE091, 0x71AC, 0xE092, 0x71B1, 0x944D, 0x71B9, 0xE094, + 0x71BE, 0xE095, 0x71C1, 0xFB59, 0x71C3, 0x9452, 0x71C8, 0x9395, 0x71C9, 0xE097, 0x71CE, 0xE099, 0x71D0, 0x97D3, 0x71D2, 0xE096, + 0x71D4, 0xE098, 0x71D5, 0x898D, 0x71D7, 0xE093, 0x71DF, 0x9A7A, 0x71E0, 0xE09A, 0x71E5, 0x9187, 0x71E6, 0x8E57, 0x71E7, 0xE09C, + 0x71EC, 0xE09B, 0x71ED, 0x9043, 0x71EE, 0x99D7, 0x71F5, 0xE09D, 0x71F9, 0xE09F, 0x71FB, 0xE08E, 0x71FC, 0xE09E, 0x71FE, 0xFB5A, + 0x71FF, 0xE0A0, 0x7206, 0x949A, 0x720D, 0xE0A1, 0x7210, 0xE0A2, 0x721B, 0xE0A3, 0x7228, 0xE0A4, 0x722A, 0x92DC, 0x722C, 0xE0A6, + 0x722D, 0xE0A5, 0x7230, 0xE0A7, 0x7232, 0xE0A8, 0x7235, 0x8EDD, 0x7236, 0x9583, 0x723A, 0x96EA, 0x723B, 0xE0A9, 0x723C, 0xE0AA, + 0x723D, 0x9175, 0x723E, 0x8EA2, 0x723F, 0xE0AB, 0x7240, 0xE0AC, 0x7246, 0xE0AD, 0x7247, 0x95D0, 0x7248, 0x94C5, 0x724B, 0xE0AE, + 0x724C, 0x9476, 0x7252, 0x92AB, 0x7258, 0xE0AF, 0x7259, 0x89E5, 0x725B, 0x8B8D, 0x725D, 0x96C4, 0x725F, 0x96B4, 0x7261, 0x89B2, + 0x7262, 0x9853, 0x7267, 0x9671, 0x7269, 0x95A8, 0x7272, 0x90B5, 0x7274, 0xE0B0, 0x7279, 0x93C1, 0x727D, 0x8CA1, 0x727E, 0xE0B1, + 0x7280, 0x8DD2, 0x7281, 0xE0B3, 0x7282, 0xE0B2, 0x7287, 0xE0B4, 0x7292, 0xE0B5, 0x7296, 0xE0B6, 0x72A0, 0x8B5D, 0x72A2, 0xE0B7, + 0x72A7, 0xE0B8, 0x72AC, 0x8CA2, 0x72AF, 0x94C6, 0x72B1, 0xFB5B, 0x72B2, 0xE0BA, 0x72B6, 0x8FF3, 0x72B9, 0xE0B9, 0x72BE, 0xFB5C, + 0x72C2, 0x8BB6, 0x72C3, 0xE0BB, 0x72C4, 0xE0BD, 0x72C6, 0xE0BC, 0x72CE, 0xE0BE, 0x72D0, 0x8CCF, 0x72D2, 0xE0BF, 0x72D7, 0x8BE7, + 0x72D9, 0x915F, 0x72DB, 0x8D9D, 0x72E0, 0xE0C1, 0x72E1, 0xE0C2, 0x72E2, 0xE0C0, 0x72E9, 0x8EEB, 0x72EC, 0x93C6, 0x72ED, 0x8BB7, + 0x72F7, 0xE0C4, 0x72F8, 0x924B, 0x72F9, 0xE0C3, 0x72FC, 0x9854, 0x72FD, 0x9482, 0x730A, 0xE0C7, 0x7316, 0xE0C9, 0x7317, 0xE0C6, + 0x731B, 0x96D2, 0x731C, 0xE0C8, 0x731D, 0xE0CA, 0x731F, 0x97C2, 0x7324, 0xFB5D, 0x7325, 0xE0CE, 0x7329, 0xE0CD, 0x732A, 0x9296, + 0x732B, 0x944C, 0x732E, 0x8CA3, 0x732F, 0xE0CC, 0x7334, 0xE0CB, 0x7336, 0x9750, 0x7337, 0x9751, 0x733E, 0xE0CF, 0x733F, 0x898E, + 0x7344, 0x8D96, 0x7345, 0x8E82, 0x734E, 0xE0D0, 0x734F, 0xE0D1, 0x7357, 0xE0D3, 0x7363, 0x8F62, 0x7368, 0xE0D5, 0x736A, 0xE0D4, + 0x7370, 0xE0D6, 0x7372, 0x8A6C, 0x7375, 0xE0D8, 0x7377, 0xFB5F, 0x7378, 0xE0D7, 0x737A, 0xE0DA, 0x737B, 0xE0D9, 0x7384, 0x8CBA, + 0x7387, 0x97A6, 0x7389, 0x8BCA, 0x738B, 0x89A4, 0x7396, 0x8BE8, 0x73A9, 0x8ADF, 0x73B2, 0x97E6, 0x73B3, 0xE0DC, 0x73BB, 0xE0DE, + 0x73BD, 0xFB60, 0x73C0, 0xE0DF, 0x73C2, 0x89CF, 0x73C8, 0xE0DB, 0x73C9, 0xFB61, 0x73CA, 0x8E58, 0x73CD, 0x92BF, 0x73CE, 0xE0DD, + 0x73D2, 0xFB64, 0x73D6, 0xFB62, 0x73DE, 0xE0E2, 0x73E0, 0x8EEC, 0x73E3, 0xFB63, 0x73E5, 0xE0E0, 0x73EA, 0x8C5D, 0x73ED, 0x94C7, + 0x73EE, 0xE0E1, 0x73F1, 0xE0FC, 0x73F5, 0xFB66, 0x73F8, 0xE0E7, 0x73FE, 0x8CBB, 0x7403, 0x8B85, 0x7405, 0xE0E4, 0x7406, 0x979D, + 0x7407, 0xFB65, 0x7409, 0x97AE, 0x7422, 0x91F4, 0x7425, 0xE0E6, 0x7426, 0xFB67, 0x7429, 0xFB69, 0x742A, 0xFB68, 0x742E, 0xFB6A, + 0x7432, 0xE0E8, 0x7433, 0x97D4, 0x7434, 0x8BD5, 0x7435, 0x94FA, 0x7436, 0x9469, 0x743A, 0xE0E9, 0x743F, 0xE0EB, 0x7441, 0xE0EE, + 0x7455, 0xE0EA, 0x7459, 0xE0ED, 0x745A, 0x8CE8, 0x745B, 0x896C, 0x745C, 0xE0EF, 0x745E, 0x9090, 0x745F, 0xE0EC, 0x7460, 0x97DA, + 0x7462, 0xFB6B, 0x7463, 0xE0F2, 0x7464, 0xEAA2, 0x7469, 0xE0F0, 0x746A, 0xE0F3, 0x746F, 0xE0E5, 0x7470, 0xE0F1, 0x7473, 0x8DBA, + 0x7476, 0xE0F4, 0x747E, 0xE0F5, 0x7483, 0x979E, 0x7489, 0xFB6C, 0x748B, 0xE0F6, 0x749E, 0xE0F7, 0x749F, 0xFB6D, 0x74A2, 0xE0E3, + 0x74A7, 0xE0F8, 0x74B0, 0x8AC2, 0x74BD, 0x8EA3, 0x74CA, 0xE0F9, 0x74CF, 0xE0FA, 0x74D4, 0xE0FB, 0x74DC, 0x895A, 0x74E0, 0xE140, + 0x74E2, 0x955A, 0x74E3, 0xE141, 0x74E6, 0x8AA2, 0x74E7, 0xE142, 0x74E9, 0xE143, 0x74EE, 0xE144, 0x74F0, 0xE146, 0x74F1, 0xE147, + 0x74F2, 0xE145, 0x74F6, 0x9572, 0x74F7, 0xE149, 0x74F8, 0xE148, 0x7501, 0xFB6E, 0x7503, 0xE14B, 0x7504, 0xE14A, 0x7505, 0xE14C, + 0x750C, 0xE14D, 0x750D, 0xE14F, 0x750E, 0xE14E, 0x7511, 0x8D99, 0x7513, 0xE151, 0x7515, 0xE150, 0x7518, 0x8AC3, 0x751A, 0x9072, + 0x751C, 0x935B, 0x751E, 0xE152, 0x751F, 0x90B6, 0x7523, 0x8E59, 0x7525, 0x8999, 0x7526, 0xE153, 0x7528, 0x9770, 0x752B, 0x95E1, + 0x752C, 0xE154, 0x752F, 0xFAA8, 0x7530, 0x9363, 0x7531, 0x9752, 0x7532, 0x8D62, 0x7533, 0x905C, 0x7537, 0x926A, 0x7538, 0x99B2, + 0x753A, 0x92AC, 0x753B, 0x89E6, 0x753C, 0xE155, 0x7544, 0xE156, 0x7546, 0xE15B, 0x7549, 0xE159, 0x754A, 0xE158, 0x754B, 0x9DC0, + 0x754C, 0x8A45, 0x754D, 0xE157, 0x754F, 0x88D8, 0x7551, 0x94A8, 0x7554, 0x94C8, 0x7559, 0x97AF, 0x755A, 0xE15C, 0x755B, 0xE15A, + 0x755C, 0x927B, 0x755D, 0x90A4, 0x7560, 0x94A9, 0x7562, 0x954C, 0x7564, 0xE15E, 0x7565, 0x97AA, 0x7566, 0x8C6C, 0x7567, 0xE15F, + 0x7569, 0xE15D, 0x756A, 0x94D4, 0x756B, 0xE160, 0x756D, 0xE161, 0x756F, 0xFB6F, 0x7570, 0x88D9, 0x7573, 0x8FF4, 0x7574, 0xE166, + 0x7576, 0xE163, 0x7577, 0x93EB, 0x7578, 0xE162, 0x757F, 0x8B45, 0x7582, 0xE169, 0x7586, 0xE164, 0x7587, 0xE165, 0x7589, 0xE168, + 0x758A, 0xE167, 0x758B, 0x9544, 0x758E, 0x9161, 0x758F, 0x9160, 0x7591, 0x8B5E, 0x7594, 0xE16A, 0x759A, 0xE16B, 0x759D, 0xE16C, + 0x75A3, 0xE16E, 0x75A5, 0xE16D, 0x75AB, 0x8975, 0x75B1, 0xE176, 0x75B2, 0x94E6, 0x75B3, 0xE170, 0x75B5, 0xE172, 0x75B8, 0xE174, + 0x75B9, 0x905D, 0x75BC, 0xE175, 0x75BD, 0xE173, 0x75BE, 0x8EBE, 0x75C2, 0xE16F, 0x75C3, 0xE171, 0x75C5, 0x9561, 0x75C7, 0x8FC7, + 0x75CA, 0xE178, 0x75CD, 0xE177, 0x75D2, 0xE179, 0x75D4, 0x8EA4, 0x75D5, 0x8DAD, 0x75D8, 0x9397, 0x75D9, 0xE17A, 0x75DB, 0x92C9, + 0x75DE, 0xE17C, 0x75E2, 0x979F, 0x75E3, 0xE17B, 0x75E9, 0x9189, 0x75F0, 0xE182, 0x75F2, 0xE184, 0x75F3, 0xE185, 0x75F4, 0x9273, + 0x75FA, 0xE183, 0x75FC, 0xE180, 0x75FE, 0xE17D, 0x75FF, 0xE17E, 0x7601, 0xE181, 0x7609, 0xE188, 0x760B, 0xE186, 0x760D, 0xE187, + 0x761F, 0xE189, 0x7620, 0xE18B, 0x7621, 0xE18C, 0x7622, 0xE18D, 0x7624, 0xE18E, 0x7627, 0xE18A, 0x7630, 0xE190, 0x7634, 0xE18F, + 0x763B, 0xE191, 0x7642, 0x97C3, 0x7646, 0xE194, 0x7647, 0xE192, 0x7648, 0xE193, 0x764C, 0x8AE0, 0x7652, 0x96FC, 0x7656, 0x95C8, + 0x7658, 0xE196, 0x765C, 0xE195, 0x7661, 0xE197, 0x7662, 0xE198, 0x7667, 0xE19C, 0x7668, 0xE199, 0x7669, 0xE19A, 0x766A, 0xE19B, + 0x766C, 0xE19D, 0x7670, 0xE19E, 0x7672, 0xE19F, 0x7676, 0xE1A0, 0x7678, 0xE1A1, 0x767A, 0x94AD, 0x767B, 0x936F, 0x767C, 0xE1A2, + 0x767D, 0x9492, 0x767E, 0x9553, 0x7680, 0xE1A3, 0x7682, 0xFB70, 0x7683, 0xE1A4, 0x7684, 0x9349, 0x7686, 0x8A46, 0x7687, 0x8D63, + 0x7688, 0xE1A5, 0x768B, 0xE1A6, 0x768E, 0xE1A7, 0x7690, 0x8E48, 0x7693, 0xE1A9, 0x7696, 0xE1A8, 0x7699, 0xE1AA, 0x769A, 0xE1AB, + 0x769B, 0xFB73, 0x769C, 0xFB71, 0x769E, 0xFB72, 0x76A6, 0xFB74, 0x76AE, 0x94E7, 0x76B0, 0xE1AC, 0x76B4, 0xE1AD, 0x76B7, 0xEA89, + 0x76B8, 0xE1AE, 0x76B9, 0xE1AF, 0x76BA, 0xE1B0, 0x76BF, 0x8E4D, 0x76C2, 0xE1B1, 0x76C3, 0x9475, 0x76C6, 0x967E, 0x76C8, 0x896D, + 0x76CA, 0x8976, 0x76CD, 0xE1B2, 0x76D2, 0xE1B4, 0x76D6, 0xE1B3, 0x76D7, 0x9390, 0x76DB, 0x90B7, 0x76DC, 0x9F58, 0x76DE, 0xE1B5, + 0x76DF, 0x96BF, 0x76E1, 0xE1B6, 0x76E3, 0x8AC4, 0x76E4, 0x94D5, 0x76E5, 0xE1B7, 0x76E7, 0xE1B8, 0x76EA, 0xE1B9, 0x76EE, 0x96DA, + 0x76F2, 0x96D3, 0x76F4, 0x92BC, 0x76F8, 0x918A, 0x76FB, 0xE1BB, 0x76FE, 0x8F82, 0x7701, 0x8FC8, 0x7704, 0xE1BE, 0x7707, 0xE1BD, + 0x7708, 0xE1BC, 0x7709, 0x94FB, 0x770B, 0x8AC5, 0x770C, 0x8CA7, 0x771B, 0xE1C4, 0x771E, 0xE1C1, 0x771F, 0x905E, 0x7720, 0x96B0, + 0x7724, 0xE1C0, 0x7725, 0xE1C2, 0x7726, 0xE1C3, 0x7729, 0xE1BF, 0x7737, 0xE1C5, 0x7738, 0xE1C6, 0x773A, 0x92AD, 0x773C, 0x8AE1, + 0x7740, 0x9285, 0x7746, 0xFB76, 0x7747, 0xE1C7, 0x775A, 0xE1C8, 0x775B, 0xE1CB, 0x7761, 0x9087, 0x7763, 0x93C2, 0x7765, 0xE1CC, + 0x7766, 0x9672, 0x7768, 0xE1C9, 0x776B, 0xE1CA, 0x7779, 0xE1CF, 0x777E, 0xE1CE, 0x777F, 0xE1CD, 0x778B, 0xE1D1, 0x778E, 0xE1D0, + 0x7791, 0xE1D2, 0x779E, 0xE1D4, 0x77A0, 0xE1D3, 0x77A5, 0x95CB, 0x77AC, 0x8F75, 0x77AD, 0x97C4, 0x77B0, 0xE1D5, 0x77B3, 0x93B5, + 0x77B6, 0xE1D6, 0x77B9, 0xE1D7, 0x77BB, 0xE1DB, 0x77BC, 0xE1D9, 0x77BD, 0xE1DA, 0x77BF, 0xE1D8, 0x77C7, 0xE1DC, 0x77CD, 0xE1DD, + 0x77D7, 0xE1DE, 0x77DA, 0xE1DF, 0x77DB, 0x96B5, 0x77DC, 0xE1E0, 0x77E2, 0x96EE, 0x77E3, 0xE1E1, 0x77E5, 0x926D, 0x77E7, 0x948A, + 0x77E9, 0x8BE9, 0x77ED, 0x925A, 0x77EE, 0xE1E2, 0x77EF, 0x8BB8, 0x77F3, 0x90CE, 0x77FC, 0xE1E3, 0x7802, 0x8DBB, 0x780C, 0xE1E4, + 0x7812, 0xE1E5, 0x7814, 0x8CA4, 0x7815, 0x8DD3, 0x7820, 0xE1E7, 0x7821, 0xFB78, 0x7825, 0x9375, 0x7826, 0x8DD4, 0x7827, 0x8B6D, + 0x7832, 0x9643, 0x7834, 0x946A, 0x783A, 0x9376, 0x783F, 0x8D7B, 0x7845, 0xE1E9, 0x784E, 0xFB79, 0x785D, 0x8FC9, 0x7864, 0xFB7A, + 0x786B, 0x97B0, 0x786C, 0x8D64, 0x786F, 0x8CA5, 0x7872, 0x94A1, 0x7874, 0xE1EB, 0x787A, 0xFB7B, 0x787C, 0xE1ED, 0x7881, 0x8CE9, + 0x7886, 0xE1EC, 0x7887, 0x92F4, 0x788C, 0xE1EF, 0x788D, 0x8A56, 0x788E, 0xE1EA, 0x7891, 0x94E8, 0x7893, 0x894F, 0x7895, 0x8DEA, + 0x7897, 0x9871, 0x789A, 0xE1EE, 0x78A3, 0xE1F0, 0x78A7, 0x95C9, 0x78A9, 0x90D7, 0x78AA, 0xE1F2, 0x78AF, 0xE1F3, 0x78B5, 0xE1F1, + 0x78BA, 0x8A6D, 0x78BC, 0xE1F9, 0x78BE, 0xE1F8, 0x78C1, 0x8EA5, 0x78C5, 0xE1FA, 0x78C6, 0xE1F5, 0x78CA, 0xE1FB, 0x78CB, 0xE1F6, + 0x78D0, 0x94D6, 0x78D1, 0xE1F4, 0x78D4, 0xE1F7, 0x78DA, 0xE241, 0x78E7, 0xE240, 0x78E8, 0x9681, 0x78EC, 0xE1FC, 0x78EF, 0x88E9, + 0x78F4, 0xE243, 0x78FD, 0xE242, 0x7901, 0x8FCA, 0x7907, 0xE244, 0x790E, 0x9162, 0x7911, 0xE246, 0x7912, 0xE245, 0x7919, 0xE247, + 0x7926, 0xE1E6, 0x792A, 0xE1E8, 0x792B, 0xE249, 0x792C, 0xE248, 0x7930, 0xFB7C, 0x793A, 0x8EA6, 0x793C, 0x97E7, 0x793E, 0x8ED0, + 0x7940, 0xE24A, 0x7941, 0x8C56, 0x7947, 0x8B5F, 0x7948, 0x8B46, 0x7949, 0x8E83, 0x7950, 0x9753, 0x7953, 0xE250, 0x7955, 0xE24F, + 0x7956, 0x9163, 0x7957, 0xE24C, 0x795A, 0xE24E, 0x795D, 0x8F6A, 0x795E, 0x905F, 0x795F, 0xE24D, 0x7960, 0xE24B, 0x7962, 0x9449, + 0x7965, 0x8FCB, 0x7968, 0x955B, 0x796D, 0x8DD5, 0x7977, 0x9398, 0x797A, 0xE251, 0x797F, 0xE252, 0x7980, 0xE268, 0x7981, 0x8BD6, + 0x7984, 0x985C, 0x7985, 0x9154, 0x798A, 0xE253, 0x798D, 0x89D0, 0x798E, 0x92F5, 0x798F, 0x959F, 0x7994, 0xFB81, 0x799B, 0xFB83, + 0x799D, 0xE254, 0x79A6, 0x8B9A, 0x79A7, 0xE255, 0x79AA, 0xE257, 0x79AE, 0xE258, 0x79B0, 0x9448, 0x79B3, 0xE259, 0x79B9, 0xE25A, + 0x79BA, 0xE25B, 0x79BD, 0x8BD7, 0x79BE, 0x89D1, 0x79BF, 0x93C3, 0x79C0, 0x8F47, 0x79C1, 0x8E84, 0x79C9, 0xE25C, 0x79CB, 0x8F48, + 0x79D1, 0x89C8, 0x79D2, 0x9562, 0x79D5, 0xE25D, 0x79D8, 0x94E9, 0x79DF, 0x9164, 0x79E1, 0xE260, 0x79E3, 0xE261, 0x79E4, 0x9489, + 0x79E6, 0x9060, 0x79E7, 0xE25E, 0x79E9, 0x9281, 0x79EC, 0xE25F, 0x79F0, 0x8FCC, 0x79FB, 0x88DA, 0x7A00, 0x8B48, 0x7A08, 0xE262, + 0x7A0B, 0x92F6, 0x7A0D, 0xE263, 0x7A0E, 0x90C5, 0x7A14, 0x96AB, 0x7A17, 0x9542, 0x7A18, 0xE264, 0x7A19, 0xE265, 0x7A1A, 0x9274, + 0x7A1C, 0x97C5, 0x7A1F, 0xE267, 0x7A20, 0xE266, 0x7A2E, 0x8EED, 0x7A31, 0xE269, 0x7A32, 0x88EE, 0x7A37, 0xE26C, 0x7A3B, 0xE26A, + 0x7A3C, 0x89D2, 0x7A3D, 0x8C6D, 0x7A3E, 0xE26B, 0x7A3F, 0x8D65, 0x7A40, 0x8D92, 0x7A42, 0x95E4, 0x7A43, 0xE26D, 0x7A46, 0x9673, + 0x7A49, 0xE26F, 0x7A4D, 0x90CF, 0x7A4E, 0x896E, 0x7A4F, 0x89B8, 0x7A50, 0x88AA, 0x7A57, 0xE26E, 0x7A61, 0xE270, 0x7A62, 0xE271, + 0x7A63, 0x8FF5, 0x7A69, 0xE272, 0x7A6B, 0x8A6E, 0x7A70, 0xE274, 0x7A74, 0x8C8A, 0x7A76, 0x8B86, 0x7A79, 0xE275, 0x7A7A, 0x8BF3, + 0x7A7D, 0xE276, 0x7A7F, 0x90FA, 0x7A81, 0x93CB, 0x7A83, 0x90DE, 0x7A84, 0x8DF3, 0x7A88, 0xE277, 0x7A92, 0x9282, 0x7A93, 0x918B, + 0x7A95, 0xE279, 0x7A96, 0xE27B, 0x7A97, 0xE278, 0x7A98, 0xE27A, 0x7A9F, 0x8C41, 0x7AA9, 0xE27C, 0x7AAA, 0x8C45, 0x7AAE, 0x8B87, + 0x7AAF, 0x9771, 0x7AB0, 0xE27E, 0x7AB6, 0xE280, 0x7ABA, 0x894D, 0x7ABF, 0xE283, 0x7AC3, 0x8A96, 0x7AC4, 0xE282, 0x7AC5, 0xE281, + 0x7AC7, 0xE285, 0x7AC8, 0xE27D, 0x7ACA, 0xE286, 0x7ACB, 0x97A7, 0x7ACD, 0xE287, 0x7ACF, 0xE288, 0x7AD1, 0xFB84, 0x7AD2, 0x9AF2, + 0x7AD3, 0xE28A, 0x7AD5, 0xE289, 0x7AD9, 0xE28B, 0x7ADA, 0xE28C, 0x7ADC, 0x97B3, 0x7ADD, 0xE28D, 0x7ADF, 0xE8ED, 0x7AE0, 0x8FCD, + 0x7AE1, 0xE28E, 0x7AE2, 0xE28F, 0x7AE3, 0x8F76, 0x7AE5, 0x93B6, 0x7AE6, 0xE290, 0x7AE7, 0xFB85, 0x7AEA, 0x9247, 0x7AEB, 0xFB87, + 0x7AED, 0xE291, 0x7AEF, 0x925B, 0x7AF0, 0xE292, 0x7AF6, 0x8BA3, 0x7AF8, 0x995E, 0x7AF9, 0x927C, 0x7AFA, 0x8EB1, 0x7AFF, 0x8AC6, + 0x7B02, 0xE293, 0x7B04, 0xE2A0, 0x7B06, 0xE296, 0x7B08, 0x8B88, 0x7B0A, 0xE295, 0x7B0B, 0xE2A2, 0x7B0F, 0xE294, 0x7B11, 0x8FCE, + 0x7B18, 0xE298, 0x7B19, 0xE299, 0x7B1B, 0x934A, 0x7B1E, 0xE29A, 0x7B20, 0x8A7D, 0x7B25, 0x9079, 0x7B26, 0x9584, 0x7B28, 0xE29C, + 0x7B2C, 0x91E6, 0x7B33, 0xE297, 0x7B35, 0xE29B, 0x7B36, 0xE29D, 0x7B39, 0x8DF9, 0x7B45, 0xE2A4, 0x7B46, 0x954D, 0x7B48, 0x94A4, + 0x7B49, 0x9399, 0x7B4B, 0x8BD8, 0x7B4C, 0xE2A3, 0x7B4D, 0xE2A1, 0x7B4F, 0x94B3, 0x7B50, 0xE29E, 0x7B51, 0x927D, 0x7B52, 0x939B, + 0x7B54, 0x939A, 0x7B56, 0x8DF4, 0x7B5D, 0xE2B6, 0x7B65, 0xE2A6, 0x7B67, 0xE2A8, 0x7B6C, 0xE2AB, 0x7B6E, 0xE2AC, 0x7B70, 0xE2A9, + 0x7B71, 0xE2AA, 0x7B74, 0xE2A7, 0x7B75, 0xE2A5, 0x7B7A, 0xE29F, 0x7B86, 0x95CD, 0x7B87, 0x89D3, 0x7B8B, 0xE2B3, 0x7B8D, 0xE2B0, + 0x7B8F, 0xE2B5, 0x7B92, 0xE2B4, 0x7B94, 0x9493, 0x7B95, 0x96A5, 0x7B97, 0x8E5A, 0x7B98, 0xE2AE, 0x7B99, 0xE2B7, 0x7B9A, 0xE2B2, + 0x7B9C, 0xE2B1, 0x7B9D, 0xE2AD, 0x7B9E, 0xFB88, 0x7B9F, 0xE2AF, 0x7BA1, 0x8AC7, 0x7BAA, 0x925C, 0x7BAD, 0x90FB, 0x7BB1, 0x94A0, + 0x7BB4, 0xE2BC, 0x7BB8, 0x94A2, 0x7BC0, 0x90DF, 0x7BC1, 0xE2B9, 0x7BC4, 0x94CD, 0x7BC6, 0xE2BD, 0x7BC7, 0x95D1, 0x7BC9, 0x927A, + 0x7BCB, 0xE2B8, 0x7BCC, 0xE2BA, 0x7BCF, 0xE2BB, 0x7BDD, 0xE2BE, 0x7BE0, 0x8EC2, 0x7BE4, 0x93C4, 0x7BE5, 0xE2C3, 0x7BE6, 0xE2C2, + 0x7BE9, 0xE2BF, 0x7BED, 0x9855, 0x7BF3, 0xE2C8, 0x7BF6, 0xE2CC, 0x7BF7, 0xE2C9, 0x7C00, 0xE2C5, 0x7C07, 0xE2C6, 0x7C0D, 0xE2CB, + 0x7C11, 0xE2C0, 0x7C12, 0x99D3, 0x7C13, 0xE2C7, 0x7C14, 0xE2C1, 0x7C17, 0xE2CA, 0x7C1F, 0xE2D0, 0x7C21, 0x8AC8, 0x7C23, 0xE2CD, + 0x7C27, 0xE2CE, 0x7C2A, 0xE2CF, 0x7C2B, 0xE2D2, 0x7C37, 0xE2D1, 0x7C38, 0x94F4, 0x7C3D, 0xE2D3, 0x7C3E, 0x97FA, 0x7C3F, 0x95EB, + 0x7C40, 0xE2D8, 0x7C43, 0xE2D5, 0x7C4C, 0xE2D4, 0x7C4D, 0x90D0, 0x7C4F, 0xE2D7, 0x7C50, 0xE2D9, 0x7C54, 0xE2D6, 0x7C56, 0xE2DD, + 0x7C58, 0xE2DA, 0x7C5F, 0xE2DB, 0x7C60, 0xE2C4, 0x7C64, 0xE2DC, 0x7C65, 0xE2DE, 0x7C6C, 0xE2DF, 0x7C73, 0x95C4, 0x7C75, 0xE2E0, + 0x7C7E, 0x96E0, 0x7C81, 0x8BCC, 0x7C82, 0x8C48, 0x7C83, 0xE2E1, 0x7C89, 0x95B2, 0x7C8B, 0x9088, 0x7C8D, 0x96AE, 0x7C90, 0xE2E2, + 0x7C92, 0x97B1, 0x7C95, 0x9494, 0x7C97, 0x9165, 0x7C98, 0x9453, 0x7C9B, 0x8F6C, 0x7C9F, 0x88BE, 0x7CA1, 0xE2E7, 0x7CA2, 0xE2E5, + 0x7CA4, 0xE2E3, 0x7CA5, 0x8A9F, 0x7CA7, 0x8FCF, 0x7CA8, 0xE2E8, 0x7CAB, 0xE2E6, 0x7CAD, 0xE2E4, 0x7CAE, 0xE2EC, 0x7CB1, 0xE2EB, + 0x7CB2, 0xE2EA, 0x7CB3, 0xE2E9, 0x7CB9, 0xE2ED, 0x7CBD, 0xE2EE, 0x7CBE, 0x90B8, 0x7CC0, 0xE2EF, 0x7CC2, 0xE2F1, 0x7CC5, 0xE2F0, + 0x7CCA, 0x8CD0, 0x7CCE, 0x9157, 0x7CD2, 0xE2F3, 0x7CD6, 0x939C, 0x7CD8, 0xE2F2, 0x7CDC, 0xE2F4, 0x7CDE, 0x95B3, 0x7CDF, 0x918C, + 0x7CE0, 0x8D66, 0x7CE2, 0xE2F5, 0x7CE7, 0x97C6, 0x7CEF, 0xE2F7, 0x7CF2, 0xE2F8, 0x7CF4, 0xE2F9, 0x7CF6, 0xE2FA, 0x7CF8, 0x8E85, + 0x7CFA, 0xE2FB, 0x7CFB, 0x8C6E, 0x7CFE, 0x8B8A, 0x7D00, 0x8B49, 0x7D02, 0xE340, 0x7D04, 0x96F1, 0x7D05, 0x8D67, 0x7D06, 0xE2FC, + 0x7D0A, 0xE343, 0x7D0B, 0x96E4, 0x7D0D, 0x945B, 0x7D10, 0x9552, 0x7D14, 0x8F83, 0x7D15, 0xE342, 0x7D17, 0x8ED1, 0x7D18, 0x8D68, + 0x7D19, 0x8E86, 0x7D1A, 0x8B89, 0x7D1B, 0x95B4, 0x7D1C, 0xE341, 0x7D20, 0x9166, 0x7D21, 0x9661, 0x7D22, 0x8DF5, 0x7D2B, 0x8E87, + 0x7D2C, 0x92DB, 0x7D2E, 0xE346, 0x7D2F, 0x97DD, 0x7D30, 0x8DD7, 0x7D32, 0xE347, 0x7D33, 0x9061, 0x7D35, 0xE349, 0x7D39, 0x8FD0, + 0x7D3A, 0x8DAE, 0x7D3F, 0xE348, 0x7D42, 0x8F49, 0x7D43, 0x8CBC, 0x7D44, 0x9167, 0x7D45, 0xE344, 0x7D46, 0xE34A, 0x7D48, 0xFB8A, + 0x7D4B, 0xE345, 0x7D4C, 0x8C6F, 0x7D4E, 0xE34D, 0x7D4F, 0xE351, 0x7D50, 0x8C8B, 0x7D56, 0xE34C, 0x7D5B, 0xE355, 0x7D5C, 0xFB8B, + 0x7D5E, 0x8D69, 0x7D61, 0x978D, 0x7D62, 0x88BA, 0x7D63, 0xE352, 0x7D66, 0x8B8B, 0x7D68, 0xE34F, 0x7D6E, 0xE350, 0x7D71, 0x939D, + 0x7D72, 0xE34E, 0x7D73, 0xE34B, 0x7D75, 0x8A47, 0x7D76, 0x90E2, 0x7D79, 0x8CA6, 0x7D7D, 0xE357, 0x7D89, 0xE354, 0x7D8F, 0xE356, + 0x7D93, 0xE353, 0x7D99, 0x8C70, 0x7D9A, 0x91B1, 0x7D9B, 0xE358, 0x7D9C, 0x918E, 0x7D9F, 0xE365, 0x7DA0, 0xFB8D, 0x7DA2, 0xE361, + 0x7DA3, 0xE35B, 0x7DAB, 0xE35F, 0x7DAC, 0x8EF8, 0x7DAD, 0x88DB, 0x7DAE, 0xE35A, 0x7DAF, 0xE362, 0x7DB0, 0xE366, 0x7DB1, 0x8D6A, + 0x7DB2, 0x96D4, 0x7DB4, 0x92D4, 0x7DB5, 0xE35C, 0x7DB7, 0xFB8C, 0x7DB8, 0xE364, 0x7DBA, 0xE359, 0x7DBB, 0x925D, 0x7DBD, 0xE35E, + 0x7DBE, 0x88BB, 0x7DBF, 0x96C8, 0x7DC7, 0xE35D, 0x7DCA, 0x8BD9, 0x7DCB, 0x94EA, 0x7DCF, 0x918D, 0x7DD1, 0x97CE, 0x7DD2, 0x8F8F, + 0x7DD5, 0xE38E, 0x7DD6, 0xFB8E, 0x7DD8, 0xE367, 0x7DDA, 0x90FC, 0x7DDC, 0xE363, 0x7DDD, 0xE368, 0x7DDE, 0xE36A, 0x7DE0, 0x92F7, + 0x7DE1, 0xE36D, 0x7DE4, 0xE369, 0x7DE8, 0x95D2, 0x7DE9, 0x8AC9, 0x7DEC, 0x96C9, 0x7DEF, 0x88DC, 0x7DF2, 0xE36C, 0x7DF4, 0x97FB, + 0x7DFB, 0xE36B, 0x7E01, 0x898F, 0x7E04, 0x93EA, 0x7E05, 0xE36E, 0x7E09, 0xE375, 0x7E0A, 0xE36F, 0x7E0B, 0xE376, 0x7E12, 0xE372, + 0x7E1B, 0x949B, 0x7E1E, 0x8EC8, 0x7E1F, 0xE374, 0x7E21, 0xE371, 0x7E22, 0xE377, 0x7E23, 0xE370, 0x7E26, 0x8F63, 0x7E2B, 0x9644, + 0x7E2E, 0x8F6B, 0x7E31, 0xE373, 0x7E32, 0xE380, 0x7E35, 0xE37B, 0x7E37, 0xE37E, 0x7E39, 0xE37C, 0x7E3A, 0xE381, 0x7E3B, 0xE37A, + 0x7E3D, 0xE360, 0x7E3E, 0x90D1, 0x7E41, 0x94C9, 0x7E43, 0xE37D, 0x7E46, 0xE378, 0x7E4A, 0x9140, 0x7E4B, 0x8C71, 0x7E4D, 0x8F4A, + 0x7E52, 0xFB8F, 0x7E54, 0x9044, 0x7E55, 0x9155, 0x7E56, 0xE384, 0x7E59, 0xE386, 0x7E5A, 0xE387, 0x7E5D, 0xE383, 0x7E5E, 0xE385, + 0x7E66, 0xE379, 0x7E67, 0xE382, 0x7E69, 0xE38A, 0x7E6A, 0xE389, 0x7E6D, 0x969A, 0x7E70, 0x8C4A, 0x7E79, 0xE388, 0x7E7B, 0xE38C, + 0x7E7C, 0xE38B, 0x7E7D, 0xE38F, 0x7E7F, 0xE391, 0x7E82, 0x8E5B, 0x7E83, 0xE38D, 0x7E88, 0xE392, 0x7E89, 0xE393, 0x7E8A, 0xFA5C, + 0x7E8C, 0xE394, 0x7E8E, 0xE39A, 0x7E8F, 0x935A, 0x7E90, 0xE396, 0x7E92, 0xE395, 0x7E93, 0xE397, 0x7E94, 0xE398, 0x7E96, 0xE399, + 0x7E9B, 0xE39B, 0x7E9C, 0xE39C, 0x7F36, 0x8ACA, 0x7F38, 0xE39D, 0x7F3A, 0xE39E, 0x7F45, 0xE39F, 0x7F47, 0xFB90, 0x7F4C, 0xE3A0, + 0x7F4D, 0xE3A1, 0x7F4E, 0xE3A2, 0x7F50, 0xE3A3, 0x7F51, 0xE3A4, 0x7F54, 0xE3A6, 0x7F55, 0xE3A5, 0x7F58, 0xE3A7, 0x7F5F, 0xE3A8, + 0x7F60, 0xE3A9, 0x7F67, 0xE3AC, 0x7F68, 0xE3AA, 0x7F69, 0xE3AB, 0x7F6A, 0x8DDF, 0x7F6B, 0x8C72, 0x7F6E, 0x9275, 0x7F70, 0x94B1, + 0x7F72, 0x8F90, 0x7F75, 0x946C, 0x7F77, 0x94EB, 0x7F78, 0xE3AD, 0x7F79, 0x9CEB, 0x7F82, 0xE3AE, 0x7F83, 0xE3B0, 0x7F85, 0x9785, + 0x7F86, 0xE3AF, 0x7F87, 0xE3B2, 0x7F88, 0xE3B1, 0x7F8A, 0x9772, 0x7F8C, 0xE3B3, 0x7F8E, 0x94FC, 0x7F94, 0xE3B4, 0x7F9A, 0xE3B7, + 0x7F9D, 0xE3B6, 0x7F9E, 0xE3B5, 0x7FA1, 0xFB91, 0x7FA3, 0xE3B8, 0x7FA4, 0x8C51, 0x7FA8, 0x9141, 0x7FA9, 0x8B60, 0x7FAE, 0xE3BC, + 0x7FAF, 0xE3B9, 0x7FB2, 0xE3BA, 0x7FB6, 0xE3BD, 0x7FB8, 0xE3BE, 0x7FB9, 0xE3BB, 0x7FBD, 0x8948, 0x7FC1, 0x89A5, 0x7FC5, 0xE3C0, + 0x7FC6, 0xE3C1, 0x7FCA, 0xE3C2, 0x7FCC, 0x9782, 0x7FD2, 0x8F4B, 0x7FD4, 0xE3C4, 0x7FD5, 0xE3C3, 0x7FE0, 0x9089, 0x7FE1, 0xE3C5, + 0x7FE6, 0xE3C6, 0x7FE9, 0xE3C7, 0x7FEB, 0x8AE3, 0x7FF0, 0x8ACB, 0x7FF3, 0xE3C8, 0x7FF9, 0xE3C9, 0x7FFB, 0x967C, 0x7FFC, 0x9783, + 0x8000, 0x9773, 0x8001, 0x9856, 0x8003, 0x8D6C, 0x8004, 0xE3CC, 0x8005, 0x8ED2, 0x8006, 0xE3CB, 0x800B, 0xE3CD, 0x800C, 0x8EA7, + 0x8010, 0x91CF, 0x8012, 0xE3CE, 0x8015, 0x8D6B, 0x8017, 0x96D5, 0x8018, 0xE3CF, 0x8019, 0xE3D0, 0x801C, 0xE3D1, 0x8021, 0xE3D2, + 0x8028, 0xE3D3, 0x8033, 0x8EA8, 0x8036, 0x96EB, 0x803B, 0xE3D5, 0x803D, 0x925E, 0x803F, 0xE3D4, 0x8046, 0xE3D7, 0x804A, 0xE3D6, + 0x8052, 0xE3D8, 0x8056, 0x90B9, 0x8058, 0xE3D9, 0x805A, 0xE3DA, 0x805E, 0x95B7, 0x805F, 0xE3DB, 0x8061, 0x918F, 0x8062, 0xE3DC, + 0x8068, 0xE3DD, 0x806F, 0x97FC, 0x8070, 0xE3E0, 0x8072, 0xE3DF, 0x8073, 0xE3DE, 0x8074, 0x92AE, 0x8076, 0xE3E1, 0x8077, 0x9045, + 0x8079, 0xE3E2, 0x807D, 0xE3E3, 0x807E, 0x9857, 0x807F, 0xE3E4, 0x8084, 0xE3E5, 0x8085, 0xE3E7, 0x8086, 0xE3E6, 0x8087, 0x94A3, + 0x8089, 0x93F7, 0x808B, 0x985D, 0x808C, 0x94A7, 0x8093, 0xE3E9, 0x8096, 0x8FD1, 0x8098, 0x9549, 0x809A, 0xE3EA, 0x809B, 0xE3E8, + 0x809D, 0x8ACC, 0x80A1, 0x8CD2, 0x80A2, 0x8E88, 0x80A5, 0x94EC, 0x80A9, 0x8CA8, 0x80AA, 0x9662, 0x80AC, 0xE3ED, 0x80AD, 0xE3EB, + 0x80AF, 0x8D6D, 0x80B1, 0x8D6E, 0x80B2, 0x88E7, 0x80B4, 0x8DE6, 0x80BA, 0x9478, 0x80C3, 0x88DD, 0x80C4, 0xE3F2, 0x80C6, 0x925F, + 0x80CC, 0x9477, 0x80CE, 0x91D9, 0x80D6, 0xE3F4, 0x80D9, 0xE3F0, 0x80DA, 0xE3F3, 0x80DB, 0xE3EE, 0x80DD, 0xE3F1, 0x80DE, 0x9645, + 0x80E1, 0x8CD3, 0x80E4, 0x88FB, 0x80E5, 0xE3EF, 0x80EF, 0xE3F6, 0x80F1, 0xE3F7, 0x80F4, 0x93B7, 0x80F8, 0x8BB9, 0x80FC, 0xE445, + 0x80FD, 0x945C, 0x8102, 0x8E89, 0x8105, 0x8BBA, 0x8106, 0x90C6, 0x8107, 0x9865, 0x8108, 0x96AC, 0x8109, 0xE3F5, 0x810A, 0x90D2, + 0x811A, 0x8B72, 0x811B, 0xE3F8, 0x8123, 0xE3FA, 0x8129, 0xE3F9, 0x812F, 0xE3FB, 0x8131, 0x9245, 0x8133, 0x945D, 0x8139, 0x92AF, + 0x813E, 0xE442, 0x8146, 0xE441, 0x814B, 0xE3FC, 0x814E, 0x9074, 0x8150, 0x9585, 0x8151, 0xE444, 0x8153, 0xE443, 0x8154, 0x8D6F, + 0x8155, 0x9872, 0x815F, 0xE454, 0x8165, 0xE448, 0x8166, 0xE449, 0x816B, 0x8EEE, 0x816E, 0xE447, 0x8170, 0x8D98, 0x8171, 0xE446, + 0x8174, 0xE44A, 0x8178, 0x92B0, 0x8179, 0x95A0, 0x817A, 0x9142, 0x817F, 0x91DA, 0x8180, 0xE44E, 0x8182, 0xE44F, 0x8183, 0xE44B, + 0x8188, 0xE44C, 0x818A, 0xE44D, 0x818F, 0x8D70, 0x8193, 0xE455, 0x8195, 0xE451, 0x819A, 0x9586, 0x819C, 0x968C, 0x819D, 0x9547, + 0x81A0, 0xE450, 0x81A3, 0xE453, 0x81A4, 0xE452, 0x81A8, 0x9663, 0x81A9, 0xE456, 0x81B0, 0xE457, 0x81B3, 0x9156, 0x81B5, 0xE458, + 0x81B8, 0xE45A, 0x81BA, 0xE45E, 0x81BD, 0xE45B, 0x81BE, 0xE459, 0x81BF, 0x945E, 0x81C0, 0xE45C, 0x81C2, 0xE45D, 0x81C6, 0x89B0, + 0x81C8, 0xE464, 0x81C9, 0xE45F, 0x81CD, 0xE460, 0x81D1, 0xE461, 0x81D3, 0x919F, 0x81D8, 0xE463, 0x81D9, 0xE462, 0x81DA, 0xE465, + 0x81DF, 0xE466, 0x81E0, 0xE467, 0x81E3, 0x9062, 0x81E5, 0x89E7, 0x81E7, 0xE468, 0x81E8, 0x97D5, 0x81EA, 0x8EA9, 0x81ED, 0x8F4C, + 0x81F3, 0x8E8A, 0x81F4, 0x9276, 0x81FA, 0xE469, 0x81FB, 0xE46A, 0x81FC, 0x8950, 0x81FE, 0xE46B, 0x8201, 0xE46C, 0x8202, 0xE46D, + 0x8205, 0xE46E, 0x8207, 0xE46F, 0x8208, 0x8BBB, 0x8209, 0x9DA8, 0x820A, 0xE470, 0x820C, 0x90E3, 0x820D, 0xE471, 0x820E, 0x8EC9, + 0x8210, 0xE472, 0x8212, 0x98AE, 0x8216, 0xE473, 0x8217, 0x95DC, 0x8218, 0x8ADA, 0x821B, 0x9143, 0x821C, 0x8F77, 0x821E, 0x9591, + 0x821F, 0x8F4D, 0x8229, 0xE474, 0x822A, 0x8D71, 0x822B, 0xE475, 0x822C, 0x94CA, 0x822E, 0xE484, 0x8233, 0xE477, 0x8235, 0x91C7, + 0x8236, 0x9495, 0x8237, 0x8CBD, 0x8238, 0xE476, 0x8239, 0x9144, 0x8240, 0xE478, 0x8247, 0x92F8, 0x8258, 0xE47A, 0x8259, 0xE479, + 0x825A, 0xE47C, 0x825D, 0xE47B, 0x825F, 0xE47D, 0x8262, 0xE480, 0x8264, 0xE47E, 0x8266, 0x8ACD, 0x8268, 0xE481, 0x826A, 0xE482, + 0x826B, 0xE483, 0x826E, 0x8DAF, 0x826F, 0x97C7, 0x8271, 0xE485, 0x8272, 0x9046, 0x8276, 0x8990, 0x8277, 0xE486, 0x8278, 0xE487, + 0x827E, 0xE488, 0x828B, 0x88F0, 0x828D, 0xE489, 0x8292, 0xE48A, 0x8299, 0x9587, 0x829D, 0x8EC5, 0x829F, 0xE48C, 0x82A5, 0x8A48, + 0x82A6, 0x88B0, 0x82AB, 0xE48B, 0x82AC, 0xE48E, 0x82AD, 0x946D, 0x82AF, 0x9063, 0x82B1, 0x89D4, 0x82B3, 0x9646, 0x82B8, 0x8C7C, + 0x82B9, 0x8BDA, 0x82BB, 0xE48D, 0x82BD, 0x89E8, 0x82C5, 0x8AA1, 0x82D1, 0x8991, 0x82D2, 0xE492, 0x82D3, 0x97E8, 0x82D4, 0x91DB, + 0x82D7, 0x9563, 0x82D9, 0xE49E, 0x82DB, 0x89D5, 0x82DC, 0xE49C, 0x82DE, 0xE49A, 0x82DF, 0xE491, 0x82E1, 0xE48F, 0x82E3, 0xE490, + 0x82E5, 0x8EE1, 0x82E6, 0x8BEA, 0x82E7, 0x9297, 0x82EB, 0x93CF, 0x82F1, 0x8970, 0x82F3, 0xE494, 0x82F4, 0xE493, 0x82F9, 0xE499, + 0x82FA, 0xE495, 0x82FB, 0xE498, 0x8301, 0xFB93, 0x8302, 0x96CE, 0x8303, 0xE497, 0x8304, 0x89D6, 0x8305, 0x8A9D, 0x8306, 0xE49B, + 0x8309, 0xE49D, 0x830E, 0x8C73, 0x8316, 0xE4A1, 0x8317, 0xE4AA, 0x8318, 0xE4AB, 0x831C, 0x88A9, 0x8323, 0xE4B2, 0x8328, 0x88EF, + 0x832B, 0xE4A9, 0x832F, 0xE4A8, 0x8331, 0xE4A3, 0x8332, 0xE4A2, 0x8334, 0xE4A0, 0x8335, 0xE49F, 0x8336, 0x9283, 0x8338, 0x91F9, + 0x8339, 0xE4A5, 0x8340, 0xE4A4, 0x8345, 0xE4A7, 0x8349, 0x9190, 0x834A, 0x8C74, 0x834F, 0x8960, 0x8350, 0xE4A6, 0x8352, 0x8D72, + 0x8358, 0x9191, 0x8362, 0xFB94, 0x8373, 0xE4B8, 0x8375, 0xE4B9, 0x8377, 0x89D7, 0x837B, 0x89AC, 0x837C, 0xE4B6, 0x837F, 0xFB95, + 0x8385, 0xE4AC, 0x8387, 0xE4B4, 0x8389, 0xE4BB, 0x838A, 0xE4B5, 0x838E, 0xE4B3, 0x8393, 0xE496, 0x8396, 0xE4B1, 0x839A, 0xE4AD, + 0x839E, 0x8ACE, 0x839F, 0xE4AF, 0x83A0, 0xE4BA, 0x83A2, 0xE4B0, 0x83A8, 0xE4BC, 0x83AA, 0xE4AE, 0x83AB, 0x949C, 0x83B1, 0x9789, + 0x83B5, 0xE4B7, 0x83BD, 0xE4CD, 0x83C1, 0xE4C5, 0x83C5, 0x909B, 0x83C7, 0xFB96, 0x83CA, 0x8B65, 0x83CC, 0x8BDB, 0x83CE, 0xE4C0, + 0x83D3, 0x89D9, 0x83D6, 0x8FD2, 0x83D8, 0xE4C3, 0x83DC, 0x8DD8, 0x83DF, 0x9370, 0x83E0, 0xE4C8, 0x83E9, 0x95EC, 0x83EB, 0xE4BF, + 0x83EF, 0x89D8, 0x83F0, 0x8CD4, 0x83F1, 0x9548, 0x83F2, 0xE4C9, 0x83F4, 0xE4BD, 0x83F6, 0xFB97, 0x83F7, 0xE4C6, 0x83FB, 0xE4D0, + 0x83FD, 0xE4C1, 0x8403, 0xE4C2, 0x8404, 0x93B8, 0x8407, 0xE4C7, 0x840B, 0xE4C4, 0x840C, 0x9647, 0x840D, 0xE4CA, 0x840E, 0x88DE, + 0x8413, 0xE4BE, 0x8420, 0xE4CC, 0x8422, 0xE4CB, 0x8429, 0x948B, 0x842A, 0xE4D2, 0x842C, 0xE4DD, 0x8431, 0x8A9E, 0x8435, 0xE4E0, + 0x8438, 0xE4CE, 0x843C, 0xE4D3, 0x843D, 0x978E, 0x8446, 0xE4DC, 0x8448, 0xFB98, 0x8449, 0x9774, 0x844E, 0x97A8, 0x8457, 0x9298, + 0x845B, 0x8A8B, 0x8461, 0x9592, 0x8462, 0xE4E2, 0x8463, 0x939F, 0x8466, 0x88AF, 0x8469, 0xE4DB, 0x846B, 0xE4D7, 0x846C, 0x9192, + 0x846D, 0xE4D1, 0x846E, 0xE4D9, 0x846F, 0xE4DE, 0x8471, 0x944B, 0x8475, 0x88A8, 0x8477, 0xE4D6, 0x8479, 0xE4DF, 0x847A, 0x9598, + 0x8482, 0xE4DA, 0x8484, 0xE4D5, 0x848B, 0x8FD3, 0x8490, 0x8F4E, 0x8494, 0x8EAA, 0x8499, 0x96D6, 0x849C, 0x9566, 0x849F, 0xE4E5, + 0x84A1, 0xE4EE, 0x84AD, 0xE4D8, 0x84B2, 0x8A97, 0x84B4, 0xFB99, 0x84B8, 0x8FF6, 0x84B9, 0xE4E3, 0x84BB, 0xE4E8, 0x84BC, 0x9193, + 0x84BF, 0xE4E4, 0x84C1, 0xE4EB, 0x84C4, 0x927E, 0x84C6, 0xE4EC, 0x84C9, 0x9775, 0x84CA, 0xE4E1, 0x84CB, 0x8A57, 0x84CD, 0xE4E7, + 0x84D0, 0xE4EA, 0x84D1, 0x96AA, 0x84D6, 0xE4ED, 0x84D9, 0xE4E6, 0x84DA, 0xE4E9, 0x84DC, 0xFA60, 0x84EC, 0x9648, 0x84EE, 0x9840, + 0x84F4, 0xE4F1, 0x84FC, 0xE4F8, 0x84FF, 0xE4F0, 0x8500, 0x8EC1, 0x8506, 0xE4CF, 0x8511, 0x95CC, 0x8513, 0x96A0, 0x8514, 0xE4F7, + 0x8515, 0xE4F6, 0x8517, 0xE4F2, 0x8518, 0xE4F3, 0x851A, 0x8955, 0x851F, 0xE4F5, 0x8521, 0xE4EF, 0x8526, 0x92D3, 0x852C, 0xE4F4, + 0x852D, 0x88FC, 0x8535, 0x91A0, 0x853D, 0x95C1, 0x8540, 0xE4F9, 0x8541, 0xE540, 0x8543, 0x94D7, 0x8548, 0xE4FC, 0x8549, 0x8FD4, + 0x854A, 0x8EC7, 0x854B, 0xE542, 0x854E, 0x8BBC, 0x8553, 0xFB9A, 0x8555, 0xE543, 0x8557, 0x9599, 0x8558, 0xE4FB, 0x8559, 0xFB9B, + 0x855A, 0xE4D4, 0x8563, 0xE4FA, 0x8568, 0x986E, 0x8569, 0x93A0, 0x856A, 0x9593, 0x856B, 0xFB9C, 0x856D, 0xE54A, 0x8577, 0xE550, + 0x857E, 0xE551, 0x8580, 0xE544, 0x8584, 0x9496, 0x8587, 0xE54E, 0x8588, 0xE546, 0x858A, 0xE548, 0x8590, 0xE552, 0x8591, 0xE547, + 0x8594, 0xE54B, 0x8597, 0x8992, 0x8599, 0x93E3, 0x859B, 0xE54C, 0x859C, 0xE54F, 0x85A4, 0xE545, 0x85A6, 0x9145, 0x85A8, 0xE549, + 0x85A9, 0x8E46, 0x85AA, 0x9064, 0x85AB, 0x8C4F, 0x85AC, 0x96F2, 0x85AE, 0x96F7, 0x85AF, 0x8F92, 0x85B0, 0xFB9E, 0x85B9, 0xE556, + 0x85BA, 0xE554, 0x85C1, 0x986D, 0x85C9, 0xE553, 0x85CD, 0x9795, 0x85CF, 0xE555, 0x85D0, 0xE557, 0x85D5, 0xE558, 0x85DC, 0xE55B, + 0x85DD, 0xE559, 0x85E4, 0x93A1, 0x85E5, 0xE55A, 0x85E9, 0x94CB, 0x85EA, 0xE54D, 0x85F7, 0x8F93, 0x85F9, 0xE55C, 0x85FA, 0xE561, + 0x85FB, 0x9194, 0x85FE, 0xE560, 0x8602, 0xE541, 0x8606, 0xE562, 0x8607, 0x9168, 0x860A, 0xE55D, 0x860B, 0xE55F, 0x8613, 0xE55E, + 0x8616, 0x9F50, 0x8617, 0x9F41, 0x861A, 0xE564, 0x8622, 0xE563, 0x862D, 0x9796, 0x862F, 0xE1BA, 0x8630, 0xE565, 0x863F, 0xE566, + 0x864D, 0xE567, 0x864E, 0x8CD5, 0x8650, 0x8B73, 0x8654, 0xE569, 0x8655, 0x997C, 0x865A, 0x8B95, 0x865C, 0x97B8, 0x865E, 0x8BF1, + 0x865F, 0xE56A, 0x8667, 0xE56B, 0x866B, 0x928E, 0x8671, 0xE56C, 0x8679, 0x93F8, 0x867B, 0x88B8, 0x868A, 0x89E1, 0x868B, 0xE571, + 0x868C, 0xE572, 0x8693, 0xE56D, 0x8695, 0x8E5C, 0x86A3, 0xE56E, 0x86A4, 0x9461, 0x86A9, 0xE56F, 0x86AA, 0xE570, 0x86AB, 0xE57A, + 0x86AF, 0xE574, 0x86B0, 0xE577, 0x86B6, 0xE573, 0x86C4, 0xE575, 0x86C6, 0xE576, 0x86C7, 0x8ED6, 0x86C9, 0xE578, 0x86CB, 0x9260, + 0x86CD, 0x8C75, 0x86CE, 0x8A61, 0x86D4, 0xE57B, 0x86D9, 0x8A5E, 0x86DB, 0xE581, 0x86DE, 0xE57C, 0x86DF, 0xE580, 0x86E4, 0x94B8, + 0x86E9, 0xE57D, 0x86EC, 0xE57E, 0x86ED, 0x9567, 0x86EE, 0x94D8, 0x86EF, 0xE582, 0x86F8, 0x91FB, 0x86F9, 0xE58C, 0x86FB, 0xE588, + 0x86FE, 0x89E9, 0x8700, 0xE586, 0x8702, 0x9649, 0x8703, 0xE587, 0x8706, 0xE584, 0x8708, 0xE585, 0x8709, 0xE58A, 0x870A, 0xE58D, + 0x870D, 0xE58B, 0x8711, 0xE589, 0x8712, 0xE583, 0x8718, 0x9277, 0x871A, 0xE594, 0x871C, 0x96A8, 0x8725, 0xE592, 0x8729, 0xE593, + 0x8734, 0xE58E, 0x8737, 0xE590, 0x873B, 0xE591, 0x873F, 0xE58F, 0x8749, 0x90E4, 0x874B, 0x9858, 0x874C, 0xE598, 0x874E, 0xE599, + 0x8753, 0xE59F, 0x8755, 0x9049, 0x8757, 0xE59B, 0x8759, 0xE59E, 0x875F, 0xE596, 0x8760, 0xE595, 0x8763, 0xE5A0, 0x8766, 0x89DA, + 0x8768, 0xE59C, 0x876A, 0xE5A1, 0x876E, 0xE59D, 0x8774, 0xE59A, 0x8776, 0x92B1, 0x8778, 0xE597, 0x877F, 0x9488, 0x8782, 0xE5A5, + 0x878D, 0x975A, 0x879F, 0xE5A4, 0x87A2, 0xE5A3, 0x87AB, 0xE5AC, 0x87AF, 0xE5A6, 0x87B3, 0xE5AE, 0x87BA, 0x9786, 0x87BB, 0xE5B1, + 0x87BD, 0xE5A8, 0x87C0, 0xE5A9, 0x87C4, 0xE5AD, 0x87C6, 0xE5B0, 0x87C7, 0xE5AF, 0x87CB, 0xE5A7, 0x87D0, 0xE5AA, 0x87D2, 0xE5BB, + 0x87E0, 0xE5B4, 0x87EF, 0xE5B2, 0x87F2, 0xE5B3, 0x87F6, 0xE5B8, 0x87F7, 0xE5B9, 0x87F9, 0x8A49, 0x87FB, 0x8B61, 0x87FE, 0xE5B7, + 0x8805, 0xE5A2, 0x8807, 0xFBA1, 0x880D, 0xE5B6, 0x880E, 0xE5BA, 0x880F, 0xE5B5, 0x8811, 0xE5BC, 0x8815, 0xE5BE, 0x8816, 0xE5BD, + 0x8821, 0xE5C0, 0x8822, 0xE5BF, 0x8823, 0xE579, 0x8827, 0xE5C4, 0x8831, 0xE5C1, 0x8836, 0xE5C2, 0x8839, 0xE5C3, 0x883B, 0xE5C5, + 0x8840, 0x8C8C, 0x8842, 0xE5C7, 0x8844, 0xE5C6, 0x8846, 0x8F4F, 0x884C, 0x8D73, 0x884D, 0x9FA5, 0x8852, 0xE5C8, 0x8853, 0x8F70, + 0x8857, 0x8A58, 0x8859, 0xE5C9, 0x885B, 0x8971, 0x885D, 0x8FD5, 0x885E, 0xE5CA, 0x8861, 0x8D74, 0x8862, 0xE5CB, 0x8863, 0x88DF, + 0x8868, 0x955C, 0x886B, 0xE5CC, 0x8870, 0x908A, 0x8872, 0xE5D3, 0x8875, 0xE5D0, 0x8877, 0x928F, 0x887D, 0xE5D1, 0x887E, 0xE5CE, + 0x887F, 0x8BDC, 0x8881, 0xE5CD, 0x8882, 0xE5D4, 0x8888, 0x8C55, 0x888B, 0x91DC, 0x888D, 0xE5DA, 0x8892, 0xE5D6, 0x8896, 0x91B3, + 0x8897, 0xE5D5, 0x8899, 0xE5D8, 0x889E, 0xE5CF, 0x88A2, 0xE5D9, 0x88A4, 0xE5DB, 0x88AB, 0x94ED, 0x88AE, 0xE5D7, 0x88B0, 0xE5DC, + 0x88B1, 0xE5DE, 0x88B4, 0x8CD1, 0x88B5, 0xE5D2, 0x88B7, 0x88BF, 0x88BF, 0xE5DD, 0x88C1, 0x8DD9, 0x88C2, 0x97F4, 0x88C3, 0xE5DF, + 0x88C4, 0xE5E0, 0x88C5, 0x9195, 0x88CF, 0x97A0, 0x88D4, 0xE5E1, 0x88D5, 0x9754, 0x88D8, 0xE5E2, 0x88D9, 0xE5E3, 0x88DC, 0x95E2, + 0x88DD, 0xE5E4, 0x88DF, 0x8DBE, 0x88E1, 0x97A1, 0x88E8, 0xE5E9, 0x88F2, 0xE5EA, 0x88F3, 0x8FD6, 0x88F4, 0xE5E8, 0x88F5, 0xFBA2, + 0x88F8, 0x9787, 0x88F9, 0xE5E5, 0x88FC, 0xE5E7, 0x88FD, 0x90BB, 0x88FE, 0x909E, 0x8902, 0xE5E6, 0x8904, 0xE5EB, 0x8907, 0x95A1, + 0x890A, 0xE5ED, 0x890C, 0xE5EC, 0x8910, 0x8A8C, 0x8912, 0x964A, 0x8913, 0xE5EE, 0x891C, 0xFA5D, 0x891D, 0xE5FA, 0x891E, 0xE5F0, + 0x8925, 0xE5F1, 0x892A, 0xE5F2, 0x892B, 0xE5F3, 0x8936, 0xE5F7, 0x8938, 0xE5F8, 0x893B, 0xE5F6, 0x8941, 0xE5F4, 0x8943, 0xE5EF, + 0x8944, 0xE5F5, 0x894C, 0xE5F9, 0x894D, 0xE8B5, 0x8956, 0x89A6, 0x895E, 0xE5FC, 0x895F, 0x8BDD, 0x8960, 0xE5FB, 0x8964, 0xE641, + 0x8966, 0xE640, 0x896A, 0xE643, 0x896D, 0xE642, 0x896F, 0xE644, 0x8972, 0x8F50, 0x8974, 0xE645, 0x8977, 0xE646, 0x897E, 0xE647, + 0x897F, 0x90BC, 0x8981, 0x9776, 0x8983, 0xE648, 0x8986, 0x95A2, 0x8987, 0x9465, 0x8988, 0xE649, 0x898A, 0xE64A, 0x898B, 0x8CA9, + 0x898F, 0x8B4B, 0x8993, 0xE64B, 0x8996, 0x8E8B, 0x8997, 0x9460, 0x8998, 0xE64C, 0x899A, 0x8A6F, 0x89A1, 0xE64D, 0x89A6, 0xE64F, + 0x89A7, 0x9797, 0x89A9, 0xE64E, 0x89AA, 0x9065, 0x89AC, 0xE650, 0x89AF, 0xE651, 0x89B2, 0xE652, 0x89B3, 0x8ACF, 0x89BA, 0xE653, + 0x89BD, 0xE654, 0x89BF, 0xE655, 0x89C0, 0xE656, 0x89D2, 0x8A70, 0x89DA, 0xE657, 0x89DC, 0xE658, 0x89DD, 0xE659, 0x89E3, 0x89F0, + 0x89E6, 0x9047, 0x89E7, 0xE65A, 0x89F4, 0xE65B, 0x89F8, 0xE65C, 0x8A00, 0x8CBE, 0x8A02, 0x92F9, 0x8A03, 0xE65D, 0x8A08, 0x8C76, + 0x8A0A, 0x9075, 0x8A0C, 0xE660, 0x8A0E, 0x93A2, 0x8A10, 0xE65F, 0x8A12, 0xFBA3, 0x8A13, 0x8C50, 0x8A16, 0xE65E, 0x8A17, 0x91F5, + 0x8A18, 0x8B4C, 0x8A1B, 0xE661, 0x8A1D, 0xE662, 0x8A1F, 0x8FD7, 0x8A23, 0x8C8D, 0x8A25, 0xE663, 0x8A2A, 0x964B, 0x8A2D, 0x90DD, + 0x8A31, 0x8B96, 0x8A33, 0x96F3, 0x8A34, 0x9169, 0x8A36, 0xE664, 0x8A37, 0xFBA4, 0x8A3A, 0x9066, 0x8A3B, 0x9290, 0x8A3C, 0x8FD8, + 0x8A41, 0xE665, 0x8A46, 0xE668, 0x8A48, 0xE669, 0x8A50, 0x8DBC, 0x8A51, 0x91C0, 0x8A52, 0xE667, 0x8A54, 0x8FD9, 0x8A55, 0x955D, + 0x8A5B, 0xE666, 0x8A5E, 0x8E8C, 0x8A60, 0x8972, 0x8A62, 0xE66D, 0x8A63, 0x8C77, 0x8A66, 0x8E8E, 0x8A69, 0x8E8D, 0x8A6B, 0x986C, + 0x8A6C, 0xE66C, 0x8A6D, 0xE66B, 0x8A6E, 0x9146, 0x8A70, 0x8B6C, 0x8A71, 0x9862, 0x8A72, 0x8A59, 0x8A73, 0x8FDA, 0x8A79, 0xFBA5, + 0x8A7C, 0xE66A, 0x8A82, 0xE66F, 0x8A84, 0xE670, 0x8A85, 0xE66E, 0x8A87, 0x8CD6, 0x8A89, 0x975F, 0x8A8C, 0x8E8F, 0x8A8D, 0x9446, + 0x8A91, 0xE673, 0x8A93, 0x90BE, 0x8A95, 0x9261, 0x8A98, 0x9755, 0x8A9A, 0xE676, 0x8A9E, 0x8CEA, 0x8AA0, 0x90BD, 0x8AA1, 0xE672, + 0x8AA3, 0xE677, 0x8AA4, 0x8CEB, 0x8AA5, 0xE674, 0x8AA6, 0xE675, 0x8AA7, 0xFBA6, 0x8AA8, 0xE671, 0x8AAC, 0x90E0, 0x8AAD, 0x93C7, + 0x8AB0, 0x924E, 0x8AB2, 0x89DB, 0x8AB9, 0x94EE, 0x8ABC, 0x8B62, 0x8ABE, 0xFBA7, 0x8ABF, 0x92B2, 0x8AC2, 0xE67A, 0x8AC4, 0xE678, + 0x8AC7, 0x926B, 0x8ACB, 0x90BF, 0x8ACC, 0x8AD0, 0x8ACD, 0xE679, 0x8ACF, 0x907A, 0x8AD2, 0x97C8, 0x8AD6, 0x985F, 0x8ADA, 0xE67B, + 0x8ADB, 0xE687, 0x8ADC, 0x92B3, 0x8ADE, 0xE686, 0x8ADF, 0xFBA8, 0x8AE0, 0xE683, 0x8AE1, 0xE68B, 0x8AE2, 0xE684, 0x8AE4, 0xE680, + 0x8AE6, 0x92FA, 0x8AE7, 0xE67E, 0x8AEB, 0xE67C, 0x8AED, 0x9740, 0x8AEE, 0x8E90, 0x8AF1, 0xE681, 0x8AF3, 0xE67D, 0x8AF6, 0xFBAA, + 0x8AF7, 0xE685, 0x8AF8, 0x8F94, 0x8AFA, 0x8CBF, 0x8AFE, 0x91F8, 0x8B00, 0x9664, 0x8B01, 0x8979, 0x8B02, 0x88E0, 0x8B04, 0x93A3, + 0x8B07, 0xE689, 0x8B0C, 0xE688, 0x8B0E, 0x93E4, 0x8B10, 0xE68D, 0x8B14, 0xE682, 0x8B16, 0xE68C, 0x8B17, 0xE68E, 0x8B19, 0x8CAA, + 0x8B1A, 0xE68A, 0x8B1B, 0x8D75, 0x8B1D, 0x8ED3, 0x8B20, 0xE68F, 0x8B21, 0x9777, 0x8B26, 0xE692, 0x8B28, 0xE695, 0x8B2B, 0xE693, + 0x8B2C, 0x9554, 0x8B33, 0xE690, 0x8B39, 0x8BDE, 0x8B3E, 0xE694, 0x8B41, 0xE696, 0x8B49, 0xE69A, 0x8B4C, 0xE697, 0x8B4E, 0xE699, + 0x8B4F, 0xE698, 0x8B53, 0xFBAB, 0x8B56, 0xE69B, 0x8B58, 0x8EAF, 0x8B5A, 0xE69D, 0x8B5B, 0xE69C, 0x8B5C, 0x9588, 0x8B5F, 0xE69F, + 0x8B66, 0x8C78, 0x8B6B, 0xE69E, 0x8B6C, 0xE6A0, 0x8B6F, 0xE6A1, 0x8B70, 0x8B63, 0x8B71, 0xE3BF, 0x8B72, 0x8FF7, 0x8B74, 0xE6A2, + 0x8B77, 0x8CEC, 0x8B7D, 0xE6A3, 0x8B7F, 0xFBAC, 0x8B80, 0xE6A4, 0x8B83, 0x8E5D, 0x8B8A, 0x9DCC, 0x8B8C, 0xE6A5, 0x8B8E, 0xE6A6, + 0x8B90, 0x8F51, 0x8B92, 0xE6A7, 0x8B93, 0xE6A8, 0x8B96, 0xE6A9, 0x8B99, 0xE6AA, 0x8B9A, 0xE6AB, 0x8C37, 0x924A, 0x8C3A, 0xE6AC, + 0x8C3F, 0xE6AE, 0x8C41, 0xE6AD, 0x8C46, 0x93A4, 0x8C48, 0xE6AF, 0x8C4A, 0x964C, 0x8C4C, 0xE6B0, 0x8C4E, 0xE6B1, 0x8C50, 0xE6B2, + 0x8C55, 0xE6B3, 0x8C5A, 0x93D8, 0x8C61, 0x8FDB, 0x8C62, 0xE6B4, 0x8C6A, 0x8D8B, 0x8C6B, 0x98AC, 0x8C6C, 0xE6B5, 0x8C78, 0xE6B6, + 0x8C79, 0x955E, 0x8C7A, 0xE6B7, 0x8C7C, 0xE6BF, 0x8C82, 0xE6B8, 0x8C85, 0xE6BA, 0x8C89, 0xE6B9, 0x8C8A, 0xE6BB, 0x8C8C, 0x9665, + 0x8C8D, 0xE6BC, 0x8C8E, 0xE6BD, 0x8C94, 0xE6BE, 0x8C98, 0xE6C0, 0x8C9D, 0x8A4C, 0x8C9E, 0x92E5, 0x8CA0, 0x9589, 0x8CA1, 0x8DE0, + 0x8CA2, 0x8D76, 0x8CA7, 0x956E, 0x8CA8, 0x89DD, 0x8CA9, 0x94CC, 0x8CAA, 0xE6C3, 0x8CAB, 0x8AD1, 0x8CAC, 0x90D3, 0x8CAD, 0xE6C2, + 0x8CAE, 0xE6C7, 0x8CAF, 0x9299, 0x8CB0, 0x96E1, 0x8CB2, 0xE6C5, 0x8CB3, 0xE6C6, 0x8CB4, 0x8B4D, 0x8CB6, 0xE6C8, 0x8CB7, 0x9483, + 0x8CB8, 0x91DD, 0x8CBB, 0x94EF, 0x8CBC, 0x935C, 0x8CBD, 0xE6C4, 0x8CBF, 0x9666, 0x8CC0, 0x89EA, 0x8CC1, 0xE6CA, 0x8CC2, 0x9847, + 0x8CC3, 0x92C0, 0x8CC4, 0x9864, 0x8CC7, 0x8E91, 0x8CC8, 0xE6C9, 0x8CCA, 0x91AF, 0x8CCD, 0xE6DA, 0x8CCE, 0x9147, 0x8CD1, 0x93F6, + 0x8CD3, 0x956F, 0x8CDA, 0xE6CD, 0x8CDB, 0x8E5E, 0x8CDC, 0x8E92, 0x8CDE, 0x8FDC, 0x8CE0, 0x9485, 0x8CE2, 0x8CAB, 0x8CE3, 0xE6CC, + 0x8CE4, 0xE6CB, 0x8CE6, 0x958A, 0x8CEA, 0x8EBF, 0x8CED, 0x9371, 0x8CF0, 0xFBAD, 0x8CF4, 0xFBAE, 0x8CFA, 0xE6CF, 0x8CFB, 0xE6D0, + 0x8CFC, 0x8D77, 0x8CFD, 0xE6CE, 0x8D04, 0xE6D1, 0x8D05, 0xE6D2, 0x8D07, 0xE6D4, 0x8D08, 0x91A1, 0x8D0A, 0xE6D3, 0x8D0B, 0x8AE4, + 0x8D0D, 0xE6D6, 0x8D0F, 0xE6D5, 0x8D10, 0xE6D7, 0x8D12, 0xFBAF, 0x8D13, 0xE6D9, 0x8D14, 0xE6DB, 0x8D16, 0xE6DC, 0x8D64, 0x90D4, + 0x8D66, 0x8ECD, 0x8D67, 0xE6DD, 0x8D6B, 0x8A71, 0x8D6D, 0xE6DE, 0x8D70, 0x9196, 0x8D71, 0xE6DF, 0x8D73, 0xE6E0, 0x8D74, 0x958B, + 0x8D76, 0xFBB0, 0x8D77, 0x8B4E, 0x8D81, 0xE6E1, 0x8D85, 0x92B4, 0x8D8A, 0x897A, 0x8D99, 0xE6E2, 0x8DA3, 0x8EEF, 0x8DA8, 0x9096, + 0x8DB3, 0x91AB, 0x8DBA, 0xE6E5, 0x8DBE, 0xE6E4, 0x8DC2, 0xE6E3, 0x8DCB, 0xE6EB, 0x8DCC, 0xE6E9, 0x8DCF, 0xE6E6, 0x8DD6, 0xE6E8, + 0x8DDA, 0xE6E7, 0x8DDB, 0xE6EA, 0x8DDD, 0x8B97, 0x8DDF, 0xE6EE, 0x8DE1, 0x90D5, 0x8DE3, 0xE6EF, 0x8DE8, 0x8CD7, 0x8DEA, 0xE6EC, + 0x8DEB, 0xE6ED, 0x8DEF, 0x9848, 0x8DF3, 0x92B5, 0x8DF5, 0x9148, 0x8DFC, 0xE6F0, 0x8DFF, 0xE6F3, 0x8E08, 0xE6F1, 0x8E09, 0xE6F2, + 0x8E0A, 0x9778, 0x8E0F, 0x93A5, 0x8E10, 0xE6F6, 0x8E1D, 0xE6F4, 0x8E1E, 0xE6F5, 0x8E1F, 0xE6F7, 0x8E2A, 0xE748, 0x8E30, 0xE6FA, + 0x8E34, 0xE6FB, 0x8E35, 0xE6F9, 0x8E42, 0xE6F8, 0x8E44, 0x92FB, 0x8E47, 0xE740, 0x8E48, 0xE744, 0x8E49, 0xE741, 0x8E4A, 0xE6FC, + 0x8E4C, 0xE742, 0x8E50, 0xE743, 0x8E55, 0xE74A, 0x8E59, 0xE745, 0x8E5F, 0x90D6, 0x8E60, 0xE747, 0x8E63, 0xE749, 0x8E64, 0xE746, + 0x8E72, 0xE74C, 0x8E74, 0x8F52, 0x8E76, 0xE74B, 0x8E7C, 0xE74D, 0x8E81, 0xE74E, 0x8E84, 0xE751, 0x8E85, 0xE750, 0x8E87, 0xE74F, + 0x8E8A, 0xE753, 0x8E8B, 0xE752, 0x8E8D, 0x96F4, 0x8E91, 0xE755, 0x8E93, 0xE754, 0x8E94, 0xE756, 0x8E99, 0xE757, 0x8EA1, 0xE759, + 0x8EAA, 0xE758, 0x8EAB, 0x9067, 0x8EAC, 0xE75A, 0x8EAF, 0x8BEB, 0x8EB0, 0xE75B, 0x8EB1, 0xE75D, 0x8EBE, 0xE75E, 0x8EC5, 0xE75F, + 0x8EC6, 0xE75C, 0x8EC8, 0xE760, 0x8ECA, 0x8ED4, 0x8ECB, 0xE761, 0x8ECC, 0x8B4F, 0x8ECD, 0x8C52, 0x8ECF, 0xFBB2, 0x8ED2, 0x8CAC, + 0x8EDB, 0xE762, 0x8EDF, 0x93EE, 0x8EE2, 0x935D, 0x8EE3, 0xE763, 0x8EEB, 0xE766, 0x8EF8, 0x8EB2, 0x8EFB, 0xE765, 0x8EFC, 0xE764, + 0x8EFD, 0x8C79, 0x8EFE, 0xE767, 0x8F03, 0x8A72, 0x8F05, 0xE769, 0x8F09, 0x8DDA, 0x8F0A, 0xE768, 0x8F0C, 0xE771, 0x8F12, 0xE76B, + 0x8F13, 0xE76D, 0x8F14, 0x95E3, 0x8F15, 0xE76A, 0x8F19, 0xE76C, 0x8F1B, 0xE770, 0x8F1C, 0xE76E, 0x8F1D, 0x8B50, 0x8F1F, 0xE76F, + 0x8F26, 0xE772, 0x8F29, 0x9479, 0x8F2A, 0x97D6, 0x8F2F, 0x8F53, 0x8F33, 0xE773, 0x8F38, 0x9741, 0x8F39, 0xE775, 0x8F3B, 0xE774, + 0x8F3E, 0xE778, 0x8F3F, 0x9760, 0x8F42, 0xE777, 0x8F44, 0x8A8D, 0x8F45, 0xE776, 0x8F46, 0xE77B, 0x8F49, 0xE77A, 0x8F4C, 0xE779, + 0x8F4D, 0x9351, 0x8F4E, 0xE77C, 0x8F57, 0xE77D, 0x8F5C, 0xE77E, 0x8F5F, 0x8D8C, 0x8F61, 0x8C44, 0x8F62, 0xE780, 0x8F63, 0xE781, + 0x8F64, 0xE782, 0x8F9B, 0x9068, 0x8F9C, 0xE783, 0x8F9E, 0x8EAB, 0x8F9F, 0xE784, 0x8FA3, 0xE785, 0x8FA7, 0x999F, 0x8FA8, 0x999E, + 0x8FAD, 0xE786, 0x8FAE, 0xE390, 0x8FAF, 0xE787, 0x8FB0, 0x9243, 0x8FB1, 0x904A, 0x8FB2, 0x945F, 0x8FB7, 0xE788, 0x8FBA, 0x95D3, + 0x8FBB, 0x92D2, 0x8FBC, 0x8D9E, 0x8FBF, 0x9248, 0x8FC2, 0x8949, 0x8FC4, 0x9698, 0x8FC5, 0x9076, 0x8FCE, 0x8C7D, 0x8FD1, 0x8BDF, + 0x8FD4, 0x95D4, 0x8FDA, 0xE789, 0x8FE2, 0xE78B, 0x8FE5, 0xE78A, 0x8FE6, 0x89DE, 0x8FE9, 0x93F4, 0x8FEA, 0xE78C, 0x8FEB, 0x9497, + 0x8FED, 0x9352, 0x8FEF, 0xE78D, 0x8FF0, 0x8F71, 0x8FF4, 0xE78F, 0x8FF7, 0x96C0, 0x8FF8, 0xE79E, 0x8FF9, 0xE791, 0x8FFA, 0xE792, + 0x8FFD, 0x92C7, 0x9000, 0x91DE, 0x9001, 0x9197, 0x9003, 0x93A6, 0x9005, 0xE790, 0x9006, 0x8B74, 0x900B, 0xE799, 0x900D, 0xE796, + 0x900E, 0xE7A3, 0x900F, 0x93A7, 0x9010, 0x9280, 0x9011, 0xE793, 0x9013, 0x92FC, 0x9014, 0x9372, 0x9015, 0xE794, 0x9016, 0xE798, + 0x9017, 0x9080, 0x9019, 0x9487, 0x901A, 0x92CA, 0x901D, 0x90C0, 0x901E, 0xE797, 0x901F, 0x91AC, 0x9020, 0x91A2, 0x9021, 0xE795, + 0x9022, 0x88A7, 0x9023, 0x9841, 0x9027, 0xE79A, 0x902E, 0x91DF, 0x9031, 0x8F54, 0x9032, 0x9069, 0x9035, 0xE79C, 0x9036, 0xE79B, + 0x9038, 0x88ED, 0x9039, 0xE79D, 0x903C, 0x954E, 0x903E, 0xE7A5, 0x9041, 0x93D9, 0x9042, 0x908B, 0x9045, 0x9278, 0x9047, 0x8BF6, + 0x9049, 0xE7A4, 0x904A, 0x9756, 0x904B, 0x895E, 0x904D, 0x95D5, 0x904E, 0x89DF, 0x904F, 0xE79F, 0x9050, 0xE7A0, 0x9051, 0xE7A1, + 0x9052, 0xE7A2, 0x9053, 0x93B9, 0x9054, 0x9242, 0x9055, 0x88E1, 0x9056, 0xE7A6, 0x9058, 0xE7A7, 0x9059, 0xEAA1, 0x905C, 0x91BB, + 0x905E, 0xE7A8, 0x9060, 0x8993, 0x9061, 0x916B, 0x9063, 0x8CAD, 0x9065, 0x9779, 0x9067, 0xFBB5, 0x9068, 0xE7A9, 0x9069, 0x934B, + 0x906D, 0x9198, 0x906E, 0x8ED5, 0x906F, 0xE7AA, 0x9072, 0xE7AD, 0x9075, 0x8F85, 0x9076, 0xE7AB, 0x9077, 0x914A, 0x9078, 0x9149, + 0x907A, 0x88E2, 0x907C, 0x97C9, 0x907D, 0xE7AF, 0x907F, 0x94F0, 0x9080, 0xE7B1, 0x9081, 0xE7B0, 0x9082, 0xE7AE, 0x9083, 0xE284, + 0x9084, 0x8AD2, 0x9087, 0xE78E, 0x9089, 0xE7B3, 0x908A, 0xE7B2, 0x908F, 0xE7B4, 0x9091, 0x9757, 0x90A3, 0x93DF, 0x90A6, 0x964D, + 0x90A8, 0xE7B5, 0x90AA, 0x8ED7, 0x90AF, 0xE7B6, 0x90B1, 0xE7B7, 0x90B5, 0xE7B8, 0x90B8, 0x9340, 0x90C1, 0x88E8, 0x90CA, 0x8D78, + 0x90CE, 0x9859, 0x90DB, 0xE7BC, 0x90DE, 0xFBB6, 0x90E1, 0x8C53, 0x90E2, 0xE7B9, 0x90E4, 0xE7BA, 0x90E8, 0x9594, 0x90ED, 0x8A73, + 0x90F5, 0x9758, 0x90F7, 0x8BBD, 0x90FD, 0x9373, 0x9102, 0xE7BD, 0x9112, 0xE7BE, 0x9115, 0xFBB8, 0x9119, 0xE7BF, 0x9127, 0xFBB9, + 0x912D, 0x9341, 0x9130, 0xE7C1, 0x9132, 0xE7C0, 0x9149, 0x93D1, 0x914A, 0xE7C2, 0x914B, 0x8F55, 0x914C, 0x8EDE, 0x914D, 0x947A, + 0x914E, 0x9291, 0x9152, 0x8EF0, 0x9154, 0x908C, 0x9156, 0xE7C3, 0x9158, 0xE7C4, 0x9162, 0x907C, 0x9163, 0xE7C5, 0x9165, 0xE7C6, + 0x9169, 0xE7C7, 0x916A, 0x978F, 0x916C, 0x8F56, 0x9172, 0xE7C9, 0x9173, 0xE7C8, 0x9175, 0x8D79, 0x9177, 0x8D93, 0x9178, 0x8E5F, + 0x9182, 0xE7CC, 0x9187, 0x8F86, 0x9189, 0xE7CB, 0x918B, 0xE7CA, 0x918D, 0x91E7, 0x9190, 0x8CED, 0x9192, 0x90C1, 0x9197, 0x94AE, + 0x919C, 0x8F58, 0x91A2, 0xE7CD, 0x91A4, 0x8FDD, 0x91AA, 0xE7D0, 0x91AB, 0xE7CE, 0x91AF, 0xE7CF, 0x91B4, 0xE7D2, 0x91B5, 0xE7D1, + 0x91B8, 0x8FF8, 0x91BA, 0xE7D3, 0x91C0, 0xE7D4, 0x91C1, 0xE7D5, 0x91C6, 0x94CE, 0x91C7, 0x8DD1, 0x91C8, 0x8EDF, 0x91C9, 0xE7D6, + 0x91CB, 0xE7D7, 0x91CC, 0x97A2, 0x91CD, 0x8F64, 0x91CE, 0x96EC, 0x91CF, 0x97CA, 0x91D0, 0xE7D8, 0x91D1, 0x8BE0, 0x91D6, 0xE7D9, + 0x91D7, 0xFBBB, 0x91D8, 0x9342, 0x91DA, 0xFBBA, 0x91DB, 0xE7DC, 0x91DC, 0x8A98, 0x91DD, 0x906A, 0x91DE, 0xFBBC, 0x91DF, 0xE7DA, + 0x91E1, 0xE7DB, 0x91E3, 0x92DE, 0x91E4, 0xFBBF, 0x91E5, 0xFBC0, 0x91E6, 0x9674, 0x91E7, 0x8BFA, 0x91ED, 0xFBBD, 0x91EE, 0xFBBE, + 0x91F5, 0xE7DE, 0x91F6, 0xE7DF, 0x91FC, 0xE7DD, 0x91FF, 0xE7E1, 0x9206, 0xFBC1, 0x920A, 0xFBC3, 0x920D, 0x93DD, 0x920E, 0x8A62, + 0x9210, 0xFBC2, 0x9211, 0xE7E5, 0x9214, 0xE7E2, 0x9215, 0xE7E4, 0x921E, 0xE7E0, 0x9229, 0xE86E, 0x922C, 0xE7E3, 0x9234, 0x97E9, + 0x9237, 0x8CD8, 0x9239, 0xFBCA, 0x923A, 0xFBC4, 0x923C, 0xFBC6, 0x923F, 0xE7ED, 0x9240, 0xFBC5, 0x9244, 0x9353, 0x9245, 0xE7E8, + 0x9248, 0xE7EB, 0x9249, 0xE7E9, 0x924B, 0xE7EE, 0x924E, 0xFBC7, 0x9250, 0xE7EF, 0x9251, 0xFBC9, 0x9257, 0xE7E7, 0x9259, 0xFBC8, + 0x925A, 0xE7F4, 0x925B, 0x8994, 0x925E, 0xE7E6, 0x9262, 0x94AB, 0x9264, 0xE7EA, 0x9266, 0x8FDE, 0x9267, 0xFBCB, 0x9271, 0x8D7A, + 0x9277, 0xFBCD, 0x9278, 0xFBCE, 0x927E, 0x9667, 0x9280, 0x8BE2, 0x9283, 0x8F65, 0x9285, 0x93BA, 0x9288, 0xFA5F, 0x9291, 0x914C, + 0x9293, 0xE7F2, 0x9295, 0xE7EC, 0x9296, 0xE7F1, 0x9298, 0x96C1, 0x929A, 0x92B6, 0x929B, 0xE7F3, 0x929C, 0xE7F0, 0x92A7, 0xFBCC, + 0x92AD, 0x914B, 0x92B7, 0xE7F7, 0x92B9, 0xE7F6, 0x92CF, 0xE7F5, 0x92D0, 0xFBD2, 0x92D2, 0x964E, 0x92D3, 0xFBD6, 0x92D5, 0xFBD4, + 0x92D7, 0xFBD0, 0x92D9, 0xFBD1, 0x92E0, 0xFBD5, 0x92E4, 0x8F9B, 0x92E7, 0xFBCF, 0x92E9, 0xE7F8, 0x92EA, 0x95DD, 0x92ED, 0x8973, + 0x92F2, 0x9565, 0x92F3, 0x9292, 0x92F8, 0x8B98, 0x92F9, 0xFA65, 0x92FA, 0xE7FA, 0x92FB, 0xFBD9, 0x92FC, 0x8D7C, 0x92FF, 0xFBDC, + 0x9302, 0xFBDE, 0x9306, 0x8E4B, 0x930F, 0xE7F9, 0x9310, 0x908D, 0x9318, 0x908E, 0x9319, 0xE840, 0x931A, 0xE842, 0x931D, 0xFBDD, + 0x931E, 0xFBDB, 0x9320, 0x8FF9, 0x9321, 0xFBD8, 0x9322, 0xE841, 0x9323, 0xE843, 0x9325, 0xFBD7, 0x9326, 0x8BD1, 0x9328, 0x9564, + 0x932B, 0x8EE0, 0x932C, 0x9842, 0x932E, 0xE7FC, 0x932F, 0x8DF6, 0x9332, 0x985E, 0x9335, 0xE845, 0x933A, 0xE844, 0x933B, 0xE846, + 0x9344, 0xE7FB, 0x9348, 0xFA5E, 0x934B, 0x93E7, 0x934D, 0x9374, 0x9354, 0x92D5, 0x9356, 0xE84B, 0x9357, 0xFBE0, 0x935B, 0x9262, + 0x935C, 0xE847, 0x9360, 0xE848, 0x936C, 0x8C4C, 0x936E, 0xE84A, 0x9370, 0xFBDF, 0x9375, 0x8CAE, 0x937C, 0xE849, 0x937E, 0x8FDF, + 0x938C, 0x8A99, 0x9394, 0xE84F, 0x9396, 0x8DBD, 0x9397, 0x9199, 0x939A, 0x92C8, 0x93A4, 0xFBE1, 0x93A7, 0x8A5A, 0x93AC, 0xE84D, + 0x93AD, 0xE84E, 0x93AE, 0x92C1, 0x93B0, 0xE84C, 0x93B9, 0xE850, 0x93C3, 0xE856, 0x93C6, 0xFBE2, 0x93C8, 0xE859, 0x93D0, 0xE858, + 0x93D1, 0x934C, 0x93D6, 0xE851, 0x93D7, 0xE852, 0x93D8, 0xE855, 0x93DD, 0xE857, 0x93DE, 0xFBE3, 0x93E1, 0x8BBE, 0x93E4, 0xE85A, + 0x93E5, 0xE854, 0x93E8, 0xE853, 0x93F8, 0xFBE4, 0x9403, 0xE85E, 0x9407, 0xE85F, 0x9410, 0xE860, 0x9413, 0xE85D, 0x9414, 0xE85C, + 0x9418, 0x8FE0, 0x9419, 0x93A8, 0x941A, 0xE85B, 0x9421, 0xE864, 0x942B, 0xE862, 0x9431, 0xFBE5, 0x9435, 0xE863, 0x9436, 0xE861, + 0x9438, 0x91F6, 0x943A, 0xE865, 0x9441, 0xE866, 0x9444, 0xE868, 0x9445, 0xFBE6, 0x9448, 0xFBE7, 0x9451, 0x8AD3, 0x9452, 0xE867, + 0x9453, 0x96F8, 0x945A, 0xE873, 0x945B, 0xE869, 0x945E, 0xE86C, 0x9460, 0xE86A, 0x9462, 0xE86B, 0x946A, 0xE86D, 0x9470, 0xE86F, + 0x9475, 0xE870, 0x9477, 0xE871, 0x947C, 0xE874, 0x947D, 0xE872, 0x947E, 0xE875, 0x947F, 0xE877, 0x9481, 0xE876, 0x9577, 0x92B7, + 0x9580, 0x96E5, 0x9582, 0xE878, 0x9583, 0x914D, 0x9587, 0xE879, 0x9589, 0x95C2, 0x958A, 0xE87A, 0x958B, 0x8A4A, 0x958F, 0x895B, + 0x9591, 0x8AD5, 0x9592, 0xFBE8, 0x9593, 0x8AD4, 0x9594, 0xE87B, 0x9596, 0xE87C, 0x9598, 0xE87D, 0x9599, 0xE87E, 0x95A0, 0xE880, + 0x95A2, 0x8AD6, 0x95A3, 0x8A74, 0x95A4, 0x8D7D, 0x95A5, 0x94B4, 0x95A7, 0xE882, 0x95A8, 0xE881, 0x95AD, 0xE883, 0x95B2, 0x897B, + 0x95B9, 0xE886, 0x95BB, 0xE885, 0x95BC, 0xE884, 0x95BE, 0xE887, 0x95C3, 0xE88A, 0x95C7, 0x88C5, 0x95CA, 0xE888, 0x95CC, 0xE88C, + 0x95CD, 0xE88B, 0x95D4, 0xE88E, 0x95D5, 0xE88D, 0x95D6, 0xE88F, 0x95D8, 0x93AC, 0x95DC, 0xE890, 0x95E1, 0xE891, 0x95E2, 0xE893, + 0x95E5, 0xE892, 0x961C, 0x958C, 0x9621, 0xE894, 0x9628, 0xE895, 0x962A, 0x8DE3, 0x962E, 0xE896, 0x962F, 0xE897, 0x9632, 0x9668, + 0x963B, 0x916A, 0x963F, 0x88A2, 0x9640, 0x91C9, 0x9642, 0xE898, 0x9644, 0x958D, 0x964B, 0xE89B, 0x964C, 0xE899, 0x964D, 0x8D7E, + 0x964F, 0xE89A, 0x9650, 0x8CC0, 0x965B, 0x95C3, 0x965C, 0xE89D, 0x965D, 0xE89F, 0x965E, 0xE89E, 0x965F, 0xE8A0, 0x9662, 0x8940, + 0x9663, 0x9077, 0x9664, 0x8F9C, 0x9665, 0x8AD7, 0x9666, 0xE8A1, 0x966A, 0x9486, 0x966C, 0xE8A3, 0x9670, 0x8941, 0x9672, 0xE8A2, + 0x9673, 0x92C2, 0x9675, 0x97CB, 0x9676, 0x93A9, 0x9677, 0xE89C, 0x9678, 0x97A4, 0x967A, 0x8CAF, 0x967D, 0x977A, 0x9685, 0x8BF7, + 0x9686, 0x97B2, 0x9688, 0x8C47, 0x968A, 0x91E0, 0x968B, 0xE440, 0x968D, 0xE8A4, 0x968E, 0x8A4B, 0x968F, 0x908F, 0x9694, 0x8A75, + 0x9695, 0xE8A6, 0x9697, 0xE8A7, 0x9698, 0xE8A5, 0x9699, 0x8C84, 0x969B, 0x8DDB, 0x969C, 0x8FE1, 0x969D, 0xFBEB, 0x96A0, 0x8942, + 0x96A3, 0x97D7, 0x96A7, 0xE8A9, 0x96A8, 0xE7AC, 0x96AA, 0xE8A8, 0x96AF, 0xFBEC, 0x96B0, 0xE8AC, 0x96B1, 0xE8AA, 0x96B2, 0xE8AB, + 0x96B4, 0xE8AD, 0x96B6, 0xE8AE, 0x96B7, 0x97EA, 0x96B8, 0xE8AF, 0x96B9, 0xE8B0, 0x96BB, 0x90C7, 0x96BC, 0x94B9, 0x96C0, 0x909D, + 0x96C1, 0x8AE5, 0x96C4, 0x9759, 0x96C5, 0x89EB, 0x96C6, 0x8F57, 0x96C7, 0x8CD9, 0x96C9, 0xE8B3, 0x96CB, 0xE8B2, 0x96CC, 0x8E93, + 0x96CD, 0xE8B4, 0x96CE, 0xE8B1, 0x96D1, 0x8E47, 0x96D5, 0xE8B8, 0x96D6, 0xE5AB, 0x96D9, 0x99D4, 0x96DB, 0x9097, 0x96DC, 0xE8B6, + 0x96E2, 0x97A3, 0x96E3, 0x93EF, 0x96E8, 0x894A, 0x96EA, 0x90E1, 0x96EB, 0x8EB4, 0x96F0, 0x95B5, 0x96F2, 0x895F, 0x96F6, 0x97EB, + 0x96F7, 0x978B, 0x96F9, 0xE8B9, 0x96FB, 0x9364, 0x9700, 0x8EF9, 0x9704, 0xE8BA, 0x9706, 0xE8BB, 0x9707, 0x906B, 0x9708, 0xE8BC, + 0x970A, 0x97EC, 0x970D, 0xE8B7, 0x970E, 0xE8BE, 0x970F, 0xE8C0, 0x9711, 0xE8BF, 0x9713, 0xE8BD, 0x9716, 0xE8C1, 0x9719, 0xE8C2, + 0x971C, 0x919A, 0x971E, 0x89E0, 0x9724, 0xE8C3, 0x9727, 0x96B6, 0x972A, 0xE8C4, 0x9730, 0xE8C5, 0x9732, 0x9849, 0x9733, 0xFBED, + 0x9738, 0x9E50, 0x9739, 0xE8C6, 0x973B, 0xFBEE, 0x973D, 0xE8C7, 0x973E, 0xE8C8, 0x9742, 0xE8CC, 0x9743, 0xFBEF, 0x9744, 0xE8C9, + 0x9746, 0xE8CA, 0x9748, 0xE8CB, 0x9749, 0xE8CD, 0x974D, 0xFBF0, 0x974F, 0xFBF1, 0x9751, 0xFBF2, 0x9752, 0x90C2, 0x9755, 0xFBF3, + 0x9756, 0x96F5, 0x9759, 0x90C3, 0x975C, 0xE8CE, 0x975E, 0x94F1, 0x9760, 0xE8CF, 0x9761, 0xEA72, 0x9762, 0x96CA, 0x9764, 0xE8D0, + 0x9766, 0xE8D1, 0x9768, 0xE8D2, 0x9769, 0x8A76, 0x976B, 0xE8D4, 0x976D, 0x9078, 0x9771, 0xE8D5, 0x9774, 0x8C43, 0x9779, 0xE8D6, + 0x977A, 0xE8DA, 0x977C, 0xE8D8, 0x9781, 0xE8D9, 0x9784, 0x8A93, 0x9785, 0xE8D7, 0x9786, 0xE8DB, 0x978B, 0xE8DC, 0x978D, 0x88C6, + 0x978F, 0xE8DD, 0x9790, 0xE8DE, 0x9798, 0x8FE2, 0x979C, 0xE8DF, 0x97A0, 0x8B66, 0x97A3, 0xE8E2, 0x97A6, 0xE8E1, 0x97A8, 0xE8E0, + 0x97AB, 0xE691, 0x97AD, 0x95DA, 0x97B3, 0xE8E3, 0x97B4, 0xE8E4, 0x97C3, 0xE8E5, 0x97C6, 0xE8E6, 0x97C8, 0xE8E7, 0x97CB, 0xE8E8, + 0x97D3, 0x8AD8, 0x97DC, 0xE8E9, 0x97ED, 0xE8EA, 0x97EE, 0x9442, 0x97F2, 0xE8EC, 0x97F3, 0x89B9, 0x97F5, 0xE8EF, 0x97F6, 0xE8EE, + 0x97FB, 0x8943, 0x97FF, 0x8BBF, 0x9801, 0x95C5, 0x9802, 0x92B8, 0x9803, 0x8DA0, 0x9805, 0x8D80, 0x9806, 0x8F87, 0x9808, 0x907B, + 0x980C, 0xE8F1, 0x980F, 0xE8F0, 0x9810, 0x9761, 0x9811, 0x8AE6, 0x9812, 0x94D0, 0x9813, 0x93DA, 0x9817, 0x909C, 0x9818, 0x97CC, + 0x981A, 0x8C7A, 0x9821, 0xE8F4, 0x9824, 0xE8F3, 0x982C, 0x966A, 0x982D, 0x93AA, 0x9834, 0x896F, 0x9837, 0xE8F5, 0x9838, 0xE8F2, + 0x983B, 0x9570, 0x983C, 0x978A, 0x983D, 0xE8F6, 0x9846, 0xE8F7, 0x984B, 0xE8F9, 0x984C, 0x91E8, 0x984D, 0x8A7A, 0x984E, 0x8A7B, + 0x984F, 0xE8F8, 0x9854, 0x8AE7, 0x9855, 0x8CB0, 0x9857, 0xFBF4, 0x9858, 0x8AE8, 0x985B, 0x935E, 0x985E, 0x97DE, 0x9865, 0xFBF5, + 0x9867, 0x8CDA, 0x986B, 0xE8FA, 0x986F, 0xE8FB, 0x9870, 0xE8FC, 0x9871, 0xE940, 0x9873, 0xE942, 0x9874, 0xE941, 0x98A8, 0x9597, + 0x98AA, 0xE943, 0x98AF, 0xE944, 0x98B1, 0xE945, 0x98B6, 0xE946, 0x98C3, 0xE948, 0x98C4, 0xE947, 0x98C6, 0xE949, 0x98DB, 0x94F2, + 0x98DC, 0xE3CA, 0x98DF, 0x9048, 0x98E2, 0x8B51, 0x98E9, 0xE94A, 0x98EB, 0xE94B, 0x98ED, 0x99AA, 0x98EE, 0x9F5A, 0x98EF, 0x94D1, + 0x98F2, 0x88F9, 0x98F4, 0x88B9, 0x98FC, 0x8E94, 0x98FD, 0x964F, 0x98FE, 0x8FFC, 0x9903, 0xE94C, 0x9905, 0x96DD, 0x9909, 0xE94D, + 0x990A, 0x977B, 0x990C, 0x8961, 0x9910, 0x8E60, 0x9912, 0xE94E, 0x9913, 0x89EC, 0x9914, 0xE94F, 0x9918, 0xE950, 0x991D, 0xE952, + 0x991E, 0xE953, 0x9920, 0xE955, 0x9921, 0xE951, 0x9924, 0xE954, 0x9927, 0xFBF8, 0x9928, 0x8AD9, 0x992C, 0xE956, 0x992E, 0xE957, + 0x993D, 0xE958, 0x993E, 0xE959, 0x9942, 0xE95A, 0x9945, 0xE95C, 0x9949, 0xE95B, 0x994B, 0xE95E, 0x994C, 0xE961, 0x9950, 0xE95D, + 0x9951, 0xE95F, 0x9952, 0xE960, 0x9955, 0xE962, 0x9957, 0x8BC0, 0x9996, 0x8EF1, 0x9997, 0xE963, 0x9998, 0xE964, 0x9999, 0x8D81, + 0x999E, 0xFBFA, 0x99A5, 0xE965, 0x99A8, 0x8A5D, 0x99AC, 0x946E, 0x99AD, 0xE966, 0x99AE, 0xE967, 0x99B3, 0x9279, 0x99B4, 0x93E9, + 0x99BC, 0xE968, 0x99C1, 0x949D, 0x99C4, 0x91CA, 0x99C5, 0x8977, 0x99C6, 0x8BEC, 0x99C8, 0x8BED, 0x99D0, 0x9293, 0x99D1, 0xE96D, + 0x99D2, 0x8BEE, 0x99D5, 0x89ED, 0x99D8, 0xE96C, 0x99DB, 0xE96A, 0x99DD, 0xE96B, 0x99DF, 0xE969, 0x99E2, 0xE977, 0x99ED, 0xE96E, + 0x99EE, 0xE96F, 0x99F1, 0xE970, 0x99F2, 0xE971, 0x99F8, 0xE973, 0x99FB, 0xE972, 0x99FF, 0x8F78, 0x9A01, 0xE974, 0x9A05, 0xE976, + 0x9A0E, 0x8B52, 0x9A0F, 0xE975, 0x9A12, 0x919B, 0x9A13, 0x8CB1, 0x9A19, 0xE978, 0x9A28, 0x91CB, 0x9A2B, 0xE979, 0x9A30, 0x93AB, + 0x9A37, 0xE97A, 0x9A3E, 0xE980, 0x9A40, 0xE97D, 0x9A42, 0xE97C, 0x9A43, 0xE97E, 0x9A45, 0xE97B, 0x9A4D, 0xE982, 0x9A4E, 0xFBFB, + 0x9A55, 0xE981, 0x9A57, 0xE984, 0x9A5A, 0x8BC1, 0x9A5B, 0xE983, 0x9A5F, 0xE985, 0x9A62, 0xE986, 0x9A64, 0xE988, 0x9A65, 0xE987, + 0x9A69, 0xE989, 0x9A6A, 0xE98B, 0x9A6B, 0xE98A, 0x9AA8, 0x8D9C, 0x9AAD, 0xE98C, 0x9AB0, 0xE98D, 0x9AB8, 0x8A5B, 0x9ABC, 0xE98E, + 0x9AC0, 0xE98F, 0x9AC4, 0x9091, 0x9ACF, 0xE990, 0x9AD1, 0xE991, 0x9AD3, 0xE992, 0x9AD4, 0xE993, 0x9AD8, 0x8D82, 0x9AD9, 0xFBFC, + 0x9ADC, 0xFC40, 0x9ADE, 0xE994, 0x9ADF, 0xE995, 0x9AE2, 0xE996, 0x9AE3, 0xE997, 0x9AE6, 0xE998, 0x9AEA, 0x94AF, 0x9AEB, 0xE99A, + 0x9AED, 0x9545, 0x9AEE, 0xE99B, 0x9AEF, 0xE999, 0x9AF1, 0xE99D, 0x9AF4, 0xE99C, 0x9AF7, 0xE99E, 0x9AFB, 0xE99F, 0x9B06, 0xE9A0, + 0x9B18, 0xE9A1, 0x9B1A, 0xE9A2, 0x9B1F, 0xE9A3, 0x9B22, 0xE9A4, 0x9B23, 0xE9A5, 0x9B25, 0xE9A6, 0x9B27, 0xE9A7, 0x9B28, 0xE9A8, + 0x9B29, 0xE9A9, 0x9B2A, 0xE9AA, 0x9B2E, 0xE9AB, 0x9B2F, 0xE9AC, 0x9B31, 0x9F54, 0x9B32, 0xE9AD, 0x9B3B, 0xE2F6, 0x9B3C, 0x8B53, + 0x9B41, 0x8A40, 0x9B42, 0x8DB0, 0x9B43, 0xE9AF, 0x9B44, 0xE9AE, 0x9B45, 0x96A3, 0x9B4D, 0xE9B1, 0x9B4E, 0xE9B2, 0x9B4F, 0xE9B0, + 0x9B51, 0xE9B3, 0x9B54, 0x9682, 0x9B58, 0xE9B4, 0x9B5A, 0x8B9B, 0x9B6F, 0x9844, 0x9B72, 0xFC42, 0x9B74, 0xE9B5, 0x9B75, 0xFC41, + 0x9B83, 0xE9B7, 0x9B8E, 0x88BC, 0x9B8F, 0xFC43, 0x9B91, 0xE9B8, 0x9B92, 0x95A9, 0x9B93, 0xE9B6, 0x9B96, 0xE9B9, 0x9B97, 0xE9BA, + 0x9B9F, 0xE9BB, 0x9BA0, 0xE9BC, 0x9BA8, 0xE9BD, 0x9BAA, 0x968E, 0x9BAB, 0x8E4C, 0x9BAD, 0x8DF8, 0x9BAE, 0x914E, 0x9BB1, 0xFC44, + 0x9BB4, 0xE9BE, 0x9BB9, 0xE9C1, 0x9BBB, 0xFC45, 0x9BC0, 0xE9BF, 0x9BC6, 0xE9C2, 0x9BC9, 0x8CEF, 0x9BCA, 0xE9C0, 0x9BCF, 0xE9C3, + 0x9BD1, 0xE9C4, 0x9BD2, 0xE9C5, 0x9BD4, 0xE9C9, 0x9BD6, 0x8E49, 0x9BDB, 0x91E2, 0x9BE1, 0xE9CA, 0x9BE2, 0xE9C7, 0x9BE3, 0xE9C6, + 0x9BE4, 0xE9C8, 0x9BE8, 0x8C7E, 0x9BF0, 0xE9CE, 0x9BF1, 0xE9CD, 0x9BF2, 0xE9CC, 0x9BF5, 0x88B1, 0x9C00, 0xFC46, 0x9C04, 0xE9D8, + 0x9C06, 0xE9D4, 0x9C08, 0xE9D5, 0x9C09, 0xE9D1, 0x9C0A, 0xE9D7, 0x9C0C, 0xE9D3, 0x9C0D, 0x8A82, 0x9C10, 0x986B, 0x9C12, 0xE9D6, + 0x9C13, 0xE9D2, 0x9C14, 0xE9D0, 0x9C15, 0xE9CF, 0x9C1B, 0xE9DA, 0x9C21, 0xE9DD, 0x9C24, 0xE9DC, 0x9C25, 0xE9DB, 0x9C2D, 0x9568, + 0x9C2E, 0xE9D9, 0x9C2F, 0x88F1, 0x9C30, 0xE9DE, 0x9C32, 0xE9E0, 0x9C39, 0x8A8F, 0x9C3A, 0xE9CB, 0x9C3B, 0x8956, 0x9C3E, 0xE9E2, + 0x9C46, 0xE9E1, 0x9C47, 0xE9DF, 0x9C48, 0x924C, 0x9C52, 0x9690, 0x9C57, 0x97D8, 0x9C5A, 0xE9E3, 0x9C60, 0xE9E4, 0x9C67, 0xE9E5, + 0x9C76, 0xE9E6, 0x9C78, 0xE9E7, 0x9CE5, 0x92B9, 0x9CE7, 0xE9E8, 0x9CE9, 0x94B5, 0x9CEB, 0xE9ED, 0x9CEC, 0xE9E9, 0x9CF0, 0xE9EA, + 0x9CF3, 0x9650, 0x9CF4, 0x96C2, 0x9CF6, 0x93CE, 0x9D03, 0xE9EE, 0x9D06, 0xE9EF, 0x9D07, 0x93BC, 0x9D08, 0xE9EC, 0x9D09, 0xE9EB, + 0x9D0E, 0x89A8, 0x9D12, 0xE9F7, 0x9D15, 0xE9F6, 0x9D1B, 0x8995, 0x9D1F, 0xE9F4, 0x9D23, 0xE9F3, 0x9D26, 0xE9F1, 0x9D28, 0x8A9B, + 0x9D2A, 0xE9F0, 0x9D2B, 0x8EB0, 0x9D2C, 0x89A7, 0x9D3B, 0x8D83, 0x9D3E, 0xE9FA, 0x9D3F, 0xE9F9, 0x9D41, 0xE9F8, 0x9D44, 0xE9F5, + 0x9D46, 0xE9FB, 0x9D48, 0xE9FC, 0x9D50, 0xEA44, 0x9D51, 0xEA43, 0x9D59, 0xEA45, 0x9D5C, 0x894C, 0x9D5D, 0xEA40, 0x9D5E, 0xEA41, + 0x9D60, 0x8D94, 0x9D61, 0x96B7, 0x9D64, 0xEA42, 0x9D6B, 0xFC48, 0x9D6C, 0x9651, 0x9D6F, 0xEA4A, 0x9D70, 0xFC47, 0x9D72, 0xEA46, + 0x9D7A, 0xEA4B, 0x9D87, 0xEA48, 0x9D89, 0xEA47, 0x9D8F, 0x8C7B, 0x9D9A, 0xEA4C, 0x9DA4, 0xEA4D, 0x9DA9, 0xEA4E, 0x9DAB, 0xEA49, + 0x9DAF, 0xE9F2, 0x9DB2, 0xEA4F, 0x9DB4, 0x92DF, 0x9DB8, 0xEA53, 0x9DBA, 0xEA54, 0x9DBB, 0xEA52, 0x9DC1, 0xEA51, 0x9DC2, 0xEA57, + 0x9DC4, 0xEA50, 0x9DC6, 0xEA55, 0x9DCF, 0xEA56, 0x9DD3, 0xEA59, 0x9DD9, 0xEA58, 0x9DE6, 0xEA5B, 0x9DED, 0xEA5C, 0x9DEF, 0xEA5D, + 0x9DF2, 0x9868, 0x9DF8, 0xEA5A, 0x9DF9, 0x91E9, 0x9DFA, 0x8DEB, 0x9DFD, 0xEA5E, 0x9E19, 0xFC4A, 0x9E1A, 0xEA5F, 0x9E1B, 0xEA60, + 0x9E1E, 0xEA61, 0x9E75, 0xEA62, 0x9E78, 0x8CB2, 0x9E79, 0xEA63, 0x9E7D, 0xEA64, 0x9E7F, 0x8EAD, 0x9E81, 0xEA65, 0x9E88, 0xEA66, + 0x9E8B, 0xEA67, 0x9E8C, 0xEA68, 0x9E91, 0xEA6B, 0x9E92, 0xEA69, 0x9E93, 0x985B, 0x9E95, 0xEA6A, 0x9E97, 0x97ED, 0x9E9D, 0xEA6C, + 0x9E9F, 0x97D9, 0x9EA5, 0xEA6D, 0x9EA6, 0x949E, 0x9EA9, 0xEA6E, 0x9EAA, 0xEA70, 0x9EAD, 0xEA71, 0x9EB8, 0xEA6F, 0x9EB9, 0x8D8D, + 0x9EBA, 0x96CB, 0x9EBB, 0x9683, 0x9EBC, 0x9BF5, 0x9EBE, 0x9F80, 0x9EBF, 0x969B, 0x9EC4, 0x89A9, 0x9ECC, 0xEA73, 0x9ECD, 0x8B6F, + 0x9ECE, 0xEA74, 0x9ECF, 0xEA75, 0x9ED0, 0xEA76, 0x9ED1, 0xFC4B, 0x9ED2, 0x8D95, 0x9ED4, 0xEA77, 0x9ED8, 0xE0D2, 0x9ED9, 0x96D9, + 0x9EDB, 0x91E1, 0x9EDC, 0xEA78, 0x9EDD, 0xEA7A, 0x9EDE, 0xEA79, 0x9EE0, 0xEA7B, 0x9EE5, 0xEA7C, 0x9EE8, 0xEA7D, 0x9EEF, 0xEA7E, + 0x9EF4, 0xEA80, 0x9EF6, 0xEA81, 0x9EF7, 0xEA82, 0x9EF9, 0xEA83, 0x9EFB, 0xEA84, 0x9EFC, 0xEA85, 0x9EFD, 0xEA86, 0x9F07, 0xEA87, + 0x9F08, 0xEA88, 0x9F0E, 0x9343, 0x9F13, 0x8CDB, 0x9F15, 0xEA8A, 0x9F20, 0x916C, 0x9F21, 0xEA8B, 0x9F2C, 0xEA8C, 0x9F3B, 0x9540, + 0x9F3E, 0xEA8D, 0x9F4A, 0xEA8E, 0x9F4B, 0xE256, 0x9F4E, 0xE6D8, 0x9F4F, 0xE8EB, 0x9F52, 0xEA8F, 0x9F54, 0xEA90, 0x9F5F, 0xEA92, + 0x9F60, 0xEA93, 0x9F61, 0xEA94, 0x9F62, 0x97EE, 0x9F63, 0xEA91, 0x9F66, 0xEA95, 0x9F67, 0xEA96, 0x9F6A, 0xEA98, 0x9F6C, 0xEA97, + 0x9F72, 0xEA9A, 0x9F76, 0xEA9B, 0x9F77, 0xEA99, 0x9F8D, 0x97B4, 0x9F95, 0xEA9C, 0x9F9C, 0xEA9D, 0x9F9D, 0xE273, 0x9FA0, 0xEA9E, + 0xF929, 0xFAE0, 0xF9DC, 0xFBE9, 0xFA0E, 0xFA90, 0xFA0F, 0xFA9B, 0xFA10, 0xFA9C, 0xFA11, 0xFAB1, 0xFA12, 0xFAD8, 0xFA13, 0xFAE8, + 0xFA14, 0xFAEA, 0xFA15, 0xFB58, 0xFA16, 0xFB5E, 0xFA17, 0xFB75, 0xFA18, 0xFB7D, 0xFA19, 0xFB7E, 0xFA1A, 0xFB80, 0xFA1B, 0xFB82, + 0xFA1C, 0xFB86, 0xFA1D, 0xFB89, 0xFA1E, 0xFB92, 0xFA1F, 0xFB9D, 0xFA20, 0xFB9F, 0xFA21, 0xFBA0, 0xFA22, 0xFBA9, 0xFA23, 0xFBB1, + 0xFA24, 0xFBB3, 0xFA25, 0xFBB4, 0xFA26, 0xFBB7, 0xFA27, 0xFBD3, 0xFA28, 0xFBDA, 0xFA29, 0xFBEA, 0xFA2A, 0xFBF6, 0xFA2B, 0xFBF7, + 0xFA2C, 0xFBF9, 0xFA2D, 0xFC49, 0xFF01, 0x8149, 0xFF02, 0xFA57, 0xFF03, 0x8194, 0xFF04, 0x8190, 0xFF05, 0x8193, 0xFF06, 0x8195, + 0xFF07, 0xFA56, 0xFF08, 0x8169, 0xFF09, 0x816A, 0xFF0A, 0x8196, 0xFF0B, 0x817B, 0xFF0C, 0x8143, 0xFF0D, 0x817C, 0xFF0E, 0x8144, + 0xFF0F, 0x815E, 0xFF10, 0x824F, 0xFF11, 0x8250, 0xFF12, 0x8251, 0xFF13, 0x8252, 0xFF14, 0x8253, 0xFF15, 0x8254, 0xFF16, 0x8255, + 0xFF17, 0x8256, 0xFF18, 0x8257, 0xFF19, 0x8258, 0xFF1A, 0x8146, 0xFF1B, 0x8147, 0xFF1C, 0x8183, 0xFF1D, 0x8181, 0xFF1E, 0x8184, + 0xFF1F, 0x8148, 0xFF20, 0x8197, 0xFF21, 0x8260, 0xFF22, 0x8261, 0xFF23, 0x8262, 0xFF24, 0x8263, 0xFF25, 0x8264, 0xFF26, 0x8265, + 0xFF27, 0x8266, 0xFF28, 0x8267, 0xFF29, 0x8268, 0xFF2A, 0x8269, 0xFF2B, 0x826A, 0xFF2C, 0x826B, 0xFF2D, 0x826C, 0xFF2E, 0x826D, + 0xFF2F, 0x826E, 0xFF30, 0x826F, 0xFF31, 0x8270, 0xFF32, 0x8271, 0xFF33, 0x8272, 0xFF34, 0x8273, 0xFF35, 0x8274, 0xFF36, 0x8275, + 0xFF37, 0x8276, 0xFF38, 0x8277, 0xFF39, 0x8278, 0xFF3A, 0x8279, 0xFF3B, 0x816D, 0xFF3C, 0x815F, 0xFF3D, 0x816E, 0xFF3E, 0x814F, + 0xFF3F, 0x8151, 0xFF40, 0x814D, 0xFF41, 0x8281, 0xFF42, 0x8282, 0xFF43, 0x8283, 0xFF44, 0x8284, 0xFF45, 0x8285, 0xFF46, 0x8286, + 0xFF47, 0x8287, 0xFF48, 0x8288, 0xFF49, 0x8289, 0xFF4A, 0x828A, 0xFF4B, 0x828B, 0xFF4C, 0x828C, 0xFF4D, 0x828D, 0xFF4E, 0x828E, + 0xFF4F, 0x828F, 0xFF50, 0x8290, 0xFF51, 0x8291, 0xFF52, 0x8292, 0xFF53, 0x8293, 0xFF54, 0x8294, 0xFF55, 0x8295, 0xFF56, 0x8296, + 0xFF57, 0x8297, 0xFF58, 0x8298, 0xFF59, 0x8299, 0xFF5A, 0x829A, 0xFF5B, 0x816F, 0xFF5C, 0x8162, 0xFF5D, 0x8170, 0xFF5E, 0x8160, + 0xFF61, 0x00A1, 0xFF62, 0x00A2, 0xFF63, 0x00A3, 0xFF64, 0x00A4, 0xFF65, 0x00A5, 0xFF66, 0x00A6, 0xFF67, 0x00A7, 0xFF68, 0x00A8, + 0xFF69, 0x00A9, 0xFF6A, 0x00AA, 0xFF6B, 0x00AB, 0xFF6C, 0x00AC, 0xFF6D, 0x00AD, 0xFF6E, 0x00AE, 0xFF6F, 0x00AF, 0xFF70, 0x00B0, + 0xFF71, 0x00B1, 0xFF72, 0x00B2, 0xFF73, 0x00B3, 0xFF74, 0x00B4, 0xFF75, 0x00B5, 0xFF76, 0x00B6, 0xFF77, 0x00B7, 0xFF78, 0x00B8, + 0xFF79, 0x00B9, 0xFF7A, 0x00BA, 0xFF7B, 0x00BB, 0xFF7C, 0x00BC, 0xFF7D, 0x00BD, 0xFF7E, 0x00BE, 0xFF7F, 0x00BF, 0xFF80, 0x00C0, + 0xFF81, 0x00C1, 0xFF82, 0x00C2, 0xFF83, 0x00C3, 0xFF84, 0x00C4, 0xFF85, 0x00C5, 0xFF86, 0x00C6, 0xFF87, 0x00C7, 0xFF88, 0x00C8, + 0xFF89, 0x00C9, 0xFF8A, 0x00CA, 0xFF8B, 0x00CB, 0xFF8C, 0x00CC, 0xFF8D, 0x00CD, 0xFF8E, 0x00CE, 0xFF8F, 0x00CF, 0xFF90, 0x00D0, + 0xFF91, 0x00D1, 0xFF92, 0x00D2, 0xFF93, 0x00D3, 0xFF94, 0x00D4, 0xFF95, 0x00D5, 0xFF96, 0x00D6, 0xFF97, 0x00D7, 0xFF98, 0x00D8, + 0xFF99, 0x00D9, 0xFF9A, 0x00DA, 0xFF9B, 0x00DB, 0xFF9C, 0x00DC, 0xFF9D, 0x00DD, 0xFF9E, 0x00DE, 0xFF9F, 0x00DF, 0xFFE0, 0x8191, + 0xFFE1, 0x8192, 0xFFE2, 0x81CA, 0xFFE3, 0x8150, 0xFFE4, 0xFA55, 0xFFE5, 0x818F, 0, 0 +}; + +static const WCHAR oem2uni932[] = { /* Shift_JIS --> Unicode pairs */ + 0x00A1, 0xFF61, 0x00A2, 0xFF62, 0x00A3, 0xFF63, 0x00A4, 0xFF64, 0x00A5, 0xFF65, 0x00A6, 0xFF66, 0x00A7, 0xFF67, 0x00A8, 0xFF68, + 0x00A9, 0xFF69, 0x00AA, 0xFF6A, 0x00AB, 0xFF6B, 0x00AC, 0xFF6C, 0x00AD, 0xFF6D, 0x00AE, 0xFF6E, 0x00AF, 0xFF6F, 0x00B0, 0xFF70, + 0x00B1, 0xFF71, 0x00B2, 0xFF72, 0x00B3, 0xFF73, 0x00B4, 0xFF74, 0x00B5, 0xFF75, 0x00B6, 0xFF76, 0x00B7, 0xFF77, 0x00B8, 0xFF78, + 0x00B9, 0xFF79, 0x00BA, 0xFF7A, 0x00BB, 0xFF7B, 0x00BC, 0xFF7C, 0x00BD, 0xFF7D, 0x00BE, 0xFF7E, 0x00BF, 0xFF7F, 0x00C0, 0xFF80, + 0x00C1, 0xFF81, 0x00C2, 0xFF82, 0x00C3, 0xFF83, 0x00C4, 0xFF84, 0x00C5, 0xFF85, 0x00C6, 0xFF86, 0x00C7, 0xFF87, 0x00C8, 0xFF88, + 0x00C9, 0xFF89, 0x00CA, 0xFF8A, 0x00CB, 0xFF8B, 0x00CC, 0xFF8C, 0x00CD, 0xFF8D, 0x00CE, 0xFF8E, 0x00CF, 0xFF8F, 0x00D0, 0xFF90, + 0x00D1, 0xFF91, 0x00D2, 0xFF92, 0x00D3, 0xFF93, 0x00D4, 0xFF94, 0x00D5, 0xFF95, 0x00D6, 0xFF96, 0x00D7, 0xFF97, 0x00D8, 0xFF98, + 0x00D9, 0xFF99, 0x00DA, 0xFF9A, 0x00DB, 0xFF9B, 0x00DC, 0xFF9C, 0x00DD, 0xFF9D, 0x00DE, 0xFF9E, 0x00DF, 0xFF9F, 0x8140, 0x3000, + 0x8141, 0x3001, 0x8142, 0x3002, 0x8143, 0xFF0C, 0x8144, 0xFF0E, 0x8145, 0x30FB, 0x8146, 0xFF1A, 0x8147, 0xFF1B, 0x8148, 0xFF1F, + 0x8149, 0xFF01, 0x814A, 0x309B, 0x814B, 0x309C, 0x814C, 0x00B4, 0x814D, 0xFF40, 0x814E, 0x00A8, 0x814F, 0xFF3E, 0x8150, 0xFFE3, + 0x8151, 0xFF3F, 0x8152, 0x30FD, 0x8153, 0x30FE, 0x8154, 0x309D, 0x8155, 0x309E, 0x8156, 0x3003, 0x8157, 0x4EDD, 0x8158, 0x3005, + 0x8159, 0x3006, 0x815A, 0x3007, 0x815B, 0x30FC, 0x815C, 0x2015, 0x815D, 0x2010, 0x815E, 0xFF0F, 0x815F, 0xFF3C, 0x8160, 0xFF5E, + 0x8161, 0x2225, 0x8162, 0xFF5C, 0x8163, 0x2026, 0x8164, 0x2025, 0x8165, 0x2018, 0x8166, 0x2019, 0x8167, 0x201C, 0x8168, 0x201D, + 0x8169, 0xFF08, 0x816A, 0xFF09, 0x816B, 0x3014, 0x816C, 0x3015, 0x816D, 0xFF3B, 0x816E, 0xFF3D, 0x816F, 0xFF5B, 0x8170, 0xFF5D, + 0x8171, 0x3008, 0x8172, 0x3009, 0x8173, 0x300A, 0x8174, 0x300B, 0x8175, 0x300C, 0x8176, 0x300D, 0x8177, 0x300E, 0x8178, 0x300F, + 0x8179, 0x3010, 0x817A, 0x3011, 0x817B, 0xFF0B, 0x817C, 0xFF0D, 0x817D, 0x00B1, 0x817E, 0x00D7, 0x8180, 0x00F7, 0x8181, 0xFF1D, + 0x8182, 0x2260, 0x8183, 0xFF1C, 0x8184, 0xFF1E, 0x8185, 0x2266, 0x8186, 0x2267, 0x8187, 0x221E, 0x8188, 0x2234, 0x8189, 0x2642, + 0x818A, 0x2640, 0x818B, 0x00B0, 0x818C, 0x2032, 0x818D, 0x2033, 0x818E, 0x2103, 0x818F, 0xFFE5, 0x8190, 0xFF04, 0x8191, 0xFFE0, + 0x8192, 0xFFE1, 0x8193, 0xFF05, 0x8194, 0xFF03, 0x8195, 0xFF06, 0x8196, 0xFF0A, 0x8197, 0xFF20, 0x8198, 0x00A7, 0x8199, 0x2606, + 0x819A, 0x2605, 0x819B, 0x25CB, 0x819C, 0x25CF, 0x819D, 0x25CE, 0x819E, 0x25C7, 0x819F, 0x25C6, 0x81A0, 0x25A1, 0x81A1, 0x25A0, + 0x81A2, 0x25B3, 0x81A3, 0x25B2, 0x81A4, 0x25BD, 0x81A5, 0x25BC, 0x81A6, 0x203B, 0x81A7, 0x3012, 0x81A8, 0x2192, 0x81A9, 0x2190, + 0x81AA, 0x2191, 0x81AB, 0x2193, 0x81AC, 0x3013, 0x81B8, 0x2208, 0x81B9, 0x220B, 0x81BA, 0x2286, 0x81BB, 0x2287, 0x81BC, 0x2282, + 0x81BD, 0x2283, 0x81BE, 0x222A, 0x81BF, 0x2229, 0x81C8, 0x2227, 0x81C9, 0x2228, 0x81CA, 0xFFE2, 0x81CB, 0x21D2, 0x81CC, 0x21D4, + 0x81CD, 0x2200, 0x81CE, 0x2203, 0x81DA, 0x2220, 0x81DB, 0x22A5, 0x81DC, 0x2312, 0x81DD, 0x2202, 0x81DE, 0x2207, 0x81DF, 0x2261, + 0x81E0, 0x2252, 0x81E1, 0x226A, 0x81E2, 0x226B, 0x81E3, 0x221A, 0x81E4, 0x223D, 0x81E5, 0x221D, 0x81E6, 0x2235, 0x81E7, 0x222B, + 0x81E8, 0x222C, 0x81F0, 0x212B, 0x81F1, 0x2030, 0x81F2, 0x266F, 0x81F3, 0x266D, 0x81F4, 0x266A, 0x81F5, 0x2020, 0x81F6, 0x2021, + 0x81F7, 0x00B6, 0x81FC, 0x25EF, 0x824F, 0xFF10, 0x8250, 0xFF11, 0x8251, 0xFF12, 0x8252, 0xFF13, 0x8253, 0xFF14, 0x8254, 0xFF15, + 0x8255, 0xFF16, 0x8256, 0xFF17, 0x8257, 0xFF18, 0x8258, 0xFF19, 0x8260, 0xFF21, 0x8261, 0xFF22, 0x8262, 0xFF23, 0x8263, 0xFF24, + 0x8264, 0xFF25, 0x8265, 0xFF26, 0x8266, 0xFF27, 0x8267, 0xFF28, 0x8268, 0xFF29, 0x8269, 0xFF2A, 0x826A, 0xFF2B, 0x826B, 0xFF2C, + 0x826C, 0xFF2D, 0x826D, 0xFF2E, 0x826E, 0xFF2F, 0x826F, 0xFF30, 0x8270, 0xFF31, 0x8271, 0xFF32, 0x8272, 0xFF33, 0x8273, 0xFF34, + 0x8274, 0xFF35, 0x8275, 0xFF36, 0x8276, 0xFF37, 0x8277, 0xFF38, 0x8278, 0xFF39, 0x8279, 0xFF3A, 0x8281, 0xFF41, 0x8282, 0xFF42, + 0x8283, 0xFF43, 0x8284, 0xFF44, 0x8285, 0xFF45, 0x8286, 0xFF46, 0x8287, 0xFF47, 0x8288, 0xFF48, 0x8289, 0xFF49, 0x828A, 0xFF4A, + 0x828B, 0xFF4B, 0x828C, 0xFF4C, 0x828D, 0xFF4D, 0x828E, 0xFF4E, 0x828F, 0xFF4F, 0x8290, 0xFF50, 0x8291, 0xFF51, 0x8292, 0xFF52, + 0x8293, 0xFF53, 0x8294, 0xFF54, 0x8295, 0xFF55, 0x8296, 0xFF56, 0x8297, 0xFF57, 0x8298, 0xFF58, 0x8299, 0xFF59, 0x829A, 0xFF5A, + 0x829F, 0x3041, 0x82A0, 0x3042, 0x82A1, 0x3043, 0x82A2, 0x3044, 0x82A3, 0x3045, 0x82A4, 0x3046, 0x82A5, 0x3047, 0x82A6, 0x3048, + 0x82A7, 0x3049, 0x82A8, 0x304A, 0x82A9, 0x304B, 0x82AA, 0x304C, 0x82AB, 0x304D, 0x82AC, 0x304E, 0x82AD, 0x304F, 0x82AE, 0x3050, + 0x82AF, 0x3051, 0x82B0, 0x3052, 0x82B1, 0x3053, 0x82B2, 0x3054, 0x82B3, 0x3055, 0x82B4, 0x3056, 0x82B5, 0x3057, 0x82B6, 0x3058, + 0x82B7, 0x3059, 0x82B8, 0x305A, 0x82B9, 0x305B, 0x82BA, 0x305C, 0x82BB, 0x305D, 0x82BC, 0x305E, 0x82BD, 0x305F, 0x82BE, 0x3060, + 0x82BF, 0x3061, 0x82C0, 0x3062, 0x82C1, 0x3063, 0x82C2, 0x3064, 0x82C3, 0x3065, 0x82C4, 0x3066, 0x82C5, 0x3067, 0x82C6, 0x3068, + 0x82C7, 0x3069, 0x82C8, 0x306A, 0x82C9, 0x306B, 0x82CA, 0x306C, 0x82CB, 0x306D, 0x82CC, 0x306E, 0x82CD, 0x306F, 0x82CE, 0x3070, + 0x82CF, 0x3071, 0x82D0, 0x3072, 0x82D1, 0x3073, 0x82D2, 0x3074, 0x82D3, 0x3075, 0x82D4, 0x3076, 0x82D5, 0x3077, 0x82D6, 0x3078, + 0x82D7, 0x3079, 0x82D8, 0x307A, 0x82D9, 0x307B, 0x82DA, 0x307C, 0x82DB, 0x307D, 0x82DC, 0x307E, 0x82DD, 0x307F, 0x82DE, 0x3080, + 0x82DF, 0x3081, 0x82E0, 0x3082, 0x82E1, 0x3083, 0x82E2, 0x3084, 0x82E3, 0x3085, 0x82E4, 0x3086, 0x82E5, 0x3087, 0x82E6, 0x3088, + 0x82E7, 0x3089, 0x82E8, 0x308A, 0x82E9, 0x308B, 0x82EA, 0x308C, 0x82EB, 0x308D, 0x82EC, 0x308E, 0x82ED, 0x308F, 0x82EE, 0x3090, + 0x82EF, 0x3091, 0x82F0, 0x3092, 0x82F1, 0x3093, 0x8340, 0x30A1, 0x8341, 0x30A2, 0x8342, 0x30A3, 0x8343, 0x30A4, 0x8344, 0x30A5, + 0x8345, 0x30A6, 0x8346, 0x30A7, 0x8347, 0x30A8, 0x8348, 0x30A9, 0x8349, 0x30AA, 0x834A, 0x30AB, 0x834B, 0x30AC, 0x834C, 0x30AD, + 0x834D, 0x30AE, 0x834E, 0x30AF, 0x834F, 0x30B0, 0x8350, 0x30B1, 0x8351, 0x30B2, 0x8352, 0x30B3, 0x8353, 0x30B4, 0x8354, 0x30B5, + 0x8355, 0x30B6, 0x8356, 0x30B7, 0x8357, 0x30B8, 0x8358, 0x30B9, 0x8359, 0x30BA, 0x835A, 0x30BB, 0x835B, 0x30BC, 0x835C, 0x30BD, + 0x835D, 0x30BE, 0x835E, 0x30BF, 0x835F, 0x30C0, 0x8360, 0x30C1, 0x8361, 0x30C2, 0x8362, 0x30C3, 0x8363, 0x30C4, 0x8364, 0x30C5, + 0x8365, 0x30C6, 0x8366, 0x30C7, 0x8367, 0x30C8, 0x8368, 0x30C9, 0x8369, 0x30CA, 0x836A, 0x30CB, 0x836B, 0x30CC, 0x836C, 0x30CD, + 0x836D, 0x30CE, 0x836E, 0x30CF, 0x836F, 0x30D0, 0x8370, 0x30D1, 0x8371, 0x30D2, 0x8372, 0x30D3, 0x8373, 0x30D4, 0x8374, 0x30D5, + 0x8375, 0x30D6, 0x8376, 0x30D7, 0x8377, 0x30D8, 0x8378, 0x30D9, 0x8379, 0x30DA, 0x837A, 0x30DB, 0x837B, 0x30DC, 0x837C, 0x30DD, + 0x837D, 0x30DE, 0x837E, 0x30DF, 0x8380, 0x30E0, 0x8381, 0x30E1, 0x8382, 0x30E2, 0x8383, 0x30E3, 0x8384, 0x30E4, 0x8385, 0x30E5, + 0x8386, 0x30E6, 0x8387, 0x30E7, 0x8388, 0x30E8, 0x8389, 0x30E9, 0x838A, 0x30EA, 0x838B, 0x30EB, 0x838C, 0x30EC, 0x838D, 0x30ED, + 0x838E, 0x30EE, 0x838F, 0x30EF, 0x8390, 0x30F0, 0x8391, 0x30F1, 0x8392, 0x30F2, 0x8393, 0x30F3, 0x8394, 0x30F4, 0x8395, 0x30F5, + 0x8396, 0x30F6, 0x839F, 0x0391, 0x83A0, 0x0392, 0x83A1, 0x0393, 0x83A2, 0x0394, 0x83A3, 0x0395, 0x83A4, 0x0396, 0x83A5, 0x0397, + 0x83A6, 0x0398, 0x83A7, 0x0399, 0x83A8, 0x039A, 0x83A9, 0x039B, 0x83AA, 0x039C, 0x83AB, 0x039D, 0x83AC, 0x039E, 0x83AD, 0x039F, + 0x83AE, 0x03A0, 0x83AF, 0x03A1, 0x83B0, 0x03A3, 0x83B1, 0x03A4, 0x83B2, 0x03A5, 0x83B3, 0x03A6, 0x83B4, 0x03A7, 0x83B5, 0x03A8, + 0x83B6, 0x03A9, 0x83BF, 0x03B1, 0x83C0, 0x03B2, 0x83C1, 0x03B3, 0x83C2, 0x03B4, 0x83C3, 0x03B5, 0x83C4, 0x03B6, 0x83C5, 0x03B7, + 0x83C6, 0x03B8, 0x83C7, 0x03B9, 0x83C8, 0x03BA, 0x83C9, 0x03BB, 0x83CA, 0x03BC, 0x83CB, 0x03BD, 0x83CC, 0x03BE, 0x83CD, 0x03BF, + 0x83CE, 0x03C0, 0x83CF, 0x03C1, 0x83D0, 0x03C3, 0x83D1, 0x03C4, 0x83D2, 0x03C5, 0x83D3, 0x03C6, 0x83D4, 0x03C7, 0x83D5, 0x03C8, + 0x83D6, 0x03C9, 0x8440, 0x0410, 0x8441, 0x0411, 0x8442, 0x0412, 0x8443, 0x0413, 0x8444, 0x0414, 0x8445, 0x0415, 0x8446, 0x0401, + 0x8447, 0x0416, 0x8448, 0x0417, 0x8449, 0x0418, 0x844A, 0x0419, 0x844B, 0x041A, 0x844C, 0x041B, 0x844D, 0x041C, 0x844E, 0x041D, + 0x844F, 0x041E, 0x8450, 0x041F, 0x8451, 0x0420, 0x8452, 0x0421, 0x8453, 0x0422, 0x8454, 0x0423, 0x8455, 0x0424, 0x8456, 0x0425, + 0x8457, 0x0426, 0x8458, 0x0427, 0x8459, 0x0428, 0x845A, 0x0429, 0x845B, 0x042A, 0x845C, 0x042B, 0x845D, 0x042C, 0x845E, 0x042D, + 0x845F, 0x042E, 0x8460, 0x042F, 0x8470, 0x0430, 0x8471, 0x0431, 0x8472, 0x0432, 0x8473, 0x0433, 0x8474, 0x0434, 0x8475, 0x0435, + 0x8476, 0x0451, 0x8477, 0x0436, 0x8478, 0x0437, 0x8479, 0x0438, 0x847A, 0x0439, 0x847B, 0x043A, 0x847C, 0x043B, 0x847D, 0x043C, + 0x847E, 0x043D, 0x8480, 0x043E, 0x8481, 0x043F, 0x8482, 0x0440, 0x8483, 0x0441, 0x8484, 0x0442, 0x8485, 0x0443, 0x8486, 0x0444, + 0x8487, 0x0445, 0x8488, 0x0446, 0x8489, 0x0447, 0x848A, 0x0448, 0x848B, 0x0449, 0x848C, 0x044A, 0x848D, 0x044B, 0x848E, 0x044C, + 0x848F, 0x044D, 0x8490, 0x044E, 0x8491, 0x044F, 0x849F, 0x2500, 0x84A0, 0x2502, 0x84A1, 0x250C, 0x84A2, 0x2510, 0x84A3, 0x2518, + 0x84A4, 0x2514, 0x84A5, 0x251C, 0x84A6, 0x252C, 0x84A7, 0x2524, 0x84A8, 0x2534, 0x84A9, 0x253C, 0x84AA, 0x2501, 0x84AB, 0x2503, + 0x84AC, 0x250F, 0x84AD, 0x2513, 0x84AE, 0x251B, 0x84AF, 0x2517, 0x84B0, 0x2523, 0x84B1, 0x2533, 0x84B2, 0x252B, 0x84B3, 0x253B, + 0x84B4, 0x254B, 0x84B5, 0x2520, 0x84B6, 0x252F, 0x84B7, 0x2528, 0x84B8, 0x2537, 0x84B9, 0x253F, 0x84BA, 0x251D, 0x84BB, 0x2530, + 0x84BC, 0x2525, 0x84BD, 0x2538, 0x84BE, 0x2542, 0x8740, 0x2460, 0x8741, 0x2461, 0x8742, 0x2462, 0x8743, 0x2463, 0x8744, 0x2464, + 0x8745, 0x2465, 0x8746, 0x2466, 0x8747, 0x2467, 0x8748, 0x2468, 0x8749, 0x2469, 0x874A, 0x246A, 0x874B, 0x246B, 0x874C, 0x246C, + 0x874D, 0x246D, 0x874E, 0x246E, 0x874F, 0x246F, 0x8750, 0x2470, 0x8751, 0x2471, 0x8752, 0x2472, 0x8753, 0x2473, 0x8754, 0x2160, + 0x8755, 0x2161, 0x8756, 0x2162, 0x8757, 0x2163, 0x8758, 0x2164, 0x8759, 0x2165, 0x875A, 0x2166, 0x875B, 0x2167, 0x875C, 0x2168, + 0x875D, 0x2169, 0x875F, 0x3349, 0x8760, 0x3314, 0x8761, 0x3322, 0x8762, 0x334D, 0x8763, 0x3318, 0x8764, 0x3327, 0x8765, 0x3303, + 0x8766, 0x3336, 0x8767, 0x3351, 0x8768, 0x3357, 0x8769, 0x330D, 0x876A, 0x3326, 0x876B, 0x3323, 0x876C, 0x332B, 0x876D, 0x334A, + 0x876E, 0x333B, 0x876F, 0x339C, 0x8770, 0x339D, 0x8771, 0x339E, 0x8772, 0x338E, 0x8773, 0x338F, 0x8774, 0x33C4, 0x8775, 0x33A1, + 0x877E, 0x337B, 0x8780, 0x301D, 0x8781, 0x301F, 0x8782, 0x2116, 0x8783, 0x33CD, 0x8784, 0x2121, 0x8785, 0x32A4, 0x8786, 0x32A5, + 0x8787, 0x32A6, 0x8788, 0x32A7, 0x8789, 0x32A8, 0x878A, 0x3231, 0x878B, 0x3232, 0x878C, 0x3239, 0x878D, 0x337E, 0x878E, 0x337D, + 0x878F, 0x337C, 0x8793, 0x222E, 0x8794, 0x2211, 0x8798, 0x221F, 0x8799, 0x22BF, 0x889F, 0x4E9C, 0x88A0, 0x5516, 0x88A1, 0x5A03, + 0x88A2, 0x963F, 0x88A3, 0x54C0, 0x88A4, 0x611B, 0x88A5, 0x6328, 0x88A6, 0x59F6, 0x88A7, 0x9022, 0x88A8, 0x8475, 0x88A9, 0x831C, + 0x88AA, 0x7A50, 0x88AB, 0x60AA, 0x88AC, 0x63E1, 0x88AD, 0x6E25, 0x88AE, 0x65ED, 0x88AF, 0x8466, 0x88B0, 0x82A6, 0x88B1, 0x9BF5, + 0x88B2, 0x6893, 0x88B3, 0x5727, 0x88B4, 0x65A1, 0x88B5, 0x6271, 0x88B6, 0x5B9B, 0x88B7, 0x59D0, 0x88B8, 0x867B, 0x88B9, 0x98F4, + 0x88BA, 0x7D62, 0x88BB, 0x7DBE, 0x88BC, 0x9B8E, 0x88BD, 0x6216, 0x88BE, 0x7C9F, 0x88BF, 0x88B7, 0x88C0, 0x5B89, 0x88C1, 0x5EB5, + 0x88C2, 0x6309, 0x88C3, 0x6697, 0x88C4, 0x6848, 0x88C5, 0x95C7, 0x88C6, 0x978D, 0x88C7, 0x674F, 0x88C8, 0x4EE5, 0x88C9, 0x4F0A, + 0x88CA, 0x4F4D, 0x88CB, 0x4F9D, 0x88CC, 0x5049, 0x88CD, 0x56F2, 0x88CE, 0x5937, 0x88CF, 0x59D4, 0x88D0, 0x5A01, 0x88D1, 0x5C09, + 0x88D2, 0x60DF, 0x88D3, 0x610F, 0x88D4, 0x6170, 0x88D5, 0x6613, 0x88D6, 0x6905, 0x88D7, 0x70BA, 0x88D8, 0x754F, 0x88D9, 0x7570, + 0x88DA, 0x79FB, 0x88DB, 0x7DAD, 0x88DC, 0x7DEF, 0x88DD, 0x80C3, 0x88DE, 0x840E, 0x88DF, 0x8863, 0x88E0, 0x8B02, 0x88E1, 0x9055, + 0x88E2, 0x907A, 0x88E3, 0x533B, 0x88E4, 0x4E95, 0x88E5, 0x4EA5, 0x88E6, 0x57DF, 0x88E7, 0x80B2, 0x88E8, 0x90C1, 0x88E9, 0x78EF, + 0x88EA, 0x4E00, 0x88EB, 0x58F1, 0x88EC, 0x6EA2, 0x88ED, 0x9038, 0x88EE, 0x7A32, 0x88EF, 0x8328, 0x88F0, 0x828B, 0x88F1, 0x9C2F, + 0x88F2, 0x5141, 0x88F3, 0x5370, 0x88F4, 0x54BD, 0x88F5, 0x54E1, 0x88F6, 0x56E0, 0x88F7, 0x59FB, 0x88F8, 0x5F15, 0x88F9, 0x98F2, + 0x88FA, 0x6DEB, 0x88FB, 0x80E4, 0x88FC, 0x852D, 0x8940, 0x9662, 0x8941, 0x9670, 0x8942, 0x96A0, 0x8943, 0x97FB, 0x8944, 0x540B, + 0x8945, 0x53F3, 0x8946, 0x5B87, 0x8947, 0x70CF, 0x8948, 0x7FBD, 0x8949, 0x8FC2, 0x894A, 0x96E8, 0x894B, 0x536F, 0x894C, 0x9D5C, + 0x894D, 0x7ABA, 0x894E, 0x4E11, 0x894F, 0x7893, 0x8950, 0x81FC, 0x8951, 0x6E26, 0x8952, 0x5618, 0x8953, 0x5504, 0x8954, 0x6B1D, + 0x8955, 0x851A, 0x8956, 0x9C3B, 0x8957, 0x59E5, 0x8958, 0x53A9, 0x8959, 0x6D66, 0x895A, 0x74DC, 0x895B, 0x958F, 0x895C, 0x5642, + 0x895D, 0x4E91, 0x895E, 0x904B, 0x895F, 0x96F2, 0x8960, 0x834F, 0x8961, 0x990C, 0x8962, 0x53E1, 0x8963, 0x55B6, 0x8964, 0x5B30, + 0x8965, 0x5F71, 0x8966, 0x6620, 0x8967, 0x66F3, 0x8968, 0x6804, 0x8969, 0x6C38, 0x896A, 0x6CF3, 0x896B, 0x6D29, 0x896C, 0x745B, + 0x896D, 0x76C8, 0x896E, 0x7A4E, 0x896F, 0x9834, 0x8970, 0x82F1, 0x8971, 0x885B, 0x8972, 0x8A60, 0x8973, 0x92ED, 0x8974, 0x6DB2, + 0x8975, 0x75AB, 0x8976, 0x76CA, 0x8977, 0x99C5, 0x8978, 0x60A6, 0x8979, 0x8B01, 0x897A, 0x8D8A, 0x897B, 0x95B2, 0x897C, 0x698E, + 0x897D, 0x53AD, 0x897E, 0x5186, 0x8980, 0x5712, 0x8981, 0x5830, 0x8982, 0x5944, 0x8983, 0x5BB4, 0x8984, 0x5EF6, 0x8985, 0x6028, + 0x8986, 0x63A9, 0x8987, 0x63F4, 0x8988, 0x6CBF, 0x8989, 0x6F14, 0x898A, 0x708E, 0x898B, 0x7114, 0x898C, 0x7159, 0x898D, 0x71D5, + 0x898E, 0x733F, 0x898F, 0x7E01, 0x8990, 0x8276, 0x8991, 0x82D1, 0x8992, 0x8597, 0x8993, 0x9060, 0x8994, 0x925B, 0x8995, 0x9D1B, + 0x8996, 0x5869, 0x8997, 0x65BC, 0x8998, 0x6C5A, 0x8999, 0x7525, 0x899A, 0x51F9, 0x899B, 0x592E, 0x899C, 0x5965, 0x899D, 0x5F80, + 0x899E, 0x5FDC, 0x899F, 0x62BC, 0x89A0, 0x65FA, 0x89A1, 0x6A2A, 0x89A2, 0x6B27, 0x89A3, 0x6BB4, 0x89A4, 0x738B, 0x89A5, 0x7FC1, + 0x89A6, 0x8956, 0x89A7, 0x9D2C, 0x89A8, 0x9D0E, 0x89A9, 0x9EC4, 0x89AA, 0x5CA1, 0x89AB, 0x6C96, 0x89AC, 0x837B, 0x89AD, 0x5104, + 0x89AE, 0x5C4B, 0x89AF, 0x61B6, 0x89B0, 0x81C6, 0x89B1, 0x6876, 0x89B2, 0x7261, 0x89B3, 0x4E59, 0x89B4, 0x4FFA, 0x89B5, 0x5378, + 0x89B6, 0x6069, 0x89B7, 0x6E29, 0x89B8, 0x7A4F, 0x89B9, 0x97F3, 0x89BA, 0x4E0B, 0x89BB, 0x5316, 0x89BC, 0x4EEE, 0x89BD, 0x4F55, + 0x89BE, 0x4F3D, 0x89BF, 0x4FA1, 0x89C0, 0x4F73, 0x89C1, 0x52A0, 0x89C2, 0x53EF, 0x89C3, 0x5609, 0x89C4, 0x590F, 0x89C5, 0x5AC1, + 0x89C6, 0x5BB6, 0x89C7, 0x5BE1, 0x89C8, 0x79D1, 0x89C9, 0x6687, 0x89CA, 0x679C, 0x89CB, 0x67B6, 0x89CC, 0x6B4C, 0x89CD, 0x6CB3, + 0x89CE, 0x706B, 0x89CF, 0x73C2, 0x89D0, 0x798D, 0x89D1, 0x79BE, 0x89D2, 0x7A3C, 0x89D3, 0x7B87, 0x89D4, 0x82B1, 0x89D5, 0x82DB, + 0x89D6, 0x8304, 0x89D7, 0x8377, 0x89D8, 0x83EF, 0x89D9, 0x83D3, 0x89DA, 0x8766, 0x89DB, 0x8AB2, 0x89DC, 0x5629, 0x89DD, 0x8CA8, + 0x89DE, 0x8FE6, 0x89DF, 0x904E, 0x89E0, 0x971E, 0x89E1, 0x868A, 0x89E2, 0x4FC4, 0x89E3, 0x5CE8, 0x89E4, 0x6211, 0x89E5, 0x7259, + 0x89E6, 0x753B, 0x89E7, 0x81E5, 0x89E8, 0x82BD, 0x89E9, 0x86FE, 0x89EA, 0x8CC0, 0x89EB, 0x96C5, 0x89EC, 0x9913, 0x89ED, 0x99D5, + 0x89EE, 0x4ECB, 0x89EF, 0x4F1A, 0x89F0, 0x89E3, 0x89F1, 0x56DE, 0x89F2, 0x584A, 0x89F3, 0x58CA, 0x89F4, 0x5EFB, 0x89F5, 0x5FEB, + 0x89F6, 0x602A, 0x89F7, 0x6094, 0x89F8, 0x6062, 0x89F9, 0x61D0, 0x89FA, 0x6212, 0x89FB, 0x62D0, 0x89FC, 0x6539, 0x8A40, 0x9B41, + 0x8A41, 0x6666, 0x8A42, 0x68B0, 0x8A43, 0x6D77, 0x8A44, 0x7070, 0x8A45, 0x754C, 0x8A46, 0x7686, 0x8A47, 0x7D75, 0x8A48, 0x82A5, + 0x8A49, 0x87F9, 0x8A4A, 0x958B, 0x8A4B, 0x968E, 0x8A4C, 0x8C9D, 0x8A4D, 0x51F1, 0x8A4E, 0x52BE, 0x8A4F, 0x5916, 0x8A50, 0x54B3, + 0x8A51, 0x5BB3, 0x8A52, 0x5D16, 0x8A53, 0x6168, 0x8A54, 0x6982, 0x8A55, 0x6DAF, 0x8A56, 0x788D, 0x8A57, 0x84CB, 0x8A58, 0x8857, + 0x8A59, 0x8A72, 0x8A5A, 0x93A7, 0x8A5B, 0x9AB8, 0x8A5C, 0x6D6C, 0x8A5D, 0x99A8, 0x8A5E, 0x86D9, 0x8A5F, 0x57A3, 0x8A60, 0x67FF, + 0x8A61, 0x86CE, 0x8A62, 0x920E, 0x8A63, 0x5283, 0x8A64, 0x5687, 0x8A65, 0x5404, 0x8A66, 0x5ED3, 0x8A67, 0x62E1, 0x8A68, 0x64B9, + 0x8A69, 0x683C, 0x8A6A, 0x6838, 0x8A6B, 0x6BBB, 0x8A6C, 0x7372, 0x8A6D, 0x78BA, 0x8A6E, 0x7A6B, 0x8A6F, 0x899A, 0x8A70, 0x89D2, + 0x8A71, 0x8D6B, 0x8A72, 0x8F03, 0x8A73, 0x90ED, 0x8A74, 0x95A3, 0x8A75, 0x9694, 0x8A76, 0x9769, 0x8A77, 0x5B66, 0x8A78, 0x5CB3, + 0x8A79, 0x697D, 0x8A7A, 0x984D, 0x8A7B, 0x984E, 0x8A7C, 0x639B, 0x8A7D, 0x7B20, 0x8A7E, 0x6A2B, 0x8A80, 0x6A7F, 0x8A81, 0x68B6, + 0x8A82, 0x9C0D, 0x8A83, 0x6F5F, 0x8A84, 0x5272, 0x8A85, 0x559D, 0x8A86, 0x6070, 0x8A87, 0x62EC, 0x8A88, 0x6D3B, 0x8A89, 0x6E07, + 0x8A8A, 0x6ED1, 0x8A8B, 0x845B, 0x8A8C, 0x8910, 0x8A8D, 0x8F44, 0x8A8E, 0x4E14, 0x8A8F, 0x9C39, 0x8A90, 0x53F6, 0x8A91, 0x691B, + 0x8A92, 0x6A3A, 0x8A93, 0x9784, 0x8A94, 0x682A, 0x8A95, 0x515C, 0x8A96, 0x7AC3, 0x8A97, 0x84B2, 0x8A98, 0x91DC, 0x8A99, 0x938C, + 0x8A9A, 0x565B, 0x8A9B, 0x9D28, 0x8A9C, 0x6822, 0x8A9D, 0x8305, 0x8A9E, 0x8431, 0x8A9F, 0x7CA5, 0x8AA0, 0x5208, 0x8AA1, 0x82C5, + 0x8AA2, 0x74E6, 0x8AA3, 0x4E7E, 0x8AA4, 0x4F83, 0x8AA5, 0x51A0, 0x8AA6, 0x5BD2, 0x8AA7, 0x520A, 0x8AA8, 0x52D8, 0x8AA9, 0x52E7, + 0x8AAA, 0x5DFB, 0x8AAB, 0x559A, 0x8AAC, 0x582A, 0x8AAD, 0x59E6, 0x8AAE, 0x5B8C, 0x8AAF, 0x5B98, 0x8AB0, 0x5BDB, 0x8AB1, 0x5E72, + 0x8AB2, 0x5E79, 0x8AB3, 0x60A3, 0x8AB4, 0x611F, 0x8AB5, 0x6163, 0x8AB6, 0x61BE, 0x8AB7, 0x63DB, 0x8AB8, 0x6562, 0x8AB9, 0x67D1, + 0x8ABA, 0x6853, 0x8ABB, 0x68FA, 0x8ABC, 0x6B3E, 0x8ABD, 0x6B53, 0x8ABE, 0x6C57, 0x8ABF, 0x6F22, 0x8AC0, 0x6F97, 0x8AC1, 0x6F45, + 0x8AC2, 0x74B0, 0x8AC3, 0x7518, 0x8AC4, 0x76E3, 0x8AC5, 0x770B, 0x8AC6, 0x7AFF, 0x8AC7, 0x7BA1, 0x8AC8, 0x7C21, 0x8AC9, 0x7DE9, + 0x8ACA, 0x7F36, 0x8ACB, 0x7FF0, 0x8ACC, 0x809D, 0x8ACD, 0x8266, 0x8ACE, 0x839E, 0x8ACF, 0x89B3, 0x8AD0, 0x8ACC, 0x8AD1, 0x8CAB, + 0x8AD2, 0x9084, 0x8AD3, 0x9451, 0x8AD4, 0x9593, 0x8AD5, 0x9591, 0x8AD6, 0x95A2, 0x8AD7, 0x9665, 0x8AD8, 0x97D3, 0x8AD9, 0x9928, + 0x8ADA, 0x8218, 0x8ADB, 0x4E38, 0x8ADC, 0x542B, 0x8ADD, 0x5CB8, 0x8ADE, 0x5DCC, 0x8ADF, 0x73A9, 0x8AE0, 0x764C, 0x8AE1, 0x773C, + 0x8AE2, 0x5CA9, 0x8AE3, 0x7FEB, 0x8AE4, 0x8D0B, 0x8AE5, 0x96C1, 0x8AE6, 0x9811, 0x8AE7, 0x9854, 0x8AE8, 0x9858, 0x8AE9, 0x4F01, + 0x8AEA, 0x4F0E, 0x8AEB, 0x5371, 0x8AEC, 0x559C, 0x8AED, 0x5668, 0x8AEE, 0x57FA, 0x8AEF, 0x5947, 0x8AF0, 0x5B09, 0x8AF1, 0x5BC4, + 0x8AF2, 0x5C90, 0x8AF3, 0x5E0C, 0x8AF4, 0x5E7E, 0x8AF5, 0x5FCC, 0x8AF6, 0x63EE, 0x8AF7, 0x673A, 0x8AF8, 0x65D7, 0x8AF9, 0x65E2, + 0x8AFA, 0x671F, 0x8AFB, 0x68CB, 0x8AFC, 0x68C4, 0x8B40, 0x6A5F, 0x8B41, 0x5E30, 0x8B42, 0x6BC5, 0x8B43, 0x6C17, 0x8B44, 0x6C7D, + 0x8B45, 0x757F, 0x8B46, 0x7948, 0x8B47, 0x5B63, 0x8B48, 0x7A00, 0x8B49, 0x7D00, 0x8B4A, 0x5FBD, 0x8B4B, 0x898F, 0x8B4C, 0x8A18, + 0x8B4D, 0x8CB4, 0x8B4E, 0x8D77, 0x8B4F, 0x8ECC, 0x8B50, 0x8F1D, 0x8B51, 0x98E2, 0x8B52, 0x9A0E, 0x8B53, 0x9B3C, 0x8B54, 0x4E80, + 0x8B55, 0x507D, 0x8B56, 0x5100, 0x8B57, 0x5993, 0x8B58, 0x5B9C, 0x8B59, 0x622F, 0x8B5A, 0x6280, 0x8B5B, 0x64EC, 0x8B5C, 0x6B3A, + 0x8B5D, 0x72A0, 0x8B5E, 0x7591, 0x8B5F, 0x7947, 0x8B60, 0x7FA9, 0x8B61, 0x87FB, 0x8B62, 0x8ABC, 0x8B63, 0x8B70, 0x8B64, 0x63AC, + 0x8B65, 0x83CA, 0x8B66, 0x97A0, 0x8B67, 0x5409, 0x8B68, 0x5403, 0x8B69, 0x55AB, 0x8B6A, 0x6854, 0x8B6B, 0x6A58, 0x8B6C, 0x8A70, + 0x8B6D, 0x7827, 0x8B6E, 0x6775, 0x8B6F, 0x9ECD, 0x8B70, 0x5374, 0x8B71, 0x5BA2, 0x8B72, 0x811A, 0x8B73, 0x8650, 0x8B74, 0x9006, + 0x8B75, 0x4E18, 0x8B76, 0x4E45, 0x8B77, 0x4EC7, 0x8B78, 0x4F11, 0x8B79, 0x53CA, 0x8B7A, 0x5438, 0x8B7B, 0x5BAE, 0x8B7C, 0x5F13, + 0x8B7D, 0x6025, 0x8B7E, 0x6551, 0x8B80, 0x673D, 0x8B81, 0x6C42, 0x8B82, 0x6C72, 0x8B83, 0x6CE3, 0x8B84, 0x7078, 0x8B85, 0x7403, + 0x8B86, 0x7A76, 0x8B87, 0x7AAE, 0x8B88, 0x7B08, 0x8B89, 0x7D1A, 0x8B8A, 0x7CFE, 0x8B8B, 0x7D66, 0x8B8C, 0x65E7, 0x8B8D, 0x725B, + 0x8B8E, 0x53BB, 0x8B8F, 0x5C45, 0x8B90, 0x5DE8, 0x8B91, 0x62D2, 0x8B92, 0x62E0, 0x8B93, 0x6319, 0x8B94, 0x6E20, 0x8B95, 0x865A, + 0x8B96, 0x8A31, 0x8B97, 0x8DDD, 0x8B98, 0x92F8, 0x8B99, 0x6F01, 0x8B9A, 0x79A6, 0x8B9B, 0x9B5A, 0x8B9C, 0x4EA8, 0x8B9D, 0x4EAB, + 0x8B9E, 0x4EAC, 0x8B9F, 0x4F9B, 0x8BA0, 0x4FA0, 0x8BA1, 0x50D1, 0x8BA2, 0x5147, 0x8BA3, 0x7AF6, 0x8BA4, 0x5171, 0x8BA5, 0x51F6, + 0x8BA6, 0x5354, 0x8BA7, 0x5321, 0x8BA8, 0x537F, 0x8BA9, 0x53EB, 0x8BAA, 0x55AC, 0x8BAB, 0x5883, 0x8BAC, 0x5CE1, 0x8BAD, 0x5F37, + 0x8BAE, 0x5F4A, 0x8BAF, 0x602F, 0x8BB0, 0x6050, 0x8BB1, 0x606D, 0x8BB2, 0x631F, 0x8BB3, 0x6559, 0x8BB4, 0x6A4B, 0x8BB5, 0x6CC1, + 0x8BB6, 0x72C2, 0x8BB7, 0x72ED, 0x8BB8, 0x77EF, 0x8BB9, 0x80F8, 0x8BBA, 0x8105, 0x8BBB, 0x8208, 0x8BBC, 0x854E, 0x8BBD, 0x90F7, + 0x8BBE, 0x93E1, 0x8BBF, 0x97FF, 0x8BC0, 0x9957, 0x8BC1, 0x9A5A, 0x8BC2, 0x4EF0, 0x8BC3, 0x51DD, 0x8BC4, 0x5C2D, 0x8BC5, 0x6681, + 0x8BC6, 0x696D, 0x8BC7, 0x5C40, 0x8BC8, 0x66F2, 0x8BC9, 0x6975, 0x8BCA, 0x7389, 0x8BCB, 0x6850, 0x8BCC, 0x7C81, 0x8BCD, 0x50C5, + 0x8BCE, 0x52E4, 0x8BCF, 0x5747, 0x8BD0, 0x5DFE, 0x8BD1, 0x9326, 0x8BD2, 0x65A4, 0x8BD3, 0x6B23, 0x8BD4, 0x6B3D, 0x8BD5, 0x7434, + 0x8BD6, 0x7981, 0x8BD7, 0x79BD, 0x8BD8, 0x7B4B, 0x8BD9, 0x7DCA, 0x8BDA, 0x82B9, 0x8BDB, 0x83CC, 0x8BDC, 0x887F, 0x8BDD, 0x895F, + 0x8BDE, 0x8B39, 0x8BDF, 0x8FD1, 0x8BE0, 0x91D1, 0x8BE1, 0x541F, 0x8BE2, 0x9280, 0x8BE3, 0x4E5D, 0x8BE4, 0x5036, 0x8BE5, 0x53E5, + 0x8BE6, 0x533A, 0x8BE7, 0x72D7, 0x8BE8, 0x7396, 0x8BE9, 0x77E9, 0x8BEA, 0x82E6, 0x8BEB, 0x8EAF, 0x8BEC, 0x99C6, 0x8BED, 0x99C8, + 0x8BEE, 0x99D2, 0x8BEF, 0x5177, 0x8BF0, 0x611A, 0x8BF1, 0x865E, 0x8BF2, 0x55B0, 0x8BF3, 0x7A7A, 0x8BF4, 0x5076, 0x8BF5, 0x5BD3, + 0x8BF6, 0x9047, 0x8BF7, 0x9685, 0x8BF8, 0x4E32, 0x8BF9, 0x6ADB, 0x8BFA, 0x91E7, 0x8BFB, 0x5C51, 0x8BFC, 0x5C48, 0x8C40, 0x6398, + 0x8C41, 0x7A9F, 0x8C42, 0x6C93, 0x8C43, 0x9774, 0x8C44, 0x8F61, 0x8C45, 0x7AAA, 0x8C46, 0x718A, 0x8C47, 0x9688, 0x8C48, 0x7C82, + 0x8C49, 0x6817, 0x8C4A, 0x7E70, 0x8C4B, 0x6851, 0x8C4C, 0x936C, 0x8C4D, 0x52F2, 0x8C4E, 0x541B, 0x8C4F, 0x85AB, 0x8C50, 0x8A13, + 0x8C51, 0x7FA4, 0x8C52, 0x8ECD, 0x8C53, 0x90E1, 0x8C54, 0x5366, 0x8C55, 0x8888, 0x8C56, 0x7941, 0x8C57, 0x4FC2, 0x8C58, 0x50BE, + 0x8C59, 0x5211, 0x8C5A, 0x5144, 0x8C5B, 0x5553, 0x8C5C, 0x572D, 0x8C5D, 0x73EA, 0x8C5E, 0x578B, 0x8C5F, 0x5951, 0x8C60, 0x5F62, + 0x8C61, 0x5F84, 0x8C62, 0x6075, 0x8C63, 0x6176, 0x8C64, 0x6167, 0x8C65, 0x61A9, 0x8C66, 0x63B2, 0x8C67, 0x643A, 0x8C68, 0x656C, + 0x8C69, 0x666F, 0x8C6A, 0x6842, 0x8C6B, 0x6E13, 0x8C6C, 0x7566, 0x8C6D, 0x7A3D, 0x8C6E, 0x7CFB, 0x8C6F, 0x7D4C, 0x8C70, 0x7D99, + 0x8C71, 0x7E4B, 0x8C72, 0x7F6B, 0x8C73, 0x830E, 0x8C74, 0x834A, 0x8C75, 0x86CD, 0x8C76, 0x8A08, 0x8C77, 0x8A63, 0x8C78, 0x8B66, + 0x8C79, 0x8EFD, 0x8C7A, 0x981A, 0x8C7B, 0x9D8F, 0x8C7C, 0x82B8, 0x8C7D, 0x8FCE, 0x8C7E, 0x9BE8, 0x8C80, 0x5287, 0x8C81, 0x621F, + 0x8C82, 0x6483, 0x8C83, 0x6FC0, 0x8C84, 0x9699, 0x8C85, 0x6841, 0x8C86, 0x5091, 0x8C87, 0x6B20, 0x8C88, 0x6C7A, 0x8C89, 0x6F54, + 0x8C8A, 0x7A74, 0x8C8B, 0x7D50, 0x8C8C, 0x8840, 0x8C8D, 0x8A23, 0x8C8E, 0x6708, 0x8C8F, 0x4EF6, 0x8C90, 0x5039, 0x8C91, 0x5026, + 0x8C92, 0x5065, 0x8C93, 0x517C, 0x8C94, 0x5238, 0x8C95, 0x5263, 0x8C96, 0x55A7, 0x8C97, 0x570F, 0x8C98, 0x5805, 0x8C99, 0x5ACC, + 0x8C9A, 0x5EFA, 0x8C9B, 0x61B2, 0x8C9C, 0x61F8, 0x8C9D, 0x62F3, 0x8C9E, 0x6372, 0x8C9F, 0x691C, 0x8CA0, 0x6A29, 0x8CA1, 0x727D, + 0x8CA2, 0x72AC, 0x8CA3, 0x732E, 0x8CA4, 0x7814, 0x8CA5, 0x786F, 0x8CA6, 0x7D79, 0x8CA7, 0x770C, 0x8CA8, 0x80A9, 0x8CA9, 0x898B, + 0x8CAA, 0x8B19, 0x8CAB, 0x8CE2, 0x8CAC, 0x8ED2, 0x8CAD, 0x9063, 0x8CAE, 0x9375, 0x8CAF, 0x967A, 0x8CB0, 0x9855, 0x8CB1, 0x9A13, + 0x8CB2, 0x9E78, 0x8CB3, 0x5143, 0x8CB4, 0x539F, 0x8CB5, 0x53B3, 0x8CB6, 0x5E7B, 0x8CB7, 0x5F26, 0x8CB8, 0x6E1B, 0x8CB9, 0x6E90, + 0x8CBA, 0x7384, 0x8CBB, 0x73FE, 0x8CBC, 0x7D43, 0x8CBD, 0x8237, 0x8CBE, 0x8A00, 0x8CBF, 0x8AFA, 0x8CC0, 0x9650, 0x8CC1, 0x4E4E, + 0x8CC2, 0x500B, 0x8CC3, 0x53E4, 0x8CC4, 0x547C, 0x8CC5, 0x56FA, 0x8CC6, 0x59D1, 0x8CC7, 0x5B64, 0x8CC8, 0x5DF1, 0x8CC9, 0x5EAB, + 0x8CCA, 0x5F27, 0x8CCB, 0x6238, 0x8CCC, 0x6545, 0x8CCD, 0x67AF, 0x8CCE, 0x6E56, 0x8CCF, 0x72D0, 0x8CD0, 0x7CCA, 0x8CD1, 0x88B4, + 0x8CD2, 0x80A1, 0x8CD3, 0x80E1, 0x8CD4, 0x83F0, 0x8CD5, 0x864E, 0x8CD6, 0x8A87, 0x8CD7, 0x8DE8, 0x8CD8, 0x9237, 0x8CD9, 0x96C7, + 0x8CDA, 0x9867, 0x8CDB, 0x9F13, 0x8CDC, 0x4E94, 0x8CDD, 0x4E92, 0x8CDE, 0x4F0D, 0x8CDF, 0x5348, 0x8CE0, 0x5449, 0x8CE1, 0x543E, + 0x8CE2, 0x5A2F, 0x8CE3, 0x5F8C, 0x8CE4, 0x5FA1, 0x8CE5, 0x609F, 0x8CE6, 0x68A7, 0x8CE7, 0x6A8E, 0x8CE8, 0x745A, 0x8CE9, 0x7881, + 0x8CEA, 0x8A9E, 0x8CEB, 0x8AA4, 0x8CEC, 0x8B77, 0x8CED, 0x9190, 0x8CEE, 0x4E5E, 0x8CEF, 0x9BC9, 0x8CF0, 0x4EA4, 0x8CF1, 0x4F7C, + 0x8CF2, 0x4FAF, 0x8CF3, 0x5019, 0x8CF4, 0x5016, 0x8CF5, 0x5149, 0x8CF6, 0x516C, 0x8CF7, 0x529F, 0x8CF8, 0x52B9, 0x8CF9, 0x52FE, + 0x8CFA, 0x539A, 0x8CFB, 0x53E3, 0x8CFC, 0x5411, 0x8D40, 0x540E, 0x8D41, 0x5589, 0x8D42, 0x5751, 0x8D43, 0x57A2, 0x8D44, 0x597D, + 0x8D45, 0x5B54, 0x8D46, 0x5B5D, 0x8D47, 0x5B8F, 0x8D48, 0x5DE5, 0x8D49, 0x5DE7, 0x8D4A, 0x5DF7, 0x8D4B, 0x5E78, 0x8D4C, 0x5E83, + 0x8D4D, 0x5E9A, 0x8D4E, 0x5EB7, 0x8D4F, 0x5F18, 0x8D50, 0x6052, 0x8D51, 0x614C, 0x8D52, 0x6297, 0x8D53, 0x62D8, 0x8D54, 0x63A7, + 0x8D55, 0x653B, 0x8D56, 0x6602, 0x8D57, 0x6643, 0x8D58, 0x66F4, 0x8D59, 0x676D, 0x8D5A, 0x6821, 0x8D5B, 0x6897, 0x8D5C, 0x69CB, + 0x8D5D, 0x6C5F, 0x8D5E, 0x6D2A, 0x8D5F, 0x6D69, 0x8D60, 0x6E2F, 0x8D61, 0x6E9D, 0x8D62, 0x7532, 0x8D63, 0x7687, 0x8D64, 0x786C, + 0x8D65, 0x7A3F, 0x8D66, 0x7CE0, 0x8D67, 0x7D05, 0x8D68, 0x7D18, 0x8D69, 0x7D5E, 0x8D6A, 0x7DB1, 0x8D6B, 0x8015, 0x8D6C, 0x8003, + 0x8D6D, 0x80AF, 0x8D6E, 0x80B1, 0x8D6F, 0x8154, 0x8D70, 0x818F, 0x8D71, 0x822A, 0x8D72, 0x8352, 0x8D73, 0x884C, 0x8D74, 0x8861, + 0x8D75, 0x8B1B, 0x8D76, 0x8CA2, 0x8D77, 0x8CFC, 0x8D78, 0x90CA, 0x8D79, 0x9175, 0x8D7A, 0x9271, 0x8D7B, 0x783F, 0x8D7C, 0x92FC, + 0x8D7D, 0x95A4, 0x8D7E, 0x964D, 0x8D80, 0x9805, 0x8D81, 0x9999, 0x8D82, 0x9AD8, 0x8D83, 0x9D3B, 0x8D84, 0x525B, 0x8D85, 0x52AB, + 0x8D86, 0x53F7, 0x8D87, 0x5408, 0x8D88, 0x58D5, 0x8D89, 0x62F7, 0x8D8A, 0x6FE0, 0x8D8B, 0x8C6A, 0x8D8C, 0x8F5F, 0x8D8D, 0x9EB9, + 0x8D8E, 0x514B, 0x8D8F, 0x523B, 0x8D90, 0x544A, 0x8D91, 0x56FD, 0x8D92, 0x7A40, 0x8D93, 0x9177, 0x8D94, 0x9D60, 0x8D95, 0x9ED2, + 0x8D96, 0x7344, 0x8D97, 0x6F09, 0x8D98, 0x8170, 0x8D99, 0x7511, 0x8D9A, 0x5FFD, 0x8D9B, 0x60DA, 0x8D9C, 0x9AA8, 0x8D9D, 0x72DB, + 0x8D9E, 0x8FBC, 0x8D9F, 0x6B64, 0x8DA0, 0x9803, 0x8DA1, 0x4ECA, 0x8DA2, 0x56F0, 0x8DA3, 0x5764, 0x8DA4, 0x58BE, 0x8DA5, 0x5A5A, + 0x8DA6, 0x6068, 0x8DA7, 0x61C7, 0x8DA8, 0x660F, 0x8DA9, 0x6606, 0x8DAA, 0x6839, 0x8DAB, 0x68B1, 0x8DAC, 0x6DF7, 0x8DAD, 0x75D5, + 0x8DAE, 0x7D3A, 0x8DAF, 0x826E, 0x8DB0, 0x9B42, 0x8DB1, 0x4E9B, 0x8DB2, 0x4F50, 0x8DB3, 0x53C9, 0x8DB4, 0x5506, 0x8DB5, 0x5D6F, + 0x8DB6, 0x5DE6, 0x8DB7, 0x5DEE, 0x8DB8, 0x67FB, 0x8DB9, 0x6C99, 0x8DBA, 0x7473, 0x8DBB, 0x7802, 0x8DBC, 0x8A50, 0x8DBD, 0x9396, + 0x8DBE, 0x88DF, 0x8DBF, 0x5750, 0x8DC0, 0x5EA7, 0x8DC1, 0x632B, 0x8DC2, 0x50B5, 0x8DC3, 0x50AC, 0x8DC4, 0x518D, 0x8DC5, 0x6700, + 0x8DC6, 0x54C9, 0x8DC7, 0x585E, 0x8DC8, 0x59BB, 0x8DC9, 0x5BB0, 0x8DCA, 0x5F69, 0x8DCB, 0x624D, 0x8DCC, 0x63A1, 0x8DCD, 0x683D, + 0x8DCE, 0x6B73, 0x8DCF, 0x6E08, 0x8DD0, 0x707D, 0x8DD1, 0x91C7, 0x8DD2, 0x7280, 0x8DD3, 0x7815, 0x8DD4, 0x7826, 0x8DD5, 0x796D, + 0x8DD6, 0x658E, 0x8DD7, 0x7D30, 0x8DD8, 0x83DC, 0x8DD9, 0x88C1, 0x8DDA, 0x8F09, 0x8DDB, 0x969B, 0x8DDC, 0x5264, 0x8DDD, 0x5728, + 0x8DDE, 0x6750, 0x8DDF, 0x7F6A, 0x8DE0, 0x8CA1, 0x8DE1, 0x51B4, 0x8DE2, 0x5742, 0x8DE3, 0x962A, 0x8DE4, 0x583A, 0x8DE5, 0x698A, + 0x8DE6, 0x80B4, 0x8DE7, 0x54B2, 0x8DE8, 0x5D0E, 0x8DE9, 0x57FC, 0x8DEA, 0x7895, 0x8DEB, 0x9DFA, 0x8DEC, 0x4F5C, 0x8DED, 0x524A, + 0x8DEE, 0x548B, 0x8DEF, 0x643E, 0x8DF0, 0x6628, 0x8DF1, 0x6714, 0x8DF2, 0x67F5, 0x8DF3, 0x7A84, 0x8DF4, 0x7B56, 0x8DF5, 0x7D22, + 0x8DF6, 0x932F, 0x8DF7, 0x685C, 0x8DF8, 0x9BAD, 0x8DF9, 0x7B39, 0x8DFA, 0x5319, 0x8DFB, 0x518A, 0x8DFC, 0x5237, 0x8E40, 0x5BDF, + 0x8E41, 0x62F6, 0x8E42, 0x64AE, 0x8E43, 0x64E6, 0x8E44, 0x672D, 0x8E45, 0x6BBA, 0x8E46, 0x85A9, 0x8E47, 0x96D1, 0x8E48, 0x7690, + 0x8E49, 0x9BD6, 0x8E4A, 0x634C, 0x8E4B, 0x9306, 0x8E4C, 0x9BAB, 0x8E4D, 0x76BF, 0x8E4E, 0x6652, 0x8E4F, 0x4E09, 0x8E50, 0x5098, + 0x8E51, 0x53C2, 0x8E52, 0x5C71, 0x8E53, 0x60E8, 0x8E54, 0x6492, 0x8E55, 0x6563, 0x8E56, 0x685F, 0x8E57, 0x71E6, 0x8E58, 0x73CA, + 0x8E59, 0x7523, 0x8E5A, 0x7B97, 0x8E5B, 0x7E82, 0x8E5C, 0x8695, 0x8E5D, 0x8B83, 0x8E5E, 0x8CDB, 0x8E5F, 0x9178, 0x8E60, 0x9910, + 0x8E61, 0x65AC, 0x8E62, 0x66AB, 0x8E63, 0x6B8B, 0x8E64, 0x4ED5, 0x8E65, 0x4ED4, 0x8E66, 0x4F3A, 0x8E67, 0x4F7F, 0x8E68, 0x523A, + 0x8E69, 0x53F8, 0x8E6A, 0x53F2, 0x8E6B, 0x55E3, 0x8E6C, 0x56DB, 0x8E6D, 0x58EB, 0x8E6E, 0x59CB, 0x8E6F, 0x59C9, 0x8E70, 0x59FF, + 0x8E71, 0x5B50, 0x8E72, 0x5C4D, 0x8E73, 0x5E02, 0x8E74, 0x5E2B, 0x8E75, 0x5FD7, 0x8E76, 0x601D, 0x8E77, 0x6307, 0x8E78, 0x652F, + 0x8E79, 0x5B5C, 0x8E7A, 0x65AF, 0x8E7B, 0x65BD, 0x8E7C, 0x65E8, 0x8E7D, 0x679D, 0x8E7E, 0x6B62, 0x8E80, 0x6B7B, 0x8E81, 0x6C0F, + 0x8E82, 0x7345, 0x8E83, 0x7949, 0x8E84, 0x79C1, 0x8E85, 0x7CF8, 0x8E86, 0x7D19, 0x8E87, 0x7D2B, 0x8E88, 0x80A2, 0x8E89, 0x8102, + 0x8E8A, 0x81F3, 0x8E8B, 0x8996, 0x8E8C, 0x8A5E, 0x8E8D, 0x8A69, 0x8E8E, 0x8A66, 0x8E8F, 0x8A8C, 0x8E90, 0x8AEE, 0x8E91, 0x8CC7, + 0x8E92, 0x8CDC, 0x8E93, 0x96CC, 0x8E94, 0x98FC, 0x8E95, 0x6B6F, 0x8E96, 0x4E8B, 0x8E97, 0x4F3C, 0x8E98, 0x4F8D, 0x8E99, 0x5150, + 0x8E9A, 0x5B57, 0x8E9B, 0x5BFA, 0x8E9C, 0x6148, 0x8E9D, 0x6301, 0x8E9E, 0x6642, 0x8E9F, 0x6B21, 0x8EA0, 0x6ECB, 0x8EA1, 0x6CBB, + 0x8EA2, 0x723E, 0x8EA3, 0x74BD, 0x8EA4, 0x75D4, 0x8EA5, 0x78C1, 0x8EA6, 0x793A, 0x8EA7, 0x800C, 0x8EA8, 0x8033, 0x8EA9, 0x81EA, + 0x8EAA, 0x8494, 0x8EAB, 0x8F9E, 0x8EAC, 0x6C50, 0x8EAD, 0x9E7F, 0x8EAE, 0x5F0F, 0x8EAF, 0x8B58, 0x8EB0, 0x9D2B, 0x8EB1, 0x7AFA, + 0x8EB2, 0x8EF8, 0x8EB3, 0x5B8D, 0x8EB4, 0x96EB, 0x8EB5, 0x4E03, 0x8EB6, 0x53F1, 0x8EB7, 0x57F7, 0x8EB8, 0x5931, 0x8EB9, 0x5AC9, + 0x8EBA, 0x5BA4, 0x8EBB, 0x6089, 0x8EBC, 0x6E7F, 0x8EBD, 0x6F06, 0x8EBE, 0x75BE, 0x8EBF, 0x8CEA, 0x8EC0, 0x5B9F, 0x8EC1, 0x8500, + 0x8EC2, 0x7BE0, 0x8EC3, 0x5072, 0x8EC4, 0x67F4, 0x8EC5, 0x829D, 0x8EC6, 0x5C61, 0x8EC7, 0x854A, 0x8EC8, 0x7E1E, 0x8EC9, 0x820E, + 0x8ECA, 0x5199, 0x8ECB, 0x5C04, 0x8ECC, 0x6368, 0x8ECD, 0x8D66, 0x8ECE, 0x659C, 0x8ECF, 0x716E, 0x8ED0, 0x793E, 0x8ED1, 0x7D17, + 0x8ED2, 0x8005, 0x8ED3, 0x8B1D, 0x8ED4, 0x8ECA, 0x8ED5, 0x906E, 0x8ED6, 0x86C7, 0x8ED7, 0x90AA, 0x8ED8, 0x501F, 0x8ED9, 0x52FA, + 0x8EDA, 0x5C3A, 0x8EDB, 0x6753, 0x8EDC, 0x707C, 0x8EDD, 0x7235, 0x8EDE, 0x914C, 0x8EDF, 0x91C8, 0x8EE0, 0x932B, 0x8EE1, 0x82E5, + 0x8EE2, 0x5BC2, 0x8EE3, 0x5F31, 0x8EE4, 0x60F9, 0x8EE5, 0x4E3B, 0x8EE6, 0x53D6, 0x8EE7, 0x5B88, 0x8EE8, 0x624B, 0x8EE9, 0x6731, + 0x8EEA, 0x6B8A, 0x8EEB, 0x72E9, 0x8EEC, 0x73E0, 0x8EED, 0x7A2E, 0x8EEE, 0x816B, 0x8EEF, 0x8DA3, 0x8EF0, 0x9152, 0x8EF1, 0x9996, + 0x8EF2, 0x5112, 0x8EF3, 0x53D7, 0x8EF4, 0x546A, 0x8EF5, 0x5BFF, 0x8EF6, 0x6388, 0x8EF7, 0x6A39, 0x8EF8, 0x7DAC, 0x8EF9, 0x9700, + 0x8EFA, 0x56DA, 0x8EFB, 0x53CE, 0x8EFC, 0x5468, 0x8F40, 0x5B97, 0x8F41, 0x5C31, 0x8F42, 0x5DDE, 0x8F43, 0x4FEE, 0x8F44, 0x6101, + 0x8F45, 0x62FE, 0x8F46, 0x6D32, 0x8F47, 0x79C0, 0x8F48, 0x79CB, 0x8F49, 0x7D42, 0x8F4A, 0x7E4D, 0x8F4B, 0x7FD2, 0x8F4C, 0x81ED, + 0x8F4D, 0x821F, 0x8F4E, 0x8490, 0x8F4F, 0x8846, 0x8F50, 0x8972, 0x8F51, 0x8B90, 0x8F52, 0x8E74, 0x8F53, 0x8F2F, 0x8F54, 0x9031, + 0x8F55, 0x914B, 0x8F56, 0x916C, 0x8F57, 0x96C6, 0x8F58, 0x919C, 0x8F59, 0x4EC0, 0x8F5A, 0x4F4F, 0x8F5B, 0x5145, 0x8F5C, 0x5341, + 0x8F5D, 0x5F93, 0x8F5E, 0x620E, 0x8F5F, 0x67D4, 0x8F60, 0x6C41, 0x8F61, 0x6E0B, 0x8F62, 0x7363, 0x8F63, 0x7E26, 0x8F64, 0x91CD, + 0x8F65, 0x9283, 0x8F66, 0x53D4, 0x8F67, 0x5919, 0x8F68, 0x5BBF, 0x8F69, 0x6DD1, 0x8F6A, 0x795D, 0x8F6B, 0x7E2E, 0x8F6C, 0x7C9B, + 0x8F6D, 0x587E, 0x8F6E, 0x719F, 0x8F6F, 0x51FA, 0x8F70, 0x8853, 0x8F71, 0x8FF0, 0x8F72, 0x4FCA, 0x8F73, 0x5CFB, 0x8F74, 0x6625, + 0x8F75, 0x77AC, 0x8F76, 0x7AE3, 0x8F77, 0x821C, 0x8F78, 0x99FF, 0x8F79, 0x51C6, 0x8F7A, 0x5FAA, 0x8F7B, 0x65EC, 0x8F7C, 0x696F, + 0x8F7D, 0x6B89, 0x8F7E, 0x6DF3, 0x8F80, 0x6E96, 0x8F81, 0x6F64, 0x8F82, 0x76FE, 0x8F83, 0x7D14, 0x8F84, 0x5DE1, 0x8F85, 0x9075, + 0x8F86, 0x9187, 0x8F87, 0x9806, 0x8F88, 0x51E6, 0x8F89, 0x521D, 0x8F8A, 0x6240, 0x8F8B, 0x6691, 0x8F8C, 0x66D9, 0x8F8D, 0x6E1A, + 0x8F8E, 0x5EB6, 0x8F8F, 0x7DD2, 0x8F90, 0x7F72, 0x8F91, 0x66F8, 0x8F92, 0x85AF, 0x8F93, 0x85F7, 0x8F94, 0x8AF8, 0x8F95, 0x52A9, + 0x8F96, 0x53D9, 0x8F97, 0x5973, 0x8F98, 0x5E8F, 0x8F99, 0x5F90, 0x8F9A, 0x6055, 0x8F9B, 0x92E4, 0x8F9C, 0x9664, 0x8F9D, 0x50B7, + 0x8F9E, 0x511F, 0x8F9F, 0x52DD, 0x8FA0, 0x5320, 0x8FA1, 0x5347, 0x8FA2, 0x53EC, 0x8FA3, 0x54E8, 0x8FA4, 0x5546, 0x8FA5, 0x5531, + 0x8FA6, 0x5617, 0x8FA7, 0x5968, 0x8FA8, 0x59BE, 0x8FA9, 0x5A3C, 0x8FAA, 0x5BB5, 0x8FAB, 0x5C06, 0x8FAC, 0x5C0F, 0x8FAD, 0x5C11, + 0x8FAE, 0x5C1A, 0x8FAF, 0x5E84, 0x8FB0, 0x5E8A, 0x8FB1, 0x5EE0, 0x8FB2, 0x5F70, 0x8FB3, 0x627F, 0x8FB4, 0x6284, 0x8FB5, 0x62DB, + 0x8FB6, 0x638C, 0x8FB7, 0x6377, 0x8FB8, 0x6607, 0x8FB9, 0x660C, 0x8FBA, 0x662D, 0x8FBB, 0x6676, 0x8FBC, 0x677E, 0x8FBD, 0x68A2, + 0x8FBE, 0x6A1F, 0x8FBF, 0x6A35, 0x8FC0, 0x6CBC, 0x8FC1, 0x6D88, 0x8FC2, 0x6E09, 0x8FC3, 0x6E58, 0x8FC4, 0x713C, 0x8FC5, 0x7126, + 0x8FC6, 0x7167, 0x8FC7, 0x75C7, 0x8FC8, 0x7701, 0x8FC9, 0x785D, 0x8FCA, 0x7901, 0x8FCB, 0x7965, 0x8FCC, 0x79F0, 0x8FCD, 0x7AE0, + 0x8FCE, 0x7B11, 0x8FCF, 0x7CA7, 0x8FD0, 0x7D39, 0x8FD1, 0x8096, 0x8FD2, 0x83D6, 0x8FD3, 0x848B, 0x8FD4, 0x8549, 0x8FD5, 0x885D, + 0x8FD6, 0x88F3, 0x8FD7, 0x8A1F, 0x8FD8, 0x8A3C, 0x8FD9, 0x8A54, 0x8FDA, 0x8A73, 0x8FDB, 0x8C61, 0x8FDC, 0x8CDE, 0x8FDD, 0x91A4, + 0x8FDE, 0x9266, 0x8FDF, 0x937E, 0x8FE0, 0x9418, 0x8FE1, 0x969C, 0x8FE2, 0x9798, 0x8FE3, 0x4E0A, 0x8FE4, 0x4E08, 0x8FE5, 0x4E1E, + 0x8FE6, 0x4E57, 0x8FE7, 0x5197, 0x8FE8, 0x5270, 0x8FE9, 0x57CE, 0x8FEA, 0x5834, 0x8FEB, 0x58CC, 0x8FEC, 0x5B22, 0x8FED, 0x5E38, + 0x8FEE, 0x60C5, 0x8FEF, 0x64FE, 0x8FF0, 0x6761, 0x8FF1, 0x6756, 0x8FF2, 0x6D44, 0x8FF3, 0x72B6, 0x8FF4, 0x7573, 0x8FF5, 0x7A63, + 0x8FF6, 0x84B8, 0x8FF7, 0x8B72, 0x8FF8, 0x91B8, 0x8FF9, 0x9320, 0x8FFA, 0x5631, 0x8FFB, 0x57F4, 0x8FFC, 0x98FE, 0x9040, 0x62ED, + 0x9041, 0x690D, 0x9042, 0x6B96, 0x9043, 0x71ED, 0x9044, 0x7E54, 0x9045, 0x8077, 0x9046, 0x8272, 0x9047, 0x89E6, 0x9048, 0x98DF, + 0x9049, 0x8755, 0x904A, 0x8FB1, 0x904B, 0x5C3B, 0x904C, 0x4F38, 0x904D, 0x4FE1, 0x904E, 0x4FB5, 0x904F, 0x5507, 0x9050, 0x5A20, + 0x9051, 0x5BDD, 0x9052, 0x5BE9, 0x9053, 0x5FC3, 0x9054, 0x614E, 0x9055, 0x632F, 0x9056, 0x65B0, 0x9057, 0x664B, 0x9058, 0x68EE, + 0x9059, 0x699B, 0x905A, 0x6D78, 0x905B, 0x6DF1, 0x905C, 0x7533, 0x905D, 0x75B9, 0x905E, 0x771F, 0x905F, 0x795E, 0x9060, 0x79E6, + 0x9061, 0x7D33, 0x9062, 0x81E3, 0x9063, 0x82AF, 0x9064, 0x85AA, 0x9065, 0x89AA, 0x9066, 0x8A3A, 0x9067, 0x8EAB, 0x9068, 0x8F9B, + 0x9069, 0x9032, 0x906A, 0x91DD, 0x906B, 0x9707, 0x906C, 0x4EBA, 0x906D, 0x4EC1, 0x906E, 0x5203, 0x906F, 0x5875, 0x9070, 0x58EC, + 0x9071, 0x5C0B, 0x9072, 0x751A, 0x9073, 0x5C3D, 0x9074, 0x814E, 0x9075, 0x8A0A, 0x9076, 0x8FC5, 0x9077, 0x9663, 0x9078, 0x976D, + 0x9079, 0x7B25, 0x907A, 0x8ACF, 0x907B, 0x9808, 0x907C, 0x9162, 0x907D, 0x56F3, 0x907E, 0x53A8, 0x9080, 0x9017, 0x9081, 0x5439, + 0x9082, 0x5782, 0x9083, 0x5E25, 0x9084, 0x63A8, 0x9085, 0x6C34, 0x9086, 0x708A, 0x9087, 0x7761, 0x9088, 0x7C8B, 0x9089, 0x7FE0, + 0x908A, 0x8870, 0x908B, 0x9042, 0x908C, 0x9154, 0x908D, 0x9310, 0x908E, 0x9318, 0x908F, 0x968F, 0x9090, 0x745E, 0x9091, 0x9AC4, + 0x9092, 0x5D07, 0x9093, 0x5D69, 0x9094, 0x6570, 0x9095, 0x67A2, 0x9096, 0x8DA8, 0x9097, 0x96DB, 0x9098, 0x636E, 0x9099, 0x6749, + 0x909A, 0x6919, 0x909B, 0x83C5, 0x909C, 0x9817, 0x909D, 0x96C0, 0x909E, 0x88FE, 0x909F, 0x6F84, 0x90A0, 0x647A, 0x90A1, 0x5BF8, + 0x90A2, 0x4E16, 0x90A3, 0x702C, 0x90A4, 0x755D, 0x90A5, 0x662F, 0x90A6, 0x51C4, 0x90A7, 0x5236, 0x90A8, 0x52E2, 0x90A9, 0x59D3, + 0x90AA, 0x5F81, 0x90AB, 0x6027, 0x90AC, 0x6210, 0x90AD, 0x653F, 0x90AE, 0x6574, 0x90AF, 0x661F, 0x90B0, 0x6674, 0x90B1, 0x68F2, + 0x90B2, 0x6816, 0x90B3, 0x6B63, 0x90B4, 0x6E05, 0x90B5, 0x7272, 0x90B6, 0x751F, 0x90B7, 0x76DB, 0x90B8, 0x7CBE, 0x90B9, 0x8056, + 0x90BA, 0x58F0, 0x90BB, 0x88FD, 0x90BC, 0x897F, 0x90BD, 0x8AA0, 0x90BE, 0x8A93, 0x90BF, 0x8ACB, 0x90C0, 0x901D, 0x90C1, 0x9192, + 0x90C2, 0x9752, 0x90C3, 0x9759, 0x90C4, 0x6589, 0x90C5, 0x7A0E, 0x90C6, 0x8106, 0x90C7, 0x96BB, 0x90C8, 0x5E2D, 0x90C9, 0x60DC, + 0x90CA, 0x621A, 0x90CB, 0x65A5, 0x90CC, 0x6614, 0x90CD, 0x6790, 0x90CE, 0x77F3, 0x90CF, 0x7A4D, 0x90D0, 0x7C4D, 0x90D1, 0x7E3E, + 0x90D2, 0x810A, 0x90D3, 0x8CAC, 0x90D4, 0x8D64, 0x90D5, 0x8DE1, 0x90D6, 0x8E5F, 0x90D7, 0x78A9, 0x90D8, 0x5207, 0x90D9, 0x62D9, + 0x90DA, 0x63A5, 0x90DB, 0x6442, 0x90DC, 0x6298, 0x90DD, 0x8A2D, 0x90DE, 0x7A83, 0x90DF, 0x7BC0, 0x90E0, 0x8AAC, 0x90E1, 0x96EA, + 0x90E2, 0x7D76, 0x90E3, 0x820C, 0x90E4, 0x8749, 0x90E5, 0x4ED9, 0x90E6, 0x5148, 0x90E7, 0x5343, 0x90E8, 0x5360, 0x90E9, 0x5BA3, + 0x90EA, 0x5C02, 0x90EB, 0x5C16, 0x90EC, 0x5DDD, 0x90ED, 0x6226, 0x90EE, 0x6247, 0x90EF, 0x64B0, 0x90F0, 0x6813, 0x90F1, 0x6834, + 0x90F2, 0x6CC9, 0x90F3, 0x6D45, 0x90F4, 0x6D17, 0x90F5, 0x67D3, 0x90F6, 0x6F5C, 0x90F7, 0x714E, 0x90F8, 0x717D, 0x90F9, 0x65CB, + 0x90FA, 0x7A7F, 0x90FB, 0x7BAD, 0x90FC, 0x7DDA, 0x9140, 0x7E4A, 0x9141, 0x7FA8, 0x9142, 0x817A, 0x9143, 0x821B, 0x9144, 0x8239, + 0x9145, 0x85A6, 0x9146, 0x8A6E, 0x9147, 0x8CCE, 0x9148, 0x8DF5, 0x9149, 0x9078, 0x914A, 0x9077, 0x914B, 0x92AD, 0x914C, 0x9291, + 0x914D, 0x9583, 0x914E, 0x9BAE, 0x914F, 0x524D, 0x9150, 0x5584, 0x9151, 0x6F38, 0x9152, 0x7136, 0x9153, 0x5168, 0x9154, 0x7985, + 0x9155, 0x7E55, 0x9156, 0x81B3, 0x9157, 0x7CCE, 0x9158, 0x564C, 0x9159, 0x5851, 0x915A, 0x5CA8, 0x915B, 0x63AA, 0x915C, 0x66FE, + 0x915D, 0x66FD, 0x915E, 0x695A, 0x915F, 0x72D9, 0x9160, 0x758F, 0x9161, 0x758E, 0x9162, 0x790E, 0x9163, 0x7956, 0x9164, 0x79DF, + 0x9165, 0x7C97, 0x9166, 0x7D20, 0x9167, 0x7D44, 0x9168, 0x8607, 0x9169, 0x8A34, 0x916A, 0x963B, 0x916B, 0x9061, 0x916C, 0x9F20, + 0x916D, 0x50E7, 0x916E, 0x5275, 0x916F, 0x53CC, 0x9170, 0x53E2, 0x9171, 0x5009, 0x9172, 0x55AA, 0x9173, 0x58EE, 0x9174, 0x594F, + 0x9175, 0x723D, 0x9176, 0x5B8B, 0x9177, 0x5C64, 0x9178, 0x531D, 0x9179, 0x60E3, 0x917A, 0x60F3, 0x917B, 0x635C, 0x917C, 0x6383, + 0x917D, 0x633F, 0x917E, 0x63BB, 0x9180, 0x64CD, 0x9181, 0x65E9, 0x9182, 0x66F9, 0x9183, 0x5DE3, 0x9184, 0x69CD, 0x9185, 0x69FD, + 0x9186, 0x6F15, 0x9187, 0x71E5, 0x9188, 0x4E89, 0x9189, 0x75E9, 0x918A, 0x76F8, 0x918B, 0x7A93, 0x918C, 0x7CDF, 0x918D, 0x7DCF, + 0x918E, 0x7D9C, 0x918F, 0x8061, 0x9190, 0x8349, 0x9191, 0x8358, 0x9192, 0x846C, 0x9193, 0x84BC, 0x9194, 0x85FB, 0x9195, 0x88C5, + 0x9196, 0x8D70, 0x9197, 0x9001, 0x9198, 0x906D, 0x9199, 0x9397, 0x919A, 0x971C, 0x919B, 0x9A12, 0x919C, 0x50CF, 0x919D, 0x5897, + 0x919E, 0x618E, 0x919F, 0x81D3, 0x91A0, 0x8535, 0x91A1, 0x8D08, 0x91A2, 0x9020, 0x91A3, 0x4FC3, 0x91A4, 0x5074, 0x91A5, 0x5247, + 0x91A6, 0x5373, 0x91A7, 0x606F, 0x91A8, 0x6349, 0x91A9, 0x675F, 0x91AA, 0x6E2C, 0x91AB, 0x8DB3, 0x91AC, 0x901F, 0x91AD, 0x4FD7, + 0x91AE, 0x5C5E, 0x91AF, 0x8CCA, 0x91B0, 0x65CF, 0x91B1, 0x7D9A, 0x91B2, 0x5352, 0x91B3, 0x8896, 0x91B4, 0x5176, 0x91B5, 0x63C3, + 0x91B6, 0x5B58, 0x91B7, 0x5B6B, 0x91B8, 0x5C0A, 0x91B9, 0x640D, 0x91BA, 0x6751, 0x91BB, 0x905C, 0x91BC, 0x4ED6, 0x91BD, 0x591A, + 0x91BE, 0x592A, 0x91BF, 0x6C70, 0x91C0, 0x8A51, 0x91C1, 0x553E, 0x91C2, 0x5815, 0x91C3, 0x59A5, 0x91C4, 0x60F0, 0x91C5, 0x6253, + 0x91C6, 0x67C1, 0x91C7, 0x8235, 0x91C8, 0x6955, 0x91C9, 0x9640, 0x91CA, 0x99C4, 0x91CB, 0x9A28, 0x91CC, 0x4F53, 0x91CD, 0x5806, + 0x91CE, 0x5BFE, 0x91CF, 0x8010, 0x91D0, 0x5CB1, 0x91D1, 0x5E2F, 0x91D2, 0x5F85, 0x91D3, 0x6020, 0x91D4, 0x614B, 0x91D5, 0x6234, + 0x91D6, 0x66FF, 0x91D7, 0x6CF0, 0x91D8, 0x6EDE, 0x91D9, 0x80CE, 0x91DA, 0x817F, 0x91DB, 0x82D4, 0x91DC, 0x888B, 0x91DD, 0x8CB8, + 0x91DE, 0x9000, 0x91DF, 0x902E, 0x91E0, 0x968A, 0x91E1, 0x9EDB, 0x91E2, 0x9BDB, 0x91E3, 0x4EE3, 0x91E4, 0x53F0, 0x91E5, 0x5927, + 0x91E6, 0x7B2C, 0x91E7, 0x918D, 0x91E8, 0x984C, 0x91E9, 0x9DF9, 0x91EA, 0x6EDD, 0x91EB, 0x7027, 0x91EC, 0x5353, 0x91ED, 0x5544, + 0x91EE, 0x5B85, 0x91EF, 0x6258, 0x91F0, 0x629E, 0x91F1, 0x62D3, 0x91F2, 0x6CA2, 0x91F3, 0x6FEF, 0x91F4, 0x7422, 0x91F5, 0x8A17, + 0x91F6, 0x9438, 0x91F7, 0x6FC1, 0x91F8, 0x8AFE, 0x91F9, 0x8338, 0x91FA, 0x51E7, 0x91FB, 0x86F8, 0x91FC, 0x53EA, 0x9240, 0x53E9, + 0x9241, 0x4F46, 0x9242, 0x9054, 0x9243, 0x8FB0, 0x9244, 0x596A, 0x9245, 0x8131, 0x9246, 0x5DFD, 0x9247, 0x7AEA, 0x9248, 0x8FBF, + 0x9249, 0x68DA, 0x924A, 0x8C37, 0x924B, 0x72F8, 0x924C, 0x9C48, 0x924D, 0x6A3D, 0x924E, 0x8AB0, 0x924F, 0x4E39, 0x9250, 0x5358, + 0x9251, 0x5606, 0x9252, 0x5766, 0x9253, 0x62C5, 0x9254, 0x63A2, 0x9255, 0x65E6, 0x9256, 0x6B4E, 0x9257, 0x6DE1, 0x9258, 0x6E5B, + 0x9259, 0x70AD, 0x925A, 0x77ED, 0x925B, 0x7AEF, 0x925C, 0x7BAA, 0x925D, 0x7DBB, 0x925E, 0x803D, 0x925F, 0x80C6, 0x9260, 0x86CB, + 0x9261, 0x8A95, 0x9262, 0x935B, 0x9263, 0x56E3, 0x9264, 0x58C7, 0x9265, 0x5F3E, 0x9266, 0x65AD, 0x9267, 0x6696, 0x9268, 0x6A80, + 0x9269, 0x6BB5, 0x926A, 0x7537, 0x926B, 0x8AC7, 0x926C, 0x5024, 0x926D, 0x77E5, 0x926E, 0x5730, 0x926F, 0x5F1B, 0x9270, 0x6065, + 0x9271, 0x667A, 0x9272, 0x6C60, 0x9273, 0x75F4, 0x9274, 0x7A1A, 0x9275, 0x7F6E, 0x9276, 0x81F4, 0x9277, 0x8718, 0x9278, 0x9045, + 0x9279, 0x99B3, 0x927A, 0x7BC9, 0x927B, 0x755C, 0x927C, 0x7AF9, 0x927D, 0x7B51, 0x927E, 0x84C4, 0x9280, 0x9010, 0x9281, 0x79E9, + 0x9282, 0x7A92, 0x9283, 0x8336, 0x9284, 0x5AE1, 0x9285, 0x7740, 0x9286, 0x4E2D, 0x9287, 0x4EF2, 0x9288, 0x5B99, 0x9289, 0x5FE0, + 0x928A, 0x62BD, 0x928B, 0x663C, 0x928C, 0x67F1, 0x928D, 0x6CE8, 0x928E, 0x866B, 0x928F, 0x8877, 0x9290, 0x8A3B, 0x9291, 0x914E, + 0x9292, 0x92F3, 0x9293, 0x99D0, 0x9294, 0x6A17, 0x9295, 0x7026, 0x9296, 0x732A, 0x9297, 0x82E7, 0x9298, 0x8457, 0x9299, 0x8CAF, + 0x929A, 0x4E01, 0x929B, 0x5146, 0x929C, 0x51CB, 0x929D, 0x558B, 0x929E, 0x5BF5, 0x929F, 0x5E16, 0x92A0, 0x5E33, 0x92A1, 0x5E81, + 0x92A2, 0x5F14, 0x92A3, 0x5F35, 0x92A4, 0x5F6B, 0x92A5, 0x5FB4, 0x92A6, 0x61F2, 0x92A7, 0x6311, 0x92A8, 0x66A2, 0x92A9, 0x671D, + 0x92AA, 0x6F6E, 0x92AB, 0x7252, 0x92AC, 0x753A, 0x92AD, 0x773A, 0x92AE, 0x8074, 0x92AF, 0x8139, 0x92B0, 0x8178, 0x92B1, 0x8776, + 0x92B2, 0x8ABF, 0x92B3, 0x8ADC, 0x92B4, 0x8D85, 0x92B5, 0x8DF3, 0x92B6, 0x929A, 0x92B7, 0x9577, 0x92B8, 0x9802, 0x92B9, 0x9CE5, + 0x92BA, 0x52C5, 0x92BB, 0x6357, 0x92BC, 0x76F4, 0x92BD, 0x6715, 0x92BE, 0x6C88, 0x92BF, 0x73CD, 0x92C0, 0x8CC3, 0x92C1, 0x93AE, + 0x92C2, 0x9673, 0x92C3, 0x6D25, 0x92C4, 0x589C, 0x92C5, 0x690E, 0x92C6, 0x69CC, 0x92C7, 0x8FFD, 0x92C8, 0x939A, 0x92C9, 0x75DB, + 0x92CA, 0x901A, 0x92CB, 0x585A, 0x92CC, 0x6802, 0x92CD, 0x63B4, 0x92CE, 0x69FB, 0x92CF, 0x4F43, 0x92D0, 0x6F2C, 0x92D1, 0x67D8, + 0x92D2, 0x8FBB, 0x92D3, 0x8526, 0x92D4, 0x7DB4, 0x92D5, 0x9354, 0x92D6, 0x693F, 0x92D7, 0x6F70, 0x92D8, 0x576A, 0x92D9, 0x58F7, + 0x92DA, 0x5B2C, 0x92DB, 0x7D2C, 0x92DC, 0x722A, 0x92DD, 0x540A, 0x92DE, 0x91E3, 0x92DF, 0x9DB4, 0x92E0, 0x4EAD, 0x92E1, 0x4F4E, + 0x92E2, 0x505C, 0x92E3, 0x5075, 0x92E4, 0x5243, 0x92E5, 0x8C9E, 0x92E6, 0x5448, 0x92E7, 0x5824, 0x92E8, 0x5B9A, 0x92E9, 0x5E1D, + 0x92EA, 0x5E95, 0x92EB, 0x5EAD, 0x92EC, 0x5EF7, 0x92ED, 0x5F1F, 0x92EE, 0x608C, 0x92EF, 0x62B5, 0x92F0, 0x633A, 0x92F1, 0x63D0, + 0x92F2, 0x68AF, 0x92F3, 0x6C40, 0x92F4, 0x7887, 0x92F5, 0x798E, 0x92F6, 0x7A0B, 0x92F7, 0x7DE0, 0x92F8, 0x8247, 0x92F9, 0x8A02, + 0x92FA, 0x8AE6, 0x92FB, 0x8E44, 0x92FC, 0x9013, 0x9340, 0x90B8, 0x9341, 0x912D, 0x9342, 0x91D8, 0x9343, 0x9F0E, 0x9344, 0x6CE5, + 0x9345, 0x6458, 0x9346, 0x64E2, 0x9347, 0x6575, 0x9348, 0x6EF4, 0x9349, 0x7684, 0x934A, 0x7B1B, 0x934B, 0x9069, 0x934C, 0x93D1, + 0x934D, 0x6EBA, 0x934E, 0x54F2, 0x934F, 0x5FB9, 0x9350, 0x64A4, 0x9351, 0x8F4D, 0x9352, 0x8FED, 0x9353, 0x9244, 0x9354, 0x5178, + 0x9355, 0x586B, 0x9356, 0x5929, 0x9357, 0x5C55, 0x9358, 0x5E97, 0x9359, 0x6DFB, 0x935A, 0x7E8F, 0x935B, 0x751C, 0x935C, 0x8CBC, + 0x935D, 0x8EE2, 0x935E, 0x985B, 0x935F, 0x70B9, 0x9360, 0x4F1D, 0x9361, 0x6BBF, 0x9362, 0x6FB1, 0x9363, 0x7530, 0x9364, 0x96FB, + 0x9365, 0x514E, 0x9366, 0x5410, 0x9367, 0x5835, 0x9368, 0x5857, 0x9369, 0x59AC, 0x936A, 0x5C60, 0x936B, 0x5F92, 0x936C, 0x6597, + 0x936D, 0x675C, 0x936E, 0x6E21, 0x936F, 0x767B, 0x9370, 0x83DF, 0x9371, 0x8CED, 0x9372, 0x9014, 0x9373, 0x90FD, 0x9374, 0x934D, + 0x9375, 0x7825, 0x9376, 0x783A, 0x9377, 0x52AA, 0x9378, 0x5EA6, 0x9379, 0x571F, 0x937A, 0x5974, 0x937B, 0x6012, 0x937C, 0x5012, + 0x937D, 0x515A, 0x937E, 0x51AC, 0x9380, 0x51CD, 0x9381, 0x5200, 0x9382, 0x5510, 0x9383, 0x5854, 0x9384, 0x5858, 0x9385, 0x5957, + 0x9386, 0x5B95, 0x9387, 0x5CF6, 0x9388, 0x5D8B, 0x9389, 0x60BC, 0x938A, 0x6295, 0x938B, 0x642D, 0x938C, 0x6771, 0x938D, 0x6843, + 0x938E, 0x68BC, 0x938F, 0x68DF, 0x9390, 0x76D7, 0x9391, 0x6DD8, 0x9392, 0x6E6F, 0x9393, 0x6D9B, 0x9394, 0x706F, 0x9395, 0x71C8, + 0x9396, 0x5F53, 0x9397, 0x75D8, 0x9398, 0x7977, 0x9399, 0x7B49, 0x939A, 0x7B54, 0x939B, 0x7B52, 0x939C, 0x7CD6, 0x939D, 0x7D71, + 0x939E, 0x5230, 0x939F, 0x8463, 0x93A0, 0x8569, 0x93A1, 0x85E4, 0x93A2, 0x8A0E, 0x93A3, 0x8B04, 0x93A4, 0x8C46, 0x93A5, 0x8E0F, + 0x93A6, 0x9003, 0x93A7, 0x900F, 0x93A8, 0x9419, 0x93A9, 0x9676, 0x93AA, 0x982D, 0x93AB, 0x9A30, 0x93AC, 0x95D8, 0x93AD, 0x50CD, + 0x93AE, 0x52D5, 0x93AF, 0x540C, 0x93B0, 0x5802, 0x93B1, 0x5C0E, 0x93B2, 0x61A7, 0x93B3, 0x649E, 0x93B4, 0x6D1E, 0x93B5, 0x77B3, + 0x93B6, 0x7AE5, 0x93B7, 0x80F4, 0x93B8, 0x8404, 0x93B9, 0x9053, 0x93BA, 0x9285, 0x93BB, 0x5CE0, 0x93BC, 0x9D07, 0x93BD, 0x533F, + 0x93BE, 0x5F97, 0x93BF, 0x5FB3, 0x93C0, 0x6D9C, 0x93C1, 0x7279, 0x93C2, 0x7763, 0x93C3, 0x79BF, 0x93C4, 0x7BE4, 0x93C5, 0x6BD2, + 0x93C6, 0x72EC, 0x93C7, 0x8AAD, 0x93C8, 0x6803, 0x93C9, 0x6A61, 0x93CA, 0x51F8, 0x93CB, 0x7A81, 0x93CC, 0x6934, 0x93CD, 0x5C4A, + 0x93CE, 0x9CF6, 0x93CF, 0x82EB, 0x93D0, 0x5BC5, 0x93D1, 0x9149, 0x93D2, 0x701E, 0x93D3, 0x5678, 0x93D4, 0x5C6F, 0x93D5, 0x60C7, + 0x93D6, 0x6566, 0x93D7, 0x6C8C, 0x93D8, 0x8C5A, 0x93D9, 0x9041, 0x93DA, 0x9813, 0x93DB, 0x5451, 0x93DC, 0x66C7, 0x93DD, 0x920D, + 0x93DE, 0x5948, 0x93DF, 0x90A3, 0x93E0, 0x5185, 0x93E1, 0x4E4D, 0x93E2, 0x51EA, 0x93E3, 0x8599, 0x93E4, 0x8B0E, 0x93E5, 0x7058, + 0x93E6, 0x637A, 0x93E7, 0x934B, 0x93E8, 0x6962, 0x93E9, 0x99B4, 0x93EA, 0x7E04, 0x93EB, 0x7577, 0x93EC, 0x5357, 0x93ED, 0x6960, + 0x93EE, 0x8EDF, 0x93EF, 0x96E3, 0x93F0, 0x6C5D, 0x93F1, 0x4E8C, 0x93F2, 0x5C3C, 0x93F3, 0x5F10, 0x93F4, 0x8FE9, 0x93F5, 0x5302, + 0x93F6, 0x8CD1, 0x93F7, 0x8089, 0x93F8, 0x8679, 0x93F9, 0x5EFF, 0x93FA, 0x65E5, 0x93FB, 0x4E73, 0x93FC, 0x5165, 0x9440, 0x5982, + 0x9441, 0x5C3F, 0x9442, 0x97EE, 0x9443, 0x4EFB, 0x9444, 0x598A, 0x9445, 0x5FCD, 0x9446, 0x8A8D, 0x9447, 0x6FE1, 0x9448, 0x79B0, + 0x9449, 0x7962, 0x944A, 0x5BE7, 0x944B, 0x8471, 0x944C, 0x732B, 0x944D, 0x71B1, 0x944E, 0x5E74, 0x944F, 0x5FF5, 0x9450, 0x637B, + 0x9451, 0x649A, 0x9452, 0x71C3, 0x9453, 0x7C98, 0x9454, 0x4E43, 0x9455, 0x5EFC, 0x9456, 0x4E4B, 0x9457, 0x57DC, 0x9458, 0x56A2, + 0x9459, 0x60A9, 0x945A, 0x6FC3, 0x945B, 0x7D0D, 0x945C, 0x80FD, 0x945D, 0x8133, 0x945E, 0x81BF, 0x945F, 0x8FB2, 0x9460, 0x8997, + 0x9461, 0x86A4, 0x9462, 0x5DF4, 0x9463, 0x628A, 0x9464, 0x64AD, 0x9465, 0x8987, 0x9466, 0x6777, 0x9467, 0x6CE2, 0x9468, 0x6D3E, + 0x9469, 0x7436, 0x946A, 0x7834, 0x946B, 0x5A46, 0x946C, 0x7F75, 0x946D, 0x82AD, 0x946E, 0x99AC, 0x946F, 0x4FF3, 0x9470, 0x5EC3, + 0x9471, 0x62DD, 0x9472, 0x6392, 0x9473, 0x6557, 0x9474, 0x676F, 0x9475, 0x76C3, 0x9476, 0x724C, 0x9477, 0x80CC, 0x9478, 0x80BA, + 0x9479, 0x8F29, 0x947A, 0x914D, 0x947B, 0x500D, 0x947C, 0x57F9, 0x947D, 0x5A92, 0x947E, 0x6885, 0x9480, 0x6973, 0x9481, 0x7164, + 0x9482, 0x72FD, 0x9483, 0x8CB7, 0x9484, 0x58F2, 0x9485, 0x8CE0, 0x9486, 0x966A, 0x9487, 0x9019, 0x9488, 0x877F, 0x9489, 0x79E4, + 0x948A, 0x77E7, 0x948B, 0x8429, 0x948C, 0x4F2F, 0x948D, 0x5265, 0x948E, 0x535A, 0x948F, 0x62CD, 0x9490, 0x67CF, 0x9491, 0x6CCA, + 0x9492, 0x767D, 0x9493, 0x7B94, 0x9494, 0x7C95, 0x9495, 0x8236, 0x9496, 0x8584, 0x9497, 0x8FEB, 0x9498, 0x66DD, 0x9499, 0x6F20, + 0x949A, 0x7206, 0x949B, 0x7E1B, 0x949C, 0x83AB, 0x949D, 0x99C1, 0x949E, 0x9EA6, 0x949F, 0x51FD, 0x94A0, 0x7BB1, 0x94A1, 0x7872, + 0x94A2, 0x7BB8, 0x94A3, 0x8087, 0x94A4, 0x7B48, 0x94A5, 0x6AE8, 0x94A6, 0x5E61, 0x94A7, 0x808C, 0x94A8, 0x7551, 0x94A9, 0x7560, + 0x94AA, 0x516B, 0x94AB, 0x9262, 0x94AC, 0x6E8C, 0x94AD, 0x767A, 0x94AE, 0x9197, 0x94AF, 0x9AEA, 0x94B0, 0x4F10, 0x94B1, 0x7F70, + 0x94B2, 0x629C, 0x94B3, 0x7B4F, 0x94B4, 0x95A5, 0x94B5, 0x9CE9, 0x94B6, 0x567A, 0x94B7, 0x5859, 0x94B8, 0x86E4, 0x94B9, 0x96BC, + 0x94BA, 0x4F34, 0x94BB, 0x5224, 0x94BC, 0x534A, 0x94BD, 0x53CD, 0x94BE, 0x53DB, 0x94BF, 0x5E06, 0x94C0, 0x642C, 0x94C1, 0x6591, + 0x94C2, 0x677F, 0x94C3, 0x6C3E, 0x94C4, 0x6C4E, 0x94C5, 0x7248, 0x94C6, 0x72AF, 0x94C7, 0x73ED, 0x94C8, 0x7554, 0x94C9, 0x7E41, + 0x94CA, 0x822C, 0x94CB, 0x85E9, 0x94CC, 0x8CA9, 0x94CD, 0x7BC4, 0x94CE, 0x91C6, 0x94CF, 0x7169, 0x94D0, 0x9812, 0x94D1, 0x98EF, + 0x94D2, 0x633D, 0x94D3, 0x6669, 0x94D4, 0x756A, 0x94D5, 0x76E4, 0x94D6, 0x78D0, 0x94D7, 0x8543, 0x94D8, 0x86EE, 0x94D9, 0x532A, + 0x94DA, 0x5351, 0x94DB, 0x5426, 0x94DC, 0x5983, 0x94DD, 0x5E87, 0x94DE, 0x5F7C, 0x94DF, 0x60B2, 0x94E0, 0x6249, 0x94E1, 0x6279, + 0x94E2, 0x62AB, 0x94E3, 0x6590, 0x94E4, 0x6BD4, 0x94E5, 0x6CCC, 0x94E6, 0x75B2, 0x94E7, 0x76AE, 0x94E8, 0x7891, 0x94E9, 0x79D8, + 0x94EA, 0x7DCB, 0x94EB, 0x7F77, 0x94EC, 0x80A5, 0x94ED, 0x88AB, 0x94EE, 0x8AB9, 0x94EF, 0x8CBB, 0x94F0, 0x907F, 0x94F1, 0x975E, + 0x94F2, 0x98DB, 0x94F3, 0x6A0B, 0x94F4, 0x7C38, 0x94F5, 0x5099, 0x94F6, 0x5C3E, 0x94F7, 0x5FAE, 0x94F8, 0x6787, 0x94F9, 0x6BD8, + 0x94FA, 0x7435, 0x94FB, 0x7709, 0x94FC, 0x7F8E, 0x9540, 0x9F3B, 0x9541, 0x67CA, 0x9542, 0x7A17, 0x9543, 0x5339, 0x9544, 0x758B, + 0x9545, 0x9AED, 0x9546, 0x5F66, 0x9547, 0x819D, 0x9548, 0x83F1, 0x9549, 0x8098, 0x954A, 0x5F3C, 0x954B, 0x5FC5, 0x954C, 0x7562, + 0x954D, 0x7B46, 0x954E, 0x903C, 0x954F, 0x6867, 0x9550, 0x59EB, 0x9551, 0x5A9B, 0x9552, 0x7D10, 0x9553, 0x767E, 0x9554, 0x8B2C, + 0x9555, 0x4FF5, 0x9556, 0x5F6A, 0x9557, 0x6A19, 0x9558, 0x6C37, 0x9559, 0x6F02, 0x955A, 0x74E2, 0x955B, 0x7968, 0x955C, 0x8868, + 0x955D, 0x8A55, 0x955E, 0x8C79, 0x955F, 0x5EDF, 0x9560, 0x63CF, 0x9561, 0x75C5, 0x9562, 0x79D2, 0x9563, 0x82D7, 0x9564, 0x9328, + 0x9565, 0x92F2, 0x9566, 0x849C, 0x9567, 0x86ED, 0x9568, 0x9C2D, 0x9569, 0x54C1, 0x956A, 0x5F6C, 0x956B, 0x658C, 0x956C, 0x6D5C, + 0x956D, 0x7015, 0x956E, 0x8CA7, 0x956F, 0x8CD3, 0x9570, 0x983B, 0x9571, 0x654F, 0x9572, 0x74F6, 0x9573, 0x4E0D, 0x9574, 0x4ED8, + 0x9575, 0x57E0, 0x9576, 0x592B, 0x9577, 0x5A66, 0x9578, 0x5BCC, 0x9579, 0x51A8, 0x957A, 0x5E03, 0x957B, 0x5E9C, 0x957C, 0x6016, + 0x957D, 0x6276, 0x957E, 0x6577, 0x9580, 0x65A7, 0x9581, 0x666E, 0x9582, 0x6D6E, 0x9583, 0x7236, 0x9584, 0x7B26, 0x9585, 0x8150, + 0x9586, 0x819A, 0x9587, 0x8299, 0x9588, 0x8B5C, 0x9589, 0x8CA0, 0x958A, 0x8CE6, 0x958B, 0x8D74, 0x958C, 0x961C, 0x958D, 0x9644, + 0x958E, 0x4FAE, 0x958F, 0x64AB, 0x9590, 0x6B66, 0x9591, 0x821E, 0x9592, 0x8461, 0x9593, 0x856A, 0x9594, 0x90E8, 0x9595, 0x5C01, + 0x9596, 0x6953, 0x9597, 0x98A8, 0x9598, 0x847A, 0x9599, 0x8557, 0x959A, 0x4F0F, 0x959B, 0x526F, 0x959C, 0x5FA9, 0x959D, 0x5E45, + 0x959E, 0x670D, 0x959F, 0x798F, 0x95A0, 0x8179, 0x95A1, 0x8907, 0x95A2, 0x8986, 0x95A3, 0x6DF5, 0x95A4, 0x5F17, 0x95A5, 0x6255, + 0x95A6, 0x6CB8, 0x95A7, 0x4ECF, 0x95A8, 0x7269, 0x95A9, 0x9B92, 0x95AA, 0x5206, 0x95AB, 0x543B, 0x95AC, 0x5674, 0x95AD, 0x58B3, + 0x95AE, 0x61A4, 0x95AF, 0x626E, 0x95B0, 0x711A, 0x95B1, 0x596E, 0x95B2, 0x7C89, 0x95B3, 0x7CDE, 0x95B4, 0x7D1B, 0x95B5, 0x96F0, + 0x95B6, 0x6587, 0x95B7, 0x805E, 0x95B8, 0x4E19, 0x95B9, 0x4F75, 0x95BA, 0x5175, 0x95BB, 0x5840, 0x95BC, 0x5E63, 0x95BD, 0x5E73, + 0x95BE, 0x5F0A, 0x95BF, 0x67C4, 0x95C0, 0x4E26, 0x95C1, 0x853D, 0x95C2, 0x9589, 0x95C3, 0x965B, 0x95C4, 0x7C73, 0x95C5, 0x9801, + 0x95C6, 0x50FB, 0x95C7, 0x58C1, 0x95C8, 0x7656, 0x95C9, 0x78A7, 0x95CA, 0x5225, 0x95CB, 0x77A5, 0x95CC, 0x8511, 0x95CD, 0x7B86, + 0x95CE, 0x504F, 0x95CF, 0x5909, 0x95D0, 0x7247, 0x95D1, 0x7BC7, 0x95D2, 0x7DE8, 0x95D3, 0x8FBA, 0x95D4, 0x8FD4, 0x95D5, 0x904D, + 0x95D6, 0x4FBF, 0x95D7, 0x52C9, 0x95D8, 0x5A29, 0x95D9, 0x5F01, 0x95DA, 0x97AD, 0x95DB, 0x4FDD, 0x95DC, 0x8217, 0x95DD, 0x92EA, + 0x95DE, 0x5703, 0x95DF, 0x6355, 0x95E0, 0x6B69, 0x95E1, 0x752B, 0x95E2, 0x88DC, 0x95E3, 0x8F14, 0x95E4, 0x7A42, 0x95E5, 0x52DF, + 0x95E6, 0x5893, 0x95E7, 0x6155, 0x95E8, 0x620A, 0x95E9, 0x66AE, 0x95EA, 0x6BCD, 0x95EB, 0x7C3F, 0x95EC, 0x83E9, 0x95ED, 0x5023, + 0x95EE, 0x4FF8, 0x95EF, 0x5305, 0x95F0, 0x5446, 0x95F1, 0x5831, 0x95F2, 0x5949, 0x95F3, 0x5B9D, 0x95F4, 0x5CF0, 0x95F5, 0x5CEF, + 0x95F6, 0x5D29, 0x95F7, 0x5E96, 0x95F8, 0x62B1, 0x95F9, 0x6367, 0x95FA, 0x653E, 0x95FB, 0x65B9, 0x95FC, 0x670B, 0x9640, 0x6CD5, + 0x9641, 0x6CE1, 0x9642, 0x70F9, 0x9643, 0x7832, 0x9644, 0x7E2B, 0x9645, 0x80DE, 0x9646, 0x82B3, 0x9647, 0x840C, 0x9648, 0x84EC, + 0x9649, 0x8702, 0x964A, 0x8912, 0x964B, 0x8A2A, 0x964C, 0x8C4A, 0x964D, 0x90A6, 0x964E, 0x92D2, 0x964F, 0x98FD, 0x9650, 0x9CF3, + 0x9651, 0x9D6C, 0x9652, 0x4E4F, 0x9653, 0x4EA1, 0x9654, 0x508D, 0x9655, 0x5256, 0x9656, 0x574A, 0x9657, 0x59A8, 0x9658, 0x5E3D, + 0x9659, 0x5FD8, 0x965A, 0x5FD9, 0x965B, 0x623F, 0x965C, 0x66B4, 0x965D, 0x671B, 0x965E, 0x67D0, 0x965F, 0x68D2, 0x9660, 0x5192, + 0x9661, 0x7D21, 0x9662, 0x80AA, 0x9663, 0x81A8, 0x9664, 0x8B00, 0x9665, 0x8C8C, 0x9666, 0x8CBF, 0x9667, 0x927E, 0x9668, 0x9632, + 0x9669, 0x5420, 0x966A, 0x982C, 0x966B, 0x5317, 0x966C, 0x50D5, 0x966D, 0x535C, 0x966E, 0x58A8, 0x966F, 0x64B2, 0x9670, 0x6734, + 0x9671, 0x7267, 0x9672, 0x7766, 0x9673, 0x7A46, 0x9674, 0x91E6, 0x9675, 0x52C3, 0x9676, 0x6CA1, 0x9677, 0x6B86, 0x9678, 0x5800, + 0x9679, 0x5E4C, 0x967A, 0x5954, 0x967B, 0x672C, 0x967C, 0x7FFB, 0x967D, 0x51E1, 0x967E, 0x76C6, 0x9680, 0x6469, 0x9681, 0x78E8, + 0x9682, 0x9B54, 0x9683, 0x9EBB, 0x9684, 0x57CB, 0x9685, 0x59B9, 0x9686, 0x6627, 0x9687, 0x679A, 0x9688, 0x6BCE, 0x9689, 0x54E9, + 0x968A, 0x69D9, 0x968B, 0x5E55, 0x968C, 0x819C, 0x968D, 0x6795, 0x968E, 0x9BAA, 0x968F, 0x67FE, 0x9690, 0x9C52, 0x9691, 0x685D, + 0x9692, 0x4EA6, 0x9693, 0x4FE3, 0x9694, 0x53C8, 0x9695, 0x62B9, 0x9696, 0x672B, 0x9697, 0x6CAB, 0x9698, 0x8FC4, 0x9699, 0x4FAD, + 0x969A, 0x7E6D, 0x969B, 0x9EBF, 0x969C, 0x4E07, 0x969D, 0x6162, 0x969E, 0x6E80, 0x969F, 0x6F2B, 0x96A0, 0x8513, 0x96A1, 0x5473, + 0x96A2, 0x672A, 0x96A3, 0x9B45, 0x96A4, 0x5DF3, 0x96A5, 0x7B95, 0x96A6, 0x5CAC, 0x96A7, 0x5BC6, 0x96A8, 0x871C, 0x96A9, 0x6E4A, + 0x96AA, 0x84D1, 0x96AB, 0x7A14, 0x96AC, 0x8108, 0x96AD, 0x5999, 0x96AE, 0x7C8D, 0x96AF, 0x6C11, 0x96B0, 0x7720, 0x96B1, 0x52D9, + 0x96B2, 0x5922, 0x96B3, 0x7121, 0x96B4, 0x725F, 0x96B5, 0x77DB, 0x96B6, 0x9727, 0x96B7, 0x9D61, 0x96B8, 0x690B, 0x96B9, 0x5A7F, + 0x96BA, 0x5A18, 0x96BB, 0x51A5, 0x96BC, 0x540D, 0x96BD, 0x547D, 0x96BE, 0x660E, 0x96BF, 0x76DF, 0x96C0, 0x8FF7, 0x96C1, 0x9298, + 0x96C2, 0x9CF4, 0x96C3, 0x59EA, 0x96C4, 0x725D, 0x96C5, 0x6EC5, 0x96C6, 0x514D, 0x96C7, 0x68C9, 0x96C8, 0x7DBF, 0x96C9, 0x7DEC, + 0x96CA, 0x9762, 0x96CB, 0x9EBA, 0x96CC, 0x6478, 0x96CD, 0x6A21, 0x96CE, 0x8302, 0x96CF, 0x5984, 0x96D0, 0x5B5F, 0x96D1, 0x6BDB, + 0x96D2, 0x731B, 0x96D3, 0x76F2, 0x96D4, 0x7DB2, 0x96D5, 0x8017, 0x96D6, 0x8499, 0x96D7, 0x5132, 0x96D8, 0x6728, 0x96D9, 0x9ED9, + 0x96DA, 0x76EE, 0x96DB, 0x6762, 0x96DC, 0x52FF, 0x96DD, 0x9905, 0x96DE, 0x5C24, 0x96DF, 0x623B, 0x96E0, 0x7C7E, 0x96E1, 0x8CB0, + 0x96E2, 0x554F, 0x96E3, 0x60B6, 0x96E4, 0x7D0B, 0x96E5, 0x9580, 0x96E6, 0x5301, 0x96E7, 0x4E5F, 0x96E8, 0x51B6, 0x96E9, 0x591C, + 0x96EA, 0x723A, 0x96EB, 0x8036, 0x96EC, 0x91CE, 0x96ED, 0x5F25, 0x96EE, 0x77E2, 0x96EF, 0x5384, 0x96F0, 0x5F79, 0x96F1, 0x7D04, + 0x96F2, 0x85AC, 0x96F3, 0x8A33, 0x96F4, 0x8E8D, 0x96F5, 0x9756, 0x96F6, 0x67F3, 0x96F7, 0x85AE, 0x96F8, 0x9453, 0x96F9, 0x6109, + 0x96FA, 0x6108, 0x96FB, 0x6CB9, 0x96FC, 0x7652, 0x9740, 0x8AED, 0x9741, 0x8F38, 0x9742, 0x552F, 0x9743, 0x4F51, 0x9744, 0x512A, + 0x9745, 0x52C7, 0x9746, 0x53CB, 0x9747, 0x5BA5, 0x9748, 0x5E7D, 0x9749, 0x60A0, 0x974A, 0x6182, 0x974B, 0x63D6, 0x974C, 0x6709, + 0x974D, 0x67DA, 0x974E, 0x6E67, 0x974F, 0x6D8C, 0x9750, 0x7336, 0x9751, 0x7337, 0x9752, 0x7531, 0x9753, 0x7950, 0x9754, 0x88D5, + 0x9755, 0x8A98, 0x9756, 0x904A, 0x9757, 0x9091, 0x9758, 0x90F5, 0x9759, 0x96C4, 0x975A, 0x878D, 0x975B, 0x5915, 0x975C, 0x4E88, + 0x975D, 0x4F59, 0x975E, 0x4E0E, 0x975F, 0x8A89, 0x9760, 0x8F3F, 0x9761, 0x9810, 0x9762, 0x50AD, 0x9763, 0x5E7C, 0x9764, 0x5996, + 0x9765, 0x5BB9, 0x9766, 0x5EB8, 0x9767, 0x63DA, 0x9768, 0x63FA, 0x9769, 0x64C1, 0x976A, 0x66DC, 0x976B, 0x694A, 0x976C, 0x69D8, + 0x976D, 0x6D0B, 0x976E, 0x6EB6, 0x976F, 0x7194, 0x9770, 0x7528, 0x9771, 0x7AAF, 0x9772, 0x7F8A, 0x9773, 0x8000, 0x9774, 0x8449, + 0x9775, 0x84C9, 0x9776, 0x8981, 0x9777, 0x8B21, 0x9778, 0x8E0A, 0x9779, 0x9065, 0x977A, 0x967D, 0x977B, 0x990A, 0x977C, 0x617E, + 0x977D, 0x6291, 0x977E, 0x6B32, 0x9780, 0x6C83, 0x9781, 0x6D74, 0x9782, 0x7FCC, 0x9783, 0x7FFC, 0x9784, 0x6DC0, 0x9785, 0x7F85, + 0x9786, 0x87BA, 0x9787, 0x88F8, 0x9788, 0x6765, 0x9789, 0x83B1, 0x978A, 0x983C, 0x978B, 0x96F7, 0x978C, 0x6D1B, 0x978D, 0x7D61, + 0x978E, 0x843D, 0x978F, 0x916A, 0x9790, 0x4E71, 0x9791, 0x5375, 0x9792, 0x5D50, 0x9793, 0x6B04, 0x9794, 0x6FEB, 0x9795, 0x85CD, + 0x9796, 0x862D, 0x9797, 0x89A7, 0x9798, 0x5229, 0x9799, 0x540F, 0x979A, 0x5C65, 0x979B, 0x674E, 0x979C, 0x68A8, 0x979D, 0x7406, + 0x979E, 0x7483, 0x979F, 0x75E2, 0x97A0, 0x88CF, 0x97A1, 0x88E1, 0x97A2, 0x91CC, 0x97A3, 0x96E2, 0x97A4, 0x9678, 0x97A5, 0x5F8B, + 0x97A6, 0x7387, 0x97A7, 0x7ACB, 0x97A8, 0x844E, 0x97A9, 0x63A0, 0x97AA, 0x7565, 0x97AB, 0x5289, 0x97AC, 0x6D41, 0x97AD, 0x6E9C, + 0x97AE, 0x7409, 0x97AF, 0x7559, 0x97B0, 0x786B, 0x97B1, 0x7C92, 0x97B2, 0x9686, 0x97B3, 0x7ADC, 0x97B4, 0x9F8D, 0x97B5, 0x4FB6, + 0x97B6, 0x616E, 0x97B7, 0x65C5, 0x97B8, 0x865C, 0x97B9, 0x4E86, 0x97BA, 0x4EAE, 0x97BB, 0x50DA, 0x97BC, 0x4E21, 0x97BD, 0x51CC, + 0x97BE, 0x5BEE, 0x97BF, 0x6599, 0x97C0, 0x6881, 0x97C1, 0x6DBC, 0x97C2, 0x731F, 0x97C3, 0x7642, 0x97C4, 0x77AD, 0x97C5, 0x7A1C, + 0x97C6, 0x7CE7, 0x97C7, 0x826F, 0x97C8, 0x8AD2, 0x97C9, 0x907C, 0x97CA, 0x91CF, 0x97CB, 0x9675, 0x97CC, 0x9818, 0x97CD, 0x529B, + 0x97CE, 0x7DD1, 0x97CF, 0x502B, 0x97D0, 0x5398, 0x97D1, 0x6797, 0x97D2, 0x6DCB, 0x97D3, 0x71D0, 0x97D4, 0x7433, 0x97D5, 0x81E8, + 0x97D6, 0x8F2A, 0x97D7, 0x96A3, 0x97D8, 0x9C57, 0x97D9, 0x9E9F, 0x97DA, 0x7460, 0x97DB, 0x5841, 0x97DC, 0x6D99, 0x97DD, 0x7D2F, + 0x97DE, 0x985E, 0x97DF, 0x4EE4, 0x97E0, 0x4F36, 0x97E1, 0x4F8B, 0x97E2, 0x51B7, 0x97E3, 0x52B1, 0x97E4, 0x5DBA, 0x97E5, 0x601C, + 0x97E6, 0x73B2, 0x97E7, 0x793C, 0x97E8, 0x82D3, 0x97E9, 0x9234, 0x97EA, 0x96B7, 0x97EB, 0x96F6, 0x97EC, 0x970A, 0x97ED, 0x9E97, + 0x97EE, 0x9F62, 0x97EF, 0x66A6, 0x97F0, 0x6B74, 0x97F1, 0x5217, 0x97F2, 0x52A3, 0x97F3, 0x70C8, 0x97F4, 0x88C2, 0x97F5, 0x5EC9, + 0x97F6, 0x604B, 0x97F7, 0x6190, 0x97F8, 0x6F23, 0x97F9, 0x7149, 0x97FA, 0x7C3E, 0x97FB, 0x7DF4, 0x97FC, 0x806F, 0x9840, 0x84EE, + 0x9841, 0x9023, 0x9842, 0x932C, 0x9843, 0x5442, 0x9844, 0x9B6F, 0x9845, 0x6AD3, 0x9846, 0x7089, 0x9847, 0x8CC2, 0x9848, 0x8DEF, + 0x9849, 0x9732, 0x984A, 0x52B4, 0x984B, 0x5A41, 0x984C, 0x5ECA, 0x984D, 0x5F04, 0x984E, 0x6717, 0x984F, 0x697C, 0x9850, 0x6994, + 0x9851, 0x6D6A, 0x9852, 0x6F0F, 0x9853, 0x7262, 0x9854, 0x72FC, 0x9855, 0x7BED, 0x9856, 0x8001, 0x9857, 0x807E, 0x9858, 0x874B, + 0x9859, 0x90CE, 0x985A, 0x516D, 0x985B, 0x9E93, 0x985C, 0x7984, 0x985D, 0x808B, 0x985E, 0x9332, 0x985F, 0x8AD6, 0x9860, 0x502D, + 0x9861, 0x548C, 0x9862, 0x8A71, 0x9863, 0x6B6A, 0x9864, 0x8CC4, 0x9865, 0x8107, 0x9866, 0x60D1, 0x9867, 0x67A0, 0x9868, 0x9DF2, + 0x9869, 0x4E99, 0x986A, 0x4E98, 0x986B, 0x9C10, 0x986C, 0x8A6B, 0x986D, 0x85C1, 0x986E, 0x8568, 0x986F, 0x6900, 0x9870, 0x6E7E, + 0x9871, 0x7897, 0x9872, 0x8155, 0x989F, 0x5F0C, 0x98A0, 0x4E10, 0x98A1, 0x4E15, 0x98A2, 0x4E2A, 0x98A3, 0x4E31, 0x98A4, 0x4E36, + 0x98A5, 0x4E3C, 0x98A6, 0x4E3F, 0x98A7, 0x4E42, 0x98A8, 0x4E56, 0x98A9, 0x4E58, 0x98AA, 0x4E82, 0x98AB, 0x4E85, 0x98AC, 0x8C6B, + 0x98AD, 0x4E8A, 0x98AE, 0x8212, 0x98AF, 0x5F0D, 0x98B0, 0x4E8E, 0x98B1, 0x4E9E, 0x98B2, 0x4E9F, 0x98B3, 0x4EA0, 0x98B4, 0x4EA2, + 0x98B5, 0x4EB0, 0x98B6, 0x4EB3, 0x98B7, 0x4EB6, 0x98B8, 0x4ECE, 0x98B9, 0x4ECD, 0x98BA, 0x4EC4, 0x98BB, 0x4EC6, 0x98BC, 0x4EC2, + 0x98BD, 0x4ED7, 0x98BE, 0x4EDE, 0x98BF, 0x4EED, 0x98C0, 0x4EDF, 0x98C1, 0x4EF7, 0x98C2, 0x4F09, 0x98C3, 0x4F5A, 0x98C4, 0x4F30, + 0x98C5, 0x4F5B, 0x98C6, 0x4F5D, 0x98C7, 0x4F57, 0x98C8, 0x4F47, 0x98C9, 0x4F76, 0x98CA, 0x4F88, 0x98CB, 0x4F8F, 0x98CC, 0x4F98, + 0x98CD, 0x4F7B, 0x98CE, 0x4F69, 0x98CF, 0x4F70, 0x98D0, 0x4F91, 0x98D1, 0x4F6F, 0x98D2, 0x4F86, 0x98D3, 0x4F96, 0x98D4, 0x5118, + 0x98D5, 0x4FD4, 0x98D6, 0x4FDF, 0x98D7, 0x4FCE, 0x98D8, 0x4FD8, 0x98D9, 0x4FDB, 0x98DA, 0x4FD1, 0x98DB, 0x4FDA, 0x98DC, 0x4FD0, + 0x98DD, 0x4FE4, 0x98DE, 0x4FE5, 0x98DF, 0x501A, 0x98E0, 0x5028, 0x98E1, 0x5014, 0x98E2, 0x502A, 0x98E3, 0x5025, 0x98E4, 0x5005, + 0x98E5, 0x4F1C, 0x98E6, 0x4FF6, 0x98E7, 0x5021, 0x98E8, 0x5029, 0x98E9, 0x502C, 0x98EA, 0x4FFE, 0x98EB, 0x4FEF, 0x98EC, 0x5011, + 0x98ED, 0x5006, 0x98EE, 0x5043, 0x98EF, 0x5047, 0x98F0, 0x6703, 0x98F1, 0x5055, 0x98F2, 0x5050, 0x98F3, 0x5048, 0x98F4, 0x505A, + 0x98F5, 0x5056, 0x98F6, 0x506C, 0x98F7, 0x5078, 0x98F8, 0x5080, 0x98F9, 0x509A, 0x98FA, 0x5085, 0x98FB, 0x50B4, 0x98FC, 0x50B2, + 0x9940, 0x50C9, 0x9941, 0x50CA, 0x9942, 0x50B3, 0x9943, 0x50C2, 0x9944, 0x50D6, 0x9945, 0x50DE, 0x9946, 0x50E5, 0x9947, 0x50ED, + 0x9948, 0x50E3, 0x9949, 0x50EE, 0x994A, 0x50F9, 0x994B, 0x50F5, 0x994C, 0x5109, 0x994D, 0x5101, 0x994E, 0x5102, 0x994F, 0x5116, + 0x9950, 0x5115, 0x9951, 0x5114, 0x9952, 0x511A, 0x9953, 0x5121, 0x9954, 0x513A, 0x9955, 0x5137, 0x9956, 0x513C, 0x9957, 0x513B, + 0x9958, 0x513F, 0x9959, 0x5140, 0x995A, 0x5152, 0x995B, 0x514C, 0x995C, 0x5154, 0x995D, 0x5162, 0x995E, 0x7AF8, 0x995F, 0x5169, + 0x9960, 0x516A, 0x9961, 0x516E, 0x9962, 0x5180, 0x9963, 0x5182, 0x9964, 0x56D8, 0x9965, 0x518C, 0x9966, 0x5189, 0x9967, 0x518F, + 0x9968, 0x5191, 0x9969, 0x5193, 0x996A, 0x5195, 0x996B, 0x5196, 0x996C, 0x51A4, 0x996D, 0x51A6, 0x996E, 0x51A2, 0x996F, 0x51A9, + 0x9970, 0x51AA, 0x9971, 0x51AB, 0x9972, 0x51B3, 0x9973, 0x51B1, 0x9974, 0x51B2, 0x9975, 0x51B0, 0x9976, 0x51B5, 0x9977, 0x51BD, + 0x9978, 0x51C5, 0x9979, 0x51C9, 0x997A, 0x51DB, 0x997B, 0x51E0, 0x997C, 0x8655, 0x997D, 0x51E9, 0x997E, 0x51ED, 0x9980, 0x51F0, + 0x9981, 0x51F5, 0x9982, 0x51FE, 0x9983, 0x5204, 0x9984, 0x520B, 0x9985, 0x5214, 0x9986, 0x520E, 0x9987, 0x5227, 0x9988, 0x522A, + 0x9989, 0x522E, 0x998A, 0x5233, 0x998B, 0x5239, 0x998C, 0x524F, 0x998D, 0x5244, 0x998E, 0x524B, 0x998F, 0x524C, 0x9990, 0x525E, + 0x9991, 0x5254, 0x9992, 0x526A, 0x9993, 0x5274, 0x9994, 0x5269, 0x9995, 0x5273, 0x9996, 0x527F, 0x9997, 0x527D, 0x9998, 0x528D, + 0x9999, 0x5294, 0x999A, 0x5292, 0x999B, 0x5271, 0x999C, 0x5288, 0x999D, 0x5291, 0x999E, 0x8FA8, 0x999F, 0x8FA7, 0x99A0, 0x52AC, + 0x99A1, 0x52AD, 0x99A2, 0x52BC, 0x99A3, 0x52B5, 0x99A4, 0x52C1, 0x99A5, 0x52CD, 0x99A6, 0x52D7, 0x99A7, 0x52DE, 0x99A8, 0x52E3, + 0x99A9, 0x52E6, 0x99AA, 0x98ED, 0x99AB, 0x52E0, 0x99AC, 0x52F3, 0x99AD, 0x52F5, 0x99AE, 0x52F8, 0x99AF, 0x52F9, 0x99B0, 0x5306, + 0x99B1, 0x5308, 0x99B2, 0x7538, 0x99B3, 0x530D, 0x99B4, 0x5310, 0x99B5, 0x530F, 0x99B6, 0x5315, 0x99B7, 0x531A, 0x99B8, 0x5323, + 0x99B9, 0x532F, 0x99BA, 0x5331, 0x99BB, 0x5333, 0x99BC, 0x5338, 0x99BD, 0x5340, 0x99BE, 0x5346, 0x99BF, 0x5345, 0x99C0, 0x4E17, + 0x99C1, 0x5349, 0x99C2, 0x534D, 0x99C3, 0x51D6, 0x99C4, 0x535E, 0x99C5, 0x5369, 0x99C6, 0x536E, 0x99C7, 0x5918, 0x99C8, 0x537B, + 0x99C9, 0x5377, 0x99CA, 0x5382, 0x99CB, 0x5396, 0x99CC, 0x53A0, 0x99CD, 0x53A6, 0x99CE, 0x53A5, 0x99CF, 0x53AE, 0x99D0, 0x53B0, + 0x99D1, 0x53B6, 0x99D2, 0x53C3, 0x99D3, 0x7C12, 0x99D4, 0x96D9, 0x99D5, 0x53DF, 0x99D6, 0x66FC, 0x99D7, 0x71EE, 0x99D8, 0x53EE, + 0x99D9, 0x53E8, 0x99DA, 0x53ED, 0x99DB, 0x53FA, 0x99DC, 0x5401, 0x99DD, 0x543D, 0x99DE, 0x5440, 0x99DF, 0x542C, 0x99E0, 0x542D, + 0x99E1, 0x543C, 0x99E2, 0x542E, 0x99E3, 0x5436, 0x99E4, 0x5429, 0x99E5, 0x541D, 0x99E6, 0x544E, 0x99E7, 0x548F, 0x99E8, 0x5475, + 0x99E9, 0x548E, 0x99EA, 0x545F, 0x99EB, 0x5471, 0x99EC, 0x5477, 0x99ED, 0x5470, 0x99EE, 0x5492, 0x99EF, 0x547B, 0x99F0, 0x5480, + 0x99F1, 0x5476, 0x99F2, 0x5484, 0x99F3, 0x5490, 0x99F4, 0x5486, 0x99F5, 0x54C7, 0x99F6, 0x54A2, 0x99F7, 0x54B8, 0x99F8, 0x54A5, + 0x99F9, 0x54AC, 0x99FA, 0x54C4, 0x99FB, 0x54C8, 0x99FC, 0x54A8, 0x9A40, 0x54AB, 0x9A41, 0x54C2, 0x9A42, 0x54A4, 0x9A43, 0x54BE, + 0x9A44, 0x54BC, 0x9A45, 0x54D8, 0x9A46, 0x54E5, 0x9A47, 0x54E6, 0x9A48, 0x550F, 0x9A49, 0x5514, 0x9A4A, 0x54FD, 0x9A4B, 0x54EE, + 0x9A4C, 0x54ED, 0x9A4D, 0x54FA, 0x9A4E, 0x54E2, 0x9A4F, 0x5539, 0x9A50, 0x5540, 0x9A51, 0x5563, 0x9A52, 0x554C, 0x9A53, 0x552E, + 0x9A54, 0x555C, 0x9A55, 0x5545, 0x9A56, 0x5556, 0x9A57, 0x5557, 0x9A58, 0x5538, 0x9A59, 0x5533, 0x9A5A, 0x555D, 0x9A5B, 0x5599, + 0x9A5C, 0x5580, 0x9A5D, 0x54AF, 0x9A5E, 0x558A, 0x9A5F, 0x559F, 0x9A60, 0x557B, 0x9A61, 0x557E, 0x9A62, 0x5598, 0x9A63, 0x559E, + 0x9A64, 0x55AE, 0x9A65, 0x557C, 0x9A66, 0x5583, 0x9A67, 0x55A9, 0x9A68, 0x5587, 0x9A69, 0x55A8, 0x9A6A, 0x55DA, 0x9A6B, 0x55C5, + 0x9A6C, 0x55DF, 0x9A6D, 0x55C4, 0x9A6E, 0x55DC, 0x9A6F, 0x55E4, 0x9A70, 0x55D4, 0x9A71, 0x5614, 0x9A72, 0x55F7, 0x9A73, 0x5616, + 0x9A74, 0x55FE, 0x9A75, 0x55FD, 0x9A76, 0x561B, 0x9A77, 0x55F9, 0x9A78, 0x564E, 0x9A79, 0x5650, 0x9A7A, 0x71DF, 0x9A7B, 0x5634, + 0x9A7C, 0x5636, 0x9A7D, 0x5632, 0x9A7E, 0x5638, 0x9A80, 0x566B, 0x9A81, 0x5664, 0x9A82, 0x562F, 0x9A83, 0x566C, 0x9A84, 0x566A, + 0x9A85, 0x5686, 0x9A86, 0x5680, 0x9A87, 0x568A, 0x9A88, 0x56A0, 0x9A89, 0x5694, 0x9A8A, 0x568F, 0x9A8B, 0x56A5, 0x9A8C, 0x56AE, + 0x9A8D, 0x56B6, 0x9A8E, 0x56B4, 0x9A8F, 0x56C2, 0x9A90, 0x56BC, 0x9A91, 0x56C1, 0x9A92, 0x56C3, 0x9A93, 0x56C0, 0x9A94, 0x56C8, + 0x9A95, 0x56CE, 0x9A96, 0x56D1, 0x9A97, 0x56D3, 0x9A98, 0x56D7, 0x9A99, 0x56EE, 0x9A9A, 0x56F9, 0x9A9B, 0x5700, 0x9A9C, 0x56FF, + 0x9A9D, 0x5704, 0x9A9E, 0x5709, 0x9A9F, 0x5708, 0x9AA0, 0x570B, 0x9AA1, 0x570D, 0x9AA2, 0x5713, 0x9AA3, 0x5718, 0x9AA4, 0x5716, + 0x9AA5, 0x55C7, 0x9AA6, 0x571C, 0x9AA7, 0x5726, 0x9AA8, 0x5737, 0x9AA9, 0x5738, 0x9AAA, 0x574E, 0x9AAB, 0x573B, 0x9AAC, 0x5740, + 0x9AAD, 0x574F, 0x9AAE, 0x5769, 0x9AAF, 0x57C0, 0x9AB0, 0x5788, 0x9AB1, 0x5761, 0x9AB2, 0x577F, 0x9AB3, 0x5789, 0x9AB4, 0x5793, + 0x9AB5, 0x57A0, 0x9AB6, 0x57B3, 0x9AB7, 0x57A4, 0x9AB8, 0x57AA, 0x9AB9, 0x57B0, 0x9ABA, 0x57C3, 0x9ABB, 0x57C6, 0x9ABC, 0x57D4, + 0x9ABD, 0x57D2, 0x9ABE, 0x57D3, 0x9ABF, 0x580A, 0x9AC0, 0x57D6, 0x9AC1, 0x57E3, 0x9AC2, 0x580B, 0x9AC3, 0x5819, 0x9AC4, 0x581D, + 0x9AC5, 0x5872, 0x9AC6, 0x5821, 0x9AC7, 0x5862, 0x9AC8, 0x584B, 0x9AC9, 0x5870, 0x9ACA, 0x6BC0, 0x9ACB, 0x5852, 0x9ACC, 0x583D, + 0x9ACD, 0x5879, 0x9ACE, 0x5885, 0x9ACF, 0x58B9, 0x9AD0, 0x589F, 0x9AD1, 0x58AB, 0x9AD2, 0x58BA, 0x9AD3, 0x58DE, 0x9AD4, 0x58BB, + 0x9AD5, 0x58B8, 0x9AD6, 0x58AE, 0x9AD7, 0x58C5, 0x9AD8, 0x58D3, 0x9AD9, 0x58D1, 0x9ADA, 0x58D7, 0x9ADB, 0x58D9, 0x9ADC, 0x58D8, + 0x9ADD, 0x58E5, 0x9ADE, 0x58DC, 0x9ADF, 0x58E4, 0x9AE0, 0x58DF, 0x9AE1, 0x58EF, 0x9AE2, 0x58FA, 0x9AE3, 0x58F9, 0x9AE4, 0x58FB, + 0x9AE5, 0x58FC, 0x9AE6, 0x58FD, 0x9AE7, 0x5902, 0x9AE8, 0x590A, 0x9AE9, 0x5910, 0x9AEA, 0x591B, 0x9AEB, 0x68A6, 0x9AEC, 0x5925, + 0x9AED, 0x592C, 0x9AEE, 0x592D, 0x9AEF, 0x5932, 0x9AF0, 0x5938, 0x9AF1, 0x593E, 0x9AF2, 0x7AD2, 0x9AF3, 0x5955, 0x9AF4, 0x5950, + 0x9AF5, 0x594E, 0x9AF6, 0x595A, 0x9AF7, 0x5958, 0x9AF8, 0x5962, 0x9AF9, 0x5960, 0x9AFA, 0x5967, 0x9AFB, 0x596C, 0x9AFC, 0x5969, + 0x9B40, 0x5978, 0x9B41, 0x5981, 0x9B42, 0x599D, 0x9B43, 0x4F5E, 0x9B44, 0x4FAB, 0x9B45, 0x59A3, 0x9B46, 0x59B2, 0x9B47, 0x59C6, + 0x9B48, 0x59E8, 0x9B49, 0x59DC, 0x9B4A, 0x598D, 0x9B4B, 0x59D9, 0x9B4C, 0x59DA, 0x9B4D, 0x5A25, 0x9B4E, 0x5A1F, 0x9B4F, 0x5A11, + 0x9B50, 0x5A1C, 0x9B51, 0x5A09, 0x9B52, 0x5A1A, 0x9B53, 0x5A40, 0x9B54, 0x5A6C, 0x9B55, 0x5A49, 0x9B56, 0x5A35, 0x9B57, 0x5A36, + 0x9B58, 0x5A62, 0x9B59, 0x5A6A, 0x9B5A, 0x5A9A, 0x9B5B, 0x5ABC, 0x9B5C, 0x5ABE, 0x9B5D, 0x5ACB, 0x9B5E, 0x5AC2, 0x9B5F, 0x5ABD, + 0x9B60, 0x5AE3, 0x9B61, 0x5AD7, 0x9B62, 0x5AE6, 0x9B63, 0x5AE9, 0x9B64, 0x5AD6, 0x9B65, 0x5AFA, 0x9B66, 0x5AFB, 0x9B67, 0x5B0C, + 0x9B68, 0x5B0B, 0x9B69, 0x5B16, 0x9B6A, 0x5B32, 0x9B6B, 0x5AD0, 0x9B6C, 0x5B2A, 0x9B6D, 0x5B36, 0x9B6E, 0x5B3E, 0x9B6F, 0x5B43, + 0x9B70, 0x5B45, 0x9B71, 0x5B40, 0x9B72, 0x5B51, 0x9B73, 0x5B55, 0x9B74, 0x5B5A, 0x9B75, 0x5B5B, 0x9B76, 0x5B65, 0x9B77, 0x5B69, + 0x9B78, 0x5B70, 0x9B79, 0x5B73, 0x9B7A, 0x5B75, 0x9B7B, 0x5B78, 0x9B7C, 0x6588, 0x9B7D, 0x5B7A, 0x9B7E, 0x5B80, 0x9B80, 0x5B83, + 0x9B81, 0x5BA6, 0x9B82, 0x5BB8, 0x9B83, 0x5BC3, 0x9B84, 0x5BC7, 0x9B85, 0x5BC9, 0x9B86, 0x5BD4, 0x9B87, 0x5BD0, 0x9B88, 0x5BE4, + 0x9B89, 0x5BE6, 0x9B8A, 0x5BE2, 0x9B8B, 0x5BDE, 0x9B8C, 0x5BE5, 0x9B8D, 0x5BEB, 0x9B8E, 0x5BF0, 0x9B8F, 0x5BF6, 0x9B90, 0x5BF3, + 0x9B91, 0x5C05, 0x9B92, 0x5C07, 0x9B93, 0x5C08, 0x9B94, 0x5C0D, 0x9B95, 0x5C13, 0x9B96, 0x5C20, 0x9B97, 0x5C22, 0x9B98, 0x5C28, + 0x9B99, 0x5C38, 0x9B9A, 0x5C39, 0x9B9B, 0x5C41, 0x9B9C, 0x5C46, 0x9B9D, 0x5C4E, 0x9B9E, 0x5C53, 0x9B9F, 0x5C50, 0x9BA0, 0x5C4F, + 0x9BA1, 0x5B71, 0x9BA2, 0x5C6C, 0x9BA3, 0x5C6E, 0x9BA4, 0x4E62, 0x9BA5, 0x5C76, 0x9BA6, 0x5C79, 0x9BA7, 0x5C8C, 0x9BA8, 0x5C91, + 0x9BA9, 0x5C94, 0x9BAA, 0x599B, 0x9BAB, 0x5CAB, 0x9BAC, 0x5CBB, 0x9BAD, 0x5CB6, 0x9BAE, 0x5CBC, 0x9BAF, 0x5CB7, 0x9BB0, 0x5CC5, + 0x9BB1, 0x5CBE, 0x9BB2, 0x5CC7, 0x9BB3, 0x5CD9, 0x9BB4, 0x5CE9, 0x9BB5, 0x5CFD, 0x9BB6, 0x5CFA, 0x9BB7, 0x5CED, 0x9BB8, 0x5D8C, + 0x9BB9, 0x5CEA, 0x9BBA, 0x5D0B, 0x9BBB, 0x5D15, 0x9BBC, 0x5D17, 0x9BBD, 0x5D5C, 0x9BBE, 0x5D1F, 0x9BBF, 0x5D1B, 0x9BC0, 0x5D11, + 0x9BC1, 0x5D14, 0x9BC2, 0x5D22, 0x9BC3, 0x5D1A, 0x9BC4, 0x5D19, 0x9BC5, 0x5D18, 0x9BC6, 0x5D4C, 0x9BC7, 0x5D52, 0x9BC8, 0x5D4E, + 0x9BC9, 0x5D4B, 0x9BCA, 0x5D6C, 0x9BCB, 0x5D73, 0x9BCC, 0x5D76, 0x9BCD, 0x5D87, 0x9BCE, 0x5D84, 0x9BCF, 0x5D82, 0x9BD0, 0x5DA2, + 0x9BD1, 0x5D9D, 0x9BD2, 0x5DAC, 0x9BD3, 0x5DAE, 0x9BD4, 0x5DBD, 0x9BD5, 0x5D90, 0x9BD6, 0x5DB7, 0x9BD7, 0x5DBC, 0x9BD8, 0x5DC9, + 0x9BD9, 0x5DCD, 0x9BDA, 0x5DD3, 0x9BDB, 0x5DD2, 0x9BDC, 0x5DD6, 0x9BDD, 0x5DDB, 0x9BDE, 0x5DEB, 0x9BDF, 0x5DF2, 0x9BE0, 0x5DF5, + 0x9BE1, 0x5E0B, 0x9BE2, 0x5E1A, 0x9BE3, 0x5E19, 0x9BE4, 0x5E11, 0x9BE5, 0x5E1B, 0x9BE6, 0x5E36, 0x9BE7, 0x5E37, 0x9BE8, 0x5E44, + 0x9BE9, 0x5E43, 0x9BEA, 0x5E40, 0x9BEB, 0x5E4E, 0x9BEC, 0x5E57, 0x9BED, 0x5E54, 0x9BEE, 0x5E5F, 0x9BEF, 0x5E62, 0x9BF0, 0x5E64, + 0x9BF1, 0x5E47, 0x9BF2, 0x5E75, 0x9BF3, 0x5E76, 0x9BF4, 0x5E7A, 0x9BF5, 0x9EBC, 0x9BF6, 0x5E7F, 0x9BF7, 0x5EA0, 0x9BF8, 0x5EC1, + 0x9BF9, 0x5EC2, 0x9BFA, 0x5EC8, 0x9BFB, 0x5ED0, 0x9BFC, 0x5ECF, 0x9C40, 0x5ED6, 0x9C41, 0x5EE3, 0x9C42, 0x5EDD, 0x9C43, 0x5EDA, + 0x9C44, 0x5EDB, 0x9C45, 0x5EE2, 0x9C46, 0x5EE1, 0x9C47, 0x5EE8, 0x9C48, 0x5EE9, 0x9C49, 0x5EEC, 0x9C4A, 0x5EF1, 0x9C4B, 0x5EF3, + 0x9C4C, 0x5EF0, 0x9C4D, 0x5EF4, 0x9C4E, 0x5EF8, 0x9C4F, 0x5EFE, 0x9C50, 0x5F03, 0x9C51, 0x5F09, 0x9C52, 0x5F5D, 0x9C53, 0x5F5C, + 0x9C54, 0x5F0B, 0x9C55, 0x5F11, 0x9C56, 0x5F16, 0x9C57, 0x5F29, 0x9C58, 0x5F2D, 0x9C59, 0x5F38, 0x9C5A, 0x5F41, 0x9C5B, 0x5F48, + 0x9C5C, 0x5F4C, 0x9C5D, 0x5F4E, 0x9C5E, 0x5F2F, 0x9C5F, 0x5F51, 0x9C60, 0x5F56, 0x9C61, 0x5F57, 0x9C62, 0x5F59, 0x9C63, 0x5F61, + 0x9C64, 0x5F6D, 0x9C65, 0x5F73, 0x9C66, 0x5F77, 0x9C67, 0x5F83, 0x9C68, 0x5F82, 0x9C69, 0x5F7F, 0x9C6A, 0x5F8A, 0x9C6B, 0x5F88, + 0x9C6C, 0x5F91, 0x9C6D, 0x5F87, 0x9C6E, 0x5F9E, 0x9C6F, 0x5F99, 0x9C70, 0x5F98, 0x9C71, 0x5FA0, 0x9C72, 0x5FA8, 0x9C73, 0x5FAD, + 0x9C74, 0x5FBC, 0x9C75, 0x5FD6, 0x9C76, 0x5FFB, 0x9C77, 0x5FE4, 0x9C78, 0x5FF8, 0x9C79, 0x5FF1, 0x9C7A, 0x5FDD, 0x9C7B, 0x60B3, + 0x9C7C, 0x5FFF, 0x9C7D, 0x6021, 0x9C7E, 0x6060, 0x9C80, 0x6019, 0x9C81, 0x6010, 0x9C82, 0x6029, 0x9C83, 0x600E, 0x9C84, 0x6031, + 0x9C85, 0x601B, 0x9C86, 0x6015, 0x9C87, 0x602B, 0x9C88, 0x6026, 0x9C89, 0x600F, 0x9C8A, 0x603A, 0x9C8B, 0x605A, 0x9C8C, 0x6041, + 0x9C8D, 0x606A, 0x9C8E, 0x6077, 0x9C8F, 0x605F, 0x9C90, 0x604A, 0x9C91, 0x6046, 0x9C92, 0x604D, 0x9C93, 0x6063, 0x9C94, 0x6043, + 0x9C95, 0x6064, 0x9C96, 0x6042, 0x9C97, 0x606C, 0x9C98, 0x606B, 0x9C99, 0x6059, 0x9C9A, 0x6081, 0x9C9B, 0x608D, 0x9C9C, 0x60E7, + 0x9C9D, 0x6083, 0x9C9E, 0x609A, 0x9C9F, 0x6084, 0x9CA0, 0x609B, 0x9CA1, 0x6096, 0x9CA2, 0x6097, 0x9CA3, 0x6092, 0x9CA4, 0x60A7, + 0x9CA5, 0x608B, 0x9CA6, 0x60E1, 0x9CA7, 0x60B8, 0x9CA8, 0x60E0, 0x9CA9, 0x60D3, 0x9CAA, 0x60B4, 0x9CAB, 0x5FF0, 0x9CAC, 0x60BD, + 0x9CAD, 0x60C6, 0x9CAE, 0x60B5, 0x9CAF, 0x60D8, 0x9CB0, 0x614D, 0x9CB1, 0x6115, 0x9CB2, 0x6106, 0x9CB3, 0x60F6, 0x9CB4, 0x60F7, + 0x9CB5, 0x6100, 0x9CB6, 0x60F4, 0x9CB7, 0x60FA, 0x9CB8, 0x6103, 0x9CB9, 0x6121, 0x9CBA, 0x60FB, 0x9CBB, 0x60F1, 0x9CBC, 0x610D, + 0x9CBD, 0x610E, 0x9CBE, 0x6147, 0x9CBF, 0x613E, 0x9CC0, 0x6128, 0x9CC1, 0x6127, 0x9CC2, 0x614A, 0x9CC3, 0x613F, 0x9CC4, 0x613C, + 0x9CC5, 0x612C, 0x9CC6, 0x6134, 0x9CC7, 0x613D, 0x9CC8, 0x6142, 0x9CC9, 0x6144, 0x9CCA, 0x6173, 0x9CCB, 0x6177, 0x9CCC, 0x6158, + 0x9CCD, 0x6159, 0x9CCE, 0x615A, 0x9CCF, 0x616B, 0x9CD0, 0x6174, 0x9CD1, 0x616F, 0x9CD2, 0x6165, 0x9CD3, 0x6171, 0x9CD4, 0x615F, + 0x9CD5, 0x615D, 0x9CD6, 0x6153, 0x9CD7, 0x6175, 0x9CD8, 0x6199, 0x9CD9, 0x6196, 0x9CDA, 0x6187, 0x9CDB, 0x61AC, 0x9CDC, 0x6194, + 0x9CDD, 0x619A, 0x9CDE, 0x618A, 0x9CDF, 0x6191, 0x9CE0, 0x61AB, 0x9CE1, 0x61AE, 0x9CE2, 0x61CC, 0x9CE3, 0x61CA, 0x9CE4, 0x61C9, + 0x9CE5, 0x61F7, 0x9CE6, 0x61C8, 0x9CE7, 0x61C3, 0x9CE8, 0x61C6, 0x9CE9, 0x61BA, 0x9CEA, 0x61CB, 0x9CEB, 0x7F79, 0x9CEC, 0x61CD, + 0x9CED, 0x61E6, 0x9CEE, 0x61E3, 0x9CEF, 0x61F6, 0x9CF0, 0x61FA, 0x9CF1, 0x61F4, 0x9CF2, 0x61FF, 0x9CF3, 0x61FD, 0x9CF4, 0x61FC, + 0x9CF5, 0x61FE, 0x9CF6, 0x6200, 0x9CF7, 0x6208, 0x9CF8, 0x6209, 0x9CF9, 0x620D, 0x9CFA, 0x620C, 0x9CFB, 0x6214, 0x9CFC, 0x621B, + 0x9D40, 0x621E, 0x9D41, 0x6221, 0x9D42, 0x622A, 0x9D43, 0x622E, 0x9D44, 0x6230, 0x9D45, 0x6232, 0x9D46, 0x6233, 0x9D47, 0x6241, + 0x9D48, 0x624E, 0x9D49, 0x625E, 0x9D4A, 0x6263, 0x9D4B, 0x625B, 0x9D4C, 0x6260, 0x9D4D, 0x6268, 0x9D4E, 0x627C, 0x9D4F, 0x6282, + 0x9D50, 0x6289, 0x9D51, 0x627E, 0x9D52, 0x6292, 0x9D53, 0x6293, 0x9D54, 0x6296, 0x9D55, 0x62D4, 0x9D56, 0x6283, 0x9D57, 0x6294, + 0x9D58, 0x62D7, 0x9D59, 0x62D1, 0x9D5A, 0x62BB, 0x9D5B, 0x62CF, 0x9D5C, 0x62FF, 0x9D5D, 0x62C6, 0x9D5E, 0x64D4, 0x9D5F, 0x62C8, + 0x9D60, 0x62DC, 0x9D61, 0x62CC, 0x9D62, 0x62CA, 0x9D63, 0x62C2, 0x9D64, 0x62C7, 0x9D65, 0x629B, 0x9D66, 0x62C9, 0x9D67, 0x630C, + 0x9D68, 0x62EE, 0x9D69, 0x62F1, 0x9D6A, 0x6327, 0x9D6B, 0x6302, 0x9D6C, 0x6308, 0x9D6D, 0x62EF, 0x9D6E, 0x62F5, 0x9D6F, 0x6350, + 0x9D70, 0x633E, 0x9D71, 0x634D, 0x9D72, 0x641C, 0x9D73, 0x634F, 0x9D74, 0x6396, 0x9D75, 0x638E, 0x9D76, 0x6380, 0x9D77, 0x63AB, + 0x9D78, 0x6376, 0x9D79, 0x63A3, 0x9D7A, 0x638F, 0x9D7B, 0x6389, 0x9D7C, 0x639F, 0x9D7D, 0x63B5, 0x9D7E, 0x636B, 0x9D80, 0x6369, + 0x9D81, 0x63BE, 0x9D82, 0x63E9, 0x9D83, 0x63C0, 0x9D84, 0x63C6, 0x9D85, 0x63E3, 0x9D86, 0x63C9, 0x9D87, 0x63D2, 0x9D88, 0x63F6, + 0x9D89, 0x63C4, 0x9D8A, 0x6416, 0x9D8B, 0x6434, 0x9D8C, 0x6406, 0x9D8D, 0x6413, 0x9D8E, 0x6426, 0x9D8F, 0x6436, 0x9D90, 0x651D, + 0x9D91, 0x6417, 0x9D92, 0x6428, 0x9D93, 0x640F, 0x9D94, 0x6467, 0x9D95, 0x646F, 0x9D96, 0x6476, 0x9D97, 0x644E, 0x9D98, 0x652A, + 0x9D99, 0x6495, 0x9D9A, 0x6493, 0x9D9B, 0x64A5, 0x9D9C, 0x64A9, 0x9D9D, 0x6488, 0x9D9E, 0x64BC, 0x9D9F, 0x64DA, 0x9DA0, 0x64D2, + 0x9DA1, 0x64C5, 0x9DA2, 0x64C7, 0x9DA3, 0x64BB, 0x9DA4, 0x64D8, 0x9DA5, 0x64C2, 0x9DA6, 0x64F1, 0x9DA7, 0x64E7, 0x9DA8, 0x8209, + 0x9DA9, 0x64E0, 0x9DAA, 0x64E1, 0x9DAB, 0x62AC, 0x9DAC, 0x64E3, 0x9DAD, 0x64EF, 0x9DAE, 0x652C, 0x9DAF, 0x64F6, 0x9DB0, 0x64F4, + 0x9DB1, 0x64F2, 0x9DB2, 0x64FA, 0x9DB3, 0x6500, 0x9DB4, 0x64FD, 0x9DB5, 0x6518, 0x9DB6, 0x651C, 0x9DB7, 0x6505, 0x9DB8, 0x6524, + 0x9DB9, 0x6523, 0x9DBA, 0x652B, 0x9DBB, 0x6534, 0x9DBC, 0x6535, 0x9DBD, 0x6537, 0x9DBE, 0x6536, 0x9DBF, 0x6538, 0x9DC0, 0x754B, + 0x9DC1, 0x6548, 0x9DC2, 0x6556, 0x9DC3, 0x6555, 0x9DC4, 0x654D, 0x9DC5, 0x6558, 0x9DC6, 0x655E, 0x9DC7, 0x655D, 0x9DC8, 0x6572, + 0x9DC9, 0x6578, 0x9DCA, 0x6582, 0x9DCB, 0x6583, 0x9DCC, 0x8B8A, 0x9DCD, 0x659B, 0x9DCE, 0x659F, 0x9DCF, 0x65AB, 0x9DD0, 0x65B7, + 0x9DD1, 0x65C3, 0x9DD2, 0x65C6, 0x9DD3, 0x65C1, 0x9DD4, 0x65C4, 0x9DD5, 0x65CC, 0x9DD6, 0x65D2, 0x9DD7, 0x65DB, 0x9DD8, 0x65D9, + 0x9DD9, 0x65E0, 0x9DDA, 0x65E1, 0x9DDB, 0x65F1, 0x9DDC, 0x6772, 0x9DDD, 0x660A, 0x9DDE, 0x6603, 0x9DDF, 0x65FB, 0x9DE0, 0x6773, + 0x9DE1, 0x6635, 0x9DE2, 0x6636, 0x9DE3, 0x6634, 0x9DE4, 0x661C, 0x9DE5, 0x664F, 0x9DE6, 0x6644, 0x9DE7, 0x6649, 0x9DE8, 0x6641, + 0x9DE9, 0x665E, 0x9DEA, 0x665D, 0x9DEB, 0x6664, 0x9DEC, 0x6667, 0x9DED, 0x6668, 0x9DEE, 0x665F, 0x9DEF, 0x6662, 0x9DF0, 0x6670, + 0x9DF1, 0x6683, 0x9DF2, 0x6688, 0x9DF3, 0x668E, 0x9DF4, 0x6689, 0x9DF5, 0x6684, 0x9DF6, 0x6698, 0x9DF7, 0x669D, 0x9DF8, 0x66C1, + 0x9DF9, 0x66B9, 0x9DFA, 0x66C9, 0x9DFB, 0x66BE, 0x9DFC, 0x66BC, 0x9E40, 0x66C4, 0x9E41, 0x66B8, 0x9E42, 0x66D6, 0x9E43, 0x66DA, + 0x9E44, 0x66E0, 0x9E45, 0x663F, 0x9E46, 0x66E6, 0x9E47, 0x66E9, 0x9E48, 0x66F0, 0x9E49, 0x66F5, 0x9E4A, 0x66F7, 0x9E4B, 0x670F, + 0x9E4C, 0x6716, 0x9E4D, 0x671E, 0x9E4E, 0x6726, 0x9E4F, 0x6727, 0x9E50, 0x9738, 0x9E51, 0x672E, 0x9E52, 0x673F, 0x9E53, 0x6736, + 0x9E54, 0x6741, 0x9E55, 0x6738, 0x9E56, 0x6737, 0x9E57, 0x6746, 0x9E58, 0x675E, 0x9E59, 0x6760, 0x9E5A, 0x6759, 0x9E5B, 0x6763, + 0x9E5C, 0x6764, 0x9E5D, 0x6789, 0x9E5E, 0x6770, 0x9E5F, 0x67A9, 0x9E60, 0x677C, 0x9E61, 0x676A, 0x9E62, 0x678C, 0x9E63, 0x678B, + 0x9E64, 0x67A6, 0x9E65, 0x67A1, 0x9E66, 0x6785, 0x9E67, 0x67B7, 0x9E68, 0x67EF, 0x9E69, 0x67B4, 0x9E6A, 0x67EC, 0x9E6B, 0x67B3, + 0x9E6C, 0x67E9, 0x9E6D, 0x67B8, 0x9E6E, 0x67E4, 0x9E6F, 0x67DE, 0x9E70, 0x67DD, 0x9E71, 0x67E2, 0x9E72, 0x67EE, 0x9E73, 0x67B9, + 0x9E74, 0x67CE, 0x9E75, 0x67C6, 0x9E76, 0x67E7, 0x9E77, 0x6A9C, 0x9E78, 0x681E, 0x9E79, 0x6846, 0x9E7A, 0x6829, 0x9E7B, 0x6840, + 0x9E7C, 0x684D, 0x9E7D, 0x6832, 0x9E7E, 0x684E, 0x9E80, 0x68B3, 0x9E81, 0x682B, 0x9E82, 0x6859, 0x9E83, 0x6863, 0x9E84, 0x6877, + 0x9E85, 0x687F, 0x9E86, 0x689F, 0x9E87, 0x688F, 0x9E88, 0x68AD, 0x9E89, 0x6894, 0x9E8A, 0x689D, 0x9E8B, 0x689B, 0x9E8C, 0x6883, + 0x9E8D, 0x6AAE, 0x9E8E, 0x68B9, 0x9E8F, 0x6874, 0x9E90, 0x68B5, 0x9E91, 0x68A0, 0x9E92, 0x68BA, 0x9E93, 0x690F, 0x9E94, 0x688D, + 0x9E95, 0x687E, 0x9E96, 0x6901, 0x9E97, 0x68CA, 0x9E98, 0x6908, 0x9E99, 0x68D8, 0x9E9A, 0x6922, 0x9E9B, 0x6926, 0x9E9C, 0x68E1, + 0x9E9D, 0x690C, 0x9E9E, 0x68CD, 0x9E9F, 0x68D4, 0x9EA0, 0x68E7, 0x9EA1, 0x68D5, 0x9EA2, 0x6936, 0x9EA3, 0x6912, 0x9EA4, 0x6904, + 0x9EA5, 0x68D7, 0x9EA6, 0x68E3, 0x9EA7, 0x6925, 0x9EA8, 0x68F9, 0x9EA9, 0x68E0, 0x9EAA, 0x68EF, 0x9EAB, 0x6928, 0x9EAC, 0x692A, + 0x9EAD, 0x691A, 0x9EAE, 0x6923, 0x9EAF, 0x6921, 0x9EB0, 0x68C6, 0x9EB1, 0x6979, 0x9EB2, 0x6977, 0x9EB3, 0x695C, 0x9EB4, 0x6978, + 0x9EB5, 0x696B, 0x9EB6, 0x6954, 0x9EB7, 0x697E, 0x9EB8, 0x696E, 0x9EB9, 0x6939, 0x9EBA, 0x6974, 0x9EBB, 0x693D, 0x9EBC, 0x6959, + 0x9EBD, 0x6930, 0x9EBE, 0x6961, 0x9EBF, 0x695E, 0x9EC0, 0x695D, 0x9EC1, 0x6981, 0x9EC2, 0x696A, 0x9EC3, 0x69B2, 0x9EC4, 0x69AE, + 0x9EC5, 0x69D0, 0x9EC6, 0x69BF, 0x9EC7, 0x69C1, 0x9EC8, 0x69D3, 0x9EC9, 0x69BE, 0x9ECA, 0x69CE, 0x9ECB, 0x5BE8, 0x9ECC, 0x69CA, + 0x9ECD, 0x69DD, 0x9ECE, 0x69BB, 0x9ECF, 0x69C3, 0x9ED0, 0x69A7, 0x9ED1, 0x6A2E, 0x9ED2, 0x6991, 0x9ED3, 0x69A0, 0x9ED4, 0x699C, + 0x9ED5, 0x6995, 0x9ED6, 0x69B4, 0x9ED7, 0x69DE, 0x9ED8, 0x69E8, 0x9ED9, 0x6A02, 0x9EDA, 0x6A1B, 0x9EDB, 0x69FF, 0x9EDC, 0x6B0A, + 0x9EDD, 0x69F9, 0x9EDE, 0x69F2, 0x9EDF, 0x69E7, 0x9EE0, 0x6A05, 0x9EE1, 0x69B1, 0x9EE2, 0x6A1E, 0x9EE3, 0x69ED, 0x9EE4, 0x6A14, + 0x9EE5, 0x69EB, 0x9EE6, 0x6A0A, 0x9EE7, 0x6A12, 0x9EE8, 0x6AC1, 0x9EE9, 0x6A23, 0x9EEA, 0x6A13, 0x9EEB, 0x6A44, 0x9EEC, 0x6A0C, + 0x9EED, 0x6A72, 0x9EEE, 0x6A36, 0x9EEF, 0x6A78, 0x9EF0, 0x6A47, 0x9EF1, 0x6A62, 0x9EF2, 0x6A59, 0x9EF3, 0x6A66, 0x9EF4, 0x6A48, + 0x9EF5, 0x6A38, 0x9EF6, 0x6A22, 0x9EF7, 0x6A90, 0x9EF8, 0x6A8D, 0x9EF9, 0x6AA0, 0x9EFA, 0x6A84, 0x9EFB, 0x6AA2, 0x9EFC, 0x6AA3, + 0x9F40, 0x6A97, 0x9F41, 0x8617, 0x9F42, 0x6ABB, 0x9F43, 0x6AC3, 0x9F44, 0x6AC2, 0x9F45, 0x6AB8, 0x9F46, 0x6AB3, 0x9F47, 0x6AAC, + 0x9F48, 0x6ADE, 0x9F49, 0x6AD1, 0x9F4A, 0x6ADF, 0x9F4B, 0x6AAA, 0x9F4C, 0x6ADA, 0x9F4D, 0x6AEA, 0x9F4E, 0x6AFB, 0x9F4F, 0x6B05, + 0x9F50, 0x8616, 0x9F51, 0x6AFA, 0x9F52, 0x6B12, 0x9F53, 0x6B16, 0x9F54, 0x9B31, 0x9F55, 0x6B1F, 0x9F56, 0x6B38, 0x9F57, 0x6B37, + 0x9F58, 0x76DC, 0x9F59, 0x6B39, 0x9F5A, 0x98EE, 0x9F5B, 0x6B47, 0x9F5C, 0x6B43, 0x9F5D, 0x6B49, 0x9F5E, 0x6B50, 0x9F5F, 0x6B59, + 0x9F60, 0x6B54, 0x9F61, 0x6B5B, 0x9F62, 0x6B5F, 0x9F63, 0x6B61, 0x9F64, 0x6B78, 0x9F65, 0x6B79, 0x9F66, 0x6B7F, 0x9F67, 0x6B80, + 0x9F68, 0x6B84, 0x9F69, 0x6B83, 0x9F6A, 0x6B8D, 0x9F6B, 0x6B98, 0x9F6C, 0x6B95, 0x9F6D, 0x6B9E, 0x9F6E, 0x6BA4, 0x9F6F, 0x6BAA, + 0x9F70, 0x6BAB, 0x9F71, 0x6BAF, 0x9F72, 0x6BB2, 0x9F73, 0x6BB1, 0x9F74, 0x6BB3, 0x9F75, 0x6BB7, 0x9F76, 0x6BBC, 0x9F77, 0x6BC6, + 0x9F78, 0x6BCB, 0x9F79, 0x6BD3, 0x9F7A, 0x6BDF, 0x9F7B, 0x6BEC, 0x9F7C, 0x6BEB, 0x9F7D, 0x6BF3, 0x9F7E, 0x6BEF, 0x9F80, 0x9EBE, + 0x9F81, 0x6C08, 0x9F82, 0x6C13, 0x9F83, 0x6C14, 0x9F84, 0x6C1B, 0x9F85, 0x6C24, 0x9F86, 0x6C23, 0x9F87, 0x6C5E, 0x9F88, 0x6C55, + 0x9F89, 0x6C62, 0x9F8A, 0x6C6A, 0x9F8B, 0x6C82, 0x9F8C, 0x6C8D, 0x9F8D, 0x6C9A, 0x9F8E, 0x6C81, 0x9F8F, 0x6C9B, 0x9F90, 0x6C7E, + 0x9F91, 0x6C68, 0x9F92, 0x6C73, 0x9F93, 0x6C92, 0x9F94, 0x6C90, 0x9F95, 0x6CC4, 0x9F96, 0x6CF1, 0x9F97, 0x6CD3, 0x9F98, 0x6CBD, + 0x9F99, 0x6CD7, 0x9F9A, 0x6CC5, 0x9F9B, 0x6CDD, 0x9F9C, 0x6CAE, 0x9F9D, 0x6CB1, 0x9F9E, 0x6CBE, 0x9F9F, 0x6CBA, 0x9FA0, 0x6CDB, + 0x9FA1, 0x6CEF, 0x9FA2, 0x6CD9, 0x9FA3, 0x6CEA, 0x9FA4, 0x6D1F, 0x9FA5, 0x884D, 0x9FA6, 0x6D36, 0x9FA7, 0x6D2B, 0x9FA8, 0x6D3D, + 0x9FA9, 0x6D38, 0x9FAA, 0x6D19, 0x9FAB, 0x6D35, 0x9FAC, 0x6D33, 0x9FAD, 0x6D12, 0x9FAE, 0x6D0C, 0x9FAF, 0x6D63, 0x9FB0, 0x6D93, + 0x9FB1, 0x6D64, 0x9FB2, 0x6D5A, 0x9FB3, 0x6D79, 0x9FB4, 0x6D59, 0x9FB5, 0x6D8E, 0x9FB6, 0x6D95, 0x9FB7, 0x6FE4, 0x9FB8, 0x6D85, + 0x9FB9, 0x6DF9, 0x9FBA, 0x6E15, 0x9FBB, 0x6E0A, 0x9FBC, 0x6DB5, 0x9FBD, 0x6DC7, 0x9FBE, 0x6DE6, 0x9FBF, 0x6DB8, 0x9FC0, 0x6DC6, + 0x9FC1, 0x6DEC, 0x9FC2, 0x6DDE, 0x9FC3, 0x6DCC, 0x9FC4, 0x6DE8, 0x9FC5, 0x6DD2, 0x9FC6, 0x6DC5, 0x9FC7, 0x6DFA, 0x9FC8, 0x6DD9, + 0x9FC9, 0x6DE4, 0x9FCA, 0x6DD5, 0x9FCB, 0x6DEA, 0x9FCC, 0x6DEE, 0x9FCD, 0x6E2D, 0x9FCE, 0x6E6E, 0x9FCF, 0x6E2E, 0x9FD0, 0x6E19, + 0x9FD1, 0x6E72, 0x9FD2, 0x6E5F, 0x9FD3, 0x6E3E, 0x9FD4, 0x6E23, 0x9FD5, 0x6E6B, 0x9FD6, 0x6E2B, 0x9FD7, 0x6E76, 0x9FD8, 0x6E4D, + 0x9FD9, 0x6E1F, 0x9FDA, 0x6E43, 0x9FDB, 0x6E3A, 0x9FDC, 0x6E4E, 0x9FDD, 0x6E24, 0x9FDE, 0x6EFF, 0x9FDF, 0x6E1D, 0x9FE0, 0x6E38, + 0x9FE1, 0x6E82, 0x9FE2, 0x6EAA, 0x9FE3, 0x6E98, 0x9FE4, 0x6EC9, 0x9FE5, 0x6EB7, 0x9FE6, 0x6ED3, 0x9FE7, 0x6EBD, 0x9FE8, 0x6EAF, + 0x9FE9, 0x6EC4, 0x9FEA, 0x6EB2, 0x9FEB, 0x6ED4, 0x9FEC, 0x6ED5, 0x9FED, 0x6E8F, 0x9FEE, 0x6EA5, 0x9FEF, 0x6EC2, 0x9FF0, 0x6E9F, + 0x9FF1, 0x6F41, 0x9FF2, 0x6F11, 0x9FF3, 0x704C, 0x9FF4, 0x6EEC, 0x9FF5, 0x6EF8, 0x9FF6, 0x6EFE, 0x9FF7, 0x6F3F, 0x9FF8, 0x6EF2, + 0x9FF9, 0x6F31, 0x9FFA, 0x6EEF, 0x9FFB, 0x6F32, 0x9FFC, 0x6ECC, 0xE040, 0x6F3E, 0xE041, 0x6F13, 0xE042, 0x6EF7, 0xE043, 0x6F86, + 0xE044, 0x6F7A, 0xE045, 0x6F78, 0xE046, 0x6F81, 0xE047, 0x6F80, 0xE048, 0x6F6F, 0xE049, 0x6F5B, 0xE04A, 0x6FF3, 0xE04B, 0x6F6D, + 0xE04C, 0x6F82, 0xE04D, 0x6F7C, 0xE04E, 0x6F58, 0xE04F, 0x6F8E, 0xE050, 0x6F91, 0xE051, 0x6FC2, 0xE052, 0x6F66, 0xE053, 0x6FB3, + 0xE054, 0x6FA3, 0xE055, 0x6FA1, 0xE056, 0x6FA4, 0xE057, 0x6FB9, 0xE058, 0x6FC6, 0xE059, 0x6FAA, 0xE05A, 0x6FDF, 0xE05B, 0x6FD5, + 0xE05C, 0x6FEC, 0xE05D, 0x6FD4, 0xE05E, 0x6FD8, 0xE05F, 0x6FF1, 0xE060, 0x6FEE, 0xE061, 0x6FDB, 0xE062, 0x7009, 0xE063, 0x700B, + 0xE064, 0x6FFA, 0xE065, 0x7011, 0xE066, 0x7001, 0xE067, 0x700F, 0xE068, 0x6FFE, 0xE069, 0x701B, 0xE06A, 0x701A, 0xE06B, 0x6F74, + 0xE06C, 0x701D, 0xE06D, 0x7018, 0xE06E, 0x701F, 0xE06F, 0x7030, 0xE070, 0x703E, 0xE071, 0x7032, 0xE072, 0x7051, 0xE073, 0x7063, + 0xE074, 0x7099, 0xE075, 0x7092, 0xE076, 0x70AF, 0xE077, 0x70F1, 0xE078, 0x70AC, 0xE079, 0x70B8, 0xE07A, 0x70B3, 0xE07B, 0x70AE, + 0xE07C, 0x70DF, 0xE07D, 0x70CB, 0xE07E, 0x70DD, 0xE080, 0x70D9, 0xE081, 0x7109, 0xE082, 0x70FD, 0xE083, 0x711C, 0xE084, 0x7119, + 0xE085, 0x7165, 0xE086, 0x7155, 0xE087, 0x7188, 0xE088, 0x7166, 0xE089, 0x7162, 0xE08A, 0x714C, 0xE08B, 0x7156, 0xE08C, 0x716C, + 0xE08D, 0x718F, 0xE08E, 0x71FB, 0xE08F, 0x7184, 0xE090, 0x7195, 0xE091, 0x71A8, 0xE092, 0x71AC, 0xE093, 0x71D7, 0xE094, 0x71B9, + 0xE095, 0x71BE, 0xE096, 0x71D2, 0xE097, 0x71C9, 0xE098, 0x71D4, 0xE099, 0x71CE, 0xE09A, 0x71E0, 0xE09B, 0x71EC, 0xE09C, 0x71E7, + 0xE09D, 0x71F5, 0xE09E, 0x71FC, 0xE09F, 0x71F9, 0xE0A0, 0x71FF, 0xE0A1, 0x720D, 0xE0A2, 0x7210, 0xE0A3, 0x721B, 0xE0A4, 0x7228, + 0xE0A5, 0x722D, 0xE0A6, 0x722C, 0xE0A7, 0x7230, 0xE0A8, 0x7232, 0xE0A9, 0x723B, 0xE0AA, 0x723C, 0xE0AB, 0x723F, 0xE0AC, 0x7240, + 0xE0AD, 0x7246, 0xE0AE, 0x724B, 0xE0AF, 0x7258, 0xE0B0, 0x7274, 0xE0B1, 0x727E, 0xE0B2, 0x7282, 0xE0B3, 0x7281, 0xE0B4, 0x7287, + 0xE0B5, 0x7292, 0xE0B6, 0x7296, 0xE0B7, 0x72A2, 0xE0B8, 0x72A7, 0xE0B9, 0x72B9, 0xE0BA, 0x72B2, 0xE0BB, 0x72C3, 0xE0BC, 0x72C6, + 0xE0BD, 0x72C4, 0xE0BE, 0x72CE, 0xE0BF, 0x72D2, 0xE0C0, 0x72E2, 0xE0C1, 0x72E0, 0xE0C2, 0x72E1, 0xE0C3, 0x72F9, 0xE0C4, 0x72F7, + 0xE0C5, 0x500F, 0xE0C6, 0x7317, 0xE0C7, 0x730A, 0xE0C8, 0x731C, 0xE0C9, 0x7316, 0xE0CA, 0x731D, 0xE0CB, 0x7334, 0xE0CC, 0x732F, + 0xE0CD, 0x7329, 0xE0CE, 0x7325, 0xE0CF, 0x733E, 0xE0D0, 0x734E, 0xE0D1, 0x734F, 0xE0D2, 0x9ED8, 0xE0D3, 0x7357, 0xE0D4, 0x736A, + 0xE0D5, 0x7368, 0xE0D6, 0x7370, 0xE0D7, 0x7378, 0xE0D8, 0x7375, 0xE0D9, 0x737B, 0xE0DA, 0x737A, 0xE0DB, 0x73C8, 0xE0DC, 0x73B3, + 0xE0DD, 0x73CE, 0xE0DE, 0x73BB, 0xE0DF, 0x73C0, 0xE0E0, 0x73E5, 0xE0E1, 0x73EE, 0xE0E2, 0x73DE, 0xE0E3, 0x74A2, 0xE0E4, 0x7405, + 0xE0E5, 0x746F, 0xE0E6, 0x7425, 0xE0E7, 0x73F8, 0xE0E8, 0x7432, 0xE0E9, 0x743A, 0xE0EA, 0x7455, 0xE0EB, 0x743F, 0xE0EC, 0x745F, + 0xE0ED, 0x7459, 0xE0EE, 0x7441, 0xE0EF, 0x745C, 0xE0F0, 0x7469, 0xE0F1, 0x7470, 0xE0F2, 0x7463, 0xE0F3, 0x746A, 0xE0F4, 0x7476, + 0xE0F5, 0x747E, 0xE0F6, 0x748B, 0xE0F7, 0x749E, 0xE0F8, 0x74A7, 0xE0F9, 0x74CA, 0xE0FA, 0x74CF, 0xE0FB, 0x74D4, 0xE0FC, 0x73F1, + 0xE140, 0x74E0, 0xE141, 0x74E3, 0xE142, 0x74E7, 0xE143, 0x74E9, 0xE144, 0x74EE, 0xE145, 0x74F2, 0xE146, 0x74F0, 0xE147, 0x74F1, + 0xE148, 0x74F8, 0xE149, 0x74F7, 0xE14A, 0x7504, 0xE14B, 0x7503, 0xE14C, 0x7505, 0xE14D, 0x750C, 0xE14E, 0x750E, 0xE14F, 0x750D, + 0xE150, 0x7515, 0xE151, 0x7513, 0xE152, 0x751E, 0xE153, 0x7526, 0xE154, 0x752C, 0xE155, 0x753C, 0xE156, 0x7544, 0xE157, 0x754D, + 0xE158, 0x754A, 0xE159, 0x7549, 0xE15A, 0x755B, 0xE15B, 0x7546, 0xE15C, 0x755A, 0xE15D, 0x7569, 0xE15E, 0x7564, 0xE15F, 0x7567, + 0xE160, 0x756B, 0xE161, 0x756D, 0xE162, 0x7578, 0xE163, 0x7576, 0xE164, 0x7586, 0xE165, 0x7587, 0xE166, 0x7574, 0xE167, 0x758A, + 0xE168, 0x7589, 0xE169, 0x7582, 0xE16A, 0x7594, 0xE16B, 0x759A, 0xE16C, 0x759D, 0xE16D, 0x75A5, 0xE16E, 0x75A3, 0xE16F, 0x75C2, + 0xE170, 0x75B3, 0xE171, 0x75C3, 0xE172, 0x75B5, 0xE173, 0x75BD, 0xE174, 0x75B8, 0xE175, 0x75BC, 0xE176, 0x75B1, 0xE177, 0x75CD, + 0xE178, 0x75CA, 0xE179, 0x75D2, 0xE17A, 0x75D9, 0xE17B, 0x75E3, 0xE17C, 0x75DE, 0xE17D, 0x75FE, 0xE17E, 0x75FF, 0xE180, 0x75FC, + 0xE181, 0x7601, 0xE182, 0x75F0, 0xE183, 0x75FA, 0xE184, 0x75F2, 0xE185, 0x75F3, 0xE186, 0x760B, 0xE187, 0x760D, 0xE188, 0x7609, + 0xE189, 0x761F, 0xE18A, 0x7627, 0xE18B, 0x7620, 0xE18C, 0x7621, 0xE18D, 0x7622, 0xE18E, 0x7624, 0xE18F, 0x7634, 0xE190, 0x7630, + 0xE191, 0x763B, 0xE192, 0x7647, 0xE193, 0x7648, 0xE194, 0x7646, 0xE195, 0x765C, 0xE196, 0x7658, 0xE197, 0x7661, 0xE198, 0x7662, + 0xE199, 0x7668, 0xE19A, 0x7669, 0xE19B, 0x766A, 0xE19C, 0x7667, 0xE19D, 0x766C, 0xE19E, 0x7670, 0xE19F, 0x7672, 0xE1A0, 0x7676, + 0xE1A1, 0x7678, 0xE1A2, 0x767C, 0xE1A3, 0x7680, 0xE1A4, 0x7683, 0xE1A5, 0x7688, 0xE1A6, 0x768B, 0xE1A7, 0x768E, 0xE1A8, 0x7696, + 0xE1A9, 0x7693, 0xE1AA, 0x7699, 0xE1AB, 0x769A, 0xE1AC, 0x76B0, 0xE1AD, 0x76B4, 0xE1AE, 0x76B8, 0xE1AF, 0x76B9, 0xE1B0, 0x76BA, + 0xE1B1, 0x76C2, 0xE1B2, 0x76CD, 0xE1B3, 0x76D6, 0xE1B4, 0x76D2, 0xE1B5, 0x76DE, 0xE1B6, 0x76E1, 0xE1B7, 0x76E5, 0xE1B8, 0x76E7, + 0xE1B9, 0x76EA, 0xE1BA, 0x862F, 0xE1BB, 0x76FB, 0xE1BC, 0x7708, 0xE1BD, 0x7707, 0xE1BE, 0x7704, 0xE1BF, 0x7729, 0xE1C0, 0x7724, + 0xE1C1, 0x771E, 0xE1C2, 0x7725, 0xE1C3, 0x7726, 0xE1C4, 0x771B, 0xE1C5, 0x7737, 0xE1C6, 0x7738, 0xE1C7, 0x7747, 0xE1C8, 0x775A, + 0xE1C9, 0x7768, 0xE1CA, 0x776B, 0xE1CB, 0x775B, 0xE1CC, 0x7765, 0xE1CD, 0x777F, 0xE1CE, 0x777E, 0xE1CF, 0x7779, 0xE1D0, 0x778E, + 0xE1D1, 0x778B, 0xE1D2, 0x7791, 0xE1D3, 0x77A0, 0xE1D4, 0x779E, 0xE1D5, 0x77B0, 0xE1D6, 0x77B6, 0xE1D7, 0x77B9, 0xE1D8, 0x77BF, + 0xE1D9, 0x77BC, 0xE1DA, 0x77BD, 0xE1DB, 0x77BB, 0xE1DC, 0x77C7, 0xE1DD, 0x77CD, 0xE1DE, 0x77D7, 0xE1DF, 0x77DA, 0xE1E0, 0x77DC, + 0xE1E1, 0x77E3, 0xE1E2, 0x77EE, 0xE1E3, 0x77FC, 0xE1E4, 0x780C, 0xE1E5, 0x7812, 0xE1E6, 0x7926, 0xE1E7, 0x7820, 0xE1E8, 0x792A, + 0xE1E9, 0x7845, 0xE1EA, 0x788E, 0xE1EB, 0x7874, 0xE1EC, 0x7886, 0xE1ED, 0x787C, 0xE1EE, 0x789A, 0xE1EF, 0x788C, 0xE1F0, 0x78A3, + 0xE1F1, 0x78B5, 0xE1F2, 0x78AA, 0xE1F3, 0x78AF, 0xE1F4, 0x78D1, 0xE1F5, 0x78C6, 0xE1F6, 0x78CB, 0xE1F7, 0x78D4, 0xE1F8, 0x78BE, + 0xE1F9, 0x78BC, 0xE1FA, 0x78C5, 0xE1FB, 0x78CA, 0xE1FC, 0x78EC, 0xE240, 0x78E7, 0xE241, 0x78DA, 0xE242, 0x78FD, 0xE243, 0x78F4, + 0xE244, 0x7907, 0xE245, 0x7912, 0xE246, 0x7911, 0xE247, 0x7919, 0xE248, 0x792C, 0xE249, 0x792B, 0xE24A, 0x7940, 0xE24B, 0x7960, + 0xE24C, 0x7957, 0xE24D, 0x795F, 0xE24E, 0x795A, 0xE24F, 0x7955, 0xE250, 0x7953, 0xE251, 0x797A, 0xE252, 0x797F, 0xE253, 0x798A, + 0xE254, 0x799D, 0xE255, 0x79A7, 0xE256, 0x9F4B, 0xE257, 0x79AA, 0xE258, 0x79AE, 0xE259, 0x79B3, 0xE25A, 0x79B9, 0xE25B, 0x79BA, + 0xE25C, 0x79C9, 0xE25D, 0x79D5, 0xE25E, 0x79E7, 0xE25F, 0x79EC, 0xE260, 0x79E1, 0xE261, 0x79E3, 0xE262, 0x7A08, 0xE263, 0x7A0D, + 0xE264, 0x7A18, 0xE265, 0x7A19, 0xE266, 0x7A20, 0xE267, 0x7A1F, 0xE268, 0x7980, 0xE269, 0x7A31, 0xE26A, 0x7A3B, 0xE26B, 0x7A3E, + 0xE26C, 0x7A37, 0xE26D, 0x7A43, 0xE26E, 0x7A57, 0xE26F, 0x7A49, 0xE270, 0x7A61, 0xE271, 0x7A62, 0xE272, 0x7A69, 0xE273, 0x9F9D, + 0xE274, 0x7A70, 0xE275, 0x7A79, 0xE276, 0x7A7D, 0xE277, 0x7A88, 0xE278, 0x7A97, 0xE279, 0x7A95, 0xE27A, 0x7A98, 0xE27B, 0x7A96, + 0xE27C, 0x7AA9, 0xE27D, 0x7AC8, 0xE27E, 0x7AB0, 0xE280, 0x7AB6, 0xE281, 0x7AC5, 0xE282, 0x7AC4, 0xE283, 0x7ABF, 0xE284, 0x9083, + 0xE285, 0x7AC7, 0xE286, 0x7ACA, 0xE287, 0x7ACD, 0xE288, 0x7ACF, 0xE289, 0x7AD5, 0xE28A, 0x7AD3, 0xE28B, 0x7AD9, 0xE28C, 0x7ADA, + 0xE28D, 0x7ADD, 0xE28E, 0x7AE1, 0xE28F, 0x7AE2, 0xE290, 0x7AE6, 0xE291, 0x7AED, 0xE292, 0x7AF0, 0xE293, 0x7B02, 0xE294, 0x7B0F, + 0xE295, 0x7B0A, 0xE296, 0x7B06, 0xE297, 0x7B33, 0xE298, 0x7B18, 0xE299, 0x7B19, 0xE29A, 0x7B1E, 0xE29B, 0x7B35, 0xE29C, 0x7B28, + 0xE29D, 0x7B36, 0xE29E, 0x7B50, 0xE29F, 0x7B7A, 0xE2A0, 0x7B04, 0xE2A1, 0x7B4D, 0xE2A2, 0x7B0B, 0xE2A3, 0x7B4C, 0xE2A4, 0x7B45, + 0xE2A5, 0x7B75, 0xE2A6, 0x7B65, 0xE2A7, 0x7B74, 0xE2A8, 0x7B67, 0xE2A9, 0x7B70, 0xE2AA, 0x7B71, 0xE2AB, 0x7B6C, 0xE2AC, 0x7B6E, + 0xE2AD, 0x7B9D, 0xE2AE, 0x7B98, 0xE2AF, 0x7B9F, 0xE2B0, 0x7B8D, 0xE2B1, 0x7B9C, 0xE2B2, 0x7B9A, 0xE2B3, 0x7B8B, 0xE2B4, 0x7B92, + 0xE2B5, 0x7B8F, 0xE2B6, 0x7B5D, 0xE2B7, 0x7B99, 0xE2B8, 0x7BCB, 0xE2B9, 0x7BC1, 0xE2BA, 0x7BCC, 0xE2BB, 0x7BCF, 0xE2BC, 0x7BB4, + 0xE2BD, 0x7BC6, 0xE2BE, 0x7BDD, 0xE2BF, 0x7BE9, 0xE2C0, 0x7C11, 0xE2C1, 0x7C14, 0xE2C2, 0x7BE6, 0xE2C3, 0x7BE5, 0xE2C4, 0x7C60, + 0xE2C5, 0x7C00, 0xE2C6, 0x7C07, 0xE2C7, 0x7C13, 0xE2C8, 0x7BF3, 0xE2C9, 0x7BF7, 0xE2CA, 0x7C17, 0xE2CB, 0x7C0D, 0xE2CC, 0x7BF6, + 0xE2CD, 0x7C23, 0xE2CE, 0x7C27, 0xE2CF, 0x7C2A, 0xE2D0, 0x7C1F, 0xE2D1, 0x7C37, 0xE2D2, 0x7C2B, 0xE2D3, 0x7C3D, 0xE2D4, 0x7C4C, + 0xE2D5, 0x7C43, 0xE2D6, 0x7C54, 0xE2D7, 0x7C4F, 0xE2D8, 0x7C40, 0xE2D9, 0x7C50, 0xE2DA, 0x7C58, 0xE2DB, 0x7C5F, 0xE2DC, 0x7C64, + 0xE2DD, 0x7C56, 0xE2DE, 0x7C65, 0xE2DF, 0x7C6C, 0xE2E0, 0x7C75, 0xE2E1, 0x7C83, 0xE2E2, 0x7C90, 0xE2E3, 0x7CA4, 0xE2E4, 0x7CAD, + 0xE2E5, 0x7CA2, 0xE2E6, 0x7CAB, 0xE2E7, 0x7CA1, 0xE2E8, 0x7CA8, 0xE2E9, 0x7CB3, 0xE2EA, 0x7CB2, 0xE2EB, 0x7CB1, 0xE2EC, 0x7CAE, + 0xE2ED, 0x7CB9, 0xE2EE, 0x7CBD, 0xE2EF, 0x7CC0, 0xE2F0, 0x7CC5, 0xE2F1, 0x7CC2, 0xE2F2, 0x7CD8, 0xE2F3, 0x7CD2, 0xE2F4, 0x7CDC, + 0xE2F5, 0x7CE2, 0xE2F6, 0x9B3B, 0xE2F7, 0x7CEF, 0xE2F8, 0x7CF2, 0xE2F9, 0x7CF4, 0xE2FA, 0x7CF6, 0xE2FB, 0x7CFA, 0xE2FC, 0x7D06, + 0xE340, 0x7D02, 0xE341, 0x7D1C, 0xE342, 0x7D15, 0xE343, 0x7D0A, 0xE344, 0x7D45, 0xE345, 0x7D4B, 0xE346, 0x7D2E, 0xE347, 0x7D32, + 0xE348, 0x7D3F, 0xE349, 0x7D35, 0xE34A, 0x7D46, 0xE34B, 0x7D73, 0xE34C, 0x7D56, 0xE34D, 0x7D4E, 0xE34E, 0x7D72, 0xE34F, 0x7D68, + 0xE350, 0x7D6E, 0xE351, 0x7D4F, 0xE352, 0x7D63, 0xE353, 0x7D93, 0xE354, 0x7D89, 0xE355, 0x7D5B, 0xE356, 0x7D8F, 0xE357, 0x7D7D, + 0xE358, 0x7D9B, 0xE359, 0x7DBA, 0xE35A, 0x7DAE, 0xE35B, 0x7DA3, 0xE35C, 0x7DB5, 0xE35D, 0x7DC7, 0xE35E, 0x7DBD, 0xE35F, 0x7DAB, + 0xE360, 0x7E3D, 0xE361, 0x7DA2, 0xE362, 0x7DAF, 0xE363, 0x7DDC, 0xE364, 0x7DB8, 0xE365, 0x7D9F, 0xE366, 0x7DB0, 0xE367, 0x7DD8, + 0xE368, 0x7DDD, 0xE369, 0x7DE4, 0xE36A, 0x7DDE, 0xE36B, 0x7DFB, 0xE36C, 0x7DF2, 0xE36D, 0x7DE1, 0xE36E, 0x7E05, 0xE36F, 0x7E0A, + 0xE370, 0x7E23, 0xE371, 0x7E21, 0xE372, 0x7E12, 0xE373, 0x7E31, 0xE374, 0x7E1F, 0xE375, 0x7E09, 0xE376, 0x7E0B, 0xE377, 0x7E22, + 0xE378, 0x7E46, 0xE379, 0x7E66, 0xE37A, 0x7E3B, 0xE37B, 0x7E35, 0xE37C, 0x7E39, 0xE37D, 0x7E43, 0xE37E, 0x7E37, 0xE380, 0x7E32, + 0xE381, 0x7E3A, 0xE382, 0x7E67, 0xE383, 0x7E5D, 0xE384, 0x7E56, 0xE385, 0x7E5E, 0xE386, 0x7E59, 0xE387, 0x7E5A, 0xE388, 0x7E79, + 0xE389, 0x7E6A, 0xE38A, 0x7E69, 0xE38B, 0x7E7C, 0xE38C, 0x7E7B, 0xE38D, 0x7E83, 0xE38E, 0x7DD5, 0xE38F, 0x7E7D, 0xE390, 0x8FAE, + 0xE391, 0x7E7F, 0xE392, 0x7E88, 0xE393, 0x7E89, 0xE394, 0x7E8C, 0xE395, 0x7E92, 0xE396, 0x7E90, 0xE397, 0x7E93, 0xE398, 0x7E94, + 0xE399, 0x7E96, 0xE39A, 0x7E8E, 0xE39B, 0x7E9B, 0xE39C, 0x7E9C, 0xE39D, 0x7F38, 0xE39E, 0x7F3A, 0xE39F, 0x7F45, 0xE3A0, 0x7F4C, + 0xE3A1, 0x7F4D, 0xE3A2, 0x7F4E, 0xE3A3, 0x7F50, 0xE3A4, 0x7F51, 0xE3A5, 0x7F55, 0xE3A6, 0x7F54, 0xE3A7, 0x7F58, 0xE3A8, 0x7F5F, + 0xE3A9, 0x7F60, 0xE3AA, 0x7F68, 0xE3AB, 0x7F69, 0xE3AC, 0x7F67, 0xE3AD, 0x7F78, 0xE3AE, 0x7F82, 0xE3AF, 0x7F86, 0xE3B0, 0x7F83, + 0xE3B1, 0x7F88, 0xE3B2, 0x7F87, 0xE3B3, 0x7F8C, 0xE3B4, 0x7F94, 0xE3B5, 0x7F9E, 0xE3B6, 0x7F9D, 0xE3B7, 0x7F9A, 0xE3B8, 0x7FA3, + 0xE3B9, 0x7FAF, 0xE3BA, 0x7FB2, 0xE3BB, 0x7FB9, 0xE3BC, 0x7FAE, 0xE3BD, 0x7FB6, 0xE3BE, 0x7FB8, 0xE3BF, 0x8B71, 0xE3C0, 0x7FC5, + 0xE3C1, 0x7FC6, 0xE3C2, 0x7FCA, 0xE3C3, 0x7FD5, 0xE3C4, 0x7FD4, 0xE3C5, 0x7FE1, 0xE3C6, 0x7FE6, 0xE3C7, 0x7FE9, 0xE3C8, 0x7FF3, + 0xE3C9, 0x7FF9, 0xE3CA, 0x98DC, 0xE3CB, 0x8006, 0xE3CC, 0x8004, 0xE3CD, 0x800B, 0xE3CE, 0x8012, 0xE3CF, 0x8018, 0xE3D0, 0x8019, + 0xE3D1, 0x801C, 0xE3D2, 0x8021, 0xE3D3, 0x8028, 0xE3D4, 0x803F, 0xE3D5, 0x803B, 0xE3D6, 0x804A, 0xE3D7, 0x8046, 0xE3D8, 0x8052, + 0xE3D9, 0x8058, 0xE3DA, 0x805A, 0xE3DB, 0x805F, 0xE3DC, 0x8062, 0xE3DD, 0x8068, 0xE3DE, 0x8073, 0xE3DF, 0x8072, 0xE3E0, 0x8070, + 0xE3E1, 0x8076, 0xE3E2, 0x8079, 0xE3E3, 0x807D, 0xE3E4, 0x807F, 0xE3E5, 0x8084, 0xE3E6, 0x8086, 0xE3E7, 0x8085, 0xE3E8, 0x809B, + 0xE3E9, 0x8093, 0xE3EA, 0x809A, 0xE3EB, 0x80AD, 0xE3EC, 0x5190, 0xE3ED, 0x80AC, 0xE3EE, 0x80DB, 0xE3EF, 0x80E5, 0xE3F0, 0x80D9, + 0xE3F1, 0x80DD, 0xE3F2, 0x80C4, 0xE3F3, 0x80DA, 0xE3F4, 0x80D6, 0xE3F5, 0x8109, 0xE3F6, 0x80EF, 0xE3F7, 0x80F1, 0xE3F8, 0x811B, + 0xE3F9, 0x8129, 0xE3FA, 0x8123, 0xE3FB, 0x812F, 0xE3FC, 0x814B, 0xE440, 0x968B, 0xE441, 0x8146, 0xE442, 0x813E, 0xE443, 0x8153, + 0xE444, 0x8151, 0xE445, 0x80FC, 0xE446, 0x8171, 0xE447, 0x816E, 0xE448, 0x8165, 0xE449, 0x8166, 0xE44A, 0x8174, 0xE44B, 0x8183, + 0xE44C, 0x8188, 0xE44D, 0x818A, 0xE44E, 0x8180, 0xE44F, 0x8182, 0xE450, 0x81A0, 0xE451, 0x8195, 0xE452, 0x81A4, 0xE453, 0x81A3, + 0xE454, 0x815F, 0xE455, 0x8193, 0xE456, 0x81A9, 0xE457, 0x81B0, 0xE458, 0x81B5, 0xE459, 0x81BE, 0xE45A, 0x81B8, 0xE45B, 0x81BD, + 0xE45C, 0x81C0, 0xE45D, 0x81C2, 0xE45E, 0x81BA, 0xE45F, 0x81C9, 0xE460, 0x81CD, 0xE461, 0x81D1, 0xE462, 0x81D9, 0xE463, 0x81D8, + 0xE464, 0x81C8, 0xE465, 0x81DA, 0xE466, 0x81DF, 0xE467, 0x81E0, 0xE468, 0x81E7, 0xE469, 0x81FA, 0xE46A, 0x81FB, 0xE46B, 0x81FE, + 0xE46C, 0x8201, 0xE46D, 0x8202, 0xE46E, 0x8205, 0xE46F, 0x8207, 0xE470, 0x820A, 0xE471, 0x820D, 0xE472, 0x8210, 0xE473, 0x8216, + 0xE474, 0x8229, 0xE475, 0x822B, 0xE476, 0x8238, 0xE477, 0x8233, 0xE478, 0x8240, 0xE479, 0x8259, 0xE47A, 0x8258, 0xE47B, 0x825D, + 0xE47C, 0x825A, 0xE47D, 0x825F, 0xE47E, 0x8264, 0xE480, 0x8262, 0xE481, 0x8268, 0xE482, 0x826A, 0xE483, 0x826B, 0xE484, 0x822E, + 0xE485, 0x8271, 0xE486, 0x8277, 0xE487, 0x8278, 0xE488, 0x827E, 0xE489, 0x828D, 0xE48A, 0x8292, 0xE48B, 0x82AB, 0xE48C, 0x829F, + 0xE48D, 0x82BB, 0xE48E, 0x82AC, 0xE48F, 0x82E1, 0xE490, 0x82E3, 0xE491, 0x82DF, 0xE492, 0x82D2, 0xE493, 0x82F4, 0xE494, 0x82F3, + 0xE495, 0x82FA, 0xE496, 0x8393, 0xE497, 0x8303, 0xE498, 0x82FB, 0xE499, 0x82F9, 0xE49A, 0x82DE, 0xE49B, 0x8306, 0xE49C, 0x82DC, + 0xE49D, 0x8309, 0xE49E, 0x82D9, 0xE49F, 0x8335, 0xE4A0, 0x8334, 0xE4A1, 0x8316, 0xE4A2, 0x8332, 0xE4A3, 0x8331, 0xE4A4, 0x8340, + 0xE4A5, 0x8339, 0xE4A6, 0x8350, 0xE4A7, 0x8345, 0xE4A8, 0x832F, 0xE4A9, 0x832B, 0xE4AA, 0x8317, 0xE4AB, 0x8318, 0xE4AC, 0x8385, + 0xE4AD, 0x839A, 0xE4AE, 0x83AA, 0xE4AF, 0x839F, 0xE4B0, 0x83A2, 0xE4B1, 0x8396, 0xE4B2, 0x8323, 0xE4B3, 0x838E, 0xE4B4, 0x8387, + 0xE4B5, 0x838A, 0xE4B6, 0x837C, 0xE4B7, 0x83B5, 0xE4B8, 0x8373, 0xE4B9, 0x8375, 0xE4BA, 0x83A0, 0xE4BB, 0x8389, 0xE4BC, 0x83A8, + 0xE4BD, 0x83F4, 0xE4BE, 0x8413, 0xE4BF, 0x83EB, 0xE4C0, 0x83CE, 0xE4C1, 0x83FD, 0xE4C2, 0x8403, 0xE4C3, 0x83D8, 0xE4C4, 0x840B, + 0xE4C5, 0x83C1, 0xE4C6, 0x83F7, 0xE4C7, 0x8407, 0xE4C8, 0x83E0, 0xE4C9, 0x83F2, 0xE4CA, 0x840D, 0xE4CB, 0x8422, 0xE4CC, 0x8420, + 0xE4CD, 0x83BD, 0xE4CE, 0x8438, 0xE4CF, 0x8506, 0xE4D0, 0x83FB, 0xE4D1, 0x846D, 0xE4D2, 0x842A, 0xE4D3, 0x843C, 0xE4D4, 0x855A, + 0xE4D5, 0x8484, 0xE4D6, 0x8477, 0xE4D7, 0x846B, 0xE4D8, 0x84AD, 0xE4D9, 0x846E, 0xE4DA, 0x8482, 0xE4DB, 0x8469, 0xE4DC, 0x8446, + 0xE4DD, 0x842C, 0xE4DE, 0x846F, 0xE4DF, 0x8479, 0xE4E0, 0x8435, 0xE4E1, 0x84CA, 0xE4E2, 0x8462, 0xE4E3, 0x84B9, 0xE4E4, 0x84BF, + 0xE4E5, 0x849F, 0xE4E6, 0x84D9, 0xE4E7, 0x84CD, 0xE4E8, 0x84BB, 0xE4E9, 0x84DA, 0xE4EA, 0x84D0, 0xE4EB, 0x84C1, 0xE4EC, 0x84C6, + 0xE4ED, 0x84D6, 0xE4EE, 0x84A1, 0xE4EF, 0x8521, 0xE4F0, 0x84FF, 0xE4F1, 0x84F4, 0xE4F2, 0x8517, 0xE4F3, 0x8518, 0xE4F4, 0x852C, + 0xE4F5, 0x851F, 0xE4F6, 0x8515, 0xE4F7, 0x8514, 0xE4F8, 0x84FC, 0xE4F9, 0x8540, 0xE4FA, 0x8563, 0xE4FB, 0x8558, 0xE4FC, 0x8548, + 0xE540, 0x8541, 0xE541, 0x8602, 0xE542, 0x854B, 0xE543, 0x8555, 0xE544, 0x8580, 0xE545, 0x85A4, 0xE546, 0x8588, 0xE547, 0x8591, + 0xE548, 0x858A, 0xE549, 0x85A8, 0xE54A, 0x856D, 0xE54B, 0x8594, 0xE54C, 0x859B, 0xE54D, 0x85EA, 0xE54E, 0x8587, 0xE54F, 0x859C, + 0xE550, 0x8577, 0xE551, 0x857E, 0xE552, 0x8590, 0xE553, 0x85C9, 0xE554, 0x85BA, 0xE555, 0x85CF, 0xE556, 0x85B9, 0xE557, 0x85D0, + 0xE558, 0x85D5, 0xE559, 0x85DD, 0xE55A, 0x85E5, 0xE55B, 0x85DC, 0xE55C, 0x85F9, 0xE55D, 0x860A, 0xE55E, 0x8613, 0xE55F, 0x860B, + 0xE560, 0x85FE, 0xE561, 0x85FA, 0xE562, 0x8606, 0xE563, 0x8622, 0xE564, 0x861A, 0xE565, 0x8630, 0xE566, 0x863F, 0xE567, 0x864D, + 0xE568, 0x4E55, 0xE569, 0x8654, 0xE56A, 0x865F, 0xE56B, 0x8667, 0xE56C, 0x8671, 0xE56D, 0x8693, 0xE56E, 0x86A3, 0xE56F, 0x86A9, + 0xE570, 0x86AA, 0xE571, 0x868B, 0xE572, 0x868C, 0xE573, 0x86B6, 0xE574, 0x86AF, 0xE575, 0x86C4, 0xE576, 0x86C6, 0xE577, 0x86B0, + 0xE578, 0x86C9, 0xE579, 0x8823, 0xE57A, 0x86AB, 0xE57B, 0x86D4, 0xE57C, 0x86DE, 0xE57D, 0x86E9, 0xE57E, 0x86EC, 0xE580, 0x86DF, + 0xE581, 0x86DB, 0xE582, 0x86EF, 0xE583, 0x8712, 0xE584, 0x8706, 0xE585, 0x8708, 0xE586, 0x8700, 0xE587, 0x8703, 0xE588, 0x86FB, + 0xE589, 0x8711, 0xE58A, 0x8709, 0xE58B, 0x870D, 0xE58C, 0x86F9, 0xE58D, 0x870A, 0xE58E, 0x8734, 0xE58F, 0x873F, 0xE590, 0x8737, + 0xE591, 0x873B, 0xE592, 0x8725, 0xE593, 0x8729, 0xE594, 0x871A, 0xE595, 0x8760, 0xE596, 0x875F, 0xE597, 0x8778, 0xE598, 0x874C, + 0xE599, 0x874E, 0xE59A, 0x8774, 0xE59B, 0x8757, 0xE59C, 0x8768, 0xE59D, 0x876E, 0xE59E, 0x8759, 0xE59F, 0x8753, 0xE5A0, 0x8763, + 0xE5A1, 0x876A, 0xE5A2, 0x8805, 0xE5A3, 0x87A2, 0xE5A4, 0x879F, 0xE5A5, 0x8782, 0xE5A6, 0x87AF, 0xE5A7, 0x87CB, 0xE5A8, 0x87BD, + 0xE5A9, 0x87C0, 0xE5AA, 0x87D0, 0xE5AB, 0x96D6, 0xE5AC, 0x87AB, 0xE5AD, 0x87C4, 0xE5AE, 0x87B3, 0xE5AF, 0x87C7, 0xE5B0, 0x87C6, + 0xE5B1, 0x87BB, 0xE5B2, 0x87EF, 0xE5B3, 0x87F2, 0xE5B4, 0x87E0, 0xE5B5, 0x880F, 0xE5B6, 0x880D, 0xE5B7, 0x87FE, 0xE5B8, 0x87F6, + 0xE5B9, 0x87F7, 0xE5BA, 0x880E, 0xE5BB, 0x87D2, 0xE5BC, 0x8811, 0xE5BD, 0x8816, 0xE5BE, 0x8815, 0xE5BF, 0x8822, 0xE5C0, 0x8821, + 0xE5C1, 0x8831, 0xE5C2, 0x8836, 0xE5C3, 0x8839, 0xE5C4, 0x8827, 0xE5C5, 0x883B, 0xE5C6, 0x8844, 0xE5C7, 0x8842, 0xE5C8, 0x8852, + 0xE5C9, 0x8859, 0xE5CA, 0x885E, 0xE5CB, 0x8862, 0xE5CC, 0x886B, 0xE5CD, 0x8881, 0xE5CE, 0x887E, 0xE5CF, 0x889E, 0xE5D0, 0x8875, + 0xE5D1, 0x887D, 0xE5D2, 0x88B5, 0xE5D3, 0x8872, 0xE5D4, 0x8882, 0xE5D5, 0x8897, 0xE5D6, 0x8892, 0xE5D7, 0x88AE, 0xE5D8, 0x8899, + 0xE5D9, 0x88A2, 0xE5DA, 0x888D, 0xE5DB, 0x88A4, 0xE5DC, 0x88B0, 0xE5DD, 0x88BF, 0xE5DE, 0x88B1, 0xE5DF, 0x88C3, 0xE5E0, 0x88C4, + 0xE5E1, 0x88D4, 0xE5E2, 0x88D8, 0xE5E3, 0x88D9, 0xE5E4, 0x88DD, 0xE5E5, 0x88F9, 0xE5E6, 0x8902, 0xE5E7, 0x88FC, 0xE5E8, 0x88F4, + 0xE5E9, 0x88E8, 0xE5EA, 0x88F2, 0xE5EB, 0x8904, 0xE5EC, 0x890C, 0xE5ED, 0x890A, 0xE5EE, 0x8913, 0xE5EF, 0x8943, 0xE5F0, 0x891E, + 0xE5F1, 0x8925, 0xE5F2, 0x892A, 0xE5F3, 0x892B, 0xE5F4, 0x8941, 0xE5F5, 0x8944, 0xE5F6, 0x893B, 0xE5F7, 0x8936, 0xE5F8, 0x8938, + 0xE5F9, 0x894C, 0xE5FA, 0x891D, 0xE5FB, 0x8960, 0xE5FC, 0x895E, 0xE640, 0x8966, 0xE641, 0x8964, 0xE642, 0x896D, 0xE643, 0x896A, + 0xE644, 0x896F, 0xE645, 0x8974, 0xE646, 0x8977, 0xE647, 0x897E, 0xE648, 0x8983, 0xE649, 0x8988, 0xE64A, 0x898A, 0xE64B, 0x8993, + 0xE64C, 0x8998, 0xE64D, 0x89A1, 0xE64E, 0x89A9, 0xE64F, 0x89A6, 0xE650, 0x89AC, 0xE651, 0x89AF, 0xE652, 0x89B2, 0xE653, 0x89BA, + 0xE654, 0x89BD, 0xE655, 0x89BF, 0xE656, 0x89C0, 0xE657, 0x89DA, 0xE658, 0x89DC, 0xE659, 0x89DD, 0xE65A, 0x89E7, 0xE65B, 0x89F4, + 0xE65C, 0x89F8, 0xE65D, 0x8A03, 0xE65E, 0x8A16, 0xE65F, 0x8A10, 0xE660, 0x8A0C, 0xE661, 0x8A1B, 0xE662, 0x8A1D, 0xE663, 0x8A25, + 0xE664, 0x8A36, 0xE665, 0x8A41, 0xE666, 0x8A5B, 0xE667, 0x8A52, 0xE668, 0x8A46, 0xE669, 0x8A48, 0xE66A, 0x8A7C, 0xE66B, 0x8A6D, + 0xE66C, 0x8A6C, 0xE66D, 0x8A62, 0xE66E, 0x8A85, 0xE66F, 0x8A82, 0xE670, 0x8A84, 0xE671, 0x8AA8, 0xE672, 0x8AA1, 0xE673, 0x8A91, + 0xE674, 0x8AA5, 0xE675, 0x8AA6, 0xE676, 0x8A9A, 0xE677, 0x8AA3, 0xE678, 0x8AC4, 0xE679, 0x8ACD, 0xE67A, 0x8AC2, 0xE67B, 0x8ADA, + 0xE67C, 0x8AEB, 0xE67D, 0x8AF3, 0xE67E, 0x8AE7, 0xE680, 0x8AE4, 0xE681, 0x8AF1, 0xE682, 0x8B14, 0xE683, 0x8AE0, 0xE684, 0x8AE2, + 0xE685, 0x8AF7, 0xE686, 0x8ADE, 0xE687, 0x8ADB, 0xE688, 0x8B0C, 0xE689, 0x8B07, 0xE68A, 0x8B1A, 0xE68B, 0x8AE1, 0xE68C, 0x8B16, + 0xE68D, 0x8B10, 0xE68E, 0x8B17, 0xE68F, 0x8B20, 0xE690, 0x8B33, 0xE691, 0x97AB, 0xE692, 0x8B26, 0xE693, 0x8B2B, 0xE694, 0x8B3E, + 0xE695, 0x8B28, 0xE696, 0x8B41, 0xE697, 0x8B4C, 0xE698, 0x8B4F, 0xE699, 0x8B4E, 0xE69A, 0x8B49, 0xE69B, 0x8B56, 0xE69C, 0x8B5B, + 0xE69D, 0x8B5A, 0xE69E, 0x8B6B, 0xE69F, 0x8B5F, 0xE6A0, 0x8B6C, 0xE6A1, 0x8B6F, 0xE6A2, 0x8B74, 0xE6A3, 0x8B7D, 0xE6A4, 0x8B80, + 0xE6A5, 0x8B8C, 0xE6A6, 0x8B8E, 0xE6A7, 0x8B92, 0xE6A8, 0x8B93, 0xE6A9, 0x8B96, 0xE6AA, 0x8B99, 0xE6AB, 0x8B9A, 0xE6AC, 0x8C3A, + 0xE6AD, 0x8C41, 0xE6AE, 0x8C3F, 0xE6AF, 0x8C48, 0xE6B0, 0x8C4C, 0xE6B1, 0x8C4E, 0xE6B2, 0x8C50, 0xE6B3, 0x8C55, 0xE6B4, 0x8C62, + 0xE6B5, 0x8C6C, 0xE6B6, 0x8C78, 0xE6B7, 0x8C7A, 0xE6B8, 0x8C82, 0xE6B9, 0x8C89, 0xE6BA, 0x8C85, 0xE6BB, 0x8C8A, 0xE6BC, 0x8C8D, + 0xE6BD, 0x8C8E, 0xE6BE, 0x8C94, 0xE6BF, 0x8C7C, 0xE6C0, 0x8C98, 0xE6C1, 0x621D, 0xE6C2, 0x8CAD, 0xE6C3, 0x8CAA, 0xE6C4, 0x8CBD, + 0xE6C5, 0x8CB2, 0xE6C6, 0x8CB3, 0xE6C7, 0x8CAE, 0xE6C8, 0x8CB6, 0xE6C9, 0x8CC8, 0xE6CA, 0x8CC1, 0xE6CB, 0x8CE4, 0xE6CC, 0x8CE3, + 0xE6CD, 0x8CDA, 0xE6CE, 0x8CFD, 0xE6CF, 0x8CFA, 0xE6D0, 0x8CFB, 0xE6D1, 0x8D04, 0xE6D2, 0x8D05, 0xE6D3, 0x8D0A, 0xE6D4, 0x8D07, + 0xE6D5, 0x8D0F, 0xE6D6, 0x8D0D, 0xE6D7, 0x8D10, 0xE6D8, 0x9F4E, 0xE6D9, 0x8D13, 0xE6DA, 0x8CCD, 0xE6DB, 0x8D14, 0xE6DC, 0x8D16, + 0xE6DD, 0x8D67, 0xE6DE, 0x8D6D, 0xE6DF, 0x8D71, 0xE6E0, 0x8D73, 0xE6E1, 0x8D81, 0xE6E2, 0x8D99, 0xE6E3, 0x8DC2, 0xE6E4, 0x8DBE, + 0xE6E5, 0x8DBA, 0xE6E6, 0x8DCF, 0xE6E7, 0x8DDA, 0xE6E8, 0x8DD6, 0xE6E9, 0x8DCC, 0xE6EA, 0x8DDB, 0xE6EB, 0x8DCB, 0xE6EC, 0x8DEA, + 0xE6ED, 0x8DEB, 0xE6EE, 0x8DDF, 0xE6EF, 0x8DE3, 0xE6F0, 0x8DFC, 0xE6F1, 0x8E08, 0xE6F2, 0x8E09, 0xE6F3, 0x8DFF, 0xE6F4, 0x8E1D, + 0xE6F5, 0x8E1E, 0xE6F6, 0x8E10, 0xE6F7, 0x8E1F, 0xE6F8, 0x8E42, 0xE6F9, 0x8E35, 0xE6FA, 0x8E30, 0xE6FB, 0x8E34, 0xE6FC, 0x8E4A, + 0xE740, 0x8E47, 0xE741, 0x8E49, 0xE742, 0x8E4C, 0xE743, 0x8E50, 0xE744, 0x8E48, 0xE745, 0x8E59, 0xE746, 0x8E64, 0xE747, 0x8E60, + 0xE748, 0x8E2A, 0xE749, 0x8E63, 0xE74A, 0x8E55, 0xE74B, 0x8E76, 0xE74C, 0x8E72, 0xE74D, 0x8E7C, 0xE74E, 0x8E81, 0xE74F, 0x8E87, + 0xE750, 0x8E85, 0xE751, 0x8E84, 0xE752, 0x8E8B, 0xE753, 0x8E8A, 0xE754, 0x8E93, 0xE755, 0x8E91, 0xE756, 0x8E94, 0xE757, 0x8E99, + 0xE758, 0x8EAA, 0xE759, 0x8EA1, 0xE75A, 0x8EAC, 0xE75B, 0x8EB0, 0xE75C, 0x8EC6, 0xE75D, 0x8EB1, 0xE75E, 0x8EBE, 0xE75F, 0x8EC5, + 0xE760, 0x8EC8, 0xE761, 0x8ECB, 0xE762, 0x8EDB, 0xE763, 0x8EE3, 0xE764, 0x8EFC, 0xE765, 0x8EFB, 0xE766, 0x8EEB, 0xE767, 0x8EFE, + 0xE768, 0x8F0A, 0xE769, 0x8F05, 0xE76A, 0x8F15, 0xE76B, 0x8F12, 0xE76C, 0x8F19, 0xE76D, 0x8F13, 0xE76E, 0x8F1C, 0xE76F, 0x8F1F, + 0xE770, 0x8F1B, 0xE771, 0x8F0C, 0xE772, 0x8F26, 0xE773, 0x8F33, 0xE774, 0x8F3B, 0xE775, 0x8F39, 0xE776, 0x8F45, 0xE777, 0x8F42, + 0xE778, 0x8F3E, 0xE779, 0x8F4C, 0xE77A, 0x8F49, 0xE77B, 0x8F46, 0xE77C, 0x8F4E, 0xE77D, 0x8F57, 0xE77E, 0x8F5C, 0xE780, 0x8F62, + 0xE781, 0x8F63, 0xE782, 0x8F64, 0xE783, 0x8F9C, 0xE784, 0x8F9F, 0xE785, 0x8FA3, 0xE786, 0x8FAD, 0xE787, 0x8FAF, 0xE788, 0x8FB7, + 0xE789, 0x8FDA, 0xE78A, 0x8FE5, 0xE78B, 0x8FE2, 0xE78C, 0x8FEA, 0xE78D, 0x8FEF, 0xE78E, 0x9087, 0xE78F, 0x8FF4, 0xE790, 0x9005, + 0xE791, 0x8FF9, 0xE792, 0x8FFA, 0xE793, 0x9011, 0xE794, 0x9015, 0xE795, 0x9021, 0xE796, 0x900D, 0xE797, 0x901E, 0xE798, 0x9016, + 0xE799, 0x900B, 0xE79A, 0x9027, 0xE79B, 0x9036, 0xE79C, 0x9035, 0xE79D, 0x9039, 0xE79E, 0x8FF8, 0xE79F, 0x904F, 0xE7A0, 0x9050, + 0xE7A1, 0x9051, 0xE7A2, 0x9052, 0xE7A3, 0x900E, 0xE7A4, 0x9049, 0xE7A5, 0x903E, 0xE7A6, 0x9056, 0xE7A7, 0x9058, 0xE7A8, 0x905E, + 0xE7A9, 0x9068, 0xE7AA, 0x906F, 0xE7AB, 0x9076, 0xE7AC, 0x96A8, 0xE7AD, 0x9072, 0xE7AE, 0x9082, 0xE7AF, 0x907D, 0xE7B0, 0x9081, + 0xE7B1, 0x9080, 0xE7B2, 0x908A, 0xE7B3, 0x9089, 0xE7B4, 0x908F, 0xE7B5, 0x90A8, 0xE7B6, 0x90AF, 0xE7B7, 0x90B1, 0xE7B8, 0x90B5, + 0xE7B9, 0x90E2, 0xE7BA, 0x90E4, 0xE7BB, 0x6248, 0xE7BC, 0x90DB, 0xE7BD, 0x9102, 0xE7BE, 0x9112, 0xE7BF, 0x9119, 0xE7C0, 0x9132, + 0xE7C1, 0x9130, 0xE7C2, 0x914A, 0xE7C3, 0x9156, 0xE7C4, 0x9158, 0xE7C5, 0x9163, 0xE7C6, 0x9165, 0xE7C7, 0x9169, 0xE7C8, 0x9173, + 0xE7C9, 0x9172, 0xE7CA, 0x918B, 0xE7CB, 0x9189, 0xE7CC, 0x9182, 0xE7CD, 0x91A2, 0xE7CE, 0x91AB, 0xE7CF, 0x91AF, 0xE7D0, 0x91AA, + 0xE7D1, 0x91B5, 0xE7D2, 0x91B4, 0xE7D3, 0x91BA, 0xE7D4, 0x91C0, 0xE7D5, 0x91C1, 0xE7D6, 0x91C9, 0xE7D7, 0x91CB, 0xE7D8, 0x91D0, + 0xE7D9, 0x91D6, 0xE7DA, 0x91DF, 0xE7DB, 0x91E1, 0xE7DC, 0x91DB, 0xE7DD, 0x91FC, 0xE7DE, 0x91F5, 0xE7DF, 0x91F6, 0xE7E0, 0x921E, + 0xE7E1, 0x91FF, 0xE7E2, 0x9214, 0xE7E3, 0x922C, 0xE7E4, 0x9215, 0xE7E5, 0x9211, 0xE7E6, 0x925E, 0xE7E7, 0x9257, 0xE7E8, 0x9245, + 0xE7E9, 0x9249, 0xE7EA, 0x9264, 0xE7EB, 0x9248, 0xE7EC, 0x9295, 0xE7ED, 0x923F, 0xE7EE, 0x924B, 0xE7EF, 0x9250, 0xE7F0, 0x929C, + 0xE7F1, 0x9296, 0xE7F2, 0x9293, 0xE7F3, 0x929B, 0xE7F4, 0x925A, 0xE7F5, 0x92CF, 0xE7F6, 0x92B9, 0xE7F7, 0x92B7, 0xE7F8, 0x92E9, + 0xE7F9, 0x930F, 0xE7FA, 0x92FA, 0xE7FB, 0x9344, 0xE7FC, 0x932E, 0xE840, 0x9319, 0xE841, 0x9322, 0xE842, 0x931A, 0xE843, 0x9323, + 0xE844, 0x933A, 0xE845, 0x9335, 0xE846, 0x933B, 0xE847, 0x935C, 0xE848, 0x9360, 0xE849, 0x937C, 0xE84A, 0x936E, 0xE84B, 0x9356, + 0xE84C, 0x93B0, 0xE84D, 0x93AC, 0xE84E, 0x93AD, 0xE84F, 0x9394, 0xE850, 0x93B9, 0xE851, 0x93D6, 0xE852, 0x93D7, 0xE853, 0x93E8, + 0xE854, 0x93E5, 0xE855, 0x93D8, 0xE856, 0x93C3, 0xE857, 0x93DD, 0xE858, 0x93D0, 0xE859, 0x93C8, 0xE85A, 0x93E4, 0xE85B, 0x941A, + 0xE85C, 0x9414, 0xE85D, 0x9413, 0xE85E, 0x9403, 0xE85F, 0x9407, 0xE860, 0x9410, 0xE861, 0x9436, 0xE862, 0x942B, 0xE863, 0x9435, + 0xE864, 0x9421, 0xE865, 0x943A, 0xE866, 0x9441, 0xE867, 0x9452, 0xE868, 0x9444, 0xE869, 0x945B, 0xE86A, 0x9460, 0xE86B, 0x9462, + 0xE86C, 0x945E, 0xE86D, 0x946A, 0xE86E, 0x9229, 0xE86F, 0x9470, 0xE870, 0x9475, 0xE871, 0x9477, 0xE872, 0x947D, 0xE873, 0x945A, + 0xE874, 0x947C, 0xE875, 0x947E, 0xE876, 0x9481, 0xE877, 0x947F, 0xE878, 0x9582, 0xE879, 0x9587, 0xE87A, 0x958A, 0xE87B, 0x9594, + 0xE87C, 0x9596, 0xE87D, 0x9598, 0xE87E, 0x9599, 0xE880, 0x95A0, 0xE881, 0x95A8, 0xE882, 0x95A7, 0xE883, 0x95AD, 0xE884, 0x95BC, + 0xE885, 0x95BB, 0xE886, 0x95B9, 0xE887, 0x95BE, 0xE888, 0x95CA, 0xE889, 0x6FF6, 0xE88A, 0x95C3, 0xE88B, 0x95CD, 0xE88C, 0x95CC, + 0xE88D, 0x95D5, 0xE88E, 0x95D4, 0xE88F, 0x95D6, 0xE890, 0x95DC, 0xE891, 0x95E1, 0xE892, 0x95E5, 0xE893, 0x95E2, 0xE894, 0x9621, + 0xE895, 0x9628, 0xE896, 0x962E, 0xE897, 0x962F, 0xE898, 0x9642, 0xE899, 0x964C, 0xE89A, 0x964F, 0xE89B, 0x964B, 0xE89C, 0x9677, + 0xE89D, 0x965C, 0xE89E, 0x965E, 0xE89F, 0x965D, 0xE8A0, 0x965F, 0xE8A1, 0x9666, 0xE8A2, 0x9672, 0xE8A3, 0x966C, 0xE8A4, 0x968D, + 0xE8A5, 0x9698, 0xE8A6, 0x9695, 0xE8A7, 0x9697, 0xE8A8, 0x96AA, 0xE8A9, 0x96A7, 0xE8AA, 0x96B1, 0xE8AB, 0x96B2, 0xE8AC, 0x96B0, + 0xE8AD, 0x96B4, 0xE8AE, 0x96B6, 0xE8AF, 0x96B8, 0xE8B0, 0x96B9, 0xE8B1, 0x96CE, 0xE8B2, 0x96CB, 0xE8B3, 0x96C9, 0xE8B4, 0x96CD, + 0xE8B5, 0x894D, 0xE8B6, 0x96DC, 0xE8B7, 0x970D, 0xE8B8, 0x96D5, 0xE8B9, 0x96F9, 0xE8BA, 0x9704, 0xE8BB, 0x9706, 0xE8BC, 0x9708, + 0xE8BD, 0x9713, 0xE8BE, 0x970E, 0xE8BF, 0x9711, 0xE8C0, 0x970F, 0xE8C1, 0x9716, 0xE8C2, 0x9719, 0xE8C3, 0x9724, 0xE8C4, 0x972A, + 0xE8C5, 0x9730, 0xE8C6, 0x9739, 0xE8C7, 0x973D, 0xE8C8, 0x973E, 0xE8C9, 0x9744, 0xE8CA, 0x9746, 0xE8CB, 0x9748, 0xE8CC, 0x9742, + 0xE8CD, 0x9749, 0xE8CE, 0x975C, 0xE8CF, 0x9760, 0xE8D0, 0x9764, 0xE8D1, 0x9766, 0xE8D2, 0x9768, 0xE8D3, 0x52D2, 0xE8D4, 0x976B, + 0xE8D5, 0x9771, 0xE8D6, 0x9779, 0xE8D7, 0x9785, 0xE8D8, 0x977C, 0xE8D9, 0x9781, 0xE8DA, 0x977A, 0xE8DB, 0x9786, 0xE8DC, 0x978B, + 0xE8DD, 0x978F, 0xE8DE, 0x9790, 0xE8DF, 0x979C, 0xE8E0, 0x97A8, 0xE8E1, 0x97A6, 0xE8E2, 0x97A3, 0xE8E3, 0x97B3, 0xE8E4, 0x97B4, + 0xE8E5, 0x97C3, 0xE8E6, 0x97C6, 0xE8E7, 0x97C8, 0xE8E8, 0x97CB, 0xE8E9, 0x97DC, 0xE8EA, 0x97ED, 0xE8EB, 0x9F4F, 0xE8EC, 0x97F2, + 0xE8ED, 0x7ADF, 0xE8EE, 0x97F6, 0xE8EF, 0x97F5, 0xE8F0, 0x980F, 0xE8F1, 0x980C, 0xE8F2, 0x9838, 0xE8F3, 0x9824, 0xE8F4, 0x9821, + 0xE8F5, 0x9837, 0xE8F6, 0x983D, 0xE8F7, 0x9846, 0xE8F8, 0x984F, 0xE8F9, 0x984B, 0xE8FA, 0x986B, 0xE8FB, 0x986F, 0xE8FC, 0x9870, + 0xE940, 0x9871, 0xE941, 0x9874, 0xE942, 0x9873, 0xE943, 0x98AA, 0xE944, 0x98AF, 0xE945, 0x98B1, 0xE946, 0x98B6, 0xE947, 0x98C4, + 0xE948, 0x98C3, 0xE949, 0x98C6, 0xE94A, 0x98E9, 0xE94B, 0x98EB, 0xE94C, 0x9903, 0xE94D, 0x9909, 0xE94E, 0x9912, 0xE94F, 0x9914, + 0xE950, 0x9918, 0xE951, 0x9921, 0xE952, 0x991D, 0xE953, 0x991E, 0xE954, 0x9924, 0xE955, 0x9920, 0xE956, 0x992C, 0xE957, 0x992E, + 0xE958, 0x993D, 0xE959, 0x993E, 0xE95A, 0x9942, 0xE95B, 0x9949, 0xE95C, 0x9945, 0xE95D, 0x9950, 0xE95E, 0x994B, 0xE95F, 0x9951, + 0xE960, 0x9952, 0xE961, 0x994C, 0xE962, 0x9955, 0xE963, 0x9997, 0xE964, 0x9998, 0xE965, 0x99A5, 0xE966, 0x99AD, 0xE967, 0x99AE, + 0xE968, 0x99BC, 0xE969, 0x99DF, 0xE96A, 0x99DB, 0xE96B, 0x99DD, 0xE96C, 0x99D8, 0xE96D, 0x99D1, 0xE96E, 0x99ED, 0xE96F, 0x99EE, + 0xE970, 0x99F1, 0xE971, 0x99F2, 0xE972, 0x99FB, 0xE973, 0x99F8, 0xE974, 0x9A01, 0xE975, 0x9A0F, 0xE976, 0x9A05, 0xE977, 0x99E2, + 0xE978, 0x9A19, 0xE979, 0x9A2B, 0xE97A, 0x9A37, 0xE97B, 0x9A45, 0xE97C, 0x9A42, 0xE97D, 0x9A40, 0xE97E, 0x9A43, 0xE980, 0x9A3E, + 0xE981, 0x9A55, 0xE982, 0x9A4D, 0xE983, 0x9A5B, 0xE984, 0x9A57, 0xE985, 0x9A5F, 0xE986, 0x9A62, 0xE987, 0x9A65, 0xE988, 0x9A64, + 0xE989, 0x9A69, 0xE98A, 0x9A6B, 0xE98B, 0x9A6A, 0xE98C, 0x9AAD, 0xE98D, 0x9AB0, 0xE98E, 0x9ABC, 0xE98F, 0x9AC0, 0xE990, 0x9ACF, + 0xE991, 0x9AD1, 0xE992, 0x9AD3, 0xE993, 0x9AD4, 0xE994, 0x9ADE, 0xE995, 0x9ADF, 0xE996, 0x9AE2, 0xE997, 0x9AE3, 0xE998, 0x9AE6, + 0xE999, 0x9AEF, 0xE99A, 0x9AEB, 0xE99B, 0x9AEE, 0xE99C, 0x9AF4, 0xE99D, 0x9AF1, 0xE99E, 0x9AF7, 0xE99F, 0x9AFB, 0xE9A0, 0x9B06, + 0xE9A1, 0x9B18, 0xE9A2, 0x9B1A, 0xE9A3, 0x9B1F, 0xE9A4, 0x9B22, 0xE9A5, 0x9B23, 0xE9A6, 0x9B25, 0xE9A7, 0x9B27, 0xE9A8, 0x9B28, + 0xE9A9, 0x9B29, 0xE9AA, 0x9B2A, 0xE9AB, 0x9B2E, 0xE9AC, 0x9B2F, 0xE9AD, 0x9B32, 0xE9AE, 0x9B44, 0xE9AF, 0x9B43, 0xE9B0, 0x9B4F, + 0xE9B1, 0x9B4D, 0xE9B2, 0x9B4E, 0xE9B3, 0x9B51, 0xE9B4, 0x9B58, 0xE9B5, 0x9B74, 0xE9B6, 0x9B93, 0xE9B7, 0x9B83, 0xE9B8, 0x9B91, + 0xE9B9, 0x9B96, 0xE9BA, 0x9B97, 0xE9BB, 0x9B9F, 0xE9BC, 0x9BA0, 0xE9BD, 0x9BA8, 0xE9BE, 0x9BB4, 0xE9BF, 0x9BC0, 0xE9C0, 0x9BCA, + 0xE9C1, 0x9BB9, 0xE9C2, 0x9BC6, 0xE9C3, 0x9BCF, 0xE9C4, 0x9BD1, 0xE9C5, 0x9BD2, 0xE9C6, 0x9BE3, 0xE9C7, 0x9BE2, 0xE9C8, 0x9BE4, + 0xE9C9, 0x9BD4, 0xE9CA, 0x9BE1, 0xE9CB, 0x9C3A, 0xE9CC, 0x9BF2, 0xE9CD, 0x9BF1, 0xE9CE, 0x9BF0, 0xE9CF, 0x9C15, 0xE9D0, 0x9C14, + 0xE9D1, 0x9C09, 0xE9D2, 0x9C13, 0xE9D3, 0x9C0C, 0xE9D4, 0x9C06, 0xE9D5, 0x9C08, 0xE9D6, 0x9C12, 0xE9D7, 0x9C0A, 0xE9D8, 0x9C04, + 0xE9D9, 0x9C2E, 0xE9DA, 0x9C1B, 0xE9DB, 0x9C25, 0xE9DC, 0x9C24, 0xE9DD, 0x9C21, 0xE9DE, 0x9C30, 0xE9DF, 0x9C47, 0xE9E0, 0x9C32, + 0xE9E1, 0x9C46, 0xE9E2, 0x9C3E, 0xE9E3, 0x9C5A, 0xE9E4, 0x9C60, 0xE9E5, 0x9C67, 0xE9E6, 0x9C76, 0xE9E7, 0x9C78, 0xE9E8, 0x9CE7, + 0xE9E9, 0x9CEC, 0xE9EA, 0x9CF0, 0xE9EB, 0x9D09, 0xE9EC, 0x9D08, 0xE9ED, 0x9CEB, 0xE9EE, 0x9D03, 0xE9EF, 0x9D06, 0xE9F0, 0x9D2A, + 0xE9F1, 0x9D26, 0xE9F2, 0x9DAF, 0xE9F3, 0x9D23, 0xE9F4, 0x9D1F, 0xE9F5, 0x9D44, 0xE9F6, 0x9D15, 0xE9F7, 0x9D12, 0xE9F8, 0x9D41, + 0xE9F9, 0x9D3F, 0xE9FA, 0x9D3E, 0xE9FB, 0x9D46, 0xE9FC, 0x9D48, 0xEA40, 0x9D5D, 0xEA41, 0x9D5E, 0xEA42, 0x9D64, 0xEA43, 0x9D51, + 0xEA44, 0x9D50, 0xEA45, 0x9D59, 0xEA46, 0x9D72, 0xEA47, 0x9D89, 0xEA48, 0x9D87, 0xEA49, 0x9DAB, 0xEA4A, 0x9D6F, 0xEA4B, 0x9D7A, + 0xEA4C, 0x9D9A, 0xEA4D, 0x9DA4, 0xEA4E, 0x9DA9, 0xEA4F, 0x9DB2, 0xEA50, 0x9DC4, 0xEA51, 0x9DC1, 0xEA52, 0x9DBB, 0xEA53, 0x9DB8, + 0xEA54, 0x9DBA, 0xEA55, 0x9DC6, 0xEA56, 0x9DCF, 0xEA57, 0x9DC2, 0xEA58, 0x9DD9, 0xEA59, 0x9DD3, 0xEA5A, 0x9DF8, 0xEA5B, 0x9DE6, + 0xEA5C, 0x9DED, 0xEA5D, 0x9DEF, 0xEA5E, 0x9DFD, 0xEA5F, 0x9E1A, 0xEA60, 0x9E1B, 0xEA61, 0x9E1E, 0xEA62, 0x9E75, 0xEA63, 0x9E79, + 0xEA64, 0x9E7D, 0xEA65, 0x9E81, 0xEA66, 0x9E88, 0xEA67, 0x9E8B, 0xEA68, 0x9E8C, 0xEA69, 0x9E92, 0xEA6A, 0x9E95, 0xEA6B, 0x9E91, + 0xEA6C, 0x9E9D, 0xEA6D, 0x9EA5, 0xEA6E, 0x9EA9, 0xEA6F, 0x9EB8, 0xEA70, 0x9EAA, 0xEA71, 0x9EAD, 0xEA72, 0x9761, 0xEA73, 0x9ECC, + 0xEA74, 0x9ECE, 0xEA75, 0x9ECF, 0xEA76, 0x9ED0, 0xEA77, 0x9ED4, 0xEA78, 0x9EDC, 0xEA79, 0x9EDE, 0xEA7A, 0x9EDD, 0xEA7B, 0x9EE0, + 0xEA7C, 0x9EE5, 0xEA7D, 0x9EE8, 0xEA7E, 0x9EEF, 0xEA80, 0x9EF4, 0xEA81, 0x9EF6, 0xEA82, 0x9EF7, 0xEA83, 0x9EF9, 0xEA84, 0x9EFB, + 0xEA85, 0x9EFC, 0xEA86, 0x9EFD, 0xEA87, 0x9F07, 0xEA88, 0x9F08, 0xEA89, 0x76B7, 0xEA8A, 0x9F15, 0xEA8B, 0x9F21, 0xEA8C, 0x9F2C, + 0xEA8D, 0x9F3E, 0xEA8E, 0x9F4A, 0xEA8F, 0x9F52, 0xEA90, 0x9F54, 0xEA91, 0x9F63, 0xEA92, 0x9F5F, 0xEA93, 0x9F60, 0xEA94, 0x9F61, + 0xEA95, 0x9F66, 0xEA96, 0x9F67, 0xEA97, 0x9F6C, 0xEA98, 0x9F6A, 0xEA99, 0x9F77, 0xEA9A, 0x9F72, 0xEA9B, 0x9F76, 0xEA9C, 0x9F95, + 0xEA9D, 0x9F9C, 0xEA9E, 0x9FA0, 0xEA9F, 0x582F, 0xEAA0, 0x69C7, 0xEAA1, 0x9059, 0xEAA2, 0x7464, 0xEAA3, 0x51DC, 0xEAA4, 0x7199, + 0xFA40, 0x2170, 0xFA41, 0x2171, 0xFA42, 0x2172, 0xFA43, 0x2173, 0xFA44, 0x2174, 0xFA45, 0x2175, 0xFA46, 0x2176, 0xFA47, 0x2177, + 0xFA48, 0x2178, 0xFA49, 0x2179, 0xFA55, 0xFFE4, 0xFA56, 0xFF07, 0xFA57, 0xFF02, 0xFA5C, 0x7E8A, 0xFA5D, 0x891C, 0xFA5E, 0x9348, + 0xFA5F, 0x9288, 0xFA60, 0x84DC, 0xFA61, 0x4FC9, 0xFA62, 0x70BB, 0xFA63, 0x6631, 0xFA64, 0x68C8, 0xFA65, 0x92F9, 0xFA66, 0x66FB, + 0xFA67, 0x5F45, 0xFA68, 0x4E28, 0xFA69, 0x4EE1, 0xFA6A, 0x4EFC, 0xFA6B, 0x4F00, 0xFA6C, 0x4F03, 0xFA6D, 0x4F39, 0xFA6E, 0x4F56, + 0xFA6F, 0x4F92, 0xFA70, 0x4F8A, 0xFA71, 0x4F9A, 0xFA72, 0x4F94, 0xFA73, 0x4FCD, 0xFA74, 0x5040, 0xFA75, 0x5022, 0xFA76, 0x4FFF, + 0xFA77, 0x501E, 0xFA78, 0x5046, 0xFA79, 0x5070, 0xFA7A, 0x5042, 0xFA7B, 0x5094, 0xFA7C, 0x50F4, 0xFA7D, 0x50D8, 0xFA7E, 0x514A, + 0xFA80, 0x5164, 0xFA81, 0x519D, 0xFA82, 0x51BE, 0xFA83, 0x51EC, 0xFA84, 0x5215, 0xFA85, 0x529C, 0xFA86, 0x52A6, 0xFA87, 0x52C0, + 0xFA88, 0x52DB, 0xFA89, 0x5300, 0xFA8A, 0x5307, 0xFA8B, 0x5324, 0xFA8C, 0x5372, 0xFA8D, 0x5393, 0xFA8E, 0x53B2, 0xFA8F, 0x53DD, + 0xFA90, 0xFA0E, 0xFA91, 0x549C, 0xFA92, 0x548A, 0xFA93, 0x54A9, 0xFA94, 0x54FF, 0xFA95, 0x5586, 0xFA96, 0x5759, 0xFA97, 0x5765, + 0xFA98, 0x57AC, 0xFA99, 0x57C8, 0xFA9A, 0x57C7, 0xFA9B, 0xFA0F, 0xFA9C, 0xFA10, 0xFA9D, 0x589E, 0xFA9E, 0x58B2, 0xFA9F, 0x590B, + 0xFAA0, 0x5953, 0xFAA1, 0x595B, 0xFAA2, 0x595D, 0xFAA3, 0x5963, 0xFAA4, 0x59A4, 0xFAA5, 0x59BA, 0xFAA6, 0x5B56, 0xFAA7, 0x5BC0, + 0xFAA8, 0x752F, 0xFAA9, 0x5BD8, 0xFAAA, 0x5BEC, 0xFAAB, 0x5C1E, 0xFAAC, 0x5CA6, 0xFAAD, 0x5CBA, 0xFAAE, 0x5CF5, 0xFAAF, 0x5D27, + 0xFAB0, 0x5D53, 0xFAB1, 0xFA11, 0xFAB2, 0x5D42, 0xFAB3, 0x5D6D, 0xFAB4, 0x5DB8, 0xFAB5, 0x5DB9, 0xFAB6, 0x5DD0, 0xFAB7, 0x5F21, + 0xFAB8, 0x5F34, 0xFAB9, 0x5F67, 0xFABA, 0x5FB7, 0xFABB, 0x5FDE, 0xFABC, 0x605D, 0xFABD, 0x6085, 0xFABE, 0x608A, 0xFABF, 0x60DE, + 0xFAC0, 0x60D5, 0xFAC1, 0x6120, 0xFAC2, 0x60F2, 0xFAC3, 0x6111, 0xFAC4, 0x6137, 0xFAC5, 0x6130, 0xFAC6, 0x6198, 0xFAC7, 0x6213, + 0xFAC8, 0x62A6, 0xFAC9, 0x63F5, 0xFACA, 0x6460, 0xFACB, 0x649D, 0xFACC, 0x64CE, 0xFACD, 0x654E, 0xFACE, 0x6600, 0xFACF, 0x6615, + 0xFAD0, 0x663B, 0xFAD1, 0x6609, 0xFAD2, 0x662E, 0xFAD3, 0x661E, 0xFAD4, 0x6624, 0xFAD5, 0x6665, 0xFAD6, 0x6657, 0xFAD7, 0x6659, + 0xFAD8, 0xFA12, 0xFAD9, 0x6673, 0xFADA, 0x6699, 0xFADB, 0x66A0, 0xFADC, 0x66B2, 0xFADD, 0x66BF, 0xFADE, 0x66FA, 0xFADF, 0x670E, + 0xFAE0, 0xF929, 0xFAE1, 0x6766, 0xFAE2, 0x67BB, 0xFAE3, 0x6852, 0xFAE4, 0x67C0, 0xFAE5, 0x6801, 0xFAE6, 0x6844, 0xFAE7, 0x68CF, + 0xFAE8, 0xFA13, 0xFAE9, 0x6968, 0xFAEA, 0xFA14, 0xFAEB, 0x6998, 0xFAEC, 0x69E2, 0xFAED, 0x6A30, 0xFAEE, 0x6A6B, 0xFAEF, 0x6A46, + 0xFAF0, 0x6A73, 0xFAF1, 0x6A7E, 0xFAF2, 0x6AE2, 0xFAF3, 0x6AE4, 0xFAF4, 0x6BD6, 0xFAF5, 0x6C3F, 0xFAF6, 0x6C5C, 0xFAF7, 0x6C86, + 0xFAF8, 0x6C6F, 0xFAF9, 0x6CDA, 0xFAFA, 0x6D04, 0xFAFB, 0x6D87, 0xFAFC, 0x6D6F, 0xFB40, 0x6D96, 0xFB41, 0x6DAC, 0xFB42, 0x6DCF, + 0xFB43, 0x6DF8, 0xFB44, 0x6DF2, 0xFB45, 0x6DFC, 0xFB46, 0x6E39, 0xFB47, 0x6E5C, 0xFB48, 0x6E27, 0xFB49, 0x6E3C, 0xFB4A, 0x6EBF, + 0xFB4B, 0x6F88, 0xFB4C, 0x6FB5, 0xFB4D, 0x6FF5, 0xFB4E, 0x7005, 0xFB4F, 0x7007, 0xFB50, 0x7028, 0xFB51, 0x7085, 0xFB52, 0x70AB, + 0xFB53, 0x710F, 0xFB54, 0x7104, 0xFB55, 0x715C, 0xFB56, 0x7146, 0xFB57, 0x7147, 0xFB58, 0xFA15, 0xFB59, 0x71C1, 0xFB5A, 0x71FE, + 0xFB5B, 0x72B1, 0xFB5C, 0x72BE, 0xFB5D, 0x7324, 0xFB5E, 0xFA16, 0xFB5F, 0x7377, 0xFB60, 0x73BD, 0xFB61, 0x73C9, 0xFB62, 0x73D6, + 0xFB63, 0x73E3, 0xFB64, 0x73D2, 0xFB65, 0x7407, 0xFB66, 0x73F5, 0xFB67, 0x7426, 0xFB68, 0x742A, 0xFB69, 0x7429, 0xFB6A, 0x742E, + 0xFB6B, 0x7462, 0xFB6C, 0x7489, 0xFB6D, 0x749F, 0xFB6E, 0x7501, 0xFB6F, 0x756F, 0xFB70, 0x7682, 0xFB71, 0x769C, 0xFB72, 0x769E, + 0xFB73, 0x769B, 0xFB74, 0x76A6, 0xFB75, 0xFA17, 0xFB76, 0x7746, 0xFB77, 0x52AF, 0xFB78, 0x7821, 0xFB79, 0x784E, 0xFB7A, 0x7864, + 0xFB7B, 0x787A, 0xFB7C, 0x7930, 0xFB7D, 0xFA18, 0xFB7E, 0xFA19, 0xFB80, 0xFA1A, 0xFB81, 0x7994, 0xFB82, 0xFA1B, 0xFB83, 0x799B, + 0xFB84, 0x7AD1, 0xFB85, 0x7AE7, 0xFB86, 0xFA1C, 0xFB87, 0x7AEB, 0xFB88, 0x7B9E, 0xFB89, 0xFA1D, 0xFB8A, 0x7D48, 0xFB8B, 0x7D5C, + 0xFB8C, 0x7DB7, 0xFB8D, 0x7DA0, 0xFB8E, 0x7DD6, 0xFB8F, 0x7E52, 0xFB90, 0x7F47, 0xFB91, 0x7FA1, 0xFB92, 0xFA1E, 0xFB93, 0x8301, + 0xFB94, 0x8362, 0xFB95, 0x837F, 0xFB96, 0x83C7, 0xFB97, 0x83F6, 0xFB98, 0x8448, 0xFB99, 0x84B4, 0xFB9A, 0x8553, 0xFB9B, 0x8559, + 0xFB9C, 0x856B, 0xFB9D, 0xFA1F, 0xFB9E, 0x85B0, 0xFB9F, 0xFA20, 0xFBA0, 0xFA21, 0xFBA1, 0x8807, 0xFBA2, 0x88F5, 0xFBA3, 0x8A12, + 0xFBA4, 0x8A37, 0xFBA5, 0x8A79, 0xFBA6, 0x8AA7, 0xFBA7, 0x8ABE, 0xFBA8, 0x8ADF, 0xFBA9, 0xFA22, 0xFBAA, 0x8AF6, 0xFBAB, 0x8B53, + 0xFBAC, 0x8B7F, 0xFBAD, 0x8CF0, 0xFBAE, 0x8CF4, 0xFBAF, 0x8D12, 0xFBB0, 0x8D76, 0xFBB1, 0xFA23, 0xFBB2, 0x8ECF, 0xFBB3, 0xFA24, + 0xFBB4, 0xFA25, 0xFBB5, 0x9067, 0xFBB6, 0x90DE, 0xFBB7, 0xFA26, 0xFBB8, 0x9115, 0xFBB9, 0x9127, 0xFBBA, 0x91DA, 0xFBBB, 0x91D7, + 0xFBBC, 0x91DE, 0xFBBD, 0x91ED, 0xFBBE, 0x91EE, 0xFBBF, 0x91E4, 0xFBC0, 0x91E5, 0xFBC1, 0x9206, 0xFBC2, 0x9210, 0xFBC3, 0x920A, + 0xFBC4, 0x923A, 0xFBC5, 0x9240, 0xFBC6, 0x923C, 0xFBC7, 0x924E, 0xFBC8, 0x9259, 0xFBC9, 0x9251, 0xFBCA, 0x9239, 0xFBCB, 0x9267, + 0xFBCC, 0x92A7, 0xFBCD, 0x9277, 0xFBCE, 0x9278, 0xFBCF, 0x92E7, 0xFBD0, 0x92D7, 0xFBD1, 0x92D9, 0xFBD2, 0x92D0, 0xFBD3, 0xFA27, + 0xFBD4, 0x92D5, 0xFBD5, 0x92E0, 0xFBD6, 0x92D3, 0xFBD7, 0x9325, 0xFBD8, 0x9321, 0xFBD9, 0x92FB, 0xFBDA, 0xFA28, 0xFBDB, 0x931E, + 0xFBDC, 0x92FF, 0xFBDD, 0x931D, 0xFBDE, 0x9302, 0xFBDF, 0x9370, 0xFBE0, 0x9357, 0xFBE1, 0x93A4, 0xFBE2, 0x93C6, 0xFBE3, 0x93DE, + 0xFBE4, 0x93F8, 0xFBE5, 0x9431, 0xFBE6, 0x9445, 0xFBE7, 0x9448, 0xFBE8, 0x9592, 0xFBE9, 0xF9DC, 0xFBEA, 0xFA29, 0xFBEB, 0x969D, + 0xFBEC, 0x96AF, 0xFBED, 0x9733, 0xFBEE, 0x973B, 0xFBEF, 0x9743, 0xFBF0, 0x974D, 0xFBF1, 0x974F, 0xFBF2, 0x9751, 0xFBF3, 0x9755, + 0xFBF4, 0x9857, 0xFBF5, 0x9865, 0xFBF6, 0xFA2A, 0xFBF7, 0xFA2B, 0xFBF8, 0x9927, 0xFBF9, 0xFA2C, 0xFBFA, 0x999E, 0xFBFB, 0x9A4E, + 0xFBFC, 0x9AD9, 0xFC40, 0x9ADC, 0xFC41, 0x9B75, 0xFC42, 0x9B72, 0xFC43, 0x9B8F, 0xFC44, 0x9BB1, 0xFC45, 0x9BBB, 0xFC46, 0x9C00, + 0xFC47, 0x9D70, 0xFC48, 0x9D6B, 0xFC49, 0xFA2D, 0xFC4A, 0x9E19, 0xFC4B, 0x9ED1, 0, 0 +}; +#endif + +#if FF_CODE_PAGE == 936 || FF_CODE_PAGE == 0 /* Simplified Chinese */ +static const WCHAR uni2oem936[] = { /* Unicode --> GBK pairs */ + 0x00A4, 0xA1E8, 0x00A7, 0xA1EC, 0x00A8, 0xA1A7, 0x00B0, 0xA1E3, 0x00B1, 0xA1C0, 0x00B7, 0xA1A4, 0x00D7, 0xA1C1, 0x00E0, 0xA8A4, + 0x00E1, 0xA8A2, 0x00E8, 0xA8A8, 0x00E9, 0xA8A6, 0x00EA, 0xA8BA, 0x00EC, 0xA8AC, 0x00ED, 0xA8AA, 0x00F2, 0xA8B0, 0x00F3, 0xA8AE, + 0x00F7, 0xA1C2, 0x00F9, 0xA8B4, 0x00FA, 0xA8B2, 0x00FC, 0xA8B9, 0x0101, 0xA8A1, 0x0113, 0xA8A5, 0x011B, 0xA8A7, 0x012B, 0xA8A9, + 0x0144, 0xA8BD, 0x0148, 0xA8BE, 0x014D, 0xA8AD, 0x016B, 0xA8B1, 0x01CE, 0xA8A3, 0x01D0, 0xA8AB, 0x01D2, 0xA8AF, 0x01D4, 0xA8B3, + 0x01D6, 0xA8B5, 0x01D8, 0xA8B6, 0x01DA, 0xA8B7, 0x01DC, 0xA8B8, 0x0251, 0xA8BB, 0x0261, 0xA8C0, 0x02C7, 0xA1A6, 0x02C9, 0xA1A5, + 0x02CA, 0xA840, 0x02CB, 0xA841, 0x02D9, 0xA842, 0x0391, 0xA6A1, 0x0392, 0xA6A2, 0x0393, 0xA6A3, 0x0394, 0xA6A4, 0x0395, 0xA6A5, + 0x0396, 0xA6A6, 0x0397, 0xA6A7, 0x0398, 0xA6A8, 0x0399, 0xA6A9, 0x039A, 0xA6AA, 0x039B, 0xA6AB, 0x039C, 0xA6AC, 0x039D, 0xA6AD, + 0x039E, 0xA6AE, 0x039F, 0xA6AF, 0x03A0, 0xA6B0, 0x03A1, 0xA6B1, 0x03A3, 0xA6B2, 0x03A4, 0xA6B3, 0x03A5, 0xA6B4, 0x03A6, 0xA6B5, + 0x03A7, 0xA6B6, 0x03A8, 0xA6B7, 0x03A9, 0xA6B8, 0x03B1, 0xA6C1, 0x03B2, 0xA6C2, 0x03B3, 0xA6C3, 0x03B4, 0xA6C4, 0x03B5, 0xA6C5, + 0x03B6, 0xA6C6, 0x03B7, 0xA6C7, 0x03B8, 0xA6C8, 0x03B9, 0xA6C9, 0x03BA, 0xA6CA, 0x03BB, 0xA6CB, 0x03BC, 0xA6CC, 0x03BD, 0xA6CD, + 0x03BE, 0xA6CE, 0x03BF, 0xA6CF, 0x03C0, 0xA6D0, 0x03C1, 0xA6D1, 0x03C3, 0xA6D2, 0x03C4, 0xA6D3, 0x03C5, 0xA6D4, 0x03C6, 0xA6D5, + 0x03C7, 0xA6D6, 0x03C8, 0xA6D7, 0x03C9, 0xA6D8, 0x0401, 0xA7A7, 0x0410, 0xA7A1, 0x0411, 0xA7A2, 0x0412, 0xA7A3, 0x0413, 0xA7A4, + 0x0414, 0xA7A5, 0x0415, 0xA7A6, 0x0416, 0xA7A8, 0x0417, 0xA7A9, 0x0418, 0xA7AA, 0x0419, 0xA7AB, 0x041A, 0xA7AC, 0x041B, 0xA7AD, + 0x041C, 0xA7AE, 0x041D, 0xA7AF, 0x041E, 0xA7B0, 0x041F, 0xA7B1, 0x0420, 0xA7B2, 0x0421, 0xA7B3, 0x0422, 0xA7B4, 0x0423, 0xA7B5, + 0x0424, 0xA7B6, 0x0425, 0xA7B7, 0x0426, 0xA7B8, 0x0427, 0xA7B9, 0x0428, 0xA7BA, 0x0429, 0xA7BB, 0x042A, 0xA7BC, 0x042B, 0xA7BD, + 0x042C, 0xA7BE, 0x042D, 0xA7BF, 0x042E, 0xA7C0, 0x042F, 0xA7C1, 0x0430, 0xA7D1, 0x0431, 0xA7D2, 0x0432, 0xA7D3, 0x0433, 0xA7D4, + 0x0434, 0xA7D5, 0x0435, 0xA7D6, 0x0436, 0xA7D8, 0x0437, 0xA7D9, 0x0438, 0xA7DA, 0x0439, 0xA7DB, 0x043A, 0xA7DC, 0x043B, 0xA7DD, + 0x043C, 0xA7DE, 0x043D, 0xA7DF, 0x043E, 0xA7E0, 0x043F, 0xA7E1, 0x0440, 0xA7E2, 0x0441, 0xA7E3, 0x0442, 0xA7E4, 0x0443, 0xA7E5, + 0x0444, 0xA7E6, 0x0445, 0xA7E7, 0x0446, 0xA7E8, 0x0447, 0xA7E9, 0x0448, 0xA7EA, 0x0449, 0xA7EB, 0x044A, 0xA7EC, 0x044B, 0xA7ED, + 0x044C, 0xA7EE, 0x044D, 0xA7EF, 0x044E, 0xA7F0, 0x044F, 0xA7F1, 0x0451, 0xA7D7, 0x2010, 0xA95C, 0x2013, 0xA843, 0x2014, 0xA1AA, + 0x2015, 0xA844, 0x2016, 0xA1AC, 0x2018, 0xA1AE, 0x2019, 0xA1AF, 0x201C, 0xA1B0, 0x201D, 0xA1B1, 0x2025, 0xA845, 0x2026, 0xA1AD, + 0x2030, 0xA1EB, 0x2032, 0xA1E4, 0x2033, 0xA1E5, 0x2035, 0xA846, 0x203B, 0xA1F9, 0x20AC, 0x0080, 0x2103, 0xA1E6, 0x2105, 0xA847, + 0x2109, 0xA848, 0x2116, 0xA1ED, 0x2121, 0xA959, 0x2160, 0xA2F1, 0x2161, 0xA2F2, 0x2162, 0xA2F3, 0x2163, 0xA2F4, 0x2164, 0xA2F5, + 0x2165, 0xA2F6, 0x2166, 0xA2F7, 0x2167, 0xA2F8, 0x2168, 0xA2F9, 0x2169, 0xA2FA, 0x216A, 0xA2FB, 0x216B, 0xA2FC, 0x2170, 0xA2A1, + 0x2171, 0xA2A2, 0x2172, 0xA2A3, 0x2173, 0xA2A4, 0x2174, 0xA2A5, 0x2175, 0xA2A6, 0x2176, 0xA2A7, 0x2177, 0xA2A8, 0x2178, 0xA2A9, + 0x2179, 0xA2AA, 0x2190, 0xA1FB, 0x2191, 0xA1FC, 0x2192, 0xA1FA, 0x2193, 0xA1FD, 0x2196, 0xA849, 0x2197, 0xA84A, 0x2198, 0xA84B, + 0x2199, 0xA84C, 0x2208, 0xA1CA, 0x220F, 0xA1C7, 0x2211, 0xA1C6, 0x2215, 0xA84D, 0x221A, 0xA1CC, 0x221D, 0xA1D8, 0x221E, 0xA1DE, + 0x221F, 0xA84E, 0x2220, 0xA1CF, 0x2223, 0xA84F, 0x2225, 0xA1CE, 0x2227, 0xA1C4, 0x2228, 0xA1C5, 0x2229, 0xA1C9, 0x222A, 0xA1C8, + 0x222B, 0xA1D2, 0x222E, 0xA1D3, 0x2234, 0xA1E0, 0x2235, 0xA1DF, 0x2236, 0xA1C3, 0x2237, 0xA1CB, 0x223D, 0xA1D7, 0x2248, 0xA1D6, + 0x224C, 0xA1D5, 0x2252, 0xA850, 0x2260, 0xA1D9, 0x2261, 0xA1D4, 0x2264, 0xA1DC, 0x2265, 0xA1DD, 0x2266, 0xA851, 0x2267, 0xA852, + 0x226E, 0xA1DA, 0x226F, 0xA1DB, 0x2295, 0xA892, 0x2299, 0xA1D1, 0x22A5, 0xA1CD, 0x22BF, 0xA853, 0x2312, 0xA1D0, 0x2460, 0xA2D9, + 0x2461, 0xA2DA, 0x2462, 0xA2DB, 0x2463, 0xA2DC, 0x2464, 0xA2DD, 0x2465, 0xA2DE, 0x2466, 0xA2DF, 0x2467, 0xA2E0, 0x2468, 0xA2E1, + 0x2469, 0xA2E2, 0x2474, 0xA2C5, 0x2475, 0xA2C6, 0x2476, 0xA2C7, 0x2477, 0xA2C8, 0x2478, 0xA2C9, 0x2479, 0xA2CA, 0x247A, 0xA2CB, + 0x247B, 0xA2CC, 0x247C, 0xA2CD, 0x247D, 0xA2CE, 0x247E, 0xA2CF, 0x247F, 0xA2D0, 0x2480, 0xA2D1, 0x2481, 0xA2D2, 0x2482, 0xA2D3, + 0x2483, 0xA2D4, 0x2484, 0xA2D5, 0x2485, 0xA2D6, 0x2486, 0xA2D7, 0x2487, 0xA2D8, 0x2488, 0xA2B1, 0x2489, 0xA2B2, 0x248A, 0xA2B3, + 0x248B, 0xA2B4, 0x248C, 0xA2B5, 0x248D, 0xA2B6, 0x248E, 0xA2B7, 0x248F, 0xA2B8, 0x2490, 0xA2B9, 0x2491, 0xA2BA, 0x2492, 0xA2BB, + 0x2493, 0xA2BC, 0x2494, 0xA2BD, 0x2495, 0xA2BE, 0x2496, 0xA2BF, 0x2497, 0xA2C0, 0x2498, 0xA2C1, 0x2499, 0xA2C2, 0x249A, 0xA2C3, + 0x249B, 0xA2C4, 0x2500, 0xA9A4, 0x2501, 0xA9A5, 0x2502, 0xA9A6, 0x2503, 0xA9A7, 0x2504, 0xA9A8, 0x2505, 0xA9A9, 0x2506, 0xA9AA, + 0x2507, 0xA9AB, 0x2508, 0xA9AC, 0x2509, 0xA9AD, 0x250A, 0xA9AE, 0x250B, 0xA9AF, 0x250C, 0xA9B0, 0x250D, 0xA9B1, 0x250E, 0xA9B2, + 0x250F, 0xA9B3, 0x2510, 0xA9B4, 0x2511, 0xA9B5, 0x2512, 0xA9B6, 0x2513, 0xA9B7, 0x2514, 0xA9B8, 0x2515, 0xA9B9, 0x2516, 0xA9BA, + 0x2517, 0xA9BB, 0x2518, 0xA9BC, 0x2519, 0xA9BD, 0x251A, 0xA9BE, 0x251B, 0xA9BF, 0x251C, 0xA9C0, 0x251D, 0xA9C1, 0x251E, 0xA9C2, + 0x251F, 0xA9C3, 0x2520, 0xA9C4, 0x2521, 0xA9C5, 0x2522, 0xA9C6, 0x2523, 0xA9C7, 0x2524, 0xA9C8, 0x2525, 0xA9C9, 0x2526, 0xA9CA, + 0x2527, 0xA9CB, 0x2528, 0xA9CC, 0x2529, 0xA9CD, 0x252A, 0xA9CE, 0x252B, 0xA9CF, 0x252C, 0xA9D0, 0x252D, 0xA9D1, 0x252E, 0xA9D2, + 0x252F, 0xA9D3, 0x2530, 0xA9D4, 0x2531, 0xA9D5, 0x2532, 0xA9D6, 0x2533, 0xA9D7, 0x2534, 0xA9D8, 0x2535, 0xA9D9, 0x2536, 0xA9DA, + 0x2537, 0xA9DB, 0x2538, 0xA9DC, 0x2539, 0xA9DD, 0x253A, 0xA9DE, 0x253B, 0xA9DF, 0x253C, 0xA9E0, 0x253D, 0xA9E1, 0x253E, 0xA9E2, + 0x253F, 0xA9E3, 0x2540, 0xA9E4, 0x2541, 0xA9E5, 0x2542, 0xA9E6, 0x2543, 0xA9E7, 0x2544, 0xA9E8, 0x2545, 0xA9E9, 0x2546, 0xA9EA, + 0x2547, 0xA9EB, 0x2548, 0xA9EC, 0x2549, 0xA9ED, 0x254A, 0xA9EE, 0x254B, 0xA9EF, 0x2550, 0xA854, 0x2551, 0xA855, 0x2552, 0xA856, + 0x2553, 0xA857, 0x2554, 0xA858, 0x2555, 0xA859, 0x2556, 0xA85A, 0x2557, 0xA85B, 0x2558, 0xA85C, 0x2559, 0xA85D, 0x255A, 0xA85E, + 0x255B, 0xA85F, 0x255C, 0xA860, 0x255D, 0xA861, 0x255E, 0xA862, 0x255F, 0xA863, 0x2560, 0xA864, 0x2561, 0xA865, 0x2562, 0xA866, + 0x2563, 0xA867, 0x2564, 0xA868, 0x2565, 0xA869, 0x2566, 0xA86A, 0x2567, 0xA86B, 0x2568, 0xA86C, 0x2569, 0xA86D, 0x256A, 0xA86E, + 0x256B, 0xA86F, 0x256C, 0xA870, 0x256D, 0xA871, 0x256E, 0xA872, 0x256F, 0xA873, 0x2570, 0xA874, 0x2571, 0xA875, 0x2572, 0xA876, + 0x2573, 0xA877, 0x2581, 0xA878, 0x2582, 0xA879, 0x2583, 0xA87A, 0x2584, 0xA87B, 0x2585, 0xA87C, 0x2586, 0xA87D, 0x2587, 0xA87E, + 0x2588, 0xA880, 0x2589, 0xA881, 0x258A, 0xA882, 0x258B, 0xA883, 0x258C, 0xA884, 0x258D, 0xA885, 0x258E, 0xA886, 0x258F, 0xA887, + 0x2593, 0xA888, 0x2594, 0xA889, 0x2595, 0xA88A, 0x25A0, 0xA1F6, 0x25A1, 0xA1F5, 0x25B2, 0xA1F8, 0x25B3, 0xA1F7, 0x25BC, 0xA88B, + 0x25BD, 0xA88C, 0x25C6, 0xA1F4, 0x25C7, 0xA1F3, 0x25CB, 0xA1F0, 0x25CE, 0xA1F2, 0x25CF, 0xA1F1, 0x25E2, 0xA88D, 0x25E3, 0xA88E, + 0x25E4, 0xA88F, 0x25E5, 0xA890, 0x2605, 0xA1EF, 0x2606, 0xA1EE, 0x2609, 0xA891, 0x2640, 0xA1E2, 0x2642, 0xA1E1, 0x3000, 0xA1A1, + 0x3001, 0xA1A2, 0x3002, 0xA1A3, 0x3003, 0xA1A8, 0x3005, 0xA1A9, 0x3006, 0xA965, 0x3007, 0xA996, 0x3008, 0xA1B4, 0x3009, 0xA1B5, + 0x300A, 0xA1B6, 0x300B, 0xA1B7, 0x300C, 0xA1B8, 0x300D, 0xA1B9, 0x300E, 0xA1BA, 0x300F, 0xA1BB, 0x3010, 0xA1BE, 0x3011, 0xA1BF, + 0x3012, 0xA893, 0x3013, 0xA1FE, 0x3014, 0xA1B2, 0x3015, 0xA1B3, 0x3016, 0xA1BC, 0x3017, 0xA1BD, 0x301D, 0xA894, 0x301E, 0xA895, + 0x3021, 0xA940, 0x3022, 0xA941, 0x3023, 0xA942, 0x3024, 0xA943, 0x3025, 0xA944, 0x3026, 0xA945, 0x3027, 0xA946, 0x3028, 0xA947, + 0x3029, 0xA948, 0x3041, 0xA4A1, 0x3042, 0xA4A2, 0x3043, 0xA4A3, 0x3044, 0xA4A4, 0x3045, 0xA4A5, 0x3046, 0xA4A6, 0x3047, 0xA4A7, + 0x3048, 0xA4A8, 0x3049, 0xA4A9, 0x304A, 0xA4AA, 0x304B, 0xA4AB, 0x304C, 0xA4AC, 0x304D, 0xA4AD, 0x304E, 0xA4AE, 0x304F, 0xA4AF, + 0x3050, 0xA4B0, 0x3051, 0xA4B1, 0x3052, 0xA4B2, 0x3053, 0xA4B3, 0x3054, 0xA4B4, 0x3055, 0xA4B5, 0x3056, 0xA4B6, 0x3057, 0xA4B7, + 0x3058, 0xA4B8, 0x3059, 0xA4B9, 0x305A, 0xA4BA, 0x305B, 0xA4BB, 0x305C, 0xA4BC, 0x305D, 0xA4BD, 0x305E, 0xA4BE, 0x305F, 0xA4BF, + 0x3060, 0xA4C0, 0x3061, 0xA4C1, 0x3062, 0xA4C2, 0x3063, 0xA4C3, 0x3064, 0xA4C4, 0x3065, 0xA4C5, 0x3066, 0xA4C6, 0x3067, 0xA4C7, + 0x3068, 0xA4C8, 0x3069, 0xA4C9, 0x306A, 0xA4CA, 0x306B, 0xA4CB, 0x306C, 0xA4CC, 0x306D, 0xA4CD, 0x306E, 0xA4CE, 0x306F, 0xA4CF, + 0x3070, 0xA4D0, 0x3071, 0xA4D1, 0x3072, 0xA4D2, 0x3073, 0xA4D3, 0x3074, 0xA4D4, 0x3075, 0xA4D5, 0x3076, 0xA4D6, 0x3077, 0xA4D7, + 0x3078, 0xA4D8, 0x3079, 0xA4D9, 0x307A, 0xA4DA, 0x307B, 0xA4DB, 0x307C, 0xA4DC, 0x307D, 0xA4DD, 0x307E, 0xA4DE, 0x307F, 0xA4DF, + 0x3080, 0xA4E0, 0x3081, 0xA4E1, 0x3082, 0xA4E2, 0x3083, 0xA4E3, 0x3084, 0xA4E4, 0x3085, 0xA4E5, 0x3086, 0xA4E6, 0x3087, 0xA4E7, + 0x3088, 0xA4E8, 0x3089, 0xA4E9, 0x308A, 0xA4EA, 0x308B, 0xA4EB, 0x308C, 0xA4EC, 0x308D, 0xA4ED, 0x308E, 0xA4EE, 0x308F, 0xA4EF, + 0x3090, 0xA4F0, 0x3091, 0xA4F1, 0x3092, 0xA4F2, 0x3093, 0xA4F3, 0x309B, 0xA961, 0x309C, 0xA962, 0x309D, 0xA966, 0x309E, 0xA967, + 0x30A1, 0xA5A1, 0x30A2, 0xA5A2, 0x30A3, 0xA5A3, 0x30A4, 0xA5A4, 0x30A5, 0xA5A5, 0x30A6, 0xA5A6, 0x30A7, 0xA5A7, 0x30A8, 0xA5A8, + 0x30A9, 0xA5A9, 0x30AA, 0xA5AA, 0x30AB, 0xA5AB, 0x30AC, 0xA5AC, 0x30AD, 0xA5AD, 0x30AE, 0xA5AE, 0x30AF, 0xA5AF, 0x30B0, 0xA5B0, + 0x30B1, 0xA5B1, 0x30B2, 0xA5B2, 0x30B3, 0xA5B3, 0x30B4, 0xA5B4, 0x30B5, 0xA5B5, 0x30B6, 0xA5B6, 0x30B7, 0xA5B7, 0x30B8, 0xA5B8, + 0x30B9, 0xA5B9, 0x30BA, 0xA5BA, 0x30BB, 0xA5BB, 0x30BC, 0xA5BC, 0x30BD, 0xA5BD, 0x30BE, 0xA5BE, 0x30BF, 0xA5BF, 0x30C0, 0xA5C0, + 0x30C1, 0xA5C1, 0x30C2, 0xA5C2, 0x30C3, 0xA5C3, 0x30C4, 0xA5C4, 0x30C5, 0xA5C5, 0x30C6, 0xA5C6, 0x30C7, 0xA5C7, 0x30C8, 0xA5C8, + 0x30C9, 0xA5C9, 0x30CA, 0xA5CA, 0x30CB, 0xA5CB, 0x30CC, 0xA5CC, 0x30CD, 0xA5CD, 0x30CE, 0xA5CE, 0x30CF, 0xA5CF, 0x30D0, 0xA5D0, + 0x30D1, 0xA5D1, 0x30D2, 0xA5D2, 0x30D3, 0xA5D3, 0x30D4, 0xA5D4, 0x30D5, 0xA5D5, 0x30D6, 0xA5D6, 0x30D7, 0xA5D7, 0x30D8, 0xA5D8, + 0x30D9, 0xA5D9, 0x30DA, 0xA5DA, 0x30DB, 0xA5DB, 0x30DC, 0xA5DC, 0x30DD, 0xA5DD, 0x30DE, 0xA5DE, 0x30DF, 0xA5DF, 0x30E0, 0xA5E0, + 0x30E1, 0xA5E1, 0x30E2, 0xA5E2, 0x30E3, 0xA5E3, 0x30E4, 0xA5E4, 0x30E5, 0xA5E5, 0x30E6, 0xA5E6, 0x30E7, 0xA5E7, 0x30E8, 0xA5E8, + 0x30E9, 0xA5E9, 0x30EA, 0xA5EA, 0x30EB, 0xA5EB, 0x30EC, 0xA5EC, 0x30ED, 0xA5ED, 0x30EE, 0xA5EE, 0x30EF, 0xA5EF, 0x30F0, 0xA5F0, + 0x30F1, 0xA5F1, 0x30F2, 0xA5F2, 0x30F3, 0xA5F3, 0x30F4, 0xA5F4, 0x30F5, 0xA5F5, 0x30F6, 0xA5F6, 0x30FC, 0xA960, 0x30FD, 0xA963, + 0x30FE, 0xA964, 0x3105, 0xA8C5, 0x3106, 0xA8C6, 0x3107, 0xA8C7, 0x3108, 0xA8C8, 0x3109, 0xA8C9, 0x310A, 0xA8CA, 0x310B, 0xA8CB, + 0x310C, 0xA8CC, 0x310D, 0xA8CD, 0x310E, 0xA8CE, 0x310F, 0xA8CF, 0x3110, 0xA8D0, 0x3111, 0xA8D1, 0x3112, 0xA8D2, 0x3113, 0xA8D3, + 0x3114, 0xA8D4, 0x3115, 0xA8D5, 0x3116, 0xA8D6, 0x3117, 0xA8D7, 0x3118, 0xA8D8, 0x3119, 0xA8D9, 0x311A, 0xA8DA, 0x311B, 0xA8DB, + 0x311C, 0xA8DC, 0x311D, 0xA8DD, 0x311E, 0xA8DE, 0x311F, 0xA8DF, 0x3120, 0xA8E0, 0x3121, 0xA8E1, 0x3122, 0xA8E2, 0x3123, 0xA8E3, + 0x3124, 0xA8E4, 0x3125, 0xA8E5, 0x3126, 0xA8E6, 0x3127, 0xA8E7, 0x3128, 0xA8E8, 0x3129, 0xA8E9, 0x3220, 0xA2E5, 0x3221, 0xA2E6, + 0x3222, 0xA2E7, 0x3223, 0xA2E8, 0x3224, 0xA2E9, 0x3225, 0xA2EA, 0x3226, 0xA2EB, 0x3227, 0xA2EC, 0x3228, 0xA2ED, 0x3229, 0xA2EE, + 0x3231, 0xA95A, 0x32A3, 0xA949, 0x338E, 0xA94A, 0x338F, 0xA94B, 0x339C, 0xA94C, 0x339D, 0xA94D, 0x339E, 0xA94E, 0x33A1, 0xA94F, + 0x33C4, 0xA950, 0x33CE, 0xA951, 0x33D1, 0xA952, 0x33D2, 0xA953, 0x33D5, 0xA954, 0x4E00, 0xD2BB, 0x4E01, 0xB6A1, 0x4E02, 0x8140, + 0x4E03, 0xC6DF, 0x4E04, 0x8141, 0x4E05, 0x8142, 0x4E06, 0x8143, 0x4E07, 0xCDF2, 0x4E08, 0xD5C9, 0x4E09, 0xC8FD, 0x4E0A, 0xC9CF, + 0x4E0B, 0xCFC2, 0x4E0C, 0xD8A2, 0x4E0D, 0xB2BB, 0x4E0E, 0xD3EB, 0x4E0F, 0x8144, 0x4E10, 0xD8A4, 0x4E11, 0xB3F3, 0x4E12, 0x8145, + 0x4E13, 0xD7A8, 0x4E14, 0xC7D2, 0x4E15, 0xD8A7, 0x4E16, 0xCAC0, 0x4E17, 0x8146, 0x4E18, 0xC7F0, 0x4E19, 0xB1FB, 0x4E1A, 0xD2B5, + 0x4E1B, 0xB4D4, 0x4E1C, 0xB6AB, 0x4E1D, 0xCBBF, 0x4E1E, 0xD8A9, 0x4E1F, 0x8147, 0x4E20, 0x8148, 0x4E21, 0x8149, 0x4E22, 0xB6AA, + 0x4E23, 0x814A, 0x4E24, 0xC1BD, 0x4E25, 0xD1CF, 0x4E26, 0x814B, 0x4E27, 0xC9A5, 0x4E28, 0xD8AD, 0x4E29, 0x814C, 0x4E2A, 0xB8F6, + 0x4E2B, 0xD1BE, 0x4E2C, 0xE3DC, 0x4E2D, 0xD6D0, 0x4E2E, 0x814D, 0x4E2F, 0x814E, 0x4E30, 0xB7E1, 0x4E31, 0x814F, 0x4E32, 0xB4AE, + 0x4E33, 0x8150, 0x4E34, 0xC1D9, 0x4E35, 0x8151, 0x4E36, 0xD8BC, 0x4E37, 0x8152, 0x4E38, 0xCDE8, 0x4E39, 0xB5A4, 0x4E3A, 0xCEAA, + 0x4E3B, 0xD6F7, 0x4E3C, 0x8153, 0x4E3D, 0xC0F6, 0x4E3E, 0xBED9, 0x4E3F, 0xD8AF, 0x4E40, 0x8154, 0x4E41, 0x8155, 0x4E42, 0x8156, + 0x4E43, 0xC4CB, 0x4E44, 0x8157, 0x4E45, 0xBEC3, 0x4E46, 0x8158, 0x4E47, 0xD8B1, 0x4E48, 0xC3B4, 0x4E49, 0xD2E5, 0x4E4A, 0x8159, + 0x4E4B, 0xD6AE, 0x4E4C, 0xCEDA, 0x4E4D, 0xD5A7, 0x4E4E, 0xBAF5, 0x4E4F, 0xB7A6, 0x4E50, 0xC0D6, 0x4E51, 0x815A, 0x4E52, 0xC6B9, + 0x4E53, 0xC5D2, 0x4E54, 0xC7C7, 0x4E55, 0x815B, 0x4E56, 0xB9D4, 0x4E57, 0x815C, 0x4E58, 0xB3CB, 0x4E59, 0xD2D2, 0x4E5A, 0x815D, + 0x4E5B, 0x815E, 0x4E5C, 0xD8BF, 0x4E5D, 0xBEC5, 0x4E5E, 0xC6F2, 0x4E5F, 0xD2B2, 0x4E60, 0xCFB0, 0x4E61, 0xCFE7, 0x4E62, 0x815F, + 0x4E63, 0x8160, 0x4E64, 0x8161, 0x4E65, 0x8162, 0x4E66, 0xCAE9, 0x4E67, 0x8163, 0x4E68, 0x8164, 0x4E69, 0xD8C0, 0x4E6A, 0x8165, + 0x4E6B, 0x8166, 0x4E6C, 0x8167, 0x4E6D, 0x8168, 0x4E6E, 0x8169, 0x4E6F, 0x816A, 0x4E70, 0xC2F2, 0x4E71, 0xC2D2, 0x4E72, 0x816B, + 0x4E73, 0xC8E9, 0x4E74, 0x816C, 0x4E75, 0x816D, 0x4E76, 0x816E, 0x4E77, 0x816F, 0x4E78, 0x8170, 0x4E79, 0x8171, 0x4E7A, 0x8172, + 0x4E7B, 0x8173, 0x4E7C, 0x8174, 0x4E7D, 0x8175, 0x4E7E, 0xC7AC, 0x4E7F, 0x8176, 0x4E80, 0x8177, 0x4E81, 0x8178, 0x4E82, 0x8179, + 0x4E83, 0x817A, 0x4E84, 0x817B, 0x4E85, 0x817C, 0x4E86, 0xC1CB, 0x4E87, 0x817D, 0x4E88, 0xD3E8, 0x4E89, 0xD5F9, 0x4E8A, 0x817E, + 0x4E8B, 0xCAC2, 0x4E8C, 0xB6FE, 0x4E8D, 0xD8A1, 0x4E8E, 0xD3DA, 0x4E8F, 0xBFF7, 0x4E90, 0x8180, 0x4E91, 0xD4C6, 0x4E92, 0xBBA5, + 0x4E93, 0xD8C1, 0x4E94, 0xCEE5, 0x4E95, 0xBEAE, 0x4E96, 0x8181, 0x4E97, 0x8182, 0x4E98, 0xD8A8, 0x4E99, 0x8183, 0x4E9A, 0xD1C7, + 0x4E9B, 0xD0A9, 0x4E9C, 0x8184, 0x4E9D, 0x8185, 0x4E9E, 0x8186, 0x4E9F, 0xD8BD, 0x4EA0, 0xD9EF, 0x4EA1, 0xCDF6, 0x4EA2, 0xBFBA, + 0x4EA3, 0x8187, 0x4EA4, 0xBDBB, 0x4EA5, 0xBAA5, 0x4EA6, 0xD2E0, 0x4EA7, 0xB2FA, 0x4EA8, 0xBAE0, 0x4EA9, 0xC4B6, 0x4EAA, 0x8188, + 0x4EAB, 0xCFED, 0x4EAC, 0xBEA9, 0x4EAD, 0xCDA4, 0x4EAE, 0xC1C1, 0x4EAF, 0x8189, 0x4EB0, 0x818A, 0x4EB1, 0x818B, 0x4EB2, 0xC7D7, + 0x4EB3, 0xD9F1, 0x4EB4, 0x818C, 0x4EB5, 0xD9F4, 0x4EB6, 0x818D, 0x4EB7, 0x818E, 0x4EB8, 0x818F, 0x4EB9, 0x8190, 0x4EBA, 0xC8CB, + 0x4EBB, 0xD8E9, 0x4EBC, 0x8191, 0x4EBD, 0x8192, 0x4EBE, 0x8193, 0x4EBF, 0xD2DA, 0x4EC0, 0xCAB2, 0x4EC1, 0xC8CA, 0x4EC2, 0xD8EC, + 0x4EC3, 0xD8EA, 0x4EC4, 0xD8C6, 0x4EC5, 0xBDF6, 0x4EC6, 0xC6CD, 0x4EC7, 0xB3F0, 0x4EC8, 0x8194, 0x4EC9, 0xD8EB, 0x4ECA, 0xBDF1, + 0x4ECB, 0xBDE9, 0x4ECC, 0x8195, 0x4ECD, 0xC8D4, 0x4ECE, 0xB4D3, 0x4ECF, 0x8196, 0x4ED0, 0x8197, 0x4ED1, 0xC2D8, 0x4ED2, 0x8198, + 0x4ED3, 0xB2D6, 0x4ED4, 0xD7D0, 0x4ED5, 0xCACB, 0x4ED6, 0xCBFB, 0x4ED7, 0xD5CC, 0x4ED8, 0xB8B6, 0x4ED9, 0xCFC9, 0x4EDA, 0x8199, + 0x4EDB, 0x819A, 0x4EDC, 0x819B, 0x4EDD, 0xD9DA, 0x4EDE, 0xD8F0, 0x4EDF, 0xC7AA, 0x4EE0, 0x819C, 0x4EE1, 0xD8EE, 0x4EE2, 0x819D, + 0x4EE3, 0xB4FA, 0x4EE4, 0xC1EE, 0x4EE5, 0xD2D4, 0x4EE6, 0x819E, 0x4EE7, 0x819F, 0x4EE8, 0xD8ED, 0x4EE9, 0x81A0, 0x4EEA, 0xD2C7, + 0x4EEB, 0xD8EF, 0x4EEC, 0xC3C7, 0x4EED, 0x81A1, 0x4EEE, 0x81A2, 0x4EEF, 0x81A3, 0x4EF0, 0xD1F6, 0x4EF1, 0x81A4, 0x4EF2, 0xD6D9, + 0x4EF3, 0xD8F2, 0x4EF4, 0x81A5, 0x4EF5, 0xD8F5, 0x4EF6, 0xBCFE, 0x4EF7, 0xBCDB, 0x4EF8, 0x81A6, 0x4EF9, 0x81A7, 0x4EFA, 0x81A8, + 0x4EFB, 0xC8CE, 0x4EFC, 0x81A9, 0x4EFD, 0xB7DD, 0x4EFE, 0x81AA, 0x4EFF, 0xB7C2, 0x4F00, 0x81AB, 0x4F01, 0xC6F3, 0x4F02, 0x81AC, + 0x4F03, 0x81AD, 0x4F04, 0x81AE, 0x4F05, 0x81AF, 0x4F06, 0x81B0, 0x4F07, 0x81B1, 0x4F08, 0x81B2, 0x4F09, 0xD8F8, 0x4F0A, 0xD2C1, + 0x4F0B, 0x81B3, 0x4F0C, 0x81B4, 0x4F0D, 0xCEE9, 0x4F0E, 0xBCBF, 0x4F0F, 0xB7FC, 0x4F10, 0xB7A5, 0x4F11, 0xD0DD, 0x4F12, 0x81B5, + 0x4F13, 0x81B6, 0x4F14, 0x81B7, 0x4F15, 0x81B8, 0x4F16, 0x81B9, 0x4F17, 0xD6DA, 0x4F18, 0xD3C5, 0x4F19, 0xBBEF, 0x4F1A, 0xBBE1, + 0x4F1B, 0xD8F1, 0x4F1C, 0x81BA, 0x4F1D, 0x81BB, 0x4F1E, 0xC9A1, 0x4F1F, 0xCEB0, 0x4F20, 0xB4AB, 0x4F21, 0x81BC, 0x4F22, 0xD8F3, + 0x4F23, 0x81BD, 0x4F24, 0xC9CB, 0x4F25, 0xD8F6, 0x4F26, 0xC2D7, 0x4F27, 0xD8F7, 0x4F28, 0x81BE, 0x4F29, 0x81BF, 0x4F2A, 0xCEB1, + 0x4F2B, 0xD8F9, 0x4F2C, 0x81C0, 0x4F2D, 0x81C1, 0x4F2E, 0x81C2, 0x4F2F, 0xB2AE, 0x4F30, 0xB9C0, 0x4F31, 0x81C3, 0x4F32, 0xD9A3, + 0x4F33, 0x81C4, 0x4F34, 0xB0E9, 0x4F35, 0x81C5, 0x4F36, 0xC1E6, 0x4F37, 0x81C6, 0x4F38, 0xC9EC, 0x4F39, 0x81C7, 0x4F3A, 0xCBC5, + 0x4F3B, 0x81C8, 0x4F3C, 0xCBC6, 0x4F3D, 0xD9A4, 0x4F3E, 0x81C9, 0x4F3F, 0x81CA, 0x4F40, 0x81CB, 0x4F41, 0x81CC, 0x4F42, 0x81CD, + 0x4F43, 0xB5E8, 0x4F44, 0x81CE, 0x4F45, 0x81CF, 0x4F46, 0xB5AB, 0x4F47, 0x81D0, 0x4F48, 0x81D1, 0x4F49, 0x81D2, 0x4F4A, 0x81D3, + 0x4F4B, 0x81D4, 0x4F4C, 0x81D5, 0x4F4D, 0xCEBB, 0x4F4E, 0xB5CD, 0x4F4F, 0xD7A1, 0x4F50, 0xD7F4, 0x4F51, 0xD3D3, 0x4F52, 0x81D6, + 0x4F53, 0xCCE5, 0x4F54, 0x81D7, 0x4F55, 0xBACE, 0x4F56, 0x81D8, 0x4F57, 0xD9A2, 0x4F58, 0xD9DC, 0x4F59, 0xD3E0, 0x4F5A, 0xD8FD, + 0x4F5B, 0xB7F0, 0x4F5C, 0xD7F7, 0x4F5D, 0xD8FE, 0x4F5E, 0xD8FA, 0x4F5F, 0xD9A1, 0x4F60, 0xC4E3, 0x4F61, 0x81D9, 0x4F62, 0x81DA, + 0x4F63, 0xD3B6, 0x4F64, 0xD8F4, 0x4F65, 0xD9DD, 0x4F66, 0x81DB, 0x4F67, 0xD8FB, 0x4F68, 0x81DC, 0x4F69, 0xC5E5, 0x4F6A, 0x81DD, + 0x4F6B, 0x81DE, 0x4F6C, 0xC0D0, 0x4F6D, 0x81DF, 0x4F6E, 0x81E0, 0x4F6F, 0xD1F0, 0x4F70, 0xB0DB, 0x4F71, 0x81E1, 0x4F72, 0x81E2, + 0x4F73, 0xBCD1, 0x4F74, 0xD9A6, 0x4F75, 0x81E3, 0x4F76, 0xD9A5, 0x4F77, 0x81E4, 0x4F78, 0x81E5, 0x4F79, 0x81E6, 0x4F7A, 0x81E7, + 0x4F7B, 0xD9AC, 0x4F7C, 0xD9AE, 0x4F7D, 0x81E8, 0x4F7E, 0xD9AB, 0x4F7F, 0xCAB9, 0x4F80, 0x81E9, 0x4F81, 0x81EA, 0x4F82, 0x81EB, + 0x4F83, 0xD9A9, 0x4F84, 0xD6B6, 0x4F85, 0x81EC, 0x4F86, 0x81ED, 0x4F87, 0x81EE, 0x4F88, 0xB3DE, 0x4F89, 0xD9A8, 0x4F8A, 0x81EF, + 0x4F8B, 0xC0FD, 0x4F8C, 0x81F0, 0x4F8D, 0xCACC, 0x4F8E, 0x81F1, 0x4F8F, 0xD9AA, 0x4F90, 0x81F2, 0x4F91, 0xD9A7, 0x4F92, 0x81F3, + 0x4F93, 0x81F4, 0x4F94, 0xD9B0, 0x4F95, 0x81F5, 0x4F96, 0x81F6, 0x4F97, 0xB6B1, 0x4F98, 0x81F7, 0x4F99, 0x81F8, 0x4F9A, 0x81F9, + 0x4F9B, 0xB9A9, 0x4F9C, 0x81FA, 0x4F9D, 0xD2C0, 0x4F9E, 0x81FB, 0x4F9F, 0x81FC, 0x4FA0, 0xCFC0, 0x4FA1, 0x81FD, 0x4FA2, 0x81FE, + 0x4FA3, 0xC2C2, 0x4FA4, 0x8240, 0x4FA5, 0xBDC4, 0x4FA6, 0xD5EC, 0x4FA7, 0xB2E0, 0x4FA8, 0xC7C8, 0x4FA9, 0xBFEB, 0x4FAA, 0xD9AD, + 0x4FAB, 0x8241, 0x4FAC, 0xD9AF, 0x4FAD, 0x8242, 0x4FAE, 0xCEEA, 0x4FAF, 0xBAEE, 0x4FB0, 0x8243, 0x4FB1, 0x8244, 0x4FB2, 0x8245, + 0x4FB3, 0x8246, 0x4FB4, 0x8247, 0x4FB5, 0xC7D6, 0x4FB6, 0x8248, 0x4FB7, 0x8249, 0x4FB8, 0x824A, 0x4FB9, 0x824B, 0x4FBA, 0x824C, + 0x4FBB, 0x824D, 0x4FBC, 0x824E, 0x4FBD, 0x824F, 0x4FBE, 0x8250, 0x4FBF, 0xB1E3, 0x4FC0, 0x8251, 0x4FC1, 0x8252, 0x4FC2, 0x8253, + 0x4FC3, 0xB4D9, 0x4FC4, 0xB6ED, 0x4FC5, 0xD9B4, 0x4FC6, 0x8254, 0x4FC7, 0x8255, 0x4FC8, 0x8256, 0x4FC9, 0x8257, 0x4FCA, 0xBFA1, + 0x4FCB, 0x8258, 0x4FCC, 0x8259, 0x4FCD, 0x825A, 0x4FCE, 0xD9DE, 0x4FCF, 0xC7CE, 0x4FD0, 0xC0FE, 0x4FD1, 0xD9B8, 0x4FD2, 0x825B, + 0x4FD3, 0x825C, 0x4FD4, 0x825D, 0x4FD5, 0x825E, 0x4FD6, 0x825F, 0x4FD7, 0xCBD7, 0x4FD8, 0xB7FD, 0x4FD9, 0x8260, 0x4FDA, 0xD9B5, + 0x4FDB, 0x8261, 0x4FDC, 0xD9B7, 0x4FDD, 0xB1A3, 0x4FDE, 0xD3E1, 0x4FDF, 0xD9B9, 0x4FE0, 0x8262, 0x4FE1, 0xD0C5, 0x4FE2, 0x8263, + 0x4FE3, 0xD9B6, 0x4FE4, 0x8264, 0x4FE5, 0x8265, 0x4FE6, 0xD9B1, 0x4FE7, 0x8266, 0x4FE8, 0xD9B2, 0x4FE9, 0xC1A9, 0x4FEA, 0xD9B3, + 0x4FEB, 0x8267, 0x4FEC, 0x8268, 0x4FED, 0xBCF3, 0x4FEE, 0xD0DE, 0x4FEF, 0xB8A9, 0x4FF0, 0x8269, 0x4FF1, 0xBEE3, 0x4FF2, 0x826A, + 0x4FF3, 0xD9BD, 0x4FF4, 0x826B, 0x4FF5, 0x826C, 0x4FF6, 0x826D, 0x4FF7, 0x826E, 0x4FF8, 0xD9BA, 0x4FF9, 0x826F, 0x4FFA, 0xB0B3, + 0x4FFB, 0x8270, 0x4FFC, 0x8271, 0x4FFD, 0x8272, 0x4FFE, 0xD9C2, 0x4FFF, 0x8273, 0x5000, 0x8274, 0x5001, 0x8275, 0x5002, 0x8276, + 0x5003, 0x8277, 0x5004, 0x8278, 0x5005, 0x8279, 0x5006, 0x827A, 0x5007, 0x827B, 0x5008, 0x827C, 0x5009, 0x827D, 0x500A, 0x827E, + 0x500B, 0x8280, 0x500C, 0xD9C4, 0x500D, 0xB1B6, 0x500E, 0x8281, 0x500F, 0xD9BF, 0x5010, 0x8282, 0x5011, 0x8283, 0x5012, 0xB5B9, + 0x5013, 0x8284, 0x5014, 0xBEF3, 0x5015, 0x8285, 0x5016, 0x8286, 0x5017, 0x8287, 0x5018, 0xCCC8, 0x5019, 0xBAF2, 0x501A, 0xD2D0, + 0x501B, 0x8288, 0x501C, 0xD9C3, 0x501D, 0x8289, 0x501E, 0x828A, 0x501F, 0xBDE8, 0x5020, 0x828B, 0x5021, 0xB3AB, 0x5022, 0x828C, + 0x5023, 0x828D, 0x5024, 0x828E, 0x5025, 0xD9C5, 0x5026, 0xBEEB, 0x5027, 0x828F, 0x5028, 0xD9C6, 0x5029, 0xD9BB, 0x502A, 0xC4DF, + 0x502B, 0x8290, 0x502C, 0xD9BE, 0x502D, 0xD9C1, 0x502E, 0xD9C0, 0x502F, 0x8291, 0x5030, 0x8292, 0x5031, 0x8293, 0x5032, 0x8294, + 0x5033, 0x8295, 0x5034, 0x8296, 0x5035, 0x8297, 0x5036, 0x8298, 0x5037, 0x8299, 0x5038, 0x829A, 0x5039, 0x829B, 0x503A, 0xD5AE, + 0x503B, 0x829C, 0x503C, 0xD6B5, 0x503D, 0x829D, 0x503E, 0xC7E3, 0x503F, 0x829E, 0x5040, 0x829F, 0x5041, 0x82A0, 0x5042, 0x82A1, + 0x5043, 0xD9C8, 0x5044, 0x82A2, 0x5045, 0x82A3, 0x5046, 0x82A4, 0x5047, 0xBCD9, 0x5048, 0xD9CA, 0x5049, 0x82A5, 0x504A, 0x82A6, + 0x504B, 0x82A7, 0x504C, 0xD9BC, 0x504D, 0x82A8, 0x504E, 0xD9CB, 0x504F, 0xC6AB, 0x5050, 0x82A9, 0x5051, 0x82AA, 0x5052, 0x82AB, + 0x5053, 0x82AC, 0x5054, 0x82AD, 0x5055, 0xD9C9, 0x5056, 0x82AE, 0x5057, 0x82AF, 0x5058, 0x82B0, 0x5059, 0x82B1, 0x505A, 0xD7F6, + 0x505B, 0x82B2, 0x505C, 0xCDA3, 0x505D, 0x82B3, 0x505E, 0x82B4, 0x505F, 0x82B5, 0x5060, 0x82B6, 0x5061, 0x82B7, 0x5062, 0x82B8, + 0x5063, 0x82B9, 0x5064, 0x82BA, 0x5065, 0xBDA1, 0x5066, 0x82BB, 0x5067, 0x82BC, 0x5068, 0x82BD, 0x5069, 0x82BE, 0x506A, 0x82BF, + 0x506B, 0x82C0, 0x506C, 0xD9CC, 0x506D, 0x82C1, 0x506E, 0x82C2, 0x506F, 0x82C3, 0x5070, 0x82C4, 0x5071, 0x82C5, 0x5072, 0x82C6, + 0x5073, 0x82C7, 0x5074, 0x82C8, 0x5075, 0x82C9, 0x5076, 0xC5BC, 0x5077, 0xCDB5, 0x5078, 0x82CA, 0x5079, 0x82CB, 0x507A, 0x82CC, + 0x507B, 0xD9CD, 0x507C, 0x82CD, 0x507D, 0x82CE, 0x507E, 0xD9C7, 0x507F, 0xB3A5, 0x5080, 0xBFFE, 0x5081, 0x82CF, 0x5082, 0x82D0, + 0x5083, 0x82D1, 0x5084, 0x82D2, 0x5085, 0xB8B5, 0x5086, 0x82D3, 0x5087, 0x82D4, 0x5088, 0xC0FC, 0x5089, 0x82D5, 0x508A, 0x82D6, + 0x508B, 0x82D7, 0x508C, 0x82D8, 0x508D, 0xB0F8, 0x508E, 0x82D9, 0x508F, 0x82DA, 0x5090, 0x82DB, 0x5091, 0x82DC, 0x5092, 0x82DD, + 0x5093, 0x82DE, 0x5094, 0x82DF, 0x5095, 0x82E0, 0x5096, 0x82E1, 0x5097, 0x82E2, 0x5098, 0x82E3, 0x5099, 0x82E4, 0x509A, 0x82E5, + 0x509B, 0x82E6, 0x509C, 0x82E7, 0x509D, 0x82E8, 0x509E, 0x82E9, 0x509F, 0x82EA, 0x50A0, 0x82EB, 0x50A1, 0x82EC, 0x50A2, 0x82ED, + 0x50A3, 0xB4F6, 0x50A4, 0x82EE, 0x50A5, 0xD9CE, 0x50A6, 0x82EF, 0x50A7, 0xD9CF, 0x50A8, 0xB4A2, 0x50A9, 0xD9D0, 0x50AA, 0x82F0, + 0x50AB, 0x82F1, 0x50AC, 0xB4DF, 0x50AD, 0x82F2, 0x50AE, 0x82F3, 0x50AF, 0x82F4, 0x50B0, 0x82F5, 0x50B1, 0x82F6, 0x50B2, 0xB0C1, + 0x50B3, 0x82F7, 0x50B4, 0x82F8, 0x50B5, 0x82F9, 0x50B6, 0x82FA, 0x50B7, 0x82FB, 0x50B8, 0x82FC, 0x50B9, 0x82FD, 0x50BA, 0xD9D1, + 0x50BB, 0xC9B5, 0x50BC, 0x82FE, 0x50BD, 0x8340, 0x50BE, 0x8341, 0x50BF, 0x8342, 0x50C0, 0x8343, 0x50C1, 0x8344, 0x50C2, 0x8345, + 0x50C3, 0x8346, 0x50C4, 0x8347, 0x50C5, 0x8348, 0x50C6, 0x8349, 0x50C7, 0x834A, 0x50C8, 0x834B, 0x50C9, 0x834C, 0x50CA, 0x834D, + 0x50CB, 0x834E, 0x50CC, 0x834F, 0x50CD, 0x8350, 0x50CE, 0x8351, 0x50CF, 0xCFF1, 0x50D0, 0x8352, 0x50D1, 0x8353, 0x50D2, 0x8354, + 0x50D3, 0x8355, 0x50D4, 0x8356, 0x50D5, 0x8357, 0x50D6, 0xD9D2, 0x50D7, 0x8358, 0x50D8, 0x8359, 0x50D9, 0x835A, 0x50DA, 0xC1C5, + 0x50DB, 0x835B, 0x50DC, 0x835C, 0x50DD, 0x835D, 0x50DE, 0x835E, 0x50DF, 0x835F, 0x50E0, 0x8360, 0x50E1, 0x8361, 0x50E2, 0x8362, + 0x50E3, 0x8363, 0x50E4, 0x8364, 0x50E5, 0x8365, 0x50E6, 0xD9D6, 0x50E7, 0xC9AE, 0x50E8, 0x8366, 0x50E9, 0x8367, 0x50EA, 0x8368, + 0x50EB, 0x8369, 0x50EC, 0xD9D5, 0x50ED, 0xD9D4, 0x50EE, 0xD9D7, 0x50EF, 0x836A, 0x50F0, 0x836B, 0x50F1, 0x836C, 0x50F2, 0x836D, + 0x50F3, 0xCBDB, 0x50F4, 0x836E, 0x50F5, 0xBDA9, 0x50F6, 0x836F, 0x50F7, 0x8370, 0x50F8, 0x8371, 0x50F9, 0x8372, 0x50FA, 0x8373, + 0x50FB, 0xC6A7, 0x50FC, 0x8374, 0x50FD, 0x8375, 0x50FE, 0x8376, 0x50FF, 0x8377, 0x5100, 0x8378, 0x5101, 0x8379, 0x5102, 0x837A, + 0x5103, 0x837B, 0x5104, 0x837C, 0x5105, 0x837D, 0x5106, 0xD9D3, 0x5107, 0xD9D8, 0x5108, 0x837E, 0x5109, 0x8380, 0x510A, 0x8381, + 0x510B, 0xD9D9, 0x510C, 0x8382, 0x510D, 0x8383, 0x510E, 0x8384, 0x510F, 0x8385, 0x5110, 0x8386, 0x5111, 0x8387, 0x5112, 0xC8E5, + 0x5113, 0x8388, 0x5114, 0x8389, 0x5115, 0x838A, 0x5116, 0x838B, 0x5117, 0x838C, 0x5118, 0x838D, 0x5119, 0x838E, 0x511A, 0x838F, + 0x511B, 0x8390, 0x511C, 0x8391, 0x511D, 0x8392, 0x511E, 0x8393, 0x511F, 0x8394, 0x5120, 0x8395, 0x5121, 0xC0DC, 0x5122, 0x8396, + 0x5123, 0x8397, 0x5124, 0x8398, 0x5125, 0x8399, 0x5126, 0x839A, 0x5127, 0x839B, 0x5128, 0x839C, 0x5129, 0x839D, 0x512A, 0x839E, + 0x512B, 0x839F, 0x512C, 0x83A0, 0x512D, 0x83A1, 0x512E, 0x83A2, 0x512F, 0x83A3, 0x5130, 0x83A4, 0x5131, 0x83A5, 0x5132, 0x83A6, + 0x5133, 0x83A7, 0x5134, 0x83A8, 0x5135, 0x83A9, 0x5136, 0x83AA, 0x5137, 0x83AB, 0x5138, 0x83AC, 0x5139, 0x83AD, 0x513A, 0x83AE, + 0x513B, 0x83AF, 0x513C, 0x83B0, 0x513D, 0x83B1, 0x513E, 0x83B2, 0x513F, 0xB6F9, 0x5140, 0xD8A3, 0x5141, 0xD4CA, 0x5142, 0x83B3, + 0x5143, 0xD4AA, 0x5144, 0xD0D6, 0x5145, 0xB3E4, 0x5146, 0xD5D7, 0x5147, 0x83B4, 0x5148, 0xCFC8, 0x5149, 0xB9E2, 0x514A, 0x83B5, + 0x514B, 0xBFCB, 0x514C, 0x83B6, 0x514D, 0xC3E2, 0x514E, 0x83B7, 0x514F, 0x83B8, 0x5150, 0x83B9, 0x5151, 0xB6D2, 0x5152, 0x83BA, + 0x5153, 0x83BB, 0x5154, 0xCDC3, 0x5155, 0xD9EE, 0x5156, 0xD9F0, 0x5157, 0x83BC, 0x5158, 0x83BD, 0x5159, 0x83BE, 0x515A, 0xB5B3, + 0x515B, 0x83BF, 0x515C, 0xB6B5, 0x515D, 0x83C0, 0x515E, 0x83C1, 0x515F, 0x83C2, 0x5160, 0x83C3, 0x5161, 0x83C4, 0x5162, 0xBEA4, + 0x5163, 0x83C5, 0x5164, 0x83C6, 0x5165, 0xC8EB, 0x5166, 0x83C7, 0x5167, 0x83C8, 0x5168, 0xC8AB, 0x5169, 0x83C9, 0x516A, 0x83CA, + 0x516B, 0xB0CB, 0x516C, 0xB9AB, 0x516D, 0xC1F9, 0x516E, 0xD9E2, 0x516F, 0x83CB, 0x5170, 0xC0BC, 0x5171, 0xB9B2, 0x5172, 0x83CC, + 0x5173, 0xB9D8, 0x5174, 0xD0CB, 0x5175, 0xB1F8, 0x5176, 0xC6E4, 0x5177, 0xBEDF, 0x5178, 0xB5E4, 0x5179, 0xD7C8, 0x517A, 0x83CD, + 0x517B, 0xD1F8, 0x517C, 0xBCE6, 0x517D, 0xCADE, 0x517E, 0x83CE, 0x517F, 0x83CF, 0x5180, 0xBCBD, 0x5181, 0xD9E6, 0x5182, 0xD8E7, + 0x5183, 0x83D0, 0x5184, 0x83D1, 0x5185, 0xC4DA, 0x5186, 0x83D2, 0x5187, 0x83D3, 0x5188, 0xB8D4, 0x5189, 0xC8BD, 0x518A, 0x83D4, + 0x518B, 0x83D5, 0x518C, 0xB2E1, 0x518D, 0xD4D9, 0x518E, 0x83D6, 0x518F, 0x83D7, 0x5190, 0x83D8, 0x5191, 0x83D9, 0x5192, 0xC3B0, + 0x5193, 0x83DA, 0x5194, 0x83DB, 0x5195, 0xC3E1, 0x5196, 0xDAA2, 0x5197, 0xC8DF, 0x5198, 0x83DC, 0x5199, 0xD0B4, 0x519A, 0x83DD, + 0x519B, 0xBEFC, 0x519C, 0xC5A9, 0x519D, 0x83DE, 0x519E, 0x83DF, 0x519F, 0x83E0, 0x51A0, 0xB9DA, 0x51A1, 0x83E1, 0x51A2, 0xDAA3, + 0x51A3, 0x83E2, 0x51A4, 0xD4A9, 0x51A5, 0xDAA4, 0x51A6, 0x83E3, 0x51A7, 0x83E4, 0x51A8, 0x83E5, 0x51A9, 0x83E6, 0x51AA, 0x83E7, + 0x51AB, 0xD9FB, 0x51AC, 0xB6AC, 0x51AD, 0x83E8, 0x51AE, 0x83E9, 0x51AF, 0xB7EB, 0x51B0, 0xB1F9, 0x51B1, 0xD9FC, 0x51B2, 0xB3E5, + 0x51B3, 0xBEF6, 0x51B4, 0x83EA, 0x51B5, 0xBFF6, 0x51B6, 0xD2B1, 0x51B7, 0xC0E4, 0x51B8, 0x83EB, 0x51B9, 0x83EC, 0x51BA, 0x83ED, + 0x51BB, 0xB6B3, 0x51BC, 0xD9FE, 0x51BD, 0xD9FD, 0x51BE, 0x83EE, 0x51BF, 0x83EF, 0x51C0, 0xBEBB, 0x51C1, 0x83F0, 0x51C2, 0x83F1, + 0x51C3, 0x83F2, 0x51C4, 0xC6E0, 0x51C5, 0x83F3, 0x51C6, 0xD7BC, 0x51C7, 0xDAA1, 0x51C8, 0x83F4, 0x51C9, 0xC1B9, 0x51CA, 0x83F5, + 0x51CB, 0xB5F2, 0x51CC, 0xC1E8, 0x51CD, 0x83F6, 0x51CE, 0x83F7, 0x51CF, 0xBCF5, 0x51D0, 0x83F8, 0x51D1, 0xB4D5, 0x51D2, 0x83F9, + 0x51D3, 0x83FA, 0x51D4, 0x83FB, 0x51D5, 0x83FC, 0x51D6, 0x83FD, 0x51D7, 0x83FE, 0x51D8, 0x8440, 0x51D9, 0x8441, 0x51DA, 0x8442, + 0x51DB, 0xC1DD, 0x51DC, 0x8443, 0x51DD, 0xC4FD, 0x51DE, 0x8444, 0x51DF, 0x8445, 0x51E0, 0xBCB8, 0x51E1, 0xB7B2, 0x51E2, 0x8446, + 0x51E3, 0x8447, 0x51E4, 0xB7EF, 0x51E5, 0x8448, 0x51E6, 0x8449, 0x51E7, 0x844A, 0x51E8, 0x844B, 0x51E9, 0x844C, 0x51EA, 0x844D, + 0x51EB, 0xD9EC, 0x51EC, 0x844E, 0x51ED, 0xC6BE, 0x51EE, 0x844F, 0x51EF, 0xBFAD, 0x51F0, 0xBBCB, 0x51F1, 0x8450, 0x51F2, 0x8451, + 0x51F3, 0xB5CA, 0x51F4, 0x8452, 0x51F5, 0xDBC9, 0x51F6, 0xD0D7, 0x51F7, 0x8453, 0x51F8, 0xCDB9, 0x51F9, 0xB0BC, 0x51FA, 0xB3F6, + 0x51FB, 0xBBF7, 0x51FC, 0xDBCA, 0x51FD, 0xBAAF, 0x51FE, 0x8454, 0x51FF, 0xD4E4, 0x5200, 0xB5B6, 0x5201, 0xB5F3, 0x5202, 0xD8D6, + 0x5203, 0xC8D0, 0x5204, 0x8455, 0x5205, 0x8456, 0x5206, 0xB7D6, 0x5207, 0xC7D0, 0x5208, 0xD8D7, 0x5209, 0x8457, 0x520A, 0xBFAF, + 0x520B, 0x8458, 0x520C, 0x8459, 0x520D, 0xDBBB, 0x520E, 0xD8D8, 0x520F, 0x845A, 0x5210, 0x845B, 0x5211, 0xD0CC, 0x5212, 0xBBAE, + 0x5213, 0x845C, 0x5214, 0x845D, 0x5215, 0x845E, 0x5216, 0xEBBE, 0x5217, 0xC1D0, 0x5218, 0xC1F5, 0x5219, 0xD4F2, 0x521A, 0xB8D5, + 0x521B, 0xB4B4, 0x521C, 0x845F, 0x521D, 0xB3F5, 0x521E, 0x8460, 0x521F, 0x8461, 0x5220, 0xC9BE, 0x5221, 0x8462, 0x5222, 0x8463, + 0x5223, 0x8464, 0x5224, 0xC5D0, 0x5225, 0x8465, 0x5226, 0x8466, 0x5227, 0x8467, 0x5228, 0xC5D9, 0x5229, 0xC0FB, 0x522A, 0x8468, + 0x522B, 0xB1F0, 0x522C, 0x8469, 0x522D, 0xD8D9, 0x522E, 0xB9CE, 0x522F, 0x846A, 0x5230, 0xB5BD, 0x5231, 0x846B, 0x5232, 0x846C, + 0x5233, 0xD8DA, 0x5234, 0x846D, 0x5235, 0x846E, 0x5236, 0xD6C6, 0x5237, 0xCBA2, 0x5238, 0xC8AF, 0x5239, 0xC9B2, 0x523A, 0xB4CC, + 0x523B, 0xBFCC, 0x523C, 0x846F, 0x523D, 0xB9F4, 0x523E, 0x8470, 0x523F, 0xD8DB, 0x5240, 0xD8DC, 0x5241, 0xB6E7, 0x5242, 0xBCC1, + 0x5243, 0xCCEA, 0x5244, 0x8471, 0x5245, 0x8472, 0x5246, 0x8473, 0x5247, 0x8474, 0x5248, 0x8475, 0x5249, 0x8476, 0x524A, 0xCFF7, + 0x524B, 0x8477, 0x524C, 0xD8DD, 0x524D, 0xC7B0, 0x524E, 0x8478, 0x524F, 0x8479, 0x5250, 0xB9D0, 0x5251, 0xBDA3, 0x5252, 0x847A, + 0x5253, 0x847B, 0x5254, 0xCCDE, 0x5255, 0x847C, 0x5256, 0xC6CA, 0x5257, 0x847D, 0x5258, 0x847E, 0x5259, 0x8480, 0x525A, 0x8481, + 0x525B, 0x8482, 0x525C, 0xD8E0, 0x525D, 0x8483, 0x525E, 0xD8DE, 0x525F, 0x8484, 0x5260, 0x8485, 0x5261, 0xD8DF, 0x5262, 0x8486, + 0x5263, 0x8487, 0x5264, 0x8488, 0x5265, 0xB0FE, 0x5266, 0x8489, 0x5267, 0xBEE7, 0x5268, 0x848A, 0x5269, 0xCAA3, 0x526A, 0xBCF4, + 0x526B, 0x848B, 0x526C, 0x848C, 0x526D, 0x848D, 0x526E, 0x848E, 0x526F, 0xB8B1, 0x5270, 0x848F, 0x5271, 0x8490, 0x5272, 0xB8EE, + 0x5273, 0x8491, 0x5274, 0x8492, 0x5275, 0x8493, 0x5276, 0x8494, 0x5277, 0x8495, 0x5278, 0x8496, 0x5279, 0x8497, 0x527A, 0x8498, + 0x527B, 0x8499, 0x527C, 0x849A, 0x527D, 0xD8E2, 0x527E, 0x849B, 0x527F, 0xBDCB, 0x5280, 0x849C, 0x5281, 0xD8E4, 0x5282, 0xD8E3, + 0x5283, 0x849D, 0x5284, 0x849E, 0x5285, 0x849F, 0x5286, 0x84A0, 0x5287, 0x84A1, 0x5288, 0xC5FC, 0x5289, 0x84A2, 0x528A, 0x84A3, + 0x528B, 0x84A4, 0x528C, 0x84A5, 0x528D, 0x84A6, 0x528E, 0x84A7, 0x528F, 0x84A8, 0x5290, 0xD8E5, 0x5291, 0x84A9, 0x5292, 0x84AA, + 0x5293, 0xD8E6, 0x5294, 0x84AB, 0x5295, 0x84AC, 0x5296, 0x84AD, 0x5297, 0x84AE, 0x5298, 0x84AF, 0x5299, 0x84B0, 0x529A, 0x84B1, + 0x529B, 0xC1A6, 0x529C, 0x84B2, 0x529D, 0xC8B0, 0x529E, 0xB0EC, 0x529F, 0xB9A6, 0x52A0, 0xBCD3, 0x52A1, 0xCEF1, 0x52A2, 0xDBBD, + 0x52A3, 0xC1D3, 0x52A4, 0x84B3, 0x52A5, 0x84B4, 0x52A6, 0x84B5, 0x52A7, 0x84B6, 0x52A8, 0xB6AF, 0x52A9, 0xD6FA, 0x52AA, 0xC5AC, + 0x52AB, 0xBDD9, 0x52AC, 0xDBBE, 0x52AD, 0xDBBF, 0x52AE, 0x84B7, 0x52AF, 0x84B8, 0x52B0, 0x84B9, 0x52B1, 0xC0F8, 0x52B2, 0xBEA2, + 0x52B3, 0xC0CD, 0x52B4, 0x84BA, 0x52B5, 0x84BB, 0x52B6, 0x84BC, 0x52B7, 0x84BD, 0x52B8, 0x84BE, 0x52B9, 0x84BF, 0x52BA, 0x84C0, + 0x52BB, 0x84C1, 0x52BC, 0x84C2, 0x52BD, 0x84C3, 0x52BE, 0xDBC0, 0x52BF, 0xCAC6, 0x52C0, 0x84C4, 0x52C1, 0x84C5, 0x52C2, 0x84C6, + 0x52C3, 0xB2AA, 0x52C4, 0x84C7, 0x52C5, 0x84C8, 0x52C6, 0x84C9, 0x52C7, 0xD3C2, 0x52C8, 0x84CA, 0x52C9, 0xC3E3, 0x52CA, 0x84CB, + 0x52CB, 0xD1AB, 0x52CC, 0x84CC, 0x52CD, 0x84CD, 0x52CE, 0x84CE, 0x52CF, 0x84CF, 0x52D0, 0xDBC2, 0x52D1, 0x84D0, 0x52D2, 0xC0D5, + 0x52D3, 0x84D1, 0x52D4, 0x84D2, 0x52D5, 0x84D3, 0x52D6, 0xDBC3, 0x52D7, 0x84D4, 0x52D8, 0xBFB1, 0x52D9, 0x84D5, 0x52DA, 0x84D6, + 0x52DB, 0x84D7, 0x52DC, 0x84D8, 0x52DD, 0x84D9, 0x52DE, 0x84DA, 0x52DF, 0xC4BC, 0x52E0, 0x84DB, 0x52E1, 0x84DC, 0x52E2, 0x84DD, + 0x52E3, 0x84DE, 0x52E4, 0xC7DA, 0x52E5, 0x84DF, 0x52E6, 0x84E0, 0x52E7, 0x84E1, 0x52E8, 0x84E2, 0x52E9, 0x84E3, 0x52EA, 0x84E4, + 0x52EB, 0x84E5, 0x52EC, 0x84E6, 0x52ED, 0x84E7, 0x52EE, 0x84E8, 0x52EF, 0x84E9, 0x52F0, 0xDBC4, 0x52F1, 0x84EA, 0x52F2, 0x84EB, + 0x52F3, 0x84EC, 0x52F4, 0x84ED, 0x52F5, 0x84EE, 0x52F6, 0x84EF, 0x52F7, 0x84F0, 0x52F8, 0x84F1, 0x52F9, 0xD9E8, 0x52FA, 0xC9D7, + 0x52FB, 0x84F2, 0x52FC, 0x84F3, 0x52FD, 0x84F4, 0x52FE, 0xB9B4, 0x52FF, 0xCEF0, 0x5300, 0xD4C8, 0x5301, 0x84F5, 0x5302, 0x84F6, + 0x5303, 0x84F7, 0x5304, 0x84F8, 0x5305, 0xB0FC, 0x5306, 0xB4D2, 0x5307, 0x84F9, 0x5308, 0xD0D9, 0x5309, 0x84FA, 0x530A, 0x84FB, + 0x530B, 0x84FC, 0x530C, 0x84FD, 0x530D, 0xD9E9, 0x530E, 0x84FE, 0x530F, 0xDECB, 0x5310, 0xD9EB, 0x5311, 0x8540, 0x5312, 0x8541, + 0x5313, 0x8542, 0x5314, 0x8543, 0x5315, 0xD8B0, 0x5316, 0xBBAF, 0x5317, 0xB1B1, 0x5318, 0x8544, 0x5319, 0xB3D7, 0x531A, 0xD8CE, + 0x531B, 0x8545, 0x531C, 0x8546, 0x531D, 0xD4D1, 0x531E, 0x8547, 0x531F, 0x8548, 0x5320, 0xBDB3, 0x5321, 0xBFEF, 0x5322, 0x8549, + 0x5323, 0xCFBB, 0x5324, 0x854A, 0x5325, 0x854B, 0x5326, 0xD8D0, 0x5327, 0x854C, 0x5328, 0x854D, 0x5329, 0x854E, 0x532A, 0xB7CB, + 0x532B, 0x854F, 0x532C, 0x8550, 0x532D, 0x8551, 0x532E, 0xD8D1, 0x532F, 0x8552, 0x5330, 0x8553, 0x5331, 0x8554, 0x5332, 0x8555, + 0x5333, 0x8556, 0x5334, 0x8557, 0x5335, 0x8558, 0x5336, 0x8559, 0x5337, 0x855A, 0x5338, 0x855B, 0x5339, 0xC6A5, 0x533A, 0xC7F8, + 0x533B, 0xD2BD, 0x533C, 0x855C, 0x533D, 0x855D, 0x533E, 0xD8D2, 0x533F, 0xC4E4, 0x5340, 0x855E, 0x5341, 0xCAAE, 0x5342, 0x855F, + 0x5343, 0xC7A7, 0x5344, 0x8560, 0x5345, 0xD8A6, 0x5346, 0x8561, 0x5347, 0xC9FD, 0x5348, 0xCEE7, 0x5349, 0xBBDC, 0x534A, 0xB0EB, + 0x534B, 0x8562, 0x534C, 0x8563, 0x534D, 0x8564, 0x534E, 0xBBAA, 0x534F, 0xD0AD, 0x5350, 0x8565, 0x5351, 0xB1B0, 0x5352, 0xD7E4, + 0x5353, 0xD7BF, 0x5354, 0x8566, 0x5355, 0xB5A5, 0x5356, 0xC2F4, 0x5357, 0xC4CF, 0x5358, 0x8567, 0x5359, 0x8568, 0x535A, 0xB2A9, + 0x535B, 0x8569, 0x535C, 0xB2B7, 0x535D, 0x856A, 0x535E, 0xB1E5, 0x535F, 0xDFB2, 0x5360, 0xD5BC, 0x5361, 0xBFA8, 0x5362, 0xC2AC, + 0x5363, 0xD8D5, 0x5364, 0xC2B1, 0x5365, 0x856B, 0x5366, 0xD8D4, 0x5367, 0xCED4, 0x5368, 0x856C, 0x5369, 0xDAE0, 0x536A, 0x856D, + 0x536B, 0xCEC0, 0x536C, 0x856E, 0x536D, 0x856F, 0x536E, 0xD8B4, 0x536F, 0xC3AE, 0x5370, 0xD3A1, 0x5371, 0xCEA3, 0x5372, 0x8570, + 0x5373, 0xBCB4, 0x5374, 0xC8B4, 0x5375, 0xC2D1, 0x5376, 0x8571, 0x5377, 0xBEED, 0x5378, 0xD0B6, 0x5379, 0x8572, 0x537A, 0xDAE1, + 0x537B, 0x8573, 0x537C, 0x8574, 0x537D, 0x8575, 0x537E, 0x8576, 0x537F, 0xC7E4, 0x5380, 0x8577, 0x5381, 0x8578, 0x5382, 0xB3A7, + 0x5383, 0x8579, 0x5384, 0xB6F2, 0x5385, 0xCCFC, 0x5386, 0xC0FA, 0x5387, 0x857A, 0x5388, 0x857B, 0x5389, 0xC0F7, 0x538A, 0x857C, + 0x538B, 0xD1B9, 0x538C, 0xD1E1, 0x538D, 0xD8C7, 0x538E, 0x857D, 0x538F, 0x857E, 0x5390, 0x8580, 0x5391, 0x8581, 0x5392, 0x8582, + 0x5393, 0x8583, 0x5394, 0x8584, 0x5395, 0xB2DE, 0x5396, 0x8585, 0x5397, 0x8586, 0x5398, 0xC0E5, 0x5399, 0x8587, 0x539A, 0xBAF1, + 0x539B, 0x8588, 0x539C, 0x8589, 0x539D, 0xD8C8, 0x539E, 0x858A, 0x539F, 0xD4AD, 0x53A0, 0x858B, 0x53A1, 0x858C, 0x53A2, 0xCFE1, + 0x53A3, 0xD8C9, 0x53A4, 0x858D, 0x53A5, 0xD8CA, 0x53A6, 0xCFC3, 0x53A7, 0x858E, 0x53A8, 0xB3F8, 0x53A9, 0xBEC7, 0x53AA, 0x858F, + 0x53AB, 0x8590, 0x53AC, 0x8591, 0x53AD, 0x8592, 0x53AE, 0xD8CB, 0x53AF, 0x8593, 0x53B0, 0x8594, 0x53B1, 0x8595, 0x53B2, 0x8596, + 0x53B3, 0x8597, 0x53B4, 0x8598, 0x53B5, 0x8599, 0x53B6, 0xDBCC, 0x53B7, 0x859A, 0x53B8, 0x859B, 0x53B9, 0x859C, 0x53BA, 0x859D, + 0x53BB, 0xC8A5, 0x53BC, 0x859E, 0x53BD, 0x859F, 0x53BE, 0x85A0, 0x53BF, 0xCFD8, 0x53C0, 0x85A1, 0x53C1, 0xC8FE, 0x53C2, 0xB2CE, + 0x53C3, 0x85A2, 0x53C4, 0x85A3, 0x53C5, 0x85A4, 0x53C6, 0x85A5, 0x53C7, 0x85A6, 0x53C8, 0xD3D6, 0x53C9, 0xB2E6, 0x53CA, 0xBCB0, + 0x53CB, 0xD3D1, 0x53CC, 0xCBAB, 0x53CD, 0xB7B4, 0x53CE, 0x85A7, 0x53CF, 0x85A8, 0x53D0, 0x85A9, 0x53D1, 0xB7A2, 0x53D2, 0x85AA, + 0x53D3, 0x85AB, 0x53D4, 0xCAE5, 0x53D5, 0x85AC, 0x53D6, 0xC8A1, 0x53D7, 0xCADC, 0x53D8, 0xB1E4, 0x53D9, 0xD0F0, 0x53DA, 0x85AD, + 0x53DB, 0xC5D1, 0x53DC, 0x85AE, 0x53DD, 0x85AF, 0x53DE, 0x85B0, 0x53DF, 0xDBC5, 0x53E0, 0xB5FE, 0x53E1, 0x85B1, 0x53E2, 0x85B2, + 0x53E3, 0xBFDA, 0x53E4, 0xB9C5, 0x53E5, 0xBEE4, 0x53E6, 0xC1ED, 0x53E7, 0x85B3, 0x53E8, 0xDFB6, 0x53E9, 0xDFB5, 0x53EA, 0xD6BB, + 0x53EB, 0xBDD0, 0x53EC, 0xD5D9, 0x53ED, 0xB0C8, 0x53EE, 0xB6A3, 0x53EF, 0xBFC9, 0x53F0, 0xCCA8, 0x53F1, 0xDFB3, 0x53F2, 0xCAB7, + 0x53F3, 0xD3D2, 0x53F4, 0x85B4, 0x53F5, 0xD8CF, 0x53F6, 0xD2B6, 0x53F7, 0xBAC5, 0x53F8, 0xCBBE, 0x53F9, 0xCCBE, 0x53FA, 0x85B5, + 0x53FB, 0xDFB7, 0x53FC, 0xB5F0, 0x53FD, 0xDFB4, 0x53FE, 0x85B6, 0x53FF, 0x85B7, 0x5400, 0x85B8, 0x5401, 0xD3F5, 0x5402, 0x85B9, + 0x5403, 0xB3D4, 0x5404, 0xB8F7, 0x5405, 0x85BA, 0x5406, 0xDFBA, 0x5407, 0x85BB, 0x5408, 0xBACF, 0x5409, 0xBCAA, 0x540A, 0xB5F5, + 0x540B, 0x85BC, 0x540C, 0xCDAC, 0x540D, 0xC3FB, 0x540E, 0xBAF3, 0x540F, 0xC0F4, 0x5410, 0xCDC2, 0x5411, 0xCFF2, 0x5412, 0xDFB8, + 0x5413, 0xCFC5, 0x5414, 0x85BD, 0x5415, 0xC2C0, 0x5416, 0xDFB9, 0x5417, 0xC2F0, 0x5418, 0x85BE, 0x5419, 0x85BF, 0x541A, 0x85C0, + 0x541B, 0xBEFD, 0x541C, 0x85C1, 0x541D, 0xC1DF, 0x541E, 0xCDCC, 0x541F, 0xD2F7, 0x5420, 0xB7CD, 0x5421, 0xDFC1, 0x5422, 0x85C2, + 0x5423, 0xDFC4, 0x5424, 0x85C3, 0x5425, 0x85C4, 0x5426, 0xB7F1, 0x5427, 0xB0C9, 0x5428, 0xB6D6, 0x5429, 0xB7D4, 0x542A, 0x85C5, + 0x542B, 0xBAAC, 0x542C, 0xCCFD, 0x542D, 0xBFD4, 0x542E, 0xCBB1, 0x542F, 0xC6F4, 0x5430, 0x85C6, 0x5431, 0xD6A8, 0x5432, 0xDFC5, + 0x5433, 0x85C7, 0x5434, 0xCEE2, 0x5435, 0xB3B3, 0x5436, 0x85C8, 0x5437, 0x85C9, 0x5438, 0xCEFC, 0x5439, 0xB4B5, 0x543A, 0x85CA, + 0x543B, 0xCEC7, 0x543C, 0xBAF0, 0x543D, 0x85CB, 0x543E, 0xCEE1, 0x543F, 0x85CC, 0x5440, 0xD1BD, 0x5441, 0x85CD, 0x5442, 0x85CE, + 0x5443, 0xDFC0, 0x5444, 0x85CF, 0x5445, 0x85D0, 0x5446, 0xB4F4, 0x5447, 0x85D1, 0x5448, 0xB3CA, 0x5449, 0x85D2, 0x544A, 0xB8E6, + 0x544B, 0xDFBB, 0x544C, 0x85D3, 0x544D, 0x85D4, 0x544E, 0x85D5, 0x544F, 0x85D6, 0x5450, 0xC4C5, 0x5451, 0x85D7, 0x5452, 0xDFBC, + 0x5453, 0xDFBD, 0x5454, 0xDFBE, 0x5455, 0xC5BB, 0x5456, 0xDFBF, 0x5457, 0xDFC2, 0x5458, 0xD4B1, 0x5459, 0xDFC3, 0x545A, 0x85D8, + 0x545B, 0xC7BA, 0x545C, 0xCED8, 0x545D, 0x85D9, 0x545E, 0x85DA, 0x545F, 0x85DB, 0x5460, 0x85DC, 0x5461, 0x85DD, 0x5462, 0xC4D8, + 0x5463, 0x85DE, 0x5464, 0xDFCA, 0x5465, 0x85DF, 0x5466, 0xDFCF, 0x5467, 0x85E0, 0x5468, 0xD6DC, 0x5469, 0x85E1, 0x546A, 0x85E2, + 0x546B, 0x85E3, 0x546C, 0x85E4, 0x546D, 0x85E5, 0x546E, 0x85E6, 0x546F, 0x85E7, 0x5470, 0x85E8, 0x5471, 0xDFC9, 0x5472, 0xDFDA, + 0x5473, 0xCEB6, 0x5474, 0x85E9, 0x5475, 0xBAC7, 0x5476, 0xDFCE, 0x5477, 0xDFC8, 0x5478, 0xC5DE, 0x5479, 0x85EA, 0x547A, 0x85EB, + 0x547B, 0xC9EB, 0x547C, 0xBAF4, 0x547D, 0xC3FC, 0x547E, 0x85EC, 0x547F, 0x85ED, 0x5480, 0xBED7, 0x5481, 0x85EE, 0x5482, 0xDFC6, + 0x5483, 0x85EF, 0x5484, 0xDFCD, 0x5485, 0x85F0, 0x5486, 0xC5D8, 0x5487, 0x85F1, 0x5488, 0x85F2, 0x5489, 0x85F3, 0x548A, 0x85F4, + 0x548B, 0xD5A6, 0x548C, 0xBACD, 0x548D, 0x85F5, 0x548E, 0xBECC, 0x548F, 0xD3BD, 0x5490, 0xB8C0, 0x5491, 0x85F6, 0x5492, 0xD6E4, + 0x5493, 0x85F7, 0x5494, 0xDFC7, 0x5495, 0xB9BE, 0x5496, 0xBFA7, 0x5497, 0x85F8, 0x5498, 0x85F9, 0x5499, 0xC1FC, 0x549A, 0xDFCB, + 0x549B, 0xDFCC, 0x549C, 0x85FA, 0x549D, 0xDFD0, 0x549E, 0x85FB, 0x549F, 0x85FC, 0x54A0, 0x85FD, 0x54A1, 0x85FE, 0x54A2, 0x8640, + 0x54A3, 0xDFDB, 0x54A4, 0xDFE5, 0x54A5, 0x8641, 0x54A6, 0xDFD7, 0x54A7, 0xDFD6, 0x54A8, 0xD7C9, 0x54A9, 0xDFE3, 0x54AA, 0xDFE4, + 0x54AB, 0xE5EB, 0x54AC, 0xD2A7, 0x54AD, 0xDFD2, 0x54AE, 0x8642, 0x54AF, 0xBFA9, 0x54B0, 0x8643, 0x54B1, 0xD4DB, 0x54B2, 0x8644, + 0x54B3, 0xBFC8, 0x54B4, 0xDFD4, 0x54B5, 0x8645, 0x54B6, 0x8646, 0x54B7, 0x8647, 0x54B8, 0xCFCC, 0x54B9, 0x8648, 0x54BA, 0x8649, + 0x54BB, 0xDFDD, 0x54BC, 0x864A, 0x54BD, 0xD1CA, 0x54BE, 0x864B, 0x54BF, 0xDFDE, 0x54C0, 0xB0A7, 0x54C1, 0xC6B7, 0x54C2, 0xDFD3, + 0x54C3, 0x864C, 0x54C4, 0xBAE5, 0x54C5, 0x864D, 0x54C6, 0xB6DF, 0x54C7, 0xCDDB, 0x54C8, 0xB9FE, 0x54C9, 0xD4D5, 0x54CA, 0x864E, + 0x54CB, 0x864F, 0x54CC, 0xDFDF, 0x54CD, 0xCFEC, 0x54CE, 0xB0A5, 0x54CF, 0xDFE7, 0x54D0, 0xDFD1, 0x54D1, 0xD1C6, 0x54D2, 0xDFD5, + 0x54D3, 0xDFD8, 0x54D4, 0xDFD9, 0x54D5, 0xDFDC, 0x54D6, 0x8650, 0x54D7, 0xBBA9, 0x54D8, 0x8651, 0x54D9, 0xDFE0, 0x54DA, 0xDFE1, + 0x54DB, 0x8652, 0x54DC, 0xDFE2, 0x54DD, 0xDFE6, 0x54DE, 0xDFE8, 0x54DF, 0xD3B4, 0x54E0, 0x8653, 0x54E1, 0x8654, 0x54E2, 0x8655, + 0x54E3, 0x8656, 0x54E4, 0x8657, 0x54E5, 0xB8E7, 0x54E6, 0xC5B6, 0x54E7, 0xDFEA, 0x54E8, 0xC9DA, 0x54E9, 0xC1A8, 0x54EA, 0xC4C4, + 0x54EB, 0x8658, 0x54EC, 0x8659, 0x54ED, 0xBFDE, 0x54EE, 0xCFF8, 0x54EF, 0x865A, 0x54F0, 0x865B, 0x54F1, 0x865C, 0x54F2, 0xD5DC, + 0x54F3, 0xDFEE, 0x54F4, 0x865D, 0x54F5, 0x865E, 0x54F6, 0x865F, 0x54F7, 0x8660, 0x54F8, 0x8661, 0x54F9, 0x8662, 0x54FA, 0xB2B8, + 0x54FB, 0x8663, 0x54FC, 0xBADF, 0x54FD, 0xDFEC, 0x54FE, 0x8664, 0x54FF, 0xDBC1, 0x5500, 0x8665, 0x5501, 0xD1E4, 0x5502, 0x8666, + 0x5503, 0x8667, 0x5504, 0x8668, 0x5505, 0x8669, 0x5506, 0xCBF4, 0x5507, 0xB4BD, 0x5508, 0x866A, 0x5509, 0xB0A6, 0x550A, 0x866B, + 0x550B, 0x866C, 0x550C, 0x866D, 0x550D, 0x866E, 0x550E, 0x866F, 0x550F, 0xDFF1, 0x5510, 0xCCC6, 0x5511, 0xDFF2, 0x5512, 0x8670, + 0x5513, 0x8671, 0x5514, 0xDFED, 0x5515, 0x8672, 0x5516, 0x8673, 0x5517, 0x8674, 0x5518, 0x8675, 0x5519, 0x8676, 0x551A, 0x8677, + 0x551B, 0xDFE9, 0x551C, 0x8678, 0x551D, 0x8679, 0x551E, 0x867A, 0x551F, 0x867B, 0x5520, 0xDFEB, 0x5521, 0x867C, 0x5522, 0xDFEF, + 0x5523, 0xDFF0, 0x5524, 0xBBBD, 0x5525, 0x867D, 0x5526, 0x867E, 0x5527, 0xDFF3, 0x5528, 0x8680, 0x5529, 0x8681, 0x552A, 0xDFF4, + 0x552B, 0x8682, 0x552C, 0xBBA3, 0x552D, 0x8683, 0x552E, 0xCADB, 0x552F, 0xCEA8, 0x5530, 0xE0A7, 0x5531, 0xB3AA, 0x5532, 0x8684, + 0x5533, 0xE0A6, 0x5534, 0x8685, 0x5535, 0x8686, 0x5536, 0x8687, 0x5537, 0xE0A1, 0x5538, 0x8688, 0x5539, 0x8689, 0x553A, 0x868A, + 0x553B, 0x868B, 0x553C, 0xDFFE, 0x553D, 0x868C, 0x553E, 0xCDD9, 0x553F, 0xDFFC, 0x5540, 0x868D, 0x5541, 0xDFFA, 0x5542, 0x868E, + 0x5543, 0xBFD0, 0x5544, 0xD7C4, 0x5545, 0x868F, 0x5546, 0xC9CC, 0x5547, 0x8690, 0x5548, 0x8691, 0x5549, 0xDFF8, 0x554A, 0xB0A1, + 0x554B, 0x8692, 0x554C, 0x8693, 0x554D, 0x8694, 0x554E, 0x8695, 0x554F, 0x8696, 0x5550, 0xDFFD, 0x5551, 0x8697, 0x5552, 0x8698, + 0x5553, 0x8699, 0x5554, 0x869A, 0x5555, 0xDFFB, 0x5556, 0xE0A2, 0x5557, 0x869B, 0x5558, 0x869C, 0x5559, 0x869D, 0x555A, 0x869E, + 0x555B, 0x869F, 0x555C, 0xE0A8, 0x555D, 0x86A0, 0x555E, 0x86A1, 0x555F, 0x86A2, 0x5560, 0x86A3, 0x5561, 0xB7C8, 0x5562, 0x86A4, + 0x5563, 0x86A5, 0x5564, 0xC6A1, 0x5565, 0xC9B6, 0x5566, 0xC0B2, 0x5567, 0xDFF5, 0x5568, 0x86A6, 0x5569, 0x86A7, 0x556A, 0xC5BE, + 0x556B, 0x86A8, 0x556C, 0xD8C4, 0x556D, 0xDFF9, 0x556E, 0xC4F6, 0x556F, 0x86A9, 0x5570, 0x86AA, 0x5571, 0x86AB, 0x5572, 0x86AC, + 0x5573, 0x86AD, 0x5574, 0x86AE, 0x5575, 0xE0A3, 0x5576, 0xE0A4, 0x5577, 0xE0A5, 0x5578, 0xD0A5, 0x5579, 0x86AF, 0x557A, 0x86B0, + 0x557B, 0xE0B4, 0x557C, 0xCCE4, 0x557D, 0x86B1, 0x557E, 0xE0B1, 0x557F, 0x86B2, 0x5580, 0xBFA6, 0x5581, 0xE0AF, 0x5582, 0xCEB9, + 0x5583, 0xE0AB, 0x5584, 0xC9C6, 0x5585, 0x86B3, 0x5586, 0x86B4, 0x5587, 0xC0AE, 0x5588, 0xE0AE, 0x5589, 0xBAED, 0x558A, 0xBAB0, + 0x558B, 0xE0A9, 0x558C, 0x86B5, 0x558D, 0x86B6, 0x558E, 0x86B7, 0x558F, 0xDFF6, 0x5590, 0x86B8, 0x5591, 0xE0B3, 0x5592, 0x86B9, + 0x5593, 0x86BA, 0x5594, 0xE0B8, 0x5595, 0x86BB, 0x5596, 0x86BC, 0x5597, 0x86BD, 0x5598, 0xB4AD, 0x5599, 0xE0B9, 0x559A, 0x86BE, + 0x559B, 0x86BF, 0x559C, 0xCFB2, 0x559D, 0xBAC8, 0x559E, 0x86C0, 0x559F, 0xE0B0, 0x55A0, 0x86C1, 0x55A1, 0x86C2, 0x55A2, 0x86C3, + 0x55A3, 0x86C4, 0x55A4, 0x86C5, 0x55A5, 0x86C6, 0x55A6, 0x86C7, 0x55A7, 0xD0FA, 0x55A8, 0x86C8, 0x55A9, 0x86C9, 0x55AA, 0x86CA, + 0x55AB, 0x86CB, 0x55AC, 0x86CC, 0x55AD, 0x86CD, 0x55AE, 0x86CE, 0x55AF, 0x86CF, 0x55B0, 0x86D0, 0x55B1, 0xE0AC, 0x55B2, 0x86D1, + 0x55B3, 0xD4FB, 0x55B4, 0x86D2, 0x55B5, 0xDFF7, 0x55B6, 0x86D3, 0x55B7, 0xC5E7, 0x55B8, 0x86D4, 0x55B9, 0xE0AD, 0x55BA, 0x86D5, + 0x55BB, 0xD3F7, 0x55BC, 0x86D6, 0x55BD, 0xE0B6, 0x55BE, 0xE0B7, 0x55BF, 0x86D7, 0x55C0, 0x86D8, 0x55C1, 0x86D9, 0x55C2, 0x86DA, + 0x55C3, 0x86DB, 0x55C4, 0xE0C4, 0x55C5, 0xD0E1, 0x55C6, 0x86DC, 0x55C7, 0x86DD, 0x55C8, 0x86DE, 0x55C9, 0xE0BC, 0x55CA, 0x86DF, + 0x55CB, 0x86E0, 0x55CC, 0xE0C9, 0x55CD, 0xE0CA, 0x55CE, 0x86E1, 0x55CF, 0x86E2, 0x55D0, 0x86E3, 0x55D1, 0xE0BE, 0x55D2, 0xE0AA, + 0x55D3, 0xC9A4, 0x55D4, 0xE0C1, 0x55D5, 0x86E4, 0x55D6, 0xE0B2, 0x55D7, 0x86E5, 0x55D8, 0x86E6, 0x55D9, 0x86E7, 0x55DA, 0x86E8, + 0x55DB, 0x86E9, 0x55DC, 0xCAC8, 0x55DD, 0xE0C3, 0x55DE, 0x86EA, 0x55DF, 0xE0B5, 0x55E0, 0x86EB, 0x55E1, 0xCECB, 0x55E2, 0x86EC, + 0x55E3, 0xCBC3, 0x55E4, 0xE0CD, 0x55E5, 0xE0C6, 0x55E6, 0xE0C2, 0x55E7, 0x86ED, 0x55E8, 0xE0CB, 0x55E9, 0x86EE, 0x55EA, 0xE0BA, + 0x55EB, 0xE0BF, 0x55EC, 0xE0C0, 0x55ED, 0x86EF, 0x55EE, 0x86F0, 0x55EF, 0xE0C5, 0x55F0, 0x86F1, 0x55F1, 0x86F2, 0x55F2, 0xE0C7, + 0x55F3, 0xE0C8, 0x55F4, 0x86F3, 0x55F5, 0xE0CC, 0x55F6, 0x86F4, 0x55F7, 0xE0BB, 0x55F8, 0x86F5, 0x55F9, 0x86F6, 0x55FA, 0x86F7, + 0x55FB, 0x86F8, 0x55FC, 0x86F9, 0x55FD, 0xCBD4, 0x55FE, 0xE0D5, 0x55FF, 0x86FA, 0x5600, 0xE0D6, 0x5601, 0xE0D2, 0x5602, 0x86FB, + 0x5603, 0x86FC, 0x5604, 0x86FD, 0x5605, 0x86FE, 0x5606, 0x8740, 0x5607, 0x8741, 0x5608, 0xE0D0, 0x5609, 0xBCCE, 0x560A, 0x8742, + 0x560B, 0x8743, 0x560C, 0xE0D1, 0x560D, 0x8744, 0x560E, 0xB8C2, 0x560F, 0xD8C5, 0x5610, 0x8745, 0x5611, 0x8746, 0x5612, 0x8747, + 0x5613, 0x8748, 0x5614, 0x8749, 0x5615, 0x874A, 0x5616, 0x874B, 0x5617, 0x874C, 0x5618, 0xD0EA, 0x5619, 0x874D, 0x561A, 0x874E, + 0x561B, 0xC2EF, 0x561C, 0x874F, 0x561D, 0x8750, 0x561E, 0xE0CF, 0x561F, 0xE0BD, 0x5620, 0x8751, 0x5621, 0x8752, 0x5622, 0x8753, + 0x5623, 0xE0D4, 0x5624, 0xE0D3, 0x5625, 0x8754, 0x5626, 0x8755, 0x5627, 0xE0D7, 0x5628, 0x8756, 0x5629, 0x8757, 0x562A, 0x8758, + 0x562B, 0x8759, 0x562C, 0xE0DC, 0x562D, 0xE0D8, 0x562E, 0x875A, 0x562F, 0x875B, 0x5630, 0x875C, 0x5631, 0xD6F6, 0x5632, 0xB3B0, + 0x5633, 0x875D, 0x5634, 0xD7EC, 0x5635, 0x875E, 0x5636, 0xCBBB, 0x5637, 0x875F, 0x5638, 0x8760, 0x5639, 0xE0DA, 0x563A, 0x8761, + 0x563B, 0xCEFB, 0x563C, 0x8762, 0x563D, 0x8763, 0x563E, 0x8764, 0x563F, 0xBAD9, 0x5640, 0x8765, 0x5641, 0x8766, 0x5642, 0x8767, + 0x5643, 0x8768, 0x5644, 0x8769, 0x5645, 0x876A, 0x5646, 0x876B, 0x5647, 0x876C, 0x5648, 0x876D, 0x5649, 0x876E, 0x564A, 0x876F, + 0x564B, 0x8770, 0x564C, 0xE0E1, 0x564D, 0xE0DD, 0x564E, 0xD2AD, 0x564F, 0x8771, 0x5650, 0x8772, 0x5651, 0x8773, 0x5652, 0x8774, + 0x5653, 0x8775, 0x5654, 0xE0E2, 0x5655, 0x8776, 0x5656, 0x8777, 0x5657, 0xE0DB, 0x5658, 0xE0D9, 0x5659, 0xE0DF, 0x565A, 0x8778, + 0x565B, 0x8779, 0x565C, 0xE0E0, 0x565D, 0x877A, 0x565E, 0x877B, 0x565F, 0x877C, 0x5660, 0x877D, 0x5661, 0x877E, 0x5662, 0xE0DE, + 0x5663, 0x8780, 0x5664, 0xE0E4, 0x5665, 0x8781, 0x5666, 0x8782, 0x5667, 0x8783, 0x5668, 0xC6F7, 0x5669, 0xD8AC, 0x566A, 0xD4EB, + 0x566B, 0xE0E6, 0x566C, 0xCAC9, 0x566D, 0x8784, 0x566E, 0x8785, 0x566F, 0x8786, 0x5670, 0x8787, 0x5671, 0xE0E5, 0x5672, 0x8788, + 0x5673, 0x8789, 0x5674, 0x878A, 0x5675, 0x878B, 0x5676, 0xB8C1, 0x5677, 0x878C, 0x5678, 0x878D, 0x5679, 0x878E, 0x567A, 0x878F, + 0x567B, 0xE0E7, 0x567C, 0xE0E8, 0x567D, 0x8790, 0x567E, 0x8791, 0x567F, 0x8792, 0x5680, 0x8793, 0x5681, 0x8794, 0x5682, 0x8795, + 0x5683, 0x8796, 0x5684, 0x8797, 0x5685, 0xE0E9, 0x5686, 0xE0E3, 0x5687, 0x8798, 0x5688, 0x8799, 0x5689, 0x879A, 0x568A, 0x879B, + 0x568B, 0x879C, 0x568C, 0x879D, 0x568D, 0x879E, 0x568E, 0xBABF, 0x568F, 0xCCE7, 0x5690, 0x879F, 0x5691, 0x87A0, 0x5692, 0x87A1, + 0x5693, 0xE0EA, 0x5694, 0x87A2, 0x5695, 0x87A3, 0x5696, 0x87A4, 0x5697, 0x87A5, 0x5698, 0x87A6, 0x5699, 0x87A7, 0x569A, 0x87A8, + 0x569B, 0x87A9, 0x569C, 0x87AA, 0x569D, 0x87AB, 0x569E, 0x87AC, 0x569F, 0x87AD, 0x56A0, 0x87AE, 0x56A1, 0x87AF, 0x56A2, 0x87B0, + 0x56A3, 0xCFF9, 0x56A4, 0x87B1, 0x56A5, 0x87B2, 0x56A6, 0x87B3, 0x56A7, 0x87B4, 0x56A8, 0x87B5, 0x56A9, 0x87B6, 0x56AA, 0x87B7, + 0x56AB, 0x87B8, 0x56AC, 0x87B9, 0x56AD, 0x87BA, 0x56AE, 0x87BB, 0x56AF, 0xE0EB, 0x56B0, 0x87BC, 0x56B1, 0x87BD, 0x56B2, 0x87BE, + 0x56B3, 0x87BF, 0x56B4, 0x87C0, 0x56B5, 0x87C1, 0x56B6, 0x87C2, 0x56B7, 0xC8C2, 0x56B8, 0x87C3, 0x56B9, 0x87C4, 0x56BA, 0x87C5, + 0x56BB, 0x87C6, 0x56BC, 0xBDC0, 0x56BD, 0x87C7, 0x56BE, 0x87C8, 0x56BF, 0x87C9, 0x56C0, 0x87CA, 0x56C1, 0x87CB, 0x56C2, 0x87CC, + 0x56C3, 0x87CD, 0x56C4, 0x87CE, 0x56C5, 0x87CF, 0x56C6, 0x87D0, 0x56C7, 0x87D1, 0x56C8, 0x87D2, 0x56C9, 0x87D3, 0x56CA, 0xC4D2, + 0x56CB, 0x87D4, 0x56CC, 0x87D5, 0x56CD, 0x87D6, 0x56CE, 0x87D7, 0x56CF, 0x87D8, 0x56D0, 0x87D9, 0x56D1, 0x87DA, 0x56D2, 0x87DB, + 0x56D3, 0x87DC, 0x56D4, 0xE0EC, 0x56D5, 0x87DD, 0x56D6, 0x87DE, 0x56D7, 0xE0ED, 0x56D8, 0x87DF, 0x56D9, 0x87E0, 0x56DA, 0xC7F4, + 0x56DB, 0xCBC4, 0x56DC, 0x87E1, 0x56DD, 0xE0EE, 0x56DE, 0xBBD8, 0x56DF, 0xD8B6, 0x56E0, 0xD2F2, 0x56E1, 0xE0EF, 0x56E2, 0xCDC5, + 0x56E3, 0x87E2, 0x56E4, 0xB6DA, 0x56E5, 0x87E3, 0x56E6, 0x87E4, 0x56E7, 0x87E5, 0x56E8, 0x87E6, 0x56E9, 0x87E7, 0x56EA, 0x87E8, + 0x56EB, 0xE0F1, 0x56EC, 0x87E9, 0x56ED, 0xD4B0, 0x56EE, 0x87EA, 0x56EF, 0x87EB, 0x56F0, 0xC0A7, 0x56F1, 0xB4D1, 0x56F2, 0x87EC, + 0x56F3, 0x87ED, 0x56F4, 0xCEA7, 0x56F5, 0xE0F0, 0x56F6, 0x87EE, 0x56F7, 0x87EF, 0x56F8, 0x87F0, 0x56F9, 0xE0F2, 0x56FA, 0xB9CC, + 0x56FB, 0x87F1, 0x56FC, 0x87F2, 0x56FD, 0xB9FA, 0x56FE, 0xCDBC, 0x56FF, 0xE0F3, 0x5700, 0x87F3, 0x5701, 0x87F4, 0x5702, 0x87F5, + 0x5703, 0xC6D4, 0x5704, 0xE0F4, 0x5705, 0x87F6, 0x5706, 0xD4B2, 0x5707, 0x87F7, 0x5708, 0xC8A6, 0x5709, 0xE0F6, 0x570A, 0xE0F5, + 0x570B, 0x87F8, 0x570C, 0x87F9, 0x570D, 0x87FA, 0x570E, 0x87FB, 0x570F, 0x87FC, 0x5710, 0x87FD, 0x5711, 0x87FE, 0x5712, 0x8840, + 0x5713, 0x8841, 0x5714, 0x8842, 0x5715, 0x8843, 0x5716, 0x8844, 0x5717, 0x8845, 0x5718, 0x8846, 0x5719, 0x8847, 0x571A, 0x8848, + 0x571B, 0x8849, 0x571C, 0xE0F7, 0x571D, 0x884A, 0x571E, 0x884B, 0x571F, 0xCDC1, 0x5720, 0x884C, 0x5721, 0x884D, 0x5722, 0x884E, + 0x5723, 0xCAA5, 0x5724, 0x884F, 0x5725, 0x8850, 0x5726, 0x8851, 0x5727, 0x8852, 0x5728, 0xD4DA, 0x5729, 0xDBD7, 0x572A, 0xDBD9, + 0x572B, 0x8853, 0x572C, 0xDBD8, 0x572D, 0xB9E7, 0x572E, 0xDBDC, 0x572F, 0xDBDD, 0x5730, 0xB5D8, 0x5731, 0x8854, 0x5732, 0x8855, + 0x5733, 0xDBDA, 0x5734, 0x8856, 0x5735, 0x8857, 0x5736, 0x8858, 0x5737, 0x8859, 0x5738, 0x885A, 0x5739, 0xDBDB, 0x573A, 0xB3A1, + 0x573B, 0xDBDF, 0x573C, 0x885B, 0x573D, 0x885C, 0x573E, 0xBBF8, 0x573F, 0x885D, 0x5740, 0xD6B7, 0x5741, 0x885E, 0x5742, 0xDBE0, + 0x5743, 0x885F, 0x5744, 0x8860, 0x5745, 0x8861, 0x5746, 0x8862, 0x5747, 0xBEF9, 0x5748, 0x8863, 0x5749, 0x8864, 0x574A, 0xB7BB, + 0x574B, 0x8865, 0x574C, 0xDBD0, 0x574D, 0xCCAE, 0x574E, 0xBFB2, 0x574F, 0xBBB5, 0x5750, 0xD7F8, 0x5751, 0xBFD3, 0x5752, 0x8866, + 0x5753, 0x8867, 0x5754, 0x8868, 0x5755, 0x8869, 0x5756, 0x886A, 0x5757, 0xBFE9, 0x5758, 0x886B, 0x5759, 0x886C, 0x575A, 0xBCE1, + 0x575B, 0xCCB3, 0x575C, 0xDBDE, 0x575D, 0xB0D3, 0x575E, 0xCEEB, 0x575F, 0xB7D8, 0x5760, 0xD7B9, 0x5761, 0xC6C2, 0x5762, 0x886D, + 0x5763, 0x886E, 0x5764, 0xC0A4, 0x5765, 0x886F, 0x5766, 0xCCB9, 0x5767, 0x8870, 0x5768, 0xDBE7, 0x5769, 0xDBE1, 0x576A, 0xC6BA, + 0x576B, 0xDBE3, 0x576C, 0x8871, 0x576D, 0xDBE8, 0x576E, 0x8872, 0x576F, 0xC5F7, 0x5770, 0x8873, 0x5771, 0x8874, 0x5772, 0x8875, + 0x5773, 0xDBEA, 0x5774, 0x8876, 0x5775, 0x8877, 0x5776, 0xDBE9, 0x5777, 0xBFC0, 0x5778, 0x8878, 0x5779, 0x8879, 0x577A, 0x887A, + 0x577B, 0xDBE6, 0x577C, 0xDBE5, 0x577D, 0x887B, 0x577E, 0x887C, 0x577F, 0x887D, 0x5780, 0x887E, 0x5781, 0x8880, 0x5782, 0xB4B9, + 0x5783, 0xC0AC, 0x5784, 0xC2A2, 0x5785, 0xDBE2, 0x5786, 0xDBE4, 0x5787, 0x8881, 0x5788, 0x8882, 0x5789, 0x8883, 0x578A, 0x8884, + 0x578B, 0xD0CD, 0x578C, 0xDBED, 0x578D, 0x8885, 0x578E, 0x8886, 0x578F, 0x8887, 0x5790, 0x8888, 0x5791, 0x8889, 0x5792, 0xC0DD, + 0x5793, 0xDBF2, 0x5794, 0x888A, 0x5795, 0x888B, 0x5796, 0x888C, 0x5797, 0x888D, 0x5798, 0x888E, 0x5799, 0x888F, 0x579A, 0x8890, + 0x579B, 0xB6E2, 0x579C, 0x8891, 0x579D, 0x8892, 0x579E, 0x8893, 0x579F, 0x8894, 0x57A0, 0xDBF3, 0x57A1, 0xDBD2, 0x57A2, 0xB9B8, + 0x57A3, 0xD4AB, 0x57A4, 0xDBEC, 0x57A5, 0x8895, 0x57A6, 0xBFD1, 0x57A7, 0xDBF0, 0x57A8, 0x8896, 0x57A9, 0xDBD1, 0x57AA, 0x8897, + 0x57AB, 0xB5E6, 0x57AC, 0x8898, 0x57AD, 0xDBEB, 0x57AE, 0xBFE5, 0x57AF, 0x8899, 0x57B0, 0x889A, 0x57B1, 0x889B, 0x57B2, 0xDBEE, + 0x57B3, 0x889C, 0x57B4, 0xDBF1, 0x57B5, 0x889D, 0x57B6, 0x889E, 0x57B7, 0x889F, 0x57B8, 0xDBF9, 0x57B9, 0x88A0, 0x57BA, 0x88A1, + 0x57BB, 0x88A2, 0x57BC, 0x88A3, 0x57BD, 0x88A4, 0x57BE, 0x88A5, 0x57BF, 0x88A6, 0x57C0, 0x88A7, 0x57C1, 0x88A8, 0x57C2, 0xB9A1, + 0x57C3, 0xB0A3, 0x57C4, 0x88A9, 0x57C5, 0x88AA, 0x57C6, 0x88AB, 0x57C7, 0x88AC, 0x57C8, 0x88AD, 0x57C9, 0x88AE, 0x57CA, 0x88AF, + 0x57CB, 0xC2F1, 0x57CC, 0x88B0, 0x57CD, 0x88B1, 0x57CE, 0xB3C7, 0x57CF, 0xDBEF, 0x57D0, 0x88B2, 0x57D1, 0x88B3, 0x57D2, 0xDBF8, + 0x57D3, 0x88B4, 0x57D4, 0xC6D2, 0x57D5, 0xDBF4, 0x57D6, 0x88B5, 0x57D7, 0x88B6, 0x57D8, 0xDBF5, 0x57D9, 0xDBF7, 0x57DA, 0xDBF6, + 0x57DB, 0x88B7, 0x57DC, 0x88B8, 0x57DD, 0xDBFE, 0x57DE, 0x88B9, 0x57DF, 0xD3F2, 0x57E0, 0xB2BA, 0x57E1, 0x88BA, 0x57E2, 0x88BB, + 0x57E3, 0x88BC, 0x57E4, 0xDBFD, 0x57E5, 0x88BD, 0x57E6, 0x88BE, 0x57E7, 0x88BF, 0x57E8, 0x88C0, 0x57E9, 0x88C1, 0x57EA, 0x88C2, + 0x57EB, 0x88C3, 0x57EC, 0x88C4, 0x57ED, 0xDCA4, 0x57EE, 0x88C5, 0x57EF, 0xDBFB, 0x57F0, 0x88C6, 0x57F1, 0x88C7, 0x57F2, 0x88C8, + 0x57F3, 0x88C9, 0x57F4, 0xDBFA, 0x57F5, 0x88CA, 0x57F6, 0x88CB, 0x57F7, 0x88CC, 0x57F8, 0xDBFC, 0x57F9, 0xC5E0, 0x57FA, 0xBBF9, + 0x57FB, 0x88CD, 0x57FC, 0x88CE, 0x57FD, 0xDCA3, 0x57FE, 0x88CF, 0x57FF, 0x88D0, 0x5800, 0xDCA5, 0x5801, 0x88D1, 0x5802, 0xCCC3, + 0x5803, 0x88D2, 0x5804, 0x88D3, 0x5805, 0x88D4, 0x5806, 0xB6D1, 0x5807, 0xDDC0, 0x5808, 0x88D5, 0x5809, 0x88D6, 0x580A, 0x88D7, + 0x580B, 0xDCA1, 0x580C, 0x88D8, 0x580D, 0xDCA2, 0x580E, 0x88D9, 0x580F, 0x88DA, 0x5810, 0x88DB, 0x5811, 0xC7B5, 0x5812, 0x88DC, + 0x5813, 0x88DD, 0x5814, 0x88DE, 0x5815, 0xB6E9, 0x5816, 0x88DF, 0x5817, 0x88E0, 0x5818, 0x88E1, 0x5819, 0xDCA7, 0x581A, 0x88E2, + 0x581B, 0x88E3, 0x581C, 0x88E4, 0x581D, 0x88E5, 0x581E, 0xDCA6, 0x581F, 0x88E6, 0x5820, 0xDCA9, 0x5821, 0xB1A4, 0x5822, 0x88E7, + 0x5823, 0x88E8, 0x5824, 0xB5CC, 0x5825, 0x88E9, 0x5826, 0x88EA, 0x5827, 0x88EB, 0x5828, 0x88EC, 0x5829, 0x88ED, 0x582A, 0xBFB0, + 0x582B, 0x88EE, 0x582C, 0x88EF, 0x582D, 0x88F0, 0x582E, 0x88F1, 0x582F, 0x88F2, 0x5830, 0xD1DF, 0x5831, 0x88F3, 0x5832, 0x88F4, + 0x5833, 0x88F5, 0x5834, 0x88F6, 0x5835, 0xB6C2, 0x5836, 0x88F7, 0x5837, 0x88F8, 0x5838, 0x88F9, 0x5839, 0x88FA, 0x583A, 0x88FB, + 0x583B, 0x88FC, 0x583C, 0x88FD, 0x583D, 0x88FE, 0x583E, 0x8940, 0x583F, 0x8941, 0x5840, 0x8942, 0x5841, 0x8943, 0x5842, 0x8944, + 0x5843, 0x8945, 0x5844, 0xDCA8, 0x5845, 0x8946, 0x5846, 0x8947, 0x5847, 0x8948, 0x5848, 0x8949, 0x5849, 0x894A, 0x584A, 0x894B, + 0x584B, 0x894C, 0x584C, 0xCBFA, 0x584D, 0xEBF3, 0x584E, 0x894D, 0x584F, 0x894E, 0x5850, 0x894F, 0x5851, 0xCBDC, 0x5852, 0x8950, + 0x5853, 0x8951, 0x5854, 0xCBFE, 0x5855, 0x8952, 0x5856, 0x8953, 0x5857, 0x8954, 0x5858, 0xCCC1, 0x5859, 0x8955, 0x585A, 0x8956, + 0x585B, 0x8957, 0x585C, 0x8958, 0x585D, 0x8959, 0x585E, 0xC8FB, 0x585F, 0x895A, 0x5860, 0x895B, 0x5861, 0x895C, 0x5862, 0x895D, + 0x5863, 0x895E, 0x5864, 0x895F, 0x5865, 0xDCAA, 0x5866, 0x8960, 0x5867, 0x8961, 0x5868, 0x8962, 0x5869, 0x8963, 0x586A, 0x8964, + 0x586B, 0xCCEE, 0x586C, 0xDCAB, 0x586D, 0x8965, 0x586E, 0x8966, 0x586F, 0x8967, 0x5870, 0x8968, 0x5871, 0x8969, 0x5872, 0x896A, + 0x5873, 0x896B, 0x5874, 0x896C, 0x5875, 0x896D, 0x5876, 0x896E, 0x5877, 0x896F, 0x5878, 0x8970, 0x5879, 0x8971, 0x587A, 0x8972, + 0x587B, 0x8973, 0x587C, 0x8974, 0x587D, 0x8975, 0x587E, 0xDBD3, 0x587F, 0x8976, 0x5880, 0xDCAF, 0x5881, 0xDCAC, 0x5882, 0x8977, + 0x5883, 0xBEB3, 0x5884, 0x8978, 0x5885, 0xCAFB, 0x5886, 0x8979, 0x5887, 0x897A, 0x5888, 0x897B, 0x5889, 0xDCAD, 0x588A, 0x897C, + 0x588B, 0x897D, 0x588C, 0x897E, 0x588D, 0x8980, 0x588E, 0x8981, 0x588F, 0x8982, 0x5890, 0x8983, 0x5891, 0x8984, 0x5892, 0xC9CA, + 0x5893, 0xC4B9, 0x5894, 0x8985, 0x5895, 0x8986, 0x5896, 0x8987, 0x5897, 0x8988, 0x5898, 0x8989, 0x5899, 0xC7BD, 0x589A, 0xDCAE, + 0x589B, 0x898A, 0x589C, 0x898B, 0x589D, 0x898C, 0x589E, 0xD4F6, 0x589F, 0xD0E6, 0x58A0, 0x898D, 0x58A1, 0x898E, 0x58A2, 0x898F, + 0x58A3, 0x8990, 0x58A4, 0x8991, 0x58A5, 0x8992, 0x58A6, 0x8993, 0x58A7, 0x8994, 0x58A8, 0xC4AB, 0x58A9, 0xB6D5, 0x58AA, 0x8995, + 0x58AB, 0x8996, 0x58AC, 0x8997, 0x58AD, 0x8998, 0x58AE, 0x8999, 0x58AF, 0x899A, 0x58B0, 0x899B, 0x58B1, 0x899C, 0x58B2, 0x899D, + 0x58B3, 0x899E, 0x58B4, 0x899F, 0x58B5, 0x89A0, 0x58B6, 0x89A1, 0x58B7, 0x89A2, 0x58B8, 0x89A3, 0x58B9, 0x89A4, 0x58BA, 0x89A5, + 0x58BB, 0x89A6, 0x58BC, 0xDBD4, 0x58BD, 0x89A7, 0x58BE, 0x89A8, 0x58BF, 0x89A9, 0x58C0, 0x89AA, 0x58C1, 0xB1DA, 0x58C2, 0x89AB, + 0x58C3, 0x89AC, 0x58C4, 0x89AD, 0x58C5, 0xDBD5, 0x58C6, 0x89AE, 0x58C7, 0x89AF, 0x58C8, 0x89B0, 0x58C9, 0x89B1, 0x58CA, 0x89B2, + 0x58CB, 0x89B3, 0x58CC, 0x89B4, 0x58CD, 0x89B5, 0x58CE, 0x89B6, 0x58CF, 0x89B7, 0x58D0, 0x89B8, 0x58D1, 0xDBD6, 0x58D2, 0x89B9, + 0x58D3, 0x89BA, 0x58D4, 0x89BB, 0x58D5, 0xBABE, 0x58D6, 0x89BC, 0x58D7, 0x89BD, 0x58D8, 0x89BE, 0x58D9, 0x89BF, 0x58DA, 0x89C0, + 0x58DB, 0x89C1, 0x58DC, 0x89C2, 0x58DD, 0x89C3, 0x58DE, 0x89C4, 0x58DF, 0x89C5, 0x58E0, 0x89C6, 0x58E1, 0x89C7, 0x58E2, 0x89C8, + 0x58E3, 0x89C9, 0x58E4, 0xC8C0, 0x58E5, 0x89CA, 0x58E6, 0x89CB, 0x58E7, 0x89CC, 0x58E8, 0x89CD, 0x58E9, 0x89CE, 0x58EA, 0x89CF, + 0x58EB, 0xCABF, 0x58EC, 0xC8C9, 0x58ED, 0x89D0, 0x58EE, 0xD7B3, 0x58EF, 0x89D1, 0x58F0, 0xC9F9, 0x58F1, 0x89D2, 0x58F2, 0x89D3, + 0x58F3, 0xBFC7, 0x58F4, 0x89D4, 0x58F5, 0x89D5, 0x58F6, 0xBAF8, 0x58F7, 0x89D6, 0x58F8, 0x89D7, 0x58F9, 0xD2BC, 0x58FA, 0x89D8, + 0x58FB, 0x89D9, 0x58FC, 0x89DA, 0x58FD, 0x89DB, 0x58FE, 0x89DC, 0x58FF, 0x89DD, 0x5900, 0x89DE, 0x5901, 0x89DF, 0x5902, 0xE2BA, + 0x5903, 0x89E0, 0x5904, 0xB4A6, 0x5905, 0x89E1, 0x5906, 0x89E2, 0x5907, 0xB1B8, 0x5908, 0x89E3, 0x5909, 0x89E4, 0x590A, 0x89E5, + 0x590B, 0x89E6, 0x590C, 0x89E7, 0x590D, 0xB8B4, 0x590E, 0x89E8, 0x590F, 0xCFC4, 0x5910, 0x89E9, 0x5911, 0x89EA, 0x5912, 0x89EB, + 0x5913, 0x89EC, 0x5914, 0xD9E7, 0x5915, 0xCFA6, 0x5916, 0xCDE2, 0x5917, 0x89ED, 0x5918, 0x89EE, 0x5919, 0xD9ED, 0x591A, 0xB6E0, + 0x591B, 0x89EF, 0x591C, 0xD2B9, 0x591D, 0x89F0, 0x591E, 0x89F1, 0x591F, 0xB9BB, 0x5920, 0x89F2, 0x5921, 0x89F3, 0x5922, 0x89F4, + 0x5923, 0x89F5, 0x5924, 0xE2B9, 0x5925, 0xE2B7, 0x5926, 0x89F6, 0x5927, 0xB4F3, 0x5928, 0x89F7, 0x5929, 0xCCEC, 0x592A, 0xCCAB, + 0x592B, 0xB7F2, 0x592C, 0x89F8, 0x592D, 0xD8B2, 0x592E, 0xD1EB, 0x592F, 0xBABB, 0x5930, 0x89F9, 0x5931, 0xCAA7, 0x5932, 0x89FA, + 0x5933, 0x89FB, 0x5934, 0xCDB7, 0x5935, 0x89FC, 0x5936, 0x89FD, 0x5937, 0xD2C4, 0x5938, 0xBFE4, 0x5939, 0xBCD0, 0x593A, 0xB6E1, + 0x593B, 0x89FE, 0x593C, 0xDEC5, 0x593D, 0x8A40, 0x593E, 0x8A41, 0x593F, 0x8A42, 0x5940, 0x8A43, 0x5941, 0xDEC6, 0x5942, 0xDBBC, + 0x5943, 0x8A44, 0x5944, 0xD1D9, 0x5945, 0x8A45, 0x5946, 0x8A46, 0x5947, 0xC6E6, 0x5948, 0xC4CE, 0x5949, 0xB7EE, 0x594A, 0x8A47, + 0x594B, 0xB7DC, 0x594C, 0x8A48, 0x594D, 0x8A49, 0x594E, 0xBFFC, 0x594F, 0xD7E0, 0x5950, 0x8A4A, 0x5951, 0xC6F5, 0x5952, 0x8A4B, + 0x5953, 0x8A4C, 0x5954, 0xB1BC, 0x5955, 0xDEC8, 0x5956, 0xBDB1, 0x5957, 0xCCD7, 0x5958, 0xDECA, 0x5959, 0x8A4D, 0x595A, 0xDEC9, + 0x595B, 0x8A4E, 0x595C, 0x8A4F, 0x595D, 0x8A50, 0x595E, 0x8A51, 0x595F, 0x8A52, 0x5960, 0xB5EC, 0x5961, 0x8A53, 0x5962, 0xC9DD, + 0x5963, 0x8A54, 0x5964, 0x8A55, 0x5965, 0xB0C2, 0x5966, 0x8A56, 0x5967, 0x8A57, 0x5968, 0x8A58, 0x5969, 0x8A59, 0x596A, 0x8A5A, + 0x596B, 0x8A5B, 0x596C, 0x8A5C, 0x596D, 0x8A5D, 0x596E, 0x8A5E, 0x596F, 0x8A5F, 0x5970, 0x8A60, 0x5971, 0x8A61, 0x5972, 0x8A62, + 0x5973, 0xC5AE, 0x5974, 0xC5AB, 0x5975, 0x8A63, 0x5976, 0xC4CC, 0x5977, 0x8A64, 0x5978, 0xBCE9, 0x5979, 0xCBFD, 0x597A, 0x8A65, + 0x597B, 0x8A66, 0x597C, 0x8A67, 0x597D, 0xBAC3, 0x597E, 0x8A68, 0x597F, 0x8A69, 0x5980, 0x8A6A, 0x5981, 0xE5F9, 0x5982, 0xC8E7, + 0x5983, 0xE5FA, 0x5984, 0xCDFD, 0x5985, 0x8A6B, 0x5986, 0xD7B1, 0x5987, 0xB8BE, 0x5988, 0xC2E8, 0x5989, 0x8A6C, 0x598A, 0xC8D1, + 0x598B, 0x8A6D, 0x598C, 0x8A6E, 0x598D, 0xE5FB, 0x598E, 0x8A6F, 0x598F, 0x8A70, 0x5990, 0x8A71, 0x5991, 0x8A72, 0x5992, 0xB6CA, + 0x5993, 0xBCCB, 0x5994, 0x8A73, 0x5995, 0x8A74, 0x5996, 0xD1FD, 0x5997, 0xE6A1, 0x5998, 0x8A75, 0x5999, 0xC3EE, 0x599A, 0x8A76, + 0x599B, 0x8A77, 0x599C, 0x8A78, 0x599D, 0x8A79, 0x599E, 0xE6A4, 0x599F, 0x8A7A, 0x59A0, 0x8A7B, 0x59A1, 0x8A7C, 0x59A2, 0x8A7D, + 0x59A3, 0xE5FE, 0x59A4, 0xE6A5, 0x59A5, 0xCDD7, 0x59A6, 0x8A7E, 0x59A7, 0x8A80, 0x59A8, 0xB7C1, 0x59A9, 0xE5FC, 0x59AA, 0xE5FD, + 0x59AB, 0xE6A3, 0x59AC, 0x8A81, 0x59AD, 0x8A82, 0x59AE, 0xC4DD, 0x59AF, 0xE6A8, 0x59B0, 0x8A83, 0x59B1, 0x8A84, 0x59B2, 0xE6A7, + 0x59B3, 0x8A85, 0x59B4, 0x8A86, 0x59B5, 0x8A87, 0x59B6, 0x8A88, 0x59B7, 0x8A89, 0x59B8, 0x8A8A, 0x59B9, 0xC3C3, 0x59BA, 0x8A8B, + 0x59BB, 0xC6DE, 0x59BC, 0x8A8C, 0x59BD, 0x8A8D, 0x59BE, 0xE6AA, 0x59BF, 0x8A8E, 0x59C0, 0x8A8F, 0x59C1, 0x8A90, 0x59C2, 0x8A91, + 0x59C3, 0x8A92, 0x59C4, 0x8A93, 0x59C5, 0x8A94, 0x59C6, 0xC4B7, 0x59C7, 0x8A95, 0x59C8, 0x8A96, 0x59C9, 0x8A97, 0x59CA, 0xE6A2, + 0x59CB, 0xCABC, 0x59CC, 0x8A98, 0x59CD, 0x8A99, 0x59CE, 0x8A9A, 0x59CF, 0x8A9B, 0x59D0, 0xBDE3, 0x59D1, 0xB9C3, 0x59D2, 0xE6A6, + 0x59D3, 0xD0D5, 0x59D4, 0xCEAF, 0x59D5, 0x8A9C, 0x59D6, 0x8A9D, 0x59D7, 0xE6A9, 0x59D8, 0xE6B0, 0x59D9, 0x8A9E, 0x59DA, 0xD2A6, + 0x59DB, 0x8A9F, 0x59DC, 0xBDAA, 0x59DD, 0xE6AD, 0x59DE, 0x8AA0, 0x59DF, 0x8AA1, 0x59E0, 0x8AA2, 0x59E1, 0x8AA3, 0x59E2, 0x8AA4, + 0x59E3, 0xE6AF, 0x59E4, 0x8AA5, 0x59E5, 0xC0D1, 0x59E6, 0x8AA6, 0x59E7, 0x8AA7, 0x59E8, 0xD2CC, 0x59E9, 0x8AA8, 0x59EA, 0x8AA9, + 0x59EB, 0x8AAA, 0x59EC, 0xBCA7, 0x59ED, 0x8AAB, 0x59EE, 0x8AAC, 0x59EF, 0x8AAD, 0x59F0, 0x8AAE, 0x59F1, 0x8AAF, 0x59F2, 0x8AB0, + 0x59F3, 0x8AB1, 0x59F4, 0x8AB2, 0x59F5, 0x8AB3, 0x59F6, 0x8AB4, 0x59F7, 0x8AB5, 0x59F8, 0x8AB6, 0x59F9, 0xE6B1, 0x59FA, 0x8AB7, + 0x59FB, 0xD2F6, 0x59FC, 0x8AB8, 0x59FD, 0x8AB9, 0x59FE, 0x8ABA, 0x59FF, 0xD7CB, 0x5A00, 0x8ABB, 0x5A01, 0xCDFE, 0x5A02, 0x8ABC, + 0x5A03, 0xCDDE, 0x5A04, 0xC2A6, 0x5A05, 0xE6AB, 0x5A06, 0xE6AC, 0x5A07, 0xBDBF, 0x5A08, 0xE6AE, 0x5A09, 0xE6B3, 0x5A0A, 0x8ABD, + 0x5A0B, 0x8ABE, 0x5A0C, 0xE6B2, 0x5A0D, 0x8ABF, 0x5A0E, 0x8AC0, 0x5A0F, 0x8AC1, 0x5A10, 0x8AC2, 0x5A11, 0xE6B6, 0x5A12, 0x8AC3, + 0x5A13, 0xE6B8, 0x5A14, 0x8AC4, 0x5A15, 0x8AC5, 0x5A16, 0x8AC6, 0x5A17, 0x8AC7, 0x5A18, 0xC4EF, 0x5A19, 0x8AC8, 0x5A1A, 0x8AC9, + 0x5A1B, 0x8ACA, 0x5A1C, 0xC4C8, 0x5A1D, 0x8ACB, 0x5A1E, 0x8ACC, 0x5A1F, 0xBEEA, 0x5A20, 0xC9EF, 0x5A21, 0x8ACD, 0x5A22, 0x8ACE, + 0x5A23, 0xE6B7, 0x5A24, 0x8ACF, 0x5A25, 0xB6F0, 0x5A26, 0x8AD0, 0x5A27, 0x8AD1, 0x5A28, 0x8AD2, 0x5A29, 0xC3E4, 0x5A2A, 0x8AD3, + 0x5A2B, 0x8AD4, 0x5A2C, 0x8AD5, 0x5A2D, 0x8AD6, 0x5A2E, 0x8AD7, 0x5A2F, 0x8AD8, 0x5A30, 0x8AD9, 0x5A31, 0xD3E9, 0x5A32, 0xE6B4, + 0x5A33, 0x8ADA, 0x5A34, 0xE6B5, 0x5A35, 0x8ADB, 0x5A36, 0xC8A2, 0x5A37, 0x8ADC, 0x5A38, 0x8ADD, 0x5A39, 0x8ADE, 0x5A3A, 0x8ADF, + 0x5A3B, 0x8AE0, 0x5A3C, 0xE6BD, 0x5A3D, 0x8AE1, 0x5A3E, 0x8AE2, 0x5A3F, 0x8AE3, 0x5A40, 0xE6B9, 0x5A41, 0x8AE4, 0x5A42, 0x8AE5, + 0x5A43, 0x8AE6, 0x5A44, 0x8AE7, 0x5A45, 0x8AE8, 0x5A46, 0xC6C5, 0x5A47, 0x8AE9, 0x5A48, 0x8AEA, 0x5A49, 0xCDF1, 0x5A4A, 0xE6BB, + 0x5A4B, 0x8AEB, 0x5A4C, 0x8AEC, 0x5A4D, 0x8AED, 0x5A4E, 0x8AEE, 0x5A4F, 0x8AEF, 0x5A50, 0x8AF0, 0x5A51, 0x8AF1, 0x5A52, 0x8AF2, + 0x5A53, 0x8AF3, 0x5A54, 0x8AF4, 0x5A55, 0xE6BC, 0x5A56, 0x8AF5, 0x5A57, 0x8AF6, 0x5A58, 0x8AF7, 0x5A59, 0x8AF8, 0x5A5A, 0xBBE9, + 0x5A5B, 0x8AF9, 0x5A5C, 0x8AFA, 0x5A5D, 0x8AFB, 0x5A5E, 0x8AFC, 0x5A5F, 0x8AFD, 0x5A60, 0x8AFE, 0x5A61, 0x8B40, 0x5A62, 0xE6BE, + 0x5A63, 0x8B41, 0x5A64, 0x8B42, 0x5A65, 0x8B43, 0x5A66, 0x8B44, 0x5A67, 0xE6BA, 0x5A68, 0x8B45, 0x5A69, 0x8B46, 0x5A6A, 0xC0B7, + 0x5A6B, 0x8B47, 0x5A6C, 0x8B48, 0x5A6D, 0x8B49, 0x5A6E, 0x8B4A, 0x5A6F, 0x8B4B, 0x5A70, 0x8B4C, 0x5A71, 0x8B4D, 0x5A72, 0x8B4E, + 0x5A73, 0x8B4F, 0x5A74, 0xD3A4, 0x5A75, 0xE6BF, 0x5A76, 0xC9F4, 0x5A77, 0xE6C3, 0x5A78, 0x8B50, 0x5A79, 0x8B51, 0x5A7A, 0xE6C4, + 0x5A7B, 0x8B52, 0x5A7C, 0x8B53, 0x5A7D, 0x8B54, 0x5A7E, 0x8B55, 0x5A7F, 0xD0F6, 0x5A80, 0x8B56, 0x5A81, 0x8B57, 0x5A82, 0x8B58, + 0x5A83, 0x8B59, 0x5A84, 0x8B5A, 0x5A85, 0x8B5B, 0x5A86, 0x8B5C, 0x5A87, 0x8B5D, 0x5A88, 0x8B5E, 0x5A89, 0x8B5F, 0x5A8A, 0x8B60, + 0x5A8B, 0x8B61, 0x5A8C, 0x8B62, 0x5A8D, 0x8B63, 0x5A8E, 0x8B64, 0x5A8F, 0x8B65, 0x5A90, 0x8B66, 0x5A91, 0x8B67, 0x5A92, 0xC3BD, + 0x5A93, 0x8B68, 0x5A94, 0x8B69, 0x5A95, 0x8B6A, 0x5A96, 0x8B6B, 0x5A97, 0x8B6C, 0x5A98, 0x8B6D, 0x5A99, 0x8B6E, 0x5A9A, 0xC3C4, + 0x5A9B, 0xE6C2, 0x5A9C, 0x8B6F, 0x5A9D, 0x8B70, 0x5A9E, 0x8B71, 0x5A9F, 0x8B72, 0x5AA0, 0x8B73, 0x5AA1, 0x8B74, 0x5AA2, 0x8B75, + 0x5AA3, 0x8B76, 0x5AA4, 0x8B77, 0x5AA5, 0x8B78, 0x5AA6, 0x8B79, 0x5AA7, 0x8B7A, 0x5AA8, 0x8B7B, 0x5AA9, 0x8B7C, 0x5AAA, 0xE6C1, + 0x5AAB, 0x8B7D, 0x5AAC, 0x8B7E, 0x5AAD, 0x8B80, 0x5AAE, 0x8B81, 0x5AAF, 0x8B82, 0x5AB0, 0x8B83, 0x5AB1, 0x8B84, 0x5AB2, 0xE6C7, + 0x5AB3, 0xCFB1, 0x5AB4, 0x8B85, 0x5AB5, 0xEBF4, 0x5AB6, 0x8B86, 0x5AB7, 0x8B87, 0x5AB8, 0xE6CA, 0x5AB9, 0x8B88, 0x5ABA, 0x8B89, + 0x5ABB, 0x8B8A, 0x5ABC, 0x8B8B, 0x5ABD, 0x8B8C, 0x5ABE, 0xE6C5, 0x5ABF, 0x8B8D, 0x5AC0, 0x8B8E, 0x5AC1, 0xBCDE, 0x5AC2, 0xC9A9, + 0x5AC3, 0x8B8F, 0x5AC4, 0x8B90, 0x5AC5, 0x8B91, 0x5AC6, 0x8B92, 0x5AC7, 0x8B93, 0x5AC8, 0x8B94, 0x5AC9, 0xBCB5, 0x5ACA, 0x8B95, + 0x5ACB, 0x8B96, 0x5ACC, 0xCFD3, 0x5ACD, 0x8B97, 0x5ACE, 0x8B98, 0x5ACF, 0x8B99, 0x5AD0, 0x8B9A, 0x5AD1, 0x8B9B, 0x5AD2, 0xE6C8, + 0x5AD3, 0x8B9C, 0x5AD4, 0xE6C9, 0x5AD5, 0x8B9D, 0x5AD6, 0xE6CE, 0x5AD7, 0x8B9E, 0x5AD8, 0xE6D0, 0x5AD9, 0x8B9F, 0x5ADA, 0x8BA0, + 0x5ADB, 0x8BA1, 0x5ADC, 0xE6D1, 0x5ADD, 0x8BA2, 0x5ADE, 0x8BA3, 0x5ADF, 0x8BA4, 0x5AE0, 0xE6CB, 0x5AE1, 0xB5D5, 0x5AE2, 0x8BA5, + 0x5AE3, 0xE6CC, 0x5AE4, 0x8BA6, 0x5AE5, 0x8BA7, 0x5AE6, 0xE6CF, 0x5AE7, 0x8BA8, 0x5AE8, 0x8BA9, 0x5AE9, 0xC4DB, 0x5AEA, 0x8BAA, + 0x5AEB, 0xE6C6, 0x5AEC, 0x8BAB, 0x5AED, 0x8BAC, 0x5AEE, 0x8BAD, 0x5AEF, 0x8BAE, 0x5AF0, 0x8BAF, 0x5AF1, 0xE6CD, 0x5AF2, 0x8BB0, + 0x5AF3, 0x8BB1, 0x5AF4, 0x8BB2, 0x5AF5, 0x8BB3, 0x5AF6, 0x8BB4, 0x5AF7, 0x8BB5, 0x5AF8, 0x8BB6, 0x5AF9, 0x8BB7, 0x5AFA, 0x8BB8, + 0x5AFB, 0x8BB9, 0x5AFC, 0x8BBA, 0x5AFD, 0x8BBB, 0x5AFE, 0x8BBC, 0x5AFF, 0x8BBD, 0x5B00, 0x8BBE, 0x5B01, 0x8BBF, 0x5B02, 0x8BC0, + 0x5B03, 0x8BC1, 0x5B04, 0x8BC2, 0x5B05, 0x8BC3, 0x5B06, 0x8BC4, 0x5B07, 0x8BC5, 0x5B08, 0x8BC6, 0x5B09, 0xE6D2, 0x5B0A, 0x8BC7, + 0x5B0B, 0x8BC8, 0x5B0C, 0x8BC9, 0x5B0D, 0x8BCA, 0x5B0E, 0x8BCB, 0x5B0F, 0x8BCC, 0x5B10, 0x8BCD, 0x5B11, 0x8BCE, 0x5B12, 0x8BCF, + 0x5B13, 0x8BD0, 0x5B14, 0x8BD1, 0x5B15, 0x8BD2, 0x5B16, 0xE6D4, 0x5B17, 0xE6D3, 0x5B18, 0x8BD3, 0x5B19, 0x8BD4, 0x5B1A, 0x8BD5, + 0x5B1B, 0x8BD6, 0x5B1C, 0x8BD7, 0x5B1D, 0x8BD8, 0x5B1E, 0x8BD9, 0x5B1F, 0x8BDA, 0x5B20, 0x8BDB, 0x5B21, 0x8BDC, 0x5B22, 0x8BDD, + 0x5B23, 0x8BDE, 0x5B24, 0x8BDF, 0x5B25, 0x8BE0, 0x5B26, 0x8BE1, 0x5B27, 0x8BE2, 0x5B28, 0x8BE3, 0x5B29, 0x8BE4, 0x5B2A, 0x8BE5, + 0x5B2B, 0x8BE6, 0x5B2C, 0x8BE7, 0x5B2D, 0x8BE8, 0x5B2E, 0x8BE9, 0x5B2F, 0x8BEA, 0x5B30, 0x8BEB, 0x5B31, 0x8BEC, 0x5B32, 0xE6D5, + 0x5B33, 0x8BED, 0x5B34, 0xD9F8, 0x5B35, 0x8BEE, 0x5B36, 0x8BEF, 0x5B37, 0xE6D6, 0x5B38, 0x8BF0, 0x5B39, 0x8BF1, 0x5B3A, 0x8BF2, + 0x5B3B, 0x8BF3, 0x5B3C, 0x8BF4, 0x5B3D, 0x8BF5, 0x5B3E, 0x8BF6, 0x5B3F, 0x8BF7, 0x5B40, 0xE6D7, 0x5B41, 0x8BF8, 0x5B42, 0x8BF9, + 0x5B43, 0x8BFA, 0x5B44, 0x8BFB, 0x5B45, 0x8BFC, 0x5B46, 0x8BFD, 0x5B47, 0x8BFE, 0x5B48, 0x8C40, 0x5B49, 0x8C41, 0x5B4A, 0x8C42, + 0x5B4B, 0x8C43, 0x5B4C, 0x8C44, 0x5B4D, 0x8C45, 0x5B4E, 0x8C46, 0x5B4F, 0x8C47, 0x5B50, 0xD7D3, 0x5B51, 0xE6DD, 0x5B52, 0x8C48, + 0x5B53, 0xE6DE, 0x5B54, 0xBFD7, 0x5B55, 0xD4D0, 0x5B56, 0x8C49, 0x5B57, 0xD7D6, 0x5B58, 0xB4E6, 0x5B59, 0xCBEF, 0x5B5A, 0xE6DA, + 0x5B5B, 0xD8C3, 0x5B5C, 0xD7CE, 0x5B5D, 0xD0A2, 0x5B5E, 0x8C4A, 0x5B5F, 0xC3CF, 0x5B60, 0x8C4B, 0x5B61, 0x8C4C, 0x5B62, 0xE6DF, + 0x5B63, 0xBCBE, 0x5B64, 0xB9C2, 0x5B65, 0xE6DB, 0x5B66, 0xD1A7, 0x5B67, 0x8C4D, 0x5B68, 0x8C4E, 0x5B69, 0xBAA2, 0x5B6A, 0xC2CF, + 0x5B6B, 0x8C4F, 0x5B6C, 0xD8AB, 0x5B6D, 0x8C50, 0x5B6E, 0x8C51, 0x5B6F, 0x8C52, 0x5B70, 0xCAEB, 0x5B71, 0xE5EE, 0x5B72, 0x8C53, + 0x5B73, 0xE6DC, 0x5B74, 0x8C54, 0x5B75, 0xB7F5, 0x5B76, 0x8C55, 0x5B77, 0x8C56, 0x5B78, 0x8C57, 0x5B79, 0x8C58, 0x5B7A, 0xC8E6, + 0x5B7B, 0x8C59, 0x5B7C, 0x8C5A, 0x5B7D, 0xC4F5, 0x5B7E, 0x8C5B, 0x5B7F, 0x8C5C, 0x5B80, 0xE5B2, 0x5B81, 0xC4FE, 0x5B82, 0x8C5D, + 0x5B83, 0xCBFC, 0x5B84, 0xE5B3, 0x5B85, 0xD5AC, 0x5B86, 0x8C5E, 0x5B87, 0xD3EE, 0x5B88, 0xCAD8, 0x5B89, 0xB0B2, 0x5B8A, 0x8C5F, + 0x5B8B, 0xCBCE, 0x5B8C, 0xCDEA, 0x5B8D, 0x8C60, 0x5B8E, 0x8C61, 0x5B8F, 0xBAEA, 0x5B90, 0x8C62, 0x5B91, 0x8C63, 0x5B92, 0x8C64, + 0x5B93, 0xE5B5, 0x5B94, 0x8C65, 0x5B95, 0xE5B4, 0x5B96, 0x8C66, 0x5B97, 0xD7DA, 0x5B98, 0xB9D9, 0x5B99, 0xD6E6, 0x5B9A, 0xB6A8, + 0x5B9B, 0xCDF0, 0x5B9C, 0xD2CB, 0x5B9D, 0xB1A6, 0x5B9E, 0xCAB5, 0x5B9F, 0x8C67, 0x5BA0, 0xB3E8, 0x5BA1, 0xC9F3, 0x5BA2, 0xBFCD, + 0x5BA3, 0xD0FB, 0x5BA4, 0xCAD2, 0x5BA5, 0xE5B6, 0x5BA6, 0xBBC2, 0x5BA7, 0x8C68, 0x5BA8, 0x8C69, 0x5BA9, 0x8C6A, 0x5BAA, 0xCFDC, + 0x5BAB, 0xB9AC, 0x5BAC, 0x8C6B, 0x5BAD, 0x8C6C, 0x5BAE, 0x8C6D, 0x5BAF, 0x8C6E, 0x5BB0, 0xD4D7, 0x5BB1, 0x8C6F, 0x5BB2, 0x8C70, + 0x5BB3, 0xBAA6, 0x5BB4, 0xD1E7, 0x5BB5, 0xCFFC, 0x5BB6, 0xBCD2, 0x5BB7, 0x8C71, 0x5BB8, 0xE5B7, 0x5BB9, 0xC8DD, 0x5BBA, 0x8C72, + 0x5BBB, 0x8C73, 0x5BBC, 0x8C74, 0x5BBD, 0xBFED, 0x5BBE, 0xB1F6, 0x5BBF, 0xCBDE, 0x5BC0, 0x8C75, 0x5BC1, 0x8C76, 0x5BC2, 0xBCC5, + 0x5BC3, 0x8C77, 0x5BC4, 0xBCC4, 0x5BC5, 0xD2FA, 0x5BC6, 0xC3DC, 0x5BC7, 0xBFDC, 0x5BC8, 0x8C78, 0x5BC9, 0x8C79, 0x5BCA, 0x8C7A, + 0x5BCB, 0x8C7B, 0x5BCC, 0xB8BB, 0x5BCD, 0x8C7C, 0x5BCE, 0x8C7D, 0x5BCF, 0x8C7E, 0x5BD0, 0xC3C2, 0x5BD1, 0x8C80, 0x5BD2, 0xBAAE, + 0x5BD3, 0xD4A2, 0x5BD4, 0x8C81, 0x5BD5, 0x8C82, 0x5BD6, 0x8C83, 0x5BD7, 0x8C84, 0x5BD8, 0x8C85, 0x5BD9, 0x8C86, 0x5BDA, 0x8C87, + 0x5BDB, 0x8C88, 0x5BDC, 0x8C89, 0x5BDD, 0xC7DE, 0x5BDE, 0xC4AF, 0x5BDF, 0xB2EC, 0x5BE0, 0x8C8A, 0x5BE1, 0xB9D1, 0x5BE2, 0x8C8B, + 0x5BE3, 0x8C8C, 0x5BE4, 0xE5BB, 0x5BE5, 0xC1C8, 0x5BE6, 0x8C8D, 0x5BE7, 0x8C8E, 0x5BE8, 0xD5AF, 0x5BE9, 0x8C8F, 0x5BEA, 0x8C90, + 0x5BEB, 0x8C91, 0x5BEC, 0x8C92, 0x5BED, 0x8C93, 0x5BEE, 0xE5BC, 0x5BEF, 0x8C94, 0x5BF0, 0xE5BE, 0x5BF1, 0x8C95, 0x5BF2, 0x8C96, + 0x5BF3, 0x8C97, 0x5BF4, 0x8C98, 0x5BF5, 0x8C99, 0x5BF6, 0x8C9A, 0x5BF7, 0x8C9B, 0x5BF8, 0xB4E7, 0x5BF9, 0xB6D4, 0x5BFA, 0xCBC2, + 0x5BFB, 0xD1B0, 0x5BFC, 0xB5BC, 0x5BFD, 0x8C9C, 0x5BFE, 0x8C9D, 0x5BFF, 0xCAD9, 0x5C00, 0x8C9E, 0x5C01, 0xB7E2, 0x5C02, 0x8C9F, + 0x5C03, 0x8CA0, 0x5C04, 0xC9E4, 0x5C05, 0x8CA1, 0x5C06, 0xBDAB, 0x5C07, 0x8CA2, 0x5C08, 0x8CA3, 0x5C09, 0xCEBE, 0x5C0A, 0xD7F0, + 0x5C0B, 0x8CA4, 0x5C0C, 0x8CA5, 0x5C0D, 0x8CA6, 0x5C0E, 0x8CA7, 0x5C0F, 0xD0A1, 0x5C10, 0x8CA8, 0x5C11, 0xC9D9, 0x5C12, 0x8CA9, + 0x5C13, 0x8CAA, 0x5C14, 0xB6FB, 0x5C15, 0xE6D8, 0x5C16, 0xBCE2, 0x5C17, 0x8CAB, 0x5C18, 0xB3BE, 0x5C19, 0x8CAC, 0x5C1A, 0xC9D0, + 0x5C1B, 0x8CAD, 0x5C1C, 0xE6D9, 0x5C1D, 0xB3A2, 0x5C1E, 0x8CAE, 0x5C1F, 0x8CAF, 0x5C20, 0x8CB0, 0x5C21, 0x8CB1, 0x5C22, 0xDECC, + 0x5C23, 0x8CB2, 0x5C24, 0xD3C8, 0x5C25, 0xDECD, 0x5C26, 0x8CB3, 0x5C27, 0xD2A2, 0x5C28, 0x8CB4, 0x5C29, 0x8CB5, 0x5C2A, 0x8CB6, + 0x5C2B, 0x8CB7, 0x5C2C, 0xDECE, 0x5C2D, 0x8CB8, 0x5C2E, 0x8CB9, 0x5C2F, 0x8CBA, 0x5C30, 0x8CBB, 0x5C31, 0xBECD, 0x5C32, 0x8CBC, + 0x5C33, 0x8CBD, 0x5C34, 0xDECF, 0x5C35, 0x8CBE, 0x5C36, 0x8CBF, 0x5C37, 0x8CC0, 0x5C38, 0xCAAC, 0x5C39, 0xD2FC, 0x5C3A, 0xB3DF, + 0x5C3B, 0xE5EA, 0x5C3C, 0xC4E1, 0x5C3D, 0xBEA1, 0x5C3E, 0xCEB2, 0x5C3F, 0xC4F2, 0x5C40, 0xBED6, 0x5C41, 0xC6A8, 0x5C42, 0xB2E3, + 0x5C43, 0x8CC1, 0x5C44, 0x8CC2, 0x5C45, 0xBED3, 0x5C46, 0x8CC3, 0x5C47, 0x8CC4, 0x5C48, 0xC7FC, 0x5C49, 0xCCEB, 0x5C4A, 0xBDEC, + 0x5C4B, 0xCEDD, 0x5C4C, 0x8CC5, 0x5C4D, 0x8CC6, 0x5C4E, 0xCABA, 0x5C4F, 0xC6C1, 0x5C50, 0xE5EC, 0x5C51, 0xD0BC, 0x5C52, 0x8CC7, + 0x5C53, 0x8CC8, 0x5C54, 0x8CC9, 0x5C55, 0xD5B9, 0x5C56, 0x8CCA, 0x5C57, 0x8CCB, 0x5C58, 0x8CCC, 0x5C59, 0xE5ED, 0x5C5A, 0x8CCD, + 0x5C5B, 0x8CCE, 0x5C5C, 0x8CCF, 0x5C5D, 0x8CD0, 0x5C5E, 0xCAF4, 0x5C5F, 0x8CD1, 0x5C60, 0xCDC0, 0x5C61, 0xC2C5, 0x5C62, 0x8CD2, + 0x5C63, 0xE5EF, 0x5C64, 0x8CD3, 0x5C65, 0xC2C4, 0x5C66, 0xE5F0, 0x5C67, 0x8CD4, 0x5C68, 0x8CD5, 0x5C69, 0x8CD6, 0x5C6A, 0x8CD7, + 0x5C6B, 0x8CD8, 0x5C6C, 0x8CD9, 0x5C6D, 0x8CDA, 0x5C6E, 0xE5F8, 0x5C6F, 0xCDCD, 0x5C70, 0x8CDB, 0x5C71, 0xC9BD, 0x5C72, 0x8CDC, + 0x5C73, 0x8CDD, 0x5C74, 0x8CDE, 0x5C75, 0x8CDF, 0x5C76, 0x8CE0, 0x5C77, 0x8CE1, 0x5C78, 0x8CE2, 0x5C79, 0xD2D9, 0x5C7A, 0xE1A8, + 0x5C7B, 0x8CE3, 0x5C7C, 0x8CE4, 0x5C7D, 0x8CE5, 0x5C7E, 0x8CE6, 0x5C7F, 0xD3EC, 0x5C80, 0x8CE7, 0x5C81, 0xCBEA, 0x5C82, 0xC6F1, + 0x5C83, 0x8CE8, 0x5C84, 0x8CE9, 0x5C85, 0x8CEA, 0x5C86, 0x8CEB, 0x5C87, 0x8CEC, 0x5C88, 0xE1AC, 0x5C89, 0x8CED, 0x5C8A, 0x8CEE, + 0x5C8B, 0x8CEF, 0x5C8C, 0xE1A7, 0x5C8D, 0xE1A9, 0x5C8E, 0x8CF0, 0x5C8F, 0x8CF1, 0x5C90, 0xE1AA, 0x5C91, 0xE1AF, 0x5C92, 0x8CF2, + 0x5C93, 0x8CF3, 0x5C94, 0xB2ED, 0x5C95, 0x8CF4, 0x5C96, 0xE1AB, 0x5C97, 0xB8DA, 0x5C98, 0xE1AD, 0x5C99, 0xE1AE, 0x5C9A, 0xE1B0, + 0x5C9B, 0xB5BA, 0x5C9C, 0xE1B1, 0x5C9D, 0x8CF5, 0x5C9E, 0x8CF6, 0x5C9F, 0x8CF7, 0x5CA0, 0x8CF8, 0x5CA1, 0x8CF9, 0x5CA2, 0xE1B3, + 0x5CA3, 0xE1B8, 0x5CA4, 0x8CFA, 0x5CA5, 0x8CFB, 0x5CA6, 0x8CFC, 0x5CA7, 0x8CFD, 0x5CA8, 0x8CFE, 0x5CA9, 0xD1D2, 0x5CAA, 0x8D40, + 0x5CAB, 0xE1B6, 0x5CAC, 0xE1B5, 0x5CAD, 0xC1EB, 0x5CAE, 0x8D41, 0x5CAF, 0x8D42, 0x5CB0, 0x8D43, 0x5CB1, 0xE1B7, 0x5CB2, 0x8D44, + 0x5CB3, 0xD4C0, 0x5CB4, 0x8D45, 0x5CB5, 0xE1B2, 0x5CB6, 0x8D46, 0x5CB7, 0xE1BA, 0x5CB8, 0xB0B6, 0x5CB9, 0x8D47, 0x5CBA, 0x8D48, + 0x5CBB, 0x8D49, 0x5CBC, 0x8D4A, 0x5CBD, 0xE1B4, 0x5CBE, 0x8D4B, 0x5CBF, 0xBFF9, 0x5CC0, 0x8D4C, 0x5CC1, 0xE1B9, 0x5CC2, 0x8D4D, + 0x5CC3, 0x8D4E, 0x5CC4, 0xE1BB, 0x5CC5, 0x8D4F, 0x5CC6, 0x8D50, 0x5CC7, 0x8D51, 0x5CC8, 0x8D52, 0x5CC9, 0x8D53, 0x5CCA, 0x8D54, + 0x5CCB, 0xE1BE, 0x5CCC, 0x8D55, 0x5CCD, 0x8D56, 0x5CCE, 0x8D57, 0x5CCF, 0x8D58, 0x5CD0, 0x8D59, 0x5CD1, 0x8D5A, 0x5CD2, 0xE1BC, + 0x5CD3, 0x8D5B, 0x5CD4, 0x8D5C, 0x5CD5, 0x8D5D, 0x5CD6, 0x8D5E, 0x5CD7, 0x8D5F, 0x5CD8, 0x8D60, 0x5CD9, 0xD6C5, 0x5CDA, 0x8D61, + 0x5CDB, 0x8D62, 0x5CDC, 0x8D63, 0x5CDD, 0x8D64, 0x5CDE, 0x8D65, 0x5CDF, 0x8D66, 0x5CE0, 0x8D67, 0x5CE1, 0xCFBF, 0x5CE2, 0x8D68, + 0x5CE3, 0x8D69, 0x5CE4, 0xE1BD, 0x5CE5, 0xE1BF, 0x5CE6, 0xC2CD, 0x5CE7, 0x8D6A, 0x5CE8, 0xB6EB, 0x5CE9, 0x8D6B, 0x5CEA, 0xD3F8, + 0x5CEB, 0x8D6C, 0x5CEC, 0x8D6D, 0x5CED, 0xC7CD, 0x5CEE, 0x8D6E, 0x5CEF, 0x8D6F, 0x5CF0, 0xB7E5, 0x5CF1, 0x8D70, 0x5CF2, 0x8D71, + 0x5CF3, 0x8D72, 0x5CF4, 0x8D73, 0x5CF5, 0x8D74, 0x5CF6, 0x8D75, 0x5CF7, 0x8D76, 0x5CF8, 0x8D77, 0x5CF9, 0x8D78, 0x5CFA, 0x8D79, + 0x5CFB, 0xBEFE, 0x5CFC, 0x8D7A, 0x5CFD, 0x8D7B, 0x5CFE, 0x8D7C, 0x5CFF, 0x8D7D, 0x5D00, 0x8D7E, 0x5D01, 0x8D80, 0x5D02, 0xE1C0, + 0x5D03, 0xE1C1, 0x5D04, 0x8D81, 0x5D05, 0x8D82, 0x5D06, 0xE1C7, 0x5D07, 0xB3E7, 0x5D08, 0x8D83, 0x5D09, 0x8D84, 0x5D0A, 0x8D85, + 0x5D0B, 0x8D86, 0x5D0C, 0x8D87, 0x5D0D, 0x8D88, 0x5D0E, 0xC6E9, 0x5D0F, 0x8D89, 0x5D10, 0x8D8A, 0x5D11, 0x8D8B, 0x5D12, 0x8D8C, + 0x5D13, 0x8D8D, 0x5D14, 0xB4DE, 0x5D15, 0x8D8E, 0x5D16, 0xD1C2, 0x5D17, 0x8D8F, 0x5D18, 0x8D90, 0x5D19, 0x8D91, 0x5D1A, 0x8D92, + 0x5D1B, 0xE1C8, 0x5D1C, 0x8D93, 0x5D1D, 0x8D94, 0x5D1E, 0xE1C6, 0x5D1F, 0x8D95, 0x5D20, 0x8D96, 0x5D21, 0x8D97, 0x5D22, 0x8D98, + 0x5D23, 0x8D99, 0x5D24, 0xE1C5, 0x5D25, 0x8D9A, 0x5D26, 0xE1C3, 0x5D27, 0xE1C2, 0x5D28, 0x8D9B, 0x5D29, 0xB1C0, 0x5D2A, 0x8D9C, + 0x5D2B, 0x8D9D, 0x5D2C, 0x8D9E, 0x5D2D, 0xD5B8, 0x5D2E, 0xE1C4, 0x5D2F, 0x8D9F, 0x5D30, 0x8DA0, 0x5D31, 0x8DA1, 0x5D32, 0x8DA2, + 0x5D33, 0x8DA3, 0x5D34, 0xE1CB, 0x5D35, 0x8DA4, 0x5D36, 0x8DA5, 0x5D37, 0x8DA6, 0x5D38, 0x8DA7, 0x5D39, 0x8DA8, 0x5D3A, 0x8DA9, + 0x5D3B, 0x8DAA, 0x5D3C, 0x8DAB, 0x5D3D, 0xE1CC, 0x5D3E, 0xE1CA, 0x5D3F, 0x8DAC, 0x5D40, 0x8DAD, 0x5D41, 0x8DAE, 0x5D42, 0x8DAF, + 0x5D43, 0x8DB0, 0x5D44, 0x8DB1, 0x5D45, 0x8DB2, 0x5D46, 0x8DB3, 0x5D47, 0xEFFA, 0x5D48, 0x8DB4, 0x5D49, 0x8DB5, 0x5D4A, 0xE1D3, + 0x5D4B, 0xE1D2, 0x5D4C, 0xC7B6, 0x5D4D, 0x8DB6, 0x5D4E, 0x8DB7, 0x5D4F, 0x8DB8, 0x5D50, 0x8DB9, 0x5D51, 0x8DBA, 0x5D52, 0x8DBB, + 0x5D53, 0x8DBC, 0x5D54, 0x8DBD, 0x5D55, 0x8DBE, 0x5D56, 0x8DBF, 0x5D57, 0x8DC0, 0x5D58, 0xE1C9, 0x5D59, 0x8DC1, 0x5D5A, 0x8DC2, + 0x5D5B, 0xE1CE, 0x5D5C, 0x8DC3, 0x5D5D, 0xE1D0, 0x5D5E, 0x8DC4, 0x5D5F, 0x8DC5, 0x5D60, 0x8DC6, 0x5D61, 0x8DC7, 0x5D62, 0x8DC8, + 0x5D63, 0x8DC9, 0x5D64, 0x8DCA, 0x5D65, 0x8DCB, 0x5D66, 0x8DCC, 0x5D67, 0x8DCD, 0x5D68, 0x8DCE, 0x5D69, 0xE1D4, 0x5D6A, 0x8DCF, + 0x5D6B, 0xE1D1, 0x5D6C, 0xE1CD, 0x5D6D, 0x8DD0, 0x5D6E, 0x8DD1, 0x5D6F, 0xE1CF, 0x5D70, 0x8DD2, 0x5D71, 0x8DD3, 0x5D72, 0x8DD4, + 0x5D73, 0x8DD5, 0x5D74, 0xE1D5, 0x5D75, 0x8DD6, 0x5D76, 0x8DD7, 0x5D77, 0x8DD8, 0x5D78, 0x8DD9, 0x5D79, 0x8DDA, 0x5D7A, 0x8DDB, + 0x5D7B, 0x8DDC, 0x5D7C, 0x8DDD, 0x5D7D, 0x8DDE, 0x5D7E, 0x8DDF, 0x5D7F, 0x8DE0, 0x5D80, 0x8DE1, 0x5D81, 0x8DE2, 0x5D82, 0xE1D6, + 0x5D83, 0x8DE3, 0x5D84, 0x8DE4, 0x5D85, 0x8DE5, 0x5D86, 0x8DE6, 0x5D87, 0x8DE7, 0x5D88, 0x8DE8, 0x5D89, 0x8DE9, 0x5D8A, 0x8DEA, + 0x5D8B, 0x8DEB, 0x5D8C, 0x8DEC, 0x5D8D, 0x8DED, 0x5D8E, 0x8DEE, 0x5D8F, 0x8DEF, 0x5D90, 0x8DF0, 0x5D91, 0x8DF1, 0x5D92, 0x8DF2, + 0x5D93, 0x8DF3, 0x5D94, 0x8DF4, 0x5D95, 0x8DF5, 0x5D96, 0x8DF6, 0x5D97, 0x8DF7, 0x5D98, 0x8DF8, 0x5D99, 0xE1D7, 0x5D9A, 0x8DF9, + 0x5D9B, 0x8DFA, 0x5D9C, 0x8DFB, 0x5D9D, 0xE1D8, 0x5D9E, 0x8DFC, 0x5D9F, 0x8DFD, 0x5DA0, 0x8DFE, 0x5DA1, 0x8E40, 0x5DA2, 0x8E41, + 0x5DA3, 0x8E42, 0x5DA4, 0x8E43, 0x5DA5, 0x8E44, 0x5DA6, 0x8E45, 0x5DA7, 0x8E46, 0x5DA8, 0x8E47, 0x5DA9, 0x8E48, 0x5DAA, 0x8E49, + 0x5DAB, 0x8E4A, 0x5DAC, 0x8E4B, 0x5DAD, 0x8E4C, 0x5DAE, 0x8E4D, 0x5DAF, 0x8E4E, 0x5DB0, 0x8E4F, 0x5DB1, 0x8E50, 0x5DB2, 0x8E51, + 0x5DB3, 0x8E52, 0x5DB4, 0x8E53, 0x5DB5, 0x8E54, 0x5DB6, 0x8E55, 0x5DB7, 0xE1DA, 0x5DB8, 0x8E56, 0x5DB9, 0x8E57, 0x5DBA, 0x8E58, + 0x5DBB, 0x8E59, 0x5DBC, 0x8E5A, 0x5DBD, 0x8E5B, 0x5DBE, 0x8E5C, 0x5DBF, 0x8E5D, 0x5DC0, 0x8E5E, 0x5DC1, 0x8E5F, 0x5DC2, 0x8E60, + 0x5DC3, 0x8E61, 0x5DC4, 0x8E62, 0x5DC5, 0xE1DB, 0x5DC6, 0x8E63, 0x5DC7, 0x8E64, 0x5DC8, 0x8E65, 0x5DC9, 0x8E66, 0x5DCA, 0x8E67, + 0x5DCB, 0x8E68, 0x5DCC, 0x8E69, 0x5DCD, 0xCEA1, 0x5DCE, 0x8E6A, 0x5DCF, 0x8E6B, 0x5DD0, 0x8E6C, 0x5DD1, 0x8E6D, 0x5DD2, 0x8E6E, + 0x5DD3, 0x8E6F, 0x5DD4, 0x8E70, 0x5DD5, 0x8E71, 0x5DD6, 0x8E72, 0x5DD7, 0x8E73, 0x5DD8, 0x8E74, 0x5DD9, 0x8E75, 0x5DDA, 0x8E76, + 0x5DDB, 0xE7DD, 0x5DDC, 0x8E77, 0x5DDD, 0xB4A8, 0x5DDE, 0xD6DD, 0x5DDF, 0x8E78, 0x5DE0, 0x8E79, 0x5DE1, 0xD1B2, 0x5DE2, 0xB3B2, + 0x5DE3, 0x8E7A, 0x5DE4, 0x8E7B, 0x5DE5, 0xB9A4, 0x5DE6, 0xD7F3, 0x5DE7, 0xC7C9, 0x5DE8, 0xBEDE, 0x5DE9, 0xB9AE, 0x5DEA, 0x8E7C, + 0x5DEB, 0xCED7, 0x5DEC, 0x8E7D, 0x5DED, 0x8E7E, 0x5DEE, 0xB2EE, 0x5DEF, 0xDBCF, 0x5DF0, 0x8E80, 0x5DF1, 0xBCBA, 0x5DF2, 0xD2D1, + 0x5DF3, 0xCBC8, 0x5DF4, 0xB0CD, 0x5DF5, 0x8E81, 0x5DF6, 0x8E82, 0x5DF7, 0xCFEF, 0x5DF8, 0x8E83, 0x5DF9, 0x8E84, 0x5DFA, 0x8E85, + 0x5DFB, 0x8E86, 0x5DFC, 0x8E87, 0x5DFD, 0xD9E3, 0x5DFE, 0xBDED, 0x5DFF, 0x8E88, 0x5E00, 0x8E89, 0x5E01, 0xB1D2, 0x5E02, 0xCAD0, + 0x5E03, 0xB2BC, 0x5E04, 0x8E8A, 0x5E05, 0xCBA7, 0x5E06, 0xB7AB, 0x5E07, 0x8E8B, 0x5E08, 0xCAA6, 0x5E09, 0x8E8C, 0x5E0A, 0x8E8D, + 0x5E0B, 0x8E8E, 0x5E0C, 0xCFA3, 0x5E0D, 0x8E8F, 0x5E0E, 0x8E90, 0x5E0F, 0xE0F8, 0x5E10, 0xD5CA, 0x5E11, 0xE0FB, 0x5E12, 0x8E91, + 0x5E13, 0x8E92, 0x5E14, 0xE0FA, 0x5E15, 0xC5C1, 0x5E16, 0xCCFB, 0x5E17, 0x8E93, 0x5E18, 0xC1B1, 0x5E19, 0xE0F9, 0x5E1A, 0xD6E3, + 0x5E1B, 0xB2AF, 0x5E1C, 0xD6C4, 0x5E1D, 0xB5DB, 0x5E1E, 0x8E94, 0x5E1F, 0x8E95, 0x5E20, 0x8E96, 0x5E21, 0x8E97, 0x5E22, 0x8E98, + 0x5E23, 0x8E99, 0x5E24, 0x8E9A, 0x5E25, 0x8E9B, 0x5E26, 0xB4F8, 0x5E27, 0xD6A1, 0x5E28, 0x8E9C, 0x5E29, 0x8E9D, 0x5E2A, 0x8E9E, + 0x5E2B, 0x8E9F, 0x5E2C, 0x8EA0, 0x5E2D, 0xCFAF, 0x5E2E, 0xB0EF, 0x5E2F, 0x8EA1, 0x5E30, 0x8EA2, 0x5E31, 0xE0FC, 0x5E32, 0x8EA3, + 0x5E33, 0x8EA4, 0x5E34, 0x8EA5, 0x5E35, 0x8EA6, 0x5E36, 0x8EA7, 0x5E37, 0xE1A1, 0x5E38, 0xB3A3, 0x5E39, 0x8EA8, 0x5E3A, 0x8EA9, + 0x5E3B, 0xE0FD, 0x5E3C, 0xE0FE, 0x5E3D, 0xC3B1, 0x5E3E, 0x8EAA, 0x5E3F, 0x8EAB, 0x5E40, 0x8EAC, 0x5E41, 0x8EAD, 0x5E42, 0xC3DD, + 0x5E43, 0x8EAE, 0x5E44, 0xE1A2, 0x5E45, 0xB7F9, 0x5E46, 0x8EAF, 0x5E47, 0x8EB0, 0x5E48, 0x8EB1, 0x5E49, 0x8EB2, 0x5E4A, 0x8EB3, + 0x5E4B, 0x8EB4, 0x5E4C, 0xBBCF, 0x5E4D, 0x8EB5, 0x5E4E, 0x8EB6, 0x5E4F, 0x8EB7, 0x5E50, 0x8EB8, 0x5E51, 0x8EB9, 0x5E52, 0x8EBA, + 0x5E53, 0x8EBB, 0x5E54, 0xE1A3, 0x5E55, 0xC4BB, 0x5E56, 0x8EBC, 0x5E57, 0x8EBD, 0x5E58, 0x8EBE, 0x5E59, 0x8EBF, 0x5E5A, 0x8EC0, + 0x5E5B, 0xE1A4, 0x5E5C, 0x8EC1, 0x5E5D, 0x8EC2, 0x5E5E, 0xE1A5, 0x5E5F, 0x8EC3, 0x5E60, 0x8EC4, 0x5E61, 0xE1A6, 0x5E62, 0xB4B1, + 0x5E63, 0x8EC5, 0x5E64, 0x8EC6, 0x5E65, 0x8EC7, 0x5E66, 0x8EC8, 0x5E67, 0x8EC9, 0x5E68, 0x8ECA, 0x5E69, 0x8ECB, 0x5E6A, 0x8ECC, + 0x5E6B, 0x8ECD, 0x5E6C, 0x8ECE, 0x5E6D, 0x8ECF, 0x5E6E, 0x8ED0, 0x5E6F, 0x8ED1, 0x5E70, 0x8ED2, 0x5E71, 0x8ED3, 0x5E72, 0xB8C9, + 0x5E73, 0xC6BD, 0x5E74, 0xC4EA, 0x5E75, 0x8ED4, 0x5E76, 0xB2A2, 0x5E77, 0x8ED5, 0x5E78, 0xD0D2, 0x5E79, 0x8ED6, 0x5E7A, 0xE7DB, + 0x5E7B, 0xBBC3, 0x5E7C, 0xD3D7, 0x5E7D, 0xD3C4, 0x5E7E, 0x8ED7, 0x5E7F, 0xB9E3, 0x5E80, 0xE2CF, 0x5E81, 0x8ED8, 0x5E82, 0x8ED9, + 0x5E83, 0x8EDA, 0x5E84, 0xD7AF, 0x5E85, 0x8EDB, 0x5E86, 0xC7EC, 0x5E87, 0xB1D3, 0x5E88, 0x8EDC, 0x5E89, 0x8EDD, 0x5E8A, 0xB4B2, + 0x5E8B, 0xE2D1, 0x5E8C, 0x8EDE, 0x5E8D, 0x8EDF, 0x5E8E, 0x8EE0, 0x5E8F, 0xD0F2, 0x5E90, 0xC2AE, 0x5E91, 0xE2D0, 0x5E92, 0x8EE1, + 0x5E93, 0xBFE2, 0x5E94, 0xD3A6, 0x5E95, 0xB5D7, 0x5E96, 0xE2D2, 0x5E97, 0xB5EA, 0x5E98, 0x8EE2, 0x5E99, 0xC3ED, 0x5E9A, 0xB8FD, + 0x5E9B, 0x8EE3, 0x5E9C, 0xB8AE, 0x5E9D, 0x8EE4, 0x5E9E, 0xC5D3, 0x5E9F, 0xB7CF, 0x5EA0, 0xE2D4, 0x5EA1, 0x8EE5, 0x5EA2, 0x8EE6, + 0x5EA3, 0x8EE7, 0x5EA4, 0x8EE8, 0x5EA5, 0xE2D3, 0x5EA6, 0xB6C8, 0x5EA7, 0xD7F9, 0x5EA8, 0x8EE9, 0x5EA9, 0x8EEA, 0x5EAA, 0x8EEB, + 0x5EAB, 0x8EEC, 0x5EAC, 0x8EED, 0x5EAD, 0xCDA5, 0x5EAE, 0x8EEE, 0x5EAF, 0x8EEF, 0x5EB0, 0x8EF0, 0x5EB1, 0x8EF1, 0x5EB2, 0x8EF2, + 0x5EB3, 0xE2D8, 0x5EB4, 0x8EF3, 0x5EB5, 0xE2D6, 0x5EB6, 0xCAFC, 0x5EB7, 0xBFB5, 0x5EB8, 0xD3B9, 0x5EB9, 0xE2D5, 0x5EBA, 0x8EF4, + 0x5EBB, 0x8EF5, 0x5EBC, 0x8EF6, 0x5EBD, 0x8EF7, 0x5EBE, 0xE2D7, 0x5EBF, 0x8EF8, 0x5EC0, 0x8EF9, 0x5EC1, 0x8EFA, 0x5EC2, 0x8EFB, + 0x5EC3, 0x8EFC, 0x5EC4, 0x8EFD, 0x5EC5, 0x8EFE, 0x5EC6, 0x8F40, 0x5EC7, 0x8F41, 0x5EC8, 0x8F42, 0x5EC9, 0xC1AE, 0x5ECA, 0xC0C8, + 0x5ECB, 0x8F43, 0x5ECC, 0x8F44, 0x5ECD, 0x8F45, 0x5ECE, 0x8F46, 0x5ECF, 0x8F47, 0x5ED0, 0x8F48, 0x5ED1, 0xE2DB, 0x5ED2, 0xE2DA, + 0x5ED3, 0xC0AA, 0x5ED4, 0x8F49, 0x5ED5, 0x8F4A, 0x5ED6, 0xC1CE, 0x5ED7, 0x8F4B, 0x5ED8, 0x8F4C, 0x5ED9, 0x8F4D, 0x5EDA, 0x8F4E, + 0x5EDB, 0xE2DC, 0x5EDC, 0x8F4F, 0x5EDD, 0x8F50, 0x5EDE, 0x8F51, 0x5EDF, 0x8F52, 0x5EE0, 0x8F53, 0x5EE1, 0x8F54, 0x5EE2, 0x8F55, + 0x5EE3, 0x8F56, 0x5EE4, 0x8F57, 0x5EE5, 0x8F58, 0x5EE6, 0x8F59, 0x5EE7, 0x8F5A, 0x5EE8, 0xE2DD, 0x5EE9, 0x8F5B, 0x5EEA, 0xE2DE, + 0x5EEB, 0x8F5C, 0x5EEC, 0x8F5D, 0x5EED, 0x8F5E, 0x5EEE, 0x8F5F, 0x5EEF, 0x8F60, 0x5EF0, 0x8F61, 0x5EF1, 0x8F62, 0x5EF2, 0x8F63, + 0x5EF3, 0x8F64, 0x5EF4, 0xDBC8, 0x5EF5, 0x8F65, 0x5EF6, 0xD1D3, 0x5EF7, 0xCDA2, 0x5EF8, 0x8F66, 0x5EF9, 0x8F67, 0x5EFA, 0xBDA8, + 0x5EFB, 0x8F68, 0x5EFC, 0x8F69, 0x5EFD, 0x8F6A, 0x5EFE, 0xDEC3, 0x5EFF, 0xD8A5, 0x5F00, 0xBFAA, 0x5F01, 0xDBCD, 0x5F02, 0xD2EC, + 0x5F03, 0xC6FA, 0x5F04, 0xC5AA, 0x5F05, 0x8F6B, 0x5F06, 0x8F6C, 0x5F07, 0x8F6D, 0x5F08, 0xDEC4, 0x5F09, 0x8F6E, 0x5F0A, 0xB1D7, + 0x5F0B, 0xDFAE, 0x5F0C, 0x8F6F, 0x5F0D, 0x8F70, 0x5F0E, 0x8F71, 0x5F0F, 0xCABD, 0x5F10, 0x8F72, 0x5F11, 0xDFB1, 0x5F12, 0x8F73, + 0x5F13, 0xB9AD, 0x5F14, 0x8F74, 0x5F15, 0xD2FD, 0x5F16, 0x8F75, 0x5F17, 0xB8A5, 0x5F18, 0xBAEB, 0x5F19, 0x8F76, 0x5F1A, 0x8F77, + 0x5F1B, 0xB3DA, 0x5F1C, 0x8F78, 0x5F1D, 0x8F79, 0x5F1E, 0x8F7A, 0x5F1F, 0xB5DC, 0x5F20, 0xD5C5, 0x5F21, 0x8F7B, 0x5F22, 0x8F7C, + 0x5F23, 0x8F7D, 0x5F24, 0x8F7E, 0x5F25, 0xC3D6, 0x5F26, 0xCFD2, 0x5F27, 0xBBA1, 0x5F28, 0x8F80, 0x5F29, 0xE5F3, 0x5F2A, 0xE5F2, + 0x5F2B, 0x8F81, 0x5F2C, 0x8F82, 0x5F2D, 0xE5F4, 0x5F2E, 0x8F83, 0x5F2F, 0xCDE4, 0x5F30, 0x8F84, 0x5F31, 0xC8F5, 0x5F32, 0x8F85, + 0x5F33, 0x8F86, 0x5F34, 0x8F87, 0x5F35, 0x8F88, 0x5F36, 0x8F89, 0x5F37, 0x8F8A, 0x5F38, 0x8F8B, 0x5F39, 0xB5AF, 0x5F3A, 0xC7BF, + 0x5F3B, 0x8F8C, 0x5F3C, 0xE5F6, 0x5F3D, 0x8F8D, 0x5F3E, 0x8F8E, 0x5F3F, 0x8F8F, 0x5F40, 0xECB0, 0x5F41, 0x8F90, 0x5F42, 0x8F91, + 0x5F43, 0x8F92, 0x5F44, 0x8F93, 0x5F45, 0x8F94, 0x5F46, 0x8F95, 0x5F47, 0x8F96, 0x5F48, 0x8F97, 0x5F49, 0x8F98, 0x5F4A, 0x8F99, + 0x5F4B, 0x8F9A, 0x5F4C, 0x8F9B, 0x5F4D, 0x8F9C, 0x5F4E, 0x8F9D, 0x5F4F, 0x8F9E, 0x5F50, 0xE5E6, 0x5F51, 0x8F9F, 0x5F52, 0xB9E9, + 0x5F53, 0xB5B1, 0x5F54, 0x8FA0, 0x5F55, 0xC2BC, 0x5F56, 0xE5E8, 0x5F57, 0xE5E7, 0x5F58, 0xE5E9, 0x5F59, 0x8FA1, 0x5F5A, 0x8FA2, + 0x5F5B, 0x8FA3, 0x5F5C, 0x8FA4, 0x5F5D, 0xD2CD, 0x5F5E, 0x8FA5, 0x5F5F, 0x8FA6, 0x5F60, 0x8FA7, 0x5F61, 0xE1EA, 0x5F62, 0xD0CE, + 0x5F63, 0x8FA8, 0x5F64, 0xCDAE, 0x5F65, 0x8FA9, 0x5F66, 0xD1E5, 0x5F67, 0x8FAA, 0x5F68, 0x8FAB, 0x5F69, 0xB2CA, 0x5F6A, 0xB1EB, + 0x5F6B, 0x8FAC, 0x5F6C, 0xB1F2, 0x5F6D, 0xC5ED, 0x5F6E, 0x8FAD, 0x5F6F, 0x8FAE, 0x5F70, 0xD5C3, 0x5F71, 0xD3B0, 0x5F72, 0x8FAF, + 0x5F73, 0xE1DC, 0x5F74, 0x8FB0, 0x5F75, 0x8FB1, 0x5F76, 0x8FB2, 0x5F77, 0xE1DD, 0x5F78, 0x8FB3, 0x5F79, 0xD2DB, 0x5F7A, 0x8FB4, + 0x5F7B, 0xB3B9, 0x5F7C, 0xB1CB, 0x5F7D, 0x8FB5, 0x5F7E, 0x8FB6, 0x5F7F, 0x8FB7, 0x5F80, 0xCDF9, 0x5F81, 0xD5F7, 0x5F82, 0xE1DE, + 0x5F83, 0x8FB8, 0x5F84, 0xBEB6, 0x5F85, 0xB4FD, 0x5F86, 0x8FB9, 0x5F87, 0xE1DF, 0x5F88, 0xBADC, 0x5F89, 0xE1E0, 0x5F8A, 0xBBB2, + 0x5F8B, 0xC2C9, 0x5F8C, 0xE1E1, 0x5F8D, 0x8FBA, 0x5F8E, 0x8FBB, 0x5F8F, 0x8FBC, 0x5F90, 0xD0EC, 0x5F91, 0x8FBD, 0x5F92, 0xCDBD, + 0x5F93, 0x8FBE, 0x5F94, 0x8FBF, 0x5F95, 0xE1E2, 0x5F96, 0x8FC0, 0x5F97, 0xB5C3, 0x5F98, 0xC5C7, 0x5F99, 0xE1E3, 0x5F9A, 0x8FC1, + 0x5F9B, 0x8FC2, 0x5F9C, 0xE1E4, 0x5F9D, 0x8FC3, 0x5F9E, 0x8FC4, 0x5F9F, 0x8FC5, 0x5FA0, 0x8FC6, 0x5FA1, 0xD3F9, 0x5FA2, 0x8FC7, + 0x5FA3, 0x8FC8, 0x5FA4, 0x8FC9, 0x5FA5, 0x8FCA, 0x5FA6, 0x8FCB, 0x5FA7, 0x8FCC, 0x5FA8, 0xE1E5, 0x5FA9, 0x8FCD, 0x5FAA, 0xD1AD, + 0x5FAB, 0x8FCE, 0x5FAC, 0x8FCF, 0x5FAD, 0xE1E6, 0x5FAE, 0xCEA2, 0x5FAF, 0x8FD0, 0x5FB0, 0x8FD1, 0x5FB1, 0x8FD2, 0x5FB2, 0x8FD3, + 0x5FB3, 0x8FD4, 0x5FB4, 0x8FD5, 0x5FB5, 0xE1E7, 0x5FB6, 0x8FD6, 0x5FB7, 0xB5C2, 0x5FB8, 0x8FD7, 0x5FB9, 0x8FD8, 0x5FBA, 0x8FD9, + 0x5FBB, 0x8FDA, 0x5FBC, 0xE1E8, 0x5FBD, 0xBBD5, 0x5FBE, 0x8FDB, 0x5FBF, 0x8FDC, 0x5FC0, 0x8FDD, 0x5FC1, 0x8FDE, 0x5FC2, 0x8FDF, + 0x5FC3, 0xD0C4, 0x5FC4, 0xE2E0, 0x5FC5, 0xB1D8, 0x5FC6, 0xD2E4, 0x5FC7, 0x8FE0, 0x5FC8, 0x8FE1, 0x5FC9, 0xE2E1, 0x5FCA, 0x8FE2, + 0x5FCB, 0x8FE3, 0x5FCC, 0xBCC9, 0x5FCD, 0xC8CC, 0x5FCE, 0x8FE4, 0x5FCF, 0xE2E3, 0x5FD0, 0xECFE, 0x5FD1, 0xECFD, 0x5FD2, 0xDFAF, + 0x5FD3, 0x8FE5, 0x5FD4, 0x8FE6, 0x5FD5, 0x8FE7, 0x5FD6, 0xE2E2, 0x5FD7, 0xD6BE, 0x5FD8, 0xCDFC, 0x5FD9, 0xC3A6, 0x5FDA, 0x8FE8, + 0x5FDB, 0x8FE9, 0x5FDC, 0x8FEA, 0x5FDD, 0xE3C3, 0x5FDE, 0x8FEB, 0x5FDF, 0x8FEC, 0x5FE0, 0xD6D2, 0x5FE1, 0xE2E7, 0x5FE2, 0x8FED, + 0x5FE3, 0x8FEE, 0x5FE4, 0xE2E8, 0x5FE5, 0x8FEF, 0x5FE6, 0x8FF0, 0x5FE7, 0xD3C7, 0x5FE8, 0x8FF1, 0x5FE9, 0x8FF2, 0x5FEA, 0xE2EC, + 0x5FEB, 0xBFEC, 0x5FEC, 0x8FF3, 0x5FED, 0xE2ED, 0x5FEE, 0xE2E5, 0x5FEF, 0x8FF4, 0x5FF0, 0x8FF5, 0x5FF1, 0xB3C0, 0x5FF2, 0x8FF6, + 0x5FF3, 0x8FF7, 0x5FF4, 0x8FF8, 0x5FF5, 0xC4EE, 0x5FF6, 0x8FF9, 0x5FF7, 0x8FFA, 0x5FF8, 0xE2EE, 0x5FF9, 0x8FFB, 0x5FFA, 0x8FFC, + 0x5FFB, 0xD0C3, 0x5FFC, 0x8FFD, 0x5FFD, 0xBAF6, 0x5FFE, 0xE2E9, 0x5FFF, 0xB7DE, 0x6000, 0xBBB3, 0x6001, 0xCCAC, 0x6002, 0xCBCB, + 0x6003, 0xE2E4, 0x6004, 0xE2E6, 0x6005, 0xE2EA, 0x6006, 0xE2EB, 0x6007, 0x8FFE, 0x6008, 0x9040, 0x6009, 0x9041, 0x600A, 0xE2F7, + 0x600B, 0x9042, 0x600C, 0x9043, 0x600D, 0xE2F4, 0x600E, 0xD4F5, 0x600F, 0xE2F3, 0x6010, 0x9044, 0x6011, 0x9045, 0x6012, 0xC5AD, + 0x6013, 0x9046, 0x6014, 0xD5FA, 0x6015, 0xC5C2, 0x6016, 0xB2C0, 0x6017, 0x9047, 0x6018, 0x9048, 0x6019, 0xE2EF, 0x601A, 0x9049, + 0x601B, 0xE2F2, 0x601C, 0xC1AF, 0x601D, 0xCBBC, 0x601E, 0x904A, 0x601F, 0x904B, 0x6020, 0xB5A1, 0x6021, 0xE2F9, 0x6022, 0x904C, + 0x6023, 0x904D, 0x6024, 0x904E, 0x6025, 0xBCB1, 0x6026, 0xE2F1, 0x6027, 0xD0D4, 0x6028, 0xD4B9, 0x6029, 0xE2F5, 0x602A, 0xB9D6, + 0x602B, 0xE2F6, 0x602C, 0x904F, 0x602D, 0x9050, 0x602E, 0x9051, 0x602F, 0xC7D3, 0x6030, 0x9052, 0x6031, 0x9053, 0x6032, 0x9054, + 0x6033, 0x9055, 0x6034, 0x9056, 0x6035, 0xE2F0, 0x6036, 0x9057, 0x6037, 0x9058, 0x6038, 0x9059, 0x6039, 0x905A, 0x603A, 0x905B, + 0x603B, 0xD7DC, 0x603C, 0xEDA1, 0x603D, 0x905C, 0x603E, 0x905D, 0x603F, 0xE2F8, 0x6040, 0x905E, 0x6041, 0xEDA5, 0x6042, 0xE2FE, + 0x6043, 0xCAD1, 0x6044, 0x905F, 0x6045, 0x9060, 0x6046, 0x9061, 0x6047, 0x9062, 0x6048, 0x9063, 0x6049, 0x9064, 0x604A, 0x9065, + 0x604B, 0xC1B5, 0x604C, 0x9066, 0x604D, 0xBBD0, 0x604E, 0x9067, 0x604F, 0x9068, 0x6050, 0xBFD6, 0x6051, 0x9069, 0x6052, 0xBAE3, + 0x6053, 0x906A, 0x6054, 0x906B, 0x6055, 0xCBA1, 0x6056, 0x906C, 0x6057, 0x906D, 0x6058, 0x906E, 0x6059, 0xEDA6, 0x605A, 0xEDA3, + 0x605B, 0x906F, 0x605C, 0x9070, 0x605D, 0xEDA2, 0x605E, 0x9071, 0x605F, 0x9072, 0x6060, 0x9073, 0x6061, 0x9074, 0x6062, 0xBBD6, + 0x6063, 0xEDA7, 0x6064, 0xD0F4, 0x6065, 0x9075, 0x6066, 0x9076, 0x6067, 0xEDA4, 0x6068, 0xBADE, 0x6069, 0xB6F7, 0x606A, 0xE3A1, + 0x606B, 0xB6B2, 0x606C, 0xCCF1, 0x606D, 0xB9A7, 0x606E, 0x9077, 0x606F, 0xCFA2, 0x6070, 0xC7A1, 0x6071, 0x9078, 0x6072, 0x9079, + 0x6073, 0xBFD2, 0x6074, 0x907A, 0x6075, 0x907B, 0x6076, 0xB6F1, 0x6077, 0x907C, 0x6078, 0xE2FA, 0x6079, 0xE2FB, 0x607A, 0xE2FD, + 0x607B, 0xE2FC, 0x607C, 0xC4D5, 0x607D, 0xE3A2, 0x607E, 0x907D, 0x607F, 0xD3C1, 0x6080, 0x907E, 0x6081, 0x9080, 0x6082, 0x9081, + 0x6083, 0xE3A7, 0x6084, 0xC7C4, 0x6085, 0x9082, 0x6086, 0x9083, 0x6087, 0x9084, 0x6088, 0x9085, 0x6089, 0xCFA4, 0x608A, 0x9086, + 0x608B, 0x9087, 0x608C, 0xE3A9, 0x608D, 0xBAB7, 0x608E, 0x9088, 0x608F, 0x9089, 0x6090, 0x908A, 0x6091, 0x908B, 0x6092, 0xE3A8, + 0x6093, 0x908C, 0x6094, 0xBBDA, 0x6095, 0x908D, 0x6096, 0xE3A3, 0x6097, 0x908E, 0x6098, 0x908F, 0x6099, 0x9090, 0x609A, 0xE3A4, + 0x609B, 0xE3AA, 0x609C, 0x9091, 0x609D, 0xE3A6, 0x609E, 0x9092, 0x609F, 0xCEF2, 0x60A0, 0xD3C6, 0x60A1, 0x9093, 0x60A2, 0x9094, + 0x60A3, 0xBBBC, 0x60A4, 0x9095, 0x60A5, 0x9096, 0x60A6, 0xD4C3, 0x60A7, 0x9097, 0x60A8, 0xC4FA, 0x60A9, 0x9098, 0x60AA, 0x9099, + 0x60AB, 0xEDA8, 0x60AC, 0xD0FC, 0x60AD, 0xE3A5, 0x60AE, 0x909A, 0x60AF, 0xC3F5, 0x60B0, 0x909B, 0x60B1, 0xE3AD, 0x60B2, 0xB1AF, + 0x60B3, 0x909C, 0x60B4, 0xE3B2, 0x60B5, 0x909D, 0x60B6, 0x909E, 0x60B7, 0x909F, 0x60B8, 0xBCC2, 0x60B9, 0x90A0, 0x60BA, 0x90A1, + 0x60BB, 0xE3AC, 0x60BC, 0xB5BF, 0x60BD, 0x90A2, 0x60BE, 0x90A3, 0x60BF, 0x90A4, 0x60C0, 0x90A5, 0x60C1, 0x90A6, 0x60C2, 0x90A7, + 0x60C3, 0x90A8, 0x60C4, 0x90A9, 0x60C5, 0xC7E9, 0x60C6, 0xE3B0, 0x60C7, 0x90AA, 0x60C8, 0x90AB, 0x60C9, 0x90AC, 0x60CA, 0xBEAA, + 0x60CB, 0xCDEF, 0x60CC, 0x90AD, 0x60CD, 0x90AE, 0x60CE, 0x90AF, 0x60CF, 0x90B0, 0x60D0, 0x90B1, 0x60D1, 0xBBF3, 0x60D2, 0x90B2, + 0x60D3, 0x90B3, 0x60D4, 0x90B4, 0x60D5, 0xCCE8, 0x60D6, 0x90B5, 0x60D7, 0x90B6, 0x60D8, 0xE3AF, 0x60D9, 0x90B7, 0x60DA, 0xE3B1, + 0x60DB, 0x90B8, 0x60DC, 0xCFA7, 0x60DD, 0xE3AE, 0x60DE, 0x90B9, 0x60DF, 0xCEA9, 0x60E0, 0xBBDD, 0x60E1, 0x90BA, 0x60E2, 0x90BB, + 0x60E3, 0x90BC, 0x60E4, 0x90BD, 0x60E5, 0x90BE, 0x60E6, 0xB5EB, 0x60E7, 0xBEE5, 0x60E8, 0xB2D2, 0x60E9, 0xB3CD, 0x60EA, 0x90BF, + 0x60EB, 0xB1B9, 0x60EC, 0xE3AB, 0x60ED, 0xB2D1, 0x60EE, 0xB5AC, 0x60EF, 0xB9DF, 0x60F0, 0xB6E8, 0x60F1, 0x90C0, 0x60F2, 0x90C1, + 0x60F3, 0xCFEB, 0x60F4, 0xE3B7, 0x60F5, 0x90C2, 0x60F6, 0xBBCC, 0x60F7, 0x90C3, 0x60F8, 0x90C4, 0x60F9, 0xC8C7, 0x60FA, 0xD0CA, + 0x60FB, 0x90C5, 0x60FC, 0x90C6, 0x60FD, 0x90C7, 0x60FE, 0x90C8, 0x60FF, 0x90C9, 0x6100, 0xE3B8, 0x6101, 0xB3EE, 0x6102, 0x90CA, + 0x6103, 0x90CB, 0x6104, 0x90CC, 0x6105, 0x90CD, 0x6106, 0xEDA9, 0x6107, 0x90CE, 0x6108, 0xD3FA, 0x6109, 0xD3E4, 0x610A, 0x90CF, + 0x610B, 0x90D0, 0x610C, 0x90D1, 0x610D, 0xEDAA, 0x610E, 0xE3B9, 0x610F, 0xD2E2, 0x6110, 0x90D2, 0x6111, 0x90D3, 0x6112, 0x90D4, + 0x6113, 0x90D5, 0x6114, 0x90D6, 0x6115, 0xE3B5, 0x6116, 0x90D7, 0x6117, 0x90D8, 0x6118, 0x90D9, 0x6119, 0x90DA, 0x611A, 0xD3DE, + 0x611B, 0x90DB, 0x611C, 0x90DC, 0x611D, 0x90DD, 0x611E, 0x90DE, 0x611F, 0xB8D0, 0x6120, 0xE3B3, 0x6121, 0x90DF, 0x6122, 0x90E0, + 0x6123, 0xE3B6, 0x6124, 0xB7DF, 0x6125, 0x90E1, 0x6126, 0xE3B4, 0x6127, 0xC0A2, 0x6128, 0x90E2, 0x6129, 0x90E3, 0x612A, 0x90E4, + 0x612B, 0xE3BA, 0x612C, 0x90E5, 0x612D, 0x90E6, 0x612E, 0x90E7, 0x612F, 0x90E8, 0x6130, 0x90E9, 0x6131, 0x90EA, 0x6132, 0x90EB, + 0x6133, 0x90EC, 0x6134, 0x90ED, 0x6135, 0x90EE, 0x6136, 0x90EF, 0x6137, 0x90F0, 0x6138, 0x90F1, 0x6139, 0x90F2, 0x613A, 0x90F3, + 0x613B, 0x90F4, 0x613C, 0x90F5, 0x613D, 0x90F6, 0x613E, 0x90F7, 0x613F, 0xD4B8, 0x6140, 0x90F8, 0x6141, 0x90F9, 0x6142, 0x90FA, + 0x6143, 0x90FB, 0x6144, 0x90FC, 0x6145, 0x90FD, 0x6146, 0x90FE, 0x6147, 0x9140, 0x6148, 0xB4C8, 0x6149, 0x9141, 0x614A, 0xE3BB, + 0x614B, 0x9142, 0x614C, 0xBBC5, 0x614D, 0x9143, 0x614E, 0xC9F7, 0x614F, 0x9144, 0x6150, 0x9145, 0x6151, 0xC9E5, 0x6152, 0x9146, + 0x6153, 0x9147, 0x6154, 0x9148, 0x6155, 0xC4BD, 0x6156, 0x9149, 0x6157, 0x914A, 0x6158, 0x914B, 0x6159, 0x914C, 0x615A, 0x914D, + 0x615B, 0x914E, 0x615C, 0x914F, 0x615D, 0xEDAB, 0x615E, 0x9150, 0x615F, 0x9151, 0x6160, 0x9152, 0x6161, 0x9153, 0x6162, 0xC2FD, + 0x6163, 0x9154, 0x6164, 0x9155, 0x6165, 0x9156, 0x6166, 0x9157, 0x6167, 0xBBDB, 0x6168, 0xBFAE, 0x6169, 0x9158, 0x616A, 0x9159, + 0x616B, 0x915A, 0x616C, 0x915B, 0x616D, 0x915C, 0x616E, 0x915D, 0x616F, 0x915E, 0x6170, 0xCEBF, 0x6171, 0x915F, 0x6172, 0x9160, + 0x6173, 0x9161, 0x6174, 0x9162, 0x6175, 0xE3BC, 0x6176, 0x9163, 0x6177, 0xBFB6, 0x6178, 0x9164, 0x6179, 0x9165, 0x617A, 0x9166, + 0x617B, 0x9167, 0x617C, 0x9168, 0x617D, 0x9169, 0x617E, 0x916A, 0x617F, 0x916B, 0x6180, 0x916C, 0x6181, 0x916D, 0x6182, 0x916E, + 0x6183, 0x916F, 0x6184, 0x9170, 0x6185, 0x9171, 0x6186, 0x9172, 0x6187, 0x9173, 0x6188, 0x9174, 0x6189, 0x9175, 0x618A, 0x9176, + 0x618B, 0xB1EF, 0x618C, 0x9177, 0x618D, 0x9178, 0x618E, 0xD4F7, 0x618F, 0x9179, 0x6190, 0x917A, 0x6191, 0x917B, 0x6192, 0x917C, + 0x6193, 0x917D, 0x6194, 0xE3BE, 0x6195, 0x917E, 0x6196, 0x9180, 0x6197, 0x9181, 0x6198, 0x9182, 0x6199, 0x9183, 0x619A, 0x9184, + 0x619B, 0x9185, 0x619C, 0x9186, 0x619D, 0xEDAD, 0x619E, 0x9187, 0x619F, 0x9188, 0x61A0, 0x9189, 0x61A1, 0x918A, 0x61A2, 0x918B, + 0x61A3, 0x918C, 0x61A4, 0x918D, 0x61A5, 0x918E, 0x61A6, 0x918F, 0x61A7, 0xE3BF, 0x61A8, 0xBAA9, 0x61A9, 0xEDAC, 0x61AA, 0x9190, + 0x61AB, 0x9191, 0x61AC, 0xE3BD, 0x61AD, 0x9192, 0x61AE, 0x9193, 0x61AF, 0x9194, 0x61B0, 0x9195, 0x61B1, 0x9196, 0x61B2, 0x9197, + 0x61B3, 0x9198, 0x61B4, 0x9199, 0x61B5, 0x919A, 0x61B6, 0x919B, 0x61B7, 0xE3C0, 0x61B8, 0x919C, 0x61B9, 0x919D, 0x61BA, 0x919E, + 0x61BB, 0x919F, 0x61BC, 0x91A0, 0x61BD, 0x91A1, 0x61BE, 0xBAB6, 0x61BF, 0x91A2, 0x61C0, 0x91A3, 0x61C1, 0x91A4, 0x61C2, 0xB6AE, + 0x61C3, 0x91A5, 0x61C4, 0x91A6, 0x61C5, 0x91A7, 0x61C6, 0x91A8, 0x61C7, 0x91A9, 0x61C8, 0xD0B8, 0x61C9, 0x91AA, 0x61CA, 0xB0C3, + 0x61CB, 0xEDAE, 0x61CC, 0x91AB, 0x61CD, 0x91AC, 0x61CE, 0x91AD, 0x61CF, 0x91AE, 0x61D0, 0x91AF, 0x61D1, 0xEDAF, 0x61D2, 0xC0C1, + 0x61D3, 0x91B0, 0x61D4, 0xE3C1, 0x61D5, 0x91B1, 0x61D6, 0x91B2, 0x61D7, 0x91B3, 0x61D8, 0x91B4, 0x61D9, 0x91B5, 0x61DA, 0x91B6, + 0x61DB, 0x91B7, 0x61DC, 0x91B8, 0x61DD, 0x91B9, 0x61DE, 0x91BA, 0x61DF, 0x91BB, 0x61E0, 0x91BC, 0x61E1, 0x91BD, 0x61E2, 0x91BE, + 0x61E3, 0x91BF, 0x61E4, 0x91C0, 0x61E5, 0x91C1, 0x61E6, 0xC5B3, 0x61E7, 0x91C2, 0x61E8, 0x91C3, 0x61E9, 0x91C4, 0x61EA, 0x91C5, + 0x61EB, 0x91C6, 0x61EC, 0x91C7, 0x61ED, 0x91C8, 0x61EE, 0x91C9, 0x61EF, 0x91CA, 0x61F0, 0x91CB, 0x61F1, 0x91CC, 0x61F2, 0x91CD, + 0x61F3, 0x91CE, 0x61F4, 0x91CF, 0x61F5, 0xE3C2, 0x61F6, 0x91D0, 0x61F7, 0x91D1, 0x61F8, 0x91D2, 0x61F9, 0x91D3, 0x61FA, 0x91D4, + 0x61FB, 0x91D5, 0x61FC, 0x91D6, 0x61FD, 0x91D7, 0x61FE, 0x91D8, 0x61FF, 0xDCB2, 0x6200, 0x91D9, 0x6201, 0x91DA, 0x6202, 0x91DB, + 0x6203, 0x91DC, 0x6204, 0x91DD, 0x6205, 0x91DE, 0x6206, 0xEDB0, 0x6207, 0x91DF, 0x6208, 0xB8EA, 0x6209, 0x91E0, 0x620A, 0xCEEC, + 0x620B, 0xEAA7, 0x620C, 0xD0E7, 0x620D, 0xCAF9, 0x620E, 0xC8D6, 0x620F, 0xCFB7, 0x6210, 0xB3C9, 0x6211, 0xCED2, 0x6212, 0xBDE4, + 0x6213, 0x91E1, 0x6214, 0x91E2, 0x6215, 0xE3DE, 0x6216, 0xBBF2, 0x6217, 0xEAA8, 0x6218, 0xD5BD, 0x6219, 0x91E3, 0x621A, 0xC6DD, + 0x621B, 0xEAA9, 0x621C, 0x91E4, 0x621D, 0x91E5, 0x621E, 0x91E6, 0x621F, 0xEAAA, 0x6220, 0x91E7, 0x6221, 0xEAAC, 0x6222, 0xEAAB, + 0x6223, 0x91E8, 0x6224, 0xEAAE, 0x6225, 0xEAAD, 0x6226, 0x91E9, 0x6227, 0x91EA, 0x6228, 0x91EB, 0x6229, 0x91EC, 0x622A, 0xBDD8, + 0x622B, 0x91ED, 0x622C, 0xEAAF, 0x622D, 0x91EE, 0x622E, 0xC2BE, 0x622F, 0x91EF, 0x6230, 0x91F0, 0x6231, 0x91F1, 0x6232, 0x91F2, + 0x6233, 0xB4C1, 0x6234, 0xB4F7, 0x6235, 0x91F3, 0x6236, 0x91F4, 0x6237, 0xBBA7, 0x6238, 0x91F5, 0x6239, 0x91F6, 0x623A, 0x91F7, + 0x623B, 0x91F8, 0x623C, 0x91F9, 0x623D, 0xECE6, 0x623E, 0xECE5, 0x623F, 0xB7BF, 0x6240, 0xCBF9, 0x6241, 0xB1E2, 0x6242, 0x91FA, + 0x6243, 0xECE7, 0x6244, 0x91FB, 0x6245, 0x91FC, 0x6246, 0x91FD, 0x6247, 0xC9C8, 0x6248, 0xECE8, 0x6249, 0xECE9, 0x624A, 0x91FE, + 0x624B, 0xCAD6, 0x624C, 0xDED0, 0x624D, 0xB2C5, 0x624E, 0xD4FA, 0x624F, 0x9240, 0x6250, 0x9241, 0x6251, 0xC6CB, 0x6252, 0xB0C7, + 0x6253, 0xB4F2, 0x6254, 0xC8D3, 0x6255, 0x9242, 0x6256, 0x9243, 0x6257, 0x9244, 0x6258, 0xCDD0, 0x6259, 0x9245, 0x625A, 0x9246, + 0x625B, 0xBFB8, 0x625C, 0x9247, 0x625D, 0x9248, 0x625E, 0x9249, 0x625F, 0x924A, 0x6260, 0x924B, 0x6261, 0x924C, 0x6262, 0x924D, + 0x6263, 0xBFDB, 0x6264, 0x924E, 0x6265, 0x924F, 0x6266, 0xC7A4, 0x6267, 0xD6B4, 0x6268, 0x9250, 0x6269, 0xC0A9, 0x626A, 0xDED1, + 0x626B, 0xC9A8, 0x626C, 0xD1EF, 0x626D, 0xC5A4, 0x626E, 0xB0E7, 0x626F, 0xB3B6, 0x6270, 0xC8C5, 0x6271, 0x9251, 0x6272, 0x9252, + 0x6273, 0xB0E2, 0x6274, 0x9253, 0x6275, 0x9254, 0x6276, 0xB7F6, 0x6277, 0x9255, 0x6278, 0x9256, 0x6279, 0xC5FA, 0x627A, 0x9257, + 0x627B, 0x9258, 0x627C, 0xB6F3, 0x627D, 0x9259, 0x627E, 0xD5D2, 0x627F, 0xB3D0, 0x6280, 0xBCBC, 0x6281, 0x925A, 0x6282, 0x925B, + 0x6283, 0x925C, 0x6284, 0xB3AD, 0x6285, 0x925D, 0x6286, 0x925E, 0x6287, 0x925F, 0x6288, 0x9260, 0x6289, 0xBEF1, 0x628A, 0xB0D1, + 0x628B, 0x9261, 0x628C, 0x9262, 0x628D, 0x9263, 0x628E, 0x9264, 0x628F, 0x9265, 0x6290, 0x9266, 0x6291, 0xD2D6, 0x6292, 0xCAE3, + 0x6293, 0xD7A5, 0x6294, 0x9267, 0x6295, 0xCDB6, 0x6296, 0xB6B6, 0x6297, 0xBFB9, 0x6298, 0xD5DB, 0x6299, 0x9268, 0x629A, 0xB8A7, + 0x629B, 0xC5D7, 0x629C, 0x9269, 0x629D, 0x926A, 0x629E, 0x926B, 0x629F, 0xDED2, 0x62A0, 0xBFD9, 0x62A1, 0xC2D5, 0x62A2, 0xC7C0, + 0x62A3, 0x926C, 0x62A4, 0xBBA4, 0x62A5, 0xB1A8, 0x62A6, 0x926D, 0x62A7, 0x926E, 0x62A8, 0xC5EA, 0x62A9, 0x926F, 0x62AA, 0x9270, + 0x62AB, 0xC5FB, 0x62AC, 0xCCA7, 0x62AD, 0x9271, 0x62AE, 0x9272, 0x62AF, 0x9273, 0x62B0, 0x9274, 0x62B1, 0xB1A7, 0x62B2, 0x9275, + 0x62B3, 0x9276, 0x62B4, 0x9277, 0x62B5, 0xB5D6, 0x62B6, 0x9278, 0x62B7, 0x9279, 0x62B8, 0x927A, 0x62B9, 0xC4A8, 0x62BA, 0x927B, + 0x62BB, 0xDED3, 0x62BC, 0xD1BA, 0x62BD, 0xB3E9, 0x62BE, 0x927C, 0x62BF, 0xC3F2, 0x62C0, 0x927D, 0x62C1, 0x927E, 0x62C2, 0xB7F7, + 0x62C3, 0x9280, 0x62C4, 0xD6F4, 0x62C5, 0xB5A3, 0x62C6, 0xB2F0, 0x62C7, 0xC4B4, 0x62C8, 0xC4E9, 0x62C9, 0xC0AD, 0x62CA, 0xDED4, + 0x62CB, 0x9281, 0x62CC, 0xB0E8, 0x62CD, 0xC5C4, 0x62CE, 0xC1E0, 0x62CF, 0x9282, 0x62D0, 0xB9D5, 0x62D1, 0x9283, 0x62D2, 0xBEDC, + 0x62D3, 0xCDD8, 0x62D4, 0xB0CE, 0x62D5, 0x9284, 0x62D6, 0xCDCF, 0x62D7, 0xDED6, 0x62D8, 0xBED0, 0x62D9, 0xD7BE, 0x62DA, 0xDED5, + 0x62DB, 0xD5D0, 0x62DC, 0xB0DD, 0x62DD, 0x9285, 0x62DE, 0x9286, 0x62DF, 0xC4E2, 0x62E0, 0x9287, 0x62E1, 0x9288, 0x62E2, 0xC2A3, + 0x62E3, 0xBCF0, 0x62E4, 0x9289, 0x62E5, 0xD3B5, 0x62E6, 0xC0B9, 0x62E7, 0xC5A1, 0x62E8, 0xB2A6, 0x62E9, 0xD4F1, 0x62EA, 0x928A, + 0x62EB, 0x928B, 0x62EC, 0xC0A8, 0x62ED, 0xCAC3, 0x62EE, 0xDED7, 0x62EF, 0xD5FC, 0x62F0, 0x928C, 0x62F1, 0xB9B0, 0x62F2, 0x928D, + 0x62F3, 0xC8AD, 0x62F4, 0xCBA9, 0x62F5, 0x928E, 0x62F6, 0xDED9, 0x62F7, 0xBFBD, 0x62F8, 0x928F, 0x62F9, 0x9290, 0x62FA, 0x9291, + 0x62FB, 0x9292, 0x62FC, 0xC6B4, 0x62FD, 0xD7A7, 0x62FE, 0xCAB0, 0x62FF, 0xC4C3, 0x6300, 0x9293, 0x6301, 0xB3D6, 0x6302, 0xB9D2, + 0x6303, 0x9294, 0x6304, 0x9295, 0x6305, 0x9296, 0x6306, 0x9297, 0x6307, 0xD6B8, 0x6308, 0xEAFC, 0x6309, 0xB0B4, 0x630A, 0x9298, + 0x630B, 0x9299, 0x630C, 0x929A, 0x630D, 0x929B, 0x630E, 0xBFE6, 0x630F, 0x929C, 0x6310, 0x929D, 0x6311, 0xCCF4, 0x6312, 0x929E, + 0x6313, 0x929F, 0x6314, 0x92A0, 0x6315, 0x92A1, 0x6316, 0xCDDA, 0x6317, 0x92A2, 0x6318, 0x92A3, 0x6319, 0x92A4, 0x631A, 0xD6BF, + 0x631B, 0xC2CE, 0x631C, 0x92A5, 0x631D, 0xCECE, 0x631E, 0xCCA2, 0x631F, 0xD0AE, 0x6320, 0xC4D3, 0x6321, 0xB5B2, 0x6322, 0xDED8, + 0x6323, 0xD5F5, 0x6324, 0xBCB7, 0x6325, 0xBBD3, 0x6326, 0x92A6, 0x6327, 0x92A7, 0x6328, 0xB0A4, 0x6329, 0x92A8, 0x632A, 0xC5B2, + 0x632B, 0xB4EC, 0x632C, 0x92A9, 0x632D, 0x92AA, 0x632E, 0x92AB, 0x632F, 0xD5F1, 0x6330, 0x92AC, 0x6331, 0x92AD, 0x6332, 0xEAFD, + 0x6333, 0x92AE, 0x6334, 0x92AF, 0x6335, 0x92B0, 0x6336, 0x92B1, 0x6337, 0x92B2, 0x6338, 0x92B3, 0x6339, 0xDEDA, 0x633A, 0xCDA6, + 0x633B, 0x92B4, 0x633C, 0x92B5, 0x633D, 0xCDEC, 0x633E, 0x92B6, 0x633F, 0x92B7, 0x6340, 0x92B8, 0x6341, 0x92B9, 0x6342, 0xCEE6, + 0x6343, 0xDEDC, 0x6344, 0x92BA, 0x6345, 0xCDB1, 0x6346, 0xC0A6, 0x6347, 0x92BB, 0x6348, 0x92BC, 0x6349, 0xD7BD, 0x634A, 0x92BD, + 0x634B, 0xDEDB, 0x634C, 0xB0C6, 0x634D, 0xBAB4, 0x634E, 0xC9D3, 0x634F, 0xC4F3, 0x6350, 0xBEE8, 0x6351, 0x92BE, 0x6352, 0x92BF, + 0x6353, 0x92C0, 0x6354, 0x92C1, 0x6355, 0xB2B6, 0x6356, 0x92C2, 0x6357, 0x92C3, 0x6358, 0x92C4, 0x6359, 0x92C5, 0x635A, 0x92C6, + 0x635B, 0x92C7, 0x635C, 0x92C8, 0x635D, 0x92C9, 0x635E, 0xC0CC, 0x635F, 0xCBF0, 0x6360, 0x92CA, 0x6361, 0xBCF1, 0x6362, 0xBBBB, + 0x6363, 0xB5B7, 0x6364, 0x92CB, 0x6365, 0x92CC, 0x6366, 0x92CD, 0x6367, 0xC5F5, 0x6368, 0x92CE, 0x6369, 0xDEE6, 0x636A, 0x92CF, + 0x636B, 0x92D0, 0x636C, 0x92D1, 0x636D, 0xDEE3, 0x636E, 0xBEDD, 0x636F, 0x92D2, 0x6370, 0x92D3, 0x6371, 0xDEDF, 0x6372, 0x92D4, + 0x6373, 0x92D5, 0x6374, 0x92D6, 0x6375, 0x92D7, 0x6376, 0xB4B7, 0x6377, 0xBDDD, 0x6378, 0x92D8, 0x6379, 0x92D9, 0x637A, 0xDEE0, + 0x637B, 0xC4ED, 0x637C, 0x92DA, 0x637D, 0x92DB, 0x637E, 0x92DC, 0x637F, 0x92DD, 0x6380, 0xCFC6, 0x6381, 0x92DE, 0x6382, 0xB5E0, + 0x6383, 0x92DF, 0x6384, 0x92E0, 0x6385, 0x92E1, 0x6386, 0x92E2, 0x6387, 0xB6DE, 0x6388, 0xCADA, 0x6389, 0xB5F4, 0x638A, 0xDEE5, + 0x638B, 0x92E3, 0x638C, 0xD5C6, 0x638D, 0x92E4, 0x638E, 0xDEE1, 0x638F, 0xCCCD, 0x6390, 0xC6FE, 0x6391, 0x92E5, 0x6392, 0xC5C5, + 0x6393, 0x92E6, 0x6394, 0x92E7, 0x6395, 0x92E8, 0x6396, 0xD2B4, 0x6397, 0x92E9, 0x6398, 0xBEF2, 0x6399, 0x92EA, 0x639A, 0x92EB, + 0x639B, 0x92EC, 0x639C, 0x92ED, 0x639D, 0x92EE, 0x639E, 0x92EF, 0x639F, 0x92F0, 0x63A0, 0xC2D3, 0x63A1, 0x92F1, 0x63A2, 0xCCBD, + 0x63A3, 0xB3B8, 0x63A4, 0x92F2, 0x63A5, 0xBDD3, 0x63A6, 0x92F3, 0x63A7, 0xBFD8, 0x63A8, 0xCDC6, 0x63A9, 0xD1DA, 0x63AA, 0xB4EB, + 0x63AB, 0x92F4, 0x63AC, 0xDEE4, 0x63AD, 0xDEDD, 0x63AE, 0xDEE7, 0x63AF, 0x92F5, 0x63B0, 0xEAFE, 0x63B1, 0x92F6, 0x63B2, 0x92F7, + 0x63B3, 0xC2B0, 0x63B4, 0xDEE2, 0x63B5, 0x92F8, 0x63B6, 0x92F9, 0x63B7, 0xD6C0, 0x63B8, 0xB5A7, 0x63B9, 0x92FA, 0x63BA, 0xB2F4, + 0x63BB, 0x92FB, 0x63BC, 0xDEE8, 0x63BD, 0x92FC, 0x63BE, 0xDEF2, 0x63BF, 0x92FD, 0x63C0, 0x92FE, 0x63C1, 0x9340, 0x63C2, 0x9341, + 0x63C3, 0x9342, 0x63C4, 0xDEED, 0x63C5, 0x9343, 0x63C6, 0xDEF1, 0x63C7, 0x9344, 0x63C8, 0x9345, 0x63C9, 0xC8E0, 0x63CA, 0x9346, + 0x63CB, 0x9347, 0x63CC, 0x9348, 0x63CD, 0xD7E1, 0x63CE, 0xDEEF, 0x63CF, 0xC3E8, 0x63D0, 0xCCE1, 0x63D1, 0x9349, 0x63D2, 0xB2E5, + 0x63D3, 0x934A, 0x63D4, 0x934B, 0x63D5, 0x934C, 0x63D6, 0xD2BE, 0x63D7, 0x934D, 0x63D8, 0x934E, 0x63D9, 0x934F, 0x63DA, 0x9350, + 0x63DB, 0x9351, 0x63DC, 0x9352, 0x63DD, 0x9353, 0x63DE, 0xDEEE, 0x63DF, 0x9354, 0x63E0, 0xDEEB, 0x63E1, 0xCED5, 0x63E2, 0x9355, + 0x63E3, 0xB4A7, 0x63E4, 0x9356, 0x63E5, 0x9357, 0x63E6, 0x9358, 0x63E7, 0x9359, 0x63E8, 0x935A, 0x63E9, 0xBFAB, 0x63EA, 0xBEBE, + 0x63EB, 0x935B, 0x63EC, 0x935C, 0x63ED, 0xBDD2, 0x63EE, 0x935D, 0x63EF, 0x935E, 0x63F0, 0x935F, 0x63F1, 0x9360, 0x63F2, 0xDEE9, + 0x63F3, 0x9361, 0x63F4, 0xD4AE, 0x63F5, 0x9362, 0x63F6, 0xDEDE, 0x63F7, 0x9363, 0x63F8, 0xDEEA, 0x63F9, 0x9364, 0x63FA, 0x9365, + 0x63FB, 0x9366, 0x63FC, 0x9367, 0x63FD, 0xC0BF, 0x63FE, 0x9368, 0x63FF, 0xDEEC, 0x6400, 0xB2F3, 0x6401, 0xB8E9, 0x6402, 0xC2A7, + 0x6403, 0x9369, 0x6404, 0x936A, 0x6405, 0xBDC1, 0x6406, 0x936B, 0x6407, 0x936C, 0x6408, 0x936D, 0x6409, 0x936E, 0x640A, 0x936F, + 0x640B, 0xDEF5, 0x640C, 0xDEF8, 0x640D, 0x9370, 0x640E, 0x9371, 0x640F, 0xB2AB, 0x6410, 0xB4A4, 0x6411, 0x9372, 0x6412, 0x9373, + 0x6413, 0xB4EA, 0x6414, 0xC9A6, 0x6415, 0x9374, 0x6416, 0x9375, 0x6417, 0x9376, 0x6418, 0x9377, 0x6419, 0x9378, 0x641A, 0x9379, + 0x641B, 0xDEF6, 0x641C, 0xCBD1, 0x641D, 0x937A, 0x641E, 0xB8E3, 0x641F, 0x937B, 0x6420, 0xDEF7, 0x6421, 0xDEFA, 0x6422, 0x937C, + 0x6423, 0x937D, 0x6424, 0x937E, 0x6425, 0x9380, 0x6426, 0xDEF9, 0x6427, 0x9381, 0x6428, 0x9382, 0x6429, 0x9383, 0x642A, 0xCCC2, + 0x642B, 0x9384, 0x642C, 0xB0E1, 0x642D, 0xB4EE, 0x642E, 0x9385, 0x642F, 0x9386, 0x6430, 0x9387, 0x6431, 0x9388, 0x6432, 0x9389, + 0x6433, 0x938A, 0x6434, 0xE5BA, 0x6435, 0x938B, 0x6436, 0x938C, 0x6437, 0x938D, 0x6438, 0x938E, 0x6439, 0x938F, 0x643A, 0xD0AF, + 0x643B, 0x9390, 0x643C, 0x9391, 0x643D, 0xB2EB, 0x643E, 0x9392, 0x643F, 0xEBA1, 0x6440, 0x9393, 0x6441, 0xDEF4, 0x6442, 0x9394, + 0x6443, 0x9395, 0x6444, 0xC9E3, 0x6445, 0xDEF3, 0x6446, 0xB0DA, 0x6447, 0xD2A1, 0x6448, 0xB1F7, 0x6449, 0x9396, 0x644A, 0xCCAF, + 0x644B, 0x9397, 0x644C, 0x9398, 0x644D, 0x9399, 0x644E, 0x939A, 0x644F, 0x939B, 0x6450, 0x939C, 0x6451, 0x939D, 0x6452, 0xDEF0, + 0x6453, 0x939E, 0x6454, 0xCBA4, 0x6455, 0x939F, 0x6456, 0x93A0, 0x6457, 0x93A1, 0x6458, 0xD5AA, 0x6459, 0x93A2, 0x645A, 0x93A3, + 0x645B, 0x93A4, 0x645C, 0x93A5, 0x645D, 0x93A6, 0x645E, 0xDEFB, 0x645F, 0x93A7, 0x6460, 0x93A8, 0x6461, 0x93A9, 0x6462, 0x93AA, + 0x6463, 0x93AB, 0x6464, 0x93AC, 0x6465, 0x93AD, 0x6466, 0x93AE, 0x6467, 0xB4DD, 0x6468, 0x93AF, 0x6469, 0xC4A6, 0x646A, 0x93B0, + 0x646B, 0x93B1, 0x646C, 0x93B2, 0x646D, 0xDEFD, 0x646E, 0x93B3, 0x646F, 0x93B4, 0x6470, 0x93B5, 0x6471, 0x93B6, 0x6472, 0x93B7, + 0x6473, 0x93B8, 0x6474, 0x93B9, 0x6475, 0x93BA, 0x6476, 0x93BB, 0x6477, 0x93BC, 0x6478, 0xC3FE, 0x6479, 0xC4A1, 0x647A, 0xDFA1, + 0x647B, 0x93BD, 0x647C, 0x93BE, 0x647D, 0x93BF, 0x647E, 0x93C0, 0x647F, 0x93C1, 0x6480, 0x93C2, 0x6481, 0x93C3, 0x6482, 0xC1CC, + 0x6483, 0x93C4, 0x6484, 0xDEFC, 0x6485, 0xBEEF, 0x6486, 0x93C5, 0x6487, 0xC6B2, 0x6488, 0x93C6, 0x6489, 0x93C7, 0x648A, 0x93C8, + 0x648B, 0x93C9, 0x648C, 0x93CA, 0x648D, 0x93CB, 0x648E, 0x93CC, 0x648F, 0x93CD, 0x6490, 0x93CE, 0x6491, 0xB3C5, 0x6492, 0xC8F6, + 0x6493, 0x93CF, 0x6494, 0x93D0, 0x6495, 0xCBBA, 0x6496, 0xDEFE, 0x6497, 0x93D1, 0x6498, 0x93D2, 0x6499, 0xDFA4, 0x649A, 0x93D3, + 0x649B, 0x93D4, 0x649C, 0x93D5, 0x649D, 0x93D6, 0x649E, 0xD7B2, 0x649F, 0x93D7, 0x64A0, 0x93D8, 0x64A1, 0x93D9, 0x64A2, 0x93DA, + 0x64A3, 0x93DB, 0x64A4, 0xB3B7, 0x64A5, 0x93DC, 0x64A6, 0x93DD, 0x64A7, 0x93DE, 0x64A8, 0x93DF, 0x64A9, 0xC1C3, 0x64AA, 0x93E0, + 0x64AB, 0x93E1, 0x64AC, 0xC7CB, 0x64AD, 0xB2A5, 0x64AE, 0xB4E9, 0x64AF, 0x93E2, 0x64B0, 0xD7AB, 0x64B1, 0x93E3, 0x64B2, 0x93E4, + 0x64B3, 0x93E5, 0x64B4, 0x93E6, 0x64B5, 0xC4EC, 0x64B6, 0x93E7, 0x64B7, 0xDFA2, 0x64B8, 0xDFA3, 0x64B9, 0x93E8, 0x64BA, 0xDFA5, + 0x64BB, 0x93E9, 0x64BC, 0xBAB3, 0x64BD, 0x93EA, 0x64BE, 0x93EB, 0x64BF, 0x93EC, 0x64C0, 0xDFA6, 0x64C1, 0x93ED, 0x64C2, 0xC0DE, + 0x64C3, 0x93EE, 0x64C4, 0x93EF, 0x64C5, 0xC9C3, 0x64C6, 0x93F0, 0x64C7, 0x93F1, 0x64C8, 0x93F2, 0x64C9, 0x93F3, 0x64CA, 0x93F4, + 0x64CB, 0x93F5, 0x64CC, 0x93F6, 0x64CD, 0xB2D9, 0x64CE, 0xC7E6, 0x64CF, 0x93F7, 0x64D0, 0xDFA7, 0x64D1, 0x93F8, 0x64D2, 0xC7DC, + 0x64D3, 0x93F9, 0x64D4, 0x93FA, 0x64D5, 0x93FB, 0x64D6, 0x93FC, 0x64D7, 0xDFA8, 0x64D8, 0xEBA2, 0x64D9, 0x93FD, 0x64DA, 0x93FE, + 0x64DB, 0x9440, 0x64DC, 0x9441, 0x64DD, 0x9442, 0x64DE, 0xCBD3, 0x64DF, 0x9443, 0x64E0, 0x9444, 0x64E1, 0x9445, 0x64E2, 0xDFAA, + 0x64E3, 0x9446, 0x64E4, 0xDFA9, 0x64E5, 0x9447, 0x64E6, 0xB2C1, 0x64E7, 0x9448, 0x64E8, 0x9449, 0x64E9, 0x944A, 0x64EA, 0x944B, + 0x64EB, 0x944C, 0x64EC, 0x944D, 0x64ED, 0x944E, 0x64EE, 0x944F, 0x64EF, 0x9450, 0x64F0, 0x9451, 0x64F1, 0x9452, 0x64F2, 0x9453, + 0x64F3, 0x9454, 0x64F4, 0x9455, 0x64F5, 0x9456, 0x64F6, 0x9457, 0x64F7, 0x9458, 0x64F8, 0x9459, 0x64F9, 0x945A, 0x64FA, 0x945B, + 0x64FB, 0x945C, 0x64FC, 0x945D, 0x64FD, 0x945E, 0x64FE, 0x945F, 0x64FF, 0x9460, 0x6500, 0xC5CA, 0x6501, 0x9461, 0x6502, 0x9462, + 0x6503, 0x9463, 0x6504, 0x9464, 0x6505, 0x9465, 0x6506, 0x9466, 0x6507, 0x9467, 0x6508, 0x9468, 0x6509, 0xDFAB, 0x650A, 0x9469, + 0x650B, 0x946A, 0x650C, 0x946B, 0x650D, 0x946C, 0x650E, 0x946D, 0x650F, 0x946E, 0x6510, 0x946F, 0x6511, 0x9470, 0x6512, 0xD4DC, + 0x6513, 0x9471, 0x6514, 0x9472, 0x6515, 0x9473, 0x6516, 0x9474, 0x6517, 0x9475, 0x6518, 0xC8C1, 0x6519, 0x9476, 0x651A, 0x9477, + 0x651B, 0x9478, 0x651C, 0x9479, 0x651D, 0x947A, 0x651E, 0x947B, 0x651F, 0x947C, 0x6520, 0x947D, 0x6521, 0x947E, 0x6522, 0x9480, + 0x6523, 0x9481, 0x6524, 0x9482, 0x6525, 0xDFAC, 0x6526, 0x9483, 0x6527, 0x9484, 0x6528, 0x9485, 0x6529, 0x9486, 0x652A, 0x9487, + 0x652B, 0xBEF0, 0x652C, 0x9488, 0x652D, 0x9489, 0x652E, 0xDFAD, 0x652F, 0xD6A7, 0x6530, 0x948A, 0x6531, 0x948B, 0x6532, 0x948C, + 0x6533, 0x948D, 0x6534, 0xEAB7, 0x6535, 0xEBB6, 0x6536, 0xCAD5, 0x6537, 0x948E, 0x6538, 0xD8FC, 0x6539, 0xB8C4, 0x653A, 0x948F, + 0x653B, 0xB9A5, 0x653C, 0x9490, 0x653D, 0x9491, 0x653E, 0xB7C5, 0x653F, 0xD5FE, 0x6540, 0x9492, 0x6541, 0x9493, 0x6542, 0x9494, + 0x6543, 0x9495, 0x6544, 0x9496, 0x6545, 0xB9CA, 0x6546, 0x9497, 0x6547, 0x9498, 0x6548, 0xD0A7, 0x6549, 0xF4CD, 0x654A, 0x9499, + 0x654B, 0x949A, 0x654C, 0xB5D0, 0x654D, 0x949B, 0x654E, 0x949C, 0x654F, 0xC3F4, 0x6550, 0x949D, 0x6551, 0xBEC8, 0x6552, 0x949E, + 0x6553, 0x949F, 0x6554, 0x94A0, 0x6555, 0xEBB7, 0x6556, 0xB0BD, 0x6557, 0x94A1, 0x6558, 0x94A2, 0x6559, 0xBDCC, 0x655A, 0x94A3, + 0x655B, 0xC1B2, 0x655C, 0x94A4, 0x655D, 0xB1D6, 0x655E, 0xB3A8, 0x655F, 0x94A5, 0x6560, 0x94A6, 0x6561, 0x94A7, 0x6562, 0xB8D2, + 0x6563, 0xC9A2, 0x6564, 0x94A8, 0x6565, 0x94A9, 0x6566, 0xB6D8, 0x6567, 0x94AA, 0x6568, 0x94AB, 0x6569, 0x94AC, 0x656A, 0x94AD, + 0x656B, 0xEBB8, 0x656C, 0xBEB4, 0x656D, 0x94AE, 0x656E, 0x94AF, 0x656F, 0x94B0, 0x6570, 0xCAFD, 0x6571, 0x94B1, 0x6572, 0xC7C3, + 0x6573, 0x94B2, 0x6574, 0xD5FB, 0x6575, 0x94B3, 0x6576, 0x94B4, 0x6577, 0xB7F3, 0x6578, 0x94B5, 0x6579, 0x94B6, 0x657A, 0x94B7, + 0x657B, 0x94B8, 0x657C, 0x94B9, 0x657D, 0x94BA, 0x657E, 0x94BB, 0x657F, 0x94BC, 0x6580, 0x94BD, 0x6581, 0x94BE, 0x6582, 0x94BF, + 0x6583, 0x94C0, 0x6584, 0x94C1, 0x6585, 0x94C2, 0x6586, 0x94C3, 0x6587, 0xCEC4, 0x6588, 0x94C4, 0x6589, 0x94C5, 0x658A, 0x94C6, + 0x658B, 0xD5AB, 0x658C, 0xB1F3, 0x658D, 0x94C7, 0x658E, 0x94C8, 0x658F, 0x94C9, 0x6590, 0xECB3, 0x6591, 0xB0DF, 0x6592, 0x94CA, + 0x6593, 0xECB5, 0x6594, 0x94CB, 0x6595, 0x94CC, 0x6596, 0x94CD, 0x6597, 0xB6B7, 0x6598, 0x94CE, 0x6599, 0xC1CF, 0x659A, 0x94CF, + 0x659B, 0xF5FA, 0x659C, 0xD0B1, 0x659D, 0x94D0, 0x659E, 0x94D1, 0x659F, 0xD5E5, 0x65A0, 0x94D2, 0x65A1, 0xCED3, 0x65A2, 0x94D3, + 0x65A3, 0x94D4, 0x65A4, 0xBDEF, 0x65A5, 0xB3E2, 0x65A6, 0x94D5, 0x65A7, 0xB8AB, 0x65A8, 0x94D6, 0x65A9, 0xD5B6, 0x65AA, 0x94D7, + 0x65AB, 0xEDBD, 0x65AC, 0x94D8, 0x65AD, 0xB6CF, 0x65AE, 0x94D9, 0x65AF, 0xCBB9, 0x65B0, 0xD0C2, 0x65B1, 0x94DA, 0x65B2, 0x94DB, + 0x65B3, 0x94DC, 0x65B4, 0x94DD, 0x65B5, 0x94DE, 0x65B6, 0x94DF, 0x65B7, 0x94E0, 0x65B8, 0x94E1, 0x65B9, 0xB7BD, 0x65BA, 0x94E2, + 0x65BB, 0x94E3, 0x65BC, 0xECB6, 0x65BD, 0xCAA9, 0x65BE, 0x94E4, 0x65BF, 0x94E5, 0x65C0, 0x94E6, 0x65C1, 0xC5D4, 0x65C2, 0x94E7, + 0x65C3, 0xECB9, 0x65C4, 0xECB8, 0x65C5, 0xC2C3, 0x65C6, 0xECB7, 0x65C7, 0x94E8, 0x65C8, 0x94E9, 0x65C9, 0x94EA, 0x65CA, 0x94EB, + 0x65CB, 0xD0FD, 0x65CC, 0xECBA, 0x65CD, 0x94EC, 0x65CE, 0xECBB, 0x65CF, 0xD7E5, 0x65D0, 0x94ED, 0x65D1, 0x94EE, 0x65D2, 0xECBC, + 0x65D3, 0x94EF, 0x65D4, 0x94F0, 0x65D5, 0x94F1, 0x65D6, 0xECBD, 0x65D7, 0xC6EC, 0x65D8, 0x94F2, 0x65D9, 0x94F3, 0x65DA, 0x94F4, + 0x65DB, 0x94F5, 0x65DC, 0x94F6, 0x65DD, 0x94F7, 0x65DE, 0x94F8, 0x65DF, 0x94F9, 0x65E0, 0xCEDE, 0x65E1, 0x94FA, 0x65E2, 0xBCC8, + 0x65E3, 0x94FB, 0x65E4, 0x94FC, 0x65E5, 0xC8D5, 0x65E6, 0xB5A9, 0x65E7, 0xBEC9, 0x65E8, 0xD6BC, 0x65E9, 0xD4E7, 0x65EA, 0x94FD, + 0x65EB, 0x94FE, 0x65EC, 0xD1AE, 0x65ED, 0xD0F1, 0x65EE, 0xEAB8, 0x65EF, 0xEAB9, 0x65F0, 0xEABA, 0x65F1, 0xBAB5, 0x65F2, 0x9540, + 0x65F3, 0x9541, 0x65F4, 0x9542, 0x65F5, 0x9543, 0x65F6, 0xCAB1, 0x65F7, 0xBFF5, 0x65F8, 0x9544, 0x65F9, 0x9545, 0x65FA, 0xCDFA, + 0x65FB, 0x9546, 0x65FC, 0x9547, 0x65FD, 0x9548, 0x65FE, 0x9549, 0x65FF, 0x954A, 0x6600, 0xEAC0, 0x6601, 0x954B, 0x6602, 0xB0BA, + 0x6603, 0xEABE, 0x6604, 0x954C, 0x6605, 0x954D, 0x6606, 0xC0A5, 0x6607, 0x954E, 0x6608, 0x954F, 0x6609, 0x9550, 0x660A, 0xEABB, + 0x660B, 0x9551, 0x660C, 0xB2FD, 0x660D, 0x9552, 0x660E, 0xC3F7, 0x660F, 0xBBE8, 0x6610, 0x9553, 0x6611, 0x9554, 0x6612, 0x9555, + 0x6613, 0xD2D7, 0x6614, 0xCEF4, 0x6615, 0xEABF, 0x6616, 0x9556, 0x6617, 0x9557, 0x6618, 0x9558, 0x6619, 0xEABC, 0x661A, 0x9559, + 0x661B, 0x955A, 0x661C, 0x955B, 0x661D, 0xEAC3, 0x661E, 0x955C, 0x661F, 0xD0C7, 0x6620, 0xD3B3, 0x6621, 0x955D, 0x6622, 0x955E, + 0x6623, 0x955F, 0x6624, 0x9560, 0x6625, 0xB4BA, 0x6626, 0x9561, 0x6627, 0xC3C1, 0x6628, 0xD7F2, 0x6629, 0x9562, 0x662A, 0x9563, + 0x662B, 0x9564, 0x662C, 0x9565, 0x662D, 0xD5D1, 0x662E, 0x9566, 0x662F, 0xCAC7, 0x6630, 0x9567, 0x6631, 0xEAC5, 0x6632, 0x9568, + 0x6633, 0x9569, 0x6634, 0xEAC4, 0x6635, 0xEAC7, 0x6636, 0xEAC6, 0x6637, 0x956A, 0x6638, 0x956B, 0x6639, 0x956C, 0x663A, 0x956D, + 0x663B, 0x956E, 0x663C, 0xD6E7, 0x663D, 0x956F, 0x663E, 0xCFD4, 0x663F, 0x9570, 0x6640, 0x9571, 0x6641, 0xEACB, 0x6642, 0x9572, + 0x6643, 0xBBCE, 0x6644, 0x9573, 0x6645, 0x9574, 0x6646, 0x9575, 0x6647, 0x9576, 0x6648, 0x9577, 0x6649, 0x9578, 0x664A, 0x9579, + 0x664B, 0xBDFA, 0x664C, 0xC9CE, 0x664D, 0x957A, 0x664E, 0x957B, 0x664F, 0xEACC, 0x6650, 0x957C, 0x6651, 0x957D, 0x6652, 0xC9B9, + 0x6653, 0xCFFE, 0x6654, 0xEACA, 0x6655, 0xD4CE, 0x6656, 0xEACD, 0x6657, 0xEACF, 0x6658, 0x957E, 0x6659, 0x9580, 0x665A, 0xCDED, + 0x665B, 0x9581, 0x665C, 0x9582, 0x665D, 0x9583, 0x665E, 0x9584, 0x665F, 0xEAC9, 0x6660, 0x9585, 0x6661, 0xEACE, 0x6662, 0x9586, + 0x6663, 0x9587, 0x6664, 0xCEEE, 0x6665, 0x9588, 0x6666, 0xBBDE, 0x6667, 0x9589, 0x6668, 0xB3BF, 0x6669, 0x958A, 0x666A, 0x958B, + 0x666B, 0x958C, 0x666C, 0x958D, 0x666D, 0x958E, 0x666E, 0xC6D5, 0x666F, 0xBEB0, 0x6670, 0xCEFA, 0x6671, 0x958F, 0x6672, 0x9590, + 0x6673, 0x9591, 0x6674, 0xC7E7, 0x6675, 0x9592, 0x6676, 0xBEA7, 0x6677, 0xEAD0, 0x6678, 0x9593, 0x6679, 0x9594, 0x667A, 0xD6C7, + 0x667B, 0x9595, 0x667C, 0x9596, 0x667D, 0x9597, 0x667E, 0xC1C0, 0x667F, 0x9598, 0x6680, 0x9599, 0x6681, 0x959A, 0x6682, 0xD4DD, + 0x6683, 0x959B, 0x6684, 0xEAD1, 0x6685, 0x959C, 0x6686, 0x959D, 0x6687, 0xCFBE, 0x6688, 0x959E, 0x6689, 0x959F, 0x668A, 0x95A0, + 0x668B, 0x95A1, 0x668C, 0xEAD2, 0x668D, 0x95A2, 0x668E, 0x95A3, 0x668F, 0x95A4, 0x6690, 0x95A5, 0x6691, 0xCAEE, 0x6692, 0x95A6, + 0x6693, 0x95A7, 0x6694, 0x95A8, 0x6695, 0x95A9, 0x6696, 0xC5AF, 0x6697, 0xB0B5, 0x6698, 0x95AA, 0x6699, 0x95AB, 0x669A, 0x95AC, + 0x669B, 0x95AD, 0x669C, 0x95AE, 0x669D, 0xEAD4, 0x669E, 0x95AF, 0x669F, 0x95B0, 0x66A0, 0x95B1, 0x66A1, 0x95B2, 0x66A2, 0x95B3, + 0x66A3, 0x95B4, 0x66A4, 0x95B5, 0x66A5, 0x95B6, 0x66A6, 0x95B7, 0x66A7, 0xEAD3, 0x66A8, 0xF4DF, 0x66A9, 0x95B8, 0x66AA, 0x95B9, + 0x66AB, 0x95BA, 0x66AC, 0x95BB, 0x66AD, 0x95BC, 0x66AE, 0xC4BA, 0x66AF, 0x95BD, 0x66B0, 0x95BE, 0x66B1, 0x95BF, 0x66B2, 0x95C0, + 0x66B3, 0x95C1, 0x66B4, 0xB1A9, 0x66B5, 0x95C2, 0x66B6, 0x95C3, 0x66B7, 0x95C4, 0x66B8, 0x95C5, 0x66B9, 0xE5DF, 0x66BA, 0x95C6, + 0x66BB, 0x95C7, 0x66BC, 0x95C8, 0x66BD, 0x95C9, 0x66BE, 0xEAD5, 0x66BF, 0x95CA, 0x66C0, 0x95CB, 0x66C1, 0x95CC, 0x66C2, 0x95CD, + 0x66C3, 0x95CE, 0x66C4, 0x95CF, 0x66C5, 0x95D0, 0x66C6, 0x95D1, 0x66C7, 0x95D2, 0x66C8, 0x95D3, 0x66C9, 0x95D4, 0x66CA, 0x95D5, + 0x66CB, 0x95D6, 0x66CC, 0x95D7, 0x66CD, 0x95D8, 0x66CE, 0x95D9, 0x66CF, 0x95DA, 0x66D0, 0x95DB, 0x66D1, 0x95DC, 0x66D2, 0x95DD, + 0x66D3, 0x95DE, 0x66D4, 0x95DF, 0x66D5, 0x95E0, 0x66D6, 0x95E1, 0x66D7, 0x95E2, 0x66D8, 0x95E3, 0x66D9, 0xCAEF, 0x66DA, 0x95E4, + 0x66DB, 0xEAD6, 0x66DC, 0xEAD7, 0x66DD, 0xC6D8, 0x66DE, 0x95E5, 0x66DF, 0x95E6, 0x66E0, 0x95E7, 0x66E1, 0x95E8, 0x66E2, 0x95E9, + 0x66E3, 0x95EA, 0x66E4, 0x95EB, 0x66E5, 0x95EC, 0x66E6, 0xEAD8, 0x66E7, 0x95ED, 0x66E8, 0x95EE, 0x66E9, 0xEAD9, 0x66EA, 0x95EF, + 0x66EB, 0x95F0, 0x66EC, 0x95F1, 0x66ED, 0x95F2, 0x66EE, 0x95F3, 0x66EF, 0x95F4, 0x66F0, 0xD4BB, 0x66F1, 0x95F5, 0x66F2, 0xC7FA, + 0x66F3, 0xD2B7, 0x66F4, 0xB8FC, 0x66F5, 0x95F6, 0x66F6, 0x95F7, 0x66F7, 0xEAC2, 0x66F8, 0x95F8, 0x66F9, 0xB2DC, 0x66FA, 0x95F9, + 0x66FB, 0x95FA, 0x66FC, 0xC2FC, 0x66FD, 0x95FB, 0x66FE, 0xD4F8, 0x66FF, 0xCCE6, 0x6700, 0xD7EE, 0x6701, 0x95FC, 0x6702, 0x95FD, + 0x6703, 0x95FE, 0x6704, 0x9640, 0x6705, 0x9641, 0x6706, 0x9642, 0x6707, 0x9643, 0x6708, 0xD4C2, 0x6709, 0xD3D0, 0x670A, 0xEBC3, + 0x670B, 0xC5F3, 0x670C, 0x9644, 0x670D, 0xB7FE, 0x670E, 0x9645, 0x670F, 0x9646, 0x6710, 0xEBD4, 0x6711, 0x9647, 0x6712, 0x9648, + 0x6713, 0x9649, 0x6714, 0xCBB7, 0x6715, 0xEBDE, 0x6716, 0x964A, 0x6717, 0xC0CA, 0x6718, 0x964B, 0x6719, 0x964C, 0x671A, 0x964D, + 0x671B, 0xCDFB, 0x671C, 0x964E, 0x671D, 0xB3AF, 0x671E, 0x964F, 0x671F, 0xC6DA, 0x6720, 0x9650, 0x6721, 0x9651, 0x6722, 0x9652, + 0x6723, 0x9653, 0x6724, 0x9654, 0x6725, 0x9655, 0x6726, 0xEBFC, 0x6727, 0x9656, 0x6728, 0xC4BE, 0x6729, 0x9657, 0x672A, 0xCEB4, + 0x672B, 0xC4A9, 0x672C, 0xB1BE, 0x672D, 0xD4FD, 0x672E, 0x9658, 0x672F, 0xCAF5, 0x6730, 0x9659, 0x6731, 0xD6EC, 0x6732, 0x965A, + 0x6733, 0x965B, 0x6734, 0xC6D3, 0x6735, 0xB6E4, 0x6736, 0x965C, 0x6737, 0x965D, 0x6738, 0x965E, 0x6739, 0x965F, 0x673A, 0xBBFA, + 0x673B, 0x9660, 0x673C, 0x9661, 0x673D, 0xD0E0, 0x673E, 0x9662, 0x673F, 0x9663, 0x6740, 0xC9B1, 0x6741, 0x9664, 0x6742, 0xD4D3, + 0x6743, 0xC8A8, 0x6744, 0x9665, 0x6745, 0x9666, 0x6746, 0xB8CB, 0x6747, 0x9667, 0x6748, 0xE8BE, 0x6749, 0xC9BC, 0x674A, 0x9668, + 0x674B, 0x9669, 0x674C, 0xE8BB, 0x674D, 0x966A, 0x674E, 0xC0EE, 0x674F, 0xD0D3, 0x6750, 0xB2C4, 0x6751, 0xB4E5, 0x6752, 0x966B, + 0x6753, 0xE8BC, 0x6754, 0x966C, 0x6755, 0x966D, 0x6756, 0xD5C8, 0x6757, 0x966E, 0x6758, 0x966F, 0x6759, 0x9670, 0x675A, 0x9671, + 0x675B, 0x9672, 0x675C, 0xB6C5, 0x675D, 0x9673, 0x675E, 0xE8BD, 0x675F, 0xCAF8, 0x6760, 0xB8DC, 0x6761, 0xCCF5, 0x6762, 0x9674, + 0x6763, 0x9675, 0x6764, 0x9676, 0x6765, 0xC0B4, 0x6766, 0x9677, 0x6767, 0x9678, 0x6768, 0xD1EE, 0x6769, 0xE8BF, 0x676A, 0xE8C2, + 0x676B, 0x9679, 0x676C, 0x967A, 0x676D, 0xBABC, 0x676E, 0x967B, 0x676F, 0xB1AD, 0x6770, 0xBDDC, 0x6771, 0x967C, 0x6772, 0xEABD, + 0x6773, 0xE8C3, 0x6774, 0x967D, 0x6775, 0xE8C6, 0x6776, 0x967E, 0x6777, 0xE8CB, 0x6778, 0x9680, 0x6779, 0x9681, 0x677A, 0x9682, + 0x677B, 0x9683, 0x677C, 0xE8CC, 0x677D, 0x9684, 0x677E, 0xCBC9, 0x677F, 0xB0E5, 0x6780, 0x9685, 0x6781, 0xBCAB, 0x6782, 0x9686, + 0x6783, 0x9687, 0x6784, 0xB9B9, 0x6785, 0x9688, 0x6786, 0x9689, 0x6787, 0xE8C1, 0x6788, 0x968A, 0x6789, 0xCDF7, 0x678A, 0x968B, + 0x678B, 0xE8CA, 0x678C, 0x968C, 0x678D, 0x968D, 0x678E, 0x968E, 0x678F, 0x968F, 0x6790, 0xCEF6, 0x6791, 0x9690, 0x6792, 0x9691, + 0x6793, 0x9692, 0x6794, 0x9693, 0x6795, 0xD5ED, 0x6796, 0x9694, 0x6797, 0xC1D6, 0x6798, 0xE8C4, 0x6799, 0x9695, 0x679A, 0xC3B6, + 0x679B, 0x9696, 0x679C, 0xB9FB, 0x679D, 0xD6A6, 0x679E, 0xE8C8, 0x679F, 0x9697, 0x67A0, 0x9698, 0x67A1, 0x9699, 0x67A2, 0xCAE0, + 0x67A3, 0xD4E6, 0x67A4, 0x969A, 0x67A5, 0xE8C0, 0x67A6, 0x969B, 0x67A7, 0xE8C5, 0x67A8, 0xE8C7, 0x67A9, 0x969C, 0x67AA, 0xC7B9, + 0x67AB, 0xB7E3, 0x67AC, 0x969D, 0x67AD, 0xE8C9, 0x67AE, 0x969E, 0x67AF, 0xBFDD, 0x67B0, 0xE8D2, 0x67B1, 0x969F, 0x67B2, 0x96A0, + 0x67B3, 0xE8D7, 0x67B4, 0x96A1, 0x67B5, 0xE8D5, 0x67B6, 0xBCDC, 0x67B7, 0xBCCF, 0x67B8, 0xE8DB, 0x67B9, 0x96A2, 0x67BA, 0x96A3, + 0x67BB, 0x96A4, 0x67BC, 0x96A5, 0x67BD, 0x96A6, 0x67BE, 0x96A7, 0x67BF, 0x96A8, 0x67C0, 0x96A9, 0x67C1, 0xE8DE, 0x67C2, 0x96AA, + 0x67C3, 0xE8DA, 0x67C4, 0xB1FA, 0x67C5, 0x96AB, 0x67C6, 0x96AC, 0x67C7, 0x96AD, 0x67C8, 0x96AE, 0x67C9, 0x96AF, 0x67CA, 0x96B0, + 0x67CB, 0x96B1, 0x67CC, 0x96B2, 0x67CD, 0x96B3, 0x67CE, 0x96B4, 0x67CF, 0xB0D8, 0x67D0, 0xC4B3, 0x67D1, 0xB8CC, 0x67D2, 0xC6E2, + 0x67D3, 0xC8BE, 0x67D4, 0xC8E1, 0x67D5, 0x96B5, 0x67D6, 0x96B6, 0x67D7, 0x96B7, 0x67D8, 0xE8CF, 0x67D9, 0xE8D4, 0x67DA, 0xE8D6, + 0x67DB, 0x96B8, 0x67DC, 0xB9F1, 0x67DD, 0xE8D8, 0x67DE, 0xD7F5, 0x67DF, 0x96B9, 0x67E0, 0xC4FB, 0x67E1, 0x96BA, 0x67E2, 0xE8DC, + 0x67E3, 0x96BB, 0x67E4, 0x96BC, 0x67E5, 0xB2E9, 0x67E6, 0x96BD, 0x67E7, 0x96BE, 0x67E8, 0x96BF, 0x67E9, 0xE8D1, 0x67EA, 0x96C0, + 0x67EB, 0x96C1, 0x67EC, 0xBCED, 0x67ED, 0x96C2, 0x67EE, 0x96C3, 0x67EF, 0xBFC2, 0x67F0, 0xE8CD, 0x67F1, 0xD6F9, 0x67F2, 0x96C4, + 0x67F3, 0xC1F8, 0x67F4, 0xB2F1, 0x67F5, 0x96C5, 0x67F6, 0x96C6, 0x67F7, 0x96C7, 0x67F8, 0x96C8, 0x67F9, 0x96C9, 0x67FA, 0x96CA, + 0x67FB, 0x96CB, 0x67FC, 0x96CC, 0x67FD, 0xE8DF, 0x67FE, 0x96CD, 0x67FF, 0xCAC1, 0x6800, 0xE8D9, 0x6801, 0x96CE, 0x6802, 0x96CF, + 0x6803, 0x96D0, 0x6804, 0x96D1, 0x6805, 0xD5A4, 0x6806, 0x96D2, 0x6807, 0xB1EA, 0x6808, 0xD5BB, 0x6809, 0xE8CE, 0x680A, 0xE8D0, + 0x680B, 0xB6B0, 0x680C, 0xE8D3, 0x680D, 0x96D3, 0x680E, 0xE8DD, 0x680F, 0xC0B8, 0x6810, 0x96D4, 0x6811, 0xCAF7, 0x6812, 0x96D5, + 0x6813, 0xCBA8, 0x6814, 0x96D6, 0x6815, 0x96D7, 0x6816, 0xC6DC, 0x6817, 0xC0F5, 0x6818, 0x96D8, 0x6819, 0x96D9, 0x681A, 0x96DA, + 0x681B, 0x96DB, 0x681C, 0x96DC, 0x681D, 0xE8E9, 0x681E, 0x96DD, 0x681F, 0x96DE, 0x6820, 0x96DF, 0x6821, 0xD0A3, 0x6822, 0x96E0, + 0x6823, 0x96E1, 0x6824, 0x96E2, 0x6825, 0x96E3, 0x6826, 0x96E4, 0x6827, 0x96E5, 0x6828, 0x96E6, 0x6829, 0xE8F2, 0x682A, 0xD6EA, + 0x682B, 0x96E7, 0x682C, 0x96E8, 0x682D, 0x96E9, 0x682E, 0x96EA, 0x682F, 0x96EB, 0x6830, 0x96EC, 0x6831, 0x96ED, 0x6832, 0xE8E0, + 0x6833, 0xE8E1, 0x6834, 0x96EE, 0x6835, 0x96EF, 0x6836, 0x96F0, 0x6837, 0xD1F9, 0x6838, 0xBACB, 0x6839, 0xB8F9, 0x683A, 0x96F1, + 0x683B, 0x96F2, 0x683C, 0xB8F1, 0x683D, 0xD4D4, 0x683E, 0xE8EF, 0x683F, 0x96F3, 0x6840, 0xE8EE, 0x6841, 0xE8EC, 0x6842, 0xB9F0, + 0x6843, 0xCCD2, 0x6844, 0xE8E6, 0x6845, 0xCEA6, 0x6846, 0xBFF2, 0x6847, 0x96F4, 0x6848, 0xB0B8, 0x6849, 0xE8F1, 0x684A, 0xE8F0, + 0x684B, 0x96F5, 0x684C, 0xD7C0, 0x684D, 0x96F6, 0x684E, 0xE8E4, 0x684F, 0x96F7, 0x6850, 0xCDA9, 0x6851, 0xC9A3, 0x6852, 0x96F8, + 0x6853, 0xBBB8, 0x6854, 0xBDDB, 0x6855, 0xE8EA, 0x6856, 0x96F9, 0x6857, 0x96FA, 0x6858, 0x96FB, 0x6859, 0x96FC, 0x685A, 0x96FD, + 0x685B, 0x96FE, 0x685C, 0x9740, 0x685D, 0x9741, 0x685E, 0x9742, 0x685F, 0x9743, 0x6860, 0xE8E2, 0x6861, 0xE8E3, 0x6862, 0xE8E5, + 0x6863, 0xB5B5, 0x6864, 0xE8E7, 0x6865, 0xC7C5, 0x6866, 0xE8EB, 0x6867, 0xE8ED, 0x6868, 0xBDB0, 0x6869, 0xD7AE, 0x686A, 0x9744, + 0x686B, 0xE8F8, 0x686C, 0x9745, 0x686D, 0x9746, 0x686E, 0x9747, 0x686F, 0x9748, 0x6870, 0x9749, 0x6871, 0x974A, 0x6872, 0x974B, + 0x6873, 0x974C, 0x6874, 0xE8F5, 0x6875, 0x974D, 0x6876, 0xCDB0, 0x6877, 0xE8F6, 0x6878, 0x974E, 0x6879, 0x974F, 0x687A, 0x9750, + 0x687B, 0x9751, 0x687C, 0x9752, 0x687D, 0x9753, 0x687E, 0x9754, 0x687F, 0x9755, 0x6880, 0x9756, 0x6881, 0xC1BA, 0x6882, 0x9757, + 0x6883, 0xE8E8, 0x6884, 0x9758, 0x6885, 0xC3B7, 0x6886, 0xB0F0, 0x6887, 0x9759, 0x6888, 0x975A, 0x6889, 0x975B, 0x688A, 0x975C, + 0x688B, 0x975D, 0x688C, 0x975E, 0x688D, 0x975F, 0x688E, 0x9760, 0x688F, 0xE8F4, 0x6890, 0x9761, 0x6891, 0x9762, 0x6892, 0x9763, + 0x6893, 0xE8F7, 0x6894, 0x9764, 0x6895, 0x9765, 0x6896, 0x9766, 0x6897, 0xB9A3, 0x6898, 0x9767, 0x6899, 0x9768, 0x689A, 0x9769, + 0x689B, 0x976A, 0x689C, 0x976B, 0x689D, 0x976C, 0x689E, 0x976D, 0x689F, 0x976E, 0x68A0, 0x976F, 0x68A1, 0x9770, 0x68A2, 0xC9D2, + 0x68A3, 0x9771, 0x68A4, 0x9772, 0x68A5, 0x9773, 0x68A6, 0xC3CE, 0x68A7, 0xCEE0, 0x68A8, 0xC0E6, 0x68A9, 0x9774, 0x68AA, 0x9775, + 0x68AB, 0x9776, 0x68AC, 0x9777, 0x68AD, 0xCBF3, 0x68AE, 0x9778, 0x68AF, 0xCCDD, 0x68B0, 0xD0B5, 0x68B1, 0x9779, 0x68B2, 0x977A, + 0x68B3, 0xCAE1, 0x68B4, 0x977B, 0x68B5, 0xE8F3, 0x68B6, 0x977C, 0x68B7, 0x977D, 0x68B8, 0x977E, 0x68B9, 0x9780, 0x68BA, 0x9781, + 0x68BB, 0x9782, 0x68BC, 0x9783, 0x68BD, 0x9784, 0x68BE, 0x9785, 0x68BF, 0x9786, 0x68C0, 0xBCEC, 0x68C1, 0x9787, 0x68C2, 0xE8F9, + 0x68C3, 0x9788, 0x68C4, 0x9789, 0x68C5, 0x978A, 0x68C6, 0x978B, 0x68C7, 0x978C, 0x68C8, 0x978D, 0x68C9, 0xC3DE, 0x68CA, 0x978E, + 0x68CB, 0xC6E5, 0x68CC, 0x978F, 0x68CD, 0xB9F7, 0x68CE, 0x9790, 0x68CF, 0x9791, 0x68D0, 0x9792, 0x68D1, 0x9793, 0x68D2, 0xB0F4, + 0x68D3, 0x9794, 0x68D4, 0x9795, 0x68D5, 0xD7D8, 0x68D6, 0x9796, 0x68D7, 0x9797, 0x68D8, 0xBCAC, 0x68D9, 0x9798, 0x68DA, 0xC5EF, + 0x68DB, 0x9799, 0x68DC, 0x979A, 0x68DD, 0x979B, 0x68DE, 0x979C, 0x68DF, 0x979D, 0x68E0, 0xCCC4, 0x68E1, 0x979E, 0x68E2, 0x979F, + 0x68E3, 0xE9A6, 0x68E4, 0x97A0, 0x68E5, 0x97A1, 0x68E6, 0x97A2, 0x68E7, 0x97A3, 0x68E8, 0x97A4, 0x68E9, 0x97A5, 0x68EA, 0x97A6, + 0x68EB, 0x97A7, 0x68EC, 0x97A8, 0x68ED, 0x97A9, 0x68EE, 0xC9AD, 0x68EF, 0x97AA, 0x68F0, 0xE9A2, 0x68F1, 0xC0E2, 0x68F2, 0x97AB, + 0x68F3, 0x97AC, 0x68F4, 0x97AD, 0x68F5, 0xBFC3, 0x68F6, 0x97AE, 0x68F7, 0x97AF, 0x68F8, 0x97B0, 0x68F9, 0xE8FE, 0x68FA, 0xB9D7, + 0x68FB, 0x97B1, 0x68FC, 0xE8FB, 0x68FD, 0x97B2, 0x68FE, 0x97B3, 0x68FF, 0x97B4, 0x6900, 0x97B5, 0x6901, 0xE9A4, 0x6902, 0x97B6, + 0x6903, 0x97B7, 0x6904, 0x97B8, 0x6905, 0xD2CE, 0x6906, 0x97B9, 0x6907, 0x97BA, 0x6908, 0x97BB, 0x6909, 0x97BC, 0x690A, 0x97BD, + 0x690B, 0xE9A3, 0x690C, 0x97BE, 0x690D, 0xD6B2, 0x690E, 0xD7B5, 0x690F, 0x97BF, 0x6910, 0xE9A7, 0x6911, 0x97C0, 0x6912, 0xBDB7, + 0x6913, 0x97C1, 0x6914, 0x97C2, 0x6915, 0x97C3, 0x6916, 0x97C4, 0x6917, 0x97C5, 0x6918, 0x97C6, 0x6919, 0x97C7, 0x691A, 0x97C8, + 0x691B, 0x97C9, 0x691C, 0x97CA, 0x691D, 0x97CB, 0x691E, 0x97CC, 0x691F, 0xE8FC, 0x6920, 0xE8FD, 0x6921, 0x97CD, 0x6922, 0x97CE, + 0x6923, 0x97CF, 0x6924, 0xE9A1, 0x6925, 0x97D0, 0x6926, 0x97D1, 0x6927, 0x97D2, 0x6928, 0x97D3, 0x6929, 0x97D4, 0x692A, 0x97D5, + 0x692B, 0x97D6, 0x692C, 0x97D7, 0x692D, 0xCDD6, 0x692E, 0x97D8, 0x692F, 0x97D9, 0x6930, 0xD2AC, 0x6931, 0x97DA, 0x6932, 0x97DB, + 0x6933, 0x97DC, 0x6934, 0xE9B2, 0x6935, 0x97DD, 0x6936, 0x97DE, 0x6937, 0x97DF, 0x6938, 0x97E0, 0x6939, 0xE9A9, 0x693A, 0x97E1, + 0x693B, 0x97E2, 0x693C, 0x97E3, 0x693D, 0xB4AA, 0x693E, 0x97E4, 0x693F, 0xB4BB, 0x6940, 0x97E5, 0x6941, 0x97E6, 0x6942, 0xE9AB, + 0x6943, 0x97E7, 0x6944, 0x97E8, 0x6945, 0x97E9, 0x6946, 0x97EA, 0x6947, 0x97EB, 0x6948, 0x97EC, 0x6949, 0x97ED, 0x694A, 0x97EE, + 0x694B, 0x97EF, 0x694C, 0x97F0, 0x694D, 0x97F1, 0x694E, 0x97F2, 0x694F, 0x97F3, 0x6950, 0x97F4, 0x6951, 0x97F5, 0x6952, 0x97F6, + 0x6953, 0x97F7, 0x6954, 0xD0A8, 0x6955, 0x97F8, 0x6956, 0x97F9, 0x6957, 0xE9A5, 0x6958, 0x97FA, 0x6959, 0x97FB, 0x695A, 0xB3FE, + 0x695B, 0x97FC, 0x695C, 0x97FD, 0x695D, 0xE9AC, 0x695E, 0xC0E3, 0x695F, 0x97FE, 0x6960, 0xE9AA, 0x6961, 0x9840, 0x6962, 0x9841, + 0x6963, 0xE9B9, 0x6964, 0x9842, 0x6965, 0x9843, 0x6966, 0xE9B8, 0x6967, 0x9844, 0x6968, 0x9845, 0x6969, 0x9846, 0x696A, 0x9847, + 0x696B, 0xE9AE, 0x696C, 0x9848, 0x696D, 0x9849, 0x696E, 0xE8FA, 0x696F, 0x984A, 0x6970, 0x984B, 0x6971, 0xE9A8, 0x6972, 0x984C, + 0x6973, 0x984D, 0x6974, 0x984E, 0x6975, 0x984F, 0x6976, 0x9850, 0x6977, 0xBFAC, 0x6978, 0xE9B1, 0x6979, 0xE9BA, 0x697A, 0x9851, + 0x697B, 0x9852, 0x697C, 0xC2A5, 0x697D, 0x9853, 0x697E, 0x9854, 0x697F, 0x9855, 0x6980, 0xE9AF, 0x6981, 0x9856, 0x6982, 0xB8C5, + 0x6983, 0x9857, 0x6984, 0xE9AD, 0x6985, 0x9858, 0x6986, 0xD3DC, 0x6987, 0xE9B4, 0x6988, 0xE9B5, 0x6989, 0xE9B7, 0x698A, 0x9859, + 0x698B, 0x985A, 0x698C, 0x985B, 0x698D, 0xE9C7, 0x698E, 0x985C, 0x698F, 0x985D, 0x6990, 0x985E, 0x6991, 0x985F, 0x6992, 0x9860, + 0x6993, 0x9861, 0x6994, 0xC0C6, 0x6995, 0xE9C5, 0x6996, 0x9862, 0x6997, 0x9863, 0x6998, 0xE9B0, 0x6999, 0x9864, 0x699A, 0x9865, + 0x699B, 0xE9BB, 0x699C, 0xB0F1, 0x699D, 0x9866, 0x699E, 0x9867, 0x699F, 0x9868, 0x69A0, 0x9869, 0x69A1, 0x986A, 0x69A2, 0x986B, + 0x69A3, 0x986C, 0x69A4, 0x986D, 0x69A5, 0x986E, 0x69A6, 0x986F, 0x69A7, 0xE9BC, 0x69A8, 0xD5A5, 0x69A9, 0x9870, 0x69AA, 0x9871, + 0x69AB, 0xE9BE, 0x69AC, 0x9872, 0x69AD, 0xE9BF, 0x69AE, 0x9873, 0x69AF, 0x9874, 0x69B0, 0x9875, 0x69B1, 0xE9C1, 0x69B2, 0x9876, + 0x69B3, 0x9877, 0x69B4, 0xC1F1, 0x69B5, 0x9878, 0x69B6, 0x9879, 0x69B7, 0xC8B6, 0x69B8, 0x987A, 0x69B9, 0x987B, 0x69BA, 0x987C, + 0x69BB, 0xE9BD, 0x69BC, 0x987D, 0x69BD, 0x987E, 0x69BE, 0x9880, 0x69BF, 0x9881, 0x69C0, 0x9882, 0x69C1, 0xE9C2, 0x69C2, 0x9883, + 0x69C3, 0x9884, 0x69C4, 0x9885, 0x69C5, 0x9886, 0x69C6, 0x9887, 0x69C7, 0x9888, 0x69C8, 0x9889, 0x69C9, 0x988A, 0x69CA, 0xE9C3, + 0x69CB, 0x988B, 0x69CC, 0xE9B3, 0x69CD, 0x988C, 0x69CE, 0xE9B6, 0x69CF, 0x988D, 0x69D0, 0xBBB1, 0x69D1, 0x988E, 0x69D2, 0x988F, + 0x69D3, 0x9890, 0x69D4, 0xE9C0, 0x69D5, 0x9891, 0x69D6, 0x9892, 0x69D7, 0x9893, 0x69D8, 0x9894, 0x69D9, 0x9895, 0x69DA, 0x9896, + 0x69DB, 0xBCF7, 0x69DC, 0x9897, 0x69DD, 0x9898, 0x69DE, 0x9899, 0x69DF, 0xE9C4, 0x69E0, 0xE9C6, 0x69E1, 0x989A, 0x69E2, 0x989B, + 0x69E3, 0x989C, 0x69E4, 0x989D, 0x69E5, 0x989E, 0x69E6, 0x989F, 0x69E7, 0x98A0, 0x69E8, 0x98A1, 0x69E9, 0x98A2, 0x69EA, 0x98A3, + 0x69EB, 0x98A4, 0x69EC, 0x98A5, 0x69ED, 0xE9CA, 0x69EE, 0x98A6, 0x69EF, 0x98A7, 0x69F0, 0x98A8, 0x69F1, 0x98A9, 0x69F2, 0xE9CE, + 0x69F3, 0x98AA, 0x69F4, 0x98AB, 0x69F5, 0x98AC, 0x69F6, 0x98AD, 0x69F7, 0x98AE, 0x69F8, 0x98AF, 0x69F9, 0x98B0, 0x69FA, 0x98B1, + 0x69FB, 0x98B2, 0x69FC, 0x98B3, 0x69FD, 0xB2DB, 0x69FE, 0x98B4, 0x69FF, 0xE9C8, 0x6A00, 0x98B5, 0x6A01, 0x98B6, 0x6A02, 0x98B7, + 0x6A03, 0x98B8, 0x6A04, 0x98B9, 0x6A05, 0x98BA, 0x6A06, 0x98BB, 0x6A07, 0x98BC, 0x6A08, 0x98BD, 0x6A09, 0x98BE, 0x6A0A, 0xB7AE, + 0x6A0B, 0x98BF, 0x6A0C, 0x98C0, 0x6A0D, 0x98C1, 0x6A0E, 0x98C2, 0x6A0F, 0x98C3, 0x6A10, 0x98C4, 0x6A11, 0x98C5, 0x6A12, 0x98C6, + 0x6A13, 0x98C7, 0x6A14, 0x98C8, 0x6A15, 0x98C9, 0x6A16, 0x98CA, 0x6A17, 0xE9CB, 0x6A18, 0xE9CC, 0x6A19, 0x98CB, 0x6A1A, 0x98CC, + 0x6A1B, 0x98CD, 0x6A1C, 0x98CE, 0x6A1D, 0x98CF, 0x6A1E, 0x98D0, 0x6A1F, 0xD5C1, 0x6A20, 0x98D1, 0x6A21, 0xC4A3, 0x6A22, 0x98D2, + 0x6A23, 0x98D3, 0x6A24, 0x98D4, 0x6A25, 0x98D5, 0x6A26, 0x98D6, 0x6A27, 0x98D7, 0x6A28, 0xE9D8, 0x6A29, 0x98D8, 0x6A2A, 0xBAE1, + 0x6A2B, 0x98D9, 0x6A2C, 0x98DA, 0x6A2D, 0x98DB, 0x6A2E, 0x98DC, 0x6A2F, 0xE9C9, 0x6A30, 0x98DD, 0x6A31, 0xD3A3, 0x6A32, 0x98DE, + 0x6A33, 0x98DF, 0x6A34, 0x98E0, 0x6A35, 0xE9D4, 0x6A36, 0x98E1, 0x6A37, 0x98E2, 0x6A38, 0x98E3, 0x6A39, 0x98E4, 0x6A3A, 0x98E5, + 0x6A3B, 0x98E6, 0x6A3C, 0x98E7, 0x6A3D, 0xE9D7, 0x6A3E, 0xE9D0, 0x6A3F, 0x98E8, 0x6A40, 0x98E9, 0x6A41, 0x98EA, 0x6A42, 0x98EB, + 0x6A43, 0x98EC, 0x6A44, 0xE9CF, 0x6A45, 0x98ED, 0x6A46, 0x98EE, 0x6A47, 0xC7C1, 0x6A48, 0x98EF, 0x6A49, 0x98F0, 0x6A4A, 0x98F1, + 0x6A4B, 0x98F2, 0x6A4C, 0x98F3, 0x6A4D, 0x98F4, 0x6A4E, 0x98F5, 0x6A4F, 0x98F6, 0x6A50, 0xE9D2, 0x6A51, 0x98F7, 0x6A52, 0x98F8, + 0x6A53, 0x98F9, 0x6A54, 0x98FA, 0x6A55, 0x98FB, 0x6A56, 0x98FC, 0x6A57, 0x98FD, 0x6A58, 0xE9D9, 0x6A59, 0xB3C8, 0x6A5A, 0x98FE, + 0x6A5B, 0xE9D3, 0x6A5C, 0x9940, 0x6A5D, 0x9941, 0x6A5E, 0x9942, 0x6A5F, 0x9943, 0x6A60, 0x9944, 0x6A61, 0xCFF0, 0x6A62, 0x9945, + 0x6A63, 0x9946, 0x6A64, 0x9947, 0x6A65, 0xE9CD, 0x6A66, 0x9948, 0x6A67, 0x9949, 0x6A68, 0x994A, 0x6A69, 0x994B, 0x6A6A, 0x994C, + 0x6A6B, 0x994D, 0x6A6C, 0x994E, 0x6A6D, 0x994F, 0x6A6E, 0x9950, 0x6A6F, 0x9951, 0x6A70, 0x9952, 0x6A71, 0xB3F7, 0x6A72, 0x9953, + 0x6A73, 0x9954, 0x6A74, 0x9955, 0x6A75, 0x9956, 0x6A76, 0x9957, 0x6A77, 0x9958, 0x6A78, 0x9959, 0x6A79, 0xE9D6, 0x6A7A, 0x995A, + 0x6A7B, 0x995B, 0x6A7C, 0xE9DA, 0x6A7D, 0x995C, 0x6A7E, 0x995D, 0x6A7F, 0x995E, 0x6A80, 0xCCB4, 0x6A81, 0x995F, 0x6A82, 0x9960, + 0x6A83, 0x9961, 0x6A84, 0xCFAD, 0x6A85, 0x9962, 0x6A86, 0x9963, 0x6A87, 0x9964, 0x6A88, 0x9965, 0x6A89, 0x9966, 0x6A8A, 0x9967, + 0x6A8B, 0x9968, 0x6A8C, 0x9969, 0x6A8D, 0x996A, 0x6A8E, 0xE9D5, 0x6A8F, 0x996B, 0x6A90, 0xE9DC, 0x6A91, 0xE9DB, 0x6A92, 0x996C, + 0x6A93, 0x996D, 0x6A94, 0x996E, 0x6A95, 0x996F, 0x6A96, 0x9970, 0x6A97, 0xE9DE, 0x6A98, 0x9971, 0x6A99, 0x9972, 0x6A9A, 0x9973, + 0x6A9B, 0x9974, 0x6A9C, 0x9975, 0x6A9D, 0x9976, 0x6A9E, 0x9977, 0x6A9F, 0x9978, 0x6AA0, 0xE9D1, 0x6AA1, 0x9979, 0x6AA2, 0x997A, + 0x6AA3, 0x997B, 0x6AA4, 0x997C, 0x6AA5, 0x997D, 0x6AA6, 0x997E, 0x6AA7, 0x9980, 0x6AA8, 0x9981, 0x6AA9, 0xE9DD, 0x6AAA, 0x9982, + 0x6AAB, 0xE9DF, 0x6AAC, 0xC3CA, 0x6AAD, 0x9983, 0x6AAE, 0x9984, 0x6AAF, 0x9985, 0x6AB0, 0x9986, 0x6AB1, 0x9987, 0x6AB2, 0x9988, + 0x6AB3, 0x9989, 0x6AB4, 0x998A, 0x6AB5, 0x998B, 0x6AB6, 0x998C, 0x6AB7, 0x998D, 0x6AB8, 0x998E, 0x6AB9, 0x998F, 0x6ABA, 0x9990, + 0x6ABB, 0x9991, 0x6ABC, 0x9992, 0x6ABD, 0x9993, 0x6ABE, 0x9994, 0x6ABF, 0x9995, 0x6AC0, 0x9996, 0x6AC1, 0x9997, 0x6AC2, 0x9998, + 0x6AC3, 0x9999, 0x6AC4, 0x999A, 0x6AC5, 0x999B, 0x6AC6, 0x999C, 0x6AC7, 0x999D, 0x6AC8, 0x999E, 0x6AC9, 0x999F, 0x6ACA, 0x99A0, + 0x6ACB, 0x99A1, 0x6ACC, 0x99A2, 0x6ACD, 0x99A3, 0x6ACE, 0x99A4, 0x6ACF, 0x99A5, 0x6AD0, 0x99A6, 0x6AD1, 0x99A7, 0x6AD2, 0x99A8, + 0x6AD3, 0x99A9, 0x6AD4, 0x99AA, 0x6AD5, 0x99AB, 0x6AD6, 0x99AC, 0x6AD7, 0x99AD, 0x6AD8, 0x99AE, 0x6AD9, 0x99AF, 0x6ADA, 0x99B0, + 0x6ADB, 0x99B1, 0x6ADC, 0x99B2, 0x6ADD, 0x99B3, 0x6ADE, 0x99B4, 0x6ADF, 0x99B5, 0x6AE0, 0x99B6, 0x6AE1, 0x99B7, 0x6AE2, 0x99B8, + 0x6AE3, 0x99B9, 0x6AE4, 0x99BA, 0x6AE5, 0x99BB, 0x6AE6, 0x99BC, 0x6AE7, 0x99BD, 0x6AE8, 0x99BE, 0x6AE9, 0x99BF, 0x6AEA, 0x99C0, + 0x6AEB, 0x99C1, 0x6AEC, 0x99C2, 0x6AED, 0x99C3, 0x6AEE, 0x99C4, 0x6AEF, 0x99C5, 0x6AF0, 0x99C6, 0x6AF1, 0x99C7, 0x6AF2, 0x99C8, + 0x6AF3, 0x99C9, 0x6AF4, 0x99CA, 0x6AF5, 0x99CB, 0x6AF6, 0x99CC, 0x6AF7, 0x99CD, 0x6AF8, 0x99CE, 0x6AF9, 0x99CF, 0x6AFA, 0x99D0, + 0x6AFB, 0x99D1, 0x6AFC, 0x99D2, 0x6AFD, 0x99D3, 0x6AFE, 0x99D4, 0x6AFF, 0x99D5, 0x6B00, 0x99D6, 0x6B01, 0x99D7, 0x6B02, 0x99D8, + 0x6B03, 0x99D9, 0x6B04, 0x99DA, 0x6B05, 0x99DB, 0x6B06, 0x99DC, 0x6B07, 0x99DD, 0x6B08, 0x99DE, 0x6B09, 0x99DF, 0x6B0A, 0x99E0, + 0x6B0B, 0x99E1, 0x6B0C, 0x99E2, 0x6B0D, 0x99E3, 0x6B0E, 0x99E4, 0x6B0F, 0x99E5, 0x6B10, 0x99E6, 0x6B11, 0x99E7, 0x6B12, 0x99E8, + 0x6B13, 0x99E9, 0x6B14, 0x99EA, 0x6B15, 0x99EB, 0x6B16, 0x99EC, 0x6B17, 0x99ED, 0x6B18, 0x99EE, 0x6B19, 0x99EF, 0x6B1A, 0x99F0, + 0x6B1B, 0x99F1, 0x6B1C, 0x99F2, 0x6B1D, 0x99F3, 0x6B1E, 0x99F4, 0x6B1F, 0x99F5, 0x6B20, 0xC7B7, 0x6B21, 0xB4CE, 0x6B22, 0xBBB6, + 0x6B23, 0xD0C0, 0x6B24, 0xECA3, 0x6B25, 0x99F6, 0x6B26, 0x99F7, 0x6B27, 0xC5B7, 0x6B28, 0x99F8, 0x6B29, 0x99F9, 0x6B2A, 0x99FA, + 0x6B2B, 0x99FB, 0x6B2C, 0x99FC, 0x6B2D, 0x99FD, 0x6B2E, 0x99FE, 0x6B2F, 0x9A40, 0x6B30, 0x9A41, 0x6B31, 0x9A42, 0x6B32, 0xD3FB, + 0x6B33, 0x9A43, 0x6B34, 0x9A44, 0x6B35, 0x9A45, 0x6B36, 0x9A46, 0x6B37, 0xECA4, 0x6B38, 0x9A47, 0x6B39, 0xECA5, 0x6B3A, 0xC6DB, + 0x6B3B, 0x9A48, 0x6B3C, 0x9A49, 0x6B3D, 0x9A4A, 0x6B3E, 0xBFEE, 0x6B3F, 0x9A4B, 0x6B40, 0x9A4C, 0x6B41, 0x9A4D, 0x6B42, 0x9A4E, + 0x6B43, 0xECA6, 0x6B44, 0x9A4F, 0x6B45, 0x9A50, 0x6B46, 0xECA7, 0x6B47, 0xD0AA, 0x6B48, 0x9A51, 0x6B49, 0xC7B8, 0x6B4A, 0x9A52, + 0x6B4B, 0x9A53, 0x6B4C, 0xB8E8, 0x6B4D, 0x9A54, 0x6B4E, 0x9A55, 0x6B4F, 0x9A56, 0x6B50, 0x9A57, 0x6B51, 0x9A58, 0x6B52, 0x9A59, + 0x6B53, 0x9A5A, 0x6B54, 0x9A5B, 0x6B55, 0x9A5C, 0x6B56, 0x9A5D, 0x6B57, 0x9A5E, 0x6B58, 0x9A5F, 0x6B59, 0xECA8, 0x6B5A, 0x9A60, + 0x6B5B, 0x9A61, 0x6B5C, 0x9A62, 0x6B5D, 0x9A63, 0x6B5E, 0x9A64, 0x6B5F, 0x9A65, 0x6B60, 0x9A66, 0x6B61, 0x9A67, 0x6B62, 0xD6B9, + 0x6B63, 0xD5FD, 0x6B64, 0xB4CB, 0x6B65, 0xB2BD, 0x6B66, 0xCEE4, 0x6B67, 0xC6E7, 0x6B68, 0x9A68, 0x6B69, 0x9A69, 0x6B6A, 0xCDE1, + 0x6B6B, 0x9A6A, 0x6B6C, 0x9A6B, 0x6B6D, 0x9A6C, 0x6B6E, 0x9A6D, 0x6B6F, 0x9A6E, 0x6B70, 0x9A6F, 0x6B71, 0x9A70, 0x6B72, 0x9A71, + 0x6B73, 0x9A72, 0x6B74, 0x9A73, 0x6B75, 0x9A74, 0x6B76, 0x9A75, 0x6B77, 0x9A76, 0x6B78, 0x9A77, 0x6B79, 0xB4F5, 0x6B7A, 0x9A78, + 0x6B7B, 0xCBC0, 0x6B7C, 0xBCDF, 0x6B7D, 0x9A79, 0x6B7E, 0x9A7A, 0x6B7F, 0x9A7B, 0x6B80, 0x9A7C, 0x6B81, 0xE9E2, 0x6B82, 0xE9E3, + 0x6B83, 0xD1EA, 0x6B84, 0xE9E5, 0x6B85, 0x9A7D, 0x6B86, 0xB4F9, 0x6B87, 0xE9E4, 0x6B88, 0x9A7E, 0x6B89, 0xD1B3, 0x6B8A, 0xCAE2, + 0x6B8B, 0xB2D0, 0x6B8C, 0x9A80, 0x6B8D, 0xE9E8, 0x6B8E, 0x9A81, 0x6B8F, 0x9A82, 0x6B90, 0x9A83, 0x6B91, 0x9A84, 0x6B92, 0xE9E6, + 0x6B93, 0xE9E7, 0x6B94, 0x9A85, 0x6B95, 0x9A86, 0x6B96, 0xD6B3, 0x6B97, 0x9A87, 0x6B98, 0x9A88, 0x6B99, 0x9A89, 0x6B9A, 0xE9E9, + 0x6B9B, 0xE9EA, 0x6B9C, 0x9A8A, 0x6B9D, 0x9A8B, 0x6B9E, 0x9A8C, 0x6B9F, 0x9A8D, 0x6BA0, 0x9A8E, 0x6BA1, 0xE9EB, 0x6BA2, 0x9A8F, + 0x6BA3, 0x9A90, 0x6BA4, 0x9A91, 0x6BA5, 0x9A92, 0x6BA6, 0x9A93, 0x6BA7, 0x9A94, 0x6BA8, 0x9A95, 0x6BA9, 0x9A96, 0x6BAA, 0xE9EC, + 0x6BAB, 0x9A97, 0x6BAC, 0x9A98, 0x6BAD, 0x9A99, 0x6BAE, 0x9A9A, 0x6BAF, 0x9A9B, 0x6BB0, 0x9A9C, 0x6BB1, 0x9A9D, 0x6BB2, 0x9A9E, + 0x6BB3, 0xECAF, 0x6BB4, 0xC5B9, 0x6BB5, 0xB6CE, 0x6BB6, 0x9A9F, 0x6BB7, 0xD2F3, 0x6BB8, 0x9AA0, 0x6BB9, 0x9AA1, 0x6BBA, 0x9AA2, + 0x6BBB, 0x9AA3, 0x6BBC, 0x9AA4, 0x6BBD, 0x9AA5, 0x6BBE, 0x9AA6, 0x6BBF, 0xB5EE, 0x6BC0, 0x9AA7, 0x6BC1, 0xBBD9, 0x6BC2, 0xECB1, + 0x6BC3, 0x9AA8, 0x6BC4, 0x9AA9, 0x6BC5, 0xD2E3, 0x6BC6, 0x9AAA, 0x6BC7, 0x9AAB, 0x6BC8, 0x9AAC, 0x6BC9, 0x9AAD, 0x6BCA, 0x9AAE, + 0x6BCB, 0xCEE3, 0x6BCC, 0x9AAF, 0x6BCD, 0xC4B8, 0x6BCE, 0x9AB0, 0x6BCF, 0xC3BF, 0x6BD0, 0x9AB1, 0x6BD1, 0x9AB2, 0x6BD2, 0xB6BE, + 0x6BD3, 0xD8B9, 0x6BD4, 0xB1C8, 0x6BD5, 0xB1CF, 0x6BD6, 0xB1D1, 0x6BD7, 0xC5FE, 0x6BD8, 0x9AB3, 0x6BD9, 0xB1D0, 0x6BDA, 0x9AB4, + 0x6BDB, 0xC3AB, 0x6BDC, 0x9AB5, 0x6BDD, 0x9AB6, 0x6BDE, 0x9AB7, 0x6BDF, 0x9AB8, 0x6BE0, 0x9AB9, 0x6BE1, 0xD5B1, 0x6BE2, 0x9ABA, + 0x6BE3, 0x9ABB, 0x6BE4, 0x9ABC, 0x6BE5, 0x9ABD, 0x6BE6, 0x9ABE, 0x6BE7, 0x9ABF, 0x6BE8, 0x9AC0, 0x6BE9, 0x9AC1, 0x6BEA, 0xEBA4, + 0x6BEB, 0xBAC1, 0x6BEC, 0x9AC2, 0x6BED, 0x9AC3, 0x6BEE, 0x9AC4, 0x6BEF, 0xCCBA, 0x6BF0, 0x9AC5, 0x6BF1, 0x9AC6, 0x6BF2, 0x9AC7, + 0x6BF3, 0xEBA5, 0x6BF4, 0x9AC8, 0x6BF5, 0xEBA7, 0x6BF6, 0x9AC9, 0x6BF7, 0x9ACA, 0x6BF8, 0x9ACB, 0x6BF9, 0xEBA8, 0x6BFA, 0x9ACC, + 0x6BFB, 0x9ACD, 0x6BFC, 0x9ACE, 0x6BFD, 0xEBA6, 0x6BFE, 0x9ACF, 0x6BFF, 0x9AD0, 0x6C00, 0x9AD1, 0x6C01, 0x9AD2, 0x6C02, 0x9AD3, + 0x6C03, 0x9AD4, 0x6C04, 0x9AD5, 0x6C05, 0xEBA9, 0x6C06, 0xEBAB, 0x6C07, 0xEBAA, 0x6C08, 0x9AD6, 0x6C09, 0x9AD7, 0x6C0A, 0x9AD8, + 0x6C0B, 0x9AD9, 0x6C0C, 0x9ADA, 0x6C0D, 0xEBAC, 0x6C0E, 0x9ADB, 0x6C0F, 0xCACF, 0x6C10, 0xD8B5, 0x6C11, 0xC3F1, 0x6C12, 0x9ADC, + 0x6C13, 0xC3A5, 0x6C14, 0xC6F8, 0x6C15, 0xEBAD, 0x6C16, 0xC4CA, 0x6C17, 0x9ADD, 0x6C18, 0xEBAE, 0x6C19, 0xEBAF, 0x6C1A, 0xEBB0, + 0x6C1B, 0xB7D5, 0x6C1C, 0x9ADE, 0x6C1D, 0x9ADF, 0x6C1E, 0x9AE0, 0x6C1F, 0xB7FA, 0x6C20, 0x9AE1, 0x6C21, 0xEBB1, 0x6C22, 0xC7E2, + 0x6C23, 0x9AE2, 0x6C24, 0xEBB3, 0x6C25, 0x9AE3, 0x6C26, 0xBAA4, 0x6C27, 0xD1F5, 0x6C28, 0xB0B1, 0x6C29, 0xEBB2, 0x6C2A, 0xEBB4, + 0x6C2B, 0x9AE4, 0x6C2C, 0x9AE5, 0x6C2D, 0x9AE6, 0x6C2E, 0xB5AA, 0x6C2F, 0xC2C8, 0x6C30, 0xC7E8, 0x6C31, 0x9AE7, 0x6C32, 0xEBB5, + 0x6C33, 0x9AE8, 0x6C34, 0xCBAE, 0x6C35, 0xE3DF, 0x6C36, 0x9AE9, 0x6C37, 0x9AEA, 0x6C38, 0xD3C0, 0x6C39, 0x9AEB, 0x6C3A, 0x9AEC, + 0x6C3B, 0x9AED, 0x6C3C, 0x9AEE, 0x6C3D, 0xD9DB, 0x6C3E, 0x9AEF, 0x6C3F, 0x9AF0, 0x6C40, 0xCDA1, 0x6C41, 0xD6AD, 0x6C42, 0xC7F3, + 0x6C43, 0x9AF1, 0x6C44, 0x9AF2, 0x6C45, 0x9AF3, 0x6C46, 0xD9E0, 0x6C47, 0xBBE3, 0x6C48, 0x9AF4, 0x6C49, 0xBABA, 0x6C4A, 0xE3E2, + 0x6C4B, 0x9AF5, 0x6C4C, 0x9AF6, 0x6C4D, 0x9AF7, 0x6C4E, 0x9AF8, 0x6C4F, 0x9AF9, 0x6C50, 0xCFAB, 0x6C51, 0x9AFA, 0x6C52, 0x9AFB, + 0x6C53, 0x9AFC, 0x6C54, 0xE3E0, 0x6C55, 0xC9C7, 0x6C56, 0x9AFD, 0x6C57, 0xBAB9, 0x6C58, 0x9AFE, 0x6C59, 0x9B40, 0x6C5A, 0x9B41, + 0x6C5B, 0xD1B4, 0x6C5C, 0xE3E1, 0x6C5D, 0xC8EA, 0x6C5E, 0xB9AF, 0x6C5F, 0xBDAD, 0x6C60, 0xB3D8, 0x6C61, 0xCEDB, 0x6C62, 0x9B42, + 0x6C63, 0x9B43, 0x6C64, 0xCCC0, 0x6C65, 0x9B44, 0x6C66, 0x9B45, 0x6C67, 0x9B46, 0x6C68, 0xE3E8, 0x6C69, 0xE3E9, 0x6C6A, 0xCDF4, + 0x6C6B, 0x9B47, 0x6C6C, 0x9B48, 0x6C6D, 0x9B49, 0x6C6E, 0x9B4A, 0x6C6F, 0x9B4B, 0x6C70, 0xCCAD, 0x6C71, 0x9B4C, 0x6C72, 0xBCB3, + 0x6C73, 0x9B4D, 0x6C74, 0xE3EA, 0x6C75, 0x9B4E, 0x6C76, 0xE3EB, 0x6C77, 0x9B4F, 0x6C78, 0x9B50, 0x6C79, 0xD0DA, 0x6C7A, 0x9B51, + 0x6C7B, 0x9B52, 0x6C7C, 0x9B53, 0x6C7D, 0xC6FB, 0x6C7E, 0xB7DA, 0x6C7F, 0x9B54, 0x6C80, 0x9B55, 0x6C81, 0xC7DF, 0x6C82, 0xD2CA, + 0x6C83, 0xCED6, 0x6C84, 0x9B56, 0x6C85, 0xE3E4, 0x6C86, 0xE3EC, 0x6C87, 0x9B57, 0x6C88, 0xC9F2, 0x6C89, 0xB3C1, 0x6C8A, 0x9B58, + 0x6C8B, 0x9B59, 0x6C8C, 0xE3E7, 0x6C8D, 0x9B5A, 0x6C8E, 0x9B5B, 0x6C8F, 0xC6E3, 0x6C90, 0xE3E5, 0x6C91, 0x9B5C, 0x6C92, 0x9B5D, + 0x6C93, 0xEDB3, 0x6C94, 0xE3E6, 0x6C95, 0x9B5E, 0x6C96, 0x9B5F, 0x6C97, 0x9B60, 0x6C98, 0x9B61, 0x6C99, 0xC9B3, 0x6C9A, 0x9B62, + 0x6C9B, 0xC5E6, 0x6C9C, 0x9B63, 0x6C9D, 0x9B64, 0x6C9E, 0x9B65, 0x6C9F, 0xB9B5, 0x6CA0, 0x9B66, 0x6CA1, 0xC3BB, 0x6CA2, 0x9B67, + 0x6CA3, 0xE3E3, 0x6CA4, 0xC5BD, 0x6CA5, 0xC1A4, 0x6CA6, 0xC2D9, 0x6CA7, 0xB2D7, 0x6CA8, 0x9B68, 0x6CA9, 0xE3ED, 0x6CAA, 0xBBA6, + 0x6CAB, 0xC4AD, 0x6CAC, 0x9B69, 0x6CAD, 0xE3F0, 0x6CAE, 0xBEDA, 0x6CAF, 0x9B6A, 0x6CB0, 0x9B6B, 0x6CB1, 0xE3FB, 0x6CB2, 0xE3F5, + 0x6CB3, 0xBAD3, 0x6CB4, 0x9B6C, 0x6CB5, 0x9B6D, 0x6CB6, 0x9B6E, 0x6CB7, 0x9B6F, 0x6CB8, 0xB7D0, 0x6CB9, 0xD3CD, 0x6CBA, 0x9B70, + 0x6CBB, 0xD6CE, 0x6CBC, 0xD5D3, 0x6CBD, 0xB9C1, 0x6CBE, 0xD5B4, 0x6CBF, 0xD1D8, 0x6CC0, 0x9B71, 0x6CC1, 0x9B72, 0x6CC2, 0x9B73, + 0x6CC3, 0x9B74, 0x6CC4, 0xD0B9, 0x6CC5, 0xC7F6, 0x6CC6, 0x9B75, 0x6CC7, 0x9B76, 0x6CC8, 0x9B77, 0x6CC9, 0xC8AA, 0x6CCA, 0xB2B4, + 0x6CCB, 0x9B78, 0x6CCC, 0xC3DA, 0x6CCD, 0x9B79, 0x6CCE, 0x9B7A, 0x6CCF, 0x9B7B, 0x6CD0, 0xE3EE, 0x6CD1, 0x9B7C, 0x6CD2, 0x9B7D, + 0x6CD3, 0xE3FC, 0x6CD4, 0xE3EF, 0x6CD5, 0xB7A8, 0x6CD6, 0xE3F7, 0x6CD7, 0xE3F4, 0x6CD8, 0x9B7E, 0x6CD9, 0x9B80, 0x6CDA, 0x9B81, + 0x6CDB, 0xB7BA, 0x6CDC, 0x9B82, 0x6CDD, 0x9B83, 0x6CDE, 0xC5A2, 0x6CDF, 0x9B84, 0x6CE0, 0xE3F6, 0x6CE1, 0xC5DD, 0x6CE2, 0xB2A8, + 0x6CE3, 0xC6FC, 0x6CE4, 0x9B85, 0x6CE5, 0xC4E0, 0x6CE6, 0x9B86, 0x6CE7, 0x9B87, 0x6CE8, 0xD7A2, 0x6CE9, 0x9B88, 0x6CEA, 0xC0E1, + 0x6CEB, 0xE3F9, 0x6CEC, 0x9B89, 0x6CED, 0x9B8A, 0x6CEE, 0xE3FA, 0x6CEF, 0xE3FD, 0x6CF0, 0xCCA9, 0x6CF1, 0xE3F3, 0x6CF2, 0x9B8B, + 0x6CF3, 0xD3BE, 0x6CF4, 0x9B8C, 0x6CF5, 0xB1C3, 0x6CF6, 0xEDB4, 0x6CF7, 0xE3F1, 0x6CF8, 0xE3F2, 0x6CF9, 0x9B8D, 0x6CFA, 0xE3F8, + 0x6CFB, 0xD0BA, 0x6CFC, 0xC6C3, 0x6CFD, 0xD4F3, 0x6CFE, 0xE3FE, 0x6CFF, 0x9B8E, 0x6D00, 0x9B8F, 0x6D01, 0xBDE0, 0x6D02, 0x9B90, + 0x6D03, 0x9B91, 0x6D04, 0xE4A7, 0x6D05, 0x9B92, 0x6D06, 0x9B93, 0x6D07, 0xE4A6, 0x6D08, 0x9B94, 0x6D09, 0x9B95, 0x6D0A, 0x9B96, + 0x6D0B, 0xD1F3, 0x6D0C, 0xE4A3, 0x6D0D, 0x9B97, 0x6D0E, 0xE4A9, 0x6D0F, 0x9B98, 0x6D10, 0x9B99, 0x6D11, 0x9B9A, 0x6D12, 0xC8F7, + 0x6D13, 0x9B9B, 0x6D14, 0x9B9C, 0x6D15, 0x9B9D, 0x6D16, 0x9B9E, 0x6D17, 0xCFB4, 0x6D18, 0x9B9F, 0x6D19, 0xE4A8, 0x6D1A, 0xE4AE, + 0x6D1B, 0xC2E5, 0x6D1C, 0x9BA0, 0x6D1D, 0x9BA1, 0x6D1E, 0xB6B4, 0x6D1F, 0x9BA2, 0x6D20, 0x9BA3, 0x6D21, 0x9BA4, 0x6D22, 0x9BA5, + 0x6D23, 0x9BA6, 0x6D24, 0x9BA7, 0x6D25, 0xBDF2, 0x6D26, 0x9BA8, 0x6D27, 0xE4A2, 0x6D28, 0x9BA9, 0x6D29, 0x9BAA, 0x6D2A, 0xBAE9, + 0x6D2B, 0xE4AA, 0x6D2C, 0x9BAB, 0x6D2D, 0x9BAC, 0x6D2E, 0xE4AC, 0x6D2F, 0x9BAD, 0x6D30, 0x9BAE, 0x6D31, 0xB6FD, 0x6D32, 0xD6DE, + 0x6D33, 0xE4B2, 0x6D34, 0x9BAF, 0x6D35, 0xE4AD, 0x6D36, 0x9BB0, 0x6D37, 0x9BB1, 0x6D38, 0x9BB2, 0x6D39, 0xE4A1, 0x6D3A, 0x9BB3, + 0x6D3B, 0xBBEE, 0x6D3C, 0xCDDD, 0x6D3D, 0xC7A2, 0x6D3E, 0xC5C9, 0x6D3F, 0x9BB4, 0x6D40, 0x9BB5, 0x6D41, 0xC1F7, 0x6D42, 0x9BB6, + 0x6D43, 0xE4A4, 0x6D44, 0x9BB7, 0x6D45, 0xC7B3, 0x6D46, 0xBDAC, 0x6D47, 0xBDBD, 0x6D48, 0xE4A5, 0x6D49, 0x9BB8, 0x6D4A, 0xD7C7, + 0x6D4B, 0xB2E2, 0x6D4C, 0x9BB9, 0x6D4D, 0xE4AB, 0x6D4E, 0xBCC3, 0x6D4F, 0xE4AF, 0x6D50, 0x9BBA, 0x6D51, 0xBBEB, 0x6D52, 0xE4B0, + 0x6D53, 0xC5A8, 0x6D54, 0xE4B1, 0x6D55, 0x9BBB, 0x6D56, 0x9BBC, 0x6D57, 0x9BBD, 0x6D58, 0x9BBE, 0x6D59, 0xD5E3, 0x6D5A, 0xBFA3, + 0x6D5B, 0x9BBF, 0x6D5C, 0xE4BA, 0x6D5D, 0x9BC0, 0x6D5E, 0xE4B7, 0x6D5F, 0x9BC1, 0x6D60, 0xE4BB, 0x6D61, 0x9BC2, 0x6D62, 0x9BC3, + 0x6D63, 0xE4BD, 0x6D64, 0x9BC4, 0x6D65, 0x9BC5, 0x6D66, 0xC6D6, 0x6D67, 0x9BC6, 0x6D68, 0x9BC7, 0x6D69, 0xBAC6, 0x6D6A, 0xC0CB, + 0x6D6B, 0x9BC8, 0x6D6C, 0x9BC9, 0x6D6D, 0x9BCA, 0x6D6E, 0xB8A1, 0x6D6F, 0xE4B4, 0x6D70, 0x9BCB, 0x6D71, 0x9BCC, 0x6D72, 0x9BCD, + 0x6D73, 0x9BCE, 0x6D74, 0xD4A1, 0x6D75, 0x9BCF, 0x6D76, 0x9BD0, 0x6D77, 0xBAA3, 0x6D78, 0xBDFE, 0x6D79, 0x9BD1, 0x6D7A, 0x9BD2, + 0x6D7B, 0x9BD3, 0x6D7C, 0xE4BC, 0x6D7D, 0x9BD4, 0x6D7E, 0x9BD5, 0x6D7F, 0x9BD6, 0x6D80, 0x9BD7, 0x6D81, 0x9BD8, 0x6D82, 0xCDBF, + 0x6D83, 0x9BD9, 0x6D84, 0x9BDA, 0x6D85, 0xC4F9, 0x6D86, 0x9BDB, 0x6D87, 0x9BDC, 0x6D88, 0xCFFB, 0x6D89, 0xC9E6, 0x6D8A, 0x9BDD, + 0x6D8B, 0x9BDE, 0x6D8C, 0xD3BF, 0x6D8D, 0x9BDF, 0x6D8E, 0xCFD1, 0x6D8F, 0x9BE0, 0x6D90, 0x9BE1, 0x6D91, 0xE4B3, 0x6D92, 0x9BE2, + 0x6D93, 0xE4B8, 0x6D94, 0xE4B9, 0x6D95, 0xCCE9, 0x6D96, 0x9BE3, 0x6D97, 0x9BE4, 0x6D98, 0x9BE5, 0x6D99, 0x9BE6, 0x6D9A, 0x9BE7, + 0x6D9B, 0xCCCE, 0x6D9C, 0x9BE8, 0x6D9D, 0xC0D4, 0x6D9E, 0xE4B5, 0x6D9F, 0xC1B0, 0x6DA0, 0xE4B6, 0x6DA1, 0xCED0, 0x6DA2, 0x9BE9, + 0x6DA3, 0xBBC1, 0x6DA4, 0xB5D3, 0x6DA5, 0x9BEA, 0x6DA6, 0xC8F3, 0x6DA7, 0xBDA7, 0x6DA8, 0xD5C7, 0x6DA9, 0xC9AC, 0x6DAA, 0xB8A2, + 0x6DAB, 0xE4CA, 0x6DAC, 0x9BEB, 0x6DAD, 0x9BEC, 0x6DAE, 0xE4CC, 0x6DAF, 0xD1C4, 0x6DB0, 0x9BED, 0x6DB1, 0x9BEE, 0x6DB2, 0xD2BA, + 0x6DB3, 0x9BEF, 0x6DB4, 0x9BF0, 0x6DB5, 0xBAAD, 0x6DB6, 0x9BF1, 0x6DB7, 0x9BF2, 0x6DB8, 0xBAD4, 0x6DB9, 0x9BF3, 0x6DBA, 0x9BF4, + 0x6DBB, 0x9BF5, 0x6DBC, 0x9BF6, 0x6DBD, 0x9BF7, 0x6DBE, 0x9BF8, 0x6DBF, 0xE4C3, 0x6DC0, 0xB5ED, 0x6DC1, 0x9BF9, 0x6DC2, 0x9BFA, + 0x6DC3, 0x9BFB, 0x6DC4, 0xD7CD, 0x6DC5, 0xE4C0, 0x6DC6, 0xCFFD, 0x6DC7, 0xE4BF, 0x6DC8, 0x9BFC, 0x6DC9, 0x9BFD, 0x6DCA, 0x9BFE, + 0x6DCB, 0xC1DC, 0x6DCC, 0xCCCA, 0x6DCD, 0x9C40, 0x6DCE, 0x9C41, 0x6DCF, 0x9C42, 0x6DD0, 0x9C43, 0x6DD1, 0xCAE7, 0x6DD2, 0x9C44, + 0x6DD3, 0x9C45, 0x6DD4, 0x9C46, 0x6DD5, 0x9C47, 0x6DD6, 0xC4D7, 0x6DD7, 0x9C48, 0x6DD8, 0xCCD4, 0x6DD9, 0xE4C8, 0x6DDA, 0x9C49, + 0x6DDB, 0x9C4A, 0x6DDC, 0x9C4B, 0x6DDD, 0xE4C7, 0x6DDE, 0xE4C1, 0x6DDF, 0x9C4C, 0x6DE0, 0xE4C4, 0x6DE1, 0xB5AD, 0x6DE2, 0x9C4D, + 0x6DE3, 0x9C4E, 0x6DE4, 0xD3D9, 0x6DE5, 0x9C4F, 0x6DE6, 0xE4C6, 0x6DE7, 0x9C50, 0x6DE8, 0x9C51, 0x6DE9, 0x9C52, 0x6DEA, 0x9C53, + 0x6DEB, 0xD2F9, 0x6DEC, 0xB4E3, 0x6DED, 0x9C54, 0x6DEE, 0xBBB4, 0x6DEF, 0x9C55, 0x6DF0, 0x9C56, 0x6DF1, 0xC9EE, 0x6DF2, 0x9C57, + 0x6DF3, 0xB4BE, 0x6DF4, 0x9C58, 0x6DF5, 0x9C59, 0x6DF6, 0x9C5A, 0x6DF7, 0xBBEC, 0x6DF8, 0x9C5B, 0x6DF9, 0xD1CD, 0x6DFA, 0x9C5C, + 0x6DFB, 0xCCED, 0x6DFC, 0xEDB5, 0x6DFD, 0x9C5D, 0x6DFE, 0x9C5E, 0x6DFF, 0x9C5F, 0x6E00, 0x9C60, 0x6E01, 0x9C61, 0x6E02, 0x9C62, + 0x6E03, 0x9C63, 0x6E04, 0x9C64, 0x6E05, 0xC7E5, 0x6E06, 0x9C65, 0x6E07, 0x9C66, 0x6E08, 0x9C67, 0x6E09, 0x9C68, 0x6E0A, 0xD4A8, + 0x6E0B, 0x9C69, 0x6E0C, 0xE4CB, 0x6E0D, 0xD7D5, 0x6E0E, 0xE4C2, 0x6E0F, 0x9C6A, 0x6E10, 0xBDA5, 0x6E11, 0xE4C5, 0x6E12, 0x9C6B, + 0x6E13, 0x9C6C, 0x6E14, 0xD3E6, 0x6E15, 0x9C6D, 0x6E16, 0xE4C9, 0x6E17, 0xC9F8, 0x6E18, 0x9C6E, 0x6E19, 0x9C6F, 0x6E1A, 0xE4BE, + 0x6E1B, 0x9C70, 0x6E1C, 0x9C71, 0x6E1D, 0xD3E5, 0x6E1E, 0x9C72, 0x6E1F, 0x9C73, 0x6E20, 0xC7FE, 0x6E21, 0xB6C9, 0x6E22, 0x9C74, + 0x6E23, 0xD4FC, 0x6E24, 0xB2B3, 0x6E25, 0xE4D7, 0x6E26, 0x9C75, 0x6E27, 0x9C76, 0x6E28, 0x9C77, 0x6E29, 0xCEC2, 0x6E2A, 0x9C78, + 0x6E2B, 0xE4CD, 0x6E2C, 0x9C79, 0x6E2D, 0xCEBC, 0x6E2E, 0x9C7A, 0x6E2F, 0xB8DB, 0x6E30, 0x9C7B, 0x6E31, 0x9C7C, 0x6E32, 0xE4D6, + 0x6E33, 0x9C7D, 0x6E34, 0xBFCA, 0x6E35, 0x9C7E, 0x6E36, 0x9C80, 0x6E37, 0x9C81, 0x6E38, 0xD3CE, 0x6E39, 0x9C82, 0x6E3A, 0xC3EC, + 0x6E3B, 0x9C83, 0x6E3C, 0x9C84, 0x6E3D, 0x9C85, 0x6E3E, 0x9C86, 0x6E3F, 0x9C87, 0x6E40, 0x9C88, 0x6E41, 0x9C89, 0x6E42, 0x9C8A, + 0x6E43, 0xC5C8, 0x6E44, 0xE4D8, 0x6E45, 0x9C8B, 0x6E46, 0x9C8C, 0x6E47, 0x9C8D, 0x6E48, 0x9C8E, 0x6E49, 0x9C8F, 0x6E4A, 0x9C90, + 0x6E4B, 0x9C91, 0x6E4C, 0x9C92, 0x6E4D, 0xCDC4, 0x6E4E, 0xE4CF, 0x6E4F, 0x9C93, 0x6E50, 0x9C94, 0x6E51, 0x9C95, 0x6E52, 0x9C96, + 0x6E53, 0xE4D4, 0x6E54, 0xE4D5, 0x6E55, 0x9C97, 0x6E56, 0xBAFE, 0x6E57, 0x9C98, 0x6E58, 0xCFE6, 0x6E59, 0x9C99, 0x6E5A, 0x9C9A, + 0x6E5B, 0xD5BF, 0x6E5C, 0x9C9B, 0x6E5D, 0x9C9C, 0x6E5E, 0x9C9D, 0x6E5F, 0xE4D2, 0x6E60, 0x9C9E, 0x6E61, 0x9C9F, 0x6E62, 0x9CA0, + 0x6E63, 0x9CA1, 0x6E64, 0x9CA2, 0x6E65, 0x9CA3, 0x6E66, 0x9CA4, 0x6E67, 0x9CA5, 0x6E68, 0x9CA6, 0x6E69, 0x9CA7, 0x6E6A, 0x9CA8, + 0x6E6B, 0xE4D0, 0x6E6C, 0x9CA9, 0x6E6D, 0x9CAA, 0x6E6E, 0xE4CE, 0x6E6F, 0x9CAB, 0x6E70, 0x9CAC, 0x6E71, 0x9CAD, 0x6E72, 0x9CAE, + 0x6E73, 0x9CAF, 0x6E74, 0x9CB0, 0x6E75, 0x9CB1, 0x6E76, 0x9CB2, 0x6E77, 0x9CB3, 0x6E78, 0x9CB4, 0x6E79, 0x9CB5, 0x6E7A, 0x9CB6, + 0x6E7B, 0x9CB7, 0x6E7C, 0x9CB8, 0x6E7D, 0x9CB9, 0x6E7E, 0xCDE5, 0x6E7F, 0xCAAA, 0x6E80, 0x9CBA, 0x6E81, 0x9CBB, 0x6E82, 0x9CBC, + 0x6E83, 0xC0A3, 0x6E84, 0x9CBD, 0x6E85, 0xBDA6, 0x6E86, 0xE4D3, 0x6E87, 0x9CBE, 0x6E88, 0x9CBF, 0x6E89, 0xB8C8, 0x6E8A, 0x9CC0, + 0x6E8B, 0x9CC1, 0x6E8C, 0x9CC2, 0x6E8D, 0x9CC3, 0x6E8E, 0x9CC4, 0x6E8F, 0xE4E7, 0x6E90, 0xD4B4, 0x6E91, 0x9CC5, 0x6E92, 0x9CC6, + 0x6E93, 0x9CC7, 0x6E94, 0x9CC8, 0x6E95, 0x9CC9, 0x6E96, 0x9CCA, 0x6E97, 0x9CCB, 0x6E98, 0xE4DB, 0x6E99, 0x9CCC, 0x6E9A, 0x9CCD, + 0x6E9B, 0x9CCE, 0x6E9C, 0xC1EF, 0x6E9D, 0x9CCF, 0x6E9E, 0x9CD0, 0x6E9F, 0xE4E9, 0x6EA0, 0x9CD1, 0x6EA1, 0x9CD2, 0x6EA2, 0xD2E7, + 0x6EA3, 0x9CD3, 0x6EA4, 0x9CD4, 0x6EA5, 0xE4DF, 0x6EA6, 0x9CD5, 0x6EA7, 0xE4E0, 0x6EA8, 0x9CD6, 0x6EA9, 0x9CD7, 0x6EAA, 0xCFAA, + 0x6EAB, 0x9CD8, 0x6EAC, 0x9CD9, 0x6EAD, 0x9CDA, 0x6EAE, 0x9CDB, 0x6EAF, 0xCBDD, 0x6EB0, 0x9CDC, 0x6EB1, 0xE4DA, 0x6EB2, 0xE4D1, + 0x6EB3, 0x9CDD, 0x6EB4, 0xE4E5, 0x6EB5, 0x9CDE, 0x6EB6, 0xC8DC, 0x6EB7, 0xE4E3, 0x6EB8, 0x9CDF, 0x6EB9, 0x9CE0, 0x6EBA, 0xC4E7, + 0x6EBB, 0xE4E2, 0x6EBC, 0x9CE1, 0x6EBD, 0xE4E1, 0x6EBE, 0x9CE2, 0x6EBF, 0x9CE3, 0x6EC0, 0x9CE4, 0x6EC1, 0xB3FC, 0x6EC2, 0xE4E8, + 0x6EC3, 0x9CE5, 0x6EC4, 0x9CE6, 0x6EC5, 0x9CE7, 0x6EC6, 0x9CE8, 0x6EC7, 0xB5E1, 0x6EC8, 0x9CE9, 0x6EC9, 0x9CEA, 0x6ECA, 0x9CEB, + 0x6ECB, 0xD7CC, 0x6ECC, 0x9CEC, 0x6ECD, 0x9CED, 0x6ECE, 0x9CEE, 0x6ECF, 0xE4E6, 0x6ED0, 0x9CEF, 0x6ED1, 0xBBAC, 0x6ED2, 0x9CF0, + 0x6ED3, 0xD7D2, 0x6ED4, 0xCCCF, 0x6ED5, 0xEBF8, 0x6ED6, 0x9CF1, 0x6ED7, 0xE4E4, 0x6ED8, 0x9CF2, 0x6ED9, 0x9CF3, 0x6EDA, 0xB9F6, + 0x6EDB, 0x9CF4, 0x6EDC, 0x9CF5, 0x6EDD, 0x9CF6, 0x6EDE, 0xD6CD, 0x6EDF, 0xE4D9, 0x6EE0, 0xE4DC, 0x6EE1, 0xC2FA, 0x6EE2, 0xE4DE, + 0x6EE3, 0x9CF7, 0x6EE4, 0xC2CB, 0x6EE5, 0xC0C4, 0x6EE6, 0xC2D0, 0x6EE7, 0x9CF8, 0x6EE8, 0xB1F5, 0x6EE9, 0xCCB2, 0x6EEA, 0x9CF9, + 0x6EEB, 0x9CFA, 0x6EEC, 0x9CFB, 0x6EED, 0x9CFC, 0x6EEE, 0x9CFD, 0x6EEF, 0x9CFE, 0x6EF0, 0x9D40, 0x6EF1, 0x9D41, 0x6EF2, 0x9D42, + 0x6EF3, 0x9D43, 0x6EF4, 0xB5CE, 0x6EF5, 0x9D44, 0x6EF6, 0x9D45, 0x6EF7, 0x9D46, 0x6EF8, 0x9D47, 0x6EF9, 0xE4EF, 0x6EFA, 0x9D48, + 0x6EFB, 0x9D49, 0x6EFC, 0x9D4A, 0x6EFD, 0x9D4B, 0x6EFE, 0x9D4C, 0x6EFF, 0x9D4D, 0x6F00, 0x9D4E, 0x6F01, 0x9D4F, 0x6F02, 0xC6AF, + 0x6F03, 0x9D50, 0x6F04, 0x9D51, 0x6F05, 0x9D52, 0x6F06, 0xC6E1, 0x6F07, 0x9D53, 0x6F08, 0x9D54, 0x6F09, 0xE4F5, 0x6F0A, 0x9D55, + 0x6F0B, 0x9D56, 0x6F0C, 0x9D57, 0x6F0D, 0x9D58, 0x6F0E, 0x9D59, 0x6F0F, 0xC2A9, 0x6F10, 0x9D5A, 0x6F11, 0x9D5B, 0x6F12, 0x9D5C, + 0x6F13, 0xC0EC, 0x6F14, 0xD1DD, 0x6F15, 0xE4EE, 0x6F16, 0x9D5D, 0x6F17, 0x9D5E, 0x6F18, 0x9D5F, 0x6F19, 0x9D60, 0x6F1A, 0x9D61, + 0x6F1B, 0x9D62, 0x6F1C, 0x9D63, 0x6F1D, 0x9D64, 0x6F1E, 0x9D65, 0x6F1F, 0x9D66, 0x6F20, 0xC4AE, 0x6F21, 0x9D67, 0x6F22, 0x9D68, + 0x6F23, 0x9D69, 0x6F24, 0xE4ED, 0x6F25, 0x9D6A, 0x6F26, 0x9D6B, 0x6F27, 0x9D6C, 0x6F28, 0x9D6D, 0x6F29, 0xE4F6, 0x6F2A, 0xE4F4, + 0x6F2B, 0xC2FE, 0x6F2C, 0x9D6E, 0x6F2D, 0xE4DD, 0x6F2E, 0x9D6F, 0x6F2F, 0xE4F0, 0x6F30, 0x9D70, 0x6F31, 0xCAFE, 0x6F32, 0x9D71, + 0x6F33, 0xD5C4, 0x6F34, 0x9D72, 0x6F35, 0x9D73, 0x6F36, 0xE4F1, 0x6F37, 0x9D74, 0x6F38, 0x9D75, 0x6F39, 0x9D76, 0x6F3A, 0x9D77, + 0x6F3B, 0x9D78, 0x6F3C, 0x9D79, 0x6F3D, 0x9D7A, 0x6F3E, 0xD1FA, 0x6F3F, 0x9D7B, 0x6F40, 0x9D7C, 0x6F41, 0x9D7D, 0x6F42, 0x9D7E, + 0x6F43, 0x9D80, 0x6F44, 0x9D81, 0x6F45, 0x9D82, 0x6F46, 0xE4EB, 0x6F47, 0xE4EC, 0x6F48, 0x9D83, 0x6F49, 0x9D84, 0x6F4A, 0x9D85, + 0x6F4B, 0xE4F2, 0x6F4C, 0x9D86, 0x6F4D, 0xCEAB, 0x6F4E, 0x9D87, 0x6F4F, 0x9D88, 0x6F50, 0x9D89, 0x6F51, 0x9D8A, 0x6F52, 0x9D8B, + 0x6F53, 0x9D8C, 0x6F54, 0x9D8D, 0x6F55, 0x9D8E, 0x6F56, 0x9D8F, 0x6F57, 0x9D90, 0x6F58, 0xC5CB, 0x6F59, 0x9D91, 0x6F5A, 0x9D92, + 0x6F5B, 0x9D93, 0x6F5C, 0xC7B1, 0x6F5D, 0x9D94, 0x6F5E, 0xC2BA, 0x6F5F, 0x9D95, 0x6F60, 0x9D96, 0x6F61, 0x9D97, 0x6F62, 0xE4EA, + 0x6F63, 0x9D98, 0x6F64, 0x9D99, 0x6F65, 0x9D9A, 0x6F66, 0xC1CA, 0x6F67, 0x9D9B, 0x6F68, 0x9D9C, 0x6F69, 0x9D9D, 0x6F6A, 0x9D9E, + 0x6F6B, 0x9D9F, 0x6F6C, 0x9DA0, 0x6F6D, 0xCCB6, 0x6F6E, 0xB3B1, 0x6F6F, 0x9DA1, 0x6F70, 0x9DA2, 0x6F71, 0x9DA3, 0x6F72, 0xE4FB, + 0x6F73, 0x9DA4, 0x6F74, 0xE4F3, 0x6F75, 0x9DA5, 0x6F76, 0x9DA6, 0x6F77, 0x9DA7, 0x6F78, 0xE4FA, 0x6F79, 0x9DA8, 0x6F7A, 0xE4FD, + 0x6F7B, 0x9DA9, 0x6F7C, 0xE4FC, 0x6F7D, 0x9DAA, 0x6F7E, 0x9DAB, 0x6F7F, 0x9DAC, 0x6F80, 0x9DAD, 0x6F81, 0x9DAE, 0x6F82, 0x9DAF, + 0x6F83, 0x9DB0, 0x6F84, 0xB3CE, 0x6F85, 0x9DB1, 0x6F86, 0x9DB2, 0x6F87, 0x9DB3, 0x6F88, 0xB3BA, 0x6F89, 0xE4F7, 0x6F8A, 0x9DB4, + 0x6F8B, 0x9DB5, 0x6F8C, 0xE4F9, 0x6F8D, 0xE4F8, 0x6F8E, 0xC5EC, 0x6F8F, 0x9DB6, 0x6F90, 0x9DB7, 0x6F91, 0x9DB8, 0x6F92, 0x9DB9, + 0x6F93, 0x9DBA, 0x6F94, 0x9DBB, 0x6F95, 0x9DBC, 0x6F96, 0x9DBD, 0x6F97, 0x9DBE, 0x6F98, 0x9DBF, 0x6F99, 0x9DC0, 0x6F9A, 0x9DC1, + 0x6F9B, 0x9DC2, 0x6F9C, 0xC0BD, 0x6F9D, 0x9DC3, 0x6F9E, 0x9DC4, 0x6F9F, 0x9DC5, 0x6FA0, 0x9DC6, 0x6FA1, 0xD4E8, 0x6FA2, 0x9DC7, + 0x6FA3, 0x9DC8, 0x6FA4, 0x9DC9, 0x6FA5, 0x9DCA, 0x6FA6, 0x9DCB, 0x6FA7, 0xE5A2, 0x6FA8, 0x9DCC, 0x6FA9, 0x9DCD, 0x6FAA, 0x9DCE, + 0x6FAB, 0x9DCF, 0x6FAC, 0x9DD0, 0x6FAD, 0x9DD1, 0x6FAE, 0x9DD2, 0x6FAF, 0x9DD3, 0x6FB0, 0x9DD4, 0x6FB1, 0x9DD5, 0x6FB2, 0x9DD6, + 0x6FB3, 0xB0C4, 0x6FB4, 0x9DD7, 0x6FB5, 0x9DD8, 0x6FB6, 0xE5A4, 0x6FB7, 0x9DD9, 0x6FB8, 0x9DDA, 0x6FB9, 0xE5A3, 0x6FBA, 0x9DDB, + 0x6FBB, 0x9DDC, 0x6FBC, 0x9DDD, 0x6FBD, 0x9DDE, 0x6FBE, 0x9DDF, 0x6FBF, 0x9DE0, 0x6FC0, 0xBCA4, 0x6FC1, 0x9DE1, 0x6FC2, 0xE5A5, + 0x6FC3, 0x9DE2, 0x6FC4, 0x9DE3, 0x6FC5, 0x9DE4, 0x6FC6, 0x9DE5, 0x6FC7, 0x9DE6, 0x6FC8, 0x9DE7, 0x6FC9, 0xE5A1, 0x6FCA, 0x9DE8, + 0x6FCB, 0x9DE9, 0x6FCC, 0x9DEA, 0x6FCD, 0x9DEB, 0x6FCE, 0x9DEC, 0x6FCF, 0x9DED, 0x6FD0, 0x9DEE, 0x6FD1, 0xE4FE, 0x6FD2, 0xB1F4, + 0x6FD3, 0x9DEF, 0x6FD4, 0x9DF0, 0x6FD5, 0x9DF1, 0x6FD6, 0x9DF2, 0x6FD7, 0x9DF3, 0x6FD8, 0x9DF4, 0x6FD9, 0x9DF5, 0x6FDA, 0x9DF6, + 0x6FDB, 0x9DF7, 0x6FDC, 0x9DF8, 0x6FDD, 0x9DF9, 0x6FDE, 0xE5A8, 0x6FDF, 0x9DFA, 0x6FE0, 0xE5A9, 0x6FE1, 0xE5A6, 0x6FE2, 0x9DFB, + 0x6FE3, 0x9DFC, 0x6FE4, 0x9DFD, 0x6FE5, 0x9DFE, 0x6FE6, 0x9E40, 0x6FE7, 0x9E41, 0x6FE8, 0x9E42, 0x6FE9, 0x9E43, 0x6FEA, 0x9E44, + 0x6FEB, 0x9E45, 0x6FEC, 0x9E46, 0x6FED, 0x9E47, 0x6FEE, 0xE5A7, 0x6FEF, 0xE5AA, 0x6FF0, 0x9E48, 0x6FF1, 0x9E49, 0x6FF2, 0x9E4A, + 0x6FF3, 0x9E4B, 0x6FF4, 0x9E4C, 0x6FF5, 0x9E4D, 0x6FF6, 0x9E4E, 0x6FF7, 0x9E4F, 0x6FF8, 0x9E50, 0x6FF9, 0x9E51, 0x6FFA, 0x9E52, + 0x6FFB, 0x9E53, 0x6FFC, 0x9E54, 0x6FFD, 0x9E55, 0x6FFE, 0x9E56, 0x6FFF, 0x9E57, 0x7000, 0x9E58, 0x7001, 0x9E59, 0x7002, 0x9E5A, + 0x7003, 0x9E5B, 0x7004, 0x9E5C, 0x7005, 0x9E5D, 0x7006, 0x9E5E, 0x7007, 0x9E5F, 0x7008, 0x9E60, 0x7009, 0x9E61, 0x700A, 0x9E62, + 0x700B, 0x9E63, 0x700C, 0x9E64, 0x700D, 0x9E65, 0x700E, 0x9E66, 0x700F, 0x9E67, 0x7010, 0x9E68, 0x7011, 0xC6D9, 0x7012, 0x9E69, + 0x7013, 0x9E6A, 0x7014, 0x9E6B, 0x7015, 0x9E6C, 0x7016, 0x9E6D, 0x7017, 0x9E6E, 0x7018, 0x9E6F, 0x7019, 0x9E70, 0x701A, 0xE5AB, + 0x701B, 0xE5AD, 0x701C, 0x9E71, 0x701D, 0x9E72, 0x701E, 0x9E73, 0x701F, 0x9E74, 0x7020, 0x9E75, 0x7021, 0x9E76, 0x7022, 0x9E77, + 0x7023, 0xE5AC, 0x7024, 0x9E78, 0x7025, 0x9E79, 0x7026, 0x9E7A, 0x7027, 0x9E7B, 0x7028, 0x9E7C, 0x7029, 0x9E7D, 0x702A, 0x9E7E, + 0x702B, 0x9E80, 0x702C, 0x9E81, 0x702D, 0x9E82, 0x702E, 0x9E83, 0x702F, 0x9E84, 0x7030, 0x9E85, 0x7031, 0x9E86, 0x7032, 0x9E87, + 0x7033, 0x9E88, 0x7034, 0x9E89, 0x7035, 0xE5AF, 0x7036, 0x9E8A, 0x7037, 0x9E8B, 0x7038, 0x9E8C, 0x7039, 0xE5AE, 0x703A, 0x9E8D, + 0x703B, 0x9E8E, 0x703C, 0x9E8F, 0x703D, 0x9E90, 0x703E, 0x9E91, 0x703F, 0x9E92, 0x7040, 0x9E93, 0x7041, 0x9E94, 0x7042, 0x9E95, + 0x7043, 0x9E96, 0x7044, 0x9E97, 0x7045, 0x9E98, 0x7046, 0x9E99, 0x7047, 0x9E9A, 0x7048, 0x9E9B, 0x7049, 0x9E9C, 0x704A, 0x9E9D, + 0x704B, 0x9E9E, 0x704C, 0xB9E0, 0x704D, 0x9E9F, 0x704E, 0x9EA0, 0x704F, 0xE5B0, 0x7050, 0x9EA1, 0x7051, 0x9EA2, 0x7052, 0x9EA3, + 0x7053, 0x9EA4, 0x7054, 0x9EA5, 0x7055, 0x9EA6, 0x7056, 0x9EA7, 0x7057, 0x9EA8, 0x7058, 0x9EA9, 0x7059, 0x9EAA, 0x705A, 0x9EAB, + 0x705B, 0x9EAC, 0x705C, 0x9EAD, 0x705D, 0x9EAE, 0x705E, 0xE5B1, 0x705F, 0x9EAF, 0x7060, 0x9EB0, 0x7061, 0x9EB1, 0x7062, 0x9EB2, + 0x7063, 0x9EB3, 0x7064, 0x9EB4, 0x7065, 0x9EB5, 0x7066, 0x9EB6, 0x7067, 0x9EB7, 0x7068, 0x9EB8, 0x7069, 0x9EB9, 0x706A, 0x9EBA, + 0x706B, 0xBBF0, 0x706C, 0xECE1, 0x706D, 0xC3F0, 0x706E, 0x9EBB, 0x706F, 0xB5C6, 0x7070, 0xBBD2, 0x7071, 0x9EBC, 0x7072, 0x9EBD, + 0x7073, 0x9EBE, 0x7074, 0x9EBF, 0x7075, 0xC1E9, 0x7076, 0xD4EE, 0x7077, 0x9EC0, 0x7078, 0xBEC4, 0x7079, 0x9EC1, 0x707A, 0x9EC2, + 0x707B, 0x9EC3, 0x707C, 0xD7C6, 0x707D, 0x9EC4, 0x707E, 0xD4D6, 0x707F, 0xB2D3, 0x7080, 0xECBE, 0x7081, 0x9EC5, 0x7082, 0x9EC6, + 0x7083, 0x9EC7, 0x7084, 0x9EC8, 0x7085, 0xEAC1, 0x7086, 0x9EC9, 0x7087, 0x9ECA, 0x7088, 0x9ECB, 0x7089, 0xC2AF, 0x708A, 0xB4B6, + 0x708B, 0x9ECC, 0x708C, 0x9ECD, 0x708D, 0x9ECE, 0x708E, 0xD1D7, 0x708F, 0x9ECF, 0x7090, 0x9ED0, 0x7091, 0x9ED1, 0x7092, 0xB3B4, + 0x7093, 0x9ED2, 0x7094, 0xC8B2, 0x7095, 0xBFBB, 0x7096, 0xECC0, 0x7097, 0x9ED3, 0x7098, 0x9ED4, 0x7099, 0xD6CB, 0x709A, 0x9ED5, + 0x709B, 0x9ED6, 0x709C, 0xECBF, 0x709D, 0xECC1, 0x709E, 0x9ED7, 0x709F, 0x9ED8, 0x70A0, 0x9ED9, 0x70A1, 0x9EDA, 0x70A2, 0x9EDB, + 0x70A3, 0x9EDC, 0x70A4, 0x9EDD, 0x70A5, 0x9EDE, 0x70A6, 0x9EDF, 0x70A7, 0x9EE0, 0x70A8, 0x9EE1, 0x70A9, 0x9EE2, 0x70AA, 0x9EE3, + 0x70AB, 0xECC5, 0x70AC, 0xBEE6, 0x70AD, 0xCCBF, 0x70AE, 0xC5DA, 0x70AF, 0xBEBC, 0x70B0, 0x9EE4, 0x70B1, 0xECC6, 0x70B2, 0x9EE5, + 0x70B3, 0xB1FE, 0x70B4, 0x9EE6, 0x70B5, 0x9EE7, 0x70B6, 0x9EE8, 0x70B7, 0xECC4, 0x70B8, 0xD5A8, 0x70B9, 0xB5E3, 0x70BA, 0x9EE9, + 0x70BB, 0xECC2, 0x70BC, 0xC1B6, 0x70BD, 0xB3E3, 0x70BE, 0x9EEA, 0x70BF, 0x9EEB, 0x70C0, 0xECC3, 0x70C1, 0xCBB8, 0x70C2, 0xC0C3, + 0x70C3, 0xCCFE, 0x70C4, 0x9EEC, 0x70C5, 0x9EED, 0x70C6, 0x9EEE, 0x70C7, 0x9EEF, 0x70C8, 0xC1D2, 0x70C9, 0x9EF0, 0x70CA, 0xECC8, + 0x70CB, 0x9EF1, 0x70CC, 0x9EF2, 0x70CD, 0x9EF3, 0x70CE, 0x9EF4, 0x70CF, 0x9EF5, 0x70D0, 0x9EF6, 0x70D1, 0x9EF7, 0x70D2, 0x9EF8, + 0x70D3, 0x9EF9, 0x70D4, 0x9EFA, 0x70D5, 0x9EFB, 0x70D6, 0x9EFC, 0x70D7, 0x9EFD, 0x70D8, 0xBAE6, 0x70D9, 0xC0D3, 0x70DA, 0x9EFE, + 0x70DB, 0xD6F2, 0x70DC, 0x9F40, 0x70DD, 0x9F41, 0x70DE, 0x9F42, 0x70DF, 0xD1CC, 0x70E0, 0x9F43, 0x70E1, 0x9F44, 0x70E2, 0x9F45, + 0x70E3, 0x9F46, 0x70E4, 0xBFBE, 0x70E5, 0x9F47, 0x70E6, 0xB7B3, 0x70E7, 0xC9D5, 0x70E8, 0xECC7, 0x70E9, 0xBBE2, 0x70EA, 0x9F48, + 0x70EB, 0xCCCC, 0x70EC, 0xBDFD, 0x70ED, 0xC8C8, 0x70EE, 0x9F49, 0x70EF, 0xCFA9, 0x70F0, 0x9F4A, 0x70F1, 0x9F4B, 0x70F2, 0x9F4C, + 0x70F3, 0x9F4D, 0x70F4, 0x9F4E, 0x70F5, 0x9F4F, 0x70F6, 0x9F50, 0x70F7, 0xCDE9, 0x70F8, 0x9F51, 0x70F9, 0xC5EB, 0x70FA, 0x9F52, + 0x70FB, 0x9F53, 0x70FC, 0x9F54, 0x70FD, 0xB7E9, 0x70FE, 0x9F55, 0x70FF, 0x9F56, 0x7100, 0x9F57, 0x7101, 0x9F58, 0x7102, 0x9F59, + 0x7103, 0x9F5A, 0x7104, 0x9F5B, 0x7105, 0x9F5C, 0x7106, 0x9F5D, 0x7107, 0x9F5E, 0x7108, 0x9F5F, 0x7109, 0xD1C9, 0x710A, 0xBAB8, + 0x710B, 0x9F60, 0x710C, 0x9F61, 0x710D, 0x9F62, 0x710E, 0x9F63, 0x710F, 0x9F64, 0x7110, 0xECC9, 0x7111, 0x9F65, 0x7112, 0x9F66, + 0x7113, 0xECCA, 0x7114, 0x9F67, 0x7115, 0xBBC0, 0x7116, 0xECCB, 0x7117, 0x9F68, 0x7118, 0xECE2, 0x7119, 0xB1BA, 0x711A, 0xB7D9, + 0x711B, 0x9F69, 0x711C, 0x9F6A, 0x711D, 0x9F6B, 0x711E, 0x9F6C, 0x711F, 0x9F6D, 0x7120, 0x9F6E, 0x7121, 0x9F6F, 0x7122, 0x9F70, + 0x7123, 0x9F71, 0x7124, 0x9F72, 0x7125, 0x9F73, 0x7126, 0xBDB9, 0x7127, 0x9F74, 0x7128, 0x9F75, 0x7129, 0x9F76, 0x712A, 0x9F77, + 0x712B, 0x9F78, 0x712C, 0x9F79, 0x712D, 0x9F7A, 0x712E, 0x9F7B, 0x712F, 0xECCC, 0x7130, 0xD1E6, 0x7131, 0xECCD, 0x7132, 0x9F7C, + 0x7133, 0x9F7D, 0x7134, 0x9F7E, 0x7135, 0x9F80, 0x7136, 0xC8BB, 0x7137, 0x9F81, 0x7138, 0x9F82, 0x7139, 0x9F83, 0x713A, 0x9F84, + 0x713B, 0x9F85, 0x713C, 0x9F86, 0x713D, 0x9F87, 0x713E, 0x9F88, 0x713F, 0x9F89, 0x7140, 0x9F8A, 0x7141, 0x9F8B, 0x7142, 0x9F8C, + 0x7143, 0x9F8D, 0x7144, 0x9F8E, 0x7145, 0xECD1, 0x7146, 0x9F8F, 0x7147, 0x9F90, 0x7148, 0x9F91, 0x7149, 0x9F92, 0x714A, 0xECD3, + 0x714B, 0x9F93, 0x714C, 0xBBCD, 0x714D, 0x9F94, 0x714E, 0xBCE5, 0x714F, 0x9F95, 0x7150, 0x9F96, 0x7151, 0x9F97, 0x7152, 0x9F98, + 0x7153, 0x9F99, 0x7154, 0x9F9A, 0x7155, 0x9F9B, 0x7156, 0x9F9C, 0x7157, 0x9F9D, 0x7158, 0x9F9E, 0x7159, 0x9F9F, 0x715A, 0x9FA0, + 0x715B, 0x9FA1, 0x715C, 0xECCF, 0x715D, 0x9FA2, 0x715E, 0xC9B7, 0x715F, 0x9FA3, 0x7160, 0x9FA4, 0x7161, 0x9FA5, 0x7162, 0x9FA6, + 0x7163, 0x9FA7, 0x7164, 0xC3BA, 0x7165, 0x9FA8, 0x7166, 0xECE3, 0x7167, 0xD5D5, 0x7168, 0xECD0, 0x7169, 0x9FA9, 0x716A, 0x9FAA, + 0x716B, 0x9FAB, 0x716C, 0x9FAC, 0x716D, 0x9FAD, 0x716E, 0xD6F3, 0x716F, 0x9FAE, 0x7170, 0x9FAF, 0x7171, 0x9FB0, 0x7172, 0xECD2, + 0x7173, 0xECCE, 0x7174, 0x9FB1, 0x7175, 0x9FB2, 0x7176, 0x9FB3, 0x7177, 0x9FB4, 0x7178, 0xECD4, 0x7179, 0x9FB5, 0x717A, 0xECD5, + 0x717B, 0x9FB6, 0x717C, 0x9FB7, 0x717D, 0xC9BF, 0x717E, 0x9FB8, 0x717F, 0x9FB9, 0x7180, 0x9FBA, 0x7181, 0x9FBB, 0x7182, 0x9FBC, + 0x7183, 0x9FBD, 0x7184, 0xCFA8, 0x7185, 0x9FBE, 0x7186, 0x9FBF, 0x7187, 0x9FC0, 0x7188, 0x9FC1, 0x7189, 0x9FC2, 0x718A, 0xD0DC, + 0x718B, 0x9FC3, 0x718C, 0x9FC4, 0x718D, 0x9FC5, 0x718E, 0x9FC6, 0x718F, 0xD1AC, 0x7190, 0x9FC7, 0x7191, 0x9FC8, 0x7192, 0x9FC9, + 0x7193, 0x9FCA, 0x7194, 0xC8DB, 0x7195, 0x9FCB, 0x7196, 0x9FCC, 0x7197, 0x9FCD, 0x7198, 0xECD6, 0x7199, 0xCEF5, 0x719A, 0x9FCE, + 0x719B, 0x9FCF, 0x719C, 0x9FD0, 0x719D, 0x9FD1, 0x719E, 0x9FD2, 0x719F, 0xCAEC, 0x71A0, 0xECDA, 0x71A1, 0x9FD3, 0x71A2, 0x9FD4, + 0x71A3, 0x9FD5, 0x71A4, 0x9FD6, 0x71A5, 0x9FD7, 0x71A6, 0x9FD8, 0x71A7, 0x9FD9, 0x71A8, 0xECD9, 0x71A9, 0x9FDA, 0x71AA, 0x9FDB, + 0x71AB, 0x9FDC, 0x71AC, 0xB0BE, 0x71AD, 0x9FDD, 0x71AE, 0x9FDE, 0x71AF, 0x9FDF, 0x71B0, 0x9FE0, 0x71B1, 0x9FE1, 0x71B2, 0x9FE2, + 0x71B3, 0xECD7, 0x71B4, 0x9FE3, 0x71B5, 0xECD8, 0x71B6, 0x9FE4, 0x71B7, 0x9FE5, 0x71B8, 0x9FE6, 0x71B9, 0xECE4, 0x71BA, 0x9FE7, + 0x71BB, 0x9FE8, 0x71BC, 0x9FE9, 0x71BD, 0x9FEA, 0x71BE, 0x9FEB, 0x71BF, 0x9FEC, 0x71C0, 0x9FED, 0x71C1, 0x9FEE, 0x71C2, 0x9FEF, + 0x71C3, 0xC8BC, 0x71C4, 0x9FF0, 0x71C5, 0x9FF1, 0x71C6, 0x9FF2, 0x71C7, 0x9FF3, 0x71C8, 0x9FF4, 0x71C9, 0x9FF5, 0x71CA, 0x9FF6, + 0x71CB, 0x9FF7, 0x71CC, 0x9FF8, 0x71CD, 0x9FF9, 0x71CE, 0xC1C7, 0x71CF, 0x9FFA, 0x71D0, 0x9FFB, 0x71D1, 0x9FFC, 0x71D2, 0x9FFD, + 0x71D3, 0x9FFE, 0x71D4, 0xECDC, 0x71D5, 0xD1E0, 0x71D6, 0xA040, 0x71D7, 0xA041, 0x71D8, 0xA042, 0x71D9, 0xA043, 0x71DA, 0xA044, + 0x71DB, 0xA045, 0x71DC, 0xA046, 0x71DD, 0xA047, 0x71DE, 0xA048, 0x71DF, 0xA049, 0x71E0, 0xECDB, 0x71E1, 0xA04A, 0x71E2, 0xA04B, + 0x71E3, 0xA04C, 0x71E4, 0xA04D, 0x71E5, 0xD4EF, 0x71E6, 0xA04E, 0x71E7, 0xECDD, 0x71E8, 0xA04F, 0x71E9, 0xA050, 0x71EA, 0xA051, + 0x71EB, 0xA052, 0x71EC, 0xA053, 0x71ED, 0xA054, 0x71EE, 0xDBC6, 0x71EF, 0xA055, 0x71F0, 0xA056, 0x71F1, 0xA057, 0x71F2, 0xA058, + 0x71F3, 0xA059, 0x71F4, 0xA05A, 0x71F5, 0xA05B, 0x71F6, 0xA05C, 0x71F7, 0xA05D, 0x71F8, 0xA05E, 0x71F9, 0xECDE, 0x71FA, 0xA05F, + 0x71FB, 0xA060, 0x71FC, 0xA061, 0x71FD, 0xA062, 0x71FE, 0xA063, 0x71FF, 0xA064, 0x7200, 0xA065, 0x7201, 0xA066, 0x7202, 0xA067, + 0x7203, 0xA068, 0x7204, 0xA069, 0x7205, 0xA06A, 0x7206, 0xB1AC, 0x7207, 0xA06B, 0x7208, 0xA06C, 0x7209, 0xA06D, 0x720A, 0xA06E, + 0x720B, 0xA06F, 0x720C, 0xA070, 0x720D, 0xA071, 0x720E, 0xA072, 0x720F, 0xA073, 0x7210, 0xA074, 0x7211, 0xA075, 0x7212, 0xA076, + 0x7213, 0xA077, 0x7214, 0xA078, 0x7215, 0xA079, 0x7216, 0xA07A, 0x7217, 0xA07B, 0x7218, 0xA07C, 0x7219, 0xA07D, 0x721A, 0xA07E, + 0x721B, 0xA080, 0x721C, 0xA081, 0x721D, 0xECDF, 0x721E, 0xA082, 0x721F, 0xA083, 0x7220, 0xA084, 0x7221, 0xA085, 0x7222, 0xA086, + 0x7223, 0xA087, 0x7224, 0xA088, 0x7225, 0xA089, 0x7226, 0xA08A, 0x7227, 0xA08B, 0x7228, 0xECE0, 0x7229, 0xA08C, 0x722A, 0xD7A6, + 0x722B, 0xA08D, 0x722C, 0xC5C0, 0x722D, 0xA08E, 0x722E, 0xA08F, 0x722F, 0xA090, 0x7230, 0xEBBC, 0x7231, 0xB0AE, 0x7232, 0xA091, + 0x7233, 0xA092, 0x7234, 0xA093, 0x7235, 0xBEF4, 0x7236, 0xB8B8, 0x7237, 0xD2AF, 0x7238, 0xB0D6, 0x7239, 0xB5F9, 0x723A, 0xA094, + 0x723B, 0xD8B3, 0x723C, 0xA095, 0x723D, 0xCBAC, 0x723E, 0xA096, 0x723F, 0xE3DD, 0x7240, 0xA097, 0x7241, 0xA098, 0x7242, 0xA099, + 0x7243, 0xA09A, 0x7244, 0xA09B, 0x7245, 0xA09C, 0x7246, 0xA09D, 0x7247, 0xC6AC, 0x7248, 0xB0E6, 0x7249, 0xA09E, 0x724A, 0xA09F, + 0x724B, 0xA0A0, 0x724C, 0xC5C6, 0x724D, 0xEBB9, 0x724E, 0xA0A1, 0x724F, 0xA0A2, 0x7250, 0xA0A3, 0x7251, 0xA0A4, 0x7252, 0xEBBA, + 0x7253, 0xA0A5, 0x7254, 0xA0A6, 0x7255, 0xA0A7, 0x7256, 0xEBBB, 0x7257, 0xA0A8, 0x7258, 0xA0A9, 0x7259, 0xD1C0, 0x725A, 0xA0AA, + 0x725B, 0xC5A3, 0x725C, 0xA0AB, 0x725D, 0xEAF2, 0x725E, 0xA0AC, 0x725F, 0xC4B2, 0x7260, 0xA0AD, 0x7261, 0xC4B5, 0x7262, 0xC0CE, + 0x7263, 0xA0AE, 0x7264, 0xA0AF, 0x7265, 0xA0B0, 0x7266, 0xEAF3, 0x7267, 0xC4C1, 0x7268, 0xA0B1, 0x7269, 0xCEEF, 0x726A, 0xA0B2, + 0x726B, 0xA0B3, 0x726C, 0xA0B4, 0x726D, 0xA0B5, 0x726E, 0xEAF0, 0x726F, 0xEAF4, 0x7270, 0xA0B6, 0x7271, 0xA0B7, 0x7272, 0xC9FC, + 0x7273, 0xA0B8, 0x7274, 0xA0B9, 0x7275, 0xC7A3, 0x7276, 0xA0BA, 0x7277, 0xA0BB, 0x7278, 0xA0BC, 0x7279, 0xCCD8, 0x727A, 0xCEFE, + 0x727B, 0xA0BD, 0x727C, 0xA0BE, 0x727D, 0xA0BF, 0x727E, 0xEAF5, 0x727F, 0xEAF6, 0x7280, 0xCFAC, 0x7281, 0xC0E7, 0x7282, 0xA0C0, + 0x7283, 0xA0C1, 0x7284, 0xEAF7, 0x7285, 0xA0C2, 0x7286, 0xA0C3, 0x7287, 0xA0C4, 0x7288, 0xA0C5, 0x7289, 0xA0C6, 0x728A, 0xB6BF, + 0x728B, 0xEAF8, 0x728C, 0xA0C7, 0x728D, 0xEAF9, 0x728E, 0xA0C8, 0x728F, 0xEAFA, 0x7290, 0xA0C9, 0x7291, 0xA0CA, 0x7292, 0xEAFB, + 0x7293, 0xA0CB, 0x7294, 0xA0CC, 0x7295, 0xA0CD, 0x7296, 0xA0CE, 0x7297, 0xA0CF, 0x7298, 0xA0D0, 0x7299, 0xA0D1, 0x729A, 0xA0D2, + 0x729B, 0xA0D3, 0x729C, 0xA0D4, 0x729D, 0xA0D5, 0x729E, 0xA0D6, 0x729F, 0xEAF1, 0x72A0, 0xA0D7, 0x72A1, 0xA0D8, 0x72A2, 0xA0D9, + 0x72A3, 0xA0DA, 0x72A4, 0xA0DB, 0x72A5, 0xA0DC, 0x72A6, 0xA0DD, 0x72A7, 0xA0DE, 0x72A8, 0xA0DF, 0x72A9, 0xA0E0, 0x72AA, 0xA0E1, + 0x72AB, 0xA0E2, 0x72AC, 0xC8AE, 0x72AD, 0xE1EB, 0x72AE, 0xA0E3, 0x72AF, 0xB7B8, 0x72B0, 0xE1EC, 0x72B1, 0xA0E4, 0x72B2, 0xA0E5, + 0x72B3, 0xA0E6, 0x72B4, 0xE1ED, 0x72B5, 0xA0E7, 0x72B6, 0xD7B4, 0x72B7, 0xE1EE, 0x72B8, 0xE1EF, 0x72B9, 0xD3CC, 0x72BA, 0xA0E8, + 0x72BB, 0xA0E9, 0x72BC, 0xA0EA, 0x72BD, 0xA0EB, 0x72BE, 0xA0EC, 0x72BF, 0xA0ED, 0x72C0, 0xA0EE, 0x72C1, 0xE1F1, 0x72C2, 0xBFF1, + 0x72C3, 0xE1F0, 0x72C4, 0xB5D2, 0x72C5, 0xA0EF, 0x72C6, 0xA0F0, 0x72C7, 0xA0F1, 0x72C8, 0xB1B7, 0x72C9, 0xA0F2, 0x72CA, 0xA0F3, + 0x72CB, 0xA0F4, 0x72CC, 0xA0F5, 0x72CD, 0xE1F3, 0x72CE, 0xE1F2, 0x72CF, 0xA0F6, 0x72D0, 0xBAFC, 0x72D1, 0xA0F7, 0x72D2, 0xE1F4, + 0x72D3, 0xA0F8, 0x72D4, 0xA0F9, 0x72D5, 0xA0FA, 0x72D6, 0xA0FB, 0x72D7, 0xB9B7, 0x72D8, 0xA0FC, 0x72D9, 0xBED1, 0x72DA, 0xA0FD, + 0x72DB, 0xA0FE, 0x72DC, 0xAA40, 0x72DD, 0xAA41, 0x72DE, 0xC4FC, 0x72DF, 0xAA42, 0x72E0, 0xBADD, 0x72E1, 0xBDC6, 0x72E2, 0xAA43, + 0x72E3, 0xAA44, 0x72E4, 0xAA45, 0x72E5, 0xAA46, 0x72E6, 0xAA47, 0x72E7, 0xAA48, 0x72E8, 0xE1F5, 0x72E9, 0xE1F7, 0x72EA, 0xAA49, + 0x72EB, 0xAA4A, 0x72EC, 0xB6C0, 0x72ED, 0xCFC1, 0x72EE, 0xCAA8, 0x72EF, 0xE1F6, 0x72F0, 0xD5F8, 0x72F1, 0xD3FC, 0x72F2, 0xE1F8, + 0x72F3, 0xE1FC, 0x72F4, 0xE1F9, 0x72F5, 0xAA4B, 0x72F6, 0xAA4C, 0x72F7, 0xE1FA, 0x72F8, 0xC0EA, 0x72F9, 0xAA4D, 0x72FA, 0xE1FE, + 0x72FB, 0xE2A1, 0x72FC, 0xC0C7, 0x72FD, 0xAA4E, 0x72FE, 0xAA4F, 0x72FF, 0xAA50, 0x7300, 0xAA51, 0x7301, 0xE1FB, 0x7302, 0xAA52, + 0x7303, 0xE1FD, 0x7304, 0xAA53, 0x7305, 0xAA54, 0x7306, 0xAA55, 0x7307, 0xAA56, 0x7308, 0xAA57, 0x7309, 0xAA58, 0x730A, 0xE2A5, + 0x730B, 0xAA59, 0x730C, 0xAA5A, 0x730D, 0xAA5B, 0x730E, 0xC1D4, 0x730F, 0xAA5C, 0x7310, 0xAA5D, 0x7311, 0xAA5E, 0x7312, 0xAA5F, + 0x7313, 0xE2A3, 0x7314, 0xAA60, 0x7315, 0xE2A8, 0x7316, 0xB2FE, 0x7317, 0xE2A2, 0x7318, 0xAA61, 0x7319, 0xAA62, 0x731A, 0xAA63, + 0x731B, 0xC3CD, 0x731C, 0xB2C2, 0x731D, 0xE2A7, 0x731E, 0xE2A6, 0x731F, 0xAA64, 0x7320, 0xAA65, 0x7321, 0xE2A4, 0x7322, 0xE2A9, + 0x7323, 0xAA66, 0x7324, 0xAA67, 0x7325, 0xE2AB, 0x7326, 0xAA68, 0x7327, 0xAA69, 0x7328, 0xAA6A, 0x7329, 0xD0C9, 0x732A, 0xD6ED, + 0x732B, 0xC3A8, 0x732C, 0xE2AC, 0x732D, 0xAA6B, 0x732E, 0xCFD7, 0x732F, 0xAA6C, 0x7330, 0xAA6D, 0x7331, 0xE2AE, 0x7332, 0xAA6E, + 0x7333, 0xAA6F, 0x7334, 0xBAEF, 0x7335, 0xAA70, 0x7336, 0xAA71, 0x7337, 0xE9E0, 0x7338, 0xE2AD, 0x7339, 0xE2AA, 0x733A, 0xAA72, + 0x733B, 0xAA73, 0x733C, 0xAA74, 0x733D, 0xAA75, 0x733E, 0xBBAB, 0x733F, 0xD4B3, 0x7340, 0xAA76, 0x7341, 0xAA77, 0x7342, 0xAA78, + 0x7343, 0xAA79, 0x7344, 0xAA7A, 0x7345, 0xAA7B, 0x7346, 0xAA7C, 0x7347, 0xAA7D, 0x7348, 0xAA7E, 0x7349, 0xAA80, 0x734A, 0xAA81, + 0x734B, 0xAA82, 0x734C, 0xAA83, 0x734D, 0xE2B0, 0x734E, 0xAA84, 0x734F, 0xAA85, 0x7350, 0xE2AF, 0x7351, 0xAA86, 0x7352, 0xE9E1, + 0x7353, 0xAA87, 0x7354, 0xAA88, 0x7355, 0xAA89, 0x7356, 0xAA8A, 0x7357, 0xE2B1, 0x7358, 0xAA8B, 0x7359, 0xAA8C, 0x735A, 0xAA8D, + 0x735B, 0xAA8E, 0x735C, 0xAA8F, 0x735D, 0xAA90, 0x735E, 0xAA91, 0x735F, 0xAA92, 0x7360, 0xE2B2, 0x7361, 0xAA93, 0x7362, 0xAA94, + 0x7363, 0xAA95, 0x7364, 0xAA96, 0x7365, 0xAA97, 0x7366, 0xAA98, 0x7367, 0xAA99, 0x7368, 0xAA9A, 0x7369, 0xAA9B, 0x736A, 0xAA9C, + 0x736B, 0xAA9D, 0x736C, 0xE2B3, 0x736D, 0xCCA1, 0x736E, 0xAA9E, 0x736F, 0xE2B4, 0x7370, 0xAA9F, 0x7371, 0xAAA0, 0x7372, 0xAB40, + 0x7373, 0xAB41, 0x7374, 0xAB42, 0x7375, 0xAB43, 0x7376, 0xAB44, 0x7377, 0xAB45, 0x7378, 0xAB46, 0x7379, 0xAB47, 0x737A, 0xAB48, + 0x737B, 0xAB49, 0x737C, 0xAB4A, 0x737D, 0xAB4B, 0x737E, 0xE2B5, 0x737F, 0xAB4C, 0x7380, 0xAB4D, 0x7381, 0xAB4E, 0x7382, 0xAB4F, + 0x7383, 0xAB50, 0x7384, 0xD0FE, 0x7385, 0xAB51, 0x7386, 0xAB52, 0x7387, 0xC2CA, 0x7388, 0xAB53, 0x7389, 0xD3F1, 0x738A, 0xAB54, + 0x738B, 0xCDF5, 0x738C, 0xAB55, 0x738D, 0xAB56, 0x738E, 0xE7E0, 0x738F, 0xAB57, 0x7390, 0xAB58, 0x7391, 0xE7E1, 0x7392, 0xAB59, + 0x7393, 0xAB5A, 0x7394, 0xAB5B, 0x7395, 0xAB5C, 0x7396, 0xBEC1, 0x7397, 0xAB5D, 0x7398, 0xAB5E, 0x7399, 0xAB5F, 0x739A, 0xAB60, + 0x739B, 0xC2EA, 0x739C, 0xAB61, 0x739D, 0xAB62, 0x739E, 0xAB63, 0x739F, 0xE7E4, 0x73A0, 0xAB64, 0x73A1, 0xAB65, 0x73A2, 0xE7E3, + 0x73A3, 0xAB66, 0x73A4, 0xAB67, 0x73A5, 0xAB68, 0x73A6, 0xAB69, 0x73A7, 0xAB6A, 0x73A8, 0xAB6B, 0x73A9, 0xCDE6, 0x73AA, 0xAB6C, + 0x73AB, 0xC3B5, 0x73AC, 0xAB6D, 0x73AD, 0xAB6E, 0x73AE, 0xE7E2, 0x73AF, 0xBBB7, 0x73B0, 0xCFD6, 0x73B1, 0xAB6F, 0x73B2, 0xC1E1, + 0x73B3, 0xE7E9, 0x73B4, 0xAB70, 0x73B5, 0xAB71, 0x73B6, 0xAB72, 0x73B7, 0xE7E8, 0x73B8, 0xAB73, 0x73B9, 0xAB74, 0x73BA, 0xE7F4, + 0x73BB, 0xB2A3, 0x73BC, 0xAB75, 0x73BD, 0xAB76, 0x73BE, 0xAB77, 0x73BF, 0xAB78, 0x73C0, 0xE7EA, 0x73C1, 0xAB79, 0x73C2, 0xE7E6, + 0x73C3, 0xAB7A, 0x73C4, 0xAB7B, 0x73C5, 0xAB7C, 0x73C6, 0xAB7D, 0x73C7, 0xAB7E, 0x73C8, 0xE7EC, 0x73C9, 0xE7EB, 0x73CA, 0xC9BA, + 0x73CB, 0xAB80, 0x73CC, 0xAB81, 0x73CD, 0xD5E4, 0x73CE, 0xAB82, 0x73CF, 0xE7E5, 0x73D0, 0xB7A9, 0x73D1, 0xE7E7, 0x73D2, 0xAB83, + 0x73D3, 0xAB84, 0x73D4, 0xAB85, 0x73D5, 0xAB86, 0x73D6, 0xAB87, 0x73D7, 0xAB88, 0x73D8, 0xAB89, 0x73D9, 0xE7EE, 0x73DA, 0xAB8A, + 0x73DB, 0xAB8B, 0x73DC, 0xAB8C, 0x73DD, 0xAB8D, 0x73DE, 0xE7F3, 0x73DF, 0xAB8E, 0x73E0, 0xD6E9, 0x73E1, 0xAB8F, 0x73E2, 0xAB90, + 0x73E3, 0xAB91, 0x73E4, 0xAB92, 0x73E5, 0xE7ED, 0x73E6, 0xAB93, 0x73E7, 0xE7F2, 0x73E8, 0xAB94, 0x73E9, 0xE7F1, 0x73EA, 0xAB95, + 0x73EB, 0xAB96, 0x73EC, 0xAB97, 0x73ED, 0xB0E0, 0x73EE, 0xAB98, 0x73EF, 0xAB99, 0x73F0, 0xAB9A, 0x73F1, 0xAB9B, 0x73F2, 0xE7F5, + 0x73F3, 0xAB9C, 0x73F4, 0xAB9D, 0x73F5, 0xAB9E, 0x73F6, 0xAB9F, 0x73F7, 0xABA0, 0x73F8, 0xAC40, 0x73F9, 0xAC41, 0x73FA, 0xAC42, + 0x73FB, 0xAC43, 0x73FC, 0xAC44, 0x73FD, 0xAC45, 0x73FE, 0xAC46, 0x73FF, 0xAC47, 0x7400, 0xAC48, 0x7401, 0xAC49, 0x7402, 0xAC4A, + 0x7403, 0xC7F2, 0x7404, 0xAC4B, 0x7405, 0xC0C5, 0x7406, 0xC0ED, 0x7407, 0xAC4C, 0x7408, 0xAC4D, 0x7409, 0xC1F0, 0x740A, 0xE7F0, + 0x740B, 0xAC4E, 0x740C, 0xAC4F, 0x740D, 0xAC50, 0x740E, 0xAC51, 0x740F, 0xE7F6, 0x7410, 0xCBF6, 0x7411, 0xAC52, 0x7412, 0xAC53, + 0x7413, 0xAC54, 0x7414, 0xAC55, 0x7415, 0xAC56, 0x7416, 0xAC57, 0x7417, 0xAC58, 0x7418, 0xAC59, 0x7419, 0xAC5A, 0x741A, 0xE8A2, + 0x741B, 0xE8A1, 0x741C, 0xAC5B, 0x741D, 0xAC5C, 0x741E, 0xAC5D, 0x741F, 0xAC5E, 0x7420, 0xAC5F, 0x7421, 0xAC60, 0x7422, 0xD7C1, + 0x7423, 0xAC61, 0x7424, 0xAC62, 0x7425, 0xE7FA, 0x7426, 0xE7F9, 0x7427, 0xAC63, 0x7428, 0xE7FB, 0x7429, 0xAC64, 0x742A, 0xE7F7, + 0x742B, 0xAC65, 0x742C, 0xE7FE, 0x742D, 0xAC66, 0x742E, 0xE7FD, 0x742F, 0xAC67, 0x7430, 0xE7FC, 0x7431, 0xAC68, 0x7432, 0xAC69, + 0x7433, 0xC1D5, 0x7434, 0xC7D9, 0x7435, 0xC5FD, 0x7436, 0xC5C3, 0x7437, 0xAC6A, 0x7438, 0xAC6B, 0x7439, 0xAC6C, 0x743A, 0xAC6D, + 0x743B, 0xAC6E, 0x743C, 0xC7ED, 0x743D, 0xAC6F, 0x743E, 0xAC70, 0x743F, 0xAC71, 0x7440, 0xAC72, 0x7441, 0xE8A3, 0x7442, 0xAC73, + 0x7443, 0xAC74, 0x7444, 0xAC75, 0x7445, 0xAC76, 0x7446, 0xAC77, 0x7447, 0xAC78, 0x7448, 0xAC79, 0x7449, 0xAC7A, 0x744A, 0xAC7B, + 0x744B, 0xAC7C, 0x744C, 0xAC7D, 0x744D, 0xAC7E, 0x744E, 0xAC80, 0x744F, 0xAC81, 0x7450, 0xAC82, 0x7451, 0xAC83, 0x7452, 0xAC84, + 0x7453, 0xAC85, 0x7454, 0xAC86, 0x7455, 0xE8A6, 0x7456, 0xAC87, 0x7457, 0xE8A5, 0x7458, 0xAC88, 0x7459, 0xE8A7, 0x745A, 0xBAF7, + 0x745B, 0xE7F8, 0x745C, 0xE8A4, 0x745D, 0xAC89, 0x745E, 0xC8F0, 0x745F, 0xC9AA, 0x7460, 0xAC8A, 0x7461, 0xAC8B, 0x7462, 0xAC8C, + 0x7463, 0xAC8D, 0x7464, 0xAC8E, 0x7465, 0xAC8F, 0x7466, 0xAC90, 0x7467, 0xAC91, 0x7468, 0xAC92, 0x7469, 0xAC93, 0x746A, 0xAC94, + 0x746B, 0xAC95, 0x746C, 0xAC96, 0x746D, 0xE8A9, 0x746E, 0xAC97, 0x746F, 0xAC98, 0x7470, 0xB9E5, 0x7471, 0xAC99, 0x7472, 0xAC9A, + 0x7473, 0xAC9B, 0x7474, 0xAC9C, 0x7475, 0xAC9D, 0x7476, 0xD1FE, 0x7477, 0xE8A8, 0x7478, 0xAC9E, 0x7479, 0xAC9F, 0x747A, 0xACA0, + 0x747B, 0xAD40, 0x747C, 0xAD41, 0x747D, 0xAD42, 0x747E, 0xE8AA, 0x747F, 0xAD43, 0x7480, 0xE8AD, 0x7481, 0xE8AE, 0x7482, 0xAD44, + 0x7483, 0xC1A7, 0x7484, 0xAD45, 0x7485, 0xAD46, 0x7486, 0xAD47, 0x7487, 0xE8AF, 0x7488, 0xAD48, 0x7489, 0xAD49, 0x748A, 0xAD4A, + 0x748B, 0xE8B0, 0x748C, 0xAD4B, 0x748D, 0xAD4C, 0x748E, 0xE8AC, 0x748F, 0xAD4D, 0x7490, 0xE8B4, 0x7491, 0xAD4E, 0x7492, 0xAD4F, + 0x7493, 0xAD50, 0x7494, 0xAD51, 0x7495, 0xAD52, 0x7496, 0xAD53, 0x7497, 0xAD54, 0x7498, 0xAD55, 0x7499, 0xAD56, 0x749A, 0xAD57, + 0x749B, 0xAD58, 0x749C, 0xE8AB, 0x749D, 0xAD59, 0x749E, 0xE8B1, 0x749F, 0xAD5A, 0x74A0, 0xAD5B, 0x74A1, 0xAD5C, 0x74A2, 0xAD5D, + 0x74A3, 0xAD5E, 0x74A4, 0xAD5F, 0x74A5, 0xAD60, 0x74A6, 0xAD61, 0x74A7, 0xE8B5, 0x74A8, 0xE8B2, 0x74A9, 0xE8B3, 0x74AA, 0xAD62, + 0x74AB, 0xAD63, 0x74AC, 0xAD64, 0x74AD, 0xAD65, 0x74AE, 0xAD66, 0x74AF, 0xAD67, 0x74B0, 0xAD68, 0x74B1, 0xAD69, 0x74B2, 0xAD6A, + 0x74B3, 0xAD6B, 0x74B4, 0xAD6C, 0x74B5, 0xAD6D, 0x74B6, 0xAD6E, 0x74B7, 0xAD6F, 0x74B8, 0xAD70, 0x74B9, 0xAD71, 0x74BA, 0xE8B7, + 0x74BB, 0xAD72, 0x74BC, 0xAD73, 0x74BD, 0xAD74, 0x74BE, 0xAD75, 0x74BF, 0xAD76, 0x74C0, 0xAD77, 0x74C1, 0xAD78, 0x74C2, 0xAD79, + 0x74C3, 0xAD7A, 0x74C4, 0xAD7B, 0x74C5, 0xAD7C, 0x74C6, 0xAD7D, 0x74C7, 0xAD7E, 0x74C8, 0xAD80, 0x74C9, 0xAD81, 0x74CA, 0xAD82, + 0x74CB, 0xAD83, 0x74CC, 0xAD84, 0x74CD, 0xAD85, 0x74CE, 0xAD86, 0x74CF, 0xAD87, 0x74D0, 0xAD88, 0x74D1, 0xAD89, 0x74D2, 0xE8B6, + 0x74D3, 0xAD8A, 0x74D4, 0xAD8B, 0x74D5, 0xAD8C, 0x74D6, 0xAD8D, 0x74D7, 0xAD8E, 0x74D8, 0xAD8F, 0x74D9, 0xAD90, 0x74DA, 0xAD91, + 0x74DB, 0xAD92, 0x74DC, 0xB9CF, 0x74DD, 0xAD93, 0x74DE, 0xF0AC, 0x74DF, 0xAD94, 0x74E0, 0xF0AD, 0x74E1, 0xAD95, 0x74E2, 0xC6B0, + 0x74E3, 0xB0EA, 0x74E4, 0xC8BF, 0x74E5, 0xAD96, 0x74E6, 0xCDDF, 0x74E7, 0xAD97, 0x74E8, 0xAD98, 0x74E9, 0xAD99, 0x74EA, 0xAD9A, + 0x74EB, 0xAD9B, 0x74EC, 0xAD9C, 0x74ED, 0xAD9D, 0x74EE, 0xCECD, 0x74EF, 0xEAB1, 0x74F0, 0xAD9E, 0x74F1, 0xAD9F, 0x74F2, 0xADA0, + 0x74F3, 0xAE40, 0x74F4, 0xEAB2, 0x74F5, 0xAE41, 0x74F6, 0xC6BF, 0x74F7, 0xB4C9, 0x74F8, 0xAE42, 0x74F9, 0xAE43, 0x74FA, 0xAE44, + 0x74FB, 0xAE45, 0x74FC, 0xAE46, 0x74FD, 0xAE47, 0x74FE, 0xAE48, 0x74FF, 0xEAB3, 0x7500, 0xAE49, 0x7501, 0xAE4A, 0x7502, 0xAE4B, + 0x7503, 0xAE4C, 0x7504, 0xD5E7, 0x7505, 0xAE4D, 0x7506, 0xAE4E, 0x7507, 0xAE4F, 0x7508, 0xAE50, 0x7509, 0xAE51, 0x750A, 0xAE52, + 0x750B, 0xAE53, 0x750C, 0xAE54, 0x750D, 0xDDF9, 0x750E, 0xAE55, 0x750F, 0xEAB4, 0x7510, 0xAE56, 0x7511, 0xEAB5, 0x7512, 0xAE57, + 0x7513, 0xEAB6, 0x7514, 0xAE58, 0x7515, 0xAE59, 0x7516, 0xAE5A, 0x7517, 0xAE5B, 0x7518, 0xB8CA, 0x7519, 0xDFB0, 0x751A, 0xC9F5, + 0x751B, 0xAE5C, 0x751C, 0xCCF0, 0x751D, 0xAE5D, 0x751E, 0xAE5E, 0x751F, 0xC9FA, 0x7520, 0xAE5F, 0x7521, 0xAE60, 0x7522, 0xAE61, + 0x7523, 0xAE62, 0x7524, 0xAE63, 0x7525, 0xC9FB, 0x7526, 0xAE64, 0x7527, 0xAE65, 0x7528, 0xD3C3, 0x7529, 0xCBA6, 0x752A, 0xAE66, + 0x752B, 0xB8A6, 0x752C, 0xF0AE, 0x752D, 0xB1C2, 0x752E, 0xAE67, 0x752F, 0xE5B8, 0x7530, 0xCCEF, 0x7531, 0xD3C9, 0x7532, 0xBCD7, + 0x7533, 0xC9EA, 0x7534, 0xAE68, 0x7535, 0xB5E7, 0x7536, 0xAE69, 0x7537, 0xC4D0, 0x7538, 0xB5E9, 0x7539, 0xAE6A, 0x753A, 0xEEAE, + 0x753B, 0xBBAD, 0x753C, 0xAE6B, 0x753D, 0xAE6C, 0x753E, 0xE7DE, 0x753F, 0xAE6D, 0x7540, 0xEEAF, 0x7541, 0xAE6E, 0x7542, 0xAE6F, + 0x7543, 0xAE70, 0x7544, 0xAE71, 0x7545, 0xB3A9, 0x7546, 0xAE72, 0x7547, 0xAE73, 0x7548, 0xEEB2, 0x7549, 0xAE74, 0x754A, 0xAE75, + 0x754B, 0xEEB1, 0x754C, 0xBDE7, 0x754D, 0xAE76, 0x754E, 0xEEB0, 0x754F, 0xCEB7, 0x7550, 0xAE77, 0x7551, 0xAE78, 0x7552, 0xAE79, + 0x7553, 0xAE7A, 0x7554, 0xC5CF, 0x7555, 0xAE7B, 0x7556, 0xAE7C, 0x7557, 0xAE7D, 0x7558, 0xAE7E, 0x7559, 0xC1F4, 0x755A, 0xDBCE, + 0x755B, 0xEEB3, 0x755C, 0xD0F3, 0x755D, 0xAE80, 0x755E, 0xAE81, 0x755F, 0xAE82, 0x7560, 0xAE83, 0x7561, 0xAE84, 0x7562, 0xAE85, + 0x7563, 0xAE86, 0x7564, 0xAE87, 0x7565, 0xC2D4, 0x7566, 0xC6E8, 0x7567, 0xAE88, 0x7568, 0xAE89, 0x7569, 0xAE8A, 0x756A, 0xB7AC, + 0x756B, 0xAE8B, 0x756C, 0xAE8C, 0x756D, 0xAE8D, 0x756E, 0xAE8E, 0x756F, 0xAE8F, 0x7570, 0xAE90, 0x7571, 0xAE91, 0x7572, 0xEEB4, + 0x7573, 0xAE92, 0x7574, 0xB3EB, 0x7575, 0xAE93, 0x7576, 0xAE94, 0x7577, 0xAE95, 0x7578, 0xBBFB, 0x7579, 0xEEB5, 0x757A, 0xAE96, + 0x757B, 0xAE97, 0x757C, 0xAE98, 0x757D, 0xAE99, 0x757E, 0xAE9A, 0x757F, 0xE7DC, 0x7580, 0xAE9B, 0x7581, 0xAE9C, 0x7582, 0xAE9D, + 0x7583, 0xEEB6, 0x7584, 0xAE9E, 0x7585, 0xAE9F, 0x7586, 0xBDAE, 0x7587, 0xAEA0, 0x7588, 0xAF40, 0x7589, 0xAF41, 0x758A, 0xAF42, + 0x758B, 0xF1E2, 0x758C, 0xAF43, 0x758D, 0xAF44, 0x758E, 0xAF45, 0x758F, 0xCAE8, 0x7590, 0xAF46, 0x7591, 0xD2C9, 0x7592, 0xF0DA, + 0x7593, 0xAF47, 0x7594, 0xF0DB, 0x7595, 0xAF48, 0x7596, 0xF0DC, 0x7597, 0xC1C6, 0x7598, 0xAF49, 0x7599, 0xB8ED, 0x759A, 0xBECE, + 0x759B, 0xAF4A, 0x759C, 0xAF4B, 0x759D, 0xF0DE, 0x759E, 0xAF4C, 0x759F, 0xC5B1, 0x75A0, 0xF0DD, 0x75A1, 0xD1F1, 0x75A2, 0xAF4D, + 0x75A3, 0xF0E0, 0x75A4, 0xB0CC, 0x75A5, 0xBDEA, 0x75A6, 0xAF4E, 0x75A7, 0xAF4F, 0x75A8, 0xAF50, 0x75A9, 0xAF51, 0x75AA, 0xAF52, + 0x75AB, 0xD2DF, 0x75AC, 0xF0DF, 0x75AD, 0xAF53, 0x75AE, 0xB4AF, 0x75AF, 0xB7E8, 0x75B0, 0xF0E6, 0x75B1, 0xF0E5, 0x75B2, 0xC6A3, + 0x75B3, 0xF0E1, 0x75B4, 0xF0E2, 0x75B5, 0xB4C3, 0x75B6, 0xAF54, 0x75B7, 0xAF55, 0x75B8, 0xF0E3, 0x75B9, 0xD5EE, 0x75BA, 0xAF56, + 0x75BB, 0xAF57, 0x75BC, 0xCCDB, 0x75BD, 0xBED2, 0x75BE, 0xBCB2, 0x75BF, 0xAF58, 0x75C0, 0xAF59, 0x75C1, 0xAF5A, 0x75C2, 0xF0E8, + 0x75C3, 0xF0E7, 0x75C4, 0xF0E4, 0x75C5, 0xB2A1, 0x75C6, 0xAF5B, 0x75C7, 0xD6A2, 0x75C8, 0xD3B8, 0x75C9, 0xBEB7, 0x75CA, 0xC8AC, + 0x75CB, 0xAF5C, 0x75CC, 0xAF5D, 0x75CD, 0xF0EA, 0x75CE, 0xAF5E, 0x75CF, 0xAF5F, 0x75D0, 0xAF60, 0x75D1, 0xAF61, 0x75D2, 0xD1F7, + 0x75D3, 0xAF62, 0x75D4, 0xD6CC, 0x75D5, 0xBADB, 0x75D6, 0xF0E9, 0x75D7, 0xAF63, 0x75D8, 0xB6BB, 0x75D9, 0xAF64, 0x75DA, 0xAF65, + 0x75DB, 0xCDB4, 0x75DC, 0xAF66, 0x75DD, 0xAF67, 0x75DE, 0xC6A6, 0x75DF, 0xAF68, 0x75E0, 0xAF69, 0x75E1, 0xAF6A, 0x75E2, 0xC1A1, + 0x75E3, 0xF0EB, 0x75E4, 0xF0EE, 0x75E5, 0xAF6B, 0x75E6, 0xF0ED, 0x75E7, 0xF0F0, 0x75E8, 0xF0EC, 0x75E9, 0xAF6C, 0x75EA, 0xBBBE, + 0x75EB, 0xF0EF, 0x75EC, 0xAF6D, 0x75ED, 0xAF6E, 0x75EE, 0xAF6F, 0x75EF, 0xAF70, 0x75F0, 0xCCB5, 0x75F1, 0xF0F2, 0x75F2, 0xAF71, + 0x75F3, 0xAF72, 0x75F4, 0xB3D5, 0x75F5, 0xAF73, 0x75F6, 0xAF74, 0x75F7, 0xAF75, 0x75F8, 0xAF76, 0x75F9, 0xB1D4, 0x75FA, 0xAF77, + 0x75FB, 0xAF78, 0x75FC, 0xF0F3, 0x75FD, 0xAF79, 0x75FE, 0xAF7A, 0x75FF, 0xF0F4, 0x7600, 0xF0F6, 0x7601, 0xB4E1, 0x7602, 0xAF7B, + 0x7603, 0xF0F1, 0x7604, 0xAF7C, 0x7605, 0xF0F7, 0x7606, 0xAF7D, 0x7607, 0xAF7E, 0x7608, 0xAF80, 0x7609, 0xAF81, 0x760A, 0xF0FA, + 0x760B, 0xAF82, 0x760C, 0xF0F8, 0x760D, 0xAF83, 0x760E, 0xAF84, 0x760F, 0xAF85, 0x7610, 0xF0F5, 0x7611, 0xAF86, 0x7612, 0xAF87, + 0x7613, 0xAF88, 0x7614, 0xAF89, 0x7615, 0xF0FD, 0x7616, 0xAF8A, 0x7617, 0xF0F9, 0x7618, 0xF0FC, 0x7619, 0xF0FE, 0x761A, 0xAF8B, + 0x761B, 0xF1A1, 0x761C, 0xAF8C, 0x761D, 0xAF8D, 0x761E, 0xAF8E, 0x761F, 0xCEC1, 0x7620, 0xF1A4, 0x7621, 0xAF8F, 0x7622, 0xF1A3, + 0x7623, 0xAF90, 0x7624, 0xC1F6, 0x7625, 0xF0FB, 0x7626, 0xCADD, 0x7627, 0xAF91, 0x7628, 0xAF92, 0x7629, 0xB4F1, 0x762A, 0xB1F1, + 0x762B, 0xCCB1, 0x762C, 0xAF93, 0x762D, 0xF1A6, 0x762E, 0xAF94, 0x762F, 0xAF95, 0x7630, 0xF1A7, 0x7631, 0xAF96, 0x7632, 0xAF97, + 0x7633, 0xF1AC, 0x7634, 0xD5CE, 0x7635, 0xF1A9, 0x7636, 0xAF98, 0x7637, 0xAF99, 0x7638, 0xC8B3, 0x7639, 0xAF9A, 0x763A, 0xAF9B, + 0x763B, 0xAF9C, 0x763C, 0xF1A2, 0x763D, 0xAF9D, 0x763E, 0xF1AB, 0x763F, 0xF1A8, 0x7640, 0xF1A5, 0x7641, 0xAF9E, 0x7642, 0xAF9F, + 0x7643, 0xF1AA, 0x7644, 0xAFA0, 0x7645, 0xB040, 0x7646, 0xB041, 0x7647, 0xB042, 0x7648, 0xB043, 0x7649, 0xB044, 0x764A, 0xB045, + 0x764B, 0xB046, 0x764C, 0xB0A9, 0x764D, 0xF1AD, 0x764E, 0xB047, 0x764F, 0xB048, 0x7650, 0xB049, 0x7651, 0xB04A, 0x7652, 0xB04B, + 0x7653, 0xB04C, 0x7654, 0xF1AF, 0x7655, 0xB04D, 0x7656, 0xF1B1, 0x7657, 0xB04E, 0x7658, 0xB04F, 0x7659, 0xB050, 0x765A, 0xB051, + 0x765B, 0xB052, 0x765C, 0xF1B0, 0x765D, 0xB053, 0x765E, 0xF1AE, 0x765F, 0xB054, 0x7660, 0xB055, 0x7661, 0xB056, 0x7662, 0xB057, + 0x7663, 0xD1A2, 0x7664, 0xB058, 0x7665, 0xB059, 0x7666, 0xB05A, 0x7667, 0xB05B, 0x7668, 0xB05C, 0x7669, 0xB05D, 0x766A, 0xB05E, + 0x766B, 0xF1B2, 0x766C, 0xB05F, 0x766D, 0xB060, 0x766E, 0xB061, 0x766F, 0xF1B3, 0x7670, 0xB062, 0x7671, 0xB063, 0x7672, 0xB064, + 0x7673, 0xB065, 0x7674, 0xB066, 0x7675, 0xB067, 0x7676, 0xB068, 0x7677, 0xB069, 0x7678, 0xB9EF, 0x7679, 0xB06A, 0x767A, 0xB06B, + 0x767B, 0xB5C7, 0x767C, 0xB06C, 0x767D, 0xB0D7, 0x767E, 0xB0D9, 0x767F, 0xB06D, 0x7680, 0xB06E, 0x7681, 0xB06F, 0x7682, 0xD4ED, + 0x7683, 0xB070, 0x7684, 0xB5C4, 0x7685, 0xB071, 0x7686, 0xBDD4, 0x7687, 0xBBCA, 0x7688, 0xF0A7, 0x7689, 0xB072, 0x768A, 0xB073, + 0x768B, 0xB8DE, 0x768C, 0xB074, 0x768D, 0xB075, 0x768E, 0xF0A8, 0x768F, 0xB076, 0x7690, 0xB077, 0x7691, 0xB0A8, 0x7692, 0xB078, + 0x7693, 0xF0A9, 0x7694, 0xB079, 0x7695, 0xB07A, 0x7696, 0xCDEE, 0x7697, 0xB07B, 0x7698, 0xB07C, 0x7699, 0xF0AA, 0x769A, 0xB07D, + 0x769B, 0xB07E, 0x769C, 0xB080, 0x769D, 0xB081, 0x769E, 0xB082, 0x769F, 0xB083, 0x76A0, 0xB084, 0x76A1, 0xB085, 0x76A2, 0xB086, + 0x76A3, 0xB087, 0x76A4, 0xF0AB, 0x76A5, 0xB088, 0x76A6, 0xB089, 0x76A7, 0xB08A, 0x76A8, 0xB08B, 0x76A9, 0xB08C, 0x76AA, 0xB08D, + 0x76AB, 0xB08E, 0x76AC, 0xB08F, 0x76AD, 0xB090, 0x76AE, 0xC6A4, 0x76AF, 0xB091, 0x76B0, 0xB092, 0x76B1, 0xD6E5, 0x76B2, 0xF1E4, + 0x76B3, 0xB093, 0x76B4, 0xF1E5, 0x76B5, 0xB094, 0x76B6, 0xB095, 0x76B7, 0xB096, 0x76B8, 0xB097, 0x76B9, 0xB098, 0x76BA, 0xB099, + 0x76BB, 0xB09A, 0x76BC, 0xB09B, 0x76BD, 0xB09C, 0x76BE, 0xB09D, 0x76BF, 0xC3F3, 0x76C0, 0xB09E, 0x76C1, 0xB09F, 0x76C2, 0xD3DB, + 0x76C3, 0xB0A0, 0x76C4, 0xB140, 0x76C5, 0xD6D1, 0x76C6, 0xC5E8, 0x76C7, 0xB141, 0x76C8, 0xD3AF, 0x76C9, 0xB142, 0x76CA, 0xD2E6, + 0x76CB, 0xB143, 0x76CC, 0xB144, 0x76CD, 0xEEC1, 0x76CE, 0xB0BB, 0x76CF, 0xD5B5, 0x76D0, 0xD1CE, 0x76D1, 0xBCE0, 0x76D2, 0xBAD0, + 0x76D3, 0xB145, 0x76D4, 0xBFF8, 0x76D5, 0xB146, 0x76D6, 0xB8C7, 0x76D7, 0xB5C1, 0x76D8, 0xC5CC, 0x76D9, 0xB147, 0x76DA, 0xB148, + 0x76DB, 0xCAA2, 0x76DC, 0xB149, 0x76DD, 0xB14A, 0x76DE, 0xB14B, 0x76DF, 0xC3CB, 0x76E0, 0xB14C, 0x76E1, 0xB14D, 0x76E2, 0xB14E, + 0x76E3, 0xB14F, 0x76E4, 0xB150, 0x76E5, 0xEEC2, 0x76E6, 0xB151, 0x76E7, 0xB152, 0x76E8, 0xB153, 0x76E9, 0xB154, 0x76EA, 0xB155, + 0x76EB, 0xB156, 0x76EC, 0xB157, 0x76ED, 0xB158, 0x76EE, 0xC4BF, 0x76EF, 0xB6A2, 0x76F0, 0xB159, 0x76F1, 0xEDEC, 0x76F2, 0xC3A4, + 0x76F3, 0xB15A, 0x76F4, 0xD6B1, 0x76F5, 0xB15B, 0x76F6, 0xB15C, 0x76F7, 0xB15D, 0x76F8, 0xCFE0, 0x76F9, 0xEDEF, 0x76FA, 0xB15E, + 0x76FB, 0xB15F, 0x76FC, 0xC5CE, 0x76FD, 0xB160, 0x76FE, 0xB6DC, 0x76FF, 0xB161, 0x7700, 0xB162, 0x7701, 0xCAA1, 0x7702, 0xB163, + 0x7703, 0xB164, 0x7704, 0xEDED, 0x7705, 0xB165, 0x7706, 0xB166, 0x7707, 0xEDF0, 0x7708, 0xEDF1, 0x7709, 0xC3BC, 0x770A, 0xB167, + 0x770B, 0xBFB4, 0x770C, 0xB168, 0x770D, 0xEDEE, 0x770E, 0xB169, 0x770F, 0xB16A, 0x7710, 0xB16B, 0x7711, 0xB16C, 0x7712, 0xB16D, + 0x7713, 0xB16E, 0x7714, 0xB16F, 0x7715, 0xB170, 0x7716, 0xB171, 0x7717, 0xB172, 0x7718, 0xB173, 0x7719, 0xEDF4, 0x771A, 0xEDF2, + 0x771B, 0xB174, 0x771C, 0xB175, 0x771D, 0xB176, 0x771E, 0xB177, 0x771F, 0xD5E6, 0x7720, 0xC3DF, 0x7721, 0xB178, 0x7722, 0xEDF3, + 0x7723, 0xB179, 0x7724, 0xB17A, 0x7725, 0xB17B, 0x7726, 0xEDF6, 0x7727, 0xB17C, 0x7728, 0xD5A3, 0x7729, 0xD1A3, 0x772A, 0xB17D, + 0x772B, 0xB17E, 0x772C, 0xB180, 0x772D, 0xEDF5, 0x772E, 0xB181, 0x772F, 0xC3D0, 0x7730, 0xB182, 0x7731, 0xB183, 0x7732, 0xB184, + 0x7733, 0xB185, 0x7734, 0xB186, 0x7735, 0xEDF7, 0x7736, 0xBFF4, 0x7737, 0xBEEC, 0x7738, 0xEDF8, 0x7739, 0xB187, 0x773A, 0xCCF7, + 0x773B, 0xB188, 0x773C, 0xD1DB, 0x773D, 0xB189, 0x773E, 0xB18A, 0x773F, 0xB18B, 0x7740, 0xD7C5, 0x7741, 0xD5F6, 0x7742, 0xB18C, + 0x7743, 0xEDFC, 0x7744, 0xB18D, 0x7745, 0xB18E, 0x7746, 0xB18F, 0x7747, 0xEDFB, 0x7748, 0xB190, 0x7749, 0xB191, 0x774A, 0xB192, + 0x774B, 0xB193, 0x774C, 0xB194, 0x774D, 0xB195, 0x774E, 0xB196, 0x774F, 0xB197, 0x7750, 0xEDF9, 0x7751, 0xEDFA, 0x7752, 0xB198, + 0x7753, 0xB199, 0x7754, 0xB19A, 0x7755, 0xB19B, 0x7756, 0xB19C, 0x7757, 0xB19D, 0x7758, 0xB19E, 0x7759, 0xB19F, 0x775A, 0xEDFD, + 0x775B, 0xBEA6, 0x775C, 0xB1A0, 0x775D, 0xB240, 0x775E, 0xB241, 0x775F, 0xB242, 0x7760, 0xB243, 0x7761, 0xCBAF, 0x7762, 0xEEA1, + 0x7763, 0xB6BD, 0x7764, 0xB244, 0x7765, 0xEEA2, 0x7766, 0xC4C0, 0x7767, 0xB245, 0x7768, 0xEDFE, 0x7769, 0xB246, 0x776A, 0xB247, + 0x776B, 0xBDDE, 0x776C, 0xB2C7, 0x776D, 0xB248, 0x776E, 0xB249, 0x776F, 0xB24A, 0x7770, 0xB24B, 0x7771, 0xB24C, 0x7772, 0xB24D, + 0x7773, 0xB24E, 0x7774, 0xB24F, 0x7775, 0xB250, 0x7776, 0xB251, 0x7777, 0xB252, 0x7778, 0xB253, 0x7779, 0xB6C3, 0x777A, 0xB254, + 0x777B, 0xB255, 0x777C, 0xB256, 0x777D, 0xEEA5, 0x777E, 0xD8BA, 0x777F, 0xEEA3, 0x7780, 0xEEA6, 0x7781, 0xB257, 0x7782, 0xB258, + 0x7783, 0xB259, 0x7784, 0xC3E9, 0x7785, 0xB3F2, 0x7786, 0xB25A, 0x7787, 0xB25B, 0x7788, 0xB25C, 0x7789, 0xB25D, 0x778A, 0xB25E, + 0x778B, 0xB25F, 0x778C, 0xEEA7, 0x778D, 0xEEA4, 0x778E, 0xCFB9, 0x778F, 0xB260, 0x7790, 0xB261, 0x7791, 0xEEA8, 0x7792, 0xC2F7, + 0x7793, 0xB262, 0x7794, 0xB263, 0x7795, 0xB264, 0x7796, 0xB265, 0x7797, 0xB266, 0x7798, 0xB267, 0x7799, 0xB268, 0x779A, 0xB269, + 0x779B, 0xB26A, 0x779C, 0xB26B, 0x779D, 0xB26C, 0x779E, 0xB26D, 0x779F, 0xEEA9, 0x77A0, 0xEEAA, 0x77A1, 0xB26E, 0x77A2, 0xDEAB, + 0x77A3, 0xB26F, 0x77A4, 0xB270, 0x77A5, 0xC6B3, 0x77A6, 0xB271, 0x77A7, 0xC7C6, 0x77A8, 0xB272, 0x77A9, 0xD6F5, 0x77AA, 0xB5C9, + 0x77AB, 0xB273, 0x77AC, 0xCBB2, 0x77AD, 0xB274, 0x77AE, 0xB275, 0x77AF, 0xB276, 0x77B0, 0xEEAB, 0x77B1, 0xB277, 0x77B2, 0xB278, + 0x77B3, 0xCDAB, 0x77B4, 0xB279, 0x77B5, 0xEEAC, 0x77B6, 0xB27A, 0x77B7, 0xB27B, 0x77B8, 0xB27C, 0x77B9, 0xB27D, 0x77BA, 0xB27E, + 0x77BB, 0xD5B0, 0x77BC, 0xB280, 0x77BD, 0xEEAD, 0x77BE, 0xB281, 0x77BF, 0xF6C4, 0x77C0, 0xB282, 0x77C1, 0xB283, 0x77C2, 0xB284, + 0x77C3, 0xB285, 0x77C4, 0xB286, 0x77C5, 0xB287, 0x77C6, 0xB288, 0x77C7, 0xB289, 0x77C8, 0xB28A, 0x77C9, 0xB28B, 0x77CA, 0xB28C, + 0x77CB, 0xB28D, 0x77CC, 0xB28E, 0x77CD, 0xDBC7, 0x77CE, 0xB28F, 0x77CF, 0xB290, 0x77D0, 0xB291, 0x77D1, 0xB292, 0x77D2, 0xB293, + 0x77D3, 0xB294, 0x77D4, 0xB295, 0x77D5, 0xB296, 0x77D6, 0xB297, 0x77D7, 0xB4A3, 0x77D8, 0xB298, 0x77D9, 0xB299, 0x77DA, 0xB29A, + 0x77DB, 0xC3AC, 0x77DC, 0xF1E6, 0x77DD, 0xB29B, 0x77DE, 0xB29C, 0x77DF, 0xB29D, 0x77E0, 0xB29E, 0x77E1, 0xB29F, 0x77E2, 0xCAB8, + 0x77E3, 0xD2D3, 0x77E4, 0xB2A0, 0x77E5, 0xD6AA, 0x77E6, 0xB340, 0x77E7, 0xEFF2, 0x77E8, 0xB341, 0x77E9, 0xBED8, 0x77EA, 0xB342, + 0x77EB, 0xBDC3, 0x77EC, 0xEFF3, 0x77ED, 0xB6CC, 0x77EE, 0xB0AB, 0x77EF, 0xB343, 0x77F0, 0xB344, 0x77F1, 0xB345, 0x77F2, 0xB346, + 0x77F3, 0xCAAF, 0x77F4, 0xB347, 0x77F5, 0xB348, 0x77F6, 0xEDB6, 0x77F7, 0xB349, 0x77F8, 0xEDB7, 0x77F9, 0xB34A, 0x77FA, 0xB34B, + 0x77FB, 0xB34C, 0x77FC, 0xB34D, 0x77FD, 0xCEF9, 0x77FE, 0xB7AF, 0x77FF, 0xBFF3, 0x7800, 0xEDB8, 0x7801, 0xC2EB, 0x7802, 0xC9B0, + 0x7803, 0xB34E, 0x7804, 0xB34F, 0x7805, 0xB350, 0x7806, 0xB351, 0x7807, 0xB352, 0x7808, 0xB353, 0x7809, 0xEDB9, 0x780A, 0xB354, + 0x780B, 0xB355, 0x780C, 0xC6F6, 0x780D, 0xBFB3, 0x780E, 0xB356, 0x780F, 0xB357, 0x7810, 0xB358, 0x7811, 0xEDBC, 0x7812, 0xC5F8, + 0x7813, 0xB359, 0x7814, 0xD1D0, 0x7815, 0xB35A, 0x7816, 0xD7A9, 0x7817, 0xEDBA, 0x7818, 0xEDBB, 0x7819, 0xB35B, 0x781A, 0xD1E2, + 0x781B, 0xB35C, 0x781C, 0xEDBF, 0x781D, 0xEDC0, 0x781E, 0xB35D, 0x781F, 0xEDC4, 0x7820, 0xB35E, 0x7821, 0xB35F, 0x7822, 0xB360, + 0x7823, 0xEDC8, 0x7824, 0xB361, 0x7825, 0xEDC6, 0x7826, 0xEDCE, 0x7827, 0xD5E8, 0x7828, 0xB362, 0x7829, 0xEDC9, 0x782A, 0xB363, + 0x782B, 0xB364, 0x782C, 0xEDC7, 0x782D, 0xEDBE, 0x782E, 0xB365, 0x782F, 0xB366, 0x7830, 0xC5E9, 0x7831, 0xB367, 0x7832, 0xB368, + 0x7833, 0xB369, 0x7834, 0xC6C6, 0x7835, 0xB36A, 0x7836, 0xB36B, 0x7837, 0xC9E9, 0x7838, 0xD4D2, 0x7839, 0xEDC1, 0x783A, 0xEDC2, + 0x783B, 0xEDC3, 0x783C, 0xEDC5, 0x783D, 0xB36C, 0x783E, 0xC0F9, 0x783F, 0xB36D, 0x7840, 0xB4A1, 0x7841, 0xB36E, 0x7842, 0xB36F, + 0x7843, 0xB370, 0x7844, 0xB371, 0x7845, 0xB9E8, 0x7846, 0xB372, 0x7847, 0xEDD0, 0x7848, 0xB373, 0x7849, 0xB374, 0x784A, 0xB375, + 0x784B, 0xB376, 0x784C, 0xEDD1, 0x784D, 0xB377, 0x784E, 0xEDCA, 0x784F, 0xB378, 0x7850, 0xEDCF, 0x7851, 0xB379, 0x7852, 0xCEF8, + 0x7853, 0xB37A, 0x7854, 0xB37B, 0x7855, 0xCBB6, 0x7856, 0xEDCC, 0x7857, 0xEDCD, 0x7858, 0xB37C, 0x7859, 0xB37D, 0x785A, 0xB37E, + 0x785B, 0xB380, 0x785C, 0xB381, 0x785D, 0xCFF5, 0x785E, 0xB382, 0x785F, 0xB383, 0x7860, 0xB384, 0x7861, 0xB385, 0x7862, 0xB386, + 0x7863, 0xB387, 0x7864, 0xB388, 0x7865, 0xB389, 0x7866, 0xB38A, 0x7867, 0xB38B, 0x7868, 0xB38C, 0x7869, 0xB38D, 0x786A, 0xEDD2, + 0x786B, 0xC1F2, 0x786C, 0xD3B2, 0x786D, 0xEDCB, 0x786E, 0xC8B7, 0x786F, 0xB38E, 0x7870, 0xB38F, 0x7871, 0xB390, 0x7872, 0xB391, + 0x7873, 0xB392, 0x7874, 0xB393, 0x7875, 0xB394, 0x7876, 0xB395, 0x7877, 0xBCEF, 0x7878, 0xB396, 0x7879, 0xB397, 0x787A, 0xB398, + 0x787B, 0xB399, 0x787C, 0xC5F0, 0x787D, 0xB39A, 0x787E, 0xB39B, 0x787F, 0xB39C, 0x7880, 0xB39D, 0x7881, 0xB39E, 0x7882, 0xB39F, + 0x7883, 0xB3A0, 0x7884, 0xB440, 0x7885, 0xB441, 0x7886, 0xB442, 0x7887, 0xEDD6, 0x7888, 0xB443, 0x7889, 0xB5EF, 0x788A, 0xB444, + 0x788B, 0xB445, 0x788C, 0xC2B5, 0x788D, 0xB0AD, 0x788E, 0xCBE9, 0x788F, 0xB446, 0x7890, 0xB447, 0x7891, 0xB1AE, 0x7892, 0xB448, + 0x7893, 0xEDD4, 0x7894, 0xB449, 0x7895, 0xB44A, 0x7896, 0xB44B, 0x7897, 0xCDEB, 0x7898, 0xB5E2, 0x7899, 0xB44C, 0x789A, 0xEDD5, + 0x789B, 0xEDD3, 0x789C, 0xEDD7, 0x789D, 0xB44D, 0x789E, 0xB44E, 0x789F, 0xB5FA, 0x78A0, 0xB44F, 0x78A1, 0xEDD8, 0x78A2, 0xB450, + 0x78A3, 0xEDD9, 0x78A4, 0xB451, 0x78A5, 0xEDDC, 0x78A6, 0xB452, 0x78A7, 0xB1CC, 0x78A8, 0xB453, 0x78A9, 0xB454, 0x78AA, 0xB455, + 0x78AB, 0xB456, 0x78AC, 0xB457, 0x78AD, 0xB458, 0x78AE, 0xB459, 0x78AF, 0xB45A, 0x78B0, 0xC5F6, 0x78B1, 0xBCEE, 0x78B2, 0xEDDA, + 0x78B3, 0xCCBC, 0x78B4, 0xB2EA, 0x78B5, 0xB45B, 0x78B6, 0xB45C, 0x78B7, 0xB45D, 0x78B8, 0xB45E, 0x78B9, 0xEDDB, 0x78BA, 0xB45F, + 0x78BB, 0xB460, 0x78BC, 0xB461, 0x78BD, 0xB462, 0x78BE, 0xC4EB, 0x78BF, 0xB463, 0x78C0, 0xB464, 0x78C1, 0xB4C5, 0x78C2, 0xB465, + 0x78C3, 0xB466, 0x78C4, 0xB467, 0x78C5, 0xB0F5, 0x78C6, 0xB468, 0x78C7, 0xB469, 0x78C8, 0xB46A, 0x78C9, 0xEDDF, 0x78CA, 0xC0DA, + 0x78CB, 0xB4E8, 0x78CC, 0xB46B, 0x78CD, 0xB46C, 0x78CE, 0xB46D, 0x78CF, 0xB46E, 0x78D0, 0xC5CD, 0x78D1, 0xB46F, 0x78D2, 0xB470, + 0x78D3, 0xB471, 0x78D4, 0xEDDD, 0x78D5, 0xBFC4, 0x78D6, 0xB472, 0x78D7, 0xB473, 0x78D8, 0xB474, 0x78D9, 0xEDDE, 0x78DA, 0xB475, + 0x78DB, 0xB476, 0x78DC, 0xB477, 0x78DD, 0xB478, 0x78DE, 0xB479, 0x78DF, 0xB47A, 0x78E0, 0xB47B, 0x78E1, 0xB47C, 0x78E2, 0xB47D, + 0x78E3, 0xB47E, 0x78E4, 0xB480, 0x78E5, 0xB481, 0x78E6, 0xB482, 0x78E7, 0xB483, 0x78E8, 0xC4A5, 0x78E9, 0xB484, 0x78EA, 0xB485, + 0x78EB, 0xB486, 0x78EC, 0xEDE0, 0x78ED, 0xB487, 0x78EE, 0xB488, 0x78EF, 0xB489, 0x78F0, 0xB48A, 0x78F1, 0xB48B, 0x78F2, 0xEDE1, + 0x78F3, 0xB48C, 0x78F4, 0xEDE3, 0x78F5, 0xB48D, 0x78F6, 0xB48E, 0x78F7, 0xC1D7, 0x78F8, 0xB48F, 0x78F9, 0xB490, 0x78FA, 0xBBC7, + 0x78FB, 0xB491, 0x78FC, 0xB492, 0x78FD, 0xB493, 0x78FE, 0xB494, 0x78FF, 0xB495, 0x7900, 0xB496, 0x7901, 0xBDB8, 0x7902, 0xB497, + 0x7903, 0xB498, 0x7904, 0xB499, 0x7905, 0xEDE2, 0x7906, 0xB49A, 0x7907, 0xB49B, 0x7908, 0xB49C, 0x7909, 0xB49D, 0x790A, 0xB49E, + 0x790B, 0xB49F, 0x790C, 0xB4A0, 0x790D, 0xB540, 0x790E, 0xB541, 0x790F, 0xB542, 0x7910, 0xB543, 0x7911, 0xB544, 0x7912, 0xB545, + 0x7913, 0xEDE4, 0x7914, 0xB546, 0x7915, 0xB547, 0x7916, 0xB548, 0x7917, 0xB549, 0x7918, 0xB54A, 0x7919, 0xB54B, 0x791A, 0xB54C, + 0x791B, 0xB54D, 0x791C, 0xB54E, 0x791D, 0xB54F, 0x791E, 0xEDE6, 0x791F, 0xB550, 0x7920, 0xB551, 0x7921, 0xB552, 0x7922, 0xB553, + 0x7923, 0xB554, 0x7924, 0xEDE5, 0x7925, 0xB555, 0x7926, 0xB556, 0x7927, 0xB557, 0x7928, 0xB558, 0x7929, 0xB559, 0x792A, 0xB55A, + 0x792B, 0xB55B, 0x792C, 0xB55C, 0x792D, 0xB55D, 0x792E, 0xB55E, 0x792F, 0xB55F, 0x7930, 0xB560, 0x7931, 0xB561, 0x7932, 0xB562, + 0x7933, 0xB563, 0x7934, 0xEDE7, 0x7935, 0xB564, 0x7936, 0xB565, 0x7937, 0xB566, 0x7938, 0xB567, 0x7939, 0xB568, 0x793A, 0xCABE, + 0x793B, 0xECEA, 0x793C, 0xC0F1, 0x793D, 0xB569, 0x793E, 0xC9E7, 0x793F, 0xB56A, 0x7940, 0xECEB, 0x7941, 0xC6EE, 0x7942, 0xB56B, + 0x7943, 0xB56C, 0x7944, 0xB56D, 0x7945, 0xB56E, 0x7946, 0xECEC, 0x7947, 0xB56F, 0x7948, 0xC6ED, 0x7949, 0xECED, 0x794A, 0xB570, + 0x794B, 0xB571, 0x794C, 0xB572, 0x794D, 0xB573, 0x794E, 0xB574, 0x794F, 0xB575, 0x7950, 0xB576, 0x7951, 0xB577, 0x7952, 0xB578, + 0x7953, 0xECF0, 0x7954, 0xB579, 0x7955, 0xB57A, 0x7956, 0xD7E6, 0x7957, 0xECF3, 0x7958, 0xB57B, 0x7959, 0xB57C, 0x795A, 0xECF1, + 0x795B, 0xECEE, 0x795C, 0xECEF, 0x795D, 0xD7A3, 0x795E, 0xC9F1, 0x795F, 0xCBEE, 0x7960, 0xECF4, 0x7961, 0xB57D, 0x7962, 0xECF2, + 0x7963, 0xB57E, 0x7964, 0xB580, 0x7965, 0xCFE9, 0x7966, 0xB581, 0x7967, 0xECF6, 0x7968, 0xC6B1, 0x7969, 0xB582, 0x796A, 0xB583, + 0x796B, 0xB584, 0x796C, 0xB585, 0x796D, 0xBCC0, 0x796E, 0xB586, 0x796F, 0xECF5, 0x7970, 0xB587, 0x7971, 0xB588, 0x7972, 0xB589, + 0x7973, 0xB58A, 0x7974, 0xB58B, 0x7975, 0xB58C, 0x7976, 0xB58D, 0x7977, 0xB5BB, 0x7978, 0xBBF6, 0x7979, 0xB58E, 0x797A, 0xECF7, + 0x797B, 0xB58F, 0x797C, 0xB590, 0x797D, 0xB591, 0x797E, 0xB592, 0x797F, 0xB593, 0x7980, 0xD9F7, 0x7981, 0xBDFB, 0x7982, 0xB594, + 0x7983, 0xB595, 0x7984, 0xC2BB, 0x7985, 0xECF8, 0x7986, 0xB596, 0x7987, 0xB597, 0x7988, 0xB598, 0x7989, 0xB599, 0x798A, 0xECF9, + 0x798B, 0xB59A, 0x798C, 0xB59B, 0x798D, 0xB59C, 0x798E, 0xB59D, 0x798F, 0xB8A3, 0x7990, 0xB59E, 0x7991, 0xB59F, 0x7992, 0xB5A0, + 0x7993, 0xB640, 0x7994, 0xB641, 0x7995, 0xB642, 0x7996, 0xB643, 0x7997, 0xB644, 0x7998, 0xB645, 0x7999, 0xB646, 0x799A, 0xECFA, + 0x799B, 0xB647, 0x799C, 0xB648, 0x799D, 0xB649, 0x799E, 0xB64A, 0x799F, 0xB64B, 0x79A0, 0xB64C, 0x79A1, 0xB64D, 0x79A2, 0xB64E, + 0x79A3, 0xB64F, 0x79A4, 0xB650, 0x79A5, 0xB651, 0x79A6, 0xB652, 0x79A7, 0xECFB, 0x79A8, 0xB653, 0x79A9, 0xB654, 0x79AA, 0xB655, + 0x79AB, 0xB656, 0x79AC, 0xB657, 0x79AD, 0xB658, 0x79AE, 0xB659, 0x79AF, 0xB65A, 0x79B0, 0xB65B, 0x79B1, 0xB65C, 0x79B2, 0xB65D, + 0x79B3, 0xECFC, 0x79B4, 0xB65E, 0x79B5, 0xB65F, 0x79B6, 0xB660, 0x79B7, 0xB661, 0x79B8, 0xB662, 0x79B9, 0xD3ED, 0x79BA, 0xD8AE, + 0x79BB, 0xC0EB, 0x79BC, 0xB663, 0x79BD, 0xC7DD, 0x79BE, 0xBACC, 0x79BF, 0xB664, 0x79C0, 0xD0E3, 0x79C1, 0xCBBD, 0x79C2, 0xB665, + 0x79C3, 0xCDBA, 0x79C4, 0xB666, 0x79C5, 0xB667, 0x79C6, 0xB8D1, 0x79C7, 0xB668, 0x79C8, 0xB669, 0x79C9, 0xB1FC, 0x79CA, 0xB66A, + 0x79CB, 0xC7EF, 0x79CC, 0xB66B, 0x79CD, 0xD6D6, 0x79CE, 0xB66C, 0x79CF, 0xB66D, 0x79D0, 0xB66E, 0x79D1, 0xBFC6, 0x79D2, 0xC3EB, + 0x79D3, 0xB66F, 0x79D4, 0xB670, 0x79D5, 0xEFF5, 0x79D6, 0xB671, 0x79D7, 0xB672, 0x79D8, 0xC3D8, 0x79D9, 0xB673, 0x79DA, 0xB674, + 0x79DB, 0xB675, 0x79DC, 0xB676, 0x79DD, 0xB677, 0x79DE, 0xB678, 0x79DF, 0xD7E2, 0x79E0, 0xB679, 0x79E1, 0xB67A, 0x79E2, 0xB67B, + 0x79E3, 0xEFF7, 0x79E4, 0xB3D3, 0x79E5, 0xB67C, 0x79E6, 0xC7D8, 0x79E7, 0xD1ED, 0x79E8, 0xB67D, 0x79E9, 0xD6C8, 0x79EA, 0xB67E, + 0x79EB, 0xEFF8, 0x79EC, 0xB680, 0x79ED, 0xEFF6, 0x79EE, 0xB681, 0x79EF, 0xBBFD, 0x79F0, 0xB3C6, 0x79F1, 0xB682, 0x79F2, 0xB683, + 0x79F3, 0xB684, 0x79F4, 0xB685, 0x79F5, 0xB686, 0x79F6, 0xB687, 0x79F7, 0xB688, 0x79F8, 0xBDD5, 0x79F9, 0xB689, 0x79FA, 0xB68A, + 0x79FB, 0xD2C6, 0x79FC, 0xB68B, 0x79FD, 0xBBE0, 0x79FE, 0xB68C, 0x79FF, 0xB68D, 0x7A00, 0xCFA1, 0x7A01, 0xB68E, 0x7A02, 0xEFFC, + 0x7A03, 0xEFFB, 0x7A04, 0xB68F, 0x7A05, 0xB690, 0x7A06, 0xEFF9, 0x7A07, 0xB691, 0x7A08, 0xB692, 0x7A09, 0xB693, 0x7A0A, 0xB694, + 0x7A0B, 0xB3CC, 0x7A0C, 0xB695, 0x7A0D, 0xC9D4, 0x7A0E, 0xCBB0, 0x7A0F, 0xB696, 0x7A10, 0xB697, 0x7A11, 0xB698, 0x7A12, 0xB699, + 0x7A13, 0xB69A, 0x7A14, 0xEFFE, 0x7A15, 0xB69B, 0x7A16, 0xB69C, 0x7A17, 0xB0DE, 0x7A18, 0xB69D, 0x7A19, 0xB69E, 0x7A1A, 0xD6C9, + 0x7A1B, 0xB69F, 0x7A1C, 0xB6A0, 0x7A1D, 0xB740, 0x7A1E, 0xEFFD, 0x7A1F, 0xB741, 0x7A20, 0xB3ED, 0x7A21, 0xB742, 0x7A22, 0xB743, + 0x7A23, 0xF6D5, 0x7A24, 0xB744, 0x7A25, 0xB745, 0x7A26, 0xB746, 0x7A27, 0xB747, 0x7A28, 0xB748, 0x7A29, 0xB749, 0x7A2A, 0xB74A, + 0x7A2B, 0xB74B, 0x7A2C, 0xB74C, 0x7A2D, 0xB74D, 0x7A2E, 0xB74E, 0x7A2F, 0xB74F, 0x7A30, 0xB750, 0x7A31, 0xB751, 0x7A32, 0xB752, + 0x7A33, 0xCEC8, 0x7A34, 0xB753, 0x7A35, 0xB754, 0x7A36, 0xB755, 0x7A37, 0xF0A2, 0x7A38, 0xB756, 0x7A39, 0xF0A1, 0x7A3A, 0xB757, + 0x7A3B, 0xB5BE, 0x7A3C, 0xBCDA, 0x7A3D, 0xBBFC, 0x7A3E, 0xB758, 0x7A3F, 0xB8E5, 0x7A40, 0xB759, 0x7A41, 0xB75A, 0x7A42, 0xB75B, + 0x7A43, 0xB75C, 0x7A44, 0xB75D, 0x7A45, 0xB75E, 0x7A46, 0xC4C2, 0x7A47, 0xB75F, 0x7A48, 0xB760, 0x7A49, 0xB761, 0x7A4A, 0xB762, + 0x7A4B, 0xB763, 0x7A4C, 0xB764, 0x7A4D, 0xB765, 0x7A4E, 0xB766, 0x7A4F, 0xB767, 0x7A50, 0xB768, 0x7A51, 0xF0A3, 0x7A52, 0xB769, + 0x7A53, 0xB76A, 0x7A54, 0xB76B, 0x7A55, 0xB76C, 0x7A56, 0xB76D, 0x7A57, 0xCBEB, 0x7A58, 0xB76E, 0x7A59, 0xB76F, 0x7A5A, 0xB770, + 0x7A5B, 0xB771, 0x7A5C, 0xB772, 0x7A5D, 0xB773, 0x7A5E, 0xB774, 0x7A5F, 0xB775, 0x7A60, 0xB776, 0x7A61, 0xB777, 0x7A62, 0xB778, + 0x7A63, 0xB779, 0x7A64, 0xB77A, 0x7A65, 0xB77B, 0x7A66, 0xB77C, 0x7A67, 0xB77D, 0x7A68, 0xB77E, 0x7A69, 0xB780, 0x7A6A, 0xB781, + 0x7A6B, 0xB782, 0x7A6C, 0xB783, 0x7A6D, 0xB784, 0x7A6E, 0xB785, 0x7A6F, 0xB786, 0x7A70, 0xF0A6, 0x7A71, 0xB787, 0x7A72, 0xB788, + 0x7A73, 0xB789, 0x7A74, 0xD1A8, 0x7A75, 0xB78A, 0x7A76, 0xBEBF, 0x7A77, 0xC7EE, 0x7A78, 0xF1B6, 0x7A79, 0xF1B7, 0x7A7A, 0xBFD5, + 0x7A7B, 0xB78B, 0x7A7C, 0xB78C, 0x7A7D, 0xB78D, 0x7A7E, 0xB78E, 0x7A7F, 0xB4A9, 0x7A80, 0xF1B8, 0x7A81, 0xCDBB, 0x7A82, 0xB78F, + 0x7A83, 0xC7D4, 0x7A84, 0xD5AD, 0x7A85, 0xB790, 0x7A86, 0xF1B9, 0x7A87, 0xB791, 0x7A88, 0xF1BA, 0x7A89, 0xB792, 0x7A8A, 0xB793, + 0x7A8B, 0xB794, 0x7A8C, 0xB795, 0x7A8D, 0xC7CF, 0x7A8E, 0xB796, 0x7A8F, 0xB797, 0x7A90, 0xB798, 0x7A91, 0xD2A4, 0x7A92, 0xD6CF, + 0x7A93, 0xB799, 0x7A94, 0xB79A, 0x7A95, 0xF1BB, 0x7A96, 0xBDD1, 0x7A97, 0xB4B0, 0x7A98, 0xBEBD, 0x7A99, 0xB79B, 0x7A9A, 0xB79C, + 0x7A9B, 0xB79D, 0x7A9C, 0xB4DC, 0x7A9D, 0xCED1, 0x7A9E, 0xB79E, 0x7A9F, 0xBFDF, 0x7AA0, 0xF1BD, 0x7AA1, 0xB79F, 0x7AA2, 0xB7A0, + 0x7AA3, 0xB840, 0x7AA4, 0xB841, 0x7AA5, 0xBFFA, 0x7AA6, 0xF1BC, 0x7AA7, 0xB842, 0x7AA8, 0xF1BF, 0x7AA9, 0xB843, 0x7AAA, 0xB844, + 0x7AAB, 0xB845, 0x7AAC, 0xF1BE, 0x7AAD, 0xF1C0, 0x7AAE, 0xB846, 0x7AAF, 0xB847, 0x7AB0, 0xB848, 0x7AB1, 0xB849, 0x7AB2, 0xB84A, + 0x7AB3, 0xF1C1, 0x7AB4, 0xB84B, 0x7AB5, 0xB84C, 0x7AB6, 0xB84D, 0x7AB7, 0xB84E, 0x7AB8, 0xB84F, 0x7AB9, 0xB850, 0x7ABA, 0xB851, + 0x7ABB, 0xB852, 0x7ABC, 0xB853, 0x7ABD, 0xB854, 0x7ABE, 0xB855, 0x7ABF, 0xC1FE, 0x7AC0, 0xB856, 0x7AC1, 0xB857, 0x7AC2, 0xB858, + 0x7AC3, 0xB859, 0x7AC4, 0xB85A, 0x7AC5, 0xB85B, 0x7AC6, 0xB85C, 0x7AC7, 0xB85D, 0x7AC8, 0xB85E, 0x7AC9, 0xB85F, 0x7ACA, 0xB860, + 0x7ACB, 0xC1A2, 0x7ACC, 0xB861, 0x7ACD, 0xB862, 0x7ACE, 0xB863, 0x7ACF, 0xB864, 0x7AD0, 0xB865, 0x7AD1, 0xB866, 0x7AD2, 0xB867, + 0x7AD3, 0xB868, 0x7AD4, 0xB869, 0x7AD5, 0xB86A, 0x7AD6, 0xCAFA, 0x7AD7, 0xB86B, 0x7AD8, 0xB86C, 0x7AD9, 0xD5BE, 0x7ADA, 0xB86D, + 0x7ADB, 0xB86E, 0x7ADC, 0xB86F, 0x7ADD, 0xB870, 0x7ADE, 0xBEBA, 0x7ADF, 0xBEB9, 0x7AE0, 0xD5C2, 0x7AE1, 0xB871, 0x7AE2, 0xB872, + 0x7AE3, 0xBFA2, 0x7AE4, 0xB873, 0x7AE5, 0xCDAF, 0x7AE6, 0xF1B5, 0x7AE7, 0xB874, 0x7AE8, 0xB875, 0x7AE9, 0xB876, 0x7AEA, 0xB877, + 0x7AEB, 0xB878, 0x7AEC, 0xB879, 0x7AED, 0xBDDF, 0x7AEE, 0xB87A, 0x7AEF, 0xB6CB, 0x7AF0, 0xB87B, 0x7AF1, 0xB87C, 0x7AF2, 0xB87D, + 0x7AF3, 0xB87E, 0x7AF4, 0xB880, 0x7AF5, 0xB881, 0x7AF6, 0xB882, 0x7AF7, 0xB883, 0x7AF8, 0xB884, 0x7AF9, 0xD6F1, 0x7AFA, 0xF3C3, + 0x7AFB, 0xB885, 0x7AFC, 0xB886, 0x7AFD, 0xF3C4, 0x7AFE, 0xB887, 0x7AFF, 0xB8CD, 0x7B00, 0xB888, 0x7B01, 0xB889, 0x7B02, 0xB88A, + 0x7B03, 0xF3C6, 0x7B04, 0xF3C7, 0x7B05, 0xB88B, 0x7B06, 0xB0CA, 0x7B07, 0xB88C, 0x7B08, 0xF3C5, 0x7B09, 0xB88D, 0x7B0A, 0xF3C9, + 0x7B0B, 0xCBF1, 0x7B0C, 0xB88E, 0x7B0D, 0xB88F, 0x7B0E, 0xB890, 0x7B0F, 0xF3CB, 0x7B10, 0xB891, 0x7B11, 0xD0A6, 0x7B12, 0xB892, + 0x7B13, 0xB893, 0x7B14, 0xB1CA, 0x7B15, 0xF3C8, 0x7B16, 0xB894, 0x7B17, 0xB895, 0x7B18, 0xB896, 0x7B19, 0xF3CF, 0x7B1A, 0xB897, + 0x7B1B, 0xB5D1, 0x7B1C, 0xB898, 0x7B1D, 0xB899, 0x7B1E, 0xF3D7, 0x7B1F, 0xB89A, 0x7B20, 0xF3D2, 0x7B21, 0xB89B, 0x7B22, 0xB89C, + 0x7B23, 0xB89D, 0x7B24, 0xF3D4, 0x7B25, 0xF3D3, 0x7B26, 0xB7FB, 0x7B27, 0xB89E, 0x7B28, 0xB1BF, 0x7B29, 0xB89F, 0x7B2A, 0xF3CE, + 0x7B2B, 0xF3CA, 0x7B2C, 0xB5DA, 0x7B2D, 0xB8A0, 0x7B2E, 0xF3D0, 0x7B2F, 0xB940, 0x7B30, 0xB941, 0x7B31, 0xF3D1, 0x7B32, 0xB942, + 0x7B33, 0xF3D5, 0x7B34, 0xB943, 0x7B35, 0xB944, 0x7B36, 0xB945, 0x7B37, 0xB946, 0x7B38, 0xF3CD, 0x7B39, 0xB947, 0x7B3A, 0xBCE3, + 0x7B3B, 0xB948, 0x7B3C, 0xC1FD, 0x7B3D, 0xB949, 0x7B3E, 0xF3D6, 0x7B3F, 0xB94A, 0x7B40, 0xB94B, 0x7B41, 0xB94C, 0x7B42, 0xB94D, + 0x7B43, 0xB94E, 0x7B44, 0xB94F, 0x7B45, 0xF3DA, 0x7B46, 0xB950, 0x7B47, 0xF3CC, 0x7B48, 0xB951, 0x7B49, 0xB5C8, 0x7B4A, 0xB952, + 0x7B4B, 0xBDEE, 0x7B4C, 0xF3DC, 0x7B4D, 0xB953, 0x7B4E, 0xB954, 0x7B4F, 0xB7A4, 0x7B50, 0xBFF0, 0x7B51, 0xD6FE, 0x7B52, 0xCDB2, + 0x7B53, 0xB955, 0x7B54, 0xB4F0, 0x7B55, 0xB956, 0x7B56, 0xB2DF, 0x7B57, 0xB957, 0x7B58, 0xF3D8, 0x7B59, 0xB958, 0x7B5A, 0xF3D9, + 0x7B5B, 0xC9B8, 0x7B5C, 0xB959, 0x7B5D, 0xF3DD, 0x7B5E, 0xB95A, 0x7B5F, 0xB95B, 0x7B60, 0xF3DE, 0x7B61, 0xB95C, 0x7B62, 0xF3E1, + 0x7B63, 0xB95D, 0x7B64, 0xB95E, 0x7B65, 0xB95F, 0x7B66, 0xB960, 0x7B67, 0xB961, 0x7B68, 0xB962, 0x7B69, 0xB963, 0x7B6A, 0xB964, + 0x7B6B, 0xB965, 0x7B6C, 0xB966, 0x7B6D, 0xB967, 0x7B6E, 0xF3DF, 0x7B6F, 0xB968, 0x7B70, 0xB969, 0x7B71, 0xF3E3, 0x7B72, 0xF3E2, + 0x7B73, 0xB96A, 0x7B74, 0xB96B, 0x7B75, 0xF3DB, 0x7B76, 0xB96C, 0x7B77, 0xBFEA, 0x7B78, 0xB96D, 0x7B79, 0xB3EF, 0x7B7A, 0xB96E, + 0x7B7B, 0xF3E0, 0x7B7C, 0xB96F, 0x7B7D, 0xB970, 0x7B7E, 0xC7A9, 0x7B7F, 0xB971, 0x7B80, 0xBCF2, 0x7B81, 0xB972, 0x7B82, 0xB973, + 0x7B83, 0xB974, 0x7B84, 0xB975, 0x7B85, 0xF3EB, 0x7B86, 0xB976, 0x7B87, 0xB977, 0x7B88, 0xB978, 0x7B89, 0xB979, 0x7B8A, 0xB97A, + 0x7B8B, 0xB97B, 0x7B8C, 0xB97C, 0x7B8D, 0xB9BF, 0x7B8E, 0xB97D, 0x7B8F, 0xB97E, 0x7B90, 0xF3E4, 0x7B91, 0xB980, 0x7B92, 0xB981, + 0x7B93, 0xB982, 0x7B94, 0xB2AD, 0x7B95, 0xBBFE, 0x7B96, 0xB983, 0x7B97, 0xCBE3, 0x7B98, 0xB984, 0x7B99, 0xB985, 0x7B9A, 0xB986, + 0x7B9B, 0xB987, 0x7B9C, 0xF3ED, 0x7B9D, 0xF3E9, 0x7B9E, 0xB988, 0x7B9F, 0xB989, 0x7BA0, 0xB98A, 0x7BA1, 0xB9DC, 0x7BA2, 0xF3EE, + 0x7BA3, 0xB98B, 0x7BA4, 0xB98C, 0x7BA5, 0xB98D, 0x7BA6, 0xF3E5, 0x7BA7, 0xF3E6, 0x7BA8, 0xF3EA, 0x7BA9, 0xC2E1, 0x7BAA, 0xF3EC, + 0x7BAB, 0xF3EF, 0x7BAC, 0xF3E8, 0x7BAD, 0xBCFD, 0x7BAE, 0xB98E, 0x7BAF, 0xB98F, 0x7BB0, 0xB990, 0x7BB1, 0xCFE4, 0x7BB2, 0xB991, + 0x7BB3, 0xB992, 0x7BB4, 0xF3F0, 0x7BB5, 0xB993, 0x7BB6, 0xB994, 0x7BB7, 0xB995, 0x7BB8, 0xF3E7, 0x7BB9, 0xB996, 0x7BBA, 0xB997, + 0x7BBB, 0xB998, 0x7BBC, 0xB999, 0x7BBD, 0xB99A, 0x7BBE, 0xB99B, 0x7BBF, 0xB99C, 0x7BC0, 0xB99D, 0x7BC1, 0xF3F2, 0x7BC2, 0xB99E, + 0x7BC3, 0xB99F, 0x7BC4, 0xB9A0, 0x7BC5, 0xBA40, 0x7BC6, 0xD7AD, 0x7BC7, 0xC6AA, 0x7BC8, 0xBA41, 0x7BC9, 0xBA42, 0x7BCA, 0xBA43, + 0x7BCB, 0xBA44, 0x7BCC, 0xF3F3, 0x7BCD, 0xBA45, 0x7BCE, 0xBA46, 0x7BCF, 0xBA47, 0x7BD0, 0xBA48, 0x7BD1, 0xF3F1, 0x7BD2, 0xBA49, + 0x7BD3, 0xC2A8, 0x7BD4, 0xBA4A, 0x7BD5, 0xBA4B, 0x7BD6, 0xBA4C, 0x7BD7, 0xBA4D, 0x7BD8, 0xBA4E, 0x7BD9, 0xB8DD, 0x7BDA, 0xF3F5, + 0x7BDB, 0xBA4F, 0x7BDC, 0xBA50, 0x7BDD, 0xF3F4, 0x7BDE, 0xBA51, 0x7BDF, 0xBA52, 0x7BE0, 0xBA53, 0x7BE1, 0xB4DB, 0x7BE2, 0xBA54, + 0x7BE3, 0xBA55, 0x7BE4, 0xBA56, 0x7BE5, 0xF3F6, 0x7BE6, 0xF3F7, 0x7BE7, 0xBA57, 0x7BE8, 0xBA58, 0x7BE9, 0xBA59, 0x7BEA, 0xF3F8, + 0x7BEB, 0xBA5A, 0x7BEC, 0xBA5B, 0x7BED, 0xBA5C, 0x7BEE, 0xC0BA, 0x7BEF, 0xBA5D, 0x7BF0, 0xBA5E, 0x7BF1, 0xC0E9, 0x7BF2, 0xBA5F, + 0x7BF3, 0xBA60, 0x7BF4, 0xBA61, 0x7BF5, 0xBA62, 0x7BF6, 0xBA63, 0x7BF7, 0xC5F1, 0x7BF8, 0xBA64, 0x7BF9, 0xBA65, 0x7BFA, 0xBA66, + 0x7BFB, 0xBA67, 0x7BFC, 0xF3FB, 0x7BFD, 0xBA68, 0x7BFE, 0xF3FA, 0x7BFF, 0xBA69, 0x7C00, 0xBA6A, 0x7C01, 0xBA6B, 0x7C02, 0xBA6C, + 0x7C03, 0xBA6D, 0x7C04, 0xBA6E, 0x7C05, 0xBA6F, 0x7C06, 0xBA70, 0x7C07, 0xB4D8, 0x7C08, 0xBA71, 0x7C09, 0xBA72, 0x7C0A, 0xBA73, + 0x7C0B, 0xF3FE, 0x7C0C, 0xF3F9, 0x7C0D, 0xBA74, 0x7C0E, 0xBA75, 0x7C0F, 0xF3FC, 0x7C10, 0xBA76, 0x7C11, 0xBA77, 0x7C12, 0xBA78, + 0x7C13, 0xBA79, 0x7C14, 0xBA7A, 0x7C15, 0xBA7B, 0x7C16, 0xF3FD, 0x7C17, 0xBA7C, 0x7C18, 0xBA7D, 0x7C19, 0xBA7E, 0x7C1A, 0xBA80, + 0x7C1B, 0xBA81, 0x7C1C, 0xBA82, 0x7C1D, 0xBA83, 0x7C1E, 0xBA84, 0x7C1F, 0xF4A1, 0x7C20, 0xBA85, 0x7C21, 0xBA86, 0x7C22, 0xBA87, + 0x7C23, 0xBA88, 0x7C24, 0xBA89, 0x7C25, 0xBA8A, 0x7C26, 0xF4A3, 0x7C27, 0xBBC9, 0x7C28, 0xBA8B, 0x7C29, 0xBA8C, 0x7C2A, 0xF4A2, + 0x7C2B, 0xBA8D, 0x7C2C, 0xBA8E, 0x7C2D, 0xBA8F, 0x7C2E, 0xBA90, 0x7C2F, 0xBA91, 0x7C30, 0xBA92, 0x7C31, 0xBA93, 0x7C32, 0xBA94, + 0x7C33, 0xBA95, 0x7C34, 0xBA96, 0x7C35, 0xBA97, 0x7C36, 0xBA98, 0x7C37, 0xBA99, 0x7C38, 0xF4A4, 0x7C39, 0xBA9A, 0x7C3A, 0xBA9B, + 0x7C3B, 0xBA9C, 0x7C3C, 0xBA9D, 0x7C3D, 0xBA9E, 0x7C3E, 0xBA9F, 0x7C3F, 0xB2BE, 0x7C40, 0xF4A6, 0x7C41, 0xF4A5, 0x7C42, 0xBAA0, + 0x7C43, 0xBB40, 0x7C44, 0xBB41, 0x7C45, 0xBB42, 0x7C46, 0xBB43, 0x7C47, 0xBB44, 0x7C48, 0xBB45, 0x7C49, 0xBB46, 0x7C4A, 0xBB47, + 0x7C4B, 0xBB48, 0x7C4C, 0xBB49, 0x7C4D, 0xBCAE, 0x7C4E, 0xBB4A, 0x7C4F, 0xBB4B, 0x7C50, 0xBB4C, 0x7C51, 0xBB4D, 0x7C52, 0xBB4E, + 0x7C53, 0xBB4F, 0x7C54, 0xBB50, 0x7C55, 0xBB51, 0x7C56, 0xBB52, 0x7C57, 0xBB53, 0x7C58, 0xBB54, 0x7C59, 0xBB55, 0x7C5A, 0xBB56, + 0x7C5B, 0xBB57, 0x7C5C, 0xBB58, 0x7C5D, 0xBB59, 0x7C5E, 0xBB5A, 0x7C5F, 0xBB5B, 0x7C60, 0xBB5C, 0x7C61, 0xBB5D, 0x7C62, 0xBB5E, + 0x7C63, 0xBB5F, 0x7C64, 0xBB60, 0x7C65, 0xBB61, 0x7C66, 0xBB62, 0x7C67, 0xBB63, 0x7C68, 0xBB64, 0x7C69, 0xBB65, 0x7C6A, 0xBB66, + 0x7C6B, 0xBB67, 0x7C6C, 0xBB68, 0x7C6D, 0xBB69, 0x7C6E, 0xBB6A, 0x7C6F, 0xBB6B, 0x7C70, 0xBB6C, 0x7C71, 0xBB6D, 0x7C72, 0xBB6E, + 0x7C73, 0xC3D7, 0x7C74, 0xD9E1, 0x7C75, 0xBB6F, 0x7C76, 0xBB70, 0x7C77, 0xBB71, 0x7C78, 0xBB72, 0x7C79, 0xBB73, 0x7C7A, 0xBB74, + 0x7C7B, 0xC0E0, 0x7C7C, 0xF4CC, 0x7C7D, 0xD7D1, 0x7C7E, 0xBB75, 0x7C7F, 0xBB76, 0x7C80, 0xBB77, 0x7C81, 0xBB78, 0x7C82, 0xBB79, + 0x7C83, 0xBB7A, 0x7C84, 0xBB7B, 0x7C85, 0xBB7C, 0x7C86, 0xBB7D, 0x7C87, 0xBB7E, 0x7C88, 0xBB80, 0x7C89, 0xB7DB, 0x7C8A, 0xBB81, + 0x7C8B, 0xBB82, 0x7C8C, 0xBB83, 0x7C8D, 0xBB84, 0x7C8E, 0xBB85, 0x7C8F, 0xBB86, 0x7C90, 0xBB87, 0x7C91, 0xF4CE, 0x7C92, 0xC1A3, + 0x7C93, 0xBB88, 0x7C94, 0xBB89, 0x7C95, 0xC6C9, 0x7C96, 0xBB8A, 0x7C97, 0xB4D6, 0x7C98, 0xD5B3, 0x7C99, 0xBB8B, 0x7C9A, 0xBB8C, + 0x7C9B, 0xBB8D, 0x7C9C, 0xF4D0, 0x7C9D, 0xF4CF, 0x7C9E, 0xF4D1, 0x7C9F, 0xCBDA, 0x7CA0, 0xBB8E, 0x7CA1, 0xBB8F, 0x7CA2, 0xF4D2, + 0x7CA3, 0xBB90, 0x7CA4, 0xD4C1, 0x7CA5, 0xD6E0, 0x7CA6, 0xBB91, 0x7CA7, 0xBB92, 0x7CA8, 0xBB93, 0x7CA9, 0xBB94, 0x7CAA, 0xB7E0, + 0x7CAB, 0xBB95, 0x7CAC, 0xBB96, 0x7CAD, 0xBB97, 0x7CAE, 0xC1B8, 0x7CAF, 0xBB98, 0x7CB0, 0xBB99, 0x7CB1, 0xC1BB, 0x7CB2, 0xF4D3, + 0x7CB3, 0xBEAC, 0x7CB4, 0xBB9A, 0x7CB5, 0xBB9B, 0x7CB6, 0xBB9C, 0x7CB7, 0xBB9D, 0x7CB8, 0xBB9E, 0x7CB9, 0xB4E2, 0x7CBA, 0xBB9F, + 0x7CBB, 0xBBA0, 0x7CBC, 0xF4D4, 0x7CBD, 0xF4D5, 0x7CBE, 0xBEAB, 0x7CBF, 0xBC40, 0x7CC0, 0xBC41, 0x7CC1, 0xF4D6, 0x7CC2, 0xBC42, + 0x7CC3, 0xBC43, 0x7CC4, 0xBC44, 0x7CC5, 0xF4DB, 0x7CC6, 0xBC45, 0x7CC7, 0xF4D7, 0x7CC8, 0xF4DA, 0x7CC9, 0xBC46, 0x7CCA, 0xBAFD, + 0x7CCB, 0xBC47, 0x7CCC, 0xF4D8, 0x7CCD, 0xF4D9, 0x7CCE, 0xBC48, 0x7CCF, 0xBC49, 0x7CD0, 0xBC4A, 0x7CD1, 0xBC4B, 0x7CD2, 0xBC4C, + 0x7CD3, 0xBC4D, 0x7CD4, 0xBC4E, 0x7CD5, 0xB8E2, 0x7CD6, 0xCCC7, 0x7CD7, 0xF4DC, 0x7CD8, 0xBC4F, 0x7CD9, 0xB2DA, 0x7CDA, 0xBC50, + 0x7CDB, 0xBC51, 0x7CDC, 0xC3D3, 0x7CDD, 0xBC52, 0x7CDE, 0xBC53, 0x7CDF, 0xD4E3, 0x7CE0, 0xBFB7, 0x7CE1, 0xBC54, 0x7CE2, 0xBC55, + 0x7CE3, 0xBC56, 0x7CE4, 0xBC57, 0x7CE5, 0xBC58, 0x7CE6, 0xBC59, 0x7CE7, 0xBC5A, 0x7CE8, 0xF4DD, 0x7CE9, 0xBC5B, 0x7CEA, 0xBC5C, + 0x7CEB, 0xBC5D, 0x7CEC, 0xBC5E, 0x7CED, 0xBC5F, 0x7CEE, 0xBC60, 0x7CEF, 0xC5B4, 0x7CF0, 0xBC61, 0x7CF1, 0xBC62, 0x7CF2, 0xBC63, + 0x7CF3, 0xBC64, 0x7CF4, 0xBC65, 0x7CF5, 0xBC66, 0x7CF6, 0xBC67, 0x7CF7, 0xBC68, 0x7CF8, 0xF4E9, 0x7CF9, 0xBC69, 0x7CFA, 0xBC6A, + 0x7CFB, 0xCFB5, 0x7CFC, 0xBC6B, 0x7CFD, 0xBC6C, 0x7CFE, 0xBC6D, 0x7CFF, 0xBC6E, 0x7D00, 0xBC6F, 0x7D01, 0xBC70, 0x7D02, 0xBC71, + 0x7D03, 0xBC72, 0x7D04, 0xBC73, 0x7D05, 0xBC74, 0x7D06, 0xBC75, 0x7D07, 0xBC76, 0x7D08, 0xBC77, 0x7D09, 0xBC78, 0x7D0A, 0xCEC9, + 0x7D0B, 0xBC79, 0x7D0C, 0xBC7A, 0x7D0D, 0xBC7B, 0x7D0E, 0xBC7C, 0x7D0F, 0xBC7D, 0x7D10, 0xBC7E, 0x7D11, 0xBC80, 0x7D12, 0xBC81, + 0x7D13, 0xBC82, 0x7D14, 0xBC83, 0x7D15, 0xBC84, 0x7D16, 0xBC85, 0x7D17, 0xBC86, 0x7D18, 0xBC87, 0x7D19, 0xBC88, 0x7D1A, 0xBC89, + 0x7D1B, 0xBC8A, 0x7D1C, 0xBC8B, 0x7D1D, 0xBC8C, 0x7D1E, 0xBC8D, 0x7D1F, 0xBC8E, 0x7D20, 0xCBD8, 0x7D21, 0xBC8F, 0x7D22, 0xCBF7, + 0x7D23, 0xBC90, 0x7D24, 0xBC91, 0x7D25, 0xBC92, 0x7D26, 0xBC93, 0x7D27, 0xBDF4, 0x7D28, 0xBC94, 0x7D29, 0xBC95, 0x7D2A, 0xBC96, + 0x7D2B, 0xD7CF, 0x7D2C, 0xBC97, 0x7D2D, 0xBC98, 0x7D2E, 0xBC99, 0x7D2F, 0xC0DB, 0x7D30, 0xBC9A, 0x7D31, 0xBC9B, 0x7D32, 0xBC9C, + 0x7D33, 0xBC9D, 0x7D34, 0xBC9E, 0x7D35, 0xBC9F, 0x7D36, 0xBCA0, 0x7D37, 0xBD40, 0x7D38, 0xBD41, 0x7D39, 0xBD42, 0x7D3A, 0xBD43, + 0x7D3B, 0xBD44, 0x7D3C, 0xBD45, 0x7D3D, 0xBD46, 0x7D3E, 0xBD47, 0x7D3F, 0xBD48, 0x7D40, 0xBD49, 0x7D41, 0xBD4A, 0x7D42, 0xBD4B, + 0x7D43, 0xBD4C, 0x7D44, 0xBD4D, 0x7D45, 0xBD4E, 0x7D46, 0xBD4F, 0x7D47, 0xBD50, 0x7D48, 0xBD51, 0x7D49, 0xBD52, 0x7D4A, 0xBD53, + 0x7D4B, 0xBD54, 0x7D4C, 0xBD55, 0x7D4D, 0xBD56, 0x7D4E, 0xBD57, 0x7D4F, 0xBD58, 0x7D50, 0xBD59, 0x7D51, 0xBD5A, 0x7D52, 0xBD5B, + 0x7D53, 0xBD5C, 0x7D54, 0xBD5D, 0x7D55, 0xBD5E, 0x7D56, 0xBD5F, 0x7D57, 0xBD60, 0x7D58, 0xBD61, 0x7D59, 0xBD62, 0x7D5A, 0xBD63, + 0x7D5B, 0xBD64, 0x7D5C, 0xBD65, 0x7D5D, 0xBD66, 0x7D5E, 0xBD67, 0x7D5F, 0xBD68, 0x7D60, 0xBD69, 0x7D61, 0xBD6A, 0x7D62, 0xBD6B, + 0x7D63, 0xBD6C, 0x7D64, 0xBD6D, 0x7D65, 0xBD6E, 0x7D66, 0xBD6F, 0x7D67, 0xBD70, 0x7D68, 0xBD71, 0x7D69, 0xBD72, 0x7D6A, 0xBD73, + 0x7D6B, 0xBD74, 0x7D6C, 0xBD75, 0x7D6D, 0xBD76, 0x7D6E, 0xD0F5, 0x7D6F, 0xBD77, 0x7D70, 0xBD78, 0x7D71, 0xBD79, 0x7D72, 0xBD7A, + 0x7D73, 0xBD7B, 0x7D74, 0xBD7C, 0x7D75, 0xBD7D, 0x7D76, 0xBD7E, 0x7D77, 0xF4EA, 0x7D78, 0xBD80, 0x7D79, 0xBD81, 0x7D7A, 0xBD82, + 0x7D7B, 0xBD83, 0x7D7C, 0xBD84, 0x7D7D, 0xBD85, 0x7D7E, 0xBD86, 0x7D7F, 0xBD87, 0x7D80, 0xBD88, 0x7D81, 0xBD89, 0x7D82, 0xBD8A, + 0x7D83, 0xBD8B, 0x7D84, 0xBD8C, 0x7D85, 0xBD8D, 0x7D86, 0xBD8E, 0x7D87, 0xBD8F, 0x7D88, 0xBD90, 0x7D89, 0xBD91, 0x7D8A, 0xBD92, + 0x7D8B, 0xBD93, 0x7D8C, 0xBD94, 0x7D8D, 0xBD95, 0x7D8E, 0xBD96, 0x7D8F, 0xBD97, 0x7D90, 0xBD98, 0x7D91, 0xBD99, 0x7D92, 0xBD9A, + 0x7D93, 0xBD9B, 0x7D94, 0xBD9C, 0x7D95, 0xBD9D, 0x7D96, 0xBD9E, 0x7D97, 0xBD9F, 0x7D98, 0xBDA0, 0x7D99, 0xBE40, 0x7D9A, 0xBE41, + 0x7D9B, 0xBE42, 0x7D9C, 0xBE43, 0x7D9D, 0xBE44, 0x7D9E, 0xBE45, 0x7D9F, 0xBE46, 0x7DA0, 0xBE47, 0x7DA1, 0xBE48, 0x7DA2, 0xBE49, + 0x7DA3, 0xBE4A, 0x7DA4, 0xBE4B, 0x7DA5, 0xBE4C, 0x7DA6, 0xF4EB, 0x7DA7, 0xBE4D, 0x7DA8, 0xBE4E, 0x7DA9, 0xBE4F, 0x7DAA, 0xBE50, + 0x7DAB, 0xBE51, 0x7DAC, 0xBE52, 0x7DAD, 0xBE53, 0x7DAE, 0xF4EC, 0x7DAF, 0xBE54, 0x7DB0, 0xBE55, 0x7DB1, 0xBE56, 0x7DB2, 0xBE57, + 0x7DB3, 0xBE58, 0x7DB4, 0xBE59, 0x7DB5, 0xBE5A, 0x7DB6, 0xBE5B, 0x7DB7, 0xBE5C, 0x7DB8, 0xBE5D, 0x7DB9, 0xBE5E, 0x7DBA, 0xBE5F, + 0x7DBB, 0xBE60, 0x7DBC, 0xBE61, 0x7DBD, 0xBE62, 0x7DBE, 0xBE63, 0x7DBF, 0xBE64, 0x7DC0, 0xBE65, 0x7DC1, 0xBE66, 0x7DC2, 0xBE67, + 0x7DC3, 0xBE68, 0x7DC4, 0xBE69, 0x7DC5, 0xBE6A, 0x7DC6, 0xBE6B, 0x7DC7, 0xBE6C, 0x7DC8, 0xBE6D, 0x7DC9, 0xBE6E, 0x7DCA, 0xBE6F, + 0x7DCB, 0xBE70, 0x7DCC, 0xBE71, 0x7DCD, 0xBE72, 0x7DCE, 0xBE73, 0x7DCF, 0xBE74, 0x7DD0, 0xBE75, 0x7DD1, 0xBE76, 0x7DD2, 0xBE77, + 0x7DD3, 0xBE78, 0x7DD4, 0xBE79, 0x7DD5, 0xBE7A, 0x7DD6, 0xBE7B, 0x7DD7, 0xBE7C, 0x7DD8, 0xBE7D, 0x7DD9, 0xBE7E, 0x7DDA, 0xBE80, + 0x7DDB, 0xBE81, 0x7DDC, 0xBE82, 0x7DDD, 0xBE83, 0x7DDE, 0xBE84, 0x7DDF, 0xBE85, 0x7DE0, 0xBE86, 0x7DE1, 0xBE87, 0x7DE2, 0xBE88, + 0x7DE3, 0xBE89, 0x7DE4, 0xBE8A, 0x7DE5, 0xBE8B, 0x7DE6, 0xBE8C, 0x7DE7, 0xBE8D, 0x7DE8, 0xBE8E, 0x7DE9, 0xBE8F, 0x7DEA, 0xBE90, + 0x7DEB, 0xBE91, 0x7DEC, 0xBE92, 0x7DED, 0xBE93, 0x7DEE, 0xBE94, 0x7DEF, 0xBE95, 0x7DF0, 0xBE96, 0x7DF1, 0xBE97, 0x7DF2, 0xBE98, + 0x7DF3, 0xBE99, 0x7DF4, 0xBE9A, 0x7DF5, 0xBE9B, 0x7DF6, 0xBE9C, 0x7DF7, 0xBE9D, 0x7DF8, 0xBE9E, 0x7DF9, 0xBE9F, 0x7DFA, 0xBEA0, + 0x7DFB, 0xBF40, 0x7DFC, 0xBF41, 0x7DFD, 0xBF42, 0x7DFE, 0xBF43, 0x7DFF, 0xBF44, 0x7E00, 0xBF45, 0x7E01, 0xBF46, 0x7E02, 0xBF47, + 0x7E03, 0xBF48, 0x7E04, 0xBF49, 0x7E05, 0xBF4A, 0x7E06, 0xBF4B, 0x7E07, 0xBF4C, 0x7E08, 0xBF4D, 0x7E09, 0xBF4E, 0x7E0A, 0xBF4F, + 0x7E0B, 0xBF50, 0x7E0C, 0xBF51, 0x7E0D, 0xBF52, 0x7E0E, 0xBF53, 0x7E0F, 0xBF54, 0x7E10, 0xBF55, 0x7E11, 0xBF56, 0x7E12, 0xBF57, + 0x7E13, 0xBF58, 0x7E14, 0xBF59, 0x7E15, 0xBF5A, 0x7E16, 0xBF5B, 0x7E17, 0xBF5C, 0x7E18, 0xBF5D, 0x7E19, 0xBF5E, 0x7E1A, 0xBF5F, + 0x7E1B, 0xBF60, 0x7E1C, 0xBF61, 0x7E1D, 0xBF62, 0x7E1E, 0xBF63, 0x7E1F, 0xBF64, 0x7E20, 0xBF65, 0x7E21, 0xBF66, 0x7E22, 0xBF67, + 0x7E23, 0xBF68, 0x7E24, 0xBF69, 0x7E25, 0xBF6A, 0x7E26, 0xBF6B, 0x7E27, 0xBF6C, 0x7E28, 0xBF6D, 0x7E29, 0xBF6E, 0x7E2A, 0xBF6F, + 0x7E2B, 0xBF70, 0x7E2C, 0xBF71, 0x7E2D, 0xBF72, 0x7E2E, 0xBF73, 0x7E2F, 0xBF74, 0x7E30, 0xBF75, 0x7E31, 0xBF76, 0x7E32, 0xBF77, + 0x7E33, 0xBF78, 0x7E34, 0xBF79, 0x7E35, 0xBF7A, 0x7E36, 0xBF7B, 0x7E37, 0xBF7C, 0x7E38, 0xBF7D, 0x7E39, 0xBF7E, 0x7E3A, 0xBF80, + 0x7E3B, 0xF7E3, 0x7E3C, 0xBF81, 0x7E3D, 0xBF82, 0x7E3E, 0xBF83, 0x7E3F, 0xBF84, 0x7E40, 0xBF85, 0x7E41, 0xB7B1, 0x7E42, 0xBF86, + 0x7E43, 0xBF87, 0x7E44, 0xBF88, 0x7E45, 0xBF89, 0x7E46, 0xBF8A, 0x7E47, 0xF4ED, 0x7E48, 0xBF8B, 0x7E49, 0xBF8C, 0x7E4A, 0xBF8D, + 0x7E4B, 0xBF8E, 0x7E4C, 0xBF8F, 0x7E4D, 0xBF90, 0x7E4E, 0xBF91, 0x7E4F, 0xBF92, 0x7E50, 0xBF93, 0x7E51, 0xBF94, 0x7E52, 0xBF95, + 0x7E53, 0xBF96, 0x7E54, 0xBF97, 0x7E55, 0xBF98, 0x7E56, 0xBF99, 0x7E57, 0xBF9A, 0x7E58, 0xBF9B, 0x7E59, 0xBF9C, 0x7E5A, 0xBF9D, + 0x7E5B, 0xBF9E, 0x7E5C, 0xBF9F, 0x7E5D, 0xBFA0, 0x7E5E, 0xC040, 0x7E5F, 0xC041, 0x7E60, 0xC042, 0x7E61, 0xC043, 0x7E62, 0xC044, + 0x7E63, 0xC045, 0x7E64, 0xC046, 0x7E65, 0xC047, 0x7E66, 0xC048, 0x7E67, 0xC049, 0x7E68, 0xC04A, 0x7E69, 0xC04B, 0x7E6A, 0xC04C, + 0x7E6B, 0xC04D, 0x7E6C, 0xC04E, 0x7E6D, 0xC04F, 0x7E6E, 0xC050, 0x7E6F, 0xC051, 0x7E70, 0xC052, 0x7E71, 0xC053, 0x7E72, 0xC054, + 0x7E73, 0xC055, 0x7E74, 0xC056, 0x7E75, 0xC057, 0x7E76, 0xC058, 0x7E77, 0xC059, 0x7E78, 0xC05A, 0x7E79, 0xC05B, 0x7E7A, 0xC05C, + 0x7E7B, 0xC05D, 0x7E7C, 0xC05E, 0x7E7D, 0xC05F, 0x7E7E, 0xC060, 0x7E7F, 0xC061, 0x7E80, 0xC062, 0x7E81, 0xC063, 0x7E82, 0xD7EB, + 0x7E83, 0xC064, 0x7E84, 0xC065, 0x7E85, 0xC066, 0x7E86, 0xC067, 0x7E87, 0xC068, 0x7E88, 0xC069, 0x7E89, 0xC06A, 0x7E8A, 0xC06B, + 0x7E8B, 0xC06C, 0x7E8C, 0xC06D, 0x7E8D, 0xC06E, 0x7E8E, 0xC06F, 0x7E8F, 0xC070, 0x7E90, 0xC071, 0x7E91, 0xC072, 0x7E92, 0xC073, + 0x7E93, 0xC074, 0x7E94, 0xC075, 0x7E95, 0xC076, 0x7E96, 0xC077, 0x7E97, 0xC078, 0x7E98, 0xC079, 0x7E99, 0xC07A, 0x7E9A, 0xC07B, + 0x7E9B, 0xF4EE, 0x7E9C, 0xC07C, 0x7E9D, 0xC07D, 0x7E9E, 0xC07E, 0x7E9F, 0xE6F9, 0x7EA0, 0xBEC0, 0x7EA1, 0xE6FA, 0x7EA2, 0xBAEC, + 0x7EA3, 0xE6FB, 0x7EA4, 0xCFCB, 0x7EA5, 0xE6FC, 0x7EA6, 0xD4BC, 0x7EA7, 0xBCB6, 0x7EA8, 0xE6FD, 0x7EA9, 0xE6FE, 0x7EAA, 0xBCCD, + 0x7EAB, 0xC8D2, 0x7EAC, 0xCEB3, 0x7EAD, 0xE7A1, 0x7EAE, 0xC080, 0x7EAF, 0xB4BF, 0x7EB0, 0xE7A2, 0x7EB1, 0xC9B4, 0x7EB2, 0xB8D9, + 0x7EB3, 0xC4C9, 0x7EB4, 0xC081, 0x7EB5, 0xD7DD, 0x7EB6, 0xC2DA, 0x7EB7, 0xB7D7, 0x7EB8, 0xD6BD, 0x7EB9, 0xCEC6, 0x7EBA, 0xB7C4, + 0x7EBB, 0xC082, 0x7EBC, 0xC083, 0x7EBD, 0xC5A6, 0x7EBE, 0xE7A3, 0x7EBF, 0xCFDF, 0x7EC0, 0xE7A4, 0x7EC1, 0xE7A5, 0x7EC2, 0xE7A6, + 0x7EC3, 0xC1B7, 0x7EC4, 0xD7E9, 0x7EC5, 0xC9F0, 0x7EC6, 0xCFB8, 0x7EC7, 0xD6AF, 0x7EC8, 0xD6D5, 0x7EC9, 0xE7A7, 0x7ECA, 0xB0ED, + 0x7ECB, 0xE7A8, 0x7ECC, 0xE7A9, 0x7ECD, 0xC9DC, 0x7ECE, 0xD2EF, 0x7ECF, 0xBEAD, 0x7ED0, 0xE7AA, 0x7ED1, 0xB0F3, 0x7ED2, 0xC8DE, + 0x7ED3, 0xBDE1, 0x7ED4, 0xE7AB, 0x7ED5, 0xC8C6, 0x7ED6, 0xC084, 0x7ED7, 0xE7AC, 0x7ED8, 0xBBE6, 0x7ED9, 0xB8F8, 0x7EDA, 0xD1A4, + 0x7EDB, 0xE7AD, 0x7EDC, 0xC2E7, 0x7EDD, 0xBEF8, 0x7EDE, 0xBDCA, 0x7EDF, 0xCDB3, 0x7EE0, 0xE7AE, 0x7EE1, 0xE7AF, 0x7EE2, 0xBEEE, + 0x7EE3, 0xD0E5, 0x7EE4, 0xC085, 0x7EE5, 0xCBE7, 0x7EE6, 0xCCD0, 0x7EE7, 0xBCCC, 0x7EE8, 0xE7B0, 0x7EE9, 0xBCA8, 0x7EEA, 0xD0F7, + 0x7EEB, 0xE7B1, 0x7EEC, 0xC086, 0x7EED, 0xD0F8, 0x7EEE, 0xE7B2, 0x7EEF, 0xE7B3, 0x7EF0, 0xB4C2, 0x7EF1, 0xE7B4, 0x7EF2, 0xE7B5, + 0x7EF3, 0xC9FE, 0x7EF4, 0xCEAC, 0x7EF5, 0xC3E0, 0x7EF6, 0xE7B7, 0x7EF7, 0xB1C1, 0x7EF8, 0xB3F1, 0x7EF9, 0xC087, 0x7EFA, 0xE7B8, + 0x7EFB, 0xE7B9, 0x7EFC, 0xD7DB, 0x7EFD, 0xD5C0, 0x7EFE, 0xE7BA, 0x7EFF, 0xC2CC, 0x7F00, 0xD7BA, 0x7F01, 0xE7BB, 0x7F02, 0xE7BC, + 0x7F03, 0xE7BD, 0x7F04, 0xBCEA, 0x7F05, 0xC3E5, 0x7F06, 0xC0C2, 0x7F07, 0xE7BE, 0x7F08, 0xE7BF, 0x7F09, 0xBCA9, 0x7F0A, 0xC088, + 0x7F0B, 0xE7C0, 0x7F0C, 0xE7C1, 0x7F0D, 0xE7B6, 0x7F0E, 0xB6D0, 0x7F0F, 0xE7C2, 0x7F10, 0xC089, 0x7F11, 0xE7C3, 0x7F12, 0xE7C4, + 0x7F13, 0xBBBA, 0x7F14, 0xB5DE, 0x7F15, 0xC2C6, 0x7F16, 0xB1E0, 0x7F17, 0xE7C5, 0x7F18, 0xD4B5, 0x7F19, 0xE7C6, 0x7F1A, 0xB8BF, + 0x7F1B, 0xE7C8, 0x7F1C, 0xE7C7, 0x7F1D, 0xB7EC, 0x7F1E, 0xC08A, 0x7F1F, 0xE7C9, 0x7F20, 0xB2F8, 0x7F21, 0xE7CA, 0x7F22, 0xE7CB, + 0x7F23, 0xE7CC, 0x7F24, 0xE7CD, 0x7F25, 0xE7CE, 0x7F26, 0xE7CF, 0x7F27, 0xE7D0, 0x7F28, 0xD3A7, 0x7F29, 0xCBF5, 0x7F2A, 0xE7D1, + 0x7F2B, 0xE7D2, 0x7F2C, 0xE7D3, 0x7F2D, 0xE7D4, 0x7F2E, 0xC9C9, 0x7F2F, 0xE7D5, 0x7F30, 0xE7D6, 0x7F31, 0xE7D7, 0x7F32, 0xE7D8, + 0x7F33, 0xE7D9, 0x7F34, 0xBDC9, 0x7F35, 0xE7DA, 0x7F36, 0xF3BE, 0x7F37, 0xC08B, 0x7F38, 0xB8D7, 0x7F39, 0xC08C, 0x7F3A, 0xC8B1, + 0x7F3B, 0xC08D, 0x7F3C, 0xC08E, 0x7F3D, 0xC08F, 0x7F3E, 0xC090, 0x7F3F, 0xC091, 0x7F40, 0xC092, 0x7F41, 0xC093, 0x7F42, 0xF3BF, + 0x7F43, 0xC094, 0x7F44, 0xF3C0, 0x7F45, 0xF3C1, 0x7F46, 0xC095, 0x7F47, 0xC096, 0x7F48, 0xC097, 0x7F49, 0xC098, 0x7F4A, 0xC099, + 0x7F4B, 0xC09A, 0x7F4C, 0xC09B, 0x7F4D, 0xC09C, 0x7F4E, 0xC09D, 0x7F4F, 0xC09E, 0x7F50, 0xB9DE, 0x7F51, 0xCDF8, 0x7F52, 0xC09F, + 0x7F53, 0xC0A0, 0x7F54, 0xD8E8, 0x7F55, 0xBAB1, 0x7F56, 0xC140, 0x7F57, 0xC2DE, 0x7F58, 0xEEB7, 0x7F59, 0xC141, 0x7F5A, 0xB7A3, + 0x7F5B, 0xC142, 0x7F5C, 0xC143, 0x7F5D, 0xC144, 0x7F5E, 0xC145, 0x7F5F, 0xEEB9, 0x7F60, 0xC146, 0x7F61, 0xEEB8, 0x7F62, 0xB0D5, + 0x7F63, 0xC147, 0x7F64, 0xC148, 0x7F65, 0xC149, 0x7F66, 0xC14A, 0x7F67, 0xC14B, 0x7F68, 0xEEBB, 0x7F69, 0xD5D6, 0x7F6A, 0xD7EF, + 0x7F6B, 0xC14C, 0x7F6C, 0xC14D, 0x7F6D, 0xC14E, 0x7F6E, 0xD6C3, 0x7F6F, 0xC14F, 0x7F70, 0xC150, 0x7F71, 0xEEBD, 0x7F72, 0xCAF0, + 0x7F73, 0xC151, 0x7F74, 0xEEBC, 0x7F75, 0xC152, 0x7F76, 0xC153, 0x7F77, 0xC154, 0x7F78, 0xC155, 0x7F79, 0xEEBE, 0x7F7A, 0xC156, + 0x7F7B, 0xC157, 0x7F7C, 0xC158, 0x7F7D, 0xC159, 0x7F7E, 0xEEC0, 0x7F7F, 0xC15A, 0x7F80, 0xC15B, 0x7F81, 0xEEBF, 0x7F82, 0xC15C, + 0x7F83, 0xC15D, 0x7F84, 0xC15E, 0x7F85, 0xC15F, 0x7F86, 0xC160, 0x7F87, 0xC161, 0x7F88, 0xC162, 0x7F89, 0xC163, 0x7F8A, 0xD1F2, + 0x7F8B, 0xC164, 0x7F8C, 0xC7BC, 0x7F8D, 0xC165, 0x7F8E, 0xC3C0, 0x7F8F, 0xC166, 0x7F90, 0xC167, 0x7F91, 0xC168, 0x7F92, 0xC169, + 0x7F93, 0xC16A, 0x7F94, 0xB8E1, 0x7F95, 0xC16B, 0x7F96, 0xC16C, 0x7F97, 0xC16D, 0x7F98, 0xC16E, 0x7F99, 0xC16F, 0x7F9A, 0xC1E7, + 0x7F9B, 0xC170, 0x7F9C, 0xC171, 0x7F9D, 0xF4C6, 0x7F9E, 0xD0DF, 0x7F9F, 0xF4C7, 0x7FA0, 0xC172, 0x7FA1, 0xCFDB, 0x7FA2, 0xC173, + 0x7FA3, 0xC174, 0x7FA4, 0xC8BA, 0x7FA5, 0xC175, 0x7FA6, 0xC176, 0x7FA7, 0xF4C8, 0x7FA8, 0xC177, 0x7FA9, 0xC178, 0x7FAA, 0xC179, + 0x7FAB, 0xC17A, 0x7FAC, 0xC17B, 0x7FAD, 0xC17C, 0x7FAE, 0xC17D, 0x7FAF, 0xF4C9, 0x7FB0, 0xF4CA, 0x7FB1, 0xC17E, 0x7FB2, 0xF4CB, + 0x7FB3, 0xC180, 0x7FB4, 0xC181, 0x7FB5, 0xC182, 0x7FB6, 0xC183, 0x7FB7, 0xC184, 0x7FB8, 0xD9FA, 0x7FB9, 0xB8FE, 0x7FBA, 0xC185, + 0x7FBB, 0xC186, 0x7FBC, 0xE5F1, 0x7FBD, 0xD3F0, 0x7FBE, 0xC187, 0x7FBF, 0xF4E0, 0x7FC0, 0xC188, 0x7FC1, 0xCECC, 0x7FC2, 0xC189, + 0x7FC3, 0xC18A, 0x7FC4, 0xC18B, 0x7FC5, 0xB3E1, 0x7FC6, 0xC18C, 0x7FC7, 0xC18D, 0x7FC8, 0xC18E, 0x7FC9, 0xC18F, 0x7FCA, 0xF1B4, + 0x7FCB, 0xC190, 0x7FCC, 0xD2EE, 0x7FCD, 0xC191, 0x7FCE, 0xF4E1, 0x7FCF, 0xC192, 0x7FD0, 0xC193, 0x7FD1, 0xC194, 0x7FD2, 0xC195, + 0x7FD3, 0xC196, 0x7FD4, 0xCFE8, 0x7FD5, 0xF4E2, 0x7FD6, 0xC197, 0x7FD7, 0xC198, 0x7FD8, 0xC7CC, 0x7FD9, 0xC199, 0x7FDA, 0xC19A, + 0x7FDB, 0xC19B, 0x7FDC, 0xC19C, 0x7FDD, 0xC19D, 0x7FDE, 0xC19E, 0x7FDF, 0xB5D4, 0x7FE0, 0xB4E4, 0x7FE1, 0xF4E4, 0x7FE2, 0xC19F, + 0x7FE3, 0xC1A0, 0x7FE4, 0xC240, 0x7FE5, 0xF4E3, 0x7FE6, 0xF4E5, 0x7FE7, 0xC241, 0x7FE8, 0xC242, 0x7FE9, 0xF4E6, 0x7FEA, 0xC243, + 0x7FEB, 0xC244, 0x7FEC, 0xC245, 0x7FED, 0xC246, 0x7FEE, 0xF4E7, 0x7FEF, 0xC247, 0x7FF0, 0xBAB2, 0x7FF1, 0xB0BF, 0x7FF2, 0xC248, + 0x7FF3, 0xF4E8, 0x7FF4, 0xC249, 0x7FF5, 0xC24A, 0x7FF6, 0xC24B, 0x7FF7, 0xC24C, 0x7FF8, 0xC24D, 0x7FF9, 0xC24E, 0x7FFA, 0xC24F, + 0x7FFB, 0xB7AD, 0x7FFC, 0xD2ED, 0x7FFD, 0xC250, 0x7FFE, 0xC251, 0x7FFF, 0xC252, 0x8000, 0xD2AB, 0x8001, 0xC0CF, 0x8002, 0xC253, + 0x8003, 0xBFBC, 0x8004, 0xEBA3, 0x8005, 0xD5DF, 0x8006, 0xEAC8, 0x8007, 0xC254, 0x8008, 0xC255, 0x8009, 0xC256, 0x800A, 0xC257, + 0x800B, 0xF1F3, 0x800C, 0xB6F8, 0x800D, 0xCBA3, 0x800E, 0xC258, 0x800F, 0xC259, 0x8010, 0xC4CD, 0x8011, 0xC25A, 0x8012, 0xF1E7, + 0x8013, 0xC25B, 0x8014, 0xF1E8, 0x8015, 0xB8FB, 0x8016, 0xF1E9, 0x8017, 0xBAC4, 0x8018, 0xD4C5, 0x8019, 0xB0D2, 0x801A, 0xC25C, + 0x801B, 0xC25D, 0x801C, 0xF1EA, 0x801D, 0xC25E, 0x801E, 0xC25F, 0x801F, 0xC260, 0x8020, 0xF1EB, 0x8021, 0xC261, 0x8022, 0xF1EC, + 0x8023, 0xC262, 0x8024, 0xC263, 0x8025, 0xF1ED, 0x8026, 0xF1EE, 0x8027, 0xF1EF, 0x8028, 0xF1F1, 0x8029, 0xF1F0, 0x802A, 0xC5D5, + 0x802B, 0xC264, 0x802C, 0xC265, 0x802D, 0xC266, 0x802E, 0xC267, 0x802F, 0xC268, 0x8030, 0xC269, 0x8031, 0xF1F2, 0x8032, 0xC26A, + 0x8033, 0xB6FA, 0x8034, 0xC26B, 0x8035, 0xF1F4, 0x8036, 0xD2AE, 0x8037, 0xDEC7, 0x8038, 0xCBCA, 0x8039, 0xC26C, 0x803A, 0xC26D, + 0x803B, 0xB3DC, 0x803C, 0xC26E, 0x803D, 0xB5A2, 0x803E, 0xC26F, 0x803F, 0xB9A2, 0x8040, 0xC270, 0x8041, 0xC271, 0x8042, 0xC4F4, + 0x8043, 0xF1F5, 0x8044, 0xC272, 0x8045, 0xC273, 0x8046, 0xF1F6, 0x8047, 0xC274, 0x8048, 0xC275, 0x8049, 0xC276, 0x804A, 0xC1C4, + 0x804B, 0xC1FB, 0x804C, 0xD6B0, 0x804D, 0xF1F7, 0x804E, 0xC277, 0x804F, 0xC278, 0x8050, 0xC279, 0x8051, 0xC27A, 0x8052, 0xF1F8, + 0x8053, 0xC27B, 0x8054, 0xC1AA, 0x8055, 0xC27C, 0x8056, 0xC27D, 0x8057, 0xC27E, 0x8058, 0xC6B8, 0x8059, 0xC280, 0x805A, 0xBEDB, + 0x805B, 0xC281, 0x805C, 0xC282, 0x805D, 0xC283, 0x805E, 0xC284, 0x805F, 0xC285, 0x8060, 0xC286, 0x8061, 0xC287, 0x8062, 0xC288, + 0x8063, 0xC289, 0x8064, 0xC28A, 0x8065, 0xC28B, 0x8066, 0xC28C, 0x8067, 0xC28D, 0x8068, 0xC28E, 0x8069, 0xF1F9, 0x806A, 0xB4CF, + 0x806B, 0xC28F, 0x806C, 0xC290, 0x806D, 0xC291, 0x806E, 0xC292, 0x806F, 0xC293, 0x8070, 0xC294, 0x8071, 0xF1FA, 0x8072, 0xC295, + 0x8073, 0xC296, 0x8074, 0xC297, 0x8075, 0xC298, 0x8076, 0xC299, 0x8077, 0xC29A, 0x8078, 0xC29B, 0x8079, 0xC29C, 0x807A, 0xC29D, + 0x807B, 0xC29E, 0x807C, 0xC29F, 0x807D, 0xC2A0, 0x807E, 0xC340, 0x807F, 0xEDB2, 0x8080, 0xEDB1, 0x8081, 0xC341, 0x8082, 0xC342, + 0x8083, 0xCBE0, 0x8084, 0xD2DE, 0x8085, 0xC343, 0x8086, 0xCBC1, 0x8087, 0xD5D8, 0x8088, 0xC344, 0x8089, 0xC8E2, 0x808A, 0xC345, + 0x808B, 0xC0DF, 0x808C, 0xBCA1, 0x808D, 0xC346, 0x808E, 0xC347, 0x808F, 0xC348, 0x8090, 0xC349, 0x8091, 0xC34A, 0x8092, 0xC34B, + 0x8093, 0xEBC1, 0x8094, 0xC34C, 0x8095, 0xC34D, 0x8096, 0xD0A4, 0x8097, 0xC34E, 0x8098, 0xD6E2, 0x8099, 0xC34F, 0x809A, 0xB6C7, + 0x809B, 0xB8D8, 0x809C, 0xEBC0, 0x809D, 0xB8CE, 0x809E, 0xC350, 0x809F, 0xEBBF, 0x80A0, 0xB3A6, 0x80A1, 0xB9C9, 0x80A2, 0xD6AB, + 0x80A3, 0xC351, 0x80A4, 0xB7F4, 0x80A5, 0xB7CA, 0x80A6, 0xC352, 0x80A7, 0xC353, 0x80A8, 0xC354, 0x80A9, 0xBCE7, 0x80AA, 0xB7BE, + 0x80AB, 0xEBC6, 0x80AC, 0xC355, 0x80AD, 0xEBC7, 0x80AE, 0xB0B9, 0x80AF, 0xBFCF, 0x80B0, 0xC356, 0x80B1, 0xEBC5, 0x80B2, 0xD3FD, + 0x80B3, 0xC357, 0x80B4, 0xEBC8, 0x80B5, 0xC358, 0x80B6, 0xC359, 0x80B7, 0xEBC9, 0x80B8, 0xC35A, 0x80B9, 0xC35B, 0x80BA, 0xB7CE, + 0x80BB, 0xC35C, 0x80BC, 0xEBC2, 0x80BD, 0xEBC4, 0x80BE, 0xC9F6, 0x80BF, 0xD6D7, 0x80C0, 0xD5CD, 0x80C1, 0xD0B2, 0x80C2, 0xEBCF, + 0x80C3, 0xCEB8, 0x80C4, 0xEBD0, 0x80C5, 0xC35D, 0x80C6, 0xB5A8, 0x80C7, 0xC35E, 0x80C8, 0xC35F, 0x80C9, 0xC360, 0x80CA, 0xC361, + 0x80CB, 0xC362, 0x80CC, 0xB1B3, 0x80CD, 0xEBD2, 0x80CE, 0xCCA5, 0x80CF, 0xC363, 0x80D0, 0xC364, 0x80D1, 0xC365, 0x80D2, 0xC366, + 0x80D3, 0xC367, 0x80D4, 0xC368, 0x80D5, 0xC369, 0x80D6, 0xC5D6, 0x80D7, 0xEBD3, 0x80D8, 0xC36A, 0x80D9, 0xEBD1, 0x80DA, 0xC5DF, + 0x80DB, 0xEBCE, 0x80DC, 0xCAA4, 0x80DD, 0xEBD5, 0x80DE, 0xB0FB, 0x80DF, 0xC36B, 0x80E0, 0xC36C, 0x80E1, 0xBAFA, 0x80E2, 0xC36D, + 0x80E3, 0xC36E, 0x80E4, 0xD8B7, 0x80E5, 0xF1E3, 0x80E6, 0xC36F, 0x80E7, 0xEBCA, 0x80E8, 0xEBCB, 0x80E9, 0xEBCC, 0x80EA, 0xEBCD, + 0x80EB, 0xEBD6, 0x80EC, 0xE6C0, 0x80ED, 0xEBD9, 0x80EE, 0xC370, 0x80EF, 0xBFE8, 0x80F0, 0xD2C8, 0x80F1, 0xEBD7, 0x80F2, 0xEBDC, + 0x80F3, 0xB8EC, 0x80F4, 0xEBD8, 0x80F5, 0xC371, 0x80F6, 0xBDBA, 0x80F7, 0xC372, 0x80F8, 0xD0D8, 0x80F9, 0xC373, 0x80FA, 0xB0B7, + 0x80FB, 0xC374, 0x80FC, 0xEBDD, 0x80FD, 0xC4DC, 0x80FE, 0xC375, 0x80FF, 0xC376, 0x8100, 0xC377, 0x8101, 0xC378, 0x8102, 0xD6AC, + 0x8103, 0xC379, 0x8104, 0xC37A, 0x8105, 0xC37B, 0x8106, 0xB4E0, 0x8107, 0xC37C, 0x8108, 0xC37D, 0x8109, 0xC2F6, 0x810A, 0xBCB9, + 0x810B, 0xC37E, 0x810C, 0xC380, 0x810D, 0xEBDA, 0x810E, 0xEBDB, 0x810F, 0xD4E0, 0x8110, 0xC6EA, 0x8111, 0xC4D4, 0x8112, 0xEBDF, + 0x8113, 0xC5A7, 0x8114, 0xD9F5, 0x8115, 0xC381, 0x8116, 0xB2B1, 0x8117, 0xC382, 0x8118, 0xEBE4, 0x8119, 0xC383, 0x811A, 0xBDC5, + 0x811B, 0xC384, 0x811C, 0xC385, 0x811D, 0xC386, 0x811E, 0xEBE2, 0x811F, 0xC387, 0x8120, 0xC388, 0x8121, 0xC389, 0x8122, 0xC38A, + 0x8123, 0xC38B, 0x8124, 0xC38C, 0x8125, 0xC38D, 0x8126, 0xC38E, 0x8127, 0xC38F, 0x8128, 0xC390, 0x8129, 0xC391, 0x812A, 0xC392, + 0x812B, 0xC393, 0x812C, 0xEBE3, 0x812D, 0xC394, 0x812E, 0xC395, 0x812F, 0xB8AC, 0x8130, 0xC396, 0x8131, 0xCDD1, 0x8132, 0xEBE5, + 0x8133, 0xC397, 0x8134, 0xC398, 0x8135, 0xC399, 0x8136, 0xEBE1, 0x8137, 0xC39A, 0x8138, 0xC1B3, 0x8139, 0xC39B, 0x813A, 0xC39C, + 0x813B, 0xC39D, 0x813C, 0xC39E, 0x813D, 0xC39F, 0x813E, 0xC6A2, 0x813F, 0xC3A0, 0x8140, 0xC440, 0x8141, 0xC441, 0x8142, 0xC442, + 0x8143, 0xC443, 0x8144, 0xC444, 0x8145, 0xC445, 0x8146, 0xCCF3, 0x8147, 0xC446, 0x8148, 0xEBE6, 0x8149, 0xC447, 0x814A, 0xC0B0, + 0x814B, 0xD2B8, 0x814C, 0xEBE7, 0x814D, 0xC448, 0x814E, 0xC449, 0x814F, 0xC44A, 0x8150, 0xB8AF, 0x8151, 0xB8AD, 0x8152, 0xC44B, + 0x8153, 0xEBE8, 0x8154, 0xC7BB, 0x8155, 0xCDF3, 0x8156, 0xC44C, 0x8157, 0xC44D, 0x8158, 0xC44E, 0x8159, 0xEBEA, 0x815A, 0xEBEB, + 0x815B, 0xC44F, 0x815C, 0xC450, 0x815D, 0xC451, 0x815E, 0xC452, 0x815F, 0xC453, 0x8160, 0xEBED, 0x8161, 0xC454, 0x8162, 0xC455, + 0x8163, 0xC456, 0x8164, 0xC457, 0x8165, 0xD0C8, 0x8166, 0xC458, 0x8167, 0xEBF2, 0x8168, 0xC459, 0x8169, 0xEBEE, 0x816A, 0xC45A, + 0x816B, 0xC45B, 0x816C, 0xC45C, 0x816D, 0xEBF1, 0x816E, 0xC8F9, 0x816F, 0xC45D, 0x8170, 0xD1FC, 0x8171, 0xEBEC, 0x8172, 0xC45E, + 0x8173, 0xC45F, 0x8174, 0xEBE9, 0x8175, 0xC460, 0x8176, 0xC461, 0x8177, 0xC462, 0x8178, 0xC463, 0x8179, 0xB8B9, 0x817A, 0xCFD9, + 0x817B, 0xC4E5, 0x817C, 0xEBEF, 0x817D, 0xEBF0, 0x817E, 0xCCDA, 0x817F, 0xCDC8, 0x8180, 0xB0F2, 0x8181, 0xC464, 0x8182, 0xEBF6, + 0x8183, 0xC465, 0x8184, 0xC466, 0x8185, 0xC467, 0x8186, 0xC468, 0x8187, 0xC469, 0x8188, 0xEBF5, 0x8189, 0xC46A, 0x818A, 0xB2B2, + 0x818B, 0xC46B, 0x818C, 0xC46C, 0x818D, 0xC46D, 0x818E, 0xC46E, 0x818F, 0xB8E0, 0x8190, 0xC46F, 0x8191, 0xEBF7, 0x8192, 0xC470, + 0x8193, 0xC471, 0x8194, 0xC472, 0x8195, 0xC473, 0x8196, 0xC474, 0x8197, 0xC475, 0x8198, 0xB1EC, 0x8199, 0xC476, 0x819A, 0xC477, + 0x819B, 0xCCC5, 0x819C, 0xC4A4, 0x819D, 0xCFA5, 0x819E, 0xC478, 0x819F, 0xC479, 0x81A0, 0xC47A, 0x81A1, 0xC47B, 0x81A2, 0xC47C, + 0x81A3, 0xEBF9, 0x81A4, 0xC47D, 0x81A5, 0xC47E, 0x81A6, 0xECA2, 0x81A7, 0xC480, 0x81A8, 0xC5F2, 0x81A9, 0xC481, 0x81AA, 0xEBFA, + 0x81AB, 0xC482, 0x81AC, 0xC483, 0x81AD, 0xC484, 0x81AE, 0xC485, 0x81AF, 0xC486, 0x81B0, 0xC487, 0x81B1, 0xC488, 0x81B2, 0xC489, + 0x81B3, 0xC9C5, 0x81B4, 0xC48A, 0x81B5, 0xC48B, 0x81B6, 0xC48C, 0x81B7, 0xC48D, 0x81B8, 0xC48E, 0x81B9, 0xC48F, 0x81BA, 0xE2DF, + 0x81BB, 0xEBFE, 0x81BC, 0xC490, 0x81BD, 0xC491, 0x81BE, 0xC492, 0x81BF, 0xC493, 0x81C0, 0xCDCE, 0x81C1, 0xECA1, 0x81C2, 0xB1DB, + 0x81C3, 0xD3B7, 0x81C4, 0xC494, 0x81C5, 0xC495, 0x81C6, 0xD2DC, 0x81C7, 0xC496, 0x81C8, 0xC497, 0x81C9, 0xC498, 0x81CA, 0xEBFD, + 0x81CB, 0xC499, 0x81CC, 0xEBFB, 0x81CD, 0xC49A, 0x81CE, 0xC49B, 0x81CF, 0xC49C, 0x81D0, 0xC49D, 0x81D1, 0xC49E, 0x81D2, 0xC49F, + 0x81D3, 0xC4A0, 0x81D4, 0xC540, 0x81D5, 0xC541, 0x81D6, 0xC542, 0x81D7, 0xC543, 0x81D8, 0xC544, 0x81D9, 0xC545, 0x81DA, 0xC546, + 0x81DB, 0xC547, 0x81DC, 0xC548, 0x81DD, 0xC549, 0x81DE, 0xC54A, 0x81DF, 0xC54B, 0x81E0, 0xC54C, 0x81E1, 0xC54D, 0x81E2, 0xC54E, + 0x81E3, 0xB3BC, 0x81E4, 0xC54F, 0x81E5, 0xC550, 0x81E6, 0xC551, 0x81E7, 0xEAB0, 0x81E8, 0xC552, 0x81E9, 0xC553, 0x81EA, 0xD7D4, + 0x81EB, 0xC554, 0x81EC, 0xF4AB, 0x81ED, 0xB3F4, 0x81EE, 0xC555, 0x81EF, 0xC556, 0x81F0, 0xC557, 0x81F1, 0xC558, 0x81F2, 0xC559, + 0x81F3, 0xD6C1, 0x81F4, 0xD6C2, 0x81F5, 0xC55A, 0x81F6, 0xC55B, 0x81F7, 0xC55C, 0x81F8, 0xC55D, 0x81F9, 0xC55E, 0x81FA, 0xC55F, + 0x81FB, 0xD5E9, 0x81FC, 0xBECA, 0x81FD, 0xC560, 0x81FE, 0xF4A7, 0x81FF, 0xC561, 0x8200, 0xD2A8, 0x8201, 0xF4A8, 0x8202, 0xF4A9, + 0x8203, 0xC562, 0x8204, 0xF4AA, 0x8205, 0xBECB, 0x8206, 0xD3DF, 0x8207, 0xC563, 0x8208, 0xC564, 0x8209, 0xC565, 0x820A, 0xC566, + 0x820B, 0xC567, 0x820C, 0xC9E0, 0x820D, 0xC9E1, 0x820E, 0xC568, 0x820F, 0xC569, 0x8210, 0xF3C2, 0x8211, 0xC56A, 0x8212, 0xCAE6, + 0x8213, 0xC56B, 0x8214, 0xCCF2, 0x8215, 0xC56C, 0x8216, 0xC56D, 0x8217, 0xC56E, 0x8218, 0xC56F, 0x8219, 0xC570, 0x821A, 0xC571, + 0x821B, 0xE2B6, 0x821C, 0xCBB4, 0x821D, 0xC572, 0x821E, 0xCEE8, 0x821F, 0xD6DB, 0x8220, 0xC573, 0x8221, 0xF4AD, 0x8222, 0xF4AE, + 0x8223, 0xF4AF, 0x8224, 0xC574, 0x8225, 0xC575, 0x8226, 0xC576, 0x8227, 0xC577, 0x8228, 0xF4B2, 0x8229, 0xC578, 0x822A, 0xBABD, + 0x822B, 0xF4B3, 0x822C, 0xB0E3, 0x822D, 0xF4B0, 0x822E, 0xC579, 0x822F, 0xF4B1, 0x8230, 0xBDA2, 0x8231, 0xB2D5, 0x8232, 0xC57A, + 0x8233, 0xF4B6, 0x8234, 0xF4B7, 0x8235, 0xB6E6, 0x8236, 0xB2B0, 0x8237, 0xCFCF, 0x8238, 0xF4B4, 0x8239, 0xB4AC, 0x823A, 0xC57B, + 0x823B, 0xF4B5, 0x823C, 0xC57C, 0x823D, 0xC57D, 0x823E, 0xF4B8, 0x823F, 0xC57E, 0x8240, 0xC580, 0x8241, 0xC581, 0x8242, 0xC582, + 0x8243, 0xC583, 0x8244, 0xF4B9, 0x8245, 0xC584, 0x8246, 0xC585, 0x8247, 0xCDA7, 0x8248, 0xC586, 0x8249, 0xF4BA, 0x824A, 0xC587, + 0x824B, 0xF4BB, 0x824C, 0xC588, 0x824D, 0xC589, 0x824E, 0xC58A, 0x824F, 0xF4BC, 0x8250, 0xC58B, 0x8251, 0xC58C, 0x8252, 0xC58D, + 0x8253, 0xC58E, 0x8254, 0xC58F, 0x8255, 0xC590, 0x8256, 0xC591, 0x8257, 0xC592, 0x8258, 0xCBD2, 0x8259, 0xC593, 0x825A, 0xF4BD, + 0x825B, 0xC594, 0x825C, 0xC595, 0x825D, 0xC596, 0x825E, 0xC597, 0x825F, 0xF4BE, 0x8260, 0xC598, 0x8261, 0xC599, 0x8262, 0xC59A, + 0x8263, 0xC59B, 0x8264, 0xC59C, 0x8265, 0xC59D, 0x8266, 0xC59E, 0x8267, 0xC59F, 0x8268, 0xF4BF, 0x8269, 0xC5A0, 0x826A, 0xC640, + 0x826B, 0xC641, 0x826C, 0xC642, 0x826D, 0xC643, 0x826E, 0xF4DE, 0x826F, 0xC1BC, 0x8270, 0xBCE8, 0x8271, 0xC644, 0x8272, 0xC9AB, + 0x8273, 0xD1DE, 0x8274, 0xE5F5, 0x8275, 0xC645, 0x8276, 0xC646, 0x8277, 0xC647, 0x8278, 0xC648, 0x8279, 0xDCB3, 0x827A, 0xD2D5, + 0x827B, 0xC649, 0x827C, 0xC64A, 0x827D, 0xDCB4, 0x827E, 0xB0AC, 0x827F, 0xDCB5, 0x8280, 0xC64B, 0x8281, 0xC64C, 0x8282, 0xBDDA, + 0x8283, 0xC64D, 0x8284, 0xDCB9, 0x8285, 0xC64E, 0x8286, 0xC64F, 0x8287, 0xC650, 0x8288, 0xD8C2, 0x8289, 0xC651, 0x828A, 0xDCB7, + 0x828B, 0xD3F3, 0x828C, 0xC652, 0x828D, 0xC9D6, 0x828E, 0xDCBA, 0x828F, 0xDCB6, 0x8290, 0xC653, 0x8291, 0xDCBB, 0x8292, 0xC3A2, + 0x8293, 0xC654, 0x8294, 0xC655, 0x8295, 0xC656, 0x8296, 0xC657, 0x8297, 0xDCBC, 0x8298, 0xDCC5, 0x8299, 0xDCBD, 0x829A, 0xC658, + 0x829B, 0xC659, 0x829C, 0xCEDF, 0x829D, 0xD6A5, 0x829E, 0xC65A, 0x829F, 0xDCCF, 0x82A0, 0xC65B, 0x82A1, 0xDCCD, 0x82A2, 0xC65C, + 0x82A3, 0xC65D, 0x82A4, 0xDCD2, 0x82A5, 0xBDE6, 0x82A6, 0xC2AB, 0x82A7, 0xC65E, 0x82A8, 0xDCB8, 0x82A9, 0xDCCB, 0x82AA, 0xDCCE, + 0x82AB, 0xDCBE, 0x82AC, 0xB7D2, 0x82AD, 0xB0C5, 0x82AE, 0xDCC7, 0x82AF, 0xD0BE, 0x82B0, 0xDCC1, 0x82B1, 0xBBA8, 0x82B2, 0xC65F, + 0x82B3, 0xB7BC, 0x82B4, 0xDCCC, 0x82B5, 0xC660, 0x82B6, 0xC661, 0x82B7, 0xDCC6, 0x82B8, 0xDCBF, 0x82B9, 0xC7DB, 0x82BA, 0xC662, + 0x82BB, 0xC663, 0x82BC, 0xC664, 0x82BD, 0xD1BF, 0x82BE, 0xDCC0, 0x82BF, 0xC665, 0x82C0, 0xC666, 0x82C1, 0xDCCA, 0x82C2, 0xC667, + 0x82C3, 0xC668, 0x82C4, 0xDCD0, 0x82C5, 0xC669, 0x82C6, 0xC66A, 0x82C7, 0xCEAD, 0x82C8, 0xDCC2, 0x82C9, 0xC66B, 0x82CA, 0xDCC3, + 0x82CB, 0xDCC8, 0x82CC, 0xDCC9, 0x82CD, 0xB2D4, 0x82CE, 0xDCD1, 0x82CF, 0xCBD5, 0x82D0, 0xC66C, 0x82D1, 0xD4B7, 0x82D2, 0xDCDB, + 0x82D3, 0xDCDF, 0x82D4, 0xCCA6, 0x82D5, 0xDCE6, 0x82D6, 0xC66D, 0x82D7, 0xC3E7, 0x82D8, 0xDCDC, 0x82D9, 0xC66E, 0x82DA, 0xC66F, + 0x82DB, 0xBFC1, 0x82DC, 0xDCD9, 0x82DD, 0xC670, 0x82DE, 0xB0FA, 0x82DF, 0xB9B6, 0x82E0, 0xDCE5, 0x82E1, 0xDCD3, 0x82E2, 0xC671, + 0x82E3, 0xDCC4, 0x82E4, 0xDCD6, 0x82E5, 0xC8F4, 0x82E6, 0xBFE0, 0x82E7, 0xC672, 0x82E8, 0xC673, 0x82E9, 0xC674, 0x82EA, 0xC675, + 0x82EB, 0xC9BB, 0x82EC, 0xC676, 0x82ED, 0xC677, 0x82EE, 0xC678, 0x82EF, 0xB1BD, 0x82F0, 0xC679, 0x82F1, 0xD3A2, 0x82F2, 0xC67A, + 0x82F3, 0xC67B, 0x82F4, 0xDCDA, 0x82F5, 0xC67C, 0x82F6, 0xC67D, 0x82F7, 0xDCD5, 0x82F8, 0xC67E, 0x82F9, 0xC6BB, 0x82FA, 0xC680, + 0x82FB, 0xDCDE, 0x82FC, 0xC681, 0x82FD, 0xC682, 0x82FE, 0xC683, 0x82FF, 0xC684, 0x8300, 0xC685, 0x8301, 0xD7C2, 0x8302, 0xC3AF, + 0x8303, 0xB7B6, 0x8304, 0xC7D1, 0x8305, 0xC3A9, 0x8306, 0xDCE2, 0x8307, 0xDCD8, 0x8308, 0xDCEB, 0x8309, 0xDCD4, 0x830A, 0xC686, + 0x830B, 0xC687, 0x830C, 0xDCDD, 0x830D, 0xC688, 0x830E, 0xBEA5, 0x830F, 0xDCD7, 0x8310, 0xC689, 0x8311, 0xDCE0, 0x8312, 0xC68A, + 0x8313, 0xC68B, 0x8314, 0xDCE3, 0x8315, 0xDCE4, 0x8316, 0xC68C, 0x8317, 0xDCF8, 0x8318, 0xC68D, 0x8319, 0xC68E, 0x831A, 0xDCE1, + 0x831B, 0xDDA2, 0x831C, 0xDCE7, 0x831D, 0xC68F, 0x831E, 0xC690, 0x831F, 0xC691, 0x8320, 0xC692, 0x8321, 0xC693, 0x8322, 0xC694, + 0x8323, 0xC695, 0x8324, 0xC696, 0x8325, 0xC697, 0x8326, 0xC698, 0x8327, 0xBCEB, 0x8328, 0xB4C4, 0x8329, 0xC699, 0x832A, 0xC69A, + 0x832B, 0xC3A3, 0x832C, 0xB2E7, 0x832D, 0xDCFA, 0x832E, 0xC69B, 0x832F, 0xDCF2, 0x8330, 0xC69C, 0x8331, 0xDCEF, 0x8332, 0xC69D, + 0x8333, 0xDCFC, 0x8334, 0xDCEE, 0x8335, 0xD2F0, 0x8336, 0xB2E8, 0x8337, 0xC69E, 0x8338, 0xC8D7, 0x8339, 0xC8E3, 0x833A, 0xDCFB, + 0x833B, 0xC69F, 0x833C, 0xDCED, 0x833D, 0xC6A0, 0x833E, 0xC740, 0x833F, 0xC741, 0x8340, 0xDCF7, 0x8341, 0xC742, 0x8342, 0xC743, + 0x8343, 0xDCF5, 0x8344, 0xC744, 0x8345, 0xC745, 0x8346, 0xBEA3, 0x8347, 0xDCF4, 0x8348, 0xC746, 0x8349, 0xB2DD, 0x834A, 0xC747, + 0x834B, 0xC748, 0x834C, 0xC749, 0x834D, 0xC74A, 0x834E, 0xC74B, 0x834F, 0xDCF3, 0x8350, 0xBCF6, 0x8351, 0xDCE8, 0x8352, 0xBBC4, + 0x8353, 0xC74C, 0x8354, 0xC0F3, 0x8355, 0xC74D, 0x8356, 0xC74E, 0x8357, 0xC74F, 0x8358, 0xC750, 0x8359, 0xC751, 0x835A, 0xBCD4, + 0x835B, 0xDCE9, 0x835C, 0xDCEA, 0x835D, 0xC752, 0x835E, 0xDCF1, 0x835F, 0xDCF6, 0x8360, 0xDCF9, 0x8361, 0xB5B4, 0x8362, 0xC753, + 0x8363, 0xC8D9, 0x8364, 0xBBE7, 0x8365, 0xDCFE, 0x8366, 0xDCFD, 0x8367, 0xD3AB, 0x8368, 0xDDA1, 0x8369, 0xDDA3, 0x836A, 0xDDA5, + 0x836B, 0xD2F1, 0x836C, 0xDDA4, 0x836D, 0xDDA6, 0x836E, 0xDDA7, 0x836F, 0xD2A9, 0x8370, 0xC754, 0x8371, 0xC755, 0x8372, 0xC756, + 0x8373, 0xC757, 0x8374, 0xC758, 0x8375, 0xC759, 0x8376, 0xC75A, 0x8377, 0xBAC9, 0x8378, 0xDDA9, 0x8379, 0xC75B, 0x837A, 0xC75C, + 0x837B, 0xDDB6, 0x837C, 0xDDB1, 0x837D, 0xDDB4, 0x837E, 0xC75D, 0x837F, 0xC75E, 0x8380, 0xC75F, 0x8381, 0xC760, 0x8382, 0xC761, + 0x8383, 0xC762, 0x8384, 0xC763, 0x8385, 0xDDB0, 0x8386, 0xC6CE, 0x8387, 0xC764, 0x8388, 0xC765, 0x8389, 0xC0F2, 0x838A, 0xC766, + 0x838B, 0xC767, 0x838C, 0xC768, 0x838D, 0xC769, 0x838E, 0xC9AF, 0x838F, 0xC76A, 0x8390, 0xC76B, 0x8391, 0xC76C, 0x8392, 0xDCEC, + 0x8393, 0xDDAE, 0x8394, 0xC76D, 0x8395, 0xC76E, 0x8396, 0xC76F, 0x8397, 0xC770, 0x8398, 0xDDB7, 0x8399, 0xC771, 0x839A, 0xC772, + 0x839B, 0xDCF0, 0x839C, 0xDDAF, 0x839D, 0xC773, 0x839E, 0xDDB8, 0x839F, 0xC774, 0x83A0, 0xDDAC, 0x83A1, 0xC775, 0x83A2, 0xC776, + 0x83A3, 0xC777, 0x83A4, 0xC778, 0x83A5, 0xC779, 0x83A6, 0xC77A, 0x83A7, 0xC77B, 0x83A8, 0xDDB9, 0x83A9, 0xDDB3, 0x83AA, 0xDDAD, + 0x83AB, 0xC4AA, 0x83AC, 0xC77C, 0x83AD, 0xC77D, 0x83AE, 0xC77E, 0x83AF, 0xC780, 0x83B0, 0xDDA8, 0x83B1, 0xC0B3, 0x83B2, 0xC1AB, + 0x83B3, 0xDDAA, 0x83B4, 0xDDAB, 0x83B5, 0xC781, 0x83B6, 0xDDB2, 0x83B7, 0xBBF1, 0x83B8, 0xDDB5, 0x83B9, 0xD3A8, 0x83BA, 0xDDBA, + 0x83BB, 0xC782, 0x83BC, 0xDDBB, 0x83BD, 0xC3A7, 0x83BE, 0xC783, 0x83BF, 0xC784, 0x83C0, 0xDDD2, 0x83C1, 0xDDBC, 0x83C2, 0xC785, + 0x83C3, 0xC786, 0x83C4, 0xC787, 0x83C5, 0xDDD1, 0x83C6, 0xC788, 0x83C7, 0xB9BD, 0x83C8, 0xC789, 0x83C9, 0xC78A, 0x83CA, 0xBED5, + 0x83CB, 0xC78B, 0x83CC, 0xBEFA, 0x83CD, 0xC78C, 0x83CE, 0xC78D, 0x83CF, 0xBACA, 0x83D0, 0xC78E, 0x83D1, 0xC78F, 0x83D2, 0xC790, + 0x83D3, 0xC791, 0x83D4, 0xDDCA, 0x83D5, 0xC792, 0x83D6, 0xDDC5, 0x83D7, 0xC793, 0x83D8, 0xDDBF, 0x83D9, 0xC794, 0x83DA, 0xC795, + 0x83DB, 0xC796, 0x83DC, 0xB2CB, 0x83DD, 0xDDC3, 0x83DE, 0xC797, 0x83DF, 0xDDCB, 0x83E0, 0xB2A4, 0x83E1, 0xDDD5, 0x83E2, 0xC798, + 0x83E3, 0xC799, 0x83E4, 0xC79A, 0x83E5, 0xDDBE, 0x83E6, 0xC79B, 0x83E7, 0xC79C, 0x83E8, 0xC79D, 0x83E9, 0xC6D0, 0x83EA, 0xDDD0, + 0x83EB, 0xC79E, 0x83EC, 0xC79F, 0x83ED, 0xC7A0, 0x83EE, 0xC840, 0x83EF, 0xC841, 0x83F0, 0xDDD4, 0x83F1, 0xC1E2, 0x83F2, 0xB7C6, + 0x83F3, 0xC842, 0x83F4, 0xC843, 0x83F5, 0xC844, 0x83F6, 0xC845, 0x83F7, 0xC846, 0x83F8, 0xDDCE, 0x83F9, 0xDDCF, 0x83FA, 0xC847, + 0x83FB, 0xC848, 0x83FC, 0xC849, 0x83FD, 0xDDC4, 0x83FE, 0xC84A, 0x83FF, 0xC84B, 0x8400, 0xC84C, 0x8401, 0xDDBD, 0x8402, 0xC84D, + 0x8403, 0xDDCD, 0x8404, 0xCCD1, 0x8405, 0xC84E, 0x8406, 0xDDC9, 0x8407, 0xC84F, 0x8408, 0xC850, 0x8409, 0xC851, 0x840A, 0xC852, + 0x840B, 0xDDC2, 0x840C, 0xC3C8, 0x840D, 0xC6BC, 0x840E, 0xCEAE, 0x840F, 0xDDCC, 0x8410, 0xC853, 0x8411, 0xDDC8, 0x8412, 0xC854, + 0x8413, 0xC855, 0x8414, 0xC856, 0x8415, 0xC857, 0x8416, 0xC858, 0x8417, 0xC859, 0x8418, 0xDDC1, 0x8419, 0xC85A, 0x841A, 0xC85B, + 0x841B, 0xC85C, 0x841C, 0xDDC6, 0x841D, 0xC2DC, 0x841E, 0xC85D, 0x841F, 0xC85E, 0x8420, 0xC85F, 0x8421, 0xC860, 0x8422, 0xC861, + 0x8423, 0xC862, 0x8424, 0xD3A9, 0x8425, 0xD3AA, 0x8426, 0xDDD3, 0x8427, 0xCFF4, 0x8428, 0xC8F8, 0x8429, 0xC863, 0x842A, 0xC864, + 0x842B, 0xC865, 0x842C, 0xC866, 0x842D, 0xC867, 0x842E, 0xC868, 0x842F, 0xC869, 0x8430, 0xC86A, 0x8431, 0xDDE6, 0x8432, 0xC86B, + 0x8433, 0xC86C, 0x8434, 0xC86D, 0x8435, 0xC86E, 0x8436, 0xC86F, 0x8437, 0xC870, 0x8438, 0xDDC7, 0x8439, 0xC871, 0x843A, 0xC872, + 0x843B, 0xC873, 0x843C, 0xDDE0, 0x843D, 0xC2E4, 0x843E, 0xC874, 0x843F, 0xC875, 0x8440, 0xC876, 0x8441, 0xC877, 0x8442, 0xC878, + 0x8443, 0xC879, 0x8444, 0xC87A, 0x8445, 0xC87B, 0x8446, 0xDDE1, 0x8447, 0xC87C, 0x8448, 0xC87D, 0x8449, 0xC87E, 0x844A, 0xC880, + 0x844B, 0xC881, 0x844C, 0xC882, 0x844D, 0xC883, 0x844E, 0xC884, 0x844F, 0xC885, 0x8450, 0xC886, 0x8451, 0xDDD7, 0x8452, 0xC887, + 0x8453, 0xC888, 0x8454, 0xC889, 0x8455, 0xC88A, 0x8456, 0xC88B, 0x8457, 0xD6F8, 0x8458, 0xC88C, 0x8459, 0xDDD9, 0x845A, 0xDDD8, + 0x845B, 0xB8F0, 0x845C, 0xDDD6, 0x845D, 0xC88D, 0x845E, 0xC88E, 0x845F, 0xC88F, 0x8460, 0xC890, 0x8461, 0xC6CF, 0x8462, 0xC891, + 0x8463, 0xB6AD, 0x8464, 0xC892, 0x8465, 0xC893, 0x8466, 0xC894, 0x8467, 0xC895, 0x8468, 0xC896, 0x8469, 0xDDE2, 0x846A, 0xC897, + 0x846B, 0xBAF9, 0x846C, 0xD4E1, 0x846D, 0xDDE7, 0x846E, 0xC898, 0x846F, 0xC899, 0x8470, 0xC89A, 0x8471, 0xB4D0, 0x8472, 0xC89B, + 0x8473, 0xDDDA, 0x8474, 0xC89C, 0x8475, 0xBFFB, 0x8476, 0xDDE3, 0x8477, 0xC89D, 0x8478, 0xDDDF, 0x8479, 0xC89E, 0x847A, 0xDDDD, + 0x847B, 0xC89F, 0x847C, 0xC8A0, 0x847D, 0xC940, 0x847E, 0xC941, 0x847F, 0xC942, 0x8480, 0xC943, 0x8481, 0xC944, 0x8482, 0xB5D9, + 0x8483, 0xC945, 0x8484, 0xC946, 0x8485, 0xC947, 0x8486, 0xC948, 0x8487, 0xDDDB, 0x8488, 0xDDDC, 0x8489, 0xDDDE, 0x848A, 0xC949, + 0x848B, 0xBDAF, 0x848C, 0xDDE4, 0x848D, 0xC94A, 0x848E, 0xDDE5, 0x848F, 0xC94B, 0x8490, 0xC94C, 0x8491, 0xC94D, 0x8492, 0xC94E, + 0x8493, 0xC94F, 0x8494, 0xC950, 0x8495, 0xC951, 0x8496, 0xC952, 0x8497, 0xDDF5, 0x8498, 0xC953, 0x8499, 0xC3C9, 0x849A, 0xC954, + 0x849B, 0xC955, 0x849C, 0xCBE2, 0x849D, 0xC956, 0x849E, 0xC957, 0x849F, 0xC958, 0x84A0, 0xC959, 0x84A1, 0xDDF2, 0x84A2, 0xC95A, + 0x84A3, 0xC95B, 0x84A4, 0xC95C, 0x84A5, 0xC95D, 0x84A6, 0xC95E, 0x84A7, 0xC95F, 0x84A8, 0xC960, 0x84A9, 0xC961, 0x84AA, 0xC962, + 0x84AB, 0xC963, 0x84AC, 0xC964, 0x84AD, 0xC965, 0x84AE, 0xC966, 0x84AF, 0xD8E1, 0x84B0, 0xC967, 0x84B1, 0xC968, 0x84B2, 0xC6D1, + 0x84B3, 0xC969, 0x84B4, 0xDDF4, 0x84B5, 0xC96A, 0x84B6, 0xC96B, 0x84B7, 0xC96C, 0x84B8, 0xD5F4, 0x84B9, 0xDDF3, 0x84BA, 0xDDF0, + 0x84BB, 0xC96D, 0x84BC, 0xC96E, 0x84BD, 0xDDEC, 0x84BE, 0xC96F, 0x84BF, 0xDDEF, 0x84C0, 0xC970, 0x84C1, 0xDDE8, 0x84C2, 0xC971, + 0x84C3, 0xC972, 0x84C4, 0xD0EE, 0x84C5, 0xC973, 0x84C6, 0xC974, 0x84C7, 0xC975, 0x84C8, 0xC976, 0x84C9, 0xC8D8, 0x84CA, 0xDDEE, + 0x84CB, 0xC977, 0x84CC, 0xC978, 0x84CD, 0xDDE9, 0x84CE, 0xC979, 0x84CF, 0xC97A, 0x84D0, 0xDDEA, 0x84D1, 0xCBF2, 0x84D2, 0xC97B, + 0x84D3, 0xDDED, 0x84D4, 0xC97C, 0x84D5, 0xC97D, 0x84D6, 0xB1CD, 0x84D7, 0xC97E, 0x84D8, 0xC980, 0x84D9, 0xC981, 0x84DA, 0xC982, + 0x84DB, 0xC983, 0x84DC, 0xC984, 0x84DD, 0xC0B6, 0x84DE, 0xC985, 0x84DF, 0xBCBB, 0x84E0, 0xDDF1, 0x84E1, 0xC986, 0x84E2, 0xC987, + 0x84E3, 0xDDF7, 0x84E4, 0xC988, 0x84E5, 0xDDF6, 0x84E6, 0xDDEB, 0x84E7, 0xC989, 0x84E8, 0xC98A, 0x84E9, 0xC98B, 0x84EA, 0xC98C, + 0x84EB, 0xC98D, 0x84EC, 0xC5EE, 0x84ED, 0xC98E, 0x84EE, 0xC98F, 0x84EF, 0xC990, 0x84F0, 0xDDFB, 0x84F1, 0xC991, 0x84F2, 0xC992, + 0x84F3, 0xC993, 0x84F4, 0xC994, 0x84F5, 0xC995, 0x84F6, 0xC996, 0x84F7, 0xC997, 0x84F8, 0xC998, 0x84F9, 0xC999, 0x84FA, 0xC99A, + 0x84FB, 0xC99B, 0x84FC, 0xDEA4, 0x84FD, 0xC99C, 0x84FE, 0xC99D, 0x84FF, 0xDEA3, 0x8500, 0xC99E, 0x8501, 0xC99F, 0x8502, 0xC9A0, + 0x8503, 0xCA40, 0x8504, 0xCA41, 0x8505, 0xCA42, 0x8506, 0xCA43, 0x8507, 0xCA44, 0x8508, 0xCA45, 0x8509, 0xCA46, 0x850A, 0xCA47, + 0x850B, 0xCA48, 0x850C, 0xDDF8, 0x850D, 0xCA49, 0x850E, 0xCA4A, 0x850F, 0xCA4B, 0x8510, 0xCA4C, 0x8511, 0xC3EF, 0x8512, 0xCA4D, + 0x8513, 0xC2FB, 0x8514, 0xCA4E, 0x8515, 0xCA4F, 0x8516, 0xCA50, 0x8517, 0xD5E1, 0x8518, 0xCA51, 0x8519, 0xCA52, 0x851A, 0xCEB5, + 0x851B, 0xCA53, 0x851C, 0xCA54, 0x851D, 0xCA55, 0x851E, 0xCA56, 0x851F, 0xDDFD, 0x8520, 0xCA57, 0x8521, 0xB2CC, 0x8522, 0xCA58, + 0x8523, 0xCA59, 0x8524, 0xCA5A, 0x8525, 0xCA5B, 0x8526, 0xCA5C, 0x8527, 0xCA5D, 0x8528, 0xCA5E, 0x8529, 0xCA5F, 0x852A, 0xCA60, + 0x852B, 0xC4E8, 0x852C, 0xCADF, 0x852D, 0xCA61, 0x852E, 0xCA62, 0x852F, 0xCA63, 0x8530, 0xCA64, 0x8531, 0xCA65, 0x8532, 0xCA66, + 0x8533, 0xCA67, 0x8534, 0xCA68, 0x8535, 0xCA69, 0x8536, 0xCA6A, 0x8537, 0xC7BE, 0x8538, 0xDDFA, 0x8539, 0xDDFC, 0x853A, 0xDDFE, + 0x853B, 0xDEA2, 0x853C, 0xB0AA, 0x853D, 0xB1CE, 0x853E, 0xCA6B, 0x853F, 0xCA6C, 0x8540, 0xCA6D, 0x8541, 0xCA6E, 0x8542, 0xCA6F, + 0x8543, 0xDEAC, 0x8544, 0xCA70, 0x8545, 0xCA71, 0x8546, 0xCA72, 0x8547, 0xCA73, 0x8548, 0xDEA6, 0x8549, 0xBDB6, 0x854A, 0xC8EF, + 0x854B, 0xCA74, 0x854C, 0xCA75, 0x854D, 0xCA76, 0x854E, 0xCA77, 0x854F, 0xCA78, 0x8550, 0xCA79, 0x8551, 0xCA7A, 0x8552, 0xCA7B, + 0x8553, 0xCA7C, 0x8554, 0xCA7D, 0x8555, 0xCA7E, 0x8556, 0xDEA1, 0x8557, 0xCA80, 0x8558, 0xCA81, 0x8559, 0xDEA5, 0x855A, 0xCA82, + 0x855B, 0xCA83, 0x855C, 0xCA84, 0x855D, 0xCA85, 0x855E, 0xDEA9, 0x855F, 0xCA86, 0x8560, 0xCA87, 0x8561, 0xCA88, 0x8562, 0xCA89, + 0x8563, 0xCA8A, 0x8564, 0xDEA8, 0x8565, 0xCA8B, 0x8566, 0xCA8C, 0x8567, 0xCA8D, 0x8568, 0xDEA7, 0x8569, 0xCA8E, 0x856A, 0xCA8F, + 0x856B, 0xCA90, 0x856C, 0xCA91, 0x856D, 0xCA92, 0x856E, 0xCA93, 0x856F, 0xCA94, 0x8570, 0xCA95, 0x8571, 0xCA96, 0x8572, 0xDEAD, + 0x8573, 0xCA97, 0x8574, 0xD4CC, 0x8575, 0xCA98, 0x8576, 0xCA99, 0x8577, 0xCA9A, 0x8578, 0xCA9B, 0x8579, 0xDEB3, 0x857A, 0xDEAA, + 0x857B, 0xDEAE, 0x857C, 0xCA9C, 0x857D, 0xCA9D, 0x857E, 0xC0D9, 0x857F, 0xCA9E, 0x8580, 0xCA9F, 0x8581, 0xCAA0, 0x8582, 0xCB40, + 0x8583, 0xCB41, 0x8584, 0xB1A1, 0x8585, 0xDEB6, 0x8586, 0xCB42, 0x8587, 0xDEB1, 0x8588, 0xCB43, 0x8589, 0xCB44, 0x858A, 0xCB45, + 0x858B, 0xCB46, 0x858C, 0xCB47, 0x858D, 0xCB48, 0x858E, 0xCB49, 0x858F, 0xDEB2, 0x8590, 0xCB4A, 0x8591, 0xCB4B, 0x8592, 0xCB4C, + 0x8593, 0xCB4D, 0x8594, 0xCB4E, 0x8595, 0xCB4F, 0x8596, 0xCB50, 0x8597, 0xCB51, 0x8598, 0xCB52, 0x8599, 0xCB53, 0x859A, 0xCB54, + 0x859B, 0xD1A6, 0x859C, 0xDEB5, 0x859D, 0xCB55, 0x859E, 0xCB56, 0x859F, 0xCB57, 0x85A0, 0xCB58, 0x85A1, 0xCB59, 0x85A2, 0xCB5A, + 0x85A3, 0xCB5B, 0x85A4, 0xDEAF, 0x85A5, 0xCB5C, 0x85A6, 0xCB5D, 0x85A7, 0xCB5E, 0x85A8, 0xDEB0, 0x85A9, 0xCB5F, 0x85AA, 0xD0BD, + 0x85AB, 0xCB60, 0x85AC, 0xCB61, 0x85AD, 0xCB62, 0x85AE, 0xDEB4, 0x85AF, 0xCAED, 0x85B0, 0xDEB9, 0x85B1, 0xCB63, 0x85B2, 0xCB64, + 0x85B3, 0xCB65, 0x85B4, 0xCB66, 0x85B5, 0xCB67, 0x85B6, 0xCB68, 0x85B7, 0xDEB8, 0x85B8, 0xCB69, 0x85B9, 0xDEB7, 0x85BA, 0xCB6A, + 0x85BB, 0xCB6B, 0x85BC, 0xCB6C, 0x85BD, 0xCB6D, 0x85BE, 0xCB6E, 0x85BF, 0xCB6F, 0x85C0, 0xCB70, 0x85C1, 0xDEBB, 0x85C2, 0xCB71, + 0x85C3, 0xCB72, 0x85C4, 0xCB73, 0x85C5, 0xCB74, 0x85C6, 0xCB75, 0x85C7, 0xCB76, 0x85C8, 0xCB77, 0x85C9, 0xBDE5, 0x85CA, 0xCB78, + 0x85CB, 0xCB79, 0x85CC, 0xCB7A, 0x85CD, 0xCB7B, 0x85CE, 0xCB7C, 0x85CF, 0xB2D8, 0x85D0, 0xC3EA, 0x85D1, 0xCB7D, 0x85D2, 0xCB7E, + 0x85D3, 0xDEBA, 0x85D4, 0xCB80, 0x85D5, 0xC5BA, 0x85D6, 0xCB81, 0x85D7, 0xCB82, 0x85D8, 0xCB83, 0x85D9, 0xCB84, 0x85DA, 0xCB85, + 0x85DB, 0xCB86, 0x85DC, 0xDEBC, 0x85DD, 0xCB87, 0x85DE, 0xCB88, 0x85DF, 0xCB89, 0x85E0, 0xCB8A, 0x85E1, 0xCB8B, 0x85E2, 0xCB8C, + 0x85E3, 0xCB8D, 0x85E4, 0xCCD9, 0x85E5, 0xCB8E, 0x85E6, 0xCB8F, 0x85E7, 0xCB90, 0x85E8, 0xCB91, 0x85E9, 0xB7AA, 0x85EA, 0xCB92, + 0x85EB, 0xCB93, 0x85EC, 0xCB94, 0x85ED, 0xCB95, 0x85EE, 0xCB96, 0x85EF, 0xCB97, 0x85F0, 0xCB98, 0x85F1, 0xCB99, 0x85F2, 0xCB9A, + 0x85F3, 0xCB9B, 0x85F4, 0xCB9C, 0x85F5, 0xCB9D, 0x85F6, 0xCB9E, 0x85F7, 0xCB9F, 0x85F8, 0xCBA0, 0x85F9, 0xCC40, 0x85FA, 0xCC41, + 0x85FB, 0xD4E5, 0x85FC, 0xCC42, 0x85FD, 0xCC43, 0x85FE, 0xCC44, 0x85FF, 0xDEBD, 0x8600, 0xCC45, 0x8601, 0xCC46, 0x8602, 0xCC47, + 0x8603, 0xCC48, 0x8604, 0xCC49, 0x8605, 0xDEBF, 0x8606, 0xCC4A, 0x8607, 0xCC4B, 0x8608, 0xCC4C, 0x8609, 0xCC4D, 0x860A, 0xCC4E, + 0x860B, 0xCC4F, 0x860C, 0xCC50, 0x860D, 0xCC51, 0x860E, 0xCC52, 0x860F, 0xCC53, 0x8610, 0xCC54, 0x8611, 0xC4A2, 0x8612, 0xCC55, + 0x8613, 0xCC56, 0x8614, 0xCC57, 0x8615, 0xCC58, 0x8616, 0xDEC1, 0x8617, 0xCC59, 0x8618, 0xCC5A, 0x8619, 0xCC5B, 0x861A, 0xCC5C, + 0x861B, 0xCC5D, 0x861C, 0xCC5E, 0x861D, 0xCC5F, 0x861E, 0xCC60, 0x861F, 0xCC61, 0x8620, 0xCC62, 0x8621, 0xCC63, 0x8622, 0xCC64, + 0x8623, 0xCC65, 0x8624, 0xCC66, 0x8625, 0xCC67, 0x8626, 0xCC68, 0x8627, 0xDEBE, 0x8628, 0xCC69, 0x8629, 0xDEC0, 0x862A, 0xCC6A, + 0x862B, 0xCC6B, 0x862C, 0xCC6C, 0x862D, 0xCC6D, 0x862E, 0xCC6E, 0x862F, 0xCC6F, 0x8630, 0xCC70, 0x8631, 0xCC71, 0x8632, 0xCC72, + 0x8633, 0xCC73, 0x8634, 0xCC74, 0x8635, 0xCC75, 0x8636, 0xCC76, 0x8637, 0xCC77, 0x8638, 0xD5BA, 0x8639, 0xCC78, 0x863A, 0xCC79, + 0x863B, 0xCC7A, 0x863C, 0xDEC2, 0x863D, 0xCC7B, 0x863E, 0xCC7C, 0x863F, 0xCC7D, 0x8640, 0xCC7E, 0x8641, 0xCC80, 0x8642, 0xCC81, + 0x8643, 0xCC82, 0x8644, 0xCC83, 0x8645, 0xCC84, 0x8646, 0xCC85, 0x8647, 0xCC86, 0x8648, 0xCC87, 0x8649, 0xCC88, 0x864A, 0xCC89, + 0x864B, 0xCC8A, 0x864C, 0xCC8B, 0x864D, 0xF2AE, 0x864E, 0xBBA2, 0x864F, 0xC2B2, 0x8650, 0xC5B0, 0x8651, 0xC2C7, 0x8652, 0xCC8C, + 0x8653, 0xCC8D, 0x8654, 0xF2AF, 0x8655, 0xCC8E, 0x8656, 0xCC8F, 0x8657, 0xCC90, 0x8658, 0xCC91, 0x8659, 0xCC92, 0x865A, 0xD0E9, + 0x865B, 0xCC93, 0x865C, 0xCC94, 0x865D, 0xCC95, 0x865E, 0xD3DD, 0x865F, 0xCC96, 0x8660, 0xCC97, 0x8661, 0xCC98, 0x8662, 0xEBBD, + 0x8663, 0xCC99, 0x8664, 0xCC9A, 0x8665, 0xCC9B, 0x8666, 0xCC9C, 0x8667, 0xCC9D, 0x8668, 0xCC9E, 0x8669, 0xCC9F, 0x866A, 0xCCA0, + 0x866B, 0xB3E6, 0x866C, 0xF2B0, 0x866D, 0xCD40, 0x866E, 0xF2B1, 0x866F, 0xCD41, 0x8670, 0xCD42, 0x8671, 0xCAAD, 0x8672, 0xCD43, + 0x8673, 0xCD44, 0x8674, 0xCD45, 0x8675, 0xCD46, 0x8676, 0xCD47, 0x8677, 0xCD48, 0x8678, 0xCD49, 0x8679, 0xBAE7, 0x867A, 0xF2B3, + 0x867B, 0xF2B5, 0x867C, 0xF2B4, 0x867D, 0xCBE4, 0x867E, 0xCFBA, 0x867F, 0xF2B2, 0x8680, 0xCAB4, 0x8681, 0xD2CF, 0x8682, 0xC2EC, + 0x8683, 0xCD4A, 0x8684, 0xCD4B, 0x8685, 0xCD4C, 0x8686, 0xCD4D, 0x8687, 0xCD4E, 0x8688, 0xCD4F, 0x8689, 0xCD50, 0x868A, 0xCEC3, + 0x868B, 0xF2B8, 0x868C, 0xB0F6, 0x868D, 0xF2B7, 0x868E, 0xCD51, 0x868F, 0xCD52, 0x8690, 0xCD53, 0x8691, 0xCD54, 0x8692, 0xCD55, + 0x8693, 0xF2BE, 0x8694, 0xCD56, 0x8695, 0xB2CF, 0x8696, 0xCD57, 0x8697, 0xCD58, 0x8698, 0xCD59, 0x8699, 0xCD5A, 0x869A, 0xCD5B, + 0x869B, 0xCD5C, 0x869C, 0xD1C1, 0x869D, 0xF2BA, 0x869E, 0xCD5D, 0x869F, 0xCD5E, 0x86A0, 0xCD5F, 0x86A1, 0xCD60, 0x86A2, 0xCD61, + 0x86A3, 0xF2BC, 0x86A4, 0xD4E9, 0x86A5, 0xCD62, 0x86A6, 0xCD63, 0x86A7, 0xF2BB, 0x86A8, 0xF2B6, 0x86A9, 0xF2BF, 0x86AA, 0xF2BD, + 0x86AB, 0xCD64, 0x86AC, 0xF2B9, 0x86AD, 0xCD65, 0x86AE, 0xCD66, 0x86AF, 0xF2C7, 0x86B0, 0xF2C4, 0x86B1, 0xF2C6, 0x86B2, 0xCD67, + 0x86B3, 0xCD68, 0x86B4, 0xF2CA, 0x86B5, 0xF2C2, 0x86B6, 0xF2C0, 0x86B7, 0xCD69, 0x86B8, 0xCD6A, 0x86B9, 0xCD6B, 0x86BA, 0xF2C5, + 0x86BB, 0xCD6C, 0x86BC, 0xCD6D, 0x86BD, 0xCD6E, 0x86BE, 0xCD6F, 0x86BF, 0xCD70, 0x86C0, 0xD6FB, 0x86C1, 0xCD71, 0x86C2, 0xCD72, + 0x86C3, 0xCD73, 0x86C4, 0xF2C1, 0x86C5, 0xCD74, 0x86C6, 0xC7F9, 0x86C7, 0xC9DF, 0x86C8, 0xCD75, 0x86C9, 0xF2C8, 0x86CA, 0xB9C6, + 0x86CB, 0xB5B0, 0x86CC, 0xCD76, 0x86CD, 0xCD77, 0x86CE, 0xF2C3, 0x86CF, 0xF2C9, 0x86D0, 0xF2D0, 0x86D1, 0xF2D6, 0x86D2, 0xCD78, + 0x86D3, 0xCD79, 0x86D4, 0xBBD7, 0x86D5, 0xCD7A, 0x86D6, 0xCD7B, 0x86D7, 0xCD7C, 0x86D8, 0xF2D5, 0x86D9, 0xCDDC, 0x86DA, 0xCD7D, + 0x86DB, 0xD6EB, 0x86DC, 0xCD7E, 0x86DD, 0xCD80, 0x86DE, 0xF2D2, 0x86DF, 0xF2D4, 0x86E0, 0xCD81, 0x86E1, 0xCD82, 0x86E2, 0xCD83, + 0x86E3, 0xCD84, 0x86E4, 0xB8F2, 0x86E5, 0xCD85, 0x86E6, 0xCD86, 0x86E7, 0xCD87, 0x86E8, 0xCD88, 0x86E9, 0xF2CB, 0x86EA, 0xCD89, + 0x86EB, 0xCD8A, 0x86EC, 0xCD8B, 0x86ED, 0xF2CE, 0x86EE, 0xC2F9, 0x86EF, 0xCD8C, 0x86F0, 0xD5DD, 0x86F1, 0xF2CC, 0x86F2, 0xF2CD, + 0x86F3, 0xF2CF, 0x86F4, 0xF2D3, 0x86F5, 0xCD8D, 0x86F6, 0xCD8E, 0x86F7, 0xCD8F, 0x86F8, 0xF2D9, 0x86F9, 0xD3BC, 0x86FA, 0xCD90, + 0x86FB, 0xCD91, 0x86FC, 0xCD92, 0x86FD, 0xCD93, 0x86FE, 0xB6EA, 0x86FF, 0xCD94, 0x8700, 0xCAF1, 0x8701, 0xCD95, 0x8702, 0xB7E4, + 0x8703, 0xF2D7, 0x8704, 0xCD96, 0x8705, 0xCD97, 0x8706, 0xCD98, 0x8707, 0xF2D8, 0x8708, 0xF2DA, 0x8709, 0xF2DD, 0x870A, 0xF2DB, + 0x870B, 0xCD99, 0x870C, 0xCD9A, 0x870D, 0xF2DC, 0x870E, 0xCD9B, 0x870F, 0xCD9C, 0x8710, 0xCD9D, 0x8711, 0xCD9E, 0x8712, 0xD1D1, + 0x8713, 0xF2D1, 0x8714, 0xCD9F, 0x8715, 0xCDC9, 0x8716, 0xCDA0, 0x8717, 0xCECF, 0x8718, 0xD6A9, 0x8719, 0xCE40, 0x871A, 0xF2E3, + 0x871B, 0xCE41, 0x871C, 0xC3DB, 0x871D, 0xCE42, 0x871E, 0xF2E0, 0x871F, 0xCE43, 0x8720, 0xCE44, 0x8721, 0xC0AF, 0x8722, 0xF2EC, + 0x8723, 0xF2DE, 0x8724, 0xCE45, 0x8725, 0xF2E1, 0x8726, 0xCE46, 0x8727, 0xCE47, 0x8728, 0xCE48, 0x8729, 0xF2E8, 0x872A, 0xCE49, + 0x872B, 0xCE4A, 0x872C, 0xCE4B, 0x872D, 0xCE4C, 0x872E, 0xF2E2, 0x872F, 0xCE4D, 0x8730, 0xCE4E, 0x8731, 0xF2E7, 0x8732, 0xCE4F, + 0x8733, 0xCE50, 0x8734, 0xF2E6, 0x8735, 0xCE51, 0x8736, 0xCE52, 0x8737, 0xF2E9, 0x8738, 0xCE53, 0x8739, 0xCE54, 0x873A, 0xCE55, + 0x873B, 0xF2DF, 0x873C, 0xCE56, 0x873D, 0xCE57, 0x873E, 0xF2E4, 0x873F, 0xF2EA, 0x8740, 0xCE58, 0x8741, 0xCE59, 0x8742, 0xCE5A, + 0x8743, 0xCE5B, 0x8744, 0xCE5C, 0x8745, 0xCE5D, 0x8746, 0xCE5E, 0x8747, 0xD3AC, 0x8748, 0xF2E5, 0x8749, 0xB2F5, 0x874A, 0xCE5F, + 0x874B, 0xCE60, 0x874C, 0xF2F2, 0x874D, 0xCE61, 0x874E, 0xD0AB, 0x874F, 0xCE62, 0x8750, 0xCE63, 0x8751, 0xCE64, 0x8752, 0xCE65, + 0x8753, 0xF2F5, 0x8754, 0xCE66, 0x8755, 0xCE67, 0x8756, 0xCE68, 0x8757, 0xBBC8, 0x8758, 0xCE69, 0x8759, 0xF2F9, 0x875A, 0xCE6A, + 0x875B, 0xCE6B, 0x875C, 0xCE6C, 0x875D, 0xCE6D, 0x875E, 0xCE6E, 0x875F, 0xCE6F, 0x8760, 0xF2F0, 0x8761, 0xCE70, 0x8762, 0xCE71, + 0x8763, 0xF2F6, 0x8764, 0xF2F8, 0x8765, 0xF2FA, 0x8766, 0xCE72, 0x8767, 0xCE73, 0x8768, 0xCE74, 0x8769, 0xCE75, 0x876A, 0xCE76, + 0x876B, 0xCE77, 0x876C, 0xCE78, 0x876D, 0xCE79, 0x876E, 0xF2F3, 0x876F, 0xCE7A, 0x8770, 0xF2F1, 0x8771, 0xCE7B, 0x8772, 0xCE7C, + 0x8773, 0xCE7D, 0x8774, 0xBAFB, 0x8775, 0xCE7E, 0x8776, 0xB5FB, 0x8777, 0xCE80, 0x8778, 0xCE81, 0x8779, 0xCE82, 0x877A, 0xCE83, + 0x877B, 0xF2EF, 0x877C, 0xF2F7, 0x877D, 0xF2ED, 0x877E, 0xF2EE, 0x877F, 0xCE84, 0x8780, 0xCE85, 0x8781, 0xCE86, 0x8782, 0xF2EB, + 0x8783, 0xF3A6, 0x8784, 0xCE87, 0x8785, 0xF3A3, 0x8786, 0xCE88, 0x8787, 0xCE89, 0x8788, 0xF3A2, 0x8789, 0xCE8A, 0x878A, 0xCE8B, + 0x878B, 0xF2F4, 0x878C, 0xCE8C, 0x878D, 0xC8DA, 0x878E, 0xCE8D, 0x878F, 0xCE8E, 0x8790, 0xCE8F, 0x8791, 0xCE90, 0x8792, 0xCE91, + 0x8793, 0xF2FB, 0x8794, 0xCE92, 0x8795, 0xCE93, 0x8796, 0xCE94, 0x8797, 0xF3A5, 0x8798, 0xCE95, 0x8799, 0xCE96, 0x879A, 0xCE97, + 0x879B, 0xCE98, 0x879C, 0xCE99, 0x879D, 0xCE9A, 0x879E, 0xCE9B, 0x879F, 0xC3F8, 0x87A0, 0xCE9C, 0x87A1, 0xCE9D, 0x87A2, 0xCE9E, + 0x87A3, 0xCE9F, 0x87A4, 0xCEA0, 0x87A5, 0xCF40, 0x87A6, 0xCF41, 0x87A7, 0xCF42, 0x87A8, 0xF2FD, 0x87A9, 0xCF43, 0x87AA, 0xCF44, + 0x87AB, 0xF3A7, 0x87AC, 0xF3A9, 0x87AD, 0xF3A4, 0x87AE, 0xCF45, 0x87AF, 0xF2FC, 0x87B0, 0xCF46, 0x87B1, 0xCF47, 0x87B2, 0xCF48, + 0x87B3, 0xF3AB, 0x87B4, 0xCF49, 0x87B5, 0xF3AA, 0x87B6, 0xCF4A, 0x87B7, 0xCF4B, 0x87B8, 0xCF4C, 0x87B9, 0xCF4D, 0x87BA, 0xC2DD, + 0x87BB, 0xCF4E, 0x87BC, 0xCF4F, 0x87BD, 0xF3AE, 0x87BE, 0xCF50, 0x87BF, 0xCF51, 0x87C0, 0xF3B0, 0x87C1, 0xCF52, 0x87C2, 0xCF53, + 0x87C3, 0xCF54, 0x87C4, 0xCF55, 0x87C5, 0xCF56, 0x87C6, 0xF3A1, 0x87C7, 0xCF57, 0x87C8, 0xCF58, 0x87C9, 0xCF59, 0x87CA, 0xF3B1, + 0x87CB, 0xF3AC, 0x87CC, 0xCF5A, 0x87CD, 0xCF5B, 0x87CE, 0xCF5C, 0x87CF, 0xCF5D, 0x87D0, 0xCF5E, 0x87D1, 0xF3AF, 0x87D2, 0xF2FE, + 0x87D3, 0xF3AD, 0x87D4, 0xCF5F, 0x87D5, 0xCF60, 0x87D6, 0xCF61, 0x87D7, 0xCF62, 0x87D8, 0xCF63, 0x87D9, 0xCF64, 0x87DA, 0xCF65, + 0x87DB, 0xF3B2, 0x87DC, 0xCF66, 0x87DD, 0xCF67, 0x87DE, 0xCF68, 0x87DF, 0xCF69, 0x87E0, 0xF3B4, 0x87E1, 0xCF6A, 0x87E2, 0xCF6B, + 0x87E3, 0xCF6C, 0x87E4, 0xCF6D, 0x87E5, 0xF3A8, 0x87E6, 0xCF6E, 0x87E7, 0xCF6F, 0x87E8, 0xCF70, 0x87E9, 0xCF71, 0x87EA, 0xF3B3, + 0x87EB, 0xCF72, 0x87EC, 0xCF73, 0x87ED, 0xCF74, 0x87EE, 0xF3B5, 0x87EF, 0xCF75, 0x87F0, 0xCF76, 0x87F1, 0xCF77, 0x87F2, 0xCF78, + 0x87F3, 0xCF79, 0x87F4, 0xCF7A, 0x87F5, 0xCF7B, 0x87F6, 0xCF7C, 0x87F7, 0xCF7D, 0x87F8, 0xCF7E, 0x87F9, 0xD0B7, 0x87FA, 0xCF80, + 0x87FB, 0xCF81, 0x87FC, 0xCF82, 0x87FD, 0xCF83, 0x87FE, 0xF3B8, 0x87FF, 0xCF84, 0x8800, 0xCF85, 0x8801, 0xCF86, 0x8802, 0xCF87, + 0x8803, 0xD9F9, 0x8804, 0xCF88, 0x8805, 0xCF89, 0x8806, 0xCF8A, 0x8807, 0xCF8B, 0x8808, 0xCF8C, 0x8809, 0xCF8D, 0x880A, 0xF3B9, + 0x880B, 0xCF8E, 0x880C, 0xCF8F, 0x880D, 0xCF90, 0x880E, 0xCF91, 0x880F, 0xCF92, 0x8810, 0xCF93, 0x8811, 0xCF94, 0x8812, 0xCF95, + 0x8813, 0xF3B7, 0x8814, 0xCF96, 0x8815, 0xC8E4, 0x8816, 0xF3B6, 0x8817, 0xCF97, 0x8818, 0xCF98, 0x8819, 0xCF99, 0x881A, 0xCF9A, + 0x881B, 0xF3BA, 0x881C, 0xCF9B, 0x881D, 0xCF9C, 0x881E, 0xCF9D, 0x881F, 0xCF9E, 0x8820, 0xCF9F, 0x8821, 0xF3BB, 0x8822, 0xB4C0, + 0x8823, 0xCFA0, 0x8824, 0xD040, 0x8825, 0xD041, 0x8826, 0xD042, 0x8827, 0xD043, 0x8828, 0xD044, 0x8829, 0xD045, 0x882A, 0xD046, + 0x882B, 0xD047, 0x882C, 0xD048, 0x882D, 0xD049, 0x882E, 0xD04A, 0x882F, 0xD04B, 0x8830, 0xD04C, 0x8831, 0xD04D, 0x8832, 0xEEC3, + 0x8833, 0xD04E, 0x8834, 0xD04F, 0x8835, 0xD050, 0x8836, 0xD051, 0x8837, 0xD052, 0x8838, 0xD053, 0x8839, 0xF3BC, 0x883A, 0xD054, + 0x883B, 0xD055, 0x883C, 0xF3BD, 0x883D, 0xD056, 0x883E, 0xD057, 0x883F, 0xD058, 0x8840, 0xD1AA, 0x8841, 0xD059, 0x8842, 0xD05A, + 0x8843, 0xD05B, 0x8844, 0xF4AC, 0x8845, 0xD0C6, 0x8846, 0xD05C, 0x8847, 0xD05D, 0x8848, 0xD05E, 0x8849, 0xD05F, 0x884A, 0xD060, + 0x884B, 0xD061, 0x884C, 0xD0D0, 0x884D, 0xD1DC, 0x884E, 0xD062, 0x884F, 0xD063, 0x8850, 0xD064, 0x8851, 0xD065, 0x8852, 0xD066, + 0x8853, 0xD067, 0x8854, 0xCFCE, 0x8855, 0xD068, 0x8856, 0xD069, 0x8857, 0xBDD6, 0x8858, 0xD06A, 0x8859, 0xD1C3, 0x885A, 0xD06B, + 0x885B, 0xD06C, 0x885C, 0xD06D, 0x885D, 0xD06E, 0x885E, 0xD06F, 0x885F, 0xD070, 0x8860, 0xD071, 0x8861, 0xBAE2, 0x8862, 0xE1E9, + 0x8863, 0xD2C2, 0x8864, 0xF1C2, 0x8865, 0xB2B9, 0x8866, 0xD072, 0x8867, 0xD073, 0x8868, 0xB1ED, 0x8869, 0xF1C3, 0x886A, 0xD074, + 0x886B, 0xC9C0, 0x886C, 0xB3C4, 0x886D, 0xD075, 0x886E, 0xD9F2, 0x886F, 0xD076, 0x8870, 0xCBA5, 0x8871, 0xD077, 0x8872, 0xF1C4, + 0x8873, 0xD078, 0x8874, 0xD079, 0x8875, 0xD07A, 0x8876, 0xD07B, 0x8877, 0xD6D4, 0x8878, 0xD07C, 0x8879, 0xD07D, 0x887A, 0xD07E, + 0x887B, 0xD080, 0x887C, 0xD081, 0x887D, 0xF1C5, 0x887E, 0xF4C0, 0x887F, 0xF1C6, 0x8880, 0xD082, 0x8881, 0xD4AC, 0x8882, 0xF1C7, + 0x8883, 0xD083, 0x8884, 0xB0C0, 0x8885, 0xF4C1, 0x8886, 0xD084, 0x8887, 0xD085, 0x8888, 0xF4C2, 0x8889, 0xD086, 0x888A, 0xD087, + 0x888B, 0xB4FC, 0x888C, 0xD088, 0x888D, 0xC5DB, 0x888E, 0xD089, 0x888F, 0xD08A, 0x8890, 0xD08B, 0x8891, 0xD08C, 0x8892, 0xCCBB, + 0x8893, 0xD08D, 0x8894, 0xD08E, 0x8895, 0xD08F, 0x8896, 0xD0E4, 0x8897, 0xD090, 0x8898, 0xD091, 0x8899, 0xD092, 0x889A, 0xD093, + 0x889B, 0xD094, 0x889C, 0xCDE0, 0x889D, 0xD095, 0x889E, 0xD096, 0x889F, 0xD097, 0x88A0, 0xD098, 0x88A1, 0xD099, 0x88A2, 0xF1C8, + 0x88A3, 0xD09A, 0x88A4, 0xD9F3, 0x88A5, 0xD09B, 0x88A6, 0xD09C, 0x88A7, 0xD09D, 0x88A8, 0xD09E, 0x88A9, 0xD09F, 0x88AA, 0xD0A0, + 0x88AB, 0xB1BB, 0x88AC, 0xD140, 0x88AD, 0xCFAE, 0x88AE, 0xD141, 0x88AF, 0xD142, 0x88B0, 0xD143, 0x88B1, 0xB8A4, 0x88B2, 0xD144, + 0x88B3, 0xD145, 0x88B4, 0xD146, 0x88B5, 0xD147, 0x88B6, 0xD148, 0x88B7, 0xF1CA, 0x88B8, 0xD149, 0x88B9, 0xD14A, 0x88BA, 0xD14B, + 0x88BB, 0xD14C, 0x88BC, 0xF1CB, 0x88BD, 0xD14D, 0x88BE, 0xD14E, 0x88BF, 0xD14F, 0x88C0, 0xD150, 0x88C1, 0xB2C3, 0x88C2, 0xC1D1, + 0x88C3, 0xD151, 0x88C4, 0xD152, 0x88C5, 0xD7B0, 0x88C6, 0xF1C9, 0x88C7, 0xD153, 0x88C8, 0xD154, 0x88C9, 0xF1CC, 0x88CA, 0xD155, + 0x88CB, 0xD156, 0x88CC, 0xD157, 0x88CD, 0xD158, 0x88CE, 0xF1CE, 0x88CF, 0xD159, 0x88D0, 0xD15A, 0x88D1, 0xD15B, 0x88D2, 0xD9F6, + 0x88D3, 0xD15C, 0x88D4, 0xD2E1, 0x88D5, 0xD4A3, 0x88D6, 0xD15D, 0x88D7, 0xD15E, 0x88D8, 0xF4C3, 0x88D9, 0xC8B9, 0x88DA, 0xD15F, + 0x88DB, 0xD160, 0x88DC, 0xD161, 0x88DD, 0xD162, 0x88DE, 0xD163, 0x88DF, 0xF4C4, 0x88E0, 0xD164, 0x88E1, 0xD165, 0x88E2, 0xF1CD, + 0x88E3, 0xF1CF, 0x88E4, 0xBFE3, 0x88E5, 0xF1D0, 0x88E6, 0xD166, 0x88E7, 0xD167, 0x88E8, 0xF1D4, 0x88E9, 0xD168, 0x88EA, 0xD169, + 0x88EB, 0xD16A, 0x88EC, 0xD16B, 0x88ED, 0xD16C, 0x88EE, 0xD16D, 0x88EF, 0xD16E, 0x88F0, 0xF1D6, 0x88F1, 0xF1D1, 0x88F2, 0xD16F, + 0x88F3, 0xC9D1, 0x88F4, 0xC5E1, 0x88F5, 0xD170, 0x88F6, 0xD171, 0x88F7, 0xD172, 0x88F8, 0xC2E3, 0x88F9, 0xB9FC, 0x88FA, 0xD173, + 0x88FB, 0xD174, 0x88FC, 0xF1D3, 0x88FD, 0xD175, 0x88FE, 0xF1D5, 0x88FF, 0xD176, 0x8900, 0xD177, 0x8901, 0xD178, 0x8902, 0xB9D3, + 0x8903, 0xD179, 0x8904, 0xD17A, 0x8905, 0xD17B, 0x8906, 0xD17C, 0x8907, 0xD17D, 0x8908, 0xD17E, 0x8909, 0xD180, 0x890A, 0xF1DB, + 0x890B, 0xD181, 0x890C, 0xD182, 0x890D, 0xD183, 0x890E, 0xD184, 0x890F, 0xD185, 0x8910, 0xBAD6, 0x8911, 0xD186, 0x8912, 0xB0FD, + 0x8913, 0xF1D9, 0x8914, 0xD187, 0x8915, 0xD188, 0x8916, 0xD189, 0x8917, 0xD18A, 0x8918, 0xD18B, 0x8919, 0xF1D8, 0x891A, 0xF1D2, + 0x891B, 0xF1DA, 0x891C, 0xD18C, 0x891D, 0xD18D, 0x891E, 0xD18E, 0x891F, 0xD18F, 0x8920, 0xD190, 0x8921, 0xF1D7, 0x8922, 0xD191, + 0x8923, 0xD192, 0x8924, 0xD193, 0x8925, 0xC8EC, 0x8926, 0xD194, 0x8927, 0xD195, 0x8928, 0xD196, 0x8929, 0xD197, 0x892A, 0xCDCA, + 0x892B, 0xF1DD, 0x892C, 0xD198, 0x892D, 0xD199, 0x892E, 0xD19A, 0x892F, 0xD19B, 0x8930, 0xE5BD, 0x8931, 0xD19C, 0x8932, 0xD19D, + 0x8933, 0xD19E, 0x8934, 0xF1DC, 0x8935, 0xD19F, 0x8936, 0xF1DE, 0x8937, 0xD1A0, 0x8938, 0xD240, 0x8939, 0xD241, 0x893A, 0xD242, + 0x893B, 0xD243, 0x893C, 0xD244, 0x893D, 0xD245, 0x893E, 0xD246, 0x893F, 0xD247, 0x8940, 0xD248, 0x8941, 0xF1DF, 0x8942, 0xD249, + 0x8943, 0xD24A, 0x8944, 0xCFE5, 0x8945, 0xD24B, 0x8946, 0xD24C, 0x8947, 0xD24D, 0x8948, 0xD24E, 0x8949, 0xD24F, 0x894A, 0xD250, + 0x894B, 0xD251, 0x894C, 0xD252, 0x894D, 0xD253, 0x894E, 0xD254, 0x894F, 0xD255, 0x8950, 0xD256, 0x8951, 0xD257, 0x8952, 0xD258, + 0x8953, 0xD259, 0x8954, 0xD25A, 0x8955, 0xD25B, 0x8956, 0xD25C, 0x8957, 0xD25D, 0x8958, 0xD25E, 0x8959, 0xD25F, 0x895A, 0xD260, + 0x895B, 0xD261, 0x895C, 0xD262, 0x895D, 0xD263, 0x895E, 0xF4C5, 0x895F, 0xBDF3, 0x8960, 0xD264, 0x8961, 0xD265, 0x8962, 0xD266, + 0x8963, 0xD267, 0x8964, 0xD268, 0x8965, 0xD269, 0x8966, 0xF1E0, 0x8967, 0xD26A, 0x8968, 0xD26B, 0x8969, 0xD26C, 0x896A, 0xD26D, + 0x896B, 0xD26E, 0x896C, 0xD26F, 0x896D, 0xD270, 0x896E, 0xD271, 0x896F, 0xD272, 0x8970, 0xD273, 0x8971, 0xD274, 0x8972, 0xD275, + 0x8973, 0xD276, 0x8974, 0xD277, 0x8975, 0xD278, 0x8976, 0xD279, 0x8977, 0xD27A, 0x8978, 0xD27B, 0x8979, 0xD27C, 0x897A, 0xD27D, + 0x897B, 0xF1E1, 0x897C, 0xD27E, 0x897D, 0xD280, 0x897E, 0xD281, 0x897F, 0xCEF7, 0x8980, 0xD282, 0x8981, 0xD2AA, 0x8982, 0xD283, + 0x8983, 0xF1FB, 0x8984, 0xD284, 0x8985, 0xD285, 0x8986, 0xB8B2, 0x8987, 0xD286, 0x8988, 0xD287, 0x8989, 0xD288, 0x898A, 0xD289, + 0x898B, 0xD28A, 0x898C, 0xD28B, 0x898D, 0xD28C, 0x898E, 0xD28D, 0x898F, 0xD28E, 0x8990, 0xD28F, 0x8991, 0xD290, 0x8992, 0xD291, + 0x8993, 0xD292, 0x8994, 0xD293, 0x8995, 0xD294, 0x8996, 0xD295, 0x8997, 0xD296, 0x8998, 0xD297, 0x8999, 0xD298, 0x899A, 0xD299, + 0x899B, 0xD29A, 0x899C, 0xD29B, 0x899D, 0xD29C, 0x899E, 0xD29D, 0x899F, 0xD29E, 0x89A0, 0xD29F, 0x89A1, 0xD2A0, 0x89A2, 0xD340, + 0x89A3, 0xD341, 0x89A4, 0xD342, 0x89A5, 0xD343, 0x89A6, 0xD344, 0x89A7, 0xD345, 0x89A8, 0xD346, 0x89A9, 0xD347, 0x89AA, 0xD348, + 0x89AB, 0xD349, 0x89AC, 0xD34A, 0x89AD, 0xD34B, 0x89AE, 0xD34C, 0x89AF, 0xD34D, 0x89B0, 0xD34E, 0x89B1, 0xD34F, 0x89B2, 0xD350, + 0x89B3, 0xD351, 0x89B4, 0xD352, 0x89B5, 0xD353, 0x89B6, 0xD354, 0x89B7, 0xD355, 0x89B8, 0xD356, 0x89B9, 0xD357, 0x89BA, 0xD358, + 0x89BB, 0xD359, 0x89BC, 0xD35A, 0x89BD, 0xD35B, 0x89BE, 0xD35C, 0x89BF, 0xD35D, 0x89C0, 0xD35E, 0x89C1, 0xBCFB, 0x89C2, 0xB9DB, + 0x89C3, 0xD35F, 0x89C4, 0xB9E6, 0x89C5, 0xC3D9, 0x89C6, 0xCAD3, 0x89C7, 0xEAE8, 0x89C8, 0xC0C0, 0x89C9, 0xBEF5, 0x89CA, 0xEAE9, + 0x89CB, 0xEAEA, 0x89CC, 0xEAEB, 0x89CD, 0xD360, 0x89CE, 0xEAEC, 0x89CF, 0xEAED, 0x89D0, 0xEAEE, 0x89D1, 0xEAEF, 0x89D2, 0xBDC7, + 0x89D3, 0xD361, 0x89D4, 0xD362, 0x89D5, 0xD363, 0x89D6, 0xF5FB, 0x89D7, 0xD364, 0x89D8, 0xD365, 0x89D9, 0xD366, 0x89DA, 0xF5FD, + 0x89DB, 0xD367, 0x89DC, 0xF5FE, 0x89DD, 0xD368, 0x89DE, 0xF5FC, 0x89DF, 0xD369, 0x89E0, 0xD36A, 0x89E1, 0xD36B, 0x89E2, 0xD36C, + 0x89E3, 0xBDE2, 0x89E4, 0xD36D, 0x89E5, 0xF6A1, 0x89E6, 0xB4A5, 0x89E7, 0xD36E, 0x89E8, 0xD36F, 0x89E9, 0xD370, 0x89EA, 0xD371, + 0x89EB, 0xF6A2, 0x89EC, 0xD372, 0x89ED, 0xD373, 0x89EE, 0xD374, 0x89EF, 0xF6A3, 0x89F0, 0xD375, 0x89F1, 0xD376, 0x89F2, 0xD377, + 0x89F3, 0xECB2, 0x89F4, 0xD378, 0x89F5, 0xD379, 0x89F6, 0xD37A, 0x89F7, 0xD37B, 0x89F8, 0xD37C, 0x89F9, 0xD37D, 0x89FA, 0xD37E, + 0x89FB, 0xD380, 0x89FC, 0xD381, 0x89FD, 0xD382, 0x89FE, 0xD383, 0x89FF, 0xD384, 0x8A00, 0xD1D4, 0x8A01, 0xD385, 0x8A02, 0xD386, + 0x8A03, 0xD387, 0x8A04, 0xD388, 0x8A05, 0xD389, 0x8A06, 0xD38A, 0x8A07, 0xD9EA, 0x8A08, 0xD38B, 0x8A09, 0xD38C, 0x8A0A, 0xD38D, + 0x8A0B, 0xD38E, 0x8A0C, 0xD38F, 0x8A0D, 0xD390, 0x8A0E, 0xD391, 0x8A0F, 0xD392, 0x8A10, 0xD393, 0x8A11, 0xD394, 0x8A12, 0xD395, + 0x8A13, 0xD396, 0x8A14, 0xD397, 0x8A15, 0xD398, 0x8A16, 0xD399, 0x8A17, 0xD39A, 0x8A18, 0xD39B, 0x8A19, 0xD39C, 0x8A1A, 0xD39D, + 0x8A1B, 0xD39E, 0x8A1C, 0xD39F, 0x8A1D, 0xD3A0, 0x8A1E, 0xD440, 0x8A1F, 0xD441, 0x8A20, 0xD442, 0x8A21, 0xD443, 0x8A22, 0xD444, + 0x8A23, 0xD445, 0x8A24, 0xD446, 0x8A25, 0xD447, 0x8A26, 0xD448, 0x8A27, 0xD449, 0x8A28, 0xD44A, 0x8A29, 0xD44B, 0x8A2A, 0xD44C, + 0x8A2B, 0xD44D, 0x8A2C, 0xD44E, 0x8A2D, 0xD44F, 0x8A2E, 0xD450, 0x8A2F, 0xD451, 0x8A30, 0xD452, 0x8A31, 0xD453, 0x8A32, 0xD454, + 0x8A33, 0xD455, 0x8A34, 0xD456, 0x8A35, 0xD457, 0x8A36, 0xD458, 0x8A37, 0xD459, 0x8A38, 0xD45A, 0x8A39, 0xD45B, 0x8A3A, 0xD45C, + 0x8A3B, 0xD45D, 0x8A3C, 0xD45E, 0x8A3D, 0xD45F, 0x8A3E, 0xF6A4, 0x8A3F, 0xD460, 0x8A40, 0xD461, 0x8A41, 0xD462, 0x8A42, 0xD463, + 0x8A43, 0xD464, 0x8A44, 0xD465, 0x8A45, 0xD466, 0x8A46, 0xD467, 0x8A47, 0xD468, 0x8A48, 0xEEBA, 0x8A49, 0xD469, 0x8A4A, 0xD46A, + 0x8A4B, 0xD46B, 0x8A4C, 0xD46C, 0x8A4D, 0xD46D, 0x8A4E, 0xD46E, 0x8A4F, 0xD46F, 0x8A50, 0xD470, 0x8A51, 0xD471, 0x8A52, 0xD472, + 0x8A53, 0xD473, 0x8A54, 0xD474, 0x8A55, 0xD475, 0x8A56, 0xD476, 0x8A57, 0xD477, 0x8A58, 0xD478, 0x8A59, 0xD479, 0x8A5A, 0xD47A, + 0x8A5B, 0xD47B, 0x8A5C, 0xD47C, 0x8A5D, 0xD47D, 0x8A5E, 0xD47E, 0x8A5F, 0xD480, 0x8A60, 0xD481, 0x8A61, 0xD482, 0x8A62, 0xD483, + 0x8A63, 0xD484, 0x8A64, 0xD485, 0x8A65, 0xD486, 0x8A66, 0xD487, 0x8A67, 0xD488, 0x8A68, 0xD489, 0x8A69, 0xD48A, 0x8A6A, 0xD48B, + 0x8A6B, 0xD48C, 0x8A6C, 0xD48D, 0x8A6D, 0xD48E, 0x8A6E, 0xD48F, 0x8A6F, 0xD490, 0x8A70, 0xD491, 0x8A71, 0xD492, 0x8A72, 0xD493, + 0x8A73, 0xD494, 0x8A74, 0xD495, 0x8A75, 0xD496, 0x8A76, 0xD497, 0x8A77, 0xD498, 0x8A78, 0xD499, 0x8A79, 0xD5B2, 0x8A7A, 0xD49A, + 0x8A7B, 0xD49B, 0x8A7C, 0xD49C, 0x8A7D, 0xD49D, 0x8A7E, 0xD49E, 0x8A7F, 0xD49F, 0x8A80, 0xD4A0, 0x8A81, 0xD540, 0x8A82, 0xD541, + 0x8A83, 0xD542, 0x8A84, 0xD543, 0x8A85, 0xD544, 0x8A86, 0xD545, 0x8A87, 0xD546, 0x8A88, 0xD547, 0x8A89, 0xD3FE, 0x8A8A, 0xCCDC, + 0x8A8B, 0xD548, 0x8A8C, 0xD549, 0x8A8D, 0xD54A, 0x8A8E, 0xD54B, 0x8A8F, 0xD54C, 0x8A90, 0xD54D, 0x8A91, 0xD54E, 0x8A92, 0xD54F, + 0x8A93, 0xCAC4, 0x8A94, 0xD550, 0x8A95, 0xD551, 0x8A96, 0xD552, 0x8A97, 0xD553, 0x8A98, 0xD554, 0x8A99, 0xD555, 0x8A9A, 0xD556, + 0x8A9B, 0xD557, 0x8A9C, 0xD558, 0x8A9D, 0xD559, 0x8A9E, 0xD55A, 0x8A9F, 0xD55B, 0x8AA0, 0xD55C, 0x8AA1, 0xD55D, 0x8AA2, 0xD55E, + 0x8AA3, 0xD55F, 0x8AA4, 0xD560, 0x8AA5, 0xD561, 0x8AA6, 0xD562, 0x8AA7, 0xD563, 0x8AA8, 0xD564, 0x8AA9, 0xD565, 0x8AAA, 0xD566, + 0x8AAB, 0xD567, 0x8AAC, 0xD568, 0x8AAD, 0xD569, 0x8AAE, 0xD56A, 0x8AAF, 0xD56B, 0x8AB0, 0xD56C, 0x8AB1, 0xD56D, 0x8AB2, 0xD56E, + 0x8AB3, 0xD56F, 0x8AB4, 0xD570, 0x8AB5, 0xD571, 0x8AB6, 0xD572, 0x8AB7, 0xD573, 0x8AB8, 0xD574, 0x8AB9, 0xD575, 0x8ABA, 0xD576, + 0x8ABB, 0xD577, 0x8ABC, 0xD578, 0x8ABD, 0xD579, 0x8ABE, 0xD57A, 0x8ABF, 0xD57B, 0x8AC0, 0xD57C, 0x8AC1, 0xD57D, 0x8AC2, 0xD57E, + 0x8AC3, 0xD580, 0x8AC4, 0xD581, 0x8AC5, 0xD582, 0x8AC6, 0xD583, 0x8AC7, 0xD584, 0x8AC8, 0xD585, 0x8AC9, 0xD586, 0x8ACA, 0xD587, + 0x8ACB, 0xD588, 0x8ACC, 0xD589, 0x8ACD, 0xD58A, 0x8ACE, 0xD58B, 0x8ACF, 0xD58C, 0x8AD0, 0xD58D, 0x8AD1, 0xD58E, 0x8AD2, 0xD58F, + 0x8AD3, 0xD590, 0x8AD4, 0xD591, 0x8AD5, 0xD592, 0x8AD6, 0xD593, 0x8AD7, 0xD594, 0x8AD8, 0xD595, 0x8AD9, 0xD596, 0x8ADA, 0xD597, + 0x8ADB, 0xD598, 0x8ADC, 0xD599, 0x8ADD, 0xD59A, 0x8ADE, 0xD59B, 0x8ADF, 0xD59C, 0x8AE0, 0xD59D, 0x8AE1, 0xD59E, 0x8AE2, 0xD59F, + 0x8AE3, 0xD5A0, 0x8AE4, 0xD640, 0x8AE5, 0xD641, 0x8AE6, 0xD642, 0x8AE7, 0xD643, 0x8AE8, 0xD644, 0x8AE9, 0xD645, 0x8AEA, 0xD646, + 0x8AEB, 0xD647, 0x8AEC, 0xD648, 0x8AED, 0xD649, 0x8AEE, 0xD64A, 0x8AEF, 0xD64B, 0x8AF0, 0xD64C, 0x8AF1, 0xD64D, 0x8AF2, 0xD64E, + 0x8AF3, 0xD64F, 0x8AF4, 0xD650, 0x8AF5, 0xD651, 0x8AF6, 0xD652, 0x8AF7, 0xD653, 0x8AF8, 0xD654, 0x8AF9, 0xD655, 0x8AFA, 0xD656, + 0x8AFB, 0xD657, 0x8AFC, 0xD658, 0x8AFD, 0xD659, 0x8AFE, 0xD65A, 0x8AFF, 0xD65B, 0x8B00, 0xD65C, 0x8B01, 0xD65D, 0x8B02, 0xD65E, + 0x8B03, 0xD65F, 0x8B04, 0xD660, 0x8B05, 0xD661, 0x8B06, 0xD662, 0x8B07, 0xE5C0, 0x8B08, 0xD663, 0x8B09, 0xD664, 0x8B0A, 0xD665, + 0x8B0B, 0xD666, 0x8B0C, 0xD667, 0x8B0D, 0xD668, 0x8B0E, 0xD669, 0x8B0F, 0xD66A, 0x8B10, 0xD66B, 0x8B11, 0xD66C, 0x8B12, 0xD66D, + 0x8B13, 0xD66E, 0x8B14, 0xD66F, 0x8B15, 0xD670, 0x8B16, 0xD671, 0x8B17, 0xD672, 0x8B18, 0xD673, 0x8B19, 0xD674, 0x8B1A, 0xD675, + 0x8B1B, 0xD676, 0x8B1C, 0xD677, 0x8B1D, 0xD678, 0x8B1E, 0xD679, 0x8B1F, 0xD67A, 0x8B20, 0xD67B, 0x8B21, 0xD67C, 0x8B22, 0xD67D, + 0x8B23, 0xD67E, 0x8B24, 0xD680, 0x8B25, 0xD681, 0x8B26, 0xF6A5, 0x8B27, 0xD682, 0x8B28, 0xD683, 0x8B29, 0xD684, 0x8B2A, 0xD685, + 0x8B2B, 0xD686, 0x8B2C, 0xD687, 0x8B2D, 0xD688, 0x8B2E, 0xD689, 0x8B2F, 0xD68A, 0x8B30, 0xD68B, 0x8B31, 0xD68C, 0x8B32, 0xD68D, + 0x8B33, 0xD68E, 0x8B34, 0xD68F, 0x8B35, 0xD690, 0x8B36, 0xD691, 0x8B37, 0xD692, 0x8B38, 0xD693, 0x8B39, 0xD694, 0x8B3A, 0xD695, + 0x8B3B, 0xD696, 0x8B3C, 0xD697, 0x8B3D, 0xD698, 0x8B3E, 0xD699, 0x8B3F, 0xD69A, 0x8B40, 0xD69B, 0x8B41, 0xD69C, 0x8B42, 0xD69D, + 0x8B43, 0xD69E, 0x8B44, 0xD69F, 0x8B45, 0xD6A0, 0x8B46, 0xD740, 0x8B47, 0xD741, 0x8B48, 0xD742, 0x8B49, 0xD743, 0x8B4A, 0xD744, + 0x8B4B, 0xD745, 0x8B4C, 0xD746, 0x8B4D, 0xD747, 0x8B4E, 0xD748, 0x8B4F, 0xD749, 0x8B50, 0xD74A, 0x8B51, 0xD74B, 0x8B52, 0xD74C, + 0x8B53, 0xD74D, 0x8B54, 0xD74E, 0x8B55, 0xD74F, 0x8B56, 0xD750, 0x8B57, 0xD751, 0x8B58, 0xD752, 0x8B59, 0xD753, 0x8B5A, 0xD754, + 0x8B5B, 0xD755, 0x8B5C, 0xD756, 0x8B5D, 0xD757, 0x8B5E, 0xD758, 0x8B5F, 0xD759, 0x8B60, 0xD75A, 0x8B61, 0xD75B, 0x8B62, 0xD75C, + 0x8B63, 0xD75D, 0x8B64, 0xD75E, 0x8B65, 0xD75F, 0x8B66, 0xBEAF, 0x8B67, 0xD760, 0x8B68, 0xD761, 0x8B69, 0xD762, 0x8B6A, 0xD763, + 0x8B6B, 0xD764, 0x8B6C, 0xC6A9, 0x8B6D, 0xD765, 0x8B6E, 0xD766, 0x8B6F, 0xD767, 0x8B70, 0xD768, 0x8B71, 0xD769, 0x8B72, 0xD76A, + 0x8B73, 0xD76B, 0x8B74, 0xD76C, 0x8B75, 0xD76D, 0x8B76, 0xD76E, 0x8B77, 0xD76F, 0x8B78, 0xD770, 0x8B79, 0xD771, 0x8B7A, 0xD772, + 0x8B7B, 0xD773, 0x8B7C, 0xD774, 0x8B7D, 0xD775, 0x8B7E, 0xD776, 0x8B7F, 0xD777, 0x8B80, 0xD778, 0x8B81, 0xD779, 0x8B82, 0xD77A, + 0x8B83, 0xD77B, 0x8B84, 0xD77C, 0x8B85, 0xD77D, 0x8B86, 0xD77E, 0x8B87, 0xD780, 0x8B88, 0xD781, 0x8B89, 0xD782, 0x8B8A, 0xD783, + 0x8B8B, 0xD784, 0x8B8C, 0xD785, 0x8B8D, 0xD786, 0x8B8E, 0xD787, 0x8B8F, 0xD788, 0x8B90, 0xD789, 0x8B91, 0xD78A, 0x8B92, 0xD78B, + 0x8B93, 0xD78C, 0x8B94, 0xD78D, 0x8B95, 0xD78E, 0x8B96, 0xD78F, 0x8B97, 0xD790, 0x8B98, 0xD791, 0x8B99, 0xD792, 0x8B9A, 0xD793, + 0x8B9B, 0xD794, 0x8B9C, 0xD795, 0x8B9D, 0xD796, 0x8B9E, 0xD797, 0x8B9F, 0xD798, 0x8BA0, 0xDAA5, 0x8BA1, 0xBCC6, 0x8BA2, 0xB6A9, + 0x8BA3, 0xB8BC, 0x8BA4, 0xC8CF, 0x8BA5, 0xBCA5, 0x8BA6, 0xDAA6, 0x8BA7, 0xDAA7, 0x8BA8, 0xCCD6, 0x8BA9, 0xC8C3, 0x8BAA, 0xDAA8, + 0x8BAB, 0xC6FD, 0x8BAC, 0xD799, 0x8BAD, 0xD1B5, 0x8BAE, 0xD2E9, 0x8BAF, 0xD1B6, 0x8BB0, 0xBCC7, 0x8BB1, 0xD79A, 0x8BB2, 0xBDB2, + 0x8BB3, 0xBBE4, 0x8BB4, 0xDAA9, 0x8BB5, 0xDAAA, 0x8BB6, 0xD1C8, 0x8BB7, 0xDAAB, 0x8BB8, 0xD0ED, 0x8BB9, 0xB6EF, 0x8BBA, 0xC2DB, + 0x8BBB, 0xD79B, 0x8BBC, 0xCBCF, 0x8BBD, 0xB7ED, 0x8BBE, 0xC9E8, 0x8BBF, 0xB7C3, 0x8BC0, 0xBEF7, 0x8BC1, 0xD6A4, 0x8BC2, 0xDAAC, + 0x8BC3, 0xDAAD, 0x8BC4, 0xC6C0, 0x8BC5, 0xD7E7, 0x8BC6, 0xCAB6, 0x8BC7, 0xD79C, 0x8BC8, 0xD5A9, 0x8BC9, 0xCBDF, 0x8BCA, 0xD5EF, + 0x8BCB, 0xDAAE, 0x8BCC, 0xD6DF, 0x8BCD, 0xB4CA, 0x8BCE, 0xDAB0, 0x8BCF, 0xDAAF, 0x8BD0, 0xD79D, 0x8BD1, 0xD2EB, 0x8BD2, 0xDAB1, + 0x8BD3, 0xDAB2, 0x8BD4, 0xDAB3, 0x8BD5, 0xCAD4, 0x8BD6, 0xDAB4, 0x8BD7, 0xCAAB, 0x8BD8, 0xDAB5, 0x8BD9, 0xDAB6, 0x8BDA, 0xB3CF, + 0x8BDB, 0xD6EF, 0x8BDC, 0xDAB7, 0x8BDD, 0xBBB0, 0x8BDE, 0xB5AE, 0x8BDF, 0xDAB8, 0x8BE0, 0xDAB9, 0x8BE1, 0xB9EE, 0x8BE2, 0xD1AF, + 0x8BE3, 0xD2E8, 0x8BE4, 0xDABA, 0x8BE5, 0xB8C3, 0x8BE6, 0xCFEA, 0x8BE7, 0xB2EF, 0x8BE8, 0xDABB, 0x8BE9, 0xDABC, 0x8BEA, 0xD79E, + 0x8BEB, 0xBDEB, 0x8BEC, 0xCEDC, 0x8BED, 0xD3EF, 0x8BEE, 0xDABD, 0x8BEF, 0xCEF3, 0x8BF0, 0xDABE, 0x8BF1, 0xD3D5, 0x8BF2, 0xBBE5, + 0x8BF3, 0xDABF, 0x8BF4, 0xCBB5, 0x8BF5, 0xCBD0, 0x8BF6, 0xDAC0, 0x8BF7, 0xC7EB, 0x8BF8, 0xD6EE, 0x8BF9, 0xDAC1, 0x8BFA, 0xC5B5, + 0x8BFB, 0xB6C1, 0x8BFC, 0xDAC2, 0x8BFD, 0xB7CC, 0x8BFE, 0xBFCE, 0x8BFF, 0xDAC3, 0x8C00, 0xDAC4, 0x8C01, 0xCBAD, 0x8C02, 0xDAC5, + 0x8C03, 0xB5F7, 0x8C04, 0xDAC6, 0x8C05, 0xC1C2, 0x8C06, 0xD7BB, 0x8C07, 0xDAC7, 0x8C08, 0xCCB8, 0x8C09, 0xD79F, 0x8C0A, 0xD2EA, + 0x8C0B, 0xC4B1, 0x8C0C, 0xDAC8, 0x8C0D, 0xB5FD, 0x8C0E, 0xBBD1, 0x8C0F, 0xDAC9, 0x8C10, 0xD0B3, 0x8C11, 0xDACA, 0x8C12, 0xDACB, + 0x8C13, 0xCEBD, 0x8C14, 0xDACC, 0x8C15, 0xDACD, 0x8C16, 0xDACE, 0x8C17, 0xB2F7, 0x8C18, 0xDAD1, 0x8C19, 0xDACF, 0x8C1A, 0xD1E8, + 0x8C1B, 0xDAD0, 0x8C1C, 0xC3D5, 0x8C1D, 0xDAD2, 0x8C1E, 0xD7A0, 0x8C1F, 0xDAD3, 0x8C20, 0xDAD4, 0x8C21, 0xDAD5, 0x8C22, 0xD0BB, + 0x8C23, 0xD2A5, 0x8C24, 0xB0F9, 0x8C25, 0xDAD6, 0x8C26, 0xC7AB, 0x8C27, 0xDAD7, 0x8C28, 0xBDF7, 0x8C29, 0xC3A1, 0x8C2A, 0xDAD8, + 0x8C2B, 0xDAD9, 0x8C2C, 0xC3FD, 0x8C2D, 0xCCB7, 0x8C2E, 0xDADA, 0x8C2F, 0xDADB, 0x8C30, 0xC0BE, 0x8C31, 0xC6D7, 0x8C32, 0xDADC, + 0x8C33, 0xDADD, 0x8C34, 0xC7B4, 0x8C35, 0xDADE, 0x8C36, 0xDADF, 0x8C37, 0xB9C8, 0x8C38, 0xD840, 0x8C39, 0xD841, 0x8C3A, 0xD842, + 0x8C3B, 0xD843, 0x8C3C, 0xD844, 0x8C3D, 0xD845, 0x8C3E, 0xD846, 0x8C3F, 0xD847, 0x8C40, 0xD848, 0x8C41, 0xBBED, 0x8C42, 0xD849, + 0x8C43, 0xD84A, 0x8C44, 0xD84B, 0x8C45, 0xD84C, 0x8C46, 0xB6B9, 0x8C47, 0xF4F8, 0x8C48, 0xD84D, 0x8C49, 0xF4F9, 0x8C4A, 0xD84E, + 0x8C4B, 0xD84F, 0x8C4C, 0xCDE3, 0x8C4D, 0xD850, 0x8C4E, 0xD851, 0x8C4F, 0xD852, 0x8C50, 0xD853, 0x8C51, 0xD854, 0x8C52, 0xD855, + 0x8C53, 0xD856, 0x8C54, 0xD857, 0x8C55, 0xF5B9, 0x8C56, 0xD858, 0x8C57, 0xD859, 0x8C58, 0xD85A, 0x8C59, 0xD85B, 0x8C5A, 0xEBE0, + 0x8C5B, 0xD85C, 0x8C5C, 0xD85D, 0x8C5D, 0xD85E, 0x8C5E, 0xD85F, 0x8C5F, 0xD860, 0x8C60, 0xD861, 0x8C61, 0xCFF3, 0x8C62, 0xBBBF, + 0x8C63, 0xD862, 0x8C64, 0xD863, 0x8C65, 0xD864, 0x8C66, 0xD865, 0x8C67, 0xD866, 0x8C68, 0xD867, 0x8C69, 0xD868, 0x8C6A, 0xBAC0, + 0x8C6B, 0xD4A5, 0x8C6C, 0xD869, 0x8C6D, 0xD86A, 0x8C6E, 0xD86B, 0x8C6F, 0xD86C, 0x8C70, 0xD86D, 0x8C71, 0xD86E, 0x8C72, 0xD86F, + 0x8C73, 0xE1D9, 0x8C74, 0xD870, 0x8C75, 0xD871, 0x8C76, 0xD872, 0x8C77, 0xD873, 0x8C78, 0xF5F4, 0x8C79, 0xB1AA, 0x8C7A, 0xB2F2, + 0x8C7B, 0xD874, 0x8C7C, 0xD875, 0x8C7D, 0xD876, 0x8C7E, 0xD877, 0x8C7F, 0xD878, 0x8C80, 0xD879, 0x8C81, 0xD87A, 0x8C82, 0xF5F5, + 0x8C83, 0xD87B, 0x8C84, 0xD87C, 0x8C85, 0xF5F7, 0x8C86, 0xD87D, 0x8C87, 0xD87E, 0x8C88, 0xD880, 0x8C89, 0xBAD1, 0x8C8A, 0xF5F6, + 0x8C8B, 0xD881, 0x8C8C, 0xC3B2, 0x8C8D, 0xD882, 0x8C8E, 0xD883, 0x8C8F, 0xD884, 0x8C90, 0xD885, 0x8C91, 0xD886, 0x8C92, 0xD887, + 0x8C93, 0xD888, 0x8C94, 0xF5F9, 0x8C95, 0xD889, 0x8C96, 0xD88A, 0x8C97, 0xD88B, 0x8C98, 0xF5F8, 0x8C99, 0xD88C, 0x8C9A, 0xD88D, + 0x8C9B, 0xD88E, 0x8C9C, 0xD88F, 0x8C9D, 0xD890, 0x8C9E, 0xD891, 0x8C9F, 0xD892, 0x8CA0, 0xD893, 0x8CA1, 0xD894, 0x8CA2, 0xD895, + 0x8CA3, 0xD896, 0x8CA4, 0xD897, 0x8CA5, 0xD898, 0x8CA6, 0xD899, 0x8CA7, 0xD89A, 0x8CA8, 0xD89B, 0x8CA9, 0xD89C, 0x8CAA, 0xD89D, + 0x8CAB, 0xD89E, 0x8CAC, 0xD89F, 0x8CAD, 0xD8A0, 0x8CAE, 0xD940, 0x8CAF, 0xD941, 0x8CB0, 0xD942, 0x8CB1, 0xD943, 0x8CB2, 0xD944, + 0x8CB3, 0xD945, 0x8CB4, 0xD946, 0x8CB5, 0xD947, 0x8CB6, 0xD948, 0x8CB7, 0xD949, 0x8CB8, 0xD94A, 0x8CB9, 0xD94B, 0x8CBA, 0xD94C, + 0x8CBB, 0xD94D, 0x8CBC, 0xD94E, 0x8CBD, 0xD94F, 0x8CBE, 0xD950, 0x8CBF, 0xD951, 0x8CC0, 0xD952, 0x8CC1, 0xD953, 0x8CC2, 0xD954, + 0x8CC3, 0xD955, 0x8CC4, 0xD956, 0x8CC5, 0xD957, 0x8CC6, 0xD958, 0x8CC7, 0xD959, 0x8CC8, 0xD95A, 0x8CC9, 0xD95B, 0x8CCA, 0xD95C, + 0x8CCB, 0xD95D, 0x8CCC, 0xD95E, 0x8CCD, 0xD95F, 0x8CCE, 0xD960, 0x8CCF, 0xD961, 0x8CD0, 0xD962, 0x8CD1, 0xD963, 0x8CD2, 0xD964, + 0x8CD3, 0xD965, 0x8CD4, 0xD966, 0x8CD5, 0xD967, 0x8CD6, 0xD968, 0x8CD7, 0xD969, 0x8CD8, 0xD96A, 0x8CD9, 0xD96B, 0x8CDA, 0xD96C, + 0x8CDB, 0xD96D, 0x8CDC, 0xD96E, 0x8CDD, 0xD96F, 0x8CDE, 0xD970, 0x8CDF, 0xD971, 0x8CE0, 0xD972, 0x8CE1, 0xD973, 0x8CE2, 0xD974, + 0x8CE3, 0xD975, 0x8CE4, 0xD976, 0x8CE5, 0xD977, 0x8CE6, 0xD978, 0x8CE7, 0xD979, 0x8CE8, 0xD97A, 0x8CE9, 0xD97B, 0x8CEA, 0xD97C, + 0x8CEB, 0xD97D, 0x8CEC, 0xD97E, 0x8CED, 0xD980, 0x8CEE, 0xD981, 0x8CEF, 0xD982, 0x8CF0, 0xD983, 0x8CF1, 0xD984, 0x8CF2, 0xD985, + 0x8CF3, 0xD986, 0x8CF4, 0xD987, 0x8CF5, 0xD988, 0x8CF6, 0xD989, 0x8CF7, 0xD98A, 0x8CF8, 0xD98B, 0x8CF9, 0xD98C, 0x8CFA, 0xD98D, + 0x8CFB, 0xD98E, 0x8CFC, 0xD98F, 0x8CFD, 0xD990, 0x8CFE, 0xD991, 0x8CFF, 0xD992, 0x8D00, 0xD993, 0x8D01, 0xD994, 0x8D02, 0xD995, + 0x8D03, 0xD996, 0x8D04, 0xD997, 0x8D05, 0xD998, 0x8D06, 0xD999, 0x8D07, 0xD99A, 0x8D08, 0xD99B, 0x8D09, 0xD99C, 0x8D0A, 0xD99D, + 0x8D0B, 0xD99E, 0x8D0C, 0xD99F, 0x8D0D, 0xD9A0, 0x8D0E, 0xDA40, 0x8D0F, 0xDA41, 0x8D10, 0xDA42, 0x8D11, 0xDA43, 0x8D12, 0xDA44, + 0x8D13, 0xDA45, 0x8D14, 0xDA46, 0x8D15, 0xDA47, 0x8D16, 0xDA48, 0x8D17, 0xDA49, 0x8D18, 0xDA4A, 0x8D19, 0xDA4B, 0x8D1A, 0xDA4C, + 0x8D1B, 0xDA4D, 0x8D1C, 0xDA4E, 0x8D1D, 0xB1B4, 0x8D1E, 0xD5EA, 0x8D1F, 0xB8BA, 0x8D20, 0xDA4F, 0x8D21, 0xB9B1, 0x8D22, 0xB2C6, + 0x8D23, 0xD4F0, 0x8D24, 0xCFCD, 0x8D25, 0xB0DC, 0x8D26, 0xD5CB, 0x8D27, 0xBBF5, 0x8D28, 0xD6CA, 0x8D29, 0xB7B7, 0x8D2A, 0xCCB0, + 0x8D2B, 0xC6B6, 0x8D2C, 0xB1E1, 0x8D2D, 0xB9BA, 0x8D2E, 0xD6FC, 0x8D2F, 0xB9E1, 0x8D30, 0xB7A1, 0x8D31, 0xBCFA, 0x8D32, 0xEADA, + 0x8D33, 0xEADB, 0x8D34, 0xCCF9, 0x8D35, 0xB9F3, 0x8D36, 0xEADC, 0x8D37, 0xB4FB, 0x8D38, 0xC3B3, 0x8D39, 0xB7D1, 0x8D3A, 0xBAD8, + 0x8D3B, 0xEADD, 0x8D3C, 0xD4F4, 0x8D3D, 0xEADE, 0x8D3E, 0xBCD6, 0x8D3F, 0xBBDF, 0x8D40, 0xEADF, 0x8D41, 0xC1DE, 0x8D42, 0xC2B8, + 0x8D43, 0xD4DF, 0x8D44, 0xD7CA, 0x8D45, 0xEAE0, 0x8D46, 0xEAE1, 0x8D47, 0xEAE4, 0x8D48, 0xEAE2, 0x8D49, 0xEAE3, 0x8D4A, 0xC9DE, + 0x8D4B, 0xB8B3, 0x8D4C, 0xB6C4, 0x8D4D, 0xEAE5, 0x8D4E, 0xCAEA, 0x8D4F, 0xC9CD, 0x8D50, 0xB4CD, 0x8D51, 0xDA50, 0x8D52, 0xDA51, + 0x8D53, 0xE2D9, 0x8D54, 0xC5E2, 0x8D55, 0xEAE6, 0x8D56, 0xC0B5, 0x8D57, 0xDA52, 0x8D58, 0xD7B8, 0x8D59, 0xEAE7, 0x8D5A, 0xD7AC, + 0x8D5B, 0xC8FC, 0x8D5C, 0xD8D3, 0x8D5D, 0xD8CD, 0x8D5E, 0xD4DE, 0x8D5F, 0xDA53, 0x8D60, 0xD4F9, 0x8D61, 0xC9C4, 0x8D62, 0xD3AE, + 0x8D63, 0xB8D3, 0x8D64, 0xB3E0, 0x8D65, 0xDA54, 0x8D66, 0xC9E2, 0x8D67, 0xF4F6, 0x8D68, 0xDA55, 0x8D69, 0xDA56, 0x8D6A, 0xDA57, + 0x8D6B, 0xBAD5, 0x8D6C, 0xDA58, 0x8D6D, 0xF4F7, 0x8D6E, 0xDA59, 0x8D6F, 0xDA5A, 0x8D70, 0xD7DF, 0x8D71, 0xDA5B, 0x8D72, 0xDA5C, + 0x8D73, 0xF4F1, 0x8D74, 0xB8B0, 0x8D75, 0xD5D4, 0x8D76, 0xB8CF, 0x8D77, 0xC6F0, 0x8D78, 0xDA5D, 0x8D79, 0xDA5E, 0x8D7A, 0xDA5F, + 0x8D7B, 0xDA60, 0x8D7C, 0xDA61, 0x8D7D, 0xDA62, 0x8D7E, 0xDA63, 0x8D7F, 0xDA64, 0x8D80, 0xDA65, 0x8D81, 0xB3C3, 0x8D82, 0xDA66, + 0x8D83, 0xDA67, 0x8D84, 0xF4F2, 0x8D85, 0xB3AC, 0x8D86, 0xDA68, 0x8D87, 0xDA69, 0x8D88, 0xDA6A, 0x8D89, 0xDA6B, 0x8D8A, 0xD4BD, + 0x8D8B, 0xC7F7, 0x8D8C, 0xDA6C, 0x8D8D, 0xDA6D, 0x8D8E, 0xDA6E, 0x8D8F, 0xDA6F, 0x8D90, 0xDA70, 0x8D91, 0xF4F4, 0x8D92, 0xDA71, + 0x8D93, 0xDA72, 0x8D94, 0xF4F3, 0x8D95, 0xDA73, 0x8D96, 0xDA74, 0x8D97, 0xDA75, 0x8D98, 0xDA76, 0x8D99, 0xDA77, 0x8D9A, 0xDA78, + 0x8D9B, 0xDA79, 0x8D9C, 0xDA7A, 0x8D9D, 0xDA7B, 0x8D9E, 0xDA7C, 0x8D9F, 0xCCCB, 0x8DA0, 0xDA7D, 0x8DA1, 0xDA7E, 0x8DA2, 0xDA80, + 0x8DA3, 0xC8A4, 0x8DA4, 0xDA81, 0x8DA5, 0xDA82, 0x8DA6, 0xDA83, 0x8DA7, 0xDA84, 0x8DA8, 0xDA85, 0x8DA9, 0xDA86, 0x8DAA, 0xDA87, + 0x8DAB, 0xDA88, 0x8DAC, 0xDA89, 0x8DAD, 0xDA8A, 0x8DAE, 0xDA8B, 0x8DAF, 0xDA8C, 0x8DB0, 0xDA8D, 0x8DB1, 0xF4F5, 0x8DB2, 0xDA8E, + 0x8DB3, 0xD7E3, 0x8DB4, 0xC5BF, 0x8DB5, 0xF5C0, 0x8DB6, 0xDA8F, 0x8DB7, 0xDA90, 0x8DB8, 0xF5BB, 0x8DB9, 0xDA91, 0x8DBA, 0xF5C3, + 0x8DBB, 0xDA92, 0x8DBC, 0xF5C2, 0x8DBD, 0xDA93, 0x8DBE, 0xD6BA, 0x8DBF, 0xF5C1, 0x8DC0, 0xDA94, 0x8DC1, 0xDA95, 0x8DC2, 0xDA96, + 0x8DC3, 0xD4BE, 0x8DC4, 0xF5C4, 0x8DC5, 0xDA97, 0x8DC6, 0xF5CC, 0x8DC7, 0xDA98, 0x8DC8, 0xDA99, 0x8DC9, 0xDA9A, 0x8DCA, 0xDA9B, + 0x8DCB, 0xB0CF, 0x8DCC, 0xB5F8, 0x8DCD, 0xDA9C, 0x8DCE, 0xF5C9, 0x8DCF, 0xF5CA, 0x8DD0, 0xDA9D, 0x8DD1, 0xC5DC, 0x8DD2, 0xDA9E, + 0x8DD3, 0xDA9F, 0x8DD4, 0xDAA0, 0x8DD5, 0xDB40, 0x8DD6, 0xF5C5, 0x8DD7, 0xF5C6, 0x8DD8, 0xDB41, 0x8DD9, 0xDB42, 0x8DDA, 0xF5C7, + 0x8DDB, 0xF5CB, 0x8DDC, 0xDB43, 0x8DDD, 0xBEE0, 0x8DDE, 0xF5C8, 0x8DDF, 0xB8FA, 0x8DE0, 0xDB44, 0x8DE1, 0xDB45, 0x8DE2, 0xDB46, + 0x8DE3, 0xF5D0, 0x8DE4, 0xF5D3, 0x8DE5, 0xDB47, 0x8DE6, 0xDB48, 0x8DE7, 0xDB49, 0x8DE8, 0xBFE7, 0x8DE9, 0xDB4A, 0x8DEA, 0xB9F2, + 0x8DEB, 0xF5BC, 0x8DEC, 0xF5CD, 0x8DED, 0xDB4B, 0x8DEE, 0xDB4C, 0x8DEF, 0xC2B7, 0x8DF0, 0xDB4D, 0x8DF1, 0xDB4E, 0x8DF2, 0xDB4F, + 0x8DF3, 0xCCF8, 0x8DF4, 0xDB50, 0x8DF5, 0xBCF9, 0x8DF6, 0xDB51, 0x8DF7, 0xF5CE, 0x8DF8, 0xF5CF, 0x8DF9, 0xF5D1, 0x8DFA, 0xB6E5, + 0x8DFB, 0xF5D2, 0x8DFC, 0xDB52, 0x8DFD, 0xF5D5, 0x8DFE, 0xDB53, 0x8DFF, 0xDB54, 0x8E00, 0xDB55, 0x8E01, 0xDB56, 0x8E02, 0xDB57, + 0x8E03, 0xDB58, 0x8E04, 0xDB59, 0x8E05, 0xF5BD, 0x8E06, 0xDB5A, 0x8E07, 0xDB5B, 0x8E08, 0xDB5C, 0x8E09, 0xF5D4, 0x8E0A, 0xD3BB, + 0x8E0B, 0xDB5D, 0x8E0C, 0xB3EC, 0x8E0D, 0xDB5E, 0x8E0E, 0xDB5F, 0x8E0F, 0xCCA4, 0x8E10, 0xDB60, 0x8E11, 0xDB61, 0x8E12, 0xDB62, + 0x8E13, 0xDB63, 0x8E14, 0xF5D6, 0x8E15, 0xDB64, 0x8E16, 0xDB65, 0x8E17, 0xDB66, 0x8E18, 0xDB67, 0x8E19, 0xDB68, 0x8E1A, 0xDB69, + 0x8E1B, 0xDB6A, 0x8E1C, 0xDB6B, 0x8E1D, 0xF5D7, 0x8E1E, 0xBEE1, 0x8E1F, 0xF5D8, 0x8E20, 0xDB6C, 0x8E21, 0xDB6D, 0x8E22, 0xCCDF, + 0x8E23, 0xF5DB, 0x8E24, 0xDB6E, 0x8E25, 0xDB6F, 0x8E26, 0xDB70, 0x8E27, 0xDB71, 0x8E28, 0xDB72, 0x8E29, 0xB2C8, 0x8E2A, 0xD7D9, + 0x8E2B, 0xDB73, 0x8E2C, 0xF5D9, 0x8E2D, 0xDB74, 0x8E2E, 0xF5DA, 0x8E2F, 0xF5DC, 0x8E30, 0xDB75, 0x8E31, 0xF5E2, 0x8E32, 0xDB76, + 0x8E33, 0xDB77, 0x8E34, 0xDB78, 0x8E35, 0xF5E0, 0x8E36, 0xDB79, 0x8E37, 0xDB7A, 0x8E38, 0xDB7B, 0x8E39, 0xF5DF, 0x8E3A, 0xF5DD, + 0x8E3B, 0xDB7C, 0x8E3C, 0xDB7D, 0x8E3D, 0xF5E1, 0x8E3E, 0xDB7E, 0x8E3F, 0xDB80, 0x8E40, 0xF5DE, 0x8E41, 0xF5E4, 0x8E42, 0xF5E5, + 0x8E43, 0xDB81, 0x8E44, 0xCCE3, 0x8E45, 0xDB82, 0x8E46, 0xDB83, 0x8E47, 0xE5BF, 0x8E48, 0xB5B8, 0x8E49, 0xF5E3, 0x8E4A, 0xF5E8, + 0x8E4B, 0xCCA3, 0x8E4C, 0xDB84, 0x8E4D, 0xDB85, 0x8E4E, 0xDB86, 0x8E4F, 0xDB87, 0x8E50, 0xDB88, 0x8E51, 0xF5E6, 0x8E52, 0xF5E7, + 0x8E53, 0xDB89, 0x8E54, 0xDB8A, 0x8E55, 0xDB8B, 0x8E56, 0xDB8C, 0x8E57, 0xDB8D, 0x8E58, 0xDB8E, 0x8E59, 0xF5BE, 0x8E5A, 0xDB8F, + 0x8E5B, 0xDB90, 0x8E5C, 0xDB91, 0x8E5D, 0xDB92, 0x8E5E, 0xDB93, 0x8E5F, 0xDB94, 0x8E60, 0xDB95, 0x8E61, 0xDB96, 0x8E62, 0xDB97, + 0x8E63, 0xDB98, 0x8E64, 0xDB99, 0x8E65, 0xDB9A, 0x8E66, 0xB1C4, 0x8E67, 0xDB9B, 0x8E68, 0xDB9C, 0x8E69, 0xF5BF, 0x8E6A, 0xDB9D, + 0x8E6B, 0xDB9E, 0x8E6C, 0xB5C5, 0x8E6D, 0xB2E4, 0x8E6E, 0xDB9F, 0x8E6F, 0xF5EC, 0x8E70, 0xF5E9, 0x8E71, 0xDBA0, 0x8E72, 0xB6D7, + 0x8E73, 0xDC40, 0x8E74, 0xF5ED, 0x8E75, 0xDC41, 0x8E76, 0xF5EA, 0x8E77, 0xDC42, 0x8E78, 0xDC43, 0x8E79, 0xDC44, 0x8E7A, 0xDC45, + 0x8E7B, 0xDC46, 0x8E7C, 0xF5EB, 0x8E7D, 0xDC47, 0x8E7E, 0xDC48, 0x8E7F, 0xB4DA, 0x8E80, 0xDC49, 0x8E81, 0xD4EA, 0x8E82, 0xDC4A, + 0x8E83, 0xDC4B, 0x8E84, 0xDC4C, 0x8E85, 0xF5EE, 0x8E86, 0xDC4D, 0x8E87, 0xB3F9, 0x8E88, 0xDC4E, 0x8E89, 0xDC4F, 0x8E8A, 0xDC50, + 0x8E8B, 0xDC51, 0x8E8C, 0xDC52, 0x8E8D, 0xDC53, 0x8E8E, 0xDC54, 0x8E8F, 0xF5EF, 0x8E90, 0xF5F1, 0x8E91, 0xDC55, 0x8E92, 0xDC56, + 0x8E93, 0xDC57, 0x8E94, 0xF5F0, 0x8E95, 0xDC58, 0x8E96, 0xDC59, 0x8E97, 0xDC5A, 0x8E98, 0xDC5B, 0x8E99, 0xDC5C, 0x8E9A, 0xDC5D, + 0x8E9B, 0xDC5E, 0x8E9C, 0xF5F2, 0x8E9D, 0xDC5F, 0x8E9E, 0xF5F3, 0x8E9F, 0xDC60, 0x8EA0, 0xDC61, 0x8EA1, 0xDC62, 0x8EA2, 0xDC63, + 0x8EA3, 0xDC64, 0x8EA4, 0xDC65, 0x8EA5, 0xDC66, 0x8EA6, 0xDC67, 0x8EA7, 0xDC68, 0x8EA8, 0xDC69, 0x8EA9, 0xDC6A, 0x8EAA, 0xDC6B, + 0x8EAB, 0xC9ED, 0x8EAC, 0xB9AA, 0x8EAD, 0xDC6C, 0x8EAE, 0xDC6D, 0x8EAF, 0xC7FB, 0x8EB0, 0xDC6E, 0x8EB1, 0xDC6F, 0x8EB2, 0xB6E3, + 0x8EB3, 0xDC70, 0x8EB4, 0xDC71, 0x8EB5, 0xDC72, 0x8EB6, 0xDC73, 0x8EB7, 0xDC74, 0x8EB8, 0xDC75, 0x8EB9, 0xDC76, 0x8EBA, 0xCCC9, + 0x8EBB, 0xDC77, 0x8EBC, 0xDC78, 0x8EBD, 0xDC79, 0x8EBE, 0xDC7A, 0x8EBF, 0xDC7B, 0x8EC0, 0xDC7C, 0x8EC1, 0xDC7D, 0x8EC2, 0xDC7E, + 0x8EC3, 0xDC80, 0x8EC4, 0xDC81, 0x8EC5, 0xDC82, 0x8EC6, 0xDC83, 0x8EC7, 0xDC84, 0x8EC8, 0xDC85, 0x8EC9, 0xDC86, 0x8ECA, 0xDC87, + 0x8ECB, 0xDC88, 0x8ECC, 0xDC89, 0x8ECD, 0xDC8A, 0x8ECE, 0xEAA6, 0x8ECF, 0xDC8B, 0x8ED0, 0xDC8C, 0x8ED1, 0xDC8D, 0x8ED2, 0xDC8E, + 0x8ED3, 0xDC8F, 0x8ED4, 0xDC90, 0x8ED5, 0xDC91, 0x8ED6, 0xDC92, 0x8ED7, 0xDC93, 0x8ED8, 0xDC94, 0x8ED9, 0xDC95, 0x8EDA, 0xDC96, + 0x8EDB, 0xDC97, 0x8EDC, 0xDC98, 0x8EDD, 0xDC99, 0x8EDE, 0xDC9A, 0x8EDF, 0xDC9B, 0x8EE0, 0xDC9C, 0x8EE1, 0xDC9D, 0x8EE2, 0xDC9E, + 0x8EE3, 0xDC9F, 0x8EE4, 0xDCA0, 0x8EE5, 0xDD40, 0x8EE6, 0xDD41, 0x8EE7, 0xDD42, 0x8EE8, 0xDD43, 0x8EE9, 0xDD44, 0x8EEA, 0xDD45, + 0x8EEB, 0xDD46, 0x8EEC, 0xDD47, 0x8EED, 0xDD48, 0x8EEE, 0xDD49, 0x8EEF, 0xDD4A, 0x8EF0, 0xDD4B, 0x8EF1, 0xDD4C, 0x8EF2, 0xDD4D, + 0x8EF3, 0xDD4E, 0x8EF4, 0xDD4F, 0x8EF5, 0xDD50, 0x8EF6, 0xDD51, 0x8EF7, 0xDD52, 0x8EF8, 0xDD53, 0x8EF9, 0xDD54, 0x8EFA, 0xDD55, + 0x8EFB, 0xDD56, 0x8EFC, 0xDD57, 0x8EFD, 0xDD58, 0x8EFE, 0xDD59, 0x8EFF, 0xDD5A, 0x8F00, 0xDD5B, 0x8F01, 0xDD5C, 0x8F02, 0xDD5D, + 0x8F03, 0xDD5E, 0x8F04, 0xDD5F, 0x8F05, 0xDD60, 0x8F06, 0xDD61, 0x8F07, 0xDD62, 0x8F08, 0xDD63, 0x8F09, 0xDD64, 0x8F0A, 0xDD65, + 0x8F0B, 0xDD66, 0x8F0C, 0xDD67, 0x8F0D, 0xDD68, 0x8F0E, 0xDD69, 0x8F0F, 0xDD6A, 0x8F10, 0xDD6B, 0x8F11, 0xDD6C, 0x8F12, 0xDD6D, + 0x8F13, 0xDD6E, 0x8F14, 0xDD6F, 0x8F15, 0xDD70, 0x8F16, 0xDD71, 0x8F17, 0xDD72, 0x8F18, 0xDD73, 0x8F19, 0xDD74, 0x8F1A, 0xDD75, + 0x8F1B, 0xDD76, 0x8F1C, 0xDD77, 0x8F1D, 0xDD78, 0x8F1E, 0xDD79, 0x8F1F, 0xDD7A, 0x8F20, 0xDD7B, 0x8F21, 0xDD7C, 0x8F22, 0xDD7D, + 0x8F23, 0xDD7E, 0x8F24, 0xDD80, 0x8F25, 0xDD81, 0x8F26, 0xDD82, 0x8F27, 0xDD83, 0x8F28, 0xDD84, 0x8F29, 0xDD85, 0x8F2A, 0xDD86, + 0x8F2B, 0xDD87, 0x8F2C, 0xDD88, 0x8F2D, 0xDD89, 0x8F2E, 0xDD8A, 0x8F2F, 0xDD8B, 0x8F30, 0xDD8C, 0x8F31, 0xDD8D, 0x8F32, 0xDD8E, + 0x8F33, 0xDD8F, 0x8F34, 0xDD90, 0x8F35, 0xDD91, 0x8F36, 0xDD92, 0x8F37, 0xDD93, 0x8F38, 0xDD94, 0x8F39, 0xDD95, 0x8F3A, 0xDD96, + 0x8F3B, 0xDD97, 0x8F3C, 0xDD98, 0x8F3D, 0xDD99, 0x8F3E, 0xDD9A, 0x8F3F, 0xDD9B, 0x8F40, 0xDD9C, 0x8F41, 0xDD9D, 0x8F42, 0xDD9E, + 0x8F43, 0xDD9F, 0x8F44, 0xDDA0, 0x8F45, 0xDE40, 0x8F46, 0xDE41, 0x8F47, 0xDE42, 0x8F48, 0xDE43, 0x8F49, 0xDE44, 0x8F4A, 0xDE45, + 0x8F4B, 0xDE46, 0x8F4C, 0xDE47, 0x8F4D, 0xDE48, 0x8F4E, 0xDE49, 0x8F4F, 0xDE4A, 0x8F50, 0xDE4B, 0x8F51, 0xDE4C, 0x8F52, 0xDE4D, + 0x8F53, 0xDE4E, 0x8F54, 0xDE4F, 0x8F55, 0xDE50, 0x8F56, 0xDE51, 0x8F57, 0xDE52, 0x8F58, 0xDE53, 0x8F59, 0xDE54, 0x8F5A, 0xDE55, + 0x8F5B, 0xDE56, 0x8F5C, 0xDE57, 0x8F5D, 0xDE58, 0x8F5E, 0xDE59, 0x8F5F, 0xDE5A, 0x8F60, 0xDE5B, 0x8F61, 0xDE5C, 0x8F62, 0xDE5D, + 0x8F63, 0xDE5E, 0x8F64, 0xDE5F, 0x8F65, 0xDE60, 0x8F66, 0xB3B5, 0x8F67, 0xD4FE, 0x8F68, 0xB9EC, 0x8F69, 0xD0F9, 0x8F6A, 0xDE61, + 0x8F6B, 0xE9ED, 0x8F6C, 0xD7AA, 0x8F6D, 0xE9EE, 0x8F6E, 0xC2D6, 0x8F6F, 0xC8ED, 0x8F70, 0xBAE4, 0x8F71, 0xE9EF, 0x8F72, 0xE9F0, + 0x8F73, 0xE9F1, 0x8F74, 0xD6E1, 0x8F75, 0xE9F2, 0x8F76, 0xE9F3, 0x8F77, 0xE9F5, 0x8F78, 0xE9F4, 0x8F79, 0xE9F6, 0x8F7A, 0xE9F7, + 0x8F7B, 0xC7E1, 0x8F7C, 0xE9F8, 0x8F7D, 0xD4D8, 0x8F7E, 0xE9F9, 0x8F7F, 0xBDCE, 0x8F80, 0xDE62, 0x8F81, 0xE9FA, 0x8F82, 0xE9FB, + 0x8F83, 0xBDCF, 0x8F84, 0xE9FC, 0x8F85, 0xB8A8, 0x8F86, 0xC1BE, 0x8F87, 0xE9FD, 0x8F88, 0xB1B2, 0x8F89, 0xBBD4, 0x8F8A, 0xB9F5, + 0x8F8B, 0xE9FE, 0x8F8C, 0xDE63, 0x8F8D, 0xEAA1, 0x8F8E, 0xEAA2, 0x8F8F, 0xEAA3, 0x8F90, 0xB7F8, 0x8F91, 0xBCAD, 0x8F92, 0xDE64, + 0x8F93, 0xCAE4, 0x8F94, 0xE0CE, 0x8F95, 0xD4AF, 0x8F96, 0xCFBD, 0x8F97, 0xD5B7, 0x8F98, 0xEAA4, 0x8F99, 0xD5DE, 0x8F9A, 0xEAA5, + 0x8F9B, 0xD0C1, 0x8F9C, 0xB9BC, 0x8F9D, 0xDE65, 0x8F9E, 0xB4C7, 0x8F9F, 0xB1D9, 0x8FA0, 0xDE66, 0x8FA1, 0xDE67, 0x8FA2, 0xDE68, + 0x8FA3, 0xC0B1, 0x8FA4, 0xDE69, 0x8FA5, 0xDE6A, 0x8FA6, 0xDE6B, 0x8FA7, 0xDE6C, 0x8FA8, 0xB1E6, 0x8FA9, 0xB1E7, 0x8FAA, 0xDE6D, + 0x8FAB, 0xB1E8, 0x8FAC, 0xDE6E, 0x8FAD, 0xDE6F, 0x8FAE, 0xDE70, 0x8FAF, 0xDE71, 0x8FB0, 0xB3BD, 0x8FB1, 0xC8E8, 0x8FB2, 0xDE72, + 0x8FB3, 0xDE73, 0x8FB4, 0xDE74, 0x8FB5, 0xDE75, 0x8FB6, 0xE5C1, 0x8FB7, 0xDE76, 0x8FB8, 0xDE77, 0x8FB9, 0xB1DF, 0x8FBA, 0xDE78, + 0x8FBB, 0xDE79, 0x8FBC, 0xDE7A, 0x8FBD, 0xC1C9, 0x8FBE, 0xB4EF, 0x8FBF, 0xDE7B, 0x8FC0, 0xDE7C, 0x8FC1, 0xC7A8, 0x8FC2, 0xD3D8, + 0x8FC3, 0xDE7D, 0x8FC4, 0xC6F9, 0x8FC5, 0xD1B8, 0x8FC6, 0xDE7E, 0x8FC7, 0xB9FD, 0x8FC8, 0xC2F5, 0x8FC9, 0xDE80, 0x8FCA, 0xDE81, + 0x8FCB, 0xDE82, 0x8FCC, 0xDE83, 0x8FCD, 0xDE84, 0x8FCE, 0xD3AD, 0x8FCF, 0xDE85, 0x8FD0, 0xD4CB, 0x8FD1, 0xBDFC, 0x8FD2, 0xDE86, + 0x8FD3, 0xE5C2, 0x8FD4, 0xB7B5, 0x8FD5, 0xE5C3, 0x8FD6, 0xDE87, 0x8FD7, 0xDE88, 0x8FD8, 0xBBB9, 0x8FD9, 0xD5E2, 0x8FDA, 0xDE89, + 0x8FDB, 0xBDF8, 0x8FDC, 0xD4B6, 0x8FDD, 0xCEA5, 0x8FDE, 0xC1AC, 0x8FDF, 0xB3D9, 0x8FE0, 0xDE8A, 0x8FE1, 0xDE8B, 0x8FE2, 0xCCF6, + 0x8FE3, 0xDE8C, 0x8FE4, 0xE5C6, 0x8FE5, 0xE5C4, 0x8FE6, 0xE5C8, 0x8FE7, 0xDE8D, 0x8FE8, 0xE5CA, 0x8FE9, 0xE5C7, 0x8FEA, 0xB5CF, + 0x8FEB, 0xC6C8, 0x8FEC, 0xDE8E, 0x8FED, 0xB5FC, 0x8FEE, 0xE5C5, 0x8FEF, 0xDE8F, 0x8FF0, 0xCAF6, 0x8FF1, 0xDE90, 0x8FF2, 0xDE91, + 0x8FF3, 0xE5C9, 0x8FF4, 0xDE92, 0x8FF5, 0xDE93, 0x8FF6, 0xDE94, 0x8FF7, 0xC3D4, 0x8FF8, 0xB1C5, 0x8FF9, 0xBCA3, 0x8FFA, 0xDE95, + 0x8FFB, 0xDE96, 0x8FFC, 0xDE97, 0x8FFD, 0xD7B7, 0x8FFE, 0xDE98, 0x8FFF, 0xDE99, 0x9000, 0xCDCB, 0x9001, 0xCBCD, 0x9002, 0xCACA, + 0x9003, 0xCCD3, 0x9004, 0xE5CC, 0x9005, 0xE5CB, 0x9006, 0xC4E6, 0x9007, 0xDE9A, 0x9008, 0xDE9B, 0x9009, 0xD1A1, 0x900A, 0xD1B7, + 0x900B, 0xE5CD, 0x900C, 0xDE9C, 0x900D, 0xE5D0, 0x900E, 0xDE9D, 0x900F, 0xCDB8, 0x9010, 0xD6F0, 0x9011, 0xE5CF, 0x9012, 0xB5DD, + 0x9013, 0xDE9E, 0x9014, 0xCDBE, 0x9015, 0xDE9F, 0x9016, 0xE5D1, 0x9017, 0xB6BA, 0x9018, 0xDEA0, 0x9019, 0xDF40, 0x901A, 0xCDA8, + 0x901B, 0xB9E4, 0x901C, 0xDF41, 0x901D, 0xCAC5, 0x901E, 0xB3D1, 0x901F, 0xCBD9, 0x9020, 0xD4EC, 0x9021, 0xE5D2, 0x9022, 0xB7EA, + 0x9023, 0xDF42, 0x9024, 0xDF43, 0x9025, 0xDF44, 0x9026, 0xE5CE, 0x9027, 0xDF45, 0x9028, 0xDF46, 0x9029, 0xDF47, 0x902A, 0xDF48, + 0x902B, 0xDF49, 0x902C, 0xDF4A, 0x902D, 0xE5D5, 0x902E, 0xB4FE, 0x902F, 0xE5D6, 0x9030, 0xDF4B, 0x9031, 0xDF4C, 0x9032, 0xDF4D, + 0x9033, 0xDF4E, 0x9034, 0xDF4F, 0x9035, 0xE5D3, 0x9036, 0xE5D4, 0x9037, 0xDF50, 0x9038, 0xD2DD, 0x9039, 0xDF51, 0x903A, 0xDF52, + 0x903B, 0xC2DF, 0x903C, 0xB1C6, 0x903D, 0xDF53, 0x903E, 0xD3E2, 0x903F, 0xDF54, 0x9040, 0xDF55, 0x9041, 0xB6DD, 0x9042, 0xCBEC, + 0x9043, 0xDF56, 0x9044, 0xE5D7, 0x9045, 0xDF57, 0x9046, 0xDF58, 0x9047, 0xD3F6, 0x9048, 0xDF59, 0x9049, 0xDF5A, 0x904A, 0xDF5B, + 0x904B, 0xDF5C, 0x904C, 0xDF5D, 0x904D, 0xB1E9, 0x904E, 0xDF5E, 0x904F, 0xB6F4, 0x9050, 0xE5DA, 0x9051, 0xE5D8, 0x9052, 0xE5D9, + 0x9053, 0xB5C0, 0x9054, 0xDF5F, 0x9055, 0xDF60, 0x9056, 0xDF61, 0x9057, 0xD2C5, 0x9058, 0xE5DC, 0x9059, 0xDF62, 0x905A, 0xDF63, + 0x905B, 0xE5DE, 0x905C, 0xDF64, 0x905D, 0xDF65, 0x905E, 0xDF66, 0x905F, 0xDF67, 0x9060, 0xDF68, 0x9061, 0xDF69, 0x9062, 0xE5DD, + 0x9063, 0xC7B2, 0x9064, 0xDF6A, 0x9065, 0xD2A3, 0x9066, 0xDF6B, 0x9067, 0xDF6C, 0x9068, 0xE5DB, 0x9069, 0xDF6D, 0x906A, 0xDF6E, + 0x906B, 0xDF6F, 0x906C, 0xDF70, 0x906D, 0xD4E2, 0x906E, 0xD5DA, 0x906F, 0xDF71, 0x9070, 0xDF72, 0x9071, 0xDF73, 0x9072, 0xDF74, + 0x9073, 0xDF75, 0x9074, 0xE5E0, 0x9075, 0xD7F1, 0x9076, 0xDF76, 0x9077, 0xDF77, 0x9078, 0xDF78, 0x9079, 0xDF79, 0x907A, 0xDF7A, + 0x907B, 0xDF7B, 0x907C, 0xDF7C, 0x907D, 0xE5E1, 0x907E, 0xDF7D, 0x907F, 0xB1DC, 0x9080, 0xD1FB, 0x9081, 0xDF7E, 0x9082, 0xE5E2, + 0x9083, 0xE5E4, 0x9084, 0xDF80, 0x9085, 0xDF81, 0x9086, 0xDF82, 0x9087, 0xDF83, 0x9088, 0xE5E3, 0x9089, 0xDF84, 0x908A, 0xDF85, + 0x908B, 0xE5E5, 0x908C, 0xDF86, 0x908D, 0xDF87, 0x908E, 0xDF88, 0x908F, 0xDF89, 0x9090, 0xDF8A, 0x9091, 0xD2D8, 0x9092, 0xDF8B, + 0x9093, 0xB5CB, 0x9094, 0xDF8C, 0x9095, 0xE7DF, 0x9096, 0xDF8D, 0x9097, 0xDAF5, 0x9098, 0xDF8E, 0x9099, 0xDAF8, 0x909A, 0xDF8F, + 0x909B, 0xDAF6, 0x909C, 0xDF90, 0x909D, 0xDAF7, 0x909E, 0xDF91, 0x909F, 0xDF92, 0x90A0, 0xDF93, 0x90A1, 0xDAFA, 0x90A2, 0xD0CF, + 0x90A3, 0xC4C7, 0x90A4, 0xDF94, 0x90A5, 0xDF95, 0x90A6, 0xB0EE, 0x90A7, 0xDF96, 0x90A8, 0xDF97, 0x90A9, 0xDF98, 0x90AA, 0xD0B0, + 0x90AB, 0xDF99, 0x90AC, 0xDAF9, 0x90AD, 0xDF9A, 0x90AE, 0xD3CA, 0x90AF, 0xBAAA, 0x90B0, 0xDBA2, 0x90B1, 0xC7F1, 0x90B2, 0xDF9B, + 0x90B3, 0xDAFC, 0x90B4, 0xDAFB, 0x90B5, 0xC9DB, 0x90B6, 0xDAFD, 0x90B7, 0xDF9C, 0x90B8, 0xDBA1, 0x90B9, 0xD7DE, 0x90BA, 0xDAFE, + 0x90BB, 0xC1DA, 0x90BC, 0xDF9D, 0x90BD, 0xDF9E, 0x90BE, 0xDBA5, 0x90BF, 0xDF9F, 0x90C0, 0xDFA0, 0x90C1, 0xD3F4, 0x90C2, 0xE040, + 0x90C3, 0xE041, 0x90C4, 0xDBA7, 0x90C5, 0xDBA4, 0x90C6, 0xE042, 0x90C7, 0xDBA8, 0x90C8, 0xE043, 0x90C9, 0xE044, 0x90CA, 0xBDBC, + 0x90CB, 0xE045, 0x90CC, 0xE046, 0x90CD, 0xE047, 0x90CE, 0xC0C9, 0x90CF, 0xDBA3, 0x90D0, 0xDBA6, 0x90D1, 0xD6A3, 0x90D2, 0xE048, + 0x90D3, 0xDBA9, 0x90D4, 0xE049, 0x90D5, 0xE04A, 0x90D6, 0xE04B, 0x90D7, 0xDBAD, 0x90D8, 0xE04C, 0x90D9, 0xE04D, 0x90DA, 0xE04E, + 0x90DB, 0xDBAE, 0x90DC, 0xDBAC, 0x90DD, 0xBAC2, 0x90DE, 0xE04F, 0x90DF, 0xE050, 0x90E0, 0xE051, 0x90E1, 0xBFA4, 0x90E2, 0xDBAB, + 0x90E3, 0xE052, 0x90E4, 0xE053, 0x90E5, 0xE054, 0x90E6, 0xDBAA, 0x90E7, 0xD4C7, 0x90E8, 0xB2BF, 0x90E9, 0xE055, 0x90EA, 0xE056, + 0x90EB, 0xDBAF, 0x90EC, 0xE057, 0x90ED, 0xB9F9, 0x90EE, 0xE058, 0x90EF, 0xDBB0, 0x90F0, 0xE059, 0x90F1, 0xE05A, 0x90F2, 0xE05B, + 0x90F3, 0xE05C, 0x90F4, 0xB3BB, 0x90F5, 0xE05D, 0x90F6, 0xE05E, 0x90F7, 0xE05F, 0x90F8, 0xB5A6, 0x90F9, 0xE060, 0x90FA, 0xE061, + 0x90FB, 0xE062, 0x90FC, 0xE063, 0x90FD, 0xB6BC, 0x90FE, 0xDBB1, 0x90FF, 0xE064, 0x9100, 0xE065, 0x9101, 0xE066, 0x9102, 0xB6F5, + 0x9103, 0xE067, 0x9104, 0xDBB2, 0x9105, 0xE068, 0x9106, 0xE069, 0x9107, 0xE06A, 0x9108, 0xE06B, 0x9109, 0xE06C, 0x910A, 0xE06D, + 0x910B, 0xE06E, 0x910C, 0xE06F, 0x910D, 0xE070, 0x910E, 0xE071, 0x910F, 0xE072, 0x9110, 0xE073, 0x9111, 0xE074, 0x9112, 0xE075, + 0x9113, 0xE076, 0x9114, 0xE077, 0x9115, 0xE078, 0x9116, 0xE079, 0x9117, 0xE07A, 0x9118, 0xE07B, 0x9119, 0xB1C9, 0x911A, 0xE07C, + 0x911B, 0xE07D, 0x911C, 0xE07E, 0x911D, 0xE080, 0x911E, 0xDBB4, 0x911F, 0xE081, 0x9120, 0xE082, 0x9121, 0xE083, 0x9122, 0xDBB3, + 0x9123, 0xDBB5, 0x9124, 0xE084, 0x9125, 0xE085, 0x9126, 0xE086, 0x9127, 0xE087, 0x9128, 0xE088, 0x9129, 0xE089, 0x912A, 0xE08A, + 0x912B, 0xE08B, 0x912C, 0xE08C, 0x912D, 0xE08D, 0x912E, 0xE08E, 0x912F, 0xDBB7, 0x9130, 0xE08F, 0x9131, 0xDBB6, 0x9132, 0xE090, + 0x9133, 0xE091, 0x9134, 0xE092, 0x9135, 0xE093, 0x9136, 0xE094, 0x9137, 0xE095, 0x9138, 0xE096, 0x9139, 0xDBB8, 0x913A, 0xE097, + 0x913B, 0xE098, 0x913C, 0xE099, 0x913D, 0xE09A, 0x913E, 0xE09B, 0x913F, 0xE09C, 0x9140, 0xE09D, 0x9141, 0xE09E, 0x9142, 0xE09F, + 0x9143, 0xDBB9, 0x9144, 0xE0A0, 0x9145, 0xE140, 0x9146, 0xDBBA, 0x9147, 0xE141, 0x9148, 0xE142, 0x9149, 0xD3CF, 0x914A, 0xF4FA, + 0x914B, 0xC7F5, 0x914C, 0xD7C3, 0x914D, 0xC5E4, 0x914E, 0xF4FC, 0x914F, 0xF4FD, 0x9150, 0xF4FB, 0x9151, 0xE143, 0x9152, 0xBEC6, + 0x9153, 0xE144, 0x9154, 0xE145, 0x9155, 0xE146, 0x9156, 0xE147, 0x9157, 0xD0EF, 0x9158, 0xE148, 0x9159, 0xE149, 0x915A, 0xB7D3, + 0x915B, 0xE14A, 0x915C, 0xE14B, 0x915D, 0xD4CD, 0x915E, 0xCCAA, 0x915F, 0xE14C, 0x9160, 0xE14D, 0x9161, 0xF5A2, 0x9162, 0xF5A1, + 0x9163, 0xBAA8, 0x9164, 0xF4FE, 0x9165, 0xCBD6, 0x9166, 0xE14E, 0x9167, 0xE14F, 0x9168, 0xE150, 0x9169, 0xF5A4, 0x916A, 0xC0D2, + 0x916B, 0xE151, 0x916C, 0xB3EA, 0x916D, 0xE152, 0x916E, 0xCDAA, 0x916F, 0xF5A5, 0x9170, 0xF5A3, 0x9171, 0xBDB4, 0x9172, 0xF5A8, + 0x9173, 0xE153, 0x9174, 0xF5A9, 0x9175, 0xBDCD, 0x9176, 0xC3B8, 0x9177, 0xBFE1, 0x9178, 0xCBE1, 0x9179, 0xF5AA, 0x917A, 0xE154, + 0x917B, 0xE155, 0x917C, 0xE156, 0x917D, 0xF5A6, 0x917E, 0xF5A7, 0x917F, 0xC4F0, 0x9180, 0xE157, 0x9181, 0xE158, 0x9182, 0xE159, + 0x9183, 0xE15A, 0x9184, 0xE15B, 0x9185, 0xF5AC, 0x9186, 0xE15C, 0x9187, 0xB4BC, 0x9188, 0xE15D, 0x9189, 0xD7ED, 0x918A, 0xE15E, + 0x918B, 0xB4D7, 0x918C, 0xF5AB, 0x918D, 0xF5AE, 0x918E, 0xE15F, 0x918F, 0xE160, 0x9190, 0xF5AD, 0x9191, 0xF5AF, 0x9192, 0xD0D1, + 0x9193, 0xE161, 0x9194, 0xE162, 0x9195, 0xE163, 0x9196, 0xE164, 0x9197, 0xE165, 0x9198, 0xE166, 0x9199, 0xE167, 0x919A, 0xC3D1, + 0x919B, 0xC8A9, 0x919C, 0xE168, 0x919D, 0xE169, 0x919E, 0xE16A, 0x919F, 0xE16B, 0x91A0, 0xE16C, 0x91A1, 0xE16D, 0x91A2, 0xF5B0, + 0x91A3, 0xF5B1, 0x91A4, 0xE16E, 0x91A5, 0xE16F, 0x91A6, 0xE170, 0x91A7, 0xE171, 0x91A8, 0xE172, 0x91A9, 0xE173, 0x91AA, 0xF5B2, + 0x91AB, 0xE174, 0x91AC, 0xE175, 0x91AD, 0xF5B3, 0x91AE, 0xF5B4, 0x91AF, 0xF5B5, 0x91B0, 0xE176, 0x91B1, 0xE177, 0x91B2, 0xE178, + 0x91B3, 0xE179, 0x91B4, 0xF5B7, 0x91B5, 0xF5B6, 0x91B6, 0xE17A, 0x91B7, 0xE17B, 0x91B8, 0xE17C, 0x91B9, 0xE17D, 0x91BA, 0xF5B8, + 0x91BB, 0xE17E, 0x91BC, 0xE180, 0x91BD, 0xE181, 0x91BE, 0xE182, 0x91BF, 0xE183, 0x91C0, 0xE184, 0x91C1, 0xE185, 0x91C2, 0xE186, + 0x91C3, 0xE187, 0x91C4, 0xE188, 0x91C5, 0xE189, 0x91C6, 0xE18A, 0x91C7, 0xB2C9, 0x91C8, 0xE18B, 0x91C9, 0xD3D4, 0x91CA, 0xCACD, + 0x91CB, 0xE18C, 0x91CC, 0xC0EF, 0x91CD, 0xD6D8, 0x91CE, 0xD2B0, 0x91CF, 0xC1BF, 0x91D0, 0xE18D, 0x91D1, 0xBDF0, 0x91D2, 0xE18E, + 0x91D3, 0xE18F, 0x91D4, 0xE190, 0x91D5, 0xE191, 0x91D6, 0xE192, 0x91D7, 0xE193, 0x91D8, 0xE194, 0x91D9, 0xE195, 0x91DA, 0xE196, + 0x91DB, 0xE197, 0x91DC, 0xB8AA, 0x91DD, 0xE198, 0x91DE, 0xE199, 0x91DF, 0xE19A, 0x91E0, 0xE19B, 0x91E1, 0xE19C, 0x91E2, 0xE19D, + 0x91E3, 0xE19E, 0x91E4, 0xE19F, 0x91E5, 0xE1A0, 0x91E6, 0xE240, 0x91E7, 0xE241, 0x91E8, 0xE242, 0x91E9, 0xE243, 0x91EA, 0xE244, + 0x91EB, 0xE245, 0x91EC, 0xE246, 0x91ED, 0xE247, 0x91EE, 0xE248, 0x91EF, 0xE249, 0x91F0, 0xE24A, 0x91F1, 0xE24B, 0x91F2, 0xE24C, + 0x91F3, 0xE24D, 0x91F4, 0xE24E, 0x91F5, 0xE24F, 0x91F6, 0xE250, 0x91F7, 0xE251, 0x91F8, 0xE252, 0x91F9, 0xE253, 0x91FA, 0xE254, + 0x91FB, 0xE255, 0x91FC, 0xE256, 0x91FD, 0xE257, 0x91FE, 0xE258, 0x91FF, 0xE259, 0x9200, 0xE25A, 0x9201, 0xE25B, 0x9202, 0xE25C, + 0x9203, 0xE25D, 0x9204, 0xE25E, 0x9205, 0xE25F, 0x9206, 0xE260, 0x9207, 0xE261, 0x9208, 0xE262, 0x9209, 0xE263, 0x920A, 0xE264, + 0x920B, 0xE265, 0x920C, 0xE266, 0x920D, 0xE267, 0x920E, 0xE268, 0x920F, 0xE269, 0x9210, 0xE26A, 0x9211, 0xE26B, 0x9212, 0xE26C, + 0x9213, 0xE26D, 0x9214, 0xE26E, 0x9215, 0xE26F, 0x9216, 0xE270, 0x9217, 0xE271, 0x9218, 0xE272, 0x9219, 0xE273, 0x921A, 0xE274, + 0x921B, 0xE275, 0x921C, 0xE276, 0x921D, 0xE277, 0x921E, 0xE278, 0x921F, 0xE279, 0x9220, 0xE27A, 0x9221, 0xE27B, 0x9222, 0xE27C, + 0x9223, 0xE27D, 0x9224, 0xE27E, 0x9225, 0xE280, 0x9226, 0xE281, 0x9227, 0xE282, 0x9228, 0xE283, 0x9229, 0xE284, 0x922A, 0xE285, + 0x922B, 0xE286, 0x922C, 0xE287, 0x922D, 0xE288, 0x922E, 0xE289, 0x922F, 0xE28A, 0x9230, 0xE28B, 0x9231, 0xE28C, 0x9232, 0xE28D, + 0x9233, 0xE28E, 0x9234, 0xE28F, 0x9235, 0xE290, 0x9236, 0xE291, 0x9237, 0xE292, 0x9238, 0xE293, 0x9239, 0xE294, 0x923A, 0xE295, + 0x923B, 0xE296, 0x923C, 0xE297, 0x923D, 0xE298, 0x923E, 0xE299, 0x923F, 0xE29A, 0x9240, 0xE29B, 0x9241, 0xE29C, 0x9242, 0xE29D, + 0x9243, 0xE29E, 0x9244, 0xE29F, 0x9245, 0xE2A0, 0x9246, 0xE340, 0x9247, 0xE341, 0x9248, 0xE342, 0x9249, 0xE343, 0x924A, 0xE344, + 0x924B, 0xE345, 0x924C, 0xE346, 0x924D, 0xE347, 0x924E, 0xE348, 0x924F, 0xE349, 0x9250, 0xE34A, 0x9251, 0xE34B, 0x9252, 0xE34C, + 0x9253, 0xE34D, 0x9254, 0xE34E, 0x9255, 0xE34F, 0x9256, 0xE350, 0x9257, 0xE351, 0x9258, 0xE352, 0x9259, 0xE353, 0x925A, 0xE354, + 0x925B, 0xE355, 0x925C, 0xE356, 0x925D, 0xE357, 0x925E, 0xE358, 0x925F, 0xE359, 0x9260, 0xE35A, 0x9261, 0xE35B, 0x9262, 0xE35C, + 0x9263, 0xE35D, 0x9264, 0xE35E, 0x9265, 0xE35F, 0x9266, 0xE360, 0x9267, 0xE361, 0x9268, 0xE362, 0x9269, 0xE363, 0x926A, 0xE364, + 0x926B, 0xE365, 0x926C, 0xE366, 0x926D, 0xE367, 0x926E, 0xE368, 0x926F, 0xE369, 0x9270, 0xE36A, 0x9271, 0xE36B, 0x9272, 0xE36C, + 0x9273, 0xE36D, 0x9274, 0xBCF8, 0x9275, 0xE36E, 0x9276, 0xE36F, 0x9277, 0xE370, 0x9278, 0xE371, 0x9279, 0xE372, 0x927A, 0xE373, + 0x927B, 0xE374, 0x927C, 0xE375, 0x927D, 0xE376, 0x927E, 0xE377, 0x927F, 0xE378, 0x9280, 0xE379, 0x9281, 0xE37A, 0x9282, 0xE37B, + 0x9283, 0xE37C, 0x9284, 0xE37D, 0x9285, 0xE37E, 0x9286, 0xE380, 0x9287, 0xE381, 0x9288, 0xE382, 0x9289, 0xE383, 0x928A, 0xE384, + 0x928B, 0xE385, 0x928C, 0xE386, 0x928D, 0xE387, 0x928E, 0xF6C6, 0x928F, 0xE388, 0x9290, 0xE389, 0x9291, 0xE38A, 0x9292, 0xE38B, + 0x9293, 0xE38C, 0x9294, 0xE38D, 0x9295, 0xE38E, 0x9296, 0xE38F, 0x9297, 0xE390, 0x9298, 0xE391, 0x9299, 0xE392, 0x929A, 0xE393, + 0x929B, 0xE394, 0x929C, 0xE395, 0x929D, 0xE396, 0x929E, 0xE397, 0x929F, 0xE398, 0x92A0, 0xE399, 0x92A1, 0xE39A, 0x92A2, 0xE39B, + 0x92A3, 0xE39C, 0x92A4, 0xE39D, 0x92A5, 0xE39E, 0x92A6, 0xE39F, 0x92A7, 0xE3A0, 0x92A8, 0xE440, 0x92A9, 0xE441, 0x92AA, 0xE442, + 0x92AB, 0xE443, 0x92AC, 0xE444, 0x92AD, 0xE445, 0x92AE, 0xF6C7, 0x92AF, 0xE446, 0x92B0, 0xE447, 0x92B1, 0xE448, 0x92B2, 0xE449, + 0x92B3, 0xE44A, 0x92B4, 0xE44B, 0x92B5, 0xE44C, 0x92B6, 0xE44D, 0x92B7, 0xE44E, 0x92B8, 0xE44F, 0x92B9, 0xE450, 0x92BA, 0xE451, + 0x92BB, 0xE452, 0x92BC, 0xE453, 0x92BD, 0xE454, 0x92BE, 0xE455, 0x92BF, 0xE456, 0x92C0, 0xE457, 0x92C1, 0xE458, 0x92C2, 0xE459, + 0x92C3, 0xE45A, 0x92C4, 0xE45B, 0x92C5, 0xE45C, 0x92C6, 0xE45D, 0x92C7, 0xE45E, 0x92C8, 0xF6C8, 0x92C9, 0xE45F, 0x92CA, 0xE460, + 0x92CB, 0xE461, 0x92CC, 0xE462, 0x92CD, 0xE463, 0x92CE, 0xE464, 0x92CF, 0xE465, 0x92D0, 0xE466, 0x92D1, 0xE467, 0x92D2, 0xE468, + 0x92D3, 0xE469, 0x92D4, 0xE46A, 0x92D5, 0xE46B, 0x92D6, 0xE46C, 0x92D7, 0xE46D, 0x92D8, 0xE46E, 0x92D9, 0xE46F, 0x92DA, 0xE470, + 0x92DB, 0xE471, 0x92DC, 0xE472, 0x92DD, 0xE473, 0x92DE, 0xE474, 0x92DF, 0xE475, 0x92E0, 0xE476, 0x92E1, 0xE477, 0x92E2, 0xE478, + 0x92E3, 0xE479, 0x92E4, 0xE47A, 0x92E5, 0xE47B, 0x92E6, 0xE47C, 0x92E7, 0xE47D, 0x92E8, 0xE47E, 0x92E9, 0xE480, 0x92EA, 0xE481, + 0x92EB, 0xE482, 0x92EC, 0xE483, 0x92ED, 0xE484, 0x92EE, 0xE485, 0x92EF, 0xE486, 0x92F0, 0xE487, 0x92F1, 0xE488, 0x92F2, 0xE489, + 0x92F3, 0xE48A, 0x92F4, 0xE48B, 0x92F5, 0xE48C, 0x92F6, 0xE48D, 0x92F7, 0xE48E, 0x92F8, 0xE48F, 0x92F9, 0xE490, 0x92FA, 0xE491, + 0x92FB, 0xE492, 0x92FC, 0xE493, 0x92FD, 0xE494, 0x92FE, 0xE495, 0x92FF, 0xE496, 0x9300, 0xE497, 0x9301, 0xE498, 0x9302, 0xE499, + 0x9303, 0xE49A, 0x9304, 0xE49B, 0x9305, 0xE49C, 0x9306, 0xE49D, 0x9307, 0xE49E, 0x9308, 0xE49F, 0x9309, 0xE4A0, 0x930A, 0xE540, + 0x930B, 0xE541, 0x930C, 0xE542, 0x930D, 0xE543, 0x930E, 0xE544, 0x930F, 0xE545, 0x9310, 0xE546, 0x9311, 0xE547, 0x9312, 0xE548, + 0x9313, 0xE549, 0x9314, 0xE54A, 0x9315, 0xE54B, 0x9316, 0xE54C, 0x9317, 0xE54D, 0x9318, 0xE54E, 0x9319, 0xE54F, 0x931A, 0xE550, + 0x931B, 0xE551, 0x931C, 0xE552, 0x931D, 0xE553, 0x931E, 0xE554, 0x931F, 0xE555, 0x9320, 0xE556, 0x9321, 0xE557, 0x9322, 0xE558, + 0x9323, 0xE559, 0x9324, 0xE55A, 0x9325, 0xE55B, 0x9326, 0xE55C, 0x9327, 0xE55D, 0x9328, 0xE55E, 0x9329, 0xE55F, 0x932A, 0xE560, + 0x932B, 0xE561, 0x932C, 0xE562, 0x932D, 0xE563, 0x932E, 0xE564, 0x932F, 0xE565, 0x9330, 0xE566, 0x9331, 0xE567, 0x9332, 0xE568, + 0x9333, 0xE569, 0x9334, 0xE56A, 0x9335, 0xE56B, 0x9336, 0xE56C, 0x9337, 0xE56D, 0x9338, 0xE56E, 0x9339, 0xE56F, 0x933A, 0xE570, + 0x933B, 0xE571, 0x933C, 0xE572, 0x933D, 0xE573, 0x933E, 0xF6C9, 0x933F, 0xE574, 0x9340, 0xE575, 0x9341, 0xE576, 0x9342, 0xE577, + 0x9343, 0xE578, 0x9344, 0xE579, 0x9345, 0xE57A, 0x9346, 0xE57B, 0x9347, 0xE57C, 0x9348, 0xE57D, 0x9349, 0xE57E, 0x934A, 0xE580, + 0x934B, 0xE581, 0x934C, 0xE582, 0x934D, 0xE583, 0x934E, 0xE584, 0x934F, 0xE585, 0x9350, 0xE586, 0x9351, 0xE587, 0x9352, 0xE588, + 0x9353, 0xE589, 0x9354, 0xE58A, 0x9355, 0xE58B, 0x9356, 0xE58C, 0x9357, 0xE58D, 0x9358, 0xE58E, 0x9359, 0xE58F, 0x935A, 0xE590, + 0x935B, 0xE591, 0x935C, 0xE592, 0x935D, 0xE593, 0x935E, 0xE594, 0x935F, 0xE595, 0x9360, 0xE596, 0x9361, 0xE597, 0x9362, 0xE598, + 0x9363, 0xE599, 0x9364, 0xE59A, 0x9365, 0xE59B, 0x9366, 0xE59C, 0x9367, 0xE59D, 0x9368, 0xE59E, 0x9369, 0xE59F, 0x936A, 0xF6CA, + 0x936B, 0xE5A0, 0x936C, 0xE640, 0x936D, 0xE641, 0x936E, 0xE642, 0x936F, 0xE643, 0x9370, 0xE644, 0x9371, 0xE645, 0x9372, 0xE646, + 0x9373, 0xE647, 0x9374, 0xE648, 0x9375, 0xE649, 0x9376, 0xE64A, 0x9377, 0xE64B, 0x9378, 0xE64C, 0x9379, 0xE64D, 0x937A, 0xE64E, + 0x937B, 0xE64F, 0x937C, 0xE650, 0x937D, 0xE651, 0x937E, 0xE652, 0x937F, 0xE653, 0x9380, 0xE654, 0x9381, 0xE655, 0x9382, 0xE656, + 0x9383, 0xE657, 0x9384, 0xE658, 0x9385, 0xE659, 0x9386, 0xE65A, 0x9387, 0xE65B, 0x9388, 0xE65C, 0x9389, 0xE65D, 0x938A, 0xE65E, + 0x938B, 0xE65F, 0x938C, 0xE660, 0x938D, 0xE661, 0x938E, 0xE662, 0x938F, 0xF6CC, 0x9390, 0xE663, 0x9391, 0xE664, 0x9392, 0xE665, + 0x9393, 0xE666, 0x9394, 0xE667, 0x9395, 0xE668, 0x9396, 0xE669, 0x9397, 0xE66A, 0x9398, 0xE66B, 0x9399, 0xE66C, 0x939A, 0xE66D, + 0x939B, 0xE66E, 0x939C, 0xE66F, 0x939D, 0xE670, 0x939E, 0xE671, 0x939F, 0xE672, 0x93A0, 0xE673, 0x93A1, 0xE674, 0x93A2, 0xE675, + 0x93A3, 0xE676, 0x93A4, 0xE677, 0x93A5, 0xE678, 0x93A6, 0xE679, 0x93A7, 0xE67A, 0x93A8, 0xE67B, 0x93A9, 0xE67C, 0x93AA, 0xE67D, + 0x93AB, 0xE67E, 0x93AC, 0xE680, 0x93AD, 0xE681, 0x93AE, 0xE682, 0x93AF, 0xE683, 0x93B0, 0xE684, 0x93B1, 0xE685, 0x93B2, 0xE686, + 0x93B3, 0xE687, 0x93B4, 0xE688, 0x93B5, 0xE689, 0x93B6, 0xE68A, 0x93B7, 0xE68B, 0x93B8, 0xE68C, 0x93B9, 0xE68D, 0x93BA, 0xE68E, + 0x93BB, 0xE68F, 0x93BC, 0xE690, 0x93BD, 0xE691, 0x93BE, 0xE692, 0x93BF, 0xE693, 0x93C0, 0xE694, 0x93C1, 0xE695, 0x93C2, 0xE696, + 0x93C3, 0xE697, 0x93C4, 0xE698, 0x93C5, 0xE699, 0x93C6, 0xE69A, 0x93C7, 0xE69B, 0x93C8, 0xE69C, 0x93C9, 0xE69D, 0x93CA, 0xF6CB, + 0x93CB, 0xE69E, 0x93CC, 0xE69F, 0x93CD, 0xE6A0, 0x93CE, 0xE740, 0x93CF, 0xE741, 0x93D0, 0xE742, 0x93D1, 0xE743, 0x93D2, 0xE744, + 0x93D3, 0xE745, 0x93D4, 0xE746, 0x93D5, 0xE747, 0x93D6, 0xF7E9, 0x93D7, 0xE748, 0x93D8, 0xE749, 0x93D9, 0xE74A, 0x93DA, 0xE74B, + 0x93DB, 0xE74C, 0x93DC, 0xE74D, 0x93DD, 0xE74E, 0x93DE, 0xE74F, 0x93DF, 0xE750, 0x93E0, 0xE751, 0x93E1, 0xE752, 0x93E2, 0xE753, + 0x93E3, 0xE754, 0x93E4, 0xE755, 0x93E5, 0xE756, 0x93E6, 0xE757, 0x93E7, 0xE758, 0x93E8, 0xE759, 0x93E9, 0xE75A, 0x93EA, 0xE75B, + 0x93EB, 0xE75C, 0x93EC, 0xE75D, 0x93ED, 0xE75E, 0x93EE, 0xE75F, 0x93EF, 0xE760, 0x93F0, 0xE761, 0x93F1, 0xE762, 0x93F2, 0xE763, + 0x93F3, 0xE764, 0x93F4, 0xE765, 0x93F5, 0xE766, 0x93F6, 0xE767, 0x93F7, 0xE768, 0x93F8, 0xE769, 0x93F9, 0xE76A, 0x93FA, 0xE76B, + 0x93FB, 0xE76C, 0x93FC, 0xE76D, 0x93FD, 0xE76E, 0x93FE, 0xE76F, 0x93FF, 0xE770, 0x9400, 0xE771, 0x9401, 0xE772, 0x9402, 0xE773, + 0x9403, 0xE774, 0x9404, 0xE775, 0x9405, 0xE776, 0x9406, 0xE777, 0x9407, 0xE778, 0x9408, 0xE779, 0x9409, 0xE77A, 0x940A, 0xE77B, + 0x940B, 0xE77C, 0x940C, 0xE77D, 0x940D, 0xE77E, 0x940E, 0xE780, 0x940F, 0xE781, 0x9410, 0xE782, 0x9411, 0xE783, 0x9412, 0xE784, + 0x9413, 0xE785, 0x9414, 0xE786, 0x9415, 0xE787, 0x9416, 0xE788, 0x9417, 0xE789, 0x9418, 0xE78A, 0x9419, 0xE78B, 0x941A, 0xE78C, + 0x941B, 0xE78D, 0x941C, 0xE78E, 0x941D, 0xE78F, 0x941E, 0xE790, 0x941F, 0xE791, 0x9420, 0xE792, 0x9421, 0xE793, 0x9422, 0xE794, + 0x9423, 0xE795, 0x9424, 0xE796, 0x9425, 0xE797, 0x9426, 0xE798, 0x9427, 0xE799, 0x9428, 0xE79A, 0x9429, 0xE79B, 0x942A, 0xE79C, + 0x942B, 0xE79D, 0x942C, 0xE79E, 0x942D, 0xE79F, 0x942E, 0xE7A0, 0x942F, 0xE840, 0x9430, 0xE841, 0x9431, 0xE842, 0x9432, 0xE843, + 0x9433, 0xE844, 0x9434, 0xE845, 0x9435, 0xE846, 0x9436, 0xE847, 0x9437, 0xE848, 0x9438, 0xE849, 0x9439, 0xE84A, 0x943A, 0xE84B, + 0x943B, 0xE84C, 0x943C, 0xE84D, 0x943D, 0xE84E, 0x943E, 0xF6CD, 0x943F, 0xE84F, 0x9440, 0xE850, 0x9441, 0xE851, 0x9442, 0xE852, + 0x9443, 0xE853, 0x9444, 0xE854, 0x9445, 0xE855, 0x9446, 0xE856, 0x9447, 0xE857, 0x9448, 0xE858, 0x9449, 0xE859, 0x944A, 0xE85A, + 0x944B, 0xE85B, 0x944C, 0xE85C, 0x944D, 0xE85D, 0x944E, 0xE85E, 0x944F, 0xE85F, 0x9450, 0xE860, 0x9451, 0xE861, 0x9452, 0xE862, + 0x9453, 0xE863, 0x9454, 0xE864, 0x9455, 0xE865, 0x9456, 0xE866, 0x9457, 0xE867, 0x9458, 0xE868, 0x9459, 0xE869, 0x945A, 0xE86A, + 0x945B, 0xE86B, 0x945C, 0xE86C, 0x945D, 0xE86D, 0x945E, 0xE86E, 0x945F, 0xE86F, 0x9460, 0xE870, 0x9461, 0xE871, 0x9462, 0xE872, + 0x9463, 0xE873, 0x9464, 0xE874, 0x9465, 0xE875, 0x9466, 0xE876, 0x9467, 0xE877, 0x9468, 0xE878, 0x9469, 0xE879, 0x946A, 0xE87A, + 0x946B, 0xF6CE, 0x946C, 0xE87B, 0x946D, 0xE87C, 0x946E, 0xE87D, 0x946F, 0xE87E, 0x9470, 0xE880, 0x9471, 0xE881, 0x9472, 0xE882, + 0x9473, 0xE883, 0x9474, 0xE884, 0x9475, 0xE885, 0x9476, 0xE886, 0x9477, 0xE887, 0x9478, 0xE888, 0x9479, 0xE889, 0x947A, 0xE88A, + 0x947B, 0xE88B, 0x947C, 0xE88C, 0x947D, 0xE88D, 0x947E, 0xE88E, 0x947F, 0xE88F, 0x9480, 0xE890, 0x9481, 0xE891, 0x9482, 0xE892, + 0x9483, 0xE893, 0x9484, 0xE894, 0x9485, 0xEEC4, 0x9486, 0xEEC5, 0x9487, 0xEEC6, 0x9488, 0xD5EB, 0x9489, 0xB6A4, 0x948A, 0xEEC8, + 0x948B, 0xEEC7, 0x948C, 0xEEC9, 0x948D, 0xEECA, 0x948E, 0xC7A5, 0x948F, 0xEECB, 0x9490, 0xEECC, 0x9491, 0xE895, 0x9492, 0xB7B0, + 0x9493, 0xB5F6, 0x9494, 0xEECD, 0x9495, 0xEECF, 0x9496, 0xE896, 0x9497, 0xEECE, 0x9498, 0xE897, 0x9499, 0xB8C6, 0x949A, 0xEED0, + 0x949B, 0xEED1, 0x949C, 0xEED2, 0x949D, 0xB6DB, 0x949E, 0xB3AE, 0x949F, 0xD6D3, 0x94A0, 0xC4C6, 0x94A1, 0xB1B5, 0x94A2, 0xB8D6, + 0x94A3, 0xEED3, 0x94A4, 0xEED4, 0x94A5, 0xD4BF, 0x94A6, 0xC7D5, 0x94A7, 0xBEFB, 0x94A8, 0xCED9, 0x94A9, 0xB9B3, 0x94AA, 0xEED6, + 0x94AB, 0xEED5, 0x94AC, 0xEED8, 0x94AD, 0xEED7, 0x94AE, 0xC5A5, 0x94AF, 0xEED9, 0x94B0, 0xEEDA, 0x94B1, 0xC7AE, 0x94B2, 0xEEDB, + 0x94B3, 0xC7AF, 0x94B4, 0xEEDC, 0x94B5, 0xB2A7, 0x94B6, 0xEEDD, 0x94B7, 0xEEDE, 0x94B8, 0xEEDF, 0x94B9, 0xEEE0, 0x94BA, 0xEEE1, + 0x94BB, 0xD7EA, 0x94BC, 0xEEE2, 0x94BD, 0xEEE3, 0x94BE, 0xBCD8, 0x94BF, 0xEEE4, 0x94C0, 0xD3CB, 0x94C1, 0xCCFA, 0x94C2, 0xB2AC, + 0x94C3, 0xC1E5, 0x94C4, 0xEEE5, 0x94C5, 0xC7A6, 0x94C6, 0xC3AD, 0x94C7, 0xE898, 0x94C8, 0xEEE6, 0x94C9, 0xEEE7, 0x94CA, 0xEEE8, + 0x94CB, 0xEEE9, 0x94CC, 0xEEEA, 0x94CD, 0xEEEB, 0x94CE, 0xEEEC, 0x94CF, 0xE899, 0x94D0, 0xEEED, 0x94D1, 0xEEEE, 0x94D2, 0xEEEF, + 0x94D3, 0xE89A, 0x94D4, 0xE89B, 0x94D5, 0xEEF0, 0x94D6, 0xEEF1, 0x94D7, 0xEEF2, 0x94D8, 0xEEF4, 0x94D9, 0xEEF3, 0x94DA, 0xE89C, + 0x94DB, 0xEEF5, 0x94DC, 0xCDAD, 0x94DD, 0xC2C1, 0x94DE, 0xEEF6, 0x94DF, 0xEEF7, 0x94E0, 0xEEF8, 0x94E1, 0xD5A1, 0x94E2, 0xEEF9, + 0x94E3, 0xCFB3, 0x94E4, 0xEEFA, 0x94E5, 0xEEFB, 0x94E6, 0xE89D, 0x94E7, 0xEEFC, 0x94E8, 0xEEFD, 0x94E9, 0xEFA1, 0x94EA, 0xEEFE, + 0x94EB, 0xEFA2, 0x94EC, 0xB8F5, 0x94ED, 0xC3FA, 0x94EE, 0xEFA3, 0x94EF, 0xEFA4, 0x94F0, 0xBDC2, 0x94F1, 0xD2BF, 0x94F2, 0xB2F9, + 0x94F3, 0xEFA5, 0x94F4, 0xEFA6, 0x94F5, 0xEFA7, 0x94F6, 0xD2F8, 0x94F7, 0xEFA8, 0x94F8, 0xD6FD, 0x94F9, 0xEFA9, 0x94FA, 0xC6CC, + 0x94FB, 0xE89E, 0x94FC, 0xEFAA, 0x94FD, 0xEFAB, 0x94FE, 0xC1B4, 0x94FF, 0xEFAC, 0x9500, 0xCFFA, 0x9501, 0xCBF8, 0x9502, 0xEFAE, + 0x9503, 0xEFAD, 0x9504, 0xB3FA, 0x9505, 0xB9F8, 0x9506, 0xEFAF, 0x9507, 0xEFB0, 0x9508, 0xD0E2, 0x9509, 0xEFB1, 0x950A, 0xEFB2, + 0x950B, 0xB7E6, 0x950C, 0xD0BF, 0x950D, 0xEFB3, 0x950E, 0xEFB4, 0x950F, 0xEFB5, 0x9510, 0xC8F1, 0x9511, 0xCCE0, 0x9512, 0xEFB6, + 0x9513, 0xEFB7, 0x9514, 0xEFB8, 0x9515, 0xEFB9, 0x9516, 0xEFBA, 0x9517, 0xD5E0, 0x9518, 0xEFBB, 0x9519, 0xB4ED, 0x951A, 0xC3AA, + 0x951B, 0xEFBC, 0x951C, 0xE89F, 0x951D, 0xEFBD, 0x951E, 0xEFBE, 0x951F, 0xEFBF, 0x9520, 0xE8A0, 0x9521, 0xCEFD, 0x9522, 0xEFC0, + 0x9523, 0xC2E0, 0x9524, 0xB4B8, 0x9525, 0xD7B6, 0x9526, 0xBDF5, 0x9527, 0xE940, 0x9528, 0xCFC7, 0x9529, 0xEFC3, 0x952A, 0xEFC1, + 0x952B, 0xEFC2, 0x952C, 0xEFC4, 0x952D, 0xB6A7, 0x952E, 0xBCFC, 0x952F, 0xBEE2, 0x9530, 0xC3CC, 0x9531, 0xEFC5, 0x9532, 0xEFC6, + 0x9533, 0xE941, 0x9534, 0xEFC7, 0x9535, 0xEFCF, 0x9536, 0xEFC8, 0x9537, 0xEFC9, 0x9538, 0xEFCA, 0x9539, 0xC7C2, 0x953A, 0xEFF1, + 0x953B, 0xB6CD, 0x953C, 0xEFCB, 0x953D, 0xE942, 0x953E, 0xEFCC, 0x953F, 0xEFCD, 0x9540, 0xB6C6, 0x9541, 0xC3BE, 0x9542, 0xEFCE, + 0x9543, 0xE943, 0x9544, 0xEFD0, 0x9545, 0xEFD1, 0x9546, 0xEFD2, 0x9547, 0xD5F2, 0x9548, 0xE944, 0x9549, 0xEFD3, 0x954A, 0xC4F7, + 0x954B, 0xE945, 0x954C, 0xEFD4, 0x954D, 0xC4F8, 0x954E, 0xEFD5, 0x954F, 0xEFD6, 0x9550, 0xB8E4, 0x9551, 0xB0F7, 0x9552, 0xEFD7, + 0x9553, 0xEFD8, 0x9554, 0xEFD9, 0x9555, 0xE946, 0x9556, 0xEFDA, 0x9557, 0xEFDB, 0x9558, 0xEFDC, 0x9559, 0xEFDD, 0x955A, 0xE947, + 0x955B, 0xEFDE, 0x955C, 0xBEB5, 0x955D, 0xEFE1, 0x955E, 0xEFDF, 0x955F, 0xEFE0, 0x9560, 0xE948, 0x9561, 0xEFE2, 0x9562, 0xEFE3, + 0x9563, 0xC1CD, 0x9564, 0xEFE4, 0x9565, 0xEFE5, 0x9566, 0xEFE6, 0x9567, 0xEFE7, 0x9568, 0xEFE8, 0x9569, 0xEFE9, 0x956A, 0xEFEA, + 0x956B, 0xEFEB, 0x956C, 0xEFEC, 0x956D, 0xC0D8, 0x956E, 0xE949, 0x956F, 0xEFED, 0x9570, 0xC1AD, 0x9571, 0xEFEE, 0x9572, 0xEFEF, + 0x9573, 0xEFF0, 0x9574, 0xE94A, 0x9575, 0xE94B, 0x9576, 0xCFE2, 0x9577, 0xE94C, 0x9578, 0xE94D, 0x9579, 0xE94E, 0x957A, 0xE94F, + 0x957B, 0xE950, 0x957C, 0xE951, 0x957D, 0xE952, 0x957E, 0xE953, 0x957F, 0xB3A4, 0x9580, 0xE954, 0x9581, 0xE955, 0x9582, 0xE956, + 0x9583, 0xE957, 0x9584, 0xE958, 0x9585, 0xE959, 0x9586, 0xE95A, 0x9587, 0xE95B, 0x9588, 0xE95C, 0x9589, 0xE95D, 0x958A, 0xE95E, + 0x958B, 0xE95F, 0x958C, 0xE960, 0x958D, 0xE961, 0x958E, 0xE962, 0x958F, 0xE963, 0x9590, 0xE964, 0x9591, 0xE965, 0x9592, 0xE966, + 0x9593, 0xE967, 0x9594, 0xE968, 0x9595, 0xE969, 0x9596, 0xE96A, 0x9597, 0xE96B, 0x9598, 0xE96C, 0x9599, 0xE96D, 0x959A, 0xE96E, + 0x959B, 0xE96F, 0x959C, 0xE970, 0x959D, 0xE971, 0x959E, 0xE972, 0x959F, 0xE973, 0x95A0, 0xE974, 0x95A1, 0xE975, 0x95A2, 0xE976, + 0x95A3, 0xE977, 0x95A4, 0xE978, 0x95A5, 0xE979, 0x95A6, 0xE97A, 0x95A7, 0xE97B, 0x95A8, 0xE97C, 0x95A9, 0xE97D, 0x95AA, 0xE97E, + 0x95AB, 0xE980, 0x95AC, 0xE981, 0x95AD, 0xE982, 0x95AE, 0xE983, 0x95AF, 0xE984, 0x95B0, 0xE985, 0x95B1, 0xE986, 0x95B2, 0xE987, + 0x95B3, 0xE988, 0x95B4, 0xE989, 0x95B5, 0xE98A, 0x95B6, 0xE98B, 0x95B7, 0xE98C, 0x95B8, 0xE98D, 0x95B9, 0xE98E, 0x95BA, 0xE98F, + 0x95BB, 0xE990, 0x95BC, 0xE991, 0x95BD, 0xE992, 0x95BE, 0xE993, 0x95BF, 0xE994, 0x95C0, 0xE995, 0x95C1, 0xE996, 0x95C2, 0xE997, + 0x95C3, 0xE998, 0x95C4, 0xE999, 0x95C5, 0xE99A, 0x95C6, 0xE99B, 0x95C7, 0xE99C, 0x95C8, 0xE99D, 0x95C9, 0xE99E, 0x95CA, 0xE99F, + 0x95CB, 0xE9A0, 0x95CC, 0xEA40, 0x95CD, 0xEA41, 0x95CE, 0xEA42, 0x95CF, 0xEA43, 0x95D0, 0xEA44, 0x95D1, 0xEA45, 0x95D2, 0xEA46, + 0x95D3, 0xEA47, 0x95D4, 0xEA48, 0x95D5, 0xEA49, 0x95D6, 0xEA4A, 0x95D7, 0xEA4B, 0x95D8, 0xEA4C, 0x95D9, 0xEA4D, 0x95DA, 0xEA4E, + 0x95DB, 0xEA4F, 0x95DC, 0xEA50, 0x95DD, 0xEA51, 0x95DE, 0xEA52, 0x95DF, 0xEA53, 0x95E0, 0xEA54, 0x95E1, 0xEA55, 0x95E2, 0xEA56, + 0x95E3, 0xEA57, 0x95E4, 0xEA58, 0x95E5, 0xEA59, 0x95E6, 0xEA5A, 0x95E7, 0xEA5B, 0x95E8, 0xC3C5, 0x95E9, 0xE3C5, 0x95EA, 0xC9C1, + 0x95EB, 0xE3C6, 0x95EC, 0xEA5C, 0x95ED, 0xB1D5, 0x95EE, 0xCECA, 0x95EF, 0xB4B3, 0x95F0, 0xC8F2, 0x95F1, 0xE3C7, 0x95F2, 0xCFD0, + 0x95F3, 0xE3C8, 0x95F4, 0xBCE4, 0x95F5, 0xE3C9, 0x95F6, 0xE3CA, 0x95F7, 0xC3C6, 0x95F8, 0xD5A2, 0x95F9, 0xC4D6, 0x95FA, 0xB9EB, + 0x95FB, 0xCEC5, 0x95FC, 0xE3CB, 0x95FD, 0xC3F6, 0x95FE, 0xE3CC, 0x95FF, 0xEA5D, 0x9600, 0xB7A7, 0x9601, 0xB8F3, 0x9602, 0xBAD2, + 0x9603, 0xE3CD, 0x9604, 0xE3CE, 0x9605, 0xD4C4, 0x9606, 0xE3CF, 0x9607, 0xEA5E, 0x9608, 0xE3D0, 0x9609, 0xD1CB, 0x960A, 0xE3D1, + 0x960B, 0xE3D2, 0x960C, 0xE3D3, 0x960D, 0xE3D4, 0x960E, 0xD1D6, 0x960F, 0xE3D5, 0x9610, 0xB2FB, 0x9611, 0xC0BB, 0x9612, 0xE3D6, + 0x9613, 0xEA5F, 0x9614, 0xC0AB, 0x9615, 0xE3D7, 0x9616, 0xE3D8, 0x9617, 0xE3D9, 0x9618, 0xEA60, 0x9619, 0xE3DA, 0x961A, 0xE3DB, + 0x961B, 0xEA61, 0x961C, 0xB8B7, 0x961D, 0xDAE2, 0x961E, 0xEA62, 0x961F, 0xB6D3, 0x9620, 0xEA63, 0x9621, 0xDAE4, 0x9622, 0xDAE3, + 0x9623, 0xEA64, 0x9624, 0xEA65, 0x9625, 0xEA66, 0x9626, 0xEA67, 0x9627, 0xEA68, 0x9628, 0xEA69, 0x9629, 0xEA6A, 0x962A, 0xDAE6, + 0x962B, 0xEA6B, 0x962C, 0xEA6C, 0x962D, 0xEA6D, 0x962E, 0xC8EE, 0x962F, 0xEA6E, 0x9630, 0xEA6F, 0x9631, 0xDAE5, 0x9632, 0xB7C0, + 0x9633, 0xD1F4, 0x9634, 0xD2F5, 0x9635, 0xD5F3, 0x9636, 0xBDD7, 0x9637, 0xEA70, 0x9638, 0xEA71, 0x9639, 0xEA72, 0x963A, 0xEA73, + 0x963B, 0xD7E8, 0x963C, 0xDAE8, 0x963D, 0xDAE7, 0x963E, 0xEA74, 0x963F, 0xB0A2, 0x9640, 0xCDD3, 0x9641, 0xEA75, 0x9642, 0xDAE9, + 0x9643, 0xEA76, 0x9644, 0xB8BD, 0x9645, 0xBCCA, 0x9646, 0xC2BD, 0x9647, 0xC2A4, 0x9648, 0xB3C2, 0x9649, 0xDAEA, 0x964A, 0xEA77, + 0x964B, 0xC2AA, 0x964C, 0xC4B0, 0x964D, 0xBDB5, 0x964E, 0xEA78, 0x964F, 0xEA79, 0x9650, 0xCFDE, 0x9651, 0xEA7A, 0x9652, 0xEA7B, + 0x9653, 0xEA7C, 0x9654, 0xDAEB, 0x9655, 0xC9C2, 0x9656, 0xEA7D, 0x9657, 0xEA7E, 0x9658, 0xEA80, 0x9659, 0xEA81, 0x965A, 0xEA82, + 0x965B, 0xB1DD, 0x965C, 0xEA83, 0x965D, 0xEA84, 0x965E, 0xEA85, 0x965F, 0xDAEC, 0x9660, 0xEA86, 0x9661, 0xB6B8, 0x9662, 0xD4BA, + 0x9663, 0xEA87, 0x9664, 0xB3FD, 0x9665, 0xEA88, 0x9666, 0xEA89, 0x9667, 0xDAED, 0x9668, 0xD4C9, 0x9669, 0xCFD5, 0x966A, 0xC5E3, + 0x966B, 0xEA8A, 0x966C, 0xDAEE, 0x966D, 0xEA8B, 0x966E, 0xEA8C, 0x966F, 0xEA8D, 0x9670, 0xEA8E, 0x9671, 0xEA8F, 0x9672, 0xDAEF, + 0x9673, 0xEA90, 0x9674, 0xDAF0, 0x9675, 0xC1EA, 0x9676, 0xCCD5, 0x9677, 0xCFDD, 0x9678, 0xEA91, 0x9679, 0xEA92, 0x967A, 0xEA93, + 0x967B, 0xEA94, 0x967C, 0xEA95, 0x967D, 0xEA96, 0x967E, 0xEA97, 0x967F, 0xEA98, 0x9680, 0xEA99, 0x9681, 0xEA9A, 0x9682, 0xEA9B, + 0x9683, 0xEA9C, 0x9684, 0xEA9D, 0x9685, 0xD3E7, 0x9686, 0xC2A1, 0x9687, 0xEA9E, 0x9688, 0xDAF1, 0x9689, 0xEA9F, 0x968A, 0xEAA0, + 0x968B, 0xCBE5, 0x968C, 0xEB40, 0x968D, 0xDAF2, 0x968E, 0xEB41, 0x968F, 0xCBE6, 0x9690, 0xD2FE, 0x9691, 0xEB42, 0x9692, 0xEB43, + 0x9693, 0xEB44, 0x9694, 0xB8F4, 0x9695, 0xEB45, 0x9696, 0xEB46, 0x9697, 0xDAF3, 0x9698, 0xB0AF, 0x9699, 0xCFB6, 0x969A, 0xEB47, + 0x969B, 0xEB48, 0x969C, 0xD5CF, 0x969D, 0xEB49, 0x969E, 0xEB4A, 0x969F, 0xEB4B, 0x96A0, 0xEB4C, 0x96A1, 0xEB4D, 0x96A2, 0xEB4E, + 0x96A3, 0xEB4F, 0x96A4, 0xEB50, 0x96A5, 0xEB51, 0x96A6, 0xEB52, 0x96A7, 0xCBED, 0x96A8, 0xEB53, 0x96A9, 0xEB54, 0x96AA, 0xEB55, + 0x96AB, 0xEB56, 0x96AC, 0xEB57, 0x96AD, 0xEB58, 0x96AE, 0xEB59, 0x96AF, 0xEB5A, 0x96B0, 0xDAF4, 0x96B1, 0xEB5B, 0x96B2, 0xEB5C, + 0x96B3, 0xE3C4, 0x96B4, 0xEB5D, 0x96B5, 0xEB5E, 0x96B6, 0xC1A5, 0x96B7, 0xEB5F, 0x96B8, 0xEB60, 0x96B9, 0xF6BF, 0x96BA, 0xEB61, + 0x96BB, 0xEB62, 0x96BC, 0xF6C0, 0x96BD, 0xF6C1, 0x96BE, 0xC4D1, 0x96BF, 0xEB63, 0x96C0, 0xC8B8, 0x96C1, 0xD1E3, 0x96C2, 0xEB64, + 0x96C3, 0xEB65, 0x96C4, 0xD0DB, 0x96C5, 0xD1C5, 0x96C6, 0xBCAF, 0x96C7, 0xB9CD, 0x96C8, 0xEB66, 0x96C9, 0xEFF4, 0x96CA, 0xEB67, + 0x96CB, 0xEB68, 0x96CC, 0xB4C6, 0x96CD, 0xD3BA, 0x96CE, 0xF6C2, 0x96CF, 0xB3FB, 0x96D0, 0xEB69, 0x96D1, 0xEB6A, 0x96D2, 0xF6C3, + 0x96D3, 0xEB6B, 0x96D4, 0xEB6C, 0x96D5, 0xB5F1, 0x96D6, 0xEB6D, 0x96D7, 0xEB6E, 0x96D8, 0xEB6F, 0x96D9, 0xEB70, 0x96DA, 0xEB71, + 0x96DB, 0xEB72, 0x96DC, 0xEB73, 0x96DD, 0xEB74, 0x96DE, 0xEB75, 0x96DF, 0xEB76, 0x96E0, 0xF6C5, 0x96E1, 0xEB77, 0x96E2, 0xEB78, + 0x96E3, 0xEB79, 0x96E4, 0xEB7A, 0x96E5, 0xEB7B, 0x96E6, 0xEB7C, 0x96E7, 0xEB7D, 0x96E8, 0xD3EA, 0x96E9, 0xF6A7, 0x96EA, 0xD1A9, + 0x96EB, 0xEB7E, 0x96EC, 0xEB80, 0x96ED, 0xEB81, 0x96EE, 0xEB82, 0x96EF, 0xF6A9, 0x96F0, 0xEB83, 0x96F1, 0xEB84, 0x96F2, 0xEB85, + 0x96F3, 0xF6A8, 0x96F4, 0xEB86, 0x96F5, 0xEB87, 0x96F6, 0xC1E3, 0x96F7, 0xC0D7, 0x96F8, 0xEB88, 0x96F9, 0xB1A2, 0x96FA, 0xEB89, + 0x96FB, 0xEB8A, 0x96FC, 0xEB8B, 0x96FD, 0xEB8C, 0x96FE, 0xCEED, 0x96FF, 0xEB8D, 0x9700, 0xD0E8, 0x9701, 0xF6AB, 0x9702, 0xEB8E, + 0x9703, 0xEB8F, 0x9704, 0xCFF6, 0x9705, 0xEB90, 0x9706, 0xF6AA, 0x9707, 0xD5F0, 0x9708, 0xF6AC, 0x9709, 0xC3B9, 0x970A, 0xEB91, + 0x970B, 0xEB92, 0x970C, 0xEB93, 0x970D, 0xBBF4, 0x970E, 0xF6AE, 0x970F, 0xF6AD, 0x9710, 0xEB94, 0x9711, 0xEB95, 0x9712, 0xEB96, + 0x9713, 0xC4DE, 0x9714, 0xEB97, 0x9715, 0xEB98, 0x9716, 0xC1D8, 0x9717, 0xEB99, 0x9718, 0xEB9A, 0x9719, 0xEB9B, 0x971A, 0xEB9C, + 0x971B, 0xEB9D, 0x971C, 0xCBAA, 0x971D, 0xEB9E, 0x971E, 0xCFBC, 0x971F, 0xEB9F, 0x9720, 0xEBA0, 0x9721, 0xEC40, 0x9722, 0xEC41, + 0x9723, 0xEC42, 0x9724, 0xEC43, 0x9725, 0xEC44, 0x9726, 0xEC45, 0x9727, 0xEC46, 0x9728, 0xEC47, 0x9729, 0xEC48, 0x972A, 0xF6AF, + 0x972B, 0xEC49, 0x972C, 0xEC4A, 0x972D, 0xF6B0, 0x972E, 0xEC4B, 0x972F, 0xEC4C, 0x9730, 0xF6B1, 0x9731, 0xEC4D, 0x9732, 0xC2B6, + 0x9733, 0xEC4E, 0x9734, 0xEC4F, 0x9735, 0xEC50, 0x9736, 0xEC51, 0x9737, 0xEC52, 0x9738, 0xB0D4, 0x9739, 0xC5F9, 0x973A, 0xEC53, + 0x973B, 0xEC54, 0x973C, 0xEC55, 0x973D, 0xEC56, 0x973E, 0xF6B2, 0x973F, 0xEC57, 0x9740, 0xEC58, 0x9741, 0xEC59, 0x9742, 0xEC5A, + 0x9743, 0xEC5B, 0x9744, 0xEC5C, 0x9745, 0xEC5D, 0x9746, 0xEC5E, 0x9747, 0xEC5F, 0x9748, 0xEC60, 0x9749, 0xEC61, 0x974A, 0xEC62, + 0x974B, 0xEC63, 0x974C, 0xEC64, 0x974D, 0xEC65, 0x974E, 0xEC66, 0x974F, 0xEC67, 0x9750, 0xEC68, 0x9751, 0xEC69, 0x9752, 0xC7E0, + 0x9753, 0xF6A6, 0x9754, 0xEC6A, 0x9755, 0xEC6B, 0x9756, 0xBEB8, 0x9757, 0xEC6C, 0x9758, 0xEC6D, 0x9759, 0xBEB2, 0x975A, 0xEC6E, + 0x975B, 0xB5E5, 0x975C, 0xEC6F, 0x975D, 0xEC70, 0x975E, 0xB7C7, 0x975F, 0xEC71, 0x9760, 0xBFBF, 0x9761, 0xC3D2, 0x9762, 0xC3E6, + 0x9763, 0xEC72, 0x9764, 0xEC73, 0x9765, 0xD8CC, 0x9766, 0xEC74, 0x9767, 0xEC75, 0x9768, 0xEC76, 0x9769, 0xB8EF, 0x976A, 0xEC77, + 0x976B, 0xEC78, 0x976C, 0xEC79, 0x976D, 0xEC7A, 0x976E, 0xEC7B, 0x976F, 0xEC7C, 0x9770, 0xEC7D, 0x9771, 0xEC7E, 0x9772, 0xEC80, + 0x9773, 0xBDF9, 0x9774, 0xD1A5, 0x9775, 0xEC81, 0x9776, 0xB0D0, 0x9777, 0xEC82, 0x9778, 0xEC83, 0x9779, 0xEC84, 0x977A, 0xEC85, + 0x977B, 0xEC86, 0x977C, 0xF7B0, 0x977D, 0xEC87, 0x977E, 0xEC88, 0x977F, 0xEC89, 0x9780, 0xEC8A, 0x9781, 0xEC8B, 0x9782, 0xEC8C, + 0x9783, 0xEC8D, 0x9784, 0xEC8E, 0x9785, 0xF7B1, 0x9786, 0xEC8F, 0x9787, 0xEC90, 0x9788, 0xEC91, 0x9789, 0xEC92, 0x978A, 0xEC93, + 0x978B, 0xD0AC, 0x978C, 0xEC94, 0x978D, 0xB0B0, 0x978E, 0xEC95, 0x978F, 0xEC96, 0x9790, 0xEC97, 0x9791, 0xF7B2, 0x9792, 0xF7B3, + 0x9793, 0xEC98, 0x9794, 0xF7B4, 0x9795, 0xEC99, 0x9796, 0xEC9A, 0x9797, 0xEC9B, 0x9798, 0xC7CA, 0x9799, 0xEC9C, 0x979A, 0xEC9D, + 0x979B, 0xEC9E, 0x979C, 0xEC9F, 0x979D, 0xECA0, 0x979E, 0xED40, 0x979F, 0xED41, 0x97A0, 0xBECF, 0x97A1, 0xED42, 0x97A2, 0xED43, + 0x97A3, 0xF7B7, 0x97A4, 0xED44, 0x97A5, 0xED45, 0x97A6, 0xED46, 0x97A7, 0xED47, 0x97A8, 0xED48, 0x97A9, 0xED49, 0x97AA, 0xED4A, + 0x97AB, 0xF7B6, 0x97AC, 0xED4B, 0x97AD, 0xB1DE, 0x97AE, 0xED4C, 0x97AF, 0xF7B5, 0x97B0, 0xED4D, 0x97B1, 0xED4E, 0x97B2, 0xF7B8, + 0x97B3, 0xED4F, 0x97B4, 0xF7B9, 0x97B5, 0xED50, 0x97B6, 0xED51, 0x97B7, 0xED52, 0x97B8, 0xED53, 0x97B9, 0xED54, 0x97BA, 0xED55, + 0x97BB, 0xED56, 0x97BC, 0xED57, 0x97BD, 0xED58, 0x97BE, 0xED59, 0x97BF, 0xED5A, 0x97C0, 0xED5B, 0x97C1, 0xED5C, 0x97C2, 0xED5D, + 0x97C3, 0xED5E, 0x97C4, 0xED5F, 0x97C5, 0xED60, 0x97C6, 0xED61, 0x97C7, 0xED62, 0x97C8, 0xED63, 0x97C9, 0xED64, 0x97CA, 0xED65, + 0x97CB, 0xED66, 0x97CC, 0xED67, 0x97CD, 0xED68, 0x97CE, 0xED69, 0x97CF, 0xED6A, 0x97D0, 0xED6B, 0x97D1, 0xED6C, 0x97D2, 0xED6D, + 0x97D3, 0xED6E, 0x97D4, 0xED6F, 0x97D5, 0xED70, 0x97D6, 0xED71, 0x97D7, 0xED72, 0x97D8, 0xED73, 0x97D9, 0xED74, 0x97DA, 0xED75, + 0x97DB, 0xED76, 0x97DC, 0xED77, 0x97DD, 0xED78, 0x97DE, 0xED79, 0x97DF, 0xED7A, 0x97E0, 0xED7B, 0x97E1, 0xED7C, 0x97E2, 0xED7D, + 0x97E3, 0xED7E, 0x97E4, 0xED80, 0x97E5, 0xED81, 0x97E6, 0xCEA4, 0x97E7, 0xC8CD, 0x97E8, 0xED82, 0x97E9, 0xBAAB, 0x97EA, 0xE8B8, + 0x97EB, 0xE8B9, 0x97EC, 0xE8BA, 0x97ED, 0xBEC2, 0x97EE, 0xED83, 0x97EF, 0xED84, 0x97F0, 0xED85, 0x97F1, 0xED86, 0x97F2, 0xED87, + 0x97F3, 0xD2F4, 0x97F4, 0xED88, 0x97F5, 0xD4CF, 0x97F6, 0xC9D8, 0x97F7, 0xED89, 0x97F8, 0xED8A, 0x97F9, 0xED8B, 0x97FA, 0xED8C, + 0x97FB, 0xED8D, 0x97FC, 0xED8E, 0x97FD, 0xED8F, 0x97FE, 0xED90, 0x97FF, 0xED91, 0x9800, 0xED92, 0x9801, 0xED93, 0x9802, 0xED94, + 0x9803, 0xED95, 0x9804, 0xED96, 0x9805, 0xED97, 0x9806, 0xED98, 0x9807, 0xED99, 0x9808, 0xED9A, 0x9809, 0xED9B, 0x980A, 0xED9C, + 0x980B, 0xED9D, 0x980C, 0xED9E, 0x980D, 0xED9F, 0x980E, 0xEDA0, 0x980F, 0xEE40, 0x9810, 0xEE41, 0x9811, 0xEE42, 0x9812, 0xEE43, + 0x9813, 0xEE44, 0x9814, 0xEE45, 0x9815, 0xEE46, 0x9816, 0xEE47, 0x9817, 0xEE48, 0x9818, 0xEE49, 0x9819, 0xEE4A, 0x981A, 0xEE4B, + 0x981B, 0xEE4C, 0x981C, 0xEE4D, 0x981D, 0xEE4E, 0x981E, 0xEE4F, 0x981F, 0xEE50, 0x9820, 0xEE51, 0x9821, 0xEE52, 0x9822, 0xEE53, + 0x9823, 0xEE54, 0x9824, 0xEE55, 0x9825, 0xEE56, 0x9826, 0xEE57, 0x9827, 0xEE58, 0x9828, 0xEE59, 0x9829, 0xEE5A, 0x982A, 0xEE5B, + 0x982B, 0xEE5C, 0x982C, 0xEE5D, 0x982D, 0xEE5E, 0x982E, 0xEE5F, 0x982F, 0xEE60, 0x9830, 0xEE61, 0x9831, 0xEE62, 0x9832, 0xEE63, + 0x9833, 0xEE64, 0x9834, 0xEE65, 0x9835, 0xEE66, 0x9836, 0xEE67, 0x9837, 0xEE68, 0x9838, 0xEE69, 0x9839, 0xEE6A, 0x983A, 0xEE6B, + 0x983B, 0xEE6C, 0x983C, 0xEE6D, 0x983D, 0xEE6E, 0x983E, 0xEE6F, 0x983F, 0xEE70, 0x9840, 0xEE71, 0x9841, 0xEE72, 0x9842, 0xEE73, + 0x9843, 0xEE74, 0x9844, 0xEE75, 0x9845, 0xEE76, 0x9846, 0xEE77, 0x9847, 0xEE78, 0x9848, 0xEE79, 0x9849, 0xEE7A, 0x984A, 0xEE7B, + 0x984B, 0xEE7C, 0x984C, 0xEE7D, 0x984D, 0xEE7E, 0x984E, 0xEE80, 0x984F, 0xEE81, 0x9850, 0xEE82, 0x9851, 0xEE83, 0x9852, 0xEE84, + 0x9853, 0xEE85, 0x9854, 0xEE86, 0x9855, 0xEE87, 0x9856, 0xEE88, 0x9857, 0xEE89, 0x9858, 0xEE8A, 0x9859, 0xEE8B, 0x985A, 0xEE8C, + 0x985B, 0xEE8D, 0x985C, 0xEE8E, 0x985D, 0xEE8F, 0x985E, 0xEE90, 0x985F, 0xEE91, 0x9860, 0xEE92, 0x9861, 0xEE93, 0x9862, 0xEE94, + 0x9863, 0xEE95, 0x9864, 0xEE96, 0x9865, 0xEE97, 0x9866, 0xEE98, 0x9867, 0xEE99, 0x9868, 0xEE9A, 0x9869, 0xEE9B, 0x986A, 0xEE9C, + 0x986B, 0xEE9D, 0x986C, 0xEE9E, 0x986D, 0xEE9F, 0x986E, 0xEEA0, 0x986F, 0xEF40, 0x9870, 0xEF41, 0x9871, 0xEF42, 0x9872, 0xEF43, + 0x9873, 0xEF44, 0x9874, 0xEF45, 0x9875, 0xD2B3, 0x9876, 0xB6A5, 0x9877, 0xC7EA, 0x9878, 0xF1FC, 0x9879, 0xCFEE, 0x987A, 0xCBB3, + 0x987B, 0xD0EB, 0x987C, 0xE7EF, 0x987D, 0xCDE7, 0x987E, 0xB9CB, 0x987F, 0xB6D9, 0x9880, 0xF1FD, 0x9881, 0xB0E4, 0x9882, 0xCBCC, + 0x9883, 0xF1FE, 0x9884, 0xD4A4, 0x9885, 0xC2AD, 0x9886, 0xC1EC, 0x9887, 0xC6C4, 0x9888, 0xBEB1, 0x9889, 0xF2A1, 0x988A, 0xBCD5, + 0x988B, 0xEF46, 0x988C, 0xF2A2, 0x988D, 0xF2A3, 0x988E, 0xEF47, 0x988F, 0xF2A4, 0x9890, 0xD2C3, 0x9891, 0xC6B5, 0x9892, 0xEF48, + 0x9893, 0xCDC7, 0x9894, 0xF2A5, 0x9895, 0xEF49, 0x9896, 0xD3B1, 0x9897, 0xBFC5, 0x9898, 0xCCE2, 0x9899, 0xEF4A, 0x989A, 0xF2A6, + 0x989B, 0xF2A7, 0x989C, 0xD1D5, 0x989D, 0xB6EE, 0x989E, 0xF2A8, 0x989F, 0xF2A9, 0x98A0, 0xB5DF, 0x98A1, 0xF2AA, 0x98A2, 0xF2AB, + 0x98A3, 0xEF4B, 0x98A4, 0xB2FC, 0x98A5, 0xF2AC, 0x98A6, 0xF2AD, 0x98A7, 0xC8A7, 0x98A8, 0xEF4C, 0x98A9, 0xEF4D, 0x98AA, 0xEF4E, + 0x98AB, 0xEF4F, 0x98AC, 0xEF50, 0x98AD, 0xEF51, 0x98AE, 0xEF52, 0x98AF, 0xEF53, 0x98B0, 0xEF54, 0x98B1, 0xEF55, 0x98B2, 0xEF56, + 0x98B3, 0xEF57, 0x98B4, 0xEF58, 0x98B5, 0xEF59, 0x98B6, 0xEF5A, 0x98B7, 0xEF5B, 0x98B8, 0xEF5C, 0x98B9, 0xEF5D, 0x98BA, 0xEF5E, + 0x98BB, 0xEF5F, 0x98BC, 0xEF60, 0x98BD, 0xEF61, 0x98BE, 0xEF62, 0x98BF, 0xEF63, 0x98C0, 0xEF64, 0x98C1, 0xEF65, 0x98C2, 0xEF66, + 0x98C3, 0xEF67, 0x98C4, 0xEF68, 0x98C5, 0xEF69, 0x98C6, 0xEF6A, 0x98C7, 0xEF6B, 0x98C8, 0xEF6C, 0x98C9, 0xEF6D, 0x98CA, 0xEF6E, + 0x98CB, 0xEF6F, 0x98CC, 0xEF70, 0x98CD, 0xEF71, 0x98CE, 0xB7E7, 0x98CF, 0xEF72, 0x98D0, 0xEF73, 0x98D1, 0xECA9, 0x98D2, 0xECAA, + 0x98D3, 0xECAB, 0x98D4, 0xEF74, 0x98D5, 0xECAC, 0x98D6, 0xEF75, 0x98D7, 0xEF76, 0x98D8, 0xC6AE, 0x98D9, 0xECAD, 0x98DA, 0xECAE, + 0x98DB, 0xEF77, 0x98DC, 0xEF78, 0x98DD, 0xEF79, 0x98DE, 0xB7C9, 0x98DF, 0xCAB3, 0x98E0, 0xEF7A, 0x98E1, 0xEF7B, 0x98E2, 0xEF7C, + 0x98E3, 0xEF7D, 0x98E4, 0xEF7E, 0x98E5, 0xEF80, 0x98E6, 0xEF81, 0x98E7, 0xE2B8, 0x98E8, 0xF7CF, 0x98E9, 0xEF82, 0x98EA, 0xEF83, + 0x98EB, 0xEF84, 0x98EC, 0xEF85, 0x98ED, 0xEF86, 0x98EE, 0xEF87, 0x98EF, 0xEF88, 0x98F0, 0xEF89, 0x98F1, 0xEF8A, 0x98F2, 0xEF8B, + 0x98F3, 0xEF8C, 0x98F4, 0xEF8D, 0x98F5, 0xEF8E, 0x98F6, 0xEF8F, 0x98F7, 0xEF90, 0x98F8, 0xEF91, 0x98F9, 0xEF92, 0x98FA, 0xEF93, + 0x98FB, 0xEF94, 0x98FC, 0xEF95, 0x98FD, 0xEF96, 0x98FE, 0xEF97, 0x98FF, 0xEF98, 0x9900, 0xEF99, 0x9901, 0xEF9A, 0x9902, 0xEF9B, + 0x9903, 0xEF9C, 0x9904, 0xEF9D, 0x9905, 0xEF9E, 0x9906, 0xEF9F, 0x9907, 0xEFA0, 0x9908, 0xF040, 0x9909, 0xF041, 0x990A, 0xF042, + 0x990B, 0xF043, 0x990C, 0xF044, 0x990D, 0xF7D0, 0x990E, 0xF045, 0x990F, 0xF046, 0x9910, 0xB2CD, 0x9911, 0xF047, 0x9912, 0xF048, + 0x9913, 0xF049, 0x9914, 0xF04A, 0x9915, 0xF04B, 0x9916, 0xF04C, 0x9917, 0xF04D, 0x9918, 0xF04E, 0x9919, 0xF04F, 0x991A, 0xF050, + 0x991B, 0xF051, 0x991C, 0xF052, 0x991D, 0xF053, 0x991E, 0xF054, 0x991F, 0xF055, 0x9920, 0xF056, 0x9921, 0xF057, 0x9922, 0xF058, + 0x9923, 0xF059, 0x9924, 0xF05A, 0x9925, 0xF05B, 0x9926, 0xF05C, 0x9927, 0xF05D, 0x9928, 0xF05E, 0x9929, 0xF05F, 0x992A, 0xF060, + 0x992B, 0xF061, 0x992C, 0xF062, 0x992D, 0xF063, 0x992E, 0xF7D1, 0x992F, 0xF064, 0x9930, 0xF065, 0x9931, 0xF066, 0x9932, 0xF067, + 0x9933, 0xF068, 0x9934, 0xF069, 0x9935, 0xF06A, 0x9936, 0xF06B, 0x9937, 0xF06C, 0x9938, 0xF06D, 0x9939, 0xF06E, 0x993A, 0xF06F, + 0x993B, 0xF070, 0x993C, 0xF071, 0x993D, 0xF072, 0x993E, 0xF073, 0x993F, 0xF074, 0x9940, 0xF075, 0x9941, 0xF076, 0x9942, 0xF077, + 0x9943, 0xF078, 0x9944, 0xF079, 0x9945, 0xF07A, 0x9946, 0xF07B, 0x9947, 0xF07C, 0x9948, 0xF07D, 0x9949, 0xF07E, 0x994A, 0xF080, + 0x994B, 0xF081, 0x994C, 0xF082, 0x994D, 0xF083, 0x994E, 0xF084, 0x994F, 0xF085, 0x9950, 0xF086, 0x9951, 0xF087, 0x9952, 0xF088, + 0x9953, 0xF089, 0x9954, 0xF7D3, 0x9955, 0xF7D2, 0x9956, 0xF08A, 0x9957, 0xF08B, 0x9958, 0xF08C, 0x9959, 0xF08D, 0x995A, 0xF08E, + 0x995B, 0xF08F, 0x995C, 0xF090, 0x995D, 0xF091, 0x995E, 0xF092, 0x995F, 0xF093, 0x9960, 0xF094, 0x9961, 0xF095, 0x9962, 0xF096, + 0x9963, 0xE2BB, 0x9964, 0xF097, 0x9965, 0xBCA2, 0x9966, 0xF098, 0x9967, 0xE2BC, 0x9968, 0xE2BD, 0x9969, 0xE2BE, 0x996A, 0xE2BF, + 0x996B, 0xE2C0, 0x996C, 0xE2C1, 0x996D, 0xB7B9, 0x996E, 0xD2FB, 0x996F, 0xBDA4, 0x9970, 0xCACE, 0x9971, 0xB1A5, 0x9972, 0xCBC7, + 0x9973, 0xF099, 0x9974, 0xE2C2, 0x9975, 0xB6FC, 0x9976, 0xC8C4, 0x9977, 0xE2C3, 0x9978, 0xF09A, 0x9979, 0xF09B, 0x997A, 0xBDC8, + 0x997B, 0xF09C, 0x997C, 0xB1FD, 0x997D, 0xE2C4, 0x997E, 0xF09D, 0x997F, 0xB6F6, 0x9980, 0xE2C5, 0x9981, 0xC4D9, 0x9982, 0xF09E, + 0x9983, 0xF09F, 0x9984, 0xE2C6, 0x9985, 0xCFDA, 0x9986, 0xB9DD, 0x9987, 0xE2C7, 0x9988, 0xC0A1, 0x9989, 0xF0A0, 0x998A, 0xE2C8, + 0x998B, 0xB2F6, 0x998C, 0xF140, 0x998D, 0xE2C9, 0x998E, 0xF141, 0x998F, 0xC1F3, 0x9990, 0xE2CA, 0x9991, 0xE2CB, 0x9992, 0xC2F8, + 0x9993, 0xE2CC, 0x9994, 0xE2CD, 0x9995, 0xE2CE, 0x9996, 0xCAD7, 0x9997, 0xD8B8, 0x9998, 0xD9E5, 0x9999, 0xCFE3, 0x999A, 0xF142, + 0x999B, 0xF143, 0x999C, 0xF144, 0x999D, 0xF145, 0x999E, 0xF146, 0x999F, 0xF147, 0x99A0, 0xF148, 0x99A1, 0xF149, 0x99A2, 0xF14A, + 0x99A3, 0xF14B, 0x99A4, 0xF14C, 0x99A5, 0xF0A5, 0x99A6, 0xF14D, 0x99A7, 0xF14E, 0x99A8, 0xDCB0, 0x99A9, 0xF14F, 0x99AA, 0xF150, + 0x99AB, 0xF151, 0x99AC, 0xF152, 0x99AD, 0xF153, 0x99AE, 0xF154, 0x99AF, 0xF155, 0x99B0, 0xF156, 0x99B1, 0xF157, 0x99B2, 0xF158, + 0x99B3, 0xF159, 0x99B4, 0xF15A, 0x99B5, 0xF15B, 0x99B6, 0xF15C, 0x99B7, 0xF15D, 0x99B8, 0xF15E, 0x99B9, 0xF15F, 0x99BA, 0xF160, + 0x99BB, 0xF161, 0x99BC, 0xF162, 0x99BD, 0xF163, 0x99BE, 0xF164, 0x99BF, 0xF165, 0x99C0, 0xF166, 0x99C1, 0xF167, 0x99C2, 0xF168, + 0x99C3, 0xF169, 0x99C4, 0xF16A, 0x99C5, 0xF16B, 0x99C6, 0xF16C, 0x99C7, 0xF16D, 0x99C8, 0xF16E, 0x99C9, 0xF16F, 0x99CA, 0xF170, + 0x99CB, 0xF171, 0x99CC, 0xF172, 0x99CD, 0xF173, 0x99CE, 0xF174, 0x99CF, 0xF175, 0x99D0, 0xF176, 0x99D1, 0xF177, 0x99D2, 0xF178, + 0x99D3, 0xF179, 0x99D4, 0xF17A, 0x99D5, 0xF17B, 0x99D6, 0xF17C, 0x99D7, 0xF17D, 0x99D8, 0xF17E, 0x99D9, 0xF180, 0x99DA, 0xF181, + 0x99DB, 0xF182, 0x99DC, 0xF183, 0x99DD, 0xF184, 0x99DE, 0xF185, 0x99DF, 0xF186, 0x99E0, 0xF187, 0x99E1, 0xF188, 0x99E2, 0xF189, + 0x99E3, 0xF18A, 0x99E4, 0xF18B, 0x99E5, 0xF18C, 0x99E6, 0xF18D, 0x99E7, 0xF18E, 0x99E8, 0xF18F, 0x99E9, 0xF190, 0x99EA, 0xF191, + 0x99EB, 0xF192, 0x99EC, 0xF193, 0x99ED, 0xF194, 0x99EE, 0xF195, 0x99EF, 0xF196, 0x99F0, 0xF197, 0x99F1, 0xF198, 0x99F2, 0xF199, + 0x99F3, 0xF19A, 0x99F4, 0xF19B, 0x99F5, 0xF19C, 0x99F6, 0xF19D, 0x99F7, 0xF19E, 0x99F8, 0xF19F, 0x99F9, 0xF1A0, 0x99FA, 0xF240, + 0x99FB, 0xF241, 0x99FC, 0xF242, 0x99FD, 0xF243, 0x99FE, 0xF244, 0x99FF, 0xF245, 0x9A00, 0xF246, 0x9A01, 0xF247, 0x9A02, 0xF248, + 0x9A03, 0xF249, 0x9A04, 0xF24A, 0x9A05, 0xF24B, 0x9A06, 0xF24C, 0x9A07, 0xF24D, 0x9A08, 0xF24E, 0x9A09, 0xF24F, 0x9A0A, 0xF250, + 0x9A0B, 0xF251, 0x9A0C, 0xF252, 0x9A0D, 0xF253, 0x9A0E, 0xF254, 0x9A0F, 0xF255, 0x9A10, 0xF256, 0x9A11, 0xF257, 0x9A12, 0xF258, + 0x9A13, 0xF259, 0x9A14, 0xF25A, 0x9A15, 0xF25B, 0x9A16, 0xF25C, 0x9A17, 0xF25D, 0x9A18, 0xF25E, 0x9A19, 0xF25F, 0x9A1A, 0xF260, + 0x9A1B, 0xF261, 0x9A1C, 0xF262, 0x9A1D, 0xF263, 0x9A1E, 0xF264, 0x9A1F, 0xF265, 0x9A20, 0xF266, 0x9A21, 0xF267, 0x9A22, 0xF268, + 0x9A23, 0xF269, 0x9A24, 0xF26A, 0x9A25, 0xF26B, 0x9A26, 0xF26C, 0x9A27, 0xF26D, 0x9A28, 0xF26E, 0x9A29, 0xF26F, 0x9A2A, 0xF270, + 0x9A2B, 0xF271, 0x9A2C, 0xF272, 0x9A2D, 0xF273, 0x9A2E, 0xF274, 0x9A2F, 0xF275, 0x9A30, 0xF276, 0x9A31, 0xF277, 0x9A32, 0xF278, + 0x9A33, 0xF279, 0x9A34, 0xF27A, 0x9A35, 0xF27B, 0x9A36, 0xF27C, 0x9A37, 0xF27D, 0x9A38, 0xF27E, 0x9A39, 0xF280, 0x9A3A, 0xF281, + 0x9A3B, 0xF282, 0x9A3C, 0xF283, 0x9A3D, 0xF284, 0x9A3E, 0xF285, 0x9A3F, 0xF286, 0x9A40, 0xF287, 0x9A41, 0xF288, 0x9A42, 0xF289, + 0x9A43, 0xF28A, 0x9A44, 0xF28B, 0x9A45, 0xF28C, 0x9A46, 0xF28D, 0x9A47, 0xF28E, 0x9A48, 0xF28F, 0x9A49, 0xF290, 0x9A4A, 0xF291, + 0x9A4B, 0xF292, 0x9A4C, 0xF293, 0x9A4D, 0xF294, 0x9A4E, 0xF295, 0x9A4F, 0xF296, 0x9A50, 0xF297, 0x9A51, 0xF298, 0x9A52, 0xF299, + 0x9A53, 0xF29A, 0x9A54, 0xF29B, 0x9A55, 0xF29C, 0x9A56, 0xF29D, 0x9A57, 0xF29E, 0x9A58, 0xF29F, 0x9A59, 0xF2A0, 0x9A5A, 0xF340, + 0x9A5B, 0xF341, 0x9A5C, 0xF342, 0x9A5D, 0xF343, 0x9A5E, 0xF344, 0x9A5F, 0xF345, 0x9A60, 0xF346, 0x9A61, 0xF347, 0x9A62, 0xF348, + 0x9A63, 0xF349, 0x9A64, 0xF34A, 0x9A65, 0xF34B, 0x9A66, 0xF34C, 0x9A67, 0xF34D, 0x9A68, 0xF34E, 0x9A69, 0xF34F, 0x9A6A, 0xF350, + 0x9A6B, 0xF351, 0x9A6C, 0xC2ED, 0x9A6D, 0xD4A6, 0x9A6E, 0xCDD4, 0x9A6F, 0xD1B1, 0x9A70, 0xB3DB, 0x9A71, 0xC7FD, 0x9A72, 0xF352, + 0x9A73, 0xB2B5, 0x9A74, 0xC2BF, 0x9A75, 0xE6E0, 0x9A76, 0xCABB, 0x9A77, 0xE6E1, 0x9A78, 0xE6E2, 0x9A79, 0xBED4, 0x9A7A, 0xE6E3, + 0x9A7B, 0xD7A4, 0x9A7C, 0xCDD5, 0x9A7D, 0xE6E5, 0x9A7E, 0xBCDD, 0x9A7F, 0xE6E4, 0x9A80, 0xE6E6, 0x9A81, 0xE6E7, 0x9A82, 0xC2EE, + 0x9A83, 0xF353, 0x9A84, 0xBDBE, 0x9A85, 0xE6E8, 0x9A86, 0xC2E6, 0x9A87, 0xBAA7, 0x9A88, 0xE6E9, 0x9A89, 0xF354, 0x9A8A, 0xE6EA, + 0x9A8B, 0xB3D2, 0x9A8C, 0xD1E9, 0x9A8D, 0xF355, 0x9A8E, 0xF356, 0x9A8F, 0xBFA5, 0x9A90, 0xE6EB, 0x9A91, 0xC6EF, 0x9A92, 0xE6EC, + 0x9A93, 0xE6ED, 0x9A94, 0xF357, 0x9A95, 0xF358, 0x9A96, 0xE6EE, 0x9A97, 0xC6AD, 0x9A98, 0xE6EF, 0x9A99, 0xF359, 0x9A9A, 0xC9A7, + 0x9A9B, 0xE6F0, 0x9A9C, 0xE6F1, 0x9A9D, 0xE6F2, 0x9A9E, 0xE5B9, 0x9A9F, 0xE6F3, 0x9AA0, 0xE6F4, 0x9AA1, 0xC2E2, 0x9AA2, 0xE6F5, + 0x9AA3, 0xE6F6, 0x9AA4, 0xD6E8, 0x9AA5, 0xE6F7, 0x9AA6, 0xF35A, 0x9AA7, 0xE6F8, 0x9AA8, 0xB9C7, 0x9AA9, 0xF35B, 0x9AAA, 0xF35C, + 0x9AAB, 0xF35D, 0x9AAC, 0xF35E, 0x9AAD, 0xF35F, 0x9AAE, 0xF360, 0x9AAF, 0xF361, 0x9AB0, 0xF7BB, 0x9AB1, 0xF7BA, 0x9AB2, 0xF362, + 0x9AB3, 0xF363, 0x9AB4, 0xF364, 0x9AB5, 0xF365, 0x9AB6, 0xF7BE, 0x9AB7, 0xF7BC, 0x9AB8, 0xBAA1, 0x9AB9, 0xF366, 0x9ABA, 0xF7BF, + 0x9ABB, 0xF367, 0x9ABC, 0xF7C0, 0x9ABD, 0xF368, 0x9ABE, 0xF369, 0x9ABF, 0xF36A, 0x9AC0, 0xF7C2, 0x9AC1, 0xF7C1, 0x9AC2, 0xF7C4, + 0x9AC3, 0xF36B, 0x9AC4, 0xF36C, 0x9AC5, 0xF7C3, 0x9AC6, 0xF36D, 0x9AC7, 0xF36E, 0x9AC8, 0xF36F, 0x9AC9, 0xF370, 0x9ACA, 0xF371, + 0x9ACB, 0xF7C5, 0x9ACC, 0xF7C6, 0x9ACD, 0xF372, 0x9ACE, 0xF373, 0x9ACF, 0xF374, 0x9AD0, 0xF375, 0x9AD1, 0xF7C7, 0x9AD2, 0xF376, + 0x9AD3, 0xCBE8, 0x9AD4, 0xF377, 0x9AD5, 0xF378, 0x9AD6, 0xF379, 0x9AD7, 0xF37A, 0x9AD8, 0xB8DF, 0x9AD9, 0xF37B, 0x9ADA, 0xF37C, + 0x9ADB, 0xF37D, 0x9ADC, 0xF37E, 0x9ADD, 0xF380, 0x9ADE, 0xF381, 0x9ADF, 0xF7D4, 0x9AE0, 0xF382, 0x9AE1, 0xF7D5, 0x9AE2, 0xF383, + 0x9AE3, 0xF384, 0x9AE4, 0xF385, 0x9AE5, 0xF386, 0x9AE6, 0xF7D6, 0x9AE7, 0xF387, 0x9AE8, 0xF388, 0x9AE9, 0xF389, 0x9AEA, 0xF38A, + 0x9AEB, 0xF7D8, 0x9AEC, 0xF38B, 0x9AED, 0xF7DA, 0x9AEE, 0xF38C, 0x9AEF, 0xF7D7, 0x9AF0, 0xF38D, 0x9AF1, 0xF38E, 0x9AF2, 0xF38F, + 0x9AF3, 0xF390, 0x9AF4, 0xF391, 0x9AF5, 0xF392, 0x9AF6, 0xF393, 0x9AF7, 0xF394, 0x9AF8, 0xF395, 0x9AF9, 0xF7DB, 0x9AFA, 0xF396, + 0x9AFB, 0xF7D9, 0x9AFC, 0xF397, 0x9AFD, 0xF398, 0x9AFE, 0xF399, 0x9AFF, 0xF39A, 0x9B00, 0xF39B, 0x9B01, 0xF39C, 0x9B02, 0xF39D, + 0x9B03, 0xD7D7, 0x9B04, 0xF39E, 0x9B05, 0xF39F, 0x9B06, 0xF3A0, 0x9B07, 0xF440, 0x9B08, 0xF7DC, 0x9B09, 0xF441, 0x9B0A, 0xF442, + 0x9B0B, 0xF443, 0x9B0C, 0xF444, 0x9B0D, 0xF445, 0x9B0E, 0xF446, 0x9B0F, 0xF7DD, 0x9B10, 0xF447, 0x9B11, 0xF448, 0x9B12, 0xF449, + 0x9B13, 0xF7DE, 0x9B14, 0xF44A, 0x9B15, 0xF44B, 0x9B16, 0xF44C, 0x9B17, 0xF44D, 0x9B18, 0xF44E, 0x9B19, 0xF44F, 0x9B1A, 0xF450, + 0x9B1B, 0xF451, 0x9B1C, 0xF452, 0x9B1D, 0xF453, 0x9B1E, 0xF454, 0x9B1F, 0xF7DF, 0x9B20, 0xF455, 0x9B21, 0xF456, 0x9B22, 0xF457, + 0x9B23, 0xF7E0, 0x9B24, 0xF458, 0x9B25, 0xF459, 0x9B26, 0xF45A, 0x9B27, 0xF45B, 0x9B28, 0xF45C, 0x9B29, 0xF45D, 0x9B2A, 0xF45E, + 0x9B2B, 0xF45F, 0x9B2C, 0xF460, 0x9B2D, 0xF461, 0x9B2E, 0xF462, 0x9B2F, 0xDBCB, 0x9B30, 0xF463, 0x9B31, 0xF464, 0x9B32, 0xD8AA, + 0x9B33, 0xF465, 0x9B34, 0xF466, 0x9B35, 0xF467, 0x9B36, 0xF468, 0x9B37, 0xF469, 0x9B38, 0xF46A, 0x9B39, 0xF46B, 0x9B3A, 0xF46C, + 0x9B3B, 0xE5F7, 0x9B3C, 0xB9ED, 0x9B3D, 0xF46D, 0x9B3E, 0xF46E, 0x9B3F, 0xF46F, 0x9B40, 0xF470, 0x9B41, 0xBFFD, 0x9B42, 0xBBEA, + 0x9B43, 0xF7C9, 0x9B44, 0xC6C7, 0x9B45, 0xF7C8, 0x9B46, 0xF471, 0x9B47, 0xF7CA, 0x9B48, 0xF7CC, 0x9B49, 0xF7CB, 0x9B4A, 0xF472, + 0x9B4B, 0xF473, 0x9B4C, 0xF474, 0x9B4D, 0xF7CD, 0x9B4E, 0xF475, 0x9B4F, 0xCEBA, 0x9B50, 0xF476, 0x9B51, 0xF7CE, 0x9B52, 0xF477, + 0x9B53, 0xF478, 0x9B54, 0xC4A7, 0x9B55, 0xF479, 0x9B56, 0xF47A, 0x9B57, 0xF47B, 0x9B58, 0xF47C, 0x9B59, 0xF47D, 0x9B5A, 0xF47E, + 0x9B5B, 0xF480, 0x9B5C, 0xF481, 0x9B5D, 0xF482, 0x9B5E, 0xF483, 0x9B5F, 0xF484, 0x9B60, 0xF485, 0x9B61, 0xF486, 0x9B62, 0xF487, + 0x9B63, 0xF488, 0x9B64, 0xF489, 0x9B65, 0xF48A, 0x9B66, 0xF48B, 0x9B67, 0xF48C, 0x9B68, 0xF48D, 0x9B69, 0xF48E, 0x9B6A, 0xF48F, + 0x9B6B, 0xF490, 0x9B6C, 0xF491, 0x9B6D, 0xF492, 0x9B6E, 0xF493, 0x9B6F, 0xF494, 0x9B70, 0xF495, 0x9B71, 0xF496, 0x9B72, 0xF497, + 0x9B73, 0xF498, 0x9B74, 0xF499, 0x9B75, 0xF49A, 0x9B76, 0xF49B, 0x9B77, 0xF49C, 0x9B78, 0xF49D, 0x9B79, 0xF49E, 0x9B7A, 0xF49F, + 0x9B7B, 0xF4A0, 0x9B7C, 0xF540, 0x9B7D, 0xF541, 0x9B7E, 0xF542, 0x9B7F, 0xF543, 0x9B80, 0xF544, 0x9B81, 0xF545, 0x9B82, 0xF546, + 0x9B83, 0xF547, 0x9B84, 0xF548, 0x9B85, 0xF549, 0x9B86, 0xF54A, 0x9B87, 0xF54B, 0x9B88, 0xF54C, 0x9B89, 0xF54D, 0x9B8A, 0xF54E, + 0x9B8B, 0xF54F, 0x9B8C, 0xF550, 0x9B8D, 0xF551, 0x9B8E, 0xF552, 0x9B8F, 0xF553, 0x9B90, 0xF554, 0x9B91, 0xF555, 0x9B92, 0xF556, + 0x9B93, 0xF557, 0x9B94, 0xF558, 0x9B95, 0xF559, 0x9B96, 0xF55A, 0x9B97, 0xF55B, 0x9B98, 0xF55C, 0x9B99, 0xF55D, 0x9B9A, 0xF55E, + 0x9B9B, 0xF55F, 0x9B9C, 0xF560, 0x9B9D, 0xF561, 0x9B9E, 0xF562, 0x9B9F, 0xF563, 0x9BA0, 0xF564, 0x9BA1, 0xF565, 0x9BA2, 0xF566, + 0x9BA3, 0xF567, 0x9BA4, 0xF568, 0x9BA5, 0xF569, 0x9BA6, 0xF56A, 0x9BA7, 0xF56B, 0x9BA8, 0xF56C, 0x9BA9, 0xF56D, 0x9BAA, 0xF56E, + 0x9BAB, 0xF56F, 0x9BAC, 0xF570, 0x9BAD, 0xF571, 0x9BAE, 0xF572, 0x9BAF, 0xF573, 0x9BB0, 0xF574, 0x9BB1, 0xF575, 0x9BB2, 0xF576, + 0x9BB3, 0xF577, 0x9BB4, 0xF578, 0x9BB5, 0xF579, 0x9BB6, 0xF57A, 0x9BB7, 0xF57B, 0x9BB8, 0xF57C, 0x9BB9, 0xF57D, 0x9BBA, 0xF57E, + 0x9BBB, 0xF580, 0x9BBC, 0xF581, 0x9BBD, 0xF582, 0x9BBE, 0xF583, 0x9BBF, 0xF584, 0x9BC0, 0xF585, 0x9BC1, 0xF586, 0x9BC2, 0xF587, + 0x9BC3, 0xF588, 0x9BC4, 0xF589, 0x9BC5, 0xF58A, 0x9BC6, 0xF58B, 0x9BC7, 0xF58C, 0x9BC8, 0xF58D, 0x9BC9, 0xF58E, 0x9BCA, 0xF58F, + 0x9BCB, 0xF590, 0x9BCC, 0xF591, 0x9BCD, 0xF592, 0x9BCE, 0xF593, 0x9BCF, 0xF594, 0x9BD0, 0xF595, 0x9BD1, 0xF596, 0x9BD2, 0xF597, + 0x9BD3, 0xF598, 0x9BD4, 0xF599, 0x9BD5, 0xF59A, 0x9BD6, 0xF59B, 0x9BD7, 0xF59C, 0x9BD8, 0xF59D, 0x9BD9, 0xF59E, 0x9BDA, 0xF59F, + 0x9BDB, 0xF5A0, 0x9BDC, 0xF640, 0x9BDD, 0xF641, 0x9BDE, 0xF642, 0x9BDF, 0xF643, 0x9BE0, 0xF644, 0x9BE1, 0xF645, 0x9BE2, 0xF646, + 0x9BE3, 0xF647, 0x9BE4, 0xF648, 0x9BE5, 0xF649, 0x9BE6, 0xF64A, 0x9BE7, 0xF64B, 0x9BE8, 0xF64C, 0x9BE9, 0xF64D, 0x9BEA, 0xF64E, + 0x9BEB, 0xF64F, 0x9BEC, 0xF650, 0x9BED, 0xF651, 0x9BEE, 0xF652, 0x9BEF, 0xF653, 0x9BF0, 0xF654, 0x9BF1, 0xF655, 0x9BF2, 0xF656, + 0x9BF3, 0xF657, 0x9BF4, 0xF658, 0x9BF5, 0xF659, 0x9BF6, 0xF65A, 0x9BF7, 0xF65B, 0x9BF8, 0xF65C, 0x9BF9, 0xF65D, 0x9BFA, 0xF65E, + 0x9BFB, 0xF65F, 0x9BFC, 0xF660, 0x9BFD, 0xF661, 0x9BFE, 0xF662, 0x9BFF, 0xF663, 0x9C00, 0xF664, 0x9C01, 0xF665, 0x9C02, 0xF666, + 0x9C03, 0xF667, 0x9C04, 0xF668, 0x9C05, 0xF669, 0x9C06, 0xF66A, 0x9C07, 0xF66B, 0x9C08, 0xF66C, 0x9C09, 0xF66D, 0x9C0A, 0xF66E, + 0x9C0B, 0xF66F, 0x9C0C, 0xF670, 0x9C0D, 0xF671, 0x9C0E, 0xF672, 0x9C0F, 0xF673, 0x9C10, 0xF674, 0x9C11, 0xF675, 0x9C12, 0xF676, + 0x9C13, 0xF677, 0x9C14, 0xF678, 0x9C15, 0xF679, 0x9C16, 0xF67A, 0x9C17, 0xF67B, 0x9C18, 0xF67C, 0x9C19, 0xF67D, 0x9C1A, 0xF67E, + 0x9C1B, 0xF680, 0x9C1C, 0xF681, 0x9C1D, 0xF682, 0x9C1E, 0xF683, 0x9C1F, 0xF684, 0x9C20, 0xF685, 0x9C21, 0xF686, 0x9C22, 0xF687, + 0x9C23, 0xF688, 0x9C24, 0xF689, 0x9C25, 0xF68A, 0x9C26, 0xF68B, 0x9C27, 0xF68C, 0x9C28, 0xF68D, 0x9C29, 0xF68E, 0x9C2A, 0xF68F, + 0x9C2B, 0xF690, 0x9C2C, 0xF691, 0x9C2D, 0xF692, 0x9C2E, 0xF693, 0x9C2F, 0xF694, 0x9C30, 0xF695, 0x9C31, 0xF696, 0x9C32, 0xF697, + 0x9C33, 0xF698, 0x9C34, 0xF699, 0x9C35, 0xF69A, 0x9C36, 0xF69B, 0x9C37, 0xF69C, 0x9C38, 0xF69D, 0x9C39, 0xF69E, 0x9C3A, 0xF69F, + 0x9C3B, 0xF6A0, 0x9C3C, 0xF740, 0x9C3D, 0xF741, 0x9C3E, 0xF742, 0x9C3F, 0xF743, 0x9C40, 0xF744, 0x9C41, 0xF745, 0x9C42, 0xF746, + 0x9C43, 0xF747, 0x9C44, 0xF748, 0x9C45, 0xF749, 0x9C46, 0xF74A, 0x9C47, 0xF74B, 0x9C48, 0xF74C, 0x9C49, 0xF74D, 0x9C4A, 0xF74E, + 0x9C4B, 0xF74F, 0x9C4C, 0xF750, 0x9C4D, 0xF751, 0x9C4E, 0xF752, 0x9C4F, 0xF753, 0x9C50, 0xF754, 0x9C51, 0xF755, 0x9C52, 0xF756, + 0x9C53, 0xF757, 0x9C54, 0xF758, 0x9C55, 0xF759, 0x9C56, 0xF75A, 0x9C57, 0xF75B, 0x9C58, 0xF75C, 0x9C59, 0xF75D, 0x9C5A, 0xF75E, + 0x9C5B, 0xF75F, 0x9C5C, 0xF760, 0x9C5D, 0xF761, 0x9C5E, 0xF762, 0x9C5F, 0xF763, 0x9C60, 0xF764, 0x9C61, 0xF765, 0x9C62, 0xF766, + 0x9C63, 0xF767, 0x9C64, 0xF768, 0x9C65, 0xF769, 0x9C66, 0xF76A, 0x9C67, 0xF76B, 0x9C68, 0xF76C, 0x9C69, 0xF76D, 0x9C6A, 0xF76E, + 0x9C6B, 0xF76F, 0x9C6C, 0xF770, 0x9C6D, 0xF771, 0x9C6E, 0xF772, 0x9C6F, 0xF773, 0x9C70, 0xF774, 0x9C71, 0xF775, 0x9C72, 0xF776, + 0x9C73, 0xF777, 0x9C74, 0xF778, 0x9C75, 0xF779, 0x9C76, 0xF77A, 0x9C77, 0xF77B, 0x9C78, 0xF77C, 0x9C79, 0xF77D, 0x9C7A, 0xF77E, + 0x9C7B, 0xF780, 0x9C7C, 0xD3E3, 0x9C7D, 0xF781, 0x9C7E, 0xF782, 0x9C7F, 0xF6CF, 0x9C80, 0xF783, 0x9C81, 0xC2B3, 0x9C82, 0xF6D0, + 0x9C83, 0xF784, 0x9C84, 0xF785, 0x9C85, 0xF6D1, 0x9C86, 0xF6D2, 0x9C87, 0xF6D3, 0x9C88, 0xF6D4, 0x9C89, 0xF786, 0x9C8A, 0xF787, + 0x9C8B, 0xF6D6, 0x9C8C, 0xF788, 0x9C8D, 0xB1AB, 0x9C8E, 0xF6D7, 0x9C8F, 0xF789, 0x9C90, 0xF6D8, 0x9C91, 0xF6D9, 0x9C92, 0xF6DA, + 0x9C93, 0xF78A, 0x9C94, 0xF6DB, 0x9C95, 0xF6DC, 0x9C96, 0xF78B, 0x9C97, 0xF78C, 0x9C98, 0xF78D, 0x9C99, 0xF78E, 0x9C9A, 0xF6DD, + 0x9C9B, 0xF6DE, 0x9C9C, 0xCFCA, 0x9C9D, 0xF78F, 0x9C9E, 0xF6DF, 0x9C9F, 0xF6E0, 0x9CA0, 0xF6E1, 0x9CA1, 0xF6E2, 0x9CA2, 0xF6E3, + 0x9CA3, 0xF6E4, 0x9CA4, 0xC0F0, 0x9CA5, 0xF6E5, 0x9CA6, 0xF6E6, 0x9CA7, 0xF6E7, 0x9CA8, 0xF6E8, 0x9CA9, 0xF6E9, 0x9CAA, 0xF790, + 0x9CAB, 0xF6EA, 0x9CAC, 0xF791, 0x9CAD, 0xF6EB, 0x9CAE, 0xF6EC, 0x9CAF, 0xF792, 0x9CB0, 0xF6ED, 0x9CB1, 0xF6EE, 0x9CB2, 0xF6EF, + 0x9CB3, 0xF6F0, 0x9CB4, 0xF6F1, 0x9CB5, 0xF6F2, 0x9CB6, 0xF6F3, 0x9CB7, 0xF6F4, 0x9CB8, 0xBEA8, 0x9CB9, 0xF793, 0x9CBA, 0xF6F5, + 0x9CBB, 0xF6F6, 0x9CBC, 0xF6F7, 0x9CBD, 0xF6F8, 0x9CBE, 0xF794, 0x9CBF, 0xF795, 0x9CC0, 0xF796, 0x9CC1, 0xF797, 0x9CC2, 0xF798, + 0x9CC3, 0xC8FA, 0x9CC4, 0xF6F9, 0x9CC5, 0xF6FA, 0x9CC6, 0xF6FB, 0x9CC7, 0xF6FC, 0x9CC8, 0xF799, 0x9CC9, 0xF79A, 0x9CCA, 0xF6FD, + 0x9CCB, 0xF6FE, 0x9CCC, 0xF7A1, 0x9CCD, 0xF7A2, 0x9CCE, 0xF7A3, 0x9CCF, 0xF7A4, 0x9CD0, 0xF7A5, 0x9CD1, 0xF79B, 0x9CD2, 0xF79C, + 0x9CD3, 0xF7A6, 0x9CD4, 0xF7A7, 0x9CD5, 0xF7A8, 0x9CD6, 0xB1EE, 0x9CD7, 0xF7A9, 0x9CD8, 0xF7AA, 0x9CD9, 0xF7AB, 0x9CDA, 0xF79D, + 0x9CDB, 0xF79E, 0x9CDC, 0xF7AC, 0x9CDD, 0xF7AD, 0x9CDE, 0xC1DB, 0x9CDF, 0xF7AE, 0x9CE0, 0xF79F, 0x9CE1, 0xF7A0, 0x9CE2, 0xF7AF, + 0x9CE3, 0xF840, 0x9CE4, 0xF841, 0x9CE5, 0xF842, 0x9CE6, 0xF843, 0x9CE7, 0xF844, 0x9CE8, 0xF845, 0x9CE9, 0xF846, 0x9CEA, 0xF847, + 0x9CEB, 0xF848, 0x9CEC, 0xF849, 0x9CED, 0xF84A, 0x9CEE, 0xF84B, 0x9CEF, 0xF84C, 0x9CF0, 0xF84D, 0x9CF1, 0xF84E, 0x9CF2, 0xF84F, + 0x9CF3, 0xF850, 0x9CF4, 0xF851, 0x9CF5, 0xF852, 0x9CF6, 0xF853, 0x9CF7, 0xF854, 0x9CF8, 0xF855, 0x9CF9, 0xF856, 0x9CFA, 0xF857, + 0x9CFB, 0xF858, 0x9CFC, 0xF859, 0x9CFD, 0xF85A, 0x9CFE, 0xF85B, 0x9CFF, 0xF85C, 0x9D00, 0xF85D, 0x9D01, 0xF85E, 0x9D02, 0xF85F, + 0x9D03, 0xF860, 0x9D04, 0xF861, 0x9D05, 0xF862, 0x9D06, 0xF863, 0x9D07, 0xF864, 0x9D08, 0xF865, 0x9D09, 0xF866, 0x9D0A, 0xF867, + 0x9D0B, 0xF868, 0x9D0C, 0xF869, 0x9D0D, 0xF86A, 0x9D0E, 0xF86B, 0x9D0F, 0xF86C, 0x9D10, 0xF86D, 0x9D11, 0xF86E, 0x9D12, 0xF86F, + 0x9D13, 0xF870, 0x9D14, 0xF871, 0x9D15, 0xF872, 0x9D16, 0xF873, 0x9D17, 0xF874, 0x9D18, 0xF875, 0x9D19, 0xF876, 0x9D1A, 0xF877, + 0x9D1B, 0xF878, 0x9D1C, 0xF879, 0x9D1D, 0xF87A, 0x9D1E, 0xF87B, 0x9D1F, 0xF87C, 0x9D20, 0xF87D, 0x9D21, 0xF87E, 0x9D22, 0xF880, + 0x9D23, 0xF881, 0x9D24, 0xF882, 0x9D25, 0xF883, 0x9D26, 0xF884, 0x9D27, 0xF885, 0x9D28, 0xF886, 0x9D29, 0xF887, 0x9D2A, 0xF888, + 0x9D2B, 0xF889, 0x9D2C, 0xF88A, 0x9D2D, 0xF88B, 0x9D2E, 0xF88C, 0x9D2F, 0xF88D, 0x9D30, 0xF88E, 0x9D31, 0xF88F, 0x9D32, 0xF890, + 0x9D33, 0xF891, 0x9D34, 0xF892, 0x9D35, 0xF893, 0x9D36, 0xF894, 0x9D37, 0xF895, 0x9D38, 0xF896, 0x9D39, 0xF897, 0x9D3A, 0xF898, + 0x9D3B, 0xF899, 0x9D3C, 0xF89A, 0x9D3D, 0xF89B, 0x9D3E, 0xF89C, 0x9D3F, 0xF89D, 0x9D40, 0xF89E, 0x9D41, 0xF89F, 0x9D42, 0xF8A0, + 0x9D43, 0xF940, 0x9D44, 0xF941, 0x9D45, 0xF942, 0x9D46, 0xF943, 0x9D47, 0xF944, 0x9D48, 0xF945, 0x9D49, 0xF946, 0x9D4A, 0xF947, + 0x9D4B, 0xF948, 0x9D4C, 0xF949, 0x9D4D, 0xF94A, 0x9D4E, 0xF94B, 0x9D4F, 0xF94C, 0x9D50, 0xF94D, 0x9D51, 0xF94E, 0x9D52, 0xF94F, + 0x9D53, 0xF950, 0x9D54, 0xF951, 0x9D55, 0xF952, 0x9D56, 0xF953, 0x9D57, 0xF954, 0x9D58, 0xF955, 0x9D59, 0xF956, 0x9D5A, 0xF957, + 0x9D5B, 0xF958, 0x9D5C, 0xF959, 0x9D5D, 0xF95A, 0x9D5E, 0xF95B, 0x9D5F, 0xF95C, 0x9D60, 0xF95D, 0x9D61, 0xF95E, 0x9D62, 0xF95F, + 0x9D63, 0xF960, 0x9D64, 0xF961, 0x9D65, 0xF962, 0x9D66, 0xF963, 0x9D67, 0xF964, 0x9D68, 0xF965, 0x9D69, 0xF966, 0x9D6A, 0xF967, + 0x9D6B, 0xF968, 0x9D6C, 0xF969, 0x9D6D, 0xF96A, 0x9D6E, 0xF96B, 0x9D6F, 0xF96C, 0x9D70, 0xF96D, 0x9D71, 0xF96E, 0x9D72, 0xF96F, + 0x9D73, 0xF970, 0x9D74, 0xF971, 0x9D75, 0xF972, 0x9D76, 0xF973, 0x9D77, 0xF974, 0x9D78, 0xF975, 0x9D79, 0xF976, 0x9D7A, 0xF977, + 0x9D7B, 0xF978, 0x9D7C, 0xF979, 0x9D7D, 0xF97A, 0x9D7E, 0xF97B, 0x9D7F, 0xF97C, 0x9D80, 0xF97D, 0x9D81, 0xF97E, 0x9D82, 0xF980, + 0x9D83, 0xF981, 0x9D84, 0xF982, 0x9D85, 0xF983, 0x9D86, 0xF984, 0x9D87, 0xF985, 0x9D88, 0xF986, 0x9D89, 0xF987, 0x9D8A, 0xF988, + 0x9D8B, 0xF989, 0x9D8C, 0xF98A, 0x9D8D, 0xF98B, 0x9D8E, 0xF98C, 0x9D8F, 0xF98D, 0x9D90, 0xF98E, 0x9D91, 0xF98F, 0x9D92, 0xF990, + 0x9D93, 0xF991, 0x9D94, 0xF992, 0x9D95, 0xF993, 0x9D96, 0xF994, 0x9D97, 0xF995, 0x9D98, 0xF996, 0x9D99, 0xF997, 0x9D9A, 0xF998, + 0x9D9B, 0xF999, 0x9D9C, 0xF99A, 0x9D9D, 0xF99B, 0x9D9E, 0xF99C, 0x9D9F, 0xF99D, 0x9DA0, 0xF99E, 0x9DA1, 0xF99F, 0x9DA2, 0xF9A0, + 0x9DA3, 0xFA40, 0x9DA4, 0xFA41, 0x9DA5, 0xFA42, 0x9DA6, 0xFA43, 0x9DA7, 0xFA44, 0x9DA8, 0xFA45, 0x9DA9, 0xFA46, 0x9DAA, 0xFA47, + 0x9DAB, 0xFA48, 0x9DAC, 0xFA49, 0x9DAD, 0xFA4A, 0x9DAE, 0xFA4B, 0x9DAF, 0xFA4C, 0x9DB0, 0xFA4D, 0x9DB1, 0xFA4E, 0x9DB2, 0xFA4F, + 0x9DB3, 0xFA50, 0x9DB4, 0xFA51, 0x9DB5, 0xFA52, 0x9DB6, 0xFA53, 0x9DB7, 0xFA54, 0x9DB8, 0xFA55, 0x9DB9, 0xFA56, 0x9DBA, 0xFA57, + 0x9DBB, 0xFA58, 0x9DBC, 0xFA59, 0x9DBD, 0xFA5A, 0x9DBE, 0xFA5B, 0x9DBF, 0xFA5C, 0x9DC0, 0xFA5D, 0x9DC1, 0xFA5E, 0x9DC2, 0xFA5F, + 0x9DC3, 0xFA60, 0x9DC4, 0xFA61, 0x9DC5, 0xFA62, 0x9DC6, 0xFA63, 0x9DC7, 0xFA64, 0x9DC8, 0xFA65, 0x9DC9, 0xFA66, 0x9DCA, 0xFA67, + 0x9DCB, 0xFA68, 0x9DCC, 0xFA69, 0x9DCD, 0xFA6A, 0x9DCE, 0xFA6B, 0x9DCF, 0xFA6C, 0x9DD0, 0xFA6D, 0x9DD1, 0xFA6E, 0x9DD2, 0xFA6F, + 0x9DD3, 0xFA70, 0x9DD4, 0xFA71, 0x9DD5, 0xFA72, 0x9DD6, 0xFA73, 0x9DD7, 0xFA74, 0x9DD8, 0xFA75, 0x9DD9, 0xFA76, 0x9DDA, 0xFA77, + 0x9DDB, 0xFA78, 0x9DDC, 0xFA79, 0x9DDD, 0xFA7A, 0x9DDE, 0xFA7B, 0x9DDF, 0xFA7C, 0x9DE0, 0xFA7D, 0x9DE1, 0xFA7E, 0x9DE2, 0xFA80, + 0x9DE3, 0xFA81, 0x9DE4, 0xFA82, 0x9DE5, 0xFA83, 0x9DE6, 0xFA84, 0x9DE7, 0xFA85, 0x9DE8, 0xFA86, 0x9DE9, 0xFA87, 0x9DEA, 0xFA88, + 0x9DEB, 0xFA89, 0x9DEC, 0xFA8A, 0x9DED, 0xFA8B, 0x9DEE, 0xFA8C, 0x9DEF, 0xFA8D, 0x9DF0, 0xFA8E, 0x9DF1, 0xFA8F, 0x9DF2, 0xFA90, + 0x9DF3, 0xFA91, 0x9DF4, 0xFA92, 0x9DF5, 0xFA93, 0x9DF6, 0xFA94, 0x9DF7, 0xFA95, 0x9DF8, 0xFA96, 0x9DF9, 0xFA97, 0x9DFA, 0xFA98, + 0x9DFB, 0xFA99, 0x9DFC, 0xFA9A, 0x9DFD, 0xFA9B, 0x9DFE, 0xFA9C, 0x9DFF, 0xFA9D, 0x9E00, 0xFA9E, 0x9E01, 0xFA9F, 0x9E02, 0xFAA0, + 0x9E03, 0xFB40, 0x9E04, 0xFB41, 0x9E05, 0xFB42, 0x9E06, 0xFB43, 0x9E07, 0xFB44, 0x9E08, 0xFB45, 0x9E09, 0xFB46, 0x9E0A, 0xFB47, + 0x9E0B, 0xFB48, 0x9E0C, 0xFB49, 0x9E0D, 0xFB4A, 0x9E0E, 0xFB4B, 0x9E0F, 0xFB4C, 0x9E10, 0xFB4D, 0x9E11, 0xFB4E, 0x9E12, 0xFB4F, + 0x9E13, 0xFB50, 0x9E14, 0xFB51, 0x9E15, 0xFB52, 0x9E16, 0xFB53, 0x9E17, 0xFB54, 0x9E18, 0xFB55, 0x9E19, 0xFB56, 0x9E1A, 0xFB57, + 0x9E1B, 0xFB58, 0x9E1C, 0xFB59, 0x9E1D, 0xFB5A, 0x9E1E, 0xFB5B, 0x9E1F, 0xC4F1, 0x9E20, 0xF0AF, 0x9E21, 0xBCA6, 0x9E22, 0xF0B0, + 0x9E23, 0xC3F9, 0x9E24, 0xFB5C, 0x9E25, 0xC5B8, 0x9E26, 0xD1BB, 0x9E27, 0xFB5D, 0x9E28, 0xF0B1, 0x9E29, 0xF0B2, 0x9E2A, 0xF0B3, + 0x9E2B, 0xF0B4, 0x9E2C, 0xF0B5, 0x9E2D, 0xD1BC, 0x9E2E, 0xFB5E, 0x9E2F, 0xD1EC, 0x9E30, 0xFB5F, 0x9E31, 0xF0B7, 0x9E32, 0xF0B6, + 0x9E33, 0xD4A7, 0x9E34, 0xFB60, 0x9E35, 0xCDD2, 0x9E36, 0xF0B8, 0x9E37, 0xF0BA, 0x9E38, 0xF0B9, 0x9E39, 0xF0BB, 0x9E3A, 0xF0BC, + 0x9E3B, 0xFB61, 0x9E3C, 0xFB62, 0x9E3D, 0xB8EB, 0x9E3E, 0xF0BD, 0x9E3F, 0xBAE8, 0x9E40, 0xFB63, 0x9E41, 0xF0BE, 0x9E42, 0xF0BF, + 0x9E43, 0xBEE9, 0x9E44, 0xF0C0, 0x9E45, 0xB6EC, 0x9E46, 0xF0C1, 0x9E47, 0xF0C2, 0x9E48, 0xF0C3, 0x9E49, 0xF0C4, 0x9E4A, 0xC8B5, + 0x9E4B, 0xF0C5, 0x9E4C, 0xF0C6, 0x9E4D, 0xFB64, 0x9E4E, 0xF0C7, 0x9E4F, 0xC5F4, 0x9E50, 0xFB65, 0x9E51, 0xF0C8, 0x9E52, 0xFB66, + 0x9E53, 0xFB67, 0x9E54, 0xFB68, 0x9E55, 0xF0C9, 0x9E56, 0xFB69, 0x9E57, 0xF0CA, 0x9E58, 0xF7BD, 0x9E59, 0xFB6A, 0x9E5A, 0xF0CB, + 0x9E5B, 0xF0CC, 0x9E5C, 0xF0CD, 0x9E5D, 0xFB6B, 0x9E5E, 0xF0CE, 0x9E5F, 0xFB6C, 0x9E60, 0xFB6D, 0x9E61, 0xFB6E, 0x9E62, 0xFB6F, + 0x9E63, 0xF0CF, 0x9E64, 0xBAD7, 0x9E65, 0xFB70, 0x9E66, 0xF0D0, 0x9E67, 0xF0D1, 0x9E68, 0xF0D2, 0x9E69, 0xF0D3, 0x9E6A, 0xF0D4, + 0x9E6B, 0xF0D5, 0x9E6C, 0xF0D6, 0x9E6D, 0xF0D8, 0x9E6E, 0xFB71, 0x9E6F, 0xFB72, 0x9E70, 0xD3A5, 0x9E71, 0xF0D7, 0x9E72, 0xFB73, + 0x9E73, 0xF0D9, 0x9E74, 0xFB74, 0x9E75, 0xFB75, 0x9E76, 0xFB76, 0x9E77, 0xFB77, 0x9E78, 0xFB78, 0x9E79, 0xFB79, 0x9E7A, 0xFB7A, + 0x9E7B, 0xFB7B, 0x9E7C, 0xFB7C, 0x9E7D, 0xFB7D, 0x9E7E, 0xF5BA, 0x9E7F, 0xC2B9, 0x9E80, 0xFB7E, 0x9E81, 0xFB80, 0x9E82, 0xF7E4, + 0x9E83, 0xFB81, 0x9E84, 0xFB82, 0x9E85, 0xFB83, 0x9E86, 0xFB84, 0x9E87, 0xF7E5, 0x9E88, 0xF7E6, 0x9E89, 0xFB85, 0x9E8A, 0xFB86, + 0x9E8B, 0xF7E7, 0x9E8C, 0xFB87, 0x9E8D, 0xFB88, 0x9E8E, 0xFB89, 0x9E8F, 0xFB8A, 0x9E90, 0xFB8B, 0x9E91, 0xFB8C, 0x9E92, 0xF7E8, + 0x9E93, 0xC2B4, 0x9E94, 0xFB8D, 0x9E95, 0xFB8E, 0x9E96, 0xFB8F, 0x9E97, 0xFB90, 0x9E98, 0xFB91, 0x9E99, 0xFB92, 0x9E9A, 0xFB93, + 0x9E9B, 0xFB94, 0x9E9C, 0xFB95, 0x9E9D, 0xF7EA, 0x9E9E, 0xFB96, 0x9E9F, 0xF7EB, 0x9EA0, 0xFB97, 0x9EA1, 0xFB98, 0x9EA2, 0xFB99, + 0x9EA3, 0xFB9A, 0x9EA4, 0xFB9B, 0x9EA5, 0xFB9C, 0x9EA6, 0xC2F3, 0x9EA7, 0xFB9D, 0x9EA8, 0xFB9E, 0x9EA9, 0xFB9F, 0x9EAA, 0xFBA0, + 0x9EAB, 0xFC40, 0x9EAC, 0xFC41, 0x9EAD, 0xFC42, 0x9EAE, 0xFC43, 0x9EAF, 0xFC44, 0x9EB0, 0xFC45, 0x9EB1, 0xFC46, 0x9EB2, 0xFC47, + 0x9EB3, 0xFC48, 0x9EB4, 0xF4F0, 0x9EB5, 0xFC49, 0x9EB6, 0xFC4A, 0x9EB7, 0xFC4B, 0x9EB8, 0xF4EF, 0x9EB9, 0xFC4C, 0x9EBA, 0xFC4D, + 0x9EBB, 0xC2E9, 0x9EBC, 0xFC4E, 0x9EBD, 0xF7E1, 0x9EBE, 0xF7E2, 0x9EBF, 0xFC4F, 0x9EC0, 0xFC50, 0x9EC1, 0xFC51, 0x9EC2, 0xFC52, + 0x9EC3, 0xFC53, 0x9EC4, 0xBBC6, 0x9EC5, 0xFC54, 0x9EC6, 0xFC55, 0x9EC7, 0xFC56, 0x9EC8, 0xFC57, 0x9EC9, 0xD9E4, 0x9ECA, 0xFC58, + 0x9ECB, 0xFC59, 0x9ECC, 0xFC5A, 0x9ECD, 0xCAF2, 0x9ECE, 0xC0E8, 0x9ECF, 0xF0A4, 0x9ED0, 0xFC5B, 0x9ED1, 0xBADA, 0x9ED2, 0xFC5C, + 0x9ED3, 0xFC5D, 0x9ED4, 0xC7AD, 0x9ED5, 0xFC5E, 0x9ED6, 0xFC5F, 0x9ED7, 0xFC60, 0x9ED8, 0xC4AC, 0x9ED9, 0xFC61, 0x9EDA, 0xFC62, + 0x9EDB, 0xF7EC, 0x9EDC, 0xF7ED, 0x9EDD, 0xF7EE, 0x9EDE, 0xFC63, 0x9EDF, 0xF7F0, 0x9EE0, 0xF7EF, 0x9EE1, 0xFC64, 0x9EE2, 0xF7F1, + 0x9EE3, 0xFC65, 0x9EE4, 0xFC66, 0x9EE5, 0xF7F4, 0x9EE6, 0xFC67, 0x9EE7, 0xF7F3, 0x9EE8, 0xFC68, 0x9EE9, 0xF7F2, 0x9EEA, 0xF7F5, + 0x9EEB, 0xFC69, 0x9EEC, 0xFC6A, 0x9EED, 0xFC6B, 0x9EEE, 0xFC6C, 0x9EEF, 0xF7F6, 0x9EF0, 0xFC6D, 0x9EF1, 0xFC6E, 0x9EF2, 0xFC6F, + 0x9EF3, 0xFC70, 0x9EF4, 0xFC71, 0x9EF5, 0xFC72, 0x9EF6, 0xFC73, 0x9EF7, 0xFC74, 0x9EF8, 0xFC75, 0x9EF9, 0xEDE9, 0x9EFA, 0xFC76, + 0x9EFB, 0xEDEA, 0x9EFC, 0xEDEB, 0x9EFD, 0xFC77, 0x9EFE, 0xF6BC, 0x9EFF, 0xFC78, 0x9F00, 0xFC79, 0x9F01, 0xFC7A, 0x9F02, 0xFC7B, + 0x9F03, 0xFC7C, 0x9F04, 0xFC7D, 0x9F05, 0xFC7E, 0x9F06, 0xFC80, 0x9F07, 0xFC81, 0x9F08, 0xFC82, 0x9F09, 0xFC83, 0x9F0A, 0xFC84, + 0x9F0B, 0xF6BD, 0x9F0C, 0xFC85, 0x9F0D, 0xF6BE, 0x9F0E, 0xB6A6, 0x9F0F, 0xFC86, 0x9F10, 0xD8BE, 0x9F11, 0xFC87, 0x9F12, 0xFC88, + 0x9F13, 0xB9C4, 0x9F14, 0xFC89, 0x9F15, 0xFC8A, 0x9F16, 0xFC8B, 0x9F17, 0xD8BB, 0x9F18, 0xFC8C, 0x9F19, 0xDCB1, 0x9F1A, 0xFC8D, + 0x9F1B, 0xFC8E, 0x9F1C, 0xFC8F, 0x9F1D, 0xFC90, 0x9F1E, 0xFC91, 0x9F1F, 0xFC92, 0x9F20, 0xCAF3, 0x9F21, 0xFC93, 0x9F22, 0xF7F7, + 0x9F23, 0xFC94, 0x9F24, 0xFC95, 0x9F25, 0xFC96, 0x9F26, 0xFC97, 0x9F27, 0xFC98, 0x9F28, 0xFC99, 0x9F29, 0xFC9A, 0x9F2A, 0xFC9B, + 0x9F2B, 0xFC9C, 0x9F2C, 0xF7F8, 0x9F2D, 0xFC9D, 0x9F2E, 0xFC9E, 0x9F2F, 0xF7F9, 0x9F30, 0xFC9F, 0x9F31, 0xFCA0, 0x9F32, 0xFD40, + 0x9F33, 0xFD41, 0x9F34, 0xFD42, 0x9F35, 0xFD43, 0x9F36, 0xFD44, 0x9F37, 0xF7FB, 0x9F38, 0xFD45, 0x9F39, 0xF7FA, 0x9F3A, 0xFD46, + 0x9F3B, 0xB1C7, 0x9F3C, 0xFD47, 0x9F3D, 0xF7FC, 0x9F3E, 0xF7FD, 0x9F3F, 0xFD48, 0x9F40, 0xFD49, 0x9F41, 0xFD4A, 0x9F42, 0xFD4B, + 0x9F43, 0xFD4C, 0x9F44, 0xF7FE, 0x9F45, 0xFD4D, 0x9F46, 0xFD4E, 0x9F47, 0xFD4F, 0x9F48, 0xFD50, 0x9F49, 0xFD51, 0x9F4A, 0xFD52, + 0x9F4B, 0xFD53, 0x9F4C, 0xFD54, 0x9F4D, 0xFD55, 0x9F4E, 0xFD56, 0x9F4F, 0xFD57, 0x9F50, 0xC6EB, 0x9F51, 0xECB4, 0x9F52, 0xFD58, + 0x9F53, 0xFD59, 0x9F54, 0xFD5A, 0x9F55, 0xFD5B, 0x9F56, 0xFD5C, 0x9F57, 0xFD5D, 0x9F58, 0xFD5E, 0x9F59, 0xFD5F, 0x9F5A, 0xFD60, + 0x9F5B, 0xFD61, 0x9F5C, 0xFD62, 0x9F5D, 0xFD63, 0x9F5E, 0xFD64, 0x9F5F, 0xFD65, 0x9F60, 0xFD66, 0x9F61, 0xFD67, 0x9F62, 0xFD68, + 0x9F63, 0xFD69, 0x9F64, 0xFD6A, 0x9F65, 0xFD6B, 0x9F66, 0xFD6C, 0x9F67, 0xFD6D, 0x9F68, 0xFD6E, 0x9F69, 0xFD6F, 0x9F6A, 0xFD70, + 0x9F6B, 0xFD71, 0x9F6C, 0xFD72, 0x9F6D, 0xFD73, 0x9F6E, 0xFD74, 0x9F6F, 0xFD75, 0x9F70, 0xFD76, 0x9F71, 0xFD77, 0x9F72, 0xFD78, + 0x9F73, 0xFD79, 0x9F74, 0xFD7A, 0x9F75, 0xFD7B, 0x9F76, 0xFD7C, 0x9F77, 0xFD7D, 0x9F78, 0xFD7E, 0x9F79, 0xFD80, 0x9F7A, 0xFD81, + 0x9F7B, 0xFD82, 0x9F7C, 0xFD83, 0x9F7D, 0xFD84, 0x9F7E, 0xFD85, 0x9F7F, 0xB3DD, 0x9F80, 0xF6B3, 0x9F81, 0xFD86, 0x9F82, 0xFD87, + 0x9F83, 0xF6B4, 0x9F84, 0xC1E4, 0x9F85, 0xF6B5, 0x9F86, 0xF6B6, 0x9F87, 0xF6B7, 0x9F88, 0xF6B8, 0x9F89, 0xF6B9, 0x9F8A, 0xF6BA, + 0x9F8B, 0xC8A3, 0x9F8C, 0xF6BB, 0x9F8D, 0xFD88, 0x9F8E, 0xFD89, 0x9F8F, 0xFD8A, 0x9F90, 0xFD8B, 0x9F91, 0xFD8C, 0x9F92, 0xFD8D, + 0x9F93, 0xFD8E, 0x9F94, 0xFD8F, 0x9F95, 0xFD90, 0x9F96, 0xFD91, 0x9F97, 0xFD92, 0x9F98, 0xFD93, 0x9F99, 0xC1FA, 0x9F9A, 0xB9A8, + 0x9F9B, 0xEDE8, 0x9F9C, 0xFD94, 0x9F9D, 0xFD95, 0x9F9E, 0xFD96, 0x9F9F, 0xB9EA, 0x9FA0, 0xD9DF, 0x9FA1, 0xFD97, 0x9FA2, 0xFD98, + 0x9FA3, 0xFD99, 0x9FA4, 0xFD9A, 0x9FA5, 0xFD9B, 0xF92C, 0xFD9C, 0xF979, 0xFD9D, 0xF995, 0xFD9E, 0xF9E7, 0xFD9F, 0xF9F1, 0xFDA0, + 0xFA0C, 0xFE40, 0xFA0D, 0xFE41, 0xFA0E, 0xFE42, 0xFA0F, 0xFE43, 0xFA11, 0xFE44, 0xFA13, 0xFE45, 0xFA14, 0xFE46, 0xFA18, 0xFE47, + 0xFA1F, 0xFE48, 0xFA20, 0xFE49, 0xFA21, 0xFE4A, 0xFA23, 0xFE4B, 0xFA24, 0xFE4C, 0xFA27, 0xFE4D, 0xFA28, 0xFE4E, 0xFA29, 0xFE4F, + 0xFE30, 0xA955, 0xFE31, 0xA6F2, 0xFE33, 0xA6F4, 0xFE34, 0xA6F5, 0xFE35, 0xA6E0, 0xFE36, 0xA6E1, 0xFE37, 0xA6F0, 0xFE38, 0xA6F1, + 0xFE39, 0xA6E2, 0xFE3A, 0xA6E3, 0xFE3B, 0xA6EE, 0xFE3C, 0xA6EF, 0xFE3D, 0xA6E6, 0xFE3E, 0xA6E7, 0xFE3F, 0xA6E4, 0xFE40, 0xA6E5, + 0xFE41, 0xA6E8, 0xFE42, 0xA6E9, 0xFE43, 0xA6EA, 0xFE44, 0xA6EB, 0xFE49, 0xA968, 0xFE4A, 0xA969, 0xFE4B, 0xA96A, 0xFE4C, 0xA96B, + 0xFE4D, 0xA96C, 0xFE4E, 0xA96D, 0xFE4F, 0xA96E, 0xFE50, 0xA96F, 0xFE51, 0xA970, 0xFE52, 0xA971, 0xFE54, 0xA972, 0xFE55, 0xA973, + 0xFE56, 0xA974, 0xFE57, 0xA975, 0xFE59, 0xA976, 0xFE5A, 0xA977, 0xFE5B, 0xA978, 0xFE5C, 0xA979, 0xFE5D, 0xA97A, 0xFE5E, 0xA97B, + 0xFE5F, 0xA97C, 0xFE60, 0xA97D, 0xFE61, 0xA97E, 0xFE62, 0xA980, 0xFE63, 0xA981, 0xFE64, 0xA982, 0xFE65, 0xA983, 0xFE66, 0xA984, + 0xFE68, 0xA985, 0xFE69, 0xA986, 0xFE6A, 0xA987, 0xFE6B, 0xA988, 0xFF01, 0xA3A1, 0xFF02, 0xA3A2, 0xFF03, 0xA3A3, 0xFF04, 0xA1E7, + 0xFF05, 0xA3A5, 0xFF06, 0xA3A6, 0xFF07, 0xA3A7, 0xFF08, 0xA3A8, 0xFF09, 0xA3A9, 0xFF0A, 0xA3AA, 0xFF0B, 0xA3AB, 0xFF0C, 0xA3AC, + 0xFF0D, 0xA3AD, 0xFF0E, 0xA3AE, 0xFF0F, 0xA3AF, 0xFF10, 0xA3B0, 0xFF11, 0xA3B1, 0xFF12, 0xA3B2, 0xFF13, 0xA3B3, 0xFF14, 0xA3B4, + 0xFF15, 0xA3B5, 0xFF16, 0xA3B6, 0xFF17, 0xA3B7, 0xFF18, 0xA3B8, 0xFF19, 0xA3B9, 0xFF1A, 0xA3BA, 0xFF1B, 0xA3BB, 0xFF1C, 0xA3BC, + 0xFF1D, 0xA3BD, 0xFF1E, 0xA3BE, 0xFF1F, 0xA3BF, 0xFF20, 0xA3C0, 0xFF21, 0xA3C1, 0xFF22, 0xA3C2, 0xFF23, 0xA3C3, 0xFF24, 0xA3C4, + 0xFF25, 0xA3C5, 0xFF26, 0xA3C6, 0xFF27, 0xA3C7, 0xFF28, 0xA3C8, 0xFF29, 0xA3C9, 0xFF2A, 0xA3CA, 0xFF2B, 0xA3CB, 0xFF2C, 0xA3CC, + 0xFF2D, 0xA3CD, 0xFF2E, 0xA3CE, 0xFF2F, 0xA3CF, 0xFF30, 0xA3D0, 0xFF31, 0xA3D1, 0xFF32, 0xA3D2, 0xFF33, 0xA3D3, 0xFF34, 0xA3D4, + 0xFF35, 0xA3D5, 0xFF36, 0xA3D6, 0xFF37, 0xA3D7, 0xFF38, 0xA3D8, 0xFF39, 0xA3D9, 0xFF3A, 0xA3DA, 0xFF3B, 0xA3DB, 0xFF3C, 0xA3DC, + 0xFF3D, 0xA3DD, 0xFF3E, 0xA3DE, 0xFF3F, 0xA3DF, 0xFF40, 0xA3E0, 0xFF41, 0xA3E1, 0xFF42, 0xA3E2, 0xFF43, 0xA3E3, 0xFF44, 0xA3E4, + 0xFF45, 0xA3E5, 0xFF46, 0xA3E6, 0xFF47, 0xA3E7, 0xFF48, 0xA3E8, 0xFF49, 0xA3E9, 0xFF4A, 0xA3EA, 0xFF4B, 0xA3EB, 0xFF4C, 0xA3EC, + 0xFF4D, 0xA3ED, 0xFF4E, 0xA3EE, 0xFF4F, 0xA3EF, 0xFF50, 0xA3F0, 0xFF51, 0xA3F1, 0xFF52, 0xA3F2, 0xFF53, 0xA3F3, 0xFF54, 0xA3F4, + 0xFF55, 0xA3F5, 0xFF56, 0xA3F6, 0xFF57, 0xA3F7, 0xFF58, 0xA3F8, 0xFF59, 0xA3F9, 0xFF5A, 0xA3FA, 0xFF5B, 0xA3FB, 0xFF5C, 0xA3FC, + 0xFF5D, 0xA3FD, 0xFF5E, 0xA1AB, 0xFFE0, 0xA1E9, 0xFFE1, 0xA1EA, 0xFFE2, 0xA956, 0xFFE3, 0xA3FE, 0xFFE4, 0xA957, 0xFFE5, 0xA3A4, + 0, 0 +}; + +static const WCHAR oem2uni936[] = { /* GBK --> Unicode pairs */ + 0x0080, 0x20AC, 0x8140, 0x4E02, 0x8141, 0x4E04, 0x8142, 0x4E05, 0x8143, 0x4E06, 0x8144, 0x4E0F, 0x8145, 0x4E12, 0x8146, 0x4E17, + 0x8147, 0x4E1F, 0x8148, 0x4E20, 0x8149, 0x4E21, 0x814A, 0x4E23, 0x814B, 0x4E26, 0x814C, 0x4E29, 0x814D, 0x4E2E, 0x814E, 0x4E2F, + 0x814F, 0x4E31, 0x8150, 0x4E33, 0x8151, 0x4E35, 0x8152, 0x4E37, 0x8153, 0x4E3C, 0x8154, 0x4E40, 0x8155, 0x4E41, 0x8156, 0x4E42, + 0x8157, 0x4E44, 0x8158, 0x4E46, 0x8159, 0x4E4A, 0x815A, 0x4E51, 0x815B, 0x4E55, 0x815C, 0x4E57, 0x815D, 0x4E5A, 0x815E, 0x4E5B, + 0x815F, 0x4E62, 0x8160, 0x4E63, 0x8161, 0x4E64, 0x8162, 0x4E65, 0x8163, 0x4E67, 0x8164, 0x4E68, 0x8165, 0x4E6A, 0x8166, 0x4E6B, + 0x8167, 0x4E6C, 0x8168, 0x4E6D, 0x8169, 0x4E6E, 0x816A, 0x4E6F, 0x816B, 0x4E72, 0x816C, 0x4E74, 0x816D, 0x4E75, 0x816E, 0x4E76, + 0x816F, 0x4E77, 0x8170, 0x4E78, 0x8171, 0x4E79, 0x8172, 0x4E7A, 0x8173, 0x4E7B, 0x8174, 0x4E7C, 0x8175, 0x4E7D, 0x8176, 0x4E7F, + 0x8177, 0x4E80, 0x8178, 0x4E81, 0x8179, 0x4E82, 0x817A, 0x4E83, 0x817B, 0x4E84, 0x817C, 0x4E85, 0x817D, 0x4E87, 0x817E, 0x4E8A, + 0x8180, 0x4E90, 0x8181, 0x4E96, 0x8182, 0x4E97, 0x8183, 0x4E99, 0x8184, 0x4E9C, 0x8185, 0x4E9D, 0x8186, 0x4E9E, 0x8187, 0x4EA3, + 0x8188, 0x4EAA, 0x8189, 0x4EAF, 0x818A, 0x4EB0, 0x818B, 0x4EB1, 0x818C, 0x4EB4, 0x818D, 0x4EB6, 0x818E, 0x4EB7, 0x818F, 0x4EB8, + 0x8190, 0x4EB9, 0x8191, 0x4EBC, 0x8192, 0x4EBD, 0x8193, 0x4EBE, 0x8194, 0x4EC8, 0x8195, 0x4ECC, 0x8196, 0x4ECF, 0x8197, 0x4ED0, + 0x8198, 0x4ED2, 0x8199, 0x4EDA, 0x819A, 0x4EDB, 0x819B, 0x4EDC, 0x819C, 0x4EE0, 0x819D, 0x4EE2, 0x819E, 0x4EE6, 0x819F, 0x4EE7, + 0x81A0, 0x4EE9, 0x81A1, 0x4EED, 0x81A2, 0x4EEE, 0x81A3, 0x4EEF, 0x81A4, 0x4EF1, 0x81A5, 0x4EF4, 0x81A6, 0x4EF8, 0x81A7, 0x4EF9, + 0x81A8, 0x4EFA, 0x81A9, 0x4EFC, 0x81AA, 0x4EFE, 0x81AB, 0x4F00, 0x81AC, 0x4F02, 0x81AD, 0x4F03, 0x81AE, 0x4F04, 0x81AF, 0x4F05, + 0x81B0, 0x4F06, 0x81B1, 0x4F07, 0x81B2, 0x4F08, 0x81B3, 0x4F0B, 0x81B4, 0x4F0C, 0x81B5, 0x4F12, 0x81B6, 0x4F13, 0x81B7, 0x4F14, + 0x81B8, 0x4F15, 0x81B9, 0x4F16, 0x81BA, 0x4F1C, 0x81BB, 0x4F1D, 0x81BC, 0x4F21, 0x81BD, 0x4F23, 0x81BE, 0x4F28, 0x81BF, 0x4F29, + 0x81C0, 0x4F2C, 0x81C1, 0x4F2D, 0x81C2, 0x4F2E, 0x81C3, 0x4F31, 0x81C4, 0x4F33, 0x81C5, 0x4F35, 0x81C6, 0x4F37, 0x81C7, 0x4F39, + 0x81C8, 0x4F3B, 0x81C9, 0x4F3E, 0x81CA, 0x4F3F, 0x81CB, 0x4F40, 0x81CC, 0x4F41, 0x81CD, 0x4F42, 0x81CE, 0x4F44, 0x81CF, 0x4F45, + 0x81D0, 0x4F47, 0x81D1, 0x4F48, 0x81D2, 0x4F49, 0x81D3, 0x4F4A, 0x81D4, 0x4F4B, 0x81D5, 0x4F4C, 0x81D6, 0x4F52, 0x81D7, 0x4F54, + 0x81D8, 0x4F56, 0x81D9, 0x4F61, 0x81DA, 0x4F62, 0x81DB, 0x4F66, 0x81DC, 0x4F68, 0x81DD, 0x4F6A, 0x81DE, 0x4F6B, 0x81DF, 0x4F6D, + 0x81E0, 0x4F6E, 0x81E1, 0x4F71, 0x81E2, 0x4F72, 0x81E3, 0x4F75, 0x81E4, 0x4F77, 0x81E5, 0x4F78, 0x81E6, 0x4F79, 0x81E7, 0x4F7A, + 0x81E8, 0x4F7D, 0x81E9, 0x4F80, 0x81EA, 0x4F81, 0x81EB, 0x4F82, 0x81EC, 0x4F85, 0x81ED, 0x4F86, 0x81EE, 0x4F87, 0x81EF, 0x4F8A, + 0x81F0, 0x4F8C, 0x81F1, 0x4F8E, 0x81F2, 0x4F90, 0x81F3, 0x4F92, 0x81F4, 0x4F93, 0x81F5, 0x4F95, 0x81F6, 0x4F96, 0x81F7, 0x4F98, + 0x81F8, 0x4F99, 0x81F9, 0x4F9A, 0x81FA, 0x4F9C, 0x81FB, 0x4F9E, 0x81FC, 0x4F9F, 0x81FD, 0x4FA1, 0x81FE, 0x4FA2, 0x8240, 0x4FA4, + 0x8241, 0x4FAB, 0x8242, 0x4FAD, 0x8243, 0x4FB0, 0x8244, 0x4FB1, 0x8245, 0x4FB2, 0x8246, 0x4FB3, 0x8247, 0x4FB4, 0x8248, 0x4FB6, + 0x8249, 0x4FB7, 0x824A, 0x4FB8, 0x824B, 0x4FB9, 0x824C, 0x4FBA, 0x824D, 0x4FBB, 0x824E, 0x4FBC, 0x824F, 0x4FBD, 0x8250, 0x4FBE, + 0x8251, 0x4FC0, 0x8252, 0x4FC1, 0x8253, 0x4FC2, 0x8254, 0x4FC6, 0x8255, 0x4FC7, 0x8256, 0x4FC8, 0x8257, 0x4FC9, 0x8258, 0x4FCB, + 0x8259, 0x4FCC, 0x825A, 0x4FCD, 0x825B, 0x4FD2, 0x825C, 0x4FD3, 0x825D, 0x4FD4, 0x825E, 0x4FD5, 0x825F, 0x4FD6, 0x8260, 0x4FD9, + 0x8261, 0x4FDB, 0x8262, 0x4FE0, 0x8263, 0x4FE2, 0x8264, 0x4FE4, 0x8265, 0x4FE5, 0x8266, 0x4FE7, 0x8267, 0x4FEB, 0x8268, 0x4FEC, + 0x8269, 0x4FF0, 0x826A, 0x4FF2, 0x826B, 0x4FF4, 0x826C, 0x4FF5, 0x826D, 0x4FF6, 0x826E, 0x4FF7, 0x826F, 0x4FF9, 0x8270, 0x4FFB, + 0x8271, 0x4FFC, 0x8272, 0x4FFD, 0x8273, 0x4FFF, 0x8274, 0x5000, 0x8275, 0x5001, 0x8276, 0x5002, 0x8277, 0x5003, 0x8278, 0x5004, + 0x8279, 0x5005, 0x827A, 0x5006, 0x827B, 0x5007, 0x827C, 0x5008, 0x827D, 0x5009, 0x827E, 0x500A, 0x8280, 0x500B, 0x8281, 0x500E, + 0x8282, 0x5010, 0x8283, 0x5011, 0x8284, 0x5013, 0x8285, 0x5015, 0x8286, 0x5016, 0x8287, 0x5017, 0x8288, 0x501B, 0x8289, 0x501D, + 0x828A, 0x501E, 0x828B, 0x5020, 0x828C, 0x5022, 0x828D, 0x5023, 0x828E, 0x5024, 0x828F, 0x5027, 0x8290, 0x502B, 0x8291, 0x502F, + 0x8292, 0x5030, 0x8293, 0x5031, 0x8294, 0x5032, 0x8295, 0x5033, 0x8296, 0x5034, 0x8297, 0x5035, 0x8298, 0x5036, 0x8299, 0x5037, + 0x829A, 0x5038, 0x829B, 0x5039, 0x829C, 0x503B, 0x829D, 0x503D, 0x829E, 0x503F, 0x829F, 0x5040, 0x82A0, 0x5041, 0x82A1, 0x5042, + 0x82A2, 0x5044, 0x82A3, 0x5045, 0x82A4, 0x5046, 0x82A5, 0x5049, 0x82A6, 0x504A, 0x82A7, 0x504B, 0x82A8, 0x504D, 0x82A9, 0x5050, + 0x82AA, 0x5051, 0x82AB, 0x5052, 0x82AC, 0x5053, 0x82AD, 0x5054, 0x82AE, 0x5056, 0x82AF, 0x5057, 0x82B0, 0x5058, 0x82B1, 0x5059, + 0x82B2, 0x505B, 0x82B3, 0x505D, 0x82B4, 0x505E, 0x82B5, 0x505F, 0x82B6, 0x5060, 0x82B7, 0x5061, 0x82B8, 0x5062, 0x82B9, 0x5063, + 0x82BA, 0x5064, 0x82BB, 0x5066, 0x82BC, 0x5067, 0x82BD, 0x5068, 0x82BE, 0x5069, 0x82BF, 0x506A, 0x82C0, 0x506B, 0x82C1, 0x506D, + 0x82C2, 0x506E, 0x82C3, 0x506F, 0x82C4, 0x5070, 0x82C5, 0x5071, 0x82C6, 0x5072, 0x82C7, 0x5073, 0x82C8, 0x5074, 0x82C9, 0x5075, + 0x82CA, 0x5078, 0x82CB, 0x5079, 0x82CC, 0x507A, 0x82CD, 0x507C, 0x82CE, 0x507D, 0x82CF, 0x5081, 0x82D0, 0x5082, 0x82D1, 0x5083, + 0x82D2, 0x5084, 0x82D3, 0x5086, 0x82D4, 0x5087, 0x82D5, 0x5089, 0x82D6, 0x508A, 0x82D7, 0x508B, 0x82D8, 0x508C, 0x82D9, 0x508E, + 0x82DA, 0x508F, 0x82DB, 0x5090, 0x82DC, 0x5091, 0x82DD, 0x5092, 0x82DE, 0x5093, 0x82DF, 0x5094, 0x82E0, 0x5095, 0x82E1, 0x5096, + 0x82E2, 0x5097, 0x82E3, 0x5098, 0x82E4, 0x5099, 0x82E5, 0x509A, 0x82E6, 0x509B, 0x82E7, 0x509C, 0x82E8, 0x509D, 0x82E9, 0x509E, + 0x82EA, 0x509F, 0x82EB, 0x50A0, 0x82EC, 0x50A1, 0x82ED, 0x50A2, 0x82EE, 0x50A4, 0x82EF, 0x50A6, 0x82F0, 0x50AA, 0x82F1, 0x50AB, + 0x82F2, 0x50AD, 0x82F3, 0x50AE, 0x82F4, 0x50AF, 0x82F5, 0x50B0, 0x82F6, 0x50B1, 0x82F7, 0x50B3, 0x82F8, 0x50B4, 0x82F9, 0x50B5, + 0x82FA, 0x50B6, 0x82FB, 0x50B7, 0x82FC, 0x50B8, 0x82FD, 0x50B9, 0x82FE, 0x50BC, 0x8340, 0x50BD, 0x8341, 0x50BE, 0x8342, 0x50BF, + 0x8343, 0x50C0, 0x8344, 0x50C1, 0x8345, 0x50C2, 0x8346, 0x50C3, 0x8347, 0x50C4, 0x8348, 0x50C5, 0x8349, 0x50C6, 0x834A, 0x50C7, + 0x834B, 0x50C8, 0x834C, 0x50C9, 0x834D, 0x50CA, 0x834E, 0x50CB, 0x834F, 0x50CC, 0x8350, 0x50CD, 0x8351, 0x50CE, 0x8352, 0x50D0, + 0x8353, 0x50D1, 0x8354, 0x50D2, 0x8355, 0x50D3, 0x8356, 0x50D4, 0x8357, 0x50D5, 0x8358, 0x50D7, 0x8359, 0x50D8, 0x835A, 0x50D9, + 0x835B, 0x50DB, 0x835C, 0x50DC, 0x835D, 0x50DD, 0x835E, 0x50DE, 0x835F, 0x50DF, 0x8360, 0x50E0, 0x8361, 0x50E1, 0x8362, 0x50E2, + 0x8363, 0x50E3, 0x8364, 0x50E4, 0x8365, 0x50E5, 0x8366, 0x50E8, 0x8367, 0x50E9, 0x8368, 0x50EA, 0x8369, 0x50EB, 0x836A, 0x50EF, + 0x836B, 0x50F0, 0x836C, 0x50F1, 0x836D, 0x50F2, 0x836E, 0x50F4, 0x836F, 0x50F6, 0x8370, 0x50F7, 0x8371, 0x50F8, 0x8372, 0x50F9, + 0x8373, 0x50FA, 0x8374, 0x50FC, 0x8375, 0x50FD, 0x8376, 0x50FE, 0x8377, 0x50FF, 0x8378, 0x5100, 0x8379, 0x5101, 0x837A, 0x5102, + 0x837B, 0x5103, 0x837C, 0x5104, 0x837D, 0x5105, 0x837E, 0x5108, 0x8380, 0x5109, 0x8381, 0x510A, 0x8382, 0x510C, 0x8383, 0x510D, + 0x8384, 0x510E, 0x8385, 0x510F, 0x8386, 0x5110, 0x8387, 0x5111, 0x8388, 0x5113, 0x8389, 0x5114, 0x838A, 0x5115, 0x838B, 0x5116, + 0x838C, 0x5117, 0x838D, 0x5118, 0x838E, 0x5119, 0x838F, 0x511A, 0x8390, 0x511B, 0x8391, 0x511C, 0x8392, 0x511D, 0x8393, 0x511E, + 0x8394, 0x511F, 0x8395, 0x5120, 0x8396, 0x5122, 0x8397, 0x5123, 0x8398, 0x5124, 0x8399, 0x5125, 0x839A, 0x5126, 0x839B, 0x5127, + 0x839C, 0x5128, 0x839D, 0x5129, 0x839E, 0x512A, 0x839F, 0x512B, 0x83A0, 0x512C, 0x83A1, 0x512D, 0x83A2, 0x512E, 0x83A3, 0x512F, + 0x83A4, 0x5130, 0x83A5, 0x5131, 0x83A6, 0x5132, 0x83A7, 0x5133, 0x83A8, 0x5134, 0x83A9, 0x5135, 0x83AA, 0x5136, 0x83AB, 0x5137, + 0x83AC, 0x5138, 0x83AD, 0x5139, 0x83AE, 0x513A, 0x83AF, 0x513B, 0x83B0, 0x513C, 0x83B1, 0x513D, 0x83B2, 0x513E, 0x83B3, 0x5142, + 0x83B4, 0x5147, 0x83B5, 0x514A, 0x83B6, 0x514C, 0x83B7, 0x514E, 0x83B8, 0x514F, 0x83B9, 0x5150, 0x83BA, 0x5152, 0x83BB, 0x5153, + 0x83BC, 0x5157, 0x83BD, 0x5158, 0x83BE, 0x5159, 0x83BF, 0x515B, 0x83C0, 0x515D, 0x83C1, 0x515E, 0x83C2, 0x515F, 0x83C3, 0x5160, + 0x83C4, 0x5161, 0x83C5, 0x5163, 0x83C6, 0x5164, 0x83C7, 0x5166, 0x83C8, 0x5167, 0x83C9, 0x5169, 0x83CA, 0x516A, 0x83CB, 0x516F, + 0x83CC, 0x5172, 0x83CD, 0x517A, 0x83CE, 0x517E, 0x83CF, 0x517F, 0x83D0, 0x5183, 0x83D1, 0x5184, 0x83D2, 0x5186, 0x83D3, 0x5187, + 0x83D4, 0x518A, 0x83D5, 0x518B, 0x83D6, 0x518E, 0x83D7, 0x518F, 0x83D8, 0x5190, 0x83D9, 0x5191, 0x83DA, 0x5193, 0x83DB, 0x5194, + 0x83DC, 0x5198, 0x83DD, 0x519A, 0x83DE, 0x519D, 0x83DF, 0x519E, 0x83E0, 0x519F, 0x83E1, 0x51A1, 0x83E2, 0x51A3, 0x83E3, 0x51A6, + 0x83E4, 0x51A7, 0x83E5, 0x51A8, 0x83E6, 0x51A9, 0x83E7, 0x51AA, 0x83E8, 0x51AD, 0x83E9, 0x51AE, 0x83EA, 0x51B4, 0x83EB, 0x51B8, + 0x83EC, 0x51B9, 0x83ED, 0x51BA, 0x83EE, 0x51BE, 0x83EF, 0x51BF, 0x83F0, 0x51C1, 0x83F1, 0x51C2, 0x83F2, 0x51C3, 0x83F3, 0x51C5, + 0x83F4, 0x51C8, 0x83F5, 0x51CA, 0x83F6, 0x51CD, 0x83F7, 0x51CE, 0x83F8, 0x51D0, 0x83F9, 0x51D2, 0x83FA, 0x51D3, 0x83FB, 0x51D4, + 0x83FC, 0x51D5, 0x83FD, 0x51D6, 0x83FE, 0x51D7, 0x8440, 0x51D8, 0x8441, 0x51D9, 0x8442, 0x51DA, 0x8443, 0x51DC, 0x8444, 0x51DE, + 0x8445, 0x51DF, 0x8446, 0x51E2, 0x8447, 0x51E3, 0x8448, 0x51E5, 0x8449, 0x51E6, 0x844A, 0x51E7, 0x844B, 0x51E8, 0x844C, 0x51E9, + 0x844D, 0x51EA, 0x844E, 0x51EC, 0x844F, 0x51EE, 0x8450, 0x51F1, 0x8451, 0x51F2, 0x8452, 0x51F4, 0x8453, 0x51F7, 0x8454, 0x51FE, + 0x8455, 0x5204, 0x8456, 0x5205, 0x8457, 0x5209, 0x8458, 0x520B, 0x8459, 0x520C, 0x845A, 0x520F, 0x845B, 0x5210, 0x845C, 0x5213, + 0x845D, 0x5214, 0x845E, 0x5215, 0x845F, 0x521C, 0x8460, 0x521E, 0x8461, 0x521F, 0x8462, 0x5221, 0x8463, 0x5222, 0x8464, 0x5223, + 0x8465, 0x5225, 0x8466, 0x5226, 0x8467, 0x5227, 0x8468, 0x522A, 0x8469, 0x522C, 0x846A, 0x522F, 0x846B, 0x5231, 0x846C, 0x5232, + 0x846D, 0x5234, 0x846E, 0x5235, 0x846F, 0x523C, 0x8470, 0x523E, 0x8471, 0x5244, 0x8472, 0x5245, 0x8473, 0x5246, 0x8474, 0x5247, + 0x8475, 0x5248, 0x8476, 0x5249, 0x8477, 0x524B, 0x8478, 0x524E, 0x8479, 0x524F, 0x847A, 0x5252, 0x847B, 0x5253, 0x847C, 0x5255, + 0x847D, 0x5257, 0x847E, 0x5258, 0x8480, 0x5259, 0x8481, 0x525A, 0x8482, 0x525B, 0x8483, 0x525D, 0x8484, 0x525F, 0x8485, 0x5260, + 0x8486, 0x5262, 0x8487, 0x5263, 0x8488, 0x5264, 0x8489, 0x5266, 0x848A, 0x5268, 0x848B, 0x526B, 0x848C, 0x526C, 0x848D, 0x526D, + 0x848E, 0x526E, 0x848F, 0x5270, 0x8490, 0x5271, 0x8491, 0x5273, 0x8492, 0x5274, 0x8493, 0x5275, 0x8494, 0x5276, 0x8495, 0x5277, + 0x8496, 0x5278, 0x8497, 0x5279, 0x8498, 0x527A, 0x8499, 0x527B, 0x849A, 0x527C, 0x849B, 0x527E, 0x849C, 0x5280, 0x849D, 0x5283, + 0x849E, 0x5284, 0x849F, 0x5285, 0x84A0, 0x5286, 0x84A1, 0x5287, 0x84A2, 0x5289, 0x84A3, 0x528A, 0x84A4, 0x528B, 0x84A5, 0x528C, + 0x84A6, 0x528D, 0x84A7, 0x528E, 0x84A8, 0x528F, 0x84A9, 0x5291, 0x84AA, 0x5292, 0x84AB, 0x5294, 0x84AC, 0x5295, 0x84AD, 0x5296, + 0x84AE, 0x5297, 0x84AF, 0x5298, 0x84B0, 0x5299, 0x84B1, 0x529A, 0x84B2, 0x529C, 0x84B3, 0x52A4, 0x84B4, 0x52A5, 0x84B5, 0x52A6, + 0x84B6, 0x52A7, 0x84B7, 0x52AE, 0x84B8, 0x52AF, 0x84B9, 0x52B0, 0x84BA, 0x52B4, 0x84BB, 0x52B5, 0x84BC, 0x52B6, 0x84BD, 0x52B7, + 0x84BE, 0x52B8, 0x84BF, 0x52B9, 0x84C0, 0x52BA, 0x84C1, 0x52BB, 0x84C2, 0x52BC, 0x84C3, 0x52BD, 0x84C4, 0x52C0, 0x84C5, 0x52C1, + 0x84C6, 0x52C2, 0x84C7, 0x52C4, 0x84C8, 0x52C5, 0x84C9, 0x52C6, 0x84CA, 0x52C8, 0x84CB, 0x52CA, 0x84CC, 0x52CC, 0x84CD, 0x52CD, + 0x84CE, 0x52CE, 0x84CF, 0x52CF, 0x84D0, 0x52D1, 0x84D1, 0x52D3, 0x84D2, 0x52D4, 0x84D3, 0x52D5, 0x84D4, 0x52D7, 0x84D5, 0x52D9, + 0x84D6, 0x52DA, 0x84D7, 0x52DB, 0x84D8, 0x52DC, 0x84D9, 0x52DD, 0x84DA, 0x52DE, 0x84DB, 0x52E0, 0x84DC, 0x52E1, 0x84DD, 0x52E2, + 0x84DE, 0x52E3, 0x84DF, 0x52E5, 0x84E0, 0x52E6, 0x84E1, 0x52E7, 0x84E2, 0x52E8, 0x84E3, 0x52E9, 0x84E4, 0x52EA, 0x84E5, 0x52EB, + 0x84E6, 0x52EC, 0x84E7, 0x52ED, 0x84E8, 0x52EE, 0x84E9, 0x52EF, 0x84EA, 0x52F1, 0x84EB, 0x52F2, 0x84EC, 0x52F3, 0x84ED, 0x52F4, + 0x84EE, 0x52F5, 0x84EF, 0x52F6, 0x84F0, 0x52F7, 0x84F1, 0x52F8, 0x84F2, 0x52FB, 0x84F3, 0x52FC, 0x84F4, 0x52FD, 0x84F5, 0x5301, + 0x84F6, 0x5302, 0x84F7, 0x5303, 0x84F8, 0x5304, 0x84F9, 0x5307, 0x84FA, 0x5309, 0x84FB, 0x530A, 0x84FC, 0x530B, 0x84FD, 0x530C, + 0x84FE, 0x530E, 0x8540, 0x5311, 0x8541, 0x5312, 0x8542, 0x5313, 0x8543, 0x5314, 0x8544, 0x5318, 0x8545, 0x531B, 0x8546, 0x531C, + 0x8547, 0x531E, 0x8548, 0x531F, 0x8549, 0x5322, 0x854A, 0x5324, 0x854B, 0x5325, 0x854C, 0x5327, 0x854D, 0x5328, 0x854E, 0x5329, + 0x854F, 0x532B, 0x8550, 0x532C, 0x8551, 0x532D, 0x8552, 0x532F, 0x8553, 0x5330, 0x8554, 0x5331, 0x8555, 0x5332, 0x8556, 0x5333, + 0x8557, 0x5334, 0x8558, 0x5335, 0x8559, 0x5336, 0x855A, 0x5337, 0x855B, 0x5338, 0x855C, 0x533C, 0x855D, 0x533D, 0x855E, 0x5340, + 0x855F, 0x5342, 0x8560, 0x5344, 0x8561, 0x5346, 0x8562, 0x534B, 0x8563, 0x534C, 0x8564, 0x534D, 0x8565, 0x5350, 0x8566, 0x5354, + 0x8567, 0x5358, 0x8568, 0x5359, 0x8569, 0x535B, 0x856A, 0x535D, 0x856B, 0x5365, 0x856C, 0x5368, 0x856D, 0x536A, 0x856E, 0x536C, + 0x856F, 0x536D, 0x8570, 0x5372, 0x8571, 0x5376, 0x8572, 0x5379, 0x8573, 0x537B, 0x8574, 0x537C, 0x8575, 0x537D, 0x8576, 0x537E, + 0x8577, 0x5380, 0x8578, 0x5381, 0x8579, 0x5383, 0x857A, 0x5387, 0x857B, 0x5388, 0x857C, 0x538A, 0x857D, 0x538E, 0x857E, 0x538F, + 0x8580, 0x5390, 0x8581, 0x5391, 0x8582, 0x5392, 0x8583, 0x5393, 0x8584, 0x5394, 0x8585, 0x5396, 0x8586, 0x5397, 0x8587, 0x5399, + 0x8588, 0x539B, 0x8589, 0x539C, 0x858A, 0x539E, 0x858B, 0x53A0, 0x858C, 0x53A1, 0x858D, 0x53A4, 0x858E, 0x53A7, 0x858F, 0x53AA, + 0x8590, 0x53AB, 0x8591, 0x53AC, 0x8592, 0x53AD, 0x8593, 0x53AF, 0x8594, 0x53B0, 0x8595, 0x53B1, 0x8596, 0x53B2, 0x8597, 0x53B3, + 0x8598, 0x53B4, 0x8599, 0x53B5, 0x859A, 0x53B7, 0x859B, 0x53B8, 0x859C, 0x53B9, 0x859D, 0x53BA, 0x859E, 0x53BC, 0x859F, 0x53BD, + 0x85A0, 0x53BE, 0x85A1, 0x53C0, 0x85A2, 0x53C3, 0x85A3, 0x53C4, 0x85A4, 0x53C5, 0x85A5, 0x53C6, 0x85A6, 0x53C7, 0x85A7, 0x53CE, + 0x85A8, 0x53CF, 0x85A9, 0x53D0, 0x85AA, 0x53D2, 0x85AB, 0x53D3, 0x85AC, 0x53D5, 0x85AD, 0x53DA, 0x85AE, 0x53DC, 0x85AF, 0x53DD, + 0x85B0, 0x53DE, 0x85B1, 0x53E1, 0x85B2, 0x53E2, 0x85B3, 0x53E7, 0x85B4, 0x53F4, 0x85B5, 0x53FA, 0x85B6, 0x53FE, 0x85B7, 0x53FF, + 0x85B8, 0x5400, 0x85B9, 0x5402, 0x85BA, 0x5405, 0x85BB, 0x5407, 0x85BC, 0x540B, 0x85BD, 0x5414, 0x85BE, 0x5418, 0x85BF, 0x5419, + 0x85C0, 0x541A, 0x85C1, 0x541C, 0x85C2, 0x5422, 0x85C3, 0x5424, 0x85C4, 0x5425, 0x85C5, 0x542A, 0x85C6, 0x5430, 0x85C7, 0x5433, + 0x85C8, 0x5436, 0x85C9, 0x5437, 0x85CA, 0x543A, 0x85CB, 0x543D, 0x85CC, 0x543F, 0x85CD, 0x5441, 0x85CE, 0x5442, 0x85CF, 0x5444, + 0x85D0, 0x5445, 0x85D1, 0x5447, 0x85D2, 0x5449, 0x85D3, 0x544C, 0x85D4, 0x544D, 0x85D5, 0x544E, 0x85D6, 0x544F, 0x85D7, 0x5451, + 0x85D8, 0x545A, 0x85D9, 0x545D, 0x85DA, 0x545E, 0x85DB, 0x545F, 0x85DC, 0x5460, 0x85DD, 0x5461, 0x85DE, 0x5463, 0x85DF, 0x5465, + 0x85E0, 0x5467, 0x85E1, 0x5469, 0x85E2, 0x546A, 0x85E3, 0x546B, 0x85E4, 0x546C, 0x85E5, 0x546D, 0x85E6, 0x546E, 0x85E7, 0x546F, + 0x85E8, 0x5470, 0x85E9, 0x5474, 0x85EA, 0x5479, 0x85EB, 0x547A, 0x85EC, 0x547E, 0x85ED, 0x547F, 0x85EE, 0x5481, 0x85EF, 0x5483, + 0x85F0, 0x5485, 0x85F1, 0x5487, 0x85F2, 0x5488, 0x85F3, 0x5489, 0x85F4, 0x548A, 0x85F5, 0x548D, 0x85F6, 0x5491, 0x85F7, 0x5493, + 0x85F8, 0x5497, 0x85F9, 0x5498, 0x85FA, 0x549C, 0x85FB, 0x549E, 0x85FC, 0x549F, 0x85FD, 0x54A0, 0x85FE, 0x54A1, 0x8640, 0x54A2, + 0x8641, 0x54A5, 0x8642, 0x54AE, 0x8643, 0x54B0, 0x8644, 0x54B2, 0x8645, 0x54B5, 0x8646, 0x54B6, 0x8647, 0x54B7, 0x8648, 0x54B9, + 0x8649, 0x54BA, 0x864A, 0x54BC, 0x864B, 0x54BE, 0x864C, 0x54C3, 0x864D, 0x54C5, 0x864E, 0x54CA, 0x864F, 0x54CB, 0x8650, 0x54D6, + 0x8651, 0x54D8, 0x8652, 0x54DB, 0x8653, 0x54E0, 0x8654, 0x54E1, 0x8655, 0x54E2, 0x8656, 0x54E3, 0x8657, 0x54E4, 0x8658, 0x54EB, + 0x8659, 0x54EC, 0x865A, 0x54EF, 0x865B, 0x54F0, 0x865C, 0x54F1, 0x865D, 0x54F4, 0x865E, 0x54F5, 0x865F, 0x54F6, 0x8660, 0x54F7, + 0x8661, 0x54F8, 0x8662, 0x54F9, 0x8663, 0x54FB, 0x8664, 0x54FE, 0x8665, 0x5500, 0x8666, 0x5502, 0x8667, 0x5503, 0x8668, 0x5504, + 0x8669, 0x5505, 0x866A, 0x5508, 0x866B, 0x550A, 0x866C, 0x550B, 0x866D, 0x550C, 0x866E, 0x550D, 0x866F, 0x550E, 0x8670, 0x5512, + 0x8671, 0x5513, 0x8672, 0x5515, 0x8673, 0x5516, 0x8674, 0x5517, 0x8675, 0x5518, 0x8676, 0x5519, 0x8677, 0x551A, 0x8678, 0x551C, + 0x8679, 0x551D, 0x867A, 0x551E, 0x867B, 0x551F, 0x867C, 0x5521, 0x867D, 0x5525, 0x867E, 0x5526, 0x8680, 0x5528, 0x8681, 0x5529, + 0x8682, 0x552B, 0x8683, 0x552D, 0x8684, 0x5532, 0x8685, 0x5534, 0x8686, 0x5535, 0x8687, 0x5536, 0x8688, 0x5538, 0x8689, 0x5539, + 0x868A, 0x553A, 0x868B, 0x553B, 0x868C, 0x553D, 0x868D, 0x5540, 0x868E, 0x5542, 0x868F, 0x5545, 0x8690, 0x5547, 0x8691, 0x5548, + 0x8692, 0x554B, 0x8693, 0x554C, 0x8694, 0x554D, 0x8695, 0x554E, 0x8696, 0x554F, 0x8697, 0x5551, 0x8698, 0x5552, 0x8699, 0x5553, + 0x869A, 0x5554, 0x869B, 0x5557, 0x869C, 0x5558, 0x869D, 0x5559, 0x869E, 0x555A, 0x869F, 0x555B, 0x86A0, 0x555D, 0x86A1, 0x555E, + 0x86A2, 0x555F, 0x86A3, 0x5560, 0x86A4, 0x5562, 0x86A5, 0x5563, 0x86A6, 0x5568, 0x86A7, 0x5569, 0x86A8, 0x556B, 0x86A9, 0x556F, + 0x86AA, 0x5570, 0x86AB, 0x5571, 0x86AC, 0x5572, 0x86AD, 0x5573, 0x86AE, 0x5574, 0x86AF, 0x5579, 0x86B0, 0x557A, 0x86B1, 0x557D, + 0x86B2, 0x557F, 0x86B3, 0x5585, 0x86B4, 0x5586, 0x86B5, 0x558C, 0x86B6, 0x558D, 0x86B7, 0x558E, 0x86B8, 0x5590, 0x86B9, 0x5592, + 0x86BA, 0x5593, 0x86BB, 0x5595, 0x86BC, 0x5596, 0x86BD, 0x5597, 0x86BE, 0x559A, 0x86BF, 0x559B, 0x86C0, 0x559E, 0x86C1, 0x55A0, + 0x86C2, 0x55A1, 0x86C3, 0x55A2, 0x86C4, 0x55A3, 0x86C5, 0x55A4, 0x86C6, 0x55A5, 0x86C7, 0x55A6, 0x86C8, 0x55A8, 0x86C9, 0x55A9, + 0x86CA, 0x55AA, 0x86CB, 0x55AB, 0x86CC, 0x55AC, 0x86CD, 0x55AD, 0x86CE, 0x55AE, 0x86CF, 0x55AF, 0x86D0, 0x55B0, 0x86D1, 0x55B2, + 0x86D2, 0x55B4, 0x86D3, 0x55B6, 0x86D4, 0x55B8, 0x86D5, 0x55BA, 0x86D6, 0x55BC, 0x86D7, 0x55BF, 0x86D8, 0x55C0, 0x86D9, 0x55C1, + 0x86DA, 0x55C2, 0x86DB, 0x55C3, 0x86DC, 0x55C6, 0x86DD, 0x55C7, 0x86DE, 0x55C8, 0x86DF, 0x55CA, 0x86E0, 0x55CB, 0x86E1, 0x55CE, + 0x86E2, 0x55CF, 0x86E3, 0x55D0, 0x86E4, 0x55D5, 0x86E5, 0x55D7, 0x86E6, 0x55D8, 0x86E7, 0x55D9, 0x86E8, 0x55DA, 0x86E9, 0x55DB, + 0x86EA, 0x55DE, 0x86EB, 0x55E0, 0x86EC, 0x55E2, 0x86ED, 0x55E7, 0x86EE, 0x55E9, 0x86EF, 0x55ED, 0x86F0, 0x55EE, 0x86F1, 0x55F0, + 0x86F2, 0x55F1, 0x86F3, 0x55F4, 0x86F4, 0x55F6, 0x86F5, 0x55F8, 0x86F6, 0x55F9, 0x86F7, 0x55FA, 0x86F8, 0x55FB, 0x86F9, 0x55FC, + 0x86FA, 0x55FF, 0x86FB, 0x5602, 0x86FC, 0x5603, 0x86FD, 0x5604, 0x86FE, 0x5605, 0x8740, 0x5606, 0x8741, 0x5607, 0x8742, 0x560A, + 0x8743, 0x560B, 0x8744, 0x560D, 0x8745, 0x5610, 0x8746, 0x5611, 0x8747, 0x5612, 0x8748, 0x5613, 0x8749, 0x5614, 0x874A, 0x5615, + 0x874B, 0x5616, 0x874C, 0x5617, 0x874D, 0x5619, 0x874E, 0x561A, 0x874F, 0x561C, 0x8750, 0x561D, 0x8751, 0x5620, 0x8752, 0x5621, + 0x8753, 0x5622, 0x8754, 0x5625, 0x8755, 0x5626, 0x8756, 0x5628, 0x8757, 0x5629, 0x8758, 0x562A, 0x8759, 0x562B, 0x875A, 0x562E, + 0x875B, 0x562F, 0x875C, 0x5630, 0x875D, 0x5633, 0x875E, 0x5635, 0x875F, 0x5637, 0x8760, 0x5638, 0x8761, 0x563A, 0x8762, 0x563C, + 0x8763, 0x563D, 0x8764, 0x563E, 0x8765, 0x5640, 0x8766, 0x5641, 0x8767, 0x5642, 0x8768, 0x5643, 0x8769, 0x5644, 0x876A, 0x5645, + 0x876B, 0x5646, 0x876C, 0x5647, 0x876D, 0x5648, 0x876E, 0x5649, 0x876F, 0x564A, 0x8770, 0x564B, 0x8771, 0x564F, 0x8772, 0x5650, + 0x8773, 0x5651, 0x8774, 0x5652, 0x8775, 0x5653, 0x8776, 0x5655, 0x8777, 0x5656, 0x8778, 0x565A, 0x8779, 0x565B, 0x877A, 0x565D, + 0x877B, 0x565E, 0x877C, 0x565F, 0x877D, 0x5660, 0x877E, 0x5661, 0x8780, 0x5663, 0x8781, 0x5665, 0x8782, 0x5666, 0x8783, 0x5667, + 0x8784, 0x566D, 0x8785, 0x566E, 0x8786, 0x566F, 0x8787, 0x5670, 0x8788, 0x5672, 0x8789, 0x5673, 0x878A, 0x5674, 0x878B, 0x5675, + 0x878C, 0x5677, 0x878D, 0x5678, 0x878E, 0x5679, 0x878F, 0x567A, 0x8790, 0x567D, 0x8791, 0x567E, 0x8792, 0x567F, 0x8793, 0x5680, + 0x8794, 0x5681, 0x8795, 0x5682, 0x8796, 0x5683, 0x8797, 0x5684, 0x8798, 0x5687, 0x8799, 0x5688, 0x879A, 0x5689, 0x879B, 0x568A, + 0x879C, 0x568B, 0x879D, 0x568C, 0x879E, 0x568D, 0x879F, 0x5690, 0x87A0, 0x5691, 0x87A1, 0x5692, 0x87A2, 0x5694, 0x87A3, 0x5695, + 0x87A4, 0x5696, 0x87A5, 0x5697, 0x87A6, 0x5698, 0x87A7, 0x5699, 0x87A8, 0x569A, 0x87A9, 0x569B, 0x87AA, 0x569C, 0x87AB, 0x569D, + 0x87AC, 0x569E, 0x87AD, 0x569F, 0x87AE, 0x56A0, 0x87AF, 0x56A1, 0x87B0, 0x56A2, 0x87B1, 0x56A4, 0x87B2, 0x56A5, 0x87B3, 0x56A6, + 0x87B4, 0x56A7, 0x87B5, 0x56A8, 0x87B6, 0x56A9, 0x87B7, 0x56AA, 0x87B8, 0x56AB, 0x87B9, 0x56AC, 0x87BA, 0x56AD, 0x87BB, 0x56AE, + 0x87BC, 0x56B0, 0x87BD, 0x56B1, 0x87BE, 0x56B2, 0x87BF, 0x56B3, 0x87C0, 0x56B4, 0x87C1, 0x56B5, 0x87C2, 0x56B6, 0x87C3, 0x56B8, + 0x87C4, 0x56B9, 0x87C5, 0x56BA, 0x87C6, 0x56BB, 0x87C7, 0x56BD, 0x87C8, 0x56BE, 0x87C9, 0x56BF, 0x87CA, 0x56C0, 0x87CB, 0x56C1, + 0x87CC, 0x56C2, 0x87CD, 0x56C3, 0x87CE, 0x56C4, 0x87CF, 0x56C5, 0x87D0, 0x56C6, 0x87D1, 0x56C7, 0x87D2, 0x56C8, 0x87D3, 0x56C9, + 0x87D4, 0x56CB, 0x87D5, 0x56CC, 0x87D6, 0x56CD, 0x87D7, 0x56CE, 0x87D8, 0x56CF, 0x87D9, 0x56D0, 0x87DA, 0x56D1, 0x87DB, 0x56D2, + 0x87DC, 0x56D3, 0x87DD, 0x56D5, 0x87DE, 0x56D6, 0x87DF, 0x56D8, 0x87E0, 0x56D9, 0x87E1, 0x56DC, 0x87E2, 0x56E3, 0x87E3, 0x56E5, + 0x87E4, 0x56E6, 0x87E5, 0x56E7, 0x87E6, 0x56E8, 0x87E7, 0x56E9, 0x87E8, 0x56EA, 0x87E9, 0x56EC, 0x87EA, 0x56EE, 0x87EB, 0x56EF, + 0x87EC, 0x56F2, 0x87ED, 0x56F3, 0x87EE, 0x56F6, 0x87EF, 0x56F7, 0x87F0, 0x56F8, 0x87F1, 0x56FB, 0x87F2, 0x56FC, 0x87F3, 0x5700, + 0x87F4, 0x5701, 0x87F5, 0x5702, 0x87F6, 0x5705, 0x87F7, 0x5707, 0x87F8, 0x570B, 0x87F9, 0x570C, 0x87FA, 0x570D, 0x87FB, 0x570E, + 0x87FC, 0x570F, 0x87FD, 0x5710, 0x87FE, 0x5711, 0x8840, 0x5712, 0x8841, 0x5713, 0x8842, 0x5714, 0x8843, 0x5715, 0x8844, 0x5716, + 0x8845, 0x5717, 0x8846, 0x5718, 0x8847, 0x5719, 0x8848, 0x571A, 0x8849, 0x571B, 0x884A, 0x571D, 0x884B, 0x571E, 0x884C, 0x5720, + 0x884D, 0x5721, 0x884E, 0x5722, 0x884F, 0x5724, 0x8850, 0x5725, 0x8851, 0x5726, 0x8852, 0x5727, 0x8853, 0x572B, 0x8854, 0x5731, + 0x8855, 0x5732, 0x8856, 0x5734, 0x8857, 0x5735, 0x8858, 0x5736, 0x8859, 0x5737, 0x885A, 0x5738, 0x885B, 0x573C, 0x885C, 0x573D, + 0x885D, 0x573F, 0x885E, 0x5741, 0x885F, 0x5743, 0x8860, 0x5744, 0x8861, 0x5745, 0x8862, 0x5746, 0x8863, 0x5748, 0x8864, 0x5749, + 0x8865, 0x574B, 0x8866, 0x5752, 0x8867, 0x5753, 0x8868, 0x5754, 0x8869, 0x5755, 0x886A, 0x5756, 0x886B, 0x5758, 0x886C, 0x5759, + 0x886D, 0x5762, 0x886E, 0x5763, 0x886F, 0x5765, 0x8870, 0x5767, 0x8871, 0x576C, 0x8872, 0x576E, 0x8873, 0x5770, 0x8874, 0x5771, + 0x8875, 0x5772, 0x8876, 0x5774, 0x8877, 0x5775, 0x8878, 0x5778, 0x8879, 0x5779, 0x887A, 0x577A, 0x887B, 0x577D, 0x887C, 0x577E, + 0x887D, 0x577F, 0x887E, 0x5780, 0x8880, 0x5781, 0x8881, 0x5787, 0x8882, 0x5788, 0x8883, 0x5789, 0x8884, 0x578A, 0x8885, 0x578D, + 0x8886, 0x578E, 0x8887, 0x578F, 0x8888, 0x5790, 0x8889, 0x5791, 0x888A, 0x5794, 0x888B, 0x5795, 0x888C, 0x5796, 0x888D, 0x5797, + 0x888E, 0x5798, 0x888F, 0x5799, 0x8890, 0x579A, 0x8891, 0x579C, 0x8892, 0x579D, 0x8893, 0x579E, 0x8894, 0x579F, 0x8895, 0x57A5, + 0x8896, 0x57A8, 0x8897, 0x57AA, 0x8898, 0x57AC, 0x8899, 0x57AF, 0x889A, 0x57B0, 0x889B, 0x57B1, 0x889C, 0x57B3, 0x889D, 0x57B5, + 0x889E, 0x57B6, 0x889F, 0x57B7, 0x88A0, 0x57B9, 0x88A1, 0x57BA, 0x88A2, 0x57BB, 0x88A3, 0x57BC, 0x88A4, 0x57BD, 0x88A5, 0x57BE, + 0x88A6, 0x57BF, 0x88A7, 0x57C0, 0x88A8, 0x57C1, 0x88A9, 0x57C4, 0x88AA, 0x57C5, 0x88AB, 0x57C6, 0x88AC, 0x57C7, 0x88AD, 0x57C8, + 0x88AE, 0x57C9, 0x88AF, 0x57CA, 0x88B0, 0x57CC, 0x88B1, 0x57CD, 0x88B2, 0x57D0, 0x88B3, 0x57D1, 0x88B4, 0x57D3, 0x88B5, 0x57D6, + 0x88B6, 0x57D7, 0x88B7, 0x57DB, 0x88B8, 0x57DC, 0x88B9, 0x57DE, 0x88BA, 0x57E1, 0x88BB, 0x57E2, 0x88BC, 0x57E3, 0x88BD, 0x57E5, + 0x88BE, 0x57E6, 0x88BF, 0x57E7, 0x88C0, 0x57E8, 0x88C1, 0x57E9, 0x88C2, 0x57EA, 0x88C3, 0x57EB, 0x88C4, 0x57EC, 0x88C5, 0x57EE, + 0x88C6, 0x57F0, 0x88C7, 0x57F1, 0x88C8, 0x57F2, 0x88C9, 0x57F3, 0x88CA, 0x57F5, 0x88CB, 0x57F6, 0x88CC, 0x57F7, 0x88CD, 0x57FB, + 0x88CE, 0x57FC, 0x88CF, 0x57FE, 0x88D0, 0x57FF, 0x88D1, 0x5801, 0x88D2, 0x5803, 0x88D3, 0x5804, 0x88D4, 0x5805, 0x88D5, 0x5808, + 0x88D6, 0x5809, 0x88D7, 0x580A, 0x88D8, 0x580C, 0x88D9, 0x580E, 0x88DA, 0x580F, 0x88DB, 0x5810, 0x88DC, 0x5812, 0x88DD, 0x5813, + 0x88DE, 0x5814, 0x88DF, 0x5816, 0x88E0, 0x5817, 0x88E1, 0x5818, 0x88E2, 0x581A, 0x88E3, 0x581B, 0x88E4, 0x581C, 0x88E5, 0x581D, + 0x88E6, 0x581F, 0x88E7, 0x5822, 0x88E8, 0x5823, 0x88E9, 0x5825, 0x88EA, 0x5826, 0x88EB, 0x5827, 0x88EC, 0x5828, 0x88ED, 0x5829, + 0x88EE, 0x582B, 0x88EF, 0x582C, 0x88F0, 0x582D, 0x88F1, 0x582E, 0x88F2, 0x582F, 0x88F3, 0x5831, 0x88F4, 0x5832, 0x88F5, 0x5833, + 0x88F6, 0x5834, 0x88F7, 0x5836, 0x88F8, 0x5837, 0x88F9, 0x5838, 0x88FA, 0x5839, 0x88FB, 0x583A, 0x88FC, 0x583B, 0x88FD, 0x583C, + 0x88FE, 0x583D, 0x8940, 0x583E, 0x8941, 0x583F, 0x8942, 0x5840, 0x8943, 0x5841, 0x8944, 0x5842, 0x8945, 0x5843, 0x8946, 0x5845, + 0x8947, 0x5846, 0x8948, 0x5847, 0x8949, 0x5848, 0x894A, 0x5849, 0x894B, 0x584A, 0x894C, 0x584B, 0x894D, 0x584E, 0x894E, 0x584F, + 0x894F, 0x5850, 0x8950, 0x5852, 0x8951, 0x5853, 0x8952, 0x5855, 0x8953, 0x5856, 0x8954, 0x5857, 0x8955, 0x5859, 0x8956, 0x585A, + 0x8957, 0x585B, 0x8958, 0x585C, 0x8959, 0x585D, 0x895A, 0x585F, 0x895B, 0x5860, 0x895C, 0x5861, 0x895D, 0x5862, 0x895E, 0x5863, + 0x895F, 0x5864, 0x8960, 0x5866, 0x8961, 0x5867, 0x8962, 0x5868, 0x8963, 0x5869, 0x8964, 0x586A, 0x8965, 0x586D, 0x8966, 0x586E, + 0x8967, 0x586F, 0x8968, 0x5870, 0x8969, 0x5871, 0x896A, 0x5872, 0x896B, 0x5873, 0x896C, 0x5874, 0x896D, 0x5875, 0x896E, 0x5876, + 0x896F, 0x5877, 0x8970, 0x5878, 0x8971, 0x5879, 0x8972, 0x587A, 0x8973, 0x587B, 0x8974, 0x587C, 0x8975, 0x587D, 0x8976, 0x587F, + 0x8977, 0x5882, 0x8978, 0x5884, 0x8979, 0x5886, 0x897A, 0x5887, 0x897B, 0x5888, 0x897C, 0x588A, 0x897D, 0x588B, 0x897E, 0x588C, + 0x8980, 0x588D, 0x8981, 0x588E, 0x8982, 0x588F, 0x8983, 0x5890, 0x8984, 0x5891, 0x8985, 0x5894, 0x8986, 0x5895, 0x8987, 0x5896, + 0x8988, 0x5897, 0x8989, 0x5898, 0x898A, 0x589B, 0x898B, 0x589C, 0x898C, 0x589D, 0x898D, 0x58A0, 0x898E, 0x58A1, 0x898F, 0x58A2, + 0x8990, 0x58A3, 0x8991, 0x58A4, 0x8992, 0x58A5, 0x8993, 0x58A6, 0x8994, 0x58A7, 0x8995, 0x58AA, 0x8996, 0x58AB, 0x8997, 0x58AC, + 0x8998, 0x58AD, 0x8999, 0x58AE, 0x899A, 0x58AF, 0x899B, 0x58B0, 0x899C, 0x58B1, 0x899D, 0x58B2, 0x899E, 0x58B3, 0x899F, 0x58B4, + 0x89A0, 0x58B5, 0x89A1, 0x58B6, 0x89A2, 0x58B7, 0x89A3, 0x58B8, 0x89A4, 0x58B9, 0x89A5, 0x58BA, 0x89A6, 0x58BB, 0x89A7, 0x58BD, + 0x89A8, 0x58BE, 0x89A9, 0x58BF, 0x89AA, 0x58C0, 0x89AB, 0x58C2, 0x89AC, 0x58C3, 0x89AD, 0x58C4, 0x89AE, 0x58C6, 0x89AF, 0x58C7, + 0x89B0, 0x58C8, 0x89B1, 0x58C9, 0x89B2, 0x58CA, 0x89B3, 0x58CB, 0x89B4, 0x58CC, 0x89B5, 0x58CD, 0x89B6, 0x58CE, 0x89B7, 0x58CF, + 0x89B8, 0x58D0, 0x89B9, 0x58D2, 0x89BA, 0x58D3, 0x89BB, 0x58D4, 0x89BC, 0x58D6, 0x89BD, 0x58D7, 0x89BE, 0x58D8, 0x89BF, 0x58D9, + 0x89C0, 0x58DA, 0x89C1, 0x58DB, 0x89C2, 0x58DC, 0x89C3, 0x58DD, 0x89C4, 0x58DE, 0x89C5, 0x58DF, 0x89C6, 0x58E0, 0x89C7, 0x58E1, + 0x89C8, 0x58E2, 0x89C9, 0x58E3, 0x89CA, 0x58E5, 0x89CB, 0x58E6, 0x89CC, 0x58E7, 0x89CD, 0x58E8, 0x89CE, 0x58E9, 0x89CF, 0x58EA, + 0x89D0, 0x58ED, 0x89D1, 0x58EF, 0x89D2, 0x58F1, 0x89D3, 0x58F2, 0x89D4, 0x58F4, 0x89D5, 0x58F5, 0x89D6, 0x58F7, 0x89D7, 0x58F8, + 0x89D8, 0x58FA, 0x89D9, 0x58FB, 0x89DA, 0x58FC, 0x89DB, 0x58FD, 0x89DC, 0x58FE, 0x89DD, 0x58FF, 0x89DE, 0x5900, 0x89DF, 0x5901, + 0x89E0, 0x5903, 0x89E1, 0x5905, 0x89E2, 0x5906, 0x89E3, 0x5908, 0x89E4, 0x5909, 0x89E5, 0x590A, 0x89E6, 0x590B, 0x89E7, 0x590C, + 0x89E8, 0x590E, 0x89E9, 0x5910, 0x89EA, 0x5911, 0x89EB, 0x5912, 0x89EC, 0x5913, 0x89ED, 0x5917, 0x89EE, 0x5918, 0x89EF, 0x591B, + 0x89F0, 0x591D, 0x89F1, 0x591E, 0x89F2, 0x5920, 0x89F3, 0x5921, 0x89F4, 0x5922, 0x89F5, 0x5923, 0x89F6, 0x5926, 0x89F7, 0x5928, + 0x89F8, 0x592C, 0x89F9, 0x5930, 0x89FA, 0x5932, 0x89FB, 0x5933, 0x89FC, 0x5935, 0x89FD, 0x5936, 0x89FE, 0x593B, 0x8A40, 0x593D, + 0x8A41, 0x593E, 0x8A42, 0x593F, 0x8A43, 0x5940, 0x8A44, 0x5943, 0x8A45, 0x5945, 0x8A46, 0x5946, 0x8A47, 0x594A, 0x8A48, 0x594C, + 0x8A49, 0x594D, 0x8A4A, 0x5950, 0x8A4B, 0x5952, 0x8A4C, 0x5953, 0x8A4D, 0x5959, 0x8A4E, 0x595B, 0x8A4F, 0x595C, 0x8A50, 0x595D, + 0x8A51, 0x595E, 0x8A52, 0x595F, 0x8A53, 0x5961, 0x8A54, 0x5963, 0x8A55, 0x5964, 0x8A56, 0x5966, 0x8A57, 0x5967, 0x8A58, 0x5968, + 0x8A59, 0x5969, 0x8A5A, 0x596A, 0x8A5B, 0x596B, 0x8A5C, 0x596C, 0x8A5D, 0x596D, 0x8A5E, 0x596E, 0x8A5F, 0x596F, 0x8A60, 0x5970, + 0x8A61, 0x5971, 0x8A62, 0x5972, 0x8A63, 0x5975, 0x8A64, 0x5977, 0x8A65, 0x597A, 0x8A66, 0x597B, 0x8A67, 0x597C, 0x8A68, 0x597E, + 0x8A69, 0x597F, 0x8A6A, 0x5980, 0x8A6B, 0x5985, 0x8A6C, 0x5989, 0x8A6D, 0x598B, 0x8A6E, 0x598C, 0x8A6F, 0x598E, 0x8A70, 0x598F, + 0x8A71, 0x5990, 0x8A72, 0x5991, 0x8A73, 0x5994, 0x8A74, 0x5995, 0x8A75, 0x5998, 0x8A76, 0x599A, 0x8A77, 0x599B, 0x8A78, 0x599C, + 0x8A79, 0x599D, 0x8A7A, 0x599F, 0x8A7B, 0x59A0, 0x8A7C, 0x59A1, 0x8A7D, 0x59A2, 0x8A7E, 0x59A6, 0x8A80, 0x59A7, 0x8A81, 0x59AC, + 0x8A82, 0x59AD, 0x8A83, 0x59B0, 0x8A84, 0x59B1, 0x8A85, 0x59B3, 0x8A86, 0x59B4, 0x8A87, 0x59B5, 0x8A88, 0x59B6, 0x8A89, 0x59B7, + 0x8A8A, 0x59B8, 0x8A8B, 0x59BA, 0x8A8C, 0x59BC, 0x8A8D, 0x59BD, 0x8A8E, 0x59BF, 0x8A8F, 0x59C0, 0x8A90, 0x59C1, 0x8A91, 0x59C2, + 0x8A92, 0x59C3, 0x8A93, 0x59C4, 0x8A94, 0x59C5, 0x8A95, 0x59C7, 0x8A96, 0x59C8, 0x8A97, 0x59C9, 0x8A98, 0x59CC, 0x8A99, 0x59CD, + 0x8A9A, 0x59CE, 0x8A9B, 0x59CF, 0x8A9C, 0x59D5, 0x8A9D, 0x59D6, 0x8A9E, 0x59D9, 0x8A9F, 0x59DB, 0x8AA0, 0x59DE, 0x8AA1, 0x59DF, + 0x8AA2, 0x59E0, 0x8AA3, 0x59E1, 0x8AA4, 0x59E2, 0x8AA5, 0x59E4, 0x8AA6, 0x59E6, 0x8AA7, 0x59E7, 0x8AA8, 0x59E9, 0x8AA9, 0x59EA, + 0x8AAA, 0x59EB, 0x8AAB, 0x59ED, 0x8AAC, 0x59EE, 0x8AAD, 0x59EF, 0x8AAE, 0x59F0, 0x8AAF, 0x59F1, 0x8AB0, 0x59F2, 0x8AB1, 0x59F3, + 0x8AB2, 0x59F4, 0x8AB3, 0x59F5, 0x8AB4, 0x59F6, 0x8AB5, 0x59F7, 0x8AB6, 0x59F8, 0x8AB7, 0x59FA, 0x8AB8, 0x59FC, 0x8AB9, 0x59FD, + 0x8ABA, 0x59FE, 0x8ABB, 0x5A00, 0x8ABC, 0x5A02, 0x8ABD, 0x5A0A, 0x8ABE, 0x5A0B, 0x8ABF, 0x5A0D, 0x8AC0, 0x5A0E, 0x8AC1, 0x5A0F, + 0x8AC2, 0x5A10, 0x8AC3, 0x5A12, 0x8AC4, 0x5A14, 0x8AC5, 0x5A15, 0x8AC6, 0x5A16, 0x8AC7, 0x5A17, 0x8AC8, 0x5A19, 0x8AC9, 0x5A1A, + 0x8ACA, 0x5A1B, 0x8ACB, 0x5A1D, 0x8ACC, 0x5A1E, 0x8ACD, 0x5A21, 0x8ACE, 0x5A22, 0x8ACF, 0x5A24, 0x8AD0, 0x5A26, 0x8AD1, 0x5A27, + 0x8AD2, 0x5A28, 0x8AD3, 0x5A2A, 0x8AD4, 0x5A2B, 0x8AD5, 0x5A2C, 0x8AD6, 0x5A2D, 0x8AD7, 0x5A2E, 0x8AD8, 0x5A2F, 0x8AD9, 0x5A30, + 0x8ADA, 0x5A33, 0x8ADB, 0x5A35, 0x8ADC, 0x5A37, 0x8ADD, 0x5A38, 0x8ADE, 0x5A39, 0x8ADF, 0x5A3A, 0x8AE0, 0x5A3B, 0x8AE1, 0x5A3D, + 0x8AE2, 0x5A3E, 0x8AE3, 0x5A3F, 0x8AE4, 0x5A41, 0x8AE5, 0x5A42, 0x8AE6, 0x5A43, 0x8AE7, 0x5A44, 0x8AE8, 0x5A45, 0x8AE9, 0x5A47, + 0x8AEA, 0x5A48, 0x8AEB, 0x5A4B, 0x8AEC, 0x5A4C, 0x8AED, 0x5A4D, 0x8AEE, 0x5A4E, 0x8AEF, 0x5A4F, 0x8AF0, 0x5A50, 0x8AF1, 0x5A51, + 0x8AF2, 0x5A52, 0x8AF3, 0x5A53, 0x8AF4, 0x5A54, 0x8AF5, 0x5A56, 0x8AF6, 0x5A57, 0x8AF7, 0x5A58, 0x8AF8, 0x5A59, 0x8AF9, 0x5A5B, + 0x8AFA, 0x5A5C, 0x8AFB, 0x5A5D, 0x8AFC, 0x5A5E, 0x8AFD, 0x5A5F, 0x8AFE, 0x5A60, 0x8B40, 0x5A61, 0x8B41, 0x5A63, 0x8B42, 0x5A64, + 0x8B43, 0x5A65, 0x8B44, 0x5A66, 0x8B45, 0x5A68, 0x8B46, 0x5A69, 0x8B47, 0x5A6B, 0x8B48, 0x5A6C, 0x8B49, 0x5A6D, 0x8B4A, 0x5A6E, + 0x8B4B, 0x5A6F, 0x8B4C, 0x5A70, 0x8B4D, 0x5A71, 0x8B4E, 0x5A72, 0x8B4F, 0x5A73, 0x8B50, 0x5A78, 0x8B51, 0x5A79, 0x8B52, 0x5A7B, + 0x8B53, 0x5A7C, 0x8B54, 0x5A7D, 0x8B55, 0x5A7E, 0x8B56, 0x5A80, 0x8B57, 0x5A81, 0x8B58, 0x5A82, 0x8B59, 0x5A83, 0x8B5A, 0x5A84, + 0x8B5B, 0x5A85, 0x8B5C, 0x5A86, 0x8B5D, 0x5A87, 0x8B5E, 0x5A88, 0x8B5F, 0x5A89, 0x8B60, 0x5A8A, 0x8B61, 0x5A8B, 0x8B62, 0x5A8C, + 0x8B63, 0x5A8D, 0x8B64, 0x5A8E, 0x8B65, 0x5A8F, 0x8B66, 0x5A90, 0x8B67, 0x5A91, 0x8B68, 0x5A93, 0x8B69, 0x5A94, 0x8B6A, 0x5A95, + 0x8B6B, 0x5A96, 0x8B6C, 0x5A97, 0x8B6D, 0x5A98, 0x8B6E, 0x5A99, 0x8B6F, 0x5A9C, 0x8B70, 0x5A9D, 0x8B71, 0x5A9E, 0x8B72, 0x5A9F, + 0x8B73, 0x5AA0, 0x8B74, 0x5AA1, 0x8B75, 0x5AA2, 0x8B76, 0x5AA3, 0x8B77, 0x5AA4, 0x8B78, 0x5AA5, 0x8B79, 0x5AA6, 0x8B7A, 0x5AA7, + 0x8B7B, 0x5AA8, 0x8B7C, 0x5AA9, 0x8B7D, 0x5AAB, 0x8B7E, 0x5AAC, 0x8B80, 0x5AAD, 0x8B81, 0x5AAE, 0x8B82, 0x5AAF, 0x8B83, 0x5AB0, + 0x8B84, 0x5AB1, 0x8B85, 0x5AB4, 0x8B86, 0x5AB6, 0x8B87, 0x5AB7, 0x8B88, 0x5AB9, 0x8B89, 0x5ABA, 0x8B8A, 0x5ABB, 0x8B8B, 0x5ABC, + 0x8B8C, 0x5ABD, 0x8B8D, 0x5ABF, 0x8B8E, 0x5AC0, 0x8B8F, 0x5AC3, 0x8B90, 0x5AC4, 0x8B91, 0x5AC5, 0x8B92, 0x5AC6, 0x8B93, 0x5AC7, + 0x8B94, 0x5AC8, 0x8B95, 0x5ACA, 0x8B96, 0x5ACB, 0x8B97, 0x5ACD, 0x8B98, 0x5ACE, 0x8B99, 0x5ACF, 0x8B9A, 0x5AD0, 0x8B9B, 0x5AD1, + 0x8B9C, 0x5AD3, 0x8B9D, 0x5AD5, 0x8B9E, 0x5AD7, 0x8B9F, 0x5AD9, 0x8BA0, 0x5ADA, 0x8BA1, 0x5ADB, 0x8BA2, 0x5ADD, 0x8BA3, 0x5ADE, + 0x8BA4, 0x5ADF, 0x8BA5, 0x5AE2, 0x8BA6, 0x5AE4, 0x8BA7, 0x5AE5, 0x8BA8, 0x5AE7, 0x8BA9, 0x5AE8, 0x8BAA, 0x5AEA, 0x8BAB, 0x5AEC, + 0x8BAC, 0x5AED, 0x8BAD, 0x5AEE, 0x8BAE, 0x5AEF, 0x8BAF, 0x5AF0, 0x8BB0, 0x5AF2, 0x8BB1, 0x5AF3, 0x8BB2, 0x5AF4, 0x8BB3, 0x5AF5, + 0x8BB4, 0x5AF6, 0x8BB5, 0x5AF7, 0x8BB6, 0x5AF8, 0x8BB7, 0x5AF9, 0x8BB8, 0x5AFA, 0x8BB9, 0x5AFB, 0x8BBA, 0x5AFC, 0x8BBB, 0x5AFD, + 0x8BBC, 0x5AFE, 0x8BBD, 0x5AFF, 0x8BBE, 0x5B00, 0x8BBF, 0x5B01, 0x8BC0, 0x5B02, 0x8BC1, 0x5B03, 0x8BC2, 0x5B04, 0x8BC3, 0x5B05, + 0x8BC4, 0x5B06, 0x8BC5, 0x5B07, 0x8BC6, 0x5B08, 0x8BC7, 0x5B0A, 0x8BC8, 0x5B0B, 0x8BC9, 0x5B0C, 0x8BCA, 0x5B0D, 0x8BCB, 0x5B0E, + 0x8BCC, 0x5B0F, 0x8BCD, 0x5B10, 0x8BCE, 0x5B11, 0x8BCF, 0x5B12, 0x8BD0, 0x5B13, 0x8BD1, 0x5B14, 0x8BD2, 0x5B15, 0x8BD3, 0x5B18, + 0x8BD4, 0x5B19, 0x8BD5, 0x5B1A, 0x8BD6, 0x5B1B, 0x8BD7, 0x5B1C, 0x8BD8, 0x5B1D, 0x8BD9, 0x5B1E, 0x8BDA, 0x5B1F, 0x8BDB, 0x5B20, + 0x8BDC, 0x5B21, 0x8BDD, 0x5B22, 0x8BDE, 0x5B23, 0x8BDF, 0x5B24, 0x8BE0, 0x5B25, 0x8BE1, 0x5B26, 0x8BE2, 0x5B27, 0x8BE3, 0x5B28, + 0x8BE4, 0x5B29, 0x8BE5, 0x5B2A, 0x8BE6, 0x5B2B, 0x8BE7, 0x5B2C, 0x8BE8, 0x5B2D, 0x8BE9, 0x5B2E, 0x8BEA, 0x5B2F, 0x8BEB, 0x5B30, + 0x8BEC, 0x5B31, 0x8BED, 0x5B33, 0x8BEE, 0x5B35, 0x8BEF, 0x5B36, 0x8BF0, 0x5B38, 0x8BF1, 0x5B39, 0x8BF2, 0x5B3A, 0x8BF3, 0x5B3B, + 0x8BF4, 0x5B3C, 0x8BF5, 0x5B3D, 0x8BF6, 0x5B3E, 0x8BF7, 0x5B3F, 0x8BF8, 0x5B41, 0x8BF9, 0x5B42, 0x8BFA, 0x5B43, 0x8BFB, 0x5B44, + 0x8BFC, 0x5B45, 0x8BFD, 0x5B46, 0x8BFE, 0x5B47, 0x8C40, 0x5B48, 0x8C41, 0x5B49, 0x8C42, 0x5B4A, 0x8C43, 0x5B4B, 0x8C44, 0x5B4C, + 0x8C45, 0x5B4D, 0x8C46, 0x5B4E, 0x8C47, 0x5B4F, 0x8C48, 0x5B52, 0x8C49, 0x5B56, 0x8C4A, 0x5B5E, 0x8C4B, 0x5B60, 0x8C4C, 0x5B61, + 0x8C4D, 0x5B67, 0x8C4E, 0x5B68, 0x8C4F, 0x5B6B, 0x8C50, 0x5B6D, 0x8C51, 0x5B6E, 0x8C52, 0x5B6F, 0x8C53, 0x5B72, 0x8C54, 0x5B74, + 0x8C55, 0x5B76, 0x8C56, 0x5B77, 0x8C57, 0x5B78, 0x8C58, 0x5B79, 0x8C59, 0x5B7B, 0x8C5A, 0x5B7C, 0x8C5B, 0x5B7E, 0x8C5C, 0x5B7F, + 0x8C5D, 0x5B82, 0x8C5E, 0x5B86, 0x8C5F, 0x5B8A, 0x8C60, 0x5B8D, 0x8C61, 0x5B8E, 0x8C62, 0x5B90, 0x8C63, 0x5B91, 0x8C64, 0x5B92, + 0x8C65, 0x5B94, 0x8C66, 0x5B96, 0x8C67, 0x5B9F, 0x8C68, 0x5BA7, 0x8C69, 0x5BA8, 0x8C6A, 0x5BA9, 0x8C6B, 0x5BAC, 0x8C6C, 0x5BAD, + 0x8C6D, 0x5BAE, 0x8C6E, 0x5BAF, 0x8C6F, 0x5BB1, 0x8C70, 0x5BB2, 0x8C71, 0x5BB7, 0x8C72, 0x5BBA, 0x8C73, 0x5BBB, 0x8C74, 0x5BBC, + 0x8C75, 0x5BC0, 0x8C76, 0x5BC1, 0x8C77, 0x5BC3, 0x8C78, 0x5BC8, 0x8C79, 0x5BC9, 0x8C7A, 0x5BCA, 0x8C7B, 0x5BCB, 0x8C7C, 0x5BCD, + 0x8C7D, 0x5BCE, 0x8C7E, 0x5BCF, 0x8C80, 0x5BD1, 0x8C81, 0x5BD4, 0x8C82, 0x5BD5, 0x8C83, 0x5BD6, 0x8C84, 0x5BD7, 0x8C85, 0x5BD8, + 0x8C86, 0x5BD9, 0x8C87, 0x5BDA, 0x8C88, 0x5BDB, 0x8C89, 0x5BDC, 0x8C8A, 0x5BE0, 0x8C8B, 0x5BE2, 0x8C8C, 0x5BE3, 0x8C8D, 0x5BE6, + 0x8C8E, 0x5BE7, 0x8C8F, 0x5BE9, 0x8C90, 0x5BEA, 0x8C91, 0x5BEB, 0x8C92, 0x5BEC, 0x8C93, 0x5BED, 0x8C94, 0x5BEF, 0x8C95, 0x5BF1, + 0x8C96, 0x5BF2, 0x8C97, 0x5BF3, 0x8C98, 0x5BF4, 0x8C99, 0x5BF5, 0x8C9A, 0x5BF6, 0x8C9B, 0x5BF7, 0x8C9C, 0x5BFD, 0x8C9D, 0x5BFE, + 0x8C9E, 0x5C00, 0x8C9F, 0x5C02, 0x8CA0, 0x5C03, 0x8CA1, 0x5C05, 0x8CA2, 0x5C07, 0x8CA3, 0x5C08, 0x8CA4, 0x5C0B, 0x8CA5, 0x5C0C, + 0x8CA6, 0x5C0D, 0x8CA7, 0x5C0E, 0x8CA8, 0x5C10, 0x8CA9, 0x5C12, 0x8CAA, 0x5C13, 0x8CAB, 0x5C17, 0x8CAC, 0x5C19, 0x8CAD, 0x5C1B, + 0x8CAE, 0x5C1E, 0x8CAF, 0x5C1F, 0x8CB0, 0x5C20, 0x8CB1, 0x5C21, 0x8CB2, 0x5C23, 0x8CB3, 0x5C26, 0x8CB4, 0x5C28, 0x8CB5, 0x5C29, + 0x8CB6, 0x5C2A, 0x8CB7, 0x5C2B, 0x8CB8, 0x5C2D, 0x8CB9, 0x5C2E, 0x8CBA, 0x5C2F, 0x8CBB, 0x5C30, 0x8CBC, 0x5C32, 0x8CBD, 0x5C33, + 0x8CBE, 0x5C35, 0x8CBF, 0x5C36, 0x8CC0, 0x5C37, 0x8CC1, 0x5C43, 0x8CC2, 0x5C44, 0x8CC3, 0x5C46, 0x8CC4, 0x5C47, 0x8CC5, 0x5C4C, + 0x8CC6, 0x5C4D, 0x8CC7, 0x5C52, 0x8CC8, 0x5C53, 0x8CC9, 0x5C54, 0x8CCA, 0x5C56, 0x8CCB, 0x5C57, 0x8CCC, 0x5C58, 0x8CCD, 0x5C5A, + 0x8CCE, 0x5C5B, 0x8CCF, 0x5C5C, 0x8CD0, 0x5C5D, 0x8CD1, 0x5C5F, 0x8CD2, 0x5C62, 0x8CD3, 0x5C64, 0x8CD4, 0x5C67, 0x8CD5, 0x5C68, + 0x8CD6, 0x5C69, 0x8CD7, 0x5C6A, 0x8CD8, 0x5C6B, 0x8CD9, 0x5C6C, 0x8CDA, 0x5C6D, 0x8CDB, 0x5C70, 0x8CDC, 0x5C72, 0x8CDD, 0x5C73, + 0x8CDE, 0x5C74, 0x8CDF, 0x5C75, 0x8CE0, 0x5C76, 0x8CE1, 0x5C77, 0x8CE2, 0x5C78, 0x8CE3, 0x5C7B, 0x8CE4, 0x5C7C, 0x8CE5, 0x5C7D, + 0x8CE6, 0x5C7E, 0x8CE7, 0x5C80, 0x8CE8, 0x5C83, 0x8CE9, 0x5C84, 0x8CEA, 0x5C85, 0x8CEB, 0x5C86, 0x8CEC, 0x5C87, 0x8CED, 0x5C89, + 0x8CEE, 0x5C8A, 0x8CEF, 0x5C8B, 0x8CF0, 0x5C8E, 0x8CF1, 0x5C8F, 0x8CF2, 0x5C92, 0x8CF3, 0x5C93, 0x8CF4, 0x5C95, 0x8CF5, 0x5C9D, + 0x8CF6, 0x5C9E, 0x8CF7, 0x5C9F, 0x8CF8, 0x5CA0, 0x8CF9, 0x5CA1, 0x8CFA, 0x5CA4, 0x8CFB, 0x5CA5, 0x8CFC, 0x5CA6, 0x8CFD, 0x5CA7, + 0x8CFE, 0x5CA8, 0x8D40, 0x5CAA, 0x8D41, 0x5CAE, 0x8D42, 0x5CAF, 0x8D43, 0x5CB0, 0x8D44, 0x5CB2, 0x8D45, 0x5CB4, 0x8D46, 0x5CB6, + 0x8D47, 0x5CB9, 0x8D48, 0x5CBA, 0x8D49, 0x5CBB, 0x8D4A, 0x5CBC, 0x8D4B, 0x5CBE, 0x8D4C, 0x5CC0, 0x8D4D, 0x5CC2, 0x8D4E, 0x5CC3, + 0x8D4F, 0x5CC5, 0x8D50, 0x5CC6, 0x8D51, 0x5CC7, 0x8D52, 0x5CC8, 0x8D53, 0x5CC9, 0x8D54, 0x5CCA, 0x8D55, 0x5CCC, 0x8D56, 0x5CCD, + 0x8D57, 0x5CCE, 0x8D58, 0x5CCF, 0x8D59, 0x5CD0, 0x8D5A, 0x5CD1, 0x8D5B, 0x5CD3, 0x8D5C, 0x5CD4, 0x8D5D, 0x5CD5, 0x8D5E, 0x5CD6, + 0x8D5F, 0x5CD7, 0x8D60, 0x5CD8, 0x8D61, 0x5CDA, 0x8D62, 0x5CDB, 0x8D63, 0x5CDC, 0x8D64, 0x5CDD, 0x8D65, 0x5CDE, 0x8D66, 0x5CDF, + 0x8D67, 0x5CE0, 0x8D68, 0x5CE2, 0x8D69, 0x5CE3, 0x8D6A, 0x5CE7, 0x8D6B, 0x5CE9, 0x8D6C, 0x5CEB, 0x8D6D, 0x5CEC, 0x8D6E, 0x5CEE, + 0x8D6F, 0x5CEF, 0x8D70, 0x5CF1, 0x8D71, 0x5CF2, 0x8D72, 0x5CF3, 0x8D73, 0x5CF4, 0x8D74, 0x5CF5, 0x8D75, 0x5CF6, 0x8D76, 0x5CF7, + 0x8D77, 0x5CF8, 0x8D78, 0x5CF9, 0x8D79, 0x5CFA, 0x8D7A, 0x5CFC, 0x8D7B, 0x5CFD, 0x8D7C, 0x5CFE, 0x8D7D, 0x5CFF, 0x8D7E, 0x5D00, + 0x8D80, 0x5D01, 0x8D81, 0x5D04, 0x8D82, 0x5D05, 0x8D83, 0x5D08, 0x8D84, 0x5D09, 0x8D85, 0x5D0A, 0x8D86, 0x5D0B, 0x8D87, 0x5D0C, + 0x8D88, 0x5D0D, 0x8D89, 0x5D0F, 0x8D8A, 0x5D10, 0x8D8B, 0x5D11, 0x8D8C, 0x5D12, 0x8D8D, 0x5D13, 0x8D8E, 0x5D15, 0x8D8F, 0x5D17, + 0x8D90, 0x5D18, 0x8D91, 0x5D19, 0x8D92, 0x5D1A, 0x8D93, 0x5D1C, 0x8D94, 0x5D1D, 0x8D95, 0x5D1F, 0x8D96, 0x5D20, 0x8D97, 0x5D21, + 0x8D98, 0x5D22, 0x8D99, 0x5D23, 0x8D9A, 0x5D25, 0x8D9B, 0x5D28, 0x8D9C, 0x5D2A, 0x8D9D, 0x5D2B, 0x8D9E, 0x5D2C, 0x8D9F, 0x5D2F, + 0x8DA0, 0x5D30, 0x8DA1, 0x5D31, 0x8DA2, 0x5D32, 0x8DA3, 0x5D33, 0x8DA4, 0x5D35, 0x8DA5, 0x5D36, 0x8DA6, 0x5D37, 0x8DA7, 0x5D38, + 0x8DA8, 0x5D39, 0x8DA9, 0x5D3A, 0x8DAA, 0x5D3B, 0x8DAB, 0x5D3C, 0x8DAC, 0x5D3F, 0x8DAD, 0x5D40, 0x8DAE, 0x5D41, 0x8DAF, 0x5D42, + 0x8DB0, 0x5D43, 0x8DB1, 0x5D44, 0x8DB2, 0x5D45, 0x8DB3, 0x5D46, 0x8DB4, 0x5D48, 0x8DB5, 0x5D49, 0x8DB6, 0x5D4D, 0x8DB7, 0x5D4E, + 0x8DB8, 0x5D4F, 0x8DB9, 0x5D50, 0x8DBA, 0x5D51, 0x8DBB, 0x5D52, 0x8DBC, 0x5D53, 0x8DBD, 0x5D54, 0x8DBE, 0x5D55, 0x8DBF, 0x5D56, + 0x8DC0, 0x5D57, 0x8DC1, 0x5D59, 0x8DC2, 0x5D5A, 0x8DC3, 0x5D5C, 0x8DC4, 0x5D5E, 0x8DC5, 0x5D5F, 0x8DC6, 0x5D60, 0x8DC7, 0x5D61, + 0x8DC8, 0x5D62, 0x8DC9, 0x5D63, 0x8DCA, 0x5D64, 0x8DCB, 0x5D65, 0x8DCC, 0x5D66, 0x8DCD, 0x5D67, 0x8DCE, 0x5D68, 0x8DCF, 0x5D6A, + 0x8DD0, 0x5D6D, 0x8DD1, 0x5D6E, 0x8DD2, 0x5D70, 0x8DD3, 0x5D71, 0x8DD4, 0x5D72, 0x8DD5, 0x5D73, 0x8DD6, 0x5D75, 0x8DD7, 0x5D76, + 0x8DD8, 0x5D77, 0x8DD9, 0x5D78, 0x8DDA, 0x5D79, 0x8DDB, 0x5D7A, 0x8DDC, 0x5D7B, 0x8DDD, 0x5D7C, 0x8DDE, 0x5D7D, 0x8DDF, 0x5D7E, + 0x8DE0, 0x5D7F, 0x8DE1, 0x5D80, 0x8DE2, 0x5D81, 0x8DE3, 0x5D83, 0x8DE4, 0x5D84, 0x8DE5, 0x5D85, 0x8DE6, 0x5D86, 0x8DE7, 0x5D87, + 0x8DE8, 0x5D88, 0x8DE9, 0x5D89, 0x8DEA, 0x5D8A, 0x8DEB, 0x5D8B, 0x8DEC, 0x5D8C, 0x8DED, 0x5D8D, 0x8DEE, 0x5D8E, 0x8DEF, 0x5D8F, + 0x8DF0, 0x5D90, 0x8DF1, 0x5D91, 0x8DF2, 0x5D92, 0x8DF3, 0x5D93, 0x8DF4, 0x5D94, 0x8DF5, 0x5D95, 0x8DF6, 0x5D96, 0x8DF7, 0x5D97, + 0x8DF8, 0x5D98, 0x8DF9, 0x5D9A, 0x8DFA, 0x5D9B, 0x8DFB, 0x5D9C, 0x8DFC, 0x5D9E, 0x8DFD, 0x5D9F, 0x8DFE, 0x5DA0, 0x8E40, 0x5DA1, + 0x8E41, 0x5DA2, 0x8E42, 0x5DA3, 0x8E43, 0x5DA4, 0x8E44, 0x5DA5, 0x8E45, 0x5DA6, 0x8E46, 0x5DA7, 0x8E47, 0x5DA8, 0x8E48, 0x5DA9, + 0x8E49, 0x5DAA, 0x8E4A, 0x5DAB, 0x8E4B, 0x5DAC, 0x8E4C, 0x5DAD, 0x8E4D, 0x5DAE, 0x8E4E, 0x5DAF, 0x8E4F, 0x5DB0, 0x8E50, 0x5DB1, + 0x8E51, 0x5DB2, 0x8E52, 0x5DB3, 0x8E53, 0x5DB4, 0x8E54, 0x5DB5, 0x8E55, 0x5DB6, 0x8E56, 0x5DB8, 0x8E57, 0x5DB9, 0x8E58, 0x5DBA, + 0x8E59, 0x5DBB, 0x8E5A, 0x5DBC, 0x8E5B, 0x5DBD, 0x8E5C, 0x5DBE, 0x8E5D, 0x5DBF, 0x8E5E, 0x5DC0, 0x8E5F, 0x5DC1, 0x8E60, 0x5DC2, + 0x8E61, 0x5DC3, 0x8E62, 0x5DC4, 0x8E63, 0x5DC6, 0x8E64, 0x5DC7, 0x8E65, 0x5DC8, 0x8E66, 0x5DC9, 0x8E67, 0x5DCA, 0x8E68, 0x5DCB, + 0x8E69, 0x5DCC, 0x8E6A, 0x5DCE, 0x8E6B, 0x5DCF, 0x8E6C, 0x5DD0, 0x8E6D, 0x5DD1, 0x8E6E, 0x5DD2, 0x8E6F, 0x5DD3, 0x8E70, 0x5DD4, + 0x8E71, 0x5DD5, 0x8E72, 0x5DD6, 0x8E73, 0x5DD7, 0x8E74, 0x5DD8, 0x8E75, 0x5DD9, 0x8E76, 0x5DDA, 0x8E77, 0x5DDC, 0x8E78, 0x5DDF, + 0x8E79, 0x5DE0, 0x8E7A, 0x5DE3, 0x8E7B, 0x5DE4, 0x8E7C, 0x5DEA, 0x8E7D, 0x5DEC, 0x8E7E, 0x5DED, 0x8E80, 0x5DF0, 0x8E81, 0x5DF5, + 0x8E82, 0x5DF6, 0x8E83, 0x5DF8, 0x8E84, 0x5DF9, 0x8E85, 0x5DFA, 0x8E86, 0x5DFB, 0x8E87, 0x5DFC, 0x8E88, 0x5DFF, 0x8E89, 0x5E00, + 0x8E8A, 0x5E04, 0x8E8B, 0x5E07, 0x8E8C, 0x5E09, 0x8E8D, 0x5E0A, 0x8E8E, 0x5E0B, 0x8E8F, 0x5E0D, 0x8E90, 0x5E0E, 0x8E91, 0x5E12, + 0x8E92, 0x5E13, 0x8E93, 0x5E17, 0x8E94, 0x5E1E, 0x8E95, 0x5E1F, 0x8E96, 0x5E20, 0x8E97, 0x5E21, 0x8E98, 0x5E22, 0x8E99, 0x5E23, + 0x8E9A, 0x5E24, 0x8E9B, 0x5E25, 0x8E9C, 0x5E28, 0x8E9D, 0x5E29, 0x8E9E, 0x5E2A, 0x8E9F, 0x5E2B, 0x8EA0, 0x5E2C, 0x8EA1, 0x5E2F, + 0x8EA2, 0x5E30, 0x8EA3, 0x5E32, 0x8EA4, 0x5E33, 0x8EA5, 0x5E34, 0x8EA6, 0x5E35, 0x8EA7, 0x5E36, 0x8EA8, 0x5E39, 0x8EA9, 0x5E3A, + 0x8EAA, 0x5E3E, 0x8EAB, 0x5E3F, 0x8EAC, 0x5E40, 0x8EAD, 0x5E41, 0x8EAE, 0x5E43, 0x8EAF, 0x5E46, 0x8EB0, 0x5E47, 0x8EB1, 0x5E48, + 0x8EB2, 0x5E49, 0x8EB3, 0x5E4A, 0x8EB4, 0x5E4B, 0x8EB5, 0x5E4D, 0x8EB6, 0x5E4E, 0x8EB7, 0x5E4F, 0x8EB8, 0x5E50, 0x8EB9, 0x5E51, + 0x8EBA, 0x5E52, 0x8EBB, 0x5E53, 0x8EBC, 0x5E56, 0x8EBD, 0x5E57, 0x8EBE, 0x5E58, 0x8EBF, 0x5E59, 0x8EC0, 0x5E5A, 0x8EC1, 0x5E5C, + 0x8EC2, 0x5E5D, 0x8EC3, 0x5E5F, 0x8EC4, 0x5E60, 0x8EC5, 0x5E63, 0x8EC6, 0x5E64, 0x8EC7, 0x5E65, 0x8EC8, 0x5E66, 0x8EC9, 0x5E67, + 0x8ECA, 0x5E68, 0x8ECB, 0x5E69, 0x8ECC, 0x5E6A, 0x8ECD, 0x5E6B, 0x8ECE, 0x5E6C, 0x8ECF, 0x5E6D, 0x8ED0, 0x5E6E, 0x8ED1, 0x5E6F, + 0x8ED2, 0x5E70, 0x8ED3, 0x5E71, 0x8ED4, 0x5E75, 0x8ED5, 0x5E77, 0x8ED6, 0x5E79, 0x8ED7, 0x5E7E, 0x8ED8, 0x5E81, 0x8ED9, 0x5E82, + 0x8EDA, 0x5E83, 0x8EDB, 0x5E85, 0x8EDC, 0x5E88, 0x8EDD, 0x5E89, 0x8EDE, 0x5E8C, 0x8EDF, 0x5E8D, 0x8EE0, 0x5E8E, 0x8EE1, 0x5E92, + 0x8EE2, 0x5E98, 0x8EE3, 0x5E9B, 0x8EE4, 0x5E9D, 0x8EE5, 0x5EA1, 0x8EE6, 0x5EA2, 0x8EE7, 0x5EA3, 0x8EE8, 0x5EA4, 0x8EE9, 0x5EA8, + 0x8EEA, 0x5EA9, 0x8EEB, 0x5EAA, 0x8EEC, 0x5EAB, 0x8EED, 0x5EAC, 0x8EEE, 0x5EAE, 0x8EEF, 0x5EAF, 0x8EF0, 0x5EB0, 0x8EF1, 0x5EB1, + 0x8EF2, 0x5EB2, 0x8EF3, 0x5EB4, 0x8EF4, 0x5EBA, 0x8EF5, 0x5EBB, 0x8EF6, 0x5EBC, 0x8EF7, 0x5EBD, 0x8EF8, 0x5EBF, 0x8EF9, 0x5EC0, + 0x8EFA, 0x5EC1, 0x8EFB, 0x5EC2, 0x8EFC, 0x5EC3, 0x8EFD, 0x5EC4, 0x8EFE, 0x5EC5, 0x8F40, 0x5EC6, 0x8F41, 0x5EC7, 0x8F42, 0x5EC8, + 0x8F43, 0x5ECB, 0x8F44, 0x5ECC, 0x8F45, 0x5ECD, 0x8F46, 0x5ECE, 0x8F47, 0x5ECF, 0x8F48, 0x5ED0, 0x8F49, 0x5ED4, 0x8F4A, 0x5ED5, + 0x8F4B, 0x5ED7, 0x8F4C, 0x5ED8, 0x8F4D, 0x5ED9, 0x8F4E, 0x5EDA, 0x8F4F, 0x5EDC, 0x8F50, 0x5EDD, 0x8F51, 0x5EDE, 0x8F52, 0x5EDF, + 0x8F53, 0x5EE0, 0x8F54, 0x5EE1, 0x8F55, 0x5EE2, 0x8F56, 0x5EE3, 0x8F57, 0x5EE4, 0x8F58, 0x5EE5, 0x8F59, 0x5EE6, 0x8F5A, 0x5EE7, + 0x8F5B, 0x5EE9, 0x8F5C, 0x5EEB, 0x8F5D, 0x5EEC, 0x8F5E, 0x5EED, 0x8F5F, 0x5EEE, 0x8F60, 0x5EEF, 0x8F61, 0x5EF0, 0x8F62, 0x5EF1, + 0x8F63, 0x5EF2, 0x8F64, 0x5EF3, 0x8F65, 0x5EF5, 0x8F66, 0x5EF8, 0x8F67, 0x5EF9, 0x8F68, 0x5EFB, 0x8F69, 0x5EFC, 0x8F6A, 0x5EFD, + 0x8F6B, 0x5F05, 0x8F6C, 0x5F06, 0x8F6D, 0x5F07, 0x8F6E, 0x5F09, 0x8F6F, 0x5F0C, 0x8F70, 0x5F0D, 0x8F71, 0x5F0E, 0x8F72, 0x5F10, + 0x8F73, 0x5F12, 0x8F74, 0x5F14, 0x8F75, 0x5F16, 0x8F76, 0x5F19, 0x8F77, 0x5F1A, 0x8F78, 0x5F1C, 0x8F79, 0x5F1D, 0x8F7A, 0x5F1E, + 0x8F7B, 0x5F21, 0x8F7C, 0x5F22, 0x8F7D, 0x5F23, 0x8F7E, 0x5F24, 0x8F80, 0x5F28, 0x8F81, 0x5F2B, 0x8F82, 0x5F2C, 0x8F83, 0x5F2E, + 0x8F84, 0x5F30, 0x8F85, 0x5F32, 0x8F86, 0x5F33, 0x8F87, 0x5F34, 0x8F88, 0x5F35, 0x8F89, 0x5F36, 0x8F8A, 0x5F37, 0x8F8B, 0x5F38, + 0x8F8C, 0x5F3B, 0x8F8D, 0x5F3D, 0x8F8E, 0x5F3E, 0x8F8F, 0x5F3F, 0x8F90, 0x5F41, 0x8F91, 0x5F42, 0x8F92, 0x5F43, 0x8F93, 0x5F44, + 0x8F94, 0x5F45, 0x8F95, 0x5F46, 0x8F96, 0x5F47, 0x8F97, 0x5F48, 0x8F98, 0x5F49, 0x8F99, 0x5F4A, 0x8F9A, 0x5F4B, 0x8F9B, 0x5F4C, + 0x8F9C, 0x5F4D, 0x8F9D, 0x5F4E, 0x8F9E, 0x5F4F, 0x8F9F, 0x5F51, 0x8FA0, 0x5F54, 0x8FA1, 0x5F59, 0x8FA2, 0x5F5A, 0x8FA3, 0x5F5B, + 0x8FA4, 0x5F5C, 0x8FA5, 0x5F5E, 0x8FA6, 0x5F5F, 0x8FA7, 0x5F60, 0x8FA8, 0x5F63, 0x8FA9, 0x5F65, 0x8FAA, 0x5F67, 0x8FAB, 0x5F68, + 0x8FAC, 0x5F6B, 0x8FAD, 0x5F6E, 0x8FAE, 0x5F6F, 0x8FAF, 0x5F72, 0x8FB0, 0x5F74, 0x8FB1, 0x5F75, 0x8FB2, 0x5F76, 0x8FB3, 0x5F78, + 0x8FB4, 0x5F7A, 0x8FB5, 0x5F7D, 0x8FB6, 0x5F7E, 0x8FB7, 0x5F7F, 0x8FB8, 0x5F83, 0x8FB9, 0x5F86, 0x8FBA, 0x5F8D, 0x8FBB, 0x5F8E, + 0x8FBC, 0x5F8F, 0x8FBD, 0x5F91, 0x8FBE, 0x5F93, 0x8FBF, 0x5F94, 0x8FC0, 0x5F96, 0x8FC1, 0x5F9A, 0x8FC2, 0x5F9B, 0x8FC3, 0x5F9D, + 0x8FC4, 0x5F9E, 0x8FC5, 0x5F9F, 0x8FC6, 0x5FA0, 0x8FC7, 0x5FA2, 0x8FC8, 0x5FA3, 0x8FC9, 0x5FA4, 0x8FCA, 0x5FA5, 0x8FCB, 0x5FA6, + 0x8FCC, 0x5FA7, 0x8FCD, 0x5FA9, 0x8FCE, 0x5FAB, 0x8FCF, 0x5FAC, 0x8FD0, 0x5FAF, 0x8FD1, 0x5FB0, 0x8FD2, 0x5FB1, 0x8FD3, 0x5FB2, + 0x8FD4, 0x5FB3, 0x8FD5, 0x5FB4, 0x8FD6, 0x5FB6, 0x8FD7, 0x5FB8, 0x8FD8, 0x5FB9, 0x8FD9, 0x5FBA, 0x8FDA, 0x5FBB, 0x8FDB, 0x5FBE, + 0x8FDC, 0x5FBF, 0x8FDD, 0x5FC0, 0x8FDE, 0x5FC1, 0x8FDF, 0x5FC2, 0x8FE0, 0x5FC7, 0x8FE1, 0x5FC8, 0x8FE2, 0x5FCA, 0x8FE3, 0x5FCB, + 0x8FE4, 0x5FCE, 0x8FE5, 0x5FD3, 0x8FE6, 0x5FD4, 0x8FE7, 0x5FD5, 0x8FE8, 0x5FDA, 0x8FE9, 0x5FDB, 0x8FEA, 0x5FDC, 0x8FEB, 0x5FDE, + 0x8FEC, 0x5FDF, 0x8FED, 0x5FE2, 0x8FEE, 0x5FE3, 0x8FEF, 0x5FE5, 0x8FF0, 0x5FE6, 0x8FF1, 0x5FE8, 0x8FF2, 0x5FE9, 0x8FF3, 0x5FEC, + 0x8FF4, 0x5FEF, 0x8FF5, 0x5FF0, 0x8FF6, 0x5FF2, 0x8FF7, 0x5FF3, 0x8FF8, 0x5FF4, 0x8FF9, 0x5FF6, 0x8FFA, 0x5FF7, 0x8FFB, 0x5FF9, + 0x8FFC, 0x5FFA, 0x8FFD, 0x5FFC, 0x8FFE, 0x6007, 0x9040, 0x6008, 0x9041, 0x6009, 0x9042, 0x600B, 0x9043, 0x600C, 0x9044, 0x6010, + 0x9045, 0x6011, 0x9046, 0x6013, 0x9047, 0x6017, 0x9048, 0x6018, 0x9049, 0x601A, 0x904A, 0x601E, 0x904B, 0x601F, 0x904C, 0x6022, + 0x904D, 0x6023, 0x904E, 0x6024, 0x904F, 0x602C, 0x9050, 0x602D, 0x9051, 0x602E, 0x9052, 0x6030, 0x9053, 0x6031, 0x9054, 0x6032, + 0x9055, 0x6033, 0x9056, 0x6034, 0x9057, 0x6036, 0x9058, 0x6037, 0x9059, 0x6038, 0x905A, 0x6039, 0x905B, 0x603A, 0x905C, 0x603D, + 0x905D, 0x603E, 0x905E, 0x6040, 0x905F, 0x6044, 0x9060, 0x6045, 0x9061, 0x6046, 0x9062, 0x6047, 0x9063, 0x6048, 0x9064, 0x6049, + 0x9065, 0x604A, 0x9066, 0x604C, 0x9067, 0x604E, 0x9068, 0x604F, 0x9069, 0x6051, 0x906A, 0x6053, 0x906B, 0x6054, 0x906C, 0x6056, + 0x906D, 0x6057, 0x906E, 0x6058, 0x906F, 0x605B, 0x9070, 0x605C, 0x9071, 0x605E, 0x9072, 0x605F, 0x9073, 0x6060, 0x9074, 0x6061, + 0x9075, 0x6065, 0x9076, 0x6066, 0x9077, 0x606E, 0x9078, 0x6071, 0x9079, 0x6072, 0x907A, 0x6074, 0x907B, 0x6075, 0x907C, 0x6077, + 0x907D, 0x607E, 0x907E, 0x6080, 0x9080, 0x6081, 0x9081, 0x6082, 0x9082, 0x6085, 0x9083, 0x6086, 0x9084, 0x6087, 0x9085, 0x6088, + 0x9086, 0x608A, 0x9087, 0x608B, 0x9088, 0x608E, 0x9089, 0x608F, 0x908A, 0x6090, 0x908B, 0x6091, 0x908C, 0x6093, 0x908D, 0x6095, + 0x908E, 0x6097, 0x908F, 0x6098, 0x9090, 0x6099, 0x9091, 0x609C, 0x9092, 0x609E, 0x9093, 0x60A1, 0x9094, 0x60A2, 0x9095, 0x60A4, + 0x9096, 0x60A5, 0x9097, 0x60A7, 0x9098, 0x60A9, 0x9099, 0x60AA, 0x909A, 0x60AE, 0x909B, 0x60B0, 0x909C, 0x60B3, 0x909D, 0x60B5, + 0x909E, 0x60B6, 0x909F, 0x60B7, 0x90A0, 0x60B9, 0x90A1, 0x60BA, 0x90A2, 0x60BD, 0x90A3, 0x60BE, 0x90A4, 0x60BF, 0x90A5, 0x60C0, + 0x90A6, 0x60C1, 0x90A7, 0x60C2, 0x90A8, 0x60C3, 0x90A9, 0x60C4, 0x90AA, 0x60C7, 0x90AB, 0x60C8, 0x90AC, 0x60C9, 0x90AD, 0x60CC, + 0x90AE, 0x60CD, 0x90AF, 0x60CE, 0x90B0, 0x60CF, 0x90B1, 0x60D0, 0x90B2, 0x60D2, 0x90B3, 0x60D3, 0x90B4, 0x60D4, 0x90B5, 0x60D6, + 0x90B6, 0x60D7, 0x90B7, 0x60D9, 0x90B8, 0x60DB, 0x90B9, 0x60DE, 0x90BA, 0x60E1, 0x90BB, 0x60E2, 0x90BC, 0x60E3, 0x90BD, 0x60E4, + 0x90BE, 0x60E5, 0x90BF, 0x60EA, 0x90C0, 0x60F1, 0x90C1, 0x60F2, 0x90C2, 0x60F5, 0x90C3, 0x60F7, 0x90C4, 0x60F8, 0x90C5, 0x60FB, + 0x90C6, 0x60FC, 0x90C7, 0x60FD, 0x90C8, 0x60FE, 0x90C9, 0x60FF, 0x90CA, 0x6102, 0x90CB, 0x6103, 0x90CC, 0x6104, 0x90CD, 0x6105, + 0x90CE, 0x6107, 0x90CF, 0x610A, 0x90D0, 0x610B, 0x90D1, 0x610C, 0x90D2, 0x6110, 0x90D3, 0x6111, 0x90D4, 0x6112, 0x90D5, 0x6113, + 0x90D6, 0x6114, 0x90D7, 0x6116, 0x90D8, 0x6117, 0x90D9, 0x6118, 0x90DA, 0x6119, 0x90DB, 0x611B, 0x90DC, 0x611C, 0x90DD, 0x611D, + 0x90DE, 0x611E, 0x90DF, 0x6121, 0x90E0, 0x6122, 0x90E1, 0x6125, 0x90E2, 0x6128, 0x90E3, 0x6129, 0x90E4, 0x612A, 0x90E5, 0x612C, + 0x90E6, 0x612D, 0x90E7, 0x612E, 0x90E8, 0x612F, 0x90E9, 0x6130, 0x90EA, 0x6131, 0x90EB, 0x6132, 0x90EC, 0x6133, 0x90ED, 0x6134, + 0x90EE, 0x6135, 0x90EF, 0x6136, 0x90F0, 0x6137, 0x90F1, 0x6138, 0x90F2, 0x6139, 0x90F3, 0x613A, 0x90F4, 0x613B, 0x90F5, 0x613C, + 0x90F6, 0x613D, 0x90F7, 0x613E, 0x90F8, 0x6140, 0x90F9, 0x6141, 0x90FA, 0x6142, 0x90FB, 0x6143, 0x90FC, 0x6144, 0x90FD, 0x6145, + 0x90FE, 0x6146, 0x9140, 0x6147, 0x9141, 0x6149, 0x9142, 0x614B, 0x9143, 0x614D, 0x9144, 0x614F, 0x9145, 0x6150, 0x9146, 0x6152, + 0x9147, 0x6153, 0x9148, 0x6154, 0x9149, 0x6156, 0x914A, 0x6157, 0x914B, 0x6158, 0x914C, 0x6159, 0x914D, 0x615A, 0x914E, 0x615B, + 0x914F, 0x615C, 0x9150, 0x615E, 0x9151, 0x615F, 0x9152, 0x6160, 0x9153, 0x6161, 0x9154, 0x6163, 0x9155, 0x6164, 0x9156, 0x6165, + 0x9157, 0x6166, 0x9158, 0x6169, 0x9159, 0x616A, 0x915A, 0x616B, 0x915B, 0x616C, 0x915C, 0x616D, 0x915D, 0x616E, 0x915E, 0x616F, + 0x915F, 0x6171, 0x9160, 0x6172, 0x9161, 0x6173, 0x9162, 0x6174, 0x9163, 0x6176, 0x9164, 0x6178, 0x9165, 0x6179, 0x9166, 0x617A, + 0x9167, 0x617B, 0x9168, 0x617C, 0x9169, 0x617D, 0x916A, 0x617E, 0x916B, 0x617F, 0x916C, 0x6180, 0x916D, 0x6181, 0x916E, 0x6182, + 0x916F, 0x6183, 0x9170, 0x6184, 0x9171, 0x6185, 0x9172, 0x6186, 0x9173, 0x6187, 0x9174, 0x6188, 0x9175, 0x6189, 0x9176, 0x618A, + 0x9177, 0x618C, 0x9178, 0x618D, 0x9179, 0x618F, 0x917A, 0x6190, 0x917B, 0x6191, 0x917C, 0x6192, 0x917D, 0x6193, 0x917E, 0x6195, + 0x9180, 0x6196, 0x9181, 0x6197, 0x9182, 0x6198, 0x9183, 0x6199, 0x9184, 0x619A, 0x9185, 0x619B, 0x9186, 0x619C, 0x9187, 0x619E, + 0x9188, 0x619F, 0x9189, 0x61A0, 0x918A, 0x61A1, 0x918B, 0x61A2, 0x918C, 0x61A3, 0x918D, 0x61A4, 0x918E, 0x61A5, 0x918F, 0x61A6, + 0x9190, 0x61AA, 0x9191, 0x61AB, 0x9192, 0x61AD, 0x9193, 0x61AE, 0x9194, 0x61AF, 0x9195, 0x61B0, 0x9196, 0x61B1, 0x9197, 0x61B2, + 0x9198, 0x61B3, 0x9199, 0x61B4, 0x919A, 0x61B5, 0x919B, 0x61B6, 0x919C, 0x61B8, 0x919D, 0x61B9, 0x919E, 0x61BA, 0x919F, 0x61BB, + 0x91A0, 0x61BC, 0x91A1, 0x61BD, 0x91A2, 0x61BF, 0x91A3, 0x61C0, 0x91A4, 0x61C1, 0x91A5, 0x61C3, 0x91A6, 0x61C4, 0x91A7, 0x61C5, + 0x91A8, 0x61C6, 0x91A9, 0x61C7, 0x91AA, 0x61C9, 0x91AB, 0x61CC, 0x91AC, 0x61CD, 0x91AD, 0x61CE, 0x91AE, 0x61CF, 0x91AF, 0x61D0, + 0x91B0, 0x61D3, 0x91B1, 0x61D5, 0x91B2, 0x61D6, 0x91B3, 0x61D7, 0x91B4, 0x61D8, 0x91B5, 0x61D9, 0x91B6, 0x61DA, 0x91B7, 0x61DB, + 0x91B8, 0x61DC, 0x91B9, 0x61DD, 0x91BA, 0x61DE, 0x91BB, 0x61DF, 0x91BC, 0x61E0, 0x91BD, 0x61E1, 0x91BE, 0x61E2, 0x91BF, 0x61E3, + 0x91C0, 0x61E4, 0x91C1, 0x61E5, 0x91C2, 0x61E7, 0x91C3, 0x61E8, 0x91C4, 0x61E9, 0x91C5, 0x61EA, 0x91C6, 0x61EB, 0x91C7, 0x61EC, + 0x91C8, 0x61ED, 0x91C9, 0x61EE, 0x91CA, 0x61EF, 0x91CB, 0x61F0, 0x91CC, 0x61F1, 0x91CD, 0x61F2, 0x91CE, 0x61F3, 0x91CF, 0x61F4, + 0x91D0, 0x61F6, 0x91D1, 0x61F7, 0x91D2, 0x61F8, 0x91D3, 0x61F9, 0x91D4, 0x61FA, 0x91D5, 0x61FB, 0x91D6, 0x61FC, 0x91D7, 0x61FD, + 0x91D8, 0x61FE, 0x91D9, 0x6200, 0x91DA, 0x6201, 0x91DB, 0x6202, 0x91DC, 0x6203, 0x91DD, 0x6204, 0x91DE, 0x6205, 0x91DF, 0x6207, + 0x91E0, 0x6209, 0x91E1, 0x6213, 0x91E2, 0x6214, 0x91E3, 0x6219, 0x91E4, 0x621C, 0x91E5, 0x621D, 0x91E6, 0x621E, 0x91E7, 0x6220, + 0x91E8, 0x6223, 0x91E9, 0x6226, 0x91EA, 0x6227, 0x91EB, 0x6228, 0x91EC, 0x6229, 0x91ED, 0x622B, 0x91EE, 0x622D, 0x91EF, 0x622F, + 0x91F0, 0x6230, 0x91F1, 0x6231, 0x91F2, 0x6232, 0x91F3, 0x6235, 0x91F4, 0x6236, 0x91F5, 0x6238, 0x91F6, 0x6239, 0x91F7, 0x623A, + 0x91F8, 0x623B, 0x91F9, 0x623C, 0x91FA, 0x6242, 0x91FB, 0x6244, 0x91FC, 0x6245, 0x91FD, 0x6246, 0x91FE, 0x624A, 0x9240, 0x624F, + 0x9241, 0x6250, 0x9242, 0x6255, 0x9243, 0x6256, 0x9244, 0x6257, 0x9245, 0x6259, 0x9246, 0x625A, 0x9247, 0x625C, 0x9248, 0x625D, + 0x9249, 0x625E, 0x924A, 0x625F, 0x924B, 0x6260, 0x924C, 0x6261, 0x924D, 0x6262, 0x924E, 0x6264, 0x924F, 0x6265, 0x9250, 0x6268, + 0x9251, 0x6271, 0x9252, 0x6272, 0x9253, 0x6274, 0x9254, 0x6275, 0x9255, 0x6277, 0x9256, 0x6278, 0x9257, 0x627A, 0x9258, 0x627B, + 0x9259, 0x627D, 0x925A, 0x6281, 0x925B, 0x6282, 0x925C, 0x6283, 0x925D, 0x6285, 0x925E, 0x6286, 0x925F, 0x6287, 0x9260, 0x6288, + 0x9261, 0x628B, 0x9262, 0x628C, 0x9263, 0x628D, 0x9264, 0x628E, 0x9265, 0x628F, 0x9266, 0x6290, 0x9267, 0x6294, 0x9268, 0x6299, + 0x9269, 0x629C, 0x926A, 0x629D, 0x926B, 0x629E, 0x926C, 0x62A3, 0x926D, 0x62A6, 0x926E, 0x62A7, 0x926F, 0x62A9, 0x9270, 0x62AA, + 0x9271, 0x62AD, 0x9272, 0x62AE, 0x9273, 0x62AF, 0x9274, 0x62B0, 0x9275, 0x62B2, 0x9276, 0x62B3, 0x9277, 0x62B4, 0x9278, 0x62B6, + 0x9279, 0x62B7, 0x927A, 0x62B8, 0x927B, 0x62BA, 0x927C, 0x62BE, 0x927D, 0x62C0, 0x927E, 0x62C1, 0x9280, 0x62C3, 0x9281, 0x62CB, + 0x9282, 0x62CF, 0x9283, 0x62D1, 0x9284, 0x62D5, 0x9285, 0x62DD, 0x9286, 0x62DE, 0x9287, 0x62E0, 0x9288, 0x62E1, 0x9289, 0x62E4, + 0x928A, 0x62EA, 0x928B, 0x62EB, 0x928C, 0x62F0, 0x928D, 0x62F2, 0x928E, 0x62F5, 0x928F, 0x62F8, 0x9290, 0x62F9, 0x9291, 0x62FA, + 0x9292, 0x62FB, 0x9293, 0x6300, 0x9294, 0x6303, 0x9295, 0x6304, 0x9296, 0x6305, 0x9297, 0x6306, 0x9298, 0x630A, 0x9299, 0x630B, + 0x929A, 0x630C, 0x929B, 0x630D, 0x929C, 0x630F, 0x929D, 0x6310, 0x929E, 0x6312, 0x929F, 0x6313, 0x92A0, 0x6314, 0x92A1, 0x6315, + 0x92A2, 0x6317, 0x92A3, 0x6318, 0x92A4, 0x6319, 0x92A5, 0x631C, 0x92A6, 0x6326, 0x92A7, 0x6327, 0x92A8, 0x6329, 0x92A9, 0x632C, + 0x92AA, 0x632D, 0x92AB, 0x632E, 0x92AC, 0x6330, 0x92AD, 0x6331, 0x92AE, 0x6333, 0x92AF, 0x6334, 0x92B0, 0x6335, 0x92B1, 0x6336, + 0x92B2, 0x6337, 0x92B3, 0x6338, 0x92B4, 0x633B, 0x92B5, 0x633C, 0x92B6, 0x633E, 0x92B7, 0x633F, 0x92B8, 0x6340, 0x92B9, 0x6341, + 0x92BA, 0x6344, 0x92BB, 0x6347, 0x92BC, 0x6348, 0x92BD, 0x634A, 0x92BE, 0x6351, 0x92BF, 0x6352, 0x92C0, 0x6353, 0x92C1, 0x6354, + 0x92C2, 0x6356, 0x92C3, 0x6357, 0x92C4, 0x6358, 0x92C5, 0x6359, 0x92C6, 0x635A, 0x92C7, 0x635B, 0x92C8, 0x635C, 0x92C9, 0x635D, + 0x92CA, 0x6360, 0x92CB, 0x6364, 0x92CC, 0x6365, 0x92CD, 0x6366, 0x92CE, 0x6368, 0x92CF, 0x636A, 0x92D0, 0x636B, 0x92D1, 0x636C, + 0x92D2, 0x636F, 0x92D3, 0x6370, 0x92D4, 0x6372, 0x92D5, 0x6373, 0x92D6, 0x6374, 0x92D7, 0x6375, 0x92D8, 0x6378, 0x92D9, 0x6379, + 0x92DA, 0x637C, 0x92DB, 0x637D, 0x92DC, 0x637E, 0x92DD, 0x637F, 0x92DE, 0x6381, 0x92DF, 0x6383, 0x92E0, 0x6384, 0x92E1, 0x6385, + 0x92E2, 0x6386, 0x92E3, 0x638B, 0x92E4, 0x638D, 0x92E5, 0x6391, 0x92E6, 0x6393, 0x92E7, 0x6394, 0x92E8, 0x6395, 0x92E9, 0x6397, + 0x92EA, 0x6399, 0x92EB, 0x639A, 0x92EC, 0x639B, 0x92ED, 0x639C, 0x92EE, 0x639D, 0x92EF, 0x639E, 0x92F0, 0x639F, 0x92F1, 0x63A1, + 0x92F2, 0x63A4, 0x92F3, 0x63A6, 0x92F4, 0x63AB, 0x92F5, 0x63AF, 0x92F6, 0x63B1, 0x92F7, 0x63B2, 0x92F8, 0x63B5, 0x92F9, 0x63B6, + 0x92FA, 0x63B9, 0x92FB, 0x63BB, 0x92FC, 0x63BD, 0x92FD, 0x63BF, 0x92FE, 0x63C0, 0x9340, 0x63C1, 0x9341, 0x63C2, 0x9342, 0x63C3, + 0x9343, 0x63C5, 0x9344, 0x63C7, 0x9345, 0x63C8, 0x9346, 0x63CA, 0x9347, 0x63CB, 0x9348, 0x63CC, 0x9349, 0x63D1, 0x934A, 0x63D3, + 0x934B, 0x63D4, 0x934C, 0x63D5, 0x934D, 0x63D7, 0x934E, 0x63D8, 0x934F, 0x63D9, 0x9350, 0x63DA, 0x9351, 0x63DB, 0x9352, 0x63DC, + 0x9353, 0x63DD, 0x9354, 0x63DF, 0x9355, 0x63E2, 0x9356, 0x63E4, 0x9357, 0x63E5, 0x9358, 0x63E6, 0x9359, 0x63E7, 0x935A, 0x63E8, + 0x935B, 0x63EB, 0x935C, 0x63EC, 0x935D, 0x63EE, 0x935E, 0x63EF, 0x935F, 0x63F0, 0x9360, 0x63F1, 0x9361, 0x63F3, 0x9362, 0x63F5, + 0x9363, 0x63F7, 0x9364, 0x63F9, 0x9365, 0x63FA, 0x9366, 0x63FB, 0x9367, 0x63FC, 0x9368, 0x63FE, 0x9369, 0x6403, 0x936A, 0x6404, + 0x936B, 0x6406, 0x936C, 0x6407, 0x936D, 0x6408, 0x936E, 0x6409, 0x936F, 0x640A, 0x9370, 0x640D, 0x9371, 0x640E, 0x9372, 0x6411, + 0x9373, 0x6412, 0x9374, 0x6415, 0x9375, 0x6416, 0x9376, 0x6417, 0x9377, 0x6418, 0x9378, 0x6419, 0x9379, 0x641A, 0x937A, 0x641D, + 0x937B, 0x641F, 0x937C, 0x6422, 0x937D, 0x6423, 0x937E, 0x6424, 0x9380, 0x6425, 0x9381, 0x6427, 0x9382, 0x6428, 0x9383, 0x6429, + 0x9384, 0x642B, 0x9385, 0x642E, 0x9386, 0x642F, 0x9387, 0x6430, 0x9388, 0x6431, 0x9389, 0x6432, 0x938A, 0x6433, 0x938B, 0x6435, + 0x938C, 0x6436, 0x938D, 0x6437, 0x938E, 0x6438, 0x938F, 0x6439, 0x9390, 0x643B, 0x9391, 0x643C, 0x9392, 0x643E, 0x9393, 0x6440, + 0x9394, 0x6442, 0x9395, 0x6443, 0x9396, 0x6449, 0x9397, 0x644B, 0x9398, 0x644C, 0x9399, 0x644D, 0x939A, 0x644E, 0x939B, 0x644F, + 0x939C, 0x6450, 0x939D, 0x6451, 0x939E, 0x6453, 0x939F, 0x6455, 0x93A0, 0x6456, 0x93A1, 0x6457, 0x93A2, 0x6459, 0x93A3, 0x645A, + 0x93A4, 0x645B, 0x93A5, 0x645C, 0x93A6, 0x645D, 0x93A7, 0x645F, 0x93A8, 0x6460, 0x93A9, 0x6461, 0x93AA, 0x6462, 0x93AB, 0x6463, + 0x93AC, 0x6464, 0x93AD, 0x6465, 0x93AE, 0x6466, 0x93AF, 0x6468, 0x93B0, 0x646A, 0x93B1, 0x646B, 0x93B2, 0x646C, 0x93B3, 0x646E, + 0x93B4, 0x646F, 0x93B5, 0x6470, 0x93B6, 0x6471, 0x93B7, 0x6472, 0x93B8, 0x6473, 0x93B9, 0x6474, 0x93BA, 0x6475, 0x93BB, 0x6476, + 0x93BC, 0x6477, 0x93BD, 0x647B, 0x93BE, 0x647C, 0x93BF, 0x647D, 0x93C0, 0x647E, 0x93C1, 0x647F, 0x93C2, 0x6480, 0x93C3, 0x6481, + 0x93C4, 0x6483, 0x93C5, 0x6486, 0x93C6, 0x6488, 0x93C7, 0x6489, 0x93C8, 0x648A, 0x93C9, 0x648B, 0x93CA, 0x648C, 0x93CB, 0x648D, + 0x93CC, 0x648E, 0x93CD, 0x648F, 0x93CE, 0x6490, 0x93CF, 0x6493, 0x93D0, 0x6494, 0x93D1, 0x6497, 0x93D2, 0x6498, 0x93D3, 0x649A, + 0x93D4, 0x649B, 0x93D5, 0x649C, 0x93D6, 0x649D, 0x93D7, 0x649F, 0x93D8, 0x64A0, 0x93D9, 0x64A1, 0x93DA, 0x64A2, 0x93DB, 0x64A3, + 0x93DC, 0x64A5, 0x93DD, 0x64A6, 0x93DE, 0x64A7, 0x93DF, 0x64A8, 0x93E0, 0x64AA, 0x93E1, 0x64AB, 0x93E2, 0x64AF, 0x93E3, 0x64B1, + 0x93E4, 0x64B2, 0x93E5, 0x64B3, 0x93E6, 0x64B4, 0x93E7, 0x64B6, 0x93E8, 0x64B9, 0x93E9, 0x64BB, 0x93EA, 0x64BD, 0x93EB, 0x64BE, + 0x93EC, 0x64BF, 0x93ED, 0x64C1, 0x93EE, 0x64C3, 0x93EF, 0x64C4, 0x93F0, 0x64C6, 0x93F1, 0x64C7, 0x93F2, 0x64C8, 0x93F3, 0x64C9, + 0x93F4, 0x64CA, 0x93F5, 0x64CB, 0x93F6, 0x64CC, 0x93F7, 0x64CF, 0x93F8, 0x64D1, 0x93F9, 0x64D3, 0x93FA, 0x64D4, 0x93FB, 0x64D5, + 0x93FC, 0x64D6, 0x93FD, 0x64D9, 0x93FE, 0x64DA, 0x9440, 0x64DB, 0x9441, 0x64DC, 0x9442, 0x64DD, 0x9443, 0x64DF, 0x9444, 0x64E0, + 0x9445, 0x64E1, 0x9446, 0x64E3, 0x9447, 0x64E5, 0x9448, 0x64E7, 0x9449, 0x64E8, 0x944A, 0x64E9, 0x944B, 0x64EA, 0x944C, 0x64EB, + 0x944D, 0x64EC, 0x944E, 0x64ED, 0x944F, 0x64EE, 0x9450, 0x64EF, 0x9451, 0x64F0, 0x9452, 0x64F1, 0x9453, 0x64F2, 0x9454, 0x64F3, + 0x9455, 0x64F4, 0x9456, 0x64F5, 0x9457, 0x64F6, 0x9458, 0x64F7, 0x9459, 0x64F8, 0x945A, 0x64F9, 0x945B, 0x64FA, 0x945C, 0x64FB, + 0x945D, 0x64FC, 0x945E, 0x64FD, 0x945F, 0x64FE, 0x9460, 0x64FF, 0x9461, 0x6501, 0x9462, 0x6502, 0x9463, 0x6503, 0x9464, 0x6504, + 0x9465, 0x6505, 0x9466, 0x6506, 0x9467, 0x6507, 0x9468, 0x6508, 0x9469, 0x650A, 0x946A, 0x650B, 0x946B, 0x650C, 0x946C, 0x650D, + 0x946D, 0x650E, 0x946E, 0x650F, 0x946F, 0x6510, 0x9470, 0x6511, 0x9471, 0x6513, 0x9472, 0x6514, 0x9473, 0x6515, 0x9474, 0x6516, + 0x9475, 0x6517, 0x9476, 0x6519, 0x9477, 0x651A, 0x9478, 0x651B, 0x9479, 0x651C, 0x947A, 0x651D, 0x947B, 0x651E, 0x947C, 0x651F, + 0x947D, 0x6520, 0x947E, 0x6521, 0x9480, 0x6522, 0x9481, 0x6523, 0x9482, 0x6524, 0x9483, 0x6526, 0x9484, 0x6527, 0x9485, 0x6528, + 0x9486, 0x6529, 0x9487, 0x652A, 0x9488, 0x652C, 0x9489, 0x652D, 0x948A, 0x6530, 0x948B, 0x6531, 0x948C, 0x6532, 0x948D, 0x6533, + 0x948E, 0x6537, 0x948F, 0x653A, 0x9490, 0x653C, 0x9491, 0x653D, 0x9492, 0x6540, 0x9493, 0x6541, 0x9494, 0x6542, 0x9495, 0x6543, + 0x9496, 0x6544, 0x9497, 0x6546, 0x9498, 0x6547, 0x9499, 0x654A, 0x949A, 0x654B, 0x949B, 0x654D, 0x949C, 0x654E, 0x949D, 0x6550, + 0x949E, 0x6552, 0x949F, 0x6553, 0x94A0, 0x6554, 0x94A1, 0x6557, 0x94A2, 0x6558, 0x94A3, 0x655A, 0x94A4, 0x655C, 0x94A5, 0x655F, + 0x94A6, 0x6560, 0x94A7, 0x6561, 0x94A8, 0x6564, 0x94A9, 0x6565, 0x94AA, 0x6567, 0x94AB, 0x6568, 0x94AC, 0x6569, 0x94AD, 0x656A, + 0x94AE, 0x656D, 0x94AF, 0x656E, 0x94B0, 0x656F, 0x94B1, 0x6571, 0x94B2, 0x6573, 0x94B3, 0x6575, 0x94B4, 0x6576, 0x94B5, 0x6578, + 0x94B6, 0x6579, 0x94B7, 0x657A, 0x94B8, 0x657B, 0x94B9, 0x657C, 0x94BA, 0x657D, 0x94BB, 0x657E, 0x94BC, 0x657F, 0x94BD, 0x6580, + 0x94BE, 0x6581, 0x94BF, 0x6582, 0x94C0, 0x6583, 0x94C1, 0x6584, 0x94C2, 0x6585, 0x94C3, 0x6586, 0x94C4, 0x6588, 0x94C5, 0x6589, + 0x94C6, 0x658A, 0x94C7, 0x658D, 0x94C8, 0x658E, 0x94C9, 0x658F, 0x94CA, 0x6592, 0x94CB, 0x6594, 0x94CC, 0x6595, 0x94CD, 0x6596, + 0x94CE, 0x6598, 0x94CF, 0x659A, 0x94D0, 0x659D, 0x94D1, 0x659E, 0x94D2, 0x65A0, 0x94D3, 0x65A2, 0x94D4, 0x65A3, 0x94D5, 0x65A6, + 0x94D6, 0x65A8, 0x94D7, 0x65AA, 0x94D8, 0x65AC, 0x94D9, 0x65AE, 0x94DA, 0x65B1, 0x94DB, 0x65B2, 0x94DC, 0x65B3, 0x94DD, 0x65B4, + 0x94DE, 0x65B5, 0x94DF, 0x65B6, 0x94E0, 0x65B7, 0x94E1, 0x65B8, 0x94E2, 0x65BA, 0x94E3, 0x65BB, 0x94E4, 0x65BE, 0x94E5, 0x65BF, + 0x94E6, 0x65C0, 0x94E7, 0x65C2, 0x94E8, 0x65C7, 0x94E9, 0x65C8, 0x94EA, 0x65C9, 0x94EB, 0x65CA, 0x94EC, 0x65CD, 0x94ED, 0x65D0, + 0x94EE, 0x65D1, 0x94EF, 0x65D3, 0x94F0, 0x65D4, 0x94F1, 0x65D5, 0x94F2, 0x65D8, 0x94F3, 0x65D9, 0x94F4, 0x65DA, 0x94F5, 0x65DB, + 0x94F6, 0x65DC, 0x94F7, 0x65DD, 0x94F8, 0x65DE, 0x94F9, 0x65DF, 0x94FA, 0x65E1, 0x94FB, 0x65E3, 0x94FC, 0x65E4, 0x94FD, 0x65EA, + 0x94FE, 0x65EB, 0x9540, 0x65F2, 0x9541, 0x65F3, 0x9542, 0x65F4, 0x9543, 0x65F5, 0x9544, 0x65F8, 0x9545, 0x65F9, 0x9546, 0x65FB, + 0x9547, 0x65FC, 0x9548, 0x65FD, 0x9549, 0x65FE, 0x954A, 0x65FF, 0x954B, 0x6601, 0x954C, 0x6604, 0x954D, 0x6605, 0x954E, 0x6607, + 0x954F, 0x6608, 0x9550, 0x6609, 0x9551, 0x660B, 0x9552, 0x660D, 0x9553, 0x6610, 0x9554, 0x6611, 0x9555, 0x6612, 0x9556, 0x6616, + 0x9557, 0x6617, 0x9558, 0x6618, 0x9559, 0x661A, 0x955A, 0x661B, 0x955B, 0x661C, 0x955C, 0x661E, 0x955D, 0x6621, 0x955E, 0x6622, + 0x955F, 0x6623, 0x9560, 0x6624, 0x9561, 0x6626, 0x9562, 0x6629, 0x9563, 0x662A, 0x9564, 0x662B, 0x9565, 0x662C, 0x9566, 0x662E, + 0x9567, 0x6630, 0x9568, 0x6632, 0x9569, 0x6633, 0x956A, 0x6637, 0x956B, 0x6638, 0x956C, 0x6639, 0x956D, 0x663A, 0x956E, 0x663B, + 0x956F, 0x663D, 0x9570, 0x663F, 0x9571, 0x6640, 0x9572, 0x6642, 0x9573, 0x6644, 0x9574, 0x6645, 0x9575, 0x6646, 0x9576, 0x6647, + 0x9577, 0x6648, 0x9578, 0x6649, 0x9579, 0x664A, 0x957A, 0x664D, 0x957B, 0x664E, 0x957C, 0x6650, 0x957D, 0x6651, 0x957E, 0x6658, + 0x9580, 0x6659, 0x9581, 0x665B, 0x9582, 0x665C, 0x9583, 0x665D, 0x9584, 0x665E, 0x9585, 0x6660, 0x9586, 0x6662, 0x9587, 0x6663, + 0x9588, 0x6665, 0x9589, 0x6667, 0x958A, 0x6669, 0x958B, 0x666A, 0x958C, 0x666B, 0x958D, 0x666C, 0x958E, 0x666D, 0x958F, 0x6671, + 0x9590, 0x6672, 0x9591, 0x6673, 0x9592, 0x6675, 0x9593, 0x6678, 0x9594, 0x6679, 0x9595, 0x667B, 0x9596, 0x667C, 0x9597, 0x667D, + 0x9598, 0x667F, 0x9599, 0x6680, 0x959A, 0x6681, 0x959B, 0x6683, 0x959C, 0x6685, 0x959D, 0x6686, 0x959E, 0x6688, 0x959F, 0x6689, + 0x95A0, 0x668A, 0x95A1, 0x668B, 0x95A2, 0x668D, 0x95A3, 0x668E, 0x95A4, 0x668F, 0x95A5, 0x6690, 0x95A6, 0x6692, 0x95A7, 0x6693, + 0x95A8, 0x6694, 0x95A9, 0x6695, 0x95AA, 0x6698, 0x95AB, 0x6699, 0x95AC, 0x669A, 0x95AD, 0x669B, 0x95AE, 0x669C, 0x95AF, 0x669E, + 0x95B0, 0x669F, 0x95B1, 0x66A0, 0x95B2, 0x66A1, 0x95B3, 0x66A2, 0x95B4, 0x66A3, 0x95B5, 0x66A4, 0x95B6, 0x66A5, 0x95B7, 0x66A6, + 0x95B8, 0x66A9, 0x95B9, 0x66AA, 0x95BA, 0x66AB, 0x95BB, 0x66AC, 0x95BC, 0x66AD, 0x95BD, 0x66AF, 0x95BE, 0x66B0, 0x95BF, 0x66B1, + 0x95C0, 0x66B2, 0x95C1, 0x66B3, 0x95C2, 0x66B5, 0x95C3, 0x66B6, 0x95C4, 0x66B7, 0x95C5, 0x66B8, 0x95C6, 0x66BA, 0x95C7, 0x66BB, + 0x95C8, 0x66BC, 0x95C9, 0x66BD, 0x95CA, 0x66BF, 0x95CB, 0x66C0, 0x95CC, 0x66C1, 0x95CD, 0x66C2, 0x95CE, 0x66C3, 0x95CF, 0x66C4, + 0x95D0, 0x66C5, 0x95D1, 0x66C6, 0x95D2, 0x66C7, 0x95D3, 0x66C8, 0x95D4, 0x66C9, 0x95D5, 0x66CA, 0x95D6, 0x66CB, 0x95D7, 0x66CC, + 0x95D8, 0x66CD, 0x95D9, 0x66CE, 0x95DA, 0x66CF, 0x95DB, 0x66D0, 0x95DC, 0x66D1, 0x95DD, 0x66D2, 0x95DE, 0x66D3, 0x95DF, 0x66D4, + 0x95E0, 0x66D5, 0x95E1, 0x66D6, 0x95E2, 0x66D7, 0x95E3, 0x66D8, 0x95E4, 0x66DA, 0x95E5, 0x66DE, 0x95E6, 0x66DF, 0x95E7, 0x66E0, + 0x95E8, 0x66E1, 0x95E9, 0x66E2, 0x95EA, 0x66E3, 0x95EB, 0x66E4, 0x95EC, 0x66E5, 0x95ED, 0x66E7, 0x95EE, 0x66E8, 0x95EF, 0x66EA, + 0x95F0, 0x66EB, 0x95F1, 0x66EC, 0x95F2, 0x66ED, 0x95F3, 0x66EE, 0x95F4, 0x66EF, 0x95F5, 0x66F1, 0x95F6, 0x66F5, 0x95F7, 0x66F6, + 0x95F8, 0x66F8, 0x95F9, 0x66FA, 0x95FA, 0x66FB, 0x95FB, 0x66FD, 0x95FC, 0x6701, 0x95FD, 0x6702, 0x95FE, 0x6703, 0x9640, 0x6704, + 0x9641, 0x6705, 0x9642, 0x6706, 0x9643, 0x6707, 0x9644, 0x670C, 0x9645, 0x670E, 0x9646, 0x670F, 0x9647, 0x6711, 0x9648, 0x6712, + 0x9649, 0x6713, 0x964A, 0x6716, 0x964B, 0x6718, 0x964C, 0x6719, 0x964D, 0x671A, 0x964E, 0x671C, 0x964F, 0x671E, 0x9650, 0x6720, + 0x9651, 0x6721, 0x9652, 0x6722, 0x9653, 0x6723, 0x9654, 0x6724, 0x9655, 0x6725, 0x9656, 0x6727, 0x9657, 0x6729, 0x9658, 0x672E, + 0x9659, 0x6730, 0x965A, 0x6732, 0x965B, 0x6733, 0x965C, 0x6736, 0x965D, 0x6737, 0x965E, 0x6738, 0x965F, 0x6739, 0x9660, 0x673B, + 0x9661, 0x673C, 0x9662, 0x673E, 0x9663, 0x673F, 0x9664, 0x6741, 0x9665, 0x6744, 0x9666, 0x6745, 0x9667, 0x6747, 0x9668, 0x674A, + 0x9669, 0x674B, 0x966A, 0x674D, 0x966B, 0x6752, 0x966C, 0x6754, 0x966D, 0x6755, 0x966E, 0x6757, 0x966F, 0x6758, 0x9670, 0x6759, + 0x9671, 0x675A, 0x9672, 0x675B, 0x9673, 0x675D, 0x9674, 0x6762, 0x9675, 0x6763, 0x9676, 0x6764, 0x9677, 0x6766, 0x9678, 0x6767, + 0x9679, 0x676B, 0x967A, 0x676C, 0x967B, 0x676E, 0x967C, 0x6771, 0x967D, 0x6774, 0x967E, 0x6776, 0x9680, 0x6778, 0x9681, 0x6779, + 0x9682, 0x677A, 0x9683, 0x677B, 0x9684, 0x677D, 0x9685, 0x6780, 0x9686, 0x6782, 0x9687, 0x6783, 0x9688, 0x6785, 0x9689, 0x6786, + 0x968A, 0x6788, 0x968B, 0x678A, 0x968C, 0x678C, 0x968D, 0x678D, 0x968E, 0x678E, 0x968F, 0x678F, 0x9690, 0x6791, 0x9691, 0x6792, + 0x9692, 0x6793, 0x9693, 0x6794, 0x9694, 0x6796, 0x9695, 0x6799, 0x9696, 0x679B, 0x9697, 0x679F, 0x9698, 0x67A0, 0x9699, 0x67A1, + 0x969A, 0x67A4, 0x969B, 0x67A6, 0x969C, 0x67A9, 0x969D, 0x67AC, 0x969E, 0x67AE, 0x969F, 0x67B1, 0x96A0, 0x67B2, 0x96A1, 0x67B4, + 0x96A2, 0x67B9, 0x96A3, 0x67BA, 0x96A4, 0x67BB, 0x96A5, 0x67BC, 0x96A6, 0x67BD, 0x96A7, 0x67BE, 0x96A8, 0x67BF, 0x96A9, 0x67C0, + 0x96AA, 0x67C2, 0x96AB, 0x67C5, 0x96AC, 0x67C6, 0x96AD, 0x67C7, 0x96AE, 0x67C8, 0x96AF, 0x67C9, 0x96B0, 0x67CA, 0x96B1, 0x67CB, + 0x96B2, 0x67CC, 0x96B3, 0x67CD, 0x96B4, 0x67CE, 0x96B5, 0x67D5, 0x96B6, 0x67D6, 0x96B7, 0x67D7, 0x96B8, 0x67DB, 0x96B9, 0x67DF, + 0x96BA, 0x67E1, 0x96BB, 0x67E3, 0x96BC, 0x67E4, 0x96BD, 0x67E6, 0x96BE, 0x67E7, 0x96BF, 0x67E8, 0x96C0, 0x67EA, 0x96C1, 0x67EB, + 0x96C2, 0x67ED, 0x96C3, 0x67EE, 0x96C4, 0x67F2, 0x96C5, 0x67F5, 0x96C6, 0x67F6, 0x96C7, 0x67F7, 0x96C8, 0x67F8, 0x96C9, 0x67F9, + 0x96CA, 0x67FA, 0x96CB, 0x67FB, 0x96CC, 0x67FC, 0x96CD, 0x67FE, 0x96CE, 0x6801, 0x96CF, 0x6802, 0x96D0, 0x6803, 0x96D1, 0x6804, + 0x96D2, 0x6806, 0x96D3, 0x680D, 0x96D4, 0x6810, 0x96D5, 0x6812, 0x96D6, 0x6814, 0x96D7, 0x6815, 0x96D8, 0x6818, 0x96D9, 0x6819, + 0x96DA, 0x681A, 0x96DB, 0x681B, 0x96DC, 0x681C, 0x96DD, 0x681E, 0x96DE, 0x681F, 0x96DF, 0x6820, 0x96E0, 0x6822, 0x96E1, 0x6823, + 0x96E2, 0x6824, 0x96E3, 0x6825, 0x96E4, 0x6826, 0x96E5, 0x6827, 0x96E6, 0x6828, 0x96E7, 0x682B, 0x96E8, 0x682C, 0x96E9, 0x682D, + 0x96EA, 0x682E, 0x96EB, 0x682F, 0x96EC, 0x6830, 0x96ED, 0x6831, 0x96EE, 0x6834, 0x96EF, 0x6835, 0x96F0, 0x6836, 0x96F1, 0x683A, + 0x96F2, 0x683B, 0x96F3, 0x683F, 0x96F4, 0x6847, 0x96F5, 0x684B, 0x96F6, 0x684D, 0x96F7, 0x684F, 0x96F8, 0x6852, 0x96F9, 0x6856, + 0x96FA, 0x6857, 0x96FB, 0x6858, 0x96FC, 0x6859, 0x96FD, 0x685A, 0x96FE, 0x685B, 0x9740, 0x685C, 0x9741, 0x685D, 0x9742, 0x685E, + 0x9743, 0x685F, 0x9744, 0x686A, 0x9745, 0x686C, 0x9746, 0x686D, 0x9747, 0x686E, 0x9748, 0x686F, 0x9749, 0x6870, 0x974A, 0x6871, + 0x974B, 0x6872, 0x974C, 0x6873, 0x974D, 0x6875, 0x974E, 0x6878, 0x974F, 0x6879, 0x9750, 0x687A, 0x9751, 0x687B, 0x9752, 0x687C, + 0x9753, 0x687D, 0x9754, 0x687E, 0x9755, 0x687F, 0x9756, 0x6880, 0x9757, 0x6882, 0x9758, 0x6884, 0x9759, 0x6887, 0x975A, 0x6888, + 0x975B, 0x6889, 0x975C, 0x688A, 0x975D, 0x688B, 0x975E, 0x688C, 0x975F, 0x688D, 0x9760, 0x688E, 0x9761, 0x6890, 0x9762, 0x6891, + 0x9763, 0x6892, 0x9764, 0x6894, 0x9765, 0x6895, 0x9766, 0x6896, 0x9767, 0x6898, 0x9768, 0x6899, 0x9769, 0x689A, 0x976A, 0x689B, + 0x976B, 0x689C, 0x976C, 0x689D, 0x976D, 0x689E, 0x976E, 0x689F, 0x976F, 0x68A0, 0x9770, 0x68A1, 0x9771, 0x68A3, 0x9772, 0x68A4, + 0x9773, 0x68A5, 0x9774, 0x68A9, 0x9775, 0x68AA, 0x9776, 0x68AB, 0x9777, 0x68AC, 0x9778, 0x68AE, 0x9779, 0x68B1, 0x977A, 0x68B2, + 0x977B, 0x68B4, 0x977C, 0x68B6, 0x977D, 0x68B7, 0x977E, 0x68B8, 0x9780, 0x68B9, 0x9781, 0x68BA, 0x9782, 0x68BB, 0x9783, 0x68BC, + 0x9784, 0x68BD, 0x9785, 0x68BE, 0x9786, 0x68BF, 0x9787, 0x68C1, 0x9788, 0x68C3, 0x9789, 0x68C4, 0x978A, 0x68C5, 0x978B, 0x68C6, + 0x978C, 0x68C7, 0x978D, 0x68C8, 0x978E, 0x68CA, 0x978F, 0x68CC, 0x9790, 0x68CE, 0x9791, 0x68CF, 0x9792, 0x68D0, 0x9793, 0x68D1, + 0x9794, 0x68D3, 0x9795, 0x68D4, 0x9796, 0x68D6, 0x9797, 0x68D7, 0x9798, 0x68D9, 0x9799, 0x68DB, 0x979A, 0x68DC, 0x979B, 0x68DD, + 0x979C, 0x68DE, 0x979D, 0x68DF, 0x979E, 0x68E1, 0x979F, 0x68E2, 0x97A0, 0x68E4, 0x97A1, 0x68E5, 0x97A2, 0x68E6, 0x97A3, 0x68E7, + 0x97A4, 0x68E8, 0x97A5, 0x68E9, 0x97A6, 0x68EA, 0x97A7, 0x68EB, 0x97A8, 0x68EC, 0x97A9, 0x68ED, 0x97AA, 0x68EF, 0x97AB, 0x68F2, + 0x97AC, 0x68F3, 0x97AD, 0x68F4, 0x97AE, 0x68F6, 0x97AF, 0x68F7, 0x97B0, 0x68F8, 0x97B1, 0x68FB, 0x97B2, 0x68FD, 0x97B3, 0x68FE, + 0x97B4, 0x68FF, 0x97B5, 0x6900, 0x97B6, 0x6902, 0x97B7, 0x6903, 0x97B8, 0x6904, 0x97B9, 0x6906, 0x97BA, 0x6907, 0x97BB, 0x6908, + 0x97BC, 0x6909, 0x97BD, 0x690A, 0x97BE, 0x690C, 0x97BF, 0x690F, 0x97C0, 0x6911, 0x97C1, 0x6913, 0x97C2, 0x6914, 0x97C3, 0x6915, + 0x97C4, 0x6916, 0x97C5, 0x6917, 0x97C6, 0x6918, 0x97C7, 0x6919, 0x97C8, 0x691A, 0x97C9, 0x691B, 0x97CA, 0x691C, 0x97CB, 0x691D, + 0x97CC, 0x691E, 0x97CD, 0x6921, 0x97CE, 0x6922, 0x97CF, 0x6923, 0x97D0, 0x6925, 0x97D1, 0x6926, 0x97D2, 0x6927, 0x97D3, 0x6928, + 0x97D4, 0x6929, 0x97D5, 0x692A, 0x97D6, 0x692B, 0x97D7, 0x692C, 0x97D8, 0x692E, 0x97D9, 0x692F, 0x97DA, 0x6931, 0x97DB, 0x6932, + 0x97DC, 0x6933, 0x97DD, 0x6935, 0x97DE, 0x6936, 0x97DF, 0x6937, 0x97E0, 0x6938, 0x97E1, 0x693A, 0x97E2, 0x693B, 0x97E3, 0x693C, + 0x97E4, 0x693E, 0x97E5, 0x6940, 0x97E6, 0x6941, 0x97E7, 0x6943, 0x97E8, 0x6944, 0x97E9, 0x6945, 0x97EA, 0x6946, 0x97EB, 0x6947, + 0x97EC, 0x6948, 0x97ED, 0x6949, 0x97EE, 0x694A, 0x97EF, 0x694B, 0x97F0, 0x694C, 0x97F1, 0x694D, 0x97F2, 0x694E, 0x97F3, 0x694F, + 0x97F4, 0x6950, 0x97F5, 0x6951, 0x97F6, 0x6952, 0x97F7, 0x6953, 0x97F8, 0x6955, 0x97F9, 0x6956, 0x97FA, 0x6958, 0x97FB, 0x6959, + 0x97FC, 0x695B, 0x97FD, 0x695C, 0x97FE, 0x695F, 0x9840, 0x6961, 0x9841, 0x6962, 0x9842, 0x6964, 0x9843, 0x6965, 0x9844, 0x6967, + 0x9845, 0x6968, 0x9846, 0x6969, 0x9847, 0x696A, 0x9848, 0x696C, 0x9849, 0x696D, 0x984A, 0x696F, 0x984B, 0x6970, 0x984C, 0x6972, + 0x984D, 0x6973, 0x984E, 0x6974, 0x984F, 0x6975, 0x9850, 0x6976, 0x9851, 0x697A, 0x9852, 0x697B, 0x9853, 0x697D, 0x9854, 0x697E, + 0x9855, 0x697F, 0x9856, 0x6981, 0x9857, 0x6983, 0x9858, 0x6985, 0x9859, 0x698A, 0x985A, 0x698B, 0x985B, 0x698C, 0x985C, 0x698E, + 0x985D, 0x698F, 0x985E, 0x6990, 0x985F, 0x6991, 0x9860, 0x6992, 0x9861, 0x6993, 0x9862, 0x6996, 0x9863, 0x6997, 0x9864, 0x6999, + 0x9865, 0x699A, 0x9866, 0x699D, 0x9867, 0x699E, 0x9868, 0x699F, 0x9869, 0x69A0, 0x986A, 0x69A1, 0x986B, 0x69A2, 0x986C, 0x69A3, + 0x986D, 0x69A4, 0x986E, 0x69A5, 0x986F, 0x69A6, 0x9870, 0x69A9, 0x9871, 0x69AA, 0x9872, 0x69AC, 0x9873, 0x69AE, 0x9874, 0x69AF, + 0x9875, 0x69B0, 0x9876, 0x69B2, 0x9877, 0x69B3, 0x9878, 0x69B5, 0x9879, 0x69B6, 0x987A, 0x69B8, 0x987B, 0x69B9, 0x987C, 0x69BA, + 0x987D, 0x69BC, 0x987E, 0x69BD, 0x9880, 0x69BE, 0x9881, 0x69BF, 0x9882, 0x69C0, 0x9883, 0x69C2, 0x9884, 0x69C3, 0x9885, 0x69C4, + 0x9886, 0x69C5, 0x9887, 0x69C6, 0x9888, 0x69C7, 0x9889, 0x69C8, 0x988A, 0x69C9, 0x988B, 0x69CB, 0x988C, 0x69CD, 0x988D, 0x69CF, + 0x988E, 0x69D1, 0x988F, 0x69D2, 0x9890, 0x69D3, 0x9891, 0x69D5, 0x9892, 0x69D6, 0x9893, 0x69D7, 0x9894, 0x69D8, 0x9895, 0x69D9, + 0x9896, 0x69DA, 0x9897, 0x69DC, 0x9898, 0x69DD, 0x9899, 0x69DE, 0x989A, 0x69E1, 0x989B, 0x69E2, 0x989C, 0x69E3, 0x989D, 0x69E4, + 0x989E, 0x69E5, 0x989F, 0x69E6, 0x98A0, 0x69E7, 0x98A1, 0x69E8, 0x98A2, 0x69E9, 0x98A3, 0x69EA, 0x98A4, 0x69EB, 0x98A5, 0x69EC, + 0x98A6, 0x69EE, 0x98A7, 0x69EF, 0x98A8, 0x69F0, 0x98A9, 0x69F1, 0x98AA, 0x69F3, 0x98AB, 0x69F4, 0x98AC, 0x69F5, 0x98AD, 0x69F6, + 0x98AE, 0x69F7, 0x98AF, 0x69F8, 0x98B0, 0x69F9, 0x98B1, 0x69FA, 0x98B2, 0x69FB, 0x98B3, 0x69FC, 0x98B4, 0x69FE, 0x98B5, 0x6A00, + 0x98B6, 0x6A01, 0x98B7, 0x6A02, 0x98B8, 0x6A03, 0x98B9, 0x6A04, 0x98BA, 0x6A05, 0x98BB, 0x6A06, 0x98BC, 0x6A07, 0x98BD, 0x6A08, + 0x98BE, 0x6A09, 0x98BF, 0x6A0B, 0x98C0, 0x6A0C, 0x98C1, 0x6A0D, 0x98C2, 0x6A0E, 0x98C3, 0x6A0F, 0x98C4, 0x6A10, 0x98C5, 0x6A11, + 0x98C6, 0x6A12, 0x98C7, 0x6A13, 0x98C8, 0x6A14, 0x98C9, 0x6A15, 0x98CA, 0x6A16, 0x98CB, 0x6A19, 0x98CC, 0x6A1A, 0x98CD, 0x6A1B, + 0x98CE, 0x6A1C, 0x98CF, 0x6A1D, 0x98D0, 0x6A1E, 0x98D1, 0x6A20, 0x98D2, 0x6A22, 0x98D3, 0x6A23, 0x98D4, 0x6A24, 0x98D5, 0x6A25, + 0x98D6, 0x6A26, 0x98D7, 0x6A27, 0x98D8, 0x6A29, 0x98D9, 0x6A2B, 0x98DA, 0x6A2C, 0x98DB, 0x6A2D, 0x98DC, 0x6A2E, 0x98DD, 0x6A30, + 0x98DE, 0x6A32, 0x98DF, 0x6A33, 0x98E0, 0x6A34, 0x98E1, 0x6A36, 0x98E2, 0x6A37, 0x98E3, 0x6A38, 0x98E4, 0x6A39, 0x98E5, 0x6A3A, + 0x98E6, 0x6A3B, 0x98E7, 0x6A3C, 0x98E8, 0x6A3F, 0x98E9, 0x6A40, 0x98EA, 0x6A41, 0x98EB, 0x6A42, 0x98EC, 0x6A43, 0x98ED, 0x6A45, + 0x98EE, 0x6A46, 0x98EF, 0x6A48, 0x98F0, 0x6A49, 0x98F1, 0x6A4A, 0x98F2, 0x6A4B, 0x98F3, 0x6A4C, 0x98F4, 0x6A4D, 0x98F5, 0x6A4E, + 0x98F6, 0x6A4F, 0x98F7, 0x6A51, 0x98F8, 0x6A52, 0x98F9, 0x6A53, 0x98FA, 0x6A54, 0x98FB, 0x6A55, 0x98FC, 0x6A56, 0x98FD, 0x6A57, + 0x98FE, 0x6A5A, 0x9940, 0x6A5C, 0x9941, 0x6A5D, 0x9942, 0x6A5E, 0x9943, 0x6A5F, 0x9944, 0x6A60, 0x9945, 0x6A62, 0x9946, 0x6A63, + 0x9947, 0x6A64, 0x9948, 0x6A66, 0x9949, 0x6A67, 0x994A, 0x6A68, 0x994B, 0x6A69, 0x994C, 0x6A6A, 0x994D, 0x6A6B, 0x994E, 0x6A6C, + 0x994F, 0x6A6D, 0x9950, 0x6A6E, 0x9951, 0x6A6F, 0x9952, 0x6A70, 0x9953, 0x6A72, 0x9954, 0x6A73, 0x9955, 0x6A74, 0x9956, 0x6A75, + 0x9957, 0x6A76, 0x9958, 0x6A77, 0x9959, 0x6A78, 0x995A, 0x6A7A, 0x995B, 0x6A7B, 0x995C, 0x6A7D, 0x995D, 0x6A7E, 0x995E, 0x6A7F, + 0x995F, 0x6A81, 0x9960, 0x6A82, 0x9961, 0x6A83, 0x9962, 0x6A85, 0x9963, 0x6A86, 0x9964, 0x6A87, 0x9965, 0x6A88, 0x9966, 0x6A89, + 0x9967, 0x6A8A, 0x9968, 0x6A8B, 0x9969, 0x6A8C, 0x996A, 0x6A8D, 0x996B, 0x6A8F, 0x996C, 0x6A92, 0x996D, 0x6A93, 0x996E, 0x6A94, + 0x996F, 0x6A95, 0x9970, 0x6A96, 0x9971, 0x6A98, 0x9972, 0x6A99, 0x9973, 0x6A9A, 0x9974, 0x6A9B, 0x9975, 0x6A9C, 0x9976, 0x6A9D, + 0x9977, 0x6A9E, 0x9978, 0x6A9F, 0x9979, 0x6AA1, 0x997A, 0x6AA2, 0x997B, 0x6AA3, 0x997C, 0x6AA4, 0x997D, 0x6AA5, 0x997E, 0x6AA6, + 0x9980, 0x6AA7, 0x9981, 0x6AA8, 0x9982, 0x6AAA, 0x9983, 0x6AAD, 0x9984, 0x6AAE, 0x9985, 0x6AAF, 0x9986, 0x6AB0, 0x9987, 0x6AB1, + 0x9988, 0x6AB2, 0x9989, 0x6AB3, 0x998A, 0x6AB4, 0x998B, 0x6AB5, 0x998C, 0x6AB6, 0x998D, 0x6AB7, 0x998E, 0x6AB8, 0x998F, 0x6AB9, + 0x9990, 0x6ABA, 0x9991, 0x6ABB, 0x9992, 0x6ABC, 0x9993, 0x6ABD, 0x9994, 0x6ABE, 0x9995, 0x6ABF, 0x9996, 0x6AC0, 0x9997, 0x6AC1, + 0x9998, 0x6AC2, 0x9999, 0x6AC3, 0x999A, 0x6AC4, 0x999B, 0x6AC5, 0x999C, 0x6AC6, 0x999D, 0x6AC7, 0x999E, 0x6AC8, 0x999F, 0x6AC9, + 0x99A0, 0x6ACA, 0x99A1, 0x6ACB, 0x99A2, 0x6ACC, 0x99A3, 0x6ACD, 0x99A4, 0x6ACE, 0x99A5, 0x6ACF, 0x99A6, 0x6AD0, 0x99A7, 0x6AD1, + 0x99A8, 0x6AD2, 0x99A9, 0x6AD3, 0x99AA, 0x6AD4, 0x99AB, 0x6AD5, 0x99AC, 0x6AD6, 0x99AD, 0x6AD7, 0x99AE, 0x6AD8, 0x99AF, 0x6AD9, + 0x99B0, 0x6ADA, 0x99B1, 0x6ADB, 0x99B2, 0x6ADC, 0x99B3, 0x6ADD, 0x99B4, 0x6ADE, 0x99B5, 0x6ADF, 0x99B6, 0x6AE0, 0x99B7, 0x6AE1, + 0x99B8, 0x6AE2, 0x99B9, 0x6AE3, 0x99BA, 0x6AE4, 0x99BB, 0x6AE5, 0x99BC, 0x6AE6, 0x99BD, 0x6AE7, 0x99BE, 0x6AE8, 0x99BF, 0x6AE9, + 0x99C0, 0x6AEA, 0x99C1, 0x6AEB, 0x99C2, 0x6AEC, 0x99C3, 0x6AED, 0x99C4, 0x6AEE, 0x99C5, 0x6AEF, 0x99C6, 0x6AF0, 0x99C7, 0x6AF1, + 0x99C8, 0x6AF2, 0x99C9, 0x6AF3, 0x99CA, 0x6AF4, 0x99CB, 0x6AF5, 0x99CC, 0x6AF6, 0x99CD, 0x6AF7, 0x99CE, 0x6AF8, 0x99CF, 0x6AF9, + 0x99D0, 0x6AFA, 0x99D1, 0x6AFB, 0x99D2, 0x6AFC, 0x99D3, 0x6AFD, 0x99D4, 0x6AFE, 0x99D5, 0x6AFF, 0x99D6, 0x6B00, 0x99D7, 0x6B01, + 0x99D8, 0x6B02, 0x99D9, 0x6B03, 0x99DA, 0x6B04, 0x99DB, 0x6B05, 0x99DC, 0x6B06, 0x99DD, 0x6B07, 0x99DE, 0x6B08, 0x99DF, 0x6B09, + 0x99E0, 0x6B0A, 0x99E1, 0x6B0B, 0x99E2, 0x6B0C, 0x99E3, 0x6B0D, 0x99E4, 0x6B0E, 0x99E5, 0x6B0F, 0x99E6, 0x6B10, 0x99E7, 0x6B11, + 0x99E8, 0x6B12, 0x99E9, 0x6B13, 0x99EA, 0x6B14, 0x99EB, 0x6B15, 0x99EC, 0x6B16, 0x99ED, 0x6B17, 0x99EE, 0x6B18, 0x99EF, 0x6B19, + 0x99F0, 0x6B1A, 0x99F1, 0x6B1B, 0x99F2, 0x6B1C, 0x99F3, 0x6B1D, 0x99F4, 0x6B1E, 0x99F5, 0x6B1F, 0x99F6, 0x6B25, 0x99F7, 0x6B26, + 0x99F8, 0x6B28, 0x99F9, 0x6B29, 0x99FA, 0x6B2A, 0x99FB, 0x6B2B, 0x99FC, 0x6B2C, 0x99FD, 0x6B2D, 0x99FE, 0x6B2E, 0x9A40, 0x6B2F, + 0x9A41, 0x6B30, 0x9A42, 0x6B31, 0x9A43, 0x6B33, 0x9A44, 0x6B34, 0x9A45, 0x6B35, 0x9A46, 0x6B36, 0x9A47, 0x6B38, 0x9A48, 0x6B3B, + 0x9A49, 0x6B3C, 0x9A4A, 0x6B3D, 0x9A4B, 0x6B3F, 0x9A4C, 0x6B40, 0x9A4D, 0x6B41, 0x9A4E, 0x6B42, 0x9A4F, 0x6B44, 0x9A50, 0x6B45, + 0x9A51, 0x6B48, 0x9A52, 0x6B4A, 0x9A53, 0x6B4B, 0x9A54, 0x6B4D, 0x9A55, 0x6B4E, 0x9A56, 0x6B4F, 0x9A57, 0x6B50, 0x9A58, 0x6B51, + 0x9A59, 0x6B52, 0x9A5A, 0x6B53, 0x9A5B, 0x6B54, 0x9A5C, 0x6B55, 0x9A5D, 0x6B56, 0x9A5E, 0x6B57, 0x9A5F, 0x6B58, 0x9A60, 0x6B5A, + 0x9A61, 0x6B5B, 0x9A62, 0x6B5C, 0x9A63, 0x6B5D, 0x9A64, 0x6B5E, 0x9A65, 0x6B5F, 0x9A66, 0x6B60, 0x9A67, 0x6B61, 0x9A68, 0x6B68, + 0x9A69, 0x6B69, 0x9A6A, 0x6B6B, 0x9A6B, 0x6B6C, 0x9A6C, 0x6B6D, 0x9A6D, 0x6B6E, 0x9A6E, 0x6B6F, 0x9A6F, 0x6B70, 0x9A70, 0x6B71, + 0x9A71, 0x6B72, 0x9A72, 0x6B73, 0x9A73, 0x6B74, 0x9A74, 0x6B75, 0x9A75, 0x6B76, 0x9A76, 0x6B77, 0x9A77, 0x6B78, 0x9A78, 0x6B7A, + 0x9A79, 0x6B7D, 0x9A7A, 0x6B7E, 0x9A7B, 0x6B7F, 0x9A7C, 0x6B80, 0x9A7D, 0x6B85, 0x9A7E, 0x6B88, 0x9A80, 0x6B8C, 0x9A81, 0x6B8E, + 0x9A82, 0x6B8F, 0x9A83, 0x6B90, 0x9A84, 0x6B91, 0x9A85, 0x6B94, 0x9A86, 0x6B95, 0x9A87, 0x6B97, 0x9A88, 0x6B98, 0x9A89, 0x6B99, + 0x9A8A, 0x6B9C, 0x9A8B, 0x6B9D, 0x9A8C, 0x6B9E, 0x9A8D, 0x6B9F, 0x9A8E, 0x6BA0, 0x9A8F, 0x6BA2, 0x9A90, 0x6BA3, 0x9A91, 0x6BA4, + 0x9A92, 0x6BA5, 0x9A93, 0x6BA6, 0x9A94, 0x6BA7, 0x9A95, 0x6BA8, 0x9A96, 0x6BA9, 0x9A97, 0x6BAB, 0x9A98, 0x6BAC, 0x9A99, 0x6BAD, + 0x9A9A, 0x6BAE, 0x9A9B, 0x6BAF, 0x9A9C, 0x6BB0, 0x9A9D, 0x6BB1, 0x9A9E, 0x6BB2, 0x9A9F, 0x6BB6, 0x9AA0, 0x6BB8, 0x9AA1, 0x6BB9, + 0x9AA2, 0x6BBA, 0x9AA3, 0x6BBB, 0x9AA4, 0x6BBC, 0x9AA5, 0x6BBD, 0x9AA6, 0x6BBE, 0x9AA7, 0x6BC0, 0x9AA8, 0x6BC3, 0x9AA9, 0x6BC4, + 0x9AAA, 0x6BC6, 0x9AAB, 0x6BC7, 0x9AAC, 0x6BC8, 0x9AAD, 0x6BC9, 0x9AAE, 0x6BCA, 0x9AAF, 0x6BCC, 0x9AB0, 0x6BCE, 0x9AB1, 0x6BD0, + 0x9AB2, 0x6BD1, 0x9AB3, 0x6BD8, 0x9AB4, 0x6BDA, 0x9AB5, 0x6BDC, 0x9AB6, 0x6BDD, 0x9AB7, 0x6BDE, 0x9AB8, 0x6BDF, 0x9AB9, 0x6BE0, + 0x9ABA, 0x6BE2, 0x9ABB, 0x6BE3, 0x9ABC, 0x6BE4, 0x9ABD, 0x6BE5, 0x9ABE, 0x6BE6, 0x9ABF, 0x6BE7, 0x9AC0, 0x6BE8, 0x9AC1, 0x6BE9, + 0x9AC2, 0x6BEC, 0x9AC3, 0x6BED, 0x9AC4, 0x6BEE, 0x9AC5, 0x6BF0, 0x9AC6, 0x6BF1, 0x9AC7, 0x6BF2, 0x9AC8, 0x6BF4, 0x9AC9, 0x6BF6, + 0x9ACA, 0x6BF7, 0x9ACB, 0x6BF8, 0x9ACC, 0x6BFA, 0x9ACD, 0x6BFB, 0x9ACE, 0x6BFC, 0x9ACF, 0x6BFE, 0x9AD0, 0x6BFF, 0x9AD1, 0x6C00, + 0x9AD2, 0x6C01, 0x9AD3, 0x6C02, 0x9AD4, 0x6C03, 0x9AD5, 0x6C04, 0x9AD6, 0x6C08, 0x9AD7, 0x6C09, 0x9AD8, 0x6C0A, 0x9AD9, 0x6C0B, + 0x9ADA, 0x6C0C, 0x9ADB, 0x6C0E, 0x9ADC, 0x6C12, 0x9ADD, 0x6C17, 0x9ADE, 0x6C1C, 0x9ADF, 0x6C1D, 0x9AE0, 0x6C1E, 0x9AE1, 0x6C20, + 0x9AE2, 0x6C23, 0x9AE3, 0x6C25, 0x9AE4, 0x6C2B, 0x9AE5, 0x6C2C, 0x9AE6, 0x6C2D, 0x9AE7, 0x6C31, 0x9AE8, 0x6C33, 0x9AE9, 0x6C36, + 0x9AEA, 0x6C37, 0x9AEB, 0x6C39, 0x9AEC, 0x6C3A, 0x9AED, 0x6C3B, 0x9AEE, 0x6C3C, 0x9AEF, 0x6C3E, 0x9AF0, 0x6C3F, 0x9AF1, 0x6C43, + 0x9AF2, 0x6C44, 0x9AF3, 0x6C45, 0x9AF4, 0x6C48, 0x9AF5, 0x6C4B, 0x9AF6, 0x6C4C, 0x9AF7, 0x6C4D, 0x9AF8, 0x6C4E, 0x9AF9, 0x6C4F, + 0x9AFA, 0x6C51, 0x9AFB, 0x6C52, 0x9AFC, 0x6C53, 0x9AFD, 0x6C56, 0x9AFE, 0x6C58, 0x9B40, 0x6C59, 0x9B41, 0x6C5A, 0x9B42, 0x6C62, + 0x9B43, 0x6C63, 0x9B44, 0x6C65, 0x9B45, 0x6C66, 0x9B46, 0x6C67, 0x9B47, 0x6C6B, 0x9B48, 0x6C6C, 0x9B49, 0x6C6D, 0x9B4A, 0x6C6E, + 0x9B4B, 0x6C6F, 0x9B4C, 0x6C71, 0x9B4D, 0x6C73, 0x9B4E, 0x6C75, 0x9B4F, 0x6C77, 0x9B50, 0x6C78, 0x9B51, 0x6C7A, 0x9B52, 0x6C7B, + 0x9B53, 0x6C7C, 0x9B54, 0x6C7F, 0x9B55, 0x6C80, 0x9B56, 0x6C84, 0x9B57, 0x6C87, 0x9B58, 0x6C8A, 0x9B59, 0x6C8B, 0x9B5A, 0x6C8D, + 0x9B5B, 0x6C8E, 0x9B5C, 0x6C91, 0x9B5D, 0x6C92, 0x9B5E, 0x6C95, 0x9B5F, 0x6C96, 0x9B60, 0x6C97, 0x9B61, 0x6C98, 0x9B62, 0x6C9A, + 0x9B63, 0x6C9C, 0x9B64, 0x6C9D, 0x9B65, 0x6C9E, 0x9B66, 0x6CA0, 0x9B67, 0x6CA2, 0x9B68, 0x6CA8, 0x9B69, 0x6CAC, 0x9B6A, 0x6CAF, + 0x9B6B, 0x6CB0, 0x9B6C, 0x6CB4, 0x9B6D, 0x6CB5, 0x9B6E, 0x6CB6, 0x9B6F, 0x6CB7, 0x9B70, 0x6CBA, 0x9B71, 0x6CC0, 0x9B72, 0x6CC1, + 0x9B73, 0x6CC2, 0x9B74, 0x6CC3, 0x9B75, 0x6CC6, 0x9B76, 0x6CC7, 0x9B77, 0x6CC8, 0x9B78, 0x6CCB, 0x9B79, 0x6CCD, 0x9B7A, 0x6CCE, + 0x9B7B, 0x6CCF, 0x9B7C, 0x6CD1, 0x9B7D, 0x6CD2, 0x9B7E, 0x6CD8, 0x9B80, 0x6CD9, 0x9B81, 0x6CDA, 0x9B82, 0x6CDC, 0x9B83, 0x6CDD, + 0x9B84, 0x6CDF, 0x9B85, 0x6CE4, 0x9B86, 0x6CE6, 0x9B87, 0x6CE7, 0x9B88, 0x6CE9, 0x9B89, 0x6CEC, 0x9B8A, 0x6CED, 0x9B8B, 0x6CF2, + 0x9B8C, 0x6CF4, 0x9B8D, 0x6CF9, 0x9B8E, 0x6CFF, 0x9B8F, 0x6D00, 0x9B90, 0x6D02, 0x9B91, 0x6D03, 0x9B92, 0x6D05, 0x9B93, 0x6D06, + 0x9B94, 0x6D08, 0x9B95, 0x6D09, 0x9B96, 0x6D0A, 0x9B97, 0x6D0D, 0x9B98, 0x6D0F, 0x9B99, 0x6D10, 0x9B9A, 0x6D11, 0x9B9B, 0x6D13, + 0x9B9C, 0x6D14, 0x9B9D, 0x6D15, 0x9B9E, 0x6D16, 0x9B9F, 0x6D18, 0x9BA0, 0x6D1C, 0x9BA1, 0x6D1D, 0x9BA2, 0x6D1F, 0x9BA3, 0x6D20, + 0x9BA4, 0x6D21, 0x9BA5, 0x6D22, 0x9BA6, 0x6D23, 0x9BA7, 0x6D24, 0x9BA8, 0x6D26, 0x9BA9, 0x6D28, 0x9BAA, 0x6D29, 0x9BAB, 0x6D2C, + 0x9BAC, 0x6D2D, 0x9BAD, 0x6D2F, 0x9BAE, 0x6D30, 0x9BAF, 0x6D34, 0x9BB0, 0x6D36, 0x9BB1, 0x6D37, 0x9BB2, 0x6D38, 0x9BB3, 0x6D3A, + 0x9BB4, 0x6D3F, 0x9BB5, 0x6D40, 0x9BB6, 0x6D42, 0x9BB7, 0x6D44, 0x9BB8, 0x6D49, 0x9BB9, 0x6D4C, 0x9BBA, 0x6D50, 0x9BBB, 0x6D55, + 0x9BBC, 0x6D56, 0x9BBD, 0x6D57, 0x9BBE, 0x6D58, 0x9BBF, 0x6D5B, 0x9BC0, 0x6D5D, 0x9BC1, 0x6D5F, 0x9BC2, 0x6D61, 0x9BC3, 0x6D62, + 0x9BC4, 0x6D64, 0x9BC5, 0x6D65, 0x9BC6, 0x6D67, 0x9BC7, 0x6D68, 0x9BC8, 0x6D6B, 0x9BC9, 0x6D6C, 0x9BCA, 0x6D6D, 0x9BCB, 0x6D70, + 0x9BCC, 0x6D71, 0x9BCD, 0x6D72, 0x9BCE, 0x6D73, 0x9BCF, 0x6D75, 0x9BD0, 0x6D76, 0x9BD1, 0x6D79, 0x9BD2, 0x6D7A, 0x9BD3, 0x6D7B, + 0x9BD4, 0x6D7D, 0x9BD5, 0x6D7E, 0x9BD6, 0x6D7F, 0x9BD7, 0x6D80, 0x9BD8, 0x6D81, 0x9BD9, 0x6D83, 0x9BDA, 0x6D84, 0x9BDB, 0x6D86, + 0x9BDC, 0x6D87, 0x9BDD, 0x6D8A, 0x9BDE, 0x6D8B, 0x9BDF, 0x6D8D, 0x9BE0, 0x6D8F, 0x9BE1, 0x6D90, 0x9BE2, 0x6D92, 0x9BE3, 0x6D96, + 0x9BE4, 0x6D97, 0x9BE5, 0x6D98, 0x9BE6, 0x6D99, 0x9BE7, 0x6D9A, 0x9BE8, 0x6D9C, 0x9BE9, 0x6DA2, 0x9BEA, 0x6DA5, 0x9BEB, 0x6DAC, + 0x9BEC, 0x6DAD, 0x9BED, 0x6DB0, 0x9BEE, 0x6DB1, 0x9BEF, 0x6DB3, 0x9BF0, 0x6DB4, 0x9BF1, 0x6DB6, 0x9BF2, 0x6DB7, 0x9BF3, 0x6DB9, + 0x9BF4, 0x6DBA, 0x9BF5, 0x6DBB, 0x9BF6, 0x6DBC, 0x9BF7, 0x6DBD, 0x9BF8, 0x6DBE, 0x9BF9, 0x6DC1, 0x9BFA, 0x6DC2, 0x9BFB, 0x6DC3, + 0x9BFC, 0x6DC8, 0x9BFD, 0x6DC9, 0x9BFE, 0x6DCA, 0x9C40, 0x6DCD, 0x9C41, 0x6DCE, 0x9C42, 0x6DCF, 0x9C43, 0x6DD0, 0x9C44, 0x6DD2, + 0x9C45, 0x6DD3, 0x9C46, 0x6DD4, 0x9C47, 0x6DD5, 0x9C48, 0x6DD7, 0x9C49, 0x6DDA, 0x9C4A, 0x6DDB, 0x9C4B, 0x6DDC, 0x9C4C, 0x6DDF, + 0x9C4D, 0x6DE2, 0x9C4E, 0x6DE3, 0x9C4F, 0x6DE5, 0x9C50, 0x6DE7, 0x9C51, 0x6DE8, 0x9C52, 0x6DE9, 0x9C53, 0x6DEA, 0x9C54, 0x6DED, + 0x9C55, 0x6DEF, 0x9C56, 0x6DF0, 0x9C57, 0x6DF2, 0x9C58, 0x6DF4, 0x9C59, 0x6DF5, 0x9C5A, 0x6DF6, 0x9C5B, 0x6DF8, 0x9C5C, 0x6DFA, + 0x9C5D, 0x6DFD, 0x9C5E, 0x6DFE, 0x9C5F, 0x6DFF, 0x9C60, 0x6E00, 0x9C61, 0x6E01, 0x9C62, 0x6E02, 0x9C63, 0x6E03, 0x9C64, 0x6E04, + 0x9C65, 0x6E06, 0x9C66, 0x6E07, 0x9C67, 0x6E08, 0x9C68, 0x6E09, 0x9C69, 0x6E0B, 0x9C6A, 0x6E0F, 0x9C6B, 0x6E12, 0x9C6C, 0x6E13, + 0x9C6D, 0x6E15, 0x9C6E, 0x6E18, 0x9C6F, 0x6E19, 0x9C70, 0x6E1B, 0x9C71, 0x6E1C, 0x9C72, 0x6E1E, 0x9C73, 0x6E1F, 0x9C74, 0x6E22, + 0x9C75, 0x6E26, 0x9C76, 0x6E27, 0x9C77, 0x6E28, 0x9C78, 0x6E2A, 0x9C79, 0x6E2C, 0x9C7A, 0x6E2E, 0x9C7B, 0x6E30, 0x9C7C, 0x6E31, + 0x9C7D, 0x6E33, 0x9C7E, 0x6E35, 0x9C80, 0x6E36, 0x9C81, 0x6E37, 0x9C82, 0x6E39, 0x9C83, 0x6E3B, 0x9C84, 0x6E3C, 0x9C85, 0x6E3D, + 0x9C86, 0x6E3E, 0x9C87, 0x6E3F, 0x9C88, 0x6E40, 0x9C89, 0x6E41, 0x9C8A, 0x6E42, 0x9C8B, 0x6E45, 0x9C8C, 0x6E46, 0x9C8D, 0x6E47, + 0x9C8E, 0x6E48, 0x9C8F, 0x6E49, 0x9C90, 0x6E4A, 0x9C91, 0x6E4B, 0x9C92, 0x6E4C, 0x9C93, 0x6E4F, 0x9C94, 0x6E50, 0x9C95, 0x6E51, + 0x9C96, 0x6E52, 0x9C97, 0x6E55, 0x9C98, 0x6E57, 0x9C99, 0x6E59, 0x9C9A, 0x6E5A, 0x9C9B, 0x6E5C, 0x9C9C, 0x6E5D, 0x9C9D, 0x6E5E, + 0x9C9E, 0x6E60, 0x9C9F, 0x6E61, 0x9CA0, 0x6E62, 0x9CA1, 0x6E63, 0x9CA2, 0x6E64, 0x9CA3, 0x6E65, 0x9CA4, 0x6E66, 0x9CA5, 0x6E67, + 0x9CA6, 0x6E68, 0x9CA7, 0x6E69, 0x9CA8, 0x6E6A, 0x9CA9, 0x6E6C, 0x9CAA, 0x6E6D, 0x9CAB, 0x6E6F, 0x9CAC, 0x6E70, 0x9CAD, 0x6E71, + 0x9CAE, 0x6E72, 0x9CAF, 0x6E73, 0x9CB0, 0x6E74, 0x9CB1, 0x6E75, 0x9CB2, 0x6E76, 0x9CB3, 0x6E77, 0x9CB4, 0x6E78, 0x9CB5, 0x6E79, + 0x9CB6, 0x6E7A, 0x9CB7, 0x6E7B, 0x9CB8, 0x6E7C, 0x9CB9, 0x6E7D, 0x9CBA, 0x6E80, 0x9CBB, 0x6E81, 0x9CBC, 0x6E82, 0x9CBD, 0x6E84, + 0x9CBE, 0x6E87, 0x9CBF, 0x6E88, 0x9CC0, 0x6E8A, 0x9CC1, 0x6E8B, 0x9CC2, 0x6E8C, 0x9CC3, 0x6E8D, 0x9CC4, 0x6E8E, 0x9CC5, 0x6E91, + 0x9CC6, 0x6E92, 0x9CC7, 0x6E93, 0x9CC8, 0x6E94, 0x9CC9, 0x6E95, 0x9CCA, 0x6E96, 0x9CCB, 0x6E97, 0x9CCC, 0x6E99, 0x9CCD, 0x6E9A, + 0x9CCE, 0x6E9B, 0x9CCF, 0x6E9D, 0x9CD0, 0x6E9E, 0x9CD1, 0x6EA0, 0x9CD2, 0x6EA1, 0x9CD3, 0x6EA3, 0x9CD4, 0x6EA4, 0x9CD5, 0x6EA6, + 0x9CD6, 0x6EA8, 0x9CD7, 0x6EA9, 0x9CD8, 0x6EAB, 0x9CD9, 0x6EAC, 0x9CDA, 0x6EAD, 0x9CDB, 0x6EAE, 0x9CDC, 0x6EB0, 0x9CDD, 0x6EB3, + 0x9CDE, 0x6EB5, 0x9CDF, 0x6EB8, 0x9CE0, 0x6EB9, 0x9CE1, 0x6EBC, 0x9CE2, 0x6EBE, 0x9CE3, 0x6EBF, 0x9CE4, 0x6EC0, 0x9CE5, 0x6EC3, + 0x9CE6, 0x6EC4, 0x9CE7, 0x6EC5, 0x9CE8, 0x6EC6, 0x9CE9, 0x6EC8, 0x9CEA, 0x6EC9, 0x9CEB, 0x6ECA, 0x9CEC, 0x6ECC, 0x9CED, 0x6ECD, + 0x9CEE, 0x6ECE, 0x9CEF, 0x6ED0, 0x9CF0, 0x6ED2, 0x9CF1, 0x6ED6, 0x9CF2, 0x6ED8, 0x9CF3, 0x6ED9, 0x9CF4, 0x6EDB, 0x9CF5, 0x6EDC, + 0x9CF6, 0x6EDD, 0x9CF7, 0x6EE3, 0x9CF8, 0x6EE7, 0x9CF9, 0x6EEA, 0x9CFA, 0x6EEB, 0x9CFB, 0x6EEC, 0x9CFC, 0x6EED, 0x9CFD, 0x6EEE, + 0x9CFE, 0x6EEF, 0x9D40, 0x6EF0, 0x9D41, 0x6EF1, 0x9D42, 0x6EF2, 0x9D43, 0x6EF3, 0x9D44, 0x6EF5, 0x9D45, 0x6EF6, 0x9D46, 0x6EF7, + 0x9D47, 0x6EF8, 0x9D48, 0x6EFA, 0x9D49, 0x6EFB, 0x9D4A, 0x6EFC, 0x9D4B, 0x6EFD, 0x9D4C, 0x6EFE, 0x9D4D, 0x6EFF, 0x9D4E, 0x6F00, + 0x9D4F, 0x6F01, 0x9D50, 0x6F03, 0x9D51, 0x6F04, 0x9D52, 0x6F05, 0x9D53, 0x6F07, 0x9D54, 0x6F08, 0x9D55, 0x6F0A, 0x9D56, 0x6F0B, + 0x9D57, 0x6F0C, 0x9D58, 0x6F0D, 0x9D59, 0x6F0E, 0x9D5A, 0x6F10, 0x9D5B, 0x6F11, 0x9D5C, 0x6F12, 0x9D5D, 0x6F16, 0x9D5E, 0x6F17, + 0x9D5F, 0x6F18, 0x9D60, 0x6F19, 0x9D61, 0x6F1A, 0x9D62, 0x6F1B, 0x9D63, 0x6F1C, 0x9D64, 0x6F1D, 0x9D65, 0x6F1E, 0x9D66, 0x6F1F, + 0x9D67, 0x6F21, 0x9D68, 0x6F22, 0x9D69, 0x6F23, 0x9D6A, 0x6F25, 0x9D6B, 0x6F26, 0x9D6C, 0x6F27, 0x9D6D, 0x6F28, 0x9D6E, 0x6F2C, + 0x9D6F, 0x6F2E, 0x9D70, 0x6F30, 0x9D71, 0x6F32, 0x9D72, 0x6F34, 0x9D73, 0x6F35, 0x9D74, 0x6F37, 0x9D75, 0x6F38, 0x9D76, 0x6F39, + 0x9D77, 0x6F3A, 0x9D78, 0x6F3B, 0x9D79, 0x6F3C, 0x9D7A, 0x6F3D, 0x9D7B, 0x6F3F, 0x9D7C, 0x6F40, 0x9D7D, 0x6F41, 0x9D7E, 0x6F42, + 0x9D80, 0x6F43, 0x9D81, 0x6F44, 0x9D82, 0x6F45, 0x9D83, 0x6F48, 0x9D84, 0x6F49, 0x9D85, 0x6F4A, 0x9D86, 0x6F4C, 0x9D87, 0x6F4E, + 0x9D88, 0x6F4F, 0x9D89, 0x6F50, 0x9D8A, 0x6F51, 0x9D8B, 0x6F52, 0x9D8C, 0x6F53, 0x9D8D, 0x6F54, 0x9D8E, 0x6F55, 0x9D8F, 0x6F56, + 0x9D90, 0x6F57, 0x9D91, 0x6F59, 0x9D92, 0x6F5A, 0x9D93, 0x6F5B, 0x9D94, 0x6F5D, 0x9D95, 0x6F5F, 0x9D96, 0x6F60, 0x9D97, 0x6F61, + 0x9D98, 0x6F63, 0x9D99, 0x6F64, 0x9D9A, 0x6F65, 0x9D9B, 0x6F67, 0x9D9C, 0x6F68, 0x9D9D, 0x6F69, 0x9D9E, 0x6F6A, 0x9D9F, 0x6F6B, + 0x9DA0, 0x6F6C, 0x9DA1, 0x6F6F, 0x9DA2, 0x6F70, 0x9DA3, 0x6F71, 0x9DA4, 0x6F73, 0x9DA5, 0x6F75, 0x9DA6, 0x6F76, 0x9DA7, 0x6F77, + 0x9DA8, 0x6F79, 0x9DA9, 0x6F7B, 0x9DAA, 0x6F7D, 0x9DAB, 0x6F7E, 0x9DAC, 0x6F7F, 0x9DAD, 0x6F80, 0x9DAE, 0x6F81, 0x9DAF, 0x6F82, + 0x9DB0, 0x6F83, 0x9DB1, 0x6F85, 0x9DB2, 0x6F86, 0x9DB3, 0x6F87, 0x9DB4, 0x6F8A, 0x9DB5, 0x6F8B, 0x9DB6, 0x6F8F, 0x9DB7, 0x6F90, + 0x9DB8, 0x6F91, 0x9DB9, 0x6F92, 0x9DBA, 0x6F93, 0x9DBB, 0x6F94, 0x9DBC, 0x6F95, 0x9DBD, 0x6F96, 0x9DBE, 0x6F97, 0x9DBF, 0x6F98, + 0x9DC0, 0x6F99, 0x9DC1, 0x6F9A, 0x9DC2, 0x6F9B, 0x9DC3, 0x6F9D, 0x9DC4, 0x6F9E, 0x9DC5, 0x6F9F, 0x9DC6, 0x6FA0, 0x9DC7, 0x6FA2, + 0x9DC8, 0x6FA3, 0x9DC9, 0x6FA4, 0x9DCA, 0x6FA5, 0x9DCB, 0x6FA6, 0x9DCC, 0x6FA8, 0x9DCD, 0x6FA9, 0x9DCE, 0x6FAA, 0x9DCF, 0x6FAB, + 0x9DD0, 0x6FAC, 0x9DD1, 0x6FAD, 0x9DD2, 0x6FAE, 0x9DD3, 0x6FAF, 0x9DD4, 0x6FB0, 0x9DD5, 0x6FB1, 0x9DD6, 0x6FB2, 0x9DD7, 0x6FB4, + 0x9DD8, 0x6FB5, 0x9DD9, 0x6FB7, 0x9DDA, 0x6FB8, 0x9DDB, 0x6FBA, 0x9DDC, 0x6FBB, 0x9DDD, 0x6FBC, 0x9DDE, 0x6FBD, 0x9DDF, 0x6FBE, + 0x9DE0, 0x6FBF, 0x9DE1, 0x6FC1, 0x9DE2, 0x6FC3, 0x9DE3, 0x6FC4, 0x9DE4, 0x6FC5, 0x9DE5, 0x6FC6, 0x9DE6, 0x6FC7, 0x9DE7, 0x6FC8, + 0x9DE8, 0x6FCA, 0x9DE9, 0x6FCB, 0x9DEA, 0x6FCC, 0x9DEB, 0x6FCD, 0x9DEC, 0x6FCE, 0x9DED, 0x6FCF, 0x9DEE, 0x6FD0, 0x9DEF, 0x6FD3, + 0x9DF0, 0x6FD4, 0x9DF1, 0x6FD5, 0x9DF2, 0x6FD6, 0x9DF3, 0x6FD7, 0x9DF4, 0x6FD8, 0x9DF5, 0x6FD9, 0x9DF6, 0x6FDA, 0x9DF7, 0x6FDB, + 0x9DF8, 0x6FDC, 0x9DF9, 0x6FDD, 0x9DFA, 0x6FDF, 0x9DFB, 0x6FE2, 0x9DFC, 0x6FE3, 0x9DFD, 0x6FE4, 0x9DFE, 0x6FE5, 0x9E40, 0x6FE6, + 0x9E41, 0x6FE7, 0x9E42, 0x6FE8, 0x9E43, 0x6FE9, 0x9E44, 0x6FEA, 0x9E45, 0x6FEB, 0x9E46, 0x6FEC, 0x9E47, 0x6FED, 0x9E48, 0x6FF0, + 0x9E49, 0x6FF1, 0x9E4A, 0x6FF2, 0x9E4B, 0x6FF3, 0x9E4C, 0x6FF4, 0x9E4D, 0x6FF5, 0x9E4E, 0x6FF6, 0x9E4F, 0x6FF7, 0x9E50, 0x6FF8, + 0x9E51, 0x6FF9, 0x9E52, 0x6FFA, 0x9E53, 0x6FFB, 0x9E54, 0x6FFC, 0x9E55, 0x6FFD, 0x9E56, 0x6FFE, 0x9E57, 0x6FFF, 0x9E58, 0x7000, + 0x9E59, 0x7001, 0x9E5A, 0x7002, 0x9E5B, 0x7003, 0x9E5C, 0x7004, 0x9E5D, 0x7005, 0x9E5E, 0x7006, 0x9E5F, 0x7007, 0x9E60, 0x7008, + 0x9E61, 0x7009, 0x9E62, 0x700A, 0x9E63, 0x700B, 0x9E64, 0x700C, 0x9E65, 0x700D, 0x9E66, 0x700E, 0x9E67, 0x700F, 0x9E68, 0x7010, + 0x9E69, 0x7012, 0x9E6A, 0x7013, 0x9E6B, 0x7014, 0x9E6C, 0x7015, 0x9E6D, 0x7016, 0x9E6E, 0x7017, 0x9E6F, 0x7018, 0x9E70, 0x7019, + 0x9E71, 0x701C, 0x9E72, 0x701D, 0x9E73, 0x701E, 0x9E74, 0x701F, 0x9E75, 0x7020, 0x9E76, 0x7021, 0x9E77, 0x7022, 0x9E78, 0x7024, + 0x9E79, 0x7025, 0x9E7A, 0x7026, 0x9E7B, 0x7027, 0x9E7C, 0x7028, 0x9E7D, 0x7029, 0x9E7E, 0x702A, 0x9E80, 0x702B, 0x9E81, 0x702C, + 0x9E82, 0x702D, 0x9E83, 0x702E, 0x9E84, 0x702F, 0x9E85, 0x7030, 0x9E86, 0x7031, 0x9E87, 0x7032, 0x9E88, 0x7033, 0x9E89, 0x7034, + 0x9E8A, 0x7036, 0x9E8B, 0x7037, 0x9E8C, 0x7038, 0x9E8D, 0x703A, 0x9E8E, 0x703B, 0x9E8F, 0x703C, 0x9E90, 0x703D, 0x9E91, 0x703E, + 0x9E92, 0x703F, 0x9E93, 0x7040, 0x9E94, 0x7041, 0x9E95, 0x7042, 0x9E96, 0x7043, 0x9E97, 0x7044, 0x9E98, 0x7045, 0x9E99, 0x7046, + 0x9E9A, 0x7047, 0x9E9B, 0x7048, 0x9E9C, 0x7049, 0x9E9D, 0x704A, 0x9E9E, 0x704B, 0x9E9F, 0x704D, 0x9EA0, 0x704E, 0x9EA1, 0x7050, + 0x9EA2, 0x7051, 0x9EA3, 0x7052, 0x9EA4, 0x7053, 0x9EA5, 0x7054, 0x9EA6, 0x7055, 0x9EA7, 0x7056, 0x9EA8, 0x7057, 0x9EA9, 0x7058, + 0x9EAA, 0x7059, 0x9EAB, 0x705A, 0x9EAC, 0x705B, 0x9EAD, 0x705C, 0x9EAE, 0x705D, 0x9EAF, 0x705F, 0x9EB0, 0x7060, 0x9EB1, 0x7061, + 0x9EB2, 0x7062, 0x9EB3, 0x7063, 0x9EB4, 0x7064, 0x9EB5, 0x7065, 0x9EB6, 0x7066, 0x9EB7, 0x7067, 0x9EB8, 0x7068, 0x9EB9, 0x7069, + 0x9EBA, 0x706A, 0x9EBB, 0x706E, 0x9EBC, 0x7071, 0x9EBD, 0x7072, 0x9EBE, 0x7073, 0x9EBF, 0x7074, 0x9EC0, 0x7077, 0x9EC1, 0x7079, + 0x9EC2, 0x707A, 0x9EC3, 0x707B, 0x9EC4, 0x707D, 0x9EC5, 0x7081, 0x9EC6, 0x7082, 0x9EC7, 0x7083, 0x9EC8, 0x7084, 0x9EC9, 0x7086, + 0x9ECA, 0x7087, 0x9ECB, 0x7088, 0x9ECC, 0x708B, 0x9ECD, 0x708C, 0x9ECE, 0x708D, 0x9ECF, 0x708F, 0x9ED0, 0x7090, 0x9ED1, 0x7091, + 0x9ED2, 0x7093, 0x9ED3, 0x7097, 0x9ED4, 0x7098, 0x9ED5, 0x709A, 0x9ED6, 0x709B, 0x9ED7, 0x709E, 0x9ED8, 0x709F, 0x9ED9, 0x70A0, + 0x9EDA, 0x70A1, 0x9EDB, 0x70A2, 0x9EDC, 0x70A3, 0x9EDD, 0x70A4, 0x9EDE, 0x70A5, 0x9EDF, 0x70A6, 0x9EE0, 0x70A7, 0x9EE1, 0x70A8, + 0x9EE2, 0x70A9, 0x9EE3, 0x70AA, 0x9EE4, 0x70B0, 0x9EE5, 0x70B2, 0x9EE6, 0x70B4, 0x9EE7, 0x70B5, 0x9EE8, 0x70B6, 0x9EE9, 0x70BA, + 0x9EEA, 0x70BE, 0x9EEB, 0x70BF, 0x9EEC, 0x70C4, 0x9EED, 0x70C5, 0x9EEE, 0x70C6, 0x9EEF, 0x70C7, 0x9EF0, 0x70C9, 0x9EF1, 0x70CB, + 0x9EF2, 0x70CC, 0x9EF3, 0x70CD, 0x9EF4, 0x70CE, 0x9EF5, 0x70CF, 0x9EF6, 0x70D0, 0x9EF7, 0x70D1, 0x9EF8, 0x70D2, 0x9EF9, 0x70D3, + 0x9EFA, 0x70D4, 0x9EFB, 0x70D5, 0x9EFC, 0x70D6, 0x9EFD, 0x70D7, 0x9EFE, 0x70DA, 0x9F40, 0x70DC, 0x9F41, 0x70DD, 0x9F42, 0x70DE, + 0x9F43, 0x70E0, 0x9F44, 0x70E1, 0x9F45, 0x70E2, 0x9F46, 0x70E3, 0x9F47, 0x70E5, 0x9F48, 0x70EA, 0x9F49, 0x70EE, 0x9F4A, 0x70F0, + 0x9F4B, 0x70F1, 0x9F4C, 0x70F2, 0x9F4D, 0x70F3, 0x9F4E, 0x70F4, 0x9F4F, 0x70F5, 0x9F50, 0x70F6, 0x9F51, 0x70F8, 0x9F52, 0x70FA, + 0x9F53, 0x70FB, 0x9F54, 0x70FC, 0x9F55, 0x70FE, 0x9F56, 0x70FF, 0x9F57, 0x7100, 0x9F58, 0x7101, 0x9F59, 0x7102, 0x9F5A, 0x7103, + 0x9F5B, 0x7104, 0x9F5C, 0x7105, 0x9F5D, 0x7106, 0x9F5E, 0x7107, 0x9F5F, 0x7108, 0x9F60, 0x710B, 0x9F61, 0x710C, 0x9F62, 0x710D, + 0x9F63, 0x710E, 0x9F64, 0x710F, 0x9F65, 0x7111, 0x9F66, 0x7112, 0x9F67, 0x7114, 0x9F68, 0x7117, 0x9F69, 0x711B, 0x9F6A, 0x711C, + 0x9F6B, 0x711D, 0x9F6C, 0x711E, 0x9F6D, 0x711F, 0x9F6E, 0x7120, 0x9F6F, 0x7121, 0x9F70, 0x7122, 0x9F71, 0x7123, 0x9F72, 0x7124, + 0x9F73, 0x7125, 0x9F74, 0x7127, 0x9F75, 0x7128, 0x9F76, 0x7129, 0x9F77, 0x712A, 0x9F78, 0x712B, 0x9F79, 0x712C, 0x9F7A, 0x712D, + 0x9F7B, 0x712E, 0x9F7C, 0x7132, 0x9F7D, 0x7133, 0x9F7E, 0x7134, 0x9F80, 0x7135, 0x9F81, 0x7137, 0x9F82, 0x7138, 0x9F83, 0x7139, + 0x9F84, 0x713A, 0x9F85, 0x713B, 0x9F86, 0x713C, 0x9F87, 0x713D, 0x9F88, 0x713E, 0x9F89, 0x713F, 0x9F8A, 0x7140, 0x9F8B, 0x7141, + 0x9F8C, 0x7142, 0x9F8D, 0x7143, 0x9F8E, 0x7144, 0x9F8F, 0x7146, 0x9F90, 0x7147, 0x9F91, 0x7148, 0x9F92, 0x7149, 0x9F93, 0x714B, + 0x9F94, 0x714D, 0x9F95, 0x714F, 0x9F96, 0x7150, 0x9F97, 0x7151, 0x9F98, 0x7152, 0x9F99, 0x7153, 0x9F9A, 0x7154, 0x9F9B, 0x7155, + 0x9F9C, 0x7156, 0x9F9D, 0x7157, 0x9F9E, 0x7158, 0x9F9F, 0x7159, 0x9FA0, 0x715A, 0x9FA1, 0x715B, 0x9FA2, 0x715D, 0x9FA3, 0x715F, + 0x9FA4, 0x7160, 0x9FA5, 0x7161, 0x9FA6, 0x7162, 0x9FA7, 0x7163, 0x9FA8, 0x7165, 0x9FA9, 0x7169, 0x9FAA, 0x716A, 0x9FAB, 0x716B, + 0x9FAC, 0x716C, 0x9FAD, 0x716D, 0x9FAE, 0x716F, 0x9FAF, 0x7170, 0x9FB0, 0x7171, 0x9FB1, 0x7174, 0x9FB2, 0x7175, 0x9FB3, 0x7176, + 0x9FB4, 0x7177, 0x9FB5, 0x7179, 0x9FB6, 0x717B, 0x9FB7, 0x717C, 0x9FB8, 0x717E, 0x9FB9, 0x717F, 0x9FBA, 0x7180, 0x9FBB, 0x7181, + 0x9FBC, 0x7182, 0x9FBD, 0x7183, 0x9FBE, 0x7185, 0x9FBF, 0x7186, 0x9FC0, 0x7187, 0x9FC1, 0x7188, 0x9FC2, 0x7189, 0x9FC3, 0x718B, + 0x9FC4, 0x718C, 0x9FC5, 0x718D, 0x9FC6, 0x718E, 0x9FC7, 0x7190, 0x9FC8, 0x7191, 0x9FC9, 0x7192, 0x9FCA, 0x7193, 0x9FCB, 0x7195, + 0x9FCC, 0x7196, 0x9FCD, 0x7197, 0x9FCE, 0x719A, 0x9FCF, 0x719B, 0x9FD0, 0x719C, 0x9FD1, 0x719D, 0x9FD2, 0x719E, 0x9FD3, 0x71A1, + 0x9FD4, 0x71A2, 0x9FD5, 0x71A3, 0x9FD6, 0x71A4, 0x9FD7, 0x71A5, 0x9FD8, 0x71A6, 0x9FD9, 0x71A7, 0x9FDA, 0x71A9, 0x9FDB, 0x71AA, + 0x9FDC, 0x71AB, 0x9FDD, 0x71AD, 0x9FDE, 0x71AE, 0x9FDF, 0x71AF, 0x9FE0, 0x71B0, 0x9FE1, 0x71B1, 0x9FE2, 0x71B2, 0x9FE3, 0x71B4, + 0x9FE4, 0x71B6, 0x9FE5, 0x71B7, 0x9FE6, 0x71B8, 0x9FE7, 0x71BA, 0x9FE8, 0x71BB, 0x9FE9, 0x71BC, 0x9FEA, 0x71BD, 0x9FEB, 0x71BE, + 0x9FEC, 0x71BF, 0x9FED, 0x71C0, 0x9FEE, 0x71C1, 0x9FEF, 0x71C2, 0x9FF0, 0x71C4, 0x9FF1, 0x71C5, 0x9FF2, 0x71C6, 0x9FF3, 0x71C7, + 0x9FF4, 0x71C8, 0x9FF5, 0x71C9, 0x9FF6, 0x71CA, 0x9FF7, 0x71CB, 0x9FF8, 0x71CC, 0x9FF9, 0x71CD, 0x9FFA, 0x71CF, 0x9FFB, 0x71D0, + 0x9FFC, 0x71D1, 0x9FFD, 0x71D2, 0x9FFE, 0x71D3, 0xA040, 0x71D6, 0xA041, 0x71D7, 0xA042, 0x71D8, 0xA043, 0x71D9, 0xA044, 0x71DA, + 0xA045, 0x71DB, 0xA046, 0x71DC, 0xA047, 0x71DD, 0xA048, 0x71DE, 0xA049, 0x71DF, 0xA04A, 0x71E1, 0xA04B, 0x71E2, 0xA04C, 0x71E3, + 0xA04D, 0x71E4, 0xA04E, 0x71E6, 0xA04F, 0x71E8, 0xA050, 0x71E9, 0xA051, 0x71EA, 0xA052, 0x71EB, 0xA053, 0x71EC, 0xA054, 0x71ED, + 0xA055, 0x71EF, 0xA056, 0x71F0, 0xA057, 0x71F1, 0xA058, 0x71F2, 0xA059, 0x71F3, 0xA05A, 0x71F4, 0xA05B, 0x71F5, 0xA05C, 0x71F6, + 0xA05D, 0x71F7, 0xA05E, 0x71F8, 0xA05F, 0x71FA, 0xA060, 0x71FB, 0xA061, 0x71FC, 0xA062, 0x71FD, 0xA063, 0x71FE, 0xA064, 0x71FF, + 0xA065, 0x7200, 0xA066, 0x7201, 0xA067, 0x7202, 0xA068, 0x7203, 0xA069, 0x7204, 0xA06A, 0x7205, 0xA06B, 0x7207, 0xA06C, 0x7208, + 0xA06D, 0x7209, 0xA06E, 0x720A, 0xA06F, 0x720B, 0xA070, 0x720C, 0xA071, 0x720D, 0xA072, 0x720E, 0xA073, 0x720F, 0xA074, 0x7210, + 0xA075, 0x7211, 0xA076, 0x7212, 0xA077, 0x7213, 0xA078, 0x7214, 0xA079, 0x7215, 0xA07A, 0x7216, 0xA07B, 0x7217, 0xA07C, 0x7218, + 0xA07D, 0x7219, 0xA07E, 0x721A, 0xA080, 0x721B, 0xA081, 0x721C, 0xA082, 0x721E, 0xA083, 0x721F, 0xA084, 0x7220, 0xA085, 0x7221, + 0xA086, 0x7222, 0xA087, 0x7223, 0xA088, 0x7224, 0xA089, 0x7225, 0xA08A, 0x7226, 0xA08B, 0x7227, 0xA08C, 0x7229, 0xA08D, 0x722B, + 0xA08E, 0x722D, 0xA08F, 0x722E, 0xA090, 0x722F, 0xA091, 0x7232, 0xA092, 0x7233, 0xA093, 0x7234, 0xA094, 0x723A, 0xA095, 0x723C, + 0xA096, 0x723E, 0xA097, 0x7240, 0xA098, 0x7241, 0xA099, 0x7242, 0xA09A, 0x7243, 0xA09B, 0x7244, 0xA09C, 0x7245, 0xA09D, 0x7246, + 0xA09E, 0x7249, 0xA09F, 0x724A, 0xA0A0, 0x724B, 0xA0A1, 0x724E, 0xA0A2, 0x724F, 0xA0A3, 0x7250, 0xA0A4, 0x7251, 0xA0A5, 0x7253, + 0xA0A6, 0x7254, 0xA0A7, 0x7255, 0xA0A8, 0x7257, 0xA0A9, 0x7258, 0xA0AA, 0x725A, 0xA0AB, 0x725C, 0xA0AC, 0x725E, 0xA0AD, 0x7260, + 0xA0AE, 0x7263, 0xA0AF, 0x7264, 0xA0B0, 0x7265, 0xA0B1, 0x7268, 0xA0B2, 0x726A, 0xA0B3, 0x726B, 0xA0B4, 0x726C, 0xA0B5, 0x726D, + 0xA0B6, 0x7270, 0xA0B7, 0x7271, 0xA0B8, 0x7273, 0xA0B9, 0x7274, 0xA0BA, 0x7276, 0xA0BB, 0x7277, 0xA0BC, 0x7278, 0xA0BD, 0x727B, + 0xA0BE, 0x727C, 0xA0BF, 0x727D, 0xA0C0, 0x7282, 0xA0C1, 0x7283, 0xA0C2, 0x7285, 0xA0C3, 0x7286, 0xA0C4, 0x7287, 0xA0C5, 0x7288, + 0xA0C6, 0x7289, 0xA0C7, 0x728C, 0xA0C8, 0x728E, 0xA0C9, 0x7290, 0xA0CA, 0x7291, 0xA0CB, 0x7293, 0xA0CC, 0x7294, 0xA0CD, 0x7295, + 0xA0CE, 0x7296, 0xA0CF, 0x7297, 0xA0D0, 0x7298, 0xA0D1, 0x7299, 0xA0D2, 0x729A, 0xA0D3, 0x729B, 0xA0D4, 0x729C, 0xA0D5, 0x729D, + 0xA0D6, 0x729E, 0xA0D7, 0x72A0, 0xA0D8, 0x72A1, 0xA0D9, 0x72A2, 0xA0DA, 0x72A3, 0xA0DB, 0x72A4, 0xA0DC, 0x72A5, 0xA0DD, 0x72A6, + 0xA0DE, 0x72A7, 0xA0DF, 0x72A8, 0xA0E0, 0x72A9, 0xA0E1, 0x72AA, 0xA0E2, 0x72AB, 0xA0E3, 0x72AE, 0xA0E4, 0x72B1, 0xA0E5, 0x72B2, + 0xA0E6, 0x72B3, 0xA0E7, 0x72B5, 0xA0E8, 0x72BA, 0xA0E9, 0x72BB, 0xA0EA, 0x72BC, 0xA0EB, 0x72BD, 0xA0EC, 0x72BE, 0xA0ED, 0x72BF, + 0xA0EE, 0x72C0, 0xA0EF, 0x72C5, 0xA0F0, 0x72C6, 0xA0F1, 0x72C7, 0xA0F2, 0x72C9, 0xA0F3, 0x72CA, 0xA0F4, 0x72CB, 0xA0F5, 0x72CC, + 0xA0F6, 0x72CF, 0xA0F7, 0x72D1, 0xA0F8, 0x72D3, 0xA0F9, 0x72D4, 0xA0FA, 0x72D5, 0xA0FB, 0x72D6, 0xA0FC, 0x72D8, 0xA0FD, 0x72DA, + 0xA0FE, 0x72DB, 0xA1A1, 0x3000, 0xA1A2, 0x3001, 0xA1A3, 0x3002, 0xA1A4, 0x00B7, 0xA1A5, 0x02C9, 0xA1A6, 0x02C7, 0xA1A7, 0x00A8, + 0xA1A8, 0x3003, 0xA1A9, 0x3005, 0xA1AA, 0x2014, 0xA1AB, 0xFF5E, 0xA1AC, 0x2016, 0xA1AD, 0x2026, 0xA1AE, 0x2018, 0xA1AF, 0x2019, + 0xA1B0, 0x201C, 0xA1B1, 0x201D, 0xA1B2, 0x3014, 0xA1B3, 0x3015, 0xA1B4, 0x3008, 0xA1B5, 0x3009, 0xA1B6, 0x300A, 0xA1B7, 0x300B, + 0xA1B8, 0x300C, 0xA1B9, 0x300D, 0xA1BA, 0x300E, 0xA1BB, 0x300F, 0xA1BC, 0x3016, 0xA1BD, 0x3017, 0xA1BE, 0x3010, 0xA1BF, 0x3011, + 0xA1C0, 0x00B1, 0xA1C1, 0x00D7, 0xA1C2, 0x00F7, 0xA1C3, 0x2236, 0xA1C4, 0x2227, 0xA1C5, 0x2228, 0xA1C6, 0x2211, 0xA1C7, 0x220F, + 0xA1C8, 0x222A, 0xA1C9, 0x2229, 0xA1CA, 0x2208, 0xA1CB, 0x2237, 0xA1CC, 0x221A, 0xA1CD, 0x22A5, 0xA1CE, 0x2225, 0xA1CF, 0x2220, + 0xA1D0, 0x2312, 0xA1D1, 0x2299, 0xA1D2, 0x222B, 0xA1D3, 0x222E, 0xA1D4, 0x2261, 0xA1D5, 0x224C, 0xA1D6, 0x2248, 0xA1D7, 0x223D, + 0xA1D8, 0x221D, 0xA1D9, 0x2260, 0xA1DA, 0x226E, 0xA1DB, 0x226F, 0xA1DC, 0x2264, 0xA1DD, 0x2265, 0xA1DE, 0x221E, 0xA1DF, 0x2235, + 0xA1E0, 0x2234, 0xA1E1, 0x2642, 0xA1E2, 0x2640, 0xA1E3, 0x00B0, 0xA1E4, 0x2032, 0xA1E5, 0x2033, 0xA1E6, 0x2103, 0xA1E7, 0xFF04, + 0xA1E8, 0x00A4, 0xA1E9, 0xFFE0, 0xA1EA, 0xFFE1, 0xA1EB, 0x2030, 0xA1EC, 0x00A7, 0xA1ED, 0x2116, 0xA1EE, 0x2606, 0xA1EF, 0x2605, + 0xA1F0, 0x25CB, 0xA1F1, 0x25CF, 0xA1F2, 0x25CE, 0xA1F3, 0x25C7, 0xA1F4, 0x25C6, 0xA1F5, 0x25A1, 0xA1F6, 0x25A0, 0xA1F7, 0x25B3, + 0xA1F8, 0x25B2, 0xA1F9, 0x203B, 0xA1FA, 0x2192, 0xA1FB, 0x2190, 0xA1FC, 0x2191, 0xA1FD, 0x2193, 0xA1FE, 0x3013, 0xA2A1, 0x2170, + 0xA2A2, 0x2171, 0xA2A3, 0x2172, 0xA2A4, 0x2173, 0xA2A5, 0x2174, 0xA2A6, 0x2175, 0xA2A7, 0x2176, 0xA2A8, 0x2177, 0xA2A9, 0x2178, + 0xA2AA, 0x2179, 0xA2B1, 0x2488, 0xA2B2, 0x2489, 0xA2B3, 0x248A, 0xA2B4, 0x248B, 0xA2B5, 0x248C, 0xA2B6, 0x248D, 0xA2B7, 0x248E, + 0xA2B8, 0x248F, 0xA2B9, 0x2490, 0xA2BA, 0x2491, 0xA2BB, 0x2492, 0xA2BC, 0x2493, 0xA2BD, 0x2494, 0xA2BE, 0x2495, 0xA2BF, 0x2496, + 0xA2C0, 0x2497, 0xA2C1, 0x2498, 0xA2C2, 0x2499, 0xA2C3, 0x249A, 0xA2C4, 0x249B, 0xA2C5, 0x2474, 0xA2C6, 0x2475, 0xA2C7, 0x2476, + 0xA2C8, 0x2477, 0xA2C9, 0x2478, 0xA2CA, 0x2479, 0xA2CB, 0x247A, 0xA2CC, 0x247B, 0xA2CD, 0x247C, 0xA2CE, 0x247D, 0xA2CF, 0x247E, + 0xA2D0, 0x247F, 0xA2D1, 0x2480, 0xA2D2, 0x2481, 0xA2D3, 0x2482, 0xA2D4, 0x2483, 0xA2D5, 0x2484, 0xA2D6, 0x2485, 0xA2D7, 0x2486, + 0xA2D8, 0x2487, 0xA2D9, 0x2460, 0xA2DA, 0x2461, 0xA2DB, 0x2462, 0xA2DC, 0x2463, 0xA2DD, 0x2464, 0xA2DE, 0x2465, 0xA2DF, 0x2466, + 0xA2E0, 0x2467, 0xA2E1, 0x2468, 0xA2E2, 0x2469, 0xA2E5, 0x3220, 0xA2E6, 0x3221, 0xA2E7, 0x3222, 0xA2E8, 0x3223, 0xA2E9, 0x3224, + 0xA2EA, 0x3225, 0xA2EB, 0x3226, 0xA2EC, 0x3227, 0xA2ED, 0x3228, 0xA2EE, 0x3229, 0xA2F1, 0x2160, 0xA2F2, 0x2161, 0xA2F3, 0x2162, + 0xA2F4, 0x2163, 0xA2F5, 0x2164, 0xA2F6, 0x2165, 0xA2F7, 0x2166, 0xA2F8, 0x2167, 0xA2F9, 0x2168, 0xA2FA, 0x2169, 0xA2FB, 0x216A, + 0xA2FC, 0x216B, 0xA3A1, 0xFF01, 0xA3A2, 0xFF02, 0xA3A3, 0xFF03, 0xA3A4, 0xFFE5, 0xA3A5, 0xFF05, 0xA3A6, 0xFF06, 0xA3A7, 0xFF07, + 0xA3A8, 0xFF08, 0xA3A9, 0xFF09, 0xA3AA, 0xFF0A, 0xA3AB, 0xFF0B, 0xA3AC, 0xFF0C, 0xA3AD, 0xFF0D, 0xA3AE, 0xFF0E, 0xA3AF, 0xFF0F, + 0xA3B0, 0xFF10, 0xA3B1, 0xFF11, 0xA3B2, 0xFF12, 0xA3B3, 0xFF13, 0xA3B4, 0xFF14, 0xA3B5, 0xFF15, 0xA3B6, 0xFF16, 0xA3B7, 0xFF17, + 0xA3B8, 0xFF18, 0xA3B9, 0xFF19, 0xA3BA, 0xFF1A, 0xA3BB, 0xFF1B, 0xA3BC, 0xFF1C, 0xA3BD, 0xFF1D, 0xA3BE, 0xFF1E, 0xA3BF, 0xFF1F, + 0xA3C0, 0xFF20, 0xA3C1, 0xFF21, 0xA3C2, 0xFF22, 0xA3C3, 0xFF23, 0xA3C4, 0xFF24, 0xA3C5, 0xFF25, 0xA3C6, 0xFF26, 0xA3C7, 0xFF27, + 0xA3C8, 0xFF28, 0xA3C9, 0xFF29, 0xA3CA, 0xFF2A, 0xA3CB, 0xFF2B, 0xA3CC, 0xFF2C, 0xA3CD, 0xFF2D, 0xA3CE, 0xFF2E, 0xA3CF, 0xFF2F, + 0xA3D0, 0xFF30, 0xA3D1, 0xFF31, 0xA3D2, 0xFF32, 0xA3D3, 0xFF33, 0xA3D4, 0xFF34, 0xA3D5, 0xFF35, 0xA3D6, 0xFF36, 0xA3D7, 0xFF37, + 0xA3D8, 0xFF38, 0xA3D9, 0xFF39, 0xA3DA, 0xFF3A, 0xA3DB, 0xFF3B, 0xA3DC, 0xFF3C, 0xA3DD, 0xFF3D, 0xA3DE, 0xFF3E, 0xA3DF, 0xFF3F, + 0xA3E0, 0xFF40, 0xA3E1, 0xFF41, 0xA3E2, 0xFF42, 0xA3E3, 0xFF43, 0xA3E4, 0xFF44, 0xA3E5, 0xFF45, 0xA3E6, 0xFF46, 0xA3E7, 0xFF47, + 0xA3E8, 0xFF48, 0xA3E9, 0xFF49, 0xA3EA, 0xFF4A, 0xA3EB, 0xFF4B, 0xA3EC, 0xFF4C, 0xA3ED, 0xFF4D, 0xA3EE, 0xFF4E, 0xA3EF, 0xFF4F, + 0xA3F0, 0xFF50, 0xA3F1, 0xFF51, 0xA3F2, 0xFF52, 0xA3F3, 0xFF53, 0xA3F4, 0xFF54, 0xA3F5, 0xFF55, 0xA3F6, 0xFF56, 0xA3F7, 0xFF57, + 0xA3F8, 0xFF58, 0xA3F9, 0xFF59, 0xA3FA, 0xFF5A, 0xA3FB, 0xFF5B, 0xA3FC, 0xFF5C, 0xA3FD, 0xFF5D, 0xA3FE, 0xFFE3, 0xA4A1, 0x3041, + 0xA4A2, 0x3042, 0xA4A3, 0x3043, 0xA4A4, 0x3044, 0xA4A5, 0x3045, 0xA4A6, 0x3046, 0xA4A7, 0x3047, 0xA4A8, 0x3048, 0xA4A9, 0x3049, + 0xA4AA, 0x304A, 0xA4AB, 0x304B, 0xA4AC, 0x304C, 0xA4AD, 0x304D, 0xA4AE, 0x304E, 0xA4AF, 0x304F, 0xA4B0, 0x3050, 0xA4B1, 0x3051, + 0xA4B2, 0x3052, 0xA4B3, 0x3053, 0xA4B4, 0x3054, 0xA4B5, 0x3055, 0xA4B6, 0x3056, 0xA4B7, 0x3057, 0xA4B8, 0x3058, 0xA4B9, 0x3059, + 0xA4BA, 0x305A, 0xA4BB, 0x305B, 0xA4BC, 0x305C, 0xA4BD, 0x305D, 0xA4BE, 0x305E, 0xA4BF, 0x305F, 0xA4C0, 0x3060, 0xA4C1, 0x3061, + 0xA4C2, 0x3062, 0xA4C3, 0x3063, 0xA4C4, 0x3064, 0xA4C5, 0x3065, 0xA4C6, 0x3066, 0xA4C7, 0x3067, 0xA4C8, 0x3068, 0xA4C9, 0x3069, + 0xA4CA, 0x306A, 0xA4CB, 0x306B, 0xA4CC, 0x306C, 0xA4CD, 0x306D, 0xA4CE, 0x306E, 0xA4CF, 0x306F, 0xA4D0, 0x3070, 0xA4D1, 0x3071, + 0xA4D2, 0x3072, 0xA4D3, 0x3073, 0xA4D4, 0x3074, 0xA4D5, 0x3075, 0xA4D6, 0x3076, 0xA4D7, 0x3077, 0xA4D8, 0x3078, 0xA4D9, 0x3079, + 0xA4DA, 0x307A, 0xA4DB, 0x307B, 0xA4DC, 0x307C, 0xA4DD, 0x307D, 0xA4DE, 0x307E, 0xA4DF, 0x307F, 0xA4E0, 0x3080, 0xA4E1, 0x3081, + 0xA4E2, 0x3082, 0xA4E3, 0x3083, 0xA4E4, 0x3084, 0xA4E5, 0x3085, 0xA4E6, 0x3086, 0xA4E7, 0x3087, 0xA4E8, 0x3088, 0xA4E9, 0x3089, + 0xA4EA, 0x308A, 0xA4EB, 0x308B, 0xA4EC, 0x308C, 0xA4ED, 0x308D, 0xA4EE, 0x308E, 0xA4EF, 0x308F, 0xA4F0, 0x3090, 0xA4F1, 0x3091, + 0xA4F2, 0x3092, 0xA4F3, 0x3093, 0xA5A1, 0x30A1, 0xA5A2, 0x30A2, 0xA5A3, 0x30A3, 0xA5A4, 0x30A4, 0xA5A5, 0x30A5, 0xA5A6, 0x30A6, + 0xA5A7, 0x30A7, 0xA5A8, 0x30A8, 0xA5A9, 0x30A9, 0xA5AA, 0x30AA, 0xA5AB, 0x30AB, 0xA5AC, 0x30AC, 0xA5AD, 0x30AD, 0xA5AE, 0x30AE, + 0xA5AF, 0x30AF, 0xA5B0, 0x30B0, 0xA5B1, 0x30B1, 0xA5B2, 0x30B2, 0xA5B3, 0x30B3, 0xA5B4, 0x30B4, 0xA5B5, 0x30B5, 0xA5B6, 0x30B6, + 0xA5B7, 0x30B7, 0xA5B8, 0x30B8, 0xA5B9, 0x30B9, 0xA5BA, 0x30BA, 0xA5BB, 0x30BB, 0xA5BC, 0x30BC, 0xA5BD, 0x30BD, 0xA5BE, 0x30BE, + 0xA5BF, 0x30BF, 0xA5C0, 0x30C0, 0xA5C1, 0x30C1, 0xA5C2, 0x30C2, 0xA5C3, 0x30C3, 0xA5C4, 0x30C4, 0xA5C5, 0x30C5, 0xA5C6, 0x30C6, + 0xA5C7, 0x30C7, 0xA5C8, 0x30C8, 0xA5C9, 0x30C9, 0xA5CA, 0x30CA, 0xA5CB, 0x30CB, 0xA5CC, 0x30CC, 0xA5CD, 0x30CD, 0xA5CE, 0x30CE, + 0xA5CF, 0x30CF, 0xA5D0, 0x30D0, 0xA5D1, 0x30D1, 0xA5D2, 0x30D2, 0xA5D3, 0x30D3, 0xA5D4, 0x30D4, 0xA5D5, 0x30D5, 0xA5D6, 0x30D6, + 0xA5D7, 0x30D7, 0xA5D8, 0x30D8, 0xA5D9, 0x30D9, 0xA5DA, 0x30DA, 0xA5DB, 0x30DB, 0xA5DC, 0x30DC, 0xA5DD, 0x30DD, 0xA5DE, 0x30DE, + 0xA5DF, 0x30DF, 0xA5E0, 0x30E0, 0xA5E1, 0x30E1, 0xA5E2, 0x30E2, 0xA5E3, 0x30E3, 0xA5E4, 0x30E4, 0xA5E5, 0x30E5, 0xA5E6, 0x30E6, + 0xA5E7, 0x30E7, 0xA5E8, 0x30E8, 0xA5E9, 0x30E9, 0xA5EA, 0x30EA, 0xA5EB, 0x30EB, 0xA5EC, 0x30EC, 0xA5ED, 0x30ED, 0xA5EE, 0x30EE, + 0xA5EF, 0x30EF, 0xA5F0, 0x30F0, 0xA5F1, 0x30F1, 0xA5F2, 0x30F2, 0xA5F3, 0x30F3, 0xA5F4, 0x30F4, 0xA5F5, 0x30F5, 0xA5F6, 0x30F6, + 0xA6A1, 0x0391, 0xA6A2, 0x0392, 0xA6A3, 0x0393, 0xA6A4, 0x0394, 0xA6A5, 0x0395, 0xA6A6, 0x0396, 0xA6A7, 0x0397, 0xA6A8, 0x0398, + 0xA6A9, 0x0399, 0xA6AA, 0x039A, 0xA6AB, 0x039B, 0xA6AC, 0x039C, 0xA6AD, 0x039D, 0xA6AE, 0x039E, 0xA6AF, 0x039F, 0xA6B0, 0x03A0, + 0xA6B1, 0x03A1, 0xA6B2, 0x03A3, 0xA6B3, 0x03A4, 0xA6B4, 0x03A5, 0xA6B5, 0x03A6, 0xA6B6, 0x03A7, 0xA6B7, 0x03A8, 0xA6B8, 0x03A9, + 0xA6C1, 0x03B1, 0xA6C2, 0x03B2, 0xA6C3, 0x03B3, 0xA6C4, 0x03B4, 0xA6C5, 0x03B5, 0xA6C6, 0x03B6, 0xA6C7, 0x03B7, 0xA6C8, 0x03B8, + 0xA6C9, 0x03B9, 0xA6CA, 0x03BA, 0xA6CB, 0x03BB, 0xA6CC, 0x03BC, 0xA6CD, 0x03BD, 0xA6CE, 0x03BE, 0xA6CF, 0x03BF, 0xA6D0, 0x03C0, + 0xA6D1, 0x03C1, 0xA6D2, 0x03C3, 0xA6D3, 0x03C4, 0xA6D4, 0x03C5, 0xA6D5, 0x03C6, 0xA6D6, 0x03C7, 0xA6D7, 0x03C8, 0xA6D8, 0x03C9, + 0xA6E0, 0xFE35, 0xA6E1, 0xFE36, 0xA6E2, 0xFE39, 0xA6E3, 0xFE3A, 0xA6E4, 0xFE3F, 0xA6E5, 0xFE40, 0xA6E6, 0xFE3D, 0xA6E7, 0xFE3E, + 0xA6E8, 0xFE41, 0xA6E9, 0xFE42, 0xA6EA, 0xFE43, 0xA6EB, 0xFE44, 0xA6EE, 0xFE3B, 0xA6EF, 0xFE3C, 0xA6F0, 0xFE37, 0xA6F1, 0xFE38, + 0xA6F2, 0xFE31, 0xA6F4, 0xFE33, 0xA6F5, 0xFE34, 0xA7A1, 0x0410, 0xA7A2, 0x0411, 0xA7A3, 0x0412, 0xA7A4, 0x0413, 0xA7A5, 0x0414, + 0xA7A6, 0x0415, 0xA7A7, 0x0401, 0xA7A8, 0x0416, 0xA7A9, 0x0417, 0xA7AA, 0x0418, 0xA7AB, 0x0419, 0xA7AC, 0x041A, 0xA7AD, 0x041B, + 0xA7AE, 0x041C, 0xA7AF, 0x041D, 0xA7B0, 0x041E, 0xA7B1, 0x041F, 0xA7B2, 0x0420, 0xA7B3, 0x0421, 0xA7B4, 0x0422, 0xA7B5, 0x0423, + 0xA7B6, 0x0424, 0xA7B7, 0x0425, 0xA7B8, 0x0426, 0xA7B9, 0x0427, 0xA7BA, 0x0428, 0xA7BB, 0x0429, 0xA7BC, 0x042A, 0xA7BD, 0x042B, + 0xA7BE, 0x042C, 0xA7BF, 0x042D, 0xA7C0, 0x042E, 0xA7C1, 0x042F, 0xA7D1, 0x0430, 0xA7D2, 0x0431, 0xA7D3, 0x0432, 0xA7D4, 0x0433, + 0xA7D5, 0x0434, 0xA7D6, 0x0435, 0xA7D7, 0x0451, 0xA7D8, 0x0436, 0xA7D9, 0x0437, 0xA7DA, 0x0438, 0xA7DB, 0x0439, 0xA7DC, 0x043A, + 0xA7DD, 0x043B, 0xA7DE, 0x043C, 0xA7DF, 0x043D, 0xA7E0, 0x043E, 0xA7E1, 0x043F, 0xA7E2, 0x0440, 0xA7E3, 0x0441, 0xA7E4, 0x0442, + 0xA7E5, 0x0443, 0xA7E6, 0x0444, 0xA7E7, 0x0445, 0xA7E8, 0x0446, 0xA7E9, 0x0447, 0xA7EA, 0x0448, 0xA7EB, 0x0449, 0xA7EC, 0x044A, + 0xA7ED, 0x044B, 0xA7EE, 0x044C, 0xA7EF, 0x044D, 0xA7F0, 0x044E, 0xA7F1, 0x044F, 0xA840, 0x02CA, 0xA841, 0x02CB, 0xA842, 0x02D9, + 0xA843, 0x2013, 0xA844, 0x2015, 0xA845, 0x2025, 0xA846, 0x2035, 0xA847, 0x2105, 0xA848, 0x2109, 0xA849, 0x2196, 0xA84A, 0x2197, + 0xA84B, 0x2198, 0xA84C, 0x2199, 0xA84D, 0x2215, 0xA84E, 0x221F, 0xA84F, 0x2223, 0xA850, 0x2252, 0xA851, 0x2266, 0xA852, 0x2267, + 0xA853, 0x22BF, 0xA854, 0x2550, 0xA855, 0x2551, 0xA856, 0x2552, 0xA857, 0x2553, 0xA858, 0x2554, 0xA859, 0x2555, 0xA85A, 0x2556, + 0xA85B, 0x2557, 0xA85C, 0x2558, 0xA85D, 0x2559, 0xA85E, 0x255A, 0xA85F, 0x255B, 0xA860, 0x255C, 0xA861, 0x255D, 0xA862, 0x255E, + 0xA863, 0x255F, 0xA864, 0x2560, 0xA865, 0x2561, 0xA866, 0x2562, 0xA867, 0x2563, 0xA868, 0x2564, 0xA869, 0x2565, 0xA86A, 0x2566, + 0xA86B, 0x2567, 0xA86C, 0x2568, 0xA86D, 0x2569, 0xA86E, 0x256A, 0xA86F, 0x256B, 0xA870, 0x256C, 0xA871, 0x256D, 0xA872, 0x256E, + 0xA873, 0x256F, 0xA874, 0x2570, 0xA875, 0x2571, 0xA876, 0x2572, 0xA877, 0x2573, 0xA878, 0x2581, 0xA879, 0x2582, 0xA87A, 0x2583, + 0xA87B, 0x2584, 0xA87C, 0x2585, 0xA87D, 0x2586, 0xA87E, 0x2587, 0xA880, 0x2588, 0xA881, 0x2589, 0xA882, 0x258A, 0xA883, 0x258B, + 0xA884, 0x258C, 0xA885, 0x258D, 0xA886, 0x258E, 0xA887, 0x258F, 0xA888, 0x2593, 0xA889, 0x2594, 0xA88A, 0x2595, 0xA88B, 0x25BC, + 0xA88C, 0x25BD, 0xA88D, 0x25E2, 0xA88E, 0x25E3, 0xA88F, 0x25E4, 0xA890, 0x25E5, 0xA891, 0x2609, 0xA892, 0x2295, 0xA893, 0x3012, + 0xA894, 0x301D, 0xA895, 0x301E, 0xA8A1, 0x0101, 0xA8A2, 0x00E1, 0xA8A3, 0x01CE, 0xA8A4, 0x00E0, 0xA8A5, 0x0113, 0xA8A6, 0x00E9, + 0xA8A7, 0x011B, 0xA8A8, 0x00E8, 0xA8A9, 0x012B, 0xA8AA, 0x00ED, 0xA8AB, 0x01D0, 0xA8AC, 0x00EC, 0xA8AD, 0x014D, 0xA8AE, 0x00F3, + 0xA8AF, 0x01D2, 0xA8B0, 0x00F2, 0xA8B1, 0x016B, 0xA8B2, 0x00FA, 0xA8B3, 0x01D4, 0xA8B4, 0x00F9, 0xA8B5, 0x01D6, 0xA8B6, 0x01D8, + 0xA8B7, 0x01DA, 0xA8B8, 0x01DC, 0xA8B9, 0x00FC, 0xA8BA, 0x00EA, 0xA8BB, 0x0251, 0xA8BD, 0x0144, 0xA8BE, 0x0148, 0xA8C0, 0x0261, + 0xA8C5, 0x3105, 0xA8C6, 0x3106, 0xA8C7, 0x3107, 0xA8C8, 0x3108, 0xA8C9, 0x3109, 0xA8CA, 0x310A, 0xA8CB, 0x310B, 0xA8CC, 0x310C, + 0xA8CD, 0x310D, 0xA8CE, 0x310E, 0xA8CF, 0x310F, 0xA8D0, 0x3110, 0xA8D1, 0x3111, 0xA8D2, 0x3112, 0xA8D3, 0x3113, 0xA8D4, 0x3114, + 0xA8D5, 0x3115, 0xA8D6, 0x3116, 0xA8D7, 0x3117, 0xA8D8, 0x3118, 0xA8D9, 0x3119, 0xA8DA, 0x311A, 0xA8DB, 0x311B, 0xA8DC, 0x311C, + 0xA8DD, 0x311D, 0xA8DE, 0x311E, 0xA8DF, 0x311F, 0xA8E0, 0x3120, 0xA8E1, 0x3121, 0xA8E2, 0x3122, 0xA8E3, 0x3123, 0xA8E4, 0x3124, + 0xA8E5, 0x3125, 0xA8E6, 0x3126, 0xA8E7, 0x3127, 0xA8E8, 0x3128, 0xA8E9, 0x3129, 0xA940, 0x3021, 0xA941, 0x3022, 0xA942, 0x3023, + 0xA943, 0x3024, 0xA944, 0x3025, 0xA945, 0x3026, 0xA946, 0x3027, 0xA947, 0x3028, 0xA948, 0x3029, 0xA949, 0x32A3, 0xA94A, 0x338E, + 0xA94B, 0x338F, 0xA94C, 0x339C, 0xA94D, 0x339D, 0xA94E, 0x339E, 0xA94F, 0x33A1, 0xA950, 0x33C4, 0xA951, 0x33CE, 0xA952, 0x33D1, + 0xA953, 0x33D2, 0xA954, 0x33D5, 0xA955, 0xFE30, 0xA956, 0xFFE2, 0xA957, 0xFFE4, 0xA959, 0x2121, 0xA95A, 0x3231, 0xA95C, 0x2010, + 0xA960, 0x30FC, 0xA961, 0x309B, 0xA962, 0x309C, 0xA963, 0x30FD, 0xA964, 0x30FE, 0xA965, 0x3006, 0xA966, 0x309D, 0xA967, 0x309E, + 0xA968, 0xFE49, 0xA969, 0xFE4A, 0xA96A, 0xFE4B, 0xA96B, 0xFE4C, 0xA96C, 0xFE4D, 0xA96D, 0xFE4E, 0xA96E, 0xFE4F, 0xA96F, 0xFE50, + 0xA970, 0xFE51, 0xA971, 0xFE52, 0xA972, 0xFE54, 0xA973, 0xFE55, 0xA974, 0xFE56, 0xA975, 0xFE57, 0xA976, 0xFE59, 0xA977, 0xFE5A, + 0xA978, 0xFE5B, 0xA979, 0xFE5C, 0xA97A, 0xFE5D, 0xA97B, 0xFE5E, 0xA97C, 0xFE5F, 0xA97D, 0xFE60, 0xA97E, 0xFE61, 0xA980, 0xFE62, + 0xA981, 0xFE63, 0xA982, 0xFE64, 0xA983, 0xFE65, 0xA984, 0xFE66, 0xA985, 0xFE68, 0xA986, 0xFE69, 0xA987, 0xFE6A, 0xA988, 0xFE6B, + 0xA996, 0x3007, 0xA9A4, 0x2500, 0xA9A5, 0x2501, 0xA9A6, 0x2502, 0xA9A7, 0x2503, 0xA9A8, 0x2504, 0xA9A9, 0x2505, 0xA9AA, 0x2506, + 0xA9AB, 0x2507, 0xA9AC, 0x2508, 0xA9AD, 0x2509, 0xA9AE, 0x250A, 0xA9AF, 0x250B, 0xA9B0, 0x250C, 0xA9B1, 0x250D, 0xA9B2, 0x250E, + 0xA9B3, 0x250F, 0xA9B4, 0x2510, 0xA9B5, 0x2511, 0xA9B6, 0x2512, 0xA9B7, 0x2513, 0xA9B8, 0x2514, 0xA9B9, 0x2515, 0xA9BA, 0x2516, + 0xA9BB, 0x2517, 0xA9BC, 0x2518, 0xA9BD, 0x2519, 0xA9BE, 0x251A, 0xA9BF, 0x251B, 0xA9C0, 0x251C, 0xA9C1, 0x251D, 0xA9C2, 0x251E, + 0xA9C3, 0x251F, 0xA9C4, 0x2520, 0xA9C5, 0x2521, 0xA9C6, 0x2522, 0xA9C7, 0x2523, 0xA9C8, 0x2524, 0xA9C9, 0x2525, 0xA9CA, 0x2526, + 0xA9CB, 0x2527, 0xA9CC, 0x2528, 0xA9CD, 0x2529, 0xA9CE, 0x252A, 0xA9CF, 0x252B, 0xA9D0, 0x252C, 0xA9D1, 0x252D, 0xA9D2, 0x252E, + 0xA9D3, 0x252F, 0xA9D4, 0x2530, 0xA9D5, 0x2531, 0xA9D6, 0x2532, 0xA9D7, 0x2533, 0xA9D8, 0x2534, 0xA9D9, 0x2535, 0xA9DA, 0x2536, + 0xA9DB, 0x2537, 0xA9DC, 0x2538, 0xA9DD, 0x2539, 0xA9DE, 0x253A, 0xA9DF, 0x253B, 0xA9E0, 0x253C, 0xA9E1, 0x253D, 0xA9E2, 0x253E, + 0xA9E3, 0x253F, 0xA9E4, 0x2540, 0xA9E5, 0x2541, 0xA9E6, 0x2542, 0xA9E7, 0x2543, 0xA9E8, 0x2544, 0xA9E9, 0x2545, 0xA9EA, 0x2546, + 0xA9EB, 0x2547, 0xA9EC, 0x2548, 0xA9ED, 0x2549, 0xA9EE, 0x254A, 0xA9EF, 0x254B, 0xAA40, 0x72DC, 0xAA41, 0x72DD, 0xAA42, 0x72DF, + 0xAA43, 0x72E2, 0xAA44, 0x72E3, 0xAA45, 0x72E4, 0xAA46, 0x72E5, 0xAA47, 0x72E6, 0xAA48, 0x72E7, 0xAA49, 0x72EA, 0xAA4A, 0x72EB, + 0xAA4B, 0x72F5, 0xAA4C, 0x72F6, 0xAA4D, 0x72F9, 0xAA4E, 0x72FD, 0xAA4F, 0x72FE, 0xAA50, 0x72FF, 0xAA51, 0x7300, 0xAA52, 0x7302, + 0xAA53, 0x7304, 0xAA54, 0x7305, 0xAA55, 0x7306, 0xAA56, 0x7307, 0xAA57, 0x7308, 0xAA58, 0x7309, 0xAA59, 0x730B, 0xAA5A, 0x730C, + 0xAA5B, 0x730D, 0xAA5C, 0x730F, 0xAA5D, 0x7310, 0xAA5E, 0x7311, 0xAA5F, 0x7312, 0xAA60, 0x7314, 0xAA61, 0x7318, 0xAA62, 0x7319, + 0xAA63, 0x731A, 0xAA64, 0x731F, 0xAA65, 0x7320, 0xAA66, 0x7323, 0xAA67, 0x7324, 0xAA68, 0x7326, 0xAA69, 0x7327, 0xAA6A, 0x7328, + 0xAA6B, 0x732D, 0xAA6C, 0x732F, 0xAA6D, 0x7330, 0xAA6E, 0x7332, 0xAA6F, 0x7333, 0xAA70, 0x7335, 0xAA71, 0x7336, 0xAA72, 0x733A, + 0xAA73, 0x733B, 0xAA74, 0x733C, 0xAA75, 0x733D, 0xAA76, 0x7340, 0xAA77, 0x7341, 0xAA78, 0x7342, 0xAA79, 0x7343, 0xAA7A, 0x7344, + 0xAA7B, 0x7345, 0xAA7C, 0x7346, 0xAA7D, 0x7347, 0xAA7E, 0x7348, 0xAA80, 0x7349, 0xAA81, 0x734A, 0xAA82, 0x734B, 0xAA83, 0x734C, + 0xAA84, 0x734E, 0xAA85, 0x734F, 0xAA86, 0x7351, 0xAA87, 0x7353, 0xAA88, 0x7354, 0xAA89, 0x7355, 0xAA8A, 0x7356, 0xAA8B, 0x7358, + 0xAA8C, 0x7359, 0xAA8D, 0x735A, 0xAA8E, 0x735B, 0xAA8F, 0x735C, 0xAA90, 0x735D, 0xAA91, 0x735E, 0xAA92, 0x735F, 0xAA93, 0x7361, + 0xAA94, 0x7362, 0xAA95, 0x7363, 0xAA96, 0x7364, 0xAA97, 0x7365, 0xAA98, 0x7366, 0xAA99, 0x7367, 0xAA9A, 0x7368, 0xAA9B, 0x7369, + 0xAA9C, 0x736A, 0xAA9D, 0x736B, 0xAA9E, 0x736E, 0xAA9F, 0x7370, 0xAAA0, 0x7371, 0xAB40, 0x7372, 0xAB41, 0x7373, 0xAB42, 0x7374, + 0xAB43, 0x7375, 0xAB44, 0x7376, 0xAB45, 0x7377, 0xAB46, 0x7378, 0xAB47, 0x7379, 0xAB48, 0x737A, 0xAB49, 0x737B, 0xAB4A, 0x737C, + 0xAB4B, 0x737D, 0xAB4C, 0x737F, 0xAB4D, 0x7380, 0xAB4E, 0x7381, 0xAB4F, 0x7382, 0xAB50, 0x7383, 0xAB51, 0x7385, 0xAB52, 0x7386, + 0xAB53, 0x7388, 0xAB54, 0x738A, 0xAB55, 0x738C, 0xAB56, 0x738D, 0xAB57, 0x738F, 0xAB58, 0x7390, 0xAB59, 0x7392, 0xAB5A, 0x7393, + 0xAB5B, 0x7394, 0xAB5C, 0x7395, 0xAB5D, 0x7397, 0xAB5E, 0x7398, 0xAB5F, 0x7399, 0xAB60, 0x739A, 0xAB61, 0x739C, 0xAB62, 0x739D, + 0xAB63, 0x739E, 0xAB64, 0x73A0, 0xAB65, 0x73A1, 0xAB66, 0x73A3, 0xAB67, 0x73A4, 0xAB68, 0x73A5, 0xAB69, 0x73A6, 0xAB6A, 0x73A7, + 0xAB6B, 0x73A8, 0xAB6C, 0x73AA, 0xAB6D, 0x73AC, 0xAB6E, 0x73AD, 0xAB6F, 0x73B1, 0xAB70, 0x73B4, 0xAB71, 0x73B5, 0xAB72, 0x73B6, + 0xAB73, 0x73B8, 0xAB74, 0x73B9, 0xAB75, 0x73BC, 0xAB76, 0x73BD, 0xAB77, 0x73BE, 0xAB78, 0x73BF, 0xAB79, 0x73C1, 0xAB7A, 0x73C3, + 0xAB7B, 0x73C4, 0xAB7C, 0x73C5, 0xAB7D, 0x73C6, 0xAB7E, 0x73C7, 0xAB80, 0x73CB, 0xAB81, 0x73CC, 0xAB82, 0x73CE, 0xAB83, 0x73D2, + 0xAB84, 0x73D3, 0xAB85, 0x73D4, 0xAB86, 0x73D5, 0xAB87, 0x73D6, 0xAB88, 0x73D7, 0xAB89, 0x73D8, 0xAB8A, 0x73DA, 0xAB8B, 0x73DB, + 0xAB8C, 0x73DC, 0xAB8D, 0x73DD, 0xAB8E, 0x73DF, 0xAB8F, 0x73E1, 0xAB90, 0x73E2, 0xAB91, 0x73E3, 0xAB92, 0x73E4, 0xAB93, 0x73E6, + 0xAB94, 0x73E8, 0xAB95, 0x73EA, 0xAB96, 0x73EB, 0xAB97, 0x73EC, 0xAB98, 0x73EE, 0xAB99, 0x73EF, 0xAB9A, 0x73F0, 0xAB9B, 0x73F1, + 0xAB9C, 0x73F3, 0xAB9D, 0x73F4, 0xAB9E, 0x73F5, 0xAB9F, 0x73F6, 0xABA0, 0x73F7, 0xAC40, 0x73F8, 0xAC41, 0x73F9, 0xAC42, 0x73FA, + 0xAC43, 0x73FB, 0xAC44, 0x73FC, 0xAC45, 0x73FD, 0xAC46, 0x73FE, 0xAC47, 0x73FF, 0xAC48, 0x7400, 0xAC49, 0x7401, 0xAC4A, 0x7402, + 0xAC4B, 0x7404, 0xAC4C, 0x7407, 0xAC4D, 0x7408, 0xAC4E, 0x740B, 0xAC4F, 0x740C, 0xAC50, 0x740D, 0xAC51, 0x740E, 0xAC52, 0x7411, + 0xAC53, 0x7412, 0xAC54, 0x7413, 0xAC55, 0x7414, 0xAC56, 0x7415, 0xAC57, 0x7416, 0xAC58, 0x7417, 0xAC59, 0x7418, 0xAC5A, 0x7419, + 0xAC5B, 0x741C, 0xAC5C, 0x741D, 0xAC5D, 0x741E, 0xAC5E, 0x741F, 0xAC5F, 0x7420, 0xAC60, 0x7421, 0xAC61, 0x7423, 0xAC62, 0x7424, + 0xAC63, 0x7427, 0xAC64, 0x7429, 0xAC65, 0x742B, 0xAC66, 0x742D, 0xAC67, 0x742F, 0xAC68, 0x7431, 0xAC69, 0x7432, 0xAC6A, 0x7437, + 0xAC6B, 0x7438, 0xAC6C, 0x7439, 0xAC6D, 0x743A, 0xAC6E, 0x743B, 0xAC6F, 0x743D, 0xAC70, 0x743E, 0xAC71, 0x743F, 0xAC72, 0x7440, + 0xAC73, 0x7442, 0xAC74, 0x7443, 0xAC75, 0x7444, 0xAC76, 0x7445, 0xAC77, 0x7446, 0xAC78, 0x7447, 0xAC79, 0x7448, 0xAC7A, 0x7449, + 0xAC7B, 0x744A, 0xAC7C, 0x744B, 0xAC7D, 0x744C, 0xAC7E, 0x744D, 0xAC80, 0x744E, 0xAC81, 0x744F, 0xAC82, 0x7450, 0xAC83, 0x7451, + 0xAC84, 0x7452, 0xAC85, 0x7453, 0xAC86, 0x7454, 0xAC87, 0x7456, 0xAC88, 0x7458, 0xAC89, 0x745D, 0xAC8A, 0x7460, 0xAC8B, 0x7461, + 0xAC8C, 0x7462, 0xAC8D, 0x7463, 0xAC8E, 0x7464, 0xAC8F, 0x7465, 0xAC90, 0x7466, 0xAC91, 0x7467, 0xAC92, 0x7468, 0xAC93, 0x7469, + 0xAC94, 0x746A, 0xAC95, 0x746B, 0xAC96, 0x746C, 0xAC97, 0x746E, 0xAC98, 0x746F, 0xAC99, 0x7471, 0xAC9A, 0x7472, 0xAC9B, 0x7473, + 0xAC9C, 0x7474, 0xAC9D, 0x7475, 0xAC9E, 0x7478, 0xAC9F, 0x7479, 0xACA0, 0x747A, 0xAD40, 0x747B, 0xAD41, 0x747C, 0xAD42, 0x747D, + 0xAD43, 0x747F, 0xAD44, 0x7482, 0xAD45, 0x7484, 0xAD46, 0x7485, 0xAD47, 0x7486, 0xAD48, 0x7488, 0xAD49, 0x7489, 0xAD4A, 0x748A, + 0xAD4B, 0x748C, 0xAD4C, 0x748D, 0xAD4D, 0x748F, 0xAD4E, 0x7491, 0xAD4F, 0x7492, 0xAD50, 0x7493, 0xAD51, 0x7494, 0xAD52, 0x7495, + 0xAD53, 0x7496, 0xAD54, 0x7497, 0xAD55, 0x7498, 0xAD56, 0x7499, 0xAD57, 0x749A, 0xAD58, 0x749B, 0xAD59, 0x749D, 0xAD5A, 0x749F, + 0xAD5B, 0x74A0, 0xAD5C, 0x74A1, 0xAD5D, 0x74A2, 0xAD5E, 0x74A3, 0xAD5F, 0x74A4, 0xAD60, 0x74A5, 0xAD61, 0x74A6, 0xAD62, 0x74AA, + 0xAD63, 0x74AB, 0xAD64, 0x74AC, 0xAD65, 0x74AD, 0xAD66, 0x74AE, 0xAD67, 0x74AF, 0xAD68, 0x74B0, 0xAD69, 0x74B1, 0xAD6A, 0x74B2, + 0xAD6B, 0x74B3, 0xAD6C, 0x74B4, 0xAD6D, 0x74B5, 0xAD6E, 0x74B6, 0xAD6F, 0x74B7, 0xAD70, 0x74B8, 0xAD71, 0x74B9, 0xAD72, 0x74BB, + 0xAD73, 0x74BC, 0xAD74, 0x74BD, 0xAD75, 0x74BE, 0xAD76, 0x74BF, 0xAD77, 0x74C0, 0xAD78, 0x74C1, 0xAD79, 0x74C2, 0xAD7A, 0x74C3, + 0xAD7B, 0x74C4, 0xAD7C, 0x74C5, 0xAD7D, 0x74C6, 0xAD7E, 0x74C7, 0xAD80, 0x74C8, 0xAD81, 0x74C9, 0xAD82, 0x74CA, 0xAD83, 0x74CB, + 0xAD84, 0x74CC, 0xAD85, 0x74CD, 0xAD86, 0x74CE, 0xAD87, 0x74CF, 0xAD88, 0x74D0, 0xAD89, 0x74D1, 0xAD8A, 0x74D3, 0xAD8B, 0x74D4, + 0xAD8C, 0x74D5, 0xAD8D, 0x74D6, 0xAD8E, 0x74D7, 0xAD8F, 0x74D8, 0xAD90, 0x74D9, 0xAD91, 0x74DA, 0xAD92, 0x74DB, 0xAD93, 0x74DD, + 0xAD94, 0x74DF, 0xAD95, 0x74E1, 0xAD96, 0x74E5, 0xAD97, 0x74E7, 0xAD98, 0x74E8, 0xAD99, 0x74E9, 0xAD9A, 0x74EA, 0xAD9B, 0x74EB, + 0xAD9C, 0x74EC, 0xAD9D, 0x74ED, 0xAD9E, 0x74F0, 0xAD9F, 0x74F1, 0xADA0, 0x74F2, 0xAE40, 0x74F3, 0xAE41, 0x74F5, 0xAE42, 0x74F8, + 0xAE43, 0x74F9, 0xAE44, 0x74FA, 0xAE45, 0x74FB, 0xAE46, 0x74FC, 0xAE47, 0x74FD, 0xAE48, 0x74FE, 0xAE49, 0x7500, 0xAE4A, 0x7501, + 0xAE4B, 0x7502, 0xAE4C, 0x7503, 0xAE4D, 0x7505, 0xAE4E, 0x7506, 0xAE4F, 0x7507, 0xAE50, 0x7508, 0xAE51, 0x7509, 0xAE52, 0x750A, + 0xAE53, 0x750B, 0xAE54, 0x750C, 0xAE55, 0x750E, 0xAE56, 0x7510, 0xAE57, 0x7512, 0xAE58, 0x7514, 0xAE59, 0x7515, 0xAE5A, 0x7516, + 0xAE5B, 0x7517, 0xAE5C, 0x751B, 0xAE5D, 0x751D, 0xAE5E, 0x751E, 0xAE5F, 0x7520, 0xAE60, 0x7521, 0xAE61, 0x7522, 0xAE62, 0x7523, + 0xAE63, 0x7524, 0xAE64, 0x7526, 0xAE65, 0x7527, 0xAE66, 0x752A, 0xAE67, 0x752E, 0xAE68, 0x7534, 0xAE69, 0x7536, 0xAE6A, 0x7539, + 0xAE6B, 0x753C, 0xAE6C, 0x753D, 0xAE6D, 0x753F, 0xAE6E, 0x7541, 0xAE6F, 0x7542, 0xAE70, 0x7543, 0xAE71, 0x7544, 0xAE72, 0x7546, + 0xAE73, 0x7547, 0xAE74, 0x7549, 0xAE75, 0x754A, 0xAE76, 0x754D, 0xAE77, 0x7550, 0xAE78, 0x7551, 0xAE79, 0x7552, 0xAE7A, 0x7553, + 0xAE7B, 0x7555, 0xAE7C, 0x7556, 0xAE7D, 0x7557, 0xAE7E, 0x7558, 0xAE80, 0x755D, 0xAE81, 0x755E, 0xAE82, 0x755F, 0xAE83, 0x7560, + 0xAE84, 0x7561, 0xAE85, 0x7562, 0xAE86, 0x7563, 0xAE87, 0x7564, 0xAE88, 0x7567, 0xAE89, 0x7568, 0xAE8A, 0x7569, 0xAE8B, 0x756B, + 0xAE8C, 0x756C, 0xAE8D, 0x756D, 0xAE8E, 0x756E, 0xAE8F, 0x756F, 0xAE90, 0x7570, 0xAE91, 0x7571, 0xAE92, 0x7573, 0xAE93, 0x7575, + 0xAE94, 0x7576, 0xAE95, 0x7577, 0xAE96, 0x757A, 0xAE97, 0x757B, 0xAE98, 0x757C, 0xAE99, 0x757D, 0xAE9A, 0x757E, 0xAE9B, 0x7580, + 0xAE9C, 0x7581, 0xAE9D, 0x7582, 0xAE9E, 0x7584, 0xAE9F, 0x7585, 0xAEA0, 0x7587, 0xAF40, 0x7588, 0xAF41, 0x7589, 0xAF42, 0x758A, + 0xAF43, 0x758C, 0xAF44, 0x758D, 0xAF45, 0x758E, 0xAF46, 0x7590, 0xAF47, 0x7593, 0xAF48, 0x7595, 0xAF49, 0x7598, 0xAF4A, 0x759B, + 0xAF4B, 0x759C, 0xAF4C, 0x759E, 0xAF4D, 0x75A2, 0xAF4E, 0x75A6, 0xAF4F, 0x75A7, 0xAF50, 0x75A8, 0xAF51, 0x75A9, 0xAF52, 0x75AA, + 0xAF53, 0x75AD, 0xAF54, 0x75B6, 0xAF55, 0x75B7, 0xAF56, 0x75BA, 0xAF57, 0x75BB, 0xAF58, 0x75BF, 0xAF59, 0x75C0, 0xAF5A, 0x75C1, + 0xAF5B, 0x75C6, 0xAF5C, 0x75CB, 0xAF5D, 0x75CC, 0xAF5E, 0x75CE, 0xAF5F, 0x75CF, 0xAF60, 0x75D0, 0xAF61, 0x75D1, 0xAF62, 0x75D3, + 0xAF63, 0x75D7, 0xAF64, 0x75D9, 0xAF65, 0x75DA, 0xAF66, 0x75DC, 0xAF67, 0x75DD, 0xAF68, 0x75DF, 0xAF69, 0x75E0, 0xAF6A, 0x75E1, + 0xAF6B, 0x75E5, 0xAF6C, 0x75E9, 0xAF6D, 0x75EC, 0xAF6E, 0x75ED, 0xAF6F, 0x75EE, 0xAF70, 0x75EF, 0xAF71, 0x75F2, 0xAF72, 0x75F3, + 0xAF73, 0x75F5, 0xAF74, 0x75F6, 0xAF75, 0x75F7, 0xAF76, 0x75F8, 0xAF77, 0x75FA, 0xAF78, 0x75FB, 0xAF79, 0x75FD, 0xAF7A, 0x75FE, + 0xAF7B, 0x7602, 0xAF7C, 0x7604, 0xAF7D, 0x7606, 0xAF7E, 0x7607, 0xAF80, 0x7608, 0xAF81, 0x7609, 0xAF82, 0x760B, 0xAF83, 0x760D, + 0xAF84, 0x760E, 0xAF85, 0x760F, 0xAF86, 0x7611, 0xAF87, 0x7612, 0xAF88, 0x7613, 0xAF89, 0x7614, 0xAF8A, 0x7616, 0xAF8B, 0x761A, + 0xAF8C, 0x761C, 0xAF8D, 0x761D, 0xAF8E, 0x761E, 0xAF8F, 0x7621, 0xAF90, 0x7623, 0xAF91, 0x7627, 0xAF92, 0x7628, 0xAF93, 0x762C, + 0xAF94, 0x762E, 0xAF95, 0x762F, 0xAF96, 0x7631, 0xAF97, 0x7632, 0xAF98, 0x7636, 0xAF99, 0x7637, 0xAF9A, 0x7639, 0xAF9B, 0x763A, + 0xAF9C, 0x763B, 0xAF9D, 0x763D, 0xAF9E, 0x7641, 0xAF9F, 0x7642, 0xAFA0, 0x7644, 0xB040, 0x7645, 0xB041, 0x7646, 0xB042, 0x7647, + 0xB043, 0x7648, 0xB044, 0x7649, 0xB045, 0x764A, 0xB046, 0x764B, 0xB047, 0x764E, 0xB048, 0x764F, 0xB049, 0x7650, 0xB04A, 0x7651, + 0xB04B, 0x7652, 0xB04C, 0x7653, 0xB04D, 0x7655, 0xB04E, 0x7657, 0xB04F, 0x7658, 0xB050, 0x7659, 0xB051, 0x765A, 0xB052, 0x765B, + 0xB053, 0x765D, 0xB054, 0x765F, 0xB055, 0x7660, 0xB056, 0x7661, 0xB057, 0x7662, 0xB058, 0x7664, 0xB059, 0x7665, 0xB05A, 0x7666, + 0xB05B, 0x7667, 0xB05C, 0x7668, 0xB05D, 0x7669, 0xB05E, 0x766A, 0xB05F, 0x766C, 0xB060, 0x766D, 0xB061, 0x766E, 0xB062, 0x7670, + 0xB063, 0x7671, 0xB064, 0x7672, 0xB065, 0x7673, 0xB066, 0x7674, 0xB067, 0x7675, 0xB068, 0x7676, 0xB069, 0x7677, 0xB06A, 0x7679, + 0xB06B, 0x767A, 0xB06C, 0x767C, 0xB06D, 0x767F, 0xB06E, 0x7680, 0xB06F, 0x7681, 0xB070, 0x7683, 0xB071, 0x7685, 0xB072, 0x7689, + 0xB073, 0x768A, 0xB074, 0x768C, 0xB075, 0x768D, 0xB076, 0x768F, 0xB077, 0x7690, 0xB078, 0x7692, 0xB079, 0x7694, 0xB07A, 0x7695, + 0xB07B, 0x7697, 0xB07C, 0x7698, 0xB07D, 0x769A, 0xB07E, 0x769B, 0xB080, 0x769C, 0xB081, 0x769D, 0xB082, 0x769E, 0xB083, 0x769F, + 0xB084, 0x76A0, 0xB085, 0x76A1, 0xB086, 0x76A2, 0xB087, 0x76A3, 0xB088, 0x76A5, 0xB089, 0x76A6, 0xB08A, 0x76A7, 0xB08B, 0x76A8, + 0xB08C, 0x76A9, 0xB08D, 0x76AA, 0xB08E, 0x76AB, 0xB08F, 0x76AC, 0xB090, 0x76AD, 0xB091, 0x76AF, 0xB092, 0x76B0, 0xB093, 0x76B3, + 0xB094, 0x76B5, 0xB095, 0x76B6, 0xB096, 0x76B7, 0xB097, 0x76B8, 0xB098, 0x76B9, 0xB099, 0x76BA, 0xB09A, 0x76BB, 0xB09B, 0x76BC, + 0xB09C, 0x76BD, 0xB09D, 0x76BE, 0xB09E, 0x76C0, 0xB09F, 0x76C1, 0xB0A0, 0x76C3, 0xB0A1, 0x554A, 0xB0A2, 0x963F, 0xB0A3, 0x57C3, + 0xB0A4, 0x6328, 0xB0A5, 0x54CE, 0xB0A6, 0x5509, 0xB0A7, 0x54C0, 0xB0A8, 0x7691, 0xB0A9, 0x764C, 0xB0AA, 0x853C, 0xB0AB, 0x77EE, + 0xB0AC, 0x827E, 0xB0AD, 0x788D, 0xB0AE, 0x7231, 0xB0AF, 0x9698, 0xB0B0, 0x978D, 0xB0B1, 0x6C28, 0xB0B2, 0x5B89, 0xB0B3, 0x4FFA, + 0xB0B4, 0x6309, 0xB0B5, 0x6697, 0xB0B6, 0x5CB8, 0xB0B7, 0x80FA, 0xB0B8, 0x6848, 0xB0B9, 0x80AE, 0xB0BA, 0x6602, 0xB0BB, 0x76CE, + 0xB0BC, 0x51F9, 0xB0BD, 0x6556, 0xB0BE, 0x71AC, 0xB0BF, 0x7FF1, 0xB0C0, 0x8884, 0xB0C1, 0x50B2, 0xB0C2, 0x5965, 0xB0C3, 0x61CA, + 0xB0C4, 0x6FB3, 0xB0C5, 0x82AD, 0xB0C6, 0x634C, 0xB0C7, 0x6252, 0xB0C8, 0x53ED, 0xB0C9, 0x5427, 0xB0CA, 0x7B06, 0xB0CB, 0x516B, + 0xB0CC, 0x75A4, 0xB0CD, 0x5DF4, 0xB0CE, 0x62D4, 0xB0CF, 0x8DCB, 0xB0D0, 0x9776, 0xB0D1, 0x628A, 0xB0D2, 0x8019, 0xB0D3, 0x575D, + 0xB0D4, 0x9738, 0xB0D5, 0x7F62, 0xB0D6, 0x7238, 0xB0D7, 0x767D, 0xB0D8, 0x67CF, 0xB0D9, 0x767E, 0xB0DA, 0x6446, 0xB0DB, 0x4F70, + 0xB0DC, 0x8D25, 0xB0DD, 0x62DC, 0xB0DE, 0x7A17, 0xB0DF, 0x6591, 0xB0E0, 0x73ED, 0xB0E1, 0x642C, 0xB0E2, 0x6273, 0xB0E3, 0x822C, + 0xB0E4, 0x9881, 0xB0E5, 0x677F, 0xB0E6, 0x7248, 0xB0E7, 0x626E, 0xB0E8, 0x62CC, 0xB0E9, 0x4F34, 0xB0EA, 0x74E3, 0xB0EB, 0x534A, + 0xB0EC, 0x529E, 0xB0ED, 0x7ECA, 0xB0EE, 0x90A6, 0xB0EF, 0x5E2E, 0xB0F0, 0x6886, 0xB0F1, 0x699C, 0xB0F2, 0x8180, 0xB0F3, 0x7ED1, + 0xB0F4, 0x68D2, 0xB0F5, 0x78C5, 0xB0F6, 0x868C, 0xB0F7, 0x9551, 0xB0F8, 0x508D, 0xB0F9, 0x8C24, 0xB0FA, 0x82DE, 0xB0FB, 0x80DE, + 0xB0FC, 0x5305, 0xB0FD, 0x8912, 0xB0FE, 0x5265, 0xB140, 0x76C4, 0xB141, 0x76C7, 0xB142, 0x76C9, 0xB143, 0x76CB, 0xB144, 0x76CC, + 0xB145, 0x76D3, 0xB146, 0x76D5, 0xB147, 0x76D9, 0xB148, 0x76DA, 0xB149, 0x76DC, 0xB14A, 0x76DD, 0xB14B, 0x76DE, 0xB14C, 0x76E0, + 0xB14D, 0x76E1, 0xB14E, 0x76E2, 0xB14F, 0x76E3, 0xB150, 0x76E4, 0xB151, 0x76E6, 0xB152, 0x76E7, 0xB153, 0x76E8, 0xB154, 0x76E9, + 0xB155, 0x76EA, 0xB156, 0x76EB, 0xB157, 0x76EC, 0xB158, 0x76ED, 0xB159, 0x76F0, 0xB15A, 0x76F3, 0xB15B, 0x76F5, 0xB15C, 0x76F6, + 0xB15D, 0x76F7, 0xB15E, 0x76FA, 0xB15F, 0x76FB, 0xB160, 0x76FD, 0xB161, 0x76FF, 0xB162, 0x7700, 0xB163, 0x7702, 0xB164, 0x7703, + 0xB165, 0x7705, 0xB166, 0x7706, 0xB167, 0x770A, 0xB168, 0x770C, 0xB169, 0x770E, 0xB16A, 0x770F, 0xB16B, 0x7710, 0xB16C, 0x7711, + 0xB16D, 0x7712, 0xB16E, 0x7713, 0xB16F, 0x7714, 0xB170, 0x7715, 0xB171, 0x7716, 0xB172, 0x7717, 0xB173, 0x7718, 0xB174, 0x771B, + 0xB175, 0x771C, 0xB176, 0x771D, 0xB177, 0x771E, 0xB178, 0x7721, 0xB179, 0x7723, 0xB17A, 0x7724, 0xB17B, 0x7725, 0xB17C, 0x7727, + 0xB17D, 0x772A, 0xB17E, 0x772B, 0xB180, 0x772C, 0xB181, 0x772E, 0xB182, 0x7730, 0xB183, 0x7731, 0xB184, 0x7732, 0xB185, 0x7733, + 0xB186, 0x7734, 0xB187, 0x7739, 0xB188, 0x773B, 0xB189, 0x773D, 0xB18A, 0x773E, 0xB18B, 0x773F, 0xB18C, 0x7742, 0xB18D, 0x7744, + 0xB18E, 0x7745, 0xB18F, 0x7746, 0xB190, 0x7748, 0xB191, 0x7749, 0xB192, 0x774A, 0xB193, 0x774B, 0xB194, 0x774C, 0xB195, 0x774D, + 0xB196, 0x774E, 0xB197, 0x774F, 0xB198, 0x7752, 0xB199, 0x7753, 0xB19A, 0x7754, 0xB19B, 0x7755, 0xB19C, 0x7756, 0xB19D, 0x7757, + 0xB19E, 0x7758, 0xB19F, 0x7759, 0xB1A0, 0x775C, 0xB1A1, 0x8584, 0xB1A2, 0x96F9, 0xB1A3, 0x4FDD, 0xB1A4, 0x5821, 0xB1A5, 0x9971, + 0xB1A6, 0x5B9D, 0xB1A7, 0x62B1, 0xB1A8, 0x62A5, 0xB1A9, 0x66B4, 0xB1AA, 0x8C79, 0xB1AB, 0x9C8D, 0xB1AC, 0x7206, 0xB1AD, 0x676F, + 0xB1AE, 0x7891, 0xB1AF, 0x60B2, 0xB1B0, 0x5351, 0xB1B1, 0x5317, 0xB1B2, 0x8F88, 0xB1B3, 0x80CC, 0xB1B4, 0x8D1D, 0xB1B5, 0x94A1, + 0xB1B6, 0x500D, 0xB1B7, 0x72C8, 0xB1B8, 0x5907, 0xB1B9, 0x60EB, 0xB1BA, 0x7119, 0xB1BB, 0x88AB, 0xB1BC, 0x5954, 0xB1BD, 0x82EF, + 0xB1BE, 0x672C, 0xB1BF, 0x7B28, 0xB1C0, 0x5D29, 0xB1C1, 0x7EF7, 0xB1C2, 0x752D, 0xB1C3, 0x6CF5, 0xB1C4, 0x8E66, 0xB1C5, 0x8FF8, + 0xB1C6, 0x903C, 0xB1C7, 0x9F3B, 0xB1C8, 0x6BD4, 0xB1C9, 0x9119, 0xB1CA, 0x7B14, 0xB1CB, 0x5F7C, 0xB1CC, 0x78A7, 0xB1CD, 0x84D6, + 0xB1CE, 0x853D, 0xB1CF, 0x6BD5, 0xB1D0, 0x6BD9, 0xB1D1, 0x6BD6, 0xB1D2, 0x5E01, 0xB1D3, 0x5E87, 0xB1D4, 0x75F9, 0xB1D5, 0x95ED, + 0xB1D6, 0x655D, 0xB1D7, 0x5F0A, 0xB1D8, 0x5FC5, 0xB1D9, 0x8F9F, 0xB1DA, 0x58C1, 0xB1DB, 0x81C2, 0xB1DC, 0x907F, 0xB1DD, 0x965B, + 0xB1DE, 0x97AD, 0xB1DF, 0x8FB9, 0xB1E0, 0x7F16, 0xB1E1, 0x8D2C, 0xB1E2, 0x6241, 0xB1E3, 0x4FBF, 0xB1E4, 0x53D8, 0xB1E5, 0x535E, + 0xB1E6, 0x8FA8, 0xB1E7, 0x8FA9, 0xB1E8, 0x8FAB, 0xB1E9, 0x904D, 0xB1EA, 0x6807, 0xB1EB, 0x5F6A, 0xB1EC, 0x8198, 0xB1ED, 0x8868, + 0xB1EE, 0x9CD6, 0xB1EF, 0x618B, 0xB1F0, 0x522B, 0xB1F1, 0x762A, 0xB1F2, 0x5F6C, 0xB1F3, 0x658C, 0xB1F4, 0x6FD2, 0xB1F5, 0x6EE8, + 0xB1F6, 0x5BBE, 0xB1F7, 0x6448, 0xB1F8, 0x5175, 0xB1F9, 0x51B0, 0xB1FA, 0x67C4, 0xB1FB, 0x4E19, 0xB1FC, 0x79C9, 0xB1FD, 0x997C, + 0xB1FE, 0x70B3, 0xB240, 0x775D, 0xB241, 0x775E, 0xB242, 0x775F, 0xB243, 0x7760, 0xB244, 0x7764, 0xB245, 0x7767, 0xB246, 0x7769, + 0xB247, 0x776A, 0xB248, 0x776D, 0xB249, 0x776E, 0xB24A, 0x776F, 0xB24B, 0x7770, 0xB24C, 0x7771, 0xB24D, 0x7772, 0xB24E, 0x7773, + 0xB24F, 0x7774, 0xB250, 0x7775, 0xB251, 0x7776, 0xB252, 0x7777, 0xB253, 0x7778, 0xB254, 0x777A, 0xB255, 0x777B, 0xB256, 0x777C, + 0xB257, 0x7781, 0xB258, 0x7782, 0xB259, 0x7783, 0xB25A, 0x7786, 0xB25B, 0x7787, 0xB25C, 0x7788, 0xB25D, 0x7789, 0xB25E, 0x778A, + 0xB25F, 0x778B, 0xB260, 0x778F, 0xB261, 0x7790, 0xB262, 0x7793, 0xB263, 0x7794, 0xB264, 0x7795, 0xB265, 0x7796, 0xB266, 0x7797, + 0xB267, 0x7798, 0xB268, 0x7799, 0xB269, 0x779A, 0xB26A, 0x779B, 0xB26B, 0x779C, 0xB26C, 0x779D, 0xB26D, 0x779E, 0xB26E, 0x77A1, + 0xB26F, 0x77A3, 0xB270, 0x77A4, 0xB271, 0x77A6, 0xB272, 0x77A8, 0xB273, 0x77AB, 0xB274, 0x77AD, 0xB275, 0x77AE, 0xB276, 0x77AF, + 0xB277, 0x77B1, 0xB278, 0x77B2, 0xB279, 0x77B4, 0xB27A, 0x77B6, 0xB27B, 0x77B7, 0xB27C, 0x77B8, 0xB27D, 0x77B9, 0xB27E, 0x77BA, + 0xB280, 0x77BC, 0xB281, 0x77BE, 0xB282, 0x77C0, 0xB283, 0x77C1, 0xB284, 0x77C2, 0xB285, 0x77C3, 0xB286, 0x77C4, 0xB287, 0x77C5, + 0xB288, 0x77C6, 0xB289, 0x77C7, 0xB28A, 0x77C8, 0xB28B, 0x77C9, 0xB28C, 0x77CA, 0xB28D, 0x77CB, 0xB28E, 0x77CC, 0xB28F, 0x77CE, + 0xB290, 0x77CF, 0xB291, 0x77D0, 0xB292, 0x77D1, 0xB293, 0x77D2, 0xB294, 0x77D3, 0xB295, 0x77D4, 0xB296, 0x77D5, 0xB297, 0x77D6, + 0xB298, 0x77D8, 0xB299, 0x77D9, 0xB29A, 0x77DA, 0xB29B, 0x77DD, 0xB29C, 0x77DE, 0xB29D, 0x77DF, 0xB29E, 0x77E0, 0xB29F, 0x77E1, + 0xB2A0, 0x77E4, 0xB2A1, 0x75C5, 0xB2A2, 0x5E76, 0xB2A3, 0x73BB, 0xB2A4, 0x83E0, 0xB2A5, 0x64AD, 0xB2A6, 0x62E8, 0xB2A7, 0x94B5, + 0xB2A8, 0x6CE2, 0xB2A9, 0x535A, 0xB2AA, 0x52C3, 0xB2AB, 0x640F, 0xB2AC, 0x94C2, 0xB2AD, 0x7B94, 0xB2AE, 0x4F2F, 0xB2AF, 0x5E1B, + 0xB2B0, 0x8236, 0xB2B1, 0x8116, 0xB2B2, 0x818A, 0xB2B3, 0x6E24, 0xB2B4, 0x6CCA, 0xB2B5, 0x9A73, 0xB2B6, 0x6355, 0xB2B7, 0x535C, + 0xB2B8, 0x54FA, 0xB2B9, 0x8865, 0xB2BA, 0x57E0, 0xB2BB, 0x4E0D, 0xB2BC, 0x5E03, 0xB2BD, 0x6B65, 0xB2BE, 0x7C3F, 0xB2BF, 0x90E8, + 0xB2C0, 0x6016, 0xB2C1, 0x64E6, 0xB2C2, 0x731C, 0xB2C3, 0x88C1, 0xB2C4, 0x6750, 0xB2C5, 0x624D, 0xB2C6, 0x8D22, 0xB2C7, 0x776C, + 0xB2C8, 0x8E29, 0xB2C9, 0x91C7, 0xB2CA, 0x5F69, 0xB2CB, 0x83DC, 0xB2CC, 0x8521, 0xB2CD, 0x9910, 0xB2CE, 0x53C2, 0xB2CF, 0x8695, + 0xB2D0, 0x6B8B, 0xB2D1, 0x60ED, 0xB2D2, 0x60E8, 0xB2D3, 0x707F, 0xB2D4, 0x82CD, 0xB2D5, 0x8231, 0xB2D6, 0x4ED3, 0xB2D7, 0x6CA7, + 0xB2D8, 0x85CF, 0xB2D9, 0x64CD, 0xB2DA, 0x7CD9, 0xB2DB, 0x69FD, 0xB2DC, 0x66F9, 0xB2DD, 0x8349, 0xB2DE, 0x5395, 0xB2DF, 0x7B56, + 0xB2E0, 0x4FA7, 0xB2E1, 0x518C, 0xB2E2, 0x6D4B, 0xB2E3, 0x5C42, 0xB2E4, 0x8E6D, 0xB2E5, 0x63D2, 0xB2E6, 0x53C9, 0xB2E7, 0x832C, + 0xB2E8, 0x8336, 0xB2E9, 0x67E5, 0xB2EA, 0x78B4, 0xB2EB, 0x643D, 0xB2EC, 0x5BDF, 0xB2ED, 0x5C94, 0xB2EE, 0x5DEE, 0xB2EF, 0x8BE7, + 0xB2F0, 0x62C6, 0xB2F1, 0x67F4, 0xB2F2, 0x8C7A, 0xB2F3, 0x6400, 0xB2F4, 0x63BA, 0xB2F5, 0x8749, 0xB2F6, 0x998B, 0xB2F7, 0x8C17, + 0xB2F8, 0x7F20, 0xB2F9, 0x94F2, 0xB2FA, 0x4EA7, 0xB2FB, 0x9610, 0xB2FC, 0x98A4, 0xB2FD, 0x660C, 0xB2FE, 0x7316, 0xB340, 0x77E6, + 0xB341, 0x77E8, 0xB342, 0x77EA, 0xB343, 0x77EF, 0xB344, 0x77F0, 0xB345, 0x77F1, 0xB346, 0x77F2, 0xB347, 0x77F4, 0xB348, 0x77F5, + 0xB349, 0x77F7, 0xB34A, 0x77F9, 0xB34B, 0x77FA, 0xB34C, 0x77FB, 0xB34D, 0x77FC, 0xB34E, 0x7803, 0xB34F, 0x7804, 0xB350, 0x7805, + 0xB351, 0x7806, 0xB352, 0x7807, 0xB353, 0x7808, 0xB354, 0x780A, 0xB355, 0x780B, 0xB356, 0x780E, 0xB357, 0x780F, 0xB358, 0x7810, + 0xB359, 0x7813, 0xB35A, 0x7815, 0xB35B, 0x7819, 0xB35C, 0x781B, 0xB35D, 0x781E, 0xB35E, 0x7820, 0xB35F, 0x7821, 0xB360, 0x7822, + 0xB361, 0x7824, 0xB362, 0x7828, 0xB363, 0x782A, 0xB364, 0x782B, 0xB365, 0x782E, 0xB366, 0x782F, 0xB367, 0x7831, 0xB368, 0x7832, + 0xB369, 0x7833, 0xB36A, 0x7835, 0xB36B, 0x7836, 0xB36C, 0x783D, 0xB36D, 0x783F, 0xB36E, 0x7841, 0xB36F, 0x7842, 0xB370, 0x7843, + 0xB371, 0x7844, 0xB372, 0x7846, 0xB373, 0x7848, 0xB374, 0x7849, 0xB375, 0x784A, 0xB376, 0x784B, 0xB377, 0x784D, 0xB378, 0x784F, + 0xB379, 0x7851, 0xB37A, 0x7853, 0xB37B, 0x7854, 0xB37C, 0x7858, 0xB37D, 0x7859, 0xB37E, 0x785A, 0xB380, 0x785B, 0xB381, 0x785C, + 0xB382, 0x785E, 0xB383, 0x785F, 0xB384, 0x7860, 0xB385, 0x7861, 0xB386, 0x7862, 0xB387, 0x7863, 0xB388, 0x7864, 0xB389, 0x7865, + 0xB38A, 0x7866, 0xB38B, 0x7867, 0xB38C, 0x7868, 0xB38D, 0x7869, 0xB38E, 0x786F, 0xB38F, 0x7870, 0xB390, 0x7871, 0xB391, 0x7872, + 0xB392, 0x7873, 0xB393, 0x7874, 0xB394, 0x7875, 0xB395, 0x7876, 0xB396, 0x7878, 0xB397, 0x7879, 0xB398, 0x787A, 0xB399, 0x787B, + 0xB39A, 0x787D, 0xB39B, 0x787E, 0xB39C, 0x787F, 0xB39D, 0x7880, 0xB39E, 0x7881, 0xB39F, 0x7882, 0xB3A0, 0x7883, 0xB3A1, 0x573A, + 0xB3A2, 0x5C1D, 0xB3A3, 0x5E38, 0xB3A4, 0x957F, 0xB3A5, 0x507F, 0xB3A6, 0x80A0, 0xB3A7, 0x5382, 0xB3A8, 0x655E, 0xB3A9, 0x7545, + 0xB3AA, 0x5531, 0xB3AB, 0x5021, 0xB3AC, 0x8D85, 0xB3AD, 0x6284, 0xB3AE, 0x949E, 0xB3AF, 0x671D, 0xB3B0, 0x5632, 0xB3B1, 0x6F6E, + 0xB3B2, 0x5DE2, 0xB3B3, 0x5435, 0xB3B4, 0x7092, 0xB3B5, 0x8F66, 0xB3B6, 0x626F, 0xB3B7, 0x64A4, 0xB3B8, 0x63A3, 0xB3B9, 0x5F7B, + 0xB3BA, 0x6F88, 0xB3BB, 0x90F4, 0xB3BC, 0x81E3, 0xB3BD, 0x8FB0, 0xB3BE, 0x5C18, 0xB3BF, 0x6668, 0xB3C0, 0x5FF1, 0xB3C1, 0x6C89, + 0xB3C2, 0x9648, 0xB3C3, 0x8D81, 0xB3C4, 0x886C, 0xB3C5, 0x6491, 0xB3C6, 0x79F0, 0xB3C7, 0x57CE, 0xB3C8, 0x6A59, 0xB3C9, 0x6210, + 0xB3CA, 0x5448, 0xB3CB, 0x4E58, 0xB3CC, 0x7A0B, 0xB3CD, 0x60E9, 0xB3CE, 0x6F84, 0xB3CF, 0x8BDA, 0xB3D0, 0x627F, 0xB3D1, 0x901E, + 0xB3D2, 0x9A8B, 0xB3D3, 0x79E4, 0xB3D4, 0x5403, 0xB3D5, 0x75F4, 0xB3D6, 0x6301, 0xB3D7, 0x5319, 0xB3D8, 0x6C60, 0xB3D9, 0x8FDF, + 0xB3DA, 0x5F1B, 0xB3DB, 0x9A70, 0xB3DC, 0x803B, 0xB3DD, 0x9F7F, 0xB3DE, 0x4F88, 0xB3DF, 0x5C3A, 0xB3E0, 0x8D64, 0xB3E1, 0x7FC5, + 0xB3E2, 0x65A5, 0xB3E3, 0x70BD, 0xB3E4, 0x5145, 0xB3E5, 0x51B2, 0xB3E6, 0x866B, 0xB3E7, 0x5D07, 0xB3E8, 0x5BA0, 0xB3E9, 0x62BD, + 0xB3EA, 0x916C, 0xB3EB, 0x7574, 0xB3EC, 0x8E0C, 0xB3ED, 0x7A20, 0xB3EE, 0x6101, 0xB3EF, 0x7B79, 0xB3F0, 0x4EC7, 0xB3F1, 0x7EF8, + 0xB3F2, 0x7785, 0xB3F3, 0x4E11, 0xB3F4, 0x81ED, 0xB3F5, 0x521D, 0xB3F6, 0x51FA, 0xB3F7, 0x6A71, 0xB3F8, 0x53A8, 0xB3F9, 0x8E87, + 0xB3FA, 0x9504, 0xB3FB, 0x96CF, 0xB3FC, 0x6EC1, 0xB3FD, 0x9664, 0xB3FE, 0x695A, 0xB440, 0x7884, 0xB441, 0x7885, 0xB442, 0x7886, + 0xB443, 0x7888, 0xB444, 0x788A, 0xB445, 0x788B, 0xB446, 0x788F, 0xB447, 0x7890, 0xB448, 0x7892, 0xB449, 0x7894, 0xB44A, 0x7895, + 0xB44B, 0x7896, 0xB44C, 0x7899, 0xB44D, 0x789D, 0xB44E, 0x789E, 0xB44F, 0x78A0, 0xB450, 0x78A2, 0xB451, 0x78A4, 0xB452, 0x78A6, + 0xB453, 0x78A8, 0xB454, 0x78A9, 0xB455, 0x78AA, 0xB456, 0x78AB, 0xB457, 0x78AC, 0xB458, 0x78AD, 0xB459, 0x78AE, 0xB45A, 0x78AF, + 0xB45B, 0x78B5, 0xB45C, 0x78B6, 0xB45D, 0x78B7, 0xB45E, 0x78B8, 0xB45F, 0x78BA, 0xB460, 0x78BB, 0xB461, 0x78BC, 0xB462, 0x78BD, + 0xB463, 0x78BF, 0xB464, 0x78C0, 0xB465, 0x78C2, 0xB466, 0x78C3, 0xB467, 0x78C4, 0xB468, 0x78C6, 0xB469, 0x78C7, 0xB46A, 0x78C8, + 0xB46B, 0x78CC, 0xB46C, 0x78CD, 0xB46D, 0x78CE, 0xB46E, 0x78CF, 0xB46F, 0x78D1, 0xB470, 0x78D2, 0xB471, 0x78D3, 0xB472, 0x78D6, + 0xB473, 0x78D7, 0xB474, 0x78D8, 0xB475, 0x78DA, 0xB476, 0x78DB, 0xB477, 0x78DC, 0xB478, 0x78DD, 0xB479, 0x78DE, 0xB47A, 0x78DF, + 0xB47B, 0x78E0, 0xB47C, 0x78E1, 0xB47D, 0x78E2, 0xB47E, 0x78E3, 0xB480, 0x78E4, 0xB481, 0x78E5, 0xB482, 0x78E6, 0xB483, 0x78E7, + 0xB484, 0x78E9, 0xB485, 0x78EA, 0xB486, 0x78EB, 0xB487, 0x78ED, 0xB488, 0x78EE, 0xB489, 0x78EF, 0xB48A, 0x78F0, 0xB48B, 0x78F1, + 0xB48C, 0x78F3, 0xB48D, 0x78F5, 0xB48E, 0x78F6, 0xB48F, 0x78F8, 0xB490, 0x78F9, 0xB491, 0x78FB, 0xB492, 0x78FC, 0xB493, 0x78FD, + 0xB494, 0x78FE, 0xB495, 0x78FF, 0xB496, 0x7900, 0xB497, 0x7902, 0xB498, 0x7903, 0xB499, 0x7904, 0xB49A, 0x7906, 0xB49B, 0x7907, + 0xB49C, 0x7908, 0xB49D, 0x7909, 0xB49E, 0x790A, 0xB49F, 0x790B, 0xB4A0, 0x790C, 0xB4A1, 0x7840, 0xB4A2, 0x50A8, 0xB4A3, 0x77D7, + 0xB4A4, 0x6410, 0xB4A5, 0x89E6, 0xB4A6, 0x5904, 0xB4A7, 0x63E3, 0xB4A8, 0x5DDD, 0xB4A9, 0x7A7F, 0xB4AA, 0x693D, 0xB4AB, 0x4F20, + 0xB4AC, 0x8239, 0xB4AD, 0x5598, 0xB4AE, 0x4E32, 0xB4AF, 0x75AE, 0xB4B0, 0x7A97, 0xB4B1, 0x5E62, 0xB4B2, 0x5E8A, 0xB4B3, 0x95EF, + 0xB4B4, 0x521B, 0xB4B5, 0x5439, 0xB4B6, 0x708A, 0xB4B7, 0x6376, 0xB4B8, 0x9524, 0xB4B9, 0x5782, 0xB4BA, 0x6625, 0xB4BB, 0x693F, + 0xB4BC, 0x9187, 0xB4BD, 0x5507, 0xB4BE, 0x6DF3, 0xB4BF, 0x7EAF, 0xB4C0, 0x8822, 0xB4C1, 0x6233, 0xB4C2, 0x7EF0, 0xB4C3, 0x75B5, + 0xB4C4, 0x8328, 0xB4C5, 0x78C1, 0xB4C6, 0x96CC, 0xB4C7, 0x8F9E, 0xB4C8, 0x6148, 0xB4C9, 0x74F7, 0xB4CA, 0x8BCD, 0xB4CB, 0x6B64, + 0xB4CC, 0x523A, 0xB4CD, 0x8D50, 0xB4CE, 0x6B21, 0xB4CF, 0x806A, 0xB4D0, 0x8471, 0xB4D1, 0x56F1, 0xB4D2, 0x5306, 0xB4D3, 0x4ECE, + 0xB4D4, 0x4E1B, 0xB4D5, 0x51D1, 0xB4D6, 0x7C97, 0xB4D7, 0x918B, 0xB4D8, 0x7C07, 0xB4D9, 0x4FC3, 0xB4DA, 0x8E7F, 0xB4DB, 0x7BE1, + 0xB4DC, 0x7A9C, 0xB4DD, 0x6467, 0xB4DE, 0x5D14, 0xB4DF, 0x50AC, 0xB4E0, 0x8106, 0xB4E1, 0x7601, 0xB4E2, 0x7CB9, 0xB4E3, 0x6DEC, + 0xB4E4, 0x7FE0, 0xB4E5, 0x6751, 0xB4E6, 0x5B58, 0xB4E7, 0x5BF8, 0xB4E8, 0x78CB, 0xB4E9, 0x64AE, 0xB4EA, 0x6413, 0xB4EB, 0x63AA, + 0xB4EC, 0x632B, 0xB4ED, 0x9519, 0xB4EE, 0x642D, 0xB4EF, 0x8FBE, 0xB4F0, 0x7B54, 0xB4F1, 0x7629, 0xB4F2, 0x6253, 0xB4F3, 0x5927, + 0xB4F4, 0x5446, 0xB4F5, 0x6B79, 0xB4F6, 0x50A3, 0xB4F7, 0x6234, 0xB4F8, 0x5E26, 0xB4F9, 0x6B86, 0xB4FA, 0x4EE3, 0xB4FB, 0x8D37, + 0xB4FC, 0x888B, 0xB4FD, 0x5F85, 0xB4FE, 0x902E, 0xB540, 0x790D, 0xB541, 0x790E, 0xB542, 0x790F, 0xB543, 0x7910, 0xB544, 0x7911, + 0xB545, 0x7912, 0xB546, 0x7914, 0xB547, 0x7915, 0xB548, 0x7916, 0xB549, 0x7917, 0xB54A, 0x7918, 0xB54B, 0x7919, 0xB54C, 0x791A, + 0xB54D, 0x791B, 0xB54E, 0x791C, 0xB54F, 0x791D, 0xB550, 0x791F, 0xB551, 0x7920, 0xB552, 0x7921, 0xB553, 0x7922, 0xB554, 0x7923, + 0xB555, 0x7925, 0xB556, 0x7926, 0xB557, 0x7927, 0xB558, 0x7928, 0xB559, 0x7929, 0xB55A, 0x792A, 0xB55B, 0x792B, 0xB55C, 0x792C, + 0xB55D, 0x792D, 0xB55E, 0x792E, 0xB55F, 0x792F, 0xB560, 0x7930, 0xB561, 0x7931, 0xB562, 0x7932, 0xB563, 0x7933, 0xB564, 0x7935, + 0xB565, 0x7936, 0xB566, 0x7937, 0xB567, 0x7938, 0xB568, 0x7939, 0xB569, 0x793D, 0xB56A, 0x793F, 0xB56B, 0x7942, 0xB56C, 0x7943, + 0xB56D, 0x7944, 0xB56E, 0x7945, 0xB56F, 0x7947, 0xB570, 0x794A, 0xB571, 0x794B, 0xB572, 0x794C, 0xB573, 0x794D, 0xB574, 0x794E, + 0xB575, 0x794F, 0xB576, 0x7950, 0xB577, 0x7951, 0xB578, 0x7952, 0xB579, 0x7954, 0xB57A, 0x7955, 0xB57B, 0x7958, 0xB57C, 0x7959, + 0xB57D, 0x7961, 0xB57E, 0x7963, 0xB580, 0x7964, 0xB581, 0x7966, 0xB582, 0x7969, 0xB583, 0x796A, 0xB584, 0x796B, 0xB585, 0x796C, + 0xB586, 0x796E, 0xB587, 0x7970, 0xB588, 0x7971, 0xB589, 0x7972, 0xB58A, 0x7973, 0xB58B, 0x7974, 0xB58C, 0x7975, 0xB58D, 0x7976, + 0xB58E, 0x7979, 0xB58F, 0x797B, 0xB590, 0x797C, 0xB591, 0x797D, 0xB592, 0x797E, 0xB593, 0x797F, 0xB594, 0x7982, 0xB595, 0x7983, + 0xB596, 0x7986, 0xB597, 0x7987, 0xB598, 0x7988, 0xB599, 0x7989, 0xB59A, 0x798B, 0xB59B, 0x798C, 0xB59C, 0x798D, 0xB59D, 0x798E, + 0xB59E, 0x7990, 0xB59F, 0x7991, 0xB5A0, 0x7992, 0xB5A1, 0x6020, 0xB5A2, 0x803D, 0xB5A3, 0x62C5, 0xB5A4, 0x4E39, 0xB5A5, 0x5355, + 0xB5A6, 0x90F8, 0xB5A7, 0x63B8, 0xB5A8, 0x80C6, 0xB5A9, 0x65E6, 0xB5AA, 0x6C2E, 0xB5AB, 0x4F46, 0xB5AC, 0x60EE, 0xB5AD, 0x6DE1, + 0xB5AE, 0x8BDE, 0xB5AF, 0x5F39, 0xB5B0, 0x86CB, 0xB5B1, 0x5F53, 0xB5B2, 0x6321, 0xB5B3, 0x515A, 0xB5B4, 0x8361, 0xB5B5, 0x6863, + 0xB5B6, 0x5200, 0xB5B7, 0x6363, 0xB5B8, 0x8E48, 0xB5B9, 0x5012, 0xB5BA, 0x5C9B, 0xB5BB, 0x7977, 0xB5BC, 0x5BFC, 0xB5BD, 0x5230, + 0xB5BE, 0x7A3B, 0xB5BF, 0x60BC, 0xB5C0, 0x9053, 0xB5C1, 0x76D7, 0xB5C2, 0x5FB7, 0xB5C3, 0x5F97, 0xB5C4, 0x7684, 0xB5C5, 0x8E6C, + 0xB5C6, 0x706F, 0xB5C7, 0x767B, 0xB5C8, 0x7B49, 0xB5C9, 0x77AA, 0xB5CA, 0x51F3, 0xB5CB, 0x9093, 0xB5CC, 0x5824, 0xB5CD, 0x4F4E, + 0xB5CE, 0x6EF4, 0xB5CF, 0x8FEA, 0xB5D0, 0x654C, 0xB5D1, 0x7B1B, 0xB5D2, 0x72C4, 0xB5D3, 0x6DA4, 0xB5D4, 0x7FDF, 0xB5D5, 0x5AE1, + 0xB5D6, 0x62B5, 0xB5D7, 0x5E95, 0xB5D8, 0x5730, 0xB5D9, 0x8482, 0xB5DA, 0x7B2C, 0xB5DB, 0x5E1D, 0xB5DC, 0x5F1F, 0xB5DD, 0x9012, + 0xB5DE, 0x7F14, 0xB5DF, 0x98A0, 0xB5E0, 0x6382, 0xB5E1, 0x6EC7, 0xB5E2, 0x7898, 0xB5E3, 0x70B9, 0xB5E4, 0x5178, 0xB5E5, 0x975B, + 0xB5E6, 0x57AB, 0xB5E7, 0x7535, 0xB5E8, 0x4F43, 0xB5E9, 0x7538, 0xB5EA, 0x5E97, 0xB5EB, 0x60E6, 0xB5EC, 0x5960, 0xB5ED, 0x6DC0, + 0xB5EE, 0x6BBF, 0xB5EF, 0x7889, 0xB5F0, 0x53FC, 0xB5F1, 0x96D5, 0xB5F2, 0x51CB, 0xB5F3, 0x5201, 0xB5F4, 0x6389, 0xB5F5, 0x540A, + 0xB5F6, 0x9493, 0xB5F7, 0x8C03, 0xB5F8, 0x8DCC, 0xB5F9, 0x7239, 0xB5FA, 0x789F, 0xB5FB, 0x8776, 0xB5FC, 0x8FED, 0xB5FD, 0x8C0D, + 0xB5FE, 0x53E0, 0xB640, 0x7993, 0xB641, 0x7994, 0xB642, 0x7995, 0xB643, 0x7996, 0xB644, 0x7997, 0xB645, 0x7998, 0xB646, 0x7999, + 0xB647, 0x799B, 0xB648, 0x799C, 0xB649, 0x799D, 0xB64A, 0x799E, 0xB64B, 0x799F, 0xB64C, 0x79A0, 0xB64D, 0x79A1, 0xB64E, 0x79A2, + 0xB64F, 0x79A3, 0xB650, 0x79A4, 0xB651, 0x79A5, 0xB652, 0x79A6, 0xB653, 0x79A8, 0xB654, 0x79A9, 0xB655, 0x79AA, 0xB656, 0x79AB, + 0xB657, 0x79AC, 0xB658, 0x79AD, 0xB659, 0x79AE, 0xB65A, 0x79AF, 0xB65B, 0x79B0, 0xB65C, 0x79B1, 0xB65D, 0x79B2, 0xB65E, 0x79B4, + 0xB65F, 0x79B5, 0xB660, 0x79B6, 0xB661, 0x79B7, 0xB662, 0x79B8, 0xB663, 0x79BC, 0xB664, 0x79BF, 0xB665, 0x79C2, 0xB666, 0x79C4, + 0xB667, 0x79C5, 0xB668, 0x79C7, 0xB669, 0x79C8, 0xB66A, 0x79CA, 0xB66B, 0x79CC, 0xB66C, 0x79CE, 0xB66D, 0x79CF, 0xB66E, 0x79D0, + 0xB66F, 0x79D3, 0xB670, 0x79D4, 0xB671, 0x79D6, 0xB672, 0x79D7, 0xB673, 0x79D9, 0xB674, 0x79DA, 0xB675, 0x79DB, 0xB676, 0x79DC, + 0xB677, 0x79DD, 0xB678, 0x79DE, 0xB679, 0x79E0, 0xB67A, 0x79E1, 0xB67B, 0x79E2, 0xB67C, 0x79E5, 0xB67D, 0x79E8, 0xB67E, 0x79EA, + 0xB680, 0x79EC, 0xB681, 0x79EE, 0xB682, 0x79F1, 0xB683, 0x79F2, 0xB684, 0x79F3, 0xB685, 0x79F4, 0xB686, 0x79F5, 0xB687, 0x79F6, + 0xB688, 0x79F7, 0xB689, 0x79F9, 0xB68A, 0x79FA, 0xB68B, 0x79FC, 0xB68C, 0x79FE, 0xB68D, 0x79FF, 0xB68E, 0x7A01, 0xB68F, 0x7A04, + 0xB690, 0x7A05, 0xB691, 0x7A07, 0xB692, 0x7A08, 0xB693, 0x7A09, 0xB694, 0x7A0A, 0xB695, 0x7A0C, 0xB696, 0x7A0F, 0xB697, 0x7A10, + 0xB698, 0x7A11, 0xB699, 0x7A12, 0xB69A, 0x7A13, 0xB69B, 0x7A15, 0xB69C, 0x7A16, 0xB69D, 0x7A18, 0xB69E, 0x7A19, 0xB69F, 0x7A1B, + 0xB6A0, 0x7A1C, 0xB6A1, 0x4E01, 0xB6A2, 0x76EF, 0xB6A3, 0x53EE, 0xB6A4, 0x9489, 0xB6A5, 0x9876, 0xB6A6, 0x9F0E, 0xB6A7, 0x952D, + 0xB6A8, 0x5B9A, 0xB6A9, 0x8BA2, 0xB6AA, 0x4E22, 0xB6AB, 0x4E1C, 0xB6AC, 0x51AC, 0xB6AD, 0x8463, 0xB6AE, 0x61C2, 0xB6AF, 0x52A8, + 0xB6B0, 0x680B, 0xB6B1, 0x4F97, 0xB6B2, 0x606B, 0xB6B3, 0x51BB, 0xB6B4, 0x6D1E, 0xB6B5, 0x515C, 0xB6B6, 0x6296, 0xB6B7, 0x6597, + 0xB6B8, 0x9661, 0xB6B9, 0x8C46, 0xB6BA, 0x9017, 0xB6BB, 0x75D8, 0xB6BC, 0x90FD, 0xB6BD, 0x7763, 0xB6BE, 0x6BD2, 0xB6BF, 0x728A, + 0xB6C0, 0x72EC, 0xB6C1, 0x8BFB, 0xB6C2, 0x5835, 0xB6C3, 0x7779, 0xB6C4, 0x8D4C, 0xB6C5, 0x675C, 0xB6C6, 0x9540, 0xB6C7, 0x809A, + 0xB6C8, 0x5EA6, 0xB6C9, 0x6E21, 0xB6CA, 0x5992, 0xB6CB, 0x7AEF, 0xB6CC, 0x77ED, 0xB6CD, 0x953B, 0xB6CE, 0x6BB5, 0xB6CF, 0x65AD, + 0xB6D0, 0x7F0E, 0xB6D1, 0x5806, 0xB6D2, 0x5151, 0xB6D3, 0x961F, 0xB6D4, 0x5BF9, 0xB6D5, 0x58A9, 0xB6D6, 0x5428, 0xB6D7, 0x8E72, + 0xB6D8, 0x6566, 0xB6D9, 0x987F, 0xB6DA, 0x56E4, 0xB6DB, 0x949D, 0xB6DC, 0x76FE, 0xB6DD, 0x9041, 0xB6DE, 0x6387, 0xB6DF, 0x54C6, + 0xB6E0, 0x591A, 0xB6E1, 0x593A, 0xB6E2, 0x579B, 0xB6E3, 0x8EB2, 0xB6E4, 0x6735, 0xB6E5, 0x8DFA, 0xB6E6, 0x8235, 0xB6E7, 0x5241, + 0xB6E8, 0x60F0, 0xB6E9, 0x5815, 0xB6EA, 0x86FE, 0xB6EB, 0x5CE8, 0xB6EC, 0x9E45, 0xB6ED, 0x4FC4, 0xB6EE, 0x989D, 0xB6EF, 0x8BB9, + 0xB6F0, 0x5A25, 0xB6F1, 0x6076, 0xB6F2, 0x5384, 0xB6F3, 0x627C, 0xB6F4, 0x904F, 0xB6F5, 0x9102, 0xB6F6, 0x997F, 0xB6F7, 0x6069, + 0xB6F8, 0x800C, 0xB6F9, 0x513F, 0xB6FA, 0x8033, 0xB6FB, 0x5C14, 0xB6FC, 0x9975, 0xB6FD, 0x6D31, 0xB6FE, 0x4E8C, 0xB740, 0x7A1D, + 0xB741, 0x7A1F, 0xB742, 0x7A21, 0xB743, 0x7A22, 0xB744, 0x7A24, 0xB745, 0x7A25, 0xB746, 0x7A26, 0xB747, 0x7A27, 0xB748, 0x7A28, + 0xB749, 0x7A29, 0xB74A, 0x7A2A, 0xB74B, 0x7A2B, 0xB74C, 0x7A2C, 0xB74D, 0x7A2D, 0xB74E, 0x7A2E, 0xB74F, 0x7A2F, 0xB750, 0x7A30, + 0xB751, 0x7A31, 0xB752, 0x7A32, 0xB753, 0x7A34, 0xB754, 0x7A35, 0xB755, 0x7A36, 0xB756, 0x7A38, 0xB757, 0x7A3A, 0xB758, 0x7A3E, + 0xB759, 0x7A40, 0xB75A, 0x7A41, 0xB75B, 0x7A42, 0xB75C, 0x7A43, 0xB75D, 0x7A44, 0xB75E, 0x7A45, 0xB75F, 0x7A47, 0xB760, 0x7A48, + 0xB761, 0x7A49, 0xB762, 0x7A4A, 0xB763, 0x7A4B, 0xB764, 0x7A4C, 0xB765, 0x7A4D, 0xB766, 0x7A4E, 0xB767, 0x7A4F, 0xB768, 0x7A50, + 0xB769, 0x7A52, 0xB76A, 0x7A53, 0xB76B, 0x7A54, 0xB76C, 0x7A55, 0xB76D, 0x7A56, 0xB76E, 0x7A58, 0xB76F, 0x7A59, 0xB770, 0x7A5A, + 0xB771, 0x7A5B, 0xB772, 0x7A5C, 0xB773, 0x7A5D, 0xB774, 0x7A5E, 0xB775, 0x7A5F, 0xB776, 0x7A60, 0xB777, 0x7A61, 0xB778, 0x7A62, + 0xB779, 0x7A63, 0xB77A, 0x7A64, 0xB77B, 0x7A65, 0xB77C, 0x7A66, 0xB77D, 0x7A67, 0xB77E, 0x7A68, 0xB780, 0x7A69, 0xB781, 0x7A6A, + 0xB782, 0x7A6B, 0xB783, 0x7A6C, 0xB784, 0x7A6D, 0xB785, 0x7A6E, 0xB786, 0x7A6F, 0xB787, 0x7A71, 0xB788, 0x7A72, 0xB789, 0x7A73, + 0xB78A, 0x7A75, 0xB78B, 0x7A7B, 0xB78C, 0x7A7C, 0xB78D, 0x7A7D, 0xB78E, 0x7A7E, 0xB78F, 0x7A82, 0xB790, 0x7A85, 0xB791, 0x7A87, + 0xB792, 0x7A89, 0xB793, 0x7A8A, 0xB794, 0x7A8B, 0xB795, 0x7A8C, 0xB796, 0x7A8E, 0xB797, 0x7A8F, 0xB798, 0x7A90, 0xB799, 0x7A93, + 0xB79A, 0x7A94, 0xB79B, 0x7A99, 0xB79C, 0x7A9A, 0xB79D, 0x7A9B, 0xB79E, 0x7A9E, 0xB79F, 0x7AA1, 0xB7A0, 0x7AA2, 0xB7A1, 0x8D30, + 0xB7A2, 0x53D1, 0xB7A3, 0x7F5A, 0xB7A4, 0x7B4F, 0xB7A5, 0x4F10, 0xB7A6, 0x4E4F, 0xB7A7, 0x9600, 0xB7A8, 0x6CD5, 0xB7A9, 0x73D0, + 0xB7AA, 0x85E9, 0xB7AB, 0x5E06, 0xB7AC, 0x756A, 0xB7AD, 0x7FFB, 0xB7AE, 0x6A0A, 0xB7AF, 0x77FE, 0xB7B0, 0x9492, 0xB7B1, 0x7E41, + 0xB7B2, 0x51E1, 0xB7B3, 0x70E6, 0xB7B4, 0x53CD, 0xB7B5, 0x8FD4, 0xB7B6, 0x8303, 0xB7B7, 0x8D29, 0xB7B8, 0x72AF, 0xB7B9, 0x996D, + 0xB7BA, 0x6CDB, 0xB7BB, 0x574A, 0xB7BC, 0x82B3, 0xB7BD, 0x65B9, 0xB7BE, 0x80AA, 0xB7BF, 0x623F, 0xB7C0, 0x9632, 0xB7C1, 0x59A8, + 0xB7C2, 0x4EFF, 0xB7C3, 0x8BBF, 0xB7C4, 0x7EBA, 0xB7C5, 0x653E, 0xB7C6, 0x83F2, 0xB7C7, 0x975E, 0xB7C8, 0x5561, 0xB7C9, 0x98DE, + 0xB7CA, 0x80A5, 0xB7CB, 0x532A, 0xB7CC, 0x8BFD, 0xB7CD, 0x5420, 0xB7CE, 0x80BA, 0xB7CF, 0x5E9F, 0xB7D0, 0x6CB8, 0xB7D1, 0x8D39, + 0xB7D2, 0x82AC, 0xB7D3, 0x915A, 0xB7D4, 0x5429, 0xB7D5, 0x6C1B, 0xB7D6, 0x5206, 0xB7D7, 0x7EB7, 0xB7D8, 0x575F, 0xB7D9, 0x711A, + 0xB7DA, 0x6C7E, 0xB7DB, 0x7C89, 0xB7DC, 0x594B, 0xB7DD, 0x4EFD, 0xB7DE, 0x5FFF, 0xB7DF, 0x6124, 0xB7E0, 0x7CAA, 0xB7E1, 0x4E30, + 0xB7E2, 0x5C01, 0xB7E3, 0x67AB, 0xB7E4, 0x8702, 0xB7E5, 0x5CF0, 0xB7E6, 0x950B, 0xB7E7, 0x98CE, 0xB7E8, 0x75AF, 0xB7E9, 0x70FD, + 0xB7EA, 0x9022, 0xB7EB, 0x51AF, 0xB7EC, 0x7F1D, 0xB7ED, 0x8BBD, 0xB7EE, 0x5949, 0xB7EF, 0x51E4, 0xB7F0, 0x4F5B, 0xB7F1, 0x5426, + 0xB7F2, 0x592B, 0xB7F3, 0x6577, 0xB7F4, 0x80A4, 0xB7F5, 0x5B75, 0xB7F6, 0x6276, 0xB7F7, 0x62C2, 0xB7F8, 0x8F90, 0xB7F9, 0x5E45, + 0xB7FA, 0x6C1F, 0xB7FB, 0x7B26, 0xB7FC, 0x4F0F, 0xB7FD, 0x4FD8, 0xB7FE, 0x670D, 0xB840, 0x7AA3, 0xB841, 0x7AA4, 0xB842, 0x7AA7, + 0xB843, 0x7AA9, 0xB844, 0x7AAA, 0xB845, 0x7AAB, 0xB846, 0x7AAE, 0xB847, 0x7AAF, 0xB848, 0x7AB0, 0xB849, 0x7AB1, 0xB84A, 0x7AB2, + 0xB84B, 0x7AB4, 0xB84C, 0x7AB5, 0xB84D, 0x7AB6, 0xB84E, 0x7AB7, 0xB84F, 0x7AB8, 0xB850, 0x7AB9, 0xB851, 0x7ABA, 0xB852, 0x7ABB, + 0xB853, 0x7ABC, 0xB854, 0x7ABD, 0xB855, 0x7ABE, 0xB856, 0x7AC0, 0xB857, 0x7AC1, 0xB858, 0x7AC2, 0xB859, 0x7AC3, 0xB85A, 0x7AC4, + 0xB85B, 0x7AC5, 0xB85C, 0x7AC6, 0xB85D, 0x7AC7, 0xB85E, 0x7AC8, 0xB85F, 0x7AC9, 0xB860, 0x7ACA, 0xB861, 0x7ACC, 0xB862, 0x7ACD, + 0xB863, 0x7ACE, 0xB864, 0x7ACF, 0xB865, 0x7AD0, 0xB866, 0x7AD1, 0xB867, 0x7AD2, 0xB868, 0x7AD3, 0xB869, 0x7AD4, 0xB86A, 0x7AD5, + 0xB86B, 0x7AD7, 0xB86C, 0x7AD8, 0xB86D, 0x7ADA, 0xB86E, 0x7ADB, 0xB86F, 0x7ADC, 0xB870, 0x7ADD, 0xB871, 0x7AE1, 0xB872, 0x7AE2, + 0xB873, 0x7AE4, 0xB874, 0x7AE7, 0xB875, 0x7AE8, 0xB876, 0x7AE9, 0xB877, 0x7AEA, 0xB878, 0x7AEB, 0xB879, 0x7AEC, 0xB87A, 0x7AEE, + 0xB87B, 0x7AF0, 0xB87C, 0x7AF1, 0xB87D, 0x7AF2, 0xB87E, 0x7AF3, 0xB880, 0x7AF4, 0xB881, 0x7AF5, 0xB882, 0x7AF6, 0xB883, 0x7AF7, + 0xB884, 0x7AF8, 0xB885, 0x7AFB, 0xB886, 0x7AFC, 0xB887, 0x7AFE, 0xB888, 0x7B00, 0xB889, 0x7B01, 0xB88A, 0x7B02, 0xB88B, 0x7B05, + 0xB88C, 0x7B07, 0xB88D, 0x7B09, 0xB88E, 0x7B0C, 0xB88F, 0x7B0D, 0xB890, 0x7B0E, 0xB891, 0x7B10, 0xB892, 0x7B12, 0xB893, 0x7B13, + 0xB894, 0x7B16, 0xB895, 0x7B17, 0xB896, 0x7B18, 0xB897, 0x7B1A, 0xB898, 0x7B1C, 0xB899, 0x7B1D, 0xB89A, 0x7B1F, 0xB89B, 0x7B21, + 0xB89C, 0x7B22, 0xB89D, 0x7B23, 0xB89E, 0x7B27, 0xB89F, 0x7B29, 0xB8A0, 0x7B2D, 0xB8A1, 0x6D6E, 0xB8A2, 0x6DAA, 0xB8A3, 0x798F, + 0xB8A4, 0x88B1, 0xB8A5, 0x5F17, 0xB8A6, 0x752B, 0xB8A7, 0x629A, 0xB8A8, 0x8F85, 0xB8A9, 0x4FEF, 0xB8AA, 0x91DC, 0xB8AB, 0x65A7, + 0xB8AC, 0x812F, 0xB8AD, 0x8151, 0xB8AE, 0x5E9C, 0xB8AF, 0x8150, 0xB8B0, 0x8D74, 0xB8B1, 0x526F, 0xB8B2, 0x8986, 0xB8B3, 0x8D4B, + 0xB8B4, 0x590D, 0xB8B5, 0x5085, 0xB8B6, 0x4ED8, 0xB8B7, 0x961C, 0xB8B8, 0x7236, 0xB8B9, 0x8179, 0xB8BA, 0x8D1F, 0xB8BB, 0x5BCC, + 0xB8BC, 0x8BA3, 0xB8BD, 0x9644, 0xB8BE, 0x5987, 0xB8BF, 0x7F1A, 0xB8C0, 0x5490, 0xB8C1, 0x5676, 0xB8C2, 0x560E, 0xB8C3, 0x8BE5, + 0xB8C4, 0x6539, 0xB8C5, 0x6982, 0xB8C6, 0x9499, 0xB8C7, 0x76D6, 0xB8C8, 0x6E89, 0xB8C9, 0x5E72, 0xB8CA, 0x7518, 0xB8CB, 0x6746, + 0xB8CC, 0x67D1, 0xB8CD, 0x7AFF, 0xB8CE, 0x809D, 0xB8CF, 0x8D76, 0xB8D0, 0x611F, 0xB8D1, 0x79C6, 0xB8D2, 0x6562, 0xB8D3, 0x8D63, + 0xB8D4, 0x5188, 0xB8D5, 0x521A, 0xB8D6, 0x94A2, 0xB8D7, 0x7F38, 0xB8D8, 0x809B, 0xB8D9, 0x7EB2, 0xB8DA, 0x5C97, 0xB8DB, 0x6E2F, + 0xB8DC, 0x6760, 0xB8DD, 0x7BD9, 0xB8DE, 0x768B, 0xB8DF, 0x9AD8, 0xB8E0, 0x818F, 0xB8E1, 0x7F94, 0xB8E2, 0x7CD5, 0xB8E3, 0x641E, + 0xB8E4, 0x9550, 0xB8E5, 0x7A3F, 0xB8E6, 0x544A, 0xB8E7, 0x54E5, 0xB8E8, 0x6B4C, 0xB8E9, 0x6401, 0xB8EA, 0x6208, 0xB8EB, 0x9E3D, + 0xB8EC, 0x80F3, 0xB8ED, 0x7599, 0xB8EE, 0x5272, 0xB8EF, 0x9769, 0xB8F0, 0x845B, 0xB8F1, 0x683C, 0xB8F2, 0x86E4, 0xB8F3, 0x9601, + 0xB8F4, 0x9694, 0xB8F5, 0x94EC, 0xB8F6, 0x4E2A, 0xB8F7, 0x5404, 0xB8F8, 0x7ED9, 0xB8F9, 0x6839, 0xB8FA, 0x8DDF, 0xB8FB, 0x8015, + 0xB8FC, 0x66F4, 0xB8FD, 0x5E9A, 0xB8FE, 0x7FB9, 0xB940, 0x7B2F, 0xB941, 0x7B30, 0xB942, 0x7B32, 0xB943, 0x7B34, 0xB944, 0x7B35, + 0xB945, 0x7B36, 0xB946, 0x7B37, 0xB947, 0x7B39, 0xB948, 0x7B3B, 0xB949, 0x7B3D, 0xB94A, 0x7B3F, 0xB94B, 0x7B40, 0xB94C, 0x7B41, + 0xB94D, 0x7B42, 0xB94E, 0x7B43, 0xB94F, 0x7B44, 0xB950, 0x7B46, 0xB951, 0x7B48, 0xB952, 0x7B4A, 0xB953, 0x7B4D, 0xB954, 0x7B4E, + 0xB955, 0x7B53, 0xB956, 0x7B55, 0xB957, 0x7B57, 0xB958, 0x7B59, 0xB959, 0x7B5C, 0xB95A, 0x7B5E, 0xB95B, 0x7B5F, 0xB95C, 0x7B61, + 0xB95D, 0x7B63, 0xB95E, 0x7B64, 0xB95F, 0x7B65, 0xB960, 0x7B66, 0xB961, 0x7B67, 0xB962, 0x7B68, 0xB963, 0x7B69, 0xB964, 0x7B6A, + 0xB965, 0x7B6B, 0xB966, 0x7B6C, 0xB967, 0x7B6D, 0xB968, 0x7B6F, 0xB969, 0x7B70, 0xB96A, 0x7B73, 0xB96B, 0x7B74, 0xB96C, 0x7B76, + 0xB96D, 0x7B78, 0xB96E, 0x7B7A, 0xB96F, 0x7B7C, 0xB970, 0x7B7D, 0xB971, 0x7B7F, 0xB972, 0x7B81, 0xB973, 0x7B82, 0xB974, 0x7B83, + 0xB975, 0x7B84, 0xB976, 0x7B86, 0xB977, 0x7B87, 0xB978, 0x7B88, 0xB979, 0x7B89, 0xB97A, 0x7B8A, 0xB97B, 0x7B8B, 0xB97C, 0x7B8C, + 0xB97D, 0x7B8E, 0xB97E, 0x7B8F, 0xB980, 0x7B91, 0xB981, 0x7B92, 0xB982, 0x7B93, 0xB983, 0x7B96, 0xB984, 0x7B98, 0xB985, 0x7B99, + 0xB986, 0x7B9A, 0xB987, 0x7B9B, 0xB988, 0x7B9E, 0xB989, 0x7B9F, 0xB98A, 0x7BA0, 0xB98B, 0x7BA3, 0xB98C, 0x7BA4, 0xB98D, 0x7BA5, + 0xB98E, 0x7BAE, 0xB98F, 0x7BAF, 0xB990, 0x7BB0, 0xB991, 0x7BB2, 0xB992, 0x7BB3, 0xB993, 0x7BB5, 0xB994, 0x7BB6, 0xB995, 0x7BB7, + 0xB996, 0x7BB9, 0xB997, 0x7BBA, 0xB998, 0x7BBB, 0xB999, 0x7BBC, 0xB99A, 0x7BBD, 0xB99B, 0x7BBE, 0xB99C, 0x7BBF, 0xB99D, 0x7BC0, + 0xB99E, 0x7BC2, 0xB99F, 0x7BC3, 0xB9A0, 0x7BC4, 0xB9A1, 0x57C2, 0xB9A2, 0x803F, 0xB9A3, 0x6897, 0xB9A4, 0x5DE5, 0xB9A5, 0x653B, + 0xB9A6, 0x529F, 0xB9A7, 0x606D, 0xB9A8, 0x9F9A, 0xB9A9, 0x4F9B, 0xB9AA, 0x8EAC, 0xB9AB, 0x516C, 0xB9AC, 0x5BAB, 0xB9AD, 0x5F13, + 0xB9AE, 0x5DE9, 0xB9AF, 0x6C5E, 0xB9B0, 0x62F1, 0xB9B1, 0x8D21, 0xB9B2, 0x5171, 0xB9B3, 0x94A9, 0xB9B4, 0x52FE, 0xB9B5, 0x6C9F, + 0xB9B6, 0x82DF, 0xB9B7, 0x72D7, 0xB9B8, 0x57A2, 0xB9B9, 0x6784, 0xB9BA, 0x8D2D, 0xB9BB, 0x591F, 0xB9BC, 0x8F9C, 0xB9BD, 0x83C7, + 0xB9BE, 0x5495, 0xB9BF, 0x7B8D, 0xB9C0, 0x4F30, 0xB9C1, 0x6CBD, 0xB9C2, 0x5B64, 0xB9C3, 0x59D1, 0xB9C4, 0x9F13, 0xB9C5, 0x53E4, + 0xB9C6, 0x86CA, 0xB9C7, 0x9AA8, 0xB9C8, 0x8C37, 0xB9C9, 0x80A1, 0xB9CA, 0x6545, 0xB9CB, 0x987E, 0xB9CC, 0x56FA, 0xB9CD, 0x96C7, + 0xB9CE, 0x522E, 0xB9CF, 0x74DC, 0xB9D0, 0x5250, 0xB9D1, 0x5BE1, 0xB9D2, 0x6302, 0xB9D3, 0x8902, 0xB9D4, 0x4E56, 0xB9D5, 0x62D0, + 0xB9D6, 0x602A, 0xB9D7, 0x68FA, 0xB9D8, 0x5173, 0xB9D9, 0x5B98, 0xB9DA, 0x51A0, 0xB9DB, 0x89C2, 0xB9DC, 0x7BA1, 0xB9DD, 0x9986, + 0xB9DE, 0x7F50, 0xB9DF, 0x60EF, 0xB9E0, 0x704C, 0xB9E1, 0x8D2F, 0xB9E2, 0x5149, 0xB9E3, 0x5E7F, 0xB9E4, 0x901B, 0xB9E5, 0x7470, + 0xB9E6, 0x89C4, 0xB9E7, 0x572D, 0xB9E8, 0x7845, 0xB9E9, 0x5F52, 0xB9EA, 0x9F9F, 0xB9EB, 0x95FA, 0xB9EC, 0x8F68, 0xB9ED, 0x9B3C, + 0xB9EE, 0x8BE1, 0xB9EF, 0x7678, 0xB9F0, 0x6842, 0xB9F1, 0x67DC, 0xB9F2, 0x8DEA, 0xB9F3, 0x8D35, 0xB9F4, 0x523D, 0xB9F5, 0x8F8A, + 0xB9F6, 0x6EDA, 0xB9F7, 0x68CD, 0xB9F8, 0x9505, 0xB9F9, 0x90ED, 0xB9FA, 0x56FD, 0xB9FB, 0x679C, 0xB9FC, 0x88F9, 0xB9FD, 0x8FC7, + 0xB9FE, 0x54C8, 0xBA40, 0x7BC5, 0xBA41, 0x7BC8, 0xBA42, 0x7BC9, 0xBA43, 0x7BCA, 0xBA44, 0x7BCB, 0xBA45, 0x7BCD, 0xBA46, 0x7BCE, + 0xBA47, 0x7BCF, 0xBA48, 0x7BD0, 0xBA49, 0x7BD2, 0xBA4A, 0x7BD4, 0xBA4B, 0x7BD5, 0xBA4C, 0x7BD6, 0xBA4D, 0x7BD7, 0xBA4E, 0x7BD8, + 0xBA4F, 0x7BDB, 0xBA50, 0x7BDC, 0xBA51, 0x7BDE, 0xBA52, 0x7BDF, 0xBA53, 0x7BE0, 0xBA54, 0x7BE2, 0xBA55, 0x7BE3, 0xBA56, 0x7BE4, + 0xBA57, 0x7BE7, 0xBA58, 0x7BE8, 0xBA59, 0x7BE9, 0xBA5A, 0x7BEB, 0xBA5B, 0x7BEC, 0xBA5C, 0x7BED, 0xBA5D, 0x7BEF, 0xBA5E, 0x7BF0, + 0xBA5F, 0x7BF2, 0xBA60, 0x7BF3, 0xBA61, 0x7BF4, 0xBA62, 0x7BF5, 0xBA63, 0x7BF6, 0xBA64, 0x7BF8, 0xBA65, 0x7BF9, 0xBA66, 0x7BFA, + 0xBA67, 0x7BFB, 0xBA68, 0x7BFD, 0xBA69, 0x7BFF, 0xBA6A, 0x7C00, 0xBA6B, 0x7C01, 0xBA6C, 0x7C02, 0xBA6D, 0x7C03, 0xBA6E, 0x7C04, + 0xBA6F, 0x7C05, 0xBA70, 0x7C06, 0xBA71, 0x7C08, 0xBA72, 0x7C09, 0xBA73, 0x7C0A, 0xBA74, 0x7C0D, 0xBA75, 0x7C0E, 0xBA76, 0x7C10, + 0xBA77, 0x7C11, 0xBA78, 0x7C12, 0xBA79, 0x7C13, 0xBA7A, 0x7C14, 0xBA7B, 0x7C15, 0xBA7C, 0x7C17, 0xBA7D, 0x7C18, 0xBA7E, 0x7C19, + 0xBA80, 0x7C1A, 0xBA81, 0x7C1B, 0xBA82, 0x7C1C, 0xBA83, 0x7C1D, 0xBA84, 0x7C1E, 0xBA85, 0x7C20, 0xBA86, 0x7C21, 0xBA87, 0x7C22, + 0xBA88, 0x7C23, 0xBA89, 0x7C24, 0xBA8A, 0x7C25, 0xBA8B, 0x7C28, 0xBA8C, 0x7C29, 0xBA8D, 0x7C2B, 0xBA8E, 0x7C2C, 0xBA8F, 0x7C2D, + 0xBA90, 0x7C2E, 0xBA91, 0x7C2F, 0xBA92, 0x7C30, 0xBA93, 0x7C31, 0xBA94, 0x7C32, 0xBA95, 0x7C33, 0xBA96, 0x7C34, 0xBA97, 0x7C35, + 0xBA98, 0x7C36, 0xBA99, 0x7C37, 0xBA9A, 0x7C39, 0xBA9B, 0x7C3A, 0xBA9C, 0x7C3B, 0xBA9D, 0x7C3C, 0xBA9E, 0x7C3D, 0xBA9F, 0x7C3E, + 0xBAA0, 0x7C42, 0xBAA1, 0x9AB8, 0xBAA2, 0x5B69, 0xBAA3, 0x6D77, 0xBAA4, 0x6C26, 0xBAA5, 0x4EA5, 0xBAA6, 0x5BB3, 0xBAA7, 0x9A87, + 0xBAA8, 0x9163, 0xBAA9, 0x61A8, 0xBAAA, 0x90AF, 0xBAAB, 0x97E9, 0xBAAC, 0x542B, 0xBAAD, 0x6DB5, 0xBAAE, 0x5BD2, 0xBAAF, 0x51FD, + 0xBAB0, 0x558A, 0xBAB1, 0x7F55, 0xBAB2, 0x7FF0, 0xBAB3, 0x64BC, 0xBAB4, 0x634D, 0xBAB5, 0x65F1, 0xBAB6, 0x61BE, 0xBAB7, 0x608D, + 0xBAB8, 0x710A, 0xBAB9, 0x6C57, 0xBABA, 0x6C49, 0xBABB, 0x592F, 0xBABC, 0x676D, 0xBABD, 0x822A, 0xBABE, 0x58D5, 0xBABF, 0x568E, + 0xBAC0, 0x8C6A, 0xBAC1, 0x6BEB, 0xBAC2, 0x90DD, 0xBAC3, 0x597D, 0xBAC4, 0x8017, 0xBAC5, 0x53F7, 0xBAC6, 0x6D69, 0xBAC7, 0x5475, + 0xBAC8, 0x559D, 0xBAC9, 0x8377, 0xBACA, 0x83CF, 0xBACB, 0x6838, 0xBACC, 0x79BE, 0xBACD, 0x548C, 0xBACE, 0x4F55, 0xBACF, 0x5408, + 0xBAD0, 0x76D2, 0xBAD1, 0x8C89, 0xBAD2, 0x9602, 0xBAD3, 0x6CB3, 0xBAD4, 0x6DB8, 0xBAD5, 0x8D6B, 0xBAD6, 0x8910, 0xBAD7, 0x9E64, + 0xBAD8, 0x8D3A, 0xBAD9, 0x563F, 0xBADA, 0x9ED1, 0xBADB, 0x75D5, 0xBADC, 0x5F88, 0xBADD, 0x72E0, 0xBADE, 0x6068, 0xBADF, 0x54FC, + 0xBAE0, 0x4EA8, 0xBAE1, 0x6A2A, 0xBAE2, 0x8861, 0xBAE3, 0x6052, 0xBAE4, 0x8F70, 0xBAE5, 0x54C4, 0xBAE6, 0x70D8, 0xBAE7, 0x8679, + 0xBAE8, 0x9E3F, 0xBAE9, 0x6D2A, 0xBAEA, 0x5B8F, 0xBAEB, 0x5F18, 0xBAEC, 0x7EA2, 0xBAED, 0x5589, 0xBAEE, 0x4FAF, 0xBAEF, 0x7334, + 0xBAF0, 0x543C, 0xBAF1, 0x539A, 0xBAF2, 0x5019, 0xBAF3, 0x540E, 0xBAF4, 0x547C, 0xBAF5, 0x4E4E, 0xBAF6, 0x5FFD, 0xBAF7, 0x745A, + 0xBAF8, 0x58F6, 0xBAF9, 0x846B, 0xBAFA, 0x80E1, 0xBAFB, 0x8774, 0xBAFC, 0x72D0, 0xBAFD, 0x7CCA, 0xBAFE, 0x6E56, 0xBB40, 0x7C43, + 0xBB41, 0x7C44, 0xBB42, 0x7C45, 0xBB43, 0x7C46, 0xBB44, 0x7C47, 0xBB45, 0x7C48, 0xBB46, 0x7C49, 0xBB47, 0x7C4A, 0xBB48, 0x7C4B, + 0xBB49, 0x7C4C, 0xBB4A, 0x7C4E, 0xBB4B, 0x7C4F, 0xBB4C, 0x7C50, 0xBB4D, 0x7C51, 0xBB4E, 0x7C52, 0xBB4F, 0x7C53, 0xBB50, 0x7C54, + 0xBB51, 0x7C55, 0xBB52, 0x7C56, 0xBB53, 0x7C57, 0xBB54, 0x7C58, 0xBB55, 0x7C59, 0xBB56, 0x7C5A, 0xBB57, 0x7C5B, 0xBB58, 0x7C5C, + 0xBB59, 0x7C5D, 0xBB5A, 0x7C5E, 0xBB5B, 0x7C5F, 0xBB5C, 0x7C60, 0xBB5D, 0x7C61, 0xBB5E, 0x7C62, 0xBB5F, 0x7C63, 0xBB60, 0x7C64, + 0xBB61, 0x7C65, 0xBB62, 0x7C66, 0xBB63, 0x7C67, 0xBB64, 0x7C68, 0xBB65, 0x7C69, 0xBB66, 0x7C6A, 0xBB67, 0x7C6B, 0xBB68, 0x7C6C, + 0xBB69, 0x7C6D, 0xBB6A, 0x7C6E, 0xBB6B, 0x7C6F, 0xBB6C, 0x7C70, 0xBB6D, 0x7C71, 0xBB6E, 0x7C72, 0xBB6F, 0x7C75, 0xBB70, 0x7C76, + 0xBB71, 0x7C77, 0xBB72, 0x7C78, 0xBB73, 0x7C79, 0xBB74, 0x7C7A, 0xBB75, 0x7C7E, 0xBB76, 0x7C7F, 0xBB77, 0x7C80, 0xBB78, 0x7C81, + 0xBB79, 0x7C82, 0xBB7A, 0x7C83, 0xBB7B, 0x7C84, 0xBB7C, 0x7C85, 0xBB7D, 0x7C86, 0xBB7E, 0x7C87, 0xBB80, 0x7C88, 0xBB81, 0x7C8A, + 0xBB82, 0x7C8B, 0xBB83, 0x7C8C, 0xBB84, 0x7C8D, 0xBB85, 0x7C8E, 0xBB86, 0x7C8F, 0xBB87, 0x7C90, 0xBB88, 0x7C93, 0xBB89, 0x7C94, + 0xBB8A, 0x7C96, 0xBB8B, 0x7C99, 0xBB8C, 0x7C9A, 0xBB8D, 0x7C9B, 0xBB8E, 0x7CA0, 0xBB8F, 0x7CA1, 0xBB90, 0x7CA3, 0xBB91, 0x7CA6, + 0xBB92, 0x7CA7, 0xBB93, 0x7CA8, 0xBB94, 0x7CA9, 0xBB95, 0x7CAB, 0xBB96, 0x7CAC, 0xBB97, 0x7CAD, 0xBB98, 0x7CAF, 0xBB99, 0x7CB0, + 0xBB9A, 0x7CB4, 0xBB9B, 0x7CB5, 0xBB9C, 0x7CB6, 0xBB9D, 0x7CB7, 0xBB9E, 0x7CB8, 0xBB9F, 0x7CBA, 0xBBA0, 0x7CBB, 0xBBA1, 0x5F27, + 0xBBA2, 0x864E, 0xBBA3, 0x552C, 0xBBA4, 0x62A4, 0xBBA5, 0x4E92, 0xBBA6, 0x6CAA, 0xBBA7, 0x6237, 0xBBA8, 0x82B1, 0xBBA9, 0x54D7, + 0xBBAA, 0x534E, 0xBBAB, 0x733E, 0xBBAC, 0x6ED1, 0xBBAD, 0x753B, 0xBBAE, 0x5212, 0xBBAF, 0x5316, 0xBBB0, 0x8BDD, 0xBBB1, 0x69D0, + 0xBBB2, 0x5F8A, 0xBBB3, 0x6000, 0xBBB4, 0x6DEE, 0xBBB5, 0x574F, 0xBBB6, 0x6B22, 0xBBB7, 0x73AF, 0xBBB8, 0x6853, 0xBBB9, 0x8FD8, + 0xBBBA, 0x7F13, 0xBBBB, 0x6362, 0xBBBC, 0x60A3, 0xBBBD, 0x5524, 0xBBBE, 0x75EA, 0xBBBF, 0x8C62, 0xBBC0, 0x7115, 0xBBC1, 0x6DA3, + 0xBBC2, 0x5BA6, 0xBBC3, 0x5E7B, 0xBBC4, 0x8352, 0xBBC5, 0x614C, 0xBBC6, 0x9EC4, 0xBBC7, 0x78FA, 0xBBC8, 0x8757, 0xBBC9, 0x7C27, + 0xBBCA, 0x7687, 0xBBCB, 0x51F0, 0xBBCC, 0x60F6, 0xBBCD, 0x714C, 0xBBCE, 0x6643, 0xBBCF, 0x5E4C, 0xBBD0, 0x604D, 0xBBD1, 0x8C0E, + 0xBBD2, 0x7070, 0xBBD3, 0x6325, 0xBBD4, 0x8F89, 0xBBD5, 0x5FBD, 0xBBD6, 0x6062, 0xBBD7, 0x86D4, 0xBBD8, 0x56DE, 0xBBD9, 0x6BC1, + 0xBBDA, 0x6094, 0xBBDB, 0x6167, 0xBBDC, 0x5349, 0xBBDD, 0x60E0, 0xBBDE, 0x6666, 0xBBDF, 0x8D3F, 0xBBE0, 0x79FD, 0xBBE1, 0x4F1A, + 0xBBE2, 0x70E9, 0xBBE3, 0x6C47, 0xBBE4, 0x8BB3, 0xBBE5, 0x8BF2, 0xBBE6, 0x7ED8, 0xBBE7, 0x8364, 0xBBE8, 0x660F, 0xBBE9, 0x5A5A, + 0xBBEA, 0x9B42, 0xBBEB, 0x6D51, 0xBBEC, 0x6DF7, 0xBBED, 0x8C41, 0xBBEE, 0x6D3B, 0xBBEF, 0x4F19, 0xBBF0, 0x706B, 0xBBF1, 0x83B7, + 0xBBF2, 0x6216, 0xBBF3, 0x60D1, 0xBBF4, 0x970D, 0xBBF5, 0x8D27, 0xBBF6, 0x7978, 0xBBF7, 0x51FB, 0xBBF8, 0x573E, 0xBBF9, 0x57FA, + 0xBBFA, 0x673A, 0xBBFB, 0x7578, 0xBBFC, 0x7A3D, 0xBBFD, 0x79EF, 0xBBFE, 0x7B95, 0xBC40, 0x7CBF, 0xBC41, 0x7CC0, 0xBC42, 0x7CC2, + 0xBC43, 0x7CC3, 0xBC44, 0x7CC4, 0xBC45, 0x7CC6, 0xBC46, 0x7CC9, 0xBC47, 0x7CCB, 0xBC48, 0x7CCE, 0xBC49, 0x7CCF, 0xBC4A, 0x7CD0, + 0xBC4B, 0x7CD1, 0xBC4C, 0x7CD2, 0xBC4D, 0x7CD3, 0xBC4E, 0x7CD4, 0xBC4F, 0x7CD8, 0xBC50, 0x7CDA, 0xBC51, 0x7CDB, 0xBC52, 0x7CDD, + 0xBC53, 0x7CDE, 0xBC54, 0x7CE1, 0xBC55, 0x7CE2, 0xBC56, 0x7CE3, 0xBC57, 0x7CE4, 0xBC58, 0x7CE5, 0xBC59, 0x7CE6, 0xBC5A, 0x7CE7, + 0xBC5B, 0x7CE9, 0xBC5C, 0x7CEA, 0xBC5D, 0x7CEB, 0xBC5E, 0x7CEC, 0xBC5F, 0x7CED, 0xBC60, 0x7CEE, 0xBC61, 0x7CF0, 0xBC62, 0x7CF1, + 0xBC63, 0x7CF2, 0xBC64, 0x7CF3, 0xBC65, 0x7CF4, 0xBC66, 0x7CF5, 0xBC67, 0x7CF6, 0xBC68, 0x7CF7, 0xBC69, 0x7CF9, 0xBC6A, 0x7CFA, + 0xBC6B, 0x7CFC, 0xBC6C, 0x7CFD, 0xBC6D, 0x7CFE, 0xBC6E, 0x7CFF, 0xBC6F, 0x7D00, 0xBC70, 0x7D01, 0xBC71, 0x7D02, 0xBC72, 0x7D03, + 0xBC73, 0x7D04, 0xBC74, 0x7D05, 0xBC75, 0x7D06, 0xBC76, 0x7D07, 0xBC77, 0x7D08, 0xBC78, 0x7D09, 0xBC79, 0x7D0B, 0xBC7A, 0x7D0C, + 0xBC7B, 0x7D0D, 0xBC7C, 0x7D0E, 0xBC7D, 0x7D0F, 0xBC7E, 0x7D10, 0xBC80, 0x7D11, 0xBC81, 0x7D12, 0xBC82, 0x7D13, 0xBC83, 0x7D14, + 0xBC84, 0x7D15, 0xBC85, 0x7D16, 0xBC86, 0x7D17, 0xBC87, 0x7D18, 0xBC88, 0x7D19, 0xBC89, 0x7D1A, 0xBC8A, 0x7D1B, 0xBC8B, 0x7D1C, + 0xBC8C, 0x7D1D, 0xBC8D, 0x7D1E, 0xBC8E, 0x7D1F, 0xBC8F, 0x7D21, 0xBC90, 0x7D23, 0xBC91, 0x7D24, 0xBC92, 0x7D25, 0xBC93, 0x7D26, + 0xBC94, 0x7D28, 0xBC95, 0x7D29, 0xBC96, 0x7D2A, 0xBC97, 0x7D2C, 0xBC98, 0x7D2D, 0xBC99, 0x7D2E, 0xBC9A, 0x7D30, 0xBC9B, 0x7D31, + 0xBC9C, 0x7D32, 0xBC9D, 0x7D33, 0xBC9E, 0x7D34, 0xBC9F, 0x7D35, 0xBCA0, 0x7D36, 0xBCA1, 0x808C, 0xBCA2, 0x9965, 0xBCA3, 0x8FF9, + 0xBCA4, 0x6FC0, 0xBCA5, 0x8BA5, 0xBCA6, 0x9E21, 0xBCA7, 0x59EC, 0xBCA8, 0x7EE9, 0xBCA9, 0x7F09, 0xBCAA, 0x5409, 0xBCAB, 0x6781, + 0xBCAC, 0x68D8, 0xBCAD, 0x8F91, 0xBCAE, 0x7C4D, 0xBCAF, 0x96C6, 0xBCB0, 0x53CA, 0xBCB1, 0x6025, 0xBCB2, 0x75BE, 0xBCB3, 0x6C72, + 0xBCB4, 0x5373, 0xBCB5, 0x5AC9, 0xBCB6, 0x7EA7, 0xBCB7, 0x6324, 0xBCB8, 0x51E0, 0xBCB9, 0x810A, 0xBCBA, 0x5DF1, 0xBCBB, 0x84DF, + 0xBCBC, 0x6280, 0xBCBD, 0x5180, 0xBCBE, 0x5B63, 0xBCBF, 0x4F0E, 0xBCC0, 0x796D, 0xBCC1, 0x5242, 0xBCC2, 0x60B8, 0xBCC3, 0x6D4E, + 0xBCC4, 0x5BC4, 0xBCC5, 0x5BC2, 0xBCC6, 0x8BA1, 0xBCC7, 0x8BB0, 0xBCC8, 0x65E2, 0xBCC9, 0x5FCC, 0xBCCA, 0x9645, 0xBCCB, 0x5993, + 0xBCCC, 0x7EE7, 0xBCCD, 0x7EAA, 0xBCCE, 0x5609, 0xBCCF, 0x67B7, 0xBCD0, 0x5939, 0xBCD1, 0x4F73, 0xBCD2, 0x5BB6, 0xBCD3, 0x52A0, + 0xBCD4, 0x835A, 0xBCD5, 0x988A, 0xBCD6, 0x8D3E, 0xBCD7, 0x7532, 0xBCD8, 0x94BE, 0xBCD9, 0x5047, 0xBCDA, 0x7A3C, 0xBCDB, 0x4EF7, + 0xBCDC, 0x67B6, 0xBCDD, 0x9A7E, 0xBCDE, 0x5AC1, 0xBCDF, 0x6B7C, 0xBCE0, 0x76D1, 0xBCE1, 0x575A, 0xBCE2, 0x5C16, 0xBCE3, 0x7B3A, + 0xBCE4, 0x95F4, 0xBCE5, 0x714E, 0xBCE6, 0x517C, 0xBCE7, 0x80A9, 0xBCE8, 0x8270, 0xBCE9, 0x5978, 0xBCEA, 0x7F04, 0xBCEB, 0x8327, + 0xBCEC, 0x68C0, 0xBCED, 0x67EC, 0xBCEE, 0x78B1, 0xBCEF, 0x7877, 0xBCF0, 0x62E3, 0xBCF1, 0x6361, 0xBCF2, 0x7B80, 0xBCF3, 0x4FED, + 0xBCF4, 0x526A, 0xBCF5, 0x51CF, 0xBCF6, 0x8350, 0xBCF7, 0x69DB, 0xBCF8, 0x9274, 0xBCF9, 0x8DF5, 0xBCFA, 0x8D31, 0xBCFB, 0x89C1, + 0xBCFC, 0x952E, 0xBCFD, 0x7BAD, 0xBCFE, 0x4EF6, 0xBD40, 0x7D37, 0xBD41, 0x7D38, 0xBD42, 0x7D39, 0xBD43, 0x7D3A, 0xBD44, 0x7D3B, + 0xBD45, 0x7D3C, 0xBD46, 0x7D3D, 0xBD47, 0x7D3E, 0xBD48, 0x7D3F, 0xBD49, 0x7D40, 0xBD4A, 0x7D41, 0xBD4B, 0x7D42, 0xBD4C, 0x7D43, + 0xBD4D, 0x7D44, 0xBD4E, 0x7D45, 0xBD4F, 0x7D46, 0xBD50, 0x7D47, 0xBD51, 0x7D48, 0xBD52, 0x7D49, 0xBD53, 0x7D4A, 0xBD54, 0x7D4B, + 0xBD55, 0x7D4C, 0xBD56, 0x7D4D, 0xBD57, 0x7D4E, 0xBD58, 0x7D4F, 0xBD59, 0x7D50, 0xBD5A, 0x7D51, 0xBD5B, 0x7D52, 0xBD5C, 0x7D53, + 0xBD5D, 0x7D54, 0xBD5E, 0x7D55, 0xBD5F, 0x7D56, 0xBD60, 0x7D57, 0xBD61, 0x7D58, 0xBD62, 0x7D59, 0xBD63, 0x7D5A, 0xBD64, 0x7D5B, + 0xBD65, 0x7D5C, 0xBD66, 0x7D5D, 0xBD67, 0x7D5E, 0xBD68, 0x7D5F, 0xBD69, 0x7D60, 0xBD6A, 0x7D61, 0xBD6B, 0x7D62, 0xBD6C, 0x7D63, + 0xBD6D, 0x7D64, 0xBD6E, 0x7D65, 0xBD6F, 0x7D66, 0xBD70, 0x7D67, 0xBD71, 0x7D68, 0xBD72, 0x7D69, 0xBD73, 0x7D6A, 0xBD74, 0x7D6B, + 0xBD75, 0x7D6C, 0xBD76, 0x7D6D, 0xBD77, 0x7D6F, 0xBD78, 0x7D70, 0xBD79, 0x7D71, 0xBD7A, 0x7D72, 0xBD7B, 0x7D73, 0xBD7C, 0x7D74, + 0xBD7D, 0x7D75, 0xBD7E, 0x7D76, 0xBD80, 0x7D78, 0xBD81, 0x7D79, 0xBD82, 0x7D7A, 0xBD83, 0x7D7B, 0xBD84, 0x7D7C, 0xBD85, 0x7D7D, + 0xBD86, 0x7D7E, 0xBD87, 0x7D7F, 0xBD88, 0x7D80, 0xBD89, 0x7D81, 0xBD8A, 0x7D82, 0xBD8B, 0x7D83, 0xBD8C, 0x7D84, 0xBD8D, 0x7D85, + 0xBD8E, 0x7D86, 0xBD8F, 0x7D87, 0xBD90, 0x7D88, 0xBD91, 0x7D89, 0xBD92, 0x7D8A, 0xBD93, 0x7D8B, 0xBD94, 0x7D8C, 0xBD95, 0x7D8D, + 0xBD96, 0x7D8E, 0xBD97, 0x7D8F, 0xBD98, 0x7D90, 0xBD99, 0x7D91, 0xBD9A, 0x7D92, 0xBD9B, 0x7D93, 0xBD9C, 0x7D94, 0xBD9D, 0x7D95, + 0xBD9E, 0x7D96, 0xBD9F, 0x7D97, 0xBDA0, 0x7D98, 0xBDA1, 0x5065, 0xBDA2, 0x8230, 0xBDA3, 0x5251, 0xBDA4, 0x996F, 0xBDA5, 0x6E10, + 0xBDA6, 0x6E85, 0xBDA7, 0x6DA7, 0xBDA8, 0x5EFA, 0xBDA9, 0x50F5, 0xBDAA, 0x59DC, 0xBDAB, 0x5C06, 0xBDAC, 0x6D46, 0xBDAD, 0x6C5F, + 0xBDAE, 0x7586, 0xBDAF, 0x848B, 0xBDB0, 0x6868, 0xBDB1, 0x5956, 0xBDB2, 0x8BB2, 0xBDB3, 0x5320, 0xBDB4, 0x9171, 0xBDB5, 0x964D, + 0xBDB6, 0x8549, 0xBDB7, 0x6912, 0xBDB8, 0x7901, 0xBDB9, 0x7126, 0xBDBA, 0x80F6, 0xBDBB, 0x4EA4, 0xBDBC, 0x90CA, 0xBDBD, 0x6D47, + 0xBDBE, 0x9A84, 0xBDBF, 0x5A07, 0xBDC0, 0x56BC, 0xBDC1, 0x6405, 0xBDC2, 0x94F0, 0xBDC3, 0x77EB, 0xBDC4, 0x4FA5, 0xBDC5, 0x811A, + 0xBDC6, 0x72E1, 0xBDC7, 0x89D2, 0xBDC8, 0x997A, 0xBDC9, 0x7F34, 0xBDCA, 0x7EDE, 0xBDCB, 0x527F, 0xBDCC, 0x6559, 0xBDCD, 0x9175, + 0xBDCE, 0x8F7F, 0xBDCF, 0x8F83, 0xBDD0, 0x53EB, 0xBDD1, 0x7A96, 0xBDD2, 0x63ED, 0xBDD3, 0x63A5, 0xBDD4, 0x7686, 0xBDD5, 0x79F8, + 0xBDD6, 0x8857, 0xBDD7, 0x9636, 0xBDD8, 0x622A, 0xBDD9, 0x52AB, 0xBDDA, 0x8282, 0xBDDB, 0x6854, 0xBDDC, 0x6770, 0xBDDD, 0x6377, + 0xBDDE, 0x776B, 0xBDDF, 0x7AED, 0xBDE0, 0x6D01, 0xBDE1, 0x7ED3, 0xBDE2, 0x89E3, 0xBDE3, 0x59D0, 0xBDE4, 0x6212, 0xBDE5, 0x85C9, + 0xBDE6, 0x82A5, 0xBDE7, 0x754C, 0xBDE8, 0x501F, 0xBDE9, 0x4ECB, 0xBDEA, 0x75A5, 0xBDEB, 0x8BEB, 0xBDEC, 0x5C4A, 0xBDED, 0x5DFE, + 0xBDEE, 0x7B4B, 0xBDEF, 0x65A4, 0xBDF0, 0x91D1, 0xBDF1, 0x4ECA, 0xBDF2, 0x6D25, 0xBDF3, 0x895F, 0xBDF4, 0x7D27, 0xBDF5, 0x9526, + 0xBDF6, 0x4EC5, 0xBDF7, 0x8C28, 0xBDF8, 0x8FDB, 0xBDF9, 0x9773, 0xBDFA, 0x664B, 0xBDFB, 0x7981, 0xBDFC, 0x8FD1, 0xBDFD, 0x70EC, + 0xBDFE, 0x6D78, 0xBE40, 0x7D99, 0xBE41, 0x7D9A, 0xBE42, 0x7D9B, 0xBE43, 0x7D9C, 0xBE44, 0x7D9D, 0xBE45, 0x7D9E, 0xBE46, 0x7D9F, + 0xBE47, 0x7DA0, 0xBE48, 0x7DA1, 0xBE49, 0x7DA2, 0xBE4A, 0x7DA3, 0xBE4B, 0x7DA4, 0xBE4C, 0x7DA5, 0xBE4D, 0x7DA7, 0xBE4E, 0x7DA8, + 0xBE4F, 0x7DA9, 0xBE50, 0x7DAA, 0xBE51, 0x7DAB, 0xBE52, 0x7DAC, 0xBE53, 0x7DAD, 0xBE54, 0x7DAF, 0xBE55, 0x7DB0, 0xBE56, 0x7DB1, + 0xBE57, 0x7DB2, 0xBE58, 0x7DB3, 0xBE59, 0x7DB4, 0xBE5A, 0x7DB5, 0xBE5B, 0x7DB6, 0xBE5C, 0x7DB7, 0xBE5D, 0x7DB8, 0xBE5E, 0x7DB9, + 0xBE5F, 0x7DBA, 0xBE60, 0x7DBB, 0xBE61, 0x7DBC, 0xBE62, 0x7DBD, 0xBE63, 0x7DBE, 0xBE64, 0x7DBF, 0xBE65, 0x7DC0, 0xBE66, 0x7DC1, + 0xBE67, 0x7DC2, 0xBE68, 0x7DC3, 0xBE69, 0x7DC4, 0xBE6A, 0x7DC5, 0xBE6B, 0x7DC6, 0xBE6C, 0x7DC7, 0xBE6D, 0x7DC8, 0xBE6E, 0x7DC9, + 0xBE6F, 0x7DCA, 0xBE70, 0x7DCB, 0xBE71, 0x7DCC, 0xBE72, 0x7DCD, 0xBE73, 0x7DCE, 0xBE74, 0x7DCF, 0xBE75, 0x7DD0, 0xBE76, 0x7DD1, + 0xBE77, 0x7DD2, 0xBE78, 0x7DD3, 0xBE79, 0x7DD4, 0xBE7A, 0x7DD5, 0xBE7B, 0x7DD6, 0xBE7C, 0x7DD7, 0xBE7D, 0x7DD8, 0xBE7E, 0x7DD9, + 0xBE80, 0x7DDA, 0xBE81, 0x7DDB, 0xBE82, 0x7DDC, 0xBE83, 0x7DDD, 0xBE84, 0x7DDE, 0xBE85, 0x7DDF, 0xBE86, 0x7DE0, 0xBE87, 0x7DE1, + 0xBE88, 0x7DE2, 0xBE89, 0x7DE3, 0xBE8A, 0x7DE4, 0xBE8B, 0x7DE5, 0xBE8C, 0x7DE6, 0xBE8D, 0x7DE7, 0xBE8E, 0x7DE8, 0xBE8F, 0x7DE9, + 0xBE90, 0x7DEA, 0xBE91, 0x7DEB, 0xBE92, 0x7DEC, 0xBE93, 0x7DED, 0xBE94, 0x7DEE, 0xBE95, 0x7DEF, 0xBE96, 0x7DF0, 0xBE97, 0x7DF1, + 0xBE98, 0x7DF2, 0xBE99, 0x7DF3, 0xBE9A, 0x7DF4, 0xBE9B, 0x7DF5, 0xBE9C, 0x7DF6, 0xBE9D, 0x7DF7, 0xBE9E, 0x7DF8, 0xBE9F, 0x7DF9, + 0xBEA0, 0x7DFA, 0xBEA1, 0x5C3D, 0xBEA2, 0x52B2, 0xBEA3, 0x8346, 0xBEA4, 0x5162, 0xBEA5, 0x830E, 0xBEA6, 0x775B, 0xBEA7, 0x6676, + 0xBEA8, 0x9CB8, 0xBEA9, 0x4EAC, 0xBEAA, 0x60CA, 0xBEAB, 0x7CBE, 0xBEAC, 0x7CB3, 0xBEAD, 0x7ECF, 0xBEAE, 0x4E95, 0xBEAF, 0x8B66, + 0xBEB0, 0x666F, 0xBEB1, 0x9888, 0xBEB2, 0x9759, 0xBEB3, 0x5883, 0xBEB4, 0x656C, 0xBEB5, 0x955C, 0xBEB6, 0x5F84, 0xBEB7, 0x75C9, + 0xBEB8, 0x9756, 0xBEB9, 0x7ADF, 0xBEBA, 0x7ADE, 0xBEBB, 0x51C0, 0xBEBC, 0x70AF, 0xBEBD, 0x7A98, 0xBEBE, 0x63EA, 0xBEBF, 0x7A76, + 0xBEC0, 0x7EA0, 0xBEC1, 0x7396, 0xBEC2, 0x97ED, 0xBEC3, 0x4E45, 0xBEC4, 0x7078, 0xBEC5, 0x4E5D, 0xBEC6, 0x9152, 0xBEC7, 0x53A9, + 0xBEC8, 0x6551, 0xBEC9, 0x65E7, 0xBECA, 0x81FC, 0xBECB, 0x8205, 0xBECC, 0x548E, 0xBECD, 0x5C31, 0xBECE, 0x759A, 0xBECF, 0x97A0, + 0xBED0, 0x62D8, 0xBED1, 0x72D9, 0xBED2, 0x75BD, 0xBED3, 0x5C45, 0xBED4, 0x9A79, 0xBED5, 0x83CA, 0xBED6, 0x5C40, 0xBED7, 0x5480, + 0xBED8, 0x77E9, 0xBED9, 0x4E3E, 0xBEDA, 0x6CAE, 0xBEDB, 0x805A, 0xBEDC, 0x62D2, 0xBEDD, 0x636E, 0xBEDE, 0x5DE8, 0xBEDF, 0x5177, + 0xBEE0, 0x8DDD, 0xBEE1, 0x8E1E, 0xBEE2, 0x952F, 0xBEE3, 0x4FF1, 0xBEE4, 0x53E5, 0xBEE5, 0x60E7, 0xBEE6, 0x70AC, 0xBEE7, 0x5267, + 0xBEE8, 0x6350, 0xBEE9, 0x9E43, 0xBEEA, 0x5A1F, 0xBEEB, 0x5026, 0xBEEC, 0x7737, 0xBEED, 0x5377, 0xBEEE, 0x7EE2, 0xBEEF, 0x6485, + 0xBEF0, 0x652B, 0xBEF1, 0x6289, 0xBEF2, 0x6398, 0xBEF3, 0x5014, 0xBEF4, 0x7235, 0xBEF5, 0x89C9, 0xBEF6, 0x51B3, 0xBEF7, 0x8BC0, + 0xBEF8, 0x7EDD, 0xBEF9, 0x5747, 0xBEFA, 0x83CC, 0xBEFB, 0x94A7, 0xBEFC, 0x519B, 0xBEFD, 0x541B, 0xBEFE, 0x5CFB, 0xBF40, 0x7DFB, + 0xBF41, 0x7DFC, 0xBF42, 0x7DFD, 0xBF43, 0x7DFE, 0xBF44, 0x7DFF, 0xBF45, 0x7E00, 0xBF46, 0x7E01, 0xBF47, 0x7E02, 0xBF48, 0x7E03, + 0xBF49, 0x7E04, 0xBF4A, 0x7E05, 0xBF4B, 0x7E06, 0xBF4C, 0x7E07, 0xBF4D, 0x7E08, 0xBF4E, 0x7E09, 0xBF4F, 0x7E0A, 0xBF50, 0x7E0B, + 0xBF51, 0x7E0C, 0xBF52, 0x7E0D, 0xBF53, 0x7E0E, 0xBF54, 0x7E0F, 0xBF55, 0x7E10, 0xBF56, 0x7E11, 0xBF57, 0x7E12, 0xBF58, 0x7E13, + 0xBF59, 0x7E14, 0xBF5A, 0x7E15, 0xBF5B, 0x7E16, 0xBF5C, 0x7E17, 0xBF5D, 0x7E18, 0xBF5E, 0x7E19, 0xBF5F, 0x7E1A, 0xBF60, 0x7E1B, + 0xBF61, 0x7E1C, 0xBF62, 0x7E1D, 0xBF63, 0x7E1E, 0xBF64, 0x7E1F, 0xBF65, 0x7E20, 0xBF66, 0x7E21, 0xBF67, 0x7E22, 0xBF68, 0x7E23, + 0xBF69, 0x7E24, 0xBF6A, 0x7E25, 0xBF6B, 0x7E26, 0xBF6C, 0x7E27, 0xBF6D, 0x7E28, 0xBF6E, 0x7E29, 0xBF6F, 0x7E2A, 0xBF70, 0x7E2B, + 0xBF71, 0x7E2C, 0xBF72, 0x7E2D, 0xBF73, 0x7E2E, 0xBF74, 0x7E2F, 0xBF75, 0x7E30, 0xBF76, 0x7E31, 0xBF77, 0x7E32, 0xBF78, 0x7E33, + 0xBF79, 0x7E34, 0xBF7A, 0x7E35, 0xBF7B, 0x7E36, 0xBF7C, 0x7E37, 0xBF7D, 0x7E38, 0xBF7E, 0x7E39, 0xBF80, 0x7E3A, 0xBF81, 0x7E3C, + 0xBF82, 0x7E3D, 0xBF83, 0x7E3E, 0xBF84, 0x7E3F, 0xBF85, 0x7E40, 0xBF86, 0x7E42, 0xBF87, 0x7E43, 0xBF88, 0x7E44, 0xBF89, 0x7E45, + 0xBF8A, 0x7E46, 0xBF8B, 0x7E48, 0xBF8C, 0x7E49, 0xBF8D, 0x7E4A, 0xBF8E, 0x7E4B, 0xBF8F, 0x7E4C, 0xBF90, 0x7E4D, 0xBF91, 0x7E4E, + 0xBF92, 0x7E4F, 0xBF93, 0x7E50, 0xBF94, 0x7E51, 0xBF95, 0x7E52, 0xBF96, 0x7E53, 0xBF97, 0x7E54, 0xBF98, 0x7E55, 0xBF99, 0x7E56, + 0xBF9A, 0x7E57, 0xBF9B, 0x7E58, 0xBF9C, 0x7E59, 0xBF9D, 0x7E5A, 0xBF9E, 0x7E5B, 0xBF9F, 0x7E5C, 0xBFA0, 0x7E5D, 0xBFA1, 0x4FCA, + 0xBFA2, 0x7AE3, 0xBFA3, 0x6D5A, 0xBFA4, 0x90E1, 0xBFA5, 0x9A8F, 0xBFA6, 0x5580, 0xBFA7, 0x5496, 0xBFA8, 0x5361, 0xBFA9, 0x54AF, + 0xBFAA, 0x5F00, 0xBFAB, 0x63E9, 0xBFAC, 0x6977, 0xBFAD, 0x51EF, 0xBFAE, 0x6168, 0xBFAF, 0x520A, 0xBFB0, 0x582A, 0xBFB1, 0x52D8, + 0xBFB2, 0x574E, 0xBFB3, 0x780D, 0xBFB4, 0x770B, 0xBFB5, 0x5EB7, 0xBFB6, 0x6177, 0xBFB7, 0x7CE0, 0xBFB8, 0x625B, 0xBFB9, 0x6297, + 0xBFBA, 0x4EA2, 0xBFBB, 0x7095, 0xBFBC, 0x8003, 0xBFBD, 0x62F7, 0xBFBE, 0x70E4, 0xBFBF, 0x9760, 0xBFC0, 0x5777, 0xBFC1, 0x82DB, + 0xBFC2, 0x67EF, 0xBFC3, 0x68F5, 0xBFC4, 0x78D5, 0xBFC5, 0x9897, 0xBFC6, 0x79D1, 0xBFC7, 0x58F3, 0xBFC8, 0x54B3, 0xBFC9, 0x53EF, + 0xBFCA, 0x6E34, 0xBFCB, 0x514B, 0xBFCC, 0x523B, 0xBFCD, 0x5BA2, 0xBFCE, 0x8BFE, 0xBFCF, 0x80AF, 0xBFD0, 0x5543, 0xBFD1, 0x57A6, + 0xBFD2, 0x6073, 0xBFD3, 0x5751, 0xBFD4, 0x542D, 0xBFD5, 0x7A7A, 0xBFD6, 0x6050, 0xBFD7, 0x5B54, 0xBFD8, 0x63A7, 0xBFD9, 0x62A0, + 0xBFDA, 0x53E3, 0xBFDB, 0x6263, 0xBFDC, 0x5BC7, 0xBFDD, 0x67AF, 0xBFDE, 0x54ED, 0xBFDF, 0x7A9F, 0xBFE0, 0x82E6, 0xBFE1, 0x9177, + 0xBFE2, 0x5E93, 0xBFE3, 0x88E4, 0xBFE4, 0x5938, 0xBFE5, 0x57AE, 0xBFE6, 0x630E, 0xBFE7, 0x8DE8, 0xBFE8, 0x80EF, 0xBFE9, 0x5757, + 0xBFEA, 0x7B77, 0xBFEB, 0x4FA9, 0xBFEC, 0x5FEB, 0xBFED, 0x5BBD, 0xBFEE, 0x6B3E, 0xBFEF, 0x5321, 0xBFF0, 0x7B50, 0xBFF1, 0x72C2, + 0xBFF2, 0x6846, 0xBFF3, 0x77FF, 0xBFF4, 0x7736, 0xBFF5, 0x65F7, 0xBFF6, 0x51B5, 0xBFF7, 0x4E8F, 0xBFF8, 0x76D4, 0xBFF9, 0x5CBF, + 0xBFFA, 0x7AA5, 0xBFFB, 0x8475, 0xBFFC, 0x594E, 0xBFFD, 0x9B41, 0xBFFE, 0x5080, 0xC040, 0x7E5E, 0xC041, 0x7E5F, 0xC042, 0x7E60, + 0xC043, 0x7E61, 0xC044, 0x7E62, 0xC045, 0x7E63, 0xC046, 0x7E64, 0xC047, 0x7E65, 0xC048, 0x7E66, 0xC049, 0x7E67, 0xC04A, 0x7E68, + 0xC04B, 0x7E69, 0xC04C, 0x7E6A, 0xC04D, 0x7E6B, 0xC04E, 0x7E6C, 0xC04F, 0x7E6D, 0xC050, 0x7E6E, 0xC051, 0x7E6F, 0xC052, 0x7E70, + 0xC053, 0x7E71, 0xC054, 0x7E72, 0xC055, 0x7E73, 0xC056, 0x7E74, 0xC057, 0x7E75, 0xC058, 0x7E76, 0xC059, 0x7E77, 0xC05A, 0x7E78, + 0xC05B, 0x7E79, 0xC05C, 0x7E7A, 0xC05D, 0x7E7B, 0xC05E, 0x7E7C, 0xC05F, 0x7E7D, 0xC060, 0x7E7E, 0xC061, 0x7E7F, 0xC062, 0x7E80, + 0xC063, 0x7E81, 0xC064, 0x7E83, 0xC065, 0x7E84, 0xC066, 0x7E85, 0xC067, 0x7E86, 0xC068, 0x7E87, 0xC069, 0x7E88, 0xC06A, 0x7E89, + 0xC06B, 0x7E8A, 0xC06C, 0x7E8B, 0xC06D, 0x7E8C, 0xC06E, 0x7E8D, 0xC06F, 0x7E8E, 0xC070, 0x7E8F, 0xC071, 0x7E90, 0xC072, 0x7E91, + 0xC073, 0x7E92, 0xC074, 0x7E93, 0xC075, 0x7E94, 0xC076, 0x7E95, 0xC077, 0x7E96, 0xC078, 0x7E97, 0xC079, 0x7E98, 0xC07A, 0x7E99, + 0xC07B, 0x7E9A, 0xC07C, 0x7E9C, 0xC07D, 0x7E9D, 0xC07E, 0x7E9E, 0xC080, 0x7EAE, 0xC081, 0x7EB4, 0xC082, 0x7EBB, 0xC083, 0x7EBC, + 0xC084, 0x7ED6, 0xC085, 0x7EE4, 0xC086, 0x7EEC, 0xC087, 0x7EF9, 0xC088, 0x7F0A, 0xC089, 0x7F10, 0xC08A, 0x7F1E, 0xC08B, 0x7F37, + 0xC08C, 0x7F39, 0xC08D, 0x7F3B, 0xC08E, 0x7F3C, 0xC08F, 0x7F3D, 0xC090, 0x7F3E, 0xC091, 0x7F3F, 0xC092, 0x7F40, 0xC093, 0x7F41, + 0xC094, 0x7F43, 0xC095, 0x7F46, 0xC096, 0x7F47, 0xC097, 0x7F48, 0xC098, 0x7F49, 0xC099, 0x7F4A, 0xC09A, 0x7F4B, 0xC09B, 0x7F4C, + 0xC09C, 0x7F4D, 0xC09D, 0x7F4E, 0xC09E, 0x7F4F, 0xC09F, 0x7F52, 0xC0A0, 0x7F53, 0xC0A1, 0x9988, 0xC0A2, 0x6127, 0xC0A3, 0x6E83, + 0xC0A4, 0x5764, 0xC0A5, 0x6606, 0xC0A6, 0x6346, 0xC0A7, 0x56F0, 0xC0A8, 0x62EC, 0xC0A9, 0x6269, 0xC0AA, 0x5ED3, 0xC0AB, 0x9614, + 0xC0AC, 0x5783, 0xC0AD, 0x62C9, 0xC0AE, 0x5587, 0xC0AF, 0x8721, 0xC0B0, 0x814A, 0xC0B1, 0x8FA3, 0xC0B2, 0x5566, 0xC0B3, 0x83B1, + 0xC0B4, 0x6765, 0xC0B5, 0x8D56, 0xC0B6, 0x84DD, 0xC0B7, 0x5A6A, 0xC0B8, 0x680F, 0xC0B9, 0x62E6, 0xC0BA, 0x7BEE, 0xC0BB, 0x9611, + 0xC0BC, 0x5170, 0xC0BD, 0x6F9C, 0xC0BE, 0x8C30, 0xC0BF, 0x63FD, 0xC0C0, 0x89C8, 0xC0C1, 0x61D2, 0xC0C2, 0x7F06, 0xC0C3, 0x70C2, + 0xC0C4, 0x6EE5, 0xC0C5, 0x7405, 0xC0C6, 0x6994, 0xC0C7, 0x72FC, 0xC0C8, 0x5ECA, 0xC0C9, 0x90CE, 0xC0CA, 0x6717, 0xC0CB, 0x6D6A, + 0xC0CC, 0x635E, 0xC0CD, 0x52B3, 0xC0CE, 0x7262, 0xC0CF, 0x8001, 0xC0D0, 0x4F6C, 0xC0D1, 0x59E5, 0xC0D2, 0x916A, 0xC0D3, 0x70D9, + 0xC0D4, 0x6D9D, 0xC0D5, 0x52D2, 0xC0D6, 0x4E50, 0xC0D7, 0x96F7, 0xC0D8, 0x956D, 0xC0D9, 0x857E, 0xC0DA, 0x78CA, 0xC0DB, 0x7D2F, + 0xC0DC, 0x5121, 0xC0DD, 0x5792, 0xC0DE, 0x64C2, 0xC0DF, 0x808B, 0xC0E0, 0x7C7B, 0xC0E1, 0x6CEA, 0xC0E2, 0x68F1, 0xC0E3, 0x695E, + 0xC0E4, 0x51B7, 0xC0E5, 0x5398, 0xC0E6, 0x68A8, 0xC0E7, 0x7281, 0xC0E8, 0x9ECE, 0xC0E9, 0x7BF1, 0xC0EA, 0x72F8, 0xC0EB, 0x79BB, + 0xC0EC, 0x6F13, 0xC0ED, 0x7406, 0xC0EE, 0x674E, 0xC0EF, 0x91CC, 0xC0F0, 0x9CA4, 0xC0F1, 0x793C, 0xC0F2, 0x8389, 0xC0F3, 0x8354, + 0xC0F4, 0x540F, 0xC0F5, 0x6817, 0xC0F6, 0x4E3D, 0xC0F7, 0x5389, 0xC0F8, 0x52B1, 0xC0F9, 0x783E, 0xC0FA, 0x5386, 0xC0FB, 0x5229, + 0xC0FC, 0x5088, 0xC0FD, 0x4F8B, 0xC0FE, 0x4FD0, 0xC140, 0x7F56, 0xC141, 0x7F59, 0xC142, 0x7F5B, 0xC143, 0x7F5C, 0xC144, 0x7F5D, + 0xC145, 0x7F5E, 0xC146, 0x7F60, 0xC147, 0x7F63, 0xC148, 0x7F64, 0xC149, 0x7F65, 0xC14A, 0x7F66, 0xC14B, 0x7F67, 0xC14C, 0x7F6B, + 0xC14D, 0x7F6C, 0xC14E, 0x7F6D, 0xC14F, 0x7F6F, 0xC150, 0x7F70, 0xC151, 0x7F73, 0xC152, 0x7F75, 0xC153, 0x7F76, 0xC154, 0x7F77, + 0xC155, 0x7F78, 0xC156, 0x7F7A, 0xC157, 0x7F7B, 0xC158, 0x7F7C, 0xC159, 0x7F7D, 0xC15A, 0x7F7F, 0xC15B, 0x7F80, 0xC15C, 0x7F82, + 0xC15D, 0x7F83, 0xC15E, 0x7F84, 0xC15F, 0x7F85, 0xC160, 0x7F86, 0xC161, 0x7F87, 0xC162, 0x7F88, 0xC163, 0x7F89, 0xC164, 0x7F8B, + 0xC165, 0x7F8D, 0xC166, 0x7F8F, 0xC167, 0x7F90, 0xC168, 0x7F91, 0xC169, 0x7F92, 0xC16A, 0x7F93, 0xC16B, 0x7F95, 0xC16C, 0x7F96, + 0xC16D, 0x7F97, 0xC16E, 0x7F98, 0xC16F, 0x7F99, 0xC170, 0x7F9B, 0xC171, 0x7F9C, 0xC172, 0x7FA0, 0xC173, 0x7FA2, 0xC174, 0x7FA3, + 0xC175, 0x7FA5, 0xC176, 0x7FA6, 0xC177, 0x7FA8, 0xC178, 0x7FA9, 0xC179, 0x7FAA, 0xC17A, 0x7FAB, 0xC17B, 0x7FAC, 0xC17C, 0x7FAD, + 0xC17D, 0x7FAE, 0xC17E, 0x7FB1, 0xC180, 0x7FB3, 0xC181, 0x7FB4, 0xC182, 0x7FB5, 0xC183, 0x7FB6, 0xC184, 0x7FB7, 0xC185, 0x7FBA, + 0xC186, 0x7FBB, 0xC187, 0x7FBE, 0xC188, 0x7FC0, 0xC189, 0x7FC2, 0xC18A, 0x7FC3, 0xC18B, 0x7FC4, 0xC18C, 0x7FC6, 0xC18D, 0x7FC7, + 0xC18E, 0x7FC8, 0xC18F, 0x7FC9, 0xC190, 0x7FCB, 0xC191, 0x7FCD, 0xC192, 0x7FCF, 0xC193, 0x7FD0, 0xC194, 0x7FD1, 0xC195, 0x7FD2, + 0xC196, 0x7FD3, 0xC197, 0x7FD6, 0xC198, 0x7FD7, 0xC199, 0x7FD9, 0xC19A, 0x7FDA, 0xC19B, 0x7FDB, 0xC19C, 0x7FDC, 0xC19D, 0x7FDD, + 0xC19E, 0x7FDE, 0xC19F, 0x7FE2, 0xC1A0, 0x7FE3, 0xC1A1, 0x75E2, 0xC1A2, 0x7ACB, 0xC1A3, 0x7C92, 0xC1A4, 0x6CA5, 0xC1A5, 0x96B6, + 0xC1A6, 0x529B, 0xC1A7, 0x7483, 0xC1A8, 0x54E9, 0xC1A9, 0x4FE9, 0xC1AA, 0x8054, 0xC1AB, 0x83B2, 0xC1AC, 0x8FDE, 0xC1AD, 0x9570, + 0xC1AE, 0x5EC9, 0xC1AF, 0x601C, 0xC1B0, 0x6D9F, 0xC1B1, 0x5E18, 0xC1B2, 0x655B, 0xC1B3, 0x8138, 0xC1B4, 0x94FE, 0xC1B5, 0x604B, + 0xC1B6, 0x70BC, 0xC1B7, 0x7EC3, 0xC1B8, 0x7CAE, 0xC1B9, 0x51C9, 0xC1BA, 0x6881, 0xC1BB, 0x7CB1, 0xC1BC, 0x826F, 0xC1BD, 0x4E24, + 0xC1BE, 0x8F86, 0xC1BF, 0x91CF, 0xC1C0, 0x667E, 0xC1C1, 0x4EAE, 0xC1C2, 0x8C05, 0xC1C3, 0x64A9, 0xC1C4, 0x804A, 0xC1C5, 0x50DA, + 0xC1C6, 0x7597, 0xC1C7, 0x71CE, 0xC1C8, 0x5BE5, 0xC1C9, 0x8FBD, 0xC1CA, 0x6F66, 0xC1CB, 0x4E86, 0xC1CC, 0x6482, 0xC1CD, 0x9563, + 0xC1CE, 0x5ED6, 0xC1CF, 0x6599, 0xC1D0, 0x5217, 0xC1D1, 0x88C2, 0xC1D2, 0x70C8, 0xC1D3, 0x52A3, 0xC1D4, 0x730E, 0xC1D5, 0x7433, + 0xC1D6, 0x6797, 0xC1D7, 0x78F7, 0xC1D8, 0x9716, 0xC1D9, 0x4E34, 0xC1DA, 0x90BB, 0xC1DB, 0x9CDE, 0xC1DC, 0x6DCB, 0xC1DD, 0x51DB, + 0xC1DE, 0x8D41, 0xC1DF, 0x541D, 0xC1E0, 0x62CE, 0xC1E1, 0x73B2, 0xC1E2, 0x83F1, 0xC1E3, 0x96F6, 0xC1E4, 0x9F84, 0xC1E5, 0x94C3, + 0xC1E6, 0x4F36, 0xC1E7, 0x7F9A, 0xC1E8, 0x51CC, 0xC1E9, 0x7075, 0xC1EA, 0x9675, 0xC1EB, 0x5CAD, 0xC1EC, 0x9886, 0xC1ED, 0x53E6, + 0xC1EE, 0x4EE4, 0xC1EF, 0x6E9C, 0xC1F0, 0x7409, 0xC1F1, 0x69B4, 0xC1F2, 0x786B, 0xC1F3, 0x998F, 0xC1F4, 0x7559, 0xC1F5, 0x5218, + 0xC1F6, 0x7624, 0xC1F7, 0x6D41, 0xC1F8, 0x67F3, 0xC1F9, 0x516D, 0xC1FA, 0x9F99, 0xC1FB, 0x804B, 0xC1FC, 0x5499, 0xC1FD, 0x7B3C, + 0xC1FE, 0x7ABF, 0xC240, 0x7FE4, 0xC241, 0x7FE7, 0xC242, 0x7FE8, 0xC243, 0x7FEA, 0xC244, 0x7FEB, 0xC245, 0x7FEC, 0xC246, 0x7FED, + 0xC247, 0x7FEF, 0xC248, 0x7FF2, 0xC249, 0x7FF4, 0xC24A, 0x7FF5, 0xC24B, 0x7FF6, 0xC24C, 0x7FF7, 0xC24D, 0x7FF8, 0xC24E, 0x7FF9, + 0xC24F, 0x7FFA, 0xC250, 0x7FFD, 0xC251, 0x7FFE, 0xC252, 0x7FFF, 0xC253, 0x8002, 0xC254, 0x8007, 0xC255, 0x8008, 0xC256, 0x8009, + 0xC257, 0x800A, 0xC258, 0x800E, 0xC259, 0x800F, 0xC25A, 0x8011, 0xC25B, 0x8013, 0xC25C, 0x801A, 0xC25D, 0x801B, 0xC25E, 0x801D, + 0xC25F, 0x801E, 0xC260, 0x801F, 0xC261, 0x8021, 0xC262, 0x8023, 0xC263, 0x8024, 0xC264, 0x802B, 0xC265, 0x802C, 0xC266, 0x802D, + 0xC267, 0x802E, 0xC268, 0x802F, 0xC269, 0x8030, 0xC26A, 0x8032, 0xC26B, 0x8034, 0xC26C, 0x8039, 0xC26D, 0x803A, 0xC26E, 0x803C, + 0xC26F, 0x803E, 0xC270, 0x8040, 0xC271, 0x8041, 0xC272, 0x8044, 0xC273, 0x8045, 0xC274, 0x8047, 0xC275, 0x8048, 0xC276, 0x8049, + 0xC277, 0x804E, 0xC278, 0x804F, 0xC279, 0x8050, 0xC27A, 0x8051, 0xC27B, 0x8053, 0xC27C, 0x8055, 0xC27D, 0x8056, 0xC27E, 0x8057, + 0xC280, 0x8059, 0xC281, 0x805B, 0xC282, 0x805C, 0xC283, 0x805D, 0xC284, 0x805E, 0xC285, 0x805F, 0xC286, 0x8060, 0xC287, 0x8061, + 0xC288, 0x8062, 0xC289, 0x8063, 0xC28A, 0x8064, 0xC28B, 0x8065, 0xC28C, 0x8066, 0xC28D, 0x8067, 0xC28E, 0x8068, 0xC28F, 0x806B, + 0xC290, 0x806C, 0xC291, 0x806D, 0xC292, 0x806E, 0xC293, 0x806F, 0xC294, 0x8070, 0xC295, 0x8072, 0xC296, 0x8073, 0xC297, 0x8074, + 0xC298, 0x8075, 0xC299, 0x8076, 0xC29A, 0x8077, 0xC29B, 0x8078, 0xC29C, 0x8079, 0xC29D, 0x807A, 0xC29E, 0x807B, 0xC29F, 0x807C, + 0xC2A0, 0x807D, 0xC2A1, 0x9686, 0xC2A2, 0x5784, 0xC2A3, 0x62E2, 0xC2A4, 0x9647, 0xC2A5, 0x697C, 0xC2A6, 0x5A04, 0xC2A7, 0x6402, + 0xC2A8, 0x7BD3, 0xC2A9, 0x6F0F, 0xC2AA, 0x964B, 0xC2AB, 0x82A6, 0xC2AC, 0x5362, 0xC2AD, 0x9885, 0xC2AE, 0x5E90, 0xC2AF, 0x7089, + 0xC2B0, 0x63B3, 0xC2B1, 0x5364, 0xC2B2, 0x864F, 0xC2B3, 0x9C81, 0xC2B4, 0x9E93, 0xC2B5, 0x788C, 0xC2B6, 0x9732, 0xC2B7, 0x8DEF, + 0xC2B8, 0x8D42, 0xC2B9, 0x9E7F, 0xC2BA, 0x6F5E, 0xC2BB, 0x7984, 0xC2BC, 0x5F55, 0xC2BD, 0x9646, 0xC2BE, 0x622E, 0xC2BF, 0x9A74, + 0xC2C0, 0x5415, 0xC2C1, 0x94DD, 0xC2C2, 0x4FA3, 0xC2C3, 0x65C5, 0xC2C4, 0x5C65, 0xC2C5, 0x5C61, 0xC2C6, 0x7F15, 0xC2C7, 0x8651, + 0xC2C8, 0x6C2F, 0xC2C9, 0x5F8B, 0xC2CA, 0x7387, 0xC2CB, 0x6EE4, 0xC2CC, 0x7EFF, 0xC2CD, 0x5CE6, 0xC2CE, 0x631B, 0xC2CF, 0x5B6A, + 0xC2D0, 0x6EE6, 0xC2D1, 0x5375, 0xC2D2, 0x4E71, 0xC2D3, 0x63A0, 0xC2D4, 0x7565, 0xC2D5, 0x62A1, 0xC2D6, 0x8F6E, 0xC2D7, 0x4F26, + 0xC2D8, 0x4ED1, 0xC2D9, 0x6CA6, 0xC2DA, 0x7EB6, 0xC2DB, 0x8BBA, 0xC2DC, 0x841D, 0xC2DD, 0x87BA, 0xC2DE, 0x7F57, 0xC2DF, 0x903B, + 0xC2E0, 0x9523, 0xC2E1, 0x7BA9, 0xC2E2, 0x9AA1, 0xC2E3, 0x88F8, 0xC2E4, 0x843D, 0xC2E5, 0x6D1B, 0xC2E6, 0x9A86, 0xC2E7, 0x7EDC, + 0xC2E8, 0x5988, 0xC2E9, 0x9EBB, 0xC2EA, 0x739B, 0xC2EB, 0x7801, 0xC2EC, 0x8682, 0xC2ED, 0x9A6C, 0xC2EE, 0x9A82, 0xC2EF, 0x561B, + 0xC2F0, 0x5417, 0xC2F1, 0x57CB, 0xC2F2, 0x4E70, 0xC2F3, 0x9EA6, 0xC2F4, 0x5356, 0xC2F5, 0x8FC8, 0xC2F6, 0x8109, 0xC2F7, 0x7792, + 0xC2F8, 0x9992, 0xC2F9, 0x86EE, 0xC2FA, 0x6EE1, 0xC2FB, 0x8513, 0xC2FC, 0x66FC, 0xC2FD, 0x6162, 0xC2FE, 0x6F2B, 0xC340, 0x807E, + 0xC341, 0x8081, 0xC342, 0x8082, 0xC343, 0x8085, 0xC344, 0x8088, 0xC345, 0x808A, 0xC346, 0x808D, 0xC347, 0x808E, 0xC348, 0x808F, + 0xC349, 0x8090, 0xC34A, 0x8091, 0xC34B, 0x8092, 0xC34C, 0x8094, 0xC34D, 0x8095, 0xC34E, 0x8097, 0xC34F, 0x8099, 0xC350, 0x809E, + 0xC351, 0x80A3, 0xC352, 0x80A6, 0xC353, 0x80A7, 0xC354, 0x80A8, 0xC355, 0x80AC, 0xC356, 0x80B0, 0xC357, 0x80B3, 0xC358, 0x80B5, + 0xC359, 0x80B6, 0xC35A, 0x80B8, 0xC35B, 0x80B9, 0xC35C, 0x80BB, 0xC35D, 0x80C5, 0xC35E, 0x80C7, 0xC35F, 0x80C8, 0xC360, 0x80C9, + 0xC361, 0x80CA, 0xC362, 0x80CB, 0xC363, 0x80CF, 0xC364, 0x80D0, 0xC365, 0x80D1, 0xC366, 0x80D2, 0xC367, 0x80D3, 0xC368, 0x80D4, + 0xC369, 0x80D5, 0xC36A, 0x80D8, 0xC36B, 0x80DF, 0xC36C, 0x80E0, 0xC36D, 0x80E2, 0xC36E, 0x80E3, 0xC36F, 0x80E6, 0xC370, 0x80EE, + 0xC371, 0x80F5, 0xC372, 0x80F7, 0xC373, 0x80F9, 0xC374, 0x80FB, 0xC375, 0x80FE, 0xC376, 0x80FF, 0xC377, 0x8100, 0xC378, 0x8101, + 0xC379, 0x8103, 0xC37A, 0x8104, 0xC37B, 0x8105, 0xC37C, 0x8107, 0xC37D, 0x8108, 0xC37E, 0x810B, 0xC380, 0x810C, 0xC381, 0x8115, + 0xC382, 0x8117, 0xC383, 0x8119, 0xC384, 0x811B, 0xC385, 0x811C, 0xC386, 0x811D, 0xC387, 0x811F, 0xC388, 0x8120, 0xC389, 0x8121, + 0xC38A, 0x8122, 0xC38B, 0x8123, 0xC38C, 0x8124, 0xC38D, 0x8125, 0xC38E, 0x8126, 0xC38F, 0x8127, 0xC390, 0x8128, 0xC391, 0x8129, + 0xC392, 0x812A, 0xC393, 0x812B, 0xC394, 0x812D, 0xC395, 0x812E, 0xC396, 0x8130, 0xC397, 0x8133, 0xC398, 0x8134, 0xC399, 0x8135, + 0xC39A, 0x8137, 0xC39B, 0x8139, 0xC39C, 0x813A, 0xC39D, 0x813B, 0xC39E, 0x813C, 0xC39F, 0x813D, 0xC3A0, 0x813F, 0xC3A1, 0x8C29, + 0xC3A2, 0x8292, 0xC3A3, 0x832B, 0xC3A4, 0x76F2, 0xC3A5, 0x6C13, 0xC3A6, 0x5FD9, 0xC3A7, 0x83BD, 0xC3A8, 0x732B, 0xC3A9, 0x8305, + 0xC3AA, 0x951A, 0xC3AB, 0x6BDB, 0xC3AC, 0x77DB, 0xC3AD, 0x94C6, 0xC3AE, 0x536F, 0xC3AF, 0x8302, 0xC3B0, 0x5192, 0xC3B1, 0x5E3D, + 0xC3B2, 0x8C8C, 0xC3B3, 0x8D38, 0xC3B4, 0x4E48, 0xC3B5, 0x73AB, 0xC3B6, 0x679A, 0xC3B7, 0x6885, 0xC3B8, 0x9176, 0xC3B9, 0x9709, + 0xC3BA, 0x7164, 0xC3BB, 0x6CA1, 0xC3BC, 0x7709, 0xC3BD, 0x5A92, 0xC3BE, 0x9541, 0xC3BF, 0x6BCF, 0xC3C0, 0x7F8E, 0xC3C1, 0x6627, + 0xC3C2, 0x5BD0, 0xC3C3, 0x59B9, 0xC3C4, 0x5A9A, 0xC3C5, 0x95E8, 0xC3C6, 0x95F7, 0xC3C7, 0x4EEC, 0xC3C8, 0x840C, 0xC3C9, 0x8499, + 0xC3CA, 0x6AAC, 0xC3CB, 0x76DF, 0xC3CC, 0x9530, 0xC3CD, 0x731B, 0xC3CE, 0x68A6, 0xC3CF, 0x5B5F, 0xC3D0, 0x772F, 0xC3D1, 0x919A, + 0xC3D2, 0x9761, 0xC3D3, 0x7CDC, 0xC3D4, 0x8FF7, 0xC3D5, 0x8C1C, 0xC3D6, 0x5F25, 0xC3D7, 0x7C73, 0xC3D8, 0x79D8, 0xC3D9, 0x89C5, + 0xC3DA, 0x6CCC, 0xC3DB, 0x871C, 0xC3DC, 0x5BC6, 0xC3DD, 0x5E42, 0xC3DE, 0x68C9, 0xC3DF, 0x7720, 0xC3E0, 0x7EF5, 0xC3E1, 0x5195, + 0xC3E2, 0x514D, 0xC3E3, 0x52C9, 0xC3E4, 0x5A29, 0xC3E5, 0x7F05, 0xC3E6, 0x9762, 0xC3E7, 0x82D7, 0xC3E8, 0x63CF, 0xC3E9, 0x7784, + 0xC3EA, 0x85D0, 0xC3EB, 0x79D2, 0xC3EC, 0x6E3A, 0xC3ED, 0x5E99, 0xC3EE, 0x5999, 0xC3EF, 0x8511, 0xC3F0, 0x706D, 0xC3F1, 0x6C11, + 0xC3F2, 0x62BF, 0xC3F3, 0x76BF, 0xC3F4, 0x654F, 0xC3F5, 0x60AF, 0xC3F6, 0x95FD, 0xC3F7, 0x660E, 0xC3F8, 0x879F, 0xC3F9, 0x9E23, + 0xC3FA, 0x94ED, 0xC3FB, 0x540D, 0xC3FC, 0x547D, 0xC3FD, 0x8C2C, 0xC3FE, 0x6478, 0xC440, 0x8140, 0xC441, 0x8141, 0xC442, 0x8142, + 0xC443, 0x8143, 0xC444, 0x8144, 0xC445, 0x8145, 0xC446, 0x8147, 0xC447, 0x8149, 0xC448, 0x814D, 0xC449, 0x814E, 0xC44A, 0x814F, + 0xC44B, 0x8152, 0xC44C, 0x8156, 0xC44D, 0x8157, 0xC44E, 0x8158, 0xC44F, 0x815B, 0xC450, 0x815C, 0xC451, 0x815D, 0xC452, 0x815E, + 0xC453, 0x815F, 0xC454, 0x8161, 0xC455, 0x8162, 0xC456, 0x8163, 0xC457, 0x8164, 0xC458, 0x8166, 0xC459, 0x8168, 0xC45A, 0x816A, + 0xC45B, 0x816B, 0xC45C, 0x816C, 0xC45D, 0x816F, 0xC45E, 0x8172, 0xC45F, 0x8173, 0xC460, 0x8175, 0xC461, 0x8176, 0xC462, 0x8177, + 0xC463, 0x8178, 0xC464, 0x8181, 0xC465, 0x8183, 0xC466, 0x8184, 0xC467, 0x8185, 0xC468, 0x8186, 0xC469, 0x8187, 0xC46A, 0x8189, + 0xC46B, 0x818B, 0xC46C, 0x818C, 0xC46D, 0x818D, 0xC46E, 0x818E, 0xC46F, 0x8190, 0xC470, 0x8192, 0xC471, 0x8193, 0xC472, 0x8194, + 0xC473, 0x8195, 0xC474, 0x8196, 0xC475, 0x8197, 0xC476, 0x8199, 0xC477, 0x819A, 0xC478, 0x819E, 0xC479, 0x819F, 0xC47A, 0x81A0, + 0xC47B, 0x81A1, 0xC47C, 0x81A2, 0xC47D, 0x81A4, 0xC47E, 0x81A5, 0xC480, 0x81A7, 0xC481, 0x81A9, 0xC482, 0x81AB, 0xC483, 0x81AC, + 0xC484, 0x81AD, 0xC485, 0x81AE, 0xC486, 0x81AF, 0xC487, 0x81B0, 0xC488, 0x81B1, 0xC489, 0x81B2, 0xC48A, 0x81B4, 0xC48B, 0x81B5, + 0xC48C, 0x81B6, 0xC48D, 0x81B7, 0xC48E, 0x81B8, 0xC48F, 0x81B9, 0xC490, 0x81BC, 0xC491, 0x81BD, 0xC492, 0x81BE, 0xC493, 0x81BF, + 0xC494, 0x81C4, 0xC495, 0x81C5, 0xC496, 0x81C7, 0xC497, 0x81C8, 0xC498, 0x81C9, 0xC499, 0x81CB, 0xC49A, 0x81CD, 0xC49B, 0x81CE, + 0xC49C, 0x81CF, 0xC49D, 0x81D0, 0xC49E, 0x81D1, 0xC49F, 0x81D2, 0xC4A0, 0x81D3, 0xC4A1, 0x6479, 0xC4A2, 0x8611, 0xC4A3, 0x6A21, + 0xC4A4, 0x819C, 0xC4A5, 0x78E8, 0xC4A6, 0x6469, 0xC4A7, 0x9B54, 0xC4A8, 0x62B9, 0xC4A9, 0x672B, 0xC4AA, 0x83AB, 0xC4AB, 0x58A8, + 0xC4AC, 0x9ED8, 0xC4AD, 0x6CAB, 0xC4AE, 0x6F20, 0xC4AF, 0x5BDE, 0xC4B0, 0x964C, 0xC4B1, 0x8C0B, 0xC4B2, 0x725F, 0xC4B3, 0x67D0, + 0xC4B4, 0x62C7, 0xC4B5, 0x7261, 0xC4B6, 0x4EA9, 0xC4B7, 0x59C6, 0xC4B8, 0x6BCD, 0xC4B9, 0x5893, 0xC4BA, 0x66AE, 0xC4BB, 0x5E55, + 0xC4BC, 0x52DF, 0xC4BD, 0x6155, 0xC4BE, 0x6728, 0xC4BF, 0x76EE, 0xC4C0, 0x7766, 0xC4C1, 0x7267, 0xC4C2, 0x7A46, 0xC4C3, 0x62FF, + 0xC4C4, 0x54EA, 0xC4C5, 0x5450, 0xC4C6, 0x94A0, 0xC4C7, 0x90A3, 0xC4C8, 0x5A1C, 0xC4C9, 0x7EB3, 0xC4CA, 0x6C16, 0xC4CB, 0x4E43, + 0xC4CC, 0x5976, 0xC4CD, 0x8010, 0xC4CE, 0x5948, 0xC4CF, 0x5357, 0xC4D0, 0x7537, 0xC4D1, 0x96BE, 0xC4D2, 0x56CA, 0xC4D3, 0x6320, + 0xC4D4, 0x8111, 0xC4D5, 0x607C, 0xC4D6, 0x95F9, 0xC4D7, 0x6DD6, 0xC4D8, 0x5462, 0xC4D9, 0x9981, 0xC4DA, 0x5185, 0xC4DB, 0x5AE9, + 0xC4DC, 0x80FD, 0xC4DD, 0x59AE, 0xC4DE, 0x9713, 0xC4DF, 0x502A, 0xC4E0, 0x6CE5, 0xC4E1, 0x5C3C, 0xC4E2, 0x62DF, 0xC4E3, 0x4F60, + 0xC4E4, 0x533F, 0xC4E5, 0x817B, 0xC4E6, 0x9006, 0xC4E7, 0x6EBA, 0xC4E8, 0x852B, 0xC4E9, 0x62C8, 0xC4EA, 0x5E74, 0xC4EB, 0x78BE, + 0xC4EC, 0x64B5, 0xC4ED, 0x637B, 0xC4EE, 0x5FF5, 0xC4EF, 0x5A18, 0xC4F0, 0x917F, 0xC4F1, 0x9E1F, 0xC4F2, 0x5C3F, 0xC4F3, 0x634F, + 0xC4F4, 0x8042, 0xC4F5, 0x5B7D, 0xC4F6, 0x556E, 0xC4F7, 0x954A, 0xC4F8, 0x954D, 0xC4F9, 0x6D85, 0xC4FA, 0x60A8, 0xC4FB, 0x67E0, + 0xC4FC, 0x72DE, 0xC4FD, 0x51DD, 0xC4FE, 0x5B81, 0xC540, 0x81D4, 0xC541, 0x81D5, 0xC542, 0x81D6, 0xC543, 0x81D7, 0xC544, 0x81D8, + 0xC545, 0x81D9, 0xC546, 0x81DA, 0xC547, 0x81DB, 0xC548, 0x81DC, 0xC549, 0x81DD, 0xC54A, 0x81DE, 0xC54B, 0x81DF, 0xC54C, 0x81E0, + 0xC54D, 0x81E1, 0xC54E, 0x81E2, 0xC54F, 0x81E4, 0xC550, 0x81E5, 0xC551, 0x81E6, 0xC552, 0x81E8, 0xC553, 0x81E9, 0xC554, 0x81EB, + 0xC555, 0x81EE, 0xC556, 0x81EF, 0xC557, 0x81F0, 0xC558, 0x81F1, 0xC559, 0x81F2, 0xC55A, 0x81F5, 0xC55B, 0x81F6, 0xC55C, 0x81F7, + 0xC55D, 0x81F8, 0xC55E, 0x81F9, 0xC55F, 0x81FA, 0xC560, 0x81FD, 0xC561, 0x81FF, 0xC562, 0x8203, 0xC563, 0x8207, 0xC564, 0x8208, + 0xC565, 0x8209, 0xC566, 0x820A, 0xC567, 0x820B, 0xC568, 0x820E, 0xC569, 0x820F, 0xC56A, 0x8211, 0xC56B, 0x8213, 0xC56C, 0x8215, + 0xC56D, 0x8216, 0xC56E, 0x8217, 0xC56F, 0x8218, 0xC570, 0x8219, 0xC571, 0x821A, 0xC572, 0x821D, 0xC573, 0x8220, 0xC574, 0x8224, + 0xC575, 0x8225, 0xC576, 0x8226, 0xC577, 0x8227, 0xC578, 0x8229, 0xC579, 0x822E, 0xC57A, 0x8232, 0xC57B, 0x823A, 0xC57C, 0x823C, + 0xC57D, 0x823D, 0xC57E, 0x823F, 0xC580, 0x8240, 0xC581, 0x8241, 0xC582, 0x8242, 0xC583, 0x8243, 0xC584, 0x8245, 0xC585, 0x8246, + 0xC586, 0x8248, 0xC587, 0x824A, 0xC588, 0x824C, 0xC589, 0x824D, 0xC58A, 0x824E, 0xC58B, 0x8250, 0xC58C, 0x8251, 0xC58D, 0x8252, + 0xC58E, 0x8253, 0xC58F, 0x8254, 0xC590, 0x8255, 0xC591, 0x8256, 0xC592, 0x8257, 0xC593, 0x8259, 0xC594, 0x825B, 0xC595, 0x825C, + 0xC596, 0x825D, 0xC597, 0x825E, 0xC598, 0x8260, 0xC599, 0x8261, 0xC59A, 0x8262, 0xC59B, 0x8263, 0xC59C, 0x8264, 0xC59D, 0x8265, + 0xC59E, 0x8266, 0xC59F, 0x8267, 0xC5A0, 0x8269, 0xC5A1, 0x62E7, 0xC5A2, 0x6CDE, 0xC5A3, 0x725B, 0xC5A4, 0x626D, 0xC5A5, 0x94AE, + 0xC5A6, 0x7EBD, 0xC5A7, 0x8113, 0xC5A8, 0x6D53, 0xC5A9, 0x519C, 0xC5AA, 0x5F04, 0xC5AB, 0x5974, 0xC5AC, 0x52AA, 0xC5AD, 0x6012, + 0xC5AE, 0x5973, 0xC5AF, 0x6696, 0xC5B0, 0x8650, 0xC5B1, 0x759F, 0xC5B2, 0x632A, 0xC5B3, 0x61E6, 0xC5B4, 0x7CEF, 0xC5B5, 0x8BFA, + 0xC5B6, 0x54E6, 0xC5B7, 0x6B27, 0xC5B8, 0x9E25, 0xC5B9, 0x6BB4, 0xC5BA, 0x85D5, 0xC5BB, 0x5455, 0xC5BC, 0x5076, 0xC5BD, 0x6CA4, + 0xC5BE, 0x556A, 0xC5BF, 0x8DB4, 0xC5C0, 0x722C, 0xC5C1, 0x5E15, 0xC5C2, 0x6015, 0xC5C3, 0x7436, 0xC5C4, 0x62CD, 0xC5C5, 0x6392, + 0xC5C6, 0x724C, 0xC5C7, 0x5F98, 0xC5C8, 0x6E43, 0xC5C9, 0x6D3E, 0xC5CA, 0x6500, 0xC5CB, 0x6F58, 0xC5CC, 0x76D8, 0xC5CD, 0x78D0, + 0xC5CE, 0x76FC, 0xC5CF, 0x7554, 0xC5D0, 0x5224, 0xC5D1, 0x53DB, 0xC5D2, 0x4E53, 0xC5D3, 0x5E9E, 0xC5D4, 0x65C1, 0xC5D5, 0x802A, + 0xC5D6, 0x80D6, 0xC5D7, 0x629B, 0xC5D8, 0x5486, 0xC5D9, 0x5228, 0xC5DA, 0x70AE, 0xC5DB, 0x888D, 0xC5DC, 0x8DD1, 0xC5DD, 0x6CE1, + 0xC5DE, 0x5478, 0xC5DF, 0x80DA, 0xC5E0, 0x57F9, 0xC5E1, 0x88F4, 0xC5E2, 0x8D54, 0xC5E3, 0x966A, 0xC5E4, 0x914D, 0xC5E5, 0x4F69, + 0xC5E6, 0x6C9B, 0xC5E7, 0x55B7, 0xC5E8, 0x76C6, 0xC5E9, 0x7830, 0xC5EA, 0x62A8, 0xC5EB, 0x70F9, 0xC5EC, 0x6F8E, 0xC5ED, 0x5F6D, + 0xC5EE, 0x84EC, 0xC5EF, 0x68DA, 0xC5F0, 0x787C, 0xC5F1, 0x7BF7, 0xC5F2, 0x81A8, 0xC5F3, 0x670B, 0xC5F4, 0x9E4F, 0xC5F5, 0x6367, + 0xC5F6, 0x78B0, 0xC5F7, 0x576F, 0xC5F8, 0x7812, 0xC5F9, 0x9739, 0xC5FA, 0x6279, 0xC5FB, 0x62AB, 0xC5FC, 0x5288, 0xC5FD, 0x7435, + 0xC5FE, 0x6BD7, 0xC640, 0x826A, 0xC641, 0x826B, 0xC642, 0x826C, 0xC643, 0x826D, 0xC644, 0x8271, 0xC645, 0x8275, 0xC646, 0x8276, + 0xC647, 0x8277, 0xC648, 0x8278, 0xC649, 0x827B, 0xC64A, 0x827C, 0xC64B, 0x8280, 0xC64C, 0x8281, 0xC64D, 0x8283, 0xC64E, 0x8285, + 0xC64F, 0x8286, 0xC650, 0x8287, 0xC651, 0x8289, 0xC652, 0x828C, 0xC653, 0x8290, 0xC654, 0x8293, 0xC655, 0x8294, 0xC656, 0x8295, + 0xC657, 0x8296, 0xC658, 0x829A, 0xC659, 0x829B, 0xC65A, 0x829E, 0xC65B, 0x82A0, 0xC65C, 0x82A2, 0xC65D, 0x82A3, 0xC65E, 0x82A7, + 0xC65F, 0x82B2, 0xC660, 0x82B5, 0xC661, 0x82B6, 0xC662, 0x82BA, 0xC663, 0x82BB, 0xC664, 0x82BC, 0xC665, 0x82BF, 0xC666, 0x82C0, + 0xC667, 0x82C2, 0xC668, 0x82C3, 0xC669, 0x82C5, 0xC66A, 0x82C6, 0xC66B, 0x82C9, 0xC66C, 0x82D0, 0xC66D, 0x82D6, 0xC66E, 0x82D9, + 0xC66F, 0x82DA, 0xC670, 0x82DD, 0xC671, 0x82E2, 0xC672, 0x82E7, 0xC673, 0x82E8, 0xC674, 0x82E9, 0xC675, 0x82EA, 0xC676, 0x82EC, + 0xC677, 0x82ED, 0xC678, 0x82EE, 0xC679, 0x82F0, 0xC67A, 0x82F2, 0xC67B, 0x82F3, 0xC67C, 0x82F5, 0xC67D, 0x82F6, 0xC67E, 0x82F8, + 0xC680, 0x82FA, 0xC681, 0x82FC, 0xC682, 0x82FD, 0xC683, 0x82FE, 0xC684, 0x82FF, 0xC685, 0x8300, 0xC686, 0x830A, 0xC687, 0x830B, + 0xC688, 0x830D, 0xC689, 0x8310, 0xC68A, 0x8312, 0xC68B, 0x8313, 0xC68C, 0x8316, 0xC68D, 0x8318, 0xC68E, 0x8319, 0xC68F, 0x831D, + 0xC690, 0x831E, 0xC691, 0x831F, 0xC692, 0x8320, 0xC693, 0x8321, 0xC694, 0x8322, 0xC695, 0x8323, 0xC696, 0x8324, 0xC697, 0x8325, + 0xC698, 0x8326, 0xC699, 0x8329, 0xC69A, 0x832A, 0xC69B, 0x832E, 0xC69C, 0x8330, 0xC69D, 0x8332, 0xC69E, 0x8337, 0xC69F, 0x833B, + 0xC6A0, 0x833D, 0xC6A1, 0x5564, 0xC6A2, 0x813E, 0xC6A3, 0x75B2, 0xC6A4, 0x76AE, 0xC6A5, 0x5339, 0xC6A6, 0x75DE, 0xC6A7, 0x50FB, + 0xC6A8, 0x5C41, 0xC6A9, 0x8B6C, 0xC6AA, 0x7BC7, 0xC6AB, 0x504F, 0xC6AC, 0x7247, 0xC6AD, 0x9A97, 0xC6AE, 0x98D8, 0xC6AF, 0x6F02, + 0xC6B0, 0x74E2, 0xC6B1, 0x7968, 0xC6B2, 0x6487, 0xC6B3, 0x77A5, 0xC6B4, 0x62FC, 0xC6B5, 0x9891, 0xC6B6, 0x8D2B, 0xC6B7, 0x54C1, + 0xC6B8, 0x8058, 0xC6B9, 0x4E52, 0xC6BA, 0x576A, 0xC6BB, 0x82F9, 0xC6BC, 0x840D, 0xC6BD, 0x5E73, 0xC6BE, 0x51ED, 0xC6BF, 0x74F6, + 0xC6C0, 0x8BC4, 0xC6C1, 0x5C4F, 0xC6C2, 0x5761, 0xC6C3, 0x6CFC, 0xC6C4, 0x9887, 0xC6C5, 0x5A46, 0xC6C6, 0x7834, 0xC6C7, 0x9B44, + 0xC6C8, 0x8FEB, 0xC6C9, 0x7C95, 0xC6CA, 0x5256, 0xC6CB, 0x6251, 0xC6CC, 0x94FA, 0xC6CD, 0x4EC6, 0xC6CE, 0x8386, 0xC6CF, 0x8461, + 0xC6D0, 0x83E9, 0xC6D1, 0x84B2, 0xC6D2, 0x57D4, 0xC6D3, 0x6734, 0xC6D4, 0x5703, 0xC6D5, 0x666E, 0xC6D6, 0x6D66, 0xC6D7, 0x8C31, + 0xC6D8, 0x66DD, 0xC6D9, 0x7011, 0xC6DA, 0x671F, 0xC6DB, 0x6B3A, 0xC6DC, 0x6816, 0xC6DD, 0x621A, 0xC6DE, 0x59BB, 0xC6DF, 0x4E03, + 0xC6E0, 0x51C4, 0xC6E1, 0x6F06, 0xC6E2, 0x67D2, 0xC6E3, 0x6C8F, 0xC6E4, 0x5176, 0xC6E5, 0x68CB, 0xC6E6, 0x5947, 0xC6E7, 0x6B67, + 0xC6E8, 0x7566, 0xC6E9, 0x5D0E, 0xC6EA, 0x8110, 0xC6EB, 0x9F50, 0xC6EC, 0x65D7, 0xC6ED, 0x7948, 0xC6EE, 0x7941, 0xC6EF, 0x9A91, + 0xC6F0, 0x8D77, 0xC6F1, 0x5C82, 0xC6F2, 0x4E5E, 0xC6F3, 0x4F01, 0xC6F4, 0x542F, 0xC6F5, 0x5951, 0xC6F6, 0x780C, 0xC6F7, 0x5668, + 0xC6F8, 0x6C14, 0xC6F9, 0x8FC4, 0xC6FA, 0x5F03, 0xC6FB, 0x6C7D, 0xC6FC, 0x6CE3, 0xC6FD, 0x8BAB, 0xC6FE, 0x6390, 0xC740, 0x833E, + 0xC741, 0x833F, 0xC742, 0x8341, 0xC743, 0x8342, 0xC744, 0x8344, 0xC745, 0x8345, 0xC746, 0x8348, 0xC747, 0x834A, 0xC748, 0x834B, + 0xC749, 0x834C, 0xC74A, 0x834D, 0xC74B, 0x834E, 0xC74C, 0x8353, 0xC74D, 0x8355, 0xC74E, 0x8356, 0xC74F, 0x8357, 0xC750, 0x8358, + 0xC751, 0x8359, 0xC752, 0x835D, 0xC753, 0x8362, 0xC754, 0x8370, 0xC755, 0x8371, 0xC756, 0x8372, 0xC757, 0x8373, 0xC758, 0x8374, + 0xC759, 0x8375, 0xC75A, 0x8376, 0xC75B, 0x8379, 0xC75C, 0x837A, 0xC75D, 0x837E, 0xC75E, 0x837F, 0xC75F, 0x8380, 0xC760, 0x8381, + 0xC761, 0x8382, 0xC762, 0x8383, 0xC763, 0x8384, 0xC764, 0x8387, 0xC765, 0x8388, 0xC766, 0x838A, 0xC767, 0x838B, 0xC768, 0x838C, + 0xC769, 0x838D, 0xC76A, 0x838F, 0xC76B, 0x8390, 0xC76C, 0x8391, 0xC76D, 0x8394, 0xC76E, 0x8395, 0xC76F, 0x8396, 0xC770, 0x8397, + 0xC771, 0x8399, 0xC772, 0x839A, 0xC773, 0x839D, 0xC774, 0x839F, 0xC775, 0x83A1, 0xC776, 0x83A2, 0xC777, 0x83A3, 0xC778, 0x83A4, + 0xC779, 0x83A5, 0xC77A, 0x83A6, 0xC77B, 0x83A7, 0xC77C, 0x83AC, 0xC77D, 0x83AD, 0xC77E, 0x83AE, 0xC780, 0x83AF, 0xC781, 0x83B5, + 0xC782, 0x83BB, 0xC783, 0x83BE, 0xC784, 0x83BF, 0xC785, 0x83C2, 0xC786, 0x83C3, 0xC787, 0x83C4, 0xC788, 0x83C6, 0xC789, 0x83C8, + 0xC78A, 0x83C9, 0xC78B, 0x83CB, 0xC78C, 0x83CD, 0xC78D, 0x83CE, 0xC78E, 0x83D0, 0xC78F, 0x83D1, 0xC790, 0x83D2, 0xC791, 0x83D3, + 0xC792, 0x83D5, 0xC793, 0x83D7, 0xC794, 0x83D9, 0xC795, 0x83DA, 0xC796, 0x83DB, 0xC797, 0x83DE, 0xC798, 0x83E2, 0xC799, 0x83E3, + 0xC79A, 0x83E4, 0xC79B, 0x83E6, 0xC79C, 0x83E7, 0xC79D, 0x83E8, 0xC79E, 0x83EB, 0xC79F, 0x83EC, 0xC7A0, 0x83ED, 0xC7A1, 0x6070, + 0xC7A2, 0x6D3D, 0xC7A3, 0x7275, 0xC7A4, 0x6266, 0xC7A5, 0x948E, 0xC7A6, 0x94C5, 0xC7A7, 0x5343, 0xC7A8, 0x8FC1, 0xC7A9, 0x7B7E, + 0xC7AA, 0x4EDF, 0xC7AB, 0x8C26, 0xC7AC, 0x4E7E, 0xC7AD, 0x9ED4, 0xC7AE, 0x94B1, 0xC7AF, 0x94B3, 0xC7B0, 0x524D, 0xC7B1, 0x6F5C, + 0xC7B2, 0x9063, 0xC7B3, 0x6D45, 0xC7B4, 0x8C34, 0xC7B5, 0x5811, 0xC7B6, 0x5D4C, 0xC7B7, 0x6B20, 0xC7B8, 0x6B49, 0xC7B9, 0x67AA, + 0xC7BA, 0x545B, 0xC7BB, 0x8154, 0xC7BC, 0x7F8C, 0xC7BD, 0x5899, 0xC7BE, 0x8537, 0xC7BF, 0x5F3A, 0xC7C0, 0x62A2, 0xC7C1, 0x6A47, + 0xC7C2, 0x9539, 0xC7C3, 0x6572, 0xC7C4, 0x6084, 0xC7C5, 0x6865, 0xC7C6, 0x77A7, 0xC7C7, 0x4E54, 0xC7C8, 0x4FA8, 0xC7C9, 0x5DE7, + 0xC7CA, 0x9798, 0xC7CB, 0x64AC, 0xC7CC, 0x7FD8, 0xC7CD, 0x5CED, 0xC7CE, 0x4FCF, 0xC7CF, 0x7A8D, 0xC7D0, 0x5207, 0xC7D1, 0x8304, + 0xC7D2, 0x4E14, 0xC7D3, 0x602F, 0xC7D4, 0x7A83, 0xC7D5, 0x94A6, 0xC7D6, 0x4FB5, 0xC7D7, 0x4EB2, 0xC7D8, 0x79E6, 0xC7D9, 0x7434, + 0xC7DA, 0x52E4, 0xC7DB, 0x82B9, 0xC7DC, 0x64D2, 0xC7DD, 0x79BD, 0xC7DE, 0x5BDD, 0xC7DF, 0x6C81, 0xC7E0, 0x9752, 0xC7E1, 0x8F7B, + 0xC7E2, 0x6C22, 0xC7E3, 0x503E, 0xC7E4, 0x537F, 0xC7E5, 0x6E05, 0xC7E6, 0x64CE, 0xC7E7, 0x6674, 0xC7E8, 0x6C30, 0xC7E9, 0x60C5, + 0xC7EA, 0x9877, 0xC7EB, 0x8BF7, 0xC7EC, 0x5E86, 0xC7ED, 0x743C, 0xC7EE, 0x7A77, 0xC7EF, 0x79CB, 0xC7F0, 0x4E18, 0xC7F1, 0x90B1, + 0xC7F2, 0x7403, 0xC7F3, 0x6C42, 0xC7F4, 0x56DA, 0xC7F5, 0x914B, 0xC7F6, 0x6CC5, 0xC7F7, 0x8D8B, 0xC7F8, 0x533A, 0xC7F9, 0x86C6, + 0xC7FA, 0x66F2, 0xC7FB, 0x8EAF, 0xC7FC, 0x5C48, 0xC7FD, 0x9A71, 0xC7FE, 0x6E20, 0xC840, 0x83EE, 0xC841, 0x83EF, 0xC842, 0x83F3, + 0xC843, 0x83F4, 0xC844, 0x83F5, 0xC845, 0x83F6, 0xC846, 0x83F7, 0xC847, 0x83FA, 0xC848, 0x83FB, 0xC849, 0x83FC, 0xC84A, 0x83FE, + 0xC84B, 0x83FF, 0xC84C, 0x8400, 0xC84D, 0x8402, 0xC84E, 0x8405, 0xC84F, 0x8407, 0xC850, 0x8408, 0xC851, 0x8409, 0xC852, 0x840A, + 0xC853, 0x8410, 0xC854, 0x8412, 0xC855, 0x8413, 0xC856, 0x8414, 0xC857, 0x8415, 0xC858, 0x8416, 0xC859, 0x8417, 0xC85A, 0x8419, + 0xC85B, 0x841A, 0xC85C, 0x841B, 0xC85D, 0x841E, 0xC85E, 0x841F, 0xC85F, 0x8420, 0xC860, 0x8421, 0xC861, 0x8422, 0xC862, 0x8423, + 0xC863, 0x8429, 0xC864, 0x842A, 0xC865, 0x842B, 0xC866, 0x842C, 0xC867, 0x842D, 0xC868, 0x842E, 0xC869, 0x842F, 0xC86A, 0x8430, + 0xC86B, 0x8432, 0xC86C, 0x8433, 0xC86D, 0x8434, 0xC86E, 0x8435, 0xC86F, 0x8436, 0xC870, 0x8437, 0xC871, 0x8439, 0xC872, 0x843A, + 0xC873, 0x843B, 0xC874, 0x843E, 0xC875, 0x843F, 0xC876, 0x8440, 0xC877, 0x8441, 0xC878, 0x8442, 0xC879, 0x8443, 0xC87A, 0x8444, + 0xC87B, 0x8445, 0xC87C, 0x8447, 0xC87D, 0x8448, 0xC87E, 0x8449, 0xC880, 0x844A, 0xC881, 0x844B, 0xC882, 0x844C, 0xC883, 0x844D, + 0xC884, 0x844E, 0xC885, 0x844F, 0xC886, 0x8450, 0xC887, 0x8452, 0xC888, 0x8453, 0xC889, 0x8454, 0xC88A, 0x8455, 0xC88B, 0x8456, + 0xC88C, 0x8458, 0xC88D, 0x845D, 0xC88E, 0x845E, 0xC88F, 0x845F, 0xC890, 0x8460, 0xC891, 0x8462, 0xC892, 0x8464, 0xC893, 0x8465, + 0xC894, 0x8466, 0xC895, 0x8467, 0xC896, 0x8468, 0xC897, 0x846A, 0xC898, 0x846E, 0xC899, 0x846F, 0xC89A, 0x8470, 0xC89B, 0x8472, + 0xC89C, 0x8474, 0xC89D, 0x8477, 0xC89E, 0x8479, 0xC89F, 0x847B, 0xC8A0, 0x847C, 0xC8A1, 0x53D6, 0xC8A2, 0x5A36, 0xC8A3, 0x9F8B, + 0xC8A4, 0x8DA3, 0xC8A5, 0x53BB, 0xC8A6, 0x5708, 0xC8A7, 0x98A7, 0xC8A8, 0x6743, 0xC8A9, 0x919B, 0xC8AA, 0x6CC9, 0xC8AB, 0x5168, + 0xC8AC, 0x75CA, 0xC8AD, 0x62F3, 0xC8AE, 0x72AC, 0xC8AF, 0x5238, 0xC8B0, 0x529D, 0xC8B1, 0x7F3A, 0xC8B2, 0x7094, 0xC8B3, 0x7638, + 0xC8B4, 0x5374, 0xC8B5, 0x9E4A, 0xC8B6, 0x69B7, 0xC8B7, 0x786E, 0xC8B8, 0x96C0, 0xC8B9, 0x88D9, 0xC8BA, 0x7FA4, 0xC8BB, 0x7136, + 0xC8BC, 0x71C3, 0xC8BD, 0x5189, 0xC8BE, 0x67D3, 0xC8BF, 0x74E4, 0xC8C0, 0x58E4, 0xC8C1, 0x6518, 0xC8C2, 0x56B7, 0xC8C3, 0x8BA9, + 0xC8C4, 0x9976, 0xC8C5, 0x6270, 0xC8C6, 0x7ED5, 0xC8C7, 0x60F9, 0xC8C8, 0x70ED, 0xC8C9, 0x58EC, 0xC8CA, 0x4EC1, 0xC8CB, 0x4EBA, + 0xC8CC, 0x5FCD, 0xC8CD, 0x97E7, 0xC8CE, 0x4EFB, 0xC8CF, 0x8BA4, 0xC8D0, 0x5203, 0xC8D1, 0x598A, 0xC8D2, 0x7EAB, 0xC8D3, 0x6254, + 0xC8D4, 0x4ECD, 0xC8D5, 0x65E5, 0xC8D6, 0x620E, 0xC8D7, 0x8338, 0xC8D8, 0x84C9, 0xC8D9, 0x8363, 0xC8DA, 0x878D, 0xC8DB, 0x7194, + 0xC8DC, 0x6EB6, 0xC8DD, 0x5BB9, 0xC8DE, 0x7ED2, 0xC8DF, 0x5197, 0xC8E0, 0x63C9, 0xC8E1, 0x67D4, 0xC8E2, 0x8089, 0xC8E3, 0x8339, + 0xC8E4, 0x8815, 0xC8E5, 0x5112, 0xC8E6, 0x5B7A, 0xC8E7, 0x5982, 0xC8E8, 0x8FB1, 0xC8E9, 0x4E73, 0xC8EA, 0x6C5D, 0xC8EB, 0x5165, + 0xC8EC, 0x8925, 0xC8ED, 0x8F6F, 0xC8EE, 0x962E, 0xC8EF, 0x854A, 0xC8F0, 0x745E, 0xC8F1, 0x9510, 0xC8F2, 0x95F0, 0xC8F3, 0x6DA6, + 0xC8F4, 0x82E5, 0xC8F5, 0x5F31, 0xC8F6, 0x6492, 0xC8F7, 0x6D12, 0xC8F8, 0x8428, 0xC8F9, 0x816E, 0xC8FA, 0x9CC3, 0xC8FB, 0x585E, + 0xC8FC, 0x8D5B, 0xC8FD, 0x4E09, 0xC8FE, 0x53C1, 0xC940, 0x847D, 0xC941, 0x847E, 0xC942, 0x847F, 0xC943, 0x8480, 0xC944, 0x8481, + 0xC945, 0x8483, 0xC946, 0x8484, 0xC947, 0x8485, 0xC948, 0x8486, 0xC949, 0x848A, 0xC94A, 0x848D, 0xC94B, 0x848F, 0xC94C, 0x8490, + 0xC94D, 0x8491, 0xC94E, 0x8492, 0xC94F, 0x8493, 0xC950, 0x8494, 0xC951, 0x8495, 0xC952, 0x8496, 0xC953, 0x8498, 0xC954, 0x849A, + 0xC955, 0x849B, 0xC956, 0x849D, 0xC957, 0x849E, 0xC958, 0x849F, 0xC959, 0x84A0, 0xC95A, 0x84A2, 0xC95B, 0x84A3, 0xC95C, 0x84A4, + 0xC95D, 0x84A5, 0xC95E, 0x84A6, 0xC95F, 0x84A7, 0xC960, 0x84A8, 0xC961, 0x84A9, 0xC962, 0x84AA, 0xC963, 0x84AB, 0xC964, 0x84AC, + 0xC965, 0x84AD, 0xC966, 0x84AE, 0xC967, 0x84B0, 0xC968, 0x84B1, 0xC969, 0x84B3, 0xC96A, 0x84B5, 0xC96B, 0x84B6, 0xC96C, 0x84B7, + 0xC96D, 0x84BB, 0xC96E, 0x84BC, 0xC96F, 0x84BE, 0xC970, 0x84C0, 0xC971, 0x84C2, 0xC972, 0x84C3, 0xC973, 0x84C5, 0xC974, 0x84C6, + 0xC975, 0x84C7, 0xC976, 0x84C8, 0xC977, 0x84CB, 0xC978, 0x84CC, 0xC979, 0x84CE, 0xC97A, 0x84CF, 0xC97B, 0x84D2, 0xC97C, 0x84D4, + 0xC97D, 0x84D5, 0xC97E, 0x84D7, 0xC980, 0x84D8, 0xC981, 0x84D9, 0xC982, 0x84DA, 0xC983, 0x84DB, 0xC984, 0x84DC, 0xC985, 0x84DE, + 0xC986, 0x84E1, 0xC987, 0x84E2, 0xC988, 0x84E4, 0xC989, 0x84E7, 0xC98A, 0x84E8, 0xC98B, 0x84E9, 0xC98C, 0x84EA, 0xC98D, 0x84EB, + 0xC98E, 0x84ED, 0xC98F, 0x84EE, 0xC990, 0x84EF, 0xC991, 0x84F1, 0xC992, 0x84F2, 0xC993, 0x84F3, 0xC994, 0x84F4, 0xC995, 0x84F5, + 0xC996, 0x84F6, 0xC997, 0x84F7, 0xC998, 0x84F8, 0xC999, 0x84F9, 0xC99A, 0x84FA, 0xC99B, 0x84FB, 0xC99C, 0x84FD, 0xC99D, 0x84FE, + 0xC99E, 0x8500, 0xC99F, 0x8501, 0xC9A0, 0x8502, 0xC9A1, 0x4F1E, 0xC9A2, 0x6563, 0xC9A3, 0x6851, 0xC9A4, 0x55D3, 0xC9A5, 0x4E27, + 0xC9A6, 0x6414, 0xC9A7, 0x9A9A, 0xC9A8, 0x626B, 0xC9A9, 0x5AC2, 0xC9AA, 0x745F, 0xC9AB, 0x8272, 0xC9AC, 0x6DA9, 0xC9AD, 0x68EE, + 0xC9AE, 0x50E7, 0xC9AF, 0x838E, 0xC9B0, 0x7802, 0xC9B1, 0x6740, 0xC9B2, 0x5239, 0xC9B3, 0x6C99, 0xC9B4, 0x7EB1, 0xC9B5, 0x50BB, + 0xC9B6, 0x5565, 0xC9B7, 0x715E, 0xC9B8, 0x7B5B, 0xC9B9, 0x6652, 0xC9BA, 0x73CA, 0xC9BB, 0x82EB, 0xC9BC, 0x6749, 0xC9BD, 0x5C71, + 0xC9BE, 0x5220, 0xC9BF, 0x717D, 0xC9C0, 0x886B, 0xC9C1, 0x95EA, 0xC9C2, 0x9655, 0xC9C3, 0x64C5, 0xC9C4, 0x8D61, 0xC9C5, 0x81B3, + 0xC9C6, 0x5584, 0xC9C7, 0x6C55, 0xC9C8, 0x6247, 0xC9C9, 0x7F2E, 0xC9CA, 0x5892, 0xC9CB, 0x4F24, 0xC9CC, 0x5546, 0xC9CD, 0x8D4F, + 0xC9CE, 0x664C, 0xC9CF, 0x4E0A, 0xC9D0, 0x5C1A, 0xC9D1, 0x88F3, 0xC9D2, 0x68A2, 0xC9D3, 0x634E, 0xC9D4, 0x7A0D, 0xC9D5, 0x70E7, + 0xC9D6, 0x828D, 0xC9D7, 0x52FA, 0xC9D8, 0x97F6, 0xC9D9, 0x5C11, 0xC9DA, 0x54E8, 0xC9DB, 0x90B5, 0xC9DC, 0x7ECD, 0xC9DD, 0x5962, + 0xC9DE, 0x8D4A, 0xC9DF, 0x86C7, 0xC9E0, 0x820C, 0xC9E1, 0x820D, 0xC9E2, 0x8D66, 0xC9E3, 0x6444, 0xC9E4, 0x5C04, 0xC9E5, 0x6151, + 0xC9E6, 0x6D89, 0xC9E7, 0x793E, 0xC9E8, 0x8BBE, 0xC9E9, 0x7837, 0xC9EA, 0x7533, 0xC9EB, 0x547B, 0xC9EC, 0x4F38, 0xC9ED, 0x8EAB, + 0xC9EE, 0x6DF1, 0xC9EF, 0x5A20, 0xC9F0, 0x7EC5, 0xC9F1, 0x795E, 0xC9F2, 0x6C88, 0xC9F3, 0x5BA1, 0xC9F4, 0x5A76, 0xC9F5, 0x751A, + 0xC9F6, 0x80BE, 0xC9F7, 0x614E, 0xC9F8, 0x6E17, 0xC9F9, 0x58F0, 0xC9FA, 0x751F, 0xC9FB, 0x7525, 0xC9FC, 0x7272, 0xC9FD, 0x5347, + 0xC9FE, 0x7EF3, 0xCA40, 0x8503, 0xCA41, 0x8504, 0xCA42, 0x8505, 0xCA43, 0x8506, 0xCA44, 0x8507, 0xCA45, 0x8508, 0xCA46, 0x8509, + 0xCA47, 0x850A, 0xCA48, 0x850B, 0xCA49, 0x850D, 0xCA4A, 0x850E, 0xCA4B, 0x850F, 0xCA4C, 0x8510, 0xCA4D, 0x8512, 0xCA4E, 0x8514, + 0xCA4F, 0x8515, 0xCA50, 0x8516, 0xCA51, 0x8518, 0xCA52, 0x8519, 0xCA53, 0x851B, 0xCA54, 0x851C, 0xCA55, 0x851D, 0xCA56, 0x851E, + 0xCA57, 0x8520, 0xCA58, 0x8522, 0xCA59, 0x8523, 0xCA5A, 0x8524, 0xCA5B, 0x8525, 0xCA5C, 0x8526, 0xCA5D, 0x8527, 0xCA5E, 0x8528, + 0xCA5F, 0x8529, 0xCA60, 0x852A, 0xCA61, 0x852D, 0xCA62, 0x852E, 0xCA63, 0x852F, 0xCA64, 0x8530, 0xCA65, 0x8531, 0xCA66, 0x8532, + 0xCA67, 0x8533, 0xCA68, 0x8534, 0xCA69, 0x8535, 0xCA6A, 0x8536, 0xCA6B, 0x853E, 0xCA6C, 0x853F, 0xCA6D, 0x8540, 0xCA6E, 0x8541, + 0xCA6F, 0x8542, 0xCA70, 0x8544, 0xCA71, 0x8545, 0xCA72, 0x8546, 0xCA73, 0x8547, 0xCA74, 0x854B, 0xCA75, 0x854C, 0xCA76, 0x854D, + 0xCA77, 0x854E, 0xCA78, 0x854F, 0xCA79, 0x8550, 0xCA7A, 0x8551, 0xCA7B, 0x8552, 0xCA7C, 0x8553, 0xCA7D, 0x8554, 0xCA7E, 0x8555, + 0xCA80, 0x8557, 0xCA81, 0x8558, 0xCA82, 0x855A, 0xCA83, 0x855B, 0xCA84, 0x855C, 0xCA85, 0x855D, 0xCA86, 0x855F, 0xCA87, 0x8560, + 0xCA88, 0x8561, 0xCA89, 0x8562, 0xCA8A, 0x8563, 0xCA8B, 0x8565, 0xCA8C, 0x8566, 0xCA8D, 0x8567, 0xCA8E, 0x8569, 0xCA8F, 0x856A, + 0xCA90, 0x856B, 0xCA91, 0x856C, 0xCA92, 0x856D, 0xCA93, 0x856E, 0xCA94, 0x856F, 0xCA95, 0x8570, 0xCA96, 0x8571, 0xCA97, 0x8573, + 0xCA98, 0x8575, 0xCA99, 0x8576, 0xCA9A, 0x8577, 0xCA9B, 0x8578, 0xCA9C, 0x857C, 0xCA9D, 0x857D, 0xCA9E, 0x857F, 0xCA9F, 0x8580, + 0xCAA0, 0x8581, 0xCAA1, 0x7701, 0xCAA2, 0x76DB, 0xCAA3, 0x5269, 0xCAA4, 0x80DC, 0xCAA5, 0x5723, 0xCAA6, 0x5E08, 0xCAA7, 0x5931, + 0xCAA8, 0x72EE, 0xCAA9, 0x65BD, 0xCAAA, 0x6E7F, 0xCAAB, 0x8BD7, 0xCAAC, 0x5C38, 0xCAAD, 0x8671, 0xCAAE, 0x5341, 0xCAAF, 0x77F3, + 0xCAB0, 0x62FE, 0xCAB1, 0x65F6, 0xCAB2, 0x4EC0, 0xCAB3, 0x98DF, 0xCAB4, 0x8680, 0xCAB5, 0x5B9E, 0xCAB6, 0x8BC6, 0xCAB7, 0x53F2, + 0xCAB8, 0x77E2, 0xCAB9, 0x4F7F, 0xCABA, 0x5C4E, 0xCABB, 0x9A76, 0xCABC, 0x59CB, 0xCABD, 0x5F0F, 0xCABE, 0x793A, 0xCABF, 0x58EB, + 0xCAC0, 0x4E16, 0xCAC1, 0x67FF, 0xCAC2, 0x4E8B, 0xCAC3, 0x62ED, 0xCAC4, 0x8A93, 0xCAC5, 0x901D, 0xCAC6, 0x52BF, 0xCAC7, 0x662F, + 0xCAC8, 0x55DC, 0xCAC9, 0x566C, 0xCACA, 0x9002, 0xCACB, 0x4ED5, 0xCACC, 0x4F8D, 0xCACD, 0x91CA, 0xCACE, 0x9970, 0xCACF, 0x6C0F, + 0xCAD0, 0x5E02, 0xCAD1, 0x6043, 0xCAD2, 0x5BA4, 0xCAD3, 0x89C6, 0xCAD4, 0x8BD5, 0xCAD5, 0x6536, 0xCAD6, 0x624B, 0xCAD7, 0x9996, + 0xCAD8, 0x5B88, 0xCAD9, 0x5BFF, 0xCADA, 0x6388, 0xCADB, 0x552E, 0xCADC, 0x53D7, 0xCADD, 0x7626, 0xCADE, 0x517D, 0xCADF, 0x852C, + 0xCAE0, 0x67A2, 0xCAE1, 0x68B3, 0xCAE2, 0x6B8A, 0xCAE3, 0x6292, 0xCAE4, 0x8F93, 0xCAE5, 0x53D4, 0xCAE6, 0x8212, 0xCAE7, 0x6DD1, + 0xCAE8, 0x758F, 0xCAE9, 0x4E66, 0xCAEA, 0x8D4E, 0xCAEB, 0x5B70, 0xCAEC, 0x719F, 0xCAED, 0x85AF, 0xCAEE, 0x6691, 0xCAEF, 0x66D9, + 0xCAF0, 0x7F72, 0xCAF1, 0x8700, 0xCAF2, 0x9ECD, 0xCAF3, 0x9F20, 0xCAF4, 0x5C5E, 0xCAF5, 0x672F, 0xCAF6, 0x8FF0, 0xCAF7, 0x6811, + 0xCAF8, 0x675F, 0xCAF9, 0x620D, 0xCAFA, 0x7AD6, 0xCAFB, 0x5885, 0xCAFC, 0x5EB6, 0xCAFD, 0x6570, 0xCAFE, 0x6F31, 0xCB40, 0x8582, + 0xCB41, 0x8583, 0xCB42, 0x8586, 0xCB43, 0x8588, 0xCB44, 0x8589, 0xCB45, 0x858A, 0xCB46, 0x858B, 0xCB47, 0x858C, 0xCB48, 0x858D, + 0xCB49, 0x858E, 0xCB4A, 0x8590, 0xCB4B, 0x8591, 0xCB4C, 0x8592, 0xCB4D, 0x8593, 0xCB4E, 0x8594, 0xCB4F, 0x8595, 0xCB50, 0x8596, + 0xCB51, 0x8597, 0xCB52, 0x8598, 0xCB53, 0x8599, 0xCB54, 0x859A, 0xCB55, 0x859D, 0xCB56, 0x859E, 0xCB57, 0x859F, 0xCB58, 0x85A0, + 0xCB59, 0x85A1, 0xCB5A, 0x85A2, 0xCB5B, 0x85A3, 0xCB5C, 0x85A5, 0xCB5D, 0x85A6, 0xCB5E, 0x85A7, 0xCB5F, 0x85A9, 0xCB60, 0x85AB, + 0xCB61, 0x85AC, 0xCB62, 0x85AD, 0xCB63, 0x85B1, 0xCB64, 0x85B2, 0xCB65, 0x85B3, 0xCB66, 0x85B4, 0xCB67, 0x85B5, 0xCB68, 0x85B6, + 0xCB69, 0x85B8, 0xCB6A, 0x85BA, 0xCB6B, 0x85BB, 0xCB6C, 0x85BC, 0xCB6D, 0x85BD, 0xCB6E, 0x85BE, 0xCB6F, 0x85BF, 0xCB70, 0x85C0, + 0xCB71, 0x85C2, 0xCB72, 0x85C3, 0xCB73, 0x85C4, 0xCB74, 0x85C5, 0xCB75, 0x85C6, 0xCB76, 0x85C7, 0xCB77, 0x85C8, 0xCB78, 0x85CA, + 0xCB79, 0x85CB, 0xCB7A, 0x85CC, 0xCB7B, 0x85CD, 0xCB7C, 0x85CE, 0xCB7D, 0x85D1, 0xCB7E, 0x85D2, 0xCB80, 0x85D4, 0xCB81, 0x85D6, + 0xCB82, 0x85D7, 0xCB83, 0x85D8, 0xCB84, 0x85D9, 0xCB85, 0x85DA, 0xCB86, 0x85DB, 0xCB87, 0x85DD, 0xCB88, 0x85DE, 0xCB89, 0x85DF, + 0xCB8A, 0x85E0, 0xCB8B, 0x85E1, 0xCB8C, 0x85E2, 0xCB8D, 0x85E3, 0xCB8E, 0x85E5, 0xCB8F, 0x85E6, 0xCB90, 0x85E7, 0xCB91, 0x85E8, + 0xCB92, 0x85EA, 0xCB93, 0x85EB, 0xCB94, 0x85EC, 0xCB95, 0x85ED, 0xCB96, 0x85EE, 0xCB97, 0x85EF, 0xCB98, 0x85F0, 0xCB99, 0x85F1, + 0xCB9A, 0x85F2, 0xCB9B, 0x85F3, 0xCB9C, 0x85F4, 0xCB9D, 0x85F5, 0xCB9E, 0x85F6, 0xCB9F, 0x85F7, 0xCBA0, 0x85F8, 0xCBA1, 0x6055, + 0xCBA2, 0x5237, 0xCBA3, 0x800D, 0xCBA4, 0x6454, 0xCBA5, 0x8870, 0xCBA6, 0x7529, 0xCBA7, 0x5E05, 0xCBA8, 0x6813, 0xCBA9, 0x62F4, + 0xCBAA, 0x971C, 0xCBAB, 0x53CC, 0xCBAC, 0x723D, 0xCBAD, 0x8C01, 0xCBAE, 0x6C34, 0xCBAF, 0x7761, 0xCBB0, 0x7A0E, 0xCBB1, 0x542E, + 0xCBB2, 0x77AC, 0xCBB3, 0x987A, 0xCBB4, 0x821C, 0xCBB5, 0x8BF4, 0xCBB6, 0x7855, 0xCBB7, 0x6714, 0xCBB8, 0x70C1, 0xCBB9, 0x65AF, + 0xCBBA, 0x6495, 0xCBBB, 0x5636, 0xCBBC, 0x601D, 0xCBBD, 0x79C1, 0xCBBE, 0x53F8, 0xCBBF, 0x4E1D, 0xCBC0, 0x6B7B, 0xCBC1, 0x8086, + 0xCBC2, 0x5BFA, 0xCBC3, 0x55E3, 0xCBC4, 0x56DB, 0xCBC5, 0x4F3A, 0xCBC6, 0x4F3C, 0xCBC7, 0x9972, 0xCBC8, 0x5DF3, 0xCBC9, 0x677E, + 0xCBCA, 0x8038, 0xCBCB, 0x6002, 0xCBCC, 0x9882, 0xCBCD, 0x9001, 0xCBCE, 0x5B8B, 0xCBCF, 0x8BBC, 0xCBD0, 0x8BF5, 0xCBD1, 0x641C, + 0xCBD2, 0x8258, 0xCBD3, 0x64DE, 0xCBD4, 0x55FD, 0xCBD5, 0x82CF, 0xCBD6, 0x9165, 0xCBD7, 0x4FD7, 0xCBD8, 0x7D20, 0xCBD9, 0x901F, + 0xCBDA, 0x7C9F, 0xCBDB, 0x50F3, 0xCBDC, 0x5851, 0xCBDD, 0x6EAF, 0xCBDE, 0x5BBF, 0xCBDF, 0x8BC9, 0xCBE0, 0x8083, 0xCBE1, 0x9178, + 0xCBE2, 0x849C, 0xCBE3, 0x7B97, 0xCBE4, 0x867D, 0xCBE5, 0x968B, 0xCBE6, 0x968F, 0xCBE7, 0x7EE5, 0xCBE8, 0x9AD3, 0xCBE9, 0x788E, + 0xCBEA, 0x5C81, 0xCBEB, 0x7A57, 0xCBEC, 0x9042, 0xCBED, 0x96A7, 0xCBEE, 0x795F, 0xCBEF, 0x5B59, 0xCBF0, 0x635F, 0xCBF1, 0x7B0B, + 0xCBF2, 0x84D1, 0xCBF3, 0x68AD, 0xCBF4, 0x5506, 0xCBF5, 0x7F29, 0xCBF6, 0x7410, 0xCBF7, 0x7D22, 0xCBF8, 0x9501, 0xCBF9, 0x6240, + 0xCBFA, 0x584C, 0xCBFB, 0x4ED6, 0xCBFC, 0x5B83, 0xCBFD, 0x5979, 0xCBFE, 0x5854, 0xCC40, 0x85F9, 0xCC41, 0x85FA, 0xCC42, 0x85FC, + 0xCC43, 0x85FD, 0xCC44, 0x85FE, 0xCC45, 0x8600, 0xCC46, 0x8601, 0xCC47, 0x8602, 0xCC48, 0x8603, 0xCC49, 0x8604, 0xCC4A, 0x8606, + 0xCC4B, 0x8607, 0xCC4C, 0x8608, 0xCC4D, 0x8609, 0xCC4E, 0x860A, 0xCC4F, 0x860B, 0xCC50, 0x860C, 0xCC51, 0x860D, 0xCC52, 0x860E, + 0xCC53, 0x860F, 0xCC54, 0x8610, 0xCC55, 0x8612, 0xCC56, 0x8613, 0xCC57, 0x8614, 0xCC58, 0x8615, 0xCC59, 0x8617, 0xCC5A, 0x8618, + 0xCC5B, 0x8619, 0xCC5C, 0x861A, 0xCC5D, 0x861B, 0xCC5E, 0x861C, 0xCC5F, 0x861D, 0xCC60, 0x861E, 0xCC61, 0x861F, 0xCC62, 0x8620, + 0xCC63, 0x8621, 0xCC64, 0x8622, 0xCC65, 0x8623, 0xCC66, 0x8624, 0xCC67, 0x8625, 0xCC68, 0x8626, 0xCC69, 0x8628, 0xCC6A, 0x862A, + 0xCC6B, 0x862B, 0xCC6C, 0x862C, 0xCC6D, 0x862D, 0xCC6E, 0x862E, 0xCC6F, 0x862F, 0xCC70, 0x8630, 0xCC71, 0x8631, 0xCC72, 0x8632, + 0xCC73, 0x8633, 0xCC74, 0x8634, 0xCC75, 0x8635, 0xCC76, 0x8636, 0xCC77, 0x8637, 0xCC78, 0x8639, 0xCC79, 0x863A, 0xCC7A, 0x863B, + 0xCC7B, 0x863D, 0xCC7C, 0x863E, 0xCC7D, 0x863F, 0xCC7E, 0x8640, 0xCC80, 0x8641, 0xCC81, 0x8642, 0xCC82, 0x8643, 0xCC83, 0x8644, + 0xCC84, 0x8645, 0xCC85, 0x8646, 0xCC86, 0x8647, 0xCC87, 0x8648, 0xCC88, 0x8649, 0xCC89, 0x864A, 0xCC8A, 0x864B, 0xCC8B, 0x864C, + 0xCC8C, 0x8652, 0xCC8D, 0x8653, 0xCC8E, 0x8655, 0xCC8F, 0x8656, 0xCC90, 0x8657, 0xCC91, 0x8658, 0xCC92, 0x8659, 0xCC93, 0x865B, + 0xCC94, 0x865C, 0xCC95, 0x865D, 0xCC96, 0x865F, 0xCC97, 0x8660, 0xCC98, 0x8661, 0xCC99, 0x8663, 0xCC9A, 0x8664, 0xCC9B, 0x8665, + 0xCC9C, 0x8666, 0xCC9D, 0x8667, 0xCC9E, 0x8668, 0xCC9F, 0x8669, 0xCCA0, 0x866A, 0xCCA1, 0x736D, 0xCCA2, 0x631E, 0xCCA3, 0x8E4B, + 0xCCA4, 0x8E0F, 0xCCA5, 0x80CE, 0xCCA6, 0x82D4, 0xCCA7, 0x62AC, 0xCCA8, 0x53F0, 0xCCA9, 0x6CF0, 0xCCAA, 0x915E, 0xCCAB, 0x592A, + 0xCCAC, 0x6001, 0xCCAD, 0x6C70, 0xCCAE, 0x574D, 0xCCAF, 0x644A, 0xCCB0, 0x8D2A, 0xCCB1, 0x762B, 0xCCB2, 0x6EE9, 0xCCB3, 0x575B, + 0xCCB4, 0x6A80, 0xCCB5, 0x75F0, 0xCCB6, 0x6F6D, 0xCCB7, 0x8C2D, 0xCCB8, 0x8C08, 0xCCB9, 0x5766, 0xCCBA, 0x6BEF, 0xCCBB, 0x8892, + 0xCCBC, 0x78B3, 0xCCBD, 0x63A2, 0xCCBE, 0x53F9, 0xCCBF, 0x70AD, 0xCCC0, 0x6C64, 0xCCC1, 0x5858, 0xCCC2, 0x642A, 0xCCC3, 0x5802, + 0xCCC4, 0x68E0, 0xCCC5, 0x819B, 0xCCC6, 0x5510, 0xCCC7, 0x7CD6, 0xCCC8, 0x5018, 0xCCC9, 0x8EBA, 0xCCCA, 0x6DCC, 0xCCCB, 0x8D9F, + 0xCCCC, 0x70EB, 0xCCCD, 0x638F, 0xCCCE, 0x6D9B, 0xCCCF, 0x6ED4, 0xCCD0, 0x7EE6, 0xCCD1, 0x8404, 0xCCD2, 0x6843, 0xCCD3, 0x9003, + 0xCCD4, 0x6DD8, 0xCCD5, 0x9676, 0xCCD6, 0x8BA8, 0xCCD7, 0x5957, 0xCCD8, 0x7279, 0xCCD9, 0x85E4, 0xCCDA, 0x817E, 0xCCDB, 0x75BC, + 0xCCDC, 0x8A8A, 0xCCDD, 0x68AF, 0xCCDE, 0x5254, 0xCCDF, 0x8E22, 0xCCE0, 0x9511, 0xCCE1, 0x63D0, 0xCCE2, 0x9898, 0xCCE3, 0x8E44, + 0xCCE4, 0x557C, 0xCCE5, 0x4F53, 0xCCE6, 0x66FF, 0xCCE7, 0x568F, 0xCCE8, 0x60D5, 0xCCE9, 0x6D95, 0xCCEA, 0x5243, 0xCCEB, 0x5C49, + 0xCCEC, 0x5929, 0xCCED, 0x6DFB, 0xCCEE, 0x586B, 0xCCEF, 0x7530, 0xCCF0, 0x751C, 0xCCF1, 0x606C, 0xCCF2, 0x8214, 0xCCF3, 0x8146, + 0xCCF4, 0x6311, 0xCCF5, 0x6761, 0xCCF6, 0x8FE2, 0xCCF7, 0x773A, 0xCCF8, 0x8DF3, 0xCCF9, 0x8D34, 0xCCFA, 0x94C1, 0xCCFB, 0x5E16, + 0xCCFC, 0x5385, 0xCCFD, 0x542C, 0xCCFE, 0x70C3, 0xCD40, 0x866D, 0xCD41, 0x866F, 0xCD42, 0x8670, 0xCD43, 0x8672, 0xCD44, 0x8673, + 0xCD45, 0x8674, 0xCD46, 0x8675, 0xCD47, 0x8676, 0xCD48, 0x8677, 0xCD49, 0x8678, 0xCD4A, 0x8683, 0xCD4B, 0x8684, 0xCD4C, 0x8685, + 0xCD4D, 0x8686, 0xCD4E, 0x8687, 0xCD4F, 0x8688, 0xCD50, 0x8689, 0xCD51, 0x868E, 0xCD52, 0x868F, 0xCD53, 0x8690, 0xCD54, 0x8691, + 0xCD55, 0x8692, 0xCD56, 0x8694, 0xCD57, 0x8696, 0xCD58, 0x8697, 0xCD59, 0x8698, 0xCD5A, 0x8699, 0xCD5B, 0x869A, 0xCD5C, 0x869B, + 0xCD5D, 0x869E, 0xCD5E, 0x869F, 0xCD5F, 0x86A0, 0xCD60, 0x86A1, 0xCD61, 0x86A2, 0xCD62, 0x86A5, 0xCD63, 0x86A6, 0xCD64, 0x86AB, + 0xCD65, 0x86AD, 0xCD66, 0x86AE, 0xCD67, 0x86B2, 0xCD68, 0x86B3, 0xCD69, 0x86B7, 0xCD6A, 0x86B8, 0xCD6B, 0x86B9, 0xCD6C, 0x86BB, + 0xCD6D, 0x86BC, 0xCD6E, 0x86BD, 0xCD6F, 0x86BE, 0xCD70, 0x86BF, 0xCD71, 0x86C1, 0xCD72, 0x86C2, 0xCD73, 0x86C3, 0xCD74, 0x86C5, + 0xCD75, 0x86C8, 0xCD76, 0x86CC, 0xCD77, 0x86CD, 0xCD78, 0x86D2, 0xCD79, 0x86D3, 0xCD7A, 0x86D5, 0xCD7B, 0x86D6, 0xCD7C, 0x86D7, + 0xCD7D, 0x86DA, 0xCD7E, 0x86DC, 0xCD80, 0x86DD, 0xCD81, 0x86E0, 0xCD82, 0x86E1, 0xCD83, 0x86E2, 0xCD84, 0x86E3, 0xCD85, 0x86E5, + 0xCD86, 0x86E6, 0xCD87, 0x86E7, 0xCD88, 0x86E8, 0xCD89, 0x86EA, 0xCD8A, 0x86EB, 0xCD8B, 0x86EC, 0xCD8C, 0x86EF, 0xCD8D, 0x86F5, + 0xCD8E, 0x86F6, 0xCD8F, 0x86F7, 0xCD90, 0x86FA, 0xCD91, 0x86FB, 0xCD92, 0x86FC, 0xCD93, 0x86FD, 0xCD94, 0x86FF, 0xCD95, 0x8701, + 0xCD96, 0x8704, 0xCD97, 0x8705, 0xCD98, 0x8706, 0xCD99, 0x870B, 0xCD9A, 0x870C, 0xCD9B, 0x870E, 0xCD9C, 0x870F, 0xCD9D, 0x8710, + 0xCD9E, 0x8711, 0xCD9F, 0x8714, 0xCDA0, 0x8716, 0xCDA1, 0x6C40, 0xCDA2, 0x5EF7, 0xCDA3, 0x505C, 0xCDA4, 0x4EAD, 0xCDA5, 0x5EAD, + 0xCDA6, 0x633A, 0xCDA7, 0x8247, 0xCDA8, 0x901A, 0xCDA9, 0x6850, 0xCDAA, 0x916E, 0xCDAB, 0x77B3, 0xCDAC, 0x540C, 0xCDAD, 0x94DC, + 0xCDAE, 0x5F64, 0xCDAF, 0x7AE5, 0xCDB0, 0x6876, 0xCDB1, 0x6345, 0xCDB2, 0x7B52, 0xCDB3, 0x7EDF, 0xCDB4, 0x75DB, 0xCDB5, 0x5077, + 0xCDB6, 0x6295, 0xCDB7, 0x5934, 0xCDB8, 0x900F, 0xCDB9, 0x51F8, 0xCDBA, 0x79C3, 0xCDBB, 0x7A81, 0xCDBC, 0x56FE, 0xCDBD, 0x5F92, + 0xCDBE, 0x9014, 0xCDBF, 0x6D82, 0xCDC0, 0x5C60, 0xCDC1, 0x571F, 0xCDC2, 0x5410, 0xCDC3, 0x5154, 0xCDC4, 0x6E4D, 0xCDC5, 0x56E2, + 0xCDC6, 0x63A8, 0xCDC7, 0x9893, 0xCDC8, 0x817F, 0xCDC9, 0x8715, 0xCDCA, 0x892A, 0xCDCB, 0x9000, 0xCDCC, 0x541E, 0xCDCD, 0x5C6F, + 0xCDCE, 0x81C0, 0xCDCF, 0x62D6, 0xCDD0, 0x6258, 0xCDD1, 0x8131, 0xCDD2, 0x9E35, 0xCDD3, 0x9640, 0xCDD4, 0x9A6E, 0xCDD5, 0x9A7C, + 0xCDD6, 0x692D, 0xCDD7, 0x59A5, 0xCDD8, 0x62D3, 0xCDD9, 0x553E, 0xCDDA, 0x6316, 0xCDDB, 0x54C7, 0xCDDC, 0x86D9, 0xCDDD, 0x6D3C, + 0xCDDE, 0x5A03, 0xCDDF, 0x74E6, 0xCDE0, 0x889C, 0xCDE1, 0x6B6A, 0xCDE2, 0x5916, 0xCDE3, 0x8C4C, 0xCDE4, 0x5F2F, 0xCDE5, 0x6E7E, + 0xCDE6, 0x73A9, 0xCDE7, 0x987D, 0xCDE8, 0x4E38, 0xCDE9, 0x70F7, 0xCDEA, 0x5B8C, 0xCDEB, 0x7897, 0xCDEC, 0x633D, 0xCDED, 0x665A, + 0xCDEE, 0x7696, 0xCDEF, 0x60CB, 0xCDF0, 0x5B9B, 0xCDF1, 0x5A49, 0xCDF2, 0x4E07, 0xCDF3, 0x8155, 0xCDF4, 0x6C6A, 0xCDF5, 0x738B, + 0xCDF6, 0x4EA1, 0xCDF7, 0x6789, 0xCDF8, 0x7F51, 0xCDF9, 0x5F80, 0xCDFA, 0x65FA, 0xCDFB, 0x671B, 0xCDFC, 0x5FD8, 0xCDFD, 0x5984, + 0xCDFE, 0x5A01, 0xCE40, 0x8719, 0xCE41, 0x871B, 0xCE42, 0x871D, 0xCE43, 0x871F, 0xCE44, 0x8720, 0xCE45, 0x8724, 0xCE46, 0x8726, + 0xCE47, 0x8727, 0xCE48, 0x8728, 0xCE49, 0x872A, 0xCE4A, 0x872B, 0xCE4B, 0x872C, 0xCE4C, 0x872D, 0xCE4D, 0x872F, 0xCE4E, 0x8730, + 0xCE4F, 0x8732, 0xCE50, 0x8733, 0xCE51, 0x8735, 0xCE52, 0x8736, 0xCE53, 0x8738, 0xCE54, 0x8739, 0xCE55, 0x873A, 0xCE56, 0x873C, + 0xCE57, 0x873D, 0xCE58, 0x8740, 0xCE59, 0x8741, 0xCE5A, 0x8742, 0xCE5B, 0x8743, 0xCE5C, 0x8744, 0xCE5D, 0x8745, 0xCE5E, 0x8746, + 0xCE5F, 0x874A, 0xCE60, 0x874B, 0xCE61, 0x874D, 0xCE62, 0x874F, 0xCE63, 0x8750, 0xCE64, 0x8751, 0xCE65, 0x8752, 0xCE66, 0x8754, + 0xCE67, 0x8755, 0xCE68, 0x8756, 0xCE69, 0x8758, 0xCE6A, 0x875A, 0xCE6B, 0x875B, 0xCE6C, 0x875C, 0xCE6D, 0x875D, 0xCE6E, 0x875E, + 0xCE6F, 0x875F, 0xCE70, 0x8761, 0xCE71, 0x8762, 0xCE72, 0x8766, 0xCE73, 0x8767, 0xCE74, 0x8768, 0xCE75, 0x8769, 0xCE76, 0x876A, + 0xCE77, 0x876B, 0xCE78, 0x876C, 0xCE79, 0x876D, 0xCE7A, 0x876F, 0xCE7B, 0x8771, 0xCE7C, 0x8772, 0xCE7D, 0x8773, 0xCE7E, 0x8775, + 0xCE80, 0x8777, 0xCE81, 0x8778, 0xCE82, 0x8779, 0xCE83, 0x877A, 0xCE84, 0x877F, 0xCE85, 0x8780, 0xCE86, 0x8781, 0xCE87, 0x8784, + 0xCE88, 0x8786, 0xCE89, 0x8787, 0xCE8A, 0x8789, 0xCE8B, 0x878A, 0xCE8C, 0x878C, 0xCE8D, 0x878E, 0xCE8E, 0x878F, 0xCE8F, 0x8790, + 0xCE90, 0x8791, 0xCE91, 0x8792, 0xCE92, 0x8794, 0xCE93, 0x8795, 0xCE94, 0x8796, 0xCE95, 0x8798, 0xCE96, 0x8799, 0xCE97, 0x879A, + 0xCE98, 0x879B, 0xCE99, 0x879C, 0xCE9A, 0x879D, 0xCE9B, 0x879E, 0xCE9C, 0x87A0, 0xCE9D, 0x87A1, 0xCE9E, 0x87A2, 0xCE9F, 0x87A3, + 0xCEA0, 0x87A4, 0xCEA1, 0x5DCD, 0xCEA2, 0x5FAE, 0xCEA3, 0x5371, 0xCEA4, 0x97E6, 0xCEA5, 0x8FDD, 0xCEA6, 0x6845, 0xCEA7, 0x56F4, + 0xCEA8, 0x552F, 0xCEA9, 0x60DF, 0xCEAA, 0x4E3A, 0xCEAB, 0x6F4D, 0xCEAC, 0x7EF4, 0xCEAD, 0x82C7, 0xCEAE, 0x840E, 0xCEAF, 0x59D4, + 0xCEB0, 0x4F1F, 0xCEB1, 0x4F2A, 0xCEB2, 0x5C3E, 0xCEB3, 0x7EAC, 0xCEB4, 0x672A, 0xCEB5, 0x851A, 0xCEB6, 0x5473, 0xCEB7, 0x754F, + 0xCEB8, 0x80C3, 0xCEB9, 0x5582, 0xCEBA, 0x9B4F, 0xCEBB, 0x4F4D, 0xCEBC, 0x6E2D, 0xCEBD, 0x8C13, 0xCEBE, 0x5C09, 0xCEBF, 0x6170, + 0xCEC0, 0x536B, 0xCEC1, 0x761F, 0xCEC2, 0x6E29, 0xCEC3, 0x868A, 0xCEC4, 0x6587, 0xCEC5, 0x95FB, 0xCEC6, 0x7EB9, 0xCEC7, 0x543B, + 0xCEC8, 0x7A33, 0xCEC9, 0x7D0A, 0xCECA, 0x95EE, 0xCECB, 0x55E1, 0xCECC, 0x7FC1, 0xCECD, 0x74EE, 0xCECE, 0x631D, 0xCECF, 0x8717, + 0xCED0, 0x6DA1, 0xCED1, 0x7A9D, 0xCED2, 0x6211, 0xCED3, 0x65A1, 0xCED4, 0x5367, 0xCED5, 0x63E1, 0xCED6, 0x6C83, 0xCED7, 0x5DEB, + 0xCED8, 0x545C, 0xCED9, 0x94A8, 0xCEDA, 0x4E4C, 0xCEDB, 0x6C61, 0xCEDC, 0x8BEC, 0xCEDD, 0x5C4B, 0xCEDE, 0x65E0, 0xCEDF, 0x829C, + 0xCEE0, 0x68A7, 0xCEE1, 0x543E, 0xCEE2, 0x5434, 0xCEE3, 0x6BCB, 0xCEE4, 0x6B66, 0xCEE5, 0x4E94, 0xCEE6, 0x6342, 0xCEE7, 0x5348, + 0xCEE8, 0x821E, 0xCEE9, 0x4F0D, 0xCEEA, 0x4FAE, 0xCEEB, 0x575E, 0xCEEC, 0x620A, 0xCEED, 0x96FE, 0xCEEE, 0x6664, 0xCEEF, 0x7269, + 0xCEF0, 0x52FF, 0xCEF1, 0x52A1, 0xCEF2, 0x609F, 0xCEF3, 0x8BEF, 0xCEF4, 0x6614, 0xCEF5, 0x7199, 0xCEF6, 0x6790, 0xCEF7, 0x897F, + 0xCEF8, 0x7852, 0xCEF9, 0x77FD, 0xCEFA, 0x6670, 0xCEFB, 0x563B, 0xCEFC, 0x5438, 0xCEFD, 0x9521, 0xCEFE, 0x727A, 0xCF40, 0x87A5, + 0xCF41, 0x87A6, 0xCF42, 0x87A7, 0xCF43, 0x87A9, 0xCF44, 0x87AA, 0xCF45, 0x87AE, 0xCF46, 0x87B0, 0xCF47, 0x87B1, 0xCF48, 0x87B2, + 0xCF49, 0x87B4, 0xCF4A, 0x87B6, 0xCF4B, 0x87B7, 0xCF4C, 0x87B8, 0xCF4D, 0x87B9, 0xCF4E, 0x87BB, 0xCF4F, 0x87BC, 0xCF50, 0x87BE, + 0xCF51, 0x87BF, 0xCF52, 0x87C1, 0xCF53, 0x87C2, 0xCF54, 0x87C3, 0xCF55, 0x87C4, 0xCF56, 0x87C5, 0xCF57, 0x87C7, 0xCF58, 0x87C8, + 0xCF59, 0x87C9, 0xCF5A, 0x87CC, 0xCF5B, 0x87CD, 0xCF5C, 0x87CE, 0xCF5D, 0x87CF, 0xCF5E, 0x87D0, 0xCF5F, 0x87D4, 0xCF60, 0x87D5, + 0xCF61, 0x87D6, 0xCF62, 0x87D7, 0xCF63, 0x87D8, 0xCF64, 0x87D9, 0xCF65, 0x87DA, 0xCF66, 0x87DC, 0xCF67, 0x87DD, 0xCF68, 0x87DE, + 0xCF69, 0x87DF, 0xCF6A, 0x87E1, 0xCF6B, 0x87E2, 0xCF6C, 0x87E3, 0xCF6D, 0x87E4, 0xCF6E, 0x87E6, 0xCF6F, 0x87E7, 0xCF70, 0x87E8, + 0xCF71, 0x87E9, 0xCF72, 0x87EB, 0xCF73, 0x87EC, 0xCF74, 0x87ED, 0xCF75, 0x87EF, 0xCF76, 0x87F0, 0xCF77, 0x87F1, 0xCF78, 0x87F2, + 0xCF79, 0x87F3, 0xCF7A, 0x87F4, 0xCF7B, 0x87F5, 0xCF7C, 0x87F6, 0xCF7D, 0x87F7, 0xCF7E, 0x87F8, 0xCF80, 0x87FA, 0xCF81, 0x87FB, + 0xCF82, 0x87FC, 0xCF83, 0x87FD, 0xCF84, 0x87FF, 0xCF85, 0x8800, 0xCF86, 0x8801, 0xCF87, 0x8802, 0xCF88, 0x8804, 0xCF89, 0x8805, + 0xCF8A, 0x8806, 0xCF8B, 0x8807, 0xCF8C, 0x8808, 0xCF8D, 0x8809, 0xCF8E, 0x880B, 0xCF8F, 0x880C, 0xCF90, 0x880D, 0xCF91, 0x880E, + 0xCF92, 0x880F, 0xCF93, 0x8810, 0xCF94, 0x8811, 0xCF95, 0x8812, 0xCF96, 0x8814, 0xCF97, 0x8817, 0xCF98, 0x8818, 0xCF99, 0x8819, + 0xCF9A, 0x881A, 0xCF9B, 0x881C, 0xCF9C, 0x881D, 0xCF9D, 0x881E, 0xCF9E, 0x881F, 0xCF9F, 0x8820, 0xCFA0, 0x8823, 0xCFA1, 0x7A00, + 0xCFA2, 0x606F, 0xCFA3, 0x5E0C, 0xCFA4, 0x6089, 0xCFA5, 0x819D, 0xCFA6, 0x5915, 0xCFA7, 0x60DC, 0xCFA8, 0x7184, 0xCFA9, 0x70EF, + 0xCFAA, 0x6EAA, 0xCFAB, 0x6C50, 0xCFAC, 0x7280, 0xCFAD, 0x6A84, 0xCFAE, 0x88AD, 0xCFAF, 0x5E2D, 0xCFB0, 0x4E60, 0xCFB1, 0x5AB3, + 0xCFB2, 0x559C, 0xCFB3, 0x94E3, 0xCFB4, 0x6D17, 0xCFB5, 0x7CFB, 0xCFB6, 0x9699, 0xCFB7, 0x620F, 0xCFB8, 0x7EC6, 0xCFB9, 0x778E, + 0xCFBA, 0x867E, 0xCFBB, 0x5323, 0xCFBC, 0x971E, 0xCFBD, 0x8F96, 0xCFBE, 0x6687, 0xCFBF, 0x5CE1, 0xCFC0, 0x4FA0, 0xCFC1, 0x72ED, + 0xCFC2, 0x4E0B, 0xCFC3, 0x53A6, 0xCFC4, 0x590F, 0xCFC5, 0x5413, 0xCFC6, 0x6380, 0xCFC7, 0x9528, 0xCFC8, 0x5148, 0xCFC9, 0x4ED9, + 0xCFCA, 0x9C9C, 0xCFCB, 0x7EA4, 0xCFCC, 0x54B8, 0xCFCD, 0x8D24, 0xCFCE, 0x8854, 0xCFCF, 0x8237, 0xCFD0, 0x95F2, 0xCFD1, 0x6D8E, + 0xCFD2, 0x5F26, 0xCFD3, 0x5ACC, 0xCFD4, 0x663E, 0xCFD5, 0x9669, 0xCFD6, 0x73B0, 0xCFD7, 0x732E, 0xCFD8, 0x53BF, 0xCFD9, 0x817A, + 0xCFDA, 0x9985, 0xCFDB, 0x7FA1, 0xCFDC, 0x5BAA, 0xCFDD, 0x9677, 0xCFDE, 0x9650, 0xCFDF, 0x7EBF, 0xCFE0, 0x76F8, 0xCFE1, 0x53A2, + 0xCFE2, 0x9576, 0xCFE3, 0x9999, 0xCFE4, 0x7BB1, 0xCFE5, 0x8944, 0xCFE6, 0x6E58, 0xCFE7, 0x4E61, 0xCFE8, 0x7FD4, 0xCFE9, 0x7965, + 0xCFEA, 0x8BE6, 0xCFEB, 0x60F3, 0xCFEC, 0x54CD, 0xCFED, 0x4EAB, 0xCFEE, 0x9879, 0xCFEF, 0x5DF7, 0xCFF0, 0x6A61, 0xCFF1, 0x50CF, + 0xCFF2, 0x5411, 0xCFF3, 0x8C61, 0xCFF4, 0x8427, 0xCFF5, 0x785D, 0xCFF6, 0x9704, 0xCFF7, 0x524A, 0xCFF8, 0x54EE, 0xCFF9, 0x56A3, + 0xCFFA, 0x9500, 0xCFFB, 0x6D88, 0xCFFC, 0x5BB5, 0xCFFD, 0x6DC6, 0xCFFE, 0x6653, 0xD040, 0x8824, 0xD041, 0x8825, 0xD042, 0x8826, + 0xD043, 0x8827, 0xD044, 0x8828, 0xD045, 0x8829, 0xD046, 0x882A, 0xD047, 0x882B, 0xD048, 0x882C, 0xD049, 0x882D, 0xD04A, 0x882E, + 0xD04B, 0x882F, 0xD04C, 0x8830, 0xD04D, 0x8831, 0xD04E, 0x8833, 0xD04F, 0x8834, 0xD050, 0x8835, 0xD051, 0x8836, 0xD052, 0x8837, + 0xD053, 0x8838, 0xD054, 0x883A, 0xD055, 0x883B, 0xD056, 0x883D, 0xD057, 0x883E, 0xD058, 0x883F, 0xD059, 0x8841, 0xD05A, 0x8842, + 0xD05B, 0x8843, 0xD05C, 0x8846, 0xD05D, 0x8847, 0xD05E, 0x8848, 0xD05F, 0x8849, 0xD060, 0x884A, 0xD061, 0x884B, 0xD062, 0x884E, + 0xD063, 0x884F, 0xD064, 0x8850, 0xD065, 0x8851, 0xD066, 0x8852, 0xD067, 0x8853, 0xD068, 0x8855, 0xD069, 0x8856, 0xD06A, 0x8858, + 0xD06B, 0x885A, 0xD06C, 0x885B, 0xD06D, 0x885C, 0xD06E, 0x885D, 0xD06F, 0x885E, 0xD070, 0x885F, 0xD071, 0x8860, 0xD072, 0x8866, + 0xD073, 0x8867, 0xD074, 0x886A, 0xD075, 0x886D, 0xD076, 0x886F, 0xD077, 0x8871, 0xD078, 0x8873, 0xD079, 0x8874, 0xD07A, 0x8875, + 0xD07B, 0x8876, 0xD07C, 0x8878, 0xD07D, 0x8879, 0xD07E, 0x887A, 0xD080, 0x887B, 0xD081, 0x887C, 0xD082, 0x8880, 0xD083, 0x8883, + 0xD084, 0x8886, 0xD085, 0x8887, 0xD086, 0x8889, 0xD087, 0x888A, 0xD088, 0x888C, 0xD089, 0x888E, 0xD08A, 0x888F, 0xD08B, 0x8890, + 0xD08C, 0x8891, 0xD08D, 0x8893, 0xD08E, 0x8894, 0xD08F, 0x8895, 0xD090, 0x8897, 0xD091, 0x8898, 0xD092, 0x8899, 0xD093, 0x889A, + 0xD094, 0x889B, 0xD095, 0x889D, 0xD096, 0x889E, 0xD097, 0x889F, 0xD098, 0x88A0, 0xD099, 0x88A1, 0xD09A, 0x88A3, 0xD09B, 0x88A5, + 0xD09C, 0x88A6, 0xD09D, 0x88A7, 0xD09E, 0x88A8, 0xD09F, 0x88A9, 0xD0A0, 0x88AA, 0xD0A1, 0x5C0F, 0xD0A2, 0x5B5D, 0xD0A3, 0x6821, + 0xD0A4, 0x8096, 0xD0A5, 0x5578, 0xD0A6, 0x7B11, 0xD0A7, 0x6548, 0xD0A8, 0x6954, 0xD0A9, 0x4E9B, 0xD0AA, 0x6B47, 0xD0AB, 0x874E, + 0xD0AC, 0x978B, 0xD0AD, 0x534F, 0xD0AE, 0x631F, 0xD0AF, 0x643A, 0xD0B0, 0x90AA, 0xD0B1, 0x659C, 0xD0B2, 0x80C1, 0xD0B3, 0x8C10, + 0xD0B4, 0x5199, 0xD0B5, 0x68B0, 0xD0B6, 0x5378, 0xD0B7, 0x87F9, 0xD0B8, 0x61C8, 0xD0B9, 0x6CC4, 0xD0BA, 0x6CFB, 0xD0BB, 0x8C22, + 0xD0BC, 0x5C51, 0xD0BD, 0x85AA, 0xD0BE, 0x82AF, 0xD0BF, 0x950C, 0xD0C0, 0x6B23, 0xD0C1, 0x8F9B, 0xD0C2, 0x65B0, 0xD0C3, 0x5FFB, + 0xD0C4, 0x5FC3, 0xD0C5, 0x4FE1, 0xD0C6, 0x8845, 0xD0C7, 0x661F, 0xD0C8, 0x8165, 0xD0C9, 0x7329, 0xD0CA, 0x60FA, 0xD0CB, 0x5174, + 0xD0CC, 0x5211, 0xD0CD, 0x578B, 0xD0CE, 0x5F62, 0xD0CF, 0x90A2, 0xD0D0, 0x884C, 0xD0D1, 0x9192, 0xD0D2, 0x5E78, 0xD0D3, 0x674F, + 0xD0D4, 0x6027, 0xD0D5, 0x59D3, 0xD0D6, 0x5144, 0xD0D7, 0x51F6, 0xD0D8, 0x80F8, 0xD0D9, 0x5308, 0xD0DA, 0x6C79, 0xD0DB, 0x96C4, + 0xD0DC, 0x718A, 0xD0DD, 0x4F11, 0xD0DE, 0x4FEE, 0xD0DF, 0x7F9E, 0xD0E0, 0x673D, 0xD0E1, 0x55C5, 0xD0E2, 0x9508, 0xD0E3, 0x79C0, + 0xD0E4, 0x8896, 0xD0E5, 0x7EE3, 0xD0E6, 0x589F, 0xD0E7, 0x620C, 0xD0E8, 0x9700, 0xD0E9, 0x865A, 0xD0EA, 0x5618, 0xD0EB, 0x987B, + 0xD0EC, 0x5F90, 0xD0ED, 0x8BB8, 0xD0EE, 0x84C4, 0xD0EF, 0x9157, 0xD0F0, 0x53D9, 0xD0F1, 0x65ED, 0xD0F2, 0x5E8F, 0xD0F3, 0x755C, + 0xD0F4, 0x6064, 0xD0F5, 0x7D6E, 0xD0F6, 0x5A7F, 0xD0F7, 0x7EEA, 0xD0F8, 0x7EED, 0xD0F9, 0x8F69, 0xD0FA, 0x55A7, 0xD0FB, 0x5BA3, + 0xD0FC, 0x60AC, 0xD0FD, 0x65CB, 0xD0FE, 0x7384, 0xD140, 0x88AC, 0xD141, 0x88AE, 0xD142, 0x88AF, 0xD143, 0x88B0, 0xD144, 0x88B2, + 0xD145, 0x88B3, 0xD146, 0x88B4, 0xD147, 0x88B5, 0xD148, 0x88B6, 0xD149, 0x88B8, 0xD14A, 0x88B9, 0xD14B, 0x88BA, 0xD14C, 0x88BB, + 0xD14D, 0x88BD, 0xD14E, 0x88BE, 0xD14F, 0x88BF, 0xD150, 0x88C0, 0xD151, 0x88C3, 0xD152, 0x88C4, 0xD153, 0x88C7, 0xD154, 0x88C8, + 0xD155, 0x88CA, 0xD156, 0x88CB, 0xD157, 0x88CC, 0xD158, 0x88CD, 0xD159, 0x88CF, 0xD15A, 0x88D0, 0xD15B, 0x88D1, 0xD15C, 0x88D3, + 0xD15D, 0x88D6, 0xD15E, 0x88D7, 0xD15F, 0x88DA, 0xD160, 0x88DB, 0xD161, 0x88DC, 0xD162, 0x88DD, 0xD163, 0x88DE, 0xD164, 0x88E0, + 0xD165, 0x88E1, 0xD166, 0x88E6, 0xD167, 0x88E7, 0xD168, 0x88E9, 0xD169, 0x88EA, 0xD16A, 0x88EB, 0xD16B, 0x88EC, 0xD16C, 0x88ED, + 0xD16D, 0x88EE, 0xD16E, 0x88EF, 0xD16F, 0x88F2, 0xD170, 0x88F5, 0xD171, 0x88F6, 0xD172, 0x88F7, 0xD173, 0x88FA, 0xD174, 0x88FB, + 0xD175, 0x88FD, 0xD176, 0x88FF, 0xD177, 0x8900, 0xD178, 0x8901, 0xD179, 0x8903, 0xD17A, 0x8904, 0xD17B, 0x8905, 0xD17C, 0x8906, + 0xD17D, 0x8907, 0xD17E, 0x8908, 0xD180, 0x8909, 0xD181, 0x890B, 0xD182, 0x890C, 0xD183, 0x890D, 0xD184, 0x890E, 0xD185, 0x890F, + 0xD186, 0x8911, 0xD187, 0x8914, 0xD188, 0x8915, 0xD189, 0x8916, 0xD18A, 0x8917, 0xD18B, 0x8918, 0xD18C, 0x891C, 0xD18D, 0x891D, + 0xD18E, 0x891E, 0xD18F, 0x891F, 0xD190, 0x8920, 0xD191, 0x8922, 0xD192, 0x8923, 0xD193, 0x8924, 0xD194, 0x8926, 0xD195, 0x8927, + 0xD196, 0x8928, 0xD197, 0x8929, 0xD198, 0x892C, 0xD199, 0x892D, 0xD19A, 0x892E, 0xD19B, 0x892F, 0xD19C, 0x8931, 0xD19D, 0x8932, + 0xD19E, 0x8933, 0xD19F, 0x8935, 0xD1A0, 0x8937, 0xD1A1, 0x9009, 0xD1A2, 0x7663, 0xD1A3, 0x7729, 0xD1A4, 0x7EDA, 0xD1A5, 0x9774, + 0xD1A6, 0x859B, 0xD1A7, 0x5B66, 0xD1A8, 0x7A74, 0xD1A9, 0x96EA, 0xD1AA, 0x8840, 0xD1AB, 0x52CB, 0xD1AC, 0x718F, 0xD1AD, 0x5FAA, + 0xD1AE, 0x65EC, 0xD1AF, 0x8BE2, 0xD1B0, 0x5BFB, 0xD1B1, 0x9A6F, 0xD1B2, 0x5DE1, 0xD1B3, 0x6B89, 0xD1B4, 0x6C5B, 0xD1B5, 0x8BAD, + 0xD1B6, 0x8BAF, 0xD1B7, 0x900A, 0xD1B8, 0x8FC5, 0xD1B9, 0x538B, 0xD1BA, 0x62BC, 0xD1BB, 0x9E26, 0xD1BC, 0x9E2D, 0xD1BD, 0x5440, + 0xD1BE, 0x4E2B, 0xD1BF, 0x82BD, 0xD1C0, 0x7259, 0xD1C1, 0x869C, 0xD1C2, 0x5D16, 0xD1C3, 0x8859, 0xD1C4, 0x6DAF, 0xD1C5, 0x96C5, + 0xD1C6, 0x54D1, 0xD1C7, 0x4E9A, 0xD1C8, 0x8BB6, 0xD1C9, 0x7109, 0xD1CA, 0x54BD, 0xD1CB, 0x9609, 0xD1CC, 0x70DF, 0xD1CD, 0x6DF9, + 0xD1CE, 0x76D0, 0xD1CF, 0x4E25, 0xD1D0, 0x7814, 0xD1D1, 0x8712, 0xD1D2, 0x5CA9, 0xD1D3, 0x5EF6, 0xD1D4, 0x8A00, 0xD1D5, 0x989C, + 0xD1D6, 0x960E, 0xD1D7, 0x708E, 0xD1D8, 0x6CBF, 0xD1D9, 0x5944, 0xD1DA, 0x63A9, 0xD1DB, 0x773C, 0xD1DC, 0x884D, 0xD1DD, 0x6F14, + 0xD1DE, 0x8273, 0xD1DF, 0x5830, 0xD1E0, 0x71D5, 0xD1E1, 0x538C, 0xD1E2, 0x781A, 0xD1E3, 0x96C1, 0xD1E4, 0x5501, 0xD1E5, 0x5F66, + 0xD1E6, 0x7130, 0xD1E7, 0x5BB4, 0xD1E8, 0x8C1A, 0xD1E9, 0x9A8C, 0xD1EA, 0x6B83, 0xD1EB, 0x592E, 0xD1EC, 0x9E2F, 0xD1ED, 0x79E7, + 0xD1EE, 0x6768, 0xD1EF, 0x626C, 0xD1F0, 0x4F6F, 0xD1F1, 0x75A1, 0xD1F2, 0x7F8A, 0xD1F3, 0x6D0B, 0xD1F4, 0x9633, 0xD1F5, 0x6C27, + 0xD1F6, 0x4EF0, 0xD1F7, 0x75D2, 0xD1F8, 0x517B, 0xD1F9, 0x6837, 0xD1FA, 0x6F3E, 0xD1FB, 0x9080, 0xD1FC, 0x8170, 0xD1FD, 0x5996, + 0xD1FE, 0x7476, 0xD240, 0x8938, 0xD241, 0x8939, 0xD242, 0x893A, 0xD243, 0x893B, 0xD244, 0x893C, 0xD245, 0x893D, 0xD246, 0x893E, + 0xD247, 0x893F, 0xD248, 0x8940, 0xD249, 0x8942, 0xD24A, 0x8943, 0xD24B, 0x8945, 0xD24C, 0x8946, 0xD24D, 0x8947, 0xD24E, 0x8948, + 0xD24F, 0x8949, 0xD250, 0x894A, 0xD251, 0x894B, 0xD252, 0x894C, 0xD253, 0x894D, 0xD254, 0x894E, 0xD255, 0x894F, 0xD256, 0x8950, + 0xD257, 0x8951, 0xD258, 0x8952, 0xD259, 0x8953, 0xD25A, 0x8954, 0xD25B, 0x8955, 0xD25C, 0x8956, 0xD25D, 0x8957, 0xD25E, 0x8958, + 0xD25F, 0x8959, 0xD260, 0x895A, 0xD261, 0x895B, 0xD262, 0x895C, 0xD263, 0x895D, 0xD264, 0x8960, 0xD265, 0x8961, 0xD266, 0x8962, + 0xD267, 0x8963, 0xD268, 0x8964, 0xD269, 0x8965, 0xD26A, 0x8967, 0xD26B, 0x8968, 0xD26C, 0x8969, 0xD26D, 0x896A, 0xD26E, 0x896B, + 0xD26F, 0x896C, 0xD270, 0x896D, 0xD271, 0x896E, 0xD272, 0x896F, 0xD273, 0x8970, 0xD274, 0x8971, 0xD275, 0x8972, 0xD276, 0x8973, + 0xD277, 0x8974, 0xD278, 0x8975, 0xD279, 0x8976, 0xD27A, 0x8977, 0xD27B, 0x8978, 0xD27C, 0x8979, 0xD27D, 0x897A, 0xD27E, 0x897C, + 0xD280, 0x897D, 0xD281, 0x897E, 0xD282, 0x8980, 0xD283, 0x8982, 0xD284, 0x8984, 0xD285, 0x8985, 0xD286, 0x8987, 0xD287, 0x8988, + 0xD288, 0x8989, 0xD289, 0x898A, 0xD28A, 0x898B, 0xD28B, 0x898C, 0xD28C, 0x898D, 0xD28D, 0x898E, 0xD28E, 0x898F, 0xD28F, 0x8990, + 0xD290, 0x8991, 0xD291, 0x8992, 0xD292, 0x8993, 0xD293, 0x8994, 0xD294, 0x8995, 0xD295, 0x8996, 0xD296, 0x8997, 0xD297, 0x8998, + 0xD298, 0x8999, 0xD299, 0x899A, 0xD29A, 0x899B, 0xD29B, 0x899C, 0xD29C, 0x899D, 0xD29D, 0x899E, 0xD29E, 0x899F, 0xD29F, 0x89A0, + 0xD2A0, 0x89A1, 0xD2A1, 0x6447, 0xD2A2, 0x5C27, 0xD2A3, 0x9065, 0xD2A4, 0x7A91, 0xD2A5, 0x8C23, 0xD2A6, 0x59DA, 0xD2A7, 0x54AC, + 0xD2A8, 0x8200, 0xD2A9, 0x836F, 0xD2AA, 0x8981, 0xD2AB, 0x8000, 0xD2AC, 0x6930, 0xD2AD, 0x564E, 0xD2AE, 0x8036, 0xD2AF, 0x7237, + 0xD2B0, 0x91CE, 0xD2B1, 0x51B6, 0xD2B2, 0x4E5F, 0xD2B3, 0x9875, 0xD2B4, 0x6396, 0xD2B5, 0x4E1A, 0xD2B6, 0x53F6, 0xD2B7, 0x66F3, + 0xD2B8, 0x814B, 0xD2B9, 0x591C, 0xD2BA, 0x6DB2, 0xD2BB, 0x4E00, 0xD2BC, 0x58F9, 0xD2BD, 0x533B, 0xD2BE, 0x63D6, 0xD2BF, 0x94F1, + 0xD2C0, 0x4F9D, 0xD2C1, 0x4F0A, 0xD2C2, 0x8863, 0xD2C3, 0x9890, 0xD2C4, 0x5937, 0xD2C5, 0x9057, 0xD2C6, 0x79FB, 0xD2C7, 0x4EEA, + 0xD2C8, 0x80F0, 0xD2C9, 0x7591, 0xD2CA, 0x6C82, 0xD2CB, 0x5B9C, 0xD2CC, 0x59E8, 0xD2CD, 0x5F5D, 0xD2CE, 0x6905, 0xD2CF, 0x8681, + 0xD2D0, 0x501A, 0xD2D1, 0x5DF2, 0xD2D2, 0x4E59, 0xD2D3, 0x77E3, 0xD2D4, 0x4EE5, 0xD2D5, 0x827A, 0xD2D6, 0x6291, 0xD2D7, 0x6613, + 0xD2D8, 0x9091, 0xD2D9, 0x5C79, 0xD2DA, 0x4EBF, 0xD2DB, 0x5F79, 0xD2DC, 0x81C6, 0xD2DD, 0x9038, 0xD2DE, 0x8084, 0xD2DF, 0x75AB, + 0xD2E0, 0x4EA6, 0xD2E1, 0x88D4, 0xD2E2, 0x610F, 0xD2E3, 0x6BC5, 0xD2E4, 0x5FC6, 0xD2E5, 0x4E49, 0xD2E6, 0x76CA, 0xD2E7, 0x6EA2, + 0xD2E8, 0x8BE3, 0xD2E9, 0x8BAE, 0xD2EA, 0x8C0A, 0xD2EB, 0x8BD1, 0xD2EC, 0x5F02, 0xD2ED, 0x7FFC, 0xD2EE, 0x7FCC, 0xD2EF, 0x7ECE, + 0xD2F0, 0x8335, 0xD2F1, 0x836B, 0xD2F2, 0x56E0, 0xD2F3, 0x6BB7, 0xD2F4, 0x97F3, 0xD2F5, 0x9634, 0xD2F6, 0x59FB, 0xD2F7, 0x541F, + 0xD2F8, 0x94F6, 0xD2F9, 0x6DEB, 0xD2FA, 0x5BC5, 0xD2FB, 0x996E, 0xD2FC, 0x5C39, 0xD2FD, 0x5F15, 0xD2FE, 0x9690, 0xD340, 0x89A2, + 0xD341, 0x89A3, 0xD342, 0x89A4, 0xD343, 0x89A5, 0xD344, 0x89A6, 0xD345, 0x89A7, 0xD346, 0x89A8, 0xD347, 0x89A9, 0xD348, 0x89AA, + 0xD349, 0x89AB, 0xD34A, 0x89AC, 0xD34B, 0x89AD, 0xD34C, 0x89AE, 0xD34D, 0x89AF, 0xD34E, 0x89B0, 0xD34F, 0x89B1, 0xD350, 0x89B2, + 0xD351, 0x89B3, 0xD352, 0x89B4, 0xD353, 0x89B5, 0xD354, 0x89B6, 0xD355, 0x89B7, 0xD356, 0x89B8, 0xD357, 0x89B9, 0xD358, 0x89BA, + 0xD359, 0x89BB, 0xD35A, 0x89BC, 0xD35B, 0x89BD, 0xD35C, 0x89BE, 0xD35D, 0x89BF, 0xD35E, 0x89C0, 0xD35F, 0x89C3, 0xD360, 0x89CD, + 0xD361, 0x89D3, 0xD362, 0x89D4, 0xD363, 0x89D5, 0xD364, 0x89D7, 0xD365, 0x89D8, 0xD366, 0x89D9, 0xD367, 0x89DB, 0xD368, 0x89DD, + 0xD369, 0x89DF, 0xD36A, 0x89E0, 0xD36B, 0x89E1, 0xD36C, 0x89E2, 0xD36D, 0x89E4, 0xD36E, 0x89E7, 0xD36F, 0x89E8, 0xD370, 0x89E9, + 0xD371, 0x89EA, 0xD372, 0x89EC, 0xD373, 0x89ED, 0xD374, 0x89EE, 0xD375, 0x89F0, 0xD376, 0x89F1, 0xD377, 0x89F2, 0xD378, 0x89F4, + 0xD379, 0x89F5, 0xD37A, 0x89F6, 0xD37B, 0x89F7, 0xD37C, 0x89F8, 0xD37D, 0x89F9, 0xD37E, 0x89FA, 0xD380, 0x89FB, 0xD381, 0x89FC, + 0xD382, 0x89FD, 0xD383, 0x89FE, 0xD384, 0x89FF, 0xD385, 0x8A01, 0xD386, 0x8A02, 0xD387, 0x8A03, 0xD388, 0x8A04, 0xD389, 0x8A05, + 0xD38A, 0x8A06, 0xD38B, 0x8A08, 0xD38C, 0x8A09, 0xD38D, 0x8A0A, 0xD38E, 0x8A0B, 0xD38F, 0x8A0C, 0xD390, 0x8A0D, 0xD391, 0x8A0E, + 0xD392, 0x8A0F, 0xD393, 0x8A10, 0xD394, 0x8A11, 0xD395, 0x8A12, 0xD396, 0x8A13, 0xD397, 0x8A14, 0xD398, 0x8A15, 0xD399, 0x8A16, + 0xD39A, 0x8A17, 0xD39B, 0x8A18, 0xD39C, 0x8A19, 0xD39D, 0x8A1A, 0xD39E, 0x8A1B, 0xD39F, 0x8A1C, 0xD3A0, 0x8A1D, 0xD3A1, 0x5370, + 0xD3A2, 0x82F1, 0xD3A3, 0x6A31, 0xD3A4, 0x5A74, 0xD3A5, 0x9E70, 0xD3A6, 0x5E94, 0xD3A7, 0x7F28, 0xD3A8, 0x83B9, 0xD3A9, 0x8424, + 0xD3AA, 0x8425, 0xD3AB, 0x8367, 0xD3AC, 0x8747, 0xD3AD, 0x8FCE, 0xD3AE, 0x8D62, 0xD3AF, 0x76C8, 0xD3B0, 0x5F71, 0xD3B1, 0x9896, + 0xD3B2, 0x786C, 0xD3B3, 0x6620, 0xD3B4, 0x54DF, 0xD3B5, 0x62E5, 0xD3B6, 0x4F63, 0xD3B7, 0x81C3, 0xD3B8, 0x75C8, 0xD3B9, 0x5EB8, + 0xD3BA, 0x96CD, 0xD3BB, 0x8E0A, 0xD3BC, 0x86F9, 0xD3BD, 0x548F, 0xD3BE, 0x6CF3, 0xD3BF, 0x6D8C, 0xD3C0, 0x6C38, 0xD3C1, 0x607F, + 0xD3C2, 0x52C7, 0xD3C3, 0x7528, 0xD3C4, 0x5E7D, 0xD3C5, 0x4F18, 0xD3C6, 0x60A0, 0xD3C7, 0x5FE7, 0xD3C8, 0x5C24, 0xD3C9, 0x7531, + 0xD3CA, 0x90AE, 0xD3CB, 0x94C0, 0xD3CC, 0x72B9, 0xD3CD, 0x6CB9, 0xD3CE, 0x6E38, 0xD3CF, 0x9149, 0xD3D0, 0x6709, 0xD3D1, 0x53CB, + 0xD3D2, 0x53F3, 0xD3D3, 0x4F51, 0xD3D4, 0x91C9, 0xD3D5, 0x8BF1, 0xD3D6, 0x53C8, 0xD3D7, 0x5E7C, 0xD3D8, 0x8FC2, 0xD3D9, 0x6DE4, + 0xD3DA, 0x4E8E, 0xD3DB, 0x76C2, 0xD3DC, 0x6986, 0xD3DD, 0x865E, 0xD3DE, 0x611A, 0xD3DF, 0x8206, 0xD3E0, 0x4F59, 0xD3E1, 0x4FDE, + 0xD3E2, 0x903E, 0xD3E3, 0x9C7C, 0xD3E4, 0x6109, 0xD3E5, 0x6E1D, 0xD3E6, 0x6E14, 0xD3E7, 0x9685, 0xD3E8, 0x4E88, 0xD3E9, 0x5A31, + 0xD3EA, 0x96E8, 0xD3EB, 0x4E0E, 0xD3EC, 0x5C7F, 0xD3ED, 0x79B9, 0xD3EE, 0x5B87, 0xD3EF, 0x8BED, 0xD3F0, 0x7FBD, 0xD3F1, 0x7389, + 0xD3F2, 0x57DF, 0xD3F3, 0x828B, 0xD3F4, 0x90C1, 0xD3F5, 0x5401, 0xD3F6, 0x9047, 0xD3F7, 0x55BB, 0xD3F8, 0x5CEA, 0xD3F9, 0x5FA1, + 0xD3FA, 0x6108, 0xD3FB, 0x6B32, 0xD3FC, 0x72F1, 0xD3FD, 0x80B2, 0xD3FE, 0x8A89, 0xD440, 0x8A1E, 0xD441, 0x8A1F, 0xD442, 0x8A20, + 0xD443, 0x8A21, 0xD444, 0x8A22, 0xD445, 0x8A23, 0xD446, 0x8A24, 0xD447, 0x8A25, 0xD448, 0x8A26, 0xD449, 0x8A27, 0xD44A, 0x8A28, + 0xD44B, 0x8A29, 0xD44C, 0x8A2A, 0xD44D, 0x8A2B, 0xD44E, 0x8A2C, 0xD44F, 0x8A2D, 0xD450, 0x8A2E, 0xD451, 0x8A2F, 0xD452, 0x8A30, + 0xD453, 0x8A31, 0xD454, 0x8A32, 0xD455, 0x8A33, 0xD456, 0x8A34, 0xD457, 0x8A35, 0xD458, 0x8A36, 0xD459, 0x8A37, 0xD45A, 0x8A38, + 0xD45B, 0x8A39, 0xD45C, 0x8A3A, 0xD45D, 0x8A3B, 0xD45E, 0x8A3C, 0xD45F, 0x8A3D, 0xD460, 0x8A3F, 0xD461, 0x8A40, 0xD462, 0x8A41, + 0xD463, 0x8A42, 0xD464, 0x8A43, 0xD465, 0x8A44, 0xD466, 0x8A45, 0xD467, 0x8A46, 0xD468, 0x8A47, 0xD469, 0x8A49, 0xD46A, 0x8A4A, + 0xD46B, 0x8A4B, 0xD46C, 0x8A4C, 0xD46D, 0x8A4D, 0xD46E, 0x8A4E, 0xD46F, 0x8A4F, 0xD470, 0x8A50, 0xD471, 0x8A51, 0xD472, 0x8A52, + 0xD473, 0x8A53, 0xD474, 0x8A54, 0xD475, 0x8A55, 0xD476, 0x8A56, 0xD477, 0x8A57, 0xD478, 0x8A58, 0xD479, 0x8A59, 0xD47A, 0x8A5A, + 0xD47B, 0x8A5B, 0xD47C, 0x8A5C, 0xD47D, 0x8A5D, 0xD47E, 0x8A5E, 0xD480, 0x8A5F, 0xD481, 0x8A60, 0xD482, 0x8A61, 0xD483, 0x8A62, + 0xD484, 0x8A63, 0xD485, 0x8A64, 0xD486, 0x8A65, 0xD487, 0x8A66, 0xD488, 0x8A67, 0xD489, 0x8A68, 0xD48A, 0x8A69, 0xD48B, 0x8A6A, + 0xD48C, 0x8A6B, 0xD48D, 0x8A6C, 0xD48E, 0x8A6D, 0xD48F, 0x8A6E, 0xD490, 0x8A6F, 0xD491, 0x8A70, 0xD492, 0x8A71, 0xD493, 0x8A72, + 0xD494, 0x8A73, 0xD495, 0x8A74, 0xD496, 0x8A75, 0xD497, 0x8A76, 0xD498, 0x8A77, 0xD499, 0x8A78, 0xD49A, 0x8A7A, 0xD49B, 0x8A7B, + 0xD49C, 0x8A7C, 0xD49D, 0x8A7D, 0xD49E, 0x8A7E, 0xD49F, 0x8A7F, 0xD4A0, 0x8A80, 0xD4A1, 0x6D74, 0xD4A2, 0x5BD3, 0xD4A3, 0x88D5, + 0xD4A4, 0x9884, 0xD4A5, 0x8C6B, 0xD4A6, 0x9A6D, 0xD4A7, 0x9E33, 0xD4A8, 0x6E0A, 0xD4A9, 0x51A4, 0xD4AA, 0x5143, 0xD4AB, 0x57A3, + 0xD4AC, 0x8881, 0xD4AD, 0x539F, 0xD4AE, 0x63F4, 0xD4AF, 0x8F95, 0xD4B0, 0x56ED, 0xD4B1, 0x5458, 0xD4B2, 0x5706, 0xD4B3, 0x733F, + 0xD4B4, 0x6E90, 0xD4B5, 0x7F18, 0xD4B6, 0x8FDC, 0xD4B7, 0x82D1, 0xD4B8, 0x613F, 0xD4B9, 0x6028, 0xD4BA, 0x9662, 0xD4BB, 0x66F0, + 0xD4BC, 0x7EA6, 0xD4BD, 0x8D8A, 0xD4BE, 0x8DC3, 0xD4BF, 0x94A5, 0xD4C0, 0x5CB3, 0xD4C1, 0x7CA4, 0xD4C2, 0x6708, 0xD4C3, 0x60A6, + 0xD4C4, 0x9605, 0xD4C5, 0x8018, 0xD4C6, 0x4E91, 0xD4C7, 0x90E7, 0xD4C8, 0x5300, 0xD4C9, 0x9668, 0xD4CA, 0x5141, 0xD4CB, 0x8FD0, + 0xD4CC, 0x8574, 0xD4CD, 0x915D, 0xD4CE, 0x6655, 0xD4CF, 0x97F5, 0xD4D0, 0x5B55, 0xD4D1, 0x531D, 0xD4D2, 0x7838, 0xD4D3, 0x6742, + 0xD4D4, 0x683D, 0xD4D5, 0x54C9, 0xD4D6, 0x707E, 0xD4D7, 0x5BB0, 0xD4D8, 0x8F7D, 0xD4D9, 0x518D, 0xD4DA, 0x5728, 0xD4DB, 0x54B1, + 0xD4DC, 0x6512, 0xD4DD, 0x6682, 0xD4DE, 0x8D5E, 0xD4DF, 0x8D43, 0xD4E0, 0x810F, 0xD4E1, 0x846C, 0xD4E2, 0x906D, 0xD4E3, 0x7CDF, + 0xD4E4, 0x51FF, 0xD4E5, 0x85FB, 0xD4E6, 0x67A3, 0xD4E7, 0x65E9, 0xD4E8, 0x6FA1, 0xD4E9, 0x86A4, 0xD4EA, 0x8E81, 0xD4EB, 0x566A, + 0xD4EC, 0x9020, 0xD4ED, 0x7682, 0xD4EE, 0x7076, 0xD4EF, 0x71E5, 0xD4F0, 0x8D23, 0xD4F1, 0x62E9, 0xD4F2, 0x5219, 0xD4F3, 0x6CFD, + 0xD4F4, 0x8D3C, 0xD4F5, 0x600E, 0xD4F6, 0x589E, 0xD4F7, 0x618E, 0xD4F8, 0x66FE, 0xD4F9, 0x8D60, 0xD4FA, 0x624E, 0xD4FB, 0x55B3, + 0xD4FC, 0x6E23, 0xD4FD, 0x672D, 0xD4FE, 0x8F67, 0xD540, 0x8A81, 0xD541, 0x8A82, 0xD542, 0x8A83, 0xD543, 0x8A84, 0xD544, 0x8A85, + 0xD545, 0x8A86, 0xD546, 0x8A87, 0xD547, 0x8A88, 0xD548, 0x8A8B, 0xD549, 0x8A8C, 0xD54A, 0x8A8D, 0xD54B, 0x8A8E, 0xD54C, 0x8A8F, + 0xD54D, 0x8A90, 0xD54E, 0x8A91, 0xD54F, 0x8A92, 0xD550, 0x8A94, 0xD551, 0x8A95, 0xD552, 0x8A96, 0xD553, 0x8A97, 0xD554, 0x8A98, + 0xD555, 0x8A99, 0xD556, 0x8A9A, 0xD557, 0x8A9B, 0xD558, 0x8A9C, 0xD559, 0x8A9D, 0xD55A, 0x8A9E, 0xD55B, 0x8A9F, 0xD55C, 0x8AA0, + 0xD55D, 0x8AA1, 0xD55E, 0x8AA2, 0xD55F, 0x8AA3, 0xD560, 0x8AA4, 0xD561, 0x8AA5, 0xD562, 0x8AA6, 0xD563, 0x8AA7, 0xD564, 0x8AA8, + 0xD565, 0x8AA9, 0xD566, 0x8AAA, 0xD567, 0x8AAB, 0xD568, 0x8AAC, 0xD569, 0x8AAD, 0xD56A, 0x8AAE, 0xD56B, 0x8AAF, 0xD56C, 0x8AB0, + 0xD56D, 0x8AB1, 0xD56E, 0x8AB2, 0xD56F, 0x8AB3, 0xD570, 0x8AB4, 0xD571, 0x8AB5, 0xD572, 0x8AB6, 0xD573, 0x8AB7, 0xD574, 0x8AB8, + 0xD575, 0x8AB9, 0xD576, 0x8ABA, 0xD577, 0x8ABB, 0xD578, 0x8ABC, 0xD579, 0x8ABD, 0xD57A, 0x8ABE, 0xD57B, 0x8ABF, 0xD57C, 0x8AC0, + 0xD57D, 0x8AC1, 0xD57E, 0x8AC2, 0xD580, 0x8AC3, 0xD581, 0x8AC4, 0xD582, 0x8AC5, 0xD583, 0x8AC6, 0xD584, 0x8AC7, 0xD585, 0x8AC8, + 0xD586, 0x8AC9, 0xD587, 0x8ACA, 0xD588, 0x8ACB, 0xD589, 0x8ACC, 0xD58A, 0x8ACD, 0xD58B, 0x8ACE, 0xD58C, 0x8ACF, 0xD58D, 0x8AD0, + 0xD58E, 0x8AD1, 0xD58F, 0x8AD2, 0xD590, 0x8AD3, 0xD591, 0x8AD4, 0xD592, 0x8AD5, 0xD593, 0x8AD6, 0xD594, 0x8AD7, 0xD595, 0x8AD8, + 0xD596, 0x8AD9, 0xD597, 0x8ADA, 0xD598, 0x8ADB, 0xD599, 0x8ADC, 0xD59A, 0x8ADD, 0xD59B, 0x8ADE, 0xD59C, 0x8ADF, 0xD59D, 0x8AE0, + 0xD59E, 0x8AE1, 0xD59F, 0x8AE2, 0xD5A0, 0x8AE3, 0xD5A1, 0x94E1, 0xD5A2, 0x95F8, 0xD5A3, 0x7728, 0xD5A4, 0x6805, 0xD5A5, 0x69A8, + 0xD5A6, 0x548B, 0xD5A7, 0x4E4D, 0xD5A8, 0x70B8, 0xD5A9, 0x8BC8, 0xD5AA, 0x6458, 0xD5AB, 0x658B, 0xD5AC, 0x5B85, 0xD5AD, 0x7A84, + 0xD5AE, 0x503A, 0xD5AF, 0x5BE8, 0xD5B0, 0x77BB, 0xD5B1, 0x6BE1, 0xD5B2, 0x8A79, 0xD5B3, 0x7C98, 0xD5B4, 0x6CBE, 0xD5B5, 0x76CF, + 0xD5B6, 0x65A9, 0xD5B7, 0x8F97, 0xD5B8, 0x5D2D, 0xD5B9, 0x5C55, 0xD5BA, 0x8638, 0xD5BB, 0x6808, 0xD5BC, 0x5360, 0xD5BD, 0x6218, + 0xD5BE, 0x7AD9, 0xD5BF, 0x6E5B, 0xD5C0, 0x7EFD, 0xD5C1, 0x6A1F, 0xD5C2, 0x7AE0, 0xD5C3, 0x5F70, 0xD5C4, 0x6F33, 0xD5C5, 0x5F20, + 0xD5C6, 0x638C, 0xD5C7, 0x6DA8, 0xD5C8, 0x6756, 0xD5C9, 0x4E08, 0xD5CA, 0x5E10, 0xD5CB, 0x8D26, 0xD5CC, 0x4ED7, 0xD5CD, 0x80C0, + 0xD5CE, 0x7634, 0xD5CF, 0x969C, 0xD5D0, 0x62DB, 0xD5D1, 0x662D, 0xD5D2, 0x627E, 0xD5D3, 0x6CBC, 0xD5D4, 0x8D75, 0xD5D5, 0x7167, + 0xD5D6, 0x7F69, 0xD5D7, 0x5146, 0xD5D8, 0x8087, 0xD5D9, 0x53EC, 0xD5DA, 0x906E, 0xD5DB, 0x6298, 0xD5DC, 0x54F2, 0xD5DD, 0x86F0, + 0xD5DE, 0x8F99, 0xD5DF, 0x8005, 0xD5E0, 0x9517, 0xD5E1, 0x8517, 0xD5E2, 0x8FD9, 0xD5E3, 0x6D59, 0xD5E4, 0x73CD, 0xD5E5, 0x659F, + 0xD5E6, 0x771F, 0xD5E7, 0x7504, 0xD5E8, 0x7827, 0xD5E9, 0x81FB, 0xD5EA, 0x8D1E, 0xD5EB, 0x9488, 0xD5EC, 0x4FA6, 0xD5ED, 0x6795, + 0xD5EE, 0x75B9, 0xD5EF, 0x8BCA, 0xD5F0, 0x9707, 0xD5F1, 0x632F, 0xD5F2, 0x9547, 0xD5F3, 0x9635, 0xD5F4, 0x84B8, 0xD5F5, 0x6323, + 0xD5F6, 0x7741, 0xD5F7, 0x5F81, 0xD5F8, 0x72F0, 0xD5F9, 0x4E89, 0xD5FA, 0x6014, 0xD5FB, 0x6574, 0xD5FC, 0x62EF, 0xD5FD, 0x6B63, + 0xD5FE, 0x653F, 0xD640, 0x8AE4, 0xD641, 0x8AE5, 0xD642, 0x8AE6, 0xD643, 0x8AE7, 0xD644, 0x8AE8, 0xD645, 0x8AE9, 0xD646, 0x8AEA, + 0xD647, 0x8AEB, 0xD648, 0x8AEC, 0xD649, 0x8AED, 0xD64A, 0x8AEE, 0xD64B, 0x8AEF, 0xD64C, 0x8AF0, 0xD64D, 0x8AF1, 0xD64E, 0x8AF2, + 0xD64F, 0x8AF3, 0xD650, 0x8AF4, 0xD651, 0x8AF5, 0xD652, 0x8AF6, 0xD653, 0x8AF7, 0xD654, 0x8AF8, 0xD655, 0x8AF9, 0xD656, 0x8AFA, + 0xD657, 0x8AFB, 0xD658, 0x8AFC, 0xD659, 0x8AFD, 0xD65A, 0x8AFE, 0xD65B, 0x8AFF, 0xD65C, 0x8B00, 0xD65D, 0x8B01, 0xD65E, 0x8B02, + 0xD65F, 0x8B03, 0xD660, 0x8B04, 0xD661, 0x8B05, 0xD662, 0x8B06, 0xD663, 0x8B08, 0xD664, 0x8B09, 0xD665, 0x8B0A, 0xD666, 0x8B0B, + 0xD667, 0x8B0C, 0xD668, 0x8B0D, 0xD669, 0x8B0E, 0xD66A, 0x8B0F, 0xD66B, 0x8B10, 0xD66C, 0x8B11, 0xD66D, 0x8B12, 0xD66E, 0x8B13, + 0xD66F, 0x8B14, 0xD670, 0x8B15, 0xD671, 0x8B16, 0xD672, 0x8B17, 0xD673, 0x8B18, 0xD674, 0x8B19, 0xD675, 0x8B1A, 0xD676, 0x8B1B, + 0xD677, 0x8B1C, 0xD678, 0x8B1D, 0xD679, 0x8B1E, 0xD67A, 0x8B1F, 0xD67B, 0x8B20, 0xD67C, 0x8B21, 0xD67D, 0x8B22, 0xD67E, 0x8B23, + 0xD680, 0x8B24, 0xD681, 0x8B25, 0xD682, 0x8B27, 0xD683, 0x8B28, 0xD684, 0x8B29, 0xD685, 0x8B2A, 0xD686, 0x8B2B, 0xD687, 0x8B2C, + 0xD688, 0x8B2D, 0xD689, 0x8B2E, 0xD68A, 0x8B2F, 0xD68B, 0x8B30, 0xD68C, 0x8B31, 0xD68D, 0x8B32, 0xD68E, 0x8B33, 0xD68F, 0x8B34, + 0xD690, 0x8B35, 0xD691, 0x8B36, 0xD692, 0x8B37, 0xD693, 0x8B38, 0xD694, 0x8B39, 0xD695, 0x8B3A, 0xD696, 0x8B3B, 0xD697, 0x8B3C, + 0xD698, 0x8B3D, 0xD699, 0x8B3E, 0xD69A, 0x8B3F, 0xD69B, 0x8B40, 0xD69C, 0x8B41, 0xD69D, 0x8B42, 0xD69E, 0x8B43, 0xD69F, 0x8B44, + 0xD6A0, 0x8B45, 0xD6A1, 0x5E27, 0xD6A2, 0x75C7, 0xD6A3, 0x90D1, 0xD6A4, 0x8BC1, 0xD6A5, 0x829D, 0xD6A6, 0x679D, 0xD6A7, 0x652F, + 0xD6A8, 0x5431, 0xD6A9, 0x8718, 0xD6AA, 0x77E5, 0xD6AB, 0x80A2, 0xD6AC, 0x8102, 0xD6AD, 0x6C41, 0xD6AE, 0x4E4B, 0xD6AF, 0x7EC7, + 0xD6B0, 0x804C, 0xD6B1, 0x76F4, 0xD6B2, 0x690D, 0xD6B3, 0x6B96, 0xD6B4, 0x6267, 0xD6B5, 0x503C, 0xD6B6, 0x4F84, 0xD6B7, 0x5740, + 0xD6B8, 0x6307, 0xD6B9, 0x6B62, 0xD6BA, 0x8DBE, 0xD6BB, 0x53EA, 0xD6BC, 0x65E8, 0xD6BD, 0x7EB8, 0xD6BE, 0x5FD7, 0xD6BF, 0x631A, + 0xD6C0, 0x63B7, 0xD6C1, 0x81F3, 0xD6C2, 0x81F4, 0xD6C3, 0x7F6E, 0xD6C4, 0x5E1C, 0xD6C5, 0x5CD9, 0xD6C6, 0x5236, 0xD6C7, 0x667A, + 0xD6C8, 0x79E9, 0xD6C9, 0x7A1A, 0xD6CA, 0x8D28, 0xD6CB, 0x7099, 0xD6CC, 0x75D4, 0xD6CD, 0x6EDE, 0xD6CE, 0x6CBB, 0xD6CF, 0x7A92, + 0xD6D0, 0x4E2D, 0xD6D1, 0x76C5, 0xD6D2, 0x5FE0, 0xD6D3, 0x949F, 0xD6D4, 0x8877, 0xD6D5, 0x7EC8, 0xD6D6, 0x79CD, 0xD6D7, 0x80BF, + 0xD6D8, 0x91CD, 0xD6D9, 0x4EF2, 0xD6DA, 0x4F17, 0xD6DB, 0x821F, 0xD6DC, 0x5468, 0xD6DD, 0x5DDE, 0xD6DE, 0x6D32, 0xD6DF, 0x8BCC, + 0xD6E0, 0x7CA5, 0xD6E1, 0x8F74, 0xD6E2, 0x8098, 0xD6E3, 0x5E1A, 0xD6E4, 0x5492, 0xD6E5, 0x76B1, 0xD6E6, 0x5B99, 0xD6E7, 0x663C, + 0xD6E8, 0x9AA4, 0xD6E9, 0x73E0, 0xD6EA, 0x682A, 0xD6EB, 0x86DB, 0xD6EC, 0x6731, 0xD6ED, 0x732A, 0xD6EE, 0x8BF8, 0xD6EF, 0x8BDB, + 0xD6F0, 0x9010, 0xD6F1, 0x7AF9, 0xD6F2, 0x70DB, 0xD6F3, 0x716E, 0xD6F4, 0x62C4, 0xD6F5, 0x77A9, 0xD6F6, 0x5631, 0xD6F7, 0x4E3B, + 0xD6F8, 0x8457, 0xD6F9, 0x67F1, 0xD6FA, 0x52A9, 0xD6FB, 0x86C0, 0xD6FC, 0x8D2E, 0xD6FD, 0x94F8, 0xD6FE, 0x7B51, 0xD740, 0x8B46, + 0xD741, 0x8B47, 0xD742, 0x8B48, 0xD743, 0x8B49, 0xD744, 0x8B4A, 0xD745, 0x8B4B, 0xD746, 0x8B4C, 0xD747, 0x8B4D, 0xD748, 0x8B4E, + 0xD749, 0x8B4F, 0xD74A, 0x8B50, 0xD74B, 0x8B51, 0xD74C, 0x8B52, 0xD74D, 0x8B53, 0xD74E, 0x8B54, 0xD74F, 0x8B55, 0xD750, 0x8B56, + 0xD751, 0x8B57, 0xD752, 0x8B58, 0xD753, 0x8B59, 0xD754, 0x8B5A, 0xD755, 0x8B5B, 0xD756, 0x8B5C, 0xD757, 0x8B5D, 0xD758, 0x8B5E, + 0xD759, 0x8B5F, 0xD75A, 0x8B60, 0xD75B, 0x8B61, 0xD75C, 0x8B62, 0xD75D, 0x8B63, 0xD75E, 0x8B64, 0xD75F, 0x8B65, 0xD760, 0x8B67, + 0xD761, 0x8B68, 0xD762, 0x8B69, 0xD763, 0x8B6A, 0xD764, 0x8B6B, 0xD765, 0x8B6D, 0xD766, 0x8B6E, 0xD767, 0x8B6F, 0xD768, 0x8B70, + 0xD769, 0x8B71, 0xD76A, 0x8B72, 0xD76B, 0x8B73, 0xD76C, 0x8B74, 0xD76D, 0x8B75, 0xD76E, 0x8B76, 0xD76F, 0x8B77, 0xD770, 0x8B78, + 0xD771, 0x8B79, 0xD772, 0x8B7A, 0xD773, 0x8B7B, 0xD774, 0x8B7C, 0xD775, 0x8B7D, 0xD776, 0x8B7E, 0xD777, 0x8B7F, 0xD778, 0x8B80, + 0xD779, 0x8B81, 0xD77A, 0x8B82, 0xD77B, 0x8B83, 0xD77C, 0x8B84, 0xD77D, 0x8B85, 0xD77E, 0x8B86, 0xD780, 0x8B87, 0xD781, 0x8B88, + 0xD782, 0x8B89, 0xD783, 0x8B8A, 0xD784, 0x8B8B, 0xD785, 0x8B8C, 0xD786, 0x8B8D, 0xD787, 0x8B8E, 0xD788, 0x8B8F, 0xD789, 0x8B90, + 0xD78A, 0x8B91, 0xD78B, 0x8B92, 0xD78C, 0x8B93, 0xD78D, 0x8B94, 0xD78E, 0x8B95, 0xD78F, 0x8B96, 0xD790, 0x8B97, 0xD791, 0x8B98, + 0xD792, 0x8B99, 0xD793, 0x8B9A, 0xD794, 0x8B9B, 0xD795, 0x8B9C, 0xD796, 0x8B9D, 0xD797, 0x8B9E, 0xD798, 0x8B9F, 0xD799, 0x8BAC, + 0xD79A, 0x8BB1, 0xD79B, 0x8BBB, 0xD79C, 0x8BC7, 0xD79D, 0x8BD0, 0xD79E, 0x8BEA, 0xD79F, 0x8C09, 0xD7A0, 0x8C1E, 0xD7A1, 0x4F4F, + 0xD7A2, 0x6CE8, 0xD7A3, 0x795D, 0xD7A4, 0x9A7B, 0xD7A5, 0x6293, 0xD7A6, 0x722A, 0xD7A7, 0x62FD, 0xD7A8, 0x4E13, 0xD7A9, 0x7816, + 0xD7AA, 0x8F6C, 0xD7AB, 0x64B0, 0xD7AC, 0x8D5A, 0xD7AD, 0x7BC6, 0xD7AE, 0x6869, 0xD7AF, 0x5E84, 0xD7B0, 0x88C5, 0xD7B1, 0x5986, + 0xD7B2, 0x649E, 0xD7B3, 0x58EE, 0xD7B4, 0x72B6, 0xD7B5, 0x690E, 0xD7B6, 0x9525, 0xD7B7, 0x8FFD, 0xD7B8, 0x8D58, 0xD7B9, 0x5760, + 0xD7BA, 0x7F00, 0xD7BB, 0x8C06, 0xD7BC, 0x51C6, 0xD7BD, 0x6349, 0xD7BE, 0x62D9, 0xD7BF, 0x5353, 0xD7C0, 0x684C, 0xD7C1, 0x7422, + 0xD7C2, 0x8301, 0xD7C3, 0x914C, 0xD7C4, 0x5544, 0xD7C5, 0x7740, 0xD7C6, 0x707C, 0xD7C7, 0x6D4A, 0xD7C8, 0x5179, 0xD7C9, 0x54A8, + 0xD7CA, 0x8D44, 0xD7CB, 0x59FF, 0xD7CC, 0x6ECB, 0xD7CD, 0x6DC4, 0xD7CE, 0x5B5C, 0xD7CF, 0x7D2B, 0xD7D0, 0x4ED4, 0xD7D1, 0x7C7D, + 0xD7D2, 0x6ED3, 0xD7D3, 0x5B50, 0xD7D4, 0x81EA, 0xD7D5, 0x6E0D, 0xD7D6, 0x5B57, 0xD7D7, 0x9B03, 0xD7D8, 0x68D5, 0xD7D9, 0x8E2A, + 0xD7DA, 0x5B97, 0xD7DB, 0x7EFC, 0xD7DC, 0x603B, 0xD7DD, 0x7EB5, 0xD7DE, 0x90B9, 0xD7DF, 0x8D70, 0xD7E0, 0x594F, 0xD7E1, 0x63CD, + 0xD7E2, 0x79DF, 0xD7E3, 0x8DB3, 0xD7E4, 0x5352, 0xD7E5, 0x65CF, 0xD7E6, 0x7956, 0xD7E7, 0x8BC5, 0xD7E8, 0x963B, 0xD7E9, 0x7EC4, + 0xD7EA, 0x94BB, 0xD7EB, 0x7E82, 0xD7EC, 0x5634, 0xD7ED, 0x9189, 0xD7EE, 0x6700, 0xD7EF, 0x7F6A, 0xD7F0, 0x5C0A, 0xD7F1, 0x9075, + 0xD7F2, 0x6628, 0xD7F3, 0x5DE6, 0xD7F4, 0x4F50, 0xD7F5, 0x67DE, 0xD7F6, 0x505A, 0xD7F7, 0x4F5C, 0xD7F8, 0x5750, 0xD7F9, 0x5EA7, + 0xD840, 0x8C38, 0xD841, 0x8C39, 0xD842, 0x8C3A, 0xD843, 0x8C3B, 0xD844, 0x8C3C, 0xD845, 0x8C3D, 0xD846, 0x8C3E, 0xD847, 0x8C3F, + 0xD848, 0x8C40, 0xD849, 0x8C42, 0xD84A, 0x8C43, 0xD84B, 0x8C44, 0xD84C, 0x8C45, 0xD84D, 0x8C48, 0xD84E, 0x8C4A, 0xD84F, 0x8C4B, + 0xD850, 0x8C4D, 0xD851, 0x8C4E, 0xD852, 0x8C4F, 0xD853, 0x8C50, 0xD854, 0x8C51, 0xD855, 0x8C52, 0xD856, 0x8C53, 0xD857, 0x8C54, + 0xD858, 0x8C56, 0xD859, 0x8C57, 0xD85A, 0x8C58, 0xD85B, 0x8C59, 0xD85C, 0x8C5B, 0xD85D, 0x8C5C, 0xD85E, 0x8C5D, 0xD85F, 0x8C5E, + 0xD860, 0x8C5F, 0xD861, 0x8C60, 0xD862, 0x8C63, 0xD863, 0x8C64, 0xD864, 0x8C65, 0xD865, 0x8C66, 0xD866, 0x8C67, 0xD867, 0x8C68, + 0xD868, 0x8C69, 0xD869, 0x8C6C, 0xD86A, 0x8C6D, 0xD86B, 0x8C6E, 0xD86C, 0x8C6F, 0xD86D, 0x8C70, 0xD86E, 0x8C71, 0xD86F, 0x8C72, + 0xD870, 0x8C74, 0xD871, 0x8C75, 0xD872, 0x8C76, 0xD873, 0x8C77, 0xD874, 0x8C7B, 0xD875, 0x8C7C, 0xD876, 0x8C7D, 0xD877, 0x8C7E, + 0xD878, 0x8C7F, 0xD879, 0x8C80, 0xD87A, 0x8C81, 0xD87B, 0x8C83, 0xD87C, 0x8C84, 0xD87D, 0x8C86, 0xD87E, 0x8C87, 0xD880, 0x8C88, + 0xD881, 0x8C8B, 0xD882, 0x8C8D, 0xD883, 0x8C8E, 0xD884, 0x8C8F, 0xD885, 0x8C90, 0xD886, 0x8C91, 0xD887, 0x8C92, 0xD888, 0x8C93, + 0xD889, 0x8C95, 0xD88A, 0x8C96, 0xD88B, 0x8C97, 0xD88C, 0x8C99, 0xD88D, 0x8C9A, 0xD88E, 0x8C9B, 0xD88F, 0x8C9C, 0xD890, 0x8C9D, + 0xD891, 0x8C9E, 0xD892, 0x8C9F, 0xD893, 0x8CA0, 0xD894, 0x8CA1, 0xD895, 0x8CA2, 0xD896, 0x8CA3, 0xD897, 0x8CA4, 0xD898, 0x8CA5, + 0xD899, 0x8CA6, 0xD89A, 0x8CA7, 0xD89B, 0x8CA8, 0xD89C, 0x8CA9, 0xD89D, 0x8CAA, 0xD89E, 0x8CAB, 0xD89F, 0x8CAC, 0xD8A0, 0x8CAD, + 0xD8A1, 0x4E8D, 0xD8A2, 0x4E0C, 0xD8A3, 0x5140, 0xD8A4, 0x4E10, 0xD8A5, 0x5EFF, 0xD8A6, 0x5345, 0xD8A7, 0x4E15, 0xD8A8, 0x4E98, + 0xD8A9, 0x4E1E, 0xD8AA, 0x9B32, 0xD8AB, 0x5B6C, 0xD8AC, 0x5669, 0xD8AD, 0x4E28, 0xD8AE, 0x79BA, 0xD8AF, 0x4E3F, 0xD8B0, 0x5315, + 0xD8B1, 0x4E47, 0xD8B2, 0x592D, 0xD8B3, 0x723B, 0xD8B4, 0x536E, 0xD8B5, 0x6C10, 0xD8B6, 0x56DF, 0xD8B7, 0x80E4, 0xD8B8, 0x9997, + 0xD8B9, 0x6BD3, 0xD8BA, 0x777E, 0xD8BB, 0x9F17, 0xD8BC, 0x4E36, 0xD8BD, 0x4E9F, 0xD8BE, 0x9F10, 0xD8BF, 0x4E5C, 0xD8C0, 0x4E69, + 0xD8C1, 0x4E93, 0xD8C2, 0x8288, 0xD8C3, 0x5B5B, 0xD8C4, 0x556C, 0xD8C5, 0x560F, 0xD8C6, 0x4EC4, 0xD8C7, 0x538D, 0xD8C8, 0x539D, + 0xD8C9, 0x53A3, 0xD8CA, 0x53A5, 0xD8CB, 0x53AE, 0xD8CC, 0x9765, 0xD8CD, 0x8D5D, 0xD8CE, 0x531A, 0xD8CF, 0x53F5, 0xD8D0, 0x5326, + 0xD8D1, 0x532E, 0xD8D2, 0x533E, 0xD8D3, 0x8D5C, 0xD8D4, 0x5366, 0xD8D5, 0x5363, 0xD8D6, 0x5202, 0xD8D7, 0x5208, 0xD8D8, 0x520E, + 0xD8D9, 0x522D, 0xD8DA, 0x5233, 0xD8DB, 0x523F, 0xD8DC, 0x5240, 0xD8DD, 0x524C, 0xD8DE, 0x525E, 0xD8DF, 0x5261, 0xD8E0, 0x525C, + 0xD8E1, 0x84AF, 0xD8E2, 0x527D, 0xD8E3, 0x5282, 0xD8E4, 0x5281, 0xD8E5, 0x5290, 0xD8E6, 0x5293, 0xD8E7, 0x5182, 0xD8E8, 0x7F54, + 0xD8E9, 0x4EBB, 0xD8EA, 0x4EC3, 0xD8EB, 0x4EC9, 0xD8EC, 0x4EC2, 0xD8ED, 0x4EE8, 0xD8EE, 0x4EE1, 0xD8EF, 0x4EEB, 0xD8F0, 0x4EDE, + 0xD8F1, 0x4F1B, 0xD8F2, 0x4EF3, 0xD8F3, 0x4F22, 0xD8F4, 0x4F64, 0xD8F5, 0x4EF5, 0xD8F6, 0x4F25, 0xD8F7, 0x4F27, 0xD8F8, 0x4F09, + 0xD8F9, 0x4F2B, 0xD8FA, 0x4F5E, 0xD8FB, 0x4F67, 0xD8FC, 0x6538, 0xD8FD, 0x4F5A, 0xD8FE, 0x4F5D, 0xD940, 0x8CAE, 0xD941, 0x8CAF, + 0xD942, 0x8CB0, 0xD943, 0x8CB1, 0xD944, 0x8CB2, 0xD945, 0x8CB3, 0xD946, 0x8CB4, 0xD947, 0x8CB5, 0xD948, 0x8CB6, 0xD949, 0x8CB7, + 0xD94A, 0x8CB8, 0xD94B, 0x8CB9, 0xD94C, 0x8CBA, 0xD94D, 0x8CBB, 0xD94E, 0x8CBC, 0xD94F, 0x8CBD, 0xD950, 0x8CBE, 0xD951, 0x8CBF, + 0xD952, 0x8CC0, 0xD953, 0x8CC1, 0xD954, 0x8CC2, 0xD955, 0x8CC3, 0xD956, 0x8CC4, 0xD957, 0x8CC5, 0xD958, 0x8CC6, 0xD959, 0x8CC7, + 0xD95A, 0x8CC8, 0xD95B, 0x8CC9, 0xD95C, 0x8CCA, 0xD95D, 0x8CCB, 0xD95E, 0x8CCC, 0xD95F, 0x8CCD, 0xD960, 0x8CCE, 0xD961, 0x8CCF, + 0xD962, 0x8CD0, 0xD963, 0x8CD1, 0xD964, 0x8CD2, 0xD965, 0x8CD3, 0xD966, 0x8CD4, 0xD967, 0x8CD5, 0xD968, 0x8CD6, 0xD969, 0x8CD7, + 0xD96A, 0x8CD8, 0xD96B, 0x8CD9, 0xD96C, 0x8CDA, 0xD96D, 0x8CDB, 0xD96E, 0x8CDC, 0xD96F, 0x8CDD, 0xD970, 0x8CDE, 0xD971, 0x8CDF, + 0xD972, 0x8CE0, 0xD973, 0x8CE1, 0xD974, 0x8CE2, 0xD975, 0x8CE3, 0xD976, 0x8CE4, 0xD977, 0x8CE5, 0xD978, 0x8CE6, 0xD979, 0x8CE7, + 0xD97A, 0x8CE8, 0xD97B, 0x8CE9, 0xD97C, 0x8CEA, 0xD97D, 0x8CEB, 0xD97E, 0x8CEC, 0xD980, 0x8CED, 0xD981, 0x8CEE, 0xD982, 0x8CEF, + 0xD983, 0x8CF0, 0xD984, 0x8CF1, 0xD985, 0x8CF2, 0xD986, 0x8CF3, 0xD987, 0x8CF4, 0xD988, 0x8CF5, 0xD989, 0x8CF6, 0xD98A, 0x8CF7, + 0xD98B, 0x8CF8, 0xD98C, 0x8CF9, 0xD98D, 0x8CFA, 0xD98E, 0x8CFB, 0xD98F, 0x8CFC, 0xD990, 0x8CFD, 0xD991, 0x8CFE, 0xD992, 0x8CFF, + 0xD993, 0x8D00, 0xD994, 0x8D01, 0xD995, 0x8D02, 0xD996, 0x8D03, 0xD997, 0x8D04, 0xD998, 0x8D05, 0xD999, 0x8D06, 0xD99A, 0x8D07, + 0xD99B, 0x8D08, 0xD99C, 0x8D09, 0xD99D, 0x8D0A, 0xD99E, 0x8D0B, 0xD99F, 0x8D0C, 0xD9A0, 0x8D0D, 0xD9A1, 0x4F5F, 0xD9A2, 0x4F57, + 0xD9A3, 0x4F32, 0xD9A4, 0x4F3D, 0xD9A5, 0x4F76, 0xD9A6, 0x4F74, 0xD9A7, 0x4F91, 0xD9A8, 0x4F89, 0xD9A9, 0x4F83, 0xD9AA, 0x4F8F, + 0xD9AB, 0x4F7E, 0xD9AC, 0x4F7B, 0xD9AD, 0x4FAA, 0xD9AE, 0x4F7C, 0xD9AF, 0x4FAC, 0xD9B0, 0x4F94, 0xD9B1, 0x4FE6, 0xD9B2, 0x4FE8, + 0xD9B3, 0x4FEA, 0xD9B4, 0x4FC5, 0xD9B5, 0x4FDA, 0xD9B6, 0x4FE3, 0xD9B7, 0x4FDC, 0xD9B8, 0x4FD1, 0xD9B9, 0x4FDF, 0xD9BA, 0x4FF8, + 0xD9BB, 0x5029, 0xD9BC, 0x504C, 0xD9BD, 0x4FF3, 0xD9BE, 0x502C, 0xD9BF, 0x500F, 0xD9C0, 0x502E, 0xD9C1, 0x502D, 0xD9C2, 0x4FFE, + 0xD9C3, 0x501C, 0xD9C4, 0x500C, 0xD9C5, 0x5025, 0xD9C6, 0x5028, 0xD9C7, 0x507E, 0xD9C8, 0x5043, 0xD9C9, 0x5055, 0xD9CA, 0x5048, + 0xD9CB, 0x504E, 0xD9CC, 0x506C, 0xD9CD, 0x507B, 0xD9CE, 0x50A5, 0xD9CF, 0x50A7, 0xD9D0, 0x50A9, 0xD9D1, 0x50BA, 0xD9D2, 0x50D6, + 0xD9D3, 0x5106, 0xD9D4, 0x50ED, 0xD9D5, 0x50EC, 0xD9D6, 0x50E6, 0xD9D7, 0x50EE, 0xD9D8, 0x5107, 0xD9D9, 0x510B, 0xD9DA, 0x4EDD, + 0xD9DB, 0x6C3D, 0xD9DC, 0x4F58, 0xD9DD, 0x4F65, 0xD9DE, 0x4FCE, 0xD9DF, 0x9FA0, 0xD9E0, 0x6C46, 0xD9E1, 0x7C74, 0xD9E2, 0x516E, + 0xD9E3, 0x5DFD, 0xD9E4, 0x9EC9, 0xD9E5, 0x9998, 0xD9E6, 0x5181, 0xD9E7, 0x5914, 0xD9E8, 0x52F9, 0xD9E9, 0x530D, 0xD9EA, 0x8A07, + 0xD9EB, 0x5310, 0xD9EC, 0x51EB, 0xD9ED, 0x5919, 0xD9EE, 0x5155, 0xD9EF, 0x4EA0, 0xD9F0, 0x5156, 0xD9F1, 0x4EB3, 0xD9F2, 0x886E, + 0xD9F3, 0x88A4, 0xD9F4, 0x4EB5, 0xD9F5, 0x8114, 0xD9F6, 0x88D2, 0xD9F7, 0x7980, 0xD9F8, 0x5B34, 0xD9F9, 0x8803, 0xD9FA, 0x7FB8, + 0xD9FB, 0x51AB, 0xD9FC, 0x51B1, 0xD9FD, 0x51BD, 0xD9FE, 0x51BC, 0xDA40, 0x8D0E, 0xDA41, 0x8D0F, 0xDA42, 0x8D10, 0xDA43, 0x8D11, + 0xDA44, 0x8D12, 0xDA45, 0x8D13, 0xDA46, 0x8D14, 0xDA47, 0x8D15, 0xDA48, 0x8D16, 0xDA49, 0x8D17, 0xDA4A, 0x8D18, 0xDA4B, 0x8D19, + 0xDA4C, 0x8D1A, 0xDA4D, 0x8D1B, 0xDA4E, 0x8D1C, 0xDA4F, 0x8D20, 0xDA50, 0x8D51, 0xDA51, 0x8D52, 0xDA52, 0x8D57, 0xDA53, 0x8D5F, + 0xDA54, 0x8D65, 0xDA55, 0x8D68, 0xDA56, 0x8D69, 0xDA57, 0x8D6A, 0xDA58, 0x8D6C, 0xDA59, 0x8D6E, 0xDA5A, 0x8D6F, 0xDA5B, 0x8D71, + 0xDA5C, 0x8D72, 0xDA5D, 0x8D78, 0xDA5E, 0x8D79, 0xDA5F, 0x8D7A, 0xDA60, 0x8D7B, 0xDA61, 0x8D7C, 0xDA62, 0x8D7D, 0xDA63, 0x8D7E, + 0xDA64, 0x8D7F, 0xDA65, 0x8D80, 0xDA66, 0x8D82, 0xDA67, 0x8D83, 0xDA68, 0x8D86, 0xDA69, 0x8D87, 0xDA6A, 0x8D88, 0xDA6B, 0x8D89, + 0xDA6C, 0x8D8C, 0xDA6D, 0x8D8D, 0xDA6E, 0x8D8E, 0xDA6F, 0x8D8F, 0xDA70, 0x8D90, 0xDA71, 0x8D92, 0xDA72, 0x8D93, 0xDA73, 0x8D95, + 0xDA74, 0x8D96, 0xDA75, 0x8D97, 0xDA76, 0x8D98, 0xDA77, 0x8D99, 0xDA78, 0x8D9A, 0xDA79, 0x8D9B, 0xDA7A, 0x8D9C, 0xDA7B, 0x8D9D, + 0xDA7C, 0x8D9E, 0xDA7D, 0x8DA0, 0xDA7E, 0x8DA1, 0xDA80, 0x8DA2, 0xDA81, 0x8DA4, 0xDA82, 0x8DA5, 0xDA83, 0x8DA6, 0xDA84, 0x8DA7, + 0xDA85, 0x8DA8, 0xDA86, 0x8DA9, 0xDA87, 0x8DAA, 0xDA88, 0x8DAB, 0xDA89, 0x8DAC, 0xDA8A, 0x8DAD, 0xDA8B, 0x8DAE, 0xDA8C, 0x8DAF, + 0xDA8D, 0x8DB0, 0xDA8E, 0x8DB2, 0xDA8F, 0x8DB6, 0xDA90, 0x8DB7, 0xDA91, 0x8DB9, 0xDA92, 0x8DBB, 0xDA93, 0x8DBD, 0xDA94, 0x8DC0, + 0xDA95, 0x8DC1, 0xDA96, 0x8DC2, 0xDA97, 0x8DC5, 0xDA98, 0x8DC7, 0xDA99, 0x8DC8, 0xDA9A, 0x8DC9, 0xDA9B, 0x8DCA, 0xDA9C, 0x8DCD, + 0xDA9D, 0x8DD0, 0xDA9E, 0x8DD2, 0xDA9F, 0x8DD3, 0xDAA0, 0x8DD4, 0xDAA1, 0x51C7, 0xDAA2, 0x5196, 0xDAA3, 0x51A2, 0xDAA4, 0x51A5, + 0xDAA5, 0x8BA0, 0xDAA6, 0x8BA6, 0xDAA7, 0x8BA7, 0xDAA8, 0x8BAA, 0xDAA9, 0x8BB4, 0xDAAA, 0x8BB5, 0xDAAB, 0x8BB7, 0xDAAC, 0x8BC2, + 0xDAAD, 0x8BC3, 0xDAAE, 0x8BCB, 0xDAAF, 0x8BCF, 0xDAB0, 0x8BCE, 0xDAB1, 0x8BD2, 0xDAB2, 0x8BD3, 0xDAB3, 0x8BD4, 0xDAB4, 0x8BD6, + 0xDAB5, 0x8BD8, 0xDAB6, 0x8BD9, 0xDAB7, 0x8BDC, 0xDAB8, 0x8BDF, 0xDAB9, 0x8BE0, 0xDABA, 0x8BE4, 0xDABB, 0x8BE8, 0xDABC, 0x8BE9, + 0xDABD, 0x8BEE, 0xDABE, 0x8BF0, 0xDABF, 0x8BF3, 0xDAC0, 0x8BF6, 0xDAC1, 0x8BF9, 0xDAC2, 0x8BFC, 0xDAC3, 0x8BFF, 0xDAC4, 0x8C00, + 0xDAC5, 0x8C02, 0xDAC6, 0x8C04, 0xDAC7, 0x8C07, 0xDAC8, 0x8C0C, 0xDAC9, 0x8C0F, 0xDACA, 0x8C11, 0xDACB, 0x8C12, 0xDACC, 0x8C14, + 0xDACD, 0x8C15, 0xDACE, 0x8C16, 0xDACF, 0x8C19, 0xDAD0, 0x8C1B, 0xDAD1, 0x8C18, 0xDAD2, 0x8C1D, 0xDAD3, 0x8C1F, 0xDAD4, 0x8C20, + 0xDAD5, 0x8C21, 0xDAD6, 0x8C25, 0xDAD7, 0x8C27, 0xDAD8, 0x8C2A, 0xDAD9, 0x8C2B, 0xDADA, 0x8C2E, 0xDADB, 0x8C2F, 0xDADC, 0x8C32, + 0xDADD, 0x8C33, 0xDADE, 0x8C35, 0xDADF, 0x8C36, 0xDAE0, 0x5369, 0xDAE1, 0x537A, 0xDAE2, 0x961D, 0xDAE3, 0x9622, 0xDAE4, 0x9621, + 0xDAE5, 0x9631, 0xDAE6, 0x962A, 0xDAE7, 0x963D, 0xDAE8, 0x963C, 0xDAE9, 0x9642, 0xDAEA, 0x9649, 0xDAEB, 0x9654, 0xDAEC, 0x965F, + 0xDAED, 0x9667, 0xDAEE, 0x966C, 0xDAEF, 0x9672, 0xDAF0, 0x9674, 0xDAF1, 0x9688, 0xDAF2, 0x968D, 0xDAF3, 0x9697, 0xDAF4, 0x96B0, + 0xDAF5, 0x9097, 0xDAF6, 0x909B, 0xDAF7, 0x909D, 0xDAF8, 0x9099, 0xDAF9, 0x90AC, 0xDAFA, 0x90A1, 0xDAFB, 0x90B4, 0xDAFC, 0x90B3, + 0xDAFD, 0x90B6, 0xDAFE, 0x90BA, 0xDB40, 0x8DD5, 0xDB41, 0x8DD8, 0xDB42, 0x8DD9, 0xDB43, 0x8DDC, 0xDB44, 0x8DE0, 0xDB45, 0x8DE1, + 0xDB46, 0x8DE2, 0xDB47, 0x8DE5, 0xDB48, 0x8DE6, 0xDB49, 0x8DE7, 0xDB4A, 0x8DE9, 0xDB4B, 0x8DED, 0xDB4C, 0x8DEE, 0xDB4D, 0x8DF0, + 0xDB4E, 0x8DF1, 0xDB4F, 0x8DF2, 0xDB50, 0x8DF4, 0xDB51, 0x8DF6, 0xDB52, 0x8DFC, 0xDB53, 0x8DFE, 0xDB54, 0x8DFF, 0xDB55, 0x8E00, + 0xDB56, 0x8E01, 0xDB57, 0x8E02, 0xDB58, 0x8E03, 0xDB59, 0x8E04, 0xDB5A, 0x8E06, 0xDB5B, 0x8E07, 0xDB5C, 0x8E08, 0xDB5D, 0x8E0B, + 0xDB5E, 0x8E0D, 0xDB5F, 0x8E0E, 0xDB60, 0x8E10, 0xDB61, 0x8E11, 0xDB62, 0x8E12, 0xDB63, 0x8E13, 0xDB64, 0x8E15, 0xDB65, 0x8E16, + 0xDB66, 0x8E17, 0xDB67, 0x8E18, 0xDB68, 0x8E19, 0xDB69, 0x8E1A, 0xDB6A, 0x8E1B, 0xDB6B, 0x8E1C, 0xDB6C, 0x8E20, 0xDB6D, 0x8E21, + 0xDB6E, 0x8E24, 0xDB6F, 0x8E25, 0xDB70, 0x8E26, 0xDB71, 0x8E27, 0xDB72, 0x8E28, 0xDB73, 0x8E2B, 0xDB74, 0x8E2D, 0xDB75, 0x8E30, + 0xDB76, 0x8E32, 0xDB77, 0x8E33, 0xDB78, 0x8E34, 0xDB79, 0x8E36, 0xDB7A, 0x8E37, 0xDB7B, 0x8E38, 0xDB7C, 0x8E3B, 0xDB7D, 0x8E3C, + 0xDB7E, 0x8E3E, 0xDB80, 0x8E3F, 0xDB81, 0x8E43, 0xDB82, 0x8E45, 0xDB83, 0x8E46, 0xDB84, 0x8E4C, 0xDB85, 0x8E4D, 0xDB86, 0x8E4E, + 0xDB87, 0x8E4F, 0xDB88, 0x8E50, 0xDB89, 0x8E53, 0xDB8A, 0x8E54, 0xDB8B, 0x8E55, 0xDB8C, 0x8E56, 0xDB8D, 0x8E57, 0xDB8E, 0x8E58, + 0xDB8F, 0x8E5A, 0xDB90, 0x8E5B, 0xDB91, 0x8E5C, 0xDB92, 0x8E5D, 0xDB93, 0x8E5E, 0xDB94, 0x8E5F, 0xDB95, 0x8E60, 0xDB96, 0x8E61, + 0xDB97, 0x8E62, 0xDB98, 0x8E63, 0xDB99, 0x8E64, 0xDB9A, 0x8E65, 0xDB9B, 0x8E67, 0xDB9C, 0x8E68, 0xDB9D, 0x8E6A, 0xDB9E, 0x8E6B, + 0xDB9F, 0x8E6E, 0xDBA0, 0x8E71, 0xDBA1, 0x90B8, 0xDBA2, 0x90B0, 0xDBA3, 0x90CF, 0xDBA4, 0x90C5, 0xDBA5, 0x90BE, 0xDBA6, 0x90D0, + 0xDBA7, 0x90C4, 0xDBA8, 0x90C7, 0xDBA9, 0x90D3, 0xDBAA, 0x90E6, 0xDBAB, 0x90E2, 0xDBAC, 0x90DC, 0xDBAD, 0x90D7, 0xDBAE, 0x90DB, + 0xDBAF, 0x90EB, 0xDBB0, 0x90EF, 0xDBB1, 0x90FE, 0xDBB2, 0x9104, 0xDBB3, 0x9122, 0xDBB4, 0x911E, 0xDBB5, 0x9123, 0xDBB6, 0x9131, + 0xDBB7, 0x912F, 0xDBB8, 0x9139, 0xDBB9, 0x9143, 0xDBBA, 0x9146, 0xDBBB, 0x520D, 0xDBBC, 0x5942, 0xDBBD, 0x52A2, 0xDBBE, 0x52AC, + 0xDBBF, 0x52AD, 0xDBC0, 0x52BE, 0xDBC1, 0x54FF, 0xDBC2, 0x52D0, 0xDBC3, 0x52D6, 0xDBC4, 0x52F0, 0xDBC5, 0x53DF, 0xDBC6, 0x71EE, + 0xDBC7, 0x77CD, 0xDBC8, 0x5EF4, 0xDBC9, 0x51F5, 0xDBCA, 0x51FC, 0xDBCB, 0x9B2F, 0xDBCC, 0x53B6, 0xDBCD, 0x5F01, 0xDBCE, 0x755A, + 0xDBCF, 0x5DEF, 0xDBD0, 0x574C, 0xDBD1, 0x57A9, 0xDBD2, 0x57A1, 0xDBD3, 0x587E, 0xDBD4, 0x58BC, 0xDBD5, 0x58C5, 0xDBD6, 0x58D1, + 0xDBD7, 0x5729, 0xDBD8, 0x572C, 0xDBD9, 0x572A, 0xDBDA, 0x5733, 0xDBDB, 0x5739, 0xDBDC, 0x572E, 0xDBDD, 0x572F, 0xDBDE, 0x575C, + 0xDBDF, 0x573B, 0xDBE0, 0x5742, 0xDBE1, 0x5769, 0xDBE2, 0x5785, 0xDBE3, 0x576B, 0xDBE4, 0x5786, 0xDBE5, 0x577C, 0xDBE6, 0x577B, + 0xDBE7, 0x5768, 0xDBE8, 0x576D, 0xDBE9, 0x5776, 0xDBEA, 0x5773, 0xDBEB, 0x57AD, 0xDBEC, 0x57A4, 0xDBED, 0x578C, 0xDBEE, 0x57B2, + 0xDBEF, 0x57CF, 0xDBF0, 0x57A7, 0xDBF1, 0x57B4, 0xDBF2, 0x5793, 0xDBF3, 0x57A0, 0xDBF4, 0x57D5, 0xDBF5, 0x57D8, 0xDBF6, 0x57DA, + 0xDBF7, 0x57D9, 0xDBF8, 0x57D2, 0xDBF9, 0x57B8, 0xDBFA, 0x57F4, 0xDBFB, 0x57EF, 0xDBFC, 0x57F8, 0xDBFD, 0x57E4, 0xDBFE, 0x57DD, + 0xDC40, 0x8E73, 0xDC41, 0x8E75, 0xDC42, 0x8E77, 0xDC43, 0x8E78, 0xDC44, 0x8E79, 0xDC45, 0x8E7A, 0xDC46, 0x8E7B, 0xDC47, 0x8E7D, + 0xDC48, 0x8E7E, 0xDC49, 0x8E80, 0xDC4A, 0x8E82, 0xDC4B, 0x8E83, 0xDC4C, 0x8E84, 0xDC4D, 0x8E86, 0xDC4E, 0x8E88, 0xDC4F, 0x8E89, + 0xDC50, 0x8E8A, 0xDC51, 0x8E8B, 0xDC52, 0x8E8C, 0xDC53, 0x8E8D, 0xDC54, 0x8E8E, 0xDC55, 0x8E91, 0xDC56, 0x8E92, 0xDC57, 0x8E93, + 0xDC58, 0x8E95, 0xDC59, 0x8E96, 0xDC5A, 0x8E97, 0xDC5B, 0x8E98, 0xDC5C, 0x8E99, 0xDC5D, 0x8E9A, 0xDC5E, 0x8E9B, 0xDC5F, 0x8E9D, + 0xDC60, 0x8E9F, 0xDC61, 0x8EA0, 0xDC62, 0x8EA1, 0xDC63, 0x8EA2, 0xDC64, 0x8EA3, 0xDC65, 0x8EA4, 0xDC66, 0x8EA5, 0xDC67, 0x8EA6, + 0xDC68, 0x8EA7, 0xDC69, 0x8EA8, 0xDC6A, 0x8EA9, 0xDC6B, 0x8EAA, 0xDC6C, 0x8EAD, 0xDC6D, 0x8EAE, 0xDC6E, 0x8EB0, 0xDC6F, 0x8EB1, + 0xDC70, 0x8EB3, 0xDC71, 0x8EB4, 0xDC72, 0x8EB5, 0xDC73, 0x8EB6, 0xDC74, 0x8EB7, 0xDC75, 0x8EB8, 0xDC76, 0x8EB9, 0xDC77, 0x8EBB, + 0xDC78, 0x8EBC, 0xDC79, 0x8EBD, 0xDC7A, 0x8EBE, 0xDC7B, 0x8EBF, 0xDC7C, 0x8EC0, 0xDC7D, 0x8EC1, 0xDC7E, 0x8EC2, 0xDC80, 0x8EC3, + 0xDC81, 0x8EC4, 0xDC82, 0x8EC5, 0xDC83, 0x8EC6, 0xDC84, 0x8EC7, 0xDC85, 0x8EC8, 0xDC86, 0x8EC9, 0xDC87, 0x8ECA, 0xDC88, 0x8ECB, + 0xDC89, 0x8ECC, 0xDC8A, 0x8ECD, 0xDC8B, 0x8ECF, 0xDC8C, 0x8ED0, 0xDC8D, 0x8ED1, 0xDC8E, 0x8ED2, 0xDC8F, 0x8ED3, 0xDC90, 0x8ED4, + 0xDC91, 0x8ED5, 0xDC92, 0x8ED6, 0xDC93, 0x8ED7, 0xDC94, 0x8ED8, 0xDC95, 0x8ED9, 0xDC96, 0x8EDA, 0xDC97, 0x8EDB, 0xDC98, 0x8EDC, + 0xDC99, 0x8EDD, 0xDC9A, 0x8EDE, 0xDC9B, 0x8EDF, 0xDC9C, 0x8EE0, 0xDC9D, 0x8EE1, 0xDC9E, 0x8EE2, 0xDC9F, 0x8EE3, 0xDCA0, 0x8EE4, + 0xDCA1, 0x580B, 0xDCA2, 0x580D, 0xDCA3, 0x57FD, 0xDCA4, 0x57ED, 0xDCA5, 0x5800, 0xDCA6, 0x581E, 0xDCA7, 0x5819, 0xDCA8, 0x5844, + 0xDCA9, 0x5820, 0xDCAA, 0x5865, 0xDCAB, 0x586C, 0xDCAC, 0x5881, 0xDCAD, 0x5889, 0xDCAE, 0x589A, 0xDCAF, 0x5880, 0xDCB0, 0x99A8, + 0xDCB1, 0x9F19, 0xDCB2, 0x61FF, 0xDCB3, 0x8279, 0xDCB4, 0x827D, 0xDCB5, 0x827F, 0xDCB6, 0x828F, 0xDCB7, 0x828A, 0xDCB8, 0x82A8, + 0xDCB9, 0x8284, 0xDCBA, 0x828E, 0xDCBB, 0x8291, 0xDCBC, 0x8297, 0xDCBD, 0x8299, 0xDCBE, 0x82AB, 0xDCBF, 0x82B8, 0xDCC0, 0x82BE, + 0xDCC1, 0x82B0, 0xDCC2, 0x82C8, 0xDCC3, 0x82CA, 0xDCC4, 0x82E3, 0xDCC5, 0x8298, 0xDCC6, 0x82B7, 0xDCC7, 0x82AE, 0xDCC8, 0x82CB, + 0xDCC9, 0x82CC, 0xDCCA, 0x82C1, 0xDCCB, 0x82A9, 0xDCCC, 0x82B4, 0xDCCD, 0x82A1, 0xDCCE, 0x82AA, 0xDCCF, 0x829F, 0xDCD0, 0x82C4, + 0xDCD1, 0x82CE, 0xDCD2, 0x82A4, 0xDCD3, 0x82E1, 0xDCD4, 0x8309, 0xDCD5, 0x82F7, 0xDCD6, 0x82E4, 0xDCD7, 0x830F, 0xDCD8, 0x8307, + 0xDCD9, 0x82DC, 0xDCDA, 0x82F4, 0xDCDB, 0x82D2, 0xDCDC, 0x82D8, 0xDCDD, 0x830C, 0xDCDE, 0x82FB, 0xDCDF, 0x82D3, 0xDCE0, 0x8311, + 0xDCE1, 0x831A, 0xDCE2, 0x8306, 0xDCE3, 0x8314, 0xDCE4, 0x8315, 0xDCE5, 0x82E0, 0xDCE6, 0x82D5, 0xDCE7, 0x831C, 0xDCE8, 0x8351, + 0xDCE9, 0x835B, 0xDCEA, 0x835C, 0xDCEB, 0x8308, 0xDCEC, 0x8392, 0xDCED, 0x833C, 0xDCEE, 0x8334, 0xDCEF, 0x8331, 0xDCF0, 0x839B, + 0xDCF1, 0x835E, 0xDCF2, 0x832F, 0xDCF3, 0x834F, 0xDCF4, 0x8347, 0xDCF5, 0x8343, 0xDCF6, 0x835F, 0xDCF7, 0x8340, 0xDCF8, 0x8317, + 0xDCF9, 0x8360, 0xDCFA, 0x832D, 0xDCFB, 0x833A, 0xDCFC, 0x8333, 0xDCFD, 0x8366, 0xDCFE, 0x8365, 0xDD40, 0x8EE5, 0xDD41, 0x8EE6, + 0xDD42, 0x8EE7, 0xDD43, 0x8EE8, 0xDD44, 0x8EE9, 0xDD45, 0x8EEA, 0xDD46, 0x8EEB, 0xDD47, 0x8EEC, 0xDD48, 0x8EED, 0xDD49, 0x8EEE, + 0xDD4A, 0x8EEF, 0xDD4B, 0x8EF0, 0xDD4C, 0x8EF1, 0xDD4D, 0x8EF2, 0xDD4E, 0x8EF3, 0xDD4F, 0x8EF4, 0xDD50, 0x8EF5, 0xDD51, 0x8EF6, + 0xDD52, 0x8EF7, 0xDD53, 0x8EF8, 0xDD54, 0x8EF9, 0xDD55, 0x8EFA, 0xDD56, 0x8EFB, 0xDD57, 0x8EFC, 0xDD58, 0x8EFD, 0xDD59, 0x8EFE, + 0xDD5A, 0x8EFF, 0xDD5B, 0x8F00, 0xDD5C, 0x8F01, 0xDD5D, 0x8F02, 0xDD5E, 0x8F03, 0xDD5F, 0x8F04, 0xDD60, 0x8F05, 0xDD61, 0x8F06, + 0xDD62, 0x8F07, 0xDD63, 0x8F08, 0xDD64, 0x8F09, 0xDD65, 0x8F0A, 0xDD66, 0x8F0B, 0xDD67, 0x8F0C, 0xDD68, 0x8F0D, 0xDD69, 0x8F0E, + 0xDD6A, 0x8F0F, 0xDD6B, 0x8F10, 0xDD6C, 0x8F11, 0xDD6D, 0x8F12, 0xDD6E, 0x8F13, 0xDD6F, 0x8F14, 0xDD70, 0x8F15, 0xDD71, 0x8F16, + 0xDD72, 0x8F17, 0xDD73, 0x8F18, 0xDD74, 0x8F19, 0xDD75, 0x8F1A, 0xDD76, 0x8F1B, 0xDD77, 0x8F1C, 0xDD78, 0x8F1D, 0xDD79, 0x8F1E, + 0xDD7A, 0x8F1F, 0xDD7B, 0x8F20, 0xDD7C, 0x8F21, 0xDD7D, 0x8F22, 0xDD7E, 0x8F23, 0xDD80, 0x8F24, 0xDD81, 0x8F25, 0xDD82, 0x8F26, + 0xDD83, 0x8F27, 0xDD84, 0x8F28, 0xDD85, 0x8F29, 0xDD86, 0x8F2A, 0xDD87, 0x8F2B, 0xDD88, 0x8F2C, 0xDD89, 0x8F2D, 0xDD8A, 0x8F2E, + 0xDD8B, 0x8F2F, 0xDD8C, 0x8F30, 0xDD8D, 0x8F31, 0xDD8E, 0x8F32, 0xDD8F, 0x8F33, 0xDD90, 0x8F34, 0xDD91, 0x8F35, 0xDD92, 0x8F36, + 0xDD93, 0x8F37, 0xDD94, 0x8F38, 0xDD95, 0x8F39, 0xDD96, 0x8F3A, 0xDD97, 0x8F3B, 0xDD98, 0x8F3C, 0xDD99, 0x8F3D, 0xDD9A, 0x8F3E, + 0xDD9B, 0x8F3F, 0xDD9C, 0x8F40, 0xDD9D, 0x8F41, 0xDD9E, 0x8F42, 0xDD9F, 0x8F43, 0xDDA0, 0x8F44, 0xDDA1, 0x8368, 0xDDA2, 0x831B, + 0xDDA3, 0x8369, 0xDDA4, 0x836C, 0xDDA5, 0x836A, 0xDDA6, 0x836D, 0xDDA7, 0x836E, 0xDDA8, 0x83B0, 0xDDA9, 0x8378, 0xDDAA, 0x83B3, + 0xDDAB, 0x83B4, 0xDDAC, 0x83A0, 0xDDAD, 0x83AA, 0xDDAE, 0x8393, 0xDDAF, 0x839C, 0xDDB0, 0x8385, 0xDDB1, 0x837C, 0xDDB2, 0x83B6, + 0xDDB3, 0x83A9, 0xDDB4, 0x837D, 0xDDB5, 0x83B8, 0xDDB6, 0x837B, 0xDDB7, 0x8398, 0xDDB8, 0x839E, 0xDDB9, 0x83A8, 0xDDBA, 0x83BA, + 0xDDBB, 0x83BC, 0xDDBC, 0x83C1, 0xDDBD, 0x8401, 0xDDBE, 0x83E5, 0xDDBF, 0x83D8, 0xDDC0, 0x5807, 0xDDC1, 0x8418, 0xDDC2, 0x840B, + 0xDDC3, 0x83DD, 0xDDC4, 0x83FD, 0xDDC5, 0x83D6, 0xDDC6, 0x841C, 0xDDC7, 0x8438, 0xDDC8, 0x8411, 0xDDC9, 0x8406, 0xDDCA, 0x83D4, + 0xDDCB, 0x83DF, 0xDDCC, 0x840F, 0xDDCD, 0x8403, 0xDDCE, 0x83F8, 0xDDCF, 0x83F9, 0xDDD0, 0x83EA, 0xDDD1, 0x83C5, 0xDDD2, 0x83C0, + 0xDDD3, 0x8426, 0xDDD4, 0x83F0, 0xDDD5, 0x83E1, 0xDDD6, 0x845C, 0xDDD7, 0x8451, 0xDDD8, 0x845A, 0xDDD9, 0x8459, 0xDDDA, 0x8473, + 0xDDDB, 0x8487, 0xDDDC, 0x8488, 0xDDDD, 0x847A, 0xDDDE, 0x8489, 0xDDDF, 0x8478, 0xDDE0, 0x843C, 0xDDE1, 0x8446, 0xDDE2, 0x8469, + 0xDDE3, 0x8476, 0xDDE4, 0x848C, 0xDDE5, 0x848E, 0xDDE6, 0x8431, 0xDDE7, 0x846D, 0xDDE8, 0x84C1, 0xDDE9, 0x84CD, 0xDDEA, 0x84D0, + 0xDDEB, 0x84E6, 0xDDEC, 0x84BD, 0xDDED, 0x84D3, 0xDDEE, 0x84CA, 0xDDEF, 0x84BF, 0xDDF0, 0x84BA, 0xDDF1, 0x84E0, 0xDDF2, 0x84A1, + 0xDDF3, 0x84B9, 0xDDF4, 0x84B4, 0xDDF5, 0x8497, 0xDDF6, 0x84E5, 0xDDF7, 0x84E3, 0xDDF8, 0x850C, 0xDDF9, 0x750D, 0xDDFA, 0x8538, + 0xDDFB, 0x84F0, 0xDDFC, 0x8539, 0xDDFD, 0x851F, 0xDDFE, 0x853A, 0xDE40, 0x8F45, 0xDE41, 0x8F46, 0xDE42, 0x8F47, 0xDE43, 0x8F48, + 0xDE44, 0x8F49, 0xDE45, 0x8F4A, 0xDE46, 0x8F4B, 0xDE47, 0x8F4C, 0xDE48, 0x8F4D, 0xDE49, 0x8F4E, 0xDE4A, 0x8F4F, 0xDE4B, 0x8F50, + 0xDE4C, 0x8F51, 0xDE4D, 0x8F52, 0xDE4E, 0x8F53, 0xDE4F, 0x8F54, 0xDE50, 0x8F55, 0xDE51, 0x8F56, 0xDE52, 0x8F57, 0xDE53, 0x8F58, + 0xDE54, 0x8F59, 0xDE55, 0x8F5A, 0xDE56, 0x8F5B, 0xDE57, 0x8F5C, 0xDE58, 0x8F5D, 0xDE59, 0x8F5E, 0xDE5A, 0x8F5F, 0xDE5B, 0x8F60, + 0xDE5C, 0x8F61, 0xDE5D, 0x8F62, 0xDE5E, 0x8F63, 0xDE5F, 0x8F64, 0xDE60, 0x8F65, 0xDE61, 0x8F6A, 0xDE62, 0x8F80, 0xDE63, 0x8F8C, + 0xDE64, 0x8F92, 0xDE65, 0x8F9D, 0xDE66, 0x8FA0, 0xDE67, 0x8FA1, 0xDE68, 0x8FA2, 0xDE69, 0x8FA4, 0xDE6A, 0x8FA5, 0xDE6B, 0x8FA6, + 0xDE6C, 0x8FA7, 0xDE6D, 0x8FAA, 0xDE6E, 0x8FAC, 0xDE6F, 0x8FAD, 0xDE70, 0x8FAE, 0xDE71, 0x8FAF, 0xDE72, 0x8FB2, 0xDE73, 0x8FB3, + 0xDE74, 0x8FB4, 0xDE75, 0x8FB5, 0xDE76, 0x8FB7, 0xDE77, 0x8FB8, 0xDE78, 0x8FBA, 0xDE79, 0x8FBB, 0xDE7A, 0x8FBC, 0xDE7B, 0x8FBF, + 0xDE7C, 0x8FC0, 0xDE7D, 0x8FC3, 0xDE7E, 0x8FC6, 0xDE80, 0x8FC9, 0xDE81, 0x8FCA, 0xDE82, 0x8FCB, 0xDE83, 0x8FCC, 0xDE84, 0x8FCD, + 0xDE85, 0x8FCF, 0xDE86, 0x8FD2, 0xDE87, 0x8FD6, 0xDE88, 0x8FD7, 0xDE89, 0x8FDA, 0xDE8A, 0x8FE0, 0xDE8B, 0x8FE1, 0xDE8C, 0x8FE3, + 0xDE8D, 0x8FE7, 0xDE8E, 0x8FEC, 0xDE8F, 0x8FEF, 0xDE90, 0x8FF1, 0xDE91, 0x8FF2, 0xDE92, 0x8FF4, 0xDE93, 0x8FF5, 0xDE94, 0x8FF6, + 0xDE95, 0x8FFA, 0xDE96, 0x8FFB, 0xDE97, 0x8FFC, 0xDE98, 0x8FFE, 0xDE99, 0x8FFF, 0xDE9A, 0x9007, 0xDE9B, 0x9008, 0xDE9C, 0x900C, + 0xDE9D, 0x900E, 0xDE9E, 0x9013, 0xDE9F, 0x9015, 0xDEA0, 0x9018, 0xDEA1, 0x8556, 0xDEA2, 0x853B, 0xDEA3, 0x84FF, 0xDEA4, 0x84FC, + 0xDEA5, 0x8559, 0xDEA6, 0x8548, 0xDEA7, 0x8568, 0xDEA8, 0x8564, 0xDEA9, 0x855E, 0xDEAA, 0x857A, 0xDEAB, 0x77A2, 0xDEAC, 0x8543, + 0xDEAD, 0x8572, 0xDEAE, 0x857B, 0xDEAF, 0x85A4, 0xDEB0, 0x85A8, 0xDEB1, 0x8587, 0xDEB2, 0x858F, 0xDEB3, 0x8579, 0xDEB4, 0x85AE, + 0xDEB5, 0x859C, 0xDEB6, 0x8585, 0xDEB7, 0x85B9, 0xDEB8, 0x85B7, 0xDEB9, 0x85B0, 0xDEBA, 0x85D3, 0xDEBB, 0x85C1, 0xDEBC, 0x85DC, + 0xDEBD, 0x85FF, 0xDEBE, 0x8627, 0xDEBF, 0x8605, 0xDEC0, 0x8629, 0xDEC1, 0x8616, 0xDEC2, 0x863C, 0xDEC3, 0x5EFE, 0xDEC4, 0x5F08, + 0xDEC5, 0x593C, 0xDEC6, 0x5941, 0xDEC7, 0x8037, 0xDEC8, 0x5955, 0xDEC9, 0x595A, 0xDECA, 0x5958, 0xDECB, 0x530F, 0xDECC, 0x5C22, + 0xDECD, 0x5C25, 0xDECE, 0x5C2C, 0xDECF, 0x5C34, 0xDED0, 0x624C, 0xDED1, 0x626A, 0xDED2, 0x629F, 0xDED3, 0x62BB, 0xDED4, 0x62CA, + 0xDED5, 0x62DA, 0xDED6, 0x62D7, 0xDED7, 0x62EE, 0xDED8, 0x6322, 0xDED9, 0x62F6, 0xDEDA, 0x6339, 0xDEDB, 0x634B, 0xDEDC, 0x6343, + 0xDEDD, 0x63AD, 0xDEDE, 0x63F6, 0xDEDF, 0x6371, 0xDEE0, 0x637A, 0xDEE1, 0x638E, 0xDEE2, 0x63B4, 0xDEE3, 0x636D, 0xDEE4, 0x63AC, + 0xDEE5, 0x638A, 0xDEE6, 0x6369, 0xDEE7, 0x63AE, 0xDEE8, 0x63BC, 0xDEE9, 0x63F2, 0xDEEA, 0x63F8, 0xDEEB, 0x63E0, 0xDEEC, 0x63FF, + 0xDEED, 0x63C4, 0xDEEE, 0x63DE, 0xDEEF, 0x63CE, 0xDEF0, 0x6452, 0xDEF1, 0x63C6, 0xDEF2, 0x63BE, 0xDEF3, 0x6445, 0xDEF4, 0x6441, + 0xDEF5, 0x640B, 0xDEF6, 0x641B, 0xDEF7, 0x6420, 0xDEF8, 0x640C, 0xDEF9, 0x6426, 0xDEFA, 0x6421, 0xDEFB, 0x645E, 0xDEFC, 0x6484, + 0xDEFD, 0x646D, 0xDEFE, 0x6496, 0xDF40, 0x9019, 0xDF41, 0x901C, 0xDF42, 0x9023, 0xDF43, 0x9024, 0xDF44, 0x9025, 0xDF45, 0x9027, + 0xDF46, 0x9028, 0xDF47, 0x9029, 0xDF48, 0x902A, 0xDF49, 0x902B, 0xDF4A, 0x902C, 0xDF4B, 0x9030, 0xDF4C, 0x9031, 0xDF4D, 0x9032, + 0xDF4E, 0x9033, 0xDF4F, 0x9034, 0xDF50, 0x9037, 0xDF51, 0x9039, 0xDF52, 0x903A, 0xDF53, 0x903D, 0xDF54, 0x903F, 0xDF55, 0x9040, + 0xDF56, 0x9043, 0xDF57, 0x9045, 0xDF58, 0x9046, 0xDF59, 0x9048, 0xDF5A, 0x9049, 0xDF5B, 0x904A, 0xDF5C, 0x904B, 0xDF5D, 0x904C, + 0xDF5E, 0x904E, 0xDF5F, 0x9054, 0xDF60, 0x9055, 0xDF61, 0x9056, 0xDF62, 0x9059, 0xDF63, 0x905A, 0xDF64, 0x905C, 0xDF65, 0x905D, + 0xDF66, 0x905E, 0xDF67, 0x905F, 0xDF68, 0x9060, 0xDF69, 0x9061, 0xDF6A, 0x9064, 0xDF6B, 0x9066, 0xDF6C, 0x9067, 0xDF6D, 0x9069, + 0xDF6E, 0x906A, 0xDF6F, 0x906B, 0xDF70, 0x906C, 0xDF71, 0x906F, 0xDF72, 0x9070, 0xDF73, 0x9071, 0xDF74, 0x9072, 0xDF75, 0x9073, + 0xDF76, 0x9076, 0xDF77, 0x9077, 0xDF78, 0x9078, 0xDF79, 0x9079, 0xDF7A, 0x907A, 0xDF7B, 0x907B, 0xDF7C, 0x907C, 0xDF7D, 0x907E, + 0xDF7E, 0x9081, 0xDF80, 0x9084, 0xDF81, 0x9085, 0xDF82, 0x9086, 0xDF83, 0x9087, 0xDF84, 0x9089, 0xDF85, 0x908A, 0xDF86, 0x908C, + 0xDF87, 0x908D, 0xDF88, 0x908E, 0xDF89, 0x908F, 0xDF8A, 0x9090, 0xDF8B, 0x9092, 0xDF8C, 0x9094, 0xDF8D, 0x9096, 0xDF8E, 0x9098, + 0xDF8F, 0x909A, 0xDF90, 0x909C, 0xDF91, 0x909E, 0xDF92, 0x909F, 0xDF93, 0x90A0, 0xDF94, 0x90A4, 0xDF95, 0x90A5, 0xDF96, 0x90A7, + 0xDF97, 0x90A8, 0xDF98, 0x90A9, 0xDF99, 0x90AB, 0xDF9A, 0x90AD, 0xDF9B, 0x90B2, 0xDF9C, 0x90B7, 0xDF9D, 0x90BC, 0xDF9E, 0x90BD, + 0xDF9F, 0x90BF, 0xDFA0, 0x90C0, 0xDFA1, 0x647A, 0xDFA2, 0x64B7, 0xDFA3, 0x64B8, 0xDFA4, 0x6499, 0xDFA5, 0x64BA, 0xDFA6, 0x64C0, + 0xDFA7, 0x64D0, 0xDFA8, 0x64D7, 0xDFA9, 0x64E4, 0xDFAA, 0x64E2, 0xDFAB, 0x6509, 0xDFAC, 0x6525, 0xDFAD, 0x652E, 0xDFAE, 0x5F0B, + 0xDFAF, 0x5FD2, 0xDFB0, 0x7519, 0xDFB1, 0x5F11, 0xDFB2, 0x535F, 0xDFB3, 0x53F1, 0xDFB4, 0x53FD, 0xDFB5, 0x53E9, 0xDFB6, 0x53E8, + 0xDFB7, 0x53FB, 0xDFB8, 0x5412, 0xDFB9, 0x5416, 0xDFBA, 0x5406, 0xDFBB, 0x544B, 0xDFBC, 0x5452, 0xDFBD, 0x5453, 0xDFBE, 0x5454, + 0xDFBF, 0x5456, 0xDFC0, 0x5443, 0xDFC1, 0x5421, 0xDFC2, 0x5457, 0xDFC3, 0x5459, 0xDFC4, 0x5423, 0xDFC5, 0x5432, 0xDFC6, 0x5482, + 0xDFC7, 0x5494, 0xDFC8, 0x5477, 0xDFC9, 0x5471, 0xDFCA, 0x5464, 0xDFCB, 0x549A, 0xDFCC, 0x549B, 0xDFCD, 0x5484, 0xDFCE, 0x5476, + 0xDFCF, 0x5466, 0xDFD0, 0x549D, 0xDFD1, 0x54D0, 0xDFD2, 0x54AD, 0xDFD3, 0x54C2, 0xDFD4, 0x54B4, 0xDFD5, 0x54D2, 0xDFD6, 0x54A7, + 0xDFD7, 0x54A6, 0xDFD8, 0x54D3, 0xDFD9, 0x54D4, 0xDFDA, 0x5472, 0xDFDB, 0x54A3, 0xDFDC, 0x54D5, 0xDFDD, 0x54BB, 0xDFDE, 0x54BF, + 0xDFDF, 0x54CC, 0xDFE0, 0x54D9, 0xDFE1, 0x54DA, 0xDFE2, 0x54DC, 0xDFE3, 0x54A9, 0xDFE4, 0x54AA, 0xDFE5, 0x54A4, 0xDFE6, 0x54DD, + 0xDFE7, 0x54CF, 0xDFE8, 0x54DE, 0xDFE9, 0x551B, 0xDFEA, 0x54E7, 0xDFEB, 0x5520, 0xDFEC, 0x54FD, 0xDFED, 0x5514, 0xDFEE, 0x54F3, + 0xDFEF, 0x5522, 0xDFF0, 0x5523, 0xDFF1, 0x550F, 0xDFF2, 0x5511, 0xDFF3, 0x5527, 0xDFF4, 0x552A, 0xDFF5, 0x5567, 0xDFF6, 0x558F, + 0xDFF7, 0x55B5, 0xDFF8, 0x5549, 0xDFF9, 0x556D, 0xDFFA, 0x5541, 0xDFFB, 0x5555, 0xDFFC, 0x553F, 0xDFFD, 0x5550, 0xDFFE, 0x553C, + 0xE040, 0x90C2, 0xE041, 0x90C3, 0xE042, 0x90C6, 0xE043, 0x90C8, 0xE044, 0x90C9, 0xE045, 0x90CB, 0xE046, 0x90CC, 0xE047, 0x90CD, + 0xE048, 0x90D2, 0xE049, 0x90D4, 0xE04A, 0x90D5, 0xE04B, 0x90D6, 0xE04C, 0x90D8, 0xE04D, 0x90D9, 0xE04E, 0x90DA, 0xE04F, 0x90DE, + 0xE050, 0x90DF, 0xE051, 0x90E0, 0xE052, 0x90E3, 0xE053, 0x90E4, 0xE054, 0x90E5, 0xE055, 0x90E9, 0xE056, 0x90EA, 0xE057, 0x90EC, + 0xE058, 0x90EE, 0xE059, 0x90F0, 0xE05A, 0x90F1, 0xE05B, 0x90F2, 0xE05C, 0x90F3, 0xE05D, 0x90F5, 0xE05E, 0x90F6, 0xE05F, 0x90F7, + 0xE060, 0x90F9, 0xE061, 0x90FA, 0xE062, 0x90FB, 0xE063, 0x90FC, 0xE064, 0x90FF, 0xE065, 0x9100, 0xE066, 0x9101, 0xE067, 0x9103, + 0xE068, 0x9105, 0xE069, 0x9106, 0xE06A, 0x9107, 0xE06B, 0x9108, 0xE06C, 0x9109, 0xE06D, 0x910A, 0xE06E, 0x910B, 0xE06F, 0x910C, + 0xE070, 0x910D, 0xE071, 0x910E, 0xE072, 0x910F, 0xE073, 0x9110, 0xE074, 0x9111, 0xE075, 0x9112, 0xE076, 0x9113, 0xE077, 0x9114, + 0xE078, 0x9115, 0xE079, 0x9116, 0xE07A, 0x9117, 0xE07B, 0x9118, 0xE07C, 0x911A, 0xE07D, 0x911B, 0xE07E, 0x911C, 0xE080, 0x911D, + 0xE081, 0x911F, 0xE082, 0x9120, 0xE083, 0x9121, 0xE084, 0x9124, 0xE085, 0x9125, 0xE086, 0x9126, 0xE087, 0x9127, 0xE088, 0x9128, + 0xE089, 0x9129, 0xE08A, 0x912A, 0xE08B, 0x912B, 0xE08C, 0x912C, 0xE08D, 0x912D, 0xE08E, 0x912E, 0xE08F, 0x9130, 0xE090, 0x9132, + 0xE091, 0x9133, 0xE092, 0x9134, 0xE093, 0x9135, 0xE094, 0x9136, 0xE095, 0x9137, 0xE096, 0x9138, 0xE097, 0x913A, 0xE098, 0x913B, + 0xE099, 0x913C, 0xE09A, 0x913D, 0xE09B, 0x913E, 0xE09C, 0x913F, 0xE09D, 0x9140, 0xE09E, 0x9141, 0xE09F, 0x9142, 0xE0A0, 0x9144, + 0xE0A1, 0x5537, 0xE0A2, 0x5556, 0xE0A3, 0x5575, 0xE0A4, 0x5576, 0xE0A5, 0x5577, 0xE0A6, 0x5533, 0xE0A7, 0x5530, 0xE0A8, 0x555C, + 0xE0A9, 0x558B, 0xE0AA, 0x55D2, 0xE0AB, 0x5583, 0xE0AC, 0x55B1, 0xE0AD, 0x55B9, 0xE0AE, 0x5588, 0xE0AF, 0x5581, 0xE0B0, 0x559F, + 0xE0B1, 0x557E, 0xE0B2, 0x55D6, 0xE0B3, 0x5591, 0xE0B4, 0x557B, 0xE0B5, 0x55DF, 0xE0B6, 0x55BD, 0xE0B7, 0x55BE, 0xE0B8, 0x5594, + 0xE0B9, 0x5599, 0xE0BA, 0x55EA, 0xE0BB, 0x55F7, 0xE0BC, 0x55C9, 0xE0BD, 0x561F, 0xE0BE, 0x55D1, 0xE0BF, 0x55EB, 0xE0C0, 0x55EC, + 0xE0C1, 0x55D4, 0xE0C2, 0x55E6, 0xE0C3, 0x55DD, 0xE0C4, 0x55C4, 0xE0C5, 0x55EF, 0xE0C6, 0x55E5, 0xE0C7, 0x55F2, 0xE0C8, 0x55F3, + 0xE0C9, 0x55CC, 0xE0CA, 0x55CD, 0xE0CB, 0x55E8, 0xE0CC, 0x55F5, 0xE0CD, 0x55E4, 0xE0CE, 0x8F94, 0xE0CF, 0x561E, 0xE0D0, 0x5608, + 0xE0D1, 0x560C, 0xE0D2, 0x5601, 0xE0D3, 0x5624, 0xE0D4, 0x5623, 0xE0D5, 0x55FE, 0xE0D6, 0x5600, 0xE0D7, 0x5627, 0xE0D8, 0x562D, + 0xE0D9, 0x5658, 0xE0DA, 0x5639, 0xE0DB, 0x5657, 0xE0DC, 0x562C, 0xE0DD, 0x564D, 0xE0DE, 0x5662, 0xE0DF, 0x5659, 0xE0E0, 0x565C, + 0xE0E1, 0x564C, 0xE0E2, 0x5654, 0xE0E3, 0x5686, 0xE0E4, 0x5664, 0xE0E5, 0x5671, 0xE0E6, 0x566B, 0xE0E7, 0x567B, 0xE0E8, 0x567C, + 0xE0E9, 0x5685, 0xE0EA, 0x5693, 0xE0EB, 0x56AF, 0xE0EC, 0x56D4, 0xE0ED, 0x56D7, 0xE0EE, 0x56DD, 0xE0EF, 0x56E1, 0xE0F0, 0x56F5, + 0xE0F1, 0x56EB, 0xE0F2, 0x56F9, 0xE0F3, 0x56FF, 0xE0F4, 0x5704, 0xE0F5, 0x570A, 0xE0F6, 0x5709, 0xE0F7, 0x571C, 0xE0F8, 0x5E0F, + 0xE0F9, 0x5E19, 0xE0FA, 0x5E14, 0xE0FB, 0x5E11, 0xE0FC, 0x5E31, 0xE0FD, 0x5E3B, 0xE0FE, 0x5E3C, 0xE140, 0x9145, 0xE141, 0x9147, + 0xE142, 0x9148, 0xE143, 0x9151, 0xE144, 0x9153, 0xE145, 0x9154, 0xE146, 0x9155, 0xE147, 0x9156, 0xE148, 0x9158, 0xE149, 0x9159, + 0xE14A, 0x915B, 0xE14B, 0x915C, 0xE14C, 0x915F, 0xE14D, 0x9160, 0xE14E, 0x9166, 0xE14F, 0x9167, 0xE150, 0x9168, 0xE151, 0x916B, + 0xE152, 0x916D, 0xE153, 0x9173, 0xE154, 0x917A, 0xE155, 0x917B, 0xE156, 0x917C, 0xE157, 0x9180, 0xE158, 0x9181, 0xE159, 0x9182, + 0xE15A, 0x9183, 0xE15B, 0x9184, 0xE15C, 0x9186, 0xE15D, 0x9188, 0xE15E, 0x918A, 0xE15F, 0x918E, 0xE160, 0x918F, 0xE161, 0x9193, + 0xE162, 0x9194, 0xE163, 0x9195, 0xE164, 0x9196, 0xE165, 0x9197, 0xE166, 0x9198, 0xE167, 0x9199, 0xE168, 0x919C, 0xE169, 0x919D, + 0xE16A, 0x919E, 0xE16B, 0x919F, 0xE16C, 0x91A0, 0xE16D, 0x91A1, 0xE16E, 0x91A4, 0xE16F, 0x91A5, 0xE170, 0x91A6, 0xE171, 0x91A7, + 0xE172, 0x91A8, 0xE173, 0x91A9, 0xE174, 0x91AB, 0xE175, 0x91AC, 0xE176, 0x91B0, 0xE177, 0x91B1, 0xE178, 0x91B2, 0xE179, 0x91B3, + 0xE17A, 0x91B6, 0xE17B, 0x91B7, 0xE17C, 0x91B8, 0xE17D, 0x91B9, 0xE17E, 0x91BB, 0xE180, 0x91BC, 0xE181, 0x91BD, 0xE182, 0x91BE, + 0xE183, 0x91BF, 0xE184, 0x91C0, 0xE185, 0x91C1, 0xE186, 0x91C2, 0xE187, 0x91C3, 0xE188, 0x91C4, 0xE189, 0x91C5, 0xE18A, 0x91C6, + 0xE18B, 0x91C8, 0xE18C, 0x91CB, 0xE18D, 0x91D0, 0xE18E, 0x91D2, 0xE18F, 0x91D3, 0xE190, 0x91D4, 0xE191, 0x91D5, 0xE192, 0x91D6, + 0xE193, 0x91D7, 0xE194, 0x91D8, 0xE195, 0x91D9, 0xE196, 0x91DA, 0xE197, 0x91DB, 0xE198, 0x91DD, 0xE199, 0x91DE, 0xE19A, 0x91DF, + 0xE19B, 0x91E0, 0xE19C, 0x91E1, 0xE19D, 0x91E2, 0xE19E, 0x91E3, 0xE19F, 0x91E4, 0xE1A0, 0x91E5, 0xE1A1, 0x5E37, 0xE1A2, 0x5E44, + 0xE1A3, 0x5E54, 0xE1A4, 0x5E5B, 0xE1A5, 0x5E5E, 0xE1A6, 0x5E61, 0xE1A7, 0x5C8C, 0xE1A8, 0x5C7A, 0xE1A9, 0x5C8D, 0xE1AA, 0x5C90, + 0xE1AB, 0x5C96, 0xE1AC, 0x5C88, 0xE1AD, 0x5C98, 0xE1AE, 0x5C99, 0xE1AF, 0x5C91, 0xE1B0, 0x5C9A, 0xE1B1, 0x5C9C, 0xE1B2, 0x5CB5, + 0xE1B3, 0x5CA2, 0xE1B4, 0x5CBD, 0xE1B5, 0x5CAC, 0xE1B6, 0x5CAB, 0xE1B7, 0x5CB1, 0xE1B8, 0x5CA3, 0xE1B9, 0x5CC1, 0xE1BA, 0x5CB7, + 0xE1BB, 0x5CC4, 0xE1BC, 0x5CD2, 0xE1BD, 0x5CE4, 0xE1BE, 0x5CCB, 0xE1BF, 0x5CE5, 0xE1C0, 0x5D02, 0xE1C1, 0x5D03, 0xE1C2, 0x5D27, + 0xE1C3, 0x5D26, 0xE1C4, 0x5D2E, 0xE1C5, 0x5D24, 0xE1C6, 0x5D1E, 0xE1C7, 0x5D06, 0xE1C8, 0x5D1B, 0xE1C9, 0x5D58, 0xE1CA, 0x5D3E, + 0xE1CB, 0x5D34, 0xE1CC, 0x5D3D, 0xE1CD, 0x5D6C, 0xE1CE, 0x5D5B, 0xE1CF, 0x5D6F, 0xE1D0, 0x5D5D, 0xE1D1, 0x5D6B, 0xE1D2, 0x5D4B, + 0xE1D3, 0x5D4A, 0xE1D4, 0x5D69, 0xE1D5, 0x5D74, 0xE1D6, 0x5D82, 0xE1D7, 0x5D99, 0xE1D8, 0x5D9D, 0xE1D9, 0x8C73, 0xE1DA, 0x5DB7, + 0xE1DB, 0x5DC5, 0xE1DC, 0x5F73, 0xE1DD, 0x5F77, 0xE1DE, 0x5F82, 0xE1DF, 0x5F87, 0xE1E0, 0x5F89, 0xE1E1, 0x5F8C, 0xE1E2, 0x5F95, + 0xE1E3, 0x5F99, 0xE1E4, 0x5F9C, 0xE1E5, 0x5FA8, 0xE1E6, 0x5FAD, 0xE1E7, 0x5FB5, 0xE1E8, 0x5FBC, 0xE1E9, 0x8862, 0xE1EA, 0x5F61, + 0xE1EB, 0x72AD, 0xE1EC, 0x72B0, 0xE1ED, 0x72B4, 0xE1EE, 0x72B7, 0xE1EF, 0x72B8, 0xE1F0, 0x72C3, 0xE1F1, 0x72C1, 0xE1F2, 0x72CE, + 0xE1F3, 0x72CD, 0xE1F4, 0x72D2, 0xE1F5, 0x72E8, 0xE1F6, 0x72EF, 0xE1F7, 0x72E9, 0xE1F8, 0x72F2, 0xE1F9, 0x72F4, 0xE1FA, 0x72F7, + 0xE1FB, 0x7301, 0xE1FC, 0x72F3, 0xE1FD, 0x7303, 0xE1FE, 0x72FA, 0xE240, 0x91E6, 0xE241, 0x91E7, 0xE242, 0x91E8, 0xE243, 0x91E9, + 0xE244, 0x91EA, 0xE245, 0x91EB, 0xE246, 0x91EC, 0xE247, 0x91ED, 0xE248, 0x91EE, 0xE249, 0x91EF, 0xE24A, 0x91F0, 0xE24B, 0x91F1, + 0xE24C, 0x91F2, 0xE24D, 0x91F3, 0xE24E, 0x91F4, 0xE24F, 0x91F5, 0xE250, 0x91F6, 0xE251, 0x91F7, 0xE252, 0x91F8, 0xE253, 0x91F9, + 0xE254, 0x91FA, 0xE255, 0x91FB, 0xE256, 0x91FC, 0xE257, 0x91FD, 0xE258, 0x91FE, 0xE259, 0x91FF, 0xE25A, 0x9200, 0xE25B, 0x9201, + 0xE25C, 0x9202, 0xE25D, 0x9203, 0xE25E, 0x9204, 0xE25F, 0x9205, 0xE260, 0x9206, 0xE261, 0x9207, 0xE262, 0x9208, 0xE263, 0x9209, + 0xE264, 0x920A, 0xE265, 0x920B, 0xE266, 0x920C, 0xE267, 0x920D, 0xE268, 0x920E, 0xE269, 0x920F, 0xE26A, 0x9210, 0xE26B, 0x9211, + 0xE26C, 0x9212, 0xE26D, 0x9213, 0xE26E, 0x9214, 0xE26F, 0x9215, 0xE270, 0x9216, 0xE271, 0x9217, 0xE272, 0x9218, 0xE273, 0x9219, + 0xE274, 0x921A, 0xE275, 0x921B, 0xE276, 0x921C, 0xE277, 0x921D, 0xE278, 0x921E, 0xE279, 0x921F, 0xE27A, 0x9220, 0xE27B, 0x9221, + 0xE27C, 0x9222, 0xE27D, 0x9223, 0xE27E, 0x9224, 0xE280, 0x9225, 0xE281, 0x9226, 0xE282, 0x9227, 0xE283, 0x9228, 0xE284, 0x9229, + 0xE285, 0x922A, 0xE286, 0x922B, 0xE287, 0x922C, 0xE288, 0x922D, 0xE289, 0x922E, 0xE28A, 0x922F, 0xE28B, 0x9230, 0xE28C, 0x9231, + 0xE28D, 0x9232, 0xE28E, 0x9233, 0xE28F, 0x9234, 0xE290, 0x9235, 0xE291, 0x9236, 0xE292, 0x9237, 0xE293, 0x9238, 0xE294, 0x9239, + 0xE295, 0x923A, 0xE296, 0x923B, 0xE297, 0x923C, 0xE298, 0x923D, 0xE299, 0x923E, 0xE29A, 0x923F, 0xE29B, 0x9240, 0xE29C, 0x9241, + 0xE29D, 0x9242, 0xE29E, 0x9243, 0xE29F, 0x9244, 0xE2A0, 0x9245, 0xE2A1, 0x72FB, 0xE2A2, 0x7317, 0xE2A3, 0x7313, 0xE2A4, 0x7321, + 0xE2A5, 0x730A, 0xE2A6, 0x731E, 0xE2A7, 0x731D, 0xE2A8, 0x7315, 0xE2A9, 0x7322, 0xE2AA, 0x7339, 0xE2AB, 0x7325, 0xE2AC, 0x732C, + 0xE2AD, 0x7338, 0xE2AE, 0x7331, 0xE2AF, 0x7350, 0xE2B0, 0x734D, 0xE2B1, 0x7357, 0xE2B2, 0x7360, 0xE2B3, 0x736C, 0xE2B4, 0x736F, + 0xE2B5, 0x737E, 0xE2B6, 0x821B, 0xE2B7, 0x5925, 0xE2B8, 0x98E7, 0xE2B9, 0x5924, 0xE2BA, 0x5902, 0xE2BB, 0x9963, 0xE2BC, 0x9967, + 0xE2BD, 0x9968, 0xE2BE, 0x9969, 0xE2BF, 0x996A, 0xE2C0, 0x996B, 0xE2C1, 0x996C, 0xE2C2, 0x9974, 0xE2C3, 0x9977, 0xE2C4, 0x997D, + 0xE2C5, 0x9980, 0xE2C6, 0x9984, 0xE2C7, 0x9987, 0xE2C8, 0x998A, 0xE2C9, 0x998D, 0xE2CA, 0x9990, 0xE2CB, 0x9991, 0xE2CC, 0x9993, + 0xE2CD, 0x9994, 0xE2CE, 0x9995, 0xE2CF, 0x5E80, 0xE2D0, 0x5E91, 0xE2D1, 0x5E8B, 0xE2D2, 0x5E96, 0xE2D3, 0x5EA5, 0xE2D4, 0x5EA0, + 0xE2D5, 0x5EB9, 0xE2D6, 0x5EB5, 0xE2D7, 0x5EBE, 0xE2D8, 0x5EB3, 0xE2D9, 0x8D53, 0xE2DA, 0x5ED2, 0xE2DB, 0x5ED1, 0xE2DC, 0x5EDB, + 0xE2DD, 0x5EE8, 0xE2DE, 0x5EEA, 0xE2DF, 0x81BA, 0xE2E0, 0x5FC4, 0xE2E1, 0x5FC9, 0xE2E2, 0x5FD6, 0xE2E3, 0x5FCF, 0xE2E4, 0x6003, + 0xE2E5, 0x5FEE, 0xE2E6, 0x6004, 0xE2E7, 0x5FE1, 0xE2E8, 0x5FE4, 0xE2E9, 0x5FFE, 0xE2EA, 0x6005, 0xE2EB, 0x6006, 0xE2EC, 0x5FEA, + 0xE2ED, 0x5FED, 0xE2EE, 0x5FF8, 0xE2EF, 0x6019, 0xE2F0, 0x6035, 0xE2F1, 0x6026, 0xE2F2, 0x601B, 0xE2F3, 0x600F, 0xE2F4, 0x600D, + 0xE2F5, 0x6029, 0xE2F6, 0x602B, 0xE2F7, 0x600A, 0xE2F8, 0x603F, 0xE2F9, 0x6021, 0xE2FA, 0x6078, 0xE2FB, 0x6079, 0xE2FC, 0x607B, + 0xE2FD, 0x607A, 0xE2FE, 0x6042, 0xE340, 0x9246, 0xE341, 0x9247, 0xE342, 0x9248, 0xE343, 0x9249, 0xE344, 0x924A, 0xE345, 0x924B, + 0xE346, 0x924C, 0xE347, 0x924D, 0xE348, 0x924E, 0xE349, 0x924F, 0xE34A, 0x9250, 0xE34B, 0x9251, 0xE34C, 0x9252, 0xE34D, 0x9253, + 0xE34E, 0x9254, 0xE34F, 0x9255, 0xE350, 0x9256, 0xE351, 0x9257, 0xE352, 0x9258, 0xE353, 0x9259, 0xE354, 0x925A, 0xE355, 0x925B, + 0xE356, 0x925C, 0xE357, 0x925D, 0xE358, 0x925E, 0xE359, 0x925F, 0xE35A, 0x9260, 0xE35B, 0x9261, 0xE35C, 0x9262, 0xE35D, 0x9263, + 0xE35E, 0x9264, 0xE35F, 0x9265, 0xE360, 0x9266, 0xE361, 0x9267, 0xE362, 0x9268, 0xE363, 0x9269, 0xE364, 0x926A, 0xE365, 0x926B, + 0xE366, 0x926C, 0xE367, 0x926D, 0xE368, 0x926E, 0xE369, 0x926F, 0xE36A, 0x9270, 0xE36B, 0x9271, 0xE36C, 0x9272, 0xE36D, 0x9273, + 0xE36E, 0x9275, 0xE36F, 0x9276, 0xE370, 0x9277, 0xE371, 0x9278, 0xE372, 0x9279, 0xE373, 0x927A, 0xE374, 0x927B, 0xE375, 0x927C, + 0xE376, 0x927D, 0xE377, 0x927E, 0xE378, 0x927F, 0xE379, 0x9280, 0xE37A, 0x9281, 0xE37B, 0x9282, 0xE37C, 0x9283, 0xE37D, 0x9284, + 0xE37E, 0x9285, 0xE380, 0x9286, 0xE381, 0x9287, 0xE382, 0x9288, 0xE383, 0x9289, 0xE384, 0x928A, 0xE385, 0x928B, 0xE386, 0x928C, + 0xE387, 0x928D, 0xE388, 0x928F, 0xE389, 0x9290, 0xE38A, 0x9291, 0xE38B, 0x9292, 0xE38C, 0x9293, 0xE38D, 0x9294, 0xE38E, 0x9295, + 0xE38F, 0x9296, 0xE390, 0x9297, 0xE391, 0x9298, 0xE392, 0x9299, 0xE393, 0x929A, 0xE394, 0x929B, 0xE395, 0x929C, 0xE396, 0x929D, + 0xE397, 0x929E, 0xE398, 0x929F, 0xE399, 0x92A0, 0xE39A, 0x92A1, 0xE39B, 0x92A2, 0xE39C, 0x92A3, 0xE39D, 0x92A4, 0xE39E, 0x92A5, + 0xE39F, 0x92A6, 0xE3A0, 0x92A7, 0xE3A1, 0x606A, 0xE3A2, 0x607D, 0xE3A3, 0x6096, 0xE3A4, 0x609A, 0xE3A5, 0x60AD, 0xE3A6, 0x609D, + 0xE3A7, 0x6083, 0xE3A8, 0x6092, 0xE3A9, 0x608C, 0xE3AA, 0x609B, 0xE3AB, 0x60EC, 0xE3AC, 0x60BB, 0xE3AD, 0x60B1, 0xE3AE, 0x60DD, + 0xE3AF, 0x60D8, 0xE3B0, 0x60C6, 0xE3B1, 0x60DA, 0xE3B2, 0x60B4, 0xE3B3, 0x6120, 0xE3B4, 0x6126, 0xE3B5, 0x6115, 0xE3B6, 0x6123, + 0xE3B7, 0x60F4, 0xE3B8, 0x6100, 0xE3B9, 0x610E, 0xE3BA, 0x612B, 0xE3BB, 0x614A, 0xE3BC, 0x6175, 0xE3BD, 0x61AC, 0xE3BE, 0x6194, + 0xE3BF, 0x61A7, 0xE3C0, 0x61B7, 0xE3C1, 0x61D4, 0xE3C2, 0x61F5, 0xE3C3, 0x5FDD, 0xE3C4, 0x96B3, 0xE3C5, 0x95E9, 0xE3C6, 0x95EB, + 0xE3C7, 0x95F1, 0xE3C8, 0x95F3, 0xE3C9, 0x95F5, 0xE3CA, 0x95F6, 0xE3CB, 0x95FC, 0xE3CC, 0x95FE, 0xE3CD, 0x9603, 0xE3CE, 0x9604, + 0xE3CF, 0x9606, 0xE3D0, 0x9608, 0xE3D1, 0x960A, 0xE3D2, 0x960B, 0xE3D3, 0x960C, 0xE3D4, 0x960D, 0xE3D5, 0x960F, 0xE3D6, 0x9612, + 0xE3D7, 0x9615, 0xE3D8, 0x9616, 0xE3D9, 0x9617, 0xE3DA, 0x9619, 0xE3DB, 0x961A, 0xE3DC, 0x4E2C, 0xE3DD, 0x723F, 0xE3DE, 0x6215, + 0xE3DF, 0x6C35, 0xE3E0, 0x6C54, 0xE3E1, 0x6C5C, 0xE3E2, 0x6C4A, 0xE3E3, 0x6CA3, 0xE3E4, 0x6C85, 0xE3E5, 0x6C90, 0xE3E6, 0x6C94, + 0xE3E7, 0x6C8C, 0xE3E8, 0x6C68, 0xE3E9, 0x6C69, 0xE3EA, 0x6C74, 0xE3EB, 0x6C76, 0xE3EC, 0x6C86, 0xE3ED, 0x6CA9, 0xE3EE, 0x6CD0, + 0xE3EF, 0x6CD4, 0xE3F0, 0x6CAD, 0xE3F1, 0x6CF7, 0xE3F2, 0x6CF8, 0xE3F3, 0x6CF1, 0xE3F4, 0x6CD7, 0xE3F5, 0x6CB2, 0xE3F6, 0x6CE0, + 0xE3F7, 0x6CD6, 0xE3F8, 0x6CFA, 0xE3F9, 0x6CEB, 0xE3FA, 0x6CEE, 0xE3FB, 0x6CB1, 0xE3FC, 0x6CD3, 0xE3FD, 0x6CEF, 0xE3FE, 0x6CFE, + 0xE440, 0x92A8, 0xE441, 0x92A9, 0xE442, 0x92AA, 0xE443, 0x92AB, 0xE444, 0x92AC, 0xE445, 0x92AD, 0xE446, 0x92AF, 0xE447, 0x92B0, + 0xE448, 0x92B1, 0xE449, 0x92B2, 0xE44A, 0x92B3, 0xE44B, 0x92B4, 0xE44C, 0x92B5, 0xE44D, 0x92B6, 0xE44E, 0x92B7, 0xE44F, 0x92B8, + 0xE450, 0x92B9, 0xE451, 0x92BA, 0xE452, 0x92BB, 0xE453, 0x92BC, 0xE454, 0x92BD, 0xE455, 0x92BE, 0xE456, 0x92BF, 0xE457, 0x92C0, + 0xE458, 0x92C1, 0xE459, 0x92C2, 0xE45A, 0x92C3, 0xE45B, 0x92C4, 0xE45C, 0x92C5, 0xE45D, 0x92C6, 0xE45E, 0x92C7, 0xE45F, 0x92C9, + 0xE460, 0x92CA, 0xE461, 0x92CB, 0xE462, 0x92CC, 0xE463, 0x92CD, 0xE464, 0x92CE, 0xE465, 0x92CF, 0xE466, 0x92D0, 0xE467, 0x92D1, + 0xE468, 0x92D2, 0xE469, 0x92D3, 0xE46A, 0x92D4, 0xE46B, 0x92D5, 0xE46C, 0x92D6, 0xE46D, 0x92D7, 0xE46E, 0x92D8, 0xE46F, 0x92D9, + 0xE470, 0x92DA, 0xE471, 0x92DB, 0xE472, 0x92DC, 0xE473, 0x92DD, 0xE474, 0x92DE, 0xE475, 0x92DF, 0xE476, 0x92E0, 0xE477, 0x92E1, + 0xE478, 0x92E2, 0xE479, 0x92E3, 0xE47A, 0x92E4, 0xE47B, 0x92E5, 0xE47C, 0x92E6, 0xE47D, 0x92E7, 0xE47E, 0x92E8, 0xE480, 0x92E9, + 0xE481, 0x92EA, 0xE482, 0x92EB, 0xE483, 0x92EC, 0xE484, 0x92ED, 0xE485, 0x92EE, 0xE486, 0x92EF, 0xE487, 0x92F0, 0xE488, 0x92F1, + 0xE489, 0x92F2, 0xE48A, 0x92F3, 0xE48B, 0x92F4, 0xE48C, 0x92F5, 0xE48D, 0x92F6, 0xE48E, 0x92F7, 0xE48F, 0x92F8, 0xE490, 0x92F9, + 0xE491, 0x92FA, 0xE492, 0x92FB, 0xE493, 0x92FC, 0xE494, 0x92FD, 0xE495, 0x92FE, 0xE496, 0x92FF, 0xE497, 0x9300, 0xE498, 0x9301, + 0xE499, 0x9302, 0xE49A, 0x9303, 0xE49B, 0x9304, 0xE49C, 0x9305, 0xE49D, 0x9306, 0xE49E, 0x9307, 0xE49F, 0x9308, 0xE4A0, 0x9309, + 0xE4A1, 0x6D39, 0xE4A2, 0x6D27, 0xE4A3, 0x6D0C, 0xE4A4, 0x6D43, 0xE4A5, 0x6D48, 0xE4A6, 0x6D07, 0xE4A7, 0x6D04, 0xE4A8, 0x6D19, + 0xE4A9, 0x6D0E, 0xE4AA, 0x6D2B, 0xE4AB, 0x6D4D, 0xE4AC, 0x6D2E, 0xE4AD, 0x6D35, 0xE4AE, 0x6D1A, 0xE4AF, 0x6D4F, 0xE4B0, 0x6D52, + 0xE4B1, 0x6D54, 0xE4B2, 0x6D33, 0xE4B3, 0x6D91, 0xE4B4, 0x6D6F, 0xE4B5, 0x6D9E, 0xE4B6, 0x6DA0, 0xE4B7, 0x6D5E, 0xE4B8, 0x6D93, + 0xE4B9, 0x6D94, 0xE4BA, 0x6D5C, 0xE4BB, 0x6D60, 0xE4BC, 0x6D7C, 0xE4BD, 0x6D63, 0xE4BE, 0x6E1A, 0xE4BF, 0x6DC7, 0xE4C0, 0x6DC5, + 0xE4C1, 0x6DDE, 0xE4C2, 0x6E0E, 0xE4C3, 0x6DBF, 0xE4C4, 0x6DE0, 0xE4C5, 0x6E11, 0xE4C6, 0x6DE6, 0xE4C7, 0x6DDD, 0xE4C8, 0x6DD9, + 0xE4C9, 0x6E16, 0xE4CA, 0x6DAB, 0xE4CB, 0x6E0C, 0xE4CC, 0x6DAE, 0xE4CD, 0x6E2B, 0xE4CE, 0x6E6E, 0xE4CF, 0x6E4E, 0xE4D0, 0x6E6B, + 0xE4D1, 0x6EB2, 0xE4D2, 0x6E5F, 0xE4D3, 0x6E86, 0xE4D4, 0x6E53, 0xE4D5, 0x6E54, 0xE4D6, 0x6E32, 0xE4D7, 0x6E25, 0xE4D8, 0x6E44, + 0xE4D9, 0x6EDF, 0xE4DA, 0x6EB1, 0xE4DB, 0x6E98, 0xE4DC, 0x6EE0, 0xE4DD, 0x6F2D, 0xE4DE, 0x6EE2, 0xE4DF, 0x6EA5, 0xE4E0, 0x6EA7, + 0xE4E1, 0x6EBD, 0xE4E2, 0x6EBB, 0xE4E3, 0x6EB7, 0xE4E4, 0x6ED7, 0xE4E5, 0x6EB4, 0xE4E6, 0x6ECF, 0xE4E7, 0x6E8F, 0xE4E8, 0x6EC2, + 0xE4E9, 0x6E9F, 0xE4EA, 0x6F62, 0xE4EB, 0x6F46, 0xE4EC, 0x6F47, 0xE4ED, 0x6F24, 0xE4EE, 0x6F15, 0xE4EF, 0x6EF9, 0xE4F0, 0x6F2F, + 0xE4F1, 0x6F36, 0xE4F2, 0x6F4B, 0xE4F3, 0x6F74, 0xE4F4, 0x6F2A, 0xE4F5, 0x6F09, 0xE4F6, 0x6F29, 0xE4F7, 0x6F89, 0xE4F8, 0x6F8D, + 0xE4F9, 0x6F8C, 0xE4FA, 0x6F78, 0xE4FB, 0x6F72, 0xE4FC, 0x6F7C, 0xE4FD, 0x6F7A, 0xE4FE, 0x6FD1, 0xE540, 0x930A, 0xE541, 0x930B, + 0xE542, 0x930C, 0xE543, 0x930D, 0xE544, 0x930E, 0xE545, 0x930F, 0xE546, 0x9310, 0xE547, 0x9311, 0xE548, 0x9312, 0xE549, 0x9313, + 0xE54A, 0x9314, 0xE54B, 0x9315, 0xE54C, 0x9316, 0xE54D, 0x9317, 0xE54E, 0x9318, 0xE54F, 0x9319, 0xE550, 0x931A, 0xE551, 0x931B, + 0xE552, 0x931C, 0xE553, 0x931D, 0xE554, 0x931E, 0xE555, 0x931F, 0xE556, 0x9320, 0xE557, 0x9321, 0xE558, 0x9322, 0xE559, 0x9323, + 0xE55A, 0x9324, 0xE55B, 0x9325, 0xE55C, 0x9326, 0xE55D, 0x9327, 0xE55E, 0x9328, 0xE55F, 0x9329, 0xE560, 0x932A, 0xE561, 0x932B, + 0xE562, 0x932C, 0xE563, 0x932D, 0xE564, 0x932E, 0xE565, 0x932F, 0xE566, 0x9330, 0xE567, 0x9331, 0xE568, 0x9332, 0xE569, 0x9333, + 0xE56A, 0x9334, 0xE56B, 0x9335, 0xE56C, 0x9336, 0xE56D, 0x9337, 0xE56E, 0x9338, 0xE56F, 0x9339, 0xE570, 0x933A, 0xE571, 0x933B, + 0xE572, 0x933C, 0xE573, 0x933D, 0xE574, 0x933F, 0xE575, 0x9340, 0xE576, 0x9341, 0xE577, 0x9342, 0xE578, 0x9343, 0xE579, 0x9344, + 0xE57A, 0x9345, 0xE57B, 0x9346, 0xE57C, 0x9347, 0xE57D, 0x9348, 0xE57E, 0x9349, 0xE580, 0x934A, 0xE581, 0x934B, 0xE582, 0x934C, + 0xE583, 0x934D, 0xE584, 0x934E, 0xE585, 0x934F, 0xE586, 0x9350, 0xE587, 0x9351, 0xE588, 0x9352, 0xE589, 0x9353, 0xE58A, 0x9354, + 0xE58B, 0x9355, 0xE58C, 0x9356, 0xE58D, 0x9357, 0xE58E, 0x9358, 0xE58F, 0x9359, 0xE590, 0x935A, 0xE591, 0x935B, 0xE592, 0x935C, + 0xE593, 0x935D, 0xE594, 0x935E, 0xE595, 0x935F, 0xE596, 0x9360, 0xE597, 0x9361, 0xE598, 0x9362, 0xE599, 0x9363, 0xE59A, 0x9364, + 0xE59B, 0x9365, 0xE59C, 0x9366, 0xE59D, 0x9367, 0xE59E, 0x9368, 0xE59F, 0x9369, 0xE5A0, 0x936B, 0xE5A1, 0x6FC9, 0xE5A2, 0x6FA7, + 0xE5A3, 0x6FB9, 0xE5A4, 0x6FB6, 0xE5A5, 0x6FC2, 0xE5A6, 0x6FE1, 0xE5A7, 0x6FEE, 0xE5A8, 0x6FDE, 0xE5A9, 0x6FE0, 0xE5AA, 0x6FEF, + 0xE5AB, 0x701A, 0xE5AC, 0x7023, 0xE5AD, 0x701B, 0xE5AE, 0x7039, 0xE5AF, 0x7035, 0xE5B0, 0x704F, 0xE5B1, 0x705E, 0xE5B2, 0x5B80, + 0xE5B3, 0x5B84, 0xE5B4, 0x5B95, 0xE5B5, 0x5B93, 0xE5B6, 0x5BA5, 0xE5B7, 0x5BB8, 0xE5B8, 0x752F, 0xE5B9, 0x9A9E, 0xE5BA, 0x6434, + 0xE5BB, 0x5BE4, 0xE5BC, 0x5BEE, 0xE5BD, 0x8930, 0xE5BE, 0x5BF0, 0xE5BF, 0x8E47, 0xE5C0, 0x8B07, 0xE5C1, 0x8FB6, 0xE5C2, 0x8FD3, + 0xE5C3, 0x8FD5, 0xE5C4, 0x8FE5, 0xE5C5, 0x8FEE, 0xE5C6, 0x8FE4, 0xE5C7, 0x8FE9, 0xE5C8, 0x8FE6, 0xE5C9, 0x8FF3, 0xE5CA, 0x8FE8, + 0xE5CB, 0x9005, 0xE5CC, 0x9004, 0xE5CD, 0x900B, 0xE5CE, 0x9026, 0xE5CF, 0x9011, 0xE5D0, 0x900D, 0xE5D1, 0x9016, 0xE5D2, 0x9021, + 0xE5D3, 0x9035, 0xE5D4, 0x9036, 0xE5D5, 0x902D, 0xE5D6, 0x902F, 0xE5D7, 0x9044, 0xE5D8, 0x9051, 0xE5D9, 0x9052, 0xE5DA, 0x9050, + 0xE5DB, 0x9068, 0xE5DC, 0x9058, 0xE5DD, 0x9062, 0xE5DE, 0x905B, 0xE5DF, 0x66B9, 0xE5E0, 0x9074, 0xE5E1, 0x907D, 0xE5E2, 0x9082, + 0xE5E3, 0x9088, 0xE5E4, 0x9083, 0xE5E5, 0x908B, 0xE5E6, 0x5F50, 0xE5E7, 0x5F57, 0xE5E8, 0x5F56, 0xE5E9, 0x5F58, 0xE5EA, 0x5C3B, + 0xE5EB, 0x54AB, 0xE5EC, 0x5C50, 0xE5ED, 0x5C59, 0xE5EE, 0x5B71, 0xE5EF, 0x5C63, 0xE5F0, 0x5C66, 0xE5F1, 0x7FBC, 0xE5F2, 0x5F2A, + 0xE5F3, 0x5F29, 0xE5F4, 0x5F2D, 0xE5F5, 0x8274, 0xE5F6, 0x5F3C, 0xE5F7, 0x9B3B, 0xE5F8, 0x5C6E, 0xE5F9, 0x5981, 0xE5FA, 0x5983, + 0xE5FB, 0x598D, 0xE5FC, 0x59A9, 0xE5FD, 0x59AA, 0xE5FE, 0x59A3, 0xE640, 0x936C, 0xE641, 0x936D, 0xE642, 0x936E, 0xE643, 0x936F, + 0xE644, 0x9370, 0xE645, 0x9371, 0xE646, 0x9372, 0xE647, 0x9373, 0xE648, 0x9374, 0xE649, 0x9375, 0xE64A, 0x9376, 0xE64B, 0x9377, + 0xE64C, 0x9378, 0xE64D, 0x9379, 0xE64E, 0x937A, 0xE64F, 0x937B, 0xE650, 0x937C, 0xE651, 0x937D, 0xE652, 0x937E, 0xE653, 0x937F, + 0xE654, 0x9380, 0xE655, 0x9381, 0xE656, 0x9382, 0xE657, 0x9383, 0xE658, 0x9384, 0xE659, 0x9385, 0xE65A, 0x9386, 0xE65B, 0x9387, + 0xE65C, 0x9388, 0xE65D, 0x9389, 0xE65E, 0x938A, 0xE65F, 0x938B, 0xE660, 0x938C, 0xE661, 0x938D, 0xE662, 0x938E, 0xE663, 0x9390, + 0xE664, 0x9391, 0xE665, 0x9392, 0xE666, 0x9393, 0xE667, 0x9394, 0xE668, 0x9395, 0xE669, 0x9396, 0xE66A, 0x9397, 0xE66B, 0x9398, + 0xE66C, 0x9399, 0xE66D, 0x939A, 0xE66E, 0x939B, 0xE66F, 0x939C, 0xE670, 0x939D, 0xE671, 0x939E, 0xE672, 0x939F, 0xE673, 0x93A0, + 0xE674, 0x93A1, 0xE675, 0x93A2, 0xE676, 0x93A3, 0xE677, 0x93A4, 0xE678, 0x93A5, 0xE679, 0x93A6, 0xE67A, 0x93A7, 0xE67B, 0x93A8, + 0xE67C, 0x93A9, 0xE67D, 0x93AA, 0xE67E, 0x93AB, 0xE680, 0x93AC, 0xE681, 0x93AD, 0xE682, 0x93AE, 0xE683, 0x93AF, 0xE684, 0x93B0, + 0xE685, 0x93B1, 0xE686, 0x93B2, 0xE687, 0x93B3, 0xE688, 0x93B4, 0xE689, 0x93B5, 0xE68A, 0x93B6, 0xE68B, 0x93B7, 0xE68C, 0x93B8, + 0xE68D, 0x93B9, 0xE68E, 0x93BA, 0xE68F, 0x93BB, 0xE690, 0x93BC, 0xE691, 0x93BD, 0xE692, 0x93BE, 0xE693, 0x93BF, 0xE694, 0x93C0, + 0xE695, 0x93C1, 0xE696, 0x93C2, 0xE697, 0x93C3, 0xE698, 0x93C4, 0xE699, 0x93C5, 0xE69A, 0x93C6, 0xE69B, 0x93C7, 0xE69C, 0x93C8, + 0xE69D, 0x93C9, 0xE69E, 0x93CB, 0xE69F, 0x93CC, 0xE6A0, 0x93CD, 0xE6A1, 0x5997, 0xE6A2, 0x59CA, 0xE6A3, 0x59AB, 0xE6A4, 0x599E, + 0xE6A5, 0x59A4, 0xE6A6, 0x59D2, 0xE6A7, 0x59B2, 0xE6A8, 0x59AF, 0xE6A9, 0x59D7, 0xE6AA, 0x59BE, 0xE6AB, 0x5A05, 0xE6AC, 0x5A06, + 0xE6AD, 0x59DD, 0xE6AE, 0x5A08, 0xE6AF, 0x59E3, 0xE6B0, 0x59D8, 0xE6B1, 0x59F9, 0xE6B2, 0x5A0C, 0xE6B3, 0x5A09, 0xE6B4, 0x5A32, + 0xE6B5, 0x5A34, 0xE6B6, 0x5A11, 0xE6B7, 0x5A23, 0xE6B8, 0x5A13, 0xE6B9, 0x5A40, 0xE6BA, 0x5A67, 0xE6BB, 0x5A4A, 0xE6BC, 0x5A55, + 0xE6BD, 0x5A3C, 0xE6BE, 0x5A62, 0xE6BF, 0x5A75, 0xE6C0, 0x80EC, 0xE6C1, 0x5AAA, 0xE6C2, 0x5A9B, 0xE6C3, 0x5A77, 0xE6C4, 0x5A7A, + 0xE6C5, 0x5ABE, 0xE6C6, 0x5AEB, 0xE6C7, 0x5AB2, 0xE6C8, 0x5AD2, 0xE6C9, 0x5AD4, 0xE6CA, 0x5AB8, 0xE6CB, 0x5AE0, 0xE6CC, 0x5AE3, + 0xE6CD, 0x5AF1, 0xE6CE, 0x5AD6, 0xE6CF, 0x5AE6, 0xE6D0, 0x5AD8, 0xE6D1, 0x5ADC, 0xE6D2, 0x5B09, 0xE6D3, 0x5B17, 0xE6D4, 0x5B16, + 0xE6D5, 0x5B32, 0xE6D6, 0x5B37, 0xE6D7, 0x5B40, 0xE6D8, 0x5C15, 0xE6D9, 0x5C1C, 0xE6DA, 0x5B5A, 0xE6DB, 0x5B65, 0xE6DC, 0x5B73, + 0xE6DD, 0x5B51, 0xE6DE, 0x5B53, 0xE6DF, 0x5B62, 0xE6E0, 0x9A75, 0xE6E1, 0x9A77, 0xE6E2, 0x9A78, 0xE6E3, 0x9A7A, 0xE6E4, 0x9A7F, + 0xE6E5, 0x9A7D, 0xE6E6, 0x9A80, 0xE6E7, 0x9A81, 0xE6E8, 0x9A85, 0xE6E9, 0x9A88, 0xE6EA, 0x9A8A, 0xE6EB, 0x9A90, 0xE6EC, 0x9A92, + 0xE6ED, 0x9A93, 0xE6EE, 0x9A96, 0xE6EF, 0x9A98, 0xE6F0, 0x9A9B, 0xE6F1, 0x9A9C, 0xE6F2, 0x9A9D, 0xE6F3, 0x9A9F, 0xE6F4, 0x9AA0, + 0xE6F5, 0x9AA2, 0xE6F6, 0x9AA3, 0xE6F7, 0x9AA5, 0xE6F8, 0x9AA7, 0xE6F9, 0x7E9F, 0xE6FA, 0x7EA1, 0xE6FB, 0x7EA3, 0xE6FC, 0x7EA5, + 0xE6FD, 0x7EA8, 0xE6FE, 0x7EA9, 0xE740, 0x93CE, 0xE741, 0x93CF, 0xE742, 0x93D0, 0xE743, 0x93D1, 0xE744, 0x93D2, 0xE745, 0x93D3, + 0xE746, 0x93D4, 0xE747, 0x93D5, 0xE748, 0x93D7, 0xE749, 0x93D8, 0xE74A, 0x93D9, 0xE74B, 0x93DA, 0xE74C, 0x93DB, 0xE74D, 0x93DC, + 0xE74E, 0x93DD, 0xE74F, 0x93DE, 0xE750, 0x93DF, 0xE751, 0x93E0, 0xE752, 0x93E1, 0xE753, 0x93E2, 0xE754, 0x93E3, 0xE755, 0x93E4, + 0xE756, 0x93E5, 0xE757, 0x93E6, 0xE758, 0x93E7, 0xE759, 0x93E8, 0xE75A, 0x93E9, 0xE75B, 0x93EA, 0xE75C, 0x93EB, 0xE75D, 0x93EC, + 0xE75E, 0x93ED, 0xE75F, 0x93EE, 0xE760, 0x93EF, 0xE761, 0x93F0, 0xE762, 0x93F1, 0xE763, 0x93F2, 0xE764, 0x93F3, 0xE765, 0x93F4, + 0xE766, 0x93F5, 0xE767, 0x93F6, 0xE768, 0x93F7, 0xE769, 0x93F8, 0xE76A, 0x93F9, 0xE76B, 0x93FA, 0xE76C, 0x93FB, 0xE76D, 0x93FC, + 0xE76E, 0x93FD, 0xE76F, 0x93FE, 0xE770, 0x93FF, 0xE771, 0x9400, 0xE772, 0x9401, 0xE773, 0x9402, 0xE774, 0x9403, 0xE775, 0x9404, + 0xE776, 0x9405, 0xE777, 0x9406, 0xE778, 0x9407, 0xE779, 0x9408, 0xE77A, 0x9409, 0xE77B, 0x940A, 0xE77C, 0x940B, 0xE77D, 0x940C, + 0xE77E, 0x940D, 0xE780, 0x940E, 0xE781, 0x940F, 0xE782, 0x9410, 0xE783, 0x9411, 0xE784, 0x9412, 0xE785, 0x9413, 0xE786, 0x9414, + 0xE787, 0x9415, 0xE788, 0x9416, 0xE789, 0x9417, 0xE78A, 0x9418, 0xE78B, 0x9419, 0xE78C, 0x941A, 0xE78D, 0x941B, 0xE78E, 0x941C, + 0xE78F, 0x941D, 0xE790, 0x941E, 0xE791, 0x941F, 0xE792, 0x9420, 0xE793, 0x9421, 0xE794, 0x9422, 0xE795, 0x9423, 0xE796, 0x9424, + 0xE797, 0x9425, 0xE798, 0x9426, 0xE799, 0x9427, 0xE79A, 0x9428, 0xE79B, 0x9429, 0xE79C, 0x942A, 0xE79D, 0x942B, 0xE79E, 0x942C, + 0xE79F, 0x942D, 0xE7A0, 0x942E, 0xE7A1, 0x7EAD, 0xE7A2, 0x7EB0, 0xE7A3, 0x7EBE, 0xE7A4, 0x7EC0, 0xE7A5, 0x7EC1, 0xE7A6, 0x7EC2, + 0xE7A7, 0x7EC9, 0xE7A8, 0x7ECB, 0xE7A9, 0x7ECC, 0xE7AA, 0x7ED0, 0xE7AB, 0x7ED4, 0xE7AC, 0x7ED7, 0xE7AD, 0x7EDB, 0xE7AE, 0x7EE0, + 0xE7AF, 0x7EE1, 0xE7B0, 0x7EE8, 0xE7B1, 0x7EEB, 0xE7B2, 0x7EEE, 0xE7B3, 0x7EEF, 0xE7B4, 0x7EF1, 0xE7B5, 0x7EF2, 0xE7B6, 0x7F0D, + 0xE7B7, 0x7EF6, 0xE7B8, 0x7EFA, 0xE7B9, 0x7EFB, 0xE7BA, 0x7EFE, 0xE7BB, 0x7F01, 0xE7BC, 0x7F02, 0xE7BD, 0x7F03, 0xE7BE, 0x7F07, + 0xE7BF, 0x7F08, 0xE7C0, 0x7F0B, 0xE7C1, 0x7F0C, 0xE7C2, 0x7F0F, 0xE7C3, 0x7F11, 0xE7C4, 0x7F12, 0xE7C5, 0x7F17, 0xE7C6, 0x7F19, + 0xE7C7, 0x7F1C, 0xE7C8, 0x7F1B, 0xE7C9, 0x7F1F, 0xE7CA, 0x7F21, 0xE7CB, 0x7F22, 0xE7CC, 0x7F23, 0xE7CD, 0x7F24, 0xE7CE, 0x7F25, + 0xE7CF, 0x7F26, 0xE7D0, 0x7F27, 0xE7D1, 0x7F2A, 0xE7D2, 0x7F2B, 0xE7D3, 0x7F2C, 0xE7D4, 0x7F2D, 0xE7D5, 0x7F2F, 0xE7D6, 0x7F30, + 0xE7D7, 0x7F31, 0xE7D8, 0x7F32, 0xE7D9, 0x7F33, 0xE7DA, 0x7F35, 0xE7DB, 0x5E7A, 0xE7DC, 0x757F, 0xE7DD, 0x5DDB, 0xE7DE, 0x753E, + 0xE7DF, 0x9095, 0xE7E0, 0x738E, 0xE7E1, 0x7391, 0xE7E2, 0x73AE, 0xE7E3, 0x73A2, 0xE7E4, 0x739F, 0xE7E5, 0x73CF, 0xE7E6, 0x73C2, + 0xE7E7, 0x73D1, 0xE7E8, 0x73B7, 0xE7E9, 0x73B3, 0xE7EA, 0x73C0, 0xE7EB, 0x73C9, 0xE7EC, 0x73C8, 0xE7ED, 0x73E5, 0xE7EE, 0x73D9, + 0xE7EF, 0x987C, 0xE7F0, 0x740A, 0xE7F1, 0x73E9, 0xE7F2, 0x73E7, 0xE7F3, 0x73DE, 0xE7F4, 0x73BA, 0xE7F5, 0x73F2, 0xE7F6, 0x740F, + 0xE7F7, 0x742A, 0xE7F8, 0x745B, 0xE7F9, 0x7426, 0xE7FA, 0x7425, 0xE7FB, 0x7428, 0xE7FC, 0x7430, 0xE7FD, 0x742E, 0xE7FE, 0x742C, + 0xE840, 0x942F, 0xE841, 0x9430, 0xE842, 0x9431, 0xE843, 0x9432, 0xE844, 0x9433, 0xE845, 0x9434, 0xE846, 0x9435, 0xE847, 0x9436, + 0xE848, 0x9437, 0xE849, 0x9438, 0xE84A, 0x9439, 0xE84B, 0x943A, 0xE84C, 0x943B, 0xE84D, 0x943C, 0xE84E, 0x943D, 0xE84F, 0x943F, + 0xE850, 0x9440, 0xE851, 0x9441, 0xE852, 0x9442, 0xE853, 0x9443, 0xE854, 0x9444, 0xE855, 0x9445, 0xE856, 0x9446, 0xE857, 0x9447, + 0xE858, 0x9448, 0xE859, 0x9449, 0xE85A, 0x944A, 0xE85B, 0x944B, 0xE85C, 0x944C, 0xE85D, 0x944D, 0xE85E, 0x944E, 0xE85F, 0x944F, + 0xE860, 0x9450, 0xE861, 0x9451, 0xE862, 0x9452, 0xE863, 0x9453, 0xE864, 0x9454, 0xE865, 0x9455, 0xE866, 0x9456, 0xE867, 0x9457, + 0xE868, 0x9458, 0xE869, 0x9459, 0xE86A, 0x945A, 0xE86B, 0x945B, 0xE86C, 0x945C, 0xE86D, 0x945D, 0xE86E, 0x945E, 0xE86F, 0x945F, + 0xE870, 0x9460, 0xE871, 0x9461, 0xE872, 0x9462, 0xE873, 0x9463, 0xE874, 0x9464, 0xE875, 0x9465, 0xE876, 0x9466, 0xE877, 0x9467, + 0xE878, 0x9468, 0xE879, 0x9469, 0xE87A, 0x946A, 0xE87B, 0x946C, 0xE87C, 0x946D, 0xE87D, 0x946E, 0xE87E, 0x946F, 0xE880, 0x9470, + 0xE881, 0x9471, 0xE882, 0x9472, 0xE883, 0x9473, 0xE884, 0x9474, 0xE885, 0x9475, 0xE886, 0x9476, 0xE887, 0x9477, 0xE888, 0x9478, + 0xE889, 0x9479, 0xE88A, 0x947A, 0xE88B, 0x947B, 0xE88C, 0x947C, 0xE88D, 0x947D, 0xE88E, 0x947E, 0xE88F, 0x947F, 0xE890, 0x9480, + 0xE891, 0x9481, 0xE892, 0x9482, 0xE893, 0x9483, 0xE894, 0x9484, 0xE895, 0x9491, 0xE896, 0x9496, 0xE897, 0x9498, 0xE898, 0x94C7, + 0xE899, 0x94CF, 0xE89A, 0x94D3, 0xE89B, 0x94D4, 0xE89C, 0x94DA, 0xE89D, 0x94E6, 0xE89E, 0x94FB, 0xE89F, 0x951C, 0xE8A0, 0x9520, + 0xE8A1, 0x741B, 0xE8A2, 0x741A, 0xE8A3, 0x7441, 0xE8A4, 0x745C, 0xE8A5, 0x7457, 0xE8A6, 0x7455, 0xE8A7, 0x7459, 0xE8A8, 0x7477, + 0xE8A9, 0x746D, 0xE8AA, 0x747E, 0xE8AB, 0x749C, 0xE8AC, 0x748E, 0xE8AD, 0x7480, 0xE8AE, 0x7481, 0xE8AF, 0x7487, 0xE8B0, 0x748B, + 0xE8B1, 0x749E, 0xE8B2, 0x74A8, 0xE8B3, 0x74A9, 0xE8B4, 0x7490, 0xE8B5, 0x74A7, 0xE8B6, 0x74D2, 0xE8B7, 0x74BA, 0xE8B8, 0x97EA, + 0xE8B9, 0x97EB, 0xE8BA, 0x97EC, 0xE8BB, 0x674C, 0xE8BC, 0x6753, 0xE8BD, 0x675E, 0xE8BE, 0x6748, 0xE8BF, 0x6769, 0xE8C0, 0x67A5, + 0xE8C1, 0x6787, 0xE8C2, 0x676A, 0xE8C3, 0x6773, 0xE8C4, 0x6798, 0xE8C5, 0x67A7, 0xE8C6, 0x6775, 0xE8C7, 0x67A8, 0xE8C8, 0x679E, + 0xE8C9, 0x67AD, 0xE8CA, 0x678B, 0xE8CB, 0x6777, 0xE8CC, 0x677C, 0xE8CD, 0x67F0, 0xE8CE, 0x6809, 0xE8CF, 0x67D8, 0xE8D0, 0x680A, + 0xE8D1, 0x67E9, 0xE8D2, 0x67B0, 0xE8D3, 0x680C, 0xE8D4, 0x67D9, 0xE8D5, 0x67B5, 0xE8D6, 0x67DA, 0xE8D7, 0x67B3, 0xE8D8, 0x67DD, + 0xE8D9, 0x6800, 0xE8DA, 0x67C3, 0xE8DB, 0x67B8, 0xE8DC, 0x67E2, 0xE8DD, 0x680E, 0xE8DE, 0x67C1, 0xE8DF, 0x67FD, 0xE8E0, 0x6832, + 0xE8E1, 0x6833, 0xE8E2, 0x6860, 0xE8E3, 0x6861, 0xE8E4, 0x684E, 0xE8E5, 0x6862, 0xE8E6, 0x6844, 0xE8E7, 0x6864, 0xE8E8, 0x6883, + 0xE8E9, 0x681D, 0xE8EA, 0x6855, 0xE8EB, 0x6866, 0xE8EC, 0x6841, 0xE8ED, 0x6867, 0xE8EE, 0x6840, 0xE8EF, 0x683E, 0xE8F0, 0x684A, + 0xE8F1, 0x6849, 0xE8F2, 0x6829, 0xE8F3, 0x68B5, 0xE8F4, 0x688F, 0xE8F5, 0x6874, 0xE8F6, 0x6877, 0xE8F7, 0x6893, 0xE8F8, 0x686B, + 0xE8F9, 0x68C2, 0xE8FA, 0x696E, 0xE8FB, 0x68FC, 0xE8FC, 0x691F, 0xE8FD, 0x6920, 0xE8FE, 0x68F9, 0xE940, 0x9527, 0xE941, 0x9533, + 0xE942, 0x953D, 0xE943, 0x9543, 0xE944, 0x9548, 0xE945, 0x954B, 0xE946, 0x9555, 0xE947, 0x955A, 0xE948, 0x9560, 0xE949, 0x956E, + 0xE94A, 0x9574, 0xE94B, 0x9575, 0xE94C, 0x9577, 0xE94D, 0x9578, 0xE94E, 0x9579, 0xE94F, 0x957A, 0xE950, 0x957B, 0xE951, 0x957C, + 0xE952, 0x957D, 0xE953, 0x957E, 0xE954, 0x9580, 0xE955, 0x9581, 0xE956, 0x9582, 0xE957, 0x9583, 0xE958, 0x9584, 0xE959, 0x9585, + 0xE95A, 0x9586, 0xE95B, 0x9587, 0xE95C, 0x9588, 0xE95D, 0x9589, 0xE95E, 0x958A, 0xE95F, 0x958B, 0xE960, 0x958C, 0xE961, 0x958D, + 0xE962, 0x958E, 0xE963, 0x958F, 0xE964, 0x9590, 0xE965, 0x9591, 0xE966, 0x9592, 0xE967, 0x9593, 0xE968, 0x9594, 0xE969, 0x9595, + 0xE96A, 0x9596, 0xE96B, 0x9597, 0xE96C, 0x9598, 0xE96D, 0x9599, 0xE96E, 0x959A, 0xE96F, 0x959B, 0xE970, 0x959C, 0xE971, 0x959D, + 0xE972, 0x959E, 0xE973, 0x959F, 0xE974, 0x95A0, 0xE975, 0x95A1, 0xE976, 0x95A2, 0xE977, 0x95A3, 0xE978, 0x95A4, 0xE979, 0x95A5, + 0xE97A, 0x95A6, 0xE97B, 0x95A7, 0xE97C, 0x95A8, 0xE97D, 0x95A9, 0xE97E, 0x95AA, 0xE980, 0x95AB, 0xE981, 0x95AC, 0xE982, 0x95AD, + 0xE983, 0x95AE, 0xE984, 0x95AF, 0xE985, 0x95B0, 0xE986, 0x95B1, 0xE987, 0x95B2, 0xE988, 0x95B3, 0xE989, 0x95B4, 0xE98A, 0x95B5, + 0xE98B, 0x95B6, 0xE98C, 0x95B7, 0xE98D, 0x95B8, 0xE98E, 0x95B9, 0xE98F, 0x95BA, 0xE990, 0x95BB, 0xE991, 0x95BC, 0xE992, 0x95BD, + 0xE993, 0x95BE, 0xE994, 0x95BF, 0xE995, 0x95C0, 0xE996, 0x95C1, 0xE997, 0x95C2, 0xE998, 0x95C3, 0xE999, 0x95C4, 0xE99A, 0x95C5, + 0xE99B, 0x95C6, 0xE99C, 0x95C7, 0xE99D, 0x95C8, 0xE99E, 0x95C9, 0xE99F, 0x95CA, 0xE9A0, 0x95CB, 0xE9A1, 0x6924, 0xE9A2, 0x68F0, + 0xE9A3, 0x690B, 0xE9A4, 0x6901, 0xE9A5, 0x6957, 0xE9A6, 0x68E3, 0xE9A7, 0x6910, 0xE9A8, 0x6971, 0xE9A9, 0x6939, 0xE9AA, 0x6960, + 0xE9AB, 0x6942, 0xE9AC, 0x695D, 0xE9AD, 0x6984, 0xE9AE, 0x696B, 0xE9AF, 0x6980, 0xE9B0, 0x6998, 0xE9B1, 0x6978, 0xE9B2, 0x6934, + 0xE9B3, 0x69CC, 0xE9B4, 0x6987, 0xE9B5, 0x6988, 0xE9B6, 0x69CE, 0xE9B7, 0x6989, 0xE9B8, 0x6966, 0xE9B9, 0x6963, 0xE9BA, 0x6979, + 0xE9BB, 0x699B, 0xE9BC, 0x69A7, 0xE9BD, 0x69BB, 0xE9BE, 0x69AB, 0xE9BF, 0x69AD, 0xE9C0, 0x69D4, 0xE9C1, 0x69B1, 0xE9C2, 0x69C1, + 0xE9C3, 0x69CA, 0xE9C4, 0x69DF, 0xE9C5, 0x6995, 0xE9C6, 0x69E0, 0xE9C7, 0x698D, 0xE9C8, 0x69FF, 0xE9C9, 0x6A2F, 0xE9CA, 0x69ED, + 0xE9CB, 0x6A17, 0xE9CC, 0x6A18, 0xE9CD, 0x6A65, 0xE9CE, 0x69F2, 0xE9CF, 0x6A44, 0xE9D0, 0x6A3E, 0xE9D1, 0x6AA0, 0xE9D2, 0x6A50, + 0xE9D3, 0x6A5B, 0xE9D4, 0x6A35, 0xE9D5, 0x6A8E, 0xE9D6, 0x6A79, 0xE9D7, 0x6A3D, 0xE9D8, 0x6A28, 0xE9D9, 0x6A58, 0xE9DA, 0x6A7C, + 0xE9DB, 0x6A91, 0xE9DC, 0x6A90, 0xE9DD, 0x6AA9, 0xE9DE, 0x6A97, 0xE9DF, 0x6AAB, 0xE9E0, 0x7337, 0xE9E1, 0x7352, 0xE9E2, 0x6B81, + 0xE9E3, 0x6B82, 0xE9E4, 0x6B87, 0xE9E5, 0x6B84, 0xE9E6, 0x6B92, 0xE9E7, 0x6B93, 0xE9E8, 0x6B8D, 0xE9E9, 0x6B9A, 0xE9EA, 0x6B9B, + 0xE9EB, 0x6BA1, 0xE9EC, 0x6BAA, 0xE9ED, 0x8F6B, 0xE9EE, 0x8F6D, 0xE9EF, 0x8F71, 0xE9F0, 0x8F72, 0xE9F1, 0x8F73, 0xE9F2, 0x8F75, + 0xE9F3, 0x8F76, 0xE9F4, 0x8F78, 0xE9F5, 0x8F77, 0xE9F6, 0x8F79, 0xE9F7, 0x8F7A, 0xE9F8, 0x8F7C, 0xE9F9, 0x8F7E, 0xE9FA, 0x8F81, + 0xE9FB, 0x8F82, 0xE9FC, 0x8F84, 0xE9FD, 0x8F87, 0xE9FE, 0x8F8B, 0xEA40, 0x95CC, 0xEA41, 0x95CD, 0xEA42, 0x95CE, 0xEA43, 0x95CF, + 0xEA44, 0x95D0, 0xEA45, 0x95D1, 0xEA46, 0x95D2, 0xEA47, 0x95D3, 0xEA48, 0x95D4, 0xEA49, 0x95D5, 0xEA4A, 0x95D6, 0xEA4B, 0x95D7, + 0xEA4C, 0x95D8, 0xEA4D, 0x95D9, 0xEA4E, 0x95DA, 0xEA4F, 0x95DB, 0xEA50, 0x95DC, 0xEA51, 0x95DD, 0xEA52, 0x95DE, 0xEA53, 0x95DF, + 0xEA54, 0x95E0, 0xEA55, 0x95E1, 0xEA56, 0x95E2, 0xEA57, 0x95E3, 0xEA58, 0x95E4, 0xEA59, 0x95E5, 0xEA5A, 0x95E6, 0xEA5B, 0x95E7, + 0xEA5C, 0x95EC, 0xEA5D, 0x95FF, 0xEA5E, 0x9607, 0xEA5F, 0x9613, 0xEA60, 0x9618, 0xEA61, 0x961B, 0xEA62, 0x961E, 0xEA63, 0x9620, + 0xEA64, 0x9623, 0xEA65, 0x9624, 0xEA66, 0x9625, 0xEA67, 0x9626, 0xEA68, 0x9627, 0xEA69, 0x9628, 0xEA6A, 0x9629, 0xEA6B, 0x962B, + 0xEA6C, 0x962C, 0xEA6D, 0x962D, 0xEA6E, 0x962F, 0xEA6F, 0x9630, 0xEA70, 0x9637, 0xEA71, 0x9638, 0xEA72, 0x9639, 0xEA73, 0x963A, + 0xEA74, 0x963E, 0xEA75, 0x9641, 0xEA76, 0x9643, 0xEA77, 0x964A, 0xEA78, 0x964E, 0xEA79, 0x964F, 0xEA7A, 0x9651, 0xEA7B, 0x9652, + 0xEA7C, 0x9653, 0xEA7D, 0x9656, 0xEA7E, 0x9657, 0xEA80, 0x9658, 0xEA81, 0x9659, 0xEA82, 0x965A, 0xEA83, 0x965C, 0xEA84, 0x965D, + 0xEA85, 0x965E, 0xEA86, 0x9660, 0xEA87, 0x9663, 0xEA88, 0x9665, 0xEA89, 0x9666, 0xEA8A, 0x966B, 0xEA8B, 0x966D, 0xEA8C, 0x966E, + 0xEA8D, 0x966F, 0xEA8E, 0x9670, 0xEA8F, 0x9671, 0xEA90, 0x9673, 0xEA91, 0x9678, 0xEA92, 0x9679, 0xEA93, 0x967A, 0xEA94, 0x967B, + 0xEA95, 0x967C, 0xEA96, 0x967D, 0xEA97, 0x967E, 0xEA98, 0x967F, 0xEA99, 0x9680, 0xEA9A, 0x9681, 0xEA9B, 0x9682, 0xEA9C, 0x9683, + 0xEA9D, 0x9684, 0xEA9E, 0x9687, 0xEA9F, 0x9689, 0xEAA0, 0x968A, 0xEAA1, 0x8F8D, 0xEAA2, 0x8F8E, 0xEAA3, 0x8F8F, 0xEAA4, 0x8F98, + 0xEAA5, 0x8F9A, 0xEAA6, 0x8ECE, 0xEAA7, 0x620B, 0xEAA8, 0x6217, 0xEAA9, 0x621B, 0xEAAA, 0x621F, 0xEAAB, 0x6222, 0xEAAC, 0x6221, + 0xEAAD, 0x6225, 0xEAAE, 0x6224, 0xEAAF, 0x622C, 0xEAB0, 0x81E7, 0xEAB1, 0x74EF, 0xEAB2, 0x74F4, 0xEAB3, 0x74FF, 0xEAB4, 0x750F, + 0xEAB5, 0x7511, 0xEAB6, 0x7513, 0xEAB7, 0x6534, 0xEAB8, 0x65EE, 0xEAB9, 0x65EF, 0xEABA, 0x65F0, 0xEABB, 0x660A, 0xEABC, 0x6619, + 0xEABD, 0x6772, 0xEABE, 0x6603, 0xEABF, 0x6615, 0xEAC0, 0x6600, 0xEAC1, 0x7085, 0xEAC2, 0x66F7, 0xEAC3, 0x661D, 0xEAC4, 0x6634, + 0xEAC5, 0x6631, 0xEAC6, 0x6636, 0xEAC7, 0x6635, 0xEAC8, 0x8006, 0xEAC9, 0x665F, 0xEACA, 0x6654, 0xEACB, 0x6641, 0xEACC, 0x664F, + 0xEACD, 0x6656, 0xEACE, 0x6661, 0xEACF, 0x6657, 0xEAD0, 0x6677, 0xEAD1, 0x6684, 0xEAD2, 0x668C, 0xEAD3, 0x66A7, 0xEAD4, 0x669D, + 0xEAD5, 0x66BE, 0xEAD6, 0x66DB, 0xEAD7, 0x66DC, 0xEAD8, 0x66E6, 0xEAD9, 0x66E9, 0xEADA, 0x8D32, 0xEADB, 0x8D33, 0xEADC, 0x8D36, + 0xEADD, 0x8D3B, 0xEADE, 0x8D3D, 0xEADF, 0x8D40, 0xEAE0, 0x8D45, 0xEAE1, 0x8D46, 0xEAE2, 0x8D48, 0xEAE3, 0x8D49, 0xEAE4, 0x8D47, + 0xEAE5, 0x8D4D, 0xEAE6, 0x8D55, 0xEAE7, 0x8D59, 0xEAE8, 0x89C7, 0xEAE9, 0x89CA, 0xEAEA, 0x89CB, 0xEAEB, 0x89CC, 0xEAEC, 0x89CE, + 0xEAED, 0x89CF, 0xEAEE, 0x89D0, 0xEAEF, 0x89D1, 0xEAF0, 0x726E, 0xEAF1, 0x729F, 0xEAF2, 0x725D, 0xEAF3, 0x7266, 0xEAF4, 0x726F, + 0xEAF5, 0x727E, 0xEAF6, 0x727F, 0xEAF7, 0x7284, 0xEAF8, 0x728B, 0xEAF9, 0x728D, 0xEAFA, 0x728F, 0xEAFB, 0x7292, 0xEAFC, 0x6308, + 0xEAFD, 0x6332, 0xEAFE, 0x63B0, 0xEB40, 0x968C, 0xEB41, 0x968E, 0xEB42, 0x9691, 0xEB43, 0x9692, 0xEB44, 0x9693, 0xEB45, 0x9695, + 0xEB46, 0x9696, 0xEB47, 0x969A, 0xEB48, 0x969B, 0xEB49, 0x969D, 0xEB4A, 0x969E, 0xEB4B, 0x969F, 0xEB4C, 0x96A0, 0xEB4D, 0x96A1, + 0xEB4E, 0x96A2, 0xEB4F, 0x96A3, 0xEB50, 0x96A4, 0xEB51, 0x96A5, 0xEB52, 0x96A6, 0xEB53, 0x96A8, 0xEB54, 0x96A9, 0xEB55, 0x96AA, + 0xEB56, 0x96AB, 0xEB57, 0x96AC, 0xEB58, 0x96AD, 0xEB59, 0x96AE, 0xEB5A, 0x96AF, 0xEB5B, 0x96B1, 0xEB5C, 0x96B2, 0xEB5D, 0x96B4, + 0xEB5E, 0x96B5, 0xEB5F, 0x96B7, 0xEB60, 0x96B8, 0xEB61, 0x96BA, 0xEB62, 0x96BB, 0xEB63, 0x96BF, 0xEB64, 0x96C2, 0xEB65, 0x96C3, + 0xEB66, 0x96C8, 0xEB67, 0x96CA, 0xEB68, 0x96CB, 0xEB69, 0x96D0, 0xEB6A, 0x96D1, 0xEB6B, 0x96D3, 0xEB6C, 0x96D4, 0xEB6D, 0x96D6, + 0xEB6E, 0x96D7, 0xEB6F, 0x96D8, 0xEB70, 0x96D9, 0xEB71, 0x96DA, 0xEB72, 0x96DB, 0xEB73, 0x96DC, 0xEB74, 0x96DD, 0xEB75, 0x96DE, + 0xEB76, 0x96DF, 0xEB77, 0x96E1, 0xEB78, 0x96E2, 0xEB79, 0x96E3, 0xEB7A, 0x96E4, 0xEB7B, 0x96E5, 0xEB7C, 0x96E6, 0xEB7D, 0x96E7, + 0xEB7E, 0x96EB, 0xEB80, 0x96EC, 0xEB81, 0x96ED, 0xEB82, 0x96EE, 0xEB83, 0x96F0, 0xEB84, 0x96F1, 0xEB85, 0x96F2, 0xEB86, 0x96F4, + 0xEB87, 0x96F5, 0xEB88, 0x96F8, 0xEB89, 0x96FA, 0xEB8A, 0x96FB, 0xEB8B, 0x96FC, 0xEB8C, 0x96FD, 0xEB8D, 0x96FF, 0xEB8E, 0x9702, + 0xEB8F, 0x9703, 0xEB90, 0x9705, 0xEB91, 0x970A, 0xEB92, 0x970B, 0xEB93, 0x970C, 0xEB94, 0x9710, 0xEB95, 0x9711, 0xEB96, 0x9712, + 0xEB97, 0x9714, 0xEB98, 0x9715, 0xEB99, 0x9717, 0xEB9A, 0x9718, 0xEB9B, 0x9719, 0xEB9C, 0x971A, 0xEB9D, 0x971B, 0xEB9E, 0x971D, + 0xEB9F, 0x971F, 0xEBA0, 0x9720, 0xEBA1, 0x643F, 0xEBA2, 0x64D8, 0xEBA3, 0x8004, 0xEBA4, 0x6BEA, 0xEBA5, 0x6BF3, 0xEBA6, 0x6BFD, + 0xEBA7, 0x6BF5, 0xEBA8, 0x6BF9, 0xEBA9, 0x6C05, 0xEBAA, 0x6C07, 0xEBAB, 0x6C06, 0xEBAC, 0x6C0D, 0xEBAD, 0x6C15, 0xEBAE, 0x6C18, + 0xEBAF, 0x6C19, 0xEBB0, 0x6C1A, 0xEBB1, 0x6C21, 0xEBB2, 0x6C29, 0xEBB3, 0x6C24, 0xEBB4, 0x6C2A, 0xEBB5, 0x6C32, 0xEBB6, 0x6535, + 0xEBB7, 0x6555, 0xEBB8, 0x656B, 0xEBB9, 0x724D, 0xEBBA, 0x7252, 0xEBBB, 0x7256, 0xEBBC, 0x7230, 0xEBBD, 0x8662, 0xEBBE, 0x5216, + 0xEBBF, 0x809F, 0xEBC0, 0x809C, 0xEBC1, 0x8093, 0xEBC2, 0x80BC, 0xEBC3, 0x670A, 0xEBC4, 0x80BD, 0xEBC5, 0x80B1, 0xEBC6, 0x80AB, + 0xEBC7, 0x80AD, 0xEBC8, 0x80B4, 0xEBC9, 0x80B7, 0xEBCA, 0x80E7, 0xEBCB, 0x80E8, 0xEBCC, 0x80E9, 0xEBCD, 0x80EA, 0xEBCE, 0x80DB, + 0xEBCF, 0x80C2, 0xEBD0, 0x80C4, 0xEBD1, 0x80D9, 0xEBD2, 0x80CD, 0xEBD3, 0x80D7, 0xEBD4, 0x6710, 0xEBD5, 0x80DD, 0xEBD6, 0x80EB, + 0xEBD7, 0x80F1, 0xEBD8, 0x80F4, 0xEBD9, 0x80ED, 0xEBDA, 0x810D, 0xEBDB, 0x810E, 0xEBDC, 0x80F2, 0xEBDD, 0x80FC, 0xEBDE, 0x6715, + 0xEBDF, 0x8112, 0xEBE0, 0x8C5A, 0xEBE1, 0x8136, 0xEBE2, 0x811E, 0xEBE3, 0x812C, 0xEBE4, 0x8118, 0xEBE5, 0x8132, 0xEBE6, 0x8148, + 0xEBE7, 0x814C, 0xEBE8, 0x8153, 0xEBE9, 0x8174, 0xEBEA, 0x8159, 0xEBEB, 0x815A, 0xEBEC, 0x8171, 0xEBED, 0x8160, 0xEBEE, 0x8169, + 0xEBEF, 0x817C, 0xEBF0, 0x817D, 0xEBF1, 0x816D, 0xEBF2, 0x8167, 0xEBF3, 0x584D, 0xEBF4, 0x5AB5, 0xEBF5, 0x8188, 0xEBF6, 0x8182, + 0xEBF7, 0x8191, 0xEBF8, 0x6ED5, 0xEBF9, 0x81A3, 0xEBFA, 0x81AA, 0xEBFB, 0x81CC, 0xEBFC, 0x6726, 0xEBFD, 0x81CA, 0xEBFE, 0x81BB, + 0xEC40, 0x9721, 0xEC41, 0x9722, 0xEC42, 0x9723, 0xEC43, 0x9724, 0xEC44, 0x9725, 0xEC45, 0x9726, 0xEC46, 0x9727, 0xEC47, 0x9728, + 0xEC48, 0x9729, 0xEC49, 0x972B, 0xEC4A, 0x972C, 0xEC4B, 0x972E, 0xEC4C, 0x972F, 0xEC4D, 0x9731, 0xEC4E, 0x9733, 0xEC4F, 0x9734, + 0xEC50, 0x9735, 0xEC51, 0x9736, 0xEC52, 0x9737, 0xEC53, 0x973A, 0xEC54, 0x973B, 0xEC55, 0x973C, 0xEC56, 0x973D, 0xEC57, 0x973F, + 0xEC58, 0x9740, 0xEC59, 0x9741, 0xEC5A, 0x9742, 0xEC5B, 0x9743, 0xEC5C, 0x9744, 0xEC5D, 0x9745, 0xEC5E, 0x9746, 0xEC5F, 0x9747, + 0xEC60, 0x9748, 0xEC61, 0x9749, 0xEC62, 0x974A, 0xEC63, 0x974B, 0xEC64, 0x974C, 0xEC65, 0x974D, 0xEC66, 0x974E, 0xEC67, 0x974F, + 0xEC68, 0x9750, 0xEC69, 0x9751, 0xEC6A, 0x9754, 0xEC6B, 0x9755, 0xEC6C, 0x9757, 0xEC6D, 0x9758, 0xEC6E, 0x975A, 0xEC6F, 0x975C, + 0xEC70, 0x975D, 0xEC71, 0x975F, 0xEC72, 0x9763, 0xEC73, 0x9764, 0xEC74, 0x9766, 0xEC75, 0x9767, 0xEC76, 0x9768, 0xEC77, 0x976A, + 0xEC78, 0x976B, 0xEC79, 0x976C, 0xEC7A, 0x976D, 0xEC7B, 0x976E, 0xEC7C, 0x976F, 0xEC7D, 0x9770, 0xEC7E, 0x9771, 0xEC80, 0x9772, + 0xEC81, 0x9775, 0xEC82, 0x9777, 0xEC83, 0x9778, 0xEC84, 0x9779, 0xEC85, 0x977A, 0xEC86, 0x977B, 0xEC87, 0x977D, 0xEC88, 0x977E, + 0xEC89, 0x977F, 0xEC8A, 0x9780, 0xEC8B, 0x9781, 0xEC8C, 0x9782, 0xEC8D, 0x9783, 0xEC8E, 0x9784, 0xEC8F, 0x9786, 0xEC90, 0x9787, + 0xEC91, 0x9788, 0xEC92, 0x9789, 0xEC93, 0x978A, 0xEC94, 0x978C, 0xEC95, 0x978E, 0xEC96, 0x978F, 0xEC97, 0x9790, 0xEC98, 0x9793, + 0xEC99, 0x9795, 0xEC9A, 0x9796, 0xEC9B, 0x9797, 0xEC9C, 0x9799, 0xEC9D, 0x979A, 0xEC9E, 0x979B, 0xEC9F, 0x979C, 0xECA0, 0x979D, + 0xECA1, 0x81C1, 0xECA2, 0x81A6, 0xECA3, 0x6B24, 0xECA4, 0x6B37, 0xECA5, 0x6B39, 0xECA6, 0x6B43, 0xECA7, 0x6B46, 0xECA8, 0x6B59, + 0xECA9, 0x98D1, 0xECAA, 0x98D2, 0xECAB, 0x98D3, 0xECAC, 0x98D5, 0xECAD, 0x98D9, 0xECAE, 0x98DA, 0xECAF, 0x6BB3, 0xECB0, 0x5F40, + 0xECB1, 0x6BC2, 0xECB2, 0x89F3, 0xECB3, 0x6590, 0xECB4, 0x9F51, 0xECB5, 0x6593, 0xECB6, 0x65BC, 0xECB7, 0x65C6, 0xECB8, 0x65C4, + 0xECB9, 0x65C3, 0xECBA, 0x65CC, 0xECBB, 0x65CE, 0xECBC, 0x65D2, 0xECBD, 0x65D6, 0xECBE, 0x7080, 0xECBF, 0x709C, 0xECC0, 0x7096, + 0xECC1, 0x709D, 0xECC2, 0x70BB, 0xECC3, 0x70C0, 0xECC4, 0x70B7, 0xECC5, 0x70AB, 0xECC6, 0x70B1, 0xECC7, 0x70E8, 0xECC8, 0x70CA, + 0xECC9, 0x7110, 0xECCA, 0x7113, 0xECCB, 0x7116, 0xECCC, 0x712F, 0xECCD, 0x7131, 0xECCE, 0x7173, 0xECCF, 0x715C, 0xECD0, 0x7168, + 0xECD1, 0x7145, 0xECD2, 0x7172, 0xECD3, 0x714A, 0xECD4, 0x7178, 0xECD5, 0x717A, 0xECD6, 0x7198, 0xECD7, 0x71B3, 0xECD8, 0x71B5, + 0xECD9, 0x71A8, 0xECDA, 0x71A0, 0xECDB, 0x71E0, 0xECDC, 0x71D4, 0xECDD, 0x71E7, 0xECDE, 0x71F9, 0xECDF, 0x721D, 0xECE0, 0x7228, + 0xECE1, 0x706C, 0xECE2, 0x7118, 0xECE3, 0x7166, 0xECE4, 0x71B9, 0xECE5, 0x623E, 0xECE6, 0x623D, 0xECE7, 0x6243, 0xECE8, 0x6248, + 0xECE9, 0x6249, 0xECEA, 0x793B, 0xECEB, 0x7940, 0xECEC, 0x7946, 0xECED, 0x7949, 0xECEE, 0x795B, 0xECEF, 0x795C, 0xECF0, 0x7953, + 0xECF1, 0x795A, 0xECF2, 0x7962, 0xECF3, 0x7957, 0xECF4, 0x7960, 0xECF5, 0x796F, 0xECF6, 0x7967, 0xECF7, 0x797A, 0xECF8, 0x7985, + 0xECF9, 0x798A, 0xECFA, 0x799A, 0xECFB, 0x79A7, 0xECFC, 0x79B3, 0xECFD, 0x5FD1, 0xECFE, 0x5FD0, 0xED40, 0x979E, 0xED41, 0x979F, + 0xED42, 0x97A1, 0xED43, 0x97A2, 0xED44, 0x97A4, 0xED45, 0x97A5, 0xED46, 0x97A6, 0xED47, 0x97A7, 0xED48, 0x97A8, 0xED49, 0x97A9, + 0xED4A, 0x97AA, 0xED4B, 0x97AC, 0xED4C, 0x97AE, 0xED4D, 0x97B0, 0xED4E, 0x97B1, 0xED4F, 0x97B3, 0xED50, 0x97B5, 0xED51, 0x97B6, + 0xED52, 0x97B7, 0xED53, 0x97B8, 0xED54, 0x97B9, 0xED55, 0x97BA, 0xED56, 0x97BB, 0xED57, 0x97BC, 0xED58, 0x97BD, 0xED59, 0x97BE, + 0xED5A, 0x97BF, 0xED5B, 0x97C0, 0xED5C, 0x97C1, 0xED5D, 0x97C2, 0xED5E, 0x97C3, 0xED5F, 0x97C4, 0xED60, 0x97C5, 0xED61, 0x97C6, + 0xED62, 0x97C7, 0xED63, 0x97C8, 0xED64, 0x97C9, 0xED65, 0x97CA, 0xED66, 0x97CB, 0xED67, 0x97CC, 0xED68, 0x97CD, 0xED69, 0x97CE, + 0xED6A, 0x97CF, 0xED6B, 0x97D0, 0xED6C, 0x97D1, 0xED6D, 0x97D2, 0xED6E, 0x97D3, 0xED6F, 0x97D4, 0xED70, 0x97D5, 0xED71, 0x97D6, + 0xED72, 0x97D7, 0xED73, 0x97D8, 0xED74, 0x97D9, 0xED75, 0x97DA, 0xED76, 0x97DB, 0xED77, 0x97DC, 0xED78, 0x97DD, 0xED79, 0x97DE, + 0xED7A, 0x97DF, 0xED7B, 0x97E0, 0xED7C, 0x97E1, 0xED7D, 0x97E2, 0xED7E, 0x97E3, 0xED80, 0x97E4, 0xED81, 0x97E5, 0xED82, 0x97E8, + 0xED83, 0x97EE, 0xED84, 0x97EF, 0xED85, 0x97F0, 0xED86, 0x97F1, 0xED87, 0x97F2, 0xED88, 0x97F4, 0xED89, 0x97F7, 0xED8A, 0x97F8, + 0xED8B, 0x97F9, 0xED8C, 0x97FA, 0xED8D, 0x97FB, 0xED8E, 0x97FC, 0xED8F, 0x97FD, 0xED90, 0x97FE, 0xED91, 0x97FF, 0xED92, 0x9800, + 0xED93, 0x9801, 0xED94, 0x9802, 0xED95, 0x9803, 0xED96, 0x9804, 0xED97, 0x9805, 0xED98, 0x9806, 0xED99, 0x9807, 0xED9A, 0x9808, + 0xED9B, 0x9809, 0xED9C, 0x980A, 0xED9D, 0x980B, 0xED9E, 0x980C, 0xED9F, 0x980D, 0xEDA0, 0x980E, 0xEDA1, 0x603C, 0xEDA2, 0x605D, + 0xEDA3, 0x605A, 0xEDA4, 0x6067, 0xEDA5, 0x6041, 0xEDA6, 0x6059, 0xEDA7, 0x6063, 0xEDA8, 0x60AB, 0xEDA9, 0x6106, 0xEDAA, 0x610D, + 0xEDAB, 0x615D, 0xEDAC, 0x61A9, 0xEDAD, 0x619D, 0xEDAE, 0x61CB, 0xEDAF, 0x61D1, 0xEDB0, 0x6206, 0xEDB1, 0x8080, 0xEDB2, 0x807F, + 0xEDB3, 0x6C93, 0xEDB4, 0x6CF6, 0xEDB5, 0x6DFC, 0xEDB6, 0x77F6, 0xEDB7, 0x77F8, 0xEDB8, 0x7800, 0xEDB9, 0x7809, 0xEDBA, 0x7817, + 0xEDBB, 0x7818, 0xEDBC, 0x7811, 0xEDBD, 0x65AB, 0xEDBE, 0x782D, 0xEDBF, 0x781C, 0xEDC0, 0x781D, 0xEDC1, 0x7839, 0xEDC2, 0x783A, + 0xEDC3, 0x783B, 0xEDC4, 0x781F, 0xEDC5, 0x783C, 0xEDC6, 0x7825, 0xEDC7, 0x782C, 0xEDC8, 0x7823, 0xEDC9, 0x7829, 0xEDCA, 0x784E, + 0xEDCB, 0x786D, 0xEDCC, 0x7856, 0xEDCD, 0x7857, 0xEDCE, 0x7826, 0xEDCF, 0x7850, 0xEDD0, 0x7847, 0xEDD1, 0x784C, 0xEDD2, 0x786A, + 0xEDD3, 0x789B, 0xEDD4, 0x7893, 0xEDD5, 0x789A, 0xEDD6, 0x7887, 0xEDD7, 0x789C, 0xEDD8, 0x78A1, 0xEDD9, 0x78A3, 0xEDDA, 0x78B2, + 0xEDDB, 0x78B9, 0xEDDC, 0x78A5, 0xEDDD, 0x78D4, 0xEDDE, 0x78D9, 0xEDDF, 0x78C9, 0xEDE0, 0x78EC, 0xEDE1, 0x78F2, 0xEDE2, 0x7905, + 0xEDE3, 0x78F4, 0xEDE4, 0x7913, 0xEDE5, 0x7924, 0xEDE6, 0x791E, 0xEDE7, 0x7934, 0xEDE8, 0x9F9B, 0xEDE9, 0x9EF9, 0xEDEA, 0x9EFB, + 0xEDEB, 0x9EFC, 0xEDEC, 0x76F1, 0xEDED, 0x7704, 0xEDEE, 0x770D, 0xEDEF, 0x76F9, 0xEDF0, 0x7707, 0xEDF1, 0x7708, 0xEDF2, 0x771A, + 0xEDF3, 0x7722, 0xEDF4, 0x7719, 0xEDF5, 0x772D, 0xEDF6, 0x7726, 0xEDF7, 0x7735, 0xEDF8, 0x7738, 0xEDF9, 0x7750, 0xEDFA, 0x7751, + 0xEDFB, 0x7747, 0xEDFC, 0x7743, 0xEDFD, 0x775A, 0xEDFE, 0x7768, 0xEE40, 0x980F, 0xEE41, 0x9810, 0xEE42, 0x9811, 0xEE43, 0x9812, + 0xEE44, 0x9813, 0xEE45, 0x9814, 0xEE46, 0x9815, 0xEE47, 0x9816, 0xEE48, 0x9817, 0xEE49, 0x9818, 0xEE4A, 0x9819, 0xEE4B, 0x981A, + 0xEE4C, 0x981B, 0xEE4D, 0x981C, 0xEE4E, 0x981D, 0xEE4F, 0x981E, 0xEE50, 0x981F, 0xEE51, 0x9820, 0xEE52, 0x9821, 0xEE53, 0x9822, + 0xEE54, 0x9823, 0xEE55, 0x9824, 0xEE56, 0x9825, 0xEE57, 0x9826, 0xEE58, 0x9827, 0xEE59, 0x9828, 0xEE5A, 0x9829, 0xEE5B, 0x982A, + 0xEE5C, 0x982B, 0xEE5D, 0x982C, 0xEE5E, 0x982D, 0xEE5F, 0x982E, 0xEE60, 0x982F, 0xEE61, 0x9830, 0xEE62, 0x9831, 0xEE63, 0x9832, + 0xEE64, 0x9833, 0xEE65, 0x9834, 0xEE66, 0x9835, 0xEE67, 0x9836, 0xEE68, 0x9837, 0xEE69, 0x9838, 0xEE6A, 0x9839, 0xEE6B, 0x983A, + 0xEE6C, 0x983B, 0xEE6D, 0x983C, 0xEE6E, 0x983D, 0xEE6F, 0x983E, 0xEE70, 0x983F, 0xEE71, 0x9840, 0xEE72, 0x9841, 0xEE73, 0x9842, + 0xEE74, 0x9843, 0xEE75, 0x9844, 0xEE76, 0x9845, 0xEE77, 0x9846, 0xEE78, 0x9847, 0xEE79, 0x9848, 0xEE7A, 0x9849, 0xEE7B, 0x984A, + 0xEE7C, 0x984B, 0xEE7D, 0x984C, 0xEE7E, 0x984D, 0xEE80, 0x984E, 0xEE81, 0x984F, 0xEE82, 0x9850, 0xEE83, 0x9851, 0xEE84, 0x9852, + 0xEE85, 0x9853, 0xEE86, 0x9854, 0xEE87, 0x9855, 0xEE88, 0x9856, 0xEE89, 0x9857, 0xEE8A, 0x9858, 0xEE8B, 0x9859, 0xEE8C, 0x985A, + 0xEE8D, 0x985B, 0xEE8E, 0x985C, 0xEE8F, 0x985D, 0xEE90, 0x985E, 0xEE91, 0x985F, 0xEE92, 0x9860, 0xEE93, 0x9861, 0xEE94, 0x9862, + 0xEE95, 0x9863, 0xEE96, 0x9864, 0xEE97, 0x9865, 0xEE98, 0x9866, 0xEE99, 0x9867, 0xEE9A, 0x9868, 0xEE9B, 0x9869, 0xEE9C, 0x986A, + 0xEE9D, 0x986B, 0xEE9E, 0x986C, 0xEE9F, 0x986D, 0xEEA0, 0x986E, 0xEEA1, 0x7762, 0xEEA2, 0x7765, 0xEEA3, 0x777F, 0xEEA4, 0x778D, + 0xEEA5, 0x777D, 0xEEA6, 0x7780, 0xEEA7, 0x778C, 0xEEA8, 0x7791, 0xEEA9, 0x779F, 0xEEAA, 0x77A0, 0xEEAB, 0x77B0, 0xEEAC, 0x77B5, + 0xEEAD, 0x77BD, 0xEEAE, 0x753A, 0xEEAF, 0x7540, 0xEEB0, 0x754E, 0xEEB1, 0x754B, 0xEEB2, 0x7548, 0xEEB3, 0x755B, 0xEEB4, 0x7572, + 0xEEB5, 0x7579, 0xEEB6, 0x7583, 0xEEB7, 0x7F58, 0xEEB8, 0x7F61, 0xEEB9, 0x7F5F, 0xEEBA, 0x8A48, 0xEEBB, 0x7F68, 0xEEBC, 0x7F74, + 0xEEBD, 0x7F71, 0xEEBE, 0x7F79, 0xEEBF, 0x7F81, 0xEEC0, 0x7F7E, 0xEEC1, 0x76CD, 0xEEC2, 0x76E5, 0xEEC3, 0x8832, 0xEEC4, 0x9485, + 0xEEC5, 0x9486, 0xEEC6, 0x9487, 0xEEC7, 0x948B, 0xEEC8, 0x948A, 0xEEC9, 0x948C, 0xEECA, 0x948D, 0xEECB, 0x948F, 0xEECC, 0x9490, + 0xEECD, 0x9494, 0xEECE, 0x9497, 0xEECF, 0x9495, 0xEED0, 0x949A, 0xEED1, 0x949B, 0xEED2, 0x949C, 0xEED3, 0x94A3, 0xEED4, 0x94A4, + 0xEED5, 0x94AB, 0xEED6, 0x94AA, 0xEED7, 0x94AD, 0xEED8, 0x94AC, 0xEED9, 0x94AF, 0xEEDA, 0x94B0, 0xEEDB, 0x94B2, 0xEEDC, 0x94B4, + 0xEEDD, 0x94B6, 0xEEDE, 0x94B7, 0xEEDF, 0x94B8, 0xEEE0, 0x94B9, 0xEEE1, 0x94BA, 0xEEE2, 0x94BC, 0xEEE3, 0x94BD, 0xEEE4, 0x94BF, + 0xEEE5, 0x94C4, 0xEEE6, 0x94C8, 0xEEE7, 0x94C9, 0xEEE8, 0x94CA, 0xEEE9, 0x94CB, 0xEEEA, 0x94CC, 0xEEEB, 0x94CD, 0xEEEC, 0x94CE, + 0xEEED, 0x94D0, 0xEEEE, 0x94D1, 0xEEEF, 0x94D2, 0xEEF0, 0x94D5, 0xEEF1, 0x94D6, 0xEEF2, 0x94D7, 0xEEF3, 0x94D9, 0xEEF4, 0x94D8, + 0xEEF5, 0x94DB, 0xEEF6, 0x94DE, 0xEEF7, 0x94DF, 0xEEF8, 0x94E0, 0xEEF9, 0x94E2, 0xEEFA, 0x94E4, 0xEEFB, 0x94E5, 0xEEFC, 0x94E7, + 0xEEFD, 0x94E8, 0xEEFE, 0x94EA, 0xEF40, 0x986F, 0xEF41, 0x9870, 0xEF42, 0x9871, 0xEF43, 0x9872, 0xEF44, 0x9873, 0xEF45, 0x9874, + 0xEF46, 0x988B, 0xEF47, 0x988E, 0xEF48, 0x9892, 0xEF49, 0x9895, 0xEF4A, 0x9899, 0xEF4B, 0x98A3, 0xEF4C, 0x98A8, 0xEF4D, 0x98A9, + 0xEF4E, 0x98AA, 0xEF4F, 0x98AB, 0xEF50, 0x98AC, 0xEF51, 0x98AD, 0xEF52, 0x98AE, 0xEF53, 0x98AF, 0xEF54, 0x98B0, 0xEF55, 0x98B1, + 0xEF56, 0x98B2, 0xEF57, 0x98B3, 0xEF58, 0x98B4, 0xEF59, 0x98B5, 0xEF5A, 0x98B6, 0xEF5B, 0x98B7, 0xEF5C, 0x98B8, 0xEF5D, 0x98B9, + 0xEF5E, 0x98BA, 0xEF5F, 0x98BB, 0xEF60, 0x98BC, 0xEF61, 0x98BD, 0xEF62, 0x98BE, 0xEF63, 0x98BF, 0xEF64, 0x98C0, 0xEF65, 0x98C1, + 0xEF66, 0x98C2, 0xEF67, 0x98C3, 0xEF68, 0x98C4, 0xEF69, 0x98C5, 0xEF6A, 0x98C6, 0xEF6B, 0x98C7, 0xEF6C, 0x98C8, 0xEF6D, 0x98C9, + 0xEF6E, 0x98CA, 0xEF6F, 0x98CB, 0xEF70, 0x98CC, 0xEF71, 0x98CD, 0xEF72, 0x98CF, 0xEF73, 0x98D0, 0xEF74, 0x98D4, 0xEF75, 0x98D6, + 0xEF76, 0x98D7, 0xEF77, 0x98DB, 0xEF78, 0x98DC, 0xEF79, 0x98DD, 0xEF7A, 0x98E0, 0xEF7B, 0x98E1, 0xEF7C, 0x98E2, 0xEF7D, 0x98E3, + 0xEF7E, 0x98E4, 0xEF80, 0x98E5, 0xEF81, 0x98E6, 0xEF82, 0x98E9, 0xEF83, 0x98EA, 0xEF84, 0x98EB, 0xEF85, 0x98EC, 0xEF86, 0x98ED, + 0xEF87, 0x98EE, 0xEF88, 0x98EF, 0xEF89, 0x98F0, 0xEF8A, 0x98F1, 0xEF8B, 0x98F2, 0xEF8C, 0x98F3, 0xEF8D, 0x98F4, 0xEF8E, 0x98F5, + 0xEF8F, 0x98F6, 0xEF90, 0x98F7, 0xEF91, 0x98F8, 0xEF92, 0x98F9, 0xEF93, 0x98FA, 0xEF94, 0x98FB, 0xEF95, 0x98FC, 0xEF96, 0x98FD, + 0xEF97, 0x98FE, 0xEF98, 0x98FF, 0xEF99, 0x9900, 0xEF9A, 0x9901, 0xEF9B, 0x9902, 0xEF9C, 0x9903, 0xEF9D, 0x9904, 0xEF9E, 0x9905, + 0xEF9F, 0x9906, 0xEFA0, 0x9907, 0xEFA1, 0x94E9, 0xEFA2, 0x94EB, 0xEFA3, 0x94EE, 0xEFA4, 0x94EF, 0xEFA5, 0x94F3, 0xEFA6, 0x94F4, + 0xEFA7, 0x94F5, 0xEFA8, 0x94F7, 0xEFA9, 0x94F9, 0xEFAA, 0x94FC, 0xEFAB, 0x94FD, 0xEFAC, 0x94FF, 0xEFAD, 0x9503, 0xEFAE, 0x9502, + 0xEFAF, 0x9506, 0xEFB0, 0x9507, 0xEFB1, 0x9509, 0xEFB2, 0x950A, 0xEFB3, 0x950D, 0xEFB4, 0x950E, 0xEFB5, 0x950F, 0xEFB6, 0x9512, + 0xEFB7, 0x9513, 0xEFB8, 0x9514, 0xEFB9, 0x9515, 0xEFBA, 0x9516, 0xEFBB, 0x9518, 0xEFBC, 0x951B, 0xEFBD, 0x951D, 0xEFBE, 0x951E, + 0xEFBF, 0x951F, 0xEFC0, 0x9522, 0xEFC1, 0x952A, 0xEFC2, 0x952B, 0xEFC3, 0x9529, 0xEFC4, 0x952C, 0xEFC5, 0x9531, 0xEFC6, 0x9532, + 0xEFC7, 0x9534, 0xEFC8, 0x9536, 0xEFC9, 0x9537, 0xEFCA, 0x9538, 0xEFCB, 0x953C, 0xEFCC, 0x953E, 0xEFCD, 0x953F, 0xEFCE, 0x9542, + 0xEFCF, 0x9535, 0xEFD0, 0x9544, 0xEFD1, 0x9545, 0xEFD2, 0x9546, 0xEFD3, 0x9549, 0xEFD4, 0x954C, 0xEFD5, 0x954E, 0xEFD6, 0x954F, + 0xEFD7, 0x9552, 0xEFD8, 0x9553, 0xEFD9, 0x9554, 0xEFDA, 0x9556, 0xEFDB, 0x9557, 0xEFDC, 0x9558, 0xEFDD, 0x9559, 0xEFDE, 0x955B, + 0xEFDF, 0x955E, 0xEFE0, 0x955F, 0xEFE1, 0x955D, 0xEFE2, 0x9561, 0xEFE3, 0x9562, 0xEFE4, 0x9564, 0xEFE5, 0x9565, 0xEFE6, 0x9566, + 0xEFE7, 0x9567, 0xEFE8, 0x9568, 0xEFE9, 0x9569, 0xEFEA, 0x956A, 0xEFEB, 0x956B, 0xEFEC, 0x956C, 0xEFED, 0x956F, 0xEFEE, 0x9571, + 0xEFEF, 0x9572, 0xEFF0, 0x9573, 0xEFF1, 0x953A, 0xEFF2, 0x77E7, 0xEFF3, 0x77EC, 0xEFF4, 0x96C9, 0xEFF5, 0x79D5, 0xEFF6, 0x79ED, + 0xEFF7, 0x79E3, 0xEFF8, 0x79EB, 0xEFF9, 0x7A06, 0xEFFA, 0x5D47, 0xEFFB, 0x7A03, 0xEFFC, 0x7A02, 0xEFFD, 0x7A1E, 0xEFFE, 0x7A14, + 0xF040, 0x9908, 0xF041, 0x9909, 0xF042, 0x990A, 0xF043, 0x990B, 0xF044, 0x990C, 0xF045, 0x990E, 0xF046, 0x990F, 0xF047, 0x9911, + 0xF048, 0x9912, 0xF049, 0x9913, 0xF04A, 0x9914, 0xF04B, 0x9915, 0xF04C, 0x9916, 0xF04D, 0x9917, 0xF04E, 0x9918, 0xF04F, 0x9919, + 0xF050, 0x991A, 0xF051, 0x991B, 0xF052, 0x991C, 0xF053, 0x991D, 0xF054, 0x991E, 0xF055, 0x991F, 0xF056, 0x9920, 0xF057, 0x9921, + 0xF058, 0x9922, 0xF059, 0x9923, 0xF05A, 0x9924, 0xF05B, 0x9925, 0xF05C, 0x9926, 0xF05D, 0x9927, 0xF05E, 0x9928, 0xF05F, 0x9929, + 0xF060, 0x992A, 0xF061, 0x992B, 0xF062, 0x992C, 0xF063, 0x992D, 0xF064, 0x992F, 0xF065, 0x9930, 0xF066, 0x9931, 0xF067, 0x9932, + 0xF068, 0x9933, 0xF069, 0x9934, 0xF06A, 0x9935, 0xF06B, 0x9936, 0xF06C, 0x9937, 0xF06D, 0x9938, 0xF06E, 0x9939, 0xF06F, 0x993A, + 0xF070, 0x993B, 0xF071, 0x993C, 0xF072, 0x993D, 0xF073, 0x993E, 0xF074, 0x993F, 0xF075, 0x9940, 0xF076, 0x9941, 0xF077, 0x9942, + 0xF078, 0x9943, 0xF079, 0x9944, 0xF07A, 0x9945, 0xF07B, 0x9946, 0xF07C, 0x9947, 0xF07D, 0x9948, 0xF07E, 0x9949, 0xF080, 0x994A, + 0xF081, 0x994B, 0xF082, 0x994C, 0xF083, 0x994D, 0xF084, 0x994E, 0xF085, 0x994F, 0xF086, 0x9950, 0xF087, 0x9951, 0xF088, 0x9952, + 0xF089, 0x9953, 0xF08A, 0x9956, 0xF08B, 0x9957, 0xF08C, 0x9958, 0xF08D, 0x9959, 0xF08E, 0x995A, 0xF08F, 0x995B, 0xF090, 0x995C, + 0xF091, 0x995D, 0xF092, 0x995E, 0xF093, 0x995F, 0xF094, 0x9960, 0xF095, 0x9961, 0xF096, 0x9962, 0xF097, 0x9964, 0xF098, 0x9966, + 0xF099, 0x9973, 0xF09A, 0x9978, 0xF09B, 0x9979, 0xF09C, 0x997B, 0xF09D, 0x997E, 0xF09E, 0x9982, 0xF09F, 0x9983, 0xF0A0, 0x9989, + 0xF0A1, 0x7A39, 0xF0A2, 0x7A37, 0xF0A3, 0x7A51, 0xF0A4, 0x9ECF, 0xF0A5, 0x99A5, 0xF0A6, 0x7A70, 0xF0A7, 0x7688, 0xF0A8, 0x768E, + 0xF0A9, 0x7693, 0xF0AA, 0x7699, 0xF0AB, 0x76A4, 0xF0AC, 0x74DE, 0xF0AD, 0x74E0, 0xF0AE, 0x752C, 0xF0AF, 0x9E20, 0xF0B0, 0x9E22, + 0xF0B1, 0x9E28, 0xF0B2, 0x9E29, 0xF0B3, 0x9E2A, 0xF0B4, 0x9E2B, 0xF0B5, 0x9E2C, 0xF0B6, 0x9E32, 0xF0B7, 0x9E31, 0xF0B8, 0x9E36, + 0xF0B9, 0x9E38, 0xF0BA, 0x9E37, 0xF0BB, 0x9E39, 0xF0BC, 0x9E3A, 0xF0BD, 0x9E3E, 0xF0BE, 0x9E41, 0xF0BF, 0x9E42, 0xF0C0, 0x9E44, + 0xF0C1, 0x9E46, 0xF0C2, 0x9E47, 0xF0C3, 0x9E48, 0xF0C4, 0x9E49, 0xF0C5, 0x9E4B, 0xF0C6, 0x9E4C, 0xF0C7, 0x9E4E, 0xF0C8, 0x9E51, + 0xF0C9, 0x9E55, 0xF0CA, 0x9E57, 0xF0CB, 0x9E5A, 0xF0CC, 0x9E5B, 0xF0CD, 0x9E5C, 0xF0CE, 0x9E5E, 0xF0CF, 0x9E63, 0xF0D0, 0x9E66, + 0xF0D1, 0x9E67, 0xF0D2, 0x9E68, 0xF0D3, 0x9E69, 0xF0D4, 0x9E6A, 0xF0D5, 0x9E6B, 0xF0D6, 0x9E6C, 0xF0D7, 0x9E71, 0xF0D8, 0x9E6D, + 0xF0D9, 0x9E73, 0xF0DA, 0x7592, 0xF0DB, 0x7594, 0xF0DC, 0x7596, 0xF0DD, 0x75A0, 0xF0DE, 0x759D, 0xF0DF, 0x75AC, 0xF0E0, 0x75A3, + 0xF0E1, 0x75B3, 0xF0E2, 0x75B4, 0xF0E3, 0x75B8, 0xF0E4, 0x75C4, 0xF0E5, 0x75B1, 0xF0E6, 0x75B0, 0xF0E7, 0x75C3, 0xF0E8, 0x75C2, + 0xF0E9, 0x75D6, 0xF0EA, 0x75CD, 0xF0EB, 0x75E3, 0xF0EC, 0x75E8, 0xF0ED, 0x75E6, 0xF0EE, 0x75E4, 0xF0EF, 0x75EB, 0xF0F0, 0x75E7, + 0xF0F1, 0x7603, 0xF0F2, 0x75F1, 0xF0F3, 0x75FC, 0xF0F4, 0x75FF, 0xF0F5, 0x7610, 0xF0F6, 0x7600, 0xF0F7, 0x7605, 0xF0F8, 0x760C, + 0xF0F9, 0x7617, 0xF0FA, 0x760A, 0xF0FB, 0x7625, 0xF0FC, 0x7618, 0xF0FD, 0x7615, 0xF0FE, 0x7619, 0xF140, 0x998C, 0xF141, 0x998E, + 0xF142, 0x999A, 0xF143, 0x999B, 0xF144, 0x999C, 0xF145, 0x999D, 0xF146, 0x999E, 0xF147, 0x999F, 0xF148, 0x99A0, 0xF149, 0x99A1, + 0xF14A, 0x99A2, 0xF14B, 0x99A3, 0xF14C, 0x99A4, 0xF14D, 0x99A6, 0xF14E, 0x99A7, 0xF14F, 0x99A9, 0xF150, 0x99AA, 0xF151, 0x99AB, + 0xF152, 0x99AC, 0xF153, 0x99AD, 0xF154, 0x99AE, 0xF155, 0x99AF, 0xF156, 0x99B0, 0xF157, 0x99B1, 0xF158, 0x99B2, 0xF159, 0x99B3, + 0xF15A, 0x99B4, 0xF15B, 0x99B5, 0xF15C, 0x99B6, 0xF15D, 0x99B7, 0xF15E, 0x99B8, 0xF15F, 0x99B9, 0xF160, 0x99BA, 0xF161, 0x99BB, + 0xF162, 0x99BC, 0xF163, 0x99BD, 0xF164, 0x99BE, 0xF165, 0x99BF, 0xF166, 0x99C0, 0xF167, 0x99C1, 0xF168, 0x99C2, 0xF169, 0x99C3, + 0xF16A, 0x99C4, 0xF16B, 0x99C5, 0xF16C, 0x99C6, 0xF16D, 0x99C7, 0xF16E, 0x99C8, 0xF16F, 0x99C9, 0xF170, 0x99CA, 0xF171, 0x99CB, + 0xF172, 0x99CC, 0xF173, 0x99CD, 0xF174, 0x99CE, 0xF175, 0x99CF, 0xF176, 0x99D0, 0xF177, 0x99D1, 0xF178, 0x99D2, 0xF179, 0x99D3, + 0xF17A, 0x99D4, 0xF17B, 0x99D5, 0xF17C, 0x99D6, 0xF17D, 0x99D7, 0xF17E, 0x99D8, 0xF180, 0x99D9, 0xF181, 0x99DA, 0xF182, 0x99DB, + 0xF183, 0x99DC, 0xF184, 0x99DD, 0xF185, 0x99DE, 0xF186, 0x99DF, 0xF187, 0x99E0, 0xF188, 0x99E1, 0xF189, 0x99E2, 0xF18A, 0x99E3, + 0xF18B, 0x99E4, 0xF18C, 0x99E5, 0xF18D, 0x99E6, 0xF18E, 0x99E7, 0xF18F, 0x99E8, 0xF190, 0x99E9, 0xF191, 0x99EA, 0xF192, 0x99EB, + 0xF193, 0x99EC, 0xF194, 0x99ED, 0xF195, 0x99EE, 0xF196, 0x99EF, 0xF197, 0x99F0, 0xF198, 0x99F1, 0xF199, 0x99F2, 0xF19A, 0x99F3, + 0xF19B, 0x99F4, 0xF19C, 0x99F5, 0xF19D, 0x99F6, 0xF19E, 0x99F7, 0xF19F, 0x99F8, 0xF1A0, 0x99F9, 0xF1A1, 0x761B, 0xF1A2, 0x763C, + 0xF1A3, 0x7622, 0xF1A4, 0x7620, 0xF1A5, 0x7640, 0xF1A6, 0x762D, 0xF1A7, 0x7630, 0xF1A8, 0x763F, 0xF1A9, 0x7635, 0xF1AA, 0x7643, + 0xF1AB, 0x763E, 0xF1AC, 0x7633, 0xF1AD, 0x764D, 0xF1AE, 0x765E, 0xF1AF, 0x7654, 0xF1B0, 0x765C, 0xF1B1, 0x7656, 0xF1B2, 0x766B, + 0xF1B3, 0x766F, 0xF1B4, 0x7FCA, 0xF1B5, 0x7AE6, 0xF1B6, 0x7A78, 0xF1B7, 0x7A79, 0xF1B8, 0x7A80, 0xF1B9, 0x7A86, 0xF1BA, 0x7A88, + 0xF1BB, 0x7A95, 0xF1BC, 0x7AA6, 0xF1BD, 0x7AA0, 0xF1BE, 0x7AAC, 0xF1BF, 0x7AA8, 0xF1C0, 0x7AAD, 0xF1C1, 0x7AB3, 0xF1C2, 0x8864, + 0xF1C3, 0x8869, 0xF1C4, 0x8872, 0xF1C5, 0x887D, 0xF1C6, 0x887F, 0xF1C7, 0x8882, 0xF1C8, 0x88A2, 0xF1C9, 0x88C6, 0xF1CA, 0x88B7, + 0xF1CB, 0x88BC, 0xF1CC, 0x88C9, 0xF1CD, 0x88E2, 0xF1CE, 0x88CE, 0xF1CF, 0x88E3, 0xF1D0, 0x88E5, 0xF1D1, 0x88F1, 0xF1D2, 0x891A, + 0xF1D3, 0x88FC, 0xF1D4, 0x88E8, 0xF1D5, 0x88FE, 0xF1D6, 0x88F0, 0xF1D7, 0x8921, 0xF1D8, 0x8919, 0xF1D9, 0x8913, 0xF1DA, 0x891B, + 0xF1DB, 0x890A, 0xF1DC, 0x8934, 0xF1DD, 0x892B, 0xF1DE, 0x8936, 0xF1DF, 0x8941, 0xF1E0, 0x8966, 0xF1E1, 0x897B, 0xF1E2, 0x758B, + 0xF1E3, 0x80E5, 0xF1E4, 0x76B2, 0xF1E5, 0x76B4, 0xF1E6, 0x77DC, 0xF1E7, 0x8012, 0xF1E8, 0x8014, 0xF1E9, 0x8016, 0xF1EA, 0x801C, + 0xF1EB, 0x8020, 0xF1EC, 0x8022, 0xF1ED, 0x8025, 0xF1EE, 0x8026, 0xF1EF, 0x8027, 0xF1F0, 0x8029, 0xF1F1, 0x8028, 0xF1F2, 0x8031, + 0xF1F3, 0x800B, 0xF1F4, 0x8035, 0xF1F5, 0x8043, 0xF1F6, 0x8046, 0xF1F7, 0x804D, 0xF1F8, 0x8052, 0xF1F9, 0x8069, 0xF1FA, 0x8071, + 0xF1FB, 0x8983, 0xF1FC, 0x9878, 0xF1FD, 0x9880, 0xF1FE, 0x9883, 0xF240, 0x99FA, 0xF241, 0x99FB, 0xF242, 0x99FC, 0xF243, 0x99FD, + 0xF244, 0x99FE, 0xF245, 0x99FF, 0xF246, 0x9A00, 0xF247, 0x9A01, 0xF248, 0x9A02, 0xF249, 0x9A03, 0xF24A, 0x9A04, 0xF24B, 0x9A05, + 0xF24C, 0x9A06, 0xF24D, 0x9A07, 0xF24E, 0x9A08, 0xF24F, 0x9A09, 0xF250, 0x9A0A, 0xF251, 0x9A0B, 0xF252, 0x9A0C, 0xF253, 0x9A0D, + 0xF254, 0x9A0E, 0xF255, 0x9A0F, 0xF256, 0x9A10, 0xF257, 0x9A11, 0xF258, 0x9A12, 0xF259, 0x9A13, 0xF25A, 0x9A14, 0xF25B, 0x9A15, + 0xF25C, 0x9A16, 0xF25D, 0x9A17, 0xF25E, 0x9A18, 0xF25F, 0x9A19, 0xF260, 0x9A1A, 0xF261, 0x9A1B, 0xF262, 0x9A1C, 0xF263, 0x9A1D, + 0xF264, 0x9A1E, 0xF265, 0x9A1F, 0xF266, 0x9A20, 0xF267, 0x9A21, 0xF268, 0x9A22, 0xF269, 0x9A23, 0xF26A, 0x9A24, 0xF26B, 0x9A25, + 0xF26C, 0x9A26, 0xF26D, 0x9A27, 0xF26E, 0x9A28, 0xF26F, 0x9A29, 0xF270, 0x9A2A, 0xF271, 0x9A2B, 0xF272, 0x9A2C, 0xF273, 0x9A2D, + 0xF274, 0x9A2E, 0xF275, 0x9A2F, 0xF276, 0x9A30, 0xF277, 0x9A31, 0xF278, 0x9A32, 0xF279, 0x9A33, 0xF27A, 0x9A34, 0xF27B, 0x9A35, + 0xF27C, 0x9A36, 0xF27D, 0x9A37, 0xF27E, 0x9A38, 0xF280, 0x9A39, 0xF281, 0x9A3A, 0xF282, 0x9A3B, 0xF283, 0x9A3C, 0xF284, 0x9A3D, + 0xF285, 0x9A3E, 0xF286, 0x9A3F, 0xF287, 0x9A40, 0xF288, 0x9A41, 0xF289, 0x9A42, 0xF28A, 0x9A43, 0xF28B, 0x9A44, 0xF28C, 0x9A45, + 0xF28D, 0x9A46, 0xF28E, 0x9A47, 0xF28F, 0x9A48, 0xF290, 0x9A49, 0xF291, 0x9A4A, 0xF292, 0x9A4B, 0xF293, 0x9A4C, 0xF294, 0x9A4D, + 0xF295, 0x9A4E, 0xF296, 0x9A4F, 0xF297, 0x9A50, 0xF298, 0x9A51, 0xF299, 0x9A52, 0xF29A, 0x9A53, 0xF29B, 0x9A54, 0xF29C, 0x9A55, + 0xF29D, 0x9A56, 0xF29E, 0x9A57, 0xF29F, 0x9A58, 0xF2A0, 0x9A59, 0xF2A1, 0x9889, 0xF2A2, 0x988C, 0xF2A3, 0x988D, 0xF2A4, 0x988F, + 0xF2A5, 0x9894, 0xF2A6, 0x989A, 0xF2A7, 0x989B, 0xF2A8, 0x989E, 0xF2A9, 0x989F, 0xF2AA, 0x98A1, 0xF2AB, 0x98A2, 0xF2AC, 0x98A5, + 0xF2AD, 0x98A6, 0xF2AE, 0x864D, 0xF2AF, 0x8654, 0xF2B0, 0x866C, 0xF2B1, 0x866E, 0xF2B2, 0x867F, 0xF2B3, 0x867A, 0xF2B4, 0x867C, + 0xF2B5, 0x867B, 0xF2B6, 0x86A8, 0xF2B7, 0x868D, 0xF2B8, 0x868B, 0xF2B9, 0x86AC, 0xF2BA, 0x869D, 0xF2BB, 0x86A7, 0xF2BC, 0x86A3, + 0xF2BD, 0x86AA, 0xF2BE, 0x8693, 0xF2BF, 0x86A9, 0xF2C0, 0x86B6, 0xF2C1, 0x86C4, 0xF2C2, 0x86B5, 0xF2C3, 0x86CE, 0xF2C4, 0x86B0, + 0xF2C5, 0x86BA, 0xF2C6, 0x86B1, 0xF2C7, 0x86AF, 0xF2C8, 0x86C9, 0xF2C9, 0x86CF, 0xF2CA, 0x86B4, 0xF2CB, 0x86E9, 0xF2CC, 0x86F1, + 0xF2CD, 0x86F2, 0xF2CE, 0x86ED, 0xF2CF, 0x86F3, 0xF2D0, 0x86D0, 0xF2D1, 0x8713, 0xF2D2, 0x86DE, 0xF2D3, 0x86F4, 0xF2D4, 0x86DF, + 0xF2D5, 0x86D8, 0xF2D6, 0x86D1, 0xF2D7, 0x8703, 0xF2D8, 0x8707, 0xF2D9, 0x86F8, 0xF2DA, 0x8708, 0xF2DB, 0x870A, 0xF2DC, 0x870D, + 0xF2DD, 0x8709, 0xF2DE, 0x8723, 0xF2DF, 0x873B, 0xF2E0, 0x871E, 0xF2E1, 0x8725, 0xF2E2, 0x872E, 0xF2E3, 0x871A, 0xF2E4, 0x873E, + 0xF2E5, 0x8748, 0xF2E6, 0x8734, 0xF2E7, 0x8731, 0xF2E8, 0x8729, 0xF2E9, 0x8737, 0xF2EA, 0x873F, 0xF2EB, 0x8782, 0xF2EC, 0x8722, + 0xF2ED, 0x877D, 0xF2EE, 0x877E, 0xF2EF, 0x877B, 0xF2F0, 0x8760, 0xF2F1, 0x8770, 0xF2F2, 0x874C, 0xF2F3, 0x876E, 0xF2F4, 0x878B, + 0xF2F5, 0x8753, 0xF2F6, 0x8763, 0xF2F7, 0x877C, 0xF2F8, 0x8764, 0xF2F9, 0x8759, 0xF2FA, 0x8765, 0xF2FB, 0x8793, 0xF2FC, 0x87AF, + 0xF2FD, 0x87A8, 0xF2FE, 0x87D2, 0xF340, 0x9A5A, 0xF341, 0x9A5B, 0xF342, 0x9A5C, 0xF343, 0x9A5D, 0xF344, 0x9A5E, 0xF345, 0x9A5F, + 0xF346, 0x9A60, 0xF347, 0x9A61, 0xF348, 0x9A62, 0xF349, 0x9A63, 0xF34A, 0x9A64, 0xF34B, 0x9A65, 0xF34C, 0x9A66, 0xF34D, 0x9A67, + 0xF34E, 0x9A68, 0xF34F, 0x9A69, 0xF350, 0x9A6A, 0xF351, 0x9A6B, 0xF352, 0x9A72, 0xF353, 0x9A83, 0xF354, 0x9A89, 0xF355, 0x9A8D, + 0xF356, 0x9A8E, 0xF357, 0x9A94, 0xF358, 0x9A95, 0xF359, 0x9A99, 0xF35A, 0x9AA6, 0xF35B, 0x9AA9, 0xF35C, 0x9AAA, 0xF35D, 0x9AAB, + 0xF35E, 0x9AAC, 0xF35F, 0x9AAD, 0xF360, 0x9AAE, 0xF361, 0x9AAF, 0xF362, 0x9AB2, 0xF363, 0x9AB3, 0xF364, 0x9AB4, 0xF365, 0x9AB5, + 0xF366, 0x9AB9, 0xF367, 0x9ABB, 0xF368, 0x9ABD, 0xF369, 0x9ABE, 0xF36A, 0x9ABF, 0xF36B, 0x9AC3, 0xF36C, 0x9AC4, 0xF36D, 0x9AC6, + 0xF36E, 0x9AC7, 0xF36F, 0x9AC8, 0xF370, 0x9AC9, 0xF371, 0x9ACA, 0xF372, 0x9ACD, 0xF373, 0x9ACE, 0xF374, 0x9ACF, 0xF375, 0x9AD0, + 0xF376, 0x9AD2, 0xF377, 0x9AD4, 0xF378, 0x9AD5, 0xF379, 0x9AD6, 0xF37A, 0x9AD7, 0xF37B, 0x9AD9, 0xF37C, 0x9ADA, 0xF37D, 0x9ADB, + 0xF37E, 0x9ADC, 0xF380, 0x9ADD, 0xF381, 0x9ADE, 0xF382, 0x9AE0, 0xF383, 0x9AE2, 0xF384, 0x9AE3, 0xF385, 0x9AE4, 0xF386, 0x9AE5, + 0xF387, 0x9AE7, 0xF388, 0x9AE8, 0xF389, 0x9AE9, 0xF38A, 0x9AEA, 0xF38B, 0x9AEC, 0xF38C, 0x9AEE, 0xF38D, 0x9AF0, 0xF38E, 0x9AF1, + 0xF38F, 0x9AF2, 0xF390, 0x9AF3, 0xF391, 0x9AF4, 0xF392, 0x9AF5, 0xF393, 0x9AF6, 0xF394, 0x9AF7, 0xF395, 0x9AF8, 0xF396, 0x9AFA, + 0xF397, 0x9AFC, 0xF398, 0x9AFD, 0xF399, 0x9AFE, 0xF39A, 0x9AFF, 0xF39B, 0x9B00, 0xF39C, 0x9B01, 0xF39D, 0x9B02, 0xF39E, 0x9B04, + 0xF39F, 0x9B05, 0xF3A0, 0x9B06, 0xF3A1, 0x87C6, 0xF3A2, 0x8788, 0xF3A3, 0x8785, 0xF3A4, 0x87AD, 0xF3A5, 0x8797, 0xF3A6, 0x8783, + 0xF3A7, 0x87AB, 0xF3A8, 0x87E5, 0xF3A9, 0x87AC, 0xF3AA, 0x87B5, 0xF3AB, 0x87B3, 0xF3AC, 0x87CB, 0xF3AD, 0x87D3, 0xF3AE, 0x87BD, + 0xF3AF, 0x87D1, 0xF3B0, 0x87C0, 0xF3B1, 0x87CA, 0xF3B2, 0x87DB, 0xF3B3, 0x87EA, 0xF3B4, 0x87E0, 0xF3B5, 0x87EE, 0xF3B6, 0x8816, + 0xF3B7, 0x8813, 0xF3B8, 0x87FE, 0xF3B9, 0x880A, 0xF3BA, 0x881B, 0xF3BB, 0x8821, 0xF3BC, 0x8839, 0xF3BD, 0x883C, 0xF3BE, 0x7F36, + 0xF3BF, 0x7F42, 0xF3C0, 0x7F44, 0xF3C1, 0x7F45, 0xF3C2, 0x8210, 0xF3C3, 0x7AFA, 0xF3C4, 0x7AFD, 0xF3C5, 0x7B08, 0xF3C6, 0x7B03, + 0xF3C7, 0x7B04, 0xF3C8, 0x7B15, 0xF3C9, 0x7B0A, 0xF3CA, 0x7B2B, 0xF3CB, 0x7B0F, 0xF3CC, 0x7B47, 0xF3CD, 0x7B38, 0xF3CE, 0x7B2A, + 0xF3CF, 0x7B19, 0xF3D0, 0x7B2E, 0xF3D1, 0x7B31, 0xF3D2, 0x7B20, 0xF3D3, 0x7B25, 0xF3D4, 0x7B24, 0xF3D5, 0x7B33, 0xF3D6, 0x7B3E, + 0xF3D7, 0x7B1E, 0xF3D8, 0x7B58, 0xF3D9, 0x7B5A, 0xF3DA, 0x7B45, 0xF3DB, 0x7B75, 0xF3DC, 0x7B4C, 0xF3DD, 0x7B5D, 0xF3DE, 0x7B60, + 0xF3DF, 0x7B6E, 0xF3E0, 0x7B7B, 0xF3E1, 0x7B62, 0xF3E2, 0x7B72, 0xF3E3, 0x7B71, 0xF3E4, 0x7B90, 0xF3E5, 0x7BA6, 0xF3E6, 0x7BA7, + 0xF3E7, 0x7BB8, 0xF3E8, 0x7BAC, 0xF3E9, 0x7B9D, 0xF3EA, 0x7BA8, 0xF3EB, 0x7B85, 0xF3EC, 0x7BAA, 0xF3ED, 0x7B9C, 0xF3EE, 0x7BA2, + 0xF3EF, 0x7BAB, 0xF3F0, 0x7BB4, 0xF3F1, 0x7BD1, 0xF3F2, 0x7BC1, 0xF3F3, 0x7BCC, 0xF3F4, 0x7BDD, 0xF3F5, 0x7BDA, 0xF3F6, 0x7BE5, + 0xF3F7, 0x7BE6, 0xF3F8, 0x7BEA, 0xF3F9, 0x7C0C, 0xF3FA, 0x7BFE, 0xF3FB, 0x7BFC, 0xF3FC, 0x7C0F, 0xF3FD, 0x7C16, 0xF3FE, 0x7C0B, + 0xF440, 0x9B07, 0xF441, 0x9B09, 0xF442, 0x9B0A, 0xF443, 0x9B0B, 0xF444, 0x9B0C, 0xF445, 0x9B0D, 0xF446, 0x9B0E, 0xF447, 0x9B10, + 0xF448, 0x9B11, 0xF449, 0x9B12, 0xF44A, 0x9B14, 0xF44B, 0x9B15, 0xF44C, 0x9B16, 0xF44D, 0x9B17, 0xF44E, 0x9B18, 0xF44F, 0x9B19, + 0xF450, 0x9B1A, 0xF451, 0x9B1B, 0xF452, 0x9B1C, 0xF453, 0x9B1D, 0xF454, 0x9B1E, 0xF455, 0x9B20, 0xF456, 0x9B21, 0xF457, 0x9B22, + 0xF458, 0x9B24, 0xF459, 0x9B25, 0xF45A, 0x9B26, 0xF45B, 0x9B27, 0xF45C, 0x9B28, 0xF45D, 0x9B29, 0xF45E, 0x9B2A, 0xF45F, 0x9B2B, + 0xF460, 0x9B2C, 0xF461, 0x9B2D, 0xF462, 0x9B2E, 0xF463, 0x9B30, 0xF464, 0x9B31, 0xF465, 0x9B33, 0xF466, 0x9B34, 0xF467, 0x9B35, + 0xF468, 0x9B36, 0xF469, 0x9B37, 0xF46A, 0x9B38, 0xF46B, 0x9B39, 0xF46C, 0x9B3A, 0xF46D, 0x9B3D, 0xF46E, 0x9B3E, 0xF46F, 0x9B3F, + 0xF470, 0x9B40, 0xF471, 0x9B46, 0xF472, 0x9B4A, 0xF473, 0x9B4B, 0xF474, 0x9B4C, 0xF475, 0x9B4E, 0xF476, 0x9B50, 0xF477, 0x9B52, + 0xF478, 0x9B53, 0xF479, 0x9B55, 0xF47A, 0x9B56, 0xF47B, 0x9B57, 0xF47C, 0x9B58, 0xF47D, 0x9B59, 0xF47E, 0x9B5A, 0xF480, 0x9B5B, + 0xF481, 0x9B5C, 0xF482, 0x9B5D, 0xF483, 0x9B5E, 0xF484, 0x9B5F, 0xF485, 0x9B60, 0xF486, 0x9B61, 0xF487, 0x9B62, 0xF488, 0x9B63, + 0xF489, 0x9B64, 0xF48A, 0x9B65, 0xF48B, 0x9B66, 0xF48C, 0x9B67, 0xF48D, 0x9B68, 0xF48E, 0x9B69, 0xF48F, 0x9B6A, 0xF490, 0x9B6B, + 0xF491, 0x9B6C, 0xF492, 0x9B6D, 0xF493, 0x9B6E, 0xF494, 0x9B6F, 0xF495, 0x9B70, 0xF496, 0x9B71, 0xF497, 0x9B72, 0xF498, 0x9B73, + 0xF499, 0x9B74, 0xF49A, 0x9B75, 0xF49B, 0x9B76, 0xF49C, 0x9B77, 0xF49D, 0x9B78, 0xF49E, 0x9B79, 0xF49F, 0x9B7A, 0xF4A0, 0x9B7B, + 0xF4A1, 0x7C1F, 0xF4A2, 0x7C2A, 0xF4A3, 0x7C26, 0xF4A4, 0x7C38, 0xF4A5, 0x7C41, 0xF4A6, 0x7C40, 0xF4A7, 0x81FE, 0xF4A8, 0x8201, + 0xF4A9, 0x8202, 0xF4AA, 0x8204, 0xF4AB, 0x81EC, 0xF4AC, 0x8844, 0xF4AD, 0x8221, 0xF4AE, 0x8222, 0xF4AF, 0x8223, 0xF4B0, 0x822D, + 0xF4B1, 0x822F, 0xF4B2, 0x8228, 0xF4B3, 0x822B, 0xF4B4, 0x8238, 0xF4B5, 0x823B, 0xF4B6, 0x8233, 0xF4B7, 0x8234, 0xF4B8, 0x823E, + 0xF4B9, 0x8244, 0xF4BA, 0x8249, 0xF4BB, 0x824B, 0xF4BC, 0x824F, 0xF4BD, 0x825A, 0xF4BE, 0x825F, 0xF4BF, 0x8268, 0xF4C0, 0x887E, + 0xF4C1, 0x8885, 0xF4C2, 0x8888, 0xF4C3, 0x88D8, 0xF4C4, 0x88DF, 0xF4C5, 0x895E, 0xF4C6, 0x7F9D, 0xF4C7, 0x7F9F, 0xF4C8, 0x7FA7, + 0xF4C9, 0x7FAF, 0xF4CA, 0x7FB0, 0xF4CB, 0x7FB2, 0xF4CC, 0x7C7C, 0xF4CD, 0x6549, 0xF4CE, 0x7C91, 0xF4CF, 0x7C9D, 0xF4D0, 0x7C9C, + 0xF4D1, 0x7C9E, 0xF4D2, 0x7CA2, 0xF4D3, 0x7CB2, 0xF4D4, 0x7CBC, 0xF4D5, 0x7CBD, 0xF4D6, 0x7CC1, 0xF4D7, 0x7CC7, 0xF4D8, 0x7CCC, + 0xF4D9, 0x7CCD, 0xF4DA, 0x7CC8, 0xF4DB, 0x7CC5, 0xF4DC, 0x7CD7, 0xF4DD, 0x7CE8, 0xF4DE, 0x826E, 0xF4DF, 0x66A8, 0xF4E0, 0x7FBF, + 0xF4E1, 0x7FCE, 0xF4E2, 0x7FD5, 0xF4E3, 0x7FE5, 0xF4E4, 0x7FE1, 0xF4E5, 0x7FE6, 0xF4E6, 0x7FE9, 0xF4E7, 0x7FEE, 0xF4E8, 0x7FF3, + 0xF4E9, 0x7CF8, 0xF4EA, 0x7D77, 0xF4EB, 0x7DA6, 0xF4EC, 0x7DAE, 0xF4ED, 0x7E47, 0xF4EE, 0x7E9B, 0xF4EF, 0x9EB8, 0xF4F0, 0x9EB4, + 0xF4F1, 0x8D73, 0xF4F2, 0x8D84, 0xF4F3, 0x8D94, 0xF4F4, 0x8D91, 0xF4F5, 0x8DB1, 0xF4F6, 0x8D67, 0xF4F7, 0x8D6D, 0xF4F8, 0x8C47, + 0xF4F9, 0x8C49, 0xF4FA, 0x914A, 0xF4FB, 0x9150, 0xF4FC, 0x914E, 0xF4FD, 0x914F, 0xF4FE, 0x9164, 0xF540, 0x9B7C, 0xF541, 0x9B7D, + 0xF542, 0x9B7E, 0xF543, 0x9B7F, 0xF544, 0x9B80, 0xF545, 0x9B81, 0xF546, 0x9B82, 0xF547, 0x9B83, 0xF548, 0x9B84, 0xF549, 0x9B85, + 0xF54A, 0x9B86, 0xF54B, 0x9B87, 0xF54C, 0x9B88, 0xF54D, 0x9B89, 0xF54E, 0x9B8A, 0xF54F, 0x9B8B, 0xF550, 0x9B8C, 0xF551, 0x9B8D, + 0xF552, 0x9B8E, 0xF553, 0x9B8F, 0xF554, 0x9B90, 0xF555, 0x9B91, 0xF556, 0x9B92, 0xF557, 0x9B93, 0xF558, 0x9B94, 0xF559, 0x9B95, + 0xF55A, 0x9B96, 0xF55B, 0x9B97, 0xF55C, 0x9B98, 0xF55D, 0x9B99, 0xF55E, 0x9B9A, 0xF55F, 0x9B9B, 0xF560, 0x9B9C, 0xF561, 0x9B9D, + 0xF562, 0x9B9E, 0xF563, 0x9B9F, 0xF564, 0x9BA0, 0xF565, 0x9BA1, 0xF566, 0x9BA2, 0xF567, 0x9BA3, 0xF568, 0x9BA4, 0xF569, 0x9BA5, + 0xF56A, 0x9BA6, 0xF56B, 0x9BA7, 0xF56C, 0x9BA8, 0xF56D, 0x9BA9, 0xF56E, 0x9BAA, 0xF56F, 0x9BAB, 0xF570, 0x9BAC, 0xF571, 0x9BAD, + 0xF572, 0x9BAE, 0xF573, 0x9BAF, 0xF574, 0x9BB0, 0xF575, 0x9BB1, 0xF576, 0x9BB2, 0xF577, 0x9BB3, 0xF578, 0x9BB4, 0xF579, 0x9BB5, + 0xF57A, 0x9BB6, 0xF57B, 0x9BB7, 0xF57C, 0x9BB8, 0xF57D, 0x9BB9, 0xF57E, 0x9BBA, 0xF580, 0x9BBB, 0xF581, 0x9BBC, 0xF582, 0x9BBD, + 0xF583, 0x9BBE, 0xF584, 0x9BBF, 0xF585, 0x9BC0, 0xF586, 0x9BC1, 0xF587, 0x9BC2, 0xF588, 0x9BC3, 0xF589, 0x9BC4, 0xF58A, 0x9BC5, + 0xF58B, 0x9BC6, 0xF58C, 0x9BC7, 0xF58D, 0x9BC8, 0xF58E, 0x9BC9, 0xF58F, 0x9BCA, 0xF590, 0x9BCB, 0xF591, 0x9BCC, 0xF592, 0x9BCD, + 0xF593, 0x9BCE, 0xF594, 0x9BCF, 0xF595, 0x9BD0, 0xF596, 0x9BD1, 0xF597, 0x9BD2, 0xF598, 0x9BD3, 0xF599, 0x9BD4, 0xF59A, 0x9BD5, + 0xF59B, 0x9BD6, 0xF59C, 0x9BD7, 0xF59D, 0x9BD8, 0xF59E, 0x9BD9, 0xF59F, 0x9BDA, 0xF5A0, 0x9BDB, 0xF5A1, 0x9162, 0xF5A2, 0x9161, + 0xF5A3, 0x9170, 0xF5A4, 0x9169, 0xF5A5, 0x916F, 0xF5A6, 0x917D, 0xF5A7, 0x917E, 0xF5A8, 0x9172, 0xF5A9, 0x9174, 0xF5AA, 0x9179, + 0xF5AB, 0x918C, 0xF5AC, 0x9185, 0xF5AD, 0x9190, 0xF5AE, 0x918D, 0xF5AF, 0x9191, 0xF5B0, 0x91A2, 0xF5B1, 0x91A3, 0xF5B2, 0x91AA, + 0xF5B3, 0x91AD, 0xF5B4, 0x91AE, 0xF5B5, 0x91AF, 0xF5B6, 0x91B5, 0xF5B7, 0x91B4, 0xF5B8, 0x91BA, 0xF5B9, 0x8C55, 0xF5BA, 0x9E7E, + 0xF5BB, 0x8DB8, 0xF5BC, 0x8DEB, 0xF5BD, 0x8E05, 0xF5BE, 0x8E59, 0xF5BF, 0x8E69, 0xF5C0, 0x8DB5, 0xF5C1, 0x8DBF, 0xF5C2, 0x8DBC, + 0xF5C3, 0x8DBA, 0xF5C4, 0x8DC4, 0xF5C5, 0x8DD6, 0xF5C6, 0x8DD7, 0xF5C7, 0x8DDA, 0xF5C8, 0x8DDE, 0xF5C9, 0x8DCE, 0xF5CA, 0x8DCF, + 0xF5CB, 0x8DDB, 0xF5CC, 0x8DC6, 0xF5CD, 0x8DEC, 0xF5CE, 0x8DF7, 0xF5CF, 0x8DF8, 0xF5D0, 0x8DE3, 0xF5D1, 0x8DF9, 0xF5D2, 0x8DFB, + 0xF5D3, 0x8DE4, 0xF5D4, 0x8E09, 0xF5D5, 0x8DFD, 0xF5D6, 0x8E14, 0xF5D7, 0x8E1D, 0xF5D8, 0x8E1F, 0xF5D9, 0x8E2C, 0xF5DA, 0x8E2E, + 0xF5DB, 0x8E23, 0xF5DC, 0x8E2F, 0xF5DD, 0x8E3A, 0xF5DE, 0x8E40, 0xF5DF, 0x8E39, 0xF5E0, 0x8E35, 0xF5E1, 0x8E3D, 0xF5E2, 0x8E31, + 0xF5E3, 0x8E49, 0xF5E4, 0x8E41, 0xF5E5, 0x8E42, 0xF5E6, 0x8E51, 0xF5E7, 0x8E52, 0xF5E8, 0x8E4A, 0xF5E9, 0x8E70, 0xF5EA, 0x8E76, + 0xF5EB, 0x8E7C, 0xF5EC, 0x8E6F, 0xF5ED, 0x8E74, 0xF5EE, 0x8E85, 0xF5EF, 0x8E8F, 0xF5F0, 0x8E94, 0xF5F1, 0x8E90, 0xF5F2, 0x8E9C, + 0xF5F3, 0x8E9E, 0xF5F4, 0x8C78, 0xF5F5, 0x8C82, 0xF5F6, 0x8C8A, 0xF5F7, 0x8C85, 0xF5F8, 0x8C98, 0xF5F9, 0x8C94, 0xF5FA, 0x659B, + 0xF5FB, 0x89D6, 0xF5FC, 0x89DE, 0xF5FD, 0x89DA, 0xF5FE, 0x89DC, 0xF640, 0x9BDC, 0xF641, 0x9BDD, 0xF642, 0x9BDE, 0xF643, 0x9BDF, + 0xF644, 0x9BE0, 0xF645, 0x9BE1, 0xF646, 0x9BE2, 0xF647, 0x9BE3, 0xF648, 0x9BE4, 0xF649, 0x9BE5, 0xF64A, 0x9BE6, 0xF64B, 0x9BE7, + 0xF64C, 0x9BE8, 0xF64D, 0x9BE9, 0xF64E, 0x9BEA, 0xF64F, 0x9BEB, 0xF650, 0x9BEC, 0xF651, 0x9BED, 0xF652, 0x9BEE, 0xF653, 0x9BEF, + 0xF654, 0x9BF0, 0xF655, 0x9BF1, 0xF656, 0x9BF2, 0xF657, 0x9BF3, 0xF658, 0x9BF4, 0xF659, 0x9BF5, 0xF65A, 0x9BF6, 0xF65B, 0x9BF7, + 0xF65C, 0x9BF8, 0xF65D, 0x9BF9, 0xF65E, 0x9BFA, 0xF65F, 0x9BFB, 0xF660, 0x9BFC, 0xF661, 0x9BFD, 0xF662, 0x9BFE, 0xF663, 0x9BFF, + 0xF664, 0x9C00, 0xF665, 0x9C01, 0xF666, 0x9C02, 0xF667, 0x9C03, 0xF668, 0x9C04, 0xF669, 0x9C05, 0xF66A, 0x9C06, 0xF66B, 0x9C07, + 0xF66C, 0x9C08, 0xF66D, 0x9C09, 0xF66E, 0x9C0A, 0xF66F, 0x9C0B, 0xF670, 0x9C0C, 0xF671, 0x9C0D, 0xF672, 0x9C0E, 0xF673, 0x9C0F, + 0xF674, 0x9C10, 0xF675, 0x9C11, 0xF676, 0x9C12, 0xF677, 0x9C13, 0xF678, 0x9C14, 0xF679, 0x9C15, 0xF67A, 0x9C16, 0xF67B, 0x9C17, + 0xF67C, 0x9C18, 0xF67D, 0x9C19, 0xF67E, 0x9C1A, 0xF680, 0x9C1B, 0xF681, 0x9C1C, 0xF682, 0x9C1D, 0xF683, 0x9C1E, 0xF684, 0x9C1F, + 0xF685, 0x9C20, 0xF686, 0x9C21, 0xF687, 0x9C22, 0xF688, 0x9C23, 0xF689, 0x9C24, 0xF68A, 0x9C25, 0xF68B, 0x9C26, 0xF68C, 0x9C27, + 0xF68D, 0x9C28, 0xF68E, 0x9C29, 0xF68F, 0x9C2A, 0xF690, 0x9C2B, 0xF691, 0x9C2C, 0xF692, 0x9C2D, 0xF693, 0x9C2E, 0xF694, 0x9C2F, + 0xF695, 0x9C30, 0xF696, 0x9C31, 0xF697, 0x9C32, 0xF698, 0x9C33, 0xF699, 0x9C34, 0xF69A, 0x9C35, 0xF69B, 0x9C36, 0xF69C, 0x9C37, + 0xF69D, 0x9C38, 0xF69E, 0x9C39, 0xF69F, 0x9C3A, 0xF6A0, 0x9C3B, 0xF6A1, 0x89E5, 0xF6A2, 0x89EB, 0xF6A3, 0x89EF, 0xF6A4, 0x8A3E, + 0xF6A5, 0x8B26, 0xF6A6, 0x9753, 0xF6A7, 0x96E9, 0xF6A8, 0x96F3, 0xF6A9, 0x96EF, 0xF6AA, 0x9706, 0xF6AB, 0x9701, 0xF6AC, 0x9708, + 0xF6AD, 0x970F, 0xF6AE, 0x970E, 0xF6AF, 0x972A, 0xF6B0, 0x972D, 0xF6B1, 0x9730, 0xF6B2, 0x973E, 0xF6B3, 0x9F80, 0xF6B4, 0x9F83, + 0xF6B5, 0x9F85, 0xF6B6, 0x9F86, 0xF6B7, 0x9F87, 0xF6B8, 0x9F88, 0xF6B9, 0x9F89, 0xF6BA, 0x9F8A, 0xF6BB, 0x9F8C, 0xF6BC, 0x9EFE, + 0xF6BD, 0x9F0B, 0xF6BE, 0x9F0D, 0xF6BF, 0x96B9, 0xF6C0, 0x96BC, 0xF6C1, 0x96BD, 0xF6C2, 0x96CE, 0xF6C3, 0x96D2, 0xF6C4, 0x77BF, + 0xF6C5, 0x96E0, 0xF6C6, 0x928E, 0xF6C7, 0x92AE, 0xF6C8, 0x92C8, 0xF6C9, 0x933E, 0xF6CA, 0x936A, 0xF6CB, 0x93CA, 0xF6CC, 0x938F, + 0xF6CD, 0x943E, 0xF6CE, 0x946B, 0xF6CF, 0x9C7F, 0xF6D0, 0x9C82, 0xF6D1, 0x9C85, 0xF6D2, 0x9C86, 0xF6D3, 0x9C87, 0xF6D4, 0x9C88, + 0xF6D5, 0x7A23, 0xF6D6, 0x9C8B, 0xF6D7, 0x9C8E, 0xF6D8, 0x9C90, 0xF6D9, 0x9C91, 0xF6DA, 0x9C92, 0xF6DB, 0x9C94, 0xF6DC, 0x9C95, + 0xF6DD, 0x9C9A, 0xF6DE, 0x9C9B, 0xF6DF, 0x9C9E, 0xF6E0, 0x9C9F, 0xF6E1, 0x9CA0, 0xF6E2, 0x9CA1, 0xF6E3, 0x9CA2, 0xF6E4, 0x9CA3, + 0xF6E5, 0x9CA5, 0xF6E6, 0x9CA6, 0xF6E7, 0x9CA7, 0xF6E8, 0x9CA8, 0xF6E9, 0x9CA9, 0xF6EA, 0x9CAB, 0xF6EB, 0x9CAD, 0xF6EC, 0x9CAE, + 0xF6ED, 0x9CB0, 0xF6EE, 0x9CB1, 0xF6EF, 0x9CB2, 0xF6F0, 0x9CB3, 0xF6F1, 0x9CB4, 0xF6F2, 0x9CB5, 0xF6F3, 0x9CB6, 0xF6F4, 0x9CB7, + 0xF6F5, 0x9CBA, 0xF6F6, 0x9CBB, 0xF6F7, 0x9CBC, 0xF6F8, 0x9CBD, 0xF6F9, 0x9CC4, 0xF6FA, 0x9CC5, 0xF6FB, 0x9CC6, 0xF6FC, 0x9CC7, + 0xF6FD, 0x9CCA, 0xF6FE, 0x9CCB, 0xF740, 0x9C3C, 0xF741, 0x9C3D, 0xF742, 0x9C3E, 0xF743, 0x9C3F, 0xF744, 0x9C40, 0xF745, 0x9C41, + 0xF746, 0x9C42, 0xF747, 0x9C43, 0xF748, 0x9C44, 0xF749, 0x9C45, 0xF74A, 0x9C46, 0xF74B, 0x9C47, 0xF74C, 0x9C48, 0xF74D, 0x9C49, + 0xF74E, 0x9C4A, 0xF74F, 0x9C4B, 0xF750, 0x9C4C, 0xF751, 0x9C4D, 0xF752, 0x9C4E, 0xF753, 0x9C4F, 0xF754, 0x9C50, 0xF755, 0x9C51, + 0xF756, 0x9C52, 0xF757, 0x9C53, 0xF758, 0x9C54, 0xF759, 0x9C55, 0xF75A, 0x9C56, 0xF75B, 0x9C57, 0xF75C, 0x9C58, 0xF75D, 0x9C59, + 0xF75E, 0x9C5A, 0xF75F, 0x9C5B, 0xF760, 0x9C5C, 0xF761, 0x9C5D, 0xF762, 0x9C5E, 0xF763, 0x9C5F, 0xF764, 0x9C60, 0xF765, 0x9C61, + 0xF766, 0x9C62, 0xF767, 0x9C63, 0xF768, 0x9C64, 0xF769, 0x9C65, 0xF76A, 0x9C66, 0xF76B, 0x9C67, 0xF76C, 0x9C68, 0xF76D, 0x9C69, + 0xF76E, 0x9C6A, 0xF76F, 0x9C6B, 0xF770, 0x9C6C, 0xF771, 0x9C6D, 0xF772, 0x9C6E, 0xF773, 0x9C6F, 0xF774, 0x9C70, 0xF775, 0x9C71, + 0xF776, 0x9C72, 0xF777, 0x9C73, 0xF778, 0x9C74, 0xF779, 0x9C75, 0xF77A, 0x9C76, 0xF77B, 0x9C77, 0xF77C, 0x9C78, 0xF77D, 0x9C79, + 0xF77E, 0x9C7A, 0xF780, 0x9C7B, 0xF781, 0x9C7D, 0xF782, 0x9C7E, 0xF783, 0x9C80, 0xF784, 0x9C83, 0xF785, 0x9C84, 0xF786, 0x9C89, + 0xF787, 0x9C8A, 0xF788, 0x9C8C, 0xF789, 0x9C8F, 0xF78A, 0x9C93, 0xF78B, 0x9C96, 0xF78C, 0x9C97, 0xF78D, 0x9C98, 0xF78E, 0x9C99, + 0xF78F, 0x9C9D, 0xF790, 0x9CAA, 0xF791, 0x9CAC, 0xF792, 0x9CAF, 0xF793, 0x9CB9, 0xF794, 0x9CBE, 0xF795, 0x9CBF, 0xF796, 0x9CC0, + 0xF797, 0x9CC1, 0xF798, 0x9CC2, 0xF799, 0x9CC8, 0xF79A, 0x9CC9, 0xF79B, 0x9CD1, 0xF79C, 0x9CD2, 0xF79D, 0x9CDA, 0xF79E, 0x9CDB, + 0xF79F, 0x9CE0, 0xF7A0, 0x9CE1, 0xF7A1, 0x9CCC, 0xF7A2, 0x9CCD, 0xF7A3, 0x9CCE, 0xF7A4, 0x9CCF, 0xF7A5, 0x9CD0, 0xF7A6, 0x9CD3, + 0xF7A7, 0x9CD4, 0xF7A8, 0x9CD5, 0xF7A9, 0x9CD7, 0xF7AA, 0x9CD8, 0xF7AB, 0x9CD9, 0xF7AC, 0x9CDC, 0xF7AD, 0x9CDD, 0xF7AE, 0x9CDF, + 0xF7AF, 0x9CE2, 0xF7B0, 0x977C, 0xF7B1, 0x9785, 0xF7B2, 0x9791, 0xF7B3, 0x9792, 0xF7B4, 0x9794, 0xF7B5, 0x97AF, 0xF7B6, 0x97AB, + 0xF7B7, 0x97A3, 0xF7B8, 0x97B2, 0xF7B9, 0x97B4, 0xF7BA, 0x9AB1, 0xF7BB, 0x9AB0, 0xF7BC, 0x9AB7, 0xF7BD, 0x9E58, 0xF7BE, 0x9AB6, + 0xF7BF, 0x9ABA, 0xF7C0, 0x9ABC, 0xF7C1, 0x9AC1, 0xF7C2, 0x9AC0, 0xF7C3, 0x9AC5, 0xF7C4, 0x9AC2, 0xF7C5, 0x9ACB, 0xF7C6, 0x9ACC, + 0xF7C7, 0x9AD1, 0xF7C8, 0x9B45, 0xF7C9, 0x9B43, 0xF7CA, 0x9B47, 0xF7CB, 0x9B49, 0xF7CC, 0x9B48, 0xF7CD, 0x9B4D, 0xF7CE, 0x9B51, + 0xF7CF, 0x98E8, 0xF7D0, 0x990D, 0xF7D1, 0x992E, 0xF7D2, 0x9955, 0xF7D3, 0x9954, 0xF7D4, 0x9ADF, 0xF7D5, 0x9AE1, 0xF7D6, 0x9AE6, + 0xF7D7, 0x9AEF, 0xF7D8, 0x9AEB, 0xF7D9, 0x9AFB, 0xF7DA, 0x9AED, 0xF7DB, 0x9AF9, 0xF7DC, 0x9B08, 0xF7DD, 0x9B0F, 0xF7DE, 0x9B13, + 0xF7DF, 0x9B1F, 0xF7E0, 0x9B23, 0xF7E1, 0x9EBD, 0xF7E2, 0x9EBE, 0xF7E3, 0x7E3B, 0xF7E4, 0x9E82, 0xF7E5, 0x9E87, 0xF7E6, 0x9E88, + 0xF7E7, 0x9E8B, 0xF7E8, 0x9E92, 0xF7E9, 0x93D6, 0xF7EA, 0x9E9D, 0xF7EB, 0x9E9F, 0xF7EC, 0x9EDB, 0xF7ED, 0x9EDC, 0xF7EE, 0x9EDD, + 0xF7EF, 0x9EE0, 0xF7F0, 0x9EDF, 0xF7F1, 0x9EE2, 0xF7F2, 0x9EE9, 0xF7F3, 0x9EE7, 0xF7F4, 0x9EE5, 0xF7F5, 0x9EEA, 0xF7F6, 0x9EEF, + 0xF7F7, 0x9F22, 0xF7F8, 0x9F2C, 0xF7F9, 0x9F2F, 0xF7FA, 0x9F39, 0xF7FB, 0x9F37, 0xF7FC, 0x9F3D, 0xF7FD, 0x9F3E, 0xF7FE, 0x9F44, + 0xF840, 0x9CE3, 0xF841, 0x9CE4, 0xF842, 0x9CE5, 0xF843, 0x9CE6, 0xF844, 0x9CE7, 0xF845, 0x9CE8, 0xF846, 0x9CE9, 0xF847, 0x9CEA, + 0xF848, 0x9CEB, 0xF849, 0x9CEC, 0xF84A, 0x9CED, 0xF84B, 0x9CEE, 0xF84C, 0x9CEF, 0xF84D, 0x9CF0, 0xF84E, 0x9CF1, 0xF84F, 0x9CF2, + 0xF850, 0x9CF3, 0xF851, 0x9CF4, 0xF852, 0x9CF5, 0xF853, 0x9CF6, 0xF854, 0x9CF7, 0xF855, 0x9CF8, 0xF856, 0x9CF9, 0xF857, 0x9CFA, + 0xF858, 0x9CFB, 0xF859, 0x9CFC, 0xF85A, 0x9CFD, 0xF85B, 0x9CFE, 0xF85C, 0x9CFF, 0xF85D, 0x9D00, 0xF85E, 0x9D01, 0xF85F, 0x9D02, + 0xF860, 0x9D03, 0xF861, 0x9D04, 0xF862, 0x9D05, 0xF863, 0x9D06, 0xF864, 0x9D07, 0xF865, 0x9D08, 0xF866, 0x9D09, 0xF867, 0x9D0A, + 0xF868, 0x9D0B, 0xF869, 0x9D0C, 0xF86A, 0x9D0D, 0xF86B, 0x9D0E, 0xF86C, 0x9D0F, 0xF86D, 0x9D10, 0xF86E, 0x9D11, 0xF86F, 0x9D12, + 0xF870, 0x9D13, 0xF871, 0x9D14, 0xF872, 0x9D15, 0xF873, 0x9D16, 0xF874, 0x9D17, 0xF875, 0x9D18, 0xF876, 0x9D19, 0xF877, 0x9D1A, + 0xF878, 0x9D1B, 0xF879, 0x9D1C, 0xF87A, 0x9D1D, 0xF87B, 0x9D1E, 0xF87C, 0x9D1F, 0xF87D, 0x9D20, 0xF87E, 0x9D21, 0xF880, 0x9D22, + 0xF881, 0x9D23, 0xF882, 0x9D24, 0xF883, 0x9D25, 0xF884, 0x9D26, 0xF885, 0x9D27, 0xF886, 0x9D28, 0xF887, 0x9D29, 0xF888, 0x9D2A, + 0xF889, 0x9D2B, 0xF88A, 0x9D2C, 0xF88B, 0x9D2D, 0xF88C, 0x9D2E, 0xF88D, 0x9D2F, 0xF88E, 0x9D30, 0xF88F, 0x9D31, 0xF890, 0x9D32, + 0xF891, 0x9D33, 0xF892, 0x9D34, 0xF893, 0x9D35, 0xF894, 0x9D36, 0xF895, 0x9D37, 0xF896, 0x9D38, 0xF897, 0x9D39, 0xF898, 0x9D3A, + 0xF899, 0x9D3B, 0xF89A, 0x9D3C, 0xF89B, 0x9D3D, 0xF89C, 0x9D3E, 0xF89D, 0x9D3F, 0xF89E, 0x9D40, 0xF89F, 0x9D41, 0xF8A0, 0x9D42, + 0xF940, 0x9D43, 0xF941, 0x9D44, 0xF942, 0x9D45, 0xF943, 0x9D46, 0xF944, 0x9D47, 0xF945, 0x9D48, 0xF946, 0x9D49, 0xF947, 0x9D4A, + 0xF948, 0x9D4B, 0xF949, 0x9D4C, 0xF94A, 0x9D4D, 0xF94B, 0x9D4E, 0xF94C, 0x9D4F, 0xF94D, 0x9D50, 0xF94E, 0x9D51, 0xF94F, 0x9D52, + 0xF950, 0x9D53, 0xF951, 0x9D54, 0xF952, 0x9D55, 0xF953, 0x9D56, 0xF954, 0x9D57, 0xF955, 0x9D58, 0xF956, 0x9D59, 0xF957, 0x9D5A, + 0xF958, 0x9D5B, 0xF959, 0x9D5C, 0xF95A, 0x9D5D, 0xF95B, 0x9D5E, 0xF95C, 0x9D5F, 0xF95D, 0x9D60, 0xF95E, 0x9D61, 0xF95F, 0x9D62, + 0xF960, 0x9D63, 0xF961, 0x9D64, 0xF962, 0x9D65, 0xF963, 0x9D66, 0xF964, 0x9D67, 0xF965, 0x9D68, 0xF966, 0x9D69, 0xF967, 0x9D6A, + 0xF968, 0x9D6B, 0xF969, 0x9D6C, 0xF96A, 0x9D6D, 0xF96B, 0x9D6E, 0xF96C, 0x9D6F, 0xF96D, 0x9D70, 0xF96E, 0x9D71, 0xF96F, 0x9D72, + 0xF970, 0x9D73, 0xF971, 0x9D74, 0xF972, 0x9D75, 0xF973, 0x9D76, 0xF974, 0x9D77, 0xF975, 0x9D78, 0xF976, 0x9D79, 0xF977, 0x9D7A, + 0xF978, 0x9D7B, 0xF979, 0x9D7C, 0xF97A, 0x9D7D, 0xF97B, 0x9D7E, 0xF97C, 0x9D7F, 0xF97D, 0x9D80, 0xF97E, 0x9D81, 0xF980, 0x9D82, + 0xF981, 0x9D83, 0xF982, 0x9D84, 0xF983, 0x9D85, 0xF984, 0x9D86, 0xF985, 0x9D87, 0xF986, 0x9D88, 0xF987, 0x9D89, 0xF988, 0x9D8A, + 0xF989, 0x9D8B, 0xF98A, 0x9D8C, 0xF98B, 0x9D8D, 0xF98C, 0x9D8E, 0xF98D, 0x9D8F, 0xF98E, 0x9D90, 0xF98F, 0x9D91, 0xF990, 0x9D92, + 0xF991, 0x9D93, 0xF992, 0x9D94, 0xF993, 0x9D95, 0xF994, 0x9D96, 0xF995, 0x9D97, 0xF996, 0x9D98, 0xF997, 0x9D99, 0xF998, 0x9D9A, + 0xF999, 0x9D9B, 0xF99A, 0x9D9C, 0xF99B, 0x9D9D, 0xF99C, 0x9D9E, 0xF99D, 0x9D9F, 0xF99E, 0x9DA0, 0xF99F, 0x9DA1, 0xF9A0, 0x9DA2, + 0xFA40, 0x9DA3, 0xFA41, 0x9DA4, 0xFA42, 0x9DA5, 0xFA43, 0x9DA6, 0xFA44, 0x9DA7, 0xFA45, 0x9DA8, 0xFA46, 0x9DA9, 0xFA47, 0x9DAA, + 0xFA48, 0x9DAB, 0xFA49, 0x9DAC, 0xFA4A, 0x9DAD, 0xFA4B, 0x9DAE, 0xFA4C, 0x9DAF, 0xFA4D, 0x9DB0, 0xFA4E, 0x9DB1, 0xFA4F, 0x9DB2, + 0xFA50, 0x9DB3, 0xFA51, 0x9DB4, 0xFA52, 0x9DB5, 0xFA53, 0x9DB6, 0xFA54, 0x9DB7, 0xFA55, 0x9DB8, 0xFA56, 0x9DB9, 0xFA57, 0x9DBA, + 0xFA58, 0x9DBB, 0xFA59, 0x9DBC, 0xFA5A, 0x9DBD, 0xFA5B, 0x9DBE, 0xFA5C, 0x9DBF, 0xFA5D, 0x9DC0, 0xFA5E, 0x9DC1, 0xFA5F, 0x9DC2, + 0xFA60, 0x9DC3, 0xFA61, 0x9DC4, 0xFA62, 0x9DC5, 0xFA63, 0x9DC6, 0xFA64, 0x9DC7, 0xFA65, 0x9DC8, 0xFA66, 0x9DC9, 0xFA67, 0x9DCA, + 0xFA68, 0x9DCB, 0xFA69, 0x9DCC, 0xFA6A, 0x9DCD, 0xFA6B, 0x9DCE, 0xFA6C, 0x9DCF, 0xFA6D, 0x9DD0, 0xFA6E, 0x9DD1, 0xFA6F, 0x9DD2, + 0xFA70, 0x9DD3, 0xFA71, 0x9DD4, 0xFA72, 0x9DD5, 0xFA73, 0x9DD6, 0xFA74, 0x9DD7, 0xFA75, 0x9DD8, 0xFA76, 0x9DD9, 0xFA77, 0x9DDA, + 0xFA78, 0x9DDB, 0xFA79, 0x9DDC, 0xFA7A, 0x9DDD, 0xFA7B, 0x9DDE, 0xFA7C, 0x9DDF, 0xFA7D, 0x9DE0, 0xFA7E, 0x9DE1, 0xFA80, 0x9DE2, + 0xFA81, 0x9DE3, 0xFA82, 0x9DE4, 0xFA83, 0x9DE5, 0xFA84, 0x9DE6, 0xFA85, 0x9DE7, 0xFA86, 0x9DE8, 0xFA87, 0x9DE9, 0xFA88, 0x9DEA, + 0xFA89, 0x9DEB, 0xFA8A, 0x9DEC, 0xFA8B, 0x9DED, 0xFA8C, 0x9DEE, 0xFA8D, 0x9DEF, 0xFA8E, 0x9DF0, 0xFA8F, 0x9DF1, 0xFA90, 0x9DF2, + 0xFA91, 0x9DF3, 0xFA92, 0x9DF4, 0xFA93, 0x9DF5, 0xFA94, 0x9DF6, 0xFA95, 0x9DF7, 0xFA96, 0x9DF8, 0xFA97, 0x9DF9, 0xFA98, 0x9DFA, + 0xFA99, 0x9DFB, 0xFA9A, 0x9DFC, 0xFA9B, 0x9DFD, 0xFA9C, 0x9DFE, 0xFA9D, 0x9DFF, 0xFA9E, 0x9E00, 0xFA9F, 0x9E01, 0xFAA0, 0x9E02, + 0xFB40, 0x9E03, 0xFB41, 0x9E04, 0xFB42, 0x9E05, 0xFB43, 0x9E06, 0xFB44, 0x9E07, 0xFB45, 0x9E08, 0xFB46, 0x9E09, 0xFB47, 0x9E0A, + 0xFB48, 0x9E0B, 0xFB49, 0x9E0C, 0xFB4A, 0x9E0D, 0xFB4B, 0x9E0E, 0xFB4C, 0x9E0F, 0xFB4D, 0x9E10, 0xFB4E, 0x9E11, 0xFB4F, 0x9E12, + 0xFB50, 0x9E13, 0xFB51, 0x9E14, 0xFB52, 0x9E15, 0xFB53, 0x9E16, 0xFB54, 0x9E17, 0xFB55, 0x9E18, 0xFB56, 0x9E19, 0xFB57, 0x9E1A, + 0xFB58, 0x9E1B, 0xFB59, 0x9E1C, 0xFB5A, 0x9E1D, 0xFB5B, 0x9E1E, 0xFB5C, 0x9E24, 0xFB5D, 0x9E27, 0xFB5E, 0x9E2E, 0xFB5F, 0x9E30, + 0xFB60, 0x9E34, 0xFB61, 0x9E3B, 0xFB62, 0x9E3C, 0xFB63, 0x9E40, 0xFB64, 0x9E4D, 0xFB65, 0x9E50, 0xFB66, 0x9E52, 0xFB67, 0x9E53, + 0xFB68, 0x9E54, 0xFB69, 0x9E56, 0xFB6A, 0x9E59, 0xFB6B, 0x9E5D, 0xFB6C, 0x9E5F, 0xFB6D, 0x9E60, 0xFB6E, 0x9E61, 0xFB6F, 0x9E62, + 0xFB70, 0x9E65, 0xFB71, 0x9E6E, 0xFB72, 0x9E6F, 0xFB73, 0x9E72, 0xFB74, 0x9E74, 0xFB75, 0x9E75, 0xFB76, 0x9E76, 0xFB77, 0x9E77, + 0xFB78, 0x9E78, 0xFB79, 0x9E79, 0xFB7A, 0x9E7A, 0xFB7B, 0x9E7B, 0xFB7C, 0x9E7C, 0xFB7D, 0x9E7D, 0xFB7E, 0x9E80, 0xFB80, 0x9E81, + 0xFB81, 0x9E83, 0xFB82, 0x9E84, 0xFB83, 0x9E85, 0xFB84, 0x9E86, 0xFB85, 0x9E89, 0xFB86, 0x9E8A, 0xFB87, 0x9E8C, 0xFB88, 0x9E8D, + 0xFB89, 0x9E8E, 0xFB8A, 0x9E8F, 0xFB8B, 0x9E90, 0xFB8C, 0x9E91, 0xFB8D, 0x9E94, 0xFB8E, 0x9E95, 0xFB8F, 0x9E96, 0xFB90, 0x9E97, + 0xFB91, 0x9E98, 0xFB92, 0x9E99, 0xFB93, 0x9E9A, 0xFB94, 0x9E9B, 0xFB95, 0x9E9C, 0xFB96, 0x9E9E, 0xFB97, 0x9EA0, 0xFB98, 0x9EA1, + 0xFB99, 0x9EA2, 0xFB9A, 0x9EA3, 0xFB9B, 0x9EA4, 0xFB9C, 0x9EA5, 0xFB9D, 0x9EA7, 0xFB9E, 0x9EA8, 0xFB9F, 0x9EA9, 0xFBA0, 0x9EAA, + 0xFC40, 0x9EAB, 0xFC41, 0x9EAC, 0xFC42, 0x9EAD, 0xFC43, 0x9EAE, 0xFC44, 0x9EAF, 0xFC45, 0x9EB0, 0xFC46, 0x9EB1, 0xFC47, 0x9EB2, + 0xFC48, 0x9EB3, 0xFC49, 0x9EB5, 0xFC4A, 0x9EB6, 0xFC4B, 0x9EB7, 0xFC4C, 0x9EB9, 0xFC4D, 0x9EBA, 0xFC4E, 0x9EBC, 0xFC4F, 0x9EBF, + 0xFC50, 0x9EC0, 0xFC51, 0x9EC1, 0xFC52, 0x9EC2, 0xFC53, 0x9EC3, 0xFC54, 0x9EC5, 0xFC55, 0x9EC6, 0xFC56, 0x9EC7, 0xFC57, 0x9EC8, + 0xFC58, 0x9ECA, 0xFC59, 0x9ECB, 0xFC5A, 0x9ECC, 0xFC5B, 0x9ED0, 0xFC5C, 0x9ED2, 0xFC5D, 0x9ED3, 0xFC5E, 0x9ED5, 0xFC5F, 0x9ED6, + 0xFC60, 0x9ED7, 0xFC61, 0x9ED9, 0xFC62, 0x9EDA, 0xFC63, 0x9EDE, 0xFC64, 0x9EE1, 0xFC65, 0x9EE3, 0xFC66, 0x9EE4, 0xFC67, 0x9EE6, + 0xFC68, 0x9EE8, 0xFC69, 0x9EEB, 0xFC6A, 0x9EEC, 0xFC6B, 0x9EED, 0xFC6C, 0x9EEE, 0xFC6D, 0x9EF0, 0xFC6E, 0x9EF1, 0xFC6F, 0x9EF2, + 0xFC70, 0x9EF3, 0xFC71, 0x9EF4, 0xFC72, 0x9EF5, 0xFC73, 0x9EF6, 0xFC74, 0x9EF7, 0xFC75, 0x9EF8, 0xFC76, 0x9EFA, 0xFC77, 0x9EFD, + 0xFC78, 0x9EFF, 0xFC79, 0x9F00, 0xFC7A, 0x9F01, 0xFC7B, 0x9F02, 0xFC7C, 0x9F03, 0xFC7D, 0x9F04, 0xFC7E, 0x9F05, 0xFC80, 0x9F06, + 0xFC81, 0x9F07, 0xFC82, 0x9F08, 0xFC83, 0x9F09, 0xFC84, 0x9F0A, 0xFC85, 0x9F0C, 0xFC86, 0x9F0F, 0xFC87, 0x9F11, 0xFC88, 0x9F12, + 0xFC89, 0x9F14, 0xFC8A, 0x9F15, 0xFC8B, 0x9F16, 0xFC8C, 0x9F18, 0xFC8D, 0x9F1A, 0xFC8E, 0x9F1B, 0xFC8F, 0x9F1C, 0xFC90, 0x9F1D, + 0xFC91, 0x9F1E, 0xFC92, 0x9F1F, 0xFC93, 0x9F21, 0xFC94, 0x9F23, 0xFC95, 0x9F24, 0xFC96, 0x9F25, 0xFC97, 0x9F26, 0xFC98, 0x9F27, + 0xFC99, 0x9F28, 0xFC9A, 0x9F29, 0xFC9B, 0x9F2A, 0xFC9C, 0x9F2B, 0xFC9D, 0x9F2D, 0xFC9E, 0x9F2E, 0xFC9F, 0x9F30, 0xFCA0, 0x9F31, + 0xFD40, 0x9F32, 0xFD41, 0x9F33, 0xFD42, 0x9F34, 0xFD43, 0x9F35, 0xFD44, 0x9F36, 0xFD45, 0x9F38, 0xFD46, 0x9F3A, 0xFD47, 0x9F3C, + 0xFD48, 0x9F3F, 0xFD49, 0x9F40, 0xFD4A, 0x9F41, 0xFD4B, 0x9F42, 0xFD4C, 0x9F43, 0xFD4D, 0x9F45, 0xFD4E, 0x9F46, 0xFD4F, 0x9F47, + 0xFD50, 0x9F48, 0xFD51, 0x9F49, 0xFD52, 0x9F4A, 0xFD53, 0x9F4B, 0xFD54, 0x9F4C, 0xFD55, 0x9F4D, 0xFD56, 0x9F4E, 0xFD57, 0x9F4F, + 0xFD58, 0x9F52, 0xFD59, 0x9F53, 0xFD5A, 0x9F54, 0xFD5B, 0x9F55, 0xFD5C, 0x9F56, 0xFD5D, 0x9F57, 0xFD5E, 0x9F58, 0xFD5F, 0x9F59, + 0xFD60, 0x9F5A, 0xFD61, 0x9F5B, 0xFD62, 0x9F5C, 0xFD63, 0x9F5D, 0xFD64, 0x9F5E, 0xFD65, 0x9F5F, 0xFD66, 0x9F60, 0xFD67, 0x9F61, + 0xFD68, 0x9F62, 0xFD69, 0x9F63, 0xFD6A, 0x9F64, 0xFD6B, 0x9F65, 0xFD6C, 0x9F66, 0xFD6D, 0x9F67, 0xFD6E, 0x9F68, 0xFD6F, 0x9F69, + 0xFD70, 0x9F6A, 0xFD71, 0x9F6B, 0xFD72, 0x9F6C, 0xFD73, 0x9F6D, 0xFD74, 0x9F6E, 0xFD75, 0x9F6F, 0xFD76, 0x9F70, 0xFD77, 0x9F71, + 0xFD78, 0x9F72, 0xFD79, 0x9F73, 0xFD7A, 0x9F74, 0xFD7B, 0x9F75, 0xFD7C, 0x9F76, 0xFD7D, 0x9F77, 0xFD7E, 0x9F78, 0xFD80, 0x9F79, + 0xFD81, 0x9F7A, 0xFD82, 0x9F7B, 0xFD83, 0x9F7C, 0xFD84, 0x9F7D, 0xFD85, 0x9F7E, 0xFD86, 0x9F81, 0xFD87, 0x9F82, 0xFD88, 0x9F8D, + 0xFD89, 0x9F8E, 0xFD8A, 0x9F8F, 0xFD8B, 0x9F90, 0xFD8C, 0x9F91, 0xFD8D, 0x9F92, 0xFD8E, 0x9F93, 0xFD8F, 0x9F94, 0xFD90, 0x9F95, + 0xFD91, 0x9F96, 0xFD92, 0x9F97, 0xFD93, 0x9F98, 0xFD94, 0x9F9C, 0xFD95, 0x9F9D, 0xFD96, 0x9F9E, 0xFD97, 0x9FA1, 0xFD98, 0x9FA2, + 0xFD99, 0x9FA3, 0xFD9A, 0x9FA4, 0xFD9B, 0x9FA5, 0xFD9C, 0xF92C, 0xFD9D, 0xF979, 0xFD9E, 0xF995, 0xFD9F, 0xF9E7, 0xFDA0, 0xF9F1, + 0xFE40, 0xFA0C, 0xFE41, 0xFA0D, 0xFE42, 0xFA0E, 0xFE43, 0xFA0F, 0xFE44, 0xFA11, 0xFE45, 0xFA13, 0xFE46, 0xFA14, 0xFE47, 0xFA18, + 0xFE48, 0xFA1F, 0xFE49, 0xFA20, 0xFE4A, 0xFA21, 0xFE4B, 0xFA23, 0xFE4C, 0xFA24, 0xFE4D, 0xFA27, 0xFE4E, 0xFA28, 0xFE4F, 0xFA29, + 0, 0 +}; +#endif + +#if FF_CODE_PAGE == 949 || FF_CODE_PAGE == 0 /* Korean */ +static const WCHAR uni2oem949[] = { /* Unicode --> Korean pairs */ + 0x00A1, 0xA2AE, 0x00A4, 0xA2B4, 0x00A7, 0xA1D7, 0x00A8, 0xA1A7, 0x00AA, 0xA8A3, 0x00AD, 0xA1A9, 0x00AE, 0xA2E7, 0x00B0, 0xA1C6, + 0x00B1, 0xA1BE, 0x00B2, 0xA9F7, 0x00B3, 0xA9F8, 0x00B4, 0xA2A5, 0x00B6, 0xA2D2, 0x00B7, 0xA1A4, 0x00B8, 0xA2AC, 0x00B9, 0xA9F6, + 0x00BA, 0xA8AC, 0x00BC, 0xA8F9, 0x00BD, 0xA8F6, 0x00BE, 0xA8FA, 0x00BF, 0xA2AF, 0x00C6, 0xA8A1, 0x00D0, 0xA8A2, 0x00D7, 0xA1BF, + 0x00D8, 0xA8AA, 0x00DE, 0xA8AD, 0x00DF, 0xA9AC, 0x00E6, 0xA9A1, 0x00F0, 0xA9A3, 0x00F7, 0xA1C0, 0x00F8, 0xA9AA, 0x00FE, 0xA9AD, + 0x0111, 0xA9A2, 0x0126, 0xA8A4, 0x0127, 0xA9A4, 0x0131, 0xA9A5, 0x0132, 0xA8A6, 0x0133, 0xA9A6, 0x0138, 0xA9A7, 0x013F, 0xA8A8, + 0x0140, 0xA9A8, 0x0141, 0xA8A9, 0x0142, 0xA9A9, 0x0149, 0xA9B0, 0x014A, 0xA8AF, 0x014B, 0xA9AF, 0x0152, 0xA8AB, 0x0153, 0xA9AB, + 0x0166, 0xA8AE, 0x0167, 0xA9AE, 0x02C7, 0xA2A7, 0x02D0, 0xA2B0, 0x02D8, 0xA2A8, 0x02D9, 0xA2AB, 0x02DA, 0xA2AA, 0x02DB, 0xA2AD, + 0x02DD, 0xA2A9, 0x0391, 0xA5C1, 0x0392, 0xA5C2, 0x0393, 0xA5C3, 0x0394, 0xA5C4, 0x0395, 0xA5C5, 0x0396, 0xA5C6, 0x0397, 0xA5C7, + 0x0398, 0xA5C8, 0x0399, 0xA5C9, 0x039A, 0xA5CA, 0x039B, 0xA5CB, 0x039C, 0xA5CC, 0x039D, 0xA5CD, 0x039E, 0xA5CE, 0x039F, 0xA5CF, + 0x03A0, 0xA5D0, 0x03A1, 0xA5D1, 0x03A3, 0xA5D2, 0x03A4, 0xA5D3, 0x03A5, 0xA5D4, 0x03A6, 0xA5D5, 0x03A7, 0xA5D6, 0x03A8, 0xA5D7, + 0x03A9, 0xA5D8, 0x03B1, 0xA5E1, 0x03B2, 0xA5E2, 0x03B3, 0xA5E3, 0x03B4, 0xA5E4, 0x03B5, 0xA5E5, 0x03B6, 0xA5E6, 0x03B7, 0xA5E7, + 0x03B8, 0xA5E8, 0x03B9, 0xA5E9, 0x03BA, 0xA5EA, 0x03BB, 0xA5EB, 0x03BC, 0xA5EC, 0x03BD, 0xA5ED, 0x03BE, 0xA5EE, 0x03BF, 0xA5EF, + 0x03C0, 0xA5F0, 0x03C1, 0xA5F1, 0x03C3, 0xA5F2, 0x03C4, 0xA5F3, 0x03C5, 0xA5F4, 0x03C6, 0xA5F5, 0x03C7, 0xA5F6, 0x03C8, 0xA5F7, + 0x03C9, 0xA5F8, 0x0401, 0xACA7, 0x0410, 0xACA1, 0x0411, 0xACA2, 0x0412, 0xACA3, 0x0413, 0xACA4, 0x0414, 0xACA5, 0x0415, 0xACA6, + 0x0416, 0xACA8, 0x0417, 0xACA9, 0x0418, 0xACAA, 0x0419, 0xACAB, 0x041A, 0xACAC, 0x041B, 0xACAD, 0x041C, 0xACAE, 0x041D, 0xACAF, + 0x041E, 0xACB0, 0x041F, 0xACB1, 0x0420, 0xACB2, 0x0421, 0xACB3, 0x0422, 0xACB4, 0x0423, 0xACB5, 0x0424, 0xACB6, 0x0425, 0xACB7, + 0x0426, 0xACB8, 0x0427, 0xACB9, 0x0428, 0xACBA, 0x0429, 0xACBB, 0x042A, 0xACBC, 0x042B, 0xACBD, 0x042C, 0xACBE, 0x042D, 0xACBF, + 0x042E, 0xACC0, 0x042F, 0xACC1, 0x0430, 0xACD1, 0x0431, 0xACD2, 0x0432, 0xACD3, 0x0433, 0xACD4, 0x0434, 0xACD5, 0x0435, 0xACD6, + 0x0436, 0xACD8, 0x0437, 0xACD9, 0x0438, 0xACDA, 0x0439, 0xACDB, 0x043A, 0xACDC, 0x043B, 0xACDD, 0x043C, 0xACDE, 0x043D, 0xACDF, + 0x043E, 0xACE0, 0x043F, 0xACE1, 0x0440, 0xACE2, 0x0441, 0xACE3, 0x0442, 0xACE4, 0x0443, 0xACE5, 0x0444, 0xACE6, 0x0445, 0xACE7, + 0x0446, 0xACE8, 0x0447, 0xACE9, 0x0448, 0xACEA, 0x0449, 0xACEB, 0x044A, 0xACEC, 0x044B, 0xACED, 0x044C, 0xACEE, 0x044D, 0xACEF, + 0x044E, 0xACF0, 0x044F, 0xACF1, 0x0451, 0xACD7, 0x2015, 0xA1AA, 0x2018, 0xA1AE, 0x2019, 0xA1AF, 0x201C, 0xA1B0, 0x201D, 0xA1B1, + 0x2020, 0xA2D3, 0x2021, 0xA2D4, 0x2025, 0xA1A5, 0x2026, 0xA1A6, 0x2030, 0xA2B6, 0x2032, 0xA1C7, 0x2033, 0xA1C8, 0x203B, 0xA1D8, + 0x2074, 0xA9F9, 0x207F, 0xA9FA, 0x2081, 0xA9FB, 0x2082, 0xA9FC, 0x2083, 0xA9FD, 0x2084, 0xA9FE, 0x20AC, 0xA2E6, 0x2103, 0xA1C9, + 0x2109, 0xA2B5, 0x2113, 0xA7A4, 0x2116, 0xA2E0, 0x2121, 0xA2E5, 0x2122, 0xA2E2, 0x2126, 0xA7D9, 0x212B, 0xA1CA, 0x2153, 0xA8F7, + 0x2154, 0xA8F8, 0x215B, 0xA8FB, 0x215C, 0xA8FC, 0x215D, 0xA8FD, 0x215E, 0xA8FE, 0x2160, 0xA5B0, 0x2161, 0xA5B1, 0x2162, 0xA5B2, + 0x2163, 0xA5B3, 0x2164, 0xA5B4, 0x2165, 0xA5B5, 0x2166, 0xA5B6, 0x2167, 0xA5B7, 0x2168, 0xA5B8, 0x2169, 0xA5B9, 0x2170, 0xA5A1, + 0x2171, 0xA5A2, 0x2172, 0xA5A3, 0x2173, 0xA5A4, 0x2174, 0xA5A5, 0x2175, 0xA5A6, 0x2176, 0xA5A7, 0x2177, 0xA5A8, 0x2178, 0xA5A9, + 0x2179, 0xA5AA, 0x2190, 0xA1E7, 0x2191, 0xA1E8, 0x2192, 0xA1E6, 0x2193, 0xA1E9, 0x2194, 0xA1EA, 0x2195, 0xA2D5, 0x2196, 0xA2D8, + 0x2197, 0xA2D6, 0x2198, 0xA2D9, 0x2199, 0xA2D7, 0x21D2, 0xA2A1, 0x21D4, 0xA2A2, 0x2200, 0xA2A3, 0x2202, 0xA1D3, 0x2203, 0xA2A4, + 0x2207, 0xA1D4, 0x2208, 0xA1F4, 0x220B, 0xA1F5, 0x220F, 0xA2B3, 0x2211, 0xA2B2, 0x221A, 0xA1EE, 0x221D, 0xA1F0, 0x221E, 0xA1C4, + 0x2220, 0xA1D0, 0x2225, 0xA1AB, 0x2227, 0xA1FC, 0x2228, 0xA1FD, 0x2229, 0xA1FB, 0x222A, 0xA1FA, 0x222B, 0xA1F2, 0x222C, 0xA1F3, + 0x222E, 0xA2B1, 0x2234, 0xA1C5, 0x2235, 0xA1F1, 0x223C, 0xA1AD, 0x223D, 0xA1EF, 0x2252, 0xA1D6, 0x2260, 0xA1C1, 0x2261, 0xA1D5, + 0x2264, 0xA1C2, 0x2265, 0xA1C3, 0x226A, 0xA1EC, 0x226B, 0xA1ED, 0x2282, 0xA1F8, 0x2283, 0xA1F9, 0x2286, 0xA1F6, 0x2287, 0xA1F7, + 0x2299, 0xA2C1, 0x22A5, 0xA1D1, 0x2312, 0xA1D2, 0x2460, 0xA8E7, 0x2461, 0xA8E8, 0x2462, 0xA8E9, 0x2463, 0xA8EA, 0x2464, 0xA8EB, + 0x2465, 0xA8EC, 0x2466, 0xA8ED, 0x2467, 0xA8EE, 0x2468, 0xA8EF, 0x2469, 0xA8F0, 0x246A, 0xA8F1, 0x246B, 0xA8F2, 0x246C, 0xA8F3, + 0x246D, 0xA8F4, 0x246E, 0xA8F5, 0x2474, 0xA9E7, 0x2475, 0xA9E8, 0x2476, 0xA9E9, 0x2477, 0xA9EA, 0x2478, 0xA9EB, 0x2479, 0xA9EC, + 0x247A, 0xA9ED, 0x247B, 0xA9EE, 0x247C, 0xA9EF, 0x247D, 0xA9F0, 0x247E, 0xA9F1, 0x247F, 0xA9F2, 0x2480, 0xA9F3, 0x2481, 0xA9F4, + 0x2482, 0xA9F5, 0x249C, 0xA9CD, 0x249D, 0xA9CE, 0x249E, 0xA9CF, 0x249F, 0xA9D0, 0x24A0, 0xA9D1, 0x24A1, 0xA9D2, 0x24A2, 0xA9D3, + 0x24A3, 0xA9D4, 0x24A4, 0xA9D5, 0x24A5, 0xA9D6, 0x24A6, 0xA9D7, 0x24A7, 0xA9D8, 0x24A8, 0xA9D9, 0x24A9, 0xA9DA, 0x24AA, 0xA9DB, + 0x24AB, 0xA9DC, 0x24AC, 0xA9DD, 0x24AD, 0xA9DE, 0x24AE, 0xA9DF, 0x24AF, 0xA9E0, 0x24B0, 0xA9E1, 0x24B1, 0xA9E2, 0x24B2, 0xA9E3, + 0x24B3, 0xA9E4, 0x24B4, 0xA9E5, 0x24B5, 0xA9E6, 0x24D0, 0xA8CD, 0x24D1, 0xA8CE, 0x24D2, 0xA8CF, 0x24D3, 0xA8D0, 0x24D4, 0xA8D1, + 0x24D5, 0xA8D2, 0x24D6, 0xA8D3, 0x24D7, 0xA8D4, 0x24D8, 0xA8D5, 0x24D9, 0xA8D6, 0x24DA, 0xA8D7, 0x24DB, 0xA8D8, 0x24DC, 0xA8D9, + 0x24DD, 0xA8DA, 0x24DE, 0xA8DB, 0x24DF, 0xA8DC, 0x24E0, 0xA8DD, 0x24E1, 0xA8DE, 0x24E2, 0xA8DF, 0x24E3, 0xA8E0, 0x24E4, 0xA8E1, + 0x24E5, 0xA8E2, 0x24E6, 0xA8E3, 0x24E7, 0xA8E4, 0x24E8, 0xA8E5, 0x24E9, 0xA8E6, 0x2500, 0xA6A1, 0x2501, 0xA6AC, 0x2502, 0xA6A2, + 0x2503, 0xA6AD, 0x250C, 0xA6A3, 0x250D, 0xA6C8, 0x250E, 0xA6C7, 0x250F, 0xA6AE, 0x2510, 0xA6A4, 0x2511, 0xA6C2, 0x2512, 0xA6C1, + 0x2513, 0xA6AF, 0x2514, 0xA6A6, 0x2515, 0xA6C6, 0x2516, 0xA6C5, 0x2517, 0xA6B1, 0x2518, 0xA6A5, 0x2519, 0xA6C4, 0x251A, 0xA6C3, + 0x251B, 0xA6B0, 0x251C, 0xA6A7, 0x251D, 0xA6BC, 0x251E, 0xA6C9, 0x251F, 0xA6CA, 0x2520, 0xA6B7, 0x2521, 0xA6CB, 0x2522, 0xA6CC, + 0x2523, 0xA6B2, 0x2524, 0xA6A9, 0x2525, 0xA6BE, 0x2526, 0xA6CD, 0x2527, 0xA6CE, 0x2528, 0xA6B9, 0x2529, 0xA6CF, 0x252A, 0xA6D0, + 0x252B, 0xA6B4, 0x252C, 0xA6A8, 0x252D, 0xA6D1, 0x252E, 0xA6D2, 0x252F, 0xA6B8, 0x2530, 0xA6BD, 0x2531, 0xA6D3, 0x2532, 0xA6D4, + 0x2533, 0xA6B3, 0x2534, 0xA6AA, 0x2535, 0xA6D5, 0x2536, 0xA6D6, 0x2537, 0xA6BA, 0x2538, 0xA6BF, 0x2539, 0xA6D7, 0x253A, 0xA6D8, + 0x253B, 0xA6B5, 0x253C, 0xA6AB, 0x253D, 0xA6D9, 0x253E, 0xA6DA, 0x253F, 0xA6BB, 0x2540, 0xA6DB, 0x2541, 0xA6DC, 0x2542, 0xA6C0, + 0x2543, 0xA6DD, 0x2544, 0xA6DE, 0x2545, 0xA6DF, 0x2546, 0xA6E0, 0x2547, 0xA6E1, 0x2548, 0xA6E2, 0x2549, 0xA6E3, 0x254A, 0xA6E4, + 0x254B, 0xA6B6, 0x2592, 0xA2C6, 0x25A0, 0xA1E1, 0x25A1, 0xA1E0, 0x25A3, 0xA2C3, 0x25A4, 0xA2C7, 0x25A5, 0xA2C8, 0x25A6, 0xA2CB, + 0x25A7, 0xA2CA, 0x25A8, 0xA2C9, 0x25A9, 0xA2CC, 0x25B2, 0xA1E3, 0x25B3, 0xA1E2, 0x25B6, 0xA2BA, 0x25B7, 0xA2B9, 0x25BC, 0xA1E5, + 0x25BD, 0xA1E4, 0x25C0, 0xA2B8, 0x25C1, 0xA2B7, 0x25C6, 0xA1DF, 0x25C7, 0xA1DE, 0x25C8, 0xA2C2, 0x25CB, 0xA1DB, 0x25CE, 0xA1DD, + 0x25CF, 0xA1DC, 0x25D0, 0xA2C4, 0x25D1, 0xA2C5, 0x2605, 0xA1DA, 0x2606, 0xA1D9, 0x260E, 0xA2CF, 0x260F, 0xA2CE, 0x261C, 0xA2D0, + 0x261E, 0xA2D1, 0x2640, 0xA1CF, 0x2642, 0xA1CE, 0x2660, 0xA2BC, 0x2661, 0xA2BD, 0x2663, 0xA2C0, 0x2664, 0xA2BB, 0x2665, 0xA2BE, + 0x2667, 0xA2BF, 0x2668, 0xA2CD, 0x2669, 0xA2DB, 0x266A, 0xA2DC, 0x266C, 0xA2DD, 0x266D, 0xA2DA, 0x3000, 0xA1A1, 0x3001, 0xA1A2, + 0x3002, 0xA1A3, 0x3003, 0xA1A8, 0x3008, 0xA1B4, 0x3009, 0xA1B5, 0x300A, 0xA1B6, 0x300B, 0xA1B7, 0x300C, 0xA1B8, 0x300D, 0xA1B9, + 0x300E, 0xA1BA, 0x300F, 0xA1BB, 0x3010, 0xA1BC, 0x3011, 0xA1BD, 0x3013, 0xA1EB, 0x3014, 0xA1B2, 0x3015, 0xA1B3, 0x3041, 0xAAA1, + 0x3042, 0xAAA2, 0x3043, 0xAAA3, 0x3044, 0xAAA4, 0x3045, 0xAAA5, 0x3046, 0xAAA6, 0x3047, 0xAAA7, 0x3048, 0xAAA8, 0x3049, 0xAAA9, + 0x304A, 0xAAAA, 0x304B, 0xAAAB, 0x304C, 0xAAAC, 0x304D, 0xAAAD, 0x304E, 0xAAAE, 0x304F, 0xAAAF, 0x3050, 0xAAB0, 0x3051, 0xAAB1, + 0x3052, 0xAAB2, 0x3053, 0xAAB3, 0x3054, 0xAAB4, 0x3055, 0xAAB5, 0x3056, 0xAAB6, 0x3057, 0xAAB7, 0x3058, 0xAAB8, 0x3059, 0xAAB9, + 0x305A, 0xAABA, 0x305B, 0xAABB, 0x305C, 0xAABC, 0x305D, 0xAABD, 0x305E, 0xAABE, 0x305F, 0xAABF, 0x3060, 0xAAC0, 0x3061, 0xAAC1, + 0x3062, 0xAAC2, 0x3063, 0xAAC3, 0x3064, 0xAAC4, 0x3065, 0xAAC5, 0x3066, 0xAAC6, 0x3067, 0xAAC7, 0x3068, 0xAAC8, 0x3069, 0xAAC9, + 0x306A, 0xAACA, 0x306B, 0xAACB, 0x306C, 0xAACC, 0x306D, 0xAACD, 0x306E, 0xAACE, 0x306F, 0xAACF, 0x3070, 0xAAD0, 0x3071, 0xAAD1, + 0x3072, 0xAAD2, 0x3073, 0xAAD3, 0x3074, 0xAAD4, 0x3075, 0xAAD5, 0x3076, 0xAAD6, 0x3077, 0xAAD7, 0x3078, 0xAAD8, 0x3079, 0xAAD9, + 0x307A, 0xAADA, 0x307B, 0xAADB, 0x307C, 0xAADC, 0x307D, 0xAADD, 0x307E, 0xAADE, 0x307F, 0xAADF, 0x3080, 0xAAE0, 0x3081, 0xAAE1, + 0x3082, 0xAAE2, 0x3083, 0xAAE3, 0x3084, 0xAAE4, 0x3085, 0xAAE5, 0x3086, 0xAAE6, 0x3087, 0xAAE7, 0x3088, 0xAAE8, 0x3089, 0xAAE9, + 0x308A, 0xAAEA, 0x308B, 0xAAEB, 0x308C, 0xAAEC, 0x308D, 0xAAED, 0x308E, 0xAAEE, 0x308F, 0xAAEF, 0x3090, 0xAAF0, 0x3091, 0xAAF1, + 0x3092, 0xAAF2, 0x3093, 0xAAF3, 0x30A1, 0xABA1, 0x30A2, 0xABA2, 0x30A3, 0xABA3, 0x30A4, 0xABA4, 0x30A5, 0xABA5, 0x30A6, 0xABA6, + 0x30A7, 0xABA7, 0x30A8, 0xABA8, 0x30A9, 0xABA9, 0x30AA, 0xABAA, 0x30AB, 0xABAB, 0x30AC, 0xABAC, 0x30AD, 0xABAD, 0x30AE, 0xABAE, + 0x30AF, 0xABAF, 0x30B0, 0xABB0, 0x30B1, 0xABB1, 0x30B2, 0xABB2, 0x30B3, 0xABB3, 0x30B4, 0xABB4, 0x30B5, 0xABB5, 0x30B6, 0xABB6, + 0x30B7, 0xABB7, 0x30B8, 0xABB8, 0x30B9, 0xABB9, 0x30BA, 0xABBA, 0x30BB, 0xABBB, 0x30BC, 0xABBC, 0x30BD, 0xABBD, 0x30BE, 0xABBE, + 0x30BF, 0xABBF, 0x30C0, 0xABC0, 0x30C1, 0xABC1, 0x30C2, 0xABC2, 0x30C3, 0xABC3, 0x30C4, 0xABC4, 0x30C5, 0xABC5, 0x30C6, 0xABC6, + 0x30C7, 0xABC7, 0x30C8, 0xABC8, 0x30C9, 0xABC9, 0x30CA, 0xABCA, 0x30CB, 0xABCB, 0x30CC, 0xABCC, 0x30CD, 0xABCD, 0x30CE, 0xABCE, + 0x30CF, 0xABCF, 0x30D0, 0xABD0, 0x30D1, 0xABD1, 0x30D2, 0xABD2, 0x30D3, 0xABD3, 0x30D4, 0xABD4, 0x30D5, 0xABD5, 0x30D6, 0xABD6, + 0x30D7, 0xABD7, 0x30D8, 0xABD8, 0x30D9, 0xABD9, 0x30DA, 0xABDA, 0x30DB, 0xABDB, 0x30DC, 0xABDC, 0x30DD, 0xABDD, 0x30DE, 0xABDE, + 0x30DF, 0xABDF, 0x30E0, 0xABE0, 0x30E1, 0xABE1, 0x30E2, 0xABE2, 0x30E3, 0xABE3, 0x30E4, 0xABE4, 0x30E5, 0xABE5, 0x30E6, 0xABE6, + 0x30E7, 0xABE7, 0x30E8, 0xABE8, 0x30E9, 0xABE9, 0x30EA, 0xABEA, 0x30EB, 0xABEB, 0x30EC, 0xABEC, 0x30ED, 0xABED, 0x30EE, 0xABEE, + 0x30EF, 0xABEF, 0x30F0, 0xABF0, 0x30F1, 0xABF1, 0x30F2, 0xABF2, 0x30F3, 0xABF3, 0x30F4, 0xABF4, 0x30F5, 0xABF5, 0x30F6, 0xABF6, + 0x3131, 0xA4A1, 0x3132, 0xA4A2, 0x3133, 0xA4A3, 0x3134, 0xA4A4, 0x3135, 0xA4A5, 0x3136, 0xA4A6, 0x3137, 0xA4A7, 0x3138, 0xA4A8, + 0x3139, 0xA4A9, 0x313A, 0xA4AA, 0x313B, 0xA4AB, 0x313C, 0xA4AC, 0x313D, 0xA4AD, 0x313E, 0xA4AE, 0x313F, 0xA4AF, 0x3140, 0xA4B0, + 0x3141, 0xA4B1, 0x3142, 0xA4B2, 0x3143, 0xA4B3, 0x3144, 0xA4B4, 0x3145, 0xA4B5, 0x3146, 0xA4B6, 0x3147, 0xA4B7, 0x3148, 0xA4B8, + 0x3149, 0xA4B9, 0x314A, 0xA4BA, 0x314B, 0xA4BB, 0x314C, 0xA4BC, 0x314D, 0xA4BD, 0x314E, 0xA4BE, 0x314F, 0xA4BF, 0x3150, 0xA4C0, + 0x3151, 0xA4C1, 0x3152, 0xA4C2, 0x3153, 0xA4C3, 0x3154, 0xA4C4, 0x3155, 0xA4C5, 0x3156, 0xA4C6, 0x3157, 0xA4C7, 0x3158, 0xA4C8, + 0x3159, 0xA4C9, 0x315A, 0xA4CA, 0x315B, 0xA4CB, 0x315C, 0xA4CC, 0x315D, 0xA4CD, 0x315E, 0xA4CE, 0x315F, 0xA4CF, 0x3160, 0xA4D0, + 0x3161, 0xA4D1, 0x3162, 0xA4D2, 0x3163, 0xA4D3, 0x3164, 0xA4D4, 0x3165, 0xA4D5, 0x3166, 0xA4D6, 0x3167, 0xA4D7, 0x3168, 0xA4D8, + 0x3169, 0xA4D9, 0x316A, 0xA4DA, 0x316B, 0xA4DB, 0x316C, 0xA4DC, 0x316D, 0xA4DD, 0x316E, 0xA4DE, 0x316F, 0xA4DF, 0x3170, 0xA4E0, + 0x3171, 0xA4E1, 0x3172, 0xA4E2, 0x3173, 0xA4E3, 0x3174, 0xA4E4, 0x3175, 0xA4E5, 0x3176, 0xA4E6, 0x3177, 0xA4E7, 0x3178, 0xA4E8, + 0x3179, 0xA4E9, 0x317A, 0xA4EA, 0x317B, 0xA4EB, 0x317C, 0xA4EC, 0x317D, 0xA4ED, 0x317E, 0xA4EE, 0x317F, 0xA4EF, 0x3180, 0xA4F0, + 0x3181, 0xA4F1, 0x3182, 0xA4F2, 0x3183, 0xA4F3, 0x3184, 0xA4F4, 0x3185, 0xA4F5, 0x3186, 0xA4F6, 0x3187, 0xA4F7, 0x3188, 0xA4F8, + 0x3189, 0xA4F9, 0x318A, 0xA4FA, 0x318B, 0xA4FB, 0x318C, 0xA4FC, 0x318D, 0xA4FD, 0x318E, 0xA4FE, 0x3200, 0xA9B1, 0x3201, 0xA9B2, + 0x3202, 0xA9B3, 0x3203, 0xA9B4, 0x3204, 0xA9B5, 0x3205, 0xA9B6, 0x3206, 0xA9B7, 0x3207, 0xA9B8, 0x3208, 0xA9B9, 0x3209, 0xA9BA, + 0x320A, 0xA9BB, 0x320B, 0xA9BC, 0x320C, 0xA9BD, 0x320D, 0xA9BE, 0x320E, 0xA9BF, 0x320F, 0xA9C0, 0x3210, 0xA9C1, 0x3211, 0xA9C2, + 0x3212, 0xA9C3, 0x3213, 0xA9C4, 0x3214, 0xA9C5, 0x3215, 0xA9C6, 0x3216, 0xA9C7, 0x3217, 0xA9C8, 0x3218, 0xA9C9, 0x3219, 0xA9CA, + 0x321A, 0xA9CB, 0x321B, 0xA9CC, 0x321C, 0xA2DF, 0x3260, 0xA8B1, 0x3261, 0xA8B2, 0x3262, 0xA8B3, 0x3263, 0xA8B4, 0x3264, 0xA8B5, + 0x3265, 0xA8B6, 0x3266, 0xA8B7, 0x3267, 0xA8B8, 0x3268, 0xA8B9, 0x3269, 0xA8BA, 0x326A, 0xA8BB, 0x326B, 0xA8BC, 0x326C, 0xA8BD, + 0x326D, 0xA8BE, 0x326E, 0xA8BF, 0x326F, 0xA8C0, 0x3270, 0xA8C1, 0x3271, 0xA8C2, 0x3272, 0xA8C3, 0x3273, 0xA8C4, 0x3274, 0xA8C5, + 0x3275, 0xA8C6, 0x3276, 0xA8C7, 0x3277, 0xA8C8, 0x3278, 0xA8C9, 0x3279, 0xA8CA, 0x327A, 0xA8CB, 0x327B, 0xA8CC, 0x327F, 0xA2DE, + 0x3380, 0xA7C9, 0x3381, 0xA7CA, 0x3382, 0xA7CB, 0x3383, 0xA7CC, 0x3384, 0xA7CD, 0x3388, 0xA7BA, 0x3389, 0xA7BB, 0x338A, 0xA7DC, + 0x338B, 0xA7DD, 0x338C, 0xA7DE, 0x338D, 0xA7B6, 0x338E, 0xA7B7, 0x338F, 0xA7B8, 0x3390, 0xA7D4, 0x3391, 0xA7D5, 0x3392, 0xA7D6, + 0x3393, 0xA7D7, 0x3394, 0xA7D8, 0x3395, 0xA7A1, 0x3396, 0xA7A2, 0x3397, 0xA7A3, 0x3398, 0xA7A5, 0x3399, 0xA7AB, 0x339A, 0xA7AC, + 0x339B, 0xA7AD, 0x339C, 0xA7AE, 0x339D, 0xA7AF, 0x339E, 0xA7B0, 0x339F, 0xA7B1, 0x33A0, 0xA7B2, 0x33A1, 0xA7B3, 0x33A2, 0xA7B4, + 0x33A3, 0xA7A7, 0x33A4, 0xA7A8, 0x33A5, 0xA7A9, 0x33A6, 0xA7AA, 0x33A7, 0xA7BD, 0x33A8, 0xA7BE, 0x33A9, 0xA7E5, 0x33AA, 0xA7E6, + 0x33AB, 0xA7E7, 0x33AC, 0xA7E8, 0x33AD, 0xA7E1, 0x33AE, 0xA7E2, 0x33AF, 0xA7E3, 0x33B0, 0xA7BF, 0x33B1, 0xA7C0, 0x33B2, 0xA7C1, + 0x33B3, 0xA7C2, 0x33B4, 0xA7C3, 0x33B5, 0xA7C4, 0x33B6, 0xA7C5, 0x33B7, 0xA7C6, 0x33B8, 0xA7C7, 0x33B9, 0xA7C8, 0x33BA, 0xA7CE, + 0x33BB, 0xA7CF, 0x33BC, 0xA7D0, 0x33BD, 0xA7D1, 0x33BE, 0xA7D2, 0x33BF, 0xA7D3, 0x33C0, 0xA7DA, 0x33C1, 0xA7DB, 0x33C2, 0xA2E3, + 0x33C3, 0xA7EC, 0x33C4, 0xA7A6, 0x33C5, 0xA7E0, 0x33C6, 0xA7EF, 0x33C7, 0xA2E1, 0x33C8, 0xA7BC, 0x33C9, 0xA7ED, 0x33CA, 0xA7B5, + 0x33CF, 0xA7B9, 0x33D0, 0xA7EA, 0x33D3, 0xA7EB, 0x33D6, 0xA7DF, 0x33D8, 0xA2E4, 0x33DB, 0xA7E4, 0x33DC, 0xA7EE, 0x33DD, 0xA7E9, + 0x4E00, 0xECE9, 0x4E01, 0xEFCB, 0x4E03, 0xF6D2, 0x4E07, 0xD8B2, 0x4E08, 0xEDDB, 0x4E09, 0xDFB2, 0x4E0A, 0xDFBE, 0x4E0B, 0xF9BB, + 0x4E0D, 0xDCF4, 0x4E11, 0xF5E4, 0x4E14, 0xF3A6, 0x4E15, 0xDDE0, 0x4E16, 0xE1A6, 0x4E18, 0xCEF8, 0x4E19, 0xDCB0, 0x4E1E, 0xE3AA, + 0x4E2D, 0xF1E9, 0x4E32, 0xCDFA, 0x4E38, 0xFCAF, 0x4E39, 0xD3A1, 0x4E3B, 0xF1AB, 0x4E42, 0xE7D1, 0x4E43, 0xD2AC, 0x4E45, 0xCEF9, + 0x4E4B, 0xF1FD, 0x4E4D, 0xDEBF, 0x4E4E, 0xFBBA, 0x4E4F, 0xF9B9, 0x4E56, 0xCED2, 0x4E58, 0xE3AB, 0x4E59, 0xEBE0, 0x4E5D, 0xCEFA, + 0x4E5E, 0xCBF7, 0x4E5F, 0xE5A5, 0x4E6B, 0xCAE1, 0x4E6D, 0xD4CC, 0x4E73, 0xEAE1, 0x4E76, 0xDCE3, 0x4E77, 0xDFAD, 0x4E7E, 0xCBEB, + 0x4E82, 0xD5AF, 0x4E86, 0xD6F5, 0x4E88, 0xE5F8, 0x4E8B, 0xDEC0, 0x4E8C, 0xECA3, 0x4E8E, 0xE9CD, 0x4E90, 0xEAA7, 0x4E91, 0xE9F6, + 0x4E92, 0xFBBB, 0x4E94, 0xE7E9, 0x4E95, 0xEFCC, 0x4E98, 0xD0E6, 0x4E9B, 0xDEC1, 0x4E9E, 0xE4AC, 0x4EA1, 0xD8CC, 0x4EA2, 0xF9F1, + 0x4EA4, 0xCEDF, 0x4EA5, 0xFAA4, 0x4EA6, 0xE6B2, 0x4EA8, 0xFAFB, 0x4EAB, 0xFABD, 0x4EAC, 0xCCC8, 0x4EAD, 0xEFCD, 0x4EAE, 0xD5D5, + 0x4EB6, 0xD3A2, 0x4EBA, 0xECD1, 0x4EC0, 0xE4A7, 0x4EC1, 0xECD2, 0x4EC4, 0xF6B1, 0x4EC7, 0xCEFB, 0x4ECA, 0xD0D1, 0x4ECB, 0xCBBF, + 0x4ECD, 0xEDA4, 0x4ED4, 0xEDA8, 0x4ED5, 0xDEC2, 0x4ED6, 0xF6E2, 0x4ED7, 0xEDDC, 0x4ED8, 0xDCF5, 0x4ED9, 0xE0B9, 0x4EDD, 0xD4CE, + 0x4EDF, 0xF4B5, 0x4EE3, 0xD3DB, 0x4EE4, 0xD6B5, 0x4EE5, 0xECA4, 0x4EF0, 0xE4E6, 0x4EF2, 0xF1EA, 0x4EF6, 0xCBEC, 0x4EF7, 0xCBC0, + 0x4EFB, 0xECF2, 0x4F01, 0xD0EA, 0x4F09, 0xF9F2, 0x4F0A, 0xECA5, 0x4F0B, 0xD0DF, 0x4F0D, 0xE7EA, 0x4F0E, 0xD0EB, 0x4F0F, 0xDCD1, + 0x4F10, 0xDBE9, 0x4F11, 0xFDCC, 0x4F2F, 0xDBD7, 0x4F34, 0xDAE1, 0x4F36, 0xD6B6, 0x4F38, 0xE3DF, 0x4F3A, 0xDEC3, 0x4F3C, 0xDEC4, + 0x4F3D, 0xCAA1, 0x4F43, 0xEEEC, 0x4F46, 0xD3A3, 0x4F47, 0xEEB7, 0x4F48, 0xF8CF, 0x4F4D, 0xEAC8, 0x4F4E, 0xEEB8, 0x4F4F, 0xF1AC, + 0x4F50, 0xF1A5, 0x4F51, 0xE9CE, 0x4F55, 0xF9BC, 0x4F59, 0xE5F9, 0x4F5A, 0xECEA, 0x4F5B, 0xDDD6, 0x4F5C, 0xEDC2, 0x4F69, 0xF8A5, + 0x4F6F, 0xE5BA, 0x4F70, 0xDBD8, 0x4F73, 0xCAA2, 0x4F76, 0xD1CD, 0x4F7A, 0xEEED, 0x4F7E, 0xECEB, 0x4F7F, 0xDEC5, 0x4F81, 0xE3E0, + 0x4F83, 0xCAC9, 0x4F84, 0xF2E9, 0x4F86, 0xD5CE, 0x4F88, 0xF6B6, 0x4F8A, 0xCEC2, 0x4F8B, 0xD6C7, 0x4F8D, 0xE3B4, 0x4F8F, 0xF1AD, + 0x4F91, 0xEAE2, 0x4F96, 0xD7C2, 0x4F98, 0xF3A7, 0x4F9B, 0xCDEA, 0x4F9D, 0xEBEE, 0x4FAE, 0xD9B2, 0x4FAF, 0xFDA5, 0x4FB5, 0xF6D5, + 0x4FB6, 0xD5E2, 0x4FBF, 0xF8B5, 0x4FC2, 0xCCF5, 0x4FC3, 0xF5B5, 0x4FC4, 0xE4AD, 0x4FC9, 0xE7EB, 0x4FCA, 0xF1D5, 0x4FCE, 0xF0BB, + 0x4FD1, 0xE9B5, 0x4FD3, 0xCCC9, 0x4FD4, 0xFAD5, 0x4FD7, 0xE1D4, 0x4FDA, 0xD7D6, 0x4FDD, 0xDCC1, 0x4FDF, 0xDEC6, 0x4FE0, 0xFAEF, + 0x4FE1, 0xE3E1, 0x4FEE, 0xE1F3, 0x4FEF, 0xDCF6, 0x4FF1, 0xCEFC, 0x4FF3, 0xDBC4, 0x4FF5, 0xF8F1, 0x4FF8, 0xDCE4, 0x4FFA, 0xE5EF, + 0x5002, 0xDCB1, 0x5006, 0xD5D6, 0x5009, 0xF3DA, 0x500B, 0xCBC1, 0x500D, 0xDBC3, 0x5011, 0xD9FA, 0x5012, 0xD3EE, 0x5016, 0xFAB8, + 0x5019, 0xFDA6, 0x501A, 0xEBEF, 0x501C, 0xF4A6, 0x501E, 0xCCCA, 0x501F, 0xF3A8, 0x5021, 0xF3DB, 0x5023, 0xDBA7, 0x5024, 0xF6B7, + 0x5026, 0xCFE6, 0x5027, 0xF0F2, 0x5028, 0xCBDA, 0x502A, 0xE7D2, 0x502B, 0xD7C3, 0x502C, 0xF6F0, 0x502D, 0xE8DE, 0x503B, 0xE5A6, + 0x5043, 0xE5E7, 0x5047, 0xCAA3, 0x5048, 0xCCA7, 0x5049, 0xEAC9, 0x504F, 0xF8B6, 0x5055, 0xFAA5, 0x505A, 0xF1AE, 0x505C, 0xEFCE, + 0x5065, 0xCBED, 0x5074, 0xF6B0, 0x5075, 0xEFCF, 0x5076, 0xE9CF, 0x5078, 0xF7DE, 0x5080, 0xCED3, 0x5085, 0xDCF7, 0x508D, 0xDBA8, + 0x5091, 0xCBF8, 0x5098, 0xDFA1, 0x5099, 0xDDE1, 0x50AC, 0xF5CA, 0x50AD, 0xE9B6, 0x50B2, 0xE7EC, 0x50B3, 0xEEEE, 0x50B5, 0xF3F0, + 0x50B7, 0xDFBF, 0x50BE, 0xCCCB, 0x50C5, 0xD0C1, 0x50C9, 0xF4D2, 0x50CA, 0xE0BA, 0x50CF, 0xDFC0, 0x50D1, 0xCEE0, 0x50D5, 0xDCD2, + 0x50D6, 0xFDEA, 0x50DA, 0xD6F6, 0x50DE, 0xEACA, 0x50E5, 0xE8E9, 0x50E7, 0xE3AC, 0x50ED, 0xF3D0, 0x50F9, 0xCAA4, 0x50FB, 0xDBF8, + 0x50FF, 0xDEC7, 0x5100, 0xEBF0, 0x5101, 0xF1D6, 0x5104, 0xE5E2, 0x5106, 0xCCCC, 0x5109, 0xCBFB, 0x5112, 0xEAE3, 0x511F, 0xDFC1, + 0x5121, 0xD6ED, 0x512A, 0xE9D0, 0x5132, 0xEEB9, 0x5137, 0xD5E3, 0x513A, 0xD1D3, 0x513C, 0xE5F0, 0x5140, 0xE8B4, 0x5141, 0xEBC3, + 0x5143, 0xEAAA, 0x5144, 0xFAFC, 0x5145, 0xF5F6, 0x5146, 0xF0BC, 0x5147, 0xFDD4, 0x5148, 0xE0BB, 0x5149, 0xCEC3, 0x514B, 0xD0BA, + 0x514C, 0xF7BA, 0x514D, 0xD8F3, 0x514E, 0xF7CD, 0x5152, 0xE4AE, 0x515C, 0xD4DF, 0x5162, 0xD0E7, 0x5165, 0xECFD, 0x5167, 0xD2AE, + 0x5168, 0xEEEF, 0x5169, 0xD5D7, 0x516A, 0xEAE4, 0x516B, 0xF8A2, 0x516C, 0xCDEB, 0x516D, 0xD7BF, 0x516E, 0xFBB1, 0x5171, 0xCDEC, + 0x5175, 0xDCB2, 0x5176, 0xD0EC, 0x5177, 0xCEFD, 0x5178, 0xEEF0, 0x517C, 0xCCC2, 0x5180, 0xD0ED, 0x5186, 0xE5F7, 0x518A, 0xF3FC, + 0x518D, 0xEEA2, 0x5192, 0xD9B3, 0x5195, 0xD8F4, 0x5197, 0xE9B7, 0x51A0, 0xCEAE, 0x51A5, 0xD9A2, 0x51AA, 0xD8F1, 0x51AC, 0xD4CF, + 0x51B6, 0xE5A7, 0x51B7, 0xD5D2, 0x51BD, 0xD6A9, 0x51C4, 0xF4A2, 0x51C6, 0xF1D7, 0x51C9, 0xD5D8, 0x51CB, 0xF0BD, 0x51CC, 0xD7D0, + 0x51CD, 0xD4D0, 0x51DC, 0xD7CF, 0x51DD, 0xEBEA, 0x51DE, 0xFDEB, 0x51E1, 0xDBED, 0x51F0, 0xFCC5, 0x51F1, 0xCBC2, 0x51F6, 0xFDD5, + 0x51F8, 0xF4C8, 0x51F9, 0xE8EA, 0x51FA, 0xF5F3, 0x51FD, 0xF9DE, 0x5200, 0xD3EF, 0x5203, 0xECD3, 0x5206, 0xDDC2, 0x5207, 0xEFB7, + 0x5208, 0xE7D4, 0x520A, 0xCACA, 0x520E, 0xD9FB, 0x5211, 0xFAFD, 0x5217, 0xD6AA, 0x521D, 0xF4F8, 0x5224, 0xF7F7, 0x5225, 0xDCAC, + 0x5229, 0xD7D7, 0x522A, 0xDFA2, 0x522E, 0xCEBE, 0x5230, 0xD3F0, 0x5236, 0xF0A4, 0x5237, 0xE1EC, 0x5238, 0xCFE7, 0x5239, 0xF3CB, + 0x523A, 0xEDA9, 0x523B, 0xCABE, 0x5243, 0xF4EF, 0x5247, 0xF6CE, 0x524A, 0xDEFB, 0x524B, 0xD0BB, 0x524C, 0xD5B7, 0x524D, 0xEEF1, + 0x5254, 0xF4A8, 0x5256, 0xDCF8, 0x525B, 0xCBA7, 0x525D, 0xDACE, 0x5261, 0xE0E6, 0x5269, 0xEDA5, 0x526A, 0xEEF2, 0x526F, 0xDCF9, + 0x5272, 0xF9DC, 0x5275, 0xF3DC, 0x527D, 0xF8F2, 0x527F, 0xF4F9, 0x5283, 0xFCF1, 0x5287, 0xD0BC, 0x5288, 0xDBF9, 0x5289, 0xD7B1, + 0x528D, 0xCBFC, 0x5291, 0xF0A5, 0x5292, 0xCBFD, 0x529B, 0xD5F4, 0x529F, 0xCDED, 0x52A0, 0xCAA5, 0x52A3, 0xD6AB, 0x52A4, 0xD0C2, + 0x52A9, 0xF0BE, 0x52AA, 0xD2BD, 0x52AB, 0xCCA4, 0x52BE, 0xFAB6, 0x52C1, 0xCCCD, 0x52C3, 0xDAFA, 0x52C5, 0xF6CF, 0x52C7, 0xE9B8, + 0x52C9, 0xD8F5, 0x52CD, 0xCCCE, 0x52D2, 0xD7CD, 0x52D5, 0xD4D1, 0x52D6, 0xE9ED, 0x52D8, 0xCAEB, 0x52D9, 0xD9E2, 0x52DB, 0xFDB2, + 0x52DD, 0xE3AD, 0x52DE, 0xD6CC, 0x52DF, 0xD9B4, 0x52E2, 0xE1A7, 0x52E3, 0xEED3, 0x52E4, 0xD0C3, 0x52F3, 0xFDB3, 0x52F5, 0xD5E4, + 0x52F8, 0xCFE8, 0x52FA, 0xEDC3, 0x52FB, 0xD0B2, 0x52FE, 0xCEFE, 0x52FF, 0xDAA8, 0x5305, 0xF8D0, 0x5308, 0xFDD6, 0x530D, 0xF8D1, + 0x530F, 0xF8D2, 0x5310, 0xDCD3, 0x5315, 0xDDE2, 0x5316, 0xFBF9, 0x5317, 0xDDC1, 0x5319, 0xE3B5, 0x5320, 0xEDDD, 0x5321, 0xCEC4, + 0x5323, 0xCBA1, 0x532A, 0xDDE3, 0x532F, 0xFCDD, 0x5339, 0xF9AF, 0x533F, 0xD2FB, 0x5340, 0xCFA1, 0x5341, 0xE4A8, 0x5343, 0xF4B6, + 0x5344, 0xECFE, 0x5347, 0xE3AE, 0x5348, 0xE7ED, 0x5349, 0xFDC1, 0x534A, 0xDAE2, 0x534D, 0xD8B3, 0x5351, 0xDDE4, 0x5352, 0xF0EF, + 0x5353, 0xF6F1, 0x5354, 0xFAF0, 0x5357, 0xD1F5, 0x535A, 0xDACF, 0x535C, 0xDCD4, 0x535E, 0xDCA6, 0x5360, 0xEFBF, 0x5366, 0xCECF, + 0x5368, 0xE0D9, 0x536F, 0xD9D6, 0x5370, 0xECD4, 0x5371, 0xEACB, 0x5374, 0xCABF, 0x5375, 0xD5B0, 0x5377, 0xCFE9, 0x537D, 0xF1ED, + 0x537F, 0xCCCF, 0x5384, 0xE4F8, 0x5393, 0xE4ED, 0x5398, 0xD7D8, 0x539A, 0xFDA7, 0x539F, 0xEAAB, 0x53A0, 0xF6B2, 0x53A5, 0xCFF0, + 0x53A6, 0xF9BD, 0x53AD, 0xE6F4, 0x53BB, 0xCBDB, 0x53C3, 0xF3D1, 0x53C8, 0xE9D1, 0x53C9, 0xF3A9, 0x53CA, 0xD0E0, 0x53CB, 0xE9D2, + 0x53CD, 0xDAE3, 0x53D4, 0xE2D2, 0x53D6, 0xF6A2, 0x53D7, 0xE1F4, 0x53DB, 0xDAE4, 0x53E1, 0xE7D5, 0x53E2, 0xF5BF, 0x53E3, 0xCFA2, + 0x53E4, 0xCDAF, 0x53E5, 0xCFA3, 0x53E9, 0xCDB0, 0x53EA, 0xF1FE, 0x53EB, 0xD0A3, 0x53EC, 0xE1AF, 0x53ED, 0xF8A3, 0x53EF, 0xCAA6, + 0x53F0, 0xF7BB, 0x53F1, 0xF2EA, 0x53F2, 0xDEC8, 0x53F3, 0xE9D3, 0x53F8, 0xDEC9, 0x5403, 0xFDDE, 0x5404, 0xCAC0, 0x5408, 0xF9EA, + 0x5409, 0xD1CE, 0x540A, 0xEED4, 0x540C, 0xD4D2, 0x540D, 0xD9A3, 0x540E, 0xFDA8, 0x540F, 0xD7D9, 0x5410, 0xF7CE, 0x5411, 0xFABE, + 0x541B, 0xCFD6, 0x541D, 0xD7F0, 0x541F, 0xEBE1, 0x5420, 0xF8C5, 0x5426, 0xDCFA, 0x5429, 0xDDC3, 0x542B, 0xF9DF, 0x5433, 0xE7EF, + 0x5438, 0xFDE5, 0x5439, 0xF6A3, 0x543B, 0xD9FC, 0x543C, 0xFDA9, 0x543E, 0xE7EE, 0x5442, 0xD5E5, 0x5448, 0xEFD0, 0x544A, 0xCDB1, + 0x5451, 0xF7A2, 0x5468, 0xF1B2, 0x546A, 0xF1B1, 0x5471, 0xCDB2, 0x5473, 0xDAAB, 0x5475, 0xCAA7, 0x547B, 0xE3E2, 0x547C, 0xFBBC, + 0x547D, 0xD9A4, 0x5480, 0xEEBA, 0x5486, 0xF8D3, 0x548C, 0xFBFA, 0x548E, 0xCFA4, 0x5490, 0xDCFB, 0x54A4, 0xF6E3, 0x54A8, 0xEDAA, + 0x54AB, 0xF2A1, 0x54AC, 0xCEE1, 0x54B3, 0xFAA6, 0x54B8, 0xF9E0, 0x54BD, 0xECD6, 0x54C0, 0xE4EE, 0x54C1, 0xF9A1, 0x54C4, 0xFBEF, + 0x54C8, 0xF9EB, 0x54C9, 0xEEA3, 0x54E1, 0xEAAC, 0x54E5, 0xCAA8, 0x54E8, 0xF4FA, 0x54ED, 0xCDD6, 0x54EE, 0xFCF6, 0x54F2, 0xF4C9, + 0x54FA, 0xF8D4, 0x5504, 0xF8A6, 0x5506, 0xDECA, 0x5507, 0xF2C6, 0x550E, 0xD7DA, 0x5510, 0xD3D0, 0x551C, 0xD8C5, 0x552F, 0xEAE6, + 0x5531, 0xF3DD, 0x5535, 0xE4DA, 0x553E, 0xF6E4, 0x5544, 0xF6F2, 0x5546, 0xDFC2, 0x554F, 0xD9FD, 0x5553, 0xCCF6, 0x5556, 0xD3BA, + 0x555E, 0xE4AF, 0x5563, 0xF9E1, 0x557C, 0xF0A6, 0x5580, 0xCBD3, 0x5584, 0xE0BC, 0x5586, 0xF4CA, 0x5587, 0xD4FA, 0x5589, 0xFDAA, + 0x558A, 0xF9E2, 0x5598, 0xF4B7, 0x5599, 0xFDC2, 0x559A, 0xFCB0, 0x559C, 0xFDEC, 0x559D, 0xCAE2, 0x55A7, 0xFDBD, 0x55A9, 0xEAE7, + 0x55AA, 0xDFC3, 0x55AB, 0xD1D2, 0x55AC, 0xCEE2, 0x55AE, 0xD3A4, 0x55C5, 0xFDAB, 0x55C7, 0xDFE0, 0x55D4, 0xF2C7, 0x55DA, 0xE7F0, + 0x55DC, 0xD0EE, 0x55DF, 0xF3AA, 0x55E3, 0xDECB, 0x55E4, 0xF6B8, 0x55FD, 0xE1F5, 0x55FE, 0xF1B3, 0x5606, 0xF7A3, 0x5609, 0xCAA9, + 0x5614, 0xCFA5, 0x5617, 0xDFC4, 0x562F, 0xE1B0, 0x5632, 0xF0BF, 0x5634, 0xF6A4, 0x5636, 0xE3B6, 0x5653, 0xFAC6, 0x5668, 0xD0EF, + 0x566B, 0xFDED, 0x5674, 0xDDC4, 0x5686, 0xFCF7, 0x56A5, 0xE6BF, 0x56AC, 0xDEAD, 0x56AE, 0xFABF, 0x56B4, 0xE5F1, 0x56BC, 0xEDC4, + 0x56CA, 0xD2A5, 0x56CD, 0xFDEE, 0x56D1, 0xF5B6, 0x56DA, 0xE1F6, 0x56DB, 0xDECC, 0x56DE, 0xFCDE, 0x56E0, 0xECD7, 0x56F0, 0xCDDD, + 0x56F9, 0xD6B7, 0x56FA, 0xCDB3, 0x5703, 0xF8D5, 0x5704, 0xE5D8, 0x5708, 0xCFEA, 0x570B, 0xCFD0, 0x570D, 0xEACC, 0x5712, 0xEAAE, + 0x5713, 0xEAAD, 0x5716, 0xD3F1, 0x5718, 0xD3A5, 0x571F, 0xF7CF, 0x5728, 0xEEA4, 0x572D, 0xD0A4, 0x5730, 0xF2A2, 0x573B, 0xD0F0, + 0x5740, 0xF2A3, 0x5742, 0xF7F8, 0x5747, 0xD0B3, 0x574A, 0xDBA9, 0x574D, 0xD3BB, 0x574E, 0xCAEC, 0x5750, 0xF1A6, 0x5751, 0xCBD5, + 0x5761, 0xF7E7, 0x5764, 0xCDDE, 0x5766, 0xF7A4, 0x576A, 0xF8C0, 0x576E, 0xD3DD, 0x5770, 0xCCD0, 0x5775, 0xCFA6, 0x577C, 0xF6F3, + 0x5782, 0xE1F7, 0x5788, 0xD3DC, 0x578B, 0xFAFE, 0x5793, 0xFAA7, 0x57A0, 0xEBD9, 0x57A2, 0xCFA7, 0x57A3, 0xEAAF, 0x57C3, 0xE4EF, + 0x57C7, 0xE9B9, 0x57C8, 0xF1D8, 0x57CB, 0xD8D8, 0x57CE, 0xE0F2, 0x57DF, 0xE6B4, 0x57E0, 0xDCFC, 0x57F0, 0xF3F1, 0x57F4, 0xE3D0, + 0x57F7, 0xF2FB, 0x57F9, 0xDBC6, 0x57FA, 0xD0F1, 0x57FC, 0xD0F2, 0x5800, 0xCFDC, 0x5802, 0xD3D1, 0x5805, 0xCCB1, 0x5806, 0xF7D8, + 0x5808, 0xCBA8, 0x5809, 0xEBBC, 0x580A, 0xE4BE, 0x581E, 0xF4DC, 0x5821, 0xDCC2, 0x5824, 0xF0A7, 0x5827, 0xE6C0, 0x582A, 0xCAED, + 0x582F, 0xE8EB, 0x5830, 0xE5E8, 0x5831, 0xDCC3, 0x5834, 0xEDDE, 0x5835, 0xD3F2, 0x583A, 0xCCF7, 0x584A, 0xCED4, 0x584B, 0xE7AB, + 0x584F, 0xCBC3, 0x5851, 0xE1B1, 0x5854, 0xF7B2, 0x5857, 0xD3F3, 0x5858, 0xD3D2, 0x585A, 0xF5C0, 0x585E, 0xDFDD, 0x5861, 0xEEF3, + 0x5862, 0xE7F1, 0x5864, 0xFDB4, 0x5875, 0xF2C8, 0x5879, 0xF3D2, 0x587C, 0xEEF4, 0x587E, 0xE2D3, 0x5883, 0xCCD1, 0x5885, 0xDFEA, + 0x5889, 0xE9BA, 0x5893, 0xD9D7, 0x589C, 0xF5CD, 0x589E, 0xF1F2, 0x589F, 0xFAC7, 0x58A8, 0xD9F8, 0x58A9, 0xD4C2, 0x58AE, 0xF6E5, + 0x58B3, 0xDDC5, 0x58BA, 0xE7F2, 0x58BB, 0xEDDF, 0x58BE, 0xCACB, 0x58C1, 0xDBFA, 0x58C5, 0xE8B5, 0x58C7, 0xD3A6, 0x58CE, 0xFDB5, + 0x58D1, 0xF9C9, 0x58D3, 0xE4E2, 0x58D5, 0xFBBD, 0x58D8, 0xD7A4, 0x58D9, 0xCEC5, 0x58DE, 0xCED5, 0x58DF, 0xD6E6, 0x58E4, 0xE5BD, + 0x58EB, 0xDECD, 0x58EC, 0xECF3, 0x58EF, 0xEDE0, 0x58F9, 0xECEC, 0x58FA, 0xFBBE, 0x58FB, 0xDFEB, 0x58FD, 0xE1F8, 0x590F, 0xF9BE, + 0x5914, 0xD0F3, 0x5915, 0xE0AA, 0x5916, 0xE8E2, 0x5919, 0xE2D4, 0x591A, 0xD2FD, 0x591C, 0xE5A8, 0x5922, 0xD9D3, 0x5927, 0xD3DE, + 0x5929, 0xF4B8, 0x592A, 0xF7BC, 0x592B, 0xDCFD, 0x592D, 0xE8EC, 0x592E, 0xE4E7, 0x5931, 0xE3F7, 0x5937, 0xECA8, 0x593E, 0xFAF1, + 0x5944, 0xE5F2, 0x5947, 0xD0F4, 0x5948, 0xD2AF, 0x5949, 0xDCE5, 0x594E, 0xD0A5, 0x594F, 0xF1B4, 0x5950, 0xFCB1, 0x5951, 0xCCF8, + 0x5954, 0xDDC6, 0x5955, 0xFAD1, 0x5957, 0xF7DF, 0x595A, 0xFAA8, 0x5960, 0xEEF5, 0x5962, 0xDECE, 0x5967, 0xE7F3, 0x596A, 0xF7AC, + 0x596B, 0xEBC4, 0x596C, 0xEDE1, 0x596D, 0xE0AB, 0x596E, 0xDDC7, 0x5973, 0xD2B3, 0x5974, 0xD2BF, 0x5978, 0xCACC, 0x597D, 0xFBBF, + 0x5982, 0xE5FD, 0x5983, 0xDDE5, 0x5984, 0xD8CD, 0x598A, 0xECF4, 0x5993, 0xD0F5, 0x5996, 0xE8ED, 0x5997, 0xD0D2, 0x5999, 0xD9D8, + 0x59A5, 0xF6E6, 0x59A8, 0xDBAA, 0x59AC, 0xF7E0, 0x59B9, 0xD8D9, 0x59BB, 0xF4A3, 0x59BE, 0xF4DD, 0x59C3, 0xEFD1, 0x59C6, 0xD9B5, + 0x59C9, 0xEDAB, 0x59CB, 0xE3B7, 0x59D0, 0xEEBB, 0x59D1, 0xCDB4, 0x59D3, 0xE0F3, 0x59D4, 0xEACD, 0x59D9, 0xECF5, 0x59DA, 0xE8EE, + 0x59DC, 0xCBA9, 0x59DD, 0xF1AF, 0x59E6, 0xCACD, 0x59E8, 0xECA9, 0x59EA, 0xF2EB, 0x59EC, 0xFDEF, 0x59EE, 0xF9F3, 0x59F8, 0xE6C1, + 0x59FB, 0xECD8, 0x59FF, 0xEDAC, 0x5A01, 0xEACE, 0x5A03, 0xE8DF, 0x5A11, 0xDECF, 0x5A18, 0xD2A6, 0x5A1B, 0xE7F4, 0x5A1C, 0xD1D6, + 0x5A1F, 0xE6C2, 0x5A20, 0xE3E3, 0x5A25, 0xE4B0, 0x5A29, 0xD8B4, 0x5A36, 0xF6A5, 0x5A3C, 0xF3DE, 0x5A41, 0xD7A5, 0x5A46, 0xF7E8, + 0x5A49, 0xE8C6, 0x5A5A, 0xFBE6, 0x5A62, 0xDDE6, 0x5A66, 0xDCFE, 0x5A92, 0xD8DA, 0x5A9A, 0xDAAC, 0x5A9B, 0xEAB0, 0x5AA4, 0xE3B8, + 0x5AC1, 0xCAAA, 0x5AC2, 0xE1F9, 0x5AC4, 0xEAB1, 0x5AC9, 0xF2EC, 0x5ACC, 0xFAEE, 0x5AE1, 0xEED5, 0x5AE6, 0xF9F4, 0x5AE9, 0xD2EC, + 0x5B05, 0xFBFB, 0x5B09, 0xFDF0, 0x5B0B, 0xE0BD, 0x5B0C, 0xCEE3, 0x5B16, 0xF8C6, 0x5B2A, 0xDEAE, 0x5B40, 0xDFC5, 0x5B43, 0xE5BE, + 0x5B50, 0xEDAD, 0x5B51, 0xFAEA, 0x5B54, 0xCDEE, 0x5B55, 0xEDA6, 0x5B57, 0xEDAE, 0x5B58, 0xF0ED, 0x5B5A, 0xDDA1, 0x5B5C, 0xEDAF, + 0x5B5D, 0xFCF8, 0x5B5F, 0xD8EB, 0x5B63, 0xCCF9, 0x5B64, 0xCDB5, 0x5B69, 0xFAA9, 0x5B6B, 0xE1DD, 0x5B70, 0xE2D5, 0x5B71, 0xEDCF, + 0x5B75, 0xDDA2, 0x5B78, 0xF9CA, 0x5B7A, 0xEAE8, 0x5B7C, 0xE5ED, 0x5B85, 0xD3EB, 0x5B87, 0xE9D4, 0x5B88, 0xE1FA, 0x5B89, 0xE4CC, + 0x5B8B, 0xE1E4, 0x5B8C, 0xE8C7, 0x5B8F, 0xCEDB, 0x5B93, 0xDCD5, 0x5B95, 0xF7B5, 0x5B96, 0xFCF3, 0x5B97, 0xF0F3, 0x5B98, 0xCEAF, + 0x5B99, 0xF1B5, 0x5B9A, 0xEFD2, 0x5B9B, 0xE8C8, 0x5B9C, 0xEBF1, 0x5BA2, 0xCBD4, 0x5BA3, 0xE0BE, 0x5BA4, 0xE3F8, 0x5BA5, 0xEAE9, + 0x5BA6, 0xFCB2, 0x5BAC, 0xE0F4, 0x5BAE, 0xCFE0, 0x5BB0, 0xEEA5, 0x5BB3, 0xFAAA, 0x5BB4, 0xE6C3, 0x5BB5, 0xE1B2, 0x5BB6, 0xCAAB, + 0x5BB8, 0xE3E4, 0x5BB9, 0xE9BB, 0x5BBF, 0xE2D6, 0x5BC0, 0xF3F2, 0x5BC2, 0xEED6, 0x5BC3, 0xEAB2, 0x5BC4, 0xD0F6, 0x5BC5, 0xECD9, + 0x5BC6, 0xDACB, 0x5BC7, 0xCFA8, 0x5BCC, 0xDDA3, 0x5BD0, 0xD8DB, 0x5BD2, 0xF9CE, 0x5BD3, 0xE9D5, 0x5BD4, 0xE3D1, 0x5BD7, 0xD2BC, + 0x5BDE, 0xD8AC, 0x5BDF, 0xF3CC, 0x5BE1, 0xCDFB, 0x5BE2, 0xF6D6, 0x5BE4, 0xE7F5, 0x5BE5, 0xE8EF, 0x5BE6, 0xE3F9, 0x5BE7, 0xD2BB, + 0x5BE8, 0xF3F3, 0x5BE9, 0xE3FB, 0x5BEB, 0xDED0, 0x5BEC, 0xCEB0, 0x5BEE, 0xD6F7, 0x5BEF, 0xF1D9, 0x5BF5, 0xF5C1, 0x5BF6, 0xDCC4, + 0x5BF8, 0xF5BB, 0x5BFA, 0xDED1, 0x5C01, 0xDCE6, 0x5C04, 0xDED2, 0x5C07, 0xEDE2, 0x5C08, 0xEEF6, 0x5C09, 0xEACF, 0x5C0A, 0xF0EE, + 0x5C0B, 0xE3FC, 0x5C0D, 0xD3DF, 0x5C0E, 0xD3F4, 0x5C0F, 0xE1B3, 0x5C11, 0xE1B4, 0x5C16, 0xF4D3, 0x5C19, 0xDFC6, 0x5C24, 0xE9D6, + 0x5C28, 0xDBAB, 0x5C31, 0xF6A6, 0x5C38, 0xE3B9, 0x5C39, 0xEBC5, 0x5C3A, 0xF4A9, 0x5C3B, 0xCDB6, 0x5C3C, 0xD2F9, 0x5C3E, 0xDAAD, + 0x5C3F, 0xD2E3, 0x5C40, 0xCFD1, 0x5C45, 0xCBDC, 0x5C46, 0xCCFA, 0x5C48, 0xCFDD, 0x5C4B, 0xE8A9, 0x5C4D, 0xE3BB, 0x5C4E, 0xE3BA, + 0x5C51, 0xE0DA, 0x5C55, 0xEEF7, 0x5C5B, 0xDCB3, 0x5C60, 0xD3F5, 0x5C62, 0xD7A6, 0x5C64, 0xF6B5, 0x5C65, 0xD7DB, 0x5C6C, 0xE1D5, + 0x5C6F, 0xD4EA, 0x5C71, 0xDFA3, 0x5C79, 0xFDDF, 0x5C90, 0xD0F7, 0x5C91, 0xEDD4, 0x5CA1, 0xCBAA, 0x5CA9, 0xE4DB, 0x5CAB, 0xE1FB, + 0x5CAC, 0xCBA2, 0x5CB1, 0xD3E0, 0x5CB3, 0xE4BF, 0x5CB5, 0xFBC0, 0x5CB7, 0xDABE, 0x5CB8, 0xE4CD, 0x5CBA, 0xD6B9, 0x5CBE, 0xEFC0, + 0x5CC0, 0xE1FC, 0x5CD9, 0xF6B9, 0x5CE0, 0xDFC7, 0x5CE8, 0xE4B1, 0x5CEF, 0xDCE7, 0x5CF0, 0xDCE8, 0x5CF4, 0xFAD6, 0x5CF6, 0xD3F6, + 0x5CFB, 0xF1DA, 0x5CFD, 0xFAF2, 0x5D07, 0xE2FD, 0x5D0D, 0xD5CF, 0x5D0E, 0xD0F8, 0x5D11, 0xCDDF, 0x5D14, 0xF5CB, 0x5D16, 0xE4F0, + 0x5D17, 0xCBAB, 0x5D19, 0xD7C4, 0x5D27, 0xE2FE, 0x5D29, 0xDDDA, 0x5D4B, 0xDAAE, 0x5D4C, 0xCAEE, 0x5D50, 0xD5B9, 0x5D69, 0xE3A1, + 0x5D6C, 0xE8E3, 0x5D6F, 0xF3AB, 0x5D87, 0xCFA9, 0x5D8B, 0xD3F7, 0x5D9D, 0xD4F1, 0x5DA0, 0xCEE4, 0x5DA2, 0xE8F2, 0x5DAA, 0xE5F5, + 0x5DB8, 0xE7AE, 0x5DBA, 0xD6BA, 0x5DBC, 0xDFEC, 0x5DBD, 0xE4C0, 0x5DCD, 0xE8E4, 0x5DD2, 0xD8B5, 0x5DD6, 0xE4DC, 0x5DDD, 0xF4B9, + 0x5DDE, 0xF1B6, 0x5DE1, 0xE2DE, 0x5DE2, 0xE1B5, 0x5DE5, 0xCDEF, 0x5DE6, 0xF1A7, 0x5DE7, 0xCEE5, 0x5DE8, 0xCBDD, 0x5DEB, 0xD9E3, + 0x5DEE, 0xF3AC, 0x5DF1, 0xD0F9, 0x5DF2, 0xECAB, 0x5DF3, 0xDED3, 0x5DF4, 0xF7E9, 0x5DF7, 0xF9F5, 0x5DFD, 0xE1DE, 0x5DFE, 0xCBEE, + 0x5E02, 0xE3BC, 0x5E03, 0xF8D6, 0x5E06, 0xDBEE, 0x5E0C, 0xFDF1, 0x5E11, 0xF7B6, 0x5E16, 0xF4DE, 0x5E19, 0xF2ED, 0x5E1B, 0xDBD9, + 0x5E1D, 0xF0A8, 0x5E25, 0xE1FD, 0x5E2B, 0xDED4, 0x5E2D, 0xE0AC, 0x5E33, 0xEDE3, 0x5E36, 0xD3E1, 0x5E38, 0xDFC8, 0x5E3D, 0xD9B6, + 0x5E3F, 0xFDAC, 0x5E40, 0xEFD3, 0x5E44, 0xE4C1, 0x5E45, 0xF8EB, 0x5E47, 0xDBAC, 0x5E4C, 0xFCC6, 0x5E55, 0xD8AD, 0x5E5F, 0xF6BA, + 0x5E61, 0xDBDF, 0x5E62, 0xD3D3, 0x5E63, 0xF8C7, 0x5E72, 0xCACE, 0x5E73, 0xF8C1, 0x5E74, 0xD2B4, 0x5E77, 0xDCB4, 0x5E78, 0xFAB9, + 0x5E79, 0xCACF, 0x5E7B, 0xFCB3, 0x5E7C, 0xEAEA, 0x5E7D, 0xEAEB, 0x5E7E, 0xD0FA, 0x5E84, 0xEDE4, 0x5E87, 0xDDE7, 0x5E8A, 0xDFC9, + 0x5E8F, 0xDFED, 0x5E95, 0xEEBC, 0x5E97, 0xEFC1, 0x5E9A, 0xCCD2, 0x5E9C, 0xDDA4, 0x5EA0, 0xDFCA, 0x5EA6, 0xD3F8, 0x5EA7, 0xF1A8, + 0x5EAB, 0xCDB7, 0x5EAD, 0xEFD4, 0x5EB5, 0xE4DD, 0x5EB6, 0xDFEE, 0x5EB7, 0xCBAC, 0x5EB8, 0xE9BC, 0x5EBE, 0xEAEC, 0x5EC2, 0xDFCB, + 0x5EC8, 0xF9BF, 0x5EC9, 0xD6AF, 0x5ECA, 0xD5C6, 0x5ED0, 0xCFAA, 0x5ED3, 0xCEA9, 0x5ED6, 0xD6F8, 0x5EDA, 0xF1B7, 0x5EDB, 0xEEF8, + 0x5EDF, 0xD9D9, 0x5EE0, 0xF3DF, 0x5EE2, 0xF8C8, 0x5EE3, 0xCEC6, 0x5EEC, 0xD5E6, 0x5EF3, 0xF4E6, 0x5EF6, 0xE6C5, 0x5EF7, 0xEFD5, + 0x5EFA, 0xCBEF, 0x5EFB, 0xFCDF, 0x5F01, 0xDCA7, 0x5F04, 0xD6E7, 0x5F0A, 0xF8C9, 0x5F0F, 0xE3D2, 0x5F11, 0xE3BD, 0x5F13, 0xCFE1, + 0x5F14, 0xF0C0, 0x5F15, 0xECDA, 0x5F17, 0xDDD7, 0x5F18, 0xFBF0, 0x5F1B, 0xECAC, 0x5F1F, 0xF0A9, 0x5F26, 0xFAD7, 0x5F27, 0xFBC1, + 0x5F29, 0xD2C0, 0x5F31, 0xE5B0, 0x5F35, 0xEDE5, 0x5F3A, 0xCBAD, 0x5F3C, 0xF9B0, 0x5F48, 0xF7A5, 0x5F4A, 0xCBAE, 0x5F4C, 0xDAAF, + 0x5F4E, 0xD8B6, 0x5F56, 0xD3A7, 0x5F57, 0xFBB2, 0x5F59, 0xFDC4, 0x5F5B, 0xECAD, 0x5F62, 0xFBA1, 0x5F66, 0xE5E9, 0x5F67, 0xE9EE, + 0x5F69, 0xF3F4, 0x5F6A, 0xF8F3, 0x5F6B, 0xF0C1, 0x5F6C, 0xDEAF, 0x5F6D, 0xF8B0, 0x5F70, 0xF3E0, 0x5F71, 0xE7AF, 0x5F77, 0xDBAD, + 0x5F79, 0xE6B5, 0x5F7C, 0xF9A8, 0x5F7F, 0xDDD8, 0x5F80, 0xE8D9, 0x5F81, 0xEFD6, 0x5F85, 0xD3E2, 0x5F87, 0xE2DF, 0x5F8A, 0xFCE0, + 0x5F8B, 0xD7C8, 0x5F8C, 0xFDAD, 0x5F90, 0xDFEF, 0x5F91, 0xCCD3, 0x5F92, 0xD3F9, 0x5F97, 0xD4F0, 0x5F98, 0xDBC7, 0x5F99, 0xDED5, + 0x5F9E, 0xF0F4, 0x5FA0, 0xD5D0, 0x5FA1, 0xE5D9, 0x5FA8, 0xFCC7, 0x5FA9, 0xDCD6, 0x5FAA, 0xE2E0, 0x5FAE, 0xDAB0, 0x5FB5, 0xF3A3, + 0x5FB7, 0xD3EC, 0x5FB9, 0xF4CB, 0x5FBD, 0xFDC5, 0x5FC3, 0xE3FD, 0x5FC5, 0xF9B1, 0x5FCC, 0xD0FB, 0x5FCD, 0xECDB, 0x5FD6, 0xF5BC, + 0x5FD7, 0xF2A4, 0x5FD8, 0xD8CE, 0x5FD9, 0xD8CF, 0x5FE0, 0xF5F7, 0x5FEB, 0xF6E1, 0x5FF5, 0xD2B7, 0x5FFD, 0xFBEC, 0x5FFF, 0xDDC8, + 0x600F, 0xE4E8, 0x6012, 0xD2C1, 0x6016, 0xF8D7, 0x601C, 0xD6BB, 0x601D, 0xDED6, 0x6020, 0xF7BD, 0x6021, 0xECAE, 0x6025, 0xD0E1, + 0x6027, 0xE0F5, 0x6028, 0xEAB3, 0x602A, 0xCED6, 0x602F, 0xCCA5, 0x6041, 0xECF6, 0x6042, 0xE2E1, 0x6043, 0xE3BE, 0x604D, 0xFCC8, + 0x6050, 0xCDF0, 0x6052, 0xF9F6, 0x6055, 0xDFF0, 0x6059, 0xE5BF, 0x605D, 0xCEBF, 0x6062, 0xFCE1, 0x6063, 0xEDB0, 0x6064, 0xFDD1, + 0x6065, 0xF6BB, 0x6068, 0xF9CF, 0x6069, 0xEBDA, 0x606A, 0xCAC1, 0x606C, 0xD2B8, 0x606D, 0xCDF1, 0x606F, 0xE3D3, 0x6070, 0xFDE6, + 0x6085, 0xE6ED, 0x6089, 0xE3FA, 0x608C, 0xF0AA, 0x608D, 0xF9D0, 0x6094, 0xFCE2, 0x6096, 0xF8A7, 0x609A, 0xE1E5, 0x609B, 0xEEF9, + 0x609F, 0xE7F6, 0x60A0, 0xEAED, 0x60A3, 0xFCB4, 0x60A4, 0xF5C2, 0x60A7, 0xD7DC, 0x60B0, 0xF0F5, 0x60B2, 0xDDE8, 0x60B3, 0xD3ED, + 0x60B4, 0xF5FC, 0x60B6, 0xDABF, 0x60B8, 0xCCFB, 0x60BC, 0xD3FA, 0x60BD, 0xF4A4, 0x60C5, 0xEFD7, 0x60C7, 0xD4C3, 0x60D1, 0xFBE3, + 0x60DA, 0xFBED, 0x60DC, 0xE0AD, 0x60DF, 0xEAEE, 0x60E0, 0xFBB3, 0x60E1, 0xE4C2, 0x60F0, 0xF6E7, 0x60F1, 0xD2DD, 0x60F3, 0xDFCC, + 0x60F6, 0xFCC9, 0x60F9, 0xE5A9, 0x60FA, 0xE0F6, 0x60FB, 0xF6B3, 0x6101, 0xE1FE, 0x6106, 0xCBF0, 0x6108, 0xEAEF, 0x6109, 0xEAF0, + 0x610D, 0xDAC0, 0x610E, 0xF8B4, 0x610F, 0xEBF2, 0x6115, 0xE4C3, 0x611A, 0xE9D7, 0x611B, 0xE4F1, 0x611F, 0xCAEF, 0x6127, 0xCED7, + 0x6130, 0xFCCA, 0x6134, 0xF3E1, 0x6137, 0xCBC4, 0x613C, 0xE3E5, 0x613E, 0xCBC5, 0x613F, 0xEAB4, 0x6142, 0xE9BD, 0x6144, 0xD7C9, + 0x6147, 0xEBDB, 0x6148, 0xEDB1, 0x614A, 0xCCC3, 0x614B, 0xF7BE, 0x614C, 0xFCCB, 0x6153, 0xF8F4, 0x6155, 0xD9B7, 0x6158, 0xF3D3, + 0x6159, 0xF3D4, 0x615D, 0xF7E4, 0x615F, 0xF7D1, 0x6162, 0xD8B7, 0x6163, 0xCEB1, 0x6164, 0xCAC2, 0x6167, 0xFBB4, 0x6168, 0xCBC6, + 0x616B, 0xF0F6, 0x616E, 0xD5E7, 0x6170, 0xEAD0, 0x6176, 0xCCD4, 0x6177, 0xCBAF, 0x617D, 0xF4AA, 0x617E, 0xE9AF, 0x6181, 0xF5C3, + 0x6182, 0xE9D8, 0x618A, 0xDDE9, 0x618E, 0xF1F3, 0x6190, 0xD5FB, 0x6191, 0xDEBB, 0x6194, 0xF4FB, 0x6198, 0xFDF3, 0x6199, 0xFDF2, + 0x619A, 0xF7A6, 0x61A4, 0xDDC9, 0x61A7, 0xD4D3, 0x61A9, 0xCCA8, 0x61AB, 0xDAC1, 0x61AC, 0xCCD5, 0x61AE, 0xD9E4, 0x61B2, 0xFACA, + 0x61B6, 0xE5E3, 0x61BA, 0xD3BC, 0x61BE, 0xCAF0, 0x61C3, 0xD0C4, 0x61C7, 0xCAD0, 0x61C8, 0xFAAB, 0x61C9, 0xEBEB, 0x61CA, 0xE7F8, + 0x61CB, 0xD9E5, 0x61E6, 0xD1D7, 0x61F2, 0xF3A4, 0x61F6, 0xD4FB, 0x61F7, 0xFCE3, 0x61F8, 0xFAD8, 0x61FA, 0xF3D5, 0x61FC, 0xCFAB, + 0x61FF, 0xEBF3, 0x6200, 0xD5FC, 0x6207, 0xD3D4, 0x6208, 0xCDFC, 0x620A, 0xD9E6, 0x620C, 0xE2F9, 0x620D, 0xE2A1, 0x620E, 0xEBD4, + 0x6210, 0xE0F7, 0x6211, 0xE4B2, 0x6212, 0xCCFC, 0x6216, 0xFBE4, 0x621A, 0xF4AB, 0x621F, 0xD0BD, 0x6221, 0xCAF1, 0x622A, 0xEFB8, + 0x622E, 0xD7C0, 0x6230, 0xEEFA, 0x6231, 0xFDF4, 0x6234, 0xD3E3, 0x6236, 0xFBC2, 0x623E, 0xD5E8, 0x623F, 0xDBAE, 0x6240, 0xE1B6, + 0x6241, 0xF8B7, 0x6247, 0xE0BF, 0x6248, 0xFBC3, 0x6249, 0xDDEA, 0x624B, 0xE2A2, 0x624D, 0xEEA6, 0x6253, 0xF6E8, 0x6258, 0xF6F5, + 0x626E, 0xDDCA, 0x6271, 0xD0E2, 0x6276, 0xDDA6, 0x6279, 0xDDEB, 0x627C, 0xE4F9, 0x627F, 0xE3AF, 0x6280, 0xD0FC, 0x6284, 0xF4FC, + 0x6289, 0xCCBC, 0x628A, 0xF7EA, 0x6291, 0xE5E4, 0x6292, 0xDFF1, 0x6295, 0xF7E1, 0x6297, 0xF9F7, 0x6298, 0xEFB9, 0x629B, 0xF8D8, + 0x62AB, 0xF9A9, 0x62B1, 0xF8D9, 0x62B5, 0xEEBD, 0x62B9, 0xD8C6, 0x62BC, 0xE4E3, 0x62BD, 0xF5CE, 0x62C2, 0xDDD9, 0x62C7, 0xD9E7, + 0x62C8, 0xD2B9, 0x62C9, 0xD5C3, 0x62CC, 0xDAE5, 0x62CD, 0xDAD0, 0x62CF, 0xD1D9, 0x62D0, 0xCED8, 0x62D2, 0xCBDE, 0x62D3, 0xF4AC, + 0x62D4, 0xDAFB, 0x62D6, 0xF6E9, 0x62D7, 0xE8F3, 0x62D8, 0xCFAC, 0x62D9, 0xF0F0, 0x62DB, 0xF4FD, 0x62DC, 0xDBC8, 0x62EC, 0xCEC0, + 0x62ED, 0xE3D4, 0x62EE, 0xD1CF, 0x62EF, 0xF1F5, 0x62F1, 0xCDF2, 0x62F3, 0xCFEB, 0x62F7, 0xCDB8, 0x62FE, 0xE3A6, 0x62FF, 0xD1DA, + 0x6301, 0xF2A5, 0x6307, 0xF2A6, 0x6309, 0xE4CE, 0x6311, 0xD3FB, 0x632B, 0xF1A9, 0x632F, 0xF2C9, 0x633A, 0xEFD8, 0x633B, 0xE6C9, + 0x633D, 0xD8B8, 0x633E, 0xFAF3, 0x6349, 0xF3B5, 0x634C, 0xF8A4, 0x634F, 0xD1F3, 0x6350, 0xE6C8, 0x6355, 0xF8DA, 0x6367, 0xDCE9, + 0x6368, 0xDED7, 0x636E, 0xCBDF, 0x6372, 0xCFEC, 0x6377, 0xF4DF, 0x637A, 0xD1F4, 0x637B, 0xD2BA, 0x637F, 0xDFF2, 0x6383, 0xE1B7, + 0x6388, 0xE2A3, 0x6389, 0xD3FC, 0x638C, 0xEDE6, 0x6392, 0xDBC9, 0x6396, 0xE4FA, 0x6398, 0xCFDE, 0x639B, 0xCED0, 0x63A0, 0xD5D3, + 0x63A1, 0xF3F5, 0x63A2, 0xF7AE, 0x63A5, 0xEFC8, 0x63A7, 0xCDF3, 0x63A8, 0xF5CF, 0x63A9, 0xE5F3, 0x63AA, 0xF0C2, 0x63C0, 0xCAD1, + 0x63C4, 0xEAF1, 0x63C6, 0xD0A6, 0x63CF, 0xD9DA, 0x63D0, 0xF0AB, 0x63D6, 0xEBE7, 0x63DA, 0xE5C0, 0x63DB, 0xFCB5, 0x63E1, 0xE4C4, + 0x63ED, 0xCCA9, 0x63EE, 0xFDC6, 0x63F4, 0xEAB5, 0x63F6, 0xE5AA, 0x63F7, 0xDFBA, 0x640D, 0xE1DF, 0x640F, 0xDAD1, 0x6414, 0xE1B8, + 0x6416, 0xE8F4, 0x6417, 0xD3FD, 0x641C, 0xE2A4, 0x6422, 0xF2CA, 0x642C, 0xDAE6, 0x642D, 0xF7B3, 0x643A, 0xFDCD, 0x643E, 0xF3B6, + 0x6458, 0xEED7, 0x6460, 0xF5C4, 0x6469, 0xD8A4, 0x646F, 0xF2A7, 0x6478, 0xD9B8, 0x6479, 0xD9B9, 0x647A, 0xEFC9, 0x6488, 0xD6CE, + 0x6491, 0xF7CB, 0x6492, 0xDFAE, 0x6493, 0xE8F5, 0x649A, 0xD2B5, 0x649E, 0xD3D5, 0x64A4, 0xF4CC, 0x64A5, 0xDAFC, 0x64AB, 0xD9E8, + 0x64AD, 0xF7EB, 0x64AE, 0xF5C9, 0x64B0, 0xF3BC, 0x64B2, 0xDAD2, 0x64BB, 0xD3B5, 0x64C1, 0xE8B6, 0x64C4, 0xD6CF, 0x64C5, 0xF4BA, + 0x64C7, 0xF7C9, 0x64CA, 0xCCAA, 0x64CD, 0xF0C3, 0x64CE, 0xCCD6, 0x64D2, 0xD0D3, 0x64D4, 0xD3BD, 0x64D8, 0xDBFB, 0x64DA, 0xCBE0, + 0x64E1, 0xD3E4, 0x64E2, 0xF6F7, 0x64E5, 0xD5BA, 0x64E6, 0xF3CD, 0x64E7, 0xCBE1, 0x64EC, 0xEBF4, 0x64F2, 0xF4AD, 0x64F4, 0xFCAA, + 0x64FA, 0xF7EC, 0x64FE, 0xE8F6, 0x6500, 0xDAE7, 0x6504, 0xF7CC, 0x6518, 0xE5C1, 0x651D, 0xE0EE, 0x6523, 0xD5FD, 0x652A, 0xCEE6, + 0x652B, 0xFCAB, 0x652C, 0xD5BB, 0x652F, 0xF2A8, 0x6536, 0xE2A5, 0x6537, 0xCDB9, 0x6538, 0xEAF2, 0x6539, 0xCBC7, 0x653B, 0xCDF4, + 0x653E, 0xDBAF, 0x653F, 0xEFD9, 0x6545, 0xCDBA, 0x6548, 0xFCF9, 0x654D, 0xDFF3, 0x654E, 0xCEE7, 0x654F, 0xDAC2, 0x6551, 0xCFAD, + 0x6556, 0xE7F9, 0x6557, 0xF8A8, 0x655E, 0xF3E2, 0x6562, 0xCAF2, 0x6563, 0xDFA4, 0x6566, 0xD4C4, 0x656C, 0xCCD7, 0x656D, 0xE5C2, + 0x6572, 0xCDBB, 0x6574, 0xEFDA, 0x6575, 0xEED8, 0x6577, 0xDDA7, 0x6578, 0xE2A6, 0x657E, 0xE0C0, 0x6582, 0xD6B0, 0x6583, 0xF8CA, + 0x6585, 0xFCFA, 0x6587, 0xD9FE, 0x658C, 0xDEB0, 0x6590, 0xDDEC, 0x6591, 0xDAE8, 0x6597, 0xD4E0, 0x6599, 0xD6F9, 0x659B, 0xCDD7, + 0x659C, 0xDED8, 0x659F, 0xF2F8, 0x65A1, 0xE4D6, 0x65A4, 0xD0C5, 0x65A5, 0xF4AE, 0x65A7, 0xDDA8, 0x65AB, 0xEDC5, 0x65AC, 0xF3D6, + 0x65AF, 0xDED9, 0x65B0, 0xE3E6, 0x65B7, 0xD3A8, 0x65B9, 0xDBB0, 0x65BC, 0xE5DA, 0x65BD, 0xE3BF, 0x65C1, 0xDBB1, 0x65C5, 0xD5E9, + 0x65CB, 0xE0C1, 0x65CC, 0xEFDB, 0x65CF, 0xF0E9, 0x65D2, 0xD7B2, 0x65D7, 0xD0FD, 0x65E0, 0xD9E9, 0x65E3, 0xD0FE, 0x65E5, 0xECED, + 0x65E6, 0xD3A9, 0x65E8, 0xF2A9, 0x65E9, 0xF0C4, 0x65EC, 0xE2E2, 0x65ED, 0xE9EF, 0x65F1, 0xF9D1, 0x65F4, 0xE9D9, 0x65FA, 0xE8DA, + 0x65FB, 0xDAC3, 0x65FC, 0xDAC4, 0x65FD, 0xD4C5, 0x65FF, 0xE7FA, 0x6606, 0xCDE0, 0x6607, 0xE3B0, 0x6609, 0xDBB2, 0x660A, 0xFBC4, + 0x660C, 0xF3E3, 0x660E, 0xD9A5, 0x660F, 0xFBE7, 0x6610, 0xDDCB, 0x6611, 0xD0D4, 0x6613, 0xE6B6, 0x6614, 0xE0AE, 0x6615, 0xFDDA, + 0x661E, 0xDCB5, 0x661F, 0xE0F8, 0x6620, 0xE7B1, 0x6625, 0xF5F0, 0x6627, 0xD8DC, 0x6628, 0xEDC6, 0x662D, 0xE1B9, 0x662F, 0xE3C0, + 0x6630, 0xF9C0, 0x6631, 0xE9F0, 0x6634, 0xD9DB, 0x6636, 0xF3E4, 0x663A, 0xDCB6, 0x663B, 0xE4E9, 0x6641, 0xF0C5, 0x6642, 0xE3C1, + 0x6643, 0xFCCC, 0x6644, 0xFCCD, 0x6649, 0xF2CB, 0x664B, 0xF2CC, 0x664F, 0xE4CF, 0x6659, 0xF1DB, 0x665B, 0xFAD9, 0x665D, 0xF1B8, + 0x665E, 0xFDF5, 0x665F, 0xE0F9, 0x6664, 0xE7FB, 0x6665, 0xFCB7, 0x6666, 0xFCE4, 0x6667, 0xFBC5, 0x6668, 0xE3E7, 0x6669, 0xD8B9, + 0x666B, 0xF6F8, 0x666E, 0xDCC5, 0x666F, 0xCCD8, 0x6673, 0xE0AF, 0x6674, 0xF4E7, 0x6676, 0xEFDC, 0x6677, 0xCFFC, 0x6678, 0xEFDD, + 0x667A, 0xF2AA, 0x6684, 0xFDBE, 0x6687, 0xCAAC, 0x6688, 0xFDBB, 0x6689, 0xFDC7, 0x668E, 0xE7B2, 0x6690, 0xEAD1, 0x6691, 0xDFF4, + 0x6696, 0xD1EC, 0x6697, 0xE4DE, 0x6698, 0xE5C3, 0x669D, 0xD9A6, 0x66A0, 0xCDBC, 0x66A2, 0xF3E5, 0x66AB, 0xEDD5, 0x66AE, 0xD9BA, + 0x66B2, 0xEDE7, 0x66B3, 0xFBB5, 0x66B4, 0xF8EC, 0x66B9, 0xE0E7, 0x66BB, 0xCCD9, 0x66BE, 0xD4C6, 0x66C4, 0xE7A5, 0x66C6, 0xD5F5, + 0x66C7, 0xD3BE, 0x66C9, 0xFCFB, 0x66D6, 0xE4F2, 0x66D9, 0xDFF5, 0x66DC, 0xE8F8, 0x66DD, 0xF8ED, 0x66E0, 0xCEC7, 0x66E6, 0xFDF6, + 0x66F0, 0xE8D8, 0x66F2, 0xCDD8, 0x66F3, 0xE7D6, 0x66F4, 0xCCDA, 0x66F7, 0xCAE3, 0x66F8, 0xDFF6, 0x66F9, 0xF0C7, 0x66FA, 0xF0C6, + 0x66FC, 0xD8BA, 0x66FE, 0xF1F4, 0x66FF, 0xF4F0, 0x6700, 0xF5CC, 0x6703, 0xFCE5, 0x6708, 0xEAC5, 0x6709, 0xEAF3, 0x670B, 0xDDDB, + 0x670D, 0xDCD7, 0x6714, 0xDEFD, 0x6715, 0xF2F9, 0x6717, 0xD5C7, 0x671B, 0xD8D0, 0x671D, 0xF0C8, 0x671E, 0xD1A1, 0x671F, 0xD1A2, + 0x6726, 0xD9D4, 0x6727, 0xD6E8, 0x6728, 0xD9CA, 0x672A, 0xDAB1, 0x672B, 0xD8C7, 0x672C, 0xDCE2, 0x672D, 0xF3CE, 0x672E, 0xF5F4, + 0x6731, 0xF1B9, 0x6734, 0xDAD3, 0x6736, 0xF6EA, 0x673A, 0xCFF5, 0x673D, 0xFDAE, 0x6746, 0xCAD2, 0x6749, 0xDFB4, 0x674E, 0xD7DD, + 0x674F, 0xFABA, 0x6750, 0xEEA7, 0x6751, 0xF5BD, 0x6753, 0xF8F5, 0x6756, 0xEDE8, 0x675C, 0xD4E1, 0x675E, 0xD1A3, 0x675F, 0xE1D6, + 0x676D, 0xF9F8, 0x676F, 0xDBCA, 0x6770, 0xCBF9, 0x6771, 0xD4D4, 0x6773, 0xD9DC, 0x6775, 0xEEBE, 0x6777, 0xF7ED, 0x677B, 0xD2EE, + 0x677E, 0xE1E6, 0x677F, 0xF7F9, 0x6787, 0xDDED, 0x6789, 0xE8DB, 0x678B, 0xDBB3, 0x678F, 0xD1F7, 0x6790, 0xE0B0, 0x6793, 0xD4E2, + 0x6795, 0xF6D7, 0x6797, 0xD7F9, 0x679A, 0xD8DD, 0x679C, 0xCDFD, 0x679D, 0xF2AB, 0x67AF, 0xCDBD, 0x67B0, 0xF8C2, 0x67B3, 0xF2AC, + 0x67B6, 0xCAAD, 0x67B7, 0xCAAE, 0x67B8, 0xCFAE, 0x67BE, 0xE3C2, 0x67C4, 0xDCB7, 0x67CF, 0xDBDA, 0x67D0, 0xD9BB, 0x67D1, 0xCAF3, + 0x67D2, 0xF6D3, 0x67D3, 0xE6F8, 0x67D4, 0xEAF5, 0x67DA, 0xEAF6, 0x67DD, 0xF6F9, 0x67E9, 0xCFAF, 0x67EC, 0xCAD3, 0x67EF, 0xCAAF, + 0x67F0, 0xD2B0, 0x67F1, 0xF1BA, 0x67F3, 0xD7B3, 0x67F4, 0xE3C3, 0x67F5, 0xF3FD, 0x67F6, 0xDEDA, 0x67FB, 0xDEDB, 0x67FE, 0xEFDE, + 0x6812, 0xE2E3, 0x6813, 0xEEFB, 0x6816, 0xDFF7, 0x6817, 0xD7CA, 0x6821, 0xCEE8, 0x6822, 0xDBDB, 0x682A, 0xF1BB, 0x682F, 0xE9F1, + 0x6838, 0xFAB7, 0x6839, 0xD0C6, 0x683C, 0xCCAB, 0x683D, 0xEEA8, 0x6840, 0xCBFA, 0x6841, 0xF9F9, 0x6842, 0xCCFD, 0x6843, 0xD3FE, + 0x6848, 0xE4D0, 0x684E, 0xF2EE, 0x6850, 0xD4D5, 0x6851, 0xDFCD, 0x6853, 0xFCB8, 0x6854, 0xD1D0, 0x686D, 0xF2CD, 0x6876, 0xF7D2, + 0x687F, 0xCAD4, 0x6881, 0xD5D9, 0x6885, 0xD8DE, 0x688F, 0xCDD9, 0x6893, 0xEEA9, 0x6894, 0xF6BC, 0x6897, 0xCCDB, 0x689D, 0xF0C9, + 0x689F, 0xFCFC, 0x68A1, 0xE8C9, 0x68A2, 0xF4FE, 0x68A7, 0xE7FC, 0x68A8, 0xD7DE, 0x68AD, 0xDEDC, 0x68AF, 0xF0AC, 0x68B0, 0xCCFE, + 0x68B1, 0xCDE1, 0x68B3, 0xE1BA, 0x68B5, 0xDBEF, 0x68B6, 0xDAB2, 0x68C4, 0xD1A5, 0x68C5, 0xDCB8, 0x68C9, 0xD8F6, 0x68CB, 0xD1A4, + 0x68CD, 0xCDE2, 0x68D2, 0xDCEA, 0x68D5, 0xF0F7, 0x68D7, 0xF0CA, 0x68D8, 0xD0BE, 0x68DA, 0xDDDC, 0x68DF, 0xD4D6, 0x68E0, 0xD3D6, + 0x68E7, 0xEDD0, 0x68E8, 0xCDA1, 0x68EE, 0xDFB5, 0x68F2, 0xDFF8, 0x68F9, 0xD4A1, 0x68FA, 0xCEB2, 0x6900, 0xE8CA, 0x6905, 0xEBF5, + 0x690D, 0xE3D5, 0x690E, 0xF5D0, 0x6912, 0xF5A1, 0x6927, 0xD9A7, 0x6930, 0xE5AB, 0x693D, 0xE6CB, 0x693F, 0xF5F1, 0x694A, 0xE5C5, + 0x6953, 0xF9A3, 0x6954, 0xE0DB, 0x6955, 0xF6EB, 0x6957, 0xCBF1, 0x6959, 0xD9EA, 0x695A, 0xF5A2, 0x695E, 0xD7D1, 0x6960, 0xD1F8, + 0x6961, 0xEAF8, 0x6962, 0xEAF9, 0x6963, 0xDAB3, 0x6968, 0xEFDF, 0x696B, 0xF1EF, 0x696D, 0xE5F6, 0x696E, 0xEEBF, 0x696F, 0xE2E4, + 0x6975, 0xD0BF, 0x6977, 0xFAAC, 0x6978, 0xF5D1, 0x6979, 0xE7B3, 0x6995, 0xE9BE, 0x699B, 0xF2CE, 0x699C, 0xDBB4, 0x69A5, 0xFCCE, + 0x69A7, 0xDDEE, 0x69AE, 0xE7B4, 0x69B4, 0xD7B4, 0x69BB, 0xF7B4, 0x69C1, 0xCDBE, 0x69C3, 0xDAE9, 0x69CB, 0xCFB0, 0x69CC, 0xF7D9, + 0x69CD, 0xF3E6, 0x69D0, 0xCED9, 0x69E8, 0xCEAA, 0x69EA, 0xCBC8, 0x69FB, 0xD0A7, 0x69FD, 0xF0CB, 0x69FF, 0xD0C7, 0x6A02, 0xE4C5, + 0x6A0A, 0xDBE0, 0x6A11, 0xD5DA, 0x6A13, 0xD7A7, 0x6A17, 0xEEC0, 0x6A19, 0xF8F6, 0x6A1E, 0xF5D2, 0x6A1F, 0xEDE9, 0x6A21, 0xD9BC, + 0x6A23, 0xE5C6, 0x6A35, 0xF5A3, 0x6A38, 0xDAD4, 0x6A39, 0xE2A7, 0x6A3A, 0xFBFC, 0x6A3D, 0xF1DC, 0x6A44, 0xCAF4, 0x6A48, 0xE8FA, + 0x6A4B, 0xCEE9, 0x6A52, 0xE9F8, 0x6A53, 0xE2E5, 0x6A58, 0xD0B9, 0x6A59, 0xD4F2, 0x6A5F, 0xD1A6, 0x6A61, 0xDFCE, 0x6A6B, 0xFCF4, + 0x6A80, 0xD3AA, 0x6A84, 0xCCAC, 0x6A89, 0xEFE0, 0x6A8D, 0xE5E5, 0x6A8E, 0xD0D5, 0x6A97, 0xDBFC, 0x6A9C, 0xFCE6, 0x6AA2, 0xCBFE, + 0x6AA3, 0xEDEA, 0x6AB3, 0xDEB1, 0x6ABB, 0xF9E3, 0x6AC2, 0xD4A2, 0x6AC3, 0xCFF6, 0x6AD3, 0xD6D0, 0x6ADA, 0xD5EA, 0x6ADB, 0xF1EE, + 0x6AF6, 0xFACB, 0x6AFB, 0xE5A1, 0x6B04, 0xD5B1, 0x6B0A, 0xCFED, 0x6B0C, 0xEDEB, 0x6B12, 0xD5B2, 0x6B16, 0xD5BC, 0x6B20, 0xFDE2, + 0x6B21, 0xF3AD, 0x6B23, 0xFDDB, 0x6B32, 0xE9B0, 0x6B3A, 0xD1A7, 0x6B3D, 0xFDE3, 0x6B3E, 0xCEB3, 0x6B46, 0xFDE4, 0x6B47, 0xFACE, + 0x6B4C, 0xCAB0, 0x6B4E, 0xF7A7, 0x6B50, 0xCFB1, 0x6B5F, 0xE6A2, 0x6B61, 0xFCB6, 0x6B62, 0xF2AD, 0x6B63, 0xEFE1, 0x6B64, 0xF3AE, + 0x6B65, 0xDCC6, 0x6B66, 0xD9EB, 0x6B6A, 0xE8E0, 0x6B72, 0xE1A8, 0x6B77, 0xD5F6, 0x6B78, 0xCFFD, 0x6B7B, 0xDEDD, 0x6B7F, 0xD9D1, + 0x6B83, 0xE4EA, 0x6B84, 0xF2CF, 0x6B86, 0xF7BF, 0x6B89, 0xE2E6, 0x6B8A, 0xE2A8, 0x6B96, 0xE3D6, 0x6B98, 0xEDD1, 0x6B9E, 0xE9F9, + 0x6BAE, 0xD6B1, 0x6BAF, 0xDEB2, 0x6BB2, 0xE0E8, 0x6BB5, 0xD3AB, 0x6BB7, 0xEBDC, 0x6BBA, 0xDFAF, 0x6BBC, 0xCAC3, 0x6BBF, 0xEEFC, + 0x6BC1, 0xFDC3, 0x6BC5, 0xEBF6, 0x6BC6, 0xCFB2, 0x6BCB, 0xD9EC, 0x6BCD, 0xD9BD, 0x6BCF, 0xD8DF, 0x6BD2, 0xD4B8, 0x6BD3, 0xEBBE, + 0x6BD4, 0xDDEF, 0x6BD6, 0xDDF0, 0x6BD7, 0xDDF1, 0x6BD8, 0xDDF2, 0x6BDB, 0xD9BE, 0x6BEB, 0xFBC6, 0x6BEC, 0xCFB3, 0x6C08, 0xEEFD, + 0x6C0F, 0xE4AB, 0x6C11, 0xDAC5, 0x6C13, 0xD8EC, 0x6C23, 0xD1A8, 0x6C34, 0xE2A9, 0x6C37, 0xDEBC, 0x6C38, 0xE7B5, 0x6C3E, 0xDBF0, + 0x6C40, 0xEFE2, 0x6C41, 0xF1F0, 0x6C42, 0xCFB4, 0x6C4E, 0xDBF1, 0x6C50, 0xE0B1, 0x6C55, 0xDFA5, 0x6C57, 0xF9D2, 0x6C5A, 0xE7FD, + 0x6C5D, 0xE6A3, 0x6C5E, 0xFBF1, 0x6C5F, 0xCBB0, 0x6C60, 0xF2AE, 0x6C68, 0xCDE7, 0x6C6A, 0xE8DC, 0x6C6D, 0xE7D7, 0x6C70, 0xF7C0, + 0x6C72, 0xD0E3, 0x6C76, 0xDAA1, 0x6C7A, 0xCCBD, 0x6C7D, 0xD1A9, 0x6C7E, 0xDDCC, 0x6C81, 0xE3FE, 0x6C82, 0xD1AA, 0x6C83, 0xE8AA, + 0x6C85, 0xEAB6, 0x6C86, 0xF9FA, 0x6C87, 0xE6CC, 0x6C88, 0xF6D8, 0x6C8C, 0xD4C7, 0x6C90, 0xD9CB, 0x6C92, 0xD9D2, 0x6C93, 0xD3CB, + 0x6C94, 0xD8F7, 0x6C95, 0xDAA9, 0x6C96, 0xF5F8, 0x6C99, 0xDEDE, 0x6C9A, 0xF2AF, 0x6C9B, 0xF8A9, 0x6CAB, 0xD8C8, 0x6CAE, 0xEEC1, + 0x6CB3, 0xF9C1, 0x6CB8, 0xDDF3, 0x6CB9, 0xEAFA, 0x6CBB, 0xF6BD, 0x6CBC, 0xE1BB, 0x6CBD, 0xCDBF, 0x6CBE, 0xF4D4, 0x6CBF, 0xE6CD, + 0x6CC1, 0xFCCF, 0x6CC2, 0xFBA2, 0x6CC4, 0xE0DC, 0x6CC9, 0xF4BB, 0x6CCA, 0xDAD5, 0x6CCC, 0xF9B2, 0x6CD3, 0xFBF2, 0x6CD5, 0xDBF6, + 0x6CD7, 0xDEDF, 0x6CDB, 0xDBF2, 0x6CE1, 0xF8DC, 0x6CE2, 0xF7EE, 0x6CE3, 0xEBE8, 0x6CE5, 0xD2FA, 0x6CE8, 0xF1BC, 0x6CEB, 0xFADA, + 0x6CEE, 0xDAEA, 0x6CEF, 0xDAC6, 0x6CF0, 0xF7C1, 0x6CF3, 0xE7B6, 0x6D0B, 0xE5C7, 0x6D0C, 0xD6AC, 0x6D11, 0xDCC7, 0x6D17, 0xE1A9, + 0x6D19, 0xE2AA, 0x6D1B, 0xD5A6, 0x6D1E, 0xD4D7, 0x6D25, 0xF2D0, 0x6D27, 0xEAFB, 0x6D29, 0xE0DD, 0x6D2A, 0xFBF3, 0x6D32, 0xF1BD, + 0x6D35, 0xE2E7, 0x6D36, 0xFDD7, 0x6D38, 0xCEC8, 0x6D39, 0xEAB7, 0x6D3B, 0xFCC0, 0x6D3D, 0xFDE7, 0x6D3E, 0xF7EF, 0x6D41, 0xD7B5, + 0x6D59, 0xEFBA, 0x6D5A, 0xF1DD, 0x6D5C, 0xDEB3, 0x6D63, 0xE8CB, 0x6D66, 0xF8DD, 0x6D69, 0xFBC7, 0x6D6A, 0xD5C8, 0x6D6C, 0xD7DF, + 0x6D6E, 0xDDA9, 0x6D74, 0xE9B1, 0x6D77, 0xFAAD, 0x6D78, 0xF6D9, 0x6D79, 0xFAF4, 0x6D7F, 0xF8AA, 0x6D85, 0xE6EE, 0x6D87, 0xCCDC, + 0x6D88, 0xE1BC, 0x6D89, 0xE0EF, 0x6D8C, 0xE9BF, 0x6D8D, 0xFCFD, 0x6D8E, 0xE6CE, 0x6D91, 0xE1D7, 0x6D93, 0xE6CF, 0x6D95, 0xF4F1, + 0x6DAF, 0xE4F3, 0x6DB2, 0xE4FB, 0x6DB5, 0xF9E4, 0x6DC0, 0xEFE3, 0x6DC3, 0xCFEE, 0x6DC4, 0xF6BE, 0x6DC5, 0xE0B2, 0x6DC6, 0xFCFE, + 0x6DC7, 0xD1AB, 0x6DCB, 0xD7FA, 0x6DCF, 0xFBC8, 0x6DD1, 0xE2D7, 0x6DD8, 0xD4A3, 0x6DD9, 0xF0F8, 0x6DDA, 0xD7A8, 0x6DDE, 0xE1E7, + 0x6DE1, 0xD3BF, 0x6DE8, 0xEFE4, 0x6DEA, 0xD7C5, 0x6DEB, 0xEBE2, 0x6DEE, 0xFCE7, 0x6DF1, 0xE4A2, 0x6DF3, 0xE2E8, 0x6DF5, 0xE6D0, + 0x6DF7, 0xFBE8, 0x6DF8, 0xF4E8, 0x6DF9, 0xE5F4, 0x6DFA, 0xF4BC, 0x6DFB, 0xF4D5, 0x6E17, 0xDFB6, 0x6E19, 0xFCB9, 0x6E1A, 0xEEC2, + 0x6E1B, 0xCAF5, 0x6E1F, 0xEFE5, 0x6E20, 0xCBE2, 0x6E21, 0xD4A4, 0x6E23, 0xDEE0, 0x6E24, 0xDAFD, 0x6E25, 0xE4C6, 0x6E26, 0xE8BE, + 0x6E2B, 0xE0DE, 0x6E2C, 0xF6B4, 0x6E2D, 0xEAD2, 0x6E2F, 0xF9FB, 0x6E32, 0xE0C2, 0x6E34, 0xCAE4, 0x6E36, 0xE7B7, 0x6E38, 0xEAFD, + 0x6E3A, 0xD9DD, 0x6E3C, 0xDAB4, 0x6E3D, 0xEEAA, 0x6E3E, 0xFBE9, 0x6E43, 0xDBCB, 0x6E44, 0xDAB5, 0x6E4A, 0xF1BE, 0x6E4D, 0xD3AC, + 0x6E56, 0xFBC9, 0x6E58, 0xDFCF, 0x6E5B, 0xD3C0, 0x6E5C, 0xE3D7, 0x6E5E, 0xEFE6, 0x6E5F, 0xFCD0, 0x6E67, 0xE9C0, 0x6E6B, 0xF5D3, + 0x6E6E, 0xECDC, 0x6E6F, 0xF7B7, 0x6E72, 0xEAB8, 0x6E73, 0xD1F9, 0x6E7A, 0xDCC8, 0x6E90, 0xEAB9, 0x6E96, 0xF1DE, 0x6E9C, 0xD7B6, + 0x6E9D, 0xCFB5, 0x6E9F, 0xD9A8, 0x6EA2, 0xECEE, 0x6EA5, 0xDDAA, 0x6EAA, 0xCDA2, 0x6EAB, 0xE8AE, 0x6EAF, 0xE1BD, 0x6EB1, 0xF2D1, + 0x6EB6, 0xE9C1, 0x6EBA, 0xD2FC, 0x6EC2, 0xDBB5, 0x6EC4, 0xF3E7, 0x6EC5, 0xD8FE, 0x6EC9, 0xFCD1, 0x6ECB, 0xEDB2, 0x6ECC, 0xF4AF, + 0x6ECE, 0xFBA3, 0x6ED1, 0xFCC1, 0x6ED3, 0xEEAB, 0x6ED4, 0xD4A5, 0x6EEF, 0xF4F2, 0x6EF4, 0xEED9, 0x6EF8, 0xFBCA, 0x6EFE, 0xCDE3, + 0x6EFF, 0xD8BB, 0x6F01, 0xE5DB, 0x6F02, 0xF8F7, 0x6F06, 0xF6D4, 0x6F0F, 0xD7A9, 0x6F11, 0xCBC9, 0x6F14, 0xE6D1, 0x6F15, 0xF0CC, + 0x6F20, 0xD8AE, 0x6F22, 0xF9D3, 0x6F23, 0xD5FE, 0x6F2B, 0xD8BC, 0x6F2C, 0xF2B0, 0x6F31, 0xE2AB, 0x6F32, 0xF3E8, 0x6F38, 0xEFC2, + 0x6F3F, 0xEDEC, 0x6F41, 0xE7B8, 0x6F51, 0xDAFE, 0x6F54, 0xCCBE, 0x6F57, 0xF2FC, 0x6F58, 0xDAEB, 0x6F5A, 0xE2D8, 0x6F5B, 0xEDD6, + 0x6F5E, 0xD6D1, 0x6F5F, 0xE0B3, 0x6F62, 0xFCD2, 0x6F64, 0xEBC8, 0x6F6D, 0xD3C1, 0x6F6E, 0xF0CD, 0x6F70, 0xCFF7, 0x6F7A, 0xEDD2, + 0x6F7C, 0xD4D8, 0x6F7D, 0xDCC9, 0x6F7E, 0xD7F1, 0x6F81, 0xDFBB, 0x6F84, 0xF3A5, 0x6F88, 0xF4CD, 0x6F8D, 0xF1BF, 0x6F8E, 0xF8B1, + 0x6F90, 0xE9FA, 0x6F94, 0xFBCB, 0x6F97, 0xCAD5, 0x6FA3, 0xF9D4, 0x6FA4, 0xF7CA, 0x6FA7, 0xD6C8, 0x6FAE, 0xFCE8, 0x6FAF, 0xF3BD, + 0x6FB1, 0xEEFE, 0x6FB3, 0xE7FE, 0x6FB9, 0xD3C2, 0x6FBE, 0xD3B6, 0x6FC0, 0xCCAD, 0x6FC1, 0xF6FA, 0x6FC2, 0xD6B2, 0x6FC3, 0xD2D8, + 0x6FCA, 0xE7D8, 0x6FD5, 0xE3A5, 0x6FDA, 0xE7B9, 0x6FDF, 0xF0AD, 0x6FE0, 0xFBCC, 0x6FE1, 0xEBA1, 0x6FE4, 0xD4A6, 0x6FE9, 0xFBCD, + 0x6FEB, 0xD5BD, 0x6FEC, 0xF1DF, 0x6FEF, 0xF6FB, 0x6FF1, 0xDEB4, 0x6FFE, 0xD5EB, 0x7001, 0xE5C8, 0x7005, 0xFBA4, 0x7006, 0xD4B9, + 0x7009, 0xDEE1, 0x700B, 0xE4A3, 0x700F, 0xD7B7, 0x7011, 0xF8EE, 0x7015, 0xDEB5, 0x7018, 0xD6D2, 0x701A, 0xF9D5, 0x701B, 0xE7BA, + 0x701C, 0xEBD5, 0x701D, 0xD5F7, 0x701E, 0xEFE7, 0x701F, 0xE1BE, 0x7023, 0xFAAE, 0x7027, 0xD6E9, 0x7028, 0xD6EE, 0x702F, 0xE7BB, + 0x7037, 0xECCB, 0x703E, 0xD5B3, 0x704C, 0xCEB4, 0x7050, 0xFBA5, 0x7051, 0xE1EE, 0x7058, 0xF7A8, 0x705D, 0xFBCE, 0x7063, 0xD8BD, + 0x706B, 0xFBFD, 0x7070, 0xFCE9, 0x7078, 0xCFB6, 0x707C, 0xEDC7, 0x707D, 0xEEAC, 0x7085, 0xCCDD, 0x708A, 0xF6A7, 0x708E, 0xE6FA, + 0x7092, 0xF5A4, 0x7098, 0xFDDC, 0x7099, 0xEDB3, 0x709A, 0xCEC9, 0x70A1, 0xEFE8, 0x70A4, 0xE1BF, 0x70AB, 0xFADB, 0x70AC, 0xCBE3, + 0x70AD, 0xF7A9, 0x70AF, 0xFBA6, 0x70B3, 0xDCB9, 0x70B7, 0xF1C0, 0x70B8, 0xEDC8, 0x70B9, 0xEFC3, 0x70C8, 0xD6AD, 0x70CB, 0xFDCE, + 0x70CF, 0xE8A1, 0x70D8, 0xFBF4, 0x70D9, 0xD5A7, 0x70DD, 0xF1F6, 0x70DF, 0xE6D3, 0x70F1, 0xCCDE, 0x70F9, 0xF8B2, 0x70FD, 0xDCEB, + 0x7104, 0xFDB6, 0x7109, 0xE5EA, 0x710C, 0xF1E0, 0x7119, 0xDBCC, 0x711A, 0xDDCD, 0x711E, 0xD4C8, 0x7121, 0xD9ED, 0x7126, 0xF5A5, + 0x7130, 0xE6FB, 0x7136, 0xE6D4, 0x7147, 0xFDC8, 0x7149, 0xD6A1, 0x714A, 0xFDBF, 0x714C, 0xFCD3, 0x714E, 0xEFA1, 0x7150, 0xE7BC, + 0x7156, 0xD1EE, 0x7159, 0xE6D5, 0x715C, 0xE9F2, 0x715E, 0xDFB0, 0x7164, 0xD8E0, 0x7165, 0xFCBA, 0x7166, 0xFDAF, 0x7167, 0xF0CE, + 0x7169, 0xDBE1, 0x716C, 0xE5C9, 0x716E, 0xEDB4, 0x717D, 0xE0C3, 0x7184, 0xE3D8, 0x7189, 0xE9FB, 0x718A, 0xEAA8, 0x718F, 0xFDB7, + 0x7192, 0xFBA7, 0x7194, 0xE9C2, 0x7199, 0xFDF7, 0x719F, 0xE2D9, 0x71A2, 0xDCEC, 0x71AC, 0xE8A2, 0x71B1, 0xE6F0, 0x71B9, 0xFDF8, + 0x71BA, 0xFDF9, 0x71BE, 0xF6BF, 0x71C1, 0xE7A7, 0x71C3, 0xE6D7, 0x71C8, 0xD4F3, 0x71C9, 0xD4C9, 0x71CE, 0xD6FA, 0x71D0, 0xD7F2, + 0x71D2, 0xE1C0, 0x71D4, 0xDBE2, 0x71D5, 0xE6D8, 0x71DF, 0xE7BD, 0x71E5, 0xF0CF, 0x71E6, 0xF3BE, 0x71E7, 0xE2AC, 0x71ED, 0xF5B7, + 0x71EE, 0xE0F0, 0x71FB, 0xFDB8, 0x71FC, 0xE3E8, 0x71FE, 0xD4A7, 0x71FF, 0xE8FC, 0x7200, 0xFAD2, 0x7206, 0xF8EF, 0x7210, 0xD6D3, + 0x721B, 0xD5B4, 0x722A, 0xF0D0, 0x722C, 0xF7F0, 0x722D, 0xEEB3, 0x7230, 0xEABA, 0x7232, 0xEAD3, 0x7235, 0xEDC9, 0x7236, 0xDDAB, + 0x723A, 0xE5AC, 0x723B, 0xFDA1, 0x723D, 0xDFD0, 0x723E, 0xECB3, 0x7240, 0xDFD1, 0x7246, 0xEDED, 0x7247, 0xF8B8, 0x7248, 0xF7FA, + 0x724C, 0xF8AB, 0x7252, 0xF4E0, 0x7258, 0xD4BA, 0x7259, 0xE4B3, 0x725B, 0xE9DA, 0x725D, 0xDEB6, 0x725F, 0xD9BF, 0x7261, 0xD9C0, + 0x7262, 0xD6EF, 0x7267, 0xD9CC, 0x7269, 0xDAAA, 0x7272, 0xDFE5, 0x7279, 0xF7E5, 0x727D, 0xCCB2, 0x7280, 0xDFF9, 0x7281, 0xD7E0, + 0x72A2, 0xD4BB, 0x72A7, 0xFDFA, 0x72AC, 0xCCB3, 0x72AF, 0xDBF3, 0x72C0, 0xDFD2, 0x72C2, 0xCECA, 0x72C4, 0xEEDA, 0x72CE, 0xE4E4, + 0x72D0, 0xFBCF, 0x72D7, 0xCFB7, 0x72D9, 0xEEC3, 0x72E1, 0xCEEA, 0x72E9, 0xE2AD, 0x72F8, 0xD7E1, 0x72F9, 0xFAF5, 0x72FC, 0xD5C9, + 0x72FD, 0xF8AC, 0x730A, 0xE7D9, 0x7316, 0xF3E9, 0x731B, 0xD8ED, 0x731C, 0xE3C4, 0x731D, 0xF0F1, 0x7325, 0xE8E5, 0x7329, 0xE0FA, + 0x732A, 0xEEC4, 0x732B, 0xD9DE, 0x7336, 0xEBA2, 0x7337, 0xEBA3, 0x733E, 0xFCC2, 0x733F, 0xEABB, 0x7344, 0xE8AB, 0x7345, 0xDEE2, + 0x7350, 0xEDEF, 0x7352, 0xE8A3, 0x7357, 0xCFF1, 0x7368, 0xD4BC, 0x736A, 0xFCEA, 0x7370, 0xE7BE, 0x7372, 0xFCF2, 0x7375, 0xD6B4, + 0x7378, 0xE2AE, 0x737A, 0xD3B7, 0x737B, 0xFACC, 0x7384, 0xFADC, 0x7386, 0xEDB5, 0x7387, 0xE1E3, 0x7389, 0xE8AC, 0x738B, 0xE8DD, + 0x738E, 0xEFE9, 0x7394, 0xF4BD, 0x7396, 0xCFB8, 0x7397, 0xE9DB, 0x7398, 0xD1AC, 0x739F, 0xDAC7, 0x73A7, 0xEBC9, 0x73A9, 0xE8CC, + 0x73AD, 0xDEB7, 0x73B2, 0xD6BC, 0x73B3, 0xD3E5, 0x73B9, 0xFADD, 0x73C0, 0xDAD6, 0x73C2, 0xCAB1, 0x73C9, 0xDAC8, 0x73CA, 0xDFA6, + 0x73CC, 0xF9B3, 0x73CD, 0xF2D2, 0x73CF, 0xCAC4, 0x73D6, 0xCECB, 0x73D9, 0xCDF5, 0x73DD, 0xFDB0, 0x73DE, 0xD5A8, 0x73E0, 0xF1C1, + 0x73E3, 0xE2E9, 0x73E4, 0xDCCA, 0x73E5, 0xECB4, 0x73E6, 0xFAC0, 0x73E9, 0xFBA8, 0x73EA, 0xD0A8, 0x73ED, 0xDAEC, 0x73F7, 0xD9EE, + 0x73F9, 0xE0FB, 0x73FD, 0xEFEA, 0x73FE, 0xFADE, 0x7401, 0xE0C4, 0x7403, 0xCFB9, 0x7405, 0xD5CA, 0x7406, 0xD7E2, 0x7407, 0xE2AF, + 0x7409, 0xD7B8, 0x7413, 0xE8CD, 0x741B, 0xF6DA, 0x7420, 0xEFA2, 0x7421, 0xE2DA, 0x7422, 0xF6FC, 0x7425, 0xFBD0, 0x7426, 0xD1AD, + 0x7428, 0xCDE4, 0x742A, 0xD1AE, 0x742B, 0xDCED, 0x742C, 0xE8CE, 0x742E, 0xF0F9, 0x742F, 0xCEB5, 0x7430, 0xE6FC, 0x7433, 0xD7FB, + 0x7434, 0xD0D6, 0x7435, 0xDDF5, 0x7436, 0xF7F1, 0x7438, 0xF6FD, 0x743A, 0xDBF7, 0x743F, 0xFBEA, 0x7440, 0xE9DC, 0x7441, 0xD9C1, + 0x7443, 0xF5F2, 0x7444, 0xE0C5, 0x744B, 0xEAD4, 0x7455, 0xF9C2, 0x7457, 0xEABC, 0x7459, 0xD2C5, 0x745A, 0xFBD1, 0x745B, 0xE7C0, + 0x745C, 0xEBA5, 0x745E, 0xDFFA, 0x745F, 0xE3A2, 0x7460, 0xD7B9, 0x7462, 0xE9C3, 0x7464, 0xE8FD, 0x7465, 0xE8AF, 0x7468, 0xF2D3, + 0x7469, 0xFBA9, 0x746A, 0xD8A5, 0x746F, 0xD5CB, 0x747E, 0xD0C8, 0x7482, 0xD1AF, 0x7483, 0xD7E3, 0x7487, 0xE0C6, 0x7489, 0xD6A2, + 0x748B, 0xEDF0, 0x7498, 0xD7F3, 0x749C, 0xFCD4, 0x749E, 0xDAD7, 0x749F, 0xCCDF, 0x74A1, 0xF2D4, 0x74A3, 0xD1B0, 0x74A5, 0xCCE0, + 0x74A7, 0xDBFD, 0x74A8, 0xF3BF, 0x74AA, 0xF0D1, 0x74B0, 0xFCBB, 0x74B2, 0xE2B0, 0x74B5, 0xE6A5, 0x74B9, 0xE2DB, 0x74BD, 0xDFDE, + 0x74BF, 0xE0C7, 0x74C6, 0xF2EF, 0x74CA, 0xCCE1, 0x74CF, 0xD6EA, 0x74D4, 0xE7C2, 0x74D8, 0xCEB6, 0x74DA, 0xF3C0, 0x74DC, 0xCDFE, + 0x74E0, 0xFBD2, 0x74E2, 0xF8F8, 0x74E3, 0xF7FB, 0x74E6, 0xE8BF, 0x74EE, 0xE8B7, 0x74F7, 0xEDB6, 0x7501, 0xDCBA, 0x7504, 0xCCB4, + 0x7511, 0xF1F7, 0x7515, 0xE8B8, 0x7518, 0xCAF6, 0x751A, 0xE4A4, 0x751B, 0xF4D6, 0x751F, 0xDFE6, 0x7523, 0xDFA7, 0x7525, 0xDFE7, + 0x7526, 0xE1C1, 0x7528, 0xE9C4, 0x752B, 0xDCCB, 0x752C, 0xE9C5, 0x7530, 0xEFA3, 0x7531, 0xEBA6, 0x7532, 0xCBA3, 0x7533, 0xE3E9, + 0x7537, 0xD1FB, 0x7538, 0xEFA4, 0x753A, 0xEFEB, 0x7547, 0xD0B4, 0x754C, 0xCDA3, 0x754F, 0xE8E6, 0x7551, 0xEFA5, 0x7553, 0xD3CC, + 0x7554, 0xDAED, 0x7559, 0xD7BA, 0x755B, 0xF2D5, 0x755C, 0xF5E5, 0x755D, 0xD9EF, 0x7562, 0xF9B4, 0x7565, 0xD5D4, 0x7566, 0xFDCF, + 0x756A, 0xDBE3, 0x756F, 0xF1E1, 0x7570, 0xECB6, 0x7575, 0xFBFE, 0x7576, 0xD3D7, 0x7578, 0xD1B1, 0x757A, 0xCBB1, 0x757F, 0xD1B2, + 0x7586, 0xCBB2, 0x7587, 0xF1C2, 0x758A, 0xF4E1, 0x758B, 0xF9B5, 0x758E, 0xE1C3, 0x758F, 0xE1C2, 0x7591, 0xEBF7, 0x759D, 0xDFA8, + 0x75A5, 0xCBCA, 0x75AB, 0xE6B9, 0x75B1, 0xF8DE, 0x75B2, 0xF9AA, 0x75B3, 0xCAF7, 0x75B5, 0xEDB7, 0x75B8, 0xD3B8, 0x75B9, 0xF2D6, + 0x75BC, 0xD4D9, 0x75BD, 0xEEC5, 0x75BE, 0xF2F0, 0x75C2, 0xCAB2, 0x75C5, 0xDCBB, 0x75C7, 0xF1F8, 0x75CD, 0xECB7, 0x75D2, 0xE5CA, + 0x75D4, 0xF6C0, 0x75D5, 0xFDDD, 0x75D8, 0xD4E3, 0x75D9, 0xCCE2, 0x75DB, 0xF7D4, 0x75E2, 0xD7E5, 0x75F0, 0xD3C3, 0x75F2, 0xD8A6, + 0x75F4, 0xF6C1, 0x75FA, 0xDDF6, 0x75FC, 0xCDC0, 0x7600, 0xE5DC, 0x760D, 0xE5CB, 0x7619, 0xE1C4, 0x761F, 0xE8B0, 0x7620, 0xF4B0, + 0x7621, 0xF3EA, 0x7622, 0xDAEE, 0x7624, 0xD7BB, 0x7626, 0xE2B1, 0x763B, 0xD7AA, 0x7642, 0xD6FB, 0x764C, 0xE4DF, 0x764E, 0xCAD6, + 0x7652, 0xEBA8, 0x7656, 0xDBFE, 0x7661, 0xF6C2, 0x7664, 0xEFBB, 0x7669, 0xD4FD, 0x766C, 0xE0C8, 0x7670, 0xE8B9, 0x7672, 0xEFA6, + 0x7678, 0xCDA4, 0x767B, 0xD4F4, 0x767C, 0xDBA1, 0x767D, 0xDBDC, 0x767E, 0xDBDD, 0x7684, 0xEEDC, 0x7686, 0xCBCB, 0x7687, 0xFCD5, + 0x768E, 0xCEEB, 0x7690, 0xCDC1, 0x7693, 0xFBD3, 0x76AE, 0xF9AB, 0x76BA, 0xF5D4, 0x76BF, 0xD9A9, 0x76C2, 0xE9DD, 0x76C3, 0xDBCD, + 0x76C6, 0xDDCE, 0x76C8, 0xE7C3, 0x76CA, 0xECCC, 0x76D2, 0xF9EC, 0x76D6, 0xCBCC, 0x76DB, 0xE0FC, 0x76DC, 0xD4A8, 0x76DE, 0xEDD3, + 0x76DF, 0xD8EF, 0x76E1, 0xF2D7, 0x76E3, 0xCAF8, 0x76E4, 0xDAEF, 0x76E7, 0xD6D4, 0x76EE, 0xD9CD, 0x76F2, 0xD8EE, 0x76F4, 0xF2C1, + 0x76F8, 0xDFD3, 0x76FC, 0xDAF0, 0x76FE, 0xE2EA, 0x7701, 0xE0FD, 0x7704, 0xD8F8, 0x7708, 0xF7AF, 0x7709, 0xDAB6, 0x770B, 0xCAD7, + 0x771E, 0xF2D8, 0x7720, 0xD8F9, 0x7729, 0xFADF, 0x7737, 0xCFEF, 0x7738, 0xD9C2, 0x773A, 0xF0D2, 0x773C, 0xE4D1, 0x7740, 0xF3B7, + 0x774D, 0xFAE0, 0x775B, 0xEFEC, 0x7761, 0xE2B2, 0x7763, 0xD4BD, 0x7766, 0xD9CE, 0x776B, 0xF4E2, 0x7779, 0xD4A9, 0x777E, 0xCDC2, + 0x777F, 0xE7DA, 0x778B, 0xF2D9, 0x7791, 0xD9AA, 0x779E, 0xD8BE, 0x77A5, 0xDCAD, 0x77AC, 0xE2EB, 0x77AD, 0xD6FC, 0x77B0, 0xCAF9, + 0x77B3, 0xD4DA, 0x77BB, 0xF4D7, 0x77BC, 0xCCA1, 0x77BF, 0xCFBA, 0x77D7, 0xF5B8, 0x77DB, 0xD9C3, 0x77DC, 0xD0E8, 0x77E2, 0xE3C5, + 0x77E3, 0xEBF8, 0x77E5, 0xF2B1, 0x77E9, 0xCFBB, 0x77ED, 0xD3AD, 0x77EE, 0xE8E1, 0x77EF, 0xCEEC, 0x77F3, 0xE0B4, 0x7802, 0xDEE3, + 0x7812, 0xDDF7, 0x7825, 0xF2B2, 0x7826, 0xF3F6, 0x7827, 0xF6DB, 0x782C, 0xD7FE, 0x7832, 0xF8DF, 0x7834, 0xF7F2, 0x7845, 0xD0A9, + 0x784F, 0xE6DA, 0x785D, 0xF5A6, 0x786B, 0xD7BC, 0x786C, 0xCCE3, 0x786F, 0xE6DB, 0x787C, 0xDDDD, 0x7881, 0xD1B3, 0x7887, 0xEFED, + 0x788C, 0xD6DE, 0x788D, 0xE4F4, 0x788E, 0xE1EF, 0x7891, 0xDDF8, 0x7897, 0xE8CF, 0x78A3, 0xCAE5, 0x78A7, 0xDCA1, 0x78A9, 0xE0B5, + 0x78BA, 0xFCAC, 0x78BB, 0xFCAD, 0x78BC, 0xD8A7, 0x78C1, 0xEDB8, 0x78C5, 0xDBB6, 0x78CA, 0xD6F0, 0x78CB, 0xF3AF, 0x78CE, 0xCDA5, + 0x78D0, 0xDAF1, 0x78E8, 0xD8A8, 0x78EC, 0xCCE4, 0x78EF, 0xD1B4, 0x78F5, 0xCAD8, 0x78FB, 0xDAF2, 0x7901, 0xF5A7, 0x790E, 0xF5A8, + 0x7916, 0xE6A6, 0x792A, 0xD5EC, 0x792B, 0xD5F8, 0x792C, 0xDAF3, 0x793A, 0xE3C6, 0x793E, 0xDEE4, 0x7940, 0xDEE5, 0x7941, 0xD1B5, + 0x7947, 0xD1B6, 0x7948, 0xD1B7, 0x7949, 0xF2B3, 0x7950, 0xE9DE, 0x7956, 0xF0D3, 0x7957, 0xF2B4, 0x795A, 0xF0D4, 0x795B, 0xCBE4, + 0x795C, 0xFBD4, 0x795D, 0xF5E6, 0x795E, 0xE3EA, 0x7960, 0xDEE6, 0x7965, 0xDFD4, 0x7968, 0xF8F9, 0x796D, 0xF0AE, 0x797A, 0xD1B8, + 0x797F, 0xD6DF, 0x7981, 0xD0D7, 0x798D, 0xFCA1, 0x798E, 0xEFEE, 0x798F, 0xDCD8, 0x7991, 0xE9DF, 0x79A6, 0xE5DD, 0x79A7, 0xFDFB, + 0x79AA, 0xE0C9, 0x79AE, 0xD6C9, 0x79B1, 0xD4AA, 0x79B3, 0xE5CC, 0x79B9, 0xE9E0, 0x79BD, 0xD0D8, 0x79BE, 0xFCA2, 0x79BF, 0xD4BE, + 0x79C0, 0xE2B3, 0x79C1, 0xDEE7, 0x79C9, 0xDCBC, 0x79CA, 0xD2B6, 0x79CB, 0xF5D5, 0x79D1, 0xCEA1, 0x79D2, 0xF5A9, 0x79D5, 0xDDF9, + 0x79D8, 0xDDFA, 0x79DF, 0xF0D5, 0x79E4, 0xF6DF, 0x79E6, 0xF2DA, 0x79E7, 0xE4EB, 0x79E9, 0xF2F1, 0x79FB, 0xECB9, 0x7A00, 0xFDFC, + 0x7A05, 0xE1AA, 0x7A08, 0xCAD9, 0x7A0B, 0xEFEF, 0x7A0D, 0xF5AA, 0x7A14, 0xECF9, 0x7A17, 0xF8AD, 0x7A19, 0xF2C2, 0x7A1A, 0xF6C3, + 0x7A1C, 0xD7D2, 0x7A1F, 0xF9A2, 0x7A20, 0xF0D6, 0x7A2E, 0xF0FA, 0x7A31, 0xF6E0, 0x7A36, 0xE9F3, 0x7A37, 0xF2C3, 0x7A3B, 0xD4AB, + 0x7A3C, 0xCAB3, 0x7A3D, 0xCDA6, 0x7A3F, 0xCDC3, 0x7A40, 0xCDDA, 0x7A46, 0xD9CF, 0x7A49, 0xF6C4, 0x7A4D, 0xEEDD, 0x7A4E, 0xE7C4, + 0x7A57, 0xE2B4, 0x7A61, 0xDFE2, 0x7A62, 0xE7DB, 0x7A69, 0xE8B1, 0x7A6B, 0xFCAE, 0x7A70, 0xE5CD, 0x7A74, 0xFAEB, 0x7A76, 0xCFBC, + 0x7A79, 0xCFE2, 0x7A7A, 0xCDF6, 0x7A7D, 0xEFF0, 0x7A7F, 0xF4BE, 0x7A81, 0xD4CD, 0x7A84, 0xF3B8, 0x7A88, 0xE9A1, 0x7A92, 0xF2F2, + 0x7A93, 0xF3EB, 0x7A95, 0xF0D7, 0x7A98, 0xCFD7, 0x7A9F, 0xCFDF, 0x7AA9, 0xE8C0, 0x7AAA, 0xE8C1, 0x7AAE, 0xCFE3, 0x7AAF, 0xE9A2, + 0x7ABA, 0xD0AA, 0x7AC4, 0xF3C1, 0x7AC5, 0xD0AB, 0x7AC7, 0xD4E4, 0x7ACA, 0xEFBC, 0x7ACB, 0xD8A1, 0x7AD7, 0xD9DF, 0x7AD9, 0xF3D7, + 0x7ADD, 0xDCBD, 0x7ADF, 0xCCE5, 0x7AE0, 0xEDF1, 0x7AE3, 0xF1E2, 0x7AE5, 0xD4DB, 0x7AEA, 0xE2B5, 0x7AED, 0xCAE6, 0x7AEF, 0xD3AE, + 0x7AF6, 0xCCE6, 0x7AF9, 0xF1D3, 0x7AFA, 0xF5E7, 0x7AFF, 0xCADA, 0x7B0F, 0xFBEE, 0x7B11, 0xE1C5, 0x7B19, 0xDFE9, 0x7B1B, 0xEEDE, + 0x7B1E, 0xF7C2, 0x7B20, 0xD8A2, 0x7B26, 0xDDAC, 0x7B2C, 0xF0AF, 0x7B2D, 0xD6BD, 0x7B39, 0xE1AB, 0x7B46, 0xF9B6, 0x7B49, 0xD4F5, + 0x7B4B, 0xD0C9, 0x7B4C, 0xEFA7, 0x7B4D, 0xE2EC, 0x7B4F, 0xDBEA, 0x7B50, 0xCECC, 0x7B51, 0xF5E8, 0x7B52, 0xF7D5, 0x7B54, 0xD3CD, + 0x7B56, 0xF3FE, 0x7B60, 0xD0B5, 0x7B6C, 0xE0FE, 0x7B6E, 0xDFFB, 0x7B75, 0xE6DD, 0x7B7D, 0xE8A4, 0x7B87, 0xCBCD, 0x7B8B, 0xEFA8, + 0x7B8F, 0xEEB4, 0x7B94, 0xDAD8, 0x7B95, 0xD1B9, 0x7B97, 0xDFA9, 0x7B9A, 0xF3B0, 0x7B9D, 0xCCC4, 0x7BA1, 0xCEB7, 0x7BAD, 0xEFA9, + 0x7BB1, 0xDFD5, 0x7BB4, 0xEDD7, 0x7BB8, 0xEEC6, 0x7BC0, 0xEFBD, 0x7BC1, 0xFCD6, 0x7BC4, 0xDBF4, 0x7BC6, 0xEFAA, 0x7BC7, 0xF8B9, + 0x7BC9, 0xF5E9, 0x7BD2, 0xE3D9, 0x7BE0, 0xE1C6, 0x7BE4, 0xD4BF, 0x7BE9, 0xDEE8, 0x7C07, 0xF0EA, 0x7C12, 0xF3C2, 0x7C1E, 0xD3AF, + 0x7C21, 0xCADB, 0x7C27, 0xFCD7, 0x7C2A, 0xEDD8, 0x7C2B, 0xE1C7, 0x7C3D, 0xF4D8, 0x7C3E, 0xD6B3, 0x7C3F, 0xDDAD, 0x7C43, 0xD5BE, + 0x7C4C, 0xF1C3, 0x7C4D, 0xEEDF, 0x7C60, 0xD6EB, 0x7C64, 0xF4D9, 0x7C6C, 0xD7E6, 0x7C73, 0xDAB7, 0x7C83, 0xDDFB, 0x7C89, 0xDDCF, + 0x7C92, 0xD8A3, 0x7C95, 0xDAD9, 0x7C97, 0xF0D8, 0x7C98, 0xEFC4, 0x7C9F, 0xE1D8, 0x7CA5, 0xF1D4, 0x7CA7, 0xEDF2, 0x7CAE, 0xD5DB, + 0x7CB1, 0xD5DC, 0x7CB2, 0xF3C4, 0x7CB3, 0xCBD7, 0x7CB9, 0xE2B6, 0x7CBE, 0xEFF1, 0x7CCA, 0xFBD5, 0x7CD6, 0xD3D8, 0x7CDE, 0xDDD0, + 0x7CDF, 0xF0D9, 0x7CE0, 0xCBB3, 0x7CE7, 0xD5DD, 0x7CFB, 0xCDA7, 0x7CFE, 0xD0AC, 0x7D00, 0xD1BA, 0x7D02, 0xF1C4, 0x7D04, 0xE5B3, + 0x7D05, 0xFBF5, 0x7D06, 0xE9E1, 0x7D07, 0xFDE0, 0x7D08, 0xFCBC, 0x7D0A, 0xDAA2, 0x7D0B, 0xDAA3, 0x7D0D, 0xD2A1, 0x7D10, 0xD2EF, + 0x7D14, 0xE2ED, 0x7D17, 0xDEE9, 0x7D18, 0xCEDC, 0x7D19, 0xF2B5, 0x7D1A, 0xD0E4, 0x7D1B, 0xDDD1, 0x7D20, 0xE1C8, 0x7D21, 0xDBB7, + 0x7D22, 0xDFE3, 0x7D2B, 0xEDB9, 0x7D2C, 0xF1C5, 0x7D2E, 0xF3CF, 0x7D2F, 0xD7AB, 0x7D30, 0xE1AC, 0x7D33, 0xE3EB, 0x7D35, 0xEEC7, + 0x7D39, 0xE1C9, 0x7D3A, 0xCAFA, 0x7D42, 0xF0FB, 0x7D43, 0xFAE1, 0x7D44, 0xF0DA, 0x7D45, 0xCCE7, 0x7D46, 0xDAF4, 0x7D50, 0xCCBF, + 0x7D5E, 0xCEED, 0x7D61, 0xD5A9, 0x7D62, 0xFAE2, 0x7D66, 0xD0E5, 0x7D68, 0xEBD6, 0x7D6A, 0xECDF, 0x7D6E, 0xDFFC, 0x7D71, 0xF7D6, + 0x7D72, 0xDEEA, 0x7D73, 0xCBB4, 0x7D76, 0xEFBE, 0x7D79, 0xCCB5, 0x7D7F, 0xCFBD, 0x7D8E, 0xEFF2, 0x7D8F, 0xE2B7, 0x7D93, 0xCCE8, + 0x7D9C, 0xF0FC, 0x7DA0, 0xD6E0, 0x7DA2, 0xF1C6, 0x7DAC, 0xE2B8, 0x7DAD, 0xEBAB, 0x7DB1, 0xCBB5, 0x7DB2, 0xD8D1, 0x7DB4, 0xF4CE, + 0x7DB5, 0xF3F7, 0x7DB8, 0xD7C6, 0x7DBA, 0xD1BB, 0x7DBB, 0xF7AA, 0x7DBD, 0xEDCA, 0x7DBE, 0xD7D3, 0x7DBF, 0xD8FA, 0x7DC7, 0xF6C5, + 0x7DCA, 0xD1CC, 0x7DCB, 0xDDFC, 0x7DD6, 0xDFFD, 0x7DD8, 0xF9E5, 0x7DDA, 0xE0CA, 0x7DDD, 0xF2FD, 0x7DDE, 0xD3B0, 0x7DE0, 0xF4F3, + 0x7DE1, 0xDAC9, 0x7DE3, 0xE6DE, 0x7DE8, 0xF8BA, 0x7DE9, 0xE8D0, 0x7DEC, 0xD8FB, 0x7DEF, 0xEAD5, 0x7DF4, 0xD6A3, 0x7DFB, 0xF6C6, + 0x7E09, 0xF2DB, 0x7E0A, 0xE4FC, 0x7E15, 0xE8B2, 0x7E1B, 0xDADA, 0x7E1D, 0xF2DC, 0x7E1E, 0xFBD6, 0x7E1F, 0xE9B2, 0x7E21, 0xEEAD, + 0x7E23, 0xFAE3, 0x7E2B, 0xDCEE, 0x7E2E, 0xF5EA, 0x7E2F, 0xE6E0, 0x7E31, 0xF0FD, 0x7E37, 0xD7AC, 0x7E3D, 0xF5C5, 0x7E3E, 0xEEE0, + 0x7E41, 0xDBE5, 0x7E43, 0xDDDE, 0x7E46, 0xD9F0, 0x7E47, 0xE9A3, 0x7E52, 0xF1F9, 0x7E54, 0xF2C4, 0x7E55, 0xE0CB, 0x7E5E, 0xE9A4, + 0x7E61, 0xE2B9, 0x7E69, 0xE3B1, 0x7E6A, 0xFCEB, 0x7E6B, 0xCDA8, 0x7E6D, 0xCCB6, 0x7E70, 0xF0DB, 0x7E79, 0xE6BA, 0x7E7C, 0xCDA9, + 0x7E82, 0xF3C3, 0x7E8C, 0xE1D9, 0x7E8F, 0xEFAB, 0x7E93, 0xE7C5, 0x7E96, 0xE0E9, 0x7E98, 0xF3C5, 0x7E9B, 0xD4C0, 0x7E9C, 0xD5BF, + 0x7F36, 0xDDAE, 0x7F38, 0xF9FC, 0x7F3A, 0xCCC0, 0x7F4C, 0xE5A2, 0x7F50, 0xCEB8, 0x7F54, 0xD8D2, 0x7F55, 0xF9D6, 0x7F6A, 0xF1AA, + 0x7F6B, 0xCED1, 0x7F6E, 0xF6C7, 0x7F70, 0xDBEB, 0x7F72, 0xDFFE, 0x7F75, 0xD8E1, 0x7F77, 0xF7F3, 0x7F79, 0xD7E7, 0x7F85, 0xD4FE, + 0x7F88, 0xD1BC, 0x7F8A, 0xE5CF, 0x7F8C, 0xCBB6, 0x7F8E, 0xDAB8, 0x7F94, 0xCDC4, 0x7F9A, 0xD6BE, 0x7F9E, 0xE2BA, 0x7FA4, 0xCFD8, + 0x7FA8, 0xE0CC, 0x7FA9, 0xEBF9, 0x7FB2, 0xFDFD, 0x7FB8, 0xD7E8, 0x7FB9, 0xCBD8, 0x7FBD, 0xE9E2, 0x7FC1, 0xE8BA, 0x7FC5, 0xE3C7, + 0x7FCA, 0xECCD, 0x7FCC, 0xECCE, 0x7FCE, 0xD6BF, 0x7FD2, 0xE3A7, 0x7FD4, 0xDFD6, 0x7FD5, 0xFDE8, 0x7FDF, 0xEEE1, 0x7FE0, 0xF6A8, + 0x7FE1, 0xDDFD, 0x7FE9, 0xF8BB, 0x7FEB, 0xE8D1, 0x7FF0, 0xF9D7, 0x7FF9, 0xCEEE, 0x7FFC, 0xECCF, 0x8000, 0xE9A5, 0x8001, 0xD6D5, + 0x8003, 0xCDC5, 0x8005, 0xEDBA, 0x8006, 0xD1BD, 0x8009, 0xCFBE, 0x800C, 0xECBB, 0x8010, 0xD2B1, 0x8015, 0xCCE9, 0x8017, 0xD9C4, + 0x8018, 0xE9FC, 0x802D, 0xD1BE, 0x8033, 0xECBC, 0x8036, 0xE5AD, 0x803D, 0xF7B0, 0x803F, 0xCCEA, 0x8043, 0xD3C4, 0x8046, 0xD6C0, + 0x804A, 0xD6FD, 0x8056, 0xE1A1, 0x8058, 0xDEBD, 0x805A, 0xF6A9, 0x805E, 0xDAA4, 0x806F, 0xD6A4, 0x8070, 0xF5C6, 0x8072, 0xE1A2, + 0x8073, 0xE9C6, 0x8077, 0xF2C5, 0x807D, 0xF4E9, 0x807E, 0xD6EC, 0x807F, 0xEBD3, 0x8084, 0xECBD, 0x8085, 0xE2DC, 0x8086, 0xDEEB, + 0x8087, 0xF0DC, 0x8089, 0xEBBF, 0x808B, 0xD7CE, 0x808C, 0xD1BF, 0x8096, 0xF5AB, 0x809B, 0xF9FD, 0x809D, 0xCADC, 0x80A1, 0xCDC6, + 0x80A2, 0xF2B6, 0x80A5, 0xDDFE, 0x80A9, 0xCCB7, 0x80AA, 0xDBB8, 0x80AF, 0xD0E9, 0x80B1, 0xCEDD, 0x80B2, 0xEBC0, 0x80B4, 0xFDA2, + 0x80BA, 0xF8CB, 0x80C3, 0xEAD6, 0x80C4, 0xF1B0, 0x80CC, 0xDBCE, 0x80CE, 0xF7C3, 0x80DA, 0xDBCF, 0x80DB, 0xCBA4, 0x80DE, 0xF8E0, + 0x80E1, 0xFBD7, 0x80E4, 0xEBCA, 0x80E5, 0xE0A1, 0x80F1, 0xCECD, 0x80F4, 0xD4DC, 0x80F8, 0xFDD8, 0x80FD, 0xD2F6, 0x8102, 0xF2B7, + 0x8105, 0xFAF6, 0x8106, 0xF6AA, 0x8107, 0xFAF7, 0x8108, 0xD8E6, 0x810A, 0xF4B1, 0x8118, 0xE8D2, 0x811A, 0xCAC5, 0x811B, 0xCCEB, + 0x8123, 0xE2EE, 0x8129, 0xE2BB, 0x812B, 0xF7AD, 0x812F, 0xF8E1, 0x8139, 0xF3EC, 0x813E, 0xDEA1, 0x814B, 0xE4FD, 0x814E, 0xE3EC, + 0x8150, 0xDDAF, 0x8151, 0xDDB0, 0x8154, 0xCBB7, 0x8155, 0xE8D3, 0x8165, 0xE1A3, 0x8166, 0xD2E0, 0x816B, 0xF0FE, 0x8170, 0xE9A6, + 0x8171, 0xCBF2, 0x8178, 0xEDF3, 0x8179, 0xDCD9, 0x817A, 0xE0CD, 0x817F, 0xF7DA, 0x8180, 0xDBB9, 0x8188, 0xCCAE, 0x818A, 0xDADB, + 0x818F, 0xCDC7, 0x819A, 0xDDB1, 0x819C, 0xD8AF, 0x819D, 0xE3A3, 0x81A0, 0xCEEF, 0x81A3, 0xF2F3, 0x81A8, 0xF8B3, 0x81B3, 0xE0CE, + 0x81B5, 0xF5FD, 0x81BA, 0xEBEC, 0x81BD, 0xD3C5, 0x81BE, 0xFCEC, 0x81BF, 0xD2DB, 0x81C0, 0xD4EB, 0x81C2, 0xDEA2, 0x81C6, 0xE5E6, + 0x81CD, 0xF0B0, 0x81D8, 0xD5C4, 0x81DF, 0xEDF4, 0x81E3, 0xE3ED, 0x81E5, 0xE8C2, 0x81E7, 0xEDF5, 0x81E8, 0xD7FC, 0x81EA, 0xEDBB, + 0x81ED, 0xF6AB, 0x81F3, 0xF2B8, 0x81F4, 0xF6C8, 0x81FA, 0xD3E6, 0x81FB, 0xF2DD, 0x81FC, 0xCFBF, 0x81FE, 0xEBAC, 0x8205, 0xCFC0, + 0x8207, 0xE6A8, 0x8208, 0xFDE9, 0x820A, 0xCFC1, 0x820C, 0xE0DF, 0x820D, 0xDEEC, 0x8212, 0xE0A2, 0x821B, 0xF4BF, 0x821C, 0xE2EF, + 0x821E, 0xD9F1, 0x821F, 0xF1C7, 0x8221, 0xCBB8, 0x822A, 0xF9FE, 0x822B, 0xDBBA, 0x822C, 0xDAF5, 0x8235, 0xF6EC, 0x8236, 0xDADC, + 0x8237, 0xFAE4, 0x8239, 0xE0CF, 0x8240, 0xDDB2, 0x8245, 0xE6A9, 0x8247, 0xEFF3, 0x8259, 0xF3ED, 0x8264, 0xEBFA, 0x8266, 0xF9E6, + 0x826E, 0xCADD, 0x826F, 0xD5DE, 0x8271, 0xCADE, 0x8272, 0xDFE4, 0x8276, 0xE6FD, 0x8278, 0xF5AC, 0x827E, 0xE4F5, 0x828B, 0xE9E3, + 0x828D, 0xEDCB, 0x828E, 0xCFE4, 0x8292, 0xD8D3, 0x8299, 0xDDB3, 0x829A, 0xD4EC, 0x829D, 0xF2B9, 0x829F, 0xDFB7, 0x82A5, 0xCBCE, + 0x82A6, 0xFBD8, 0x82A9, 0xD0D9, 0x82AC, 0xDDD2, 0x82AD, 0xF7F4, 0x82AE, 0xE7DC, 0x82AF, 0xE4A5, 0x82B1, 0xFCA3, 0x82B3, 0xDBBB, + 0x82B7, 0xF2BA, 0x82B8, 0xE9FD, 0x82B9, 0xD0CA, 0x82BB, 0xF5D6, 0x82BC, 0xD9C5, 0x82BD, 0xE4B4, 0x82BF, 0xEDA7, 0x82D1, 0xEABD, + 0x82D2, 0xE6FE, 0x82D4, 0xF7C4, 0x82D5, 0xF5AD, 0x82D7, 0xD9E0, 0x82DB, 0xCAB4, 0x82DE, 0xF8E2, 0x82DF, 0xCFC2, 0x82E1, 0xECBE, + 0x82E5, 0xE5B4, 0x82E6, 0xCDC8, 0x82E7, 0xEEC8, 0x82F1, 0xE7C8, 0x82FD, 0xCDC9, 0x82FE, 0xF9B7, 0x8301, 0xF1E8, 0x8302, 0xD9F2, + 0x8303, 0xDBF5, 0x8304, 0xCAB5, 0x8305, 0xD9C6, 0x8309, 0xD8C9, 0x8317, 0xD9AB, 0x8328, 0xEDBC, 0x832B, 0xD8D4, 0x832F, 0xDCDA, + 0x8331, 0xE2BC, 0x8334, 0xFCED, 0x8335, 0xECE0, 0x8336, 0xD2FE, 0x8338, 0xE9C7, 0x8339, 0xE6AA, 0x8340, 0xE2F0, 0x8347, 0xFABB, + 0x8349, 0xF5AE, 0x834A, 0xFBAA, 0x834F, 0xECFB, 0x8351, 0xECBF, 0x8352, 0xFCD8, 0x8373, 0xD4E5, 0x8377, 0xF9C3, 0x837B, 0xEEE2, + 0x8389, 0xD7E9, 0x838A, 0xEDF6, 0x838E, 0xDEED, 0x8396, 0xCCEC, 0x8398, 0xE3EE, 0x839E, 0xE8D4, 0x83A2, 0xFAF8, 0x83A9, 0xDDB4, + 0x83AA, 0xE4B5, 0x83AB, 0xD8B0, 0x83BD, 0xD8D5, 0x83C1, 0xF4EA, 0x83C5, 0xCEB9, 0x83C9, 0xD6E1, 0x83CA, 0xCFD2, 0x83CC, 0xD0B6, + 0x83D3, 0xCEA2, 0x83D6, 0xF3EE, 0x83DC, 0xF3F8, 0x83E9, 0xDCCC, 0x83EB, 0xD0CB, 0x83EF, 0xFCA4, 0x83F0, 0xCDCA, 0x83F1, 0xD7D4, + 0x83F2, 0xDEA3, 0x83F4, 0xE4E0, 0x83F9, 0xEEC9, 0x83FD, 0xE2DD, 0x8403, 0xF5FE, 0x8404, 0xD4AC, 0x840A, 0xD5D1, 0x840C, 0xD8F0, + 0x840D, 0xF8C3, 0x840E, 0xEAD7, 0x8429, 0xF5D7, 0x842C, 0xD8BF, 0x8431, 0xFDC0, 0x8438, 0xEBAD, 0x843D, 0xD5AA, 0x8449, 0xE7A8, + 0x8457, 0xEECA, 0x845B, 0xCAE7, 0x8461, 0xF8E3, 0x8463, 0xD4DD, 0x8466, 0xEAD8, 0x846B, 0xFBD9, 0x846C, 0xEDF7, 0x846F, 0xE5B5, + 0x8475, 0xD0AD, 0x847A, 0xF1F1, 0x8490, 0xE2BD, 0x8494, 0xE3C8, 0x8499, 0xD9D5, 0x849C, 0xDFAA, 0x84A1, 0xDBBC, 0x84B2, 0xF8E4, + 0x84B8, 0xF1FA, 0x84BB, 0xE5B6, 0x84BC, 0xF3EF, 0x84BF, 0xFBDA, 0x84C0, 0xE1E0, 0x84C2, 0xD9AC, 0x84C4, 0xF5EB, 0x84C6, 0xE0B6, + 0x84C9, 0xE9C8, 0x84CB, 0xCBCF, 0x84CD, 0xE3C9, 0x84D1, 0xDEEE, 0x84DA, 0xE2BE, 0x84EC, 0xDCEF, 0x84EE, 0xD6A5, 0x84F4, 0xE2F1, + 0x84FC, 0xD6FE, 0x8511, 0xD9A1, 0x8513, 0xD8C0, 0x8514, 0xDCDB, 0x8517, 0xEDBD, 0x8518, 0xDFB8, 0x851A, 0xEAA5, 0x851E, 0xD7AD, + 0x8521, 0xF3F9, 0x8523, 0xEDF8, 0x8525, 0xF5C7, 0x852C, 0xE1CA, 0x852D, 0xEBE3, 0x852F, 0xF2DE, 0x853D, 0xF8CC, 0x853F, 0xEAD9, + 0x8541, 0xD3C6, 0x8543, 0xDBE6, 0x8549, 0xF5AF, 0x854E, 0xCEF0, 0x8553, 0xE9FE, 0x8559, 0xFBB6, 0x8563, 0xE2F2, 0x8568, 0xCFF2, + 0x8569, 0xF7B9, 0x856A, 0xD9F3, 0x856D, 0xE1CB, 0x8584, 0xDADD, 0x8587, 0xDAB9, 0x858F, 0xEBFB, 0x8591, 0xCBB9, 0x8594, 0xEDF9, + 0x859B, 0xE0E0, 0x85A6, 0xF4C0, 0x85A8, 0xFDBC, 0x85A9, 0xDFB1, 0x85AA, 0xE3EF, 0x85AF, 0xE0A3, 0x85B0, 0xFDB9, 0x85BA, 0xF0B1, + 0x85C1, 0xCDCB, 0x85C9, 0xEDBE, 0x85CD, 0xD5C0, 0x85CE, 0xE3F0, 0x85CF, 0xEDFA, 0x85D5, 0xE9E4, 0x85DC, 0xD5ED, 0x85DD, 0xE7DD, + 0x85E4, 0xD4F6, 0x85E5, 0xE5B7, 0x85E9, 0xDBE7, 0x85EA, 0xE2BF, 0x85F7, 0xEECB, 0x85FA, 0xD7F4, 0x85FB, 0xF0DD, 0x85FF, 0xCEAB, + 0x8602, 0xE7DE, 0x8606, 0xD6D6, 0x8607, 0xE1CC, 0x860A, 0xE8B3, 0x8616, 0xE5EE, 0x8617, 0xDCA2, 0x861A, 0xE0D0, 0x862D, 0xD5B5, + 0x863F, 0xD5A1, 0x864E, 0xFBDB, 0x8650, 0xF9CB, 0x8654, 0xCBF3, 0x8655, 0xF4A5, 0x865B, 0xFAC8, 0x865C, 0xD6D7, 0x865E, 0xE9E5, + 0x865F, 0xFBDC, 0x8667, 0xFDD0, 0x8679, 0xFBF6, 0x868A, 0xDAA5, 0x868C, 0xDBBD, 0x8693, 0xECE2, 0x86A3, 0xCDF7, 0x86A4, 0xF0DE, + 0x86A9, 0xF6C9, 0x86C7, 0xDEEF, 0x86CB, 0xD3B1, 0x86D4, 0xFCEE, 0x86D9, 0xE8C3, 0x86DB, 0xF1C8, 0x86DF, 0xCEF1, 0x86E4, 0xF9ED, + 0x86ED, 0xF2F4, 0x86FE, 0xE4B6, 0x8700, 0xF5B9, 0x8702, 0xDCF0, 0x8703, 0xE3F1, 0x8708, 0xE8A5, 0x8718, 0xF2BB, 0x871A, 0xDEA4, + 0x871C, 0xDACC, 0x874E, 0xCAE9, 0x8755, 0xE3DA, 0x8757, 0xFCD9, 0x875F, 0xEADA, 0x8766, 0xF9C4, 0x8768, 0xE3A4, 0x8774, 0xFBDD, + 0x8776, 0xEFCA, 0x8778, 0xE8C4, 0x8782, 0xD5CC, 0x878D, 0xEBD7, 0x879F, 0xD9AD, 0x87A2, 0xFBAB, 0x87B3, 0xD3D9, 0x87BA, 0xD5A2, + 0x87C4, 0xF6DE, 0x87E0, 0xDAF6, 0x87EC, 0xE0D1, 0x87EF, 0xE9A8, 0x87F2, 0xF5F9, 0x87F9, 0xFAAF, 0x87FB, 0xEBFC, 0x87FE, 0xE0EA, + 0x8805, 0xE3B2, 0x881F, 0xD5C5, 0x8822, 0xF1E3, 0x8823, 0xD5EE, 0x8831, 0xCDCC, 0x8836, 0xEDD9, 0x883B, 0xD8C1, 0x8840, 0xFAEC, + 0x8846, 0xF1EB, 0x884C, 0xFABC, 0x884D, 0xE6E2, 0x8852, 0xFAE5, 0x8853, 0xE2FA, 0x8857, 0xCAB6, 0x8859, 0xE4B7, 0x885B, 0xEADB, + 0x885D, 0xF5FA, 0x8861, 0xFBAC, 0x8862, 0xCFC3, 0x8863, 0xEBFD, 0x8868, 0xF8FA, 0x886B, 0xDFB9, 0x8870, 0xE1F1, 0x8872, 0xD2A4, + 0x8877, 0xF5FB, 0x887E, 0xD0DA, 0x887F, 0xD0DB, 0x8881, 0xEABE, 0x8882, 0xD9B1, 0x8888, 0xCAB7, 0x888B, 0xD3E7, 0x888D, 0xF8E5, + 0x8892, 0xD3B2, 0x8896, 0xE2C0, 0x8897, 0xF2DF, 0x889E, 0xCDE5, 0x88AB, 0xF9AC, 0x88B4, 0xCDCD, 0x88C1, 0xEEAE, 0x88C2, 0xD6AE, + 0x88CF, 0xD7EA, 0x88D4, 0xE7E0, 0x88D5, 0xEBAE, 0x88D9, 0xCFD9, 0x88DC, 0xDCCD, 0x88DD, 0xEDFB, 0x88DF, 0xDEF0, 0x88E1, 0xD7EB, + 0x88E8, 0xDEA5, 0x88F3, 0xDFD7, 0x88F4, 0xDBD0, 0x88F5, 0xDBD1, 0x88F8, 0xD5A3, 0x88FD, 0xF0B2, 0x8907, 0xDCDC, 0x8910, 0xCAE8, + 0x8912, 0xF8E6, 0x8913, 0xDCCE, 0x8918, 0xEADC, 0x8919, 0xDBD2, 0x8925, 0xE9B3, 0x892A, 0xF7DB, 0x8936, 0xE3A8, 0x8938, 0xD7AE, + 0x893B, 0xE0E1, 0x8941, 0xCBBA, 0x8944, 0xE5D1, 0x895F, 0xD0DC, 0x8964, 0xD5C1, 0x896A, 0xD8CA, 0x8972, 0xE3A9, 0x897F, 0xE0A4, + 0x8981, 0xE9A9, 0x8983, 0xD3C7, 0x8986, 0xDCDD, 0x8987, 0xF8AE, 0x898B, 0xCCB8, 0x898F, 0xD0AE, 0x8993, 0xD8F2, 0x8996, 0xE3CA, + 0x89A1, 0xCCAF, 0x89A9, 0xD4AD, 0x89AA, 0xF6D1, 0x89B2, 0xD0CC, 0x89BA, 0xCAC6, 0x89BD, 0xD5C2, 0x89C0, 0xCEBA, 0x89D2, 0xCAC7, + 0x89E3, 0xFAB0, 0x89F4, 0xDFD8, 0x89F8, 0xF5BA, 0x8A00, 0xE5EB, 0x8A02, 0xEFF4, 0x8A03, 0xDDB5, 0x8A08, 0xCDAA, 0x8A0A, 0xE3F2, + 0x8A0C, 0xFBF7, 0x8A0E, 0xF7D0, 0x8A13, 0xFDBA, 0x8A16, 0xFDE1, 0x8A17, 0xF6FE, 0x8A18, 0xD1C0, 0x8A1B, 0xE8C5, 0x8A1D, 0xE4B8, + 0x8A1F, 0xE1E8, 0x8A23, 0xCCC1, 0x8A25, 0xD2ED, 0x8A2A, 0xDBBE, 0x8A2D, 0xE0E2, 0x8A31, 0xFAC9, 0x8A34, 0xE1CD, 0x8A36, 0xCAB8, + 0x8A3A, 0xF2E0, 0x8A3B, 0xF1C9, 0x8A50, 0xDEF1, 0x8A54, 0xF0DF, 0x8A55, 0xF8C4, 0x8A5B, 0xEECC, 0x8A5E, 0xDEF2, 0x8A60, 0xE7C9, + 0x8A62, 0xE2F3, 0x8A63, 0xE7E1, 0x8A66, 0xE3CB, 0x8A69, 0xE3CC, 0x8A6D, 0xCFF8, 0x8A6E, 0xEFAC, 0x8A70, 0xFDFE, 0x8A71, 0xFCA5, + 0x8A72, 0xFAB1, 0x8A73, 0xDFD9, 0x8A75, 0xE0D2, 0x8A79, 0xF4DA, 0x8A85, 0xF1CA, 0x8A87, 0xCEA3, 0x8A8C, 0xF2BC, 0x8A8D, 0xECE3, + 0x8A93, 0xE0A5, 0x8A95, 0xF7AB, 0x8A98, 0xEBAF, 0x8A9E, 0xE5DE, 0x8AA0, 0xE1A4, 0x8AA1, 0xCDAB, 0x8AA3, 0xD9F4, 0x8AA4, 0xE8A6, + 0x8AA5, 0xCDCE, 0x8AA6, 0xE1E9, 0x8AA8, 0xFCEF, 0x8AAA, 0xE0E3, 0x8AB0, 0xE2C1, 0x8AB2, 0xCEA4, 0x8AB9, 0xDEA6, 0x8ABC, 0xEBFE, + 0x8ABE, 0xEBDD, 0x8ABF, 0xF0E0, 0x8AC2, 0xF4DB, 0x8AC4, 0xE2F4, 0x8AC7, 0xD3C8, 0x8ACB, 0xF4EB, 0x8ACD, 0xEEB5, 0x8ACF, 0xF5D8, + 0x8AD2, 0xD5DF, 0x8AD6, 0xD6E5, 0x8ADB, 0xEBB0, 0x8ADC, 0xF4E3, 0x8AE1, 0xE3CD, 0x8AE6, 0xF4F4, 0x8AE7, 0xFAB2, 0x8AEA, 0xEFF5, + 0x8AEB, 0xCADF, 0x8AED, 0xEBB1, 0x8AEE, 0xEDBF, 0x8AF1, 0xFDC9, 0x8AF6, 0xE4A6, 0x8AF7, 0xF9A4, 0x8AF8, 0xF0B3, 0x8AFA, 0xE5EC, + 0x8AFE, 0xD1E7, 0x8B00, 0xD9C7, 0x8B01, 0xE4D7, 0x8B02, 0xEADD, 0x8B04, 0xD4F7, 0x8B0E, 0xDABA, 0x8B10, 0xDACD, 0x8B14, 0xF9CC, + 0x8B16, 0xE1DA, 0x8B17, 0xDBBF, 0x8B19, 0xCCC5, 0x8B1A, 0xECD0, 0x8B1B, 0xCBBB, 0x8B1D, 0xDEF3, 0x8B20, 0xE9AA, 0x8B28, 0xD9C8, + 0x8B2B, 0xEEE3, 0x8B2C, 0xD7BD, 0x8B33, 0xCFC4, 0x8B39, 0xD0CD, 0x8B41, 0xFCA6, 0x8B49, 0xF1FB, 0x8B4E, 0xFDD2, 0x8B4F, 0xD1C1, + 0x8B58, 0xE3DB, 0x8B5A, 0xD3C9, 0x8B5C, 0xDCCF, 0x8B66, 0xCCED, 0x8B6C, 0xDEA7, 0x8B6F, 0xE6BB, 0x8B70, 0xECA1, 0x8B74, 0xCCB9, + 0x8B77, 0xFBDE, 0x8B7D, 0xE7E2, 0x8B80, 0xD4C1, 0x8B8A, 0xDCA8, 0x8B90, 0xE2C2, 0x8B92, 0xF3D8, 0x8B93, 0xE5D3, 0x8B96, 0xF3D9, + 0x8B9A, 0xF3C6, 0x8C37, 0xCDDB, 0x8C3F, 0xCDAC, 0x8C41, 0xFCC3, 0x8C46, 0xD4E7, 0x8C48, 0xD1C2, 0x8C4A, 0xF9A5, 0x8C4C, 0xE8D5, + 0x8C55, 0xE3CE, 0x8C5A, 0xD4CA, 0x8C61, 0xDFDA, 0x8C6A, 0xFBDF, 0x8C6B, 0xE7E3, 0x8C79, 0xF8FB, 0x8C7A, 0xE3CF, 0x8C82, 0xF5B0, + 0x8C8A, 0xD8E7, 0x8C8C, 0xD9C9, 0x8C9D, 0xF8AF, 0x8C9E, 0xEFF6, 0x8CA0, 0xDDB6, 0x8CA1, 0xEEAF, 0x8CA2, 0xCDF8, 0x8CA7, 0xDEB8, + 0x8CA8, 0xFCA7, 0x8CA9, 0xF7FC, 0x8CAA, 0xF7B1, 0x8CAB, 0xCEBB, 0x8CAC, 0xF4A1, 0x8CAF, 0xEECD, 0x8CB0, 0xE1AE, 0x8CB3, 0xECC3, + 0x8CB4, 0xCFFE, 0x8CB6, 0xF8BF, 0x8CB7, 0xD8E2, 0x8CB8, 0xD3E8, 0x8CBB, 0xDEA8, 0x8CBC, 0xF4E4, 0x8CBD, 0xECC2, 0x8CBF, 0xD9F5, + 0x8CC0, 0xF9C5, 0x8CC1, 0xDDD3, 0x8CC2, 0xD6F1, 0x8CC3, 0xECFC, 0x8CC4, 0xFCF0, 0x8CC7, 0xEDC0, 0x8CC8, 0xCAB9, 0x8CCA, 0xEEE4, + 0x8CD1, 0xF2E1, 0x8CD3, 0xDEB9, 0x8CDA, 0xD6F2, 0x8CDC, 0xDEF4, 0x8CDE, 0xDFDB, 0x8CE0, 0xDBD3, 0x8CE2, 0xFAE7, 0x8CE3, 0xD8E3, + 0x8CE4, 0xF4C1, 0x8CE6, 0xDDB7, 0x8CEA, 0xF2F5, 0x8CED, 0xD4AE, 0x8CF4, 0xD6F3, 0x8CFB, 0xDDB8, 0x8CFC, 0xCFC5, 0x8CFD, 0xDFDF, + 0x8D04, 0xF2BE, 0x8D05, 0xF6A1, 0x8D07, 0xEBCB, 0x8D08, 0xF1FC, 0x8D0A, 0xF3C7, 0x8D0D, 0xE0EB, 0x8D13, 0xEDFC, 0x8D16, 0xE1DB, + 0x8D64, 0xEEE5, 0x8D66, 0xDEF5, 0x8D6B, 0xFAD3, 0x8D70, 0xF1CB, 0x8D73, 0xD0AF, 0x8D74, 0xDDB9, 0x8D77, 0xD1C3, 0x8D85, 0xF5B1, + 0x8D8A, 0xEAC6, 0x8D99, 0xF0E1, 0x8DA3, 0xF6AC, 0x8DA8, 0xF5D9, 0x8DB3, 0xF0EB, 0x8DBA, 0xDDBA, 0x8DBE, 0xF2BF, 0x8DC6, 0xF7C5, + 0x8DCB, 0xDBA2, 0x8DCC, 0xF2F6, 0x8DCF, 0xCABA, 0x8DDB, 0xF7F5, 0x8DDD, 0xCBE5, 0x8DE1, 0xEEE6, 0x8DE3, 0xE0D3, 0x8DE8, 0xCEA5, + 0x8DEF, 0xD6D8, 0x8DF3, 0xD4AF, 0x8E0A, 0xE9C9, 0x8E0F, 0xD3CE, 0x8E10, 0xF4C2, 0x8E1E, 0xCBE6, 0x8E2A, 0xF1A1, 0x8E30, 0xEBB2, + 0x8E35, 0xF1A2, 0x8E42, 0xEBB3, 0x8E44, 0xF0B4, 0x8E47, 0xCBF4, 0x8E48, 0xD4B0, 0x8E49, 0xF3B2, 0x8E4A, 0xFBB7, 0x8E59, 0xF5EC, + 0x8E5F, 0xEEE7, 0x8E60, 0xF4B2, 0x8E74, 0xF5ED, 0x8E76, 0xCFF3, 0x8E81, 0xF0E2, 0x8E87, 0xEECE, 0x8E8A, 0xF1CC, 0x8E8D, 0xE5B8, + 0x8EAA, 0xD7F5, 0x8EAB, 0xE3F3, 0x8EAC, 0xCFE5, 0x8EC0, 0xCFC6, 0x8ECA, 0xF3B3, 0x8ECB, 0xE4D8, 0x8ECC, 0xCFF9, 0x8ECD, 0xCFDA, + 0x8ED2, 0xFACD, 0x8EDF, 0xE6E3, 0x8EEB, 0xF2E2, 0x8EF8, 0xF5EE, 0x8EFB, 0xCABB, 0x8EFE, 0xE3DC, 0x8F03, 0xCEF2, 0x8F05, 0xD6D9, + 0x8F09, 0xEEB0, 0x8F12, 0xF4E5, 0x8F13, 0xD8C2, 0x8F14, 0xDCD0, 0x8F15, 0xCCEE, 0x8F1B, 0xD5E0, 0x8F1C, 0xF6CA, 0x8F1D, 0xFDCA, + 0x8F1E, 0xD8D6, 0x8F1F, 0xF4CF, 0x8F26, 0xD6A6, 0x8F27, 0xDCBE, 0x8F29, 0xDBD4, 0x8F2A, 0xD7C7, 0x8F2F, 0xF2FE, 0x8F33, 0xF1CD, + 0x8F38, 0xE2C3, 0x8F39, 0xDCDE, 0x8F3B, 0xDCDF, 0x8F3E, 0xEFAD, 0x8F3F, 0xE6AB, 0x8F44, 0xF9DD, 0x8F45, 0xEABF, 0x8F49, 0xEFAE, + 0x8F4D, 0xF4D0, 0x8F4E, 0xCEF3, 0x8F5D, 0xE6AC, 0x8F5F, 0xCEDE, 0x8F62, 0xD5F9, 0x8F9B, 0xE3F4, 0x8F9C, 0xCDD0, 0x8FA3, 0xD5B8, + 0x8FA6, 0xF7FD, 0x8FA8, 0xDCA9, 0x8FAD, 0xDEF6, 0x8FAF, 0xDCAA, 0x8FB0, 0xF2E3, 0x8FB1, 0xE9B4, 0x8FB2, 0xD2DC, 0x8FC2, 0xE9E6, + 0x8FC5, 0xE3F6, 0x8FCE, 0xE7CA, 0x8FD1, 0xD0CE, 0x8FD4, 0xDAF7, 0x8FE6, 0xCABC, 0x8FEA, 0xEEE8, 0x8FEB, 0xDADE, 0x8FED, 0xF2F7, + 0x8FF0, 0xE2FB, 0x8FF2, 0xCCA6, 0x8FF7, 0xDABB, 0x8FF9, 0xEEE9, 0x8FFD, 0xF5DA, 0x9000, 0xF7DC, 0x9001, 0xE1EA, 0x9002, 0xCEC1, + 0x9003, 0xD4B1, 0x9005, 0xFDB1, 0x9006, 0xE6BD, 0x9008, 0xFBAD, 0x900B, 0xF8E7, 0x900D, 0xE1CE, 0x900F, 0xF7E2, 0x9010, 0xF5EF, + 0x9011, 0xCFC7, 0x9014, 0xD4B2, 0x9015, 0xCCEF, 0x9017, 0xD4E8, 0x9019, 0xEECF, 0x901A, 0xF7D7, 0x901D, 0xE0A6, 0x901E, 0xD6C1, + 0x901F, 0xE1DC, 0x9020, 0xF0E3, 0x9021, 0xF1E4, 0x9022, 0xDCF1, 0x9023, 0xD6A7, 0x902E, 0xF4F5, 0x9031, 0xF1CE, 0x9032, 0xF2E4, + 0x9035, 0xD0B0, 0x9038, 0xECEF, 0x903C, 0xF9BA, 0x903E, 0xEBB5, 0x9041, 0xD4ED, 0x9042, 0xE2C4, 0x9047, 0xE9E7, 0x904A, 0xEBB4, + 0x904B, 0xEAA1, 0x904D, 0xF8BC, 0x904E, 0xCEA6, 0x9050, 0xF9C6, 0x9051, 0xFCDA, 0x9053, 0xD4B3, 0x9054, 0xD3B9, 0x9055, 0xEADE, + 0x9059, 0xE9AB, 0x905C, 0xE1E1, 0x905D, 0xD3CF, 0x905E, 0xF4F6, 0x9060, 0xEAC0, 0x9061, 0xE1CF, 0x9063, 0xCCBA, 0x9069, 0xEEEA, + 0x906D, 0xF0E4, 0x906E, 0xF3B4, 0x906F, 0xD4EE, 0x9072, 0xF2C0, 0x9075, 0xF1E5, 0x9077, 0xF4C3, 0x9078, 0xE0D4, 0x907A, 0xEBB6, + 0x907C, 0xD7A1, 0x907D, 0xCBE8, 0x907F, 0xF9AD, 0x9080, 0xE9AD, 0x9081, 0xD8E4, 0x9082, 0xFAB3, 0x9083, 0xE2C5, 0x9084, 0xFCBD, + 0x9087, 0xECC4, 0x9088, 0xD8B1, 0x908A, 0xDCAB, 0x908F, 0xD5A4, 0x9091, 0xEBE9, 0x9095, 0xE8BB, 0x9099, 0xD8D7, 0x90A2, 0xFBAE, + 0x90A3, 0xD1E1, 0x90A6, 0xDBC0, 0x90A8, 0xF5BE, 0x90AA, 0xDEF7, 0x90AF, 0xCAFB, 0x90B0, 0xF7C6, 0x90B1, 0xCFC8, 0x90B5, 0xE1D0, + 0x90B8, 0xEED0, 0x90C1, 0xE9F4, 0x90CA, 0xCEF4, 0x90DE, 0xD5CD, 0x90E1, 0xCFDB, 0x90E8, 0xDDBB, 0x90ED, 0xCEAC, 0x90F5, 0xE9E8, + 0x90FD, 0xD4B4, 0x9102, 0xE4C7, 0x9112, 0xF5DB, 0x9115, 0xFAC1, 0x9119, 0xDEA9, 0x9127, 0xD4F8, 0x912D, 0xEFF7, 0x9132, 0xD3B3, + 0x9149, 0xEBB7, 0x914A, 0xEFF8, 0x914B, 0xF5DC, 0x914C, 0xEDCC, 0x914D, 0xDBD5, 0x914E, 0xF1CF, 0x9152, 0xF1D0, 0x9162, 0xF5B2, + 0x9169, 0xD9AE, 0x916A, 0xD5AC, 0x916C, 0xE2C6, 0x9175, 0xFDA3, 0x9177, 0xFBE5, 0x9178, 0xDFAB, 0x9187, 0xE2F5, 0x9189, 0xF6AD, + 0x918B, 0xF5B3, 0x918D, 0xF0B5, 0x9192, 0xE1A5, 0x919C, 0xF5DD, 0x91AB, 0xECA2, 0x91AC, 0xEDFD, 0x91AE, 0xF5B4, 0x91AF, 0xFBB8, + 0x91B1, 0xDBA3, 0x91B4, 0xD6CA, 0x91B5, 0xCBD9, 0x91C0, 0xE5D4, 0x91C7, 0xF3FA, 0x91C9, 0xEBB8, 0x91CB, 0xE0B7, 0x91CC, 0xD7EC, + 0x91CD, 0xF1EC, 0x91CE, 0xE5AF, 0x91CF, 0xD5E1, 0x91D0, 0xD7ED, 0x91D1, 0xD1D1, 0x91D7, 0xE1F2, 0x91D8, 0xEFF9, 0x91DC, 0xDDBC, + 0x91DD, 0xF6DC, 0x91E3, 0xF0E5, 0x91E7, 0xF4C4, 0x91EA, 0xE9E9, 0x91F5, 0xF3FB, 0x920D, 0xD4EF, 0x9210, 0xCCA2, 0x9211, 0xF7FE, + 0x9212, 0xDFBC, 0x9217, 0xEBCD, 0x921E, 0xD0B7, 0x9234, 0xD6C2, 0x923A, 0xE8AD, 0x923F, 0xEFAF, 0x9240, 0xCBA5, 0x9245, 0xCBE9, + 0x9249, 0xFAE8, 0x9257, 0xCCC6, 0x925B, 0xE6E7, 0x925E, 0xEAC7, 0x9262, 0xDBA4, 0x9264, 0xCFC9, 0x9265, 0xE2FC, 0x9266, 0xEFFA, + 0x9280, 0xEBDE, 0x9283, 0xF5C8, 0x9285, 0xD4DE, 0x9291, 0xE0D5, 0x9293, 0xEFB0, 0x9296, 0xE2C7, 0x9298, 0xD9AF, 0x929C, 0xF9E7, + 0x92B3, 0xE7E5, 0x92B6, 0xCFCA, 0x92B7, 0xE1D1, 0x92B9, 0xE2C8, 0x92CC, 0xEFFB, 0x92CF, 0xFAF9, 0x92D2, 0xDCF2, 0x92E4, 0xE0A7, + 0x92EA, 0xF8E8, 0x92F8, 0xCBEA, 0x92FC, 0xCBBC, 0x9304, 0xD6E2, 0x9310, 0xF5DE, 0x9318, 0xF5DF, 0x931A, 0xEEB6, 0x931E, 0xE2F6, + 0x931F, 0xD3CA, 0x9320, 0xEFFC, 0x9321, 0xD1C4, 0x9322, 0xEFB1, 0x9324, 0xD1C5, 0x9326, 0xD0DE, 0x9328, 0xD9E1, 0x932B, 0xE0B8, + 0x932E, 0xCDD1, 0x932F, 0xF3B9, 0x9348, 0xE7CC, 0x934A, 0xD6A8, 0x934B, 0xCEA7, 0x934D, 0xD4B5, 0x9354, 0xE4C8, 0x935B, 0xD3B4, + 0x936E, 0xEBB9, 0x9375, 0xCBF5, 0x937C, 0xF6DD, 0x937E, 0xF1A3, 0x938C, 0xCCC7, 0x9394, 0xE9CA, 0x9396, 0xE1F0, 0x939A, 0xF5E0, + 0x93A3, 0xFBAF, 0x93A7, 0xCBD1, 0x93AC, 0xFBE0, 0x93AD, 0xF2E5, 0x93B0, 0xECF0, 0x93C3, 0xF0EC, 0x93D1, 0xEEEB, 0x93DE, 0xE9CB, + 0x93E1, 0xCCF0, 0x93E4, 0xD7AF, 0x93F6, 0xF3A1, 0x9404, 0xFCF5, 0x9418, 0xF1A4, 0x9425, 0xE0D6, 0x942B, 0xEFB2, 0x9435, 0xF4D1, + 0x9438, 0xF7A1, 0x9444, 0xF1D1, 0x9451, 0xCAFC, 0x9452, 0xCAFD, 0x945B, 0xCECE, 0x947D, 0xF3C8, 0x947F, 0xF3BA, 0x9577, 0xEDFE, + 0x9580, 0xDAA6, 0x9583, 0xE0EC, 0x9589, 0xF8CD, 0x958B, 0xCBD2, 0x958F, 0xEBCE, 0x9591, 0xF9D8, 0x9592, 0xF9D9, 0x9593, 0xCAE0, + 0x9594, 0xDACA, 0x9598, 0xCBA6, 0x95A3, 0xCAC8, 0x95A4, 0xF9EE, 0x95A5, 0xDBEC, 0x95A8, 0xD0B1, 0x95AD, 0xD5EF, 0x95B1, 0xE6F3, + 0x95BB, 0xE7A2, 0x95BC, 0xE4D9, 0x95C7, 0xE4E1, 0x95CA, 0xFCC4, 0x95D4, 0xF9EF, 0x95D5, 0xCFF4, 0x95D6, 0xF7E6, 0x95DC, 0xCEBC, + 0x95E1, 0xF4C5, 0x95E2, 0xDCA3, 0x961C, 0xDDBD, 0x9621, 0xF4C6, 0x962A, 0xF8A1, 0x962E, 0xE8D6, 0x9632, 0xDBC1, 0x963B, 0xF0E6, + 0x963F, 0xE4B9, 0x9640, 0xF6ED, 0x9642, 0xF9AE, 0x9644, 0xDDBE, 0x964B, 0xD7B0, 0x964C, 0xD8E8, 0x964D, 0xCBBD, 0x9650, 0xF9DA, + 0x965B, 0xF8CE, 0x965C, 0xF9F0, 0x965D, 0xE0ED, 0x965E, 0xE3B3, 0x965F, 0xF4B3, 0x9662, 0xEAC2, 0x9663, 0xF2E6, 0x9664, 0xF0B6, + 0x966A, 0xDBD6, 0x9670, 0xEBE4, 0x9673, 0xF2E7, 0x9675, 0xD7D5, 0x9676, 0xD4B6, 0x9677, 0xF9E8, 0x9678, 0xD7C1, 0x967D, 0xE5D5, + 0x9685, 0xE9EA, 0x9686, 0xD7CC, 0x968A, 0xD3E9, 0x968B, 0xE2C9, 0x968D, 0xFCDB, 0x968E, 0xCDAD, 0x9694, 0xCCB0, 0x9695, 0xEAA2, + 0x9698, 0xE4F6, 0x9699, 0xD0C0, 0x969B, 0xF0B7, 0x969C, 0xEEA1, 0x96A3, 0xD7F6, 0x96A7, 0xE2CA, 0x96A8, 0xE2CB, 0x96AA, 0xFACF, + 0x96B1, 0xEBDF, 0x96B7, 0xD6CB, 0x96BB, 0xF4B4, 0x96C0, 0xEDCD, 0x96C1, 0xE4D2, 0x96C4, 0xEAA9, 0x96C5, 0xE4BA, 0x96C6, 0xF3A2, + 0x96C7, 0xCDD2, 0x96C9, 0xF6CB, 0x96CB, 0xF1E6, 0x96CC, 0xEDC1, 0x96CD, 0xE8BC, 0x96CE, 0xEED1, 0x96D5, 0xF0E7, 0x96D6, 0xE2CC, + 0x96D9, 0xE4AA, 0x96DB, 0xF5E1, 0x96DC, 0xEDDA, 0x96E2, 0xD7EE, 0x96E3, 0xD1F1, 0x96E8, 0xE9EB, 0x96E9, 0xE9EC, 0x96EA, 0xE0E4, + 0x96EF, 0xDAA7, 0x96F0, 0xDDD4, 0x96F2, 0xEAA3, 0x96F6, 0xD6C3, 0x96F7, 0xD6F4, 0x96F9, 0xDADF, 0x96FB, 0xEFB3, 0x9700, 0xE2CD, + 0x9706, 0xEFFD, 0x9707, 0xF2E8, 0x9711, 0xEFC5, 0x9713, 0xE7E7, 0x9716, 0xD7FD, 0x9719, 0xE7CE, 0x971C, 0xDFDC, 0x971E, 0xF9C7, + 0x9727, 0xD9F6, 0x9730, 0xDFAC, 0x9732, 0xD6DA, 0x9739, 0xDCA4, 0x973D, 0xF0B8, 0x9742, 0xD5FA, 0x9744, 0xE4F7, 0x9748, 0xD6C4, + 0x9751, 0xF4EC, 0x9756, 0xEFFE, 0x975C, 0xF0A1, 0x975E, 0xDEAA, 0x9761, 0xDABC, 0x9762, 0xD8FC, 0x9769, 0xFAD4, 0x976D, 0xECE5, + 0x9774, 0xFCA8, 0x9777, 0xECE6, 0x977A, 0xD8CB, 0x978B, 0xFBB9, 0x978D, 0xE4D3, 0x978F, 0xCDF9, 0x97A0, 0xCFD3, 0x97A8, 0xCAEA, + 0x97AB, 0xCFD4, 0x97AD, 0xF8BD, 0x97C6, 0xF4C7, 0x97CB, 0xEADF, 0x97D3, 0xF9DB, 0x97DC, 0xD4B7, 0x97F3, 0xEBE5, 0x97F6, 0xE1D2, + 0x97FB, 0xEAA4, 0x97FF, 0xFAC2, 0x9800, 0xFBE1, 0x9801, 0xFAED, 0x9802, 0xF0A2, 0x9803, 0xCCF1, 0x9805, 0xFAA3, 0x9806, 0xE2F7, + 0x9808, 0xE2CE, 0x980A, 0xE9F5, 0x980C, 0xE1EB, 0x9810, 0xE7E8, 0x9811, 0xE8D7, 0x9812, 0xDAF8, 0x9813, 0xD4CB, 0x9817, 0xF7F6, + 0x9818, 0xD6C5, 0x982D, 0xD4E9, 0x9830, 0xFAFA, 0x9838, 0xCCF2, 0x9839, 0xF7DD, 0x983B, 0xDEBA, 0x9846, 0xCEA8, 0x984C, 0xF0B9, + 0x984D, 0xE4FE, 0x984E, 0xE4C9, 0x9854, 0xE4D4, 0x9858, 0xEAC3, 0x985A, 0xEFB4, 0x985E, 0xD7BE, 0x9865, 0xFBE2, 0x9867, 0xCDD3, + 0x986B, 0xEFB5, 0x986F, 0xFAE9, 0x98A8, 0xF9A6, 0x98AF, 0xDFBD, 0x98B1, 0xF7C7, 0x98C4, 0xF8FD, 0x98C7, 0xF8FC, 0x98DB, 0xDEAB, + 0x98DC, 0xDBE8, 0x98DF, 0xE3DD, 0x98E1, 0xE1E2, 0x98E2, 0xD1C6, 0x98ED, 0xF6D0, 0x98EE, 0xEBE6, 0x98EF, 0xDAF9, 0x98F4, 0xECC7, + 0x98FC, 0xDEF8, 0x98FD, 0xF8E9, 0x98FE, 0xE3DE, 0x9903, 0xCEF5, 0x9909, 0xFAC3, 0x990A, 0xE5D7, 0x990C, 0xECC8, 0x9910, 0xF3C9, + 0x9913, 0xE4BB, 0x9918, 0xE6AE, 0x991E, 0xEFB6, 0x9920, 0xDCBF, 0x9928, 0xCEBD, 0x9945, 0xD8C3, 0x9949, 0xD0CF, 0x994B, 0xCFFA, + 0x994C, 0xF3CA, 0x994D, 0xE0D7, 0x9951, 0xD1C7, 0x9952, 0xE9AE, 0x9954, 0xE8BD, 0x9957, 0xFAC4, 0x9996, 0xE2CF, 0x9999, 0xFAC5, + 0x999D, 0xF9B8, 0x99A5, 0xDCE0, 0x99A8, 0xFBB0, 0x99AC, 0xD8A9, 0x99AD, 0xE5DF, 0x99AE, 0xF9A7, 0x99B1, 0xF6EE, 0x99B3, 0xF6CC, + 0x99B4, 0xE2F8, 0x99B9, 0xECF1, 0x99C1, 0xDAE0, 0x99D0, 0xF1D2, 0x99D1, 0xD2CC, 0x99D2, 0xCFCB, 0x99D5, 0xCABD, 0x99D9, 0xDDBF, + 0x99DD, 0xF6EF, 0x99DF, 0xDEF9, 0x99ED, 0xFAB4, 0x99F1, 0xD5AD, 0x99FF, 0xF1E7, 0x9A01, 0xDEBE, 0x9A08, 0xDCC0, 0x9A0E, 0xD1C8, + 0x9A0F, 0xD1C9, 0x9A19, 0xF8BE, 0x9A2B, 0xCBF6, 0x9A30, 0xD4F9, 0x9A36, 0xF5E2, 0x9A37, 0xE1D3, 0x9A40, 0xD8E9, 0x9A43, 0xF8FE, + 0x9A45, 0xCFCC, 0x9A4D, 0xFDA4, 0x9A55, 0xCEF6, 0x9A57, 0xFAD0, 0x9A5A, 0xCCF3, 0x9A5B, 0xE6BE, 0x9A5F, 0xF6AE, 0x9A62, 0xD5F0, + 0x9A65, 0xD1CA, 0x9A69, 0xFCBE, 0x9A6A, 0xD5F1, 0x9AA8, 0xCDE9, 0x9AB8, 0xFAB5, 0x9AD3, 0xE2D0, 0x9AD4, 0xF4F7, 0x9AD8, 0xCDD4, + 0x9AE5, 0xE7A3, 0x9AEE, 0xDBA5, 0x9B1A, 0xE2D1, 0x9B27, 0xD7A2, 0x9B2A, 0xF7E3, 0x9B31, 0xEAA6, 0x9B3C, 0xD0A1, 0x9B41, 0xCEDA, + 0x9B42, 0xFBEB, 0x9B43, 0xDBA6, 0x9B44, 0xDBDE, 0x9B45, 0xD8E5, 0x9B4F, 0xEAE0, 0x9B54, 0xD8AA, 0x9B5A, 0xE5E0, 0x9B6F, 0xD6DB, + 0x9B8E, 0xEFC6, 0x9B91, 0xF8EA, 0x9B9F, 0xE4D5, 0x9BAB, 0xCEF7, 0x9BAE, 0xE0D8, 0x9BC9, 0xD7EF, 0x9BD6, 0xF4ED, 0x9BE4, 0xCDE6, + 0x9BE8, 0xCCF4, 0x9C0D, 0xF5E3, 0x9C10, 0xE4CA, 0x9C12, 0xDCE1, 0x9C15, 0xF9C8, 0x9C25, 0xFCBF, 0x9C32, 0xE8A7, 0x9C3B, 0xD8C4, + 0x9C47, 0xCBBE, 0x9C49, 0xDCAE, 0x9C57, 0xD7F7, 0x9CE5, 0xF0E8, 0x9CE7, 0xDDC0, 0x9CE9, 0xCFCD, 0x9CF3, 0xDCF3, 0x9CF4, 0xD9B0, + 0x9CF6, 0xE6E9, 0x9D09, 0xE4BC, 0x9D1B, 0xEAC4, 0x9D26, 0xE4EC, 0x9D28, 0xE4E5, 0x9D3B, 0xFBF8, 0x9D51, 0xCCBB, 0x9D5D, 0xE4BD, + 0x9D60, 0xCDDC, 0x9D61, 0xD9F7, 0x9D6C, 0xDDDF, 0x9D72, 0xEDCE, 0x9DA9, 0xD9D0, 0x9DAF, 0xE5A3, 0x9DB4, 0xF9CD, 0x9DC4, 0xCDAE, + 0x9DD7, 0xCFCE, 0x9DF2, 0xF6AF, 0x9DF8, 0xFDD3, 0x9DF9, 0xEBED, 0x9DFA, 0xD6DC, 0x9E1A, 0xE5A4, 0x9E1E, 0xD5B6, 0x9E75, 0xD6DD, + 0x9E79, 0xF9E9, 0x9E7D, 0xE7A4, 0x9E7F, 0xD6E3, 0x9E92, 0xD1CB, 0x9E93, 0xD6E4, 0x9E97, 0xD5F2, 0x9E9D, 0xDEFA, 0x9E9F, 0xD7F8, + 0x9EA5, 0xD8EA, 0x9EB4, 0xCFD5, 0x9EB5, 0xD8FD, 0x9EBB, 0xD8AB, 0x9EBE, 0xFDCB, 0x9EC3, 0xFCDC, 0x9ECD, 0xE0A8, 0x9ECE, 0xD5F3, + 0x9ED1, 0xFDD9, 0x9ED4, 0xCCA3, 0x9ED8, 0xD9F9, 0x9EDB, 0xD3EA, 0x9EDC, 0xF5F5, 0x9EDE, 0xEFC7, 0x9EE8, 0xD3DA, 0x9EF4, 0xDABD, + 0x9F07, 0xE8A8, 0x9F08, 0xDCAF, 0x9F0E, 0xF0A3, 0x9F13, 0xCDD5, 0x9F20, 0xE0A9, 0x9F3B, 0xDEAC, 0x9F4A, 0xF0BA, 0x9F4B, 0xEEB1, + 0x9F4E, 0xEEB2, 0x9F52, 0xF6CD, 0x9F5F, 0xEED2, 0x9F61, 0xD6C6, 0x9F67, 0xE0E5, 0x9F6A, 0xF3BB, 0x9F6C, 0xE5E1, 0x9F77, 0xE4CB, + 0x9F8D, 0xD7A3, 0x9F90, 0xDBC2, 0x9F95, 0xCAFE, 0x9F9C, 0xCFCF, 0xAC00, 0xB0A1, 0xAC01, 0xB0A2, 0xAC02, 0x8141, 0xAC03, 0x8142, + 0xAC04, 0xB0A3, 0xAC05, 0x8143, 0xAC06, 0x8144, 0xAC07, 0xB0A4, 0xAC08, 0xB0A5, 0xAC09, 0xB0A6, 0xAC0A, 0xB0A7, 0xAC0B, 0x8145, + 0xAC0C, 0x8146, 0xAC0D, 0x8147, 0xAC0E, 0x8148, 0xAC0F, 0x8149, 0xAC10, 0xB0A8, 0xAC11, 0xB0A9, 0xAC12, 0xB0AA, 0xAC13, 0xB0AB, + 0xAC14, 0xB0AC, 0xAC15, 0xB0AD, 0xAC16, 0xB0AE, 0xAC17, 0xB0AF, 0xAC18, 0x814A, 0xAC19, 0xB0B0, 0xAC1A, 0xB0B1, 0xAC1B, 0xB0B2, + 0xAC1C, 0xB0B3, 0xAC1D, 0xB0B4, 0xAC1E, 0x814B, 0xAC1F, 0x814C, 0xAC20, 0xB0B5, 0xAC21, 0x814D, 0xAC22, 0x814E, 0xAC23, 0x814F, + 0xAC24, 0xB0B6, 0xAC25, 0x8150, 0xAC26, 0x8151, 0xAC27, 0x8152, 0xAC28, 0x8153, 0xAC29, 0x8154, 0xAC2A, 0x8155, 0xAC2B, 0x8156, + 0xAC2C, 0xB0B7, 0xAC2D, 0xB0B8, 0xAC2E, 0x8157, 0xAC2F, 0xB0B9, 0xAC30, 0xB0BA, 0xAC31, 0xB0BB, 0xAC32, 0x8158, 0xAC33, 0x8159, + 0xAC34, 0x815A, 0xAC35, 0x8161, 0xAC36, 0x8162, 0xAC37, 0x8163, 0xAC38, 0xB0BC, 0xAC39, 0xB0BD, 0xAC3A, 0x8164, 0xAC3B, 0x8165, + 0xAC3C, 0xB0BE, 0xAC3D, 0x8166, 0xAC3E, 0x8167, 0xAC3F, 0x8168, 0xAC40, 0xB0BF, 0xAC41, 0x8169, 0xAC42, 0x816A, 0xAC43, 0x816B, + 0xAC44, 0x816C, 0xAC45, 0x816D, 0xAC46, 0x816E, 0xAC47, 0x816F, 0xAC48, 0x8170, 0xAC49, 0x8171, 0xAC4A, 0x8172, 0xAC4B, 0xB0C0, + 0xAC4C, 0x8173, 0xAC4D, 0xB0C1, 0xAC4E, 0x8174, 0xAC4F, 0x8175, 0xAC50, 0x8176, 0xAC51, 0x8177, 0xAC52, 0x8178, 0xAC53, 0x8179, + 0xAC54, 0xB0C2, 0xAC55, 0x817A, 0xAC56, 0x8181, 0xAC57, 0x8182, 0xAC58, 0xB0C3, 0xAC59, 0x8183, 0xAC5A, 0x8184, 0xAC5B, 0x8185, + 0xAC5C, 0xB0C4, 0xAC5D, 0x8186, 0xAC5E, 0x8187, 0xAC5F, 0x8188, 0xAC60, 0x8189, 0xAC61, 0x818A, 0xAC62, 0x818B, 0xAC63, 0x818C, + 0xAC64, 0x818D, 0xAC65, 0x818E, 0xAC66, 0x818F, 0xAC67, 0x8190, 0xAC68, 0x8191, 0xAC69, 0x8192, 0xAC6A, 0x8193, 0xAC6B, 0x8194, + 0xAC6C, 0x8195, 0xAC6D, 0x8196, 0xAC6E, 0x8197, 0xAC6F, 0x8198, 0xAC70, 0xB0C5, 0xAC71, 0xB0C6, 0xAC72, 0x8199, 0xAC73, 0x819A, + 0xAC74, 0xB0C7, 0xAC75, 0x819B, 0xAC76, 0x819C, 0xAC77, 0xB0C8, 0xAC78, 0xB0C9, 0xAC79, 0x819D, 0xAC7A, 0xB0CA, 0xAC7B, 0x819E, + 0xAC7C, 0x819F, 0xAC7D, 0x81A0, 0xAC7E, 0x81A1, 0xAC7F, 0x81A2, 0xAC80, 0xB0CB, 0xAC81, 0xB0CC, 0xAC82, 0x81A3, 0xAC83, 0xB0CD, + 0xAC84, 0xB0CE, 0xAC85, 0xB0CF, 0xAC86, 0xB0D0, 0xAC87, 0x81A4, 0xAC88, 0x81A5, 0xAC89, 0xB0D1, 0xAC8A, 0xB0D2, 0xAC8B, 0xB0D3, + 0xAC8C, 0xB0D4, 0xAC8D, 0x81A6, 0xAC8E, 0x81A7, 0xAC8F, 0x81A8, 0xAC90, 0xB0D5, 0xAC91, 0x81A9, 0xAC92, 0x81AA, 0xAC93, 0x81AB, + 0xAC94, 0xB0D6, 0xAC95, 0x81AC, 0xAC96, 0x81AD, 0xAC97, 0x81AE, 0xAC98, 0x81AF, 0xAC99, 0x81B0, 0xAC9A, 0x81B1, 0xAC9B, 0x81B2, + 0xAC9C, 0xB0D7, 0xAC9D, 0xB0D8, 0xAC9E, 0x81B3, 0xAC9F, 0xB0D9, 0xACA0, 0xB0DA, 0xACA1, 0xB0DB, 0xACA2, 0x81B4, 0xACA3, 0x81B5, + 0xACA4, 0x81B6, 0xACA5, 0x81B7, 0xACA6, 0x81B8, 0xACA7, 0x81B9, 0xACA8, 0xB0DC, 0xACA9, 0xB0DD, 0xACAA, 0xB0DE, 0xACAB, 0x81BA, + 0xACAC, 0xB0DF, 0xACAD, 0x81BB, 0xACAE, 0x81BC, 0xACAF, 0xB0E0, 0xACB0, 0xB0E1, 0xACB1, 0x81BD, 0xACB2, 0x81BE, 0xACB3, 0x81BF, + 0xACB4, 0x81C0, 0xACB5, 0x81C1, 0xACB6, 0x81C2, 0xACB7, 0x81C3, 0xACB8, 0xB0E2, 0xACB9, 0xB0E3, 0xACBA, 0x81C4, 0xACBB, 0xB0E4, + 0xACBC, 0xB0E5, 0xACBD, 0xB0E6, 0xACBE, 0x81C5, 0xACBF, 0x81C6, 0xACC0, 0x81C7, 0xACC1, 0xB0E7, 0xACC2, 0x81C8, 0xACC3, 0x81C9, + 0xACC4, 0xB0E8, 0xACC5, 0x81CA, 0xACC6, 0x81CB, 0xACC7, 0x81CC, 0xACC8, 0xB0E9, 0xACC9, 0x81CD, 0xACCA, 0x81CE, 0xACCB, 0x81CF, + 0xACCC, 0xB0EA, 0xACCD, 0x81D0, 0xACCE, 0x81D1, 0xACCF, 0x81D2, 0xACD0, 0x81D3, 0xACD1, 0x81D4, 0xACD2, 0x81D5, 0xACD3, 0x81D6, + 0xACD4, 0x81D7, 0xACD5, 0xB0EB, 0xACD6, 0x81D8, 0xACD7, 0xB0EC, 0xACD8, 0x81D9, 0xACD9, 0x81DA, 0xACDA, 0x81DB, 0xACDB, 0x81DC, + 0xACDC, 0x81DD, 0xACDD, 0x81DE, 0xACDE, 0x81DF, 0xACDF, 0x81E0, 0xACE0, 0xB0ED, 0xACE1, 0xB0EE, 0xACE2, 0x81E1, 0xACE3, 0x81E2, + 0xACE4, 0xB0EF, 0xACE5, 0x81E3, 0xACE6, 0x81E4, 0xACE7, 0xB0F0, 0xACE8, 0xB0F1, 0xACE9, 0x81E5, 0xACEA, 0xB0F2, 0xACEB, 0x81E6, + 0xACEC, 0xB0F3, 0xACED, 0x81E7, 0xACEE, 0x81E8, 0xACEF, 0xB0F4, 0xACF0, 0xB0F5, 0xACF1, 0xB0F6, 0xACF2, 0x81E9, 0xACF3, 0xB0F7, + 0xACF4, 0x81EA, 0xACF5, 0xB0F8, 0xACF6, 0xB0F9, 0xACF7, 0x81EB, 0xACF8, 0x81EC, 0xACF9, 0x81ED, 0xACFA, 0x81EE, 0xACFB, 0x81EF, + 0xACFC, 0xB0FA, 0xACFD, 0xB0FB, 0xACFE, 0x81F0, 0xACFF, 0x81F1, 0xAD00, 0xB0FC, 0xAD01, 0x81F2, 0xAD02, 0x81F3, 0xAD03, 0x81F4, + 0xAD04, 0xB0FD, 0xAD05, 0x81F5, 0xAD06, 0xB0FE, 0xAD07, 0x81F6, 0xAD08, 0x81F7, 0xAD09, 0x81F8, 0xAD0A, 0x81F9, 0xAD0B, 0x81FA, + 0xAD0C, 0xB1A1, 0xAD0D, 0xB1A2, 0xAD0E, 0x81FB, 0xAD0F, 0xB1A3, 0xAD10, 0x81FC, 0xAD11, 0xB1A4, 0xAD12, 0x81FD, 0xAD13, 0x81FE, + 0xAD14, 0x8241, 0xAD15, 0x8242, 0xAD16, 0x8243, 0xAD17, 0x8244, 0xAD18, 0xB1A5, 0xAD19, 0x8245, 0xAD1A, 0x8246, 0xAD1B, 0x8247, + 0xAD1C, 0xB1A6, 0xAD1D, 0x8248, 0xAD1E, 0x8249, 0xAD1F, 0x824A, 0xAD20, 0xB1A7, 0xAD21, 0x824B, 0xAD22, 0x824C, 0xAD23, 0x824D, + 0xAD24, 0x824E, 0xAD25, 0x824F, 0xAD26, 0x8250, 0xAD27, 0x8251, 0xAD28, 0x8252, 0xAD29, 0xB1A8, 0xAD2A, 0x8253, 0xAD2B, 0x8254, + 0xAD2C, 0xB1A9, 0xAD2D, 0xB1AA, 0xAD2E, 0x8255, 0xAD2F, 0x8256, 0xAD30, 0x8257, 0xAD31, 0x8258, 0xAD32, 0x8259, 0xAD33, 0x825A, + 0xAD34, 0xB1AB, 0xAD35, 0xB1AC, 0xAD36, 0x8261, 0xAD37, 0x8262, 0xAD38, 0xB1AD, 0xAD39, 0x8263, 0xAD3A, 0x8264, 0xAD3B, 0x8265, + 0xAD3C, 0xB1AE, 0xAD3D, 0x8266, 0xAD3E, 0x8267, 0xAD3F, 0x8268, 0xAD40, 0x8269, 0xAD41, 0x826A, 0xAD42, 0x826B, 0xAD43, 0x826C, + 0xAD44, 0xB1AF, 0xAD45, 0xB1B0, 0xAD46, 0x826D, 0xAD47, 0xB1B1, 0xAD48, 0x826E, 0xAD49, 0xB1B2, 0xAD4A, 0x826F, 0xAD4B, 0x8270, + 0xAD4C, 0x8271, 0xAD4D, 0x8272, 0xAD4E, 0x8273, 0xAD4F, 0x8274, 0xAD50, 0xB1B3, 0xAD51, 0x8275, 0xAD52, 0x8276, 0xAD53, 0x8277, + 0xAD54, 0xB1B4, 0xAD55, 0x8278, 0xAD56, 0x8279, 0xAD57, 0x827A, 0xAD58, 0xB1B5, 0xAD59, 0x8281, 0xAD5A, 0x8282, 0xAD5B, 0x8283, + 0xAD5C, 0x8284, 0xAD5D, 0x8285, 0xAD5E, 0x8286, 0xAD5F, 0x8287, 0xAD60, 0x8288, 0xAD61, 0xB1B6, 0xAD62, 0x8289, 0xAD63, 0xB1B7, + 0xAD64, 0x828A, 0xAD65, 0x828B, 0xAD66, 0x828C, 0xAD67, 0x828D, 0xAD68, 0x828E, 0xAD69, 0x828F, 0xAD6A, 0x8290, 0xAD6B, 0x8291, + 0xAD6C, 0xB1B8, 0xAD6D, 0xB1B9, 0xAD6E, 0x8292, 0xAD6F, 0x8293, 0xAD70, 0xB1BA, 0xAD71, 0x8294, 0xAD72, 0x8295, 0xAD73, 0xB1BB, + 0xAD74, 0xB1BC, 0xAD75, 0xB1BD, 0xAD76, 0xB1BE, 0xAD77, 0x8296, 0xAD78, 0x8297, 0xAD79, 0x8298, 0xAD7A, 0x8299, 0xAD7B, 0xB1BF, + 0xAD7C, 0xB1C0, 0xAD7D, 0xB1C1, 0xAD7E, 0x829A, 0xAD7F, 0xB1C2, 0xAD80, 0x829B, 0xAD81, 0xB1C3, 0xAD82, 0xB1C4, 0xAD83, 0x829C, + 0xAD84, 0x829D, 0xAD85, 0x829E, 0xAD86, 0x829F, 0xAD87, 0x82A0, 0xAD88, 0xB1C5, 0xAD89, 0xB1C6, 0xAD8A, 0x82A1, 0xAD8B, 0x82A2, + 0xAD8C, 0xB1C7, 0xAD8D, 0x82A3, 0xAD8E, 0x82A4, 0xAD8F, 0x82A5, 0xAD90, 0xB1C8, 0xAD91, 0x82A6, 0xAD92, 0x82A7, 0xAD93, 0x82A8, + 0xAD94, 0x82A9, 0xAD95, 0x82AA, 0xAD96, 0x82AB, 0xAD97, 0x82AC, 0xAD98, 0x82AD, 0xAD99, 0x82AE, 0xAD9A, 0x82AF, 0xAD9B, 0x82B0, + 0xAD9C, 0xB1C9, 0xAD9D, 0xB1CA, 0xAD9E, 0x82B1, 0xAD9F, 0x82B2, 0xADA0, 0x82B3, 0xADA1, 0x82B4, 0xADA2, 0x82B5, 0xADA3, 0x82B6, + 0xADA4, 0xB1CB, 0xADA5, 0x82B7, 0xADA6, 0x82B8, 0xADA7, 0x82B9, 0xADA8, 0x82BA, 0xADA9, 0x82BB, 0xADAA, 0x82BC, 0xADAB, 0x82BD, + 0xADAC, 0x82BE, 0xADAD, 0x82BF, 0xADAE, 0x82C0, 0xADAF, 0x82C1, 0xADB0, 0x82C2, 0xADB1, 0x82C3, 0xADB2, 0x82C4, 0xADB3, 0x82C5, + 0xADB4, 0x82C6, 0xADB5, 0x82C7, 0xADB6, 0x82C8, 0xADB7, 0xB1CC, 0xADB8, 0x82C9, 0xADB9, 0x82CA, 0xADBA, 0x82CB, 0xADBB, 0x82CC, + 0xADBC, 0x82CD, 0xADBD, 0x82CE, 0xADBE, 0x82CF, 0xADBF, 0x82D0, 0xADC0, 0xB1CD, 0xADC1, 0xB1CE, 0xADC2, 0x82D1, 0xADC3, 0x82D2, + 0xADC4, 0xB1CF, 0xADC5, 0x82D3, 0xADC6, 0x82D4, 0xADC7, 0x82D5, 0xADC8, 0xB1D0, 0xADC9, 0x82D6, 0xADCA, 0x82D7, 0xADCB, 0x82D8, + 0xADCC, 0x82D9, 0xADCD, 0x82DA, 0xADCE, 0x82DB, 0xADCF, 0x82DC, 0xADD0, 0xB1D1, 0xADD1, 0xB1D2, 0xADD2, 0x82DD, 0xADD3, 0xB1D3, + 0xADD4, 0x82DE, 0xADD5, 0x82DF, 0xADD6, 0x82E0, 0xADD7, 0x82E1, 0xADD8, 0x82E2, 0xADD9, 0x82E3, 0xADDA, 0x82E4, 0xADDB, 0x82E5, + 0xADDC, 0xB1D4, 0xADDD, 0x82E6, 0xADDE, 0x82E7, 0xADDF, 0x82E8, 0xADE0, 0xB1D5, 0xADE1, 0x82E9, 0xADE2, 0x82EA, 0xADE3, 0x82EB, + 0xADE4, 0xB1D6, 0xADE5, 0x82EC, 0xADE6, 0x82ED, 0xADE7, 0x82EE, 0xADE8, 0x82EF, 0xADE9, 0x82F0, 0xADEA, 0x82F1, 0xADEB, 0x82F2, + 0xADEC, 0x82F3, 0xADED, 0x82F4, 0xADEE, 0x82F5, 0xADEF, 0x82F6, 0xADF0, 0x82F7, 0xADF1, 0x82F8, 0xADF2, 0x82F9, 0xADF3, 0x82FA, + 0xADF4, 0x82FB, 0xADF5, 0x82FC, 0xADF6, 0x82FD, 0xADF7, 0x82FE, 0xADF8, 0xB1D7, 0xADF9, 0xB1D8, 0xADFA, 0x8341, 0xADFB, 0x8342, + 0xADFC, 0xB1D9, 0xADFD, 0x8343, 0xADFE, 0x8344, 0xADFF, 0xB1DA, 0xAE00, 0xB1DB, 0xAE01, 0xB1DC, 0xAE02, 0x8345, 0xAE03, 0x8346, + 0xAE04, 0x8347, 0xAE05, 0x8348, 0xAE06, 0x8349, 0xAE07, 0x834A, 0xAE08, 0xB1DD, 0xAE09, 0xB1DE, 0xAE0A, 0x834B, 0xAE0B, 0xB1DF, + 0xAE0C, 0x834C, 0xAE0D, 0xB1E0, 0xAE0E, 0x834D, 0xAE0F, 0x834E, 0xAE10, 0x834F, 0xAE11, 0x8350, 0xAE12, 0x8351, 0xAE13, 0x8352, + 0xAE14, 0xB1E1, 0xAE15, 0x8353, 0xAE16, 0x8354, 0xAE17, 0x8355, 0xAE18, 0x8356, 0xAE19, 0x8357, 0xAE1A, 0x8358, 0xAE1B, 0x8359, + 0xAE1C, 0x835A, 0xAE1D, 0x8361, 0xAE1E, 0x8362, 0xAE1F, 0x8363, 0xAE20, 0x8364, 0xAE21, 0x8365, 0xAE22, 0x8366, 0xAE23, 0x8367, + 0xAE24, 0x8368, 0xAE25, 0x8369, 0xAE26, 0x836A, 0xAE27, 0x836B, 0xAE28, 0x836C, 0xAE29, 0x836D, 0xAE2A, 0x836E, 0xAE2B, 0x836F, + 0xAE2C, 0x8370, 0xAE2D, 0x8371, 0xAE2E, 0x8372, 0xAE2F, 0x8373, 0xAE30, 0xB1E2, 0xAE31, 0xB1E3, 0xAE32, 0x8374, 0xAE33, 0x8375, + 0xAE34, 0xB1E4, 0xAE35, 0x8376, 0xAE36, 0x8377, 0xAE37, 0xB1E5, 0xAE38, 0xB1E6, 0xAE39, 0x8378, 0xAE3A, 0xB1E7, 0xAE3B, 0x8379, + 0xAE3C, 0x837A, 0xAE3D, 0x8381, 0xAE3E, 0x8382, 0xAE3F, 0x8383, 0xAE40, 0xB1E8, 0xAE41, 0xB1E9, 0xAE42, 0x8384, 0xAE43, 0xB1EA, + 0xAE44, 0x8385, 0xAE45, 0xB1EB, 0xAE46, 0xB1EC, 0xAE47, 0x8386, 0xAE48, 0x8387, 0xAE49, 0x8388, 0xAE4A, 0xB1ED, 0xAE4B, 0x8389, + 0xAE4C, 0xB1EE, 0xAE4D, 0xB1EF, 0xAE4E, 0xB1F0, 0xAE4F, 0x838A, 0xAE50, 0xB1F1, 0xAE51, 0x838B, 0xAE52, 0x838C, 0xAE53, 0x838D, + 0xAE54, 0xB1F2, 0xAE55, 0x838E, 0xAE56, 0xB1F3, 0xAE57, 0x838F, 0xAE58, 0x8390, 0xAE59, 0x8391, 0xAE5A, 0x8392, 0xAE5B, 0x8393, + 0xAE5C, 0xB1F4, 0xAE5D, 0xB1F5, 0xAE5E, 0x8394, 0xAE5F, 0xB1F6, 0xAE60, 0xB1F7, 0xAE61, 0xB1F8, 0xAE62, 0x8395, 0xAE63, 0x8396, + 0xAE64, 0x8397, 0xAE65, 0xB1F9, 0xAE66, 0x8398, 0xAE67, 0x8399, 0xAE68, 0xB1FA, 0xAE69, 0xB1FB, 0xAE6A, 0x839A, 0xAE6B, 0x839B, + 0xAE6C, 0xB1FC, 0xAE6D, 0x839C, 0xAE6E, 0x839D, 0xAE6F, 0x839E, 0xAE70, 0xB1FD, 0xAE71, 0x839F, 0xAE72, 0x83A0, 0xAE73, 0x83A1, + 0xAE74, 0x83A2, 0xAE75, 0x83A3, 0xAE76, 0x83A4, 0xAE77, 0x83A5, 0xAE78, 0xB1FE, 0xAE79, 0xB2A1, 0xAE7A, 0x83A6, 0xAE7B, 0xB2A2, + 0xAE7C, 0xB2A3, 0xAE7D, 0xB2A4, 0xAE7E, 0x83A7, 0xAE7F, 0x83A8, 0xAE80, 0x83A9, 0xAE81, 0x83AA, 0xAE82, 0x83AB, 0xAE83, 0x83AC, + 0xAE84, 0xB2A5, 0xAE85, 0xB2A6, 0xAE86, 0x83AD, 0xAE87, 0x83AE, 0xAE88, 0x83AF, 0xAE89, 0x83B0, 0xAE8A, 0x83B1, 0xAE8B, 0x83B2, + 0xAE8C, 0xB2A7, 0xAE8D, 0x83B3, 0xAE8E, 0x83B4, 0xAE8F, 0x83B5, 0xAE90, 0x83B6, 0xAE91, 0x83B7, 0xAE92, 0x83B8, 0xAE93, 0x83B9, + 0xAE94, 0x83BA, 0xAE95, 0x83BB, 0xAE96, 0x83BC, 0xAE97, 0x83BD, 0xAE98, 0x83BE, 0xAE99, 0x83BF, 0xAE9A, 0x83C0, 0xAE9B, 0x83C1, + 0xAE9C, 0x83C2, 0xAE9D, 0x83C3, 0xAE9E, 0x83C4, 0xAE9F, 0x83C5, 0xAEA0, 0x83C6, 0xAEA1, 0x83C7, 0xAEA2, 0x83C8, 0xAEA3, 0x83C9, + 0xAEA4, 0x83CA, 0xAEA5, 0x83CB, 0xAEA6, 0x83CC, 0xAEA7, 0x83CD, 0xAEA8, 0x83CE, 0xAEA9, 0x83CF, 0xAEAA, 0x83D0, 0xAEAB, 0x83D1, + 0xAEAC, 0x83D2, 0xAEAD, 0x83D3, 0xAEAE, 0x83D4, 0xAEAF, 0x83D5, 0xAEB0, 0x83D6, 0xAEB1, 0x83D7, 0xAEB2, 0x83D8, 0xAEB3, 0x83D9, + 0xAEB4, 0x83DA, 0xAEB5, 0x83DB, 0xAEB6, 0x83DC, 0xAEB7, 0x83DD, 0xAEB8, 0x83DE, 0xAEB9, 0x83DF, 0xAEBA, 0x83E0, 0xAEBB, 0x83E1, + 0xAEBC, 0xB2A8, 0xAEBD, 0xB2A9, 0xAEBE, 0xB2AA, 0xAEBF, 0x83E2, 0xAEC0, 0xB2AB, 0xAEC1, 0x83E3, 0xAEC2, 0x83E4, 0xAEC3, 0x83E5, + 0xAEC4, 0xB2AC, 0xAEC5, 0x83E6, 0xAEC6, 0x83E7, 0xAEC7, 0x83E8, 0xAEC8, 0x83E9, 0xAEC9, 0x83EA, 0xAECA, 0x83EB, 0xAECB, 0x83EC, + 0xAECC, 0xB2AD, 0xAECD, 0xB2AE, 0xAECE, 0x83ED, 0xAECF, 0xB2AF, 0xAED0, 0xB2B0, 0xAED1, 0xB2B1, 0xAED2, 0x83EE, 0xAED3, 0x83EF, + 0xAED4, 0x83F0, 0xAED5, 0x83F1, 0xAED6, 0x83F2, 0xAED7, 0x83F3, 0xAED8, 0xB2B2, 0xAED9, 0xB2B3, 0xAEDA, 0x83F4, 0xAEDB, 0x83F5, + 0xAEDC, 0xB2B4, 0xAEDD, 0x83F6, 0xAEDE, 0x83F7, 0xAEDF, 0x83F8, 0xAEE0, 0x83F9, 0xAEE1, 0x83FA, 0xAEE2, 0x83FB, 0xAEE3, 0x83FC, + 0xAEE4, 0x83FD, 0xAEE5, 0x83FE, 0xAEE6, 0x8441, 0xAEE7, 0x8442, 0xAEE8, 0xB2B5, 0xAEE9, 0x8443, 0xAEEA, 0x8444, 0xAEEB, 0xB2B6, + 0xAEEC, 0x8445, 0xAEED, 0xB2B7, 0xAEEE, 0x8446, 0xAEEF, 0x8447, 0xAEF0, 0x8448, 0xAEF1, 0x8449, 0xAEF2, 0x844A, 0xAEF3, 0x844B, + 0xAEF4, 0xB2B8, 0xAEF5, 0x844C, 0xAEF6, 0x844D, 0xAEF7, 0x844E, 0xAEF8, 0xB2B9, 0xAEF9, 0x844F, 0xAEFA, 0x8450, 0xAEFB, 0x8451, + 0xAEFC, 0xB2BA, 0xAEFD, 0x8452, 0xAEFE, 0x8453, 0xAEFF, 0x8454, 0xAF00, 0x8455, 0xAF01, 0x8456, 0xAF02, 0x8457, 0xAF03, 0x8458, + 0xAF04, 0x8459, 0xAF05, 0x845A, 0xAF06, 0x8461, 0xAF07, 0xB2BB, 0xAF08, 0xB2BC, 0xAF09, 0x8462, 0xAF0A, 0x8463, 0xAF0B, 0x8464, + 0xAF0C, 0x8465, 0xAF0D, 0xB2BD, 0xAF0E, 0x8466, 0xAF0F, 0x8467, 0xAF10, 0xB2BE, 0xAF11, 0x8468, 0xAF12, 0x8469, 0xAF13, 0x846A, + 0xAF14, 0x846B, 0xAF15, 0x846C, 0xAF16, 0x846D, 0xAF17, 0x846E, 0xAF18, 0x846F, 0xAF19, 0x8470, 0xAF1A, 0x8471, 0xAF1B, 0x8472, + 0xAF1C, 0x8473, 0xAF1D, 0x8474, 0xAF1E, 0x8475, 0xAF1F, 0x8476, 0xAF20, 0x8477, 0xAF21, 0x8478, 0xAF22, 0x8479, 0xAF23, 0x847A, + 0xAF24, 0x8481, 0xAF25, 0x8482, 0xAF26, 0x8483, 0xAF27, 0x8484, 0xAF28, 0x8485, 0xAF29, 0x8486, 0xAF2A, 0x8487, 0xAF2B, 0x8488, + 0xAF2C, 0xB2BF, 0xAF2D, 0xB2C0, 0xAF2E, 0x8489, 0xAF2F, 0x848A, 0xAF30, 0xB2C1, 0xAF31, 0x848B, 0xAF32, 0xB2C2, 0xAF33, 0x848C, + 0xAF34, 0xB2C3, 0xAF35, 0x848D, 0xAF36, 0x848E, 0xAF37, 0x848F, 0xAF38, 0x8490, 0xAF39, 0x8491, 0xAF3A, 0x8492, 0xAF3B, 0x8493, + 0xAF3C, 0xB2C4, 0xAF3D, 0xB2C5, 0xAF3E, 0x8494, 0xAF3F, 0xB2C6, 0xAF40, 0x8495, 0xAF41, 0xB2C7, 0xAF42, 0xB2C8, 0xAF43, 0xB2C9, + 0xAF44, 0x8496, 0xAF45, 0x8497, 0xAF46, 0x8498, 0xAF47, 0x8499, 0xAF48, 0xB2CA, 0xAF49, 0xB2CB, 0xAF4A, 0x849A, 0xAF4B, 0x849B, + 0xAF4C, 0x849C, 0xAF4D, 0x849D, 0xAF4E, 0x849E, 0xAF4F, 0x849F, 0xAF50, 0xB2CC, 0xAF51, 0x84A0, 0xAF52, 0x84A1, 0xAF53, 0x84A2, + 0xAF54, 0x84A3, 0xAF55, 0x84A4, 0xAF56, 0x84A5, 0xAF57, 0x84A6, 0xAF58, 0x84A7, 0xAF59, 0x84A8, 0xAF5A, 0x84A9, 0xAF5B, 0x84AA, + 0xAF5C, 0xB2CD, 0xAF5D, 0xB2CE, 0xAF5E, 0x84AB, 0xAF5F, 0x84AC, 0xAF60, 0x84AD, 0xAF61, 0x84AE, 0xAF62, 0x84AF, 0xAF63, 0x84B0, + 0xAF64, 0xB2CF, 0xAF65, 0xB2D0, 0xAF66, 0x84B1, 0xAF67, 0x84B2, 0xAF68, 0x84B3, 0xAF69, 0x84B4, 0xAF6A, 0x84B5, 0xAF6B, 0x84B6, + 0xAF6C, 0x84B7, 0xAF6D, 0x84B8, 0xAF6E, 0x84B9, 0xAF6F, 0x84BA, 0xAF70, 0x84BB, 0xAF71, 0x84BC, 0xAF72, 0x84BD, 0xAF73, 0x84BE, + 0xAF74, 0x84BF, 0xAF75, 0x84C0, 0xAF76, 0x84C1, 0xAF77, 0x84C2, 0xAF78, 0x84C3, 0xAF79, 0xB2D1, 0xAF7A, 0x84C4, 0xAF7B, 0x84C5, + 0xAF7C, 0x84C6, 0xAF7D, 0x84C7, 0xAF7E, 0x84C8, 0xAF7F, 0x84C9, 0xAF80, 0xB2D2, 0xAF81, 0x84CA, 0xAF82, 0x84CB, 0xAF83, 0x84CC, + 0xAF84, 0xB2D3, 0xAF85, 0x84CD, 0xAF86, 0x84CE, 0xAF87, 0x84CF, 0xAF88, 0xB2D4, 0xAF89, 0x84D0, 0xAF8A, 0x84D1, 0xAF8B, 0x84D2, + 0xAF8C, 0x84D3, 0xAF8D, 0x84D4, 0xAF8E, 0x84D5, 0xAF8F, 0x84D6, 0xAF90, 0xB2D5, 0xAF91, 0xB2D6, 0xAF92, 0x84D7, 0xAF93, 0x84D8, + 0xAF94, 0x84D9, 0xAF95, 0xB2D7, 0xAF96, 0x84DA, 0xAF97, 0x84DB, 0xAF98, 0x84DC, 0xAF99, 0x84DD, 0xAF9A, 0x84DE, 0xAF9B, 0x84DF, + 0xAF9C, 0xB2D8, 0xAF9D, 0x84E0, 0xAF9E, 0x84E1, 0xAF9F, 0x84E2, 0xAFA0, 0x84E3, 0xAFA1, 0x84E4, 0xAFA2, 0x84E5, 0xAFA3, 0x84E6, + 0xAFA4, 0x84E7, 0xAFA5, 0x84E8, 0xAFA6, 0x84E9, 0xAFA7, 0x84EA, 0xAFA8, 0x84EB, 0xAFA9, 0x84EC, 0xAFAA, 0x84ED, 0xAFAB, 0x84EE, + 0xAFAC, 0x84EF, 0xAFAD, 0x84F0, 0xAFAE, 0x84F1, 0xAFAF, 0x84F2, 0xAFB0, 0x84F3, 0xAFB1, 0x84F4, 0xAFB2, 0x84F5, 0xAFB3, 0x84F6, + 0xAFB4, 0x84F7, 0xAFB5, 0x84F8, 0xAFB6, 0x84F9, 0xAFB7, 0x84FA, 0xAFB8, 0xB2D9, 0xAFB9, 0xB2DA, 0xAFBA, 0x84FB, 0xAFBB, 0x84FC, + 0xAFBC, 0xB2DB, 0xAFBD, 0x84FD, 0xAFBE, 0x84FE, 0xAFBF, 0x8541, 0xAFC0, 0xB2DC, 0xAFC1, 0x8542, 0xAFC2, 0x8543, 0xAFC3, 0x8544, + 0xAFC4, 0x8545, 0xAFC5, 0x8546, 0xAFC6, 0x8547, 0xAFC7, 0xB2DD, 0xAFC8, 0xB2DE, 0xAFC9, 0xB2DF, 0xAFCA, 0x8548, 0xAFCB, 0xB2E0, + 0xAFCC, 0x8549, 0xAFCD, 0xB2E1, 0xAFCE, 0xB2E2, 0xAFCF, 0x854A, 0xAFD0, 0x854B, 0xAFD1, 0x854C, 0xAFD2, 0x854D, 0xAFD3, 0x854E, + 0xAFD4, 0xB2E3, 0xAFD5, 0x854F, 0xAFD6, 0x8550, 0xAFD7, 0x8551, 0xAFD8, 0x8552, 0xAFD9, 0x8553, 0xAFDA, 0x8554, 0xAFDB, 0x8555, + 0xAFDC, 0xB2E4, 0xAFDD, 0x8556, 0xAFDE, 0x8557, 0xAFDF, 0x8558, 0xAFE0, 0x8559, 0xAFE1, 0x855A, 0xAFE2, 0x8561, 0xAFE3, 0x8562, + 0xAFE4, 0x8563, 0xAFE5, 0x8564, 0xAFE6, 0x8565, 0xAFE7, 0x8566, 0xAFE8, 0xB2E5, 0xAFE9, 0xB2E6, 0xAFEA, 0x8567, 0xAFEB, 0x8568, + 0xAFEC, 0x8569, 0xAFED, 0x856A, 0xAFEE, 0x856B, 0xAFEF, 0x856C, 0xAFF0, 0xB2E7, 0xAFF1, 0xB2E8, 0xAFF2, 0x856D, 0xAFF3, 0x856E, + 0xAFF4, 0xB2E9, 0xAFF5, 0x856F, 0xAFF6, 0x8570, 0xAFF7, 0x8571, 0xAFF8, 0xB2EA, 0xAFF9, 0x8572, 0xAFFA, 0x8573, 0xAFFB, 0x8574, + 0xAFFC, 0x8575, 0xAFFD, 0x8576, 0xAFFE, 0x8577, 0xAFFF, 0x8578, 0xB000, 0xB2EB, 0xB001, 0xB2EC, 0xB002, 0x8579, 0xB003, 0x857A, + 0xB004, 0xB2ED, 0xB005, 0x8581, 0xB006, 0x8582, 0xB007, 0x8583, 0xB008, 0x8584, 0xB009, 0x8585, 0xB00A, 0x8586, 0xB00B, 0x8587, + 0xB00C, 0xB2EE, 0xB00D, 0x8588, 0xB00E, 0x8589, 0xB00F, 0x858A, 0xB010, 0xB2EF, 0xB011, 0x858B, 0xB012, 0x858C, 0xB013, 0x858D, + 0xB014, 0xB2F0, 0xB015, 0x858E, 0xB016, 0x858F, 0xB017, 0x8590, 0xB018, 0x8591, 0xB019, 0x8592, 0xB01A, 0x8593, 0xB01B, 0x8594, + 0xB01C, 0xB2F1, 0xB01D, 0xB2F2, 0xB01E, 0x8595, 0xB01F, 0x8596, 0xB020, 0x8597, 0xB021, 0x8598, 0xB022, 0x8599, 0xB023, 0x859A, + 0xB024, 0x859B, 0xB025, 0x859C, 0xB026, 0x859D, 0xB027, 0x859E, 0xB028, 0xB2F3, 0xB029, 0x859F, 0xB02A, 0x85A0, 0xB02B, 0x85A1, + 0xB02C, 0x85A2, 0xB02D, 0x85A3, 0xB02E, 0x85A4, 0xB02F, 0x85A5, 0xB030, 0x85A6, 0xB031, 0x85A7, 0xB032, 0x85A8, 0xB033, 0x85A9, + 0xB034, 0x85AA, 0xB035, 0x85AB, 0xB036, 0x85AC, 0xB037, 0x85AD, 0xB038, 0x85AE, 0xB039, 0x85AF, 0xB03A, 0x85B0, 0xB03B, 0x85B1, + 0xB03C, 0x85B2, 0xB03D, 0x85B3, 0xB03E, 0x85B4, 0xB03F, 0x85B5, 0xB040, 0x85B6, 0xB041, 0x85B7, 0xB042, 0x85B8, 0xB043, 0x85B9, + 0xB044, 0xB2F4, 0xB045, 0xB2F5, 0xB046, 0x85BA, 0xB047, 0x85BB, 0xB048, 0xB2F6, 0xB049, 0x85BC, 0xB04A, 0xB2F7, 0xB04B, 0x85BD, + 0xB04C, 0xB2F8, 0xB04D, 0x85BE, 0xB04E, 0xB2F9, 0xB04F, 0x85BF, 0xB050, 0x85C0, 0xB051, 0x85C1, 0xB052, 0x85C2, 0xB053, 0xB2FA, + 0xB054, 0xB2FB, 0xB055, 0xB2FC, 0xB056, 0x85C3, 0xB057, 0xB2FD, 0xB058, 0x85C4, 0xB059, 0xB2FE, 0xB05A, 0x85C5, 0xB05B, 0x85C6, + 0xB05C, 0x85C7, 0xB05D, 0xB3A1, 0xB05E, 0x85C8, 0xB05F, 0x85C9, 0xB060, 0x85CA, 0xB061, 0x85CB, 0xB062, 0x85CC, 0xB063, 0x85CD, + 0xB064, 0x85CE, 0xB065, 0x85CF, 0xB066, 0x85D0, 0xB067, 0x85D1, 0xB068, 0x85D2, 0xB069, 0x85D3, 0xB06A, 0x85D4, 0xB06B, 0x85D5, + 0xB06C, 0x85D6, 0xB06D, 0x85D7, 0xB06E, 0x85D8, 0xB06F, 0x85D9, 0xB070, 0x85DA, 0xB071, 0x85DB, 0xB072, 0x85DC, 0xB073, 0x85DD, + 0xB074, 0x85DE, 0xB075, 0x85DF, 0xB076, 0x85E0, 0xB077, 0x85E1, 0xB078, 0x85E2, 0xB079, 0x85E3, 0xB07A, 0x85E4, 0xB07B, 0x85E5, + 0xB07C, 0xB3A2, 0xB07D, 0xB3A3, 0xB07E, 0x85E6, 0xB07F, 0x85E7, 0xB080, 0xB3A4, 0xB081, 0x85E8, 0xB082, 0x85E9, 0xB083, 0x85EA, + 0xB084, 0xB3A5, 0xB085, 0x85EB, 0xB086, 0x85EC, 0xB087, 0x85ED, 0xB088, 0x85EE, 0xB089, 0x85EF, 0xB08A, 0x85F0, 0xB08B, 0x85F1, + 0xB08C, 0xB3A6, 0xB08D, 0xB3A7, 0xB08E, 0x85F2, 0xB08F, 0xB3A8, 0xB090, 0x85F3, 0xB091, 0xB3A9, 0xB092, 0x85F4, 0xB093, 0x85F5, + 0xB094, 0x85F6, 0xB095, 0x85F7, 0xB096, 0x85F8, 0xB097, 0x85F9, 0xB098, 0xB3AA, 0xB099, 0xB3AB, 0xB09A, 0xB3AC, 0xB09B, 0x85FA, + 0xB09C, 0xB3AD, 0xB09D, 0x85FB, 0xB09E, 0x85FC, 0xB09F, 0xB3AE, 0xB0A0, 0xB3AF, 0xB0A1, 0xB3B0, 0xB0A2, 0xB3B1, 0xB0A3, 0x85FD, + 0xB0A4, 0x85FE, 0xB0A5, 0x8641, 0xB0A6, 0x8642, 0xB0A7, 0x8643, 0xB0A8, 0xB3B2, 0xB0A9, 0xB3B3, 0xB0AA, 0x8644, 0xB0AB, 0xB3B4, + 0xB0AC, 0xB3B5, 0xB0AD, 0xB3B6, 0xB0AE, 0xB3B7, 0xB0AF, 0xB3B8, 0xB0B0, 0x8645, 0xB0B1, 0xB3B9, 0xB0B2, 0x8646, 0xB0B3, 0xB3BA, + 0xB0B4, 0xB3BB, 0xB0B5, 0xB3BC, 0xB0B6, 0x8647, 0xB0B7, 0x8648, 0xB0B8, 0xB3BD, 0xB0B9, 0x8649, 0xB0BA, 0x864A, 0xB0BB, 0x864B, + 0xB0BC, 0xB3BE, 0xB0BD, 0x864C, 0xB0BE, 0x864D, 0xB0BF, 0x864E, 0xB0C0, 0x864F, 0xB0C1, 0x8650, 0xB0C2, 0x8651, 0xB0C3, 0x8652, + 0xB0C4, 0xB3BF, 0xB0C5, 0xB3C0, 0xB0C6, 0x8653, 0xB0C7, 0xB3C1, 0xB0C8, 0xB3C2, 0xB0C9, 0xB3C3, 0xB0CA, 0x8654, 0xB0CB, 0x8655, + 0xB0CC, 0x8656, 0xB0CD, 0x8657, 0xB0CE, 0x8658, 0xB0CF, 0x8659, 0xB0D0, 0xB3C4, 0xB0D1, 0xB3C5, 0xB0D2, 0x865A, 0xB0D3, 0x8661, + 0xB0D4, 0xB3C6, 0xB0D5, 0x8662, 0xB0D6, 0x8663, 0xB0D7, 0x8664, 0xB0D8, 0xB3C7, 0xB0D9, 0x8665, 0xB0DA, 0x8666, 0xB0DB, 0x8667, + 0xB0DC, 0x8668, 0xB0DD, 0x8669, 0xB0DE, 0x866A, 0xB0DF, 0x866B, 0xB0E0, 0xB3C8, 0xB0E1, 0x866C, 0xB0E2, 0x866D, 0xB0E3, 0x866E, + 0xB0E4, 0x866F, 0xB0E5, 0xB3C9, 0xB0E6, 0x8670, 0xB0E7, 0x8671, 0xB0E8, 0x8672, 0xB0E9, 0x8673, 0xB0EA, 0x8674, 0xB0EB, 0x8675, + 0xB0EC, 0x8676, 0xB0ED, 0x8677, 0xB0EE, 0x8678, 0xB0EF, 0x8679, 0xB0F0, 0x867A, 0xB0F1, 0x8681, 0xB0F2, 0x8682, 0xB0F3, 0x8683, + 0xB0F4, 0x8684, 0xB0F5, 0x8685, 0xB0F6, 0x8686, 0xB0F7, 0x8687, 0xB0F8, 0x8688, 0xB0F9, 0x8689, 0xB0FA, 0x868A, 0xB0FB, 0x868B, + 0xB0FC, 0x868C, 0xB0FD, 0x868D, 0xB0FE, 0x868E, 0xB0FF, 0x868F, 0xB100, 0x8690, 0xB101, 0x8691, 0xB102, 0x8692, 0xB103, 0x8693, + 0xB104, 0x8694, 0xB105, 0x8695, 0xB106, 0x8696, 0xB107, 0x8697, 0xB108, 0xB3CA, 0xB109, 0xB3CB, 0xB10A, 0x8698, 0xB10B, 0xB3CC, + 0xB10C, 0xB3CD, 0xB10D, 0x8699, 0xB10E, 0x869A, 0xB10F, 0x869B, 0xB110, 0xB3CE, 0xB111, 0x869C, 0xB112, 0xB3CF, 0xB113, 0xB3D0, + 0xB114, 0x869D, 0xB115, 0x869E, 0xB116, 0x869F, 0xB117, 0x86A0, 0xB118, 0xB3D1, 0xB119, 0xB3D2, 0xB11A, 0x86A1, 0xB11B, 0xB3D3, + 0xB11C, 0xB3D4, 0xB11D, 0xB3D5, 0xB11E, 0x86A2, 0xB11F, 0x86A3, 0xB120, 0x86A4, 0xB121, 0x86A5, 0xB122, 0x86A6, 0xB123, 0xB3D6, + 0xB124, 0xB3D7, 0xB125, 0xB3D8, 0xB126, 0x86A7, 0xB127, 0x86A8, 0xB128, 0xB3D9, 0xB129, 0x86A9, 0xB12A, 0x86AA, 0xB12B, 0x86AB, + 0xB12C, 0xB3DA, 0xB12D, 0x86AC, 0xB12E, 0x86AD, 0xB12F, 0x86AE, 0xB130, 0x86AF, 0xB131, 0x86B0, 0xB132, 0x86B1, 0xB133, 0x86B2, + 0xB134, 0xB3DB, 0xB135, 0xB3DC, 0xB136, 0x86B3, 0xB137, 0xB3DD, 0xB138, 0xB3DE, 0xB139, 0xB3DF, 0xB13A, 0x86B4, 0xB13B, 0x86B5, + 0xB13C, 0x86B6, 0xB13D, 0x86B7, 0xB13E, 0x86B8, 0xB13F, 0x86B9, 0xB140, 0xB3E0, 0xB141, 0xB3E1, 0xB142, 0x86BA, 0xB143, 0x86BB, + 0xB144, 0xB3E2, 0xB145, 0x86BC, 0xB146, 0x86BD, 0xB147, 0x86BE, 0xB148, 0xB3E3, 0xB149, 0x86BF, 0xB14A, 0x86C0, 0xB14B, 0x86C1, + 0xB14C, 0x86C2, 0xB14D, 0x86C3, 0xB14E, 0x86C4, 0xB14F, 0x86C5, 0xB150, 0xB3E4, 0xB151, 0xB3E5, 0xB152, 0x86C6, 0xB153, 0x86C7, + 0xB154, 0xB3E6, 0xB155, 0xB3E7, 0xB156, 0x86C8, 0xB157, 0x86C9, 0xB158, 0xB3E8, 0xB159, 0x86CA, 0xB15A, 0x86CB, 0xB15B, 0x86CC, + 0xB15C, 0xB3E9, 0xB15D, 0x86CD, 0xB15E, 0x86CE, 0xB15F, 0x86CF, 0xB160, 0xB3EA, 0xB161, 0x86D0, 0xB162, 0x86D1, 0xB163, 0x86D2, + 0xB164, 0x86D3, 0xB165, 0x86D4, 0xB166, 0x86D5, 0xB167, 0x86D6, 0xB168, 0x86D7, 0xB169, 0x86D8, 0xB16A, 0x86D9, 0xB16B, 0x86DA, + 0xB16C, 0x86DB, 0xB16D, 0x86DC, 0xB16E, 0x86DD, 0xB16F, 0x86DE, 0xB170, 0x86DF, 0xB171, 0x86E0, 0xB172, 0x86E1, 0xB173, 0x86E2, + 0xB174, 0x86E3, 0xB175, 0x86E4, 0xB176, 0x86E5, 0xB177, 0x86E6, 0xB178, 0xB3EB, 0xB179, 0xB3EC, 0xB17A, 0x86E7, 0xB17B, 0x86E8, + 0xB17C, 0xB3ED, 0xB17D, 0x86E9, 0xB17E, 0x86EA, 0xB17F, 0x86EB, 0xB180, 0xB3EE, 0xB181, 0x86EC, 0xB182, 0xB3EF, 0xB183, 0x86ED, + 0xB184, 0x86EE, 0xB185, 0x86EF, 0xB186, 0x86F0, 0xB187, 0x86F1, 0xB188, 0xB3F0, 0xB189, 0xB3F1, 0xB18A, 0x86F2, 0xB18B, 0xB3F2, + 0xB18C, 0x86F3, 0xB18D, 0xB3F3, 0xB18E, 0x86F4, 0xB18F, 0x86F5, 0xB190, 0x86F6, 0xB191, 0x86F7, 0xB192, 0xB3F4, 0xB193, 0xB3F5, + 0xB194, 0xB3F6, 0xB195, 0x86F8, 0xB196, 0x86F9, 0xB197, 0x86FA, 0xB198, 0xB3F7, 0xB199, 0x86FB, 0xB19A, 0x86FC, 0xB19B, 0x86FD, + 0xB19C, 0xB3F8, 0xB19D, 0x86FE, 0xB19E, 0x8741, 0xB19F, 0x8742, 0xB1A0, 0x8743, 0xB1A1, 0x8744, 0xB1A2, 0x8745, 0xB1A3, 0x8746, + 0xB1A4, 0x8747, 0xB1A5, 0x8748, 0xB1A6, 0x8749, 0xB1A7, 0x874A, 0xB1A8, 0xB3F9, 0xB1A9, 0x874B, 0xB1AA, 0x874C, 0xB1AB, 0x874D, + 0xB1AC, 0x874E, 0xB1AD, 0x874F, 0xB1AE, 0x8750, 0xB1AF, 0x8751, 0xB1B0, 0x8752, 0xB1B1, 0x8753, 0xB1B2, 0x8754, 0xB1B3, 0x8755, + 0xB1B4, 0x8756, 0xB1B5, 0x8757, 0xB1B6, 0x8758, 0xB1B7, 0x8759, 0xB1B8, 0x875A, 0xB1B9, 0x8761, 0xB1BA, 0x8762, 0xB1BB, 0x8763, + 0xB1BC, 0x8764, 0xB1BD, 0x8765, 0xB1BE, 0x8766, 0xB1BF, 0x8767, 0xB1C0, 0x8768, 0xB1C1, 0x8769, 0xB1C2, 0x876A, 0xB1C3, 0x876B, + 0xB1C4, 0x876C, 0xB1C5, 0x876D, 0xB1C6, 0x876E, 0xB1C7, 0x876F, 0xB1C8, 0x8770, 0xB1C9, 0x8771, 0xB1CA, 0x8772, 0xB1CB, 0x8773, + 0xB1CC, 0xB3FA, 0xB1CD, 0x8774, 0xB1CE, 0x8775, 0xB1CF, 0x8776, 0xB1D0, 0xB3FB, 0xB1D1, 0x8777, 0xB1D2, 0x8778, 0xB1D3, 0x8779, + 0xB1D4, 0xB3FC, 0xB1D5, 0x877A, 0xB1D6, 0x8781, 0xB1D7, 0x8782, 0xB1D8, 0x8783, 0xB1D9, 0x8784, 0xB1DA, 0x8785, 0xB1DB, 0x8786, + 0xB1DC, 0xB3FD, 0xB1DD, 0xB3FE, 0xB1DE, 0x8787, 0xB1DF, 0xB4A1, 0xB1E0, 0x8788, 0xB1E1, 0x8789, 0xB1E2, 0x878A, 0xB1E3, 0x878B, + 0xB1E4, 0x878C, 0xB1E5, 0x878D, 0xB1E6, 0x878E, 0xB1E7, 0x878F, 0xB1E8, 0xB4A2, 0xB1E9, 0xB4A3, 0xB1EA, 0x8790, 0xB1EB, 0x8791, + 0xB1EC, 0xB4A4, 0xB1ED, 0x8792, 0xB1EE, 0x8793, 0xB1EF, 0x8794, 0xB1F0, 0xB4A5, 0xB1F1, 0x8795, 0xB1F2, 0x8796, 0xB1F3, 0x8797, + 0xB1F4, 0x8798, 0xB1F5, 0x8799, 0xB1F6, 0x879A, 0xB1F7, 0x879B, 0xB1F8, 0x879C, 0xB1F9, 0xB4A6, 0xB1FA, 0x879D, 0xB1FB, 0xB4A7, + 0xB1FC, 0x879E, 0xB1FD, 0xB4A8, 0xB1FE, 0x879F, 0xB1FF, 0x87A0, 0xB200, 0x87A1, 0xB201, 0x87A2, 0xB202, 0x87A3, 0xB203, 0x87A4, + 0xB204, 0xB4A9, 0xB205, 0xB4AA, 0xB206, 0x87A5, 0xB207, 0x87A6, 0xB208, 0xB4AB, 0xB209, 0x87A7, 0xB20A, 0x87A8, 0xB20B, 0xB4AC, + 0xB20C, 0xB4AD, 0xB20D, 0x87A9, 0xB20E, 0x87AA, 0xB20F, 0x87AB, 0xB210, 0x87AC, 0xB211, 0x87AD, 0xB212, 0x87AE, 0xB213, 0x87AF, + 0xB214, 0xB4AE, 0xB215, 0xB4AF, 0xB216, 0x87B0, 0xB217, 0xB4B0, 0xB218, 0x87B1, 0xB219, 0xB4B1, 0xB21A, 0x87B2, 0xB21B, 0x87B3, + 0xB21C, 0x87B4, 0xB21D, 0x87B5, 0xB21E, 0x87B6, 0xB21F, 0x87B7, 0xB220, 0xB4B2, 0xB221, 0x87B8, 0xB222, 0x87B9, 0xB223, 0x87BA, + 0xB224, 0x87BB, 0xB225, 0x87BC, 0xB226, 0x87BD, 0xB227, 0x87BE, 0xB228, 0x87BF, 0xB229, 0x87C0, 0xB22A, 0x87C1, 0xB22B, 0x87C2, + 0xB22C, 0x87C3, 0xB22D, 0x87C4, 0xB22E, 0x87C5, 0xB22F, 0x87C6, 0xB230, 0x87C7, 0xB231, 0x87C8, 0xB232, 0x87C9, 0xB233, 0x87CA, + 0xB234, 0xB4B3, 0xB235, 0x87CB, 0xB236, 0x87CC, 0xB237, 0x87CD, 0xB238, 0x87CE, 0xB239, 0x87CF, 0xB23A, 0x87D0, 0xB23B, 0x87D1, + 0xB23C, 0xB4B4, 0xB23D, 0x87D2, 0xB23E, 0x87D3, 0xB23F, 0x87D4, 0xB240, 0x87D5, 0xB241, 0x87D6, 0xB242, 0x87D7, 0xB243, 0x87D8, + 0xB244, 0x87D9, 0xB245, 0x87DA, 0xB246, 0x87DB, 0xB247, 0x87DC, 0xB248, 0x87DD, 0xB249, 0x87DE, 0xB24A, 0x87DF, 0xB24B, 0x87E0, + 0xB24C, 0x87E1, 0xB24D, 0x87E2, 0xB24E, 0x87E3, 0xB24F, 0x87E4, 0xB250, 0x87E5, 0xB251, 0x87E6, 0xB252, 0x87E7, 0xB253, 0x87E8, + 0xB254, 0x87E9, 0xB255, 0x87EA, 0xB256, 0x87EB, 0xB257, 0x87EC, 0xB258, 0xB4B5, 0xB259, 0x87ED, 0xB25A, 0x87EE, 0xB25B, 0x87EF, + 0xB25C, 0xB4B6, 0xB25D, 0x87F0, 0xB25E, 0x87F1, 0xB25F, 0x87F2, 0xB260, 0xB4B7, 0xB261, 0x87F3, 0xB262, 0x87F4, 0xB263, 0x87F5, + 0xB264, 0x87F6, 0xB265, 0x87F7, 0xB266, 0x87F8, 0xB267, 0x87F9, 0xB268, 0xB4B8, 0xB269, 0xB4B9, 0xB26A, 0x87FA, 0xB26B, 0x87FB, + 0xB26C, 0x87FC, 0xB26D, 0x87FD, 0xB26E, 0x87FE, 0xB26F, 0x8841, 0xB270, 0x8842, 0xB271, 0x8843, 0xB272, 0x8844, 0xB273, 0x8845, + 0xB274, 0xB4BA, 0xB275, 0xB4BB, 0xB276, 0x8846, 0xB277, 0x8847, 0xB278, 0x8848, 0xB279, 0x8849, 0xB27A, 0x884A, 0xB27B, 0x884B, + 0xB27C, 0xB4BC, 0xB27D, 0x884C, 0xB27E, 0x884D, 0xB27F, 0x884E, 0xB280, 0x884F, 0xB281, 0x8850, 0xB282, 0x8851, 0xB283, 0x8852, + 0xB284, 0xB4BD, 0xB285, 0xB4BE, 0xB286, 0x8853, 0xB287, 0x8854, 0xB288, 0x8855, 0xB289, 0xB4BF, 0xB28A, 0x8856, 0xB28B, 0x8857, + 0xB28C, 0x8858, 0xB28D, 0x8859, 0xB28E, 0x885A, 0xB28F, 0x8861, 0xB290, 0xB4C0, 0xB291, 0xB4C1, 0xB292, 0x8862, 0xB293, 0x8863, + 0xB294, 0xB4C2, 0xB295, 0x8864, 0xB296, 0x8865, 0xB297, 0x8866, 0xB298, 0xB4C3, 0xB299, 0xB4C4, 0xB29A, 0xB4C5, 0xB29B, 0x8867, + 0xB29C, 0x8868, 0xB29D, 0x8869, 0xB29E, 0x886A, 0xB29F, 0x886B, 0xB2A0, 0xB4C6, 0xB2A1, 0xB4C7, 0xB2A2, 0x886C, 0xB2A3, 0xB4C8, + 0xB2A4, 0x886D, 0xB2A5, 0xB4C9, 0xB2A6, 0xB4CA, 0xB2A7, 0x886E, 0xB2A8, 0x886F, 0xB2A9, 0x8870, 0xB2AA, 0xB4CB, 0xB2AB, 0x8871, + 0xB2AC, 0xB4CC, 0xB2AD, 0x8872, 0xB2AE, 0x8873, 0xB2AF, 0x8874, 0xB2B0, 0xB4CD, 0xB2B1, 0x8875, 0xB2B2, 0x8876, 0xB2B3, 0x8877, + 0xB2B4, 0xB4CE, 0xB2B5, 0x8878, 0xB2B6, 0x8879, 0xB2B7, 0x887A, 0xB2B8, 0x8881, 0xB2B9, 0x8882, 0xB2BA, 0x8883, 0xB2BB, 0x8884, + 0xB2BC, 0x8885, 0xB2BD, 0x8886, 0xB2BE, 0x8887, 0xB2BF, 0x8888, 0xB2C0, 0x8889, 0xB2C1, 0x888A, 0xB2C2, 0x888B, 0xB2C3, 0x888C, + 0xB2C4, 0x888D, 0xB2C5, 0x888E, 0xB2C6, 0x888F, 0xB2C7, 0x8890, 0xB2C8, 0xB4CF, 0xB2C9, 0xB4D0, 0xB2CA, 0x8891, 0xB2CB, 0x8892, + 0xB2CC, 0xB4D1, 0xB2CD, 0x8893, 0xB2CE, 0x8894, 0xB2CF, 0x8895, 0xB2D0, 0xB4D2, 0xB2D1, 0x8896, 0xB2D2, 0xB4D3, 0xB2D3, 0x8897, + 0xB2D4, 0x8898, 0xB2D5, 0x8899, 0xB2D6, 0x889A, 0xB2D7, 0x889B, 0xB2D8, 0xB4D4, 0xB2D9, 0xB4D5, 0xB2DA, 0x889C, 0xB2DB, 0xB4D6, + 0xB2DC, 0x889D, 0xB2DD, 0xB4D7, 0xB2DE, 0x889E, 0xB2DF, 0x889F, 0xB2E0, 0x88A0, 0xB2E1, 0x88A1, 0xB2E2, 0xB4D8, 0xB2E3, 0x88A2, + 0xB2E4, 0xB4D9, 0xB2E5, 0xB4DA, 0xB2E6, 0xB4DB, 0xB2E7, 0x88A3, 0xB2E8, 0xB4DC, 0xB2E9, 0x88A4, 0xB2EA, 0x88A5, 0xB2EB, 0xB4DD, + 0xB2EC, 0xB4DE, 0xB2ED, 0xB4DF, 0xB2EE, 0xB4E0, 0xB2EF, 0xB4E1, 0xB2F0, 0x88A6, 0xB2F1, 0x88A7, 0xB2F2, 0x88A8, 0xB2F3, 0xB4E2, + 0xB2F4, 0xB4E3, 0xB2F5, 0xB4E4, 0xB2F6, 0x88A9, 0xB2F7, 0xB4E5, 0xB2F8, 0xB4E6, 0xB2F9, 0xB4E7, 0xB2FA, 0xB4E8, 0xB2FB, 0xB4E9, + 0xB2FC, 0x88AA, 0xB2FD, 0x88AB, 0xB2FE, 0x88AC, 0xB2FF, 0xB4EA, 0xB300, 0xB4EB, 0xB301, 0xB4EC, 0xB302, 0x88AD, 0xB303, 0x88AE, + 0xB304, 0xB4ED, 0xB305, 0x88AF, 0xB306, 0x88B0, 0xB307, 0x88B1, 0xB308, 0xB4EE, 0xB309, 0x88B2, 0xB30A, 0x88B3, 0xB30B, 0x88B4, + 0xB30C, 0x88B5, 0xB30D, 0x88B6, 0xB30E, 0x88B7, 0xB30F, 0x88B8, 0xB310, 0xB4EF, 0xB311, 0xB4F0, 0xB312, 0x88B9, 0xB313, 0xB4F1, + 0xB314, 0xB4F2, 0xB315, 0xB4F3, 0xB316, 0x88BA, 0xB317, 0x88BB, 0xB318, 0x88BC, 0xB319, 0x88BD, 0xB31A, 0x88BE, 0xB31B, 0x88BF, + 0xB31C, 0xB4F4, 0xB31D, 0x88C0, 0xB31E, 0x88C1, 0xB31F, 0x88C2, 0xB320, 0x88C3, 0xB321, 0x88C4, 0xB322, 0x88C5, 0xB323, 0x88C6, + 0xB324, 0x88C7, 0xB325, 0x88C8, 0xB326, 0x88C9, 0xB327, 0x88CA, 0xB328, 0x88CB, 0xB329, 0x88CC, 0xB32A, 0x88CD, 0xB32B, 0x88CE, + 0xB32C, 0x88CF, 0xB32D, 0x88D0, 0xB32E, 0x88D1, 0xB32F, 0x88D2, 0xB330, 0x88D3, 0xB331, 0x88D4, 0xB332, 0x88D5, 0xB333, 0x88D6, + 0xB334, 0x88D7, 0xB335, 0x88D8, 0xB336, 0x88D9, 0xB337, 0x88DA, 0xB338, 0x88DB, 0xB339, 0x88DC, 0xB33A, 0x88DD, 0xB33B, 0x88DE, + 0xB33C, 0x88DF, 0xB33D, 0x88E0, 0xB33E, 0x88E1, 0xB33F, 0x88E2, 0xB340, 0x88E3, 0xB341, 0x88E4, 0xB342, 0x88E5, 0xB343, 0x88E6, + 0xB344, 0x88E7, 0xB345, 0x88E8, 0xB346, 0x88E9, 0xB347, 0x88EA, 0xB348, 0x88EB, 0xB349, 0x88EC, 0xB34A, 0x88ED, 0xB34B, 0x88EE, + 0xB34C, 0x88EF, 0xB34D, 0x88F0, 0xB34E, 0x88F1, 0xB34F, 0x88F2, 0xB350, 0x88F3, 0xB351, 0x88F4, 0xB352, 0x88F5, 0xB353, 0x88F6, + 0xB354, 0xB4F5, 0xB355, 0xB4F6, 0xB356, 0xB4F7, 0xB357, 0x88F7, 0xB358, 0xB4F8, 0xB359, 0x88F8, 0xB35A, 0x88F9, 0xB35B, 0xB4F9, + 0xB35C, 0xB4FA, 0xB35D, 0x88FA, 0xB35E, 0xB4FB, 0xB35F, 0xB4FC, 0xB360, 0x88FB, 0xB361, 0x88FC, 0xB362, 0x88FD, 0xB363, 0x88FE, + 0xB364, 0xB4FD, 0xB365, 0xB4FE, 0xB366, 0x8941, 0xB367, 0xB5A1, 0xB368, 0x8942, 0xB369, 0xB5A2, 0xB36A, 0x8943, 0xB36B, 0xB5A3, + 0xB36C, 0x8944, 0xB36D, 0x8945, 0xB36E, 0xB5A4, 0xB36F, 0x8946, 0xB370, 0xB5A5, 0xB371, 0xB5A6, 0xB372, 0x8947, 0xB373, 0x8948, + 0xB374, 0xB5A7, 0xB375, 0x8949, 0xB376, 0x894A, 0xB377, 0x894B, 0xB378, 0xB5A8, 0xB379, 0x894C, 0xB37A, 0x894D, 0xB37B, 0x894E, + 0xB37C, 0x894F, 0xB37D, 0x8950, 0xB37E, 0x8951, 0xB37F, 0x8952, 0xB380, 0xB5A9, 0xB381, 0xB5AA, 0xB382, 0x8953, 0xB383, 0xB5AB, + 0xB384, 0xB5AC, 0xB385, 0xB5AD, 0xB386, 0x8954, 0xB387, 0x8955, 0xB388, 0x8956, 0xB389, 0x8957, 0xB38A, 0x8958, 0xB38B, 0x8959, + 0xB38C, 0xB5AE, 0xB38D, 0x895A, 0xB38E, 0x8961, 0xB38F, 0x8962, 0xB390, 0xB5AF, 0xB391, 0x8963, 0xB392, 0x8964, 0xB393, 0x8965, + 0xB394, 0xB5B0, 0xB395, 0x8966, 0xB396, 0x8967, 0xB397, 0x8968, 0xB398, 0x8969, 0xB399, 0x896A, 0xB39A, 0x896B, 0xB39B, 0x896C, + 0xB39C, 0x896D, 0xB39D, 0x896E, 0xB39E, 0x896F, 0xB39F, 0x8970, 0xB3A0, 0xB5B1, 0xB3A1, 0xB5B2, 0xB3A2, 0x8971, 0xB3A3, 0x8972, + 0xB3A4, 0x8973, 0xB3A5, 0x8974, 0xB3A6, 0x8975, 0xB3A7, 0x8976, 0xB3A8, 0xB5B3, 0xB3A9, 0x8977, 0xB3AA, 0x8978, 0xB3AB, 0x8979, + 0xB3AC, 0xB5B4, 0xB3AD, 0x897A, 0xB3AE, 0x8981, 0xB3AF, 0x8982, 0xB3B0, 0x8983, 0xB3B1, 0x8984, 0xB3B2, 0x8985, 0xB3B3, 0x8986, + 0xB3B4, 0x8987, 0xB3B5, 0x8988, 0xB3B6, 0x8989, 0xB3B7, 0x898A, 0xB3B8, 0x898B, 0xB3B9, 0x898C, 0xB3BA, 0x898D, 0xB3BB, 0x898E, + 0xB3BC, 0x898F, 0xB3BD, 0x8990, 0xB3BE, 0x8991, 0xB3BF, 0x8992, 0xB3C0, 0x8993, 0xB3C1, 0x8994, 0xB3C2, 0x8995, 0xB3C3, 0x8996, + 0xB3C4, 0xB5B5, 0xB3C5, 0xB5B6, 0xB3C6, 0x8997, 0xB3C7, 0x8998, 0xB3C8, 0xB5B7, 0xB3C9, 0x8999, 0xB3CA, 0x899A, 0xB3CB, 0xB5B8, + 0xB3CC, 0xB5B9, 0xB3CD, 0x899B, 0xB3CE, 0xB5BA, 0xB3CF, 0x899C, 0xB3D0, 0xB5BB, 0xB3D1, 0x899D, 0xB3D2, 0x899E, 0xB3D3, 0x899F, + 0xB3D4, 0xB5BC, 0xB3D5, 0xB5BD, 0xB3D6, 0x89A0, 0xB3D7, 0xB5BE, 0xB3D8, 0x89A1, 0xB3D9, 0xB5BF, 0xB3DA, 0x89A2, 0xB3DB, 0xB5C0, + 0xB3DC, 0x89A3, 0xB3DD, 0xB5C1, 0xB3DE, 0x89A4, 0xB3DF, 0x89A5, 0xB3E0, 0xB5C2, 0xB3E1, 0x89A6, 0xB3E2, 0x89A7, 0xB3E3, 0x89A8, + 0xB3E4, 0xB5C3, 0xB3E5, 0x89A9, 0xB3E6, 0x89AA, 0xB3E7, 0x89AB, 0xB3E8, 0xB5C4, 0xB3E9, 0x89AC, 0xB3EA, 0x89AD, 0xB3EB, 0x89AE, + 0xB3EC, 0x89AF, 0xB3ED, 0x89B0, 0xB3EE, 0x89B1, 0xB3EF, 0x89B2, 0xB3F0, 0x89B3, 0xB3F1, 0x89B4, 0xB3F2, 0x89B5, 0xB3F3, 0x89B6, + 0xB3F4, 0x89B7, 0xB3F5, 0x89B8, 0xB3F6, 0x89B9, 0xB3F7, 0x89BA, 0xB3F8, 0x89BB, 0xB3F9, 0x89BC, 0xB3FA, 0x89BD, 0xB3FB, 0x89BE, + 0xB3FC, 0xB5C5, 0xB3FD, 0x89BF, 0xB3FE, 0x89C0, 0xB3FF, 0x89C1, 0xB400, 0x89C2, 0xB401, 0x89C3, 0xB402, 0x89C4, 0xB403, 0x89C5, + 0xB404, 0x89C6, 0xB405, 0x89C7, 0xB406, 0x89C8, 0xB407, 0x89C9, 0xB408, 0x89CA, 0xB409, 0x89CB, 0xB40A, 0x89CC, 0xB40B, 0x89CD, + 0xB40C, 0x89CE, 0xB40D, 0x89CF, 0xB40E, 0x89D0, 0xB40F, 0x89D1, 0xB410, 0xB5C6, 0xB411, 0x89D2, 0xB412, 0x89D3, 0xB413, 0x89D4, + 0xB414, 0x89D5, 0xB415, 0x89D6, 0xB416, 0x89D7, 0xB417, 0x89D8, 0xB418, 0xB5C7, 0xB419, 0x89D9, 0xB41A, 0x89DA, 0xB41B, 0x89DB, + 0xB41C, 0xB5C8, 0xB41D, 0x89DC, 0xB41E, 0x89DD, 0xB41F, 0x89DE, 0xB420, 0xB5C9, 0xB421, 0x89DF, 0xB422, 0x89E0, 0xB423, 0x89E1, + 0xB424, 0x89E2, 0xB425, 0x89E3, 0xB426, 0x89E4, 0xB427, 0x89E5, 0xB428, 0xB5CA, 0xB429, 0xB5CB, 0xB42A, 0x89E6, 0xB42B, 0xB5CC, + 0xB42C, 0x89E7, 0xB42D, 0x89E8, 0xB42E, 0x89E9, 0xB42F, 0x89EA, 0xB430, 0x89EB, 0xB431, 0x89EC, 0xB432, 0x89ED, 0xB433, 0x89EE, + 0xB434, 0xB5CD, 0xB435, 0x89EF, 0xB436, 0x89F0, 0xB437, 0x89F1, 0xB438, 0x89F2, 0xB439, 0x89F3, 0xB43A, 0x89F4, 0xB43B, 0x89F5, + 0xB43C, 0x89F6, 0xB43D, 0x89F7, 0xB43E, 0x89F8, 0xB43F, 0x89F9, 0xB440, 0x89FA, 0xB441, 0x89FB, 0xB442, 0x89FC, 0xB443, 0x89FD, + 0xB444, 0x89FE, 0xB445, 0x8A41, 0xB446, 0x8A42, 0xB447, 0x8A43, 0xB448, 0x8A44, 0xB449, 0x8A45, 0xB44A, 0x8A46, 0xB44B, 0x8A47, + 0xB44C, 0x8A48, 0xB44D, 0x8A49, 0xB44E, 0x8A4A, 0xB44F, 0x8A4B, 0xB450, 0xB5CE, 0xB451, 0xB5CF, 0xB452, 0x8A4C, 0xB453, 0x8A4D, + 0xB454, 0xB5D0, 0xB455, 0x8A4E, 0xB456, 0x8A4F, 0xB457, 0x8A50, 0xB458, 0xB5D1, 0xB459, 0x8A51, 0xB45A, 0x8A52, 0xB45B, 0x8A53, + 0xB45C, 0x8A54, 0xB45D, 0x8A55, 0xB45E, 0x8A56, 0xB45F, 0x8A57, 0xB460, 0xB5D2, 0xB461, 0xB5D3, 0xB462, 0x8A58, 0xB463, 0xB5D4, + 0xB464, 0x8A59, 0xB465, 0xB5D5, 0xB466, 0x8A5A, 0xB467, 0x8A61, 0xB468, 0x8A62, 0xB469, 0x8A63, 0xB46A, 0x8A64, 0xB46B, 0x8A65, + 0xB46C, 0xB5D6, 0xB46D, 0x8A66, 0xB46E, 0x8A67, 0xB46F, 0x8A68, 0xB470, 0x8A69, 0xB471, 0x8A6A, 0xB472, 0x8A6B, 0xB473, 0x8A6C, + 0xB474, 0x8A6D, 0xB475, 0x8A6E, 0xB476, 0x8A6F, 0xB477, 0x8A70, 0xB478, 0x8A71, 0xB479, 0x8A72, 0xB47A, 0x8A73, 0xB47B, 0x8A74, + 0xB47C, 0x8A75, 0xB47D, 0x8A76, 0xB47E, 0x8A77, 0xB47F, 0x8A78, 0xB480, 0xB5D7, 0xB481, 0x8A79, 0xB482, 0x8A7A, 0xB483, 0x8A81, + 0xB484, 0x8A82, 0xB485, 0x8A83, 0xB486, 0x8A84, 0xB487, 0x8A85, 0xB488, 0xB5D8, 0xB489, 0x8A86, 0xB48A, 0x8A87, 0xB48B, 0x8A88, + 0xB48C, 0x8A89, 0xB48D, 0x8A8A, 0xB48E, 0x8A8B, 0xB48F, 0x8A8C, 0xB490, 0x8A8D, 0xB491, 0x8A8E, 0xB492, 0x8A8F, 0xB493, 0x8A90, + 0xB494, 0x8A91, 0xB495, 0x8A92, 0xB496, 0x8A93, 0xB497, 0x8A94, 0xB498, 0x8A95, 0xB499, 0x8A96, 0xB49A, 0x8A97, 0xB49B, 0x8A98, + 0xB49C, 0x8A99, 0xB49D, 0xB5D9, 0xB49E, 0x8A9A, 0xB49F, 0x8A9B, 0xB4A0, 0x8A9C, 0xB4A1, 0x8A9D, 0xB4A2, 0x8A9E, 0xB4A3, 0x8A9F, + 0xB4A4, 0xB5DA, 0xB4A5, 0x8AA0, 0xB4A6, 0x8AA1, 0xB4A7, 0x8AA2, 0xB4A8, 0xB5DB, 0xB4A9, 0x8AA3, 0xB4AA, 0x8AA4, 0xB4AB, 0x8AA5, + 0xB4AC, 0xB5DC, 0xB4AD, 0x8AA6, 0xB4AE, 0x8AA7, 0xB4AF, 0x8AA8, 0xB4B0, 0x8AA9, 0xB4B1, 0x8AAA, 0xB4B2, 0x8AAB, 0xB4B3, 0x8AAC, + 0xB4B4, 0x8AAD, 0xB4B5, 0xB5DD, 0xB4B6, 0x8AAE, 0xB4B7, 0xB5DE, 0xB4B8, 0x8AAF, 0xB4B9, 0xB5DF, 0xB4BA, 0x8AB0, 0xB4BB, 0x8AB1, + 0xB4BC, 0x8AB2, 0xB4BD, 0x8AB3, 0xB4BE, 0x8AB4, 0xB4BF, 0x8AB5, 0xB4C0, 0xB5E0, 0xB4C1, 0x8AB6, 0xB4C2, 0x8AB7, 0xB4C3, 0x8AB8, + 0xB4C4, 0xB5E1, 0xB4C5, 0x8AB9, 0xB4C6, 0x8ABA, 0xB4C7, 0x8ABB, 0xB4C8, 0xB5E2, 0xB4C9, 0x8ABC, 0xB4CA, 0x8ABD, 0xB4CB, 0x8ABE, + 0xB4CC, 0x8ABF, 0xB4CD, 0x8AC0, 0xB4CE, 0x8AC1, 0xB4CF, 0x8AC2, 0xB4D0, 0xB5E3, 0xB4D1, 0x8AC3, 0xB4D2, 0x8AC4, 0xB4D3, 0x8AC5, + 0xB4D4, 0x8AC6, 0xB4D5, 0xB5E4, 0xB4D6, 0x8AC7, 0xB4D7, 0x8AC8, 0xB4D8, 0x8AC9, 0xB4D9, 0x8ACA, 0xB4DA, 0x8ACB, 0xB4DB, 0x8ACC, + 0xB4DC, 0xB5E5, 0xB4DD, 0xB5E6, 0xB4DE, 0x8ACD, 0xB4DF, 0x8ACE, 0xB4E0, 0xB5E7, 0xB4E1, 0x8ACF, 0xB4E2, 0x8AD0, 0xB4E3, 0xB5E8, + 0xB4E4, 0xB5E9, 0xB4E5, 0x8AD1, 0xB4E6, 0xB5EA, 0xB4E7, 0x8AD2, 0xB4E8, 0x8AD3, 0xB4E9, 0x8AD4, 0xB4EA, 0x8AD5, 0xB4EB, 0x8AD6, + 0xB4EC, 0xB5EB, 0xB4ED, 0xB5EC, 0xB4EE, 0x8AD7, 0xB4EF, 0xB5ED, 0xB4F0, 0x8AD8, 0xB4F1, 0xB5EE, 0xB4F2, 0x8AD9, 0xB4F3, 0x8ADA, + 0xB4F4, 0x8ADB, 0xB4F5, 0x8ADC, 0xB4F6, 0x8ADD, 0xB4F7, 0x8ADE, 0xB4F8, 0xB5EF, 0xB4F9, 0x8ADF, 0xB4FA, 0x8AE0, 0xB4FB, 0x8AE1, + 0xB4FC, 0x8AE2, 0xB4FD, 0x8AE3, 0xB4FE, 0x8AE4, 0xB4FF, 0x8AE5, 0xB500, 0x8AE6, 0xB501, 0x8AE7, 0xB502, 0x8AE8, 0xB503, 0x8AE9, + 0xB504, 0x8AEA, 0xB505, 0x8AEB, 0xB506, 0x8AEC, 0xB507, 0x8AED, 0xB508, 0x8AEE, 0xB509, 0x8AEF, 0xB50A, 0x8AF0, 0xB50B, 0x8AF1, + 0xB50C, 0x8AF2, 0xB50D, 0x8AF3, 0xB50E, 0x8AF4, 0xB50F, 0x8AF5, 0xB510, 0x8AF6, 0xB511, 0x8AF7, 0xB512, 0x8AF8, 0xB513, 0x8AF9, + 0xB514, 0xB5F0, 0xB515, 0xB5F1, 0xB516, 0x8AFA, 0xB517, 0x8AFB, 0xB518, 0xB5F2, 0xB519, 0x8AFC, 0xB51A, 0x8AFD, 0xB51B, 0xB5F3, + 0xB51C, 0xB5F4, 0xB51D, 0x8AFE, 0xB51E, 0x8B41, 0xB51F, 0x8B42, 0xB520, 0x8B43, 0xB521, 0x8B44, 0xB522, 0x8B45, 0xB523, 0x8B46, + 0xB524, 0xB5F5, 0xB525, 0xB5F6, 0xB526, 0x8B47, 0xB527, 0xB5F7, 0xB528, 0xB5F8, 0xB529, 0xB5F9, 0xB52A, 0xB5FA, 0xB52B, 0x8B48, + 0xB52C, 0x8B49, 0xB52D, 0x8B4A, 0xB52E, 0x8B4B, 0xB52F, 0x8B4C, 0xB530, 0xB5FB, 0xB531, 0xB5FC, 0xB532, 0x8B4D, 0xB533, 0x8B4E, + 0xB534, 0xB5FD, 0xB535, 0x8B4F, 0xB536, 0x8B50, 0xB537, 0x8B51, 0xB538, 0xB5FE, 0xB539, 0x8B52, 0xB53A, 0x8B53, 0xB53B, 0x8B54, + 0xB53C, 0x8B55, 0xB53D, 0x8B56, 0xB53E, 0x8B57, 0xB53F, 0x8B58, 0xB540, 0xB6A1, 0xB541, 0xB6A2, 0xB542, 0x8B59, 0xB543, 0xB6A3, + 0xB544, 0xB6A4, 0xB545, 0xB6A5, 0xB546, 0x8B5A, 0xB547, 0x8B61, 0xB548, 0x8B62, 0xB549, 0x8B63, 0xB54A, 0x8B64, 0xB54B, 0xB6A6, + 0xB54C, 0xB6A7, 0xB54D, 0xB6A8, 0xB54E, 0x8B65, 0xB54F, 0x8B66, 0xB550, 0xB6A9, 0xB551, 0x8B67, 0xB552, 0x8B68, 0xB553, 0x8B69, + 0xB554, 0xB6AA, 0xB555, 0x8B6A, 0xB556, 0x8B6B, 0xB557, 0x8B6C, 0xB558, 0x8B6D, 0xB559, 0x8B6E, 0xB55A, 0x8B6F, 0xB55B, 0x8B70, + 0xB55C, 0xB6AB, 0xB55D, 0xB6AC, 0xB55E, 0x8B71, 0xB55F, 0xB6AD, 0xB560, 0xB6AE, 0xB561, 0xB6AF, 0xB562, 0x8B72, 0xB563, 0x8B73, + 0xB564, 0x8B74, 0xB565, 0x8B75, 0xB566, 0x8B76, 0xB567, 0x8B77, 0xB568, 0x8B78, 0xB569, 0x8B79, 0xB56A, 0x8B7A, 0xB56B, 0x8B81, + 0xB56C, 0x8B82, 0xB56D, 0x8B83, 0xB56E, 0x8B84, 0xB56F, 0x8B85, 0xB570, 0x8B86, 0xB571, 0x8B87, 0xB572, 0x8B88, 0xB573, 0x8B89, + 0xB574, 0x8B8A, 0xB575, 0x8B8B, 0xB576, 0x8B8C, 0xB577, 0x8B8D, 0xB578, 0x8B8E, 0xB579, 0x8B8F, 0xB57A, 0x8B90, 0xB57B, 0x8B91, + 0xB57C, 0x8B92, 0xB57D, 0x8B93, 0xB57E, 0x8B94, 0xB57F, 0x8B95, 0xB580, 0x8B96, 0xB581, 0x8B97, 0xB582, 0x8B98, 0xB583, 0x8B99, + 0xB584, 0x8B9A, 0xB585, 0x8B9B, 0xB586, 0x8B9C, 0xB587, 0x8B9D, 0xB588, 0x8B9E, 0xB589, 0x8B9F, 0xB58A, 0x8BA0, 0xB58B, 0x8BA1, + 0xB58C, 0x8BA2, 0xB58D, 0x8BA3, 0xB58E, 0x8BA4, 0xB58F, 0x8BA5, 0xB590, 0x8BA6, 0xB591, 0x8BA7, 0xB592, 0x8BA8, 0xB593, 0x8BA9, + 0xB594, 0x8BAA, 0xB595, 0x8BAB, 0xB596, 0x8BAC, 0xB597, 0x8BAD, 0xB598, 0x8BAE, 0xB599, 0x8BAF, 0xB59A, 0x8BB0, 0xB59B, 0x8BB1, + 0xB59C, 0x8BB2, 0xB59D, 0x8BB3, 0xB59E, 0x8BB4, 0xB59F, 0x8BB5, 0xB5A0, 0xB6B0, 0xB5A1, 0xB6B1, 0xB5A2, 0x8BB6, 0xB5A3, 0x8BB7, + 0xB5A4, 0xB6B2, 0xB5A5, 0x8BB8, 0xB5A6, 0x8BB9, 0xB5A7, 0x8BBA, 0xB5A8, 0xB6B3, 0xB5A9, 0x8BBB, 0xB5AA, 0xB6B4, 0xB5AB, 0xB6B5, + 0xB5AC, 0x8BBC, 0xB5AD, 0x8BBD, 0xB5AE, 0x8BBE, 0xB5AF, 0x8BBF, 0xB5B0, 0xB6B6, 0xB5B1, 0xB6B7, 0xB5B2, 0x8BC0, 0xB5B3, 0xB6B8, + 0xB5B4, 0xB6B9, 0xB5B5, 0xB6BA, 0xB5B6, 0x8BC1, 0xB5B7, 0x8BC2, 0xB5B8, 0x8BC3, 0xB5B9, 0x8BC4, 0xB5BA, 0x8BC5, 0xB5BB, 0xB6BB, + 0xB5BC, 0xB6BC, 0xB5BD, 0xB6BD, 0xB5BE, 0x8BC6, 0xB5BF, 0x8BC7, 0xB5C0, 0xB6BE, 0xB5C1, 0x8BC8, 0xB5C2, 0x8BC9, 0xB5C3, 0x8BCA, + 0xB5C4, 0xB6BF, 0xB5C5, 0x8BCB, 0xB5C6, 0x8BCC, 0xB5C7, 0x8BCD, 0xB5C8, 0x8BCE, 0xB5C9, 0x8BCF, 0xB5CA, 0x8BD0, 0xB5CB, 0x8BD1, + 0xB5CC, 0xB6C0, 0xB5CD, 0xB6C1, 0xB5CE, 0x8BD2, 0xB5CF, 0xB6C2, 0xB5D0, 0xB6C3, 0xB5D1, 0xB6C4, 0xB5D2, 0x8BD3, 0xB5D3, 0x8BD4, + 0xB5D4, 0x8BD5, 0xB5D5, 0x8BD6, 0xB5D6, 0x8BD7, 0xB5D7, 0x8BD8, 0xB5D8, 0xB6C5, 0xB5D9, 0x8BD9, 0xB5DA, 0x8BDA, 0xB5DB, 0x8BDB, + 0xB5DC, 0x8BDC, 0xB5DD, 0x8BDD, 0xB5DE, 0x8BDE, 0xB5DF, 0x8BDF, 0xB5E0, 0x8BE0, 0xB5E1, 0x8BE1, 0xB5E2, 0x8BE2, 0xB5E3, 0x8BE3, + 0xB5E4, 0x8BE4, 0xB5E5, 0x8BE5, 0xB5E6, 0x8BE6, 0xB5E7, 0x8BE7, 0xB5E8, 0x8BE8, 0xB5E9, 0x8BE9, 0xB5EA, 0x8BEA, 0xB5EB, 0x8BEB, + 0xB5EC, 0xB6C6, 0xB5ED, 0x8BEC, 0xB5EE, 0x8BED, 0xB5EF, 0x8BEE, 0xB5F0, 0x8BEF, 0xB5F1, 0x8BF0, 0xB5F2, 0x8BF1, 0xB5F3, 0x8BF2, + 0xB5F4, 0x8BF3, 0xB5F5, 0x8BF4, 0xB5F6, 0x8BF5, 0xB5F7, 0x8BF6, 0xB5F8, 0x8BF7, 0xB5F9, 0x8BF8, 0xB5FA, 0x8BF9, 0xB5FB, 0x8BFA, + 0xB5FC, 0x8BFB, 0xB5FD, 0x8BFC, 0xB5FE, 0x8BFD, 0xB5FF, 0x8BFE, 0xB600, 0x8C41, 0xB601, 0x8C42, 0xB602, 0x8C43, 0xB603, 0x8C44, + 0xB604, 0x8C45, 0xB605, 0x8C46, 0xB606, 0x8C47, 0xB607, 0x8C48, 0xB608, 0x8C49, 0xB609, 0x8C4A, 0xB60A, 0x8C4B, 0xB60B, 0x8C4C, + 0xB60C, 0x8C4D, 0xB60D, 0x8C4E, 0xB60E, 0x8C4F, 0xB60F, 0x8C50, 0xB610, 0xB6C7, 0xB611, 0xB6C8, 0xB612, 0x8C51, 0xB613, 0x8C52, + 0xB614, 0xB6C9, 0xB615, 0x8C53, 0xB616, 0x8C54, 0xB617, 0x8C55, 0xB618, 0xB6CA, 0xB619, 0x8C56, 0xB61A, 0x8C57, 0xB61B, 0x8C58, + 0xB61C, 0x8C59, 0xB61D, 0x8C5A, 0xB61E, 0x8C61, 0xB61F, 0x8C62, 0xB620, 0x8C63, 0xB621, 0x8C64, 0xB622, 0x8C65, 0xB623, 0x8C66, + 0xB624, 0x8C67, 0xB625, 0xB6CB, 0xB626, 0x8C68, 0xB627, 0x8C69, 0xB628, 0x8C6A, 0xB629, 0x8C6B, 0xB62A, 0x8C6C, 0xB62B, 0x8C6D, + 0xB62C, 0xB6CC, 0xB62D, 0x8C6E, 0xB62E, 0x8C6F, 0xB62F, 0x8C70, 0xB630, 0x8C71, 0xB631, 0x8C72, 0xB632, 0x8C73, 0xB633, 0x8C74, + 0xB634, 0xB6CD, 0xB635, 0x8C75, 0xB636, 0x8C76, 0xB637, 0x8C77, 0xB638, 0x8C78, 0xB639, 0x8C79, 0xB63A, 0x8C7A, 0xB63B, 0x8C81, + 0xB63C, 0x8C82, 0xB63D, 0x8C83, 0xB63E, 0x8C84, 0xB63F, 0x8C85, 0xB640, 0x8C86, 0xB641, 0x8C87, 0xB642, 0x8C88, 0xB643, 0x8C89, + 0xB644, 0x8C8A, 0xB645, 0x8C8B, 0xB646, 0x8C8C, 0xB647, 0x8C8D, 0xB648, 0xB6CE, 0xB649, 0x8C8E, 0xB64A, 0x8C8F, 0xB64B, 0x8C90, + 0xB64C, 0x8C91, 0xB64D, 0x8C92, 0xB64E, 0x8C93, 0xB64F, 0x8C94, 0xB650, 0x8C95, 0xB651, 0x8C96, 0xB652, 0x8C97, 0xB653, 0x8C98, + 0xB654, 0x8C99, 0xB655, 0x8C9A, 0xB656, 0x8C9B, 0xB657, 0x8C9C, 0xB658, 0x8C9D, 0xB659, 0x8C9E, 0xB65A, 0x8C9F, 0xB65B, 0x8CA0, + 0xB65C, 0x8CA1, 0xB65D, 0x8CA2, 0xB65E, 0x8CA3, 0xB65F, 0x8CA4, 0xB660, 0x8CA5, 0xB661, 0x8CA6, 0xB662, 0x8CA7, 0xB663, 0x8CA8, + 0xB664, 0xB6CF, 0xB665, 0x8CA9, 0xB666, 0x8CAA, 0xB667, 0x8CAB, 0xB668, 0xB6D0, 0xB669, 0x8CAC, 0xB66A, 0x8CAD, 0xB66B, 0x8CAE, + 0xB66C, 0x8CAF, 0xB66D, 0x8CB0, 0xB66E, 0x8CB1, 0xB66F, 0x8CB2, 0xB670, 0x8CB3, 0xB671, 0x8CB4, 0xB672, 0x8CB5, 0xB673, 0x8CB6, + 0xB674, 0x8CB7, 0xB675, 0x8CB8, 0xB676, 0x8CB9, 0xB677, 0x8CBA, 0xB678, 0x8CBB, 0xB679, 0x8CBC, 0xB67A, 0x8CBD, 0xB67B, 0x8CBE, + 0xB67C, 0x8CBF, 0xB67D, 0x8CC0, 0xB67E, 0x8CC1, 0xB67F, 0x8CC2, 0xB680, 0x8CC3, 0xB681, 0x8CC4, 0xB682, 0x8CC5, 0xB683, 0x8CC6, + 0xB684, 0x8CC7, 0xB685, 0x8CC8, 0xB686, 0x8CC9, 0xB687, 0x8CCA, 0xB688, 0x8CCB, 0xB689, 0x8CCC, 0xB68A, 0x8CCD, 0xB68B, 0x8CCE, + 0xB68C, 0x8CCF, 0xB68D, 0x8CD0, 0xB68E, 0x8CD1, 0xB68F, 0x8CD2, 0xB690, 0x8CD3, 0xB691, 0x8CD4, 0xB692, 0x8CD5, 0xB693, 0x8CD6, + 0xB694, 0x8CD7, 0xB695, 0x8CD8, 0xB696, 0x8CD9, 0xB697, 0x8CDA, 0xB698, 0x8CDB, 0xB699, 0x8CDC, 0xB69A, 0x8CDD, 0xB69B, 0x8CDE, + 0xB69C, 0xB6D1, 0xB69D, 0xB6D2, 0xB69E, 0x8CDF, 0xB69F, 0x8CE0, 0xB6A0, 0xB6D3, 0xB6A1, 0x8CE1, 0xB6A2, 0x8CE2, 0xB6A3, 0x8CE3, + 0xB6A4, 0xB6D4, 0xB6A5, 0x8CE4, 0xB6A6, 0x8CE5, 0xB6A7, 0x8CE6, 0xB6A8, 0x8CE7, 0xB6A9, 0x8CE8, 0xB6AA, 0x8CE9, 0xB6AB, 0xB6D5, + 0xB6AC, 0xB6D6, 0xB6AD, 0x8CEA, 0xB6AE, 0x8CEB, 0xB6AF, 0x8CEC, 0xB6B0, 0x8CED, 0xB6B1, 0xB6D7, 0xB6B2, 0x8CEE, 0xB6B3, 0x8CEF, + 0xB6B4, 0x8CF0, 0xB6B5, 0x8CF1, 0xB6B6, 0x8CF2, 0xB6B7, 0x8CF3, 0xB6B8, 0x8CF4, 0xB6B9, 0x8CF5, 0xB6BA, 0x8CF6, 0xB6BB, 0x8CF7, + 0xB6BC, 0x8CF8, 0xB6BD, 0x8CF9, 0xB6BE, 0x8CFA, 0xB6BF, 0x8CFB, 0xB6C0, 0x8CFC, 0xB6C1, 0x8CFD, 0xB6C2, 0x8CFE, 0xB6C3, 0x8D41, + 0xB6C4, 0x8D42, 0xB6C5, 0x8D43, 0xB6C6, 0x8D44, 0xB6C7, 0x8D45, 0xB6C8, 0x8D46, 0xB6C9, 0x8D47, 0xB6CA, 0x8D48, 0xB6CB, 0x8D49, + 0xB6CC, 0x8D4A, 0xB6CD, 0x8D4B, 0xB6CE, 0x8D4C, 0xB6CF, 0x8D4D, 0xB6D0, 0x8D4E, 0xB6D1, 0x8D4F, 0xB6D2, 0x8D50, 0xB6D3, 0x8D51, + 0xB6D4, 0xB6D8, 0xB6D5, 0x8D52, 0xB6D6, 0x8D53, 0xB6D7, 0x8D54, 0xB6D8, 0x8D55, 0xB6D9, 0x8D56, 0xB6DA, 0x8D57, 0xB6DB, 0x8D58, + 0xB6DC, 0x8D59, 0xB6DD, 0x8D5A, 0xB6DE, 0x8D61, 0xB6DF, 0x8D62, 0xB6E0, 0x8D63, 0xB6E1, 0x8D64, 0xB6E2, 0x8D65, 0xB6E3, 0x8D66, + 0xB6E4, 0x8D67, 0xB6E5, 0x8D68, 0xB6E6, 0x8D69, 0xB6E7, 0x8D6A, 0xB6E8, 0x8D6B, 0xB6E9, 0x8D6C, 0xB6EA, 0x8D6D, 0xB6EB, 0x8D6E, + 0xB6EC, 0x8D6F, 0xB6ED, 0x8D70, 0xB6EE, 0x8D71, 0xB6EF, 0x8D72, 0xB6F0, 0xB6D9, 0xB6F1, 0x8D73, 0xB6F2, 0x8D74, 0xB6F3, 0x8D75, + 0xB6F4, 0xB6DA, 0xB6F5, 0x8D76, 0xB6F6, 0x8D77, 0xB6F7, 0x8D78, 0xB6F8, 0xB6DB, 0xB6F9, 0x8D79, 0xB6FA, 0x8D7A, 0xB6FB, 0x8D81, + 0xB6FC, 0x8D82, 0xB6FD, 0x8D83, 0xB6FE, 0x8D84, 0xB6FF, 0x8D85, 0xB700, 0xB6DC, 0xB701, 0xB6DD, 0xB702, 0x8D86, 0xB703, 0x8D87, + 0xB704, 0x8D88, 0xB705, 0xB6DE, 0xB706, 0x8D89, 0xB707, 0x8D8A, 0xB708, 0x8D8B, 0xB709, 0x8D8C, 0xB70A, 0x8D8D, 0xB70B, 0x8D8E, + 0xB70C, 0x8D8F, 0xB70D, 0x8D90, 0xB70E, 0x8D91, 0xB70F, 0x8D92, 0xB710, 0x8D93, 0xB711, 0x8D94, 0xB712, 0x8D95, 0xB713, 0x8D96, + 0xB714, 0x8D97, 0xB715, 0x8D98, 0xB716, 0x8D99, 0xB717, 0x8D9A, 0xB718, 0x8D9B, 0xB719, 0x8D9C, 0xB71A, 0x8D9D, 0xB71B, 0x8D9E, + 0xB71C, 0x8D9F, 0xB71D, 0x8DA0, 0xB71E, 0x8DA1, 0xB71F, 0x8DA2, 0xB720, 0x8DA3, 0xB721, 0x8DA4, 0xB722, 0x8DA5, 0xB723, 0x8DA6, + 0xB724, 0x8DA7, 0xB725, 0x8DA8, 0xB726, 0x8DA9, 0xB727, 0x8DAA, 0xB728, 0xB6DF, 0xB729, 0xB6E0, 0xB72A, 0x8DAB, 0xB72B, 0x8DAC, + 0xB72C, 0xB6E1, 0xB72D, 0x8DAD, 0xB72E, 0x8DAE, 0xB72F, 0xB6E2, 0xB730, 0xB6E3, 0xB731, 0x8DAF, 0xB732, 0x8DB0, 0xB733, 0x8DB1, + 0xB734, 0x8DB2, 0xB735, 0x8DB3, 0xB736, 0x8DB4, 0xB737, 0x8DB5, 0xB738, 0xB6E4, 0xB739, 0xB6E5, 0xB73A, 0x8DB6, 0xB73B, 0xB6E6, + 0xB73C, 0x8DB7, 0xB73D, 0x8DB8, 0xB73E, 0x8DB9, 0xB73F, 0x8DBA, 0xB740, 0x8DBB, 0xB741, 0x8DBC, 0xB742, 0x8DBD, 0xB743, 0x8DBE, + 0xB744, 0xB6E7, 0xB745, 0x8DBF, 0xB746, 0x8DC0, 0xB747, 0x8DC1, 0xB748, 0xB6E8, 0xB749, 0x8DC2, 0xB74A, 0x8DC3, 0xB74B, 0x8DC4, + 0xB74C, 0xB6E9, 0xB74D, 0x8DC5, 0xB74E, 0x8DC6, 0xB74F, 0x8DC7, 0xB750, 0x8DC8, 0xB751, 0x8DC9, 0xB752, 0x8DCA, 0xB753, 0x8DCB, + 0xB754, 0xB6EA, 0xB755, 0xB6EB, 0xB756, 0x8DCC, 0xB757, 0x8DCD, 0xB758, 0x8DCE, 0xB759, 0x8DCF, 0xB75A, 0x8DD0, 0xB75B, 0x8DD1, + 0xB75C, 0x8DD2, 0xB75D, 0x8DD3, 0xB75E, 0x8DD4, 0xB75F, 0x8DD5, 0xB760, 0xB6EC, 0xB761, 0x8DD6, 0xB762, 0x8DD7, 0xB763, 0x8DD8, + 0xB764, 0xB6ED, 0xB765, 0x8DD9, 0xB766, 0x8DDA, 0xB767, 0x8DDB, 0xB768, 0xB6EE, 0xB769, 0x8DDC, 0xB76A, 0x8DDD, 0xB76B, 0x8DDE, + 0xB76C, 0x8DDF, 0xB76D, 0x8DE0, 0xB76E, 0x8DE1, 0xB76F, 0x8DE2, 0xB770, 0xB6EF, 0xB771, 0xB6F0, 0xB772, 0x8DE3, 0xB773, 0xB6F1, + 0xB774, 0x8DE4, 0xB775, 0xB6F2, 0xB776, 0x8DE5, 0xB777, 0x8DE6, 0xB778, 0x8DE7, 0xB779, 0x8DE8, 0xB77A, 0x8DE9, 0xB77B, 0x8DEA, + 0xB77C, 0xB6F3, 0xB77D, 0xB6F4, 0xB77E, 0x8DEB, 0xB77F, 0x8DEC, 0xB780, 0xB6F5, 0xB781, 0x8DED, 0xB782, 0x8DEE, 0xB783, 0x8DEF, + 0xB784, 0xB6F6, 0xB785, 0x8DF0, 0xB786, 0x8DF1, 0xB787, 0x8DF2, 0xB788, 0x8DF3, 0xB789, 0x8DF4, 0xB78A, 0x8DF5, 0xB78B, 0x8DF6, + 0xB78C, 0xB6F7, 0xB78D, 0xB6F8, 0xB78E, 0x8DF7, 0xB78F, 0xB6F9, 0xB790, 0xB6FA, 0xB791, 0xB6FB, 0xB792, 0xB6FC, 0xB793, 0x8DF8, + 0xB794, 0x8DF9, 0xB795, 0x8DFA, 0xB796, 0xB6FD, 0xB797, 0xB6FE, 0xB798, 0xB7A1, 0xB799, 0xB7A2, 0xB79A, 0x8DFB, 0xB79B, 0x8DFC, + 0xB79C, 0xB7A3, 0xB79D, 0x8DFD, 0xB79E, 0x8DFE, 0xB79F, 0x8E41, 0xB7A0, 0xB7A4, 0xB7A1, 0x8E42, 0xB7A2, 0x8E43, 0xB7A3, 0x8E44, + 0xB7A4, 0x8E45, 0xB7A5, 0x8E46, 0xB7A6, 0x8E47, 0xB7A7, 0x8E48, 0xB7A8, 0xB7A5, 0xB7A9, 0xB7A6, 0xB7AA, 0x8E49, 0xB7AB, 0xB7A7, + 0xB7AC, 0xB7A8, 0xB7AD, 0xB7A9, 0xB7AE, 0x8E4A, 0xB7AF, 0x8E4B, 0xB7B0, 0x8E4C, 0xB7B1, 0x8E4D, 0xB7B2, 0x8E4E, 0xB7B3, 0x8E4F, + 0xB7B4, 0xB7AA, 0xB7B5, 0xB7AB, 0xB7B6, 0x8E50, 0xB7B7, 0x8E51, 0xB7B8, 0xB7AC, 0xB7B9, 0x8E52, 0xB7BA, 0x8E53, 0xB7BB, 0x8E54, + 0xB7BC, 0x8E55, 0xB7BD, 0x8E56, 0xB7BE, 0x8E57, 0xB7BF, 0x8E58, 0xB7C0, 0x8E59, 0xB7C1, 0x8E5A, 0xB7C2, 0x8E61, 0xB7C3, 0x8E62, + 0xB7C4, 0x8E63, 0xB7C5, 0x8E64, 0xB7C6, 0x8E65, 0xB7C7, 0xB7AD, 0xB7C8, 0x8E66, 0xB7C9, 0xB7AE, 0xB7CA, 0x8E67, 0xB7CB, 0x8E68, + 0xB7CC, 0x8E69, 0xB7CD, 0x8E6A, 0xB7CE, 0x8E6B, 0xB7CF, 0x8E6C, 0xB7D0, 0x8E6D, 0xB7D1, 0x8E6E, 0xB7D2, 0x8E6F, 0xB7D3, 0x8E70, + 0xB7D4, 0x8E71, 0xB7D5, 0x8E72, 0xB7D6, 0x8E73, 0xB7D7, 0x8E74, 0xB7D8, 0x8E75, 0xB7D9, 0x8E76, 0xB7DA, 0x8E77, 0xB7DB, 0x8E78, + 0xB7DC, 0x8E79, 0xB7DD, 0x8E7A, 0xB7DE, 0x8E81, 0xB7DF, 0x8E82, 0xB7E0, 0x8E83, 0xB7E1, 0x8E84, 0xB7E2, 0x8E85, 0xB7E3, 0x8E86, + 0xB7E4, 0x8E87, 0xB7E5, 0x8E88, 0xB7E6, 0x8E89, 0xB7E7, 0x8E8A, 0xB7E8, 0x8E8B, 0xB7E9, 0x8E8C, 0xB7EA, 0x8E8D, 0xB7EB, 0x8E8E, + 0xB7EC, 0xB7AF, 0xB7ED, 0xB7B0, 0xB7EE, 0x8E8F, 0xB7EF, 0x8E90, 0xB7F0, 0xB7B1, 0xB7F1, 0x8E91, 0xB7F2, 0x8E92, 0xB7F3, 0x8E93, + 0xB7F4, 0xB7B2, 0xB7F5, 0x8E94, 0xB7F6, 0x8E95, 0xB7F7, 0x8E96, 0xB7F8, 0x8E97, 0xB7F9, 0x8E98, 0xB7FA, 0x8E99, 0xB7FB, 0x8E9A, + 0xB7FC, 0xB7B3, 0xB7FD, 0xB7B4, 0xB7FE, 0x8E9B, 0xB7FF, 0xB7B5, 0xB800, 0xB7B6, 0xB801, 0xB7B7, 0xB802, 0x8E9C, 0xB803, 0x8E9D, + 0xB804, 0x8E9E, 0xB805, 0x8E9F, 0xB806, 0x8EA0, 0xB807, 0xB7B8, 0xB808, 0xB7B9, 0xB809, 0xB7BA, 0xB80A, 0x8EA1, 0xB80B, 0x8EA2, + 0xB80C, 0xB7BB, 0xB80D, 0x8EA3, 0xB80E, 0x8EA4, 0xB80F, 0x8EA5, 0xB810, 0xB7BC, 0xB811, 0x8EA6, 0xB812, 0x8EA7, 0xB813, 0x8EA8, + 0xB814, 0x8EA9, 0xB815, 0x8EAA, 0xB816, 0x8EAB, 0xB817, 0x8EAC, 0xB818, 0xB7BD, 0xB819, 0xB7BE, 0xB81A, 0x8EAD, 0xB81B, 0xB7BF, + 0xB81C, 0x8EAE, 0xB81D, 0xB7C0, 0xB81E, 0x8EAF, 0xB81F, 0x8EB0, 0xB820, 0x8EB1, 0xB821, 0x8EB2, 0xB822, 0x8EB3, 0xB823, 0x8EB4, + 0xB824, 0xB7C1, 0xB825, 0xB7C2, 0xB826, 0x8EB5, 0xB827, 0x8EB6, 0xB828, 0xB7C3, 0xB829, 0x8EB7, 0xB82A, 0x8EB8, 0xB82B, 0x8EB9, + 0xB82C, 0xB7C4, 0xB82D, 0x8EBA, 0xB82E, 0x8EBB, 0xB82F, 0x8EBC, 0xB830, 0x8EBD, 0xB831, 0x8EBE, 0xB832, 0x8EBF, 0xB833, 0x8EC0, + 0xB834, 0xB7C5, 0xB835, 0xB7C6, 0xB836, 0x8EC1, 0xB837, 0xB7C7, 0xB838, 0xB7C8, 0xB839, 0xB7C9, 0xB83A, 0x8EC2, 0xB83B, 0x8EC3, + 0xB83C, 0x8EC4, 0xB83D, 0x8EC5, 0xB83E, 0x8EC6, 0xB83F, 0x8EC7, 0xB840, 0xB7CA, 0xB841, 0x8EC8, 0xB842, 0x8EC9, 0xB843, 0x8ECA, + 0xB844, 0xB7CB, 0xB845, 0x8ECB, 0xB846, 0x8ECC, 0xB847, 0x8ECD, 0xB848, 0x8ECE, 0xB849, 0x8ECF, 0xB84A, 0x8ED0, 0xB84B, 0x8ED1, + 0xB84C, 0x8ED2, 0xB84D, 0x8ED3, 0xB84E, 0x8ED4, 0xB84F, 0x8ED5, 0xB850, 0x8ED6, 0xB851, 0xB7CC, 0xB852, 0x8ED7, 0xB853, 0xB7CD, + 0xB854, 0x8ED8, 0xB855, 0x8ED9, 0xB856, 0x8EDA, 0xB857, 0x8EDB, 0xB858, 0x8EDC, 0xB859, 0x8EDD, 0xB85A, 0x8EDE, 0xB85B, 0x8EDF, + 0xB85C, 0xB7CE, 0xB85D, 0xB7CF, 0xB85E, 0x8EE0, 0xB85F, 0x8EE1, 0xB860, 0xB7D0, 0xB861, 0x8EE2, 0xB862, 0x8EE3, 0xB863, 0x8EE4, + 0xB864, 0xB7D1, 0xB865, 0x8EE5, 0xB866, 0x8EE6, 0xB867, 0x8EE7, 0xB868, 0x8EE8, 0xB869, 0x8EE9, 0xB86A, 0x8EEA, 0xB86B, 0x8EEB, + 0xB86C, 0xB7D2, 0xB86D, 0xB7D3, 0xB86E, 0x8EEC, 0xB86F, 0xB7D4, 0xB870, 0x8EED, 0xB871, 0xB7D5, 0xB872, 0x8EEE, 0xB873, 0x8EEF, + 0xB874, 0x8EF0, 0xB875, 0x8EF1, 0xB876, 0x8EF2, 0xB877, 0x8EF3, 0xB878, 0xB7D6, 0xB879, 0x8EF4, 0xB87A, 0x8EF5, 0xB87B, 0x8EF6, + 0xB87C, 0xB7D7, 0xB87D, 0x8EF7, 0xB87E, 0x8EF8, 0xB87F, 0x8EF9, 0xB880, 0x8EFA, 0xB881, 0x8EFB, 0xB882, 0x8EFC, 0xB883, 0x8EFD, + 0xB884, 0x8EFE, 0xB885, 0x8F41, 0xB886, 0x8F42, 0xB887, 0x8F43, 0xB888, 0x8F44, 0xB889, 0x8F45, 0xB88A, 0x8F46, 0xB88B, 0x8F47, + 0xB88C, 0x8F48, 0xB88D, 0xB7D8, 0xB88E, 0x8F49, 0xB88F, 0x8F4A, 0xB890, 0x8F4B, 0xB891, 0x8F4C, 0xB892, 0x8F4D, 0xB893, 0x8F4E, + 0xB894, 0x8F4F, 0xB895, 0x8F50, 0xB896, 0x8F51, 0xB897, 0x8F52, 0xB898, 0x8F53, 0xB899, 0x8F54, 0xB89A, 0x8F55, 0xB89B, 0x8F56, + 0xB89C, 0x8F57, 0xB89D, 0x8F58, 0xB89E, 0x8F59, 0xB89F, 0x8F5A, 0xB8A0, 0x8F61, 0xB8A1, 0x8F62, 0xB8A2, 0x8F63, 0xB8A3, 0x8F64, + 0xB8A4, 0x8F65, 0xB8A5, 0x8F66, 0xB8A6, 0x8F67, 0xB8A7, 0x8F68, 0xB8A8, 0xB7D9, 0xB8A9, 0x8F69, 0xB8AA, 0x8F6A, 0xB8AB, 0x8F6B, + 0xB8AC, 0x8F6C, 0xB8AD, 0x8F6D, 0xB8AE, 0x8F6E, 0xB8AF, 0x8F6F, 0xB8B0, 0xB7DA, 0xB8B1, 0x8F70, 0xB8B2, 0x8F71, 0xB8B3, 0x8F72, + 0xB8B4, 0xB7DB, 0xB8B5, 0x8F73, 0xB8B6, 0x8F74, 0xB8B7, 0x8F75, 0xB8B8, 0xB7DC, 0xB8B9, 0x8F76, 0xB8BA, 0x8F77, 0xB8BB, 0x8F78, + 0xB8BC, 0x8F79, 0xB8BD, 0x8F7A, 0xB8BE, 0x8F81, 0xB8BF, 0x8F82, 0xB8C0, 0xB7DD, 0xB8C1, 0xB7DE, 0xB8C2, 0x8F83, 0xB8C3, 0xB7DF, + 0xB8C4, 0x8F84, 0xB8C5, 0xB7E0, 0xB8C6, 0x8F85, 0xB8C7, 0x8F86, 0xB8C8, 0x8F87, 0xB8C9, 0x8F88, 0xB8CA, 0x8F89, 0xB8CB, 0x8F8A, + 0xB8CC, 0xB7E1, 0xB8CD, 0x8F8B, 0xB8CE, 0x8F8C, 0xB8CF, 0x8F8D, 0xB8D0, 0xB7E2, 0xB8D1, 0x8F8E, 0xB8D2, 0x8F8F, 0xB8D3, 0x8F90, + 0xB8D4, 0xB7E3, 0xB8D5, 0x8F91, 0xB8D6, 0x8F92, 0xB8D7, 0x8F93, 0xB8D8, 0x8F94, 0xB8D9, 0x8F95, 0xB8DA, 0x8F96, 0xB8DB, 0x8F97, + 0xB8DC, 0x8F98, 0xB8DD, 0xB7E4, 0xB8DE, 0x8F99, 0xB8DF, 0xB7E5, 0xB8E0, 0x8F9A, 0xB8E1, 0xB7E6, 0xB8E2, 0x8F9B, 0xB8E3, 0x8F9C, + 0xB8E4, 0x8F9D, 0xB8E5, 0x8F9E, 0xB8E6, 0x8F9F, 0xB8E7, 0x8FA0, 0xB8E8, 0xB7E7, 0xB8E9, 0xB7E8, 0xB8EA, 0x8FA1, 0xB8EB, 0x8FA2, + 0xB8EC, 0xB7E9, 0xB8ED, 0x8FA3, 0xB8EE, 0x8FA4, 0xB8EF, 0x8FA5, 0xB8F0, 0xB7EA, 0xB8F1, 0x8FA6, 0xB8F2, 0x8FA7, 0xB8F3, 0x8FA8, + 0xB8F4, 0x8FA9, 0xB8F5, 0x8FAA, 0xB8F6, 0x8FAB, 0xB8F7, 0x8FAC, 0xB8F8, 0xB7EB, 0xB8F9, 0xB7EC, 0xB8FA, 0x8FAD, 0xB8FB, 0xB7ED, + 0xB8FC, 0x8FAE, 0xB8FD, 0xB7EE, 0xB8FE, 0x8FAF, 0xB8FF, 0x8FB0, 0xB900, 0x8FB1, 0xB901, 0x8FB2, 0xB902, 0x8FB3, 0xB903, 0x8FB4, + 0xB904, 0xB7EF, 0xB905, 0x8FB5, 0xB906, 0x8FB6, 0xB907, 0x8FB7, 0xB908, 0x8FB8, 0xB909, 0x8FB9, 0xB90A, 0x8FBA, 0xB90B, 0x8FBB, + 0xB90C, 0x8FBC, 0xB90D, 0x8FBD, 0xB90E, 0x8FBE, 0xB90F, 0x8FBF, 0xB910, 0x8FC0, 0xB911, 0x8FC1, 0xB912, 0x8FC2, 0xB913, 0x8FC3, + 0xB914, 0x8FC4, 0xB915, 0x8FC5, 0xB916, 0x8FC6, 0xB917, 0x8FC7, 0xB918, 0xB7F0, 0xB919, 0x8FC8, 0xB91A, 0x8FC9, 0xB91B, 0x8FCA, + 0xB91C, 0x8FCB, 0xB91D, 0x8FCC, 0xB91E, 0x8FCD, 0xB91F, 0x8FCE, 0xB920, 0xB7F1, 0xB921, 0x8FCF, 0xB922, 0x8FD0, 0xB923, 0x8FD1, + 0xB924, 0x8FD2, 0xB925, 0x8FD3, 0xB926, 0x8FD4, 0xB927, 0x8FD5, 0xB928, 0x8FD6, 0xB929, 0x8FD7, 0xB92A, 0x8FD8, 0xB92B, 0x8FD9, + 0xB92C, 0x8FDA, 0xB92D, 0x8FDB, 0xB92E, 0x8FDC, 0xB92F, 0x8FDD, 0xB930, 0x8FDE, 0xB931, 0x8FDF, 0xB932, 0x8FE0, 0xB933, 0x8FE1, + 0xB934, 0x8FE2, 0xB935, 0x8FE3, 0xB936, 0x8FE4, 0xB937, 0x8FE5, 0xB938, 0x8FE6, 0xB939, 0x8FE7, 0xB93A, 0x8FE8, 0xB93B, 0x8FE9, + 0xB93C, 0xB7F2, 0xB93D, 0xB7F3, 0xB93E, 0x8FEA, 0xB93F, 0x8FEB, 0xB940, 0xB7F4, 0xB941, 0x8FEC, 0xB942, 0x8FED, 0xB943, 0x8FEE, + 0xB944, 0xB7F5, 0xB945, 0x8FEF, 0xB946, 0x8FF0, 0xB947, 0x8FF1, 0xB948, 0x8FF2, 0xB949, 0x8FF3, 0xB94A, 0x8FF4, 0xB94B, 0x8FF5, + 0xB94C, 0xB7F6, 0xB94D, 0x8FF6, 0xB94E, 0x8FF7, 0xB94F, 0xB7F7, 0xB950, 0x8FF8, 0xB951, 0xB7F8, 0xB952, 0x8FF9, 0xB953, 0x8FFA, + 0xB954, 0x8FFB, 0xB955, 0x8FFC, 0xB956, 0x8FFD, 0xB957, 0x8FFE, 0xB958, 0xB7F9, 0xB959, 0xB7FA, 0xB95A, 0x9041, 0xB95B, 0x9042, + 0xB95C, 0xB7FB, 0xB95D, 0x9043, 0xB95E, 0x9044, 0xB95F, 0x9045, 0xB960, 0xB7FC, 0xB961, 0x9046, 0xB962, 0x9047, 0xB963, 0x9048, + 0xB964, 0x9049, 0xB965, 0x904A, 0xB966, 0x904B, 0xB967, 0x904C, 0xB968, 0xB7FD, 0xB969, 0xB7FE, 0xB96A, 0x904D, 0xB96B, 0xB8A1, + 0xB96C, 0x904E, 0xB96D, 0xB8A2, 0xB96E, 0x904F, 0xB96F, 0x9050, 0xB970, 0x9051, 0xB971, 0x9052, 0xB972, 0x9053, 0xB973, 0x9054, + 0xB974, 0xB8A3, 0xB975, 0xB8A4, 0xB976, 0x9055, 0xB977, 0x9056, 0xB978, 0xB8A5, 0xB979, 0x9057, 0xB97A, 0x9058, 0xB97B, 0x9059, + 0xB97C, 0xB8A6, 0xB97D, 0x905A, 0xB97E, 0x9061, 0xB97F, 0x9062, 0xB980, 0x9063, 0xB981, 0x9064, 0xB982, 0x9065, 0xB983, 0x9066, + 0xB984, 0xB8A7, 0xB985, 0xB8A8, 0xB986, 0x9067, 0xB987, 0xB8A9, 0xB988, 0x9068, 0xB989, 0xB8AA, 0xB98A, 0xB8AB, 0xB98B, 0x9069, + 0xB98C, 0x906A, 0xB98D, 0xB8AC, 0xB98E, 0xB8AD, 0xB98F, 0x906B, 0xB990, 0x906C, 0xB991, 0x906D, 0xB992, 0x906E, 0xB993, 0x906F, + 0xB994, 0x9070, 0xB995, 0x9071, 0xB996, 0x9072, 0xB997, 0x9073, 0xB998, 0x9074, 0xB999, 0x9075, 0xB99A, 0x9076, 0xB99B, 0x9077, + 0xB99C, 0x9078, 0xB99D, 0x9079, 0xB99E, 0x907A, 0xB99F, 0x9081, 0xB9A0, 0x9082, 0xB9A1, 0x9083, 0xB9A2, 0x9084, 0xB9A3, 0x9085, + 0xB9A4, 0x9086, 0xB9A5, 0x9087, 0xB9A6, 0x9088, 0xB9A7, 0x9089, 0xB9A8, 0x908A, 0xB9A9, 0x908B, 0xB9AA, 0x908C, 0xB9AB, 0x908D, + 0xB9AC, 0xB8AE, 0xB9AD, 0xB8AF, 0xB9AE, 0x908E, 0xB9AF, 0x908F, 0xB9B0, 0xB8B0, 0xB9B1, 0x9090, 0xB9B2, 0x9091, 0xB9B3, 0x9092, + 0xB9B4, 0xB8B1, 0xB9B5, 0x9093, 0xB9B6, 0x9094, 0xB9B7, 0x9095, 0xB9B8, 0x9096, 0xB9B9, 0x9097, 0xB9BA, 0x9098, 0xB9BB, 0x9099, + 0xB9BC, 0xB8B2, 0xB9BD, 0xB8B3, 0xB9BE, 0x909A, 0xB9BF, 0xB8B4, 0xB9C0, 0x909B, 0xB9C1, 0xB8B5, 0xB9C2, 0x909C, 0xB9C3, 0x909D, + 0xB9C4, 0x909E, 0xB9C5, 0x909F, 0xB9C6, 0x90A0, 0xB9C7, 0x90A1, 0xB9C8, 0xB8B6, 0xB9C9, 0xB8B7, 0xB9CA, 0x90A2, 0xB9CB, 0x90A3, + 0xB9CC, 0xB8B8, 0xB9CD, 0x90A4, 0xB9CE, 0xB8B9, 0xB9CF, 0xB8BA, 0xB9D0, 0xB8BB, 0xB9D1, 0xB8BC, 0xB9D2, 0xB8BD, 0xB9D3, 0x90A5, + 0xB9D4, 0x90A6, 0xB9D5, 0x90A7, 0xB9D6, 0x90A8, 0xB9D7, 0x90A9, 0xB9D8, 0xB8BE, 0xB9D9, 0xB8BF, 0xB9DA, 0x90AA, 0xB9DB, 0xB8C0, + 0xB9DC, 0x90AB, 0xB9DD, 0xB8C1, 0xB9DE, 0xB8C2, 0xB9DF, 0x90AC, 0xB9E0, 0x90AD, 0xB9E1, 0xB8C3, 0xB9E2, 0x90AE, 0xB9E3, 0xB8C4, + 0xB9E4, 0xB8C5, 0xB9E5, 0xB8C6, 0xB9E6, 0x90AF, 0xB9E7, 0x90B0, 0xB9E8, 0xB8C7, 0xB9E9, 0x90B1, 0xB9EA, 0x90B2, 0xB9EB, 0x90B3, + 0xB9EC, 0xB8C8, 0xB9ED, 0x90B4, 0xB9EE, 0x90B5, 0xB9EF, 0x90B6, 0xB9F0, 0x90B7, 0xB9F1, 0x90B8, 0xB9F2, 0x90B9, 0xB9F3, 0x90BA, + 0xB9F4, 0xB8C9, 0xB9F5, 0xB8CA, 0xB9F6, 0x90BB, 0xB9F7, 0xB8CB, 0xB9F8, 0xB8CC, 0xB9F9, 0xB8CD, 0xB9FA, 0xB8CE, 0xB9FB, 0x90BC, + 0xB9FC, 0x90BD, 0xB9FD, 0x90BE, 0xB9FE, 0x90BF, 0xB9FF, 0x90C0, 0xBA00, 0xB8CF, 0xBA01, 0xB8D0, 0xBA02, 0x90C1, 0xBA03, 0x90C2, + 0xBA04, 0x90C3, 0xBA05, 0x90C4, 0xBA06, 0x90C5, 0xBA07, 0x90C6, 0xBA08, 0xB8D1, 0xBA09, 0x90C7, 0xBA0A, 0x90C8, 0xBA0B, 0x90C9, + 0xBA0C, 0x90CA, 0xBA0D, 0x90CB, 0xBA0E, 0x90CC, 0xBA0F, 0x90CD, 0xBA10, 0x90CE, 0xBA11, 0x90CF, 0xBA12, 0x90D0, 0xBA13, 0x90D1, + 0xBA14, 0x90D2, 0xBA15, 0xB8D2, 0xBA16, 0x90D3, 0xBA17, 0x90D4, 0xBA18, 0x90D5, 0xBA19, 0x90D6, 0xBA1A, 0x90D7, 0xBA1B, 0x90D8, + 0xBA1C, 0x90D9, 0xBA1D, 0x90DA, 0xBA1E, 0x90DB, 0xBA1F, 0x90DC, 0xBA20, 0x90DD, 0xBA21, 0x90DE, 0xBA22, 0x90DF, 0xBA23, 0x90E0, + 0xBA24, 0x90E1, 0xBA25, 0x90E2, 0xBA26, 0x90E3, 0xBA27, 0x90E4, 0xBA28, 0x90E5, 0xBA29, 0x90E6, 0xBA2A, 0x90E7, 0xBA2B, 0x90E8, + 0xBA2C, 0x90E9, 0xBA2D, 0x90EA, 0xBA2E, 0x90EB, 0xBA2F, 0x90EC, 0xBA30, 0x90ED, 0xBA31, 0x90EE, 0xBA32, 0x90EF, 0xBA33, 0x90F0, + 0xBA34, 0x90F1, 0xBA35, 0x90F2, 0xBA36, 0x90F3, 0xBA37, 0x90F4, 0xBA38, 0xB8D3, 0xBA39, 0xB8D4, 0xBA3A, 0x90F5, 0xBA3B, 0x90F6, + 0xBA3C, 0xB8D5, 0xBA3D, 0x90F7, 0xBA3E, 0x90F8, 0xBA3F, 0x90F9, 0xBA40, 0xB8D6, 0xBA41, 0x90FA, 0xBA42, 0xB8D7, 0xBA43, 0x90FB, + 0xBA44, 0x90FC, 0xBA45, 0x90FD, 0xBA46, 0x90FE, 0xBA47, 0x9141, 0xBA48, 0xB8D8, 0xBA49, 0xB8D9, 0xBA4A, 0x9142, 0xBA4B, 0xB8DA, + 0xBA4C, 0x9143, 0xBA4D, 0xB8DB, 0xBA4E, 0xB8DC, 0xBA4F, 0x9144, 0xBA50, 0x9145, 0xBA51, 0x9146, 0xBA52, 0x9147, 0xBA53, 0xB8DD, + 0xBA54, 0xB8DE, 0xBA55, 0xB8DF, 0xBA56, 0x9148, 0xBA57, 0x9149, 0xBA58, 0xB8E0, 0xBA59, 0x914A, 0xBA5A, 0x914B, 0xBA5B, 0x914C, + 0xBA5C, 0xB8E1, 0xBA5D, 0x914D, 0xBA5E, 0x914E, 0xBA5F, 0x914F, 0xBA60, 0x9150, 0xBA61, 0x9151, 0xBA62, 0x9152, 0xBA63, 0x9153, + 0xBA64, 0xB8E2, 0xBA65, 0xB8E3, 0xBA66, 0x9154, 0xBA67, 0xB8E4, 0xBA68, 0xB8E5, 0xBA69, 0xB8E6, 0xBA6A, 0x9155, 0xBA6B, 0x9156, + 0xBA6C, 0x9157, 0xBA6D, 0x9158, 0xBA6E, 0x9159, 0xBA6F, 0x915A, 0xBA70, 0xB8E7, 0xBA71, 0xB8E8, 0xBA72, 0x9161, 0xBA73, 0x9162, + 0xBA74, 0xB8E9, 0xBA75, 0x9163, 0xBA76, 0x9164, 0xBA77, 0x9165, 0xBA78, 0xB8EA, 0xBA79, 0x9166, 0xBA7A, 0x9167, 0xBA7B, 0x9168, + 0xBA7C, 0x9169, 0xBA7D, 0x916A, 0xBA7E, 0x916B, 0xBA7F, 0x916C, 0xBA80, 0x916D, 0xBA81, 0x916E, 0xBA82, 0x916F, 0xBA83, 0xB8EB, + 0xBA84, 0xB8EC, 0xBA85, 0xB8ED, 0xBA86, 0x9170, 0xBA87, 0xB8EE, 0xBA88, 0x9171, 0xBA89, 0x9172, 0xBA8A, 0x9173, 0xBA8B, 0x9174, + 0xBA8C, 0xB8EF, 0xBA8D, 0x9175, 0xBA8E, 0x9176, 0xBA8F, 0x9177, 0xBA90, 0x9178, 0xBA91, 0x9179, 0xBA92, 0x917A, 0xBA93, 0x9181, + 0xBA94, 0x9182, 0xBA95, 0x9183, 0xBA96, 0x9184, 0xBA97, 0x9185, 0xBA98, 0x9186, 0xBA99, 0x9187, 0xBA9A, 0x9188, 0xBA9B, 0x9189, + 0xBA9C, 0x918A, 0xBA9D, 0x918B, 0xBA9E, 0x918C, 0xBA9F, 0x918D, 0xBAA0, 0x918E, 0xBAA1, 0x918F, 0xBAA2, 0x9190, 0xBAA3, 0x9191, + 0xBAA4, 0x9192, 0xBAA5, 0x9193, 0xBAA6, 0x9194, 0xBAA7, 0x9195, 0xBAA8, 0xB8F0, 0xBAA9, 0xB8F1, 0xBAAA, 0x9196, 0xBAAB, 0xB8F2, + 0xBAAC, 0xB8F3, 0xBAAD, 0x9197, 0xBAAE, 0x9198, 0xBAAF, 0x9199, 0xBAB0, 0xB8F4, 0xBAB1, 0x919A, 0xBAB2, 0xB8F5, 0xBAB3, 0x919B, + 0xBAB4, 0x919C, 0xBAB5, 0x919D, 0xBAB6, 0x919E, 0xBAB7, 0x919F, 0xBAB8, 0xB8F6, 0xBAB9, 0xB8F7, 0xBABA, 0x91A0, 0xBABB, 0xB8F8, + 0xBABC, 0x91A1, 0xBABD, 0xB8F9, 0xBABE, 0x91A2, 0xBABF, 0x91A3, 0xBAC0, 0x91A4, 0xBAC1, 0x91A5, 0xBAC2, 0x91A6, 0xBAC3, 0x91A7, + 0xBAC4, 0xB8FA, 0xBAC5, 0x91A8, 0xBAC6, 0x91A9, 0xBAC7, 0x91AA, 0xBAC8, 0xB8FB, 0xBAC9, 0x91AB, 0xBACA, 0x91AC, 0xBACB, 0x91AD, + 0xBACC, 0x91AE, 0xBACD, 0x91AF, 0xBACE, 0x91B0, 0xBACF, 0x91B1, 0xBAD0, 0x91B2, 0xBAD1, 0x91B3, 0xBAD2, 0x91B4, 0xBAD3, 0x91B5, + 0xBAD4, 0x91B6, 0xBAD5, 0x91B7, 0xBAD6, 0x91B8, 0xBAD7, 0x91B9, 0xBAD8, 0xB8FC, 0xBAD9, 0xB8FD, 0xBADA, 0x91BA, 0xBADB, 0x91BB, + 0xBADC, 0x91BC, 0xBADD, 0x91BD, 0xBADE, 0x91BE, 0xBADF, 0x91BF, 0xBAE0, 0x91C0, 0xBAE1, 0x91C1, 0xBAE2, 0x91C2, 0xBAE3, 0x91C3, + 0xBAE4, 0x91C4, 0xBAE5, 0x91C5, 0xBAE6, 0x91C6, 0xBAE7, 0x91C7, 0xBAE8, 0x91C8, 0xBAE9, 0x91C9, 0xBAEA, 0x91CA, 0xBAEB, 0x91CB, + 0xBAEC, 0x91CC, 0xBAED, 0x91CD, 0xBAEE, 0x91CE, 0xBAEF, 0x91CF, 0xBAF0, 0x91D0, 0xBAF1, 0x91D1, 0xBAF2, 0x91D2, 0xBAF3, 0x91D3, + 0xBAF4, 0x91D4, 0xBAF5, 0x91D5, 0xBAF6, 0x91D6, 0xBAF7, 0x91D7, 0xBAF8, 0x91D8, 0xBAF9, 0x91D9, 0xBAFA, 0x91DA, 0xBAFB, 0x91DB, + 0xBAFC, 0xB8FE, 0xBAFD, 0x91DC, 0xBAFE, 0x91DD, 0xBAFF, 0x91DE, 0xBB00, 0xB9A1, 0xBB01, 0x91DF, 0xBB02, 0x91E0, 0xBB03, 0x91E1, + 0xBB04, 0xB9A2, 0xBB05, 0x91E2, 0xBB06, 0x91E3, 0xBB07, 0x91E4, 0xBB08, 0x91E5, 0xBB09, 0x91E6, 0xBB0A, 0x91E7, 0xBB0B, 0x91E8, + 0xBB0C, 0x91E9, 0xBB0D, 0xB9A3, 0xBB0E, 0x91EA, 0xBB0F, 0xB9A4, 0xBB10, 0x91EB, 0xBB11, 0xB9A5, 0xBB12, 0x91EC, 0xBB13, 0x91ED, + 0xBB14, 0x91EE, 0xBB15, 0x91EF, 0xBB16, 0x91F0, 0xBB17, 0x91F1, 0xBB18, 0xB9A6, 0xBB19, 0x91F2, 0xBB1A, 0x91F3, 0xBB1B, 0x91F4, + 0xBB1C, 0xB9A7, 0xBB1D, 0x91F5, 0xBB1E, 0x91F6, 0xBB1F, 0x91F7, 0xBB20, 0xB9A8, 0xBB21, 0x91F8, 0xBB22, 0x91F9, 0xBB23, 0x91FA, + 0xBB24, 0x91FB, 0xBB25, 0x91FC, 0xBB26, 0x91FD, 0xBB27, 0x91FE, 0xBB28, 0x9241, 0xBB29, 0xB9A9, 0xBB2A, 0x9242, 0xBB2B, 0xB9AA, + 0xBB2C, 0x9243, 0xBB2D, 0x9244, 0xBB2E, 0x9245, 0xBB2F, 0x9246, 0xBB30, 0x9247, 0xBB31, 0x9248, 0xBB32, 0x9249, 0xBB33, 0x924A, + 0xBB34, 0xB9AB, 0xBB35, 0xB9AC, 0xBB36, 0xB9AD, 0xBB37, 0x924B, 0xBB38, 0xB9AE, 0xBB39, 0x924C, 0xBB3A, 0x924D, 0xBB3B, 0xB9AF, + 0xBB3C, 0xB9B0, 0xBB3D, 0xB9B1, 0xBB3E, 0xB9B2, 0xBB3F, 0x924E, 0xBB40, 0x924F, 0xBB41, 0x9250, 0xBB42, 0x9251, 0xBB43, 0x9252, + 0xBB44, 0xB9B3, 0xBB45, 0xB9B4, 0xBB46, 0x9253, 0xBB47, 0xB9B5, 0xBB48, 0x9254, 0xBB49, 0xB9B6, 0xBB4A, 0x9255, 0xBB4B, 0x9256, + 0xBB4C, 0x9257, 0xBB4D, 0xB9B7, 0xBB4E, 0x9258, 0xBB4F, 0xB9B8, 0xBB50, 0xB9B9, 0xBB51, 0x9259, 0xBB52, 0x925A, 0xBB53, 0x9261, + 0xBB54, 0xB9BA, 0xBB55, 0x9262, 0xBB56, 0x9263, 0xBB57, 0x9264, 0xBB58, 0xB9BB, 0xBB59, 0x9265, 0xBB5A, 0x9266, 0xBB5B, 0x9267, + 0xBB5C, 0x9268, 0xBB5D, 0x9269, 0xBB5E, 0x926A, 0xBB5F, 0x926B, 0xBB60, 0x926C, 0xBB61, 0xB9BC, 0xBB62, 0x926D, 0xBB63, 0xB9BD, + 0xBB64, 0x926E, 0xBB65, 0x926F, 0xBB66, 0x9270, 0xBB67, 0x9271, 0xBB68, 0x9272, 0xBB69, 0x9273, 0xBB6A, 0x9274, 0xBB6B, 0x9275, + 0xBB6C, 0xB9BE, 0xBB6D, 0x9276, 0xBB6E, 0x9277, 0xBB6F, 0x9278, 0xBB70, 0x9279, 0xBB71, 0x927A, 0xBB72, 0x9281, 0xBB73, 0x9282, + 0xBB74, 0x9283, 0xBB75, 0x9284, 0xBB76, 0x9285, 0xBB77, 0x9286, 0xBB78, 0x9287, 0xBB79, 0x9288, 0xBB7A, 0x9289, 0xBB7B, 0x928A, + 0xBB7C, 0x928B, 0xBB7D, 0x928C, 0xBB7E, 0x928D, 0xBB7F, 0x928E, 0xBB80, 0x928F, 0xBB81, 0x9290, 0xBB82, 0x9291, 0xBB83, 0x9292, + 0xBB84, 0x9293, 0xBB85, 0x9294, 0xBB86, 0x9295, 0xBB87, 0x9296, 0xBB88, 0xB9BF, 0xBB89, 0x9297, 0xBB8A, 0x9298, 0xBB8B, 0x9299, + 0xBB8C, 0xB9C0, 0xBB8D, 0x929A, 0xBB8E, 0x929B, 0xBB8F, 0x929C, 0xBB90, 0xB9C1, 0xBB91, 0x929D, 0xBB92, 0x929E, 0xBB93, 0x929F, + 0xBB94, 0x92A0, 0xBB95, 0x92A1, 0xBB96, 0x92A2, 0xBB97, 0x92A3, 0xBB98, 0x92A4, 0xBB99, 0x92A5, 0xBB9A, 0x92A6, 0xBB9B, 0x92A7, + 0xBB9C, 0x92A8, 0xBB9D, 0x92A9, 0xBB9E, 0x92AA, 0xBB9F, 0x92AB, 0xBBA0, 0x92AC, 0xBBA1, 0x92AD, 0xBBA2, 0x92AE, 0xBBA3, 0x92AF, + 0xBBA4, 0xB9C2, 0xBBA5, 0x92B0, 0xBBA6, 0x92B1, 0xBBA7, 0x92B2, 0xBBA8, 0xB9C3, 0xBBA9, 0x92B3, 0xBBAA, 0x92B4, 0xBBAB, 0x92B5, + 0xBBAC, 0xB9C4, 0xBBAD, 0x92B6, 0xBBAE, 0x92B7, 0xBBAF, 0x92B8, 0xBBB0, 0x92B9, 0xBBB1, 0x92BA, 0xBBB2, 0x92BB, 0xBBB3, 0x92BC, + 0xBBB4, 0xB9C5, 0xBBB5, 0x92BD, 0xBBB6, 0x92BE, 0xBBB7, 0xB9C6, 0xBBB8, 0x92BF, 0xBBB9, 0x92C0, 0xBBBA, 0x92C1, 0xBBBB, 0x92C2, + 0xBBBC, 0x92C3, 0xBBBD, 0x92C4, 0xBBBE, 0x92C5, 0xBBBF, 0x92C6, 0xBBC0, 0xB9C7, 0xBBC1, 0x92C7, 0xBBC2, 0x92C8, 0xBBC3, 0x92C9, + 0xBBC4, 0xB9C8, 0xBBC5, 0x92CA, 0xBBC6, 0x92CB, 0xBBC7, 0x92CC, 0xBBC8, 0xB9C9, 0xBBC9, 0x92CD, 0xBBCA, 0x92CE, 0xBBCB, 0x92CF, + 0xBBCC, 0x92D0, 0xBBCD, 0x92D1, 0xBBCE, 0x92D2, 0xBBCF, 0x92D3, 0xBBD0, 0xB9CA, 0xBBD1, 0x92D4, 0xBBD2, 0x92D5, 0xBBD3, 0xB9CB, + 0xBBD4, 0x92D6, 0xBBD5, 0x92D7, 0xBBD6, 0x92D8, 0xBBD7, 0x92D9, 0xBBD8, 0x92DA, 0xBBD9, 0x92DB, 0xBBDA, 0x92DC, 0xBBDB, 0x92DD, + 0xBBDC, 0x92DE, 0xBBDD, 0x92DF, 0xBBDE, 0x92E0, 0xBBDF, 0x92E1, 0xBBE0, 0x92E2, 0xBBE1, 0x92E3, 0xBBE2, 0x92E4, 0xBBE3, 0x92E5, + 0xBBE4, 0x92E6, 0xBBE5, 0x92E7, 0xBBE6, 0x92E8, 0xBBE7, 0x92E9, 0xBBE8, 0x92EA, 0xBBE9, 0x92EB, 0xBBEA, 0x92EC, 0xBBEB, 0x92ED, + 0xBBEC, 0x92EE, 0xBBED, 0x92EF, 0xBBEE, 0x92F0, 0xBBEF, 0x92F1, 0xBBF0, 0x92F2, 0xBBF1, 0x92F3, 0xBBF2, 0x92F4, 0xBBF3, 0x92F5, + 0xBBF4, 0x92F6, 0xBBF5, 0x92F7, 0xBBF6, 0x92F8, 0xBBF7, 0x92F9, 0xBBF8, 0xB9CC, 0xBBF9, 0xB9CD, 0xBBFA, 0x92FA, 0xBBFB, 0x92FB, + 0xBBFC, 0xB9CE, 0xBBFD, 0x92FC, 0xBBFE, 0x92FD, 0xBBFF, 0xB9CF, 0xBC00, 0xB9D0, 0xBC01, 0x92FE, 0xBC02, 0xB9D1, 0xBC03, 0x9341, + 0xBC04, 0x9342, 0xBC05, 0x9343, 0xBC06, 0x9344, 0xBC07, 0x9345, 0xBC08, 0xB9D2, 0xBC09, 0xB9D3, 0xBC0A, 0x9346, 0xBC0B, 0xB9D4, + 0xBC0C, 0xB9D5, 0xBC0D, 0xB9D6, 0xBC0E, 0x9347, 0xBC0F, 0xB9D7, 0xBC10, 0x9348, 0xBC11, 0xB9D8, 0xBC12, 0x9349, 0xBC13, 0x934A, + 0xBC14, 0xB9D9, 0xBC15, 0xB9DA, 0xBC16, 0xB9DB, 0xBC17, 0xB9DC, 0xBC18, 0xB9DD, 0xBC19, 0x934B, 0xBC1A, 0x934C, 0xBC1B, 0xB9DE, + 0xBC1C, 0xB9DF, 0xBC1D, 0xB9E0, 0xBC1E, 0xB9E1, 0xBC1F, 0xB9E2, 0xBC20, 0x934D, 0xBC21, 0x934E, 0xBC22, 0x934F, 0xBC23, 0x9350, + 0xBC24, 0xB9E3, 0xBC25, 0xB9E4, 0xBC26, 0x9351, 0xBC27, 0xB9E5, 0xBC28, 0x9352, 0xBC29, 0xB9E6, 0xBC2A, 0x9353, 0xBC2B, 0x9354, + 0xBC2C, 0x9355, 0xBC2D, 0xB9E7, 0xBC2E, 0x9356, 0xBC2F, 0x9357, 0xBC30, 0xB9E8, 0xBC31, 0xB9E9, 0xBC32, 0x9358, 0xBC33, 0x9359, + 0xBC34, 0xB9EA, 0xBC35, 0x935A, 0xBC36, 0x9361, 0xBC37, 0x9362, 0xBC38, 0xB9EB, 0xBC39, 0x9363, 0xBC3A, 0x9364, 0xBC3B, 0x9365, + 0xBC3C, 0x9366, 0xBC3D, 0x9367, 0xBC3E, 0x9368, 0xBC3F, 0x9369, 0xBC40, 0xB9EC, 0xBC41, 0xB9ED, 0xBC42, 0x936A, 0xBC43, 0xB9EE, + 0xBC44, 0xB9EF, 0xBC45, 0xB9F0, 0xBC46, 0x936B, 0xBC47, 0x936C, 0xBC48, 0x936D, 0xBC49, 0xB9F1, 0xBC4A, 0x936E, 0xBC4B, 0x936F, + 0xBC4C, 0xB9F2, 0xBC4D, 0xB9F3, 0xBC4E, 0x9370, 0xBC4F, 0x9371, 0xBC50, 0xB9F4, 0xBC51, 0x9372, 0xBC52, 0x9373, 0xBC53, 0x9374, + 0xBC54, 0x9375, 0xBC55, 0x9376, 0xBC56, 0x9377, 0xBC57, 0x9378, 0xBC58, 0x9379, 0xBC59, 0x937A, 0xBC5A, 0x9381, 0xBC5B, 0x9382, + 0xBC5C, 0x9383, 0xBC5D, 0xB9F5, 0xBC5E, 0x9384, 0xBC5F, 0x9385, 0xBC60, 0x9386, 0xBC61, 0x9387, 0xBC62, 0x9388, 0xBC63, 0x9389, + 0xBC64, 0x938A, 0xBC65, 0x938B, 0xBC66, 0x938C, 0xBC67, 0x938D, 0xBC68, 0x938E, 0xBC69, 0x938F, 0xBC6A, 0x9390, 0xBC6B, 0x9391, + 0xBC6C, 0x9392, 0xBC6D, 0x9393, 0xBC6E, 0x9394, 0xBC6F, 0x9395, 0xBC70, 0x9396, 0xBC71, 0x9397, 0xBC72, 0x9398, 0xBC73, 0x9399, + 0xBC74, 0x939A, 0xBC75, 0x939B, 0xBC76, 0x939C, 0xBC77, 0x939D, 0xBC78, 0x939E, 0xBC79, 0x939F, 0xBC7A, 0x93A0, 0xBC7B, 0x93A1, + 0xBC7C, 0x93A2, 0xBC7D, 0x93A3, 0xBC7E, 0x93A4, 0xBC7F, 0x93A5, 0xBC80, 0x93A6, 0xBC81, 0x93A7, 0xBC82, 0x93A8, 0xBC83, 0x93A9, + 0xBC84, 0xB9F6, 0xBC85, 0xB9F7, 0xBC86, 0x93AA, 0xBC87, 0x93AB, 0xBC88, 0xB9F8, 0xBC89, 0x93AC, 0xBC8A, 0x93AD, 0xBC8B, 0xB9F9, + 0xBC8C, 0xB9FA, 0xBC8D, 0x93AE, 0xBC8E, 0xB9FB, 0xBC8F, 0x93AF, 0xBC90, 0x93B0, 0xBC91, 0x93B1, 0xBC92, 0x93B2, 0xBC93, 0x93B3, + 0xBC94, 0xB9FC, 0xBC95, 0xB9FD, 0xBC96, 0x93B4, 0xBC97, 0xB9FE, 0xBC98, 0x93B5, 0xBC99, 0xBAA1, 0xBC9A, 0xBAA2, 0xBC9B, 0x93B6, + 0xBC9C, 0x93B7, 0xBC9D, 0x93B8, 0xBC9E, 0x93B9, 0xBC9F, 0x93BA, 0xBCA0, 0xBAA3, 0xBCA1, 0xBAA4, 0xBCA2, 0x93BB, 0xBCA3, 0x93BC, + 0xBCA4, 0xBAA5, 0xBCA5, 0x93BD, 0xBCA6, 0x93BE, 0xBCA7, 0xBAA6, 0xBCA8, 0xBAA7, 0xBCA9, 0x93BF, 0xBCAA, 0x93C0, 0xBCAB, 0x93C1, + 0xBCAC, 0x93C2, 0xBCAD, 0x93C3, 0xBCAE, 0x93C4, 0xBCAF, 0x93C5, 0xBCB0, 0xBAA8, 0xBCB1, 0xBAA9, 0xBCB2, 0x93C6, 0xBCB3, 0xBAAA, + 0xBCB4, 0xBAAB, 0xBCB5, 0xBAAC, 0xBCB6, 0x93C7, 0xBCB7, 0x93C8, 0xBCB8, 0x93C9, 0xBCB9, 0x93CA, 0xBCBA, 0x93CB, 0xBCBB, 0x93CC, + 0xBCBC, 0xBAAD, 0xBCBD, 0xBAAE, 0xBCBE, 0x93CD, 0xBCBF, 0x93CE, 0xBCC0, 0xBAAF, 0xBCC1, 0x93CF, 0xBCC2, 0x93D0, 0xBCC3, 0x93D1, + 0xBCC4, 0xBAB0, 0xBCC5, 0x93D2, 0xBCC6, 0x93D3, 0xBCC7, 0x93D4, 0xBCC8, 0x93D5, 0xBCC9, 0x93D6, 0xBCCA, 0x93D7, 0xBCCB, 0x93D8, + 0xBCCC, 0x93D9, 0xBCCD, 0xBAB1, 0xBCCE, 0x93DA, 0xBCCF, 0xBAB2, 0xBCD0, 0xBAB3, 0xBCD1, 0xBAB4, 0xBCD2, 0x93DB, 0xBCD3, 0x93DC, + 0xBCD4, 0x93DD, 0xBCD5, 0xBAB5, 0xBCD6, 0x93DE, 0xBCD7, 0x93DF, 0xBCD8, 0xBAB6, 0xBCD9, 0x93E0, 0xBCDA, 0x93E1, 0xBCDB, 0x93E2, + 0xBCDC, 0xBAB7, 0xBCDD, 0x93E3, 0xBCDE, 0x93E4, 0xBCDF, 0x93E5, 0xBCE0, 0x93E6, 0xBCE1, 0x93E7, 0xBCE2, 0x93E8, 0xBCE3, 0x93E9, + 0xBCE4, 0x93EA, 0xBCE5, 0x93EB, 0xBCE6, 0x93EC, 0xBCE7, 0x93ED, 0xBCE8, 0x93EE, 0xBCE9, 0x93EF, 0xBCEA, 0x93F0, 0xBCEB, 0x93F1, + 0xBCEC, 0x93F2, 0xBCED, 0x93F3, 0xBCEE, 0x93F4, 0xBCEF, 0x93F5, 0xBCF0, 0x93F6, 0xBCF1, 0x93F7, 0xBCF2, 0x93F8, 0xBCF3, 0x93F9, + 0xBCF4, 0xBAB8, 0xBCF5, 0xBAB9, 0xBCF6, 0xBABA, 0xBCF7, 0x93FA, 0xBCF8, 0xBABB, 0xBCF9, 0x93FB, 0xBCFA, 0x93FC, 0xBCFB, 0x93FD, + 0xBCFC, 0xBABC, 0xBCFD, 0x93FE, 0xBCFE, 0x9441, 0xBCFF, 0x9442, 0xBD00, 0x9443, 0xBD01, 0x9444, 0xBD02, 0x9445, 0xBD03, 0x9446, + 0xBD04, 0xBABD, 0xBD05, 0xBABE, 0xBD06, 0x9447, 0xBD07, 0xBABF, 0xBD08, 0x9448, 0xBD09, 0xBAC0, 0xBD0A, 0x9449, 0xBD0B, 0x944A, + 0xBD0C, 0x944B, 0xBD0D, 0x944C, 0xBD0E, 0x944D, 0xBD0F, 0x944E, 0xBD10, 0xBAC1, 0xBD11, 0x944F, 0xBD12, 0x9450, 0xBD13, 0x9451, + 0xBD14, 0xBAC2, 0xBD15, 0x9452, 0xBD16, 0x9453, 0xBD17, 0x9454, 0xBD18, 0x9455, 0xBD19, 0x9456, 0xBD1A, 0x9457, 0xBD1B, 0x9458, + 0xBD1C, 0x9459, 0xBD1D, 0x945A, 0xBD1E, 0x9461, 0xBD1F, 0x9462, 0xBD20, 0x9463, 0xBD21, 0x9464, 0xBD22, 0x9465, 0xBD23, 0x9466, + 0xBD24, 0xBAC3, 0xBD25, 0x9467, 0xBD26, 0x9468, 0xBD27, 0x9469, 0xBD28, 0x946A, 0xBD29, 0x946B, 0xBD2A, 0x946C, 0xBD2B, 0x946D, + 0xBD2C, 0xBAC4, 0xBD2D, 0x946E, 0xBD2E, 0x946F, 0xBD2F, 0x9470, 0xBD30, 0x9471, 0xBD31, 0x9472, 0xBD32, 0x9473, 0xBD33, 0x9474, + 0xBD34, 0x9475, 0xBD35, 0x9476, 0xBD36, 0x9477, 0xBD37, 0x9478, 0xBD38, 0x9479, 0xBD39, 0x947A, 0xBD3A, 0x9481, 0xBD3B, 0x9482, + 0xBD3C, 0x9483, 0xBD3D, 0x9484, 0xBD3E, 0x9485, 0xBD3F, 0x9486, 0xBD40, 0xBAC5, 0xBD41, 0x9487, 0xBD42, 0x9488, 0xBD43, 0x9489, + 0xBD44, 0x948A, 0xBD45, 0x948B, 0xBD46, 0x948C, 0xBD47, 0x948D, 0xBD48, 0xBAC6, 0xBD49, 0xBAC7, 0xBD4A, 0x948E, 0xBD4B, 0x948F, + 0xBD4C, 0xBAC8, 0xBD4D, 0x9490, 0xBD4E, 0x9491, 0xBD4F, 0x9492, 0xBD50, 0xBAC9, 0xBD51, 0x9493, 0xBD52, 0x9494, 0xBD53, 0x9495, + 0xBD54, 0x9496, 0xBD55, 0x9497, 0xBD56, 0x9498, 0xBD57, 0x9499, 0xBD58, 0xBACA, 0xBD59, 0xBACB, 0xBD5A, 0x949A, 0xBD5B, 0x949B, + 0xBD5C, 0x949C, 0xBD5D, 0x949D, 0xBD5E, 0x949E, 0xBD5F, 0x949F, 0xBD60, 0x94A0, 0xBD61, 0x94A1, 0xBD62, 0x94A2, 0xBD63, 0x94A3, + 0xBD64, 0xBACC, 0xBD65, 0x94A4, 0xBD66, 0x94A5, 0xBD67, 0x94A6, 0xBD68, 0xBACD, 0xBD69, 0x94A7, 0xBD6A, 0x94A8, 0xBD6B, 0x94A9, + 0xBD6C, 0x94AA, 0xBD6D, 0x94AB, 0xBD6E, 0x94AC, 0xBD6F, 0x94AD, 0xBD70, 0x94AE, 0xBD71, 0x94AF, 0xBD72, 0x94B0, 0xBD73, 0x94B1, + 0xBD74, 0x94B2, 0xBD75, 0x94B3, 0xBD76, 0x94B4, 0xBD77, 0x94B5, 0xBD78, 0x94B6, 0xBD79, 0x94B7, 0xBD7A, 0x94B8, 0xBD7B, 0x94B9, + 0xBD7C, 0x94BA, 0xBD7D, 0x94BB, 0xBD7E, 0x94BC, 0xBD7F, 0x94BD, 0xBD80, 0xBACE, 0xBD81, 0xBACF, 0xBD82, 0x94BE, 0xBD83, 0x94BF, + 0xBD84, 0xBAD0, 0xBD85, 0x94C0, 0xBD86, 0x94C1, 0xBD87, 0xBAD1, 0xBD88, 0xBAD2, 0xBD89, 0xBAD3, 0xBD8A, 0xBAD4, 0xBD8B, 0x94C2, + 0xBD8C, 0x94C3, 0xBD8D, 0x94C4, 0xBD8E, 0x94C5, 0xBD8F, 0x94C6, 0xBD90, 0xBAD5, 0xBD91, 0xBAD6, 0xBD92, 0x94C7, 0xBD93, 0xBAD7, + 0xBD94, 0x94C8, 0xBD95, 0xBAD8, 0xBD96, 0x94C9, 0xBD97, 0x94CA, 0xBD98, 0x94CB, 0xBD99, 0xBAD9, 0xBD9A, 0xBADA, 0xBD9B, 0x94CC, + 0xBD9C, 0xBADB, 0xBD9D, 0x94CD, 0xBD9E, 0x94CE, 0xBD9F, 0x94CF, 0xBDA0, 0x94D0, 0xBDA1, 0x94D1, 0xBDA2, 0x94D2, 0xBDA3, 0x94D3, + 0xBDA4, 0xBADC, 0xBDA5, 0x94D4, 0xBDA6, 0x94D5, 0xBDA7, 0x94D6, 0xBDA8, 0x94D7, 0xBDA9, 0x94D8, 0xBDAA, 0x94D9, 0xBDAB, 0x94DA, + 0xBDAC, 0x94DB, 0xBDAD, 0x94DC, 0xBDAE, 0x94DD, 0xBDAF, 0x94DE, 0xBDB0, 0xBADD, 0xBDB1, 0x94DF, 0xBDB2, 0x94E0, 0xBDB3, 0x94E1, + 0xBDB4, 0x94E2, 0xBDB5, 0x94E3, 0xBDB6, 0x94E4, 0xBDB7, 0x94E5, 0xBDB8, 0xBADE, 0xBDB9, 0x94E6, 0xBDBA, 0x94E7, 0xBDBB, 0x94E8, + 0xBDBC, 0x94E9, 0xBDBD, 0x94EA, 0xBDBE, 0x94EB, 0xBDBF, 0x94EC, 0xBDC0, 0x94ED, 0xBDC1, 0x94EE, 0xBDC2, 0x94EF, 0xBDC3, 0x94F0, + 0xBDC4, 0x94F1, 0xBDC5, 0x94F2, 0xBDC6, 0x94F3, 0xBDC7, 0x94F4, 0xBDC8, 0x94F5, 0xBDC9, 0x94F6, 0xBDCA, 0x94F7, 0xBDCB, 0x94F8, + 0xBDCC, 0x94F9, 0xBDCD, 0x94FA, 0xBDCE, 0x94FB, 0xBDCF, 0x94FC, 0xBDD0, 0x94FD, 0xBDD1, 0x94FE, 0xBDD2, 0x9541, 0xBDD3, 0x9542, + 0xBDD4, 0xBADF, 0xBDD5, 0xBAE0, 0xBDD6, 0x9543, 0xBDD7, 0x9544, 0xBDD8, 0xBAE1, 0xBDD9, 0x9545, 0xBDDA, 0x9546, 0xBDDB, 0x9547, + 0xBDDC, 0xBAE2, 0xBDDD, 0x9548, 0xBDDE, 0x9549, 0xBDDF, 0x954A, 0xBDE0, 0x954B, 0xBDE1, 0x954C, 0xBDE2, 0x954D, 0xBDE3, 0x954E, + 0xBDE4, 0x954F, 0xBDE5, 0x9550, 0xBDE6, 0x9551, 0xBDE7, 0x9552, 0xBDE8, 0x9553, 0xBDE9, 0xBAE3, 0xBDEA, 0x9554, 0xBDEB, 0x9555, + 0xBDEC, 0x9556, 0xBDED, 0x9557, 0xBDEE, 0x9558, 0xBDEF, 0x9559, 0xBDF0, 0xBAE4, 0xBDF1, 0x955A, 0xBDF2, 0x9561, 0xBDF3, 0x9562, + 0xBDF4, 0xBAE5, 0xBDF5, 0x9563, 0xBDF6, 0x9564, 0xBDF7, 0x9565, 0xBDF8, 0xBAE6, 0xBDF9, 0x9566, 0xBDFA, 0x9567, 0xBDFB, 0x9568, + 0xBDFC, 0x9569, 0xBDFD, 0x956A, 0xBDFE, 0x956B, 0xBDFF, 0x956C, 0xBE00, 0xBAE7, 0xBE01, 0x956D, 0xBE02, 0x956E, 0xBE03, 0xBAE8, + 0xBE04, 0x956F, 0xBE05, 0xBAE9, 0xBE06, 0x9570, 0xBE07, 0x9571, 0xBE08, 0x9572, 0xBE09, 0x9573, 0xBE0A, 0x9574, 0xBE0B, 0x9575, + 0xBE0C, 0xBAEA, 0xBE0D, 0xBAEB, 0xBE0E, 0x9576, 0xBE0F, 0x9577, 0xBE10, 0xBAEC, 0xBE11, 0x9578, 0xBE12, 0x9579, 0xBE13, 0x957A, + 0xBE14, 0xBAED, 0xBE15, 0x9581, 0xBE16, 0x9582, 0xBE17, 0x9583, 0xBE18, 0x9584, 0xBE19, 0x9585, 0xBE1A, 0x9586, 0xBE1B, 0x9587, + 0xBE1C, 0xBAEE, 0xBE1D, 0xBAEF, 0xBE1E, 0x9588, 0xBE1F, 0xBAF0, 0xBE20, 0x9589, 0xBE21, 0x958A, 0xBE22, 0x958B, 0xBE23, 0x958C, + 0xBE24, 0x958D, 0xBE25, 0x958E, 0xBE26, 0x958F, 0xBE27, 0x9590, 0xBE28, 0x9591, 0xBE29, 0x9592, 0xBE2A, 0x9593, 0xBE2B, 0x9594, + 0xBE2C, 0x9595, 0xBE2D, 0x9596, 0xBE2E, 0x9597, 0xBE2F, 0x9598, 0xBE30, 0x9599, 0xBE31, 0x959A, 0xBE32, 0x959B, 0xBE33, 0x959C, + 0xBE34, 0x959D, 0xBE35, 0x959E, 0xBE36, 0x959F, 0xBE37, 0x95A0, 0xBE38, 0x95A1, 0xBE39, 0x95A2, 0xBE3A, 0x95A3, 0xBE3B, 0x95A4, + 0xBE3C, 0x95A5, 0xBE3D, 0x95A6, 0xBE3E, 0x95A7, 0xBE3F, 0x95A8, 0xBE40, 0x95A9, 0xBE41, 0x95AA, 0xBE42, 0x95AB, 0xBE43, 0x95AC, + 0xBE44, 0xBAF1, 0xBE45, 0xBAF2, 0xBE46, 0x95AD, 0xBE47, 0x95AE, 0xBE48, 0xBAF3, 0xBE49, 0x95AF, 0xBE4A, 0x95B0, 0xBE4B, 0x95B1, + 0xBE4C, 0xBAF4, 0xBE4D, 0x95B2, 0xBE4E, 0xBAF5, 0xBE4F, 0x95B3, 0xBE50, 0x95B4, 0xBE51, 0x95B5, 0xBE52, 0x95B6, 0xBE53, 0x95B7, + 0xBE54, 0xBAF6, 0xBE55, 0xBAF7, 0xBE56, 0x95B8, 0xBE57, 0xBAF8, 0xBE58, 0x95B9, 0xBE59, 0xBAF9, 0xBE5A, 0xBAFA, 0xBE5B, 0xBAFB, + 0xBE5C, 0x95BA, 0xBE5D, 0x95BB, 0xBE5E, 0x95BC, 0xBE5F, 0x95BD, 0xBE60, 0xBAFC, 0xBE61, 0xBAFD, 0xBE62, 0x95BE, 0xBE63, 0x95BF, + 0xBE64, 0xBAFE, 0xBE65, 0x95C0, 0xBE66, 0x95C1, 0xBE67, 0x95C2, 0xBE68, 0xBBA1, 0xBE69, 0x95C3, 0xBE6A, 0xBBA2, 0xBE6B, 0x95C4, + 0xBE6C, 0x95C5, 0xBE6D, 0x95C6, 0xBE6E, 0x95C7, 0xBE6F, 0x95C8, 0xBE70, 0xBBA3, 0xBE71, 0xBBA4, 0xBE72, 0x95C9, 0xBE73, 0xBBA5, + 0xBE74, 0xBBA6, 0xBE75, 0xBBA7, 0xBE76, 0x95CA, 0xBE77, 0x95CB, 0xBE78, 0x95CC, 0xBE79, 0x95CD, 0xBE7A, 0x95CE, 0xBE7B, 0xBBA8, + 0xBE7C, 0xBBA9, 0xBE7D, 0xBBAA, 0xBE7E, 0x95CF, 0xBE7F, 0x95D0, 0xBE80, 0xBBAB, 0xBE81, 0x95D1, 0xBE82, 0x95D2, 0xBE83, 0x95D3, + 0xBE84, 0xBBAC, 0xBE85, 0x95D4, 0xBE86, 0x95D5, 0xBE87, 0x95D6, 0xBE88, 0x95D7, 0xBE89, 0x95D8, 0xBE8A, 0x95D9, 0xBE8B, 0x95DA, + 0xBE8C, 0xBBAD, 0xBE8D, 0xBBAE, 0xBE8E, 0x95DB, 0xBE8F, 0xBBAF, 0xBE90, 0xBBB0, 0xBE91, 0xBBB1, 0xBE92, 0x95DC, 0xBE93, 0x95DD, + 0xBE94, 0x95DE, 0xBE95, 0x95DF, 0xBE96, 0x95E0, 0xBE97, 0x95E1, 0xBE98, 0xBBB2, 0xBE99, 0xBBB3, 0xBE9A, 0x95E2, 0xBE9B, 0x95E3, + 0xBE9C, 0x95E4, 0xBE9D, 0x95E5, 0xBE9E, 0x95E6, 0xBE9F, 0x95E7, 0xBEA0, 0x95E8, 0xBEA1, 0x95E9, 0xBEA2, 0x95EA, 0xBEA3, 0x95EB, + 0xBEA4, 0x95EC, 0xBEA5, 0x95ED, 0xBEA6, 0x95EE, 0xBEA7, 0x95EF, 0xBEA8, 0xBBB4, 0xBEA9, 0x95F0, 0xBEAA, 0x95F1, 0xBEAB, 0x95F2, + 0xBEAC, 0x95F3, 0xBEAD, 0x95F4, 0xBEAE, 0x95F5, 0xBEAF, 0x95F6, 0xBEB0, 0x95F7, 0xBEB1, 0x95F8, 0xBEB2, 0x95F9, 0xBEB3, 0x95FA, + 0xBEB4, 0x95FB, 0xBEB5, 0x95FC, 0xBEB6, 0x95FD, 0xBEB7, 0x95FE, 0xBEB8, 0x9641, 0xBEB9, 0x9642, 0xBEBA, 0x9643, 0xBEBB, 0x9644, + 0xBEBC, 0x9645, 0xBEBD, 0x9646, 0xBEBE, 0x9647, 0xBEBF, 0x9648, 0xBEC0, 0x9649, 0xBEC1, 0x964A, 0xBEC2, 0x964B, 0xBEC3, 0x964C, + 0xBEC4, 0x964D, 0xBEC5, 0x964E, 0xBEC6, 0x964F, 0xBEC7, 0x9650, 0xBEC8, 0x9651, 0xBEC9, 0x9652, 0xBECA, 0x9653, 0xBECB, 0x9654, + 0xBECC, 0x9655, 0xBECD, 0x9656, 0xBECE, 0x9657, 0xBECF, 0x9658, 0xBED0, 0xBBB5, 0xBED1, 0xBBB6, 0xBED2, 0x9659, 0xBED3, 0x965A, + 0xBED4, 0xBBB7, 0xBED5, 0x9661, 0xBED6, 0x9662, 0xBED7, 0xBBB8, 0xBED8, 0xBBB9, 0xBED9, 0x9663, 0xBEDA, 0x9664, 0xBEDB, 0x9665, + 0xBEDC, 0x9666, 0xBEDD, 0x9667, 0xBEDE, 0x9668, 0xBEDF, 0x9669, 0xBEE0, 0xBBBA, 0xBEE1, 0x966A, 0xBEE2, 0x966B, 0xBEE3, 0xBBBB, + 0xBEE4, 0xBBBC, 0xBEE5, 0xBBBD, 0xBEE6, 0x966C, 0xBEE7, 0x966D, 0xBEE8, 0x966E, 0xBEE9, 0x966F, 0xBEEA, 0x9670, 0xBEEB, 0x9671, + 0xBEEC, 0xBBBE, 0xBEED, 0x9672, 0xBEEE, 0x9673, 0xBEEF, 0x9674, 0xBEF0, 0x9675, 0xBEF1, 0x9676, 0xBEF2, 0x9677, 0xBEF3, 0x9678, + 0xBEF4, 0x9679, 0xBEF5, 0x967A, 0xBEF6, 0x9681, 0xBEF7, 0x9682, 0xBEF8, 0x9683, 0xBEF9, 0x9684, 0xBEFA, 0x9685, 0xBEFB, 0x9686, + 0xBEFC, 0x9687, 0xBEFD, 0x9688, 0xBEFE, 0x9689, 0xBEFF, 0x968A, 0xBF00, 0x968B, 0xBF01, 0xBBBF, 0xBF02, 0x968C, 0xBF03, 0x968D, + 0xBF04, 0x968E, 0xBF05, 0x968F, 0xBF06, 0x9690, 0xBF07, 0x9691, 0xBF08, 0xBBC0, 0xBF09, 0xBBC1, 0xBF0A, 0x9692, 0xBF0B, 0x9693, + 0xBF0C, 0x9694, 0xBF0D, 0x9695, 0xBF0E, 0x9696, 0xBF0F, 0x9697, 0xBF10, 0x9698, 0xBF11, 0x9699, 0xBF12, 0x969A, 0xBF13, 0x969B, + 0xBF14, 0x969C, 0xBF15, 0x969D, 0xBF16, 0x969E, 0xBF17, 0x969F, 0xBF18, 0xBBC2, 0xBF19, 0xBBC3, 0xBF1A, 0x96A0, 0xBF1B, 0xBBC4, + 0xBF1C, 0xBBC5, 0xBF1D, 0xBBC6, 0xBF1E, 0x96A1, 0xBF1F, 0x96A2, 0xBF20, 0x96A3, 0xBF21, 0x96A4, 0xBF22, 0x96A5, 0xBF23, 0x96A6, + 0xBF24, 0x96A7, 0xBF25, 0x96A8, 0xBF26, 0x96A9, 0xBF27, 0x96AA, 0xBF28, 0x96AB, 0xBF29, 0x96AC, 0xBF2A, 0x96AD, 0xBF2B, 0x96AE, + 0xBF2C, 0x96AF, 0xBF2D, 0x96B0, 0xBF2E, 0x96B1, 0xBF2F, 0x96B2, 0xBF30, 0x96B3, 0xBF31, 0x96B4, 0xBF32, 0x96B5, 0xBF33, 0x96B6, + 0xBF34, 0x96B7, 0xBF35, 0x96B8, 0xBF36, 0x96B9, 0xBF37, 0x96BA, 0xBF38, 0x96BB, 0xBF39, 0x96BC, 0xBF3A, 0x96BD, 0xBF3B, 0x96BE, + 0xBF3C, 0x96BF, 0xBF3D, 0x96C0, 0xBF3E, 0x96C1, 0xBF3F, 0x96C2, 0xBF40, 0xBBC7, 0xBF41, 0xBBC8, 0xBF42, 0x96C3, 0xBF43, 0x96C4, + 0xBF44, 0xBBC9, 0xBF45, 0x96C5, 0xBF46, 0x96C6, 0xBF47, 0x96C7, 0xBF48, 0xBBCA, 0xBF49, 0x96C8, 0xBF4A, 0x96C9, 0xBF4B, 0x96CA, + 0xBF4C, 0x96CB, 0xBF4D, 0x96CC, 0xBF4E, 0x96CD, 0xBF4F, 0x96CE, 0xBF50, 0xBBCB, 0xBF51, 0xBBCC, 0xBF52, 0x96CF, 0xBF53, 0x96D0, + 0xBF54, 0x96D1, 0xBF55, 0xBBCD, 0xBF56, 0x96D2, 0xBF57, 0x96D3, 0xBF58, 0x96D4, 0xBF59, 0x96D5, 0xBF5A, 0x96D6, 0xBF5B, 0x96D7, + 0xBF5C, 0x96D8, 0xBF5D, 0x96D9, 0xBF5E, 0x96DA, 0xBF5F, 0x96DB, 0xBF60, 0x96DC, 0xBF61, 0x96DD, 0xBF62, 0x96DE, 0xBF63, 0x96DF, + 0xBF64, 0x96E0, 0xBF65, 0x96E1, 0xBF66, 0x96E2, 0xBF67, 0x96E3, 0xBF68, 0x96E4, 0xBF69, 0x96E5, 0xBF6A, 0x96E6, 0xBF6B, 0x96E7, + 0xBF6C, 0x96E8, 0xBF6D, 0x96E9, 0xBF6E, 0x96EA, 0xBF6F, 0x96EB, 0xBF70, 0x96EC, 0xBF71, 0x96ED, 0xBF72, 0x96EE, 0xBF73, 0x96EF, + 0xBF74, 0x96F0, 0xBF75, 0x96F1, 0xBF76, 0x96F2, 0xBF77, 0x96F3, 0xBF78, 0x96F4, 0xBF79, 0x96F5, 0xBF7A, 0x96F6, 0xBF7B, 0x96F7, + 0xBF7C, 0x96F8, 0xBF7D, 0x96F9, 0xBF7E, 0x96FA, 0xBF7F, 0x96FB, 0xBF80, 0x96FC, 0xBF81, 0x96FD, 0xBF82, 0x96FE, 0xBF83, 0x9741, + 0xBF84, 0x9742, 0xBF85, 0x9743, 0xBF86, 0x9744, 0xBF87, 0x9745, 0xBF88, 0x9746, 0xBF89, 0x9747, 0xBF8A, 0x9748, 0xBF8B, 0x9749, + 0xBF8C, 0x974A, 0xBF8D, 0x974B, 0xBF8E, 0x974C, 0xBF8F, 0x974D, 0xBF90, 0x974E, 0xBF91, 0x974F, 0xBF92, 0x9750, 0xBF93, 0x9751, + 0xBF94, 0xBBCE, 0xBF95, 0x9752, 0xBF96, 0x9753, 0xBF97, 0x9754, 0xBF98, 0x9755, 0xBF99, 0x9756, 0xBF9A, 0x9757, 0xBF9B, 0x9758, + 0xBF9C, 0x9759, 0xBF9D, 0x975A, 0xBF9E, 0x9761, 0xBF9F, 0x9762, 0xBFA0, 0x9763, 0xBFA1, 0x9764, 0xBFA2, 0x9765, 0xBFA3, 0x9766, + 0xBFA4, 0x9767, 0xBFA5, 0x9768, 0xBFA6, 0x9769, 0xBFA7, 0x976A, 0xBFA8, 0x976B, 0xBFA9, 0x976C, 0xBFAA, 0x976D, 0xBFAB, 0x976E, + 0xBFAC, 0x976F, 0xBFAD, 0x9770, 0xBFAE, 0x9771, 0xBFAF, 0x9772, 0xBFB0, 0xBBCF, 0xBFB1, 0x9773, 0xBFB2, 0x9774, 0xBFB3, 0x9775, + 0xBFB4, 0x9776, 0xBFB5, 0x9777, 0xBFB6, 0x9778, 0xBFB7, 0x9779, 0xBFB8, 0x977A, 0xBFB9, 0x9781, 0xBFBA, 0x9782, 0xBFBB, 0x9783, + 0xBFBC, 0x9784, 0xBFBD, 0x9785, 0xBFBE, 0x9786, 0xBFBF, 0x9787, 0xBFC0, 0x9788, 0xBFC1, 0x9789, 0xBFC2, 0x978A, 0xBFC3, 0x978B, + 0xBFC4, 0x978C, 0xBFC5, 0xBBD0, 0xBFC6, 0x978D, 0xBFC7, 0x978E, 0xBFC8, 0x978F, 0xBFC9, 0x9790, 0xBFCA, 0x9791, 0xBFCB, 0x9792, + 0xBFCC, 0xBBD1, 0xBFCD, 0xBBD2, 0xBFCE, 0x9793, 0xBFCF, 0x9794, 0xBFD0, 0xBBD3, 0xBFD1, 0x9795, 0xBFD2, 0x9796, 0xBFD3, 0x9797, + 0xBFD4, 0xBBD4, 0xBFD5, 0x9798, 0xBFD6, 0x9799, 0xBFD7, 0x979A, 0xBFD8, 0x979B, 0xBFD9, 0x979C, 0xBFDA, 0x979D, 0xBFDB, 0x979E, + 0xBFDC, 0xBBD5, 0xBFDD, 0x979F, 0xBFDE, 0x97A0, 0xBFDF, 0xBBD6, 0xBFE0, 0x97A1, 0xBFE1, 0xBBD7, 0xBFE2, 0x97A2, 0xBFE3, 0x97A3, + 0xBFE4, 0x97A4, 0xBFE5, 0x97A5, 0xBFE6, 0x97A6, 0xBFE7, 0x97A7, 0xBFE8, 0x97A8, 0xBFE9, 0x97A9, 0xBFEA, 0x97AA, 0xBFEB, 0x97AB, + 0xBFEC, 0x97AC, 0xBFED, 0x97AD, 0xBFEE, 0x97AE, 0xBFEF, 0x97AF, 0xBFF0, 0x97B0, 0xBFF1, 0x97B1, 0xBFF2, 0x97B2, 0xBFF3, 0x97B3, + 0xBFF4, 0x97B4, 0xBFF5, 0x97B5, 0xBFF6, 0x97B6, 0xBFF7, 0x97B7, 0xBFF8, 0x97B8, 0xBFF9, 0x97B9, 0xBFFA, 0x97BA, 0xBFFB, 0x97BB, + 0xBFFC, 0x97BC, 0xBFFD, 0x97BD, 0xBFFE, 0x97BE, 0xBFFF, 0x97BF, 0xC000, 0x97C0, 0xC001, 0x97C1, 0xC002, 0x97C2, 0xC003, 0x97C3, + 0xC004, 0x97C4, 0xC005, 0x97C5, 0xC006, 0x97C6, 0xC007, 0x97C7, 0xC008, 0x97C8, 0xC009, 0x97C9, 0xC00A, 0x97CA, 0xC00B, 0x97CB, + 0xC00C, 0x97CC, 0xC00D, 0x97CD, 0xC00E, 0x97CE, 0xC00F, 0x97CF, 0xC010, 0x97D0, 0xC011, 0x97D1, 0xC012, 0x97D2, 0xC013, 0x97D3, + 0xC014, 0x97D4, 0xC015, 0x97D5, 0xC016, 0x97D6, 0xC017, 0x97D7, 0xC018, 0x97D8, 0xC019, 0x97D9, 0xC01A, 0x97DA, 0xC01B, 0x97DB, + 0xC01C, 0x97DC, 0xC01D, 0x97DD, 0xC01E, 0x97DE, 0xC01F, 0x97DF, 0xC020, 0x97E0, 0xC021, 0x97E1, 0xC022, 0x97E2, 0xC023, 0x97E3, + 0xC024, 0x97E4, 0xC025, 0x97E5, 0xC026, 0x97E6, 0xC027, 0x97E7, 0xC028, 0x97E8, 0xC029, 0x97E9, 0xC02A, 0x97EA, 0xC02B, 0x97EB, + 0xC02C, 0x97EC, 0xC02D, 0x97ED, 0xC02E, 0x97EE, 0xC02F, 0x97EF, 0xC030, 0x97F0, 0xC031, 0x97F1, 0xC032, 0x97F2, 0xC033, 0x97F3, + 0xC034, 0x97F4, 0xC035, 0x97F5, 0xC036, 0x97F6, 0xC037, 0x97F7, 0xC038, 0x97F8, 0xC039, 0x97F9, 0xC03A, 0x97FA, 0xC03B, 0x97FB, + 0xC03C, 0xBBD8, 0xC03D, 0x97FC, 0xC03E, 0x97FD, 0xC03F, 0x97FE, 0xC040, 0x9841, 0xC041, 0x9842, 0xC042, 0x9843, 0xC043, 0x9844, + 0xC044, 0x9845, 0xC045, 0x9846, 0xC046, 0x9847, 0xC047, 0x9848, 0xC048, 0x9849, 0xC049, 0x984A, 0xC04A, 0x984B, 0xC04B, 0x984C, + 0xC04C, 0x984D, 0xC04D, 0x984E, 0xC04E, 0x984F, 0xC04F, 0x9850, 0xC050, 0x9851, 0xC051, 0xBBD9, 0xC052, 0x9852, 0xC053, 0x9853, + 0xC054, 0x9854, 0xC055, 0x9855, 0xC056, 0x9856, 0xC057, 0x9857, 0xC058, 0xBBDA, 0xC059, 0x9858, 0xC05A, 0x9859, 0xC05B, 0x985A, + 0xC05C, 0xBBDB, 0xC05D, 0x9861, 0xC05E, 0x9862, 0xC05F, 0x9863, 0xC060, 0xBBDC, 0xC061, 0x9864, 0xC062, 0x9865, 0xC063, 0x9866, + 0xC064, 0x9867, 0xC065, 0x9868, 0xC066, 0x9869, 0xC067, 0x986A, 0xC068, 0xBBDD, 0xC069, 0xBBDE, 0xC06A, 0x986B, 0xC06B, 0x986C, + 0xC06C, 0x986D, 0xC06D, 0x986E, 0xC06E, 0x986F, 0xC06F, 0x9870, 0xC070, 0x9871, 0xC071, 0x9872, 0xC072, 0x9873, 0xC073, 0x9874, + 0xC074, 0x9875, 0xC075, 0x9876, 0xC076, 0x9877, 0xC077, 0x9878, 0xC078, 0x9879, 0xC079, 0x987A, 0xC07A, 0x9881, 0xC07B, 0x9882, + 0xC07C, 0x9883, 0xC07D, 0x9884, 0xC07E, 0x9885, 0xC07F, 0x9886, 0xC080, 0x9887, 0xC081, 0x9888, 0xC082, 0x9889, 0xC083, 0x988A, + 0xC084, 0x988B, 0xC085, 0x988C, 0xC086, 0x988D, 0xC087, 0x988E, 0xC088, 0x988F, 0xC089, 0x9890, 0xC08A, 0x9891, 0xC08B, 0x9892, + 0xC08C, 0x9893, 0xC08D, 0x9894, 0xC08E, 0x9895, 0xC08F, 0x9896, 0xC090, 0xBBDF, 0xC091, 0xBBE0, 0xC092, 0x9897, 0xC093, 0x9898, + 0xC094, 0xBBE1, 0xC095, 0x9899, 0xC096, 0x989A, 0xC097, 0x989B, 0xC098, 0xBBE2, 0xC099, 0x989C, 0xC09A, 0x989D, 0xC09B, 0x989E, + 0xC09C, 0x989F, 0xC09D, 0x98A0, 0xC09E, 0x98A1, 0xC09F, 0x98A2, 0xC0A0, 0xBBE3, 0xC0A1, 0xBBE4, 0xC0A2, 0x98A3, 0xC0A3, 0xBBE5, + 0xC0A4, 0x98A4, 0xC0A5, 0xBBE6, 0xC0A6, 0x98A5, 0xC0A7, 0x98A6, 0xC0A8, 0x98A7, 0xC0A9, 0x98A8, 0xC0AA, 0x98A9, 0xC0AB, 0x98AA, + 0xC0AC, 0xBBE7, 0xC0AD, 0xBBE8, 0xC0AE, 0x98AB, 0xC0AF, 0xBBE9, 0xC0B0, 0xBBEA, 0xC0B1, 0x98AC, 0xC0B2, 0x98AD, 0xC0B3, 0xBBEB, + 0xC0B4, 0xBBEC, 0xC0B5, 0xBBED, 0xC0B6, 0xBBEE, 0xC0B7, 0x98AE, 0xC0B8, 0x98AF, 0xC0B9, 0x98B0, 0xC0BA, 0x98B1, 0xC0BB, 0x98B2, + 0xC0BC, 0xBBEF, 0xC0BD, 0xBBF0, 0xC0BE, 0x98B3, 0xC0BF, 0xBBF1, 0xC0C0, 0xBBF2, 0xC0C1, 0xBBF3, 0xC0C2, 0x98B4, 0xC0C3, 0x98B5, + 0xC0C4, 0x98B6, 0xC0C5, 0xBBF4, 0xC0C6, 0x98B7, 0xC0C7, 0x98B8, 0xC0C8, 0xBBF5, 0xC0C9, 0xBBF6, 0xC0CA, 0x98B9, 0xC0CB, 0x98BA, + 0xC0CC, 0xBBF7, 0xC0CD, 0x98BB, 0xC0CE, 0x98BC, 0xC0CF, 0x98BD, 0xC0D0, 0xBBF8, 0xC0D1, 0x98BE, 0xC0D2, 0x98BF, 0xC0D3, 0x98C0, + 0xC0D4, 0x98C1, 0xC0D5, 0x98C2, 0xC0D6, 0x98C3, 0xC0D7, 0x98C4, 0xC0D8, 0xBBF9, 0xC0D9, 0xBBFA, 0xC0DA, 0x98C5, 0xC0DB, 0xBBFB, + 0xC0DC, 0xBBFC, 0xC0DD, 0xBBFD, 0xC0DE, 0x98C6, 0xC0DF, 0x98C7, 0xC0E0, 0x98C8, 0xC0E1, 0x98C9, 0xC0E2, 0x98CA, 0xC0E3, 0x98CB, + 0xC0E4, 0xBBFE, 0xC0E5, 0xBCA1, 0xC0E6, 0x98CC, 0xC0E7, 0x98CD, 0xC0E8, 0xBCA2, 0xC0E9, 0x98CE, 0xC0EA, 0x98CF, 0xC0EB, 0x98D0, + 0xC0EC, 0xBCA3, 0xC0ED, 0x98D1, 0xC0EE, 0x98D2, 0xC0EF, 0x98D3, 0xC0F0, 0x98D4, 0xC0F1, 0x98D5, 0xC0F2, 0x98D6, 0xC0F3, 0x98D7, + 0xC0F4, 0xBCA4, 0xC0F5, 0xBCA5, 0xC0F6, 0x98D8, 0xC0F7, 0xBCA6, 0xC0F8, 0x98D9, 0xC0F9, 0xBCA7, 0xC0FA, 0x98DA, 0xC0FB, 0x98DB, + 0xC0FC, 0x98DC, 0xC0FD, 0x98DD, 0xC0FE, 0x98DE, 0xC0FF, 0x98DF, 0xC100, 0xBCA8, 0xC101, 0x98E0, 0xC102, 0x98E1, 0xC103, 0x98E2, + 0xC104, 0xBCA9, 0xC105, 0x98E3, 0xC106, 0x98E4, 0xC107, 0x98E5, 0xC108, 0xBCAA, 0xC109, 0x98E6, 0xC10A, 0x98E7, 0xC10B, 0x98E8, + 0xC10C, 0x98E9, 0xC10D, 0x98EA, 0xC10E, 0x98EB, 0xC10F, 0x98EC, 0xC110, 0xBCAB, 0xC111, 0x98ED, 0xC112, 0x98EE, 0xC113, 0x98EF, + 0xC114, 0x98F0, 0xC115, 0xBCAC, 0xC116, 0x98F1, 0xC117, 0x98F2, 0xC118, 0x98F3, 0xC119, 0x98F4, 0xC11A, 0x98F5, 0xC11B, 0x98F6, + 0xC11C, 0xBCAD, 0xC11D, 0xBCAE, 0xC11E, 0xBCAF, 0xC11F, 0xBCB0, 0xC120, 0xBCB1, 0xC121, 0x98F7, 0xC122, 0x98F8, 0xC123, 0xBCB2, + 0xC124, 0xBCB3, 0xC125, 0x98F9, 0xC126, 0xBCB4, 0xC127, 0xBCB5, 0xC128, 0x98FA, 0xC129, 0x98FB, 0xC12A, 0x98FC, 0xC12B, 0x98FD, + 0xC12C, 0xBCB6, 0xC12D, 0xBCB7, 0xC12E, 0x98FE, 0xC12F, 0xBCB8, 0xC130, 0xBCB9, 0xC131, 0xBCBA, 0xC132, 0x9941, 0xC133, 0x9942, + 0xC134, 0x9943, 0xC135, 0x9944, 0xC136, 0xBCBB, 0xC137, 0x9945, 0xC138, 0xBCBC, 0xC139, 0xBCBD, 0xC13A, 0x9946, 0xC13B, 0x9947, + 0xC13C, 0xBCBE, 0xC13D, 0x9948, 0xC13E, 0x9949, 0xC13F, 0x994A, 0xC140, 0xBCBF, 0xC141, 0x994B, 0xC142, 0x994C, 0xC143, 0x994D, + 0xC144, 0x994E, 0xC145, 0x994F, 0xC146, 0x9950, 0xC147, 0x9951, 0xC148, 0xBCC0, 0xC149, 0xBCC1, 0xC14A, 0x9952, 0xC14B, 0xBCC2, + 0xC14C, 0xBCC3, 0xC14D, 0xBCC4, 0xC14E, 0x9953, 0xC14F, 0x9954, 0xC150, 0x9955, 0xC151, 0x9956, 0xC152, 0x9957, 0xC153, 0x9958, + 0xC154, 0xBCC5, 0xC155, 0xBCC6, 0xC156, 0x9959, 0xC157, 0x995A, 0xC158, 0xBCC7, 0xC159, 0x9961, 0xC15A, 0x9962, 0xC15B, 0x9963, + 0xC15C, 0xBCC8, 0xC15D, 0x9964, 0xC15E, 0x9965, 0xC15F, 0x9966, 0xC160, 0x9967, 0xC161, 0x9968, 0xC162, 0x9969, 0xC163, 0x996A, + 0xC164, 0xBCC9, 0xC165, 0xBCCA, 0xC166, 0x996B, 0xC167, 0xBCCB, 0xC168, 0xBCCC, 0xC169, 0xBCCD, 0xC16A, 0x996C, 0xC16B, 0x996D, + 0xC16C, 0x996E, 0xC16D, 0x996F, 0xC16E, 0x9970, 0xC16F, 0x9971, 0xC170, 0xBCCE, 0xC171, 0x9972, 0xC172, 0x9973, 0xC173, 0x9974, + 0xC174, 0xBCCF, 0xC175, 0x9975, 0xC176, 0x9976, 0xC177, 0x9977, 0xC178, 0xBCD0, 0xC179, 0x9978, 0xC17A, 0x9979, 0xC17B, 0x997A, + 0xC17C, 0x9981, 0xC17D, 0x9982, 0xC17E, 0x9983, 0xC17F, 0x9984, 0xC180, 0x9985, 0xC181, 0x9986, 0xC182, 0x9987, 0xC183, 0x9988, + 0xC184, 0x9989, 0xC185, 0xBCD1, 0xC186, 0x998A, 0xC187, 0x998B, 0xC188, 0x998C, 0xC189, 0x998D, 0xC18A, 0x998E, 0xC18B, 0x998F, + 0xC18C, 0xBCD2, 0xC18D, 0xBCD3, 0xC18E, 0xBCD4, 0xC18F, 0x9990, 0xC190, 0xBCD5, 0xC191, 0x9991, 0xC192, 0x9992, 0xC193, 0x9993, + 0xC194, 0xBCD6, 0xC195, 0x9994, 0xC196, 0xBCD7, 0xC197, 0x9995, 0xC198, 0x9996, 0xC199, 0x9997, 0xC19A, 0x9998, 0xC19B, 0x9999, + 0xC19C, 0xBCD8, 0xC19D, 0xBCD9, 0xC19E, 0x999A, 0xC19F, 0xBCDA, 0xC1A0, 0x999B, 0xC1A1, 0xBCDB, 0xC1A2, 0x999C, 0xC1A3, 0x999D, + 0xC1A4, 0x999E, 0xC1A5, 0xBCDC, 0xC1A6, 0x999F, 0xC1A7, 0x99A0, 0xC1A8, 0xBCDD, 0xC1A9, 0xBCDE, 0xC1AA, 0x99A1, 0xC1AB, 0x99A2, + 0xC1AC, 0xBCDF, 0xC1AD, 0x99A3, 0xC1AE, 0x99A4, 0xC1AF, 0x99A5, 0xC1B0, 0xBCE0, 0xC1B1, 0x99A6, 0xC1B2, 0x99A7, 0xC1B3, 0x99A8, + 0xC1B4, 0x99A9, 0xC1B5, 0x99AA, 0xC1B6, 0x99AB, 0xC1B7, 0x99AC, 0xC1B8, 0x99AD, 0xC1B9, 0x99AE, 0xC1BA, 0x99AF, 0xC1BB, 0x99B0, + 0xC1BC, 0x99B1, 0xC1BD, 0xBCE1, 0xC1BE, 0x99B2, 0xC1BF, 0x99B3, 0xC1C0, 0x99B4, 0xC1C1, 0x99B5, 0xC1C2, 0x99B6, 0xC1C3, 0x99B7, + 0xC1C4, 0xBCE2, 0xC1C5, 0x99B8, 0xC1C6, 0x99B9, 0xC1C7, 0x99BA, 0xC1C8, 0xBCE3, 0xC1C9, 0x99BB, 0xC1CA, 0x99BC, 0xC1CB, 0x99BD, + 0xC1CC, 0xBCE4, 0xC1CD, 0x99BE, 0xC1CE, 0x99BF, 0xC1CF, 0x99C0, 0xC1D0, 0x99C1, 0xC1D1, 0x99C2, 0xC1D2, 0x99C3, 0xC1D3, 0x99C4, + 0xC1D4, 0xBCE5, 0xC1D5, 0x99C5, 0xC1D6, 0x99C6, 0xC1D7, 0xBCE6, 0xC1D8, 0xBCE7, 0xC1D9, 0x99C7, 0xC1DA, 0x99C8, 0xC1DB, 0x99C9, + 0xC1DC, 0x99CA, 0xC1DD, 0x99CB, 0xC1DE, 0x99CC, 0xC1DF, 0x99CD, 0xC1E0, 0xBCE8, 0xC1E1, 0x99CE, 0xC1E2, 0x99CF, 0xC1E3, 0x99D0, + 0xC1E4, 0xBCE9, 0xC1E5, 0x99D1, 0xC1E6, 0x99D2, 0xC1E7, 0x99D3, 0xC1E8, 0xBCEA, 0xC1E9, 0x99D4, 0xC1EA, 0x99D5, 0xC1EB, 0x99D6, + 0xC1EC, 0x99D7, 0xC1ED, 0x99D8, 0xC1EE, 0x99D9, 0xC1EF, 0x99DA, 0xC1F0, 0xBCEB, 0xC1F1, 0xBCEC, 0xC1F2, 0x99DB, 0xC1F3, 0xBCED, + 0xC1F4, 0x99DC, 0xC1F5, 0x99DD, 0xC1F6, 0x99DE, 0xC1F7, 0x99DF, 0xC1F8, 0x99E0, 0xC1F9, 0x99E1, 0xC1FA, 0x99E2, 0xC1FB, 0x99E3, + 0xC1FC, 0xBCEE, 0xC1FD, 0xBCEF, 0xC1FE, 0x99E4, 0xC1FF, 0x99E5, 0xC200, 0xBCF0, 0xC201, 0x99E6, 0xC202, 0x99E7, 0xC203, 0x99E8, + 0xC204, 0xBCF1, 0xC205, 0x99E9, 0xC206, 0x99EA, 0xC207, 0x99EB, 0xC208, 0x99EC, 0xC209, 0x99ED, 0xC20A, 0x99EE, 0xC20B, 0x99EF, + 0xC20C, 0xBCF2, 0xC20D, 0xBCF3, 0xC20E, 0x99F0, 0xC20F, 0xBCF4, 0xC210, 0x99F1, 0xC211, 0xBCF5, 0xC212, 0x99F2, 0xC213, 0x99F3, + 0xC214, 0x99F4, 0xC215, 0x99F5, 0xC216, 0x99F6, 0xC217, 0x99F7, 0xC218, 0xBCF6, 0xC219, 0xBCF7, 0xC21A, 0x99F8, 0xC21B, 0x99F9, + 0xC21C, 0xBCF8, 0xC21D, 0x99FA, 0xC21E, 0x99FB, 0xC21F, 0xBCF9, 0xC220, 0xBCFA, 0xC221, 0x99FC, 0xC222, 0x99FD, 0xC223, 0x99FE, + 0xC224, 0x9A41, 0xC225, 0x9A42, 0xC226, 0x9A43, 0xC227, 0x9A44, 0xC228, 0xBCFB, 0xC229, 0xBCFC, 0xC22A, 0x9A45, 0xC22B, 0xBCFD, + 0xC22C, 0x9A46, 0xC22D, 0xBCFE, 0xC22E, 0x9A47, 0xC22F, 0xBDA1, 0xC230, 0x9A48, 0xC231, 0xBDA2, 0xC232, 0xBDA3, 0xC233, 0x9A49, + 0xC234, 0xBDA4, 0xC235, 0x9A4A, 0xC236, 0x9A4B, 0xC237, 0x9A4C, 0xC238, 0x9A4D, 0xC239, 0x9A4E, 0xC23A, 0x9A4F, 0xC23B, 0x9A50, + 0xC23C, 0x9A51, 0xC23D, 0x9A52, 0xC23E, 0x9A53, 0xC23F, 0x9A54, 0xC240, 0x9A55, 0xC241, 0x9A56, 0xC242, 0x9A57, 0xC243, 0x9A58, + 0xC244, 0x9A59, 0xC245, 0x9A5A, 0xC246, 0x9A61, 0xC247, 0x9A62, 0xC248, 0xBDA5, 0xC249, 0x9A63, 0xC24A, 0x9A64, 0xC24B, 0x9A65, + 0xC24C, 0x9A66, 0xC24D, 0x9A67, 0xC24E, 0x9A68, 0xC24F, 0x9A69, 0xC250, 0xBDA6, 0xC251, 0xBDA7, 0xC252, 0x9A6A, 0xC253, 0x9A6B, + 0xC254, 0xBDA8, 0xC255, 0x9A6C, 0xC256, 0x9A6D, 0xC257, 0x9A6E, 0xC258, 0xBDA9, 0xC259, 0x9A6F, 0xC25A, 0x9A70, 0xC25B, 0x9A71, + 0xC25C, 0x9A72, 0xC25D, 0x9A73, 0xC25E, 0x9A74, 0xC25F, 0x9A75, 0xC260, 0xBDAA, 0xC261, 0x9A76, 0xC262, 0x9A77, 0xC263, 0x9A78, + 0xC264, 0x9A79, 0xC265, 0xBDAB, 0xC266, 0x9A7A, 0xC267, 0x9A81, 0xC268, 0x9A82, 0xC269, 0x9A83, 0xC26A, 0x9A84, 0xC26B, 0x9A85, + 0xC26C, 0xBDAC, 0xC26D, 0xBDAD, 0xC26E, 0x9A86, 0xC26F, 0x9A87, 0xC270, 0xBDAE, 0xC271, 0x9A88, 0xC272, 0x9A89, 0xC273, 0x9A8A, + 0xC274, 0xBDAF, 0xC275, 0x9A8B, 0xC276, 0x9A8C, 0xC277, 0x9A8D, 0xC278, 0x9A8E, 0xC279, 0x9A8F, 0xC27A, 0x9A90, 0xC27B, 0x9A91, + 0xC27C, 0xBDB0, 0xC27D, 0xBDB1, 0xC27E, 0x9A92, 0xC27F, 0xBDB2, 0xC280, 0x9A93, 0xC281, 0xBDB3, 0xC282, 0x9A94, 0xC283, 0x9A95, + 0xC284, 0x9A96, 0xC285, 0x9A97, 0xC286, 0x9A98, 0xC287, 0x9A99, 0xC288, 0xBDB4, 0xC289, 0xBDB5, 0xC28A, 0x9A9A, 0xC28B, 0x9A9B, + 0xC28C, 0x9A9C, 0xC28D, 0x9A9D, 0xC28E, 0x9A9E, 0xC28F, 0x9A9F, 0xC290, 0xBDB6, 0xC291, 0x9AA0, 0xC292, 0x9AA1, 0xC293, 0x9AA2, + 0xC294, 0x9AA3, 0xC295, 0x9AA4, 0xC296, 0x9AA5, 0xC297, 0x9AA6, 0xC298, 0xBDB7, 0xC299, 0x9AA7, 0xC29A, 0x9AA8, 0xC29B, 0xBDB8, + 0xC29C, 0x9AA9, 0xC29D, 0xBDB9, 0xC29E, 0x9AAA, 0xC29F, 0x9AAB, 0xC2A0, 0x9AAC, 0xC2A1, 0x9AAD, 0xC2A2, 0x9AAE, 0xC2A3, 0x9AAF, + 0xC2A4, 0xBDBA, 0xC2A5, 0xBDBB, 0xC2A6, 0x9AB0, 0xC2A7, 0x9AB1, 0xC2A8, 0xBDBC, 0xC2A9, 0x9AB2, 0xC2AA, 0x9AB3, 0xC2AB, 0x9AB4, + 0xC2AC, 0xBDBD, 0xC2AD, 0xBDBE, 0xC2AE, 0x9AB5, 0xC2AF, 0x9AB6, 0xC2B0, 0x9AB7, 0xC2B1, 0x9AB8, 0xC2B2, 0x9AB9, 0xC2B3, 0x9ABA, + 0xC2B4, 0xBDBF, 0xC2B5, 0xBDC0, 0xC2B6, 0x9ABB, 0xC2B7, 0xBDC1, 0xC2B8, 0x9ABC, 0xC2B9, 0xBDC2, 0xC2BA, 0x9ABD, 0xC2BB, 0x9ABE, + 0xC2BC, 0x9ABF, 0xC2BD, 0x9AC0, 0xC2BE, 0x9AC1, 0xC2BF, 0x9AC2, 0xC2C0, 0x9AC3, 0xC2C1, 0x9AC4, 0xC2C2, 0x9AC5, 0xC2C3, 0x9AC6, + 0xC2C4, 0x9AC7, 0xC2C5, 0x9AC8, 0xC2C6, 0x9AC9, 0xC2C7, 0x9ACA, 0xC2C8, 0x9ACB, 0xC2C9, 0x9ACC, 0xC2CA, 0x9ACD, 0xC2CB, 0x9ACE, + 0xC2CC, 0x9ACF, 0xC2CD, 0x9AD0, 0xC2CE, 0x9AD1, 0xC2CF, 0x9AD2, 0xC2D0, 0x9AD3, 0xC2D1, 0x9AD4, 0xC2D2, 0x9AD5, 0xC2D3, 0x9AD6, + 0xC2D4, 0x9AD7, 0xC2D5, 0x9AD8, 0xC2D6, 0x9AD9, 0xC2D7, 0x9ADA, 0xC2D8, 0x9ADB, 0xC2D9, 0x9ADC, 0xC2DA, 0x9ADD, 0xC2DB, 0x9ADE, + 0xC2DC, 0xBDC3, 0xC2DD, 0xBDC4, 0xC2DE, 0x9ADF, 0xC2DF, 0x9AE0, 0xC2E0, 0xBDC5, 0xC2E1, 0x9AE1, 0xC2E2, 0x9AE2, 0xC2E3, 0xBDC6, + 0xC2E4, 0xBDC7, 0xC2E5, 0x9AE3, 0xC2E6, 0x9AE4, 0xC2E7, 0x9AE5, 0xC2E8, 0x9AE6, 0xC2E9, 0x9AE7, 0xC2EA, 0x9AE8, 0xC2EB, 0xBDC8, + 0xC2EC, 0xBDC9, 0xC2ED, 0xBDCA, 0xC2EE, 0x9AE9, 0xC2EF, 0xBDCB, 0xC2F0, 0x9AEA, 0xC2F1, 0xBDCC, 0xC2F2, 0x9AEB, 0xC2F3, 0x9AEC, + 0xC2F4, 0x9AED, 0xC2F5, 0x9AEE, 0xC2F6, 0xBDCD, 0xC2F7, 0x9AEF, 0xC2F8, 0xBDCE, 0xC2F9, 0xBDCF, 0xC2FA, 0x9AF0, 0xC2FB, 0xBDD0, + 0xC2FC, 0xBDD1, 0xC2FD, 0x9AF1, 0xC2FE, 0x9AF2, 0xC2FF, 0x9AF3, 0xC300, 0xBDD2, 0xC301, 0x9AF4, 0xC302, 0x9AF5, 0xC303, 0x9AF6, + 0xC304, 0x9AF7, 0xC305, 0x9AF8, 0xC306, 0x9AF9, 0xC307, 0x9AFA, 0xC308, 0xBDD3, 0xC309, 0xBDD4, 0xC30A, 0x9AFB, 0xC30B, 0x9AFC, + 0xC30C, 0xBDD5, 0xC30D, 0xBDD6, 0xC30E, 0x9AFD, 0xC30F, 0x9AFE, 0xC310, 0x9B41, 0xC311, 0x9B42, 0xC312, 0x9B43, 0xC313, 0xBDD7, + 0xC314, 0xBDD8, 0xC315, 0xBDD9, 0xC316, 0x9B44, 0xC317, 0x9B45, 0xC318, 0xBDDA, 0xC319, 0x9B46, 0xC31A, 0x9B47, 0xC31B, 0x9B48, + 0xC31C, 0xBDDB, 0xC31D, 0x9B49, 0xC31E, 0x9B4A, 0xC31F, 0x9B4B, 0xC320, 0x9B4C, 0xC321, 0x9B4D, 0xC322, 0x9B4E, 0xC323, 0x9B4F, + 0xC324, 0xBDDC, 0xC325, 0xBDDD, 0xC326, 0x9B50, 0xC327, 0x9B51, 0xC328, 0xBDDE, 0xC329, 0xBDDF, 0xC32A, 0x9B52, 0xC32B, 0x9B53, + 0xC32C, 0x9B54, 0xC32D, 0x9B55, 0xC32E, 0x9B56, 0xC32F, 0x9B57, 0xC330, 0x9B58, 0xC331, 0x9B59, 0xC332, 0x9B5A, 0xC333, 0x9B61, + 0xC334, 0x9B62, 0xC335, 0x9B63, 0xC336, 0x9B64, 0xC337, 0x9B65, 0xC338, 0x9B66, 0xC339, 0x9B67, 0xC33A, 0x9B68, 0xC33B, 0x9B69, + 0xC33C, 0x9B6A, 0xC33D, 0x9B6B, 0xC33E, 0x9B6C, 0xC33F, 0x9B6D, 0xC340, 0x9B6E, 0xC341, 0x9B6F, 0xC342, 0x9B70, 0xC343, 0x9B71, + 0xC344, 0x9B72, 0xC345, 0xBDE0, 0xC346, 0x9B73, 0xC347, 0x9B74, 0xC348, 0x9B75, 0xC349, 0x9B76, 0xC34A, 0x9B77, 0xC34B, 0x9B78, + 0xC34C, 0x9B79, 0xC34D, 0x9B7A, 0xC34E, 0x9B81, 0xC34F, 0x9B82, 0xC350, 0x9B83, 0xC351, 0x9B84, 0xC352, 0x9B85, 0xC353, 0x9B86, + 0xC354, 0x9B87, 0xC355, 0x9B88, 0xC356, 0x9B89, 0xC357, 0x9B8A, 0xC358, 0x9B8B, 0xC359, 0x9B8C, 0xC35A, 0x9B8D, 0xC35B, 0x9B8E, + 0xC35C, 0x9B8F, 0xC35D, 0x9B90, 0xC35E, 0x9B91, 0xC35F, 0x9B92, 0xC360, 0x9B93, 0xC361, 0x9B94, 0xC362, 0x9B95, 0xC363, 0x9B96, + 0xC364, 0x9B97, 0xC365, 0x9B98, 0xC366, 0x9B99, 0xC367, 0x9B9A, 0xC368, 0xBDE1, 0xC369, 0xBDE2, 0xC36A, 0x9B9B, 0xC36B, 0x9B9C, + 0xC36C, 0xBDE3, 0xC36D, 0x9B9D, 0xC36E, 0x9B9E, 0xC36F, 0x9B9F, 0xC370, 0xBDE4, 0xC371, 0x9BA0, 0xC372, 0xBDE5, 0xC373, 0x9BA1, + 0xC374, 0x9BA2, 0xC375, 0x9BA3, 0xC376, 0x9BA4, 0xC377, 0x9BA5, 0xC378, 0xBDE6, 0xC379, 0xBDE7, 0xC37A, 0x9BA6, 0xC37B, 0x9BA7, + 0xC37C, 0xBDE8, 0xC37D, 0xBDE9, 0xC37E, 0x9BA8, 0xC37F, 0x9BA9, 0xC380, 0x9BAA, 0xC381, 0x9BAB, 0xC382, 0x9BAC, 0xC383, 0x9BAD, + 0xC384, 0xBDEA, 0xC385, 0x9BAE, 0xC386, 0x9BAF, 0xC387, 0x9BB0, 0xC388, 0xBDEB, 0xC389, 0x9BB1, 0xC38A, 0x9BB2, 0xC38B, 0x9BB3, + 0xC38C, 0xBDEC, 0xC38D, 0x9BB4, 0xC38E, 0x9BB5, 0xC38F, 0x9BB6, 0xC390, 0x9BB7, 0xC391, 0x9BB8, 0xC392, 0x9BB9, 0xC393, 0x9BBA, + 0xC394, 0x9BBB, 0xC395, 0x9BBC, 0xC396, 0x9BBD, 0xC397, 0x9BBE, 0xC398, 0x9BBF, 0xC399, 0x9BC0, 0xC39A, 0x9BC1, 0xC39B, 0x9BC2, + 0xC39C, 0x9BC3, 0xC39D, 0x9BC4, 0xC39E, 0x9BC5, 0xC39F, 0x9BC6, 0xC3A0, 0x9BC7, 0xC3A1, 0x9BC8, 0xC3A2, 0x9BC9, 0xC3A3, 0x9BCA, + 0xC3A4, 0x9BCB, 0xC3A5, 0x9BCC, 0xC3A6, 0x9BCD, 0xC3A7, 0x9BCE, 0xC3A8, 0x9BCF, 0xC3A9, 0x9BD0, 0xC3AA, 0x9BD1, 0xC3AB, 0x9BD2, + 0xC3AC, 0x9BD3, 0xC3AD, 0x9BD4, 0xC3AE, 0x9BD5, 0xC3AF, 0x9BD6, 0xC3B0, 0x9BD7, 0xC3B1, 0x9BD8, 0xC3B2, 0x9BD9, 0xC3B3, 0x9BDA, + 0xC3B4, 0x9BDB, 0xC3B5, 0x9BDC, 0xC3B6, 0x9BDD, 0xC3B7, 0x9BDE, 0xC3B8, 0x9BDF, 0xC3B9, 0x9BE0, 0xC3BA, 0x9BE1, 0xC3BB, 0x9BE2, + 0xC3BC, 0x9BE3, 0xC3BD, 0x9BE4, 0xC3BE, 0x9BE5, 0xC3BF, 0x9BE6, 0xC3C0, 0xBDED, 0xC3C1, 0x9BE7, 0xC3C2, 0x9BE8, 0xC3C3, 0x9BE9, + 0xC3C4, 0x9BEA, 0xC3C5, 0x9BEB, 0xC3C6, 0x9BEC, 0xC3C7, 0x9BED, 0xC3C8, 0x9BEE, 0xC3C9, 0x9BEF, 0xC3CA, 0x9BF0, 0xC3CB, 0x9BF1, + 0xC3CC, 0x9BF2, 0xC3CD, 0x9BF3, 0xC3CE, 0x9BF4, 0xC3CF, 0x9BF5, 0xC3D0, 0x9BF6, 0xC3D1, 0x9BF7, 0xC3D2, 0x9BF8, 0xC3D3, 0x9BF9, + 0xC3D4, 0x9BFA, 0xC3D5, 0x9BFB, 0xC3D6, 0x9BFC, 0xC3D7, 0x9BFD, 0xC3D8, 0xBDEE, 0xC3D9, 0xBDEF, 0xC3DA, 0x9BFE, 0xC3DB, 0x9C41, + 0xC3DC, 0xBDF0, 0xC3DD, 0x9C42, 0xC3DE, 0x9C43, 0xC3DF, 0xBDF1, 0xC3E0, 0xBDF2, 0xC3E1, 0x9C44, 0xC3E2, 0xBDF3, 0xC3E3, 0x9C45, + 0xC3E4, 0x9C46, 0xC3E5, 0x9C47, 0xC3E6, 0x9C48, 0xC3E7, 0x9C49, 0xC3E8, 0xBDF4, 0xC3E9, 0xBDF5, 0xC3EA, 0x9C4A, 0xC3EB, 0x9C4B, + 0xC3EC, 0x9C4C, 0xC3ED, 0xBDF6, 0xC3EE, 0x9C4D, 0xC3EF, 0x9C4E, 0xC3F0, 0x9C4F, 0xC3F1, 0x9C50, 0xC3F2, 0x9C51, 0xC3F3, 0x9C52, + 0xC3F4, 0xBDF7, 0xC3F5, 0xBDF8, 0xC3F6, 0x9C53, 0xC3F7, 0x9C54, 0xC3F8, 0xBDF9, 0xC3F9, 0x9C55, 0xC3FA, 0x9C56, 0xC3FB, 0x9C57, + 0xC3FC, 0x9C58, 0xC3FD, 0x9C59, 0xC3FE, 0x9C5A, 0xC3FF, 0x9C61, 0xC400, 0x9C62, 0xC401, 0x9C63, 0xC402, 0x9C64, 0xC403, 0x9C65, + 0xC404, 0x9C66, 0xC405, 0x9C67, 0xC406, 0x9C68, 0xC407, 0x9C69, 0xC408, 0xBDFA, 0xC409, 0x9C6A, 0xC40A, 0x9C6B, 0xC40B, 0x9C6C, + 0xC40C, 0x9C6D, 0xC40D, 0x9C6E, 0xC40E, 0x9C6F, 0xC40F, 0x9C70, 0xC410, 0xBDFB, 0xC411, 0x9C71, 0xC412, 0x9C72, 0xC413, 0x9C73, + 0xC414, 0x9C74, 0xC415, 0x9C75, 0xC416, 0x9C76, 0xC417, 0x9C77, 0xC418, 0x9C78, 0xC419, 0x9C79, 0xC41A, 0x9C7A, 0xC41B, 0x9C81, + 0xC41C, 0x9C82, 0xC41D, 0x9C83, 0xC41E, 0x9C84, 0xC41F, 0x9C85, 0xC420, 0x9C86, 0xC421, 0x9C87, 0xC422, 0x9C88, 0xC423, 0x9C89, + 0xC424, 0xBDFC, 0xC425, 0x9C8A, 0xC426, 0x9C8B, 0xC427, 0x9C8C, 0xC428, 0x9C8D, 0xC429, 0x9C8E, 0xC42A, 0x9C8F, 0xC42B, 0x9C90, + 0xC42C, 0xBDFD, 0xC42D, 0x9C91, 0xC42E, 0x9C92, 0xC42F, 0x9C93, 0xC430, 0xBDFE, 0xC431, 0x9C94, 0xC432, 0x9C95, 0xC433, 0x9C96, + 0xC434, 0xBEA1, 0xC435, 0x9C97, 0xC436, 0x9C98, 0xC437, 0x9C99, 0xC438, 0x9C9A, 0xC439, 0x9C9B, 0xC43A, 0x9C9C, 0xC43B, 0x9C9D, + 0xC43C, 0xBEA2, 0xC43D, 0xBEA3, 0xC43E, 0x9C9E, 0xC43F, 0x9C9F, 0xC440, 0x9CA0, 0xC441, 0x9CA1, 0xC442, 0x9CA2, 0xC443, 0x9CA3, + 0xC444, 0x9CA4, 0xC445, 0x9CA5, 0xC446, 0x9CA6, 0xC447, 0x9CA7, 0xC448, 0xBEA4, 0xC449, 0x9CA8, 0xC44A, 0x9CA9, 0xC44B, 0x9CAA, + 0xC44C, 0x9CAB, 0xC44D, 0x9CAC, 0xC44E, 0x9CAD, 0xC44F, 0x9CAE, 0xC450, 0x9CAF, 0xC451, 0x9CB0, 0xC452, 0x9CB1, 0xC453, 0x9CB2, + 0xC454, 0x9CB3, 0xC455, 0x9CB4, 0xC456, 0x9CB5, 0xC457, 0x9CB6, 0xC458, 0x9CB7, 0xC459, 0x9CB8, 0xC45A, 0x9CB9, 0xC45B, 0x9CBA, + 0xC45C, 0x9CBB, 0xC45D, 0x9CBC, 0xC45E, 0x9CBD, 0xC45F, 0x9CBE, 0xC460, 0x9CBF, 0xC461, 0x9CC0, 0xC462, 0x9CC1, 0xC463, 0x9CC2, + 0xC464, 0xBEA5, 0xC465, 0xBEA6, 0xC466, 0x9CC3, 0xC467, 0x9CC4, 0xC468, 0xBEA7, 0xC469, 0x9CC5, 0xC46A, 0x9CC6, 0xC46B, 0x9CC7, + 0xC46C, 0xBEA8, 0xC46D, 0x9CC8, 0xC46E, 0x9CC9, 0xC46F, 0x9CCA, 0xC470, 0x9CCB, 0xC471, 0x9CCC, 0xC472, 0x9CCD, 0xC473, 0x9CCE, + 0xC474, 0xBEA9, 0xC475, 0xBEAA, 0xC476, 0x9CCF, 0xC477, 0x9CD0, 0xC478, 0x9CD1, 0xC479, 0xBEAB, 0xC47A, 0x9CD2, 0xC47B, 0x9CD3, + 0xC47C, 0x9CD4, 0xC47D, 0x9CD5, 0xC47E, 0x9CD6, 0xC47F, 0x9CD7, 0xC480, 0xBEAC, 0xC481, 0x9CD8, 0xC482, 0x9CD9, 0xC483, 0x9CDA, + 0xC484, 0x9CDB, 0xC485, 0x9CDC, 0xC486, 0x9CDD, 0xC487, 0x9CDE, 0xC488, 0x9CDF, 0xC489, 0x9CE0, 0xC48A, 0x9CE1, 0xC48B, 0x9CE2, + 0xC48C, 0x9CE3, 0xC48D, 0x9CE4, 0xC48E, 0x9CE5, 0xC48F, 0x9CE6, 0xC490, 0x9CE7, 0xC491, 0x9CE8, 0xC492, 0x9CE9, 0xC493, 0x9CEA, + 0xC494, 0xBEAD, 0xC495, 0x9CEB, 0xC496, 0x9CEC, 0xC497, 0x9CED, 0xC498, 0x9CEE, 0xC499, 0x9CEF, 0xC49A, 0x9CF0, 0xC49B, 0x9CF1, + 0xC49C, 0xBEAE, 0xC49D, 0x9CF2, 0xC49E, 0x9CF3, 0xC49F, 0x9CF4, 0xC4A0, 0x9CF5, 0xC4A1, 0x9CF6, 0xC4A2, 0x9CF7, 0xC4A3, 0x9CF8, + 0xC4A4, 0x9CF9, 0xC4A5, 0x9CFA, 0xC4A6, 0x9CFB, 0xC4A7, 0x9CFC, 0xC4A8, 0x9CFD, 0xC4A9, 0x9CFE, 0xC4AA, 0x9D41, 0xC4AB, 0x9D42, + 0xC4AC, 0x9D43, 0xC4AD, 0x9D44, 0xC4AE, 0x9D45, 0xC4AF, 0x9D46, 0xC4B0, 0x9D47, 0xC4B1, 0x9D48, 0xC4B2, 0x9D49, 0xC4B3, 0x9D4A, + 0xC4B4, 0x9D4B, 0xC4B5, 0x9D4C, 0xC4B6, 0x9D4D, 0xC4B7, 0x9D4E, 0xC4B8, 0xBEAF, 0xC4B9, 0x9D4F, 0xC4BA, 0x9D50, 0xC4BB, 0x9D51, + 0xC4BC, 0xBEB0, 0xC4BD, 0x9D52, 0xC4BE, 0x9D53, 0xC4BF, 0x9D54, 0xC4C0, 0x9D55, 0xC4C1, 0x9D56, 0xC4C2, 0x9D57, 0xC4C3, 0x9D58, + 0xC4C4, 0x9D59, 0xC4C5, 0x9D5A, 0xC4C6, 0x9D61, 0xC4C7, 0x9D62, 0xC4C8, 0x9D63, 0xC4C9, 0x9D64, 0xC4CA, 0x9D65, 0xC4CB, 0x9D66, + 0xC4CC, 0x9D67, 0xC4CD, 0x9D68, 0xC4CE, 0x9D69, 0xC4CF, 0x9D6A, 0xC4D0, 0x9D6B, 0xC4D1, 0x9D6C, 0xC4D2, 0x9D6D, 0xC4D3, 0x9D6E, + 0xC4D4, 0x9D6F, 0xC4D5, 0x9D70, 0xC4D6, 0x9D71, 0xC4D7, 0x9D72, 0xC4D8, 0x9D73, 0xC4D9, 0x9D74, 0xC4DA, 0x9D75, 0xC4DB, 0x9D76, + 0xC4DC, 0x9D77, 0xC4DD, 0x9D78, 0xC4DE, 0x9D79, 0xC4DF, 0x9D7A, 0xC4E0, 0x9D81, 0xC4E1, 0x9D82, 0xC4E2, 0x9D83, 0xC4E3, 0x9D84, + 0xC4E4, 0x9D85, 0xC4E5, 0x9D86, 0xC4E6, 0x9D87, 0xC4E7, 0x9D88, 0xC4E8, 0x9D89, 0xC4E9, 0xBEB1, 0xC4EA, 0x9D8A, 0xC4EB, 0x9D8B, + 0xC4EC, 0x9D8C, 0xC4ED, 0x9D8D, 0xC4EE, 0x9D8E, 0xC4EF, 0x9D8F, 0xC4F0, 0xBEB2, 0xC4F1, 0xBEB3, 0xC4F2, 0x9D90, 0xC4F3, 0x9D91, + 0xC4F4, 0xBEB4, 0xC4F5, 0x9D92, 0xC4F6, 0x9D93, 0xC4F7, 0x9D94, 0xC4F8, 0xBEB5, 0xC4F9, 0x9D95, 0xC4FA, 0xBEB6, 0xC4FB, 0x9D96, + 0xC4FC, 0x9D97, 0xC4FD, 0x9D98, 0xC4FE, 0x9D99, 0xC4FF, 0xBEB7, 0xC500, 0xBEB8, 0xC501, 0xBEB9, 0xC502, 0x9D9A, 0xC503, 0x9D9B, + 0xC504, 0x9D9C, 0xC505, 0x9D9D, 0xC506, 0x9D9E, 0xC507, 0x9D9F, 0xC508, 0x9DA0, 0xC509, 0x9DA1, 0xC50A, 0x9DA2, 0xC50B, 0x9DA3, + 0xC50C, 0xBEBA, 0xC50D, 0x9DA4, 0xC50E, 0x9DA5, 0xC50F, 0x9DA6, 0xC510, 0xBEBB, 0xC511, 0x9DA7, 0xC512, 0x9DA8, 0xC513, 0x9DA9, + 0xC514, 0xBEBC, 0xC515, 0x9DAA, 0xC516, 0x9DAB, 0xC517, 0x9DAC, 0xC518, 0x9DAD, 0xC519, 0x9DAE, 0xC51A, 0x9DAF, 0xC51B, 0x9DB0, + 0xC51C, 0xBEBD, 0xC51D, 0x9DB1, 0xC51E, 0x9DB2, 0xC51F, 0x9DB3, 0xC520, 0x9DB4, 0xC521, 0x9DB5, 0xC522, 0x9DB6, 0xC523, 0x9DB7, + 0xC524, 0x9DB8, 0xC525, 0x9DB9, 0xC526, 0x9DBA, 0xC527, 0x9DBB, 0xC528, 0xBEBE, 0xC529, 0xBEBF, 0xC52A, 0x9DBC, 0xC52B, 0x9DBD, + 0xC52C, 0xBEC0, 0xC52D, 0x9DBE, 0xC52E, 0x9DBF, 0xC52F, 0x9DC0, 0xC530, 0xBEC1, 0xC531, 0x9DC1, 0xC532, 0x9DC2, 0xC533, 0x9DC3, + 0xC534, 0x9DC4, 0xC535, 0x9DC5, 0xC536, 0x9DC6, 0xC537, 0x9DC7, 0xC538, 0xBEC2, 0xC539, 0xBEC3, 0xC53A, 0x9DC8, 0xC53B, 0xBEC4, + 0xC53C, 0x9DC9, 0xC53D, 0xBEC5, 0xC53E, 0x9DCA, 0xC53F, 0x9DCB, 0xC540, 0x9DCC, 0xC541, 0x9DCD, 0xC542, 0x9DCE, 0xC543, 0x9DCF, + 0xC544, 0xBEC6, 0xC545, 0xBEC7, 0xC546, 0x9DD0, 0xC547, 0x9DD1, 0xC548, 0xBEC8, 0xC549, 0xBEC9, 0xC54A, 0xBECA, 0xC54B, 0x9DD2, + 0xC54C, 0xBECB, 0xC54D, 0xBECC, 0xC54E, 0xBECD, 0xC54F, 0x9DD3, 0xC550, 0x9DD4, 0xC551, 0x9DD5, 0xC552, 0x9DD6, 0xC553, 0xBECE, + 0xC554, 0xBECF, 0xC555, 0xBED0, 0xC556, 0x9DD7, 0xC557, 0xBED1, 0xC558, 0xBED2, 0xC559, 0xBED3, 0xC55A, 0x9DD8, 0xC55B, 0x9DD9, + 0xC55C, 0x9DDA, 0xC55D, 0xBED4, 0xC55E, 0xBED5, 0xC55F, 0x9DDB, 0xC560, 0xBED6, 0xC561, 0xBED7, 0xC562, 0x9DDC, 0xC563, 0x9DDD, + 0xC564, 0xBED8, 0xC565, 0x9DDE, 0xC566, 0x9DDF, 0xC567, 0x9DE0, 0xC568, 0xBED9, 0xC569, 0x9DE1, 0xC56A, 0x9DE2, 0xC56B, 0x9DE3, + 0xC56C, 0x9DE4, 0xC56D, 0x9DE5, 0xC56E, 0x9DE6, 0xC56F, 0x9DE7, 0xC570, 0xBEDA, 0xC571, 0xBEDB, 0xC572, 0x9DE8, 0xC573, 0xBEDC, + 0xC574, 0xBEDD, 0xC575, 0xBEDE, 0xC576, 0x9DE9, 0xC577, 0x9DEA, 0xC578, 0x9DEB, 0xC579, 0x9DEC, 0xC57A, 0x9DED, 0xC57B, 0x9DEE, + 0xC57C, 0xBEDF, 0xC57D, 0xBEE0, 0xC57E, 0x9DEF, 0xC57F, 0x9DF0, 0xC580, 0xBEE1, 0xC581, 0x9DF1, 0xC582, 0x9DF2, 0xC583, 0x9DF3, + 0xC584, 0xBEE2, 0xC585, 0x9DF4, 0xC586, 0x9DF5, 0xC587, 0xBEE3, 0xC588, 0x9DF6, 0xC589, 0x9DF7, 0xC58A, 0x9DF8, 0xC58B, 0x9DF9, + 0xC58C, 0xBEE4, 0xC58D, 0xBEE5, 0xC58E, 0x9DFA, 0xC58F, 0xBEE6, 0xC590, 0x9DFB, 0xC591, 0xBEE7, 0xC592, 0x9DFC, 0xC593, 0x9DFD, + 0xC594, 0x9DFE, 0xC595, 0xBEE8, 0xC596, 0x9E41, 0xC597, 0xBEE9, 0xC598, 0xBEEA, 0xC599, 0x9E42, 0xC59A, 0x9E43, 0xC59B, 0x9E44, + 0xC59C, 0xBEEB, 0xC59D, 0x9E45, 0xC59E, 0x9E46, 0xC59F, 0x9E47, 0xC5A0, 0xBEEC, 0xC5A1, 0x9E48, 0xC5A2, 0x9E49, 0xC5A3, 0x9E4A, + 0xC5A4, 0x9E4B, 0xC5A5, 0x9E4C, 0xC5A6, 0x9E4D, 0xC5A7, 0x9E4E, 0xC5A8, 0x9E4F, 0xC5A9, 0xBEED, 0xC5AA, 0x9E50, 0xC5AB, 0x9E51, + 0xC5AC, 0x9E52, 0xC5AD, 0x9E53, 0xC5AE, 0x9E54, 0xC5AF, 0x9E55, 0xC5B0, 0x9E56, 0xC5B1, 0x9E57, 0xC5B2, 0x9E58, 0xC5B3, 0x9E59, + 0xC5B4, 0xBEEE, 0xC5B5, 0xBEEF, 0xC5B6, 0x9E5A, 0xC5B7, 0x9E61, 0xC5B8, 0xBEF0, 0xC5B9, 0xBEF1, 0xC5BA, 0x9E62, 0xC5BB, 0xBEF2, + 0xC5BC, 0xBEF3, 0xC5BD, 0xBEF4, 0xC5BE, 0xBEF5, 0xC5BF, 0x9E63, 0xC5C0, 0x9E64, 0xC5C1, 0x9E65, 0xC5C2, 0x9E66, 0xC5C3, 0x9E67, + 0xC5C4, 0xBEF6, 0xC5C5, 0xBEF7, 0xC5C6, 0xBEF8, 0xC5C7, 0xBEF9, 0xC5C8, 0xBEFA, 0xC5C9, 0xBEFB, 0xC5CA, 0xBEFC, 0xC5CB, 0x9E68, + 0xC5CC, 0xBEFD, 0xC5CD, 0x9E69, 0xC5CE, 0xBEFE, 0xC5CF, 0x9E6A, 0xC5D0, 0xBFA1, 0xC5D1, 0xBFA2, 0xC5D2, 0x9E6B, 0xC5D3, 0x9E6C, + 0xC5D4, 0xBFA3, 0xC5D5, 0x9E6D, 0xC5D6, 0x9E6E, 0xC5D7, 0x9E6F, 0xC5D8, 0xBFA4, 0xC5D9, 0x9E70, 0xC5DA, 0x9E71, 0xC5DB, 0x9E72, + 0xC5DC, 0x9E73, 0xC5DD, 0x9E74, 0xC5DE, 0x9E75, 0xC5DF, 0x9E76, 0xC5E0, 0xBFA5, 0xC5E1, 0xBFA6, 0xC5E2, 0x9E77, 0xC5E3, 0xBFA7, + 0xC5E4, 0x9E78, 0xC5E5, 0xBFA8, 0xC5E6, 0x9E79, 0xC5E7, 0x9E7A, 0xC5E8, 0x9E81, 0xC5E9, 0x9E82, 0xC5EA, 0x9E83, 0xC5EB, 0x9E84, + 0xC5EC, 0xBFA9, 0xC5ED, 0xBFAA, 0xC5EE, 0xBFAB, 0xC5EF, 0x9E85, 0xC5F0, 0xBFAC, 0xC5F1, 0x9E86, 0xC5F2, 0x9E87, 0xC5F3, 0x9E88, + 0xC5F4, 0xBFAD, 0xC5F5, 0x9E89, 0xC5F6, 0xBFAE, 0xC5F7, 0xBFAF, 0xC5F8, 0x9E8A, 0xC5F9, 0x9E8B, 0xC5FA, 0x9E8C, 0xC5FB, 0x9E8D, + 0xC5FC, 0xBFB0, 0xC5FD, 0xBFB1, 0xC5FE, 0xBFB2, 0xC5FF, 0xBFB3, 0xC600, 0xBFB4, 0xC601, 0xBFB5, 0xC602, 0x9E8E, 0xC603, 0x9E8F, + 0xC604, 0x9E90, 0xC605, 0xBFB6, 0xC606, 0xBFB7, 0xC607, 0xBFB8, 0xC608, 0xBFB9, 0xC609, 0x9E91, 0xC60A, 0x9E92, 0xC60B, 0x9E93, + 0xC60C, 0xBFBA, 0xC60D, 0x9E94, 0xC60E, 0x9E95, 0xC60F, 0x9E96, 0xC610, 0xBFBB, 0xC611, 0x9E97, 0xC612, 0x9E98, 0xC613, 0x9E99, + 0xC614, 0x9E9A, 0xC615, 0x9E9B, 0xC616, 0x9E9C, 0xC617, 0x9E9D, 0xC618, 0xBFBC, 0xC619, 0xBFBD, 0xC61A, 0x9E9E, 0xC61B, 0xBFBE, + 0xC61C, 0xBFBF, 0xC61D, 0x9E9F, 0xC61E, 0x9EA0, 0xC61F, 0x9EA1, 0xC620, 0x9EA2, 0xC621, 0x9EA3, 0xC622, 0x9EA4, 0xC623, 0x9EA5, + 0xC624, 0xBFC0, 0xC625, 0xBFC1, 0xC626, 0x9EA6, 0xC627, 0x9EA7, 0xC628, 0xBFC2, 0xC629, 0x9EA8, 0xC62A, 0x9EA9, 0xC62B, 0x9EAA, + 0xC62C, 0xBFC3, 0xC62D, 0xBFC4, 0xC62E, 0xBFC5, 0xC62F, 0x9EAB, 0xC630, 0xBFC6, 0xC631, 0x9EAC, 0xC632, 0x9EAD, 0xC633, 0xBFC7, + 0xC634, 0xBFC8, 0xC635, 0xBFC9, 0xC636, 0x9EAE, 0xC637, 0xBFCA, 0xC638, 0x9EAF, 0xC639, 0xBFCB, 0xC63A, 0x9EB0, 0xC63B, 0xBFCC, + 0xC63C, 0x9EB1, 0xC63D, 0x9EB2, 0xC63E, 0x9EB3, 0xC63F, 0x9EB4, 0xC640, 0xBFCD, 0xC641, 0xBFCE, 0xC642, 0x9EB5, 0xC643, 0x9EB6, + 0xC644, 0xBFCF, 0xC645, 0x9EB7, 0xC646, 0x9EB8, 0xC647, 0x9EB9, 0xC648, 0xBFD0, 0xC649, 0x9EBA, 0xC64A, 0x9EBB, 0xC64B, 0x9EBC, + 0xC64C, 0x9EBD, 0xC64D, 0x9EBE, 0xC64E, 0x9EBF, 0xC64F, 0x9EC0, 0xC650, 0xBFD1, 0xC651, 0xBFD2, 0xC652, 0x9EC1, 0xC653, 0xBFD3, + 0xC654, 0xBFD4, 0xC655, 0xBFD5, 0xC656, 0x9EC2, 0xC657, 0x9EC3, 0xC658, 0x9EC4, 0xC659, 0x9EC5, 0xC65A, 0x9EC6, 0xC65B, 0x9EC7, + 0xC65C, 0xBFD6, 0xC65D, 0xBFD7, 0xC65E, 0x9EC8, 0xC65F, 0x9EC9, 0xC660, 0xBFD8, 0xC661, 0x9ECA, 0xC662, 0x9ECB, 0xC663, 0x9ECC, + 0xC664, 0x9ECD, 0xC665, 0x9ECE, 0xC666, 0x9ECF, 0xC667, 0x9ED0, 0xC668, 0x9ED1, 0xC669, 0x9ED2, 0xC66A, 0x9ED3, 0xC66B, 0x9ED4, + 0xC66C, 0xBFD9, 0xC66D, 0x9ED5, 0xC66E, 0x9ED6, 0xC66F, 0xBFDA, 0xC670, 0x9ED7, 0xC671, 0xBFDB, 0xC672, 0x9ED8, 0xC673, 0x9ED9, + 0xC674, 0x9EDA, 0xC675, 0x9EDB, 0xC676, 0x9EDC, 0xC677, 0x9EDD, 0xC678, 0xBFDC, 0xC679, 0xBFDD, 0xC67A, 0x9EDE, 0xC67B, 0x9EDF, + 0xC67C, 0xBFDE, 0xC67D, 0x9EE0, 0xC67E, 0x9EE1, 0xC67F, 0x9EE2, 0xC680, 0xBFDF, 0xC681, 0x9EE3, 0xC682, 0x9EE4, 0xC683, 0x9EE5, + 0xC684, 0x9EE6, 0xC685, 0x9EE7, 0xC686, 0x9EE8, 0xC687, 0x9EE9, 0xC688, 0xBFE0, 0xC689, 0xBFE1, 0xC68A, 0x9EEA, 0xC68B, 0xBFE2, + 0xC68C, 0x9EEB, 0xC68D, 0xBFE3, 0xC68E, 0x9EEC, 0xC68F, 0x9EED, 0xC690, 0x9EEE, 0xC691, 0x9EEF, 0xC692, 0x9EF0, 0xC693, 0x9EF1, + 0xC694, 0xBFE4, 0xC695, 0xBFE5, 0xC696, 0x9EF2, 0xC697, 0x9EF3, 0xC698, 0xBFE6, 0xC699, 0x9EF4, 0xC69A, 0x9EF5, 0xC69B, 0x9EF6, + 0xC69C, 0xBFE7, 0xC69D, 0x9EF7, 0xC69E, 0x9EF8, 0xC69F, 0x9EF9, 0xC6A0, 0x9EFA, 0xC6A1, 0x9EFB, 0xC6A2, 0x9EFC, 0xC6A3, 0x9EFD, + 0xC6A4, 0xBFE8, 0xC6A5, 0xBFE9, 0xC6A6, 0x9EFE, 0xC6A7, 0xBFEA, 0xC6A8, 0x9F41, 0xC6A9, 0xBFEB, 0xC6AA, 0x9F42, 0xC6AB, 0x9F43, + 0xC6AC, 0x9F44, 0xC6AD, 0x9F45, 0xC6AE, 0x9F46, 0xC6AF, 0x9F47, 0xC6B0, 0xBFEC, 0xC6B1, 0xBFED, 0xC6B2, 0x9F48, 0xC6B3, 0x9F49, + 0xC6B4, 0xBFEE, 0xC6B5, 0x9F4A, 0xC6B6, 0x9F4B, 0xC6B7, 0x9F4C, 0xC6B8, 0xBFEF, 0xC6B9, 0xBFF0, 0xC6BA, 0xBFF1, 0xC6BB, 0x9F4D, + 0xC6BC, 0x9F4E, 0xC6BD, 0x9F4F, 0xC6BE, 0x9F50, 0xC6BF, 0x9F51, 0xC6C0, 0xBFF2, 0xC6C1, 0xBFF3, 0xC6C2, 0x9F52, 0xC6C3, 0xBFF4, + 0xC6C4, 0x9F53, 0xC6C5, 0xBFF5, 0xC6C6, 0x9F54, 0xC6C7, 0x9F55, 0xC6C8, 0x9F56, 0xC6C9, 0x9F57, 0xC6CA, 0x9F58, 0xC6CB, 0x9F59, + 0xC6CC, 0xBFF6, 0xC6CD, 0xBFF7, 0xC6CE, 0x9F5A, 0xC6CF, 0x9F61, 0xC6D0, 0xBFF8, 0xC6D1, 0x9F62, 0xC6D2, 0x9F63, 0xC6D3, 0x9F64, + 0xC6D4, 0xBFF9, 0xC6D5, 0x9F65, 0xC6D6, 0x9F66, 0xC6D7, 0x9F67, 0xC6D8, 0x9F68, 0xC6D9, 0x9F69, 0xC6DA, 0x9F6A, 0xC6DB, 0x9F6B, + 0xC6DC, 0xBFFA, 0xC6DD, 0xBFFB, 0xC6DE, 0x9F6C, 0xC6DF, 0x9F6D, 0xC6E0, 0xBFFC, 0xC6E1, 0xBFFD, 0xC6E2, 0x9F6E, 0xC6E3, 0x9F6F, + 0xC6E4, 0x9F70, 0xC6E5, 0x9F71, 0xC6E6, 0x9F72, 0xC6E7, 0x9F73, 0xC6E8, 0xBFFE, 0xC6E9, 0xC0A1, 0xC6EA, 0x9F74, 0xC6EB, 0x9F75, + 0xC6EC, 0xC0A2, 0xC6ED, 0x9F76, 0xC6EE, 0x9F77, 0xC6EF, 0x9F78, 0xC6F0, 0xC0A3, 0xC6F1, 0x9F79, 0xC6F2, 0x9F7A, 0xC6F3, 0x9F81, + 0xC6F4, 0x9F82, 0xC6F5, 0x9F83, 0xC6F6, 0x9F84, 0xC6F7, 0x9F85, 0xC6F8, 0xC0A4, 0xC6F9, 0xC0A5, 0xC6FA, 0x9F86, 0xC6FB, 0x9F87, + 0xC6FC, 0x9F88, 0xC6FD, 0xC0A6, 0xC6FE, 0x9F89, 0xC6FF, 0x9F8A, 0xC700, 0x9F8B, 0xC701, 0x9F8C, 0xC702, 0x9F8D, 0xC703, 0x9F8E, + 0xC704, 0xC0A7, 0xC705, 0xC0A8, 0xC706, 0x9F8F, 0xC707, 0x9F90, 0xC708, 0xC0A9, 0xC709, 0x9F91, 0xC70A, 0x9F92, 0xC70B, 0x9F93, + 0xC70C, 0xC0AA, 0xC70D, 0x9F94, 0xC70E, 0x9F95, 0xC70F, 0x9F96, 0xC710, 0x9F97, 0xC711, 0x9F98, 0xC712, 0x9F99, 0xC713, 0x9F9A, + 0xC714, 0xC0AB, 0xC715, 0xC0AC, 0xC716, 0x9F9B, 0xC717, 0xC0AD, 0xC718, 0x9F9C, 0xC719, 0xC0AE, 0xC71A, 0x9F9D, 0xC71B, 0x9F9E, + 0xC71C, 0x9F9F, 0xC71D, 0x9FA0, 0xC71E, 0x9FA1, 0xC71F, 0x9FA2, 0xC720, 0xC0AF, 0xC721, 0xC0B0, 0xC722, 0x9FA3, 0xC723, 0x9FA4, + 0xC724, 0xC0B1, 0xC725, 0x9FA5, 0xC726, 0x9FA6, 0xC727, 0x9FA7, 0xC728, 0xC0B2, 0xC729, 0x9FA8, 0xC72A, 0x9FA9, 0xC72B, 0x9FAA, + 0xC72C, 0x9FAB, 0xC72D, 0x9FAC, 0xC72E, 0x9FAD, 0xC72F, 0x9FAE, 0xC730, 0xC0B3, 0xC731, 0xC0B4, 0xC732, 0x9FAF, 0xC733, 0xC0B5, + 0xC734, 0x9FB0, 0xC735, 0xC0B6, 0xC736, 0x9FB1, 0xC737, 0xC0B7, 0xC738, 0x9FB2, 0xC739, 0x9FB3, 0xC73A, 0x9FB4, 0xC73B, 0x9FB5, + 0xC73C, 0xC0B8, 0xC73D, 0xC0B9, 0xC73E, 0x9FB6, 0xC73F, 0x9FB7, 0xC740, 0xC0BA, 0xC741, 0x9FB8, 0xC742, 0x9FB9, 0xC743, 0x9FBA, + 0xC744, 0xC0BB, 0xC745, 0x9FBB, 0xC746, 0x9FBC, 0xC747, 0x9FBD, 0xC748, 0x9FBE, 0xC749, 0x9FBF, 0xC74A, 0xC0BC, 0xC74B, 0x9FC0, + 0xC74C, 0xC0BD, 0xC74D, 0xC0BE, 0xC74E, 0x9FC1, 0xC74F, 0xC0BF, 0xC750, 0x9FC2, 0xC751, 0xC0C0, 0xC752, 0xC0C1, 0xC753, 0xC0C2, + 0xC754, 0xC0C3, 0xC755, 0xC0C4, 0xC756, 0xC0C5, 0xC757, 0xC0C6, 0xC758, 0xC0C7, 0xC759, 0x9FC3, 0xC75A, 0x9FC4, 0xC75B, 0x9FC5, + 0xC75C, 0xC0C8, 0xC75D, 0x9FC6, 0xC75E, 0x9FC7, 0xC75F, 0x9FC8, 0xC760, 0xC0C9, 0xC761, 0x9FC9, 0xC762, 0x9FCA, 0xC763, 0x9FCB, + 0xC764, 0x9FCC, 0xC765, 0x9FCD, 0xC766, 0x9FCE, 0xC767, 0x9FCF, 0xC768, 0xC0CA, 0xC769, 0x9FD0, 0xC76A, 0x9FD1, 0xC76B, 0xC0CB, + 0xC76C, 0x9FD2, 0xC76D, 0x9FD3, 0xC76E, 0x9FD4, 0xC76F, 0x9FD5, 0xC770, 0x9FD6, 0xC771, 0x9FD7, 0xC772, 0x9FD8, 0xC773, 0x9FD9, + 0xC774, 0xC0CC, 0xC775, 0xC0CD, 0xC776, 0x9FDA, 0xC777, 0x9FDB, 0xC778, 0xC0CE, 0xC779, 0x9FDC, 0xC77A, 0x9FDD, 0xC77B, 0x9FDE, + 0xC77C, 0xC0CF, 0xC77D, 0xC0D0, 0xC77E, 0xC0D1, 0xC77F, 0x9FDF, 0xC780, 0x9FE0, 0xC781, 0x9FE1, 0xC782, 0x9FE2, 0xC783, 0xC0D2, + 0xC784, 0xC0D3, 0xC785, 0xC0D4, 0xC786, 0x9FE3, 0xC787, 0xC0D5, 0xC788, 0xC0D6, 0xC789, 0xC0D7, 0xC78A, 0xC0D8, 0xC78B, 0x9FE4, + 0xC78C, 0x9FE5, 0xC78D, 0x9FE6, 0xC78E, 0xC0D9, 0xC78F, 0x9FE7, 0xC790, 0xC0DA, 0xC791, 0xC0DB, 0xC792, 0x9FE8, 0xC793, 0x9FE9, + 0xC794, 0xC0DC, 0xC795, 0x9FEA, 0xC796, 0xC0DD, 0xC797, 0xC0DE, 0xC798, 0xC0DF, 0xC799, 0x9FEB, 0xC79A, 0xC0E0, 0xC79B, 0x9FEC, + 0xC79C, 0x9FED, 0xC79D, 0x9FEE, 0xC79E, 0x9FEF, 0xC79F, 0x9FF0, 0xC7A0, 0xC0E1, 0xC7A1, 0xC0E2, 0xC7A2, 0x9FF1, 0xC7A3, 0xC0E3, + 0xC7A4, 0xC0E4, 0xC7A5, 0xC0E5, 0xC7A6, 0xC0E6, 0xC7A7, 0x9FF2, 0xC7A8, 0x9FF3, 0xC7A9, 0x9FF4, 0xC7AA, 0x9FF5, 0xC7AB, 0x9FF6, + 0xC7AC, 0xC0E7, 0xC7AD, 0xC0E8, 0xC7AE, 0x9FF7, 0xC7AF, 0x9FF8, 0xC7B0, 0xC0E9, 0xC7B1, 0x9FF9, 0xC7B2, 0x9FFA, 0xC7B3, 0x9FFB, + 0xC7B4, 0xC0EA, 0xC7B5, 0x9FFC, 0xC7B6, 0x9FFD, 0xC7B7, 0x9FFE, 0xC7B8, 0xA041, 0xC7B9, 0xA042, 0xC7BA, 0xA043, 0xC7BB, 0xA044, + 0xC7BC, 0xC0EB, 0xC7BD, 0xC0EC, 0xC7BE, 0xA045, 0xC7BF, 0xC0ED, 0xC7C0, 0xC0EE, 0xC7C1, 0xC0EF, 0xC7C2, 0xA046, 0xC7C3, 0xA047, + 0xC7C4, 0xA048, 0xC7C5, 0xA049, 0xC7C6, 0xA04A, 0xC7C7, 0xA04B, 0xC7C8, 0xC0F0, 0xC7C9, 0xC0F1, 0xC7CA, 0xA04C, 0xC7CB, 0xA04D, + 0xC7CC, 0xC0F2, 0xC7CD, 0xA04E, 0xC7CE, 0xC0F3, 0xC7CF, 0xA04F, 0xC7D0, 0xC0F4, 0xC7D1, 0xA050, 0xC7D2, 0xA051, 0xC7D3, 0xA052, + 0xC7D4, 0xA053, 0xC7D5, 0xA054, 0xC7D6, 0xA055, 0xC7D7, 0xA056, 0xC7D8, 0xC0F5, 0xC7D9, 0xA057, 0xC7DA, 0xA058, 0xC7DB, 0xA059, + 0xC7DC, 0xA05A, 0xC7DD, 0xC0F6, 0xC7DE, 0xA061, 0xC7DF, 0xA062, 0xC7E0, 0xA063, 0xC7E1, 0xA064, 0xC7E2, 0xA065, 0xC7E3, 0xA066, + 0xC7E4, 0xC0F7, 0xC7E5, 0xA067, 0xC7E6, 0xA068, 0xC7E7, 0xA069, 0xC7E8, 0xC0F8, 0xC7E9, 0xA06A, 0xC7EA, 0xA06B, 0xC7EB, 0xA06C, + 0xC7EC, 0xC0F9, 0xC7ED, 0xA06D, 0xC7EE, 0xA06E, 0xC7EF, 0xA06F, 0xC7F0, 0xA070, 0xC7F1, 0xA071, 0xC7F2, 0xA072, 0xC7F3, 0xA073, + 0xC7F4, 0xA074, 0xC7F5, 0xA075, 0xC7F6, 0xA076, 0xC7F7, 0xA077, 0xC7F8, 0xA078, 0xC7F9, 0xA079, 0xC7FA, 0xA07A, 0xC7FB, 0xA081, + 0xC7FC, 0xA082, 0xC7FD, 0xA083, 0xC7FE, 0xA084, 0xC7FF, 0xA085, 0xC800, 0xC0FA, 0xC801, 0xC0FB, 0xC802, 0xA086, 0xC803, 0xA087, + 0xC804, 0xC0FC, 0xC805, 0xA088, 0xC806, 0xA089, 0xC807, 0xA08A, 0xC808, 0xC0FD, 0xC809, 0xA08B, 0xC80A, 0xC0FE, 0xC80B, 0xA08C, + 0xC80C, 0xA08D, 0xC80D, 0xA08E, 0xC80E, 0xA08F, 0xC80F, 0xA090, 0xC810, 0xC1A1, 0xC811, 0xC1A2, 0xC812, 0xA091, 0xC813, 0xC1A3, + 0xC814, 0xA092, 0xC815, 0xC1A4, 0xC816, 0xC1A5, 0xC817, 0xA093, 0xC818, 0xA094, 0xC819, 0xA095, 0xC81A, 0xA096, 0xC81B, 0xA097, + 0xC81C, 0xC1A6, 0xC81D, 0xC1A7, 0xC81E, 0xA098, 0xC81F, 0xA099, 0xC820, 0xC1A8, 0xC821, 0xA09A, 0xC822, 0xA09B, 0xC823, 0xA09C, + 0xC824, 0xC1A9, 0xC825, 0xA09D, 0xC826, 0xA09E, 0xC827, 0xA09F, 0xC828, 0xA0A0, 0xC829, 0xA0A1, 0xC82A, 0xA0A2, 0xC82B, 0xA0A3, + 0xC82C, 0xC1AA, 0xC82D, 0xC1AB, 0xC82E, 0xA0A4, 0xC82F, 0xC1AC, 0xC830, 0xA0A5, 0xC831, 0xC1AD, 0xC832, 0xA0A6, 0xC833, 0xA0A7, + 0xC834, 0xA0A8, 0xC835, 0xA0A9, 0xC836, 0xA0AA, 0xC837, 0xA0AB, 0xC838, 0xC1AE, 0xC839, 0xA0AC, 0xC83A, 0xA0AD, 0xC83B, 0xA0AE, + 0xC83C, 0xC1AF, 0xC83D, 0xA0AF, 0xC83E, 0xA0B0, 0xC83F, 0xA0B1, 0xC840, 0xC1B0, 0xC841, 0xA0B2, 0xC842, 0xA0B3, 0xC843, 0xA0B4, + 0xC844, 0xA0B5, 0xC845, 0xA0B6, 0xC846, 0xA0B7, 0xC847, 0xA0B8, 0xC848, 0xC1B1, 0xC849, 0xC1B2, 0xC84A, 0xA0B9, 0xC84B, 0xA0BA, + 0xC84C, 0xC1B3, 0xC84D, 0xC1B4, 0xC84E, 0xA0BB, 0xC84F, 0xA0BC, 0xC850, 0xA0BD, 0xC851, 0xA0BE, 0xC852, 0xA0BF, 0xC853, 0xA0C0, + 0xC854, 0xC1B5, 0xC855, 0xA0C1, 0xC856, 0xA0C2, 0xC857, 0xA0C3, 0xC858, 0xA0C4, 0xC859, 0xA0C5, 0xC85A, 0xA0C6, 0xC85B, 0xA0C7, + 0xC85C, 0xA0C8, 0xC85D, 0xA0C9, 0xC85E, 0xA0CA, 0xC85F, 0xA0CB, 0xC860, 0xA0CC, 0xC861, 0xA0CD, 0xC862, 0xA0CE, 0xC863, 0xA0CF, + 0xC864, 0xA0D0, 0xC865, 0xA0D1, 0xC866, 0xA0D2, 0xC867, 0xA0D3, 0xC868, 0xA0D4, 0xC869, 0xA0D5, 0xC86A, 0xA0D6, 0xC86B, 0xA0D7, + 0xC86C, 0xA0D8, 0xC86D, 0xA0D9, 0xC86E, 0xA0DA, 0xC86F, 0xA0DB, 0xC870, 0xC1B6, 0xC871, 0xC1B7, 0xC872, 0xA0DC, 0xC873, 0xA0DD, + 0xC874, 0xC1B8, 0xC875, 0xA0DE, 0xC876, 0xA0DF, 0xC877, 0xA0E0, 0xC878, 0xC1B9, 0xC879, 0xA0E1, 0xC87A, 0xC1BA, 0xC87B, 0xA0E2, + 0xC87C, 0xA0E3, 0xC87D, 0xA0E4, 0xC87E, 0xA0E5, 0xC87F, 0xA0E6, 0xC880, 0xC1BB, 0xC881, 0xC1BC, 0xC882, 0xA0E7, 0xC883, 0xC1BD, + 0xC884, 0xA0E8, 0xC885, 0xC1BE, 0xC886, 0xC1BF, 0xC887, 0xC1C0, 0xC888, 0xA0E9, 0xC889, 0xA0EA, 0xC88A, 0xA0EB, 0xC88B, 0xC1C1, + 0xC88C, 0xC1C2, 0xC88D, 0xC1C3, 0xC88E, 0xA0EC, 0xC88F, 0xA0ED, 0xC890, 0xA0EE, 0xC891, 0xA0EF, 0xC892, 0xA0F0, 0xC893, 0xA0F1, + 0xC894, 0xC1C4, 0xC895, 0xA0F2, 0xC896, 0xA0F3, 0xC897, 0xA0F4, 0xC898, 0xA0F5, 0xC899, 0xA0F6, 0xC89A, 0xA0F7, 0xC89B, 0xA0F8, + 0xC89C, 0xA0F9, 0xC89D, 0xC1C5, 0xC89E, 0xA0FA, 0xC89F, 0xC1C6, 0xC8A0, 0xA0FB, 0xC8A1, 0xC1C7, 0xC8A2, 0xA0FC, 0xC8A3, 0xA0FD, + 0xC8A4, 0xA0FE, 0xC8A5, 0xA141, 0xC8A6, 0xA142, 0xC8A7, 0xA143, 0xC8A8, 0xC1C8, 0xC8A9, 0xA144, 0xC8AA, 0xA145, 0xC8AB, 0xA146, + 0xC8AC, 0xA147, 0xC8AD, 0xA148, 0xC8AE, 0xA149, 0xC8AF, 0xA14A, 0xC8B0, 0xA14B, 0xC8B1, 0xA14C, 0xC8B2, 0xA14D, 0xC8B3, 0xA14E, + 0xC8B4, 0xA14F, 0xC8B5, 0xA150, 0xC8B6, 0xA151, 0xC8B7, 0xA152, 0xC8B8, 0xA153, 0xC8B9, 0xA154, 0xC8BA, 0xA155, 0xC8BB, 0xA156, + 0xC8BC, 0xC1C9, 0xC8BD, 0xC1CA, 0xC8BE, 0xA157, 0xC8BF, 0xA158, 0xC8C0, 0xA159, 0xC8C1, 0xA15A, 0xC8C2, 0xA161, 0xC8C3, 0xA162, + 0xC8C4, 0xC1CB, 0xC8C5, 0xA163, 0xC8C6, 0xA164, 0xC8C7, 0xA165, 0xC8C8, 0xC1CC, 0xC8C9, 0xA166, 0xC8CA, 0xA167, 0xC8CB, 0xA168, + 0xC8CC, 0xC1CD, 0xC8CD, 0xA169, 0xC8CE, 0xA16A, 0xC8CF, 0xA16B, 0xC8D0, 0xA16C, 0xC8D1, 0xA16D, 0xC8D2, 0xA16E, 0xC8D3, 0xA16F, + 0xC8D4, 0xC1CE, 0xC8D5, 0xC1CF, 0xC8D6, 0xA170, 0xC8D7, 0xC1D0, 0xC8D8, 0xA171, 0xC8D9, 0xC1D1, 0xC8DA, 0xA172, 0xC8DB, 0xA173, + 0xC8DC, 0xA174, 0xC8DD, 0xA175, 0xC8DE, 0xA176, 0xC8DF, 0xA177, 0xC8E0, 0xC1D2, 0xC8E1, 0xC1D3, 0xC8E2, 0xA178, 0xC8E3, 0xA179, + 0xC8E4, 0xC1D4, 0xC8E5, 0xA17A, 0xC8E6, 0xA181, 0xC8E7, 0xA182, 0xC8E8, 0xA183, 0xC8E9, 0xA184, 0xC8EA, 0xA185, 0xC8EB, 0xA186, + 0xC8EC, 0xA187, 0xC8ED, 0xA188, 0xC8EE, 0xA189, 0xC8EF, 0xA18A, 0xC8F0, 0xA18B, 0xC8F1, 0xA18C, 0xC8F2, 0xA18D, 0xC8F3, 0xA18E, + 0xC8F4, 0xA18F, 0xC8F5, 0xC1D5, 0xC8F6, 0xA190, 0xC8F7, 0xA191, 0xC8F8, 0xA192, 0xC8F9, 0xA193, 0xC8FA, 0xA194, 0xC8FB, 0xA195, + 0xC8FC, 0xC1D6, 0xC8FD, 0xC1D7, 0xC8FE, 0xA196, 0xC8FF, 0xA197, 0xC900, 0xC1D8, 0xC901, 0xA198, 0xC902, 0xA199, 0xC903, 0xA19A, + 0xC904, 0xC1D9, 0xC905, 0xC1DA, 0xC906, 0xC1DB, 0xC907, 0xA19B, 0xC908, 0xA19C, 0xC909, 0xA19D, 0xC90A, 0xA19E, 0xC90B, 0xA19F, + 0xC90C, 0xC1DC, 0xC90D, 0xC1DD, 0xC90E, 0xA1A0, 0xC90F, 0xC1DE, 0xC910, 0xA241, 0xC911, 0xC1DF, 0xC912, 0xA242, 0xC913, 0xA243, + 0xC914, 0xA244, 0xC915, 0xA245, 0xC916, 0xA246, 0xC917, 0xA247, 0xC918, 0xC1E0, 0xC919, 0xA248, 0xC91A, 0xA249, 0xC91B, 0xA24A, + 0xC91C, 0xA24B, 0xC91D, 0xA24C, 0xC91E, 0xA24D, 0xC91F, 0xA24E, 0xC920, 0xA24F, 0xC921, 0xA250, 0xC922, 0xA251, 0xC923, 0xA252, + 0xC924, 0xA253, 0xC925, 0xA254, 0xC926, 0xA255, 0xC927, 0xA256, 0xC928, 0xA257, 0xC929, 0xA258, 0xC92A, 0xA259, 0xC92B, 0xA25A, + 0xC92C, 0xC1E1, 0xC92D, 0xA261, 0xC92E, 0xA262, 0xC92F, 0xA263, 0xC930, 0xA264, 0xC931, 0xA265, 0xC932, 0xA266, 0xC933, 0xA267, + 0xC934, 0xC1E2, 0xC935, 0xA268, 0xC936, 0xA269, 0xC937, 0xA26A, 0xC938, 0xA26B, 0xC939, 0xA26C, 0xC93A, 0xA26D, 0xC93B, 0xA26E, + 0xC93C, 0xA26F, 0xC93D, 0xA270, 0xC93E, 0xA271, 0xC93F, 0xA272, 0xC940, 0xA273, 0xC941, 0xA274, 0xC942, 0xA275, 0xC943, 0xA276, + 0xC944, 0xA277, 0xC945, 0xA278, 0xC946, 0xA279, 0xC947, 0xA27A, 0xC948, 0xA281, 0xC949, 0xA282, 0xC94A, 0xA283, 0xC94B, 0xA284, + 0xC94C, 0xA285, 0xC94D, 0xA286, 0xC94E, 0xA287, 0xC94F, 0xA288, 0xC950, 0xC1E3, 0xC951, 0xC1E4, 0xC952, 0xA289, 0xC953, 0xA28A, + 0xC954, 0xC1E5, 0xC955, 0xA28B, 0xC956, 0xA28C, 0xC957, 0xA28D, 0xC958, 0xC1E6, 0xC959, 0xA28E, 0xC95A, 0xA28F, 0xC95B, 0xA290, + 0xC95C, 0xA291, 0xC95D, 0xA292, 0xC95E, 0xA293, 0xC95F, 0xA294, 0xC960, 0xC1E7, 0xC961, 0xC1E8, 0xC962, 0xA295, 0xC963, 0xC1E9, + 0xC964, 0xA296, 0xC965, 0xA297, 0xC966, 0xA298, 0xC967, 0xA299, 0xC968, 0xA29A, 0xC969, 0xA29B, 0xC96A, 0xA29C, 0xC96B, 0xA29D, + 0xC96C, 0xC1EA, 0xC96D, 0xA29E, 0xC96E, 0xA29F, 0xC96F, 0xA2A0, 0xC970, 0xC1EB, 0xC971, 0xA341, 0xC972, 0xA342, 0xC973, 0xA343, + 0xC974, 0xC1EC, 0xC975, 0xA344, 0xC976, 0xA345, 0xC977, 0xA346, 0xC978, 0xA347, 0xC979, 0xA348, 0xC97A, 0xA349, 0xC97B, 0xA34A, + 0xC97C, 0xC1ED, 0xC97D, 0xA34B, 0xC97E, 0xA34C, 0xC97F, 0xA34D, 0xC980, 0xA34E, 0xC981, 0xA34F, 0xC982, 0xA350, 0xC983, 0xA351, + 0xC984, 0xA352, 0xC985, 0xA353, 0xC986, 0xA354, 0xC987, 0xA355, 0xC988, 0xC1EE, 0xC989, 0xC1EF, 0xC98A, 0xA356, 0xC98B, 0xA357, + 0xC98C, 0xC1F0, 0xC98D, 0xA358, 0xC98E, 0xA359, 0xC98F, 0xA35A, 0xC990, 0xC1F1, 0xC991, 0xA361, 0xC992, 0xA362, 0xC993, 0xA363, + 0xC994, 0xA364, 0xC995, 0xA365, 0xC996, 0xA366, 0xC997, 0xA367, 0xC998, 0xC1F2, 0xC999, 0xC1F3, 0xC99A, 0xA368, 0xC99B, 0xC1F4, + 0xC99C, 0xA369, 0xC99D, 0xC1F5, 0xC99E, 0xA36A, 0xC99F, 0xA36B, 0xC9A0, 0xA36C, 0xC9A1, 0xA36D, 0xC9A2, 0xA36E, 0xC9A3, 0xA36F, + 0xC9A4, 0xA370, 0xC9A5, 0xA371, 0xC9A6, 0xA372, 0xC9A7, 0xA373, 0xC9A8, 0xA374, 0xC9A9, 0xA375, 0xC9AA, 0xA376, 0xC9AB, 0xA377, + 0xC9AC, 0xA378, 0xC9AD, 0xA379, 0xC9AE, 0xA37A, 0xC9AF, 0xA381, 0xC9B0, 0xA382, 0xC9B1, 0xA383, 0xC9B2, 0xA384, 0xC9B3, 0xA385, + 0xC9B4, 0xA386, 0xC9B5, 0xA387, 0xC9B6, 0xA388, 0xC9B7, 0xA389, 0xC9B8, 0xA38A, 0xC9B9, 0xA38B, 0xC9BA, 0xA38C, 0xC9BB, 0xA38D, + 0xC9BC, 0xA38E, 0xC9BD, 0xA38F, 0xC9BE, 0xA390, 0xC9BF, 0xA391, 0xC9C0, 0xC1F6, 0xC9C1, 0xC1F7, 0xC9C2, 0xA392, 0xC9C3, 0xA393, + 0xC9C4, 0xC1F8, 0xC9C5, 0xA394, 0xC9C6, 0xA395, 0xC9C7, 0xC1F9, 0xC9C8, 0xC1FA, 0xC9C9, 0xA396, 0xC9CA, 0xC1FB, 0xC9CB, 0xA397, + 0xC9CC, 0xA398, 0xC9CD, 0xA399, 0xC9CE, 0xA39A, 0xC9CF, 0xA39B, 0xC9D0, 0xC1FC, 0xC9D1, 0xC1FD, 0xC9D2, 0xA39C, 0xC9D3, 0xC1FE, + 0xC9D4, 0xA39D, 0xC9D5, 0xC2A1, 0xC9D6, 0xC2A2, 0xC9D7, 0xA39E, 0xC9D8, 0xA39F, 0xC9D9, 0xC2A3, 0xC9DA, 0xC2A4, 0xC9DB, 0xA3A0, + 0xC9DC, 0xC2A5, 0xC9DD, 0xC2A6, 0xC9DE, 0xA441, 0xC9DF, 0xA442, 0xC9E0, 0xC2A7, 0xC9E1, 0xA443, 0xC9E2, 0xC2A8, 0xC9E3, 0xA444, + 0xC9E4, 0xC2A9, 0xC9E5, 0xA445, 0xC9E6, 0xA446, 0xC9E7, 0xC2AA, 0xC9E8, 0xA447, 0xC9E9, 0xA448, 0xC9EA, 0xA449, 0xC9EB, 0xA44A, + 0xC9EC, 0xC2AB, 0xC9ED, 0xC2AC, 0xC9EE, 0xA44B, 0xC9EF, 0xC2AD, 0xC9F0, 0xC2AE, 0xC9F1, 0xC2AF, 0xC9F2, 0xA44C, 0xC9F3, 0xA44D, + 0xC9F4, 0xA44E, 0xC9F5, 0xA44F, 0xC9F6, 0xA450, 0xC9F7, 0xA451, 0xC9F8, 0xC2B0, 0xC9F9, 0xC2B1, 0xC9FA, 0xA452, 0xC9FB, 0xA453, + 0xC9FC, 0xC2B2, 0xC9FD, 0xA454, 0xC9FE, 0xA455, 0xC9FF, 0xA456, 0xCA00, 0xC2B3, 0xCA01, 0xA457, 0xCA02, 0xA458, 0xCA03, 0xA459, + 0xCA04, 0xA45A, 0xCA05, 0xA461, 0xCA06, 0xA462, 0xCA07, 0xA463, 0xCA08, 0xC2B4, 0xCA09, 0xC2B5, 0xCA0A, 0xA464, 0xCA0B, 0xC2B6, + 0xCA0C, 0xC2B7, 0xCA0D, 0xC2B8, 0xCA0E, 0xA465, 0xCA0F, 0xA466, 0xCA10, 0xA467, 0xCA11, 0xA468, 0xCA12, 0xA469, 0xCA13, 0xA46A, + 0xCA14, 0xC2B9, 0xCA15, 0xA46B, 0xCA16, 0xA46C, 0xCA17, 0xA46D, 0xCA18, 0xC2BA, 0xCA19, 0xA46E, 0xCA1A, 0xA46F, 0xCA1B, 0xA470, + 0xCA1C, 0xA471, 0xCA1D, 0xA472, 0xCA1E, 0xA473, 0xCA1F, 0xA474, 0xCA20, 0xA475, 0xCA21, 0xA476, 0xCA22, 0xA477, 0xCA23, 0xA478, + 0xCA24, 0xA479, 0xCA25, 0xA47A, 0xCA26, 0xA481, 0xCA27, 0xA482, 0xCA28, 0xA483, 0xCA29, 0xC2BB, 0xCA2A, 0xA484, 0xCA2B, 0xA485, + 0xCA2C, 0xA486, 0xCA2D, 0xA487, 0xCA2E, 0xA488, 0xCA2F, 0xA489, 0xCA30, 0xA48A, 0xCA31, 0xA48B, 0xCA32, 0xA48C, 0xCA33, 0xA48D, + 0xCA34, 0xA48E, 0xCA35, 0xA48F, 0xCA36, 0xA490, 0xCA37, 0xA491, 0xCA38, 0xA492, 0xCA39, 0xA493, 0xCA3A, 0xA494, 0xCA3B, 0xA495, + 0xCA3C, 0xA496, 0xCA3D, 0xA497, 0xCA3E, 0xA498, 0xCA3F, 0xA499, 0xCA40, 0xA49A, 0xCA41, 0xA49B, 0xCA42, 0xA49C, 0xCA43, 0xA49D, + 0xCA44, 0xA49E, 0xCA45, 0xA49F, 0xCA46, 0xA4A0, 0xCA47, 0xA541, 0xCA48, 0xA542, 0xCA49, 0xA543, 0xCA4A, 0xA544, 0xCA4B, 0xA545, + 0xCA4C, 0xC2BC, 0xCA4D, 0xC2BD, 0xCA4E, 0xA546, 0xCA4F, 0xA547, 0xCA50, 0xC2BE, 0xCA51, 0xA548, 0xCA52, 0xA549, 0xCA53, 0xA54A, + 0xCA54, 0xC2BF, 0xCA55, 0xA54B, 0xCA56, 0xA54C, 0xCA57, 0xA54D, 0xCA58, 0xA54E, 0xCA59, 0xA54F, 0xCA5A, 0xA550, 0xCA5B, 0xA551, + 0xCA5C, 0xC2C0, 0xCA5D, 0xC2C1, 0xCA5E, 0xA552, 0xCA5F, 0xC2C2, 0xCA60, 0xC2C3, 0xCA61, 0xC2C4, 0xCA62, 0xA553, 0xCA63, 0xA554, + 0xCA64, 0xA555, 0xCA65, 0xA556, 0xCA66, 0xA557, 0xCA67, 0xA558, 0xCA68, 0xC2C5, 0xCA69, 0xA559, 0xCA6A, 0xA55A, 0xCA6B, 0xA561, + 0xCA6C, 0xA562, 0xCA6D, 0xA563, 0xCA6E, 0xA564, 0xCA6F, 0xA565, 0xCA70, 0xA566, 0xCA71, 0xA567, 0xCA72, 0xA568, 0xCA73, 0xA569, + 0xCA74, 0xA56A, 0xCA75, 0xA56B, 0xCA76, 0xA56C, 0xCA77, 0xA56D, 0xCA78, 0xA56E, 0xCA79, 0xA56F, 0xCA7A, 0xA570, 0xCA7B, 0xA571, + 0xCA7C, 0xA572, 0xCA7D, 0xC2C6, 0xCA7E, 0xA573, 0xCA7F, 0xA574, 0xCA80, 0xA575, 0xCA81, 0xA576, 0xCA82, 0xA577, 0xCA83, 0xA578, + 0xCA84, 0xC2C7, 0xCA85, 0xA579, 0xCA86, 0xA57A, 0xCA87, 0xA581, 0xCA88, 0xA582, 0xCA89, 0xA583, 0xCA8A, 0xA584, 0xCA8B, 0xA585, + 0xCA8C, 0xA586, 0xCA8D, 0xA587, 0xCA8E, 0xA588, 0xCA8F, 0xA589, 0xCA90, 0xA58A, 0xCA91, 0xA58B, 0xCA92, 0xA58C, 0xCA93, 0xA58D, + 0xCA94, 0xA58E, 0xCA95, 0xA58F, 0xCA96, 0xA590, 0xCA97, 0xA591, 0xCA98, 0xC2C8, 0xCA99, 0xA592, 0xCA9A, 0xA593, 0xCA9B, 0xA594, + 0xCA9C, 0xA595, 0xCA9D, 0xA596, 0xCA9E, 0xA597, 0xCA9F, 0xA598, 0xCAA0, 0xA599, 0xCAA1, 0xA59A, 0xCAA2, 0xA59B, 0xCAA3, 0xA59C, + 0xCAA4, 0xA59D, 0xCAA5, 0xA59E, 0xCAA6, 0xA59F, 0xCAA7, 0xA5A0, 0xCAA8, 0xA641, 0xCAA9, 0xA642, 0xCAAA, 0xA643, 0xCAAB, 0xA644, + 0xCAAC, 0xA645, 0xCAAD, 0xA646, 0xCAAE, 0xA647, 0xCAAF, 0xA648, 0xCAB0, 0xA649, 0xCAB1, 0xA64A, 0xCAB2, 0xA64B, 0xCAB3, 0xA64C, + 0xCAB4, 0xA64D, 0xCAB5, 0xA64E, 0xCAB6, 0xA64F, 0xCAB7, 0xA650, 0xCAB8, 0xA651, 0xCAB9, 0xA652, 0xCABA, 0xA653, 0xCABB, 0xA654, + 0xCABC, 0xC2C9, 0xCABD, 0xC2CA, 0xCABE, 0xA655, 0xCABF, 0xA656, 0xCAC0, 0xC2CB, 0xCAC1, 0xA657, 0xCAC2, 0xA658, 0xCAC3, 0xA659, + 0xCAC4, 0xC2CC, 0xCAC5, 0xA65A, 0xCAC6, 0xA661, 0xCAC7, 0xA662, 0xCAC8, 0xA663, 0xCAC9, 0xA664, 0xCACA, 0xA665, 0xCACB, 0xA666, + 0xCACC, 0xC2CD, 0xCACD, 0xC2CE, 0xCACE, 0xA667, 0xCACF, 0xC2CF, 0xCAD0, 0xA668, 0xCAD1, 0xC2D0, 0xCAD2, 0xA669, 0xCAD3, 0xC2D1, + 0xCAD4, 0xA66A, 0xCAD5, 0xA66B, 0xCAD6, 0xA66C, 0xCAD7, 0xA66D, 0xCAD8, 0xC2D2, 0xCAD9, 0xC2D3, 0xCADA, 0xA66E, 0xCADB, 0xA66F, + 0xCADC, 0xA670, 0xCADD, 0xA671, 0xCADE, 0xA672, 0xCADF, 0xA673, 0xCAE0, 0xC2D4, 0xCAE1, 0xA674, 0xCAE2, 0xA675, 0xCAE3, 0xA676, + 0xCAE4, 0xA677, 0xCAE5, 0xA678, 0xCAE6, 0xA679, 0xCAE7, 0xA67A, 0xCAE8, 0xA681, 0xCAE9, 0xA682, 0xCAEA, 0xA683, 0xCAEB, 0xA684, + 0xCAEC, 0xC2D5, 0xCAED, 0xA685, 0xCAEE, 0xA686, 0xCAEF, 0xA687, 0xCAF0, 0xA688, 0xCAF1, 0xA689, 0xCAF2, 0xA68A, 0xCAF3, 0xA68B, + 0xCAF4, 0xC2D6, 0xCAF5, 0xA68C, 0xCAF6, 0xA68D, 0xCAF7, 0xA68E, 0xCAF8, 0xA68F, 0xCAF9, 0xA690, 0xCAFA, 0xA691, 0xCAFB, 0xA692, + 0xCAFC, 0xA693, 0xCAFD, 0xA694, 0xCAFE, 0xA695, 0xCAFF, 0xA696, 0xCB00, 0xA697, 0xCB01, 0xA698, 0xCB02, 0xA699, 0xCB03, 0xA69A, + 0xCB04, 0xA69B, 0xCB05, 0xA69C, 0xCB06, 0xA69D, 0xCB07, 0xA69E, 0xCB08, 0xC2D7, 0xCB09, 0xA69F, 0xCB0A, 0xA6A0, 0xCB0B, 0xA741, + 0xCB0C, 0xA742, 0xCB0D, 0xA743, 0xCB0E, 0xA744, 0xCB0F, 0xA745, 0xCB10, 0xC2D8, 0xCB11, 0xA746, 0xCB12, 0xA747, 0xCB13, 0xA748, + 0xCB14, 0xC2D9, 0xCB15, 0xA749, 0xCB16, 0xA74A, 0xCB17, 0xA74B, 0xCB18, 0xC2DA, 0xCB19, 0xA74C, 0xCB1A, 0xA74D, 0xCB1B, 0xA74E, + 0xCB1C, 0xA74F, 0xCB1D, 0xA750, 0xCB1E, 0xA751, 0xCB1F, 0xA752, 0xCB20, 0xC2DB, 0xCB21, 0xC2DC, 0xCB22, 0xA753, 0xCB23, 0xA754, + 0xCB24, 0xA755, 0xCB25, 0xA756, 0xCB26, 0xA757, 0xCB27, 0xA758, 0xCB28, 0xA759, 0xCB29, 0xA75A, 0xCB2A, 0xA761, 0xCB2B, 0xA762, + 0xCB2C, 0xA763, 0xCB2D, 0xA764, 0xCB2E, 0xA765, 0xCB2F, 0xA766, 0xCB30, 0xA767, 0xCB31, 0xA768, 0xCB32, 0xA769, 0xCB33, 0xA76A, + 0xCB34, 0xA76B, 0xCB35, 0xA76C, 0xCB36, 0xA76D, 0xCB37, 0xA76E, 0xCB38, 0xA76F, 0xCB39, 0xA770, 0xCB3A, 0xA771, 0xCB3B, 0xA772, + 0xCB3C, 0xA773, 0xCB3D, 0xA774, 0xCB3E, 0xA775, 0xCB3F, 0xA776, 0xCB40, 0xA777, 0xCB41, 0xC2DD, 0xCB42, 0xA778, 0xCB43, 0xA779, + 0xCB44, 0xA77A, 0xCB45, 0xA781, 0xCB46, 0xA782, 0xCB47, 0xA783, 0xCB48, 0xC2DE, 0xCB49, 0xC2DF, 0xCB4A, 0xA784, 0xCB4B, 0xA785, + 0xCB4C, 0xC2E0, 0xCB4D, 0xA786, 0xCB4E, 0xA787, 0xCB4F, 0xA788, 0xCB50, 0xC2E1, 0xCB51, 0xA789, 0xCB52, 0xA78A, 0xCB53, 0xA78B, + 0xCB54, 0xA78C, 0xCB55, 0xA78D, 0xCB56, 0xA78E, 0xCB57, 0xA78F, 0xCB58, 0xC2E2, 0xCB59, 0xC2E3, 0xCB5A, 0xA790, 0xCB5B, 0xA791, + 0xCB5C, 0xA792, 0xCB5D, 0xC2E4, 0xCB5E, 0xA793, 0xCB5F, 0xA794, 0xCB60, 0xA795, 0xCB61, 0xA796, 0xCB62, 0xA797, 0xCB63, 0xA798, + 0xCB64, 0xC2E5, 0xCB65, 0xA799, 0xCB66, 0xA79A, 0xCB67, 0xA79B, 0xCB68, 0xA79C, 0xCB69, 0xA79D, 0xCB6A, 0xA79E, 0xCB6B, 0xA79F, + 0xCB6C, 0xA7A0, 0xCB6D, 0xA841, 0xCB6E, 0xA842, 0xCB6F, 0xA843, 0xCB70, 0xA844, 0xCB71, 0xA845, 0xCB72, 0xA846, 0xCB73, 0xA847, + 0xCB74, 0xA848, 0xCB75, 0xA849, 0xCB76, 0xA84A, 0xCB77, 0xA84B, 0xCB78, 0xC2E6, 0xCB79, 0xC2E7, 0xCB7A, 0xA84C, 0xCB7B, 0xA84D, + 0xCB7C, 0xA84E, 0xCB7D, 0xA84F, 0xCB7E, 0xA850, 0xCB7F, 0xA851, 0xCB80, 0xA852, 0xCB81, 0xA853, 0xCB82, 0xA854, 0xCB83, 0xA855, + 0xCB84, 0xA856, 0xCB85, 0xA857, 0xCB86, 0xA858, 0xCB87, 0xA859, 0xCB88, 0xA85A, 0xCB89, 0xA861, 0xCB8A, 0xA862, 0xCB8B, 0xA863, + 0xCB8C, 0xA864, 0xCB8D, 0xA865, 0xCB8E, 0xA866, 0xCB8F, 0xA867, 0xCB90, 0xA868, 0xCB91, 0xA869, 0xCB92, 0xA86A, 0xCB93, 0xA86B, + 0xCB94, 0xA86C, 0xCB95, 0xA86D, 0xCB96, 0xA86E, 0xCB97, 0xA86F, 0xCB98, 0xA870, 0xCB99, 0xA871, 0xCB9A, 0xA872, 0xCB9B, 0xA873, + 0xCB9C, 0xC2E8, 0xCB9D, 0xA874, 0xCB9E, 0xA875, 0xCB9F, 0xA876, 0xCBA0, 0xA877, 0xCBA1, 0xA878, 0xCBA2, 0xA879, 0xCBA3, 0xA87A, + 0xCBA4, 0xA881, 0xCBA5, 0xA882, 0xCBA6, 0xA883, 0xCBA7, 0xA884, 0xCBA8, 0xA885, 0xCBA9, 0xA886, 0xCBAA, 0xA887, 0xCBAB, 0xA888, + 0xCBAC, 0xA889, 0xCBAD, 0xA88A, 0xCBAE, 0xA88B, 0xCBAF, 0xA88C, 0xCBB0, 0xA88D, 0xCBB1, 0xA88E, 0xCBB2, 0xA88F, 0xCBB3, 0xA890, + 0xCBB4, 0xA891, 0xCBB5, 0xA892, 0xCBB6, 0xA893, 0xCBB7, 0xA894, 0xCBB8, 0xC2E9, 0xCBB9, 0xA895, 0xCBBA, 0xA896, 0xCBBB, 0xA897, + 0xCBBC, 0xA898, 0xCBBD, 0xA899, 0xCBBE, 0xA89A, 0xCBBF, 0xA89B, 0xCBC0, 0xA89C, 0xCBC1, 0xA89D, 0xCBC2, 0xA89E, 0xCBC3, 0xA89F, + 0xCBC4, 0xA8A0, 0xCBC5, 0xA941, 0xCBC6, 0xA942, 0xCBC7, 0xA943, 0xCBC8, 0xA944, 0xCBC9, 0xA945, 0xCBCA, 0xA946, 0xCBCB, 0xA947, + 0xCBCC, 0xA948, 0xCBCD, 0xA949, 0xCBCE, 0xA94A, 0xCBCF, 0xA94B, 0xCBD0, 0xA94C, 0xCBD1, 0xA94D, 0xCBD2, 0xA94E, 0xCBD3, 0xA94F, + 0xCBD4, 0xC2EA, 0xCBD5, 0xA950, 0xCBD6, 0xA951, 0xCBD7, 0xA952, 0xCBD8, 0xA953, 0xCBD9, 0xA954, 0xCBDA, 0xA955, 0xCBDB, 0xA956, + 0xCBDC, 0xA957, 0xCBDD, 0xA958, 0xCBDE, 0xA959, 0xCBDF, 0xA95A, 0xCBE0, 0xA961, 0xCBE1, 0xA962, 0xCBE2, 0xA963, 0xCBE3, 0xA964, + 0xCBE4, 0xC2EB, 0xCBE5, 0xA965, 0xCBE6, 0xA966, 0xCBE7, 0xC2EC, 0xCBE8, 0xA967, 0xCBE9, 0xC2ED, 0xCBEA, 0xA968, 0xCBEB, 0xA969, + 0xCBEC, 0xA96A, 0xCBED, 0xA96B, 0xCBEE, 0xA96C, 0xCBEF, 0xA96D, 0xCBF0, 0xA96E, 0xCBF1, 0xA96F, 0xCBF2, 0xA970, 0xCBF3, 0xA971, + 0xCBF4, 0xA972, 0xCBF5, 0xA973, 0xCBF6, 0xA974, 0xCBF7, 0xA975, 0xCBF8, 0xA976, 0xCBF9, 0xA977, 0xCBFA, 0xA978, 0xCBFB, 0xA979, + 0xCBFC, 0xA97A, 0xCBFD, 0xA981, 0xCBFE, 0xA982, 0xCBFF, 0xA983, 0xCC00, 0xA984, 0xCC01, 0xA985, 0xCC02, 0xA986, 0xCC03, 0xA987, + 0xCC04, 0xA988, 0xCC05, 0xA989, 0xCC06, 0xA98A, 0xCC07, 0xA98B, 0xCC08, 0xA98C, 0xCC09, 0xA98D, 0xCC0A, 0xA98E, 0xCC0B, 0xA98F, + 0xCC0C, 0xC2EE, 0xCC0D, 0xC2EF, 0xCC0E, 0xA990, 0xCC0F, 0xA991, 0xCC10, 0xC2F0, 0xCC11, 0xA992, 0xCC12, 0xA993, 0xCC13, 0xA994, + 0xCC14, 0xC2F1, 0xCC15, 0xA995, 0xCC16, 0xA996, 0xCC17, 0xA997, 0xCC18, 0xA998, 0xCC19, 0xA999, 0xCC1A, 0xA99A, 0xCC1B, 0xA99B, + 0xCC1C, 0xC2F2, 0xCC1D, 0xC2F3, 0xCC1E, 0xA99C, 0xCC1F, 0xA99D, 0xCC20, 0xA99E, 0xCC21, 0xC2F4, 0xCC22, 0xC2F5, 0xCC23, 0xA99F, + 0xCC24, 0xA9A0, 0xCC25, 0xAA41, 0xCC26, 0xAA42, 0xCC27, 0xC2F6, 0xCC28, 0xC2F7, 0xCC29, 0xC2F8, 0xCC2A, 0xAA43, 0xCC2B, 0xAA44, + 0xCC2C, 0xC2F9, 0xCC2D, 0xAA45, 0xCC2E, 0xC2FA, 0xCC2F, 0xAA46, 0xCC30, 0xC2FB, 0xCC31, 0xAA47, 0xCC32, 0xAA48, 0xCC33, 0xAA49, + 0xCC34, 0xAA4A, 0xCC35, 0xAA4B, 0xCC36, 0xAA4C, 0xCC37, 0xAA4D, 0xCC38, 0xC2FC, 0xCC39, 0xC2FD, 0xCC3A, 0xAA4E, 0xCC3B, 0xC2FE, + 0xCC3C, 0xC3A1, 0xCC3D, 0xC3A2, 0xCC3E, 0xC3A3, 0xCC3F, 0xAA4F, 0xCC40, 0xAA50, 0xCC41, 0xAA51, 0xCC42, 0xAA52, 0xCC43, 0xAA53, + 0xCC44, 0xC3A4, 0xCC45, 0xC3A5, 0xCC46, 0xAA54, 0xCC47, 0xAA55, 0xCC48, 0xC3A6, 0xCC49, 0xAA56, 0xCC4A, 0xAA57, 0xCC4B, 0xAA58, + 0xCC4C, 0xC3A7, 0xCC4D, 0xAA59, 0xCC4E, 0xAA5A, 0xCC4F, 0xAA61, 0xCC50, 0xAA62, 0xCC51, 0xAA63, 0xCC52, 0xAA64, 0xCC53, 0xAA65, + 0xCC54, 0xC3A8, 0xCC55, 0xC3A9, 0xCC56, 0xAA66, 0xCC57, 0xC3AA, 0xCC58, 0xC3AB, 0xCC59, 0xC3AC, 0xCC5A, 0xAA67, 0xCC5B, 0xAA68, + 0xCC5C, 0xAA69, 0xCC5D, 0xAA6A, 0xCC5E, 0xAA6B, 0xCC5F, 0xAA6C, 0xCC60, 0xC3AD, 0xCC61, 0xAA6D, 0xCC62, 0xAA6E, 0xCC63, 0xAA6F, + 0xCC64, 0xC3AE, 0xCC65, 0xAA70, 0xCC66, 0xC3AF, 0xCC67, 0xAA71, 0xCC68, 0xC3B0, 0xCC69, 0xAA72, 0xCC6A, 0xAA73, 0xCC6B, 0xAA74, + 0xCC6C, 0xAA75, 0xCC6D, 0xAA76, 0xCC6E, 0xAA77, 0xCC6F, 0xAA78, 0xCC70, 0xC3B1, 0xCC71, 0xAA79, 0xCC72, 0xAA7A, 0xCC73, 0xAA81, + 0xCC74, 0xAA82, 0xCC75, 0xC3B2, 0xCC76, 0xAA83, 0xCC77, 0xAA84, 0xCC78, 0xAA85, 0xCC79, 0xAA86, 0xCC7A, 0xAA87, 0xCC7B, 0xAA88, + 0xCC7C, 0xAA89, 0xCC7D, 0xAA8A, 0xCC7E, 0xAA8B, 0xCC7F, 0xAA8C, 0xCC80, 0xAA8D, 0xCC81, 0xAA8E, 0xCC82, 0xAA8F, 0xCC83, 0xAA90, + 0xCC84, 0xAA91, 0xCC85, 0xAA92, 0xCC86, 0xAA93, 0xCC87, 0xAA94, 0xCC88, 0xAA95, 0xCC89, 0xAA96, 0xCC8A, 0xAA97, 0xCC8B, 0xAA98, + 0xCC8C, 0xAA99, 0xCC8D, 0xAA9A, 0xCC8E, 0xAA9B, 0xCC8F, 0xAA9C, 0xCC90, 0xAA9D, 0xCC91, 0xAA9E, 0xCC92, 0xAA9F, 0xCC93, 0xAAA0, + 0xCC94, 0xAB41, 0xCC95, 0xAB42, 0xCC96, 0xAB43, 0xCC97, 0xAB44, 0xCC98, 0xC3B3, 0xCC99, 0xC3B4, 0xCC9A, 0xAB45, 0xCC9B, 0xAB46, + 0xCC9C, 0xC3B5, 0xCC9D, 0xAB47, 0xCC9E, 0xAB48, 0xCC9F, 0xAB49, 0xCCA0, 0xC3B6, 0xCCA1, 0xAB4A, 0xCCA2, 0xAB4B, 0xCCA3, 0xAB4C, + 0xCCA4, 0xAB4D, 0xCCA5, 0xAB4E, 0xCCA6, 0xAB4F, 0xCCA7, 0xAB50, 0xCCA8, 0xC3B7, 0xCCA9, 0xC3B8, 0xCCAA, 0xAB51, 0xCCAB, 0xC3B9, + 0xCCAC, 0xC3BA, 0xCCAD, 0xC3BB, 0xCCAE, 0xAB52, 0xCCAF, 0xAB53, 0xCCB0, 0xAB54, 0xCCB1, 0xAB55, 0xCCB2, 0xAB56, 0xCCB3, 0xAB57, + 0xCCB4, 0xC3BC, 0xCCB5, 0xC3BD, 0xCCB6, 0xAB58, 0xCCB7, 0xAB59, 0xCCB8, 0xC3BE, 0xCCB9, 0xAB5A, 0xCCBA, 0xAB61, 0xCCBB, 0xAB62, + 0xCCBC, 0xC3BF, 0xCCBD, 0xAB63, 0xCCBE, 0xAB64, 0xCCBF, 0xAB65, 0xCCC0, 0xAB66, 0xCCC1, 0xAB67, 0xCCC2, 0xAB68, 0xCCC3, 0xAB69, + 0xCCC4, 0xC3C0, 0xCCC5, 0xC3C1, 0xCCC6, 0xAB6A, 0xCCC7, 0xC3C2, 0xCCC8, 0xAB6B, 0xCCC9, 0xC3C3, 0xCCCA, 0xAB6C, 0xCCCB, 0xAB6D, + 0xCCCC, 0xAB6E, 0xCCCD, 0xAB6F, 0xCCCE, 0xAB70, 0xCCCF, 0xAB71, 0xCCD0, 0xC3C4, 0xCCD1, 0xAB72, 0xCCD2, 0xAB73, 0xCCD3, 0xAB74, + 0xCCD4, 0xC3C5, 0xCCD5, 0xAB75, 0xCCD6, 0xAB76, 0xCCD7, 0xAB77, 0xCCD8, 0xAB78, 0xCCD9, 0xAB79, 0xCCDA, 0xAB7A, 0xCCDB, 0xAB81, + 0xCCDC, 0xAB82, 0xCCDD, 0xAB83, 0xCCDE, 0xAB84, 0xCCDF, 0xAB85, 0xCCE0, 0xAB86, 0xCCE1, 0xAB87, 0xCCE2, 0xAB88, 0xCCE3, 0xAB89, + 0xCCE4, 0xC3C6, 0xCCE5, 0xAB8A, 0xCCE6, 0xAB8B, 0xCCE7, 0xAB8C, 0xCCE8, 0xAB8D, 0xCCE9, 0xAB8E, 0xCCEA, 0xAB8F, 0xCCEB, 0xAB90, + 0xCCEC, 0xC3C7, 0xCCED, 0xAB91, 0xCCEE, 0xAB92, 0xCCEF, 0xAB93, 0xCCF0, 0xC3C8, 0xCCF1, 0xAB94, 0xCCF2, 0xAB95, 0xCCF3, 0xAB96, + 0xCCF4, 0xAB97, 0xCCF5, 0xAB98, 0xCCF6, 0xAB99, 0xCCF7, 0xAB9A, 0xCCF8, 0xAB9B, 0xCCF9, 0xAB9C, 0xCCFA, 0xAB9D, 0xCCFB, 0xAB9E, + 0xCCFC, 0xAB9F, 0xCCFD, 0xABA0, 0xCCFE, 0xAC41, 0xCCFF, 0xAC42, 0xCD00, 0xAC43, 0xCD01, 0xC3C9, 0xCD02, 0xAC44, 0xCD03, 0xAC45, + 0xCD04, 0xAC46, 0xCD05, 0xAC47, 0xCD06, 0xAC48, 0xCD07, 0xAC49, 0xCD08, 0xC3CA, 0xCD09, 0xC3CB, 0xCD0A, 0xAC4A, 0xCD0B, 0xAC4B, + 0xCD0C, 0xC3CC, 0xCD0D, 0xAC4C, 0xCD0E, 0xAC4D, 0xCD0F, 0xAC4E, 0xCD10, 0xC3CD, 0xCD11, 0xAC4F, 0xCD12, 0xAC50, 0xCD13, 0xAC51, + 0xCD14, 0xAC52, 0xCD15, 0xAC53, 0xCD16, 0xAC54, 0xCD17, 0xAC55, 0xCD18, 0xC3CE, 0xCD19, 0xC3CF, 0xCD1A, 0xAC56, 0xCD1B, 0xC3D0, + 0xCD1C, 0xAC57, 0xCD1D, 0xC3D1, 0xCD1E, 0xAC58, 0xCD1F, 0xAC59, 0xCD20, 0xAC5A, 0xCD21, 0xAC61, 0xCD22, 0xAC62, 0xCD23, 0xAC63, + 0xCD24, 0xC3D2, 0xCD25, 0xAC64, 0xCD26, 0xAC65, 0xCD27, 0xAC66, 0xCD28, 0xC3D3, 0xCD29, 0xAC67, 0xCD2A, 0xAC68, 0xCD2B, 0xAC69, + 0xCD2C, 0xC3D4, 0xCD2D, 0xAC6A, 0xCD2E, 0xAC6B, 0xCD2F, 0xAC6C, 0xCD30, 0xAC6D, 0xCD31, 0xAC6E, 0xCD32, 0xAC6F, 0xCD33, 0xAC70, + 0xCD34, 0xAC71, 0xCD35, 0xAC72, 0xCD36, 0xAC73, 0xCD37, 0xAC74, 0xCD38, 0xAC75, 0xCD39, 0xC3D5, 0xCD3A, 0xAC76, 0xCD3B, 0xAC77, + 0xCD3C, 0xAC78, 0xCD3D, 0xAC79, 0xCD3E, 0xAC7A, 0xCD3F, 0xAC81, 0xCD40, 0xAC82, 0xCD41, 0xAC83, 0xCD42, 0xAC84, 0xCD43, 0xAC85, + 0xCD44, 0xAC86, 0xCD45, 0xAC87, 0xCD46, 0xAC88, 0xCD47, 0xAC89, 0xCD48, 0xAC8A, 0xCD49, 0xAC8B, 0xCD4A, 0xAC8C, 0xCD4B, 0xAC8D, + 0xCD4C, 0xAC8E, 0xCD4D, 0xAC8F, 0xCD4E, 0xAC90, 0xCD4F, 0xAC91, 0xCD50, 0xAC92, 0xCD51, 0xAC93, 0xCD52, 0xAC94, 0xCD53, 0xAC95, + 0xCD54, 0xAC96, 0xCD55, 0xAC97, 0xCD56, 0xAC98, 0xCD57, 0xAC99, 0xCD58, 0xAC9A, 0xCD59, 0xAC9B, 0xCD5A, 0xAC9C, 0xCD5B, 0xAC9D, + 0xCD5C, 0xC3D6, 0xCD5D, 0xAC9E, 0xCD5E, 0xAC9F, 0xCD5F, 0xACA0, 0xCD60, 0xC3D7, 0xCD61, 0xAD41, 0xCD62, 0xAD42, 0xCD63, 0xAD43, + 0xCD64, 0xC3D8, 0xCD65, 0xAD44, 0xCD66, 0xAD45, 0xCD67, 0xAD46, 0xCD68, 0xAD47, 0xCD69, 0xAD48, 0xCD6A, 0xAD49, 0xCD6B, 0xAD4A, + 0xCD6C, 0xC3D9, 0xCD6D, 0xC3DA, 0xCD6E, 0xAD4B, 0xCD6F, 0xC3DB, 0xCD70, 0xAD4C, 0xCD71, 0xC3DC, 0xCD72, 0xAD4D, 0xCD73, 0xAD4E, + 0xCD74, 0xAD4F, 0xCD75, 0xAD50, 0xCD76, 0xAD51, 0xCD77, 0xAD52, 0xCD78, 0xC3DD, 0xCD79, 0xAD53, 0xCD7A, 0xAD54, 0xCD7B, 0xAD55, + 0xCD7C, 0xAD56, 0xCD7D, 0xAD57, 0xCD7E, 0xAD58, 0xCD7F, 0xAD59, 0xCD80, 0xAD5A, 0xCD81, 0xAD61, 0xCD82, 0xAD62, 0xCD83, 0xAD63, + 0xCD84, 0xAD64, 0xCD85, 0xAD65, 0xCD86, 0xAD66, 0xCD87, 0xAD67, 0xCD88, 0xC3DE, 0xCD89, 0xAD68, 0xCD8A, 0xAD69, 0xCD8B, 0xAD6A, + 0xCD8C, 0xAD6B, 0xCD8D, 0xAD6C, 0xCD8E, 0xAD6D, 0xCD8F, 0xAD6E, 0xCD90, 0xAD6F, 0xCD91, 0xAD70, 0xCD92, 0xAD71, 0xCD93, 0xAD72, + 0xCD94, 0xC3DF, 0xCD95, 0xC3E0, 0xCD96, 0xAD73, 0xCD97, 0xAD74, 0xCD98, 0xC3E1, 0xCD99, 0xAD75, 0xCD9A, 0xAD76, 0xCD9B, 0xAD77, + 0xCD9C, 0xC3E2, 0xCD9D, 0xAD78, 0xCD9E, 0xAD79, 0xCD9F, 0xAD7A, 0xCDA0, 0xAD81, 0xCDA1, 0xAD82, 0xCDA2, 0xAD83, 0xCDA3, 0xAD84, + 0xCDA4, 0xC3E3, 0xCDA5, 0xC3E4, 0xCDA6, 0xAD85, 0xCDA7, 0xC3E5, 0xCDA8, 0xAD86, 0xCDA9, 0xC3E6, 0xCDAA, 0xAD87, 0xCDAB, 0xAD88, + 0xCDAC, 0xAD89, 0xCDAD, 0xAD8A, 0xCDAE, 0xAD8B, 0xCDAF, 0xAD8C, 0xCDB0, 0xC3E7, 0xCDB1, 0xAD8D, 0xCDB2, 0xAD8E, 0xCDB3, 0xAD8F, + 0xCDB4, 0xAD90, 0xCDB5, 0xAD91, 0xCDB6, 0xAD92, 0xCDB7, 0xAD93, 0xCDB8, 0xAD94, 0xCDB9, 0xAD95, 0xCDBA, 0xAD96, 0xCDBB, 0xAD97, + 0xCDBC, 0xAD98, 0xCDBD, 0xAD99, 0xCDBE, 0xAD9A, 0xCDBF, 0xAD9B, 0xCDC0, 0xAD9C, 0xCDC1, 0xAD9D, 0xCDC2, 0xAD9E, 0xCDC3, 0xAD9F, + 0xCDC4, 0xC3E8, 0xCDC5, 0xADA0, 0xCDC6, 0xAE41, 0xCDC7, 0xAE42, 0xCDC8, 0xAE43, 0xCDC9, 0xAE44, 0xCDCA, 0xAE45, 0xCDCB, 0xAE46, + 0xCDCC, 0xC3E9, 0xCDCD, 0xAE47, 0xCDCE, 0xAE48, 0xCDCF, 0xAE49, 0xCDD0, 0xC3EA, 0xCDD1, 0xAE4A, 0xCDD2, 0xAE4B, 0xCDD3, 0xAE4C, + 0xCDD4, 0xAE4D, 0xCDD5, 0xAE4E, 0xCDD6, 0xAE4F, 0xCDD7, 0xAE50, 0xCDD8, 0xAE51, 0xCDD9, 0xAE52, 0xCDDA, 0xAE53, 0xCDDB, 0xAE54, + 0xCDDC, 0xAE55, 0xCDDD, 0xAE56, 0xCDDE, 0xAE57, 0xCDDF, 0xAE58, 0xCDE0, 0xAE59, 0xCDE1, 0xAE5A, 0xCDE2, 0xAE61, 0xCDE3, 0xAE62, + 0xCDE4, 0xAE63, 0xCDE5, 0xAE64, 0xCDE6, 0xAE65, 0xCDE7, 0xAE66, 0xCDE8, 0xC3EB, 0xCDE9, 0xAE67, 0xCDEA, 0xAE68, 0xCDEB, 0xAE69, + 0xCDEC, 0xC3EC, 0xCDED, 0xAE6A, 0xCDEE, 0xAE6B, 0xCDEF, 0xAE6C, 0xCDF0, 0xC3ED, 0xCDF1, 0xAE6D, 0xCDF2, 0xAE6E, 0xCDF3, 0xAE6F, + 0xCDF4, 0xAE70, 0xCDF5, 0xAE71, 0xCDF6, 0xAE72, 0xCDF7, 0xAE73, 0xCDF8, 0xC3EE, 0xCDF9, 0xC3EF, 0xCDFA, 0xAE74, 0xCDFB, 0xC3F0, + 0xCDFC, 0xAE75, 0xCDFD, 0xC3F1, 0xCDFE, 0xAE76, 0xCDFF, 0xAE77, 0xCE00, 0xAE78, 0xCE01, 0xAE79, 0xCE02, 0xAE7A, 0xCE03, 0xAE81, + 0xCE04, 0xC3F2, 0xCE05, 0xAE82, 0xCE06, 0xAE83, 0xCE07, 0xAE84, 0xCE08, 0xC3F3, 0xCE09, 0xAE85, 0xCE0A, 0xAE86, 0xCE0B, 0xAE87, + 0xCE0C, 0xC3F4, 0xCE0D, 0xAE88, 0xCE0E, 0xAE89, 0xCE0F, 0xAE8A, 0xCE10, 0xAE8B, 0xCE11, 0xAE8C, 0xCE12, 0xAE8D, 0xCE13, 0xAE8E, + 0xCE14, 0xC3F5, 0xCE15, 0xAE8F, 0xCE16, 0xAE90, 0xCE17, 0xAE91, 0xCE18, 0xAE92, 0xCE19, 0xC3F6, 0xCE1A, 0xAE93, 0xCE1B, 0xAE94, + 0xCE1C, 0xAE95, 0xCE1D, 0xAE96, 0xCE1E, 0xAE97, 0xCE1F, 0xAE98, 0xCE20, 0xC3F7, 0xCE21, 0xC3F8, 0xCE22, 0xAE99, 0xCE23, 0xAE9A, + 0xCE24, 0xC3F9, 0xCE25, 0xAE9B, 0xCE26, 0xAE9C, 0xCE27, 0xAE9D, 0xCE28, 0xC3FA, 0xCE29, 0xAE9E, 0xCE2A, 0xAE9F, 0xCE2B, 0xAEA0, + 0xCE2C, 0xAF41, 0xCE2D, 0xAF42, 0xCE2E, 0xAF43, 0xCE2F, 0xAF44, 0xCE30, 0xC3FB, 0xCE31, 0xC3FC, 0xCE32, 0xAF45, 0xCE33, 0xC3FD, + 0xCE34, 0xAF46, 0xCE35, 0xC3FE, 0xCE36, 0xAF47, 0xCE37, 0xAF48, 0xCE38, 0xAF49, 0xCE39, 0xAF4A, 0xCE3A, 0xAF4B, 0xCE3B, 0xAF4C, + 0xCE3C, 0xAF4D, 0xCE3D, 0xAF4E, 0xCE3E, 0xAF4F, 0xCE3F, 0xAF50, 0xCE40, 0xAF51, 0xCE41, 0xAF52, 0xCE42, 0xAF53, 0xCE43, 0xAF54, + 0xCE44, 0xAF55, 0xCE45, 0xAF56, 0xCE46, 0xAF57, 0xCE47, 0xAF58, 0xCE48, 0xAF59, 0xCE49, 0xAF5A, 0xCE4A, 0xAF61, 0xCE4B, 0xAF62, + 0xCE4C, 0xAF63, 0xCE4D, 0xAF64, 0xCE4E, 0xAF65, 0xCE4F, 0xAF66, 0xCE50, 0xAF67, 0xCE51, 0xAF68, 0xCE52, 0xAF69, 0xCE53, 0xAF6A, + 0xCE54, 0xAF6B, 0xCE55, 0xAF6C, 0xCE56, 0xAF6D, 0xCE57, 0xAF6E, 0xCE58, 0xC4A1, 0xCE59, 0xC4A2, 0xCE5A, 0xAF6F, 0xCE5B, 0xAF70, + 0xCE5C, 0xC4A3, 0xCE5D, 0xAF71, 0xCE5E, 0xAF72, 0xCE5F, 0xC4A4, 0xCE60, 0xC4A5, 0xCE61, 0xC4A6, 0xCE62, 0xAF73, 0xCE63, 0xAF74, + 0xCE64, 0xAF75, 0xCE65, 0xAF76, 0xCE66, 0xAF77, 0xCE67, 0xAF78, 0xCE68, 0xC4A7, 0xCE69, 0xC4A8, 0xCE6A, 0xAF79, 0xCE6B, 0xC4A9, + 0xCE6C, 0xAF7A, 0xCE6D, 0xC4AA, 0xCE6E, 0xAF81, 0xCE6F, 0xAF82, 0xCE70, 0xAF83, 0xCE71, 0xAF84, 0xCE72, 0xAF85, 0xCE73, 0xAF86, + 0xCE74, 0xC4AB, 0xCE75, 0xC4AC, 0xCE76, 0xAF87, 0xCE77, 0xAF88, 0xCE78, 0xC4AD, 0xCE79, 0xAF89, 0xCE7A, 0xAF8A, 0xCE7B, 0xAF8B, + 0xCE7C, 0xC4AE, 0xCE7D, 0xAF8C, 0xCE7E, 0xAF8D, 0xCE7F, 0xAF8E, 0xCE80, 0xAF8F, 0xCE81, 0xAF90, 0xCE82, 0xAF91, 0xCE83, 0xAF92, + 0xCE84, 0xC4AF, 0xCE85, 0xC4B0, 0xCE86, 0xAF93, 0xCE87, 0xC4B1, 0xCE88, 0xAF94, 0xCE89, 0xC4B2, 0xCE8A, 0xAF95, 0xCE8B, 0xAF96, + 0xCE8C, 0xAF97, 0xCE8D, 0xAF98, 0xCE8E, 0xAF99, 0xCE8F, 0xAF9A, 0xCE90, 0xC4B3, 0xCE91, 0xC4B4, 0xCE92, 0xAF9B, 0xCE93, 0xAF9C, + 0xCE94, 0xC4B5, 0xCE95, 0xAF9D, 0xCE96, 0xAF9E, 0xCE97, 0xAF9F, 0xCE98, 0xC4B6, 0xCE99, 0xAFA0, 0xCE9A, 0xB041, 0xCE9B, 0xB042, + 0xCE9C, 0xB043, 0xCE9D, 0xB044, 0xCE9E, 0xB045, 0xCE9F, 0xB046, 0xCEA0, 0xC4B7, 0xCEA1, 0xC4B8, 0xCEA2, 0xB047, 0xCEA3, 0xC4B9, + 0xCEA4, 0xC4BA, 0xCEA5, 0xC4BB, 0xCEA6, 0xB048, 0xCEA7, 0xB049, 0xCEA8, 0xB04A, 0xCEA9, 0xB04B, 0xCEAA, 0xB04C, 0xCEAB, 0xB04D, + 0xCEAC, 0xC4BC, 0xCEAD, 0xC4BD, 0xCEAE, 0xB04E, 0xCEAF, 0xB04F, 0xCEB0, 0xB050, 0xCEB1, 0xB051, 0xCEB2, 0xB052, 0xCEB3, 0xB053, + 0xCEB4, 0xB054, 0xCEB5, 0xB055, 0xCEB6, 0xB056, 0xCEB7, 0xB057, 0xCEB8, 0xB058, 0xCEB9, 0xB059, 0xCEBA, 0xB05A, 0xCEBB, 0xB061, + 0xCEBC, 0xB062, 0xCEBD, 0xB063, 0xCEBE, 0xB064, 0xCEBF, 0xB065, 0xCEC0, 0xB066, 0xCEC1, 0xC4BE, 0xCEC2, 0xB067, 0xCEC3, 0xB068, + 0xCEC4, 0xB069, 0xCEC5, 0xB06A, 0xCEC6, 0xB06B, 0xCEC7, 0xB06C, 0xCEC8, 0xB06D, 0xCEC9, 0xB06E, 0xCECA, 0xB06F, 0xCECB, 0xB070, + 0xCECC, 0xB071, 0xCECD, 0xB072, 0xCECE, 0xB073, 0xCECF, 0xB074, 0xCED0, 0xB075, 0xCED1, 0xB076, 0xCED2, 0xB077, 0xCED3, 0xB078, + 0xCED4, 0xB079, 0xCED5, 0xB07A, 0xCED6, 0xB081, 0xCED7, 0xB082, 0xCED8, 0xB083, 0xCED9, 0xB084, 0xCEDA, 0xB085, 0xCEDB, 0xB086, + 0xCEDC, 0xB087, 0xCEDD, 0xB088, 0xCEDE, 0xB089, 0xCEDF, 0xB08A, 0xCEE0, 0xB08B, 0xCEE1, 0xB08C, 0xCEE2, 0xB08D, 0xCEE3, 0xB08E, + 0xCEE4, 0xC4BF, 0xCEE5, 0xC4C0, 0xCEE6, 0xB08F, 0xCEE7, 0xB090, 0xCEE8, 0xC4C1, 0xCEE9, 0xB091, 0xCEEA, 0xB092, 0xCEEB, 0xC4C2, + 0xCEEC, 0xC4C3, 0xCEED, 0xB093, 0xCEEE, 0xB094, 0xCEEF, 0xB095, 0xCEF0, 0xB096, 0xCEF1, 0xB097, 0xCEF2, 0xB098, 0xCEF3, 0xB099, + 0xCEF4, 0xC4C4, 0xCEF5, 0xC4C5, 0xCEF6, 0xB09A, 0xCEF7, 0xC4C6, 0xCEF8, 0xC4C7, 0xCEF9, 0xC4C8, 0xCEFA, 0xB09B, 0xCEFB, 0xB09C, + 0xCEFC, 0xB09D, 0xCEFD, 0xB09E, 0xCEFE, 0xB09F, 0xCEFF, 0xB0A0, 0xCF00, 0xC4C9, 0xCF01, 0xC4CA, 0xCF02, 0xB141, 0xCF03, 0xB142, + 0xCF04, 0xC4CB, 0xCF05, 0xB143, 0xCF06, 0xB144, 0xCF07, 0xB145, 0xCF08, 0xC4CC, 0xCF09, 0xB146, 0xCF0A, 0xB147, 0xCF0B, 0xB148, + 0xCF0C, 0xB149, 0xCF0D, 0xB14A, 0xCF0E, 0xB14B, 0xCF0F, 0xB14C, 0xCF10, 0xC4CD, 0xCF11, 0xC4CE, 0xCF12, 0xB14D, 0xCF13, 0xC4CF, + 0xCF14, 0xB14E, 0xCF15, 0xC4D0, 0xCF16, 0xB14F, 0xCF17, 0xB150, 0xCF18, 0xB151, 0xCF19, 0xB152, 0xCF1A, 0xB153, 0xCF1B, 0xB154, + 0xCF1C, 0xC4D1, 0xCF1D, 0xB155, 0xCF1E, 0xB156, 0xCF1F, 0xB157, 0xCF20, 0xC4D2, 0xCF21, 0xB158, 0xCF22, 0xB159, 0xCF23, 0xB15A, + 0xCF24, 0xC4D3, 0xCF25, 0xB161, 0xCF26, 0xB162, 0xCF27, 0xB163, 0xCF28, 0xB164, 0xCF29, 0xB165, 0xCF2A, 0xB166, 0xCF2B, 0xB167, + 0xCF2C, 0xC4D4, 0xCF2D, 0xC4D5, 0xCF2E, 0xB168, 0xCF2F, 0xC4D6, 0xCF30, 0xC4D7, 0xCF31, 0xC4D8, 0xCF32, 0xB169, 0xCF33, 0xB16A, + 0xCF34, 0xB16B, 0xCF35, 0xB16C, 0xCF36, 0xB16D, 0xCF37, 0xB16E, 0xCF38, 0xC4D9, 0xCF39, 0xB16F, 0xCF3A, 0xB170, 0xCF3B, 0xB171, + 0xCF3C, 0xB172, 0xCF3D, 0xB173, 0xCF3E, 0xB174, 0xCF3F, 0xB175, 0xCF40, 0xB176, 0xCF41, 0xB177, 0xCF42, 0xB178, 0xCF43, 0xB179, + 0xCF44, 0xB17A, 0xCF45, 0xB181, 0xCF46, 0xB182, 0xCF47, 0xB183, 0xCF48, 0xB184, 0xCF49, 0xB185, 0xCF4A, 0xB186, 0xCF4B, 0xB187, + 0xCF4C, 0xB188, 0xCF4D, 0xB189, 0xCF4E, 0xB18A, 0xCF4F, 0xB18B, 0xCF50, 0xB18C, 0xCF51, 0xB18D, 0xCF52, 0xB18E, 0xCF53, 0xB18F, + 0xCF54, 0xC4DA, 0xCF55, 0xC4DB, 0xCF56, 0xB190, 0xCF57, 0xB191, 0xCF58, 0xC4DC, 0xCF59, 0xB192, 0xCF5A, 0xB193, 0xCF5B, 0xB194, + 0xCF5C, 0xC4DD, 0xCF5D, 0xB195, 0xCF5E, 0xB196, 0xCF5F, 0xB197, 0xCF60, 0xB198, 0xCF61, 0xB199, 0xCF62, 0xB19A, 0xCF63, 0xB19B, + 0xCF64, 0xC4DE, 0xCF65, 0xC4DF, 0xCF66, 0xB19C, 0xCF67, 0xC4E0, 0xCF68, 0xB19D, 0xCF69, 0xC4E1, 0xCF6A, 0xB19E, 0xCF6B, 0xB19F, + 0xCF6C, 0xB1A0, 0xCF6D, 0xB241, 0xCF6E, 0xB242, 0xCF6F, 0xB243, 0xCF70, 0xC4E2, 0xCF71, 0xC4E3, 0xCF72, 0xB244, 0xCF73, 0xB245, + 0xCF74, 0xC4E4, 0xCF75, 0xB246, 0xCF76, 0xB247, 0xCF77, 0xB248, 0xCF78, 0xC4E5, 0xCF79, 0xB249, 0xCF7A, 0xB24A, 0xCF7B, 0xB24B, + 0xCF7C, 0xB24C, 0xCF7D, 0xB24D, 0xCF7E, 0xB24E, 0xCF7F, 0xB24F, 0xCF80, 0xC4E6, 0xCF81, 0xB250, 0xCF82, 0xB251, 0xCF83, 0xB252, + 0xCF84, 0xB253, 0xCF85, 0xC4E7, 0xCF86, 0xB254, 0xCF87, 0xB255, 0xCF88, 0xB256, 0xCF89, 0xB257, 0xCF8A, 0xB258, 0xCF8B, 0xB259, + 0xCF8C, 0xC4E8, 0xCF8D, 0xB25A, 0xCF8E, 0xB261, 0xCF8F, 0xB262, 0xCF90, 0xB263, 0xCF91, 0xB264, 0xCF92, 0xB265, 0xCF93, 0xB266, + 0xCF94, 0xB267, 0xCF95, 0xB268, 0xCF96, 0xB269, 0xCF97, 0xB26A, 0xCF98, 0xB26B, 0xCF99, 0xB26C, 0xCF9A, 0xB26D, 0xCF9B, 0xB26E, + 0xCF9C, 0xB26F, 0xCF9D, 0xB270, 0xCF9E, 0xB271, 0xCF9F, 0xB272, 0xCFA0, 0xB273, 0xCFA1, 0xC4E9, 0xCFA2, 0xB274, 0xCFA3, 0xB275, + 0xCFA4, 0xB276, 0xCFA5, 0xB277, 0xCFA6, 0xB278, 0xCFA7, 0xB279, 0xCFA8, 0xC4EA, 0xCFA9, 0xB27A, 0xCFAA, 0xB281, 0xCFAB, 0xB282, + 0xCFAC, 0xB283, 0xCFAD, 0xB284, 0xCFAE, 0xB285, 0xCFAF, 0xB286, 0xCFB0, 0xC4EB, 0xCFB1, 0xB287, 0xCFB2, 0xB288, 0xCFB3, 0xB289, + 0xCFB4, 0xB28A, 0xCFB5, 0xB28B, 0xCFB6, 0xB28C, 0xCFB7, 0xB28D, 0xCFB8, 0xB28E, 0xCFB9, 0xB28F, 0xCFBA, 0xB290, 0xCFBB, 0xB291, + 0xCFBC, 0xB292, 0xCFBD, 0xB293, 0xCFBE, 0xB294, 0xCFBF, 0xB295, 0xCFC0, 0xB296, 0xCFC1, 0xB297, 0xCFC2, 0xB298, 0xCFC3, 0xB299, + 0xCFC4, 0xC4EC, 0xCFC5, 0xB29A, 0xCFC6, 0xB29B, 0xCFC7, 0xB29C, 0xCFC8, 0xB29D, 0xCFC9, 0xB29E, 0xCFCA, 0xB29F, 0xCFCB, 0xB2A0, + 0xCFCC, 0xB341, 0xCFCD, 0xB342, 0xCFCE, 0xB343, 0xCFCF, 0xB344, 0xCFD0, 0xB345, 0xCFD1, 0xB346, 0xCFD2, 0xB347, 0xCFD3, 0xB348, + 0xCFD4, 0xB349, 0xCFD5, 0xB34A, 0xCFD6, 0xB34B, 0xCFD7, 0xB34C, 0xCFD8, 0xB34D, 0xCFD9, 0xB34E, 0xCFDA, 0xB34F, 0xCFDB, 0xB350, + 0xCFDC, 0xB351, 0xCFDD, 0xB352, 0xCFDE, 0xB353, 0xCFDF, 0xB354, 0xCFE0, 0xC4ED, 0xCFE1, 0xC4EE, 0xCFE2, 0xB355, 0xCFE3, 0xB356, + 0xCFE4, 0xC4EF, 0xCFE5, 0xB357, 0xCFE6, 0xB358, 0xCFE7, 0xB359, 0xCFE8, 0xC4F0, 0xCFE9, 0xB35A, 0xCFEA, 0xB361, 0xCFEB, 0xB362, + 0xCFEC, 0xB363, 0xCFED, 0xB364, 0xCFEE, 0xB365, 0xCFEF, 0xB366, 0xCFF0, 0xC4F1, 0xCFF1, 0xC4F2, 0xCFF2, 0xB367, 0xCFF3, 0xC4F3, + 0xCFF4, 0xB368, 0xCFF5, 0xC4F4, 0xCFF6, 0xB369, 0xCFF7, 0xB36A, 0xCFF8, 0xB36B, 0xCFF9, 0xB36C, 0xCFFA, 0xB36D, 0xCFFB, 0xB36E, + 0xCFFC, 0xC4F5, 0xCFFD, 0xB36F, 0xCFFE, 0xB370, 0xCFFF, 0xB371, 0xD000, 0xC4F6, 0xD001, 0xB372, 0xD002, 0xB373, 0xD003, 0xB374, + 0xD004, 0xC4F7, 0xD005, 0xB375, 0xD006, 0xB376, 0xD007, 0xB377, 0xD008, 0xB378, 0xD009, 0xB379, 0xD00A, 0xB37A, 0xD00B, 0xB381, + 0xD00C, 0xB382, 0xD00D, 0xB383, 0xD00E, 0xB384, 0xD00F, 0xB385, 0xD010, 0xB386, 0xD011, 0xC4F8, 0xD012, 0xB387, 0xD013, 0xB388, + 0xD014, 0xB389, 0xD015, 0xB38A, 0xD016, 0xB38B, 0xD017, 0xB38C, 0xD018, 0xC4F9, 0xD019, 0xB38D, 0xD01A, 0xB38E, 0xD01B, 0xB38F, + 0xD01C, 0xB390, 0xD01D, 0xB391, 0xD01E, 0xB392, 0xD01F, 0xB393, 0xD020, 0xB394, 0xD021, 0xB395, 0xD022, 0xB396, 0xD023, 0xB397, + 0xD024, 0xB398, 0xD025, 0xB399, 0xD026, 0xB39A, 0xD027, 0xB39B, 0xD028, 0xB39C, 0xD029, 0xB39D, 0xD02A, 0xB39E, 0xD02B, 0xB39F, + 0xD02C, 0xB3A0, 0xD02D, 0xC4FA, 0xD02E, 0xB441, 0xD02F, 0xB442, 0xD030, 0xB443, 0xD031, 0xB444, 0xD032, 0xB445, 0xD033, 0xB446, + 0xD034, 0xC4FB, 0xD035, 0xC4FC, 0xD036, 0xB447, 0xD037, 0xB448, 0xD038, 0xC4FD, 0xD039, 0xB449, 0xD03A, 0xB44A, 0xD03B, 0xB44B, + 0xD03C, 0xC4FE, 0xD03D, 0xB44C, 0xD03E, 0xB44D, 0xD03F, 0xB44E, 0xD040, 0xB44F, 0xD041, 0xB450, 0xD042, 0xB451, 0xD043, 0xB452, + 0xD044, 0xC5A1, 0xD045, 0xC5A2, 0xD046, 0xB453, 0xD047, 0xC5A3, 0xD048, 0xB454, 0xD049, 0xC5A4, 0xD04A, 0xB455, 0xD04B, 0xB456, + 0xD04C, 0xB457, 0xD04D, 0xB458, 0xD04E, 0xB459, 0xD04F, 0xB45A, 0xD050, 0xC5A5, 0xD051, 0xB461, 0xD052, 0xB462, 0xD053, 0xB463, + 0xD054, 0xC5A6, 0xD055, 0xB464, 0xD056, 0xB465, 0xD057, 0xB466, 0xD058, 0xC5A7, 0xD059, 0xB467, 0xD05A, 0xB468, 0xD05B, 0xB469, + 0xD05C, 0xB46A, 0xD05D, 0xB46B, 0xD05E, 0xB46C, 0xD05F, 0xB46D, 0xD060, 0xC5A8, 0xD061, 0xB46E, 0xD062, 0xB46F, 0xD063, 0xB470, + 0xD064, 0xB471, 0xD065, 0xB472, 0xD066, 0xB473, 0xD067, 0xB474, 0xD068, 0xB475, 0xD069, 0xB476, 0xD06A, 0xB477, 0xD06B, 0xB478, + 0xD06C, 0xC5A9, 0xD06D, 0xC5AA, 0xD06E, 0xB479, 0xD06F, 0xB47A, 0xD070, 0xC5AB, 0xD071, 0xB481, 0xD072, 0xB482, 0xD073, 0xB483, + 0xD074, 0xC5AC, 0xD075, 0xB484, 0xD076, 0xB485, 0xD077, 0xB486, 0xD078, 0xB487, 0xD079, 0xB488, 0xD07A, 0xB489, 0xD07B, 0xB48A, + 0xD07C, 0xC5AD, 0xD07D, 0xC5AE, 0xD07E, 0xB48B, 0xD07F, 0xB48C, 0xD080, 0xB48D, 0xD081, 0xC5AF, 0xD082, 0xB48E, 0xD083, 0xB48F, + 0xD084, 0xB490, 0xD085, 0xB491, 0xD086, 0xB492, 0xD087, 0xB493, 0xD088, 0xB494, 0xD089, 0xB495, 0xD08A, 0xB496, 0xD08B, 0xB497, + 0xD08C, 0xB498, 0xD08D, 0xB499, 0xD08E, 0xB49A, 0xD08F, 0xB49B, 0xD090, 0xB49C, 0xD091, 0xB49D, 0xD092, 0xB49E, 0xD093, 0xB49F, + 0xD094, 0xB4A0, 0xD095, 0xB541, 0xD096, 0xB542, 0xD097, 0xB543, 0xD098, 0xB544, 0xD099, 0xB545, 0xD09A, 0xB546, 0xD09B, 0xB547, + 0xD09C, 0xB548, 0xD09D, 0xB549, 0xD09E, 0xB54A, 0xD09F, 0xB54B, 0xD0A0, 0xB54C, 0xD0A1, 0xB54D, 0xD0A2, 0xB54E, 0xD0A3, 0xB54F, + 0xD0A4, 0xC5B0, 0xD0A5, 0xC5B1, 0xD0A6, 0xB550, 0xD0A7, 0xB551, 0xD0A8, 0xC5B2, 0xD0A9, 0xB552, 0xD0AA, 0xB553, 0xD0AB, 0xB554, + 0xD0AC, 0xC5B3, 0xD0AD, 0xB555, 0xD0AE, 0xB556, 0xD0AF, 0xB557, 0xD0B0, 0xB558, 0xD0B1, 0xB559, 0xD0B2, 0xB55A, 0xD0B3, 0xB561, + 0xD0B4, 0xC5B4, 0xD0B5, 0xC5B5, 0xD0B6, 0xB562, 0xD0B7, 0xC5B6, 0xD0B8, 0xB563, 0xD0B9, 0xC5B7, 0xD0BA, 0xB564, 0xD0BB, 0xB565, + 0xD0BC, 0xB566, 0xD0BD, 0xB567, 0xD0BE, 0xB568, 0xD0BF, 0xB569, 0xD0C0, 0xC5B8, 0xD0C1, 0xC5B9, 0xD0C2, 0xB56A, 0xD0C3, 0xB56B, + 0xD0C4, 0xC5BA, 0xD0C5, 0xB56C, 0xD0C6, 0xB56D, 0xD0C7, 0xB56E, 0xD0C8, 0xC5BB, 0xD0C9, 0xC5BC, 0xD0CA, 0xB56F, 0xD0CB, 0xB570, + 0xD0CC, 0xB571, 0xD0CD, 0xB572, 0xD0CE, 0xB573, 0xD0CF, 0xB574, 0xD0D0, 0xC5BD, 0xD0D1, 0xC5BE, 0xD0D2, 0xB575, 0xD0D3, 0xC5BF, + 0xD0D4, 0xC5C0, 0xD0D5, 0xC5C1, 0xD0D6, 0xB576, 0xD0D7, 0xB577, 0xD0D8, 0xB578, 0xD0D9, 0xB579, 0xD0DA, 0xB57A, 0xD0DB, 0xB581, + 0xD0DC, 0xC5C2, 0xD0DD, 0xC5C3, 0xD0DE, 0xB582, 0xD0DF, 0xB583, 0xD0E0, 0xC5C4, 0xD0E1, 0xB584, 0xD0E2, 0xB585, 0xD0E3, 0xB586, + 0xD0E4, 0xC5C5, 0xD0E5, 0xB587, 0xD0E6, 0xB588, 0xD0E7, 0xB589, 0xD0E8, 0xB58A, 0xD0E9, 0xB58B, 0xD0EA, 0xB58C, 0xD0EB, 0xB58D, + 0xD0EC, 0xC5C6, 0xD0ED, 0xC5C7, 0xD0EE, 0xB58E, 0xD0EF, 0xC5C8, 0xD0F0, 0xC5C9, 0xD0F1, 0xC5CA, 0xD0F2, 0xB58F, 0xD0F3, 0xB590, + 0xD0F4, 0xB591, 0xD0F5, 0xB592, 0xD0F6, 0xB593, 0xD0F7, 0xB594, 0xD0F8, 0xC5CB, 0xD0F9, 0xB595, 0xD0FA, 0xB596, 0xD0FB, 0xB597, + 0xD0FC, 0xB598, 0xD0FD, 0xB599, 0xD0FE, 0xB59A, 0xD0FF, 0xB59B, 0xD100, 0xB59C, 0xD101, 0xB59D, 0xD102, 0xB59E, 0xD103, 0xB59F, + 0xD104, 0xB5A0, 0xD105, 0xB641, 0xD106, 0xB642, 0xD107, 0xB643, 0xD108, 0xB644, 0xD109, 0xB645, 0xD10A, 0xB646, 0xD10B, 0xB647, + 0xD10C, 0xB648, 0xD10D, 0xC5CC, 0xD10E, 0xB649, 0xD10F, 0xB64A, 0xD110, 0xB64B, 0xD111, 0xB64C, 0xD112, 0xB64D, 0xD113, 0xB64E, + 0xD114, 0xB64F, 0xD115, 0xB650, 0xD116, 0xB651, 0xD117, 0xB652, 0xD118, 0xB653, 0xD119, 0xB654, 0xD11A, 0xB655, 0xD11B, 0xB656, + 0xD11C, 0xB657, 0xD11D, 0xB658, 0xD11E, 0xB659, 0xD11F, 0xB65A, 0xD120, 0xB661, 0xD121, 0xB662, 0xD122, 0xB663, 0xD123, 0xB664, + 0xD124, 0xB665, 0xD125, 0xB666, 0xD126, 0xB667, 0xD127, 0xB668, 0xD128, 0xB669, 0xD129, 0xB66A, 0xD12A, 0xB66B, 0xD12B, 0xB66C, + 0xD12C, 0xB66D, 0xD12D, 0xB66E, 0xD12E, 0xB66F, 0xD12F, 0xB670, 0xD130, 0xC5CD, 0xD131, 0xC5CE, 0xD132, 0xB671, 0xD133, 0xB672, + 0xD134, 0xC5CF, 0xD135, 0xB673, 0xD136, 0xB674, 0xD137, 0xB675, 0xD138, 0xC5D0, 0xD139, 0xB676, 0xD13A, 0xC5D1, 0xD13B, 0xB677, + 0xD13C, 0xB678, 0xD13D, 0xB679, 0xD13E, 0xB67A, 0xD13F, 0xB681, 0xD140, 0xC5D2, 0xD141, 0xC5D3, 0xD142, 0xB682, 0xD143, 0xC5D4, + 0xD144, 0xC5D5, 0xD145, 0xC5D6, 0xD146, 0xB683, 0xD147, 0xB684, 0xD148, 0xB685, 0xD149, 0xB686, 0xD14A, 0xB687, 0xD14B, 0xB688, + 0xD14C, 0xC5D7, 0xD14D, 0xC5D8, 0xD14E, 0xB689, 0xD14F, 0xB68A, 0xD150, 0xC5D9, 0xD151, 0xB68B, 0xD152, 0xB68C, 0xD153, 0xB68D, + 0xD154, 0xC5DA, 0xD155, 0xB68E, 0xD156, 0xB68F, 0xD157, 0xB690, 0xD158, 0xB691, 0xD159, 0xB692, 0xD15A, 0xB693, 0xD15B, 0xB694, + 0xD15C, 0xC5DB, 0xD15D, 0xC5DC, 0xD15E, 0xB695, 0xD15F, 0xC5DD, 0xD160, 0xB696, 0xD161, 0xC5DE, 0xD162, 0xB697, 0xD163, 0xB698, + 0xD164, 0xB699, 0xD165, 0xB69A, 0xD166, 0xB69B, 0xD167, 0xB69C, 0xD168, 0xC5DF, 0xD169, 0xB69D, 0xD16A, 0xB69E, 0xD16B, 0xB69F, + 0xD16C, 0xC5E0, 0xD16D, 0xB6A0, 0xD16E, 0xB741, 0xD16F, 0xB742, 0xD170, 0xB743, 0xD171, 0xB744, 0xD172, 0xB745, 0xD173, 0xB746, + 0xD174, 0xB747, 0xD175, 0xB748, 0xD176, 0xB749, 0xD177, 0xB74A, 0xD178, 0xB74B, 0xD179, 0xB74C, 0xD17A, 0xB74D, 0xD17B, 0xB74E, + 0xD17C, 0xC5E1, 0xD17D, 0xB74F, 0xD17E, 0xB750, 0xD17F, 0xB751, 0xD180, 0xB752, 0xD181, 0xB753, 0xD182, 0xB754, 0xD183, 0xB755, + 0xD184, 0xC5E2, 0xD185, 0xB756, 0xD186, 0xB757, 0xD187, 0xB758, 0xD188, 0xC5E3, 0xD189, 0xB759, 0xD18A, 0xB75A, 0xD18B, 0xB761, + 0xD18C, 0xB762, 0xD18D, 0xB763, 0xD18E, 0xB764, 0xD18F, 0xB765, 0xD190, 0xB766, 0xD191, 0xB767, 0xD192, 0xB768, 0xD193, 0xB769, + 0xD194, 0xB76A, 0xD195, 0xB76B, 0xD196, 0xB76C, 0xD197, 0xB76D, 0xD198, 0xB76E, 0xD199, 0xB76F, 0xD19A, 0xB770, 0xD19B, 0xB771, + 0xD19C, 0xB772, 0xD19D, 0xB773, 0xD19E, 0xB774, 0xD19F, 0xB775, 0xD1A0, 0xC5E4, 0xD1A1, 0xC5E5, 0xD1A2, 0xB776, 0xD1A3, 0xB777, + 0xD1A4, 0xC5E6, 0xD1A5, 0xB778, 0xD1A6, 0xB779, 0xD1A7, 0xB77A, 0xD1A8, 0xC5E7, 0xD1A9, 0xB781, 0xD1AA, 0xB782, 0xD1AB, 0xB783, + 0xD1AC, 0xB784, 0xD1AD, 0xB785, 0xD1AE, 0xB786, 0xD1AF, 0xB787, 0xD1B0, 0xC5E8, 0xD1B1, 0xC5E9, 0xD1B2, 0xB788, 0xD1B3, 0xC5EA, + 0xD1B4, 0xB789, 0xD1B5, 0xC5EB, 0xD1B6, 0xB78A, 0xD1B7, 0xB78B, 0xD1B8, 0xB78C, 0xD1B9, 0xB78D, 0xD1BA, 0xC5EC, 0xD1BB, 0xB78E, + 0xD1BC, 0xC5ED, 0xD1BD, 0xB78F, 0xD1BE, 0xB790, 0xD1BF, 0xB791, 0xD1C0, 0xC5EE, 0xD1C1, 0xB792, 0xD1C2, 0xB793, 0xD1C3, 0xB794, + 0xD1C4, 0xB795, 0xD1C5, 0xB796, 0xD1C6, 0xB797, 0xD1C7, 0xB798, 0xD1C8, 0xB799, 0xD1C9, 0xB79A, 0xD1CA, 0xB79B, 0xD1CB, 0xB79C, + 0xD1CC, 0xB79D, 0xD1CD, 0xB79E, 0xD1CE, 0xB79F, 0xD1CF, 0xB7A0, 0xD1D0, 0xB841, 0xD1D1, 0xB842, 0xD1D2, 0xB843, 0xD1D3, 0xB844, + 0xD1D4, 0xB845, 0xD1D5, 0xB846, 0xD1D6, 0xB847, 0xD1D7, 0xB848, 0xD1D8, 0xC5EF, 0xD1D9, 0xB849, 0xD1DA, 0xB84A, 0xD1DB, 0xB84B, + 0xD1DC, 0xB84C, 0xD1DD, 0xB84D, 0xD1DE, 0xB84E, 0xD1DF, 0xB84F, 0xD1E0, 0xB850, 0xD1E1, 0xB851, 0xD1E2, 0xB852, 0xD1E3, 0xB853, + 0xD1E4, 0xB854, 0xD1E5, 0xB855, 0xD1E6, 0xB856, 0xD1E7, 0xB857, 0xD1E8, 0xB858, 0xD1E9, 0xB859, 0xD1EA, 0xB85A, 0xD1EB, 0xB861, + 0xD1EC, 0xB862, 0xD1ED, 0xB863, 0xD1EE, 0xB864, 0xD1EF, 0xB865, 0xD1F0, 0xB866, 0xD1F1, 0xB867, 0xD1F2, 0xB868, 0xD1F3, 0xB869, + 0xD1F4, 0xC5F0, 0xD1F5, 0xB86A, 0xD1F6, 0xB86B, 0xD1F7, 0xB86C, 0xD1F8, 0xC5F1, 0xD1F9, 0xB86D, 0xD1FA, 0xB86E, 0xD1FB, 0xB86F, + 0xD1FC, 0xB870, 0xD1FD, 0xB871, 0xD1FE, 0xB872, 0xD1FF, 0xB873, 0xD200, 0xB874, 0xD201, 0xB875, 0xD202, 0xB876, 0xD203, 0xB877, + 0xD204, 0xB878, 0xD205, 0xB879, 0xD206, 0xB87A, 0xD207, 0xC5F2, 0xD208, 0xB881, 0xD209, 0xC5F3, 0xD20A, 0xB882, 0xD20B, 0xB883, + 0xD20C, 0xB884, 0xD20D, 0xB885, 0xD20E, 0xB886, 0xD20F, 0xB887, 0xD210, 0xC5F4, 0xD211, 0xB888, 0xD212, 0xB889, 0xD213, 0xB88A, + 0xD214, 0xB88B, 0xD215, 0xB88C, 0xD216, 0xB88D, 0xD217, 0xB88E, 0xD218, 0xB88F, 0xD219, 0xB890, 0xD21A, 0xB891, 0xD21B, 0xB892, + 0xD21C, 0xB893, 0xD21D, 0xB894, 0xD21E, 0xB895, 0xD21F, 0xB896, 0xD220, 0xB897, 0xD221, 0xB898, 0xD222, 0xB899, 0xD223, 0xB89A, + 0xD224, 0xB89B, 0xD225, 0xB89C, 0xD226, 0xB89D, 0xD227, 0xB89E, 0xD228, 0xB89F, 0xD229, 0xB8A0, 0xD22A, 0xB941, 0xD22B, 0xB942, + 0xD22C, 0xC5F5, 0xD22D, 0xC5F6, 0xD22E, 0xB943, 0xD22F, 0xB944, 0xD230, 0xC5F7, 0xD231, 0xB945, 0xD232, 0xB946, 0xD233, 0xB947, + 0xD234, 0xC5F8, 0xD235, 0xB948, 0xD236, 0xB949, 0xD237, 0xB94A, 0xD238, 0xB94B, 0xD239, 0xB94C, 0xD23A, 0xB94D, 0xD23B, 0xB94E, + 0xD23C, 0xC5F9, 0xD23D, 0xC5FA, 0xD23E, 0xB94F, 0xD23F, 0xC5FB, 0xD240, 0xB950, 0xD241, 0xC5FC, 0xD242, 0xB951, 0xD243, 0xB952, + 0xD244, 0xB953, 0xD245, 0xB954, 0xD246, 0xB955, 0xD247, 0xB956, 0xD248, 0xC5FD, 0xD249, 0xB957, 0xD24A, 0xB958, 0xD24B, 0xB959, + 0xD24C, 0xB95A, 0xD24D, 0xB961, 0xD24E, 0xB962, 0xD24F, 0xB963, 0xD250, 0xB964, 0xD251, 0xB965, 0xD252, 0xB966, 0xD253, 0xB967, + 0xD254, 0xB968, 0xD255, 0xB969, 0xD256, 0xB96A, 0xD257, 0xB96B, 0xD258, 0xB96C, 0xD259, 0xB96D, 0xD25A, 0xB96E, 0xD25B, 0xB96F, + 0xD25C, 0xC5FE, 0xD25D, 0xB970, 0xD25E, 0xB971, 0xD25F, 0xB972, 0xD260, 0xB973, 0xD261, 0xB974, 0xD262, 0xB975, 0xD263, 0xB976, + 0xD264, 0xC6A1, 0xD265, 0xB977, 0xD266, 0xB978, 0xD267, 0xB979, 0xD268, 0xB97A, 0xD269, 0xB981, 0xD26A, 0xB982, 0xD26B, 0xB983, + 0xD26C, 0xB984, 0xD26D, 0xB985, 0xD26E, 0xB986, 0xD26F, 0xB987, 0xD270, 0xB988, 0xD271, 0xB989, 0xD272, 0xB98A, 0xD273, 0xB98B, + 0xD274, 0xB98C, 0xD275, 0xB98D, 0xD276, 0xB98E, 0xD277, 0xB98F, 0xD278, 0xB990, 0xD279, 0xB991, 0xD27A, 0xB992, 0xD27B, 0xB993, + 0xD27C, 0xB994, 0xD27D, 0xB995, 0xD27E, 0xB996, 0xD27F, 0xB997, 0xD280, 0xC6A2, 0xD281, 0xC6A3, 0xD282, 0xB998, 0xD283, 0xB999, + 0xD284, 0xC6A4, 0xD285, 0xB99A, 0xD286, 0xB99B, 0xD287, 0xB99C, 0xD288, 0xC6A5, 0xD289, 0xB99D, 0xD28A, 0xB99E, 0xD28B, 0xB99F, + 0xD28C, 0xB9A0, 0xD28D, 0xBA41, 0xD28E, 0xBA42, 0xD28F, 0xBA43, 0xD290, 0xC6A6, 0xD291, 0xC6A7, 0xD292, 0xBA44, 0xD293, 0xBA45, + 0xD294, 0xBA46, 0xD295, 0xC6A8, 0xD296, 0xBA47, 0xD297, 0xBA48, 0xD298, 0xBA49, 0xD299, 0xBA4A, 0xD29A, 0xBA4B, 0xD29B, 0xBA4C, + 0xD29C, 0xC6A9, 0xD29D, 0xBA4D, 0xD29E, 0xBA4E, 0xD29F, 0xBA4F, 0xD2A0, 0xC6AA, 0xD2A1, 0xBA50, 0xD2A2, 0xBA51, 0xD2A3, 0xBA52, + 0xD2A4, 0xC6AB, 0xD2A5, 0xBA53, 0xD2A6, 0xBA54, 0xD2A7, 0xBA55, 0xD2A8, 0xBA56, 0xD2A9, 0xBA57, 0xD2AA, 0xBA58, 0xD2AB, 0xBA59, + 0xD2AC, 0xC6AC, 0xD2AD, 0xBA5A, 0xD2AE, 0xBA61, 0xD2AF, 0xBA62, 0xD2B0, 0xBA63, 0xD2B1, 0xC6AD, 0xD2B2, 0xBA64, 0xD2B3, 0xBA65, + 0xD2B4, 0xBA66, 0xD2B5, 0xBA67, 0xD2B6, 0xBA68, 0xD2B7, 0xBA69, 0xD2B8, 0xC6AE, 0xD2B9, 0xC6AF, 0xD2BA, 0xBA6A, 0xD2BB, 0xBA6B, + 0xD2BC, 0xC6B0, 0xD2BD, 0xBA6C, 0xD2BE, 0xBA6D, 0xD2BF, 0xC6B1, 0xD2C0, 0xC6B2, 0xD2C1, 0xBA6E, 0xD2C2, 0xC6B3, 0xD2C3, 0xBA6F, + 0xD2C4, 0xBA70, 0xD2C5, 0xBA71, 0xD2C6, 0xBA72, 0xD2C7, 0xBA73, 0xD2C8, 0xC6B4, 0xD2C9, 0xC6B5, 0xD2CA, 0xBA74, 0xD2CB, 0xC6B6, + 0xD2CC, 0xBA75, 0xD2CD, 0xBA76, 0xD2CE, 0xBA77, 0xD2CF, 0xBA78, 0xD2D0, 0xBA79, 0xD2D1, 0xBA7A, 0xD2D2, 0xBA81, 0xD2D3, 0xBA82, + 0xD2D4, 0xC6B7, 0xD2D5, 0xBA83, 0xD2D6, 0xBA84, 0xD2D7, 0xBA85, 0xD2D8, 0xC6B8, 0xD2D9, 0xBA86, 0xD2DA, 0xBA87, 0xD2DB, 0xBA88, + 0xD2DC, 0xC6B9, 0xD2DD, 0xBA89, 0xD2DE, 0xBA8A, 0xD2DF, 0xBA8B, 0xD2E0, 0xBA8C, 0xD2E1, 0xBA8D, 0xD2E2, 0xBA8E, 0xD2E3, 0xBA8F, + 0xD2E4, 0xC6BA, 0xD2E5, 0xC6BB, 0xD2E6, 0xBA90, 0xD2E7, 0xBA91, 0xD2E8, 0xBA92, 0xD2E9, 0xBA93, 0xD2EA, 0xBA94, 0xD2EB, 0xBA95, + 0xD2EC, 0xBA96, 0xD2ED, 0xBA97, 0xD2EE, 0xBA98, 0xD2EF, 0xBA99, 0xD2F0, 0xC6BC, 0xD2F1, 0xC6BD, 0xD2F2, 0xBA9A, 0xD2F3, 0xBA9B, + 0xD2F4, 0xC6BE, 0xD2F5, 0xBA9C, 0xD2F6, 0xBA9D, 0xD2F7, 0xBA9E, 0xD2F8, 0xC6BF, 0xD2F9, 0xBA9F, 0xD2FA, 0xBAA0, 0xD2FB, 0xBB41, + 0xD2FC, 0xBB42, 0xD2FD, 0xBB43, 0xD2FE, 0xBB44, 0xD2FF, 0xBB45, 0xD300, 0xC6C0, 0xD301, 0xC6C1, 0xD302, 0xBB46, 0xD303, 0xC6C2, + 0xD304, 0xBB47, 0xD305, 0xC6C3, 0xD306, 0xBB48, 0xD307, 0xBB49, 0xD308, 0xBB4A, 0xD309, 0xBB4B, 0xD30A, 0xBB4C, 0xD30B, 0xBB4D, + 0xD30C, 0xC6C4, 0xD30D, 0xC6C5, 0xD30E, 0xC6C6, 0xD30F, 0xBB4E, 0xD310, 0xC6C7, 0xD311, 0xBB4F, 0xD312, 0xBB50, 0xD313, 0xBB51, + 0xD314, 0xC6C8, 0xD315, 0xBB52, 0xD316, 0xC6C9, 0xD317, 0xBB53, 0xD318, 0xBB54, 0xD319, 0xBB55, 0xD31A, 0xBB56, 0xD31B, 0xBB57, + 0xD31C, 0xC6CA, 0xD31D, 0xC6CB, 0xD31E, 0xBB58, 0xD31F, 0xC6CC, 0xD320, 0xC6CD, 0xD321, 0xC6CE, 0xD322, 0xBB59, 0xD323, 0xBB5A, + 0xD324, 0xBB61, 0xD325, 0xC6CF, 0xD326, 0xBB62, 0xD327, 0xBB63, 0xD328, 0xC6D0, 0xD329, 0xC6D1, 0xD32A, 0xBB64, 0xD32B, 0xBB65, + 0xD32C, 0xC6D2, 0xD32D, 0xBB66, 0xD32E, 0xBB67, 0xD32F, 0xBB68, 0xD330, 0xC6D3, 0xD331, 0xBB69, 0xD332, 0xBB6A, 0xD333, 0xBB6B, + 0xD334, 0xBB6C, 0xD335, 0xBB6D, 0xD336, 0xBB6E, 0xD337, 0xBB6F, 0xD338, 0xC6D4, 0xD339, 0xC6D5, 0xD33A, 0xBB70, 0xD33B, 0xC6D6, + 0xD33C, 0xC6D7, 0xD33D, 0xC6D8, 0xD33E, 0xBB71, 0xD33F, 0xBB72, 0xD340, 0xBB73, 0xD341, 0xBB74, 0xD342, 0xBB75, 0xD343, 0xBB76, + 0xD344, 0xC6D9, 0xD345, 0xC6DA, 0xD346, 0xBB77, 0xD347, 0xBB78, 0xD348, 0xBB79, 0xD349, 0xBB7A, 0xD34A, 0xBB81, 0xD34B, 0xBB82, + 0xD34C, 0xBB83, 0xD34D, 0xBB84, 0xD34E, 0xBB85, 0xD34F, 0xBB86, 0xD350, 0xBB87, 0xD351, 0xBB88, 0xD352, 0xBB89, 0xD353, 0xBB8A, + 0xD354, 0xBB8B, 0xD355, 0xBB8C, 0xD356, 0xBB8D, 0xD357, 0xBB8E, 0xD358, 0xBB8F, 0xD359, 0xBB90, 0xD35A, 0xBB91, 0xD35B, 0xBB92, + 0xD35C, 0xBB93, 0xD35D, 0xBB94, 0xD35E, 0xBB95, 0xD35F, 0xBB96, 0xD360, 0xBB97, 0xD361, 0xBB98, 0xD362, 0xBB99, 0xD363, 0xBB9A, + 0xD364, 0xBB9B, 0xD365, 0xBB9C, 0xD366, 0xBB9D, 0xD367, 0xBB9E, 0xD368, 0xBB9F, 0xD369, 0xBBA0, 0xD36A, 0xBC41, 0xD36B, 0xBC42, + 0xD36C, 0xBC43, 0xD36D, 0xBC44, 0xD36E, 0xBC45, 0xD36F, 0xBC46, 0xD370, 0xBC47, 0xD371, 0xBC48, 0xD372, 0xBC49, 0xD373, 0xBC4A, + 0xD374, 0xBC4B, 0xD375, 0xBC4C, 0xD376, 0xBC4D, 0xD377, 0xBC4E, 0xD378, 0xBC4F, 0xD379, 0xBC50, 0xD37A, 0xBC51, 0xD37B, 0xBC52, + 0xD37C, 0xC6DB, 0xD37D, 0xC6DC, 0xD37E, 0xBC53, 0xD37F, 0xBC54, 0xD380, 0xC6DD, 0xD381, 0xBC55, 0xD382, 0xBC56, 0xD383, 0xBC57, + 0xD384, 0xC6DE, 0xD385, 0xBC58, 0xD386, 0xBC59, 0xD387, 0xBC5A, 0xD388, 0xBC61, 0xD389, 0xBC62, 0xD38A, 0xBC63, 0xD38B, 0xBC64, + 0xD38C, 0xC6DF, 0xD38D, 0xC6E0, 0xD38E, 0xBC65, 0xD38F, 0xC6E1, 0xD390, 0xC6E2, 0xD391, 0xC6E3, 0xD392, 0xBC66, 0xD393, 0xBC67, + 0xD394, 0xBC68, 0xD395, 0xBC69, 0xD396, 0xBC6A, 0xD397, 0xBC6B, 0xD398, 0xC6E4, 0xD399, 0xC6E5, 0xD39A, 0xBC6C, 0xD39B, 0xBC6D, + 0xD39C, 0xC6E6, 0xD39D, 0xBC6E, 0xD39E, 0xBC6F, 0xD39F, 0xBC70, 0xD3A0, 0xC6E7, 0xD3A1, 0xBC71, 0xD3A2, 0xBC72, 0xD3A3, 0xBC73, + 0xD3A4, 0xBC74, 0xD3A5, 0xBC75, 0xD3A6, 0xBC76, 0xD3A7, 0xBC77, 0xD3A8, 0xC6E8, 0xD3A9, 0xC6E9, 0xD3AA, 0xBC78, 0xD3AB, 0xC6EA, + 0xD3AC, 0xBC79, 0xD3AD, 0xC6EB, 0xD3AE, 0xBC7A, 0xD3AF, 0xBC81, 0xD3B0, 0xBC82, 0xD3B1, 0xBC83, 0xD3B2, 0xBC84, 0xD3B3, 0xBC85, + 0xD3B4, 0xC6EC, 0xD3B5, 0xBC86, 0xD3B6, 0xBC87, 0xD3B7, 0xBC88, 0xD3B8, 0xC6ED, 0xD3B9, 0xBC89, 0xD3BA, 0xBC8A, 0xD3BB, 0xBC8B, + 0xD3BC, 0xC6EE, 0xD3BD, 0xBC8C, 0xD3BE, 0xBC8D, 0xD3BF, 0xBC8E, 0xD3C0, 0xBC8F, 0xD3C1, 0xBC90, 0xD3C2, 0xBC91, 0xD3C3, 0xBC92, + 0xD3C4, 0xC6EF, 0xD3C5, 0xC6F0, 0xD3C6, 0xBC93, 0xD3C7, 0xBC94, 0xD3C8, 0xC6F1, 0xD3C9, 0xC6F2, 0xD3CA, 0xBC95, 0xD3CB, 0xBC96, + 0xD3CC, 0xBC97, 0xD3CD, 0xBC98, 0xD3CE, 0xBC99, 0xD3CF, 0xBC9A, 0xD3D0, 0xC6F3, 0xD3D1, 0xBC9B, 0xD3D2, 0xBC9C, 0xD3D3, 0xBC9D, + 0xD3D4, 0xBC9E, 0xD3D5, 0xBC9F, 0xD3D6, 0xBCA0, 0xD3D7, 0xBD41, 0xD3D8, 0xC6F4, 0xD3D9, 0xBD42, 0xD3DA, 0xBD43, 0xD3DB, 0xBD44, + 0xD3DC, 0xBD45, 0xD3DD, 0xBD46, 0xD3DE, 0xBD47, 0xD3DF, 0xBD48, 0xD3E0, 0xBD49, 0xD3E1, 0xC6F5, 0xD3E2, 0xBD4A, 0xD3E3, 0xC6F6, + 0xD3E4, 0xBD4B, 0xD3E5, 0xBD4C, 0xD3E6, 0xBD4D, 0xD3E7, 0xBD4E, 0xD3E8, 0xBD4F, 0xD3E9, 0xBD50, 0xD3EA, 0xBD51, 0xD3EB, 0xBD52, + 0xD3EC, 0xC6F7, 0xD3ED, 0xC6F8, 0xD3EE, 0xBD53, 0xD3EF, 0xBD54, 0xD3F0, 0xC6F9, 0xD3F1, 0xBD55, 0xD3F2, 0xBD56, 0xD3F3, 0xBD57, + 0xD3F4, 0xC6FA, 0xD3F5, 0xBD58, 0xD3F6, 0xBD59, 0xD3F7, 0xBD5A, 0xD3F8, 0xBD61, 0xD3F9, 0xBD62, 0xD3FA, 0xBD63, 0xD3FB, 0xBD64, + 0xD3FC, 0xC6FB, 0xD3FD, 0xC6FC, 0xD3FE, 0xBD65, 0xD3FF, 0xC6FD, 0xD400, 0xBD66, 0xD401, 0xC6FE, 0xD402, 0xBD67, 0xD403, 0xBD68, + 0xD404, 0xBD69, 0xD405, 0xBD6A, 0xD406, 0xBD6B, 0xD407, 0xBD6C, 0xD408, 0xC7A1, 0xD409, 0xBD6D, 0xD40A, 0xBD6E, 0xD40B, 0xBD6F, + 0xD40C, 0xBD70, 0xD40D, 0xBD71, 0xD40E, 0xBD72, 0xD40F, 0xBD73, 0xD410, 0xBD74, 0xD411, 0xBD75, 0xD412, 0xBD76, 0xD413, 0xBD77, + 0xD414, 0xBD78, 0xD415, 0xBD79, 0xD416, 0xBD7A, 0xD417, 0xBD81, 0xD418, 0xBD82, 0xD419, 0xBD83, 0xD41A, 0xBD84, 0xD41B, 0xBD85, + 0xD41C, 0xBD86, 0xD41D, 0xC7A2, 0xD41E, 0xBD87, 0xD41F, 0xBD88, 0xD420, 0xBD89, 0xD421, 0xBD8A, 0xD422, 0xBD8B, 0xD423, 0xBD8C, + 0xD424, 0xBD8D, 0xD425, 0xBD8E, 0xD426, 0xBD8F, 0xD427, 0xBD90, 0xD428, 0xBD91, 0xD429, 0xBD92, 0xD42A, 0xBD93, 0xD42B, 0xBD94, + 0xD42C, 0xBD95, 0xD42D, 0xBD96, 0xD42E, 0xBD97, 0xD42F, 0xBD98, 0xD430, 0xBD99, 0xD431, 0xBD9A, 0xD432, 0xBD9B, 0xD433, 0xBD9C, + 0xD434, 0xBD9D, 0xD435, 0xBD9E, 0xD436, 0xBD9F, 0xD437, 0xBDA0, 0xD438, 0xBE41, 0xD439, 0xBE42, 0xD43A, 0xBE43, 0xD43B, 0xBE44, + 0xD43C, 0xBE45, 0xD43D, 0xBE46, 0xD43E, 0xBE47, 0xD43F, 0xBE48, 0xD440, 0xC7A3, 0xD441, 0xBE49, 0xD442, 0xBE4A, 0xD443, 0xBE4B, + 0xD444, 0xC7A4, 0xD445, 0xBE4C, 0xD446, 0xBE4D, 0xD447, 0xBE4E, 0xD448, 0xBE4F, 0xD449, 0xBE50, 0xD44A, 0xBE51, 0xD44B, 0xBE52, + 0xD44C, 0xBE53, 0xD44D, 0xBE54, 0xD44E, 0xBE55, 0xD44F, 0xBE56, 0xD450, 0xBE57, 0xD451, 0xBE58, 0xD452, 0xBE59, 0xD453, 0xBE5A, + 0xD454, 0xBE61, 0xD455, 0xBE62, 0xD456, 0xBE63, 0xD457, 0xBE64, 0xD458, 0xBE65, 0xD459, 0xBE66, 0xD45A, 0xBE67, 0xD45B, 0xBE68, + 0xD45C, 0xC7A5, 0xD45D, 0xBE69, 0xD45E, 0xBE6A, 0xD45F, 0xBE6B, 0xD460, 0xC7A6, 0xD461, 0xBE6C, 0xD462, 0xBE6D, 0xD463, 0xBE6E, + 0xD464, 0xC7A7, 0xD465, 0xBE6F, 0xD466, 0xBE70, 0xD467, 0xBE71, 0xD468, 0xBE72, 0xD469, 0xBE73, 0xD46A, 0xBE74, 0xD46B, 0xBE75, + 0xD46C, 0xBE76, 0xD46D, 0xC7A8, 0xD46E, 0xBE77, 0xD46F, 0xC7A9, 0xD470, 0xBE78, 0xD471, 0xBE79, 0xD472, 0xBE7A, 0xD473, 0xBE81, + 0xD474, 0xBE82, 0xD475, 0xBE83, 0xD476, 0xBE84, 0xD477, 0xBE85, 0xD478, 0xC7AA, 0xD479, 0xC7AB, 0xD47A, 0xBE86, 0xD47B, 0xBE87, + 0xD47C, 0xC7AC, 0xD47D, 0xBE88, 0xD47E, 0xBE89, 0xD47F, 0xC7AD, 0xD480, 0xC7AE, 0xD481, 0xBE8A, 0xD482, 0xC7AF, 0xD483, 0xBE8B, + 0xD484, 0xBE8C, 0xD485, 0xBE8D, 0xD486, 0xBE8E, 0xD487, 0xBE8F, 0xD488, 0xC7B0, 0xD489, 0xC7B1, 0xD48A, 0xBE90, 0xD48B, 0xC7B2, + 0xD48C, 0xBE91, 0xD48D, 0xC7B3, 0xD48E, 0xBE92, 0xD48F, 0xBE93, 0xD490, 0xBE94, 0xD491, 0xBE95, 0xD492, 0xBE96, 0xD493, 0xBE97, + 0xD494, 0xC7B4, 0xD495, 0xBE98, 0xD496, 0xBE99, 0xD497, 0xBE9A, 0xD498, 0xBE9B, 0xD499, 0xBE9C, 0xD49A, 0xBE9D, 0xD49B, 0xBE9E, + 0xD49C, 0xBE9F, 0xD49D, 0xBEA0, 0xD49E, 0xBF41, 0xD49F, 0xBF42, 0xD4A0, 0xBF43, 0xD4A1, 0xBF44, 0xD4A2, 0xBF45, 0xD4A3, 0xBF46, + 0xD4A4, 0xBF47, 0xD4A5, 0xBF48, 0xD4A6, 0xBF49, 0xD4A7, 0xBF4A, 0xD4A8, 0xBF4B, 0xD4A9, 0xC7B5, 0xD4AA, 0xBF4C, 0xD4AB, 0xBF4D, + 0xD4AC, 0xBF4E, 0xD4AD, 0xBF4F, 0xD4AE, 0xBF50, 0xD4AF, 0xBF51, 0xD4B0, 0xBF52, 0xD4B1, 0xBF53, 0xD4B2, 0xBF54, 0xD4B3, 0xBF55, + 0xD4B4, 0xBF56, 0xD4B5, 0xBF57, 0xD4B6, 0xBF58, 0xD4B7, 0xBF59, 0xD4B8, 0xBF5A, 0xD4B9, 0xBF61, 0xD4BA, 0xBF62, 0xD4BB, 0xBF63, + 0xD4BC, 0xBF64, 0xD4BD, 0xBF65, 0xD4BE, 0xBF66, 0xD4BF, 0xBF67, 0xD4C0, 0xBF68, 0xD4C1, 0xBF69, 0xD4C2, 0xBF6A, 0xD4C3, 0xBF6B, + 0xD4C4, 0xBF6C, 0xD4C5, 0xBF6D, 0xD4C6, 0xBF6E, 0xD4C7, 0xBF6F, 0xD4C8, 0xBF70, 0xD4C9, 0xBF71, 0xD4CA, 0xBF72, 0xD4CB, 0xBF73, + 0xD4CC, 0xC7B6, 0xD4CD, 0xBF74, 0xD4CE, 0xBF75, 0xD4CF, 0xBF76, 0xD4D0, 0xC7B7, 0xD4D1, 0xBF77, 0xD4D2, 0xBF78, 0xD4D3, 0xBF79, + 0xD4D4, 0xC7B8, 0xD4D5, 0xBF7A, 0xD4D6, 0xBF81, 0xD4D7, 0xBF82, 0xD4D8, 0xBF83, 0xD4D9, 0xBF84, 0xD4DA, 0xBF85, 0xD4DB, 0xBF86, + 0xD4DC, 0xC7B9, 0xD4DD, 0xBF87, 0xD4DE, 0xBF88, 0xD4DF, 0xC7BA, 0xD4E0, 0xBF89, 0xD4E1, 0xBF8A, 0xD4E2, 0xBF8B, 0xD4E3, 0xBF8C, + 0xD4E4, 0xBF8D, 0xD4E5, 0xBF8E, 0xD4E6, 0xBF8F, 0xD4E7, 0xBF90, 0xD4E8, 0xC7BB, 0xD4E9, 0xBF91, 0xD4EA, 0xBF92, 0xD4EB, 0xBF93, + 0xD4EC, 0xC7BC, 0xD4ED, 0xBF94, 0xD4EE, 0xBF95, 0xD4EF, 0xBF96, 0xD4F0, 0xC7BD, 0xD4F1, 0xBF97, 0xD4F2, 0xBF98, 0xD4F3, 0xBF99, + 0xD4F4, 0xBF9A, 0xD4F5, 0xBF9B, 0xD4F6, 0xBF9C, 0xD4F7, 0xBF9D, 0xD4F8, 0xC7BE, 0xD4F9, 0xBF9E, 0xD4FA, 0xBF9F, 0xD4FB, 0xC7BF, + 0xD4FC, 0xBFA0, 0xD4FD, 0xC7C0, 0xD4FE, 0xC041, 0xD4FF, 0xC042, 0xD500, 0xC043, 0xD501, 0xC044, 0xD502, 0xC045, 0xD503, 0xC046, + 0xD504, 0xC7C1, 0xD505, 0xC047, 0xD506, 0xC048, 0xD507, 0xC049, 0xD508, 0xC7C2, 0xD509, 0xC04A, 0xD50A, 0xC04B, 0xD50B, 0xC04C, + 0xD50C, 0xC7C3, 0xD50D, 0xC04D, 0xD50E, 0xC04E, 0xD50F, 0xC04F, 0xD510, 0xC050, 0xD511, 0xC051, 0xD512, 0xC052, 0xD513, 0xC053, + 0xD514, 0xC7C4, 0xD515, 0xC7C5, 0xD516, 0xC054, 0xD517, 0xC7C6, 0xD518, 0xC055, 0xD519, 0xC056, 0xD51A, 0xC057, 0xD51B, 0xC058, + 0xD51C, 0xC059, 0xD51D, 0xC05A, 0xD51E, 0xC061, 0xD51F, 0xC062, 0xD520, 0xC063, 0xD521, 0xC064, 0xD522, 0xC065, 0xD523, 0xC066, + 0xD524, 0xC067, 0xD525, 0xC068, 0xD526, 0xC069, 0xD527, 0xC06A, 0xD528, 0xC06B, 0xD529, 0xC06C, 0xD52A, 0xC06D, 0xD52B, 0xC06E, + 0xD52C, 0xC06F, 0xD52D, 0xC070, 0xD52E, 0xC071, 0xD52F, 0xC072, 0xD530, 0xC073, 0xD531, 0xC074, 0xD532, 0xC075, 0xD533, 0xC076, + 0xD534, 0xC077, 0xD535, 0xC078, 0xD536, 0xC079, 0xD537, 0xC07A, 0xD538, 0xC081, 0xD539, 0xC082, 0xD53A, 0xC083, 0xD53B, 0xC084, + 0xD53C, 0xC7C7, 0xD53D, 0xC7C8, 0xD53E, 0xC085, 0xD53F, 0xC086, 0xD540, 0xC7C9, 0xD541, 0xC087, 0xD542, 0xC088, 0xD543, 0xC089, + 0xD544, 0xC7CA, 0xD545, 0xC08A, 0xD546, 0xC08B, 0xD547, 0xC08C, 0xD548, 0xC08D, 0xD549, 0xC08E, 0xD54A, 0xC08F, 0xD54B, 0xC090, + 0xD54C, 0xC7CB, 0xD54D, 0xC7CC, 0xD54E, 0xC091, 0xD54F, 0xC7CD, 0xD550, 0xC092, 0xD551, 0xC7CE, 0xD552, 0xC093, 0xD553, 0xC094, + 0xD554, 0xC095, 0xD555, 0xC096, 0xD556, 0xC097, 0xD557, 0xC098, 0xD558, 0xC7CF, 0xD559, 0xC7D0, 0xD55A, 0xC099, 0xD55B, 0xC09A, + 0xD55C, 0xC7D1, 0xD55D, 0xC09B, 0xD55E, 0xC09C, 0xD55F, 0xC09D, 0xD560, 0xC7D2, 0xD561, 0xC09E, 0xD562, 0xC09F, 0xD563, 0xC0A0, + 0xD564, 0xC141, 0xD565, 0xC7D3, 0xD566, 0xC142, 0xD567, 0xC143, 0xD568, 0xC7D4, 0xD569, 0xC7D5, 0xD56A, 0xC144, 0xD56B, 0xC7D6, + 0xD56C, 0xC145, 0xD56D, 0xC7D7, 0xD56E, 0xC146, 0xD56F, 0xC147, 0xD570, 0xC148, 0xD571, 0xC149, 0xD572, 0xC14A, 0xD573, 0xC14B, + 0xD574, 0xC7D8, 0xD575, 0xC7D9, 0xD576, 0xC14C, 0xD577, 0xC14D, 0xD578, 0xC7DA, 0xD579, 0xC14E, 0xD57A, 0xC14F, 0xD57B, 0xC150, + 0xD57C, 0xC7DB, 0xD57D, 0xC151, 0xD57E, 0xC152, 0xD57F, 0xC153, 0xD580, 0xC154, 0xD581, 0xC155, 0xD582, 0xC156, 0xD583, 0xC157, + 0xD584, 0xC7DC, 0xD585, 0xC7DD, 0xD586, 0xC158, 0xD587, 0xC7DE, 0xD588, 0xC7DF, 0xD589, 0xC7E0, 0xD58A, 0xC159, 0xD58B, 0xC15A, + 0xD58C, 0xC161, 0xD58D, 0xC162, 0xD58E, 0xC163, 0xD58F, 0xC164, 0xD590, 0xC7E1, 0xD591, 0xC165, 0xD592, 0xC166, 0xD593, 0xC167, + 0xD594, 0xC168, 0xD595, 0xC169, 0xD596, 0xC16A, 0xD597, 0xC16B, 0xD598, 0xC16C, 0xD599, 0xC16D, 0xD59A, 0xC16E, 0xD59B, 0xC16F, + 0xD59C, 0xC170, 0xD59D, 0xC171, 0xD59E, 0xC172, 0xD59F, 0xC173, 0xD5A0, 0xC174, 0xD5A1, 0xC175, 0xD5A2, 0xC176, 0xD5A3, 0xC177, + 0xD5A4, 0xC178, 0xD5A5, 0xC7E2, 0xD5A6, 0xC179, 0xD5A7, 0xC17A, 0xD5A8, 0xC181, 0xD5A9, 0xC182, 0xD5AA, 0xC183, 0xD5AB, 0xC184, + 0xD5AC, 0xC185, 0xD5AD, 0xC186, 0xD5AE, 0xC187, 0xD5AF, 0xC188, 0xD5B0, 0xC189, 0xD5B1, 0xC18A, 0xD5B2, 0xC18B, 0xD5B3, 0xC18C, + 0xD5B4, 0xC18D, 0xD5B5, 0xC18E, 0xD5B6, 0xC18F, 0xD5B7, 0xC190, 0xD5B8, 0xC191, 0xD5B9, 0xC192, 0xD5BA, 0xC193, 0xD5BB, 0xC194, + 0xD5BC, 0xC195, 0xD5BD, 0xC196, 0xD5BE, 0xC197, 0xD5BF, 0xC198, 0xD5C0, 0xC199, 0xD5C1, 0xC19A, 0xD5C2, 0xC19B, 0xD5C3, 0xC19C, + 0xD5C4, 0xC19D, 0xD5C5, 0xC19E, 0xD5C6, 0xC19F, 0xD5C7, 0xC1A0, 0xD5C8, 0xC7E3, 0xD5C9, 0xC7E4, 0xD5CA, 0xC241, 0xD5CB, 0xC242, + 0xD5CC, 0xC7E5, 0xD5CD, 0xC243, 0xD5CE, 0xC244, 0xD5CF, 0xC245, 0xD5D0, 0xC7E6, 0xD5D1, 0xC246, 0xD5D2, 0xC7E7, 0xD5D3, 0xC247, + 0xD5D4, 0xC248, 0xD5D5, 0xC249, 0xD5D6, 0xC24A, 0xD5D7, 0xC24B, 0xD5D8, 0xC7E8, 0xD5D9, 0xC7E9, 0xD5DA, 0xC24C, 0xD5DB, 0xC7EA, + 0xD5DC, 0xC24D, 0xD5DD, 0xC7EB, 0xD5DE, 0xC24E, 0xD5DF, 0xC24F, 0xD5E0, 0xC250, 0xD5E1, 0xC251, 0xD5E2, 0xC252, 0xD5E3, 0xC253, + 0xD5E4, 0xC7EC, 0xD5E5, 0xC7ED, 0xD5E6, 0xC254, 0xD5E7, 0xC255, 0xD5E8, 0xC7EE, 0xD5E9, 0xC256, 0xD5EA, 0xC257, 0xD5EB, 0xC258, + 0xD5EC, 0xC7EF, 0xD5ED, 0xC259, 0xD5EE, 0xC25A, 0xD5EF, 0xC261, 0xD5F0, 0xC262, 0xD5F1, 0xC263, 0xD5F2, 0xC264, 0xD5F3, 0xC265, + 0xD5F4, 0xC7F0, 0xD5F5, 0xC7F1, 0xD5F6, 0xC266, 0xD5F7, 0xC7F2, 0xD5F8, 0xC267, 0xD5F9, 0xC7F3, 0xD5FA, 0xC268, 0xD5FB, 0xC269, + 0xD5FC, 0xC26A, 0xD5FD, 0xC26B, 0xD5FE, 0xC26C, 0xD5FF, 0xC26D, 0xD600, 0xC7F4, 0xD601, 0xC7F5, 0xD602, 0xC26E, 0xD603, 0xC26F, + 0xD604, 0xC7F6, 0xD605, 0xC270, 0xD606, 0xC271, 0xD607, 0xC272, 0xD608, 0xC7F7, 0xD609, 0xC273, 0xD60A, 0xC274, 0xD60B, 0xC275, + 0xD60C, 0xC276, 0xD60D, 0xC277, 0xD60E, 0xC278, 0xD60F, 0xC279, 0xD610, 0xC7F8, 0xD611, 0xC7F9, 0xD612, 0xC27A, 0xD613, 0xC7FA, + 0xD614, 0xC7FB, 0xD615, 0xC7FC, 0xD616, 0xC281, 0xD617, 0xC282, 0xD618, 0xC283, 0xD619, 0xC284, 0xD61A, 0xC285, 0xD61B, 0xC286, + 0xD61C, 0xC7FD, 0xD61D, 0xC287, 0xD61E, 0xC288, 0xD61F, 0xC289, 0xD620, 0xC7FE, 0xD621, 0xC28A, 0xD622, 0xC28B, 0xD623, 0xC28C, + 0xD624, 0xC8A1, 0xD625, 0xC28D, 0xD626, 0xC28E, 0xD627, 0xC28F, 0xD628, 0xC290, 0xD629, 0xC291, 0xD62A, 0xC292, 0xD62B, 0xC293, + 0xD62C, 0xC294, 0xD62D, 0xC8A2, 0xD62E, 0xC295, 0xD62F, 0xC296, 0xD630, 0xC297, 0xD631, 0xC298, 0xD632, 0xC299, 0xD633, 0xC29A, + 0xD634, 0xC29B, 0xD635, 0xC29C, 0xD636, 0xC29D, 0xD637, 0xC29E, 0xD638, 0xC8A3, 0xD639, 0xC8A4, 0xD63A, 0xC29F, 0xD63B, 0xC2A0, + 0xD63C, 0xC8A5, 0xD63D, 0xC341, 0xD63E, 0xC342, 0xD63F, 0xC343, 0xD640, 0xC8A6, 0xD641, 0xC344, 0xD642, 0xC345, 0xD643, 0xC346, + 0xD644, 0xC347, 0xD645, 0xC8A7, 0xD646, 0xC348, 0xD647, 0xC349, 0xD648, 0xC8A8, 0xD649, 0xC8A9, 0xD64A, 0xC34A, 0xD64B, 0xC8AA, + 0xD64C, 0xC34B, 0xD64D, 0xC8AB, 0xD64E, 0xC34C, 0xD64F, 0xC34D, 0xD650, 0xC34E, 0xD651, 0xC8AC, 0xD652, 0xC34F, 0xD653, 0xC350, + 0xD654, 0xC8AD, 0xD655, 0xC8AE, 0xD656, 0xC351, 0xD657, 0xC352, 0xD658, 0xC8AF, 0xD659, 0xC353, 0xD65A, 0xC354, 0xD65B, 0xC355, + 0xD65C, 0xC8B0, 0xD65D, 0xC356, 0xD65E, 0xC357, 0xD65F, 0xC358, 0xD660, 0xC359, 0xD661, 0xC35A, 0xD662, 0xC361, 0xD663, 0xC362, + 0xD664, 0xC363, 0xD665, 0xC364, 0xD666, 0xC365, 0xD667, 0xC8B1, 0xD668, 0xC366, 0xD669, 0xC8B2, 0xD66A, 0xC367, 0xD66B, 0xC368, + 0xD66C, 0xC369, 0xD66D, 0xC36A, 0xD66E, 0xC36B, 0xD66F, 0xC36C, 0xD670, 0xC8B3, 0xD671, 0xC8B4, 0xD672, 0xC36D, 0xD673, 0xC36E, + 0xD674, 0xC8B5, 0xD675, 0xC36F, 0xD676, 0xC370, 0xD677, 0xC371, 0xD678, 0xC372, 0xD679, 0xC373, 0xD67A, 0xC374, 0xD67B, 0xC375, + 0xD67C, 0xC376, 0xD67D, 0xC377, 0xD67E, 0xC378, 0xD67F, 0xC379, 0xD680, 0xC37A, 0xD681, 0xC381, 0xD682, 0xC382, 0xD683, 0xC8B6, + 0xD684, 0xC383, 0xD685, 0xC8B7, 0xD686, 0xC384, 0xD687, 0xC385, 0xD688, 0xC386, 0xD689, 0xC387, 0xD68A, 0xC388, 0xD68B, 0xC389, + 0xD68C, 0xC8B8, 0xD68D, 0xC8B9, 0xD68E, 0xC38A, 0xD68F, 0xC38B, 0xD690, 0xC8BA, 0xD691, 0xC38C, 0xD692, 0xC38D, 0xD693, 0xC38E, + 0xD694, 0xC8BB, 0xD695, 0xC38F, 0xD696, 0xC390, 0xD697, 0xC391, 0xD698, 0xC392, 0xD699, 0xC393, 0xD69A, 0xC394, 0xD69B, 0xC395, + 0xD69C, 0xC396, 0xD69D, 0xC8BC, 0xD69E, 0xC397, 0xD69F, 0xC8BD, 0xD6A0, 0xC398, 0xD6A1, 0xC8BE, 0xD6A2, 0xC399, 0xD6A3, 0xC39A, + 0xD6A4, 0xC39B, 0xD6A5, 0xC39C, 0xD6A6, 0xC39D, 0xD6A7, 0xC39E, 0xD6A8, 0xC8BF, 0xD6A9, 0xC39F, 0xD6AA, 0xC3A0, 0xD6AB, 0xC441, + 0xD6AC, 0xC8C0, 0xD6AD, 0xC442, 0xD6AE, 0xC443, 0xD6AF, 0xC444, 0xD6B0, 0xC8C1, 0xD6B1, 0xC445, 0xD6B2, 0xC446, 0xD6B3, 0xC447, + 0xD6B4, 0xC448, 0xD6B5, 0xC449, 0xD6B6, 0xC44A, 0xD6B7, 0xC44B, 0xD6B8, 0xC44C, 0xD6B9, 0xC8C2, 0xD6BA, 0xC44D, 0xD6BB, 0xC8C3, + 0xD6BC, 0xC44E, 0xD6BD, 0xC44F, 0xD6BE, 0xC450, 0xD6BF, 0xC451, 0xD6C0, 0xC452, 0xD6C1, 0xC453, 0xD6C2, 0xC454, 0xD6C3, 0xC455, + 0xD6C4, 0xC8C4, 0xD6C5, 0xC8C5, 0xD6C6, 0xC456, 0xD6C7, 0xC457, 0xD6C8, 0xC8C6, 0xD6C9, 0xC458, 0xD6CA, 0xC459, 0xD6CB, 0xC45A, + 0xD6CC, 0xC8C7, 0xD6CD, 0xC461, 0xD6CE, 0xC462, 0xD6CF, 0xC463, 0xD6D0, 0xC464, 0xD6D1, 0xC8C8, 0xD6D2, 0xC465, 0xD6D3, 0xC466, + 0xD6D4, 0xC8C9, 0xD6D5, 0xC467, 0xD6D6, 0xC468, 0xD6D7, 0xC8CA, 0xD6D8, 0xC469, 0xD6D9, 0xC8CB, 0xD6DA, 0xC46A, 0xD6DB, 0xC46B, + 0xD6DC, 0xC46C, 0xD6DD, 0xC46D, 0xD6DE, 0xC46E, 0xD6DF, 0xC46F, 0xD6E0, 0xC8CC, 0xD6E1, 0xC470, 0xD6E2, 0xC471, 0xD6E3, 0xC472, + 0xD6E4, 0xC8CD, 0xD6E5, 0xC473, 0xD6E6, 0xC474, 0xD6E7, 0xC475, 0xD6E8, 0xC8CE, 0xD6E9, 0xC476, 0xD6EA, 0xC477, 0xD6EB, 0xC478, + 0xD6EC, 0xC479, 0xD6ED, 0xC47A, 0xD6EE, 0xC481, 0xD6EF, 0xC482, 0xD6F0, 0xC8CF, 0xD6F1, 0xC483, 0xD6F2, 0xC484, 0xD6F3, 0xC485, + 0xD6F4, 0xC486, 0xD6F5, 0xC8D0, 0xD6F6, 0xC487, 0xD6F7, 0xC488, 0xD6F8, 0xC489, 0xD6F9, 0xC48A, 0xD6FA, 0xC48B, 0xD6FB, 0xC48C, + 0xD6FC, 0xC8D1, 0xD6FD, 0xC8D2, 0xD6FE, 0xC48D, 0xD6FF, 0xC48E, 0xD700, 0xC8D3, 0xD701, 0xC48F, 0xD702, 0xC490, 0xD703, 0xC491, + 0xD704, 0xC8D4, 0xD705, 0xC492, 0xD706, 0xC493, 0xD707, 0xC494, 0xD708, 0xC495, 0xD709, 0xC496, 0xD70A, 0xC497, 0xD70B, 0xC498, + 0xD70C, 0xC499, 0xD70D, 0xC49A, 0xD70E, 0xC49B, 0xD70F, 0xC49C, 0xD710, 0xC49D, 0xD711, 0xC8D5, 0xD712, 0xC49E, 0xD713, 0xC49F, + 0xD714, 0xC4A0, 0xD715, 0xC541, 0xD716, 0xC542, 0xD717, 0xC543, 0xD718, 0xC8D6, 0xD719, 0xC8D7, 0xD71A, 0xC544, 0xD71B, 0xC545, + 0xD71C, 0xC8D8, 0xD71D, 0xC546, 0xD71E, 0xC547, 0xD71F, 0xC548, 0xD720, 0xC8D9, 0xD721, 0xC549, 0xD722, 0xC54A, 0xD723, 0xC54B, + 0xD724, 0xC54C, 0xD725, 0xC54D, 0xD726, 0xC54E, 0xD727, 0xC54F, 0xD728, 0xC8DA, 0xD729, 0xC8DB, 0xD72A, 0xC550, 0xD72B, 0xC8DC, + 0xD72C, 0xC551, 0xD72D, 0xC8DD, 0xD72E, 0xC552, 0xD72F, 0xC553, 0xD730, 0xC554, 0xD731, 0xC555, 0xD732, 0xC556, 0xD733, 0xC557, + 0xD734, 0xC8DE, 0xD735, 0xC8DF, 0xD736, 0xC558, 0xD737, 0xC559, 0xD738, 0xC8E0, 0xD739, 0xC55A, 0xD73A, 0xC561, 0xD73B, 0xC562, + 0xD73C, 0xC8E1, 0xD73D, 0xC563, 0xD73E, 0xC564, 0xD73F, 0xC565, 0xD740, 0xC566, 0xD741, 0xC567, 0xD742, 0xC568, 0xD743, 0xC569, + 0xD744, 0xC8E2, 0xD745, 0xC56A, 0xD746, 0xC56B, 0xD747, 0xC8E3, 0xD748, 0xC56C, 0xD749, 0xC8E4, 0xD74A, 0xC56D, 0xD74B, 0xC56E, + 0xD74C, 0xC56F, 0xD74D, 0xC570, 0xD74E, 0xC571, 0xD74F, 0xC572, 0xD750, 0xC8E5, 0xD751, 0xC8E6, 0xD752, 0xC573, 0xD753, 0xC574, + 0xD754, 0xC8E7, 0xD755, 0xC575, 0xD756, 0xC8E8, 0xD757, 0xC8E9, 0xD758, 0xC8EA, 0xD759, 0xC8EB, 0xD75A, 0xC576, 0xD75B, 0xC577, + 0xD75C, 0xC578, 0xD75D, 0xC579, 0xD75E, 0xC57A, 0xD75F, 0xC581, 0xD760, 0xC8EC, 0xD761, 0xC8ED, 0xD762, 0xC582, 0xD763, 0xC8EE, + 0xD764, 0xC583, 0xD765, 0xC8EF, 0xD766, 0xC584, 0xD767, 0xC585, 0xD768, 0xC586, 0xD769, 0xC8F0, 0xD76A, 0xC587, 0xD76B, 0xC588, + 0xD76C, 0xC8F1, 0xD76D, 0xC589, 0xD76E, 0xC58A, 0xD76F, 0xC58B, 0xD770, 0xC8F2, 0xD771, 0xC58C, 0xD772, 0xC58D, 0xD773, 0xC58E, + 0xD774, 0xC8F3, 0xD775, 0xC58F, 0xD776, 0xC590, 0xD777, 0xC591, 0xD778, 0xC592, 0xD779, 0xC593, 0xD77A, 0xC594, 0xD77B, 0xC595, + 0xD77C, 0xC8F4, 0xD77D, 0xC8F5, 0xD77E, 0xC596, 0xD77F, 0xC597, 0xD780, 0xC598, 0xD781, 0xC8F6, 0xD782, 0xC599, 0xD783, 0xC59A, + 0xD784, 0xC59B, 0xD785, 0xC59C, 0xD786, 0xC59D, 0xD787, 0xC59E, 0xD788, 0xC8F7, 0xD789, 0xC8F8, 0xD78A, 0xC59F, 0xD78B, 0xC5A0, + 0xD78C, 0xC8F9, 0xD78D, 0xC641, 0xD78E, 0xC642, 0xD78F, 0xC643, 0xD790, 0xC8FA, 0xD791, 0xC644, 0xD792, 0xC645, 0xD793, 0xC646, + 0xD794, 0xC647, 0xD795, 0xC648, 0xD796, 0xC649, 0xD797, 0xC64A, 0xD798, 0xC8FB, 0xD799, 0xC8FC, 0xD79A, 0xC64B, 0xD79B, 0xC8FD, + 0xD79C, 0xC64C, 0xD79D, 0xC8FE, 0xD79E, 0xC64D, 0xD79F, 0xC64E, 0xD7A0, 0xC64F, 0xD7A1, 0xC650, 0xD7A2, 0xC651, 0xD7A3, 0xC652, + 0xF900, 0xCBD0, 0xF901, 0xCBD6, 0xF902, 0xCBE7, 0xF903, 0xCDCF, 0xF904, 0xCDE8, 0xF905, 0xCEAD, 0xF906, 0xCFFB, 0xF907, 0xD0A2, + 0xF908, 0xD0B8, 0xF909, 0xD0D0, 0xF90A, 0xD0DD, 0xF90B, 0xD1D4, 0xF90C, 0xD1D5, 0xF90D, 0xD1D8, 0xF90E, 0xD1DB, 0xF90F, 0xD1DC, + 0xF910, 0xD1DD, 0xF911, 0xD1DE, 0xF912, 0xD1DF, 0xF913, 0xD1E0, 0xF914, 0xD1E2, 0xF915, 0xD1E3, 0xF916, 0xD1E4, 0xF917, 0xD1E5, + 0xF918, 0xD1E6, 0xF919, 0xD1E8, 0xF91A, 0xD1E9, 0xF91B, 0xD1EA, 0xF91C, 0xD1EB, 0xF91D, 0xD1ED, 0xF91E, 0xD1EF, 0xF91F, 0xD1F0, + 0xF920, 0xD1F2, 0xF921, 0xD1F6, 0xF922, 0xD1FA, 0xF923, 0xD1FC, 0xF924, 0xD1FD, 0xF925, 0xD1FE, 0xF926, 0xD2A2, 0xF927, 0xD2A3, + 0xF928, 0xD2A7, 0xF929, 0xD2A8, 0xF92A, 0xD2A9, 0xF92B, 0xD2AA, 0xF92C, 0xD2AB, 0xF92D, 0xD2AD, 0xF92E, 0xD2B2, 0xF92F, 0xD2BE, + 0xF930, 0xD2C2, 0xF931, 0xD2C3, 0xF932, 0xD2C4, 0xF933, 0xD2C6, 0xF934, 0xD2C7, 0xF935, 0xD2C8, 0xF936, 0xD2C9, 0xF937, 0xD2CA, + 0xF938, 0xD2CB, 0xF939, 0xD2CD, 0xF93A, 0xD2CE, 0xF93B, 0xD2CF, 0xF93C, 0xD2D0, 0xF93D, 0xD2D1, 0xF93E, 0xD2D2, 0xF93F, 0xD2D3, + 0xF940, 0xD2D4, 0xF941, 0xD2D5, 0xF942, 0xD2D6, 0xF943, 0xD2D7, 0xF944, 0xD2D9, 0xF945, 0xD2DA, 0xF946, 0xD2DE, 0xF947, 0xD2DF, + 0xF948, 0xD2E1, 0xF949, 0xD2E2, 0xF94A, 0xD2E4, 0xF94B, 0xD2E5, 0xF94C, 0xD2E6, 0xF94D, 0xD2E7, 0xF94E, 0xD2E8, 0xF94F, 0xD2E9, + 0xF950, 0xD2EA, 0xF951, 0xD2EB, 0xF952, 0xD2F0, 0xF953, 0xD2F1, 0xF954, 0xD2F2, 0xF955, 0xD2F3, 0xF956, 0xD2F4, 0xF957, 0xD2F5, + 0xF958, 0xD2F7, 0xF959, 0xD2F8, 0xF95A, 0xD4E6, 0xF95B, 0xD4FC, 0xF95C, 0xD5A5, 0xF95D, 0xD5AB, 0xF95E, 0xD5AE, 0xF95F, 0xD6B8, + 0xF960, 0xD6CD, 0xF961, 0xD7CB, 0xF962, 0xD7E4, 0xF963, 0xDBC5, 0xF964, 0xDBE4, 0xF965, 0xDCA5, 0xF966, 0xDDA5, 0xF967, 0xDDD5, + 0xF968, 0xDDF4, 0xF969, 0xDEFC, 0xF96A, 0xDEFE, 0xF96B, 0xDFB3, 0xF96C, 0xDFE1, 0xF96D, 0xDFE8, 0xF96E, 0xE0F1, 0xF96F, 0xE1AD, + 0xF970, 0xE1ED, 0xF971, 0xE3F5, 0xF972, 0xE4A1, 0xF973, 0xE4A9, 0xF974, 0xE5AE, 0xF975, 0xE5B1, 0xF976, 0xE5B2, 0xF977, 0xE5B9, + 0xF978, 0xE5BB, 0xF979, 0xE5BC, 0xF97A, 0xE5C4, 0xF97B, 0xE5CE, 0xF97C, 0xE5D0, 0xF97D, 0xE5D2, 0xF97E, 0xE5D6, 0xF97F, 0xE5FA, + 0xF980, 0xE5FB, 0xF981, 0xE5FC, 0xF982, 0xE5FE, 0xF983, 0xE6A1, 0xF984, 0xE6A4, 0xF985, 0xE6A7, 0xF986, 0xE6AD, 0xF987, 0xE6AF, + 0xF988, 0xE6B0, 0xF989, 0xE6B1, 0xF98A, 0xE6B3, 0xF98B, 0xE6B7, 0xF98C, 0xE6B8, 0xF98D, 0xE6BC, 0xF98E, 0xE6C4, 0xF98F, 0xE6C6, + 0xF990, 0xE6C7, 0xF991, 0xE6CA, 0xF992, 0xE6D2, 0xF993, 0xE6D6, 0xF994, 0xE6D9, 0xF995, 0xE6DC, 0xF996, 0xE6DF, 0xF997, 0xE6E1, + 0xF998, 0xE6E4, 0xF999, 0xE6E5, 0xF99A, 0xE6E6, 0xF99B, 0xE6E8, 0xF99C, 0xE6EA, 0xF99D, 0xE6EB, 0xF99E, 0xE6EC, 0xF99F, 0xE6EF, + 0xF9A0, 0xE6F1, 0xF9A1, 0xE6F2, 0xF9A2, 0xE6F5, 0xF9A3, 0xE6F6, 0xF9A4, 0xE6F7, 0xF9A5, 0xE6F9, 0xF9A6, 0xE7A1, 0xF9A7, 0xE7A6, + 0xF9A8, 0xE7A9, 0xF9A9, 0xE7AA, 0xF9AA, 0xE7AC, 0xF9AB, 0xE7AD, 0xF9AC, 0xE7B0, 0xF9AD, 0xE7BF, 0xF9AE, 0xE7C1, 0xF9AF, 0xE7C6, + 0xF9B0, 0xE7C7, 0xF9B1, 0xE7CB, 0xF9B2, 0xE7CD, 0xF9B3, 0xE7CF, 0xF9B4, 0xE7D0, 0xF9B5, 0xE7D3, 0xF9B6, 0xE7DF, 0xF9B7, 0xE7E4, + 0xF9B8, 0xE7E6, 0xF9B9, 0xE7F7, 0xF9BA, 0xE8E7, 0xF9BB, 0xE8E8, 0xF9BC, 0xE8F0, 0xF9BD, 0xE8F1, 0xF9BE, 0xE8F7, 0xF9BF, 0xE8F9, + 0xF9C0, 0xE8FB, 0xF9C1, 0xE8FE, 0xF9C2, 0xE9A7, 0xF9C3, 0xE9AC, 0xF9C4, 0xE9CC, 0xF9C5, 0xE9F7, 0xF9C6, 0xEAC1, 0xF9C7, 0xEAE5, + 0xF9C8, 0xEAF4, 0xF9C9, 0xEAF7, 0xF9CA, 0xEAFC, 0xF9CB, 0xEAFE, 0xF9CC, 0xEBA4, 0xF9CD, 0xEBA7, 0xF9CE, 0xEBA9, 0xF9CF, 0xEBAA, + 0xF9D0, 0xEBBA, 0xF9D1, 0xEBBB, 0xF9D2, 0xEBBD, 0xF9D3, 0xEBC1, 0xF9D4, 0xEBC2, 0xF9D5, 0xEBC6, 0xF9D6, 0xEBC7, 0xF9D7, 0xEBCC, + 0xF9D8, 0xEBCF, 0xF9D9, 0xEBD0, 0xF9DA, 0xEBD1, 0xF9DB, 0xEBD2, 0xF9DC, 0xEBD8, 0xF9DD, 0xECA6, 0xF9DE, 0xECA7, 0xF9DF, 0xECAA, + 0xF9E0, 0xECAF, 0xF9E1, 0xECB0, 0xF9E2, 0xECB1, 0xF9E3, 0xECB2, 0xF9E4, 0xECB5, 0xF9E5, 0xECB8, 0xF9E6, 0xECBA, 0xF9E7, 0xECC0, + 0xF9E8, 0xECC1, 0xF9E9, 0xECC5, 0xF9EA, 0xECC6, 0xF9EB, 0xECC9, 0xF9EC, 0xECCA, 0xF9ED, 0xECD5, 0xF9EE, 0xECDD, 0xF9EF, 0xECDE, + 0xF9F0, 0xECE1, 0xF9F1, 0xECE4, 0xF9F2, 0xECE7, 0xF9F3, 0xECE8, 0xF9F4, 0xECF7, 0xF9F5, 0xECF8, 0xF9F6, 0xECFA, 0xF9F7, 0xEDA1, + 0xF9F8, 0xEDA2, 0xF9F9, 0xEDA3, 0xF9FA, 0xEDEE, 0xF9FB, 0xEEDB, 0xF9FC, 0xF2BD, 0xF9FD, 0xF2FA, 0xF9FE, 0xF3B1, 0xF9FF, 0xF4A7, + 0xFA00, 0xF4EE, 0xFA01, 0xF6F4, 0xFA02, 0xF6F6, 0xFA03, 0xF7B8, 0xFA04, 0xF7C8, 0xFA05, 0xF7D3, 0xFA06, 0xF8DB, 0xFA07, 0xF8F0, + 0xFA08, 0xFAA1, 0xFA09, 0xFAA2, 0xFA0A, 0xFAE6, 0xFA0B, 0xFCA9, 0xFF01, 0xA3A1, 0xFF02, 0xA3A2, 0xFF03, 0xA3A3, 0xFF04, 0xA3A4, + 0xFF05, 0xA3A5, 0xFF06, 0xA3A6, 0xFF07, 0xA3A7, 0xFF08, 0xA3A8, 0xFF09, 0xA3A9, 0xFF0A, 0xA3AA, 0xFF0B, 0xA3AB, 0xFF0C, 0xA3AC, + 0xFF0D, 0xA3AD, 0xFF0E, 0xA3AE, 0xFF0F, 0xA3AF, 0xFF10, 0xA3B0, 0xFF11, 0xA3B1, 0xFF12, 0xA3B2, 0xFF13, 0xA3B3, 0xFF14, 0xA3B4, + 0xFF15, 0xA3B5, 0xFF16, 0xA3B6, 0xFF17, 0xA3B7, 0xFF18, 0xA3B8, 0xFF19, 0xA3B9, 0xFF1A, 0xA3BA, 0xFF1B, 0xA3BB, 0xFF1C, 0xA3BC, + 0xFF1D, 0xA3BD, 0xFF1E, 0xA3BE, 0xFF1F, 0xA3BF, 0xFF20, 0xA3C0, 0xFF21, 0xA3C1, 0xFF22, 0xA3C2, 0xFF23, 0xA3C3, 0xFF24, 0xA3C4, + 0xFF25, 0xA3C5, 0xFF26, 0xA3C6, 0xFF27, 0xA3C7, 0xFF28, 0xA3C8, 0xFF29, 0xA3C9, 0xFF2A, 0xA3CA, 0xFF2B, 0xA3CB, 0xFF2C, 0xA3CC, + 0xFF2D, 0xA3CD, 0xFF2E, 0xA3CE, 0xFF2F, 0xA3CF, 0xFF30, 0xA3D0, 0xFF31, 0xA3D1, 0xFF32, 0xA3D2, 0xFF33, 0xA3D3, 0xFF34, 0xA3D4, + 0xFF35, 0xA3D5, 0xFF36, 0xA3D6, 0xFF37, 0xA3D7, 0xFF38, 0xA3D8, 0xFF39, 0xA3D9, 0xFF3A, 0xA3DA, 0xFF3B, 0xA3DB, 0xFF3C, 0xA1AC, + 0xFF3D, 0xA3DD, 0xFF3E, 0xA3DE, 0xFF3F, 0xA3DF, 0xFF40, 0xA3E0, 0xFF41, 0xA3E1, 0xFF42, 0xA3E2, 0xFF43, 0xA3E3, 0xFF44, 0xA3E4, + 0xFF45, 0xA3E5, 0xFF46, 0xA3E6, 0xFF47, 0xA3E7, 0xFF48, 0xA3E8, 0xFF49, 0xA3E9, 0xFF4A, 0xA3EA, 0xFF4B, 0xA3EB, 0xFF4C, 0xA3EC, + 0xFF4D, 0xA3ED, 0xFF4E, 0xA3EE, 0xFF4F, 0xA3EF, 0xFF50, 0xA3F0, 0xFF51, 0xA3F1, 0xFF52, 0xA3F2, 0xFF53, 0xA3F3, 0xFF54, 0xA3F4, + 0xFF55, 0xA3F5, 0xFF56, 0xA3F6, 0xFF57, 0xA3F7, 0xFF58, 0xA3F8, 0xFF59, 0xA3F9, 0xFF5A, 0xA3FA, 0xFF5B, 0xA3FB, 0xFF5C, 0xA3FC, + 0xFF5D, 0xA3FD, 0xFF5E, 0xA2A6, 0xFFE0, 0xA1CB, 0xFFE1, 0xA1CC, 0xFFE2, 0xA1FE, 0xFFE3, 0xA3FE, 0xFFE5, 0xA1CD, 0xFFE6, 0xA3DC, + 0, 0 +}; + +static const WCHAR oem2uni949[] = { /* Korean --> Unicode pairs */ + 0x8141, 0xAC02, 0x8142, 0xAC03, 0x8143, 0xAC05, 0x8144, 0xAC06, 0x8145, 0xAC0B, 0x8146, 0xAC0C, 0x8147, 0xAC0D, 0x8148, 0xAC0E, + 0x8149, 0xAC0F, 0x814A, 0xAC18, 0x814B, 0xAC1E, 0x814C, 0xAC1F, 0x814D, 0xAC21, 0x814E, 0xAC22, 0x814F, 0xAC23, 0x8150, 0xAC25, + 0x8151, 0xAC26, 0x8152, 0xAC27, 0x8153, 0xAC28, 0x8154, 0xAC29, 0x8155, 0xAC2A, 0x8156, 0xAC2B, 0x8157, 0xAC2E, 0x8158, 0xAC32, + 0x8159, 0xAC33, 0x815A, 0xAC34, 0x8161, 0xAC35, 0x8162, 0xAC36, 0x8163, 0xAC37, 0x8164, 0xAC3A, 0x8165, 0xAC3B, 0x8166, 0xAC3D, + 0x8167, 0xAC3E, 0x8168, 0xAC3F, 0x8169, 0xAC41, 0x816A, 0xAC42, 0x816B, 0xAC43, 0x816C, 0xAC44, 0x816D, 0xAC45, 0x816E, 0xAC46, + 0x816F, 0xAC47, 0x8170, 0xAC48, 0x8171, 0xAC49, 0x8172, 0xAC4A, 0x8173, 0xAC4C, 0x8174, 0xAC4E, 0x8175, 0xAC4F, 0x8176, 0xAC50, + 0x8177, 0xAC51, 0x8178, 0xAC52, 0x8179, 0xAC53, 0x817A, 0xAC55, 0x8181, 0xAC56, 0x8182, 0xAC57, 0x8183, 0xAC59, 0x8184, 0xAC5A, + 0x8185, 0xAC5B, 0x8186, 0xAC5D, 0x8187, 0xAC5E, 0x8188, 0xAC5F, 0x8189, 0xAC60, 0x818A, 0xAC61, 0x818B, 0xAC62, 0x818C, 0xAC63, + 0x818D, 0xAC64, 0x818E, 0xAC65, 0x818F, 0xAC66, 0x8190, 0xAC67, 0x8191, 0xAC68, 0x8192, 0xAC69, 0x8193, 0xAC6A, 0x8194, 0xAC6B, + 0x8195, 0xAC6C, 0x8196, 0xAC6D, 0x8197, 0xAC6E, 0x8198, 0xAC6F, 0x8199, 0xAC72, 0x819A, 0xAC73, 0x819B, 0xAC75, 0x819C, 0xAC76, + 0x819D, 0xAC79, 0x819E, 0xAC7B, 0x819F, 0xAC7C, 0x81A0, 0xAC7D, 0x81A1, 0xAC7E, 0x81A2, 0xAC7F, 0x81A3, 0xAC82, 0x81A4, 0xAC87, + 0x81A5, 0xAC88, 0x81A6, 0xAC8D, 0x81A7, 0xAC8E, 0x81A8, 0xAC8F, 0x81A9, 0xAC91, 0x81AA, 0xAC92, 0x81AB, 0xAC93, 0x81AC, 0xAC95, + 0x81AD, 0xAC96, 0x81AE, 0xAC97, 0x81AF, 0xAC98, 0x81B0, 0xAC99, 0x81B1, 0xAC9A, 0x81B2, 0xAC9B, 0x81B3, 0xAC9E, 0x81B4, 0xACA2, + 0x81B5, 0xACA3, 0x81B6, 0xACA4, 0x81B7, 0xACA5, 0x81B8, 0xACA6, 0x81B9, 0xACA7, 0x81BA, 0xACAB, 0x81BB, 0xACAD, 0x81BC, 0xACAE, + 0x81BD, 0xACB1, 0x81BE, 0xACB2, 0x81BF, 0xACB3, 0x81C0, 0xACB4, 0x81C1, 0xACB5, 0x81C2, 0xACB6, 0x81C3, 0xACB7, 0x81C4, 0xACBA, + 0x81C5, 0xACBE, 0x81C6, 0xACBF, 0x81C7, 0xACC0, 0x81C8, 0xACC2, 0x81C9, 0xACC3, 0x81CA, 0xACC5, 0x81CB, 0xACC6, 0x81CC, 0xACC7, + 0x81CD, 0xACC9, 0x81CE, 0xACCA, 0x81CF, 0xACCB, 0x81D0, 0xACCD, 0x81D1, 0xACCE, 0x81D2, 0xACCF, 0x81D3, 0xACD0, 0x81D4, 0xACD1, + 0x81D5, 0xACD2, 0x81D6, 0xACD3, 0x81D7, 0xACD4, 0x81D8, 0xACD6, 0x81D9, 0xACD8, 0x81DA, 0xACD9, 0x81DB, 0xACDA, 0x81DC, 0xACDB, + 0x81DD, 0xACDC, 0x81DE, 0xACDD, 0x81DF, 0xACDE, 0x81E0, 0xACDF, 0x81E1, 0xACE2, 0x81E2, 0xACE3, 0x81E3, 0xACE5, 0x81E4, 0xACE6, + 0x81E5, 0xACE9, 0x81E6, 0xACEB, 0x81E7, 0xACED, 0x81E8, 0xACEE, 0x81E9, 0xACF2, 0x81EA, 0xACF4, 0x81EB, 0xACF7, 0x81EC, 0xACF8, + 0x81ED, 0xACF9, 0x81EE, 0xACFA, 0x81EF, 0xACFB, 0x81F0, 0xACFE, 0x81F1, 0xACFF, 0x81F2, 0xAD01, 0x81F3, 0xAD02, 0x81F4, 0xAD03, + 0x81F5, 0xAD05, 0x81F6, 0xAD07, 0x81F7, 0xAD08, 0x81F8, 0xAD09, 0x81F9, 0xAD0A, 0x81FA, 0xAD0B, 0x81FB, 0xAD0E, 0x81FC, 0xAD10, + 0x81FD, 0xAD12, 0x81FE, 0xAD13, 0x8241, 0xAD14, 0x8242, 0xAD15, 0x8243, 0xAD16, 0x8244, 0xAD17, 0x8245, 0xAD19, 0x8246, 0xAD1A, + 0x8247, 0xAD1B, 0x8248, 0xAD1D, 0x8249, 0xAD1E, 0x824A, 0xAD1F, 0x824B, 0xAD21, 0x824C, 0xAD22, 0x824D, 0xAD23, 0x824E, 0xAD24, + 0x824F, 0xAD25, 0x8250, 0xAD26, 0x8251, 0xAD27, 0x8252, 0xAD28, 0x8253, 0xAD2A, 0x8254, 0xAD2B, 0x8255, 0xAD2E, 0x8256, 0xAD2F, + 0x8257, 0xAD30, 0x8258, 0xAD31, 0x8259, 0xAD32, 0x825A, 0xAD33, 0x8261, 0xAD36, 0x8262, 0xAD37, 0x8263, 0xAD39, 0x8264, 0xAD3A, + 0x8265, 0xAD3B, 0x8266, 0xAD3D, 0x8267, 0xAD3E, 0x8268, 0xAD3F, 0x8269, 0xAD40, 0x826A, 0xAD41, 0x826B, 0xAD42, 0x826C, 0xAD43, + 0x826D, 0xAD46, 0x826E, 0xAD48, 0x826F, 0xAD4A, 0x8270, 0xAD4B, 0x8271, 0xAD4C, 0x8272, 0xAD4D, 0x8273, 0xAD4E, 0x8274, 0xAD4F, + 0x8275, 0xAD51, 0x8276, 0xAD52, 0x8277, 0xAD53, 0x8278, 0xAD55, 0x8279, 0xAD56, 0x827A, 0xAD57, 0x8281, 0xAD59, 0x8282, 0xAD5A, + 0x8283, 0xAD5B, 0x8284, 0xAD5C, 0x8285, 0xAD5D, 0x8286, 0xAD5E, 0x8287, 0xAD5F, 0x8288, 0xAD60, 0x8289, 0xAD62, 0x828A, 0xAD64, + 0x828B, 0xAD65, 0x828C, 0xAD66, 0x828D, 0xAD67, 0x828E, 0xAD68, 0x828F, 0xAD69, 0x8290, 0xAD6A, 0x8291, 0xAD6B, 0x8292, 0xAD6E, + 0x8293, 0xAD6F, 0x8294, 0xAD71, 0x8295, 0xAD72, 0x8296, 0xAD77, 0x8297, 0xAD78, 0x8298, 0xAD79, 0x8299, 0xAD7A, 0x829A, 0xAD7E, + 0x829B, 0xAD80, 0x829C, 0xAD83, 0x829D, 0xAD84, 0x829E, 0xAD85, 0x829F, 0xAD86, 0x82A0, 0xAD87, 0x82A1, 0xAD8A, 0x82A2, 0xAD8B, + 0x82A3, 0xAD8D, 0x82A4, 0xAD8E, 0x82A5, 0xAD8F, 0x82A6, 0xAD91, 0x82A7, 0xAD92, 0x82A8, 0xAD93, 0x82A9, 0xAD94, 0x82AA, 0xAD95, + 0x82AB, 0xAD96, 0x82AC, 0xAD97, 0x82AD, 0xAD98, 0x82AE, 0xAD99, 0x82AF, 0xAD9A, 0x82B0, 0xAD9B, 0x82B1, 0xAD9E, 0x82B2, 0xAD9F, + 0x82B3, 0xADA0, 0x82B4, 0xADA1, 0x82B5, 0xADA2, 0x82B6, 0xADA3, 0x82B7, 0xADA5, 0x82B8, 0xADA6, 0x82B9, 0xADA7, 0x82BA, 0xADA8, + 0x82BB, 0xADA9, 0x82BC, 0xADAA, 0x82BD, 0xADAB, 0x82BE, 0xADAC, 0x82BF, 0xADAD, 0x82C0, 0xADAE, 0x82C1, 0xADAF, 0x82C2, 0xADB0, + 0x82C3, 0xADB1, 0x82C4, 0xADB2, 0x82C5, 0xADB3, 0x82C6, 0xADB4, 0x82C7, 0xADB5, 0x82C8, 0xADB6, 0x82C9, 0xADB8, 0x82CA, 0xADB9, + 0x82CB, 0xADBA, 0x82CC, 0xADBB, 0x82CD, 0xADBC, 0x82CE, 0xADBD, 0x82CF, 0xADBE, 0x82D0, 0xADBF, 0x82D1, 0xADC2, 0x82D2, 0xADC3, + 0x82D3, 0xADC5, 0x82D4, 0xADC6, 0x82D5, 0xADC7, 0x82D6, 0xADC9, 0x82D7, 0xADCA, 0x82D8, 0xADCB, 0x82D9, 0xADCC, 0x82DA, 0xADCD, + 0x82DB, 0xADCE, 0x82DC, 0xADCF, 0x82DD, 0xADD2, 0x82DE, 0xADD4, 0x82DF, 0xADD5, 0x82E0, 0xADD6, 0x82E1, 0xADD7, 0x82E2, 0xADD8, + 0x82E3, 0xADD9, 0x82E4, 0xADDA, 0x82E5, 0xADDB, 0x82E6, 0xADDD, 0x82E7, 0xADDE, 0x82E8, 0xADDF, 0x82E9, 0xADE1, 0x82EA, 0xADE2, + 0x82EB, 0xADE3, 0x82EC, 0xADE5, 0x82ED, 0xADE6, 0x82EE, 0xADE7, 0x82EF, 0xADE8, 0x82F0, 0xADE9, 0x82F1, 0xADEA, 0x82F2, 0xADEB, + 0x82F3, 0xADEC, 0x82F4, 0xADED, 0x82F5, 0xADEE, 0x82F6, 0xADEF, 0x82F7, 0xADF0, 0x82F8, 0xADF1, 0x82F9, 0xADF2, 0x82FA, 0xADF3, + 0x82FB, 0xADF4, 0x82FC, 0xADF5, 0x82FD, 0xADF6, 0x82FE, 0xADF7, 0x8341, 0xADFA, 0x8342, 0xADFB, 0x8343, 0xADFD, 0x8344, 0xADFE, + 0x8345, 0xAE02, 0x8346, 0xAE03, 0x8347, 0xAE04, 0x8348, 0xAE05, 0x8349, 0xAE06, 0x834A, 0xAE07, 0x834B, 0xAE0A, 0x834C, 0xAE0C, + 0x834D, 0xAE0E, 0x834E, 0xAE0F, 0x834F, 0xAE10, 0x8350, 0xAE11, 0x8351, 0xAE12, 0x8352, 0xAE13, 0x8353, 0xAE15, 0x8354, 0xAE16, + 0x8355, 0xAE17, 0x8356, 0xAE18, 0x8357, 0xAE19, 0x8358, 0xAE1A, 0x8359, 0xAE1B, 0x835A, 0xAE1C, 0x8361, 0xAE1D, 0x8362, 0xAE1E, + 0x8363, 0xAE1F, 0x8364, 0xAE20, 0x8365, 0xAE21, 0x8366, 0xAE22, 0x8367, 0xAE23, 0x8368, 0xAE24, 0x8369, 0xAE25, 0x836A, 0xAE26, + 0x836B, 0xAE27, 0x836C, 0xAE28, 0x836D, 0xAE29, 0x836E, 0xAE2A, 0x836F, 0xAE2B, 0x8370, 0xAE2C, 0x8371, 0xAE2D, 0x8372, 0xAE2E, + 0x8373, 0xAE2F, 0x8374, 0xAE32, 0x8375, 0xAE33, 0x8376, 0xAE35, 0x8377, 0xAE36, 0x8378, 0xAE39, 0x8379, 0xAE3B, 0x837A, 0xAE3C, + 0x8381, 0xAE3D, 0x8382, 0xAE3E, 0x8383, 0xAE3F, 0x8384, 0xAE42, 0x8385, 0xAE44, 0x8386, 0xAE47, 0x8387, 0xAE48, 0x8388, 0xAE49, + 0x8389, 0xAE4B, 0x838A, 0xAE4F, 0x838B, 0xAE51, 0x838C, 0xAE52, 0x838D, 0xAE53, 0x838E, 0xAE55, 0x838F, 0xAE57, 0x8390, 0xAE58, + 0x8391, 0xAE59, 0x8392, 0xAE5A, 0x8393, 0xAE5B, 0x8394, 0xAE5E, 0x8395, 0xAE62, 0x8396, 0xAE63, 0x8397, 0xAE64, 0x8398, 0xAE66, + 0x8399, 0xAE67, 0x839A, 0xAE6A, 0x839B, 0xAE6B, 0x839C, 0xAE6D, 0x839D, 0xAE6E, 0x839E, 0xAE6F, 0x839F, 0xAE71, 0x83A0, 0xAE72, + 0x83A1, 0xAE73, 0x83A2, 0xAE74, 0x83A3, 0xAE75, 0x83A4, 0xAE76, 0x83A5, 0xAE77, 0x83A6, 0xAE7A, 0x83A7, 0xAE7E, 0x83A8, 0xAE7F, + 0x83A9, 0xAE80, 0x83AA, 0xAE81, 0x83AB, 0xAE82, 0x83AC, 0xAE83, 0x83AD, 0xAE86, 0x83AE, 0xAE87, 0x83AF, 0xAE88, 0x83B0, 0xAE89, + 0x83B1, 0xAE8A, 0x83B2, 0xAE8B, 0x83B3, 0xAE8D, 0x83B4, 0xAE8E, 0x83B5, 0xAE8F, 0x83B6, 0xAE90, 0x83B7, 0xAE91, 0x83B8, 0xAE92, + 0x83B9, 0xAE93, 0x83BA, 0xAE94, 0x83BB, 0xAE95, 0x83BC, 0xAE96, 0x83BD, 0xAE97, 0x83BE, 0xAE98, 0x83BF, 0xAE99, 0x83C0, 0xAE9A, + 0x83C1, 0xAE9B, 0x83C2, 0xAE9C, 0x83C3, 0xAE9D, 0x83C4, 0xAE9E, 0x83C5, 0xAE9F, 0x83C6, 0xAEA0, 0x83C7, 0xAEA1, 0x83C8, 0xAEA2, + 0x83C9, 0xAEA3, 0x83CA, 0xAEA4, 0x83CB, 0xAEA5, 0x83CC, 0xAEA6, 0x83CD, 0xAEA7, 0x83CE, 0xAEA8, 0x83CF, 0xAEA9, 0x83D0, 0xAEAA, + 0x83D1, 0xAEAB, 0x83D2, 0xAEAC, 0x83D3, 0xAEAD, 0x83D4, 0xAEAE, 0x83D5, 0xAEAF, 0x83D6, 0xAEB0, 0x83D7, 0xAEB1, 0x83D8, 0xAEB2, + 0x83D9, 0xAEB3, 0x83DA, 0xAEB4, 0x83DB, 0xAEB5, 0x83DC, 0xAEB6, 0x83DD, 0xAEB7, 0x83DE, 0xAEB8, 0x83DF, 0xAEB9, 0x83E0, 0xAEBA, + 0x83E1, 0xAEBB, 0x83E2, 0xAEBF, 0x83E3, 0xAEC1, 0x83E4, 0xAEC2, 0x83E5, 0xAEC3, 0x83E6, 0xAEC5, 0x83E7, 0xAEC6, 0x83E8, 0xAEC7, + 0x83E9, 0xAEC8, 0x83EA, 0xAEC9, 0x83EB, 0xAECA, 0x83EC, 0xAECB, 0x83ED, 0xAECE, 0x83EE, 0xAED2, 0x83EF, 0xAED3, 0x83F0, 0xAED4, + 0x83F1, 0xAED5, 0x83F2, 0xAED6, 0x83F3, 0xAED7, 0x83F4, 0xAEDA, 0x83F5, 0xAEDB, 0x83F6, 0xAEDD, 0x83F7, 0xAEDE, 0x83F8, 0xAEDF, + 0x83F9, 0xAEE0, 0x83FA, 0xAEE1, 0x83FB, 0xAEE2, 0x83FC, 0xAEE3, 0x83FD, 0xAEE4, 0x83FE, 0xAEE5, 0x8441, 0xAEE6, 0x8442, 0xAEE7, + 0x8443, 0xAEE9, 0x8444, 0xAEEA, 0x8445, 0xAEEC, 0x8446, 0xAEEE, 0x8447, 0xAEEF, 0x8448, 0xAEF0, 0x8449, 0xAEF1, 0x844A, 0xAEF2, + 0x844B, 0xAEF3, 0x844C, 0xAEF5, 0x844D, 0xAEF6, 0x844E, 0xAEF7, 0x844F, 0xAEF9, 0x8450, 0xAEFA, 0x8451, 0xAEFB, 0x8452, 0xAEFD, + 0x8453, 0xAEFE, 0x8454, 0xAEFF, 0x8455, 0xAF00, 0x8456, 0xAF01, 0x8457, 0xAF02, 0x8458, 0xAF03, 0x8459, 0xAF04, 0x845A, 0xAF05, + 0x8461, 0xAF06, 0x8462, 0xAF09, 0x8463, 0xAF0A, 0x8464, 0xAF0B, 0x8465, 0xAF0C, 0x8466, 0xAF0E, 0x8467, 0xAF0F, 0x8468, 0xAF11, + 0x8469, 0xAF12, 0x846A, 0xAF13, 0x846B, 0xAF14, 0x846C, 0xAF15, 0x846D, 0xAF16, 0x846E, 0xAF17, 0x846F, 0xAF18, 0x8470, 0xAF19, + 0x8471, 0xAF1A, 0x8472, 0xAF1B, 0x8473, 0xAF1C, 0x8474, 0xAF1D, 0x8475, 0xAF1E, 0x8476, 0xAF1F, 0x8477, 0xAF20, 0x8478, 0xAF21, + 0x8479, 0xAF22, 0x847A, 0xAF23, 0x8481, 0xAF24, 0x8482, 0xAF25, 0x8483, 0xAF26, 0x8484, 0xAF27, 0x8485, 0xAF28, 0x8486, 0xAF29, + 0x8487, 0xAF2A, 0x8488, 0xAF2B, 0x8489, 0xAF2E, 0x848A, 0xAF2F, 0x848B, 0xAF31, 0x848C, 0xAF33, 0x848D, 0xAF35, 0x848E, 0xAF36, + 0x848F, 0xAF37, 0x8490, 0xAF38, 0x8491, 0xAF39, 0x8492, 0xAF3A, 0x8493, 0xAF3B, 0x8494, 0xAF3E, 0x8495, 0xAF40, 0x8496, 0xAF44, + 0x8497, 0xAF45, 0x8498, 0xAF46, 0x8499, 0xAF47, 0x849A, 0xAF4A, 0x849B, 0xAF4B, 0x849C, 0xAF4C, 0x849D, 0xAF4D, 0x849E, 0xAF4E, + 0x849F, 0xAF4F, 0x84A0, 0xAF51, 0x84A1, 0xAF52, 0x84A2, 0xAF53, 0x84A3, 0xAF54, 0x84A4, 0xAF55, 0x84A5, 0xAF56, 0x84A6, 0xAF57, + 0x84A7, 0xAF58, 0x84A8, 0xAF59, 0x84A9, 0xAF5A, 0x84AA, 0xAF5B, 0x84AB, 0xAF5E, 0x84AC, 0xAF5F, 0x84AD, 0xAF60, 0x84AE, 0xAF61, + 0x84AF, 0xAF62, 0x84B0, 0xAF63, 0x84B1, 0xAF66, 0x84B2, 0xAF67, 0x84B3, 0xAF68, 0x84B4, 0xAF69, 0x84B5, 0xAF6A, 0x84B6, 0xAF6B, + 0x84B7, 0xAF6C, 0x84B8, 0xAF6D, 0x84B9, 0xAF6E, 0x84BA, 0xAF6F, 0x84BB, 0xAF70, 0x84BC, 0xAF71, 0x84BD, 0xAF72, 0x84BE, 0xAF73, + 0x84BF, 0xAF74, 0x84C0, 0xAF75, 0x84C1, 0xAF76, 0x84C2, 0xAF77, 0x84C3, 0xAF78, 0x84C4, 0xAF7A, 0x84C5, 0xAF7B, 0x84C6, 0xAF7C, + 0x84C7, 0xAF7D, 0x84C8, 0xAF7E, 0x84C9, 0xAF7F, 0x84CA, 0xAF81, 0x84CB, 0xAF82, 0x84CC, 0xAF83, 0x84CD, 0xAF85, 0x84CE, 0xAF86, + 0x84CF, 0xAF87, 0x84D0, 0xAF89, 0x84D1, 0xAF8A, 0x84D2, 0xAF8B, 0x84D3, 0xAF8C, 0x84D4, 0xAF8D, 0x84D5, 0xAF8E, 0x84D6, 0xAF8F, + 0x84D7, 0xAF92, 0x84D8, 0xAF93, 0x84D9, 0xAF94, 0x84DA, 0xAF96, 0x84DB, 0xAF97, 0x84DC, 0xAF98, 0x84DD, 0xAF99, 0x84DE, 0xAF9A, + 0x84DF, 0xAF9B, 0x84E0, 0xAF9D, 0x84E1, 0xAF9E, 0x84E2, 0xAF9F, 0x84E3, 0xAFA0, 0x84E4, 0xAFA1, 0x84E5, 0xAFA2, 0x84E6, 0xAFA3, + 0x84E7, 0xAFA4, 0x84E8, 0xAFA5, 0x84E9, 0xAFA6, 0x84EA, 0xAFA7, 0x84EB, 0xAFA8, 0x84EC, 0xAFA9, 0x84ED, 0xAFAA, 0x84EE, 0xAFAB, + 0x84EF, 0xAFAC, 0x84F0, 0xAFAD, 0x84F1, 0xAFAE, 0x84F2, 0xAFAF, 0x84F3, 0xAFB0, 0x84F4, 0xAFB1, 0x84F5, 0xAFB2, 0x84F6, 0xAFB3, + 0x84F7, 0xAFB4, 0x84F8, 0xAFB5, 0x84F9, 0xAFB6, 0x84FA, 0xAFB7, 0x84FB, 0xAFBA, 0x84FC, 0xAFBB, 0x84FD, 0xAFBD, 0x84FE, 0xAFBE, + 0x8541, 0xAFBF, 0x8542, 0xAFC1, 0x8543, 0xAFC2, 0x8544, 0xAFC3, 0x8545, 0xAFC4, 0x8546, 0xAFC5, 0x8547, 0xAFC6, 0x8548, 0xAFCA, + 0x8549, 0xAFCC, 0x854A, 0xAFCF, 0x854B, 0xAFD0, 0x854C, 0xAFD1, 0x854D, 0xAFD2, 0x854E, 0xAFD3, 0x854F, 0xAFD5, 0x8550, 0xAFD6, + 0x8551, 0xAFD7, 0x8552, 0xAFD8, 0x8553, 0xAFD9, 0x8554, 0xAFDA, 0x8555, 0xAFDB, 0x8556, 0xAFDD, 0x8557, 0xAFDE, 0x8558, 0xAFDF, + 0x8559, 0xAFE0, 0x855A, 0xAFE1, 0x8561, 0xAFE2, 0x8562, 0xAFE3, 0x8563, 0xAFE4, 0x8564, 0xAFE5, 0x8565, 0xAFE6, 0x8566, 0xAFE7, + 0x8567, 0xAFEA, 0x8568, 0xAFEB, 0x8569, 0xAFEC, 0x856A, 0xAFED, 0x856B, 0xAFEE, 0x856C, 0xAFEF, 0x856D, 0xAFF2, 0x856E, 0xAFF3, + 0x856F, 0xAFF5, 0x8570, 0xAFF6, 0x8571, 0xAFF7, 0x8572, 0xAFF9, 0x8573, 0xAFFA, 0x8574, 0xAFFB, 0x8575, 0xAFFC, 0x8576, 0xAFFD, + 0x8577, 0xAFFE, 0x8578, 0xAFFF, 0x8579, 0xB002, 0x857A, 0xB003, 0x8581, 0xB005, 0x8582, 0xB006, 0x8583, 0xB007, 0x8584, 0xB008, + 0x8585, 0xB009, 0x8586, 0xB00A, 0x8587, 0xB00B, 0x8588, 0xB00D, 0x8589, 0xB00E, 0x858A, 0xB00F, 0x858B, 0xB011, 0x858C, 0xB012, + 0x858D, 0xB013, 0x858E, 0xB015, 0x858F, 0xB016, 0x8590, 0xB017, 0x8591, 0xB018, 0x8592, 0xB019, 0x8593, 0xB01A, 0x8594, 0xB01B, + 0x8595, 0xB01E, 0x8596, 0xB01F, 0x8597, 0xB020, 0x8598, 0xB021, 0x8599, 0xB022, 0x859A, 0xB023, 0x859B, 0xB024, 0x859C, 0xB025, + 0x859D, 0xB026, 0x859E, 0xB027, 0x859F, 0xB029, 0x85A0, 0xB02A, 0x85A1, 0xB02B, 0x85A2, 0xB02C, 0x85A3, 0xB02D, 0x85A4, 0xB02E, + 0x85A5, 0xB02F, 0x85A6, 0xB030, 0x85A7, 0xB031, 0x85A8, 0xB032, 0x85A9, 0xB033, 0x85AA, 0xB034, 0x85AB, 0xB035, 0x85AC, 0xB036, + 0x85AD, 0xB037, 0x85AE, 0xB038, 0x85AF, 0xB039, 0x85B0, 0xB03A, 0x85B1, 0xB03B, 0x85B2, 0xB03C, 0x85B3, 0xB03D, 0x85B4, 0xB03E, + 0x85B5, 0xB03F, 0x85B6, 0xB040, 0x85B7, 0xB041, 0x85B8, 0xB042, 0x85B9, 0xB043, 0x85BA, 0xB046, 0x85BB, 0xB047, 0x85BC, 0xB049, + 0x85BD, 0xB04B, 0x85BE, 0xB04D, 0x85BF, 0xB04F, 0x85C0, 0xB050, 0x85C1, 0xB051, 0x85C2, 0xB052, 0x85C3, 0xB056, 0x85C4, 0xB058, + 0x85C5, 0xB05A, 0x85C6, 0xB05B, 0x85C7, 0xB05C, 0x85C8, 0xB05E, 0x85C9, 0xB05F, 0x85CA, 0xB060, 0x85CB, 0xB061, 0x85CC, 0xB062, + 0x85CD, 0xB063, 0x85CE, 0xB064, 0x85CF, 0xB065, 0x85D0, 0xB066, 0x85D1, 0xB067, 0x85D2, 0xB068, 0x85D3, 0xB069, 0x85D4, 0xB06A, + 0x85D5, 0xB06B, 0x85D6, 0xB06C, 0x85D7, 0xB06D, 0x85D8, 0xB06E, 0x85D9, 0xB06F, 0x85DA, 0xB070, 0x85DB, 0xB071, 0x85DC, 0xB072, + 0x85DD, 0xB073, 0x85DE, 0xB074, 0x85DF, 0xB075, 0x85E0, 0xB076, 0x85E1, 0xB077, 0x85E2, 0xB078, 0x85E3, 0xB079, 0x85E4, 0xB07A, + 0x85E5, 0xB07B, 0x85E6, 0xB07E, 0x85E7, 0xB07F, 0x85E8, 0xB081, 0x85E9, 0xB082, 0x85EA, 0xB083, 0x85EB, 0xB085, 0x85EC, 0xB086, + 0x85ED, 0xB087, 0x85EE, 0xB088, 0x85EF, 0xB089, 0x85F0, 0xB08A, 0x85F1, 0xB08B, 0x85F2, 0xB08E, 0x85F3, 0xB090, 0x85F4, 0xB092, + 0x85F5, 0xB093, 0x85F6, 0xB094, 0x85F7, 0xB095, 0x85F8, 0xB096, 0x85F9, 0xB097, 0x85FA, 0xB09B, 0x85FB, 0xB09D, 0x85FC, 0xB09E, + 0x85FD, 0xB0A3, 0x85FE, 0xB0A4, 0x8641, 0xB0A5, 0x8642, 0xB0A6, 0x8643, 0xB0A7, 0x8644, 0xB0AA, 0x8645, 0xB0B0, 0x8646, 0xB0B2, + 0x8647, 0xB0B6, 0x8648, 0xB0B7, 0x8649, 0xB0B9, 0x864A, 0xB0BA, 0x864B, 0xB0BB, 0x864C, 0xB0BD, 0x864D, 0xB0BE, 0x864E, 0xB0BF, + 0x864F, 0xB0C0, 0x8650, 0xB0C1, 0x8651, 0xB0C2, 0x8652, 0xB0C3, 0x8653, 0xB0C6, 0x8654, 0xB0CA, 0x8655, 0xB0CB, 0x8656, 0xB0CC, + 0x8657, 0xB0CD, 0x8658, 0xB0CE, 0x8659, 0xB0CF, 0x865A, 0xB0D2, 0x8661, 0xB0D3, 0x8662, 0xB0D5, 0x8663, 0xB0D6, 0x8664, 0xB0D7, + 0x8665, 0xB0D9, 0x8666, 0xB0DA, 0x8667, 0xB0DB, 0x8668, 0xB0DC, 0x8669, 0xB0DD, 0x866A, 0xB0DE, 0x866B, 0xB0DF, 0x866C, 0xB0E1, + 0x866D, 0xB0E2, 0x866E, 0xB0E3, 0x866F, 0xB0E4, 0x8670, 0xB0E6, 0x8671, 0xB0E7, 0x8672, 0xB0E8, 0x8673, 0xB0E9, 0x8674, 0xB0EA, + 0x8675, 0xB0EB, 0x8676, 0xB0EC, 0x8677, 0xB0ED, 0x8678, 0xB0EE, 0x8679, 0xB0EF, 0x867A, 0xB0F0, 0x8681, 0xB0F1, 0x8682, 0xB0F2, + 0x8683, 0xB0F3, 0x8684, 0xB0F4, 0x8685, 0xB0F5, 0x8686, 0xB0F6, 0x8687, 0xB0F7, 0x8688, 0xB0F8, 0x8689, 0xB0F9, 0x868A, 0xB0FA, + 0x868B, 0xB0FB, 0x868C, 0xB0FC, 0x868D, 0xB0FD, 0x868E, 0xB0FE, 0x868F, 0xB0FF, 0x8690, 0xB100, 0x8691, 0xB101, 0x8692, 0xB102, + 0x8693, 0xB103, 0x8694, 0xB104, 0x8695, 0xB105, 0x8696, 0xB106, 0x8697, 0xB107, 0x8698, 0xB10A, 0x8699, 0xB10D, 0x869A, 0xB10E, + 0x869B, 0xB10F, 0x869C, 0xB111, 0x869D, 0xB114, 0x869E, 0xB115, 0x869F, 0xB116, 0x86A0, 0xB117, 0x86A1, 0xB11A, 0x86A2, 0xB11E, + 0x86A3, 0xB11F, 0x86A4, 0xB120, 0x86A5, 0xB121, 0x86A6, 0xB122, 0x86A7, 0xB126, 0x86A8, 0xB127, 0x86A9, 0xB129, 0x86AA, 0xB12A, + 0x86AB, 0xB12B, 0x86AC, 0xB12D, 0x86AD, 0xB12E, 0x86AE, 0xB12F, 0x86AF, 0xB130, 0x86B0, 0xB131, 0x86B1, 0xB132, 0x86B2, 0xB133, + 0x86B3, 0xB136, 0x86B4, 0xB13A, 0x86B5, 0xB13B, 0x86B6, 0xB13C, 0x86B7, 0xB13D, 0x86B8, 0xB13E, 0x86B9, 0xB13F, 0x86BA, 0xB142, + 0x86BB, 0xB143, 0x86BC, 0xB145, 0x86BD, 0xB146, 0x86BE, 0xB147, 0x86BF, 0xB149, 0x86C0, 0xB14A, 0x86C1, 0xB14B, 0x86C2, 0xB14C, + 0x86C3, 0xB14D, 0x86C4, 0xB14E, 0x86C5, 0xB14F, 0x86C6, 0xB152, 0x86C7, 0xB153, 0x86C8, 0xB156, 0x86C9, 0xB157, 0x86CA, 0xB159, + 0x86CB, 0xB15A, 0x86CC, 0xB15B, 0x86CD, 0xB15D, 0x86CE, 0xB15E, 0x86CF, 0xB15F, 0x86D0, 0xB161, 0x86D1, 0xB162, 0x86D2, 0xB163, + 0x86D3, 0xB164, 0x86D4, 0xB165, 0x86D5, 0xB166, 0x86D6, 0xB167, 0x86D7, 0xB168, 0x86D8, 0xB169, 0x86D9, 0xB16A, 0x86DA, 0xB16B, + 0x86DB, 0xB16C, 0x86DC, 0xB16D, 0x86DD, 0xB16E, 0x86DE, 0xB16F, 0x86DF, 0xB170, 0x86E0, 0xB171, 0x86E1, 0xB172, 0x86E2, 0xB173, + 0x86E3, 0xB174, 0x86E4, 0xB175, 0x86E5, 0xB176, 0x86E6, 0xB177, 0x86E7, 0xB17A, 0x86E8, 0xB17B, 0x86E9, 0xB17D, 0x86EA, 0xB17E, + 0x86EB, 0xB17F, 0x86EC, 0xB181, 0x86ED, 0xB183, 0x86EE, 0xB184, 0x86EF, 0xB185, 0x86F0, 0xB186, 0x86F1, 0xB187, 0x86F2, 0xB18A, + 0x86F3, 0xB18C, 0x86F4, 0xB18E, 0x86F5, 0xB18F, 0x86F6, 0xB190, 0x86F7, 0xB191, 0x86F8, 0xB195, 0x86F9, 0xB196, 0x86FA, 0xB197, + 0x86FB, 0xB199, 0x86FC, 0xB19A, 0x86FD, 0xB19B, 0x86FE, 0xB19D, 0x8741, 0xB19E, 0x8742, 0xB19F, 0x8743, 0xB1A0, 0x8744, 0xB1A1, + 0x8745, 0xB1A2, 0x8746, 0xB1A3, 0x8747, 0xB1A4, 0x8748, 0xB1A5, 0x8749, 0xB1A6, 0x874A, 0xB1A7, 0x874B, 0xB1A9, 0x874C, 0xB1AA, + 0x874D, 0xB1AB, 0x874E, 0xB1AC, 0x874F, 0xB1AD, 0x8750, 0xB1AE, 0x8751, 0xB1AF, 0x8752, 0xB1B0, 0x8753, 0xB1B1, 0x8754, 0xB1B2, + 0x8755, 0xB1B3, 0x8756, 0xB1B4, 0x8757, 0xB1B5, 0x8758, 0xB1B6, 0x8759, 0xB1B7, 0x875A, 0xB1B8, 0x8761, 0xB1B9, 0x8762, 0xB1BA, + 0x8763, 0xB1BB, 0x8764, 0xB1BC, 0x8765, 0xB1BD, 0x8766, 0xB1BE, 0x8767, 0xB1BF, 0x8768, 0xB1C0, 0x8769, 0xB1C1, 0x876A, 0xB1C2, + 0x876B, 0xB1C3, 0x876C, 0xB1C4, 0x876D, 0xB1C5, 0x876E, 0xB1C6, 0x876F, 0xB1C7, 0x8770, 0xB1C8, 0x8771, 0xB1C9, 0x8772, 0xB1CA, + 0x8773, 0xB1CB, 0x8774, 0xB1CD, 0x8775, 0xB1CE, 0x8776, 0xB1CF, 0x8777, 0xB1D1, 0x8778, 0xB1D2, 0x8779, 0xB1D3, 0x877A, 0xB1D5, + 0x8781, 0xB1D6, 0x8782, 0xB1D7, 0x8783, 0xB1D8, 0x8784, 0xB1D9, 0x8785, 0xB1DA, 0x8786, 0xB1DB, 0x8787, 0xB1DE, 0x8788, 0xB1E0, + 0x8789, 0xB1E1, 0x878A, 0xB1E2, 0x878B, 0xB1E3, 0x878C, 0xB1E4, 0x878D, 0xB1E5, 0x878E, 0xB1E6, 0x878F, 0xB1E7, 0x8790, 0xB1EA, + 0x8791, 0xB1EB, 0x8792, 0xB1ED, 0x8793, 0xB1EE, 0x8794, 0xB1EF, 0x8795, 0xB1F1, 0x8796, 0xB1F2, 0x8797, 0xB1F3, 0x8798, 0xB1F4, + 0x8799, 0xB1F5, 0x879A, 0xB1F6, 0x879B, 0xB1F7, 0x879C, 0xB1F8, 0x879D, 0xB1FA, 0x879E, 0xB1FC, 0x879F, 0xB1FE, 0x87A0, 0xB1FF, + 0x87A1, 0xB200, 0x87A2, 0xB201, 0x87A3, 0xB202, 0x87A4, 0xB203, 0x87A5, 0xB206, 0x87A6, 0xB207, 0x87A7, 0xB209, 0x87A8, 0xB20A, + 0x87A9, 0xB20D, 0x87AA, 0xB20E, 0x87AB, 0xB20F, 0x87AC, 0xB210, 0x87AD, 0xB211, 0x87AE, 0xB212, 0x87AF, 0xB213, 0x87B0, 0xB216, + 0x87B1, 0xB218, 0x87B2, 0xB21A, 0x87B3, 0xB21B, 0x87B4, 0xB21C, 0x87B5, 0xB21D, 0x87B6, 0xB21E, 0x87B7, 0xB21F, 0x87B8, 0xB221, + 0x87B9, 0xB222, 0x87BA, 0xB223, 0x87BB, 0xB224, 0x87BC, 0xB225, 0x87BD, 0xB226, 0x87BE, 0xB227, 0x87BF, 0xB228, 0x87C0, 0xB229, + 0x87C1, 0xB22A, 0x87C2, 0xB22B, 0x87C3, 0xB22C, 0x87C4, 0xB22D, 0x87C5, 0xB22E, 0x87C6, 0xB22F, 0x87C7, 0xB230, 0x87C8, 0xB231, + 0x87C9, 0xB232, 0x87CA, 0xB233, 0x87CB, 0xB235, 0x87CC, 0xB236, 0x87CD, 0xB237, 0x87CE, 0xB238, 0x87CF, 0xB239, 0x87D0, 0xB23A, + 0x87D1, 0xB23B, 0x87D2, 0xB23D, 0x87D3, 0xB23E, 0x87D4, 0xB23F, 0x87D5, 0xB240, 0x87D6, 0xB241, 0x87D7, 0xB242, 0x87D8, 0xB243, + 0x87D9, 0xB244, 0x87DA, 0xB245, 0x87DB, 0xB246, 0x87DC, 0xB247, 0x87DD, 0xB248, 0x87DE, 0xB249, 0x87DF, 0xB24A, 0x87E0, 0xB24B, + 0x87E1, 0xB24C, 0x87E2, 0xB24D, 0x87E3, 0xB24E, 0x87E4, 0xB24F, 0x87E5, 0xB250, 0x87E6, 0xB251, 0x87E7, 0xB252, 0x87E8, 0xB253, + 0x87E9, 0xB254, 0x87EA, 0xB255, 0x87EB, 0xB256, 0x87EC, 0xB257, 0x87ED, 0xB259, 0x87EE, 0xB25A, 0x87EF, 0xB25B, 0x87F0, 0xB25D, + 0x87F1, 0xB25E, 0x87F2, 0xB25F, 0x87F3, 0xB261, 0x87F4, 0xB262, 0x87F5, 0xB263, 0x87F6, 0xB264, 0x87F7, 0xB265, 0x87F8, 0xB266, + 0x87F9, 0xB267, 0x87FA, 0xB26A, 0x87FB, 0xB26B, 0x87FC, 0xB26C, 0x87FD, 0xB26D, 0x87FE, 0xB26E, 0x8841, 0xB26F, 0x8842, 0xB270, + 0x8843, 0xB271, 0x8844, 0xB272, 0x8845, 0xB273, 0x8846, 0xB276, 0x8847, 0xB277, 0x8848, 0xB278, 0x8849, 0xB279, 0x884A, 0xB27A, + 0x884B, 0xB27B, 0x884C, 0xB27D, 0x884D, 0xB27E, 0x884E, 0xB27F, 0x884F, 0xB280, 0x8850, 0xB281, 0x8851, 0xB282, 0x8852, 0xB283, + 0x8853, 0xB286, 0x8854, 0xB287, 0x8855, 0xB288, 0x8856, 0xB28A, 0x8857, 0xB28B, 0x8858, 0xB28C, 0x8859, 0xB28D, 0x885A, 0xB28E, + 0x8861, 0xB28F, 0x8862, 0xB292, 0x8863, 0xB293, 0x8864, 0xB295, 0x8865, 0xB296, 0x8866, 0xB297, 0x8867, 0xB29B, 0x8868, 0xB29C, + 0x8869, 0xB29D, 0x886A, 0xB29E, 0x886B, 0xB29F, 0x886C, 0xB2A2, 0x886D, 0xB2A4, 0x886E, 0xB2A7, 0x886F, 0xB2A8, 0x8870, 0xB2A9, + 0x8871, 0xB2AB, 0x8872, 0xB2AD, 0x8873, 0xB2AE, 0x8874, 0xB2AF, 0x8875, 0xB2B1, 0x8876, 0xB2B2, 0x8877, 0xB2B3, 0x8878, 0xB2B5, + 0x8879, 0xB2B6, 0x887A, 0xB2B7, 0x8881, 0xB2B8, 0x8882, 0xB2B9, 0x8883, 0xB2BA, 0x8884, 0xB2BB, 0x8885, 0xB2BC, 0x8886, 0xB2BD, + 0x8887, 0xB2BE, 0x8888, 0xB2BF, 0x8889, 0xB2C0, 0x888A, 0xB2C1, 0x888B, 0xB2C2, 0x888C, 0xB2C3, 0x888D, 0xB2C4, 0x888E, 0xB2C5, + 0x888F, 0xB2C6, 0x8890, 0xB2C7, 0x8891, 0xB2CA, 0x8892, 0xB2CB, 0x8893, 0xB2CD, 0x8894, 0xB2CE, 0x8895, 0xB2CF, 0x8896, 0xB2D1, + 0x8897, 0xB2D3, 0x8898, 0xB2D4, 0x8899, 0xB2D5, 0x889A, 0xB2D6, 0x889B, 0xB2D7, 0x889C, 0xB2DA, 0x889D, 0xB2DC, 0x889E, 0xB2DE, + 0x889F, 0xB2DF, 0x88A0, 0xB2E0, 0x88A1, 0xB2E1, 0x88A2, 0xB2E3, 0x88A3, 0xB2E7, 0x88A4, 0xB2E9, 0x88A5, 0xB2EA, 0x88A6, 0xB2F0, + 0x88A7, 0xB2F1, 0x88A8, 0xB2F2, 0x88A9, 0xB2F6, 0x88AA, 0xB2FC, 0x88AB, 0xB2FD, 0x88AC, 0xB2FE, 0x88AD, 0xB302, 0x88AE, 0xB303, + 0x88AF, 0xB305, 0x88B0, 0xB306, 0x88B1, 0xB307, 0x88B2, 0xB309, 0x88B3, 0xB30A, 0x88B4, 0xB30B, 0x88B5, 0xB30C, 0x88B6, 0xB30D, + 0x88B7, 0xB30E, 0x88B8, 0xB30F, 0x88B9, 0xB312, 0x88BA, 0xB316, 0x88BB, 0xB317, 0x88BC, 0xB318, 0x88BD, 0xB319, 0x88BE, 0xB31A, + 0x88BF, 0xB31B, 0x88C0, 0xB31D, 0x88C1, 0xB31E, 0x88C2, 0xB31F, 0x88C3, 0xB320, 0x88C4, 0xB321, 0x88C5, 0xB322, 0x88C6, 0xB323, + 0x88C7, 0xB324, 0x88C8, 0xB325, 0x88C9, 0xB326, 0x88CA, 0xB327, 0x88CB, 0xB328, 0x88CC, 0xB329, 0x88CD, 0xB32A, 0x88CE, 0xB32B, + 0x88CF, 0xB32C, 0x88D0, 0xB32D, 0x88D1, 0xB32E, 0x88D2, 0xB32F, 0x88D3, 0xB330, 0x88D4, 0xB331, 0x88D5, 0xB332, 0x88D6, 0xB333, + 0x88D7, 0xB334, 0x88D8, 0xB335, 0x88D9, 0xB336, 0x88DA, 0xB337, 0x88DB, 0xB338, 0x88DC, 0xB339, 0x88DD, 0xB33A, 0x88DE, 0xB33B, + 0x88DF, 0xB33C, 0x88E0, 0xB33D, 0x88E1, 0xB33E, 0x88E2, 0xB33F, 0x88E3, 0xB340, 0x88E4, 0xB341, 0x88E5, 0xB342, 0x88E6, 0xB343, + 0x88E7, 0xB344, 0x88E8, 0xB345, 0x88E9, 0xB346, 0x88EA, 0xB347, 0x88EB, 0xB348, 0x88EC, 0xB349, 0x88ED, 0xB34A, 0x88EE, 0xB34B, + 0x88EF, 0xB34C, 0x88F0, 0xB34D, 0x88F1, 0xB34E, 0x88F2, 0xB34F, 0x88F3, 0xB350, 0x88F4, 0xB351, 0x88F5, 0xB352, 0x88F6, 0xB353, + 0x88F7, 0xB357, 0x88F8, 0xB359, 0x88F9, 0xB35A, 0x88FA, 0xB35D, 0x88FB, 0xB360, 0x88FC, 0xB361, 0x88FD, 0xB362, 0x88FE, 0xB363, + 0x8941, 0xB366, 0x8942, 0xB368, 0x8943, 0xB36A, 0x8944, 0xB36C, 0x8945, 0xB36D, 0x8946, 0xB36F, 0x8947, 0xB372, 0x8948, 0xB373, + 0x8949, 0xB375, 0x894A, 0xB376, 0x894B, 0xB377, 0x894C, 0xB379, 0x894D, 0xB37A, 0x894E, 0xB37B, 0x894F, 0xB37C, 0x8950, 0xB37D, + 0x8951, 0xB37E, 0x8952, 0xB37F, 0x8953, 0xB382, 0x8954, 0xB386, 0x8955, 0xB387, 0x8956, 0xB388, 0x8957, 0xB389, 0x8958, 0xB38A, + 0x8959, 0xB38B, 0x895A, 0xB38D, 0x8961, 0xB38E, 0x8962, 0xB38F, 0x8963, 0xB391, 0x8964, 0xB392, 0x8965, 0xB393, 0x8966, 0xB395, + 0x8967, 0xB396, 0x8968, 0xB397, 0x8969, 0xB398, 0x896A, 0xB399, 0x896B, 0xB39A, 0x896C, 0xB39B, 0x896D, 0xB39C, 0x896E, 0xB39D, + 0x896F, 0xB39E, 0x8970, 0xB39F, 0x8971, 0xB3A2, 0x8972, 0xB3A3, 0x8973, 0xB3A4, 0x8974, 0xB3A5, 0x8975, 0xB3A6, 0x8976, 0xB3A7, + 0x8977, 0xB3A9, 0x8978, 0xB3AA, 0x8979, 0xB3AB, 0x897A, 0xB3AD, 0x8981, 0xB3AE, 0x8982, 0xB3AF, 0x8983, 0xB3B0, 0x8984, 0xB3B1, + 0x8985, 0xB3B2, 0x8986, 0xB3B3, 0x8987, 0xB3B4, 0x8988, 0xB3B5, 0x8989, 0xB3B6, 0x898A, 0xB3B7, 0x898B, 0xB3B8, 0x898C, 0xB3B9, + 0x898D, 0xB3BA, 0x898E, 0xB3BB, 0x898F, 0xB3BC, 0x8990, 0xB3BD, 0x8991, 0xB3BE, 0x8992, 0xB3BF, 0x8993, 0xB3C0, 0x8994, 0xB3C1, + 0x8995, 0xB3C2, 0x8996, 0xB3C3, 0x8997, 0xB3C6, 0x8998, 0xB3C7, 0x8999, 0xB3C9, 0x899A, 0xB3CA, 0x899B, 0xB3CD, 0x899C, 0xB3CF, + 0x899D, 0xB3D1, 0x899E, 0xB3D2, 0x899F, 0xB3D3, 0x89A0, 0xB3D6, 0x89A1, 0xB3D8, 0x89A2, 0xB3DA, 0x89A3, 0xB3DC, 0x89A4, 0xB3DE, + 0x89A5, 0xB3DF, 0x89A6, 0xB3E1, 0x89A7, 0xB3E2, 0x89A8, 0xB3E3, 0x89A9, 0xB3E5, 0x89AA, 0xB3E6, 0x89AB, 0xB3E7, 0x89AC, 0xB3E9, + 0x89AD, 0xB3EA, 0x89AE, 0xB3EB, 0x89AF, 0xB3EC, 0x89B0, 0xB3ED, 0x89B1, 0xB3EE, 0x89B2, 0xB3EF, 0x89B3, 0xB3F0, 0x89B4, 0xB3F1, + 0x89B5, 0xB3F2, 0x89B6, 0xB3F3, 0x89B7, 0xB3F4, 0x89B8, 0xB3F5, 0x89B9, 0xB3F6, 0x89BA, 0xB3F7, 0x89BB, 0xB3F8, 0x89BC, 0xB3F9, + 0x89BD, 0xB3FA, 0x89BE, 0xB3FB, 0x89BF, 0xB3FD, 0x89C0, 0xB3FE, 0x89C1, 0xB3FF, 0x89C2, 0xB400, 0x89C3, 0xB401, 0x89C4, 0xB402, + 0x89C5, 0xB403, 0x89C6, 0xB404, 0x89C7, 0xB405, 0x89C8, 0xB406, 0x89C9, 0xB407, 0x89CA, 0xB408, 0x89CB, 0xB409, 0x89CC, 0xB40A, + 0x89CD, 0xB40B, 0x89CE, 0xB40C, 0x89CF, 0xB40D, 0x89D0, 0xB40E, 0x89D1, 0xB40F, 0x89D2, 0xB411, 0x89D3, 0xB412, 0x89D4, 0xB413, + 0x89D5, 0xB414, 0x89D6, 0xB415, 0x89D7, 0xB416, 0x89D8, 0xB417, 0x89D9, 0xB419, 0x89DA, 0xB41A, 0x89DB, 0xB41B, 0x89DC, 0xB41D, + 0x89DD, 0xB41E, 0x89DE, 0xB41F, 0x89DF, 0xB421, 0x89E0, 0xB422, 0x89E1, 0xB423, 0x89E2, 0xB424, 0x89E3, 0xB425, 0x89E4, 0xB426, + 0x89E5, 0xB427, 0x89E6, 0xB42A, 0x89E7, 0xB42C, 0x89E8, 0xB42D, 0x89E9, 0xB42E, 0x89EA, 0xB42F, 0x89EB, 0xB430, 0x89EC, 0xB431, + 0x89ED, 0xB432, 0x89EE, 0xB433, 0x89EF, 0xB435, 0x89F0, 0xB436, 0x89F1, 0xB437, 0x89F2, 0xB438, 0x89F3, 0xB439, 0x89F4, 0xB43A, + 0x89F5, 0xB43B, 0x89F6, 0xB43C, 0x89F7, 0xB43D, 0x89F8, 0xB43E, 0x89F9, 0xB43F, 0x89FA, 0xB440, 0x89FB, 0xB441, 0x89FC, 0xB442, + 0x89FD, 0xB443, 0x89FE, 0xB444, 0x8A41, 0xB445, 0x8A42, 0xB446, 0x8A43, 0xB447, 0x8A44, 0xB448, 0x8A45, 0xB449, 0x8A46, 0xB44A, + 0x8A47, 0xB44B, 0x8A48, 0xB44C, 0x8A49, 0xB44D, 0x8A4A, 0xB44E, 0x8A4B, 0xB44F, 0x8A4C, 0xB452, 0x8A4D, 0xB453, 0x8A4E, 0xB455, + 0x8A4F, 0xB456, 0x8A50, 0xB457, 0x8A51, 0xB459, 0x8A52, 0xB45A, 0x8A53, 0xB45B, 0x8A54, 0xB45C, 0x8A55, 0xB45D, 0x8A56, 0xB45E, + 0x8A57, 0xB45F, 0x8A58, 0xB462, 0x8A59, 0xB464, 0x8A5A, 0xB466, 0x8A61, 0xB467, 0x8A62, 0xB468, 0x8A63, 0xB469, 0x8A64, 0xB46A, + 0x8A65, 0xB46B, 0x8A66, 0xB46D, 0x8A67, 0xB46E, 0x8A68, 0xB46F, 0x8A69, 0xB470, 0x8A6A, 0xB471, 0x8A6B, 0xB472, 0x8A6C, 0xB473, + 0x8A6D, 0xB474, 0x8A6E, 0xB475, 0x8A6F, 0xB476, 0x8A70, 0xB477, 0x8A71, 0xB478, 0x8A72, 0xB479, 0x8A73, 0xB47A, 0x8A74, 0xB47B, + 0x8A75, 0xB47C, 0x8A76, 0xB47D, 0x8A77, 0xB47E, 0x8A78, 0xB47F, 0x8A79, 0xB481, 0x8A7A, 0xB482, 0x8A81, 0xB483, 0x8A82, 0xB484, + 0x8A83, 0xB485, 0x8A84, 0xB486, 0x8A85, 0xB487, 0x8A86, 0xB489, 0x8A87, 0xB48A, 0x8A88, 0xB48B, 0x8A89, 0xB48C, 0x8A8A, 0xB48D, + 0x8A8B, 0xB48E, 0x8A8C, 0xB48F, 0x8A8D, 0xB490, 0x8A8E, 0xB491, 0x8A8F, 0xB492, 0x8A90, 0xB493, 0x8A91, 0xB494, 0x8A92, 0xB495, + 0x8A93, 0xB496, 0x8A94, 0xB497, 0x8A95, 0xB498, 0x8A96, 0xB499, 0x8A97, 0xB49A, 0x8A98, 0xB49B, 0x8A99, 0xB49C, 0x8A9A, 0xB49E, + 0x8A9B, 0xB49F, 0x8A9C, 0xB4A0, 0x8A9D, 0xB4A1, 0x8A9E, 0xB4A2, 0x8A9F, 0xB4A3, 0x8AA0, 0xB4A5, 0x8AA1, 0xB4A6, 0x8AA2, 0xB4A7, + 0x8AA3, 0xB4A9, 0x8AA4, 0xB4AA, 0x8AA5, 0xB4AB, 0x8AA6, 0xB4AD, 0x8AA7, 0xB4AE, 0x8AA8, 0xB4AF, 0x8AA9, 0xB4B0, 0x8AAA, 0xB4B1, + 0x8AAB, 0xB4B2, 0x8AAC, 0xB4B3, 0x8AAD, 0xB4B4, 0x8AAE, 0xB4B6, 0x8AAF, 0xB4B8, 0x8AB0, 0xB4BA, 0x8AB1, 0xB4BB, 0x8AB2, 0xB4BC, + 0x8AB3, 0xB4BD, 0x8AB4, 0xB4BE, 0x8AB5, 0xB4BF, 0x8AB6, 0xB4C1, 0x8AB7, 0xB4C2, 0x8AB8, 0xB4C3, 0x8AB9, 0xB4C5, 0x8ABA, 0xB4C6, + 0x8ABB, 0xB4C7, 0x8ABC, 0xB4C9, 0x8ABD, 0xB4CA, 0x8ABE, 0xB4CB, 0x8ABF, 0xB4CC, 0x8AC0, 0xB4CD, 0x8AC1, 0xB4CE, 0x8AC2, 0xB4CF, + 0x8AC3, 0xB4D1, 0x8AC4, 0xB4D2, 0x8AC5, 0xB4D3, 0x8AC6, 0xB4D4, 0x8AC7, 0xB4D6, 0x8AC8, 0xB4D7, 0x8AC9, 0xB4D8, 0x8ACA, 0xB4D9, + 0x8ACB, 0xB4DA, 0x8ACC, 0xB4DB, 0x8ACD, 0xB4DE, 0x8ACE, 0xB4DF, 0x8ACF, 0xB4E1, 0x8AD0, 0xB4E2, 0x8AD1, 0xB4E5, 0x8AD2, 0xB4E7, + 0x8AD3, 0xB4E8, 0x8AD4, 0xB4E9, 0x8AD5, 0xB4EA, 0x8AD6, 0xB4EB, 0x8AD7, 0xB4EE, 0x8AD8, 0xB4F0, 0x8AD9, 0xB4F2, 0x8ADA, 0xB4F3, + 0x8ADB, 0xB4F4, 0x8ADC, 0xB4F5, 0x8ADD, 0xB4F6, 0x8ADE, 0xB4F7, 0x8ADF, 0xB4F9, 0x8AE0, 0xB4FA, 0x8AE1, 0xB4FB, 0x8AE2, 0xB4FC, + 0x8AE3, 0xB4FD, 0x8AE4, 0xB4FE, 0x8AE5, 0xB4FF, 0x8AE6, 0xB500, 0x8AE7, 0xB501, 0x8AE8, 0xB502, 0x8AE9, 0xB503, 0x8AEA, 0xB504, + 0x8AEB, 0xB505, 0x8AEC, 0xB506, 0x8AED, 0xB507, 0x8AEE, 0xB508, 0x8AEF, 0xB509, 0x8AF0, 0xB50A, 0x8AF1, 0xB50B, 0x8AF2, 0xB50C, + 0x8AF3, 0xB50D, 0x8AF4, 0xB50E, 0x8AF5, 0xB50F, 0x8AF6, 0xB510, 0x8AF7, 0xB511, 0x8AF8, 0xB512, 0x8AF9, 0xB513, 0x8AFA, 0xB516, + 0x8AFB, 0xB517, 0x8AFC, 0xB519, 0x8AFD, 0xB51A, 0x8AFE, 0xB51D, 0x8B41, 0xB51E, 0x8B42, 0xB51F, 0x8B43, 0xB520, 0x8B44, 0xB521, + 0x8B45, 0xB522, 0x8B46, 0xB523, 0x8B47, 0xB526, 0x8B48, 0xB52B, 0x8B49, 0xB52C, 0x8B4A, 0xB52D, 0x8B4B, 0xB52E, 0x8B4C, 0xB52F, + 0x8B4D, 0xB532, 0x8B4E, 0xB533, 0x8B4F, 0xB535, 0x8B50, 0xB536, 0x8B51, 0xB537, 0x8B52, 0xB539, 0x8B53, 0xB53A, 0x8B54, 0xB53B, + 0x8B55, 0xB53C, 0x8B56, 0xB53D, 0x8B57, 0xB53E, 0x8B58, 0xB53F, 0x8B59, 0xB542, 0x8B5A, 0xB546, 0x8B61, 0xB547, 0x8B62, 0xB548, + 0x8B63, 0xB549, 0x8B64, 0xB54A, 0x8B65, 0xB54E, 0x8B66, 0xB54F, 0x8B67, 0xB551, 0x8B68, 0xB552, 0x8B69, 0xB553, 0x8B6A, 0xB555, + 0x8B6B, 0xB556, 0x8B6C, 0xB557, 0x8B6D, 0xB558, 0x8B6E, 0xB559, 0x8B6F, 0xB55A, 0x8B70, 0xB55B, 0x8B71, 0xB55E, 0x8B72, 0xB562, + 0x8B73, 0xB563, 0x8B74, 0xB564, 0x8B75, 0xB565, 0x8B76, 0xB566, 0x8B77, 0xB567, 0x8B78, 0xB568, 0x8B79, 0xB569, 0x8B7A, 0xB56A, + 0x8B81, 0xB56B, 0x8B82, 0xB56C, 0x8B83, 0xB56D, 0x8B84, 0xB56E, 0x8B85, 0xB56F, 0x8B86, 0xB570, 0x8B87, 0xB571, 0x8B88, 0xB572, + 0x8B89, 0xB573, 0x8B8A, 0xB574, 0x8B8B, 0xB575, 0x8B8C, 0xB576, 0x8B8D, 0xB577, 0x8B8E, 0xB578, 0x8B8F, 0xB579, 0x8B90, 0xB57A, + 0x8B91, 0xB57B, 0x8B92, 0xB57C, 0x8B93, 0xB57D, 0x8B94, 0xB57E, 0x8B95, 0xB57F, 0x8B96, 0xB580, 0x8B97, 0xB581, 0x8B98, 0xB582, + 0x8B99, 0xB583, 0x8B9A, 0xB584, 0x8B9B, 0xB585, 0x8B9C, 0xB586, 0x8B9D, 0xB587, 0x8B9E, 0xB588, 0x8B9F, 0xB589, 0x8BA0, 0xB58A, + 0x8BA1, 0xB58B, 0x8BA2, 0xB58C, 0x8BA3, 0xB58D, 0x8BA4, 0xB58E, 0x8BA5, 0xB58F, 0x8BA6, 0xB590, 0x8BA7, 0xB591, 0x8BA8, 0xB592, + 0x8BA9, 0xB593, 0x8BAA, 0xB594, 0x8BAB, 0xB595, 0x8BAC, 0xB596, 0x8BAD, 0xB597, 0x8BAE, 0xB598, 0x8BAF, 0xB599, 0x8BB0, 0xB59A, + 0x8BB1, 0xB59B, 0x8BB2, 0xB59C, 0x8BB3, 0xB59D, 0x8BB4, 0xB59E, 0x8BB5, 0xB59F, 0x8BB6, 0xB5A2, 0x8BB7, 0xB5A3, 0x8BB8, 0xB5A5, + 0x8BB9, 0xB5A6, 0x8BBA, 0xB5A7, 0x8BBB, 0xB5A9, 0x8BBC, 0xB5AC, 0x8BBD, 0xB5AD, 0x8BBE, 0xB5AE, 0x8BBF, 0xB5AF, 0x8BC0, 0xB5B2, + 0x8BC1, 0xB5B6, 0x8BC2, 0xB5B7, 0x8BC3, 0xB5B8, 0x8BC4, 0xB5B9, 0x8BC5, 0xB5BA, 0x8BC6, 0xB5BE, 0x8BC7, 0xB5BF, 0x8BC8, 0xB5C1, + 0x8BC9, 0xB5C2, 0x8BCA, 0xB5C3, 0x8BCB, 0xB5C5, 0x8BCC, 0xB5C6, 0x8BCD, 0xB5C7, 0x8BCE, 0xB5C8, 0x8BCF, 0xB5C9, 0x8BD0, 0xB5CA, + 0x8BD1, 0xB5CB, 0x8BD2, 0xB5CE, 0x8BD3, 0xB5D2, 0x8BD4, 0xB5D3, 0x8BD5, 0xB5D4, 0x8BD6, 0xB5D5, 0x8BD7, 0xB5D6, 0x8BD8, 0xB5D7, + 0x8BD9, 0xB5D9, 0x8BDA, 0xB5DA, 0x8BDB, 0xB5DB, 0x8BDC, 0xB5DC, 0x8BDD, 0xB5DD, 0x8BDE, 0xB5DE, 0x8BDF, 0xB5DF, 0x8BE0, 0xB5E0, + 0x8BE1, 0xB5E1, 0x8BE2, 0xB5E2, 0x8BE3, 0xB5E3, 0x8BE4, 0xB5E4, 0x8BE5, 0xB5E5, 0x8BE6, 0xB5E6, 0x8BE7, 0xB5E7, 0x8BE8, 0xB5E8, + 0x8BE9, 0xB5E9, 0x8BEA, 0xB5EA, 0x8BEB, 0xB5EB, 0x8BEC, 0xB5ED, 0x8BED, 0xB5EE, 0x8BEE, 0xB5EF, 0x8BEF, 0xB5F0, 0x8BF0, 0xB5F1, + 0x8BF1, 0xB5F2, 0x8BF2, 0xB5F3, 0x8BF3, 0xB5F4, 0x8BF4, 0xB5F5, 0x8BF5, 0xB5F6, 0x8BF6, 0xB5F7, 0x8BF7, 0xB5F8, 0x8BF8, 0xB5F9, + 0x8BF9, 0xB5FA, 0x8BFA, 0xB5FB, 0x8BFB, 0xB5FC, 0x8BFC, 0xB5FD, 0x8BFD, 0xB5FE, 0x8BFE, 0xB5FF, 0x8C41, 0xB600, 0x8C42, 0xB601, + 0x8C43, 0xB602, 0x8C44, 0xB603, 0x8C45, 0xB604, 0x8C46, 0xB605, 0x8C47, 0xB606, 0x8C48, 0xB607, 0x8C49, 0xB608, 0x8C4A, 0xB609, + 0x8C4B, 0xB60A, 0x8C4C, 0xB60B, 0x8C4D, 0xB60C, 0x8C4E, 0xB60D, 0x8C4F, 0xB60E, 0x8C50, 0xB60F, 0x8C51, 0xB612, 0x8C52, 0xB613, + 0x8C53, 0xB615, 0x8C54, 0xB616, 0x8C55, 0xB617, 0x8C56, 0xB619, 0x8C57, 0xB61A, 0x8C58, 0xB61B, 0x8C59, 0xB61C, 0x8C5A, 0xB61D, + 0x8C61, 0xB61E, 0x8C62, 0xB61F, 0x8C63, 0xB620, 0x8C64, 0xB621, 0x8C65, 0xB622, 0x8C66, 0xB623, 0x8C67, 0xB624, 0x8C68, 0xB626, + 0x8C69, 0xB627, 0x8C6A, 0xB628, 0x8C6B, 0xB629, 0x8C6C, 0xB62A, 0x8C6D, 0xB62B, 0x8C6E, 0xB62D, 0x8C6F, 0xB62E, 0x8C70, 0xB62F, + 0x8C71, 0xB630, 0x8C72, 0xB631, 0x8C73, 0xB632, 0x8C74, 0xB633, 0x8C75, 0xB635, 0x8C76, 0xB636, 0x8C77, 0xB637, 0x8C78, 0xB638, + 0x8C79, 0xB639, 0x8C7A, 0xB63A, 0x8C81, 0xB63B, 0x8C82, 0xB63C, 0x8C83, 0xB63D, 0x8C84, 0xB63E, 0x8C85, 0xB63F, 0x8C86, 0xB640, + 0x8C87, 0xB641, 0x8C88, 0xB642, 0x8C89, 0xB643, 0x8C8A, 0xB644, 0x8C8B, 0xB645, 0x8C8C, 0xB646, 0x8C8D, 0xB647, 0x8C8E, 0xB649, + 0x8C8F, 0xB64A, 0x8C90, 0xB64B, 0x8C91, 0xB64C, 0x8C92, 0xB64D, 0x8C93, 0xB64E, 0x8C94, 0xB64F, 0x8C95, 0xB650, 0x8C96, 0xB651, + 0x8C97, 0xB652, 0x8C98, 0xB653, 0x8C99, 0xB654, 0x8C9A, 0xB655, 0x8C9B, 0xB656, 0x8C9C, 0xB657, 0x8C9D, 0xB658, 0x8C9E, 0xB659, + 0x8C9F, 0xB65A, 0x8CA0, 0xB65B, 0x8CA1, 0xB65C, 0x8CA2, 0xB65D, 0x8CA3, 0xB65E, 0x8CA4, 0xB65F, 0x8CA5, 0xB660, 0x8CA6, 0xB661, + 0x8CA7, 0xB662, 0x8CA8, 0xB663, 0x8CA9, 0xB665, 0x8CAA, 0xB666, 0x8CAB, 0xB667, 0x8CAC, 0xB669, 0x8CAD, 0xB66A, 0x8CAE, 0xB66B, + 0x8CAF, 0xB66C, 0x8CB0, 0xB66D, 0x8CB1, 0xB66E, 0x8CB2, 0xB66F, 0x8CB3, 0xB670, 0x8CB4, 0xB671, 0x8CB5, 0xB672, 0x8CB6, 0xB673, + 0x8CB7, 0xB674, 0x8CB8, 0xB675, 0x8CB9, 0xB676, 0x8CBA, 0xB677, 0x8CBB, 0xB678, 0x8CBC, 0xB679, 0x8CBD, 0xB67A, 0x8CBE, 0xB67B, + 0x8CBF, 0xB67C, 0x8CC0, 0xB67D, 0x8CC1, 0xB67E, 0x8CC2, 0xB67F, 0x8CC3, 0xB680, 0x8CC4, 0xB681, 0x8CC5, 0xB682, 0x8CC6, 0xB683, + 0x8CC7, 0xB684, 0x8CC8, 0xB685, 0x8CC9, 0xB686, 0x8CCA, 0xB687, 0x8CCB, 0xB688, 0x8CCC, 0xB689, 0x8CCD, 0xB68A, 0x8CCE, 0xB68B, + 0x8CCF, 0xB68C, 0x8CD0, 0xB68D, 0x8CD1, 0xB68E, 0x8CD2, 0xB68F, 0x8CD3, 0xB690, 0x8CD4, 0xB691, 0x8CD5, 0xB692, 0x8CD6, 0xB693, + 0x8CD7, 0xB694, 0x8CD8, 0xB695, 0x8CD9, 0xB696, 0x8CDA, 0xB697, 0x8CDB, 0xB698, 0x8CDC, 0xB699, 0x8CDD, 0xB69A, 0x8CDE, 0xB69B, + 0x8CDF, 0xB69E, 0x8CE0, 0xB69F, 0x8CE1, 0xB6A1, 0x8CE2, 0xB6A2, 0x8CE3, 0xB6A3, 0x8CE4, 0xB6A5, 0x8CE5, 0xB6A6, 0x8CE6, 0xB6A7, + 0x8CE7, 0xB6A8, 0x8CE8, 0xB6A9, 0x8CE9, 0xB6AA, 0x8CEA, 0xB6AD, 0x8CEB, 0xB6AE, 0x8CEC, 0xB6AF, 0x8CED, 0xB6B0, 0x8CEE, 0xB6B2, + 0x8CEF, 0xB6B3, 0x8CF0, 0xB6B4, 0x8CF1, 0xB6B5, 0x8CF2, 0xB6B6, 0x8CF3, 0xB6B7, 0x8CF4, 0xB6B8, 0x8CF5, 0xB6B9, 0x8CF6, 0xB6BA, + 0x8CF7, 0xB6BB, 0x8CF8, 0xB6BC, 0x8CF9, 0xB6BD, 0x8CFA, 0xB6BE, 0x8CFB, 0xB6BF, 0x8CFC, 0xB6C0, 0x8CFD, 0xB6C1, 0x8CFE, 0xB6C2, + 0x8D41, 0xB6C3, 0x8D42, 0xB6C4, 0x8D43, 0xB6C5, 0x8D44, 0xB6C6, 0x8D45, 0xB6C7, 0x8D46, 0xB6C8, 0x8D47, 0xB6C9, 0x8D48, 0xB6CA, + 0x8D49, 0xB6CB, 0x8D4A, 0xB6CC, 0x8D4B, 0xB6CD, 0x8D4C, 0xB6CE, 0x8D4D, 0xB6CF, 0x8D4E, 0xB6D0, 0x8D4F, 0xB6D1, 0x8D50, 0xB6D2, + 0x8D51, 0xB6D3, 0x8D52, 0xB6D5, 0x8D53, 0xB6D6, 0x8D54, 0xB6D7, 0x8D55, 0xB6D8, 0x8D56, 0xB6D9, 0x8D57, 0xB6DA, 0x8D58, 0xB6DB, + 0x8D59, 0xB6DC, 0x8D5A, 0xB6DD, 0x8D61, 0xB6DE, 0x8D62, 0xB6DF, 0x8D63, 0xB6E0, 0x8D64, 0xB6E1, 0x8D65, 0xB6E2, 0x8D66, 0xB6E3, + 0x8D67, 0xB6E4, 0x8D68, 0xB6E5, 0x8D69, 0xB6E6, 0x8D6A, 0xB6E7, 0x8D6B, 0xB6E8, 0x8D6C, 0xB6E9, 0x8D6D, 0xB6EA, 0x8D6E, 0xB6EB, + 0x8D6F, 0xB6EC, 0x8D70, 0xB6ED, 0x8D71, 0xB6EE, 0x8D72, 0xB6EF, 0x8D73, 0xB6F1, 0x8D74, 0xB6F2, 0x8D75, 0xB6F3, 0x8D76, 0xB6F5, + 0x8D77, 0xB6F6, 0x8D78, 0xB6F7, 0x8D79, 0xB6F9, 0x8D7A, 0xB6FA, 0x8D81, 0xB6FB, 0x8D82, 0xB6FC, 0x8D83, 0xB6FD, 0x8D84, 0xB6FE, + 0x8D85, 0xB6FF, 0x8D86, 0xB702, 0x8D87, 0xB703, 0x8D88, 0xB704, 0x8D89, 0xB706, 0x8D8A, 0xB707, 0x8D8B, 0xB708, 0x8D8C, 0xB709, + 0x8D8D, 0xB70A, 0x8D8E, 0xB70B, 0x8D8F, 0xB70C, 0x8D90, 0xB70D, 0x8D91, 0xB70E, 0x8D92, 0xB70F, 0x8D93, 0xB710, 0x8D94, 0xB711, + 0x8D95, 0xB712, 0x8D96, 0xB713, 0x8D97, 0xB714, 0x8D98, 0xB715, 0x8D99, 0xB716, 0x8D9A, 0xB717, 0x8D9B, 0xB718, 0x8D9C, 0xB719, + 0x8D9D, 0xB71A, 0x8D9E, 0xB71B, 0x8D9F, 0xB71C, 0x8DA0, 0xB71D, 0x8DA1, 0xB71E, 0x8DA2, 0xB71F, 0x8DA3, 0xB720, 0x8DA4, 0xB721, + 0x8DA5, 0xB722, 0x8DA6, 0xB723, 0x8DA7, 0xB724, 0x8DA8, 0xB725, 0x8DA9, 0xB726, 0x8DAA, 0xB727, 0x8DAB, 0xB72A, 0x8DAC, 0xB72B, + 0x8DAD, 0xB72D, 0x8DAE, 0xB72E, 0x8DAF, 0xB731, 0x8DB0, 0xB732, 0x8DB1, 0xB733, 0x8DB2, 0xB734, 0x8DB3, 0xB735, 0x8DB4, 0xB736, + 0x8DB5, 0xB737, 0x8DB6, 0xB73A, 0x8DB7, 0xB73C, 0x8DB8, 0xB73D, 0x8DB9, 0xB73E, 0x8DBA, 0xB73F, 0x8DBB, 0xB740, 0x8DBC, 0xB741, + 0x8DBD, 0xB742, 0x8DBE, 0xB743, 0x8DBF, 0xB745, 0x8DC0, 0xB746, 0x8DC1, 0xB747, 0x8DC2, 0xB749, 0x8DC3, 0xB74A, 0x8DC4, 0xB74B, + 0x8DC5, 0xB74D, 0x8DC6, 0xB74E, 0x8DC7, 0xB74F, 0x8DC8, 0xB750, 0x8DC9, 0xB751, 0x8DCA, 0xB752, 0x8DCB, 0xB753, 0x8DCC, 0xB756, + 0x8DCD, 0xB757, 0x8DCE, 0xB758, 0x8DCF, 0xB759, 0x8DD0, 0xB75A, 0x8DD1, 0xB75B, 0x8DD2, 0xB75C, 0x8DD3, 0xB75D, 0x8DD4, 0xB75E, + 0x8DD5, 0xB75F, 0x8DD6, 0xB761, 0x8DD7, 0xB762, 0x8DD8, 0xB763, 0x8DD9, 0xB765, 0x8DDA, 0xB766, 0x8DDB, 0xB767, 0x8DDC, 0xB769, + 0x8DDD, 0xB76A, 0x8DDE, 0xB76B, 0x8DDF, 0xB76C, 0x8DE0, 0xB76D, 0x8DE1, 0xB76E, 0x8DE2, 0xB76F, 0x8DE3, 0xB772, 0x8DE4, 0xB774, + 0x8DE5, 0xB776, 0x8DE6, 0xB777, 0x8DE7, 0xB778, 0x8DE8, 0xB779, 0x8DE9, 0xB77A, 0x8DEA, 0xB77B, 0x8DEB, 0xB77E, 0x8DEC, 0xB77F, + 0x8DED, 0xB781, 0x8DEE, 0xB782, 0x8DEF, 0xB783, 0x8DF0, 0xB785, 0x8DF1, 0xB786, 0x8DF2, 0xB787, 0x8DF3, 0xB788, 0x8DF4, 0xB789, + 0x8DF5, 0xB78A, 0x8DF6, 0xB78B, 0x8DF7, 0xB78E, 0x8DF8, 0xB793, 0x8DF9, 0xB794, 0x8DFA, 0xB795, 0x8DFB, 0xB79A, 0x8DFC, 0xB79B, + 0x8DFD, 0xB79D, 0x8DFE, 0xB79E, 0x8E41, 0xB79F, 0x8E42, 0xB7A1, 0x8E43, 0xB7A2, 0x8E44, 0xB7A3, 0x8E45, 0xB7A4, 0x8E46, 0xB7A5, + 0x8E47, 0xB7A6, 0x8E48, 0xB7A7, 0x8E49, 0xB7AA, 0x8E4A, 0xB7AE, 0x8E4B, 0xB7AF, 0x8E4C, 0xB7B0, 0x8E4D, 0xB7B1, 0x8E4E, 0xB7B2, + 0x8E4F, 0xB7B3, 0x8E50, 0xB7B6, 0x8E51, 0xB7B7, 0x8E52, 0xB7B9, 0x8E53, 0xB7BA, 0x8E54, 0xB7BB, 0x8E55, 0xB7BC, 0x8E56, 0xB7BD, + 0x8E57, 0xB7BE, 0x8E58, 0xB7BF, 0x8E59, 0xB7C0, 0x8E5A, 0xB7C1, 0x8E61, 0xB7C2, 0x8E62, 0xB7C3, 0x8E63, 0xB7C4, 0x8E64, 0xB7C5, + 0x8E65, 0xB7C6, 0x8E66, 0xB7C8, 0x8E67, 0xB7CA, 0x8E68, 0xB7CB, 0x8E69, 0xB7CC, 0x8E6A, 0xB7CD, 0x8E6B, 0xB7CE, 0x8E6C, 0xB7CF, + 0x8E6D, 0xB7D0, 0x8E6E, 0xB7D1, 0x8E6F, 0xB7D2, 0x8E70, 0xB7D3, 0x8E71, 0xB7D4, 0x8E72, 0xB7D5, 0x8E73, 0xB7D6, 0x8E74, 0xB7D7, + 0x8E75, 0xB7D8, 0x8E76, 0xB7D9, 0x8E77, 0xB7DA, 0x8E78, 0xB7DB, 0x8E79, 0xB7DC, 0x8E7A, 0xB7DD, 0x8E81, 0xB7DE, 0x8E82, 0xB7DF, + 0x8E83, 0xB7E0, 0x8E84, 0xB7E1, 0x8E85, 0xB7E2, 0x8E86, 0xB7E3, 0x8E87, 0xB7E4, 0x8E88, 0xB7E5, 0x8E89, 0xB7E6, 0x8E8A, 0xB7E7, + 0x8E8B, 0xB7E8, 0x8E8C, 0xB7E9, 0x8E8D, 0xB7EA, 0x8E8E, 0xB7EB, 0x8E8F, 0xB7EE, 0x8E90, 0xB7EF, 0x8E91, 0xB7F1, 0x8E92, 0xB7F2, + 0x8E93, 0xB7F3, 0x8E94, 0xB7F5, 0x8E95, 0xB7F6, 0x8E96, 0xB7F7, 0x8E97, 0xB7F8, 0x8E98, 0xB7F9, 0x8E99, 0xB7FA, 0x8E9A, 0xB7FB, + 0x8E9B, 0xB7FE, 0x8E9C, 0xB802, 0x8E9D, 0xB803, 0x8E9E, 0xB804, 0x8E9F, 0xB805, 0x8EA0, 0xB806, 0x8EA1, 0xB80A, 0x8EA2, 0xB80B, + 0x8EA3, 0xB80D, 0x8EA4, 0xB80E, 0x8EA5, 0xB80F, 0x8EA6, 0xB811, 0x8EA7, 0xB812, 0x8EA8, 0xB813, 0x8EA9, 0xB814, 0x8EAA, 0xB815, + 0x8EAB, 0xB816, 0x8EAC, 0xB817, 0x8EAD, 0xB81A, 0x8EAE, 0xB81C, 0x8EAF, 0xB81E, 0x8EB0, 0xB81F, 0x8EB1, 0xB820, 0x8EB2, 0xB821, + 0x8EB3, 0xB822, 0x8EB4, 0xB823, 0x8EB5, 0xB826, 0x8EB6, 0xB827, 0x8EB7, 0xB829, 0x8EB8, 0xB82A, 0x8EB9, 0xB82B, 0x8EBA, 0xB82D, + 0x8EBB, 0xB82E, 0x8EBC, 0xB82F, 0x8EBD, 0xB830, 0x8EBE, 0xB831, 0x8EBF, 0xB832, 0x8EC0, 0xB833, 0x8EC1, 0xB836, 0x8EC2, 0xB83A, + 0x8EC3, 0xB83B, 0x8EC4, 0xB83C, 0x8EC5, 0xB83D, 0x8EC6, 0xB83E, 0x8EC7, 0xB83F, 0x8EC8, 0xB841, 0x8EC9, 0xB842, 0x8ECA, 0xB843, + 0x8ECB, 0xB845, 0x8ECC, 0xB846, 0x8ECD, 0xB847, 0x8ECE, 0xB848, 0x8ECF, 0xB849, 0x8ED0, 0xB84A, 0x8ED1, 0xB84B, 0x8ED2, 0xB84C, + 0x8ED3, 0xB84D, 0x8ED4, 0xB84E, 0x8ED5, 0xB84F, 0x8ED6, 0xB850, 0x8ED7, 0xB852, 0x8ED8, 0xB854, 0x8ED9, 0xB855, 0x8EDA, 0xB856, + 0x8EDB, 0xB857, 0x8EDC, 0xB858, 0x8EDD, 0xB859, 0x8EDE, 0xB85A, 0x8EDF, 0xB85B, 0x8EE0, 0xB85E, 0x8EE1, 0xB85F, 0x8EE2, 0xB861, + 0x8EE3, 0xB862, 0x8EE4, 0xB863, 0x8EE5, 0xB865, 0x8EE6, 0xB866, 0x8EE7, 0xB867, 0x8EE8, 0xB868, 0x8EE9, 0xB869, 0x8EEA, 0xB86A, + 0x8EEB, 0xB86B, 0x8EEC, 0xB86E, 0x8EED, 0xB870, 0x8EEE, 0xB872, 0x8EEF, 0xB873, 0x8EF0, 0xB874, 0x8EF1, 0xB875, 0x8EF2, 0xB876, + 0x8EF3, 0xB877, 0x8EF4, 0xB879, 0x8EF5, 0xB87A, 0x8EF6, 0xB87B, 0x8EF7, 0xB87D, 0x8EF8, 0xB87E, 0x8EF9, 0xB87F, 0x8EFA, 0xB880, + 0x8EFB, 0xB881, 0x8EFC, 0xB882, 0x8EFD, 0xB883, 0x8EFE, 0xB884, 0x8F41, 0xB885, 0x8F42, 0xB886, 0x8F43, 0xB887, 0x8F44, 0xB888, + 0x8F45, 0xB889, 0x8F46, 0xB88A, 0x8F47, 0xB88B, 0x8F48, 0xB88C, 0x8F49, 0xB88E, 0x8F4A, 0xB88F, 0x8F4B, 0xB890, 0x8F4C, 0xB891, + 0x8F4D, 0xB892, 0x8F4E, 0xB893, 0x8F4F, 0xB894, 0x8F50, 0xB895, 0x8F51, 0xB896, 0x8F52, 0xB897, 0x8F53, 0xB898, 0x8F54, 0xB899, + 0x8F55, 0xB89A, 0x8F56, 0xB89B, 0x8F57, 0xB89C, 0x8F58, 0xB89D, 0x8F59, 0xB89E, 0x8F5A, 0xB89F, 0x8F61, 0xB8A0, 0x8F62, 0xB8A1, + 0x8F63, 0xB8A2, 0x8F64, 0xB8A3, 0x8F65, 0xB8A4, 0x8F66, 0xB8A5, 0x8F67, 0xB8A6, 0x8F68, 0xB8A7, 0x8F69, 0xB8A9, 0x8F6A, 0xB8AA, + 0x8F6B, 0xB8AB, 0x8F6C, 0xB8AC, 0x8F6D, 0xB8AD, 0x8F6E, 0xB8AE, 0x8F6F, 0xB8AF, 0x8F70, 0xB8B1, 0x8F71, 0xB8B2, 0x8F72, 0xB8B3, + 0x8F73, 0xB8B5, 0x8F74, 0xB8B6, 0x8F75, 0xB8B7, 0x8F76, 0xB8B9, 0x8F77, 0xB8BA, 0x8F78, 0xB8BB, 0x8F79, 0xB8BC, 0x8F7A, 0xB8BD, + 0x8F81, 0xB8BE, 0x8F82, 0xB8BF, 0x8F83, 0xB8C2, 0x8F84, 0xB8C4, 0x8F85, 0xB8C6, 0x8F86, 0xB8C7, 0x8F87, 0xB8C8, 0x8F88, 0xB8C9, + 0x8F89, 0xB8CA, 0x8F8A, 0xB8CB, 0x8F8B, 0xB8CD, 0x8F8C, 0xB8CE, 0x8F8D, 0xB8CF, 0x8F8E, 0xB8D1, 0x8F8F, 0xB8D2, 0x8F90, 0xB8D3, + 0x8F91, 0xB8D5, 0x8F92, 0xB8D6, 0x8F93, 0xB8D7, 0x8F94, 0xB8D8, 0x8F95, 0xB8D9, 0x8F96, 0xB8DA, 0x8F97, 0xB8DB, 0x8F98, 0xB8DC, + 0x8F99, 0xB8DE, 0x8F9A, 0xB8E0, 0x8F9B, 0xB8E2, 0x8F9C, 0xB8E3, 0x8F9D, 0xB8E4, 0x8F9E, 0xB8E5, 0x8F9F, 0xB8E6, 0x8FA0, 0xB8E7, + 0x8FA1, 0xB8EA, 0x8FA2, 0xB8EB, 0x8FA3, 0xB8ED, 0x8FA4, 0xB8EE, 0x8FA5, 0xB8EF, 0x8FA6, 0xB8F1, 0x8FA7, 0xB8F2, 0x8FA8, 0xB8F3, + 0x8FA9, 0xB8F4, 0x8FAA, 0xB8F5, 0x8FAB, 0xB8F6, 0x8FAC, 0xB8F7, 0x8FAD, 0xB8FA, 0x8FAE, 0xB8FC, 0x8FAF, 0xB8FE, 0x8FB0, 0xB8FF, + 0x8FB1, 0xB900, 0x8FB2, 0xB901, 0x8FB3, 0xB902, 0x8FB4, 0xB903, 0x8FB5, 0xB905, 0x8FB6, 0xB906, 0x8FB7, 0xB907, 0x8FB8, 0xB908, + 0x8FB9, 0xB909, 0x8FBA, 0xB90A, 0x8FBB, 0xB90B, 0x8FBC, 0xB90C, 0x8FBD, 0xB90D, 0x8FBE, 0xB90E, 0x8FBF, 0xB90F, 0x8FC0, 0xB910, + 0x8FC1, 0xB911, 0x8FC2, 0xB912, 0x8FC3, 0xB913, 0x8FC4, 0xB914, 0x8FC5, 0xB915, 0x8FC6, 0xB916, 0x8FC7, 0xB917, 0x8FC8, 0xB919, + 0x8FC9, 0xB91A, 0x8FCA, 0xB91B, 0x8FCB, 0xB91C, 0x8FCC, 0xB91D, 0x8FCD, 0xB91E, 0x8FCE, 0xB91F, 0x8FCF, 0xB921, 0x8FD0, 0xB922, + 0x8FD1, 0xB923, 0x8FD2, 0xB924, 0x8FD3, 0xB925, 0x8FD4, 0xB926, 0x8FD5, 0xB927, 0x8FD6, 0xB928, 0x8FD7, 0xB929, 0x8FD8, 0xB92A, + 0x8FD9, 0xB92B, 0x8FDA, 0xB92C, 0x8FDB, 0xB92D, 0x8FDC, 0xB92E, 0x8FDD, 0xB92F, 0x8FDE, 0xB930, 0x8FDF, 0xB931, 0x8FE0, 0xB932, + 0x8FE1, 0xB933, 0x8FE2, 0xB934, 0x8FE3, 0xB935, 0x8FE4, 0xB936, 0x8FE5, 0xB937, 0x8FE6, 0xB938, 0x8FE7, 0xB939, 0x8FE8, 0xB93A, + 0x8FE9, 0xB93B, 0x8FEA, 0xB93E, 0x8FEB, 0xB93F, 0x8FEC, 0xB941, 0x8FED, 0xB942, 0x8FEE, 0xB943, 0x8FEF, 0xB945, 0x8FF0, 0xB946, + 0x8FF1, 0xB947, 0x8FF2, 0xB948, 0x8FF3, 0xB949, 0x8FF4, 0xB94A, 0x8FF5, 0xB94B, 0x8FF6, 0xB94D, 0x8FF7, 0xB94E, 0x8FF8, 0xB950, + 0x8FF9, 0xB952, 0x8FFA, 0xB953, 0x8FFB, 0xB954, 0x8FFC, 0xB955, 0x8FFD, 0xB956, 0x8FFE, 0xB957, 0x9041, 0xB95A, 0x9042, 0xB95B, + 0x9043, 0xB95D, 0x9044, 0xB95E, 0x9045, 0xB95F, 0x9046, 0xB961, 0x9047, 0xB962, 0x9048, 0xB963, 0x9049, 0xB964, 0x904A, 0xB965, + 0x904B, 0xB966, 0x904C, 0xB967, 0x904D, 0xB96A, 0x904E, 0xB96C, 0x904F, 0xB96E, 0x9050, 0xB96F, 0x9051, 0xB970, 0x9052, 0xB971, + 0x9053, 0xB972, 0x9054, 0xB973, 0x9055, 0xB976, 0x9056, 0xB977, 0x9057, 0xB979, 0x9058, 0xB97A, 0x9059, 0xB97B, 0x905A, 0xB97D, + 0x9061, 0xB97E, 0x9062, 0xB97F, 0x9063, 0xB980, 0x9064, 0xB981, 0x9065, 0xB982, 0x9066, 0xB983, 0x9067, 0xB986, 0x9068, 0xB988, + 0x9069, 0xB98B, 0x906A, 0xB98C, 0x906B, 0xB98F, 0x906C, 0xB990, 0x906D, 0xB991, 0x906E, 0xB992, 0x906F, 0xB993, 0x9070, 0xB994, + 0x9071, 0xB995, 0x9072, 0xB996, 0x9073, 0xB997, 0x9074, 0xB998, 0x9075, 0xB999, 0x9076, 0xB99A, 0x9077, 0xB99B, 0x9078, 0xB99C, + 0x9079, 0xB99D, 0x907A, 0xB99E, 0x9081, 0xB99F, 0x9082, 0xB9A0, 0x9083, 0xB9A1, 0x9084, 0xB9A2, 0x9085, 0xB9A3, 0x9086, 0xB9A4, + 0x9087, 0xB9A5, 0x9088, 0xB9A6, 0x9089, 0xB9A7, 0x908A, 0xB9A8, 0x908B, 0xB9A9, 0x908C, 0xB9AA, 0x908D, 0xB9AB, 0x908E, 0xB9AE, + 0x908F, 0xB9AF, 0x9090, 0xB9B1, 0x9091, 0xB9B2, 0x9092, 0xB9B3, 0x9093, 0xB9B5, 0x9094, 0xB9B6, 0x9095, 0xB9B7, 0x9096, 0xB9B8, + 0x9097, 0xB9B9, 0x9098, 0xB9BA, 0x9099, 0xB9BB, 0x909A, 0xB9BE, 0x909B, 0xB9C0, 0x909C, 0xB9C2, 0x909D, 0xB9C3, 0x909E, 0xB9C4, + 0x909F, 0xB9C5, 0x90A0, 0xB9C6, 0x90A1, 0xB9C7, 0x90A2, 0xB9CA, 0x90A3, 0xB9CB, 0x90A4, 0xB9CD, 0x90A5, 0xB9D3, 0x90A6, 0xB9D4, + 0x90A7, 0xB9D5, 0x90A8, 0xB9D6, 0x90A9, 0xB9D7, 0x90AA, 0xB9DA, 0x90AB, 0xB9DC, 0x90AC, 0xB9DF, 0x90AD, 0xB9E0, 0x90AE, 0xB9E2, + 0x90AF, 0xB9E6, 0x90B0, 0xB9E7, 0x90B1, 0xB9E9, 0x90B2, 0xB9EA, 0x90B3, 0xB9EB, 0x90B4, 0xB9ED, 0x90B5, 0xB9EE, 0x90B6, 0xB9EF, + 0x90B7, 0xB9F0, 0x90B8, 0xB9F1, 0x90B9, 0xB9F2, 0x90BA, 0xB9F3, 0x90BB, 0xB9F6, 0x90BC, 0xB9FB, 0x90BD, 0xB9FC, 0x90BE, 0xB9FD, + 0x90BF, 0xB9FE, 0x90C0, 0xB9FF, 0x90C1, 0xBA02, 0x90C2, 0xBA03, 0x90C3, 0xBA04, 0x90C4, 0xBA05, 0x90C5, 0xBA06, 0x90C6, 0xBA07, + 0x90C7, 0xBA09, 0x90C8, 0xBA0A, 0x90C9, 0xBA0B, 0x90CA, 0xBA0C, 0x90CB, 0xBA0D, 0x90CC, 0xBA0E, 0x90CD, 0xBA0F, 0x90CE, 0xBA10, + 0x90CF, 0xBA11, 0x90D0, 0xBA12, 0x90D1, 0xBA13, 0x90D2, 0xBA14, 0x90D3, 0xBA16, 0x90D4, 0xBA17, 0x90D5, 0xBA18, 0x90D6, 0xBA19, + 0x90D7, 0xBA1A, 0x90D8, 0xBA1B, 0x90D9, 0xBA1C, 0x90DA, 0xBA1D, 0x90DB, 0xBA1E, 0x90DC, 0xBA1F, 0x90DD, 0xBA20, 0x90DE, 0xBA21, + 0x90DF, 0xBA22, 0x90E0, 0xBA23, 0x90E1, 0xBA24, 0x90E2, 0xBA25, 0x90E3, 0xBA26, 0x90E4, 0xBA27, 0x90E5, 0xBA28, 0x90E6, 0xBA29, + 0x90E7, 0xBA2A, 0x90E8, 0xBA2B, 0x90E9, 0xBA2C, 0x90EA, 0xBA2D, 0x90EB, 0xBA2E, 0x90EC, 0xBA2F, 0x90ED, 0xBA30, 0x90EE, 0xBA31, + 0x90EF, 0xBA32, 0x90F0, 0xBA33, 0x90F1, 0xBA34, 0x90F2, 0xBA35, 0x90F3, 0xBA36, 0x90F4, 0xBA37, 0x90F5, 0xBA3A, 0x90F6, 0xBA3B, + 0x90F7, 0xBA3D, 0x90F8, 0xBA3E, 0x90F9, 0xBA3F, 0x90FA, 0xBA41, 0x90FB, 0xBA43, 0x90FC, 0xBA44, 0x90FD, 0xBA45, 0x90FE, 0xBA46, + 0x9141, 0xBA47, 0x9142, 0xBA4A, 0x9143, 0xBA4C, 0x9144, 0xBA4F, 0x9145, 0xBA50, 0x9146, 0xBA51, 0x9147, 0xBA52, 0x9148, 0xBA56, + 0x9149, 0xBA57, 0x914A, 0xBA59, 0x914B, 0xBA5A, 0x914C, 0xBA5B, 0x914D, 0xBA5D, 0x914E, 0xBA5E, 0x914F, 0xBA5F, 0x9150, 0xBA60, + 0x9151, 0xBA61, 0x9152, 0xBA62, 0x9153, 0xBA63, 0x9154, 0xBA66, 0x9155, 0xBA6A, 0x9156, 0xBA6B, 0x9157, 0xBA6C, 0x9158, 0xBA6D, + 0x9159, 0xBA6E, 0x915A, 0xBA6F, 0x9161, 0xBA72, 0x9162, 0xBA73, 0x9163, 0xBA75, 0x9164, 0xBA76, 0x9165, 0xBA77, 0x9166, 0xBA79, + 0x9167, 0xBA7A, 0x9168, 0xBA7B, 0x9169, 0xBA7C, 0x916A, 0xBA7D, 0x916B, 0xBA7E, 0x916C, 0xBA7F, 0x916D, 0xBA80, 0x916E, 0xBA81, + 0x916F, 0xBA82, 0x9170, 0xBA86, 0x9171, 0xBA88, 0x9172, 0xBA89, 0x9173, 0xBA8A, 0x9174, 0xBA8B, 0x9175, 0xBA8D, 0x9176, 0xBA8E, + 0x9177, 0xBA8F, 0x9178, 0xBA90, 0x9179, 0xBA91, 0x917A, 0xBA92, 0x9181, 0xBA93, 0x9182, 0xBA94, 0x9183, 0xBA95, 0x9184, 0xBA96, + 0x9185, 0xBA97, 0x9186, 0xBA98, 0x9187, 0xBA99, 0x9188, 0xBA9A, 0x9189, 0xBA9B, 0x918A, 0xBA9C, 0x918B, 0xBA9D, 0x918C, 0xBA9E, + 0x918D, 0xBA9F, 0x918E, 0xBAA0, 0x918F, 0xBAA1, 0x9190, 0xBAA2, 0x9191, 0xBAA3, 0x9192, 0xBAA4, 0x9193, 0xBAA5, 0x9194, 0xBAA6, + 0x9195, 0xBAA7, 0x9196, 0xBAAA, 0x9197, 0xBAAD, 0x9198, 0xBAAE, 0x9199, 0xBAAF, 0x919A, 0xBAB1, 0x919B, 0xBAB3, 0x919C, 0xBAB4, + 0x919D, 0xBAB5, 0x919E, 0xBAB6, 0x919F, 0xBAB7, 0x91A0, 0xBABA, 0x91A1, 0xBABC, 0x91A2, 0xBABE, 0x91A3, 0xBABF, 0x91A4, 0xBAC0, + 0x91A5, 0xBAC1, 0x91A6, 0xBAC2, 0x91A7, 0xBAC3, 0x91A8, 0xBAC5, 0x91A9, 0xBAC6, 0x91AA, 0xBAC7, 0x91AB, 0xBAC9, 0x91AC, 0xBACA, + 0x91AD, 0xBACB, 0x91AE, 0xBACC, 0x91AF, 0xBACD, 0x91B0, 0xBACE, 0x91B1, 0xBACF, 0x91B2, 0xBAD0, 0x91B3, 0xBAD1, 0x91B4, 0xBAD2, + 0x91B5, 0xBAD3, 0x91B6, 0xBAD4, 0x91B7, 0xBAD5, 0x91B8, 0xBAD6, 0x91B9, 0xBAD7, 0x91BA, 0xBADA, 0x91BB, 0xBADB, 0x91BC, 0xBADC, + 0x91BD, 0xBADD, 0x91BE, 0xBADE, 0x91BF, 0xBADF, 0x91C0, 0xBAE0, 0x91C1, 0xBAE1, 0x91C2, 0xBAE2, 0x91C3, 0xBAE3, 0x91C4, 0xBAE4, + 0x91C5, 0xBAE5, 0x91C6, 0xBAE6, 0x91C7, 0xBAE7, 0x91C8, 0xBAE8, 0x91C9, 0xBAE9, 0x91CA, 0xBAEA, 0x91CB, 0xBAEB, 0x91CC, 0xBAEC, + 0x91CD, 0xBAED, 0x91CE, 0xBAEE, 0x91CF, 0xBAEF, 0x91D0, 0xBAF0, 0x91D1, 0xBAF1, 0x91D2, 0xBAF2, 0x91D3, 0xBAF3, 0x91D4, 0xBAF4, + 0x91D5, 0xBAF5, 0x91D6, 0xBAF6, 0x91D7, 0xBAF7, 0x91D8, 0xBAF8, 0x91D9, 0xBAF9, 0x91DA, 0xBAFA, 0x91DB, 0xBAFB, 0x91DC, 0xBAFD, + 0x91DD, 0xBAFE, 0x91DE, 0xBAFF, 0x91DF, 0xBB01, 0x91E0, 0xBB02, 0x91E1, 0xBB03, 0x91E2, 0xBB05, 0x91E3, 0xBB06, 0x91E4, 0xBB07, + 0x91E5, 0xBB08, 0x91E6, 0xBB09, 0x91E7, 0xBB0A, 0x91E8, 0xBB0B, 0x91E9, 0xBB0C, 0x91EA, 0xBB0E, 0x91EB, 0xBB10, 0x91EC, 0xBB12, + 0x91ED, 0xBB13, 0x91EE, 0xBB14, 0x91EF, 0xBB15, 0x91F0, 0xBB16, 0x91F1, 0xBB17, 0x91F2, 0xBB19, 0x91F3, 0xBB1A, 0x91F4, 0xBB1B, + 0x91F5, 0xBB1D, 0x91F6, 0xBB1E, 0x91F7, 0xBB1F, 0x91F8, 0xBB21, 0x91F9, 0xBB22, 0x91FA, 0xBB23, 0x91FB, 0xBB24, 0x91FC, 0xBB25, + 0x91FD, 0xBB26, 0x91FE, 0xBB27, 0x9241, 0xBB28, 0x9242, 0xBB2A, 0x9243, 0xBB2C, 0x9244, 0xBB2D, 0x9245, 0xBB2E, 0x9246, 0xBB2F, + 0x9247, 0xBB30, 0x9248, 0xBB31, 0x9249, 0xBB32, 0x924A, 0xBB33, 0x924B, 0xBB37, 0x924C, 0xBB39, 0x924D, 0xBB3A, 0x924E, 0xBB3F, + 0x924F, 0xBB40, 0x9250, 0xBB41, 0x9251, 0xBB42, 0x9252, 0xBB43, 0x9253, 0xBB46, 0x9254, 0xBB48, 0x9255, 0xBB4A, 0x9256, 0xBB4B, + 0x9257, 0xBB4C, 0x9258, 0xBB4E, 0x9259, 0xBB51, 0x925A, 0xBB52, 0x9261, 0xBB53, 0x9262, 0xBB55, 0x9263, 0xBB56, 0x9264, 0xBB57, + 0x9265, 0xBB59, 0x9266, 0xBB5A, 0x9267, 0xBB5B, 0x9268, 0xBB5C, 0x9269, 0xBB5D, 0x926A, 0xBB5E, 0x926B, 0xBB5F, 0x926C, 0xBB60, + 0x926D, 0xBB62, 0x926E, 0xBB64, 0x926F, 0xBB65, 0x9270, 0xBB66, 0x9271, 0xBB67, 0x9272, 0xBB68, 0x9273, 0xBB69, 0x9274, 0xBB6A, + 0x9275, 0xBB6B, 0x9276, 0xBB6D, 0x9277, 0xBB6E, 0x9278, 0xBB6F, 0x9279, 0xBB70, 0x927A, 0xBB71, 0x9281, 0xBB72, 0x9282, 0xBB73, + 0x9283, 0xBB74, 0x9284, 0xBB75, 0x9285, 0xBB76, 0x9286, 0xBB77, 0x9287, 0xBB78, 0x9288, 0xBB79, 0x9289, 0xBB7A, 0x928A, 0xBB7B, + 0x928B, 0xBB7C, 0x928C, 0xBB7D, 0x928D, 0xBB7E, 0x928E, 0xBB7F, 0x928F, 0xBB80, 0x9290, 0xBB81, 0x9291, 0xBB82, 0x9292, 0xBB83, + 0x9293, 0xBB84, 0x9294, 0xBB85, 0x9295, 0xBB86, 0x9296, 0xBB87, 0x9297, 0xBB89, 0x9298, 0xBB8A, 0x9299, 0xBB8B, 0x929A, 0xBB8D, + 0x929B, 0xBB8E, 0x929C, 0xBB8F, 0x929D, 0xBB91, 0x929E, 0xBB92, 0x929F, 0xBB93, 0x92A0, 0xBB94, 0x92A1, 0xBB95, 0x92A2, 0xBB96, + 0x92A3, 0xBB97, 0x92A4, 0xBB98, 0x92A5, 0xBB99, 0x92A6, 0xBB9A, 0x92A7, 0xBB9B, 0x92A8, 0xBB9C, 0x92A9, 0xBB9D, 0x92AA, 0xBB9E, + 0x92AB, 0xBB9F, 0x92AC, 0xBBA0, 0x92AD, 0xBBA1, 0x92AE, 0xBBA2, 0x92AF, 0xBBA3, 0x92B0, 0xBBA5, 0x92B1, 0xBBA6, 0x92B2, 0xBBA7, + 0x92B3, 0xBBA9, 0x92B4, 0xBBAA, 0x92B5, 0xBBAB, 0x92B6, 0xBBAD, 0x92B7, 0xBBAE, 0x92B8, 0xBBAF, 0x92B9, 0xBBB0, 0x92BA, 0xBBB1, + 0x92BB, 0xBBB2, 0x92BC, 0xBBB3, 0x92BD, 0xBBB5, 0x92BE, 0xBBB6, 0x92BF, 0xBBB8, 0x92C0, 0xBBB9, 0x92C1, 0xBBBA, 0x92C2, 0xBBBB, + 0x92C3, 0xBBBC, 0x92C4, 0xBBBD, 0x92C5, 0xBBBE, 0x92C6, 0xBBBF, 0x92C7, 0xBBC1, 0x92C8, 0xBBC2, 0x92C9, 0xBBC3, 0x92CA, 0xBBC5, + 0x92CB, 0xBBC6, 0x92CC, 0xBBC7, 0x92CD, 0xBBC9, 0x92CE, 0xBBCA, 0x92CF, 0xBBCB, 0x92D0, 0xBBCC, 0x92D1, 0xBBCD, 0x92D2, 0xBBCE, + 0x92D3, 0xBBCF, 0x92D4, 0xBBD1, 0x92D5, 0xBBD2, 0x92D6, 0xBBD4, 0x92D7, 0xBBD5, 0x92D8, 0xBBD6, 0x92D9, 0xBBD7, 0x92DA, 0xBBD8, + 0x92DB, 0xBBD9, 0x92DC, 0xBBDA, 0x92DD, 0xBBDB, 0x92DE, 0xBBDC, 0x92DF, 0xBBDD, 0x92E0, 0xBBDE, 0x92E1, 0xBBDF, 0x92E2, 0xBBE0, + 0x92E3, 0xBBE1, 0x92E4, 0xBBE2, 0x92E5, 0xBBE3, 0x92E6, 0xBBE4, 0x92E7, 0xBBE5, 0x92E8, 0xBBE6, 0x92E9, 0xBBE7, 0x92EA, 0xBBE8, + 0x92EB, 0xBBE9, 0x92EC, 0xBBEA, 0x92ED, 0xBBEB, 0x92EE, 0xBBEC, 0x92EF, 0xBBED, 0x92F0, 0xBBEE, 0x92F1, 0xBBEF, 0x92F2, 0xBBF0, + 0x92F3, 0xBBF1, 0x92F4, 0xBBF2, 0x92F5, 0xBBF3, 0x92F6, 0xBBF4, 0x92F7, 0xBBF5, 0x92F8, 0xBBF6, 0x92F9, 0xBBF7, 0x92FA, 0xBBFA, + 0x92FB, 0xBBFB, 0x92FC, 0xBBFD, 0x92FD, 0xBBFE, 0x92FE, 0xBC01, 0x9341, 0xBC03, 0x9342, 0xBC04, 0x9343, 0xBC05, 0x9344, 0xBC06, + 0x9345, 0xBC07, 0x9346, 0xBC0A, 0x9347, 0xBC0E, 0x9348, 0xBC10, 0x9349, 0xBC12, 0x934A, 0xBC13, 0x934B, 0xBC19, 0x934C, 0xBC1A, + 0x934D, 0xBC20, 0x934E, 0xBC21, 0x934F, 0xBC22, 0x9350, 0xBC23, 0x9351, 0xBC26, 0x9352, 0xBC28, 0x9353, 0xBC2A, 0x9354, 0xBC2B, + 0x9355, 0xBC2C, 0x9356, 0xBC2E, 0x9357, 0xBC2F, 0x9358, 0xBC32, 0x9359, 0xBC33, 0x935A, 0xBC35, 0x9361, 0xBC36, 0x9362, 0xBC37, + 0x9363, 0xBC39, 0x9364, 0xBC3A, 0x9365, 0xBC3B, 0x9366, 0xBC3C, 0x9367, 0xBC3D, 0x9368, 0xBC3E, 0x9369, 0xBC3F, 0x936A, 0xBC42, + 0x936B, 0xBC46, 0x936C, 0xBC47, 0x936D, 0xBC48, 0x936E, 0xBC4A, 0x936F, 0xBC4B, 0x9370, 0xBC4E, 0x9371, 0xBC4F, 0x9372, 0xBC51, + 0x9373, 0xBC52, 0x9374, 0xBC53, 0x9375, 0xBC54, 0x9376, 0xBC55, 0x9377, 0xBC56, 0x9378, 0xBC57, 0x9379, 0xBC58, 0x937A, 0xBC59, + 0x9381, 0xBC5A, 0x9382, 0xBC5B, 0x9383, 0xBC5C, 0x9384, 0xBC5E, 0x9385, 0xBC5F, 0x9386, 0xBC60, 0x9387, 0xBC61, 0x9388, 0xBC62, + 0x9389, 0xBC63, 0x938A, 0xBC64, 0x938B, 0xBC65, 0x938C, 0xBC66, 0x938D, 0xBC67, 0x938E, 0xBC68, 0x938F, 0xBC69, 0x9390, 0xBC6A, + 0x9391, 0xBC6B, 0x9392, 0xBC6C, 0x9393, 0xBC6D, 0x9394, 0xBC6E, 0x9395, 0xBC6F, 0x9396, 0xBC70, 0x9397, 0xBC71, 0x9398, 0xBC72, + 0x9399, 0xBC73, 0x939A, 0xBC74, 0x939B, 0xBC75, 0x939C, 0xBC76, 0x939D, 0xBC77, 0x939E, 0xBC78, 0x939F, 0xBC79, 0x93A0, 0xBC7A, + 0x93A1, 0xBC7B, 0x93A2, 0xBC7C, 0x93A3, 0xBC7D, 0x93A4, 0xBC7E, 0x93A5, 0xBC7F, 0x93A6, 0xBC80, 0x93A7, 0xBC81, 0x93A8, 0xBC82, + 0x93A9, 0xBC83, 0x93AA, 0xBC86, 0x93AB, 0xBC87, 0x93AC, 0xBC89, 0x93AD, 0xBC8A, 0x93AE, 0xBC8D, 0x93AF, 0xBC8F, 0x93B0, 0xBC90, + 0x93B1, 0xBC91, 0x93B2, 0xBC92, 0x93B3, 0xBC93, 0x93B4, 0xBC96, 0x93B5, 0xBC98, 0x93B6, 0xBC9B, 0x93B7, 0xBC9C, 0x93B8, 0xBC9D, + 0x93B9, 0xBC9E, 0x93BA, 0xBC9F, 0x93BB, 0xBCA2, 0x93BC, 0xBCA3, 0x93BD, 0xBCA5, 0x93BE, 0xBCA6, 0x93BF, 0xBCA9, 0x93C0, 0xBCAA, + 0x93C1, 0xBCAB, 0x93C2, 0xBCAC, 0x93C3, 0xBCAD, 0x93C4, 0xBCAE, 0x93C5, 0xBCAF, 0x93C6, 0xBCB2, 0x93C7, 0xBCB6, 0x93C8, 0xBCB7, + 0x93C9, 0xBCB8, 0x93CA, 0xBCB9, 0x93CB, 0xBCBA, 0x93CC, 0xBCBB, 0x93CD, 0xBCBE, 0x93CE, 0xBCBF, 0x93CF, 0xBCC1, 0x93D0, 0xBCC2, + 0x93D1, 0xBCC3, 0x93D2, 0xBCC5, 0x93D3, 0xBCC6, 0x93D4, 0xBCC7, 0x93D5, 0xBCC8, 0x93D6, 0xBCC9, 0x93D7, 0xBCCA, 0x93D8, 0xBCCB, + 0x93D9, 0xBCCC, 0x93DA, 0xBCCE, 0x93DB, 0xBCD2, 0x93DC, 0xBCD3, 0x93DD, 0xBCD4, 0x93DE, 0xBCD6, 0x93DF, 0xBCD7, 0x93E0, 0xBCD9, + 0x93E1, 0xBCDA, 0x93E2, 0xBCDB, 0x93E3, 0xBCDD, 0x93E4, 0xBCDE, 0x93E5, 0xBCDF, 0x93E6, 0xBCE0, 0x93E7, 0xBCE1, 0x93E8, 0xBCE2, + 0x93E9, 0xBCE3, 0x93EA, 0xBCE4, 0x93EB, 0xBCE5, 0x93EC, 0xBCE6, 0x93ED, 0xBCE7, 0x93EE, 0xBCE8, 0x93EF, 0xBCE9, 0x93F0, 0xBCEA, + 0x93F1, 0xBCEB, 0x93F2, 0xBCEC, 0x93F3, 0xBCED, 0x93F4, 0xBCEE, 0x93F5, 0xBCEF, 0x93F6, 0xBCF0, 0x93F7, 0xBCF1, 0x93F8, 0xBCF2, + 0x93F9, 0xBCF3, 0x93FA, 0xBCF7, 0x93FB, 0xBCF9, 0x93FC, 0xBCFA, 0x93FD, 0xBCFB, 0x93FE, 0xBCFD, 0x9441, 0xBCFE, 0x9442, 0xBCFF, + 0x9443, 0xBD00, 0x9444, 0xBD01, 0x9445, 0xBD02, 0x9446, 0xBD03, 0x9447, 0xBD06, 0x9448, 0xBD08, 0x9449, 0xBD0A, 0x944A, 0xBD0B, + 0x944B, 0xBD0C, 0x944C, 0xBD0D, 0x944D, 0xBD0E, 0x944E, 0xBD0F, 0x944F, 0xBD11, 0x9450, 0xBD12, 0x9451, 0xBD13, 0x9452, 0xBD15, + 0x9453, 0xBD16, 0x9454, 0xBD17, 0x9455, 0xBD18, 0x9456, 0xBD19, 0x9457, 0xBD1A, 0x9458, 0xBD1B, 0x9459, 0xBD1C, 0x945A, 0xBD1D, + 0x9461, 0xBD1E, 0x9462, 0xBD1F, 0x9463, 0xBD20, 0x9464, 0xBD21, 0x9465, 0xBD22, 0x9466, 0xBD23, 0x9467, 0xBD25, 0x9468, 0xBD26, + 0x9469, 0xBD27, 0x946A, 0xBD28, 0x946B, 0xBD29, 0x946C, 0xBD2A, 0x946D, 0xBD2B, 0x946E, 0xBD2D, 0x946F, 0xBD2E, 0x9470, 0xBD2F, + 0x9471, 0xBD30, 0x9472, 0xBD31, 0x9473, 0xBD32, 0x9474, 0xBD33, 0x9475, 0xBD34, 0x9476, 0xBD35, 0x9477, 0xBD36, 0x9478, 0xBD37, + 0x9479, 0xBD38, 0x947A, 0xBD39, 0x9481, 0xBD3A, 0x9482, 0xBD3B, 0x9483, 0xBD3C, 0x9484, 0xBD3D, 0x9485, 0xBD3E, 0x9486, 0xBD3F, + 0x9487, 0xBD41, 0x9488, 0xBD42, 0x9489, 0xBD43, 0x948A, 0xBD44, 0x948B, 0xBD45, 0x948C, 0xBD46, 0x948D, 0xBD47, 0x948E, 0xBD4A, + 0x948F, 0xBD4B, 0x9490, 0xBD4D, 0x9491, 0xBD4E, 0x9492, 0xBD4F, 0x9493, 0xBD51, 0x9494, 0xBD52, 0x9495, 0xBD53, 0x9496, 0xBD54, + 0x9497, 0xBD55, 0x9498, 0xBD56, 0x9499, 0xBD57, 0x949A, 0xBD5A, 0x949B, 0xBD5B, 0x949C, 0xBD5C, 0x949D, 0xBD5D, 0x949E, 0xBD5E, + 0x949F, 0xBD5F, 0x94A0, 0xBD60, 0x94A1, 0xBD61, 0x94A2, 0xBD62, 0x94A3, 0xBD63, 0x94A4, 0xBD65, 0x94A5, 0xBD66, 0x94A6, 0xBD67, + 0x94A7, 0xBD69, 0x94A8, 0xBD6A, 0x94A9, 0xBD6B, 0x94AA, 0xBD6C, 0x94AB, 0xBD6D, 0x94AC, 0xBD6E, 0x94AD, 0xBD6F, 0x94AE, 0xBD70, + 0x94AF, 0xBD71, 0x94B0, 0xBD72, 0x94B1, 0xBD73, 0x94B2, 0xBD74, 0x94B3, 0xBD75, 0x94B4, 0xBD76, 0x94B5, 0xBD77, 0x94B6, 0xBD78, + 0x94B7, 0xBD79, 0x94B8, 0xBD7A, 0x94B9, 0xBD7B, 0x94BA, 0xBD7C, 0x94BB, 0xBD7D, 0x94BC, 0xBD7E, 0x94BD, 0xBD7F, 0x94BE, 0xBD82, + 0x94BF, 0xBD83, 0x94C0, 0xBD85, 0x94C1, 0xBD86, 0x94C2, 0xBD8B, 0x94C3, 0xBD8C, 0x94C4, 0xBD8D, 0x94C5, 0xBD8E, 0x94C6, 0xBD8F, + 0x94C7, 0xBD92, 0x94C8, 0xBD94, 0x94C9, 0xBD96, 0x94CA, 0xBD97, 0x94CB, 0xBD98, 0x94CC, 0xBD9B, 0x94CD, 0xBD9D, 0x94CE, 0xBD9E, + 0x94CF, 0xBD9F, 0x94D0, 0xBDA0, 0x94D1, 0xBDA1, 0x94D2, 0xBDA2, 0x94D3, 0xBDA3, 0x94D4, 0xBDA5, 0x94D5, 0xBDA6, 0x94D6, 0xBDA7, + 0x94D7, 0xBDA8, 0x94D8, 0xBDA9, 0x94D9, 0xBDAA, 0x94DA, 0xBDAB, 0x94DB, 0xBDAC, 0x94DC, 0xBDAD, 0x94DD, 0xBDAE, 0x94DE, 0xBDAF, + 0x94DF, 0xBDB1, 0x94E0, 0xBDB2, 0x94E1, 0xBDB3, 0x94E2, 0xBDB4, 0x94E3, 0xBDB5, 0x94E4, 0xBDB6, 0x94E5, 0xBDB7, 0x94E6, 0xBDB9, + 0x94E7, 0xBDBA, 0x94E8, 0xBDBB, 0x94E9, 0xBDBC, 0x94EA, 0xBDBD, 0x94EB, 0xBDBE, 0x94EC, 0xBDBF, 0x94ED, 0xBDC0, 0x94EE, 0xBDC1, + 0x94EF, 0xBDC2, 0x94F0, 0xBDC3, 0x94F1, 0xBDC4, 0x94F2, 0xBDC5, 0x94F3, 0xBDC6, 0x94F4, 0xBDC7, 0x94F5, 0xBDC8, 0x94F6, 0xBDC9, + 0x94F7, 0xBDCA, 0x94F8, 0xBDCB, 0x94F9, 0xBDCC, 0x94FA, 0xBDCD, 0x94FB, 0xBDCE, 0x94FC, 0xBDCF, 0x94FD, 0xBDD0, 0x94FE, 0xBDD1, + 0x9541, 0xBDD2, 0x9542, 0xBDD3, 0x9543, 0xBDD6, 0x9544, 0xBDD7, 0x9545, 0xBDD9, 0x9546, 0xBDDA, 0x9547, 0xBDDB, 0x9548, 0xBDDD, + 0x9549, 0xBDDE, 0x954A, 0xBDDF, 0x954B, 0xBDE0, 0x954C, 0xBDE1, 0x954D, 0xBDE2, 0x954E, 0xBDE3, 0x954F, 0xBDE4, 0x9550, 0xBDE5, + 0x9551, 0xBDE6, 0x9552, 0xBDE7, 0x9553, 0xBDE8, 0x9554, 0xBDEA, 0x9555, 0xBDEB, 0x9556, 0xBDEC, 0x9557, 0xBDED, 0x9558, 0xBDEE, + 0x9559, 0xBDEF, 0x955A, 0xBDF1, 0x9561, 0xBDF2, 0x9562, 0xBDF3, 0x9563, 0xBDF5, 0x9564, 0xBDF6, 0x9565, 0xBDF7, 0x9566, 0xBDF9, + 0x9567, 0xBDFA, 0x9568, 0xBDFB, 0x9569, 0xBDFC, 0x956A, 0xBDFD, 0x956B, 0xBDFE, 0x956C, 0xBDFF, 0x956D, 0xBE01, 0x956E, 0xBE02, + 0x956F, 0xBE04, 0x9570, 0xBE06, 0x9571, 0xBE07, 0x9572, 0xBE08, 0x9573, 0xBE09, 0x9574, 0xBE0A, 0x9575, 0xBE0B, 0x9576, 0xBE0E, + 0x9577, 0xBE0F, 0x9578, 0xBE11, 0x9579, 0xBE12, 0x957A, 0xBE13, 0x9581, 0xBE15, 0x9582, 0xBE16, 0x9583, 0xBE17, 0x9584, 0xBE18, + 0x9585, 0xBE19, 0x9586, 0xBE1A, 0x9587, 0xBE1B, 0x9588, 0xBE1E, 0x9589, 0xBE20, 0x958A, 0xBE21, 0x958B, 0xBE22, 0x958C, 0xBE23, + 0x958D, 0xBE24, 0x958E, 0xBE25, 0x958F, 0xBE26, 0x9590, 0xBE27, 0x9591, 0xBE28, 0x9592, 0xBE29, 0x9593, 0xBE2A, 0x9594, 0xBE2B, + 0x9595, 0xBE2C, 0x9596, 0xBE2D, 0x9597, 0xBE2E, 0x9598, 0xBE2F, 0x9599, 0xBE30, 0x959A, 0xBE31, 0x959B, 0xBE32, 0x959C, 0xBE33, + 0x959D, 0xBE34, 0x959E, 0xBE35, 0x959F, 0xBE36, 0x95A0, 0xBE37, 0x95A1, 0xBE38, 0x95A2, 0xBE39, 0x95A3, 0xBE3A, 0x95A4, 0xBE3B, + 0x95A5, 0xBE3C, 0x95A6, 0xBE3D, 0x95A7, 0xBE3E, 0x95A8, 0xBE3F, 0x95A9, 0xBE40, 0x95AA, 0xBE41, 0x95AB, 0xBE42, 0x95AC, 0xBE43, + 0x95AD, 0xBE46, 0x95AE, 0xBE47, 0x95AF, 0xBE49, 0x95B0, 0xBE4A, 0x95B1, 0xBE4B, 0x95B2, 0xBE4D, 0x95B3, 0xBE4F, 0x95B4, 0xBE50, + 0x95B5, 0xBE51, 0x95B6, 0xBE52, 0x95B7, 0xBE53, 0x95B8, 0xBE56, 0x95B9, 0xBE58, 0x95BA, 0xBE5C, 0x95BB, 0xBE5D, 0x95BC, 0xBE5E, + 0x95BD, 0xBE5F, 0x95BE, 0xBE62, 0x95BF, 0xBE63, 0x95C0, 0xBE65, 0x95C1, 0xBE66, 0x95C2, 0xBE67, 0x95C3, 0xBE69, 0x95C4, 0xBE6B, + 0x95C5, 0xBE6C, 0x95C6, 0xBE6D, 0x95C7, 0xBE6E, 0x95C8, 0xBE6F, 0x95C9, 0xBE72, 0x95CA, 0xBE76, 0x95CB, 0xBE77, 0x95CC, 0xBE78, + 0x95CD, 0xBE79, 0x95CE, 0xBE7A, 0x95CF, 0xBE7E, 0x95D0, 0xBE7F, 0x95D1, 0xBE81, 0x95D2, 0xBE82, 0x95D3, 0xBE83, 0x95D4, 0xBE85, + 0x95D5, 0xBE86, 0x95D6, 0xBE87, 0x95D7, 0xBE88, 0x95D8, 0xBE89, 0x95D9, 0xBE8A, 0x95DA, 0xBE8B, 0x95DB, 0xBE8E, 0x95DC, 0xBE92, + 0x95DD, 0xBE93, 0x95DE, 0xBE94, 0x95DF, 0xBE95, 0x95E0, 0xBE96, 0x95E1, 0xBE97, 0x95E2, 0xBE9A, 0x95E3, 0xBE9B, 0x95E4, 0xBE9C, + 0x95E5, 0xBE9D, 0x95E6, 0xBE9E, 0x95E7, 0xBE9F, 0x95E8, 0xBEA0, 0x95E9, 0xBEA1, 0x95EA, 0xBEA2, 0x95EB, 0xBEA3, 0x95EC, 0xBEA4, + 0x95ED, 0xBEA5, 0x95EE, 0xBEA6, 0x95EF, 0xBEA7, 0x95F0, 0xBEA9, 0x95F1, 0xBEAA, 0x95F2, 0xBEAB, 0x95F3, 0xBEAC, 0x95F4, 0xBEAD, + 0x95F5, 0xBEAE, 0x95F6, 0xBEAF, 0x95F7, 0xBEB0, 0x95F8, 0xBEB1, 0x95F9, 0xBEB2, 0x95FA, 0xBEB3, 0x95FB, 0xBEB4, 0x95FC, 0xBEB5, + 0x95FD, 0xBEB6, 0x95FE, 0xBEB7, 0x9641, 0xBEB8, 0x9642, 0xBEB9, 0x9643, 0xBEBA, 0x9644, 0xBEBB, 0x9645, 0xBEBC, 0x9646, 0xBEBD, + 0x9647, 0xBEBE, 0x9648, 0xBEBF, 0x9649, 0xBEC0, 0x964A, 0xBEC1, 0x964B, 0xBEC2, 0x964C, 0xBEC3, 0x964D, 0xBEC4, 0x964E, 0xBEC5, + 0x964F, 0xBEC6, 0x9650, 0xBEC7, 0x9651, 0xBEC8, 0x9652, 0xBEC9, 0x9653, 0xBECA, 0x9654, 0xBECB, 0x9655, 0xBECC, 0x9656, 0xBECD, + 0x9657, 0xBECE, 0x9658, 0xBECF, 0x9659, 0xBED2, 0x965A, 0xBED3, 0x9661, 0xBED5, 0x9662, 0xBED6, 0x9663, 0xBED9, 0x9664, 0xBEDA, + 0x9665, 0xBEDB, 0x9666, 0xBEDC, 0x9667, 0xBEDD, 0x9668, 0xBEDE, 0x9669, 0xBEDF, 0x966A, 0xBEE1, 0x966B, 0xBEE2, 0x966C, 0xBEE6, + 0x966D, 0xBEE7, 0x966E, 0xBEE8, 0x966F, 0xBEE9, 0x9670, 0xBEEA, 0x9671, 0xBEEB, 0x9672, 0xBEED, 0x9673, 0xBEEE, 0x9674, 0xBEEF, + 0x9675, 0xBEF0, 0x9676, 0xBEF1, 0x9677, 0xBEF2, 0x9678, 0xBEF3, 0x9679, 0xBEF4, 0x967A, 0xBEF5, 0x9681, 0xBEF6, 0x9682, 0xBEF7, + 0x9683, 0xBEF8, 0x9684, 0xBEF9, 0x9685, 0xBEFA, 0x9686, 0xBEFB, 0x9687, 0xBEFC, 0x9688, 0xBEFD, 0x9689, 0xBEFE, 0x968A, 0xBEFF, + 0x968B, 0xBF00, 0x968C, 0xBF02, 0x968D, 0xBF03, 0x968E, 0xBF04, 0x968F, 0xBF05, 0x9690, 0xBF06, 0x9691, 0xBF07, 0x9692, 0xBF0A, + 0x9693, 0xBF0B, 0x9694, 0xBF0C, 0x9695, 0xBF0D, 0x9696, 0xBF0E, 0x9697, 0xBF0F, 0x9698, 0xBF10, 0x9699, 0xBF11, 0x969A, 0xBF12, + 0x969B, 0xBF13, 0x969C, 0xBF14, 0x969D, 0xBF15, 0x969E, 0xBF16, 0x969F, 0xBF17, 0x96A0, 0xBF1A, 0x96A1, 0xBF1E, 0x96A2, 0xBF1F, + 0x96A3, 0xBF20, 0x96A4, 0xBF21, 0x96A5, 0xBF22, 0x96A6, 0xBF23, 0x96A7, 0xBF24, 0x96A8, 0xBF25, 0x96A9, 0xBF26, 0x96AA, 0xBF27, + 0x96AB, 0xBF28, 0x96AC, 0xBF29, 0x96AD, 0xBF2A, 0x96AE, 0xBF2B, 0x96AF, 0xBF2C, 0x96B0, 0xBF2D, 0x96B1, 0xBF2E, 0x96B2, 0xBF2F, + 0x96B3, 0xBF30, 0x96B4, 0xBF31, 0x96B5, 0xBF32, 0x96B6, 0xBF33, 0x96B7, 0xBF34, 0x96B8, 0xBF35, 0x96B9, 0xBF36, 0x96BA, 0xBF37, + 0x96BB, 0xBF38, 0x96BC, 0xBF39, 0x96BD, 0xBF3A, 0x96BE, 0xBF3B, 0x96BF, 0xBF3C, 0x96C0, 0xBF3D, 0x96C1, 0xBF3E, 0x96C2, 0xBF3F, + 0x96C3, 0xBF42, 0x96C4, 0xBF43, 0x96C5, 0xBF45, 0x96C6, 0xBF46, 0x96C7, 0xBF47, 0x96C8, 0xBF49, 0x96C9, 0xBF4A, 0x96CA, 0xBF4B, + 0x96CB, 0xBF4C, 0x96CC, 0xBF4D, 0x96CD, 0xBF4E, 0x96CE, 0xBF4F, 0x96CF, 0xBF52, 0x96D0, 0xBF53, 0x96D1, 0xBF54, 0x96D2, 0xBF56, + 0x96D3, 0xBF57, 0x96D4, 0xBF58, 0x96D5, 0xBF59, 0x96D6, 0xBF5A, 0x96D7, 0xBF5B, 0x96D8, 0xBF5C, 0x96D9, 0xBF5D, 0x96DA, 0xBF5E, + 0x96DB, 0xBF5F, 0x96DC, 0xBF60, 0x96DD, 0xBF61, 0x96DE, 0xBF62, 0x96DF, 0xBF63, 0x96E0, 0xBF64, 0x96E1, 0xBF65, 0x96E2, 0xBF66, + 0x96E3, 0xBF67, 0x96E4, 0xBF68, 0x96E5, 0xBF69, 0x96E6, 0xBF6A, 0x96E7, 0xBF6B, 0x96E8, 0xBF6C, 0x96E9, 0xBF6D, 0x96EA, 0xBF6E, + 0x96EB, 0xBF6F, 0x96EC, 0xBF70, 0x96ED, 0xBF71, 0x96EE, 0xBF72, 0x96EF, 0xBF73, 0x96F0, 0xBF74, 0x96F1, 0xBF75, 0x96F2, 0xBF76, + 0x96F3, 0xBF77, 0x96F4, 0xBF78, 0x96F5, 0xBF79, 0x96F6, 0xBF7A, 0x96F7, 0xBF7B, 0x96F8, 0xBF7C, 0x96F9, 0xBF7D, 0x96FA, 0xBF7E, + 0x96FB, 0xBF7F, 0x96FC, 0xBF80, 0x96FD, 0xBF81, 0x96FE, 0xBF82, 0x9741, 0xBF83, 0x9742, 0xBF84, 0x9743, 0xBF85, 0x9744, 0xBF86, + 0x9745, 0xBF87, 0x9746, 0xBF88, 0x9747, 0xBF89, 0x9748, 0xBF8A, 0x9749, 0xBF8B, 0x974A, 0xBF8C, 0x974B, 0xBF8D, 0x974C, 0xBF8E, + 0x974D, 0xBF8F, 0x974E, 0xBF90, 0x974F, 0xBF91, 0x9750, 0xBF92, 0x9751, 0xBF93, 0x9752, 0xBF95, 0x9753, 0xBF96, 0x9754, 0xBF97, + 0x9755, 0xBF98, 0x9756, 0xBF99, 0x9757, 0xBF9A, 0x9758, 0xBF9B, 0x9759, 0xBF9C, 0x975A, 0xBF9D, 0x9761, 0xBF9E, 0x9762, 0xBF9F, + 0x9763, 0xBFA0, 0x9764, 0xBFA1, 0x9765, 0xBFA2, 0x9766, 0xBFA3, 0x9767, 0xBFA4, 0x9768, 0xBFA5, 0x9769, 0xBFA6, 0x976A, 0xBFA7, + 0x976B, 0xBFA8, 0x976C, 0xBFA9, 0x976D, 0xBFAA, 0x976E, 0xBFAB, 0x976F, 0xBFAC, 0x9770, 0xBFAD, 0x9771, 0xBFAE, 0x9772, 0xBFAF, + 0x9773, 0xBFB1, 0x9774, 0xBFB2, 0x9775, 0xBFB3, 0x9776, 0xBFB4, 0x9777, 0xBFB5, 0x9778, 0xBFB6, 0x9779, 0xBFB7, 0x977A, 0xBFB8, + 0x9781, 0xBFB9, 0x9782, 0xBFBA, 0x9783, 0xBFBB, 0x9784, 0xBFBC, 0x9785, 0xBFBD, 0x9786, 0xBFBE, 0x9787, 0xBFBF, 0x9788, 0xBFC0, + 0x9789, 0xBFC1, 0x978A, 0xBFC2, 0x978B, 0xBFC3, 0x978C, 0xBFC4, 0x978D, 0xBFC6, 0x978E, 0xBFC7, 0x978F, 0xBFC8, 0x9790, 0xBFC9, + 0x9791, 0xBFCA, 0x9792, 0xBFCB, 0x9793, 0xBFCE, 0x9794, 0xBFCF, 0x9795, 0xBFD1, 0x9796, 0xBFD2, 0x9797, 0xBFD3, 0x9798, 0xBFD5, + 0x9799, 0xBFD6, 0x979A, 0xBFD7, 0x979B, 0xBFD8, 0x979C, 0xBFD9, 0x979D, 0xBFDA, 0x979E, 0xBFDB, 0x979F, 0xBFDD, 0x97A0, 0xBFDE, + 0x97A1, 0xBFE0, 0x97A2, 0xBFE2, 0x97A3, 0xBFE3, 0x97A4, 0xBFE4, 0x97A5, 0xBFE5, 0x97A6, 0xBFE6, 0x97A7, 0xBFE7, 0x97A8, 0xBFE8, + 0x97A9, 0xBFE9, 0x97AA, 0xBFEA, 0x97AB, 0xBFEB, 0x97AC, 0xBFEC, 0x97AD, 0xBFED, 0x97AE, 0xBFEE, 0x97AF, 0xBFEF, 0x97B0, 0xBFF0, + 0x97B1, 0xBFF1, 0x97B2, 0xBFF2, 0x97B3, 0xBFF3, 0x97B4, 0xBFF4, 0x97B5, 0xBFF5, 0x97B6, 0xBFF6, 0x97B7, 0xBFF7, 0x97B8, 0xBFF8, + 0x97B9, 0xBFF9, 0x97BA, 0xBFFA, 0x97BB, 0xBFFB, 0x97BC, 0xBFFC, 0x97BD, 0xBFFD, 0x97BE, 0xBFFE, 0x97BF, 0xBFFF, 0x97C0, 0xC000, + 0x97C1, 0xC001, 0x97C2, 0xC002, 0x97C3, 0xC003, 0x97C4, 0xC004, 0x97C5, 0xC005, 0x97C6, 0xC006, 0x97C7, 0xC007, 0x97C8, 0xC008, + 0x97C9, 0xC009, 0x97CA, 0xC00A, 0x97CB, 0xC00B, 0x97CC, 0xC00C, 0x97CD, 0xC00D, 0x97CE, 0xC00E, 0x97CF, 0xC00F, 0x97D0, 0xC010, + 0x97D1, 0xC011, 0x97D2, 0xC012, 0x97D3, 0xC013, 0x97D4, 0xC014, 0x97D5, 0xC015, 0x97D6, 0xC016, 0x97D7, 0xC017, 0x97D8, 0xC018, + 0x97D9, 0xC019, 0x97DA, 0xC01A, 0x97DB, 0xC01B, 0x97DC, 0xC01C, 0x97DD, 0xC01D, 0x97DE, 0xC01E, 0x97DF, 0xC01F, 0x97E0, 0xC020, + 0x97E1, 0xC021, 0x97E2, 0xC022, 0x97E3, 0xC023, 0x97E4, 0xC024, 0x97E5, 0xC025, 0x97E6, 0xC026, 0x97E7, 0xC027, 0x97E8, 0xC028, + 0x97E9, 0xC029, 0x97EA, 0xC02A, 0x97EB, 0xC02B, 0x97EC, 0xC02C, 0x97ED, 0xC02D, 0x97EE, 0xC02E, 0x97EF, 0xC02F, 0x97F0, 0xC030, + 0x97F1, 0xC031, 0x97F2, 0xC032, 0x97F3, 0xC033, 0x97F4, 0xC034, 0x97F5, 0xC035, 0x97F6, 0xC036, 0x97F7, 0xC037, 0x97F8, 0xC038, + 0x97F9, 0xC039, 0x97FA, 0xC03A, 0x97FB, 0xC03B, 0x97FC, 0xC03D, 0x97FD, 0xC03E, 0x97FE, 0xC03F, 0x9841, 0xC040, 0x9842, 0xC041, + 0x9843, 0xC042, 0x9844, 0xC043, 0x9845, 0xC044, 0x9846, 0xC045, 0x9847, 0xC046, 0x9848, 0xC047, 0x9849, 0xC048, 0x984A, 0xC049, + 0x984B, 0xC04A, 0x984C, 0xC04B, 0x984D, 0xC04C, 0x984E, 0xC04D, 0x984F, 0xC04E, 0x9850, 0xC04F, 0x9851, 0xC050, 0x9852, 0xC052, + 0x9853, 0xC053, 0x9854, 0xC054, 0x9855, 0xC055, 0x9856, 0xC056, 0x9857, 0xC057, 0x9858, 0xC059, 0x9859, 0xC05A, 0x985A, 0xC05B, + 0x9861, 0xC05D, 0x9862, 0xC05E, 0x9863, 0xC05F, 0x9864, 0xC061, 0x9865, 0xC062, 0x9866, 0xC063, 0x9867, 0xC064, 0x9868, 0xC065, + 0x9869, 0xC066, 0x986A, 0xC067, 0x986B, 0xC06A, 0x986C, 0xC06B, 0x986D, 0xC06C, 0x986E, 0xC06D, 0x986F, 0xC06E, 0x9870, 0xC06F, + 0x9871, 0xC070, 0x9872, 0xC071, 0x9873, 0xC072, 0x9874, 0xC073, 0x9875, 0xC074, 0x9876, 0xC075, 0x9877, 0xC076, 0x9878, 0xC077, + 0x9879, 0xC078, 0x987A, 0xC079, 0x9881, 0xC07A, 0x9882, 0xC07B, 0x9883, 0xC07C, 0x9884, 0xC07D, 0x9885, 0xC07E, 0x9886, 0xC07F, + 0x9887, 0xC080, 0x9888, 0xC081, 0x9889, 0xC082, 0x988A, 0xC083, 0x988B, 0xC084, 0x988C, 0xC085, 0x988D, 0xC086, 0x988E, 0xC087, + 0x988F, 0xC088, 0x9890, 0xC089, 0x9891, 0xC08A, 0x9892, 0xC08B, 0x9893, 0xC08C, 0x9894, 0xC08D, 0x9895, 0xC08E, 0x9896, 0xC08F, + 0x9897, 0xC092, 0x9898, 0xC093, 0x9899, 0xC095, 0x989A, 0xC096, 0x989B, 0xC097, 0x989C, 0xC099, 0x989D, 0xC09A, 0x989E, 0xC09B, + 0x989F, 0xC09C, 0x98A0, 0xC09D, 0x98A1, 0xC09E, 0x98A2, 0xC09F, 0x98A3, 0xC0A2, 0x98A4, 0xC0A4, 0x98A5, 0xC0A6, 0x98A6, 0xC0A7, + 0x98A7, 0xC0A8, 0x98A8, 0xC0A9, 0x98A9, 0xC0AA, 0x98AA, 0xC0AB, 0x98AB, 0xC0AE, 0x98AC, 0xC0B1, 0x98AD, 0xC0B2, 0x98AE, 0xC0B7, + 0x98AF, 0xC0B8, 0x98B0, 0xC0B9, 0x98B1, 0xC0BA, 0x98B2, 0xC0BB, 0x98B3, 0xC0BE, 0x98B4, 0xC0C2, 0x98B5, 0xC0C3, 0x98B6, 0xC0C4, + 0x98B7, 0xC0C6, 0x98B8, 0xC0C7, 0x98B9, 0xC0CA, 0x98BA, 0xC0CB, 0x98BB, 0xC0CD, 0x98BC, 0xC0CE, 0x98BD, 0xC0CF, 0x98BE, 0xC0D1, + 0x98BF, 0xC0D2, 0x98C0, 0xC0D3, 0x98C1, 0xC0D4, 0x98C2, 0xC0D5, 0x98C3, 0xC0D6, 0x98C4, 0xC0D7, 0x98C5, 0xC0DA, 0x98C6, 0xC0DE, + 0x98C7, 0xC0DF, 0x98C8, 0xC0E0, 0x98C9, 0xC0E1, 0x98CA, 0xC0E2, 0x98CB, 0xC0E3, 0x98CC, 0xC0E6, 0x98CD, 0xC0E7, 0x98CE, 0xC0E9, + 0x98CF, 0xC0EA, 0x98D0, 0xC0EB, 0x98D1, 0xC0ED, 0x98D2, 0xC0EE, 0x98D3, 0xC0EF, 0x98D4, 0xC0F0, 0x98D5, 0xC0F1, 0x98D6, 0xC0F2, + 0x98D7, 0xC0F3, 0x98D8, 0xC0F6, 0x98D9, 0xC0F8, 0x98DA, 0xC0FA, 0x98DB, 0xC0FB, 0x98DC, 0xC0FC, 0x98DD, 0xC0FD, 0x98DE, 0xC0FE, + 0x98DF, 0xC0FF, 0x98E0, 0xC101, 0x98E1, 0xC102, 0x98E2, 0xC103, 0x98E3, 0xC105, 0x98E4, 0xC106, 0x98E5, 0xC107, 0x98E6, 0xC109, + 0x98E7, 0xC10A, 0x98E8, 0xC10B, 0x98E9, 0xC10C, 0x98EA, 0xC10D, 0x98EB, 0xC10E, 0x98EC, 0xC10F, 0x98ED, 0xC111, 0x98EE, 0xC112, + 0x98EF, 0xC113, 0x98F0, 0xC114, 0x98F1, 0xC116, 0x98F2, 0xC117, 0x98F3, 0xC118, 0x98F4, 0xC119, 0x98F5, 0xC11A, 0x98F6, 0xC11B, + 0x98F7, 0xC121, 0x98F8, 0xC122, 0x98F9, 0xC125, 0x98FA, 0xC128, 0x98FB, 0xC129, 0x98FC, 0xC12A, 0x98FD, 0xC12B, 0x98FE, 0xC12E, + 0x9941, 0xC132, 0x9942, 0xC133, 0x9943, 0xC134, 0x9944, 0xC135, 0x9945, 0xC137, 0x9946, 0xC13A, 0x9947, 0xC13B, 0x9948, 0xC13D, + 0x9949, 0xC13E, 0x994A, 0xC13F, 0x994B, 0xC141, 0x994C, 0xC142, 0x994D, 0xC143, 0x994E, 0xC144, 0x994F, 0xC145, 0x9950, 0xC146, + 0x9951, 0xC147, 0x9952, 0xC14A, 0x9953, 0xC14E, 0x9954, 0xC14F, 0x9955, 0xC150, 0x9956, 0xC151, 0x9957, 0xC152, 0x9958, 0xC153, + 0x9959, 0xC156, 0x995A, 0xC157, 0x9961, 0xC159, 0x9962, 0xC15A, 0x9963, 0xC15B, 0x9964, 0xC15D, 0x9965, 0xC15E, 0x9966, 0xC15F, + 0x9967, 0xC160, 0x9968, 0xC161, 0x9969, 0xC162, 0x996A, 0xC163, 0x996B, 0xC166, 0x996C, 0xC16A, 0x996D, 0xC16B, 0x996E, 0xC16C, + 0x996F, 0xC16D, 0x9970, 0xC16E, 0x9971, 0xC16F, 0x9972, 0xC171, 0x9973, 0xC172, 0x9974, 0xC173, 0x9975, 0xC175, 0x9976, 0xC176, + 0x9977, 0xC177, 0x9978, 0xC179, 0x9979, 0xC17A, 0x997A, 0xC17B, 0x9981, 0xC17C, 0x9982, 0xC17D, 0x9983, 0xC17E, 0x9984, 0xC17F, + 0x9985, 0xC180, 0x9986, 0xC181, 0x9987, 0xC182, 0x9988, 0xC183, 0x9989, 0xC184, 0x998A, 0xC186, 0x998B, 0xC187, 0x998C, 0xC188, + 0x998D, 0xC189, 0x998E, 0xC18A, 0x998F, 0xC18B, 0x9990, 0xC18F, 0x9991, 0xC191, 0x9992, 0xC192, 0x9993, 0xC193, 0x9994, 0xC195, + 0x9995, 0xC197, 0x9996, 0xC198, 0x9997, 0xC199, 0x9998, 0xC19A, 0x9999, 0xC19B, 0x999A, 0xC19E, 0x999B, 0xC1A0, 0x999C, 0xC1A2, + 0x999D, 0xC1A3, 0x999E, 0xC1A4, 0x999F, 0xC1A6, 0x99A0, 0xC1A7, 0x99A1, 0xC1AA, 0x99A2, 0xC1AB, 0x99A3, 0xC1AD, 0x99A4, 0xC1AE, + 0x99A5, 0xC1AF, 0x99A6, 0xC1B1, 0x99A7, 0xC1B2, 0x99A8, 0xC1B3, 0x99A9, 0xC1B4, 0x99AA, 0xC1B5, 0x99AB, 0xC1B6, 0x99AC, 0xC1B7, + 0x99AD, 0xC1B8, 0x99AE, 0xC1B9, 0x99AF, 0xC1BA, 0x99B0, 0xC1BB, 0x99B1, 0xC1BC, 0x99B2, 0xC1BE, 0x99B3, 0xC1BF, 0x99B4, 0xC1C0, + 0x99B5, 0xC1C1, 0x99B6, 0xC1C2, 0x99B7, 0xC1C3, 0x99B8, 0xC1C5, 0x99B9, 0xC1C6, 0x99BA, 0xC1C7, 0x99BB, 0xC1C9, 0x99BC, 0xC1CA, + 0x99BD, 0xC1CB, 0x99BE, 0xC1CD, 0x99BF, 0xC1CE, 0x99C0, 0xC1CF, 0x99C1, 0xC1D0, 0x99C2, 0xC1D1, 0x99C3, 0xC1D2, 0x99C4, 0xC1D3, + 0x99C5, 0xC1D5, 0x99C6, 0xC1D6, 0x99C7, 0xC1D9, 0x99C8, 0xC1DA, 0x99C9, 0xC1DB, 0x99CA, 0xC1DC, 0x99CB, 0xC1DD, 0x99CC, 0xC1DE, + 0x99CD, 0xC1DF, 0x99CE, 0xC1E1, 0x99CF, 0xC1E2, 0x99D0, 0xC1E3, 0x99D1, 0xC1E5, 0x99D2, 0xC1E6, 0x99D3, 0xC1E7, 0x99D4, 0xC1E9, + 0x99D5, 0xC1EA, 0x99D6, 0xC1EB, 0x99D7, 0xC1EC, 0x99D8, 0xC1ED, 0x99D9, 0xC1EE, 0x99DA, 0xC1EF, 0x99DB, 0xC1F2, 0x99DC, 0xC1F4, + 0x99DD, 0xC1F5, 0x99DE, 0xC1F6, 0x99DF, 0xC1F7, 0x99E0, 0xC1F8, 0x99E1, 0xC1F9, 0x99E2, 0xC1FA, 0x99E3, 0xC1FB, 0x99E4, 0xC1FE, + 0x99E5, 0xC1FF, 0x99E6, 0xC201, 0x99E7, 0xC202, 0x99E8, 0xC203, 0x99E9, 0xC205, 0x99EA, 0xC206, 0x99EB, 0xC207, 0x99EC, 0xC208, + 0x99ED, 0xC209, 0x99EE, 0xC20A, 0x99EF, 0xC20B, 0x99F0, 0xC20E, 0x99F1, 0xC210, 0x99F2, 0xC212, 0x99F3, 0xC213, 0x99F4, 0xC214, + 0x99F5, 0xC215, 0x99F6, 0xC216, 0x99F7, 0xC217, 0x99F8, 0xC21A, 0x99F9, 0xC21B, 0x99FA, 0xC21D, 0x99FB, 0xC21E, 0x99FC, 0xC221, + 0x99FD, 0xC222, 0x99FE, 0xC223, 0x9A41, 0xC224, 0x9A42, 0xC225, 0x9A43, 0xC226, 0x9A44, 0xC227, 0x9A45, 0xC22A, 0x9A46, 0xC22C, + 0x9A47, 0xC22E, 0x9A48, 0xC230, 0x9A49, 0xC233, 0x9A4A, 0xC235, 0x9A4B, 0xC236, 0x9A4C, 0xC237, 0x9A4D, 0xC238, 0x9A4E, 0xC239, + 0x9A4F, 0xC23A, 0x9A50, 0xC23B, 0x9A51, 0xC23C, 0x9A52, 0xC23D, 0x9A53, 0xC23E, 0x9A54, 0xC23F, 0x9A55, 0xC240, 0x9A56, 0xC241, + 0x9A57, 0xC242, 0x9A58, 0xC243, 0x9A59, 0xC244, 0x9A5A, 0xC245, 0x9A61, 0xC246, 0x9A62, 0xC247, 0x9A63, 0xC249, 0x9A64, 0xC24A, + 0x9A65, 0xC24B, 0x9A66, 0xC24C, 0x9A67, 0xC24D, 0x9A68, 0xC24E, 0x9A69, 0xC24F, 0x9A6A, 0xC252, 0x9A6B, 0xC253, 0x9A6C, 0xC255, + 0x9A6D, 0xC256, 0x9A6E, 0xC257, 0x9A6F, 0xC259, 0x9A70, 0xC25A, 0x9A71, 0xC25B, 0x9A72, 0xC25C, 0x9A73, 0xC25D, 0x9A74, 0xC25E, + 0x9A75, 0xC25F, 0x9A76, 0xC261, 0x9A77, 0xC262, 0x9A78, 0xC263, 0x9A79, 0xC264, 0x9A7A, 0xC266, 0x9A81, 0xC267, 0x9A82, 0xC268, + 0x9A83, 0xC269, 0x9A84, 0xC26A, 0x9A85, 0xC26B, 0x9A86, 0xC26E, 0x9A87, 0xC26F, 0x9A88, 0xC271, 0x9A89, 0xC272, 0x9A8A, 0xC273, + 0x9A8B, 0xC275, 0x9A8C, 0xC276, 0x9A8D, 0xC277, 0x9A8E, 0xC278, 0x9A8F, 0xC279, 0x9A90, 0xC27A, 0x9A91, 0xC27B, 0x9A92, 0xC27E, + 0x9A93, 0xC280, 0x9A94, 0xC282, 0x9A95, 0xC283, 0x9A96, 0xC284, 0x9A97, 0xC285, 0x9A98, 0xC286, 0x9A99, 0xC287, 0x9A9A, 0xC28A, + 0x9A9B, 0xC28B, 0x9A9C, 0xC28C, 0x9A9D, 0xC28D, 0x9A9E, 0xC28E, 0x9A9F, 0xC28F, 0x9AA0, 0xC291, 0x9AA1, 0xC292, 0x9AA2, 0xC293, + 0x9AA3, 0xC294, 0x9AA4, 0xC295, 0x9AA5, 0xC296, 0x9AA6, 0xC297, 0x9AA7, 0xC299, 0x9AA8, 0xC29A, 0x9AA9, 0xC29C, 0x9AAA, 0xC29E, + 0x9AAB, 0xC29F, 0x9AAC, 0xC2A0, 0x9AAD, 0xC2A1, 0x9AAE, 0xC2A2, 0x9AAF, 0xC2A3, 0x9AB0, 0xC2A6, 0x9AB1, 0xC2A7, 0x9AB2, 0xC2A9, + 0x9AB3, 0xC2AA, 0x9AB4, 0xC2AB, 0x9AB5, 0xC2AE, 0x9AB6, 0xC2AF, 0x9AB7, 0xC2B0, 0x9AB8, 0xC2B1, 0x9AB9, 0xC2B2, 0x9ABA, 0xC2B3, + 0x9ABB, 0xC2B6, 0x9ABC, 0xC2B8, 0x9ABD, 0xC2BA, 0x9ABE, 0xC2BB, 0x9ABF, 0xC2BC, 0x9AC0, 0xC2BD, 0x9AC1, 0xC2BE, 0x9AC2, 0xC2BF, + 0x9AC3, 0xC2C0, 0x9AC4, 0xC2C1, 0x9AC5, 0xC2C2, 0x9AC6, 0xC2C3, 0x9AC7, 0xC2C4, 0x9AC8, 0xC2C5, 0x9AC9, 0xC2C6, 0x9ACA, 0xC2C7, + 0x9ACB, 0xC2C8, 0x9ACC, 0xC2C9, 0x9ACD, 0xC2CA, 0x9ACE, 0xC2CB, 0x9ACF, 0xC2CC, 0x9AD0, 0xC2CD, 0x9AD1, 0xC2CE, 0x9AD2, 0xC2CF, + 0x9AD3, 0xC2D0, 0x9AD4, 0xC2D1, 0x9AD5, 0xC2D2, 0x9AD6, 0xC2D3, 0x9AD7, 0xC2D4, 0x9AD8, 0xC2D5, 0x9AD9, 0xC2D6, 0x9ADA, 0xC2D7, + 0x9ADB, 0xC2D8, 0x9ADC, 0xC2D9, 0x9ADD, 0xC2DA, 0x9ADE, 0xC2DB, 0x9ADF, 0xC2DE, 0x9AE0, 0xC2DF, 0x9AE1, 0xC2E1, 0x9AE2, 0xC2E2, + 0x9AE3, 0xC2E5, 0x9AE4, 0xC2E6, 0x9AE5, 0xC2E7, 0x9AE6, 0xC2E8, 0x9AE7, 0xC2E9, 0x9AE8, 0xC2EA, 0x9AE9, 0xC2EE, 0x9AEA, 0xC2F0, + 0x9AEB, 0xC2F2, 0x9AEC, 0xC2F3, 0x9AED, 0xC2F4, 0x9AEE, 0xC2F5, 0x9AEF, 0xC2F7, 0x9AF0, 0xC2FA, 0x9AF1, 0xC2FD, 0x9AF2, 0xC2FE, + 0x9AF3, 0xC2FF, 0x9AF4, 0xC301, 0x9AF5, 0xC302, 0x9AF6, 0xC303, 0x9AF7, 0xC304, 0x9AF8, 0xC305, 0x9AF9, 0xC306, 0x9AFA, 0xC307, + 0x9AFB, 0xC30A, 0x9AFC, 0xC30B, 0x9AFD, 0xC30E, 0x9AFE, 0xC30F, 0x9B41, 0xC310, 0x9B42, 0xC311, 0x9B43, 0xC312, 0x9B44, 0xC316, + 0x9B45, 0xC317, 0x9B46, 0xC319, 0x9B47, 0xC31A, 0x9B48, 0xC31B, 0x9B49, 0xC31D, 0x9B4A, 0xC31E, 0x9B4B, 0xC31F, 0x9B4C, 0xC320, + 0x9B4D, 0xC321, 0x9B4E, 0xC322, 0x9B4F, 0xC323, 0x9B50, 0xC326, 0x9B51, 0xC327, 0x9B52, 0xC32A, 0x9B53, 0xC32B, 0x9B54, 0xC32C, + 0x9B55, 0xC32D, 0x9B56, 0xC32E, 0x9B57, 0xC32F, 0x9B58, 0xC330, 0x9B59, 0xC331, 0x9B5A, 0xC332, 0x9B61, 0xC333, 0x9B62, 0xC334, + 0x9B63, 0xC335, 0x9B64, 0xC336, 0x9B65, 0xC337, 0x9B66, 0xC338, 0x9B67, 0xC339, 0x9B68, 0xC33A, 0x9B69, 0xC33B, 0x9B6A, 0xC33C, + 0x9B6B, 0xC33D, 0x9B6C, 0xC33E, 0x9B6D, 0xC33F, 0x9B6E, 0xC340, 0x9B6F, 0xC341, 0x9B70, 0xC342, 0x9B71, 0xC343, 0x9B72, 0xC344, + 0x9B73, 0xC346, 0x9B74, 0xC347, 0x9B75, 0xC348, 0x9B76, 0xC349, 0x9B77, 0xC34A, 0x9B78, 0xC34B, 0x9B79, 0xC34C, 0x9B7A, 0xC34D, + 0x9B81, 0xC34E, 0x9B82, 0xC34F, 0x9B83, 0xC350, 0x9B84, 0xC351, 0x9B85, 0xC352, 0x9B86, 0xC353, 0x9B87, 0xC354, 0x9B88, 0xC355, + 0x9B89, 0xC356, 0x9B8A, 0xC357, 0x9B8B, 0xC358, 0x9B8C, 0xC359, 0x9B8D, 0xC35A, 0x9B8E, 0xC35B, 0x9B8F, 0xC35C, 0x9B90, 0xC35D, + 0x9B91, 0xC35E, 0x9B92, 0xC35F, 0x9B93, 0xC360, 0x9B94, 0xC361, 0x9B95, 0xC362, 0x9B96, 0xC363, 0x9B97, 0xC364, 0x9B98, 0xC365, + 0x9B99, 0xC366, 0x9B9A, 0xC367, 0x9B9B, 0xC36A, 0x9B9C, 0xC36B, 0x9B9D, 0xC36D, 0x9B9E, 0xC36E, 0x9B9F, 0xC36F, 0x9BA0, 0xC371, + 0x9BA1, 0xC373, 0x9BA2, 0xC374, 0x9BA3, 0xC375, 0x9BA4, 0xC376, 0x9BA5, 0xC377, 0x9BA6, 0xC37A, 0x9BA7, 0xC37B, 0x9BA8, 0xC37E, + 0x9BA9, 0xC37F, 0x9BAA, 0xC380, 0x9BAB, 0xC381, 0x9BAC, 0xC382, 0x9BAD, 0xC383, 0x9BAE, 0xC385, 0x9BAF, 0xC386, 0x9BB0, 0xC387, + 0x9BB1, 0xC389, 0x9BB2, 0xC38A, 0x9BB3, 0xC38B, 0x9BB4, 0xC38D, 0x9BB5, 0xC38E, 0x9BB6, 0xC38F, 0x9BB7, 0xC390, 0x9BB8, 0xC391, + 0x9BB9, 0xC392, 0x9BBA, 0xC393, 0x9BBB, 0xC394, 0x9BBC, 0xC395, 0x9BBD, 0xC396, 0x9BBE, 0xC397, 0x9BBF, 0xC398, 0x9BC0, 0xC399, + 0x9BC1, 0xC39A, 0x9BC2, 0xC39B, 0x9BC3, 0xC39C, 0x9BC4, 0xC39D, 0x9BC5, 0xC39E, 0x9BC6, 0xC39F, 0x9BC7, 0xC3A0, 0x9BC8, 0xC3A1, + 0x9BC9, 0xC3A2, 0x9BCA, 0xC3A3, 0x9BCB, 0xC3A4, 0x9BCC, 0xC3A5, 0x9BCD, 0xC3A6, 0x9BCE, 0xC3A7, 0x9BCF, 0xC3A8, 0x9BD0, 0xC3A9, + 0x9BD1, 0xC3AA, 0x9BD2, 0xC3AB, 0x9BD3, 0xC3AC, 0x9BD4, 0xC3AD, 0x9BD5, 0xC3AE, 0x9BD6, 0xC3AF, 0x9BD7, 0xC3B0, 0x9BD8, 0xC3B1, + 0x9BD9, 0xC3B2, 0x9BDA, 0xC3B3, 0x9BDB, 0xC3B4, 0x9BDC, 0xC3B5, 0x9BDD, 0xC3B6, 0x9BDE, 0xC3B7, 0x9BDF, 0xC3B8, 0x9BE0, 0xC3B9, + 0x9BE1, 0xC3BA, 0x9BE2, 0xC3BB, 0x9BE3, 0xC3BC, 0x9BE4, 0xC3BD, 0x9BE5, 0xC3BE, 0x9BE6, 0xC3BF, 0x9BE7, 0xC3C1, 0x9BE8, 0xC3C2, + 0x9BE9, 0xC3C3, 0x9BEA, 0xC3C4, 0x9BEB, 0xC3C5, 0x9BEC, 0xC3C6, 0x9BED, 0xC3C7, 0x9BEE, 0xC3C8, 0x9BEF, 0xC3C9, 0x9BF0, 0xC3CA, + 0x9BF1, 0xC3CB, 0x9BF2, 0xC3CC, 0x9BF3, 0xC3CD, 0x9BF4, 0xC3CE, 0x9BF5, 0xC3CF, 0x9BF6, 0xC3D0, 0x9BF7, 0xC3D1, 0x9BF8, 0xC3D2, + 0x9BF9, 0xC3D3, 0x9BFA, 0xC3D4, 0x9BFB, 0xC3D5, 0x9BFC, 0xC3D6, 0x9BFD, 0xC3D7, 0x9BFE, 0xC3DA, 0x9C41, 0xC3DB, 0x9C42, 0xC3DD, + 0x9C43, 0xC3DE, 0x9C44, 0xC3E1, 0x9C45, 0xC3E3, 0x9C46, 0xC3E4, 0x9C47, 0xC3E5, 0x9C48, 0xC3E6, 0x9C49, 0xC3E7, 0x9C4A, 0xC3EA, + 0x9C4B, 0xC3EB, 0x9C4C, 0xC3EC, 0x9C4D, 0xC3EE, 0x9C4E, 0xC3EF, 0x9C4F, 0xC3F0, 0x9C50, 0xC3F1, 0x9C51, 0xC3F2, 0x9C52, 0xC3F3, + 0x9C53, 0xC3F6, 0x9C54, 0xC3F7, 0x9C55, 0xC3F9, 0x9C56, 0xC3FA, 0x9C57, 0xC3FB, 0x9C58, 0xC3FC, 0x9C59, 0xC3FD, 0x9C5A, 0xC3FE, + 0x9C61, 0xC3FF, 0x9C62, 0xC400, 0x9C63, 0xC401, 0x9C64, 0xC402, 0x9C65, 0xC403, 0x9C66, 0xC404, 0x9C67, 0xC405, 0x9C68, 0xC406, + 0x9C69, 0xC407, 0x9C6A, 0xC409, 0x9C6B, 0xC40A, 0x9C6C, 0xC40B, 0x9C6D, 0xC40C, 0x9C6E, 0xC40D, 0x9C6F, 0xC40E, 0x9C70, 0xC40F, + 0x9C71, 0xC411, 0x9C72, 0xC412, 0x9C73, 0xC413, 0x9C74, 0xC414, 0x9C75, 0xC415, 0x9C76, 0xC416, 0x9C77, 0xC417, 0x9C78, 0xC418, + 0x9C79, 0xC419, 0x9C7A, 0xC41A, 0x9C81, 0xC41B, 0x9C82, 0xC41C, 0x9C83, 0xC41D, 0x9C84, 0xC41E, 0x9C85, 0xC41F, 0x9C86, 0xC420, + 0x9C87, 0xC421, 0x9C88, 0xC422, 0x9C89, 0xC423, 0x9C8A, 0xC425, 0x9C8B, 0xC426, 0x9C8C, 0xC427, 0x9C8D, 0xC428, 0x9C8E, 0xC429, + 0x9C8F, 0xC42A, 0x9C90, 0xC42B, 0x9C91, 0xC42D, 0x9C92, 0xC42E, 0x9C93, 0xC42F, 0x9C94, 0xC431, 0x9C95, 0xC432, 0x9C96, 0xC433, + 0x9C97, 0xC435, 0x9C98, 0xC436, 0x9C99, 0xC437, 0x9C9A, 0xC438, 0x9C9B, 0xC439, 0x9C9C, 0xC43A, 0x9C9D, 0xC43B, 0x9C9E, 0xC43E, + 0x9C9F, 0xC43F, 0x9CA0, 0xC440, 0x9CA1, 0xC441, 0x9CA2, 0xC442, 0x9CA3, 0xC443, 0x9CA4, 0xC444, 0x9CA5, 0xC445, 0x9CA6, 0xC446, + 0x9CA7, 0xC447, 0x9CA8, 0xC449, 0x9CA9, 0xC44A, 0x9CAA, 0xC44B, 0x9CAB, 0xC44C, 0x9CAC, 0xC44D, 0x9CAD, 0xC44E, 0x9CAE, 0xC44F, + 0x9CAF, 0xC450, 0x9CB0, 0xC451, 0x9CB1, 0xC452, 0x9CB2, 0xC453, 0x9CB3, 0xC454, 0x9CB4, 0xC455, 0x9CB5, 0xC456, 0x9CB6, 0xC457, + 0x9CB7, 0xC458, 0x9CB8, 0xC459, 0x9CB9, 0xC45A, 0x9CBA, 0xC45B, 0x9CBB, 0xC45C, 0x9CBC, 0xC45D, 0x9CBD, 0xC45E, 0x9CBE, 0xC45F, + 0x9CBF, 0xC460, 0x9CC0, 0xC461, 0x9CC1, 0xC462, 0x9CC2, 0xC463, 0x9CC3, 0xC466, 0x9CC4, 0xC467, 0x9CC5, 0xC469, 0x9CC6, 0xC46A, + 0x9CC7, 0xC46B, 0x9CC8, 0xC46D, 0x9CC9, 0xC46E, 0x9CCA, 0xC46F, 0x9CCB, 0xC470, 0x9CCC, 0xC471, 0x9CCD, 0xC472, 0x9CCE, 0xC473, + 0x9CCF, 0xC476, 0x9CD0, 0xC477, 0x9CD1, 0xC478, 0x9CD2, 0xC47A, 0x9CD3, 0xC47B, 0x9CD4, 0xC47C, 0x9CD5, 0xC47D, 0x9CD6, 0xC47E, + 0x9CD7, 0xC47F, 0x9CD8, 0xC481, 0x9CD9, 0xC482, 0x9CDA, 0xC483, 0x9CDB, 0xC484, 0x9CDC, 0xC485, 0x9CDD, 0xC486, 0x9CDE, 0xC487, + 0x9CDF, 0xC488, 0x9CE0, 0xC489, 0x9CE1, 0xC48A, 0x9CE2, 0xC48B, 0x9CE3, 0xC48C, 0x9CE4, 0xC48D, 0x9CE5, 0xC48E, 0x9CE6, 0xC48F, + 0x9CE7, 0xC490, 0x9CE8, 0xC491, 0x9CE9, 0xC492, 0x9CEA, 0xC493, 0x9CEB, 0xC495, 0x9CEC, 0xC496, 0x9CED, 0xC497, 0x9CEE, 0xC498, + 0x9CEF, 0xC499, 0x9CF0, 0xC49A, 0x9CF1, 0xC49B, 0x9CF2, 0xC49D, 0x9CF3, 0xC49E, 0x9CF4, 0xC49F, 0x9CF5, 0xC4A0, 0x9CF6, 0xC4A1, + 0x9CF7, 0xC4A2, 0x9CF8, 0xC4A3, 0x9CF9, 0xC4A4, 0x9CFA, 0xC4A5, 0x9CFB, 0xC4A6, 0x9CFC, 0xC4A7, 0x9CFD, 0xC4A8, 0x9CFE, 0xC4A9, + 0x9D41, 0xC4AA, 0x9D42, 0xC4AB, 0x9D43, 0xC4AC, 0x9D44, 0xC4AD, 0x9D45, 0xC4AE, 0x9D46, 0xC4AF, 0x9D47, 0xC4B0, 0x9D48, 0xC4B1, + 0x9D49, 0xC4B2, 0x9D4A, 0xC4B3, 0x9D4B, 0xC4B4, 0x9D4C, 0xC4B5, 0x9D4D, 0xC4B6, 0x9D4E, 0xC4B7, 0x9D4F, 0xC4B9, 0x9D50, 0xC4BA, + 0x9D51, 0xC4BB, 0x9D52, 0xC4BD, 0x9D53, 0xC4BE, 0x9D54, 0xC4BF, 0x9D55, 0xC4C0, 0x9D56, 0xC4C1, 0x9D57, 0xC4C2, 0x9D58, 0xC4C3, + 0x9D59, 0xC4C4, 0x9D5A, 0xC4C5, 0x9D61, 0xC4C6, 0x9D62, 0xC4C7, 0x9D63, 0xC4C8, 0x9D64, 0xC4C9, 0x9D65, 0xC4CA, 0x9D66, 0xC4CB, + 0x9D67, 0xC4CC, 0x9D68, 0xC4CD, 0x9D69, 0xC4CE, 0x9D6A, 0xC4CF, 0x9D6B, 0xC4D0, 0x9D6C, 0xC4D1, 0x9D6D, 0xC4D2, 0x9D6E, 0xC4D3, + 0x9D6F, 0xC4D4, 0x9D70, 0xC4D5, 0x9D71, 0xC4D6, 0x9D72, 0xC4D7, 0x9D73, 0xC4D8, 0x9D74, 0xC4D9, 0x9D75, 0xC4DA, 0x9D76, 0xC4DB, + 0x9D77, 0xC4DC, 0x9D78, 0xC4DD, 0x9D79, 0xC4DE, 0x9D7A, 0xC4DF, 0x9D81, 0xC4E0, 0x9D82, 0xC4E1, 0x9D83, 0xC4E2, 0x9D84, 0xC4E3, + 0x9D85, 0xC4E4, 0x9D86, 0xC4E5, 0x9D87, 0xC4E6, 0x9D88, 0xC4E7, 0x9D89, 0xC4E8, 0x9D8A, 0xC4EA, 0x9D8B, 0xC4EB, 0x9D8C, 0xC4EC, + 0x9D8D, 0xC4ED, 0x9D8E, 0xC4EE, 0x9D8F, 0xC4EF, 0x9D90, 0xC4F2, 0x9D91, 0xC4F3, 0x9D92, 0xC4F5, 0x9D93, 0xC4F6, 0x9D94, 0xC4F7, + 0x9D95, 0xC4F9, 0x9D96, 0xC4FB, 0x9D97, 0xC4FC, 0x9D98, 0xC4FD, 0x9D99, 0xC4FE, 0x9D9A, 0xC502, 0x9D9B, 0xC503, 0x9D9C, 0xC504, + 0x9D9D, 0xC505, 0x9D9E, 0xC506, 0x9D9F, 0xC507, 0x9DA0, 0xC508, 0x9DA1, 0xC509, 0x9DA2, 0xC50A, 0x9DA3, 0xC50B, 0x9DA4, 0xC50D, + 0x9DA5, 0xC50E, 0x9DA6, 0xC50F, 0x9DA7, 0xC511, 0x9DA8, 0xC512, 0x9DA9, 0xC513, 0x9DAA, 0xC515, 0x9DAB, 0xC516, 0x9DAC, 0xC517, + 0x9DAD, 0xC518, 0x9DAE, 0xC519, 0x9DAF, 0xC51A, 0x9DB0, 0xC51B, 0x9DB1, 0xC51D, 0x9DB2, 0xC51E, 0x9DB3, 0xC51F, 0x9DB4, 0xC520, + 0x9DB5, 0xC521, 0x9DB6, 0xC522, 0x9DB7, 0xC523, 0x9DB8, 0xC524, 0x9DB9, 0xC525, 0x9DBA, 0xC526, 0x9DBB, 0xC527, 0x9DBC, 0xC52A, + 0x9DBD, 0xC52B, 0x9DBE, 0xC52D, 0x9DBF, 0xC52E, 0x9DC0, 0xC52F, 0x9DC1, 0xC531, 0x9DC2, 0xC532, 0x9DC3, 0xC533, 0x9DC4, 0xC534, + 0x9DC5, 0xC535, 0x9DC6, 0xC536, 0x9DC7, 0xC537, 0x9DC8, 0xC53A, 0x9DC9, 0xC53C, 0x9DCA, 0xC53E, 0x9DCB, 0xC53F, 0x9DCC, 0xC540, + 0x9DCD, 0xC541, 0x9DCE, 0xC542, 0x9DCF, 0xC543, 0x9DD0, 0xC546, 0x9DD1, 0xC547, 0x9DD2, 0xC54B, 0x9DD3, 0xC54F, 0x9DD4, 0xC550, + 0x9DD5, 0xC551, 0x9DD6, 0xC552, 0x9DD7, 0xC556, 0x9DD8, 0xC55A, 0x9DD9, 0xC55B, 0x9DDA, 0xC55C, 0x9DDB, 0xC55F, 0x9DDC, 0xC562, + 0x9DDD, 0xC563, 0x9DDE, 0xC565, 0x9DDF, 0xC566, 0x9DE0, 0xC567, 0x9DE1, 0xC569, 0x9DE2, 0xC56A, 0x9DE3, 0xC56B, 0x9DE4, 0xC56C, + 0x9DE5, 0xC56D, 0x9DE6, 0xC56E, 0x9DE7, 0xC56F, 0x9DE8, 0xC572, 0x9DE9, 0xC576, 0x9DEA, 0xC577, 0x9DEB, 0xC578, 0x9DEC, 0xC579, + 0x9DED, 0xC57A, 0x9DEE, 0xC57B, 0x9DEF, 0xC57E, 0x9DF0, 0xC57F, 0x9DF1, 0xC581, 0x9DF2, 0xC582, 0x9DF3, 0xC583, 0x9DF4, 0xC585, + 0x9DF5, 0xC586, 0x9DF6, 0xC588, 0x9DF7, 0xC589, 0x9DF8, 0xC58A, 0x9DF9, 0xC58B, 0x9DFA, 0xC58E, 0x9DFB, 0xC590, 0x9DFC, 0xC592, + 0x9DFD, 0xC593, 0x9DFE, 0xC594, 0x9E41, 0xC596, 0x9E42, 0xC599, 0x9E43, 0xC59A, 0x9E44, 0xC59B, 0x9E45, 0xC59D, 0x9E46, 0xC59E, + 0x9E47, 0xC59F, 0x9E48, 0xC5A1, 0x9E49, 0xC5A2, 0x9E4A, 0xC5A3, 0x9E4B, 0xC5A4, 0x9E4C, 0xC5A5, 0x9E4D, 0xC5A6, 0x9E4E, 0xC5A7, + 0x9E4F, 0xC5A8, 0x9E50, 0xC5AA, 0x9E51, 0xC5AB, 0x9E52, 0xC5AC, 0x9E53, 0xC5AD, 0x9E54, 0xC5AE, 0x9E55, 0xC5AF, 0x9E56, 0xC5B0, + 0x9E57, 0xC5B1, 0x9E58, 0xC5B2, 0x9E59, 0xC5B3, 0x9E5A, 0xC5B6, 0x9E61, 0xC5B7, 0x9E62, 0xC5BA, 0x9E63, 0xC5BF, 0x9E64, 0xC5C0, + 0x9E65, 0xC5C1, 0x9E66, 0xC5C2, 0x9E67, 0xC5C3, 0x9E68, 0xC5CB, 0x9E69, 0xC5CD, 0x9E6A, 0xC5CF, 0x9E6B, 0xC5D2, 0x9E6C, 0xC5D3, + 0x9E6D, 0xC5D5, 0x9E6E, 0xC5D6, 0x9E6F, 0xC5D7, 0x9E70, 0xC5D9, 0x9E71, 0xC5DA, 0x9E72, 0xC5DB, 0x9E73, 0xC5DC, 0x9E74, 0xC5DD, + 0x9E75, 0xC5DE, 0x9E76, 0xC5DF, 0x9E77, 0xC5E2, 0x9E78, 0xC5E4, 0x9E79, 0xC5E6, 0x9E7A, 0xC5E7, 0x9E81, 0xC5E8, 0x9E82, 0xC5E9, + 0x9E83, 0xC5EA, 0x9E84, 0xC5EB, 0x9E85, 0xC5EF, 0x9E86, 0xC5F1, 0x9E87, 0xC5F2, 0x9E88, 0xC5F3, 0x9E89, 0xC5F5, 0x9E8A, 0xC5F8, + 0x9E8B, 0xC5F9, 0x9E8C, 0xC5FA, 0x9E8D, 0xC5FB, 0x9E8E, 0xC602, 0x9E8F, 0xC603, 0x9E90, 0xC604, 0x9E91, 0xC609, 0x9E92, 0xC60A, + 0x9E93, 0xC60B, 0x9E94, 0xC60D, 0x9E95, 0xC60E, 0x9E96, 0xC60F, 0x9E97, 0xC611, 0x9E98, 0xC612, 0x9E99, 0xC613, 0x9E9A, 0xC614, + 0x9E9B, 0xC615, 0x9E9C, 0xC616, 0x9E9D, 0xC617, 0x9E9E, 0xC61A, 0x9E9F, 0xC61D, 0x9EA0, 0xC61E, 0x9EA1, 0xC61F, 0x9EA2, 0xC620, + 0x9EA3, 0xC621, 0x9EA4, 0xC622, 0x9EA5, 0xC623, 0x9EA6, 0xC626, 0x9EA7, 0xC627, 0x9EA8, 0xC629, 0x9EA9, 0xC62A, 0x9EAA, 0xC62B, + 0x9EAB, 0xC62F, 0x9EAC, 0xC631, 0x9EAD, 0xC632, 0x9EAE, 0xC636, 0x9EAF, 0xC638, 0x9EB0, 0xC63A, 0x9EB1, 0xC63C, 0x9EB2, 0xC63D, + 0x9EB3, 0xC63E, 0x9EB4, 0xC63F, 0x9EB5, 0xC642, 0x9EB6, 0xC643, 0x9EB7, 0xC645, 0x9EB8, 0xC646, 0x9EB9, 0xC647, 0x9EBA, 0xC649, + 0x9EBB, 0xC64A, 0x9EBC, 0xC64B, 0x9EBD, 0xC64C, 0x9EBE, 0xC64D, 0x9EBF, 0xC64E, 0x9EC0, 0xC64F, 0x9EC1, 0xC652, 0x9EC2, 0xC656, + 0x9EC3, 0xC657, 0x9EC4, 0xC658, 0x9EC5, 0xC659, 0x9EC6, 0xC65A, 0x9EC7, 0xC65B, 0x9EC8, 0xC65E, 0x9EC9, 0xC65F, 0x9ECA, 0xC661, + 0x9ECB, 0xC662, 0x9ECC, 0xC663, 0x9ECD, 0xC664, 0x9ECE, 0xC665, 0x9ECF, 0xC666, 0x9ED0, 0xC667, 0x9ED1, 0xC668, 0x9ED2, 0xC669, + 0x9ED3, 0xC66A, 0x9ED4, 0xC66B, 0x9ED5, 0xC66D, 0x9ED6, 0xC66E, 0x9ED7, 0xC670, 0x9ED8, 0xC672, 0x9ED9, 0xC673, 0x9EDA, 0xC674, + 0x9EDB, 0xC675, 0x9EDC, 0xC676, 0x9EDD, 0xC677, 0x9EDE, 0xC67A, 0x9EDF, 0xC67B, 0x9EE0, 0xC67D, 0x9EE1, 0xC67E, 0x9EE2, 0xC67F, + 0x9EE3, 0xC681, 0x9EE4, 0xC682, 0x9EE5, 0xC683, 0x9EE6, 0xC684, 0x9EE7, 0xC685, 0x9EE8, 0xC686, 0x9EE9, 0xC687, 0x9EEA, 0xC68A, + 0x9EEB, 0xC68C, 0x9EEC, 0xC68E, 0x9EED, 0xC68F, 0x9EEE, 0xC690, 0x9EEF, 0xC691, 0x9EF0, 0xC692, 0x9EF1, 0xC693, 0x9EF2, 0xC696, + 0x9EF3, 0xC697, 0x9EF4, 0xC699, 0x9EF5, 0xC69A, 0x9EF6, 0xC69B, 0x9EF7, 0xC69D, 0x9EF8, 0xC69E, 0x9EF9, 0xC69F, 0x9EFA, 0xC6A0, + 0x9EFB, 0xC6A1, 0x9EFC, 0xC6A2, 0x9EFD, 0xC6A3, 0x9EFE, 0xC6A6, 0x9F41, 0xC6A8, 0x9F42, 0xC6AA, 0x9F43, 0xC6AB, 0x9F44, 0xC6AC, + 0x9F45, 0xC6AD, 0x9F46, 0xC6AE, 0x9F47, 0xC6AF, 0x9F48, 0xC6B2, 0x9F49, 0xC6B3, 0x9F4A, 0xC6B5, 0x9F4B, 0xC6B6, 0x9F4C, 0xC6B7, + 0x9F4D, 0xC6BB, 0x9F4E, 0xC6BC, 0x9F4F, 0xC6BD, 0x9F50, 0xC6BE, 0x9F51, 0xC6BF, 0x9F52, 0xC6C2, 0x9F53, 0xC6C4, 0x9F54, 0xC6C6, + 0x9F55, 0xC6C7, 0x9F56, 0xC6C8, 0x9F57, 0xC6C9, 0x9F58, 0xC6CA, 0x9F59, 0xC6CB, 0x9F5A, 0xC6CE, 0x9F61, 0xC6CF, 0x9F62, 0xC6D1, + 0x9F63, 0xC6D2, 0x9F64, 0xC6D3, 0x9F65, 0xC6D5, 0x9F66, 0xC6D6, 0x9F67, 0xC6D7, 0x9F68, 0xC6D8, 0x9F69, 0xC6D9, 0x9F6A, 0xC6DA, + 0x9F6B, 0xC6DB, 0x9F6C, 0xC6DE, 0x9F6D, 0xC6DF, 0x9F6E, 0xC6E2, 0x9F6F, 0xC6E3, 0x9F70, 0xC6E4, 0x9F71, 0xC6E5, 0x9F72, 0xC6E6, + 0x9F73, 0xC6E7, 0x9F74, 0xC6EA, 0x9F75, 0xC6EB, 0x9F76, 0xC6ED, 0x9F77, 0xC6EE, 0x9F78, 0xC6EF, 0x9F79, 0xC6F1, 0x9F7A, 0xC6F2, + 0x9F81, 0xC6F3, 0x9F82, 0xC6F4, 0x9F83, 0xC6F5, 0x9F84, 0xC6F6, 0x9F85, 0xC6F7, 0x9F86, 0xC6FA, 0x9F87, 0xC6FB, 0x9F88, 0xC6FC, + 0x9F89, 0xC6FE, 0x9F8A, 0xC6FF, 0x9F8B, 0xC700, 0x9F8C, 0xC701, 0x9F8D, 0xC702, 0x9F8E, 0xC703, 0x9F8F, 0xC706, 0x9F90, 0xC707, + 0x9F91, 0xC709, 0x9F92, 0xC70A, 0x9F93, 0xC70B, 0x9F94, 0xC70D, 0x9F95, 0xC70E, 0x9F96, 0xC70F, 0x9F97, 0xC710, 0x9F98, 0xC711, + 0x9F99, 0xC712, 0x9F9A, 0xC713, 0x9F9B, 0xC716, 0x9F9C, 0xC718, 0x9F9D, 0xC71A, 0x9F9E, 0xC71B, 0x9F9F, 0xC71C, 0x9FA0, 0xC71D, + 0x9FA1, 0xC71E, 0x9FA2, 0xC71F, 0x9FA3, 0xC722, 0x9FA4, 0xC723, 0x9FA5, 0xC725, 0x9FA6, 0xC726, 0x9FA7, 0xC727, 0x9FA8, 0xC729, + 0x9FA9, 0xC72A, 0x9FAA, 0xC72B, 0x9FAB, 0xC72C, 0x9FAC, 0xC72D, 0x9FAD, 0xC72E, 0x9FAE, 0xC72F, 0x9FAF, 0xC732, 0x9FB0, 0xC734, + 0x9FB1, 0xC736, 0x9FB2, 0xC738, 0x9FB3, 0xC739, 0x9FB4, 0xC73A, 0x9FB5, 0xC73B, 0x9FB6, 0xC73E, 0x9FB7, 0xC73F, 0x9FB8, 0xC741, + 0x9FB9, 0xC742, 0x9FBA, 0xC743, 0x9FBB, 0xC745, 0x9FBC, 0xC746, 0x9FBD, 0xC747, 0x9FBE, 0xC748, 0x9FBF, 0xC749, 0x9FC0, 0xC74B, + 0x9FC1, 0xC74E, 0x9FC2, 0xC750, 0x9FC3, 0xC759, 0x9FC4, 0xC75A, 0x9FC5, 0xC75B, 0x9FC6, 0xC75D, 0x9FC7, 0xC75E, 0x9FC8, 0xC75F, + 0x9FC9, 0xC761, 0x9FCA, 0xC762, 0x9FCB, 0xC763, 0x9FCC, 0xC764, 0x9FCD, 0xC765, 0x9FCE, 0xC766, 0x9FCF, 0xC767, 0x9FD0, 0xC769, + 0x9FD1, 0xC76A, 0x9FD2, 0xC76C, 0x9FD3, 0xC76D, 0x9FD4, 0xC76E, 0x9FD5, 0xC76F, 0x9FD6, 0xC770, 0x9FD7, 0xC771, 0x9FD8, 0xC772, + 0x9FD9, 0xC773, 0x9FDA, 0xC776, 0x9FDB, 0xC777, 0x9FDC, 0xC779, 0x9FDD, 0xC77A, 0x9FDE, 0xC77B, 0x9FDF, 0xC77F, 0x9FE0, 0xC780, + 0x9FE1, 0xC781, 0x9FE2, 0xC782, 0x9FE3, 0xC786, 0x9FE4, 0xC78B, 0x9FE5, 0xC78C, 0x9FE6, 0xC78D, 0x9FE7, 0xC78F, 0x9FE8, 0xC792, + 0x9FE9, 0xC793, 0x9FEA, 0xC795, 0x9FEB, 0xC799, 0x9FEC, 0xC79B, 0x9FED, 0xC79C, 0x9FEE, 0xC79D, 0x9FEF, 0xC79E, 0x9FF0, 0xC79F, + 0x9FF1, 0xC7A2, 0x9FF2, 0xC7A7, 0x9FF3, 0xC7A8, 0x9FF4, 0xC7A9, 0x9FF5, 0xC7AA, 0x9FF6, 0xC7AB, 0x9FF7, 0xC7AE, 0x9FF8, 0xC7AF, + 0x9FF9, 0xC7B1, 0x9FFA, 0xC7B2, 0x9FFB, 0xC7B3, 0x9FFC, 0xC7B5, 0x9FFD, 0xC7B6, 0x9FFE, 0xC7B7, 0xA041, 0xC7B8, 0xA042, 0xC7B9, + 0xA043, 0xC7BA, 0xA044, 0xC7BB, 0xA045, 0xC7BE, 0xA046, 0xC7C2, 0xA047, 0xC7C3, 0xA048, 0xC7C4, 0xA049, 0xC7C5, 0xA04A, 0xC7C6, + 0xA04B, 0xC7C7, 0xA04C, 0xC7CA, 0xA04D, 0xC7CB, 0xA04E, 0xC7CD, 0xA04F, 0xC7CF, 0xA050, 0xC7D1, 0xA051, 0xC7D2, 0xA052, 0xC7D3, + 0xA053, 0xC7D4, 0xA054, 0xC7D5, 0xA055, 0xC7D6, 0xA056, 0xC7D7, 0xA057, 0xC7D9, 0xA058, 0xC7DA, 0xA059, 0xC7DB, 0xA05A, 0xC7DC, + 0xA061, 0xC7DE, 0xA062, 0xC7DF, 0xA063, 0xC7E0, 0xA064, 0xC7E1, 0xA065, 0xC7E2, 0xA066, 0xC7E3, 0xA067, 0xC7E5, 0xA068, 0xC7E6, + 0xA069, 0xC7E7, 0xA06A, 0xC7E9, 0xA06B, 0xC7EA, 0xA06C, 0xC7EB, 0xA06D, 0xC7ED, 0xA06E, 0xC7EE, 0xA06F, 0xC7EF, 0xA070, 0xC7F0, + 0xA071, 0xC7F1, 0xA072, 0xC7F2, 0xA073, 0xC7F3, 0xA074, 0xC7F4, 0xA075, 0xC7F5, 0xA076, 0xC7F6, 0xA077, 0xC7F7, 0xA078, 0xC7F8, + 0xA079, 0xC7F9, 0xA07A, 0xC7FA, 0xA081, 0xC7FB, 0xA082, 0xC7FC, 0xA083, 0xC7FD, 0xA084, 0xC7FE, 0xA085, 0xC7FF, 0xA086, 0xC802, + 0xA087, 0xC803, 0xA088, 0xC805, 0xA089, 0xC806, 0xA08A, 0xC807, 0xA08B, 0xC809, 0xA08C, 0xC80B, 0xA08D, 0xC80C, 0xA08E, 0xC80D, + 0xA08F, 0xC80E, 0xA090, 0xC80F, 0xA091, 0xC812, 0xA092, 0xC814, 0xA093, 0xC817, 0xA094, 0xC818, 0xA095, 0xC819, 0xA096, 0xC81A, + 0xA097, 0xC81B, 0xA098, 0xC81E, 0xA099, 0xC81F, 0xA09A, 0xC821, 0xA09B, 0xC822, 0xA09C, 0xC823, 0xA09D, 0xC825, 0xA09E, 0xC826, + 0xA09F, 0xC827, 0xA0A0, 0xC828, 0xA0A1, 0xC829, 0xA0A2, 0xC82A, 0xA0A3, 0xC82B, 0xA0A4, 0xC82E, 0xA0A5, 0xC830, 0xA0A6, 0xC832, + 0xA0A7, 0xC833, 0xA0A8, 0xC834, 0xA0A9, 0xC835, 0xA0AA, 0xC836, 0xA0AB, 0xC837, 0xA0AC, 0xC839, 0xA0AD, 0xC83A, 0xA0AE, 0xC83B, + 0xA0AF, 0xC83D, 0xA0B0, 0xC83E, 0xA0B1, 0xC83F, 0xA0B2, 0xC841, 0xA0B3, 0xC842, 0xA0B4, 0xC843, 0xA0B5, 0xC844, 0xA0B6, 0xC845, + 0xA0B7, 0xC846, 0xA0B8, 0xC847, 0xA0B9, 0xC84A, 0xA0BA, 0xC84B, 0xA0BB, 0xC84E, 0xA0BC, 0xC84F, 0xA0BD, 0xC850, 0xA0BE, 0xC851, + 0xA0BF, 0xC852, 0xA0C0, 0xC853, 0xA0C1, 0xC855, 0xA0C2, 0xC856, 0xA0C3, 0xC857, 0xA0C4, 0xC858, 0xA0C5, 0xC859, 0xA0C6, 0xC85A, + 0xA0C7, 0xC85B, 0xA0C8, 0xC85C, 0xA0C9, 0xC85D, 0xA0CA, 0xC85E, 0xA0CB, 0xC85F, 0xA0CC, 0xC860, 0xA0CD, 0xC861, 0xA0CE, 0xC862, + 0xA0CF, 0xC863, 0xA0D0, 0xC864, 0xA0D1, 0xC865, 0xA0D2, 0xC866, 0xA0D3, 0xC867, 0xA0D4, 0xC868, 0xA0D5, 0xC869, 0xA0D6, 0xC86A, + 0xA0D7, 0xC86B, 0xA0D8, 0xC86C, 0xA0D9, 0xC86D, 0xA0DA, 0xC86E, 0xA0DB, 0xC86F, 0xA0DC, 0xC872, 0xA0DD, 0xC873, 0xA0DE, 0xC875, + 0xA0DF, 0xC876, 0xA0E0, 0xC877, 0xA0E1, 0xC879, 0xA0E2, 0xC87B, 0xA0E3, 0xC87C, 0xA0E4, 0xC87D, 0xA0E5, 0xC87E, 0xA0E6, 0xC87F, + 0xA0E7, 0xC882, 0xA0E8, 0xC884, 0xA0E9, 0xC888, 0xA0EA, 0xC889, 0xA0EB, 0xC88A, 0xA0EC, 0xC88E, 0xA0ED, 0xC88F, 0xA0EE, 0xC890, + 0xA0EF, 0xC891, 0xA0F0, 0xC892, 0xA0F1, 0xC893, 0xA0F2, 0xC895, 0xA0F3, 0xC896, 0xA0F4, 0xC897, 0xA0F5, 0xC898, 0xA0F6, 0xC899, + 0xA0F7, 0xC89A, 0xA0F8, 0xC89B, 0xA0F9, 0xC89C, 0xA0FA, 0xC89E, 0xA0FB, 0xC8A0, 0xA0FC, 0xC8A2, 0xA0FD, 0xC8A3, 0xA0FE, 0xC8A4, + 0xA141, 0xC8A5, 0xA142, 0xC8A6, 0xA143, 0xC8A7, 0xA144, 0xC8A9, 0xA145, 0xC8AA, 0xA146, 0xC8AB, 0xA147, 0xC8AC, 0xA148, 0xC8AD, + 0xA149, 0xC8AE, 0xA14A, 0xC8AF, 0xA14B, 0xC8B0, 0xA14C, 0xC8B1, 0xA14D, 0xC8B2, 0xA14E, 0xC8B3, 0xA14F, 0xC8B4, 0xA150, 0xC8B5, + 0xA151, 0xC8B6, 0xA152, 0xC8B7, 0xA153, 0xC8B8, 0xA154, 0xC8B9, 0xA155, 0xC8BA, 0xA156, 0xC8BB, 0xA157, 0xC8BE, 0xA158, 0xC8BF, + 0xA159, 0xC8C0, 0xA15A, 0xC8C1, 0xA161, 0xC8C2, 0xA162, 0xC8C3, 0xA163, 0xC8C5, 0xA164, 0xC8C6, 0xA165, 0xC8C7, 0xA166, 0xC8C9, + 0xA167, 0xC8CA, 0xA168, 0xC8CB, 0xA169, 0xC8CD, 0xA16A, 0xC8CE, 0xA16B, 0xC8CF, 0xA16C, 0xC8D0, 0xA16D, 0xC8D1, 0xA16E, 0xC8D2, + 0xA16F, 0xC8D3, 0xA170, 0xC8D6, 0xA171, 0xC8D8, 0xA172, 0xC8DA, 0xA173, 0xC8DB, 0xA174, 0xC8DC, 0xA175, 0xC8DD, 0xA176, 0xC8DE, + 0xA177, 0xC8DF, 0xA178, 0xC8E2, 0xA179, 0xC8E3, 0xA17A, 0xC8E5, 0xA181, 0xC8E6, 0xA182, 0xC8E7, 0xA183, 0xC8E8, 0xA184, 0xC8E9, + 0xA185, 0xC8EA, 0xA186, 0xC8EB, 0xA187, 0xC8EC, 0xA188, 0xC8ED, 0xA189, 0xC8EE, 0xA18A, 0xC8EF, 0xA18B, 0xC8F0, 0xA18C, 0xC8F1, + 0xA18D, 0xC8F2, 0xA18E, 0xC8F3, 0xA18F, 0xC8F4, 0xA190, 0xC8F6, 0xA191, 0xC8F7, 0xA192, 0xC8F8, 0xA193, 0xC8F9, 0xA194, 0xC8FA, + 0xA195, 0xC8FB, 0xA196, 0xC8FE, 0xA197, 0xC8FF, 0xA198, 0xC901, 0xA199, 0xC902, 0xA19A, 0xC903, 0xA19B, 0xC907, 0xA19C, 0xC908, + 0xA19D, 0xC909, 0xA19E, 0xC90A, 0xA19F, 0xC90B, 0xA1A0, 0xC90E, 0xA1A1, 0x3000, 0xA1A2, 0x3001, 0xA1A3, 0x3002, 0xA1A4, 0x00B7, + 0xA1A5, 0x2025, 0xA1A6, 0x2026, 0xA1A7, 0x00A8, 0xA1A8, 0x3003, 0xA1A9, 0x00AD, 0xA1AA, 0x2015, 0xA1AB, 0x2225, 0xA1AC, 0xFF3C, + 0xA1AD, 0x223C, 0xA1AE, 0x2018, 0xA1AF, 0x2019, 0xA1B0, 0x201C, 0xA1B1, 0x201D, 0xA1B2, 0x3014, 0xA1B3, 0x3015, 0xA1B4, 0x3008, + 0xA1B5, 0x3009, 0xA1B6, 0x300A, 0xA1B7, 0x300B, 0xA1B8, 0x300C, 0xA1B9, 0x300D, 0xA1BA, 0x300E, 0xA1BB, 0x300F, 0xA1BC, 0x3010, + 0xA1BD, 0x3011, 0xA1BE, 0x00B1, 0xA1BF, 0x00D7, 0xA1C0, 0x00F7, 0xA1C1, 0x2260, 0xA1C2, 0x2264, 0xA1C3, 0x2265, 0xA1C4, 0x221E, + 0xA1C5, 0x2234, 0xA1C6, 0x00B0, 0xA1C7, 0x2032, 0xA1C8, 0x2033, 0xA1C9, 0x2103, 0xA1CA, 0x212B, 0xA1CB, 0xFFE0, 0xA1CC, 0xFFE1, + 0xA1CD, 0xFFE5, 0xA1CE, 0x2642, 0xA1CF, 0x2640, 0xA1D0, 0x2220, 0xA1D1, 0x22A5, 0xA1D2, 0x2312, 0xA1D3, 0x2202, 0xA1D4, 0x2207, + 0xA1D5, 0x2261, 0xA1D6, 0x2252, 0xA1D7, 0x00A7, 0xA1D8, 0x203B, 0xA1D9, 0x2606, 0xA1DA, 0x2605, 0xA1DB, 0x25CB, 0xA1DC, 0x25CF, + 0xA1DD, 0x25CE, 0xA1DE, 0x25C7, 0xA1DF, 0x25C6, 0xA1E0, 0x25A1, 0xA1E1, 0x25A0, 0xA1E2, 0x25B3, 0xA1E3, 0x25B2, 0xA1E4, 0x25BD, + 0xA1E5, 0x25BC, 0xA1E6, 0x2192, 0xA1E7, 0x2190, 0xA1E8, 0x2191, 0xA1E9, 0x2193, 0xA1EA, 0x2194, 0xA1EB, 0x3013, 0xA1EC, 0x226A, + 0xA1ED, 0x226B, 0xA1EE, 0x221A, 0xA1EF, 0x223D, 0xA1F0, 0x221D, 0xA1F1, 0x2235, 0xA1F2, 0x222B, 0xA1F3, 0x222C, 0xA1F4, 0x2208, + 0xA1F5, 0x220B, 0xA1F6, 0x2286, 0xA1F7, 0x2287, 0xA1F8, 0x2282, 0xA1F9, 0x2283, 0xA1FA, 0x222A, 0xA1FB, 0x2229, 0xA1FC, 0x2227, + 0xA1FD, 0x2228, 0xA1FE, 0xFFE2, 0xA241, 0xC910, 0xA242, 0xC912, 0xA243, 0xC913, 0xA244, 0xC914, 0xA245, 0xC915, 0xA246, 0xC916, + 0xA247, 0xC917, 0xA248, 0xC919, 0xA249, 0xC91A, 0xA24A, 0xC91B, 0xA24B, 0xC91C, 0xA24C, 0xC91D, 0xA24D, 0xC91E, 0xA24E, 0xC91F, + 0xA24F, 0xC920, 0xA250, 0xC921, 0xA251, 0xC922, 0xA252, 0xC923, 0xA253, 0xC924, 0xA254, 0xC925, 0xA255, 0xC926, 0xA256, 0xC927, + 0xA257, 0xC928, 0xA258, 0xC929, 0xA259, 0xC92A, 0xA25A, 0xC92B, 0xA261, 0xC92D, 0xA262, 0xC92E, 0xA263, 0xC92F, 0xA264, 0xC930, + 0xA265, 0xC931, 0xA266, 0xC932, 0xA267, 0xC933, 0xA268, 0xC935, 0xA269, 0xC936, 0xA26A, 0xC937, 0xA26B, 0xC938, 0xA26C, 0xC939, + 0xA26D, 0xC93A, 0xA26E, 0xC93B, 0xA26F, 0xC93C, 0xA270, 0xC93D, 0xA271, 0xC93E, 0xA272, 0xC93F, 0xA273, 0xC940, 0xA274, 0xC941, + 0xA275, 0xC942, 0xA276, 0xC943, 0xA277, 0xC944, 0xA278, 0xC945, 0xA279, 0xC946, 0xA27A, 0xC947, 0xA281, 0xC948, 0xA282, 0xC949, + 0xA283, 0xC94A, 0xA284, 0xC94B, 0xA285, 0xC94C, 0xA286, 0xC94D, 0xA287, 0xC94E, 0xA288, 0xC94F, 0xA289, 0xC952, 0xA28A, 0xC953, + 0xA28B, 0xC955, 0xA28C, 0xC956, 0xA28D, 0xC957, 0xA28E, 0xC959, 0xA28F, 0xC95A, 0xA290, 0xC95B, 0xA291, 0xC95C, 0xA292, 0xC95D, + 0xA293, 0xC95E, 0xA294, 0xC95F, 0xA295, 0xC962, 0xA296, 0xC964, 0xA297, 0xC965, 0xA298, 0xC966, 0xA299, 0xC967, 0xA29A, 0xC968, + 0xA29B, 0xC969, 0xA29C, 0xC96A, 0xA29D, 0xC96B, 0xA29E, 0xC96D, 0xA29F, 0xC96E, 0xA2A0, 0xC96F, 0xA2A1, 0x21D2, 0xA2A2, 0x21D4, + 0xA2A3, 0x2200, 0xA2A4, 0x2203, 0xA2A5, 0x00B4, 0xA2A6, 0xFF5E, 0xA2A7, 0x02C7, 0xA2A8, 0x02D8, 0xA2A9, 0x02DD, 0xA2AA, 0x02DA, + 0xA2AB, 0x02D9, 0xA2AC, 0x00B8, 0xA2AD, 0x02DB, 0xA2AE, 0x00A1, 0xA2AF, 0x00BF, 0xA2B0, 0x02D0, 0xA2B1, 0x222E, 0xA2B2, 0x2211, + 0xA2B3, 0x220F, 0xA2B4, 0x00A4, 0xA2B5, 0x2109, 0xA2B6, 0x2030, 0xA2B7, 0x25C1, 0xA2B8, 0x25C0, 0xA2B9, 0x25B7, 0xA2BA, 0x25B6, + 0xA2BB, 0x2664, 0xA2BC, 0x2660, 0xA2BD, 0x2661, 0xA2BE, 0x2665, 0xA2BF, 0x2667, 0xA2C0, 0x2663, 0xA2C1, 0x2299, 0xA2C2, 0x25C8, + 0xA2C3, 0x25A3, 0xA2C4, 0x25D0, 0xA2C5, 0x25D1, 0xA2C6, 0x2592, 0xA2C7, 0x25A4, 0xA2C8, 0x25A5, 0xA2C9, 0x25A8, 0xA2CA, 0x25A7, + 0xA2CB, 0x25A6, 0xA2CC, 0x25A9, 0xA2CD, 0x2668, 0xA2CE, 0x260F, 0xA2CF, 0x260E, 0xA2D0, 0x261C, 0xA2D1, 0x261E, 0xA2D2, 0x00B6, + 0xA2D3, 0x2020, 0xA2D4, 0x2021, 0xA2D5, 0x2195, 0xA2D6, 0x2197, 0xA2D7, 0x2199, 0xA2D8, 0x2196, 0xA2D9, 0x2198, 0xA2DA, 0x266D, + 0xA2DB, 0x2669, 0xA2DC, 0x266A, 0xA2DD, 0x266C, 0xA2DE, 0x327F, 0xA2DF, 0x321C, 0xA2E0, 0x2116, 0xA2E1, 0x33C7, 0xA2E2, 0x2122, + 0xA2E3, 0x33C2, 0xA2E4, 0x33D8, 0xA2E5, 0x2121, 0xA2E6, 0x20AC, 0xA2E7, 0x00AE, 0xA341, 0xC971, 0xA342, 0xC972, 0xA343, 0xC973, + 0xA344, 0xC975, 0xA345, 0xC976, 0xA346, 0xC977, 0xA347, 0xC978, 0xA348, 0xC979, 0xA349, 0xC97A, 0xA34A, 0xC97B, 0xA34B, 0xC97D, + 0xA34C, 0xC97E, 0xA34D, 0xC97F, 0xA34E, 0xC980, 0xA34F, 0xC981, 0xA350, 0xC982, 0xA351, 0xC983, 0xA352, 0xC984, 0xA353, 0xC985, + 0xA354, 0xC986, 0xA355, 0xC987, 0xA356, 0xC98A, 0xA357, 0xC98B, 0xA358, 0xC98D, 0xA359, 0xC98E, 0xA35A, 0xC98F, 0xA361, 0xC991, + 0xA362, 0xC992, 0xA363, 0xC993, 0xA364, 0xC994, 0xA365, 0xC995, 0xA366, 0xC996, 0xA367, 0xC997, 0xA368, 0xC99A, 0xA369, 0xC99C, + 0xA36A, 0xC99E, 0xA36B, 0xC99F, 0xA36C, 0xC9A0, 0xA36D, 0xC9A1, 0xA36E, 0xC9A2, 0xA36F, 0xC9A3, 0xA370, 0xC9A4, 0xA371, 0xC9A5, + 0xA372, 0xC9A6, 0xA373, 0xC9A7, 0xA374, 0xC9A8, 0xA375, 0xC9A9, 0xA376, 0xC9AA, 0xA377, 0xC9AB, 0xA378, 0xC9AC, 0xA379, 0xC9AD, + 0xA37A, 0xC9AE, 0xA381, 0xC9AF, 0xA382, 0xC9B0, 0xA383, 0xC9B1, 0xA384, 0xC9B2, 0xA385, 0xC9B3, 0xA386, 0xC9B4, 0xA387, 0xC9B5, + 0xA388, 0xC9B6, 0xA389, 0xC9B7, 0xA38A, 0xC9B8, 0xA38B, 0xC9B9, 0xA38C, 0xC9BA, 0xA38D, 0xC9BB, 0xA38E, 0xC9BC, 0xA38F, 0xC9BD, + 0xA390, 0xC9BE, 0xA391, 0xC9BF, 0xA392, 0xC9C2, 0xA393, 0xC9C3, 0xA394, 0xC9C5, 0xA395, 0xC9C6, 0xA396, 0xC9C9, 0xA397, 0xC9CB, + 0xA398, 0xC9CC, 0xA399, 0xC9CD, 0xA39A, 0xC9CE, 0xA39B, 0xC9CF, 0xA39C, 0xC9D2, 0xA39D, 0xC9D4, 0xA39E, 0xC9D7, 0xA39F, 0xC9D8, + 0xA3A0, 0xC9DB, 0xA3A1, 0xFF01, 0xA3A2, 0xFF02, 0xA3A3, 0xFF03, 0xA3A4, 0xFF04, 0xA3A5, 0xFF05, 0xA3A6, 0xFF06, 0xA3A7, 0xFF07, + 0xA3A8, 0xFF08, 0xA3A9, 0xFF09, 0xA3AA, 0xFF0A, 0xA3AB, 0xFF0B, 0xA3AC, 0xFF0C, 0xA3AD, 0xFF0D, 0xA3AE, 0xFF0E, 0xA3AF, 0xFF0F, + 0xA3B0, 0xFF10, 0xA3B1, 0xFF11, 0xA3B2, 0xFF12, 0xA3B3, 0xFF13, 0xA3B4, 0xFF14, 0xA3B5, 0xFF15, 0xA3B6, 0xFF16, 0xA3B7, 0xFF17, + 0xA3B8, 0xFF18, 0xA3B9, 0xFF19, 0xA3BA, 0xFF1A, 0xA3BB, 0xFF1B, 0xA3BC, 0xFF1C, 0xA3BD, 0xFF1D, 0xA3BE, 0xFF1E, 0xA3BF, 0xFF1F, + 0xA3C0, 0xFF20, 0xA3C1, 0xFF21, 0xA3C2, 0xFF22, 0xA3C3, 0xFF23, 0xA3C4, 0xFF24, 0xA3C5, 0xFF25, 0xA3C6, 0xFF26, 0xA3C7, 0xFF27, + 0xA3C8, 0xFF28, 0xA3C9, 0xFF29, 0xA3CA, 0xFF2A, 0xA3CB, 0xFF2B, 0xA3CC, 0xFF2C, 0xA3CD, 0xFF2D, 0xA3CE, 0xFF2E, 0xA3CF, 0xFF2F, + 0xA3D0, 0xFF30, 0xA3D1, 0xFF31, 0xA3D2, 0xFF32, 0xA3D3, 0xFF33, 0xA3D4, 0xFF34, 0xA3D5, 0xFF35, 0xA3D6, 0xFF36, 0xA3D7, 0xFF37, + 0xA3D8, 0xFF38, 0xA3D9, 0xFF39, 0xA3DA, 0xFF3A, 0xA3DB, 0xFF3B, 0xA3DC, 0xFFE6, 0xA3DD, 0xFF3D, 0xA3DE, 0xFF3E, 0xA3DF, 0xFF3F, + 0xA3E0, 0xFF40, 0xA3E1, 0xFF41, 0xA3E2, 0xFF42, 0xA3E3, 0xFF43, 0xA3E4, 0xFF44, 0xA3E5, 0xFF45, 0xA3E6, 0xFF46, 0xA3E7, 0xFF47, + 0xA3E8, 0xFF48, 0xA3E9, 0xFF49, 0xA3EA, 0xFF4A, 0xA3EB, 0xFF4B, 0xA3EC, 0xFF4C, 0xA3ED, 0xFF4D, 0xA3EE, 0xFF4E, 0xA3EF, 0xFF4F, + 0xA3F0, 0xFF50, 0xA3F1, 0xFF51, 0xA3F2, 0xFF52, 0xA3F3, 0xFF53, 0xA3F4, 0xFF54, 0xA3F5, 0xFF55, 0xA3F6, 0xFF56, 0xA3F7, 0xFF57, + 0xA3F8, 0xFF58, 0xA3F9, 0xFF59, 0xA3FA, 0xFF5A, 0xA3FB, 0xFF5B, 0xA3FC, 0xFF5C, 0xA3FD, 0xFF5D, 0xA3FE, 0xFFE3, 0xA441, 0xC9DE, + 0xA442, 0xC9DF, 0xA443, 0xC9E1, 0xA444, 0xC9E3, 0xA445, 0xC9E5, 0xA446, 0xC9E6, 0xA447, 0xC9E8, 0xA448, 0xC9E9, 0xA449, 0xC9EA, + 0xA44A, 0xC9EB, 0xA44B, 0xC9EE, 0xA44C, 0xC9F2, 0xA44D, 0xC9F3, 0xA44E, 0xC9F4, 0xA44F, 0xC9F5, 0xA450, 0xC9F6, 0xA451, 0xC9F7, + 0xA452, 0xC9FA, 0xA453, 0xC9FB, 0xA454, 0xC9FD, 0xA455, 0xC9FE, 0xA456, 0xC9FF, 0xA457, 0xCA01, 0xA458, 0xCA02, 0xA459, 0xCA03, + 0xA45A, 0xCA04, 0xA461, 0xCA05, 0xA462, 0xCA06, 0xA463, 0xCA07, 0xA464, 0xCA0A, 0xA465, 0xCA0E, 0xA466, 0xCA0F, 0xA467, 0xCA10, + 0xA468, 0xCA11, 0xA469, 0xCA12, 0xA46A, 0xCA13, 0xA46B, 0xCA15, 0xA46C, 0xCA16, 0xA46D, 0xCA17, 0xA46E, 0xCA19, 0xA46F, 0xCA1A, + 0xA470, 0xCA1B, 0xA471, 0xCA1C, 0xA472, 0xCA1D, 0xA473, 0xCA1E, 0xA474, 0xCA1F, 0xA475, 0xCA20, 0xA476, 0xCA21, 0xA477, 0xCA22, + 0xA478, 0xCA23, 0xA479, 0xCA24, 0xA47A, 0xCA25, 0xA481, 0xCA26, 0xA482, 0xCA27, 0xA483, 0xCA28, 0xA484, 0xCA2A, 0xA485, 0xCA2B, + 0xA486, 0xCA2C, 0xA487, 0xCA2D, 0xA488, 0xCA2E, 0xA489, 0xCA2F, 0xA48A, 0xCA30, 0xA48B, 0xCA31, 0xA48C, 0xCA32, 0xA48D, 0xCA33, + 0xA48E, 0xCA34, 0xA48F, 0xCA35, 0xA490, 0xCA36, 0xA491, 0xCA37, 0xA492, 0xCA38, 0xA493, 0xCA39, 0xA494, 0xCA3A, 0xA495, 0xCA3B, + 0xA496, 0xCA3C, 0xA497, 0xCA3D, 0xA498, 0xCA3E, 0xA499, 0xCA3F, 0xA49A, 0xCA40, 0xA49B, 0xCA41, 0xA49C, 0xCA42, 0xA49D, 0xCA43, + 0xA49E, 0xCA44, 0xA49F, 0xCA45, 0xA4A0, 0xCA46, 0xA4A1, 0x3131, 0xA4A2, 0x3132, 0xA4A3, 0x3133, 0xA4A4, 0x3134, 0xA4A5, 0x3135, + 0xA4A6, 0x3136, 0xA4A7, 0x3137, 0xA4A8, 0x3138, 0xA4A9, 0x3139, 0xA4AA, 0x313A, 0xA4AB, 0x313B, 0xA4AC, 0x313C, 0xA4AD, 0x313D, + 0xA4AE, 0x313E, 0xA4AF, 0x313F, 0xA4B0, 0x3140, 0xA4B1, 0x3141, 0xA4B2, 0x3142, 0xA4B3, 0x3143, 0xA4B4, 0x3144, 0xA4B5, 0x3145, + 0xA4B6, 0x3146, 0xA4B7, 0x3147, 0xA4B8, 0x3148, 0xA4B9, 0x3149, 0xA4BA, 0x314A, 0xA4BB, 0x314B, 0xA4BC, 0x314C, 0xA4BD, 0x314D, + 0xA4BE, 0x314E, 0xA4BF, 0x314F, 0xA4C0, 0x3150, 0xA4C1, 0x3151, 0xA4C2, 0x3152, 0xA4C3, 0x3153, 0xA4C4, 0x3154, 0xA4C5, 0x3155, + 0xA4C6, 0x3156, 0xA4C7, 0x3157, 0xA4C8, 0x3158, 0xA4C9, 0x3159, 0xA4CA, 0x315A, 0xA4CB, 0x315B, 0xA4CC, 0x315C, 0xA4CD, 0x315D, + 0xA4CE, 0x315E, 0xA4CF, 0x315F, 0xA4D0, 0x3160, 0xA4D1, 0x3161, 0xA4D2, 0x3162, 0xA4D3, 0x3163, 0xA4D4, 0x3164, 0xA4D5, 0x3165, + 0xA4D6, 0x3166, 0xA4D7, 0x3167, 0xA4D8, 0x3168, 0xA4D9, 0x3169, 0xA4DA, 0x316A, 0xA4DB, 0x316B, 0xA4DC, 0x316C, 0xA4DD, 0x316D, + 0xA4DE, 0x316E, 0xA4DF, 0x316F, 0xA4E0, 0x3170, 0xA4E1, 0x3171, 0xA4E2, 0x3172, 0xA4E3, 0x3173, 0xA4E4, 0x3174, 0xA4E5, 0x3175, + 0xA4E6, 0x3176, 0xA4E7, 0x3177, 0xA4E8, 0x3178, 0xA4E9, 0x3179, 0xA4EA, 0x317A, 0xA4EB, 0x317B, 0xA4EC, 0x317C, 0xA4ED, 0x317D, + 0xA4EE, 0x317E, 0xA4EF, 0x317F, 0xA4F0, 0x3180, 0xA4F1, 0x3181, 0xA4F2, 0x3182, 0xA4F3, 0x3183, 0xA4F4, 0x3184, 0xA4F5, 0x3185, + 0xA4F6, 0x3186, 0xA4F7, 0x3187, 0xA4F8, 0x3188, 0xA4F9, 0x3189, 0xA4FA, 0x318A, 0xA4FB, 0x318B, 0xA4FC, 0x318C, 0xA4FD, 0x318D, + 0xA4FE, 0x318E, 0xA541, 0xCA47, 0xA542, 0xCA48, 0xA543, 0xCA49, 0xA544, 0xCA4A, 0xA545, 0xCA4B, 0xA546, 0xCA4E, 0xA547, 0xCA4F, + 0xA548, 0xCA51, 0xA549, 0xCA52, 0xA54A, 0xCA53, 0xA54B, 0xCA55, 0xA54C, 0xCA56, 0xA54D, 0xCA57, 0xA54E, 0xCA58, 0xA54F, 0xCA59, + 0xA550, 0xCA5A, 0xA551, 0xCA5B, 0xA552, 0xCA5E, 0xA553, 0xCA62, 0xA554, 0xCA63, 0xA555, 0xCA64, 0xA556, 0xCA65, 0xA557, 0xCA66, + 0xA558, 0xCA67, 0xA559, 0xCA69, 0xA55A, 0xCA6A, 0xA561, 0xCA6B, 0xA562, 0xCA6C, 0xA563, 0xCA6D, 0xA564, 0xCA6E, 0xA565, 0xCA6F, + 0xA566, 0xCA70, 0xA567, 0xCA71, 0xA568, 0xCA72, 0xA569, 0xCA73, 0xA56A, 0xCA74, 0xA56B, 0xCA75, 0xA56C, 0xCA76, 0xA56D, 0xCA77, + 0xA56E, 0xCA78, 0xA56F, 0xCA79, 0xA570, 0xCA7A, 0xA571, 0xCA7B, 0xA572, 0xCA7C, 0xA573, 0xCA7E, 0xA574, 0xCA7F, 0xA575, 0xCA80, + 0xA576, 0xCA81, 0xA577, 0xCA82, 0xA578, 0xCA83, 0xA579, 0xCA85, 0xA57A, 0xCA86, 0xA581, 0xCA87, 0xA582, 0xCA88, 0xA583, 0xCA89, + 0xA584, 0xCA8A, 0xA585, 0xCA8B, 0xA586, 0xCA8C, 0xA587, 0xCA8D, 0xA588, 0xCA8E, 0xA589, 0xCA8F, 0xA58A, 0xCA90, 0xA58B, 0xCA91, + 0xA58C, 0xCA92, 0xA58D, 0xCA93, 0xA58E, 0xCA94, 0xA58F, 0xCA95, 0xA590, 0xCA96, 0xA591, 0xCA97, 0xA592, 0xCA99, 0xA593, 0xCA9A, + 0xA594, 0xCA9B, 0xA595, 0xCA9C, 0xA596, 0xCA9D, 0xA597, 0xCA9E, 0xA598, 0xCA9F, 0xA599, 0xCAA0, 0xA59A, 0xCAA1, 0xA59B, 0xCAA2, + 0xA59C, 0xCAA3, 0xA59D, 0xCAA4, 0xA59E, 0xCAA5, 0xA59F, 0xCAA6, 0xA5A0, 0xCAA7, 0xA5A1, 0x2170, 0xA5A2, 0x2171, 0xA5A3, 0x2172, + 0xA5A4, 0x2173, 0xA5A5, 0x2174, 0xA5A6, 0x2175, 0xA5A7, 0x2176, 0xA5A8, 0x2177, 0xA5A9, 0x2178, 0xA5AA, 0x2179, 0xA5B0, 0x2160, + 0xA5B1, 0x2161, 0xA5B2, 0x2162, 0xA5B3, 0x2163, 0xA5B4, 0x2164, 0xA5B5, 0x2165, 0xA5B6, 0x2166, 0xA5B7, 0x2167, 0xA5B8, 0x2168, + 0xA5B9, 0x2169, 0xA5C1, 0x0391, 0xA5C2, 0x0392, 0xA5C3, 0x0393, 0xA5C4, 0x0394, 0xA5C5, 0x0395, 0xA5C6, 0x0396, 0xA5C7, 0x0397, + 0xA5C8, 0x0398, 0xA5C9, 0x0399, 0xA5CA, 0x039A, 0xA5CB, 0x039B, 0xA5CC, 0x039C, 0xA5CD, 0x039D, 0xA5CE, 0x039E, 0xA5CF, 0x039F, + 0xA5D0, 0x03A0, 0xA5D1, 0x03A1, 0xA5D2, 0x03A3, 0xA5D3, 0x03A4, 0xA5D4, 0x03A5, 0xA5D5, 0x03A6, 0xA5D6, 0x03A7, 0xA5D7, 0x03A8, + 0xA5D8, 0x03A9, 0xA5E1, 0x03B1, 0xA5E2, 0x03B2, 0xA5E3, 0x03B3, 0xA5E4, 0x03B4, 0xA5E5, 0x03B5, 0xA5E6, 0x03B6, 0xA5E7, 0x03B7, + 0xA5E8, 0x03B8, 0xA5E9, 0x03B9, 0xA5EA, 0x03BA, 0xA5EB, 0x03BB, 0xA5EC, 0x03BC, 0xA5ED, 0x03BD, 0xA5EE, 0x03BE, 0xA5EF, 0x03BF, + 0xA5F0, 0x03C0, 0xA5F1, 0x03C1, 0xA5F2, 0x03C3, 0xA5F3, 0x03C4, 0xA5F4, 0x03C5, 0xA5F5, 0x03C6, 0xA5F6, 0x03C7, 0xA5F7, 0x03C8, + 0xA5F8, 0x03C9, 0xA641, 0xCAA8, 0xA642, 0xCAA9, 0xA643, 0xCAAA, 0xA644, 0xCAAB, 0xA645, 0xCAAC, 0xA646, 0xCAAD, 0xA647, 0xCAAE, + 0xA648, 0xCAAF, 0xA649, 0xCAB0, 0xA64A, 0xCAB1, 0xA64B, 0xCAB2, 0xA64C, 0xCAB3, 0xA64D, 0xCAB4, 0xA64E, 0xCAB5, 0xA64F, 0xCAB6, + 0xA650, 0xCAB7, 0xA651, 0xCAB8, 0xA652, 0xCAB9, 0xA653, 0xCABA, 0xA654, 0xCABB, 0xA655, 0xCABE, 0xA656, 0xCABF, 0xA657, 0xCAC1, + 0xA658, 0xCAC2, 0xA659, 0xCAC3, 0xA65A, 0xCAC5, 0xA661, 0xCAC6, 0xA662, 0xCAC7, 0xA663, 0xCAC8, 0xA664, 0xCAC9, 0xA665, 0xCACA, + 0xA666, 0xCACB, 0xA667, 0xCACE, 0xA668, 0xCAD0, 0xA669, 0xCAD2, 0xA66A, 0xCAD4, 0xA66B, 0xCAD5, 0xA66C, 0xCAD6, 0xA66D, 0xCAD7, + 0xA66E, 0xCADA, 0xA66F, 0xCADB, 0xA670, 0xCADC, 0xA671, 0xCADD, 0xA672, 0xCADE, 0xA673, 0xCADF, 0xA674, 0xCAE1, 0xA675, 0xCAE2, + 0xA676, 0xCAE3, 0xA677, 0xCAE4, 0xA678, 0xCAE5, 0xA679, 0xCAE6, 0xA67A, 0xCAE7, 0xA681, 0xCAE8, 0xA682, 0xCAE9, 0xA683, 0xCAEA, + 0xA684, 0xCAEB, 0xA685, 0xCAED, 0xA686, 0xCAEE, 0xA687, 0xCAEF, 0xA688, 0xCAF0, 0xA689, 0xCAF1, 0xA68A, 0xCAF2, 0xA68B, 0xCAF3, + 0xA68C, 0xCAF5, 0xA68D, 0xCAF6, 0xA68E, 0xCAF7, 0xA68F, 0xCAF8, 0xA690, 0xCAF9, 0xA691, 0xCAFA, 0xA692, 0xCAFB, 0xA693, 0xCAFC, + 0xA694, 0xCAFD, 0xA695, 0xCAFE, 0xA696, 0xCAFF, 0xA697, 0xCB00, 0xA698, 0xCB01, 0xA699, 0xCB02, 0xA69A, 0xCB03, 0xA69B, 0xCB04, + 0xA69C, 0xCB05, 0xA69D, 0xCB06, 0xA69E, 0xCB07, 0xA69F, 0xCB09, 0xA6A0, 0xCB0A, 0xA6A1, 0x2500, 0xA6A2, 0x2502, 0xA6A3, 0x250C, + 0xA6A4, 0x2510, 0xA6A5, 0x2518, 0xA6A6, 0x2514, 0xA6A7, 0x251C, 0xA6A8, 0x252C, 0xA6A9, 0x2524, 0xA6AA, 0x2534, 0xA6AB, 0x253C, + 0xA6AC, 0x2501, 0xA6AD, 0x2503, 0xA6AE, 0x250F, 0xA6AF, 0x2513, 0xA6B0, 0x251B, 0xA6B1, 0x2517, 0xA6B2, 0x2523, 0xA6B3, 0x2533, + 0xA6B4, 0x252B, 0xA6B5, 0x253B, 0xA6B6, 0x254B, 0xA6B7, 0x2520, 0xA6B8, 0x252F, 0xA6B9, 0x2528, 0xA6BA, 0x2537, 0xA6BB, 0x253F, + 0xA6BC, 0x251D, 0xA6BD, 0x2530, 0xA6BE, 0x2525, 0xA6BF, 0x2538, 0xA6C0, 0x2542, 0xA6C1, 0x2512, 0xA6C2, 0x2511, 0xA6C3, 0x251A, + 0xA6C4, 0x2519, 0xA6C5, 0x2516, 0xA6C6, 0x2515, 0xA6C7, 0x250E, 0xA6C8, 0x250D, 0xA6C9, 0x251E, 0xA6CA, 0x251F, 0xA6CB, 0x2521, + 0xA6CC, 0x2522, 0xA6CD, 0x2526, 0xA6CE, 0x2527, 0xA6CF, 0x2529, 0xA6D0, 0x252A, 0xA6D1, 0x252D, 0xA6D2, 0x252E, 0xA6D3, 0x2531, + 0xA6D4, 0x2532, 0xA6D5, 0x2535, 0xA6D6, 0x2536, 0xA6D7, 0x2539, 0xA6D8, 0x253A, 0xA6D9, 0x253D, 0xA6DA, 0x253E, 0xA6DB, 0x2540, + 0xA6DC, 0x2541, 0xA6DD, 0x2543, 0xA6DE, 0x2544, 0xA6DF, 0x2545, 0xA6E0, 0x2546, 0xA6E1, 0x2547, 0xA6E2, 0x2548, 0xA6E3, 0x2549, + 0xA6E4, 0x254A, 0xA741, 0xCB0B, 0xA742, 0xCB0C, 0xA743, 0xCB0D, 0xA744, 0xCB0E, 0xA745, 0xCB0F, 0xA746, 0xCB11, 0xA747, 0xCB12, + 0xA748, 0xCB13, 0xA749, 0xCB15, 0xA74A, 0xCB16, 0xA74B, 0xCB17, 0xA74C, 0xCB19, 0xA74D, 0xCB1A, 0xA74E, 0xCB1B, 0xA74F, 0xCB1C, + 0xA750, 0xCB1D, 0xA751, 0xCB1E, 0xA752, 0xCB1F, 0xA753, 0xCB22, 0xA754, 0xCB23, 0xA755, 0xCB24, 0xA756, 0xCB25, 0xA757, 0xCB26, + 0xA758, 0xCB27, 0xA759, 0xCB28, 0xA75A, 0xCB29, 0xA761, 0xCB2A, 0xA762, 0xCB2B, 0xA763, 0xCB2C, 0xA764, 0xCB2D, 0xA765, 0xCB2E, + 0xA766, 0xCB2F, 0xA767, 0xCB30, 0xA768, 0xCB31, 0xA769, 0xCB32, 0xA76A, 0xCB33, 0xA76B, 0xCB34, 0xA76C, 0xCB35, 0xA76D, 0xCB36, + 0xA76E, 0xCB37, 0xA76F, 0xCB38, 0xA770, 0xCB39, 0xA771, 0xCB3A, 0xA772, 0xCB3B, 0xA773, 0xCB3C, 0xA774, 0xCB3D, 0xA775, 0xCB3E, + 0xA776, 0xCB3F, 0xA777, 0xCB40, 0xA778, 0xCB42, 0xA779, 0xCB43, 0xA77A, 0xCB44, 0xA781, 0xCB45, 0xA782, 0xCB46, 0xA783, 0xCB47, + 0xA784, 0xCB4A, 0xA785, 0xCB4B, 0xA786, 0xCB4D, 0xA787, 0xCB4E, 0xA788, 0xCB4F, 0xA789, 0xCB51, 0xA78A, 0xCB52, 0xA78B, 0xCB53, + 0xA78C, 0xCB54, 0xA78D, 0xCB55, 0xA78E, 0xCB56, 0xA78F, 0xCB57, 0xA790, 0xCB5A, 0xA791, 0xCB5B, 0xA792, 0xCB5C, 0xA793, 0xCB5E, + 0xA794, 0xCB5F, 0xA795, 0xCB60, 0xA796, 0xCB61, 0xA797, 0xCB62, 0xA798, 0xCB63, 0xA799, 0xCB65, 0xA79A, 0xCB66, 0xA79B, 0xCB67, + 0xA79C, 0xCB68, 0xA79D, 0xCB69, 0xA79E, 0xCB6A, 0xA79F, 0xCB6B, 0xA7A0, 0xCB6C, 0xA7A1, 0x3395, 0xA7A2, 0x3396, 0xA7A3, 0x3397, + 0xA7A4, 0x2113, 0xA7A5, 0x3398, 0xA7A6, 0x33C4, 0xA7A7, 0x33A3, 0xA7A8, 0x33A4, 0xA7A9, 0x33A5, 0xA7AA, 0x33A6, 0xA7AB, 0x3399, + 0xA7AC, 0x339A, 0xA7AD, 0x339B, 0xA7AE, 0x339C, 0xA7AF, 0x339D, 0xA7B0, 0x339E, 0xA7B1, 0x339F, 0xA7B2, 0x33A0, 0xA7B3, 0x33A1, + 0xA7B4, 0x33A2, 0xA7B5, 0x33CA, 0xA7B6, 0x338D, 0xA7B7, 0x338E, 0xA7B8, 0x338F, 0xA7B9, 0x33CF, 0xA7BA, 0x3388, 0xA7BB, 0x3389, + 0xA7BC, 0x33C8, 0xA7BD, 0x33A7, 0xA7BE, 0x33A8, 0xA7BF, 0x33B0, 0xA7C0, 0x33B1, 0xA7C1, 0x33B2, 0xA7C2, 0x33B3, 0xA7C3, 0x33B4, + 0xA7C4, 0x33B5, 0xA7C5, 0x33B6, 0xA7C6, 0x33B7, 0xA7C7, 0x33B8, 0xA7C8, 0x33B9, 0xA7C9, 0x3380, 0xA7CA, 0x3381, 0xA7CB, 0x3382, + 0xA7CC, 0x3383, 0xA7CD, 0x3384, 0xA7CE, 0x33BA, 0xA7CF, 0x33BB, 0xA7D0, 0x33BC, 0xA7D1, 0x33BD, 0xA7D2, 0x33BE, 0xA7D3, 0x33BF, + 0xA7D4, 0x3390, 0xA7D5, 0x3391, 0xA7D6, 0x3392, 0xA7D7, 0x3393, 0xA7D8, 0x3394, 0xA7D9, 0x2126, 0xA7DA, 0x33C0, 0xA7DB, 0x33C1, + 0xA7DC, 0x338A, 0xA7DD, 0x338B, 0xA7DE, 0x338C, 0xA7DF, 0x33D6, 0xA7E0, 0x33C5, 0xA7E1, 0x33AD, 0xA7E2, 0x33AE, 0xA7E3, 0x33AF, + 0xA7E4, 0x33DB, 0xA7E5, 0x33A9, 0xA7E6, 0x33AA, 0xA7E7, 0x33AB, 0xA7E8, 0x33AC, 0xA7E9, 0x33DD, 0xA7EA, 0x33D0, 0xA7EB, 0x33D3, + 0xA7EC, 0x33C3, 0xA7ED, 0x33C9, 0xA7EE, 0x33DC, 0xA7EF, 0x33C6, 0xA841, 0xCB6D, 0xA842, 0xCB6E, 0xA843, 0xCB6F, 0xA844, 0xCB70, + 0xA845, 0xCB71, 0xA846, 0xCB72, 0xA847, 0xCB73, 0xA848, 0xCB74, 0xA849, 0xCB75, 0xA84A, 0xCB76, 0xA84B, 0xCB77, 0xA84C, 0xCB7A, + 0xA84D, 0xCB7B, 0xA84E, 0xCB7C, 0xA84F, 0xCB7D, 0xA850, 0xCB7E, 0xA851, 0xCB7F, 0xA852, 0xCB80, 0xA853, 0xCB81, 0xA854, 0xCB82, + 0xA855, 0xCB83, 0xA856, 0xCB84, 0xA857, 0xCB85, 0xA858, 0xCB86, 0xA859, 0xCB87, 0xA85A, 0xCB88, 0xA861, 0xCB89, 0xA862, 0xCB8A, + 0xA863, 0xCB8B, 0xA864, 0xCB8C, 0xA865, 0xCB8D, 0xA866, 0xCB8E, 0xA867, 0xCB8F, 0xA868, 0xCB90, 0xA869, 0xCB91, 0xA86A, 0xCB92, + 0xA86B, 0xCB93, 0xA86C, 0xCB94, 0xA86D, 0xCB95, 0xA86E, 0xCB96, 0xA86F, 0xCB97, 0xA870, 0xCB98, 0xA871, 0xCB99, 0xA872, 0xCB9A, + 0xA873, 0xCB9B, 0xA874, 0xCB9D, 0xA875, 0xCB9E, 0xA876, 0xCB9F, 0xA877, 0xCBA0, 0xA878, 0xCBA1, 0xA879, 0xCBA2, 0xA87A, 0xCBA3, + 0xA881, 0xCBA4, 0xA882, 0xCBA5, 0xA883, 0xCBA6, 0xA884, 0xCBA7, 0xA885, 0xCBA8, 0xA886, 0xCBA9, 0xA887, 0xCBAA, 0xA888, 0xCBAB, + 0xA889, 0xCBAC, 0xA88A, 0xCBAD, 0xA88B, 0xCBAE, 0xA88C, 0xCBAF, 0xA88D, 0xCBB0, 0xA88E, 0xCBB1, 0xA88F, 0xCBB2, 0xA890, 0xCBB3, + 0xA891, 0xCBB4, 0xA892, 0xCBB5, 0xA893, 0xCBB6, 0xA894, 0xCBB7, 0xA895, 0xCBB9, 0xA896, 0xCBBA, 0xA897, 0xCBBB, 0xA898, 0xCBBC, + 0xA899, 0xCBBD, 0xA89A, 0xCBBE, 0xA89B, 0xCBBF, 0xA89C, 0xCBC0, 0xA89D, 0xCBC1, 0xA89E, 0xCBC2, 0xA89F, 0xCBC3, 0xA8A0, 0xCBC4, + 0xA8A1, 0x00C6, 0xA8A2, 0x00D0, 0xA8A3, 0x00AA, 0xA8A4, 0x0126, 0xA8A6, 0x0132, 0xA8A8, 0x013F, 0xA8A9, 0x0141, 0xA8AA, 0x00D8, + 0xA8AB, 0x0152, 0xA8AC, 0x00BA, 0xA8AD, 0x00DE, 0xA8AE, 0x0166, 0xA8AF, 0x014A, 0xA8B1, 0x3260, 0xA8B2, 0x3261, 0xA8B3, 0x3262, + 0xA8B4, 0x3263, 0xA8B5, 0x3264, 0xA8B6, 0x3265, 0xA8B7, 0x3266, 0xA8B8, 0x3267, 0xA8B9, 0x3268, 0xA8BA, 0x3269, 0xA8BB, 0x326A, + 0xA8BC, 0x326B, 0xA8BD, 0x326C, 0xA8BE, 0x326D, 0xA8BF, 0x326E, 0xA8C0, 0x326F, 0xA8C1, 0x3270, 0xA8C2, 0x3271, 0xA8C3, 0x3272, + 0xA8C4, 0x3273, 0xA8C5, 0x3274, 0xA8C6, 0x3275, 0xA8C7, 0x3276, 0xA8C8, 0x3277, 0xA8C9, 0x3278, 0xA8CA, 0x3279, 0xA8CB, 0x327A, + 0xA8CC, 0x327B, 0xA8CD, 0x24D0, 0xA8CE, 0x24D1, 0xA8CF, 0x24D2, 0xA8D0, 0x24D3, 0xA8D1, 0x24D4, 0xA8D2, 0x24D5, 0xA8D3, 0x24D6, + 0xA8D4, 0x24D7, 0xA8D5, 0x24D8, 0xA8D6, 0x24D9, 0xA8D7, 0x24DA, 0xA8D8, 0x24DB, 0xA8D9, 0x24DC, 0xA8DA, 0x24DD, 0xA8DB, 0x24DE, + 0xA8DC, 0x24DF, 0xA8DD, 0x24E0, 0xA8DE, 0x24E1, 0xA8DF, 0x24E2, 0xA8E0, 0x24E3, 0xA8E1, 0x24E4, 0xA8E2, 0x24E5, 0xA8E3, 0x24E6, + 0xA8E4, 0x24E7, 0xA8E5, 0x24E8, 0xA8E6, 0x24E9, 0xA8E7, 0x2460, 0xA8E8, 0x2461, 0xA8E9, 0x2462, 0xA8EA, 0x2463, 0xA8EB, 0x2464, + 0xA8EC, 0x2465, 0xA8ED, 0x2466, 0xA8EE, 0x2467, 0xA8EF, 0x2468, 0xA8F0, 0x2469, 0xA8F1, 0x246A, 0xA8F2, 0x246B, 0xA8F3, 0x246C, + 0xA8F4, 0x246D, 0xA8F5, 0x246E, 0xA8F6, 0x00BD, 0xA8F7, 0x2153, 0xA8F8, 0x2154, 0xA8F9, 0x00BC, 0xA8FA, 0x00BE, 0xA8FB, 0x215B, + 0xA8FC, 0x215C, 0xA8FD, 0x215D, 0xA8FE, 0x215E, 0xA941, 0xCBC5, 0xA942, 0xCBC6, 0xA943, 0xCBC7, 0xA944, 0xCBC8, 0xA945, 0xCBC9, + 0xA946, 0xCBCA, 0xA947, 0xCBCB, 0xA948, 0xCBCC, 0xA949, 0xCBCD, 0xA94A, 0xCBCE, 0xA94B, 0xCBCF, 0xA94C, 0xCBD0, 0xA94D, 0xCBD1, + 0xA94E, 0xCBD2, 0xA94F, 0xCBD3, 0xA950, 0xCBD5, 0xA951, 0xCBD6, 0xA952, 0xCBD7, 0xA953, 0xCBD8, 0xA954, 0xCBD9, 0xA955, 0xCBDA, + 0xA956, 0xCBDB, 0xA957, 0xCBDC, 0xA958, 0xCBDD, 0xA959, 0xCBDE, 0xA95A, 0xCBDF, 0xA961, 0xCBE0, 0xA962, 0xCBE1, 0xA963, 0xCBE2, + 0xA964, 0xCBE3, 0xA965, 0xCBE5, 0xA966, 0xCBE6, 0xA967, 0xCBE8, 0xA968, 0xCBEA, 0xA969, 0xCBEB, 0xA96A, 0xCBEC, 0xA96B, 0xCBED, + 0xA96C, 0xCBEE, 0xA96D, 0xCBEF, 0xA96E, 0xCBF0, 0xA96F, 0xCBF1, 0xA970, 0xCBF2, 0xA971, 0xCBF3, 0xA972, 0xCBF4, 0xA973, 0xCBF5, + 0xA974, 0xCBF6, 0xA975, 0xCBF7, 0xA976, 0xCBF8, 0xA977, 0xCBF9, 0xA978, 0xCBFA, 0xA979, 0xCBFB, 0xA97A, 0xCBFC, 0xA981, 0xCBFD, + 0xA982, 0xCBFE, 0xA983, 0xCBFF, 0xA984, 0xCC00, 0xA985, 0xCC01, 0xA986, 0xCC02, 0xA987, 0xCC03, 0xA988, 0xCC04, 0xA989, 0xCC05, + 0xA98A, 0xCC06, 0xA98B, 0xCC07, 0xA98C, 0xCC08, 0xA98D, 0xCC09, 0xA98E, 0xCC0A, 0xA98F, 0xCC0B, 0xA990, 0xCC0E, 0xA991, 0xCC0F, + 0xA992, 0xCC11, 0xA993, 0xCC12, 0xA994, 0xCC13, 0xA995, 0xCC15, 0xA996, 0xCC16, 0xA997, 0xCC17, 0xA998, 0xCC18, 0xA999, 0xCC19, + 0xA99A, 0xCC1A, 0xA99B, 0xCC1B, 0xA99C, 0xCC1E, 0xA99D, 0xCC1F, 0xA99E, 0xCC20, 0xA99F, 0xCC23, 0xA9A0, 0xCC24, 0xA9A1, 0x00E6, + 0xA9A2, 0x0111, 0xA9A3, 0x00F0, 0xA9A4, 0x0127, 0xA9A5, 0x0131, 0xA9A6, 0x0133, 0xA9A7, 0x0138, 0xA9A8, 0x0140, 0xA9A9, 0x0142, + 0xA9AA, 0x00F8, 0xA9AB, 0x0153, 0xA9AC, 0x00DF, 0xA9AD, 0x00FE, 0xA9AE, 0x0167, 0xA9AF, 0x014B, 0xA9B0, 0x0149, 0xA9B1, 0x3200, + 0xA9B2, 0x3201, 0xA9B3, 0x3202, 0xA9B4, 0x3203, 0xA9B5, 0x3204, 0xA9B6, 0x3205, 0xA9B7, 0x3206, 0xA9B8, 0x3207, 0xA9B9, 0x3208, + 0xA9BA, 0x3209, 0xA9BB, 0x320A, 0xA9BC, 0x320B, 0xA9BD, 0x320C, 0xA9BE, 0x320D, 0xA9BF, 0x320E, 0xA9C0, 0x320F, 0xA9C1, 0x3210, + 0xA9C2, 0x3211, 0xA9C3, 0x3212, 0xA9C4, 0x3213, 0xA9C5, 0x3214, 0xA9C6, 0x3215, 0xA9C7, 0x3216, 0xA9C8, 0x3217, 0xA9C9, 0x3218, + 0xA9CA, 0x3219, 0xA9CB, 0x321A, 0xA9CC, 0x321B, 0xA9CD, 0x249C, 0xA9CE, 0x249D, 0xA9CF, 0x249E, 0xA9D0, 0x249F, 0xA9D1, 0x24A0, + 0xA9D2, 0x24A1, 0xA9D3, 0x24A2, 0xA9D4, 0x24A3, 0xA9D5, 0x24A4, 0xA9D6, 0x24A5, 0xA9D7, 0x24A6, 0xA9D8, 0x24A7, 0xA9D9, 0x24A8, + 0xA9DA, 0x24A9, 0xA9DB, 0x24AA, 0xA9DC, 0x24AB, 0xA9DD, 0x24AC, 0xA9DE, 0x24AD, 0xA9DF, 0x24AE, 0xA9E0, 0x24AF, 0xA9E1, 0x24B0, + 0xA9E2, 0x24B1, 0xA9E3, 0x24B2, 0xA9E4, 0x24B3, 0xA9E5, 0x24B4, 0xA9E6, 0x24B5, 0xA9E7, 0x2474, 0xA9E8, 0x2475, 0xA9E9, 0x2476, + 0xA9EA, 0x2477, 0xA9EB, 0x2478, 0xA9EC, 0x2479, 0xA9ED, 0x247A, 0xA9EE, 0x247B, 0xA9EF, 0x247C, 0xA9F0, 0x247D, 0xA9F1, 0x247E, + 0xA9F2, 0x247F, 0xA9F3, 0x2480, 0xA9F4, 0x2481, 0xA9F5, 0x2482, 0xA9F6, 0x00B9, 0xA9F7, 0x00B2, 0xA9F8, 0x00B3, 0xA9F9, 0x2074, + 0xA9FA, 0x207F, 0xA9FB, 0x2081, 0xA9FC, 0x2082, 0xA9FD, 0x2083, 0xA9FE, 0x2084, 0xAA41, 0xCC25, 0xAA42, 0xCC26, 0xAA43, 0xCC2A, + 0xAA44, 0xCC2B, 0xAA45, 0xCC2D, 0xAA46, 0xCC2F, 0xAA47, 0xCC31, 0xAA48, 0xCC32, 0xAA49, 0xCC33, 0xAA4A, 0xCC34, 0xAA4B, 0xCC35, + 0xAA4C, 0xCC36, 0xAA4D, 0xCC37, 0xAA4E, 0xCC3A, 0xAA4F, 0xCC3F, 0xAA50, 0xCC40, 0xAA51, 0xCC41, 0xAA52, 0xCC42, 0xAA53, 0xCC43, + 0xAA54, 0xCC46, 0xAA55, 0xCC47, 0xAA56, 0xCC49, 0xAA57, 0xCC4A, 0xAA58, 0xCC4B, 0xAA59, 0xCC4D, 0xAA5A, 0xCC4E, 0xAA61, 0xCC4F, + 0xAA62, 0xCC50, 0xAA63, 0xCC51, 0xAA64, 0xCC52, 0xAA65, 0xCC53, 0xAA66, 0xCC56, 0xAA67, 0xCC5A, 0xAA68, 0xCC5B, 0xAA69, 0xCC5C, + 0xAA6A, 0xCC5D, 0xAA6B, 0xCC5E, 0xAA6C, 0xCC5F, 0xAA6D, 0xCC61, 0xAA6E, 0xCC62, 0xAA6F, 0xCC63, 0xAA70, 0xCC65, 0xAA71, 0xCC67, + 0xAA72, 0xCC69, 0xAA73, 0xCC6A, 0xAA74, 0xCC6B, 0xAA75, 0xCC6C, 0xAA76, 0xCC6D, 0xAA77, 0xCC6E, 0xAA78, 0xCC6F, 0xAA79, 0xCC71, + 0xAA7A, 0xCC72, 0xAA81, 0xCC73, 0xAA82, 0xCC74, 0xAA83, 0xCC76, 0xAA84, 0xCC77, 0xAA85, 0xCC78, 0xAA86, 0xCC79, 0xAA87, 0xCC7A, + 0xAA88, 0xCC7B, 0xAA89, 0xCC7C, 0xAA8A, 0xCC7D, 0xAA8B, 0xCC7E, 0xAA8C, 0xCC7F, 0xAA8D, 0xCC80, 0xAA8E, 0xCC81, 0xAA8F, 0xCC82, + 0xAA90, 0xCC83, 0xAA91, 0xCC84, 0xAA92, 0xCC85, 0xAA93, 0xCC86, 0xAA94, 0xCC87, 0xAA95, 0xCC88, 0xAA96, 0xCC89, 0xAA97, 0xCC8A, + 0xAA98, 0xCC8B, 0xAA99, 0xCC8C, 0xAA9A, 0xCC8D, 0xAA9B, 0xCC8E, 0xAA9C, 0xCC8F, 0xAA9D, 0xCC90, 0xAA9E, 0xCC91, 0xAA9F, 0xCC92, + 0xAAA0, 0xCC93, 0xAAA1, 0x3041, 0xAAA2, 0x3042, 0xAAA3, 0x3043, 0xAAA4, 0x3044, 0xAAA5, 0x3045, 0xAAA6, 0x3046, 0xAAA7, 0x3047, + 0xAAA8, 0x3048, 0xAAA9, 0x3049, 0xAAAA, 0x304A, 0xAAAB, 0x304B, 0xAAAC, 0x304C, 0xAAAD, 0x304D, 0xAAAE, 0x304E, 0xAAAF, 0x304F, + 0xAAB0, 0x3050, 0xAAB1, 0x3051, 0xAAB2, 0x3052, 0xAAB3, 0x3053, 0xAAB4, 0x3054, 0xAAB5, 0x3055, 0xAAB6, 0x3056, 0xAAB7, 0x3057, + 0xAAB8, 0x3058, 0xAAB9, 0x3059, 0xAABA, 0x305A, 0xAABB, 0x305B, 0xAABC, 0x305C, 0xAABD, 0x305D, 0xAABE, 0x305E, 0xAABF, 0x305F, + 0xAAC0, 0x3060, 0xAAC1, 0x3061, 0xAAC2, 0x3062, 0xAAC3, 0x3063, 0xAAC4, 0x3064, 0xAAC5, 0x3065, 0xAAC6, 0x3066, 0xAAC7, 0x3067, + 0xAAC8, 0x3068, 0xAAC9, 0x3069, 0xAACA, 0x306A, 0xAACB, 0x306B, 0xAACC, 0x306C, 0xAACD, 0x306D, 0xAACE, 0x306E, 0xAACF, 0x306F, + 0xAAD0, 0x3070, 0xAAD1, 0x3071, 0xAAD2, 0x3072, 0xAAD3, 0x3073, 0xAAD4, 0x3074, 0xAAD5, 0x3075, 0xAAD6, 0x3076, 0xAAD7, 0x3077, + 0xAAD8, 0x3078, 0xAAD9, 0x3079, 0xAADA, 0x307A, 0xAADB, 0x307B, 0xAADC, 0x307C, 0xAADD, 0x307D, 0xAADE, 0x307E, 0xAADF, 0x307F, + 0xAAE0, 0x3080, 0xAAE1, 0x3081, 0xAAE2, 0x3082, 0xAAE3, 0x3083, 0xAAE4, 0x3084, 0xAAE5, 0x3085, 0xAAE6, 0x3086, 0xAAE7, 0x3087, + 0xAAE8, 0x3088, 0xAAE9, 0x3089, 0xAAEA, 0x308A, 0xAAEB, 0x308B, 0xAAEC, 0x308C, 0xAAED, 0x308D, 0xAAEE, 0x308E, 0xAAEF, 0x308F, + 0xAAF0, 0x3090, 0xAAF1, 0x3091, 0xAAF2, 0x3092, 0xAAF3, 0x3093, 0xAB41, 0xCC94, 0xAB42, 0xCC95, 0xAB43, 0xCC96, 0xAB44, 0xCC97, + 0xAB45, 0xCC9A, 0xAB46, 0xCC9B, 0xAB47, 0xCC9D, 0xAB48, 0xCC9E, 0xAB49, 0xCC9F, 0xAB4A, 0xCCA1, 0xAB4B, 0xCCA2, 0xAB4C, 0xCCA3, + 0xAB4D, 0xCCA4, 0xAB4E, 0xCCA5, 0xAB4F, 0xCCA6, 0xAB50, 0xCCA7, 0xAB51, 0xCCAA, 0xAB52, 0xCCAE, 0xAB53, 0xCCAF, 0xAB54, 0xCCB0, + 0xAB55, 0xCCB1, 0xAB56, 0xCCB2, 0xAB57, 0xCCB3, 0xAB58, 0xCCB6, 0xAB59, 0xCCB7, 0xAB5A, 0xCCB9, 0xAB61, 0xCCBA, 0xAB62, 0xCCBB, + 0xAB63, 0xCCBD, 0xAB64, 0xCCBE, 0xAB65, 0xCCBF, 0xAB66, 0xCCC0, 0xAB67, 0xCCC1, 0xAB68, 0xCCC2, 0xAB69, 0xCCC3, 0xAB6A, 0xCCC6, + 0xAB6B, 0xCCC8, 0xAB6C, 0xCCCA, 0xAB6D, 0xCCCB, 0xAB6E, 0xCCCC, 0xAB6F, 0xCCCD, 0xAB70, 0xCCCE, 0xAB71, 0xCCCF, 0xAB72, 0xCCD1, + 0xAB73, 0xCCD2, 0xAB74, 0xCCD3, 0xAB75, 0xCCD5, 0xAB76, 0xCCD6, 0xAB77, 0xCCD7, 0xAB78, 0xCCD8, 0xAB79, 0xCCD9, 0xAB7A, 0xCCDA, + 0xAB81, 0xCCDB, 0xAB82, 0xCCDC, 0xAB83, 0xCCDD, 0xAB84, 0xCCDE, 0xAB85, 0xCCDF, 0xAB86, 0xCCE0, 0xAB87, 0xCCE1, 0xAB88, 0xCCE2, + 0xAB89, 0xCCE3, 0xAB8A, 0xCCE5, 0xAB8B, 0xCCE6, 0xAB8C, 0xCCE7, 0xAB8D, 0xCCE8, 0xAB8E, 0xCCE9, 0xAB8F, 0xCCEA, 0xAB90, 0xCCEB, + 0xAB91, 0xCCED, 0xAB92, 0xCCEE, 0xAB93, 0xCCEF, 0xAB94, 0xCCF1, 0xAB95, 0xCCF2, 0xAB96, 0xCCF3, 0xAB97, 0xCCF4, 0xAB98, 0xCCF5, + 0xAB99, 0xCCF6, 0xAB9A, 0xCCF7, 0xAB9B, 0xCCF8, 0xAB9C, 0xCCF9, 0xAB9D, 0xCCFA, 0xAB9E, 0xCCFB, 0xAB9F, 0xCCFC, 0xABA0, 0xCCFD, + 0xABA1, 0x30A1, 0xABA2, 0x30A2, 0xABA3, 0x30A3, 0xABA4, 0x30A4, 0xABA5, 0x30A5, 0xABA6, 0x30A6, 0xABA7, 0x30A7, 0xABA8, 0x30A8, + 0xABA9, 0x30A9, 0xABAA, 0x30AA, 0xABAB, 0x30AB, 0xABAC, 0x30AC, 0xABAD, 0x30AD, 0xABAE, 0x30AE, 0xABAF, 0x30AF, 0xABB0, 0x30B0, + 0xABB1, 0x30B1, 0xABB2, 0x30B2, 0xABB3, 0x30B3, 0xABB4, 0x30B4, 0xABB5, 0x30B5, 0xABB6, 0x30B6, 0xABB7, 0x30B7, 0xABB8, 0x30B8, + 0xABB9, 0x30B9, 0xABBA, 0x30BA, 0xABBB, 0x30BB, 0xABBC, 0x30BC, 0xABBD, 0x30BD, 0xABBE, 0x30BE, 0xABBF, 0x30BF, 0xABC0, 0x30C0, + 0xABC1, 0x30C1, 0xABC2, 0x30C2, 0xABC3, 0x30C3, 0xABC4, 0x30C4, 0xABC5, 0x30C5, 0xABC6, 0x30C6, 0xABC7, 0x30C7, 0xABC8, 0x30C8, + 0xABC9, 0x30C9, 0xABCA, 0x30CA, 0xABCB, 0x30CB, 0xABCC, 0x30CC, 0xABCD, 0x30CD, 0xABCE, 0x30CE, 0xABCF, 0x30CF, 0xABD0, 0x30D0, + 0xABD1, 0x30D1, 0xABD2, 0x30D2, 0xABD3, 0x30D3, 0xABD4, 0x30D4, 0xABD5, 0x30D5, 0xABD6, 0x30D6, 0xABD7, 0x30D7, 0xABD8, 0x30D8, + 0xABD9, 0x30D9, 0xABDA, 0x30DA, 0xABDB, 0x30DB, 0xABDC, 0x30DC, 0xABDD, 0x30DD, 0xABDE, 0x30DE, 0xABDF, 0x30DF, 0xABE0, 0x30E0, + 0xABE1, 0x30E1, 0xABE2, 0x30E2, 0xABE3, 0x30E3, 0xABE4, 0x30E4, 0xABE5, 0x30E5, 0xABE6, 0x30E6, 0xABE7, 0x30E7, 0xABE8, 0x30E8, + 0xABE9, 0x30E9, 0xABEA, 0x30EA, 0xABEB, 0x30EB, 0xABEC, 0x30EC, 0xABED, 0x30ED, 0xABEE, 0x30EE, 0xABEF, 0x30EF, 0xABF0, 0x30F0, + 0xABF1, 0x30F1, 0xABF2, 0x30F2, 0xABF3, 0x30F3, 0xABF4, 0x30F4, 0xABF5, 0x30F5, 0xABF6, 0x30F6, 0xAC41, 0xCCFE, 0xAC42, 0xCCFF, + 0xAC43, 0xCD00, 0xAC44, 0xCD02, 0xAC45, 0xCD03, 0xAC46, 0xCD04, 0xAC47, 0xCD05, 0xAC48, 0xCD06, 0xAC49, 0xCD07, 0xAC4A, 0xCD0A, + 0xAC4B, 0xCD0B, 0xAC4C, 0xCD0D, 0xAC4D, 0xCD0E, 0xAC4E, 0xCD0F, 0xAC4F, 0xCD11, 0xAC50, 0xCD12, 0xAC51, 0xCD13, 0xAC52, 0xCD14, + 0xAC53, 0xCD15, 0xAC54, 0xCD16, 0xAC55, 0xCD17, 0xAC56, 0xCD1A, 0xAC57, 0xCD1C, 0xAC58, 0xCD1E, 0xAC59, 0xCD1F, 0xAC5A, 0xCD20, + 0xAC61, 0xCD21, 0xAC62, 0xCD22, 0xAC63, 0xCD23, 0xAC64, 0xCD25, 0xAC65, 0xCD26, 0xAC66, 0xCD27, 0xAC67, 0xCD29, 0xAC68, 0xCD2A, + 0xAC69, 0xCD2B, 0xAC6A, 0xCD2D, 0xAC6B, 0xCD2E, 0xAC6C, 0xCD2F, 0xAC6D, 0xCD30, 0xAC6E, 0xCD31, 0xAC6F, 0xCD32, 0xAC70, 0xCD33, + 0xAC71, 0xCD34, 0xAC72, 0xCD35, 0xAC73, 0xCD36, 0xAC74, 0xCD37, 0xAC75, 0xCD38, 0xAC76, 0xCD3A, 0xAC77, 0xCD3B, 0xAC78, 0xCD3C, + 0xAC79, 0xCD3D, 0xAC7A, 0xCD3E, 0xAC81, 0xCD3F, 0xAC82, 0xCD40, 0xAC83, 0xCD41, 0xAC84, 0xCD42, 0xAC85, 0xCD43, 0xAC86, 0xCD44, + 0xAC87, 0xCD45, 0xAC88, 0xCD46, 0xAC89, 0xCD47, 0xAC8A, 0xCD48, 0xAC8B, 0xCD49, 0xAC8C, 0xCD4A, 0xAC8D, 0xCD4B, 0xAC8E, 0xCD4C, + 0xAC8F, 0xCD4D, 0xAC90, 0xCD4E, 0xAC91, 0xCD4F, 0xAC92, 0xCD50, 0xAC93, 0xCD51, 0xAC94, 0xCD52, 0xAC95, 0xCD53, 0xAC96, 0xCD54, + 0xAC97, 0xCD55, 0xAC98, 0xCD56, 0xAC99, 0xCD57, 0xAC9A, 0xCD58, 0xAC9B, 0xCD59, 0xAC9C, 0xCD5A, 0xAC9D, 0xCD5B, 0xAC9E, 0xCD5D, + 0xAC9F, 0xCD5E, 0xACA0, 0xCD5F, 0xACA1, 0x0410, 0xACA2, 0x0411, 0xACA3, 0x0412, 0xACA4, 0x0413, 0xACA5, 0x0414, 0xACA6, 0x0415, + 0xACA7, 0x0401, 0xACA8, 0x0416, 0xACA9, 0x0417, 0xACAA, 0x0418, 0xACAB, 0x0419, 0xACAC, 0x041A, 0xACAD, 0x041B, 0xACAE, 0x041C, + 0xACAF, 0x041D, 0xACB0, 0x041E, 0xACB1, 0x041F, 0xACB2, 0x0420, 0xACB3, 0x0421, 0xACB4, 0x0422, 0xACB5, 0x0423, 0xACB6, 0x0424, + 0xACB7, 0x0425, 0xACB8, 0x0426, 0xACB9, 0x0427, 0xACBA, 0x0428, 0xACBB, 0x0429, 0xACBC, 0x042A, 0xACBD, 0x042B, 0xACBE, 0x042C, + 0xACBF, 0x042D, 0xACC0, 0x042E, 0xACC1, 0x042F, 0xACD1, 0x0430, 0xACD2, 0x0431, 0xACD3, 0x0432, 0xACD4, 0x0433, 0xACD5, 0x0434, + 0xACD6, 0x0435, 0xACD7, 0x0451, 0xACD8, 0x0436, 0xACD9, 0x0437, 0xACDA, 0x0438, 0xACDB, 0x0439, 0xACDC, 0x043A, 0xACDD, 0x043B, + 0xACDE, 0x043C, 0xACDF, 0x043D, 0xACE0, 0x043E, 0xACE1, 0x043F, 0xACE2, 0x0440, 0xACE3, 0x0441, 0xACE4, 0x0442, 0xACE5, 0x0443, + 0xACE6, 0x0444, 0xACE7, 0x0445, 0xACE8, 0x0446, 0xACE9, 0x0447, 0xACEA, 0x0448, 0xACEB, 0x0449, 0xACEC, 0x044A, 0xACED, 0x044B, + 0xACEE, 0x044C, 0xACEF, 0x044D, 0xACF0, 0x044E, 0xACF1, 0x044F, 0xAD41, 0xCD61, 0xAD42, 0xCD62, 0xAD43, 0xCD63, 0xAD44, 0xCD65, + 0xAD45, 0xCD66, 0xAD46, 0xCD67, 0xAD47, 0xCD68, 0xAD48, 0xCD69, 0xAD49, 0xCD6A, 0xAD4A, 0xCD6B, 0xAD4B, 0xCD6E, 0xAD4C, 0xCD70, + 0xAD4D, 0xCD72, 0xAD4E, 0xCD73, 0xAD4F, 0xCD74, 0xAD50, 0xCD75, 0xAD51, 0xCD76, 0xAD52, 0xCD77, 0xAD53, 0xCD79, 0xAD54, 0xCD7A, + 0xAD55, 0xCD7B, 0xAD56, 0xCD7C, 0xAD57, 0xCD7D, 0xAD58, 0xCD7E, 0xAD59, 0xCD7F, 0xAD5A, 0xCD80, 0xAD61, 0xCD81, 0xAD62, 0xCD82, + 0xAD63, 0xCD83, 0xAD64, 0xCD84, 0xAD65, 0xCD85, 0xAD66, 0xCD86, 0xAD67, 0xCD87, 0xAD68, 0xCD89, 0xAD69, 0xCD8A, 0xAD6A, 0xCD8B, + 0xAD6B, 0xCD8C, 0xAD6C, 0xCD8D, 0xAD6D, 0xCD8E, 0xAD6E, 0xCD8F, 0xAD6F, 0xCD90, 0xAD70, 0xCD91, 0xAD71, 0xCD92, 0xAD72, 0xCD93, + 0xAD73, 0xCD96, 0xAD74, 0xCD97, 0xAD75, 0xCD99, 0xAD76, 0xCD9A, 0xAD77, 0xCD9B, 0xAD78, 0xCD9D, 0xAD79, 0xCD9E, 0xAD7A, 0xCD9F, + 0xAD81, 0xCDA0, 0xAD82, 0xCDA1, 0xAD83, 0xCDA2, 0xAD84, 0xCDA3, 0xAD85, 0xCDA6, 0xAD86, 0xCDA8, 0xAD87, 0xCDAA, 0xAD88, 0xCDAB, + 0xAD89, 0xCDAC, 0xAD8A, 0xCDAD, 0xAD8B, 0xCDAE, 0xAD8C, 0xCDAF, 0xAD8D, 0xCDB1, 0xAD8E, 0xCDB2, 0xAD8F, 0xCDB3, 0xAD90, 0xCDB4, + 0xAD91, 0xCDB5, 0xAD92, 0xCDB6, 0xAD93, 0xCDB7, 0xAD94, 0xCDB8, 0xAD95, 0xCDB9, 0xAD96, 0xCDBA, 0xAD97, 0xCDBB, 0xAD98, 0xCDBC, + 0xAD99, 0xCDBD, 0xAD9A, 0xCDBE, 0xAD9B, 0xCDBF, 0xAD9C, 0xCDC0, 0xAD9D, 0xCDC1, 0xAD9E, 0xCDC2, 0xAD9F, 0xCDC3, 0xADA0, 0xCDC5, + 0xAE41, 0xCDC6, 0xAE42, 0xCDC7, 0xAE43, 0xCDC8, 0xAE44, 0xCDC9, 0xAE45, 0xCDCA, 0xAE46, 0xCDCB, 0xAE47, 0xCDCD, 0xAE48, 0xCDCE, + 0xAE49, 0xCDCF, 0xAE4A, 0xCDD1, 0xAE4B, 0xCDD2, 0xAE4C, 0xCDD3, 0xAE4D, 0xCDD4, 0xAE4E, 0xCDD5, 0xAE4F, 0xCDD6, 0xAE50, 0xCDD7, + 0xAE51, 0xCDD8, 0xAE52, 0xCDD9, 0xAE53, 0xCDDA, 0xAE54, 0xCDDB, 0xAE55, 0xCDDC, 0xAE56, 0xCDDD, 0xAE57, 0xCDDE, 0xAE58, 0xCDDF, + 0xAE59, 0xCDE0, 0xAE5A, 0xCDE1, 0xAE61, 0xCDE2, 0xAE62, 0xCDE3, 0xAE63, 0xCDE4, 0xAE64, 0xCDE5, 0xAE65, 0xCDE6, 0xAE66, 0xCDE7, + 0xAE67, 0xCDE9, 0xAE68, 0xCDEA, 0xAE69, 0xCDEB, 0xAE6A, 0xCDED, 0xAE6B, 0xCDEE, 0xAE6C, 0xCDEF, 0xAE6D, 0xCDF1, 0xAE6E, 0xCDF2, + 0xAE6F, 0xCDF3, 0xAE70, 0xCDF4, 0xAE71, 0xCDF5, 0xAE72, 0xCDF6, 0xAE73, 0xCDF7, 0xAE74, 0xCDFA, 0xAE75, 0xCDFC, 0xAE76, 0xCDFE, + 0xAE77, 0xCDFF, 0xAE78, 0xCE00, 0xAE79, 0xCE01, 0xAE7A, 0xCE02, 0xAE81, 0xCE03, 0xAE82, 0xCE05, 0xAE83, 0xCE06, 0xAE84, 0xCE07, + 0xAE85, 0xCE09, 0xAE86, 0xCE0A, 0xAE87, 0xCE0B, 0xAE88, 0xCE0D, 0xAE89, 0xCE0E, 0xAE8A, 0xCE0F, 0xAE8B, 0xCE10, 0xAE8C, 0xCE11, + 0xAE8D, 0xCE12, 0xAE8E, 0xCE13, 0xAE8F, 0xCE15, 0xAE90, 0xCE16, 0xAE91, 0xCE17, 0xAE92, 0xCE18, 0xAE93, 0xCE1A, 0xAE94, 0xCE1B, + 0xAE95, 0xCE1C, 0xAE96, 0xCE1D, 0xAE97, 0xCE1E, 0xAE98, 0xCE1F, 0xAE99, 0xCE22, 0xAE9A, 0xCE23, 0xAE9B, 0xCE25, 0xAE9C, 0xCE26, + 0xAE9D, 0xCE27, 0xAE9E, 0xCE29, 0xAE9F, 0xCE2A, 0xAEA0, 0xCE2B, 0xAF41, 0xCE2C, 0xAF42, 0xCE2D, 0xAF43, 0xCE2E, 0xAF44, 0xCE2F, + 0xAF45, 0xCE32, 0xAF46, 0xCE34, 0xAF47, 0xCE36, 0xAF48, 0xCE37, 0xAF49, 0xCE38, 0xAF4A, 0xCE39, 0xAF4B, 0xCE3A, 0xAF4C, 0xCE3B, + 0xAF4D, 0xCE3C, 0xAF4E, 0xCE3D, 0xAF4F, 0xCE3E, 0xAF50, 0xCE3F, 0xAF51, 0xCE40, 0xAF52, 0xCE41, 0xAF53, 0xCE42, 0xAF54, 0xCE43, + 0xAF55, 0xCE44, 0xAF56, 0xCE45, 0xAF57, 0xCE46, 0xAF58, 0xCE47, 0xAF59, 0xCE48, 0xAF5A, 0xCE49, 0xAF61, 0xCE4A, 0xAF62, 0xCE4B, + 0xAF63, 0xCE4C, 0xAF64, 0xCE4D, 0xAF65, 0xCE4E, 0xAF66, 0xCE4F, 0xAF67, 0xCE50, 0xAF68, 0xCE51, 0xAF69, 0xCE52, 0xAF6A, 0xCE53, + 0xAF6B, 0xCE54, 0xAF6C, 0xCE55, 0xAF6D, 0xCE56, 0xAF6E, 0xCE57, 0xAF6F, 0xCE5A, 0xAF70, 0xCE5B, 0xAF71, 0xCE5D, 0xAF72, 0xCE5E, + 0xAF73, 0xCE62, 0xAF74, 0xCE63, 0xAF75, 0xCE64, 0xAF76, 0xCE65, 0xAF77, 0xCE66, 0xAF78, 0xCE67, 0xAF79, 0xCE6A, 0xAF7A, 0xCE6C, + 0xAF81, 0xCE6E, 0xAF82, 0xCE6F, 0xAF83, 0xCE70, 0xAF84, 0xCE71, 0xAF85, 0xCE72, 0xAF86, 0xCE73, 0xAF87, 0xCE76, 0xAF88, 0xCE77, + 0xAF89, 0xCE79, 0xAF8A, 0xCE7A, 0xAF8B, 0xCE7B, 0xAF8C, 0xCE7D, 0xAF8D, 0xCE7E, 0xAF8E, 0xCE7F, 0xAF8F, 0xCE80, 0xAF90, 0xCE81, + 0xAF91, 0xCE82, 0xAF92, 0xCE83, 0xAF93, 0xCE86, 0xAF94, 0xCE88, 0xAF95, 0xCE8A, 0xAF96, 0xCE8B, 0xAF97, 0xCE8C, 0xAF98, 0xCE8D, + 0xAF99, 0xCE8E, 0xAF9A, 0xCE8F, 0xAF9B, 0xCE92, 0xAF9C, 0xCE93, 0xAF9D, 0xCE95, 0xAF9E, 0xCE96, 0xAF9F, 0xCE97, 0xAFA0, 0xCE99, + 0xB041, 0xCE9A, 0xB042, 0xCE9B, 0xB043, 0xCE9C, 0xB044, 0xCE9D, 0xB045, 0xCE9E, 0xB046, 0xCE9F, 0xB047, 0xCEA2, 0xB048, 0xCEA6, + 0xB049, 0xCEA7, 0xB04A, 0xCEA8, 0xB04B, 0xCEA9, 0xB04C, 0xCEAA, 0xB04D, 0xCEAB, 0xB04E, 0xCEAE, 0xB04F, 0xCEAF, 0xB050, 0xCEB0, + 0xB051, 0xCEB1, 0xB052, 0xCEB2, 0xB053, 0xCEB3, 0xB054, 0xCEB4, 0xB055, 0xCEB5, 0xB056, 0xCEB6, 0xB057, 0xCEB7, 0xB058, 0xCEB8, + 0xB059, 0xCEB9, 0xB05A, 0xCEBA, 0xB061, 0xCEBB, 0xB062, 0xCEBC, 0xB063, 0xCEBD, 0xB064, 0xCEBE, 0xB065, 0xCEBF, 0xB066, 0xCEC0, + 0xB067, 0xCEC2, 0xB068, 0xCEC3, 0xB069, 0xCEC4, 0xB06A, 0xCEC5, 0xB06B, 0xCEC6, 0xB06C, 0xCEC7, 0xB06D, 0xCEC8, 0xB06E, 0xCEC9, + 0xB06F, 0xCECA, 0xB070, 0xCECB, 0xB071, 0xCECC, 0xB072, 0xCECD, 0xB073, 0xCECE, 0xB074, 0xCECF, 0xB075, 0xCED0, 0xB076, 0xCED1, + 0xB077, 0xCED2, 0xB078, 0xCED3, 0xB079, 0xCED4, 0xB07A, 0xCED5, 0xB081, 0xCED6, 0xB082, 0xCED7, 0xB083, 0xCED8, 0xB084, 0xCED9, + 0xB085, 0xCEDA, 0xB086, 0xCEDB, 0xB087, 0xCEDC, 0xB088, 0xCEDD, 0xB089, 0xCEDE, 0xB08A, 0xCEDF, 0xB08B, 0xCEE0, 0xB08C, 0xCEE1, + 0xB08D, 0xCEE2, 0xB08E, 0xCEE3, 0xB08F, 0xCEE6, 0xB090, 0xCEE7, 0xB091, 0xCEE9, 0xB092, 0xCEEA, 0xB093, 0xCEED, 0xB094, 0xCEEE, + 0xB095, 0xCEEF, 0xB096, 0xCEF0, 0xB097, 0xCEF1, 0xB098, 0xCEF2, 0xB099, 0xCEF3, 0xB09A, 0xCEF6, 0xB09B, 0xCEFA, 0xB09C, 0xCEFB, + 0xB09D, 0xCEFC, 0xB09E, 0xCEFD, 0xB09F, 0xCEFE, 0xB0A0, 0xCEFF, 0xB0A1, 0xAC00, 0xB0A2, 0xAC01, 0xB0A3, 0xAC04, 0xB0A4, 0xAC07, + 0xB0A5, 0xAC08, 0xB0A6, 0xAC09, 0xB0A7, 0xAC0A, 0xB0A8, 0xAC10, 0xB0A9, 0xAC11, 0xB0AA, 0xAC12, 0xB0AB, 0xAC13, 0xB0AC, 0xAC14, + 0xB0AD, 0xAC15, 0xB0AE, 0xAC16, 0xB0AF, 0xAC17, 0xB0B0, 0xAC19, 0xB0B1, 0xAC1A, 0xB0B2, 0xAC1B, 0xB0B3, 0xAC1C, 0xB0B4, 0xAC1D, + 0xB0B5, 0xAC20, 0xB0B6, 0xAC24, 0xB0B7, 0xAC2C, 0xB0B8, 0xAC2D, 0xB0B9, 0xAC2F, 0xB0BA, 0xAC30, 0xB0BB, 0xAC31, 0xB0BC, 0xAC38, + 0xB0BD, 0xAC39, 0xB0BE, 0xAC3C, 0xB0BF, 0xAC40, 0xB0C0, 0xAC4B, 0xB0C1, 0xAC4D, 0xB0C2, 0xAC54, 0xB0C3, 0xAC58, 0xB0C4, 0xAC5C, + 0xB0C5, 0xAC70, 0xB0C6, 0xAC71, 0xB0C7, 0xAC74, 0xB0C8, 0xAC77, 0xB0C9, 0xAC78, 0xB0CA, 0xAC7A, 0xB0CB, 0xAC80, 0xB0CC, 0xAC81, + 0xB0CD, 0xAC83, 0xB0CE, 0xAC84, 0xB0CF, 0xAC85, 0xB0D0, 0xAC86, 0xB0D1, 0xAC89, 0xB0D2, 0xAC8A, 0xB0D3, 0xAC8B, 0xB0D4, 0xAC8C, + 0xB0D5, 0xAC90, 0xB0D6, 0xAC94, 0xB0D7, 0xAC9C, 0xB0D8, 0xAC9D, 0xB0D9, 0xAC9F, 0xB0DA, 0xACA0, 0xB0DB, 0xACA1, 0xB0DC, 0xACA8, + 0xB0DD, 0xACA9, 0xB0DE, 0xACAA, 0xB0DF, 0xACAC, 0xB0E0, 0xACAF, 0xB0E1, 0xACB0, 0xB0E2, 0xACB8, 0xB0E3, 0xACB9, 0xB0E4, 0xACBB, + 0xB0E5, 0xACBC, 0xB0E6, 0xACBD, 0xB0E7, 0xACC1, 0xB0E8, 0xACC4, 0xB0E9, 0xACC8, 0xB0EA, 0xACCC, 0xB0EB, 0xACD5, 0xB0EC, 0xACD7, + 0xB0ED, 0xACE0, 0xB0EE, 0xACE1, 0xB0EF, 0xACE4, 0xB0F0, 0xACE7, 0xB0F1, 0xACE8, 0xB0F2, 0xACEA, 0xB0F3, 0xACEC, 0xB0F4, 0xACEF, + 0xB0F5, 0xACF0, 0xB0F6, 0xACF1, 0xB0F7, 0xACF3, 0xB0F8, 0xACF5, 0xB0F9, 0xACF6, 0xB0FA, 0xACFC, 0xB0FB, 0xACFD, 0xB0FC, 0xAD00, + 0xB0FD, 0xAD04, 0xB0FE, 0xAD06, 0xB141, 0xCF02, 0xB142, 0xCF03, 0xB143, 0xCF05, 0xB144, 0xCF06, 0xB145, 0xCF07, 0xB146, 0xCF09, + 0xB147, 0xCF0A, 0xB148, 0xCF0B, 0xB149, 0xCF0C, 0xB14A, 0xCF0D, 0xB14B, 0xCF0E, 0xB14C, 0xCF0F, 0xB14D, 0xCF12, 0xB14E, 0xCF14, + 0xB14F, 0xCF16, 0xB150, 0xCF17, 0xB151, 0xCF18, 0xB152, 0xCF19, 0xB153, 0xCF1A, 0xB154, 0xCF1B, 0xB155, 0xCF1D, 0xB156, 0xCF1E, + 0xB157, 0xCF1F, 0xB158, 0xCF21, 0xB159, 0xCF22, 0xB15A, 0xCF23, 0xB161, 0xCF25, 0xB162, 0xCF26, 0xB163, 0xCF27, 0xB164, 0xCF28, + 0xB165, 0xCF29, 0xB166, 0xCF2A, 0xB167, 0xCF2B, 0xB168, 0xCF2E, 0xB169, 0xCF32, 0xB16A, 0xCF33, 0xB16B, 0xCF34, 0xB16C, 0xCF35, + 0xB16D, 0xCF36, 0xB16E, 0xCF37, 0xB16F, 0xCF39, 0xB170, 0xCF3A, 0xB171, 0xCF3B, 0xB172, 0xCF3C, 0xB173, 0xCF3D, 0xB174, 0xCF3E, + 0xB175, 0xCF3F, 0xB176, 0xCF40, 0xB177, 0xCF41, 0xB178, 0xCF42, 0xB179, 0xCF43, 0xB17A, 0xCF44, 0xB181, 0xCF45, 0xB182, 0xCF46, + 0xB183, 0xCF47, 0xB184, 0xCF48, 0xB185, 0xCF49, 0xB186, 0xCF4A, 0xB187, 0xCF4B, 0xB188, 0xCF4C, 0xB189, 0xCF4D, 0xB18A, 0xCF4E, + 0xB18B, 0xCF4F, 0xB18C, 0xCF50, 0xB18D, 0xCF51, 0xB18E, 0xCF52, 0xB18F, 0xCF53, 0xB190, 0xCF56, 0xB191, 0xCF57, 0xB192, 0xCF59, + 0xB193, 0xCF5A, 0xB194, 0xCF5B, 0xB195, 0xCF5D, 0xB196, 0xCF5E, 0xB197, 0xCF5F, 0xB198, 0xCF60, 0xB199, 0xCF61, 0xB19A, 0xCF62, + 0xB19B, 0xCF63, 0xB19C, 0xCF66, 0xB19D, 0xCF68, 0xB19E, 0xCF6A, 0xB19F, 0xCF6B, 0xB1A0, 0xCF6C, 0xB1A1, 0xAD0C, 0xB1A2, 0xAD0D, + 0xB1A3, 0xAD0F, 0xB1A4, 0xAD11, 0xB1A5, 0xAD18, 0xB1A6, 0xAD1C, 0xB1A7, 0xAD20, 0xB1A8, 0xAD29, 0xB1A9, 0xAD2C, 0xB1AA, 0xAD2D, + 0xB1AB, 0xAD34, 0xB1AC, 0xAD35, 0xB1AD, 0xAD38, 0xB1AE, 0xAD3C, 0xB1AF, 0xAD44, 0xB1B0, 0xAD45, 0xB1B1, 0xAD47, 0xB1B2, 0xAD49, + 0xB1B3, 0xAD50, 0xB1B4, 0xAD54, 0xB1B5, 0xAD58, 0xB1B6, 0xAD61, 0xB1B7, 0xAD63, 0xB1B8, 0xAD6C, 0xB1B9, 0xAD6D, 0xB1BA, 0xAD70, + 0xB1BB, 0xAD73, 0xB1BC, 0xAD74, 0xB1BD, 0xAD75, 0xB1BE, 0xAD76, 0xB1BF, 0xAD7B, 0xB1C0, 0xAD7C, 0xB1C1, 0xAD7D, 0xB1C2, 0xAD7F, + 0xB1C3, 0xAD81, 0xB1C4, 0xAD82, 0xB1C5, 0xAD88, 0xB1C6, 0xAD89, 0xB1C7, 0xAD8C, 0xB1C8, 0xAD90, 0xB1C9, 0xAD9C, 0xB1CA, 0xAD9D, + 0xB1CB, 0xADA4, 0xB1CC, 0xADB7, 0xB1CD, 0xADC0, 0xB1CE, 0xADC1, 0xB1CF, 0xADC4, 0xB1D0, 0xADC8, 0xB1D1, 0xADD0, 0xB1D2, 0xADD1, + 0xB1D3, 0xADD3, 0xB1D4, 0xADDC, 0xB1D5, 0xADE0, 0xB1D6, 0xADE4, 0xB1D7, 0xADF8, 0xB1D8, 0xADF9, 0xB1D9, 0xADFC, 0xB1DA, 0xADFF, + 0xB1DB, 0xAE00, 0xB1DC, 0xAE01, 0xB1DD, 0xAE08, 0xB1DE, 0xAE09, 0xB1DF, 0xAE0B, 0xB1E0, 0xAE0D, 0xB1E1, 0xAE14, 0xB1E2, 0xAE30, + 0xB1E3, 0xAE31, 0xB1E4, 0xAE34, 0xB1E5, 0xAE37, 0xB1E6, 0xAE38, 0xB1E7, 0xAE3A, 0xB1E8, 0xAE40, 0xB1E9, 0xAE41, 0xB1EA, 0xAE43, + 0xB1EB, 0xAE45, 0xB1EC, 0xAE46, 0xB1ED, 0xAE4A, 0xB1EE, 0xAE4C, 0xB1EF, 0xAE4D, 0xB1F0, 0xAE4E, 0xB1F1, 0xAE50, 0xB1F2, 0xAE54, + 0xB1F3, 0xAE56, 0xB1F4, 0xAE5C, 0xB1F5, 0xAE5D, 0xB1F6, 0xAE5F, 0xB1F7, 0xAE60, 0xB1F8, 0xAE61, 0xB1F9, 0xAE65, 0xB1FA, 0xAE68, + 0xB1FB, 0xAE69, 0xB1FC, 0xAE6C, 0xB1FD, 0xAE70, 0xB1FE, 0xAE78, 0xB241, 0xCF6D, 0xB242, 0xCF6E, 0xB243, 0xCF6F, 0xB244, 0xCF72, + 0xB245, 0xCF73, 0xB246, 0xCF75, 0xB247, 0xCF76, 0xB248, 0xCF77, 0xB249, 0xCF79, 0xB24A, 0xCF7A, 0xB24B, 0xCF7B, 0xB24C, 0xCF7C, + 0xB24D, 0xCF7D, 0xB24E, 0xCF7E, 0xB24F, 0xCF7F, 0xB250, 0xCF81, 0xB251, 0xCF82, 0xB252, 0xCF83, 0xB253, 0xCF84, 0xB254, 0xCF86, + 0xB255, 0xCF87, 0xB256, 0xCF88, 0xB257, 0xCF89, 0xB258, 0xCF8A, 0xB259, 0xCF8B, 0xB25A, 0xCF8D, 0xB261, 0xCF8E, 0xB262, 0xCF8F, + 0xB263, 0xCF90, 0xB264, 0xCF91, 0xB265, 0xCF92, 0xB266, 0xCF93, 0xB267, 0xCF94, 0xB268, 0xCF95, 0xB269, 0xCF96, 0xB26A, 0xCF97, + 0xB26B, 0xCF98, 0xB26C, 0xCF99, 0xB26D, 0xCF9A, 0xB26E, 0xCF9B, 0xB26F, 0xCF9C, 0xB270, 0xCF9D, 0xB271, 0xCF9E, 0xB272, 0xCF9F, + 0xB273, 0xCFA0, 0xB274, 0xCFA2, 0xB275, 0xCFA3, 0xB276, 0xCFA4, 0xB277, 0xCFA5, 0xB278, 0xCFA6, 0xB279, 0xCFA7, 0xB27A, 0xCFA9, + 0xB281, 0xCFAA, 0xB282, 0xCFAB, 0xB283, 0xCFAC, 0xB284, 0xCFAD, 0xB285, 0xCFAE, 0xB286, 0xCFAF, 0xB287, 0xCFB1, 0xB288, 0xCFB2, + 0xB289, 0xCFB3, 0xB28A, 0xCFB4, 0xB28B, 0xCFB5, 0xB28C, 0xCFB6, 0xB28D, 0xCFB7, 0xB28E, 0xCFB8, 0xB28F, 0xCFB9, 0xB290, 0xCFBA, + 0xB291, 0xCFBB, 0xB292, 0xCFBC, 0xB293, 0xCFBD, 0xB294, 0xCFBE, 0xB295, 0xCFBF, 0xB296, 0xCFC0, 0xB297, 0xCFC1, 0xB298, 0xCFC2, + 0xB299, 0xCFC3, 0xB29A, 0xCFC5, 0xB29B, 0xCFC6, 0xB29C, 0xCFC7, 0xB29D, 0xCFC8, 0xB29E, 0xCFC9, 0xB29F, 0xCFCA, 0xB2A0, 0xCFCB, + 0xB2A1, 0xAE79, 0xB2A2, 0xAE7B, 0xB2A3, 0xAE7C, 0xB2A4, 0xAE7D, 0xB2A5, 0xAE84, 0xB2A6, 0xAE85, 0xB2A7, 0xAE8C, 0xB2A8, 0xAEBC, + 0xB2A9, 0xAEBD, 0xB2AA, 0xAEBE, 0xB2AB, 0xAEC0, 0xB2AC, 0xAEC4, 0xB2AD, 0xAECC, 0xB2AE, 0xAECD, 0xB2AF, 0xAECF, 0xB2B0, 0xAED0, + 0xB2B1, 0xAED1, 0xB2B2, 0xAED8, 0xB2B3, 0xAED9, 0xB2B4, 0xAEDC, 0xB2B5, 0xAEE8, 0xB2B6, 0xAEEB, 0xB2B7, 0xAEED, 0xB2B8, 0xAEF4, + 0xB2B9, 0xAEF8, 0xB2BA, 0xAEFC, 0xB2BB, 0xAF07, 0xB2BC, 0xAF08, 0xB2BD, 0xAF0D, 0xB2BE, 0xAF10, 0xB2BF, 0xAF2C, 0xB2C0, 0xAF2D, + 0xB2C1, 0xAF30, 0xB2C2, 0xAF32, 0xB2C3, 0xAF34, 0xB2C4, 0xAF3C, 0xB2C5, 0xAF3D, 0xB2C6, 0xAF3F, 0xB2C7, 0xAF41, 0xB2C8, 0xAF42, + 0xB2C9, 0xAF43, 0xB2CA, 0xAF48, 0xB2CB, 0xAF49, 0xB2CC, 0xAF50, 0xB2CD, 0xAF5C, 0xB2CE, 0xAF5D, 0xB2CF, 0xAF64, 0xB2D0, 0xAF65, + 0xB2D1, 0xAF79, 0xB2D2, 0xAF80, 0xB2D3, 0xAF84, 0xB2D4, 0xAF88, 0xB2D5, 0xAF90, 0xB2D6, 0xAF91, 0xB2D7, 0xAF95, 0xB2D8, 0xAF9C, + 0xB2D9, 0xAFB8, 0xB2DA, 0xAFB9, 0xB2DB, 0xAFBC, 0xB2DC, 0xAFC0, 0xB2DD, 0xAFC7, 0xB2DE, 0xAFC8, 0xB2DF, 0xAFC9, 0xB2E0, 0xAFCB, + 0xB2E1, 0xAFCD, 0xB2E2, 0xAFCE, 0xB2E3, 0xAFD4, 0xB2E4, 0xAFDC, 0xB2E5, 0xAFE8, 0xB2E6, 0xAFE9, 0xB2E7, 0xAFF0, 0xB2E8, 0xAFF1, + 0xB2E9, 0xAFF4, 0xB2EA, 0xAFF8, 0xB2EB, 0xB000, 0xB2EC, 0xB001, 0xB2ED, 0xB004, 0xB2EE, 0xB00C, 0xB2EF, 0xB010, 0xB2F0, 0xB014, + 0xB2F1, 0xB01C, 0xB2F2, 0xB01D, 0xB2F3, 0xB028, 0xB2F4, 0xB044, 0xB2F5, 0xB045, 0xB2F6, 0xB048, 0xB2F7, 0xB04A, 0xB2F8, 0xB04C, + 0xB2F9, 0xB04E, 0xB2FA, 0xB053, 0xB2FB, 0xB054, 0xB2FC, 0xB055, 0xB2FD, 0xB057, 0xB2FE, 0xB059, 0xB341, 0xCFCC, 0xB342, 0xCFCD, + 0xB343, 0xCFCE, 0xB344, 0xCFCF, 0xB345, 0xCFD0, 0xB346, 0xCFD1, 0xB347, 0xCFD2, 0xB348, 0xCFD3, 0xB349, 0xCFD4, 0xB34A, 0xCFD5, + 0xB34B, 0xCFD6, 0xB34C, 0xCFD7, 0xB34D, 0xCFD8, 0xB34E, 0xCFD9, 0xB34F, 0xCFDA, 0xB350, 0xCFDB, 0xB351, 0xCFDC, 0xB352, 0xCFDD, + 0xB353, 0xCFDE, 0xB354, 0xCFDF, 0xB355, 0xCFE2, 0xB356, 0xCFE3, 0xB357, 0xCFE5, 0xB358, 0xCFE6, 0xB359, 0xCFE7, 0xB35A, 0xCFE9, + 0xB361, 0xCFEA, 0xB362, 0xCFEB, 0xB363, 0xCFEC, 0xB364, 0xCFED, 0xB365, 0xCFEE, 0xB366, 0xCFEF, 0xB367, 0xCFF2, 0xB368, 0xCFF4, + 0xB369, 0xCFF6, 0xB36A, 0xCFF7, 0xB36B, 0xCFF8, 0xB36C, 0xCFF9, 0xB36D, 0xCFFA, 0xB36E, 0xCFFB, 0xB36F, 0xCFFD, 0xB370, 0xCFFE, + 0xB371, 0xCFFF, 0xB372, 0xD001, 0xB373, 0xD002, 0xB374, 0xD003, 0xB375, 0xD005, 0xB376, 0xD006, 0xB377, 0xD007, 0xB378, 0xD008, + 0xB379, 0xD009, 0xB37A, 0xD00A, 0xB381, 0xD00B, 0xB382, 0xD00C, 0xB383, 0xD00D, 0xB384, 0xD00E, 0xB385, 0xD00F, 0xB386, 0xD010, + 0xB387, 0xD012, 0xB388, 0xD013, 0xB389, 0xD014, 0xB38A, 0xD015, 0xB38B, 0xD016, 0xB38C, 0xD017, 0xB38D, 0xD019, 0xB38E, 0xD01A, + 0xB38F, 0xD01B, 0xB390, 0xD01C, 0xB391, 0xD01D, 0xB392, 0xD01E, 0xB393, 0xD01F, 0xB394, 0xD020, 0xB395, 0xD021, 0xB396, 0xD022, + 0xB397, 0xD023, 0xB398, 0xD024, 0xB399, 0xD025, 0xB39A, 0xD026, 0xB39B, 0xD027, 0xB39C, 0xD028, 0xB39D, 0xD029, 0xB39E, 0xD02A, + 0xB39F, 0xD02B, 0xB3A0, 0xD02C, 0xB3A1, 0xB05D, 0xB3A2, 0xB07C, 0xB3A3, 0xB07D, 0xB3A4, 0xB080, 0xB3A5, 0xB084, 0xB3A6, 0xB08C, + 0xB3A7, 0xB08D, 0xB3A8, 0xB08F, 0xB3A9, 0xB091, 0xB3AA, 0xB098, 0xB3AB, 0xB099, 0xB3AC, 0xB09A, 0xB3AD, 0xB09C, 0xB3AE, 0xB09F, + 0xB3AF, 0xB0A0, 0xB3B0, 0xB0A1, 0xB3B1, 0xB0A2, 0xB3B2, 0xB0A8, 0xB3B3, 0xB0A9, 0xB3B4, 0xB0AB, 0xB3B5, 0xB0AC, 0xB3B6, 0xB0AD, + 0xB3B7, 0xB0AE, 0xB3B8, 0xB0AF, 0xB3B9, 0xB0B1, 0xB3BA, 0xB0B3, 0xB3BB, 0xB0B4, 0xB3BC, 0xB0B5, 0xB3BD, 0xB0B8, 0xB3BE, 0xB0BC, + 0xB3BF, 0xB0C4, 0xB3C0, 0xB0C5, 0xB3C1, 0xB0C7, 0xB3C2, 0xB0C8, 0xB3C3, 0xB0C9, 0xB3C4, 0xB0D0, 0xB3C5, 0xB0D1, 0xB3C6, 0xB0D4, + 0xB3C7, 0xB0D8, 0xB3C8, 0xB0E0, 0xB3C9, 0xB0E5, 0xB3CA, 0xB108, 0xB3CB, 0xB109, 0xB3CC, 0xB10B, 0xB3CD, 0xB10C, 0xB3CE, 0xB110, + 0xB3CF, 0xB112, 0xB3D0, 0xB113, 0xB3D1, 0xB118, 0xB3D2, 0xB119, 0xB3D3, 0xB11B, 0xB3D4, 0xB11C, 0xB3D5, 0xB11D, 0xB3D6, 0xB123, + 0xB3D7, 0xB124, 0xB3D8, 0xB125, 0xB3D9, 0xB128, 0xB3DA, 0xB12C, 0xB3DB, 0xB134, 0xB3DC, 0xB135, 0xB3DD, 0xB137, 0xB3DE, 0xB138, + 0xB3DF, 0xB139, 0xB3E0, 0xB140, 0xB3E1, 0xB141, 0xB3E2, 0xB144, 0xB3E3, 0xB148, 0xB3E4, 0xB150, 0xB3E5, 0xB151, 0xB3E6, 0xB154, + 0xB3E7, 0xB155, 0xB3E8, 0xB158, 0xB3E9, 0xB15C, 0xB3EA, 0xB160, 0xB3EB, 0xB178, 0xB3EC, 0xB179, 0xB3ED, 0xB17C, 0xB3EE, 0xB180, + 0xB3EF, 0xB182, 0xB3F0, 0xB188, 0xB3F1, 0xB189, 0xB3F2, 0xB18B, 0xB3F3, 0xB18D, 0xB3F4, 0xB192, 0xB3F5, 0xB193, 0xB3F6, 0xB194, + 0xB3F7, 0xB198, 0xB3F8, 0xB19C, 0xB3F9, 0xB1A8, 0xB3FA, 0xB1CC, 0xB3FB, 0xB1D0, 0xB3FC, 0xB1D4, 0xB3FD, 0xB1DC, 0xB3FE, 0xB1DD, + 0xB441, 0xD02E, 0xB442, 0xD02F, 0xB443, 0xD030, 0xB444, 0xD031, 0xB445, 0xD032, 0xB446, 0xD033, 0xB447, 0xD036, 0xB448, 0xD037, + 0xB449, 0xD039, 0xB44A, 0xD03A, 0xB44B, 0xD03B, 0xB44C, 0xD03D, 0xB44D, 0xD03E, 0xB44E, 0xD03F, 0xB44F, 0xD040, 0xB450, 0xD041, + 0xB451, 0xD042, 0xB452, 0xD043, 0xB453, 0xD046, 0xB454, 0xD048, 0xB455, 0xD04A, 0xB456, 0xD04B, 0xB457, 0xD04C, 0xB458, 0xD04D, + 0xB459, 0xD04E, 0xB45A, 0xD04F, 0xB461, 0xD051, 0xB462, 0xD052, 0xB463, 0xD053, 0xB464, 0xD055, 0xB465, 0xD056, 0xB466, 0xD057, + 0xB467, 0xD059, 0xB468, 0xD05A, 0xB469, 0xD05B, 0xB46A, 0xD05C, 0xB46B, 0xD05D, 0xB46C, 0xD05E, 0xB46D, 0xD05F, 0xB46E, 0xD061, + 0xB46F, 0xD062, 0xB470, 0xD063, 0xB471, 0xD064, 0xB472, 0xD065, 0xB473, 0xD066, 0xB474, 0xD067, 0xB475, 0xD068, 0xB476, 0xD069, + 0xB477, 0xD06A, 0xB478, 0xD06B, 0xB479, 0xD06E, 0xB47A, 0xD06F, 0xB481, 0xD071, 0xB482, 0xD072, 0xB483, 0xD073, 0xB484, 0xD075, + 0xB485, 0xD076, 0xB486, 0xD077, 0xB487, 0xD078, 0xB488, 0xD079, 0xB489, 0xD07A, 0xB48A, 0xD07B, 0xB48B, 0xD07E, 0xB48C, 0xD07F, + 0xB48D, 0xD080, 0xB48E, 0xD082, 0xB48F, 0xD083, 0xB490, 0xD084, 0xB491, 0xD085, 0xB492, 0xD086, 0xB493, 0xD087, 0xB494, 0xD088, + 0xB495, 0xD089, 0xB496, 0xD08A, 0xB497, 0xD08B, 0xB498, 0xD08C, 0xB499, 0xD08D, 0xB49A, 0xD08E, 0xB49B, 0xD08F, 0xB49C, 0xD090, + 0xB49D, 0xD091, 0xB49E, 0xD092, 0xB49F, 0xD093, 0xB4A0, 0xD094, 0xB4A1, 0xB1DF, 0xB4A2, 0xB1E8, 0xB4A3, 0xB1E9, 0xB4A4, 0xB1EC, + 0xB4A5, 0xB1F0, 0xB4A6, 0xB1F9, 0xB4A7, 0xB1FB, 0xB4A8, 0xB1FD, 0xB4A9, 0xB204, 0xB4AA, 0xB205, 0xB4AB, 0xB208, 0xB4AC, 0xB20B, + 0xB4AD, 0xB20C, 0xB4AE, 0xB214, 0xB4AF, 0xB215, 0xB4B0, 0xB217, 0xB4B1, 0xB219, 0xB4B2, 0xB220, 0xB4B3, 0xB234, 0xB4B4, 0xB23C, + 0xB4B5, 0xB258, 0xB4B6, 0xB25C, 0xB4B7, 0xB260, 0xB4B8, 0xB268, 0xB4B9, 0xB269, 0xB4BA, 0xB274, 0xB4BB, 0xB275, 0xB4BC, 0xB27C, + 0xB4BD, 0xB284, 0xB4BE, 0xB285, 0xB4BF, 0xB289, 0xB4C0, 0xB290, 0xB4C1, 0xB291, 0xB4C2, 0xB294, 0xB4C3, 0xB298, 0xB4C4, 0xB299, + 0xB4C5, 0xB29A, 0xB4C6, 0xB2A0, 0xB4C7, 0xB2A1, 0xB4C8, 0xB2A3, 0xB4C9, 0xB2A5, 0xB4CA, 0xB2A6, 0xB4CB, 0xB2AA, 0xB4CC, 0xB2AC, + 0xB4CD, 0xB2B0, 0xB4CE, 0xB2B4, 0xB4CF, 0xB2C8, 0xB4D0, 0xB2C9, 0xB4D1, 0xB2CC, 0xB4D2, 0xB2D0, 0xB4D3, 0xB2D2, 0xB4D4, 0xB2D8, + 0xB4D5, 0xB2D9, 0xB4D6, 0xB2DB, 0xB4D7, 0xB2DD, 0xB4D8, 0xB2E2, 0xB4D9, 0xB2E4, 0xB4DA, 0xB2E5, 0xB4DB, 0xB2E6, 0xB4DC, 0xB2E8, + 0xB4DD, 0xB2EB, 0xB4DE, 0xB2EC, 0xB4DF, 0xB2ED, 0xB4E0, 0xB2EE, 0xB4E1, 0xB2EF, 0xB4E2, 0xB2F3, 0xB4E3, 0xB2F4, 0xB4E4, 0xB2F5, + 0xB4E5, 0xB2F7, 0xB4E6, 0xB2F8, 0xB4E7, 0xB2F9, 0xB4E8, 0xB2FA, 0xB4E9, 0xB2FB, 0xB4EA, 0xB2FF, 0xB4EB, 0xB300, 0xB4EC, 0xB301, + 0xB4ED, 0xB304, 0xB4EE, 0xB308, 0xB4EF, 0xB310, 0xB4F0, 0xB311, 0xB4F1, 0xB313, 0xB4F2, 0xB314, 0xB4F3, 0xB315, 0xB4F4, 0xB31C, + 0xB4F5, 0xB354, 0xB4F6, 0xB355, 0xB4F7, 0xB356, 0xB4F8, 0xB358, 0xB4F9, 0xB35B, 0xB4FA, 0xB35C, 0xB4FB, 0xB35E, 0xB4FC, 0xB35F, + 0xB4FD, 0xB364, 0xB4FE, 0xB365, 0xB541, 0xD095, 0xB542, 0xD096, 0xB543, 0xD097, 0xB544, 0xD098, 0xB545, 0xD099, 0xB546, 0xD09A, + 0xB547, 0xD09B, 0xB548, 0xD09C, 0xB549, 0xD09D, 0xB54A, 0xD09E, 0xB54B, 0xD09F, 0xB54C, 0xD0A0, 0xB54D, 0xD0A1, 0xB54E, 0xD0A2, + 0xB54F, 0xD0A3, 0xB550, 0xD0A6, 0xB551, 0xD0A7, 0xB552, 0xD0A9, 0xB553, 0xD0AA, 0xB554, 0xD0AB, 0xB555, 0xD0AD, 0xB556, 0xD0AE, + 0xB557, 0xD0AF, 0xB558, 0xD0B0, 0xB559, 0xD0B1, 0xB55A, 0xD0B2, 0xB561, 0xD0B3, 0xB562, 0xD0B6, 0xB563, 0xD0B8, 0xB564, 0xD0BA, + 0xB565, 0xD0BB, 0xB566, 0xD0BC, 0xB567, 0xD0BD, 0xB568, 0xD0BE, 0xB569, 0xD0BF, 0xB56A, 0xD0C2, 0xB56B, 0xD0C3, 0xB56C, 0xD0C5, + 0xB56D, 0xD0C6, 0xB56E, 0xD0C7, 0xB56F, 0xD0CA, 0xB570, 0xD0CB, 0xB571, 0xD0CC, 0xB572, 0xD0CD, 0xB573, 0xD0CE, 0xB574, 0xD0CF, + 0xB575, 0xD0D2, 0xB576, 0xD0D6, 0xB577, 0xD0D7, 0xB578, 0xD0D8, 0xB579, 0xD0D9, 0xB57A, 0xD0DA, 0xB581, 0xD0DB, 0xB582, 0xD0DE, + 0xB583, 0xD0DF, 0xB584, 0xD0E1, 0xB585, 0xD0E2, 0xB586, 0xD0E3, 0xB587, 0xD0E5, 0xB588, 0xD0E6, 0xB589, 0xD0E7, 0xB58A, 0xD0E8, + 0xB58B, 0xD0E9, 0xB58C, 0xD0EA, 0xB58D, 0xD0EB, 0xB58E, 0xD0EE, 0xB58F, 0xD0F2, 0xB590, 0xD0F3, 0xB591, 0xD0F4, 0xB592, 0xD0F5, + 0xB593, 0xD0F6, 0xB594, 0xD0F7, 0xB595, 0xD0F9, 0xB596, 0xD0FA, 0xB597, 0xD0FB, 0xB598, 0xD0FC, 0xB599, 0xD0FD, 0xB59A, 0xD0FE, + 0xB59B, 0xD0FF, 0xB59C, 0xD100, 0xB59D, 0xD101, 0xB59E, 0xD102, 0xB59F, 0xD103, 0xB5A0, 0xD104, 0xB5A1, 0xB367, 0xB5A2, 0xB369, + 0xB5A3, 0xB36B, 0xB5A4, 0xB36E, 0xB5A5, 0xB370, 0xB5A6, 0xB371, 0xB5A7, 0xB374, 0xB5A8, 0xB378, 0xB5A9, 0xB380, 0xB5AA, 0xB381, + 0xB5AB, 0xB383, 0xB5AC, 0xB384, 0xB5AD, 0xB385, 0xB5AE, 0xB38C, 0xB5AF, 0xB390, 0xB5B0, 0xB394, 0xB5B1, 0xB3A0, 0xB5B2, 0xB3A1, + 0xB5B3, 0xB3A8, 0xB5B4, 0xB3AC, 0xB5B5, 0xB3C4, 0xB5B6, 0xB3C5, 0xB5B7, 0xB3C8, 0xB5B8, 0xB3CB, 0xB5B9, 0xB3CC, 0xB5BA, 0xB3CE, + 0xB5BB, 0xB3D0, 0xB5BC, 0xB3D4, 0xB5BD, 0xB3D5, 0xB5BE, 0xB3D7, 0xB5BF, 0xB3D9, 0xB5C0, 0xB3DB, 0xB5C1, 0xB3DD, 0xB5C2, 0xB3E0, + 0xB5C3, 0xB3E4, 0xB5C4, 0xB3E8, 0xB5C5, 0xB3FC, 0xB5C6, 0xB410, 0xB5C7, 0xB418, 0xB5C8, 0xB41C, 0xB5C9, 0xB420, 0xB5CA, 0xB428, + 0xB5CB, 0xB429, 0xB5CC, 0xB42B, 0xB5CD, 0xB434, 0xB5CE, 0xB450, 0xB5CF, 0xB451, 0xB5D0, 0xB454, 0xB5D1, 0xB458, 0xB5D2, 0xB460, + 0xB5D3, 0xB461, 0xB5D4, 0xB463, 0xB5D5, 0xB465, 0xB5D6, 0xB46C, 0xB5D7, 0xB480, 0xB5D8, 0xB488, 0xB5D9, 0xB49D, 0xB5DA, 0xB4A4, + 0xB5DB, 0xB4A8, 0xB5DC, 0xB4AC, 0xB5DD, 0xB4B5, 0xB5DE, 0xB4B7, 0xB5DF, 0xB4B9, 0xB5E0, 0xB4C0, 0xB5E1, 0xB4C4, 0xB5E2, 0xB4C8, + 0xB5E3, 0xB4D0, 0xB5E4, 0xB4D5, 0xB5E5, 0xB4DC, 0xB5E6, 0xB4DD, 0xB5E7, 0xB4E0, 0xB5E8, 0xB4E3, 0xB5E9, 0xB4E4, 0xB5EA, 0xB4E6, + 0xB5EB, 0xB4EC, 0xB5EC, 0xB4ED, 0xB5ED, 0xB4EF, 0xB5EE, 0xB4F1, 0xB5EF, 0xB4F8, 0xB5F0, 0xB514, 0xB5F1, 0xB515, 0xB5F2, 0xB518, + 0xB5F3, 0xB51B, 0xB5F4, 0xB51C, 0xB5F5, 0xB524, 0xB5F6, 0xB525, 0xB5F7, 0xB527, 0xB5F8, 0xB528, 0xB5F9, 0xB529, 0xB5FA, 0xB52A, + 0xB5FB, 0xB530, 0xB5FC, 0xB531, 0xB5FD, 0xB534, 0xB5FE, 0xB538, 0xB641, 0xD105, 0xB642, 0xD106, 0xB643, 0xD107, 0xB644, 0xD108, + 0xB645, 0xD109, 0xB646, 0xD10A, 0xB647, 0xD10B, 0xB648, 0xD10C, 0xB649, 0xD10E, 0xB64A, 0xD10F, 0xB64B, 0xD110, 0xB64C, 0xD111, + 0xB64D, 0xD112, 0xB64E, 0xD113, 0xB64F, 0xD114, 0xB650, 0xD115, 0xB651, 0xD116, 0xB652, 0xD117, 0xB653, 0xD118, 0xB654, 0xD119, + 0xB655, 0xD11A, 0xB656, 0xD11B, 0xB657, 0xD11C, 0xB658, 0xD11D, 0xB659, 0xD11E, 0xB65A, 0xD11F, 0xB661, 0xD120, 0xB662, 0xD121, + 0xB663, 0xD122, 0xB664, 0xD123, 0xB665, 0xD124, 0xB666, 0xD125, 0xB667, 0xD126, 0xB668, 0xD127, 0xB669, 0xD128, 0xB66A, 0xD129, + 0xB66B, 0xD12A, 0xB66C, 0xD12B, 0xB66D, 0xD12C, 0xB66E, 0xD12D, 0xB66F, 0xD12E, 0xB670, 0xD12F, 0xB671, 0xD132, 0xB672, 0xD133, + 0xB673, 0xD135, 0xB674, 0xD136, 0xB675, 0xD137, 0xB676, 0xD139, 0xB677, 0xD13B, 0xB678, 0xD13C, 0xB679, 0xD13D, 0xB67A, 0xD13E, + 0xB681, 0xD13F, 0xB682, 0xD142, 0xB683, 0xD146, 0xB684, 0xD147, 0xB685, 0xD148, 0xB686, 0xD149, 0xB687, 0xD14A, 0xB688, 0xD14B, + 0xB689, 0xD14E, 0xB68A, 0xD14F, 0xB68B, 0xD151, 0xB68C, 0xD152, 0xB68D, 0xD153, 0xB68E, 0xD155, 0xB68F, 0xD156, 0xB690, 0xD157, + 0xB691, 0xD158, 0xB692, 0xD159, 0xB693, 0xD15A, 0xB694, 0xD15B, 0xB695, 0xD15E, 0xB696, 0xD160, 0xB697, 0xD162, 0xB698, 0xD163, + 0xB699, 0xD164, 0xB69A, 0xD165, 0xB69B, 0xD166, 0xB69C, 0xD167, 0xB69D, 0xD169, 0xB69E, 0xD16A, 0xB69F, 0xD16B, 0xB6A0, 0xD16D, + 0xB6A1, 0xB540, 0xB6A2, 0xB541, 0xB6A3, 0xB543, 0xB6A4, 0xB544, 0xB6A5, 0xB545, 0xB6A6, 0xB54B, 0xB6A7, 0xB54C, 0xB6A8, 0xB54D, + 0xB6A9, 0xB550, 0xB6AA, 0xB554, 0xB6AB, 0xB55C, 0xB6AC, 0xB55D, 0xB6AD, 0xB55F, 0xB6AE, 0xB560, 0xB6AF, 0xB561, 0xB6B0, 0xB5A0, + 0xB6B1, 0xB5A1, 0xB6B2, 0xB5A4, 0xB6B3, 0xB5A8, 0xB6B4, 0xB5AA, 0xB6B5, 0xB5AB, 0xB6B6, 0xB5B0, 0xB6B7, 0xB5B1, 0xB6B8, 0xB5B3, + 0xB6B9, 0xB5B4, 0xB6BA, 0xB5B5, 0xB6BB, 0xB5BB, 0xB6BC, 0xB5BC, 0xB6BD, 0xB5BD, 0xB6BE, 0xB5C0, 0xB6BF, 0xB5C4, 0xB6C0, 0xB5CC, + 0xB6C1, 0xB5CD, 0xB6C2, 0xB5CF, 0xB6C3, 0xB5D0, 0xB6C4, 0xB5D1, 0xB6C5, 0xB5D8, 0xB6C6, 0xB5EC, 0xB6C7, 0xB610, 0xB6C8, 0xB611, + 0xB6C9, 0xB614, 0xB6CA, 0xB618, 0xB6CB, 0xB625, 0xB6CC, 0xB62C, 0xB6CD, 0xB634, 0xB6CE, 0xB648, 0xB6CF, 0xB664, 0xB6D0, 0xB668, + 0xB6D1, 0xB69C, 0xB6D2, 0xB69D, 0xB6D3, 0xB6A0, 0xB6D4, 0xB6A4, 0xB6D5, 0xB6AB, 0xB6D6, 0xB6AC, 0xB6D7, 0xB6B1, 0xB6D8, 0xB6D4, + 0xB6D9, 0xB6F0, 0xB6DA, 0xB6F4, 0xB6DB, 0xB6F8, 0xB6DC, 0xB700, 0xB6DD, 0xB701, 0xB6DE, 0xB705, 0xB6DF, 0xB728, 0xB6E0, 0xB729, + 0xB6E1, 0xB72C, 0xB6E2, 0xB72F, 0xB6E3, 0xB730, 0xB6E4, 0xB738, 0xB6E5, 0xB739, 0xB6E6, 0xB73B, 0xB6E7, 0xB744, 0xB6E8, 0xB748, + 0xB6E9, 0xB74C, 0xB6EA, 0xB754, 0xB6EB, 0xB755, 0xB6EC, 0xB760, 0xB6ED, 0xB764, 0xB6EE, 0xB768, 0xB6EF, 0xB770, 0xB6F0, 0xB771, + 0xB6F1, 0xB773, 0xB6F2, 0xB775, 0xB6F3, 0xB77C, 0xB6F4, 0xB77D, 0xB6F5, 0xB780, 0xB6F6, 0xB784, 0xB6F7, 0xB78C, 0xB6F8, 0xB78D, + 0xB6F9, 0xB78F, 0xB6FA, 0xB790, 0xB6FB, 0xB791, 0xB6FC, 0xB792, 0xB6FD, 0xB796, 0xB6FE, 0xB797, 0xB741, 0xD16E, 0xB742, 0xD16F, + 0xB743, 0xD170, 0xB744, 0xD171, 0xB745, 0xD172, 0xB746, 0xD173, 0xB747, 0xD174, 0xB748, 0xD175, 0xB749, 0xD176, 0xB74A, 0xD177, + 0xB74B, 0xD178, 0xB74C, 0xD179, 0xB74D, 0xD17A, 0xB74E, 0xD17B, 0xB74F, 0xD17D, 0xB750, 0xD17E, 0xB751, 0xD17F, 0xB752, 0xD180, + 0xB753, 0xD181, 0xB754, 0xD182, 0xB755, 0xD183, 0xB756, 0xD185, 0xB757, 0xD186, 0xB758, 0xD187, 0xB759, 0xD189, 0xB75A, 0xD18A, + 0xB761, 0xD18B, 0xB762, 0xD18C, 0xB763, 0xD18D, 0xB764, 0xD18E, 0xB765, 0xD18F, 0xB766, 0xD190, 0xB767, 0xD191, 0xB768, 0xD192, + 0xB769, 0xD193, 0xB76A, 0xD194, 0xB76B, 0xD195, 0xB76C, 0xD196, 0xB76D, 0xD197, 0xB76E, 0xD198, 0xB76F, 0xD199, 0xB770, 0xD19A, + 0xB771, 0xD19B, 0xB772, 0xD19C, 0xB773, 0xD19D, 0xB774, 0xD19E, 0xB775, 0xD19F, 0xB776, 0xD1A2, 0xB777, 0xD1A3, 0xB778, 0xD1A5, + 0xB779, 0xD1A6, 0xB77A, 0xD1A7, 0xB781, 0xD1A9, 0xB782, 0xD1AA, 0xB783, 0xD1AB, 0xB784, 0xD1AC, 0xB785, 0xD1AD, 0xB786, 0xD1AE, + 0xB787, 0xD1AF, 0xB788, 0xD1B2, 0xB789, 0xD1B4, 0xB78A, 0xD1B6, 0xB78B, 0xD1B7, 0xB78C, 0xD1B8, 0xB78D, 0xD1B9, 0xB78E, 0xD1BB, + 0xB78F, 0xD1BD, 0xB790, 0xD1BE, 0xB791, 0xD1BF, 0xB792, 0xD1C1, 0xB793, 0xD1C2, 0xB794, 0xD1C3, 0xB795, 0xD1C4, 0xB796, 0xD1C5, + 0xB797, 0xD1C6, 0xB798, 0xD1C7, 0xB799, 0xD1C8, 0xB79A, 0xD1C9, 0xB79B, 0xD1CA, 0xB79C, 0xD1CB, 0xB79D, 0xD1CC, 0xB79E, 0xD1CD, + 0xB79F, 0xD1CE, 0xB7A0, 0xD1CF, 0xB7A1, 0xB798, 0xB7A2, 0xB799, 0xB7A3, 0xB79C, 0xB7A4, 0xB7A0, 0xB7A5, 0xB7A8, 0xB7A6, 0xB7A9, + 0xB7A7, 0xB7AB, 0xB7A8, 0xB7AC, 0xB7A9, 0xB7AD, 0xB7AA, 0xB7B4, 0xB7AB, 0xB7B5, 0xB7AC, 0xB7B8, 0xB7AD, 0xB7C7, 0xB7AE, 0xB7C9, + 0xB7AF, 0xB7EC, 0xB7B0, 0xB7ED, 0xB7B1, 0xB7F0, 0xB7B2, 0xB7F4, 0xB7B3, 0xB7FC, 0xB7B4, 0xB7FD, 0xB7B5, 0xB7FF, 0xB7B6, 0xB800, + 0xB7B7, 0xB801, 0xB7B8, 0xB807, 0xB7B9, 0xB808, 0xB7BA, 0xB809, 0xB7BB, 0xB80C, 0xB7BC, 0xB810, 0xB7BD, 0xB818, 0xB7BE, 0xB819, + 0xB7BF, 0xB81B, 0xB7C0, 0xB81D, 0xB7C1, 0xB824, 0xB7C2, 0xB825, 0xB7C3, 0xB828, 0xB7C4, 0xB82C, 0xB7C5, 0xB834, 0xB7C6, 0xB835, + 0xB7C7, 0xB837, 0xB7C8, 0xB838, 0xB7C9, 0xB839, 0xB7CA, 0xB840, 0xB7CB, 0xB844, 0xB7CC, 0xB851, 0xB7CD, 0xB853, 0xB7CE, 0xB85C, + 0xB7CF, 0xB85D, 0xB7D0, 0xB860, 0xB7D1, 0xB864, 0xB7D2, 0xB86C, 0xB7D3, 0xB86D, 0xB7D4, 0xB86F, 0xB7D5, 0xB871, 0xB7D6, 0xB878, + 0xB7D7, 0xB87C, 0xB7D8, 0xB88D, 0xB7D9, 0xB8A8, 0xB7DA, 0xB8B0, 0xB7DB, 0xB8B4, 0xB7DC, 0xB8B8, 0xB7DD, 0xB8C0, 0xB7DE, 0xB8C1, + 0xB7DF, 0xB8C3, 0xB7E0, 0xB8C5, 0xB7E1, 0xB8CC, 0xB7E2, 0xB8D0, 0xB7E3, 0xB8D4, 0xB7E4, 0xB8DD, 0xB7E5, 0xB8DF, 0xB7E6, 0xB8E1, + 0xB7E7, 0xB8E8, 0xB7E8, 0xB8E9, 0xB7E9, 0xB8EC, 0xB7EA, 0xB8F0, 0xB7EB, 0xB8F8, 0xB7EC, 0xB8F9, 0xB7ED, 0xB8FB, 0xB7EE, 0xB8FD, + 0xB7EF, 0xB904, 0xB7F0, 0xB918, 0xB7F1, 0xB920, 0xB7F2, 0xB93C, 0xB7F3, 0xB93D, 0xB7F4, 0xB940, 0xB7F5, 0xB944, 0xB7F6, 0xB94C, + 0xB7F7, 0xB94F, 0xB7F8, 0xB951, 0xB7F9, 0xB958, 0xB7FA, 0xB959, 0xB7FB, 0xB95C, 0xB7FC, 0xB960, 0xB7FD, 0xB968, 0xB7FE, 0xB969, + 0xB841, 0xD1D0, 0xB842, 0xD1D1, 0xB843, 0xD1D2, 0xB844, 0xD1D3, 0xB845, 0xD1D4, 0xB846, 0xD1D5, 0xB847, 0xD1D6, 0xB848, 0xD1D7, + 0xB849, 0xD1D9, 0xB84A, 0xD1DA, 0xB84B, 0xD1DB, 0xB84C, 0xD1DC, 0xB84D, 0xD1DD, 0xB84E, 0xD1DE, 0xB84F, 0xD1DF, 0xB850, 0xD1E0, + 0xB851, 0xD1E1, 0xB852, 0xD1E2, 0xB853, 0xD1E3, 0xB854, 0xD1E4, 0xB855, 0xD1E5, 0xB856, 0xD1E6, 0xB857, 0xD1E7, 0xB858, 0xD1E8, + 0xB859, 0xD1E9, 0xB85A, 0xD1EA, 0xB861, 0xD1EB, 0xB862, 0xD1EC, 0xB863, 0xD1ED, 0xB864, 0xD1EE, 0xB865, 0xD1EF, 0xB866, 0xD1F0, + 0xB867, 0xD1F1, 0xB868, 0xD1F2, 0xB869, 0xD1F3, 0xB86A, 0xD1F5, 0xB86B, 0xD1F6, 0xB86C, 0xD1F7, 0xB86D, 0xD1F9, 0xB86E, 0xD1FA, + 0xB86F, 0xD1FB, 0xB870, 0xD1FC, 0xB871, 0xD1FD, 0xB872, 0xD1FE, 0xB873, 0xD1FF, 0xB874, 0xD200, 0xB875, 0xD201, 0xB876, 0xD202, + 0xB877, 0xD203, 0xB878, 0xD204, 0xB879, 0xD205, 0xB87A, 0xD206, 0xB881, 0xD208, 0xB882, 0xD20A, 0xB883, 0xD20B, 0xB884, 0xD20C, + 0xB885, 0xD20D, 0xB886, 0xD20E, 0xB887, 0xD20F, 0xB888, 0xD211, 0xB889, 0xD212, 0xB88A, 0xD213, 0xB88B, 0xD214, 0xB88C, 0xD215, + 0xB88D, 0xD216, 0xB88E, 0xD217, 0xB88F, 0xD218, 0xB890, 0xD219, 0xB891, 0xD21A, 0xB892, 0xD21B, 0xB893, 0xD21C, 0xB894, 0xD21D, + 0xB895, 0xD21E, 0xB896, 0xD21F, 0xB897, 0xD220, 0xB898, 0xD221, 0xB899, 0xD222, 0xB89A, 0xD223, 0xB89B, 0xD224, 0xB89C, 0xD225, + 0xB89D, 0xD226, 0xB89E, 0xD227, 0xB89F, 0xD228, 0xB8A0, 0xD229, 0xB8A1, 0xB96B, 0xB8A2, 0xB96D, 0xB8A3, 0xB974, 0xB8A4, 0xB975, + 0xB8A5, 0xB978, 0xB8A6, 0xB97C, 0xB8A7, 0xB984, 0xB8A8, 0xB985, 0xB8A9, 0xB987, 0xB8AA, 0xB989, 0xB8AB, 0xB98A, 0xB8AC, 0xB98D, + 0xB8AD, 0xB98E, 0xB8AE, 0xB9AC, 0xB8AF, 0xB9AD, 0xB8B0, 0xB9B0, 0xB8B1, 0xB9B4, 0xB8B2, 0xB9BC, 0xB8B3, 0xB9BD, 0xB8B4, 0xB9BF, + 0xB8B5, 0xB9C1, 0xB8B6, 0xB9C8, 0xB8B7, 0xB9C9, 0xB8B8, 0xB9CC, 0xB8B9, 0xB9CE, 0xB8BA, 0xB9CF, 0xB8BB, 0xB9D0, 0xB8BC, 0xB9D1, + 0xB8BD, 0xB9D2, 0xB8BE, 0xB9D8, 0xB8BF, 0xB9D9, 0xB8C0, 0xB9DB, 0xB8C1, 0xB9DD, 0xB8C2, 0xB9DE, 0xB8C3, 0xB9E1, 0xB8C4, 0xB9E3, + 0xB8C5, 0xB9E4, 0xB8C6, 0xB9E5, 0xB8C7, 0xB9E8, 0xB8C8, 0xB9EC, 0xB8C9, 0xB9F4, 0xB8CA, 0xB9F5, 0xB8CB, 0xB9F7, 0xB8CC, 0xB9F8, + 0xB8CD, 0xB9F9, 0xB8CE, 0xB9FA, 0xB8CF, 0xBA00, 0xB8D0, 0xBA01, 0xB8D1, 0xBA08, 0xB8D2, 0xBA15, 0xB8D3, 0xBA38, 0xB8D4, 0xBA39, + 0xB8D5, 0xBA3C, 0xB8D6, 0xBA40, 0xB8D7, 0xBA42, 0xB8D8, 0xBA48, 0xB8D9, 0xBA49, 0xB8DA, 0xBA4B, 0xB8DB, 0xBA4D, 0xB8DC, 0xBA4E, + 0xB8DD, 0xBA53, 0xB8DE, 0xBA54, 0xB8DF, 0xBA55, 0xB8E0, 0xBA58, 0xB8E1, 0xBA5C, 0xB8E2, 0xBA64, 0xB8E3, 0xBA65, 0xB8E4, 0xBA67, + 0xB8E5, 0xBA68, 0xB8E6, 0xBA69, 0xB8E7, 0xBA70, 0xB8E8, 0xBA71, 0xB8E9, 0xBA74, 0xB8EA, 0xBA78, 0xB8EB, 0xBA83, 0xB8EC, 0xBA84, + 0xB8ED, 0xBA85, 0xB8EE, 0xBA87, 0xB8EF, 0xBA8C, 0xB8F0, 0xBAA8, 0xB8F1, 0xBAA9, 0xB8F2, 0xBAAB, 0xB8F3, 0xBAAC, 0xB8F4, 0xBAB0, + 0xB8F5, 0xBAB2, 0xB8F6, 0xBAB8, 0xB8F7, 0xBAB9, 0xB8F8, 0xBABB, 0xB8F9, 0xBABD, 0xB8FA, 0xBAC4, 0xB8FB, 0xBAC8, 0xB8FC, 0xBAD8, + 0xB8FD, 0xBAD9, 0xB8FE, 0xBAFC, 0xB941, 0xD22A, 0xB942, 0xD22B, 0xB943, 0xD22E, 0xB944, 0xD22F, 0xB945, 0xD231, 0xB946, 0xD232, + 0xB947, 0xD233, 0xB948, 0xD235, 0xB949, 0xD236, 0xB94A, 0xD237, 0xB94B, 0xD238, 0xB94C, 0xD239, 0xB94D, 0xD23A, 0xB94E, 0xD23B, + 0xB94F, 0xD23E, 0xB950, 0xD240, 0xB951, 0xD242, 0xB952, 0xD243, 0xB953, 0xD244, 0xB954, 0xD245, 0xB955, 0xD246, 0xB956, 0xD247, + 0xB957, 0xD249, 0xB958, 0xD24A, 0xB959, 0xD24B, 0xB95A, 0xD24C, 0xB961, 0xD24D, 0xB962, 0xD24E, 0xB963, 0xD24F, 0xB964, 0xD250, + 0xB965, 0xD251, 0xB966, 0xD252, 0xB967, 0xD253, 0xB968, 0xD254, 0xB969, 0xD255, 0xB96A, 0xD256, 0xB96B, 0xD257, 0xB96C, 0xD258, + 0xB96D, 0xD259, 0xB96E, 0xD25A, 0xB96F, 0xD25B, 0xB970, 0xD25D, 0xB971, 0xD25E, 0xB972, 0xD25F, 0xB973, 0xD260, 0xB974, 0xD261, + 0xB975, 0xD262, 0xB976, 0xD263, 0xB977, 0xD265, 0xB978, 0xD266, 0xB979, 0xD267, 0xB97A, 0xD268, 0xB981, 0xD269, 0xB982, 0xD26A, + 0xB983, 0xD26B, 0xB984, 0xD26C, 0xB985, 0xD26D, 0xB986, 0xD26E, 0xB987, 0xD26F, 0xB988, 0xD270, 0xB989, 0xD271, 0xB98A, 0xD272, + 0xB98B, 0xD273, 0xB98C, 0xD274, 0xB98D, 0xD275, 0xB98E, 0xD276, 0xB98F, 0xD277, 0xB990, 0xD278, 0xB991, 0xD279, 0xB992, 0xD27A, + 0xB993, 0xD27B, 0xB994, 0xD27C, 0xB995, 0xD27D, 0xB996, 0xD27E, 0xB997, 0xD27F, 0xB998, 0xD282, 0xB999, 0xD283, 0xB99A, 0xD285, + 0xB99B, 0xD286, 0xB99C, 0xD287, 0xB99D, 0xD289, 0xB99E, 0xD28A, 0xB99F, 0xD28B, 0xB9A0, 0xD28C, 0xB9A1, 0xBB00, 0xB9A2, 0xBB04, + 0xB9A3, 0xBB0D, 0xB9A4, 0xBB0F, 0xB9A5, 0xBB11, 0xB9A6, 0xBB18, 0xB9A7, 0xBB1C, 0xB9A8, 0xBB20, 0xB9A9, 0xBB29, 0xB9AA, 0xBB2B, + 0xB9AB, 0xBB34, 0xB9AC, 0xBB35, 0xB9AD, 0xBB36, 0xB9AE, 0xBB38, 0xB9AF, 0xBB3B, 0xB9B0, 0xBB3C, 0xB9B1, 0xBB3D, 0xB9B2, 0xBB3E, + 0xB9B3, 0xBB44, 0xB9B4, 0xBB45, 0xB9B5, 0xBB47, 0xB9B6, 0xBB49, 0xB9B7, 0xBB4D, 0xB9B8, 0xBB4F, 0xB9B9, 0xBB50, 0xB9BA, 0xBB54, + 0xB9BB, 0xBB58, 0xB9BC, 0xBB61, 0xB9BD, 0xBB63, 0xB9BE, 0xBB6C, 0xB9BF, 0xBB88, 0xB9C0, 0xBB8C, 0xB9C1, 0xBB90, 0xB9C2, 0xBBA4, + 0xB9C3, 0xBBA8, 0xB9C4, 0xBBAC, 0xB9C5, 0xBBB4, 0xB9C6, 0xBBB7, 0xB9C7, 0xBBC0, 0xB9C8, 0xBBC4, 0xB9C9, 0xBBC8, 0xB9CA, 0xBBD0, + 0xB9CB, 0xBBD3, 0xB9CC, 0xBBF8, 0xB9CD, 0xBBF9, 0xB9CE, 0xBBFC, 0xB9CF, 0xBBFF, 0xB9D0, 0xBC00, 0xB9D1, 0xBC02, 0xB9D2, 0xBC08, + 0xB9D3, 0xBC09, 0xB9D4, 0xBC0B, 0xB9D5, 0xBC0C, 0xB9D6, 0xBC0D, 0xB9D7, 0xBC0F, 0xB9D8, 0xBC11, 0xB9D9, 0xBC14, 0xB9DA, 0xBC15, + 0xB9DB, 0xBC16, 0xB9DC, 0xBC17, 0xB9DD, 0xBC18, 0xB9DE, 0xBC1B, 0xB9DF, 0xBC1C, 0xB9E0, 0xBC1D, 0xB9E1, 0xBC1E, 0xB9E2, 0xBC1F, + 0xB9E3, 0xBC24, 0xB9E4, 0xBC25, 0xB9E5, 0xBC27, 0xB9E6, 0xBC29, 0xB9E7, 0xBC2D, 0xB9E8, 0xBC30, 0xB9E9, 0xBC31, 0xB9EA, 0xBC34, + 0xB9EB, 0xBC38, 0xB9EC, 0xBC40, 0xB9ED, 0xBC41, 0xB9EE, 0xBC43, 0xB9EF, 0xBC44, 0xB9F0, 0xBC45, 0xB9F1, 0xBC49, 0xB9F2, 0xBC4C, + 0xB9F3, 0xBC4D, 0xB9F4, 0xBC50, 0xB9F5, 0xBC5D, 0xB9F6, 0xBC84, 0xB9F7, 0xBC85, 0xB9F8, 0xBC88, 0xB9F9, 0xBC8B, 0xB9FA, 0xBC8C, + 0xB9FB, 0xBC8E, 0xB9FC, 0xBC94, 0xB9FD, 0xBC95, 0xB9FE, 0xBC97, 0xBA41, 0xD28D, 0xBA42, 0xD28E, 0xBA43, 0xD28F, 0xBA44, 0xD292, + 0xBA45, 0xD293, 0xBA46, 0xD294, 0xBA47, 0xD296, 0xBA48, 0xD297, 0xBA49, 0xD298, 0xBA4A, 0xD299, 0xBA4B, 0xD29A, 0xBA4C, 0xD29B, + 0xBA4D, 0xD29D, 0xBA4E, 0xD29E, 0xBA4F, 0xD29F, 0xBA50, 0xD2A1, 0xBA51, 0xD2A2, 0xBA52, 0xD2A3, 0xBA53, 0xD2A5, 0xBA54, 0xD2A6, + 0xBA55, 0xD2A7, 0xBA56, 0xD2A8, 0xBA57, 0xD2A9, 0xBA58, 0xD2AA, 0xBA59, 0xD2AB, 0xBA5A, 0xD2AD, 0xBA61, 0xD2AE, 0xBA62, 0xD2AF, + 0xBA63, 0xD2B0, 0xBA64, 0xD2B2, 0xBA65, 0xD2B3, 0xBA66, 0xD2B4, 0xBA67, 0xD2B5, 0xBA68, 0xD2B6, 0xBA69, 0xD2B7, 0xBA6A, 0xD2BA, + 0xBA6B, 0xD2BB, 0xBA6C, 0xD2BD, 0xBA6D, 0xD2BE, 0xBA6E, 0xD2C1, 0xBA6F, 0xD2C3, 0xBA70, 0xD2C4, 0xBA71, 0xD2C5, 0xBA72, 0xD2C6, + 0xBA73, 0xD2C7, 0xBA74, 0xD2CA, 0xBA75, 0xD2CC, 0xBA76, 0xD2CD, 0xBA77, 0xD2CE, 0xBA78, 0xD2CF, 0xBA79, 0xD2D0, 0xBA7A, 0xD2D1, + 0xBA81, 0xD2D2, 0xBA82, 0xD2D3, 0xBA83, 0xD2D5, 0xBA84, 0xD2D6, 0xBA85, 0xD2D7, 0xBA86, 0xD2D9, 0xBA87, 0xD2DA, 0xBA88, 0xD2DB, + 0xBA89, 0xD2DD, 0xBA8A, 0xD2DE, 0xBA8B, 0xD2DF, 0xBA8C, 0xD2E0, 0xBA8D, 0xD2E1, 0xBA8E, 0xD2E2, 0xBA8F, 0xD2E3, 0xBA90, 0xD2E6, + 0xBA91, 0xD2E7, 0xBA92, 0xD2E8, 0xBA93, 0xD2E9, 0xBA94, 0xD2EA, 0xBA95, 0xD2EB, 0xBA96, 0xD2EC, 0xBA97, 0xD2ED, 0xBA98, 0xD2EE, + 0xBA99, 0xD2EF, 0xBA9A, 0xD2F2, 0xBA9B, 0xD2F3, 0xBA9C, 0xD2F5, 0xBA9D, 0xD2F6, 0xBA9E, 0xD2F7, 0xBA9F, 0xD2F9, 0xBAA0, 0xD2FA, + 0xBAA1, 0xBC99, 0xBAA2, 0xBC9A, 0xBAA3, 0xBCA0, 0xBAA4, 0xBCA1, 0xBAA5, 0xBCA4, 0xBAA6, 0xBCA7, 0xBAA7, 0xBCA8, 0xBAA8, 0xBCB0, + 0xBAA9, 0xBCB1, 0xBAAA, 0xBCB3, 0xBAAB, 0xBCB4, 0xBAAC, 0xBCB5, 0xBAAD, 0xBCBC, 0xBAAE, 0xBCBD, 0xBAAF, 0xBCC0, 0xBAB0, 0xBCC4, + 0xBAB1, 0xBCCD, 0xBAB2, 0xBCCF, 0xBAB3, 0xBCD0, 0xBAB4, 0xBCD1, 0xBAB5, 0xBCD5, 0xBAB6, 0xBCD8, 0xBAB7, 0xBCDC, 0xBAB8, 0xBCF4, + 0xBAB9, 0xBCF5, 0xBABA, 0xBCF6, 0xBABB, 0xBCF8, 0xBABC, 0xBCFC, 0xBABD, 0xBD04, 0xBABE, 0xBD05, 0xBABF, 0xBD07, 0xBAC0, 0xBD09, + 0xBAC1, 0xBD10, 0xBAC2, 0xBD14, 0xBAC3, 0xBD24, 0xBAC4, 0xBD2C, 0xBAC5, 0xBD40, 0xBAC6, 0xBD48, 0xBAC7, 0xBD49, 0xBAC8, 0xBD4C, + 0xBAC9, 0xBD50, 0xBACA, 0xBD58, 0xBACB, 0xBD59, 0xBACC, 0xBD64, 0xBACD, 0xBD68, 0xBACE, 0xBD80, 0xBACF, 0xBD81, 0xBAD0, 0xBD84, + 0xBAD1, 0xBD87, 0xBAD2, 0xBD88, 0xBAD3, 0xBD89, 0xBAD4, 0xBD8A, 0xBAD5, 0xBD90, 0xBAD6, 0xBD91, 0xBAD7, 0xBD93, 0xBAD8, 0xBD95, + 0xBAD9, 0xBD99, 0xBADA, 0xBD9A, 0xBADB, 0xBD9C, 0xBADC, 0xBDA4, 0xBADD, 0xBDB0, 0xBADE, 0xBDB8, 0xBADF, 0xBDD4, 0xBAE0, 0xBDD5, + 0xBAE1, 0xBDD8, 0xBAE2, 0xBDDC, 0xBAE3, 0xBDE9, 0xBAE4, 0xBDF0, 0xBAE5, 0xBDF4, 0xBAE6, 0xBDF8, 0xBAE7, 0xBE00, 0xBAE8, 0xBE03, + 0xBAE9, 0xBE05, 0xBAEA, 0xBE0C, 0xBAEB, 0xBE0D, 0xBAEC, 0xBE10, 0xBAED, 0xBE14, 0xBAEE, 0xBE1C, 0xBAEF, 0xBE1D, 0xBAF0, 0xBE1F, + 0xBAF1, 0xBE44, 0xBAF2, 0xBE45, 0xBAF3, 0xBE48, 0xBAF4, 0xBE4C, 0xBAF5, 0xBE4E, 0xBAF6, 0xBE54, 0xBAF7, 0xBE55, 0xBAF8, 0xBE57, + 0xBAF9, 0xBE59, 0xBAFA, 0xBE5A, 0xBAFB, 0xBE5B, 0xBAFC, 0xBE60, 0xBAFD, 0xBE61, 0xBAFE, 0xBE64, 0xBB41, 0xD2FB, 0xBB42, 0xD2FC, + 0xBB43, 0xD2FD, 0xBB44, 0xD2FE, 0xBB45, 0xD2FF, 0xBB46, 0xD302, 0xBB47, 0xD304, 0xBB48, 0xD306, 0xBB49, 0xD307, 0xBB4A, 0xD308, + 0xBB4B, 0xD309, 0xBB4C, 0xD30A, 0xBB4D, 0xD30B, 0xBB4E, 0xD30F, 0xBB4F, 0xD311, 0xBB50, 0xD312, 0xBB51, 0xD313, 0xBB52, 0xD315, + 0xBB53, 0xD317, 0xBB54, 0xD318, 0xBB55, 0xD319, 0xBB56, 0xD31A, 0xBB57, 0xD31B, 0xBB58, 0xD31E, 0xBB59, 0xD322, 0xBB5A, 0xD323, + 0xBB61, 0xD324, 0xBB62, 0xD326, 0xBB63, 0xD327, 0xBB64, 0xD32A, 0xBB65, 0xD32B, 0xBB66, 0xD32D, 0xBB67, 0xD32E, 0xBB68, 0xD32F, + 0xBB69, 0xD331, 0xBB6A, 0xD332, 0xBB6B, 0xD333, 0xBB6C, 0xD334, 0xBB6D, 0xD335, 0xBB6E, 0xD336, 0xBB6F, 0xD337, 0xBB70, 0xD33A, + 0xBB71, 0xD33E, 0xBB72, 0xD33F, 0xBB73, 0xD340, 0xBB74, 0xD341, 0xBB75, 0xD342, 0xBB76, 0xD343, 0xBB77, 0xD346, 0xBB78, 0xD347, + 0xBB79, 0xD348, 0xBB7A, 0xD349, 0xBB81, 0xD34A, 0xBB82, 0xD34B, 0xBB83, 0xD34C, 0xBB84, 0xD34D, 0xBB85, 0xD34E, 0xBB86, 0xD34F, + 0xBB87, 0xD350, 0xBB88, 0xD351, 0xBB89, 0xD352, 0xBB8A, 0xD353, 0xBB8B, 0xD354, 0xBB8C, 0xD355, 0xBB8D, 0xD356, 0xBB8E, 0xD357, + 0xBB8F, 0xD358, 0xBB90, 0xD359, 0xBB91, 0xD35A, 0xBB92, 0xD35B, 0xBB93, 0xD35C, 0xBB94, 0xD35D, 0xBB95, 0xD35E, 0xBB96, 0xD35F, + 0xBB97, 0xD360, 0xBB98, 0xD361, 0xBB99, 0xD362, 0xBB9A, 0xD363, 0xBB9B, 0xD364, 0xBB9C, 0xD365, 0xBB9D, 0xD366, 0xBB9E, 0xD367, + 0xBB9F, 0xD368, 0xBBA0, 0xD369, 0xBBA1, 0xBE68, 0xBBA2, 0xBE6A, 0xBBA3, 0xBE70, 0xBBA4, 0xBE71, 0xBBA5, 0xBE73, 0xBBA6, 0xBE74, + 0xBBA7, 0xBE75, 0xBBA8, 0xBE7B, 0xBBA9, 0xBE7C, 0xBBAA, 0xBE7D, 0xBBAB, 0xBE80, 0xBBAC, 0xBE84, 0xBBAD, 0xBE8C, 0xBBAE, 0xBE8D, + 0xBBAF, 0xBE8F, 0xBBB0, 0xBE90, 0xBBB1, 0xBE91, 0xBBB2, 0xBE98, 0xBBB3, 0xBE99, 0xBBB4, 0xBEA8, 0xBBB5, 0xBED0, 0xBBB6, 0xBED1, + 0xBBB7, 0xBED4, 0xBBB8, 0xBED7, 0xBBB9, 0xBED8, 0xBBBA, 0xBEE0, 0xBBBB, 0xBEE3, 0xBBBC, 0xBEE4, 0xBBBD, 0xBEE5, 0xBBBE, 0xBEEC, + 0xBBBF, 0xBF01, 0xBBC0, 0xBF08, 0xBBC1, 0xBF09, 0xBBC2, 0xBF18, 0xBBC3, 0xBF19, 0xBBC4, 0xBF1B, 0xBBC5, 0xBF1C, 0xBBC6, 0xBF1D, + 0xBBC7, 0xBF40, 0xBBC8, 0xBF41, 0xBBC9, 0xBF44, 0xBBCA, 0xBF48, 0xBBCB, 0xBF50, 0xBBCC, 0xBF51, 0xBBCD, 0xBF55, 0xBBCE, 0xBF94, + 0xBBCF, 0xBFB0, 0xBBD0, 0xBFC5, 0xBBD1, 0xBFCC, 0xBBD2, 0xBFCD, 0xBBD3, 0xBFD0, 0xBBD4, 0xBFD4, 0xBBD5, 0xBFDC, 0xBBD6, 0xBFDF, + 0xBBD7, 0xBFE1, 0xBBD8, 0xC03C, 0xBBD9, 0xC051, 0xBBDA, 0xC058, 0xBBDB, 0xC05C, 0xBBDC, 0xC060, 0xBBDD, 0xC068, 0xBBDE, 0xC069, + 0xBBDF, 0xC090, 0xBBE0, 0xC091, 0xBBE1, 0xC094, 0xBBE2, 0xC098, 0xBBE3, 0xC0A0, 0xBBE4, 0xC0A1, 0xBBE5, 0xC0A3, 0xBBE6, 0xC0A5, + 0xBBE7, 0xC0AC, 0xBBE8, 0xC0AD, 0xBBE9, 0xC0AF, 0xBBEA, 0xC0B0, 0xBBEB, 0xC0B3, 0xBBEC, 0xC0B4, 0xBBED, 0xC0B5, 0xBBEE, 0xC0B6, + 0xBBEF, 0xC0BC, 0xBBF0, 0xC0BD, 0xBBF1, 0xC0BF, 0xBBF2, 0xC0C0, 0xBBF3, 0xC0C1, 0xBBF4, 0xC0C5, 0xBBF5, 0xC0C8, 0xBBF6, 0xC0C9, + 0xBBF7, 0xC0CC, 0xBBF8, 0xC0D0, 0xBBF9, 0xC0D8, 0xBBFA, 0xC0D9, 0xBBFB, 0xC0DB, 0xBBFC, 0xC0DC, 0xBBFD, 0xC0DD, 0xBBFE, 0xC0E4, + 0xBC41, 0xD36A, 0xBC42, 0xD36B, 0xBC43, 0xD36C, 0xBC44, 0xD36D, 0xBC45, 0xD36E, 0xBC46, 0xD36F, 0xBC47, 0xD370, 0xBC48, 0xD371, + 0xBC49, 0xD372, 0xBC4A, 0xD373, 0xBC4B, 0xD374, 0xBC4C, 0xD375, 0xBC4D, 0xD376, 0xBC4E, 0xD377, 0xBC4F, 0xD378, 0xBC50, 0xD379, + 0xBC51, 0xD37A, 0xBC52, 0xD37B, 0xBC53, 0xD37E, 0xBC54, 0xD37F, 0xBC55, 0xD381, 0xBC56, 0xD382, 0xBC57, 0xD383, 0xBC58, 0xD385, + 0xBC59, 0xD386, 0xBC5A, 0xD387, 0xBC61, 0xD388, 0xBC62, 0xD389, 0xBC63, 0xD38A, 0xBC64, 0xD38B, 0xBC65, 0xD38E, 0xBC66, 0xD392, + 0xBC67, 0xD393, 0xBC68, 0xD394, 0xBC69, 0xD395, 0xBC6A, 0xD396, 0xBC6B, 0xD397, 0xBC6C, 0xD39A, 0xBC6D, 0xD39B, 0xBC6E, 0xD39D, + 0xBC6F, 0xD39E, 0xBC70, 0xD39F, 0xBC71, 0xD3A1, 0xBC72, 0xD3A2, 0xBC73, 0xD3A3, 0xBC74, 0xD3A4, 0xBC75, 0xD3A5, 0xBC76, 0xD3A6, + 0xBC77, 0xD3A7, 0xBC78, 0xD3AA, 0xBC79, 0xD3AC, 0xBC7A, 0xD3AE, 0xBC81, 0xD3AF, 0xBC82, 0xD3B0, 0xBC83, 0xD3B1, 0xBC84, 0xD3B2, + 0xBC85, 0xD3B3, 0xBC86, 0xD3B5, 0xBC87, 0xD3B6, 0xBC88, 0xD3B7, 0xBC89, 0xD3B9, 0xBC8A, 0xD3BA, 0xBC8B, 0xD3BB, 0xBC8C, 0xD3BD, + 0xBC8D, 0xD3BE, 0xBC8E, 0xD3BF, 0xBC8F, 0xD3C0, 0xBC90, 0xD3C1, 0xBC91, 0xD3C2, 0xBC92, 0xD3C3, 0xBC93, 0xD3C6, 0xBC94, 0xD3C7, + 0xBC95, 0xD3CA, 0xBC96, 0xD3CB, 0xBC97, 0xD3CC, 0xBC98, 0xD3CD, 0xBC99, 0xD3CE, 0xBC9A, 0xD3CF, 0xBC9B, 0xD3D1, 0xBC9C, 0xD3D2, + 0xBC9D, 0xD3D3, 0xBC9E, 0xD3D4, 0xBC9F, 0xD3D5, 0xBCA0, 0xD3D6, 0xBCA1, 0xC0E5, 0xBCA2, 0xC0E8, 0xBCA3, 0xC0EC, 0xBCA4, 0xC0F4, + 0xBCA5, 0xC0F5, 0xBCA6, 0xC0F7, 0xBCA7, 0xC0F9, 0xBCA8, 0xC100, 0xBCA9, 0xC104, 0xBCAA, 0xC108, 0xBCAB, 0xC110, 0xBCAC, 0xC115, + 0xBCAD, 0xC11C, 0xBCAE, 0xC11D, 0xBCAF, 0xC11E, 0xBCB0, 0xC11F, 0xBCB1, 0xC120, 0xBCB2, 0xC123, 0xBCB3, 0xC124, 0xBCB4, 0xC126, + 0xBCB5, 0xC127, 0xBCB6, 0xC12C, 0xBCB7, 0xC12D, 0xBCB8, 0xC12F, 0xBCB9, 0xC130, 0xBCBA, 0xC131, 0xBCBB, 0xC136, 0xBCBC, 0xC138, + 0xBCBD, 0xC139, 0xBCBE, 0xC13C, 0xBCBF, 0xC140, 0xBCC0, 0xC148, 0xBCC1, 0xC149, 0xBCC2, 0xC14B, 0xBCC3, 0xC14C, 0xBCC4, 0xC14D, + 0xBCC5, 0xC154, 0xBCC6, 0xC155, 0xBCC7, 0xC158, 0xBCC8, 0xC15C, 0xBCC9, 0xC164, 0xBCCA, 0xC165, 0xBCCB, 0xC167, 0xBCCC, 0xC168, + 0xBCCD, 0xC169, 0xBCCE, 0xC170, 0xBCCF, 0xC174, 0xBCD0, 0xC178, 0xBCD1, 0xC185, 0xBCD2, 0xC18C, 0xBCD3, 0xC18D, 0xBCD4, 0xC18E, + 0xBCD5, 0xC190, 0xBCD6, 0xC194, 0xBCD7, 0xC196, 0xBCD8, 0xC19C, 0xBCD9, 0xC19D, 0xBCDA, 0xC19F, 0xBCDB, 0xC1A1, 0xBCDC, 0xC1A5, + 0xBCDD, 0xC1A8, 0xBCDE, 0xC1A9, 0xBCDF, 0xC1AC, 0xBCE0, 0xC1B0, 0xBCE1, 0xC1BD, 0xBCE2, 0xC1C4, 0xBCE3, 0xC1C8, 0xBCE4, 0xC1CC, + 0xBCE5, 0xC1D4, 0xBCE6, 0xC1D7, 0xBCE7, 0xC1D8, 0xBCE8, 0xC1E0, 0xBCE9, 0xC1E4, 0xBCEA, 0xC1E8, 0xBCEB, 0xC1F0, 0xBCEC, 0xC1F1, + 0xBCED, 0xC1F3, 0xBCEE, 0xC1FC, 0xBCEF, 0xC1FD, 0xBCF0, 0xC200, 0xBCF1, 0xC204, 0xBCF2, 0xC20C, 0xBCF3, 0xC20D, 0xBCF4, 0xC20F, + 0xBCF5, 0xC211, 0xBCF6, 0xC218, 0xBCF7, 0xC219, 0xBCF8, 0xC21C, 0xBCF9, 0xC21F, 0xBCFA, 0xC220, 0xBCFB, 0xC228, 0xBCFC, 0xC229, + 0xBCFD, 0xC22B, 0xBCFE, 0xC22D, 0xBD41, 0xD3D7, 0xBD42, 0xD3D9, 0xBD43, 0xD3DA, 0xBD44, 0xD3DB, 0xBD45, 0xD3DC, 0xBD46, 0xD3DD, + 0xBD47, 0xD3DE, 0xBD48, 0xD3DF, 0xBD49, 0xD3E0, 0xBD4A, 0xD3E2, 0xBD4B, 0xD3E4, 0xBD4C, 0xD3E5, 0xBD4D, 0xD3E6, 0xBD4E, 0xD3E7, + 0xBD4F, 0xD3E8, 0xBD50, 0xD3E9, 0xBD51, 0xD3EA, 0xBD52, 0xD3EB, 0xBD53, 0xD3EE, 0xBD54, 0xD3EF, 0xBD55, 0xD3F1, 0xBD56, 0xD3F2, + 0xBD57, 0xD3F3, 0xBD58, 0xD3F5, 0xBD59, 0xD3F6, 0xBD5A, 0xD3F7, 0xBD61, 0xD3F8, 0xBD62, 0xD3F9, 0xBD63, 0xD3FA, 0xBD64, 0xD3FB, + 0xBD65, 0xD3FE, 0xBD66, 0xD400, 0xBD67, 0xD402, 0xBD68, 0xD403, 0xBD69, 0xD404, 0xBD6A, 0xD405, 0xBD6B, 0xD406, 0xBD6C, 0xD407, + 0xBD6D, 0xD409, 0xBD6E, 0xD40A, 0xBD6F, 0xD40B, 0xBD70, 0xD40C, 0xBD71, 0xD40D, 0xBD72, 0xD40E, 0xBD73, 0xD40F, 0xBD74, 0xD410, + 0xBD75, 0xD411, 0xBD76, 0xD412, 0xBD77, 0xD413, 0xBD78, 0xD414, 0xBD79, 0xD415, 0xBD7A, 0xD416, 0xBD81, 0xD417, 0xBD82, 0xD418, + 0xBD83, 0xD419, 0xBD84, 0xD41A, 0xBD85, 0xD41B, 0xBD86, 0xD41C, 0xBD87, 0xD41E, 0xBD88, 0xD41F, 0xBD89, 0xD420, 0xBD8A, 0xD421, + 0xBD8B, 0xD422, 0xBD8C, 0xD423, 0xBD8D, 0xD424, 0xBD8E, 0xD425, 0xBD8F, 0xD426, 0xBD90, 0xD427, 0xBD91, 0xD428, 0xBD92, 0xD429, + 0xBD93, 0xD42A, 0xBD94, 0xD42B, 0xBD95, 0xD42C, 0xBD96, 0xD42D, 0xBD97, 0xD42E, 0xBD98, 0xD42F, 0xBD99, 0xD430, 0xBD9A, 0xD431, + 0xBD9B, 0xD432, 0xBD9C, 0xD433, 0xBD9D, 0xD434, 0xBD9E, 0xD435, 0xBD9F, 0xD436, 0xBDA0, 0xD437, 0xBDA1, 0xC22F, 0xBDA2, 0xC231, + 0xBDA3, 0xC232, 0xBDA4, 0xC234, 0xBDA5, 0xC248, 0xBDA6, 0xC250, 0xBDA7, 0xC251, 0xBDA8, 0xC254, 0xBDA9, 0xC258, 0xBDAA, 0xC260, + 0xBDAB, 0xC265, 0xBDAC, 0xC26C, 0xBDAD, 0xC26D, 0xBDAE, 0xC270, 0xBDAF, 0xC274, 0xBDB0, 0xC27C, 0xBDB1, 0xC27D, 0xBDB2, 0xC27F, + 0xBDB3, 0xC281, 0xBDB4, 0xC288, 0xBDB5, 0xC289, 0xBDB6, 0xC290, 0xBDB7, 0xC298, 0xBDB8, 0xC29B, 0xBDB9, 0xC29D, 0xBDBA, 0xC2A4, + 0xBDBB, 0xC2A5, 0xBDBC, 0xC2A8, 0xBDBD, 0xC2AC, 0xBDBE, 0xC2AD, 0xBDBF, 0xC2B4, 0xBDC0, 0xC2B5, 0xBDC1, 0xC2B7, 0xBDC2, 0xC2B9, + 0xBDC3, 0xC2DC, 0xBDC4, 0xC2DD, 0xBDC5, 0xC2E0, 0xBDC6, 0xC2E3, 0xBDC7, 0xC2E4, 0xBDC8, 0xC2EB, 0xBDC9, 0xC2EC, 0xBDCA, 0xC2ED, + 0xBDCB, 0xC2EF, 0xBDCC, 0xC2F1, 0xBDCD, 0xC2F6, 0xBDCE, 0xC2F8, 0xBDCF, 0xC2F9, 0xBDD0, 0xC2FB, 0xBDD1, 0xC2FC, 0xBDD2, 0xC300, + 0xBDD3, 0xC308, 0xBDD4, 0xC309, 0xBDD5, 0xC30C, 0xBDD6, 0xC30D, 0xBDD7, 0xC313, 0xBDD8, 0xC314, 0xBDD9, 0xC315, 0xBDDA, 0xC318, + 0xBDDB, 0xC31C, 0xBDDC, 0xC324, 0xBDDD, 0xC325, 0xBDDE, 0xC328, 0xBDDF, 0xC329, 0xBDE0, 0xC345, 0xBDE1, 0xC368, 0xBDE2, 0xC369, + 0xBDE3, 0xC36C, 0xBDE4, 0xC370, 0xBDE5, 0xC372, 0xBDE6, 0xC378, 0xBDE7, 0xC379, 0xBDE8, 0xC37C, 0xBDE9, 0xC37D, 0xBDEA, 0xC384, + 0xBDEB, 0xC388, 0xBDEC, 0xC38C, 0xBDED, 0xC3C0, 0xBDEE, 0xC3D8, 0xBDEF, 0xC3D9, 0xBDF0, 0xC3DC, 0xBDF1, 0xC3DF, 0xBDF2, 0xC3E0, + 0xBDF3, 0xC3E2, 0xBDF4, 0xC3E8, 0xBDF5, 0xC3E9, 0xBDF6, 0xC3ED, 0xBDF7, 0xC3F4, 0xBDF8, 0xC3F5, 0xBDF9, 0xC3F8, 0xBDFA, 0xC408, + 0xBDFB, 0xC410, 0xBDFC, 0xC424, 0xBDFD, 0xC42C, 0xBDFE, 0xC430, 0xBE41, 0xD438, 0xBE42, 0xD439, 0xBE43, 0xD43A, 0xBE44, 0xD43B, + 0xBE45, 0xD43C, 0xBE46, 0xD43D, 0xBE47, 0xD43E, 0xBE48, 0xD43F, 0xBE49, 0xD441, 0xBE4A, 0xD442, 0xBE4B, 0xD443, 0xBE4C, 0xD445, + 0xBE4D, 0xD446, 0xBE4E, 0xD447, 0xBE4F, 0xD448, 0xBE50, 0xD449, 0xBE51, 0xD44A, 0xBE52, 0xD44B, 0xBE53, 0xD44C, 0xBE54, 0xD44D, + 0xBE55, 0xD44E, 0xBE56, 0xD44F, 0xBE57, 0xD450, 0xBE58, 0xD451, 0xBE59, 0xD452, 0xBE5A, 0xD453, 0xBE61, 0xD454, 0xBE62, 0xD455, + 0xBE63, 0xD456, 0xBE64, 0xD457, 0xBE65, 0xD458, 0xBE66, 0xD459, 0xBE67, 0xD45A, 0xBE68, 0xD45B, 0xBE69, 0xD45D, 0xBE6A, 0xD45E, + 0xBE6B, 0xD45F, 0xBE6C, 0xD461, 0xBE6D, 0xD462, 0xBE6E, 0xD463, 0xBE6F, 0xD465, 0xBE70, 0xD466, 0xBE71, 0xD467, 0xBE72, 0xD468, + 0xBE73, 0xD469, 0xBE74, 0xD46A, 0xBE75, 0xD46B, 0xBE76, 0xD46C, 0xBE77, 0xD46E, 0xBE78, 0xD470, 0xBE79, 0xD471, 0xBE7A, 0xD472, + 0xBE81, 0xD473, 0xBE82, 0xD474, 0xBE83, 0xD475, 0xBE84, 0xD476, 0xBE85, 0xD477, 0xBE86, 0xD47A, 0xBE87, 0xD47B, 0xBE88, 0xD47D, + 0xBE89, 0xD47E, 0xBE8A, 0xD481, 0xBE8B, 0xD483, 0xBE8C, 0xD484, 0xBE8D, 0xD485, 0xBE8E, 0xD486, 0xBE8F, 0xD487, 0xBE90, 0xD48A, + 0xBE91, 0xD48C, 0xBE92, 0xD48E, 0xBE93, 0xD48F, 0xBE94, 0xD490, 0xBE95, 0xD491, 0xBE96, 0xD492, 0xBE97, 0xD493, 0xBE98, 0xD495, + 0xBE99, 0xD496, 0xBE9A, 0xD497, 0xBE9B, 0xD498, 0xBE9C, 0xD499, 0xBE9D, 0xD49A, 0xBE9E, 0xD49B, 0xBE9F, 0xD49C, 0xBEA0, 0xD49D, + 0xBEA1, 0xC434, 0xBEA2, 0xC43C, 0xBEA3, 0xC43D, 0xBEA4, 0xC448, 0xBEA5, 0xC464, 0xBEA6, 0xC465, 0xBEA7, 0xC468, 0xBEA8, 0xC46C, + 0xBEA9, 0xC474, 0xBEAA, 0xC475, 0xBEAB, 0xC479, 0xBEAC, 0xC480, 0xBEAD, 0xC494, 0xBEAE, 0xC49C, 0xBEAF, 0xC4B8, 0xBEB0, 0xC4BC, + 0xBEB1, 0xC4E9, 0xBEB2, 0xC4F0, 0xBEB3, 0xC4F1, 0xBEB4, 0xC4F4, 0xBEB5, 0xC4F8, 0xBEB6, 0xC4FA, 0xBEB7, 0xC4FF, 0xBEB8, 0xC500, + 0xBEB9, 0xC501, 0xBEBA, 0xC50C, 0xBEBB, 0xC510, 0xBEBC, 0xC514, 0xBEBD, 0xC51C, 0xBEBE, 0xC528, 0xBEBF, 0xC529, 0xBEC0, 0xC52C, + 0xBEC1, 0xC530, 0xBEC2, 0xC538, 0xBEC3, 0xC539, 0xBEC4, 0xC53B, 0xBEC5, 0xC53D, 0xBEC6, 0xC544, 0xBEC7, 0xC545, 0xBEC8, 0xC548, + 0xBEC9, 0xC549, 0xBECA, 0xC54A, 0xBECB, 0xC54C, 0xBECC, 0xC54D, 0xBECD, 0xC54E, 0xBECE, 0xC553, 0xBECF, 0xC554, 0xBED0, 0xC555, + 0xBED1, 0xC557, 0xBED2, 0xC558, 0xBED3, 0xC559, 0xBED4, 0xC55D, 0xBED5, 0xC55E, 0xBED6, 0xC560, 0xBED7, 0xC561, 0xBED8, 0xC564, + 0xBED9, 0xC568, 0xBEDA, 0xC570, 0xBEDB, 0xC571, 0xBEDC, 0xC573, 0xBEDD, 0xC574, 0xBEDE, 0xC575, 0xBEDF, 0xC57C, 0xBEE0, 0xC57D, + 0xBEE1, 0xC580, 0xBEE2, 0xC584, 0xBEE3, 0xC587, 0xBEE4, 0xC58C, 0xBEE5, 0xC58D, 0xBEE6, 0xC58F, 0xBEE7, 0xC591, 0xBEE8, 0xC595, + 0xBEE9, 0xC597, 0xBEEA, 0xC598, 0xBEEB, 0xC59C, 0xBEEC, 0xC5A0, 0xBEED, 0xC5A9, 0xBEEE, 0xC5B4, 0xBEEF, 0xC5B5, 0xBEF0, 0xC5B8, + 0xBEF1, 0xC5B9, 0xBEF2, 0xC5BB, 0xBEF3, 0xC5BC, 0xBEF4, 0xC5BD, 0xBEF5, 0xC5BE, 0xBEF6, 0xC5C4, 0xBEF7, 0xC5C5, 0xBEF8, 0xC5C6, + 0xBEF9, 0xC5C7, 0xBEFA, 0xC5C8, 0xBEFB, 0xC5C9, 0xBEFC, 0xC5CA, 0xBEFD, 0xC5CC, 0xBEFE, 0xC5CE, 0xBF41, 0xD49E, 0xBF42, 0xD49F, + 0xBF43, 0xD4A0, 0xBF44, 0xD4A1, 0xBF45, 0xD4A2, 0xBF46, 0xD4A3, 0xBF47, 0xD4A4, 0xBF48, 0xD4A5, 0xBF49, 0xD4A6, 0xBF4A, 0xD4A7, + 0xBF4B, 0xD4A8, 0xBF4C, 0xD4AA, 0xBF4D, 0xD4AB, 0xBF4E, 0xD4AC, 0xBF4F, 0xD4AD, 0xBF50, 0xD4AE, 0xBF51, 0xD4AF, 0xBF52, 0xD4B0, + 0xBF53, 0xD4B1, 0xBF54, 0xD4B2, 0xBF55, 0xD4B3, 0xBF56, 0xD4B4, 0xBF57, 0xD4B5, 0xBF58, 0xD4B6, 0xBF59, 0xD4B7, 0xBF5A, 0xD4B8, + 0xBF61, 0xD4B9, 0xBF62, 0xD4BA, 0xBF63, 0xD4BB, 0xBF64, 0xD4BC, 0xBF65, 0xD4BD, 0xBF66, 0xD4BE, 0xBF67, 0xD4BF, 0xBF68, 0xD4C0, + 0xBF69, 0xD4C1, 0xBF6A, 0xD4C2, 0xBF6B, 0xD4C3, 0xBF6C, 0xD4C4, 0xBF6D, 0xD4C5, 0xBF6E, 0xD4C6, 0xBF6F, 0xD4C7, 0xBF70, 0xD4C8, + 0xBF71, 0xD4C9, 0xBF72, 0xD4CA, 0xBF73, 0xD4CB, 0xBF74, 0xD4CD, 0xBF75, 0xD4CE, 0xBF76, 0xD4CF, 0xBF77, 0xD4D1, 0xBF78, 0xD4D2, + 0xBF79, 0xD4D3, 0xBF7A, 0xD4D5, 0xBF81, 0xD4D6, 0xBF82, 0xD4D7, 0xBF83, 0xD4D8, 0xBF84, 0xD4D9, 0xBF85, 0xD4DA, 0xBF86, 0xD4DB, + 0xBF87, 0xD4DD, 0xBF88, 0xD4DE, 0xBF89, 0xD4E0, 0xBF8A, 0xD4E1, 0xBF8B, 0xD4E2, 0xBF8C, 0xD4E3, 0xBF8D, 0xD4E4, 0xBF8E, 0xD4E5, + 0xBF8F, 0xD4E6, 0xBF90, 0xD4E7, 0xBF91, 0xD4E9, 0xBF92, 0xD4EA, 0xBF93, 0xD4EB, 0xBF94, 0xD4ED, 0xBF95, 0xD4EE, 0xBF96, 0xD4EF, + 0xBF97, 0xD4F1, 0xBF98, 0xD4F2, 0xBF99, 0xD4F3, 0xBF9A, 0xD4F4, 0xBF9B, 0xD4F5, 0xBF9C, 0xD4F6, 0xBF9D, 0xD4F7, 0xBF9E, 0xD4F9, + 0xBF9F, 0xD4FA, 0xBFA0, 0xD4FC, 0xBFA1, 0xC5D0, 0xBFA2, 0xC5D1, 0xBFA3, 0xC5D4, 0xBFA4, 0xC5D8, 0xBFA5, 0xC5E0, 0xBFA6, 0xC5E1, + 0xBFA7, 0xC5E3, 0xBFA8, 0xC5E5, 0xBFA9, 0xC5EC, 0xBFAA, 0xC5ED, 0xBFAB, 0xC5EE, 0xBFAC, 0xC5F0, 0xBFAD, 0xC5F4, 0xBFAE, 0xC5F6, + 0xBFAF, 0xC5F7, 0xBFB0, 0xC5FC, 0xBFB1, 0xC5FD, 0xBFB2, 0xC5FE, 0xBFB3, 0xC5FF, 0xBFB4, 0xC600, 0xBFB5, 0xC601, 0xBFB6, 0xC605, + 0xBFB7, 0xC606, 0xBFB8, 0xC607, 0xBFB9, 0xC608, 0xBFBA, 0xC60C, 0xBFBB, 0xC610, 0xBFBC, 0xC618, 0xBFBD, 0xC619, 0xBFBE, 0xC61B, + 0xBFBF, 0xC61C, 0xBFC0, 0xC624, 0xBFC1, 0xC625, 0xBFC2, 0xC628, 0xBFC3, 0xC62C, 0xBFC4, 0xC62D, 0xBFC5, 0xC62E, 0xBFC6, 0xC630, + 0xBFC7, 0xC633, 0xBFC8, 0xC634, 0xBFC9, 0xC635, 0xBFCA, 0xC637, 0xBFCB, 0xC639, 0xBFCC, 0xC63B, 0xBFCD, 0xC640, 0xBFCE, 0xC641, + 0xBFCF, 0xC644, 0xBFD0, 0xC648, 0xBFD1, 0xC650, 0xBFD2, 0xC651, 0xBFD3, 0xC653, 0xBFD4, 0xC654, 0xBFD5, 0xC655, 0xBFD6, 0xC65C, + 0xBFD7, 0xC65D, 0xBFD8, 0xC660, 0xBFD9, 0xC66C, 0xBFDA, 0xC66F, 0xBFDB, 0xC671, 0xBFDC, 0xC678, 0xBFDD, 0xC679, 0xBFDE, 0xC67C, + 0xBFDF, 0xC680, 0xBFE0, 0xC688, 0xBFE1, 0xC689, 0xBFE2, 0xC68B, 0xBFE3, 0xC68D, 0xBFE4, 0xC694, 0xBFE5, 0xC695, 0xBFE6, 0xC698, + 0xBFE7, 0xC69C, 0xBFE8, 0xC6A4, 0xBFE9, 0xC6A5, 0xBFEA, 0xC6A7, 0xBFEB, 0xC6A9, 0xBFEC, 0xC6B0, 0xBFED, 0xC6B1, 0xBFEE, 0xC6B4, + 0xBFEF, 0xC6B8, 0xBFF0, 0xC6B9, 0xBFF1, 0xC6BA, 0xBFF2, 0xC6C0, 0xBFF3, 0xC6C1, 0xBFF4, 0xC6C3, 0xBFF5, 0xC6C5, 0xBFF6, 0xC6CC, + 0xBFF7, 0xC6CD, 0xBFF8, 0xC6D0, 0xBFF9, 0xC6D4, 0xBFFA, 0xC6DC, 0xBFFB, 0xC6DD, 0xBFFC, 0xC6E0, 0xBFFD, 0xC6E1, 0xBFFE, 0xC6E8, + 0xC041, 0xD4FE, 0xC042, 0xD4FF, 0xC043, 0xD500, 0xC044, 0xD501, 0xC045, 0xD502, 0xC046, 0xD503, 0xC047, 0xD505, 0xC048, 0xD506, + 0xC049, 0xD507, 0xC04A, 0xD509, 0xC04B, 0xD50A, 0xC04C, 0xD50B, 0xC04D, 0xD50D, 0xC04E, 0xD50E, 0xC04F, 0xD50F, 0xC050, 0xD510, + 0xC051, 0xD511, 0xC052, 0xD512, 0xC053, 0xD513, 0xC054, 0xD516, 0xC055, 0xD518, 0xC056, 0xD519, 0xC057, 0xD51A, 0xC058, 0xD51B, + 0xC059, 0xD51C, 0xC05A, 0xD51D, 0xC061, 0xD51E, 0xC062, 0xD51F, 0xC063, 0xD520, 0xC064, 0xD521, 0xC065, 0xD522, 0xC066, 0xD523, + 0xC067, 0xD524, 0xC068, 0xD525, 0xC069, 0xD526, 0xC06A, 0xD527, 0xC06B, 0xD528, 0xC06C, 0xD529, 0xC06D, 0xD52A, 0xC06E, 0xD52B, + 0xC06F, 0xD52C, 0xC070, 0xD52D, 0xC071, 0xD52E, 0xC072, 0xD52F, 0xC073, 0xD530, 0xC074, 0xD531, 0xC075, 0xD532, 0xC076, 0xD533, + 0xC077, 0xD534, 0xC078, 0xD535, 0xC079, 0xD536, 0xC07A, 0xD537, 0xC081, 0xD538, 0xC082, 0xD539, 0xC083, 0xD53A, 0xC084, 0xD53B, + 0xC085, 0xD53E, 0xC086, 0xD53F, 0xC087, 0xD541, 0xC088, 0xD542, 0xC089, 0xD543, 0xC08A, 0xD545, 0xC08B, 0xD546, 0xC08C, 0xD547, + 0xC08D, 0xD548, 0xC08E, 0xD549, 0xC08F, 0xD54A, 0xC090, 0xD54B, 0xC091, 0xD54E, 0xC092, 0xD550, 0xC093, 0xD552, 0xC094, 0xD553, + 0xC095, 0xD554, 0xC096, 0xD555, 0xC097, 0xD556, 0xC098, 0xD557, 0xC099, 0xD55A, 0xC09A, 0xD55B, 0xC09B, 0xD55D, 0xC09C, 0xD55E, + 0xC09D, 0xD55F, 0xC09E, 0xD561, 0xC09F, 0xD562, 0xC0A0, 0xD563, 0xC0A1, 0xC6E9, 0xC0A2, 0xC6EC, 0xC0A3, 0xC6F0, 0xC0A4, 0xC6F8, + 0xC0A5, 0xC6F9, 0xC0A6, 0xC6FD, 0xC0A7, 0xC704, 0xC0A8, 0xC705, 0xC0A9, 0xC708, 0xC0AA, 0xC70C, 0xC0AB, 0xC714, 0xC0AC, 0xC715, + 0xC0AD, 0xC717, 0xC0AE, 0xC719, 0xC0AF, 0xC720, 0xC0B0, 0xC721, 0xC0B1, 0xC724, 0xC0B2, 0xC728, 0xC0B3, 0xC730, 0xC0B4, 0xC731, + 0xC0B5, 0xC733, 0xC0B6, 0xC735, 0xC0B7, 0xC737, 0xC0B8, 0xC73C, 0xC0B9, 0xC73D, 0xC0BA, 0xC740, 0xC0BB, 0xC744, 0xC0BC, 0xC74A, + 0xC0BD, 0xC74C, 0xC0BE, 0xC74D, 0xC0BF, 0xC74F, 0xC0C0, 0xC751, 0xC0C1, 0xC752, 0xC0C2, 0xC753, 0xC0C3, 0xC754, 0xC0C4, 0xC755, + 0xC0C5, 0xC756, 0xC0C6, 0xC757, 0xC0C7, 0xC758, 0xC0C8, 0xC75C, 0xC0C9, 0xC760, 0xC0CA, 0xC768, 0xC0CB, 0xC76B, 0xC0CC, 0xC774, + 0xC0CD, 0xC775, 0xC0CE, 0xC778, 0xC0CF, 0xC77C, 0xC0D0, 0xC77D, 0xC0D1, 0xC77E, 0xC0D2, 0xC783, 0xC0D3, 0xC784, 0xC0D4, 0xC785, + 0xC0D5, 0xC787, 0xC0D6, 0xC788, 0xC0D7, 0xC789, 0xC0D8, 0xC78A, 0xC0D9, 0xC78E, 0xC0DA, 0xC790, 0xC0DB, 0xC791, 0xC0DC, 0xC794, + 0xC0DD, 0xC796, 0xC0DE, 0xC797, 0xC0DF, 0xC798, 0xC0E0, 0xC79A, 0xC0E1, 0xC7A0, 0xC0E2, 0xC7A1, 0xC0E3, 0xC7A3, 0xC0E4, 0xC7A4, + 0xC0E5, 0xC7A5, 0xC0E6, 0xC7A6, 0xC0E7, 0xC7AC, 0xC0E8, 0xC7AD, 0xC0E9, 0xC7B0, 0xC0EA, 0xC7B4, 0xC0EB, 0xC7BC, 0xC0EC, 0xC7BD, + 0xC0ED, 0xC7BF, 0xC0EE, 0xC7C0, 0xC0EF, 0xC7C1, 0xC0F0, 0xC7C8, 0xC0F1, 0xC7C9, 0xC0F2, 0xC7CC, 0xC0F3, 0xC7CE, 0xC0F4, 0xC7D0, + 0xC0F5, 0xC7D8, 0xC0F6, 0xC7DD, 0xC0F7, 0xC7E4, 0xC0F8, 0xC7E8, 0xC0F9, 0xC7EC, 0xC0FA, 0xC800, 0xC0FB, 0xC801, 0xC0FC, 0xC804, + 0xC0FD, 0xC808, 0xC0FE, 0xC80A, 0xC141, 0xD564, 0xC142, 0xD566, 0xC143, 0xD567, 0xC144, 0xD56A, 0xC145, 0xD56C, 0xC146, 0xD56E, + 0xC147, 0xD56F, 0xC148, 0xD570, 0xC149, 0xD571, 0xC14A, 0xD572, 0xC14B, 0xD573, 0xC14C, 0xD576, 0xC14D, 0xD577, 0xC14E, 0xD579, + 0xC14F, 0xD57A, 0xC150, 0xD57B, 0xC151, 0xD57D, 0xC152, 0xD57E, 0xC153, 0xD57F, 0xC154, 0xD580, 0xC155, 0xD581, 0xC156, 0xD582, + 0xC157, 0xD583, 0xC158, 0xD586, 0xC159, 0xD58A, 0xC15A, 0xD58B, 0xC161, 0xD58C, 0xC162, 0xD58D, 0xC163, 0xD58E, 0xC164, 0xD58F, + 0xC165, 0xD591, 0xC166, 0xD592, 0xC167, 0xD593, 0xC168, 0xD594, 0xC169, 0xD595, 0xC16A, 0xD596, 0xC16B, 0xD597, 0xC16C, 0xD598, + 0xC16D, 0xD599, 0xC16E, 0xD59A, 0xC16F, 0xD59B, 0xC170, 0xD59C, 0xC171, 0xD59D, 0xC172, 0xD59E, 0xC173, 0xD59F, 0xC174, 0xD5A0, + 0xC175, 0xD5A1, 0xC176, 0xD5A2, 0xC177, 0xD5A3, 0xC178, 0xD5A4, 0xC179, 0xD5A6, 0xC17A, 0xD5A7, 0xC181, 0xD5A8, 0xC182, 0xD5A9, + 0xC183, 0xD5AA, 0xC184, 0xD5AB, 0xC185, 0xD5AC, 0xC186, 0xD5AD, 0xC187, 0xD5AE, 0xC188, 0xD5AF, 0xC189, 0xD5B0, 0xC18A, 0xD5B1, + 0xC18B, 0xD5B2, 0xC18C, 0xD5B3, 0xC18D, 0xD5B4, 0xC18E, 0xD5B5, 0xC18F, 0xD5B6, 0xC190, 0xD5B7, 0xC191, 0xD5B8, 0xC192, 0xD5B9, + 0xC193, 0xD5BA, 0xC194, 0xD5BB, 0xC195, 0xD5BC, 0xC196, 0xD5BD, 0xC197, 0xD5BE, 0xC198, 0xD5BF, 0xC199, 0xD5C0, 0xC19A, 0xD5C1, + 0xC19B, 0xD5C2, 0xC19C, 0xD5C3, 0xC19D, 0xD5C4, 0xC19E, 0xD5C5, 0xC19F, 0xD5C6, 0xC1A0, 0xD5C7, 0xC1A1, 0xC810, 0xC1A2, 0xC811, + 0xC1A3, 0xC813, 0xC1A4, 0xC815, 0xC1A5, 0xC816, 0xC1A6, 0xC81C, 0xC1A7, 0xC81D, 0xC1A8, 0xC820, 0xC1A9, 0xC824, 0xC1AA, 0xC82C, + 0xC1AB, 0xC82D, 0xC1AC, 0xC82F, 0xC1AD, 0xC831, 0xC1AE, 0xC838, 0xC1AF, 0xC83C, 0xC1B0, 0xC840, 0xC1B1, 0xC848, 0xC1B2, 0xC849, + 0xC1B3, 0xC84C, 0xC1B4, 0xC84D, 0xC1B5, 0xC854, 0xC1B6, 0xC870, 0xC1B7, 0xC871, 0xC1B8, 0xC874, 0xC1B9, 0xC878, 0xC1BA, 0xC87A, + 0xC1BB, 0xC880, 0xC1BC, 0xC881, 0xC1BD, 0xC883, 0xC1BE, 0xC885, 0xC1BF, 0xC886, 0xC1C0, 0xC887, 0xC1C1, 0xC88B, 0xC1C2, 0xC88C, + 0xC1C3, 0xC88D, 0xC1C4, 0xC894, 0xC1C5, 0xC89D, 0xC1C6, 0xC89F, 0xC1C7, 0xC8A1, 0xC1C8, 0xC8A8, 0xC1C9, 0xC8BC, 0xC1CA, 0xC8BD, + 0xC1CB, 0xC8C4, 0xC1CC, 0xC8C8, 0xC1CD, 0xC8CC, 0xC1CE, 0xC8D4, 0xC1CF, 0xC8D5, 0xC1D0, 0xC8D7, 0xC1D1, 0xC8D9, 0xC1D2, 0xC8E0, + 0xC1D3, 0xC8E1, 0xC1D4, 0xC8E4, 0xC1D5, 0xC8F5, 0xC1D6, 0xC8FC, 0xC1D7, 0xC8FD, 0xC1D8, 0xC900, 0xC1D9, 0xC904, 0xC1DA, 0xC905, + 0xC1DB, 0xC906, 0xC1DC, 0xC90C, 0xC1DD, 0xC90D, 0xC1DE, 0xC90F, 0xC1DF, 0xC911, 0xC1E0, 0xC918, 0xC1E1, 0xC92C, 0xC1E2, 0xC934, + 0xC1E3, 0xC950, 0xC1E4, 0xC951, 0xC1E5, 0xC954, 0xC1E6, 0xC958, 0xC1E7, 0xC960, 0xC1E8, 0xC961, 0xC1E9, 0xC963, 0xC1EA, 0xC96C, + 0xC1EB, 0xC970, 0xC1EC, 0xC974, 0xC1ED, 0xC97C, 0xC1EE, 0xC988, 0xC1EF, 0xC989, 0xC1F0, 0xC98C, 0xC1F1, 0xC990, 0xC1F2, 0xC998, + 0xC1F3, 0xC999, 0xC1F4, 0xC99B, 0xC1F5, 0xC99D, 0xC1F6, 0xC9C0, 0xC1F7, 0xC9C1, 0xC1F8, 0xC9C4, 0xC1F9, 0xC9C7, 0xC1FA, 0xC9C8, + 0xC1FB, 0xC9CA, 0xC1FC, 0xC9D0, 0xC1FD, 0xC9D1, 0xC1FE, 0xC9D3, 0xC241, 0xD5CA, 0xC242, 0xD5CB, 0xC243, 0xD5CD, 0xC244, 0xD5CE, + 0xC245, 0xD5CF, 0xC246, 0xD5D1, 0xC247, 0xD5D3, 0xC248, 0xD5D4, 0xC249, 0xD5D5, 0xC24A, 0xD5D6, 0xC24B, 0xD5D7, 0xC24C, 0xD5DA, + 0xC24D, 0xD5DC, 0xC24E, 0xD5DE, 0xC24F, 0xD5DF, 0xC250, 0xD5E0, 0xC251, 0xD5E1, 0xC252, 0xD5E2, 0xC253, 0xD5E3, 0xC254, 0xD5E6, + 0xC255, 0xD5E7, 0xC256, 0xD5E9, 0xC257, 0xD5EA, 0xC258, 0xD5EB, 0xC259, 0xD5ED, 0xC25A, 0xD5EE, 0xC261, 0xD5EF, 0xC262, 0xD5F0, + 0xC263, 0xD5F1, 0xC264, 0xD5F2, 0xC265, 0xD5F3, 0xC266, 0xD5F6, 0xC267, 0xD5F8, 0xC268, 0xD5FA, 0xC269, 0xD5FB, 0xC26A, 0xD5FC, + 0xC26B, 0xD5FD, 0xC26C, 0xD5FE, 0xC26D, 0xD5FF, 0xC26E, 0xD602, 0xC26F, 0xD603, 0xC270, 0xD605, 0xC271, 0xD606, 0xC272, 0xD607, + 0xC273, 0xD609, 0xC274, 0xD60A, 0xC275, 0xD60B, 0xC276, 0xD60C, 0xC277, 0xD60D, 0xC278, 0xD60E, 0xC279, 0xD60F, 0xC27A, 0xD612, + 0xC281, 0xD616, 0xC282, 0xD617, 0xC283, 0xD618, 0xC284, 0xD619, 0xC285, 0xD61A, 0xC286, 0xD61B, 0xC287, 0xD61D, 0xC288, 0xD61E, + 0xC289, 0xD61F, 0xC28A, 0xD621, 0xC28B, 0xD622, 0xC28C, 0xD623, 0xC28D, 0xD625, 0xC28E, 0xD626, 0xC28F, 0xD627, 0xC290, 0xD628, + 0xC291, 0xD629, 0xC292, 0xD62A, 0xC293, 0xD62B, 0xC294, 0xD62C, 0xC295, 0xD62E, 0xC296, 0xD62F, 0xC297, 0xD630, 0xC298, 0xD631, + 0xC299, 0xD632, 0xC29A, 0xD633, 0xC29B, 0xD634, 0xC29C, 0xD635, 0xC29D, 0xD636, 0xC29E, 0xD637, 0xC29F, 0xD63A, 0xC2A0, 0xD63B, + 0xC2A1, 0xC9D5, 0xC2A2, 0xC9D6, 0xC2A3, 0xC9D9, 0xC2A4, 0xC9DA, 0xC2A5, 0xC9DC, 0xC2A6, 0xC9DD, 0xC2A7, 0xC9E0, 0xC2A8, 0xC9E2, + 0xC2A9, 0xC9E4, 0xC2AA, 0xC9E7, 0xC2AB, 0xC9EC, 0xC2AC, 0xC9ED, 0xC2AD, 0xC9EF, 0xC2AE, 0xC9F0, 0xC2AF, 0xC9F1, 0xC2B0, 0xC9F8, + 0xC2B1, 0xC9F9, 0xC2B2, 0xC9FC, 0xC2B3, 0xCA00, 0xC2B4, 0xCA08, 0xC2B5, 0xCA09, 0xC2B6, 0xCA0B, 0xC2B7, 0xCA0C, 0xC2B8, 0xCA0D, + 0xC2B9, 0xCA14, 0xC2BA, 0xCA18, 0xC2BB, 0xCA29, 0xC2BC, 0xCA4C, 0xC2BD, 0xCA4D, 0xC2BE, 0xCA50, 0xC2BF, 0xCA54, 0xC2C0, 0xCA5C, + 0xC2C1, 0xCA5D, 0xC2C2, 0xCA5F, 0xC2C3, 0xCA60, 0xC2C4, 0xCA61, 0xC2C5, 0xCA68, 0xC2C6, 0xCA7D, 0xC2C7, 0xCA84, 0xC2C8, 0xCA98, + 0xC2C9, 0xCABC, 0xC2CA, 0xCABD, 0xC2CB, 0xCAC0, 0xC2CC, 0xCAC4, 0xC2CD, 0xCACC, 0xC2CE, 0xCACD, 0xC2CF, 0xCACF, 0xC2D0, 0xCAD1, + 0xC2D1, 0xCAD3, 0xC2D2, 0xCAD8, 0xC2D3, 0xCAD9, 0xC2D4, 0xCAE0, 0xC2D5, 0xCAEC, 0xC2D6, 0xCAF4, 0xC2D7, 0xCB08, 0xC2D8, 0xCB10, + 0xC2D9, 0xCB14, 0xC2DA, 0xCB18, 0xC2DB, 0xCB20, 0xC2DC, 0xCB21, 0xC2DD, 0xCB41, 0xC2DE, 0xCB48, 0xC2DF, 0xCB49, 0xC2E0, 0xCB4C, + 0xC2E1, 0xCB50, 0xC2E2, 0xCB58, 0xC2E3, 0xCB59, 0xC2E4, 0xCB5D, 0xC2E5, 0xCB64, 0xC2E6, 0xCB78, 0xC2E7, 0xCB79, 0xC2E8, 0xCB9C, + 0xC2E9, 0xCBB8, 0xC2EA, 0xCBD4, 0xC2EB, 0xCBE4, 0xC2EC, 0xCBE7, 0xC2ED, 0xCBE9, 0xC2EE, 0xCC0C, 0xC2EF, 0xCC0D, 0xC2F0, 0xCC10, + 0xC2F1, 0xCC14, 0xC2F2, 0xCC1C, 0xC2F3, 0xCC1D, 0xC2F4, 0xCC21, 0xC2F5, 0xCC22, 0xC2F6, 0xCC27, 0xC2F7, 0xCC28, 0xC2F8, 0xCC29, + 0xC2F9, 0xCC2C, 0xC2FA, 0xCC2E, 0xC2FB, 0xCC30, 0xC2FC, 0xCC38, 0xC2FD, 0xCC39, 0xC2FE, 0xCC3B, 0xC341, 0xD63D, 0xC342, 0xD63E, + 0xC343, 0xD63F, 0xC344, 0xD641, 0xC345, 0xD642, 0xC346, 0xD643, 0xC347, 0xD644, 0xC348, 0xD646, 0xC349, 0xD647, 0xC34A, 0xD64A, + 0xC34B, 0xD64C, 0xC34C, 0xD64E, 0xC34D, 0xD64F, 0xC34E, 0xD650, 0xC34F, 0xD652, 0xC350, 0xD653, 0xC351, 0xD656, 0xC352, 0xD657, + 0xC353, 0xD659, 0xC354, 0xD65A, 0xC355, 0xD65B, 0xC356, 0xD65D, 0xC357, 0xD65E, 0xC358, 0xD65F, 0xC359, 0xD660, 0xC35A, 0xD661, + 0xC361, 0xD662, 0xC362, 0xD663, 0xC363, 0xD664, 0xC364, 0xD665, 0xC365, 0xD666, 0xC366, 0xD668, 0xC367, 0xD66A, 0xC368, 0xD66B, + 0xC369, 0xD66C, 0xC36A, 0xD66D, 0xC36B, 0xD66E, 0xC36C, 0xD66F, 0xC36D, 0xD672, 0xC36E, 0xD673, 0xC36F, 0xD675, 0xC370, 0xD676, + 0xC371, 0xD677, 0xC372, 0xD678, 0xC373, 0xD679, 0xC374, 0xD67A, 0xC375, 0xD67B, 0xC376, 0xD67C, 0xC377, 0xD67D, 0xC378, 0xD67E, + 0xC379, 0xD67F, 0xC37A, 0xD680, 0xC381, 0xD681, 0xC382, 0xD682, 0xC383, 0xD684, 0xC384, 0xD686, 0xC385, 0xD687, 0xC386, 0xD688, + 0xC387, 0xD689, 0xC388, 0xD68A, 0xC389, 0xD68B, 0xC38A, 0xD68E, 0xC38B, 0xD68F, 0xC38C, 0xD691, 0xC38D, 0xD692, 0xC38E, 0xD693, + 0xC38F, 0xD695, 0xC390, 0xD696, 0xC391, 0xD697, 0xC392, 0xD698, 0xC393, 0xD699, 0xC394, 0xD69A, 0xC395, 0xD69B, 0xC396, 0xD69C, + 0xC397, 0xD69E, 0xC398, 0xD6A0, 0xC399, 0xD6A2, 0xC39A, 0xD6A3, 0xC39B, 0xD6A4, 0xC39C, 0xD6A5, 0xC39D, 0xD6A6, 0xC39E, 0xD6A7, + 0xC39F, 0xD6A9, 0xC3A0, 0xD6AA, 0xC3A1, 0xCC3C, 0xC3A2, 0xCC3D, 0xC3A3, 0xCC3E, 0xC3A4, 0xCC44, 0xC3A5, 0xCC45, 0xC3A6, 0xCC48, + 0xC3A7, 0xCC4C, 0xC3A8, 0xCC54, 0xC3A9, 0xCC55, 0xC3AA, 0xCC57, 0xC3AB, 0xCC58, 0xC3AC, 0xCC59, 0xC3AD, 0xCC60, 0xC3AE, 0xCC64, + 0xC3AF, 0xCC66, 0xC3B0, 0xCC68, 0xC3B1, 0xCC70, 0xC3B2, 0xCC75, 0xC3B3, 0xCC98, 0xC3B4, 0xCC99, 0xC3B5, 0xCC9C, 0xC3B6, 0xCCA0, + 0xC3B7, 0xCCA8, 0xC3B8, 0xCCA9, 0xC3B9, 0xCCAB, 0xC3BA, 0xCCAC, 0xC3BB, 0xCCAD, 0xC3BC, 0xCCB4, 0xC3BD, 0xCCB5, 0xC3BE, 0xCCB8, + 0xC3BF, 0xCCBC, 0xC3C0, 0xCCC4, 0xC3C1, 0xCCC5, 0xC3C2, 0xCCC7, 0xC3C3, 0xCCC9, 0xC3C4, 0xCCD0, 0xC3C5, 0xCCD4, 0xC3C6, 0xCCE4, + 0xC3C7, 0xCCEC, 0xC3C8, 0xCCF0, 0xC3C9, 0xCD01, 0xC3CA, 0xCD08, 0xC3CB, 0xCD09, 0xC3CC, 0xCD0C, 0xC3CD, 0xCD10, 0xC3CE, 0xCD18, + 0xC3CF, 0xCD19, 0xC3D0, 0xCD1B, 0xC3D1, 0xCD1D, 0xC3D2, 0xCD24, 0xC3D3, 0xCD28, 0xC3D4, 0xCD2C, 0xC3D5, 0xCD39, 0xC3D6, 0xCD5C, + 0xC3D7, 0xCD60, 0xC3D8, 0xCD64, 0xC3D9, 0xCD6C, 0xC3DA, 0xCD6D, 0xC3DB, 0xCD6F, 0xC3DC, 0xCD71, 0xC3DD, 0xCD78, 0xC3DE, 0xCD88, + 0xC3DF, 0xCD94, 0xC3E0, 0xCD95, 0xC3E1, 0xCD98, 0xC3E2, 0xCD9C, 0xC3E3, 0xCDA4, 0xC3E4, 0xCDA5, 0xC3E5, 0xCDA7, 0xC3E6, 0xCDA9, + 0xC3E7, 0xCDB0, 0xC3E8, 0xCDC4, 0xC3E9, 0xCDCC, 0xC3EA, 0xCDD0, 0xC3EB, 0xCDE8, 0xC3EC, 0xCDEC, 0xC3ED, 0xCDF0, 0xC3EE, 0xCDF8, + 0xC3EF, 0xCDF9, 0xC3F0, 0xCDFB, 0xC3F1, 0xCDFD, 0xC3F2, 0xCE04, 0xC3F3, 0xCE08, 0xC3F4, 0xCE0C, 0xC3F5, 0xCE14, 0xC3F6, 0xCE19, + 0xC3F7, 0xCE20, 0xC3F8, 0xCE21, 0xC3F9, 0xCE24, 0xC3FA, 0xCE28, 0xC3FB, 0xCE30, 0xC3FC, 0xCE31, 0xC3FD, 0xCE33, 0xC3FE, 0xCE35, + 0xC441, 0xD6AB, 0xC442, 0xD6AD, 0xC443, 0xD6AE, 0xC444, 0xD6AF, 0xC445, 0xD6B1, 0xC446, 0xD6B2, 0xC447, 0xD6B3, 0xC448, 0xD6B4, + 0xC449, 0xD6B5, 0xC44A, 0xD6B6, 0xC44B, 0xD6B7, 0xC44C, 0xD6B8, 0xC44D, 0xD6BA, 0xC44E, 0xD6BC, 0xC44F, 0xD6BD, 0xC450, 0xD6BE, + 0xC451, 0xD6BF, 0xC452, 0xD6C0, 0xC453, 0xD6C1, 0xC454, 0xD6C2, 0xC455, 0xD6C3, 0xC456, 0xD6C6, 0xC457, 0xD6C7, 0xC458, 0xD6C9, + 0xC459, 0xD6CA, 0xC45A, 0xD6CB, 0xC461, 0xD6CD, 0xC462, 0xD6CE, 0xC463, 0xD6CF, 0xC464, 0xD6D0, 0xC465, 0xD6D2, 0xC466, 0xD6D3, + 0xC467, 0xD6D5, 0xC468, 0xD6D6, 0xC469, 0xD6D8, 0xC46A, 0xD6DA, 0xC46B, 0xD6DB, 0xC46C, 0xD6DC, 0xC46D, 0xD6DD, 0xC46E, 0xD6DE, + 0xC46F, 0xD6DF, 0xC470, 0xD6E1, 0xC471, 0xD6E2, 0xC472, 0xD6E3, 0xC473, 0xD6E5, 0xC474, 0xD6E6, 0xC475, 0xD6E7, 0xC476, 0xD6E9, + 0xC477, 0xD6EA, 0xC478, 0xD6EB, 0xC479, 0xD6EC, 0xC47A, 0xD6ED, 0xC481, 0xD6EE, 0xC482, 0xD6EF, 0xC483, 0xD6F1, 0xC484, 0xD6F2, + 0xC485, 0xD6F3, 0xC486, 0xD6F4, 0xC487, 0xD6F6, 0xC488, 0xD6F7, 0xC489, 0xD6F8, 0xC48A, 0xD6F9, 0xC48B, 0xD6FA, 0xC48C, 0xD6FB, + 0xC48D, 0xD6FE, 0xC48E, 0xD6FF, 0xC48F, 0xD701, 0xC490, 0xD702, 0xC491, 0xD703, 0xC492, 0xD705, 0xC493, 0xD706, 0xC494, 0xD707, + 0xC495, 0xD708, 0xC496, 0xD709, 0xC497, 0xD70A, 0xC498, 0xD70B, 0xC499, 0xD70C, 0xC49A, 0xD70D, 0xC49B, 0xD70E, 0xC49C, 0xD70F, + 0xC49D, 0xD710, 0xC49E, 0xD712, 0xC49F, 0xD713, 0xC4A0, 0xD714, 0xC4A1, 0xCE58, 0xC4A2, 0xCE59, 0xC4A3, 0xCE5C, 0xC4A4, 0xCE5F, + 0xC4A5, 0xCE60, 0xC4A6, 0xCE61, 0xC4A7, 0xCE68, 0xC4A8, 0xCE69, 0xC4A9, 0xCE6B, 0xC4AA, 0xCE6D, 0xC4AB, 0xCE74, 0xC4AC, 0xCE75, + 0xC4AD, 0xCE78, 0xC4AE, 0xCE7C, 0xC4AF, 0xCE84, 0xC4B0, 0xCE85, 0xC4B1, 0xCE87, 0xC4B2, 0xCE89, 0xC4B3, 0xCE90, 0xC4B4, 0xCE91, + 0xC4B5, 0xCE94, 0xC4B6, 0xCE98, 0xC4B7, 0xCEA0, 0xC4B8, 0xCEA1, 0xC4B9, 0xCEA3, 0xC4BA, 0xCEA4, 0xC4BB, 0xCEA5, 0xC4BC, 0xCEAC, + 0xC4BD, 0xCEAD, 0xC4BE, 0xCEC1, 0xC4BF, 0xCEE4, 0xC4C0, 0xCEE5, 0xC4C1, 0xCEE8, 0xC4C2, 0xCEEB, 0xC4C3, 0xCEEC, 0xC4C4, 0xCEF4, + 0xC4C5, 0xCEF5, 0xC4C6, 0xCEF7, 0xC4C7, 0xCEF8, 0xC4C8, 0xCEF9, 0xC4C9, 0xCF00, 0xC4CA, 0xCF01, 0xC4CB, 0xCF04, 0xC4CC, 0xCF08, + 0xC4CD, 0xCF10, 0xC4CE, 0xCF11, 0xC4CF, 0xCF13, 0xC4D0, 0xCF15, 0xC4D1, 0xCF1C, 0xC4D2, 0xCF20, 0xC4D3, 0xCF24, 0xC4D4, 0xCF2C, + 0xC4D5, 0xCF2D, 0xC4D6, 0xCF2F, 0xC4D7, 0xCF30, 0xC4D8, 0xCF31, 0xC4D9, 0xCF38, 0xC4DA, 0xCF54, 0xC4DB, 0xCF55, 0xC4DC, 0xCF58, + 0xC4DD, 0xCF5C, 0xC4DE, 0xCF64, 0xC4DF, 0xCF65, 0xC4E0, 0xCF67, 0xC4E1, 0xCF69, 0xC4E2, 0xCF70, 0xC4E3, 0xCF71, 0xC4E4, 0xCF74, + 0xC4E5, 0xCF78, 0xC4E6, 0xCF80, 0xC4E7, 0xCF85, 0xC4E8, 0xCF8C, 0xC4E9, 0xCFA1, 0xC4EA, 0xCFA8, 0xC4EB, 0xCFB0, 0xC4EC, 0xCFC4, + 0xC4ED, 0xCFE0, 0xC4EE, 0xCFE1, 0xC4EF, 0xCFE4, 0xC4F0, 0xCFE8, 0xC4F1, 0xCFF0, 0xC4F2, 0xCFF1, 0xC4F3, 0xCFF3, 0xC4F4, 0xCFF5, + 0xC4F5, 0xCFFC, 0xC4F6, 0xD000, 0xC4F7, 0xD004, 0xC4F8, 0xD011, 0xC4F9, 0xD018, 0xC4FA, 0xD02D, 0xC4FB, 0xD034, 0xC4FC, 0xD035, + 0xC4FD, 0xD038, 0xC4FE, 0xD03C, 0xC541, 0xD715, 0xC542, 0xD716, 0xC543, 0xD717, 0xC544, 0xD71A, 0xC545, 0xD71B, 0xC546, 0xD71D, + 0xC547, 0xD71E, 0xC548, 0xD71F, 0xC549, 0xD721, 0xC54A, 0xD722, 0xC54B, 0xD723, 0xC54C, 0xD724, 0xC54D, 0xD725, 0xC54E, 0xD726, + 0xC54F, 0xD727, 0xC550, 0xD72A, 0xC551, 0xD72C, 0xC552, 0xD72E, 0xC553, 0xD72F, 0xC554, 0xD730, 0xC555, 0xD731, 0xC556, 0xD732, + 0xC557, 0xD733, 0xC558, 0xD736, 0xC559, 0xD737, 0xC55A, 0xD739, 0xC561, 0xD73A, 0xC562, 0xD73B, 0xC563, 0xD73D, 0xC564, 0xD73E, + 0xC565, 0xD73F, 0xC566, 0xD740, 0xC567, 0xD741, 0xC568, 0xD742, 0xC569, 0xD743, 0xC56A, 0xD745, 0xC56B, 0xD746, 0xC56C, 0xD748, + 0xC56D, 0xD74A, 0xC56E, 0xD74B, 0xC56F, 0xD74C, 0xC570, 0xD74D, 0xC571, 0xD74E, 0xC572, 0xD74F, 0xC573, 0xD752, 0xC574, 0xD753, + 0xC575, 0xD755, 0xC576, 0xD75A, 0xC577, 0xD75B, 0xC578, 0xD75C, 0xC579, 0xD75D, 0xC57A, 0xD75E, 0xC581, 0xD75F, 0xC582, 0xD762, + 0xC583, 0xD764, 0xC584, 0xD766, 0xC585, 0xD767, 0xC586, 0xD768, 0xC587, 0xD76A, 0xC588, 0xD76B, 0xC589, 0xD76D, 0xC58A, 0xD76E, + 0xC58B, 0xD76F, 0xC58C, 0xD771, 0xC58D, 0xD772, 0xC58E, 0xD773, 0xC58F, 0xD775, 0xC590, 0xD776, 0xC591, 0xD777, 0xC592, 0xD778, + 0xC593, 0xD779, 0xC594, 0xD77A, 0xC595, 0xD77B, 0xC596, 0xD77E, 0xC597, 0xD77F, 0xC598, 0xD780, 0xC599, 0xD782, 0xC59A, 0xD783, + 0xC59B, 0xD784, 0xC59C, 0xD785, 0xC59D, 0xD786, 0xC59E, 0xD787, 0xC59F, 0xD78A, 0xC5A0, 0xD78B, 0xC5A1, 0xD044, 0xC5A2, 0xD045, + 0xC5A3, 0xD047, 0xC5A4, 0xD049, 0xC5A5, 0xD050, 0xC5A6, 0xD054, 0xC5A7, 0xD058, 0xC5A8, 0xD060, 0xC5A9, 0xD06C, 0xC5AA, 0xD06D, + 0xC5AB, 0xD070, 0xC5AC, 0xD074, 0xC5AD, 0xD07C, 0xC5AE, 0xD07D, 0xC5AF, 0xD081, 0xC5B0, 0xD0A4, 0xC5B1, 0xD0A5, 0xC5B2, 0xD0A8, + 0xC5B3, 0xD0AC, 0xC5B4, 0xD0B4, 0xC5B5, 0xD0B5, 0xC5B6, 0xD0B7, 0xC5B7, 0xD0B9, 0xC5B8, 0xD0C0, 0xC5B9, 0xD0C1, 0xC5BA, 0xD0C4, + 0xC5BB, 0xD0C8, 0xC5BC, 0xD0C9, 0xC5BD, 0xD0D0, 0xC5BE, 0xD0D1, 0xC5BF, 0xD0D3, 0xC5C0, 0xD0D4, 0xC5C1, 0xD0D5, 0xC5C2, 0xD0DC, + 0xC5C3, 0xD0DD, 0xC5C4, 0xD0E0, 0xC5C5, 0xD0E4, 0xC5C6, 0xD0EC, 0xC5C7, 0xD0ED, 0xC5C8, 0xD0EF, 0xC5C9, 0xD0F0, 0xC5CA, 0xD0F1, + 0xC5CB, 0xD0F8, 0xC5CC, 0xD10D, 0xC5CD, 0xD130, 0xC5CE, 0xD131, 0xC5CF, 0xD134, 0xC5D0, 0xD138, 0xC5D1, 0xD13A, 0xC5D2, 0xD140, + 0xC5D3, 0xD141, 0xC5D4, 0xD143, 0xC5D5, 0xD144, 0xC5D6, 0xD145, 0xC5D7, 0xD14C, 0xC5D8, 0xD14D, 0xC5D9, 0xD150, 0xC5DA, 0xD154, + 0xC5DB, 0xD15C, 0xC5DC, 0xD15D, 0xC5DD, 0xD15F, 0xC5DE, 0xD161, 0xC5DF, 0xD168, 0xC5E0, 0xD16C, 0xC5E1, 0xD17C, 0xC5E2, 0xD184, + 0xC5E3, 0xD188, 0xC5E4, 0xD1A0, 0xC5E5, 0xD1A1, 0xC5E6, 0xD1A4, 0xC5E7, 0xD1A8, 0xC5E8, 0xD1B0, 0xC5E9, 0xD1B1, 0xC5EA, 0xD1B3, + 0xC5EB, 0xD1B5, 0xC5EC, 0xD1BA, 0xC5ED, 0xD1BC, 0xC5EE, 0xD1C0, 0xC5EF, 0xD1D8, 0xC5F0, 0xD1F4, 0xC5F1, 0xD1F8, 0xC5F2, 0xD207, + 0xC5F3, 0xD209, 0xC5F4, 0xD210, 0xC5F5, 0xD22C, 0xC5F6, 0xD22D, 0xC5F7, 0xD230, 0xC5F8, 0xD234, 0xC5F9, 0xD23C, 0xC5FA, 0xD23D, + 0xC5FB, 0xD23F, 0xC5FC, 0xD241, 0xC5FD, 0xD248, 0xC5FE, 0xD25C, 0xC641, 0xD78D, 0xC642, 0xD78E, 0xC643, 0xD78F, 0xC644, 0xD791, + 0xC645, 0xD792, 0xC646, 0xD793, 0xC647, 0xD794, 0xC648, 0xD795, 0xC649, 0xD796, 0xC64A, 0xD797, 0xC64B, 0xD79A, 0xC64C, 0xD79C, + 0xC64D, 0xD79E, 0xC64E, 0xD79F, 0xC64F, 0xD7A0, 0xC650, 0xD7A1, 0xC651, 0xD7A2, 0xC652, 0xD7A3, 0xC6A1, 0xD264, 0xC6A2, 0xD280, + 0xC6A3, 0xD281, 0xC6A4, 0xD284, 0xC6A5, 0xD288, 0xC6A6, 0xD290, 0xC6A7, 0xD291, 0xC6A8, 0xD295, 0xC6A9, 0xD29C, 0xC6AA, 0xD2A0, + 0xC6AB, 0xD2A4, 0xC6AC, 0xD2AC, 0xC6AD, 0xD2B1, 0xC6AE, 0xD2B8, 0xC6AF, 0xD2B9, 0xC6B0, 0xD2BC, 0xC6B1, 0xD2BF, 0xC6B2, 0xD2C0, + 0xC6B3, 0xD2C2, 0xC6B4, 0xD2C8, 0xC6B5, 0xD2C9, 0xC6B6, 0xD2CB, 0xC6B7, 0xD2D4, 0xC6B8, 0xD2D8, 0xC6B9, 0xD2DC, 0xC6BA, 0xD2E4, + 0xC6BB, 0xD2E5, 0xC6BC, 0xD2F0, 0xC6BD, 0xD2F1, 0xC6BE, 0xD2F4, 0xC6BF, 0xD2F8, 0xC6C0, 0xD300, 0xC6C1, 0xD301, 0xC6C2, 0xD303, + 0xC6C3, 0xD305, 0xC6C4, 0xD30C, 0xC6C5, 0xD30D, 0xC6C6, 0xD30E, 0xC6C7, 0xD310, 0xC6C8, 0xD314, 0xC6C9, 0xD316, 0xC6CA, 0xD31C, + 0xC6CB, 0xD31D, 0xC6CC, 0xD31F, 0xC6CD, 0xD320, 0xC6CE, 0xD321, 0xC6CF, 0xD325, 0xC6D0, 0xD328, 0xC6D1, 0xD329, 0xC6D2, 0xD32C, + 0xC6D3, 0xD330, 0xC6D4, 0xD338, 0xC6D5, 0xD339, 0xC6D6, 0xD33B, 0xC6D7, 0xD33C, 0xC6D8, 0xD33D, 0xC6D9, 0xD344, 0xC6DA, 0xD345, + 0xC6DB, 0xD37C, 0xC6DC, 0xD37D, 0xC6DD, 0xD380, 0xC6DE, 0xD384, 0xC6DF, 0xD38C, 0xC6E0, 0xD38D, 0xC6E1, 0xD38F, 0xC6E2, 0xD390, + 0xC6E3, 0xD391, 0xC6E4, 0xD398, 0xC6E5, 0xD399, 0xC6E6, 0xD39C, 0xC6E7, 0xD3A0, 0xC6E8, 0xD3A8, 0xC6E9, 0xD3A9, 0xC6EA, 0xD3AB, + 0xC6EB, 0xD3AD, 0xC6EC, 0xD3B4, 0xC6ED, 0xD3B8, 0xC6EE, 0xD3BC, 0xC6EF, 0xD3C4, 0xC6F0, 0xD3C5, 0xC6F1, 0xD3C8, 0xC6F2, 0xD3C9, + 0xC6F3, 0xD3D0, 0xC6F4, 0xD3D8, 0xC6F5, 0xD3E1, 0xC6F6, 0xD3E3, 0xC6F7, 0xD3EC, 0xC6F8, 0xD3ED, 0xC6F9, 0xD3F0, 0xC6FA, 0xD3F4, + 0xC6FB, 0xD3FC, 0xC6FC, 0xD3FD, 0xC6FD, 0xD3FF, 0xC6FE, 0xD401, 0xC7A1, 0xD408, 0xC7A2, 0xD41D, 0xC7A3, 0xD440, 0xC7A4, 0xD444, + 0xC7A5, 0xD45C, 0xC7A6, 0xD460, 0xC7A7, 0xD464, 0xC7A8, 0xD46D, 0xC7A9, 0xD46F, 0xC7AA, 0xD478, 0xC7AB, 0xD479, 0xC7AC, 0xD47C, + 0xC7AD, 0xD47F, 0xC7AE, 0xD480, 0xC7AF, 0xD482, 0xC7B0, 0xD488, 0xC7B1, 0xD489, 0xC7B2, 0xD48B, 0xC7B3, 0xD48D, 0xC7B4, 0xD494, + 0xC7B5, 0xD4A9, 0xC7B6, 0xD4CC, 0xC7B7, 0xD4D0, 0xC7B8, 0xD4D4, 0xC7B9, 0xD4DC, 0xC7BA, 0xD4DF, 0xC7BB, 0xD4E8, 0xC7BC, 0xD4EC, + 0xC7BD, 0xD4F0, 0xC7BE, 0xD4F8, 0xC7BF, 0xD4FB, 0xC7C0, 0xD4FD, 0xC7C1, 0xD504, 0xC7C2, 0xD508, 0xC7C3, 0xD50C, 0xC7C4, 0xD514, + 0xC7C5, 0xD515, 0xC7C6, 0xD517, 0xC7C7, 0xD53C, 0xC7C8, 0xD53D, 0xC7C9, 0xD540, 0xC7CA, 0xD544, 0xC7CB, 0xD54C, 0xC7CC, 0xD54D, + 0xC7CD, 0xD54F, 0xC7CE, 0xD551, 0xC7CF, 0xD558, 0xC7D0, 0xD559, 0xC7D1, 0xD55C, 0xC7D2, 0xD560, 0xC7D3, 0xD565, 0xC7D4, 0xD568, + 0xC7D5, 0xD569, 0xC7D6, 0xD56B, 0xC7D7, 0xD56D, 0xC7D8, 0xD574, 0xC7D9, 0xD575, 0xC7DA, 0xD578, 0xC7DB, 0xD57C, 0xC7DC, 0xD584, + 0xC7DD, 0xD585, 0xC7DE, 0xD587, 0xC7DF, 0xD588, 0xC7E0, 0xD589, 0xC7E1, 0xD590, 0xC7E2, 0xD5A5, 0xC7E3, 0xD5C8, 0xC7E4, 0xD5C9, + 0xC7E5, 0xD5CC, 0xC7E6, 0xD5D0, 0xC7E7, 0xD5D2, 0xC7E8, 0xD5D8, 0xC7E9, 0xD5D9, 0xC7EA, 0xD5DB, 0xC7EB, 0xD5DD, 0xC7EC, 0xD5E4, + 0xC7ED, 0xD5E5, 0xC7EE, 0xD5E8, 0xC7EF, 0xD5EC, 0xC7F0, 0xD5F4, 0xC7F1, 0xD5F5, 0xC7F2, 0xD5F7, 0xC7F3, 0xD5F9, 0xC7F4, 0xD600, + 0xC7F5, 0xD601, 0xC7F6, 0xD604, 0xC7F7, 0xD608, 0xC7F8, 0xD610, 0xC7F9, 0xD611, 0xC7FA, 0xD613, 0xC7FB, 0xD614, 0xC7FC, 0xD615, + 0xC7FD, 0xD61C, 0xC7FE, 0xD620, 0xC8A1, 0xD624, 0xC8A2, 0xD62D, 0xC8A3, 0xD638, 0xC8A4, 0xD639, 0xC8A5, 0xD63C, 0xC8A6, 0xD640, + 0xC8A7, 0xD645, 0xC8A8, 0xD648, 0xC8A9, 0xD649, 0xC8AA, 0xD64B, 0xC8AB, 0xD64D, 0xC8AC, 0xD651, 0xC8AD, 0xD654, 0xC8AE, 0xD655, + 0xC8AF, 0xD658, 0xC8B0, 0xD65C, 0xC8B1, 0xD667, 0xC8B2, 0xD669, 0xC8B3, 0xD670, 0xC8B4, 0xD671, 0xC8B5, 0xD674, 0xC8B6, 0xD683, + 0xC8B7, 0xD685, 0xC8B8, 0xD68C, 0xC8B9, 0xD68D, 0xC8BA, 0xD690, 0xC8BB, 0xD694, 0xC8BC, 0xD69D, 0xC8BD, 0xD69F, 0xC8BE, 0xD6A1, + 0xC8BF, 0xD6A8, 0xC8C0, 0xD6AC, 0xC8C1, 0xD6B0, 0xC8C2, 0xD6B9, 0xC8C3, 0xD6BB, 0xC8C4, 0xD6C4, 0xC8C5, 0xD6C5, 0xC8C6, 0xD6C8, + 0xC8C7, 0xD6CC, 0xC8C8, 0xD6D1, 0xC8C9, 0xD6D4, 0xC8CA, 0xD6D7, 0xC8CB, 0xD6D9, 0xC8CC, 0xD6E0, 0xC8CD, 0xD6E4, 0xC8CE, 0xD6E8, + 0xC8CF, 0xD6F0, 0xC8D0, 0xD6F5, 0xC8D1, 0xD6FC, 0xC8D2, 0xD6FD, 0xC8D3, 0xD700, 0xC8D4, 0xD704, 0xC8D5, 0xD711, 0xC8D6, 0xD718, + 0xC8D7, 0xD719, 0xC8D8, 0xD71C, 0xC8D9, 0xD720, 0xC8DA, 0xD728, 0xC8DB, 0xD729, 0xC8DC, 0xD72B, 0xC8DD, 0xD72D, 0xC8DE, 0xD734, + 0xC8DF, 0xD735, 0xC8E0, 0xD738, 0xC8E1, 0xD73C, 0xC8E2, 0xD744, 0xC8E3, 0xD747, 0xC8E4, 0xD749, 0xC8E5, 0xD750, 0xC8E6, 0xD751, + 0xC8E7, 0xD754, 0xC8E8, 0xD756, 0xC8E9, 0xD757, 0xC8EA, 0xD758, 0xC8EB, 0xD759, 0xC8EC, 0xD760, 0xC8ED, 0xD761, 0xC8EE, 0xD763, + 0xC8EF, 0xD765, 0xC8F0, 0xD769, 0xC8F1, 0xD76C, 0xC8F2, 0xD770, 0xC8F3, 0xD774, 0xC8F4, 0xD77C, 0xC8F5, 0xD77D, 0xC8F6, 0xD781, + 0xC8F7, 0xD788, 0xC8F8, 0xD789, 0xC8F9, 0xD78C, 0xC8FA, 0xD790, 0xC8FB, 0xD798, 0xC8FC, 0xD799, 0xC8FD, 0xD79B, 0xC8FE, 0xD79D, + 0xCAA1, 0x4F3D, 0xCAA2, 0x4F73, 0xCAA3, 0x5047, 0xCAA4, 0x50F9, 0xCAA5, 0x52A0, 0xCAA6, 0x53EF, 0xCAA7, 0x5475, 0xCAA8, 0x54E5, + 0xCAA9, 0x5609, 0xCAAA, 0x5AC1, 0xCAAB, 0x5BB6, 0xCAAC, 0x6687, 0xCAAD, 0x67B6, 0xCAAE, 0x67B7, 0xCAAF, 0x67EF, 0xCAB0, 0x6B4C, + 0xCAB1, 0x73C2, 0xCAB2, 0x75C2, 0xCAB3, 0x7A3C, 0xCAB4, 0x82DB, 0xCAB5, 0x8304, 0xCAB6, 0x8857, 0xCAB7, 0x8888, 0xCAB8, 0x8A36, + 0xCAB9, 0x8CC8, 0xCABA, 0x8DCF, 0xCABB, 0x8EFB, 0xCABC, 0x8FE6, 0xCABD, 0x99D5, 0xCABE, 0x523B, 0xCABF, 0x5374, 0xCAC0, 0x5404, + 0xCAC1, 0x606A, 0xCAC2, 0x6164, 0xCAC3, 0x6BBC, 0xCAC4, 0x73CF, 0xCAC5, 0x811A, 0xCAC6, 0x89BA, 0xCAC7, 0x89D2, 0xCAC8, 0x95A3, + 0xCAC9, 0x4F83, 0xCACA, 0x520A, 0xCACB, 0x58BE, 0xCACC, 0x5978, 0xCACD, 0x59E6, 0xCACE, 0x5E72, 0xCACF, 0x5E79, 0xCAD0, 0x61C7, + 0xCAD1, 0x63C0, 0xCAD2, 0x6746, 0xCAD3, 0x67EC, 0xCAD4, 0x687F, 0xCAD5, 0x6F97, 0xCAD6, 0x764E, 0xCAD7, 0x770B, 0xCAD8, 0x78F5, + 0xCAD9, 0x7A08, 0xCADA, 0x7AFF, 0xCADB, 0x7C21, 0xCADC, 0x809D, 0xCADD, 0x826E, 0xCADE, 0x8271, 0xCADF, 0x8AEB, 0xCAE0, 0x9593, + 0xCAE1, 0x4E6B, 0xCAE2, 0x559D, 0xCAE3, 0x66F7, 0xCAE4, 0x6E34, 0xCAE5, 0x78A3, 0xCAE6, 0x7AED, 0xCAE7, 0x845B, 0xCAE8, 0x8910, + 0xCAE9, 0x874E, 0xCAEA, 0x97A8, 0xCAEB, 0x52D8, 0xCAEC, 0x574E, 0xCAED, 0x582A, 0xCAEE, 0x5D4C, 0xCAEF, 0x611F, 0xCAF0, 0x61BE, + 0xCAF1, 0x6221, 0xCAF2, 0x6562, 0xCAF3, 0x67D1, 0xCAF4, 0x6A44, 0xCAF5, 0x6E1B, 0xCAF6, 0x7518, 0xCAF7, 0x75B3, 0xCAF8, 0x76E3, + 0xCAF9, 0x77B0, 0xCAFA, 0x7D3A, 0xCAFB, 0x90AF, 0xCAFC, 0x9451, 0xCAFD, 0x9452, 0xCAFE, 0x9F95, 0xCBA1, 0x5323, 0xCBA2, 0x5CAC, + 0xCBA3, 0x7532, 0xCBA4, 0x80DB, 0xCBA5, 0x9240, 0xCBA6, 0x9598, 0xCBA7, 0x525B, 0xCBA8, 0x5808, 0xCBA9, 0x59DC, 0xCBAA, 0x5CA1, + 0xCBAB, 0x5D17, 0xCBAC, 0x5EB7, 0xCBAD, 0x5F3A, 0xCBAE, 0x5F4A, 0xCBAF, 0x6177, 0xCBB0, 0x6C5F, 0xCBB1, 0x757A, 0xCBB2, 0x7586, + 0xCBB3, 0x7CE0, 0xCBB4, 0x7D73, 0xCBB5, 0x7DB1, 0xCBB6, 0x7F8C, 0xCBB7, 0x8154, 0xCBB8, 0x8221, 0xCBB9, 0x8591, 0xCBBA, 0x8941, + 0xCBBB, 0x8B1B, 0xCBBC, 0x92FC, 0xCBBD, 0x964D, 0xCBBE, 0x9C47, 0xCBBF, 0x4ECB, 0xCBC0, 0x4EF7, 0xCBC1, 0x500B, 0xCBC2, 0x51F1, + 0xCBC3, 0x584F, 0xCBC4, 0x6137, 0xCBC5, 0x613E, 0xCBC6, 0x6168, 0xCBC7, 0x6539, 0xCBC8, 0x69EA, 0xCBC9, 0x6F11, 0xCBCA, 0x75A5, + 0xCBCB, 0x7686, 0xCBCC, 0x76D6, 0xCBCD, 0x7B87, 0xCBCE, 0x82A5, 0xCBCF, 0x84CB, 0xCBD0, 0xF900, 0xCBD1, 0x93A7, 0xCBD2, 0x958B, + 0xCBD3, 0x5580, 0xCBD4, 0x5BA2, 0xCBD5, 0x5751, 0xCBD6, 0xF901, 0xCBD7, 0x7CB3, 0xCBD8, 0x7FB9, 0xCBD9, 0x91B5, 0xCBDA, 0x5028, + 0xCBDB, 0x53BB, 0xCBDC, 0x5C45, 0xCBDD, 0x5DE8, 0xCBDE, 0x62D2, 0xCBDF, 0x636E, 0xCBE0, 0x64DA, 0xCBE1, 0x64E7, 0xCBE2, 0x6E20, + 0xCBE3, 0x70AC, 0xCBE4, 0x795B, 0xCBE5, 0x8DDD, 0xCBE6, 0x8E1E, 0xCBE7, 0xF902, 0xCBE8, 0x907D, 0xCBE9, 0x9245, 0xCBEA, 0x92F8, + 0xCBEB, 0x4E7E, 0xCBEC, 0x4EF6, 0xCBED, 0x5065, 0xCBEE, 0x5DFE, 0xCBEF, 0x5EFA, 0xCBF0, 0x6106, 0xCBF1, 0x6957, 0xCBF2, 0x8171, + 0xCBF3, 0x8654, 0xCBF4, 0x8E47, 0xCBF5, 0x9375, 0xCBF6, 0x9A2B, 0xCBF7, 0x4E5E, 0xCBF8, 0x5091, 0xCBF9, 0x6770, 0xCBFA, 0x6840, + 0xCBFB, 0x5109, 0xCBFC, 0x528D, 0xCBFD, 0x5292, 0xCBFE, 0x6AA2, 0xCCA1, 0x77BC, 0xCCA2, 0x9210, 0xCCA3, 0x9ED4, 0xCCA4, 0x52AB, + 0xCCA5, 0x602F, 0xCCA6, 0x8FF2, 0xCCA7, 0x5048, 0xCCA8, 0x61A9, 0xCCA9, 0x63ED, 0xCCAA, 0x64CA, 0xCCAB, 0x683C, 0xCCAC, 0x6A84, + 0xCCAD, 0x6FC0, 0xCCAE, 0x8188, 0xCCAF, 0x89A1, 0xCCB0, 0x9694, 0xCCB1, 0x5805, 0xCCB2, 0x727D, 0xCCB3, 0x72AC, 0xCCB4, 0x7504, + 0xCCB5, 0x7D79, 0xCCB6, 0x7E6D, 0xCCB7, 0x80A9, 0xCCB8, 0x898B, 0xCCB9, 0x8B74, 0xCCBA, 0x9063, 0xCCBB, 0x9D51, 0xCCBC, 0x6289, + 0xCCBD, 0x6C7A, 0xCCBE, 0x6F54, 0xCCBF, 0x7D50, 0xCCC0, 0x7F3A, 0xCCC1, 0x8A23, 0xCCC2, 0x517C, 0xCCC3, 0x614A, 0xCCC4, 0x7B9D, + 0xCCC5, 0x8B19, 0xCCC6, 0x9257, 0xCCC7, 0x938C, 0xCCC8, 0x4EAC, 0xCCC9, 0x4FD3, 0xCCCA, 0x501E, 0xCCCB, 0x50BE, 0xCCCC, 0x5106, + 0xCCCD, 0x52C1, 0xCCCE, 0x52CD, 0xCCCF, 0x537F, 0xCCD0, 0x5770, 0xCCD1, 0x5883, 0xCCD2, 0x5E9A, 0xCCD3, 0x5F91, 0xCCD4, 0x6176, + 0xCCD5, 0x61AC, 0xCCD6, 0x64CE, 0xCCD7, 0x656C, 0xCCD8, 0x666F, 0xCCD9, 0x66BB, 0xCCDA, 0x66F4, 0xCCDB, 0x6897, 0xCCDC, 0x6D87, + 0xCCDD, 0x7085, 0xCCDE, 0x70F1, 0xCCDF, 0x749F, 0xCCE0, 0x74A5, 0xCCE1, 0x74CA, 0xCCE2, 0x75D9, 0xCCE3, 0x786C, 0xCCE4, 0x78EC, + 0xCCE5, 0x7ADF, 0xCCE6, 0x7AF6, 0xCCE7, 0x7D45, 0xCCE8, 0x7D93, 0xCCE9, 0x8015, 0xCCEA, 0x803F, 0xCCEB, 0x811B, 0xCCEC, 0x8396, + 0xCCED, 0x8B66, 0xCCEE, 0x8F15, 0xCCEF, 0x9015, 0xCCF0, 0x93E1, 0xCCF1, 0x9803, 0xCCF2, 0x9838, 0xCCF3, 0x9A5A, 0xCCF4, 0x9BE8, + 0xCCF5, 0x4FC2, 0xCCF6, 0x5553, 0xCCF7, 0x583A, 0xCCF8, 0x5951, 0xCCF9, 0x5B63, 0xCCFA, 0x5C46, 0xCCFB, 0x60B8, 0xCCFC, 0x6212, + 0xCCFD, 0x6842, 0xCCFE, 0x68B0, 0xCDA1, 0x68E8, 0xCDA2, 0x6EAA, 0xCDA3, 0x754C, 0xCDA4, 0x7678, 0xCDA5, 0x78CE, 0xCDA6, 0x7A3D, + 0xCDA7, 0x7CFB, 0xCDA8, 0x7E6B, 0xCDA9, 0x7E7C, 0xCDAA, 0x8A08, 0xCDAB, 0x8AA1, 0xCDAC, 0x8C3F, 0xCDAD, 0x968E, 0xCDAE, 0x9DC4, + 0xCDAF, 0x53E4, 0xCDB0, 0x53E9, 0xCDB1, 0x544A, 0xCDB2, 0x5471, 0xCDB3, 0x56FA, 0xCDB4, 0x59D1, 0xCDB5, 0x5B64, 0xCDB6, 0x5C3B, + 0xCDB7, 0x5EAB, 0xCDB8, 0x62F7, 0xCDB9, 0x6537, 0xCDBA, 0x6545, 0xCDBB, 0x6572, 0xCDBC, 0x66A0, 0xCDBD, 0x67AF, 0xCDBE, 0x69C1, + 0xCDBF, 0x6CBD, 0xCDC0, 0x75FC, 0xCDC1, 0x7690, 0xCDC2, 0x777E, 0xCDC3, 0x7A3F, 0xCDC4, 0x7F94, 0xCDC5, 0x8003, 0xCDC6, 0x80A1, + 0xCDC7, 0x818F, 0xCDC8, 0x82E6, 0xCDC9, 0x82FD, 0xCDCA, 0x83F0, 0xCDCB, 0x85C1, 0xCDCC, 0x8831, 0xCDCD, 0x88B4, 0xCDCE, 0x8AA5, + 0xCDCF, 0xF903, 0xCDD0, 0x8F9C, 0xCDD1, 0x932E, 0xCDD2, 0x96C7, 0xCDD3, 0x9867, 0xCDD4, 0x9AD8, 0xCDD5, 0x9F13, 0xCDD6, 0x54ED, + 0xCDD7, 0x659B, 0xCDD8, 0x66F2, 0xCDD9, 0x688F, 0xCDDA, 0x7A40, 0xCDDB, 0x8C37, 0xCDDC, 0x9D60, 0xCDDD, 0x56F0, 0xCDDE, 0x5764, + 0xCDDF, 0x5D11, 0xCDE0, 0x6606, 0xCDE1, 0x68B1, 0xCDE2, 0x68CD, 0xCDE3, 0x6EFE, 0xCDE4, 0x7428, 0xCDE5, 0x889E, 0xCDE6, 0x9BE4, + 0xCDE7, 0x6C68, 0xCDE8, 0xF904, 0xCDE9, 0x9AA8, 0xCDEA, 0x4F9B, 0xCDEB, 0x516C, 0xCDEC, 0x5171, 0xCDED, 0x529F, 0xCDEE, 0x5B54, + 0xCDEF, 0x5DE5, 0xCDF0, 0x6050, 0xCDF1, 0x606D, 0xCDF2, 0x62F1, 0xCDF3, 0x63A7, 0xCDF4, 0x653B, 0xCDF5, 0x73D9, 0xCDF6, 0x7A7A, + 0xCDF7, 0x86A3, 0xCDF8, 0x8CA2, 0xCDF9, 0x978F, 0xCDFA, 0x4E32, 0xCDFB, 0x5BE1, 0xCDFC, 0x6208, 0xCDFD, 0x679C, 0xCDFE, 0x74DC, + 0xCEA1, 0x79D1, 0xCEA2, 0x83D3, 0xCEA3, 0x8A87, 0xCEA4, 0x8AB2, 0xCEA5, 0x8DE8, 0xCEA6, 0x904E, 0xCEA7, 0x934B, 0xCEA8, 0x9846, + 0xCEA9, 0x5ED3, 0xCEAA, 0x69E8, 0xCEAB, 0x85FF, 0xCEAC, 0x90ED, 0xCEAD, 0xF905, 0xCEAE, 0x51A0, 0xCEAF, 0x5B98, 0xCEB0, 0x5BEC, + 0xCEB1, 0x6163, 0xCEB2, 0x68FA, 0xCEB3, 0x6B3E, 0xCEB4, 0x704C, 0xCEB5, 0x742F, 0xCEB6, 0x74D8, 0xCEB7, 0x7BA1, 0xCEB8, 0x7F50, + 0xCEB9, 0x83C5, 0xCEBA, 0x89C0, 0xCEBB, 0x8CAB, 0xCEBC, 0x95DC, 0xCEBD, 0x9928, 0xCEBE, 0x522E, 0xCEBF, 0x605D, 0xCEC0, 0x62EC, + 0xCEC1, 0x9002, 0xCEC2, 0x4F8A, 0xCEC3, 0x5149, 0xCEC4, 0x5321, 0xCEC5, 0x58D9, 0xCEC6, 0x5EE3, 0xCEC7, 0x66E0, 0xCEC8, 0x6D38, + 0xCEC9, 0x709A, 0xCECA, 0x72C2, 0xCECB, 0x73D6, 0xCECC, 0x7B50, 0xCECD, 0x80F1, 0xCECE, 0x945B, 0xCECF, 0x5366, 0xCED0, 0x639B, + 0xCED1, 0x7F6B, 0xCED2, 0x4E56, 0xCED3, 0x5080, 0xCED4, 0x584A, 0xCED5, 0x58DE, 0xCED6, 0x602A, 0xCED7, 0x6127, 0xCED8, 0x62D0, + 0xCED9, 0x69D0, 0xCEDA, 0x9B41, 0xCEDB, 0x5B8F, 0xCEDC, 0x7D18, 0xCEDD, 0x80B1, 0xCEDE, 0x8F5F, 0xCEDF, 0x4EA4, 0xCEE0, 0x50D1, + 0xCEE1, 0x54AC, 0xCEE2, 0x55AC, 0xCEE3, 0x5B0C, 0xCEE4, 0x5DA0, 0xCEE5, 0x5DE7, 0xCEE6, 0x652A, 0xCEE7, 0x654E, 0xCEE8, 0x6821, + 0xCEE9, 0x6A4B, 0xCEEA, 0x72E1, 0xCEEB, 0x768E, 0xCEEC, 0x77EF, 0xCEED, 0x7D5E, 0xCEEE, 0x7FF9, 0xCEEF, 0x81A0, 0xCEF0, 0x854E, + 0xCEF1, 0x86DF, 0xCEF2, 0x8F03, 0xCEF3, 0x8F4E, 0xCEF4, 0x90CA, 0xCEF5, 0x9903, 0xCEF6, 0x9A55, 0xCEF7, 0x9BAB, 0xCEF8, 0x4E18, + 0xCEF9, 0x4E45, 0xCEFA, 0x4E5D, 0xCEFB, 0x4EC7, 0xCEFC, 0x4FF1, 0xCEFD, 0x5177, 0xCEFE, 0x52FE, 0xCFA1, 0x5340, 0xCFA2, 0x53E3, + 0xCFA3, 0x53E5, 0xCFA4, 0x548E, 0xCFA5, 0x5614, 0xCFA6, 0x5775, 0xCFA7, 0x57A2, 0xCFA8, 0x5BC7, 0xCFA9, 0x5D87, 0xCFAA, 0x5ED0, + 0xCFAB, 0x61FC, 0xCFAC, 0x62D8, 0xCFAD, 0x6551, 0xCFAE, 0x67B8, 0xCFAF, 0x67E9, 0xCFB0, 0x69CB, 0xCFB1, 0x6B50, 0xCFB2, 0x6BC6, + 0xCFB3, 0x6BEC, 0xCFB4, 0x6C42, 0xCFB5, 0x6E9D, 0xCFB6, 0x7078, 0xCFB7, 0x72D7, 0xCFB8, 0x7396, 0xCFB9, 0x7403, 0xCFBA, 0x77BF, + 0xCFBB, 0x77E9, 0xCFBC, 0x7A76, 0xCFBD, 0x7D7F, 0xCFBE, 0x8009, 0xCFBF, 0x81FC, 0xCFC0, 0x8205, 0xCFC1, 0x820A, 0xCFC2, 0x82DF, + 0xCFC3, 0x8862, 0xCFC4, 0x8B33, 0xCFC5, 0x8CFC, 0xCFC6, 0x8EC0, 0xCFC7, 0x9011, 0xCFC8, 0x90B1, 0xCFC9, 0x9264, 0xCFCA, 0x92B6, + 0xCFCB, 0x99D2, 0xCFCC, 0x9A45, 0xCFCD, 0x9CE9, 0xCFCE, 0x9DD7, 0xCFCF, 0x9F9C, 0xCFD0, 0x570B, 0xCFD1, 0x5C40, 0xCFD2, 0x83CA, + 0xCFD3, 0x97A0, 0xCFD4, 0x97AB, 0xCFD5, 0x9EB4, 0xCFD6, 0x541B, 0xCFD7, 0x7A98, 0xCFD8, 0x7FA4, 0xCFD9, 0x88D9, 0xCFDA, 0x8ECD, + 0xCFDB, 0x90E1, 0xCFDC, 0x5800, 0xCFDD, 0x5C48, 0xCFDE, 0x6398, 0xCFDF, 0x7A9F, 0xCFE0, 0x5BAE, 0xCFE1, 0x5F13, 0xCFE2, 0x7A79, + 0xCFE3, 0x7AAE, 0xCFE4, 0x828E, 0xCFE5, 0x8EAC, 0xCFE6, 0x5026, 0xCFE7, 0x5238, 0xCFE8, 0x52F8, 0xCFE9, 0x5377, 0xCFEA, 0x5708, + 0xCFEB, 0x62F3, 0xCFEC, 0x6372, 0xCFED, 0x6B0A, 0xCFEE, 0x6DC3, 0xCFEF, 0x7737, 0xCFF0, 0x53A5, 0xCFF1, 0x7357, 0xCFF2, 0x8568, + 0xCFF3, 0x8E76, 0xCFF4, 0x95D5, 0xCFF5, 0x673A, 0xCFF6, 0x6AC3, 0xCFF7, 0x6F70, 0xCFF8, 0x8A6D, 0xCFF9, 0x8ECC, 0xCFFA, 0x994B, + 0xCFFB, 0xF906, 0xCFFC, 0x6677, 0xCFFD, 0x6B78, 0xCFFE, 0x8CB4, 0xD0A1, 0x9B3C, 0xD0A2, 0xF907, 0xD0A3, 0x53EB, 0xD0A4, 0x572D, + 0xD0A5, 0x594E, 0xD0A6, 0x63C6, 0xD0A7, 0x69FB, 0xD0A8, 0x73EA, 0xD0A9, 0x7845, 0xD0AA, 0x7ABA, 0xD0AB, 0x7AC5, 0xD0AC, 0x7CFE, + 0xD0AD, 0x8475, 0xD0AE, 0x898F, 0xD0AF, 0x8D73, 0xD0B0, 0x9035, 0xD0B1, 0x95A8, 0xD0B2, 0x52FB, 0xD0B3, 0x5747, 0xD0B4, 0x7547, + 0xD0B5, 0x7B60, 0xD0B6, 0x83CC, 0xD0B7, 0x921E, 0xD0B8, 0xF908, 0xD0B9, 0x6A58, 0xD0BA, 0x514B, 0xD0BB, 0x524B, 0xD0BC, 0x5287, + 0xD0BD, 0x621F, 0xD0BE, 0x68D8, 0xD0BF, 0x6975, 0xD0C0, 0x9699, 0xD0C1, 0x50C5, 0xD0C2, 0x52A4, 0xD0C3, 0x52E4, 0xD0C4, 0x61C3, + 0xD0C5, 0x65A4, 0xD0C6, 0x6839, 0xD0C7, 0x69FF, 0xD0C8, 0x747E, 0xD0C9, 0x7B4B, 0xD0CA, 0x82B9, 0xD0CB, 0x83EB, 0xD0CC, 0x89B2, + 0xD0CD, 0x8B39, 0xD0CE, 0x8FD1, 0xD0CF, 0x9949, 0xD0D0, 0xF909, 0xD0D1, 0x4ECA, 0xD0D2, 0x5997, 0xD0D3, 0x64D2, 0xD0D4, 0x6611, + 0xD0D5, 0x6A8E, 0xD0D6, 0x7434, 0xD0D7, 0x7981, 0xD0D8, 0x79BD, 0xD0D9, 0x82A9, 0xD0DA, 0x887E, 0xD0DB, 0x887F, 0xD0DC, 0x895F, + 0xD0DD, 0xF90A, 0xD0DE, 0x9326, 0xD0DF, 0x4F0B, 0xD0E0, 0x53CA, 0xD0E1, 0x6025, 0xD0E2, 0x6271, 0xD0E3, 0x6C72, 0xD0E4, 0x7D1A, + 0xD0E5, 0x7D66, 0xD0E6, 0x4E98, 0xD0E7, 0x5162, 0xD0E8, 0x77DC, 0xD0E9, 0x80AF, 0xD0EA, 0x4F01, 0xD0EB, 0x4F0E, 0xD0EC, 0x5176, + 0xD0ED, 0x5180, 0xD0EE, 0x55DC, 0xD0EF, 0x5668, 0xD0F0, 0x573B, 0xD0F1, 0x57FA, 0xD0F2, 0x57FC, 0xD0F3, 0x5914, 0xD0F4, 0x5947, + 0xD0F5, 0x5993, 0xD0F6, 0x5BC4, 0xD0F7, 0x5C90, 0xD0F8, 0x5D0E, 0xD0F9, 0x5DF1, 0xD0FA, 0x5E7E, 0xD0FB, 0x5FCC, 0xD0FC, 0x6280, + 0xD0FD, 0x65D7, 0xD0FE, 0x65E3, 0xD1A1, 0x671E, 0xD1A2, 0x671F, 0xD1A3, 0x675E, 0xD1A4, 0x68CB, 0xD1A5, 0x68C4, 0xD1A6, 0x6A5F, + 0xD1A7, 0x6B3A, 0xD1A8, 0x6C23, 0xD1A9, 0x6C7D, 0xD1AA, 0x6C82, 0xD1AB, 0x6DC7, 0xD1AC, 0x7398, 0xD1AD, 0x7426, 0xD1AE, 0x742A, + 0xD1AF, 0x7482, 0xD1B0, 0x74A3, 0xD1B1, 0x7578, 0xD1B2, 0x757F, 0xD1B3, 0x7881, 0xD1B4, 0x78EF, 0xD1B5, 0x7941, 0xD1B6, 0x7947, + 0xD1B7, 0x7948, 0xD1B8, 0x797A, 0xD1B9, 0x7B95, 0xD1BA, 0x7D00, 0xD1BB, 0x7DBA, 0xD1BC, 0x7F88, 0xD1BD, 0x8006, 0xD1BE, 0x802D, + 0xD1BF, 0x808C, 0xD1C0, 0x8A18, 0xD1C1, 0x8B4F, 0xD1C2, 0x8C48, 0xD1C3, 0x8D77, 0xD1C4, 0x9321, 0xD1C5, 0x9324, 0xD1C6, 0x98E2, + 0xD1C7, 0x9951, 0xD1C8, 0x9A0E, 0xD1C9, 0x9A0F, 0xD1CA, 0x9A65, 0xD1CB, 0x9E92, 0xD1CC, 0x7DCA, 0xD1CD, 0x4F76, 0xD1CE, 0x5409, + 0xD1CF, 0x62EE, 0xD1D0, 0x6854, 0xD1D1, 0x91D1, 0xD1D2, 0x55AB, 0xD1D3, 0x513A, 0xD1D4, 0xF90B, 0xD1D5, 0xF90C, 0xD1D6, 0x5A1C, + 0xD1D7, 0x61E6, 0xD1D8, 0xF90D, 0xD1D9, 0x62CF, 0xD1DA, 0x62FF, 0xD1DB, 0xF90E, 0xD1DC, 0xF90F, 0xD1DD, 0xF910, 0xD1DE, 0xF911, + 0xD1DF, 0xF912, 0xD1E0, 0xF913, 0xD1E1, 0x90A3, 0xD1E2, 0xF914, 0xD1E3, 0xF915, 0xD1E4, 0xF916, 0xD1E5, 0xF917, 0xD1E6, 0xF918, + 0xD1E7, 0x8AFE, 0xD1E8, 0xF919, 0xD1E9, 0xF91A, 0xD1EA, 0xF91B, 0xD1EB, 0xF91C, 0xD1EC, 0x6696, 0xD1ED, 0xF91D, 0xD1EE, 0x7156, + 0xD1EF, 0xF91E, 0xD1F0, 0xF91F, 0xD1F1, 0x96E3, 0xD1F2, 0xF920, 0xD1F3, 0x634F, 0xD1F4, 0x637A, 0xD1F5, 0x5357, 0xD1F6, 0xF921, + 0xD1F7, 0x678F, 0xD1F8, 0x6960, 0xD1F9, 0x6E73, 0xD1FA, 0xF922, 0xD1FB, 0x7537, 0xD1FC, 0xF923, 0xD1FD, 0xF924, 0xD1FE, 0xF925, + 0xD2A1, 0x7D0D, 0xD2A2, 0xF926, 0xD2A3, 0xF927, 0xD2A4, 0x8872, 0xD2A5, 0x56CA, 0xD2A6, 0x5A18, 0xD2A7, 0xF928, 0xD2A8, 0xF929, + 0xD2A9, 0xF92A, 0xD2AA, 0xF92B, 0xD2AB, 0xF92C, 0xD2AC, 0x4E43, 0xD2AD, 0xF92D, 0xD2AE, 0x5167, 0xD2AF, 0x5948, 0xD2B0, 0x67F0, + 0xD2B1, 0x8010, 0xD2B2, 0xF92E, 0xD2B3, 0x5973, 0xD2B4, 0x5E74, 0xD2B5, 0x649A, 0xD2B6, 0x79CA, 0xD2B7, 0x5FF5, 0xD2B8, 0x606C, + 0xD2B9, 0x62C8, 0xD2BA, 0x637B, 0xD2BB, 0x5BE7, 0xD2BC, 0x5BD7, 0xD2BD, 0x52AA, 0xD2BE, 0xF92F, 0xD2BF, 0x5974, 0xD2C0, 0x5F29, + 0xD2C1, 0x6012, 0xD2C2, 0xF930, 0xD2C3, 0xF931, 0xD2C4, 0xF932, 0xD2C5, 0x7459, 0xD2C6, 0xF933, 0xD2C7, 0xF934, 0xD2C8, 0xF935, + 0xD2C9, 0xF936, 0xD2CA, 0xF937, 0xD2CB, 0xF938, 0xD2CC, 0x99D1, 0xD2CD, 0xF939, 0xD2CE, 0xF93A, 0xD2CF, 0xF93B, 0xD2D0, 0xF93C, + 0xD2D1, 0xF93D, 0xD2D2, 0xF93E, 0xD2D3, 0xF93F, 0xD2D4, 0xF940, 0xD2D5, 0xF941, 0xD2D6, 0xF942, 0xD2D7, 0xF943, 0xD2D8, 0x6FC3, + 0xD2D9, 0xF944, 0xD2DA, 0xF945, 0xD2DB, 0x81BF, 0xD2DC, 0x8FB2, 0xD2DD, 0x60F1, 0xD2DE, 0xF946, 0xD2DF, 0xF947, 0xD2E0, 0x8166, + 0xD2E1, 0xF948, 0xD2E2, 0xF949, 0xD2E3, 0x5C3F, 0xD2E4, 0xF94A, 0xD2E5, 0xF94B, 0xD2E6, 0xF94C, 0xD2E7, 0xF94D, 0xD2E8, 0xF94E, + 0xD2E9, 0xF94F, 0xD2EA, 0xF950, 0xD2EB, 0xF951, 0xD2EC, 0x5AE9, 0xD2ED, 0x8A25, 0xD2EE, 0x677B, 0xD2EF, 0x7D10, 0xD2F0, 0xF952, + 0xD2F1, 0xF953, 0xD2F2, 0xF954, 0xD2F3, 0xF955, 0xD2F4, 0xF956, 0xD2F5, 0xF957, 0xD2F6, 0x80FD, 0xD2F7, 0xF958, 0xD2F8, 0xF959, + 0xD2F9, 0x5C3C, 0xD2FA, 0x6CE5, 0xD2FB, 0x533F, 0xD2FC, 0x6EBA, 0xD2FD, 0x591A, 0xD2FE, 0x8336, 0xD3A1, 0x4E39, 0xD3A2, 0x4EB6, + 0xD3A3, 0x4F46, 0xD3A4, 0x55AE, 0xD3A5, 0x5718, 0xD3A6, 0x58C7, 0xD3A7, 0x5F56, 0xD3A8, 0x65B7, 0xD3A9, 0x65E6, 0xD3AA, 0x6A80, + 0xD3AB, 0x6BB5, 0xD3AC, 0x6E4D, 0xD3AD, 0x77ED, 0xD3AE, 0x7AEF, 0xD3AF, 0x7C1E, 0xD3B0, 0x7DDE, 0xD3B1, 0x86CB, 0xD3B2, 0x8892, + 0xD3B3, 0x9132, 0xD3B4, 0x935B, 0xD3B5, 0x64BB, 0xD3B6, 0x6FBE, 0xD3B7, 0x737A, 0xD3B8, 0x75B8, 0xD3B9, 0x9054, 0xD3BA, 0x5556, + 0xD3BB, 0x574D, 0xD3BC, 0x61BA, 0xD3BD, 0x64D4, 0xD3BE, 0x66C7, 0xD3BF, 0x6DE1, 0xD3C0, 0x6E5B, 0xD3C1, 0x6F6D, 0xD3C2, 0x6FB9, + 0xD3C3, 0x75F0, 0xD3C4, 0x8043, 0xD3C5, 0x81BD, 0xD3C6, 0x8541, 0xD3C7, 0x8983, 0xD3C8, 0x8AC7, 0xD3C9, 0x8B5A, 0xD3CA, 0x931F, + 0xD3CB, 0x6C93, 0xD3CC, 0x7553, 0xD3CD, 0x7B54, 0xD3CE, 0x8E0F, 0xD3CF, 0x905D, 0xD3D0, 0x5510, 0xD3D1, 0x5802, 0xD3D2, 0x5858, + 0xD3D3, 0x5E62, 0xD3D4, 0x6207, 0xD3D5, 0x649E, 0xD3D6, 0x68E0, 0xD3D7, 0x7576, 0xD3D8, 0x7CD6, 0xD3D9, 0x87B3, 0xD3DA, 0x9EE8, + 0xD3DB, 0x4EE3, 0xD3DC, 0x5788, 0xD3DD, 0x576E, 0xD3DE, 0x5927, 0xD3DF, 0x5C0D, 0xD3E0, 0x5CB1, 0xD3E1, 0x5E36, 0xD3E2, 0x5F85, + 0xD3E3, 0x6234, 0xD3E4, 0x64E1, 0xD3E5, 0x73B3, 0xD3E6, 0x81FA, 0xD3E7, 0x888B, 0xD3E8, 0x8CB8, 0xD3E9, 0x968A, 0xD3EA, 0x9EDB, + 0xD3EB, 0x5B85, 0xD3EC, 0x5FB7, 0xD3ED, 0x60B3, 0xD3EE, 0x5012, 0xD3EF, 0x5200, 0xD3F0, 0x5230, 0xD3F1, 0x5716, 0xD3F2, 0x5835, + 0xD3F3, 0x5857, 0xD3F4, 0x5C0E, 0xD3F5, 0x5C60, 0xD3F6, 0x5CF6, 0xD3F7, 0x5D8B, 0xD3F8, 0x5EA6, 0xD3F9, 0x5F92, 0xD3FA, 0x60BC, + 0xD3FB, 0x6311, 0xD3FC, 0x6389, 0xD3FD, 0x6417, 0xD3FE, 0x6843, 0xD4A1, 0x68F9, 0xD4A2, 0x6AC2, 0xD4A3, 0x6DD8, 0xD4A4, 0x6E21, + 0xD4A5, 0x6ED4, 0xD4A6, 0x6FE4, 0xD4A7, 0x71FE, 0xD4A8, 0x76DC, 0xD4A9, 0x7779, 0xD4AA, 0x79B1, 0xD4AB, 0x7A3B, 0xD4AC, 0x8404, + 0xD4AD, 0x89A9, 0xD4AE, 0x8CED, 0xD4AF, 0x8DF3, 0xD4B0, 0x8E48, 0xD4B1, 0x9003, 0xD4B2, 0x9014, 0xD4B3, 0x9053, 0xD4B4, 0x90FD, + 0xD4B5, 0x934D, 0xD4B6, 0x9676, 0xD4B7, 0x97DC, 0xD4B8, 0x6BD2, 0xD4B9, 0x7006, 0xD4BA, 0x7258, 0xD4BB, 0x72A2, 0xD4BC, 0x7368, + 0xD4BD, 0x7763, 0xD4BE, 0x79BF, 0xD4BF, 0x7BE4, 0xD4C0, 0x7E9B, 0xD4C1, 0x8B80, 0xD4C2, 0x58A9, 0xD4C3, 0x60C7, 0xD4C4, 0x6566, + 0xD4C5, 0x65FD, 0xD4C6, 0x66BE, 0xD4C7, 0x6C8C, 0xD4C8, 0x711E, 0xD4C9, 0x71C9, 0xD4CA, 0x8C5A, 0xD4CB, 0x9813, 0xD4CC, 0x4E6D, + 0xD4CD, 0x7A81, 0xD4CE, 0x4EDD, 0xD4CF, 0x51AC, 0xD4D0, 0x51CD, 0xD4D1, 0x52D5, 0xD4D2, 0x540C, 0xD4D3, 0x61A7, 0xD4D4, 0x6771, + 0xD4D5, 0x6850, 0xD4D6, 0x68DF, 0xD4D7, 0x6D1E, 0xD4D8, 0x6F7C, 0xD4D9, 0x75BC, 0xD4DA, 0x77B3, 0xD4DB, 0x7AE5, 0xD4DC, 0x80F4, + 0xD4DD, 0x8463, 0xD4DE, 0x9285, 0xD4DF, 0x515C, 0xD4E0, 0x6597, 0xD4E1, 0x675C, 0xD4E2, 0x6793, 0xD4E3, 0x75D8, 0xD4E4, 0x7AC7, + 0xD4E5, 0x8373, 0xD4E6, 0xF95A, 0xD4E7, 0x8C46, 0xD4E8, 0x9017, 0xD4E9, 0x982D, 0xD4EA, 0x5C6F, 0xD4EB, 0x81C0, 0xD4EC, 0x829A, + 0xD4ED, 0x9041, 0xD4EE, 0x906F, 0xD4EF, 0x920D, 0xD4F0, 0x5F97, 0xD4F1, 0x5D9D, 0xD4F2, 0x6A59, 0xD4F3, 0x71C8, 0xD4F4, 0x767B, + 0xD4F5, 0x7B49, 0xD4F6, 0x85E4, 0xD4F7, 0x8B04, 0xD4F8, 0x9127, 0xD4F9, 0x9A30, 0xD4FA, 0x5587, 0xD4FB, 0x61F6, 0xD4FC, 0xF95B, + 0xD4FD, 0x7669, 0xD4FE, 0x7F85, 0xD5A1, 0x863F, 0xD5A2, 0x87BA, 0xD5A3, 0x88F8, 0xD5A4, 0x908F, 0xD5A5, 0xF95C, 0xD5A6, 0x6D1B, + 0xD5A7, 0x70D9, 0xD5A8, 0x73DE, 0xD5A9, 0x7D61, 0xD5AA, 0x843D, 0xD5AB, 0xF95D, 0xD5AC, 0x916A, 0xD5AD, 0x99F1, 0xD5AE, 0xF95E, + 0xD5AF, 0x4E82, 0xD5B0, 0x5375, 0xD5B1, 0x6B04, 0xD5B2, 0x6B12, 0xD5B3, 0x703E, 0xD5B4, 0x721B, 0xD5B5, 0x862D, 0xD5B6, 0x9E1E, + 0xD5B7, 0x524C, 0xD5B8, 0x8FA3, 0xD5B9, 0x5D50, 0xD5BA, 0x64E5, 0xD5BB, 0x652C, 0xD5BC, 0x6B16, 0xD5BD, 0x6FEB, 0xD5BE, 0x7C43, + 0xD5BF, 0x7E9C, 0xD5C0, 0x85CD, 0xD5C1, 0x8964, 0xD5C2, 0x89BD, 0xD5C3, 0x62C9, 0xD5C4, 0x81D8, 0xD5C5, 0x881F, 0xD5C6, 0x5ECA, + 0xD5C7, 0x6717, 0xD5C8, 0x6D6A, 0xD5C9, 0x72FC, 0xD5CA, 0x7405, 0xD5CB, 0x746F, 0xD5CC, 0x8782, 0xD5CD, 0x90DE, 0xD5CE, 0x4F86, + 0xD5CF, 0x5D0D, 0xD5D0, 0x5FA0, 0xD5D1, 0x840A, 0xD5D2, 0x51B7, 0xD5D3, 0x63A0, 0xD5D4, 0x7565, 0xD5D5, 0x4EAE, 0xD5D6, 0x5006, + 0xD5D7, 0x5169, 0xD5D8, 0x51C9, 0xD5D9, 0x6881, 0xD5DA, 0x6A11, 0xD5DB, 0x7CAE, 0xD5DC, 0x7CB1, 0xD5DD, 0x7CE7, 0xD5DE, 0x826F, + 0xD5DF, 0x8AD2, 0xD5E0, 0x8F1B, 0xD5E1, 0x91CF, 0xD5E2, 0x4FB6, 0xD5E3, 0x5137, 0xD5E4, 0x52F5, 0xD5E5, 0x5442, 0xD5E6, 0x5EEC, + 0xD5E7, 0x616E, 0xD5E8, 0x623E, 0xD5E9, 0x65C5, 0xD5EA, 0x6ADA, 0xD5EB, 0x6FFE, 0xD5EC, 0x792A, 0xD5ED, 0x85DC, 0xD5EE, 0x8823, + 0xD5EF, 0x95AD, 0xD5F0, 0x9A62, 0xD5F1, 0x9A6A, 0xD5F2, 0x9E97, 0xD5F3, 0x9ECE, 0xD5F4, 0x529B, 0xD5F5, 0x66C6, 0xD5F6, 0x6B77, + 0xD5F7, 0x701D, 0xD5F8, 0x792B, 0xD5F9, 0x8F62, 0xD5FA, 0x9742, 0xD5FB, 0x6190, 0xD5FC, 0x6200, 0xD5FD, 0x6523, 0xD5FE, 0x6F23, + 0xD6A1, 0x7149, 0xD6A2, 0x7489, 0xD6A3, 0x7DF4, 0xD6A4, 0x806F, 0xD6A5, 0x84EE, 0xD6A6, 0x8F26, 0xD6A7, 0x9023, 0xD6A8, 0x934A, + 0xD6A9, 0x51BD, 0xD6AA, 0x5217, 0xD6AB, 0x52A3, 0xD6AC, 0x6D0C, 0xD6AD, 0x70C8, 0xD6AE, 0x88C2, 0xD6AF, 0x5EC9, 0xD6B0, 0x6582, + 0xD6B1, 0x6BAE, 0xD6B2, 0x6FC2, 0xD6B3, 0x7C3E, 0xD6B4, 0x7375, 0xD6B5, 0x4EE4, 0xD6B6, 0x4F36, 0xD6B7, 0x56F9, 0xD6B8, 0xF95F, + 0xD6B9, 0x5CBA, 0xD6BA, 0x5DBA, 0xD6BB, 0x601C, 0xD6BC, 0x73B2, 0xD6BD, 0x7B2D, 0xD6BE, 0x7F9A, 0xD6BF, 0x7FCE, 0xD6C0, 0x8046, + 0xD6C1, 0x901E, 0xD6C2, 0x9234, 0xD6C3, 0x96F6, 0xD6C4, 0x9748, 0xD6C5, 0x9818, 0xD6C6, 0x9F61, 0xD6C7, 0x4F8B, 0xD6C8, 0x6FA7, + 0xD6C9, 0x79AE, 0xD6CA, 0x91B4, 0xD6CB, 0x96B7, 0xD6CC, 0x52DE, 0xD6CD, 0xF960, 0xD6CE, 0x6488, 0xD6CF, 0x64C4, 0xD6D0, 0x6AD3, + 0xD6D1, 0x6F5E, 0xD6D2, 0x7018, 0xD6D3, 0x7210, 0xD6D4, 0x76E7, 0xD6D5, 0x8001, 0xD6D6, 0x8606, 0xD6D7, 0x865C, 0xD6D8, 0x8DEF, + 0xD6D9, 0x8F05, 0xD6DA, 0x9732, 0xD6DB, 0x9B6F, 0xD6DC, 0x9DFA, 0xD6DD, 0x9E75, 0xD6DE, 0x788C, 0xD6DF, 0x797F, 0xD6E0, 0x7DA0, + 0xD6E1, 0x83C9, 0xD6E2, 0x9304, 0xD6E3, 0x9E7F, 0xD6E4, 0x9E93, 0xD6E5, 0x8AD6, 0xD6E6, 0x58DF, 0xD6E7, 0x5F04, 0xD6E8, 0x6727, + 0xD6E9, 0x7027, 0xD6EA, 0x74CF, 0xD6EB, 0x7C60, 0xD6EC, 0x807E, 0xD6ED, 0x5121, 0xD6EE, 0x7028, 0xD6EF, 0x7262, 0xD6F0, 0x78CA, + 0xD6F1, 0x8CC2, 0xD6F2, 0x8CDA, 0xD6F3, 0x8CF4, 0xD6F4, 0x96F7, 0xD6F5, 0x4E86, 0xD6F6, 0x50DA, 0xD6F7, 0x5BEE, 0xD6F8, 0x5ED6, + 0xD6F9, 0x6599, 0xD6FA, 0x71CE, 0xD6FB, 0x7642, 0xD6FC, 0x77AD, 0xD6FD, 0x804A, 0xD6FE, 0x84FC, 0xD7A1, 0x907C, 0xD7A2, 0x9B27, + 0xD7A3, 0x9F8D, 0xD7A4, 0x58D8, 0xD7A5, 0x5A41, 0xD7A6, 0x5C62, 0xD7A7, 0x6A13, 0xD7A8, 0x6DDA, 0xD7A9, 0x6F0F, 0xD7AA, 0x763B, + 0xD7AB, 0x7D2F, 0xD7AC, 0x7E37, 0xD7AD, 0x851E, 0xD7AE, 0x8938, 0xD7AF, 0x93E4, 0xD7B0, 0x964B, 0xD7B1, 0x5289, 0xD7B2, 0x65D2, + 0xD7B3, 0x67F3, 0xD7B4, 0x69B4, 0xD7B5, 0x6D41, 0xD7B6, 0x6E9C, 0xD7B7, 0x700F, 0xD7B8, 0x7409, 0xD7B9, 0x7460, 0xD7BA, 0x7559, + 0xD7BB, 0x7624, 0xD7BC, 0x786B, 0xD7BD, 0x8B2C, 0xD7BE, 0x985E, 0xD7BF, 0x516D, 0xD7C0, 0x622E, 0xD7C1, 0x9678, 0xD7C2, 0x4F96, + 0xD7C3, 0x502B, 0xD7C4, 0x5D19, 0xD7C5, 0x6DEA, 0xD7C6, 0x7DB8, 0xD7C7, 0x8F2A, 0xD7C8, 0x5F8B, 0xD7C9, 0x6144, 0xD7CA, 0x6817, + 0xD7CB, 0xF961, 0xD7CC, 0x9686, 0xD7CD, 0x52D2, 0xD7CE, 0x808B, 0xD7CF, 0x51DC, 0xD7D0, 0x51CC, 0xD7D1, 0x695E, 0xD7D2, 0x7A1C, + 0xD7D3, 0x7DBE, 0xD7D4, 0x83F1, 0xD7D5, 0x9675, 0xD7D6, 0x4FDA, 0xD7D7, 0x5229, 0xD7D8, 0x5398, 0xD7D9, 0x540F, 0xD7DA, 0x550E, + 0xD7DB, 0x5C65, 0xD7DC, 0x60A7, 0xD7DD, 0x674E, 0xD7DE, 0x68A8, 0xD7DF, 0x6D6C, 0xD7E0, 0x7281, 0xD7E1, 0x72F8, 0xD7E2, 0x7406, + 0xD7E3, 0x7483, 0xD7E4, 0xF962, 0xD7E5, 0x75E2, 0xD7E6, 0x7C6C, 0xD7E7, 0x7F79, 0xD7E8, 0x7FB8, 0xD7E9, 0x8389, 0xD7EA, 0x88CF, + 0xD7EB, 0x88E1, 0xD7EC, 0x91CC, 0xD7ED, 0x91D0, 0xD7EE, 0x96E2, 0xD7EF, 0x9BC9, 0xD7F0, 0x541D, 0xD7F1, 0x6F7E, 0xD7F2, 0x71D0, + 0xD7F3, 0x7498, 0xD7F4, 0x85FA, 0xD7F5, 0x8EAA, 0xD7F6, 0x96A3, 0xD7F7, 0x9C57, 0xD7F8, 0x9E9F, 0xD7F9, 0x6797, 0xD7FA, 0x6DCB, + 0xD7FB, 0x7433, 0xD7FC, 0x81E8, 0xD7FD, 0x9716, 0xD7FE, 0x782C, 0xD8A1, 0x7ACB, 0xD8A2, 0x7B20, 0xD8A3, 0x7C92, 0xD8A4, 0x6469, + 0xD8A5, 0x746A, 0xD8A6, 0x75F2, 0xD8A7, 0x78BC, 0xD8A8, 0x78E8, 0xD8A9, 0x99AC, 0xD8AA, 0x9B54, 0xD8AB, 0x9EBB, 0xD8AC, 0x5BDE, + 0xD8AD, 0x5E55, 0xD8AE, 0x6F20, 0xD8AF, 0x819C, 0xD8B0, 0x83AB, 0xD8B1, 0x9088, 0xD8B2, 0x4E07, 0xD8B3, 0x534D, 0xD8B4, 0x5A29, + 0xD8B5, 0x5DD2, 0xD8B6, 0x5F4E, 0xD8B7, 0x6162, 0xD8B8, 0x633D, 0xD8B9, 0x6669, 0xD8BA, 0x66FC, 0xD8BB, 0x6EFF, 0xD8BC, 0x6F2B, + 0xD8BD, 0x7063, 0xD8BE, 0x779E, 0xD8BF, 0x842C, 0xD8C0, 0x8513, 0xD8C1, 0x883B, 0xD8C2, 0x8F13, 0xD8C3, 0x9945, 0xD8C4, 0x9C3B, + 0xD8C5, 0x551C, 0xD8C6, 0x62B9, 0xD8C7, 0x672B, 0xD8C8, 0x6CAB, 0xD8C9, 0x8309, 0xD8CA, 0x896A, 0xD8CB, 0x977A, 0xD8CC, 0x4EA1, + 0xD8CD, 0x5984, 0xD8CE, 0x5FD8, 0xD8CF, 0x5FD9, 0xD8D0, 0x671B, 0xD8D1, 0x7DB2, 0xD8D2, 0x7F54, 0xD8D3, 0x8292, 0xD8D4, 0x832B, + 0xD8D5, 0x83BD, 0xD8D6, 0x8F1E, 0xD8D7, 0x9099, 0xD8D8, 0x57CB, 0xD8D9, 0x59B9, 0xD8DA, 0x5A92, 0xD8DB, 0x5BD0, 0xD8DC, 0x6627, + 0xD8DD, 0x679A, 0xD8DE, 0x6885, 0xD8DF, 0x6BCF, 0xD8E0, 0x7164, 0xD8E1, 0x7F75, 0xD8E2, 0x8CB7, 0xD8E3, 0x8CE3, 0xD8E4, 0x9081, + 0xD8E5, 0x9B45, 0xD8E6, 0x8108, 0xD8E7, 0x8C8A, 0xD8E8, 0x964C, 0xD8E9, 0x9A40, 0xD8EA, 0x9EA5, 0xD8EB, 0x5B5F, 0xD8EC, 0x6C13, + 0xD8ED, 0x731B, 0xD8EE, 0x76F2, 0xD8EF, 0x76DF, 0xD8F0, 0x840C, 0xD8F1, 0x51AA, 0xD8F2, 0x8993, 0xD8F3, 0x514D, 0xD8F4, 0x5195, + 0xD8F5, 0x52C9, 0xD8F6, 0x68C9, 0xD8F7, 0x6C94, 0xD8F8, 0x7704, 0xD8F9, 0x7720, 0xD8FA, 0x7DBF, 0xD8FB, 0x7DEC, 0xD8FC, 0x9762, + 0xD8FD, 0x9EB5, 0xD8FE, 0x6EC5, 0xD9A1, 0x8511, 0xD9A2, 0x51A5, 0xD9A3, 0x540D, 0xD9A4, 0x547D, 0xD9A5, 0x660E, 0xD9A6, 0x669D, + 0xD9A7, 0x6927, 0xD9A8, 0x6E9F, 0xD9A9, 0x76BF, 0xD9AA, 0x7791, 0xD9AB, 0x8317, 0xD9AC, 0x84C2, 0xD9AD, 0x879F, 0xD9AE, 0x9169, + 0xD9AF, 0x9298, 0xD9B0, 0x9CF4, 0xD9B1, 0x8882, 0xD9B2, 0x4FAE, 0xD9B3, 0x5192, 0xD9B4, 0x52DF, 0xD9B5, 0x59C6, 0xD9B6, 0x5E3D, + 0xD9B7, 0x6155, 0xD9B8, 0x6478, 0xD9B9, 0x6479, 0xD9BA, 0x66AE, 0xD9BB, 0x67D0, 0xD9BC, 0x6A21, 0xD9BD, 0x6BCD, 0xD9BE, 0x6BDB, + 0xD9BF, 0x725F, 0xD9C0, 0x7261, 0xD9C1, 0x7441, 0xD9C2, 0x7738, 0xD9C3, 0x77DB, 0xD9C4, 0x8017, 0xD9C5, 0x82BC, 0xD9C6, 0x8305, + 0xD9C7, 0x8B00, 0xD9C8, 0x8B28, 0xD9C9, 0x8C8C, 0xD9CA, 0x6728, 0xD9CB, 0x6C90, 0xD9CC, 0x7267, 0xD9CD, 0x76EE, 0xD9CE, 0x7766, + 0xD9CF, 0x7A46, 0xD9D0, 0x9DA9, 0xD9D1, 0x6B7F, 0xD9D2, 0x6C92, 0xD9D3, 0x5922, 0xD9D4, 0x6726, 0xD9D5, 0x8499, 0xD9D6, 0x536F, + 0xD9D7, 0x5893, 0xD9D8, 0x5999, 0xD9D9, 0x5EDF, 0xD9DA, 0x63CF, 0xD9DB, 0x6634, 0xD9DC, 0x6773, 0xD9DD, 0x6E3A, 0xD9DE, 0x732B, + 0xD9DF, 0x7AD7, 0xD9E0, 0x82D7, 0xD9E1, 0x9328, 0xD9E2, 0x52D9, 0xD9E3, 0x5DEB, 0xD9E4, 0x61AE, 0xD9E5, 0x61CB, 0xD9E6, 0x620A, + 0xD9E7, 0x62C7, 0xD9E8, 0x64AB, 0xD9E9, 0x65E0, 0xD9EA, 0x6959, 0xD9EB, 0x6B66, 0xD9EC, 0x6BCB, 0xD9ED, 0x7121, 0xD9EE, 0x73F7, + 0xD9EF, 0x755D, 0xD9F0, 0x7E46, 0xD9F1, 0x821E, 0xD9F2, 0x8302, 0xD9F3, 0x856A, 0xD9F4, 0x8AA3, 0xD9F5, 0x8CBF, 0xD9F6, 0x9727, + 0xD9F7, 0x9D61, 0xD9F8, 0x58A8, 0xD9F9, 0x9ED8, 0xD9FA, 0x5011, 0xD9FB, 0x520E, 0xD9FC, 0x543B, 0xD9FD, 0x554F, 0xD9FE, 0x6587, + 0xDAA1, 0x6C76, 0xDAA2, 0x7D0A, 0xDAA3, 0x7D0B, 0xDAA4, 0x805E, 0xDAA5, 0x868A, 0xDAA6, 0x9580, 0xDAA7, 0x96EF, 0xDAA8, 0x52FF, + 0xDAA9, 0x6C95, 0xDAAA, 0x7269, 0xDAAB, 0x5473, 0xDAAC, 0x5A9A, 0xDAAD, 0x5C3E, 0xDAAE, 0x5D4B, 0xDAAF, 0x5F4C, 0xDAB0, 0x5FAE, + 0xDAB1, 0x672A, 0xDAB2, 0x68B6, 0xDAB3, 0x6963, 0xDAB4, 0x6E3C, 0xDAB5, 0x6E44, 0xDAB6, 0x7709, 0xDAB7, 0x7C73, 0xDAB8, 0x7F8E, + 0xDAB9, 0x8587, 0xDABA, 0x8B0E, 0xDABB, 0x8FF7, 0xDABC, 0x9761, 0xDABD, 0x9EF4, 0xDABE, 0x5CB7, 0xDABF, 0x60B6, 0xDAC0, 0x610D, + 0xDAC1, 0x61AB, 0xDAC2, 0x654F, 0xDAC3, 0x65FB, 0xDAC4, 0x65FC, 0xDAC5, 0x6C11, 0xDAC6, 0x6CEF, 0xDAC7, 0x739F, 0xDAC8, 0x73C9, + 0xDAC9, 0x7DE1, 0xDACA, 0x9594, 0xDACB, 0x5BC6, 0xDACC, 0x871C, 0xDACD, 0x8B10, 0xDACE, 0x525D, 0xDACF, 0x535A, 0xDAD0, 0x62CD, + 0xDAD1, 0x640F, 0xDAD2, 0x64B2, 0xDAD3, 0x6734, 0xDAD4, 0x6A38, 0xDAD5, 0x6CCA, 0xDAD6, 0x73C0, 0xDAD7, 0x749E, 0xDAD8, 0x7B94, + 0xDAD9, 0x7C95, 0xDADA, 0x7E1B, 0xDADB, 0x818A, 0xDADC, 0x8236, 0xDADD, 0x8584, 0xDADE, 0x8FEB, 0xDADF, 0x96F9, 0xDAE0, 0x99C1, + 0xDAE1, 0x4F34, 0xDAE2, 0x534A, 0xDAE3, 0x53CD, 0xDAE4, 0x53DB, 0xDAE5, 0x62CC, 0xDAE6, 0x642C, 0xDAE7, 0x6500, 0xDAE8, 0x6591, + 0xDAE9, 0x69C3, 0xDAEA, 0x6CEE, 0xDAEB, 0x6F58, 0xDAEC, 0x73ED, 0xDAED, 0x7554, 0xDAEE, 0x7622, 0xDAEF, 0x76E4, 0xDAF0, 0x76FC, + 0xDAF1, 0x78D0, 0xDAF2, 0x78FB, 0xDAF3, 0x792C, 0xDAF4, 0x7D46, 0xDAF5, 0x822C, 0xDAF6, 0x87E0, 0xDAF7, 0x8FD4, 0xDAF8, 0x9812, + 0xDAF9, 0x98EF, 0xDAFA, 0x52C3, 0xDAFB, 0x62D4, 0xDAFC, 0x64A5, 0xDAFD, 0x6E24, 0xDAFE, 0x6F51, 0xDBA1, 0x767C, 0xDBA2, 0x8DCB, + 0xDBA3, 0x91B1, 0xDBA4, 0x9262, 0xDBA5, 0x9AEE, 0xDBA6, 0x9B43, 0xDBA7, 0x5023, 0xDBA8, 0x508D, 0xDBA9, 0x574A, 0xDBAA, 0x59A8, + 0xDBAB, 0x5C28, 0xDBAC, 0x5E47, 0xDBAD, 0x5F77, 0xDBAE, 0x623F, 0xDBAF, 0x653E, 0xDBB0, 0x65B9, 0xDBB1, 0x65C1, 0xDBB2, 0x6609, + 0xDBB3, 0x678B, 0xDBB4, 0x699C, 0xDBB5, 0x6EC2, 0xDBB6, 0x78C5, 0xDBB7, 0x7D21, 0xDBB8, 0x80AA, 0xDBB9, 0x8180, 0xDBBA, 0x822B, + 0xDBBB, 0x82B3, 0xDBBC, 0x84A1, 0xDBBD, 0x868C, 0xDBBE, 0x8A2A, 0xDBBF, 0x8B17, 0xDBC0, 0x90A6, 0xDBC1, 0x9632, 0xDBC2, 0x9F90, + 0xDBC3, 0x500D, 0xDBC4, 0x4FF3, 0xDBC5, 0xF963, 0xDBC6, 0x57F9, 0xDBC7, 0x5F98, 0xDBC8, 0x62DC, 0xDBC9, 0x6392, 0xDBCA, 0x676F, + 0xDBCB, 0x6E43, 0xDBCC, 0x7119, 0xDBCD, 0x76C3, 0xDBCE, 0x80CC, 0xDBCF, 0x80DA, 0xDBD0, 0x88F4, 0xDBD1, 0x88F5, 0xDBD2, 0x8919, + 0xDBD3, 0x8CE0, 0xDBD4, 0x8F29, 0xDBD5, 0x914D, 0xDBD6, 0x966A, 0xDBD7, 0x4F2F, 0xDBD8, 0x4F70, 0xDBD9, 0x5E1B, 0xDBDA, 0x67CF, + 0xDBDB, 0x6822, 0xDBDC, 0x767D, 0xDBDD, 0x767E, 0xDBDE, 0x9B44, 0xDBDF, 0x5E61, 0xDBE0, 0x6A0A, 0xDBE1, 0x7169, 0xDBE2, 0x71D4, + 0xDBE3, 0x756A, 0xDBE4, 0xF964, 0xDBE5, 0x7E41, 0xDBE6, 0x8543, 0xDBE7, 0x85E9, 0xDBE8, 0x98DC, 0xDBE9, 0x4F10, 0xDBEA, 0x7B4F, + 0xDBEB, 0x7F70, 0xDBEC, 0x95A5, 0xDBED, 0x51E1, 0xDBEE, 0x5E06, 0xDBEF, 0x68B5, 0xDBF0, 0x6C3E, 0xDBF1, 0x6C4E, 0xDBF2, 0x6CDB, + 0xDBF3, 0x72AF, 0xDBF4, 0x7BC4, 0xDBF5, 0x8303, 0xDBF6, 0x6CD5, 0xDBF7, 0x743A, 0xDBF8, 0x50FB, 0xDBF9, 0x5288, 0xDBFA, 0x58C1, + 0xDBFB, 0x64D8, 0xDBFC, 0x6A97, 0xDBFD, 0x74A7, 0xDBFE, 0x7656, 0xDCA1, 0x78A7, 0xDCA2, 0x8617, 0xDCA3, 0x95E2, 0xDCA4, 0x9739, + 0xDCA5, 0xF965, 0xDCA6, 0x535E, 0xDCA7, 0x5F01, 0xDCA8, 0x8B8A, 0xDCA9, 0x8FA8, 0xDCAA, 0x8FAF, 0xDCAB, 0x908A, 0xDCAC, 0x5225, + 0xDCAD, 0x77A5, 0xDCAE, 0x9C49, 0xDCAF, 0x9F08, 0xDCB0, 0x4E19, 0xDCB1, 0x5002, 0xDCB2, 0x5175, 0xDCB3, 0x5C5B, 0xDCB4, 0x5E77, + 0xDCB5, 0x661E, 0xDCB6, 0x663A, 0xDCB7, 0x67C4, 0xDCB8, 0x68C5, 0xDCB9, 0x70B3, 0xDCBA, 0x7501, 0xDCBB, 0x75C5, 0xDCBC, 0x79C9, + 0xDCBD, 0x7ADD, 0xDCBE, 0x8F27, 0xDCBF, 0x9920, 0xDCC0, 0x9A08, 0xDCC1, 0x4FDD, 0xDCC2, 0x5821, 0xDCC3, 0x5831, 0xDCC4, 0x5BF6, + 0xDCC5, 0x666E, 0xDCC6, 0x6B65, 0xDCC7, 0x6D11, 0xDCC8, 0x6E7A, 0xDCC9, 0x6F7D, 0xDCCA, 0x73E4, 0xDCCB, 0x752B, 0xDCCC, 0x83E9, + 0xDCCD, 0x88DC, 0xDCCE, 0x8913, 0xDCCF, 0x8B5C, 0xDCD0, 0x8F14, 0xDCD1, 0x4F0F, 0xDCD2, 0x50D5, 0xDCD3, 0x5310, 0xDCD4, 0x535C, + 0xDCD5, 0x5B93, 0xDCD6, 0x5FA9, 0xDCD7, 0x670D, 0xDCD8, 0x798F, 0xDCD9, 0x8179, 0xDCDA, 0x832F, 0xDCDB, 0x8514, 0xDCDC, 0x8907, + 0xDCDD, 0x8986, 0xDCDE, 0x8F39, 0xDCDF, 0x8F3B, 0xDCE0, 0x99A5, 0xDCE1, 0x9C12, 0xDCE2, 0x672C, 0xDCE3, 0x4E76, 0xDCE4, 0x4FF8, + 0xDCE5, 0x5949, 0xDCE6, 0x5C01, 0xDCE7, 0x5CEF, 0xDCE8, 0x5CF0, 0xDCE9, 0x6367, 0xDCEA, 0x68D2, 0xDCEB, 0x70FD, 0xDCEC, 0x71A2, + 0xDCED, 0x742B, 0xDCEE, 0x7E2B, 0xDCEF, 0x84EC, 0xDCF0, 0x8702, 0xDCF1, 0x9022, 0xDCF2, 0x92D2, 0xDCF3, 0x9CF3, 0xDCF4, 0x4E0D, + 0xDCF5, 0x4ED8, 0xDCF6, 0x4FEF, 0xDCF7, 0x5085, 0xDCF8, 0x5256, 0xDCF9, 0x526F, 0xDCFA, 0x5426, 0xDCFB, 0x5490, 0xDCFC, 0x57E0, + 0xDCFD, 0x592B, 0xDCFE, 0x5A66, 0xDDA1, 0x5B5A, 0xDDA2, 0x5B75, 0xDDA3, 0x5BCC, 0xDDA4, 0x5E9C, 0xDDA5, 0xF966, 0xDDA6, 0x6276, + 0xDDA7, 0x6577, 0xDDA8, 0x65A7, 0xDDA9, 0x6D6E, 0xDDAA, 0x6EA5, 0xDDAB, 0x7236, 0xDDAC, 0x7B26, 0xDDAD, 0x7C3F, 0xDDAE, 0x7F36, + 0xDDAF, 0x8150, 0xDDB0, 0x8151, 0xDDB1, 0x819A, 0xDDB2, 0x8240, 0xDDB3, 0x8299, 0xDDB4, 0x83A9, 0xDDB5, 0x8A03, 0xDDB6, 0x8CA0, + 0xDDB7, 0x8CE6, 0xDDB8, 0x8CFB, 0xDDB9, 0x8D74, 0xDDBA, 0x8DBA, 0xDDBB, 0x90E8, 0xDDBC, 0x91DC, 0xDDBD, 0x961C, 0xDDBE, 0x9644, + 0xDDBF, 0x99D9, 0xDDC0, 0x9CE7, 0xDDC1, 0x5317, 0xDDC2, 0x5206, 0xDDC3, 0x5429, 0xDDC4, 0x5674, 0xDDC5, 0x58B3, 0xDDC6, 0x5954, + 0xDDC7, 0x596E, 0xDDC8, 0x5FFF, 0xDDC9, 0x61A4, 0xDDCA, 0x626E, 0xDDCB, 0x6610, 0xDDCC, 0x6C7E, 0xDDCD, 0x711A, 0xDDCE, 0x76C6, + 0xDDCF, 0x7C89, 0xDDD0, 0x7CDE, 0xDDD1, 0x7D1B, 0xDDD2, 0x82AC, 0xDDD3, 0x8CC1, 0xDDD4, 0x96F0, 0xDDD5, 0xF967, 0xDDD6, 0x4F5B, + 0xDDD7, 0x5F17, 0xDDD8, 0x5F7F, 0xDDD9, 0x62C2, 0xDDDA, 0x5D29, 0xDDDB, 0x670B, 0xDDDC, 0x68DA, 0xDDDD, 0x787C, 0xDDDE, 0x7E43, + 0xDDDF, 0x9D6C, 0xDDE0, 0x4E15, 0xDDE1, 0x5099, 0xDDE2, 0x5315, 0xDDE3, 0x532A, 0xDDE4, 0x5351, 0xDDE5, 0x5983, 0xDDE6, 0x5A62, + 0xDDE7, 0x5E87, 0xDDE8, 0x60B2, 0xDDE9, 0x618A, 0xDDEA, 0x6249, 0xDDEB, 0x6279, 0xDDEC, 0x6590, 0xDDED, 0x6787, 0xDDEE, 0x69A7, + 0xDDEF, 0x6BD4, 0xDDF0, 0x6BD6, 0xDDF1, 0x6BD7, 0xDDF2, 0x6BD8, 0xDDF3, 0x6CB8, 0xDDF4, 0xF968, 0xDDF5, 0x7435, 0xDDF6, 0x75FA, + 0xDDF7, 0x7812, 0xDDF8, 0x7891, 0xDDF9, 0x79D5, 0xDDFA, 0x79D8, 0xDDFB, 0x7C83, 0xDDFC, 0x7DCB, 0xDDFD, 0x7FE1, 0xDDFE, 0x80A5, + 0xDEA1, 0x813E, 0xDEA2, 0x81C2, 0xDEA3, 0x83F2, 0xDEA4, 0x871A, 0xDEA5, 0x88E8, 0xDEA6, 0x8AB9, 0xDEA7, 0x8B6C, 0xDEA8, 0x8CBB, + 0xDEA9, 0x9119, 0xDEAA, 0x975E, 0xDEAB, 0x98DB, 0xDEAC, 0x9F3B, 0xDEAD, 0x56AC, 0xDEAE, 0x5B2A, 0xDEAF, 0x5F6C, 0xDEB0, 0x658C, + 0xDEB1, 0x6AB3, 0xDEB2, 0x6BAF, 0xDEB3, 0x6D5C, 0xDEB4, 0x6FF1, 0xDEB5, 0x7015, 0xDEB6, 0x725D, 0xDEB7, 0x73AD, 0xDEB8, 0x8CA7, + 0xDEB9, 0x8CD3, 0xDEBA, 0x983B, 0xDEBB, 0x6191, 0xDEBC, 0x6C37, 0xDEBD, 0x8058, 0xDEBE, 0x9A01, 0xDEBF, 0x4E4D, 0xDEC0, 0x4E8B, + 0xDEC1, 0x4E9B, 0xDEC2, 0x4ED5, 0xDEC3, 0x4F3A, 0xDEC4, 0x4F3C, 0xDEC5, 0x4F7F, 0xDEC6, 0x4FDF, 0xDEC7, 0x50FF, 0xDEC8, 0x53F2, + 0xDEC9, 0x53F8, 0xDECA, 0x5506, 0xDECB, 0x55E3, 0xDECC, 0x56DB, 0xDECD, 0x58EB, 0xDECE, 0x5962, 0xDECF, 0x5A11, 0xDED0, 0x5BEB, + 0xDED1, 0x5BFA, 0xDED2, 0x5C04, 0xDED3, 0x5DF3, 0xDED4, 0x5E2B, 0xDED5, 0x5F99, 0xDED6, 0x601D, 0xDED7, 0x6368, 0xDED8, 0x659C, + 0xDED9, 0x65AF, 0xDEDA, 0x67F6, 0xDEDB, 0x67FB, 0xDEDC, 0x68AD, 0xDEDD, 0x6B7B, 0xDEDE, 0x6C99, 0xDEDF, 0x6CD7, 0xDEE0, 0x6E23, + 0xDEE1, 0x7009, 0xDEE2, 0x7345, 0xDEE3, 0x7802, 0xDEE4, 0x793E, 0xDEE5, 0x7940, 0xDEE6, 0x7960, 0xDEE7, 0x79C1, 0xDEE8, 0x7BE9, + 0xDEE9, 0x7D17, 0xDEEA, 0x7D72, 0xDEEB, 0x8086, 0xDEEC, 0x820D, 0xDEED, 0x838E, 0xDEEE, 0x84D1, 0xDEEF, 0x86C7, 0xDEF0, 0x88DF, + 0xDEF1, 0x8A50, 0xDEF2, 0x8A5E, 0xDEF3, 0x8B1D, 0xDEF4, 0x8CDC, 0xDEF5, 0x8D66, 0xDEF6, 0x8FAD, 0xDEF7, 0x90AA, 0xDEF8, 0x98FC, + 0xDEF9, 0x99DF, 0xDEFA, 0x9E9D, 0xDEFB, 0x524A, 0xDEFC, 0xF969, 0xDEFD, 0x6714, 0xDEFE, 0xF96A, 0xDFA1, 0x5098, 0xDFA2, 0x522A, + 0xDFA3, 0x5C71, 0xDFA4, 0x6563, 0xDFA5, 0x6C55, 0xDFA6, 0x73CA, 0xDFA7, 0x7523, 0xDFA8, 0x759D, 0xDFA9, 0x7B97, 0xDFAA, 0x849C, + 0xDFAB, 0x9178, 0xDFAC, 0x9730, 0xDFAD, 0x4E77, 0xDFAE, 0x6492, 0xDFAF, 0x6BBA, 0xDFB0, 0x715E, 0xDFB1, 0x85A9, 0xDFB2, 0x4E09, + 0xDFB3, 0xF96B, 0xDFB4, 0x6749, 0xDFB5, 0x68EE, 0xDFB6, 0x6E17, 0xDFB7, 0x829F, 0xDFB8, 0x8518, 0xDFB9, 0x886B, 0xDFBA, 0x63F7, + 0xDFBB, 0x6F81, 0xDFBC, 0x9212, 0xDFBD, 0x98AF, 0xDFBE, 0x4E0A, 0xDFBF, 0x50B7, 0xDFC0, 0x50CF, 0xDFC1, 0x511F, 0xDFC2, 0x5546, + 0xDFC3, 0x55AA, 0xDFC4, 0x5617, 0xDFC5, 0x5B40, 0xDFC6, 0x5C19, 0xDFC7, 0x5CE0, 0xDFC8, 0x5E38, 0xDFC9, 0x5E8A, 0xDFCA, 0x5EA0, + 0xDFCB, 0x5EC2, 0xDFCC, 0x60F3, 0xDFCD, 0x6851, 0xDFCE, 0x6A61, 0xDFCF, 0x6E58, 0xDFD0, 0x723D, 0xDFD1, 0x7240, 0xDFD2, 0x72C0, + 0xDFD3, 0x76F8, 0xDFD4, 0x7965, 0xDFD5, 0x7BB1, 0xDFD6, 0x7FD4, 0xDFD7, 0x88F3, 0xDFD8, 0x89F4, 0xDFD9, 0x8A73, 0xDFDA, 0x8C61, + 0xDFDB, 0x8CDE, 0xDFDC, 0x971C, 0xDFDD, 0x585E, 0xDFDE, 0x74BD, 0xDFDF, 0x8CFD, 0xDFE0, 0x55C7, 0xDFE1, 0xF96C, 0xDFE2, 0x7A61, + 0xDFE3, 0x7D22, 0xDFE4, 0x8272, 0xDFE5, 0x7272, 0xDFE6, 0x751F, 0xDFE7, 0x7525, 0xDFE8, 0xF96D, 0xDFE9, 0x7B19, 0xDFEA, 0x5885, + 0xDFEB, 0x58FB, 0xDFEC, 0x5DBC, 0xDFED, 0x5E8F, 0xDFEE, 0x5EB6, 0xDFEF, 0x5F90, 0xDFF0, 0x6055, 0xDFF1, 0x6292, 0xDFF2, 0x637F, + 0xDFF3, 0x654D, 0xDFF4, 0x6691, 0xDFF5, 0x66D9, 0xDFF6, 0x66F8, 0xDFF7, 0x6816, 0xDFF8, 0x68F2, 0xDFF9, 0x7280, 0xDFFA, 0x745E, + 0xDFFB, 0x7B6E, 0xDFFC, 0x7D6E, 0xDFFD, 0x7DD6, 0xDFFE, 0x7F72, 0xE0A1, 0x80E5, 0xE0A2, 0x8212, 0xE0A3, 0x85AF, 0xE0A4, 0x897F, + 0xE0A5, 0x8A93, 0xE0A6, 0x901D, 0xE0A7, 0x92E4, 0xE0A8, 0x9ECD, 0xE0A9, 0x9F20, 0xE0AA, 0x5915, 0xE0AB, 0x596D, 0xE0AC, 0x5E2D, + 0xE0AD, 0x60DC, 0xE0AE, 0x6614, 0xE0AF, 0x6673, 0xE0B0, 0x6790, 0xE0B1, 0x6C50, 0xE0B2, 0x6DC5, 0xE0B3, 0x6F5F, 0xE0B4, 0x77F3, + 0xE0B5, 0x78A9, 0xE0B6, 0x84C6, 0xE0B7, 0x91CB, 0xE0B8, 0x932B, 0xE0B9, 0x4ED9, 0xE0BA, 0x50CA, 0xE0BB, 0x5148, 0xE0BC, 0x5584, + 0xE0BD, 0x5B0B, 0xE0BE, 0x5BA3, 0xE0BF, 0x6247, 0xE0C0, 0x657E, 0xE0C1, 0x65CB, 0xE0C2, 0x6E32, 0xE0C3, 0x717D, 0xE0C4, 0x7401, + 0xE0C5, 0x7444, 0xE0C6, 0x7487, 0xE0C7, 0x74BF, 0xE0C8, 0x766C, 0xE0C9, 0x79AA, 0xE0CA, 0x7DDA, 0xE0CB, 0x7E55, 0xE0CC, 0x7FA8, + 0xE0CD, 0x817A, 0xE0CE, 0x81B3, 0xE0CF, 0x8239, 0xE0D0, 0x861A, 0xE0D1, 0x87EC, 0xE0D2, 0x8A75, 0xE0D3, 0x8DE3, 0xE0D4, 0x9078, + 0xE0D5, 0x9291, 0xE0D6, 0x9425, 0xE0D7, 0x994D, 0xE0D8, 0x9BAE, 0xE0D9, 0x5368, 0xE0DA, 0x5C51, 0xE0DB, 0x6954, 0xE0DC, 0x6CC4, + 0xE0DD, 0x6D29, 0xE0DE, 0x6E2B, 0xE0DF, 0x820C, 0xE0E0, 0x859B, 0xE0E1, 0x893B, 0xE0E2, 0x8A2D, 0xE0E3, 0x8AAA, 0xE0E4, 0x96EA, + 0xE0E5, 0x9F67, 0xE0E6, 0x5261, 0xE0E7, 0x66B9, 0xE0E8, 0x6BB2, 0xE0E9, 0x7E96, 0xE0EA, 0x87FE, 0xE0EB, 0x8D0D, 0xE0EC, 0x9583, + 0xE0ED, 0x965D, 0xE0EE, 0x651D, 0xE0EF, 0x6D89, 0xE0F0, 0x71EE, 0xE0F1, 0xF96E, 0xE0F2, 0x57CE, 0xE0F3, 0x59D3, 0xE0F4, 0x5BAC, + 0xE0F5, 0x6027, 0xE0F6, 0x60FA, 0xE0F7, 0x6210, 0xE0F8, 0x661F, 0xE0F9, 0x665F, 0xE0FA, 0x7329, 0xE0FB, 0x73F9, 0xE0FC, 0x76DB, + 0xE0FD, 0x7701, 0xE0FE, 0x7B6C, 0xE1A1, 0x8056, 0xE1A2, 0x8072, 0xE1A3, 0x8165, 0xE1A4, 0x8AA0, 0xE1A5, 0x9192, 0xE1A6, 0x4E16, + 0xE1A7, 0x52E2, 0xE1A8, 0x6B72, 0xE1A9, 0x6D17, 0xE1AA, 0x7A05, 0xE1AB, 0x7B39, 0xE1AC, 0x7D30, 0xE1AD, 0xF96F, 0xE1AE, 0x8CB0, + 0xE1AF, 0x53EC, 0xE1B0, 0x562F, 0xE1B1, 0x5851, 0xE1B2, 0x5BB5, 0xE1B3, 0x5C0F, 0xE1B4, 0x5C11, 0xE1B5, 0x5DE2, 0xE1B6, 0x6240, + 0xE1B7, 0x6383, 0xE1B8, 0x6414, 0xE1B9, 0x662D, 0xE1BA, 0x68B3, 0xE1BB, 0x6CBC, 0xE1BC, 0x6D88, 0xE1BD, 0x6EAF, 0xE1BE, 0x701F, + 0xE1BF, 0x70A4, 0xE1C0, 0x71D2, 0xE1C1, 0x7526, 0xE1C2, 0x758F, 0xE1C3, 0x758E, 0xE1C4, 0x7619, 0xE1C5, 0x7B11, 0xE1C6, 0x7BE0, + 0xE1C7, 0x7C2B, 0xE1C8, 0x7D20, 0xE1C9, 0x7D39, 0xE1CA, 0x852C, 0xE1CB, 0x856D, 0xE1CC, 0x8607, 0xE1CD, 0x8A34, 0xE1CE, 0x900D, + 0xE1CF, 0x9061, 0xE1D0, 0x90B5, 0xE1D1, 0x92B7, 0xE1D2, 0x97F6, 0xE1D3, 0x9A37, 0xE1D4, 0x4FD7, 0xE1D5, 0x5C6C, 0xE1D6, 0x675F, + 0xE1D7, 0x6D91, 0xE1D8, 0x7C9F, 0xE1D9, 0x7E8C, 0xE1DA, 0x8B16, 0xE1DB, 0x8D16, 0xE1DC, 0x901F, 0xE1DD, 0x5B6B, 0xE1DE, 0x5DFD, + 0xE1DF, 0x640D, 0xE1E0, 0x84C0, 0xE1E1, 0x905C, 0xE1E2, 0x98E1, 0xE1E3, 0x7387, 0xE1E4, 0x5B8B, 0xE1E5, 0x609A, 0xE1E6, 0x677E, + 0xE1E7, 0x6DDE, 0xE1E8, 0x8A1F, 0xE1E9, 0x8AA6, 0xE1EA, 0x9001, 0xE1EB, 0x980C, 0xE1EC, 0x5237, 0xE1ED, 0xF970, 0xE1EE, 0x7051, + 0xE1EF, 0x788E, 0xE1F0, 0x9396, 0xE1F1, 0x8870, 0xE1F2, 0x91D7, 0xE1F3, 0x4FEE, 0xE1F4, 0x53D7, 0xE1F5, 0x55FD, 0xE1F6, 0x56DA, + 0xE1F7, 0x5782, 0xE1F8, 0x58FD, 0xE1F9, 0x5AC2, 0xE1FA, 0x5B88, 0xE1FB, 0x5CAB, 0xE1FC, 0x5CC0, 0xE1FD, 0x5E25, 0xE1FE, 0x6101, + 0xE2A1, 0x620D, 0xE2A2, 0x624B, 0xE2A3, 0x6388, 0xE2A4, 0x641C, 0xE2A5, 0x6536, 0xE2A6, 0x6578, 0xE2A7, 0x6A39, 0xE2A8, 0x6B8A, + 0xE2A9, 0x6C34, 0xE2AA, 0x6D19, 0xE2AB, 0x6F31, 0xE2AC, 0x71E7, 0xE2AD, 0x72E9, 0xE2AE, 0x7378, 0xE2AF, 0x7407, 0xE2B0, 0x74B2, + 0xE2B1, 0x7626, 0xE2B2, 0x7761, 0xE2B3, 0x79C0, 0xE2B4, 0x7A57, 0xE2B5, 0x7AEA, 0xE2B6, 0x7CB9, 0xE2B7, 0x7D8F, 0xE2B8, 0x7DAC, + 0xE2B9, 0x7E61, 0xE2BA, 0x7F9E, 0xE2BB, 0x8129, 0xE2BC, 0x8331, 0xE2BD, 0x8490, 0xE2BE, 0x84DA, 0xE2BF, 0x85EA, 0xE2C0, 0x8896, + 0xE2C1, 0x8AB0, 0xE2C2, 0x8B90, 0xE2C3, 0x8F38, 0xE2C4, 0x9042, 0xE2C5, 0x9083, 0xE2C6, 0x916C, 0xE2C7, 0x9296, 0xE2C8, 0x92B9, + 0xE2C9, 0x968B, 0xE2CA, 0x96A7, 0xE2CB, 0x96A8, 0xE2CC, 0x96D6, 0xE2CD, 0x9700, 0xE2CE, 0x9808, 0xE2CF, 0x9996, 0xE2D0, 0x9AD3, + 0xE2D1, 0x9B1A, 0xE2D2, 0x53D4, 0xE2D3, 0x587E, 0xE2D4, 0x5919, 0xE2D5, 0x5B70, 0xE2D6, 0x5BBF, 0xE2D7, 0x6DD1, 0xE2D8, 0x6F5A, + 0xE2D9, 0x719F, 0xE2DA, 0x7421, 0xE2DB, 0x74B9, 0xE2DC, 0x8085, 0xE2DD, 0x83FD, 0xE2DE, 0x5DE1, 0xE2DF, 0x5F87, 0xE2E0, 0x5FAA, + 0xE2E1, 0x6042, 0xE2E2, 0x65EC, 0xE2E3, 0x6812, 0xE2E4, 0x696F, 0xE2E5, 0x6A53, 0xE2E6, 0x6B89, 0xE2E7, 0x6D35, 0xE2E8, 0x6DF3, + 0xE2E9, 0x73E3, 0xE2EA, 0x76FE, 0xE2EB, 0x77AC, 0xE2EC, 0x7B4D, 0xE2ED, 0x7D14, 0xE2EE, 0x8123, 0xE2EF, 0x821C, 0xE2F0, 0x8340, + 0xE2F1, 0x84F4, 0xE2F2, 0x8563, 0xE2F3, 0x8A62, 0xE2F4, 0x8AC4, 0xE2F5, 0x9187, 0xE2F6, 0x931E, 0xE2F7, 0x9806, 0xE2F8, 0x99B4, + 0xE2F9, 0x620C, 0xE2FA, 0x8853, 0xE2FB, 0x8FF0, 0xE2FC, 0x9265, 0xE2FD, 0x5D07, 0xE2FE, 0x5D27, 0xE3A1, 0x5D69, 0xE3A2, 0x745F, + 0xE3A3, 0x819D, 0xE3A4, 0x8768, 0xE3A5, 0x6FD5, 0xE3A6, 0x62FE, 0xE3A7, 0x7FD2, 0xE3A8, 0x8936, 0xE3A9, 0x8972, 0xE3AA, 0x4E1E, + 0xE3AB, 0x4E58, 0xE3AC, 0x50E7, 0xE3AD, 0x52DD, 0xE3AE, 0x5347, 0xE3AF, 0x627F, 0xE3B0, 0x6607, 0xE3B1, 0x7E69, 0xE3B2, 0x8805, + 0xE3B3, 0x965E, 0xE3B4, 0x4F8D, 0xE3B5, 0x5319, 0xE3B6, 0x5636, 0xE3B7, 0x59CB, 0xE3B8, 0x5AA4, 0xE3B9, 0x5C38, 0xE3BA, 0x5C4E, + 0xE3BB, 0x5C4D, 0xE3BC, 0x5E02, 0xE3BD, 0x5F11, 0xE3BE, 0x6043, 0xE3BF, 0x65BD, 0xE3C0, 0x662F, 0xE3C1, 0x6642, 0xE3C2, 0x67BE, + 0xE3C3, 0x67F4, 0xE3C4, 0x731C, 0xE3C5, 0x77E2, 0xE3C6, 0x793A, 0xE3C7, 0x7FC5, 0xE3C8, 0x8494, 0xE3C9, 0x84CD, 0xE3CA, 0x8996, + 0xE3CB, 0x8A66, 0xE3CC, 0x8A69, 0xE3CD, 0x8AE1, 0xE3CE, 0x8C55, 0xE3CF, 0x8C7A, 0xE3D0, 0x57F4, 0xE3D1, 0x5BD4, 0xE3D2, 0x5F0F, + 0xE3D3, 0x606F, 0xE3D4, 0x62ED, 0xE3D5, 0x690D, 0xE3D6, 0x6B96, 0xE3D7, 0x6E5C, 0xE3D8, 0x7184, 0xE3D9, 0x7BD2, 0xE3DA, 0x8755, + 0xE3DB, 0x8B58, 0xE3DC, 0x8EFE, 0xE3DD, 0x98DF, 0xE3DE, 0x98FE, 0xE3DF, 0x4F38, 0xE3E0, 0x4F81, 0xE3E1, 0x4FE1, 0xE3E2, 0x547B, + 0xE3E3, 0x5A20, 0xE3E4, 0x5BB8, 0xE3E5, 0x613C, 0xE3E6, 0x65B0, 0xE3E7, 0x6668, 0xE3E8, 0x71FC, 0xE3E9, 0x7533, 0xE3EA, 0x795E, + 0xE3EB, 0x7D33, 0xE3EC, 0x814E, 0xE3ED, 0x81E3, 0xE3EE, 0x8398, 0xE3EF, 0x85AA, 0xE3F0, 0x85CE, 0xE3F1, 0x8703, 0xE3F2, 0x8A0A, + 0xE3F3, 0x8EAB, 0xE3F4, 0x8F9B, 0xE3F5, 0xF971, 0xE3F6, 0x8FC5, 0xE3F7, 0x5931, 0xE3F8, 0x5BA4, 0xE3F9, 0x5BE6, 0xE3FA, 0x6089, + 0xE3FB, 0x5BE9, 0xE3FC, 0x5C0B, 0xE3FD, 0x5FC3, 0xE3FE, 0x6C81, 0xE4A1, 0xF972, 0xE4A2, 0x6DF1, 0xE4A3, 0x700B, 0xE4A4, 0x751A, + 0xE4A5, 0x82AF, 0xE4A6, 0x8AF6, 0xE4A7, 0x4EC0, 0xE4A8, 0x5341, 0xE4A9, 0xF973, 0xE4AA, 0x96D9, 0xE4AB, 0x6C0F, 0xE4AC, 0x4E9E, + 0xE4AD, 0x4FC4, 0xE4AE, 0x5152, 0xE4AF, 0x555E, 0xE4B0, 0x5A25, 0xE4B1, 0x5CE8, 0xE4B2, 0x6211, 0xE4B3, 0x7259, 0xE4B4, 0x82BD, + 0xE4B5, 0x83AA, 0xE4B6, 0x86FE, 0xE4B7, 0x8859, 0xE4B8, 0x8A1D, 0xE4B9, 0x963F, 0xE4BA, 0x96C5, 0xE4BB, 0x9913, 0xE4BC, 0x9D09, + 0xE4BD, 0x9D5D, 0xE4BE, 0x580A, 0xE4BF, 0x5CB3, 0xE4C0, 0x5DBD, 0xE4C1, 0x5E44, 0xE4C2, 0x60E1, 0xE4C3, 0x6115, 0xE4C4, 0x63E1, + 0xE4C5, 0x6A02, 0xE4C6, 0x6E25, 0xE4C7, 0x9102, 0xE4C8, 0x9354, 0xE4C9, 0x984E, 0xE4CA, 0x9C10, 0xE4CB, 0x9F77, 0xE4CC, 0x5B89, + 0xE4CD, 0x5CB8, 0xE4CE, 0x6309, 0xE4CF, 0x664F, 0xE4D0, 0x6848, 0xE4D1, 0x773C, 0xE4D2, 0x96C1, 0xE4D3, 0x978D, 0xE4D4, 0x9854, + 0xE4D5, 0x9B9F, 0xE4D6, 0x65A1, 0xE4D7, 0x8B01, 0xE4D8, 0x8ECB, 0xE4D9, 0x95BC, 0xE4DA, 0x5535, 0xE4DB, 0x5CA9, 0xE4DC, 0x5DD6, + 0xE4DD, 0x5EB5, 0xE4DE, 0x6697, 0xE4DF, 0x764C, 0xE4E0, 0x83F4, 0xE4E1, 0x95C7, 0xE4E2, 0x58D3, 0xE4E3, 0x62BC, 0xE4E4, 0x72CE, + 0xE4E5, 0x9D28, 0xE4E6, 0x4EF0, 0xE4E7, 0x592E, 0xE4E8, 0x600F, 0xE4E9, 0x663B, 0xE4EA, 0x6B83, 0xE4EB, 0x79E7, 0xE4EC, 0x9D26, + 0xE4ED, 0x5393, 0xE4EE, 0x54C0, 0xE4EF, 0x57C3, 0xE4F0, 0x5D16, 0xE4F1, 0x611B, 0xE4F2, 0x66D6, 0xE4F3, 0x6DAF, 0xE4F4, 0x788D, + 0xE4F5, 0x827E, 0xE4F6, 0x9698, 0xE4F7, 0x9744, 0xE4F8, 0x5384, 0xE4F9, 0x627C, 0xE4FA, 0x6396, 0xE4FB, 0x6DB2, 0xE4FC, 0x7E0A, + 0xE4FD, 0x814B, 0xE4FE, 0x984D, 0xE5A1, 0x6AFB, 0xE5A2, 0x7F4C, 0xE5A3, 0x9DAF, 0xE5A4, 0x9E1A, 0xE5A5, 0x4E5F, 0xE5A6, 0x503B, + 0xE5A7, 0x51B6, 0xE5A8, 0x591C, 0xE5A9, 0x60F9, 0xE5AA, 0x63F6, 0xE5AB, 0x6930, 0xE5AC, 0x723A, 0xE5AD, 0x8036, 0xE5AE, 0xF974, + 0xE5AF, 0x91CE, 0xE5B0, 0x5F31, 0xE5B1, 0xF975, 0xE5B2, 0xF976, 0xE5B3, 0x7D04, 0xE5B4, 0x82E5, 0xE5B5, 0x846F, 0xE5B6, 0x84BB, + 0xE5B7, 0x85E5, 0xE5B8, 0x8E8D, 0xE5B9, 0xF977, 0xE5BA, 0x4F6F, 0xE5BB, 0xF978, 0xE5BC, 0xF979, 0xE5BD, 0x58E4, 0xE5BE, 0x5B43, + 0xE5BF, 0x6059, 0xE5C0, 0x63DA, 0xE5C1, 0x6518, 0xE5C2, 0x656D, 0xE5C3, 0x6698, 0xE5C4, 0xF97A, 0xE5C5, 0x694A, 0xE5C6, 0x6A23, + 0xE5C7, 0x6D0B, 0xE5C8, 0x7001, 0xE5C9, 0x716C, 0xE5CA, 0x75D2, 0xE5CB, 0x760D, 0xE5CC, 0x79B3, 0xE5CD, 0x7A70, 0xE5CE, 0xF97B, + 0xE5CF, 0x7F8A, 0xE5D0, 0xF97C, 0xE5D1, 0x8944, 0xE5D2, 0xF97D, 0xE5D3, 0x8B93, 0xE5D4, 0x91C0, 0xE5D5, 0x967D, 0xE5D6, 0xF97E, + 0xE5D7, 0x990A, 0xE5D8, 0x5704, 0xE5D9, 0x5FA1, 0xE5DA, 0x65BC, 0xE5DB, 0x6F01, 0xE5DC, 0x7600, 0xE5DD, 0x79A6, 0xE5DE, 0x8A9E, + 0xE5DF, 0x99AD, 0xE5E0, 0x9B5A, 0xE5E1, 0x9F6C, 0xE5E2, 0x5104, 0xE5E3, 0x61B6, 0xE5E4, 0x6291, 0xE5E5, 0x6A8D, 0xE5E6, 0x81C6, + 0xE5E7, 0x5043, 0xE5E8, 0x5830, 0xE5E9, 0x5F66, 0xE5EA, 0x7109, 0xE5EB, 0x8A00, 0xE5EC, 0x8AFA, 0xE5ED, 0x5B7C, 0xE5EE, 0x8616, + 0xE5EF, 0x4FFA, 0xE5F0, 0x513C, 0xE5F1, 0x56B4, 0xE5F2, 0x5944, 0xE5F3, 0x63A9, 0xE5F4, 0x6DF9, 0xE5F5, 0x5DAA, 0xE5F6, 0x696D, + 0xE5F7, 0x5186, 0xE5F8, 0x4E88, 0xE5F9, 0x4F59, 0xE5FA, 0xF97F, 0xE5FB, 0xF980, 0xE5FC, 0xF981, 0xE5FD, 0x5982, 0xE5FE, 0xF982, + 0xE6A1, 0xF983, 0xE6A2, 0x6B5F, 0xE6A3, 0x6C5D, 0xE6A4, 0xF984, 0xE6A5, 0x74B5, 0xE6A6, 0x7916, 0xE6A7, 0xF985, 0xE6A8, 0x8207, + 0xE6A9, 0x8245, 0xE6AA, 0x8339, 0xE6AB, 0x8F3F, 0xE6AC, 0x8F5D, 0xE6AD, 0xF986, 0xE6AE, 0x9918, 0xE6AF, 0xF987, 0xE6B0, 0xF988, + 0xE6B1, 0xF989, 0xE6B2, 0x4EA6, 0xE6B3, 0xF98A, 0xE6B4, 0x57DF, 0xE6B5, 0x5F79, 0xE6B6, 0x6613, 0xE6B7, 0xF98B, 0xE6B8, 0xF98C, + 0xE6B9, 0x75AB, 0xE6BA, 0x7E79, 0xE6BB, 0x8B6F, 0xE6BC, 0xF98D, 0xE6BD, 0x9006, 0xE6BE, 0x9A5B, 0xE6BF, 0x56A5, 0xE6C0, 0x5827, + 0xE6C1, 0x59F8, 0xE6C2, 0x5A1F, 0xE6C3, 0x5BB4, 0xE6C4, 0xF98E, 0xE6C5, 0x5EF6, 0xE6C6, 0xF98F, 0xE6C7, 0xF990, 0xE6C8, 0x6350, + 0xE6C9, 0x633B, 0xE6CA, 0xF991, 0xE6CB, 0x693D, 0xE6CC, 0x6C87, 0xE6CD, 0x6CBF, 0xE6CE, 0x6D8E, 0xE6CF, 0x6D93, 0xE6D0, 0x6DF5, + 0xE6D1, 0x6F14, 0xE6D2, 0xF992, 0xE6D3, 0x70DF, 0xE6D4, 0x7136, 0xE6D5, 0x7159, 0xE6D6, 0xF993, 0xE6D7, 0x71C3, 0xE6D8, 0x71D5, + 0xE6D9, 0xF994, 0xE6DA, 0x784F, 0xE6DB, 0x786F, 0xE6DC, 0xF995, 0xE6DD, 0x7B75, 0xE6DE, 0x7DE3, 0xE6DF, 0xF996, 0xE6E0, 0x7E2F, + 0xE6E1, 0xF997, 0xE6E2, 0x884D, 0xE6E3, 0x8EDF, 0xE6E4, 0xF998, 0xE6E5, 0xF999, 0xE6E6, 0xF99A, 0xE6E7, 0x925B, 0xE6E8, 0xF99B, + 0xE6E9, 0x9CF6, 0xE6EA, 0xF99C, 0xE6EB, 0xF99D, 0xE6EC, 0xF99E, 0xE6ED, 0x6085, 0xE6EE, 0x6D85, 0xE6EF, 0xF99F, 0xE6F0, 0x71B1, + 0xE6F1, 0xF9A0, 0xE6F2, 0xF9A1, 0xE6F3, 0x95B1, 0xE6F4, 0x53AD, 0xE6F5, 0xF9A2, 0xE6F6, 0xF9A3, 0xE6F7, 0xF9A4, 0xE6F8, 0x67D3, + 0xE6F9, 0xF9A5, 0xE6FA, 0x708E, 0xE6FB, 0x7130, 0xE6FC, 0x7430, 0xE6FD, 0x8276, 0xE6FE, 0x82D2, 0xE7A1, 0xF9A6, 0xE7A2, 0x95BB, + 0xE7A3, 0x9AE5, 0xE7A4, 0x9E7D, 0xE7A5, 0x66C4, 0xE7A6, 0xF9A7, 0xE7A7, 0x71C1, 0xE7A8, 0x8449, 0xE7A9, 0xF9A8, 0xE7AA, 0xF9A9, + 0xE7AB, 0x584B, 0xE7AC, 0xF9AA, 0xE7AD, 0xF9AB, 0xE7AE, 0x5DB8, 0xE7AF, 0x5F71, 0xE7B0, 0xF9AC, 0xE7B1, 0x6620, 0xE7B2, 0x668E, + 0xE7B3, 0x6979, 0xE7B4, 0x69AE, 0xE7B5, 0x6C38, 0xE7B6, 0x6CF3, 0xE7B7, 0x6E36, 0xE7B8, 0x6F41, 0xE7B9, 0x6FDA, 0xE7BA, 0x701B, + 0xE7BB, 0x702F, 0xE7BC, 0x7150, 0xE7BD, 0x71DF, 0xE7BE, 0x7370, 0xE7BF, 0xF9AD, 0xE7C0, 0x745B, 0xE7C1, 0xF9AE, 0xE7C2, 0x74D4, + 0xE7C3, 0x76C8, 0xE7C4, 0x7A4E, 0xE7C5, 0x7E93, 0xE7C6, 0xF9AF, 0xE7C7, 0xF9B0, 0xE7C8, 0x82F1, 0xE7C9, 0x8A60, 0xE7CA, 0x8FCE, + 0xE7CB, 0xF9B1, 0xE7CC, 0x9348, 0xE7CD, 0xF9B2, 0xE7CE, 0x9719, 0xE7CF, 0xF9B3, 0xE7D0, 0xF9B4, 0xE7D1, 0x4E42, 0xE7D2, 0x502A, + 0xE7D3, 0xF9B5, 0xE7D4, 0x5208, 0xE7D5, 0x53E1, 0xE7D6, 0x66F3, 0xE7D7, 0x6C6D, 0xE7D8, 0x6FCA, 0xE7D9, 0x730A, 0xE7DA, 0x777F, + 0xE7DB, 0x7A62, 0xE7DC, 0x82AE, 0xE7DD, 0x85DD, 0xE7DE, 0x8602, 0xE7DF, 0xF9B6, 0xE7E0, 0x88D4, 0xE7E1, 0x8A63, 0xE7E2, 0x8B7D, + 0xE7E3, 0x8C6B, 0xE7E4, 0xF9B7, 0xE7E5, 0x92B3, 0xE7E6, 0xF9B8, 0xE7E7, 0x9713, 0xE7E8, 0x9810, 0xE7E9, 0x4E94, 0xE7EA, 0x4F0D, + 0xE7EB, 0x4FC9, 0xE7EC, 0x50B2, 0xE7ED, 0x5348, 0xE7EE, 0x543E, 0xE7EF, 0x5433, 0xE7F0, 0x55DA, 0xE7F1, 0x5862, 0xE7F2, 0x58BA, + 0xE7F3, 0x5967, 0xE7F4, 0x5A1B, 0xE7F5, 0x5BE4, 0xE7F6, 0x609F, 0xE7F7, 0xF9B9, 0xE7F8, 0x61CA, 0xE7F9, 0x6556, 0xE7FA, 0x65FF, + 0xE7FB, 0x6664, 0xE7FC, 0x68A7, 0xE7FD, 0x6C5A, 0xE7FE, 0x6FB3, 0xE8A1, 0x70CF, 0xE8A2, 0x71AC, 0xE8A3, 0x7352, 0xE8A4, 0x7B7D, + 0xE8A5, 0x8708, 0xE8A6, 0x8AA4, 0xE8A7, 0x9C32, 0xE8A8, 0x9F07, 0xE8A9, 0x5C4B, 0xE8AA, 0x6C83, 0xE8AB, 0x7344, 0xE8AC, 0x7389, + 0xE8AD, 0x923A, 0xE8AE, 0x6EAB, 0xE8AF, 0x7465, 0xE8B0, 0x761F, 0xE8B1, 0x7A69, 0xE8B2, 0x7E15, 0xE8B3, 0x860A, 0xE8B4, 0x5140, + 0xE8B5, 0x58C5, 0xE8B6, 0x64C1, 0xE8B7, 0x74EE, 0xE8B8, 0x7515, 0xE8B9, 0x7670, 0xE8BA, 0x7FC1, 0xE8BB, 0x9095, 0xE8BC, 0x96CD, + 0xE8BD, 0x9954, 0xE8BE, 0x6E26, 0xE8BF, 0x74E6, 0xE8C0, 0x7AA9, 0xE8C1, 0x7AAA, 0xE8C2, 0x81E5, 0xE8C3, 0x86D9, 0xE8C4, 0x8778, + 0xE8C5, 0x8A1B, 0xE8C6, 0x5A49, 0xE8C7, 0x5B8C, 0xE8C8, 0x5B9B, 0xE8C9, 0x68A1, 0xE8CA, 0x6900, 0xE8CB, 0x6D63, 0xE8CC, 0x73A9, + 0xE8CD, 0x7413, 0xE8CE, 0x742C, 0xE8CF, 0x7897, 0xE8D0, 0x7DE9, 0xE8D1, 0x7FEB, 0xE8D2, 0x8118, 0xE8D3, 0x8155, 0xE8D4, 0x839E, + 0xE8D5, 0x8C4C, 0xE8D6, 0x962E, 0xE8D7, 0x9811, 0xE8D8, 0x66F0, 0xE8D9, 0x5F80, 0xE8DA, 0x65FA, 0xE8DB, 0x6789, 0xE8DC, 0x6C6A, + 0xE8DD, 0x738B, 0xE8DE, 0x502D, 0xE8DF, 0x5A03, 0xE8E0, 0x6B6A, 0xE8E1, 0x77EE, 0xE8E2, 0x5916, 0xE8E3, 0x5D6C, 0xE8E4, 0x5DCD, + 0xE8E5, 0x7325, 0xE8E6, 0x754F, 0xE8E7, 0xF9BA, 0xE8E8, 0xF9BB, 0xE8E9, 0x50E5, 0xE8EA, 0x51F9, 0xE8EB, 0x582F, 0xE8EC, 0x592D, + 0xE8ED, 0x5996, 0xE8EE, 0x59DA, 0xE8EF, 0x5BE5, 0xE8F0, 0xF9BC, 0xE8F1, 0xF9BD, 0xE8F2, 0x5DA2, 0xE8F3, 0x62D7, 0xE8F4, 0x6416, + 0xE8F5, 0x6493, 0xE8F6, 0x64FE, 0xE8F7, 0xF9BE, 0xE8F8, 0x66DC, 0xE8F9, 0xF9BF, 0xE8FA, 0x6A48, 0xE8FB, 0xF9C0, 0xE8FC, 0x71FF, + 0xE8FD, 0x7464, 0xE8FE, 0xF9C1, 0xE9A1, 0x7A88, 0xE9A2, 0x7AAF, 0xE9A3, 0x7E47, 0xE9A4, 0x7E5E, 0xE9A5, 0x8000, 0xE9A6, 0x8170, + 0xE9A7, 0xF9C2, 0xE9A8, 0x87EF, 0xE9A9, 0x8981, 0xE9AA, 0x8B20, 0xE9AB, 0x9059, 0xE9AC, 0xF9C3, 0xE9AD, 0x9080, 0xE9AE, 0x9952, + 0xE9AF, 0x617E, 0xE9B0, 0x6B32, 0xE9B1, 0x6D74, 0xE9B2, 0x7E1F, 0xE9B3, 0x8925, 0xE9B4, 0x8FB1, 0xE9B5, 0x4FD1, 0xE9B6, 0x50AD, + 0xE9B7, 0x5197, 0xE9B8, 0x52C7, 0xE9B9, 0x57C7, 0xE9BA, 0x5889, 0xE9BB, 0x5BB9, 0xE9BC, 0x5EB8, 0xE9BD, 0x6142, 0xE9BE, 0x6995, + 0xE9BF, 0x6D8C, 0xE9C0, 0x6E67, 0xE9C1, 0x6EB6, 0xE9C2, 0x7194, 0xE9C3, 0x7462, 0xE9C4, 0x7528, 0xE9C5, 0x752C, 0xE9C6, 0x8073, + 0xE9C7, 0x8338, 0xE9C8, 0x84C9, 0xE9C9, 0x8E0A, 0xE9CA, 0x9394, 0xE9CB, 0x93DE, 0xE9CC, 0xF9C4, 0xE9CD, 0x4E8E, 0xE9CE, 0x4F51, + 0xE9CF, 0x5076, 0xE9D0, 0x512A, 0xE9D1, 0x53C8, 0xE9D2, 0x53CB, 0xE9D3, 0x53F3, 0xE9D4, 0x5B87, 0xE9D5, 0x5BD3, 0xE9D6, 0x5C24, + 0xE9D7, 0x611A, 0xE9D8, 0x6182, 0xE9D9, 0x65F4, 0xE9DA, 0x725B, 0xE9DB, 0x7397, 0xE9DC, 0x7440, 0xE9DD, 0x76C2, 0xE9DE, 0x7950, + 0xE9DF, 0x7991, 0xE9E0, 0x79B9, 0xE9E1, 0x7D06, 0xE9E2, 0x7FBD, 0xE9E3, 0x828B, 0xE9E4, 0x85D5, 0xE9E5, 0x865E, 0xE9E6, 0x8FC2, + 0xE9E7, 0x9047, 0xE9E8, 0x90F5, 0xE9E9, 0x91EA, 0xE9EA, 0x9685, 0xE9EB, 0x96E8, 0xE9EC, 0x96E9, 0xE9ED, 0x52D6, 0xE9EE, 0x5F67, + 0xE9EF, 0x65ED, 0xE9F0, 0x6631, 0xE9F1, 0x682F, 0xE9F2, 0x715C, 0xE9F3, 0x7A36, 0xE9F4, 0x90C1, 0xE9F5, 0x980A, 0xE9F6, 0x4E91, + 0xE9F7, 0xF9C5, 0xE9F8, 0x6A52, 0xE9F9, 0x6B9E, 0xE9FA, 0x6F90, 0xE9FB, 0x7189, 0xE9FC, 0x8018, 0xE9FD, 0x82B8, 0xE9FE, 0x8553, + 0xEAA1, 0x904B, 0xEAA2, 0x9695, 0xEAA3, 0x96F2, 0xEAA4, 0x97FB, 0xEAA5, 0x851A, 0xEAA6, 0x9B31, 0xEAA7, 0x4E90, 0xEAA8, 0x718A, + 0xEAA9, 0x96C4, 0xEAAA, 0x5143, 0xEAAB, 0x539F, 0xEAAC, 0x54E1, 0xEAAD, 0x5713, 0xEAAE, 0x5712, 0xEAAF, 0x57A3, 0xEAB0, 0x5A9B, + 0xEAB1, 0x5AC4, 0xEAB2, 0x5BC3, 0xEAB3, 0x6028, 0xEAB4, 0x613F, 0xEAB5, 0x63F4, 0xEAB6, 0x6C85, 0xEAB7, 0x6D39, 0xEAB8, 0x6E72, + 0xEAB9, 0x6E90, 0xEABA, 0x7230, 0xEABB, 0x733F, 0xEABC, 0x7457, 0xEABD, 0x82D1, 0xEABE, 0x8881, 0xEABF, 0x8F45, 0xEAC0, 0x9060, + 0xEAC1, 0xF9C6, 0xEAC2, 0x9662, 0xEAC3, 0x9858, 0xEAC4, 0x9D1B, 0xEAC5, 0x6708, 0xEAC6, 0x8D8A, 0xEAC7, 0x925E, 0xEAC8, 0x4F4D, + 0xEAC9, 0x5049, 0xEACA, 0x50DE, 0xEACB, 0x5371, 0xEACC, 0x570D, 0xEACD, 0x59D4, 0xEACE, 0x5A01, 0xEACF, 0x5C09, 0xEAD0, 0x6170, + 0xEAD1, 0x6690, 0xEAD2, 0x6E2D, 0xEAD3, 0x7232, 0xEAD4, 0x744B, 0xEAD5, 0x7DEF, 0xEAD6, 0x80C3, 0xEAD7, 0x840E, 0xEAD8, 0x8466, + 0xEAD9, 0x853F, 0xEADA, 0x875F, 0xEADB, 0x885B, 0xEADC, 0x8918, 0xEADD, 0x8B02, 0xEADE, 0x9055, 0xEADF, 0x97CB, 0xEAE0, 0x9B4F, + 0xEAE1, 0x4E73, 0xEAE2, 0x4F91, 0xEAE3, 0x5112, 0xEAE4, 0x516A, 0xEAE5, 0xF9C7, 0xEAE6, 0x552F, 0xEAE7, 0x55A9, 0xEAE8, 0x5B7A, + 0xEAE9, 0x5BA5, 0xEAEA, 0x5E7C, 0xEAEB, 0x5E7D, 0xEAEC, 0x5EBE, 0xEAED, 0x60A0, 0xEAEE, 0x60DF, 0xEAEF, 0x6108, 0xEAF0, 0x6109, + 0xEAF1, 0x63C4, 0xEAF2, 0x6538, 0xEAF3, 0x6709, 0xEAF4, 0xF9C8, 0xEAF5, 0x67D4, 0xEAF6, 0x67DA, 0xEAF7, 0xF9C9, 0xEAF8, 0x6961, + 0xEAF9, 0x6962, 0xEAFA, 0x6CB9, 0xEAFB, 0x6D27, 0xEAFC, 0xF9CA, 0xEAFD, 0x6E38, 0xEAFE, 0xF9CB, 0xEBA1, 0x6FE1, 0xEBA2, 0x7336, + 0xEBA3, 0x7337, 0xEBA4, 0xF9CC, 0xEBA5, 0x745C, 0xEBA6, 0x7531, 0xEBA7, 0xF9CD, 0xEBA8, 0x7652, 0xEBA9, 0xF9CE, 0xEBAA, 0xF9CF, + 0xEBAB, 0x7DAD, 0xEBAC, 0x81FE, 0xEBAD, 0x8438, 0xEBAE, 0x88D5, 0xEBAF, 0x8A98, 0xEBB0, 0x8ADB, 0xEBB1, 0x8AED, 0xEBB2, 0x8E30, + 0xEBB3, 0x8E42, 0xEBB4, 0x904A, 0xEBB5, 0x903E, 0xEBB6, 0x907A, 0xEBB7, 0x9149, 0xEBB8, 0x91C9, 0xEBB9, 0x936E, 0xEBBA, 0xF9D0, + 0xEBBB, 0xF9D1, 0xEBBC, 0x5809, 0xEBBD, 0xF9D2, 0xEBBE, 0x6BD3, 0xEBBF, 0x8089, 0xEBC0, 0x80B2, 0xEBC1, 0xF9D3, 0xEBC2, 0xF9D4, + 0xEBC3, 0x5141, 0xEBC4, 0x596B, 0xEBC5, 0x5C39, 0xEBC6, 0xF9D5, 0xEBC7, 0xF9D6, 0xEBC8, 0x6F64, 0xEBC9, 0x73A7, 0xEBCA, 0x80E4, + 0xEBCB, 0x8D07, 0xEBCC, 0xF9D7, 0xEBCD, 0x9217, 0xEBCE, 0x958F, 0xEBCF, 0xF9D8, 0xEBD0, 0xF9D9, 0xEBD1, 0xF9DA, 0xEBD2, 0xF9DB, + 0xEBD3, 0x807F, 0xEBD4, 0x620E, 0xEBD5, 0x701C, 0xEBD6, 0x7D68, 0xEBD7, 0x878D, 0xEBD8, 0xF9DC, 0xEBD9, 0x57A0, 0xEBDA, 0x6069, + 0xEBDB, 0x6147, 0xEBDC, 0x6BB7, 0xEBDD, 0x8ABE, 0xEBDE, 0x9280, 0xEBDF, 0x96B1, 0xEBE0, 0x4E59, 0xEBE1, 0x541F, 0xEBE2, 0x6DEB, + 0xEBE3, 0x852D, 0xEBE4, 0x9670, 0xEBE5, 0x97F3, 0xEBE6, 0x98EE, 0xEBE7, 0x63D6, 0xEBE8, 0x6CE3, 0xEBE9, 0x9091, 0xEBEA, 0x51DD, + 0xEBEB, 0x61C9, 0xEBEC, 0x81BA, 0xEBED, 0x9DF9, 0xEBEE, 0x4F9D, 0xEBEF, 0x501A, 0xEBF0, 0x5100, 0xEBF1, 0x5B9C, 0xEBF2, 0x610F, + 0xEBF3, 0x61FF, 0xEBF4, 0x64EC, 0xEBF5, 0x6905, 0xEBF6, 0x6BC5, 0xEBF7, 0x7591, 0xEBF8, 0x77E3, 0xEBF9, 0x7FA9, 0xEBFA, 0x8264, + 0xEBFB, 0x858F, 0xEBFC, 0x87FB, 0xEBFD, 0x8863, 0xEBFE, 0x8ABC, 0xECA1, 0x8B70, 0xECA2, 0x91AB, 0xECA3, 0x4E8C, 0xECA4, 0x4EE5, + 0xECA5, 0x4F0A, 0xECA6, 0xF9DD, 0xECA7, 0xF9DE, 0xECA8, 0x5937, 0xECA9, 0x59E8, 0xECAA, 0xF9DF, 0xECAB, 0x5DF2, 0xECAC, 0x5F1B, + 0xECAD, 0x5F5B, 0xECAE, 0x6021, 0xECAF, 0xF9E0, 0xECB0, 0xF9E1, 0xECB1, 0xF9E2, 0xECB2, 0xF9E3, 0xECB3, 0x723E, 0xECB4, 0x73E5, + 0xECB5, 0xF9E4, 0xECB6, 0x7570, 0xECB7, 0x75CD, 0xECB8, 0xF9E5, 0xECB9, 0x79FB, 0xECBA, 0xF9E6, 0xECBB, 0x800C, 0xECBC, 0x8033, + 0xECBD, 0x8084, 0xECBE, 0x82E1, 0xECBF, 0x8351, 0xECC0, 0xF9E7, 0xECC1, 0xF9E8, 0xECC2, 0x8CBD, 0xECC3, 0x8CB3, 0xECC4, 0x9087, + 0xECC5, 0xF9E9, 0xECC6, 0xF9EA, 0xECC7, 0x98F4, 0xECC8, 0x990C, 0xECC9, 0xF9EB, 0xECCA, 0xF9EC, 0xECCB, 0x7037, 0xECCC, 0x76CA, + 0xECCD, 0x7FCA, 0xECCE, 0x7FCC, 0xECCF, 0x7FFC, 0xECD0, 0x8B1A, 0xECD1, 0x4EBA, 0xECD2, 0x4EC1, 0xECD3, 0x5203, 0xECD4, 0x5370, + 0xECD5, 0xF9ED, 0xECD6, 0x54BD, 0xECD7, 0x56E0, 0xECD8, 0x59FB, 0xECD9, 0x5BC5, 0xECDA, 0x5F15, 0xECDB, 0x5FCD, 0xECDC, 0x6E6E, + 0xECDD, 0xF9EE, 0xECDE, 0xF9EF, 0xECDF, 0x7D6A, 0xECE0, 0x8335, 0xECE1, 0xF9F0, 0xECE2, 0x8693, 0xECE3, 0x8A8D, 0xECE4, 0xF9F1, + 0xECE5, 0x976D, 0xECE6, 0x9777, 0xECE7, 0xF9F2, 0xECE8, 0xF9F3, 0xECE9, 0x4E00, 0xECEA, 0x4F5A, 0xECEB, 0x4F7E, 0xECEC, 0x58F9, + 0xECED, 0x65E5, 0xECEE, 0x6EA2, 0xECEF, 0x9038, 0xECF0, 0x93B0, 0xECF1, 0x99B9, 0xECF2, 0x4EFB, 0xECF3, 0x58EC, 0xECF4, 0x598A, + 0xECF5, 0x59D9, 0xECF6, 0x6041, 0xECF7, 0xF9F4, 0xECF8, 0xF9F5, 0xECF9, 0x7A14, 0xECFA, 0xF9F6, 0xECFB, 0x834F, 0xECFC, 0x8CC3, + 0xECFD, 0x5165, 0xECFE, 0x5344, 0xEDA1, 0xF9F7, 0xEDA2, 0xF9F8, 0xEDA3, 0xF9F9, 0xEDA4, 0x4ECD, 0xEDA5, 0x5269, 0xEDA6, 0x5B55, + 0xEDA7, 0x82BF, 0xEDA8, 0x4ED4, 0xEDA9, 0x523A, 0xEDAA, 0x54A8, 0xEDAB, 0x59C9, 0xEDAC, 0x59FF, 0xEDAD, 0x5B50, 0xEDAE, 0x5B57, + 0xEDAF, 0x5B5C, 0xEDB0, 0x6063, 0xEDB1, 0x6148, 0xEDB2, 0x6ECB, 0xEDB3, 0x7099, 0xEDB4, 0x716E, 0xEDB5, 0x7386, 0xEDB6, 0x74F7, + 0xEDB7, 0x75B5, 0xEDB8, 0x78C1, 0xEDB9, 0x7D2B, 0xEDBA, 0x8005, 0xEDBB, 0x81EA, 0xEDBC, 0x8328, 0xEDBD, 0x8517, 0xEDBE, 0x85C9, + 0xEDBF, 0x8AEE, 0xEDC0, 0x8CC7, 0xEDC1, 0x96CC, 0xEDC2, 0x4F5C, 0xEDC3, 0x52FA, 0xEDC4, 0x56BC, 0xEDC5, 0x65AB, 0xEDC6, 0x6628, + 0xEDC7, 0x707C, 0xEDC8, 0x70B8, 0xEDC9, 0x7235, 0xEDCA, 0x7DBD, 0xEDCB, 0x828D, 0xEDCC, 0x914C, 0xEDCD, 0x96C0, 0xEDCE, 0x9D72, + 0xEDCF, 0x5B71, 0xEDD0, 0x68E7, 0xEDD1, 0x6B98, 0xEDD2, 0x6F7A, 0xEDD3, 0x76DE, 0xEDD4, 0x5C91, 0xEDD5, 0x66AB, 0xEDD6, 0x6F5B, + 0xEDD7, 0x7BB4, 0xEDD8, 0x7C2A, 0xEDD9, 0x8836, 0xEDDA, 0x96DC, 0xEDDB, 0x4E08, 0xEDDC, 0x4ED7, 0xEDDD, 0x5320, 0xEDDE, 0x5834, + 0xEDDF, 0x58BB, 0xEDE0, 0x58EF, 0xEDE1, 0x596C, 0xEDE2, 0x5C07, 0xEDE3, 0x5E33, 0xEDE4, 0x5E84, 0xEDE5, 0x5F35, 0xEDE6, 0x638C, + 0xEDE7, 0x66B2, 0xEDE8, 0x6756, 0xEDE9, 0x6A1F, 0xEDEA, 0x6AA3, 0xEDEB, 0x6B0C, 0xEDEC, 0x6F3F, 0xEDED, 0x7246, 0xEDEE, 0xF9FA, + 0xEDEF, 0x7350, 0xEDF0, 0x748B, 0xEDF1, 0x7AE0, 0xEDF2, 0x7CA7, 0xEDF3, 0x8178, 0xEDF4, 0x81DF, 0xEDF5, 0x81E7, 0xEDF6, 0x838A, + 0xEDF7, 0x846C, 0xEDF8, 0x8523, 0xEDF9, 0x8594, 0xEDFA, 0x85CF, 0xEDFB, 0x88DD, 0xEDFC, 0x8D13, 0xEDFD, 0x91AC, 0xEDFE, 0x9577, + 0xEEA1, 0x969C, 0xEEA2, 0x518D, 0xEEA3, 0x54C9, 0xEEA4, 0x5728, 0xEEA5, 0x5BB0, 0xEEA6, 0x624D, 0xEEA7, 0x6750, 0xEEA8, 0x683D, + 0xEEA9, 0x6893, 0xEEAA, 0x6E3D, 0xEEAB, 0x6ED3, 0xEEAC, 0x707D, 0xEEAD, 0x7E21, 0xEEAE, 0x88C1, 0xEEAF, 0x8CA1, 0xEEB0, 0x8F09, + 0xEEB1, 0x9F4B, 0xEEB2, 0x9F4E, 0xEEB3, 0x722D, 0xEEB4, 0x7B8F, 0xEEB5, 0x8ACD, 0xEEB6, 0x931A, 0xEEB7, 0x4F47, 0xEEB8, 0x4F4E, + 0xEEB9, 0x5132, 0xEEBA, 0x5480, 0xEEBB, 0x59D0, 0xEEBC, 0x5E95, 0xEEBD, 0x62B5, 0xEEBE, 0x6775, 0xEEBF, 0x696E, 0xEEC0, 0x6A17, + 0xEEC1, 0x6CAE, 0xEEC2, 0x6E1A, 0xEEC3, 0x72D9, 0xEEC4, 0x732A, 0xEEC5, 0x75BD, 0xEEC6, 0x7BB8, 0xEEC7, 0x7D35, 0xEEC8, 0x82E7, + 0xEEC9, 0x83F9, 0xEECA, 0x8457, 0xEECB, 0x85F7, 0xEECC, 0x8A5B, 0xEECD, 0x8CAF, 0xEECE, 0x8E87, 0xEECF, 0x9019, 0xEED0, 0x90B8, + 0xEED1, 0x96CE, 0xEED2, 0x9F5F, 0xEED3, 0x52E3, 0xEED4, 0x540A, 0xEED5, 0x5AE1, 0xEED6, 0x5BC2, 0xEED7, 0x6458, 0xEED8, 0x6575, + 0xEED9, 0x6EF4, 0xEEDA, 0x72C4, 0xEEDB, 0xF9FB, 0xEEDC, 0x7684, 0xEEDD, 0x7A4D, 0xEEDE, 0x7B1B, 0xEEDF, 0x7C4D, 0xEEE0, 0x7E3E, + 0xEEE1, 0x7FDF, 0xEEE2, 0x837B, 0xEEE3, 0x8B2B, 0xEEE4, 0x8CCA, 0xEEE5, 0x8D64, 0xEEE6, 0x8DE1, 0xEEE7, 0x8E5F, 0xEEE8, 0x8FEA, + 0xEEE9, 0x8FF9, 0xEEEA, 0x9069, 0xEEEB, 0x93D1, 0xEEEC, 0x4F43, 0xEEED, 0x4F7A, 0xEEEE, 0x50B3, 0xEEEF, 0x5168, 0xEEF0, 0x5178, + 0xEEF1, 0x524D, 0xEEF2, 0x526A, 0xEEF3, 0x5861, 0xEEF4, 0x587C, 0xEEF5, 0x5960, 0xEEF6, 0x5C08, 0xEEF7, 0x5C55, 0xEEF8, 0x5EDB, + 0xEEF9, 0x609B, 0xEEFA, 0x6230, 0xEEFB, 0x6813, 0xEEFC, 0x6BBF, 0xEEFD, 0x6C08, 0xEEFE, 0x6FB1, 0xEFA1, 0x714E, 0xEFA2, 0x7420, + 0xEFA3, 0x7530, 0xEFA4, 0x7538, 0xEFA5, 0x7551, 0xEFA6, 0x7672, 0xEFA7, 0x7B4C, 0xEFA8, 0x7B8B, 0xEFA9, 0x7BAD, 0xEFAA, 0x7BC6, + 0xEFAB, 0x7E8F, 0xEFAC, 0x8A6E, 0xEFAD, 0x8F3E, 0xEFAE, 0x8F49, 0xEFAF, 0x923F, 0xEFB0, 0x9293, 0xEFB1, 0x9322, 0xEFB2, 0x942B, + 0xEFB3, 0x96FB, 0xEFB4, 0x985A, 0xEFB5, 0x986B, 0xEFB6, 0x991E, 0xEFB7, 0x5207, 0xEFB8, 0x622A, 0xEFB9, 0x6298, 0xEFBA, 0x6D59, + 0xEFBB, 0x7664, 0xEFBC, 0x7ACA, 0xEFBD, 0x7BC0, 0xEFBE, 0x7D76, 0xEFBF, 0x5360, 0xEFC0, 0x5CBE, 0xEFC1, 0x5E97, 0xEFC2, 0x6F38, + 0xEFC3, 0x70B9, 0xEFC4, 0x7C98, 0xEFC5, 0x9711, 0xEFC6, 0x9B8E, 0xEFC7, 0x9EDE, 0xEFC8, 0x63A5, 0xEFC9, 0x647A, 0xEFCA, 0x8776, + 0xEFCB, 0x4E01, 0xEFCC, 0x4E95, 0xEFCD, 0x4EAD, 0xEFCE, 0x505C, 0xEFCF, 0x5075, 0xEFD0, 0x5448, 0xEFD1, 0x59C3, 0xEFD2, 0x5B9A, + 0xEFD3, 0x5E40, 0xEFD4, 0x5EAD, 0xEFD5, 0x5EF7, 0xEFD6, 0x5F81, 0xEFD7, 0x60C5, 0xEFD8, 0x633A, 0xEFD9, 0x653F, 0xEFDA, 0x6574, + 0xEFDB, 0x65CC, 0xEFDC, 0x6676, 0xEFDD, 0x6678, 0xEFDE, 0x67FE, 0xEFDF, 0x6968, 0xEFE0, 0x6A89, 0xEFE1, 0x6B63, 0xEFE2, 0x6C40, + 0xEFE3, 0x6DC0, 0xEFE4, 0x6DE8, 0xEFE5, 0x6E1F, 0xEFE6, 0x6E5E, 0xEFE7, 0x701E, 0xEFE8, 0x70A1, 0xEFE9, 0x738E, 0xEFEA, 0x73FD, + 0xEFEB, 0x753A, 0xEFEC, 0x775B, 0xEFED, 0x7887, 0xEFEE, 0x798E, 0xEFEF, 0x7A0B, 0xEFF0, 0x7A7D, 0xEFF1, 0x7CBE, 0xEFF2, 0x7D8E, + 0xEFF3, 0x8247, 0xEFF4, 0x8A02, 0xEFF5, 0x8AEA, 0xEFF6, 0x8C9E, 0xEFF7, 0x912D, 0xEFF8, 0x914A, 0xEFF9, 0x91D8, 0xEFFA, 0x9266, + 0xEFFB, 0x92CC, 0xEFFC, 0x9320, 0xEFFD, 0x9706, 0xEFFE, 0x9756, 0xF0A1, 0x975C, 0xF0A2, 0x9802, 0xF0A3, 0x9F0E, 0xF0A4, 0x5236, + 0xF0A5, 0x5291, 0xF0A6, 0x557C, 0xF0A7, 0x5824, 0xF0A8, 0x5E1D, 0xF0A9, 0x5F1F, 0xF0AA, 0x608C, 0xF0AB, 0x63D0, 0xF0AC, 0x68AF, + 0xF0AD, 0x6FDF, 0xF0AE, 0x796D, 0xF0AF, 0x7B2C, 0xF0B0, 0x81CD, 0xF0B1, 0x85BA, 0xF0B2, 0x88FD, 0xF0B3, 0x8AF8, 0xF0B4, 0x8E44, + 0xF0B5, 0x918D, 0xF0B6, 0x9664, 0xF0B7, 0x969B, 0xF0B8, 0x973D, 0xF0B9, 0x984C, 0xF0BA, 0x9F4A, 0xF0BB, 0x4FCE, 0xF0BC, 0x5146, + 0xF0BD, 0x51CB, 0xF0BE, 0x52A9, 0xF0BF, 0x5632, 0xF0C0, 0x5F14, 0xF0C1, 0x5F6B, 0xF0C2, 0x63AA, 0xF0C3, 0x64CD, 0xF0C4, 0x65E9, + 0xF0C5, 0x6641, 0xF0C6, 0x66FA, 0xF0C7, 0x66F9, 0xF0C8, 0x671D, 0xF0C9, 0x689D, 0xF0CA, 0x68D7, 0xF0CB, 0x69FD, 0xF0CC, 0x6F15, + 0xF0CD, 0x6F6E, 0xF0CE, 0x7167, 0xF0CF, 0x71E5, 0xF0D0, 0x722A, 0xF0D1, 0x74AA, 0xF0D2, 0x773A, 0xF0D3, 0x7956, 0xF0D4, 0x795A, + 0xF0D5, 0x79DF, 0xF0D6, 0x7A20, 0xF0D7, 0x7A95, 0xF0D8, 0x7C97, 0xF0D9, 0x7CDF, 0xF0DA, 0x7D44, 0xF0DB, 0x7E70, 0xF0DC, 0x8087, + 0xF0DD, 0x85FB, 0xF0DE, 0x86A4, 0xF0DF, 0x8A54, 0xF0E0, 0x8ABF, 0xF0E1, 0x8D99, 0xF0E2, 0x8E81, 0xF0E3, 0x9020, 0xF0E4, 0x906D, + 0xF0E5, 0x91E3, 0xF0E6, 0x963B, 0xF0E7, 0x96D5, 0xF0E8, 0x9CE5, 0xF0E9, 0x65CF, 0xF0EA, 0x7C07, 0xF0EB, 0x8DB3, 0xF0EC, 0x93C3, + 0xF0ED, 0x5B58, 0xF0EE, 0x5C0A, 0xF0EF, 0x5352, 0xF0F0, 0x62D9, 0xF0F1, 0x731D, 0xF0F2, 0x5027, 0xF0F3, 0x5B97, 0xF0F4, 0x5F9E, + 0xF0F5, 0x60B0, 0xF0F6, 0x616B, 0xF0F7, 0x68D5, 0xF0F8, 0x6DD9, 0xF0F9, 0x742E, 0xF0FA, 0x7A2E, 0xF0FB, 0x7D42, 0xF0FC, 0x7D9C, + 0xF0FD, 0x7E31, 0xF0FE, 0x816B, 0xF1A1, 0x8E2A, 0xF1A2, 0x8E35, 0xF1A3, 0x937E, 0xF1A4, 0x9418, 0xF1A5, 0x4F50, 0xF1A6, 0x5750, + 0xF1A7, 0x5DE6, 0xF1A8, 0x5EA7, 0xF1A9, 0x632B, 0xF1AA, 0x7F6A, 0xF1AB, 0x4E3B, 0xF1AC, 0x4F4F, 0xF1AD, 0x4F8F, 0xF1AE, 0x505A, + 0xF1AF, 0x59DD, 0xF1B0, 0x80C4, 0xF1B1, 0x546A, 0xF1B2, 0x5468, 0xF1B3, 0x55FE, 0xF1B4, 0x594F, 0xF1B5, 0x5B99, 0xF1B6, 0x5DDE, + 0xF1B7, 0x5EDA, 0xF1B8, 0x665D, 0xF1B9, 0x6731, 0xF1BA, 0x67F1, 0xF1BB, 0x682A, 0xF1BC, 0x6CE8, 0xF1BD, 0x6D32, 0xF1BE, 0x6E4A, + 0xF1BF, 0x6F8D, 0xF1C0, 0x70B7, 0xF1C1, 0x73E0, 0xF1C2, 0x7587, 0xF1C3, 0x7C4C, 0xF1C4, 0x7D02, 0xF1C5, 0x7D2C, 0xF1C6, 0x7DA2, + 0xF1C7, 0x821F, 0xF1C8, 0x86DB, 0xF1C9, 0x8A3B, 0xF1CA, 0x8A85, 0xF1CB, 0x8D70, 0xF1CC, 0x8E8A, 0xF1CD, 0x8F33, 0xF1CE, 0x9031, + 0xF1CF, 0x914E, 0xF1D0, 0x9152, 0xF1D1, 0x9444, 0xF1D2, 0x99D0, 0xF1D3, 0x7AF9, 0xF1D4, 0x7CA5, 0xF1D5, 0x4FCA, 0xF1D6, 0x5101, + 0xF1D7, 0x51C6, 0xF1D8, 0x57C8, 0xF1D9, 0x5BEF, 0xF1DA, 0x5CFB, 0xF1DB, 0x6659, 0xF1DC, 0x6A3D, 0xF1DD, 0x6D5A, 0xF1DE, 0x6E96, + 0xF1DF, 0x6FEC, 0xF1E0, 0x710C, 0xF1E1, 0x756F, 0xF1E2, 0x7AE3, 0xF1E3, 0x8822, 0xF1E4, 0x9021, 0xF1E5, 0x9075, 0xF1E6, 0x96CB, + 0xF1E7, 0x99FF, 0xF1E8, 0x8301, 0xF1E9, 0x4E2D, 0xF1EA, 0x4EF2, 0xF1EB, 0x8846, 0xF1EC, 0x91CD, 0xF1ED, 0x537D, 0xF1EE, 0x6ADB, + 0xF1EF, 0x696B, 0xF1F0, 0x6C41, 0xF1F1, 0x847A, 0xF1F2, 0x589E, 0xF1F3, 0x618E, 0xF1F4, 0x66FE, 0xF1F5, 0x62EF, 0xF1F6, 0x70DD, + 0xF1F7, 0x7511, 0xF1F8, 0x75C7, 0xF1F9, 0x7E52, 0xF1FA, 0x84B8, 0xF1FB, 0x8B49, 0xF1FC, 0x8D08, 0xF1FD, 0x4E4B, 0xF1FE, 0x53EA, + 0xF2A1, 0x54AB, 0xF2A2, 0x5730, 0xF2A3, 0x5740, 0xF2A4, 0x5FD7, 0xF2A5, 0x6301, 0xF2A6, 0x6307, 0xF2A7, 0x646F, 0xF2A8, 0x652F, + 0xF2A9, 0x65E8, 0xF2AA, 0x667A, 0xF2AB, 0x679D, 0xF2AC, 0x67B3, 0xF2AD, 0x6B62, 0xF2AE, 0x6C60, 0xF2AF, 0x6C9A, 0xF2B0, 0x6F2C, + 0xF2B1, 0x77E5, 0xF2B2, 0x7825, 0xF2B3, 0x7949, 0xF2B4, 0x7957, 0xF2B5, 0x7D19, 0xF2B6, 0x80A2, 0xF2B7, 0x8102, 0xF2B8, 0x81F3, + 0xF2B9, 0x829D, 0xF2BA, 0x82B7, 0xF2BB, 0x8718, 0xF2BC, 0x8A8C, 0xF2BD, 0xF9FC, 0xF2BE, 0x8D04, 0xF2BF, 0x8DBE, 0xF2C0, 0x9072, + 0xF2C1, 0x76F4, 0xF2C2, 0x7A19, 0xF2C3, 0x7A37, 0xF2C4, 0x7E54, 0xF2C5, 0x8077, 0xF2C6, 0x5507, 0xF2C7, 0x55D4, 0xF2C8, 0x5875, + 0xF2C9, 0x632F, 0xF2CA, 0x6422, 0xF2CB, 0x6649, 0xF2CC, 0x664B, 0xF2CD, 0x686D, 0xF2CE, 0x699B, 0xF2CF, 0x6B84, 0xF2D0, 0x6D25, + 0xF2D1, 0x6EB1, 0xF2D2, 0x73CD, 0xF2D3, 0x7468, 0xF2D4, 0x74A1, 0xF2D5, 0x755B, 0xF2D6, 0x75B9, 0xF2D7, 0x76E1, 0xF2D8, 0x771E, + 0xF2D9, 0x778B, 0xF2DA, 0x79E6, 0xF2DB, 0x7E09, 0xF2DC, 0x7E1D, 0xF2DD, 0x81FB, 0xF2DE, 0x852F, 0xF2DF, 0x8897, 0xF2E0, 0x8A3A, + 0xF2E1, 0x8CD1, 0xF2E2, 0x8EEB, 0xF2E3, 0x8FB0, 0xF2E4, 0x9032, 0xF2E5, 0x93AD, 0xF2E6, 0x9663, 0xF2E7, 0x9673, 0xF2E8, 0x9707, + 0xF2E9, 0x4F84, 0xF2EA, 0x53F1, 0xF2EB, 0x59EA, 0xF2EC, 0x5AC9, 0xF2ED, 0x5E19, 0xF2EE, 0x684E, 0xF2EF, 0x74C6, 0xF2F0, 0x75BE, + 0xF2F1, 0x79E9, 0xF2F2, 0x7A92, 0xF2F3, 0x81A3, 0xF2F4, 0x86ED, 0xF2F5, 0x8CEA, 0xF2F6, 0x8DCC, 0xF2F7, 0x8FED, 0xF2F8, 0x659F, + 0xF2F9, 0x6715, 0xF2FA, 0xF9FD, 0xF2FB, 0x57F7, 0xF2FC, 0x6F57, 0xF2FD, 0x7DDD, 0xF2FE, 0x8F2F, 0xF3A1, 0x93F6, 0xF3A2, 0x96C6, + 0xF3A3, 0x5FB5, 0xF3A4, 0x61F2, 0xF3A5, 0x6F84, 0xF3A6, 0x4E14, 0xF3A7, 0x4F98, 0xF3A8, 0x501F, 0xF3A9, 0x53C9, 0xF3AA, 0x55DF, + 0xF3AB, 0x5D6F, 0xF3AC, 0x5DEE, 0xF3AD, 0x6B21, 0xF3AE, 0x6B64, 0xF3AF, 0x78CB, 0xF3B0, 0x7B9A, 0xF3B1, 0xF9FE, 0xF3B2, 0x8E49, + 0xF3B3, 0x8ECA, 0xF3B4, 0x906E, 0xF3B5, 0x6349, 0xF3B6, 0x643E, 0xF3B7, 0x7740, 0xF3B8, 0x7A84, 0xF3B9, 0x932F, 0xF3BA, 0x947F, + 0xF3BB, 0x9F6A, 0xF3BC, 0x64B0, 0xF3BD, 0x6FAF, 0xF3BE, 0x71E6, 0xF3BF, 0x74A8, 0xF3C0, 0x74DA, 0xF3C1, 0x7AC4, 0xF3C2, 0x7C12, + 0xF3C3, 0x7E82, 0xF3C4, 0x7CB2, 0xF3C5, 0x7E98, 0xF3C6, 0x8B9A, 0xF3C7, 0x8D0A, 0xF3C8, 0x947D, 0xF3C9, 0x9910, 0xF3CA, 0x994C, + 0xF3CB, 0x5239, 0xF3CC, 0x5BDF, 0xF3CD, 0x64E6, 0xF3CE, 0x672D, 0xF3CF, 0x7D2E, 0xF3D0, 0x50ED, 0xF3D1, 0x53C3, 0xF3D2, 0x5879, + 0xF3D3, 0x6158, 0xF3D4, 0x6159, 0xF3D5, 0x61FA, 0xF3D6, 0x65AC, 0xF3D7, 0x7AD9, 0xF3D8, 0x8B92, 0xF3D9, 0x8B96, 0xF3DA, 0x5009, + 0xF3DB, 0x5021, 0xF3DC, 0x5275, 0xF3DD, 0x5531, 0xF3DE, 0x5A3C, 0xF3DF, 0x5EE0, 0xF3E0, 0x5F70, 0xF3E1, 0x6134, 0xF3E2, 0x655E, + 0xF3E3, 0x660C, 0xF3E4, 0x6636, 0xF3E5, 0x66A2, 0xF3E6, 0x69CD, 0xF3E7, 0x6EC4, 0xF3E8, 0x6F32, 0xF3E9, 0x7316, 0xF3EA, 0x7621, + 0xF3EB, 0x7A93, 0xF3EC, 0x8139, 0xF3ED, 0x8259, 0xF3EE, 0x83D6, 0xF3EF, 0x84BC, 0xF3F0, 0x50B5, 0xF3F1, 0x57F0, 0xF3F2, 0x5BC0, + 0xF3F3, 0x5BE8, 0xF3F4, 0x5F69, 0xF3F5, 0x63A1, 0xF3F6, 0x7826, 0xF3F7, 0x7DB5, 0xF3F8, 0x83DC, 0xF3F9, 0x8521, 0xF3FA, 0x91C7, + 0xF3FB, 0x91F5, 0xF3FC, 0x518A, 0xF3FD, 0x67F5, 0xF3FE, 0x7B56, 0xF4A1, 0x8CAC, 0xF4A2, 0x51C4, 0xF4A3, 0x59BB, 0xF4A4, 0x60BD, + 0xF4A5, 0x8655, 0xF4A6, 0x501C, 0xF4A7, 0xF9FF, 0xF4A8, 0x5254, 0xF4A9, 0x5C3A, 0xF4AA, 0x617D, 0xF4AB, 0x621A, 0xF4AC, 0x62D3, + 0xF4AD, 0x64F2, 0xF4AE, 0x65A5, 0xF4AF, 0x6ECC, 0xF4B0, 0x7620, 0xF4B1, 0x810A, 0xF4B2, 0x8E60, 0xF4B3, 0x965F, 0xF4B4, 0x96BB, + 0xF4B5, 0x4EDF, 0xF4B6, 0x5343, 0xF4B7, 0x5598, 0xF4B8, 0x5929, 0xF4B9, 0x5DDD, 0xF4BA, 0x64C5, 0xF4BB, 0x6CC9, 0xF4BC, 0x6DFA, + 0xF4BD, 0x7394, 0xF4BE, 0x7A7F, 0xF4BF, 0x821B, 0xF4C0, 0x85A6, 0xF4C1, 0x8CE4, 0xF4C2, 0x8E10, 0xF4C3, 0x9077, 0xF4C4, 0x91E7, + 0xF4C5, 0x95E1, 0xF4C6, 0x9621, 0xF4C7, 0x97C6, 0xF4C8, 0x51F8, 0xF4C9, 0x54F2, 0xF4CA, 0x5586, 0xF4CB, 0x5FB9, 0xF4CC, 0x64A4, + 0xF4CD, 0x6F88, 0xF4CE, 0x7DB4, 0xF4CF, 0x8F1F, 0xF4D0, 0x8F4D, 0xF4D1, 0x9435, 0xF4D2, 0x50C9, 0xF4D3, 0x5C16, 0xF4D4, 0x6CBE, + 0xF4D5, 0x6DFB, 0xF4D6, 0x751B, 0xF4D7, 0x77BB, 0xF4D8, 0x7C3D, 0xF4D9, 0x7C64, 0xF4DA, 0x8A79, 0xF4DB, 0x8AC2, 0xF4DC, 0x581E, + 0xF4DD, 0x59BE, 0xF4DE, 0x5E16, 0xF4DF, 0x6377, 0xF4E0, 0x7252, 0xF4E1, 0x758A, 0xF4E2, 0x776B, 0xF4E3, 0x8ADC, 0xF4E4, 0x8CBC, + 0xF4E5, 0x8F12, 0xF4E6, 0x5EF3, 0xF4E7, 0x6674, 0xF4E8, 0x6DF8, 0xF4E9, 0x807D, 0xF4EA, 0x83C1, 0xF4EB, 0x8ACB, 0xF4EC, 0x9751, + 0xF4ED, 0x9BD6, 0xF4EE, 0xFA00, 0xF4EF, 0x5243, 0xF4F0, 0x66FF, 0xF4F1, 0x6D95, 0xF4F2, 0x6EEF, 0xF4F3, 0x7DE0, 0xF4F4, 0x8AE6, + 0xF4F5, 0x902E, 0xF4F6, 0x905E, 0xF4F7, 0x9AD4, 0xF4F8, 0x521D, 0xF4F9, 0x527F, 0xF4FA, 0x54E8, 0xF4FB, 0x6194, 0xF4FC, 0x6284, + 0xF4FD, 0x62DB, 0xF4FE, 0x68A2, 0xF5A1, 0x6912, 0xF5A2, 0x695A, 0xF5A3, 0x6A35, 0xF5A4, 0x7092, 0xF5A5, 0x7126, 0xF5A6, 0x785D, + 0xF5A7, 0x7901, 0xF5A8, 0x790E, 0xF5A9, 0x79D2, 0xF5AA, 0x7A0D, 0xF5AB, 0x8096, 0xF5AC, 0x8278, 0xF5AD, 0x82D5, 0xF5AE, 0x8349, + 0xF5AF, 0x8549, 0xF5B0, 0x8C82, 0xF5B1, 0x8D85, 0xF5B2, 0x9162, 0xF5B3, 0x918B, 0xF5B4, 0x91AE, 0xF5B5, 0x4FC3, 0xF5B6, 0x56D1, + 0xF5B7, 0x71ED, 0xF5B8, 0x77D7, 0xF5B9, 0x8700, 0xF5BA, 0x89F8, 0xF5BB, 0x5BF8, 0xF5BC, 0x5FD6, 0xF5BD, 0x6751, 0xF5BE, 0x90A8, + 0xF5BF, 0x53E2, 0xF5C0, 0x585A, 0xF5C1, 0x5BF5, 0xF5C2, 0x60A4, 0xF5C3, 0x6181, 0xF5C4, 0x6460, 0xF5C5, 0x7E3D, 0xF5C6, 0x8070, + 0xF5C7, 0x8525, 0xF5C8, 0x9283, 0xF5C9, 0x64AE, 0xF5CA, 0x50AC, 0xF5CB, 0x5D14, 0xF5CC, 0x6700, 0xF5CD, 0x589C, 0xF5CE, 0x62BD, + 0xF5CF, 0x63A8, 0xF5D0, 0x690E, 0xF5D1, 0x6978, 0xF5D2, 0x6A1E, 0xF5D3, 0x6E6B, 0xF5D4, 0x76BA, 0xF5D5, 0x79CB, 0xF5D6, 0x82BB, + 0xF5D7, 0x8429, 0xF5D8, 0x8ACF, 0xF5D9, 0x8DA8, 0xF5DA, 0x8FFD, 0xF5DB, 0x9112, 0xF5DC, 0x914B, 0xF5DD, 0x919C, 0xF5DE, 0x9310, + 0xF5DF, 0x9318, 0xF5E0, 0x939A, 0xF5E1, 0x96DB, 0xF5E2, 0x9A36, 0xF5E3, 0x9C0D, 0xF5E4, 0x4E11, 0xF5E5, 0x755C, 0xF5E6, 0x795D, + 0xF5E7, 0x7AFA, 0xF5E8, 0x7B51, 0xF5E9, 0x7BC9, 0xF5EA, 0x7E2E, 0xF5EB, 0x84C4, 0xF5EC, 0x8E59, 0xF5ED, 0x8E74, 0xF5EE, 0x8EF8, + 0xF5EF, 0x9010, 0xF5F0, 0x6625, 0xF5F1, 0x693F, 0xF5F2, 0x7443, 0xF5F3, 0x51FA, 0xF5F4, 0x672E, 0xF5F5, 0x9EDC, 0xF5F6, 0x5145, + 0xF5F7, 0x5FE0, 0xF5F8, 0x6C96, 0xF5F9, 0x87F2, 0xF5FA, 0x885D, 0xF5FB, 0x8877, 0xF5FC, 0x60B4, 0xF5FD, 0x81B5, 0xF5FE, 0x8403, + 0xF6A1, 0x8D05, 0xF6A2, 0x53D6, 0xF6A3, 0x5439, 0xF6A4, 0x5634, 0xF6A5, 0x5A36, 0xF6A6, 0x5C31, 0xF6A7, 0x708A, 0xF6A8, 0x7FE0, + 0xF6A9, 0x805A, 0xF6AA, 0x8106, 0xF6AB, 0x81ED, 0xF6AC, 0x8DA3, 0xF6AD, 0x9189, 0xF6AE, 0x9A5F, 0xF6AF, 0x9DF2, 0xF6B0, 0x5074, + 0xF6B1, 0x4EC4, 0xF6B2, 0x53A0, 0xF6B3, 0x60FB, 0xF6B4, 0x6E2C, 0xF6B5, 0x5C64, 0xF6B6, 0x4F88, 0xF6B7, 0x5024, 0xF6B8, 0x55E4, + 0xF6B9, 0x5CD9, 0xF6BA, 0x5E5F, 0xF6BB, 0x6065, 0xF6BC, 0x6894, 0xF6BD, 0x6CBB, 0xF6BE, 0x6DC4, 0xF6BF, 0x71BE, 0xF6C0, 0x75D4, + 0xF6C1, 0x75F4, 0xF6C2, 0x7661, 0xF6C3, 0x7A1A, 0xF6C4, 0x7A49, 0xF6C5, 0x7DC7, 0xF6C6, 0x7DFB, 0xF6C7, 0x7F6E, 0xF6C8, 0x81F4, + 0xF6C9, 0x86A9, 0xF6CA, 0x8F1C, 0xF6CB, 0x96C9, 0xF6CC, 0x99B3, 0xF6CD, 0x9F52, 0xF6CE, 0x5247, 0xF6CF, 0x52C5, 0xF6D0, 0x98ED, + 0xF6D1, 0x89AA, 0xF6D2, 0x4E03, 0xF6D3, 0x67D2, 0xF6D4, 0x6F06, 0xF6D5, 0x4FB5, 0xF6D6, 0x5BE2, 0xF6D7, 0x6795, 0xF6D8, 0x6C88, + 0xF6D9, 0x6D78, 0xF6DA, 0x741B, 0xF6DB, 0x7827, 0xF6DC, 0x91DD, 0xF6DD, 0x937C, 0xF6DE, 0x87C4, 0xF6DF, 0x79E4, 0xF6E0, 0x7A31, + 0xF6E1, 0x5FEB, 0xF6E2, 0x4ED6, 0xF6E3, 0x54A4, 0xF6E4, 0x553E, 0xF6E5, 0x58AE, 0xF6E6, 0x59A5, 0xF6E7, 0x60F0, 0xF6E8, 0x6253, + 0xF6E9, 0x62D6, 0xF6EA, 0x6736, 0xF6EB, 0x6955, 0xF6EC, 0x8235, 0xF6ED, 0x9640, 0xF6EE, 0x99B1, 0xF6EF, 0x99DD, 0xF6F0, 0x502C, + 0xF6F1, 0x5353, 0xF6F2, 0x5544, 0xF6F3, 0x577C, 0xF6F4, 0xFA01, 0xF6F5, 0x6258, 0xF6F6, 0xFA02, 0xF6F7, 0x64E2, 0xF6F8, 0x666B, + 0xF6F9, 0x67DD, 0xF6FA, 0x6FC1, 0xF6FB, 0x6FEF, 0xF6FC, 0x7422, 0xF6FD, 0x7438, 0xF6FE, 0x8A17, 0xF7A1, 0x9438, 0xF7A2, 0x5451, + 0xF7A3, 0x5606, 0xF7A4, 0x5766, 0xF7A5, 0x5F48, 0xF7A6, 0x619A, 0xF7A7, 0x6B4E, 0xF7A8, 0x7058, 0xF7A9, 0x70AD, 0xF7AA, 0x7DBB, + 0xF7AB, 0x8A95, 0xF7AC, 0x596A, 0xF7AD, 0x812B, 0xF7AE, 0x63A2, 0xF7AF, 0x7708, 0xF7B0, 0x803D, 0xF7B1, 0x8CAA, 0xF7B2, 0x5854, + 0xF7B3, 0x642D, 0xF7B4, 0x69BB, 0xF7B5, 0x5B95, 0xF7B6, 0x5E11, 0xF7B7, 0x6E6F, 0xF7B8, 0xFA03, 0xF7B9, 0x8569, 0xF7BA, 0x514C, + 0xF7BB, 0x53F0, 0xF7BC, 0x592A, 0xF7BD, 0x6020, 0xF7BE, 0x614B, 0xF7BF, 0x6B86, 0xF7C0, 0x6C70, 0xF7C1, 0x6CF0, 0xF7C2, 0x7B1E, + 0xF7C3, 0x80CE, 0xF7C4, 0x82D4, 0xF7C5, 0x8DC6, 0xF7C6, 0x90B0, 0xF7C7, 0x98B1, 0xF7C8, 0xFA04, 0xF7C9, 0x64C7, 0xF7CA, 0x6FA4, + 0xF7CB, 0x6491, 0xF7CC, 0x6504, 0xF7CD, 0x514E, 0xF7CE, 0x5410, 0xF7CF, 0x571F, 0xF7D0, 0x8A0E, 0xF7D1, 0x615F, 0xF7D2, 0x6876, + 0xF7D3, 0xFA05, 0xF7D4, 0x75DB, 0xF7D5, 0x7B52, 0xF7D6, 0x7D71, 0xF7D7, 0x901A, 0xF7D8, 0x5806, 0xF7D9, 0x69CC, 0xF7DA, 0x817F, + 0xF7DB, 0x892A, 0xF7DC, 0x9000, 0xF7DD, 0x9839, 0xF7DE, 0x5078, 0xF7DF, 0x5957, 0xF7E0, 0x59AC, 0xF7E1, 0x6295, 0xF7E2, 0x900F, + 0xF7E3, 0x9B2A, 0xF7E4, 0x615D, 0xF7E5, 0x7279, 0xF7E6, 0x95D6, 0xF7E7, 0x5761, 0xF7E8, 0x5A46, 0xF7E9, 0x5DF4, 0xF7EA, 0x628A, + 0xF7EB, 0x64AD, 0xF7EC, 0x64FA, 0xF7ED, 0x6777, 0xF7EE, 0x6CE2, 0xF7EF, 0x6D3E, 0xF7F0, 0x722C, 0xF7F1, 0x7436, 0xF7F2, 0x7834, + 0xF7F3, 0x7F77, 0xF7F4, 0x82AD, 0xF7F5, 0x8DDB, 0xF7F6, 0x9817, 0xF7F7, 0x5224, 0xF7F8, 0x5742, 0xF7F9, 0x677F, 0xF7FA, 0x7248, + 0xF7FB, 0x74E3, 0xF7FC, 0x8CA9, 0xF7FD, 0x8FA6, 0xF7FE, 0x9211, 0xF8A1, 0x962A, 0xF8A2, 0x516B, 0xF8A3, 0x53ED, 0xF8A4, 0x634C, + 0xF8A5, 0x4F69, 0xF8A6, 0x5504, 0xF8A7, 0x6096, 0xF8A8, 0x6557, 0xF8A9, 0x6C9B, 0xF8AA, 0x6D7F, 0xF8AB, 0x724C, 0xF8AC, 0x72FD, + 0xF8AD, 0x7A17, 0xF8AE, 0x8987, 0xF8AF, 0x8C9D, 0xF8B0, 0x5F6D, 0xF8B1, 0x6F8E, 0xF8B2, 0x70F9, 0xF8B3, 0x81A8, 0xF8B4, 0x610E, + 0xF8B5, 0x4FBF, 0xF8B6, 0x504F, 0xF8B7, 0x6241, 0xF8B8, 0x7247, 0xF8B9, 0x7BC7, 0xF8BA, 0x7DE8, 0xF8BB, 0x7FE9, 0xF8BC, 0x904D, + 0xF8BD, 0x97AD, 0xF8BE, 0x9A19, 0xF8BF, 0x8CB6, 0xF8C0, 0x576A, 0xF8C1, 0x5E73, 0xF8C2, 0x67B0, 0xF8C3, 0x840D, 0xF8C4, 0x8A55, + 0xF8C5, 0x5420, 0xF8C6, 0x5B16, 0xF8C7, 0x5E63, 0xF8C8, 0x5EE2, 0xF8C9, 0x5F0A, 0xF8CA, 0x6583, 0xF8CB, 0x80BA, 0xF8CC, 0x853D, + 0xF8CD, 0x9589, 0xF8CE, 0x965B, 0xF8CF, 0x4F48, 0xF8D0, 0x5305, 0xF8D1, 0x530D, 0xF8D2, 0x530F, 0xF8D3, 0x5486, 0xF8D4, 0x54FA, + 0xF8D5, 0x5703, 0xF8D6, 0x5E03, 0xF8D7, 0x6016, 0xF8D8, 0x629B, 0xF8D9, 0x62B1, 0xF8DA, 0x6355, 0xF8DB, 0xFA06, 0xF8DC, 0x6CE1, + 0xF8DD, 0x6D66, 0xF8DE, 0x75B1, 0xF8DF, 0x7832, 0xF8E0, 0x80DE, 0xF8E1, 0x812F, 0xF8E2, 0x82DE, 0xF8E3, 0x8461, 0xF8E4, 0x84B2, + 0xF8E5, 0x888D, 0xF8E6, 0x8912, 0xF8E7, 0x900B, 0xF8E8, 0x92EA, 0xF8E9, 0x98FD, 0xF8EA, 0x9B91, 0xF8EB, 0x5E45, 0xF8EC, 0x66B4, + 0xF8ED, 0x66DD, 0xF8EE, 0x7011, 0xF8EF, 0x7206, 0xF8F0, 0xFA07, 0xF8F1, 0x4FF5, 0xF8F2, 0x527D, 0xF8F3, 0x5F6A, 0xF8F4, 0x6153, + 0xF8F5, 0x6753, 0xF8F6, 0x6A19, 0xF8F7, 0x6F02, 0xF8F8, 0x74E2, 0xF8F9, 0x7968, 0xF8FA, 0x8868, 0xF8FB, 0x8C79, 0xF8FC, 0x98C7, + 0xF8FD, 0x98C4, 0xF8FE, 0x9A43, 0xF9A1, 0x54C1, 0xF9A2, 0x7A1F, 0xF9A3, 0x6953, 0xF9A4, 0x8AF7, 0xF9A5, 0x8C4A, 0xF9A6, 0x98A8, + 0xF9A7, 0x99AE, 0xF9A8, 0x5F7C, 0xF9A9, 0x62AB, 0xF9AA, 0x75B2, 0xF9AB, 0x76AE, 0xF9AC, 0x88AB, 0xF9AD, 0x907F, 0xF9AE, 0x9642, + 0xF9AF, 0x5339, 0xF9B0, 0x5F3C, 0xF9B1, 0x5FC5, 0xF9B2, 0x6CCC, 0xF9B3, 0x73CC, 0xF9B4, 0x7562, 0xF9B5, 0x758B, 0xF9B6, 0x7B46, + 0xF9B7, 0x82FE, 0xF9B8, 0x999D, 0xF9B9, 0x4E4F, 0xF9BA, 0x903C, 0xF9BB, 0x4E0B, 0xF9BC, 0x4F55, 0xF9BD, 0x53A6, 0xF9BE, 0x590F, + 0xF9BF, 0x5EC8, 0xF9C0, 0x6630, 0xF9C1, 0x6CB3, 0xF9C2, 0x7455, 0xF9C3, 0x8377, 0xF9C4, 0x8766, 0xF9C5, 0x8CC0, 0xF9C6, 0x9050, + 0xF9C7, 0x971E, 0xF9C8, 0x9C15, 0xF9C9, 0x58D1, 0xF9CA, 0x5B78, 0xF9CB, 0x8650, 0xF9CC, 0x8B14, 0xF9CD, 0x9DB4, 0xF9CE, 0x5BD2, + 0xF9CF, 0x6068, 0xF9D0, 0x608D, 0xF9D1, 0x65F1, 0xF9D2, 0x6C57, 0xF9D3, 0x6F22, 0xF9D4, 0x6FA3, 0xF9D5, 0x701A, 0xF9D6, 0x7F55, + 0xF9D7, 0x7FF0, 0xF9D8, 0x9591, 0xF9D9, 0x9592, 0xF9DA, 0x9650, 0xF9DB, 0x97D3, 0xF9DC, 0x5272, 0xF9DD, 0x8F44, 0xF9DE, 0x51FD, + 0xF9DF, 0x542B, 0xF9E0, 0x54B8, 0xF9E1, 0x5563, 0xF9E2, 0x558A, 0xF9E3, 0x6ABB, 0xF9E4, 0x6DB5, 0xF9E5, 0x7DD8, 0xF9E6, 0x8266, + 0xF9E7, 0x929C, 0xF9E8, 0x9677, 0xF9E9, 0x9E79, 0xF9EA, 0x5408, 0xF9EB, 0x54C8, 0xF9EC, 0x76D2, 0xF9ED, 0x86E4, 0xF9EE, 0x95A4, + 0xF9EF, 0x95D4, 0xF9F0, 0x965C, 0xF9F1, 0x4EA2, 0xF9F2, 0x4F09, 0xF9F3, 0x59EE, 0xF9F4, 0x5AE6, 0xF9F5, 0x5DF7, 0xF9F6, 0x6052, + 0xF9F7, 0x6297, 0xF9F8, 0x676D, 0xF9F9, 0x6841, 0xF9FA, 0x6C86, 0xF9FB, 0x6E2F, 0xF9FC, 0x7F38, 0xF9FD, 0x809B, 0xF9FE, 0x822A, + 0xFAA1, 0xFA08, 0xFAA2, 0xFA09, 0xFAA3, 0x9805, 0xFAA4, 0x4EA5, 0xFAA5, 0x5055, 0xFAA6, 0x54B3, 0xFAA7, 0x5793, 0xFAA8, 0x595A, + 0xFAA9, 0x5B69, 0xFAAA, 0x5BB3, 0xFAAB, 0x61C8, 0xFAAC, 0x6977, 0xFAAD, 0x6D77, 0xFAAE, 0x7023, 0xFAAF, 0x87F9, 0xFAB0, 0x89E3, + 0xFAB1, 0x8A72, 0xFAB2, 0x8AE7, 0xFAB3, 0x9082, 0xFAB4, 0x99ED, 0xFAB5, 0x9AB8, 0xFAB6, 0x52BE, 0xFAB7, 0x6838, 0xFAB8, 0x5016, + 0xFAB9, 0x5E78, 0xFABA, 0x674F, 0xFABB, 0x8347, 0xFABC, 0x884C, 0xFABD, 0x4EAB, 0xFABE, 0x5411, 0xFABF, 0x56AE, 0xFAC0, 0x73E6, + 0xFAC1, 0x9115, 0xFAC2, 0x97FF, 0xFAC3, 0x9909, 0xFAC4, 0x9957, 0xFAC5, 0x9999, 0xFAC6, 0x5653, 0xFAC7, 0x589F, 0xFAC8, 0x865B, + 0xFAC9, 0x8A31, 0xFACA, 0x61B2, 0xFACB, 0x6AF6, 0xFACC, 0x737B, 0xFACD, 0x8ED2, 0xFACE, 0x6B47, 0xFACF, 0x96AA, 0xFAD0, 0x9A57, + 0xFAD1, 0x5955, 0xFAD2, 0x7200, 0xFAD3, 0x8D6B, 0xFAD4, 0x9769, 0xFAD5, 0x4FD4, 0xFAD6, 0x5CF4, 0xFAD7, 0x5F26, 0xFAD8, 0x61F8, + 0xFAD9, 0x665B, 0xFADA, 0x6CEB, 0xFADB, 0x70AB, 0xFADC, 0x7384, 0xFADD, 0x73B9, 0xFADE, 0x73FE, 0xFADF, 0x7729, 0xFAE0, 0x774D, + 0xFAE1, 0x7D43, 0xFAE2, 0x7D62, 0xFAE3, 0x7E23, 0xFAE4, 0x8237, 0xFAE5, 0x8852, 0xFAE6, 0xFA0A, 0xFAE7, 0x8CE2, 0xFAE8, 0x9249, + 0xFAE9, 0x986F, 0xFAEA, 0x5B51, 0xFAEB, 0x7A74, 0xFAEC, 0x8840, 0xFAED, 0x9801, 0xFAEE, 0x5ACC, 0xFAEF, 0x4FE0, 0xFAF0, 0x5354, + 0xFAF1, 0x593E, 0xFAF2, 0x5CFD, 0xFAF3, 0x633E, 0xFAF4, 0x6D79, 0xFAF5, 0x72F9, 0xFAF6, 0x8105, 0xFAF7, 0x8107, 0xFAF8, 0x83A2, + 0xFAF9, 0x92CF, 0xFAFA, 0x9830, 0xFAFB, 0x4EA8, 0xFAFC, 0x5144, 0xFAFD, 0x5211, 0xFAFE, 0x578B, 0xFBA1, 0x5F62, 0xFBA2, 0x6CC2, + 0xFBA3, 0x6ECE, 0xFBA4, 0x7005, 0xFBA5, 0x7050, 0xFBA6, 0x70AF, 0xFBA7, 0x7192, 0xFBA8, 0x73E9, 0xFBA9, 0x7469, 0xFBAA, 0x834A, + 0xFBAB, 0x87A2, 0xFBAC, 0x8861, 0xFBAD, 0x9008, 0xFBAE, 0x90A2, 0xFBAF, 0x93A3, 0xFBB0, 0x99A8, 0xFBB1, 0x516E, 0xFBB2, 0x5F57, + 0xFBB3, 0x60E0, 0xFBB4, 0x6167, 0xFBB5, 0x66B3, 0xFBB6, 0x8559, 0xFBB7, 0x8E4A, 0xFBB8, 0x91AF, 0xFBB9, 0x978B, 0xFBBA, 0x4E4E, + 0xFBBB, 0x4E92, 0xFBBC, 0x547C, 0xFBBD, 0x58D5, 0xFBBE, 0x58FA, 0xFBBF, 0x597D, 0xFBC0, 0x5CB5, 0xFBC1, 0x5F27, 0xFBC2, 0x6236, + 0xFBC3, 0x6248, 0xFBC4, 0x660A, 0xFBC5, 0x6667, 0xFBC6, 0x6BEB, 0xFBC7, 0x6D69, 0xFBC8, 0x6DCF, 0xFBC9, 0x6E56, 0xFBCA, 0x6EF8, + 0xFBCB, 0x6F94, 0xFBCC, 0x6FE0, 0xFBCD, 0x6FE9, 0xFBCE, 0x705D, 0xFBCF, 0x72D0, 0xFBD0, 0x7425, 0xFBD1, 0x745A, 0xFBD2, 0x74E0, + 0xFBD3, 0x7693, 0xFBD4, 0x795C, 0xFBD5, 0x7CCA, 0xFBD6, 0x7E1E, 0xFBD7, 0x80E1, 0xFBD8, 0x82A6, 0xFBD9, 0x846B, 0xFBDA, 0x84BF, + 0xFBDB, 0x864E, 0xFBDC, 0x865F, 0xFBDD, 0x8774, 0xFBDE, 0x8B77, 0xFBDF, 0x8C6A, 0xFBE0, 0x93AC, 0xFBE1, 0x9800, 0xFBE2, 0x9865, + 0xFBE3, 0x60D1, 0xFBE4, 0x6216, 0xFBE5, 0x9177, 0xFBE6, 0x5A5A, 0xFBE7, 0x660F, 0xFBE8, 0x6DF7, 0xFBE9, 0x6E3E, 0xFBEA, 0x743F, + 0xFBEB, 0x9B42, 0xFBEC, 0x5FFD, 0xFBED, 0x60DA, 0xFBEE, 0x7B0F, 0xFBEF, 0x54C4, 0xFBF0, 0x5F18, 0xFBF1, 0x6C5E, 0xFBF2, 0x6CD3, + 0xFBF3, 0x6D2A, 0xFBF4, 0x70D8, 0xFBF5, 0x7D05, 0xFBF6, 0x8679, 0xFBF7, 0x8A0C, 0xFBF8, 0x9D3B, 0xFBF9, 0x5316, 0xFBFA, 0x548C, + 0xFBFB, 0x5B05, 0xFBFC, 0x6A3A, 0xFBFD, 0x706B, 0xFBFE, 0x7575, 0xFCA1, 0x798D, 0xFCA2, 0x79BE, 0xFCA3, 0x82B1, 0xFCA4, 0x83EF, + 0xFCA5, 0x8A71, 0xFCA6, 0x8B41, 0xFCA7, 0x8CA8, 0xFCA8, 0x9774, 0xFCA9, 0xFA0B, 0xFCAA, 0x64F4, 0xFCAB, 0x652B, 0xFCAC, 0x78BA, + 0xFCAD, 0x78BB, 0xFCAE, 0x7A6B, 0xFCAF, 0x4E38, 0xFCB0, 0x559A, 0xFCB1, 0x5950, 0xFCB2, 0x5BA6, 0xFCB3, 0x5E7B, 0xFCB4, 0x60A3, + 0xFCB5, 0x63DB, 0xFCB6, 0x6B61, 0xFCB7, 0x6665, 0xFCB8, 0x6853, 0xFCB9, 0x6E19, 0xFCBA, 0x7165, 0xFCBB, 0x74B0, 0xFCBC, 0x7D08, + 0xFCBD, 0x9084, 0xFCBE, 0x9A69, 0xFCBF, 0x9C25, 0xFCC0, 0x6D3B, 0xFCC1, 0x6ED1, 0xFCC2, 0x733E, 0xFCC3, 0x8C41, 0xFCC4, 0x95CA, + 0xFCC5, 0x51F0, 0xFCC6, 0x5E4C, 0xFCC7, 0x5FA8, 0xFCC8, 0x604D, 0xFCC9, 0x60F6, 0xFCCA, 0x6130, 0xFCCB, 0x614C, 0xFCCC, 0x6643, + 0xFCCD, 0x6644, 0xFCCE, 0x69A5, 0xFCCF, 0x6CC1, 0xFCD0, 0x6E5F, 0xFCD1, 0x6EC9, 0xFCD2, 0x6F62, 0xFCD3, 0x714C, 0xFCD4, 0x749C, + 0xFCD5, 0x7687, 0xFCD6, 0x7BC1, 0xFCD7, 0x7C27, 0xFCD8, 0x8352, 0xFCD9, 0x8757, 0xFCDA, 0x9051, 0xFCDB, 0x968D, 0xFCDC, 0x9EC3, + 0xFCDD, 0x532F, 0xFCDE, 0x56DE, 0xFCDF, 0x5EFB, 0xFCE0, 0x5F8A, 0xFCE1, 0x6062, 0xFCE2, 0x6094, 0xFCE3, 0x61F7, 0xFCE4, 0x6666, + 0xFCE5, 0x6703, 0xFCE6, 0x6A9C, 0xFCE7, 0x6DEE, 0xFCE8, 0x6FAE, 0xFCE9, 0x7070, 0xFCEA, 0x736A, 0xFCEB, 0x7E6A, 0xFCEC, 0x81BE, + 0xFCED, 0x8334, 0xFCEE, 0x86D4, 0xFCEF, 0x8AA8, 0xFCF0, 0x8CC4, 0xFCF1, 0x5283, 0xFCF2, 0x7372, 0xFCF3, 0x5B96, 0xFCF4, 0x6A6B, + 0xFCF5, 0x9404, 0xFCF6, 0x54EE, 0xFCF7, 0x5686, 0xFCF8, 0x5B5D, 0xFCF9, 0x6548, 0xFCFA, 0x6585, 0xFCFB, 0x66C9, 0xFCFC, 0x689F, + 0xFCFD, 0x6D8D, 0xFCFE, 0x6DC6, 0xFDA1, 0x723B, 0xFDA2, 0x80B4, 0xFDA3, 0x9175, 0xFDA4, 0x9A4D, 0xFDA5, 0x4FAF, 0xFDA6, 0x5019, + 0xFDA7, 0x539A, 0xFDA8, 0x540E, 0xFDA9, 0x543C, 0xFDAA, 0x5589, 0xFDAB, 0x55C5, 0xFDAC, 0x5E3F, 0xFDAD, 0x5F8C, 0xFDAE, 0x673D, + 0xFDAF, 0x7166, 0xFDB0, 0x73DD, 0xFDB1, 0x9005, 0xFDB2, 0x52DB, 0xFDB3, 0x52F3, 0xFDB4, 0x5864, 0xFDB5, 0x58CE, 0xFDB6, 0x7104, + 0xFDB7, 0x718F, 0xFDB8, 0x71FB, 0xFDB9, 0x85B0, 0xFDBA, 0x8A13, 0xFDBB, 0x6688, 0xFDBC, 0x85A8, 0xFDBD, 0x55A7, 0xFDBE, 0x6684, + 0xFDBF, 0x714A, 0xFDC0, 0x8431, 0xFDC1, 0x5349, 0xFDC2, 0x5599, 0xFDC3, 0x6BC1, 0xFDC4, 0x5F59, 0xFDC5, 0x5FBD, 0xFDC6, 0x63EE, + 0xFDC7, 0x6689, 0xFDC8, 0x7147, 0xFDC9, 0x8AF1, 0xFDCA, 0x8F1D, 0xFDCB, 0x9EBE, 0xFDCC, 0x4F11, 0xFDCD, 0x643A, 0xFDCE, 0x70CB, + 0xFDCF, 0x7566, 0xFDD0, 0x8667, 0xFDD1, 0x6064, 0xFDD2, 0x8B4E, 0xFDD3, 0x9DF8, 0xFDD4, 0x5147, 0xFDD5, 0x51F6, 0xFDD6, 0x5308, + 0xFDD7, 0x6D36, 0xFDD8, 0x80F8, 0xFDD9, 0x9ED1, 0xFDDA, 0x6615, 0xFDDB, 0x6B23, 0xFDDC, 0x7098, 0xFDDD, 0x75D5, 0xFDDE, 0x5403, + 0xFDDF, 0x5C79, 0xFDE0, 0x7D07, 0xFDE1, 0x8A16, 0xFDE2, 0x6B20, 0xFDE3, 0x6B3D, 0xFDE4, 0x6B46, 0xFDE5, 0x5438, 0xFDE6, 0x6070, + 0xFDE7, 0x6D3D, 0xFDE8, 0x7FD5, 0xFDE9, 0x8208, 0xFDEA, 0x50D6, 0xFDEB, 0x51DE, 0xFDEC, 0x559C, 0xFDED, 0x566B, 0xFDEE, 0x56CD, + 0xFDEF, 0x59EC, 0xFDF0, 0x5B09, 0xFDF1, 0x5E0C, 0xFDF2, 0x6199, 0xFDF3, 0x6198, 0xFDF4, 0x6231, 0xFDF5, 0x665E, 0xFDF6, 0x66E6, + 0xFDF7, 0x7199, 0xFDF8, 0x71B9, 0xFDF9, 0x71BA, 0xFDFA, 0x72A7, 0xFDFB, 0x79A7, 0xFDFC, 0x7A00, 0xFDFD, 0x7FB2, 0xFDFE, 0x8A70, + 0, 0 +}; +#endif + +#if FF_CODE_PAGE == 950 || FF_CODE_PAGE == 0 /* Traditional Chinese */ +static const WCHAR uni2oem950[] = { /* Unicode --> Big5 pairs */ + 0x00A7, 0xA1B1, 0x00AF, 0xA1C2, 0x00B0, 0xA258, 0x00B1, 0xA1D3, 0x00B7, 0xA150, 0x00D7, 0xA1D1, 0x00F7, 0xA1D2, 0x02C7, 0xA3BE, + 0x02C9, 0xA3BC, 0x02CA, 0xA3BD, 0x02CB, 0xA3BF, 0x02CD, 0xA1C5, 0x02D9, 0xA3BB, 0x0391, 0xA344, 0x0392, 0xA345, 0x0393, 0xA346, + 0x0394, 0xA347, 0x0395, 0xA348, 0x0396, 0xA349, 0x0397, 0xA34A, 0x0398, 0xA34B, 0x0399, 0xA34C, 0x039A, 0xA34D, 0x039B, 0xA34E, + 0x039C, 0xA34F, 0x039D, 0xA350, 0x039E, 0xA351, 0x039F, 0xA352, 0x03A0, 0xA353, 0x03A1, 0xA354, 0x03A3, 0xA355, 0x03A4, 0xA356, + 0x03A5, 0xA357, 0x03A6, 0xA358, 0x03A7, 0xA359, 0x03A8, 0xA35A, 0x03A9, 0xA35B, 0x03B1, 0xA35C, 0x03B2, 0xA35D, 0x03B3, 0xA35E, + 0x03B4, 0xA35F, 0x03B5, 0xA360, 0x03B6, 0xA361, 0x03B7, 0xA362, 0x03B8, 0xA363, 0x03B9, 0xA364, 0x03BA, 0xA365, 0x03BB, 0xA366, + 0x03BC, 0xA367, 0x03BD, 0xA368, 0x03BE, 0xA369, 0x03BF, 0xA36A, 0x03C0, 0xA36B, 0x03C1, 0xA36C, 0x03C3, 0xA36D, 0x03C4, 0xA36E, + 0x03C5, 0xA36F, 0x03C6, 0xA370, 0x03C7, 0xA371, 0x03C8, 0xA372, 0x03C9, 0xA373, 0x2013, 0xA156, 0x2014, 0xA158, 0x2018, 0xA1A5, + 0x2019, 0xA1A6, 0x201C, 0xA1A7, 0x201D, 0xA1A8, 0x2025, 0xA14C, 0x2026, 0xA14B, 0x2027, 0xA145, 0x2032, 0xA1AC, 0x2035, 0xA1AB, + 0x203B, 0xA1B0, 0x20AC, 0xA3E1, 0x2103, 0xA24A, 0x2105, 0xA1C1, 0x2109, 0xA24B, 0x2160, 0xA2B9, 0x2161, 0xA2BA, 0x2162, 0xA2BB, + 0x2163, 0xA2BC, 0x2164, 0xA2BD, 0x2165, 0xA2BE, 0x2166, 0xA2BF, 0x2167, 0xA2C0, 0x2168, 0xA2C1, 0x2169, 0xA2C2, 0x2190, 0xA1F6, + 0x2191, 0xA1F4, 0x2192, 0xA1F7, 0x2193, 0xA1F5, 0x2196, 0xA1F8, 0x2197, 0xA1F9, 0x2198, 0xA1FB, 0x2199, 0xA1FA, 0x2215, 0xA241, + 0x221A, 0xA1D4, 0x221E, 0xA1DB, 0x221F, 0xA1E8, 0x2220, 0xA1E7, 0x2223, 0xA1FD, 0x2225, 0xA1FC, 0x2229, 0xA1E4, 0x222A, 0xA1E5, + 0x222B, 0xA1EC, 0x222E, 0xA1ED, 0x2234, 0xA1EF, 0x2235, 0xA1EE, 0x2252, 0xA1DC, 0x2260, 0xA1DA, 0x2261, 0xA1DD, 0x2266, 0xA1D8, + 0x2267, 0xA1D9, 0x2295, 0xA1F2, 0x2299, 0xA1F3, 0x22A5, 0xA1E6, 0x22BF, 0xA1E9, 0x2500, 0xA277, 0x2502, 0xA278, 0x250C, 0xA27A, + 0x2510, 0xA27B, 0x2514, 0xA27C, 0x2518, 0xA27D, 0x251C, 0xA275, 0x2524, 0xA274, 0x252C, 0xA273, 0x2534, 0xA272, 0x253C, 0xA271, + 0x2550, 0xA2A4, 0x2550, 0xF9F9, 0x2551, 0xF9F8, 0x2552, 0xF9E6, 0x2553, 0xF9EF, 0x2554, 0xF9DD, 0x2555, 0xF9E8, 0x2556, 0xF9F1, + 0x2557, 0xF9DF, 0x2558, 0xF9EC, 0x2559, 0xF9F5, 0x255A, 0xF9E3, 0x255B, 0xF9EE, 0x255C, 0xF9F7, 0x255D, 0xF9E5, 0x255E, 0xA2A5, + 0x255E, 0xF9E9, 0x255F, 0xF9F2, 0x2560, 0xF9E0, 0x2561, 0xA2A7, 0x2561, 0xF9EB, 0x2562, 0xF9F4, 0x2563, 0xF9E2, 0x2564, 0xF9E7, + 0x2565, 0xF9F0, 0x2566, 0xF9DE, 0x2567, 0xF9ED, 0x2568, 0xF9F6, 0x2569, 0xF9E4, 0x256A, 0xA2A6, 0x256A, 0xF9EA, 0x256B, 0xF9F3, + 0x256C, 0xF9E1, 0x256D, 0xA27E, 0x256D, 0xF9FA, 0x256E, 0xA2A1, 0x256E, 0xF9FB, 0x256F, 0xA2A3, 0x256F, 0xF9FD, 0x2570, 0xA2A2, + 0x2570, 0xF9FC, 0x2571, 0xA2AC, 0x2572, 0xA2AD, 0x2573, 0xA2AE, 0x2574, 0xA15A, 0x2581, 0xA262, 0x2582, 0xA263, 0x2583, 0xA264, + 0x2584, 0xA265, 0x2585, 0xA266, 0x2586, 0xA267, 0x2587, 0xA268, 0x2588, 0xA269, 0x2589, 0xA270, 0x258A, 0xA26F, 0x258B, 0xA26E, + 0x258C, 0xA26D, 0x258D, 0xA26C, 0x258E, 0xA26B, 0x258F, 0xA26A, 0x2593, 0xF9FE, 0x2594, 0xA276, 0x2595, 0xA279, 0x25A0, 0xA1BD, + 0x25A1, 0xA1BC, 0x25B2, 0xA1B6, 0x25B3, 0xA1B5, 0x25BC, 0xA1BF, 0x25BD, 0xA1BE, 0x25C6, 0xA1BB, 0x25C7, 0xA1BA, 0x25CB, 0xA1B3, + 0x25CE, 0xA1B7, 0x25CF, 0xA1B4, 0x25E2, 0xA2A8, 0x25E3, 0xA2A9, 0x25E4, 0xA2AB, 0x25E5, 0xA2AA, 0x2605, 0xA1B9, 0x2606, 0xA1B8, + 0x2640, 0xA1F0, 0x2642, 0xA1F1, 0x3000, 0xA140, 0x3001, 0xA142, 0x3002, 0xA143, 0x3003, 0xA1B2, 0x3008, 0xA171, 0x3009, 0xA172, + 0x300A, 0xA16D, 0x300B, 0xA16E, 0x300C, 0xA175, 0x300D, 0xA176, 0x300E, 0xA179, 0x300F, 0xA17A, 0x3010, 0xA169, 0x3011, 0xA16A, + 0x3012, 0xA245, 0x3014, 0xA165, 0x3015, 0xA166, 0x301D, 0xA1A9, 0x301E, 0xA1AA, 0x3021, 0xA2C3, 0x3022, 0xA2C4, 0x3023, 0xA2C5, + 0x3024, 0xA2C6, 0x3025, 0xA2C7, 0x3026, 0xA2C8, 0x3027, 0xA2C9, 0x3028, 0xA2CA, 0x3029, 0xA2CB, 0x3105, 0xA374, 0x3106, 0xA375, + 0x3107, 0xA376, 0x3108, 0xA377, 0x3109, 0xA378, 0x310A, 0xA379, 0x310B, 0xA37A, 0x310C, 0xA37B, 0x310D, 0xA37C, 0x310E, 0xA37D, + 0x310F, 0xA37E, 0x3110, 0xA3A1, 0x3111, 0xA3A2, 0x3112, 0xA3A3, 0x3113, 0xA3A4, 0x3114, 0xA3A5, 0x3115, 0xA3A6, 0x3116, 0xA3A7, + 0x3117, 0xA3A8, 0x3118, 0xA3A9, 0x3119, 0xA3AA, 0x311A, 0xA3AB, 0x311B, 0xA3AC, 0x311C, 0xA3AD, 0x311D, 0xA3AE, 0x311E, 0xA3AF, + 0x311F, 0xA3B0, 0x3120, 0xA3B1, 0x3121, 0xA3B2, 0x3122, 0xA3B3, 0x3123, 0xA3B4, 0x3124, 0xA3B5, 0x3125, 0xA3B6, 0x3126, 0xA3B7, + 0x3127, 0xA3B8, 0x3128, 0xA3B9, 0x3129, 0xA3BA, 0x32A3, 0xA1C0, 0x338E, 0xA255, 0x338F, 0xA256, 0x339C, 0xA250, 0x339D, 0xA251, + 0x339E, 0xA252, 0x33A1, 0xA254, 0x33C4, 0xA257, 0x33CE, 0xA253, 0x33D1, 0xA1EB, 0x33D2, 0xA1EA, 0x33D5, 0xA24F, 0x4E00, 0xA440, + 0x4E01, 0xA442, 0x4E03, 0xA443, 0x4E07, 0xC945, 0x4E08, 0xA456, 0x4E09, 0xA454, 0x4E0A, 0xA457, 0x4E0B, 0xA455, 0x4E0C, 0xC946, + 0x4E0D, 0xA4A3, 0x4E0E, 0xC94F, 0x4E0F, 0xC94D, 0x4E10, 0xA4A2, 0x4E11, 0xA4A1, 0x4E14, 0xA542, 0x4E15, 0xA541, 0x4E16, 0xA540, + 0x4E18, 0xA543, 0x4E19, 0xA4FE, 0x4E1E, 0xA5E0, 0x4E1F, 0xA5E1, 0x4E26, 0xA8C3, 0x4E2B, 0xA458, 0x4E2D, 0xA4A4, 0x4E2E, 0xC950, + 0x4E30, 0xA4A5, 0x4E31, 0xC963, 0x4E32, 0xA6EA, 0x4E33, 0xCBB1, 0x4E38, 0xA459, 0x4E39, 0xA4A6, 0x4E3B, 0xA544, 0x4E3C, 0xC964, + 0x4E42, 0xC940, 0x4E43, 0xA444, 0x4E45, 0xA45B, 0x4E47, 0xC947, 0x4E48, 0xA45C, 0x4E4B, 0xA4A7, 0x4E4D, 0xA545, 0x4E4E, 0xA547, + 0x4E4F, 0xA546, 0x4E52, 0xA5E2, 0x4E53, 0xA5E3, 0x4E56, 0xA8C4, 0x4E58, 0xADBC, 0x4E59, 0xA441, 0x4E5C, 0xC941, 0x4E5D, 0xA445, + 0x4E5E, 0xA45E, 0x4E5F, 0xA45D, 0x4E69, 0xA5E4, 0x4E73, 0xA8C5, 0x4E7E, 0xB0AE, 0x4E7F, 0xD44B, 0x4E82, 0xB6C3, 0x4E83, 0xDCB1, + 0x4E84, 0xDCB2, 0x4E86, 0xA446, 0x4E88, 0xA4A9, 0x4E8B, 0xA8C6, 0x4E8C, 0xA447, 0x4E8D, 0xC948, 0x4E8E, 0xA45F, 0x4E91, 0xA4AA, + 0x4E92, 0xA4AC, 0x4E93, 0xC951, 0x4E94, 0xA4AD, 0x4E95, 0xA4AB, 0x4E99, 0xA5E5, 0x4E9B, 0xA8C7, 0x4E9E, 0xA8C8, 0x4E9F, 0xAB45, + 0x4EA1, 0xA460, 0x4EA2, 0xA4AE, 0x4EA4, 0xA5E6, 0x4EA5, 0xA5E8, 0x4EA6, 0xA5E7, 0x4EA8, 0xA6EB, 0x4EAB, 0xA8C9, 0x4EAC, 0xA8CA, + 0x4EAD, 0xAB46, 0x4EAE, 0xAB47, 0x4EB3, 0xADBD, 0x4EB6, 0xDCB3, 0x4EB9, 0xF6D6, 0x4EBA, 0xA448, 0x4EC0, 0xA4B0, 0x4EC1, 0xA4AF, + 0x4EC2, 0xC952, 0x4EC3, 0xA4B1, 0x4EC4, 0xA4B7, 0x4EC6, 0xA4B2, 0x4EC7, 0xA4B3, 0x4EC8, 0xC954, 0x4EC9, 0xC953, 0x4ECA, 0xA4B5, + 0x4ECB, 0xA4B6, 0x4ECD, 0xA4B4, 0x4ED4, 0xA54A, 0x4ED5, 0xA54B, 0x4ED6, 0xA54C, 0x4ED7, 0xA54D, 0x4ED8, 0xA549, 0x4ED9, 0xA550, + 0x4EDA, 0xC96A, 0x4EDC, 0xC966, 0x4EDD, 0xC969, 0x4EDE, 0xA551, 0x4EDF, 0xA561, 0x4EE1, 0xC968, 0x4EE3, 0xA54E, 0x4EE4, 0xA54F, + 0x4EE5, 0xA548, 0x4EE8, 0xC965, 0x4EE9, 0xC967, 0x4EF0, 0xA5F5, 0x4EF1, 0xC9B0, 0x4EF2, 0xA5F2, 0x4EF3, 0xA5F6, 0x4EF4, 0xC9BA, + 0x4EF5, 0xC9AE, 0x4EF6, 0xA5F3, 0x4EF7, 0xC9B2, 0x4EFB, 0xA5F4, 0x4EFD, 0xA5F7, 0x4EFF, 0xA5E9, 0x4F00, 0xC9B1, 0x4F01, 0xA5F8, + 0x4F02, 0xC9B5, 0x4F04, 0xC9B9, 0x4F05, 0xC9B6, 0x4F08, 0xC9B3, 0x4F09, 0xA5EA, 0x4F0A, 0xA5EC, 0x4F0B, 0xA5F9, 0x4F0D, 0xA5EE, + 0x4F0E, 0xC9AB, 0x4F0F, 0xA5F1, 0x4F10, 0xA5EF, 0x4F11, 0xA5F0, 0x4F12, 0xC9BB, 0x4F13, 0xC9B8, 0x4F14, 0xC9AF, 0x4F15, 0xA5ED, + 0x4F18, 0xC9AC, 0x4F19, 0xA5EB, 0x4F1D, 0xC9B4, 0x4F22, 0xC9B7, 0x4F2C, 0xC9AD, 0x4F2D, 0xCA66, 0x4F2F, 0xA742, 0x4F30, 0xA6F4, + 0x4F33, 0xCA67, 0x4F34, 0xA6F1, 0x4F36, 0xA744, 0x4F38, 0xA6F9, 0x4F3A, 0xA6F8, 0x4F3B, 0xCA5B, 0x4F3C, 0xA6FC, 0x4F3D, 0xA6F7, + 0x4F3E, 0xCA60, 0x4F3F, 0xCA68, 0x4F41, 0xCA64, 0x4F43, 0xA6FA, 0x4F46, 0xA6FD, 0x4F47, 0xA6EE, 0x4F48, 0xA747, 0x4F49, 0xCA5D, + 0x4F4C, 0xCBBD, 0x4F4D, 0xA6EC, 0x4F4E, 0xA743, 0x4F4F, 0xA6ED, 0x4F50, 0xA6F5, 0x4F51, 0xA6F6, 0x4F52, 0xCA62, 0x4F53, 0xCA5E, + 0x4F54, 0xA6FB, 0x4F55, 0xA6F3, 0x4F56, 0xCA5A, 0x4F57, 0xA6EF, 0x4F58, 0xCA65, 0x4F59, 0xA745, 0x4F5A, 0xA748, 0x4F5B, 0xA6F2, + 0x4F5C, 0xA740, 0x4F5D, 0xA746, 0x4F5E, 0xA6F0, 0x4F5F, 0xCA63, 0x4F60, 0xA741, 0x4F61, 0xCA69, 0x4F62, 0xCA5C, 0x4F63, 0xA6FE, + 0x4F64, 0xCA5F, 0x4F67, 0xCA61, 0x4F69, 0xA8D8, 0x4F6A, 0xCBBF, 0x4F6B, 0xCBCB, 0x4F6C, 0xA8D0, 0x4F6E, 0xCBCC, 0x4F6F, 0xA8CB, + 0x4F70, 0xA8D5, 0x4F73, 0xA8CE, 0x4F74, 0xCBB9, 0x4F75, 0xA8D6, 0x4F76, 0xCBB8, 0x4F77, 0xCBBC, 0x4F78, 0xCBC3, 0x4F79, 0xCBC1, + 0x4F7A, 0xA8DE, 0x4F7B, 0xA8D9, 0x4F7C, 0xCBB3, 0x4F7D, 0xCBB5, 0x4F7E, 0xA8DB, 0x4F7F, 0xA8CF, 0x4F80, 0xCBB6, 0x4F81, 0xCBC2, + 0x4F82, 0xCBC9, 0x4F83, 0xA8D4, 0x4F84, 0xCBBB, 0x4F85, 0xCBB4, 0x4F86, 0xA8D3, 0x4F87, 0xCBB7, 0x4F88, 0xA8D7, 0x4F89, 0xCBBA, + 0x4F8B, 0xA8D2, 0x4F8D, 0xA8CD, 0x4F8F, 0xA8DC, 0x4F90, 0xCBC4, 0x4F91, 0xA8DD, 0x4F92, 0xCBC8, 0x4F94, 0xCBC6, 0x4F95, 0xCBCA, + 0x4F96, 0xA8DA, 0x4F97, 0xCBBE, 0x4F98, 0xCBB2, 0x4F9A, 0xCBC0, 0x4F9B, 0xA8D1, 0x4F9C, 0xCBC5, 0x4F9D, 0xA8CC, 0x4F9E, 0xCBC7, + 0x4FAE, 0xAB56, 0x4FAF, 0xAB4A, 0x4FB2, 0xCDE0, 0x4FB3, 0xCDE8, 0x4FB5, 0xAB49, 0x4FB6, 0xAB51, 0x4FB7, 0xAB5D, 0x4FB9, 0xCDEE, + 0x4FBA, 0xCDEC, 0x4FBB, 0xCDE7, 0x4FBF, 0xAB4B, 0x4FC0, 0xCDED, 0x4FC1, 0xCDE3, 0x4FC2, 0xAB59, 0x4FC3, 0xAB50, 0x4FC4, 0xAB58, + 0x4FC5, 0xCDDE, 0x4FC7, 0xCDEA, 0x4FC9, 0xCDE1, 0x4FCA, 0xAB54, 0x4FCB, 0xCDE2, 0x4FCD, 0xCDDD, 0x4FCE, 0xAB5B, 0x4FCF, 0xAB4E, + 0x4FD0, 0xAB57, 0x4FD1, 0xAB4D, 0x4FD3, 0xCDDF, 0x4FD4, 0xCDE4, 0x4FD6, 0xCDEB, 0x4FD7, 0xAB55, 0x4FD8, 0xAB52, 0x4FD9, 0xCDE6, + 0x4FDA, 0xAB5A, 0x4FDB, 0xCDE9, 0x4FDC, 0xCDE5, 0x4FDD, 0xAB4F, 0x4FDE, 0xAB5C, 0x4FDF, 0xAB53, 0x4FE0, 0xAB4C, 0x4FE1, 0xAB48, + 0x4FEC, 0xCDEF, 0x4FEE, 0xADD7, 0x4FEF, 0xADC1, 0x4FF1, 0xADD1, 0x4FF3, 0xADD6, 0x4FF4, 0xD0D0, 0x4FF5, 0xD0CF, 0x4FF6, 0xD0D4, + 0x4FF7, 0xD0D5, 0x4FF8, 0xADC4, 0x4FFA, 0xADCD, 0x4FFE, 0xADDA, 0x5000, 0xADCE, 0x5005, 0xD0C9, 0x5006, 0xADC7, 0x5007, 0xD0CA, + 0x5009, 0xADDC, 0x500B, 0xADD3, 0x500C, 0xADBE, 0x500D, 0xADBF, 0x500E, 0xD0DD, 0x500F, 0xB0BF, 0x5011, 0xADCC, 0x5012, 0xADCB, + 0x5013, 0xD0CB, 0x5014, 0xADCF, 0x5015, 0xD45B, 0x5016, 0xADC6, 0x5017, 0xD0D6, 0x5018, 0xADD5, 0x5019, 0xADD4, 0x501A, 0xADCA, + 0x501B, 0xD0CE, 0x501C, 0xD0D7, 0x501E, 0xD0C8, 0x501F, 0xADC9, 0x5020, 0xD0D8, 0x5021, 0xADD2, 0x5022, 0xD0CC, 0x5023, 0xADC0, + 0x5025, 0xADC3, 0x5026, 0xADC2, 0x5027, 0xD0D9, 0x5028, 0xADD0, 0x5029, 0xADC5, 0x502A, 0xADD9, 0x502B, 0xADDB, 0x502C, 0xD0D3, + 0x502D, 0xADD8, 0x502F, 0xD0DB, 0x5030, 0xD0CD, 0x5031, 0xD0DC, 0x5033, 0xD0D1, 0x5035, 0xD0DA, 0x5037, 0xD0D2, 0x503C, 0xADC8, + 0x5040, 0xD463, 0x5041, 0xD457, 0x5043, 0xB0B3, 0x5045, 0xD45C, 0x5046, 0xD462, 0x5047, 0xB0B2, 0x5048, 0xD455, 0x5049, 0xB0B6, + 0x504A, 0xD459, 0x504B, 0xD452, 0x504C, 0xB0B4, 0x504D, 0xD456, 0x504E, 0xB0B9, 0x504F, 0xB0BE, 0x5051, 0xD467, 0x5053, 0xD451, + 0x5055, 0xB0BA, 0x5057, 0xD466, 0x505A, 0xB0B5, 0x505B, 0xD458, 0x505C, 0xB0B1, 0x505D, 0xD453, 0x505E, 0xD44F, 0x505F, 0xD45D, + 0x5060, 0xD450, 0x5061, 0xD44E, 0x5062, 0xD45A, 0x5063, 0xD460, 0x5064, 0xD461, 0x5065, 0xB0B7, 0x5068, 0xD85B, 0x5069, 0xD45E, + 0x506A, 0xD44D, 0x506B, 0xD45F, 0x506D, 0xB0C1, 0x506E, 0xD464, 0x506F, 0xB0C0, 0x5070, 0xD44C, 0x5072, 0xD454, 0x5073, 0xD465, + 0x5074, 0xB0BC, 0x5075, 0xB0BB, 0x5076, 0xB0B8, 0x5077, 0xB0BD, 0x507A, 0xB0AF, 0x507D, 0xB0B0, 0x5080, 0xB3C8, 0x5082, 0xD85E, + 0x5083, 0xD857, 0x5085, 0xB3C5, 0x5087, 0xD85F, 0x508B, 0xD855, 0x508C, 0xD858, 0x508D, 0xB3C4, 0x508E, 0xD859, 0x5091, 0xB3C7, + 0x5092, 0xD85D, 0x5094, 0xD853, 0x5095, 0xD852, 0x5096, 0xB3C9, 0x5098, 0xB3CA, 0x5099, 0xB3C6, 0x509A, 0xB3CB, 0x509B, 0xD851, + 0x509C, 0xD85C, 0x509D, 0xD85A, 0x509E, 0xD854, 0x50A2, 0xB3C3, 0x50A3, 0xD856, 0x50AC, 0xB6CA, 0x50AD, 0xB6C4, 0x50AE, 0xDCB7, + 0x50AF, 0xB6CD, 0x50B0, 0xDCBD, 0x50B1, 0xDCC0, 0x50B2, 0xB6C6, 0x50B3, 0xB6C7, 0x50B4, 0xDCBA, 0x50B5, 0xB6C5, 0x50B6, 0xDCC3, + 0x50B7, 0xB6CB, 0x50B8, 0xDCC4, 0x50BA, 0xDCBF, 0x50BB, 0xB6CC, 0x50BD, 0xDCB4, 0x50BE, 0xB6C9, 0x50BF, 0xDCB5, 0x50C1, 0xDCBE, + 0x50C2, 0xDCBC, 0x50C4, 0xDCB8, 0x50C5, 0xB6C8, 0x50C6, 0xDCB6, 0x50C7, 0xB6CE, 0x50C8, 0xDCBB, 0x50C9, 0xDCC2, 0x50CA, 0xDCB9, + 0x50CB, 0xDCC1, 0x50CE, 0xB9B6, 0x50CF, 0xB9B3, 0x50D1, 0xB9B4, 0x50D3, 0xE0F9, 0x50D4, 0xE0F1, 0x50D5, 0xB9B2, 0x50D6, 0xB9AF, + 0x50D7, 0xE0F2, 0x50DA, 0xB9B1, 0x50DB, 0xE0F5, 0x50DD, 0xE0F7, 0x50E0, 0xE0FE, 0x50E3, 0xE0FD, 0x50E4, 0xE0F8, 0x50E5, 0xB9AE, + 0x50E6, 0xE0F0, 0x50E7, 0xB9AC, 0x50E8, 0xE0F3, 0x50E9, 0xB9B7, 0x50EA, 0xE0F6, 0x50EC, 0xE0FA, 0x50ED, 0xB9B0, 0x50EE, 0xB9AD, + 0x50EF, 0xE0FC, 0x50F0, 0xE0FB, 0x50F1, 0xB9B5, 0x50F3, 0xE0F4, 0x50F5, 0xBBF8, 0x50F6, 0xE4EC, 0x50F8, 0xE4E9, 0x50F9, 0xBBF9, + 0x50FB, 0xBBF7, 0x50FD, 0xE4F0, 0x50FE, 0xE4ED, 0x50FF, 0xE4E6, 0x5100, 0xBBF6, 0x5102, 0xBBFA, 0x5103, 0xE4E7, 0x5104, 0xBBF5, + 0x5105, 0xBBFD, 0x5106, 0xE4EA, 0x5107, 0xE4EB, 0x5108, 0xBBFB, 0x5109, 0xBBFC, 0x510A, 0xE4F1, 0x510B, 0xE4EE, 0x510C, 0xE4EF, + 0x5110, 0xBEAA, 0x5111, 0xE8F8, 0x5112, 0xBEA7, 0x5113, 0xE8F5, 0x5114, 0xBEA9, 0x5115, 0xBEAB, 0x5117, 0xE8F6, 0x5118, 0xBEA8, + 0x511A, 0xE8F7, 0x511C, 0xE8F4, 0x511F, 0xC076, 0x5120, 0xECBD, 0x5121, 0xC077, 0x5122, 0xECBB, 0x5124, 0xECBC, 0x5125, 0xECBA, + 0x5126, 0xECB9, 0x5129, 0xECBE, 0x512A, 0xC075, 0x512D, 0xEFB8, 0x512E, 0xEFB9, 0x5130, 0xE4E8, 0x5131, 0xEFB7, 0x5132, 0xC078, + 0x5133, 0xC35F, 0x5134, 0xF1EB, 0x5135, 0xF1EC, 0x5137, 0xC4D7, 0x5138, 0xC4D8, 0x5139, 0xF5C1, 0x513A, 0xF5C0, 0x513B, 0xC56C, + 0x513C, 0xC56B, 0x513D, 0xF7D0, 0x513F, 0xA449, 0x5140, 0xA461, 0x5141, 0xA4B9, 0x5143, 0xA4B8, 0x5144, 0xA553, 0x5145, 0xA552, + 0x5146, 0xA5FC, 0x5147, 0xA5FB, 0x5148, 0xA5FD, 0x5149, 0xA5FA, 0x514B, 0xA74A, 0x514C, 0xA749, 0x514D, 0xA74B, 0x5152, 0xA8E0, + 0x5154, 0xA8DF, 0x5155, 0xA8E1, 0x5157, 0xAB5E, 0x5159, 0xA259, 0x515A, 0xD0DE, 0x515B, 0xA25A, 0x515C, 0xB0C2, 0x515D, 0xA25C, + 0x515E, 0xA25B, 0x515F, 0xD860, 0x5161, 0xA25D, 0x5162, 0xB9B8, 0x5163, 0xA25E, 0x5165, 0xA44A, 0x5167, 0xA4BA, 0x5168, 0xA5FE, + 0x5169, 0xA8E2, 0x516B, 0xA44B, 0x516C, 0xA4BD, 0x516D, 0xA4BB, 0x516E, 0xA4BC, 0x5171, 0xA640, 0x5175, 0xA74C, 0x5176, 0xA8E4, + 0x5177, 0xA8E3, 0x5178, 0xA8E5, 0x517C, 0xADDD, 0x5180, 0xBEAC, 0x5187, 0xC94E, 0x5189, 0xA554, 0x518A, 0xA555, 0x518D, 0xA641, + 0x518F, 0xCA6A, 0x5191, 0xAB60, 0x5192, 0xAB5F, 0x5193, 0xD0E0, 0x5194, 0xD0DF, 0x5195, 0xB0C3, 0x5197, 0xA4BE, 0x5198, 0xC955, + 0x519E, 0xCBCD, 0x51A0, 0xAB61, 0x51A2, 0xADE0, 0x51A4, 0xADDE, 0x51A5, 0xADDF, 0x51AA, 0xBEAD, 0x51AC, 0xA556, 0x51B0, 0xA642, + 0x51B1, 0xC9BC, 0x51B6, 0xA74D, 0x51B7, 0xA74E, 0x51B9, 0xCA6B, 0x51BC, 0xCBCE, 0x51BD, 0xA8E6, 0x51BE, 0xCBCF, 0x51C4, 0xD0E2, + 0x51C5, 0xD0E3, 0x51C6, 0xADE3, 0x51C8, 0xD0E4, 0x51CA, 0xD0E1, 0x51CB, 0xADE4, 0x51CC, 0xADE2, 0x51CD, 0xADE1, 0x51CE, 0xD0E5, + 0x51D0, 0xD468, 0x51D4, 0xD861, 0x51D7, 0xDCC5, 0x51D8, 0xE140, 0x51DC, 0xBBFE, 0x51DD, 0xBEAE, 0x51DE, 0xE8F9, 0x51E0, 0xA44C, + 0x51E1, 0xA45A, 0x51F0, 0xB0C4, 0x51F1, 0xB3CD, 0x51F3, 0xB9B9, 0x51F5, 0xC942, 0x51F6, 0xA4BF, 0x51F8, 0xA559, 0x51F9, 0xA557, + 0x51FA, 0xA558, 0x51FD, 0xA8E7, 0x5200, 0xA44D, 0x5201, 0xA44E, 0x5203, 0xA462, 0x5206, 0xA4C0, 0x5207, 0xA4C1, 0x5208, 0xA4C2, + 0x5209, 0xC9BE, 0x520A, 0xA55A, 0x520C, 0xC96B, 0x520E, 0xA646, 0x5210, 0xC9BF, 0x5211, 0xA644, 0x5212, 0xA645, 0x5213, 0xC9BD, + 0x5216, 0xA647, 0x5217, 0xA643, 0x521C, 0xCA6C, 0x521D, 0xAAEC, 0x521E, 0xCA6D, 0x5221, 0xCA6E, 0x5224, 0xA750, 0x5225, 0xA74F, + 0x5228, 0xA753, 0x5229, 0xA751, 0x522A, 0xA752, 0x522E, 0xA8ED, 0x5230, 0xA8EC, 0x5231, 0xCBD4, 0x5232, 0xCBD1, 0x5233, 0xCBD2, + 0x5235, 0xCBD0, 0x5236, 0xA8EE, 0x5237, 0xA8EA, 0x5238, 0xA8E9, 0x523A, 0xA8EB, 0x523B, 0xA8E8, 0x5241, 0xA8EF, 0x5243, 0xAB63, + 0x5244, 0xCDF0, 0x5246, 0xCBD3, 0x5247, 0xAB68, 0x5249, 0xCDF1, 0x524A, 0xAB64, 0x524B, 0xAB67, 0x524C, 0xAB66, 0x524D, 0xAB65, + 0x524E, 0xAB62, 0x5252, 0xD0E8, 0x5254, 0xADE7, 0x5255, 0xD0EB, 0x5256, 0xADE5, 0x525A, 0xD0E7, 0x525B, 0xADE8, 0x525C, 0xADE6, + 0x525D, 0xADE9, 0x525E, 0xD0E9, 0x525F, 0xD0EA, 0x5261, 0xD0E6, 0x5262, 0xD0EC, 0x5269, 0xB3D1, 0x526A, 0xB0C5, 0x526B, 0xD469, + 0x526C, 0xD46B, 0x526D, 0xD46A, 0x526E, 0xD46C, 0x526F, 0xB0C6, 0x5272, 0xB3CE, 0x5274, 0xB3CF, 0x5275, 0xB3D0, 0x5277, 0xB6D0, + 0x5278, 0xDCC7, 0x527A, 0xDCC6, 0x527B, 0xDCC8, 0x527C, 0xDCC9, 0x527D, 0xB6D1, 0x527F, 0xB6CF, 0x5280, 0xE141, 0x5281, 0xE142, + 0x5282, 0xB9BB, 0x5283, 0xB9BA, 0x5284, 0xE35A, 0x5287, 0xBC40, 0x5288, 0xBC41, 0x5289, 0xBC42, 0x528A, 0xBC44, 0x528B, 0xE4F2, + 0x528C, 0xE4F3, 0x528D, 0xBC43, 0x5291, 0xBEAF, 0x5293, 0xBEB0, 0x5296, 0xF1ED, 0x5297, 0xF5C3, 0x5298, 0xF5C2, 0x5299, 0xF7D1, + 0x529B, 0xA44F, 0x529F, 0xA55C, 0x52A0, 0xA55B, 0x52A3, 0xA648, 0x52A6, 0xC9C0, 0x52A9, 0xA755, 0x52AA, 0xA756, 0x52AB, 0xA754, + 0x52AC, 0xA757, 0x52AD, 0xCA6F, 0x52AE, 0xCA70, 0x52BB, 0xA8F1, 0x52BC, 0xCBD5, 0x52BE, 0xA8F0, 0x52C0, 0xCDF2, 0x52C1, 0xAB6C, + 0x52C2, 0xCDF3, 0x52C3, 0xAB6B, 0x52C7, 0xAB69, 0x52C9, 0xAB6A, 0x52CD, 0xD0ED, 0x52D2, 0xB0C7, 0x52D3, 0xD46E, 0x52D5, 0xB0CA, + 0x52D6, 0xD46D, 0x52D7, 0xB1E5, 0x52D8, 0xB0C9, 0x52D9, 0xB0C8, 0x52DB, 0xB3D4, 0x52DD, 0xB3D3, 0x52DE, 0xB3D2, 0x52DF, 0xB6D2, + 0x52E2, 0xB6D5, 0x52E3, 0xB6D6, 0x52E4, 0xB6D4, 0x52E6, 0xB6D3, 0x52E9, 0xE143, 0x52EB, 0xE144, 0x52EF, 0xE4F5, 0x52F0, 0xBC45, + 0x52F1, 0xE4F4, 0x52F3, 0xBEB1, 0x52F4, 0xECBF, 0x52F5, 0xC079, 0x52F7, 0xF1EE, 0x52F8, 0xC455, 0x52FA, 0xA463, 0x52FB, 0xA4C3, + 0x52FC, 0xC956, 0x52FE, 0xA4C4, 0x52FF, 0xA4C5, 0x5305, 0xA55D, 0x5306, 0xA55E, 0x5308, 0xA649, 0x5309, 0xCA71, 0x530A, 0xCBD6, + 0x530B, 0xCBD7, 0x530D, 0xAB6D, 0x530E, 0xD0EE, 0x530F, 0xB0CC, 0x5310, 0xB0CB, 0x5311, 0xD863, 0x5312, 0xD862, 0x5315, 0xA450, + 0x5316, 0xA4C6, 0x5317, 0xA55F, 0x5319, 0xB0CD, 0x531A, 0xC943, 0x531C, 0xC96C, 0x531D, 0xA560, 0x531F, 0xC9C2, 0x5320, 0xA64B, + 0x5321, 0xA64A, 0x5322, 0xC9C1, 0x5323, 0xA758, 0x532A, 0xADEA, 0x532D, 0xD46F, 0x532F, 0xB6D7, 0x5330, 0xE145, 0x5331, 0xB9BC, + 0x5334, 0xE8FA, 0x5337, 0xF3FD, 0x5339, 0xA4C7, 0x533C, 0xCBD8, 0x533D, 0xCDF4, 0x533E, 0xB0D0, 0x533F, 0xB0CE, 0x5340, 0xB0CF, + 0x5341, 0xA2CC, 0x5341, 0xA451, 0x5343, 0xA464, 0x5344, 0xA2CD, 0x5345, 0xA2CE, 0x5345, 0xA4CA, 0x5347, 0xA4C9, 0x5348, 0xA4C8, + 0x5349, 0xA563, 0x534A, 0xA562, 0x534C, 0xC96D, 0x534D, 0xC9C3, 0x5351, 0xA8F5, 0x5352, 0xA8F2, 0x5353, 0xA8F4, 0x5354, 0xA8F3, + 0x5357, 0xAB6E, 0x535A, 0xB3D5, 0x535C, 0xA452, 0x535E, 0xA4CB, 0x5360, 0xA565, 0x5361, 0xA564, 0x5363, 0xCA72, 0x5366, 0xA8F6, + 0x536C, 0xC957, 0x536E, 0xA567, 0x536F, 0xA566, 0x5370, 0xA64C, 0x5371, 0xA64D, 0x5372, 0xCA73, 0x5373, 0xA759, 0x5375, 0xA75A, + 0x5377, 0xA8F7, 0x5378, 0xA8F8, 0x5379, 0xA8F9, 0x537B, 0xAB6F, 0x537C, 0xCDF5, 0x537F, 0xADEB, 0x5382, 0xC944, 0x5384, 0xA4CC, + 0x538A, 0xC9C4, 0x538E, 0xCA74, 0x538F, 0xCA75, 0x5392, 0xCBD9, 0x5394, 0xCBDA, 0x5396, 0xCDF7, 0x5397, 0xCDF6, 0x5398, 0xCDF9, + 0x5399, 0xCDF8, 0x539A, 0xAB70, 0x539C, 0xD470, 0x539D, 0xADED, 0x539E, 0xD0EF, 0x539F, 0xADEC, 0x53A4, 0xD864, 0x53A5, 0xB3D6, + 0x53A7, 0xD865, 0x53AC, 0xE146, 0x53AD, 0xB9BD, 0x53B2, 0xBC46, 0x53B4, 0xF1EF, 0x53B9, 0xC958, 0x53BB, 0xA568, 0x53C3, 0xB0D1, + 0x53C8, 0xA453, 0x53C9, 0xA465, 0x53CA, 0xA4CE, 0x53CB, 0xA4CD, 0x53CD, 0xA4CF, 0x53D4, 0xA8FB, 0x53D6, 0xA8FA, 0x53D7, 0xA8FC, + 0x53DB, 0xAB71, 0x53DF, 0xADEE, 0x53E1, 0xE8FB, 0x53E2, 0xC24F, 0x53E3, 0xA466, 0x53E4, 0xA56A, 0x53E5, 0xA579, 0x53E6, 0xA574, + 0x53E8, 0xA56F, 0x53E9, 0xA56E, 0x53EA, 0xA575, 0x53EB, 0xA573, 0x53EC, 0xA56C, 0x53ED, 0xA57A, 0x53EE, 0xA56D, 0x53EF, 0xA569, + 0x53F0, 0xA578, 0x53F1, 0xA577, 0x53F2, 0xA576, 0x53F3, 0xA56B, 0x53F5, 0xA572, 0x53F8, 0xA571, 0x53FB, 0xA57B, 0x53FC, 0xA570, + 0x5401, 0xA653, 0x5403, 0xA659, 0x5404, 0xA655, 0x5406, 0xA65B, 0x5407, 0xC9C5, 0x5408, 0xA658, 0x5409, 0xA64E, 0x540A, 0xA651, + 0x540B, 0xA654, 0x540C, 0xA650, 0x540D, 0xA657, 0x540E, 0xA65A, 0x540F, 0xA64F, 0x5410, 0xA652, 0x5411, 0xA656, 0x5412, 0xA65C, + 0x5418, 0xCA7E, 0x5419, 0xCA7B, 0x541B, 0xA767, 0x541C, 0xCA7C, 0x541D, 0xA75B, 0x541E, 0xA75D, 0x541F, 0xA775, 0x5420, 0xA770, + 0x5424, 0xCAA5, 0x5425, 0xCA7D, 0x5426, 0xA75F, 0x5427, 0xA761, 0x5428, 0xCAA4, 0x5429, 0xA768, 0x542A, 0xCA78, 0x542B, 0xA774, + 0x542C, 0xA776, 0x542D, 0xA75C, 0x542E, 0xA76D, 0x5430, 0xCA76, 0x5431, 0xA773, 0x5433, 0xA764, 0x5435, 0xA76E, 0x5436, 0xA76F, + 0x5437, 0xCA77, 0x5438, 0xA76C, 0x5439, 0xA76A, 0x543B, 0xA76B, 0x543C, 0xA771, 0x543D, 0xCAA1, 0x543E, 0xA75E, 0x5440, 0xA772, + 0x5441, 0xCAA3, 0x5442, 0xA766, 0x5443, 0xA763, 0x5445, 0xCA7A, 0x5446, 0xA762, 0x5447, 0xCAA6, 0x5448, 0xA765, 0x544A, 0xA769, + 0x544E, 0xA760, 0x544F, 0xCAA2, 0x5454, 0xCA79, 0x5460, 0xCBEB, 0x5461, 0xCBEA, 0x5462, 0xA94F, 0x5463, 0xCBED, 0x5464, 0xCBEF, + 0x5465, 0xCBE4, 0x5466, 0xCBE7, 0x5467, 0xCBEE, 0x5468, 0xA950, 0x546B, 0xCBE1, 0x546C, 0xCBE5, 0x546F, 0xCBE9, 0x5470, 0xCE49, + 0x5471, 0xA94B, 0x5472, 0xCE4D, 0x5473, 0xA8FD, 0x5474, 0xCBE6, 0x5475, 0xA8FE, 0x5476, 0xA94C, 0x5477, 0xA945, 0x5478, 0xA941, + 0x547A, 0xCBE2, 0x547B, 0xA944, 0x547C, 0xA949, 0x547D, 0xA952, 0x547E, 0xCBE3, 0x547F, 0xCBDC, 0x5480, 0xA943, 0x5481, 0xCBDD, + 0x5482, 0xCBDF, 0x5484, 0xA946, 0x5486, 0xA948, 0x5487, 0xCBDB, 0x5488, 0xCBE0, 0x548B, 0xA951, 0x548C, 0xA94D, 0x548D, 0xCBE8, + 0x548E, 0xA953, 0x5490, 0xA94A, 0x5491, 0xCBDE, 0x5492, 0xA947, 0x5495, 0xA942, 0x5496, 0xA940, 0x5498, 0xCBEC, 0x549A, 0xA94E, + 0x54A0, 0xCE48, 0x54A1, 0xCDFB, 0x54A2, 0xCE4B, 0x54A5, 0xCDFD, 0x54A6, 0xAB78, 0x54A7, 0xABA8, 0x54A8, 0xAB74, 0x54A9, 0xABA7, + 0x54AA, 0xAB7D, 0x54AB, 0xABA4, 0x54AC, 0xAB72, 0x54AD, 0xCDFC, 0x54AE, 0xCE43, 0x54AF, 0xABA3, 0x54B0, 0xCE4F, 0x54B1, 0xABA5, + 0x54B3, 0xAB79, 0x54B6, 0xCE45, 0x54B7, 0xCE42, 0x54B8, 0xAB77, 0x54BA, 0xCDFA, 0x54BB, 0xABA6, 0x54BC, 0xCE4A, 0x54BD, 0xAB7C, + 0x54BE, 0xCE4C, 0x54BF, 0xABA9, 0x54C0, 0xAB73, 0x54C1, 0xAB7E, 0x54C2, 0xAB7B, 0x54C3, 0xCE40, 0x54C4, 0xABA1, 0x54C5, 0xCE46, + 0x54C6, 0xCE47, 0x54C7, 0xAB7A, 0x54C8, 0xABA2, 0x54C9, 0xAB76, 0x54CE, 0xAB75, 0x54CF, 0xCDFE, 0x54D6, 0xCE44, 0x54DE, 0xCE4E, + 0x54E0, 0xD144, 0x54E1, 0xADFB, 0x54E2, 0xD0F1, 0x54E4, 0xD0F6, 0x54E5, 0xADF4, 0x54E6, 0xAE40, 0x54E7, 0xD0F4, 0x54E8, 0xADEF, + 0x54E9, 0xADF9, 0x54EA, 0xADFE, 0x54EB, 0xD0FB, 0x54ED, 0xADFA, 0x54EE, 0xADFD, 0x54F1, 0xD0FE, 0x54F2, 0xADF5, 0x54F3, 0xD0F5, + 0x54F7, 0xD142, 0x54F8, 0xD143, 0x54FA, 0xADF7, 0x54FB, 0xD141, 0x54FC, 0xADF3, 0x54FD, 0xAE43, 0x54FF, 0xD0F8, 0x5501, 0xADF1, + 0x5503, 0xD146, 0x5504, 0xD0F9, 0x5505, 0xD0FD, 0x5506, 0xADF6, 0x5507, 0xAE42, 0x5508, 0xD0FA, 0x5509, 0xADFC, 0x550A, 0xD140, + 0x550B, 0xD147, 0x550C, 0xD4A1, 0x550E, 0xD145, 0x550F, 0xAE44, 0x5510, 0xADF0, 0x5511, 0xD0FC, 0x5512, 0xD0F3, 0x5514, 0xADF8, + 0x5517, 0xD0F2, 0x551A, 0xD0F7, 0x5526, 0xD0F0, 0x5527, 0xAE41, 0x552A, 0xD477, 0x552C, 0xB0E4, 0x552D, 0xD4A7, 0x552E, 0xB0E2, + 0x552F, 0xB0DF, 0x5530, 0xD47C, 0x5531, 0xB0DB, 0x5532, 0xD4A2, 0x5533, 0xB0E6, 0x5534, 0xD476, 0x5535, 0xD47B, 0x5536, 0xD47A, + 0x5537, 0xADF2, 0x5538, 0xB0E1, 0x5539, 0xD4A5, 0x553B, 0xD4A8, 0x553C, 0xD473, 0x553E, 0xB3E8, 0x5540, 0xD4A9, 0x5541, 0xB0E7, + 0x5543, 0xB0D9, 0x5544, 0xB0D6, 0x5545, 0xD47E, 0x5546, 0xB0D3, 0x5548, 0xD4A6, 0x554A, 0xB0DA, 0x554B, 0xD4AA, 0x554D, 0xD474, + 0x554E, 0xD4A4, 0x554F, 0xB0DD, 0x5550, 0xD475, 0x5551, 0xD478, 0x5552, 0xD47D, 0x5555, 0xB0DE, 0x5556, 0xB0DC, 0x5557, 0xB0E8, + 0x555C, 0xB0E3, 0x555E, 0xB0D7, 0x555F, 0xB1D2, 0x5561, 0xB0D8, 0x5562, 0xD479, 0x5563, 0xB0E5, 0x5564, 0xB0E0, 0x5565, 0xD4A3, + 0x5566, 0xB0D5, 0x556A, 0xB0D4, 0x5575, 0xD471, 0x5576, 0xD472, 0x5577, 0xD86A, 0x557B, 0xB3D7, 0x557C, 0xB3DA, 0x557D, 0xD875, + 0x557E, 0xB3EE, 0x557F, 0xD878, 0x5580, 0xB3D8, 0x5581, 0xD871, 0x5582, 0xB3DE, 0x5583, 0xB3E4, 0x5584, 0xB5BD, 0x5587, 0xB3E2, + 0x5588, 0xD86E, 0x5589, 0xB3EF, 0x558A, 0xB3DB, 0x558B, 0xB3E3, 0x558C, 0xD876, 0x558D, 0xDCD7, 0x558E, 0xD87B, 0x558F, 0xD86F, + 0x5591, 0xD866, 0x5592, 0xD873, 0x5593, 0xD86D, 0x5594, 0xB3E1, 0x5595, 0xD879, 0x5598, 0xB3DD, 0x5599, 0xB3F1, 0x559A, 0xB3EA, + 0x559C, 0xB3DF, 0x559D, 0xB3DC, 0x559F, 0xB3E7, 0x55A1, 0xD87A, 0x55A2, 0xD86C, 0x55A3, 0xD872, 0x55A4, 0xD874, 0x55A5, 0xD868, + 0x55A6, 0xD877, 0x55A7, 0xB3D9, 0x55A8, 0xD867, 0x55AA, 0xB3E0, 0x55AB, 0xB3F0, 0x55AC, 0xB3EC, 0x55AD, 0xD869, 0x55AE, 0xB3E6, + 0x55B1, 0xB3ED, 0x55B2, 0xB3E9, 0x55B3, 0xB3E5, 0x55B5, 0xD870, 0x55BB, 0xB3EB, 0x55BF, 0xDCD5, 0x55C0, 0xDCD1, 0x55C2, 0xDCE0, + 0x55C3, 0xDCCA, 0x55C4, 0xDCD3, 0x55C5, 0xB6E5, 0x55C6, 0xB6E6, 0x55C7, 0xB6DE, 0x55C8, 0xDCDC, 0x55C9, 0xB6E8, 0x55CA, 0xDCCF, + 0x55CB, 0xDCCE, 0x55CC, 0xDCCC, 0x55CD, 0xDCDE, 0x55CE, 0xB6DC, 0x55CF, 0xDCD8, 0x55D0, 0xDCCD, 0x55D1, 0xB6DF, 0x55D2, 0xDCD6, + 0x55D3, 0xB6DA, 0x55D4, 0xDCD2, 0x55D5, 0xDCD9, 0x55D6, 0xDCDB, 0x55D9, 0xDCDF, 0x55DA, 0xB6E3, 0x55DB, 0xDCCB, 0x55DC, 0xB6DD, + 0x55DD, 0xDCD0, 0x55DF, 0xB6D8, 0x55E1, 0xB6E4, 0x55E2, 0xDCDA, 0x55E3, 0xB6E0, 0x55E4, 0xB6E1, 0x55E5, 0xB6E7, 0x55E6, 0xB6DB, + 0x55E7, 0xA25F, 0x55E8, 0xB6D9, 0x55E9, 0xDCD4, 0x55EF, 0xB6E2, 0x55F2, 0xDCDD, 0x55F6, 0xB9CD, 0x55F7, 0xB9C8, 0x55F9, 0xE155, + 0x55FA, 0xE151, 0x55FC, 0xE14B, 0x55FD, 0xB9C2, 0x55FE, 0xB9BE, 0x55FF, 0xE154, 0x5600, 0xB9BF, 0x5601, 0xE14E, 0x5602, 0xE150, + 0x5604, 0xE153, 0x5606, 0xB9C4, 0x5608, 0xB9CB, 0x5609, 0xB9C5, 0x560C, 0xE149, 0x560D, 0xB9C6, 0x560E, 0xB9C7, 0x560F, 0xE14C, + 0x5610, 0xB9CC, 0x5612, 0xE14A, 0x5613, 0xE14F, 0x5614, 0xB9C3, 0x5615, 0xE148, 0x5616, 0xB9C9, 0x5617, 0xB9C1, 0x561B, 0xB9C0, + 0x561C, 0xE14D, 0x561D, 0xE152, 0x561F, 0xB9CA, 0x5627, 0xE147, 0x5629, 0xBC4D, 0x562A, 0xE547, 0x562C, 0xE544, 0x562E, 0xBC47, + 0x562F, 0xBC53, 0x5630, 0xBC54, 0x5632, 0xBC4A, 0x5633, 0xE542, 0x5634, 0xBC4C, 0x5635, 0xE4F9, 0x5636, 0xBC52, 0x5638, 0xE546, + 0x5639, 0xBC49, 0x563A, 0xE548, 0x563B, 0xBC48, 0x563D, 0xE543, 0x563E, 0xE545, 0x563F, 0xBC4B, 0x5640, 0xE541, 0x5641, 0xE4FA, + 0x5642, 0xE4F7, 0x5645, 0xD86B, 0x5646, 0xE4FD, 0x5648, 0xE4F6, 0x5649, 0xE4FC, 0x564A, 0xE4FB, 0x564C, 0xE4F8, 0x564E, 0xBC4F, + 0x5653, 0xBC4E, 0x5657, 0xBC50, 0x5658, 0xE4FE, 0x5659, 0xBEB2, 0x565A, 0xE540, 0x565E, 0xE945, 0x5660, 0xE8FD, 0x5662, 0xBEBE, + 0x5663, 0xE942, 0x5664, 0xBEB6, 0x5665, 0xBEBA, 0x5666, 0xE941, 0x5668, 0xBEB9, 0x5669, 0xBEB5, 0x566A, 0xBEB8, 0x566B, 0xBEB3, + 0x566C, 0xBEBD, 0x566D, 0xE943, 0x566E, 0xE8FE, 0x566F, 0xBEBC, 0x5670, 0xE8FC, 0x5671, 0xBEBB, 0x5672, 0xE944, 0x5673, 0xE940, + 0x5674, 0xBC51, 0x5676, 0xBEBF, 0x5677, 0xE946, 0x5678, 0xBEB7, 0x5679, 0xBEB4, 0x567E, 0xECC6, 0x567F, 0xECC8, 0x5680, 0xC07B, + 0x5681, 0xECC9, 0x5682, 0xECC7, 0x5683, 0xECC5, 0x5684, 0xECC4, 0x5685, 0xC07D, 0x5686, 0xECC3, 0x5687, 0xC07E, 0x568C, 0xECC1, + 0x568D, 0xECC2, 0x568E, 0xC07A, 0x568F, 0xC0A1, 0x5690, 0xC07C, 0x5693, 0xECC0, 0x5695, 0xC250, 0x5697, 0xEFBC, 0x5698, 0xEFBA, + 0x5699, 0xEFBF, 0x569A, 0xEFBD, 0x569C, 0xEFBB, 0x569D, 0xEFBE, 0x56A5, 0xC360, 0x56A6, 0xF1F2, 0x56A7, 0xF1F3, 0x56A8, 0xC456, + 0x56AA, 0xF1F4, 0x56AB, 0xF1F0, 0x56AC, 0xF1F5, 0x56AD, 0xF1F1, 0x56AE, 0xC251, 0x56B2, 0xF3FE, 0x56B3, 0xF441, 0x56B4, 0xC459, + 0x56B5, 0xF440, 0x56B6, 0xC458, 0x56B7, 0xC457, 0x56BC, 0xC45A, 0x56BD, 0xF5C5, 0x56BE, 0xF5C6, 0x56C0, 0xC4DA, 0x56C1, 0xC4D9, + 0x56C2, 0xC4DB, 0x56C3, 0xF5C4, 0x56C5, 0xF6D8, 0x56C6, 0xF6D7, 0x56C8, 0xC56D, 0x56C9, 0xC56F, 0x56CA, 0xC56E, 0x56CB, 0xF6D9, + 0x56CC, 0xC5C8, 0x56CD, 0xF8A6, 0x56D1, 0xC5F1, 0x56D3, 0xF8A5, 0x56D4, 0xF8EE, 0x56D7, 0xC949, 0x56DA, 0xA57D, 0x56DB, 0xA57C, + 0x56DD, 0xA65F, 0x56DE, 0xA65E, 0x56DF, 0xC9C7, 0x56E0, 0xA65D, 0x56E1, 0xC9C6, 0x56E4, 0xA779, 0x56E5, 0xCAA9, 0x56E7, 0xCAA8, + 0x56EA, 0xA777, 0x56EB, 0xA77A, 0x56EE, 0xCAA7, 0x56F0, 0xA778, 0x56F7, 0xCBF0, 0x56F9, 0xCBF1, 0x56FA, 0xA954, 0x56FF, 0xABAA, + 0x5701, 0xD148, 0x5702, 0xD149, 0x5703, 0xAE45, 0x5704, 0xAE46, 0x5707, 0xD4AC, 0x5708, 0xB0E9, 0x5709, 0xB0EB, 0x570A, 0xD4AB, + 0x570B, 0xB0EA, 0x570C, 0xD87C, 0x570D, 0xB3F2, 0x5712, 0xB6E9, 0x5713, 0xB6EA, 0x5714, 0xDCE1, 0x5716, 0xB9CF, 0x5718, 0xB9CE, + 0x571A, 0xE549, 0x571B, 0xE948, 0x571C, 0xE947, 0x571E, 0xF96B, 0x571F, 0xA467, 0x5720, 0xC959, 0x5722, 0xC96E, 0x5723, 0xC96F, + 0x5728, 0xA662, 0x5729, 0xA666, 0x572A, 0xC9C9, 0x572C, 0xA664, 0x572D, 0xA663, 0x572E, 0xC9C8, 0x572F, 0xA665, 0x5730, 0xA661, + 0x5733, 0xA660, 0x5734, 0xC9CA, 0x573B, 0xA7A6, 0x573E, 0xA7A3, 0x5740, 0xA77D, 0x5741, 0xCAAA, 0x5745, 0xCAAB, 0x5747, 0xA7A1, + 0x5749, 0xCAAD, 0x574A, 0xA77B, 0x574B, 0xCAAE, 0x574C, 0xCAAC, 0x574D, 0xA77E, 0x574E, 0xA7A2, 0x574F, 0xA7A5, 0x5750, 0xA7A4, + 0x5751, 0xA77C, 0x5752, 0xCAAF, 0x5761, 0xA959, 0x5762, 0xCBFE, 0x5764, 0xA95B, 0x5766, 0xA95A, 0x5768, 0xCC40, 0x5769, 0xA958, + 0x576A, 0xA957, 0x576B, 0xCBF5, 0x576D, 0xCBF4, 0x576F, 0xCBF2, 0x5770, 0xCBF7, 0x5771, 0xCBF6, 0x5772, 0xCBF3, 0x5773, 0xCBFC, + 0x5774, 0xCBFD, 0x5775, 0xCBFA, 0x5776, 0xCBF8, 0x5777, 0xA956, 0x577B, 0xCBFB, 0x577C, 0xA95C, 0x577D, 0xCC41, 0x5780, 0xCBF9, + 0x5782, 0xABAB, 0x5783, 0xA955, 0x578B, 0xABAC, 0x578C, 0xCE54, 0x578F, 0xCE5A, 0x5793, 0xABB2, 0x5794, 0xCE58, 0x5795, 0xCE5E, + 0x5797, 0xCE55, 0x5798, 0xCE59, 0x5799, 0xCE5B, 0x579A, 0xCE5D, 0x579B, 0xCE57, 0x579D, 0xCE56, 0x579E, 0xCE51, 0x579F, 0xCE52, + 0x57A0, 0xABAD, 0x57A2, 0xABAF, 0x57A3, 0xABAE, 0x57A4, 0xCE53, 0x57A5, 0xCE5C, 0x57AE, 0xABB1, 0x57B5, 0xCE50, 0x57B6, 0xD153, + 0x57B8, 0xD152, 0x57B9, 0xD157, 0x57BA, 0xD14E, 0x57BC, 0xD151, 0x57BD, 0xD150, 0x57BF, 0xD154, 0x57C1, 0xD158, 0x57C2, 0xAE47, + 0x57C3, 0xAE4A, 0x57C6, 0xD14F, 0x57C7, 0xD155, 0x57CB, 0xAE49, 0x57CC, 0xD14A, 0x57CE, 0xABB0, 0x57CF, 0xD4BA, 0x57D0, 0xD156, + 0x57D2, 0xD14D, 0x57D4, 0xAE48, 0x57D5, 0xD14C, 0x57DC, 0xD4B1, 0x57DF, 0xB0EC, 0x57E0, 0xB0F0, 0x57E1, 0xD4C1, 0x57E2, 0xD4AF, + 0x57E3, 0xD4BD, 0x57E4, 0xB0F1, 0x57E5, 0xD4BF, 0x57E7, 0xD4C5, 0x57E9, 0xD4C9, 0x57EC, 0xD4C0, 0x57ED, 0xD4B4, 0x57EE, 0xD4BC, + 0x57F0, 0xD4CA, 0x57F1, 0xD4C8, 0x57F2, 0xD4BE, 0x57F3, 0xD4B9, 0x57F4, 0xD4B2, 0x57F5, 0xD8A6, 0x57F6, 0xD4B0, 0x57F7, 0xB0F5, + 0x57F8, 0xD4B7, 0x57F9, 0xB0F6, 0x57FA, 0xB0F2, 0x57FB, 0xD4AD, 0x57FC, 0xD4C3, 0x57FD, 0xD4B5, 0x5800, 0xD4B3, 0x5801, 0xD4C6, + 0x5802, 0xB0F3, 0x5804, 0xD4CC, 0x5805, 0xB0ED, 0x5806, 0xB0EF, 0x5807, 0xD4BB, 0x5808, 0xD4B6, 0x5809, 0xAE4B, 0x580A, 0xB0EE, + 0x580B, 0xD4B8, 0x580C, 0xD4C7, 0x580D, 0xD4CB, 0x580E, 0xD4C2, 0x5810, 0xD4C4, 0x5814, 0xD4AE, 0x5819, 0xD8A1, 0x581B, 0xD8AA, + 0x581C, 0xD8A9, 0x581D, 0xB3FA, 0x581E, 0xD8A2, 0x5820, 0xB3FB, 0x5821, 0xB3F9, 0x5823, 0xD8A4, 0x5824, 0xB3F6, 0x5825, 0xD8A8, + 0x5827, 0xD8A3, 0x5828, 0xD8A5, 0x5829, 0xD87D, 0x582A, 0xB3F4, 0x582C, 0xD8B2, 0x582D, 0xD8B1, 0x582E, 0xD8AE, 0x582F, 0xB3F3, + 0x5830, 0xB3F7, 0x5831, 0xB3F8, 0x5832, 0xD14B, 0x5833, 0xD8AB, 0x5834, 0xB3F5, 0x5835, 0xB0F4, 0x5836, 0xD8AD, 0x5837, 0xD87E, + 0x5838, 0xD8B0, 0x5839, 0xD8AF, 0x583B, 0xD8B3, 0x583D, 0xDCEF, 0x583F, 0xD8AC, 0x5848, 0xD8A7, 0x5849, 0xDCE7, 0x584A, 0xB6F4, + 0x584B, 0xB6F7, 0x584C, 0xB6F2, 0x584D, 0xDCE6, 0x584E, 0xDCEA, 0x584F, 0xDCE5, 0x5851, 0xB6EC, 0x5852, 0xB6F6, 0x5853, 0xDCE2, + 0x5854, 0xB6F0, 0x5855, 0xDCE9, 0x5857, 0xB6EE, 0x5858, 0xB6ED, 0x5859, 0xDCEC, 0x585A, 0xB6EF, 0x585B, 0xDCEE, 0x585D, 0xDCEB, + 0x585E, 0xB6EB, 0x5862, 0xB6F5, 0x5863, 0xDCF0, 0x5864, 0xDCE4, 0x5865, 0xDCED, 0x5868, 0xDCE3, 0x586B, 0xB6F1, 0x586D, 0xB6F3, + 0x586F, 0xDCE8, 0x5871, 0xDCF1, 0x5874, 0xE15D, 0x5875, 0xB9D0, 0x5876, 0xE163, 0x5879, 0xB9D5, 0x587A, 0xE15F, 0x587B, 0xE166, + 0x587C, 0xE157, 0x587D, 0xB9D7, 0x587E, 0xB9D1, 0x587F, 0xE15C, 0x5880, 0xBC55, 0x5881, 0xE15B, 0x5882, 0xE164, 0x5883, 0xB9D2, + 0x5885, 0xB9D6, 0x5886, 0xE15A, 0x5887, 0xE160, 0x5888, 0xE165, 0x5889, 0xE156, 0x588A, 0xB9D4, 0x588B, 0xE15E, 0x588E, 0xE162, + 0x588F, 0xE168, 0x5890, 0xE158, 0x5891, 0xE161, 0x5893, 0xB9D3, 0x5894, 0xE167, 0x5898, 0xE159, 0x589C, 0xBC59, 0x589D, 0xE54B, + 0x589E, 0xBC57, 0x589F, 0xBC56, 0x58A0, 0xE54D, 0x58A1, 0xE552, 0x58A3, 0xE54E, 0x58A5, 0xE551, 0x58A6, 0xBC5C, 0x58A8, 0xBEA5, + 0x58A9, 0xBC5B, 0x58AB, 0xE54A, 0x58AC, 0xE550, 0x58AE, 0xBC5A, 0x58AF, 0xE54F, 0x58B1, 0xE54C, 0x58B3, 0xBC58, 0x58BA, 0xE94D, + 0x58BB, 0xF9D9, 0x58BC, 0xE94F, 0x58BD, 0xE94A, 0x58BE, 0xBEC1, 0x58BF, 0xE94C, 0x58C1, 0xBEC0, 0x58C2, 0xE94E, 0x58C5, 0xBEC3, + 0x58C6, 0xE950, 0x58C7, 0xBEC2, 0x58C8, 0xE949, 0x58C9, 0xE94B, 0x58CE, 0xC0A5, 0x58CF, 0xECCC, 0x58D1, 0xC0A4, 0x58D2, 0xECCD, + 0x58D3, 0xC0A3, 0x58D4, 0xECCB, 0x58D5, 0xC0A2, 0x58D6, 0xECCA, 0x58D8, 0xC253, 0x58D9, 0xC252, 0x58DA, 0xF1F6, 0x58DB, 0xF1F8, + 0x58DD, 0xF1F7, 0x58DE, 0xC361, 0x58DF, 0xC362, 0x58E2, 0xC363, 0x58E3, 0xF442, 0x58E4, 0xC45B, 0x58E7, 0xF7D3, 0x58E8, 0xF7D2, + 0x58E9, 0xC5F2, 0x58EB, 0xA468, 0x58EC, 0xA4D0, 0x58EF, 0xA7A7, 0x58F4, 0xCE5F, 0x58F9, 0xB3FC, 0x58FA, 0xB3FD, 0x58FC, 0xDCF2, + 0x58FD, 0xB9D8, 0x58FE, 0xE169, 0x58FF, 0xE553, 0x5903, 0xC95A, 0x5906, 0xCAB0, 0x590C, 0xCC42, 0x590D, 0xCE60, 0x590E, 0xD159, + 0x590F, 0xAE4C, 0x5912, 0xF1F9, 0x5914, 0xC4DC, 0x5915, 0xA469, 0x5916, 0xA57E, 0x5917, 0xC970, 0x5919, 0xA667, 0x591A, 0xA668, + 0x591C, 0xA95D, 0x5920, 0xB0F7, 0x5922, 0xB9DA, 0x5924, 0xB9DB, 0x5925, 0xB9D9, 0x5927, 0xA46A, 0x5929, 0xA4D1, 0x592A, 0xA4D3, + 0x592B, 0xA4D2, 0x592C, 0xC95B, 0x592D, 0xA4D4, 0x592E, 0xA5A1, 0x592F, 0xC971, 0x5931, 0xA5A2, 0x5937, 0xA669, 0x5938, 0xA66A, + 0x593C, 0xC9CB, 0x593E, 0xA7A8, 0x5940, 0xCAB1, 0x5944, 0xA961, 0x5945, 0xCC43, 0x5947, 0xA95F, 0x5948, 0xA960, 0x5949, 0xA95E, + 0x594A, 0xD15A, 0x594E, 0xABB6, 0x594F, 0xABB5, 0x5950, 0xABB7, 0x5951, 0xABB4, 0x5953, 0xCE61, 0x5954, 0xA962, 0x5955, 0xABB3, + 0x5957, 0xAE4D, 0x5958, 0xAE4E, 0x595A, 0xAE4F, 0x595C, 0xD4CD, 0x5960, 0xB3FE, 0x5961, 0xD8B4, 0x5962, 0xB0F8, 0x5967, 0xB6F8, + 0x5969, 0xB9DD, 0x596A, 0xB9DC, 0x596B, 0xE16A, 0x596D, 0xBC5D, 0x596E, 0xBEC4, 0x5970, 0xEFC0, 0x5971, 0xF6DA, 0x5972, 0xF7D4, + 0x5973, 0xA46B, 0x5974, 0xA5A3, 0x5976, 0xA5A4, 0x5977, 0xC9D1, 0x5978, 0xA66C, 0x5979, 0xA66F, 0x597B, 0xC9CF, 0x597C, 0xC9CD, + 0x597D, 0xA66E, 0x597E, 0xC9D0, 0x597F, 0xC9D2, 0x5980, 0xC9CC, 0x5981, 0xA671, 0x5982, 0xA670, 0x5983, 0xA66D, 0x5984, 0xA66B, + 0x5985, 0xC9CE, 0x598A, 0xA7B3, 0x598D, 0xA7B0, 0x598E, 0xCAB6, 0x598F, 0xCAB9, 0x5990, 0xCAB8, 0x5992, 0xA7AA, 0x5993, 0xA7B2, + 0x5996, 0xA7AF, 0x5997, 0xCAB5, 0x5998, 0xCAB3, 0x5999, 0xA7AE, 0x599D, 0xA7A9, 0x599E, 0xA7AC, 0x59A0, 0xCAB4, 0x59A1, 0xCABB, + 0x59A2, 0xCAB7, 0x59A3, 0xA7AD, 0x59A4, 0xA7B1, 0x59A5, 0xA7B4, 0x59A6, 0xCAB2, 0x59A7, 0xCABA, 0x59A8, 0xA7AB, 0x59AE, 0xA967, + 0x59AF, 0xA96F, 0x59B1, 0xCC4F, 0x59B2, 0xCC48, 0x59B3, 0xA970, 0x59B4, 0xCC53, 0x59B5, 0xCC44, 0x59B6, 0xCC4B, 0x59B9, 0xA966, + 0x59BA, 0xCC45, 0x59BB, 0xA964, 0x59BC, 0xCC4C, 0x59BD, 0xCC50, 0x59BE, 0xA963, 0x59C0, 0xCC51, 0x59C1, 0xCC4A, 0x59C3, 0xCC4D, + 0x59C5, 0xA972, 0x59C6, 0xA969, 0x59C7, 0xCC54, 0x59C8, 0xCC52, 0x59CA, 0xA96E, 0x59CB, 0xA96C, 0x59CC, 0xCC49, 0x59CD, 0xA96B, + 0x59CE, 0xCC47, 0x59CF, 0xCC46, 0x59D0, 0xA96A, 0x59D1, 0xA968, 0x59D2, 0xA971, 0x59D3, 0xA96D, 0x59D4, 0xA965, 0x59D6, 0xCC4E, + 0x59D8, 0xABB9, 0x59DA, 0xABC0, 0x59DB, 0xCE6F, 0x59DC, 0xABB8, 0x59DD, 0xCE67, 0x59DE, 0xCE63, 0x59E0, 0xCE73, 0x59E1, 0xCE62, + 0x59E3, 0xABBB, 0x59E4, 0xCE6C, 0x59E5, 0xABBE, 0x59E6, 0xABC1, 0x59E8, 0xABBC, 0x59E9, 0xCE70, 0x59EA, 0xABBF, 0x59EC, 0xAE56, + 0x59ED, 0xCE76, 0x59EE, 0xCE64, 0x59F1, 0xCE66, 0x59F2, 0xCE6D, 0x59F3, 0xCE71, 0x59F4, 0xCE75, 0x59F5, 0xCE72, 0x59F6, 0xCE6B, + 0x59F7, 0xCE6E, 0x59FA, 0xCE68, 0x59FB, 0xABC3, 0x59FC, 0xCE6A, 0x59FD, 0xCE69, 0x59FE, 0xCE74, 0x59FF, 0xABBA, 0x5A00, 0xCE65, + 0x5A01, 0xABC2, 0x5A03, 0xABBD, 0x5A09, 0xAE5C, 0x5A0A, 0xD162, 0x5A0C, 0xAE5B, 0x5A0F, 0xD160, 0x5A11, 0xAE50, 0x5A13, 0xAE55, + 0x5A15, 0xD15F, 0x5A16, 0xD15C, 0x5A17, 0xD161, 0x5A18, 0xAE51, 0x5A19, 0xD15B, 0x5A1B, 0xAE54, 0x5A1C, 0xAE52, 0x5A1E, 0xD163, + 0x5A1F, 0xAE53, 0x5A20, 0xAE57, 0x5A23, 0xAE58, 0x5A25, 0xAE5A, 0x5A29, 0xAE59, 0x5A2D, 0xD15D, 0x5A2E, 0xD15E, 0x5A33, 0xD164, + 0x5A35, 0xD4D4, 0x5A36, 0xB0F9, 0x5A37, 0xD8C2, 0x5A38, 0xD4D3, 0x5A39, 0xD4E6, 0x5A3C, 0xB140, 0x5A3E, 0xD4E4, 0x5A40, 0xB0FE, + 0x5A41, 0xB0FA, 0x5A42, 0xD4ED, 0x5A43, 0xD4DD, 0x5A44, 0xD4E0, 0x5A46, 0xB143, 0x5A47, 0xD4EA, 0x5A48, 0xD4E2, 0x5A49, 0xB0FB, + 0x5A4A, 0xB144, 0x5A4C, 0xD4E7, 0x5A4D, 0xD4E5, 0x5A50, 0xD4D6, 0x5A51, 0xD4EB, 0x5A52, 0xD4DF, 0x5A53, 0xD4DA, 0x5A55, 0xD4D0, + 0x5A56, 0xD4EC, 0x5A57, 0xD4DC, 0x5A58, 0xD4CF, 0x5A5A, 0xB142, 0x5A5B, 0xD4E1, 0x5A5C, 0xD4EE, 0x5A5D, 0xD4DE, 0x5A5E, 0xD4D2, + 0x5A5F, 0xD4D7, 0x5A60, 0xD4CE, 0x5A62, 0xB141, 0x5A64, 0xD4DB, 0x5A65, 0xD4D8, 0x5A66, 0xB0FC, 0x5A67, 0xD4D1, 0x5A69, 0xD4E9, + 0x5A6A, 0xB0FD, 0x5A6C, 0xD4D9, 0x5A6D, 0xD4D5, 0x5A70, 0xD4E8, 0x5A77, 0xB440, 0x5A78, 0xD8BB, 0x5A7A, 0xD8B8, 0x5A7B, 0xD8C9, + 0x5A7C, 0xD8BD, 0x5A7D, 0xD8CA, 0x5A7F, 0xB442, 0x5A83, 0xD8C6, 0x5A84, 0xD8C3, 0x5A8A, 0xD8C4, 0x5A8B, 0xD8C7, 0x5A8C, 0xD8CB, + 0x5A8E, 0xD4E3, 0x5A8F, 0xD8CD, 0x5A90, 0xDD47, 0x5A92, 0xB443, 0x5A93, 0xD8CE, 0x5A94, 0xD8B6, 0x5A95, 0xD8C0, 0x5A97, 0xD8C5, + 0x5A9A, 0xB441, 0x5A9B, 0xB444, 0x5A9C, 0xD8CC, 0x5A9D, 0xD8CF, 0x5A9E, 0xD8BA, 0x5A9F, 0xD8B7, 0x5AA2, 0xD8B9, 0x5AA5, 0xD8BE, + 0x5AA6, 0xD8BC, 0x5AA7, 0xB445, 0x5AA9, 0xD8C8, 0x5AAC, 0xD8BF, 0x5AAE, 0xD8C1, 0x5AAF, 0xD8B5, 0x5AB0, 0xDCFA, 0x5AB1, 0xDCF8, + 0x5AB2, 0xB742, 0x5AB3, 0xB740, 0x5AB4, 0xDD43, 0x5AB5, 0xDCF9, 0x5AB6, 0xDD44, 0x5AB7, 0xDD40, 0x5AB8, 0xDCF7, 0x5AB9, 0xDD46, + 0x5ABA, 0xDCF6, 0x5ABB, 0xDCFD, 0x5ABC, 0xB6FE, 0x5ABD, 0xB6FD, 0x5ABE, 0xB6FC, 0x5ABF, 0xDCFB, 0x5AC0, 0xDD41, 0x5AC1, 0xB6F9, + 0x5AC2, 0xB741, 0x5AC4, 0xDCF4, 0x5AC6, 0xDCFE, 0x5AC7, 0xDCF3, 0x5AC8, 0xDCFC, 0x5AC9, 0xB6FA, 0x5ACA, 0xDD42, 0x5ACB, 0xDCF5, + 0x5ACC, 0xB6FB, 0x5ACD, 0xDD45, 0x5AD5, 0xE16E, 0x5AD6, 0xB9E2, 0x5AD7, 0xB9E1, 0x5AD8, 0xB9E3, 0x5AD9, 0xE17A, 0x5ADA, 0xE170, + 0x5ADB, 0xE176, 0x5ADC, 0xE16B, 0x5ADD, 0xE179, 0x5ADE, 0xE178, 0x5ADF, 0xE17C, 0x5AE0, 0xE175, 0x5AE1, 0xB9DE, 0x5AE2, 0xE174, + 0x5AE3, 0xB9E4, 0x5AE5, 0xE16D, 0x5AE6, 0xB9DF, 0x5AE8, 0xE17B, 0x5AE9, 0xB9E0, 0x5AEA, 0xE16F, 0x5AEB, 0xE172, 0x5AEC, 0xE177, + 0x5AED, 0xE171, 0x5AEE, 0xE16C, 0x5AF3, 0xE173, 0x5AF4, 0xE555, 0x5AF5, 0xBC61, 0x5AF6, 0xE558, 0x5AF7, 0xE557, 0x5AF8, 0xE55A, + 0x5AF9, 0xE55C, 0x5AFA, 0xF9DC, 0x5AFB, 0xBC5F, 0x5AFD, 0xE556, 0x5AFF, 0xE554, 0x5B01, 0xE55D, 0x5B02, 0xE55B, 0x5B03, 0xE559, + 0x5B05, 0xE55F, 0x5B07, 0xE55E, 0x5B08, 0xBC63, 0x5B09, 0xBC5E, 0x5B0B, 0xBC60, 0x5B0C, 0xBC62, 0x5B0F, 0xE560, 0x5B10, 0xE957, + 0x5B13, 0xE956, 0x5B14, 0xE955, 0x5B16, 0xE958, 0x5B17, 0xE951, 0x5B19, 0xE952, 0x5B1A, 0xE95A, 0x5B1B, 0xE953, 0x5B1D, 0xBEC5, + 0x5B1E, 0xE95C, 0x5B20, 0xE95B, 0x5B21, 0xE954, 0x5B23, 0xECD1, 0x5B24, 0xC0A8, 0x5B25, 0xECCF, 0x5B26, 0xECD4, 0x5B27, 0xECD3, + 0x5B28, 0xE959, 0x5B2A, 0xC0A7, 0x5B2C, 0xECD2, 0x5B2D, 0xECCE, 0x5B2E, 0xECD6, 0x5B2F, 0xECD5, 0x5B30, 0xC0A6, 0x5B32, 0xECD0, + 0x5B34, 0xBEC6, 0x5B38, 0xC254, 0x5B3C, 0xEFC1, 0x5B3D, 0xF1FA, 0x5B3E, 0xF1FB, 0x5B3F, 0xF1FC, 0x5B40, 0xC45C, 0x5B43, 0xC45D, + 0x5B45, 0xF443, 0x5B47, 0xF5C8, 0x5B48, 0xF5C7, 0x5B4B, 0xF6DB, 0x5B4C, 0xF6DC, 0x5B4D, 0xF7D5, 0x5B4E, 0xF8A7, 0x5B50, 0xA46C, + 0x5B51, 0xA46D, 0x5B53, 0xA46E, 0x5B54, 0xA4D5, 0x5B55, 0xA5A5, 0x5B56, 0xC9D3, 0x5B57, 0xA672, 0x5B58, 0xA673, 0x5B5A, 0xA7B7, + 0x5B5B, 0xA7B8, 0x5B5C, 0xA7B6, 0x5B5D, 0xA7B5, 0x5B5F, 0xA973, 0x5B62, 0xCC55, 0x5B63, 0xA975, 0x5B64, 0xA974, 0x5B65, 0xCC56, + 0x5B69, 0xABC4, 0x5B6B, 0xAE5D, 0x5B6C, 0xD165, 0x5B6E, 0xD4F0, 0x5B70, 0xB145, 0x5B71, 0xB447, 0x5B72, 0xD4EF, 0x5B73, 0xB446, + 0x5B75, 0xB9E5, 0x5B77, 0xE17D, 0x5B78, 0xBEC7, 0x5B7A, 0xC0A9, 0x5B7B, 0xECD7, 0x5B7D, 0xC45E, 0x5B7F, 0xC570, 0x5B81, 0xC972, + 0x5B83, 0xA5A6, 0x5B84, 0xC973, 0x5B85, 0xA676, 0x5B87, 0xA674, 0x5B88, 0xA675, 0x5B89, 0xA677, 0x5B8B, 0xA7BA, 0x5B8C, 0xA7B9, + 0x5B8E, 0xCABC, 0x5B8F, 0xA7BB, 0x5B92, 0xCABD, 0x5B93, 0xCC57, 0x5B95, 0xCC58, 0x5B97, 0xA976, 0x5B98, 0xA978, 0x5B99, 0xA97A, + 0x5B9A, 0xA977, 0x5B9B, 0xA97B, 0x5B9C, 0xA979, 0x5BA2, 0xABC8, 0x5BA3, 0xABC5, 0x5BA4, 0xABC7, 0x5BA5, 0xABC9, 0x5BA6, 0xABC6, + 0x5BA7, 0xD166, 0x5BA8, 0xCE77, 0x5BAC, 0xD168, 0x5BAD, 0xD167, 0x5BAE, 0xAE63, 0x5BB0, 0xAE5F, 0x5BB3, 0xAE60, 0x5BB4, 0xAE62, + 0x5BB5, 0xAE64, 0x5BB6, 0xAE61, 0x5BB8, 0xAE66, 0x5BB9, 0xAE65, 0x5BBF, 0xB14A, 0x5BC0, 0xD4F2, 0x5BC1, 0xD4F1, 0x5BC2, 0xB149, + 0x5BC4, 0xB148, 0x5BC5, 0xB147, 0x5BC6, 0xB14B, 0x5BC7, 0xB146, 0x5BCA, 0xD8D5, 0x5BCB, 0xD8D2, 0x5BCC, 0xB449, 0x5BCD, 0xD8D1, + 0x5BCE, 0xD8D6, 0x5BD0, 0xB44B, 0x5BD1, 0xD8D4, 0x5BD2, 0xB448, 0x5BD3, 0xB44A, 0x5BD4, 0xD8D3, 0x5BD6, 0xDD48, 0x5BD8, 0xDD49, + 0x5BD9, 0xDD4A, 0x5BDE, 0xB9E6, 0x5BDF, 0xB9EE, 0x5BE0, 0xE17E, 0x5BE1, 0xB9E8, 0x5BE2, 0xB9EC, 0x5BE3, 0xE1A1, 0x5BE4, 0xB9ED, + 0x5BE5, 0xB9E9, 0x5BE6, 0xB9EA, 0x5BE7, 0xB9E7, 0x5BE8, 0xB9EB, 0x5BE9, 0xBC66, 0x5BEA, 0xD8D0, 0x5BEB, 0xBC67, 0x5BEC, 0xBC65, + 0x5BEE, 0xBC64, 0x5BEF, 0xE95D, 0x5BF0, 0xBEC8, 0x5BF1, 0xECD8, 0x5BF2, 0xECD9, 0x5BF5, 0xC364, 0x5BF6, 0xC45F, 0x5BF8, 0xA46F, + 0x5BFA, 0xA678, 0x5C01, 0xABCA, 0x5C03, 0xD169, 0x5C04, 0xAE67, 0x5C07, 0xB14E, 0x5C08, 0xB14D, 0x5C09, 0xB14C, 0x5C0A, 0xB44C, + 0x5C0B, 0xB44D, 0x5C0C, 0xD8D7, 0x5C0D, 0xB9EF, 0x5C0E, 0xBEC9, 0x5C0F, 0xA470, 0x5C10, 0xC95C, 0x5C11, 0xA4D6, 0x5C12, 0xC974, + 0x5C15, 0xC9D4, 0x5C16, 0xA679, 0x5C1A, 0xA97C, 0x5C1F, 0xDD4B, 0x5C22, 0xA471, 0x5C24, 0xA4D7, 0x5C25, 0xC9D5, 0x5C28, 0xCABE, + 0x5C2A, 0xCABF, 0x5C2C, 0xA7BC, 0x5C30, 0xD8D8, 0x5C31, 0xB44E, 0x5C33, 0xDD4C, 0x5C37, 0xC0AA, 0x5C38, 0xA472, 0x5C39, 0xA4A8, + 0x5C3A, 0xA4D8, 0x5C3B, 0xC975, 0x5C3C, 0xA5A7, 0x5C3E, 0xA7C0, 0x5C3F, 0xA7BF, 0x5C40, 0xA7BD, 0x5C41, 0xA7BE, 0x5C44, 0xCC59, + 0x5C45, 0xA97E, 0x5C46, 0xA9A1, 0x5C47, 0xCC5A, 0x5C48, 0xA97D, 0x5C4B, 0xABCE, 0x5C4C, 0xCE78, 0x5C4D, 0xABCD, 0x5C4E, 0xABCB, + 0x5C4F, 0xABCC, 0x5C50, 0xAE6A, 0x5C51, 0xAE68, 0x5C54, 0xD16B, 0x5C55, 0xAE69, 0x5C56, 0xD16A, 0x5C58, 0xAE5E, 0x5C59, 0xD4F3, + 0x5C5C, 0xB150, 0x5C5D, 0xB151, 0x5C60, 0xB14F, 0x5C62, 0xB9F0, 0x5C63, 0xE1A2, 0x5C64, 0xBC68, 0x5C65, 0xBC69, 0x5C67, 0xE561, + 0x5C68, 0xC0AB, 0x5C69, 0xEFC2, 0x5C6A, 0xEFC3, 0x5C6C, 0xC4DD, 0x5C6D, 0xF8A8, 0x5C6E, 0xC94B, 0x5C6F, 0xA4D9, 0x5C71, 0xA473, + 0x5C73, 0xC977, 0x5C74, 0xC976, 0x5C79, 0xA67A, 0x5C7A, 0xC9D7, 0x5C7B, 0xC9D8, 0x5C7C, 0xC9D6, 0x5C7E, 0xC9D9, 0x5C86, 0xCAC7, + 0x5C88, 0xCAC2, 0x5C89, 0xCAC4, 0x5C8A, 0xCAC6, 0x5C8B, 0xCAC3, 0x5C8C, 0xA7C4, 0x5C8D, 0xCAC0, 0x5C8F, 0xCAC1, 0x5C90, 0xA7C1, + 0x5C91, 0xA7C2, 0x5C92, 0xCAC5, 0x5C93, 0xCAC8, 0x5C94, 0xA7C3, 0x5C95, 0xCAC9, 0x5C9D, 0xCC68, 0x5C9F, 0xCC62, 0x5CA0, 0xCC5D, + 0x5CA1, 0xA9A3, 0x5CA2, 0xCC65, 0x5CA3, 0xCC63, 0x5CA4, 0xCC5C, 0x5CA5, 0xCC69, 0x5CA6, 0xCC6C, 0x5CA7, 0xCC67, 0x5CA8, 0xCC60, + 0x5CA9, 0xA9A5, 0x5CAA, 0xCC66, 0x5CAB, 0xA9A6, 0x5CAC, 0xCC61, 0x5CAD, 0xCC64, 0x5CAE, 0xCC5B, 0x5CAF, 0xCC5F, 0x5CB0, 0xCC6B, + 0x5CB1, 0xA9A7, 0x5CB3, 0xA9A8, 0x5CB5, 0xCC5E, 0x5CB6, 0xCC6A, 0x5CB7, 0xA9A2, 0x5CB8, 0xA9A4, 0x5CC6, 0xCEAB, 0x5CC7, 0xCEA4, + 0x5CC8, 0xCEAA, 0x5CC9, 0xCEA3, 0x5CCA, 0xCEA5, 0x5CCB, 0xCE7D, 0x5CCC, 0xCE7B, 0x5CCE, 0xCEAC, 0x5CCF, 0xCEA9, 0x5CD0, 0xCE79, + 0x5CD2, 0xABD0, 0x5CD3, 0xCEA7, 0x5CD4, 0xCEA8, 0x5CD6, 0xCEA6, 0x5CD7, 0xCE7C, 0x5CD8, 0xCE7A, 0x5CD9, 0xABCF, 0x5CDA, 0xCEA2, + 0x5CDB, 0xCE7E, 0x5CDE, 0xCEA1, 0x5CDF, 0xCEAD, 0x5CE8, 0xAE6F, 0x5CEA, 0xAE6E, 0x5CEC, 0xD16C, 0x5CED, 0xAE6B, 0x5CEE, 0xD16E, + 0x5CF0, 0xAE70, 0x5CF1, 0xD16F, 0x5CF4, 0xAE73, 0x5CF6, 0xAE71, 0x5CF7, 0xD170, 0x5CF8, 0xCEAE, 0x5CF9, 0xD172, 0x5CFB, 0xAE6D, + 0x5CFD, 0xAE6C, 0x5CFF, 0xD16D, 0x5D00, 0xD171, 0x5D01, 0xAE72, 0x5D06, 0xB153, 0x5D07, 0xB152, 0x5D0B, 0xD4F5, 0x5D0C, 0xD4F9, + 0x5D0D, 0xD4FB, 0x5D0E, 0xB154, 0x5D0F, 0xD4FE, 0x5D11, 0xB158, 0x5D12, 0xD541, 0x5D14, 0xB15A, 0x5D16, 0xB156, 0x5D17, 0xB15E, + 0x5D19, 0xB15B, 0x5D1A, 0xD4F7, 0x5D1B, 0xB155, 0x5D1D, 0xD4F6, 0x5D1E, 0xD4F4, 0x5D1F, 0xD543, 0x5D20, 0xD4F8, 0x5D22, 0xB157, + 0x5D23, 0xD542, 0x5D24, 0xB15C, 0x5D25, 0xD4FD, 0x5D26, 0xD4FC, 0x5D27, 0xB15D, 0x5D28, 0xD4FA, 0x5D29, 0xB159, 0x5D2E, 0xD544, + 0x5D30, 0xD540, 0x5D31, 0xD8E7, 0x5D32, 0xD8EE, 0x5D33, 0xD8E3, 0x5D34, 0xB451, 0x5D35, 0xD8DF, 0x5D36, 0xD8EF, 0x5D37, 0xD8D9, + 0x5D38, 0xD8EC, 0x5D39, 0xD8EA, 0x5D3A, 0xD8E4, 0x5D3C, 0xD8ED, 0x5D3D, 0xD8E6, 0x5D3F, 0xD8DE, 0x5D40, 0xD8F0, 0x5D41, 0xD8DC, + 0x5D42, 0xD8E9, 0x5D43, 0xD8DA, 0x5D45, 0xD8F1, 0x5D47, 0xB452, 0x5D49, 0xD8EB, 0x5D4A, 0xDD4F, 0x5D4B, 0xD8DD, 0x5D4C, 0xB44F, + 0x5D4E, 0xD8E1, 0x5D50, 0xB450, 0x5D51, 0xD8E0, 0x5D52, 0xD8E5, 0x5D55, 0xD8E2, 0x5D59, 0xD8E8, 0x5D5E, 0xDD53, 0x5D62, 0xDD56, + 0x5D63, 0xDD4E, 0x5D65, 0xDD50, 0x5D67, 0xDD55, 0x5D68, 0xDD54, 0x5D69, 0xB743, 0x5D6B, 0xD8DB, 0x5D6C, 0xDD52, 0x5D6F, 0xB744, + 0x5D71, 0xDD4D, 0x5D72, 0xDD51, 0x5D77, 0xE1A9, 0x5D79, 0xE1B0, 0x5D7A, 0xE1A7, 0x5D7C, 0xE1AE, 0x5D7D, 0xE1A5, 0x5D7E, 0xE1AD, + 0x5D7F, 0xE1B1, 0x5D80, 0xE1A4, 0x5D81, 0xE1A8, 0x5D82, 0xE1A3, 0x5D84, 0xB9F1, 0x5D86, 0xE1A6, 0x5D87, 0xB9F2, 0x5D88, 0xE1AC, + 0x5D89, 0xE1AB, 0x5D8A, 0xE1AA, 0x5D8D, 0xE1AF, 0x5D92, 0xE565, 0x5D93, 0xE567, 0x5D94, 0xBC6B, 0x5D95, 0xE568, 0x5D97, 0xE563, + 0x5D99, 0xE562, 0x5D9A, 0xE56C, 0x5D9C, 0xE56A, 0x5D9D, 0xBC6A, 0x5D9E, 0xE56D, 0x5D9F, 0xE564, 0x5DA0, 0xE569, 0x5DA1, 0xE56B, + 0x5DA2, 0xE566, 0x5DA7, 0xE961, 0x5DA8, 0xE966, 0x5DA9, 0xE960, 0x5DAA, 0xE965, 0x5DAC, 0xE95E, 0x5DAD, 0xE968, 0x5DAE, 0xE964, + 0x5DAF, 0xE969, 0x5DB0, 0xE963, 0x5DB1, 0xE95F, 0x5DB2, 0xE967, 0x5DB4, 0xE96A, 0x5DB5, 0xE962, 0x5DB7, 0xECDA, 0x5DB8, 0xC0AF, + 0x5DBA, 0xC0AD, 0x5DBC, 0xC0AC, 0x5DBD, 0xC0AE, 0x5DC0, 0xEFC4, 0x5DC2, 0xF172, 0x5DC3, 0xF1FD, 0x5DC6, 0xF444, 0x5DC7, 0xF445, + 0x5DC9, 0xC460, 0x5DCB, 0xF5C9, 0x5DCD, 0xC4DE, 0x5DCF, 0xF5CA, 0x5DD1, 0xF6DE, 0x5DD2, 0xC572, 0x5DD4, 0xC571, 0x5DD5, 0xF6DD, + 0x5DD6, 0xC5C9, 0x5DD8, 0xF7D6, 0x5DDD, 0xA474, 0x5DDE, 0xA67B, 0x5DDF, 0xC9DA, 0x5DE0, 0xCACA, 0x5DE1, 0xA8B5, 0x5DE2, 0xB15F, + 0x5DE5, 0xA475, 0x5DE6, 0xA5AA, 0x5DE7, 0xA5A9, 0x5DE8, 0xA5A8, 0x5DEB, 0xA7C5, 0x5DEE, 0xAE74, 0x5DF0, 0xDD57, 0x5DF1, 0xA476, + 0x5DF2, 0xA477, 0x5DF3, 0xA478, 0x5DF4, 0xA4DA, 0x5DF7, 0xABD1, 0x5DF9, 0xCEAF, 0x5DFD, 0xB453, 0x5DFE, 0xA479, 0x5DFF, 0xC95D, + 0x5E02, 0xA5AB, 0x5E03, 0xA5AC, 0x5E04, 0xC978, 0x5E06, 0xA67C, 0x5E0A, 0xCACB, 0x5E0C, 0xA7C6, 0x5E0E, 0xCACC, 0x5E11, 0xA9AE, + 0x5E14, 0xCC6E, 0x5E15, 0xA9AC, 0x5E16, 0xA9AB, 0x5E17, 0xCC6D, 0x5E18, 0xA9A9, 0x5E19, 0xCC6F, 0x5E1A, 0xA9AA, 0x5E1B, 0xA9AD, + 0x5E1D, 0xABD2, 0x5E1F, 0xABD4, 0x5E20, 0xCEB3, 0x5E21, 0xCEB0, 0x5E22, 0xCEB1, 0x5E23, 0xCEB2, 0x5E24, 0xCEB4, 0x5E25, 0xABD3, + 0x5E28, 0xD174, 0x5E29, 0xD173, 0x5E2B, 0xAE76, 0x5E2D, 0xAE75, 0x5E33, 0xB162, 0x5E34, 0xD546, 0x5E36, 0xB161, 0x5E37, 0xB163, + 0x5E38, 0xB160, 0x5E3D, 0xB455, 0x5E3E, 0xD545, 0x5E40, 0xB456, 0x5E41, 0xD8F3, 0x5E43, 0xB457, 0x5E44, 0xD8F2, 0x5E45, 0xB454, + 0x5E4A, 0xDD5A, 0x5E4B, 0xDD5C, 0x5E4C, 0xB745, 0x5E4D, 0xDD5B, 0x5E4E, 0xDD59, 0x5E4F, 0xDD58, 0x5E53, 0xE1B4, 0x5E54, 0xB9F7, + 0x5E55, 0xB9F5, 0x5E57, 0xB9F6, 0x5E58, 0xE1B2, 0x5E59, 0xE1B3, 0x5E5B, 0xB9F3, 0x5E5C, 0xE571, 0x5E5D, 0xE56F, 0x5E5F, 0xBC6D, + 0x5E60, 0xE570, 0x5E61, 0xBC6E, 0x5E62, 0xBC6C, 0x5E63, 0xB9F4, 0x5E66, 0xE96D, 0x5E67, 0xE96B, 0x5E68, 0xE96C, 0x5E69, 0xE56E, + 0x5E6A, 0xECDC, 0x5E6B, 0xC0B0, 0x5E6C, 0xECDB, 0x5E6D, 0xEFC5, 0x5E6E, 0xEFC6, 0x5E6F, 0xE96E, 0x5E70, 0xF1FE, 0x5E72, 0xA47A, + 0x5E73, 0xA5AD, 0x5E74, 0xA67E, 0x5E75, 0xC9DB, 0x5E76, 0xA67D, 0x5E78, 0xA9AF, 0x5E79, 0xB746, 0x5E7B, 0xA4DB, 0x5E7C, 0xA5AE, + 0x5E7D, 0xABD5, 0x5E7E, 0xB458, 0x5E80, 0xC979, 0x5E82, 0xC97A, 0x5E84, 0xC9DC, 0x5E87, 0xA7C8, 0x5E88, 0xCAD0, 0x5E89, 0xCACE, + 0x5E8A, 0xA7C9, 0x5E8B, 0xCACD, 0x5E8C, 0xCACF, 0x5E8D, 0xCAD1, 0x5E8F, 0xA7C7, 0x5E95, 0xA9B3, 0x5E96, 0xA9B4, 0x5E97, 0xA9B1, + 0x5E9A, 0xA9B0, 0x5E9B, 0xCEB8, 0x5E9C, 0xA9B2, 0x5EA0, 0xABD6, 0x5EA2, 0xCEB7, 0x5EA3, 0xCEB9, 0x5EA4, 0xCEB6, 0x5EA5, 0xCEBA, + 0x5EA6, 0xABD7, 0x5EA7, 0xAE79, 0x5EA8, 0xD175, 0x5EAA, 0xD177, 0x5EAB, 0xAE77, 0x5EAC, 0xD178, 0x5EAD, 0xAE78, 0x5EAE, 0xD176, + 0x5EB0, 0xCEB5, 0x5EB1, 0xD547, 0x5EB2, 0xD54A, 0x5EB3, 0xD54B, 0x5EB4, 0xD548, 0x5EB5, 0xB167, 0x5EB6, 0xB166, 0x5EB7, 0xB164, + 0x5EB8, 0xB165, 0x5EB9, 0xD549, 0x5EBE, 0xB168, 0x5EC1, 0xB45A, 0x5EC2, 0xB45B, 0x5EC4, 0xB45C, 0x5EC5, 0xDD5D, 0x5EC6, 0xDD5F, + 0x5EC7, 0xDD61, 0x5EC8, 0xB748, 0x5EC9, 0xB747, 0x5ECA, 0xB459, 0x5ECB, 0xDD60, 0x5ECC, 0xDD5E, 0x5ECE, 0xE1B8, 0x5ED1, 0xE1B6, + 0x5ED2, 0xE1BC, 0x5ED3, 0xB9F8, 0x5ED4, 0xE1BD, 0x5ED5, 0xE1BA, 0x5ED6, 0xB9F9, 0x5ED7, 0xE1B7, 0x5ED8, 0xE1B5, 0x5ED9, 0xE1BB, + 0x5EDA, 0xBC70, 0x5EDB, 0xE573, 0x5EDC, 0xE1B9, 0x5EDD, 0xBC72, 0x5EDE, 0xE574, 0x5EDF, 0xBC71, 0x5EE0, 0xBC74, 0x5EE1, 0xE575, + 0x5EE2, 0xBC6F, 0x5EE3, 0xBC73, 0x5EE5, 0xE973, 0x5EE6, 0xE971, 0x5EE7, 0xE970, 0x5EE8, 0xE972, 0x5EE9, 0xE96F, 0x5EEC, 0xC366, + 0x5EEE, 0xF446, 0x5EEF, 0xF447, 0x5EF1, 0xF5CB, 0x5EF2, 0xF6DF, 0x5EF3, 0xC655, 0x5EF6, 0xA9B5, 0x5EF7, 0xA7CA, 0x5EFA, 0xABD8, + 0x5EFE, 0xA47B, 0x5EFF, 0xA4DC, 0x5F01, 0xA5AF, 0x5F02, 0xC9DD, 0x5F04, 0xA7CB, 0x5F05, 0xCAD2, 0x5F07, 0xCEBB, 0x5F08, 0xABD9, + 0x5F0A, 0xB9FA, 0x5F0B, 0xA47C, 0x5F0F, 0xA6A1, 0x5F12, 0xB749, 0x5F13, 0xA47D, 0x5F14, 0xA4DD, 0x5F15, 0xA4DE, 0x5F17, 0xA5B1, + 0x5F18, 0xA5B0, 0x5F1A, 0xC9DE, 0x5F1B, 0xA6A2, 0x5F1D, 0xCAD3, 0x5F1F, 0xA7CC, 0x5F22, 0xCC71, 0x5F23, 0xCC72, 0x5F24, 0xCC73, + 0x5F26, 0xA9B6, 0x5F27, 0xA9B7, 0x5F28, 0xCC70, 0x5F29, 0xA9B8, 0x5F2D, 0xABDA, 0x5F2E, 0xCEBC, 0x5F30, 0xD17A, 0x5F31, 0xAE7A, + 0x5F33, 0xD179, 0x5F35, 0xB169, 0x5F36, 0xD54C, 0x5F37, 0xB16A, 0x5F38, 0xD54D, 0x5F3C, 0xB45D, 0x5F40, 0xDD62, 0x5F43, 0xE1BF, + 0x5F44, 0xE1BE, 0x5F46, 0xB9FB, 0x5F48, 0xBC75, 0x5F49, 0xE576, 0x5F4A, 0xBECA, 0x5F4B, 0xE974, 0x5F4C, 0xC0B1, 0x5F4E, 0xC573, + 0x5F4F, 0xF7D8, 0x5F54, 0xCC74, 0x5F56, 0xCEBD, 0x5F57, 0xB16B, 0x5F58, 0xD8F4, 0x5F59, 0xB74A, 0x5F5D, 0xC255, 0x5F62, 0xA7CE, + 0x5F64, 0xA7CD, 0x5F65, 0xABDB, 0x5F67, 0xD17B, 0x5F69, 0xB16D, 0x5F6A, 0xB343, 0x5F6B, 0xB16E, 0x5F6C, 0xB16C, 0x5F6D, 0xB45E, + 0x5F6F, 0xE1C0, 0x5F70, 0xB9FC, 0x5F71, 0xBC76, 0x5F73, 0xC94C, 0x5F74, 0xC9DF, 0x5F76, 0xCAD5, 0x5F77, 0xA7CF, 0x5F78, 0xCAD4, + 0x5F79, 0xA7D0, 0x5F7C, 0xA9BC, 0x5F7D, 0xCC77, 0x5F7E, 0xCC76, 0x5F7F, 0xA9BB, 0x5F80, 0xA9B9, 0x5F81, 0xA9BA, 0x5F82, 0xCC75, + 0x5F85, 0xABDD, 0x5F86, 0xCEBE, 0x5F87, 0xABE0, 0x5F88, 0xABDC, 0x5F89, 0xABE2, 0x5F8A, 0xABDE, 0x5F8B, 0xABDF, 0x5F8C, 0xABE1, + 0x5F90, 0xAE7D, 0x5F91, 0xAE7C, 0x5F92, 0xAE7B, 0x5F96, 0xD54F, 0x5F97, 0xB16F, 0x5F98, 0xB172, 0x5F99, 0xB170, 0x5F9B, 0xD54E, + 0x5F9C, 0xB175, 0x5F9E, 0xB171, 0x5F9F, 0xD550, 0x5FA0, 0xB174, 0x5FA1, 0xB173, 0x5FA5, 0xD8F6, 0x5FA6, 0xD8F5, 0x5FA8, 0xB461, + 0x5FA9, 0xB45F, 0x5FAA, 0xB460, 0x5FAB, 0xD8F7, 0x5FAC, 0xB74B, 0x5FAD, 0xDD64, 0x5FAE, 0xB74C, 0x5FAF, 0xDD63, 0x5FB2, 0xE577, + 0x5FB5, 0xBC78, 0x5FB6, 0xE1C1, 0x5FB7, 0xBC77, 0x5FB9, 0xB9FD, 0x5FBB, 0xECDE, 0x5FBC, 0xE975, 0x5FBD, 0xC0B2, 0x5FBE, 0xECDD, + 0x5FBF, 0xF240, 0x5FC0, 0xF448, 0x5FC1, 0xF449, 0x5FC3, 0xA4DF, 0x5FC5, 0xA5B2, 0x5FC9, 0xC97B, 0x5FCC, 0xA7D2, 0x5FCD, 0xA7D4, + 0x5FCF, 0xC9E2, 0x5FD0, 0xCAD8, 0x5FD1, 0xCAD7, 0x5FD2, 0xCAD6, 0x5FD4, 0xC9E1, 0x5FD5, 0xC9E0, 0x5FD6, 0xA6A4, 0x5FD7, 0xA7D3, + 0x5FD8, 0xA7D1, 0x5FD9, 0xA6A3, 0x5FDD, 0xA9BD, 0x5FDE, 0xCC78, 0x5FE0, 0xA9BE, 0x5FE1, 0xCADD, 0x5FE3, 0xCADF, 0x5FE4, 0xCADE, + 0x5FE5, 0xCC79, 0x5FE8, 0xCADA, 0x5FEA, 0xA7D8, 0x5FEB, 0xA7D6, 0x5FED, 0xCAD9, 0x5FEE, 0xCADB, 0x5FEF, 0xCAE1, 0x5FF1, 0xA7D5, + 0x5FF3, 0xCADC, 0x5FF4, 0xCAE5, 0x5FF5, 0xA9C0, 0x5FF7, 0xCAE2, 0x5FF8, 0xA7D7, 0x5FFA, 0xCAE0, 0x5FFB, 0xCAE3, 0x5FFD, 0xA9BF, + 0x5FFF, 0xA9C1, 0x6000, 0xCAE4, 0x6009, 0xCCAF, 0x600A, 0xCCA2, 0x600B, 0xCC7E, 0x600C, 0xCCAE, 0x600D, 0xCCA9, 0x600E, 0xABE7, + 0x600F, 0xA9C2, 0x6010, 0xCCAA, 0x6011, 0xCCAD, 0x6012, 0xABE3, 0x6013, 0xCCAC, 0x6014, 0xA9C3, 0x6015, 0xA9C8, 0x6016, 0xA9C6, + 0x6017, 0xCCA3, 0x6019, 0xCC7C, 0x601A, 0xCCA5, 0x601B, 0xA9CD, 0x601C, 0xCCB0, 0x601D, 0xABE4, 0x601E, 0xCCA6, 0x6020, 0xABE5, + 0x6021, 0xA9C9, 0x6022, 0xCCA8, 0x6024, 0xCECD, 0x6025, 0xABE6, 0x6026, 0xCC7B, 0x6027, 0xA9CA, 0x6028, 0xABE8, 0x6029, 0xA9CB, + 0x602A, 0xA9C7, 0x602B, 0xA9CC, 0x602C, 0xCCA7, 0x602D, 0xCC7A, 0x602E, 0xCCAB, 0x602F, 0xA9C4, 0x6032, 0xCC7D, 0x6033, 0xCCA4, + 0x6034, 0xCCA1, 0x6035, 0xA9C5, 0x6037, 0xCEBF, 0x6039, 0xCEC0, 0x6040, 0xCECA, 0x6041, 0xD1A1, 0x6042, 0xCECB, 0x6043, 0xABEE, + 0x6044, 0xCECE, 0x6045, 0xCEC4, 0x6046, 0xABED, 0x6047, 0xCEC6, 0x6049, 0xCEC7, 0x604C, 0xCEC9, 0x604D, 0xABE9, 0x6050, 0xAEA3, + 0x6052, 0xF9DA, 0x6053, 0xCEC5, 0x6054, 0xCEC1, 0x6055, 0xAEA4, 0x6058, 0xCECF, 0x6059, 0xAE7E, 0x605A, 0xD17D, 0x605B, 0xCEC8, + 0x605D, 0xD17C, 0x605E, 0xCEC3, 0x605F, 0xCECC, 0x6062, 0xABEC, 0x6063, 0xAEA1, 0x6064, 0xABF2, 0x6065, 0xAEA2, 0x6066, 0xCED0, + 0x6067, 0xD17E, 0x6068, 0xABEB, 0x6069, 0xAEA6, 0x606A, 0xABF1, 0x606B, 0xABF0, 0x606C, 0xABEF, 0x606D, 0xAEA5, 0x606E, 0xCED1, + 0x606F, 0xAEA7, 0x6070, 0xABEA, 0x6072, 0xCEC2, 0x607F, 0xB176, 0x6080, 0xD1A4, 0x6081, 0xD1A6, 0x6083, 0xD1A8, 0x6084, 0xAEA8, + 0x6085, 0xAEAE, 0x6086, 0xD553, 0x6087, 0xD1AC, 0x6088, 0xD1A3, 0x6089, 0xB178, 0x608A, 0xD551, 0x608C, 0xAEAD, 0x608D, 0xAEAB, + 0x608E, 0xD1AE, 0x6090, 0xD552, 0x6092, 0xD1A5, 0x6094, 0xAEAC, 0x6095, 0xD1A9, 0x6096, 0xAEAF, 0x6097, 0xD1AB, 0x609A, 0xAEAA, + 0x609B, 0xD1AA, 0x609C, 0xD1AD, 0x609D, 0xD1A7, 0x609F, 0xAEA9, 0x60A0, 0xB179, 0x60A2, 0xD1A2, 0x60A3, 0xB177, 0x60A8, 0xB17A, + 0x60B0, 0xD555, 0x60B1, 0xD55E, 0x60B2, 0xB464, 0x60B4, 0xB17C, 0x60B5, 0xB1A3, 0x60B6, 0xB465, 0x60B7, 0xD560, 0x60B8, 0xB1AA, + 0x60B9, 0xD8F9, 0x60BA, 0xD556, 0x60BB, 0xB1A2, 0x60BC, 0xB1A5, 0x60BD, 0xB17E, 0x60BE, 0xD554, 0x60BF, 0xD562, 0x60C0, 0xD565, + 0x60C1, 0xD949, 0x60C3, 0xD563, 0x60C4, 0xD8FD, 0x60C5, 0xB1A1, 0x60C6, 0xB1A8, 0x60C7, 0xB1AC, 0x60C8, 0xD55D, 0x60C9, 0xD8F8, + 0x60CA, 0xD561, 0x60CB, 0xB17B, 0x60CC, 0xD8FA, 0x60CD, 0xD564, 0x60CE, 0xD8FC, 0x60CF, 0xD559, 0x60D1, 0xB462, 0x60D3, 0xD557, + 0x60D4, 0xD558, 0x60D5, 0xB1A7, 0x60D8, 0xB1A6, 0x60D9, 0xD55B, 0x60DA, 0xB1AB, 0x60DB, 0xD55F, 0x60DC, 0xB1A4, 0x60DD, 0xD55C, + 0x60DF, 0xB1A9, 0x60E0, 0xB466, 0x60E1, 0xB463, 0x60E2, 0xD8FB, 0x60E4, 0xD55A, 0x60E6, 0xB17D, 0x60F0, 0xB46B, 0x60F1, 0xB46F, + 0x60F2, 0xD940, 0x60F3, 0xB751, 0x60F4, 0xB46D, 0x60F5, 0xD944, 0x60F6, 0xB471, 0x60F7, 0xDD65, 0x60F8, 0xD946, 0x60F9, 0xB753, + 0x60FA, 0xB469, 0x60FB, 0xB46C, 0x60FC, 0xD947, 0x60FE, 0xD948, 0x60FF, 0xD94E, 0x6100, 0xB473, 0x6101, 0xB754, 0x6103, 0xD94A, + 0x6104, 0xD94F, 0x6105, 0xD943, 0x6106, 0xB75E, 0x6108, 0xB755, 0x6109, 0xB472, 0x610A, 0xD941, 0x610B, 0xD950, 0x610D, 0xB75D, + 0x610E, 0xB470, 0x610F, 0xB74E, 0x6110, 0xD94D, 0x6112, 0xB474, 0x6113, 0xD945, 0x6114, 0xD8FE, 0x6115, 0xB46A, 0x6116, 0xD942, + 0x6118, 0xD94B, 0x611A, 0xB74D, 0x611B, 0xB752, 0x611C, 0xB467, 0x611D, 0xD94C, 0x611F, 0xB750, 0x6123, 0xB468, 0x6127, 0xB75C, + 0x6128, 0xE1C3, 0x6129, 0xDD70, 0x612B, 0xDD68, 0x612C, 0xE1C2, 0x612E, 0xDD6C, 0x612F, 0xDD6E, 0x6132, 0xDD6B, 0x6134, 0xB75B, + 0x6136, 0xDD6A, 0x6137, 0xB75F, 0x613B, 0xE1D2, 0x613E, 0xB75A, 0x613F, 0xBA40, 0x6140, 0xDD71, 0x6141, 0xE1C4, 0x6144, 0xB758, + 0x6145, 0xDD69, 0x6146, 0xDD6D, 0x6147, 0xB9FE, 0x6148, 0xB74F, 0x6149, 0xDD66, 0x614A, 0xDD67, 0x614B, 0xBA41, 0x614C, 0xB757, + 0x614D, 0xB759, 0x614E, 0xB756, 0x614F, 0xDD6F, 0x6152, 0xE1C8, 0x6153, 0xE1C9, 0x6154, 0xE1CE, 0x6155, 0xBC7D, 0x6156, 0xE1D5, + 0x6158, 0xBA47, 0x615A, 0xBA46, 0x615B, 0xE1D0, 0x615D, 0xBC7C, 0x615E, 0xE1C5, 0x615F, 0xBA45, 0x6161, 0xE1D4, 0x6162, 0xBA43, + 0x6163, 0xBA44, 0x6165, 0xE1D1, 0x6166, 0xE5AA, 0x6167, 0xBC7A, 0x6168, 0xB46E, 0x616A, 0xE1D3, 0x616B, 0xBCA3, 0x616C, 0xE1CB, + 0x616E, 0xBC7B, 0x6170, 0xBCA2, 0x6171, 0xE1C6, 0x6172, 0xE1CA, 0x6173, 0xE1C7, 0x6174, 0xE1CD, 0x6175, 0xBA48, 0x6176, 0xBC79, + 0x6177, 0xBA42, 0x6179, 0xE57A, 0x617A, 0xE1CF, 0x617C, 0xBCA1, 0x617E, 0xBCA4, 0x6180, 0xE1CC, 0x6182, 0xBC7E, 0x6183, 0xE579, + 0x6189, 0xE57E, 0x618A, 0xBECE, 0x618B, 0xE578, 0x618C, 0xE9A3, 0x618D, 0xE5A9, 0x618E, 0xBCA8, 0x6190, 0xBCA6, 0x6191, 0xBECC, + 0x6192, 0xE5A6, 0x6193, 0xE5A2, 0x6194, 0xBCAC, 0x6196, 0xE978, 0x619A, 0xBCAA, 0x619B, 0xE5A1, 0x619D, 0xE976, 0x619F, 0xE5A5, + 0x61A1, 0xE5A8, 0x61A2, 0xE57D, 0x61A4, 0xBCAB, 0x61A7, 0xBCA5, 0x61A8, 0xE977, 0x61A9, 0xBECD, 0x61AA, 0xE5A7, 0x61AB, 0xBCA7, + 0x61AC, 0xBCA9, 0x61AD, 0xE5A4, 0x61AE, 0xBCAD, 0x61AF, 0xE5A3, 0x61B0, 0xE57C, 0x61B1, 0xE57B, 0x61B2, 0xBECB, 0x61B3, 0xE5AB, + 0x61B4, 0xE97A, 0x61B5, 0xECE0, 0x61B6, 0xBED0, 0x61B8, 0xE9A2, 0x61BA, 0xE97E, 0x61BC, 0xECE1, 0x61BE, 0xBED1, 0x61BF, 0xE9A1, + 0x61C1, 0xE97C, 0x61C2, 0xC0B4, 0x61C3, 0xECDF, 0x61C5, 0xE979, 0x61C6, 0xE97B, 0x61C7, 0xC0B5, 0x61C8, 0xBED3, 0x61C9, 0xC0B3, + 0x61CA, 0xBED2, 0x61CB, 0xC0B7, 0x61CC, 0xE97D, 0x61CD, 0xBECF, 0x61D6, 0xEFCF, 0x61D8, 0xEFC7, 0x61DE, 0xECE7, 0x61DF, 0xEFC8, + 0x61E0, 0xECE3, 0x61E3, 0xC256, 0x61E4, 0xECE5, 0x61E5, 0xECE4, 0x61E6, 0xC0B6, 0x61E7, 0xECE2, 0x61E8, 0xECE6, 0x61E9, 0xEFD0, + 0x61EA, 0xEFCC, 0x61EB, 0xEFCE, 0x61ED, 0xEFC9, 0x61EE, 0xEFCA, 0x61F0, 0xEFCD, 0x61F1, 0xEFCB, 0x61F2, 0xC367, 0x61F5, 0xC36A, + 0x61F6, 0xC369, 0x61F7, 0xC368, 0x61F8, 0xC461, 0x61F9, 0xF44A, 0x61FA, 0xC462, 0x61FB, 0xF241, 0x61FC, 0xC4DF, 0x61FD, 0xF5CC, + 0x61FE, 0xC4E0, 0x61FF, 0xC574, 0x6200, 0xC5CA, 0x6201, 0xF7D9, 0x6203, 0xF7DA, 0x6204, 0xF7DB, 0x6207, 0xF9BA, 0x6208, 0xA4E0, + 0x6209, 0xC97C, 0x620A, 0xA5B3, 0x620C, 0xA6A6, 0x620D, 0xA6A7, 0x620E, 0xA6A5, 0x6210, 0xA6A8, 0x6211, 0xA7DA, 0x6212, 0xA7D9, + 0x6214, 0xCCB1, 0x6215, 0xA9CF, 0x6216, 0xA9CE, 0x6219, 0xD1AF, 0x621A, 0xB1AD, 0x621B, 0xB1AE, 0x621F, 0xB475, 0x6220, 0xDD72, + 0x6221, 0xB760, 0x6222, 0xB761, 0x6223, 0xDD74, 0x6224, 0xDD76, 0x6225, 0xDD75, 0x6227, 0xE1D7, 0x6229, 0xE1D6, 0x622A, 0xBA49, + 0x622B, 0xE1D8, 0x622D, 0xE5AC, 0x622E, 0xBCAE, 0x6230, 0xBED4, 0x6232, 0xC0B8, 0x6233, 0xC257, 0x6234, 0xC0B9, 0x6236, 0xA4E1, + 0x623A, 0xCAE6, 0x623D, 0xCCB2, 0x623E, 0xA9D1, 0x623F, 0xA9D0, 0x6240, 0xA9D2, 0x6241, 0xABF3, 0x6242, 0xCED2, 0x6243, 0xCED3, + 0x6246, 0xD1B0, 0x6247, 0xAEB0, 0x6248, 0xB1AF, 0x6249, 0xB476, 0x624A, 0xD951, 0x624B, 0xA4E2, 0x624D, 0xA47E, 0x624E, 0xA4E3, + 0x6250, 0xC97D, 0x6251, 0xA5B7, 0x6252, 0xA5B6, 0x6253, 0xA5B4, 0x6254, 0xA5B5, 0x6258, 0xA6AB, 0x6259, 0xC9E9, 0x625A, 0xC9EB, + 0x625B, 0xA6AA, 0x625C, 0xC9E3, 0x625E, 0xC9E4, 0x6260, 0xC9EA, 0x6261, 0xC9E6, 0x6262, 0xC9E8, 0x6263, 0xA6A9, 0x6264, 0xC9E5, + 0x6265, 0xC9EC, 0x6266, 0xC9E7, 0x626D, 0xA7E1, 0x626E, 0xA7EA, 0x626F, 0xA7E8, 0x6270, 0xCAF0, 0x6271, 0xCAED, 0x6272, 0xCAF5, + 0x6273, 0xA7E6, 0x6274, 0xCAF6, 0x6276, 0xA7DF, 0x6277, 0xCAF3, 0x6279, 0xA7E5, 0x627A, 0xCAEF, 0x627B, 0xCAEE, 0x627C, 0xA7E3, + 0x627D, 0xCAF4, 0x627E, 0xA7E4, 0x627F, 0xA9D3, 0x6280, 0xA7DE, 0x6281, 0xCAF1, 0x6283, 0xCAE7, 0x6284, 0xA7DB, 0x6286, 0xA7EE, + 0x6287, 0xCAEC, 0x6288, 0xCAF2, 0x6289, 0xA7E0, 0x628A, 0xA7E2, 0x628C, 0xCAE8, 0x628E, 0xCAE9, 0x628F, 0xCAEA, 0x6291, 0xA7ED, + 0x6292, 0xA7E7, 0x6293, 0xA7EC, 0x6294, 0xCAEB, 0x6295, 0xA7EB, 0x6296, 0xA7DD, 0x6297, 0xA7DC, 0x6298, 0xA7E9, 0x62A8, 0xA9E1, + 0x62A9, 0xCCBE, 0x62AA, 0xCCB7, 0x62AB, 0xA9DC, 0x62AC, 0xA9EF, 0x62AD, 0xCCB3, 0x62AE, 0xCCBA, 0x62AF, 0xCCBC, 0x62B0, 0xCCBF, + 0x62B1, 0xA9EA, 0x62B3, 0xCCBB, 0x62B4, 0xCCB4, 0x62B5, 0xA9E8, 0x62B6, 0xCCB8, 0x62B8, 0xCCC0, 0x62B9, 0xA9D9, 0x62BB, 0xCCBD, + 0x62BC, 0xA9E3, 0x62BD, 0xA9E2, 0x62BE, 0xCCB6, 0x62BF, 0xA9D7, 0x62C2, 0xA9D8, 0x62C4, 0xA9D6, 0x62C6, 0xA9EE, 0x62C7, 0xA9E6, + 0x62C8, 0xA9E0, 0x62C9, 0xA9D4, 0x62CA, 0xCCB9, 0x62CB, 0xA9DF, 0x62CC, 0xA9D5, 0x62CD, 0xA9E7, 0x62CE, 0xA9F0, 0x62CF, 0xCED4, + 0x62D0, 0xA9E4, 0x62D1, 0xCCB5, 0x62D2, 0xA9DA, 0x62D3, 0xA9DD, 0x62D4, 0xA9DE, 0x62D6, 0xA9EC, 0x62D7, 0xA9ED, 0x62D8, 0xA9EB, + 0x62D9, 0xA9E5, 0x62DA, 0xA9E9, 0x62DB, 0xA9DB, 0x62DC, 0xABF4, 0x62EB, 0xCEDA, 0x62EC, 0xAC41, 0x62ED, 0xABF8, 0x62EE, 0xABFA, + 0x62EF, 0xAC40, 0x62F0, 0xCEE6, 0x62F1, 0xABFD, 0x62F2, 0xD1B1, 0x62F3, 0xAEB1, 0x62F4, 0xAC43, 0x62F5, 0xCED7, 0x62F6, 0xCEDF, + 0x62F7, 0xABFE, 0x62F8, 0xCEDE, 0x62F9, 0xCEDB, 0x62FA, 0xCEE3, 0x62FB, 0xCEE5, 0x62FC, 0xABF7, 0x62FD, 0xABFB, 0x62FE, 0xAC42, + 0x62FF, 0xAEB3, 0x6300, 0xCEE0, 0x6301, 0xABF9, 0x6302, 0xAC45, 0x6303, 0xCED9, 0x6307, 0xABFC, 0x6308, 0xAEB2, 0x6309, 0xABF6, + 0x630B, 0xCED6, 0x630C, 0xCEDD, 0x630D, 0xCED5, 0x630E, 0xCED8, 0x630F, 0xCEDC, 0x6310, 0xD1B2, 0x6311, 0xAC44, 0x6313, 0xCEE1, + 0x6314, 0xCEE2, 0x6315, 0xCEE4, 0x6316, 0xABF5, 0x6328, 0xAEC1, 0x6329, 0xD1BE, 0x632A, 0xAEBF, 0x632B, 0xAEC0, 0x632C, 0xD1B4, + 0x632D, 0xD1C4, 0x632F, 0xAEB6, 0x6332, 0xD566, 0x6333, 0xD1C6, 0x6334, 0xD1C0, 0x6336, 0xD1B7, 0x6338, 0xD1C9, 0x6339, 0xD1BA, + 0x633A, 0xAEBC, 0x633B, 0xD57D, 0x633C, 0xD1BD, 0x633D, 0xAEBE, 0x633E, 0xAEB5, 0x6340, 0xD1CB, 0x6341, 0xD1BF, 0x6342, 0xAEB8, + 0x6343, 0xD1B8, 0x6344, 0xD1B5, 0x6345, 0xD1B6, 0x6346, 0xAEB9, 0x6347, 0xD1C5, 0x6348, 0xD1CC, 0x6349, 0xAEBB, 0x634A, 0xD1BC, + 0x634B, 0xD1BB, 0x634C, 0xAEC3, 0x634D, 0xAEC2, 0x634E, 0xAEB4, 0x634F, 0xAEBA, 0x6350, 0xAEBD, 0x6351, 0xD1C8, 0x6354, 0xD1C2, + 0x6355, 0xAEB7, 0x6356, 0xD1B3, 0x6357, 0xD1CA, 0x6358, 0xD1C1, 0x6359, 0xD1C3, 0x635A, 0xD1C7, 0x6365, 0xD567, 0x6367, 0xB1B7, + 0x6368, 0xB1CB, 0x6369, 0xB1CA, 0x636B, 0xB1BF, 0x636D, 0xD579, 0x636E, 0xD575, 0x636F, 0xD572, 0x6370, 0xD5A6, 0x6371, 0xB1BA, + 0x6372, 0xB1B2, 0x6375, 0xD577, 0x6376, 0xB4A8, 0x6377, 0xB1B6, 0x6378, 0xD5A1, 0x637A, 0xB1CC, 0x637B, 0xB1C9, 0x637C, 0xD57B, + 0x637D, 0xD56A, 0x6380, 0xB1C8, 0x6381, 0xD5A3, 0x6382, 0xD569, 0x6383, 0xB1BD, 0x6384, 0xB1C1, 0x6385, 0xD5A2, 0x6387, 0xD573, + 0x6388, 0xB1C2, 0x6389, 0xB1BC, 0x638A, 0xD568, 0x638C, 0xB478, 0x638D, 0xD5A5, 0x638E, 0xD571, 0x638F, 0xB1C7, 0x6390, 0xD574, + 0x6391, 0xD5A4, 0x6392, 0xB1C6, 0x6394, 0xD952, 0x6396, 0xB1B3, 0x6397, 0xD56F, 0x6398, 0xB1B8, 0x6399, 0xB1C3, 0x639B, 0xB1BE, + 0x639C, 0xD578, 0x639D, 0xD56E, 0x639E, 0xD56C, 0x639F, 0xD57E, 0x63A0, 0xB1B0, 0x63A1, 0xB1C4, 0x63A2, 0xB1B4, 0x63A3, 0xB477, + 0x63A4, 0xD57C, 0x63A5, 0xB1B5, 0x63A7, 0xB1B1, 0x63A8, 0xB1C0, 0x63A9, 0xB1BB, 0x63AA, 0xB1B9, 0x63AB, 0xD570, 0x63AC, 0xB1C5, + 0x63AD, 0xD56D, 0x63AE, 0xD57A, 0x63AF, 0xD576, 0x63B0, 0xD954, 0x63B1, 0xD953, 0x63BD, 0xD56B, 0x63BE, 0xD964, 0x63C0, 0xB47A, + 0x63C2, 0xD96A, 0x63C3, 0xD959, 0x63C4, 0xD967, 0x63C5, 0xDD77, 0x63C6, 0xB47D, 0x63C7, 0xD96B, 0x63C8, 0xD96E, 0x63C9, 0xB47C, + 0x63CA, 0xD95C, 0x63CB, 0xD96D, 0x63CC, 0xD96C, 0x63CD, 0xB47E, 0x63CE, 0xD955, 0x63CF, 0xB479, 0x63D0, 0xB4A3, 0x63D2, 0xB4A1, + 0x63D3, 0xD969, 0x63D5, 0xD95F, 0x63D6, 0xB4A5, 0x63D7, 0xD970, 0x63D8, 0xD968, 0x63D9, 0xD971, 0x63DA, 0xB4AD, 0x63DB, 0xB4AB, + 0x63DC, 0xD966, 0x63DD, 0xD965, 0x63DF, 0xD963, 0x63E0, 0xD95D, 0x63E1, 0xB4A4, 0x63E3, 0xB4A2, 0x63E4, 0xD1B9, 0x63E5, 0xD956, + 0x63E7, 0xDDB7, 0x63E8, 0xD957, 0x63E9, 0xB47B, 0x63EA, 0xB4AA, 0x63EB, 0xDD79, 0x63ED, 0xB4A6, 0x63EE, 0xB4A7, 0x63EF, 0xD958, + 0x63F0, 0xD96F, 0x63F1, 0xDD78, 0x63F2, 0xD960, 0x63F3, 0xD95B, 0x63F4, 0xB4A9, 0x63F5, 0xD961, 0x63F6, 0xD95E, 0x63F9, 0xB4AE, + 0x6406, 0xB770, 0x6409, 0xDD7C, 0x640A, 0xDDB1, 0x640B, 0xDDB6, 0x640C, 0xDDAA, 0x640D, 0xB76C, 0x640E, 0xDDBB, 0x640F, 0xB769, + 0x6410, 0xDD7A, 0x6412, 0xDD7B, 0x6413, 0xB762, 0x6414, 0xB76B, 0x6415, 0xDDA4, 0x6416, 0xB76E, 0x6417, 0xB76F, 0x6418, 0xDDA5, + 0x641A, 0xDDB2, 0x641B, 0xDDB8, 0x641C, 0xB76A, 0x641E, 0xB764, 0x641F, 0xDDA3, 0x6420, 0xDD7D, 0x6421, 0xDDBA, 0x6422, 0xDDA8, + 0x6423, 0xDDA9, 0x6424, 0xDD7E, 0x6425, 0xDDB4, 0x6426, 0xDDAB, 0x6427, 0xDDB5, 0x6428, 0xDDAD, 0x642A, 0xB765, 0x642B, 0xE1D9, + 0x642C, 0xB768, 0x642D, 0xB766, 0x642E, 0xDDB9, 0x642F, 0xDDB0, 0x6430, 0xDDAC, 0x6433, 0xDDA1, 0x6434, 0xBA53, 0x6435, 0xDDAF, + 0x6436, 0xB76D, 0x6437, 0xDDA7, 0x6439, 0xDDA6, 0x643D, 0xB767, 0x643E, 0xB763, 0x643F, 0xE1EE, 0x6440, 0xDDB3, 0x6441, 0xDDAE, + 0x6443, 0xDDA2, 0x644B, 0xE1E9, 0x644D, 0xE1DA, 0x644E, 0xE1E5, 0x6450, 0xE1EC, 0x6451, 0xBA51, 0x6452, 0xB4AC, 0x6453, 0xE1EA, + 0x6454, 0xBA4C, 0x6458, 0xBA4B, 0x6459, 0xE1F1, 0x645B, 0xE1DB, 0x645C, 0xE1E8, 0x645D, 0xE1DC, 0x645E, 0xE1E7, 0x645F, 0xBA4F, + 0x6460, 0xE1EB, 0x6461, 0xD962, 0x6465, 0xE1F2, 0x6466, 0xE1E3, 0x6467, 0xBA52, 0x6468, 0xE5BA, 0x6469, 0xBCAF, 0x646B, 0xE1F0, + 0x646C, 0xE1EF, 0x646D, 0xBA54, 0x646E, 0xE5AD, 0x646F, 0xBCB0, 0x6470, 0xE5AE, 0x6472, 0xE1DF, 0x6473, 0xE1E0, 0x6474, 0xE1DD, + 0x6475, 0xE1E2, 0x6476, 0xE1DE, 0x6477, 0xE1F3, 0x6478, 0xBA4E, 0x6479, 0xBCB1, 0x647A, 0xBA50, 0x647B, 0xBA55, 0x647D, 0xE1E1, + 0x647F, 0xE1ED, 0x6482, 0xE1E6, 0x6485, 0xE5B1, 0x6487, 0xBA4A, 0x6488, 0xBCB4, 0x6489, 0xE9AA, 0x648A, 0xE5B6, 0x648B, 0xE5B5, + 0x648C, 0xE5B7, 0x648F, 0xE5B4, 0x6490, 0xBCB5, 0x6492, 0xBCBB, 0x6493, 0xBCB8, 0x6495, 0xBCB9, 0x6496, 0xE5AF, 0x6497, 0xE5B2, + 0x6498, 0xE5BC, 0x6499, 0xBCC1, 0x649A, 0xBCBF, 0x649C, 0xE5B3, 0x649D, 0xD95A, 0x649E, 0xBCB2, 0x649F, 0xE5B9, 0x64A0, 0xE5B0, + 0x64A2, 0xBCC2, 0x64A3, 0xE5B8, 0x64A4, 0xBA4D, 0x64A5, 0xBCB7, 0x64A6, 0xE1E4, 0x64A9, 0xBCBA, 0x64AB, 0xBCBE, 0x64AC, 0xBCC0, + 0x64AD, 0xBCBD, 0x64AE, 0xBCBC, 0x64B0, 0xBCB6, 0x64B1, 0xE5BB, 0x64B2, 0xBCB3, 0x64B3, 0xBCC3, 0x64BB, 0xBED8, 0x64BC, 0xBED9, + 0x64BD, 0xE9A9, 0x64BE, 0xBEE2, 0x64BF, 0xBEDF, 0x64C1, 0xBED6, 0x64C2, 0xBEDD, 0x64C3, 0xE9AB, 0x64C4, 0xBEDB, 0x64C5, 0xBED5, + 0x64C7, 0xBEDC, 0x64C9, 0xE9A8, 0x64CA, 0xC0BB, 0x64CB, 0xBED7, 0x64CD, 0xBEDE, 0x64CE, 0xC0BA, 0x64CF, 0xE9A7, 0x64D0, 0xE9A6, + 0x64D2, 0xBEE0, 0x64D4, 0xBEE1, 0x64D6, 0xE9A5, 0x64D7, 0xE9A4, 0x64D8, 0xC0BC, 0x64D9, 0xE9AE, 0x64DA, 0xBEDA, 0x64DB, 0xE9AC, + 0x64E0, 0xC0BD, 0x64E2, 0xC0C2, 0x64E3, 0xECEA, 0x64E4, 0xECEC, 0x64E6, 0xC0BF, 0x64E8, 0xECED, 0x64E9, 0xECE9, 0x64EB, 0xECEB, + 0x64EC, 0xC0C0, 0x64ED, 0xC0C3, 0x64EF, 0xECE8, 0x64F0, 0xC0BE, 0x64F1, 0xC0C1, 0x64F2, 0xC259, 0x64F3, 0xE9AD, 0x64F4, 0xC258, + 0x64F7, 0xC25E, 0x64F8, 0xEFD4, 0x64FA, 0xC25C, 0x64FB, 0xC25D, 0x64FC, 0xEFD7, 0x64FD, 0xEFD3, 0x64FE, 0xC25A, 0x64FF, 0xEFD1, + 0x6500, 0xC36B, 0x6501, 0xEFD5, 0x6503, 0xEFD6, 0x6504, 0xEFD2, 0x6506, 0xC25B, 0x6507, 0xF242, 0x6509, 0xF245, 0x650C, 0xF246, + 0x650D, 0xF244, 0x650E, 0xF247, 0x650F, 0xC36C, 0x6510, 0xF243, 0x6513, 0xF44E, 0x6514, 0xC464, 0x6515, 0xF44D, 0x6516, 0xF44C, + 0x6517, 0xF44B, 0x6518, 0xC463, 0x6519, 0xC465, 0x651B, 0xF5CD, 0x651C, 0xC4E2, 0x651D, 0xC4E1, 0x6520, 0xF6E1, 0x6521, 0xF6E0, + 0x6522, 0xF6E3, 0x6523, 0xC5CB, 0x6524, 0xC575, 0x6525, 0xF7DD, 0x6526, 0xF6E2, 0x6529, 0xF7DC, 0x652A, 0xC5CD, 0x652B, 0xC5CC, + 0x652C, 0xC5F3, 0x652D, 0xF8A9, 0x652E, 0xF8EF, 0x652F, 0xA4E4, 0x6532, 0xD972, 0x6533, 0xE9AF, 0x6536, 0xA6AC, 0x6537, 0xCAF7, + 0x6538, 0xA7F1, 0x6539, 0xA7EF, 0x653B, 0xA7F0, 0x653D, 0xCCC1, 0x653E, 0xA9F1, 0x653F, 0xAC46, 0x6541, 0xCEE7, 0x6543, 0xCEE8, + 0x6545, 0xAC47, 0x6546, 0xD1CE, 0x6548, 0xAEC4, 0x6549, 0xAEC5, 0x654A, 0xD1CD, 0x654F, 0xB1D3, 0x6551, 0xB1CF, 0x6553, 0xD5A7, + 0x6554, 0xB1D6, 0x6555, 0xB1D5, 0x6556, 0xB1CE, 0x6557, 0xB1D1, 0x6558, 0xB1D4, 0x6559, 0xB1D0, 0x655C, 0xD976, 0x655D, 0xB1CD, + 0x655E, 0xB4AF, 0x6562, 0xB4B1, 0x6563, 0xB4B2, 0x6564, 0xD975, 0x6565, 0xD978, 0x6566, 0xB4B0, 0x6567, 0xD973, 0x6568, 0xD977, + 0x656A, 0xD974, 0x656C, 0xB771, 0x656F, 0xDDBC, 0x6572, 0xBA56, 0x6573, 0xE1F4, 0x6574, 0xBEE3, 0x6575, 0xBCC4, 0x6576, 0xE5BD, + 0x6577, 0xBCC5, 0x6578, 0xBCC6, 0x6579, 0xE5BF, 0x657A, 0xE5BE, 0x657B, 0xE5C0, 0x657C, 0xE9B1, 0x657F, 0xE9B0, 0x6580, 0xECEF, + 0x6581, 0xECEE, 0x6582, 0xC0C4, 0x6583, 0xC0C5, 0x6584, 0xF248, 0x6587, 0xA4E5, 0x658C, 0xD979, 0x6590, 0xB4B4, 0x6591, 0xB4B3, + 0x6592, 0xDDBD, 0x6594, 0xEFD8, 0x6595, 0xC4E3, 0x6596, 0xF7DE, 0x6597, 0xA4E6, 0x6599, 0xAEC6, 0x659B, 0xB1D8, 0x659C, 0xB1D7, + 0x659D, 0xD97A, 0x659E, 0xD97B, 0x659F, 0xB772, 0x65A0, 0xE1F5, 0x65A1, 0xBA57, 0x65A2, 0xE9B2, 0x65A4, 0xA4E7, 0x65A5, 0xA5B8, + 0x65A7, 0xA9F2, 0x65A8, 0xCCC2, 0x65AA, 0xCEE9, 0x65AB, 0xAC48, 0x65AC, 0xB1D9, 0x65AE, 0xD97C, 0x65AF, 0xB4B5, 0x65B0, 0xB773, + 0x65B2, 0xE5C1, 0x65B3, 0xE5C2, 0x65B6, 0xECF0, 0x65B7, 0xC25F, 0x65B8, 0xF8F0, 0x65B9, 0xA4E8, 0x65BB, 0xCCC3, 0x65BC, 0xA9F3, + 0x65BD, 0xAC49, 0x65BF, 0xCEEA, 0x65C1, 0xAEC7, 0x65C2, 0xD1D2, 0x65C3, 0xD1D0, 0x65C4, 0xD1D1, 0x65C5, 0xAEC8, 0x65C6, 0xD1CF, + 0x65CB, 0xB1DB, 0x65CC, 0xB1DC, 0x65CD, 0xD5A8, 0x65CE, 0xB1DD, 0x65CF, 0xB1DA, 0x65D0, 0xD97D, 0x65D2, 0xD97E, 0x65D3, 0xDDBE, + 0x65D6, 0xBA59, 0x65D7, 0xBA58, 0x65DA, 0xECF1, 0x65DB, 0xEFD9, 0x65DD, 0xF24A, 0x65DE, 0xF249, 0x65DF, 0xF44F, 0x65E1, 0xC95E, + 0x65E2, 0xAC4A, 0x65E5, 0xA4E9, 0x65E6, 0xA5B9, 0x65E8, 0xA6AE, 0x65E9, 0xA6AD, 0x65EC, 0xA6AF, 0x65ED, 0xA6B0, 0x65EE, 0xC9EE, + 0x65EF, 0xC9ED, 0x65F0, 0xCAF8, 0x65F1, 0xA7F2, 0x65F2, 0xCAFB, 0x65F3, 0xCAFA, 0x65F4, 0xCAF9, 0x65F5, 0xCAFC, 0x65FA, 0xA9F4, + 0x65FB, 0xCCC9, 0x65FC, 0xCCC5, 0x65FD, 0xCCCE, 0x6600, 0xA9FB, 0x6602, 0xA9F9, 0x6603, 0xCCCA, 0x6604, 0xCCC6, 0x6605, 0xCCCD, + 0x6606, 0xA9F8, 0x6607, 0xAA40, 0x6608, 0xCCC8, 0x6609, 0xCCC4, 0x660A, 0xA9FE, 0x660B, 0xCCCB, 0x660C, 0xA9F7, 0x660D, 0xCCCC, + 0x660E, 0xA9FA, 0x660F, 0xA9FC, 0x6610, 0xCCD0, 0x6611, 0xCCCF, 0x6612, 0xCCC7, 0x6613, 0xA9F6, 0x6614, 0xA9F5, 0x6615, 0xA9FD, + 0x661C, 0xCEEF, 0x661D, 0xCEF5, 0x661F, 0xAC50, 0x6620, 0xAC4D, 0x6621, 0xCEEC, 0x6622, 0xCEF1, 0x6624, 0xAC53, 0x6625, 0xAC4B, + 0x6626, 0xCEF0, 0x6627, 0xAC4E, 0x6628, 0xAC51, 0x662B, 0xCEF3, 0x662D, 0xAC4C, 0x662E, 0xCEF8, 0x662F, 0xAC4F, 0x6631, 0xAC52, + 0x6632, 0xCEED, 0x6633, 0xCEF2, 0x6634, 0xCEF6, 0x6635, 0xCEEE, 0x6636, 0xCEEB, 0x6639, 0xCEF7, 0x663A, 0xCEF4, 0x6641, 0xAED0, + 0x6642, 0xAEC9, 0x6643, 0xAECC, 0x6645, 0xAECF, 0x6647, 0xD1D5, 0x6649, 0xAECA, 0x664A, 0xD1D3, 0x664C, 0xAECE, 0x664F, 0xAECB, + 0x6651, 0xD1D6, 0x6652, 0xAECD, 0x6659, 0xD5AC, 0x665A, 0xB1DF, 0x665B, 0xD5AB, 0x665C, 0xD5AD, 0x665D, 0xB1DE, 0x665E, 0xB1E3, + 0x665F, 0xD1D4, 0x6661, 0xD5AA, 0x6662, 0xD5AE, 0x6664, 0xB1E0, 0x6665, 0xD5A9, 0x6666, 0xB1E2, 0x6668, 0xB1E1, 0x666A, 0xD9A7, + 0x666C, 0xD9A2, 0x666E, 0xB4B6, 0x666F, 0xB4BA, 0x6670, 0xB4B7, 0x6671, 0xD9A5, 0x6672, 0xD9A8, 0x6674, 0xB4B8, 0x6676, 0xB4B9, + 0x6677, 0xB4BE, 0x6678, 0xDDC7, 0x6679, 0xD9A6, 0x667A, 0xB4BC, 0x667B, 0xD9A3, 0x667C, 0xD9A1, 0x667E, 0xB4BD, 0x6680, 0xD9A4, + 0x6684, 0xB779, 0x6686, 0xDDBF, 0x6687, 0xB776, 0x6688, 0xB777, 0x6689, 0xB775, 0x668A, 0xDDC4, 0x668B, 0xDDC3, 0x668C, 0xDDC0, + 0x668D, 0xB77B, 0x6690, 0xDDC2, 0x6691, 0xB4BB, 0x6694, 0xDDC6, 0x6695, 0xDDC1, 0x6696, 0xB778, 0x6697, 0xB774, 0x6698, 0xB77A, + 0x6699, 0xDDC5, 0x669D, 0xBA5C, 0x669F, 0xE1F8, 0x66A0, 0xE1F7, 0x66A1, 0xE1F6, 0x66A2, 0xBA5A, 0x66A8, 0xBA5B, 0x66A9, 0xE5C5, + 0x66AA, 0xE5C8, 0x66AB, 0xBCC8, 0x66AE, 0xBCC7, 0x66AF, 0xE5C9, 0x66B0, 0xE5C4, 0x66B1, 0xBCCA, 0x66B2, 0xE5C6, 0x66B4, 0xBCC9, + 0x66B5, 0xE5C3, 0x66B7, 0xE5C7, 0x66B8, 0xBEE9, 0x66B9, 0xBEE6, 0x66BA, 0xE9BB, 0x66BB, 0xE9BA, 0x66BD, 0xE9B9, 0x66BE, 0xE9B4, + 0x66C0, 0xE9B5, 0x66C4, 0xBEE7, 0x66C6, 0xBEE4, 0x66C7, 0xBEE8, 0x66C8, 0xE9B3, 0x66C9, 0xBEE5, 0x66CA, 0xE9B6, 0x66CB, 0xE9B7, + 0x66CC, 0xE9BC, 0x66CF, 0xE9B8, 0x66D2, 0xECF2, 0x66D6, 0xC0C7, 0x66D8, 0xEFDC, 0x66D9, 0xC0C6, 0x66DA, 0xEFDA, 0x66DB, 0xEFDB, + 0x66DC, 0xC260, 0x66DD, 0xC36E, 0x66DE, 0xF24B, 0x66E0, 0xC36D, 0x66E3, 0xF451, 0x66E4, 0xF452, 0x66E6, 0xC466, 0x66E8, 0xF450, + 0x66E9, 0xC4E4, 0x66EB, 0xF7DF, 0x66EC, 0xC5CE, 0x66ED, 0xF8AA, 0x66EE, 0xF8AB, 0x66F0, 0xA4EA, 0x66F2, 0xA6B1, 0x66F3, 0xA6B2, + 0x66F4, 0xA7F3, 0x66F6, 0xCCD1, 0x66F7, 0xAC54, 0x66F8, 0xAED1, 0x66F9, 0xB1E4, 0x66FC, 0xB0D2, 0x66FE, 0xB4BF, 0x66FF, 0xB4C0, + 0x6700, 0xB3CC, 0x6701, 0xD9A9, 0x6703, 0xB77C, 0x6704, 0xE1FA, 0x6705, 0xE1F9, 0x6708, 0xA4EB, 0x6709, 0xA6B3, 0x670A, 0xCCD2, + 0x670B, 0xAA42, 0x670D, 0xAA41, 0x670F, 0xCEF9, 0x6710, 0xCEFA, 0x6712, 0xD1D7, 0x6713, 0xD1D8, 0x6714, 0xAED2, 0x6715, 0xAED3, + 0x6717, 0xAED4, 0x6718, 0xD5AF, 0x671B, 0xB1E6, 0x671D, 0xB4C2, 0x671F, 0xB4C1, 0x6720, 0xDDC8, 0x6721, 0xDF7A, 0x6722, 0xE1FB, + 0x6723, 0xE9BD, 0x6726, 0xC261, 0x6727, 0xC467, 0x6728, 0xA4EC, 0x672A, 0xA5BC, 0x672B, 0xA5BD, 0x672C, 0xA5BB, 0x672D, 0xA5BE, + 0x672E, 0xA5BA, 0x6731, 0xA6B6, 0x6733, 0xC9F6, 0x6734, 0xA6B5, 0x6735, 0xA6B7, 0x6738, 0xC9F1, 0x6739, 0xC9F0, 0x673A, 0xC9F3, + 0x673B, 0xC9F2, 0x673C, 0xC9F5, 0x673D, 0xA6B4, 0x673E, 0xC9EF, 0x673F, 0xC9F4, 0x6745, 0xCAFD, 0x6746, 0xA7FD, 0x6747, 0xCAFE, + 0x6748, 0xCB43, 0x6749, 0xA7FC, 0x674B, 0xCB47, 0x674C, 0xCB42, 0x674D, 0xCB45, 0x674E, 0xA7F5, 0x674F, 0xA7F6, 0x6750, 0xA7F7, + 0x6751, 0xA7F8, 0x6753, 0xA840, 0x6755, 0xCB41, 0x6756, 0xA7FA, 0x6757, 0xA841, 0x6759, 0xCB40, 0x675A, 0xCB46, 0x675C, 0xA7F9, + 0x675D, 0xCB44, 0x675E, 0xA7FB, 0x675F, 0xA7F4, 0x6760, 0xA7FE, 0x676A, 0xAA57, 0x676C, 0xCCD4, 0x676D, 0xAA43, 0x676F, 0xAA4D, + 0x6770, 0xAA4E, 0x6771, 0xAA46, 0x6772, 0xAA58, 0x6773, 0xAA48, 0x6774, 0xCCDC, 0x6775, 0xAA53, 0x6776, 0xCCD7, 0x6777, 0xAA49, + 0x6778, 0xCCE6, 0x6779, 0xCCE7, 0x677A, 0xCCDF, 0x677B, 0xCCD8, 0x677C, 0xAA56, 0x677D, 0xCCE4, 0x677E, 0xAA51, 0x677F, 0xAA4F, + 0x6781, 0xCCE5, 0x6783, 0xCCE3, 0x6784, 0xCCDB, 0x6785, 0xCCD3, 0x6786, 0xCCDA, 0x6787, 0xAA4A, 0x6789, 0xAA50, 0x678B, 0xAA44, + 0x678C, 0xCCDE, 0x678D, 0xCCDD, 0x678E, 0xCCD5, 0x6790, 0xAA52, 0x6791, 0xCCE1, 0x6792, 0xCCD6, 0x6793, 0xAA55, 0x6794, 0xCCE8, + 0x6795, 0xAA45, 0x6797, 0xAA4C, 0x6798, 0xCCD9, 0x6799, 0xCCE2, 0x679A, 0xAA54, 0x679C, 0xAA47, 0x679D, 0xAA4B, 0x679F, 0xCCE0, + 0x67AE, 0xCF5B, 0x67AF, 0xAC5C, 0x67B0, 0xAC69, 0x67B2, 0xCF56, 0x67B3, 0xCF4C, 0x67B4, 0xAC62, 0x67B5, 0xCF4A, 0x67B6, 0xAC5B, + 0x67B7, 0xCF45, 0x67B8, 0xAC65, 0x67B9, 0xCF52, 0x67BA, 0xCEFE, 0x67BB, 0xCF41, 0x67C0, 0xCF44, 0x67C1, 0xCEFB, 0x67C2, 0xCF51, + 0x67C3, 0xCF61, 0x67C4, 0xAC60, 0x67C5, 0xCF46, 0x67C6, 0xCF58, 0x67C8, 0xCEFD, 0x67C9, 0xCF5F, 0x67CA, 0xCF60, 0x67CB, 0xCF63, + 0x67CC, 0xCF5A, 0x67CD, 0xCF4B, 0x67CE, 0xCF53, 0x67CF, 0xAC66, 0x67D0, 0xAC59, 0x67D1, 0xAC61, 0x67D2, 0xAC6D, 0x67D3, 0xAC56, + 0x67D4, 0xAC58, 0x67D8, 0xCF43, 0x67D9, 0xAC6A, 0x67DA, 0xAC63, 0x67DB, 0xCF5D, 0x67DC, 0xCF40, 0x67DD, 0xAC6C, 0x67DE, 0xAC67, + 0x67DF, 0xCF49, 0x67E2, 0xAC6B, 0x67E3, 0xCF50, 0x67E4, 0xCF48, 0x67E5, 0xAC64, 0x67E6, 0xCF5C, 0x67E7, 0xCF54, 0x67E9, 0xAC5E, + 0x67EA, 0xCF62, 0x67EB, 0xCF47, 0x67EC, 0xAC5A, 0x67ED, 0xCF59, 0x67EE, 0xCF4F, 0x67EF, 0xAC5F, 0x67F0, 0xCF55, 0x67F1, 0xAC57, + 0x67F2, 0xCEFC, 0x67F3, 0xAC68, 0x67F4, 0xAEE3, 0x67F5, 0xAC5D, 0x67F6, 0xCF4E, 0x67F7, 0xCF4D, 0x67F8, 0xCF42, 0x67FA, 0xCF5E, + 0x67FC, 0xCF57, 0x67FF, 0xAC55, 0x6812, 0xD1EC, 0x6813, 0xAEEA, 0x6814, 0xD1ED, 0x6816, 0xD1E1, 0x6817, 0xAEDF, 0x6818, 0xAEEB, + 0x681A, 0xD1DA, 0x681C, 0xD1E3, 0x681D, 0xD1EB, 0x681F, 0xD1D9, 0x6820, 0xD1F4, 0x6821, 0xAED5, 0x6825, 0xD1F3, 0x6826, 0xD1EE, + 0x6828, 0xD1EF, 0x6829, 0xAEDD, 0x682A, 0xAEE8, 0x682B, 0xD1E5, 0x682D, 0xD1E6, 0x682E, 0xD1F0, 0x682F, 0xD1E7, 0x6831, 0xD1E2, + 0x6832, 0xD1DC, 0x6833, 0xD1DD, 0x6834, 0xD1EA, 0x6835, 0xD1E4, 0x6838, 0xAED6, 0x6839, 0xAEDA, 0x683A, 0xD1F2, 0x683B, 0xD1DE, + 0x683C, 0xAEE6, 0x683D, 0xAEE2, 0x6840, 0xAEE5, 0x6841, 0xAEEC, 0x6842, 0xAEDB, 0x6843, 0xAEE7, 0x6844, 0xD1E9, 0x6845, 0xAEE9, + 0x6846, 0xAED8, 0x6848, 0xAED7, 0x6849, 0xD1DB, 0x684B, 0xD1DF, 0x684C, 0xAEE0, 0x684D, 0xD1F1, 0x684E, 0xD1E8, 0x684F, 0xD1E0, + 0x6850, 0xAEE4, 0x6851, 0xAEE1, 0x6853, 0xAED9, 0x6854, 0xAEDC, 0x686B, 0xD5C4, 0x686D, 0xD5B4, 0x686E, 0xD5B5, 0x686F, 0xD5B9, + 0x6871, 0xD5C8, 0x6872, 0xD5C5, 0x6874, 0xD5BE, 0x6875, 0xD5BD, 0x6876, 0xB1ED, 0x6877, 0xD5C1, 0x6878, 0xD5D0, 0x6879, 0xD5B0, + 0x687B, 0xD5D1, 0x687C, 0xD5C3, 0x687D, 0xD5D5, 0x687E, 0xD5C9, 0x687F, 0xB1EC, 0x6880, 0xD5C7, 0x6881, 0xB1E7, 0x6882, 0xB1FC, + 0x6883, 0xB1F2, 0x6885, 0xB1F6, 0x6886, 0xB1F5, 0x6887, 0xD5B1, 0x6889, 0xD5CE, 0x688A, 0xD5D4, 0x688B, 0xD5CC, 0x688C, 0xD5D3, + 0x688F, 0xD5C0, 0x6890, 0xD5B2, 0x6891, 0xD5D2, 0x6892, 0xD5C2, 0x6893, 0xB1EA, 0x6894, 0xB1F7, 0x6896, 0xD5CB, 0x6897, 0xB1F0, + 0x689B, 0xD5CA, 0x689C, 0xD5B3, 0x689D, 0xB1F8, 0x689F, 0xB1FA, 0x68A0, 0xD5CD, 0x68A1, 0xB1FB, 0x68A2, 0xB1E9, 0x68A3, 0xD5BA, + 0x68A4, 0xD5CF, 0x68A7, 0xB1EF, 0x68A8, 0xB1F9, 0x68A9, 0xD5BC, 0x68AA, 0xD5C6, 0x68AB, 0xD5B7, 0x68AC, 0xD5BB, 0x68AD, 0xB1F4, + 0x68AE, 0xD5B6, 0x68AF, 0xB1E8, 0x68B0, 0xB1F1, 0x68B1, 0xB1EE, 0x68B2, 0xD5BF, 0x68B3, 0xAEDE, 0x68B4, 0xD9C0, 0x68B5, 0xB1EB, + 0x68C4, 0xB1F3, 0x68C6, 0xD9C3, 0x68C7, 0xD9D9, 0x68C8, 0xD9CE, 0x68C9, 0xB4D6, 0x68CB, 0xB4D1, 0x68CC, 0xD9BD, 0x68CD, 0xB4D2, + 0x68CE, 0xD9CD, 0x68D0, 0xD9C6, 0x68D1, 0xD9D3, 0x68D2, 0xB4CE, 0x68D3, 0xD9AB, 0x68D4, 0xD9D5, 0x68D5, 0xB4C4, 0x68D6, 0xD9B3, + 0x68D7, 0xB4C7, 0x68D8, 0xB4C6, 0x68DA, 0xB4D7, 0x68DC, 0xD9AD, 0x68DD, 0xD9CF, 0x68DE, 0xD9D0, 0x68DF, 0xB4C9, 0x68E0, 0xB4C5, + 0x68E1, 0xD9BB, 0x68E3, 0xB4D0, 0x68E4, 0xD9B6, 0x68E6, 0xD9D1, 0x68E7, 0xB4CC, 0x68E8, 0xD9C9, 0x68E9, 0xD9D6, 0x68EA, 0xD9B0, + 0x68EB, 0xD9B5, 0x68EC, 0xD9AF, 0x68EE, 0xB4CB, 0x68EF, 0xD9C2, 0x68F0, 0xDDDE, 0x68F1, 0xD9B1, 0x68F2, 0xB4CF, 0x68F3, 0xD9BA, + 0x68F4, 0xD9D2, 0x68F5, 0xB4CA, 0x68F6, 0xD9B7, 0x68F7, 0xD9B4, 0x68F8, 0xD9C5, 0x68F9, 0xB4CD, 0x68FA, 0xB4C3, 0x68FB, 0xB4D9, + 0x68FC, 0xD9C8, 0x68FD, 0xD9C7, 0x6904, 0xD9AC, 0x6905, 0xB4C8, 0x6906, 0xD9D4, 0x6907, 0xD9BC, 0x6908, 0xD9BE, 0x690A, 0xD9CB, + 0x690B, 0xD9CA, 0x690C, 0xD9AA, 0x690D, 0xB4D3, 0x690E, 0xB4D5, 0x690F, 0xD9B2, 0x6910, 0xD9B9, 0x6911, 0xD9C1, 0x6912, 0xB4D4, + 0x6913, 0xD9B8, 0x6914, 0xD9C4, 0x6915, 0xD9D7, 0x6917, 0xD9CC, 0x6925, 0xD9D8, 0x692A, 0xD9AE, 0x692F, 0xDDF2, 0x6930, 0xB7A6, + 0x6932, 0xDDF0, 0x6933, 0xDDDB, 0x6934, 0xDDE0, 0x6935, 0xDDD9, 0x6937, 0xDDEC, 0x6938, 0xDDCB, 0x6939, 0xDDD2, 0x693B, 0xDDEA, + 0x693C, 0xDDF4, 0x693D, 0xDDDC, 0x693F, 0xDDCF, 0x6940, 0xDDE2, 0x6941, 0xDDE7, 0x6942, 0xDDD3, 0x6944, 0xDDE4, 0x6945, 0xDDD0, + 0x6948, 0xDDD7, 0x6949, 0xDDD8, 0x694A, 0xB7A8, 0x694B, 0xDDEB, 0x694C, 0xDDE9, 0x694E, 0xDDCC, 0x694F, 0xDDEE, 0x6951, 0xDDEF, + 0x6952, 0xDDF1, 0x6953, 0xB7AC, 0x6954, 0xB7A4, 0x6956, 0xD5B8, 0x6957, 0xDDD4, 0x6958, 0xDDE6, 0x6959, 0xDDD5, 0x695A, 0xB7A1, + 0x695B, 0xB7B1, 0x695C, 0xDDED, 0x695D, 0xB7AF, 0x695E, 0xB7AB, 0x695F, 0xDDCA, 0x6960, 0xB7A3, 0x6962, 0xDDCD, 0x6963, 0xB7B0, + 0x6965, 0xDDDD, 0x6966, 0xDDC9, 0x6968, 0xB7A9, 0x6969, 0xDDE1, 0x696A, 0xDDD1, 0x696B, 0xB7AA, 0x696C, 0xDDDA, 0x696D, 0xB77E, + 0x696E, 0xB4D8, 0x696F, 0xDDE3, 0x6970, 0xD9BF, 0x6971, 0xDDCE, 0x6974, 0xDDE8, 0x6975, 0xB7A5, 0x6976, 0xDDE5, 0x6977, 0xB7A2, + 0x6978, 0xDDDF, 0x6979, 0xB7AD, 0x697A, 0xDDD6, 0x697B, 0xDDF3, 0x6982, 0xB7A7, 0x6983, 0xDEC6, 0x6986, 0xB7AE, 0x698D, 0xE24A, + 0x698E, 0xE248, 0x6990, 0xE25E, 0x6991, 0xE246, 0x6993, 0xE258, 0x6994, 0xB77D, 0x6995, 0xBA5F, 0x6996, 0xE242, 0x6997, 0xE25D, + 0x6999, 0xE247, 0x699A, 0xE255, 0x699B, 0xBA64, 0x699C, 0xBA5D, 0x699E, 0xE25B, 0x69A0, 0xE240, 0x69A1, 0xE25A, 0x69A3, 0xBA6F, + 0x69A4, 0xE251, 0x69A5, 0xE261, 0x69A6, 0xBA6D, 0x69A7, 0xE249, 0x69A8, 0xBA5E, 0x69A9, 0xE24B, 0x69AA, 0xE259, 0x69AB, 0xBA67, + 0x69AC, 0xE244, 0x69AD, 0xBA6B, 0x69AE, 0xBA61, 0x69AF, 0xE24D, 0x69B0, 0xE243, 0x69B1, 0xE1FC, 0x69B3, 0xE257, 0x69B4, 0xBA68, + 0x69B5, 0xE260, 0x69B6, 0xE1FD, 0x69B7, 0xBA65, 0x69B9, 0xE253, 0x69BB, 0xBA66, 0x69BC, 0xE245, 0x69BD, 0xE250, 0x69BE, 0xE24C, + 0x69BF, 0xE24E, 0x69C1, 0xBA60, 0x69C2, 0xE25F, 0x69C3, 0xBA6E, 0x69C4, 0xE24F, 0x69C6, 0xE262, 0x69C9, 0xE1FE, 0x69CA, 0xE254, + 0x69CB, 0xBA63, 0x69CC, 0xBA6C, 0x69CD, 0xBA6A, 0x69CE, 0xE241, 0x69CF, 0xE256, 0x69D0, 0xBA69, 0x69D3, 0xBA62, 0x69D4, 0xE252, + 0x69D9, 0xE25C, 0x69E2, 0xE5D5, 0x69E4, 0xE5D1, 0x69E5, 0xE5CD, 0x69E6, 0xE5E1, 0x69E7, 0xE5DE, 0x69E8, 0xBCCD, 0x69EB, 0xE5E5, + 0x69EC, 0xE5D4, 0x69ED, 0xBCD8, 0x69EE, 0xE5DB, 0x69F1, 0xE5D0, 0x69F2, 0xE5DA, 0x69F3, 0xBCD5, 0x69F4, 0xE5EE, 0x69F6, 0xE5EB, + 0x69F7, 0xE5DD, 0x69F8, 0xE5CE, 0x69FB, 0xE5E2, 0x69FC, 0xE5E4, 0x69FD, 0xBCD1, 0x69FE, 0xE5D8, 0x69FF, 0xE5D3, 0x6A00, 0xE5CA, + 0x6A01, 0xBCCE, 0x6A02, 0xBCD6, 0x6A04, 0xE5E7, 0x6A05, 0xBCD7, 0x6A06, 0xE5CB, 0x6A07, 0xE5ED, 0x6A08, 0xE5E0, 0x6A09, 0xE5E6, + 0x6A0A, 0xBCD4, 0x6A0D, 0xE5E3, 0x6A0F, 0xE5EA, 0x6A11, 0xBCD9, 0x6A13, 0xBCD3, 0x6A14, 0xE5DC, 0x6A15, 0xE5CF, 0x6A16, 0xE5EF, + 0x6A17, 0xE5CC, 0x6A18, 0xE5E8, 0x6A19, 0xBCD0, 0x6A1B, 0xE5D6, 0x6A1D, 0xE5D7, 0x6A1E, 0xBCCF, 0x6A1F, 0xBCCC, 0x6A20, 0xE5D2, + 0x6A21, 0xBCD2, 0x6A23, 0xBCCB, 0x6A25, 0xE5E9, 0x6A26, 0xE5EC, 0x6A27, 0xE5D9, 0x6A28, 0xE9CA, 0x6A32, 0xE9C2, 0x6A34, 0xE9BE, + 0x6A35, 0xBEF6, 0x6A38, 0xBEEB, 0x6A39, 0xBEF0, 0x6A3A, 0xBEEC, 0x6A3B, 0xE9CC, 0x6A3C, 0xE9D7, 0x6A3D, 0xBEEA, 0x6A3E, 0xE9C4, + 0x6A3F, 0xE9CD, 0x6A40, 0xE5DF, 0x6A41, 0xE9CE, 0x6A44, 0xBEF1, 0x6A46, 0xE9DD, 0x6A47, 0xBEF5, 0x6A48, 0xBEF8, 0x6A49, 0xE9C0, + 0x6A4B, 0xBEF4, 0x6A4D, 0xE9DB, 0x6A4E, 0xE9DC, 0x6A4F, 0xE9D2, 0x6A50, 0xE9D1, 0x6A51, 0xE9C9, 0x6A54, 0xE9D3, 0x6A55, 0xE9DA, + 0x6A56, 0xE9D9, 0x6A58, 0xBEEF, 0x6A59, 0xBEED, 0x6A5A, 0xE9CB, 0x6A5B, 0xE9C8, 0x6A5D, 0xE9C5, 0x6A5E, 0xE9D8, 0x6A5F, 0xBEF7, + 0x6A60, 0xE9D6, 0x6A61, 0xBEF3, 0x6A62, 0xBEF2, 0x6A64, 0xE9D0, 0x6A66, 0xE9BF, 0x6A67, 0xE9C1, 0x6A68, 0xE9C3, 0x6A69, 0xE9D5, + 0x6A6A, 0xE9CF, 0x6A6B, 0xBEEE, 0x6A6D, 0xE9C6, 0x6A6F, 0xE9D4, 0x6A76, 0xE9C7, 0x6A7E, 0xC0CF, 0x6A7F, 0xED45, 0x6A80, 0xC0C8, + 0x6A81, 0xECF5, 0x6A83, 0xED41, 0x6A84, 0xC0CA, 0x6A85, 0xED48, 0x6A87, 0xECFC, 0x6A89, 0xECF7, 0x6A8C, 0xED49, 0x6A8D, 0xECF3, + 0x6A8E, 0xECFE, 0x6A90, 0xC0D1, 0x6A91, 0xED44, 0x6A92, 0xED4A, 0x6A93, 0xECFD, 0x6A94, 0xC0C9, 0x6A95, 0xED40, 0x6A96, 0xECF4, + 0x6A97, 0xC0D0, 0x6A9A, 0xED47, 0x6A9B, 0xECF9, 0x6A9C, 0xC0CC, 0x6A9E, 0xECFB, 0x6A9F, 0xECF8, 0x6AA0, 0xC0D2, 0x6AA1, 0xECFA, + 0x6AA2, 0xC0CB, 0x6AA3, 0xC0CE, 0x6AA4, 0xED43, 0x6AA5, 0xECF6, 0x6AA6, 0xED46, 0x6AA8, 0xED42, 0x6AAC, 0xC263, 0x6AAD, 0xEFE7, + 0x6AAE, 0xC268, 0x6AAF, 0xC269, 0x6AB3, 0xC262, 0x6AB4, 0xEFE6, 0x6AB6, 0xEFE3, 0x6AB7, 0xEFE4, 0x6AB8, 0xC266, 0x6AB9, 0xEFDE, + 0x6ABA, 0xEFE2, 0x6ABB, 0xC265, 0x6ABD, 0xEFDF, 0x6AC2, 0xC267, 0x6AC3, 0xC264, 0x6AC5, 0xEFDD, 0x6AC6, 0xEFE1, 0x6AC7, 0xEFE5, + 0x6ACB, 0xF251, 0x6ACC, 0xF24E, 0x6ACD, 0xF257, 0x6ACF, 0xF256, 0x6AD0, 0xF254, 0x6AD1, 0xF24F, 0x6AD3, 0xC372, 0x6AD9, 0xF250, + 0x6ADA, 0xC371, 0x6ADB, 0xC0CD, 0x6ADC, 0xF253, 0x6ADD, 0xC370, 0x6ADE, 0xF258, 0x6ADF, 0xF252, 0x6AE0, 0xF24D, 0x6AE1, 0xEFE0, + 0x6AE5, 0xC36F, 0x6AE7, 0xF24C, 0x6AE8, 0xF456, 0x6AEA, 0xF455, 0x6AEB, 0xF255, 0x6AEC, 0xC468, 0x6AEE, 0xF459, 0x6AEF, 0xF45A, + 0x6AF0, 0xF454, 0x6AF1, 0xF458, 0x6AF3, 0xF453, 0x6AF8, 0xF5D1, 0x6AF9, 0xF457, 0x6AFA, 0xC4E7, 0x6AFB, 0xC4E5, 0x6AFC, 0xF5CF, + 0x6B00, 0xF5D2, 0x6B02, 0xF5CE, 0x6B03, 0xF5D0, 0x6B04, 0xC4E6, 0x6B08, 0xF6E5, 0x6B09, 0xF6E6, 0x6B0A, 0xC576, 0x6B0B, 0xF6E4, + 0x6B0F, 0xF7E2, 0x6B10, 0xC5CF, 0x6B11, 0xF7E0, 0x6B12, 0xF7E1, 0x6B13, 0xF8AC, 0x6B16, 0xC656, 0x6B17, 0xF8F3, 0x6B18, 0xF8F1, + 0x6B19, 0xF8F2, 0x6B1A, 0xF8F4, 0x6B1E, 0xF9BB, 0x6B20, 0xA4ED, 0x6B21, 0xA6B8, 0x6B23, 0xAA59, 0x6B25, 0xCCE9, 0x6B28, 0xCF64, + 0x6B2C, 0xD1F5, 0x6B2D, 0xD1F7, 0x6B2F, 0xD1F6, 0x6B31, 0xD1F8, 0x6B32, 0xB1FD, 0x6B33, 0xD5D7, 0x6B34, 0xD1F9, 0x6B36, 0xD5D6, + 0x6B37, 0xD5D8, 0x6B38, 0xD5D9, 0x6B39, 0xD9DA, 0x6B3A, 0xB4DB, 0x6B3B, 0xD9DB, 0x6B3C, 0xD9DD, 0x6B3D, 0xB4DC, 0x6B3E, 0xB4DA, + 0x6B3F, 0xD9DC, 0x6B41, 0xDDFA, 0x6B42, 0xDDF8, 0x6B43, 0xDDF7, 0x6B45, 0xDDF6, 0x6B46, 0xDDF5, 0x6B47, 0xB7B2, 0x6B48, 0xDDF9, + 0x6B49, 0xBA70, 0x6B4A, 0xE263, 0x6B4B, 0xE265, 0x6B4C, 0xBA71, 0x6B4D, 0xE264, 0x6B4E, 0xBCDB, 0x6B50, 0xBCDA, 0x6B51, 0xE5F0, + 0x6B54, 0xE9DF, 0x6B55, 0xE9DE, 0x6B56, 0xE9E0, 0x6B59, 0xBEF9, 0x6B5B, 0xED4B, 0x6B5C, 0xC0D3, 0x6B5E, 0xEFE8, 0x6B5F, 0xC26A, + 0x6B60, 0xF259, 0x6B61, 0xC577, 0x6B62, 0xA4EE, 0x6B63, 0xA5BF, 0x6B64, 0xA6B9, 0x6B65, 0xA842, 0x6B66, 0xAA5A, 0x6B67, 0xAA5B, + 0x6B6A, 0xAC6E, 0x6B6D, 0xD1FA, 0x6B72, 0xB7B3, 0x6B76, 0xE6D1, 0x6B77, 0xBEFA, 0x6B78, 0xC26B, 0x6B79, 0xA4EF, 0x6B7B, 0xA6BA, + 0x6B7E, 0xCCEB, 0x6B7F, 0xAA5C, 0x6B80, 0xCCEA, 0x6B82, 0xCF65, 0x6B83, 0xAC6F, 0x6B84, 0xCF66, 0x6B86, 0xAC70, 0x6B88, 0xD1FC, + 0x6B89, 0xAEEE, 0x6B8A, 0xAEED, 0x6B8C, 0xD5DE, 0x6B8D, 0xD5DC, 0x6B8E, 0xD5DD, 0x6B8F, 0xD5DB, 0x6B91, 0xD5DA, 0x6B94, 0xD9DE, + 0x6B95, 0xD9E1, 0x6B96, 0xB4DE, 0x6B97, 0xD9DF, 0x6B98, 0xB4DD, 0x6B99, 0xD9E0, 0x6B9B, 0xDDFB, 0x6B9E, 0xE266, 0x6B9F, 0xE267, + 0x6BA0, 0xE268, 0x6BA2, 0xE5F3, 0x6BA3, 0xE5F2, 0x6BA4, 0xBCDC, 0x6BA5, 0xE5F1, 0x6BA6, 0xE5F4, 0x6BA7, 0xE9E1, 0x6BAA, 0xE9E2, + 0x6BAB, 0xE9E3, 0x6BAD, 0xED4C, 0x6BAE, 0xC0D4, 0x6BAF, 0xC26C, 0x6BB0, 0xF25A, 0x6BB2, 0xC4E8, 0x6BB3, 0xC95F, 0x6BB5, 0xAC71, + 0x6BB6, 0xCF67, 0x6BB7, 0xAEEF, 0x6BBA, 0xB1FE, 0x6BBC, 0xB4DF, 0x6BBD, 0xD9E2, 0x6BBF, 0xB7B5, 0x6BC0, 0xB7B4, 0x6BC3, 0xE269, + 0x6BC4, 0xE26A, 0x6BC5, 0xBCDD, 0x6BC6, 0xBCDE, 0x6BC7, 0xE9E5, 0x6BC8, 0xE9E4, 0x6BC9, 0xEFE9, 0x6BCA, 0xF7E3, 0x6BCB, 0xA4F0, + 0x6BCC, 0xC960, 0x6BCD, 0xA5C0, 0x6BCF, 0xA843, 0x6BD0, 0xCB48, 0x6BD2, 0xAC72, 0x6BD3, 0xB7B6, 0x6BD4, 0xA4F1, 0x6BD6, 0xCF68, + 0x6BD7, 0xAC73, 0x6BD8, 0xCF69, 0x6BDA, 0xC0D5, 0x6BDB, 0xA4F2, 0x6BDE, 0xCCEC, 0x6BE0, 0xCF6A, 0x6BE2, 0xD242, 0x6BE3, 0xD241, + 0x6BE4, 0xD1FE, 0x6BE6, 0xD1FD, 0x6BE7, 0xD243, 0x6BE8, 0xD240, 0x6BEB, 0xB240, 0x6BEC, 0xB241, 0x6BEF, 0xB4E0, 0x6BF0, 0xD9E3, + 0x6BF2, 0xD9E4, 0x6BF3, 0xD9E5, 0x6BF7, 0xDE41, 0x6BF8, 0xDE42, 0x6BF9, 0xDE40, 0x6BFB, 0xDDFD, 0x6BFC, 0xDDFE, 0x6BFD, 0xB7B7, + 0x6BFE, 0xE26B, 0x6BFF, 0xE5F7, 0x6C00, 0xE5F6, 0x6C01, 0xE5F5, 0x6C02, 0xE5F8, 0x6C03, 0xE9E7, 0x6C04, 0xE9E6, 0x6C05, 0xBEFB, + 0x6C06, 0xE9E8, 0x6C08, 0xC0D6, 0x6C09, 0xED4D, 0x6C0B, 0xEFEA, 0x6C0C, 0xF25B, 0x6C0D, 0xF6E7, 0x6C0F, 0xA4F3, 0x6C10, 0xA5C2, + 0x6C11, 0xA5C1, 0x6C13, 0xAA5D, 0x6C14, 0xC961, 0x6C15, 0xC97E, 0x6C16, 0xA6BB, 0x6C18, 0xC9F7, 0x6C19, 0xCB49, 0x6C1A, 0xCB4A, + 0x6C1B, 0xAA5E, 0x6C1D, 0xCCED, 0x6C1F, 0xAC74, 0x6C20, 0xCF6B, 0x6C21, 0xCF6C, 0x6C23, 0xAEF0, 0x6C24, 0xAEF4, 0x6C25, 0xD244, + 0x6C26, 0xAEF3, 0x6C27, 0xAEF1, 0x6C28, 0xAEF2, 0x6C2A, 0xD5DF, 0x6C2B, 0xB242, 0x6C2C, 0xB4E3, 0x6C2E, 0xB4E1, 0x6C2F, 0xB4E2, + 0x6C30, 0xD9E6, 0x6C33, 0xBA72, 0x6C34, 0xA4F4, 0x6C36, 0xC9A1, 0x6C38, 0xA5C3, 0x6C3B, 0xC9A4, 0x6C3E, 0xA5C6, 0x6C3F, 0xC9A3, + 0x6C40, 0xA5C5, 0x6C41, 0xA5C4, 0x6C42, 0xA844, 0x6C43, 0xC9A2, 0x6C46, 0xC9F8, 0x6C4A, 0xC9FC, 0x6C4B, 0xC9FE, 0x6C4C, 0xCA40, + 0x6C4D, 0xA6C5, 0x6C4E, 0xA6C6, 0x6C4F, 0xC9FB, 0x6C50, 0xA6C1, 0x6C52, 0xC9F9, 0x6C54, 0xC9FD, 0x6C55, 0xA6C2, 0x6C57, 0xA6BD, + 0x6C59, 0xA6BE, 0x6C5B, 0xA6C4, 0x6C5C, 0xC9FA, 0x6C5D, 0xA6BC, 0x6C5E, 0xA845, 0x6C5F, 0xA6BF, 0x6C60, 0xA6C0, 0x6C61, 0xA6C3, + 0x6C65, 0xCB5B, 0x6C66, 0xCB59, 0x6C67, 0xCB4C, 0x6C68, 0xA851, 0x6C69, 0xCB53, 0x6C6A, 0xA84C, 0x6C6B, 0xCB4D, 0x6C6D, 0xCB55, + 0x6C6F, 0xCB52, 0x6C70, 0xA84F, 0x6C71, 0xCB51, 0x6C72, 0xA856, 0x6C73, 0xCB5A, 0x6C74, 0xA858, 0x6C76, 0xA85A, 0x6C78, 0xCB4B, + 0x6C7A, 0xA84D, 0x6C7B, 0xCB5C, 0x6C7D, 0xA854, 0x6C7E, 0xA857, 0x6C80, 0xCD45, 0x6C81, 0xA847, 0x6C82, 0xA85E, 0x6C83, 0xA855, + 0x6C84, 0xCB4E, 0x6C85, 0xA84A, 0x6C86, 0xA859, 0x6C87, 0xCB56, 0x6C88, 0xA848, 0x6C89, 0xA849, 0x6C8A, 0xCD43, 0x6C8B, 0xCB4F, + 0x6C8C, 0xA850, 0x6C8D, 0xA85B, 0x6C8E, 0xCB5D, 0x6C8F, 0xCB50, 0x6C90, 0xA84E, 0x6C92, 0xA853, 0x6C93, 0xCCEE, 0x6C94, 0xA85C, + 0x6C95, 0xCB57, 0x6C96, 0xA852, 0x6C98, 0xA85D, 0x6C99, 0xA846, 0x6C9A, 0xCB54, 0x6C9B, 0xA84B, 0x6C9C, 0xCB58, 0x6C9D, 0xCD44, + 0x6CAB, 0xAA6A, 0x6CAC, 0xAA7A, 0x6CAD, 0xCCF5, 0x6CAE, 0xAA71, 0x6CB0, 0xCD4B, 0x6CB1, 0xAA62, 0x6CB3, 0xAA65, 0x6CB4, 0xCD42, + 0x6CB6, 0xCCF3, 0x6CB7, 0xCCF7, 0x6CB8, 0xAA6D, 0x6CB9, 0xAA6F, 0x6CBA, 0xCCFA, 0x6CBB, 0xAA76, 0x6CBC, 0xAA68, 0x6CBD, 0xAA66, + 0x6CBE, 0xAA67, 0x6CBF, 0xAA75, 0x6CC0, 0xCD47, 0x6CC1, 0xAA70, 0x6CC2, 0xCCF9, 0x6CC3, 0xCCFB, 0x6CC4, 0xAA6E, 0x6CC5, 0xAA73, + 0x6CC6, 0xCCFC, 0x6CC7, 0xCD4A, 0x6CC9, 0xAC75, 0x6CCA, 0xAA79, 0x6CCC, 0xAA63, 0x6CCD, 0xCD49, 0x6CCF, 0xCD4D, 0x6CD0, 0xCCF8, + 0x6CD1, 0xCD4F, 0x6CD2, 0xCD40, 0x6CD3, 0xAA6C, 0x6CD4, 0xCCF4, 0x6CD5, 0xAA6B, 0x6CD6, 0xAA7D, 0x6CD7, 0xAA72, 0x6CD9, 0xCCF2, + 0x6CDA, 0xCF75, 0x6CDB, 0xAA78, 0x6CDC, 0xAA7C, 0x6CDD, 0xCD41, 0x6CDE, 0xCD46, 0x6CE0, 0xAA7E, 0x6CE1, 0xAA77, 0x6CE2, 0xAA69, + 0x6CE3, 0xAA5F, 0x6CE5, 0xAA64, 0x6CE7, 0xCCF6, 0x6CE8, 0xAA60, 0x6CE9, 0xCD4E, 0x6CEB, 0xCCF0, 0x6CEC, 0xCCEF, 0x6CED, 0xCCFD, + 0x6CEE, 0xCCF1, 0x6CEF, 0xAA7B, 0x6CF0, 0xAEF5, 0x6CF1, 0xAA74, 0x6CF2, 0xCCFE, 0x6CF3, 0xAA61, 0x6CF5, 0xACA6, 0x6CF9, 0xCD4C, + 0x6D00, 0xCF7C, 0x6D01, 0xCFA1, 0x6D03, 0xCFA4, 0x6D04, 0xCF77, 0x6D07, 0xCFA7, 0x6D08, 0xCFAA, 0x6D09, 0xCFAC, 0x6D0A, 0xCF74, + 0x6D0B, 0xAC76, 0x6D0C, 0xAC7B, 0x6D0D, 0xD249, 0x6D0E, 0xACAD, 0x6D0F, 0xCFA5, 0x6D10, 0xCFAD, 0x6D11, 0xCF7B, 0x6D12, 0xCF73, + 0x6D16, 0xD264, 0x6D17, 0xAC7E, 0x6D18, 0xCFA2, 0x6D19, 0xCF78, 0x6D1A, 0xCF7A, 0x6D1B, 0xACA5, 0x6D1D, 0xCF7D, 0x6D1E, 0xAC7D, + 0x6D1F, 0xCF70, 0x6D20, 0xCFA8, 0x6D22, 0xCFAB, 0x6D25, 0xAC7A, 0x6D27, 0xACA8, 0x6D28, 0xCF6D, 0x6D29, 0xACAA, 0x6D2A, 0xAC78, + 0x6D2B, 0xACAE, 0x6D2C, 0xCFA9, 0x6D2D, 0xCF6F, 0x6D2E, 0xACAB, 0x6D2F, 0xD25E, 0x6D30, 0xCD48, 0x6D31, 0xAC7C, 0x6D32, 0xAC77, + 0x6D33, 0xCF76, 0x6D34, 0xCF6E, 0x6D35, 0xACAC, 0x6D36, 0xACA4, 0x6D37, 0xCFA3, 0x6D38, 0xACA9, 0x6D39, 0xACA7, 0x6D3A, 0xCF79, + 0x6D3B, 0xACA1, 0x6D3C, 0xCF71, 0x6D3D, 0xACA2, 0x6D3E, 0xACA3, 0x6D3F, 0xCF72, 0x6D40, 0xCFA6, 0x6D41, 0xAC79, 0x6D42, 0xCF7E, + 0x6D58, 0xD24C, 0x6D59, 0xAEFD, 0x6D5A, 0xAF43, 0x6D5E, 0xD255, 0x6D5F, 0xD25B, 0x6D60, 0xD257, 0x6D61, 0xD24A, 0x6D62, 0xD24D, + 0x6D63, 0xD246, 0x6D64, 0xD247, 0x6D65, 0xAF4A, 0x6D66, 0xAEFA, 0x6D67, 0xD256, 0x6D68, 0xD25F, 0x6D69, 0xAF45, 0x6D6A, 0xAEF6, + 0x6D6C, 0xAF40, 0x6D6D, 0xD24E, 0x6D6E, 0xAF42, 0x6D6F, 0xD24F, 0x6D70, 0xD259, 0x6D74, 0xAF44, 0x6D75, 0xD268, 0x6D76, 0xD248, + 0x6D77, 0xAEFC, 0x6D78, 0xAEFB, 0x6D79, 0xAF48, 0x6D7A, 0xD245, 0x6D7B, 0xD266, 0x6D7C, 0xD25A, 0x6D7D, 0xD267, 0x6D7E, 0xD261, + 0x6D7F, 0xD253, 0x6D80, 0xD262, 0x6D82, 0xD25C, 0x6D83, 0xD265, 0x6D84, 0xD263, 0x6D85, 0xAF49, 0x6D86, 0xD254, 0x6D87, 0xAEF9, + 0x6D88, 0xAEF8, 0x6D89, 0xAF41, 0x6D8A, 0xAF47, 0x6D8B, 0xD260, 0x6D8C, 0xAF46, 0x6D8D, 0xD251, 0x6D8E, 0xB243, 0x6D90, 0xD269, + 0x6D91, 0xD250, 0x6D92, 0xD24B, 0x6D93, 0xAEFE, 0x6D94, 0xAF4B, 0x6D95, 0xAEF7, 0x6D97, 0xD258, 0x6D98, 0xD25D, 0x6DAA, 0xB265, + 0x6DAB, 0xD5E1, 0x6DAC, 0xD5E5, 0x6DAE, 0xB252, 0x6DAF, 0xB250, 0x6DB2, 0xB247, 0x6DB3, 0xD5E3, 0x6DB4, 0xD5E2, 0x6DB5, 0xB25B, + 0x6DB7, 0xD5E8, 0x6DB8, 0xB255, 0x6DBA, 0xD5FA, 0x6DBB, 0xD647, 0x6DBC, 0xB244, 0x6DBD, 0xD5F7, 0x6DBE, 0xD5F0, 0x6DBF, 0xB267, + 0x6DC0, 0xD5E0, 0x6DC2, 0xD5FC, 0x6DC4, 0xB264, 0x6DC5, 0xB258, 0x6DC6, 0xB263, 0x6DC7, 0xB24E, 0x6DC8, 0xD5EC, 0x6DC9, 0xD5FE, + 0x6DCA, 0xD5F6, 0x6DCB, 0xB24F, 0x6DCC, 0xB249, 0x6DCD, 0xD645, 0x6DCF, 0xD5FD, 0x6DD0, 0xD640, 0x6DD1, 0xB251, 0x6DD2, 0xB259, + 0x6DD3, 0xD642, 0x6DD4, 0xD5EA, 0x6DD5, 0xD5FB, 0x6DD6, 0xD5EF, 0x6DD7, 0xD644, 0x6DD8, 0xB25E, 0x6DD9, 0xB246, 0x6DDA, 0xB25C, + 0x6DDB, 0xD5F4, 0x6DDC, 0xD5F2, 0x6DDD, 0xD5F3, 0x6DDE, 0xB253, 0x6DDF, 0xD5EE, 0x6DE0, 0xD5ED, 0x6DE1, 0xB248, 0x6DE2, 0xD5E7, + 0x6DE3, 0xD646, 0x6DE4, 0xB24A, 0x6DE5, 0xD5F1, 0x6DE6, 0xB268, 0x6DE8, 0xB262, 0x6DE9, 0xD5E6, 0x6DEA, 0xB25F, 0x6DEB, 0xB25D, + 0x6DEC, 0xB266, 0x6DED, 0xD5F8, 0x6DEE, 0xB261, 0x6DEF, 0xD252, 0x6DF0, 0xD5F9, 0x6DF1, 0xB260, 0x6DF2, 0xD641, 0x6DF3, 0xB245, + 0x6DF4, 0xD5F5, 0x6DF5, 0xB257, 0x6DF6, 0xD5E9, 0x6DF7, 0xB256, 0x6DF9, 0xB254, 0x6DFA, 0xB24C, 0x6DFB, 0xB24B, 0x6DFC, 0xD9E7, + 0x6DFD, 0xD643, 0x6E00, 0xD5EB, 0x6E03, 0xD9FC, 0x6E05, 0xB24D, 0x6E19, 0xB541, 0x6E1A, 0xB25A, 0x6E1B, 0xB4EE, 0x6E1C, 0xD9F6, + 0x6E1D, 0xB4FC, 0x6E1F, 0xD9EA, 0x6E20, 0xB4EB, 0x6E21, 0xB4E7, 0x6E22, 0xDA49, 0x6E23, 0xB4ED, 0x6E24, 0xB4F1, 0x6E25, 0xB4EC, + 0x6E26, 0xB4F5, 0x6E27, 0xDA4D, 0x6E28, 0xDA44, 0x6E2B, 0xD9F1, 0x6E2C, 0xB4FA, 0x6E2D, 0xB4F4, 0x6E2E, 0xD9FD, 0x6E2F, 0xB4E4, + 0x6E30, 0xDA4A, 0x6E31, 0xDA43, 0x6E32, 0xB4E8, 0x6E33, 0xD9F7, 0x6E34, 0xB4F7, 0x6E35, 0xDA55, 0x6E36, 0xDA56, 0x6E38, 0xB4E5, + 0x6E39, 0xDA48, 0x6E3A, 0xB4F9, 0x6E3B, 0xD9FB, 0x6E3C, 0xD9ED, 0x6E3D, 0xD9EE, 0x6E3E, 0xB4FD, 0x6E3F, 0xD9F2, 0x6E40, 0xD9F9, + 0x6E41, 0xD9F3, 0x6E43, 0xB4FB, 0x6E44, 0xB544, 0x6E45, 0xD9EF, 0x6E46, 0xD9E8, 0x6E47, 0xD9E9, 0x6E49, 0xD9EB, 0x6E4A, 0xB4EA, + 0x6E4B, 0xD9F8, 0x6E4D, 0xB4F8, 0x6E4E, 0xB542, 0x6E51, 0xD9FA, 0x6E52, 0xDA53, 0x6E53, 0xDA4B, 0x6E54, 0xB4E6, 0x6E55, 0xDA51, + 0x6E56, 0xB4F2, 0x6E58, 0xB4F0, 0x6E5A, 0xDA57, 0x6E5B, 0xB4EF, 0x6E5C, 0xDA41, 0x6E5D, 0xD9F4, 0x6E5E, 0xD9FE, 0x6E5F, 0xB547, + 0x6E60, 0xDA45, 0x6E61, 0xDA42, 0x6E62, 0xD9F0, 0x6E63, 0xB543, 0x6E64, 0xDA4F, 0x6E65, 0xDA4C, 0x6E66, 0xDA54, 0x6E67, 0xB4E9, + 0x6E68, 0xDA40, 0x6E69, 0xB546, 0x6E6B, 0xDA47, 0x6E6E, 0xB4F3, 0x6E6F, 0xB4F6, 0x6E71, 0xDA46, 0x6E72, 0xB545, 0x6E73, 0xD9F5, + 0x6E74, 0xD5E4, 0x6E77, 0xDA50, 0x6E78, 0xDA4E, 0x6E79, 0xDA52, 0x6E88, 0xD9EC, 0x6E89, 0xB540, 0x6E8D, 0xDE61, 0x6E8E, 0xDE60, + 0x6E8F, 0xDE46, 0x6E90, 0xB7BD, 0x6E92, 0xDE5F, 0x6E93, 0xDE49, 0x6E94, 0xDE4A, 0x6E96, 0xB7C7, 0x6E97, 0xDE68, 0x6E98, 0xB7C2, + 0x6E99, 0xDE5E, 0x6E9B, 0xDE43, 0x6E9C, 0xB7C8, 0x6E9D, 0xB7BE, 0x6E9E, 0xDE52, 0x6E9F, 0xDE48, 0x6EA0, 0xDE4B, 0x6EA1, 0xDE63, + 0x6EA2, 0xB7B8, 0x6EA3, 0xDE6A, 0x6EA4, 0xDE62, 0x6EA5, 0xB7C1, 0x6EA6, 0xDE57, 0x6EA7, 0xB7CC, 0x6EAA, 0xB7CB, 0x6EAB, 0xB7C5, + 0x6EAE, 0xDE69, 0x6EAF, 0xB7B9, 0x6EB0, 0xDE55, 0x6EB1, 0xDE4C, 0x6EB2, 0xDE59, 0x6EB3, 0xDE65, 0x6EB4, 0xB7CD, 0x6EB6, 0xB7BB, + 0x6EB7, 0xDE54, 0x6EB9, 0xDE4D, 0x6EBA, 0xB7C4, 0x6EBC, 0xB7C3, 0x6EBD, 0xDE50, 0x6EBE, 0xDE5A, 0x6EBF, 0xDE64, 0x6EC0, 0xDE47, + 0x6EC1, 0xDE51, 0x6EC2, 0xB7BC, 0x6EC3, 0xDE5B, 0x6EC4, 0xB7C9, 0x6EC5, 0xB7C0, 0x6EC6, 0xDE4E, 0x6EC7, 0xB7BF, 0x6EC8, 0xDE45, + 0x6EC9, 0xDE53, 0x6ECA, 0xDE67, 0x6ECB, 0xB4FE, 0x6ECC, 0xBAB0, 0x6ECD, 0xDE56, 0x6ECE, 0xE26C, 0x6ECF, 0xDE58, 0x6ED0, 0xDE66, + 0x6ED1, 0xB7C6, 0x6ED2, 0xDE4F, 0x6ED3, 0xB7BA, 0x6ED4, 0xB7CA, 0x6ED5, 0xBCF0, 0x6ED6, 0xDE44, 0x6ED8, 0xDE5D, 0x6EDC, 0xDE5C, + 0x6EEB, 0xE2AA, 0x6EEC, 0xBAAD, 0x6EED, 0xE27D, 0x6EEE, 0xE2A4, 0x6EEF, 0xBAA2, 0x6EF1, 0xE26E, 0x6EF2, 0xBAAF, 0x6EF4, 0xBA77, + 0x6EF5, 0xE26D, 0x6EF6, 0xE2B0, 0x6EF7, 0xBAB1, 0x6EF8, 0xE271, 0x6EF9, 0xE2A3, 0x6EFB, 0xE273, 0x6EFC, 0xE2B3, 0x6EFD, 0xE2AF, + 0x6EFE, 0xBA75, 0x6EFF, 0xBAA1, 0x6F00, 0xE653, 0x6F01, 0xBAAE, 0x6F02, 0xBA7D, 0x6F03, 0xE26F, 0x6F05, 0xE2AE, 0x6F06, 0xBAA3, + 0x6F07, 0xE2AB, 0x6F08, 0xE2B8, 0x6F09, 0xE275, 0x6F0A, 0xE27E, 0x6F0D, 0xE2B6, 0x6F0E, 0xE2AC, 0x6F0F, 0xBA7C, 0x6F12, 0xE27C, + 0x6F13, 0xBA76, 0x6F14, 0xBA74, 0x6F15, 0xBAA8, 0x6F18, 0xE27A, 0x6F19, 0xE277, 0x6F1A, 0xE278, 0x6F1C, 0xE2B2, 0x6F1E, 0xE2B7, + 0x6F1F, 0xE2B5, 0x6F20, 0xBA7A, 0x6F21, 0xE2B9, 0x6F22, 0xBA7E, 0x6F23, 0xBAA7, 0x6F25, 0xE270, 0x6F26, 0xE5FA, 0x6F27, 0xE279, + 0x6F29, 0xBA78, 0x6F2A, 0xBAAC, 0x6F2B, 0xBAA9, 0x6F2C, 0xBA7B, 0x6F2D, 0xE2A5, 0x6F2E, 0xE274, 0x6F2F, 0xBAAA, 0x6F30, 0xE2A7, + 0x6F31, 0xBAA4, 0x6F32, 0xBAA6, 0x6F33, 0xBA73, 0x6F35, 0xE2A9, 0x6F36, 0xE2A1, 0x6F37, 0xE272, 0x6F38, 0xBAA5, 0x6F39, 0xE2B1, + 0x6F3A, 0xE2B4, 0x6F3B, 0xE27B, 0x6F3C, 0xE2A8, 0x6F3E, 0xBA79, 0x6F3F, 0xBCDF, 0x6F40, 0xE2A6, 0x6F41, 0xE5F9, 0x6F43, 0xE2AD, + 0x6F4E, 0xE276, 0x6F4F, 0xE644, 0x6F50, 0xE64E, 0x6F51, 0xBCE2, 0x6F52, 0xE64D, 0x6F53, 0xE659, 0x6F54, 0xBCE4, 0x6F55, 0xE64B, + 0x6F57, 0xE64F, 0x6F58, 0xBCEF, 0x6F5A, 0xE646, 0x6F5B, 0xBCE7, 0x6F5D, 0xE652, 0x6F5E, 0xE9F0, 0x6F5F, 0xBCF3, 0x6F60, 0xBCF2, + 0x6F61, 0xE654, 0x6F62, 0xE643, 0x6F63, 0xE65E, 0x6F64, 0xBCED, 0x6F66, 0xBCE3, 0x6F67, 0xE657, 0x6F69, 0xE65B, 0x6F6A, 0xE660, + 0x6F6B, 0xE655, 0x6F6C, 0xE649, 0x6F6D, 0xBCE6, 0x6F6E, 0xBCE9, 0x6F6F, 0xBCF1, 0x6F70, 0xBCEC, 0x6F72, 0xE64C, 0x6F73, 0xE2A2, + 0x6F76, 0xE648, 0x6F77, 0xE65F, 0x6F78, 0xBCE8, 0x6F7A, 0xBCEB, 0x6F7B, 0xE661, 0x6F7C, 0xBCE0, 0x6F7D, 0xE656, 0x6F7E, 0xE5FB, + 0x6F7F, 0xE65C, 0x6F80, 0xC0DF, 0x6F82, 0xE64A, 0x6F84, 0xBCE1, 0x6F85, 0xE645, 0x6F86, 0xBCE5, 0x6F87, 0xE5FC, 0x6F88, 0xBAAB, + 0x6F89, 0xE641, 0x6F8B, 0xE65A, 0x6F8C, 0xE642, 0x6F8D, 0xE640, 0x6F8E, 0xBCEA, 0x6F90, 0xE658, 0x6F92, 0xE5FE, 0x6F93, 0xE651, + 0x6F94, 0xE650, 0x6F95, 0xE65D, 0x6F96, 0xE647, 0x6F97, 0xBCEE, 0x6F9E, 0xE9F3, 0x6FA0, 0xBF49, 0x6FA1, 0xBEFE, 0x6FA2, 0xEA40, + 0x6FA3, 0xE9EB, 0x6FA4, 0xBF41, 0x6FA5, 0xE9F7, 0x6FA6, 0xBF48, 0x6FA7, 0xBF43, 0x6FA8, 0xE9F5, 0x6FA9, 0xED4F, 0x6FAA, 0xE9FB, + 0x6FAB, 0xEA42, 0x6FAC, 0xE9FA, 0x6FAD, 0xE9E9, 0x6FAE, 0xE9F8, 0x6FAF, 0xEA44, 0x6FB0, 0xEA46, 0x6FB1, 0xBEFD, 0x6FB2, 0xEA45, + 0x6FB3, 0xBF44, 0x6FB4, 0xBF4A, 0x6FB6, 0xBF47, 0x6FB8, 0xE9FE, 0x6FB9, 0xBF46, 0x6FBA, 0xE9F9, 0x6FBC, 0xE9ED, 0x6FBD, 0xE9F2, + 0x6FBF, 0xE9FD, 0x6FC0, 0xBF45, 0x6FC1, 0xBF42, 0x6FC2, 0xBEFC, 0x6FC3, 0xBF40, 0x6FC4, 0xE9F1, 0x6FC6, 0xE5FD, 0x6FC7, 0xE9EC, + 0x6FC8, 0xE9EF, 0x6FC9, 0xEA41, 0x6FCA, 0xE9F4, 0x6FCB, 0xE9EA, 0x6FCC, 0xED4E, 0x6FCD, 0xEA43, 0x6FCE, 0xE9EE, 0x6FCF, 0xE9FC, + 0x6FD4, 0xED51, 0x6FD5, 0xC0E3, 0x6FD8, 0xC0D7, 0x6FDB, 0xC0DB, 0x6FDC, 0xED53, 0x6FDD, 0xED59, 0x6FDE, 0xED57, 0x6FDF, 0xC0D9, + 0x6FE0, 0xC0DA, 0x6FE1, 0xC0E1, 0x6FE2, 0xED5A, 0x6FE3, 0xED52, 0x6FE4, 0xC0DC, 0x6FE6, 0xED56, 0x6FE7, 0xED55, 0x6FE8, 0xED5B, + 0x6FE9, 0xC0E2, 0x6FEB, 0xC0DD, 0x6FEC, 0xC0E0, 0x6FED, 0xED54, 0x6FEE, 0xC0E4, 0x6FEF, 0xC0DE, 0x6FF0, 0xC0E5, 0x6FF1, 0xC0D8, + 0x6FF2, 0xED58, 0x6FF4, 0xED50, 0x6FF7, 0xEFF7, 0x6FFA, 0xC271, 0x6FFB, 0xEFF4, 0x6FFC, 0xEFF6, 0x6FFE, 0xC26F, 0x6FFF, 0xEFF2, + 0x7000, 0xEFF3, 0x7001, 0xEFEE, 0x7004, 0xE9F6, 0x7005, 0xEFEF, 0x7006, 0xC270, 0x7007, 0xEFEB, 0x7009, 0xC26D, 0x700A, 0xEFF8, + 0x700B, 0xC26E, 0x700C, 0xEFEC, 0x700D, 0xEFED, 0x700E, 0xEFF1, 0x700F, 0xC273, 0x7011, 0xC272, 0x7014, 0xEFF0, 0x7015, 0xC378, + 0x7016, 0xF25F, 0x7017, 0xF265, 0x7018, 0xC379, 0x7019, 0xF25C, 0x701A, 0xC376, 0x701B, 0xC373, 0x701C, 0xF267, 0x701D, 0xC377, + 0x701F, 0xC374, 0x7020, 0xF25E, 0x7021, 0xF261, 0x7022, 0xF262, 0x7023, 0xF263, 0x7024, 0xF266, 0x7026, 0xEFF5, 0x7027, 0xF25D, + 0x7028, 0xC375, 0x7029, 0xF264, 0x702A, 0xF268, 0x702B, 0xF260, 0x702F, 0xF45D, 0x7030, 0xC46A, 0x7031, 0xF460, 0x7032, 0xC46B, + 0x7033, 0xF468, 0x7034, 0xF45F, 0x7035, 0xF45C, 0x7037, 0xF45E, 0x7038, 0xF462, 0x7039, 0xF465, 0x703A, 0xF464, 0x703B, 0xF467, + 0x703C, 0xF45B, 0x703E, 0xC469, 0x703F, 0xF463, 0x7040, 0xF466, 0x7041, 0xF469, 0x7042, 0xF461, 0x7043, 0xF5D3, 0x7044, 0xF5D4, + 0x7045, 0xF5D8, 0x7046, 0xF5D9, 0x7048, 0xF5D6, 0x7049, 0xF5D7, 0x704A, 0xF5D5, 0x704C, 0xC4E9, 0x7051, 0xC578, 0x7052, 0xF6EB, + 0x7055, 0xF6E8, 0x7056, 0xF6E9, 0x7057, 0xF6EA, 0x7058, 0xC579, 0x705A, 0xF7E5, 0x705B, 0xF7E4, 0x705D, 0xF8AF, 0x705E, 0xC5F4, + 0x705F, 0xF8AD, 0x7060, 0xF8B0, 0x7061, 0xF8AE, 0x7062, 0xF8F5, 0x7063, 0xC657, 0x7064, 0xC665, 0x7065, 0xF9A3, 0x7066, 0xF96C, + 0x7068, 0xF9A2, 0x7069, 0xF9D0, 0x706A, 0xF9D1, 0x706B, 0xA4F5, 0x7070, 0xA6C7, 0x7071, 0xCA41, 0x7074, 0xCB5E, 0x7076, 0xA85F, + 0x7078, 0xA862, 0x707A, 0xCB5F, 0x707C, 0xA860, 0x707D, 0xA861, 0x7082, 0xCD58, 0x7083, 0xCD5A, 0x7084, 0xCD55, 0x7085, 0xCD52, + 0x7086, 0xCD54, 0x708A, 0xAAA4, 0x708E, 0xAAA2, 0x7091, 0xCD56, 0x7092, 0xAAA3, 0x7093, 0xCD53, 0x7094, 0xCD50, 0x7095, 0xAAA1, + 0x7096, 0xCD57, 0x7098, 0xCD51, 0x7099, 0xAAA5, 0x709A, 0xCD59, 0x709F, 0xCFAF, 0x70A1, 0xCFB3, 0x70A4, 0xACB7, 0x70A9, 0xCFB6, + 0x70AB, 0xACAF, 0x70AC, 0xACB2, 0x70AD, 0xACB4, 0x70AE, 0xACB6, 0x70AF, 0xACB3, 0x70B0, 0xCFB2, 0x70B1, 0xCFB1, 0x70B3, 0xACB1, + 0x70B4, 0xCFB4, 0x70B5, 0xCFB5, 0x70B7, 0xCFAE, 0x70B8, 0xACB5, 0x70BA, 0xACB0, 0x70BE, 0xCFB0, 0x70C5, 0xD277, 0x70C6, 0xD278, + 0x70C7, 0xD279, 0x70C8, 0xAF50, 0x70CA, 0xAF4C, 0x70CB, 0xD26E, 0x70CD, 0xD276, 0x70CE, 0xD27B, 0x70CF, 0xAF51, 0x70D1, 0xD26C, + 0x70D2, 0xD272, 0x70D3, 0xD26B, 0x70D4, 0xD275, 0x70D7, 0xD271, 0x70D8, 0xAF4D, 0x70D9, 0xAF4F, 0x70DA, 0xD27A, 0x70DC, 0xD26A, + 0x70DD, 0xD26D, 0x70DE, 0xD273, 0x70E0, 0xD274, 0x70E1, 0xD27C, 0x70E2, 0xD270, 0x70E4, 0xAF4E, 0x70EF, 0xB26D, 0x70F0, 0xD64E, + 0x70F3, 0xD650, 0x70F4, 0xD64C, 0x70F6, 0xD658, 0x70F7, 0xD64A, 0x70F8, 0xD657, 0x70F9, 0xB269, 0x70FA, 0xD648, 0x70FB, 0xDA5B, + 0x70FC, 0xD652, 0x70FD, 0xB26C, 0x70FF, 0xD653, 0x7100, 0xD656, 0x7102, 0xD65A, 0x7104, 0xD64F, 0x7106, 0xD654, 0x7109, 0xB26A, + 0x710A, 0xB26B, 0x710B, 0xD659, 0x710C, 0xD64D, 0x710D, 0xD649, 0x710E, 0xD65B, 0x7110, 0xD651, 0x7113, 0xD655, 0x7117, 0xD64B, + 0x7119, 0xB548, 0x711A, 0xB549, 0x711B, 0xDA65, 0x711C, 0xB54F, 0x711E, 0xDA59, 0x711F, 0xDA62, 0x7120, 0xDA58, 0x7121, 0xB54C, + 0x7122, 0xDA60, 0x7123, 0xDA5E, 0x7125, 0xDA5F, 0x7126, 0xB54A, 0x7128, 0xDA63, 0x712E, 0xDA5C, 0x712F, 0xDA5A, 0x7130, 0xB54B, + 0x7131, 0xDA5D, 0x7132, 0xDA61, 0x7136, 0xB54D, 0x713A, 0xDA64, 0x7141, 0xDE70, 0x7142, 0xDE77, 0x7143, 0xDE79, 0x7144, 0xDEA1, + 0x7146, 0xB7DA, 0x7147, 0xDE6B, 0x7149, 0xB7D2, 0x714B, 0xDE7A, 0x714C, 0xB7D7, 0x714D, 0xDEA2, 0x714E, 0xB7CE, 0x7150, 0xDE7D, + 0x7152, 0xDE6D, 0x7153, 0xDE7E, 0x7154, 0xDE6C, 0x7156, 0xB7DC, 0x7158, 0xDE78, 0x7159, 0xB7CF, 0x715A, 0xDEA3, 0x715C, 0xB7D4, + 0x715D, 0xDE71, 0x715E, 0xB7D9, 0x715F, 0xDE7C, 0x7160, 0xDE6F, 0x7161, 0xDE76, 0x7162, 0xDE72, 0x7163, 0xDE6E, 0x7164, 0xB7D1, + 0x7165, 0xB7D8, 0x7166, 0xB7D6, 0x7167, 0xB7D3, 0x7168, 0xB7DB, 0x7169, 0xB7D0, 0x716A, 0xDE75, 0x716C, 0xB7D5, 0x716E, 0xB54E, + 0x7170, 0xDE7B, 0x7172, 0xDE73, 0x7178, 0xDE74, 0x717B, 0xE2C1, 0x717D, 0xBAB4, 0x7180, 0xE2BD, 0x7181, 0xE2C3, 0x7182, 0xE2BF, + 0x7184, 0xBAB6, 0x7185, 0xE2BE, 0x7186, 0xE2C2, 0x7187, 0xE2BA, 0x7189, 0xE2BC, 0x718A, 0xBAB5, 0x718F, 0xE2C0, 0x7190, 0xE2BB, + 0x7192, 0xBAB7, 0x7194, 0xBAB2, 0x7197, 0xE2C4, 0x7199, 0xBAB3, 0x719A, 0xE667, 0x719B, 0xE664, 0x719C, 0xE670, 0x719D, 0xE66A, + 0x719E, 0xE66C, 0x719F, 0xBCF4, 0x71A0, 0xE666, 0x71A1, 0xE66E, 0x71A4, 0xE66D, 0x71A5, 0xE66B, 0x71A7, 0xE671, 0x71A8, 0xBCF7, + 0x71A9, 0xE668, 0x71AA, 0xE66F, 0x71AC, 0xBCF5, 0x71AF, 0xE663, 0x71B0, 0xE665, 0x71B1, 0xBCF6, 0x71B2, 0xE662, 0x71B3, 0xE672, + 0x71B5, 0xE669, 0x71B8, 0xEA4A, 0x71B9, 0xBF51, 0x71BC, 0xEA55, 0x71BD, 0xEA53, 0x71BE, 0xBF4B, 0x71BF, 0xEA49, 0x71C0, 0xEA4C, + 0x71C1, 0xEA4D, 0x71C2, 0xEA48, 0x71C3, 0xBF55, 0x71C4, 0xBF56, 0x71C5, 0xEA47, 0x71C6, 0xEA56, 0x71C7, 0xEA51, 0x71C8, 0xBF4F, + 0x71C9, 0xBF4C, 0x71CA, 0xEA50, 0x71CB, 0xEA4E, 0x71CE, 0xBF52, 0x71CF, 0xEA52, 0x71D0, 0xBF4D, 0x71D2, 0xBF4E, 0x71D4, 0xEA4F, + 0x71D5, 0xBF50, 0x71D6, 0xEA4B, 0x71D8, 0xEA54, 0x71D9, 0xBF53, 0x71DA, 0xEA57, 0x71DB, 0xEA58, 0x71DC, 0xBF54, 0x71DF, 0xC0E7, + 0x71E0, 0xC0EE, 0x71E1, 0xED5C, 0x71E2, 0xED62, 0x71E4, 0xED60, 0x71E5, 0xC0EA, 0x71E6, 0xC0E9, 0x71E7, 0xC0E6, 0x71E8, 0xED5E, + 0x71EC, 0xC0EC, 0x71ED, 0xC0EB, 0x71EE, 0xC0E8, 0x71F0, 0xED61, 0x71F1, 0xED5D, 0x71F2, 0xED5F, 0x71F4, 0xC0ED, 0x71F8, 0xC277, + 0x71F9, 0xEFFB, 0x71FB, 0xC274, 0x71FC, 0xC275, 0x71FD, 0xEFFD, 0x71FE, 0xC276, 0x71FF, 0xEFFA, 0x7201, 0xEFF9, 0x7202, 0xF26C, + 0x7203, 0xEFFC, 0x7205, 0xF26D, 0x7206, 0xC37A, 0x7207, 0xF26B, 0x720A, 0xF26A, 0x720C, 0xF269, 0x720D, 0xC37B, 0x7210, 0xC46C, + 0x7213, 0xF46A, 0x7214, 0xF46B, 0x7219, 0xF5DC, 0x721A, 0xF5DB, 0x721B, 0xC4EA, 0x721D, 0xF5DA, 0x721E, 0xF6EC, 0x721F, 0xF6ED, + 0x7222, 0xF7E6, 0x7223, 0xF8B1, 0x7226, 0xF8F6, 0x7227, 0xF9BC, 0x7228, 0xC679, 0x7229, 0xF9C6, 0x722A, 0xA4F6, 0x722C, 0xAAA6, + 0x722D, 0xAAA7, 0x7230, 0xACB8, 0x7235, 0xC0EF, 0x7236, 0xA4F7, 0x7238, 0xAAA8, 0x7239, 0xAF52, 0x723A, 0xB7DD, 0x723B, 0xA4F8, + 0x723D, 0xB26E, 0x723E, 0xBAB8, 0x723F, 0xC962, 0x7241, 0xCFB7, 0x7242, 0xD27D, 0x7244, 0xE2C5, 0x7246, 0xC0F0, 0x7247, 0xA4F9, + 0x7248, 0xAAA9, 0x7249, 0xCFB8, 0x724A, 0xCFB9, 0x724B, 0xDA66, 0x724C, 0xB550, 0x724F, 0xDEA4, 0x7252, 0xB7DE, 0x7253, 0xE2C6, + 0x7256, 0xBCF8, 0x7258, 0xC37C, 0x7259, 0xA4FA, 0x725A, 0xDA67, 0x725B, 0xA4FB, 0x725D, 0xA6C9, 0x725E, 0xCA42, 0x725F, 0xA6C8, + 0x7260, 0xA865, 0x7261, 0xA864, 0x7262, 0xA863, 0x7263, 0xCB60, 0x7267, 0xAAAA, 0x7269, 0xAAAB, 0x726A, 0xCD5B, 0x726C, 0xCFBA, + 0x726E, 0xCFBD, 0x726F, 0xACBA, 0x7270, 0xCFBB, 0x7272, 0xACB9, 0x7273, 0xCFBC, 0x7274, 0xACBB, 0x7276, 0xD2A2, 0x7277, 0xD2A1, + 0x7278, 0xD27E, 0x7279, 0xAF53, 0x727B, 0xD65D, 0x727C, 0xD65E, 0x727D, 0xB26F, 0x727E, 0xD65C, 0x727F, 0xD65F, 0x7280, 0xB552, + 0x7281, 0xB270, 0x7284, 0xB551, 0x7285, 0xDA6B, 0x7286, 0xDA6A, 0x7288, 0xDA68, 0x7289, 0xDA69, 0x728B, 0xDA6C, 0x728C, 0xDEA6, + 0x728D, 0xDEA5, 0x728E, 0xDEA9, 0x7290, 0xDEA8, 0x7291, 0xDEA7, 0x7292, 0xBAB9, 0x7293, 0xE2C9, 0x7295, 0xE2C8, 0x7296, 0xBABA, + 0x7297, 0xE2C7, 0x7298, 0xE673, 0x729A, 0xE674, 0x729B, 0xBCF9, 0x729D, 0xEA59, 0x729E, 0xEA5A, 0x72A1, 0xF272, 0x72A2, 0xC37D, + 0x72A3, 0xF271, 0x72A4, 0xF270, 0x72A5, 0xF26E, 0x72A6, 0xF26F, 0x72A7, 0xC4EB, 0x72A8, 0xF46C, 0x72A9, 0xF6EE, 0x72AA, 0xF8F7, + 0x72AC, 0xA4FC, 0x72AE, 0xC9A5, 0x72AF, 0xA5C7, 0x72B0, 0xC9A6, 0x72B4, 0xCA43, 0x72B5, 0xCA44, 0x72BA, 0xCB66, 0x72BD, 0xCB62, + 0x72BF, 0xCB61, 0x72C0, 0xAAAC, 0x72C1, 0xCB65, 0x72C2, 0xA867, 0x72C3, 0xCB63, 0x72C4, 0xA866, 0x72C5, 0xCB67, 0x72C6, 0xCB64, + 0x72C9, 0xCD5F, 0x72CA, 0xCFBE, 0x72CB, 0xCD5D, 0x72CC, 0xCD64, 0x72CE, 0xAAAD, 0x72D0, 0xAAB0, 0x72D1, 0xCD65, 0x72D2, 0xCD61, + 0x72D4, 0xCD62, 0x72D6, 0xCD5C, 0x72D7, 0xAAAF, 0x72D8, 0xCD5E, 0x72D9, 0xAAAE, 0x72DA, 0xCD63, 0x72DC, 0xCD60, 0x72DF, 0xCFC2, + 0x72E0, 0xACBD, 0x72E1, 0xACBE, 0x72E3, 0xCFC5, 0x72E4, 0xCFBF, 0x72E6, 0xCFC4, 0x72E8, 0xCFC0, 0x72E9, 0xACBC, 0x72EA, 0xCFC3, + 0x72EB, 0xCFC1, 0x72F3, 0xD2A8, 0x72F4, 0xD2A5, 0x72F6, 0xD2A7, 0x72F7, 0xAF58, 0x72F8, 0xAF57, 0x72F9, 0xAF55, 0x72FA, 0xD2A4, + 0x72FB, 0xD2A9, 0x72FC, 0xAF54, 0x72FD, 0xAF56, 0x72FE, 0xD2A6, 0x72FF, 0xD667, 0x7300, 0xD2A3, 0x7301, 0xD2AA, 0x7307, 0xD662, + 0x7308, 0xD666, 0x730A, 0xD665, 0x730B, 0xDA6E, 0x730C, 0xDA79, 0x730F, 0xD668, 0x7311, 0xD663, 0x7312, 0xDA6D, 0x7313, 0xB274, + 0x7316, 0xB273, 0x7317, 0xD661, 0x7318, 0xD664, 0x7319, 0xB275, 0x731B, 0xB272, 0x731C, 0xB271, 0x731D, 0xD660, 0x731E, 0xD669, + 0x7322, 0xDA70, 0x7323, 0xDA77, 0x7325, 0xB554, 0x7326, 0xDA76, 0x7327, 0xDA73, 0x7329, 0xB556, 0x732D, 0xDA75, 0x7330, 0xDA6F, + 0x7331, 0xDA71, 0x7332, 0xDA74, 0x7333, 0xDA72, 0x7334, 0xB555, 0x7335, 0xDA78, 0x7336, 0xB553, 0x7337, 0xB7DF, 0x733A, 0xDEAD, + 0x733B, 0xDEAC, 0x733C, 0xDEAA, 0x733E, 0xB7E2, 0x733F, 0xB7E1, 0x7340, 0xDEAE, 0x7342, 0xDEAB, 0x7343, 0xE2CA, 0x7344, 0xBABB, + 0x7345, 0xB7E0, 0x7349, 0xDEB0, 0x734A, 0xDEAF, 0x734C, 0xE2CD, 0x734D, 0xE2CB, 0x734E, 0xBCFA, 0x7350, 0xBABC, 0x7351, 0xE2CC, + 0x7352, 0xE676, 0x7357, 0xBCFB, 0x7358, 0xE675, 0x7359, 0xE67E, 0x735A, 0xE67D, 0x735B, 0xE67B, 0x735D, 0xE67A, 0x735E, 0xE677, + 0x735F, 0xE678, 0x7360, 0xE679, 0x7361, 0xE67C, 0x7362, 0xE6A1, 0x7365, 0xEA5F, 0x7366, 0xEA5C, 0x7367, 0xEA5D, 0x7368, 0xBF57, + 0x7369, 0xEA5B, 0x736A, 0xEA61, 0x736B, 0xEA60, 0x736C, 0xEA5E, 0x736E, 0xED64, 0x736F, 0xED65, 0x7370, 0xC0F1, 0x7372, 0xC0F2, + 0x7373, 0xED63, 0x7375, 0xC279, 0x7376, 0xEFFE, 0x7377, 0xC278, 0x7378, 0xC37E, 0x737A, 0xC3A1, 0x737B, 0xC46D, 0x737C, 0xF46E, + 0x737D, 0xF46D, 0x737E, 0xF5DD, 0x737F, 0xF6EF, 0x7380, 0xC57A, 0x7381, 0xF7E8, 0x7382, 0xF7E7, 0x7383, 0xF7E9, 0x7384, 0xA5C8, + 0x7385, 0xCFC6, 0x7386, 0xAF59, 0x7387, 0xB276, 0x7388, 0xD66A, 0x7389, 0xA5C9, 0x738A, 0xC9A7, 0x738B, 0xA4FD, 0x738E, 0xCA45, + 0x7392, 0xCB6C, 0x7393, 0xCB6A, 0x7394, 0xCB6B, 0x7395, 0xCB68, 0x7396, 0xA868, 0x7397, 0xCB69, 0x739D, 0xCD6D, 0x739F, 0xAAB3, + 0x73A0, 0xCD6B, 0x73A1, 0xCD67, 0x73A2, 0xCD6A, 0x73A4, 0xCD66, 0x73A5, 0xAAB5, 0x73A6, 0xCD69, 0x73A8, 0xAAB2, 0x73A9, 0xAAB1, + 0x73AB, 0xAAB4, 0x73AC, 0xCD6C, 0x73AD, 0xCD68, 0x73B2, 0xACC2, 0x73B3, 0xACC5, 0x73B4, 0xCFCE, 0x73B5, 0xCFCD, 0x73B6, 0xCFCC, + 0x73B7, 0xACBF, 0x73B8, 0xCFD5, 0x73B9, 0xCFCB, 0x73BB, 0xACC1, 0x73BC, 0xD2AF, 0x73BE, 0xCFD2, 0x73BF, 0xCFD0, 0x73C0, 0xACC4, + 0x73C2, 0xCFC8, 0x73C3, 0xCFD3, 0x73C5, 0xCFCA, 0x73C6, 0xCFD4, 0x73C7, 0xCFD1, 0x73C8, 0xCFC9, 0x73CA, 0xACC0, 0x73CB, 0xCFD6, + 0x73CC, 0xCFC7, 0x73CD, 0xACC3, 0x73D2, 0xD2B4, 0x73D3, 0xD2AB, 0x73D4, 0xD2B6, 0x73D6, 0xD2AE, 0x73D7, 0xD2B9, 0x73D8, 0xD2BA, + 0x73D9, 0xD2AC, 0x73DA, 0xD2B8, 0x73DB, 0xD2B5, 0x73DC, 0xD2B3, 0x73DD, 0xD2B7, 0x73DE, 0xAF5F, 0x73E0, 0xAF5D, 0x73E3, 0xD2B1, + 0x73E5, 0xD2AD, 0x73E7, 0xD2B0, 0x73E8, 0xD2BB, 0x73E9, 0xD2B2, 0x73EA, 0xAF5E, 0x73EB, 0xCFCF, 0x73ED, 0xAF5A, 0x73EE, 0xAF5C, + 0x73F4, 0xD678, 0x73F5, 0xD66D, 0x73F6, 0xD66B, 0x73F8, 0xD66C, 0x73FA, 0xD673, 0x73FC, 0xD674, 0x73FD, 0xD670, 0x73FE, 0xB27B, + 0x73FF, 0xD675, 0x7400, 0xD672, 0x7401, 0xD66F, 0x7403, 0xB279, 0x7404, 0xD66E, 0x7405, 0xB277, 0x7406, 0xB27A, 0x7407, 0xD671, + 0x7408, 0xD679, 0x7409, 0xAF5B, 0x740A, 0xB278, 0x740B, 0xD677, 0x740C, 0xD676, 0x740D, 0xB27C, 0x7416, 0xDA7E, 0x741A, 0xDAA1, + 0x741B, 0xB560, 0x741D, 0xDAA7, 0x7420, 0xDAA9, 0x7421, 0xDAA2, 0x7422, 0xB55A, 0x7423, 0xDAA6, 0x7424, 0xDAA5, 0x7425, 0xB55B, + 0x7426, 0xB561, 0x7428, 0xB562, 0x7429, 0xDAA8, 0x742A, 0xB558, 0x742B, 0xDA7D, 0x742C, 0xDA7B, 0x742D, 0xDAA3, 0x742E, 0xDA7A, + 0x742F, 0xB55F, 0x7430, 0xDA7C, 0x7431, 0xDAA4, 0x7432, 0xDAAA, 0x7433, 0xB559, 0x7434, 0xB55E, 0x7435, 0xB55C, 0x7436, 0xB55D, + 0x743A, 0xB557, 0x743F, 0xB7E9, 0x7440, 0xDEB7, 0x7441, 0xB7E8, 0x7442, 0xDEBB, 0x7444, 0xDEB1, 0x7446, 0xDEBC, 0x744A, 0xDEB2, + 0x744B, 0xDEB3, 0x744D, 0xDEBD, 0x744E, 0xDEBA, 0x744F, 0xDEB8, 0x7450, 0xDEB9, 0x7451, 0xDEB5, 0x7452, 0xDEB4, 0x7454, 0xDEBE, + 0x7455, 0xB7E5, 0x7457, 0xDEB6, 0x7459, 0xB7EA, 0x745A, 0xB7E4, 0x745B, 0xB7EB, 0x745C, 0xB7EC, 0x745E, 0xB7E7, 0x745F, 0xB7E6, + 0x7462, 0xE2CE, 0x7463, 0xBABE, 0x7464, 0xBABD, 0x7467, 0xE2D3, 0x7469, 0xBCFC, 0x746A, 0xBABF, 0x746D, 0xBAC1, 0x746E, 0xE2D4, + 0x746F, 0xB7E3, 0x7470, 0xBAC0, 0x7471, 0xE2D0, 0x7472, 0xE2D2, 0x7473, 0xE2CF, 0x7475, 0xE2D1, 0x7479, 0xE6AB, 0x747C, 0xE6AA, + 0x747D, 0xE6A7, 0x747E, 0xBD40, 0x747F, 0xEA62, 0x7480, 0xBD41, 0x7481, 0xE6A6, 0x7483, 0xBCFE, 0x7485, 0xE6A8, 0x7486, 0xE6A5, + 0x7487, 0xE6A2, 0x7488, 0xE6A9, 0x7489, 0xE6A3, 0x748A, 0xE6A4, 0x748B, 0xBCFD, 0x7490, 0xED69, 0x7492, 0xEA66, 0x7494, 0xEA65, + 0x7495, 0xEA67, 0x7497, 0xED66, 0x7498, 0xBF5A, 0x749A, 0xEA63, 0x749C, 0xBF58, 0x749E, 0xBF5C, 0x749F, 0xBF5B, 0x74A0, 0xEA64, + 0x74A1, 0xEA68, 0x74A3, 0xBF59, 0x74A5, 0xED6D, 0x74A6, 0xC0F5, 0x74A7, 0xC27A, 0x74A8, 0xC0F6, 0x74A9, 0xC0F3, 0x74AA, 0xED6A, + 0x74AB, 0xED68, 0x74AD, 0xED6B, 0x74AF, 0xED6E, 0x74B0, 0xC0F4, 0x74B1, 0xED6C, 0x74B2, 0xED67, 0x74B5, 0xF042, 0x74B6, 0xF045, + 0x74B7, 0xF275, 0x74B8, 0xF040, 0x74BA, 0xF46F, 0x74BB, 0xF046, 0x74BD, 0xC3A2, 0x74BE, 0xF044, 0x74BF, 0xC27B, 0x74C0, 0xF041, + 0x74C1, 0xF043, 0x74C2, 0xF047, 0x74C3, 0xF276, 0x74C5, 0xF274, 0x74CA, 0xC3A3, 0x74CB, 0xF273, 0x74CF, 0xC46E, 0x74D4, 0xC4ED, + 0x74D5, 0xF6F1, 0x74D6, 0xC4EC, 0x74D7, 0xF6F3, 0x74D8, 0xF6F0, 0x74D9, 0xF6F2, 0x74DA, 0xC5D0, 0x74DB, 0xF8B2, 0x74DC, 0xA5CA, + 0x74DD, 0xCD6E, 0x74DE, 0xD2BC, 0x74DF, 0xD2BD, 0x74E0, 0xB27D, 0x74E1, 0xDEBF, 0x74E2, 0xBF5D, 0x74E3, 0xC3A4, 0x74E4, 0xC57B, + 0x74E5, 0xF8B3, 0x74E6, 0xA5CB, 0x74E8, 0xCD6F, 0x74E9, 0xA260, 0x74EC, 0xCFD7, 0x74EE, 0xCFD8, 0x74F4, 0xD2BE, 0x74F5, 0xD2BF, + 0x74F6, 0xB27E, 0x74F7, 0xB2A1, 0x74FB, 0xDAAB, 0x74FD, 0xDEC2, 0x74FE, 0xDEC1, 0x74FF, 0xDEC0, 0x7500, 0xE2D5, 0x7502, 0xE2D6, + 0x7503, 0xE2D7, 0x7504, 0xBAC2, 0x7507, 0xE6AD, 0x7508, 0xE6AC, 0x750B, 0xEA69, 0x750C, 0xBF5E, 0x750D, 0xBF5F, 0x750F, 0xED72, + 0x7510, 0xED6F, 0x7511, 0xED70, 0x7512, 0xED71, 0x7513, 0xF049, 0x7514, 0xF048, 0x7515, 0xC27C, 0x7516, 0xF277, 0x7517, 0xF5DE, + 0x7518, 0xA5CC, 0x751A, 0xACC6, 0x751C, 0xB2A2, 0x751D, 0xDEC3, 0x751F, 0xA5CD, 0x7521, 0xD2C0, 0x7522, 0xB2A3, 0x7525, 0xB563, + 0x7526, 0xB564, 0x7528, 0xA5CE, 0x7529, 0xA5CF, 0x752A, 0xCA46, 0x752B, 0xA86A, 0x752C, 0xA869, 0x752D, 0xACC7, 0x752E, 0xCFD9, + 0x752F, 0xDAAC, 0x7530, 0xA5D0, 0x7531, 0xA5D1, 0x7532, 0xA5D2, 0x7533, 0xA5D3, 0x7537, 0xA86B, 0x7538, 0xA86C, 0x7539, 0xCB6E, + 0x753A, 0xCB6D, 0x753D, 0xAAB6, 0x753E, 0xCD72, 0x753F, 0xCD70, 0x7540, 0xCD71, 0x7547, 0xCFDA, 0x7548, 0xCFDB, 0x754B, 0xACCB, + 0x754C, 0xACC9, 0x754E, 0xACCA, 0x754F, 0xACC8, 0x7554, 0xAF60, 0x7559, 0xAF64, 0x755A, 0xAF63, 0x755B, 0xD2C1, 0x755C, 0xAF62, + 0x755D, 0xAF61, 0x755F, 0xD2C2, 0x7562, 0xB2A6, 0x7563, 0xD67B, 0x7564, 0xD67A, 0x7565, 0xB2A4, 0x7566, 0xB2A5, 0x756A, 0xB566, + 0x756B, 0xB565, 0x756C, 0xDAAE, 0x756F, 0xDAAD, 0x7570, 0xB2A7, 0x7576, 0xB7ED, 0x7577, 0xDEC5, 0x7578, 0xB7EE, 0x7579, 0xDEC4, + 0x757D, 0xE2D8, 0x757E, 0xE6AE, 0x757F, 0xBD42, 0x7580, 0xEA6A, 0x7584, 0xED73, 0x7586, 0xC3A6, 0x7587, 0xC3A5, 0x758A, 0xC57C, + 0x758B, 0xA5D4, 0x758C, 0xCD73, 0x758F, 0xB2A8, 0x7590, 0xE2D9, 0x7591, 0xBAC3, 0x7594, 0xCB6F, 0x7595, 0xCB70, 0x7598, 0xCD74, + 0x7599, 0xAAB8, 0x759A, 0xAAB9, 0x759D, 0xAAB7, 0x75A2, 0xACCF, 0x75A3, 0xACD0, 0x75A4, 0xACCD, 0x75A5, 0xACCE, 0x75A7, 0xCFDC, + 0x75AA, 0xCFDD, 0x75AB, 0xACCC, 0x75B0, 0xD2C3, 0x75B2, 0xAF68, 0x75B3, 0xAF69, 0x75B5, 0xB2AB, 0x75B6, 0xD2C9, 0x75B8, 0xAF6E, + 0x75B9, 0xAF6C, 0x75BA, 0xD2CA, 0x75BB, 0xD2C5, 0x75BC, 0xAF6B, 0x75BD, 0xAF6A, 0x75BE, 0xAF65, 0x75BF, 0xD2C8, 0x75C0, 0xD2C7, + 0x75C1, 0xD2C4, 0x75C2, 0xAF6D, 0x75C4, 0xD2C6, 0x75C5, 0xAF66, 0x75C7, 0xAF67, 0x75CA, 0xB2AC, 0x75CB, 0xD6A1, 0x75CC, 0xD6A2, + 0x75CD, 0xB2AD, 0x75CE, 0xD67C, 0x75CF, 0xD67E, 0x75D0, 0xD6A4, 0x75D1, 0xD6A3, 0x75D2, 0xD67D, 0x75D4, 0xB2A9, 0x75D5, 0xB2AA, + 0x75D7, 0xDAB6, 0x75D8, 0xB56B, 0x75D9, 0xB56A, 0x75DA, 0xDAB0, 0x75DB, 0xB568, 0x75DD, 0xDAB3, 0x75DE, 0xB56C, 0x75DF, 0xDAB4, + 0x75E0, 0xB56D, 0x75E1, 0xDAB1, 0x75E2, 0xB567, 0x75E3, 0xB569, 0x75E4, 0xDAB5, 0x75E6, 0xDAB2, 0x75E7, 0xDAAF, 0x75ED, 0xDED2, + 0x75EF, 0xDEC7, 0x75F0, 0xB7F0, 0x75F1, 0xB7F3, 0x75F2, 0xB7F2, 0x75F3, 0xB7F7, 0x75F4, 0xB7F6, 0x75F5, 0xDED3, 0x75F6, 0xDED1, + 0x75F7, 0xDECA, 0x75F8, 0xDECE, 0x75F9, 0xDECD, 0x75FA, 0xB7F4, 0x75FB, 0xDED0, 0x75FC, 0xDECC, 0x75FD, 0xDED4, 0x75FE, 0xDECB, + 0x75FF, 0xB7F5, 0x7600, 0xB7EF, 0x7601, 0xB7F1, 0x7603, 0xDEC9, 0x7608, 0xE2DB, 0x7609, 0xBAC7, 0x760A, 0xE2DF, 0x760B, 0xBAC6, + 0x760C, 0xE2DC, 0x760D, 0xBAC5, 0x760F, 0xDEC8, 0x7610, 0xDECF, 0x7611, 0xE2DE, 0x7613, 0xBAC8, 0x7614, 0xE2E0, 0x7615, 0xE2DD, + 0x7616, 0xE2DA, 0x7619, 0xE6B1, 0x761A, 0xE6B5, 0x761B, 0xE6B7, 0x761C, 0xE6B3, 0x761D, 0xE6B2, 0x761E, 0xE6B0, 0x761F, 0xBD45, + 0x7620, 0xBD43, 0x7621, 0xBD48, 0x7622, 0xBD49, 0x7623, 0xE6B4, 0x7624, 0xBD46, 0x7625, 0xE6AF, 0x7626, 0xBD47, 0x7627, 0xBAC4, + 0x7628, 0xE6B6, 0x7629, 0xBD44, 0x762D, 0xEA6C, 0x762F, 0xEA6B, 0x7630, 0xEA73, 0x7631, 0xEA6D, 0x7632, 0xEA72, 0x7633, 0xEA6F, + 0x7634, 0xBF60, 0x7635, 0xEA71, 0x7638, 0xBF61, 0x763A, 0xBF62, 0x763C, 0xEA70, 0x763D, 0xEA6E, 0x7642, 0xC0F8, 0x7643, 0xED74, + 0x7646, 0xC0F7, 0x7647, 0xED77, 0x7648, 0xED75, 0x7649, 0xED76, 0x764C, 0xC0F9, 0x7650, 0xF04D, 0x7652, 0xC2A1, 0x7653, 0xF04E, + 0x7656, 0xC27D, 0x7657, 0xF04F, 0x7658, 0xC27E, 0x7659, 0xF04C, 0x765A, 0xF050, 0x765C, 0xF04A, 0x765F, 0xC3A7, 0x7660, 0xF278, + 0x7661, 0xC3A8, 0x7662, 0xC46F, 0x7664, 0xF04B, 0x7665, 0xC470, 0x7669, 0xC4EE, 0x766A, 0xF5DF, 0x766C, 0xC57E, 0x766D, 0xF6F4, + 0x766E, 0xC57D, 0x7670, 0xF7EA, 0x7671, 0xC5F5, 0x7672, 0xC5F6, 0x7675, 0xF9CC, 0x7678, 0xACD1, 0x7679, 0xCFDE, 0x767B, 0xB56E, + 0x767C, 0xB56F, 0x767D, 0xA5D5, 0x767E, 0xA6CA, 0x767F, 0xCA47, 0x7681, 0xCB71, 0x7682, 0xA86D, 0x7684, 0xAABA, 0x7686, 0xACD2, + 0x7687, 0xACD3, 0x7688, 0xACD4, 0x7689, 0xD6A6, 0x768A, 0xD2CB, 0x768B, 0xAF6F, 0x768E, 0xB2AE, 0x768F, 0xD6A5, 0x7692, 0xDAB8, + 0x7693, 0xB571, 0x7695, 0xDAB7, 0x7696, 0xB570, 0x7699, 0xDED5, 0x769A, 0xBD4A, 0x769B, 0xE6BB, 0x769C, 0xE6B8, 0x769D, 0xE6B9, + 0x769E, 0xE6BA, 0x76A4, 0xED78, 0x76A6, 0xF051, 0x76AA, 0xF471, 0x76AB, 0xF470, 0x76AD, 0xF6F5, 0x76AE, 0xA5D6, 0x76AF, 0xCD75, + 0x76B0, 0xAF70, 0x76B4, 0xB572, 0x76B5, 0xDED6, 0x76B8, 0xE2E1, 0x76BA, 0xBD4B, 0x76BB, 0xEA74, 0x76BD, 0xF052, 0x76BE, 0xF472, + 0x76BF, 0xA5D7, 0x76C2, 0xAABB, 0x76C3, 0xACD7, 0x76C4, 0xCFDF, 0x76C5, 0xACD8, 0x76C6, 0xACD6, 0x76C8, 0xACD5, 0x76C9, 0xD2CC, + 0x76CA, 0xAF71, 0x76CD, 0xAF72, 0x76CE, 0xAF73, 0x76D2, 0xB2B0, 0x76D3, 0xD6A7, 0x76D4, 0xB2AF, 0x76DA, 0xDAB9, 0x76DB, 0xB2B1, + 0x76DC, 0xB573, 0x76DD, 0xDED7, 0x76DE, 0xB7F8, 0x76DF, 0xB7F9, 0x76E1, 0xBAC9, 0x76E3, 0xBACA, 0x76E4, 0xBD4C, 0x76E5, 0xBF64, + 0x76E6, 0xEA75, 0x76E7, 0xBF63, 0x76E9, 0xED79, 0x76EA, 0xC0FA, 0x76EC, 0xF053, 0x76ED, 0xF473, 0x76EE, 0xA5D8, 0x76EF, 0xA86E, + 0x76F0, 0xCD78, 0x76F1, 0xCD77, 0x76F2, 0xAABC, 0x76F3, 0xCD76, 0x76F4, 0xAABD, 0x76F5, 0xCD79, 0x76F7, 0xCFE5, 0x76F8, 0xACDB, + 0x76F9, 0xACDA, 0x76FA, 0xCFE7, 0x76FB, 0xCFE6, 0x76FC, 0xACDF, 0x76FE, 0xACDE, 0x7701, 0xACD9, 0x7703, 0xCFE1, 0x7704, 0xCFE2, + 0x7705, 0xCFE3, 0x7707, 0xACE0, 0x7708, 0xCFE0, 0x7709, 0xACDC, 0x770A, 0xCFE4, 0x770B, 0xACDD, 0x7710, 0xD2CF, 0x7711, 0xD2D3, + 0x7712, 0xD2D1, 0x7713, 0xD2D0, 0x7715, 0xD2D4, 0x7719, 0xD2D5, 0x771A, 0xD2D6, 0x771B, 0xD2CE, 0x771D, 0xD2CD, 0x771F, 0xAF75, + 0x7720, 0xAF76, 0x7722, 0xD2D7, 0x7723, 0xD2D2, 0x7725, 0xD6B0, 0x7727, 0xD2D8, 0x7728, 0xAF77, 0x7729, 0xAF74, 0x772D, 0xD6AA, + 0x772F, 0xD6A9, 0x7731, 0xD6AB, 0x7732, 0xD6AC, 0x7733, 0xD6AE, 0x7734, 0xD6AD, 0x7735, 0xD6B2, 0x7736, 0xB2B5, 0x7737, 0xB2B2, + 0x7738, 0xB2B6, 0x7739, 0xD6A8, 0x773A, 0xB2B7, 0x773B, 0xD6B1, 0x773C, 0xB2B4, 0x773D, 0xD6AF, 0x773E, 0xB2B3, 0x7744, 0xDABC, + 0x7745, 0xDABE, 0x7746, 0xDABA, 0x7747, 0xDABB, 0x774A, 0xDABF, 0x774B, 0xDAC1, 0x774C, 0xDAC2, 0x774D, 0xDABD, 0x774E, 0xDAC0, + 0x774F, 0xB574, 0x7752, 0xDEDB, 0x7754, 0xDEE0, 0x7755, 0xDED8, 0x7756, 0xDEDC, 0x7759, 0xDEE1, 0x775A, 0xDEDD, 0x775B, 0xB7FA, + 0x775C, 0xB843, 0x775E, 0xB7FD, 0x775F, 0xDED9, 0x7760, 0xDEDA, 0x7761, 0xBACE, 0x7762, 0xB846, 0x7763, 0xB7FE, 0x7765, 0xB844, + 0x7766, 0xB7FC, 0x7767, 0xDEDF, 0x7768, 0xB845, 0x7769, 0xDEDE, 0x776A, 0xB841, 0x776B, 0xB7FB, 0x776C, 0xB842, 0x776D, 0xDEE2, + 0x776E, 0xE2E6, 0x776F, 0xE2E8, 0x7779, 0xB840, 0x777C, 0xE2E3, 0x777D, 0xBACC, 0x777E, 0xE2E9, 0x777F, 0xBACD, 0x7780, 0xE2E7, + 0x7781, 0xE2E2, 0x7782, 0xE2E5, 0x7783, 0xE2EA, 0x7784, 0xBACB, 0x7785, 0xE2E4, 0x7787, 0xBD4E, 0x7788, 0xE6BF, 0x7789, 0xE6BE, + 0x778B, 0xBD51, 0x778C, 0xBD4F, 0x778D, 0xE6BC, 0x778E, 0xBD4D, 0x778F, 0xE6BD, 0x7791, 0xBD50, 0x7795, 0xEA7D, 0x7797, 0xEAA1, + 0x7799, 0xEA7E, 0x779A, 0xEA76, 0x779B, 0xEA7A, 0x779C, 0xEA79, 0x779D, 0xEA77, 0x779E, 0xBF66, 0x779F, 0xBF67, 0x77A0, 0xBF65, + 0x77A1, 0xEA78, 0x77A2, 0xEA7B, 0x77A3, 0xEA7C, 0x77A5, 0xBF68, 0x77A7, 0xC140, 0x77A8, 0xEDA3, 0x77AA, 0xC0FC, 0x77AB, 0xED7B, + 0x77AC, 0xC0FE, 0x77AD, 0xC141, 0x77B0, 0xC0FD, 0x77B1, 0xEDA2, 0x77B2, 0xED7C, 0x77B3, 0xC0FB, 0x77B4, 0xEDA1, 0x77B5, 0xED7A, + 0x77B6, 0xED7E, 0x77B7, 0xED7D, 0x77BA, 0xF055, 0x77BB, 0xC2A4, 0x77BC, 0xC2A5, 0x77BD, 0xC2A2, 0x77BF, 0xC2A3, 0x77C2, 0xF054, + 0x77C4, 0xF27B, 0x77C7, 0xC3A9, 0x77C9, 0xF279, 0x77CA, 0xF27A, 0x77CC, 0xF474, 0x77CD, 0xF477, 0x77CE, 0xF475, 0x77CF, 0xF476, + 0x77D0, 0xF5E0, 0x77D3, 0xC4EF, 0x77D4, 0xF7EB, 0x77D5, 0xF8B4, 0x77D7, 0xC5F7, 0x77D8, 0xF8F8, 0x77D9, 0xF8F9, 0x77DA, 0xC666, + 0x77DB, 0xA5D9, 0x77DC, 0xACE1, 0x77DE, 0xDAC3, 0x77E0, 0xDEE3, 0x77E2, 0xA5DA, 0x77E3, 0xA86F, 0x77E5, 0xAABE, 0x77E7, 0xCFE8, + 0x77E8, 0xCFE9, 0x77E9, 0xAF78, 0x77EC, 0xDAC4, 0x77ED, 0xB575, 0x77EE, 0xB847, 0x77EF, 0xC142, 0x77F0, 0xEDA4, 0x77F1, 0xF27C, + 0x77F2, 0xF478, 0x77F3, 0xA5DB, 0x77F7, 0xCDA1, 0x77F8, 0xCD7A, 0x77F9, 0xCD7C, 0x77FA, 0xCD7E, 0x77FB, 0xCD7D, 0x77FC, 0xCD7B, + 0x77FD, 0xAABF, 0x7802, 0xACE2, 0x7803, 0xCFF2, 0x7805, 0xCFED, 0x7806, 0xCFEA, 0x7809, 0xCFF1, 0x780C, 0xACE4, 0x780D, 0xACE5, + 0x780E, 0xCFF0, 0x780F, 0xCFEF, 0x7810, 0xCFEE, 0x7811, 0xCFEB, 0x7812, 0xCFEC, 0x7813, 0xCFF3, 0x7814, 0xACE3, 0x781D, 0xAF7C, + 0x781F, 0xAFA4, 0x7820, 0xAFA3, 0x7821, 0xD2E1, 0x7822, 0xD2DB, 0x7823, 0xD2D9, 0x7825, 0xAFA1, 0x7826, 0xD6B9, 0x7827, 0xAF7A, + 0x7828, 0xD2DE, 0x7829, 0xD2E2, 0x782A, 0xD2E4, 0x782B, 0xD2E0, 0x782C, 0xD2DA, 0x782D, 0xAFA2, 0x782E, 0xD2DF, 0x782F, 0xD2DD, + 0x7830, 0xAF79, 0x7831, 0xD2E5, 0x7832, 0xAFA5, 0x7833, 0xD2E3, 0x7834, 0xAF7D, 0x7835, 0xD2DC, 0x7837, 0xAF7E, 0x7838, 0xAF7B, + 0x7843, 0xB2B9, 0x7845, 0xD6BA, 0x7848, 0xD6B3, 0x7849, 0xD6B5, 0x784A, 0xD6B7, 0x784C, 0xD6B8, 0x784D, 0xD6B6, 0x784E, 0xB2BA, + 0x7850, 0xD6BB, 0x7852, 0xD6B4, 0x785C, 0xDAC8, 0x785D, 0xB576, 0x785E, 0xDAD0, 0x7860, 0xDAC5, 0x7862, 0xDAD1, 0x7864, 0xDAC6, + 0x7865, 0xDAC7, 0x7868, 0xDACF, 0x7869, 0xDACE, 0x786A, 0xDACB, 0x786B, 0xB2B8, 0x786C, 0xB577, 0x786D, 0xDAC9, 0x786E, 0xDACC, + 0x786F, 0xB578, 0x7870, 0xDACD, 0x7871, 0xDACA, 0x7879, 0xDEEE, 0x787B, 0xDEF2, 0x787C, 0xB84E, 0x787E, 0xE2F0, 0x787F, 0xB851, + 0x7880, 0xDEF0, 0x7881, 0xF9D6, 0x7883, 0xDEED, 0x7884, 0xDEE8, 0x7885, 0xDEEA, 0x7886, 0xDEEB, 0x7887, 0xDEE4, 0x7889, 0xB84D, + 0x788C, 0xB84C, 0x788E, 0xB848, 0x788F, 0xDEE7, 0x7891, 0xB84F, 0x7893, 0xB850, 0x7894, 0xDEE6, 0x7895, 0xDEE9, 0x7896, 0xDEF1, + 0x7897, 0xB84A, 0x7898, 0xB84B, 0x7899, 0xDEEF, 0x789A, 0xDEE5, 0x789E, 0xE2F2, 0x789F, 0xBAD0, 0x78A0, 0xE2F4, 0x78A1, 0xDEEC, + 0x78A2, 0xE2F6, 0x78A3, 0xBAD4, 0x78A4, 0xE2F7, 0x78A5, 0xE2F3, 0x78A7, 0xBAD1, 0x78A8, 0xE2EF, 0x78A9, 0xBAD3, 0x78AA, 0xE2EC, + 0x78AB, 0xE2F1, 0x78AC, 0xE2F5, 0x78AD, 0xE2EE, 0x78B0, 0xB849, 0x78B2, 0xE2EB, 0x78B3, 0xBAD2, 0x78B4, 0xE2ED, 0x78BA, 0xBD54, + 0x78BB, 0xE6C1, 0x78BC, 0xBD58, 0x78BE, 0xBD56, 0x78C1, 0xBACF, 0x78C3, 0xE6C8, 0x78C4, 0xE6C9, 0x78C5, 0xBD53, 0x78C8, 0xE6C7, + 0x78C9, 0xE6CA, 0x78CA, 0xBD55, 0x78CB, 0xBD52, 0x78CC, 0xE6C3, 0x78CD, 0xE6C0, 0x78CE, 0xE6C5, 0x78CF, 0xE6C2, 0x78D0, 0xBD59, + 0x78D1, 0xE6C4, 0x78D4, 0xE6C6, 0x78D5, 0xBD57, 0x78DA, 0xBF6A, 0x78DB, 0xEAA8, 0x78DD, 0xEAA2, 0x78DE, 0xEAA6, 0x78DF, 0xEAAC, + 0x78E0, 0xEAAD, 0x78E1, 0xEAA9, 0x78E2, 0xEAAA, 0x78E3, 0xEAA7, 0x78E5, 0xEAA4, 0x78E7, 0xBF6C, 0x78E8, 0xBF69, 0x78E9, 0xEAA3, + 0x78EA, 0xEAA5, 0x78EC, 0xBF6B, 0x78ED, 0xEAAB, 0x78EF, 0xC146, 0x78F2, 0xEDAA, 0x78F3, 0xEDA5, 0x78F4, 0xC145, 0x78F7, 0xC143, + 0x78F9, 0xEDAC, 0x78FA, 0xC144, 0x78FB, 0xEDA8, 0x78FC, 0xEDA9, 0x78FD, 0xEDA6, 0x78FE, 0xEDAD, 0x78FF, 0xF056, 0x7901, 0xC147, + 0x7902, 0xEDA7, 0x7904, 0xEDAE, 0x7905, 0xEDAB, 0x7909, 0xF05A, 0x790C, 0xF057, 0x790E, 0xC2A6, 0x7910, 0xF05B, 0x7911, 0xF05D, + 0x7912, 0xF05C, 0x7913, 0xF058, 0x7914, 0xF059, 0x7917, 0xF2A3, 0x7919, 0xC3AA, 0x791B, 0xF27E, 0x791C, 0xF2A2, 0x791D, 0xF27D, + 0x791E, 0xF2A4, 0x7921, 0xF2A1, 0x7923, 0xF47A, 0x7924, 0xF47D, 0x7925, 0xF479, 0x7926, 0xC471, 0x7927, 0xF47B, 0x7928, 0xF47C, + 0x7929, 0xF47E, 0x792A, 0xC472, 0x792B, 0xC474, 0x792C, 0xC473, 0x792D, 0xF5E1, 0x792F, 0xF5E3, 0x7931, 0xF5E2, 0x7935, 0xF6F6, + 0x7938, 0xF8B5, 0x7939, 0xF8FA, 0x793A, 0xA5DC, 0x793D, 0xCB72, 0x793E, 0xAAC0, 0x793F, 0xCDA3, 0x7940, 0xAAC1, 0x7941, 0xAAC2, + 0x7942, 0xCDA2, 0x7944, 0xCFF8, 0x7945, 0xCFF7, 0x7946, 0xACE6, 0x7947, 0xACE9, 0x7948, 0xACE8, 0x7949, 0xACE7, 0x794A, 0xCFF4, + 0x794B, 0xCFF6, 0x794C, 0xCFF5, 0x794F, 0xD2E8, 0x7950, 0xAFA7, 0x7951, 0xD2EC, 0x7952, 0xD2EB, 0x7953, 0xD2EA, 0x7954, 0xD2E6, + 0x7955, 0xAFA6, 0x7956, 0xAFAA, 0x7957, 0xAFAD, 0x795A, 0xAFAE, 0x795B, 0xD2E7, 0x795C, 0xD2E9, 0x795D, 0xAFAC, 0x795E, 0xAFAB, + 0x795F, 0xAFA9, 0x7960, 0xAFA8, 0x7961, 0xD6C2, 0x7963, 0xD6C0, 0x7964, 0xD6BC, 0x7965, 0xB2BB, 0x7967, 0xD6BD, 0x7968, 0xB2BC, + 0x7969, 0xD6BE, 0x796A, 0xD6BF, 0x796B, 0xD6C1, 0x796D, 0xB2BD, 0x7970, 0xDAD5, 0x7972, 0xDAD4, 0x7973, 0xDAD3, 0x7974, 0xDAD2, + 0x7979, 0xDEF6, 0x797A, 0xB852, 0x797C, 0xDEF3, 0x797D, 0xDEF5, 0x797F, 0xB853, 0x7981, 0xB854, 0x7982, 0xDEF4, 0x7988, 0xE341, + 0x798A, 0xE2F9, 0x798B, 0xE2FA, 0x798D, 0xBAD7, 0x798E, 0xBAD5, 0x798F, 0xBAD6, 0x7990, 0xE343, 0x7992, 0xE342, 0x7993, 0xE2FE, + 0x7994, 0xE2FD, 0x7995, 0xE2FC, 0x7996, 0xE2FB, 0x7997, 0xE340, 0x7998, 0xE2F8, 0x799A, 0xE6CB, 0x799B, 0xE6D0, 0x799C, 0xE6CE, + 0x79A0, 0xE6CD, 0x79A1, 0xE6CC, 0x79A2, 0xE6CF, 0x79A4, 0xEAAE, 0x79A6, 0xBF6D, 0x79A7, 0xC148, 0x79A8, 0xEDB0, 0x79AA, 0xC149, + 0x79AB, 0xEDAF, 0x79AC, 0xF05F, 0x79AD, 0xF05E, 0x79AE, 0xC2A7, 0x79B0, 0xF2A5, 0x79B1, 0xC3AB, 0x79B2, 0xF4A1, 0x79B3, 0xC5A1, + 0x79B4, 0xF6F7, 0x79B6, 0xF8B7, 0x79B7, 0xF8B6, 0x79B8, 0xC9A8, 0x79B9, 0xACEA, 0x79BA, 0xACEB, 0x79BB, 0xD6C3, 0x79BD, 0xB856, + 0x79BE, 0xA5DD, 0x79BF, 0xA872, 0x79C0, 0xA871, 0x79C1, 0xA870, 0x79C5, 0xCDA4, 0x79C8, 0xAAC4, 0x79C9, 0xAAC3, 0x79CB, 0xACEE, + 0x79CD, 0xCFFA, 0x79CE, 0xCFFD, 0x79CF, 0xCFFB, 0x79D1, 0xACEC, 0x79D2, 0xACED, 0x79D5, 0xCFF9, 0x79D6, 0xCFFC, 0x79D8, 0xAFB5, + 0x79DC, 0xD2F3, 0x79DD, 0xD2F5, 0x79DE, 0xD2F4, 0x79DF, 0xAFB2, 0x79E0, 0xD2EF, 0x79E3, 0xAFB0, 0x79E4, 0xAFAF, 0x79E6, 0xAFB3, + 0x79E7, 0xAFB1, 0x79E9, 0xAFB4, 0x79EA, 0xD2F2, 0x79EB, 0xD2ED, 0x79EC, 0xD2EE, 0x79ED, 0xD2F1, 0x79EE, 0xD2F0, 0x79F6, 0xD6C6, + 0x79F7, 0xD6C7, 0x79F8, 0xD6C5, 0x79FA, 0xD6C4, 0x79FB, 0xB2BE, 0x7A00, 0xB57D, 0x7A02, 0xDAD6, 0x7A03, 0xDAD8, 0x7A04, 0xDADA, + 0x7A05, 0xB57C, 0x7A08, 0xB57A, 0x7A0A, 0xDAD7, 0x7A0B, 0xB57B, 0x7A0C, 0xDAD9, 0x7A0D, 0xB579, 0x7A10, 0xDF41, 0x7A11, 0xDEF7, + 0x7A12, 0xDEFA, 0x7A13, 0xDEFE, 0x7A14, 0xB85A, 0x7A15, 0xDEFC, 0x7A17, 0xDEFB, 0x7A18, 0xDEF8, 0x7A19, 0xDEF9, 0x7A1A, 0xB858, + 0x7A1B, 0xDF40, 0x7A1C, 0xB857, 0x7A1E, 0xB85C, 0x7A1F, 0xB85B, 0x7A20, 0xB859, 0x7A22, 0xDEFD, 0x7A26, 0xE349, 0x7A28, 0xE348, + 0x7A2B, 0xE344, 0x7A2E, 0xBAD8, 0x7A2F, 0xE347, 0x7A30, 0xE346, 0x7A31, 0xBAD9, 0x7A37, 0xBD5E, 0x7A39, 0xE6D2, 0x7A3B, 0xBD5F, + 0x7A3C, 0xBD5B, 0x7A3D, 0xBD5D, 0x7A3F, 0xBD5A, 0x7A40, 0xBD5C, 0x7A44, 0xEAAF, 0x7A46, 0xBF70, 0x7A47, 0xEAB1, 0x7A48, 0xEAB0, + 0x7A4A, 0xE345, 0x7A4B, 0xBF72, 0x7A4C, 0xBF71, 0x7A4D, 0xBF6E, 0x7A4E, 0xBF6F, 0x7A54, 0xEDB5, 0x7A56, 0xEDB3, 0x7A57, 0xC14A, + 0x7A58, 0xEDB4, 0x7A5A, 0xEDB6, 0x7A5B, 0xEDB2, 0x7A5C, 0xEDB1, 0x7A5F, 0xF060, 0x7A60, 0xC2AA, 0x7A61, 0xC2A8, 0x7A62, 0xC2A9, + 0x7A67, 0xF2A6, 0x7A68, 0xF2A7, 0x7A69, 0xC3AD, 0x7A6B, 0xC3AC, 0x7A6C, 0xF4A3, 0x7A6D, 0xF4A4, 0x7A6E, 0xF4A2, 0x7A70, 0xF6F8, + 0x7A71, 0xF6F9, 0x7A74, 0xA5DE, 0x7A75, 0xCA48, 0x7A76, 0xA873, 0x7A78, 0xCDA5, 0x7A79, 0xAAC6, 0x7A7A, 0xAAC5, 0x7A7B, 0xCDA6, + 0x7A7E, 0xD040, 0x7A7F, 0xACEF, 0x7A80, 0xCFFE, 0x7A81, 0xACF0, 0x7A84, 0xAFB6, 0x7A85, 0xD2F8, 0x7A86, 0xD2F6, 0x7A87, 0xD2FC, + 0x7A88, 0xAFB7, 0x7A89, 0xD2F7, 0x7A8A, 0xD2FB, 0x7A8B, 0xD2F9, 0x7A8C, 0xD2FA, 0x7A8F, 0xD6C8, 0x7A90, 0xD6CA, 0x7A92, 0xB2BF, + 0x7A94, 0xD6C9, 0x7A95, 0xB2C0, 0x7A96, 0xB5A2, 0x7A97, 0xB5A1, 0x7A98, 0xB57E, 0x7A99, 0xDADB, 0x7A9E, 0xDF44, 0x7A9F, 0xB85D, + 0x7AA0, 0xB85E, 0x7AA2, 0xDF43, 0x7AA3, 0xDF42, 0x7AA8, 0xE34A, 0x7AA9, 0xBADB, 0x7AAA, 0xBADA, 0x7AAB, 0xE34B, 0x7AAC, 0xE34C, + 0x7AAE, 0xBD61, 0x7AAF, 0xBD60, 0x7AB1, 0xEAB5, 0x7AB2, 0xE6D3, 0x7AB3, 0xE6D5, 0x7AB4, 0xE6D4, 0x7AB5, 0xEAB4, 0x7AB6, 0xEAB2, + 0x7AB7, 0xEAB6, 0x7AB8, 0xEAB3, 0x7ABA, 0xBF73, 0x7ABE, 0xEDB7, 0x7ABF, 0xC14B, 0x7AC0, 0xEDB8, 0x7AC1, 0xEDB9, 0x7AC4, 0xC2AB, + 0x7AC5, 0xC2AC, 0x7AC7, 0xC475, 0x7ACA, 0xC5D1, 0x7ACB, 0xA5DF, 0x7AD1, 0xD041, 0x7AD8, 0xD2FD, 0x7AD9, 0xAFB8, 0x7ADF, 0xB3BA, + 0x7AE0, 0xB3B9, 0x7AE3, 0xB5A4, 0x7AE4, 0xDADD, 0x7AE5, 0xB5A3, 0x7AE6, 0xDADC, 0x7AEB, 0xDF45, 0x7AED, 0xBADC, 0x7AEE, 0xE34D, + 0x7AEF, 0xBADD, 0x7AF6, 0xC476, 0x7AF7, 0xF4A5, 0x7AF9, 0xA6CB, 0x7AFA, 0xAAC7, 0x7AFB, 0xCDA7, 0x7AFD, 0xACF2, 0x7AFF, 0xACF1, + 0x7B00, 0xD042, 0x7B01, 0xD043, 0x7B04, 0xD340, 0x7B05, 0xD342, 0x7B06, 0xAFB9, 0x7B08, 0xD344, 0x7B09, 0xD347, 0x7B0A, 0xD345, + 0x7B0E, 0xD346, 0x7B0F, 0xD343, 0x7B10, 0xD2FE, 0x7B11, 0xAFBA, 0x7B12, 0xD348, 0x7B13, 0xD341, 0x7B18, 0xD6D3, 0x7B19, 0xB2C6, + 0x7B1A, 0xD6DC, 0x7B1B, 0xB2C3, 0x7B1D, 0xD6D5, 0x7B1E, 0xB2C7, 0x7B20, 0xB2C1, 0x7B22, 0xD6D0, 0x7B23, 0xD6DD, 0x7B24, 0xD6D1, + 0x7B25, 0xD6CE, 0x7B26, 0xB2C5, 0x7B28, 0xB2C2, 0x7B2A, 0xD6D4, 0x7B2B, 0xD6D7, 0x7B2C, 0xB2C4, 0x7B2D, 0xD6D8, 0x7B2E, 0xB2C8, + 0x7B2F, 0xD6D9, 0x7B30, 0xD6CF, 0x7B31, 0xD6D6, 0x7B32, 0xD6DA, 0x7B33, 0xD6D2, 0x7B34, 0xD6CD, 0x7B35, 0xD6CB, 0x7B38, 0xD6DB, + 0x7B3B, 0xDADF, 0x7B40, 0xDAE4, 0x7B44, 0xDAE0, 0x7B45, 0xDAE6, 0x7B46, 0xB5A7, 0x7B47, 0xD6CC, 0x7B48, 0xDAE1, 0x7B49, 0xB5A5, + 0x7B4A, 0xDADE, 0x7B4B, 0xB5AC, 0x7B4C, 0xDAE2, 0x7B4D, 0xB5AB, 0x7B4E, 0xDAE3, 0x7B4F, 0xB5AD, 0x7B50, 0xB5A8, 0x7B51, 0xB5AE, + 0x7B52, 0xB5A9, 0x7B54, 0xB5AA, 0x7B56, 0xB5A6, 0x7B58, 0xDAE5, 0x7B60, 0xB861, 0x7B61, 0xDF50, 0x7B63, 0xDF53, 0x7B64, 0xDF47, + 0x7B65, 0xDF4C, 0x7B66, 0xDF46, 0x7B67, 0xB863, 0x7B69, 0xDF4A, 0x7B6D, 0xDF48, 0x7B6E, 0xB862, 0x7B70, 0xDF4F, 0x7B71, 0xDF4E, + 0x7B72, 0xDF4B, 0x7B73, 0xDF4D, 0x7B74, 0xDF49, 0x7B75, 0xBAE1, 0x7B76, 0xDF52, 0x7B77, 0xB85F, 0x7B78, 0xDF51, 0x7B82, 0xE35D, + 0x7B84, 0xBAE8, 0x7B85, 0xE358, 0x7B87, 0xBAE7, 0x7B88, 0xE34E, 0x7B8A, 0xE350, 0x7B8B, 0xBAE0, 0x7B8C, 0xE355, 0x7B8D, 0xE354, + 0x7B8E, 0xE357, 0x7B8F, 0xBAE5, 0x7B90, 0xE352, 0x7B91, 0xE351, 0x7B94, 0xBAE4, 0x7B95, 0xBADF, 0x7B96, 0xE353, 0x7B97, 0xBAE2, + 0x7B98, 0xE359, 0x7B99, 0xE35B, 0x7B9B, 0xE356, 0x7B9C, 0xE34F, 0x7B9D, 0xBAE3, 0x7BA0, 0xBD69, 0x7BA1, 0xBADE, 0x7BA4, 0xE35C, + 0x7BAC, 0xE6D9, 0x7BAD, 0xBD62, 0x7BAF, 0xE6DB, 0x7BB1, 0xBD63, 0x7BB4, 0xBD65, 0x7BB5, 0xE6DE, 0x7BB7, 0xE6D6, 0x7BB8, 0xBAE6, + 0x7BB9, 0xE6DC, 0x7BBE, 0xE6D8, 0x7BC0, 0xB860, 0x7BC1, 0xBD68, 0x7BC4, 0xBD64, 0x7BC6, 0xBD66, 0x7BC7, 0xBD67, 0x7BC9, 0xBF76, + 0x7BCA, 0xE6DD, 0x7BCB, 0xE6D7, 0x7BCC, 0xBD6A, 0x7BCE, 0xE6DA, 0x7BD4, 0xEAC0, 0x7BD5, 0xEABB, 0x7BD8, 0xEAC5, 0x7BD9, 0xBF74, + 0x7BDA, 0xEABD, 0x7BDB, 0xBF78, 0x7BDC, 0xEAC3, 0x7BDD, 0xEABA, 0x7BDE, 0xEAB7, 0x7BDF, 0xEAC6, 0x7BE0, 0xC151, 0x7BE1, 0xBF79, + 0x7BE2, 0xEAC2, 0x7BE3, 0xEAB8, 0x7BE4, 0xBF77, 0x7BE5, 0xEABC, 0x7BE6, 0xBF7B, 0x7BE7, 0xEAB9, 0x7BE8, 0xEABE, 0x7BE9, 0xBF7A, + 0x7BEA, 0xEAC1, 0x7BEB, 0xEAC4, 0x7BF0, 0xEDCB, 0x7BF1, 0xEDCC, 0x7BF2, 0xEDBC, 0x7BF3, 0xEDC3, 0x7BF4, 0xEDC1, 0x7BF7, 0xC14F, + 0x7BF8, 0xEDC8, 0x7BF9, 0xEABF, 0x7BFB, 0xEDBF, 0x7BFD, 0xEDC9, 0x7BFE, 0xC14E, 0x7BFF, 0xEDBE, 0x7C00, 0xEDBD, 0x7C01, 0xEDC7, + 0x7C02, 0xEDC4, 0x7C03, 0xEDC6, 0x7C05, 0xEDBA, 0x7C06, 0xEDCA, 0x7C07, 0xC14C, 0x7C09, 0xEDC5, 0x7C0A, 0xEDCE, 0x7C0B, 0xEDC2, + 0x7C0C, 0xC150, 0x7C0D, 0xC14D, 0x7C0E, 0xEDC0, 0x7C0F, 0xEDBB, 0x7C10, 0xEDCD, 0x7C11, 0xBF75, 0x7C19, 0xF063, 0x7C1C, 0xF061, + 0x7C1D, 0xF067, 0x7C1E, 0xC2B0, 0x7C1F, 0xF065, 0x7C20, 0xF064, 0x7C21, 0xC2B2, 0x7C22, 0xF06A, 0x7C23, 0xC2B1, 0x7C25, 0xF06B, + 0x7C26, 0xF068, 0x7C27, 0xC2AE, 0x7C28, 0xF069, 0x7C29, 0xF062, 0x7C2A, 0xC2AF, 0x7C2B, 0xC2AD, 0x7C2C, 0xF2AB, 0x7C2D, 0xF066, + 0x7C30, 0xF06C, 0x7C33, 0xF2A8, 0x7C37, 0xC3B2, 0x7C38, 0xC3B0, 0x7C39, 0xF2AA, 0x7C3B, 0xF2AC, 0x7C3C, 0xF2A9, 0x7C3D, 0xC3B1, + 0x7C3E, 0xC3AE, 0x7C3F, 0xC3AF, 0x7C40, 0xC3B3, 0x7C43, 0xC478, 0x7C45, 0xF4AA, 0x7C47, 0xF4A9, 0x7C48, 0xF4A7, 0x7C49, 0xF4A6, + 0x7C4A, 0xF4A8, 0x7C4C, 0xC477, 0x7C4D, 0xC479, 0x7C50, 0xC4F0, 0x7C53, 0xF5E5, 0x7C54, 0xF5E4, 0x7C57, 0xF6FA, 0x7C59, 0xF6FC, + 0x7C5A, 0xF6FE, 0x7C5B, 0xF6FD, 0x7C5C, 0xF6FB, 0x7C5F, 0xC5A3, 0x7C60, 0xC5A2, 0x7C63, 0xC5D3, 0x7C64, 0xC5D2, 0x7C65, 0xC5D4, + 0x7C66, 0xF7ED, 0x7C67, 0xF7EC, 0x7C69, 0xF8FB, 0x7C6A, 0xF8B8, 0x7C6B, 0xF8FC, 0x7C6C, 0xC658, 0x7C6E, 0xC659, 0x7C6F, 0xF96D, + 0x7C72, 0xC67E, 0x7C73, 0xA6CC, 0x7C75, 0xCDA8, 0x7C78, 0xD045, 0x7C79, 0xD046, 0x7C7A, 0xD044, 0x7C7D, 0xACF3, 0x7C7F, 0xD047, + 0x7C80, 0xD048, 0x7C81, 0xD049, 0x7C84, 0xD349, 0x7C85, 0xD34F, 0x7C88, 0xD34D, 0x7C89, 0xAFBB, 0x7C8A, 0xD34B, 0x7C8C, 0xD34C, + 0x7C8D, 0xD34E, 0x7C91, 0xD34A, 0x7C92, 0xB2C9, 0x7C94, 0xD6DE, 0x7C95, 0xB2CB, 0x7C96, 0xD6E0, 0x7C97, 0xB2CA, 0x7C98, 0xD6DF, + 0x7C9E, 0xDAE8, 0x7C9F, 0xB5AF, 0x7CA1, 0xDAEA, 0x7CA2, 0xDAE7, 0x7CA3, 0xD6E1, 0x7CA5, 0xB5B0, 0x7CA7, 0xF9DB, 0x7CA8, 0xDAE9, + 0x7CAF, 0xDF56, 0x7CB1, 0xB864, 0x7CB2, 0xDF54, 0x7CB3, 0xB865, 0x7CB4, 0xDF55, 0x7CB5, 0xB866, 0x7CB9, 0xBAE9, 0x7CBA, 0xE361, + 0x7CBB, 0xE35E, 0x7CBC, 0xE360, 0x7CBD, 0xBAEA, 0x7CBE, 0xBAEB, 0x7CBF, 0xE35F, 0x7CC5, 0xE6DF, 0x7CC8, 0xE6E0, 0x7CCA, 0xBD6B, + 0x7CCB, 0xE6E2, 0x7CCC, 0xE6E1, 0x7CCE, 0xA261, 0x7CD0, 0xEACA, 0x7CD1, 0xEACB, 0x7CD2, 0xEAC7, 0x7CD4, 0xEAC8, 0x7CD5, 0xBF7C, + 0x7CD6, 0xBF7D, 0x7CD7, 0xEAC9, 0x7CD9, 0xC157, 0x7CDC, 0xC153, 0x7CDD, 0xC158, 0x7CDE, 0xC154, 0x7CDF, 0xC156, 0x7CE0, 0xC152, + 0x7CE2, 0xC155, 0x7CE7, 0xC2B3, 0x7CE8, 0xEDCF, 0x7CEA, 0xF2AE, 0x7CEC, 0xF2AD, 0x7CEE, 0xF4AB, 0x7CEF, 0xC47A, 0x7CF0, 0xC47B, + 0x7CF1, 0xF741, 0x7CF2, 0xF5E6, 0x7CF4, 0xF740, 0x7CF6, 0xF8FD, 0x7CF7, 0xF9A4, 0x7CF8, 0xA6CD, 0x7CFB, 0xA874, 0x7CFD, 0xCDA9, + 0x7CFE, 0xAAC8, 0x7D00, 0xACF6, 0x7D01, 0xD04C, 0x7D02, 0xACF4, 0x7D03, 0xD04A, 0x7D04, 0xACF9, 0x7D05, 0xACF5, 0x7D06, 0xACFA, + 0x7D07, 0xACF8, 0x7D08, 0xD04B, 0x7D09, 0xACF7, 0x7D0A, 0xAFBF, 0x7D0B, 0xAFBE, 0x7D0C, 0xD35A, 0x7D0D, 0xAFC7, 0x7D0E, 0xD353, + 0x7D0F, 0xD359, 0x7D10, 0xAFC3, 0x7D11, 0xD352, 0x7D12, 0xD358, 0x7D13, 0xD356, 0x7D14, 0xAFC2, 0x7D15, 0xAFC4, 0x7D16, 0xD355, + 0x7D17, 0xAFBD, 0x7D18, 0xD354, 0x7D19, 0xAFC8, 0x7D1A, 0xAFC5, 0x7D1B, 0xAFC9, 0x7D1C, 0xAFC6, 0x7D1D, 0xD351, 0x7D1E, 0xD350, + 0x7D1F, 0xD357, 0x7D20, 0xAFC0, 0x7D21, 0xAFBC, 0x7D22, 0xAFC1, 0x7D28, 0xD6F0, 0x7D29, 0xD6E9, 0x7D2B, 0xB5B5, 0x7D2C, 0xD6E8, + 0x7D2E, 0xB2CF, 0x7D2F, 0xB2D6, 0x7D30, 0xB2D3, 0x7D31, 0xB2D9, 0x7D32, 0xB2D8, 0x7D33, 0xB2D4, 0x7D35, 0xD6E2, 0x7D36, 0xD6E5, + 0x7D38, 0xD6E4, 0x7D39, 0xB2D0, 0x7D3A, 0xD6E6, 0x7D3B, 0xD6EF, 0x7D3C, 0xB2D1, 0x7D3D, 0xD6E3, 0x7D3E, 0xD6EC, 0x7D3F, 0xD6ED, + 0x7D40, 0xB2D2, 0x7D41, 0xD6EA, 0x7D42, 0xB2D7, 0x7D43, 0xB2CD, 0x7D44, 0xB2D5, 0x7D45, 0xD6E7, 0x7D46, 0xB2CC, 0x7D47, 0xD6EB, + 0x7D4A, 0xD6EE, 0x7D4E, 0xDAFB, 0x7D4F, 0xDAF2, 0x7D50, 0xB5B2, 0x7D51, 0xDAF9, 0x7D52, 0xDAF6, 0x7D53, 0xDAEE, 0x7D54, 0xDAF7, + 0x7D55, 0xB5B4, 0x7D56, 0xDAEF, 0x7D58, 0xDAEB, 0x7D5B, 0xB86C, 0x7D5C, 0xDAF4, 0x7D5E, 0xB5B1, 0x7D5F, 0xDAFA, 0x7D61, 0xB5B8, + 0x7D62, 0xB5BA, 0x7D63, 0xDAED, 0x7D66, 0xB5B9, 0x7D67, 0xDAF0, 0x7D68, 0xB5B3, 0x7D69, 0xDAF8, 0x7D6A, 0xDAF1, 0x7D6B, 0xDAF5, + 0x7D6D, 0xDAF3, 0x7D6E, 0xB5B6, 0x7D6F, 0xDAEC, 0x7D70, 0xB5BB, 0x7D71, 0xB2CE, 0x7D72, 0xB5B7, 0x7D73, 0xB5BC, 0x7D79, 0xB868, + 0x7D7A, 0xDF5D, 0x7D7B, 0xDF5F, 0x7D7C, 0xDF61, 0x7D7D, 0xDF65, 0x7D7F, 0xDF5B, 0x7D80, 0xDF59, 0x7D81, 0xB86A, 0x7D83, 0xDF60, + 0x7D84, 0xDF64, 0x7D85, 0xDF5C, 0x7D86, 0xDF58, 0x7D88, 0xDF57, 0x7D8C, 0xDF62, 0x7D8D, 0xDF5A, 0x7D8E, 0xDF5E, 0x7D8F, 0xB86B, + 0x7D91, 0xB869, 0x7D92, 0xDF66, 0x7D93, 0xB867, 0x7D94, 0xDF63, 0x7D96, 0xE372, 0x7D9C, 0xBAEE, 0x7D9D, 0xE36A, 0x7D9E, 0xBD78, + 0x7D9F, 0xE374, 0x7DA0, 0xBAF1, 0x7DA1, 0xE378, 0x7DA2, 0xBAF7, 0x7DA3, 0xE365, 0x7DA6, 0xE375, 0x7DA7, 0xE362, 0x7DA9, 0xE377, + 0x7DAA, 0xE366, 0x7DAC, 0xBAFE, 0x7DAD, 0xBAFB, 0x7DAE, 0xE376, 0x7DAF, 0xE370, 0x7DB0, 0xBAED, 0x7DB1, 0xBAF5, 0x7DB2, 0xBAF4, + 0x7DB4, 0xBAF3, 0x7DB5, 0xBAF9, 0x7DB7, 0xE363, 0x7DB8, 0xBAFA, 0x7DB9, 0xE371, 0x7DBA, 0xBAF6, 0x7DBB, 0xBAEC, 0x7DBC, 0xE373, + 0x7DBD, 0xBAEF, 0x7DBE, 0xBAF0, 0x7DBF, 0xBAF8, 0x7DC0, 0xE368, 0x7DC1, 0xE367, 0x7DC2, 0xE364, 0x7DC4, 0xE36C, 0x7DC5, 0xE369, + 0x7DC6, 0xE36D, 0x7DC7, 0xBAFD, 0x7DC9, 0xE379, 0x7DCA, 0xBAF2, 0x7DCB, 0xE36E, 0x7DCC, 0xE36F, 0x7DCE, 0xE36B, 0x7DD2, 0xBAFC, + 0x7DD7, 0xE6E7, 0x7DD8, 0xBD70, 0x7DD9, 0xBD79, 0x7DDA, 0xBD75, 0x7DDB, 0xE6E4, 0x7DDD, 0xBD72, 0x7DDE, 0xBD76, 0x7DDF, 0xE6F0, + 0x7DE0, 0xBD6C, 0x7DE1, 0xE6E8, 0x7DE3, 0xBD74, 0x7DE6, 0xE6EB, 0x7DE7, 0xE6E6, 0x7DE8, 0xBD73, 0x7DE9, 0xBD77, 0x7DEA, 0xE6E5, + 0x7DEC, 0xBD71, 0x7DEE, 0xE6EF, 0x7DEF, 0xBD6E, 0x7DF0, 0xE6EE, 0x7DF1, 0xE6ED, 0x7DF2, 0xBD7A, 0x7DF3, 0xE572, 0x7DF4, 0xBD6D, + 0x7DF6, 0xE6EC, 0x7DF7, 0xE6E3, 0x7DF9, 0xBD7B, 0x7DFA, 0xE6EA, 0x7DFB, 0xBD6F, 0x7E03, 0xE6E9, 0x7E08, 0xBFA2, 0x7E09, 0xBFA7, + 0x7E0A, 0xBF7E, 0x7E0B, 0xEAD8, 0x7E0C, 0xEACF, 0x7E0D, 0xEADB, 0x7E0E, 0xEAD3, 0x7E0F, 0xEAD9, 0x7E10, 0xBFA8, 0x7E11, 0xBFA1, + 0x7E12, 0xEACC, 0x7E13, 0xEAD2, 0x7E14, 0xEADC, 0x7E15, 0xEAD5, 0x7E16, 0xEADA, 0x7E17, 0xEACE, 0x7E1A, 0xEAD6, 0x7E1B, 0xBFA3, + 0x7E1C, 0xEAD4, 0x7E1D, 0xBFA6, 0x7E1E, 0xBFA5, 0x7E1F, 0xEAD0, 0x7E20, 0xEAD1, 0x7E21, 0xEACD, 0x7E22, 0xEAD7, 0x7E23, 0xBFA4, + 0x7E24, 0xEADE, 0x7E25, 0xEADD, 0x7E29, 0xEDDA, 0x7E2A, 0xEDD6, 0x7E2B, 0xC15F, 0x7E2D, 0xEDD0, 0x7E2E, 0xC159, 0x7E2F, 0xC169, + 0x7E30, 0xEDDC, 0x7E31, 0xC161, 0x7E32, 0xC15D, 0x7E33, 0xEDD3, 0x7E34, 0xC164, 0x7E35, 0xC167, 0x7E36, 0xEDDE, 0x7E37, 0xC15C, + 0x7E38, 0xEDD5, 0x7E39, 0xC165, 0x7E3A, 0xEDE0, 0x7E3B, 0xEDDD, 0x7E3C, 0xEDD1, 0x7E3D, 0xC160, 0x7E3E, 0xC15A, 0x7E3F, 0xC168, + 0x7E40, 0xEDD8, 0x7E41, 0xC163, 0x7E42, 0xEDD2, 0x7E43, 0xC15E, 0x7E44, 0xEDDF, 0x7E45, 0xC162, 0x7E46, 0xC15B, 0x7E47, 0xEDD9, + 0x7E48, 0xC166, 0x7E49, 0xEDD7, 0x7E4C, 0xEDDB, 0x7E50, 0xF06E, 0x7E51, 0xF074, 0x7E52, 0xC2B9, 0x7E53, 0xF077, 0x7E54, 0xC2B4, + 0x7E55, 0xC2B5, 0x7E56, 0xF06F, 0x7E57, 0xF076, 0x7E58, 0xF071, 0x7E59, 0xC2BA, 0x7E5A, 0xC2B7, 0x7E5C, 0xF06D, 0x7E5E, 0xC2B6, + 0x7E5F, 0xF073, 0x7E60, 0xF075, 0x7E61, 0xC2B8, 0x7E62, 0xF072, 0x7E63, 0xF070, 0x7E68, 0xF2B8, 0x7E69, 0xC3B7, 0x7E6A, 0xC3B8, + 0x7E6B, 0xC3B4, 0x7E6D, 0xC3B5, 0x7E6F, 0xF2B4, 0x7E70, 0xF2B2, 0x7E72, 0xF2B6, 0x7E73, 0xC3BA, 0x7E74, 0xF2B7, 0x7E75, 0xF2B0, + 0x7E76, 0xF2AF, 0x7E77, 0xF2B3, 0x7E78, 0xF2B1, 0x7E79, 0xC3B6, 0x7E7A, 0xF2B5, 0x7E7B, 0xF4AC, 0x7E7C, 0xC47E, 0x7E7D, 0xC47D, + 0x7E7E, 0xF4AD, 0x7E80, 0xF4AF, 0x7E81, 0xF4AE, 0x7E82, 0xC4A1, 0x7E86, 0xF5EB, 0x7E87, 0xF5E8, 0x7E88, 0xF5E9, 0x7E8A, 0xF5E7, + 0x7E8B, 0xF5EA, 0x7E8C, 0xC4F2, 0x7E8D, 0xF5EC, 0x7E8F, 0xC4F1, 0x7E91, 0xF742, 0x7E93, 0xC5D5, 0x7E94, 0xC5D7, 0x7E95, 0xF7EE, + 0x7E96, 0xC5D6, 0x7E97, 0xF8B9, 0x7E98, 0xF940, 0x7E99, 0xF942, 0x7E9A, 0xF8FE, 0x7E9B, 0xF941, 0x7E9C, 0xC66C, 0x7F36, 0xA6CE, + 0x7F38, 0xACFB, 0x7F39, 0xD26F, 0x7F3A, 0xAFCA, 0x7F3D, 0xB2DA, 0x7F3E, 0xDAFC, 0x7F3F, 0xDAFD, 0x7F43, 0xEADF, 0x7F44, 0xC16A, + 0x7F45, 0xEDE1, 0x7F48, 0xC2BB, 0x7F4A, 0xF2BA, 0x7F4B, 0xF2B9, 0x7F4C, 0xC4A2, 0x7F4D, 0xF5ED, 0x7F4F, 0xF743, 0x7F50, 0xC5F8, + 0x7F51, 0xCA49, 0x7F54, 0xAAC9, 0x7F55, 0xA875, 0x7F58, 0xD04D, 0x7F5B, 0xD360, 0x7F5C, 0xD35B, 0x7F5D, 0xD35F, 0x7F5E, 0xD35D, + 0x7F5F, 0xAFCB, 0x7F60, 0xD35E, 0x7F61, 0xD35C, 0x7F63, 0xD6F1, 0x7F65, 0xDAFE, 0x7F66, 0xDB40, 0x7F67, 0xDF69, 0x7F68, 0xDF6A, + 0x7F69, 0xB86E, 0x7F6A, 0xB86F, 0x7F6B, 0xDF68, 0x7F6C, 0xDF6B, 0x7F6D, 0xDF67, 0x7F6E, 0xB86D, 0x7F70, 0xBB40, 0x7F72, 0xB870, + 0x7F73, 0xE37A, 0x7F75, 0xBD7C, 0x7F76, 0xE6F1, 0x7F77, 0xBD7D, 0x7F79, 0xBFA9, 0x7F7A, 0xEAE2, 0x7F7B, 0xEAE0, 0x7F7C, 0xEAE1, + 0x7F7D, 0xEDE4, 0x7F7E, 0xEDE3, 0x7F7F, 0xEDE2, 0x7F83, 0xF2BB, 0x7F85, 0xC3B9, 0x7F86, 0xF2BC, 0x7F87, 0xF744, 0x7F88, 0xC5F9, + 0x7F89, 0xF8BA, 0x7F8A, 0xA6CF, 0x7F8B, 0xAACB, 0x7F8C, 0xAACA, 0x7F8D, 0xD04F, 0x7F8E, 0xACFC, 0x7F91, 0xD04E, 0x7F92, 0xD362, + 0x7F94, 0xAFCC, 0x7F95, 0xD6F2, 0x7F96, 0xD361, 0x7F9A, 0xB2DC, 0x7F9B, 0xD6F5, 0x7F9C, 0xD6F3, 0x7F9D, 0xD6F4, 0x7F9E, 0xB2DB, + 0x7FA0, 0xDB42, 0x7FA1, 0xDB43, 0x7FA2, 0xDB41, 0x7FA4, 0xB873, 0x7FA5, 0xDF6D, 0x7FA6, 0xDF6C, 0x7FA7, 0xDF6E, 0x7FA8, 0xB872, + 0x7FA9, 0xB871, 0x7FAC, 0xE6F2, 0x7FAD, 0xE6F4, 0x7FAF, 0xBD7E, 0x7FB0, 0xE6F3, 0x7FB1, 0xEAE3, 0x7FB2, 0xBFAA, 0x7FB3, 0xF079, + 0x7FB5, 0xF078, 0x7FB6, 0xC3BB, 0x7FB7, 0xF2BD, 0x7FB8, 0xC3BD, 0x7FB9, 0xC3BC, 0x7FBA, 0xF4B0, 0x7FBB, 0xF5EE, 0x7FBC, 0xC4F3, + 0x7FBD, 0xA6D0, 0x7FBE, 0xD050, 0x7FBF, 0xACFD, 0x7FC0, 0xD365, 0x7FC1, 0xAFCE, 0x7FC2, 0xD364, 0x7FC3, 0xD363, 0x7FC5, 0xAFCD, + 0x7FC7, 0xD6FB, 0x7FC9, 0xD6FD, 0x7FCA, 0xD6F6, 0x7FCB, 0xD6F7, 0x7FCC, 0xB2DD, 0x7FCD, 0xD6F8, 0x7FCE, 0xB2DE, 0x7FCF, 0xD6FC, + 0x7FD0, 0xD6F9, 0x7FD1, 0xD6FA, 0x7FD2, 0xB2DF, 0x7FD4, 0xB5BE, 0x7FD5, 0xB5BF, 0x7FD7, 0xDB44, 0x7FDB, 0xDF6F, 0x7FDC, 0xDF70, + 0x7FDE, 0xE37E, 0x7FDF, 0xBB43, 0x7FE0, 0xBB41, 0x7FE1, 0xBB42, 0x7FE2, 0xE37B, 0x7FE3, 0xE37C, 0x7FE5, 0xE37D, 0x7FE6, 0xE6F9, + 0x7FE8, 0xE6FA, 0x7FE9, 0xBDA1, 0x7FEA, 0xE6F7, 0x7FEB, 0xE6F6, 0x7FEC, 0xE6F8, 0x7FED, 0xE6F5, 0x7FEE, 0xBFAD, 0x7FEF, 0xEAE4, + 0x7FF0, 0xBFAB, 0x7FF1, 0xBFAC, 0x7FF2, 0xEDE6, 0x7FF3, 0xC16B, 0x7FF4, 0xEDE5, 0x7FF5, 0xEFA8, 0x7FF7, 0xF07A, 0x7FF8, 0xF07B, + 0x7FF9, 0xC2BC, 0x7FFB, 0xC2BD, 0x7FFC, 0xC16C, 0x7FFD, 0xF2BE, 0x7FFE, 0xF2BF, 0x7FFF, 0xF4B1, 0x8000, 0xC4A3, 0x8001, 0xA6D1, + 0x8003, 0xA6D2, 0x8004, 0xACFE, 0x8005, 0xAACC, 0x8006, 0xAFCF, 0x8007, 0xD051, 0x800B, 0xB5C0, 0x800C, 0xA6D3, 0x800D, 0xAD41, + 0x800E, 0xD052, 0x800F, 0xD053, 0x8010, 0xAD40, 0x8011, 0xAD42, 0x8012, 0xA6D4, 0x8014, 0xD054, 0x8015, 0xAFD1, 0x8016, 0xD366, + 0x8017, 0xAFD3, 0x8018, 0xAFD0, 0x8019, 0xAFD2, 0x801B, 0xD741, 0x801C, 0xB2E0, 0x801E, 0xD740, 0x801F, 0xD6FE, 0x8021, 0xDF71, + 0x8024, 0xE3A1, 0x8026, 0xBDA2, 0x8028, 0xBFAE, 0x8029, 0xEAE6, 0x802A, 0xEAE5, 0x802C, 0xEDE7, 0x8030, 0xF5EF, 0x8033, 0xA6D5, + 0x8034, 0xCB73, 0x8035, 0xCDAA, 0x8036, 0xAD43, 0x8037, 0xD055, 0x8039, 0xD368, 0x803D, 0xAFD4, 0x803E, 0xD367, 0x803F, 0xAFD5, + 0x8043, 0xD743, 0x8046, 0xB2E2, 0x8047, 0xD742, 0x8048, 0xD744, 0x804A, 0xB2E1, 0x804F, 0xDB46, 0x8050, 0xDB47, 0x8051, 0xDB45, + 0x8052, 0xB5C1, 0x8056, 0xB874, 0x8058, 0xB875, 0x805A, 0xBB45, 0x805C, 0xE3A3, 0x805D, 0xE3A2, 0x805E, 0xBB44, 0x8064, 0xE6FB, + 0x8067, 0xE6FC, 0x806C, 0xEAE7, 0x806F, 0xC170, 0x8070, 0xC16F, 0x8071, 0xC16D, 0x8072, 0xC16E, 0x8073, 0xC171, 0x8075, 0xF07C, + 0x8076, 0xC2BF, 0x8077, 0xC2BE, 0x8078, 0xF2C0, 0x8079, 0xF4B2, 0x807D, 0xC5A5, 0x807E, 0xC5A4, 0x807F, 0xA6D6, 0x8082, 0xD1FB, + 0x8084, 0xB877, 0x8085, 0xB5C2, 0x8086, 0xB876, 0x8087, 0xBB46, 0x8089, 0xA6D7, 0x808A, 0xC9A9, 0x808B, 0xA6D8, 0x808C, 0xA6D9, + 0x808F, 0xCDAB, 0x8090, 0xCB76, 0x8092, 0xCB77, 0x8093, 0xA877, 0x8095, 0xCB74, 0x8096, 0xA876, 0x8098, 0xA879, 0x8099, 0xCB75, + 0x809A, 0xA87B, 0x809B, 0xA87A, 0x809C, 0xCB78, 0x809D, 0xA878, 0x80A1, 0xAAD1, 0x80A2, 0xAACF, 0x80A3, 0xCDAD, 0x80A5, 0xAACE, + 0x80A9, 0xAAD3, 0x80AA, 0xAAD5, 0x80AB, 0xAAD2, 0x80AD, 0xCDB0, 0x80AE, 0xCDAC, 0x80AF, 0xAAD6, 0x80B1, 0xAAD0, 0x80B2, 0xA87C, + 0x80B4, 0xAAD4, 0x80B5, 0xCDAF, 0x80B8, 0xCDAE, 0x80BA, 0xAACD, 0x80C2, 0xD05B, 0x80C3, 0xAD47, 0x80C4, 0xAD48, 0x80C5, 0xD05D, + 0x80C7, 0xD057, 0x80C8, 0xD05A, 0x80C9, 0xD063, 0x80CA, 0xD061, 0x80CC, 0xAD49, 0x80CD, 0xD067, 0x80CE, 0xAD4C, 0x80CF, 0xD064, + 0x80D0, 0xD05C, 0x80D1, 0xD059, 0x80D4, 0xDB49, 0x80D5, 0xD062, 0x80D6, 0xAD44, 0x80D7, 0xD065, 0x80D8, 0xD056, 0x80D9, 0xD05F, + 0x80DA, 0xAD46, 0x80DB, 0xAD4B, 0x80DC, 0xD060, 0x80DD, 0xAD4F, 0x80DE, 0xAD4D, 0x80E0, 0xD058, 0x80E1, 0xAD4A, 0x80E3, 0xD05E, + 0x80E4, 0xAD4E, 0x80E5, 0xAD45, 0x80E6, 0xD066, 0x80ED, 0xAFDA, 0x80EF, 0xAFE3, 0x80F0, 0xAFD8, 0x80F1, 0xAFD6, 0x80F2, 0xD36A, + 0x80F3, 0xAFDE, 0x80F4, 0xAFDB, 0x80F5, 0xD36C, 0x80F8, 0xAFDD, 0x80F9, 0xD36B, 0x80FA, 0xD369, 0x80FB, 0xD36E, 0x80FC, 0xAFE2, + 0x80FD, 0xAFE0, 0x80FE, 0xDB48, 0x8100, 0xD36F, 0x8101, 0xD36D, 0x8102, 0xAFD7, 0x8105, 0xAFD9, 0x8106, 0xAFDC, 0x8108, 0xAFDF, + 0x810A, 0xAFE1, 0x8115, 0xD74E, 0x8116, 0xB2E4, 0x8118, 0xD745, 0x8119, 0xD747, 0x811B, 0xD748, 0x811D, 0xD750, 0x811E, 0xD74C, + 0x811F, 0xD74A, 0x8121, 0xD74D, 0x8122, 0xD751, 0x8123, 0xB2E5, 0x8124, 0xB2E9, 0x8125, 0xD746, 0x8127, 0xD74F, 0x8129, 0xB2E7, + 0x812B, 0xB2E6, 0x812C, 0xD74B, 0x812D, 0xD749, 0x812F, 0xB2E3, 0x8130, 0xB2E8, 0x8139, 0xB5C8, 0x813A, 0xDB51, 0x813D, 0xDB4F, + 0x813E, 0xB5CA, 0x8143, 0xDB4A, 0x8144, 0xDFA1, 0x8146, 0xB5C9, 0x8147, 0xDB4E, 0x814A, 0xDB4B, 0x814B, 0xB5C5, 0x814C, 0xB5CB, + 0x814D, 0xDB50, 0x814E, 0xB5C7, 0x814F, 0xDB4D, 0x8150, 0xBB47, 0x8151, 0xB5C6, 0x8152, 0xDB4C, 0x8153, 0xB5CC, 0x8154, 0xB5C4, + 0x8155, 0xB5C3, 0x815B, 0xDF77, 0x815C, 0xDF75, 0x815E, 0xDF7B, 0x8160, 0xDF73, 0x8161, 0xDFA2, 0x8162, 0xDF78, 0x8164, 0xDF72, + 0x8165, 0xB87B, 0x8166, 0xB8A3, 0x8167, 0xDF7D, 0x8169, 0xDF76, 0x816B, 0xB87E, 0x816E, 0xB87C, 0x816F, 0xDF7E, 0x8170, 0xB879, + 0x8171, 0xB878, 0x8172, 0xDF79, 0x8173, 0xB87D, 0x8174, 0xB5CD, 0x8176, 0xDF7C, 0x8177, 0xDF74, 0x8178, 0xB87A, 0x8179, 0xB8A1, + 0x817A, 0xB8A2, 0x817F, 0xBB4C, 0x8180, 0xBB48, 0x8182, 0xBB4D, 0x8183, 0xE3A6, 0x8186, 0xE3A5, 0x8187, 0xE3A7, 0x8188, 0xBB4A, + 0x8189, 0xE3A4, 0x818A, 0xBB4B, 0x818B, 0xE3AA, 0x818C, 0xE3A9, 0x818D, 0xE3A8, 0x818F, 0xBB49, 0x8195, 0xE741, 0x8197, 0xE744, + 0x8198, 0xBDA8, 0x8199, 0xE743, 0x819A, 0xBDA7, 0x819B, 0xBDA3, 0x819C, 0xBDA4, 0x819D, 0xBDA5, 0x819E, 0xE740, 0x819F, 0xE6FE, + 0x81A0, 0xBDA6, 0x81A2, 0xE742, 0x81A3, 0xE6FD, 0x81A6, 0xEAE9, 0x81A7, 0xEAF3, 0x81A8, 0xBFB1, 0x81A9, 0xBFB0, 0x81AB, 0xEAED, + 0x81AC, 0xEAEF, 0x81AE, 0xEAEA, 0x81B0, 0xEAEE, 0x81B1, 0xEAE8, 0x81B2, 0xEAF1, 0x81B3, 0xBFAF, 0x81B4, 0xEAF0, 0x81B5, 0xEAEC, + 0x81B7, 0xEAF2, 0x81B9, 0xEAEB, 0x81BA, 0xC174, 0x81BB, 0xEDE8, 0x81BC, 0xEDEE, 0x81BD, 0xC178, 0x81BE, 0xC17A, 0x81BF, 0xC177, + 0x81C0, 0xC176, 0x81C2, 0xC175, 0x81C3, 0xC173, 0x81C4, 0xEDE9, 0x81C5, 0xEDEC, 0x81C6, 0xC172, 0x81C7, 0xEDED, 0x81C9, 0xC179, + 0x81CA, 0xEDEB, 0x81CC, 0xEDEA, 0x81CD, 0xC2C0, 0x81CF, 0xC2C1, 0x81D0, 0xF0A1, 0x81D1, 0xF07D, 0x81D2, 0xF07E, 0x81D5, 0xF2C2, + 0x81D7, 0xF2C1, 0x81D8, 0xC3BE, 0x81D9, 0xF4B4, 0x81DA, 0xC4A4, 0x81DB, 0xF4B3, 0x81DD, 0xF5F0, 0x81DE, 0xF745, 0x81DF, 0xC5A6, + 0x81E0, 0xF943, 0x81E1, 0xF944, 0x81E2, 0xC5D8, 0x81E3, 0xA6DA, 0x81E5, 0xAAD7, 0x81E6, 0xDB52, 0x81E7, 0xBB4E, 0x81E8, 0xC17B, + 0x81E9, 0xEDEF, 0x81EA, 0xA6DB, 0x81EC, 0xAFE5, 0x81ED, 0xAFE4, 0x81EE, 0xDB53, 0x81F2, 0xEAF4, 0x81F3, 0xA6DC, 0x81F4, 0xAD50, + 0x81F7, 0xDB54, 0x81F8, 0xDB55, 0x81F9, 0xDB56, 0x81FA, 0xBB4F, 0x81FB, 0xBFB2, 0x81FC, 0xA6DD, 0x81FE, 0xAAD8, 0x81FF, 0xD068, + 0x8200, 0xAFE6, 0x8201, 0xD370, 0x8202, 0xB2EA, 0x8204, 0xDB57, 0x8205, 0xB8A4, 0x8207, 0xBB50, 0x8208, 0xBFB3, 0x8209, 0xC17C, + 0x820A, 0xC2C2, 0x820B, 0xF4B5, 0x820C, 0xA6DE, 0x820D, 0xAAD9, 0x8210, 0xAFE7, 0x8211, 0xD752, 0x8212, 0xB5CE, 0x8214, 0xBB51, + 0x8215, 0xE3AB, 0x8216, 0xE745, 0x821B, 0xA6DF, 0x821C, 0xB5CF, 0x821D, 0xDFA3, 0x821E, 0xBB52, 0x821F, 0xA6E0, 0x8220, 0xCDB1, + 0x8221, 0xD069, 0x8222, 0xAD51, 0x8225, 0xD372, 0x8228, 0xAFEA, 0x822A, 0xAFE8, 0x822B, 0xAFE9, 0x822C, 0xAFEB, 0x822F, 0xD371, + 0x8232, 0xD757, 0x8233, 0xD754, 0x8234, 0xD756, 0x8235, 0xB2EB, 0x8236, 0xB2ED, 0x8237, 0xB2EC, 0x8238, 0xD753, 0x8239, 0xB2EE, + 0x823A, 0xD755, 0x823C, 0xDB58, 0x823D, 0xDB59, 0x823F, 0xDB5A, 0x8240, 0xDFA6, 0x8242, 0xDFA7, 0x8244, 0xDFA5, 0x8245, 0xDFA8, + 0x8247, 0xB8A5, 0x8249, 0xDFA4, 0x824B, 0xBB53, 0x824E, 0xE74A, 0x824F, 0xE746, 0x8250, 0xE749, 0x8251, 0xE74B, 0x8252, 0xE748, + 0x8253, 0xE747, 0x8255, 0xEAF5, 0x8256, 0xEAF6, 0x8257, 0xEAF7, 0x8258, 0xBFB4, 0x8259, 0xBFB5, 0x825A, 0xEDF1, 0x825B, 0xEDF0, + 0x825C, 0xEDF2, 0x825E, 0xF0A3, 0x825F, 0xF0A2, 0x8261, 0xF2C4, 0x8263, 0xF2C5, 0x8264, 0xF2C3, 0x8266, 0xC4A5, 0x8268, 0xF4B6, + 0x8269, 0xF4B7, 0x826B, 0xF746, 0x826C, 0xF7EF, 0x826D, 0xF8BB, 0x826E, 0xA6E1, 0x826F, 0xA87D, 0x8271, 0xC17D, 0x8272, 0xA6E2, + 0x8274, 0xD758, 0x8275, 0xDB5B, 0x8277, 0xC641, 0x8278, 0xCA4A, 0x827C, 0xCA4B, 0x827D, 0xCA4D, 0x827E, 0xA6E3, 0x827F, 0xCA4E, + 0x8280, 0xCA4C, 0x8283, 0xCBA2, 0x8284, 0xCBA3, 0x8285, 0xCB7B, 0x828A, 0xCBA1, 0x828B, 0xA8A1, 0x828D, 0xA8A2, 0x828E, 0xCB7C, + 0x828F, 0xCB7A, 0x8290, 0xCB79, 0x8291, 0xCB7D, 0x8292, 0xA87E, 0x8293, 0xCB7E, 0x8294, 0xD06A, 0x8298, 0xCDB6, 0x8299, 0xAADC, + 0x829A, 0xCDB5, 0x829B, 0xCDB7, 0x829D, 0xAADB, 0x829E, 0xCDBC, 0x829F, 0xAADF, 0x82A0, 0xCDB2, 0x82A1, 0xCDC0, 0x82A2, 0xCDC6, + 0x82A3, 0xAAE6, 0x82A4, 0xCDC3, 0x82A5, 0xAAE3, 0x82A7, 0xCDB9, 0x82A8, 0xCDBF, 0x82A9, 0xCDC1, 0x82AB, 0xCDB4, 0x82AC, 0xAAE2, + 0x82AD, 0xAADD, 0x82AE, 0xCDBA, 0x82AF, 0xAAE4, 0x82B0, 0xAAE7, 0x82B1, 0xAAE1, 0x82B3, 0xAADA, 0x82B4, 0xCDBE, 0x82B5, 0xCDB8, + 0x82B6, 0xCDC5, 0x82B7, 0xAAE9, 0x82B8, 0xAAE5, 0x82B9, 0xAAE0, 0x82BA, 0xCDBD, 0x82BB, 0xAFEC, 0x82BC, 0xCDBB, 0x82BD, 0xAADE, + 0x82BE, 0xAAE8, 0x82C0, 0xCDB3, 0x82C2, 0xCDC2, 0x82C3, 0xCDC4, 0x82D1, 0xAD62, 0x82D2, 0xAD5C, 0x82D3, 0xAD64, 0x82D4, 0xAD61, + 0x82D5, 0xD071, 0x82D6, 0xD074, 0x82D7, 0xAD5D, 0x82D9, 0xD06B, 0x82DB, 0xAD56, 0x82DC, 0xAD60, 0x82DE, 0xAD63, 0x82DF, 0xAD65, + 0x82E0, 0xD0A2, 0x82E1, 0xD077, 0x82E3, 0xAD55, 0x82E4, 0xD0A1, 0x82E5, 0xAD59, 0x82E6, 0xAD57, 0x82E7, 0xAD52, 0x82E8, 0xD06F, + 0x82EA, 0xD07E, 0x82EB, 0xD073, 0x82EC, 0xD076, 0x82ED, 0xD0A5, 0x82EF, 0xAD66, 0x82F0, 0xD07D, 0x82F1, 0xAD5E, 0x82F2, 0xD078, + 0x82F3, 0xD0A4, 0x82F4, 0xD075, 0x82F5, 0xD079, 0x82F6, 0xD07C, 0x82F9, 0xD06D, 0x82FA, 0xD0A3, 0x82FB, 0xD07B, 0x82FE, 0xD06C, + 0x8300, 0xD070, 0x8301, 0xAD5F, 0x8302, 0xAD5A, 0x8303, 0xAD53, 0x8304, 0xAD58, 0x8305, 0xAD54, 0x8306, 0xAD67, 0x8307, 0xD06E, + 0x8308, 0xD3A5, 0x8309, 0xAD5B, 0x830C, 0xD07A, 0x830D, 0xCE41, 0x8316, 0xD3A8, 0x8317, 0xAFFA, 0x8319, 0xD376, 0x831B, 0xD3A3, + 0x831C, 0xD37D, 0x831E, 0xD3B2, 0x8320, 0xD3AA, 0x8322, 0xD37E, 0x8324, 0xD3A9, 0x8325, 0xD378, 0x8326, 0xD37C, 0x8327, 0xD3B5, + 0x8328, 0xAFFD, 0x8329, 0xD3AD, 0x832A, 0xD3A4, 0x832B, 0xAFED, 0x832C, 0xD3B3, 0x832D, 0xD374, 0x832F, 0xD3AC, 0x8331, 0xAFFC, + 0x8332, 0xAFF7, 0x8333, 0xD373, 0x8334, 0xAFF5, 0x8335, 0xAFF4, 0x8336, 0xAFF9, 0x8337, 0xD3AB, 0x8338, 0xAFF1, 0x8339, 0xAFF8, + 0x833A, 0xD072, 0x833B, 0xDB5C, 0x833C, 0xD3A6, 0x833F, 0xD37A, 0x8340, 0xAFFB, 0x8341, 0xD37B, 0x8342, 0xD3A1, 0x8343, 0xAFFE, + 0x8344, 0xD375, 0x8345, 0xD3AF, 0x8347, 0xD3AE, 0x8348, 0xD3B6, 0x8349, 0xAFF3, 0x834A, 0xAFF0, 0x834B, 0xD3B4, 0x834C, 0xD3B0, + 0x834D, 0xD3A7, 0x834E, 0xD3A2, 0x834F, 0xAFF6, 0x8350, 0xAFF2, 0x8351, 0xD377, 0x8352, 0xAFEE, 0x8353, 0xD3B1, 0x8354, 0xAFEF, + 0x8356, 0xD379, 0x8373, 0xD75E, 0x8374, 0xD760, 0x8375, 0xD765, 0x8376, 0xD779, 0x8377, 0xB2FC, 0x8378, 0xB2F2, 0x837A, 0xD75D, + 0x837B, 0xB2FD, 0x837C, 0xB2FE, 0x837D, 0xD768, 0x837E, 0xD76F, 0x837F, 0xD775, 0x8381, 0xD762, 0x8383, 0xD769, 0x8386, 0xB340, + 0x8387, 0xD777, 0x8388, 0xD772, 0x8389, 0xB2FA, 0x838A, 0xB2F8, 0x838B, 0xD76E, 0x838C, 0xD76A, 0x838D, 0xD75C, 0x838E, 0xB2EF, + 0x838F, 0xD761, 0x8390, 0xD759, 0x8392, 0xB2F7, 0x8393, 0xB2F9, 0x8394, 0xD766, 0x8395, 0xD763, 0x8396, 0xB2F4, 0x8397, 0xD773, + 0x8398, 0xB2F1, 0x8399, 0xD764, 0x839A, 0xD77A, 0x839B, 0xD76C, 0x839D, 0xD76B, 0x839E, 0xB2F0, 0x83A0, 0xB2FB, 0x83A2, 0xB2F3, + 0x83A3, 0xD75A, 0x83A4, 0xD75F, 0x83A5, 0xD770, 0x83A6, 0xD776, 0x83A7, 0xB341, 0x83A8, 0xD75B, 0x83A9, 0xD767, 0x83AA, 0xD76D, + 0x83AB, 0xB2F6, 0x83AE, 0xD778, 0x83AF, 0xD771, 0x83B0, 0xD774, 0x83BD, 0xB2F5, 0x83BF, 0xDB6C, 0x83C0, 0xDB60, 0x83C1, 0xB5D7, + 0x83C2, 0xDB7D, 0x83C3, 0xDBA7, 0x83C4, 0xDBAA, 0x83C5, 0xB5D5, 0x83C6, 0xDB68, 0x83C7, 0xDBA3, 0x83C8, 0xDB69, 0x83C9, 0xDB77, + 0x83CA, 0xB5E2, 0x83CB, 0xDB73, 0x83CC, 0xB5DF, 0x83CE, 0xDB74, 0x83CF, 0xDB5D, 0x83D1, 0xDBA4, 0x83D4, 0xB5E8, 0x83D5, 0xDBA1, + 0x83D6, 0xDB75, 0x83D7, 0xDBAC, 0x83D8, 0xDB70, 0x83D9, 0xDFC8, 0x83DB, 0xDBAF, 0x83DC, 0xB5E6, 0x83DD, 0xDB6E, 0x83DE, 0xDB7A, + 0x83DF, 0xB5E9, 0x83E0, 0xB5D4, 0x83E1, 0xDB72, 0x83E2, 0xDBAD, 0x83E3, 0xDB6B, 0x83E4, 0xDB64, 0x83E5, 0xDB6F, 0x83E7, 0xDB63, + 0x83E8, 0xDB61, 0x83E9, 0xB5D0, 0x83EA, 0xDBA5, 0x83EB, 0xDB6A, 0x83EC, 0xDBA8, 0x83EE, 0xDBA9, 0x83EF, 0xB5D8, 0x83F0, 0xB5DD, + 0x83F1, 0xB5D9, 0x83F2, 0xB5E1, 0x83F3, 0xDB7E, 0x83F4, 0xB5DA, 0x83F5, 0xDB76, 0x83F6, 0xDB66, 0x83F8, 0xB5D2, 0x83F9, 0xDB5E, + 0x83FA, 0xDBA2, 0x83FB, 0xDBAB, 0x83FC, 0xDB65, 0x83FD, 0xB5E0, 0x83FE, 0xDBB0, 0x83FF, 0xDB71, 0x8401, 0xDB6D, 0x8403, 0xB5D1, + 0x8404, 0xB5E5, 0x8406, 0xDB7C, 0x8407, 0xB5E7, 0x8409, 0xDB78, 0x840A, 0xB5DC, 0x840B, 0xB5D6, 0x840C, 0xB5DE, 0x840D, 0xB5D3, + 0x840E, 0xB5E4, 0x840F, 0xDB79, 0x8410, 0xDB67, 0x8411, 0xDB7B, 0x8412, 0xDB62, 0x8413, 0xDBA6, 0x841B, 0xDBAE, 0x8423, 0xDB5F, + 0x8429, 0xDFC7, 0x842B, 0xDFDD, 0x842C, 0xB855, 0x842D, 0xDFCC, 0x842F, 0xDFCA, 0x8430, 0xDFB5, 0x8431, 0xB8A9, 0x8432, 0xDFC5, + 0x8433, 0xDFD9, 0x8434, 0xDFC1, 0x8435, 0xB8B1, 0x8436, 0xDFD8, 0x8437, 0xDFBF, 0x8438, 0xB5E3, 0x8439, 0xDFCF, 0x843A, 0xDFC0, + 0x843B, 0xDFD6, 0x843C, 0xB8B0, 0x843D, 0xB8A8, 0x843F, 0xDFAA, 0x8440, 0xDFB2, 0x8442, 0xDFCB, 0x8443, 0xDFC3, 0x8444, 0xDFDC, + 0x8445, 0xDFC6, 0x8446, 0xB8B6, 0x8447, 0xDFD7, 0x8449, 0xB8AD, 0x844B, 0xDFC9, 0x844C, 0xDFD1, 0x844D, 0xDFB6, 0x844E, 0xDFD0, + 0x8450, 0xDFE1, 0x8451, 0xDFB1, 0x8452, 0xDFD2, 0x8454, 0xDFDF, 0x8456, 0xDFAB, 0x8457, 0xB5DB, 0x8459, 0xDFB9, 0x845A, 0xDFB8, + 0x845B, 0xB8AF, 0x845D, 0xDFBC, 0x845E, 0xDFBE, 0x845F, 0xDFCD, 0x8460, 0xDFDE, 0x8461, 0xB8B2, 0x8463, 0xB8B3, 0x8465, 0xDFB0, + 0x8466, 0xB8AB, 0x8467, 0xDFB4, 0x8468, 0xDFDA, 0x8469, 0xB8B4, 0x846B, 0xB8AC, 0x846C, 0xB8AE, 0x846D, 0xB8B5, 0x846E, 0xDFE0, + 0x846F, 0xDFD3, 0x8470, 0xDFCE, 0x8473, 0xDFBB, 0x8474, 0xDFBA, 0x8475, 0xB8AA, 0x8476, 0xDFAC, 0x8477, 0xB8A7, 0x8478, 0xDFC4, + 0x8479, 0xDFAD, 0x847A, 0xDFC2, 0x847D, 0xDFB7, 0x847E, 0xDFDB, 0x8482, 0xB8A6, 0x8486, 0xDFB3, 0x848D, 0xDFAF, 0x848E, 0xDFD5, + 0x848F, 0xDFAE, 0x8490, 0xBB60, 0x8491, 0xE3D3, 0x8494, 0xE3C2, 0x8497, 0xE3AC, 0x8498, 0xE3CA, 0x8499, 0xBB58, 0x849A, 0xE3BB, + 0x849B, 0xE3C5, 0x849C, 0xBB5B, 0x849D, 0xE3BE, 0x849E, 0xBB59, 0x849F, 0xE3AF, 0x84A0, 0xE3CD, 0x84A1, 0xE3AE, 0x84A2, 0xE3C1, + 0x84A4, 0xE3AD, 0x84A7, 0xE3BF, 0x84A8, 0xE3C8, 0x84A9, 0xE3C6, 0x84AA, 0xE3BA, 0x84AB, 0xE3B5, 0x84AC, 0xE3B3, 0x84AE, 0xE3B4, + 0x84AF, 0xE3C7, 0x84B0, 0xE3D2, 0x84B1, 0xE3BC, 0x84B2, 0xBB5A, 0x84B4, 0xE3B7, 0x84B6, 0xE3CB, 0x84B8, 0xBB5D, 0x84B9, 0xE3B6, + 0x84BA, 0xE3B0, 0x84BB, 0xE3C0, 0x84BC, 0xBB61, 0x84BF, 0xBB55, 0x84C0, 0xBB5E, 0x84C1, 0xE3B8, 0x84C2, 0xE3B2, 0x84C4, 0xBB57, + 0x84C5, 0xDFD4, 0x84C6, 0xBB56, 0x84C7, 0xE3C3, 0x84C9, 0xBB54, 0x84CA, 0xBB63, 0x84CB, 0xBB5C, 0x84CC, 0xE3C4, 0x84CD, 0xE3B9, + 0x84CE, 0xE3B1, 0x84CF, 0xE3CC, 0x84D0, 0xE3BD, 0x84D1, 0xBB62, 0x84D2, 0xE3D0, 0x84D3, 0xBB5F, 0x84D4, 0xE3CF, 0x84D6, 0xE3C9, + 0x84D7, 0xE3CE, 0x84DB, 0xE3D1, 0x84E7, 0xE773, 0x84E8, 0xE774, 0x84E9, 0xE767, 0x84EA, 0xE766, 0x84EB, 0xE762, 0x84EC, 0xBDB4, + 0x84EE, 0xBDAC, 0x84EF, 0xE776, 0x84F0, 0xE775, 0x84F1, 0xDFA9, 0x84F2, 0xE75F, 0x84F3, 0xE763, 0x84F4, 0xE75D, 0x84F6, 0xE770, + 0x84F7, 0xE761, 0x84F9, 0xE777, 0x84FA, 0xE75A, 0x84FB, 0xE758, 0x84FC, 0xE764, 0x84FD, 0xE76E, 0x84FE, 0xE769, 0x84FF, 0xBDB6, + 0x8500, 0xE74F, 0x8502, 0xE76D, 0x8506, 0xBDB7, 0x8507, 0xDFBD, 0x8508, 0xE75B, 0x8509, 0xE752, 0x850A, 0xE755, 0x850B, 0xE77B, + 0x850C, 0xE75C, 0x850D, 0xE753, 0x850E, 0xE751, 0x850F, 0xE74E, 0x8511, 0xBDB0, 0x8512, 0xE765, 0x8513, 0xBDAF, 0x8514, 0xBDB3, + 0x8515, 0xE760, 0x8516, 0xE768, 0x8517, 0xBDA9, 0x8518, 0xE778, 0x8519, 0xE77C, 0x851A, 0xBDAB, 0x851C, 0xE757, 0x851D, 0xE76B, + 0x851E, 0xE76F, 0x851F, 0xE754, 0x8520, 0xE779, 0x8521, 0xBDB2, 0x8523, 0xBDB1, 0x8524, 0xE74C, 0x8525, 0xBDB5, 0x8526, 0xE772, + 0x8527, 0xE756, 0x8528, 0xE76A, 0x8529, 0xE750, 0x852A, 0xE75E, 0x852B, 0xE759, 0x852C, 0xBDAD, 0x852D, 0xBDAE, 0x852E, 0xE76C, + 0x852F, 0xE77D, 0x8530, 0xE77A, 0x8531, 0xE771, 0x853B, 0xE74D, 0x853D, 0xBDAA, 0x853E, 0xEB49, 0x8540, 0xEB40, 0x8541, 0xEB43, + 0x8543, 0xBFBB, 0x8544, 0xEB45, 0x8545, 0xEAF9, 0x8546, 0xEB41, 0x8547, 0xEB47, 0x8548, 0xBFB8, 0x8549, 0xBFBC, 0x854A, 0xBFB6, + 0x854D, 0xEAFB, 0x854E, 0xEB4C, 0x8551, 0xEB46, 0x8553, 0xEAFC, 0x8554, 0xEB55, 0x8555, 0xEB4F, 0x8556, 0xEAF8, 0x8557, 0xEE46, + 0x8558, 0xEAFE, 0x8559, 0xBFB7, 0x855B, 0xEB4A, 0x855D, 0xEB54, 0x855E, 0xBFBF, 0x8560, 0xEB51, 0x8561, 0xEAFD, 0x8562, 0xEB44, + 0x8563, 0xEB48, 0x8564, 0xEB42, 0x8565, 0xEB56, 0x8566, 0xEB53, 0x8567, 0xEB50, 0x8568, 0xBFB9, 0x8569, 0xBFBA, 0x856A, 0xBFBE, + 0x856B, 0xEAFA, 0x856C, 0xEB57, 0x856D, 0xBFBD, 0x856E, 0xEB4D, 0x8571, 0xEB4B, 0x8575, 0xEB4E, 0x8576, 0xEE53, 0x8577, 0xEE40, + 0x8578, 0xEE45, 0x8579, 0xEE52, 0x857A, 0xEE44, 0x857B, 0xEDFB, 0x857C, 0xEE41, 0x857E, 0xC1A2, 0x8580, 0xEDF4, 0x8581, 0xEE4D, + 0x8582, 0xEE4F, 0x8583, 0xEDF3, 0x8584, 0xC1A1, 0x8585, 0xEE51, 0x8586, 0xEE49, 0x8587, 0xC1A8, 0x8588, 0xEE50, 0x8589, 0xEE42, + 0x858A, 0xC1AA, 0x858B, 0xEDF9, 0x858C, 0xEB52, 0x858D, 0xEE4A, 0x858E, 0xEE47, 0x858F, 0xEDF5, 0x8590, 0xEE55, 0x8591, 0xC1A4, + 0x8594, 0xC1A5, 0x8595, 0xEDF7, 0x8596, 0xEE48, 0x8598, 0xEE54, 0x8599, 0xEE4B, 0x859A, 0xEDFD, 0x859B, 0xC1A7, 0x859C, 0xC1A3, + 0x859D, 0xEE4C, 0x859E, 0xEDFE, 0x859F, 0xEE56, 0x85A0, 0xEDF8, 0x85A1, 0xEE43, 0x85A2, 0xEE4E, 0x85A3, 0xEDFA, 0x85A4, 0xEDFC, + 0x85A6, 0xC2CB, 0x85A7, 0xEDF6, 0x85A8, 0xC1A9, 0x85A9, 0xC2C4, 0x85AA, 0xC17E, 0x85AF, 0xC1A6, 0x85B0, 0xC2C8, 0x85B1, 0xF0B3, + 0x85B3, 0xF0A9, 0x85B4, 0xF0A4, 0x85B5, 0xF0AA, 0x85B6, 0xF0B4, 0x85B7, 0xF0B8, 0x85B8, 0xF0B7, 0x85B9, 0xC2CA, 0x85BA, 0xC2C9, + 0x85BD, 0xF0AB, 0x85BE, 0xF0B9, 0x85BF, 0xF0AE, 0x85C0, 0xF0A6, 0x85C2, 0xF0A8, 0x85C3, 0xF0A7, 0x85C4, 0xF0AD, 0x85C5, 0xF0B2, + 0x85C6, 0xF0A5, 0x85C7, 0xF0AC, 0x85C8, 0xF0B1, 0x85C9, 0xC2C7, 0x85CB, 0xF0AF, 0x85CD, 0xC2C5, 0x85CE, 0xF0B0, 0x85CF, 0xC2C3, + 0x85D0, 0xC2C6, 0x85D1, 0xF2D5, 0x85D2, 0xF0B5, 0x85D5, 0xC3C2, 0x85D7, 0xF2CD, 0x85D8, 0xF2D1, 0x85D9, 0xF2C9, 0x85DA, 0xF2CC, + 0x85DC, 0xF2D4, 0x85DD, 0xC3C0, 0x85DE, 0xF2D9, 0x85DF, 0xF2D2, 0x85E1, 0xF2CA, 0x85E2, 0xF2DA, 0x85E3, 0xF2D3, 0x85E4, 0xC3C3, + 0x85E5, 0xC3C4, 0x85E6, 0xF2D7, 0x85E8, 0xF2CB, 0x85E9, 0xC3BF, 0x85EA, 0xC3C1, 0x85EB, 0xF2C6, 0x85EC, 0xF2CE, 0x85ED, 0xF2C8, + 0x85EF, 0xF2D8, 0x85F0, 0xF2D6, 0x85F1, 0xF2C7, 0x85F2, 0xF2CF, 0x85F6, 0xF4BE, 0x85F7, 0xC3C5, 0x85F8, 0xF2D0, 0x85F9, 0xC4A7, + 0x85FA, 0xC4A9, 0x85FB, 0xC4A6, 0x85FD, 0xF4C3, 0x85FE, 0xF4BB, 0x85FF, 0xF4B9, 0x8600, 0xF4BD, 0x8601, 0xF4BA, 0x8604, 0xF4BF, + 0x8605, 0xF4C1, 0x8606, 0xC4AA, 0x8607, 0xC4AC, 0x8609, 0xF4C0, 0x860A, 0xC4AD, 0x860B, 0xC4AB, 0x860C, 0xF4C2, 0x8611, 0xC4A8, + 0x8617, 0xC4F4, 0x8618, 0xF5F1, 0x8619, 0xF5F7, 0x861A, 0xC4F6, 0x861B, 0xF4BC, 0x861C, 0xF5F6, 0x861E, 0xF5FD, 0x861F, 0xF5F4, + 0x8620, 0xF5FB, 0x8621, 0xF5FA, 0x8622, 0xF4B8, 0x8623, 0xF5F5, 0x8624, 0xF0B6, 0x8625, 0xF5FE, 0x8626, 0xF5F3, 0x8627, 0xF5F8, + 0x8629, 0xF5FC, 0x862A, 0xF5F2, 0x862C, 0xF74A, 0x862D, 0xC4F5, 0x862E, 0xF5F9, 0x8631, 0xF7F4, 0x8632, 0xF74B, 0x8633, 0xF749, + 0x8634, 0xF747, 0x8635, 0xF748, 0x8636, 0xF74C, 0x8638, 0xC5D9, 0x8639, 0xF7F2, 0x863A, 0xF7F0, 0x863B, 0xF7F5, 0x863C, 0xF7F3, + 0x863E, 0xF7F6, 0x863F, 0xC5DA, 0x8640, 0xF7F1, 0x8643, 0xF8BC, 0x8646, 0xF945, 0x8647, 0xF946, 0x8648, 0xF947, 0x864B, 0xF9C7, + 0x864C, 0xF9BD, 0x864D, 0xCA4F, 0x864E, 0xAAEA, 0x8650, 0xAD68, 0x8652, 0xD3B8, 0x8653, 0xD3B7, 0x8654, 0xB040, 0x8655, 0xB342, + 0x8656, 0xD77C, 0x8659, 0xD77B, 0x865B, 0xB5EA, 0x865C, 0xB8B8, 0x865E, 0xB8B7, 0x865F, 0xB8B9, 0x8661, 0xE3D4, 0x8662, 0xE77E, + 0x8663, 0xEB58, 0x8664, 0xEB5A, 0x8665, 0xEB59, 0x8667, 0xC1AB, 0x8668, 0xEE57, 0x8669, 0xF0BA, 0x866A, 0xF9A5, 0x866B, 0xA6E4, + 0x866D, 0xCDC9, 0x866E, 0xCDCA, 0x866F, 0xCDC8, 0x8670, 0xCDC7, 0x8671, 0xAAEB, 0x8673, 0xD0A9, 0x8674, 0xD0A7, 0x8677, 0xD0A6, + 0x8679, 0xAD69, 0x867A, 0xAD6B, 0x867B, 0xAD6A, 0x867C, 0xD0A8, 0x8685, 0xD3C4, 0x8686, 0xD3C1, 0x8687, 0xD3BF, 0x868A, 0xB041, + 0x868B, 0xD3C2, 0x868C, 0xB046, 0x868D, 0xD3BC, 0x868E, 0xD3CB, 0x8690, 0xD3CD, 0x8691, 0xD3BD, 0x8693, 0xB043, 0x8694, 0xD3CE, + 0x8695, 0xD3C9, 0x8696, 0xD3BB, 0x8697, 0xD3C0, 0x8698, 0xD3CA, 0x8699, 0xD3C6, 0x869A, 0xD3C3, 0x869C, 0xB048, 0x869D, 0xD3CC, + 0x869E, 0xD3BE, 0x86A1, 0xD3C7, 0x86A2, 0xD3B9, 0x86A3, 0xB047, 0x86A4, 0xB044, 0x86A5, 0xD3C5, 0x86A7, 0xD3C8, 0x86A8, 0xD3BA, + 0x86A9, 0xB045, 0x86AA, 0xB042, 0x86AF, 0xB34C, 0x86B0, 0xD7A5, 0x86B1, 0xB34B, 0x86B3, 0xD7A8, 0x86B4, 0xD7AB, 0x86B5, 0xB348, + 0x86B6, 0xB346, 0x86B7, 0xD77E, 0x86B8, 0xD7A9, 0x86B9, 0xD7A7, 0x86BA, 0xD7A4, 0x86BB, 0xD7AC, 0x86BC, 0xD7AD, 0x86BD, 0xD7AF, + 0x86BE, 0xD7B0, 0x86BF, 0xD77D, 0x86C0, 0xB345, 0x86C1, 0xD7A2, 0x86C2, 0xD7A1, 0x86C3, 0xD7AE, 0x86C4, 0xB347, 0x86C5, 0xD7A3, + 0x86C6, 0xB349, 0x86C7, 0xB344, 0x86C8, 0xD7A6, 0x86C9, 0xB34D, 0x86CB, 0xB34A, 0x86CC, 0xD7AA, 0x86D0, 0xB5F1, 0x86D1, 0xDBBF, + 0x86D3, 0xDBB4, 0x86D4, 0xB5EE, 0x86D6, 0xDFE7, 0x86D7, 0xDBBD, 0x86D8, 0xDBB1, 0x86D9, 0xB5EC, 0x86DA, 0xDBB6, 0x86DB, 0xB5EF, + 0x86DC, 0xDBBA, 0x86DD, 0xDBB8, 0x86DE, 0xB5F2, 0x86DF, 0xB5EB, 0x86E2, 0xDBB2, 0x86E3, 0xDBB5, 0x86E4, 0xB5F0, 0x86E6, 0xDBB3, + 0x86E8, 0xDBBE, 0x86E9, 0xDBBC, 0x86EA, 0xDBB7, 0x86EB, 0xDBB9, 0x86EC, 0xDBBB, 0x86ED, 0xB5ED, 0x86F5, 0xDFE8, 0x86F6, 0xDFEE, + 0x86F7, 0xDFE4, 0x86F8, 0xDFEA, 0x86F9, 0xB8BA, 0x86FA, 0xDFE6, 0x86FB, 0xB8C0, 0x86FE, 0xB8BF, 0x8700, 0xB8BE, 0x8701, 0xDFED, + 0x8702, 0xB8C1, 0x8703, 0xB8C2, 0x8704, 0xDFE3, 0x8705, 0xDFF0, 0x8706, 0xB8C3, 0x8707, 0xB8BD, 0x8708, 0xB8BC, 0x8709, 0xDFEC, + 0x870A, 0xB8C4, 0x870B, 0xDFE2, 0x870C, 0xDFE5, 0x870D, 0xDFEF, 0x870E, 0xDFEB, 0x8711, 0xE3F4, 0x8712, 0xE3E9, 0x8713, 0xB8BB, + 0x8718, 0xBB6A, 0x8719, 0xE3DD, 0x871A, 0xE3F2, 0x871B, 0xE3DE, 0x871C, 0xBB65, 0x871E, 0xE3DB, 0x8720, 0xE3E4, 0x8721, 0xE3DC, + 0x8722, 0xBB67, 0x8723, 0xE3D6, 0x8724, 0xE3F1, 0x8725, 0xBB68, 0x8726, 0xE3EE, 0x8727, 0xE3EF, 0x8728, 0xE3D7, 0x8729, 0xBB6D, + 0x872A, 0xE3E6, 0x872C, 0xE3E0, 0x872D, 0xE3E7, 0x872E, 0xE3DA, 0x8730, 0xE3F3, 0x8731, 0xE3EB, 0x8732, 0xE3E5, 0x8733, 0xE3D5, + 0x8734, 0xBB69, 0x8735, 0xE3EC, 0x8737, 0xBB6C, 0x8738, 0xE3F0, 0x873A, 0xE3EA, 0x873B, 0xBB66, 0x873C, 0xE3E8, 0x873E, 0xE3E2, + 0x873F, 0xBB64, 0x8740, 0xE3D9, 0x8741, 0xE3E1, 0x8742, 0xE3ED, 0x8743, 0xE3DF, 0x8746, 0xE3E3, 0x874C, 0xBDC1, 0x874D, 0xDFE9, + 0x874E, 0xE7B2, 0x874F, 0xE7BB, 0x8750, 0xE7B1, 0x8751, 0xE7AD, 0x8752, 0xE7AA, 0x8753, 0xBDC2, 0x8754, 0xE7A8, 0x8755, 0xBB6B, + 0x8756, 0xE7A1, 0x8757, 0xBDC0, 0x8758, 0xE7A7, 0x8759, 0xBDBF, 0x875A, 0xE7AC, 0x875B, 0xE7A9, 0x875C, 0xE7B9, 0x875D, 0xE7B4, + 0x875E, 0xE7AE, 0x875F, 0xE7B3, 0x8760, 0xBDBB, 0x8761, 0xE7AB, 0x8762, 0xE7BE, 0x8763, 0xE7A2, 0x8764, 0xE7A3, 0x8765, 0xE7BA, + 0x8766, 0xBDBC, 0x8767, 0xE7BF, 0x8768, 0xBDBE, 0x8769, 0xE7C0, 0x876A, 0xE7B0, 0x876B, 0xE3D8, 0x876C, 0xE7B6, 0x876D, 0xE7AF, + 0x876E, 0xE7B8, 0x876F, 0xE7B5, 0x8773, 0xE7A6, 0x8774, 0xBDB9, 0x8775, 0xE7BD, 0x8776, 0xBDBA, 0x8777, 0xE7A4, 0x8778, 0xBDBD, + 0x8779, 0xEB64, 0x877A, 0xE7B7, 0x877B, 0xE7BC, 0x8781, 0xEB61, 0x8782, 0xBDB8, 0x8783, 0xBFC0, 0x8784, 0xEB6B, 0x8785, 0xEB67, + 0x8787, 0xEB65, 0x8788, 0xEB60, 0x8789, 0xEB6F, 0x878D, 0xBFC4, 0x878F, 0xEB5C, 0x8790, 0xEB68, 0x8791, 0xEB69, 0x8792, 0xEB5F, + 0x8793, 0xEB5E, 0x8794, 0xEB6C, 0x8796, 0xEB62, 0x8797, 0xEB5D, 0x8798, 0xEB63, 0x879A, 0xEB6E, 0x879B, 0xEB5B, 0x879C, 0xEB6D, + 0x879D, 0xEB6A, 0x879E, 0xBFC2, 0x879F, 0xBFC1, 0x87A2, 0xBFC3, 0x87A3, 0xEB66, 0x87A4, 0xF0CB, 0x87AA, 0xEE59, 0x87AB, 0xC1B1, + 0x87AC, 0xEE5D, 0x87AD, 0xEE5A, 0x87AE, 0xEE61, 0x87AF, 0xEE67, 0x87B0, 0xEE5C, 0x87B2, 0xEE70, 0x87B3, 0xC1AE, 0x87B4, 0xEE6A, + 0x87B5, 0xEE5F, 0x87B6, 0xEE6B, 0x87B7, 0xEE66, 0x87B8, 0xEE6D, 0x87B9, 0xEE5E, 0x87BA, 0xC1B3, 0x87BB, 0xC1B2, 0x87BC, 0xEE60, + 0x87BD, 0xEE6E, 0x87BE, 0xEE58, 0x87BF, 0xEE6C, 0x87C0, 0xC1AC, 0x87C2, 0xEE64, 0x87C3, 0xEE63, 0x87C4, 0xEE68, 0x87C5, 0xEE5B, + 0x87C6, 0xC1B0, 0x87C8, 0xC1B4, 0x87C9, 0xEE62, 0x87CA, 0xEE69, 0x87CB, 0xC1B5, 0x87CC, 0xEE65, 0x87D1, 0xC1AD, 0x87D2, 0xC1AF, + 0x87D3, 0xF0C7, 0x87D4, 0xF0C5, 0x87D7, 0xF0CC, 0x87D8, 0xF0C9, 0x87D9, 0xF0CD, 0x87DB, 0xF0BE, 0x87DC, 0xF0C6, 0x87DD, 0xF0D1, + 0x87DE, 0xEE6F, 0x87DF, 0xF0C2, 0x87E0, 0xC2CF, 0x87E1, 0xE7A5, 0x87E2, 0xF0BD, 0x87E3, 0xF0CA, 0x87E4, 0xF0C4, 0x87E5, 0xF0C1, + 0x87E6, 0xF0BC, 0x87E7, 0xF0BB, 0x87E8, 0xF0D0, 0x87EA, 0xF0C0, 0x87EB, 0xF0BF, 0x87EC, 0xC2CD, 0x87ED, 0xF0C8, 0x87EF, 0xC2CC, + 0x87F2, 0xC2CE, 0x87F3, 0xF0C3, 0x87F4, 0xF0CF, 0x87F6, 0xF2DE, 0x87F7, 0xF2DF, 0x87F9, 0xC3C9, 0x87FA, 0xF2DC, 0x87FB, 0xC3C6, + 0x87FC, 0xF2E4, 0x87FE, 0xC3CA, 0x87FF, 0xF2E6, 0x8800, 0xF2DB, 0x8801, 0xF0CE, 0x8802, 0xF2E8, 0x8803, 0xF2DD, 0x8805, 0xC3C7, + 0x8806, 0xF2E3, 0x8808, 0xF2E5, 0x8809, 0xF2E0, 0x880A, 0xF2E7, 0x880B, 0xF2E2, 0x880C, 0xF2E1, 0x880D, 0xC3C8, 0x8810, 0xF4C5, + 0x8811, 0xF4C6, 0x8813, 0xF4C8, 0x8814, 0xC4AE, 0x8815, 0xC4AF, 0x8816, 0xF4C9, 0x8817, 0xF4C7, 0x8819, 0xF4C4, 0x881B, 0xF642, + 0x881C, 0xF645, 0x881D, 0xF641, 0x881F, 0xC4FA, 0x8820, 0xF643, 0x8821, 0xC4F9, 0x8822, 0xC4F8, 0x8823, 0xC4F7, 0x8824, 0xF644, + 0x8825, 0xF751, 0x8826, 0xF74F, 0x8828, 0xF74E, 0x8829, 0xF640, 0x882A, 0xF750, 0x882B, 0xF646, 0x882C, 0xF74D, 0x882E, 0xF7F9, + 0x882F, 0xF7D7, 0x8830, 0xF7F7, 0x8831, 0xC5DB, 0x8832, 0xF7F8, 0x8833, 0xF7FA, 0x8835, 0xF8BF, 0x8836, 0xC5FA, 0x8837, 0xF8BE, + 0x8838, 0xF8BD, 0x8839, 0xC5FB, 0x883B, 0xC65A, 0x883C, 0xF96E, 0x883D, 0xF9A7, 0x883E, 0xF9A6, 0x883F, 0xF9A8, 0x8840, 0xA6E5, + 0x8841, 0xD0AA, 0x8843, 0xD3CF, 0x8844, 0xD3D0, 0x8848, 0xDBC0, 0x884A, 0xF647, 0x884B, 0xF8C0, 0x884C, 0xA6E6, 0x884D, 0xAD6C, + 0x884E, 0xD0AB, 0x8852, 0xD7B1, 0x8853, 0xB34E, 0x8855, 0xDBC2, 0x8856, 0xDBC1, 0x8857, 0xB5F3, 0x8859, 0xB8C5, 0x885A, 0xE7C1, + 0x885B, 0xBDC3, 0x885D, 0xBDC4, 0x8861, 0xBFC5, 0x8862, 0xC5FC, 0x8863, 0xA6E7, 0x8867, 0xD0AC, 0x8868, 0xAAED, 0x8869, 0xD0AE, + 0x886A, 0xD0AD, 0x886B, 0xAD6D, 0x886D, 0xD3D1, 0x886F, 0xD3D8, 0x8870, 0xB049, 0x8871, 0xD3D6, 0x8872, 0xD3D4, 0x8874, 0xD3DB, + 0x8875, 0xD3D2, 0x8876, 0xD3D3, 0x8877, 0xB04A, 0x8879, 0xB04E, 0x887C, 0xD3DC, 0x887D, 0xB04D, 0x887E, 0xD3DA, 0x887F, 0xD3D7, + 0x8880, 0xD3D5, 0x8881, 0xB04B, 0x8882, 0xB04C, 0x8883, 0xD3D9, 0x8888, 0xB350, 0x8889, 0xD7B2, 0x888B, 0xB355, 0x888C, 0xD7C2, + 0x888D, 0xB354, 0x888E, 0xD7C4, 0x8891, 0xD7B8, 0x8892, 0xB352, 0x8893, 0xD7C3, 0x8895, 0xD7B3, 0x8896, 0xB353, 0x8897, 0xD7BF, + 0x8898, 0xD7BB, 0x8899, 0xD7BD, 0x889A, 0xD7B7, 0x889B, 0xD7BE, 0x889E, 0xB34F, 0x889F, 0xD7BA, 0x88A1, 0xD7B9, 0x88A2, 0xD7B5, + 0x88A4, 0xD7C0, 0x88A7, 0xD7BC, 0x88A8, 0xD7B4, 0x88AA, 0xD7B6, 0x88AB, 0xB351, 0x88AC, 0xD7C1, 0x88B1, 0xB5F6, 0x88B2, 0xDBCD, + 0x88B6, 0xDBC9, 0x88B7, 0xDBCB, 0x88B8, 0xDBC6, 0x88B9, 0xDBC5, 0x88BA, 0xDBC3, 0x88BC, 0xDBCA, 0x88BD, 0xDBCC, 0x88BE, 0xDBC8, + 0x88C0, 0xDBC7, 0x88C1, 0xB5F4, 0x88C2, 0xB5F5, 0x88C9, 0xDBCF, 0x88CA, 0xB8CD, 0x88CB, 0xDFF2, 0x88CC, 0xDFF8, 0x88CD, 0xDFF3, + 0x88CE, 0xDFF4, 0x88CF, 0xF9D8, 0x88D0, 0xDFF9, 0x88D2, 0xB8CF, 0x88D4, 0xB8C7, 0x88D5, 0xB8CE, 0x88D6, 0xDFF1, 0x88D7, 0xDBC4, + 0x88D8, 0xB8CA, 0x88D9, 0xB8C8, 0x88DA, 0xDFF7, 0x88DB, 0xDFF6, 0x88DC, 0xB8C9, 0x88DD, 0xB8CB, 0x88DE, 0xDFF5, 0x88DF, 0xB8C6, + 0x88E1, 0xB8CC, 0x88E7, 0xE3F6, 0x88E8, 0xBB74, 0x88EB, 0xE442, 0x88EC, 0xE441, 0x88EE, 0xE3FB, 0x88EF, 0xBB76, 0x88F0, 0xE440, + 0x88F1, 0xE3F7, 0x88F2, 0xE3F8, 0x88F3, 0xBB6E, 0x88F4, 0xBB70, 0x88F6, 0xE3FD, 0x88F7, 0xE3F5, 0x88F8, 0xBB72, 0x88F9, 0xBB71, + 0x88FA, 0xE3F9, 0x88FB, 0xE3FE, 0x88FC, 0xE3FC, 0x88FD, 0xBB73, 0x88FE, 0xE3FA, 0x8901, 0xDBCE, 0x8902, 0xBB6F, 0x8905, 0xE7C2, + 0x8906, 0xE7C9, 0x8907, 0xBDC6, 0x8909, 0xE7CD, 0x890A, 0xBDCA, 0x890B, 0xE7C5, 0x890C, 0xE7C3, 0x890E, 0xE7CC, 0x8910, 0xBDC5, + 0x8911, 0xE7CB, 0x8912, 0xBDC7, 0x8913, 0xBDC8, 0x8914, 0xE7C4, 0x8915, 0xBDC9, 0x8916, 0xE7CA, 0x8917, 0xE7C6, 0x8918, 0xE7C7, + 0x8919, 0xE7C8, 0x891A, 0xBB75, 0x891E, 0xEB70, 0x891F, 0xEB7C, 0x8921, 0xBFCA, 0x8922, 0xEB77, 0x8923, 0xEB79, 0x8925, 0xBFC8, + 0x8926, 0xEB71, 0x8927, 0xEB75, 0x8929, 0xEB78, 0x892A, 0xBFC6, 0x892B, 0xBFC9, 0x892C, 0xEB7B, 0x892D, 0xEB73, 0x892E, 0xEB74, + 0x892F, 0xEB7A, 0x8930, 0xEB72, 0x8931, 0xEB76, 0x8932, 0xBFC7, 0x8933, 0xEE72, 0x8935, 0xEE71, 0x8936, 0xC1B7, 0x8937, 0xEE77, + 0x8938, 0xC1B9, 0x893B, 0xC1B6, 0x893C, 0xEE73, 0x893D, 0xC1BA, 0x893E, 0xEE74, 0x8941, 0xEE75, 0x8942, 0xEE78, 0x8944, 0xC1B8, + 0x8946, 0xF0D6, 0x8949, 0xF0D9, 0x894B, 0xF0D3, 0x894C, 0xF0D5, 0x894F, 0xF0D4, 0x8950, 0xF0D7, 0x8951, 0xF0D8, 0x8952, 0xEE76, + 0x8953, 0xF0D2, 0x8956, 0xC3CD, 0x8957, 0xF2EC, 0x8958, 0xF2EF, 0x8959, 0xF2F1, 0x895A, 0xF2EA, 0x895B, 0xF2EB, 0x895C, 0xF2EE, + 0x895D, 0xF2F0, 0x895E, 0xC3CE, 0x895F, 0xC3CC, 0x8960, 0xC3CB, 0x8961, 0xF2ED, 0x8962, 0xF2E9, 0x8963, 0xF4CA, 0x8964, 0xC4B0, + 0x8966, 0xF4CB, 0x8969, 0xF649, 0x896A, 0xC4FB, 0x896B, 0xF64B, 0x896C, 0xC4FC, 0x896D, 0xF648, 0x896E, 0xF64A, 0x896F, 0xC5A8, + 0x8971, 0xF752, 0x8972, 0xC5A7, 0x8973, 0xF7FD, 0x8974, 0xF7FC, 0x8976, 0xF7FB, 0x8979, 0xF948, 0x897A, 0xF949, 0x897B, 0xF94B, + 0x897C, 0xF94A, 0x897E, 0xCA50, 0x897F, 0xA6E8, 0x8981, 0xAD6E, 0x8982, 0xD7C5, 0x8983, 0xB5F7, 0x8985, 0xDFFA, 0x8986, 0xC2D0, + 0x8988, 0xF2F2, 0x898B, 0xA8A3, 0x898F, 0xB357, 0x8993, 0xB356, 0x8995, 0xDBD0, 0x8996, 0xB5F8, 0x8997, 0xDBD2, 0x8998, 0xDBD1, + 0x899B, 0xDFFB, 0x899C, 0xB8D0, 0x899D, 0xE443, 0x899E, 0xE446, 0x899F, 0xE445, 0x89A1, 0xE444, 0x89A2, 0xE7CE, 0x89A3, 0xE7D0, + 0x89A4, 0xE7CF, 0x89A6, 0xBFCC, 0x89AA, 0xBFCB, 0x89AC, 0xC1BB, 0x89AD, 0xEE79, 0x89AE, 0xEE7B, 0x89AF, 0xEE7A, 0x89B2, 0xC2D1, + 0x89B6, 0xF2F4, 0x89B7, 0xF2F3, 0x89B9, 0xF4CC, 0x89BA, 0xC4B1, 0x89BD, 0xC4FD, 0x89BE, 0xF754, 0x89BF, 0xF753, 0x89C0, 0xC65B, + 0x89D2, 0xA8A4, 0x89D3, 0xD0AF, 0x89D4, 0xAD6F, 0x89D5, 0xD7C8, 0x89D6, 0xD7C6, 0x89D9, 0xD7C7, 0x89DA, 0xDBD4, 0x89DB, 0xDBD5, + 0x89DC, 0xE043, 0x89DD, 0xDBD3, 0x89DF, 0xDFFC, 0x89E0, 0xE041, 0x89E1, 0xE040, 0x89E2, 0xE042, 0x89E3, 0xB8D1, 0x89E4, 0xDFFE, + 0x89E5, 0xDFFD, 0x89E6, 0xE044, 0x89E8, 0xE449, 0x89E9, 0xE447, 0x89EB, 0xE448, 0x89EC, 0xE7D3, 0x89ED, 0xE7D1, 0x89F0, 0xE7D2, + 0x89F1, 0xEB7D, 0x89F2, 0xEE7C, 0x89F3, 0xEE7D, 0x89F4, 0xC2D2, 0x89F6, 0xF2F5, 0x89F7, 0xF4CD, 0x89F8, 0xC4B2, 0x89FA, 0xF64C, + 0x89FB, 0xF755, 0x89FC, 0xC5A9, 0x89FE, 0xF7FE, 0x89FF, 0xF94C, 0x8A00, 0xA8A5, 0x8A02, 0xAD71, 0x8A03, 0xAD72, 0x8A04, 0xD0B0, + 0x8A07, 0xD0B1, 0x8A08, 0xAD70, 0x8A0A, 0xB054, 0x8A0C, 0xB052, 0x8A0E, 0xB051, 0x8A0F, 0xB058, 0x8A10, 0xB050, 0x8A11, 0xB059, + 0x8A12, 0xD3DD, 0x8A13, 0xB056, 0x8A15, 0xB053, 0x8A16, 0xB057, 0x8A17, 0xB055, 0x8A18, 0xB04F, 0x8A1B, 0xB35F, 0x8A1D, 0xB359, + 0x8A1E, 0xD7CC, 0x8A1F, 0xB35E, 0x8A22, 0xB360, 0x8A23, 0xB35A, 0x8A25, 0xB35B, 0x8A27, 0xD7CA, 0x8A2A, 0xB358, 0x8A2C, 0xD7CB, + 0x8A2D, 0xB35D, 0x8A30, 0xD7C9, 0x8A31, 0xB35C, 0x8A34, 0xB644, 0x8A36, 0xB646, 0x8A39, 0xDBD8, 0x8A3A, 0xB645, 0x8A3B, 0xB5F9, + 0x8A3C, 0xB5FD, 0x8A3E, 0xB8E4, 0x8A3F, 0xE049, 0x8A40, 0xDBDA, 0x8A41, 0xB5FE, 0x8A44, 0xDBDD, 0x8A45, 0xDBDE, 0x8A46, 0xB643, + 0x8A48, 0xDBE0, 0x8A4A, 0xDBE2, 0x8A4C, 0xDBE3, 0x8A4D, 0xDBD7, 0x8A4E, 0xDBD6, 0x8A4F, 0xDBE4, 0x8A50, 0xB642, 0x8A51, 0xDBE1, + 0x8A52, 0xDBDF, 0x8A54, 0xB640, 0x8A55, 0xB5FB, 0x8A56, 0xB647, 0x8A57, 0xDBDB, 0x8A58, 0xDBDC, 0x8A59, 0xDBD9, 0x8A5B, 0xB641, + 0x8A5E, 0xB5FC, 0x8A60, 0xB5FA, 0x8A61, 0xE048, 0x8A62, 0xB8DF, 0x8A63, 0xB8DA, 0x8A66, 0xB8D5, 0x8A68, 0xB8E5, 0x8A69, 0xB8D6, + 0x8A6B, 0xB8D2, 0x8A6C, 0xB8E1, 0x8A6D, 0xB8DE, 0x8A6E, 0xB8E0, 0x8A70, 0xB8D7, 0x8A71, 0xB8DC, 0x8A72, 0xB8D3, 0x8A73, 0xB8D4, + 0x8A74, 0xE050, 0x8A75, 0xE04D, 0x8A76, 0xE045, 0x8A77, 0xE04A, 0x8A79, 0xB8E2, 0x8A7A, 0xE051, 0x8A7B, 0xB8E3, 0x8A7C, 0xB8D9, + 0x8A7F, 0xE047, 0x8A81, 0xE04F, 0x8A82, 0xE04B, 0x8A83, 0xE04E, 0x8A84, 0xE04C, 0x8A85, 0xB8DD, 0x8A86, 0xE046, 0x8A87, 0xB8D8, + 0x8A8B, 0xE44C, 0x8A8C, 0xBB78, 0x8A8D, 0xBB7B, 0x8A8F, 0xE44E, 0x8A91, 0xBBA5, 0x8A92, 0xE44D, 0x8A93, 0xBB7D, 0x8A95, 0xBDCF, + 0x8A96, 0xE44F, 0x8A98, 0xBBA4, 0x8A99, 0xE44B, 0x8A9A, 0xBBA6, 0x8A9E, 0xBB79, 0x8AA0, 0xB8DB, 0x8AA1, 0xBB7C, 0x8AA3, 0xBB7A, + 0x8AA4, 0xBB7E, 0x8AA5, 0xBBA2, 0x8AA6, 0xBB77, 0x8AA7, 0xBBA7, 0x8AA8, 0xBBA3, 0x8AAA, 0xBBA1, 0x8AAB, 0xE44A, 0x8AB0, 0xBDD6, + 0x8AB2, 0xBDD2, 0x8AB6, 0xBDD9, 0x8AB8, 0xE7D6, 0x8AB9, 0xBDDA, 0x8ABA, 0xE7E2, 0x8ABB, 0xE7DB, 0x8ABC, 0xBDCB, 0x8ABD, 0xE7E3, + 0x8ABE, 0xE7DD, 0x8ABF, 0xBDD5, 0x8AC0, 0xE7DE, 0x8AC2, 0xBDD4, 0x8AC3, 0xE7E1, 0x8AC4, 0xBDCE, 0x8AC5, 0xE7DF, 0x8AC6, 0xE7D5, + 0x8AC7, 0xBDCD, 0x8AC8, 0xEBAA, 0x8AC9, 0xBDD3, 0x8ACB, 0xBDD0, 0x8ACD, 0xBDD8, 0x8ACF, 0xE7D4, 0x8AD1, 0xE7D8, 0x8AD2, 0xBDCC, + 0x8AD3, 0xE7D7, 0x8AD4, 0xE7D9, 0x8AD5, 0xE7DA, 0x8AD6, 0xBDD7, 0x8AD7, 0xE7DC, 0x8AD8, 0xE7E0, 0x8AD9, 0xE7E4, 0x8ADB, 0xBDDB, + 0x8ADC, 0xBFD2, 0x8ADD, 0xEBA5, 0x8ADE, 0xEBAB, 0x8ADF, 0xEBA8, 0x8AE0, 0xEB7E, 0x8AE1, 0xEBAC, 0x8AE2, 0xEBA1, 0x8AE4, 0xEBA7, + 0x8AE6, 0xBFCD, 0x8AE7, 0xBFD3, 0x8AE8, 0xEBAD, 0x8AEB, 0xBFCF, 0x8AED, 0xBFD9, 0x8AEE, 0xBFD4, 0x8AEF, 0xEBAF, 0x8AF0, 0xEBA9, + 0x8AF1, 0xBFD0, 0x8AF2, 0xEBA2, 0x8AF3, 0xBFDA, 0x8AF4, 0xEBA3, 0x8AF5, 0xEBA4, 0x8AF6, 0xBFDB, 0x8AF7, 0xBFD8, 0x8AF8, 0xBDD1, + 0x8AFA, 0xBFCE, 0x8AFB, 0xEBB0, 0x8AFC, 0xBFDC, 0x8AFE, 0xBFD5, 0x8AFF, 0xEBAE, 0x8B00, 0xBFD1, 0x8B01, 0xBFD6, 0x8B02, 0xBFD7, + 0x8B04, 0xC1C3, 0x8B05, 0xEEA4, 0x8B06, 0xEEAD, 0x8B07, 0xEEAA, 0x8B08, 0xEEAC, 0x8B0A, 0xC1C0, 0x8B0B, 0xEEA5, 0x8B0D, 0xEEAB, + 0x8B0E, 0xC1BC, 0x8B0F, 0xEEA7, 0x8B10, 0xC1C4, 0x8B11, 0xEEA3, 0x8B12, 0xEEA8, 0x8B13, 0xEEAF, 0x8B14, 0xEBA6, 0x8B15, 0xEEA9, + 0x8B16, 0xEEA2, 0x8B17, 0xC1BD, 0x8B18, 0xEEA1, 0x8B19, 0xC1BE, 0x8B1A, 0xEEB0, 0x8B1B, 0xC1BF, 0x8B1C, 0xEEAE, 0x8B1D, 0xC1C2, + 0x8B1E, 0xEE7E, 0x8B20, 0xC1C1, 0x8B22, 0xEEA6, 0x8B23, 0xF0DC, 0x8B24, 0xF0EA, 0x8B25, 0xF0E5, 0x8B26, 0xF0E7, 0x8B27, 0xF0DB, + 0x8B28, 0xC2D3, 0x8B2A, 0xF0DA, 0x8B2B, 0xC2D6, 0x8B2C, 0xC2D5, 0x8B2E, 0xF0E9, 0x8B2F, 0xF0E1, 0x8B30, 0xF0DE, 0x8B31, 0xF0E4, + 0x8B33, 0xF0DD, 0x8B35, 0xF0DF, 0x8B36, 0xF0E8, 0x8B37, 0xF0E6, 0x8B39, 0xC2D4, 0x8B3A, 0xF0ED, 0x8B3B, 0xF0EB, 0x8B3C, 0xF0E2, + 0x8B3D, 0xF0EC, 0x8B3E, 0xF0E3, 0x8B40, 0xF2F9, 0x8B41, 0xC3CF, 0x8B42, 0xF341, 0x8B45, 0xF64F, 0x8B46, 0xC3D6, 0x8B47, 0xF0E0, + 0x8B48, 0xF2F7, 0x8B49, 0xC3D2, 0x8B4A, 0xF2F8, 0x8B4B, 0xF2FD, 0x8B4E, 0xC3D4, 0x8B4F, 0xC3D5, 0x8B50, 0xF2F6, 0x8B51, 0xF340, + 0x8B52, 0xF342, 0x8B53, 0xF2FA, 0x8B54, 0xF2FC, 0x8B55, 0xF2FE, 0x8B56, 0xF2FB, 0x8B57, 0xF343, 0x8B58, 0xC3D1, 0x8B59, 0xC3D7, + 0x8B5A, 0xC3D3, 0x8B5C, 0xC3D0, 0x8B5D, 0xF4D0, 0x8B5F, 0xC4B7, 0x8B60, 0xF4CE, 0x8B63, 0xF4D2, 0x8B65, 0xF4D3, 0x8B66, 0xC4B5, + 0x8B67, 0xF4D4, 0x8B68, 0xF4D1, 0x8B6A, 0xF4CF, 0x8B6B, 0xC4B8, 0x8B6C, 0xC4B4, 0x8B6D, 0xF4D5, 0x8B6F, 0xC4B6, 0x8B70, 0xC4B3, + 0x8B74, 0xC4FE, 0x8B77, 0xC540, 0x8B78, 0xF64E, 0x8B79, 0xF64D, 0x8B7A, 0xF650, 0x8B7B, 0xF651, 0x8B7D, 0xC541, 0x8B7E, 0xF756, + 0x8B7F, 0xF75B, 0x8B80, 0xC5AA, 0x8B82, 0xF758, 0x8B84, 0xF757, 0x8B85, 0xF75A, 0x8B86, 0xF759, 0x8B88, 0xF843, 0x8B8A, 0xC5DC, + 0x8B8B, 0xF842, 0x8B8C, 0xF840, 0x8B8E, 0xF841, 0x8B92, 0xC5FE, 0x8B93, 0xC5FD, 0x8B94, 0xF8C1, 0x8B95, 0xF8C2, 0x8B96, 0xC640, + 0x8B98, 0xF94D, 0x8B99, 0xF94E, 0x8B9A, 0xC667, 0x8B9C, 0xC66D, 0x8B9E, 0xF9A9, 0x8B9F, 0xF9C8, 0x8C37, 0xA8A6, 0x8C39, 0xD7CD, + 0x8C3B, 0xD7CE, 0x8C3C, 0xE052, 0x8C3D, 0xE450, 0x8C3E, 0xE7E5, 0x8C3F, 0xC1C6, 0x8C41, 0xC1C5, 0x8C42, 0xF0EE, 0x8C43, 0xF344, + 0x8C45, 0xF844, 0x8C46, 0xA8A7, 0x8C47, 0xD3DE, 0x8C48, 0xB05A, 0x8C49, 0xB361, 0x8C4A, 0xE054, 0x8C4B, 0xE053, 0x8C4C, 0xBDDC, + 0x8C4D, 0xE7E6, 0x8C4E, 0xBDDD, 0x8C4F, 0xEEB1, 0x8C50, 0xC2D7, 0x8C54, 0xC676, 0x8C55, 0xA8A8, 0x8C56, 0xCDCB, 0x8C57, 0xD3DF, + 0x8C5A, 0xB362, 0x8C5C, 0xD7CF, 0x8C5D, 0xD7D0, 0x8C5F, 0xDBE5, 0x8C61, 0xB648, 0x8C62, 0xB8E6, 0x8C64, 0xE056, 0x8C65, 0xE055, + 0x8C66, 0xE057, 0x8C68, 0xE451, 0x8C69, 0xE452, 0x8C6A, 0xBBA8, 0x8C6B, 0xBFDD, 0x8C6C, 0xBDDE, 0x8C6D, 0xBFDE, 0x8C6F, 0xEEB5, + 0x8C70, 0xEEB2, 0x8C71, 0xEEB4, 0x8C72, 0xEEB3, 0x8C73, 0xC1C7, 0x8C75, 0xF0EF, 0x8C76, 0xF346, 0x8C77, 0xF345, 0x8C78, 0xCBA4, + 0x8C79, 0xB05C, 0x8C7A, 0xB05B, 0x8C7B, 0xD3E0, 0x8C7D, 0xD7D1, 0x8C80, 0xDBE7, 0x8C81, 0xDBE6, 0x8C82, 0xB649, 0x8C84, 0xE059, + 0x8C85, 0xE05A, 0x8C86, 0xE058, 0x8C89, 0xB8E8, 0x8C8A, 0xB8E7, 0x8C8C, 0xBBAA, 0x8C8D, 0xBBA9, 0x8C8F, 0xE7E7, 0x8C90, 0xEBB3, + 0x8C91, 0xEBB1, 0x8C92, 0xEBB2, 0x8C93, 0xBFDF, 0x8C94, 0xEEB7, 0x8C95, 0xEEB6, 0x8C97, 0xF0F2, 0x8C98, 0xF0F1, 0x8C99, 0xF0F0, + 0x8C9A, 0xF347, 0x8C9C, 0xF9AA, 0x8C9D, 0xA8A9, 0x8C9E, 0xAD73, 0x8CA0, 0xAD74, 0x8CA1, 0xB05D, 0x8CA2, 0xB05E, 0x8CA3, 0xD3E2, + 0x8CA4, 0xD3E1, 0x8CA5, 0xD7D2, 0x8CA7, 0xB368, 0x8CA8, 0xB366, 0x8CA9, 0xB363, 0x8CAA, 0xB367, 0x8CAB, 0xB365, 0x8CAC, 0xB364, + 0x8CAF, 0xB64A, 0x8CB0, 0xDBEA, 0x8CB2, 0xB8ED, 0x8CB3, 0xB64C, 0x8CB4, 0xB651, 0x8CB5, 0xDBEC, 0x8CB6, 0xB653, 0x8CB7, 0xB652, + 0x8CB8, 0xB655, 0x8CB9, 0xDBEB, 0x8CBA, 0xDBE8, 0x8CBB, 0xB64F, 0x8CBC, 0xB64B, 0x8CBD, 0xB64D, 0x8CBE, 0xDBE9, 0x8CBF, 0xB654, + 0x8CC0, 0xB650, 0x8CC1, 0xB64E, 0x8CC2, 0xB8EF, 0x8CC3, 0xB8EE, 0x8CC4, 0xB8EC, 0x8CC5, 0xB8F0, 0x8CC7, 0xB8EA, 0x8CC8, 0xB8EB, + 0x8CCA, 0xB8E9, 0x8CCC, 0xE05B, 0x8CCF, 0xE454, 0x8CD1, 0xBBAC, 0x8CD2, 0xBBAD, 0x8CD3, 0xBBAB, 0x8CD5, 0xE453, 0x8CD7, 0xE455, + 0x8CD9, 0xE7EA, 0x8CDA, 0xE7EC, 0x8CDC, 0xBDE7, 0x8CDD, 0xE7ED, 0x8CDE, 0xBDE0, 0x8CDF, 0xE7E9, 0x8CE0, 0xBDDF, 0x8CE1, 0xBDE9, + 0x8CE2, 0xBDE5, 0x8CE3, 0xBDE6, 0x8CE4, 0xBDE2, 0x8CE5, 0xE7E8, 0x8CE6, 0xBDE1, 0x8CE7, 0xE7EE, 0x8CE8, 0xE7EB, 0x8CEA, 0xBDE8, + 0x8CEC, 0xBDE3, 0x8CED, 0xBDE4, 0x8CEE, 0xEBB5, 0x8CF0, 0xEBB7, 0x8CF1, 0xEBB6, 0x8CF3, 0xEBB8, 0x8CF4, 0xBFE0, 0x8CF5, 0xEBB4, + 0x8CF8, 0xC1CB, 0x8CF9, 0xEEB8, 0x8CFA, 0xC1C8, 0x8CFB, 0xC1CC, 0x8CFC, 0xC1CA, 0x8CFD, 0xC1C9, 0x8CFE, 0xF0F3, 0x8D00, 0xF0F6, + 0x8D02, 0xF0F5, 0x8D04, 0xF0F4, 0x8D05, 0xC2D8, 0x8D06, 0xF348, 0x8D07, 0xF349, 0x8D08, 0xC3D8, 0x8D09, 0xF34A, 0x8D0A, 0xC3D9, + 0x8D0D, 0xC4BA, 0x8D0F, 0xC4B9, 0x8D10, 0xF652, 0x8D13, 0xC542, 0x8D14, 0xF653, 0x8D15, 0xF75C, 0x8D16, 0xC5AB, 0x8D17, 0xC5AC, + 0x8D19, 0xF845, 0x8D1B, 0xC642, 0x8D64, 0xA8AA, 0x8D66, 0xB36A, 0x8D67, 0xB369, 0x8D68, 0xE05C, 0x8D69, 0xE05D, 0x8D6B, 0xBBAE, + 0x8D6C, 0xEBB9, 0x8D6D, 0xBDEA, 0x8D6E, 0xEBBA, 0x8D6F, 0xEEB9, 0x8D70, 0xA8AB, 0x8D72, 0xD0B2, 0x8D73, 0xAD76, 0x8D74, 0xAD75, + 0x8D76, 0xD3E3, 0x8D77, 0xB05F, 0x8D78, 0xD3E4, 0x8D79, 0xD7D5, 0x8D7B, 0xD7D4, 0x8D7D, 0xD7D3, 0x8D80, 0xDBEE, 0x8D81, 0xB658, + 0x8D84, 0xDBED, 0x8D85, 0xB657, 0x8D89, 0xDBEF, 0x8D8A, 0xB656, 0x8D8C, 0xE05F, 0x8D8D, 0xE062, 0x8D8E, 0xE060, 0x8D8F, 0xE061, + 0x8D90, 0xE065, 0x8D91, 0xE05E, 0x8D92, 0xE066, 0x8D93, 0xE063, 0x8D94, 0xE064, 0x8D95, 0xBBB0, 0x8D96, 0xE456, 0x8D99, 0xBBAF, + 0x8D9B, 0xE7F2, 0x8D9C, 0xE7F0, 0x8D9F, 0xBDEB, 0x8DA0, 0xE7EF, 0x8DA1, 0xE7F1, 0x8DA3, 0xBDEC, 0x8DA5, 0xEBBB, 0x8DA7, 0xEBBC, + 0x8DA8, 0xC1CD, 0x8DAA, 0xF34C, 0x8DAB, 0xF34E, 0x8DAC, 0xF34B, 0x8DAD, 0xF34D, 0x8DAE, 0xF4D6, 0x8DAF, 0xF654, 0x8DB2, 0xF96F, + 0x8DB3, 0xA8AC, 0x8DB4, 0xAD77, 0x8DB5, 0xD3E5, 0x8DB6, 0xD3E7, 0x8DB7, 0xD3E6, 0x8DB9, 0xD7D8, 0x8DBA, 0xB36C, 0x8DBC, 0xD7D6, + 0x8DBE, 0xB36B, 0x8DBF, 0xD7D9, 0x8DC1, 0xD7DA, 0x8DC2, 0xD7D7, 0x8DC5, 0xDBFB, 0x8DC6, 0xB660, 0x8DC7, 0xDBF3, 0x8DC8, 0xDBF9, + 0x8DCB, 0xB65B, 0x8DCC, 0xB65E, 0x8DCD, 0xDBF2, 0x8DCE, 0xB659, 0x8DCF, 0xDBF6, 0x8DD0, 0xE06C, 0x8DD1, 0xB65D, 0x8DD3, 0xDBF1, + 0x8DD5, 0xDBF7, 0x8DD6, 0xDBF4, 0x8DD7, 0xDBFA, 0x8DD8, 0xDBF0, 0x8DD9, 0xDBF8, 0x8DDA, 0xB65C, 0x8DDB, 0xB65F, 0x8DDC, 0xDBF5, + 0x8DDD, 0xB65A, 0x8DDF, 0xB8F2, 0x8DE0, 0xE068, 0x8DE1, 0xB8F1, 0x8DE2, 0xE06F, 0x8DE3, 0xE06E, 0x8DE4, 0xB8F8, 0x8DE6, 0xB8F9, + 0x8DE7, 0xE070, 0x8DE8, 0xB8F3, 0x8DE9, 0xE06D, 0x8DEA, 0xB8F7, 0x8DEB, 0xE072, 0x8DEC, 0xE069, 0x8DEE, 0xE06B, 0x8DEF, 0xB8F4, + 0x8DF0, 0xE067, 0x8DF1, 0xE06A, 0x8DF2, 0xE071, 0x8DF3, 0xB8F5, 0x8DF4, 0xE073, 0x8DFA, 0xB8F6, 0x8DFC, 0xBBB1, 0x8DFD, 0xE45B, + 0x8DFE, 0xE461, 0x8DFF, 0xE459, 0x8E00, 0xE462, 0x8E02, 0xE458, 0x8E03, 0xE45D, 0x8E04, 0xE463, 0x8E05, 0xE460, 0x8E06, 0xE45F, + 0x8E07, 0xE45E, 0x8E09, 0xE457, 0x8E0A, 0xE45C, 0x8E0D, 0xE45A, 0x8E0F, 0xBDF1, 0x8E10, 0xBDEE, 0x8E11, 0xE7FB, 0x8E12, 0xE841, + 0x8E13, 0xE843, 0x8E14, 0xE840, 0x8E15, 0xE7F8, 0x8E16, 0xE7FA, 0x8E17, 0xE845, 0x8E18, 0xE842, 0x8E19, 0xE7FC, 0x8E1A, 0xE846, + 0x8E1B, 0xE7F9, 0x8E1C, 0xE844, 0x8E1D, 0xBDEF, 0x8E1E, 0xBDF5, 0x8E1F, 0xBDF3, 0x8E20, 0xE7F3, 0x8E21, 0xBDF4, 0x8E22, 0xBDF0, + 0x8E23, 0xE7F4, 0x8E24, 0xE7F6, 0x8E25, 0xE7F5, 0x8E26, 0xE7FD, 0x8E27, 0xE7FE, 0x8E29, 0xBDF2, 0x8E2B, 0xBDED, 0x8E2E, 0xE7F7, + 0x8E30, 0xEBC6, 0x8E31, 0xBFE2, 0x8E33, 0xEBBD, 0x8E34, 0xBFE3, 0x8E35, 0xBFE6, 0x8E36, 0xEBC2, 0x8E38, 0xEBBF, 0x8E39, 0xBFE5, + 0x8E3C, 0xEBC3, 0x8E3D, 0xEBC4, 0x8E3E, 0xEBBE, 0x8E3F, 0xEBC7, 0x8E40, 0xEBC0, 0x8E41, 0xEBC5, 0x8E42, 0xBFE4, 0x8E44, 0xBFE1, + 0x8E45, 0xEBC1, 0x8E47, 0xEEBF, 0x8E48, 0xC1D0, 0x8E49, 0xC1CE, 0x8E4A, 0xC1D1, 0x8E4B, 0xC1CF, 0x8E4C, 0xEEBE, 0x8E4D, 0xEEBB, + 0x8E4E, 0xEEBA, 0x8E50, 0xEEBD, 0x8E53, 0xEEBC, 0x8E54, 0xF145, 0x8E55, 0xC2DE, 0x8E56, 0xF0FB, 0x8E57, 0xF0FA, 0x8E59, 0xC2D9, + 0x8E5A, 0xF141, 0x8E5B, 0xF140, 0x8E5C, 0xF0F7, 0x8E5D, 0xF143, 0x8E5E, 0xF0FC, 0x8E5F, 0xC2DD, 0x8E60, 0xF0F9, 0x8E61, 0xF142, + 0x8E62, 0xF0F8, 0x8E63, 0xC2DA, 0x8E64, 0xC2DC, 0x8E65, 0xF0FD, 0x8E66, 0xC2DB, 0x8E67, 0xF0FE, 0x8E69, 0xF144, 0x8E6A, 0xF352, + 0x8E6C, 0xC3DE, 0x8E6D, 0xF34F, 0x8E6F, 0xF353, 0x8E72, 0xC3DB, 0x8E73, 0xF351, 0x8E74, 0xC3E0, 0x8E76, 0xC3DD, 0x8E78, 0xF350, + 0x8E7A, 0xC3DF, 0x8E7B, 0xF354, 0x8E7C, 0xC3DA, 0x8E81, 0xC4BC, 0x8E82, 0xC4BE, 0x8E84, 0xF4D9, 0x8E85, 0xC4BD, 0x8E86, 0xF4D7, + 0x8E87, 0xC3DC, 0x8E88, 0xF4D8, 0x8E89, 0xC4BB, 0x8E8A, 0xC543, 0x8E8B, 0xC545, 0x8E8C, 0xF656, 0x8E8D, 0xC544, 0x8E8E, 0xF655, + 0x8E90, 0xF761, 0x8E91, 0xC5AD, 0x8E92, 0xF760, 0x8E93, 0xC5AE, 0x8E94, 0xF75E, 0x8E95, 0xF75D, 0x8E96, 0xF762, 0x8E97, 0xF763, + 0x8E98, 0xF846, 0x8E9A, 0xF75F, 0x8E9D, 0xF8C6, 0x8E9E, 0xF8C3, 0x8E9F, 0xF8C4, 0x8EA0, 0xF8C5, 0x8EA1, 0xC65C, 0x8EA3, 0xF951, + 0x8EA4, 0xF950, 0x8EA5, 0xF94F, 0x8EA6, 0xF970, 0x8EA8, 0xF9BE, 0x8EA9, 0xF9AB, 0x8EAA, 0xC66E, 0x8EAB, 0xA8AD, 0x8EAC, 0xB060, + 0x8EB2, 0xB8FA, 0x8EBA, 0xBDF6, 0x8EBD, 0xEBC8, 0x8EC0, 0xC2DF, 0x8EC2, 0xF355, 0x8EC9, 0xF9AC, 0x8ECA, 0xA8AE, 0x8ECB, 0xAAEE, + 0x8ECC, 0xAD79, 0x8ECD, 0xAD78, 0x8ECF, 0xB063, 0x8ED1, 0xD3E8, 0x8ED2, 0xB061, 0x8ED3, 0xD3E9, 0x8ED4, 0xB062, 0x8ED7, 0xD7DF, + 0x8ED8, 0xD7DB, 0x8EDB, 0xB36D, 0x8EDC, 0xD7DE, 0x8EDD, 0xD7DD, 0x8EDE, 0xD7DC, 0x8EDF, 0xB36E, 0x8EE0, 0xD7E0, 0x8EE1, 0xD7E1, + 0x8EE5, 0xDC43, 0x8EE6, 0xDC41, 0x8EE7, 0xDC45, 0x8EE8, 0xDC46, 0x8EE9, 0xDC4C, 0x8EEB, 0xDC48, 0x8EEC, 0xDC4A, 0x8EEE, 0xDC42, + 0x8EEF, 0xDBFC, 0x8EF1, 0xDC49, 0x8EF4, 0xDC4B, 0x8EF5, 0xDC44, 0x8EF6, 0xDC47, 0x8EF7, 0xDBFD, 0x8EF8, 0xB662, 0x8EF9, 0xDC40, + 0x8EFA, 0xDBFE, 0x8EFB, 0xB661, 0x8EFC, 0xB663, 0x8EFE, 0xB8FD, 0x8EFF, 0xE075, 0x8F00, 0xE077, 0x8F01, 0xE076, 0x8F02, 0xE07B, + 0x8F03, 0xB8FB, 0x8F05, 0xE078, 0x8F06, 0xE074, 0x8F07, 0xE079, 0x8F08, 0xE07A, 0x8F09, 0xB8FC, 0x8F0A, 0xB8FE, 0x8F0B, 0xE07C, + 0x8F0D, 0xE467, 0x8F0E, 0xE466, 0x8F10, 0xE464, 0x8F11, 0xE465, 0x8F12, 0xBBB3, 0x8F13, 0xBBB5, 0x8F14, 0xBBB2, 0x8F15, 0xBBB4, + 0x8F16, 0xE84D, 0x8F17, 0xE84E, 0x8F18, 0xE849, 0x8F1A, 0xE84A, 0x8F1B, 0xBDF8, 0x8F1C, 0xBDFD, 0x8F1D, 0xBDF7, 0x8F1E, 0xBDFE, + 0x8F1F, 0xBDF9, 0x8F20, 0xE84B, 0x8F23, 0xE84C, 0x8F24, 0xE848, 0x8F25, 0xBE40, 0x8F26, 0xBDFB, 0x8F29, 0xBDFA, 0x8F2A, 0xBDFC, + 0x8F2C, 0xE847, 0x8F2E, 0xEBCA, 0x8F2F, 0xBFE8, 0x8F32, 0xEBCC, 0x8F33, 0xBFEA, 0x8F34, 0xEBCF, 0x8F35, 0xEBCB, 0x8F36, 0xEBC9, + 0x8F37, 0xEBCE, 0x8F38, 0xBFE9, 0x8F39, 0xEBCD, 0x8F3B, 0xBFE7, 0x8F3E, 0xC1D3, 0x8F3F, 0xC1D6, 0x8F40, 0xEEC1, 0x8F42, 0xC1D4, + 0x8F43, 0xEEC0, 0x8F44, 0xC1D2, 0x8F45, 0xC1D5, 0x8F46, 0xF146, 0x8F47, 0xF147, 0x8F48, 0xF148, 0x8F49, 0xC2E0, 0x8F4B, 0xF149, + 0x8F4D, 0xC2E1, 0x8F4E, 0xC3E2, 0x8F4F, 0xF358, 0x8F50, 0xF359, 0x8F51, 0xF357, 0x8F52, 0xF356, 0x8F53, 0xF35A, 0x8F54, 0xC3E1, + 0x8F55, 0xF4DD, 0x8F56, 0xF4DB, 0x8F57, 0xF4DC, 0x8F58, 0xF4DE, 0x8F59, 0xF4DA, 0x8F5A, 0xF4DF, 0x8F5B, 0xF658, 0x8F5D, 0xF659, + 0x8F5E, 0xF657, 0x8F5F, 0xC546, 0x8F60, 0xF764, 0x8F61, 0xC5AF, 0x8F62, 0xF765, 0x8F63, 0xF848, 0x8F64, 0xF847, 0x8F9B, 0xA8AF, + 0x8F9C, 0xB664, 0x8F9F, 0xB940, 0x8FA3, 0xBBB6, 0x8FA6, 0xBFEC, 0x8FA8, 0xBFEB, 0x8FAD, 0xC3E3, 0x8FAE, 0xC47C, 0x8FAF, 0xC547, + 0x8FB0, 0xA8B0, 0x8FB1, 0xB064, 0x8FB2, 0xB941, 0x8FB4, 0xF35B, 0x8FBF, 0xCBA6, 0x8FC2, 0xA8B1, 0x8FC4, 0xA8B4, 0x8FC5, 0xA8B3, + 0x8FC6, 0xA8B2, 0x8FC9, 0xCBA5, 0x8FCB, 0xCDCD, 0x8FCD, 0xCDCF, 0x8FCE, 0xAAEF, 0x8FD1, 0xAAF1, 0x8FD2, 0xCDCC, 0x8FD3, 0xCDCE, + 0x8FD4, 0xAAF0, 0x8FD5, 0xCDD1, 0x8FD6, 0xCDD0, 0x8FD7, 0xCDD2, 0x8FE0, 0xD0B6, 0x8FE1, 0xD0B4, 0x8FE2, 0xAD7C, 0x8FE3, 0xD0B3, + 0x8FE4, 0xADA3, 0x8FE5, 0xAD7E, 0x8FE6, 0xAD7B, 0x8FE8, 0xADA4, 0x8FEA, 0xAD7D, 0x8FEB, 0xADA2, 0x8FED, 0xADA1, 0x8FEE, 0xD0B5, + 0x8FF0, 0xAD7A, 0x8FF4, 0xB06A, 0x8FF5, 0xD3EB, 0x8FF6, 0xD3F1, 0x8FF7, 0xB067, 0x8FF8, 0xB06E, 0x8FFA, 0xB069, 0x8FFB, 0xD3EE, + 0x8FFC, 0xD3F0, 0x8FFD, 0xB06C, 0x8FFE, 0xD3EA, 0x8FFF, 0xD3ED, 0x9000, 0xB068, 0x9001, 0xB065, 0x9002, 0xD3EC, 0x9003, 0xB06B, + 0x9004, 0xD3EF, 0x9005, 0xB06D, 0x9006, 0xB066, 0x900B, 0xD7E3, 0x900C, 0xD7E6, 0x900D, 0xB370, 0x900F, 0xB37A, 0x9010, 0xB376, + 0x9011, 0xD7E4, 0x9014, 0xB37E, 0x9015, 0xB377, 0x9016, 0xB37C, 0x9017, 0xB372, 0x9019, 0xB36F, 0x901A, 0xB371, 0x901B, 0xB37D, + 0x901C, 0xD7E5, 0x901D, 0xB375, 0x901E, 0xB378, 0x901F, 0xB374, 0x9020, 0xB379, 0x9021, 0xD7E7, 0x9022, 0xB37B, 0x9023, 0xB373, + 0x9024, 0xD7E2, 0x902D, 0xDC4D, 0x902E, 0xB665, 0x902F, 0xDC4F, 0x9031, 0xB667, 0x9032, 0xB669, 0x9034, 0xDC4E, 0x9035, 0xB666, + 0x9036, 0xB66A, 0x9038, 0xB668, 0x903C, 0xB947, 0x903D, 0xE0A3, 0x903E, 0xB94F, 0x903F, 0xE07E, 0x9041, 0xB950, 0x9042, 0xB945, + 0x9044, 0xE0A1, 0x9047, 0xB94A, 0x9049, 0xE0A2, 0x904A, 0xB943, 0x904B, 0xB942, 0x904D, 0xB94D, 0x904E, 0xB94C, 0x904F, 0xB94B, + 0x9050, 0xB949, 0x9051, 0xB94E, 0x9052, 0xE07D, 0x9053, 0xB944, 0x9054, 0xB946, 0x9055, 0xB948, 0x9058, 0xBBB8, 0x9059, 0xBBBB, + 0x905B, 0xBBBF, 0x905C, 0xBBB9, 0x905D, 0xBBBE, 0x905E, 0xBBBC, 0x9060, 0xBBB7, 0x9062, 0xBBBD, 0x9063, 0xBBBA, 0x9067, 0xE852, + 0x9068, 0xBE43, 0x9069, 0xBE41, 0x906B, 0xE853, 0x906D, 0xBE44, 0x906E, 0xBE42, 0x906F, 0xE851, 0x9070, 0xE850, 0x9072, 0xBFF0, + 0x9073, 0xE84F, 0x9074, 0xBFEE, 0x9075, 0xBFED, 0x9076, 0xEBD0, 0x9077, 0xBE45, 0x9078, 0xBFEF, 0x9079, 0xEBD1, 0x907A, 0xBFF2, + 0x907B, 0xEBD2, 0x907C, 0xBFF1, 0x907D, 0xC1D8, 0x907E, 0xEEC3, 0x907F, 0xC1D7, 0x9080, 0xC1DC, 0x9081, 0xC1DA, 0x9082, 0xC1DB, + 0x9083, 0xC2E3, 0x9084, 0xC1D9, 0x9085, 0xEEC2, 0x9086, 0xEBD3, 0x9087, 0xC2E2, 0x9088, 0xC2E4, 0x908A, 0xC3E4, 0x908B, 0xC3E5, + 0x908D, 0xF4E0, 0x908F, 0xC5DE, 0x9090, 0xC5DD, 0x9091, 0xA8B6, 0x9094, 0xCA55, 0x9095, 0xB06F, 0x9097, 0xCA52, 0x9098, 0xCA53, + 0x9099, 0xCA51, 0x909B, 0xCA54, 0x909E, 0xCBAA, 0x909F, 0xCBA7, 0x90A0, 0xCBAC, 0x90A1, 0xCBA8, 0x90A2, 0xA8B7, 0x90A3, 0xA8BA, + 0x90A5, 0xCBA9, 0x90A6, 0xA8B9, 0x90A7, 0xCBAB, 0x90AA, 0xA8B8, 0x90AF, 0xCDD5, 0x90B0, 0xCDD7, 0x90B1, 0xAAF4, 0x90B2, 0xCDD3, + 0x90B3, 0xCDD6, 0x90B4, 0xCDD4, 0x90B5, 0xAAF2, 0x90B6, 0xAAF5, 0x90B8, 0xAAF3, 0x90BD, 0xD0B8, 0x90BE, 0xD0BC, 0x90BF, 0xD0B9, + 0x90C1, 0xADA7, 0x90C3, 0xADA8, 0x90C5, 0xD0BB, 0x90C7, 0xD0BD, 0x90C8, 0xD0BF, 0x90CA, 0xADA5, 0x90CB, 0xD0BE, 0x90CE, 0xADA6, + 0x90D4, 0xD7EE, 0x90D5, 0xD0BA, 0x90D6, 0xD3F2, 0x90D7, 0xD3FB, 0x90D8, 0xD3F9, 0x90D9, 0xD3F4, 0x90DA, 0xD3F5, 0x90DB, 0xD3FA, + 0x90DC, 0xD3FC, 0x90DD, 0xB071, 0x90DF, 0xD3F7, 0x90E0, 0xD3F3, 0x90E1, 0xB070, 0x90E2, 0xB072, 0x90E3, 0xD3F6, 0x90E4, 0xD3FD, + 0x90E5, 0xD3F8, 0x90E8, 0xB3A1, 0x90E9, 0xD7F1, 0x90EA, 0xD7E9, 0x90EB, 0xD7EF, 0x90EC, 0xD7F0, 0x90ED, 0xB3A2, 0x90EF, 0xD7E8, + 0x90F0, 0xD7EA, 0x90F1, 0xD0B7, 0x90F2, 0xD7EC, 0x90F3, 0xD7ED, 0x90F4, 0xD7EB, 0x90F5, 0xB66C, 0x90F9, 0xDC56, 0x90FA, 0xEBD4, + 0x90FB, 0xDC57, 0x90FC, 0xDC54, 0x90FD, 0xB3A3, 0x90FE, 0xB66E, 0x90FF, 0xDC53, 0x9100, 0xDC59, 0x9101, 0xDC58, 0x9102, 0xB66B, + 0x9103, 0xDC5C, 0x9104, 0xDC52, 0x9105, 0xDC5B, 0x9106, 0xDC50, 0x9107, 0xDC5A, 0x9108, 0xDC55, 0x9109, 0xB66D, 0x910B, 0xE0AA, + 0x910D, 0xE0A5, 0x910E, 0xE0AB, 0x910F, 0xE0A6, 0x9110, 0xE0A4, 0x9111, 0xE0A7, 0x9112, 0xB951, 0x9114, 0xE0A9, 0x9116, 0xE0A8, + 0x9117, 0xB952, 0x9118, 0xBBC1, 0x9119, 0xBBC0, 0x911A, 0xE46E, 0x911B, 0xE471, 0x911C, 0xE469, 0x911D, 0xE46D, 0x911E, 0xBBC2, + 0x911F, 0xE46C, 0x9120, 0xE46A, 0x9121, 0xE470, 0x9122, 0xE46B, 0x9123, 0xE468, 0x9124, 0xE46F, 0x9126, 0xE859, 0x9127, 0xBE48, + 0x9128, 0xF14A, 0x9129, 0xE856, 0x912A, 0xE857, 0x912B, 0xE855, 0x912C, 0xDC51, 0x912D, 0xBE47, 0x912E, 0xE85A, 0x912F, 0xE854, + 0x9130, 0xBE46, 0x9131, 0xBE49, 0x9132, 0xE858, 0x9133, 0xEBD5, 0x9134, 0xBFF3, 0x9135, 0xEBD6, 0x9136, 0xEBD7, 0x9138, 0xEEC4, + 0x9139, 0xC1DD, 0x913A, 0xF14B, 0x913B, 0xF14C, 0x913E, 0xF14D, 0x913F, 0xF35D, 0x9140, 0xF35C, 0x9141, 0xF4E2, 0x9143, 0xF4E1, + 0x9144, 0xF65B, 0x9145, 0xF65C, 0x9146, 0xF65A, 0x9147, 0xF766, 0x9148, 0xC5B0, 0x9149, 0xA8BB, 0x914A, 0xADAA, 0x914B, 0xADA9, + 0x914C, 0xB075, 0x914D, 0xB074, 0x914E, 0xD440, 0x914F, 0xD441, 0x9150, 0xD3FE, 0x9152, 0xB073, 0x9153, 0xD7F5, 0x9155, 0xD7F6, + 0x9156, 0xD7F2, 0x9157, 0xB3A4, 0x9158, 0xD7F3, 0x915A, 0xD7F4, 0x915F, 0xDC5F, 0x9160, 0xDC61, 0x9161, 0xDC5D, 0x9162, 0xDC60, + 0x9163, 0xB66F, 0x9164, 0xDC5E, 0x9165, 0xB670, 0x9168, 0xDD73, 0x9169, 0xB955, 0x916A, 0xB954, 0x916C, 0xB953, 0x916E, 0xE0AC, + 0x916F, 0xE0AD, 0x9172, 0xE473, 0x9173, 0xE475, 0x9174, 0xBBC6, 0x9175, 0xBBC3, 0x9177, 0xBBC5, 0x9178, 0xBBC4, 0x9179, 0xE474, + 0x917A, 0xE472, 0x9180, 0xE861, 0x9181, 0xE85E, 0x9182, 0xE85F, 0x9183, 0xBE4D, 0x9184, 0xE860, 0x9185, 0xE85B, 0x9186, 0xE85C, + 0x9187, 0xBE4A, 0x9189, 0xBE4B, 0x918A, 0xE85D, 0x918B, 0xBE4C, 0x918D, 0xEBDB, 0x918F, 0xEBDC, 0x9190, 0xEBD9, 0x9191, 0xEBDA, + 0x9192, 0xBFF4, 0x9193, 0xEBD8, 0x9199, 0xEEC8, 0x919A, 0xEEC5, 0x919B, 0xEEC7, 0x919C, 0xC1E0, 0x919D, 0xEECB, 0x919E, 0xC1DF, + 0x919F, 0xEEC9, 0x91A0, 0xEECC, 0x91A1, 0xEECA, 0x91A2, 0xEEC6, 0x91A3, 0xC1DE, 0x91A5, 0xF14F, 0x91A7, 0xF150, 0x91A8, 0xF14E, + 0x91AA, 0xF152, 0x91AB, 0xC2E5, 0x91AC, 0xC2E6, 0x91AD, 0xF35F, 0x91AE, 0xC3E7, 0x91AF, 0xF151, 0x91B0, 0xF35E, 0x91B1, 0xC3E6, + 0x91B2, 0xF4E5, 0x91B3, 0xF4E6, 0x91B4, 0xC4BF, 0x91B5, 0xF4E4, 0x91B7, 0xF4E3, 0x91B9, 0xF65D, 0x91BA, 0xC548, 0x91BC, 0xF849, + 0x91BD, 0xF8C8, 0x91BE, 0xF8C7, 0x91C0, 0xC643, 0x91C1, 0xC65D, 0x91C2, 0xF8C9, 0x91C3, 0xF971, 0x91C5, 0xC66F, 0x91C6, 0xA8BC, + 0x91C7, 0xAAF6, 0x91C9, 0xB956, 0x91CB, 0xC4C0, 0x91CC, 0xA8BD, 0x91CD, 0xADAB, 0x91CE, 0xB3A5, 0x91CF, 0xB671, 0x91D0, 0xC2E7, + 0x91D1, 0xAAF7, 0x91D3, 0xD0C1, 0x91D4, 0xD0C0, 0x91D5, 0xD442, 0x91D7, 0xB078, 0x91D8, 0xB076, 0x91D9, 0xB07A, 0x91DA, 0xD444, + 0x91DC, 0xB079, 0x91DD, 0xB077, 0x91E2, 0xD443, 0x91E3, 0xB3A8, 0x91E4, 0xD7FC, 0x91E6, 0xB3A7, 0x91E7, 0xB3A9, 0x91E8, 0xD842, + 0x91E9, 0xB3AB, 0x91EA, 0xD7FE, 0x91EB, 0xD840, 0x91EC, 0xD7F7, 0x91ED, 0xB3AA, 0x91EE, 0xD843, 0x91F1, 0xD7F9, 0x91F3, 0xD7FA, + 0x91F4, 0xD7F8, 0x91F5, 0xB3A6, 0x91F7, 0xD841, 0x91F8, 0xD7FB, 0x91F9, 0xD7FD, 0x91FD, 0xDC6D, 0x91FF, 0xDC6C, 0x9200, 0xDC6A, + 0x9201, 0xDC62, 0x9202, 0xDC71, 0x9203, 0xDC65, 0x9204, 0xDC6F, 0x9205, 0xDC76, 0x9206, 0xDC6E, 0x9207, 0xB679, 0x9209, 0xB675, + 0x920A, 0xDC63, 0x920C, 0xDC69, 0x920D, 0xB677, 0x920F, 0xDC68, 0x9210, 0xB678, 0x9211, 0xB67A, 0x9212, 0xDC6B, 0x9214, 0xB672, + 0x9215, 0xB673, 0x9216, 0xDC77, 0x9217, 0xDC75, 0x9219, 0xDC74, 0x921A, 0xDC66, 0x921C, 0xDC72, 0x921E, 0xB676, 0x9223, 0xB674, + 0x9224, 0xDC73, 0x9225, 0xDC64, 0x9226, 0xDC67, 0x9227, 0xDC70, 0x922D, 0xE4BA, 0x922E, 0xE0B7, 0x9230, 0xE0B0, 0x9231, 0xE0C3, + 0x9232, 0xE0CC, 0x9233, 0xE0B3, 0x9234, 0xB961, 0x9236, 0xE0C0, 0x9237, 0xB957, 0x9238, 0xB959, 0x9239, 0xB965, 0x923A, 0xE0B1, + 0x923D, 0xB95A, 0x923E, 0xB95C, 0x923F, 0xB966, 0x9240, 0xB95B, 0x9245, 0xB964, 0x9246, 0xE0B9, 0x9248, 0xE0AE, 0x9249, 0xB962, + 0x924A, 0xE0B8, 0x924B, 0xB95E, 0x924C, 0xE0CA, 0x924D, 0xB963, 0x924E, 0xE0C8, 0x924F, 0xE0BC, 0x9250, 0xE0C6, 0x9251, 0xB960, + 0x9252, 0xE0AF, 0x9253, 0xE0C9, 0x9254, 0xE0C4, 0x9256, 0xE0CB, 0x9257, 0xB958, 0x925A, 0xB967, 0x925B, 0xB95D, 0x925E, 0xE0B5, + 0x9260, 0xE0BD, 0x9261, 0xE0C1, 0x9263, 0xE0C5, 0x9264, 0xB95F, 0x9265, 0xE0B4, 0x9266, 0xE0B2, 0x9267, 0xE0BE, 0x926C, 0xE0BB, + 0x926D, 0xE0BA, 0x926F, 0xE0BF, 0x9270, 0xE0C2, 0x9272, 0xE0C7, 0x9276, 0xE478, 0x9278, 0xBBC7, 0x9279, 0xE4A4, 0x927A, 0xE47A, + 0x927B, 0xBBCC, 0x927C, 0xBBD0, 0x927D, 0xE4AD, 0x927E, 0xE4B5, 0x927F, 0xE4A6, 0x9280, 0xBBC8, 0x9282, 0xE4AA, 0x9283, 0xE0B6, + 0x9285, 0xBBC9, 0x9286, 0xE4B1, 0x9287, 0xE4B6, 0x9288, 0xE4AE, 0x928A, 0xE4B0, 0x928B, 0xE4B9, 0x928C, 0xE4B2, 0x928D, 0xE47E, + 0x928E, 0xE4A9, 0x9291, 0xBBD1, 0x9293, 0xBBCD, 0x9294, 0xE47C, 0x9295, 0xE4AB, 0x9296, 0xBBCB, 0x9297, 0xE4A5, 0x9298, 0xBBCA, + 0x9299, 0xE4B3, 0x929A, 0xE4A2, 0x929B, 0xE479, 0x929C, 0xBBCE, 0x929D, 0xE4B8, 0x92A0, 0xE47B, 0x92A1, 0xE4AF, 0x92A2, 0xE4AC, + 0x92A3, 0xE4A7, 0x92A4, 0xE477, 0x92A5, 0xE476, 0x92A6, 0xE4A1, 0x92A7, 0xE4B4, 0x92A8, 0xBBCF, 0x92A9, 0xE4B7, 0x92AA, 0xE47D, + 0x92AB, 0xE4A3, 0x92AC, 0xBE52, 0x92B2, 0xBE5A, 0x92B3, 0xBE55, 0x92B4, 0xE8A4, 0x92B5, 0xE8A1, 0x92B6, 0xE867, 0x92B7, 0xBE50, + 0x92B9, 0xF9D7, 0x92BB, 0xBE4F, 0x92BC, 0xBE56, 0x92C0, 0xE865, 0x92C1, 0xBE54, 0x92C2, 0xE871, 0x92C3, 0xE863, 0x92C4, 0xE864, + 0x92C5, 0xBE4E, 0x92C6, 0xE8A3, 0x92C7, 0xBE58, 0x92C8, 0xE874, 0x92C9, 0xE879, 0x92CA, 0xE873, 0x92CB, 0xEBEE, 0x92CC, 0xE86F, + 0x92CD, 0xE877, 0x92CE, 0xE875, 0x92CF, 0xE868, 0x92D0, 0xE862, 0x92D1, 0xE87D, 0x92D2, 0xBE57, 0x92D3, 0xE87E, 0x92D5, 0xE878, + 0x92D7, 0xE86D, 0x92D8, 0xE86B, 0x92D9, 0xE866, 0x92DD, 0xE86E, 0x92DE, 0xE87B, 0x92DF, 0xE86A, 0x92E0, 0xE87A, 0x92E1, 0xE8A2, + 0x92E4, 0xBE53, 0x92E6, 0xE876, 0x92E7, 0xE87C, 0x92E8, 0xE872, 0x92E9, 0xE86C, 0x92EA, 0xBE51, 0x92EE, 0xE4A8, 0x92EF, 0xE870, + 0x92F0, 0xBE59, 0x92F1, 0xE869, 0x92F7, 0xEBF4, 0x92F8, 0xBFF7, 0x92F9, 0xEBF3, 0x92FA, 0xEBF0, 0x92FB, 0xEC44, 0x92FC, 0xBFFB, + 0x92FE, 0xEC41, 0x92FF, 0xEBF8, 0x9300, 0xEC43, 0x9301, 0xEBE9, 0x9302, 0xEBF6, 0x9304, 0xBFFD, 0x9306, 0xEBE1, 0x9308, 0xEBDF, + 0x9309, 0xEC42, 0x930B, 0xEC40, 0x930C, 0xEBFE, 0x930D, 0xEBED, 0x930E, 0xEBEC, 0x930F, 0xEBE2, 0x9310, 0xC040, 0x9312, 0xEBE8, + 0x9313, 0xEBF2, 0x9314, 0xEBFD, 0x9315, 0xC043, 0x9316, 0xEC45, 0x9318, 0xC1E8, 0x9319, 0xC045, 0x931A, 0xBFFE, 0x931B, 0xEBE6, + 0x931D, 0xEBEF, 0x931E, 0xEBDE, 0x931F, 0xEBE0, 0x9320, 0xBFF5, 0x9321, 0xC042, 0x9322, 0xBFFA, 0x9323, 0xEBE7, 0x9324, 0xEBF7, + 0x9325, 0xEBF1, 0x9326, 0xC041, 0x9327, 0xEBDD, 0x9328, 0xC1E3, 0x9329, 0xEBF9, 0x932A, 0xEBFC, 0x932B, 0xBFFC, 0x932D, 0xEBEB, + 0x932E, 0xC044, 0x932F, 0xBFF9, 0x9333, 0xBFF8, 0x9334, 0xEBF5, 0x9335, 0xEBFB, 0x9336, 0xBFF6, 0x9338, 0xEBE4, 0x9339, 0xEBFA, + 0x933C, 0xEBE5, 0x9346, 0xEBEA, 0x9347, 0xEED2, 0x9349, 0xEED7, 0x934A, 0xC1E5, 0x934B, 0xC1E7, 0x934C, 0xEEDD, 0x934D, 0xC1E1, + 0x934E, 0xEEEC, 0x934F, 0xEEE3, 0x9350, 0xEED8, 0x9351, 0xEED9, 0x9352, 0xEEE2, 0x9354, 0xC1EE, 0x9355, 0xEEE1, 0x9356, 0xEED1, + 0x9357, 0xEEE0, 0x9358, 0xEED4, 0x9359, 0xEEED, 0x935A, 0xC1ED, 0x935B, 0xC1EB, 0x935C, 0xEED5, 0x935E, 0xEEE8, 0x9360, 0xEEDA, + 0x9361, 0xEEE7, 0x9363, 0xEEE9, 0x9364, 0xEED0, 0x9365, 0xC1E6, 0x9367, 0xEEEA, 0x936A, 0xEEDE, 0x936C, 0xC1EA, 0x936D, 0xEEDB, + 0x9370, 0xC1EC, 0x9371, 0xEEE4, 0x9375, 0xC1E4, 0x9376, 0xEED6, 0x9377, 0xEEE5, 0x9379, 0xEEDF, 0x937A, 0xEBE3, 0x937B, 0xEEE6, + 0x937C, 0xEED3, 0x937E, 0xC1E9, 0x9380, 0xEEEB, 0x9382, 0xC1E2, 0x9383, 0xEECE, 0x9388, 0xF160, 0x9389, 0xF159, 0x938A, 0xC2E9, + 0x938C, 0xF154, 0x938D, 0xF163, 0x938E, 0xF15B, 0x938F, 0xEEDC, 0x9391, 0xF165, 0x9392, 0xF155, 0x9394, 0xC2E8, 0x9395, 0xF15F, + 0x9396, 0xC2EA, 0x9397, 0xC2F2, 0x9398, 0xC2F0, 0x9399, 0xF161, 0x939A, 0xC2F1, 0x939B, 0xF157, 0x939D, 0xF158, 0x939E, 0xF15D, + 0x939F, 0xF162, 0x93A1, 0xEECD, 0x93A2, 0xC2EB, 0x93A3, 0xF16A, 0x93A4, 0xF167, 0x93A5, 0xF16B, 0x93A6, 0xF15E, 0x93A7, 0xF15A, + 0x93A8, 0xF168, 0x93A9, 0xF36A, 0x93AA, 0xF15C, 0x93AC, 0xC2EE, 0x93AE, 0xC2ED, 0x93AF, 0xEECF, 0x93B0, 0xC2EF, 0x93B1, 0xF164, + 0x93B2, 0xF166, 0x93B3, 0xC2EC, 0x93B4, 0xF169, 0x93B5, 0xF153, 0x93B7, 0xF156, 0x93C0, 0xF373, 0x93C2, 0xF363, 0x93C3, 0xC3EB, + 0x93C4, 0xF371, 0x93C7, 0xF361, 0x93C8, 0xC3EC, 0x93CA, 0xF36C, 0x93CC, 0xF368, 0x93CD, 0xC3F1, 0x93CE, 0xF372, 0x93CF, 0xF362, + 0x93D0, 0xF365, 0x93D1, 0xC3E9, 0x93D2, 0xF374, 0x93D4, 0xF36D, 0x93D5, 0xF370, 0x93D6, 0xC3EF, 0x93D7, 0xC3F4, 0x93D8, 0xC3F2, + 0x93D9, 0xF369, 0x93DA, 0xF364, 0x93DC, 0xC3ED, 0x93DD, 0xC3EE, 0x93DE, 0xF360, 0x93DF, 0xC3EA, 0x93E1, 0xC3E8, 0x93E2, 0xC3F0, + 0x93E3, 0xF36F, 0x93E4, 0xC3F3, 0x93E6, 0xF36B, 0x93E7, 0xF375, 0x93E8, 0xC3F5, 0x93EC, 0xF367, 0x93EE, 0xF36E, 0x93F5, 0xF4F3, + 0x93F6, 0xF542, 0x93F7, 0xF4F5, 0x93F8, 0xF4FC, 0x93F9, 0xF366, 0x93FA, 0xF4FA, 0x93FB, 0xF4E9, 0x93FC, 0xF540, 0x93FD, 0xC4C3, + 0x93FE, 0xF4ED, 0x93FF, 0xF4FE, 0x9400, 0xF4F4, 0x9403, 0xC4C2, 0x9406, 0xF544, 0x9407, 0xF4F6, 0x9409, 0xF4FB, 0x940A, 0xF4FD, + 0x940B, 0xF4E7, 0x940C, 0xF541, 0x940D, 0xF4F2, 0x940E, 0xF4F7, 0x940F, 0xF4EB, 0x9410, 0xF4EF, 0x9411, 0xF543, 0x9412, 0xF4F9, + 0x9413, 0xF4E8, 0x9414, 0xF4EC, 0x9415, 0xF4EE, 0x9416, 0xF4F8, 0x9418, 0xC4C1, 0x9419, 0xF4F1, 0x9420, 0xF4EA, 0x9428, 0xF4F0, + 0x9429, 0xF661, 0x942A, 0xF666, 0x942B, 0xC54F, 0x942C, 0xF668, 0x942E, 0xC549, 0x9430, 0xF664, 0x9431, 0xF66A, 0x9432, 0xC54E, + 0x9433, 0xC54A, 0x9435, 0xC54B, 0x9436, 0xF660, 0x9437, 0xF667, 0x9438, 0xC54D, 0x9439, 0xF665, 0x943A, 0xC54C, 0x943B, 0xF65F, + 0x943C, 0xF663, 0x943D, 0xF662, 0x943F, 0xF65E, 0x9440, 0xF669, 0x9444, 0xC5B1, 0x9445, 0xF76D, 0x9446, 0xF770, 0x9447, 0xF76C, + 0x9448, 0xF76E, 0x9449, 0xF76F, 0x944A, 0xF769, 0x944B, 0xF76A, 0x944C, 0xF767, 0x944F, 0xF76B, 0x9450, 0xF768, 0x9451, 0xC5B2, + 0x9452, 0xC5B3, 0x9455, 0xF84B, 0x9457, 0xF84D, 0x945D, 0xF84C, 0x945E, 0xF84E, 0x9460, 0xC5E0, 0x9462, 0xF84A, 0x9463, 0xC5DF, + 0x9464, 0xC5E1, 0x9468, 0xF8CB, 0x9469, 0xF8CC, 0x946A, 0xC644, 0x946B, 0xF8CA, 0x946D, 0xF953, 0x946E, 0xF952, 0x946F, 0xF954, + 0x9470, 0xC65F, 0x9471, 0xF955, 0x9472, 0xC65E, 0x9473, 0xF956, 0x9474, 0xF972, 0x9475, 0xF975, 0x9476, 0xF974, 0x9477, 0xC668, + 0x9478, 0xF973, 0x947C, 0xC672, 0x947D, 0xC670, 0x947E, 0xC671, 0x947F, 0xC677, 0x9480, 0xF9C0, 0x9481, 0xF9C1, 0x9482, 0xF9BF, + 0x9483, 0xF9C9, 0x9577, 0xAAF8, 0x957A, 0xD844, 0x957B, 0xDC78, 0x957C, 0xE8A5, 0x957D, 0xF376, 0x9580, 0xAAF9, 0x9582, 0xADAC, + 0x9583, 0xB07B, 0x9586, 0xD845, 0x9588, 0xD846, 0x9589, 0xB3AC, 0x958B, 0xB67D, 0x958C, 0xDC7A, 0x958D, 0xDC79, 0x958E, 0xB6A3, + 0x958F, 0xB67C, 0x9590, 0xDC7B, 0x9591, 0xB67E, 0x9592, 0xB6A2, 0x9593, 0xB6A1, 0x9594, 0xB67B, 0x9598, 0xB968, 0x959B, 0xE0D0, + 0x959C, 0xE0CE, 0x959E, 0xE0CF, 0x959F, 0xE0CD, 0x95A1, 0xBBD2, 0x95A3, 0xBBD5, 0x95A4, 0xBBD7, 0x95A5, 0xBBD6, 0x95A8, 0xBBD3, + 0x95A9, 0xBBD4, 0x95AB, 0xE8A7, 0x95AC, 0xE8A6, 0x95AD, 0xBE5B, 0x95AE, 0xE8A8, 0x95B0, 0xE8A9, 0x95B1, 0xBE5C, 0x95B5, 0xEC4D, + 0x95B6, 0xEC4B, 0x95B7, 0xEEF3, 0x95B9, 0xEC49, 0x95BA, 0xEC4A, 0x95BB, 0xC046, 0x95BC, 0xEC46, 0x95BD, 0xEC4E, 0x95BE, 0xEC48, + 0x95BF, 0xEC4C, 0x95C0, 0xEEEF, 0x95C3, 0xEEF1, 0x95C5, 0xEEF2, 0x95C6, 0xC1F3, 0x95C7, 0xEEEE, 0x95C8, 0xC1F2, 0x95C9, 0xEEF0, + 0x95CA, 0xC1EF, 0x95CB, 0xC1F0, 0x95CC, 0xC1F1, 0x95CD, 0xEC47, 0x95D0, 0xC2F5, 0x95D1, 0xF16E, 0x95D2, 0xF16C, 0x95D3, 0xF16D, + 0x95D4, 0xC2F3, 0x95D5, 0xC2F6, 0x95D6, 0xC2F4, 0x95DA, 0xF377, 0x95DB, 0xF378, 0x95DC, 0xC3F6, 0x95DE, 0xF545, 0x95DF, 0xF547, + 0x95E0, 0xF546, 0x95E1, 0xC4C4, 0x95E2, 0xC550, 0x95E3, 0xF66D, 0x95E4, 0xF66C, 0x95E5, 0xF66B, 0x961C, 0xAAFA, 0x961E, 0xC9AA, + 0x9620, 0xCA58, 0x9621, 0xA6E9, 0x9622, 0xCA56, 0x9623, 0xCA59, 0x9624, 0xCA57, 0x9628, 0xCBAE, 0x962A, 0xA8C1, 0x962C, 0xA8C2, + 0x962D, 0xCBB0, 0x962E, 0xA8BF, 0x962F, 0xCBAF, 0x9630, 0xCBAD, 0x9631, 0xA8C0, 0x9632, 0xA8BE, 0x9639, 0xCDD8, 0x963A, 0xCDDB, + 0x963B, 0xAAFD, 0x963C, 0xCDDA, 0x963D, 0xCDD9, 0x963F, 0xAAFC, 0x9640, 0xAAFB, 0x9642, 0xAB40, 0x9643, 0xCDDC, 0x9644, 0xAAFE, + 0x964A, 0xD0C6, 0x964B, 0xADAE, 0x964C, 0xADAF, 0x964D, 0xADB0, 0x964E, 0xD0C7, 0x964F, 0xD0C3, 0x9650, 0xADAD, 0x9651, 0xD0C4, + 0x9653, 0xD0C5, 0x9654, 0xD0C2, 0x9658, 0xB0A4, 0x965B, 0xB0A1, 0x965C, 0xD445, 0x965D, 0xB0A2, 0x965E, 0xB0A5, 0x965F, 0xD446, + 0x9661, 0xB07E, 0x9662, 0xB07C, 0x9663, 0xB07D, 0x9664, 0xB0A3, 0x966A, 0xB3AD, 0x966B, 0xD849, 0x966C, 0xB3B5, 0x966D, 0xD848, + 0x966F, 0xD84B, 0x9670, 0xB3B1, 0x9671, 0xD84A, 0x9672, 0xB6AB, 0x9673, 0xB3AF, 0x9674, 0xB3B2, 0x9675, 0xB3AE, 0x9676, 0xB3B3, + 0x9677, 0xB3B4, 0x9678, 0xB3B0, 0x967C, 0xD847, 0x967D, 0xB6A7, 0x967E, 0xDC7D, 0x9680, 0xDCA3, 0x9683, 0xDCA2, 0x9684, 0xB6AC, + 0x9685, 0xB6A8, 0x9686, 0xB6A9, 0x9687, 0xDC7C, 0x9688, 0xDC7E, 0x9689, 0xDCA1, 0x968A, 0xB6A4, 0x968B, 0xB6A6, 0x968D, 0xB6AA, + 0x968E, 0xB6A5, 0x9691, 0xE0D3, 0x9692, 0xE0D1, 0x9693, 0xE0D2, 0x9694, 0xB96A, 0x9695, 0xB96B, 0x9697, 0xE0D4, 0x9698, 0xB969, + 0x9699, 0xBBD8, 0x969B, 0xBBDA, 0x969C, 0xBBD9, 0x969E, 0xE4BB, 0x96A1, 0xE4BC, 0x96A2, 0xE8AB, 0x96A4, 0xE8AA, 0x96A7, 0xC047, + 0x96A8, 0xC048, 0x96A9, 0xEC4F, 0x96AA, 0xC049, 0x96AC, 0xEEF6, 0x96AE, 0xEEF4, 0x96B0, 0xEEF5, 0x96B1, 0xC1F4, 0x96B3, 0xF16F, + 0x96B4, 0xC3F7, 0x96B8, 0xC1F5, 0x96B9, 0xAB41, 0x96BB, 0xB0A6, 0x96BC, 0xD447, 0x96BF, 0xD84C, 0x96C0, 0xB3B6, 0x96C1, 0xB6AD, + 0x96C2, 0xDCA4, 0x96C3, 0xDCA6, 0x96C4, 0xB6AF, 0x96C5, 0xB6AE, 0x96C6, 0xB6B0, 0x96C7, 0xB6B1, 0x96C8, 0xDCA5, 0x96C9, 0xB96E, + 0x96CA, 0xB96F, 0x96CB, 0xB96D, 0x96CC, 0xBBDB, 0x96CD, 0xB96C, 0x96CE, 0xE0D5, 0x96D2, 0xBBDC, 0x96D3, 0xE8AC, 0x96D4, 0xEC50, + 0x96D5, 0xC04A, 0x96D6, 0xC1F6, 0x96D7, 0xF170, 0x96D8, 0xF174, 0x96D9, 0xC2F9, 0x96DA, 0xF171, 0x96DB, 0xC2FA, 0x96DC, 0xC2F8, + 0x96DD, 0xF175, 0x96DE, 0xC2FB, 0x96DF, 0xF173, 0x96E1, 0xF379, 0x96E2, 0xC2F7, 0x96E3, 0xC3F8, 0x96E5, 0xF8CD, 0x96E8, 0xAB42, + 0x96E9, 0xB3B8, 0x96EA, 0xB3B7, 0x96EF, 0xB6B2, 0x96F0, 0xDCA8, 0x96F1, 0xDCA7, 0x96F2, 0xB6B3, 0x96F5, 0xE0D9, 0x96F6, 0xB973, + 0x96F7, 0xB970, 0x96F8, 0xE0D8, 0x96F9, 0xB972, 0x96FA, 0xE0D6, 0x96FB, 0xB971, 0x96FD, 0xE0D7, 0x96FF, 0xE4BD, 0x9700, 0xBBDD, + 0x9702, 0xE8AF, 0x9704, 0xBE5D, 0x9705, 0xE8AD, 0x9706, 0xBE5E, 0x9707, 0xBE5F, 0x9708, 0xE8AE, 0x9709, 0xBE60, 0x970B, 0xEC51, + 0x970D, 0xC04E, 0x970E, 0xC04B, 0x970F, 0xC050, 0x9710, 0xEC53, 0x9711, 0xC04C, 0x9712, 0xEC52, 0x9713, 0xC04F, 0x9716, 0xC04D, + 0x9718, 0xEEF9, 0x9719, 0xEEFB, 0x971C, 0xC1F7, 0x971D, 0xEEFA, 0x971E, 0xC1F8, 0x971F, 0xEEF8, 0x9720, 0xEEF7, 0x9722, 0xF177, + 0x9723, 0xF176, 0x9724, 0xC2FC, 0x9725, 0xF178, 0x9726, 0xF37E, 0x9727, 0xC3FA, 0x9728, 0xF37D, 0x9729, 0xF37A, 0x972A, 0xC3F9, + 0x972B, 0xF37B, 0x972C, 0xF37C, 0x972E, 0xF548, 0x972F, 0xF549, 0x9730, 0xC4C5, 0x9732, 0xC553, 0x9735, 0xF66E, 0x9738, 0xC551, + 0x9739, 0xC552, 0x973A, 0xF66F, 0x973D, 0xC5B4, 0x973E, 0xC5B5, 0x973F, 0xF771, 0x9742, 0xC645, 0x9743, 0xF8CF, 0x9744, 0xC647, + 0x9746, 0xF8CE, 0x9747, 0xF8D0, 0x9748, 0xC646, 0x9749, 0xF957, 0x974B, 0xF9AD, 0x9752, 0xAB43, 0x9756, 0xB974, 0x9758, 0xE4BE, + 0x975A, 0xE8B0, 0x975B, 0xC051, 0x975C, 0xC052, 0x975E, 0xAB44, 0x9760, 0xBE61, 0x9761, 0xC3FB, 0x9762, 0xADB1, 0x9766, 0xC053, + 0x9768, 0xC5E2, 0x9769, 0xADB2, 0x976A, 0xD84D, 0x976C, 0xDCA9, 0x976E, 0xDCAB, 0x9770, 0xDCAA, 0x9772, 0xE0DD, 0x9773, 0xE0DA, + 0x9774, 0xB975, 0x9776, 0xB976, 0x9777, 0xE0DB, 0x9778, 0xE0DC, 0x977A, 0xE4C0, 0x977B, 0xE4C5, 0x977C, 0xBBDE, 0x977D, 0xE4BF, + 0x977E, 0xE4C1, 0x977F, 0xE4C8, 0x9780, 0xE4C3, 0x9781, 0xE4C7, 0x9782, 0xE4C4, 0x9783, 0xE4C2, 0x9784, 0xE4C6, 0x9785, 0xBBDF, + 0x9788, 0xE8B3, 0x978A, 0xE8B1, 0x978B, 0xBE63, 0x978D, 0xBE62, 0x978E, 0xE8B2, 0x978F, 0xBE64, 0x9794, 0xEC56, 0x9797, 0xEC55, + 0x9798, 0xC054, 0x9799, 0xEC54, 0x979A, 0xEEFC, 0x979C, 0xEEFE, 0x979D, 0xEF41, 0x979E, 0xEF40, 0x97A0, 0xC1F9, 0x97A1, 0xEEFD, + 0x97A2, 0xF1A1, 0x97A3, 0xC2FD, 0x97A4, 0xF17D, 0x97A5, 0xF1A2, 0x97A6, 0xC2FE, 0x97A8, 0xF17B, 0x97AA, 0xF17E, 0x97AB, 0xF17C, + 0x97AC, 0xF179, 0x97AD, 0xC340, 0x97AE, 0xF17A, 0x97B3, 0xF3A1, 0x97B6, 0xF3A3, 0x97B7, 0xF3A2, 0x97B9, 0xF54A, 0x97BB, 0xF54B, + 0x97BF, 0xF670, 0x97C1, 0xC5B7, 0x97C3, 0xC5B6, 0x97C4, 0xF84F, 0x97C5, 0xF850, 0x97C6, 0xC648, 0x97C7, 0xF8D1, 0x97C9, 0xC669, + 0x97CB, 0xADB3, 0x97CC, 0xB6B4, 0x97CD, 0xE4CA, 0x97CE, 0xE4C9, 0x97CF, 0xE8B5, 0x97D0, 0xE8B4, 0x97D3, 0xC1FA, 0x97D4, 0xEF43, + 0x97D5, 0xEF42, 0x97D6, 0xF1A5, 0x97D7, 0xF1A3, 0x97D8, 0xF1A6, 0x97D9, 0xF1A4, 0x97DC, 0xC3FC, 0x97DD, 0xF3A4, 0x97DE, 0xF3A5, + 0x97DF, 0xF3A6, 0x97E1, 0xF671, 0x97E3, 0xF772, 0x97E5, 0xF8D2, 0x97ED, 0xADB4, 0x97F0, 0xEC57, 0x97F1, 0xEF44, 0x97F3, 0xADB5, + 0x97F6, 0xBBE0, 0x97F8, 0xEC58, 0x97F9, 0xC341, 0x97FA, 0xF1A7, 0x97FB, 0xC3FD, 0x97FD, 0xF54C, 0x97FE, 0xF54D, 0x97FF, 0xC554, + 0x9800, 0xF851, 0x9801, 0xADB6, 0x9802, 0xB3BB, 0x9803, 0xB3BC, 0x9804, 0xD84E, 0x9805, 0xB6B5, 0x9806, 0xB6B6, 0x9807, 0xDCAC, + 0x9808, 0xB6B7, 0x980A, 0xB97A, 0x980C, 0xB97C, 0x980D, 0xE0DF, 0x980E, 0xE0E0, 0x980F, 0xE0DE, 0x9810, 0xB977, 0x9811, 0xB978, + 0x9812, 0xB97B, 0x9813, 0xB979, 0x9816, 0xE4CB, 0x9817, 0xBBE1, 0x9818, 0xBBE2, 0x981B, 0xE8BC, 0x981C, 0xBE67, 0x981D, 0xE8B7, + 0x981E, 0xE8B6, 0x9820, 0xE8BB, 0x9821, 0xBE65, 0x9824, 0xC05B, 0x9826, 0xE8B8, 0x9827, 0xE8BD, 0x9828, 0xE8BA, 0x9829, 0xE8B9, + 0x982B, 0xBE66, 0x982D, 0xC059, 0x982F, 0xEC5A, 0x9830, 0xC055, 0x9832, 0xEC5B, 0x9835, 0xEC59, 0x9837, 0xC058, 0x9838, 0xC056, + 0x9839, 0xC05A, 0x983B, 0xC057, 0x9841, 0xEF45, 0x9843, 0xEF4A, 0x9844, 0xEF46, 0x9845, 0xEF49, 0x9846, 0xC1FB, 0x9848, 0xEDD4, + 0x9849, 0xEF48, 0x984A, 0xEF47, 0x984C, 0xC344, 0x984D, 0xC342, 0x984E, 0xC345, 0x984F, 0xC343, 0x9850, 0xF1A8, 0x9851, 0xF1A9, + 0x9852, 0xF1AA, 0x9853, 0xC346, 0x9857, 0xF3AA, 0x9858, 0xC440, 0x9859, 0xF3A8, 0x985B, 0xC441, 0x985C, 0xF3A7, 0x985D, 0xF3A9, + 0x985E, 0xC3FE, 0x985F, 0xF551, 0x9860, 0xF54E, 0x9862, 0xF54F, 0x9863, 0xF550, 0x9864, 0xF672, 0x9865, 0xC556, 0x9867, 0xC555, + 0x9869, 0xF774, 0x986A, 0xF773, 0x986B, 0xC5B8, 0x986F, 0xC5E3, 0x9870, 0xC649, 0x9871, 0xC660, 0x9872, 0xF958, 0x9873, 0xF9AE, + 0x9874, 0xF9AF, 0x98A8, 0xADB7, 0x98A9, 0xDCAD, 0x98AC, 0xE0E1, 0x98AD, 0xE4CC, 0x98AE, 0xE4CD, 0x98AF, 0xBBE3, 0x98B1, 0xBBE4, + 0x98B2, 0xE8BE, 0x98B3, 0xBE68, 0x98B6, 0xC1FC, 0x98B8, 0xF1AB, 0x98BA, 0xC347, 0x98BB, 0xF3AD, 0x98BC, 0xC442, 0x98BD, 0xF3AC, + 0x98BE, 0xF3AE, 0x98BF, 0xF3AB, 0x98C0, 0xF675, 0x98C1, 0xF552, 0x98C2, 0xF553, 0x98C4, 0xC4C6, 0x98C6, 0xF674, 0x98C9, 0xF673, + 0x98CB, 0xF775, 0x98CC, 0xF9B0, 0x98DB, 0xADB8, 0x98DF, 0xADB9, 0x98E2, 0xB0A7, 0x98E3, 0xD448, 0x98E5, 0xD84F, 0x98E7, 0xB6B8, + 0x98E9, 0xB6BB, 0x98EA, 0xB6B9, 0x98EB, 0xDCAE, 0x98ED, 0xB6BD, 0x98EF, 0xB6BA, 0x98F2, 0xB6BC, 0x98F4, 0xB97E, 0x98F6, 0xE0E2, + 0x98F9, 0xE0E3, 0x98FA, 0xE8C0, 0x98FC, 0xB97D, 0x98FD, 0xB9A1, 0x98FE, 0xB9A2, 0x9900, 0xE4CF, 0x9902, 0xE4CE, 0x9903, 0xBBE5, + 0x9905, 0xBBE6, 0x9907, 0xE4D0, 0x9908, 0xE8BF, 0x9909, 0xBBE8, 0x990A, 0xBE69, 0x990C, 0xBBE7, 0x9910, 0xC05C, 0x9911, 0xE8C1, + 0x9912, 0xBE6B, 0x9913, 0xBE6A, 0x9914, 0xE8C2, 0x9915, 0xE8C5, 0x9916, 0xE8C3, 0x9917, 0xE8C4, 0x9918, 0xBE6C, 0x991A, 0xC061, + 0x991B, 0xC05F, 0x991E, 0xC05E, 0x991F, 0xEC5D, 0x9921, 0xC060, 0x9924, 0xEC5C, 0x9925, 0xEF4B, 0x9927, 0xEC5E, 0x9928, 0xC05D, + 0x9929, 0xEC5F, 0x992A, 0xEF4E, 0x992B, 0xEF4C, 0x992C, 0xEF4D, 0x992D, 0xEF52, 0x992E, 0xC34B, 0x992F, 0xEF51, 0x9930, 0xEF54, + 0x9931, 0xEF53, 0x9932, 0xEF50, 0x9933, 0xEF4F, 0x9935, 0xC1FD, 0x993A, 0xF1AE, 0x993C, 0xF1AD, 0x993D, 0xC34A, 0x993E, 0xC348, + 0x993F, 0xC349, 0x9941, 0xF1AC, 0x9943, 0xF3B1, 0x9945, 0xC443, 0x9947, 0xF3B0, 0x9948, 0xF3AF, 0x9949, 0xC444, 0x994B, 0xF558, + 0x994C, 0xF557, 0x994E, 0xF555, 0x9950, 0xF554, 0x9951, 0xC4C8, 0x9952, 0xC4C7, 0x9953, 0xF559, 0x9954, 0xF776, 0x9955, 0xC5B9, + 0x9956, 0xF677, 0x9957, 0xC557, 0x9958, 0xF676, 0x9959, 0xF556, 0x995B, 0xF777, 0x995C, 0xC5E4, 0x995E, 0xC661, 0x995F, 0xF959, + 0x9961, 0xF9B1, 0x9996, 0xADBA, 0x9997, 0xD850, 0x9998, 0xEF55, 0x9999, 0xADBB, 0x999C, 0xE4D2, 0x999D, 0xE4D1, 0x999E, 0xEC60, + 0x99A1, 0xEF57, 0x99A3, 0xEF56, 0x99A5, 0xC34C, 0x99A6, 0xF3B2, 0x99A7, 0xF3B3, 0x99A8, 0xC4C9, 0x99AB, 0xF9B2, 0x99AC, 0xB0A8, + 0x99AD, 0xB6BF, 0x99AE, 0xB6BE, 0x99AF, 0xE0E4, 0x99B0, 0xE0E6, 0x99B1, 0xB9A4, 0x99B2, 0xE0E5, 0x99B3, 0xB9A3, 0x99B4, 0xB9A5, + 0x99B5, 0xE0E7, 0x99B9, 0xE4D4, 0x99BA, 0xE4D6, 0x99BB, 0xE4D5, 0x99BD, 0xE4D8, 0x99C1, 0xBBE9, 0x99C2, 0xE4D7, 0x99C3, 0xE4D3, + 0x99C7, 0xE4D9, 0x99C9, 0xE8CC, 0x99CB, 0xE8CF, 0x99CC, 0xE8D1, 0x99CD, 0xE8C7, 0x99CE, 0xE8CB, 0x99CF, 0xE8C8, 0x99D0, 0xBE6E, + 0x99D1, 0xBE71, 0x99D2, 0xBE73, 0x99D3, 0xE8C9, 0x99D4, 0xE8CA, 0x99D5, 0xBE72, 0x99D6, 0xE8CD, 0x99D7, 0xE8D0, 0x99D8, 0xE8CE, + 0x99D9, 0xBE74, 0x99DB, 0xBE70, 0x99DC, 0xE8C6, 0x99DD, 0xBE6D, 0x99DF, 0xBE6F, 0x99E2, 0xC063, 0x99E3, 0xEC66, 0x99E4, 0xEC64, + 0x99E5, 0xEC63, 0x99E7, 0xEC69, 0x99E9, 0xEC68, 0x99EA, 0xEC67, 0x99EC, 0xEC62, 0x99ED, 0xC062, 0x99EE, 0xEC61, 0x99F0, 0xEC65, + 0x99F1, 0xC064, 0x99F4, 0xEF5A, 0x99F6, 0xEF5E, 0x99F7, 0xEF5B, 0x99F8, 0xEF5D, 0x99F9, 0xEF5C, 0x99FA, 0xEF59, 0x99FB, 0xEF5F, + 0x99FC, 0xEF62, 0x99FD, 0xEF60, 0x99FE, 0xEF61, 0x99FF, 0xC240, 0x9A01, 0xC1FE, 0x9A02, 0xEF58, 0x9A03, 0xEF63, 0x9A04, 0xF1B3, + 0x9A05, 0xF1B6, 0x9A06, 0xF1B8, 0x9A07, 0xF1B7, 0x9A09, 0xF1B1, 0x9A0A, 0xF1B5, 0x9A0B, 0xF1B0, 0x9A0D, 0xF1B2, 0x9A0E, 0xC34D, + 0x9A0F, 0xF1AF, 0x9A11, 0xF1B4, 0x9A14, 0xF3C0, 0x9A15, 0xF3B5, 0x9A16, 0xC445, 0x9A19, 0xC446, 0x9A1A, 0xF3B4, 0x9A1B, 0xF3B9, + 0x9A1C, 0xF3BF, 0x9A1D, 0xF3B7, 0x9A1E, 0xF3BE, 0x9A20, 0xF3BB, 0x9A22, 0xF3BA, 0x9A23, 0xF3BD, 0x9A24, 0xF3B8, 0x9A25, 0xF3B6, + 0x9A27, 0xF3BC, 0x9A29, 0xF560, 0x9A2A, 0xF55E, 0x9A2B, 0xC4CA, 0x9A2C, 0xF55D, 0x9A2D, 0xF563, 0x9A2E, 0xF561, 0x9A30, 0xC4CB, + 0x9A31, 0xF55C, 0x9A32, 0xF55A, 0x9A34, 0xF55B, 0x9A35, 0xC4CD, 0x9A36, 0xF55F, 0x9A37, 0xC4CC, 0x9A38, 0xF562, 0x9A39, 0xF678, + 0x9A3A, 0xF67E, 0x9A3D, 0xF679, 0x9A3E, 0xC55B, 0x9A3F, 0xF6A1, 0x9A40, 0xC55A, 0x9A41, 0xF67D, 0x9A42, 0xF67C, 0x9A43, 0xC559, + 0x9A44, 0xF67B, 0x9A45, 0xC558, 0x9A46, 0xF67A, 0x9A48, 0xF77D, 0x9A49, 0xF7A1, 0x9A4A, 0xF77E, 0x9A4C, 0xF77B, 0x9A4D, 0xC5BB, + 0x9A4E, 0xF778, 0x9A4F, 0xF77C, 0x9A50, 0xF7A3, 0x9A52, 0xF7A2, 0x9A53, 0xF779, 0x9A54, 0xF77A, 0x9A55, 0xC5BA, 0x9A56, 0xF852, + 0x9A57, 0xC5E7, 0x9A59, 0xF853, 0x9A5A, 0xC5E5, 0x9A5B, 0xC5E6, 0x9A5E, 0xF8D3, 0x9A5F, 0xC64A, 0x9A60, 0xF976, 0x9A62, 0xC66A, + 0x9A64, 0xF9B3, 0x9A65, 0xC66B, 0x9A66, 0xF9B4, 0x9A67, 0xF9B5, 0x9A68, 0xF9C3, 0x9A69, 0xF9C2, 0x9A6A, 0xC67A, 0x9A6B, 0xF9CD, + 0x9AA8, 0xB0A9, 0x9AAB, 0xE0E9, 0x9AAD, 0xE0E8, 0x9AAF, 0xBBEA, 0x9AB0, 0xBBEB, 0x9AB1, 0xE4DA, 0x9AB3, 0xE8D2, 0x9AB4, 0xEC6C, + 0x9AB7, 0xBE75, 0x9AB8, 0xC065, 0x9AB9, 0xEC6A, 0x9ABB, 0xEC6D, 0x9ABC, 0xC066, 0x9ABE, 0xEF64, 0x9ABF, 0xEC6B, 0x9AC0, 0xF1B9, + 0x9AC1, 0xC34E, 0x9AC2, 0xF3C1, 0x9AC6, 0xF566, 0x9AC7, 0xF564, 0x9ACA, 0xF565, 0x9ACD, 0xF6A2, 0x9ACF, 0xC55C, 0x9AD0, 0xF7A4, + 0x9AD1, 0xC5EA, 0x9AD2, 0xC5BC, 0x9AD3, 0xC5E8, 0x9AD4, 0xC5E9, 0x9AD5, 0xF8D4, 0x9AD6, 0xC662, 0x9AD8, 0xB0AA, 0x9ADC, 0xF1BA, + 0x9ADF, 0xD449, 0x9AE1, 0xB9A6, 0x9AE3, 0xE4DB, 0x9AE6, 0xBBEC, 0x9AE7, 0xE4DC, 0x9AEB, 0xE8D4, 0x9AEC, 0xE8D3, 0x9AED, 0xC068, + 0x9AEE, 0xBE76, 0x9AEF, 0xBE77, 0x9AF1, 0xE8D7, 0x9AF2, 0xE8D6, 0x9AF3, 0xE8D5, 0x9AF6, 0xEC6E, 0x9AF7, 0xEC71, 0x9AF9, 0xEC70, + 0x9AFA, 0xEC6F, 0x9AFB, 0xC067, 0x9AFC, 0xEF68, 0x9AFD, 0xEF66, 0x9AFE, 0xEF65, 0x9B01, 0xEF67, 0x9B03, 0xC34F, 0x9B04, 0xF1BC, + 0x9B05, 0xF1BD, 0x9B06, 0xC350, 0x9B08, 0xF1BB, 0x9B0A, 0xF3C3, 0x9B0B, 0xF3C2, 0x9B0C, 0xF3C5, 0x9B0D, 0xC447, 0x9B0E, 0xF3C4, + 0x9B10, 0xF567, 0x9B11, 0xF569, 0x9B12, 0xF568, 0x9B15, 0xF6A3, 0x9B16, 0xF6A6, 0x9B17, 0xF6A4, 0x9B18, 0xF6A5, 0x9B19, 0xF7A5, + 0x9B1A, 0xC5BD, 0x9B1E, 0xF854, 0x9B1F, 0xF855, 0x9B20, 0xF856, 0x9B22, 0xC64B, 0x9B23, 0xC663, 0x9B24, 0xF9B6, 0x9B25, 0xB0AB, + 0x9B27, 0xBE78, 0x9B28, 0xC069, 0x9B29, 0xF1BE, 0x9B2B, 0xF7A6, 0x9B2E, 0xF9C4, 0x9B2F, 0xD44A, 0x9B31, 0xC67B, 0x9B32, 0xB0AC, + 0x9B33, 0xEC72, 0x9B35, 0xF1BF, 0x9B37, 0xF3C6, 0x9B3A, 0xF6A7, 0x9B3B, 0xF7A7, 0x9B3C, 0xB0AD, 0x9B3E, 0xE4DD, 0x9B3F, 0xE4DE, + 0x9B41, 0xBBED, 0x9B42, 0xBBEE, 0x9B43, 0xE8D9, 0x9B44, 0xBE7A, 0x9B45, 0xBE79, 0x9B46, 0xE8D8, 0x9B48, 0xEF69, 0x9B4A, 0xF1C0, + 0x9B4B, 0xF1C2, 0x9B4C, 0xF1C1, 0x9B4D, 0xC353, 0x9B4E, 0xC352, 0x9B4F, 0xC351, 0x9B51, 0xC55E, 0x9B52, 0xF6A8, 0x9B54, 0xC55D, + 0x9B55, 0xF7A9, 0x9B56, 0xF7A8, 0x9B58, 0xC64C, 0x9B59, 0xF8D5, 0x9B5A, 0xB3BD, 0x9B5B, 0xE0EA, 0x9B5F, 0xE4E1, 0x9B60, 0xE4DF, + 0x9B61, 0xE4E0, 0x9B64, 0xE8E2, 0x9B66, 0xE8DD, 0x9B67, 0xE8DA, 0x9B68, 0xE8E1, 0x9B6C, 0xE8E3, 0x9B6F, 0xBE7C, 0x9B70, 0xE8E0, + 0x9B71, 0xE8DC, 0x9B74, 0xE8DB, 0x9B75, 0xE8DF, 0x9B76, 0xE8DE, 0x9B77, 0xBE7B, 0x9B7A, 0xEC7D, 0x9B7B, 0xEC78, 0x9B7C, 0xEC76, + 0x9B7D, 0xECA1, 0x9B7E, 0xEC77, 0x9B80, 0xEC73, 0x9B82, 0xEC79, 0x9B85, 0xEC74, 0x9B86, 0xEF72, 0x9B87, 0xEC75, 0x9B88, 0xECA2, + 0x9B90, 0xEC7C, 0x9B91, 0xC06A, 0x9B92, 0xEC7B, 0x9B93, 0xEC7A, 0x9B95, 0xEC7E, 0x9B9A, 0xEF6A, 0x9B9B, 0xEF6D, 0x9B9E, 0xEF6C, + 0x9BA0, 0xEF74, 0x9BA1, 0xEF6F, 0x9BA2, 0xEF73, 0x9BA4, 0xEF71, 0x9BA5, 0xEF70, 0x9BA6, 0xEF6E, 0x9BA8, 0xEF6B, 0x9BAA, 0xC243, + 0x9BAB, 0xC242, 0x9BAD, 0xC244, 0x9BAE, 0xC241, 0x9BAF, 0xEF75, 0x9BB5, 0xF1C8, 0x9BB6, 0xF1CB, 0x9BB8, 0xF1C9, 0x9BB9, 0xF1CD, + 0x9BBD, 0xF1CE, 0x9BBF, 0xF1C6, 0x9BC0, 0xC358, 0x9BC1, 0xF1C7, 0x9BC3, 0xF1C5, 0x9BC4, 0xF1CC, 0x9BC6, 0xF1C4, 0x9BC7, 0xF1C3, + 0x9BC8, 0xC357, 0x9BC9, 0xC355, 0x9BCA, 0xC354, 0x9BD3, 0xF1CA, 0x9BD4, 0xF3CF, 0x9BD5, 0xF3D5, 0x9BD6, 0xC44A, 0x9BD7, 0xF3D0, + 0x9BD9, 0xF3D3, 0x9BDA, 0xF3D7, 0x9BDB, 0xC44B, 0x9BDC, 0xF3D2, 0x9BDE, 0xF3CA, 0x9BE0, 0xF3C9, 0x9BE1, 0xF3D6, 0x9BE2, 0xF3CD, + 0x9BE4, 0xF3CB, 0x9BE5, 0xF3D4, 0x9BE6, 0xF3CC, 0x9BE7, 0xC449, 0x9BE8, 0xC448, 0x9BEA, 0xF3C7, 0x9BEB, 0xF3C8, 0x9BEC, 0xF3D1, + 0x9BF0, 0xF3CE, 0x9BF7, 0xF56C, 0x9BF8, 0xF56F, 0x9BFD, 0xC356, 0x9C05, 0xF56D, 0x9C06, 0xF573, 0x9C07, 0xF571, 0x9C08, 0xF56B, + 0x9C09, 0xF576, 0x9C0B, 0xF56A, 0x9C0D, 0xC4CF, 0x9C0E, 0xF572, 0x9C12, 0xF56E, 0x9C13, 0xC4CE, 0x9C14, 0xF575, 0x9C17, 0xF574, + 0x9C1C, 0xF6AB, 0x9C1D, 0xF6AA, 0x9C21, 0xF6B1, 0x9C23, 0xF6AD, 0x9C24, 0xF6B0, 0x9C25, 0xC560, 0x9C28, 0xF6AE, 0x9C29, 0xF6AF, + 0x9C2B, 0xF6A9, 0x9C2C, 0xF6AC, 0x9C2D, 0xC55F, 0x9C31, 0xC5BF, 0x9C32, 0xF7B4, 0x9C33, 0xF7AF, 0x9C34, 0xF7B3, 0x9C36, 0xF7B6, + 0x9C37, 0xF7B2, 0x9C39, 0xF7AE, 0x9C3B, 0xC5C1, 0x9C3C, 0xF7B1, 0x9C3D, 0xF7B5, 0x9C3E, 0xC5C0, 0x9C3F, 0xF7AC, 0x9C40, 0xF570, + 0x9C41, 0xF7B0, 0x9C44, 0xF7AD, 0x9C46, 0xF7AA, 0x9C48, 0xF7AB, 0x9C49, 0xC5BE, 0x9C4A, 0xF85A, 0x9C4B, 0xF85C, 0x9C4C, 0xF85F, + 0x9C4D, 0xF85B, 0x9C4E, 0xF860, 0x9C50, 0xF859, 0x9C52, 0xF857, 0x9C54, 0xC5EB, 0x9C55, 0xF85D, 0x9C56, 0xC5ED, 0x9C57, 0xC5EC, + 0x9C58, 0xF858, 0x9C59, 0xF85E, 0x9C5E, 0xF8DA, 0x9C5F, 0xC64D, 0x9C60, 0xF8DB, 0x9C62, 0xF8D9, 0x9C63, 0xF8D6, 0x9C66, 0xF8D8, + 0x9C67, 0xF8D7, 0x9C68, 0xF95A, 0x9C6D, 0xF95C, 0x9C6E, 0xF95B, 0x9C71, 0xF979, 0x9C73, 0xF978, 0x9C74, 0xF977, 0x9C75, 0xF97A, + 0x9C77, 0xC673, 0x9C78, 0xC674, 0x9C79, 0xF9CA, 0x9C7A, 0xF9CE, 0x9CE5, 0xB3BE, 0x9CE6, 0xDCAF, 0x9CE7, 0xE0ED, 0x9CE9, 0xB9A7, + 0x9CEA, 0xE0EB, 0x9CED, 0xE0EC, 0x9CF1, 0xE4E2, 0x9CF2, 0xE4E3, 0x9CF3, 0xBBF1, 0x9CF4, 0xBBEF, 0x9CF5, 0xE4E4, 0x9CF6, 0xBBF0, + 0x9CF7, 0xE8E8, 0x9CF9, 0xE8EB, 0x9CFA, 0xE8E5, 0x9CFB, 0xE8EC, 0x9CFC, 0xE8E4, 0x9CFD, 0xE8E6, 0x9CFF, 0xE8E7, 0x9D00, 0xE8EA, + 0x9D03, 0xBEA1, 0x9D04, 0xE8EF, 0x9D05, 0xE8EE, 0x9D06, 0xBE7D, 0x9D07, 0xE8E9, 0x9D08, 0xE8ED, 0x9D09, 0xBE7E, 0x9D10, 0xECAC, + 0x9D12, 0xC06F, 0x9D14, 0xECA7, 0x9D15, 0xC06B, 0x9D17, 0xECA4, 0x9D18, 0xECAA, 0x9D19, 0xECAD, 0x9D1B, 0xC070, 0x9D1D, 0xECA9, + 0x9D1E, 0xECA6, 0x9D1F, 0xECAE, 0x9D20, 0xECA5, 0x9D22, 0xECAB, 0x9D23, 0xC06C, 0x9D25, 0xECA3, 0x9D26, 0xC06D, 0x9D28, 0xC06E, + 0x9D29, 0xECA8, 0x9D2D, 0xEFA9, 0x9D2E, 0xEF7A, 0x9D2F, 0xEF7B, 0x9D30, 0xEF7E, 0x9D31, 0xEF7C, 0x9D33, 0xEF76, 0x9D36, 0xEF79, + 0x9D37, 0xEFA5, 0x9D38, 0xEF7D, 0x9D3B, 0xC245, 0x9D3D, 0xEFA7, 0x9D3E, 0xEFA4, 0x9D3F, 0xC246, 0x9D40, 0xEFA6, 0x9D41, 0xEF77, + 0x9D42, 0xEFA2, 0x9D43, 0xEFA3, 0x9D45, 0xEFA1, 0x9D4A, 0xF1D2, 0x9D4B, 0xF1D4, 0x9D4C, 0xF1D7, 0x9D4F, 0xF1D1, 0x9D51, 0xC359, + 0x9D52, 0xF1D9, 0x9D53, 0xF1D0, 0x9D54, 0xF1DA, 0x9D56, 0xF1D6, 0x9D57, 0xF1D8, 0x9D58, 0xF1DC, 0x9D59, 0xF1D5, 0x9D5A, 0xF1DD, + 0x9D5B, 0xF1D3, 0x9D5C, 0xF1CF, 0x9D5D, 0xC35A, 0x9D5F, 0xF1DB, 0x9D60, 0xC35B, 0x9D61, 0xC44D, 0x9D67, 0xEF78, 0x9D68, 0xF3F1, + 0x9D69, 0xF3E8, 0x9D6A, 0xC44F, 0x9D6B, 0xF3E4, 0x9D6C, 0xC450, 0x9D6F, 0xF3ED, 0x9D70, 0xF3E7, 0x9D71, 0xF3DD, 0x9D72, 0xC44E, + 0x9D73, 0xF3EA, 0x9D74, 0xF3E5, 0x9D75, 0xF3E6, 0x9D77, 0xF3D8, 0x9D78, 0xF3DF, 0x9D79, 0xF3EE, 0x9D7B, 0xF3EB, 0x9D7D, 0xF3E3, + 0x9D7F, 0xF3EF, 0x9D80, 0xF3DE, 0x9D81, 0xF3D9, 0x9D82, 0xF3EC, 0x9D84, 0xF3DB, 0x9D85, 0xF3E9, 0x9D86, 0xF3E0, 0x9D87, 0xF3F0, + 0x9D88, 0xF3DC, 0x9D89, 0xC44C, 0x9D8A, 0xF3DA, 0x9D8B, 0xF3E1, 0x9D8C, 0xF3E2, 0x9D90, 0xF57D, 0x9D92, 0xF57B, 0x9D94, 0xF5A2, + 0x9D96, 0xF5AE, 0x9D97, 0xF5A5, 0x9D98, 0xF57C, 0x9D99, 0xF578, 0x9D9A, 0xF5A7, 0x9D9B, 0xF57E, 0x9D9C, 0xF5A3, 0x9D9D, 0xF57A, + 0x9D9E, 0xF5AA, 0x9D9F, 0xF577, 0x9DA0, 0xF5A1, 0x9DA1, 0xF5A6, 0x9DA2, 0xF5A8, 0x9DA3, 0xF5AB, 0x9DA4, 0xF579, 0x9DA6, 0xF5AF, + 0x9DA7, 0xF5B0, 0x9DA8, 0xF5A9, 0x9DA9, 0xF5AD, 0x9DAA, 0xF5A4, 0x9DAC, 0xF6C1, 0x9DAD, 0xF6C4, 0x9DAF, 0xC561, 0x9DB1, 0xF6C3, + 0x9DB2, 0xF6C8, 0x9DB3, 0xF6C6, 0x9DB4, 0xC562, 0x9DB5, 0xF6BD, 0x9DB6, 0xF6B3, 0x9DB7, 0xF6B2, 0x9DB8, 0xC564, 0x9DB9, 0xF6BF, + 0x9DBA, 0xF6C0, 0x9DBB, 0xF6BC, 0x9DBC, 0xF6B4, 0x9DBE, 0xF6B9, 0x9DBF, 0xF5AC, 0x9DC1, 0xF6B5, 0x9DC2, 0xC563, 0x9DC3, 0xF6BB, + 0x9DC5, 0xF6BA, 0x9DC7, 0xF6B6, 0x9DC8, 0xF6C2, 0x9DCA, 0xF6B7, 0x9DCB, 0xF7BB, 0x9DCC, 0xF6C5, 0x9DCD, 0xF6C7, 0x9DCE, 0xF6BE, + 0x9DCF, 0xF6B8, 0x9DD0, 0xF7BC, 0x9DD1, 0xF7BE, 0x9DD2, 0xF7B8, 0x9DD3, 0xC5C2, 0x9DD5, 0xF7C5, 0x9DD6, 0xF7C3, 0x9DD7, 0xC5C3, + 0x9DD8, 0xF7C2, 0x9DD9, 0xF7C1, 0x9DDA, 0xF7BA, 0x9DDB, 0xF7B7, 0x9DDC, 0xF7BD, 0x9DDD, 0xF7C6, 0x9DDE, 0xF7B9, 0x9DDF, 0xF7BF, + 0x9DE1, 0xF869, 0x9DE2, 0xF86E, 0x9DE3, 0xF864, 0x9DE4, 0xF867, 0x9DE5, 0xC5EE, 0x9DE6, 0xF86B, 0x9DE8, 0xF872, 0x9DE9, 0xF7C0, + 0x9DEB, 0xF865, 0x9DEC, 0xF86F, 0x9DED, 0xF873, 0x9DEE, 0xF86A, 0x9DEF, 0xF863, 0x9DF0, 0xF86D, 0x9DF2, 0xF86C, 0x9DF3, 0xF871, + 0x9DF4, 0xF870, 0x9DF5, 0xF7C4, 0x9DF6, 0xF868, 0x9DF7, 0xF862, 0x9DF8, 0xF866, 0x9DF9, 0xC64E, 0x9DFA, 0xC64F, 0x9DFB, 0xF861, + 0x9DFD, 0xF8E6, 0x9DFE, 0xF8DD, 0x9DFF, 0xF8E5, 0x9E00, 0xF8E2, 0x9E01, 0xF8E3, 0x9E02, 0xF8DC, 0x9E03, 0xF8DF, 0x9E04, 0xF8E7, + 0x9E05, 0xF8E1, 0x9E06, 0xF8E0, 0x9E07, 0xF8DE, 0x9E09, 0xF8E4, 0x9E0B, 0xF95D, 0x9E0D, 0xF95E, 0x9E0F, 0xF960, 0x9E10, 0xF95F, + 0x9E11, 0xF962, 0x9E12, 0xF961, 0x9E13, 0xF97C, 0x9E14, 0xF97B, 0x9E15, 0xF9B7, 0x9E17, 0xF9B8, 0x9E19, 0xF9C5, 0x9E1A, 0xC678, + 0x9E1B, 0xC67C, 0x9E1D, 0xF9CF, 0x9E1E, 0xC67D, 0x9E75, 0xB3BF, 0x9E79, 0xC4D0, 0x9E7A, 0xF6C9, 0x9E7C, 0xC650, 0x9E7D, 0xC651, + 0x9E7F, 0xB3C0, 0x9E80, 0xE0EE, 0x9E82, 0xB9A8, 0x9E83, 0xE8F0, 0x9E86, 0xECB0, 0x9E87, 0xECB1, 0x9E88, 0xECAF, 0x9E89, 0xEFAB, + 0x9E8A, 0xEFAA, 0x9E8B, 0xC247, 0x9E8C, 0xF1DF, 0x9E8D, 0xEFAC, 0x9E8E, 0xF1DE, 0x9E91, 0xF3F3, 0x9E92, 0xC451, 0x9E93, 0xC453, + 0x9E94, 0xF3F2, 0x9E97, 0xC452, 0x9E99, 0xF5B1, 0x9E9A, 0xF5B3, 0x9E9B, 0xF5B2, 0x9E9C, 0xF6CA, 0x9E9D, 0xC565, 0x9E9F, 0xC5EF, + 0x9EA0, 0xF8E8, 0x9EA1, 0xF963, 0x9EA4, 0xF9D2, 0x9EA5, 0xB3C1, 0x9EA7, 0xE4E5, 0x9EA9, 0xBEA2, 0x9EAD, 0xECB3, 0x9EAE, 0xECB2, + 0x9EB0, 0xEFAD, 0x9EB4, 0xC454, 0x9EB5, 0xC4D1, 0x9EB6, 0xF7C7, 0x9EB7, 0xF9CB, 0x9EBB, 0xB3C2, 0x9EBC, 0xBBF2, 0x9EBE, 0xBEA3, + 0x9EC0, 0xF3F4, 0x9EC2, 0xF874, 0x9EC3, 0xB6C0, 0x9EC8, 0xEFAE, 0x9ECC, 0xC664, 0x9ECD, 0xB6C1, 0x9ECE, 0xBEA4, 0x9ECF, 0xC248, + 0x9ED0, 0xF875, 0x9ED1, 0xB6C2, 0x9ED3, 0xE8F1, 0x9ED4, 0xC072, 0x9ED5, 0xECB4, 0x9ED6, 0xECB5, 0x9ED8, 0xC071, 0x9EDA, 0xEFAF, + 0x9EDB, 0xC24C, 0x9EDC, 0xC24A, 0x9EDD, 0xC24B, 0x9EDE, 0xC249, 0x9EDF, 0xF1E0, 0x9EE0, 0xC35C, 0x9EE4, 0xF5B5, 0x9EE5, 0xF5B4, + 0x9EE6, 0xF5B7, 0x9EE7, 0xF5B6, 0x9EE8, 0xC4D2, 0x9EEB, 0xF6CB, 0x9EED, 0xF6CD, 0x9EEE, 0xF6CC, 0x9EEF, 0xC566, 0x9EF0, 0xF7C8, + 0x9EF2, 0xF876, 0x9EF3, 0xF877, 0x9EF4, 0xC5F0, 0x9EF5, 0xF964, 0x9EF6, 0xF97D, 0x9EF7, 0xC675, 0x9EF9, 0xDCB0, 0x9EFA, 0xECB6, + 0x9EFB, 0xEFB0, 0x9EFC, 0xF3F5, 0x9EFD, 0xE0EF, 0x9EFF, 0xEFB1, 0x9F00, 0xF1E2, 0x9F01, 0xF1E1, 0x9F06, 0xF878, 0x9F07, 0xC652, + 0x9F09, 0xF965, 0x9F0A, 0xF97E, 0x9F0E, 0xB9A9, 0x9F0F, 0xE8F2, 0x9F10, 0xE8F3, 0x9F12, 0xECB7, 0x9F13, 0xB9AA, 0x9F15, 0xC35D, + 0x9F16, 0xF1E3, 0x9F18, 0xF6CF, 0x9F19, 0xC567, 0x9F1A, 0xF6D0, 0x9F1B, 0xF6CE, 0x9F1C, 0xF879, 0x9F1E, 0xF8E9, 0x9F20, 0xB9AB, + 0x9F22, 0xEFB4, 0x9F23, 0xEFB3, 0x9F24, 0xEFB2, 0x9F25, 0xF1E4, 0x9F28, 0xF1E8, 0x9F29, 0xF1E7, 0x9F2A, 0xF1E6, 0x9F2B, 0xF1E5, + 0x9F2C, 0xC35E, 0x9F2D, 0xF3F6, 0x9F2E, 0xF5B9, 0x9F2F, 0xC4D3, 0x9F30, 0xF5B8, 0x9F31, 0xF6D1, 0x9F32, 0xF7CB, 0x9F33, 0xF7CA, + 0x9F34, 0xC5C4, 0x9F35, 0xF7C9, 0x9F36, 0xF87C, 0x9F37, 0xF87B, 0x9F38, 0xF87A, 0x9F3B, 0xBBF3, 0x9F3D, 0xECB8, 0x9F3E, 0xC24D, + 0x9F40, 0xF3F7, 0x9F41, 0xF3F8, 0x9F42, 0xF7CC, 0x9F43, 0xF87D, 0x9F46, 0xF8EA, 0x9F47, 0xF966, 0x9F48, 0xF9B9, 0x9F49, 0xF9D4, + 0x9F4A, 0xBBF4, 0x9F4B, 0xC24E, 0x9F4C, 0xF1E9, 0x9F4D, 0xF3F9, 0x9F4E, 0xF6D2, 0x9F4F, 0xF87E, 0x9F52, 0xBEA6, 0x9F54, 0xEFB5, + 0x9F55, 0xF1EA, 0x9F56, 0xF3FA, 0x9F57, 0xF3FB, 0x9F58, 0xF3FC, 0x9F59, 0xF5BE, 0x9F5B, 0xF5BA, 0x9F5C, 0xC568, 0x9F5D, 0xF5BD, + 0x9F5E, 0xF5BC, 0x9F5F, 0xC4D4, 0x9F60, 0xF5BB, 0x9F61, 0xC4D6, 0x9F63, 0xC4D5, 0x9F64, 0xF6D4, 0x9F65, 0xF6D3, 0x9F66, 0xC569, + 0x9F67, 0xC56A, 0x9F6A, 0xC5C6, 0x9F6B, 0xF7CD, 0x9F6C, 0xC5C5, 0x9F6E, 0xF8A3, 0x9F6F, 0xF8A4, 0x9F70, 0xF8A2, 0x9F71, 0xF8A1, + 0x9F72, 0xC654, 0x9F74, 0xF8EB, 0x9F75, 0xF8EC, 0x9F76, 0xF8ED, 0x9F77, 0xC653, 0x9F78, 0xF967, 0x9F79, 0xF96A, 0x9F7A, 0xF969, + 0x9F7B, 0xF968, 0x9F7E, 0xF9D3, 0x9F8D, 0xC073, 0x9F90, 0xC365, 0x9F91, 0xF5BF, 0x9F92, 0xF6D5, 0x9F94, 0xC5C7, 0x9F95, 0xF7CE, + 0x9F98, 0xF9D5, 0x9F9C, 0xC074, 0x9FA0, 0xEFB6, 0x9FA2, 0xF7CF, 0x9FA4, 0xF9A1, 0xFA0C, 0xC94A, 0xFA0D, 0xDDFC, 0xFE30, 0xA14A, + 0xFE31, 0xA157, 0xFE33, 0xA159, 0xFE34, 0xA15B, 0xFE35, 0xA15F, 0xFE36, 0xA160, 0xFE37, 0xA163, 0xFE38, 0xA164, 0xFE39, 0xA167, + 0xFE3A, 0xA168, 0xFE3B, 0xA16B, 0xFE3C, 0xA16C, 0xFE3D, 0xA16F, 0xFE3E, 0xA170, 0xFE3F, 0xA173, 0xFE40, 0xA174, 0xFE41, 0xA177, + 0xFE42, 0xA178, 0xFE43, 0xA17B, 0xFE44, 0xA17C, 0xFE49, 0xA1C6, 0xFE4A, 0xA1C7, 0xFE4B, 0xA1CA, 0xFE4C, 0xA1CB, 0xFE4D, 0xA1C8, + 0xFE4E, 0xA1C9, 0xFE4F, 0xA15C, 0xFE50, 0xA14D, 0xFE51, 0xA14E, 0xFE52, 0xA14F, 0xFE54, 0xA151, 0xFE55, 0xA152, 0xFE56, 0xA153, + 0xFE57, 0xA154, 0xFE59, 0xA17D, 0xFE5A, 0xA17E, 0xFE5B, 0xA1A1, 0xFE5C, 0xA1A2, 0xFE5D, 0xA1A3, 0xFE5E, 0xA1A4, 0xFE5F, 0xA1CC, + 0xFE60, 0xA1CD, 0xFE61, 0xA1CE, 0xFE62, 0xA1DE, 0xFE63, 0xA1DF, 0xFE64, 0xA1E0, 0xFE65, 0xA1E1, 0xFE66, 0xA1E2, 0xFE68, 0xA242, + 0xFE69, 0xA24C, 0xFE6A, 0xA24D, 0xFE6B, 0xA24E, 0xFF01, 0xA149, 0xFF03, 0xA1AD, 0xFF04, 0xA243, 0xFF05, 0xA248, 0xFF06, 0xA1AE, + 0xFF08, 0xA15D, 0xFF09, 0xA15E, 0xFF0A, 0xA1AF, 0xFF0B, 0xA1CF, 0xFF0C, 0xA141, 0xFF0D, 0xA1D0, 0xFF0E, 0xA144, 0xFF0F, 0xA1FE, + 0xFF10, 0xA2AF, 0xFF11, 0xA2B0, 0xFF12, 0xA2B1, 0xFF13, 0xA2B2, 0xFF14, 0xA2B3, 0xFF15, 0xA2B4, 0xFF16, 0xA2B5, 0xFF17, 0xA2B6, + 0xFF18, 0xA2B7, 0xFF19, 0xA2B8, 0xFF1A, 0xA147, 0xFF1B, 0xA146, 0xFF1C, 0xA1D5, 0xFF1D, 0xA1D7, 0xFF1E, 0xA1D6, 0xFF1F, 0xA148, + 0xFF20, 0xA249, 0xFF21, 0xA2CF, 0xFF22, 0xA2D0, 0xFF23, 0xA2D1, 0xFF24, 0xA2D2, 0xFF25, 0xA2D3, 0xFF26, 0xA2D4, 0xFF27, 0xA2D5, + 0xFF28, 0xA2D6, 0xFF29, 0xA2D7, 0xFF2A, 0xA2D8, 0xFF2B, 0xA2D9, 0xFF2C, 0xA2DA, 0xFF2D, 0xA2DB, 0xFF2E, 0xA2DC, 0xFF2F, 0xA2DD, + 0xFF30, 0xA2DE, 0xFF31, 0xA2DF, 0xFF32, 0xA2E0, 0xFF33, 0xA2E1, 0xFF34, 0xA2E2, 0xFF35, 0xA2E3, 0xFF36, 0xA2E4, 0xFF37, 0xA2E5, + 0xFF38, 0xA2E6, 0xFF39, 0xA2E7, 0xFF3A, 0xA2E8, 0xFF3C, 0xA240, 0xFF3F, 0xA1C4, 0xFF41, 0xA2E9, 0xFF42, 0xA2EA, 0xFF43, 0xA2EB, + 0xFF44, 0xA2EC, 0xFF45, 0xA2ED, 0xFF46, 0xA2EE, 0xFF47, 0xA2EF, 0xFF48, 0xA2F0, 0xFF49, 0xA2F1, 0xFF4A, 0xA2F2, 0xFF4B, 0xA2F3, + 0xFF4C, 0xA2F4, 0xFF4D, 0xA2F5, 0xFF4E, 0xA2F6, 0xFF4F, 0xA2F7, 0xFF50, 0xA2F8, 0xFF51, 0xA2F9, 0xFF52, 0xA2FA, 0xFF53, 0xA2FB, + 0xFF54, 0xA2FC, 0xFF55, 0xA2FD, 0xFF56, 0xA2FE, 0xFF57, 0xA340, 0xFF58, 0xA341, 0xFF59, 0xA342, 0xFF5A, 0xA343, 0xFF5B, 0xA161, + 0xFF5C, 0xA155, 0xFF5D, 0xA162, 0xFF5E, 0xA1E3, 0xFFE0, 0xA246, 0xFFE1, 0xA247, 0xFFE3, 0xA1C3, 0xFFE5, 0xA244, 0, 0 +}; + +static const WCHAR oem2uni950[] = { /* Big5 --> Unicode pairs */ + 0xA140, 0x3000, 0xA141, 0xFF0C, 0xA142, 0x3001, 0xA143, 0x3002, 0xA144, 0xFF0E, 0xA145, 0x2027, 0xA146, 0xFF1B, 0xA147, 0xFF1A, + 0xA148, 0xFF1F, 0xA149, 0xFF01, 0xA14A, 0xFE30, 0xA14B, 0x2026, 0xA14C, 0x2025, 0xA14D, 0xFE50, 0xA14E, 0xFE51, 0xA14F, 0xFE52, + 0xA150, 0x00B7, 0xA151, 0xFE54, 0xA152, 0xFE55, 0xA153, 0xFE56, 0xA154, 0xFE57, 0xA155, 0xFF5C, 0xA156, 0x2013, 0xA157, 0xFE31, + 0xA158, 0x2014, 0xA159, 0xFE33, 0xA15A, 0x2574, 0xA15B, 0xFE34, 0xA15C, 0xFE4F, 0xA15D, 0xFF08, 0xA15E, 0xFF09, 0xA15F, 0xFE35, + 0xA160, 0xFE36, 0xA161, 0xFF5B, 0xA162, 0xFF5D, 0xA163, 0xFE37, 0xA164, 0xFE38, 0xA165, 0x3014, 0xA166, 0x3015, 0xA167, 0xFE39, + 0xA168, 0xFE3A, 0xA169, 0x3010, 0xA16A, 0x3011, 0xA16B, 0xFE3B, 0xA16C, 0xFE3C, 0xA16D, 0x300A, 0xA16E, 0x300B, 0xA16F, 0xFE3D, + 0xA170, 0xFE3E, 0xA171, 0x3008, 0xA172, 0x3009, 0xA173, 0xFE3F, 0xA174, 0xFE40, 0xA175, 0x300C, 0xA176, 0x300D, 0xA177, 0xFE41, + 0xA178, 0xFE42, 0xA179, 0x300E, 0xA17A, 0x300F, 0xA17B, 0xFE43, 0xA17C, 0xFE44, 0xA17D, 0xFE59, 0xA17E, 0xFE5A, 0xA1A1, 0xFE5B, + 0xA1A2, 0xFE5C, 0xA1A3, 0xFE5D, 0xA1A4, 0xFE5E, 0xA1A5, 0x2018, 0xA1A6, 0x2019, 0xA1A7, 0x201C, 0xA1A8, 0x201D, 0xA1A9, 0x301D, + 0xA1AA, 0x301E, 0xA1AB, 0x2035, 0xA1AC, 0x2032, 0xA1AD, 0xFF03, 0xA1AE, 0xFF06, 0xA1AF, 0xFF0A, 0xA1B0, 0x203B, 0xA1B1, 0x00A7, + 0xA1B2, 0x3003, 0xA1B3, 0x25CB, 0xA1B4, 0x25CF, 0xA1B5, 0x25B3, 0xA1B6, 0x25B2, 0xA1B7, 0x25CE, 0xA1B8, 0x2606, 0xA1B9, 0x2605, + 0xA1BA, 0x25C7, 0xA1BB, 0x25C6, 0xA1BC, 0x25A1, 0xA1BD, 0x25A0, 0xA1BE, 0x25BD, 0xA1BF, 0x25BC, 0xA1C0, 0x32A3, 0xA1C1, 0x2105, + 0xA1C2, 0x00AF, 0xA1C3, 0xFFE3, 0xA1C4, 0xFF3F, 0xA1C5, 0x02CD, 0xA1C6, 0xFE49, 0xA1C7, 0xFE4A, 0xA1C8, 0xFE4D, 0xA1C9, 0xFE4E, + 0xA1CA, 0xFE4B, 0xA1CB, 0xFE4C, 0xA1CC, 0xFE5F, 0xA1CD, 0xFE60, 0xA1CE, 0xFE61, 0xA1CF, 0xFF0B, 0xA1D0, 0xFF0D, 0xA1D1, 0x00D7, + 0xA1D2, 0x00F7, 0xA1D3, 0x00B1, 0xA1D4, 0x221A, 0xA1D5, 0xFF1C, 0xA1D6, 0xFF1E, 0xA1D7, 0xFF1D, 0xA1D8, 0x2266, 0xA1D9, 0x2267, + 0xA1DA, 0x2260, 0xA1DB, 0x221E, 0xA1DC, 0x2252, 0xA1DD, 0x2261, 0xA1DE, 0xFE62, 0xA1DF, 0xFE63, 0xA1E0, 0xFE64, 0xA1E1, 0xFE65, + 0xA1E2, 0xFE66, 0xA1E3, 0xFF5E, 0xA1E4, 0x2229, 0xA1E5, 0x222A, 0xA1E6, 0x22A5, 0xA1E7, 0x2220, 0xA1E8, 0x221F, 0xA1E9, 0x22BF, + 0xA1EA, 0x33D2, 0xA1EB, 0x33D1, 0xA1EC, 0x222B, 0xA1ED, 0x222E, 0xA1EE, 0x2235, 0xA1EF, 0x2234, 0xA1F0, 0x2640, 0xA1F1, 0x2642, + 0xA1F2, 0x2295, 0xA1F3, 0x2299, 0xA1F4, 0x2191, 0xA1F5, 0x2193, 0xA1F6, 0x2190, 0xA1F7, 0x2192, 0xA1F8, 0x2196, 0xA1F9, 0x2197, + 0xA1FA, 0x2199, 0xA1FB, 0x2198, 0xA1FC, 0x2225, 0xA1FD, 0x2223, 0xA1FE, 0xFF0F, 0xA240, 0xFF3C, 0xA241, 0x2215, 0xA242, 0xFE68, + 0xA243, 0xFF04, 0xA244, 0xFFE5, 0xA245, 0x3012, 0xA246, 0xFFE0, 0xA247, 0xFFE1, 0xA248, 0xFF05, 0xA249, 0xFF20, 0xA24A, 0x2103, + 0xA24B, 0x2109, 0xA24C, 0xFE69, 0xA24D, 0xFE6A, 0xA24E, 0xFE6B, 0xA24F, 0x33D5, 0xA250, 0x339C, 0xA251, 0x339D, 0xA252, 0x339E, + 0xA253, 0x33CE, 0xA254, 0x33A1, 0xA255, 0x338E, 0xA256, 0x338F, 0xA257, 0x33C4, 0xA258, 0x00B0, 0xA259, 0x5159, 0xA25A, 0x515B, + 0xA25B, 0x515E, 0xA25C, 0x515D, 0xA25D, 0x5161, 0xA25E, 0x5163, 0xA25F, 0x55E7, 0xA260, 0x74E9, 0xA261, 0x7CCE, 0xA262, 0x2581, + 0xA263, 0x2582, 0xA264, 0x2583, 0xA265, 0x2584, 0xA266, 0x2585, 0xA267, 0x2586, 0xA268, 0x2587, 0xA269, 0x2588, 0xA26A, 0x258F, + 0xA26B, 0x258E, 0xA26C, 0x258D, 0xA26D, 0x258C, 0xA26E, 0x258B, 0xA26F, 0x258A, 0xA270, 0x2589, 0xA271, 0x253C, 0xA272, 0x2534, + 0xA273, 0x252C, 0xA274, 0x2524, 0xA275, 0x251C, 0xA276, 0x2594, 0xA277, 0x2500, 0xA278, 0x2502, 0xA279, 0x2595, 0xA27A, 0x250C, + 0xA27B, 0x2510, 0xA27C, 0x2514, 0xA27D, 0x2518, 0xA27E, 0x256D, 0xA2A1, 0x256E, 0xA2A2, 0x2570, 0xA2A3, 0x256F, 0xA2A4, 0x2550, + 0xA2A5, 0x255E, 0xA2A6, 0x256A, 0xA2A7, 0x2561, 0xA2A8, 0x25E2, 0xA2A9, 0x25E3, 0xA2AA, 0x25E5, 0xA2AB, 0x25E4, 0xA2AC, 0x2571, + 0xA2AD, 0x2572, 0xA2AE, 0x2573, 0xA2AF, 0xFF10, 0xA2B0, 0xFF11, 0xA2B1, 0xFF12, 0xA2B2, 0xFF13, 0xA2B3, 0xFF14, 0xA2B4, 0xFF15, + 0xA2B5, 0xFF16, 0xA2B6, 0xFF17, 0xA2B7, 0xFF18, 0xA2B8, 0xFF19, 0xA2B9, 0x2160, 0xA2BA, 0x2161, 0xA2BB, 0x2162, 0xA2BC, 0x2163, + 0xA2BD, 0x2164, 0xA2BE, 0x2165, 0xA2BF, 0x2166, 0xA2C0, 0x2167, 0xA2C1, 0x2168, 0xA2C2, 0x2169, 0xA2C3, 0x3021, 0xA2C4, 0x3022, + 0xA2C5, 0x3023, 0xA2C6, 0x3024, 0xA2C7, 0x3025, 0xA2C8, 0x3026, 0xA2C9, 0x3027, 0xA2CA, 0x3028, 0xA2CB, 0x3029, 0xA2CC, 0x5341, + 0xA2CD, 0x5344, 0xA2CE, 0x5345, 0xA2CF, 0xFF21, 0xA2D0, 0xFF22, 0xA2D1, 0xFF23, 0xA2D2, 0xFF24, 0xA2D3, 0xFF25, 0xA2D4, 0xFF26, + 0xA2D5, 0xFF27, 0xA2D6, 0xFF28, 0xA2D7, 0xFF29, 0xA2D8, 0xFF2A, 0xA2D9, 0xFF2B, 0xA2DA, 0xFF2C, 0xA2DB, 0xFF2D, 0xA2DC, 0xFF2E, + 0xA2DD, 0xFF2F, 0xA2DE, 0xFF30, 0xA2DF, 0xFF31, 0xA2E0, 0xFF32, 0xA2E1, 0xFF33, 0xA2E2, 0xFF34, 0xA2E3, 0xFF35, 0xA2E4, 0xFF36, + 0xA2E5, 0xFF37, 0xA2E6, 0xFF38, 0xA2E7, 0xFF39, 0xA2E8, 0xFF3A, 0xA2E9, 0xFF41, 0xA2EA, 0xFF42, 0xA2EB, 0xFF43, 0xA2EC, 0xFF44, + 0xA2ED, 0xFF45, 0xA2EE, 0xFF46, 0xA2EF, 0xFF47, 0xA2F0, 0xFF48, 0xA2F1, 0xFF49, 0xA2F2, 0xFF4A, 0xA2F3, 0xFF4B, 0xA2F4, 0xFF4C, + 0xA2F5, 0xFF4D, 0xA2F6, 0xFF4E, 0xA2F7, 0xFF4F, 0xA2F8, 0xFF50, 0xA2F9, 0xFF51, 0xA2FA, 0xFF52, 0xA2FB, 0xFF53, 0xA2FC, 0xFF54, + 0xA2FD, 0xFF55, 0xA2FE, 0xFF56, 0xA340, 0xFF57, 0xA341, 0xFF58, 0xA342, 0xFF59, 0xA343, 0xFF5A, 0xA344, 0x0391, 0xA345, 0x0392, + 0xA346, 0x0393, 0xA347, 0x0394, 0xA348, 0x0395, 0xA349, 0x0396, 0xA34A, 0x0397, 0xA34B, 0x0398, 0xA34C, 0x0399, 0xA34D, 0x039A, + 0xA34E, 0x039B, 0xA34F, 0x039C, 0xA350, 0x039D, 0xA351, 0x039E, 0xA352, 0x039F, 0xA353, 0x03A0, 0xA354, 0x03A1, 0xA355, 0x03A3, + 0xA356, 0x03A4, 0xA357, 0x03A5, 0xA358, 0x03A6, 0xA359, 0x03A7, 0xA35A, 0x03A8, 0xA35B, 0x03A9, 0xA35C, 0x03B1, 0xA35D, 0x03B2, + 0xA35E, 0x03B3, 0xA35F, 0x03B4, 0xA360, 0x03B5, 0xA361, 0x03B6, 0xA362, 0x03B7, 0xA363, 0x03B8, 0xA364, 0x03B9, 0xA365, 0x03BA, + 0xA366, 0x03BB, 0xA367, 0x03BC, 0xA368, 0x03BD, 0xA369, 0x03BE, 0xA36A, 0x03BF, 0xA36B, 0x03C0, 0xA36C, 0x03C1, 0xA36D, 0x03C3, + 0xA36E, 0x03C4, 0xA36F, 0x03C5, 0xA370, 0x03C6, 0xA371, 0x03C7, 0xA372, 0x03C8, 0xA373, 0x03C9, 0xA374, 0x3105, 0xA375, 0x3106, + 0xA376, 0x3107, 0xA377, 0x3108, 0xA378, 0x3109, 0xA379, 0x310A, 0xA37A, 0x310B, 0xA37B, 0x310C, 0xA37C, 0x310D, 0xA37D, 0x310E, + 0xA37E, 0x310F, 0xA3A1, 0x3110, 0xA3A2, 0x3111, 0xA3A3, 0x3112, 0xA3A4, 0x3113, 0xA3A5, 0x3114, 0xA3A6, 0x3115, 0xA3A7, 0x3116, + 0xA3A8, 0x3117, 0xA3A9, 0x3118, 0xA3AA, 0x3119, 0xA3AB, 0x311A, 0xA3AC, 0x311B, 0xA3AD, 0x311C, 0xA3AE, 0x311D, 0xA3AF, 0x311E, + 0xA3B0, 0x311F, 0xA3B1, 0x3120, 0xA3B2, 0x3121, 0xA3B3, 0x3122, 0xA3B4, 0x3123, 0xA3B5, 0x3124, 0xA3B6, 0x3125, 0xA3B7, 0x3126, + 0xA3B8, 0x3127, 0xA3B9, 0x3128, 0xA3BA, 0x3129, 0xA3BB, 0x02D9, 0xA3BC, 0x02C9, 0xA3BD, 0x02CA, 0xA3BE, 0x02C7, 0xA3BF, 0x02CB, + 0xA3E1, 0x20AC, 0xA440, 0x4E00, 0xA441, 0x4E59, 0xA442, 0x4E01, 0xA443, 0x4E03, 0xA444, 0x4E43, 0xA445, 0x4E5D, 0xA446, 0x4E86, + 0xA447, 0x4E8C, 0xA448, 0x4EBA, 0xA449, 0x513F, 0xA44A, 0x5165, 0xA44B, 0x516B, 0xA44C, 0x51E0, 0xA44D, 0x5200, 0xA44E, 0x5201, + 0xA44F, 0x529B, 0xA450, 0x5315, 0xA451, 0x5341, 0xA452, 0x535C, 0xA453, 0x53C8, 0xA454, 0x4E09, 0xA455, 0x4E0B, 0xA456, 0x4E08, + 0xA457, 0x4E0A, 0xA458, 0x4E2B, 0xA459, 0x4E38, 0xA45A, 0x51E1, 0xA45B, 0x4E45, 0xA45C, 0x4E48, 0xA45D, 0x4E5F, 0xA45E, 0x4E5E, + 0xA45F, 0x4E8E, 0xA460, 0x4EA1, 0xA461, 0x5140, 0xA462, 0x5203, 0xA463, 0x52FA, 0xA464, 0x5343, 0xA465, 0x53C9, 0xA466, 0x53E3, + 0xA467, 0x571F, 0xA468, 0x58EB, 0xA469, 0x5915, 0xA46A, 0x5927, 0xA46B, 0x5973, 0xA46C, 0x5B50, 0xA46D, 0x5B51, 0xA46E, 0x5B53, + 0xA46F, 0x5BF8, 0xA470, 0x5C0F, 0xA471, 0x5C22, 0xA472, 0x5C38, 0xA473, 0x5C71, 0xA474, 0x5DDD, 0xA475, 0x5DE5, 0xA476, 0x5DF1, + 0xA477, 0x5DF2, 0xA478, 0x5DF3, 0xA479, 0x5DFE, 0xA47A, 0x5E72, 0xA47B, 0x5EFE, 0xA47C, 0x5F0B, 0xA47D, 0x5F13, 0xA47E, 0x624D, + 0xA4A1, 0x4E11, 0xA4A2, 0x4E10, 0xA4A3, 0x4E0D, 0xA4A4, 0x4E2D, 0xA4A5, 0x4E30, 0xA4A6, 0x4E39, 0xA4A7, 0x4E4B, 0xA4A8, 0x5C39, + 0xA4A9, 0x4E88, 0xA4AA, 0x4E91, 0xA4AB, 0x4E95, 0xA4AC, 0x4E92, 0xA4AD, 0x4E94, 0xA4AE, 0x4EA2, 0xA4AF, 0x4EC1, 0xA4B0, 0x4EC0, + 0xA4B1, 0x4EC3, 0xA4B2, 0x4EC6, 0xA4B3, 0x4EC7, 0xA4B4, 0x4ECD, 0xA4B5, 0x4ECA, 0xA4B6, 0x4ECB, 0xA4B7, 0x4EC4, 0xA4B8, 0x5143, + 0xA4B9, 0x5141, 0xA4BA, 0x5167, 0xA4BB, 0x516D, 0xA4BC, 0x516E, 0xA4BD, 0x516C, 0xA4BE, 0x5197, 0xA4BF, 0x51F6, 0xA4C0, 0x5206, + 0xA4C1, 0x5207, 0xA4C2, 0x5208, 0xA4C3, 0x52FB, 0xA4C4, 0x52FE, 0xA4C5, 0x52FF, 0xA4C6, 0x5316, 0xA4C7, 0x5339, 0xA4C8, 0x5348, + 0xA4C9, 0x5347, 0xA4CA, 0x5345, 0xA4CB, 0x535E, 0xA4CC, 0x5384, 0xA4CD, 0x53CB, 0xA4CE, 0x53CA, 0xA4CF, 0x53CD, 0xA4D0, 0x58EC, + 0xA4D1, 0x5929, 0xA4D2, 0x592B, 0xA4D3, 0x592A, 0xA4D4, 0x592D, 0xA4D5, 0x5B54, 0xA4D6, 0x5C11, 0xA4D7, 0x5C24, 0xA4D8, 0x5C3A, + 0xA4D9, 0x5C6F, 0xA4DA, 0x5DF4, 0xA4DB, 0x5E7B, 0xA4DC, 0x5EFF, 0xA4DD, 0x5F14, 0xA4DE, 0x5F15, 0xA4DF, 0x5FC3, 0xA4E0, 0x6208, + 0xA4E1, 0x6236, 0xA4E2, 0x624B, 0xA4E3, 0x624E, 0xA4E4, 0x652F, 0xA4E5, 0x6587, 0xA4E6, 0x6597, 0xA4E7, 0x65A4, 0xA4E8, 0x65B9, + 0xA4E9, 0x65E5, 0xA4EA, 0x66F0, 0xA4EB, 0x6708, 0xA4EC, 0x6728, 0xA4ED, 0x6B20, 0xA4EE, 0x6B62, 0xA4EF, 0x6B79, 0xA4F0, 0x6BCB, + 0xA4F1, 0x6BD4, 0xA4F2, 0x6BDB, 0xA4F3, 0x6C0F, 0xA4F4, 0x6C34, 0xA4F5, 0x706B, 0xA4F6, 0x722A, 0xA4F7, 0x7236, 0xA4F8, 0x723B, + 0xA4F9, 0x7247, 0xA4FA, 0x7259, 0xA4FB, 0x725B, 0xA4FC, 0x72AC, 0xA4FD, 0x738B, 0xA4FE, 0x4E19, 0xA540, 0x4E16, 0xA541, 0x4E15, + 0xA542, 0x4E14, 0xA543, 0x4E18, 0xA544, 0x4E3B, 0xA545, 0x4E4D, 0xA546, 0x4E4F, 0xA547, 0x4E4E, 0xA548, 0x4EE5, 0xA549, 0x4ED8, + 0xA54A, 0x4ED4, 0xA54B, 0x4ED5, 0xA54C, 0x4ED6, 0xA54D, 0x4ED7, 0xA54E, 0x4EE3, 0xA54F, 0x4EE4, 0xA550, 0x4ED9, 0xA551, 0x4EDE, + 0xA552, 0x5145, 0xA553, 0x5144, 0xA554, 0x5189, 0xA555, 0x518A, 0xA556, 0x51AC, 0xA557, 0x51F9, 0xA558, 0x51FA, 0xA559, 0x51F8, + 0xA55A, 0x520A, 0xA55B, 0x52A0, 0xA55C, 0x529F, 0xA55D, 0x5305, 0xA55E, 0x5306, 0xA55F, 0x5317, 0xA560, 0x531D, 0xA561, 0x4EDF, + 0xA562, 0x534A, 0xA563, 0x5349, 0xA564, 0x5361, 0xA565, 0x5360, 0xA566, 0x536F, 0xA567, 0x536E, 0xA568, 0x53BB, 0xA569, 0x53EF, + 0xA56A, 0x53E4, 0xA56B, 0x53F3, 0xA56C, 0x53EC, 0xA56D, 0x53EE, 0xA56E, 0x53E9, 0xA56F, 0x53E8, 0xA570, 0x53FC, 0xA571, 0x53F8, + 0xA572, 0x53F5, 0xA573, 0x53EB, 0xA574, 0x53E6, 0xA575, 0x53EA, 0xA576, 0x53F2, 0xA577, 0x53F1, 0xA578, 0x53F0, 0xA579, 0x53E5, + 0xA57A, 0x53ED, 0xA57B, 0x53FB, 0xA57C, 0x56DB, 0xA57D, 0x56DA, 0xA57E, 0x5916, 0xA5A1, 0x592E, 0xA5A2, 0x5931, 0xA5A3, 0x5974, + 0xA5A4, 0x5976, 0xA5A5, 0x5B55, 0xA5A6, 0x5B83, 0xA5A7, 0x5C3C, 0xA5A8, 0x5DE8, 0xA5A9, 0x5DE7, 0xA5AA, 0x5DE6, 0xA5AB, 0x5E02, + 0xA5AC, 0x5E03, 0xA5AD, 0x5E73, 0xA5AE, 0x5E7C, 0xA5AF, 0x5F01, 0xA5B0, 0x5F18, 0xA5B1, 0x5F17, 0xA5B2, 0x5FC5, 0xA5B3, 0x620A, + 0xA5B4, 0x6253, 0xA5B5, 0x6254, 0xA5B6, 0x6252, 0xA5B7, 0x6251, 0xA5B8, 0x65A5, 0xA5B9, 0x65E6, 0xA5BA, 0x672E, 0xA5BB, 0x672C, + 0xA5BC, 0x672A, 0xA5BD, 0x672B, 0xA5BE, 0x672D, 0xA5BF, 0x6B63, 0xA5C0, 0x6BCD, 0xA5C1, 0x6C11, 0xA5C2, 0x6C10, 0xA5C3, 0x6C38, + 0xA5C4, 0x6C41, 0xA5C5, 0x6C40, 0xA5C6, 0x6C3E, 0xA5C7, 0x72AF, 0xA5C8, 0x7384, 0xA5C9, 0x7389, 0xA5CA, 0x74DC, 0xA5CB, 0x74E6, + 0xA5CC, 0x7518, 0xA5CD, 0x751F, 0xA5CE, 0x7528, 0xA5CF, 0x7529, 0xA5D0, 0x7530, 0xA5D1, 0x7531, 0xA5D2, 0x7532, 0xA5D3, 0x7533, + 0xA5D4, 0x758B, 0xA5D5, 0x767D, 0xA5D6, 0x76AE, 0xA5D7, 0x76BF, 0xA5D8, 0x76EE, 0xA5D9, 0x77DB, 0xA5DA, 0x77E2, 0xA5DB, 0x77F3, + 0xA5DC, 0x793A, 0xA5DD, 0x79BE, 0xA5DE, 0x7A74, 0xA5DF, 0x7ACB, 0xA5E0, 0x4E1E, 0xA5E1, 0x4E1F, 0xA5E2, 0x4E52, 0xA5E3, 0x4E53, + 0xA5E4, 0x4E69, 0xA5E5, 0x4E99, 0xA5E6, 0x4EA4, 0xA5E7, 0x4EA6, 0xA5E8, 0x4EA5, 0xA5E9, 0x4EFF, 0xA5EA, 0x4F09, 0xA5EB, 0x4F19, + 0xA5EC, 0x4F0A, 0xA5ED, 0x4F15, 0xA5EE, 0x4F0D, 0xA5EF, 0x4F10, 0xA5F0, 0x4F11, 0xA5F1, 0x4F0F, 0xA5F2, 0x4EF2, 0xA5F3, 0x4EF6, + 0xA5F4, 0x4EFB, 0xA5F5, 0x4EF0, 0xA5F6, 0x4EF3, 0xA5F7, 0x4EFD, 0xA5F8, 0x4F01, 0xA5F9, 0x4F0B, 0xA5FA, 0x5149, 0xA5FB, 0x5147, + 0xA5FC, 0x5146, 0xA5FD, 0x5148, 0xA5FE, 0x5168, 0xA640, 0x5171, 0xA641, 0x518D, 0xA642, 0x51B0, 0xA643, 0x5217, 0xA644, 0x5211, + 0xA645, 0x5212, 0xA646, 0x520E, 0xA647, 0x5216, 0xA648, 0x52A3, 0xA649, 0x5308, 0xA64A, 0x5321, 0xA64B, 0x5320, 0xA64C, 0x5370, + 0xA64D, 0x5371, 0xA64E, 0x5409, 0xA64F, 0x540F, 0xA650, 0x540C, 0xA651, 0x540A, 0xA652, 0x5410, 0xA653, 0x5401, 0xA654, 0x540B, + 0xA655, 0x5404, 0xA656, 0x5411, 0xA657, 0x540D, 0xA658, 0x5408, 0xA659, 0x5403, 0xA65A, 0x540E, 0xA65B, 0x5406, 0xA65C, 0x5412, + 0xA65D, 0x56E0, 0xA65E, 0x56DE, 0xA65F, 0x56DD, 0xA660, 0x5733, 0xA661, 0x5730, 0xA662, 0x5728, 0xA663, 0x572D, 0xA664, 0x572C, + 0xA665, 0x572F, 0xA666, 0x5729, 0xA667, 0x5919, 0xA668, 0x591A, 0xA669, 0x5937, 0xA66A, 0x5938, 0xA66B, 0x5984, 0xA66C, 0x5978, + 0xA66D, 0x5983, 0xA66E, 0x597D, 0xA66F, 0x5979, 0xA670, 0x5982, 0xA671, 0x5981, 0xA672, 0x5B57, 0xA673, 0x5B58, 0xA674, 0x5B87, + 0xA675, 0x5B88, 0xA676, 0x5B85, 0xA677, 0x5B89, 0xA678, 0x5BFA, 0xA679, 0x5C16, 0xA67A, 0x5C79, 0xA67B, 0x5DDE, 0xA67C, 0x5E06, + 0xA67D, 0x5E76, 0xA67E, 0x5E74, 0xA6A1, 0x5F0F, 0xA6A2, 0x5F1B, 0xA6A3, 0x5FD9, 0xA6A4, 0x5FD6, 0xA6A5, 0x620E, 0xA6A6, 0x620C, + 0xA6A7, 0x620D, 0xA6A8, 0x6210, 0xA6A9, 0x6263, 0xA6AA, 0x625B, 0xA6AB, 0x6258, 0xA6AC, 0x6536, 0xA6AD, 0x65E9, 0xA6AE, 0x65E8, + 0xA6AF, 0x65EC, 0xA6B0, 0x65ED, 0xA6B1, 0x66F2, 0xA6B2, 0x66F3, 0xA6B3, 0x6709, 0xA6B4, 0x673D, 0xA6B5, 0x6734, 0xA6B6, 0x6731, + 0xA6B7, 0x6735, 0xA6B8, 0x6B21, 0xA6B9, 0x6B64, 0xA6BA, 0x6B7B, 0xA6BB, 0x6C16, 0xA6BC, 0x6C5D, 0xA6BD, 0x6C57, 0xA6BE, 0x6C59, + 0xA6BF, 0x6C5F, 0xA6C0, 0x6C60, 0xA6C1, 0x6C50, 0xA6C2, 0x6C55, 0xA6C3, 0x6C61, 0xA6C4, 0x6C5B, 0xA6C5, 0x6C4D, 0xA6C6, 0x6C4E, + 0xA6C7, 0x7070, 0xA6C8, 0x725F, 0xA6C9, 0x725D, 0xA6CA, 0x767E, 0xA6CB, 0x7AF9, 0xA6CC, 0x7C73, 0xA6CD, 0x7CF8, 0xA6CE, 0x7F36, + 0xA6CF, 0x7F8A, 0xA6D0, 0x7FBD, 0xA6D1, 0x8001, 0xA6D2, 0x8003, 0xA6D3, 0x800C, 0xA6D4, 0x8012, 0xA6D5, 0x8033, 0xA6D6, 0x807F, + 0xA6D7, 0x8089, 0xA6D8, 0x808B, 0xA6D9, 0x808C, 0xA6DA, 0x81E3, 0xA6DB, 0x81EA, 0xA6DC, 0x81F3, 0xA6DD, 0x81FC, 0xA6DE, 0x820C, + 0xA6DF, 0x821B, 0xA6E0, 0x821F, 0xA6E1, 0x826E, 0xA6E2, 0x8272, 0xA6E3, 0x827E, 0xA6E4, 0x866B, 0xA6E5, 0x8840, 0xA6E6, 0x884C, + 0xA6E7, 0x8863, 0xA6E8, 0x897F, 0xA6E9, 0x9621, 0xA6EA, 0x4E32, 0xA6EB, 0x4EA8, 0xA6EC, 0x4F4D, 0xA6ED, 0x4F4F, 0xA6EE, 0x4F47, + 0xA6EF, 0x4F57, 0xA6F0, 0x4F5E, 0xA6F1, 0x4F34, 0xA6F2, 0x4F5B, 0xA6F3, 0x4F55, 0xA6F4, 0x4F30, 0xA6F5, 0x4F50, 0xA6F6, 0x4F51, + 0xA6F7, 0x4F3D, 0xA6F8, 0x4F3A, 0xA6F9, 0x4F38, 0xA6FA, 0x4F43, 0xA6FB, 0x4F54, 0xA6FC, 0x4F3C, 0xA6FD, 0x4F46, 0xA6FE, 0x4F63, + 0xA740, 0x4F5C, 0xA741, 0x4F60, 0xA742, 0x4F2F, 0xA743, 0x4F4E, 0xA744, 0x4F36, 0xA745, 0x4F59, 0xA746, 0x4F5D, 0xA747, 0x4F48, + 0xA748, 0x4F5A, 0xA749, 0x514C, 0xA74A, 0x514B, 0xA74B, 0x514D, 0xA74C, 0x5175, 0xA74D, 0x51B6, 0xA74E, 0x51B7, 0xA74F, 0x5225, + 0xA750, 0x5224, 0xA751, 0x5229, 0xA752, 0x522A, 0xA753, 0x5228, 0xA754, 0x52AB, 0xA755, 0x52A9, 0xA756, 0x52AA, 0xA757, 0x52AC, + 0xA758, 0x5323, 0xA759, 0x5373, 0xA75A, 0x5375, 0xA75B, 0x541D, 0xA75C, 0x542D, 0xA75D, 0x541E, 0xA75E, 0x543E, 0xA75F, 0x5426, + 0xA760, 0x544E, 0xA761, 0x5427, 0xA762, 0x5446, 0xA763, 0x5443, 0xA764, 0x5433, 0xA765, 0x5448, 0xA766, 0x5442, 0xA767, 0x541B, + 0xA768, 0x5429, 0xA769, 0x544A, 0xA76A, 0x5439, 0xA76B, 0x543B, 0xA76C, 0x5438, 0xA76D, 0x542E, 0xA76E, 0x5435, 0xA76F, 0x5436, + 0xA770, 0x5420, 0xA771, 0x543C, 0xA772, 0x5440, 0xA773, 0x5431, 0xA774, 0x542B, 0xA775, 0x541F, 0xA776, 0x542C, 0xA777, 0x56EA, + 0xA778, 0x56F0, 0xA779, 0x56E4, 0xA77A, 0x56EB, 0xA77B, 0x574A, 0xA77C, 0x5751, 0xA77D, 0x5740, 0xA77E, 0x574D, 0xA7A1, 0x5747, + 0xA7A2, 0x574E, 0xA7A3, 0x573E, 0xA7A4, 0x5750, 0xA7A5, 0x574F, 0xA7A6, 0x573B, 0xA7A7, 0x58EF, 0xA7A8, 0x593E, 0xA7A9, 0x599D, + 0xA7AA, 0x5992, 0xA7AB, 0x59A8, 0xA7AC, 0x599E, 0xA7AD, 0x59A3, 0xA7AE, 0x5999, 0xA7AF, 0x5996, 0xA7B0, 0x598D, 0xA7B1, 0x59A4, + 0xA7B2, 0x5993, 0xA7B3, 0x598A, 0xA7B4, 0x59A5, 0xA7B5, 0x5B5D, 0xA7B6, 0x5B5C, 0xA7B7, 0x5B5A, 0xA7B8, 0x5B5B, 0xA7B9, 0x5B8C, + 0xA7BA, 0x5B8B, 0xA7BB, 0x5B8F, 0xA7BC, 0x5C2C, 0xA7BD, 0x5C40, 0xA7BE, 0x5C41, 0xA7BF, 0x5C3F, 0xA7C0, 0x5C3E, 0xA7C1, 0x5C90, + 0xA7C2, 0x5C91, 0xA7C3, 0x5C94, 0xA7C4, 0x5C8C, 0xA7C5, 0x5DEB, 0xA7C6, 0x5E0C, 0xA7C7, 0x5E8F, 0xA7C8, 0x5E87, 0xA7C9, 0x5E8A, + 0xA7CA, 0x5EF7, 0xA7CB, 0x5F04, 0xA7CC, 0x5F1F, 0xA7CD, 0x5F64, 0xA7CE, 0x5F62, 0xA7CF, 0x5F77, 0xA7D0, 0x5F79, 0xA7D1, 0x5FD8, + 0xA7D2, 0x5FCC, 0xA7D3, 0x5FD7, 0xA7D4, 0x5FCD, 0xA7D5, 0x5FF1, 0xA7D6, 0x5FEB, 0xA7D7, 0x5FF8, 0xA7D8, 0x5FEA, 0xA7D9, 0x6212, + 0xA7DA, 0x6211, 0xA7DB, 0x6284, 0xA7DC, 0x6297, 0xA7DD, 0x6296, 0xA7DE, 0x6280, 0xA7DF, 0x6276, 0xA7E0, 0x6289, 0xA7E1, 0x626D, + 0xA7E2, 0x628A, 0xA7E3, 0x627C, 0xA7E4, 0x627E, 0xA7E5, 0x6279, 0xA7E6, 0x6273, 0xA7E7, 0x6292, 0xA7E8, 0x626F, 0xA7E9, 0x6298, + 0xA7EA, 0x626E, 0xA7EB, 0x6295, 0xA7EC, 0x6293, 0xA7ED, 0x6291, 0xA7EE, 0x6286, 0xA7EF, 0x6539, 0xA7F0, 0x653B, 0xA7F1, 0x6538, + 0xA7F2, 0x65F1, 0xA7F3, 0x66F4, 0xA7F4, 0x675F, 0xA7F5, 0x674E, 0xA7F6, 0x674F, 0xA7F7, 0x6750, 0xA7F8, 0x6751, 0xA7F9, 0x675C, + 0xA7FA, 0x6756, 0xA7FB, 0x675E, 0xA7FC, 0x6749, 0xA7FD, 0x6746, 0xA7FE, 0x6760, 0xA840, 0x6753, 0xA841, 0x6757, 0xA842, 0x6B65, + 0xA843, 0x6BCF, 0xA844, 0x6C42, 0xA845, 0x6C5E, 0xA846, 0x6C99, 0xA847, 0x6C81, 0xA848, 0x6C88, 0xA849, 0x6C89, 0xA84A, 0x6C85, + 0xA84B, 0x6C9B, 0xA84C, 0x6C6A, 0xA84D, 0x6C7A, 0xA84E, 0x6C90, 0xA84F, 0x6C70, 0xA850, 0x6C8C, 0xA851, 0x6C68, 0xA852, 0x6C96, + 0xA853, 0x6C92, 0xA854, 0x6C7D, 0xA855, 0x6C83, 0xA856, 0x6C72, 0xA857, 0x6C7E, 0xA858, 0x6C74, 0xA859, 0x6C86, 0xA85A, 0x6C76, + 0xA85B, 0x6C8D, 0xA85C, 0x6C94, 0xA85D, 0x6C98, 0xA85E, 0x6C82, 0xA85F, 0x7076, 0xA860, 0x707C, 0xA861, 0x707D, 0xA862, 0x7078, + 0xA863, 0x7262, 0xA864, 0x7261, 0xA865, 0x7260, 0xA866, 0x72C4, 0xA867, 0x72C2, 0xA868, 0x7396, 0xA869, 0x752C, 0xA86A, 0x752B, + 0xA86B, 0x7537, 0xA86C, 0x7538, 0xA86D, 0x7682, 0xA86E, 0x76EF, 0xA86F, 0x77E3, 0xA870, 0x79C1, 0xA871, 0x79C0, 0xA872, 0x79BF, + 0xA873, 0x7A76, 0xA874, 0x7CFB, 0xA875, 0x7F55, 0xA876, 0x8096, 0xA877, 0x8093, 0xA878, 0x809D, 0xA879, 0x8098, 0xA87A, 0x809B, + 0xA87B, 0x809A, 0xA87C, 0x80B2, 0xA87D, 0x826F, 0xA87E, 0x8292, 0xA8A1, 0x828B, 0xA8A2, 0x828D, 0xA8A3, 0x898B, 0xA8A4, 0x89D2, + 0xA8A5, 0x8A00, 0xA8A6, 0x8C37, 0xA8A7, 0x8C46, 0xA8A8, 0x8C55, 0xA8A9, 0x8C9D, 0xA8AA, 0x8D64, 0xA8AB, 0x8D70, 0xA8AC, 0x8DB3, + 0xA8AD, 0x8EAB, 0xA8AE, 0x8ECA, 0xA8AF, 0x8F9B, 0xA8B0, 0x8FB0, 0xA8B1, 0x8FC2, 0xA8B2, 0x8FC6, 0xA8B3, 0x8FC5, 0xA8B4, 0x8FC4, + 0xA8B5, 0x5DE1, 0xA8B6, 0x9091, 0xA8B7, 0x90A2, 0xA8B8, 0x90AA, 0xA8B9, 0x90A6, 0xA8BA, 0x90A3, 0xA8BB, 0x9149, 0xA8BC, 0x91C6, + 0xA8BD, 0x91CC, 0xA8BE, 0x9632, 0xA8BF, 0x962E, 0xA8C0, 0x9631, 0xA8C1, 0x962A, 0xA8C2, 0x962C, 0xA8C3, 0x4E26, 0xA8C4, 0x4E56, + 0xA8C5, 0x4E73, 0xA8C6, 0x4E8B, 0xA8C7, 0x4E9B, 0xA8C8, 0x4E9E, 0xA8C9, 0x4EAB, 0xA8CA, 0x4EAC, 0xA8CB, 0x4F6F, 0xA8CC, 0x4F9D, + 0xA8CD, 0x4F8D, 0xA8CE, 0x4F73, 0xA8CF, 0x4F7F, 0xA8D0, 0x4F6C, 0xA8D1, 0x4F9B, 0xA8D2, 0x4F8B, 0xA8D3, 0x4F86, 0xA8D4, 0x4F83, + 0xA8D5, 0x4F70, 0xA8D6, 0x4F75, 0xA8D7, 0x4F88, 0xA8D8, 0x4F69, 0xA8D9, 0x4F7B, 0xA8DA, 0x4F96, 0xA8DB, 0x4F7E, 0xA8DC, 0x4F8F, + 0xA8DD, 0x4F91, 0xA8DE, 0x4F7A, 0xA8DF, 0x5154, 0xA8E0, 0x5152, 0xA8E1, 0x5155, 0xA8E2, 0x5169, 0xA8E3, 0x5177, 0xA8E4, 0x5176, + 0xA8E5, 0x5178, 0xA8E6, 0x51BD, 0xA8E7, 0x51FD, 0xA8E8, 0x523B, 0xA8E9, 0x5238, 0xA8EA, 0x5237, 0xA8EB, 0x523A, 0xA8EC, 0x5230, + 0xA8ED, 0x522E, 0xA8EE, 0x5236, 0xA8EF, 0x5241, 0xA8F0, 0x52BE, 0xA8F1, 0x52BB, 0xA8F2, 0x5352, 0xA8F3, 0x5354, 0xA8F4, 0x5353, + 0xA8F5, 0x5351, 0xA8F6, 0x5366, 0xA8F7, 0x5377, 0xA8F8, 0x5378, 0xA8F9, 0x5379, 0xA8FA, 0x53D6, 0xA8FB, 0x53D4, 0xA8FC, 0x53D7, + 0xA8FD, 0x5473, 0xA8FE, 0x5475, 0xA940, 0x5496, 0xA941, 0x5478, 0xA942, 0x5495, 0xA943, 0x5480, 0xA944, 0x547B, 0xA945, 0x5477, + 0xA946, 0x5484, 0xA947, 0x5492, 0xA948, 0x5486, 0xA949, 0x547C, 0xA94A, 0x5490, 0xA94B, 0x5471, 0xA94C, 0x5476, 0xA94D, 0x548C, + 0xA94E, 0x549A, 0xA94F, 0x5462, 0xA950, 0x5468, 0xA951, 0x548B, 0xA952, 0x547D, 0xA953, 0x548E, 0xA954, 0x56FA, 0xA955, 0x5783, + 0xA956, 0x5777, 0xA957, 0x576A, 0xA958, 0x5769, 0xA959, 0x5761, 0xA95A, 0x5766, 0xA95B, 0x5764, 0xA95C, 0x577C, 0xA95D, 0x591C, + 0xA95E, 0x5949, 0xA95F, 0x5947, 0xA960, 0x5948, 0xA961, 0x5944, 0xA962, 0x5954, 0xA963, 0x59BE, 0xA964, 0x59BB, 0xA965, 0x59D4, + 0xA966, 0x59B9, 0xA967, 0x59AE, 0xA968, 0x59D1, 0xA969, 0x59C6, 0xA96A, 0x59D0, 0xA96B, 0x59CD, 0xA96C, 0x59CB, 0xA96D, 0x59D3, + 0xA96E, 0x59CA, 0xA96F, 0x59AF, 0xA970, 0x59B3, 0xA971, 0x59D2, 0xA972, 0x59C5, 0xA973, 0x5B5F, 0xA974, 0x5B64, 0xA975, 0x5B63, + 0xA976, 0x5B97, 0xA977, 0x5B9A, 0xA978, 0x5B98, 0xA979, 0x5B9C, 0xA97A, 0x5B99, 0xA97B, 0x5B9B, 0xA97C, 0x5C1A, 0xA97D, 0x5C48, + 0xA97E, 0x5C45, 0xA9A1, 0x5C46, 0xA9A2, 0x5CB7, 0xA9A3, 0x5CA1, 0xA9A4, 0x5CB8, 0xA9A5, 0x5CA9, 0xA9A6, 0x5CAB, 0xA9A7, 0x5CB1, + 0xA9A8, 0x5CB3, 0xA9A9, 0x5E18, 0xA9AA, 0x5E1A, 0xA9AB, 0x5E16, 0xA9AC, 0x5E15, 0xA9AD, 0x5E1B, 0xA9AE, 0x5E11, 0xA9AF, 0x5E78, + 0xA9B0, 0x5E9A, 0xA9B1, 0x5E97, 0xA9B2, 0x5E9C, 0xA9B3, 0x5E95, 0xA9B4, 0x5E96, 0xA9B5, 0x5EF6, 0xA9B6, 0x5F26, 0xA9B7, 0x5F27, + 0xA9B8, 0x5F29, 0xA9B9, 0x5F80, 0xA9BA, 0x5F81, 0xA9BB, 0x5F7F, 0xA9BC, 0x5F7C, 0xA9BD, 0x5FDD, 0xA9BE, 0x5FE0, 0xA9BF, 0x5FFD, + 0xA9C0, 0x5FF5, 0xA9C1, 0x5FFF, 0xA9C2, 0x600F, 0xA9C3, 0x6014, 0xA9C4, 0x602F, 0xA9C5, 0x6035, 0xA9C6, 0x6016, 0xA9C7, 0x602A, + 0xA9C8, 0x6015, 0xA9C9, 0x6021, 0xA9CA, 0x6027, 0xA9CB, 0x6029, 0xA9CC, 0x602B, 0xA9CD, 0x601B, 0xA9CE, 0x6216, 0xA9CF, 0x6215, + 0xA9D0, 0x623F, 0xA9D1, 0x623E, 0xA9D2, 0x6240, 0xA9D3, 0x627F, 0xA9D4, 0x62C9, 0xA9D5, 0x62CC, 0xA9D6, 0x62C4, 0xA9D7, 0x62BF, + 0xA9D8, 0x62C2, 0xA9D9, 0x62B9, 0xA9DA, 0x62D2, 0xA9DB, 0x62DB, 0xA9DC, 0x62AB, 0xA9DD, 0x62D3, 0xA9DE, 0x62D4, 0xA9DF, 0x62CB, + 0xA9E0, 0x62C8, 0xA9E1, 0x62A8, 0xA9E2, 0x62BD, 0xA9E3, 0x62BC, 0xA9E4, 0x62D0, 0xA9E5, 0x62D9, 0xA9E6, 0x62C7, 0xA9E7, 0x62CD, + 0xA9E8, 0x62B5, 0xA9E9, 0x62DA, 0xA9EA, 0x62B1, 0xA9EB, 0x62D8, 0xA9EC, 0x62D6, 0xA9ED, 0x62D7, 0xA9EE, 0x62C6, 0xA9EF, 0x62AC, + 0xA9F0, 0x62CE, 0xA9F1, 0x653E, 0xA9F2, 0x65A7, 0xA9F3, 0x65BC, 0xA9F4, 0x65FA, 0xA9F5, 0x6614, 0xA9F6, 0x6613, 0xA9F7, 0x660C, + 0xA9F8, 0x6606, 0xA9F9, 0x6602, 0xA9FA, 0x660E, 0xA9FB, 0x6600, 0xA9FC, 0x660F, 0xA9FD, 0x6615, 0xA9FE, 0x660A, 0xAA40, 0x6607, + 0xAA41, 0x670D, 0xAA42, 0x670B, 0xAA43, 0x676D, 0xAA44, 0x678B, 0xAA45, 0x6795, 0xAA46, 0x6771, 0xAA47, 0x679C, 0xAA48, 0x6773, + 0xAA49, 0x6777, 0xAA4A, 0x6787, 0xAA4B, 0x679D, 0xAA4C, 0x6797, 0xAA4D, 0x676F, 0xAA4E, 0x6770, 0xAA4F, 0x677F, 0xAA50, 0x6789, + 0xAA51, 0x677E, 0xAA52, 0x6790, 0xAA53, 0x6775, 0xAA54, 0x679A, 0xAA55, 0x6793, 0xAA56, 0x677C, 0xAA57, 0x676A, 0xAA58, 0x6772, + 0xAA59, 0x6B23, 0xAA5A, 0x6B66, 0xAA5B, 0x6B67, 0xAA5C, 0x6B7F, 0xAA5D, 0x6C13, 0xAA5E, 0x6C1B, 0xAA5F, 0x6CE3, 0xAA60, 0x6CE8, + 0xAA61, 0x6CF3, 0xAA62, 0x6CB1, 0xAA63, 0x6CCC, 0xAA64, 0x6CE5, 0xAA65, 0x6CB3, 0xAA66, 0x6CBD, 0xAA67, 0x6CBE, 0xAA68, 0x6CBC, + 0xAA69, 0x6CE2, 0xAA6A, 0x6CAB, 0xAA6B, 0x6CD5, 0xAA6C, 0x6CD3, 0xAA6D, 0x6CB8, 0xAA6E, 0x6CC4, 0xAA6F, 0x6CB9, 0xAA70, 0x6CC1, + 0xAA71, 0x6CAE, 0xAA72, 0x6CD7, 0xAA73, 0x6CC5, 0xAA74, 0x6CF1, 0xAA75, 0x6CBF, 0xAA76, 0x6CBB, 0xAA77, 0x6CE1, 0xAA78, 0x6CDB, + 0xAA79, 0x6CCA, 0xAA7A, 0x6CAC, 0xAA7B, 0x6CEF, 0xAA7C, 0x6CDC, 0xAA7D, 0x6CD6, 0xAA7E, 0x6CE0, 0xAAA1, 0x7095, 0xAAA2, 0x708E, + 0xAAA3, 0x7092, 0xAAA4, 0x708A, 0xAAA5, 0x7099, 0xAAA6, 0x722C, 0xAAA7, 0x722D, 0xAAA8, 0x7238, 0xAAA9, 0x7248, 0xAAAA, 0x7267, + 0xAAAB, 0x7269, 0xAAAC, 0x72C0, 0xAAAD, 0x72CE, 0xAAAE, 0x72D9, 0xAAAF, 0x72D7, 0xAAB0, 0x72D0, 0xAAB1, 0x73A9, 0xAAB2, 0x73A8, + 0xAAB3, 0x739F, 0xAAB4, 0x73AB, 0xAAB5, 0x73A5, 0xAAB6, 0x753D, 0xAAB7, 0x759D, 0xAAB8, 0x7599, 0xAAB9, 0x759A, 0xAABA, 0x7684, + 0xAABB, 0x76C2, 0xAABC, 0x76F2, 0xAABD, 0x76F4, 0xAABE, 0x77E5, 0xAABF, 0x77FD, 0xAAC0, 0x793E, 0xAAC1, 0x7940, 0xAAC2, 0x7941, + 0xAAC3, 0x79C9, 0xAAC4, 0x79C8, 0xAAC5, 0x7A7A, 0xAAC6, 0x7A79, 0xAAC7, 0x7AFA, 0xAAC8, 0x7CFE, 0xAAC9, 0x7F54, 0xAACA, 0x7F8C, + 0xAACB, 0x7F8B, 0xAACC, 0x8005, 0xAACD, 0x80BA, 0xAACE, 0x80A5, 0xAACF, 0x80A2, 0xAAD0, 0x80B1, 0xAAD1, 0x80A1, 0xAAD2, 0x80AB, + 0xAAD3, 0x80A9, 0xAAD4, 0x80B4, 0xAAD5, 0x80AA, 0xAAD6, 0x80AF, 0xAAD7, 0x81E5, 0xAAD8, 0x81FE, 0xAAD9, 0x820D, 0xAADA, 0x82B3, + 0xAADB, 0x829D, 0xAADC, 0x8299, 0xAADD, 0x82AD, 0xAADE, 0x82BD, 0xAADF, 0x829F, 0xAAE0, 0x82B9, 0xAAE1, 0x82B1, 0xAAE2, 0x82AC, + 0xAAE3, 0x82A5, 0xAAE4, 0x82AF, 0xAAE5, 0x82B8, 0xAAE6, 0x82A3, 0xAAE7, 0x82B0, 0xAAE8, 0x82BE, 0xAAE9, 0x82B7, 0xAAEA, 0x864E, + 0xAAEB, 0x8671, 0xAAEC, 0x521D, 0xAAED, 0x8868, 0xAAEE, 0x8ECB, 0xAAEF, 0x8FCE, 0xAAF0, 0x8FD4, 0xAAF1, 0x8FD1, 0xAAF2, 0x90B5, + 0xAAF3, 0x90B8, 0xAAF4, 0x90B1, 0xAAF5, 0x90B6, 0xAAF6, 0x91C7, 0xAAF7, 0x91D1, 0xAAF8, 0x9577, 0xAAF9, 0x9580, 0xAAFA, 0x961C, + 0xAAFB, 0x9640, 0xAAFC, 0x963F, 0xAAFD, 0x963B, 0xAAFE, 0x9644, 0xAB40, 0x9642, 0xAB41, 0x96B9, 0xAB42, 0x96E8, 0xAB43, 0x9752, + 0xAB44, 0x975E, 0xAB45, 0x4E9F, 0xAB46, 0x4EAD, 0xAB47, 0x4EAE, 0xAB48, 0x4FE1, 0xAB49, 0x4FB5, 0xAB4A, 0x4FAF, 0xAB4B, 0x4FBF, + 0xAB4C, 0x4FE0, 0xAB4D, 0x4FD1, 0xAB4E, 0x4FCF, 0xAB4F, 0x4FDD, 0xAB50, 0x4FC3, 0xAB51, 0x4FB6, 0xAB52, 0x4FD8, 0xAB53, 0x4FDF, + 0xAB54, 0x4FCA, 0xAB55, 0x4FD7, 0xAB56, 0x4FAE, 0xAB57, 0x4FD0, 0xAB58, 0x4FC4, 0xAB59, 0x4FC2, 0xAB5A, 0x4FDA, 0xAB5B, 0x4FCE, + 0xAB5C, 0x4FDE, 0xAB5D, 0x4FB7, 0xAB5E, 0x5157, 0xAB5F, 0x5192, 0xAB60, 0x5191, 0xAB61, 0x51A0, 0xAB62, 0x524E, 0xAB63, 0x5243, + 0xAB64, 0x524A, 0xAB65, 0x524D, 0xAB66, 0x524C, 0xAB67, 0x524B, 0xAB68, 0x5247, 0xAB69, 0x52C7, 0xAB6A, 0x52C9, 0xAB6B, 0x52C3, + 0xAB6C, 0x52C1, 0xAB6D, 0x530D, 0xAB6E, 0x5357, 0xAB6F, 0x537B, 0xAB70, 0x539A, 0xAB71, 0x53DB, 0xAB72, 0x54AC, 0xAB73, 0x54C0, + 0xAB74, 0x54A8, 0xAB75, 0x54CE, 0xAB76, 0x54C9, 0xAB77, 0x54B8, 0xAB78, 0x54A6, 0xAB79, 0x54B3, 0xAB7A, 0x54C7, 0xAB7B, 0x54C2, + 0xAB7C, 0x54BD, 0xAB7D, 0x54AA, 0xAB7E, 0x54C1, 0xABA1, 0x54C4, 0xABA2, 0x54C8, 0xABA3, 0x54AF, 0xABA4, 0x54AB, 0xABA5, 0x54B1, + 0xABA6, 0x54BB, 0xABA7, 0x54A9, 0xABA8, 0x54A7, 0xABA9, 0x54BF, 0xABAA, 0x56FF, 0xABAB, 0x5782, 0xABAC, 0x578B, 0xABAD, 0x57A0, + 0xABAE, 0x57A3, 0xABAF, 0x57A2, 0xABB0, 0x57CE, 0xABB1, 0x57AE, 0xABB2, 0x5793, 0xABB3, 0x5955, 0xABB4, 0x5951, 0xABB5, 0x594F, + 0xABB6, 0x594E, 0xABB7, 0x5950, 0xABB8, 0x59DC, 0xABB9, 0x59D8, 0xABBA, 0x59FF, 0xABBB, 0x59E3, 0xABBC, 0x59E8, 0xABBD, 0x5A03, + 0xABBE, 0x59E5, 0xABBF, 0x59EA, 0xABC0, 0x59DA, 0xABC1, 0x59E6, 0xABC2, 0x5A01, 0xABC3, 0x59FB, 0xABC4, 0x5B69, 0xABC5, 0x5BA3, + 0xABC6, 0x5BA6, 0xABC7, 0x5BA4, 0xABC8, 0x5BA2, 0xABC9, 0x5BA5, 0xABCA, 0x5C01, 0xABCB, 0x5C4E, 0xABCC, 0x5C4F, 0xABCD, 0x5C4D, + 0xABCE, 0x5C4B, 0xABCF, 0x5CD9, 0xABD0, 0x5CD2, 0xABD1, 0x5DF7, 0xABD2, 0x5E1D, 0xABD3, 0x5E25, 0xABD4, 0x5E1F, 0xABD5, 0x5E7D, + 0xABD6, 0x5EA0, 0xABD7, 0x5EA6, 0xABD8, 0x5EFA, 0xABD9, 0x5F08, 0xABDA, 0x5F2D, 0xABDB, 0x5F65, 0xABDC, 0x5F88, 0xABDD, 0x5F85, + 0xABDE, 0x5F8A, 0xABDF, 0x5F8B, 0xABE0, 0x5F87, 0xABE1, 0x5F8C, 0xABE2, 0x5F89, 0xABE3, 0x6012, 0xABE4, 0x601D, 0xABE5, 0x6020, + 0xABE6, 0x6025, 0xABE7, 0x600E, 0xABE8, 0x6028, 0xABE9, 0x604D, 0xABEA, 0x6070, 0xABEB, 0x6068, 0xABEC, 0x6062, 0xABED, 0x6046, + 0xABEE, 0x6043, 0xABEF, 0x606C, 0xABF0, 0x606B, 0xABF1, 0x606A, 0xABF2, 0x6064, 0xABF3, 0x6241, 0xABF4, 0x62DC, 0xABF5, 0x6316, + 0xABF6, 0x6309, 0xABF7, 0x62FC, 0xABF8, 0x62ED, 0xABF9, 0x6301, 0xABFA, 0x62EE, 0xABFB, 0x62FD, 0xABFC, 0x6307, 0xABFD, 0x62F1, + 0xABFE, 0x62F7, 0xAC40, 0x62EF, 0xAC41, 0x62EC, 0xAC42, 0x62FE, 0xAC43, 0x62F4, 0xAC44, 0x6311, 0xAC45, 0x6302, 0xAC46, 0x653F, + 0xAC47, 0x6545, 0xAC48, 0x65AB, 0xAC49, 0x65BD, 0xAC4A, 0x65E2, 0xAC4B, 0x6625, 0xAC4C, 0x662D, 0xAC4D, 0x6620, 0xAC4E, 0x6627, + 0xAC4F, 0x662F, 0xAC50, 0x661F, 0xAC51, 0x6628, 0xAC52, 0x6631, 0xAC53, 0x6624, 0xAC54, 0x66F7, 0xAC55, 0x67FF, 0xAC56, 0x67D3, + 0xAC57, 0x67F1, 0xAC58, 0x67D4, 0xAC59, 0x67D0, 0xAC5A, 0x67EC, 0xAC5B, 0x67B6, 0xAC5C, 0x67AF, 0xAC5D, 0x67F5, 0xAC5E, 0x67E9, + 0xAC5F, 0x67EF, 0xAC60, 0x67C4, 0xAC61, 0x67D1, 0xAC62, 0x67B4, 0xAC63, 0x67DA, 0xAC64, 0x67E5, 0xAC65, 0x67B8, 0xAC66, 0x67CF, + 0xAC67, 0x67DE, 0xAC68, 0x67F3, 0xAC69, 0x67B0, 0xAC6A, 0x67D9, 0xAC6B, 0x67E2, 0xAC6C, 0x67DD, 0xAC6D, 0x67D2, 0xAC6E, 0x6B6A, + 0xAC6F, 0x6B83, 0xAC70, 0x6B86, 0xAC71, 0x6BB5, 0xAC72, 0x6BD2, 0xAC73, 0x6BD7, 0xAC74, 0x6C1F, 0xAC75, 0x6CC9, 0xAC76, 0x6D0B, + 0xAC77, 0x6D32, 0xAC78, 0x6D2A, 0xAC79, 0x6D41, 0xAC7A, 0x6D25, 0xAC7B, 0x6D0C, 0xAC7C, 0x6D31, 0xAC7D, 0x6D1E, 0xAC7E, 0x6D17, + 0xACA1, 0x6D3B, 0xACA2, 0x6D3D, 0xACA3, 0x6D3E, 0xACA4, 0x6D36, 0xACA5, 0x6D1B, 0xACA6, 0x6CF5, 0xACA7, 0x6D39, 0xACA8, 0x6D27, + 0xACA9, 0x6D38, 0xACAA, 0x6D29, 0xACAB, 0x6D2E, 0xACAC, 0x6D35, 0xACAD, 0x6D0E, 0xACAE, 0x6D2B, 0xACAF, 0x70AB, 0xACB0, 0x70BA, + 0xACB1, 0x70B3, 0xACB2, 0x70AC, 0xACB3, 0x70AF, 0xACB4, 0x70AD, 0xACB5, 0x70B8, 0xACB6, 0x70AE, 0xACB7, 0x70A4, 0xACB8, 0x7230, + 0xACB9, 0x7272, 0xACBA, 0x726F, 0xACBB, 0x7274, 0xACBC, 0x72E9, 0xACBD, 0x72E0, 0xACBE, 0x72E1, 0xACBF, 0x73B7, 0xACC0, 0x73CA, + 0xACC1, 0x73BB, 0xACC2, 0x73B2, 0xACC3, 0x73CD, 0xACC4, 0x73C0, 0xACC5, 0x73B3, 0xACC6, 0x751A, 0xACC7, 0x752D, 0xACC8, 0x754F, + 0xACC9, 0x754C, 0xACCA, 0x754E, 0xACCB, 0x754B, 0xACCC, 0x75AB, 0xACCD, 0x75A4, 0xACCE, 0x75A5, 0xACCF, 0x75A2, 0xACD0, 0x75A3, + 0xACD1, 0x7678, 0xACD2, 0x7686, 0xACD3, 0x7687, 0xACD4, 0x7688, 0xACD5, 0x76C8, 0xACD6, 0x76C6, 0xACD7, 0x76C3, 0xACD8, 0x76C5, + 0xACD9, 0x7701, 0xACDA, 0x76F9, 0xACDB, 0x76F8, 0xACDC, 0x7709, 0xACDD, 0x770B, 0xACDE, 0x76FE, 0xACDF, 0x76FC, 0xACE0, 0x7707, + 0xACE1, 0x77DC, 0xACE2, 0x7802, 0xACE3, 0x7814, 0xACE4, 0x780C, 0xACE5, 0x780D, 0xACE6, 0x7946, 0xACE7, 0x7949, 0xACE8, 0x7948, + 0xACE9, 0x7947, 0xACEA, 0x79B9, 0xACEB, 0x79BA, 0xACEC, 0x79D1, 0xACED, 0x79D2, 0xACEE, 0x79CB, 0xACEF, 0x7A7F, 0xACF0, 0x7A81, + 0xACF1, 0x7AFF, 0xACF2, 0x7AFD, 0xACF3, 0x7C7D, 0xACF4, 0x7D02, 0xACF5, 0x7D05, 0xACF6, 0x7D00, 0xACF7, 0x7D09, 0xACF8, 0x7D07, + 0xACF9, 0x7D04, 0xACFA, 0x7D06, 0xACFB, 0x7F38, 0xACFC, 0x7F8E, 0xACFD, 0x7FBF, 0xACFE, 0x8004, 0xAD40, 0x8010, 0xAD41, 0x800D, + 0xAD42, 0x8011, 0xAD43, 0x8036, 0xAD44, 0x80D6, 0xAD45, 0x80E5, 0xAD46, 0x80DA, 0xAD47, 0x80C3, 0xAD48, 0x80C4, 0xAD49, 0x80CC, + 0xAD4A, 0x80E1, 0xAD4B, 0x80DB, 0xAD4C, 0x80CE, 0xAD4D, 0x80DE, 0xAD4E, 0x80E4, 0xAD4F, 0x80DD, 0xAD50, 0x81F4, 0xAD51, 0x8222, + 0xAD52, 0x82E7, 0xAD53, 0x8303, 0xAD54, 0x8305, 0xAD55, 0x82E3, 0xAD56, 0x82DB, 0xAD57, 0x82E6, 0xAD58, 0x8304, 0xAD59, 0x82E5, + 0xAD5A, 0x8302, 0xAD5B, 0x8309, 0xAD5C, 0x82D2, 0xAD5D, 0x82D7, 0xAD5E, 0x82F1, 0xAD5F, 0x8301, 0xAD60, 0x82DC, 0xAD61, 0x82D4, + 0xAD62, 0x82D1, 0xAD63, 0x82DE, 0xAD64, 0x82D3, 0xAD65, 0x82DF, 0xAD66, 0x82EF, 0xAD67, 0x8306, 0xAD68, 0x8650, 0xAD69, 0x8679, + 0xAD6A, 0x867B, 0xAD6B, 0x867A, 0xAD6C, 0x884D, 0xAD6D, 0x886B, 0xAD6E, 0x8981, 0xAD6F, 0x89D4, 0xAD70, 0x8A08, 0xAD71, 0x8A02, + 0xAD72, 0x8A03, 0xAD73, 0x8C9E, 0xAD74, 0x8CA0, 0xAD75, 0x8D74, 0xAD76, 0x8D73, 0xAD77, 0x8DB4, 0xAD78, 0x8ECD, 0xAD79, 0x8ECC, + 0xAD7A, 0x8FF0, 0xAD7B, 0x8FE6, 0xAD7C, 0x8FE2, 0xAD7D, 0x8FEA, 0xAD7E, 0x8FE5, 0xADA1, 0x8FED, 0xADA2, 0x8FEB, 0xADA3, 0x8FE4, + 0xADA4, 0x8FE8, 0xADA5, 0x90CA, 0xADA6, 0x90CE, 0xADA7, 0x90C1, 0xADA8, 0x90C3, 0xADA9, 0x914B, 0xADAA, 0x914A, 0xADAB, 0x91CD, + 0xADAC, 0x9582, 0xADAD, 0x9650, 0xADAE, 0x964B, 0xADAF, 0x964C, 0xADB0, 0x964D, 0xADB1, 0x9762, 0xADB2, 0x9769, 0xADB3, 0x97CB, + 0xADB4, 0x97ED, 0xADB5, 0x97F3, 0xADB6, 0x9801, 0xADB7, 0x98A8, 0xADB8, 0x98DB, 0xADB9, 0x98DF, 0xADBA, 0x9996, 0xADBB, 0x9999, + 0xADBC, 0x4E58, 0xADBD, 0x4EB3, 0xADBE, 0x500C, 0xADBF, 0x500D, 0xADC0, 0x5023, 0xADC1, 0x4FEF, 0xADC2, 0x5026, 0xADC3, 0x5025, + 0xADC4, 0x4FF8, 0xADC5, 0x5029, 0xADC6, 0x5016, 0xADC7, 0x5006, 0xADC8, 0x503C, 0xADC9, 0x501F, 0xADCA, 0x501A, 0xADCB, 0x5012, + 0xADCC, 0x5011, 0xADCD, 0x4FFA, 0xADCE, 0x5000, 0xADCF, 0x5014, 0xADD0, 0x5028, 0xADD1, 0x4FF1, 0xADD2, 0x5021, 0xADD3, 0x500B, + 0xADD4, 0x5019, 0xADD5, 0x5018, 0xADD6, 0x4FF3, 0xADD7, 0x4FEE, 0xADD8, 0x502D, 0xADD9, 0x502A, 0xADDA, 0x4FFE, 0xADDB, 0x502B, + 0xADDC, 0x5009, 0xADDD, 0x517C, 0xADDE, 0x51A4, 0xADDF, 0x51A5, 0xADE0, 0x51A2, 0xADE1, 0x51CD, 0xADE2, 0x51CC, 0xADE3, 0x51C6, + 0xADE4, 0x51CB, 0xADE5, 0x5256, 0xADE6, 0x525C, 0xADE7, 0x5254, 0xADE8, 0x525B, 0xADE9, 0x525D, 0xADEA, 0x532A, 0xADEB, 0x537F, + 0xADEC, 0x539F, 0xADED, 0x539D, 0xADEE, 0x53DF, 0xADEF, 0x54E8, 0xADF0, 0x5510, 0xADF1, 0x5501, 0xADF2, 0x5537, 0xADF3, 0x54FC, + 0xADF4, 0x54E5, 0xADF5, 0x54F2, 0xADF6, 0x5506, 0xADF7, 0x54FA, 0xADF8, 0x5514, 0xADF9, 0x54E9, 0xADFA, 0x54ED, 0xADFB, 0x54E1, + 0xADFC, 0x5509, 0xADFD, 0x54EE, 0xADFE, 0x54EA, 0xAE40, 0x54E6, 0xAE41, 0x5527, 0xAE42, 0x5507, 0xAE43, 0x54FD, 0xAE44, 0x550F, + 0xAE45, 0x5703, 0xAE46, 0x5704, 0xAE47, 0x57C2, 0xAE48, 0x57D4, 0xAE49, 0x57CB, 0xAE4A, 0x57C3, 0xAE4B, 0x5809, 0xAE4C, 0x590F, + 0xAE4D, 0x5957, 0xAE4E, 0x5958, 0xAE4F, 0x595A, 0xAE50, 0x5A11, 0xAE51, 0x5A18, 0xAE52, 0x5A1C, 0xAE53, 0x5A1F, 0xAE54, 0x5A1B, + 0xAE55, 0x5A13, 0xAE56, 0x59EC, 0xAE57, 0x5A20, 0xAE58, 0x5A23, 0xAE59, 0x5A29, 0xAE5A, 0x5A25, 0xAE5B, 0x5A0C, 0xAE5C, 0x5A09, + 0xAE5D, 0x5B6B, 0xAE5E, 0x5C58, 0xAE5F, 0x5BB0, 0xAE60, 0x5BB3, 0xAE61, 0x5BB6, 0xAE62, 0x5BB4, 0xAE63, 0x5BAE, 0xAE64, 0x5BB5, + 0xAE65, 0x5BB9, 0xAE66, 0x5BB8, 0xAE67, 0x5C04, 0xAE68, 0x5C51, 0xAE69, 0x5C55, 0xAE6A, 0x5C50, 0xAE6B, 0x5CED, 0xAE6C, 0x5CFD, + 0xAE6D, 0x5CFB, 0xAE6E, 0x5CEA, 0xAE6F, 0x5CE8, 0xAE70, 0x5CF0, 0xAE71, 0x5CF6, 0xAE72, 0x5D01, 0xAE73, 0x5CF4, 0xAE74, 0x5DEE, + 0xAE75, 0x5E2D, 0xAE76, 0x5E2B, 0xAE77, 0x5EAB, 0xAE78, 0x5EAD, 0xAE79, 0x5EA7, 0xAE7A, 0x5F31, 0xAE7B, 0x5F92, 0xAE7C, 0x5F91, + 0xAE7D, 0x5F90, 0xAE7E, 0x6059, 0xAEA1, 0x6063, 0xAEA2, 0x6065, 0xAEA3, 0x6050, 0xAEA4, 0x6055, 0xAEA5, 0x606D, 0xAEA6, 0x6069, + 0xAEA7, 0x606F, 0xAEA8, 0x6084, 0xAEA9, 0x609F, 0xAEAA, 0x609A, 0xAEAB, 0x608D, 0xAEAC, 0x6094, 0xAEAD, 0x608C, 0xAEAE, 0x6085, + 0xAEAF, 0x6096, 0xAEB0, 0x6247, 0xAEB1, 0x62F3, 0xAEB2, 0x6308, 0xAEB3, 0x62FF, 0xAEB4, 0x634E, 0xAEB5, 0x633E, 0xAEB6, 0x632F, + 0xAEB7, 0x6355, 0xAEB8, 0x6342, 0xAEB9, 0x6346, 0xAEBA, 0x634F, 0xAEBB, 0x6349, 0xAEBC, 0x633A, 0xAEBD, 0x6350, 0xAEBE, 0x633D, + 0xAEBF, 0x632A, 0xAEC0, 0x632B, 0xAEC1, 0x6328, 0xAEC2, 0x634D, 0xAEC3, 0x634C, 0xAEC4, 0x6548, 0xAEC5, 0x6549, 0xAEC6, 0x6599, + 0xAEC7, 0x65C1, 0xAEC8, 0x65C5, 0xAEC9, 0x6642, 0xAECA, 0x6649, 0xAECB, 0x664F, 0xAECC, 0x6643, 0xAECD, 0x6652, 0xAECE, 0x664C, + 0xAECF, 0x6645, 0xAED0, 0x6641, 0xAED1, 0x66F8, 0xAED2, 0x6714, 0xAED3, 0x6715, 0xAED4, 0x6717, 0xAED5, 0x6821, 0xAED6, 0x6838, + 0xAED7, 0x6848, 0xAED8, 0x6846, 0xAED9, 0x6853, 0xAEDA, 0x6839, 0xAEDB, 0x6842, 0xAEDC, 0x6854, 0xAEDD, 0x6829, 0xAEDE, 0x68B3, + 0xAEDF, 0x6817, 0xAEE0, 0x684C, 0xAEE1, 0x6851, 0xAEE2, 0x683D, 0xAEE3, 0x67F4, 0xAEE4, 0x6850, 0xAEE5, 0x6840, 0xAEE6, 0x683C, + 0xAEE7, 0x6843, 0xAEE8, 0x682A, 0xAEE9, 0x6845, 0xAEEA, 0x6813, 0xAEEB, 0x6818, 0xAEEC, 0x6841, 0xAEED, 0x6B8A, 0xAEEE, 0x6B89, + 0xAEEF, 0x6BB7, 0xAEF0, 0x6C23, 0xAEF1, 0x6C27, 0xAEF2, 0x6C28, 0xAEF3, 0x6C26, 0xAEF4, 0x6C24, 0xAEF5, 0x6CF0, 0xAEF6, 0x6D6A, + 0xAEF7, 0x6D95, 0xAEF8, 0x6D88, 0xAEF9, 0x6D87, 0xAEFA, 0x6D66, 0xAEFB, 0x6D78, 0xAEFC, 0x6D77, 0xAEFD, 0x6D59, 0xAEFE, 0x6D93, + 0xAF40, 0x6D6C, 0xAF41, 0x6D89, 0xAF42, 0x6D6E, 0xAF43, 0x6D5A, 0xAF44, 0x6D74, 0xAF45, 0x6D69, 0xAF46, 0x6D8C, 0xAF47, 0x6D8A, + 0xAF48, 0x6D79, 0xAF49, 0x6D85, 0xAF4A, 0x6D65, 0xAF4B, 0x6D94, 0xAF4C, 0x70CA, 0xAF4D, 0x70D8, 0xAF4E, 0x70E4, 0xAF4F, 0x70D9, + 0xAF50, 0x70C8, 0xAF51, 0x70CF, 0xAF52, 0x7239, 0xAF53, 0x7279, 0xAF54, 0x72FC, 0xAF55, 0x72F9, 0xAF56, 0x72FD, 0xAF57, 0x72F8, + 0xAF58, 0x72F7, 0xAF59, 0x7386, 0xAF5A, 0x73ED, 0xAF5B, 0x7409, 0xAF5C, 0x73EE, 0xAF5D, 0x73E0, 0xAF5E, 0x73EA, 0xAF5F, 0x73DE, + 0xAF60, 0x7554, 0xAF61, 0x755D, 0xAF62, 0x755C, 0xAF63, 0x755A, 0xAF64, 0x7559, 0xAF65, 0x75BE, 0xAF66, 0x75C5, 0xAF67, 0x75C7, + 0xAF68, 0x75B2, 0xAF69, 0x75B3, 0xAF6A, 0x75BD, 0xAF6B, 0x75BC, 0xAF6C, 0x75B9, 0xAF6D, 0x75C2, 0xAF6E, 0x75B8, 0xAF6F, 0x768B, + 0xAF70, 0x76B0, 0xAF71, 0x76CA, 0xAF72, 0x76CD, 0xAF73, 0x76CE, 0xAF74, 0x7729, 0xAF75, 0x771F, 0xAF76, 0x7720, 0xAF77, 0x7728, + 0xAF78, 0x77E9, 0xAF79, 0x7830, 0xAF7A, 0x7827, 0xAF7B, 0x7838, 0xAF7C, 0x781D, 0xAF7D, 0x7834, 0xAF7E, 0x7837, 0xAFA1, 0x7825, + 0xAFA2, 0x782D, 0xAFA3, 0x7820, 0xAFA4, 0x781F, 0xAFA5, 0x7832, 0xAFA6, 0x7955, 0xAFA7, 0x7950, 0xAFA8, 0x7960, 0xAFA9, 0x795F, + 0xAFAA, 0x7956, 0xAFAB, 0x795E, 0xAFAC, 0x795D, 0xAFAD, 0x7957, 0xAFAE, 0x795A, 0xAFAF, 0x79E4, 0xAFB0, 0x79E3, 0xAFB1, 0x79E7, + 0xAFB2, 0x79DF, 0xAFB3, 0x79E6, 0xAFB4, 0x79E9, 0xAFB5, 0x79D8, 0xAFB6, 0x7A84, 0xAFB7, 0x7A88, 0xAFB8, 0x7AD9, 0xAFB9, 0x7B06, + 0xAFBA, 0x7B11, 0xAFBB, 0x7C89, 0xAFBC, 0x7D21, 0xAFBD, 0x7D17, 0xAFBE, 0x7D0B, 0xAFBF, 0x7D0A, 0xAFC0, 0x7D20, 0xAFC1, 0x7D22, + 0xAFC2, 0x7D14, 0xAFC3, 0x7D10, 0xAFC4, 0x7D15, 0xAFC5, 0x7D1A, 0xAFC6, 0x7D1C, 0xAFC7, 0x7D0D, 0xAFC8, 0x7D19, 0xAFC9, 0x7D1B, + 0xAFCA, 0x7F3A, 0xAFCB, 0x7F5F, 0xAFCC, 0x7F94, 0xAFCD, 0x7FC5, 0xAFCE, 0x7FC1, 0xAFCF, 0x8006, 0xAFD0, 0x8018, 0xAFD1, 0x8015, + 0xAFD2, 0x8019, 0xAFD3, 0x8017, 0xAFD4, 0x803D, 0xAFD5, 0x803F, 0xAFD6, 0x80F1, 0xAFD7, 0x8102, 0xAFD8, 0x80F0, 0xAFD9, 0x8105, + 0xAFDA, 0x80ED, 0xAFDB, 0x80F4, 0xAFDC, 0x8106, 0xAFDD, 0x80F8, 0xAFDE, 0x80F3, 0xAFDF, 0x8108, 0xAFE0, 0x80FD, 0xAFE1, 0x810A, + 0xAFE2, 0x80FC, 0xAFE3, 0x80EF, 0xAFE4, 0x81ED, 0xAFE5, 0x81EC, 0xAFE6, 0x8200, 0xAFE7, 0x8210, 0xAFE8, 0x822A, 0xAFE9, 0x822B, + 0xAFEA, 0x8228, 0xAFEB, 0x822C, 0xAFEC, 0x82BB, 0xAFED, 0x832B, 0xAFEE, 0x8352, 0xAFEF, 0x8354, 0xAFF0, 0x834A, 0xAFF1, 0x8338, + 0xAFF2, 0x8350, 0xAFF3, 0x8349, 0xAFF4, 0x8335, 0xAFF5, 0x8334, 0xAFF6, 0x834F, 0xAFF7, 0x8332, 0xAFF8, 0x8339, 0xAFF9, 0x8336, + 0xAFFA, 0x8317, 0xAFFB, 0x8340, 0xAFFC, 0x8331, 0xAFFD, 0x8328, 0xAFFE, 0x8343, 0xB040, 0x8654, 0xB041, 0x868A, 0xB042, 0x86AA, + 0xB043, 0x8693, 0xB044, 0x86A4, 0xB045, 0x86A9, 0xB046, 0x868C, 0xB047, 0x86A3, 0xB048, 0x869C, 0xB049, 0x8870, 0xB04A, 0x8877, + 0xB04B, 0x8881, 0xB04C, 0x8882, 0xB04D, 0x887D, 0xB04E, 0x8879, 0xB04F, 0x8A18, 0xB050, 0x8A10, 0xB051, 0x8A0E, 0xB052, 0x8A0C, + 0xB053, 0x8A15, 0xB054, 0x8A0A, 0xB055, 0x8A17, 0xB056, 0x8A13, 0xB057, 0x8A16, 0xB058, 0x8A0F, 0xB059, 0x8A11, 0xB05A, 0x8C48, + 0xB05B, 0x8C7A, 0xB05C, 0x8C79, 0xB05D, 0x8CA1, 0xB05E, 0x8CA2, 0xB05F, 0x8D77, 0xB060, 0x8EAC, 0xB061, 0x8ED2, 0xB062, 0x8ED4, + 0xB063, 0x8ECF, 0xB064, 0x8FB1, 0xB065, 0x9001, 0xB066, 0x9006, 0xB067, 0x8FF7, 0xB068, 0x9000, 0xB069, 0x8FFA, 0xB06A, 0x8FF4, + 0xB06B, 0x9003, 0xB06C, 0x8FFD, 0xB06D, 0x9005, 0xB06E, 0x8FF8, 0xB06F, 0x9095, 0xB070, 0x90E1, 0xB071, 0x90DD, 0xB072, 0x90E2, + 0xB073, 0x9152, 0xB074, 0x914D, 0xB075, 0x914C, 0xB076, 0x91D8, 0xB077, 0x91DD, 0xB078, 0x91D7, 0xB079, 0x91DC, 0xB07A, 0x91D9, + 0xB07B, 0x9583, 0xB07C, 0x9662, 0xB07D, 0x9663, 0xB07E, 0x9661, 0xB0A1, 0x965B, 0xB0A2, 0x965D, 0xB0A3, 0x9664, 0xB0A4, 0x9658, + 0xB0A5, 0x965E, 0xB0A6, 0x96BB, 0xB0A7, 0x98E2, 0xB0A8, 0x99AC, 0xB0A9, 0x9AA8, 0xB0AA, 0x9AD8, 0xB0AB, 0x9B25, 0xB0AC, 0x9B32, + 0xB0AD, 0x9B3C, 0xB0AE, 0x4E7E, 0xB0AF, 0x507A, 0xB0B0, 0x507D, 0xB0B1, 0x505C, 0xB0B2, 0x5047, 0xB0B3, 0x5043, 0xB0B4, 0x504C, + 0xB0B5, 0x505A, 0xB0B6, 0x5049, 0xB0B7, 0x5065, 0xB0B8, 0x5076, 0xB0B9, 0x504E, 0xB0BA, 0x5055, 0xB0BB, 0x5075, 0xB0BC, 0x5074, + 0xB0BD, 0x5077, 0xB0BE, 0x504F, 0xB0BF, 0x500F, 0xB0C0, 0x506F, 0xB0C1, 0x506D, 0xB0C2, 0x515C, 0xB0C3, 0x5195, 0xB0C4, 0x51F0, + 0xB0C5, 0x526A, 0xB0C6, 0x526F, 0xB0C7, 0x52D2, 0xB0C8, 0x52D9, 0xB0C9, 0x52D8, 0xB0CA, 0x52D5, 0xB0CB, 0x5310, 0xB0CC, 0x530F, + 0xB0CD, 0x5319, 0xB0CE, 0x533F, 0xB0CF, 0x5340, 0xB0D0, 0x533E, 0xB0D1, 0x53C3, 0xB0D2, 0x66FC, 0xB0D3, 0x5546, 0xB0D4, 0x556A, + 0xB0D5, 0x5566, 0xB0D6, 0x5544, 0xB0D7, 0x555E, 0xB0D8, 0x5561, 0xB0D9, 0x5543, 0xB0DA, 0x554A, 0xB0DB, 0x5531, 0xB0DC, 0x5556, + 0xB0DD, 0x554F, 0xB0DE, 0x5555, 0xB0DF, 0x552F, 0xB0E0, 0x5564, 0xB0E1, 0x5538, 0xB0E2, 0x552E, 0xB0E3, 0x555C, 0xB0E4, 0x552C, + 0xB0E5, 0x5563, 0xB0E6, 0x5533, 0xB0E7, 0x5541, 0xB0E8, 0x5557, 0xB0E9, 0x5708, 0xB0EA, 0x570B, 0xB0EB, 0x5709, 0xB0EC, 0x57DF, + 0xB0ED, 0x5805, 0xB0EE, 0x580A, 0xB0EF, 0x5806, 0xB0F0, 0x57E0, 0xB0F1, 0x57E4, 0xB0F2, 0x57FA, 0xB0F3, 0x5802, 0xB0F4, 0x5835, + 0xB0F5, 0x57F7, 0xB0F6, 0x57F9, 0xB0F7, 0x5920, 0xB0F8, 0x5962, 0xB0F9, 0x5A36, 0xB0FA, 0x5A41, 0xB0FB, 0x5A49, 0xB0FC, 0x5A66, + 0xB0FD, 0x5A6A, 0xB0FE, 0x5A40, 0xB140, 0x5A3C, 0xB141, 0x5A62, 0xB142, 0x5A5A, 0xB143, 0x5A46, 0xB144, 0x5A4A, 0xB145, 0x5B70, + 0xB146, 0x5BC7, 0xB147, 0x5BC5, 0xB148, 0x5BC4, 0xB149, 0x5BC2, 0xB14A, 0x5BBF, 0xB14B, 0x5BC6, 0xB14C, 0x5C09, 0xB14D, 0x5C08, + 0xB14E, 0x5C07, 0xB14F, 0x5C60, 0xB150, 0x5C5C, 0xB151, 0x5C5D, 0xB152, 0x5D07, 0xB153, 0x5D06, 0xB154, 0x5D0E, 0xB155, 0x5D1B, + 0xB156, 0x5D16, 0xB157, 0x5D22, 0xB158, 0x5D11, 0xB159, 0x5D29, 0xB15A, 0x5D14, 0xB15B, 0x5D19, 0xB15C, 0x5D24, 0xB15D, 0x5D27, + 0xB15E, 0x5D17, 0xB15F, 0x5DE2, 0xB160, 0x5E38, 0xB161, 0x5E36, 0xB162, 0x5E33, 0xB163, 0x5E37, 0xB164, 0x5EB7, 0xB165, 0x5EB8, + 0xB166, 0x5EB6, 0xB167, 0x5EB5, 0xB168, 0x5EBE, 0xB169, 0x5F35, 0xB16A, 0x5F37, 0xB16B, 0x5F57, 0xB16C, 0x5F6C, 0xB16D, 0x5F69, + 0xB16E, 0x5F6B, 0xB16F, 0x5F97, 0xB170, 0x5F99, 0xB171, 0x5F9E, 0xB172, 0x5F98, 0xB173, 0x5FA1, 0xB174, 0x5FA0, 0xB175, 0x5F9C, + 0xB176, 0x607F, 0xB177, 0x60A3, 0xB178, 0x6089, 0xB179, 0x60A0, 0xB17A, 0x60A8, 0xB17B, 0x60CB, 0xB17C, 0x60B4, 0xB17D, 0x60E6, + 0xB17E, 0x60BD, 0xB1A1, 0x60C5, 0xB1A2, 0x60BB, 0xB1A3, 0x60B5, 0xB1A4, 0x60DC, 0xB1A5, 0x60BC, 0xB1A6, 0x60D8, 0xB1A7, 0x60D5, + 0xB1A8, 0x60C6, 0xB1A9, 0x60DF, 0xB1AA, 0x60B8, 0xB1AB, 0x60DA, 0xB1AC, 0x60C7, 0xB1AD, 0x621A, 0xB1AE, 0x621B, 0xB1AF, 0x6248, + 0xB1B0, 0x63A0, 0xB1B1, 0x63A7, 0xB1B2, 0x6372, 0xB1B3, 0x6396, 0xB1B4, 0x63A2, 0xB1B5, 0x63A5, 0xB1B6, 0x6377, 0xB1B7, 0x6367, + 0xB1B8, 0x6398, 0xB1B9, 0x63AA, 0xB1BA, 0x6371, 0xB1BB, 0x63A9, 0xB1BC, 0x6389, 0xB1BD, 0x6383, 0xB1BE, 0x639B, 0xB1BF, 0x636B, + 0xB1C0, 0x63A8, 0xB1C1, 0x6384, 0xB1C2, 0x6388, 0xB1C3, 0x6399, 0xB1C4, 0x63A1, 0xB1C5, 0x63AC, 0xB1C6, 0x6392, 0xB1C7, 0x638F, + 0xB1C8, 0x6380, 0xB1C9, 0x637B, 0xB1CA, 0x6369, 0xB1CB, 0x6368, 0xB1CC, 0x637A, 0xB1CD, 0x655D, 0xB1CE, 0x6556, 0xB1CF, 0x6551, + 0xB1D0, 0x6559, 0xB1D1, 0x6557, 0xB1D2, 0x555F, 0xB1D3, 0x654F, 0xB1D4, 0x6558, 0xB1D5, 0x6555, 0xB1D6, 0x6554, 0xB1D7, 0x659C, + 0xB1D8, 0x659B, 0xB1D9, 0x65AC, 0xB1DA, 0x65CF, 0xB1DB, 0x65CB, 0xB1DC, 0x65CC, 0xB1DD, 0x65CE, 0xB1DE, 0x665D, 0xB1DF, 0x665A, + 0xB1E0, 0x6664, 0xB1E1, 0x6668, 0xB1E2, 0x6666, 0xB1E3, 0x665E, 0xB1E4, 0x66F9, 0xB1E5, 0x52D7, 0xB1E6, 0x671B, 0xB1E7, 0x6881, + 0xB1E8, 0x68AF, 0xB1E9, 0x68A2, 0xB1EA, 0x6893, 0xB1EB, 0x68B5, 0xB1EC, 0x687F, 0xB1ED, 0x6876, 0xB1EE, 0x68B1, 0xB1EF, 0x68A7, + 0xB1F0, 0x6897, 0xB1F1, 0x68B0, 0xB1F2, 0x6883, 0xB1F3, 0x68C4, 0xB1F4, 0x68AD, 0xB1F5, 0x6886, 0xB1F6, 0x6885, 0xB1F7, 0x6894, + 0xB1F8, 0x689D, 0xB1F9, 0x68A8, 0xB1FA, 0x689F, 0xB1FB, 0x68A1, 0xB1FC, 0x6882, 0xB1FD, 0x6B32, 0xB1FE, 0x6BBA, 0xB240, 0x6BEB, + 0xB241, 0x6BEC, 0xB242, 0x6C2B, 0xB243, 0x6D8E, 0xB244, 0x6DBC, 0xB245, 0x6DF3, 0xB246, 0x6DD9, 0xB247, 0x6DB2, 0xB248, 0x6DE1, + 0xB249, 0x6DCC, 0xB24A, 0x6DE4, 0xB24B, 0x6DFB, 0xB24C, 0x6DFA, 0xB24D, 0x6E05, 0xB24E, 0x6DC7, 0xB24F, 0x6DCB, 0xB250, 0x6DAF, + 0xB251, 0x6DD1, 0xB252, 0x6DAE, 0xB253, 0x6DDE, 0xB254, 0x6DF9, 0xB255, 0x6DB8, 0xB256, 0x6DF7, 0xB257, 0x6DF5, 0xB258, 0x6DC5, + 0xB259, 0x6DD2, 0xB25A, 0x6E1A, 0xB25B, 0x6DB5, 0xB25C, 0x6DDA, 0xB25D, 0x6DEB, 0xB25E, 0x6DD8, 0xB25F, 0x6DEA, 0xB260, 0x6DF1, + 0xB261, 0x6DEE, 0xB262, 0x6DE8, 0xB263, 0x6DC6, 0xB264, 0x6DC4, 0xB265, 0x6DAA, 0xB266, 0x6DEC, 0xB267, 0x6DBF, 0xB268, 0x6DE6, + 0xB269, 0x70F9, 0xB26A, 0x7109, 0xB26B, 0x710A, 0xB26C, 0x70FD, 0xB26D, 0x70EF, 0xB26E, 0x723D, 0xB26F, 0x727D, 0xB270, 0x7281, + 0xB271, 0x731C, 0xB272, 0x731B, 0xB273, 0x7316, 0xB274, 0x7313, 0xB275, 0x7319, 0xB276, 0x7387, 0xB277, 0x7405, 0xB278, 0x740A, + 0xB279, 0x7403, 0xB27A, 0x7406, 0xB27B, 0x73FE, 0xB27C, 0x740D, 0xB27D, 0x74E0, 0xB27E, 0x74F6, 0xB2A1, 0x74F7, 0xB2A2, 0x751C, + 0xB2A3, 0x7522, 0xB2A4, 0x7565, 0xB2A5, 0x7566, 0xB2A6, 0x7562, 0xB2A7, 0x7570, 0xB2A8, 0x758F, 0xB2A9, 0x75D4, 0xB2AA, 0x75D5, + 0xB2AB, 0x75B5, 0xB2AC, 0x75CA, 0xB2AD, 0x75CD, 0xB2AE, 0x768E, 0xB2AF, 0x76D4, 0xB2B0, 0x76D2, 0xB2B1, 0x76DB, 0xB2B2, 0x7737, + 0xB2B3, 0x773E, 0xB2B4, 0x773C, 0xB2B5, 0x7736, 0xB2B6, 0x7738, 0xB2B7, 0x773A, 0xB2B8, 0x786B, 0xB2B9, 0x7843, 0xB2BA, 0x784E, + 0xB2BB, 0x7965, 0xB2BC, 0x7968, 0xB2BD, 0x796D, 0xB2BE, 0x79FB, 0xB2BF, 0x7A92, 0xB2C0, 0x7A95, 0xB2C1, 0x7B20, 0xB2C2, 0x7B28, + 0xB2C3, 0x7B1B, 0xB2C4, 0x7B2C, 0xB2C5, 0x7B26, 0xB2C6, 0x7B19, 0xB2C7, 0x7B1E, 0xB2C8, 0x7B2E, 0xB2C9, 0x7C92, 0xB2CA, 0x7C97, + 0xB2CB, 0x7C95, 0xB2CC, 0x7D46, 0xB2CD, 0x7D43, 0xB2CE, 0x7D71, 0xB2CF, 0x7D2E, 0xB2D0, 0x7D39, 0xB2D1, 0x7D3C, 0xB2D2, 0x7D40, + 0xB2D3, 0x7D30, 0xB2D4, 0x7D33, 0xB2D5, 0x7D44, 0xB2D6, 0x7D2F, 0xB2D7, 0x7D42, 0xB2D8, 0x7D32, 0xB2D9, 0x7D31, 0xB2DA, 0x7F3D, + 0xB2DB, 0x7F9E, 0xB2DC, 0x7F9A, 0xB2DD, 0x7FCC, 0xB2DE, 0x7FCE, 0xB2DF, 0x7FD2, 0xB2E0, 0x801C, 0xB2E1, 0x804A, 0xB2E2, 0x8046, + 0xB2E3, 0x812F, 0xB2E4, 0x8116, 0xB2E5, 0x8123, 0xB2E6, 0x812B, 0xB2E7, 0x8129, 0xB2E8, 0x8130, 0xB2E9, 0x8124, 0xB2EA, 0x8202, + 0xB2EB, 0x8235, 0xB2EC, 0x8237, 0xB2ED, 0x8236, 0xB2EE, 0x8239, 0xB2EF, 0x838E, 0xB2F0, 0x839E, 0xB2F1, 0x8398, 0xB2F2, 0x8378, + 0xB2F3, 0x83A2, 0xB2F4, 0x8396, 0xB2F5, 0x83BD, 0xB2F6, 0x83AB, 0xB2F7, 0x8392, 0xB2F8, 0x838A, 0xB2F9, 0x8393, 0xB2FA, 0x8389, + 0xB2FB, 0x83A0, 0xB2FC, 0x8377, 0xB2FD, 0x837B, 0xB2FE, 0x837C, 0xB340, 0x8386, 0xB341, 0x83A7, 0xB342, 0x8655, 0xB343, 0x5F6A, + 0xB344, 0x86C7, 0xB345, 0x86C0, 0xB346, 0x86B6, 0xB347, 0x86C4, 0xB348, 0x86B5, 0xB349, 0x86C6, 0xB34A, 0x86CB, 0xB34B, 0x86B1, + 0xB34C, 0x86AF, 0xB34D, 0x86C9, 0xB34E, 0x8853, 0xB34F, 0x889E, 0xB350, 0x8888, 0xB351, 0x88AB, 0xB352, 0x8892, 0xB353, 0x8896, + 0xB354, 0x888D, 0xB355, 0x888B, 0xB356, 0x8993, 0xB357, 0x898F, 0xB358, 0x8A2A, 0xB359, 0x8A1D, 0xB35A, 0x8A23, 0xB35B, 0x8A25, + 0xB35C, 0x8A31, 0xB35D, 0x8A2D, 0xB35E, 0x8A1F, 0xB35F, 0x8A1B, 0xB360, 0x8A22, 0xB361, 0x8C49, 0xB362, 0x8C5A, 0xB363, 0x8CA9, + 0xB364, 0x8CAC, 0xB365, 0x8CAB, 0xB366, 0x8CA8, 0xB367, 0x8CAA, 0xB368, 0x8CA7, 0xB369, 0x8D67, 0xB36A, 0x8D66, 0xB36B, 0x8DBE, + 0xB36C, 0x8DBA, 0xB36D, 0x8EDB, 0xB36E, 0x8EDF, 0xB36F, 0x9019, 0xB370, 0x900D, 0xB371, 0x901A, 0xB372, 0x9017, 0xB373, 0x9023, + 0xB374, 0x901F, 0xB375, 0x901D, 0xB376, 0x9010, 0xB377, 0x9015, 0xB378, 0x901E, 0xB379, 0x9020, 0xB37A, 0x900F, 0xB37B, 0x9022, + 0xB37C, 0x9016, 0xB37D, 0x901B, 0xB37E, 0x9014, 0xB3A1, 0x90E8, 0xB3A2, 0x90ED, 0xB3A3, 0x90FD, 0xB3A4, 0x9157, 0xB3A5, 0x91CE, + 0xB3A6, 0x91F5, 0xB3A7, 0x91E6, 0xB3A8, 0x91E3, 0xB3A9, 0x91E7, 0xB3AA, 0x91ED, 0xB3AB, 0x91E9, 0xB3AC, 0x9589, 0xB3AD, 0x966A, + 0xB3AE, 0x9675, 0xB3AF, 0x9673, 0xB3B0, 0x9678, 0xB3B1, 0x9670, 0xB3B2, 0x9674, 0xB3B3, 0x9676, 0xB3B4, 0x9677, 0xB3B5, 0x966C, + 0xB3B6, 0x96C0, 0xB3B7, 0x96EA, 0xB3B8, 0x96E9, 0xB3B9, 0x7AE0, 0xB3BA, 0x7ADF, 0xB3BB, 0x9802, 0xB3BC, 0x9803, 0xB3BD, 0x9B5A, + 0xB3BE, 0x9CE5, 0xB3BF, 0x9E75, 0xB3C0, 0x9E7F, 0xB3C1, 0x9EA5, 0xB3C2, 0x9EBB, 0xB3C3, 0x50A2, 0xB3C4, 0x508D, 0xB3C5, 0x5085, + 0xB3C6, 0x5099, 0xB3C7, 0x5091, 0xB3C8, 0x5080, 0xB3C9, 0x5096, 0xB3CA, 0x5098, 0xB3CB, 0x509A, 0xB3CC, 0x6700, 0xB3CD, 0x51F1, + 0xB3CE, 0x5272, 0xB3CF, 0x5274, 0xB3D0, 0x5275, 0xB3D1, 0x5269, 0xB3D2, 0x52DE, 0xB3D3, 0x52DD, 0xB3D4, 0x52DB, 0xB3D5, 0x535A, + 0xB3D6, 0x53A5, 0xB3D7, 0x557B, 0xB3D8, 0x5580, 0xB3D9, 0x55A7, 0xB3DA, 0x557C, 0xB3DB, 0x558A, 0xB3DC, 0x559D, 0xB3DD, 0x5598, + 0xB3DE, 0x5582, 0xB3DF, 0x559C, 0xB3E0, 0x55AA, 0xB3E1, 0x5594, 0xB3E2, 0x5587, 0xB3E3, 0x558B, 0xB3E4, 0x5583, 0xB3E5, 0x55B3, + 0xB3E6, 0x55AE, 0xB3E7, 0x559F, 0xB3E8, 0x553E, 0xB3E9, 0x55B2, 0xB3EA, 0x559A, 0xB3EB, 0x55BB, 0xB3EC, 0x55AC, 0xB3ED, 0x55B1, + 0xB3EE, 0x557E, 0xB3EF, 0x5589, 0xB3F0, 0x55AB, 0xB3F1, 0x5599, 0xB3F2, 0x570D, 0xB3F3, 0x582F, 0xB3F4, 0x582A, 0xB3F5, 0x5834, + 0xB3F6, 0x5824, 0xB3F7, 0x5830, 0xB3F8, 0x5831, 0xB3F9, 0x5821, 0xB3FA, 0x581D, 0xB3FB, 0x5820, 0xB3FC, 0x58F9, 0xB3FD, 0x58FA, + 0xB3FE, 0x5960, 0xB440, 0x5A77, 0xB441, 0x5A9A, 0xB442, 0x5A7F, 0xB443, 0x5A92, 0xB444, 0x5A9B, 0xB445, 0x5AA7, 0xB446, 0x5B73, + 0xB447, 0x5B71, 0xB448, 0x5BD2, 0xB449, 0x5BCC, 0xB44A, 0x5BD3, 0xB44B, 0x5BD0, 0xB44C, 0x5C0A, 0xB44D, 0x5C0B, 0xB44E, 0x5C31, + 0xB44F, 0x5D4C, 0xB450, 0x5D50, 0xB451, 0x5D34, 0xB452, 0x5D47, 0xB453, 0x5DFD, 0xB454, 0x5E45, 0xB455, 0x5E3D, 0xB456, 0x5E40, + 0xB457, 0x5E43, 0xB458, 0x5E7E, 0xB459, 0x5ECA, 0xB45A, 0x5EC1, 0xB45B, 0x5EC2, 0xB45C, 0x5EC4, 0xB45D, 0x5F3C, 0xB45E, 0x5F6D, + 0xB45F, 0x5FA9, 0xB460, 0x5FAA, 0xB461, 0x5FA8, 0xB462, 0x60D1, 0xB463, 0x60E1, 0xB464, 0x60B2, 0xB465, 0x60B6, 0xB466, 0x60E0, + 0xB467, 0x611C, 0xB468, 0x6123, 0xB469, 0x60FA, 0xB46A, 0x6115, 0xB46B, 0x60F0, 0xB46C, 0x60FB, 0xB46D, 0x60F4, 0xB46E, 0x6168, + 0xB46F, 0x60F1, 0xB470, 0x610E, 0xB471, 0x60F6, 0xB472, 0x6109, 0xB473, 0x6100, 0xB474, 0x6112, 0xB475, 0x621F, 0xB476, 0x6249, + 0xB477, 0x63A3, 0xB478, 0x638C, 0xB479, 0x63CF, 0xB47A, 0x63C0, 0xB47B, 0x63E9, 0xB47C, 0x63C9, 0xB47D, 0x63C6, 0xB47E, 0x63CD, + 0xB4A1, 0x63D2, 0xB4A2, 0x63E3, 0xB4A3, 0x63D0, 0xB4A4, 0x63E1, 0xB4A5, 0x63D6, 0xB4A6, 0x63ED, 0xB4A7, 0x63EE, 0xB4A8, 0x6376, + 0xB4A9, 0x63F4, 0xB4AA, 0x63EA, 0xB4AB, 0x63DB, 0xB4AC, 0x6452, 0xB4AD, 0x63DA, 0xB4AE, 0x63F9, 0xB4AF, 0x655E, 0xB4B0, 0x6566, + 0xB4B1, 0x6562, 0xB4B2, 0x6563, 0xB4B3, 0x6591, 0xB4B4, 0x6590, 0xB4B5, 0x65AF, 0xB4B6, 0x666E, 0xB4B7, 0x6670, 0xB4B8, 0x6674, + 0xB4B9, 0x6676, 0xB4BA, 0x666F, 0xB4BB, 0x6691, 0xB4BC, 0x667A, 0xB4BD, 0x667E, 0xB4BE, 0x6677, 0xB4BF, 0x66FE, 0xB4C0, 0x66FF, + 0xB4C1, 0x671F, 0xB4C2, 0x671D, 0xB4C3, 0x68FA, 0xB4C4, 0x68D5, 0xB4C5, 0x68E0, 0xB4C6, 0x68D8, 0xB4C7, 0x68D7, 0xB4C8, 0x6905, + 0xB4C9, 0x68DF, 0xB4CA, 0x68F5, 0xB4CB, 0x68EE, 0xB4CC, 0x68E7, 0xB4CD, 0x68F9, 0xB4CE, 0x68D2, 0xB4CF, 0x68F2, 0xB4D0, 0x68E3, + 0xB4D1, 0x68CB, 0xB4D2, 0x68CD, 0xB4D3, 0x690D, 0xB4D4, 0x6912, 0xB4D5, 0x690E, 0xB4D6, 0x68C9, 0xB4D7, 0x68DA, 0xB4D8, 0x696E, + 0xB4D9, 0x68FB, 0xB4DA, 0x6B3E, 0xB4DB, 0x6B3A, 0xB4DC, 0x6B3D, 0xB4DD, 0x6B98, 0xB4DE, 0x6B96, 0xB4DF, 0x6BBC, 0xB4E0, 0x6BEF, + 0xB4E1, 0x6C2E, 0xB4E2, 0x6C2F, 0xB4E3, 0x6C2C, 0xB4E4, 0x6E2F, 0xB4E5, 0x6E38, 0xB4E6, 0x6E54, 0xB4E7, 0x6E21, 0xB4E8, 0x6E32, + 0xB4E9, 0x6E67, 0xB4EA, 0x6E4A, 0xB4EB, 0x6E20, 0xB4EC, 0x6E25, 0xB4ED, 0x6E23, 0xB4EE, 0x6E1B, 0xB4EF, 0x6E5B, 0xB4F0, 0x6E58, + 0xB4F1, 0x6E24, 0xB4F2, 0x6E56, 0xB4F3, 0x6E6E, 0xB4F4, 0x6E2D, 0xB4F5, 0x6E26, 0xB4F6, 0x6E6F, 0xB4F7, 0x6E34, 0xB4F8, 0x6E4D, + 0xB4F9, 0x6E3A, 0xB4FA, 0x6E2C, 0xB4FB, 0x6E43, 0xB4FC, 0x6E1D, 0xB4FD, 0x6E3E, 0xB4FE, 0x6ECB, 0xB540, 0x6E89, 0xB541, 0x6E19, + 0xB542, 0x6E4E, 0xB543, 0x6E63, 0xB544, 0x6E44, 0xB545, 0x6E72, 0xB546, 0x6E69, 0xB547, 0x6E5F, 0xB548, 0x7119, 0xB549, 0x711A, + 0xB54A, 0x7126, 0xB54B, 0x7130, 0xB54C, 0x7121, 0xB54D, 0x7136, 0xB54E, 0x716E, 0xB54F, 0x711C, 0xB550, 0x724C, 0xB551, 0x7284, + 0xB552, 0x7280, 0xB553, 0x7336, 0xB554, 0x7325, 0xB555, 0x7334, 0xB556, 0x7329, 0xB557, 0x743A, 0xB558, 0x742A, 0xB559, 0x7433, + 0xB55A, 0x7422, 0xB55B, 0x7425, 0xB55C, 0x7435, 0xB55D, 0x7436, 0xB55E, 0x7434, 0xB55F, 0x742F, 0xB560, 0x741B, 0xB561, 0x7426, + 0xB562, 0x7428, 0xB563, 0x7525, 0xB564, 0x7526, 0xB565, 0x756B, 0xB566, 0x756A, 0xB567, 0x75E2, 0xB568, 0x75DB, 0xB569, 0x75E3, + 0xB56A, 0x75D9, 0xB56B, 0x75D8, 0xB56C, 0x75DE, 0xB56D, 0x75E0, 0xB56E, 0x767B, 0xB56F, 0x767C, 0xB570, 0x7696, 0xB571, 0x7693, + 0xB572, 0x76B4, 0xB573, 0x76DC, 0xB574, 0x774F, 0xB575, 0x77ED, 0xB576, 0x785D, 0xB577, 0x786C, 0xB578, 0x786F, 0xB579, 0x7A0D, + 0xB57A, 0x7A08, 0xB57B, 0x7A0B, 0xB57C, 0x7A05, 0xB57D, 0x7A00, 0xB57E, 0x7A98, 0xB5A1, 0x7A97, 0xB5A2, 0x7A96, 0xB5A3, 0x7AE5, + 0xB5A4, 0x7AE3, 0xB5A5, 0x7B49, 0xB5A6, 0x7B56, 0xB5A7, 0x7B46, 0xB5A8, 0x7B50, 0xB5A9, 0x7B52, 0xB5AA, 0x7B54, 0xB5AB, 0x7B4D, + 0xB5AC, 0x7B4B, 0xB5AD, 0x7B4F, 0xB5AE, 0x7B51, 0xB5AF, 0x7C9F, 0xB5B0, 0x7CA5, 0xB5B1, 0x7D5E, 0xB5B2, 0x7D50, 0xB5B3, 0x7D68, + 0xB5B4, 0x7D55, 0xB5B5, 0x7D2B, 0xB5B6, 0x7D6E, 0xB5B7, 0x7D72, 0xB5B8, 0x7D61, 0xB5B9, 0x7D66, 0xB5BA, 0x7D62, 0xB5BB, 0x7D70, + 0xB5BC, 0x7D73, 0xB5BD, 0x5584, 0xB5BE, 0x7FD4, 0xB5BF, 0x7FD5, 0xB5C0, 0x800B, 0xB5C1, 0x8052, 0xB5C2, 0x8085, 0xB5C3, 0x8155, + 0xB5C4, 0x8154, 0xB5C5, 0x814B, 0xB5C6, 0x8151, 0xB5C7, 0x814E, 0xB5C8, 0x8139, 0xB5C9, 0x8146, 0xB5CA, 0x813E, 0xB5CB, 0x814C, + 0xB5CC, 0x8153, 0xB5CD, 0x8174, 0xB5CE, 0x8212, 0xB5CF, 0x821C, 0xB5D0, 0x83E9, 0xB5D1, 0x8403, 0xB5D2, 0x83F8, 0xB5D3, 0x840D, + 0xB5D4, 0x83E0, 0xB5D5, 0x83C5, 0xB5D6, 0x840B, 0xB5D7, 0x83C1, 0xB5D8, 0x83EF, 0xB5D9, 0x83F1, 0xB5DA, 0x83F4, 0xB5DB, 0x8457, + 0xB5DC, 0x840A, 0xB5DD, 0x83F0, 0xB5DE, 0x840C, 0xB5DF, 0x83CC, 0xB5E0, 0x83FD, 0xB5E1, 0x83F2, 0xB5E2, 0x83CA, 0xB5E3, 0x8438, + 0xB5E4, 0x840E, 0xB5E5, 0x8404, 0xB5E6, 0x83DC, 0xB5E7, 0x8407, 0xB5E8, 0x83D4, 0xB5E9, 0x83DF, 0xB5EA, 0x865B, 0xB5EB, 0x86DF, + 0xB5EC, 0x86D9, 0xB5ED, 0x86ED, 0xB5EE, 0x86D4, 0xB5EF, 0x86DB, 0xB5F0, 0x86E4, 0xB5F1, 0x86D0, 0xB5F2, 0x86DE, 0xB5F3, 0x8857, + 0xB5F4, 0x88C1, 0xB5F5, 0x88C2, 0xB5F6, 0x88B1, 0xB5F7, 0x8983, 0xB5F8, 0x8996, 0xB5F9, 0x8A3B, 0xB5FA, 0x8A60, 0xB5FB, 0x8A55, + 0xB5FC, 0x8A5E, 0xB5FD, 0x8A3C, 0xB5FE, 0x8A41, 0xB640, 0x8A54, 0xB641, 0x8A5B, 0xB642, 0x8A50, 0xB643, 0x8A46, 0xB644, 0x8A34, + 0xB645, 0x8A3A, 0xB646, 0x8A36, 0xB647, 0x8A56, 0xB648, 0x8C61, 0xB649, 0x8C82, 0xB64A, 0x8CAF, 0xB64B, 0x8CBC, 0xB64C, 0x8CB3, + 0xB64D, 0x8CBD, 0xB64E, 0x8CC1, 0xB64F, 0x8CBB, 0xB650, 0x8CC0, 0xB651, 0x8CB4, 0xB652, 0x8CB7, 0xB653, 0x8CB6, 0xB654, 0x8CBF, + 0xB655, 0x8CB8, 0xB656, 0x8D8A, 0xB657, 0x8D85, 0xB658, 0x8D81, 0xB659, 0x8DCE, 0xB65A, 0x8DDD, 0xB65B, 0x8DCB, 0xB65C, 0x8DDA, + 0xB65D, 0x8DD1, 0xB65E, 0x8DCC, 0xB65F, 0x8DDB, 0xB660, 0x8DC6, 0xB661, 0x8EFB, 0xB662, 0x8EF8, 0xB663, 0x8EFC, 0xB664, 0x8F9C, + 0xB665, 0x902E, 0xB666, 0x9035, 0xB667, 0x9031, 0xB668, 0x9038, 0xB669, 0x9032, 0xB66A, 0x9036, 0xB66B, 0x9102, 0xB66C, 0x90F5, + 0xB66D, 0x9109, 0xB66E, 0x90FE, 0xB66F, 0x9163, 0xB670, 0x9165, 0xB671, 0x91CF, 0xB672, 0x9214, 0xB673, 0x9215, 0xB674, 0x9223, + 0xB675, 0x9209, 0xB676, 0x921E, 0xB677, 0x920D, 0xB678, 0x9210, 0xB679, 0x9207, 0xB67A, 0x9211, 0xB67B, 0x9594, 0xB67C, 0x958F, + 0xB67D, 0x958B, 0xB67E, 0x9591, 0xB6A1, 0x9593, 0xB6A2, 0x9592, 0xB6A3, 0x958E, 0xB6A4, 0x968A, 0xB6A5, 0x968E, 0xB6A6, 0x968B, + 0xB6A7, 0x967D, 0xB6A8, 0x9685, 0xB6A9, 0x9686, 0xB6AA, 0x968D, 0xB6AB, 0x9672, 0xB6AC, 0x9684, 0xB6AD, 0x96C1, 0xB6AE, 0x96C5, + 0xB6AF, 0x96C4, 0xB6B0, 0x96C6, 0xB6B1, 0x96C7, 0xB6B2, 0x96EF, 0xB6B3, 0x96F2, 0xB6B4, 0x97CC, 0xB6B5, 0x9805, 0xB6B6, 0x9806, + 0xB6B7, 0x9808, 0xB6B8, 0x98E7, 0xB6B9, 0x98EA, 0xB6BA, 0x98EF, 0xB6BB, 0x98E9, 0xB6BC, 0x98F2, 0xB6BD, 0x98ED, 0xB6BE, 0x99AE, + 0xB6BF, 0x99AD, 0xB6C0, 0x9EC3, 0xB6C1, 0x9ECD, 0xB6C2, 0x9ED1, 0xB6C3, 0x4E82, 0xB6C4, 0x50AD, 0xB6C5, 0x50B5, 0xB6C6, 0x50B2, + 0xB6C7, 0x50B3, 0xB6C8, 0x50C5, 0xB6C9, 0x50BE, 0xB6CA, 0x50AC, 0xB6CB, 0x50B7, 0xB6CC, 0x50BB, 0xB6CD, 0x50AF, 0xB6CE, 0x50C7, + 0xB6CF, 0x527F, 0xB6D0, 0x5277, 0xB6D1, 0x527D, 0xB6D2, 0x52DF, 0xB6D3, 0x52E6, 0xB6D4, 0x52E4, 0xB6D5, 0x52E2, 0xB6D6, 0x52E3, + 0xB6D7, 0x532F, 0xB6D8, 0x55DF, 0xB6D9, 0x55E8, 0xB6DA, 0x55D3, 0xB6DB, 0x55E6, 0xB6DC, 0x55CE, 0xB6DD, 0x55DC, 0xB6DE, 0x55C7, + 0xB6DF, 0x55D1, 0xB6E0, 0x55E3, 0xB6E1, 0x55E4, 0xB6E2, 0x55EF, 0xB6E3, 0x55DA, 0xB6E4, 0x55E1, 0xB6E5, 0x55C5, 0xB6E6, 0x55C6, + 0xB6E7, 0x55E5, 0xB6E8, 0x55C9, 0xB6E9, 0x5712, 0xB6EA, 0x5713, 0xB6EB, 0x585E, 0xB6EC, 0x5851, 0xB6ED, 0x5858, 0xB6EE, 0x5857, + 0xB6EF, 0x585A, 0xB6F0, 0x5854, 0xB6F1, 0x586B, 0xB6F2, 0x584C, 0xB6F3, 0x586D, 0xB6F4, 0x584A, 0xB6F5, 0x5862, 0xB6F6, 0x5852, + 0xB6F7, 0x584B, 0xB6F8, 0x5967, 0xB6F9, 0x5AC1, 0xB6FA, 0x5AC9, 0xB6FB, 0x5ACC, 0xB6FC, 0x5ABE, 0xB6FD, 0x5ABD, 0xB6FE, 0x5ABC, + 0xB740, 0x5AB3, 0xB741, 0x5AC2, 0xB742, 0x5AB2, 0xB743, 0x5D69, 0xB744, 0x5D6F, 0xB745, 0x5E4C, 0xB746, 0x5E79, 0xB747, 0x5EC9, + 0xB748, 0x5EC8, 0xB749, 0x5F12, 0xB74A, 0x5F59, 0xB74B, 0x5FAC, 0xB74C, 0x5FAE, 0xB74D, 0x611A, 0xB74E, 0x610F, 0xB74F, 0x6148, + 0xB750, 0x611F, 0xB751, 0x60F3, 0xB752, 0x611B, 0xB753, 0x60F9, 0xB754, 0x6101, 0xB755, 0x6108, 0xB756, 0x614E, 0xB757, 0x614C, + 0xB758, 0x6144, 0xB759, 0x614D, 0xB75A, 0x613E, 0xB75B, 0x6134, 0xB75C, 0x6127, 0xB75D, 0x610D, 0xB75E, 0x6106, 0xB75F, 0x6137, + 0xB760, 0x6221, 0xB761, 0x6222, 0xB762, 0x6413, 0xB763, 0x643E, 0xB764, 0x641E, 0xB765, 0x642A, 0xB766, 0x642D, 0xB767, 0x643D, + 0xB768, 0x642C, 0xB769, 0x640F, 0xB76A, 0x641C, 0xB76B, 0x6414, 0xB76C, 0x640D, 0xB76D, 0x6436, 0xB76E, 0x6416, 0xB76F, 0x6417, + 0xB770, 0x6406, 0xB771, 0x656C, 0xB772, 0x659F, 0xB773, 0x65B0, 0xB774, 0x6697, 0xB775, 0x6689, 0xB776, 0x6687, 0xB777, 0x6688, + 0xB778, 0x6696, 0xB779, 0x6684, 0xB77A, 0x6698, 0xB77B, 0x668D, 0xB77C, 0x6703, 0xB77D, 0x6994, 0xB77E, 0x696D, 0xB7A1, 0x695A, + 0xB7A2, 0x6977, 0xB7A3, 0x6960, 0xB7A4, 0x6954, 0xB7A5, 0x6975, 0xB7A6, 0x6930, 0xB7A7, 0x6982, 0xB7A8, 0x694A, 0xB7A9, 0x6968, + 0xB7AA, 0x696B, 0xB7AB, 0x695E, 0xB7AC, 0x6953, 0xB7AD, 0x6979, 0xB7AE, 0x6986, 0xB7AF, 0x695D, 0xB7B0, 0x6963, 0xB7B1, 0x695B, + 0xB7B2, 0x6B47, 0xB7B3, 0x6B72, 0xB7B4, 0x6BC0, 0xB7B5, 0x6BBF, 0xB7B6, 0x6BD3, 0xB7B7, 0x6BFD, 0xB7B8, 0x6EA2, 0xB7B9, 0x6EAF, + 0xB7BA, 0x6ED3, 0xB7BB, 0x6EB6, 0xB7BC, 0x6EC2, 0xB7BD, 0x6E90, 0xB7BE, 0x6E9D, 0xB7BF, 0x6EC7, 0xB7C0, 0x6EC5, 0xB7C1, 0x6EA5, + 0xB7C2, 0x6E98, 0xB7C3, 0x6EBC, 0xB7C4, 0x6EBA, 0xB7C5, 0x6EAB, 0xB7C6, 0x6ED1, 0xB7C7, 0x6E96, 0xB7C8, 0x6E9C, 0xB7C9, 0x6EC4, + 0xB7CA, 0x6ED4, 0xB7CB, 0x6EAA, 0xB7CC, 0x6EA7, 0xB7CD, 0x6EB4, 0xB7CE, 0x714E, 0xB7CF, 0x7159, 0xB7D0, 0x7169, 0xB7D1, 0x7164, + 0xB7D2, 0x7149, 0xB7D3, 0x7167, 0xB7D4, 0x715C, 0xB7D5, 0x716C, 0xB7D6, 0x7166, 0xB7D7, 0x714C, 0xB7D8, 0x7165, 0xB7D9, 0x715E, + 0xB7DA, 0x7146, 0xB7DB, 0x7168, 0xB7DC, 0x7156, 0xB7DD, 0x723A, 0xB7DE, 0x7252, 0xB7DF, 0x7337, 0xB7E0, 0x7345, 0xB7E1, 0x733F, + 0xB7E2, 0x733E, 0xB7E3, 0x746F, 0xB7E4, 0x745A, 0xB7E5, 0x7455, 0xB7E6, 0x745F, 0xB7E7, 0x745E, 0xB7E8, 0x7441, 0xB7E9, 0x743F, + 0xB7EA, 0x7459, 0xB7EB, 0x745B, 0xB7EC, 0x745C, 0xB7ED, 0x7576, 0xB7EE, 0x7578, 0xB7EF, 0x7600, 0xB7F0, 0x75F0, 0xB7F1, 0x7601, + 0xB7F2, 0x75F2, 0xB7F3, 0x75F1, 0xB7F4, 0x75FA, 0xB7F5, 0x75FF, 0xB7F6, 0x75F4, 0xB7F7, 0x75F3, 0xB7F8, 0x76DE, 0xB7F9, 0x76DF, + 0xB7FA, 0x775B, 0xB7FB, 0x776B, 0xB7FC, 0x7766, 0xB7FD, 0x775E, 0xB7FE, 0x7763, 0xB840, 0x7779, 0xB841, 0x776A, 0xB842, 0x776C, + 0xB843, 0x775C, 0xB844, 0x7765, 0xB845, 0x7768, 0xB846, 0x7762, 0xB847, 0x77EE, 0xB848, 0x788E, 0xB849, 0x78B0, 0xB84A, 0x7897, + 0xB84B, 0x7898, 0xB84C, 0x788C, 0xB84D, 0x7889, 0xB84E, 0x787C, 0xB84F, 0x7891, 0xB850, 0x7893, 0xB851, 0x787F, 0xB852, 0x797A, + 0xB853, 0x797F, 0xB854, 0x7981, 0xB855, 0x842C, 0xB856, 0x79BD, 0xB857, 0x7A1C, 0xB858, 0x7A1A, 0xB859, 0x7A20, 0xB85A, 0x7A14, + 0xB85B, 0x7A1F, 0xB85C, 0x7A1E, 0xB85D, 0x7A9F, 0xB85E, 0x7AA0, 0xB85F, 0x7B77, 0xB860, 0x7BC0, 0xB861, 0x7B60, 0xB862, 0x7B6E, + 0xB863, 0x7B67, 0xB864, 0x7CB1, 0xB865, 0x7CB3, 0xB866, 0x7CB5, 0xB867, 0x7D93, 0xB868, 0x7D79, 0xB869, 0x7D91, 0xB86A, 0x7D81, + 0xB86B, 0x7D8F, 0xB86C, 0x7D5B, 0xB86D, 0x7F6E, 0xB86E, 0x7F69, 0xB86F, 0x7F6A, 0xB870, 0x7F72, 0xB871, 0x7FA9, 0xB872, 0x7FA8, + 0xB873, 0x7FA4, 0xB874, 0x8056, 0xB875, 0x8058, 0xB876, 0x8086, 0xB877, 0x8084, 0xB878, 0x8171, 0xB879, 0x8170, 0xB87A, 0x8178, + 0xB87B, 0x8165, 0xB87C, 0x816E, 0xB87D, 0x8173, 0xB87E, 0x816B, 0xB8A1, 0x8179, 0xB8A2, 0x817A, 0xB8A3, 0x8166, 0xB8A4, 0x8205, + 0xB8A5, 0x8247, 0xB8A6, 0x8482, 0xB8A7, 0x8477, 0xB8A8, 0x843D, 0xB8A9, 0x8431, 0xB8AA, 0x8475, 0xB8AB, 0x8466, 0xB8AC, 0x846B, + 0xB8AD, 0x8449, 0xB8AE, 0x846C, 0xB8AF, 0x845B, 0xB8B0, 0x843C, 0xB8B1, 0x8435, 0xB8B2, 0x8461, 0xB8B3, 0x8463, 0xB8B4, 0x8469, + 0xB8B5, 0x846D, 0xB8B6, 0x8446, 0xB8B7, 0x865E, 0xB8B8, 0x865C, 0xB8B9, 0x865F, 0xB8BA, 0x86F9, 0xB8BB, 0x8713, 0xB8BC, 0x8708, + 0xB8BD, 0x8707, 0xB8BE, 0x8700, 0xB8BF, 0x86FE, 0xB8C0, 0x86FB, 0xB8C1, 0x8702, 0xB8C2, 0x8703, 0xB8C3, 0x8706, 0xB8C4, 0x870A, + 0xB8C5, 0x8859, 0xB8C6, 0x88DF, 0xB8C7, 0x88D4, 0xB8C8, 0x88D9, 0xB8C9, 0x88DC, 0xB8CA, 0x88D8, 0xB8CB, 0x88DD, 0xB8CC, 0x88E1, + 0xB8CD, 0x88CA, 0xB8CE, 0x88D5, 0xB8CF, 0x88D2, 0xB8D0, 0x899C, 0xB8D1, 0x89E3, 0xB8D2, 0x8A6B, 0xB8D3, 0x8A72, 0xB8D4, 0x8A73, + 0xB8D5, 0x8A66, 0xB8D6, 0x8A69, 0xB8D7, 0x8A70, 0xB8D8, 0x8A87, 0xB8D9, 0x8A7C, 0xB8DA, 0x8A63, 0xB8DB, 0x8AA0, 0xB8DC, 0x8A71, + 0xB8DD, 0x8A85, 0xB8DE, 0x8A6D, 0xB8DF, 0x8A62, 0xB8E0, 0x8A6E, 0xB8E1, 0x8A6C, 0xB8E2, 0x8A79, 0xB8E3, 0x8A7B, 0xB8E4, 0x8A3E, + 0xB8E5, 0x8A68, 0xB8E6, 0x8C62, 0xB8E7, 0x8C8A, 0xB8E8, 0x8C89, 0xB8E9, 0x8CCA, 0xB8EA, 0x8CC7, 0xB8EB, 0x8CC8, 0xB8EC, 0x8CC4, + 0xB8ED, 0x8CB2, 0xB8EE, 0x8CC3, 0xB8EF, 0x8CC2, 0xB8F0, 0x8CC5, 0xB8F1, 0x8DE1, 0xB8F2, 0x8DDF, 0xB8F3, 0x8DE8, 0xB8F4, 0x8DEF, + 0xB8F5, 0x8DF3, 0xB8F6, 0x8DFA, 0xB8F7, 0x8DEA, 0xB8F8, 0x8DE4, 0xB8F9, 0x8DE6, 0xB8FA, 0x8EB2, 0xB8FB, 0x8F03, 0xB8FC, 0x8F09, + 0xB8FD, 0x8EFE, 0xB8FE, 0x8F0A, 0xB940, 0x8F9F, 0xB941, 0x8FB2, 0xB942, 0x904B, 0xB943, 0x904A, 0xB944, 0x9053, 0xB945, 0x9042, + 0xB946, 0x9054, 0xB947, 0x903C, 0xB948, 0x9055, 0xB949, 0x9050, 0xB94A, 0x9047, 0xB94B, 0x904F, 0xB94C, 0x904E, 0xB94D, 0x904D, + 0xB94E, 0x9051, 0xB94F, 0x903E, 0xB950, 0x9041, 0xB951, 0x9112, 0xB952, 0x9117, 0xB953, 0x916C, 0xB954, 0x916A, 0xB955, 0x9169, + 0xB956, 0x91C9, 0xB957, 0x9237, 0xB958, 0x9257, 0xB959, 0x9238, 0xB95A, 0x923D, 0xB95B, 0x9240, 0xB95C, 0x923E, 0xB95D, 0x925B, + 0xB95E, 0x924B, 0xB95F, 0x9264, 0xB960, 0x9251, 0xB961, 0x9234, 0xB962, 0x9249, 0xB963, 0x924D, 0xB964, 0x9245, 0xB965, 0x9239, + 0xB966, 0x923F, 0xB967, 0x925A, 0xB968, 0x9598, 0xB969, 0x9698, 0xB96A, 0x9694, 0xB96B, 0x9695, 0xB96C, 0x96CD, 0xB96D, 0x96CB, + 0xB96E, 0x96C9, 0xB96F, 0x96CA, 0xB970, 0x96F7, 0xB971, 0x96FB, 0xB972, 0x96F9, 0xB973, 0x96F6, 0xB974, 0x9756, 0xB975, 0x9774, + 0xB976, 0x9776, 0xB977, 0x9810, 0xB978, 0x9811, 0xB979, 0x9813, 0xB97A, 0x980A, 0xB97B, 0x9812, 0xB97C, 0x980C, 0xB97D, 0x98FC, + 0xB97E, 0x98F4, 0xB9A1, 0x98FD, 0xB9A2, 0x98FE, 0xB9A3, 0x99B3, 0xB9A4, 0x99B1, 0xB9A5, 0x99B4, 0xB9A6, 0x9AE1, 0xB9A7, 0x9CE9, + 0xB9A8, 0x9E82, 0xB9A9, 0x9F0E, 0xB9AA, 0x9F13, 0xB9AB, 0x9F20, 0xB9AC, 0x50E7, 0xB9AD, 0x50EE, 0xB9AE, 0x50E5, 0xB9AF, 0x50D6, + 0xB9B0, 0x50ED, 0xB9B1, 0x50DA, 0xB9B2, 0x50D5, 0xB9B3, 0x50CF, 0xB9B4, 0x50D1, 0xB9B5, 0x50F1, 0xB9B6, 0x50CE, 0xB9B7, 0x50E9, + 0xB9B8, 0x5162, 0xB9B9, 0x51F3, 0xB9BA, 0x5283, 0xB9BB, 0x5282, 0xB9BC, 0x5331, 0xB9BD, 0x53AD, 0xB9BE, 0x55FE, 0xB9BF, 0x5600, + 0xB9C0, 0x561B, 0xB9C1, 0x5617, 0xB9C2, 0x55FD, 0xB9C3, 0x5614, 0xB9C4, 0x5606, 0xB9C5, 0x5609, 0xB9C6, 0x560D, 0xB9C7, 0x560E, + 0xB9C8, 0x55F7, 0xB9C9, 0x5616, 0xB9CA, 0x561F, 0xB9CB, 0x5608, 0xB9CC, 0x5610, 0xB9CD, 0x55F6, 0xB9CE, 0x5718, 0xB9CF, 0x5716, + 0xB9D0, 0x5875, 0xB9D1, 0x587E, 0xB9D2, 0x5883, 0xB9D3, 0x5893, 0xB9D4, 0x588A, 0xB9D5, 0x5879, 0xB9D6, 0x5885, 0xB9D7, 0x587D, + 0xB9D8, 0x58FD, 0xB9D9, 0x5925, 0xB9DA, 0x5922, 0xB9DB, 0x5924, 0xB9DC, 0x596A, 0xB9DD, 0x5969, 0xB9DE, 0x5AE1, 0xB9DF, 0x5AE6, + 0xB9E0, 0x5AE9, 0xB9E1, 0x5AD7, 0xB9E2, 0x5AD6, 0xB9E3, 0x5AD8, 0xB9E4, 0x5AE3, 0xB9E5, 0x5B75, 0xB9E6, 0x5BDE, 0xB9E7, 0x5BE7, + 0xB9E8, 0x5BE1, 0xB9E9, 0x5BE5, 0xB9EA, 0x5BE6, 0xB9EB, 0x5BE8, 0xB9EC, 0x5BE2, 0xB9ED, 0x5BE4, 0xB9EE, 0x5BDF, 0xB9EF, 0x5C0D, + 0xB9F0, 0x5C62, 0xB9F1, 0x5D84, 0xB9F2, 0x5D87, 0xB9F3, 0x5E5B, 0xB9F4, 0x5E63, 0xB9F5, 0x5E55, 0xB9F6, 0x5E57, 0xB9F7, 0x5E54, + 0xB9F8, 0x5ED3, 0xB9F9, 0x5ED6, 0xB9FA, 0x5F0A, 0xB9FB, 0x5F46, 0xB9FC, 0x5F70, 0xB9FD, 0x5FB9, 0xB9FE, 0x6147, 0xBA40, 0x613F, + 0xBA41, 0x614B, 0xBA42, 0x6177, 0xBA43, 0x6162, 0xBA44, 0x6163, 0xBA45, 0x615F, 0xBA46, 0x615A, 0xBA47, 0x6158, 0xBA48, 0x6175, + 0xBA49, 0x622A, 0xBA4A, 0x6487, 0xBA4B, 0x6458, 0xBA4C, 0x6454, 0xBA4D, 0x64A4, 0xBA4E, 0x6478, 0xBA4F, 0x645F, 0xBA50, 0x647A, + 0xBA51, 0x6451, 0xBA52, 0x6467, 0xBA53, 0x6434, 0xBA54, 0x646D, 0xBA55, 0x647B, 0xBA56, 0x6572, 0xBA57, 0x65A1, 0xBA58, 0x65D7, + 0xBA59, 0x65D6, 0xBA5A, 0x66A2, 0xBA5B, 0x66A8, 0xBA5C, 0x669D, 0xBA5D, 0x699C, 0xBA5E, 0x69A8, 0xBA5F, 0x6995, 0xBA60, 0x69C1, + 0xBA61, 0x69AE, 0xBA62, 0x69D3, 0xBA63, 0x69CB, 0xBA64, 0x699B, 0xBA65, 0x69B7, 0xBA66, 0x69BB, 0xBA67, 0x69AB, 0xBA68, 0x69B4, + 0xBA69, 0x69D0, 0xBA6A, 0x69CD, 0xBA6B, 0x69AD, 0xBA6C, 0x69CC, 0xBA6D, 0x69A6, 0xBA6E, 0x69C3, 0xBA6F, 0x69A3, 0xBA70, 0x6B49, + 0xBA71, 0x6B4C, 0xBA72, 0x6C33, 0xBA73, 0x6F33, 0xBA74, 0x6F14, 0xBA75, 0x6EFE, 0xBA76, 0x6F13, 0xBA77, 0x6EF4, 0xBA78, 0x6F29, + 0xBA79, 0x6F3E, 0xBA7A, 0x6F20, 0xBA7B, 0x6F2C, 0xBA7C, 0x6F0F, 0xBA7D, 0x6F02, 0xBA7E, 0x6F22, 0xBAA1, 0x6EFF, 0xBAA2, 0x6EEF, + 0xBAA3, 0x6F06, 0xBAA4, 0x6F31, 0xBAA5, 0x6F38, 0xBAA6, 0x6F32, 0xBAA7, 0x6F23, 0xBAA8, 0x6F15, 0xBAA9, 0x6F2B, 0xBAAA, 0x6F2F, + 0xBAAB, 0x6F88, 0xBAAC, 0x6F2A, 0xBAAD, 0x6EEC, 0xBAAE, 0x6F01, 0xBAAF, 0x6EF2, 0xBAB0, 0x6ECC, 0xBAB1, 0x6EF7, 0xBAB2, 0x7194, + 0xBAB3, 0x7199, 0xBAB4, 0x717D, 0xBAB5, 0x718A, 0xBAB6, 0x7184, 0xBAB7, 0x7192, 0xBAB8, 0x723E, 0xBAB9, 0x7292, 0xBABA, 0x7296, + 0xBABB, 0x7344, 0xBABC, 0x7350, 0xBABD, 0x7464, 0xBABE, 0x7463, 0xBABF, 0x746A, 0xBAC0, 0x7470, 0xBAC1, 0x746D, 0xBAC2, 0x7504, + 0xBAC3, 0x7591, 0xBAC4, 0x7627, 0xBAC5, 0x760D, 0xBAC6, 0x760B, 0xBAC7, 0x7609, 0xBAC8, 0x7613, 0xBAC9, 0x76E1, 0xBACA, 0x76E3, + 0xBACB, 0x7784, 0xBACC, 0x777D, 0xBACD, 0x777F, 0xBACE, 0x7761, 0xBACF, 0x78C1, 0xBAD0, 0x789F, 0xBAD1, 0x78A7, 0xBAD2, 0x78B3, + 0xBAD3, 0x78A9, 0xBAD4, 0x78A3, 0xBAD5, 0x798E, 0xBAD6, 0x798F, 0xBAD7, 0x798D, 0xBAD8, 0x7A2E, 0xBAD9, 0x7A31, 0xBADA, 0x7AAA, + 0xBADB, 0x7AA9, 0xBADC, 0x7AED, 0xBADD, 0x7AEF, 0xBADE, 0x7BA1, 0xBADF, 0x7B95, 0xBAE0, 0x7B8B, 0xBAE1, 0x7B75, 0xBAE2, 0x7B97, + 0xBAE3, 0x7B9D, 0xBAE4, 0x7B94, 0xBAE5, 0x7B8F, 0xBAE6, 0x7BB8, 0xBAE7, 0x7B87, 0xBAE8, 0x7B84, 0xBAE9, 0x7CB9, 0xBAEA, 0x7CBD, + 0xBAEB, 0x7CBE, 0xBAEC, 0x7DBB, 0xBAED, 0x7DB0, 0xBAEE, 0x7D9C, 0xBAEF, 0x7DBD, 0xBAF0, 0x7DBE, 0xBAF1, 0x7DA0, 0xBAF2, 0x7DCA, + 0xBAF3, 0x7DB4, 0xBAF4, 0x7DB2, 0xBAF5, 0x7DB1, 0xBAF6, 0x7DBA, 0xBAF7, 0x7DA2, 0xBAF8, 0x7DBF, 0xBAF9, 0x7DB5, 0xBAFA, 0x7DB8, + 0xBAFB, 0x7DAD, 0xBAFC, 0x7DD2, 0xBAFD, 0x7DC7, 0xBAFE, 0x7DAC, 0xBB40, 0x7F70, 0xBB41, 0x7FE0, 0xBB42, 0x7FE1, 0xBB43, 0x7FDF, + 0xBB44, 0x805E, 0xBB45, 0x805A, 0xBB46, 0x8087, 0xBB47, 0x8150, 0xBB48, 0x8180, 0xBB49, 0x818F, 0xBB4A, 0x8188, 0xBB4B, 0x818A, + 0xBB4C, 0x817F, 0xBB4D, 0x8182, 0xBB4E, 0x81E7, 0xBB4F, 0x81FA, 0xBB50, 0x8207, 0xBB51, 0x8214, 0xBB52, 0x821E, 0xBB53, 0x824B, + 0xBB54, 0x84C9, 0xBB55, 0x84BF, 0xBB56, 0x84C6, 0xBB57, 0x84C4, 0xBB58, 0x8499, 0xBB59, 0x849E, 0xBB5A, 0x84B2, 0xBB5B, 0x849C, + 0xBB5C, 0x84CB, 0xBB5D, 0x84B8, 0xBB5E, 0x84C0, 0xBB5F, 0x84D3, 0xBB60, 0x8490, 0xBB61, 0x84BC, 0xBB62, 0x84D1, 0xBB63, 0x84CA, + 0xBB64, 0x873F, 0xBB65, 0x871C, 0xBB66, 0x873B, 0xBB67, 0x8722, 0xBB68, 0x8725, 0xBB69, 0x8734, 0xBB6A, 0x8718, 0xBB6B, 0x8755, + 0xBB6C, 0x8737, 0xBB6D, 0x8729, 0xBB6E, 0x88F3, 0xBB6F, 0x8902, 0xBB70, 0x88F4, 0xBB71, 0x88F9, 0xBB72, 0x88F8, 0xBB73, 0x88FD, + 0xBB74, 0x88E8, 0xBB75, 0x891A, 0xBB76, 0x88EF, 0xBB77, 0x8AA6, 0xBB78, 0x8A8C, 0xBB79, 0x8A9E, 0xBB7A, 0x8AA3, 0xBB7B, 0x8A8D, + 0xBB7C, 0x8AA1, 0xBB7D, 0x8A93, 0xBB7E, 0x8AA4, 0xBBA1, 0x8AAA, 0xBBA2, 0x8AA5, 0xBBA3, 0x8AA8, 0xBBA4, 0x8A98, 0xBBA5, 0x8A91, + 0xBBA6, 0x8A9A, 0xBBA7, 0x8AA7, 0xBBA8, 0x8C6A, 0xBBA9, 0x8C8D, 0xBBAA, 0x8C8C, 0xBBAB, 0x8CD3, 0xBBAC, 0x8CD1, 0xBBAD, 0x8CD2, + 0xBBAE, 0x8D6B, 0xBBAF, 0x8D99, 0xBBB0, 0x8D95, 0xBBB1, 0x8DFC, 0xBBB2, 0x8F14, 0xBBB3, 0x8F12, 0xBBB4, 0x8F15, 0xBBB5, 0x8F13, + 0xBBB6, 0x8FA3, 0xBBB7, 0x9060, 0xBBB8, 0x9058, 0xBBB9, 0x905C, 0xBBBA, 0x9063, 0xBBBB, 0x9059, 0xBBBC, 0x905E, 0xBBBD, 0x9062, + 0xBBBE, 0x905D, 0xBBBF, 0x905B, 0xBBC0, 0x9119, 0xBBC1, 0x9118, 0xBBC2, 0x911E, 0xBBC3, 0x9175, 0xBBC4, 0x9178, 0xBBC5, 0x9177, + 0xBBC6, 0x9174, 0xBBC7, 0x9278, 0xBBC8, 0x9280, 0xBBC9, 0x9285, 0xBBCA, 0x9298, 0xBBCB, 0x9296, 0xBBCC, 0x927B, 0xBBCD, 0x9293, + 0xBBCE, 0x929C, 0xBBCF, 0x92A8, 0xBBD0, 0x927C, 0xBBD1, 0x9291, 0xBBD2, 0x95A1, 0xBBD3, 0x95A8, 0xBBD4, 0x95A9, 0xBBD5, 0x95A3, + 0xBBD6, 0x95A5, 0xBBD7, 0x95A4, 0xBBD8, 0x9699, 0xBBD9, 0x969C, 0xBBDA, 0x969B, 0xBBDB, 0x96CC, 0xBBDC, 0x96D2, 0xBBDD, 0x9700, + 0xBBDE, 0x977C, 0xBBDF, 0x9785, 0xBBE0, 0x97F6, 0xBBE1, 0x9817, 0xBBE2, 0x9818, 0xBBE3, 0x98AF, 0xBBE4, 0x98B1, 0xBBE5, 0x9903, + 0xBBE6, 0x9905, 0xBBE7, 0x990C, 0xBBE8, 0x9909, 0xBBE9, 0x99C1, 0xBBEA, 0x9AAF, 0xBBEB, 0x9AB0, 0xBBEC, 0x9AE6, 0xBBED, 0x9B41, + 0xBBEE, 0x9B42, 0xBBEF, 0x9CF4, 0xBBF0, 0x9CF6, 0xBBF1, 0x9CF3, 0xBBF2, 0x9EBC, 0xBBF3, 0x9F3B, 0xBBF4, 0x9F4A, 0xBBF5, 0x5104, + 0xBBF6, 0x5100, 0xBBF7, 0x50FB, 0xBBF8, 0x50F5, 0xBBF9, 0x50F9, 0xBBFA, 0x5102, 0xBBFB, 0x5108, 0xBBFC, 0x5109, 0xBBFD, 0x5105, + 0xBBFE, 0x51DC, 0xBC40, 0x5287, 0xBC41, 0x5288, 0xBC42, 0x5289, 0xBC43, 0x528D, 0xBC44, 0x528A, 0xBC45, 0x52F0, 0xBC46, 0x53B2, + 0xBC47, 0x562E, 0xBC48, 0x563B, 0xBC49, 0x5639, 0xBC4A, 0x5632, 0xBC4B, 0x563F, 0xBC4C, 0x5634, 0xBC4D, 0x5629, 0xBC4E, 0x5653, + 0xBC4F, 0x564E, 0xBC50, 0x5657, 0xBC51, 0x5674, 0xBC52, 0x5636, 0xBC53, 0x562F, 0xBC54, 0x5630, 0xBC55, 0x5880, 0xBC56, 0x589F, + 0xBC57, 0x589E, 0xBC58, 0x58B3, 0xBC59, 0x589C, 0xBC5A, 0x58AE, 0xBC5B, 0x58A9, 0xBC5C, 0x58A6, 0xBC5D, 0x596D, 0xBC5E, 0x5B09, + 0xBC5F, 0x5AFB, 0xBC60, 0x5B0B, 0xBC61, 0x5AF5, 0xBC62, 0x5B0C, 0xBC63, 0x5B08, 0xBC64, 0x5BEE, 0xBC65, 0x5BEC, 0xBC66, 0x5BE9, + 0xBC67, 0x5BEB, 0xBC68, 0x5C64, 0xBC69, 0x5C65, 0xBC6A, 0x5D9D, 0xBC6B, 0x5D94, 0xBC6C, 0x5E62, 0xBC6D, 0x5E5F, 0xBC6E, 0x5E61, + 0xBC6F, 0x5EE2, 0xBC70, 0x5EDA, 0xBC71, 0x5EDF, 0xBC72, 0x5EDD, 0xBC73, 0x5EE3, 0xBC74, 0x5EE0, 0xBC75, 0x5F48, 0xBC76, 0x5F71, + 0xBC77, 0x5FB7, 0xBC78, 0x5FB5, 0xBC79, 0x6176, 0xBC7A, 0x6167, 0xBC7B, 0x616E, 0xBC7C, 0x615D, 0xBC7D, 0x6155, 0xBC7E, 0x6182, + 0xBCA1, 0x617C, 0xBCA2, 0x6170, 0xBCA3, 0x616B, 0xBCA4, 0x617E, 0xBCA5, 0x61A7, 0xBCA6, 0x6190, 0xBCA7, 0x61AB, 0xBCA8, 0x618E, + 0xBCA9, 0x61AC, 0xBCAA, 0x619A, 0xBCAB, 0x61A4, 0xBCAC, 0x6194, 0xBCAD, 0x61AE, 0xBCAE, 0x622E, 0xBCAF, 0x6469, 0xBCB0, 0x646F, + 0xBCB1, 0x6479, 0xBCB2, 0x649E, 0xBCB3, 0x64B2, 0xBCB4, 0x6488, 0xBCB5, 0x6490, 0xBCB6, 0x64B0, 0xBCB7, 0x64A5, 0xBCB8, 0x6493, + 0xBCB9, 0x6495, 0xBCBA, 0x64A9, 0xBCBB, 0x6492, 0xBCBC, 0x64AE, 0xBCBD, 0x64AD, 0xBCBE, 0x64AB, 0xBCBF, 0x649A, 0xBCC0, 0x64AC, + 0xBCC1, 0x6499, 0xBCC2, 0x64A2, 0xBCC3, 0x64B3, 0xBCC4, 0x6575, 0xBCC5, 0x6577, 0xBCC6, 0x6578, 0xBCC7, 0x66AE, 0xBCC8, 0x66AB, + 0xBCC9, 0x66B4, 0xBCCA, 0x66B1, 0xBCCB, 0x6A23, 0xBCCC, 0x6A1F, 0xBCCD, 0x69E8, 0xBCCE, 0x6A01, 0xBCCF, 0x6A1E, 0xBCD0, 0x6A19, + 0xBCD1, 0x69FD, 0xBCD2, 0x6A21, 0xBCD3, 0x6A13, 0xBCD4, 0x6A0A, 0xBCD5, 0x69F3, 0xBCD6, 0x6A02, 0xBCD7, 0x6A05, 0xBCD8, 0x69ED, + 0xBCD9, 0x6A11, 0xBCDA, 0x6B50, 0xBCDB, 0x6B4E, 0xBCDC, 0x6BA4, 0xBCDD, 0x6BC5, 0xBCDE, 0x6BC6, 0xBCDF, 0x6F3F, 0xBCE0, 0x6F7C, + 0xBCE1, 0x6F84, 0xBCE2, 0x6F51, 0xBCE3, 0x6F66, 0xBCE4, 0x6F54, 0xBCE5, 0x6F86, 0xBCE6, 0x6F6D, 0xBCE7, 0x6F5B, 0xBCE8, 0x6F78, + 0xBCE9, 0x6F6E, 0xBCEA, 0x6F8E, 0xBCEB, 0x6F7A, 0xBCEC, 0x6F70, 0xBCED, 0x6F64, 0xBCEE, 0x6F97, 0xBCEF, 0x6F58, 0xBCF0, 0x6ED5, + 0xBCF1, 0x6F6F, 0xBCF2, 0x6F60, 0xBCF3, 0x6F5F, 0xBCF4, 0x719F, 0xBCF5, 0x71AC, 0xBCF6, 0x71B1, 0xBCF7, 0x71A8, 0xBCF8, 0x7256, + 0xBCF9, 0x729B, 0xBCFA, 0x734E, 0xBCFB, 0x7357, 0xBCFC, 0x7469, 0xBCFD, 0x748B, 0xBCFE, 0x7483, 0xBD40, 0x747E, 0xBD41, 0x7480, + 0xBD42, 0x757F, 0xBD43, 0x7620, 0xBD44, 0x7629, 0xBD45, 0x761F, 0xBD46, 0x7624, 0xBD47, 0x7626, 0xBD48, 0x7621, 0xBD49, 0x7622, + 0xBD4A, 0x769A, 0xBD4B, 0x76BA, 0xBD4C, 0x76E4, 0xBD4D, 0x778E, 0xBD4E, 0x7787, 0xBD4F, 0x778C, 0xBD50, 0x7791, 0xBD51, 0x778B, + 0xBD52, 0x78CB, 0xBD53, 0x78C5, 0xBD54, 0x78BA, 0xBD55, 0x78CA, 0xBD56, 0x78BE, 0xBD57, 0x78D5, 0xBD58, 0x78BC, 0xBD59, 0x78D0, + 0xBD5A, 0x7A3F, 0xBD5B, 0x7A3C, 0xBD5C, 0x7A40, 0xBD5D, 0x7A3D, 0xBD5E, 0x7A37, 0xBD5F, 0x7A3B, 0xBD60, 0x7AAF, 0xBD61, 0x7AAE, + 0xBD62, 0x7BAD, 0xBD63, 0x7BB1, 0xBD64, 0x7BC4, 0xBD65, 0x7BB4, 0xBD66, 0x7BC6, 0xBD67, 0x7BC7, 0xBD68, 0x7BC1, 0xBD69, 0x7BA0, + 0xBD6A, 0x7BCC, 0xBD6B, 0x7CCA, 0xBD6C, 0x7DE0, 0xBD6D, 0x7DF4, 0xBD6E, 0x7DEF, 0xBD6F, 0x7DFB, 0xBD70, 0x7DD8, 0xBD71, 0x7DEC, + 0xBD72, 0x7DDD, 0xBD73, 0x7DE8, 0xBD74, 0x7DE3, 0xBD75, 0x7DDA, 0xBD76, 0x7DDE, 0xBD77, 0x7DE9, 0xBD78, 0x7D9E, 0xBD79, 0x7DD9, + 0xBD7A, 0x7DF2, 0xBD7B, 0x7DF9, 0xBD7C, 0x7F75, 0xBD7D, 0x7F77, 0xBD7E, 0x7FAF, 0xBDA1, 0x7FE9, 0xBDA2, 0x8026, 0xBDA3, 0x819B, + 0xBDA4, 0x819C, 0xBDA5, 0x819D, 0xBDA6, 0x81A0, 0xBDA7, 0x819A, 0xBDA8, 0x8198, 0xBDA9, 0x8517, 0xBDAA, 0x853D, 0xBDAB, 0x851A, + 0xBDAC, 0x84EE, 0xBDAD, 0x852C, 0xBDAE, 0x852D, 0xBDAF, 0x8513, 0xBDB0, 0x8511, 0xBDB1, 0x8523, 0xBDB2, 0x8521, 0xBDB3, 0x8514, + 0xBDB4, 0x84EC, 0xBDB5, 0x8525, 0xBDB6, 0x84FF, 0xBDB7, 0x8506, 0xBDB8, 0x8782, 0xBDB9, 0x8774, 0xBDBA, 0x8776, 0xBDBB, 0x8760, + 0xBDBC, 0x8766, 0xBDBD, 0x8778, 0xBDBE, 0x8768, 0xBDBF, 0x8759, 0xBDC0, 0x8757, 0xBDC1, 0x874C, 0xBDC2, 0x8753, 0xBDC3, 0x885B, + 0xBDC4, 0x885D, 0xBDC5, 0x8910, 0xBDC6, 0x8907, 0xBDC7, 0x8912, 0xBDC8, 0x8913, 0xBDC9, 0x8915, 0xBDCA, 0x890A, 0xBDCB, 0x8ABC, + 0xBDCC, 0x8AD2, 0xBDCD, 0x8AC7, 0xBDCE, 0x8AC4, 0xBDCF, 0x8A95, 0xBDD0, 0x8ACB, 0xBDD1, 0x8AF8, 0xBDD2, 0x8AB2, 0xBDD3, 0x8AC9, + 0xBDD4, 0x8AC2, 0xBDD5, 0x8ABF, 0xBDD6, 0x8AB0, 0xBDD7, 0x8AD6, 0xBDD8, 0x8ACD, 0xBDD9, 0x8AB6, 0xBDDA, 0x8AB9, 0xBDDB, 0x8ADB, + 0xBDDC, 0x8C4C, 0xBDDD, 0x8C4E, 0xBDDE, 0x8C6C, 0xBDDF, 0x8CE0, 0xBDE0, 0x8CDE, 0xBDE1, 0x8CE6, 0xBDE2, 0x8CE4, 0xBDE3, 0x8CEC, + 0xBDE4, 0x8CED, 0xBDE5, 0x8CE2, 0xBDE6, 0x8CE3, 0xBDE7, 0x8CDC, 0xBDE8, 0x8CEA, 0xBDE9, 0x8CE1, 0xBDEA, 0x8D6D, 0xBDEB, 0x8D9F, + 0xBDEC, 0x8DA3, 0xBDED, 0x8E2B, 0xBDEE, 0x8E10, 0xBDEF, 0x8E1D, 0xBDF0, 0x8E22, 0xBDF1, 0x8E0F, 0xBDF2, 0x8E29, 0xBDF3, 0x8E1F, + 0xBDF4, 0x8E21, 0xBDF5, 0x8E1E, 0xBDF6, 0x8EBA, 0xBDF7, 0x8F1D, 0xBDF8, 0x8F1B, 0xBDF9, 0x8F1F, 0xBDFA, 0x8F29, 0xBDFB, 0x8F26, + 0xBDFC, 0x8F2A, 0xBDFD, 0x8F1C, 0xBDFE, 0x8F1E, 0xBE40, 0x8F25, 0xBE41, 0x9069, 0xBE42, 0x906E, 0xBE43, 0x9068, 0xBE44, 0x906D, + 0xBE45, 0x9077, 0xBE46, 0x9130, 0xBE47, 0x912D, 0xBE48, 0x9127, 0xBE49, 0x9131, 0xBE4A, 0x9187, 0xBE4B, 0x9189, 0xBE4C, 0x918B, + 0xBE4D, 0x9183, 0xBE4E, 0x92C5, 0xBE4F, 0x92BB, 0xBE50, 0x92B7, 0xBE51, 0x92EA, 0xBE52, 0x92AC, 0xBE53, 0x92E4, 0xBE54, 0x92C1, + 0xBE55, 0x92B3, 0xBE56, 0x92BC, 0xBE57, 0x92D2, 0xBE58, 0x92C7, 0xBE59, 0x92F0, 0xBE5A, 0x92B2, 0xBE5B, 0x95AD, 0xBE5C, 0x95B1, + 0xBE5D, 0x9704, 0xBE5E, 0x9706, 0xBE5F, 0x9707, 0xBE60, 0x9709, 0xBE61, 0x9760, 0xBE62, 0x978D, 0xBE63, 0x978B, 0xBE64, 0x978F, + 0xBE65, 0x9821, 0xBE66, 0x982B, 0xBE67, 0x981C, 0xBE68, 0x98B3, 0xBE69, 0x990A, 0xBE6A, 0x9913, 0xBE6B, 0x9912, 0xBE6C, 0x9918, + 0xBE6D, 0x99DD, 0xBE6E, 0x99D0, 0xBE6F, 0x99DF, 0xBE70, 0x99DB, 0xBE71, 0x99D1, 0xBE72, 0x99D5, 0xBE73, 0x99D2, 0xBE74, 0x99D9, + 0xBE75, 0x9AB7, 0xBE76, 0x9AEE, 0xBE77, 0x9AEF, 0xBE78, 0x9B27, 0xBE79, 0x9B45, 0xBE7A, 0x9B44, 0xBE7B, 0x9B77, 0xBE7C, 0x9B6F, + 0xBE7D, 0x9D06, 0xBE7E, 0x9D09, 0xBEA1, 0x9D03, 0xBEA2, 0x9EA9, 0xBEA3, 0x9EBE, 0xBEA4, 0x9ECE, 0xBEA5, 0x58A8, 0xBEA6, 0x9F52, + 0xBEA7, 0x5112, 0xBEA8, 0x5118, 0xBEA9, 0x5114, 0xBEAA, 0x5110, 0xBEAB, 0x5115, 0xBEAC, 0x5180, 0xBEAD, 0x51AA, 0xBEAE, 0x51DD, + 0xBEAF, 0x5291, 0xBEB0, 0x5293, 0xBEB1, 0x52F3, 0xBEB2, 0x5659, 0xBEB3, 0x566B, 0xBEB4, 0x5679, 0xBEB5, 0x5669, 0xBEB6, 0x5664, + 0xBEB7, 0x5678, 0xBEB8, 0x566A, 0xBEB9, 0x5668, 0xBEBA, 0x5665, 0xBEBB, 0x5671, 0xBEBC, 0x566F, 0xBEBD, 0x566C, 0xBEBE, 0x5662, + 0xBEBF, 0x5676, 0xBEC0, 0x58C1, 0xBEC1, 0x58BE, 0xBEC2, 0x58C7, 0xBEC3, 0x58C5, 0xBEC4, 0x596E, 0xBEC5, 0x5B1D, 0xBEC6, 0x5B34, + 0xBEC7, 0x5B78, 0xBEC8, 0x5BF0, 0xBEC9, 0x5C0E, 0xBECA, 0x5F4A, 0xBECB, 0x61B2, 0xBECC, 0x6191, 0xBECD, 0x61A9, 0xBECE, 0x618A, + 0xBECF, 0x61CD, 0xBED0, 0x61B6, 0xBED1, 0x61BE, 0xBED2, 0x61CA, 0xBED3, 0x61C8, 0xBED4, 0x6230, 0xBED5, 0x64C5, 0xBED6, 0x64C1, + 0xBED7, 0x64CB, 0xBED8, 0x64BB, 0xBED9, 0x64BC, 0xBEDA, 0x64DA, 0xBEDB, 0x64C4, 0xBEDC, 0x64C7, 0xBEDD, 0x64C2, 0xBEDE, 0x64CD, + 0xBEDF, 0x64BF, 0xBEE0, 0x64D2, 0xBEE1, 0x64D4, 0xBEE2, 0x64BE, 0xBEE3, 0x6574, 0xBEE4, 0x66C6, 0xBEE5, 0x66C9, 0xBEE6, 0x66B9, + 0xBEE7, 0x66C4, 0xBEE8, 0x66C7, 0xBEE9, 0x66B8, 0xBEEA, 0x6A3D, 0xBEEB, 0x6A38, 0xBEEC, 0x6A3A, 0xBEED, 0x6A59, 0xBEEE, 0x6A6B, + 0xBEEF, 0x6A58, 0xBEF0, 0x6A39, 0xBEF1, 0x6A44, 0xBEF2, 0x6A62, 0xBEF3, 0x6A61, 0xBEF4, 0x6A4B, 0xBEF5, 0x6A47, 0xBEF6, 0x6A35, + 0xBEF7, 0x6A5F, 0xBEF8, 0x6A48, 0xBEF9, 0x6B59, 0xBEFA, 0x6B77, 0xBEFB, 0x6C05, 0xBEFC, 0x6FC2, 0xBEFD, 0x6FB1, 0xBEFE, 0x6FA1, + 0xBF40, 0x6FC3, 0xBF41, 0x6FA4, 0xBF42, 0x6FC1, 0xBF43, 0x6FA7, 0xBF44, 0x6FB3, 0xBF45, 0x6FC0, 0xBF46, 0x6FB9, 0xBF47, 0x6FB6, + 0xBF48, 0x6FA6, 0xBF49, 0x6FA0, 0xBF4A, 0x6FB4, 0xBF4B, 0x71BE, 0xBF4C, 0x71C9, 0xBF4D, 0x71D0, 0xBF4E, 0x71D2, 0xBF4F, 0x71C8, + 0xBF50, 0x71D5, 0xBF51, 0x71B9, 0xBF52, 0x71CE, 0xBF53, 0x71D9, 0xBF54, 0x71DC, 0xBF55, 0x71C3, 0xBF56, 0x71C4, 0xBF57, 0x7368, + 0xBF58, 0x749C, 0xBF59, 0x74A3, 0xBF5A, 0x7498, 0xBF5B, 0x749F, 0xBF5C, 0x749E, 0xBF5D, 0x74E2, 0xBF5E, 0x750C, 0xBF5F, 0x750D, + 0xBF60, 0x7634, 0xBF61, 0x7638, 0xBF62, 0x763A, 0xBF63, 0x76E7, 0xBF64, 0x76E5, 0xBF65, 0x77A0, 0xBF66, 0x779E, 0xBF67, 0x779F, + 0xBF68, 0x77A5, 0xBF69, 0x78E8, 0xBF6A, 0x78DA, 0xBF6B, 0x78EC, 0xBF6C, 0x78E7, 0xBF6D, 0x79A6, 0xBF6E, 0x7A4D, 0xBF6F, 0x7A4E, + 0xBF70, 0x7A46, 0xBF71, 0x7A4C, 0xBF72, 0x7A4B, 0xBF73, 0x7ABA, 0xBF74, 0x7BD9, 0xBF75, 0x7C11, 0xBF76, 0x7BC9, 0xBF77, 0x7BE4, + 0xBF78, 0x7BDB, 0xBF79, 0x7BE1, 0xBF7A, 0x7BE9, 0xBF7B, 0x7BE6, 0xBF7C, 0x7CD5, 0xBF7D, 0x7CD6, 0xBF7E, 0x7E0A, 0xBFA1, 0x7E11, + 0xBFA2, 0x7E08, 0xBFA3, 0x7E1B, 0xBFA4, 0x7E23, 0xBFA5, 0x7E1E, 0xBFA6, 0x7E1D, 0xBFA7, 0x7E09, 0xBFA8, 0x7E10, 0xBFA9, 0x7F79, + 0xBFAA, 0x7FB2, 0xBFAB, 0x7FF0, 0xBFAC, 0x7FF1, 0xBFAD, 0x7FEE, 0xBFAE, 0x8028, 0xBFAF, 0x81B3, 0xBFB0, 0x81A9, 0xBFB1, 0x81A8, + 0xBFB2, 0x81FB, 0xBFB3, 0x8208, 0xBFB4, 0x8258, 0xBFB5, 0x8259, 0xBFB6, 0x854A, 0xBFB7, 0x8559, 0xBFB8, 0x8548, 0xBFB9, 0x8568, + 0xBFBA, 0x8569, 0xBFBB, 0x8543, 0xBFBC, 0x8549, 0xBFBD, 0x856D, 0xBFBE, 0x856A, 0xBFBF, 0x855E, 0xBFC0, 0x8783, 0xBFC1, 0x879F, + 0xBFC2, 0x879E, 0xBFC3, 0x87A2, 0xBFC4, 0x878D, 0xBFC5, 0x8861, 0xBFC6, 0x892A, 0xBFC7, 0x8932, 0xBFC8, 0x8925, 0xBFC9, 0x892B, + 0xBFCA, 0x8921, 0xBFCB, 0x89AA, 0xBFCC, 0x89A6, 0xBFCD, 0x8AE6, 0xBFCE, 0x8AFA, 0xBFCF, 0x8AEB, 0xBFD0, 0x8AF1, 0xBFD1, 0x8B00, + 0xBFD2, 0x8ADC, 0xBFD3, 0x8AE7, 0xBFD4, 0x8AEE, 0xBFD5, 0x8AFE, 0xBFD6, 0x8B01, 0xBFD7, 0x8B02, 0xBFD8, 0x8AF7, 0xBFD9, 0x8AED, + 0xBFDA, 0x8AF3, 0xBFDB, 0x8AF6, 0xBFDC, 0x8AFC, 0xBFDD, 0x8C6B, 0xBFDE, 0x8C6D, 0xBFDF, 0x8C93, 0xBFE0, 0x8CF4, 0xBFE1, 0x8E44, + 0xBFE2, 0x8E31, 0xBFE3, 0x8E34, 0xBFE4, 0x8E42, 0xBFE5, 0x8E39, 0xBFE6, 0x8E35, 0xBFE7, 0x8F3B, 0xBFE8, 0x8F2F, 0xBFE9, 0x8F38, + 0xBFEA, 0x8F33, 0xBFEB, 0x8FA8, 0xBFEC, 0x8FA6, 0xBFED, 0x9075, 0xBFEE, 0x9074, 0xBFEF, 0x9078, 0xBFF0, 0x9072, 0xBFF1, 0x907C, + 0xBFF2, 0x907A, 0xBFF3, 0x9134, 0xBFF4, 0x9192, 0xBFF5, 0x9320, 0xBFF6, 0x9336, 0xBFF7, 0x92F8, 0xBFF8, 0x9333, 0xBFF9, 0x932F, + 0xBFFA, 0x9322, 0xBFFB, 0x92FC, 0xBFFC, 0x932B, 0xBFFD, 0x9304, 0xBFFE, 0x931A, 0xC040, 0x9310, 0xC041, 0x9326, 0xC042, 0x9321, + 0xC043, 0x9315, 0xC044, 0x932E, 0xC045, 0x9319, 0xC046, 0x95BB, 0xC047, 0x96A7, 0xC048, 0x96A8, 0xC049, 0x96AA, 0xC04A, 0x96D5, + 0xC04B, 0x970E, 0xC04C, 0x9711, 0xC04D, 0x9716, 0xC04E, 0x970D, 0xC04F, 0x9713, 0xC050, 0x970F, 0xC051, 0x975B, 0xC052, 0x975C, + 0xC053, 0x9766, 0xC054, 0x9798, 0xC055, 0x9830, 0xC056, 0x9838, 0xC057, 0x983B, 0xC058, 0x9837, 0xC059, 0x982D, 0xC05A, 0x9839, + 0xC05B, 0x9824, 0xC05C, 0x9910, 0xC05D, 0x9928, 0xC05E, 0x991E, 0xC05F, 0x991B, 0xC060, 0x9921, 0xC061, 0x991A, 0xC062, 0x99ED, + 0xC063, 0x99E2, 0xC064, 0x99F1, 0xC065, 0x9AB8, 0xC066, 0x9ABC, 0xC067, 0x9AFB, 0xC068, 0x9AED, 0xC069, 0x9B28, 0xC06A, 0x9B91, + 0xC06B, 0x9D15, 0xC06C, 0x9D23, 0xC06D, 0x9D26, 0xC06E, 0x9D28, 0xC06F, 0x9D12, 0xC070, 0x9D1B, 0xC071, 0x9ED8, 0xC072, 0x9ED4, + 0xC073, 0x9F8D, 0xC074, 0x9F9C, 0xC075, 0x512A, 0xC076, 0x511F, 0xC077, 0x5121, 0xC078, 0x5132, 0xC079, 0x52F5, 0xC07A, 0x568E, + 0xC07B, 0x5680, 0xC07C, 0x5690, 0xC07D, 0x5685, 0xC07E, 0x5687, 0xC0A1, 0x568F, 0xC0A2, 0x58D5, 0xC0A3, 0x58D3, 0xC0A4, 0x58D1, + 0xC0A5, 0x58CE, 0xC0A6, 0x5B30, 0xC0A7, 0x5B2A, 0xC0A8, 0x5B24, 0xC0A9, 0x5B7A, 0xC0AA, 0x5C37, 0xC0AB, 0x5C68, 0xC0AC, 0x5DBC, + 0xC0AD, 0x5DBA, 0xC0AE, 0x5DBD, 0xC0AF, 0x5DB8, 0xC0B0, 0x5E6B, 0xC0B1, 0x5F4C, 0xC0B2, 0x5FBD, 0xC0B3, 0x61C9, 0xC0B4, 0x61C2, + 0xC0B5, 0x61C7, 0xC0B6, 0x61E6, 0xC0B7, 0x61CB, 0xC0B8, 0x6232, 0xC0B9, 0x6234, 0xC0BA, 0x64CE, 0xC0BB, 0x64CA, 0xC0BC, 0x64D8, + 0xC0BD, 0x64E0, 0xC0BE, 0x64F0, 0xC0BF, 0x64E6, 0xC0C0, 0x64EC, 0xC0C1, 0x64F1, 0xC0C2, 0x64E2, 0xC0C3, 0x64ED, 0xC0C4, 0x6582, + 0xC0C5, 0x6583, 0xC0C6, 0x66D9, 0xC0C7, 0x66D6, 0xC0C8, 0x6A80, 0xC0C9, 0x6A94, 0xC0CA, 0x6A84, 0xC0CB, 0x6AA2, 0xC0CC, 0x6A9C, + 0xC0CD, 0x6ADB, 0xC0CE, 0x6AA3, 0xC0CF, 0x6A7E, 0xC0D0, 0x6A97, 0xC0D1, 0x6A90, 0xC0D2, 0x6AA0, 0xC0D3, 0x6B5C, 0xC0D4, 0x6BAE, + 0xC0D5, 0x6BDA, 0xC0D6, 0x6C08, 0xC0D7, 0x6FD8, 0xC0D8, 0x6FF1, 0xC0D9, 0x6FDF, 0xC0DA, 0x6FE0, 0xC0DB, 0x6FDB, 0xC0DC, 0x6FE4, + 0xC0DD, 0x6FEB, 0xC0DE, 0x6FEF, 0xC0DF, 0x6F80, 0xC0E0, 0x6FEC, 0xC0E1, 0x6FE1, 0xC0E2, 0x6FE9, 0xC0E3, 0x6FD5, 0xC0E4, 0x6FEE, + 0xC0E5, 0x6FF0, 0xC0E6, 0x71E7, 0xC0E7, 0x71DF, 0xC0E8, 0x71EE, 0xC0E9, 0x71E6, 0xC0EA, 0x71E5, 0xC0EB, 0x71ED, 0xC0EC, 0x71EC, + 0xC0ED, 0x71F4, 0xC0EE, 0x71E0, 0xC0EF, 0x7235, 0xC0F0, 0x7246, 0xC0F1, 0x7370, 0xC0F2, 0x7372, 0xC0F3, 0x74A9, 0xC0F4, 0x74B0, + 0xC0F5, 0x74A6, 0xC0F6, 0x74A8, 0xC0F7, 0x7646, 0xC0F8, 0x7642, 0xC0F9, 0x764C, 0xC0FA, 0x76EA, 0xC0FB, 0x77B3, 0xC0FC, 0x77AA, + 0xC0FD, 0x77B0, 0xC0FE, 0x77AC, 0xC140, 0x77A7, 0xC141, 0x77AD, 0xC142, 0x77EF, 0xC143, 0x78F7, 0xC144, 0x78FA, 0xC145, 0x78F4, + 0xC146, 0x78EF, 0xC147, 0x7901, 0xC148, 0x79A7, 0xC149, 0x79AA, 0xC14A, 0x7A57, 0xC14B, 0x7ABF, 0xC14C, 0x7C07, 0xC14D, 0x7C0D, + 0xC14E, 0x7BFE, 0xC14F, 0x7BF7, 0xC150, 0x7C0C, 0xC151, 0x7BE0, 0xC152, 0x7CE0, 0xC153, 0x7CDC, 0xC154, 0x7CDE, 0xC155, 0x7CE2, + 0xC156, 0x7CDF, 0xC157, 0x7CD9, 0xC158, 0x7CDD, 0xC159, 0x7E2E, 0xC15A, 0x7E3E, 0xC15B, 0x7E46, 0xC15C, 0x7E37, 0xC15D, 0x7E32, + 0xC15E, 0x7E43, 0xC15F, 0x7E2B, 0xC160, 0x7E3D, 0xC161, 0x7E31, 0xC162, 0x7E45, 0xC163, 0x7E41, 0xC164, 0x7E34, 0xC165, 0x7E39, + 0xC166, 0x7E48, 0xC167, 0x7E35, 0xC168, 0x7E3F, 0xC169, 0x7E2F, 0xC16A, 0x7F44, 0xC16B, 0x7FF3, 0xC16C, 0x7FFC, 0xC16D, 0x8071, + 0xC16E, 0x8072, 0xC16F, 0x8070, 0xC170, 0x806F, 0xC171, 0x8073, 0xC172, 0x81C6, 0xC173, 0x81C3, 0xC174, 0x81BA, 0xC175, 0x81C2, + 0xC176, 0x81C0, 0xC177, 0x81BF, 0xC178, 0x81BD, 0xC179, 0x81C9, 0xC17A, 0x81BE, 0xC17B, 0x81E8, 0xC17C, 0x8209, 0xC17D, 0x8271, + 0xC17E, 0x85AA, 0xC1A1, 0x8584, 0xC1A2, 0x857E, 0xC1A3, 0x859C, 0xC1A4, 0x8591, 0xC1A5, 0x8594, 0xC1A6, 0x85AF, 0xC1A7, 0x859B, + 0xC1A8, 0x8587, 0xC1A9, 0x85A8, 0xC1AA, 0x858A, 0xC1AB, 0x8667, 0xC1AC, 0x87C0, 0xC1AD, 0x87D1, 0xC1AE, 0x87B3, 0xC1AF, 0x87D2, + 0xC1B0, 0x87C6, 0xC1B1, 0x87AB, 0xC1B2, 0x87BB, 0xC1B3, 0x87BA, 0xC1B4, 0x87C8, 0xC1B5, 0x87CB, 0xC1B6, 0x893B, 0xC1B7, 0x8936, + 0xC1B8, 0x8944, 0xC1B9, 0x8938, 0xC1BA, 0x893D, 0xC1BB, 0x89AC, 0xC1BC, 0x8B0E, 0xC1BD, 0x8B17, 0xC1BE, 0x8B19, 0xC1BF, 0x8B1B, + 0xC1C0, 0x8B0A, 0xC1C1, 0x8B20, 0xC1C2, 0x8B1D, 0xC1C3, 0x8B04, 0xC1C4, 0x8B10, 0xC1C5, 0x8C41, 0xC1C6, 0x8C3F, 0xC1C7, 0x8C73, + 0xC1C8, 0x8CFA, 0xC1C9, 0x8CFD, 0xC1CA, 0x8CFC, 0xC1CB, 0x8CF8, 0xC1CC, 0x8CFB, 0xC1CD, 0x8DA8, 0xC1CE, 0x8E49, 0xC1CF, 0x8E4B, + 0xC1D0, 0x8E48, 0xC1D1, 0x8E4A, 0xC1D2, 0x8F44, 0xC1D3, 0x8F3E, 0xC1D4, 0x8F42, 0xC1D5, 0x8F45, 0xC1D6, 0x8F3F, 0xC1D7, 0x907F, + 0xC1D8, 0x907D, 0xC1D9, 0x9084, 0xC1DA, 0x9081, 0xC1DB, 0x9082, 0xC1DC, 0x9080, 0xC1DD, 0x9139, 0xC1DE, 0x91A3, 0xC1DF, 0x919E, + 0xC1E0, 0x919C, 0xC1E1, 0x934D, 0xC1E2, 0x9382, 0xC1E3, 0x9328, 0xC1E4, 0x9375, 0xC1E5, 0x934A, 0xC1E6, 0x9365, 0xC1E7, 0x934B, + 0xC1E8, 0x9318, 0xC1E9, 0x937E, 0xC1EA, 0x936C, 0xC1EB, 0x935B, 0xC1EC, 0x9370, 0xC1ED, 0x935A, 0xC1EE, 0x9354, 0xC1EF, 0x95CA, + 0xC1F0, 0x95CB, 0xC1F1, 0x95CC, 0xC1F2, 0x95C8, 0xC1F3, 0x95C6, 0xC1F4, 0x96B1, 0xC1F5, 0x96B8, 0xC1F6, 0x96D6, 0xC1F7, 0x971C, + 0xC1F8, 0x971E, 0xC1F9, 0x97A0, 0xC1FA, 0x97D3, 0xC1FB, 0x9846, 0xC1FC, 0x98B6, 0xC1FD, 0x9935, 0xC1FE, 0x9A01, 0xC240, 0x99FF, + 0xC241, 0x9BAE, 0xC242, 0x9BAB, 0xC243, 0x9BAA, 0xC244, 0x9BAD, 0xC245, 0x9D3B, 0xC246, 0x9D3F, 0xC247, 0x9E8B, 0xC248, 0x9ECF, + 0xC249, 0x9EDE, 0xC24A, 0x9EDC, 0xC24B, 0x9EDD, 0xC24C, 0x9EDB, 0xC24D, 0x9F3E, 0xC24E, 0x9F4B, 0xC24F, 0x53E2, 0xC250, 0x5695, + 0xC251, 0x56AE, 0xC252, 0x58D9, 0xC253, 0x58D8, 0xC254, 0x5B38, 0xC255, 0x5F5D, 0xC256, 0x61E3, 0xC257, 0x6233, 0xC258, 0x64F4, + 0xC259, 0x64F2, 0xC25A, 0x64FE, 0xC25B, 0x6506, 0xC25C, 0x64FA, 0xC25D, 0x64FB, 0xC25E, 0x64F7, 0xC25F, 0x65B7, 0xC260, 0x66DC, + 0xC261, 0x6726, 0xC262, 0x6AB3, 0xC263, 0x6AAC, 0xC264, 0x6AC3, 0xC265, 0x6ABB, 0xC266, 0x6AB8, 0xC267, 0x6AC2, 0xC268, 0x6AAE, + 0xC269, 0x6AAF, 0xC26A, 0x6B5F, 0xC26B, 0x6B78, 0xC26C, 0x6BAF, 0xC26D, 0x7009, 0xC26E, 0x700B, 0xC26F, 0x6FFE, 0xC270, 0x7006, + 0xC271, 0x6FFA, 0xC272, 0x7011, 0xC273, 0x700F, 0xC274, 0x71FB, 0xC275, 0x71FC, 0xC276, 0x71FE, 0xC277, 0x71F8, 0xC278, 0x7377, + 0xC279, 0x7375, 0xC27A, 0x74A7, 0xC27B, 0x74BF, 0xC27C, 0x7515, 0xC27D, 0x7656, 0xC27E, 0x7658, 0xC2A1, 0x7652, 0xC2A2, 0x77BD, + 0xC2A3, 0x77BF, 0xC2A4, 0x77BB, 0xC2A5, 0x77BC, 0xC2A6, 0x790E, 0xC2A7, 0x79AE, 0xC2A8, 0x7A61, 0xC2A9, 0x7A62, 0xC2AA, 0x7A60, + 0xC2AB, 0x7AC4, 0xC2AC, 0x7AC5, 0xC2AD, 0x7C2B, 0xC2AE, 0x7C27, 0xC2AF, 0x7C2A, 0xC2B0, 0x7C1E, 0xC2B1, 0x7C23, 0xC2B2, 0x7C21, + 0xC2B3, 0x7CE7, 0xC2B4, 0x7E54, 0xC2B5, 0x7E55, 0xC2B6, 0x7E5E, 0xC2B7, 0x7E5A, 0xC2B8, 0x7E61, 0xC2B9, 0x7E52, 0xC2BA, 0x7E59, + 0xC2BB, 0x7F48, 0xC2BC, 0x7FF9, 0xC2BD, 0x7FFB, 0xC2BE, 0x8077, 0xC2BF, 0x8076, 0xC2C0, 0x81CD, 0xC2C1, 0x81CF, 0xC2C2, 0x820A, + 0xC2C3, 0x85CF, 0xC2C4, 0x85A9, 0xC2C5, 0x85CD, 0xC2C6, 0x85D0, 0xC2C7, 0x85C9, 0xC2C8, 0x85B0, 0xC2C9, 0x85BA, 0xC2CA, 0x85B9, + 0xC2CB, 0x85A6, 0xC2CC, 0x87EF, 0xC2CD, 0x87EC, 0xC2CE, 0x87F2, 0xC2CF, 0x87E0, 0xC2D0, 0x8986, 0xC2D1, 0x89B2, 0xC2D2, 0x89F4, + 0xC2D3, 0x8B28, 0xC2D4, 0x8B39, 0xC2D5, 0x8B2C, 0xC2D6, 0x8B2B, 0xC2D7, 0x8C50, 0xC2D8, 0x8D05, 0xC2D9, 0x8E59, 0xC2DA, 0x8E63, + 0xC2DB, 0x8E66, 0xC2DC, 0x8E64, 0xC2DD, 0x8E5F, 0xC2DE, 0x8E55, 0xC2DF, 0x8EC0, 0xC2E0, 0x8F49, 0xC2E1, 0x8F4D, 0xC2E2, 0x9087, + 0xC2E3, 0x9083, 0xC2E4, 0x9088, 0xC2E5, 0x91AB, 0xC2E6, 0x91AC, 0xC2E7, 0x91D0, 0xC2E8, 0x9394, 0xC2E9, 0x938A, 0xC2EA, 0x9396, + 0xC2EB, 0x93A2, 0xC2EC, 0x93B3, 0xC2ED, 0x93AE, 0xC2EE, 0x93AC, 0xC2EF, 0x93B0, 0xC2F0, 0x9398, 0xC2F1, 0x939A, 0xC2F2, 0x9397, + 0xC2F3, 0x95D4, 0xC2F4, 0x95D6, 0xC2F5, 0x95D0, 0xC2F6, 0x95D5, 0xC2F7, 0x96E2, 0xC2F8, 0x96DC, 0xC2F9, 0x96D9, 0xC2FA, 0x96DB, + 0xC2FB, 0x96DE, 0xC2FC, 0x9724, 0xC2FD, 0x97A3, 0xC2FE, 0x97A6, 0xC340, 0x97AD, 0xC341, 0x97F9, 0xC342, 0x984D, 0xC343, 0x984F, + 0xC344, 0x984C, 0xC345, 0x984E, 0xC346, 0x9853, 0xC347, 0x98BA, 0xC348, 0x993E, 0xC349, 0x993F, 0xC34A, 0x993D, 0xC34B, 0x992E, + 0xC34C, 0x99A5, 0xC34D, 0x9A0E, 0xC34E, 0x9AC1, 0xC34F, 0x9B03, 0xC350, 0x9B06, 0xC351, 0x9B4F, 0xC352, 0x9B4E, 0xC353, 0x9B4D, + 0xC354, 0x9BCA, 0xC355, 0x9BC9, 0xC356, 0x9BFD, 0xC357, 0x9BC8, 0xC358, 0x9BC0, 0xC359, 0x9D51, 0xC35A, 0x9D5D, 0xC35B, 0x9D60, + 0xC35C, 0x9EE0, 0xC35D, 0x9F15, 0xC35E, 0x9F2C, 0xC35F, 0x5133, 0xC360, 0x56A5, 0xC361, 0x58DE, 0xC362, 0x58DF, 0xC363, 0x58E2, + 0xC364, 0x5BF5, 0xC365, 0x9F90, 0xC366, 0x5EEC, 0xC367, 0x61F2, 0xC368, 0x61F7, 0xC369, 0x61F6, 0xC36A, 0x61F5, 0xC36B, 0x6500, + 0xC36C, 0x650F, 0xC36D, 0x66E0, 0xC36E, 0x66DD, 0xC36F, 0x6AE5, 0xC370, 0x6ADD, 0xC371, 0x6ADA, 0xC372, 0x6AD3, 0xC373, 0x701B, + 0xC374, 0x701F, 0xC375, 0x7028, 0xC376, 0x701A, 0xC377, 0x701D, 0xC378, 0x7015, 0xC379, 0x7018, 0xC37A, 0x7206, 0xC37B, 0x720D, + 0xC37C, 0x7258, 0xC37D, 0x72A2, 0xC37E, 0x7378, 0xC3A1, 0x737A, 0xC3A2, 0x74BD, 0xC3A3, 0x74CA, 0xC3A4, 0x74E3, 0xC3A5, 0x7587, + 0xC3A6, 0x7586, 0xC3A7, 0x765F, 0xC3A8, 0x7661, 0xC3A9, 0x77C7, 0xC3AA, 0x7919, 0xC3AB, 0x79B1, 0xC3AC, 0x7A6B, 0xC3AD, 0x7A69, + 0xC3AE, 0x7C3E, 0xC3AF, 0x7C3F, 0xC3B0, 0x7C38, 0xC3B1, 0x7C3D, 0xC3B2, 0x7C37, 0xC3B3, 0x7C40, 0xC3B4, 0x7E6B, 0xC3B5, 0x7E6D, + 0xC3B6, 0x7E79, 0xC3B7, 0x7E69, 0xC3B8, 0x7E6A, 0xC3B9, 0x7F85, 0xC3BA, 0x7E73, 0xC3BB, 0x7FB6, 0xC3BC, 0x7FB9, 0xC3BD, 0x7FB8, + 0xC3BE, 0x81D8, 0xC3BF, 0x85E9, 0xC3C0, 0x85DD, 0xC3C1, 0x85EA, 0xC3C2, 0x85D5, 0xC3C3, 0x85E4, 0xC3C4, 0x85E5, 0xC3C5, 0x85F7, + 0xC3C6, 0x87FB, 0xC3C7, 0x8805, 0xC3C8, 0x880D, 0xC3C9, 0x87F9, 0xC3CA, 0x87FE, 0xC3CB, 0x8960, 0xC3CC, 0x895F, 0xC3CD, 0x8956, + 0xC3CE, 0x895E, 0xC3CF, 0x8B41, 0xC3D0, 0x8B5C, 0xC3D1, 0x8B58, 0xC3D2, 0x8B49, 0xC3D3, 0x8B5A, 0xC3D4, 0x8B4E, 0xC3D5, 0x8B4F, + 0xC3D6, 0x8B46, 0xC3D7, 0x8B59, 0xC3D8, 0x8D08, 0xC3D9, 0x8D0A, 0xC3DA, 0x8E7C, 0xC3DB, 0x8E72, 0xC3DC, 0x8E87, 0xC3DD, 0x8E76, + 0xC3DE, 0x8E6C, 0xC3DF, 0x8E7A, 0xC3E0, 0x8E74, 0xC3E1, 0x8F54, 0xC3E2, 0x8F4E, 0xC3E3, 0x8FAD, 0xC3E4, 0x908A, 0xC3E5, 0x908B, + 0xC3E6, 0x91B1, 0xC3E7, 0x91AE, 0xC3E8, 0x93E1, 0xC3E9, 0x93D1, 0xC3EA, 0x93DF, 0xC3EB, 0x93C3, 0xC3EC, 0x93C8, 0xC3ED, 0x93DC, + 0xC3EE, 0x93DD, 0xC3EF, 0x93D6, 0xC3F0, 0x93E2, 0xC3F1, 0x93CD, 0xC3F2, 0x93D8, 0xC3F3, 0x93E4, 0xC3F4, 0x93D7, 0xC3F5, 0x93E8, + 0xC3F6, 0x95DC, 0xC3F7, 0x96B4, 0xC3F8, 0x96E3, 0xC3F9, 0x972A, 0xC3FA, 0x9727, 0xC3FB, 0x9761, 0xC3FC, 0x97DC, 0xC3FD, 0x97FB, + 0xC3FE, 0x985E, 0xC440, 0x9858, 0xC441, 0x985B, 0xC442, 0x98BC, 0xC443, 0x9945, 0xC444, 0x9949, 0xC445, 0x9A16, 0xC446, 0x9A19, + 0xC447, 0x9B0D, 0xC448, 0x9BE8, 0xC449, 0x9BE7, 0xC44A, 0x9BD6, 0xC44B, 0x9BDB, 0xC44C, 0x9D89, 0xC44D, 0x9D61, 0xC44E, 0x9D72, + 0xC44F, 0x9D6A, 0xC450, 0x9D6C, 0xC451, 0x9E92, 0xC452, 0x9E97, 0xC453, 0x9E93, 0xC454, 0x9EB4, 0xC455, 0x52F8, 0xC456, 0x56A8, + 0xC457, 0x56B7, 0xC458, 0x56B6, 0xC459, 0x56B4, 0xC45A, 0x56BC, 0xC45B, 0x58E4, 0xC45C, 0x5B40, 0xC45D, 0x5B43, 0xC45E, 0x5B7D, + 0xC45F, 0x5BF6, 0xC460, 0x5DC9, 0xC461, 0x61F8, 0xC462, 0x61FA, 0xC463, 0x6518, 0xC464, 0x6514, 0xC465, 0x6519, 0xC466, 0x66E6, + 0xC467, 0x6727, 0xC468, 0x6AEC, 0xC469, 0x703E, 0xC46A, 0x7030, 0xC46B, 0x7032, 0xC46C, 0x7210, 0xC46D, 0x737B, 0xC46E, 0x74CF, + 0xC46F, 0x7662, 0xC470, 0x7665, 0xC471, 0x7926, 0xC472, 0x792A, 0xC473, 0x792C, 0xC474, 0x792B, 0xC475, 0x7AC7, 0xC476, 0x7AF6, + 0xC477, 0x7C4C, 0xC478, 0x7C43, 0xC479, 0x7C4D, 0xC47A, 0x7CEF, 0xC47B, 0x7CF0, 0xC47C, 0x8FAE, 0xC47D, 0x7E7D, 0xC47E, 0x7E7C, + 0xC4A1, 0x7E82, 0xC4A2, 0x7F4C, 0xC4A3, 0x8000, 0xC4A4, 0x81DA, 0xC4A5, 0x8266, 0xC4A6, 0x85FB, 0xC4A7, 0x85F9, 0xC4A8, 0x8611, + 0xC4A9, 0x85FA, 0xC4AA, 0x8606, 0xC4AB, 0x860B, 0xC4AC, 0x8607, 0xC4AD, 0x860A, 0xC4AE, 0x8814, 0xC4AF, 0x8815, 0xC4B0, 0x8964, + 0xC4B1, 0x89BA, 0xC4B2, 0x89F8, 0xC4B3, 0x8B70, 0xC4B4, 0x8B6C, 0xC4B5, 0x8B66, 0xC4B6, 0x8B6F, 0xC4B7, 0x8B5F, 0xC4B8, 0x8B6B, + 0xC4B9, 0x8D0F, 0xC4BA, 0x8D0D, 0xC4BB, 0x8E89, 0xC4BC, 0x8E81, 0xC4BD, 0x8E85, 0xC4BE, 0x8E82, 0xC4BF, 0x91B4, 0xC4C0, 0x91CB, + 0xC4C1, 0x9418, 0xC4C2, 0x9403, 0xC4C3, 0x93FD, 0xC4C4, 0x95E1, 0xC4C5, 0x9730, 0xC4C6, 0x98C4, 0xC4C7, 0x9952, 0xC4C8, 0x9951, + 0xC4C9, 0x99A8, 0xC4CA, 0x9A2B, 0xC4CB, 0x9A30, 0xC4CC, 0x9A37, 0xC4CD, 0x9A35, 0xC4CE, 0x9C13, 0xC4CF, 0x9C0D, 0xC4D0, 0x9E79, + 0xC4D1, 0x9EB5, 0xC4D2, 0x9EE8, 0xC4D3, 0x9F2F, 0xC4D4, 0x9F5F, 0xC4D5, 0x9F63, 0xC4D6, 0x9F61, 0xC4D7, 0x5137, 0xC4D8, 0x5138, + 0xC4D9, 0x56C1, 0xC4DA, 0x56C0, 0xC4DB, 0x56C2, 0xC4DC, 0x5914, 0xC4DD, 0x5C6C, 0xC4DE, 0x5DCD, 0xC4DF, 0x61FC, 0xC4E0, 0x61FE, + 0xC4E1, 0x651D, 0xC4E2, 0x651C, 0xC4E3, 0x6595, 0xC4E4, 0x66E9, 0xC4E5, 0x6AFB, 0xC4E6, 0x6B04, 0xC4E7, 0x6AFA, 0xC4E8, 0x6BB2, + 0xC4E9, 0x704C, 0xC4EA, 0x721B, 0xC4EB, 0x72A7, 0xC4EC, 0x74D6, 0xC4ED, 0x74D4, 0xC4EE, 0x7669, 0xC4EF, 0x77D3, 0xC4F0, 0x7C50, + 0xC4F1, 0x7E8F, 0xC4F2, 0x7E8C, 0xC4F3, 0x7FBC, 0xC4F4, 0x8617, 0xC4F5, 0x862D, 0xC4F6, 0x861A, 0xC4F7, 0x8823, 0xC4F8, 0x8822, + 0xC4F9, 0x8821, 0xC4FA, 0x881F, 0xC4FB, 0x896A, 0xC4FC, 0x896C, 0xC4FD, 0x89BD, 0xC4FE, 0x8B74, 0xC540, 0x8B77, 0xC541, 0x8B7D, + 0xC542, 0x8D13, 0xC543, 0x8E8A, 0xC544, 0x8E8D, 0xC545, 0x8E8B, 0xC546, 0x8F5F, 0xC547, 0x8FAF, 0xC548, 0x91BA, 0xC549, 0x942E, + 0xC54A, 0x9433, 0xC54B, 0x9435, 0xC54C, 0x943A, 0xC54D, 0x9438, 0xC54E, 0x9432, 0xC54F, 0x942B, 0xC550, 0x95E2, 0xC551, 0x9738, + 0xC552, 0x9739, 0xC553, 0x9732, 0xC554, 0x97FF, 0xC555, 0x9867, 0xC556, 0x9865, 0xC557, 0x9957, 0xC558, 0x9A45, 0xC559, 0x9A43, + 0xC55A, 0x9A40, 0xC55B, 0x9A3E, 0xC55C, 0x9ACF, 0xC55D, 0x9B54, 0xC55E, 0x9B51, 0xC55F, 0x9C2D, 0xC560, 0x9C25, 0xC561, 0x9DAF, + 0xC562, 0x9DB4, 0xC563, 0x9DC2, 0xC564, 0x9DB8, 0xC565, 0x9E9D, 0xC566, 0x9EEF, 0xC567, 0x9F19, 0xC568, 0x9F5C, 0xC569, 0x9F66, + 0xC56A, 0x9F67, 0xC56B, 0x513C, 0xC56C, 0x513B, 0xC56D, 0x56C8, 0xC56E, 0x56CA, 0xC56F, 0x56C9, 0xC570, 0x5B7F, 0xC571, 0x5DD4, + 0xC572, 0x5DD2, 0xC573, 0x5F4E, 0xC574, 0x61FF, 0xC575, 0x6524, 0xC576, 0x6B0A, 0xC577, 0x6B61, 0xC578, 0x7051, 0xC579, 0x7058, + 0xC57A, 0x7380, 0xC57B, 0x74E4, 0xC57C, 0x758A, 0xC57D, 0x766E, 0xC57E, 0x766C, 0xC5A1, 0x79B3, 0xC5A2, 0x7C60, 0xC5A3, 0x7C5F, + 0xC5A4, 0x807E, 0xC5A5, 0x807D, 0xC5A6, 0x81DF, 0xC5A7, 0x8972, 0xC5A8, 0x896F, 0xC5A9, 0x89FC, 0xC5AA, 0x8B80, 0xC5AB, 0x8D16, + 0xC5AC, 0x8D17, 0xC5AD, 0x8E91, 0xC5AE, 0x8E93, 0xC5AF, 0x8F61, 0xC5B0, 0x9148, 0xC5B1, 0x9444, 0xC5B2, 0x9451, 0xC5B3, 0x9452, + 0xC5B4, 0x973D, 0xC5B5, 0x973E, 0xC5B6, 0x97C3, 0xC5B7, 0x97C1, 0xC5B8, 0x986B, 0xC5B9, 0x9955, 0xC5BA, 0x9A55, 0xC5BB, 0x9A4D, + 0xC5BC, 0x9AD2, 0xC5BD, 0x9B1A, 0xC5BE, 0x9C49, 0xC5BF, 0x9C31, 0xC5C0, 0x9C3E, 0xC5C1, 0x9C3B, 0xC5C2, 0x9DD3, 0xC5C3, 0x9DD7, + 0xC5C4, 0x9F34, 0xC5C5, 0x9F6C, 0xC5C6, 0x9F6A, 0xC5C7, 0x9F94, 0xC5C8, 0x56CC, 0xC5C9, 0x5DD6, 0xC5CA, 0x6200, 0xC5CB, 0x6523, + 0xC5CC, 0x652B, 0xC5CD, 0x652A, 0xC5CE, 0x66EC, 0xC5CF, 0x6B10, 0xC5D0, 0x74DA, 0xC5D1, 0x7ACA, 0xC5D2, 0x7C64, 0xC5D3, 0x7C63, + 0xC5D4, 0x7C65, 0xC5D5, 0x7E93, 0xC5D6, 0x7E96, 0xC5D7, 0x7E94, 0xC5D8, 0x81E2, 0xC5D9, 0x8638, 0xC5DA, 0x863F, 0xC5DB, 0x8831, + 0xC5DC, 0x8B8A, 0xC5DD, 0x9090, 0xC5DE, 0x908F, 0xC5DF, 0x9463, 0xC5E0, 0x9460, 0xC5E1, 0x9464, 0xC5E2, 0x9768, 0xC5E3, 0x986F, + 0xC5E4, 0x995C, 0xC5E5, 0x9A5A, 0xC5E6, 0x9A5B, 0xC5E7, 0x9A57, 0xC5E8, 0x9AD3, 0xC5E9, 0x9AD4, 0xC5EA, 0x9AD1, 0xC5EB, 0x9C54, + 0xC5EC, 0x9C57, 0xC5ED, 0x9C56, 0xC5EE, 0x9DE5, 0xC5EF, 0x9E9F, 0xC5F0, 0x9EF4, 0xC5F1, 0x56D1, 0xC5F2, 0x58E9, 0xC5F3, 0x652C, + 0xC5F4, 0x705E, 0xC5F5, 0x7671, 0xC5F6, 0x7672, 0xC5F7, 0x77D7, 0xC5F8, 0x7F50, 0xC5F9, 0x7F88, 0xC5FA, 0x8836, 0xC5FB, 0x8839, + 0xC5FC, 0x8862, 0xC5FD, 0x8B93, 0xC5FE, 0x8B92, 0xC640, 0x8B96, 0xC641, 0x8277, 0xC642, 0x8D1B, 0xC643, 0x91C0, 0xC644, 0x946A, + 0xC645, 0x9742, 0xC646, 0x9748, 0xC647, 0x9744, 0xC648, 0x97C6, 0xC649, 0x9870, 0xC64A, 0x9A5F, 0xC64B, 0x9B22, 0xC64C, 0x9B58, + 0xC64D, 0x9C5F, 0xC64E, 0x9DF9, 0xC64F, 0x9DFA, 0xC650, 0x9E7C, 0xC651, 0x9E7D, 0xC652, 0x9F07, 0xC653, 0x9F77, 0xC654, 0x9F72, + 0xC655, 0x5EF3, 0xC656, 0x6B16, 0xC657, 0x7063, 0xC658, 0x7C6C, 0xC659, 0x7C6E, 0xC65A, 0x883B, 0xC65B, 0x89C0, 0xC65C, 0x8EA1, + 0xC65D, 0x91C1, 0xC65E, 0x9472, 0xC65F, 0x9470, 0xC660, 0x9871, 0xC661, 0x995E, 0xC662, 0x9AD6, 0xC663, 0x9B23, 0xC664, 0x9ECC, + 0xC665, 0x7064, 0xC666, 0x77DA, 0xC667, 0x8B9A, 0xC668, 0x9477, 0xC669, 0x97C9, 0xC66A, 0x9A62, 0xC66B, 0x9A65, 0xC66C, 0x7E9C, + 0xC66D, 0x8B9C, 0xC66E, 0x8EAA, 0xC66F, 0x91C5, 0xC670, 0x947D, 0xC671, 0x947E, 0xC672, 0x947C, 0xC673, 0x9C77, 0xC674, 0x9C78, + 0xC675, 0x9EF7, 0xC676, 0x8C54, 0xC677, 0x947F, 0xC678, 0x9E1A, 0xC679, 0x7228, 0xC67A, 0x9A6A, 0xC67B, 0x9B31, 0xC67C, 0x9E1B, + 0xC67D, 0x9E1E, 0xC67E, 0x7C72, 0xC940, 0x4E42, 0xC941, 0x4E5C, 0xC942, 0x51F5, 0xC943, 0x531A, 0xC944, 0x5382, 0xC945, 0x4E07, + 0xC946, 0x4E0C, 0xC947, 0x4E47, 0xC948, 0x4E8D, 0xC949, 0x56D7, 0xC94A, 0xFA0C, 0xC94B, 0x5C6E, 0xC94C, 0x5F73, 0xC94D, 0x4E0F, + 0xC94E, 0x5187, 0xC94F, 0x4E0E, 0xC950, 0x4E2E, 0xC951, 0x4E93, 0xC952, 0x4EC2, 0xC953, 0x4EC9, 0xC954, 0x4EC8, 0xC955, 0x5198, + 0xC956, 0x52FC, 0xC957, 0x536C, 0xC958, 0x53B9, 0xC959, 0x5720, 0xC95A, 0x5903, 0xC95B, 0x592C, 0xC95C, 0x5C10, 0xC95D, 0x5DFF, + 0xC95E, 0x65E1, 0xC95F, 0x6BB3, 0xC960, 0x6BCC, 0xC961, 0x6C14, 0xC962, 0x723F, 0xC963, 0x4E31, 0xC964, 0x4E3C, 0xC965, 0x4EE8, + 0xC966, 0x4EDC, 0xC967, 0x4EE9, 0xC968, 0x4EE1, 0xC969, 0x4EDD, 0xC96A, 0x4EDA, 0xC96B, 0x520C, 0xC96C, 0x531C, 0xC96D, 0x534C, + 0xC96E, 0x5722, 0xC96F, 0x5723, 0xC970, 0x5917, 0xC971, 0x592F, 0xC972, 0x5B81, 0xC973, 0x5B84, 0xC974, 0x5C12, 0xC975, 0x5C3B, + 0xC976, 0x5C74, 0xC977, 0x5C73, 0xC978, 0x5E04, 0xC979, 0x5E80, 0xC97A, 0x5E82, 0xC97B, 0x5FC9, 0xC97C, 0x6209, 0xC97D, 0x6250, + 0xC97E, 0x6C15, 0xC9A1, 0x6C36, 0xC9A2, 0x6C43, 0xC9A3, 0x6C3F, 0xC9A4, 0x6C3B, 0xC9A5, 0x72AE, 0xC9A6, 0x72B0, 0xC9A7, 0x738A, + 0xC9A8, 0x79B8, 0xC9A9, 0x808A, 0xC9AA, 0x961E, 0xC9AB, 0x4F0E, 0xC9AC, 0x4F18, 0xC9AD, 0x4F2C, 0xC9AE, 0x4EF5, 0xC9AF, 0x4F14, + 0xC9B0, 0x4EF1, 0xC9B1, 0x4F00, 0xC9B2, 0x4EF7, 0xC9B3, 0x4F08, 0xC9B4, 0x4F1D, 0xC9B5, 0x4F02, 0xC9B6, 0x4F05, 0xC9B7, 0x4F22, + 0xC9B8, 0x4F13, 0xC9B9, 0x4F04, 0xC9BA, 0x4EF4, 0xC9BB, 0x4F12, 0xC9BC, 0x51B1, 0xC9BD, 0x5213, 0xC9BE, 0x5209, 0xC9BF, 0x5210, + 0xC9C0, 0x52A6, 0xC9C1, 0x5322, 0xC9C2, 0x531F, 0xC9C3, 0x534D, 0xC9C4, 0x538A, 0xC9C5, 0x5407, 0xC9C6, 0x56E1, 0xC9C7, 0x56DF, + 0xC9C8, 0x572E, 0xC9C9, 0x572A, 0xC9CA, 0x5734, 0xC9CB, 0x593C, 0xC9CC, 0x5980, 0xC9CD, 0x597C, 0xC9CE, 0x5985, 0xC9CF, 0x597B, + 0xC9D0, 0x597E, 0xC9D1, 0x5977, 0xC9D2, 0x597F, 0xC9D3, 0x5B56, 0xC9D4, 0x5C15, 0xC9D5, 0x5C25, 0xC9D6, 0x5C7C, 0xC9D7, 0x5C7A, + 0xC9D8, 0x5C7B, 0xC9D9, 0x5C7E, 0xC9DA, 0x5DDF, 0xC9DB, 0x5E75, 0xC9DC, 0x5E84, 0xC9DD, 0x5F02, 0xC9DE, 0x5F1A, 0xC9DF, 0x5F74, + 0xC9E0, 0x5FD5, 0xC9E1, 0x5FD4, 0xC9E2, 0x5FCF, 0xC9E3, 0x625C, 0xC9E4, 0x625E, 0xC9E5, 0x6264, 0xC9E6, 0x6261, 0xC9E7, 0x6266, + 0xC9E8, 0x6262, 0xC9E9, 0x6259, 0xC9EA, 0x6260, 0xC9EB, 0x625A, 0xC9EC, 0x6265, 0xC9ED, 0x65EF, 0xC9EE, 0x65EE, 0xC9EF, 0x673E, + 0xC9F0, 0x6739, 0xC9F1, 0x6738, 0xC9F2, 0x673B, 0xC9F3, 0x673A, 0xC9F4, 0x673F, 0xC9F5, 0x673C, 0xC9F6, 0x6733, 0xC9F7, 0x6C18, + 0xC9F8, 0x6C46, 0xC9F9, 0x6C52, 0xC9FA, 0x6C5C, 0xC9FB, 0x6C4F, 0xC9FC, 0x6C4A, 0xC9FD, 0x6C54, 0xC9FE, 0x6C4B, 0xCA40, 0x6C4C, + 0xCA41, 0x7071, 0xCA42, 0x725E, 0xCA43, 0x72B4, 0xCA44, 0x72B5, 0xCA45, 0x738E, 0xCA46, 0x752A, 0xCA47, 0x767F, 0xCA48, 0x7A75, + 0xCA49, 0x7F51, 0xCA4A, 0x8278, 0xCA4B, 0x827C, 0xCA4C, 0x8280, 0xCA4D, 0x827D, 0xCA4E, 0x827F, 0xCA4F, 0x864D, 0xCA50, 0x897E, + 0xCA51, 0x9099, 0xCA52, 0x9097, 0xCA53, 0x9098, 0xCA54, 0x909B, 0xCA55, 0x9094, 0xCA56, 0x9622, 0xCA57, 0x9624, 0xCA58, 0x9620, + 0xCA59, 0x9623, 0xCA5A, 0x4F56, 0xCA5B, 0x4F3B, 0xCA5C, 0x4F62, 0xCA5D, 0x4F49, 0xCA5E, 0x4F53, 0xCA5F, 0x4F64, 0xCA60, 0x4F3E, + 0xCA61, 0x4F67, 0xCA62, 0x4F52, 0xCA63, 0x4F5F, 0xCA64, 0x4F41, 0xCA65, 0x4F58, 0xCA66, 0x4F2D, 0xCA67, 0x4F33, 0xCA68, 0x4F3F, + 0xCA69, 0x4F61, 0xCA6A, 0x518F, 0xCA6B, 0x51B9, 0xCA6C, 0x521C, 0xCA6D, 0x521E, 0xCA6E, 0x5221, 0xCA6F, 0x52AD, 0xCA70, 0x52AE, + 0xCA71, 0x5309, 0xCA72, 0x5363, 0xCA73, 0x5372, 0xCA74, 0x538E, 0xCA75, 0x538F, 0xCA76, 0x5430, 0xCA77, 0x5437, 0xCA78, 0x542A, + 0xCA79, 0x5454, 0xCA7A, 0x5445, 0xCA7B, 0x5419, 0xCA7C, 0x541C, 0xCA7D, 0x5425, 0xCA7E, 0x5418, 0xCAA1, 0x543D, 0xCAA2, 0x544F, + 0xCAA3, 0x5441, 0xCAA4, 0x5428, 0xCAA5, 0x5424, 0xCAA6, 0x5447, 0xCAA7, 0x56EE, 0xCAA8, 0x56E7, 0xCAA9, 0x56E5, 0xCAAA, 0x5741, + 0xCAAB, 0x5745, 0xCAAC, 0x574C, 0xCAAD, 0x5749, 0xCAAE, 0x574B, 0xCAAF, 0x5752, 0xCAB0, 0x5906, 0xCAB1, 0x5940, 0xCAB2, 0x59A6, + 0xCAB3, 0x5998, 0xCAB4, 0x59A0, 0xCAB5, 0x5997, 0xCAB6, 0x598E, 0xCAB7, 0x59A2, 0xCAB8, 0x5990, 0xCAB9, 0x598F, 0xCABA, 0x59A7, + 0xCABB, 0x59A1, 0xCABC, 0x5B8E, 0xCABD, 0x5B92, 0xCABE, 0x5C28, 0xCABF, 0x5C2A, 0xCAC0, 0x5C8D, 0xCAC1, 0x5C8F, 0xCAC2, 0x5C88, + 0xCAC3, 0x5C8B, 0xCAC4, 0x5C89, 0xCAC5, 0x5C92, 0xCAC6, 0x5C8A, 0xCAC7, 0x5C86, 0xCAC8, 0x5C93, 0xCAC9, 0x5C95, 0xCACA, 0x5DE0, + 0xCACB, 0x5E0A, 0xCACC, 0x5E0E, 0xCACD, 0x5E8B, 0xCACE, 0x5E89, 0xCACF, 0x5E8C, 0xCAD0, 0x5E88, 0xCAD1, 0x5E8D, 0xCAD2, 0x5F05, + 0xCAD3, 0x5F1D, 0xCAD4, 0x5F78, 0xCAD5, 0x5F76, 0xCAD6, 0x5FD2, 0xCAD7, 0x5FD1, 0xCAD8, 0x5FD0, 0xCAD9, 0x5FED, 0xCADA, 0x5FE8, + 0xCADB, 0x5FEE, 0xCADC, 0x5FF3, 0xCADD, 0x5FE1, 0xCADE, 0x5FE4, 0xCADF, 0x5FE3, 0xCAE0, 0x5FFA, 0xCAE1, 0x5FEF, 0xCAE2, 0x5FF7, + 0xCAE3, 0x5FFB, 0xCAE4, 0x6000, 0xCAE5, 0x5FF4, 0xCAE6, 0x623A, 0xCAE7, 0x6283, 0xCAE8, 0x628C, 0xCAE9, 0x628E, 0xCAEA, 0x628F, + 0xCAEB, 0x6294, 0xCAEC, 0x6287, 0xCAED, 0x6271, 0xCAEE, 0x627B, 0xCAEF, 0x627A, 0xCAF0, 0x6270, 0xCAF1, 0x6281, 0xCAF2, 0x6288, + 0xCAF3, 0x6277, 0xCAF4, 0x627D, 0xCAF5, 0x6272, 0xCAF6, 0x6274, 0xCAF7, 0x6537, 0xCAF8, 0x65F0, 0xCAF9, 0x65F4, 0xCAFA, 0x65F3, + 0xCAFB, 0x65F2, 0xCAFC, 0x65F5, 0xCAFD, 0x6745, 0xCAFE, 0x6747, 0xCB40, 0x6759, 0xCB41, 0x6755, 0xCB42, 0x674C, 0xCB43, 0x6748, + 0xCB44, 0x675D, 0xCB45, 0x674D, 0xCB46, 0x675A, 0xCB47, 0x674B, 0xCB48, 0x6BD0, 0xCB49, 0x6C19, 0xCB4A, 0x6C1A, 0xCB4B, 0x6C78, + 0xCB4C, 0x6C67, 0xCB4D, 0x6C6B, 0xCB4E, 0x6C84, 0xCB4F, 0x6C8B, 0xCB50, 0x6C8F, 0xCB51, 0x6C71, 0xCB52, 0x6C6F, 0xCB53, 0x6C69, + 0xCB54, 0x6C9A, 0xCB55, 0x6C6D, 0xCB56, 0x6C87, 0xCB57, 0x6C95, 0xCB58, 0x6C9C, 0xCB59, 0x6C66, 0xCB5A, 0x6C73, 0xCB5B, 0x6C65, + 0xCB5C, 0x6C7B, 0xCB5D, 0x6C8E, 0xCB5E, 0x7074, 0xCB5F, 0x707A, 0xCB60, 0x7263, 0xCB61, 0x72BF, 0xCB62, 0x72BD, 0xCB63, 0x72C3, + 0xCB64, 0x72C6, 0xCB65, 0x72C1, 0xCB66, 0x72BA, 0xCB67, 0x72C5, 0xCB68, 0x7395, 0xCB69, 0x7397, 0xCB6A, 0x7393, 0xCB6B, 0x7394, + 0xCB6C, 0x7392, 0xCB6D, 0x753A, 0xCB6E, 0x7539, 0xCB6F, 0x7594, 0xCB70, 0x7595, 0xCB71, 0x7681, 0xCB72, 0x793D, 0xCB73, 0x8034, + 0xCB74, 0x8095, 0xCB75, 0x8099, 0xCB76, 0x8090, 0xCB77, 0x8092, 0xCB78, 0x809C, 0xCB79, 0x8290, 0xCB7A, 0x828F, 0xCB7B, 0x8285, + 0xCB7C, 0x828E, 0xCB7D, 0x8291, 0xCB7E, 0x8293, 0xCBA1, 0x828A, 0xCBA2, 0x8283, 0xCBA3, 0x8284, 0xCBA4, 0x8C78, 0xCBA5, 0x8FC9, + 0xCBA6, 0x8FBF, 0xCBA7, 0x909F, 0xCBA8, 0x90A1, 0xCBA9, 0x90A5, 0xCBAA, 0x909E, 0xCBAB, 0x90A7, 0xCBAC, 0x90A0, 0xCBAD, 0x9630, + 0xCBAE, 0x9628, 0xCBAF, 0x962F, 0xCBB0, 0x962D, 0xCBB1, 0x4E33, 0xCBB2, 0x4F98, 0xCBB3, 0x4F7C, 0xCBB4, 0x4F85, 0xCBB5, 0x4F7D, + 0xCBB6, 0x4F80, 0xCBB7, 0x4F87, 0xCBB8, 0x4F76, 0xCBB9, 0x4F74, 0xCBBA, 0x4F89, 0xCBBB, 0x4F84, 0xCBBC, 0x4F77, 0xCBBD, 0x4F4C, + 0xCBBE, 0x4F97, 0xCBBF, 0x4F6A, 0xCBC0, 0x4F9A, 0xCBC1, 0x4F79, 0xCBC2, 0x4F81, 0xCBC3, 0x4F78, 0xCBC4, 0x4F90, 0xCBC5, 0x4F9C, + 0xCBC6, 0x4F94, 0xCBC7, 0x4F9E, 0xCBC8, 0x4F92, 0xCBC9, 0x4F82, 0xCBCA, 0x4F95, 0xCBCB, 0x4F6B, 0xCBCC, 0x4F6E, 0xCBCD, 0x519E, + 0xCBCE, 0x51BC, 0xCBCF, 0x51BE, 0xCBD0, 0x5235, 0xCBD1, 0x5232, 0xCBD2, 0x5233, 0xCBD3, 0x5246, 0xCBD4, 0x5231, 0xCBD5, 0x52BC, + 0xCBD6, 0x530A, 0xCBD7, 0x530B, 0xCBD8, 0x533C, 0xCBD9, 0x5392, 0xCBDA, 0x5394, 0xCBDB, 0x5487, 0xCBDC, 0x547F, 0xCBDD, 0x5481, + 0xCBDE, 0x5491, 0xCBDF, 0x5482, 0xCBE0, 0x5488, 0xCBE1, 0x546B, 0xCBE2, 0x547A, 0xCBE3, 0x547E, 0xCBE4, 0x5465, 0xCBE5, 0x546C, + 0xCBE6, 0x5474, 0xCBE7, 0x5466, 0xCBE8, 0x548D, 0xCBE9, 0x546F, 0xCBEA, 0x5461, 0xCBEB, 0x5460, 0xCBEC, 0x5498, 0xCBED, 0x5463, + 0xCBEE, 0x5467, 0xCBEF, 0x5464, 0xCBF0, 0x56F7, 0xCBF1, 0x56F9, 0xCBF2, 0x576F, 0xCBF3, 0x5772, 0xCBF4, 0x576D, 0xCBF5, 0x576B, + 0xCBF6, 0x5771, 0xCBF7, 0x5770, 0xCBF8, 0x5776, 0xCBF9, 0x5780, 0xCBFA, 0x5775, 0xCBFB, 0x577B, 0xCBFC, 0x5773, 0xCBFD, 0x5774, + 0xCBFE, 0x5762, 0xCC40, 0x5768, 0xCC41, 0x577D, 0xCC42, 0x590C, 0xCC43, 0x5945, 0xCC44, 0x59B5, 0xCC45, 0x59BA, 0xCC46, 0x59CF, + 0xCC47, 0x59CE, 0xCC48, 0x59B2, 0xCC49, 0x59CC, 0xCC4A, 0x59C1, 0xCC4B, 0x59B6, 0xCC4C, 0x59BC, 0xCC4D, 0x59C3, 0xCC4E, 0x59D6, + 0xCC4F, 0x59B1, 0xCC50, 0x59BD, 0xCC51, 0x59C0, 0xCC52, 0x59C8, 0xCC53, 0x59B4, 0xCC54, 0x59C7, 0xCC55, 0x5B62, 0xCC56, 0x5B65, + 0xCC57, 0x5B93, 0xCC58, 0x5B95, 0xCC59, 0x5C44, 0xCC5A, 0x5C47, 0xCC5B, 0x5CAE, 0xCC5C, 0x5CA4, 0xCC5D, 0x5CA0, 0xCC5E, 0x5CB5, + 0xCC5F, 0x5CAF, 0xCC60, 0x5CA8, 0xCC61, 0x5CAC, 0xCC62, 0x5C9F, 0xCC63, 0x5CA3, 0xCC64, 0x5CAD, 0xCC65, 0x5CA2, 0xCC66, 0x5CAA, + 0xCC67, 0x5CA7, 0xCC68, 0x5C9D, 0xCC69, 0x5CA5, 0xCC6A, 0x5CB6, 0xCC6B, 0x5CB0, 0xCC6C, 0x5CA6, 0xCC6D, 0x5E17, 0xCC6E, 0x5E14, + 0xCC6F, 0x5E19, 0xCC70, 0x5F28, 0xCC71, 0x5F22, 0xCC72, 0x5F23, 0xCC73, 0x5F24, 0xCC74, 0x5F54, 0xCC75, 0x5F82, 0xCC76, 0x5F7E, + 0xCC77, 0x5F7D, 0xCC78, 0x5FDE, 0xCC79, 0x5FE5, 0xCC7A, 0x602D, 0xCC7B, 0x6026, 0xCC7C, 0x6019, 0xCC7D, 0x6032, 0xCC7E, 0x600B, + 0xCCA1, 0x6034, 0xCCA2, 0x600A, 0xCCA3, 0x6017, 0xCCA4, 0x6033, 0xCCA5, 0x601A, 0xCCA6, 0x601E, 0xCCA7, 0x602C, 0xCCA8, 0x6022, + 0xCCA9, 0x600D, 0xCCAA, 0x6010, 0xCCAB, 0x602E, 0xCCAC, 0x6013, 0xCCAD, 0x6011, 0xCCAE, 0x600C, 0xCCAF, 0x6009, 0xCCB0, 0x601C, + 0xCCB1, 0x6214, 0xCCB2, 0x623D, 0xCCB3, 0x62AD, 0xCCB4, 0x62B4, 0xCCB5, 0x62D1, 0xCCB6, 0x62BE, 0xCCB7, 0x62AA, 0xCCB8, 0x62B6, + 0xCCB9, 0x62CA, 0xCCBA, 0x62AE, 0xCCBB, 0x62B3, 0xCCBC, 0x62AF, 0xCCBD, 0x62BB, 0xCCBE, 0x62A9, 0xCCBF, 0x62B0, 0xCCC0, 0x62B8, + 0xCCC1, 0x653D, 0xCCC2, 0x65A8, 0xCCC3, 0x65BB, 0xCCC4, 0x6609, 0xCCC5, 0x65FC, 0xCCC6, 0x6604, 0xCCC7, 0x6612, 0xCCC8, 0x6608, + 0xCCC9, 0x65FB, 0xCCCA, 0x6603, 0xCCCB, 0x660B, 0xCCCC, 0x660D, 0xCCCD, 0x6605, 0xCCCE, 0x65FD, 0xCCCF, 0x6611, 0xCCD0, 0x6610, + 0xCCD1, 0x66F6, 0xCCD2, 0x670A, 0xCCD3, 0x6785, 0xCCD4, 0x676C, 0xCCD5, 0x678E, 0xCCD6, 0x6792, 0xCCD7, 0x6776, 0xCCD8, 0x677B, + 0xCCD9, 0x6798, 0xCCDA, 0x6786, 0xCCDB, 0x6784, 0xCCDC, 0x6774, 0xCCDD, 0x678D, 0xCCDE, 0x678C, 0xCCDF, 0x677A, 0xCCE0, 0x679F, + 0xCCE1, 0x6791, 0xCCE2, 0x6799, 0xCCE3, 0x6783, 0xCCE4, 0x677D, 0xCCE5, 0x6781, 0xCCE6, 0x6778, 0xCCE7, 0x6779, 0xCCE8, 0x6794, + 0xCCE9, 0x6B25, 0xCCEA, 0x6B80, 0xCCEB, 0x6B7E, 0xCCEC, 0x6BDE, 0xCCED, 0x6C1D, 0xCCEE, 0x6C93, 0xCCEF, 0x6CEC, 0xCCF0, 0x6CEB, + 0xCCF1, 0x6CEE, 0xCCF2, 0x6CD9, 0xCCF3, 0x6CB6, 0xCCF4, 0x6CD4, 0xCCF5, 0x6CAD, 0xCCF6, 0x6CE7, 0xCCF7, 0x6CB7, 0xCCF8, 0x6CD0, + 0xCCF9, 0x6CC2, 0xCCFA, 0x6CBA, 0xCCFB, 0x6CC3, 0xCCFC, 0x6CC6, 0xCCFD, 0x6CED, 0xCCFE, 0x6CF2, 0xCD40, 0x6CD2, 0xCD41, 0x6CDD, + 0xCD42, 0x6CB4, 0xCD43, 0x6C8A, 0xCD44, 0x6C9D, 0xCD45, 0x6C80, 0xCD46, 0x6CDE, 0xCD47, 0x6CC0, 0xCD48, 0x6D30, 0xCD49, 0x6CCD, + 0xCD4A, 0x6CC7, 0xCD4B, 0x6CB0, 0xCD4C, 0x6CF9, 0xCD4D, 0x6CCF, 0xCD4E, 0x6CE9, 0xCD4F, 0x6CD1, 0xCD50, 0x7094, 0xCD51, 0x7098, + 0xCD52, 0x7085, 0xCD53, 0x7093, 0xCD54, 0x7086, 0xCD55, 0x7084, 0xCD56, 0x7091, 0xCD57, 0x7096, 0xCD58, 0x7082, 0xCD59, 0x709A, + 0xCD5A, 0x7083, 0xCD5B, 0x726A, 0xCD5C, 0x72D6, 0xCD5D, 0x72CB, 0xCD5E, 0x72D8, 0xCD5F, 0x72C9, 0xCD60, 0x72DC, 0xCD61, 0x72D2, + 0xCD62, 0x72D4, 0xCD63, 0x72DA, 0xCD64, 0x72CC, 0xCD65, 0x72D1, 0xCD66, 0x73A4, 0xCD67, 0x73A1, 0xCD68, 0x73AD, 0xCD69, 0x73A6, + 0xCD6A, 0x73A2, 0xCD6B, 0x73A0, 0xCD6C, 0x73AC, 0xCD6D, 0x739D, 0xCD6E, 0x74DD, 0xCD6F, 0x74E8, 0xCD70, 0x753F, 0xCD71, 0x7540, + 0xCD72, 0x753E, 0xCD73, 0x758C, 0xCD74, 0x7598, 0xCD75, 0x76AF, 0xCD76, 0x76F3, 0xCD77, 0x76F1, 0xCD78, 0x76F0, 0xCD79, 0x76F5, + 0xCD7A, 0x77F8, 0xCD7B, 0x77FC, 0xCD7C, 0x77F9, 0xCD7D, 0x77FB, 0xCD7E, 0x77FA, 0xCDA1, 0x77F7, 0xCDA2, 0x7942, 0xCDA3, 0x793F, + 0xCDA4, 0x79C5, 0xCDA5, 0x7A78, 0xCDA6, 0x7A7B, 0xCDA7, 0x7AFB, 0xCDA8, 0x7C75, 0xCDA9, 0x7CFD, 0xCDAA, 0x8035, 0xCDAB, 0x808F, + 0xCDAC, 0x80AE, 0xCDAD, 0x80A3, 0xCDAE, 0x80B8, 0xCDAF, 0x80B5, 0xCDB0, 0x80AD, 0xCDB1, 0x8220, 0xCDB2, 0x82A0, 0xCDB3, 0x82C0, + 0xCDB4, 0x82AB, 0xCDB5, 0x829A, 0xCDB6, 0x8298, 0xCDB7, 0x829B, 0xCDB8, 0x82B5, 0xCDB9, 0x82A7, 0xCDBA, 0x82AE, 0xCDBB, 0x82BC, + 0xCDBC, 0x829E, 0xCDBD, 0x82BA, 0xCDBE, 0x82B4, 0xCDBF, 0x82A8, 0xCDC0, 0x82A1, 0xCDC1, 0x82A9, 0xCDC2, 0x82C2, 0xCDC3, 0x82A4, + 0xCDC4, 0x82C3, 0xCDC5, 0x82B6, 0xCDC6, 0x82A2, 0xCDC7, 0x8670, 0xCDC8, 0x866F, 0xCDC9, 0x866D, 0xCDCA, 0x866E, 0xCDCB, 0x8C56, + 0xCDCC, 0x8FD2, 0xCDCD, 0x8FCB, 0xCDCE, 0x8FD3, 0xCDCF, 0x8FCD, 0xCDD0, 0x8FD6, 0xCDD1, 0x8FD5, 0xCDD2, 0x8FD7, 0xCDD3, 0x90B2, + 0xCDD4, 0x90B4, 0xCDD5, 0x90AF, 0xCDD6, 0x90B3, 0xCDD7, 0x90B0, 0xCDD8, 0x9639, 0xCDD9, 0x963D, 0xCDDA, 0x963C, 0xCDDB, 0x963A, + 0xCDDC, 0x9643, 0xCDDD, 0x4FCD, 0xCDDE, 0x4FC5, 0xCDDF, 0x4FD3, 0xCDE0, 0x4FB2, 0xCDE1, 0x4FC9, 0xCDE2, 0x4FCB, 0xCDE3, 0x4FC1, + 0xCDE4, 0x4FD4, 0xCDE5, 0x4FDC, 0xCDE6, 0x4FD9, 0xCDE7, 0x4FBB, 0xCDE8, 0x4FB3, 0xCDE9, 0x4FDB, 0xCDEA, 0x4FC7, 0xCDEB, 0x4FD6, + 0xCDEC, 0x4FBA, 0xCDED, 0x4FC0, 0xCDEE, 0x4FB9, 0xCDEF, 0x4FEC, 0xCDF0, 0x5244, 0xCDF1, 0x5249, 0xCDF2, 0x52C0, 0xCDF3, 0x52C2, + 0xCDF4, 0x533D, 0xCDF5, 0x537C, 0xCDF6, 0x5397, 0xCDF7, 0x5396, 0xCDF8, 0x5399, 0xCDF9, 0x5398, 0xCDFA, 0x54BA, 0xCDFB, 0x54A1, + 0xCDFC, 0x54AD, 0xCDFD, 0x54A5, 0xCDFE, 0x54CF, 0xCE40, 0x54C3, 0xCE41, 0x830D, 0xCE42, 0x54B7, 0xCE43, 0x54AE, 0xCE44, 0x54D6, + 0xCE45, 0x54B6, 0xCE46, 0x54C5, 0xCE47, 0x54C6, 0xCE48, 0x54A0, 0xCE49, 0x5470, 0xCE4A, 0x54BC, 0xCE4B, 0x54A2, 0xCE4C, 0x54BE, + 0xCE4D, 0x5472, 0xCE4E, 0x54DE, 0xCE4F, 0x54B0, 0xCE50, 0x57B5, 0xCE51, 0x579E, 0xCE52, 0x579F, 0xCE53, 0x57A4, 0xCE54, 0x578C, + 0xCE55, 0x5797, 0xCE56, 0x579D, 0xCE57, 0x579B, 0xCE58, 0x5794, 0xCE59, 0x5798, 0xCE5A, 0x578F, 0xCE5B, 0x5799, 0xCE5C, 0x57A5, + 0xCE5D, 0x579A, 0xCE5E, 0x5795, 0xCE5F, 0x58F4, 0xCE60, 0x590D, 0xCE61, 0x5953, 0xCE62, 0x59E1, 0xCE63, 0x59DE, 0xCE64, 0x59EE, + 0xCE65, 0x5A00, 0xCE66, 0x59F1, 0xCE67, 0x59DD, 0xCE68, 0x59FA, 0xCE69, 0x59FD, 0xCE6A, 0x59FC, 0xCE6B, 0x59F6, 0xCE6C, 0x59E4, + 0xCE6D, 0x59F2, 0xCE6E, 0x59F7, 0xCE6F, 0x59DB, 0xCE70, 0x59E9, 0xCE71, 0x59F3, 0xCE72, 0x59F5, 0xCE73, 0x59E0, 0xCE74, 0x59FE, + 0xCE75, 0x59F4, 0xCE76, 0x59ED, 0xCE77, 0x5BA8, 0xCE78, 0x5C4C, 0xCE79, 0x5CD0, 0xCE7A, 0x5CD8, 0xCE7B, 0x5CCC, 0xCE7C, 0x5CD7, + 0xCE7D, 0x5CCB, 0xCE7E, 0x5CDB, 0xCEA1, 0x5CDE, 0xCEA2, 0x5CDA, 0xCEA3, 0x5CC9, 0xCEA4, 0x5CC7, 0xCEA5, 0x5CCA, 0xCEA6, 0x5CD6, + 0xCEA7, 0x5CD3, 0xCEA8, 0x5CD4, 0xCEA9, 0x5CCF, 0xCEAA, 0x5CC8, 0xCEAB, 0x5CC6, 0xCEAC, 0x5CCE, 0xCEAD, 0x5CDF, 0xCEAE, 0x5CF8, + 0xCEAF, 0x5DF9, 0xCEB0, 0x5E21, 0xCEB1, 0x5E22, 0xCEB2, 0x5E23, 0xCEB3, 0x5E20, 0xCEB4, 0x5E24, 0xCEB5, 0x5EB0, 0xCEB6, 0x5EA4, + 0xCEB7, 0x5EA2, 0xCEB8, 0x5E9B, 0xCEB9, 0x5EA3, 0xCEBA, 0x5EA5, 0xCEBB, 0x5F07, 0xCEBC, 0x5F2E, 0xCEBD, 0x5F56, 0xCEBE, 0x5F86, + 0xCEBF, 0x6037, 0xCEC0, 0x6039, 0xCEC1, 0x6054, 0xCEC2, 0x6072, 0xCEC3, 0x605E, 0xCEC4, 0x6045, 0xCEC5, 0x6053, 0xCEC6, 0x6047, + 0xCEC7, 0x6049, 0xCEC8, 0x605B, 0xCEC9, 0x604C, 0xCECA, 0x6040, 0xCECB, 0x6042, 0xCECC, 0x605F, 0xCECD, 0x6024, 0xCECE, 0x6044, + 0xCECF, 0x6058, 0xCED0, 0x6066, 0xCED1, 0x606E, 0xCED2, 0x6242, 0xCED3, 0x6243, 0xCED4, 0x62CF, 0xCED5, 0x630D, 0xCED6, 0x630B, + 0xCED7, 0x62F5, 0xCED8, 0x630E, 0xCED9, 0x6303, 0xCEDA, 0x62EB, 0xCEDB, 0x62F9, 0xCEDC, 0x630F, 0xCEDD, 0x630C, 0xCEDE, 0x62F8, + 0xCEDF, 0x62F6, 0xCEE0, 0x6300, 0xCEE1, 0x6313, 0xCEE2, 0x6314, 0xCEE3, 0x62FA, 0xCEE4, 0x6315, 0xCEE5, 0x62FB, 0xCEE6, 0x62F0, + 0xCEE7, 0x6541, 0xCEE8, 0x6543, 0xCEE9, 0x65AA, 0xCEEA, 0x65BF, 0xCEEB, 0x6636, 0xCEEC, 0x6621, 0xCEED, 0x6632, 0xCEEE, 0x6635, + 0xCEEF, 0x661C, 0xCEF0, 0x6626, 0xCEF1, 0x6622, 0xCEF2, 0x6633, 0xCEF3, 0x662B, 0xCEF4, 0x663A, 0xCEF5, 0x661D, 0xCEF6, 0x6634, + 0xCEF7, 0x6639, 0xCEF8, 0x662E, 0xCEF9, 0x670F, 0xCEFA, 0x6710, 0xCEFB, 0x67C1, 0xCEFC, 0x67F2, 0xCEFD, 0x67C8, 0xCEFE, 0x67BA, + 0xCF40, 0x67DC, 0xCF41, 0x67BB, 0xCF42, 0x67F8, 0xCF43, 0x67D8, 0xCF44, 0x67C0, 0xCF45, 0x67B7, 0xCF46, 0x67C5, 0xCF47, 0x67EB, + 0xCF48, 0x67E4, 0xCF49, 0x67DF, 0xCF4A, 0x67B5, 0xCF4B, 0x67CD, 0xCF4C, 0x67B3, 0xCF4D, 0x67F7, 0xCF4E, 0x67F6, 0xCF4F, 0x67EE, + 0xCF50, 0x67E3, 0xCF51, 0x67C2, 0xCF52, 0x67B9, 0xCF53, 0x67CE, 0xCF54, 0x67E7, 0xCF55, 0x67F0, 0xCF56, 0x67B2, 0xCF57, 0x67FC, + 0xCF58, 0x67C6, 0xCF59, 0x67ED, 0xCF5A, 0x67CC, 0xCF5B, 0x67AE, 0xCF5C, 0x67E6, 0xCF5D, 0x67DB, 0xCF5E, 0x67FA, 0xCF5F, 0x67C9, + 0xCF60, 0x67CA, 0xCF61, 0x67C3, 0xCF62, 0x67EA, 0xCF63, 0x67CB, 0xCF64, 0x6B28, 0xCF65, 0x6B82, 0xCF66, 0x6B84, 0xCF67, 0x6BB6, + 0xCF68, 0x6BD6, 0xCF69, 0x6BD8, 0xCF6A, 0x6BE0, 0xCF6B, 0x6C20, 0xCF6C, 0x6C21, 0xCF6D, 0x6D28, 0xCF6E, 0x6D34, 0xCF6F, 0x6D2D, + 0xCF70, 0x6D1F, 0xCF71, 0x6D3C, 0xCF72, 0x6D3F, 0xCF73, 0x6D12, 0xCF74, 0x6D0A, 0xCF75, 0x6CDA, 0xCF76, 0x6D33, 0xCF77, 0x6D04, + 0xCF78, 0x6D19, 0xCF79, 0x6D3A, 0xCF7A, 0x6D1A, 0xCF7B, 0x6D11, 0xCF7C, 0x6D00, 0xCF7D, 0x6D1D, 0xCF7E, 0x6D42, 0xCFA1, 0x6D01, + 0xCFA2, 0x6D18, 0xCFA3, 0x6D37, 0xCFA4, 0x6D03, 0xCFA5, 0x6D0F, 0xCFA6, 0x6D40, 0xCFA7, 0x6D07, 0xCFA8, 0x6D20, 0xCFA9, 0x6D2C, + 0xCFAA, 0x6D08, 0xCFAB, 0x6D22, 0xCFAC, 0x6D09, 0xCFAD, 0x6D10, 0xCFAE, 0x70B7, 0xCFAF, 0x709F, 0xCFB0, 0x70BE, 0xCFB1, 0x70B1, + 0xCFB2, 0x70B0, 0xCFB3, 0x70A1, 0xCFB4, 0x70B4, 0xCFB5, 0x70B5, 0xCFB6, 0x70A9, 0xCFB7, 0x7241, 0xCFB8, 0x7249, 0xCFB9, 0x724A, + 0xCFBA, 0x726C, 0xCFBB, 0x7270, 0xCFBC, 0x7273, 0xCFBD, 0x726E, 0xCFBE, 0x72CA, 0xCFBF, 0x72E4, 0xCFC0, 0x72E8, 0xCFC1, 0x72EB, + 0xCFC2, 0x72DF, 0xCFC3, 0x72EA, 0xCFC4, 0x72E6, 0xCFC5, 0x72E3, 0xCFC6, 0x7385, 0xCFC7, 0x73CC, 0xCFC8, 0x73C2, 0xCFC9, 0x73C8, + 0xCFCA, 0x73C5, 0xCFCB, 0x73B9, 0xCFCC, 0x73B6, 0xCFCD, 0x73B5, 0xCFCE, 0x73B4, 0xCFCF, 0x73EB, 0xCFD0, 0x73BF, 0xCFD1, 0x73C7, + 0xCFD2, 0x73BE, 0xCFD3, 0x73C3, 0xCFD4, 0x73C6, 0xCFD5, 0x73B8, 0xCFD6, 0x73CB, 0xCFD7, 0x74EC, 0xCFD8, 0x74EE, 0xCFD9, 0x752E, + 0xCFDA, 0x7547, 0xCFDB, 0x7548, 0xCFDC, 0x75A7, 0xCFDD, 0x75AA, 0xCFDE, 0x7679, 0xCFDF, 0x76C4, 0xCFE0, 0x7708, 0xCFE1, 0x7703, + 0xCFE2, 0x7704, 0xCFE3, 0x7705, 0xCFE4, 0x770A, 0xCFE5, 0x76F7, 0xCFE6, 0x76FB, 0xCFE7, 0x76FA, 0xCFE8, 0x77E7, 0xCFE9, 0x77E8, + 0xCFEA, 0x7806, 0xCFEB, 0x7811, 0xCFEC, 0x7812, 0xCFED, 0x7805, 0xCFEE, 0x7810, 0xCFEF, 0x780F, 0xCFF0, 0x780E, 0xCFF1, 0x7809, + 0xCFF2, 0x7803, 0xCFF3, 0x7813, 0xCFF4, 0x794A, 0xCFF5, 0x794C, 0xCFF6, 0x794B, 0xCFF7, 0x7945, 0xCFF8, 0x7944, 0xCFF9, 0x79D5, + 0xCFFA, 0x79CD, 0xCFFB, 0x79CF, 0xCFFC, 0x79D6, 0xCFFD, 0x79CE, 0xCFFE, 0x7A80, 0xD040, 0x7A7E, 0xD041, 0x7AD1, 0xD042, 0x7B00, + 0xD043, 0x7B01, 0xD044, 0x7C7A, 0xD045, 0x7C78, 0xD046, 0x7C79, 0xD047, 0x7C7F, 0xD048, 0x7C80, 0xD049, 0x7C81, 0xD04A, 0x7D03, + 0xD04B, 0x7D08, 0xD04C, 0x7D01, 0xD04D, 0x7F58, 0xD04E, 0x7F91, 0xD04F, 0x7F8D, 0xD050, 0x7FBE, 0xD051, 0x8007, 0xD052, 0x800E, + 0xD053, 0x800F, 0xD054, 0x8014, 0xD055, 0x8037, 0xD056, 0x80D8, 0xD057, 0x80C7, 0xD058, 0x80E0, 0xD059, 0x80D1, 0xD05A, 0x80C8, + 0xD05B, 0x80C2, 0xD05C, 0x80D0, 0xD05D, 0x80C5, 0xD05E, 0x80E3, 0xD05F, 0x80D9, 0xD060, 0x80DC, 0xD061, 0x80CA, 0xD062, 0x80D5, + 0xD063, 0x80C9, 0xD064, 0x80CF, 0xD065, 0x80D7, 0xD066, 0x80E6, 0xD067, 0x80CD, 0xD068, 0x81FF, 0xD069, 0x8221, 0xD06A, 0x8294, + 0xD06B, 0x82D9, 0xD06C, 0x82FE, 0xD06D, 0x82F9, 0xD06E, 0x8307, 0xD06F, 0x82E8, 0xD070, 0x8300, 0xD071, 0x82D5, 0xD072, 0x833A, + 0xD073, 0x82EB, 0xD074, 0x82D6, 0xD075, 0x82F4, 0xD076, 0x82EC, 0xD077, 0x82E1, 0xD078, 0x82F2, 0xD079, 0x82F5, 0xD07A, 0x830C, + 0xD07B, 0x82FB, 0xD07C, 0x82F6, 0xD07D, 0x82F0, 0xD07E, 0x82EA, 0xD0A1, 0x82E4, 0xD0A2, 0x82E0, 0xD0A3, 0x82FA, 0xD0A4, 0x82F3, + 0xD0A5, 0x82ED, 0xD0A6, 0x8677, 0xD0A7, 0x8674, 0xD0A8, 0x867C, 0xD0A9, 0x8673, 0xD0AA, 0x8841, 0xD0AB, 0x884E, 0xD0AC, 0x8867, + 0xD0AD, 0x886A, 0xD0AE, 0x8869, 0xD0AF, 0x89D3, 0xD0B0, 0x8A04, 0xD0B1, 0x8A07, 0xD0B2, 0x8D72, 0xD0B3, 0x8FE3, 0xD0B4, 0x8FE1, + 0xD0B5, 0x8FEE, 0xD0B6, 0x8FE0, 0xD0B7, 0x90F1, 0xD0B8, 0x90BD, 0xD0B9, 0x90BF, 0xD0BA, 0x90D5, 0xD0BB, 0x90C5, 0xD0BC, 0x90BE, + 0xD0BD, 0x90C7, 0xD0BE, 0x90CB, 0xD0BF, 0x90C8, 0xD0C0, 0x91D4, 0xD0C1, 0x91D3, 0xD0C2, 0x9654, 0xD0C3, 0x964F, 0xD0C4, 0x9651, + 0xD0C5, 0x9653, 0xD0C6, 0x964A, 0xD0C7, 0x964E, 0xD0C8, 0x501E, 0xD0C9, 0x5005, 0xD0CA, 0x5007, 0xD0CB, 0x5013, 0xD0CC, 0x5022, + 0xD0CD, 0x5030, 0xD0CE, 0x501B, 0xD0CF, 0x4FF5, 0xD0D0, 0x4FF4, 0xD0D1, 0x5033, 0xD0D2, 0x5037, 0xD0D3, 0x502C, 0xD0D4, 0x4FF6, + 0xD0D5, 0x4FF7, 0xD0D6, 0x5017, 0xD0D7, 0x501C, 0xD0D8, 0x5020, 0xD0D9, 0x5027, 0xD0DA, 0x5035, 0xD0DB, 0x502F, 0xD0DC, 0x5031, + 0xD0DD, 0x500E, 0xD0DE, 0x515A, 0xD0DF, 0x5194, 0xD0E0, 0x5193, 0xD0E1, 0x51CA, 0xD0E2, 0x51C4, 0xD0E3, 0x51C5, 0xD0E4, 0x51C8, + 0xD0E5, 0x51CE, 0xD0E6, 0x5261, 0xD0E7, 0x525A, 0xD0E8, 0x5252, 0xD0E9, 0x525E, 0xD0EA, 0x525F, 0xD0EB, 0x5255, 0xD0EC, 0x5262, + 0xD0ED, 0x52CD, 0xD0EE, 0x530E, 0xD0EF, 0x539E, 0xD0F0, 0x5526, 0xD0F1, 0x54E2, 0xD0F2, 0x5517, 0xD0F3, 0x5512, 0xD0F4, 0x54E7, + 0xD0F5, 0x54F3, 0xD0F6, 0x54E4, 0xD0F7, 0x551A, 0xD0F8, 0x54FF, 0xD0F9, 0x5504, 0xD0FA, 0x5508, 0xD0FB, 0x54EB, 0xD0FC, 0x5511, + 0xD0FD, 0x5505, 0xD0FE, 0x54F1, 0xD140, 0x550A, 0xD141, 0x54FB, 0xD142, 0x54F7, 0xD143, 0x54F8, 0xD144, 0x54E0, 0xD145, 0x550E, + 0xD146, 0x5503, 0xD147, 0x550B, 0xD148, 0x5701, 0xD149, 0x5702, 0xD14A, 0x57CC, 0xD14B, 0x5832, 0xD14C, 0x57D5, 0xD14D, 0x57D2, + 0xD14E, 0x57BA, 0xD14F, 0x57C6, 0xD150, 0x57BD, 0xD151, 0x57BC, 0xD152, 0x57B8, 0xD153, 0x57B6, 0xD154, 0x57BF, 0xD155, 0x57C7, + 0xD156, 0x57D0, 0xD157, 0x57B9, 0xD158, 0x57C1, 0xD159, 0x590E, 0xD15A, 0x594A, 0xD15B, 0x5A19, 0xD15C, 0x5A16, 0xD15D, 0x5A2D, + 0xD15E, 0x5A2E, 0xD15F, 0x5A15, 0xD160, 0x5A0F, 0xD161, 0x5A17, 0xD162, 0x5A0A, 0xD163, 0x5A1E, 0xD164, 0x5A33, 0xD165, 0x5B6C, + 0xD166, 0x5BA7, 0xD167, 0x5BAD, 0xD168, 0x5BAC, 0xD169, 0x5C03, 0xD16A, 0x5C56, 0xD16B, 0x5C54, 0xD16C, 0x5CEC, 0xD16D, 0x5CFF, + 0xD16E, 0x5CEE, 0xD16F, 0x5CF1, 0xD170, 0x5CF7, 0xD171, 0x5D00, 0xD172, 0x5CF9, 0xD173, 0x5E29, 0xD174, 0x5E28, 0xD175, 0x5EA8, + 0xD176, 0x5EAE, 0xD177, 0x5EAA, 0xD178, 0x5EAC, 0xD179, 0x5F33, 0xD17A, 0x5F30, 0xD17B, 0x5F67, 0xD17C, 0x605D, 0xD17D, 0x605A, + 0xD17E, 0x6067, 0xD1A1, 0x6041, 0xD1A2, 0x60A2, 0xD1A3, 0x6088, 0xD1A4, 0x6080, 0xD1A5, 0x6092, 0xD1A6, 0x6081, 0xD1A7, 0x609D, + 0xD1A8, 0x6083, 0xD1A9, 0x6095, 0xD1AA, 0x609B, 0xD1AB, 0x6097, 0xD1AC, 0x6087, 0xD1AD, 0x609C, 0xD1AE, 0x608E, 0xD1AF, 0x6219, + 0xD1B0, 0x6246, 0xD1B1, 0x62F2, 0xD1B2, 0x6310, 0xD1B3, 0x6356, 0xD1B4, 0x632C, 0xD1B5, 0x6344, 0xD1B6, 0x6345, 0xD1B7, 0x6336, + 0xD1B8, 0x6343, 0xD1B9, 0x63E4, 0xD1BA, 0x6339, 0xD1BB, 0x634B, 0xD1BC, 0x634A, 0xD1BD, 0x633C, 0xD1BE, 0x6329, 0xD1BF, 0x6341, + 0xD1C0, 0x6334, 0xD1C1, 0x6358, 0xD1C2, 0x6354, 0xD1C3, 0x6359, 0xD1C4, 0x632D, 0xD1C5, 0x6347, 0xD1C6, 0x6333, 0xD1C7, 0x635A, + 0xD1C8, 0x6351, 0xD1C9, 0x6338, 0xD1CA, 0x6357, 0xD1CB, 0x6340, 0xD1CC, 0x6348, 0xD1CD, 0x654A, 0xD1CE, 0x6546, 0xD1CF, 0x65C6, + 0xD1D0, 0x65C3, 0xD1D1, 0x65C4, 0xD1D2, 0x65C2, 0xD1D3, 0x664A, 0xD1D4, 0x665F, 0xD1D5, 0x6647, 0xD1D6, 0x6651, 0xD1D7, 0x6712, + 0xD1D8, 0x6713, 0xD1D9, 0x681F, 0xD1DA, 0x681A, 0xD1DB, 0x6849, 0xD1DC, 0x6832, 0xD1DD, 0x6833, 0xD1DE, 0x683B, 0xD1DF, 0x684B, + 0xD1E0, 0x684F, 0xD1E1, 0x6816, 0xD1E2, 0x6831, 0xD1E3, 0x681C, 0xD1E4, 0x6835, 0xD1E5, 0x682B, 0xD1E6, 0x682D, 0xD1E7, 0x682F, + 0xD1E8, 0x684E, 0xD1E9, 0x6844, 0xD1EA, 0x6834, 0xD1EB, 0x681D, 0xD1EC, 0x6812, 0xD1ED, 0x6814, 0xD1EE, 0x6826, 0xD1EF, 0x6828, + 0xD1F0, 0x682E, 0xD1F1, 0x684D, 0xD1F2, 0x683A, 0xD1F3, 0x6825, 0xD1F4, 0x6820, 0xD1F5, 0x6B2C, 0xD1F6, 0x6B2F, 0xD1F7, 0x6B2D, + 0xD1F8, 0x6B31, 0xD1F9, 0x6B34, 0xD1FA, 0x6B6D, 0xD1FB, 0x8082, 0xD1FC, 0x6B88, 0xD1FD, 0x6BE6, 0xD1FE, 0x6BE4, 0xD240, 0x6BE8, + 0xD241, 0x6BE3, 0xD242, 0x6BE2, 0xD243, 0x6BE7, 0xD244, 0x6C25, 0xD245, 0x6D7A, 0xD246, 0x6D63, 0xD247, 0x6D64, 0xD248, 0x6D76, + 0xD249, 0x6D0D, 0xD24A, 0x6D61, 0xD24B, 0x6D92, 0xD24C, 0x6D58, 0xD24D, 0x6D62, 0xD24E, 0x6D6D, 0xD24F, 0x6D6F, 0xD250, 0x6D91, + 0xD251, 0x6D8D, 0xD252, 0x6DEF, 0xD253, 0x6D7F, 0xD254, 0x6D86, 0xD255, 0x6D5E, 0xD256, 0x6D67, 0xD257, 0x6D60, 0xD258, 0x6D97, + 0xD259, 0x6D70, 0xD25A, 0x6D7C, 0xD25B, 0x6D5F, 0xD25C, 0x6D82, 0xD25D, 0x6D98, 0xD25E, 0x6D2F, 0xD25F, 0x6D68, 0xD260, 0x6D8B, + 0xD261, 0x6D7E, 0xD262, 0x6D80, 0xD263, 0x6D84, 0xD264, 0x6D16, 0xD265, 0x6D83, 0xD266, 0x6D7B, 0xD267, 0x6D7D, 0xD268, 0x6D75, + 0xD269, 0x6D90, 0xD26A, 0x70DC, 0xD26B, 0x70D3, 0xD26C, 0x70D1, 0xD26D, 0x70DD, 0xD26E, 0x70CB, 0xD26F, 0x7F39, 0xD270, 0x70E2, + 0xD271, 0x70D7, 0xD272, 0x70D2, 0xD273, 0x70DE, 0xD274, 0x70E0, 0xD275, 0x70D4, 0xD276, 0x70CD, 0xD277, 0x70C5, 0xD278, 0x70C6, + 0xD279, 0x70C7, 0xD27A, 0x70DA, 0xD27B, 0x70CE, 0xD27C, 0x70E1, 0xD27D, 0x7242, 0xD27E, 0x7278, 0xD2A1, 0x7277, 0xD2A2, 0x7276, + 0xD2A3, 0x7300, 0xD2A4, 0x72FA, 0xD2A5, 0x72F4, 0xD2A6, 0x72FE, 0xD2A7, 0x72F6, 0xD2A8, 0x72F3, 0xD2A9, 0x72FB, 0xD2AA, 0x7301, + 0xD2AB, 0x73D3, 0xD2AC, 0x73D9, 0xD2AD, 0x73E5, 0xD2AE, 0x73D6, 0xD2AF, 0x73BC, 0xD2B0, 0x73E7, 0xD2B1, 0x73E3, 0xD2B2, 0x73E9, + 0xD2B3, 0x73DC, 0xD2B4, 0x73D2, 0xD2B5, 0x73DB, 0xD2B6, 0x73D4, 0xD2B7, 0x73DD, 0xD2B8, 0x73DA, 0xD2B9, 0x73D7, 0xD2BA, 0x73D8, + 0xD2BB, 0x73E8, 0xD2BC, 0x74DE, 0xD2BD, 0x74DF, 0xD2BE, 0x74F4, 0xD2BF, 0x74F5, 0xD2C0, 0x7521, 0xD2C1, 0x755B, 0xD2C2, 0x755F, + 0xD2C3, 0x75B0, 0xD2C4, 0x75C1, 0xD2C5, 0x75BB, 0xD2C6, 0x75C4, 0xD2C7, 0x75C0, 0xD2C8, 0x75BF, 0xD2C9, 0x75B6, 0xD2CA, 0x75BA, + 0xD2CB, 0x768A, 0xD2CC, 0x76C9, 0xD2CD, 0x771D, 0xD2CE, 0x771B, 0xD2CF, 0x7710, 0xD2D0, 0x7713, 0xD2D1, 0x7712, 0xD2D2, 0x7723, + 0xD2D3, 0x7711, 0xD2D4, 0x7715, 0xD2D5, 0x7719, 0xD2D6, 0x771A, 0xD2D7, 0x7722, 0xD2D8, 0x7727, 0xD2D9, 0x7823, 0xD2DA, 0x782C, + 0xD2DB, 0x7822, 0xD2DC, 0x7835, 0xD2DD, 0x782F, 0xD2DE, 0x7828, 0xD2DF, 0x782E, 0xD2E0, 0x782B, 0xD2E1, 0x7821, 0xD2E2, 0x7829, + 0xD2E3, 0x7833, 0xD2E4, 0x782A, 0xD2E5, 0x7831, 0xD2E6, 0x7954, 0xD2E7, 0x795B, 0xD2E8, 0x794F, 0xD2E9, 0x795C, 0xD2EA, 0x7953, + 0xD2EB, 0x7952, 0xD2EC, 0x7951, 0xD2ED, 0x79EB, 0xD2EE, 0x79EC, 0xD2EF, 0x79E0, 0xD2F0, 0x79EE, 0xD2F1, 0x79ED, 0xD2F2, 0x79EA, + 0xD2F3, 0x79DC, 0xD2F4, 0x79DE, 0xD2F5, 0x79DD, 0xD2F6, 0x7A86, 0xD2F7, 0x7A89, 0xD2F8, 0x7A85, 0xD2F9, 0x7A8B, 0xD2FA, 0x7A8C, + 0xD2FB, 0x7A8A, 0xD2FC, 0x7A87, 0xD2FD, 0x7AD8, 0xD2FE, 0x7B10, 0xD340, 0x7B04, 0xD341, 0x7B13, 0xD342, 0x7B05, 0xD343, 0x7B0F, + 0xD344, 0x7B08, 0xD345, 0x7B0A, 0xD346, 0x7B0E, 0xD347, 0x7B09, 0xD348, 0x7B12, 0xD349, 0x7C84, 0xD34A, 0x7C91, 0xD34B, 0x7C8A, + 0xD34C, 0x7C8C, 0xD34D, 0x7C88, 0xD34E, 0x7C8D, 0xD34F, 0x7C85, 0xD350, 0x7D1E, 0xD351, 0x7D1D, 0xD352, 0x7D11, 0xD353, 0x7D0E, + 0xD354, 0x7D18, 0xD355, 0x7D16, 0xD356, 0x7D13, 0xD357, 0x7D1F, 0xD358, 0x7D12, 0xD359, 0x7D0F, 0xD35A, 0x7D0C, 0xD35B, 0x7F5C, + 0xD35C, 0x7F61, 0xD35D, 0x7F5E, 0xD35E, 0x7F60, 0xD35F, 0x7F5D, 0xD360, 0x7F5B, 0xD361, 0x7F96, 0xD362, 0x7F92, 0xD363, 0x7FC3, + 0xD364, 0x7FC2, 0xD365, 0x7FC0, 0xD366, 0x8016, 0xD367, 0x803E, 0xD368, 0x8039, 0xD369, 0x80FA, 0xD36A, 0x80F2, 0xD36B, 0x80F9, + 0xD36C, 0x80F5, 0xD36D, 0x8101, 0xD36E, 0x80FB, 0xD36F, 0x8100, 0xD370, 0x8201, 0xD371, 0x822F, 0xD372, 0x8225, 0xD373, 0x8333, + 0xD374, 0x832D, 0xD375, 0x8344, 0xD376, 0x8319, 0xD377, 0x8351, 0xD378, 0x8325, 0xD379, 0x8356, 0xD37A, 0x833F, 0xD37B, 0x8341, + 0xD37C, 0x8326, 0xD37D, 0x831C, 0xD37E, 0x8322, 0xD3A1, 0x8342, 0xD3A2, 0x834E, 0xD3A3, 0x831B, 0xD3A4, 0x832A, 0xD3A5, 0x8308, + 0xD3A6, 0x833C, 0xD3A7, 0x834D, 0xD3A8, 0x8316, 0xD3A9, 0x8324, 0xD3AA, 0x8320, 0xD3AB, 0x8337, 0xD3AC, 0x832F, 0xD3AD, 0x8329, + 0xD3AE, 0x8347, 0xD3AF, 0x8345, 0xD3B0, 0x834C, 0xD3B1, 0x8353, 0xD3B2, 0x831E, 0xD3B3, 0x832C, 0xD3B4, 0x834B, 0xD3B5, 0x8327, + 0xD3B6, 0x8348, 0xD3B7, 0x8653, 0xD3B8, 0x8652, 0xD3B9, 0x86A2, 0xD3BA, 0x86A8, 0xD3BB, 0x8696, 0xD3BC, 0x868D, 0xD3BD, 0x8691, + 0xD3BE, 0x869E, 0xD3BF, 0x8687, 0xD3C0, 0x8697, 0xD3C1, 0x8686, 0xD3C2, 0x868B, 0xD3C3, 0x869A, 0xD3C4, 0x8685, 0xD3C5, 0x86A5, + 0xD3C6, 0x8699, 0xD3C7, 0x86A1, 0xD3C8, 0x86A7, 0xD3C9, 0x8695, 0xD3CA, 0x8698, 0xD3CB, 0x868E, 0xD3CC, 0x869D, 0xD3CD, 0x8690, + 0xD3CE, 0x8694, 0xD3CF, 0x8843, 0xD3D0, 0x8844, 0xD3D1, 0x886D, 0xD3D2, 0x8875, 0xD3D3, 0x8876, 0xD3D4, 0x8872, 0xD3D5, 0x8880, + 0xD3D6, 0x8871, 0xD3D7, 0x887F, 0xD3D8, 0x886F, 0xD3D9, 0x8883, 0xD3DA, 0x887E, 0xD3DB, 0x8874, 0xD3DC, 0x887C, 0xD3DD, 0x8A12, + 0xD3DE, 0x8C47, 0xD3DF, 0x8C57, 0xD3E0, 0x8C7B, 0xD3E1, 0x8CA4, 0xD3E2, 0x8CA3, 0xD3E3, 0x8D76, 0xD3E4, 0x8D78, 0xD3E5, 0x8DB5, + 0xD3E6, 0x8DB7, 0xD3E7, 0x8DB6, 0xD3E8, 0x8ED1, 0xD3E9, 0x8ED3, 0xD3EA, 0x8FFE, 0xD3EB, 0x8FF5, 0xD3EC, 0x9002, 0xD3ED, 0x8FFF, + 0xD3EE, 0x8FFB, 0xD3EF, 0x9004, 0xD3F0, 0x8FFC, 0xD3F1, 0x8FF6, 0xD3F2, 0x90D6, 0xD3F3, 0x90E0, 0xD3F4, 0x90D9, 0xD3F5, 0x90DA, + 0xD3F6, 0x90E3, 0xD3F7, 0x90DF, 0xD3F8, 0x90E5, 0xD3F9, 0x90D8, 0xD3FA, 0x90DB, 0xD3FB, 0x90D7, 0xD3FC, 0x90DC, 0xD3FD, 0x90E4, + 0xD3FE, 0x9150, 0xD440, 0x914E, 0xD441, 0x914F, 0xD442, 0x91D5, 0xD443, 0x91E2, 0xD444, 0x91DA, 0xD445, 0x965C, 0xD446, 0x965F, + 0xD447, 0x96BC, 0xD448, 0x98E3, 0xD449, 0x9ADF, 0xD44A, 0x9B2F, 0xD44B, 0x4E7F, 0xD44C, 0x5070, 0xD44D, 0x506A, 0xD44E, 0x5061, + 0xD44F, 0x505E, 0xD450, 0x5060, 0xD451, 0x5053, 0xD452, 0x504B, 0xD453, 0x505D, 0xD454, 0x5072, 0xD455, 0x5048, 0xD456, 0x504D, + 0xD457, 0x5041, 0xD458, 0x505B, 0xD459, 0x504A, 0xD45A, 0x5062, 0xD45B, 0x5015, 0xD45C, 0x5045, 0xD45D, 0x505F, 0xD45E, 0x5069, + 0xD45F, 0x506B, 0xD460, 0x5063, 0xD461, 0x5064, 0xD462, 0x5046, 0xD463, 0x5040, 0xD464, 0x506E, 0xD465, 0x5073, 0xD466, 0x5057, + 0xD467, 0x5051, 0xD468, 0x51D0, 0xD469, 0x526B, 0xD46A, 0x526D, 0xD46B, 0x526C, 0xD46C, 0x526E, 0xD46D, 0x52D6, 0xD46E, 0x52D3, + 0xD46F, 0x532D, 0xD470, 0x539C, 0xD471, 0x5575, 0xD472, 0x5576, 0xD473, 0x553C, 0xD474, 0x554D, 0xD475, 0x5550, 0xD476, 0x5534, + 0xD477, 0x552A, 0xD478, 0x5551, 0xD479, 0x5562, 0xD47A, 0x5536, 0xD47B, 0x5535, 0xD47C, 0x5530, 0xD47D, 0x5552, 0xD47E, 0x5545, + 0xD4A1, 0x550C, 0xD4A2, 0x5532, 0xD4A3, 0x5565, 0xD4A4, 0x554E, 0xD4A5, 0x5539, 0xD4A6, 0x5548, 0xD4A7, 0x552D, 0xD4A8, 0x553B, + 0xD4A9, 0x5540, 0xD4AA, 0x554B, 0xD4AB, 0x570A, 0xD4AC, 0x5707, 0xD4AD, 0x57FB, 0xD4AE, 0x5814, 0xD4AF, 0x57E2, 0xD4B0, 0x57F6, + 0xD4B1, 0x57DC, 0xD4B2, 0x57F4, 0xD4B3, 0x5800, 0xD4B4, 0x57ED, 0xD4B5, 0x57FD, 0xD4B6, 0x5808, 0xD4B7, 0x57F8, 0xD4B8, 0x580B, + 0xD4B9, 0x57F3, 0xD4BA, 0x57CF, 0xD4BB, 0x5807, 0xD4BC, 0x57EE, 0xD4BD, 0x57E3, 0xD4BE, 0x57F2, 0xD4BF, 0x57E5, 0xD4C0, 0x57EC, + 0xD4C1, 0x57E1, 0xD4C2, 0x580E, 0xD4C3, 0x57FC, 0xD4C4, 0x5810, 0xD4C5, 0x57E7, 0xD4C6, 0x5801, 0xD4C7, 0x580C, 0xD4C8, 0x57F1, + 0xD4C9, 0x57E9, 0xD4CA, 0x57F0, 0xD4CB, 0x580D, 0xD4CC, 0x5804, 0xD4CD, 0x595C, 0xD4CE, 0x5A60, 0xD4CF, 0x5A58, 0xD4D0, 0x5A55, + 0xD4D1, 0x5A67, 0xD4D2, 0x5A5E, 0xD4D3, 0x5A38, 0xD4D4, 0x5A35, 0xD4D5, 0x5A6D, 0xD4D6, 0x5A50, 0xD4D7, 0x5A5F, 0xD4D8, 0x5A65, + 0xD4D9, 0x5A6C, 0xD4DA, 0x5A53, 0xD4DB, 0x5A64, 0xD4DC, 0x5A57, 0xD4DD, 0x5A43, 0xD4DE, 0x5A5D, 0xD4DF, 0x5A52, 0xD4E0, 0x5A44, + 0xD4E1, 0x5A5B, 0xD4E2, 0x5A48, 0xD4E3, 0x5A8E, 0xD4E4, 0x5A3E, 0xD4E5, 0x5A4D, 0xD4E6, 0x5A39, 0xD4E7, 0x5A4C, 0xD4E8, 0x5A70, + 0xD4E9, 0x5A69, 0xD4EA, 0x5A47, 0xD4EB, 0x5A51, 0xD4EC, 0x5A56, 0xD4ED, 0x5A42, 0xD4EE, 0x5A5C, 0xD4EF, 0x5B72, 0xD4F0, 0x5B6E, + 0xD4F1, 0x5BC1, 0xD4F2, 0x5BC0, 0xD4F3, 0x5C59, 0xD4F4, 0x5D1E, 0xD4F5, 0x5D0B, 0xD4F6, 0x5D1D, 0xD4F7, 0x5D1A, 0xD4F8, 0x5D20, + 0xD4F9, 0x5D0C, 0xD4FA, 0x5D28, 0xD4FB, 0x5D0D, 0xD4FC, 0x5D26, 0xD4FD, 0x5D25, 0xD4FE, 0x5D0F, 0xD540, 0x5D30, 0xD541, 0x5D12, + 0xD542, 0x5D23, 0xD543, 0x5D1F, 0xD544, 0x5D2E, 0xD545, 0x5E3E, 0xD546, 0x5E34, 0xD547, 0x5EB1, 0xD548, 0x5EB4, 0xD549, 0x5EB9, + 0xD54A, 0x5EB2, 0xD54B, 0x5EB3, 0xD54C, 0x5F36, 0xD54D, 0x5F38, 0xD54E, 0x5F9B, 0xD54F, 0x5F96, 0xD550, 0x5F9F, 0xD551, 0x608A, + 0xD552, 0x6090, 0xD553, 0x6086, 0xD554, 0x60BE, 0xD555, 0x60B0, 0xD556, 0x60BA, 0xD557, 0x60D3, 0xD558, 0x60D4, 0xD559, 0x60CF, + 0xD55A, 0x60E4, 0xD55B, 0x60D9, 0xD55C, 0x60DD, 0xD55D, 0x60C8, 0xD55E, 0x60B1, 0xD55F, 0x60DB, 0xD560, 0x60B7, 0xD561, 0x60CA, + 0xD562, 0x60BF, 0xD563, 0x60C3, 0xD564, 0x60CD, 0xD565, 0x60C0, 0xD566, 0x6332, 0xD567, 0x6365, 0xD568, 0x638A, 0xD569, 0x6382, + 0xD56A, 0x637D, 0xD56B, 0x63BD, 0xD56C, 0x639E, 0xD56D, 0x63AD, 0xD56E, 0x639D, 0xD56F, 0x6397, 0xD570, 0x63AB, 0xD571, 0x638E, + 0xD572, 0x636F, 0xD573, 0x6387, 0xD574, 0x6390, 0xD575, 0x636E, 0xD576, 0x63AF, 0xD577, 0x6375, 0xD578, 0x639C, 0xD579, 0x636D, + 0xD57A, 0x63AE, 0xD57B, 0x637C, 0xD57C, 0x63A4, 0xD57D, 0x633B, 0xD57E, 0x639F, 0xD5A1, 0x6378, 0xD5A2, 0x6385, 0xD5A3, 0x6381, + 0xD5A4, 0x6391, 0xD5A5, 0x638D, 0xD5A6, 0x6370, 0xD5A7, 0x6553, 0xD5A8, 0x65CD, 0xD5A9, 0x6665, 0xD5AA, 0x6661, 0xD5AB, 0x665B, + 0xD5AC, 0x6659, 0xD5AD, 0x665C, 0xD5AE, 0x6662, 0xD5AF, 0x6718, 0xD5B0, 0x6879, 0xD5B1, 0x6887, 0xD5B2, 0x6890, 0xD5B3, 0x689C, + 0xD5B4, 0x686D, 0xD5B5, 0x686E, 0xD5B6, 0x68AE, 0xD5B7, 0x68AB, 0xD5B8, 0x6956, 0xD5B9, 0x686F, 0xD5BA, 0x68A3, 0xD5BB, 0x68AC, + 0xD5BC, 0x68A9, 0xD5BD, 0x6875, 0xD5BE, 0x6874, 0xD5BF, 0x68B2, 0xD5C0, 0x688F, 0xD5C1, 0x6877, 0xD5C2, 0x6892, 0xD5C3, 0x687C, + 0xD5C4, 0x686B, 0xD5C5, 0x6872, 0xD5C6, 0x68AA, 0xD5C7, 0x6880, 0xD5C8, 0x6871, 0xD5C9, 0x687E, 0xD5CA, 0x689B, 0xD5CB, 0x6896, + 0xD5CC, 0x688B, 0xD5CD, 0x68A0, 0xD5CE, 0x6889, 0xD5CF, 0x68A4, 0xD5D0, 0x6878, 0xD5D1, 0x687B, 0xD5D2, 0x6891, 0xD5D3, 0x688C, + 0xD5D4, 0x688A, 0xD5D5, 0x687D, 0xD5D6, 0x6B36, 0xD5D7, 0x6B33, 0xD5D8, 0x6B37, 0xD5D9, 0x6B38, 0xD5DA, 0x6B91, 0xD5DB, 0x6B8F, + 0xD5DC, 0x6B8D, 0xD5DD, 0x6B8E, 0xD5DE, 0x6B8C, 0xD5DF, 0x6C2A, 0xD5E0, 0x6DC0, 0xD5E1, 0x6DAB, 0xD5E2, 0x6DB4, 0xD5E3, 0x6DB3, + 0xD5E4, 0x6E74, 0xD5E5, 0x6DAC, 0xD5E6, 0x6DE9, 0xD5E7, 0x6DE2, 0xD5E8, 0x6DB7, 0xD5E9, 0x6DF6, 0xD5EA, 0x6DD4, 0xD5EB, 0x6E00, + 0xD5EC, 0x6DC8, 0xD5ED, 0x6DE0, 0xD5EE, 0x6DDF, 0xD5EF, 0x6DD6, 0xD5F0, 0x6DBE, 0xD5F1, 0x6DE5, 0xD5F2, 0x6DDC, 0xD5F3, 0x6DDD, + 0xD5F4, 0x6DDB, 0xD5F5, 0x6DF4, 0xD5F6, 0x6DCA, 0xD5F7, 0x6DBD, 0xD5F8, 0x6DED, 0xD5F9, 0x6DF0, 0xD5FA, 0x6DBA, 0xD5FB, 0x6DD5, + 0xD5FC, 0x6DC2, 0xD5FD, 0x6DCF, 0xD5FE, 0x6DC9, 0xD640, 0x6DD0, 0xD641, 0x6DF2, 0xD642, 0x6DD3, 0xD643, 0x6DFD, 0xD644, 0x6DD7, + 0xD645, 0x6DCD, 0xD646, 0x6DE3, 0xD647, 0x6DBB, 0xD648, 0x70FA, 0xD649, 0x710D, 0xD64A, 0x70F7, 0xD64B, 0x7117, 0xD64C, 0x70F4, + 0xD64D, 0x710C, 0xD64E, 0x70F0, 0xD64F, 0x7104, 0xD650, 0x70F3, 0xD651, 0x7110, 0xD652, 0x70FC, 0xD653, 0x70FF, 0xD654, 0x7106, + 0xD655, 0x7113, 0xD656, 0x7100, 0xD657, 0x70F8, 0xD658, 0x70F6, 0xD659, 0x710B, 0xD65A, 0x7102, 0xD65B, 0x710E, 0xD65C, 0x727E, + 0xD65D, 0x727B, 0xD65E, 0x727C, 0xD65F, 0x727F, 0xD660, 0x731D, 0xD661, 0x7317, 0xD662, 0x7307, 0xD663, 0x7311, 0xD664, 0x7318, + 0xD665, 0x730A, 0xD666, 0x7308, 0xD667, 0x72FF, 0xD668, 0x730F, 0xD669, 0x731E, 0xD66A, 0x7388, 0xD66B, 0x73F6, 0xD66C, 0x73F8, + 0xD66D, 0x73F5, 0xD66E, 0x7404, 0xD66F, 0x7401, 0xD670, 0x73FD, 0xD671, 0x7407, 0xD672, 0x7400, 0xD673, 0x73FA, 0xD674, 0x73FC, + 0xD675, 0x73FF, 0xD676, 0x740C, 0xD677, 0x740B, 0xD678, 0x73F4, 0xD679, 0x7408, 0xD67A, 0x7564, 0xD67B, 0x7563, 0xD67C, 0x75CE, + 0xD67D, 0x75D2, 0xD67E, 0x75CF, 0xD6A1, 0x75CB, 0xD6A2, 0x75CC, 0xD6A3, 0x75D1, 0xD6A4, 0x75D0, 0xD6A5, 0x768F, 0xD6A6, 0x7689, + 0xD6A7, 0x76D3, 0xD6A8, 0x7739, 0xD6A9, 0x772F, 0xD6AA, 0x772D, 0xD6AB, 0x7731, 0xD6AC, 0x7732, 0xD6AD, 0x7734, 0xD6AE, 0x7733, + 0xD6AF, 0x773D, 0xD6B0, 0x7725, 0xD6B1, 0x773B, 0xD6B2, 0x7735, 0xD6B3, 0x7848, 0xD6B4, 0x7852, 0xD6B5, 0x7849, 0xD6B6, 0x784D, + 0xD6B7, 0x784A, 0xD6B8, 0x784C, 0xD6B9, 0x7826, 0xD6BA, 0x7845, 0xD6BB, 0x7850, 0xD6BC, 0x7964, 0xD6BD, 0x7967, 0xD6BE, 0x7969, + 0xD6BF, 0x796A, 0xD6C0, 0x7963, 0xD6C1, 0x796B, 0xD6C2, 0x7961, 0xD6C3, 0x79BB, 0xD6C4, 0x79FA, 0xD6C5, 0x79F8, 0xD6C6, 0x79F6, + 0xD6C7, 0x79F7, 0xD6C8, 0x7A8F, 0xD6C9, 0x7A94, 0xD6CA, 0x7A90, 0xD6CB, 0x7B35, 0xD6CC, 0x7B47, 0xD6CD, 0x7B34, 0xD6CE, 0x7B25, + 0xD6CF, 0x7B30, 0xD6D0, 0x7B22, 0xD6D1, 0x7B24, 0xD6D2, 0x7B33, 0xD6D3, 0x7B18, 0xD6D4, 0x7B2A, 0xD6D5, 0x7B1D, 0xD6D6, 0x7B31, + 0xD6D7, 0x7B2B, 0xD6D8, 0x7B2D, 0xD6D9, 0x7B2F, 0xD6DA, 0x7B32, 0xD6DB, 0x7B38, 0xD6DC, 0x7B1A, 0xD6DD, 0x7B23, 0xD6DE, 0x7C94, + 0xD6DF, 0x7C98, 0xD6E0, 0x7C96, 0xD6E1, 0x7CA3, 0xD6E2, 0x7D35, 0xD6E3, 0x7D3D, 0xD6E4, 0x7D38, 0xD6E5, 0x7D36, 0xD6E6, 0x7D3A, + 0xD6E7, 0x7D45, 0xD6E8, 0x7D2C, 0xD6E9, 0x7D29, 0xD6EA, 0x7D41, 0xD6EB, 0x7D47, 0xD6EC, 0x7D3E, 0xD6ED, 0x7D3F, 0xD6EE, 0x7D4A, + 0xD6EF, 0x7D3B, 0xD6F0, 0x7D28, 0xD6F1, 0x7F63, 0xD6F2, 0x7F95, 0xD6F3, 0x7F9C, 0xD6F4, 0x7F9D, 0xD6F5, 0x7F9B, 0xD6F6, 0x7FCA, + 0xD6F7, 0x7FCB, 0xD6F8, 0x7FCD, 0xD6F9, 0x7FD0, 0xD6FA, 0x7FD1, 0xD6FB, 0x7FC7, 0xD6FC, 0x7FCF, 0xD6FD, 0x7FC9, 0xD6FE, 0x801F, + 0xD740, 0x801E, 0xD741, 0x801B, 0xD742, 0x8047, 0xD743, 0x8043, 0xD744, 0x8048, 0xD745, 0x8118, 0xD746, 0x8125, 0xD747, 0x8119, + 0xD748, 0x811B, 0xD749, 0x812D, 0xD74A, 0x811F, 0xD74B, 0x812C, 0xD74C, 0x811E, 0xD74D, 0x8121, 0xD74E, 0x8115, 0xD74F, 0x8127, + 0xD750, 0x811D, 0xD751, 0x8122, 0xD752, 0x8211, 0xD753, 0x8238, 0xD754, 0x8233, 0xD755, 0x823A, 0xD756, 0x8234, 0xD757, 0x8232, + 0xD758, 0x8274, 0xD759, 0x8390, 0xD75A, 0x83A3, 0xD75B, 0x83A8, 0xD75C, 0x838D, 0xD75D, 0x837A, 0xD75E, 0x8373, 0xD75F, 0x83A4, + 0xD760, 0x8374, 0xD761, 0x838F, 0xD762, 0x8381, 0xD763, 0x8395, 0xD764, 0x8399, 0xD765, 0x8375, 0xD766, 0x8394, 0xD767, 0x83A9, + 0xD768, 0x837D, 0xD769, 0x8383, 0xD76A, 0x838C, 0xD76B, 0x839D, 0xD76C, 0x839B, 0xD76D, 0x83AA, 0xD76E, 0x838B, 0xD76F, 0x837E, + 0xD770, 0x83A5, 0xD771, 0x83AF, 0xD772, 0x8388, 0xD773, 0x8397, 0xD774, 0x83B0, 0xD775, 0x837F, 0xD776, 0x83A6, 0xD777, 0x8387, + 0xD778, 0x83AE, 0xD779, 0x8376, 0xD77A, 0x839A, 0xD77B, 0x8659, 0xD77C, 0x8656, 0xD77D, 0x86BF, 0xD77E, 0x86B7, 0xD7A1, 0x86C2, + 0xD7A2, 0x86C1, 0xD7A3, 0x86C5, 0xD7A4, 0x86BA, 0xD7A5, 0x86B0, 0xD7A6, 0x86C8, 0xD7A7, 0x86B9, 0xD7A8, 0x86B3, 0xD7A9, 0x86B8, + 0xD7AA, 0x86CC, 0xD7AB, 0x86B4, 0xD7AC, 0x86BB, 0xD7AD, 0x86BC, 0xD7AE, 0x86C3, 0xD7AF, 0x86BD, 0xD7B0, 0x86BE, 0xD7B1, 0x8852, + 0xD7B2, 0x8889, 0xD7B3, 0x8895, 0xD7B4, 0x88A8, 0xD7B5, 0x88A2, 0xD7B6, 0x88AA, 0xD7B7, 0x889A, 0xD7B8, 0x8891, 0xD7B9, 0x88A1, + 0xD7BA, 0x889F, 0xD7BB, 0x8898, 0xD7BC, 0x88A7, 0xD7BD, 0x8899, 0xD7BE, 0x889B, 0xD7BF, 0x8897, 0xD7C0, 0x88A4, 0xD7C1, 0x88AC, + 0xD7C2, 0x888C, 0xD7C3, 0x8893, 0xD7C4, 0x888E, 0xD7C5, 0x8982, 0xD7C6, 0x89D6, 0xD7C7, 0x89D9, 0xD7C8, 0x89D5, 0xD7C9, 0x8A30, + 0xD7CA, 0x8A27, 0xD7CB, 0x8A2C, 0xD7CC, 0x8A1E, 0xD7CD, 0x8C39, 0xD7CE, 0x8C3B, 0xD7CF, 0x8C5C, 0xD7D0, 0x8C5D, 0xD7D1, 0x8C7D, + 0xD7D2, 0x8CA5, 0xD7D3, 0x8D7D, 0xD7D4, 0x8D7B, 0xD7D5, 0x8D79, 0xD7D6, 0x8DBC, 0xD7D7, 0x8DC2, 0xD7D8, 0x8DB9, 0xD7D9, 0x8DBF, + 0xD7DA, 0x8DC1, 0xD7DB, 0x8ED8, 0xD7DC, 0x8EDE, 0xD7DD, 0x8EDD, 0xD7DE, 0x8EDC, 0xD7DF, 0x8ED7, 0xD7E0, 0x8EE0, 0xD7E1, 0x8EE1, + 0xD7E2, 0x9024, 0xD7E3, 0x900B, 0xD7E4, 0x9011, 0xD7E5, 0x901C, 0xD7E6, 0x900C, 0xD7E7, 0x9021, 0xD7E8, 0x90EF, 0xD7E9, 0x90EA, + 0xD7EA, 0x90F0, 0xD7EB, 0x90F4, 0xD7EC, 0x90F2, 0xD7ED, 0x90F3, 0xD7EE, 0x90D4, 0xD7EF, 0x90EB, 0xD7F0, 0x90EC, 0xD7F1, 0x90E9, + 0xD7F2, 0x9156, 0xD7F3, 0x9158, 0xD7F4, 0x915A, 0xD7F5, 0x9153, 0xD7F6, 0x9155, 0xD7F7, 0x91EC, 0xD7F8, 0x91F4, 0xD7F9, 0x91F1, + 0xD7FA, 0x91F3, 0xD7FB, 0x91F8, 0xD7FC, 0x91E4, 0xD7FD, 0x91F9, 0xD7FE, 0x91EA, 0xD840, 0x91EB, 0xD841, 0x91F7, 0xD842, 0x91E8, + 0xD843, 0x91EE, 0xD844, 0x957A, 0xD845, 0x9586, 0xD846, 0x9588, 0xD847, 0x967C, 0xD848, 0x966D, 0xD849, 0x966B, 0xD84A, 0x9671, + 0xD84B, 0x966F, 0xD84C, 0x96BF, 0xD84D, 0x976A, 0xD84E, 0x9804, 0xD84F, 0x98E5, 0xD850, 0x9997, 0xD851, 0x509B, 0xD852, 0x5095, + 0xD853, 0x5094, 0xD854, 0x509E, 0xD855, 0x508B, 0xD856, 0x50A3, 0xD857, 0x5083, 0xD858, 0x508C, 0xD859, 0x508E, 0xD85A, 0x509D, + 0xD85B, 0x5068, 0xD85C, 0x509C, 0xD85D, 0x5092, 0xD85E, 0x5082, 0xD85F, 0x5087, 0xD860, 0x515F, 0xD861, 0x51D4, 0xD862, 0x5312, + 0xD863, 0x5311, 0xD864, 0x53A4, 0xD865, 0x53A7, 0xD866, 0x5591, 0xD867, 0x55A8, 0xD868, 0x55A5, 0xD869, 0x55AD, 0xD86A, 0x5577, + 0xD86B, 0x5645, 0xD86C, 0x55A2, 0xD86D, 0x5593, 0xD86E, 0x5588, 0xD86F, 0x558F, 0xD870, 0x55B5, 0xD871, 0x5581, 0xD872, 0x55A3, + 0xD873, 0x5592, 0xD874, 0x55A4, 0xD875, 0x557D, 0xD876, 0x558C, 0xD877, 0x55A6, 0xD878, 0x557F, 0xD879, 0x5595, 0xD87A, 0x55A1, + 0xD87B, 0x558E, 0xD87C, 0x570C, 0xD87D, 0x5829, 0xD87E, 0x5837, 0xD8A1, 0x5819, 0xD8A2, 0x581E, 0xD8A3, 0x5827, 0xD8A4, 0x5823, + 0xD8A5, 0x5828, 0xD8A6, 0x57F5, 0xD8A7, 0x5848, 0xD8A8, 0x5825, 0xD8A9, 0x581C, 0xD8AA, 0x581B, 0xD8AB, 0x5833, 0xD8AC, 0x583F, + 0xD8AD, 0x5836, 0xD8AE, 0x582E, 0xD8AF, 0x5839, 0xD8B0, 0x5838, 0xD8B1, 0x582D, 0xD8B2, 0x582C, 0xD8B3, 0x583B, 0xD8B4, 0x5961, + 0xD8B5, 0x5AAF, 0xD8B6, 0x5A94, 0xD8B7, 0x5A9F, 0xD8B8, 0x5A7A, 0xD8B9, 0x5AA2, 0xD8BA, 0x5A9E, 0xD8BB, 0x5A78, 0xD8BC, 0x5AA6, + 0xD8BD, 0x5A7C, 0xD8BE, 0x5AA5, 0xD8BF, 0x5AAC, 0xD8C0, 0x5A95, 0xD8C1, 0x5AAE, 0xD8C2, 0x5A37, 0xD8C3, 0x5A84, 0xD8C4, 0x5A8A, + 0xD8C5, 0x5A97, 0xD8C6, 0x5A83, 0xD8C7, 0x5A8B, 0xD8C8, 0x5AA9, 0xD8C9, 0x5A7B, 0xD8CA, 0x5A7D, 0xD8CB, 0x5A8C, 0xD8CC, 0x5A9C, + 0xD8CD, 0x5A8F, 0xD8CE, 0x5A93, 0xD8CF, 0x5A9D, 0xD8D0, 0x5BEA, 0xD8D1, 0x5BCD, 0xD8D2, 0x5BCB, 0xD8D3, 0x5BD4, 0xD8D4, 0x5BD1, + 0xD8D5, 0x5BCA, 0xD8D6, 0x5BCE, 0xD8D7, 0x5C0C, 0xD8D8, 0x5C30, 0xD8D9, 0x5D37, 0xD8DA, 0x5D43, 0xD8DB, 0x5D6B, 0xD8DC, 0x5D41, + 0xD8DD, 0x5D4B, 0xD8DE, 0x5D3F, 0xD8DF, 0x5D35, 0xD8E0, 0x5D51, 0xD8E1, 0x5D4E, 0xD8E2, 0x5D55, 0xD8E3, 0x5D33, 0xD8E4, 0x5D3A, + 0xD8E5, 0x5D52, 0xD8E6, 0x5D3D, 0xD8E7, 0x5D31, 0xD8E8, 0x5D59, 0xD8E9, 0x5D42, 0xD8EA, 0x5D39, 0xD8EB, 0x5D49, 0xD8EC, 0x5D38, + 0xD8ED, 0x5D3C, 0xD8EE, 0x5D32, 0xD8EF, 0x5D36, 0xD8F0, 0x5D40, 0xD8F1, 0x5D45, 0xD8F2, 0x5E44, 0xD8F3, 0x5E41, 0xD8F4, 0x5F58, + 0xD8F5, 0x5FA6, 0xD8F6, 0x5FA5, 0xD8F7, 0x5FAB, 0xD8F8, 0x60C9, 0xD8F9, 0x60B9, 0xD8FA, 0x60CC, 0xD8FB, 0x60E2, 0xD8FC, 0x60CE, + 0xD8FD, 0x60C4, 0xD8FE, 0x6114, 0xD940, 0x60F2, 0xD941, 0x610A, 0xD942, 0x6116, 0xD943, 0x6105, 0xD944, 0x60F5, 0xD945, 0x6113, + 0xD946, 0x60F8, 0xD947, 0x60FC, 0xD948, 0x60FE, 0xD949, 0x60C1, 0xD94A, 0x6103, 0xD94B, 0x6118, 0xD94C, 0x611D, 0xD94D, 0x6110, + 0xD94E, 0x60FF, 0xD94F, 0x6104, 0xD950, 0x610B, 0xD951, 0x624A, 0xD952, 0x6394, 0xD953, 0x63B1, 0xD954, 0x63B0, 0xD955, 0x63CE, + 0xD956, 0x63E5, 0xD957, 0x63E8, 0xD958, 0x63EF, 0xD959, 0x63C3, 0xD95A, 0x649D, 0xD95B, 0x63F3, 0xD95C, 0x63CA, 0xD95D, 0x63E0, + 0xD95E, 0x63F6, 0xD95F, 0x63D5, 0xD960, 0x63F2, 0xD961, 0x63F5, 0xD962, 0x6461, 0xD963, 0x63DF, 0xD964, 0x63BE, 0xD965, 0x63DD, + 0xD966, 0x63DC, 0xD967, 0x63C4, 0xD968, 0x63D8, 0xD969, 0x63D3, 0xD96A, 0x63C2, 0xD96B, 0x63C7, 0xD96C, 0x63CC, 0xD96D, 0x63CB, + 0xD96E, 0x63C8, 0xD96F, 0x63F0, 0xD970, 0x63D7, 0xD971, 0x63D9, 0xD972, 0x6532, 0xD973, 0x6567, 0xD974, 0x656A, 0xD975, 0x6564, + 0xD976, 0x655C, 0xD977, 0x6568, 0xD978, 0x6565, 0xD979, 0x658C, 0xD97A, 0x659D, 0xD97B, 0x659E, 0xD97C, 0x65AE, 0xD97D, 0x65D0, + 0xD97E, 0x65D2, 0xD9A1, 0x667C, 0xD9A2, 0x666C, 0xD9A3, 0x667B, 0xD9A4, 0x6680, 0xD9A5, 0x6671, 0xD9A6, 0x6679, 0xD9A7, 0x666A, + 0xD9A8, 0x6672, 0xD9A9, 0x6701, 0xD9AA, 0x690C, 0xD9AB, 0x68D3, 0xD9AC, 0x6904, 0xD9AD, 0x68DC, 0xD9AE, 0x692A, 0xD9AF, 0x68EC, + 0xD9B0, 0x68EA, 0xD9B1, 0x68F1, 0xD9B2, 0x690F, 0xD9B3, 0x68D6, 0xD9B4, 0x68F7, 0xD9B5, 0x68EB, 0xD9B6, 0x68E4, 0xD9B7, 0x68F6, + 0xD9B8, 0x6913, 0xD9B9, 0x6910, 0xD9BA, 0x68F3, 0xD9BB, 0x68E1, 0xD9BC, 0x6907, 0xD9BD, 0x68CC, 0xD9BE, 0x6908, 0xD9BF, 0x6970, + 0xD9C0, 0x68B4, 0xD9C1, 0x6911, 0xD9C2, 0x68EF, 0xD9C3, 0x68C6, 0xD9C4, 0x6914, 0xD9C5, 0x68F8, 0xD9C6, 0x68D0, 0xD9C7, 0x68FD, + 0xD9C8, 0x68FC, 0xD9C9, 0x68E8, 0xD9CA, 0x690B, 0xD9CB, 0x690A, 0xD9CC, 0x6917, 0xD9CD, 0x68CE, 0xD9CE, 0x68C8, 0xD9CF, 0x68DD, + 0xD9D0, 0x68DE, 0xD9D1, 0x68E6, 0xD9D2, 0x68F4, 0xD9D3, 0x68D1, 0xD9D4, 0x6906, 0xD9D5, 0x68D4, 0xD9D6, 0x68E9, 0xD9D7, 0x6915, + 0xD9D8, 0x6925, 0xD9D9, 0x68C7, 0xD9DA, 0x6B39, 0xD9DB, 0x6B3B, 0xD9DC, 0x6B3F, 0xD9DD, 0x6B3C, 0xD9DE, 0x6B94, 0xD9DF, 0x6B97, + 0xD9E0, 0x6B99, 0xD9E1, 0x6B95, 0xD9E2, 0x6BBD, 0xD9E3, 0x6BF0, 0xD9E4, 0x6BF2, 0xD9E5, 0x6BF3, 0xD9E6, 0x6C30, 0xD9E7, 0x6DFC, + 0xD9E8, 0x6E46, 0xD9E9, 0x6E47, 0xD9EA, 0x6E1F, 0xD9EB, 0x6E49, 0xD9EC, 0x6E88, 0xD9ED, 0x6E3C, 0xD9EE, 0x6E3D, 0xD9EF, 0x6E45, + 0xD9F0, 0x6E62, 0xD9F1, 0x6E2B, 0xD9F2, 0x6E3F, 0xD9F3, 0x6E41, 0xD9F4, 0x6E5D, 0xD9F5, 0x6E73, 0xD9F6, 0x6E1C, 0xD9F7, 0x6E33, + 0xD9F8, 0x6E4B, 0xD9F9, 0x6E40, 0xD9FA, 0x6E51, 0xD9FB, 0x6E3B, 0xD9FC, 0x6E03, 0xD9FD, 0x6E2E, 0xD9FE, 0x6E5E, 0xDA40, 0x6E68, + 0xDA41, 0x6E5C, 0xDA42, 0x6E61, 0xDA43, 0x6E31, 0xDA44, 0x6E28, 0xDA45, 0x6E60, 0xDA46, 0x6E71, 0xDA47, 0x6E6B, 0xDA48, 0x6E39, + 0xDA49, 0x6E22, 0xDA4A, 0x6E30, 0xDA4B, 0x6E53, 0xDA4C, 0x6E65, 0xDA4D, 0x6E27, 0xDA4E, 0x6E78, 0xDA4F, 0x6E64, 0xDA50, 0x6E77, + 0xDA51, 0x6E55, 0xDA52, 0x6E79, 0xDA53, 0x6E52, 0xDA54, 0x6E66, 0xDA55, 0x6E35, 0xDA56, 0x6E36, 0xDA57, 0x6E5A, 0xDA58, 0x7120, + 0xDA59, 0x711E, 0xDA5A, 0x712F, 0xDA5B, 0x70FB, 0xDA5C, 0x712E, 0xDA5D, 0x7131, 0xDA5E, 0x7123, 0xDA5F, 0x7125, 0xDA60, 0x7122, + 0xDA61, 0x7132, 0xDA62, 0x711F, 0xDA63, 0x7128, 0xDA64, 0x713A, 0xDA65, 0x711B, 0xDA66, 0x724B, 0xDA67, 0x725A, 0xDA68, 0x7288, + 0xDA69, 0x7289, 0xDA6A, 0x7286, 0xDA6B, 0x7285, 0xDA6C, 0x728B, 0xDA6D, 0x7312, 0xDA6E, 0x730B, 0xDA6F, 0x7330, 0xDA70, 0x7322, + 0xDA71, 0x7331, 0xDA72, 0x7333, 0xDA73, 0x7327, 0xDA74, 0x7332, 0xDA75, 0x732D, 0xDA76, 0x7326, 0xDA77, 0x7323, 0xDA78, 0x7335, + 0xDA79, 0x730C, 0xDA7A, 0x742E, 0xDA7B, 0x742C, 0xDA7C, 0x7430, 0xDA7D, 0x742B, 0xDA7E, 0x7416, 0xDAA1, 0x741A, 0xDAA2, 0x7421, + 0xDAA3, 0x742D, 0xDAA4, 0x7431, 0xDAA5, 0x7424, 0xDAA6, 0x7423, 0xDAA7, 0x741D, 0xDAA8, 0x7429, 0xDAA9, 0x7420, 0xDAAA, 0x7432, + 0xDAAB, 0x74FB, 0xDAAC, 0x752F, 0xDAAD, 0x756F, 0xDAAE, 0x756C, 0xDAAF, 0x75E7, 0xDAB0, 0x75DA, 0xDAB1, 0x75E1, 0xDAB2, 0x75E6, + 0xDAB3, 0x75DD, 0xDAB4, 0x75DF, 0xDAB5, 0x75E4, 0xDAB6, 0x75D7, 0xDAB7, 0x7695, 0xDAB8, 0x7692, 0xDAB9, 0x76DA, 0xDABA, 0x7746, + 0xDABB, 0x7747, 0xDABC, 0x7744, 0xDABD, 0x774D, 0xDABE, 0x7745, 0xDABF, 0x774A, 0xDAC0, 0x774E, 0xDAC1, 0x774B, 0xDAC2, 0x774C, + 0xDAC3, 0x77DE, 0xDAC4, 0x77EC, 0xDAC5, 0x7860, 0xDAC6, 0x7864, 0xDAC7, 0x7865, 0xDAC8, 0x785C, 0xDAC9, 0x786D, 0xDACA, 0x7871, + 0xDACB, 0x786A, 0xDACC, 0x786E, 0xDACD, 0x7870, 0xDACE, 0x7869, 0xDACF, 0x7868, 0xDAD0, 0x785E, 0xDAD1, 0x7862, 0xDAD2, 0x7974, + 0xDAD3, 0x7973, 0xDAD4, 0x7972, 0xDAD5, 0x7970, 0xDAD6, 0x7A02, 0xDAD7, 0x7A0A, 0xDAD8, 0x7A03, 0xDAD9, 0x7A0C, 0xDADA, 0x7A04, + 0xDADB, 0x7A99, 0xDADC, 0x7AE6, 0xDADD, 0x7AE4, 0xDADE, 0x7B4A, 0xDADF, 0x7B3B, 0xDAE0, 0x7B44, 0xDAE1, 0x7B48, 0xDAE2, 0x7B4C, + 0xDAE3, 0x7B4E, 0xDAE4, 0x7B40, 0xDAE5, 0x7B58, 0xDAE6, 0x7B45, 0xDAE7, 0x7CA2, 0xDAE8, 0x7C9E, 0xDAE9, 0x7CA8, 0xDAEA, 0x7CA1, + 0xDAEB, 0x7D58, 0xDAEC, 0x7D6F, 0xDAED, 0x7D63, 0xDAEE, 0x7D53, 0xDAEF, 0x7D56, 0xDAF0, 0x7D67, 0xDAF1, 0x7D6A, 0xDAF2, 0x7D4F, + 0xDAF3, 0x7D6D, 0xDAF4, 0x7D5C, 0xDAF5, 0x7D6B, 0xDAF6, 0x7D52, 0xDAF7, 0x7D54, 0xDAF8, 0x7D69, 0xDAF9, 0x7D51, 0xDAFA, 0x7D5F, + 0xDAFB, 0x7D4E, 0xDAFC, 0x7F3E, 0xDAFD, 0x7F3F, 0xDAFE, 0x7F65, 0xDB40, 0x7F66, 0xDB41, 0x7FA2, 0xDB42, 0x7FA0, 0xDB43, 0x7FA1, + 0xDB44, 0x7FD7, 0xDB45, 0x8051, 0xDB46, 0x804F, 0xDB47, 0x8050, 0xDB48, 0x80FE, 0xDB49, 0x80D4, 0xDB4A, 0x8143, 0xDB4B, 0x814A, + 0xDB4C, 0x8152, 0xDB4D, 0x814F, 0xDB4E, 0x8147, 0xDB4F, 0x813D, 0xDB50, 0x814D, 0xDB51, 0x813A, 0xDB52, 0x81E6, 0xDB53, 0x81EE, + 0xDB54, 0x81F7, 0xDB55, 0x81F8, 0xDB56, 0x81F9, 0xDB57, 0x8204, 0xDB58, 0x823C, 0xDB59, 0x823D, 0xDB5A, 0x823F, 0xDB5B, 0x8275, + 0xDB5C, 0x833B, 0xDB5D, 0x83CF, 0xDB5E, 0x83F9, 0xDB5F, 0x8423, 0xDB60, 0x83C0, 0xDB61, 0x83E8, 0xDB62, 0x8412, 0xDB63, 0x83E7, + 0xDB64, 0x83E4, 0xDB65, 0x83FC, 0xDB66, 0x83F6, 0xDB67, 0x8410, 0xDB68, 0x83C6, 0xDB69, 0x83C8, 0xDB6A, 0x83EB, 0xDB6B, 0x83E3, + 0xDB6C, 0x83BF, 0xDB6D, 0x8401, 0xDB6E, 0x83DD, 0xDB6F, 0x83E5, 0xDB70, 0x83D8, 0xDB71, 0x83FF, 0xDB72, 0x83E1, 0xDB73, 0x83CB, + 0xDB74, 0x83CE, 0xDB75, 0x83D6, 0xDB76, 0x83F5, 0xDB77, 0x83C9, 0xDB78, 0x8409, 0xDB79, 0x840F, 0xDB7A, 0x83DE, 0xDB7B, 0x8411, + 0xDB7C, 0x8406, 0xDB7D, 0x83C2, 0xDB7E, 0x83F3, 0xDBA1, 0x83D5, 0xDBA2, 0x83FA, 0xDBA3, 0x83C7, 0xDBA4, 0x83D1, 0xDBA5, 0x83EA, + 0xDBA6, 0x8413, 0xDBA7, 0x83C3, 0xDBA8, 0x83EC, 0xDBA9, 0x83EE, 0xDBAA, 0x83C4, 0xDBAB, 0x83FB, 0xDBAC, 0x83D7, 0xDBAD, 0x83E2, + 0xDBAE, 0x841B, 0xDBAF, 0x83DB, 0xDBB0, 0x83FE, 0xDBB1, 0x86D8, 0xDBB2, 0x86E2, 0xDBB3, 0x86E6, 0xDBB4, 0x86D3, 0xDBB5, 0x86E3, + 0xDBB6, 0x86DA, 0xDBB7, 0x86EA, 0xDBB8, 0x86DD, 0xDBB9, 0x86EB, 0xDBBA, 0x86DC, 0xDBBB, 0x86EC, 0xDBBC, 0x86E9, 0xDBBD, 0x86D7, + 0xDBBE, 0x86E8, 0xDBBF, 0x86D1, 0xDBC0, 0x8848, 0xDBC1, 0x8856, 0xDBC2, 0x8855, 0xDBC3, 0x88BA, 0xDBC4, 0x88D7, 0xDBC5, 0x88B9, + 0xDBC6, 0x88B8, 0xDBC7, 0x88C0, 0xDBC8, 0x88BE, 0xDBC9, 0x88B6, 0xDBCA, 0x88BC, 0xDBCB, 0x88B7, 0xDBCC, 0x88BD, 0xDBCD, 0x88B2, + 0xDBCE, 0x8901, 0xDBCF, 0x88C9, 0xDBD0, 0x8995, 0xDBD1, 0x8998, 0xDBD2, 0x8997, 0xDBD3, 0x89DD, 0xDBD4, 0x89DA, 0xDBD5, 0x89DB, + 0xDBD6, 0x8A4E, 0xDBD7, 0x8A4D, 0xDBD8, 0x8A39, 0xDBD9, 0x8A59, 0xDBDA, 0x8A40, 0xDBDB, 0x8A57, 0xDBDC, 0x8A58, 0xDBDD, 0x8A44, + 0xDBDE, 0x8A45, 0xDBDF, 0x8A52, 0xDBE0, 0x8A48, 0xDBE1, 0x8A51, 0xDBE2, 0x8A4A, 0xDBE3, 0x8A4C, 0xDBE4, 0x8A4F, 0xDBE5, 0x8C5F, + 0xDBE6, 0x8C81, 0xDBE7, 0x8C80, 0xDBE8, 0x8CBA, 0xDBE9, 0x8CBE, 0xDBEA, 0x8CB0, 0xDBEB, 0x8CB9, 0xDBEC, 0x8CB5, 0xDBED, 0x8D84, + 0xDBEE, 0x8D80, 0xDBEF, 0x8D89, 0xDBF0, 0x8DD8, 0xDBF1, 0x8DD3, 0xDBF2, 0x8DCD, 0xDBF3, 0x8DC7, 0xDBF4, 0x8DD6, 0xDBF5, 0x8DDC, + 0xDBF6, 0x8DCF, 0xDBF7, 0x8DD5, 0xDBF8, 0x8DD9, 0xDBF9, 0x8DC8, 0xDBFA, 0x8DD7, 0xDBFB, 0x8DC5, 0xDBFC, 0x8EEF, 0xDBFD, 0x8EF7, + 0xDBFE, 0x8EFA, 0xDC40, 0x8EF9, 0xDC41, 0x8EE6, 0xDC42, 0x8EEE, 0xDC43, 0x8EE5, 0xDC44, 0x8EF5, 0xDC45, 0x8EE7, 0xDC46, 0x8EE8, + 0xDC47, 0x8EF6, 0xDC48, 0x8EEB, 0xDC49, 0x8EF1, 0xDC4A, 0x8EEC, 0xDC4B, 0x8EF4, 0xDC4C, 0x8EE9, 0xDC4D, 0x902D, 0xDC4E, 0x9034, + 0xDC4F, 0x902F, 0xDC50, 0x9106, 0xDC51, 0x912C, 0xDC52, 0x9104, 0xDC53, 0x90FF, 0xDC54, 0x90FC, 0xDC55, 0x9108, 0xDC56, 0x90F9, + 0xDC57, 0x90FB, 0xDC58, 0x9101, 0xDC59, 0x9100, 0xDC5A, 0x9107, 0xDC5B, 0x9105, 0xDC5C, 0x9103, 0xDC5D, 0x9161, 0xDC5E, 0x9164, + 0xDC5F, 0x915F, 0xDC60, 0x9162, 0xDC61, 0x9160, 0xDC62, 0x9201, 0xDC63, 0x920A, 0xDC64, 0x9225, 0xDC65, 0x9203, 0xDC66, 0x921A, + 0xDC67, 0x9226, 0xDC68, 0x920F, 0xDC69, 0x920C, 0xDC6A, 0x9200, 0xDC6B, 0x9212, 0xDC6C, 0x91FF, 0xDC6D, 0x91FD, 0xDC6E, 0x9206, + 0xDC6F, 0x9204, 0xDC70, 0x9227, 0xDC71, 0x9202, 0xDC72, 0x921C, 0xDC73, 0x9224, 0xDC74, 0x9219, 0xDC75, 0x9217, 0xDC76, 0x9205, + 0xDC77, 0x9216, 0xDC78, 0x957B, 0xDC79, 0x958D, 0xDC7A, 0x958C, 0xDC7B, 0x9590, 0xDC7C, 0x9687, 0xDC7D, 0x967E, 0xDC7E, 0x9688, + 0xDCA1, 0x9689, 0xDCA2, 0x9683, 0xDCA3, 0x9680, 0xDCA4, 0x96C2, 0xDCA5, 0x96C8, 0xDCA6, 0x96C3, 0xDCA7, 0x96F1, 0xDCA8, 0x96F0, + 0xDCA9, 0x976C, 0xDCAA, 0x9770, 0xDCAB, 0x976E, 0xDCAC, 0x9807, 0xDCAD, 0x98A9, 0xDCAE, 0x98EB, 0xDCAF, 0x9CE6, 0xDCB0, 0x9EF9, + 0xDCB1, 0x4E83, 0xDCB2, 0x4E84, 0xDCB3, 0x4EB6, 0xDCB4, 0x50BD, 0xDCB5, 0x50BF, 0xDCB6, 0x50C6, 0xDCB7, 0x50AE, 0xDCB8, 0x50C4, + 0xDCB9, 0x50CA, 0xDCBA, 0x50B4, 0xDCBB, 0x50C8, 0xDCBC, 0x50C2, 0xDCBD, 0x50B0, 0xDCBE, 0x50C1, 0xDCBF, 0x50BA, 0xDCC0, 0x50B1, + 0xDCC1, 0x50CB, 0xDCC2, 0x50C9, 0xDCC3, 0x50B6, 0xDCC4, 0x50B8, 0xDCC5, 0x51D7, 0xDCC6, 0x527A, 0xDCC7, 0x5278, 0xDCC8, 0x527B, + 0xDCC9, 0x527C, 0xDCCA, 0x55C3, 0xDCCB, 0x55DB, 0xDCCC, 0x55CC, 0xDCCD, 0x55D0, 0xDCCE, 0x55CB, 0xDCCF, 0x55CA, 0xDCD0, 0x55DD, + 0xDCD1, 0x55C0, 0xDCD2, 0x55D4, 0xDCD3, 0x55C4, 0xDCD4, 0x55E9, 0xDCD5, 0x55BF, 0xDCD6, 0x55D2, 0xDCD7, 0x558D, 0xDCD8, 0x55CF, + 0xDCD9, 0x55D5, 0xDCDA, 0x55E2, 0xDCDB, 0x55D6, 0xDCDC, 0x55C8, 0xDCDD, 0x55F2, 0xDCDE, 0x55CD, 0xDCDF, 0x55D9, 0xDCE0, 0x55C2, + 0xDCE1, 0x5714, 0xDCE2, 0x5853, 0xDCE3, 0x5868, 0xDCE4, 0x5864, 0xDCE5, 0x584F, 0xDCE6, 0x584D, 0xDCE7, 0x5849, 0xDCE8, 0x586F, + 0xDCE9, 0x5855, 0xDCEA, 0x584E, 0xDCEB, 0x585D, 0xDCEC, 0x5859, 0xDCED, 0x5865, 0xDCEE, 0x585B, 0xDCEF, 0x583D, 0xDCF0, 0x5863, + 0xDCF1, 0x5871, 0xDCF2, 0x58FC, 0xDCF3, 0x5AC7, 0xDCF4, 0x5AC4, 0xDCF5, 0x5ACB, 0xDCF6, 0x5ABA, 0xDCF7, 0x5AB8, 0xDCF8, 0x5AB1, + 0xDCF9, 0x5AB5, 0xDCFA, 0x5AB0, 0xDCFB, 0x5ABF, 0xDCFC, 0x5AC8, 0xDCFD, 0x5ABB, 0xDCFE, 0x5AC6, 0xDD40, 0x5AB7, 0xDD41, 0x5AC0, + 0xDD42, 0x5ACA, 0xDD43, 0x5AB4, 0xDD44, 0x5AB6, 0xDD45, 0x5ACD, 0xDD46, 0x5AB9, 0xDD47, 0x5A90, 0xDD48, 0x5BD6, 0xDD49, 0x5BD8, + 0xDD4A, 0x5BD9, 0xDD4B, 0x5C1F, 0xDD4C, 0x5C33, 0xDD4D, 0x5D71, 0xDD4E, 0x5D63, 0xDD4F, 0x5D4A, 0xDD50, 0x5D65, 0xDD51, 0x5D72, + 0xDD52, 0x5D6C, 0xDD53, 0x5D5E, 0xDD54, 0x5D68, 0xDD55, 0x5D67, 0xDD56, 0x5D62, 0xDD57, 0x5DF0, 0xDD58, 0x5E4F, 0xDD59, 0x5E4E, + 0xDD5A, 0x5E4A, 0xDD5B, 0x5E4D, 0xDD5C, 0x5E4B, 0xDD5D, 0x5EC5, 0xDD5E, 0x5ECC, 0xDD5F, 0x5EC6, 0xDD60, 0x5ECB, 0xDD61, 0x5EC7, + 0xDD62, 0x5F40, 0xDD63, 0x5FAF, 0xDD64, 0x5FAD, 0xDD65, 0x60F7, 0xDD66, 0x6149, 0xDD67, 0x614A, 0xDD68, 0x612B, 0xDD69, 0x6145, + 0xDD6A, 0x6136, 0xDD6B, 0x6132, 0xDD6C, 0x612E, 0xDD6D, 0x6146, 0xDD6E, 0x612F, 0xDD6F, 0x614F, 0xDD70, 0x6129, 0xDD71, 0x6140, + 0xDD72, 0x6220, 0xDD73, 0x9168, 0xDD74, 0x6223, 0xDD75, 0x6225, 0xDD76, 0x6224, 0xDD77, 0x63C5, 0xDD78, 0x63F1, 0xDD79, 0x63EB, + 0xDD7A, 0x6410, 0xDD7B, 0x6412, 0xDD7C, 0x6409, 0xDD7D, 0x6420, 0xDD7E, 0x6424, 0xDDA1, 0x6433, 0xDDA2, 0x6443, 0xDDA3, 0x641F, + 0xDDA4, 0x6415, 0xDDA5, 0x6418, 0xDDA6, 0x6439, 0xDDA7, 0x6437, 0xDDA8, 0x6422, 0xDDA9, 0x6423, 0xDDAA, 0x640C, 0xDDAB, 0x6426, + 0xDDAC, 0x6430, 0xDDAD, 0x6428, 0xDDAE, 0x6441, 0xDDAF, 0x6435, 0xDDB0, 0x642F, 0xDDB1, 0x640A, 0xDDB2, 0x641A, 0xDDB3, 0x6440, + 0xDDB4, 0x6425, 0xDDB5, 0x6427, 0xDDB6, 0x640B, 0xDDB7, 0x63E7, 0xDDB8, 0x641B, 0xDDB9, 0x642E, 0xDDBA, 0x6421, 0xDDBB, 0x640E, + 0xDDBC, 0x656F, 0xDDBD, 0x6592, 0xDDBE, 0x65D3, 0xDDBF, 0x6686, 0xDDC0, 0x668C, 0xDDC1, 0x6695, 0xDDC2, 0x6690, 0xDDC3, 0x668B, + 0xDDC4, 0x668A, 0xDDC5, 0x6699, 0xDDC6, 0x6694, 0xDDC7, 0x6678, 0xDDC8, 0x6720, 0xDDC9, 0x6966, 0xDDCA, 0x695F, 0xDDCB, 0x6938, + 0xDDCC, 0x694E, 0xDDCD, 0x6962, 0xDDCE, 0x6971, 0xDDCF, 0x693F, 0xDDD0, 0x6945, 0xDDD1, 0x696A, 0xDDD2, 0x6939, 0xDDD3, 0x6942, + 0xDDD4, 0x6957, 0xDDD5, 0x6959, 0xDDD6, 0x697A, 0xDDD7, 0x6948, 0xDDD8, 0x6949, 0xDDD9, 0x6935, 0xDDDA, 0x696C, 0xDDDB, 0x6933, + 0xDDDC, 0x693D, 0xDDDD, 0x6965, 0xDDDE, 0x68F0, 0xDDDF, 0x6978, 0xDDE0, 0x6934, 0xDDE1, 0x6969, 0xDDE2, 0x6940, 0xDDE3, 0x696F, + 0xDDE4, 0x6944, 0xDDE5, 0x6976, 0xDDE6, 0x6958, 0xDDE7, 0x6941, 0xDDE8, 0x6974, 0xDDE9, 0x694C, 0xDDEA, 0x693B, 0xDDEB, 0x694B, + 0xDDEC, 0x6937, 0xDDED, 0x695C, 0xDDEE, 0x694F, 0xDDEF, 0x6951, 0xDDF0, 0x6932, 0xDDF1, 0x6952, 0xDDF2, 0x692F, 0xDDF3, 0x697B, + 0xDDF4, 0x693C, 0xDDF5, 0x6B46, 0xDDF6, 0x6B45, 0xDDF7, 0x6B43, 0xDDF8, 0x6B42, 0xDDF9, 0x6B48, 0xDDFA, 0x6B41, 0xDDFB, 0x6B9B, + 0xDDFC, 0xFA0D, 0xDDFD, 0x6BFB, 0xDDFE, 0x6BFC, 0xDE40, 0x6BF9, 0xDE41, 0x6BF7, 0xDE42, 0x6BF8, 0xDE43, 0x6E9B, 0xDE44, 0x6ED6, + 0xDE45, 0x6EC8, 0xDE46, 0x6E8F, 0xDE47, 0x6EC0, 0xDE48, 0x6E9F, 0xDE49, 0x6E93, 0xDE4A, 0x6E94, 0xDE4B, 0x6EA0, 0xDE4C, 0x6EB1, + 0xDE4D, 0x6EB9, 0xDE4E, 0x6EC6, 0xDE4F, 0x6ED2, 0xDE50, 0x6EBD, 0xDE51, 0x6EC1, 0xDE52, 0x6E9E, 0xDE53, 0x6EC9, 0xDE54, 0x6EB7, + 0xDE55, 0x6EB0, 0xDE56, 0x6ECD, 0xDE57, 0x6EA6, 0xDE58, 0x6ECF, 0xDE59, 0x6EB2, 0xDE5A, 0x6EBE, 0xDE5B, 0x6EC3, 0xDE5C, 0x6EDC, + 0xDE5D, 0x6ED8, 0xDE5E, 0x6E99, 0xDE5F, 0x6E92, 0xDE60, 0x6E8E, 0xDE61, 0x6E8D, 0xDE62, 0x6EA4, 0xDE63, 0x6EA1, 0xDE64, 0x6EBF, + 0xDE65, 0x6EB3, 0xDE66, 0x6ED0, 0xDE67, 0x6ECA, 0xDE68, 0x6E97, 0xDE69, 0x6EAE, 0xDE6A, 0x6EA3, 0xDE6B, 0x7147, 0xDE6C, 0x7154, + 0xDE6D, 0x7152, 0xDE6E, 0x7163, 0xDE6F, 0x7160, 0xDE70, 0x7141, 0xDE71, 0x715D, 0xDE72, 0x7162, 0xDE73, 0x7172, 0xDE74, 0x7178, + 0xDE75, 0x716A, 0xDE76, 0x7161, 0xDE77, 0x7142, 0xDE78, 0x7158, 0xDE79, 0x7143, 0xDE7A, 0x714B, 0xDE7B, 0x7170, 0xDE7C, 0x715F, + 0xDE7D, 0x7150, 0xDE7E, 0x7153, 0xDEA1, 0x7144, 0xDEA2, 0x714D, 0xDEA3, 0x715A, 0xDEA4, 0x724F, 0xDEA5, 0x728D, 0xDEA6, 0x728C, + 0xDEA7, 0x7291, 0xDEA8, 0x7290, 0xDEA9, 0x728E, 0xDEAA, 0x733C, 0xDEAB, 0x7342, 0xDEAC, 0x733B, 0xDEAD, 0x733A, 0xDEAE, 0x7340, + 0xDEAF, 0x734A, 0xDEB0, 0x7349, 0xDEB1, 0x7444, 0xDEB2, 0x744A, 0xDEB3, 0x744B, 0xDEB4, 0x7452, 0xDEB5, 0x7451, 0xDEB6, 0x7457, + 0xDEB7, 0x7440, 0xDEB8, 0x744F, 0xDEB9, 0x7450, 0xDEBA, 0x744E, 0xDEBB, 0x7442, 0xDEBC, 0x7446, 0xDEBD, 0x744D, 0xDEBE, 0x7454, + 0xDEBF, 0x74E1, 0xDEC0, 0x74FF, 0xDEC1, 0x74FE, 0xDEC2, 0x74FD, 0xDEC3, 0x751D, 0xDEC4, 0x7579, 0xDEC5, 0x7577, 0xDEC6, 0x6983, + 0xDEC7, 0x75EF, 0xDEC8, 0x760F, 0xDEC9, 0x7603, 0xDECA, 0x75F7, 0xDECB, 0x75FE, 0xDECC, 0x75FC, 0xDECD, 0x75F9, 0xDECE, 0x75F8, + 0xDECF, 0x7610, 0xDED0, 0x75FB, 0xDED1, 0x75F6, 0xDED2, 0x75ED, 0xDED3, 0x75F5, 0xDED4, 0x75FD, 0xDED5, 0x7699, 0xDED6, 0x76B5, + 0xDED7, 0x76DD, 0xDED8, 0x7755, 0xDED9, 0x775F, 0xDEDA, 0x7760, 0xDEDB, 0x7752, 0xDEDC, 0x7756, 0xDEDD, 0x775A, 0xDEDE, 0x7769, + 0xDEDF, 0x7767, 0xDEE0, 0x7754, 0xDEE1, 0x7759, 0xDEE2, 0x776D, 0xDEE3, 0x77E0, 0xDEE4, 0x7887, 0xDEE5, 0x789A, 0xDEE6, 0x7894, + 0xDEE7, 0x788F, 0xDEE8, 0x7884, 0xDEE9, 0x7895, 0xDEEA, 0x7885, 0xDEEB, 0x7886, 0xDEEC, 0x78A1, 0xDEED, 0x7883, 0xDEEE, 0x7879, + 0xDEEF, 0x7899, 0xDEF0, 0x7880, 0xDEF1, 0x7896, 0xDEF2, 0x787B, 0xDEF3, 0x797C, 0xDEF4, 0x7982, 0xDEF5, 0x797D, 0xDEF6, 0x7979, + 0xDEF7, 0x7A11, 0xDEF8, 0x7A18, 0xDEF9, 0x7A19, 0xDEFA, 0x7A12, 0xDEFB, 0x7A17, 0xDEFC, 0x7A15, 0xDEFD, 0x7A22, 0xDEFE, 0x7A13, + 0xDF40, 0x7A1B, 0xDF41, 0x7A10, 0xDF42, 0x7AA3, 0xDF43, 0x7AA2, 0xDF44, 0x7A9E, 0xDF45, 0x7AEB, 0xDF46, 0x7B66, 0xDF47, 0x7B64, + 0xDF48, 0x7B6D, 0xDF49, 0x7B74, 0xDF4A, 0x7B69, 0xDF4B, 0x7B72, 0xDF4C, 0x7B65, 0xDF4D, 0x7B73, 0xDF4E, 0x7B71, 0xDF4F, 0x7B70, + 0xDF50, 0x7B61, 0xDF51, 0x7B78, 0xDF52, 0x7B76, 0xDF53, 0x7B63, 0xDF54, 0x7CB2, 0xDF55, 0x7CB4, 0xDF56, 0x7CAF, 0xDF57, 0x7D88, + 0xDF58, 0x7D86, 0xDF59, 0x7D80, 0xDF5A, 0x7D8D, 0xDF5B, 0x7D7F, 0xDF5C, 0x7D85, 0xDF5D, 0x7D7A, 0xDF5E, 0x7D8E, 0xDF5F, 0x7D7B, + 0xDF60, 0x7D83, 0xDF61, 0x7D7C, 0xDF62, 0x7D8C, 0xDF63, 0x7D94, 0xDF64, 0x7D84, 0xDF65, 0x7D7D, 0xDF66, 0x7D92, 0xDF67, 0x7F6D, + 0xDF68, 0x7F6B, 0xDF69, 0x7F67, 0xDF6A, 0x7F68, 0xDF6B, 0x7F6C, 0xDF6C, 0x7FA6, 0xDF6D, 0x7FA5, 0xDF6E, 0x7FA7, 0xDF6F, 0x7FDB, + 0xDF70, 0x7FDC, 0xDF71, 0x8021, 0xDF72, 0x8164, 0xDF73, 0x8160, 0xDF74, 0x8177, 0xDF75, 0x815C, 0xDF76, 0x8169, 0xDF77, 0x815B, + 0xDF78, 0x8162, 0xDF79, 0x8172, 0xDF7A, 0x6721, 0xDF7B, 0x815E, 0xDF7C, 0x8176, 0xDF7D, 0x8167, 0xDF7E, 0x816F, 0xDFA1, 0x8144, + 0xDFA2, 0x8161, 0xDFA3, 0x821D, 0xDFA4, 0x8249, 0xDFA5, 0x8244, 0xDFA6, 0x8240, 0xDFA7, 0x8242, 0xDFA8, 0x8245, 0xDFA9, 0x84F1, + 0xDFAA, 0x843F, 0xDFAB, 0x8456, 0xDFAC, 0x8476, 0xDFAD, 0x8479, 0xDFAE, 0x848F, 0xDFAF, 0x848D, 0xDFB0, 0x8465, 0xDFB1, 0x8451, + 0xDFB2, 0x8440, 0xDFB3, 0x8486, 0xDFB4, 0x8467, 0xDFB5, 0x8430, 0xDFB6, 0x844D, 0xDFB7, 0x847D, 0xDFB8, 0x845A, 0xDFB9, 0x8459, + 0xDFBA, 0x8474, 0xDFBB, 0x8473, 0xDFBC, 0x845D, 0xDFBD, 0x8507, 0xDFBE, 0x845E, 0xDFBF, 0x8437, 0xDFC0, 0x843A, 0xDFC1, 0x8434, + 0xDFC2, 0x847A, 0xDFC3, 0x8443, 0xDFC4, 0x8478, 0xDFC5, 0x8432, 0xDFC6, 0x8445, 0xDFC7, 0x8429, 0xDFC8, 0x83D9, 0xDFC9, 0x844B, + 0xDFCA, 0x842F, 0xDFCB, 0x8442, 0xDFCC, 0x842D, 0xDFCD, 0x845F, 0xDFCE, 0x8470, 0xDFCF, 0x8439, 0xDFD0, 0x844E, 0xDFD1, 0x844C, + 0xDFD2, 0x8452, 0xDFD3, 0x846F, 0xDFD4, 0x84C5, 0xDFD5, 0x848E, 0xDFD6, 0x843B, 0xDFD7, 0x8447, 0xDFD8, 0x8436, 0xDFD9, 0x8433, + 0xDFDA, 0x8468, 0xDFDB, 0x847E, 0xDFDC, 0x8444, 0xDFDD, 0x842B, 0xDFDE, 0x8460, 0xDFDF, 0x8454, 0xDFE0, 0x846E, 0xDFE1, 0x8450, + 0xDFE2, 0x870B, 0xDFE3, 0x8704, 0xDFE4, 0x86F7, 0xDFE5, 0x870C, 0xDFE6, 0x86FA, 0xDFE7, 0x86D6, 0xDFE8, 0x86F5, 0xDFE9, 0x874D, + 0xDFEA, 0x86F8, 0xDFEB, 0x870E, 0xDFEC, 0x8709, 0xDFED, 0x8701, 0xDFEE, 0x86F6, 0xDFEF, 0x870D, 0xDFF0, 0x8705, 0xDFF1, 0x88D6, + 0xDFF2, 0x88CB, 0xDFF3, 0x88CD, 0xDFF4, 0x88CE, 0xDFF5, 0x88DE, 0xDFF6, 0x88DB, 0xDFF7, 0x88DA, 0xDFF8, 0x88CC, 0xDFF9, 0x88D0, + 0xDFFA, 0x8985, 0xDFFB, 0x899B, 0xDFFC, 0x89DF, 0xDFFD, 0x89E5, 0xDFFE, 0x89E4, 0xE040, 0x89E1, 0xE041, 0x89E0, 0xE042, 0x89E2, + 0xE043, 0x89DC, 0xE044, 0x89E6, 0xE045, 0x8A76, 0xE046, 0x8A86, 0xE047, 0x8A7F, 0xE048, 0x8A61, 0xE049, 0x8A3F, 0xE04A, 0x8A77, + 0xE04B, 0x8A82, 0xE04C, 0x8A84, 0xE04D, 0x8A75, 0xE04E, 0x8A83, 0xE04F, 0x8A81, 0xE050, 0x8A74, 0xE051, 0x8A7A, 0xE052, 0x8C3C, + 0xE053, 0x8C4B, 0xE054, 0x8C4A, 0xE055, 0x8C65, 0xE056, 0x8C64, 0xE057, 0x8C66, 0xE058, 0x8C86, 0xE059, 0x8C84, 0xE05A, 0x8C85, + 0xE05B, 0x8CCC, 0xE05C, 0x8D68, 0xE05D, 0x8D69, 0xE05E, 0x8D91, 0xE05F, 0x8D8C, 0xE060, 0x8D8E, 0xE061, 0x8D8F, 0xE062, 0x8D8D, + 0xE063, 0x8D93, 0xE064, 0x8D94, 0xE065, 0x8D90, 0xE066, 0x8D92, 0xE067, 0x8DF0, 0xE068, 0x8DE0, 0xE069, 0x8DEC, 0xE06A, 0x8DF1, + 0xE06B, 0x8DEE, 0xE06C, 0x8DD0, 0xE06D, 0x8DE9, 0xE06E, 0x8DE3, 0xE06F, 0x8DE2, 0xE070, 0x8DE7, 0xE071, 0x8DF2, 0xE072, 0x8DEB, + 0xE073, 0x8DF4, 0xE074, 0x8F06, 0xE075, 0x8EFF, 0xE076, 0x8F01, 0xE077, 0x8F00, 0xE078, 0x8F05, 0xE079, 0x8F07, 0xE07A, 0x8F08, + 0xE07B, 0x8F02, 0xE07C, 0x8F0B, 0xE07D, 0x9052, 0xE07E, 0x903F, 0xE0A1, 0x9044, 0xE0A2, 0x9049, 0xE0A3, 0x903D, 0xE0A4, 0x9110, + 0xE0A5, 0x910D, 0xE0A6, 0x910F, 0xE0A7, 0x9111, 0xE0A8, 0x9116, 0xE0A9, 0x9114, 0xE0AA, 0x910B, 0xE0AB, 0x910E, 0xE0AC, 0x916E, + 0xE0AD, 0x916F, 0xE0AE, 0x9248, 0xE0AF, 0x9252, 0xE0B0, 0x9230, 0xE0B1, 0x923A, 0xE0B2, 0x9266, 0xE0B3, 0x9233, 0xE0B4, 0x9265, + 0xE0B5, 0x925E, 0xE0B6, 0x9283, 0xE0B7, 0x922E, 0xE0B8, 0x924A, 0xE0B9, 0x9246, 0xE0BA, 0x926D, 0xE0BB, 0x926C, 0xE0BC, 0x924F, + 0xE0BD, 0x9260, 0xE0BE, 0x9267, 0xE0BF, 0x926F, 0xE0C0, 0x9236, 0xE0C1, 0x9261, 0xE0C2, 0x9270, 0xE0C3, 0x9231, 0xE0C4, 0x9254, + 0xE0C5, 0x9263, 0xE0C6, 0x9250, 0xE0C7, 0x9272, 0xE0C8, 0x924E, 0xE0C9, 0x9253, 0xE0CA, 0x924C, 0xE0CB, 0x9256, 0xE0CC, 0x9232, + 0xE0CD, 0x959F, 0xE0CE, 0x959C, 0xE0CF, 0x959E, 0xE0D0, 0x959B, 0xE0D1, 0x9692, 0xE0D2, 0x9693, 0xE0D3, 0x9691, 0xE0D4, 0x9697, + 0xE0D5, 0x96CE, 0xE0D6, 0x96FA, 0xE0D7, 0x96FD, 0xE0D8, 0x96F8, 0xE0D9, 0x96F5, 0xE0DA, 0x9773, 0xE0DB, 0x9777, 0xE0DC, 0x9778, + 0xE0DD, 0x9772, 0xE0DE, 0x980F, 0xE0DF, 0x980D, 0xE0E0, 0x980E, 0xE0E1, 0x98AC, 0xE0E2, 0x98F6, 0xE0E3, 0x98F9, 0xE0E4, 0x99AF, + 0xE0E5, 0x99B2, 0xE0E6, 0x99B0, 0xE0E7, 0x99B5, 0xE0E8, 0x9AAD, 0xE0E9, 0x9AAB, 0xE0EA, 0x9B5B, 0xE0EB, 0x9CEA, 0xE0EC, 0x9CED, + 0xE0ED, 0x9CE7, 0xE0EE, 0x9E80, 0xE0EF, 0x9EFD, 0xE0F0, 0x50E6, 0xE0F1, 0x50D4, 0xE0F2, 0x50D7, 0xE0F3, 0x50E8, 0xE0F4, 0x50F3, + 0xE0F5, 0x50DB, 0xE0F6, 0x50EA, 0xE0F7, 0x50DD, 0xE0F8, 0x50E4, 0xE0F9, 0x50D3, 0xE0FA, 0x50EC, 0xE0FB, 0x50F0, 0xE0FC, 0x50EF, + 0xE0FD, 0x50E3, 0xE0FE, 0x50E0, 0xE140, 0x51D8, 0xE141, 0x5280, 0xE142, 0x5281, 0xE143, 0x52E9, 0xE144, 0x52EB, 0xE145, 0x5330, + 0xE146, 0x53AC, 0xE147, 0x5627, 0xE148, 0x5615, 0xE149, 0x560C, 0xE14A, 0x5612, 0xE14B, 0x55FC, 0xE14C, 0x560F, 0xE14D, 0x561C, + 0xE14E, 0x5601, 0xE14F, 0x5613, 0xE150, 0x5602, 0xE151, 0x55FA, 0xE152, 0x561D, 0xE153, 0x5604, 0xE154, 0x55FF, 0xE155, 0x55F9, + 0xE156, 0x5889, 0xE157, 0x587C, 0xE158, 0x5890, 0xE159, 0x5898, 0xE15A, 0x5886, 0xE15B, 0x5881, 0xE15C, 0x587F, 0xE15D, 0x5874, + 0xE15E, 0x588B, 0xE15F, 0x587A, 0xE160, 0x5887, 0xE161, 0x5891, 0xE162, 0x588E, 0xE163, 0x5876, 0xE164, 0x5882, 0xE165, 0x5888, + 0xE166, 0x587B, 0xE167, 0x5894, 0xE168, 0x588F, 0xE169, 0x58FE, 0xE16A, 0x596B, 0xE16B, 0x5ADC, 0xE16C, 0x5AEE, 0xE16D, 0x5AE5, + 0xE16E, 0x5AD5, 0xE16F, 0x5AEA, 0xE170, 0x5ADA, 0xE171, 0x5AED, 0xE172, 0x5AEB, 0xE173, 0x5AF3, 0xE174, 0x5AE2, 0xE175, 0x5AE0, + 0xE176, 0x5ADB, 0xE177, 0x5AEC, 0xE178, 0x5ADE, 0xE179, 0x5ADD, 0xE17A, 0x5AD9, 0xE17B, 0x5AE8, 0xE17C, 0x5ADF, 0xE17D, 0x5B77, + 0xE17E, 0x5BE0, 0xE1A1, 0x5BE3, 0xE1A2, 0x5C63, 0xE1A3, 0x5D82, 0xE1A4, 0x5D80, 0xE1A5, 0x5D7D, 0xE1A6, 0x5D86, 0xE1A7, 0x5D7A, + 0xE1A8, 0x5D81, 0xE1A9, 0x5D77, 0xE1AA, 0x5D8A, 0xE1AB, 0x5D89, 0xE1AC, 0x5D88, 0xE1AD, 0x5D7E, 0xE1AE, 0x5D7C, 0xE1AF, 0x5D8D, + 0xE1B0, 0x5D79, 0xE1B1, 0x5D7F, 0xE1B2, 0x5E58, 0xE1B3, 0x5E59, 0xE1B4, 0x5E53, 0xE1B5, 0x5ED8, 0xE1B6, 0x5ED1, 0xE1B7, 0x5ED7, + 0xE1B8, 0x5ECE, 0xE1B9, 0x5EDC, 0xE1BA, 0x5ED5, 0xE1BB, 0x5ED9, 0xE1BC, 0x5ED2, 0xE1BD, 0x5ED4, 0xE1BE, 0x5F44, 0xE1BF, 0x5F43, + 0xE1C0, 0x5F6F, 0xE1C1, 0x5FB6, 0xE1C2, 0x612C, 0xE1C3, 0x6128, 0xE1C4, 0x6141, 0xE1C5, 0x615E, 0xE1C6, 0x6171, 0xE1C7, 0x6173, + 0xE1C8, 0x6152, 0xE1C9, 0x6153, 0xE1CA, 0x6172, 0xE1CB, 0x616C, 0xE1CC, 0x6180, 0xE1CD, 0x6174, 0xE1CE, 0x6154, 0xE1CF, 0x617A, + 0xE1D0, 0x615B, 0xE1D1, 0x6165, 0xE1D2, 0x613B, 0xE1D3, 0x616A, 0xE1D4, 0x6161, 0xE1D5, 0x6156, 0xE1D6, 0x6229, 0xE1D7, 0x6227, + 0xE1D8, 0x622B, 0xE1D9, 0x642B, 0xE1DA, 0x644D, 0xE1DB, 0x645B, 0xE1DC, 0x645D, 0xE1DD, 0x6474, 0xE1DE, 0x6476, 0xE1DF, 0x6472, + 0xE1E0, 0x6473, 0xE1E1, 0x647D, 0xE1E2, 0x6475, 0xE1E3, 0x6466, 0xE1E4, 0x64A6, 0xE1E5, 0x644E, 0xE1E6, 0x6482, 0xE1E7, 0x645E, + 0xE1E8, 0x645C, 0xE1E9, 0x644B, 0xE1EA, 0x6453, 0xE1EB, 0x6460, 0xE1EC, 0x6450, 0xE1ED, 0x647F, 0xE1EE, 0x643F, 0xE1EF, 0x646C, + 0xE1F0, 0x646B, 0xE1F1, 0x6459, 0xE1F2, 0x6465, 0xE1F3, 0x6477, 0xE1F4, 0x6573, 0xE1F5, 0x65A0, 0xE1F6, 0x66A1, 0xE1F7, 0x66A0, + 0xE1F8, 0x669F, 0xE1F9, 0x6705, 0xE1FA, 0x6704, 0xE1FB, 0x6722, 0xE1FC, 0x69B1, 0xE1FD, 0x69B6, 0xE1FE, 0x69C9, 0xE240, 0x69A0, + 0xE241, 0x69CE, 0xE242, 0x6996, 0xE243, 0x69B0, 0xE244, 0x69AC, 0xE245, 0x69BC, 0xE246, 0x6991, 0xE247, 0x6999, 0xE248, 0x698E, + 0xE249, 0x69A7, 0xE24A, 0x698D, 0xE24B, 0x69A9, 0xE24C, 0x69BE, 0xE24D, 0x69AF, 0xE24E, 0x69BF, 0xE24F, 0x69C4, 0xE250, 0x69BD, + 0xE251, 0x69A4, 0xE252, 0x69D4, 0xE253, 0x69B9, 0xE254, 0x69CA, 0xE255, 0x699A, 0xE256, 0x69CF, 0xE257, 0x69B3, 0xE258, 0x6993, + 0xE259, 0x69AA, 0xE25A, 0x69A1, 0xE25B, 0x699E, 0xE25C, 0x69D9, 0xE25D, 0x6997, 0xE25E, 0x6990, 0xE25F, 0x69C2, 0xE260, 0x69B5, + 0xE261, 0x69A5, 0xE262, 0x69C6, 0xE263, 0x6B4A, 0xE264, 0x6B4D, 0xE265, 0x6B4B, 0xE266, 0x6B9E, 0xE267, 0x6B9F, 0xE268, 0x6BA0, + 0xE269, 0x6BC3, 0xE26A, 0x6BC4, 0xE26B, 0x6BFE, 0xE26C, 0x6ECE, 0xE26D, 0x6EF5, 0xE26E, 0x6EF1, 0xE26F, 0x6F03, 0xE270, 0x6F25, + 0xE271, 0x6EF8, 0xE272, 0x6F37, 0xE273, 0x6EFB, 0xE274, 0x6F2E, 0xE275, 0x6F09, 0xE276, 0x6F4E, 0xE277, 0x6F19, 0xE278, 0x6F1A, + 0xE279, 0x6F27, 0xE27A, 0x6F18, 0xE27B, 0x6F3B, 0xE27C, 0x6F12, 0xE27D, 0x6EED, 0xE27E, 0x6F0A, 0xE2A1, 0x6F36, 0xE2A2, 0x6F73, + 0xE2A3, 0x6EF9, 0xE2A4, 0x6EEE, 0xE2A5, 0x6F2D, 0xE2A6, 0x6F40, 0xE2A7, 0x6F30, 0xE2A8, 0x6F3C, 0xE2A9, 0x6F35, 0xE2AA, 0x6EEB, + 0xE2AB, 0x6F07, 0xE2AC, 0x6F0E, 0xE2AD, 0x6F43, 0xE2AE, 0x6F05, 0xE2AF, 0x6EFD, 0xE2B0, 0x6EF6, 0xE2B1, 0x6F39, 0xE2B2, 0x6F1C, + 0xE2B3, 0x6EFC, 0xE2B4, 0x6F3A, 0xE2B5, 0x6F1F, 0xE2B6, 0x6F0D, 0xE2B7, 0x6F1E, 0xE2B8, 0x6F08, 0xE2B9, 0x6F21, 0xE2BA, 0x7187, + 0xE2BB, 0x7190, 0xE2BC, 0x7189, 0xE2BD, 0x7180, 0xE2BE, 0x7185, 0xE2BF, 0x7182, 0xE2C0, 0x718F, 0xE2C1, 0x717B, 0xE2C2, 0x7186, + 0xE2C3, 0x7181, 0xE2C4, 0x7197, 0xE2C5, 0x7244, 0xE2C6, 0x7253, 0xE2C7, 0x7297, 0xE2C8, 0x7295, 0xE2C9, 0x7293, 0xE2CA, 0x7343, + 0xE2CB, 0x734D, 0xE2CC, 0x7351, 0xE2CD, 0x734C, 0xE2CE, 0x7462, 0xE2CF, 0x7473, 0xE2D0, 0x7471, 0xE2D1, 0x7475, 0xE2D2, 0x7472, + 0xE2D3, 0x7467, 0xE2D4, 0x746E, 0xE2D5, 0x7500, 0xE2D6, 0x7502, 0xE2D7, 0x7503, 0xE2D8, 0x757D, 0xE2D9, 0x7590, 0xE2DA, 0x7616, + 0xE2DB, 0x7608, 0xE2DC, 0x760C, 0xE2DD, 0x7615, 0xE2DE, 0x7611, 0xE2DF, 0x760A, 0xE2E0, 0x7614, 0xE2E1, 0x76B8, 0xE2E2, 0x7781, + 0xE2E3, 0x777C, 0xE2E4, 0x7785, 0xE2E5, 0x7782, 0xE2E6, 0x776E, 0xE2E7, 0x7780, 0xE2E8, 0x776F, 0xE2E9, 0x777E, 0xE2EA, 0x7783, + 0xE2EB, 0x78B2, 0xE2EC, 0x78AA, 0xE2ED, 0x78B4, 0xE2EE, 0x78AD, 0xE2EF, 0x78A8, 0xE2F0, 0x787E, 0xE2F1, 0x78AB, 0xE2F2, 0x789E, + 0xE2F3, 0x78A5, 0xE2F4, 0x78A0, 0xE2F5, 0x78AC, 0xE2F6, 0x78A2, 0xE2F7, 0x78A4, 0xE2F8, 0x7998, 0xE2F9, 0x798A, 0xE2FA, 0x798B, + 0xE2FB, 0x7996, 0xE2FC, 0x7995, 0xE2FD, 0x7994, 0xE2FE, 0x7993, 0xE340, 0x7997, 0xE341, 0x7988, 0xE342, 0x7992, 0xE343, 0x7990, + 0xE344, 0x7A2B, 0xE345, 0x7A4A, 0xE346, 0x7A30, 0xE347, 0x7A2F, 0xE348, 0x7A28, 0xE349, 0x7A26, 0xE34A, 0x7AA8, 0xE34B, 0x7AAB, + 0xE34C, 0x7AAC, 0xE34D, 0x7AEE, 0xE34E, 0x7B88, 0xE34F, 0x7B9C, 0xE350, 0x7B8A, 0xE351, 0x7B91, 0xE352, 0x7B90, 0xE353, 0x7B96, + 0xE354, 0x7B8D, 0xE355, 0x7B8C, 0xE356, 0x7B9B, 0xE357, 0x7B8E, 0xE358, 0x7B85, 0xE359, 0x7B98, 0xE35A, 0x5284, 0xE35B, 0x7B99, + 0xE35C, 0x7BA4, 0xE35D, 0x7B82, 0xE35E, 0x7CBB, 0xE35F, 0x7CBF, 0xE360, 0x7CBC, 0xE361, 0x7CBA, 0xE362, 0x7DA7, 0xE363, 0x7DB7, + 0xE364, 0x7DC2, 0xE365, 0x7DA3, 0xE366, 0x7DAA, 0xE367, 0x7DC1, 0xE368, 0x7DC0, 0xE369, 0x7DC5, 0xE36A, 0x7D9D, 0xE36B, 0x7DCE, + 0xE36C, 0x7DC4, 0xE36D, 0x7DC6, 0xE36E, 0x7DCB, 0xE36F, 0x7DCC, 0xE370, 0x7DAF, 0xE371, 0x7DB9, 0xE372, 0x7D96, 0xE373, 0x7DBC, + 0xE374, 0x7D9F, 0xE375, 0x7DA6, 0xE376, 0x7DAE, 0xE377, 0x7DA9, 0xE378, 0x7DA1, 0xE379, 0x7DC9, 0xE37A, 0x7F73, 0xE37B, 0x7FE2, + 0xE37C, 0x7FE3, 0xE37D, 0x7FE5, 0xE37E, 0x7FDE, 0xE3A1, 0x8024, 0xE3A2, 0x805D, 0xE3A3, 0x805C, 0xE3A4, 0x8189, 0xE3A5, 0x8186, + 0xE3A6, 0x8183, 0xE3A7, 0x8187, 0xE3A8, 0x818D, 0xE3A9, 0x818C, 0xE3AA, 0x818B, 0xE3AB, 0x8215, 0xE3AC, 0x8497, 0xE3AD, 0x84A4, + 0xE3AE, 0x84A1, 0xE3AF, 0x849F, 0xE3B0, 0x84BA, 0xE3B1, 0x84CE, 0xE3B2, 0x84C2, 0xE3B3, 0x84AC, 0xE3B4, 0x84AE, 0xE3B5, 0x84AB, + 0xE3B6, 0x84B9, 0xE3B7, 0x84B4, 0xE3B8, 0x84C1, 0xE3B9, 0x84CD, 0xE3BA, 0x84AA, 0xE3BB, 0x849A, 0xE3BC, 0x84B1, 0xE3BD, 0x84D0, + 0xE3BE, 0x849D, 0xE3BF, 0x84A7, 0xE3C0, 0x84BB, 0xE3C1, 0x84A2, 0xE3C2, 0x8494, 0xE3C3, 0x84C7, 0xE3C4, 0x84CC, 0xE3C5, 0x849B, + 0xE3C6, 0x84A9, 0xE3C7, 0x84AF, 0xE3C8, 0x84A8, 0xE3C9, 0x84D6, 0xE3CA, 0x8498, 0xE3CB, 0x84B6, 0xE3CC, 0x84CF, 0xE3CD, 0x84A0, + 0xE3CE, 0x84D7, 0xE3CF, 0x84D4, 0xE3D0, 0x84D2, 0xE3D1, 0x84DB, 0xE3D2, 0x84B0, 0xE3D3, 0x8491, 0xE3D4, 0x8661, 0xE3D5, 0x8733, + 0xE3D6, 0x8723, 0xE3D7, 0x8728, 0xE3D8, 0x876B, 0xE3D9, 0x8740, 0xE3DA, 0x872E, 0xE3DB, 0x871E, 0xE3DC, 0x8721, 0xE3DD, 0x8719, + 0xE3DE, 0x871B, 0xE3DF, 0x8743, 0xE3E0, 0x872C, 0xE3E1, 0x8741, 0xE3E2, 0x873E, 0xE3E3, 0x8746, 0xE3E4, 0x8720, 0xE3E5, 0x8732, + 0xE3E6, 0x872A, 0xE3E7, 0x872D, 0xE3E8, 0x873C, 0xE3E9, 0x8712, 0xE3EA, 0x873A, 0xE3EB, 0x8731, 0xE3EC, 0x8735, 0xE3ED, 0x8742, + 0xE3EE, 0x8726, 0xE3EF, 0x8727, 0xE3F0, 0x8738, 0xE3F1, 0x8724, 0xE3F2, 0x871A, 0xE3F3, 0x8730, 0xE3F4, 0x8711, 0xE3F5, 0x88F7, + 0xE3F6, 0x88E7, 0xE3F7, 0x88F1, 0xE3F8, 0x88F2, 0xE3F9, 0x88FA, 0xE3FA, 0x88FE, 0xE3FB, 0x88EE, 0xE3FC, 0x88FC, 0xE3FD, 0x88F6, + 0xE3FE, 0x88FB, 0xE440, 0x88F0, 0xE441, 0x88EC, 0xE442, 0x88EB, 0xE443, 0x899D, 0xE444, 0x89A1, 0xE445, 0x899F, 0xE446, 0x899E, + 0xE447, 0x89E9, 0xE448, 0x89EB, 0xE449, 0x89E8, 0xE44A, 0x8AAB, 0xE44B, 0x8A99, 0xE44C, 0x8A8B, 0xE44D, 0x8A92, 0xE44E, 0x8A8F, + 0xE44F, 0x8A96, 0xE450, 0x8C3D, 0xE451, 0x8C68, 0xE452, 0x8C69, 0xE453, 0x8CD5, 0xE454, 0x8CCF, 0xE455, 0x8CD7, 0xE456, 0x8D96, + 0xE457, 0x8E09, 0xE458, 0x8E02, 0xE459, 0x8DFF, 0xE45A, 0x8E0D, 0xE45B, 0x8DFD, 0xE45C, 0x8E0A, 0xE45D, 0x8E03, 0xE45E, 0x8E07, + 0xE45F, 0x8E06, 0xE460, 0x8E05, 0xE461, 0x8DFE, 0xE462, 0x8E00, 0xE463, 0x8E04, 0xE464, 0x8F10, 0xE465, 0x8F11, 0xE466, 0x8F0E, + 0xE467, 0x8F0D, 0xE468, 0x9123, 0xE469, 0x911C, 0xE46A, 0x9120, 0xE46B, 0x9122, 0xE46C, 0x911F, 0xE46D, 0x911D, 0xE46E, 0x911A, + 0xE46F, 0x9124, 0xE470, 0x9121, 0xE471, 0x911B, 0xE472, 0x917A, 0xE473, 0x9172, 0xE474, 0x9179, 0xE475, 0x9173, 0xE476, 0x92A5, + 0xE477, 0x92A4, 0xE478, 0x9276, 0xE479, 0x929B, 0xE47A, 0x927A, 0xE47B, 0x92A0, 0xE47C, 0x9294, 0xE47D, 0x92AA, 0xE47E, 0x928D, + 0xE4A1, 0x92A6, 0xE4A2, 0x929A, 0xE4A3, 0x92AB, 0xE4A4, 0x9279, 0xE4A5, 0x9297, 0xE4A6, 0x927F, 0xE4A7, 0x92A3, 0xE4A8, 0x92EE, + 0xE4A9, 0x928E, 0xE4AA, 0x9282, 0xE4AB, 0x9295, 0xE4AC, 0x92A2, 0xE4AD, 0x927D, 0xE4AE, 0x9288, 0xE4AF, 0x92A1, 0xE4B0, 0x928A, + 0xE4B1, 0x9286, 0xE4B2, 0x928C, 0xE4B3, 0x9299, 0xE4B4, 0x92A7, 0xE4B5, 0x927E, 0xE4B6, 0x9287, 0xE4B7, 0x92A9, 0xE4B8, 0x929D, + 0xE4B9, 0x928B, 0xE4BA, 0x922D, 0xE4BB, 0x969E, 0xE4BC, 0x96A1, 0xE4BD, 0x96FF, 0xE4BE, 0x9758, 0xE4BF, 0x977D, 0xE4C0, 0x977A, + 0xE4C1, 0x977E, 0xE4C2, 0x9783, 0xE4C3, 0x9780, 0xE4C4, 0x9782, 0xE4C5, 0x977B, 0xE4C6, 0x9784, 0xE4C7, 0x9781, 0xE4C8, 0x977F, + 0xE4C9, 0x97CE, 0xE4CA, 0x97CD, 0xE4CB, 0x9816, 0xE4CC, 0x98AD, 0xE4CD, 0x98AE, 0xE4CE, 0x9902, 0xE4CF, 0x9900, 0xE4D0, 0x9907, + 0xE4D1, 0x999D, 0xE4D2, 0x999C, 0xE4D3, 0x99C3, 0xE4D4, 0x99B9, 0xE4D5, 0x99BB, 0xE4D6, 0x99BA, 0xE4D7, 0x99C2, 0xE4D8, 0x99BD, + 0xE4D9, 0x99C7, 0xE4DA, 0x9AB1, 0xE4DB, 0x9AE3, 0xE4DC, 0x9AE7, 0xE4DD, 0x9B3E, 0xE4DE, 0x9B3F, 0xE4DF, 0x9B60, 0xE4E0, 0x9B61, + 0xE4E1, 0x9B5F, 0xE4E2, 0x9CF1, 0xE4E3, 0x9CF2, 0xE4E4, 0x9CF5, 0xE4E5, 0x9EA7, 0xE4E6, 0x50FF, 0xE4E7, 0x5103, 0xE4E8, 0x5130, + 0xE4E9, 0x50F8, 0xE4EA, 0x5106, 0xE4EB, 0x5107, 0xE4EC, 0x50F6, 0xE4ED, 0x50FE, 0xE4EE, 0x510B, 0xE4EF, 0x510C, 0xE4F0, 0x50FD, + 0xE4F1, 0x510A, 0xE4F2, 0x528B, 0xE4F3, 0x528C, 0xE4F4, 0x52F1, 0xE4F5, 0x52EF, 0xE4F6, 0x5648, 0xE4F7, 0x5642, 0xE4F8, 0x564C, + 0xE4F9, 0x5635, 0xE4FA, 0x5641, 0xE4FB, 0x564A, 0xE4FC, 0x5649, 0xE4FD, 0x5646, 0xE4FE, 0x5658, 0xE540, 0x565A, 0xE541, 0x5640, + 0xE542, 0x5633, 0xE543, 0x563D, 0xE544, 0x562C, 0xE545, 0x563E, 0xE546, 0x5638, 0xE547, 0x562A, 0xE548, 0x563A, 0xE549, 0x571A, + 0xE54A, 0x58AB, 0xE54B, 0x589D, 0xE54C, 0x58B1, 0xE54D, 0x58A0, 0xE54E, 0x58A3, 0xE54F, 0x58AF, 0xE550, 0x58AC, 0xE551, 0x58A5, + 0xE552, 0x58A1, 0xE553, 0x58FF, 0xE554, 0x5AFF, 0xE555, 0x5AF4, 0xE556, 0x5AFD, 0xE557, 0x5AF7, 0xE558, 0x5AF6, 0xE559, 0x5B03, + 0xE55A, 0x5AF8, 0xE55B, 0x5B02, 0xE55C, 0x5AF9, 0xE55D, 0x5B01, 0xE55E, 0x5B07, 0xE55F, 0x5B05, 0xE560, 0x5B0F, 0xE561, 0x5C67, + 0xE562, 0x5D99, 0xE563, 0x5D97, 0xE564, 0x5D9F, 0xE565, 0x5D92, 0xE566, 0x5DA2, 0xE567, 0x5D93, 0xE568, 0x5D95, 0xE569, 0x5DA0, + 0xE56A, 0x5D9C, 0xE56B, 0x5DA1, 0xE56C, 0x5D9A, 0xE56D, 0x5D9E, 0xE56E, 0x5E69, 0xE56F, 0x5E5D, 0xE570, 0x5E60, 0xE571, 0x5E5C, + 0xE572, 0x7DF3, 0xE573, 0x5EDB, 0xE574, 0x5EDE, 0xE575, 0x5EE1, 0xE576, 0x5F49, 0xE577, 0x5FB2, 0xE578, 0x618B, 0xE579, 0x6183, + 0xE57A, 0x6179, 0xE57B, 0x61B1, 0xE57C, 0x61B0, 0xE57D, 0x61A2, 0xE57E, 0x6189, 0xE5A1, 0x619B, 0xE5A2, 0x6193, 0xE5A3, 0x61AF, + 0xE5A4, 0x61AD, 0xE5A5, 0x619F, 0xE5A6, 0x6192, 0xE5A7, 0x61AA, 0xE5A8, 0x61A1, 0xE5A9, 0x618D, 0xE5AA, 0x6166, 0xE5AB, 0x61B3, + 0xE5AC, 0x622D, 0xE5AD, 0x646E, 0xE5AE, 0x6470, 0xE5AF, 0x6496, 0xE5B0, 0x64A0, 0xE5B1, 0x6485, 0xE5B2, 0x6497, 0xE5B3, 0x649C, + 0xE5B4, 0x648F, 0xE5B5, 0x648B, 0xE5B6, 0x648A, 0xE5B7, 0x648C, 0xE5B8, 0x64A3, 0xE5B9, 0x649F, 0xE5BA, 0x6468, 0xE5BB, 0x64B1, + 0xE5BC, 0x6498, 0xE5BD, 0x6576, 0xE5BE, 0x657A, 0xE5BF, 0x6579, 0xE5C0, 0x657B, 0xE5C1, 0x65B2, 0xE5C2, 0x65B3, 0xE5C3, 0x66B5, + 0xE5C4, 0x66B0, 0xE5C5, 0x66A9, 0xE5C6, 0x66B2, 0xE5C7, 0x66B7, 0xE5C8, 0x66AA, 0xE5C9, 0x66AF, 0xE5CA, 0x6A00, 0xE5CB, 0x6A06, + 0xE5CC, 0x6A17, 0xE5CD, 0x69E5, 0xE5CE, 0x69F8, 0xE5CF, 0x6A15, 0xE5D0, 0x69F1, 0xE5D1, 0x69E4, 0xE5D2, 0x6A20, 0xE5D3, 0x69FF, + 0xE5D4, 0x69EC, 0xE5D5, 0x69E2, 0xE5D6, 0x6A1B, 0xE5D7, 0x6A1D, 0xE5D8, 0x69FE, 0xE5D9, 0x6A27, 0xE5DA, 0x69F2, 0xE5DB, 0x69EE, + 0xE5DC, 0x6A14, 0xE5DD, 0x69F7, 0xE5DE, 0x69E7, 0xE5DF, 0x6A40, 0xE5E0, 0x6A08, 0xE5E1, 0x69E6, 0xE5E2, 0x69FB, 0xE5E3, 0x6A0D, + 0xE5E4, 0x69FC, 0xE5E5, 0x69EB, 0xE5E6, 0x6A09, 0xE5E7, 0x6A04, 0xE5E8, 0x6A18, 0xE5E9, 0x6A25, 0xE5EA, 0x6A0F, 0xE5EB, 0x69F6, + 0xE5EC, 0x6A26, 0xE5ED, 0x6A07, 0xE5EE, 0x69F4, 0xE5EF, 0x6A16, 0xE5F0, 0x6B51, 0xE5F1, 0x6BA5, 0xE5F2, 0x6BA3, 0xE5F3, 0x6BA2, + 0xE5F4, 0x6BA6, 0xE5F5, 0x6C01, 0xE5F6, 0x6C00, 0xE5F7, 0x6BFF, 0xE5F8, 0x6C02, 0xE5F9, 0x6F41, 0xE5FA, 0x6F26, 0xE5FB, 0x6F7E, + 0xE5FC, 0x6F87, 0xE5FD, 0x6FC6, 0xE5FE, 0x6F92, 0xE640, 0x6F8D, 0xE641, 0x6F89, 0xE642, 0x6F8C, 0xE643, 0x6F62, 0xE644, 0x6F4F, + 0xE645, 0x6F85, 0xE646, 0x6F5A, 0xE647, 0x6F96, 0xE648, 0x6F76, 0xE649, 0x6F6C, 0xE64A, 0x6F82, 0xE64B, 0x6F55, 0xE64C, 0x6F72, + 0xE64D, 0x6F52, 0xE64E, 0x6F50, 0xE64F, 0x6F57, 0xE650, 0x6F94, 0xE651, 0x6F93, 0xE652, 0x6F5D, 0xE653, 0x6F00, 0xE654, 0x6F61, + 0xE655, 0x6F6B, 0xE656, 0x6F7D, 0xE657, 0x6F67, 0xE658, 0x6F90, 0xE659, 0x6F53, 0xE65A, 0x6F8B, 0xE65B, 0x6F69, 0xE65C, 0x6F7F, + 0xE65D, 0x6F95, 0xE65E, 0x6F63, 0xE65F, 0x6F77, 0xE660, 0x6F6A, 0xE661, 0x6F7B, 0xE662, 0x71B2, 0xE663, 0x71AF, 0xE664, 0x719B, + 0xE665, 0x71B0, 0xE666, 0x71A0, 0xE667, 0x719A, 0xE668, 0x71A9, 0xE669, 0x71B5, 0xE66A, 0x719D, 0xE66B, 0x71A5, 0xE66C, 0x719E, + 0xE66D, 0x71A4, 0xE66E, 0x71A1, 0xE66F, 0x71AA, 0xE670, 0x719C, 0xE671, 0x71A7, 0xE672, 0x71B3, 0xE673, 0x7298, 0xE674, 0x729A, + 0xE675, 0x7358, 0xE676, 0x7352, 0xE677, 0x735E, 0xE678, 0x735F, 0xE679, 0x7360, 0xE67A, 0x735D, 0xE67B, 0x735B, 0xE67C, 0x7361, + 0xE67D, 0x735A, 0xE67E, 0x7359, 0xE6A1, 0x7362, 0xE6A2, 0x7487, 0xE6A3, 0x7489, 0xE6A4, 0x748A, 0xE6A5, 0x7486, 0xE6A6, 0x7481, + 0xE6A7, 0x747D, 0xE6A8, 0x7485, 0xE6A9, 0x7488, 0xE6AA, 0x747C, 0xE6AB, 0x7479, 0xE6AC, 0x7508, 0xE6AD, 0x7507, 0xE6AE, 0x757E, + 0xE6AF, 0x7625, 0xE6B0, 0x761E, 0xE6B1, 0x7619, 0xE6B2, 0x761D, 0xE6B3, 0x761C, 0xE6B4, 0x7623, 0xE6B5, 0x761A, 0xE6B6, 0x7628, + 0xE6B7, 0x761B, 0xE6B8, 0x769C, 0xE6B9, 0x769D, 0xE6BA, 0x769E, 0xE6BB, 0x769B, 0xE6BC, 0x778D, 0xE6BD, 0x778F, 0xE6BE, 0x7789, + 0xE6BF, 0x7788, 0xE6C0, 0x78CD, 0xE6C1, 0x78BB, 0xE6C2, 0x78CF, 0xE6C3, 0x78CC, 0xE6C4, 0x78D1, 0xE6C5, 0x78CE, 0xE6C6, 0x78D4, + 0xE6C7, 0x78C8, 0xE6C8, 0x78C3, 0xE6C9, 0x78C4, 0xE6CA, 0x78C9, 0xE6CB, 0x799A, 0xE6CC, 0x79A1, 0xE6CD, 0x79A0, 0xE6CE, 0x799C, + 0xE6CF, 0x79A2, 0xE6D0, 0x799B, 0xE6D1, 0x6B76, 0xE6D2, 0x7A39, 0xE6D3, 0x7AB2, 0xE6D4, 0x7AB4, 0xE6D5, 0x7AB3, 0xE6D6, 0x7BB7, + 0xE6D7, 0x7BCB, 0xE6D8, 0x7BBE, 0xE6D9, 0x7BAC, 0xE6DA, 0x7BCE, 0xE6DB, 0x7BAF, 0xE6DC, 0x7BB9, 0xE6DD, 0x7BCA, 0xE6DE, 0x7BB5, + 0xE6DF, 0x7CC5, 0xE6E0, 0x7CC8, 0xE6E1, 0x7CCC, 0xE6E2, 0x7CCB, 0xE6E3, 0x7DF7, 0xE6E4, 0x7DDB, 0xE6E5, 0x7DEA, 0xE6E6, 0x7DE7, + 0xE6E7, 0x7DD7, 0xE6E8, 0x7DE1, 0xE6E9, 0x7E03, 0xE6EA, 0x7DFA, 0xE6EB, 0x7DE6, 0xE6EC, 0x7DF6, 0xE6ED, 0x7DF1, 0xE6EE, 0x7DF0, + 0xE6EF, 0x7DEE, 0xE6F0, 0x7DDF, 0xE6F1, 0x7F76, 0xE6F2, 0x7FAC, 0xE6F3, 0x7FB0, 0xE6F4, 0x7FAD, 0xE6F5, 0x7FED, 0xE6F6, 0x7FEB, + 0xE6F7, 0x7FEA, 0xE6F8, 0x7FEC, 0xE6F9, 0x7FE6, 0xE6FA, 0x7FE8, 0xE6FB, 0x8064, 0xE6FC, 0x8067, 0xE6FD, 0x81A3, 0xE6FE, 0x819F, + 0xE740, 0x819E, 0xE741, 0x8195, 0xE742, 0x81A2, 0xE743, 0x8199, 0xE744, 0x8197, 0xE745, 0x8216, 0xE746, 0x824F, 0xE747, 0x8253, + 0xE748, 0x8252, 0xE749, 0x8250, 0xE74A, 0x824E, 0xE74B, 0x8251, 0xE74C, 0x8524, 0xE74D, 0x853B, 0xE74E, 0x850F, 0xE74F, 0x8500, + 0xE750, 0x8529, 0xE751, 0x850E, 0xE752, 0x8509, 0xE753, 0x850D, 0xE754, 0x851F, 0xE755, 0x850A, 0xE756, 0x8527, 0xE757, 0x851C, + 0xE758, 0x84FB, 0xE759, 0x852B, 0xE75A, 0x84FA, 0xE75B, 0x8508, 0xE75C, 0x850C, 0xE75D, 0x84F4, 0xE75E, 0x852A, 0xE75F, 0x84F2, + 0xE760, 0x8515, 0xE761, 0x84F7, 0xE762, 0x84EB, 0xE763, 0x84F3, 0xE764, 0x84FC, 0xE765, 0x8512, 0xE766, 0x84EA, 0xE767, 0x84E9, + 0xE768, 0x8516, 0xE769, 0x84FE, 0xE76A, 0x8528, 0xE76B, 0x851D, 0xE76C, 0x852E, 0xE76D, 0x8502, 0xE76E, 0x84FD, 0xE76F, 0x851E, + 0xE770, 0x84F6, 0xE771, 0x8531, 0xE772, 0x8526, 0xE773, 0x84E7, 0xE774, 0x84E8, 0xE775, 0x84F0, 0xE776, 0x84EF, 0xE777, 0x84F9, + 0xE778, 0x8518, 0xE779, 0x8520, 0xE77A, 0x8530, 0xE77B, 0x850B, 0xE77C, 0x8519, 0xE77D, 0x852F, 0xE77E, 0x8662, 0xE7A1, 0x8756, + 0xE7A2, 0x8763, 0xE7A3, 0x8764, 0xE7A4, 0x8777, 0xE7A5, 0x87E1, 0xE7A6, 0x8773, 0xE7A7, 0x8758, 0xE7A8, 0x8754, 0xE7A9, 0x875B, + 0xE7AA, 0x8752, 0xE7AB, 0x8761, 0xE7AC, 0x875A, 0xE7AD, 0x8751, 0xE7AE, 0x875E, 0xE7AF, 0x876D, 0xE7B0, 0x876A, 0xE7B1, 0x8750, + 0xE7B2, 0x874E, 0xE7B3, 0x875F, 0xE7B4, 0x875D, 0xE7B5, 0x876F, 0xE7B6, 0x876C, 0xE7B7, 0x877A, 0xE7B8, 0x876E, 0xE7B9, 0x875C, + 0xE7BA, 0x8765, 0xE7BB, 0x874F, 0xE7BC, 0x877B, 0xE7BD, 0x8775, 0xE7BE, 0x8762, 0xE7BF, 0x8767, 0xE7C0, 0x8769, 0xE7C1, 0x885A, + 0xE7C2, 0x8905, 0xE7C3, 0x890C, 0xE7C4, 0x8914, 0xE7C5, 0x890B, 0xE7C6, 0x8917, 0xE7C7, 0x8918, 0xE7C8, 0x8919, 0xE7C9, 0x8906, + 0xE7CA, 0x8916, 0xE7CB, 0x8911, 0xE7CC, 0x890E, 0xE7CD, 0x8909, 0xE7CE, 0x89A2, 0xE7CF, 0x89A4, 0xE7D0, 0x89A3, 0xE7D1, 0x89ED, + 0xE7D2, 0x89F0, 0xE7D3, 0x89EC, 0xE7D4, 0x8ACF, 0xE7D5, 0x8AC6, 0xE7D6, 0x8AB8, 0xE7D7, 0x8AD3, 0xE7D8, 0x8AD1, 0xE7D9, 0x8AD4, + 0xE7DA, 0x8AD5, 0xE7DB, 0x8ABB, 0xE7DC, 0x8AD7, 0xE7DD, 0x8ABE, 0xE7DE, 0x8AC0, 0xE7DF, 0x8AC5, 0xE7E0, 0x8AD8, 0xE7E1, 0x8AC3, + 0xE7E2, 0x8ABA, 0xE7E3, 0x8ABD, 0xE7E4, 0x8AD9, 0xE7E5, 0x8C3E, 0xE7E6, 0x8C4D, 0xE7E7, 0x8C8F, 0xE7E8, 0x8CE5, 0xE7E9, 0x8CDF, + 0xE7EA, 0x8CD9, 0xE7EB, 0x8CE8, 0xE7EC, 0x8CDA, 0xE7ED, 0x8CDD, 0xE7EE, 0x8CE7, 0xE7EF, 0x8DA0, 0xE7F0, 0x8D9C, 0xE7F1, 0x8DA1, + 0xE7F2, 0x8D9B, 0xE7F3, 0x8E20, 0xE7F4, 0x8E23, 0xE7F5, 0x8E25, 0xE7F6, 0x8E24, 0xE7F7, 0x8E2E, 0xE7F8, 0x8E15, 0xE7F9, 0x8E1B, + 0xE7FA, 0x8E16, 0xE7FB, 0x8E11, 0xE7FC, 0x8E19, 0xE7FD, 0x8E26, 0xE7FE, 0x8E27, 0xE840, 0x8E14, 0xE841, 0x8E12, 0xE842, 0x8E18, + 0xE843, 0x8E13, 0xE844, 0x8E1C, 0xE845, 0x8E17, 0xE846, 0x8E1A, 0xE847, 0x8F2C, 0xE848, 0x8F24, 0xE849, 0x8F18, 0xE84A, 0x8F1A, + 0xE84B, 0x8F20, 0xE84C, 0x8F23, 0xE84D, 0x8F16, 0xE84E, 0x8F17, 0xE84F, 0x9073, 0xE850, 0x9070, 0xE851, 0x906F, 0xE852, 0x9067, + 0xE853, 0x906B, 0xE854, 0x912F, 0xE855, 0x912B, 0xE856, 0x9129, 0xE857, 0x912A, 0xE858, 0x9132, 0xE859, 0x9126, 0xE85A, 0x912E, + 0xE85B, 0x9185, 0xE85C, 0x9186, 0xE85D, 0x918A, 0xE85E, 0x9181, 0xE85F, 0x9182, 0xE860, 0x9184, 0xE861, 0x9180, 0xE862, 0x92D0, + 0xE863, 0x92C3, 0xE864, 0x92C4, 0xE865, 0x92C0, 0xE866, 0x92D9, 0xE867, 0x92B6, 0xE868, 0x92CF, 0xE869, 0x92F1, 0xE86A, 0x92DF, + 0xE86B, 0x92D8, 0xE86C, 0x92E9, 0xE86D, 0x92D7, 0xE86E, 0x92DD, 0xE86F, 0x92CC, 0xE870, 0x92EF, 0xE871, 0x92C2, 0xE872, 0x92E8, + 0xE873, 0x92CA, 0xE874, 0x92C8, 0xE875, 0x92CE, 0xE876, 0x92E6, 0xE877, 0x92CD, 0xE878, 0x92D5, 0xE879, 0x92C9, 0xE87A, 0x92E0, + 0xE87B, 0x92DE, 0xE87C, 0x92E7, 0xE87D, 0x92D1, 0xE87E, 0x92D3, 0xE8A1, 0x92B5, 0xE8A2, 0x92E1, 0xE8A3, 0x92C6, 0xE8A4, 0x92B4, + 0xE8A5, 0x957C, 0xE8A6, 0x95AC, 0xE8A7, 0x95AB, 0xE8A8, 0x95AE, 0xE8A9, 0x95B0, 0xE8AA, 0x96A4, 0xE8AB, 0x96A2, 0xE8AC, 0x96D3, + 0xE8AD, 0x9705, 0xE8AE, 0x9708, 0xE8AF, 0x9702, 0xE8B0, 0x975A, 0xE8B1, 0x978A, 0xE8B2, 0x978E, 0xE8B3, 0x9788, 0xE8B4, 0x97D0, + 0xE8B5, 0x97CF, 0xE8B6, 0x981E, 0xE8B7, 0x981D, 0xE8B8, 0x9826, 0xE8B9, 0x9829, 0xE8BA, 0x9828, 0xE8BB, 0x9820, 0xE8BC, 0x981B, + 0xE8BD, 0x9827, 0xE8BE, 0x98B2, 0xE8BF, 0x9908, 0xE8C0, 0x98FA, 0xE8C1, 0x9911, 0xE8C2, 0x9914, 0xE8C3, 0x9916, 0xE8C4, 0x9917, + 0xE8C5, 0x9915, 0xE8C6, 0x99DC, 0xE8C7, 0x99CD, 0xE8C8, 0x99CF, 0xE8C9, 0x99D3, 0xE8CA, 0x99D4, 0xE8CB, 0x99CE, 0xE8CC, 0x99C9, + 0xE8CD, 0x99D6, 0xE8CE, 0x99D8, 0xE8CF, 0x99CB, 0xE8D0, 0x99D7, 0xE8D1, 0x99CC, 0xE8D2, 0x9AB3, 0xE8D3, 0x9AEC, 0xE8D4, 0x9AEB, + 0xE8D5, 0x9AF3, 0xE8D6, 0x9AF2, 0xE8D7, 0x9AF1, 0xE8D8, 0x9B46, 0xE8D9, 0x9B43, 0xE8DA, 0x9B67, 0xE8DB, 0x9B74, 0xE8DC, 0x9B71, + 0xE8DD, 0x9B66, 0xE8DE, 0x9B76, 0xE8DF, 0x9B75, 0xE8E0, 0x9B70, 0xE8E1, 0x9B68, 0xE8E2, 0x9B64, 0xE8E3, 0x9B6C, 0xE8E4, 0x9CFC, + 0xE8E5, 0x9CFA, 0xE8E6, 0x9CFD, 0xE8E7, 0x9CFF, 0xE8E8, 0x9CF7, 0xE8E9, 0x9D07, 0xE8EA, 0x9D00, 0xE8EB, 0x9CF9, 0xE8EC, 0x9CFB, + 0xE8ED, 0x9D08, 0xE8EE, 0x9D05, 0xE8EF, 0x9D04, 0xE8F0, 0x9E83, 0xE8F1, 0x9ED3, 0xE8F2, 0x9F0F, 0xE8F3, 0x9F10, 0xE8F4, 0x511C, + 0xE8F5, 0x5113, 0xE8F6, 0x5117, 0xE8F7, 0x511A, 0xE8F8, 0x5111, 0xE8F9, 0x51DE, 0xE8FA, 0x5334, 0xE8FB, 0x53E1, 0xE8FC, 0x5670, + 0xE8FD, 0x5660, 0xE8FE, 0x566E, 0xE940, 0x5673, 0xE941, 0x5666, 0xE942, 0x5663, 0xE943, 0x566D, 0xE944, 0x5672, 0xE945, 0x565E, + 0xE946, 0x5677, 0xE947, 0x571C, 0xE948, 0x571B, 0xE949, 0x58C8, 0xE94A, 0x58BD, 0xE94B, 0x58C9, 0xE94C, 0x58BF, 0xE94D, 0x58BA, + 0xE94E, 0x58C2, 0xE94F, 0x58BC, 0xE950, 0x58C6, 0xE951, 0x5B17, 0xE952, 0x5B19, 0xE953, 0x5B1B, 0xE954, 0x5B21, 0xE955, 0x5B14, + 0xE956, 0x5B13, 0xE957, 0x5B10, 0xE958, 0x5B16, 0xE959, 0x5B28, 0xE95A, 0x5B1A, 0xE95B, 0x5B20, 0xE95C, 0x5B1E, 0xE95D, 0x5BEF, + 0xE95E, 0x5DAC, 0xE95F, 0x5DB1, 0xE960, 0x5DA9, 0xE961, 0x5DA7, 0xE962, 0x5DB5, 0xE963, 0x5DB0, 0xE964, 0x5DAE, 0xE965, 0x5DAA, + 0xE966, 0x5DA8, 0xE967, 0x5DB2, 0xE968, 0x5DAD, 0xE969, 0x5DAF, 0xE96A, 0x5DB4, 0xE96B, 0x5E67, 0xE96C, 0x5E68, 0xE96D, 0x5E66, + 0xE96E, 0x5E6F, 0xE96F, 0x5EE9, 0xE970, 0x5EE7, 0xE971, 0x5EE6, 0xE972, 0x5EE8, 0xE973, 0x5EE5, 0xE974, 0x5F4B, 0xE975, 0x5FBC, + 0xE976, 0x619D, 0xE977, 0x61A8, 0xE978, 0x6196, 0xE979, 0x61C5, 0xE97A, 0x61B4, 0xE97B, 0x61C6, 0xE97C, 0x61C1, 0xE97D, 0x61CC, + 0xE97E, 0x61BA, 0xE9A1, 0x61BF, 0xE9A2, 0x61B8, 0xE9A3, 0x618C, 0xE9A4, 0x64D7, 0xE9A5, 0x64D6, 0xE9A6, 0x64D0, 0xE9A7, 0x64CF, + 0xE9A8, 0x64C9, 0xE9A9, 0x64BD, 0xE9AA, 0x6489, 0xE9AB, 0x64C3, 0xE9AC, 0x64DB, 0xE9AD, 0x64F3, 0xE9AE, 0x64D9, 0xE9AF, 0x6533, + 0xE9B0, 0x657F, 0xE9B1, 0x657C, 0xE9B2, 0x65A2, 0xE9B3, 0x66C8, 0xE9B4, 0x66BE, 0xE9B5, 0x66C0, 0xE9B6, 0x66CA, 0xE9B7, 0x66CB, + 0xE9B8, 0x66CF, 0xE9B9, 0x66BD, 0xE9BA, 0x66BB, 0xE9BB, 0x66BA, 0xE9BC, 0x66CC, 0xE9BD, 0x6723, 0xE9BE, 0x6A34, 0xE9BF, 0x6A66, + 0xE9C0, 0x6A49, 0xE9C1, 0x6A67, 0xE9C2, 0x6A32, 0xE9C3, 0x6A68, 0xE9C4, 0x6A3E, 0xE9C5, 0x6A5D, 0xE9C6, 0x6A6D, 0xE9C7, 0x6A76, + 0xE9C8, 0x6A5B, 0xE9C9, 0x6A51, 0xE9CA, 0x6A28, 0xE9CB, 0x6A5A, 0xE9CC, 0x6A3B, 0xE9CD, 0x6A3F, 0xE9CE, 0x6A41, 0xE9CF, 0x6A6A, + 0xE9D0, 0x6A64, 0xE9D1, 0x6A50, 0xE9D2, 0x6A4F, 0xE9D3, 0x6A54, 0xE9D4, 0x6A6F, 0xE9D5, 0x6A69, 0xE9D6, 0x6A60, 0xE9D7, 0x6A3C, + 0xE9D8, 0x6A5E, 0xE9D9, 0x6A56, 0xE9DA, 0x6A55, 0xE9DB, 0x6A4D, 0xE9DC, 0x6A4E, 0xE9DD, 0x6A46, 0xE9DE, 0x6B55, 0xE9DF, 0x6B54, + 0xE9E0, 0x6B56, 0xE9E1, 0x6BA7, 0xE9E2, 0x6BAA, 0xE9E3, 0x6BAB, 0xE9E4, 0x6BC8, 0xE9E5, 0x6BC7, 0xE9E6, 0x6C04, 0xE9E7, 0x6C03, + 0xE9E8, 0x6C06, 0xE9E9, 0x6FAD, 0xE9EA, 0x6FCB, 0xE9EB, 0x6FA3, 0xE9EC, 0x6FC7, 0xE9ED, 0x6FBC, 0xE9EE, 0x6FCE, 0xE9EF, 0x6FC8, + 0xE9F0, 0x6F5E, 0xE9F1, 0x6FC4, 0xE9F2, 0x6FBD, 0xE9F3, 0x6F9E, 0xE9F4, 0x6FCA, 0xE9F5, 0x6FA8, 0xE9F6, 0x7004, 0xE9F7, 0x6FA5, + 0xE9F8, 0x6FAE, 0xE9F9, 0x6FBA, 0xE9FA, 0x6FAC, 0xE9FB, 0x6FAA, 0xE9FC, 0x6FCF, 0xE9FD, 0x6FBF, 0xE9FE, 0x6FB8, 0xEA40, 0x6FA2, + 0xEA41, 0x6FC9, 0xEA42, 0x6FAB, 0xEA43, 0x6FCD, 0xEA44, 0x6FAF, 0xEA45, 0x6FB2, 0xEA46, 0x6FB0, 0xEA47, 0x71C5, 0xEA48, 0x71C2, + 0xEA49, 0x71BF, 0xEA4A, 0x71B8, 0xEA4B, 0x71D6, 0xEA4C, 0x71C0, 0xEA4D, 0x71C1, 0xEA4E, 0x71CB, 0xEA4F, 0x71D4, 0xEA50, 0x71CA, + 0xEA51, 0x71C7, 0xEA52, 0x71CF, 0xEA53, 0x71BD, 0xEA54, 0x71D8, 0xEA55, 0x71BC, 0xEA56, 0x71C6, 0xEA57, 0x71DA, 0xEA58, 0x71DB, + 0xEA59, 0x729D, 0xEA5A, 0x729E, 0xEA5B, 0x7369, 0xEA5C, 0x7366, 0xEA5D, 0x7367, 0xEA5E, 0x736C, 0xEA5F, 0x7365, 0xEA60, 0x736B, + 0xEA61, 0x736A, 0xEA62, 0x747F, 0xEA63, 0x749A, 0xEA64, 0x74A0, 0xEA65, 0x7494, 0xEA66, 0x7492, 0xEA67, 0x7495, 0xEA68, 0x74A1, + 0xEA69, 0x750B, 0xEA6A, 0x7580, 0xEA6B, 0x762F, 0xEA6C, 0x762D, 0xEA6D, 0x7631, 0xEA6E, 0x763D, 0xEA6F, 0x7633, 0xEA70, 0x763C, + 0xEA71, 0x7635, 0xEA72, 0x7632, 0xEA73, 0x7630, 0xEA74, 0x76BB, 0xEA75, 0x76E6, 0xEA76, 0x779A, 0xEA77, 0x779D, 0xEA78, 0x77A1, + 0xEA79, 0x779C, 0xEA7A, 0x779B, 0xEA7B, 0x77A2, 0xEA7C, 0x77A3, 0xEA7D, 0x7795, 0xEA7E, 0x7799, 0xEAA1, 0x7797, 0xEAA2, 0x78DD, + 0xEAA3, 0x78E9, 0xEAA4, 0x78E5, 0xEAA5, 0x78EA, 0xEAA6, 0x78DE, 0xEAA7, 0x78E3, 0xEAA8, 0x78DB, 0xEAA9, 0x78E1, 0xEAAA, 0x78E2, + 0xEAAB, 0x78ED, 0xEAAC, 0x78DF, 0xEAAD, 0x78E0, 0xEAAE, 0x79A4, 0xEAAF, 0x7A44, 0xEAB0, 0x7A48, 0xEAB1, 0x7A47, 0xEAB2, 0x7AB6, + 0xEAB3, 0x7AB8, 0xEAB4, 0x7AB5, 0xEAB5, 0x7AB1, 0xEAB6, 0x7AB7, 0xEAB7, 0x7BDE, 0xEAB8, 0x7BE3, 0xEAB9, 0x7BE7, 0xEABA, 0x7BDD, + 0xEABB, 0x7BD5, 0xEABC, 0x7BE5, 0xEABD, 0x7BDA, 0xEABE, 0x7BE8, 0xEABF, 0x7BF9, 0xEAC0, 0x7BD4, 0xEAC1, 0x7BEA, 0xEAC2, 0x7BE2, + 0xEAC3, 0x7BDC, 0xEAC4, 0x7BEB, 0xEAC5, 0x7BD8, 0xEAC6, 0x7BDF, 0xEAC7, 0x7CD2, 0xEAC8, 0x7CD4, 0xEAC9, 0x7CD7, 0xEACA, 0x7CD0, + 0xEACB, 0x7CD1, 0xEACC, 0x7E12, 0xEACD, 0x7E21, 0xEACE, 0x7E17, 0xEACF, 0x7E0C, 0xEAD0, 0x7E1F, 0xEAD1, 0x7E20, 0xEAD2, 0x7E13, + 0xEAD3, 0x7E0E, 0xEAD4, 0x7E1C, 0xEAD5, 0x7E15, 0xEAD6, 0x7E1A, 0xEAD7, 0x7E22, 0xEAD8, 0x7E0B, 0xEAD9, 0x7E0F, 0xEADA, 0x7E16, + 0xEADB, 0x7E0D, 0xEADC, 0x7E14, 0xEADD, 0x7E25, 0xEADE, 0x7E24, 0xEADF, 0x7F43, 0xEAE0, 0x7F7B, 0xEAE1, 0x7F7C, 0xEAE2, 0x7F7A, + 0xEAE3, 0x7FB1, 0xEAE4, 0x7FEF, 0xEAE5, 0x802A, 0xEAE6, 0x8029, 0xEAE7, 0x806C, 0xEAE8, 0x81B1, 0xEAE9, 0x81A6, 0xEAEA, 0x81AE, + 0xEAEB, 0x81B9, 0xEAEC, 0x81B5, 0xEAED, 0x81AB, 0xEAEE, 0x81B0, 0xEAEF, 0x81AC, 0xEAF0, 0x81B4, 0xEAF1, 0x81B2, 0xEAF2, 0x81B7, + 0xEAF3, 0x81A7, 0xEAF4, 0x81F2, 0xEAF5, 0x8255, 0xEAF6, 0x8256, 0xEAF7, 0x8257, 0xEAF8, 0x8556, 0xEAF9, 0x8545, 0xEAFA, 0x856B, + 0xEAFB, 0x854D, 0xEAFC, 0x8553, 0xEAFD, 0x8561, 0xEAFE, 0x8558, 0xEB40, 0x8540, 0xEB41, 0x8546, 0xEB42, 0x8564, 0xEB43, 0x8541, + 0xEB44, 0x8562, 0xEB45, 0x8544, 0xEB46, 0x8551, 0xEB47, 0x8547, 0xEB48, 0x8563, 0xEB49, 0x853E, 0xEB4A, 0x855B, 0xEB4B, 0x8571, + 0xEB4C, 0x854E, 0xEB4D, 0x856E, 0xEB4E, 0x8575, 0xEB4F, 0x8555, 0xEB50, 0x8567, 0xEB51, 0x8560, 0xEB52, 0x858C, 0xEB53, 0x8566, + 0xEB54, 0x855D, 0xEB55, 0x8554, 0xEB56, 0x8565, 0xEB57, 0x856C, 0xEB58, 0x8663, 0xEB59, 0x8665, 0xEB5A, 0x8664, 0xEB5B, 0x879B, + 0xEB5C, 0x878F, 0xEB5D, 0x8797, 0xEB5E, 0x8793, 0xEB5F, 0x8792, 0xEB60, 0x8788, 0xEB61, 0x8781, 0xEB62, 0x8796, 0xEB63, 0x8798, + 0xEB64, 0x8779, 0xEB65, 0x8787, 0xEB66, 0x87A3, 0xEB67, 0x8785, 0xEB68, 0x8790, 0xEB69, 0x8791, 0xEB6A, 0x879D, 0xEB6B, 0x8784, + 0xEB6C, 0x8794, 0xEB6D, 0x879C, 0xEB6E, 0x879A, 0xEB6F, 0x8789, 0xEB70, 0x891E, 0xEB71, 0x8926, 0xEB72, 0x8930, 0xEB73, 0x892D, + 0xEB74, 0x892E, 0xEB75, 0x8927, 0xEB76, 0x8931, 0xEB77, 0x8922, 0xEB78, 0x8929, 0xEB79, 0x8923, 0xEB7A, 0x892F, 0xEB7B, 0x892C, + 0xEB7C, 0x891F, 0xEB7D, 0x89F1, 0xEB7E, 0x8AE0, 0xEBA1, 0x8AE2, 0xEBA2, 0x8AF2, 0xEBA3, 0x8AF4, 0xEBA4, 0x8AF5, 0xEBA5, 0x8ADD, + 0xEBA6, 0x8B14, 0xEBA7, 0x8AE4, 0xEBA8, 0x8ADF, 0xEBA9, 0x8AF0, 0xEBAA, 0x8AC8, 0xEBAB, 0x8ADE, 0xEBAC, 0x8AE1, 0xEBAD, 0x8AE8, + 0xEBAE, 0x8AFF, 0xEBAF, 0x8AEF, 0xEBB0, 0x8AFB, 0xEBB1, 0x8C91, 0xEBB2, 0x8C92, 0xEBB3, 0x8C90, 0xEBB4, 0x8CF5, 0xEBB5, 0x8CEE, + 0xEBB6, 0x8CF1, 0xEBB7, 0x8CF0, 0xEBB8, 0x8CF3, 0xEBB9, 0x8D6C, 0xEBBA, 0x8D6E, 0xEBBB, 0x8DA5, 0xEBBC, 0x8DA7, 0xEBBD, 0x8E33, + 0xEBBE, 0x8E3E, 0xEBBF, 0x8E38, 0xEBC0, 0x8E40, 0xEBC1, 0x8E45, 0xEBC2, 0x8E36, 0xEBC3, 0x8E3C, 0xEBC4, 0x8E3D, 0xEBC5, 0x8E41, + 0xEBC6, 0x8E30, 0xEBC7, 0x8E3F, 0xEBC8, 0x8EBD, 0xEBC9, 0x8F36, 0xEBCA, 0x8F2E, 0xEBCB, 0x8F35, 0xEBCC, 0x8F32, 0xEBCD, 0x8F39, + 0xEBCE, 0x8F37, 0xEBCF, 0x8F34, 0xEBD0, 0x9076, 0xEBD1, 0x9079, 0xEBD2, 0x907B, 0xEBD3, 0x9086, 0xEBD4, 0x90FA, 0xEBD5, 0x9133, + 0xEBD6, 0x9135, 0xEBD7, 0x9136, 0xEBD8, 0x9193, 0xEBD9, 0x9190, 0xEBDA, 0x9191, 0xEBDB, 0x918D, 0xEBDC, 0x918F, 0xEBDD, 0x9327, + 0xEBDE, 0x931E, 0xEBDF, 0x9308, 0xEBE0, 0x931F, 0xEBE1, 0x9306, 0xEBE2, 0x930F, 0xEBE3, 0x937A, 0xEBE4, 0x9338, 0xEBE5, 0x933C, + 0xEBE6, 0x931B, 0xEBE7, 0x9323, 0xEBE8, 0x9312, 0xEBE9, 0x9301, 0xEBEA, 0x9346, 0xEBEB, 0x932D, 0xEBEC, 0x930E, 0xEBED, 0x930D, + 0xEBEE, 0x92CB, 0xEBEF, 0x931D, 0xEBF0, 0x92FA, 0xEBF1, 0x9325, 0xEBF2, 0x9313, 0xEBF3, 0x92F9, 0xEBF4, 0x92F7, 0xEBF5, 0x9334, + 0xEBF6, 0x9302, 0xEBF7, 0x9324, 0xEBF8, 0x92FF, 0xEBF9, 0x9329, 0xEBFA, 0x9339, 0xEBFB, 0x9335, 0xEBFC, 0x932A, 0xEBFD, 0x9314, + 0xEBFE, 0x930C, 0xEC40, 0x930B, 0xEC41, 0x92FE, 0xEC42, 0x9309, 0xEC43, 0x9300, 0xEC44, 0x92FB, 0xEC45, 0x9316, 0xEC46, 0x95BC, + 0xEC47, 0x95CD, 0xEC48, 0x95BE, 0xEC49, 0x95B9, 0xEC4A, 0x95BA, 0xEC4B, 0x95B6, 0xEC4C, 0x95BF, 0xEC4D, 0x95B5, 0xEC4E, 0x95BD, + 0xEC4F, 0x96A9, 0xEC50, 0x96D4, 0xEC51, 0x970B, 0xEC52, 0x9712, 0xEC53, 0x9710, 0xEC54, 0x9799, 0xEC55, 0x9797, 0xEC56, 0x9794, + 0xEC57, 0x97F0, 0xEC58, 0x97F8, 0xEC59, 0x9835, 0xEC5A, 0x982F, 0xEC5B, 0x9832, 0xEC5C, 0x9924, 0xEC5D, 0x991F, 0xEC5E, 0x9927, + 0xEC5F, 0x9929, 0xEC60, 0x999E, 0xEC61, 0x99EE, 0xEC62, 0x99EC, 0xEC63, 0x99E5, 0xEC64, 0x99E4, 0xEC65, 0x99F0, 0xEC66, 0x99E3, + 0xEC67, 0x99EA, 0xEC68, 0x99E9, 0xEC69, 0x99E7, 0xEC6A, 0x9AB9, 0xEC6B, 0x9ABF, 0xEC6C, 0x9AB4, 0xEC6D, 0x9ABB, 0xEC6E, 0x9AF6, + 0xEC6F, 0x9AFA, 0xEC70, 0x9AF9, 0xEC71, 0x9AF7, 0xEC72, 0x9B33, 0xEC73, 0x9B80, 0xEC74, 0x9B85, 0xEC75, 0x9B87, 0xEC76, 0x9B7C, + 0xEC77, 0x9B7E, 0xEC78, 0x9B7B, 0xEC79, 0x9B82, 0xEC7A, 0x9B93, 0xEC7B, 0x9B92, 0xEC7C, 0x9B90, 0xEC7D, 0x9B7A, 0xEC7E, 0x9B95, + 0xECA1, 0x9B7D, 0xECA2, 0x9B88, 0xECA3, 0x9D25, 0xECA4, 0x9D17, 0xECA5, 0x9D20, 0xECA6, 0x9D1E, 0xECA7, 0x9D14, 0xECA8, 0x9D29, + 0xECA9, 0x9D1D, 0xECAA, 0x9D18, 0xECAB, 0x9D22, 0xECAC, 0x9D10, 0xECAD, 0x9D19, 0xECAE, 0x9D1F, 0xECAF, 0x9E88, 0xECB0, 0x9E86, + 0xECB1, 0x9E87, 0xECB2, 0x9EAE, 0xECB3, 0x9EAD, 0xECB4, 0x9ED5, 0xECB5, 0x9ED6, 0xECB6, 0x9EFA, 0xECB7, 0x9F12, 0xECB8, 0x9F3D, + 0xECB9, 0x5126, 0xECBA, 0x5125, 0xECBB, 0x5122, 0xECBC, 0x5124, 0xECBD, 0x5120, 0xECBE, 0x5129, 0xECBF, 0x52F4, 0xECC0, 0x5693, + 0xECC1, 0x568C, 0xECC2, 0x568D, 0xECC3, 0x5686, 0xECC4, 0x5684, 0xECC5, 0x5683, 0xECC6, 0x567E, 0xECC7, 0x5682, 0xECC8, 0x567F, + 0xECC9, 0x5681, 0xECCA, 0x58D6, 0xECCB, 0x58D4, 0xECCC, 0x58CF, 0xECCD, 0x58D2, 0xECCE, 0x5B2D, 0xECCF, 0x5B25, 0xECD0, 0x5B32, + 0xECD1, 0x5B23, 0xECD2, 0x5B2C, 0xECD3, 0x5B27, 0xECD4, 0x5B26, 0xECD5, 0x5B2F, 0xECD6, 0x5B2E, 0xECD7, 0x5B7B, 0xECD8, 0x5BF1, + 0xECD9, 0x5BF2, 0xECDA, 0x5DB7, 0xECDB, 0x5E6C, 0xECDC, 0x5E6A, 0xECDD, 0x5FBE, 0xECDE, 0x5FBB, 0xECDF, 0x61C3, 0xECE0, 0x61B5, + 0xECE1, 0x61BC, 0xECE2, 0x61E7, 0xECE3, 0x61E0, 0xECE4, 0x61E5, 0xECE5, 0x61E4, 0xECE6, 0x61E8, 0xECE7, 0x61DE, 0xECE8, 0x64EF, + 0xECE9, 0x64E9, 0xECEA, 0x64E3, 0xECEB, 0x64EB, 0xECEC, 0x64E4, 0xECED, 0x64E8, 0xECEE, 0x6581, 0xECEF, 0x6580, 0xECF0, 0x65B6, + 0xECF1, 0x65DA, 0xECF2, 0x66D2, 0xECF3, 0x6A8D, 0xECF4, 0x6A96, 0xECF5, 0x6A81, 0xECF6, 0x6AA5, 0xECF7, 0x6A89, 0xECF8, 0x6A9F, + 0xECF9, 0x6A9B, 0xECFA, 0x6AA1, 0xECFB, 0x6A9E, 0xECFC, 0x6A87, 0xECFD, 0x6A93, 0xECFE, 0x6A8E, 0xED40, 0x6A95, 0xED41, 0x6A83, + 0xED42, 0x6AA8, 0xED43, 0x6AA4, 0xED44, 0x6A91, 0xED45, 0x6A7F, 0xED46, 0x6AA6, 0xED47, 0x6A9A, 0xED48, 0x6A85, 0xED49, 0x6A8C, + 0xED4A, 0x6A92, 0xED4B, 0x6B5B, 0xED4C, 0x6BAD, 0xED4D, 0x6C09, 0xED4E, 0x6FCC, 0xED4F, 0x6FA9, 0xED50, 0x6FF4, 0xED51, 0x6FD4, + 0xED52, 0x6FE3, 0xED53, 0x6FDC, 0xED54, 0x6FED, 0xED55, 0x6FE7, 0xED56, 0x6FE6, 0xED57, 0x6FDE, 0xED58, 0x6FF2, 0xED59, 0x6FDD, + 0xED5A, 0x6FE2, 0xED5B, 0x6FE8, 0xED5C, 0x71E1, 0xED5D, 0x71F1, 0xED5E, 0x71E8, 0xED5F, 0x71F2, 0xED60, 0x71E4, 0xED61, 0x71F0, + 0xED62, 0x71E2, 0xED63, 0x7373, 0xED64, 0x736E, 0xED65, 0x736F, 0xED66, 0x7497, 0xED67, 0x74B2, 0xED68, 0x74AB, 0xED69, 0x7490, + 0xED6A, 0x74AA, 0xED6B, 0x74AD, 0xED6C, 0x74B1, 0xED6D, 0x74A5, 0xED6E, 0x74AF, 0xED6F, 0x7510, 0xED70, 0x7511, 0xED71, 0x7512, + 0xED72, 0x750F, 0xED73, 0x7584, 0xED74, 0x7643, 0xED75, 0x7648, 0xED76, 0x7649, 0xED77, 0x7647, 0xED78, 0x76A4, 0xED79, 0x76E9, + 0xED7A, 0x77B5, 0xED7B, 0x77AB, 0xED7C, 0x77B2, 0xED7D, 0x77B7, 0xED7E, 0x77B6, 0xEDA1, 0x77B4, 0xEDA2, 0x77B1, 0xEDA3, 0x77A8, + 0xEDA4, 0x77F0, 0xEDA5, 0x78F3, 0xEDA6, 0x78FD, 0xEDA7, 0x7902, 0xEDA8, 0x78FB, 0xEDA9, 0x78FC, 0xEDAA, 0x78F2, 0xEDAB, 0x7905, + 0xEDAC, 0x78F9, 0xEDAD, 0x78FE, 0xEDAE, 0x7904, 0xEDAF, 0x79AB, 0xEDB0, 0x79A8, 0xEDB1, 0x7A5C, 0xEDB2, 0x7A5B, 0xEDB3, 0x7A56, + 0xEDB4, 0x7A58, 0xEDB5, 0x7A54, 0xEDB6, 0x7A5A, 0xEDB7, 0x7ABE, 0xEDB8, 0x7AC0, 0xEDB9, 0x7AC1, 0xEDBA, 0x7C05, 0xEDBB, 0x7C0F, + 0xEDBC, 0x7BF2, 0xEDBD, 0x7C00, 0xEDBE, 0x7BFF, 0xEDBF, 0x7BFB, 0xEDC0, 0x7C0E, 0xEDC1, 0x7BF4, 0xEDC2, 0x7C0B, 0xEDC3, 0x7BF3, + 0xEDC4, 0x7C02, 0xEDC5, 0x7C09, 0xEDC6, 0x7C03, 0xEDC7, 0x7C01, 0xEDC8, 0x7BF8, 0xEDC9, 0x7BFD, 0xEDCA, 0x7C06, 0xEDCB, 0x7BF0, + 0xEDCC, 0x7BF1, 0xEDCD, 0x7C10, 0xEDCE, 0x7C0A, 0xEDCF, 0x7CE8, 0xEDD0, 0x7E2D, 0xEDD1, 0x7E3C, 0xEDD2, 0x7E42, 0xEDD3, 0x7E33, + 0xEDD4, 0x9848, 0xEDD5, 0x7E38, 0xEDD6, 0x7E2A, 0xEDD7, 0x7E49, 0xEDD8, 0x7E40, 0xEDD9, 0x7E47, 0xEDDA, 0x7E29, 0xEDDB, 0x7E4C, + 0xEDDC, 0x7E30, 0xEDDD, 0x7E3B, 0xEDDE, 0x7E36, 0xEDDF, 0x7E44, 0xEDE0, 0x7E3A, 0xEDE1, 0x7F45, 0xEDE2, 0x7F7F, 0xEDE3, 0x7F7E, + 0xEDE4, 0x7F7D, 0xEDE5, 0x7FF4, 0xEDE6, 0x7FF2, 0xEDE7, 0x802C, 0xEDE8, 0x81BB, 0xEDE9, 0x81C4, 0xEDEA, 0x81CC, 0xEDEB, 0x81CA, + 0xEDEC, 0x81C5, 0xEDED, 0x81C7, 0xEDEE, 0x81BC, 0xEDEF, 0x81E9, 0xEDF0, 0x825B, 0xEDF1, 0x825A, 0xEDF2, 0x825C, 0xEDF3, 0x8583, + 0xEDF4, 0x8580, 0xEDF5, 0x858F, 0xEDF6, 0x85A7, 0xEDF7, 0x8595, 0xEDF8, 0x85A0, 0xEDF9, 0x858B, 0xEDFA, 0x85A3, 0xEDFB, 0x857B, + 0xEDFC, 0x85A4, 0xEDFD, 0x859A, 0xEDFE, 0x859E, 0xEE40, 0x8577, 0xEE41, 0x857C, 0xEE42, 0x8589, 0xEE43, 0x85A1, 0xEE44, 0x857A, + 0xEE45, 0x8578, 0xEE46, 0x8557, 0xEE47, 0x858E, 0xEE48, 0x8596, 0xEE49, 0x8586, 0xEE4A, 0x858D, 0xEE4B, 0x8599, 0xEE4C, 0x859D, + 0xEE4D, 0x8581, 0xEE4E, 0x85A2, 0xEE4F, 0x8582, 0xEE50, 0x8588, 0xEE51, 0x8585, 0xEE52, 0x8579, 0xEE53, 0x8576, 0xEE54, 0x8598, + 0xEE55, 0x8590, 0xEE56, 0x859F, 0xEE57, 0x8668, 0xEE58, 0x87BE, 0xEE59, 0x87AA, 0xEE5A, 0x87AD, 0xEE5B, 0x87C5, 0xEE5C, 0x87B0, + 0xEE5D, 0x87AC, 0xEE5E, 0x87B9, 0xEE5F, 0x87B5, 0xEE60, 0x87BC, 0xEE61, 0x87AE, 0xEE62, 0x87C9, 0xEE63, 0x87C3, 0xEE64, 0x87C2, + 0xEE65, 0x87CC, 0xEE66, 0x87B7, 0xEE67, 0x87AF, 0xEE68, 0x87C4, 0xEE69, 0x87CA, 0xEE6A, 0x87B4, 0xEE6B, 0x87B6, 0xEE6C, 0x87BF, + 0xEE6D, 0x87B8, 0xEE6E, 0x87BD, 0xEE6F, 0x87DE, 0xEE70, 0x87B2, 0xEE71, 0x8935, 0xEE72, 0x8933, 0xEE73, 0x893C, 0xEE74, 0x893E, + 0xEE75, 0x8941, 0xEE76, 0x8952, 0xEE77, 0x8937, 0xEE78, 0x8942, 0xEE79, 0x89AD, 0xEE7A, 0x89AF, 0xEE7B, 0x89AE, 0xEE7C, 0x89F2, + 0xEE7D, 0x89F3, 0xEE7E, 0x8B1E, 0xEEA1, 0x8B18, 0xEEA2, 0x8B16, 0xEEA3, 0x8B11, 0xEEA4, 0x8B05, 0xEEA5, 0x8B0B, 0xEEA6, 0x8B22, + 0xEEA7, 0x8B0F, 0xEEA8, 0x8B12, 0xEEA9, 0x8B15, 0xEEAA, 0x8B07, 0xEEAB, 0x8B0D, 0xEEAC, 0x8B08, 0xEEAD, 0x8B06, 0xEEAE, 0x8B1C, + 0xEEAF, 0x8B13, 0xEEB0, 0x8B1A, 0xEEB1, 0x8C4F, 0xEEB2, 0x8C70, 0xEEB3, 0x8C72, 0xEEB4, 0x8C71, 0xEEB5, 0x8C6F, 0xEEB6, 0x8C95, + 0xEEB7, 0x8C94, 0xEEB8, 0x8CF9, 0xEEB9, 0x8D6F, 0xEEBA, 0x8E4E, 0xEEBB, 0x8E4D, 0xEEBC, 0x8E53, 0xEEBD, 0x8E50, 0xEEBE, 0x8E4C, + 0xEEBF, 0x8E47, 0xEEC0, 0x8F43, 0xEEC1, 0x8F40, 0xEEC2, 0x9085, 0xEEC3, 0x907E, 0xEEC4, 0x9138, 0xEEC5, 0x919A, 0xEEC6, 0x91A2, + 0xEEC7, 0x919B, 0xEEC8, 0x9199, 0xEEC9, 0x919F, 0xEECA, 0x91A1, 0xEECB, 0x919D, 0xEECC, 0x91A0, 0xEECD, 0x93A1, 0xEECE, 0x9383, + 0xEECF, 0x93AF, 0xEED0, 0x9364, 0xEED1, 0x9356, 0xEED2, 0x9347, 0xEED3, 0x937C, 0xEED4, 0x9358, 0xEED5, 0x935C, 0xEED6, 0x9376, + 0xEED7, 0x9349, 0xEED8, 0x9350, 0xEED9, 0x9351, 0xEEDA, 0x9360, 0xEEDB, 0x936D, 0xEEDC, 0x938F, 0xEEDD, 0x934C, 0xEEDE, 0x936A, + 0xEEDF, 0x9379, 0xEEE0, 0x9357, 0xEEE1, 0x9355, 0xEEE2, 0x9352, 0xEEE3, 0x934F, 0xEEE4, 0x9371, 0xEEE5, 0x9377, 0xEEE6, 0x937B, + 0xEEE7, 0x9361, 0xEEE8, 0x935E, 0xEEE9, 0x9363, 0xEEEA, 0x9367, 0xEEEB, 0x9380, 0xEEEC, 0x934E, 0xEEED, 0x9359, 0xEEEE, 0x95C7, + 0xEEEF, 0x95C0, 0xEEF0, 0x95C9, 0xEEF1, 0x95C3, 0xEEF2, 0x95C5, 0xEEF3, 0x95B7, 0xEEF4, 0x96AE, 0xEEF5, 0x96B0, 0xEEF6, 0x96AC, + 0xEEF7, 0x9720, 0xEEF8, 0x971F, 0xEEF9, 0x9718, 0xEEFA, 0x971D, 0xEEFB, 0x9719, 0xEEFC, 0x979A, 0xEEFD, 0x97A1, 0xEEFE, 0x979C, + 0xEF40, 0x979E, 0xEF41, 0x979D, 0xEF42, 0x97D5, 0xEF43, 0x97D4, 0xEF44, 0x97F1, 0xEF45, 0x9841, 0xEF46, 0x9844, 0xEF47, 0x984A, + 0xEF48, 0x9849, 0xEF49, 0x9845, 0xEF4A, 0x9843, 0xEF4B, 0x9925, 0xEF4C, 0x992B, 0xEF4D, 0x992C, 0xEF4E, 0x992A, 0xEF4F, 0x9933, + 0xEF50, 0x9932, 0xEF51, 0x992F, 0xEF52, 0x992D, 0xEF53, 0x9931, 0xEF54, 0x9930, 0xEF55, 0x9998, 0xEF56, 0x99A3, 0xEF57, 0x99A1, + 0xEF58, 0x9A02, 0xEF59, 0x99FA, 0xEF5A, 0x99F4, 0xEF5B, 0x99F7, 0xEF5C, 0x99F9, 0xEF5D, 0x99F8, 0xEF5E, 0x99F6, 0xEF5F, 0x99FB, + 0xEF60, 0x99FD, 0xEF61, 0x99FE, 0xEF62, 0x99FC, 0xEF63, 0x9A03, 0xEF64, 0x9ABE, 0xEF65, 0x9AFE, 0xEF66, 0x9AFD, 0xEF67, 0x9B01, + 0xEF68, 0x9AFC, 0xEF69, 0x9B48, 0xEF6A, 0x9B9A, 0xEF6B, 0x9BA8, 0xEF6C, 0x9B9E, 0xEF6D, 0x9B9B, 0xEF6E, 0x9BA6, 0xEF6F, 0x9BA1, + 0xEF70, 0x9BA5, 0xEF71, 0x9BA4, 0xEF72, 0x9B86, 0xEF73, 0x9BA2, 0xEF74, 0x9BA0, 0xEF75, 0x9BAF, 0xEF76, 0x9D33, 0xEF77, 0x9D41, + 0xEF78, 0x9D67, 0xEF79, 0x9D36, 0xEF7A, 0x9D2E, 0xEF7B, 0x9D2F, 0xEF7C, 0x9D31, 0xEF7D, 0x9D38, 0xEF7E, 0x9D30, 0xEFA1, 0x9D45, + 0xEFA2, 0x9D42, 0xEFA3, 0x9D43, 0xEFA4, 0x9D3E, 0xEFA5, 0x9D37, 0xEFA6, 0x9D40, 0xEFA7, 0x9D3D, 0xEFA8, 0x7FF5, 0xEFA9, 0x9D2D, + 0xEFAA, 0x9E8A, 0xEFAB, 0x9E89, 0xEFAC, 0x9E8D, 0xEFAD, 0x9EB0, 0xEFAE, 0x9EC8, 0xEFAF, 0x9EDA, 0xEFB0, 0x9EFB, 0xEFB1, 0x9EFF, + 0xEFB2, 0x9F24, 0xEFB3, 0x9F23, 0xEFB4, 0x9F22, 0xEFB5, 0x9F54, 0xEFB6, 0x9FA0, 0xEFB7, 0x5131, 0xEFB8, 0x512D, 0xEFB9, 0x512E, + 0xEFBA, 0x5698, 0xEFBB, 0x569C, 0xEFBC, 0x5697, 0xEFBD, 0x569A, 0xEFBE, 0x569D, 0xEFBF, 0x5699, 0xEFC0, 0x5970, 0xEFC1, 0x5B3C, + 0xEFC2, 0x5C69, 0xEFC3, 0x5C6A, 0xEFC4, 0x5DC0, 0xEFC5, 0x5E6D, 0xEFC6, 0x5E6E, 0xEFC7, 0x61D8, 0xEFC8, 0x61DF, 0xEFC9, 0x61ED, + 0xEFCA, 0x61EE, 0xEFCB, 0x61F1, 0xEFCC, 0x61EA, 0xEFCD, 0x61F0, 0xEFCE, 0x61EB, 0xEFCF, 0x61D6, 0xEFD0, 0x61E9, 0xEFD1, 0x64FF, + 0xEFD2, 0x6504, 0xEFD3, 0x64FD, 0xEFD4, 0x64F8, 0xEFD5, 0x6501, 0xEFD6, 0x6503, 0xEFD7, 0x64FC, 0xEFD8, 0x6594, 0xEFD9, 0x65DB, + 0xEFDA, 0x66DA, 0xEFDB, 0x66DB, 0xEFDC, 0x66D8, 0xEFDD, 0x6AC5, 0xEFDE, 0x6AB9, 0xEFDF, 0x6ABD, 0xEFE0, 0x6AE1, 0xEFE1, 0x6AC6, + 0xEFE2, 0x6ABA, 0xEFE3, 0x6AB6, 0xEFE4, 0x6AB7, 0xEFE5, 0x6AC7, 0xEFE6, 0x6AB4, 0xEFE7, 0x6AAD, 0xEFE8, 0x6B5E, 0xEFE9, 0x6BC9, + 0xEFEA, 0x6C0B, 0xEFEB, 0x7007, 0xEFEC, 0x700C, 0xEFED, 0x700D, 0xEFEE, 0x7001, 0xEFEF, 0x7005, 0xEFF0, 0x7014, 0xEFF1, 0x700E, + 0xEFF2, 0x6FFF, 0xEFF3, 0x7000, 0xEFF4, 0x6FFB, 0xEFF5, 0x7026, 0xEFF6, 0x6FFC, 0xEFF7, 0x6FF7, 0xEFF8, 0x700A, 0xEFF9, 0x7201, + 0xEFFA, 0x71FF, 0xEFFB, 0x71F9, 0xEFFC, 0x7203, 0xEFFD, 0x71FD, 0xEFFE, 0x7376, 0xF040, 0x74B8, 0xF041, 0x74C0, 0xF042, 0x74B5, + 0xF043, 0x74C1, 0xF044, 0x74BE, 0xF045, 0x74B6, 0xF046, 0x74BB, 0xF047, 0x74C2, 0xF048, 0x7514, 0xF049, 0x7513, 0xF04A, 0x765C, + 0xF04B, 0x7664, 0xF04C, 0x7659, 0xF04D, 0x7650, 0xF04E, 0x7653, 0xF04F, 0x7657, 0xF050, 0x765A, 0xF051, 0x76A6, 0xF052, 0x76BD, + 0xF053, 0x76EC, 0xF054, 0x77C2, 0xF055, 0x77BA, 0xF056, 0x78FF, 0xF057, 0x790C, 0xF058, 0x7913, 0xF059, 0x7914, 0xF05A, 0x7909, + 0xF05B, 0x7910, 0xF05C, 0x7912, 0xF05D, 0x7911, 0xF05E, 0x79AD, 0xF05F, 0x79AC, 0xF060, 0x7A5F, 0xF061, 0x7C1C, 0xF062, 0x7C29, + 0xF063, 0x7C19, 0xF064, 0x7C20, 0xF065, 0x7C1F, 0xF066, 0x7C2D, 0xF067, 0x7C1D, 0xF068, 0x7C26, 0xF069, 0x7C28, 0xF06A, 0x7C22, + 0xF06B, 0x7C25, 0xF06C, 0x7C30, 0xF06D, 0x7E5C, 0xF06E, 0x7E50, 0xF06F, 0x7E56, 0xF070, 0x7E63, 0xF071, 0x7E58, 0xF072, 0x7E62, + 0xF073, 0x7E5F, 0xF074, 0x7E51, 0xF075, 0x7E60, 0xF076, 0x7E57, 0xF077, 0x7E53, 0xF078, 0x7FB5, 0xF079, 0x7FB3, 0xF07A, 0x7FF7, + 0xF07B, 0x7FF8, 0xF07C, 0x8075, 0xF07D, 0x81D1, 0xF07E, 0x81D2, 0xF0A1, 0x81D0, 0xF0A2, 0x825F, 0xF0A3, 0x825E, 0xF0A4, 0x85B4, + 0xF0A5, 0x85C6, 0xF0A6, 0x85C0, 0xF0A7, 0x85C3, 0xF0A8, 0x85C2, 0xF0A9, 0x85B3, 0xF0AA, 0x85B5, 0xF0AB, 0x85BD, 0xF0AC, 0x85C7, + 0xF0AD, 0x85C4, 0xF0AE, 0x85BF, 0xF0AF, 0x85CB, 0xF0B0, 0x85CE, 0xF0B1, 0x85C8, 0xF0B2, 0x85C5, 0xF0B3, 0x85B1, 0xF0B4, 0x85B6, + 0xF0B5, 0x85D2, 0xF0B6, 0x8624, 0xF0B7, 0x85B8, 0xF0B8, 0x85B7, 0xF0B9, 0x85BE, 0xF0BA, 0x8669, 0xF0BB, 0x87E7, 0xF0BC, 0x87E6, + 0xF0BD, 0x87E2, 0xF0BE, 0x87DB, 0xF0BF, 0x87EB, 0xF0C0, 0x87EA, 0xF0C1, 0x87E5, 0xF0C2, 0x87DF, 0xF0C3, 0x87F3, 0xF0C4, 0x87E4, + 0xF0C5, 0x87D4, 0xF0C6, 0x87DC, 0xF0C7, 0x87D3, 0xF0C8, 0x87ED, 0xF0C9, 0x87D8, 0xF0CA, 0x87E3, 0xF0CB, 0x87A4, 0xF0CC, 0x87D7, + 0xF0CD, 0x87D9, 0xF0CE, 0x8801, 0xF0CF, 0x87F4, 0xF0D0, 0x87E8, 0xF0D1, 0x87DD, 0xF0D2, 0x8953, 0xF0D3, 0x894B, 0xF0D4, 0x894F, + 0xF0D5, 0x894C, 0xF0D6, 0x8946, 0xF0D7, 0x8950, 0xF0D8, 0x8951, 0xF0D9, 0x8949, 0xF0DA, 0x8B2A, 0xF0DB, 0x8B27, 0xF0DC, 0x8B23, + 0xF0DD, 0x8B33, 0xF0DE, 0x8B30, 0xF0DF, 0x8B35, 0xF0E0, 0x8B47, 0xF0E1, 0x8B2F, 0xF0E2, 0x8B3C, 0xF0E3, 0x8B3E, 0xF0E4, 0x8B31, + 0xF0E5, 0x8B25, 0xF0E6, 0x8B37, 0xF0E7, 0x8B26, 0xF0E8, 0x8B36, 0xF0E9, 0x8B2E, 0xF0EA, 0x8B24, 0xF0EB, 0x8B3B, 0xF0EC, 0x8B3D, + 0xF0ED, 0x8B3A, 0xF0EE, 0x8C42, 0xF0EF, 0x8C75, 0xF0F0, 0x8C99, 0xF0F1, 0x8C98, 0xF0F2, 0x8C97, 0xF0F3, 0x8CFE, 0xF0F4, 0x8D04, + 0xF0F5, 0x8D02, 0xF0F6, 0x8D00, 0xF0F7, 0x8E5C, 0xF0F8, 0x8E62, 0xF0F9, 0x8E60, 0xF0FA, 0x8E57, 0xF0FB, 0x8E56, 0xF0FC, 0x8E5E, + 0xF0FD, 0x8E65, 0xF0FE, 0x8E67, 0xF140, 0x8E5B, 0xF141, 0x8E5A, 0xF142, 0x8E61, 0xF143, 0x8E5D, 0xF144, 0x8E69, 0xF145, 0x8E54, + 0xF146, 0x8F46, 0xF147, 0x8F47, 0xF148, 0x8F48, 0xF149, 0x8F4B, 0xF14A, 0x9128, 0xF14B, 0x913A, 0xF14C, 0x913B, 0xF14D, 0x913E, + 0xF14E, 0x91A8, 0xF14F, 0x91A5, 0xF150, 0x91A7, 0xF151, 0x91AF, 0xF152, 0x91AA, 0xF153, 0x93B5, 0xF154, 0x938C, 0xF155, 0x9392, + 0xF156, 0x93B7, 0xF157, 0x939B, 0xF158, 0x939D, 0xF159, 0x9389, 0xF15A, 0x93A7, 0xF15B, 0x938E, 0xF15C, 0x93AA, 0xF15D, 0x939E, + 0xF15E, 0x93A6, 0xF15F, 0x9395, 0xF160, 0x9388, 0xF161, 0x9399, 0xF162, 0x939F, 0xF163, 0x938D, 0xF164, 0x93B1, 0xF165, 0x9391, + 0xF166, 0x93B2, 0xF167, 0x93A4, 0xF168, 0x93A8, 0xF169, 0x93B4, 0xF16A, 0x93A3, 0xF16B, 0x93A5, 0xF16C, 0x95D2, 0xF16D, 0x95D3, + 0xF16E, 0x95D1, 0xF16F, 0x96B3, 0xF170, 0x96D7, 0xF171, 0x96DA, 0xF172, 0x5DC2, 0xF173, 0x96DF, 0xF174, 0x96D8, 0xF175, 0x96DD, + 0xF176, 0x9723, 0xF177, 0x9722, 0xF178, 0x9725, 0xF179, 0x97AC, 0xF17A, 0x97AE, 0xF17B, 0x97A8, 0xF17C, 0x97AB, 0xF17D, 0x97A4, + 0xF17E, 0x97AA, 0xF1A1, 0x97A2, 0xF1A2, 0x97A5, 0xF1A3, 0x97D7, 0xF1A4, 0x97D9, 0xF1A5, 0x97D6, 0xF1A6, 0x97D8, 0xF1A7, 0x97FA, + 0xF1A8, 0x9850, 0xF1A9, 0x9851, 0xF1AA, 0x9852, 0xF1AB, 0x98B8, 0xF1AC, 0x9941, 0xF1AD, 0x993C, 0xF1AE, 0x993A, 0xF1AF, 0x9A0F, + 0xF1B0, 0x9A0B, 0xF1B1, 0x9A09, 0xF1B2, 0x9A0D, 0xF1B3, 0x9A04, 0xF1B4, 0x9A11, 0xF1B5, 0x9A0A, 0xF1B6, 0x9A05, 0xF1B7, 0x9A07, + 0xF1B8, 0x9A06, 0xF1B9, 0x9AC0, 0xF1BA, 0x9ADC, 0xF1BB, 0x9B08, 0xF1BC, 0x9B04, 0xF1BD, 0x9B05, 0xF1BE, 0x9B29, 0xF1BF, 0x9B35, + 0xF1C0, 0x9B4A, 0xF1C1, 0x9B4C, 0xF1C2, 0x9B4B, 0xF1C3, 0x9BC7, 0xF1C4, 0x9BC6, 0xF1C5, 0x9BC3, 0xF1C6, 0x9BBF, 0xF1C7, 0x9BC1, + 0xF1C8, 0x9BB5, 0xF1C9, 0x9BB8, 0xF1CA, 0x9BD3, 0xF1CB, 0x9BB6, 0xF1CC, 0x9BC4, 0xF1CD, 0x9BB9, 0xF1CE, 0x9BBD, 0xF1CF, 0x9D5C, + 0xF1D0, 0x9D53, 0xF1D1, 0x9D4F, 0xF1D2, 0x9D4A, 0xF1D3, 0x9D5B, 0xF1D4, 0x9D4B, 0xF1D5, 0x9D59, 0xF1D6, 0x9D56, 0xF1D7, 0x9D4C, + 0xF1D8, 0x9D57, 0xF1D9, 0x9D52, 0xF1DA, 0x9D54, 0xF1DB, 0x9D5F, 0xF1DC, 0x9D58, 0xF1DD, 0x9D5A, 0xF1DE, 0x9E8E, 0xF1DF, 0x9E8C, + 0xF1E0, 0x9EDF, 0xF1E1, 0x9F01, 0xF1E2, 0x9F00, 0xF1E3, 0x9F16, 0xF1E4, 0x9F25, 0xF1E5, 0x9F2B, 0xF1E6, 0x9F2A, 0xF1E7, 0x9F29, + 0xF1E8, 0x9F28, 0xF1E9, 0x9F4C, 0xF1EA, 0x9F55, 0xF1EB, 0x5134, 0xF1EC, 0x5135, 0xF1ED, 0x5296, 0xF1EE, 0x52F7, 0xF1EF, 0x53B4, + 0xF1F0, 0x56AB, 0xF1F1, 0x56AD, 0xF1F2, 0x56A6, 0xF1F3, 0x56A7, 0xF1F4, 0x56AA, 0xF1F5, 0x56AC, 0xF1F6, 0x58DA, 0xF1F7, 0x58DD, + 0xF1F8, 0x58DB, 0xF1F9, 0x5912, 0xF1FA, 0x5B3D, 0xF1FB, 0x5B3E, 0xF1FC, 0x5B3F, 0xF1FD, 0x5DC3, 0xF1FE, 0x5E70, 0xF240, 0x5FBF, + 0xF241, 0x61FB, 0xF242, 0x6507, 0xF243, 0x6510, 0xF244, 0x650D, 0xF245, 0x6509, 0xF246, 0x650C, 0xF247, 0x650E, 0xF248, 0x6584, + 0xF249, 0x65DE, 0xF24A, 0x65DD, 0xF24B, 0x66DE, 0xF24C, 0x6AE7, 0xF24D, 0x6AE0, 0xF24E, 0x6ACC, 0xF24F, 0x6AD1, 0xF250, 0x6AD9, + 0xF251, 0x6ACB, 0xF252, 0x6ADF, 0xF253, 0x6ADC, 0xF254, 0x6AD0, 0xF255, 0x6AEB, 0xF256, 0x6ACF, 0xF257, 0x6ACD, 0xF258, 0x6ADE, + 0xF259, 0x6B60, 0xF25A, 0x6BB0, 0xF25B, 0x6C0C, 0xF25C, 0x7019, 0xF25D, 0x7027, 0xF25E, 0x7020, 0xF25F, 0x7016, 0xF260, 0x702B, + 0xF261, 0x7021, 0xF262, 0x7022, 0xF263, 0x7023, 0xF264, 0x7029, 0xF265, 0x7017, 0xF266, 0x7024, 0xF267, 0x701C, 0xF268, 0x702A, + 0xF269, 0x720C, 0xF26A, 0x720A, 0xF26B, 0x7207, 0xF26C, 0x7202, 0xF26D, 0x7205, 0xF26E, 0x72A5, 0xF26F, 0x72A6, 0xF270, 0x72A4, + 0xF271, 0x72A3, 0xF272, 0x72A1, 0xF273, 0x74CB, 0xF274, 0x74C5, 0xF275, 0x74B7, 0xF276, 0x74C3, 0xF277, 0x7516, 0xF278, 0x7660, + 0xF279, 0x77C9, 0xF27A, 0x77CA, 0xF27B, 0x77C4, 0xF27C, 0x77F1, 0xF27D, 0x791D, 0xF27E, 0x791B, 0xF2A1, 0x7921, 0xF2A2, 0x791C, + 0xF2A3, 0x7917, 0xF2A4, 0x791E, 0xF2A5, 0x79B0, 0xF2A6, 0x7A67, 0xF2A7, 0x7A68, 0xF2A8, 0x7C33, 0xF2A9, 0x7C3C, 0xF2AA, 0x7C39, + 0xF2AB, 0x7C2C, 0xF2AC, 0x7C3B, 0xF2AD, 0x7CEC, 0xF2AE, 0x7CEA, 0xF2AF, 0x7E76, 0xF2B0, 0x7E75, 0xF2B1, 0x7E78, 0xF2B2, 0x7E70, + 0xF2B3, 0x7E77, 0xF2B4, 0x7E6F, 0xF2B5, 0x7E7A, 0xF2B6, 0x7E72, 0xF2B7, 0x7E74, 0xF2B8, 0x7E68, 0xF2B9, 0x7F4B, 0xF2BA, 0x7F4A, + 0xF2BB, 0x7F83, 0xF2BC, 0x7F86, 0xF2BD, 0x7FB7, 0xF2BE, 0x7FFD, 0xF2BF, 0x7FFE, 0xF2C0, 0x8078, 0xF2C1, 0x81D7, 0xF2C2, 0x81D5, + 0xF2C3, 0x8264, 0xF2C4, 0x8261, 0xF2C5, 0x8263, 0xF2C6, 0x85EB, 0xF2C7, 0x85F1, 0xF2C8, 0x85ED, 0xF2C9, 0x85D9, 0xF2CA, 0x85E1, + 0xF2CB, 0x85E8, 0xF2CC, 0x85DA, 0xF2CD, 0x85D7, 0xF2CE, 0x85EC, 0xF2CF, 0x85F2, 0xF2D0, 0x85F8, 0xF2D1, 0x85D8, 0xF2D2, 0x85DF, + 0xF2D3, 0x85E3, 0xF2D4, 0x85DC, 0xF2D5, 0x85D1, 0xF2D6, 0x85F0, 0xF2D7, 0x85E6, 0xF2D8, 0x85EF, 0xF2D9, 0x85DE, 0xF2DA, 0x85E2, + 0xF2DB, 0x8800, 0xF2DC, 0x87FA, 0xF2DD, 0x8803, 0xF2DE, 0x87F6, 0xF2DF, 0x87F7, 0xF2E0, 0x8809, 0xF2E1, 0x880C, 0xF2E2, 0x880B, + 0xF2E3, 0x8806, 0xF2E4, 0x87FC, 0xF2E5, 0x8808, 0xF2E6, 0x87FF, 0xF2E7, 0x880A, 0xF2E8, 0x8802, 0xF2E9, 0x8962, 0xF2EA, 0x895A, + 0xF2EB, 0x895B, 0xF2EC, 0x8957, 0xF2ED, 0x8961, 0xF2EE, 0x895C, 0xF2EF, 0x8958, 0xF2F0, 0x895D, 0xF2F1, 0x8959, 0xF2F2, 0x8988, + 0xF2F3, 0x89B7, 0xF2F4, 0x89B6, 0xF2F5, 0x89F6, 0xF2F6, 0x8B50, 0xF2F7, 0x8B48, 0xF2F8, 0x8B4A, 0xF2F9, 0x8B40, 0xF2FA, 0x8B53, + 0xF2FB, 0x8B56, 0xF2FC, 0x8B54, 0xF2FD, 0x8B4B, 0xF2FE, 0x8B55, 0xF340, 0x8B51, 0xF341, 0x8B42, 0xF342, 0x8B52, 0xF343, 0x8B57, + 0xF344, 0x8C43, 0xF345, 0x8C77, 0xF346, 0x8C76, 0xF347, 0x8C9A, 0xF348, 0x8D06, 0xF349, 0x8D07, 0xF34A, 0x8D09, 0xF34B, 0x8DAC, + 0xF34C, 0x8DAA, 0xF34D, 0x8DAD, 0xF34E, 0x8DAB, 0xF34F, 0x8E6D, 0xF350, 0x8E78, 0xF351, 0x8E73, 0xF352, 0x8E6A, 0xF353, 0x8E6F, + 0xF354, 0x8E7B, 0xF355, 0x8EC2, 0xF356, 0x8F52, 0xF357, 0x8F51, 0xF358, 0x8F4F, 0xF359, 0x8F50, 0xF35A, 0x8F53, 0xF35B, 0x8FB4, + 0xF35C, 0x9140, 0xF35D, 0x913F, 0xF35E, 0x91B0, 0xF35F, 0x91AD, 0xF360, 0x93DE, 0xF361, 0x93C7, 0xF362, 0x93CF, 0xF363, 0x93C2, + 0xF364, 0x93DA, 0xF365, 0x93D0, 0xF366, 0x93F9, 0xF367, 0x93EC, 0xF368, 0x93CC, 0xF369, 0x93D9, 0xF36A, 0x93A9, 0xF36B, 0x93E6, + 0xF36C, 0x93CA, 0xF36D, 0x93D4, 0xF36E, 0x93EE, 0xF36F, 0x93E3, 0xF370, 0x93D5, 0xF371, 0x93C4, 0xF372, 0x93CE, 0xF373, 0x93C0, + 0xF374, 0x93D2, 0xF375, 0x93E7, 0xF376, 0x957D, 0xF377, 0x95DA, 0xF378, 0x95DB, 0xF379, 0x96E1, 0xF37A, 0x9729, 0xF37B, 0x972B, + 0xF37C, 0x972C, 0xF37D, 0x9728, 0xF37E, 0x9726, 0xF3A1, 0x97B3, 0xF3A2, 0x97B7, 0xF3A3, 0x97B6, 0xF3A4, 0x97DD, 0xF3A5, 0x97DE, + 0xF3A6, 0x97DF, 0xF3A7, 0x985C, 0xF3A8, 0x9859, 0xF3A9, 0x985D, 0xF3AA, 0x9857, 0xF3AB, 0x98BF, 0xF3AC, 0x98BD, 0xF3AD, 0x98BB, + 0xF3AE, 0x98BE, 0xF3AF, 0x9948, 0xF3B0, 0x9947, 0xF3B1, 0x9943, 0xF3B2, 0x99A6, 0xF3B3, 0x99A7, 0xF3B4, 0x9A1A, 0xF3B5, 0x9A15, + 0xF3B6, 0x9A25, 0xF3B7, 0x9A1D, 0xF3B8, 0x9A24, 0xF3B9, 0x9A1B, 0xF3BA, 0x9A22, 0xF3BB, 0x9A20, 0xF3BC, 0x9A27, 0xF3BD, 0x9A23, + 0xF3BE, 0x9A1E, 0xF3BF, 0x9A1C, 0xF3C0, 0x9A14, 0xF3C1, 0x9AC2, 0xF3C2, 0x9B0B, 0xF3C3, 0x9B0A, 0xF3C4, 0x9B0E, 0xF3C5, 0x9B0C, + 0xF3C6, 0x9B37, 0xF3C7, 0x9BEA, 0xF3C8, 0x9BEB, 0xF3C9, 0x9BE0, 0xF3CA, 0x9BDE, 0xF3CB, 0x9BE4, 0xF3CC, 0x9BE6, 0xF3CD, 0x9BE2, + 0xF3CE, 0x9BF0, 0xF3CF, 0x9BD4, 0xF3D0, 0x9BD7, 0xF3D1, 0x9BEC, 0xF3D2, 0x9BDC, 0xF3D3, 0x9BD9, 0xF3D4, 0x9BE5, 0xF3D5, 0x9BD5, + 0xF3D6, 0x9BE1, 0xF3D7, 0x9BDA, 0xF3D8, 0x9D77, 0xF3D9, 0x9D81, 0xF3DA, 0x9D8A, 0xF3DB, 0x9D84, 0xF3DC, 0x9D88, 0xF3DD, 0x9D71, + 0xF3DE, 0x9D80, 0xF3DF, 0x9D78, 0xF3E0, 0x9D86, 0xF3E1, 0x9D8B, 0xF3E2, 0x9D8C, 0xF3E3, 0x9D7D, 0xF3E4, 0x9D6B, 0xF3E5, 0x9D74, + 0xF3E6, 0x9D75, 0xF3E7, 0x9D70, 0xF3E8, 0x9D69, 0xF3E9, 0x9D85, 0xF3EA, 0x9D73, 0xF3EB, 0x9D7B, 0xF3EC, 0x9D82, 0xF3ED, 0x9D6F, + 0xF3EE, 0x9D79, 0xF3EF, 0x9D7F, 0xF3F0, 0x9D87, 0xF3F1, 0x9D68, 0xF3F2, 0x9E94, 0xF3F3, 0x9E91, 0xF3F4, 0x9EC0, 0xF3F5, 0x9EFC, + 0xF3F6, 0x9F2D, 0xF3F7, 0x9F40, 0xF3F8, 0x9F41, 0xF3F9, 0x9F4D, 0xF3FA, 0x9F56, 0xF3FB, 0x9F57, 0xF3FC, 0x9F58, 0xF3FD, 0x5337, + 0xF3FE, 0x56B2, 0xF440, 0x56B5, 0xF441, 0x56B3, 0xF442, 0x58E3, 0xF443, 0x5B45, 0xF444, 0x5DC6, 0xF445, 0x5DC7, 0xF446, 0x5EEE, + 0xF447, 0x5EEF, 0xF448, 0x5FC0, 0xF449, 0x5FC1, 0xF44A, 0x61F9, 0xF44B, 0x6517, 0xF44C, 0x6516, 0xF44D, 0x6515, 0xF44E, 0x6513, + 0xF44F, 0x65DF, 0xF450, 0x66E8, 0xF451, 0x66E3, 0xF452, 0x66E4, 0xF453, 0x6AF3, 0xF454, 0x6AF0, 0xF455, 0x6AEA, 0xF456, 0x6AE8, + 0xF457, 0x6AF9, 0xF458, 0x6AF1, 0xF459, 0x6AEE, 0xF45A, 0x6AEF, 0xF45B, 0x703C, 0xF45C, 0x7035, 0xF45D, 0x702F, 0xF45E, 0x7037, + 0xF45F, 0x7034, 0xF460, 0x7031, 0xF461, 0x7042, 0xF462, 0x7038, 0xF463, 0x703F, 0xF464, 0x703A, 0xF465, 0x7039, 0xF466, 0x7040, + 0xF467, 0x703B, 0xF468, 0x7033, 0xF469, 0x7041, 0xF46A, 0x7213, 0xF46B, 0x7214, 0xF46C, 0x72A8, 0xF46D, 0x737D, 0xF46E, 0x737C, + 0xF46F, 0x74BA, 0xF470, 0x76AB, 0xF471, 0x76AA, 0xF472, 0x76BE, 0xF473, 0x76ED, 0xF474, 0x77CC, 0xF475, 0x77CE, 0xF476, 0x77CF, + 0xF477, 0x77CD, 0xF478, 0x77F2, 0xF479, 0x7925, 0xF47A, 0x7923, 0xF47B, 0x7927, 0xF47C, 0x7928, 0xF47D, 0x7924, 0xF47E, 0x7929, + 0xF4A1, 0x79B2, 0xF4A2, 0x7A6E, 0xF4A3, 0x7A6C, 0xF4A4, 0x7A6D, 0xF4A5, 0x7AF7, 0xF4A6, 0x7C49, 0xF4A7, 0x7C48, 0xF4A8, 0x7C4A, + 0xF4A9, 0x7C47, 0xF4AA, 0x7C45, 0xF4AB, 0x7CEE, 0xF4AC, 0x7E7B, 0xF4AD, 0x7E7E, 0xF4AE, 0x7E81, 0xF4AF, 0x7E80, 0xF4B0, 0x7FBA, + 0xF4B1, 0x7FFF, 0xF4B2, 0x8079, 0xF4B3, 0x81DB, 0xF4B4, 0x81D9, 0xF4B5, 0x820B, 0xF4B6, 0x8268, 0xF4B7, 0x8269, 0xF4B8, 0x8622, + 0xF4B9, 0x85FF, 0xF4BA, 0x8601, 0xF4BB, 0x85FE, 0xF4BC, 0x861B, 0xF4BD, 0x8600, 0xF4BE, 0x85F6, 0xF4BF, 0x8604, 0xF4C0, 0x8609, + 0xF4C1, 0x8605, 0xF4C2, 0x860C, 0xF4C3, 0x85FD, 0xF4C4, 0x8819, 0xF4C5, 0x8810, 0xF4C6, 0x8811, 0xF4C7, 0x8817, 0xF4C8, 0x8813, + 0xF4C9, 0x8816, 0xF4CA, 0x8963, 0xF4CB, 0x8966, 0xF4CC, 0x89B9, 0xF4CD, 0x89F7, 0xF4CE, 0x8B60, 0xF4CF, 0x8B6A, 0xF4D0, 0x8B5D, + 0xF4D1, 0x8B68, 0xF4D2, 0x8B63, 0xF4D3, 0x8B65, 0xF4D4, 0x8B67, 0xF4D5, 0x8B6D, 0xF4D6, 0x8DAE, 0xF4D7, 0x8E86, 0xF4D8, 0x8E88, + 0xF4D9, 0x8E84, 0xF4DA, 0x8F59, 0xF4DB, 0x8F56, 0xF4DC, 0x8F57, 0xF4DD, 0x8F55, 0xF4DE, 0x8F58, 0xF4DF, 0x8F5A, 0xF4E0, 0x908D, + 0xF4E1, 0x9143, 0xF4E2, 0x9141, 0xF4E3, 0x91B7, 0xF4E4, 0x91B5, 0xF4E5, 0x91B2, 0xF4E6, 0x91B3, 0xF4E7, 0x940B, 0xF4E8, 0x9413, + 0xF4E9, 0x93FB, 0xF4EA, 0x9420, 0xF4EB, 0x940F, 0xF4EC, 0x9414, 0xF4ED, 0x93FE, 0xF4EE, 0x9415, 0xF4EF, 0x9410, 0xF4F0, 0x9428, + 0xF4F1, 0x9419, 0xF4F2, 0x940D, 0xF4F3, 0x93F5, 0xF4F4, 0x9400, 0xF4F5, 0x93F7, 0xF4F6, 0x9407, 0xF4F7, 0x940E, 0xF4F8, 0x9416, + 0xF4F9, 0x9412, 0xF4FA, 0x93FA, 0xF4FB, 0x9409, 0xF4FC, 0x93F8, 0xF4FD, 0x940A, 0xF4FE, 0x93FF, 0xF540, 0x93FC, 0xF541, 0x940C, + 0xF542, 0x93F6, 0xF543, 0x9411, 0xF544, 0x9406, 0xF545, 0x95DE, 0xF546, 0x95E0, 0xF547, 0x95DF, 0xF548, 0x972E, 0xF549, 0x972F, + 0xF54A, 0x97B9, 0xF54B, 0x97BB, 0xF54C, 0x97FD, 0xF54D, 0x97FE, 0xF54E, 0x9860, 0xF54F, 0x9862, 0xF550, 0x9863, 0xF551, 0x985F, + 0xF552, 0x98C1, 0xF553, 0x98C2, 0xF554, 0x9950, 0xF555, 0x994E, 0xF556, 0x9959, 0xF557, 0x994C, 0xF558, 0x994B, 0xF559, 0x9953, + 0xF55A, 0x9A32, 0xF55B, 0x9A34, 0xF55C, 0x9A31, 0xF55D, 0x9A2C, 0xF55E, 0x9A2A, 0xF55F, 0x9A36, 0xF560, 0x9A29, 0xF561, 0x9A2E, + 0xF562, 0x9A38, 0xF563, 0x9A2D, 0xF564, 0x9AC7, 0xF565, 0x9ACA, 0xF566, 0x9AC6, 0xF567, 0x9B10, 0xF568, 0x9B12, 0xF569, 0x9B11, + 0xF56A, 0x9C0B, 0xF56B, 0x9C08, 0xF56C, 0x9BF7, 0xF56D, 0x9C05, 0xF56E, 0x9C12, 0xF56F, 0x9BF8, 0xF570, 0x9C40, 0xF571, 0x9C07, + 0xF572, 0x9C0E, 0xF573, 0x9C06, 0xF574, 0x9C17, 0xF575, 0x9C14, 0xF576, 0x9C09, 0xF577, 0x9D9F, 0xF578, 0x9D99, 0xF579, 0x9DA4, + 0xF57A, 0x9D9D, 0xF57B, 0x9D92, 0xF57C, 0x9D98, 0xF57D, 0x9D90, 0xF57E, 0x9D9B, 0xF5A1, 0x9DA0, 0xF5A2, 0x9D94, 0xF5A3, 0x9D9C, + 0xF5A4, 0x9DAA, 0xF5A5, 0x9D97, 0xF5A6, 0x9DA1, 0xF5A7, 0x9D9A, 0xF5A8, 0x9DA2, 0xF5A9, 0x9DA8, 0xF5AA, 0x9D9E, 0xF5AB, 0x9DA3, + 0xF5AC, 0x9DBF, 0xF5AD, 0x9DA9, 0xF5AE, 0x9D96, 0xF5AF, 0x9DA6, 0xF5B0, 0x9DA7, 0xF5B1, 0x9E99, 0xF5B2, 0x9E9B, 0xF5B3, 0x9E9A, + 0xF5B4, 0x9EE5, 0xF5B5, 0x9EE4, 0xF5B6, 0x9EE7, 0xF5B7, 0x9EE6, 0xF5B8, 0x9F30, 0xF5B9, 0x9F2E, 0xF5BA, 0x9F5B, 0xF5BB, 0x9F60, + 0xF5BC, 0x9F5E, 0xF5BD, 0x9F5D, 0xF5BE, 0x9F59, 0xF5BF, 0x9F91, 0xF5C0, 0x513A, 0xF5C1, 0x5139, 0xF5C2, 0x5298, 0xF5C3, 0x5297, + 0xF5C4, 0x56C3, 0xF5C5, 0x56BD, 0xF5C6, 0x56BE, 0xF5C7, 0x5B48, 0xF5C8, 0x5B47, 0xF5C9, 0x5DCB, 0xF5CA, 0x5DCF, 0xF5CB, 0x5EF1, + 0xF5CC, 0x61FD, 0xF5CD, 0x651B, 0xF5CE, 0x6B02, 0xF5CF, 0x6AFC, 0xF5D0, 0x6B03, 0xF5D1, 0x6AF8, 0xF5D2, 0x6B00, 0xF5D3, 0x7043, + 0xF5D4, 0x7044, 0xF5D5, 0x704A, 0xF5D6, 0x7048, 0xF5D7, 0x7049, 0xF5D8, 0x7045, 0xF5D9, 0x7046, 0xF5DA, 0x721D, 0xF5DB, 0x721A, + 0xF5DC, 0x7219, 0xF5DD, 0x737E, 0xF5DE, 0x7517, 0xF5DF, 0x766A, 0xF5E0, 0x77D0, 0xF5E1, 0x792D, 0xF5E2, 0x7931, 0xF5E3, 0x792F, + 0xF5E4, 0x7C54, 0xF5E5, 0x7C53, 0xF5E6, 0x7CF2, 0xF5E7, 0x7E8A, 0xF5E8, 0x7E87, 0xF5E9, 0x7E88, 0xF5EA, 0x7E8B, 0xF5EB, 0x7E86, + 0xF5EC, 0x7E8D, 0xF5ED, 0x7F4D, 0xF5EE, 0x7FBB, 0xF5EF, 0x8030, 0xF5F0, 0x81DD, 0xF5F1, 0x8618, 0xF5F2, 0x862A, 0xF5F3, 0x8626, + 0xF5F4, 0x861F, 0xF5F5, 0x8623, 0xF5F6, 0x861C, 0xF5F7, 0x8619, 0xF5F8, 0x8627, 0xF5F9, 0x862E, 0xF5FA, 0x8621, 0xF5FB, 0x8620, + 0xF5FC, 0x8629, 0xF5FD, 0x861E, 0xF5FE, 0x8625, 0xF640, 0x8829, 0xF641, 0x881D, 0xF642, 0x881B, 0xF643, 0x8820, 0xF644, 0x8824, + 0xF645, 0x881C, 0xF646, 0x882B, 0xF647, 0x884A, 0xF648, 0x896D, 0xF649, 0x8969, 0xF64A, 0x896E, 0xF64B, 0x896B, 0xF64C, 0x89FA, + 0xF64D, 0x8B79, 0xF64E, 0x8B78, 0xF64F, 0x8B45, 0xF650, 0x8B7A, 0xF651, 0x8B7B, 0xF652, 0x8D10, 0xF653, 0x8D14, 0xF654, 0x8DAF, + 0xF655, 0x8E8E, 0xF656, 0x8E8C, 0xF657, 0x8F5E, 0xF658, 0x8F5B, 0xF659, 0x8F5D, 0xF65A, 0x9146, 0xF65B, 0x9144, 0xF65C, 0x9145, + 0xF65D, 0x91B9, 0xF65E, 0x943F, 0xF65F, 0x943B, 0xF660, 0x9436, 0xF661, 0x9429, 0xF662, 0x943D, 0xF663, 0x943C, 0xF664, 0x9430, + 0xF665, 0x9439, 0xF666, 0x942A, 0xF667, 0x9437, 0xF668, 0x942C, 0xF669, 0x9440, 0xF66A, 0x9431, 0xF66B, 0x95E5, 0xF66C, 0x95E4, + 0xF66D, 0x95E3, 0xF66E, 0x9735, 0xF66F, 0x973A, 0xF670, 0x97BF, 0xF671, 0x97E1, 0xF672, 0x9864, 0xF673, 0x98C9, 0xF674, 0x98C6, + 0xF675, 0x98C0, 0xF676, 0x9958, 0xF677, 0x9956, 0xF678, 0x9A39, 0xF679, 0x9A3D, 0xF67A, 0x9A46, 0xF67B, 0x9A44, 0xF67C, 0x9A42, + 0xF67D, 0x9A41, 0xF67E, 0x9A3A, 0xF6A1, 0x9A3F, 0xF6A2, 0x9ACD, 0xF6A3, 0x9B15, 0xF6A4, 0x9B17, 0xF6A5, 0x9B18, 0xF6A6, 0x9B16, + 0xF6A7, 0x9B3A, 0xF6A8, 0x9B52, 0xF6A9, 0x9C2B, 0xF6AA, 0x9C1D, 0xF6AB, 0x9C1C, 0xF6AC, 0x9C2C, 0xF6AD, 0x9C23, 0xF6AE, 0x9C28, + 0xF6AF, 0x9C29, 0xF6B0, 0x9C24, 0xF6B1, 0x9C21, 0xF6B2, 0x9DB7, 0xF6B3, 0x9DB6, 0xF6B4, 0x9DBC, 0xF6B5, 0x9DC1, 0xF6B6, 0x9DC7, + 0xF6B7, 0x9DCA, 0xF6B8, 0x9DCF, 0xF6B9, 0x9DBE, 0xF6BA, 0x9DC5, 0xF6BB, 0x9DC3, 0xF6BC, 0x9DBB, 0xF6BD, 0x9DB5, 0xF6BE, 0x9DCE, + 0xF6BF, 0x9DB9, 0xF6C0, 0x9DBA, 0xF6C1, 0x9DAC, 0xF6C2, 0x9DC8, 0xF6C3, 0x9DB1, 0xF6C4, 0x9DAD, 0xF6C5, 0x9DCC, 0xF6C6, 0x9DB3, + 0xF6C7, 0x9DCD, 0xF6C8, 0x9DB2, 0xF6C9, 0x9E7A, 0xF6CA, 0x9E9C, 0xF6CB, 0x9EEB, 0xF6CC, 0x9EEE, 0xF6CD, 0x9EED, 0xF6CE, 0x9F1B, + 0xF6CF, 0x9F18, 0xF6D0, 0x9F1A, 0xF6D1, 0x9F31, 0xF6D2, 0x9F4E, 0xF6D3, 0x9F65, 0xF6D4, 0x9F64, 0xF6D5, 0x9F92, 0xF6D6, 0x4EB9, + 0xF6D7, 0x56C6, 0xF6D8, 0x56C5, 0xF6D9, 0x56CB, 0xF6DA, 0x5971, 0xF6DB, 0x5B4B, 0xF6DC, 0x5B4C, 0xF6DD, 0x5DD5, 0xF6DE, 0x5DD1, + 0xF6DF, 0x5EF2, 0xF6E0, 0x6521, 0xF6E1, 0x6520, 0xF6E2, 0x6526, 0xF6E3, 0x6522, 0xF6E4, 0x6B0B, 0xF6E5, 0x6B08, 0xF6E6, 0x6B09, + 0xF6E7, 0x6C0D, 0xF6E8, 0x7055, 0xF6E9, 0x7056, 0xF6EA, 0x7057, 0xF6EB, 0x7052, 0xF6EC, 0x721E, 0xF6ED, 0x721F, 0xF6EE, 0x72A9, + 0xF6EF, 0x737F, 0xF6F0, 0x74D8, 0xF6F1, 0x74D5, 0xF6F2, 0x74D9, 0xF6F3, 0x74D7, 0xF6F4, 0x766D, 0xF6F5, 0x76AD, 0xF6F6, 0x7935, + 0xF6F7, 0x79B4, 0xF6F8, 0x7A70, 0xF6F9, 0x7A71, 0xF6FA, 0x7C57, 0xF6FB, 0x7C5C, 0xF6FC, 0x7C59, 0xF6FD, 0x7C5B, 0xF6FE, 0x7C5A, + 0xF740, 0x7CF4, 0xF741, 0x7CF1, 0xF742, 0x7E91, 0xF743, 0x7F4F, 0xF744, 0x7F87, 0xF745, 0x81DE, 0xF746, 0x826B, 0xF747, 0x8634, + 0xF748, 0x8635, 0xF749, 0x8633, 0xF74A, 0x862C, 0xF74B, 0x8632, 0xF74C, 0x8636, 0xF74D, 0x882C, 0xF74E, 0x8828, 0xF74F, 0x8826, + 0xF750, 0x882A, 0xF751, 0x8825, 0xF752, 0x8971, 0xF753, 0x89BF, 0xF754, 0x89BE, 0xF755, 0x89FB, 0xF756, 0x8B7E, 0xF757, 0x8B84, + 0xF758, 0x8B82, 0xF759, 0x8B86, 0xF75A, 0x8B85, 0xF75B, 0x8B7F, 0xF75C, 0x8D15, 0xF75D, 0x8E95, 0xF75E, 0x8E94, 0xF75F, 0x8E9A, + 0xF760, 0x8E92, 0xF761, 0x8E90, 0xF762, 0x8E96, 0xF763, 0x8E97, 0xF764, 0x8F60, 0xF765, 0x8F62, 0xF766, 0x9147, 0xF767, 0x944C, + 0xF768, 0x9450, 0xF769, 0x944A, 0xF76A, 0x944B, 0xF76B, 0x944F, 0xF76C, 0x9447, 0xF76D, 0x9445, 0xF76E, 0x9448, 0xF76F, 0x9449, + 0xF770, 0x9446, 0xF771, 0x973F, 0xF772, 0x97E3, 0xF773, 0x986A, 0xF774, 0x9869, 0xF775, 0x98CB, 0xF776, 0x9954, 0xF777, 0x995B, + 0xF778, 0x9A4E, 0xF779, 0x9A53, 0xF77A, 0x9A54, 0xF77B, 0x9A4C, 0xF77C, 0x9A4F, 0xF77D, 0x9A48, 0xF77E, 0x9A4A, 0xF7A1, 0x9A49, + 0xF7A2, 0x9A52, 0xF7A3, 0x9A50, 0xF7A4, 0x9AD0, 0xF7A5, 0x9B19, 0xF7A6, 0x9B2B, 0xF7A7, 0x9B3B, 0xF7A8, 0x9B56, 0xF7A9, 0x9B55, + 0xF7AA, 0x9C46, 0xF7AB, 0x9C48, 0xF7AC, 0x9C3F, 0xF7AD, 0x9C44, 0xF7AE, 0x9C39, 0xF7AF, 0x9C33, 0xF7B0, 0x9C41, 0xF7B1, 0x9C3C, + 0xF7B2, 0x9C37, 0xF7B3, 0x9C34, 0xF7B4, 0x9C32, 0xF7B5, 0x9C3D, 0xF7B6, 0x9C36, 0xF7B7, 0x9DDB, 0xF7B8, 0x9DD2, 0xF7B9, 0x9DDE, + 0xF7BA, 0x9DDA, 0xF7BB, 0x9DCB, 0xF7BC, 0x9DD0, 0xF7BD, 0x9DDC, 0xF7BE, 0x9DD1, 0xF7BF, 0x9DDF, 0xF7C0, 0x9DE9, 0xF7C1, 0x9DD9, + 0xF7C2, 0x9DD8, 0xF7C3, 0x9DD6, 0xF7C4, 0x9DF5, 0xF7C5, 0x9DD5, 0xF7C6, 0x9DDD, 0xF7C7, 0x9EB6, 0xF7C8, 0x9EF0, 0xF7C9, 0x9F35, + 0xF7CA, 0x9F33, 0xF7CB, 0x9F32, 0xF7CC, 0x9F42, 0xF7CD, 0x9F6B, 0xF7CE, 0x9F95, 0xF7CF, 0x9FA2, 0xF7D0, 0x513D, 0xF7D1, 0x5299, + 0xF7D2, 0x58E8, 0xF7D3, 0x58E7, 0xF7D4, 0x5972, 0xF7D5, 0x5B4D, 0xF7D6, 0x5DD8, 0xF7D7, 0x882F, 0xF7D8, 0x5F4F, 0xF7D9, 0x6201, + 0xF7DA, 0x6203, 0xF7DB, 0x6204, 0xF7DC, 0x6529, 0xF7DD, 0x6525, 0xF7DE, 0x6596, 0xF7DF, 0x66EB, 0xF7E0, 0x6B11, 0xF7E1, 0x6B12, + 0xF7E2, 0x6B0F, 0xF7E3, 0x6BCA, 0xF7E4, 0x705B, 0xF7E5, 0x705A, 0xF7E6, 0x7222, 0xF7E7, 0x7382, 0xF7E8, 0x7381, 0xF7E9, 0x7383, + 0xF7EA, 0x7670, 0xF7EB, 0x77D4, 0xF7EC, 0x7C67, 0xF7ED, 0x7C66, 0xF7EE, 0x7E95, 0xF7EF, 0x826C, 0xF7F0, 0x863A, 0xF7F1, 0x8640, + 0xF7F2, 0x8639, 0xF7F3, 0x863C, 0xF7F4, 0x8631, 0xF7F5, 0x863B, 0xF7F6, 0x863E, 0xF7F7, 0x8830, 0xF7F8, 0x8832, 0xF7F9, 0x882E, + 0xF7FA, 0x8833, 0xF7FB, 0x8976, 0xF7FC, 0x8974, 0xF7FD, 0x8973, 0xF7FE, 0x89FE, 0xF840, 0x8B8C, 0xF841, 0x8B8E, 0xF842, 0x8B8B, + 0xF843, 0x8B88, 0xF844, 0x8C45, 0xF845, 0x8D19, 0xF846, 0x8E98, 0xF847, 0x8F64, 0xF848, 0x8F63, 0xF849, 0x91BC, 0xF84A, 0x9462, + 0xF84B, 0x9455, 0xF84C, 0x945D, 0xF84D, 0x9457, 0xF84E, 0x945E, 0xF84F, 0x97C4, 0xF850, 0x97C5, 0xF851, 0x9800, 0xF852, 0x9A56, + 0xF853, 0x9A59, 0xF854, 0x9B1E, 0xF855, 0x9B1F, 0xF856, 0x9B20, 0xF857, 0x9C52, 0xF858, 0x9C58, 0xF859, 0x9C50, 0xF85A, 0x9C4A, + 0xF85B, 0x9C4D, 0xF85C, 0x9C4B, 0xF85D, 0x9C55, 0xF85E, 0x9C59, 0xF85F, 0x9C4C, 0xF860, 0x9C4E, 0xF861, 0x9DFB, 0xF862, 0x9DF7, + 0xF863, 0x9DEF, 0xF864, 0x9DE3, 0xF865, 0x9DEB, 0xF866, 0x9DF8, 0xF867, 0x9DE4, 0xF868, 0x9DF6, 0xF869, 0x9DE1, 0xF86A, 0x9DEE, + 0xF86B, 0x9DE6, 0xF86C, 0x9DF2, 0xF86D, 0x9DF0, 0xF86E, 0x9DE2, 0xF86F, 0x9DEC, 0xF870, 0x9DF4, 0xF871, 0x9DF3, 0xF872, 0x9DE8, + 0xF873, 0x9DED, 0xF874, 0x9EC2, 0xF875, 0x9ED0, 0xF876, 0x9EF2, 0xF877, 0x9EF3, 0xF878, 0x9F06, 0xF879, 0x9F1C, 0xF87A, 0x9F38, + 0xF87B, 0x9F37, 0xF87C, 0x9F36, 0xF87D, 0x9F43, 0xF87E, 0x9F4F, 0xF8A1, 0x9F71, 0xF8A2, 0x9F70, 0xF8A3, 0x9F6E, 0xF8A4, 0x9F6F, + 0xF8A5, 0x56D3, 0xF8A6, 0x56CD, 0xF8A7, 0x5B4E, 0xF8A8, 0x5C6D, 0xF8A9, 0x652D, 0xF8AA, 0x66ED, 0xF8AB, 0x66EE, 0xF8AC, 0x6B13, + 0xF8AD, 0x705F, 0xF8AE, 0x7061, 0xF8AF, 0x705D, 0xF8B0, 0x7060, 0xF8B1, 0x7223, 0xF8B2, 0x74DB, 0xF8B3, 0x74E5, 0xF8B4, 0x77D5, + 0xF8B5, 0x7938, 0xF8B6, 0x79B7, 0xF8B7, 0x79B6, 0xF8B8, 0x7C6A, 0xF8B9, 0x7E97, 0xF8BA, 0x7F89, 0xF8BB, 0x826D, 0xF8BC, 0x8643, + 0xF8BD, 0x8838, 0xF8BE, 0x8837, 0xF8BF, 0x8835, 0xF8C0, 0x884B, 0xF8C1, 0x8B94, 0xF8C2, 0x8B95, 0xF8C3, 0x8E9E, 0xF8C4, 0x8E9F, + 0xF8C5, 0x8EA0, 0xF8C6, 0x8E9D, 0xF8C7, 0x91BE, 0xF8C8, 0x91BD, 0xF8C9, 0x91C2, 0xF8CA, 0x946B, 0xF8CB, 0x9468, 0xF8CC, 0x9469, + 0xF8CD, 0x96E5, 0xF8CE, 0x9746, 0xF8CF, 0x9743, 0xF8D0, 0x9747, 0xF8D1, 0x97C7, 0xF8D2, 0x97E5, 0xF8D3, 0x9A5E, 0xF8D4, 0x9AD5, + 0xF8D5, 0x9B59, 0xF8D6, 0x9C63, 0xF8D7, 0x9C67, 0xF8D8, 0x9C66, 0xF8D9, 0x9C62, 0xF8DA, 0x9C5E, 0xF8DB, 0x9C60, 0xF8DC, 0x9E02, + 0xF8DD, 0x9DFE, 0xF8DE, 0x9E07, 0xF8DF, 0x9E03, 0xF8E0, 0x9E06, 0xF8E1, 0x9E05, 0xF8E2, 0x9E00, 0xF8E3, 0x9E01, 0xF8E4, 0x9E09, + 0xF8E5, 0x9DFF, 0xF8E6, 0x9DFD, 0xF8E7, 0x9E04, 0xF8E8, 0x9EA0, 0xF8E9, 0x9F1E, 0xF8EA, 0x9F46, 0xF8EB, 0x9F74, 0xF8EC, 0x9F75, + 0xF8ED, 0x9F76, 0xF8EE, 0x56D4, 0xF8EF, 0x652E, 0xF8F0, 0x65B8, 0xF8F1, 0x6B18, 0xF8F2, 0x6B19, 0xF8F3, 0x6B17, 0xF8F4, 0x6B1A, + 0xF8F5, 0x7062, 0xF8F6, 0x7226, 0xF8F7, 0x72AA, 0xF8F8, 0x77D8, 0xF8F9, 0x77D9, 0xF8FA, 0x7939, 0xF8FB, 0x7C69, 0xF8FC, 0x7C6B, + 0xF8FD, 0x7CF6, 0xF8FE, 0x7E9A, 0xF940, 0x7E98, 0xF941, 0x7E9B, 0xF942, 0x7E99, 0xF943, 0x81E0, 0xF944, 0x81E1, 0xF945, 0x8646, + 0xF946, 0x8647, 0xF947, 0x8648, 0xF948, 0x8979, 0xF949, 0x897A, 0xF94A, 0x897C, 0xF94B, 0x897B, 0xF94C, 0x89FF, 0xF94D, 0x8B98, + 0xF94E, 0x8B99, 0xF94F, 0x8EA5, 0xF950, 0x8EA4, 0xF951, 0x8EA3, 0xF952, 0x946E, 0xF953, 0x946D, 0xF954, 0x946F, 0xF955, 0x9471, + 0xF956, 0x9473, 0xF957, 0x9749, 0xF958, 0x9872, 0xF959, 0x995F, 0xF95A, 0x9C68, 0xF95B, 0x9C6E, 0xF95C, 0x9C6D, 0xF95D, 0x9E0B, + 0xF95E, 0x9E0D, 0xF95F, 0x9E10, 0xF960, 0x9E0F, 0xF961, 0x9E12, 0xF962, 0x9E11, 0xF963, 0x9EA1, 0xF964, 0x9EF5, 0xF965, 0x9F09, + 0xF966, 0x9F47, 0xF967, 0x9F78, 0xF968, 0x9F7B, 0xF969, 0x9F7A, 0xF96A, 0x9F79, 0xF96B, 0x571E, 0xF96C, 0x7066, 0xF96D, 0x7C6F, + 0xF96E, 0x883C, 0xF96F, 0x8DB2, 0xF970, 0x8EA6, 0xF971, 0x91C3, 0xF972, 0x9474, 0xF973, 0x9478, 0xF974, 0x9476, 0xF975, 0x9475, + 0xF976, 0x9A60, 0xF977, 0x9C74, 0xF978, 0x9C73, 0xF979, 0x9C71, 0xF97A, 0x9C75, 0xF97B, 0x9E14, 0xF97C, 0x9E13, 0xF97D, 0x9EF6, + 0xF97E, 0x9F0A, 0xF9A1, 0x9FA4, 0xF9A2, 0x7068, 0xF9A3, 0x7065, 0xF9A4, 0x7CF7, 0xF9A5, 0x866A, 0xF9A6, 0x883E, 0xF9A7, 0x883D, + 0xF9A8, 0x883F, 0xF9A9, 0x8B9E, 0xF9AA, 0x8C9C, 0xF9AB, 0x8EA9, 0xF9AC, 0x8EC9, 0xF9AD, 0x974B, 0xF9AE, 0x9873, 0xF9AF, 0x9874, + 0xF9B0, 0x98CC, 0xF9B1, 0x9961, 0xF9B2, 0x99AB, 0xF9B3, 0x9A64, 0xF9B4, 0x9A66, 0xF9B5, 0x9A67, 0xF9B6, 0x9B24, 0xF9B7, 0x9E15, + 0xF9B8, 0x9E17, 0xF9B9, 0x9F48, 0xF9BA, 0x6207, 0xF9BB, 0x6B1E, 0xF9BC, 0x7227, 0xF9BD, 0x864C, 0xF9BE, 0x8EA8, 0xF9BF, 0x9482, + 0xF9C0, 0x9480, 0xF9C1, 0x9481, 0xF9C2, 0x9A69, 0xF9C3, 0x9A68, 0xF9C4, 0x9B2E, 0xF9C5, 0x9E19, 0xF9C6, 0x7229, 0xF9C7, 0x864B, + 0xF9C8, 0x8B9F, 0xF9C9, 0x9483, 0xF9CA, 0x9C79, 0xF9CB, 0x9EB7, 0xF9CC, 0x7675, 0xF9CD, 0x9A6B, 0xF9CE, 0x9C7A, 0xF9CF, 0x9E1D, + 0xF9D0, 0x7069, 0xF9D1, 0x706A, 0xF9D2, 0x9EA4, 0xF9D3, 0x9F7E, 0xF9D4, 0x9F49, 0xF9D5, 0x9F98, 0xF9D6, 0x7881, 0xF9D7, 0x92B9, + 0xF9D8, 0x88CF, 0xF9D9, 0x58BB, 0xF9DA, 0x6052, 0xF9DB, 0x7CA7, 0xF9DC, 0x5AFA, 0xF9DD, 0x2554, 0xF9DE, 0x2566, 0xF9DF, 0x2557, + 0xF9E0, 0x2560, 0xF9E1, 0x256C, 0xF9E2, 0x2563, 0xF9E3, 0x255A, 0xF9E4, 0x2569, 0xF9E5, 0x255D, 0xF9E6, 0x2552, 0xF9E7, 0x2564, + 0xF9E8, 0x2555, 0xF9E9, 0x255E, 0xF9EA, 0x256A, 0xF9EB, 0x2561, 0xF9EC, 0x2558, 0xF9ED, 0x2567, 0xF9EE, 0x255B, 0xF9EF, 0x2553, + 0xF9F0, 0x2565, 0xF9F1, 0x2556, 0xF9F2, 0x255F, 0xF9F3, 0x256B, 0xF9F4, 0x2562, 0xF9F5, 0x2559, 0xF9F6, 0x2568, 0xF9F7, 0x255C, + 0xF9F8, 0x2551, 0xF9F9, 0x2550, 0xF9FA, 0x256D, 0xF9FB, 0x256E, 0xF9FC, 0x2570, 0xF9FD, 0x256F, 0xF9FE, 0x2593, 0, 0 +}; +#endif + +#if FF_CODE_PAGE == 437 || FF_CODE_PAGE == 0 +static const WCHAR uc437[] = { /* CP437(U.S.) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 720 || FF_CODE_PAGE == 0 +static const WCHAR uc720[] = { /* CP720(Arabic) to Unicode conversion table */ + 0x0000, 0x0000, 0x00E9, 0x00E2, 0x0000, 0x00E0, 0x0000, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0651, 0x0652, 0x00F4, 0x00A4, 0x0640, 0x00FB, 0x00F9, 0x0621, 0x0622, 0x0623, 0x0624, 0x00A3, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0641, 0x00B5, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, + 0x2261, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 737 || FF_CODE_PAGE == 0 +static const WCHAR uc737[] = { /* CP737(Greek) to Unicode conversion table */ + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, + 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, + 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03C9, 0x03AC, 0x03AD, 0x03AE, 0x03CA, 0x03AF, 0x03CC, 0x03CD, 0x03CB, 0x03CE, 0x0386, 0x0388, 0x0389, 0x038A, 0x038C, 0x038E, + 0x038F, 0x00B1, 0x2265, 0x2264, 0x03AA, 0x03AB, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 771 || FF_CODE_PAGE == 0 +static const WCHAR uc771[] = { /* CP771(KBL) to Unicode conversion table */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x0104, 0x0105, 0x010C, 0x010D, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x0118, 0x0119, 0x0116, 0x0117, 0x012E, 0x012F, 0x0160, 0x0161, 0x0172, 0x0173, 0x016A, 0x016B, 0x017D, 0x017E, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 775 || FF_CODE_PAGE == 0 +static const WCHAR uc775[] = { /* CP775(Baltic) to Unicode conversion table */ + 0x0106, 0x00FC, 0x00E9, 0x0101, 0x00E4, 0x0123, 0x00E5, 0x0107, 0x0142, 0x0113, 0x0156, 0x0157, 0x012B, 0x0179, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x014D, 0x00F6, 0x0122, 0x00A2, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x00A4, + 0x0100, 0x012A, 0x00F3, 0x017B, 0x017C, 0x017A, 0x201D, 0x00A6, 0x00A9, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x0141, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, 0x010C, 0x0118, 0x0116, 0x2563, 0x2551, 0x2557, 0x255D, 0x012E, 0x0160, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0172, 0x016A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x017D, + 0x0105, 0x010D, 0x0119, 0x0117, 0x012F, 0x0161, 0x0173, 0x016B, 0x017E, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x00D3, 0x00DF, 0x014C, 0x0143, 0x00F5, 0x00D5, 0x00B5, 0x0144, 0x0136, 0x0137, 0x013B, 0x013C, 0x0146, 0x0112, 0x0145, 0x2019, + 0x00AD, 0x00B1, 0x201C, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x201E, 0x00B0, 0x2219, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 850 || FF_CODE_PAGE == 0 +static const WCHAR uc850[] = { /* CP850(Latin 1) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 852 || FF_CODE_PAGE == 0 +static const WCHAR uc852[] = { /* CP852(Latin 2) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x016F, 0x0107, 0x00E7, 0x0142, 0x00EB, 0x0150, 0x0151, 0x00EE, 0x0179, 0x00C4, 0x0106, + 0x00C9, 0x0139, 0x013A, 0x00F4, 0x00F6, 0x013D, 0x013E, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x0164, 0x0165, 0x0141, 0x00D7, 0x010D, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x0104, 0x0105, 0x017D, 0x017E, 0x0118, 0x0119, 0x00AC, 0x017A, 0x010C, 0x015F, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x011A, 0x015E, 0x2563, 0x2551, 0x2557, 0x255D, 0x017B, 0x017C, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0102, 0x0103, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x0111, 0x0110, 0x010E, 0x00CB, 0x010F, 0x0147, 0x00CD, 0x00CE, 0x011B, 0x2518, 0x250C, 0x2588, 0x2584, 0x0162, 0x016E, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, 0x0154, 0x00DA, 0x0155, 0x0170, 0x00FD, 0x00DD, 0x0163, 0x00B4, + 0x00AD, 0x02DD, 0x02DB, 0x02C7, 0x02D8, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x02D9, 0x0171, 0x0158, 0x0159, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 855 || FF_CODE_PAGE == 0 +static const WCHAR uc855[] = { /* CP855(Cyrillic) to Unicode conversion table */ + 0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, 0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408, + 0x0459, 0x0409, 0x045A, 0x040A, 0x045B, 0x040B, 0x045C, 0x040C, 0x045E, 0x040E, 0x045F, 0x040F, 0x044E, 0x042E, 0x044A, 0x042A, + 0x0430, 0x0410, 0x0431, 0x0411, 0x0446, 0x0426, 0x0434, 0x0414, 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, 0x0413, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, 0x0425, 0x0438, 0x0418, 0x2563, 0x2551, 0x2557, 0x255D, 0x0439, 0x0419, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x043A, 0x041A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x043B, 0x041B, 0x043C, 0x041C, 0x043D, 0x041D, 0x043E, 0x041E, 0x043F, 0x2518, 0x250C, 0x2588, 0x2584, 0x041F, 0x044F, 0x2580, + 0x042F, 0x0440, 0x0420, 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, 0x0423, 0x0436, 0x0416, 0x0432, 0x0412, 0x044C, 0x042C, 0x2116, + 0x00AD, 0x044B, 0x042B, 0x0437, 0x0417, 0x0448, 0x0428, 0x044D, 0x042D, 0x0449, 0x0429, 0x0447, 0x0427, 0x00A7, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 857 || FF_CODE_PAGE == 0 +static const WCHAR uc857[] = { /* CP857(Turkish) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0131, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x0130, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x015E, 0x015F, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x011E, 0x011F, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00BA, 0x00AA, 0x00CA, 0x00CB, 0x00C8, 0x0000, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x0000, 0x00D7, 0x00DA, 0x00DB, 0x00D9, 0x00EC, 0x00FF, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x0000, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 860 || FF_CODE_PAGE == 0 +static const WCHAR uc860[] = { /* CP860(Portuguese) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E3, 0x00E0, 0x00C1, 0x00E7, 0x00EA, 0x00CA, 0x00E8, 0x00CD, 0x00D4, 0x00EC, 0x00C3, 0x00C2, + 0x00C9, 0x00C0, 0x00C8, 0x00F4, 0x00F5, 0x00F2, 0x00DA, 0x00F9, 0x00CC, 0x00D5, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x20A7, 0x00D3, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00D2, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 861 || FF_CODE_PAGE == 0 +static const WCHAR uc861[] = { /* CP861(Icelandic) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E6, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00D0, 0x00F0, 0x00DE, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00FE, 0x00FB, 0x00DD, 0x00FD, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00C1, 0x00CD, 0x00D3, 0x00DA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 862 || FF_CODE_PAGE == 0 +static const WCHAR uc862[] = { /* CP862(Hebrew) to Unicode conversion table */ + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 863 || FF_CODE_PAGE == 0 +static const WCHAR uc863[] = { /* CP863(Canadian French) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00C2, 0x00E0, 0x00B6, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x2017, 0x00C0, + 0x00C9, 0x00C8, 0x00CA, 0x00F4, 0x00CB, 0x00CF, 0x00FB, 0x00F9, 0x00A4, 0x00D4, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x00DB, 0x0192, + 0x00A6, 0x00B4, 0x00F3, 0x00FA, 0x00A8, 0x00BB, 0x00B3, 0x00AF, 0x00CE, 0x3210, 0x00AC, 0x00BD, 0x00BC, 0x00BE, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2219, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 864 || FF_CODE_PAGE == 0 +static const WCHAR uc864[] = { /* CP864(Arabic) to Unicode conversion table */ + 0x00B0, 0x00B7, 0x2219, 0x221A, 0x2592, 0x2500, 0x2502, 0x253C, 0x2524, 0x252C, 0x251C, 0x2534, 0x2510, 0x250C, 0x2514, 0x2518, + 0x03B2, 0x221E, 0x03C6, 0x00B1, 0x00BD, 0x00BC, 0x2248, 0x00AB, 0x00BB, 0xFEF7, 0xFEF8, 0x0000, 0x0000, 0xFEFB, 0xFEFC, 0x0000, + 0x00A0, 0x00AD, 0xFE82, 0x00A3, 0x00A4, 0xFE84, 0x0000, 0x20AC, 0xFE8E, 0xFE8F, 0xFE95, 0xFE99, 0x060C, 0xFE9D, 0xFEA1, 0xFEA5, + 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, 0x0668, 0x0669, 0xFED1, 0x061B, 0xFEB1, 0xFEB5, 0xFEB9, 0x061F, + 0x00A2, 0xFE80, 0xFE81, 0xFE83, 0xFE85, 0xFECA, 0xFE8B, 0xFE8D, 0xFE91, 0xFE93, 0xFE97, 0xFE9B, 0xFE9F, 0xFEA3, 0xFEA7, 0xFEA9, + 0xFEAB, 0xFEAD, 0xFEAF, 0xFEB3, 0xFEB7, 0xFEBB, 0xFEBF, 0xFEC1, 0xFEC5, 0xFECB, 0xFECF, 0x00A6, 0x00AC, 0x00F7, 0x00D7, 0xFEC9, + 0x0640, 0xFED3, 0xFED7, 0xFEDB, 0xFEDF, 0xFEE3, 0xFEE7, 0xFEEB, 0xFEED, 0xFEEF, 0xFEF3, 0xFEBD, 0xFECC, 0xFECE, 0xFECD, 0xFEE1, + 0xFE7D, 0x0651, 0xFEE5, 0xFEE9, 0xFEEC, 0xFEF0, 0xFEF2, 0xFED0, 0xFED5, 0xFEF5, 0xFEF6, 0xFEDD, 0xFED9, 0xFEF1, 0x25A0, 0x0000 +}; +#endif +#if FF_CODE_PAGE == 865 || FF_CODE_PAGE == 0 +static const WCHAR uc865[] = { /* CP865(Nordic) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C5, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00A4, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 866 || FF_CODE_PAGE == 0 +static const WCHAR uc866[] = { /* CP866(Russian) to Unicode conversion table */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 869 || FF_CODE_PAGE == 0 +static const WCHAR uc869[] = { /* CP869(Greek 2) to Unicode conversion table */ + 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x0386, 0x00B7, 0x00B7, 0x00AC, 0x00A6, 0x2018, 0x2019, 0x0388, 0x2015, 0x0389, + 0x038A, 0x03AA, 0x038C, 0x00B7, 0x00B7, 0x038E, 0x03AB, 0x00A9, 0x038F, 0x00B2, 0x00B3, 0x03AC, 0x00A3, 0x03AD, 0x03AE, 0x03AF, + 0x03CA, 0x0390, 0x03CC, 0x03CD, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x00BD, 0x0398, 0x0399, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x039A, 0x039B, 0x039C, 0x039D, 0x2563, 0x2551, 0x2557, 0x255D, 0x039E, 0x039F, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0A30, 0x03A1, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x03A3, + 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x2518, 0x250C, 0x2588, 0x2584, 0x03B4, 0x03B5, 0x2580, + 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x0384, + 0x00AD, 0x00B1, 0x03C5, 0x03C6, 0x03C7, 0x00A7, 0x03C8, 0x0385, 0x00B0, 0x00A8, 0x03C9, 0x03CB, 0x03B0, 0x03CE, 0x25A0, 0x00A0 +}; +#endif + + + + +/*------------------------------------------------------------------------*/ +/* OEM <==> Unicode conversions for static code page configuration */ +/* SBCS fixed code page */ +/*------------------------------------------------------------------------*/ + +#if FF_CODE_PAGE != 0 && FF_CODE_PAGE < 900 +WCHAR ff_uni2oem ( /* Returns OEM code character, zero on error */ + DWORD uni, /* UTF-16 encoded character to be converted */ + WORD cp /* Code page for the conversion */ +) +{ + WCHAR c = 0; + const WCHAR *p = CVTBL(uc, FF_CODE_PAGE); + + + if (uni < 0x80) { /* ASCII? */ + c = (WCHAR)uni; + + } else { /* Non-ASCII */ + if (uni < 0x10000 && cp == FF_CODE_PAGE) { /* Is it in BMP and valid code page? */ + for (c = 0; c < 0x80 && uni != p[c]; c++) ; + c = (c + 0x80) & 0xFF; + } + } + + return c; +} + +WCHAR ff_oem2uni ( /* Returns Unicode character, zero on error */ + WCHAR oem, /* OEM code to be converted */ + WORD cp /* Code page for the conversion */ +) +{ + WCHAR c = 0; + const WCHAR *p = CVTBL(uc, FF_CODE_PAGE); + + + if (oem < 0x80) { /* ASCII? */ + c = oem; + + } else { /* Extended char */ + if (cp == FF_CODE_PAGE) { /* Is it a valid code page? */ + if (oem < 0x100) c = p[oem - 0x80]; + } + } + + return c; +} + +#endif + + + +/*------------------------------------------------------------------------*/ +/* OEM <==> Unicode conversions for static code page configuration */ +/* DBCS fixed code page */ +/*------------------------------------------------------------------------*/ + +#if FF_CODE_PAGE >= 900 +WCHAR ff_uni2oem ( /* Returns OEM code character, zero on error */ + DWORD uni, /* UTF-16 encoded character to be converted */ + WORD cp /* Code page for the conversion */ +) +{ + const WCHAR *p; + WCHAR c = 0, uc; + UINT i = 0, n, li, hi; + + + if (uni < 0x80) { /* ASCII? */ + c = (WCHAR)uni; + + } else { /* Non-ASCII */ + if (uni < 0x10000 && cp == FF_CODE_PAGE) { /* Is it in BMP and valid code page? */ + uc = (WCHAR)uni; + p = CVTBL(uni2oem, FF_CODE_PAGE); + hi = sizeof CVTBL(uni2oem, FF_CODE_PAGE) / 4 - 1; + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (uc == p[i * 2]) break; + if (uc > p[i * 2]) { + li = i; + } else { + hi = i; + } + } + if (n != 0) c = p[i * 2 + 1]; + } + } + + return c; +} + + +WCHAR ff_oem2uni ( /* Returns Unicode character, zero on error */ + WCHAR oem, /* OEM code to be converted */ + WORD cp /* Code page for the conversion */ +) +{ + const WCHAR *p; + WCHAR c = 0; + UINT i = 0, n, li, hi; + + + if (oem < 0x80) { /* ASCII? */ + c = oem; + + } else { /* Extended char */ + if (cp == FF_CODE_PAGE) { /* Is it valid code page? */ + p = CVTBL(oem2uni, FF_CODE_PAGE); + hi = sizeof CVTBL(oem2uni, FF_CODE_PAGE) / 4 - 1; + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (oem == p[i * 2]) break; + if (oem > p[i * 2]) { + li = i; + } else { + hi = i; + } + } + if (n != 0) c = p[i * 2 + 1]; + } + } + + return c; +} +#endif + + + +/*------------------------------------------------------------------------*/ +/* OEM <==> Unicode conversions for dynamic code page configuration */ +/*------------------------------------------------------------------------*/ + +#if FF_CODE_PAGE == 0 + +static const WORD cp_code[] = { 437, 720, 737, 771, 775, 850, 852, 855, 857, 860, 861, 862, 863, 864, 865, 866, 869, 0}; +static const WCHAR* const cp_table[] = {uc437, uc720, uc737, uc771, uc775, uc850, uc852, uc855, uc857, uc860, uc861, uc862, uc863, uc864, uc865, uc866, uc869, 0}; + + +WCHAR ff_uni2oem ( /* Returns OEM code character, zero on error */ + DWORD uni, /* UTF-16 encoded character to be converted */ + WORD cp /* Code page for the conversion */ +) +{ + const WCHAR *p; + WCHAR c = 0, uc; + UINT i, n, li, hi; + + + if (uni < 0x80) { /* ASCII? */ + c = (WCHAR)uni; + + } else { /* Non-ASCII */ + if (uni < 0x10000) { /* Is it in BMP? */ + uc = (WCHAR)uni; + p = 0; + if (cp < 900) { /* SBCS */ + for (i = 0; cp_code[i] != 0 && cp_code[i] != cp; i++) ; /* Get conversion table */ + p = cp_table[i]; + if (p) { /* Is it valid code page ? */ + for (c = 0; c < 0x80 && uc != p[c]; c++) ; /* Find OEM code in the table */ + c = (c + 0x80) & 0xFF; + } + } else { /* DBCS */ + switch (cp) { /* Get conversion table */ + case 932 : p = uni2oem932; hi = sizeof uni2oem932 / 4 - 1; break; + case 936 : p = uni2oem936; hi = sizeof uni2oem936 / 4 - 1; break; + case 949 : p = uni2oem949; hi = sizeof uni2oem949 / 4 - 1; break; + case 950 : p = uni2oem950; hi = sizeof uni2oem950 / 4 - 1; break; + } + if (p) { /* Is it valid code page? */ + li = 0; + for (n = 16; n; n--) { /* Find OEM code */ + i = li + (hi - li) / 2; + if (uc == p[i * 2]) break; + if (uc > p[i * 2]) { + li = i; + } else { + hi = i; + } + } + if (n != 0) c = p[i * 2 + 1]; + } + } + } + } + + return c; +} + + +WCHAR ff_oem2uni ( /* Returns Unicode character, zero on error */ + WCHAR oem, /* OEM code to be converted (DBC if >=0x100) */ + WORD cp /* Code page for the conversion */ +) +{ + const WCHAR *p; + WCHAR c = 0; + UINT i, n, li, hi; + + + if (oem < 0x80) { /* ASCII? */ + c = oem; + + } else { /* Extended char */ + p = 0; + if (cp < 900) { /* SBCS */ + for (i = 0; cp_code[i] != 0 && cp_code[i] != cp; i++) ; /* Get table */ + p = cp_table[i]; + if (p) { /* Is it a valid CP ? */ + if (oem < 0x100) c = p[oem - 0x80]; + } + } else { /* DBCS */ + switch (cp) { + case 932 : p = oem2uni932; hi = sizeof oem2uni932 / 4 - 1; break; + case 936 : p = oem2uni936; hi = sizeof oem2uni936 / 4 - 1; break; + case 949 : p = oem2uni949; hi = sizeof oem2uni949 / 4 - 1; break; + case 950 : p = oem2uni950; hi = sizeof oem2uni950 / 4 - 1; break; + } + if (p) { + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (oem == p[i * 2]) break; + if (oem > p[i * 2]) { + li = i; + } else { + hi = i; + } + } + if (n != 0) c = p[i * 2 + 1]; + } + } + } + + return c; +} +#endif + + + +/*------------------------------------------------------------------------*/ +/* Unicode up-case conversion */ +/*------------------------------------------------------------------------*/ + +DWORD ff_wtoupper ( /* Returns up-converted code point */ + DWORD uni /* Unicode code point to be up-converted */ +) +{ + const WORD *p; + WORD uc, bc, nc, cmd; + static const WORD cvt1[] = { /* Compressed up conversion table for U+0000 - U+0FFF */ + /* Basic Latin */ + 0x0061,0x031A, + /* Latin-1 Supplement */ + 0x00E0,0x0317, + 0x00F8,0x0307, + 0x00FF,0x0001,0x0178, + /* Latin Extended-A */ + 0x0100,0x0130, + 0x0132,0x0106, + 0x0139,0x0110, + 0x014A,0x012E, + 0x0179,0x0106, + /* Latin Extended-B */ + 0x0180,0x004D,0x0243,0x0181,0x0182,0x0182,0x0184,0x0184,0x0186,0x0187,0x0187,0x0189,0x018A,0x018B,0x018B,0x018D,0x018E,0x018F,0x0190,0x0191,0x0191,0x0193,0x0194,0x01F6,0x0196,0x0197,0x0198,0x0198,0x023D,0x019B,0x019C,0x019D,0x0220,0x019F,0x01A0,0x01A0,0x01A2,0x01A2,0x01A4,0x01A4,0x01A6,0x01A7,0x01A7,0x01A9,0x01AA,0x01AB,0x01AC,0x01AC,0x01AE,0x01AF,0x01AF,0x01B1,0x01B2,0x01B3,0x01B3,0x01B5,0x01B5,0x01B7,0x01B8,0x01B8,0x01BA,0x01BB,0x01BC,0x01BC,0x01BE,0x01F7,0x01C0,0x01C1,0x01C2,0x01C3,0x01C4,0x01C5,0x01C4,0x01C7,0x01C8,0x01C7,0x01CA,0x01CB,0x01CA, + 0x01CD,0x0110, + 0x01DD,0x0001,0x018E, + 0x01DE,0x0112, + 0x01F3,0x0003,0x01F1,0x01F4,0x01F4, + 0x01F8,0x0128, + 0x0222,0x0112, + 0x023A,0x0009,0x2C65,0x023B,0x023B,0x023D,0x2C66,0x023F,0x0240,0x0241,0x0241, + 0x0246,0x010A, + /* IPA Extensions */ + 0x0253,0x0040,0x0181,0x0186,0x0255,0x0189,0x018A,0x0258,0x018F,0x025A,0x0190,0x025C,0x025D,0x025E,0x025F,0x0193,0x0261,0x0262,0x0194,0x0264,0x0265,0x0266,0x0267,0x0197,0x0196,0x026A,0x2C62,0x026C,0x026D,0x026E,0x019C,0x0270,0x0271,0x019D,0x0273,0x0274,0x019F,0x0276,0x0277,0x0278,0x0279,0x027A,0x027B,0x027C,0x2C64,0x027E,0x027F,0x01A6,0x0281,0x0282,0x01A9,0x0284,0x0285,0x0286,0x0287,0x01AE,0x0244,0x01B1,0x01B2,0x0245,0x028D,0x028E,0x028F,0x0290,0x0291,0x01B7, + /* Greek, Coptic */ + 0x037B,0x0003,0x03FD,0x03FE,0x03FF, + 0x03AC,0x0004,0x0386,0x0388,0x0389,0x038A, + 0x03B1,0x0311, + 0x03C2,0x0002,0x03A3,0x03A3, + 0x03C4,0x0308, + 0x03CC,0x0003,0x038C,0x038E,0x038F, + 0x03D8,0x0118, + 0x03F2,0x000A,0x03F9,0x03F3,0x03F4,0x03F5,0x03F6,0x03F7,0x03F7,0x03F9,0x03FA,0x03FA, + /* Cyrillic */ + 0x0430,0x0320, + 0x0450,0x0710, + 0x0460,0x0122, + 0x048A,0x0136, + 0x04C1,0x010E, + 0x04CF,0x0001,0x04C0, + 0x04D0,0x0144, + /* Armenian */ + 0x0561,0x0426, + + 0x0000 /* EOT */ + }; + static const WORD cvt2[] = { /* Compressed up conversion table for U+1000 - U+FFFF */ + /* Phonetic Extensions */ + 0x1D7D,0x0001,0x2C63, + /* Latin Extended Additional */ + 0x1E00,0x0196, + 0x1EA0,0x015A, + /* Greek Extended */ + 0x1F00,0x0608, + 0x1F10,0x0606, + 0x1F20,0x0608, + 0x1F30,0x0608, + 0x1F40,0x0606, + 0x1F51,0x0007,0x1F59,0x1F52,0x1F5B,0x1F54,0x1F5D,0x1F56,0x1F5F, + 0x1F60,0x0608, + 0x1F70,0x000E,0x1FBA,0x1FBB,0x1FC8,0x1FC9,0x1FCA,0x1FCB,0x1FDA,0x1FDB,0x1FF8,0x1FF9,0x1FEA,0x1FEB,0x1FFA,0x1FFB, + 0x1F80,0x0608, + 0x1F90,0x0608, + 0x1FA0,0x0608, + 0x1FB0,0x0004,0x1FB8,0x1FB9,0x1FB2,0x1FBC, + 0x1FCC,0x0001,0x1FC3, + 0x1FD0,0x0602, + 0x1FE0,0x0602, + 0x1FE5,0x0001,0x1FEC, + 0x1FF3,0x0001,0x1FFC, + /* Letterlike Symbols */ + 0x214E,0x0001,0x2132, + /* Number forms */ + 0x2170,0x0210, + 0x2184,0x0001,0x2183, + /* Enclosed Alphanumerics */ + 0x24D0,0x051A, + 0x2C30,0x042F, + /* Latin Extended-C */ + 0x2C60,0x0102, + 0x2C67,0x0106, 0x2C75,0x0102, + /* Coptic */ + 0x2C80,0x0164, + /* Georgian Supplement */ + 0x2D00,0x0826, + /* Full-width */ + 0xFF41,0x031A, + + 0x0000 /* EOT */ + }; + + + if (uni < 0x10000) { /* Is it in BMP? */ + uc = (WORD)uni; + p = uc < 0x1000 ? cvt1 : cvt2; + for (;;) { + bc = *p++; /* Get the block base */ + if (bc == 0 || uc < bc) break; /* Not matched? */ + nc = *p++; cmd = nc >> 8; nc &= 0xFF; /* Get processing command and block size */ + if (uc < bc + nc) { /* In the block? */ + switch (cmd) { + case 0: uc = p[uc - bc]; break; /* Table conversion */ + case 1: uc -= (uc - bc) & 1; break; /* Case pairs */ + case 2: uc -= 16; break; /* Shift -16 */ + case 3: uc -= 32; break; /* Shift -32 */ + case 4: uc -= 48; break; /* Shift -48 */ + case 5: uc -= 26; break; /* Shift -26 */ + case 6: uc += 8; break; /* Shift +8 */ + case 7: uc -= 80; break; /* Shift -80 */ + case 8: uc -= 0x1C60; break; /* Shift -0x1C60 */ + } + break; + } + if (cmd == 0) p += nc; /* Skip table if needed */ + } + uni = uc; + } + + return uni; +} + + +#endif /* #if FF_USE_LFN */ diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/source/fsl_ram_disk/fsl_ram_disk.c b/TSM_PicoW_Sensor/McuLib/FatFS/source/fsl_ram_disk/fsl_ram_disk.c new file mode 100644 index 0000000..a316f34 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/source/fsl_ram_disk/fsl_ram_disk.c @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuLib.h" +#if McuLib_CONFIG_USE_FAT_FS + +#include "ffconf.h" +/* This fatfs subcomponent is disabled by default + * To enable it, define following macro in ffconf.h */ +#ifdef RAM_DISK_ENABLE + +#include "fsl_common.h" +#include "fsl_ram_disk.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/* clang-format off */ +#define SECTOR_SIZE FF_MIN_SS /* usualy 512 B */ +#define DISK_SIZE 65536 /* minmal disk size calculated as 128 * FF_MIN_SS (ff.c ln 4112) , 128*512=65536 */ +/* clang-format on */ + +/******************************************************************************* + * Globals + ******************************************************************************/ +static uint8_t disk_space[DISK_SIZE]; + +/******************************************************************************* + * Code + ******************************************************************************/ +/*! + * @brief Get RAM disk status. + */ +DSTATUS ram_disk_status(BYTE pdrv) +{ + if (pdrv != RAMDISK) + { + return STA_NOINIT; + } + return 0; +} + +/*! + * @brief Inidialize a RAM disk. + */ +DSTATUS ram_disk_initialize(BYTE pdrv) +{ + if (pdrv != RAMDISK) + { + return STA_NOINIT; + } + return 0; +} + +/*! + * @brief Read Sector(s) from RAM disk. + */ +DRESULT ram_disk_read(BYTE pdrv, BYTE *buff, DWORD sector, UINT count) +{ + if (pdrv != RAMDISK) + { + return RES_PARERR; + } + memcpy(buff, disk_space + sector * SECTOR_SIZE, SECTOR_SIZE * count); + return RES_OK; +} + +/*! + * @brief Write Sector(s) to RAM disk. + */ +DRESULT ram_disk_write(BYTE pdrv, const BYTE *buff, DWORD sector, UINT count) +{ + if (pdrv != RAMDISK) + { + return RES_PARERR; + } + memcpy(disk_space + sector * SECTOR_SIZE, buff, SECTOR_SIZE * count); + return RES_OK; +} + +/*! + * @brief Miscellaneous RAM disk Functions. + */ +DRESULT ram_disk_ioctl(BYTE pdrv, BYTE cmd, void *buff) +{ + if (pdrv != RAMDISK) + { + return RES_PARERR; + } + switch (cmd) + { + case GET_SECTOR_COUNT: + *(uint32_t *)buff = DISK_SIZE / SECTOR_SIZE; + return RES_OK; + break; + case GET_SECTOR_SIZE: + *(uint32_t *)buff = SECTOR_SIZE; + return RES_OK; + break; + case CTRL_SYNC: + return RES_OK; + break; + default: + break; + } + return RES_PARERR; +} +#endif /* RAM_DISK_ENABLE */ + +#endif /* McuLib_CONFIG_USE_FAT_FS */ + diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/source/fsl_ram_disk/fsl_ram_disk.h b/TSM_PicoW_Sensor/McuLib/FatFS/source/fsl_ram_disk/fsl_ram_disk.h new file mode 100644 index 0000000..f3c105c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/source/fsl_ram_disk/fsl_ram_disk.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef __FSL_RAMDISK_H__ +#define __FSL_RAMDISK_H__ + +#include "ff.h" +#include "diskio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* + * API + ******************************************************************************/ +DSTATUS ram_disk_initialize(BYTE pdrv); +DSTATUS ram_disk_status(BYTE pdrv); +DRESULT ram_disk_read(BYTE pdrv, BYTE *buff, DWORD sector, UINT count); +DRESULT ram_disk_write(BYTE pdrv, const BYTE *buff, DWORD sector, UINT count); +DRESULT ram_disk_ioctl(BYTE pdrv, BYTE cmd, void *buff); + +#if defined(__cplusplus) +} +#endif + +#endif /* __FSL_RAMDISK_H__ */ diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/source/fsl_sdspi_disk/fsl_sdspi_disk.c b/TSM_PicoW_Sensor/McuLib/FatFS/source/fsl_sdspi_disk/fsl_sdspi_disk.c new file mode 100644 index 0000000..ae3cad4 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/source/fsl_sdspi_disk/fsl_sdspi_disk.c @@ -0,0 +1,545 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuLib.h" +#if McuLib_CONFIG_USE_FAT_FS + +#include "ffconf.h" +/* This fatfs subcomponent is disabled by default + * To enable it, define following macro in ffconf.h */ +#ifdef SDSPI_DISK_ENABLE + +#include +#include +#include +#if McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_K22FN + #include "fsl_dspi.h" +#elif McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC55S16 + #include "fsl_spi.h" +#else + #error "target not supported yet" +#endif /* McuLib_CONFIG_CPU_VARIANT */ +#include "fsl_sdspi.h" +#include "fsl_gpio.h" +#include "fsl_sdspi_disk.h" + + +/* << EST */ +/******************************* SD Card Standard Commands **********************************/ +#define McuSDCard_CMD0 (0x40+0) /* Resets the SD Memory Card */ +#define McuSDCard_CMD1 (0x40+1) /* Sends host capacity support information and activates the card's + initialization process. HCS is effective when card receives SEND_IF_COND + command. Reserved bits shall be set to '0'. */ +#define McuSDCard_CMD6 (0x40+6) /* Checks switchable function (mode 0) and switches card function (mode 1).*/ +#define McuSDCard_CMD8 (0x40+8) /* Sends SD Memory Card interface condition that includes host supply voltage + information and asks the accessed card whether card can operate in supplied + voltage range. Reserved bits shall be set to '0'.*/ +#define McuSDCard_CMD9 (0x40+9) /* Asks the selected card to send its cardspecific data (CSD)*/ +#define McuSDCard_CMD10 (0x40+10) /* Asks the selected card to send its card identification (CID) */ +#define McuSDCard_CMD12 (0x40+12) /* Forces the card to stop transmission in Multiple Block Read Operation */ +#define McuSDCard_CMD13 (0x40+13) /* Asks the selected card to send its status register. */ +#define McuSDCard_CMD16 (0x40+16) /* Sets a block length (in bytes) for all following block commands (read and + write) of a Standard Capacity Card. Block length of the read and write + commands are fixed to 512 bytes in a High Capacity Card. The length of + LOCK_UNLOCK command is set by this command in both capacity cards.*/ +#define McuSDCard_CMD17 (0x40+17) /* Reads a block of the size selected by the SET_BLOCKLEN command.*/ +#define McuSDCard_CMD18 (0x40+18) /* Continuously transfers data blocks from card to host until interrupted by a + STOP_TRANSMISSION command.*/ +#define McuSDCard_CMD24 (0x40+24) /* Writes a block of the size selected by the SET_BLOCKLEN command. */ +#define McuSDCard_CMD25 (0x40+25) /* Continuously writes blocks of data until ’Stop Tran’ token is sent + (instead ’Start Block’).*/ +#define McuSDCard_CMD27 (0x40+27) /* Programming of the programmable bits of the CSD. */ +#define McuSDCard_CMD28 (0x40+28) /* If the card has write protection features, this command sets the write protection bit + of the addressed group. The properties of write protection are coded in the card + specific data (WP_GRP_SIZE). The High Capacity Card does not support this command.*/ +#define McuSDCard_CMD29 (0x40+29) /* If the card has write protection features, this command clears the write protection + bit of the addressed group. The High Capacity Card does not support this command. */ +#define McuSDCard_CMD30 (0x40+30) /* If the card has write protection features, this command asks the card to send the + status of the write protection bits.6 The High Capacity Card does not support this command. */ +#define McuSDCard_CMD32 (0x40+32) /* Sets the address of the first write block to be erased.*/ +#define McuSDCard_CMD33 (0x40+33) /* Sets the address of the last write block of the continuous range to be erased. */ +#define McuSDCard_CMD38 (0x40+38) /* Erases all previously selected write blocks */ +#define McuSDCard_CMD42 (0x40+42) /* Used to Set/Reset the Password or lock/unlock the card. A transferred data block includes + all the command details - refer to Chapter 4.3.7. The size of the Data Block is defined + with SET_BLOCK_LEN command. Reserved bits in the argument and in Lock Card Data Structure + shall be set to 0. */ +#define McuSDCard_CMD55 (0x40+55) /* Defines to the card that the next command is an application specific command + rather than a standard command */ +#define McuSDCard_CMD56 (0x40+56) /* Used either to transfer a Data Block to the card or to get a Data Block from the card + for general purpose/application specific commands. In case of Standard Capacity SD + Memory Card, the size of the Data Block shall be defined with SET_BLOCK_LEN command. + Block length of this command is fixed to 512-byte in High Capacity Card. */ +#define McuSDCard_CMD58 (0x40+58) /* Reads the OCR register of a card. CCS bit is assigned to OCR[30]. */ +#define McuSDCard_CMD59 (0x40+59) /* Turns the CRC option on or off. A ‘1’ in the CRC option bit will turn the option on, + a ‘0’ will turn it off */ +#define McuSDCard_ACMD41 (0xC0+41) /* SEND_OP_COND (SDC) */ +#define McuSDCard_ACMD13 (0xC0+13) /* SD_STATUS (SDC) */ +#define McuSDCard_ACMD23 (0xC0+23) /* SET_WR_BLK_ERASE_COUNT (SDC) */ + +static uint8_t CardType = CT_SD1; /* Card type flags */ + +/* << EST */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* SDSPI driver state. */ +sdspi_card_t g_card; +sdspi_host_t g_host; +/******************************************************************************* + * Code - SD disk interface + ******************************************************************************/ + +DRESULT sdspi_disk_write(uint8_t physicalDrive, const uint8_t *buffer, uint32_t sector, uint8_t count) +{ + if (physicalDrive != SDSPIDISK) + { + return RES_PARERR; + } + + if (kStatus_Success != SDSPI_WriteBlocks(&g_card, (uint8_t *)buffer, sector, count)) + { + return RES_ERROR; + } + return RES_OK; +} + +DRESULT sdspi_disk_read(uint8_t physicalDrive, uint8_t *buffer, uint32_t sector, uint8_t count) +{ + if (physicalDrive != SDSPIDISK) + { + return RES_PARERR; + } + + if (kStatus_Success != SDSPI_ReadBlocks(&g_card, buffer, sector, count)) + { + return RES_ERROR; + } + return RES_OK; +} + +#if 1 /* << EST */ +#include "McuTimeout.h" +#define McuSDCard_DUMMY 0xff /* SPI dummy value */ +#define McuSDCard_TIMEOUT_CMD_MS 100 /* user configured wait timeout for commands */ + +static void McuSDCard_SPI_WRITE(uint8_t data) { + g_card.host->exchange(&data, NULL, 1U); +} + +static void McuSDCard_SPI_WRITE_READ(uint8_t data, uint8_t *val) { + g_card.host->exchange(&data, val, 1U); +} + +bool McuSDCard_ReceiveDataBlock(uint8_t *data, uint16_t nofBytes) { + status_t status; + status = g_card.host->exchange(NULL, data, nofBytes); + return status==kStatus_Success; /* all ok */ +} + +uint8_t McuSDCard_SendCmd(uint8_t cmd, uint32_t arg) +{ + uint8_t n, res; + McuTimeout_CounterHandle timeout; + + if (cmd&0x80) { /* ACMD is the command sequence of CMD55-CMD */ + cmd &= 0x7F; + res = McuSDCard_SendCmd(McuSDCard_CMD55, 0); + if (res > 1) { + return res; + } + } + /* Select the card and wait for ready */ + //if (McuSDCard_WaitReady() != ERR_OK) { + // return 0xFF; + // } + // McuSDCard_Activate(); + /* Send command packet */ + McuSDCard_SPI_WRITE(cmd); /* Start + Command index */ + n = (uint8_t)(arg>>24); + McuSDCard_SPI_WRITE(n); /* Argument[31..24] */ + n = (uint8_t)(arg>>16); + McuSDCard_SPI_WRITE(n); /* Argument[23..16] */ + n = (uint8_t)(arg>>8); + McuSDCard_SPI_WRITE(n); /* Argument[15..8] */ + McuSDCard_SPI_WRITE((uint8_t)arg); /* Argument[7..0] */ + if (cmd == McuSDCard_CMD0) { + n = 0x95; /* Valid CRC for CMD0(0) */ + } else if (cmd == McuSDCard_CMD8) { + n = 0x87; /* Valid CRC for CMD8(0x1AA) */ + } else { + n = 0x01; /* Dummy CRC + Stop */ + } + McuSDCard_SPI_WRITE(n); + /* Receive command response */ + if (cmd == McuSDCard_CMD12) { + McuSDCard_SPI_WRITE_READ(McuSDCard_DUMMY, &res); /* send dummy value, poll response */ + } + timeout = McuTimeout_GetCounter(McuSDCard_TIMEOUT_CMD_MS/McuTimeout_TICK_PERIOD_MS); /* timeout */ + for(;;) { /* will timeout */ + McuSDCard_SPI_WRITE_READ(McuSDCard_DUMMY, &res); /* send dummy value, poll response */ + if (!(res&0x80)) { /* valid response */ + break; + } + if (McuTimeout_CounterExpired(timeout)) { + break; + } + } + McuTimeout_LeaveCounter(timeout); + //McuSDCard_Deactivate(); + return res; /* Return with the response value */ +} + +uint8_t McuSDCard_ReceiveByte(void) +{ + uint8_t data; + +// McuSDCard_Activate(); + McuSDCard_SPI_WRITE_READ(McuSDCard_DUMMY, &data); /* send dummy value, poll response */ +// McuSDCard_Deactivate(); + return data; +} + +#endif + +DRESULT sdspi_disk_ioctl(uint8_t physicalDrive, uint8_t command, void *buffer) +{ +#if 1 /* << EST */ + uint8_t n, csd[16], *ptr = (uint8_t*)buffer; + uint16_t csize; +#endif + DRESULT result = RES_OK; + + if (physicalDrive != SDSPIDISK) + { + return RES_PARERR; + } + + switch (command) + { +#if 0 /* << EST */ + case GET_SECTOR_COUNT: + if (buffer) + { + *(uint32_t *)buffer = g_card.blockCount; + } + else + { + result = RES_PARERR; + } + break; +#endif + case GET_SECTOR_SIZE: + if (buffer) + { + *(uint32_t *)buffer = g_card.blockSize; + } + else + { + result = RES_PARERR; + } + break; +#if 0 /* << EST */ + case GET_BLOCK_SIZE: + if (buffer) + { + *(uint32_t *)buffer = g_card.csd.eraseSectorSize; + } + else + { + result = RES_PARERR; + } + break; +#endif + case CTRL_SYNC: + result = RES_OK; + break; + /* << EST */ +#if 0 + case CTRL_SYNC : /* Make sure that no pending write process. Do not remove this or written sector might not left updated. */ + if (McuSDCard_WaitReady() != ERR_OK) { + res = RES_ERROR; + } + break; +#endif + case MMC_GET_READ_BL_LEN: /* get Block Length */ +// if (SDSPI_SendCommand(g_card.host, (kSDMMC_SendCsd<<8)|kSDSPI_ResponseTypeR1 /*McuSDCard_CMD9*/, 0, csd)!=kStatus_Success) { +// result = RES_PARERR; +// } + if ((McuSDCard_SendCmd(McuSDCard_CMD9, 0) == 0) && McuSDCard_ReceiveDataBlock(csd, 16)) { + switch((csd[5]&15)) { /* READ_BL_LEN is either 9, 10 or 11, end the block size is 2^READ_BL_LEN */ + case 9: *(uint16_t*)ptr = 512; break; + case 10: *(uint16_t*)ptr = 1024; break; + case 11: *(uint16_t*)ptr = 2048; break; + default: *(uint16_t*)ptr = 0; break; /* illegal */ + } + } + break; + case MMC_GET_SDC_VERSION: /* get CSD Version (1 byte: 1 for 1.xx or MMC, 2 for 2.0 */ + if ((McuSDCard_SendCmd(McuSDCard_CMD9, 0) == 0) && McuSDCard_ReceiveDataBlock(csd, 16)) { + if ((csd[0] >> 6) == 1) { /* SDC ver 2.00 */ + *ptr = 2; + } else { /* SDC ver 1.XX or MMC*/ + *ptr = 1; + } + } + break; + case GET_SECTOR_COUNT : /* Get number of sectors on the disk (uint32_t) */ + if ((McuSDCard_SendCmd(McuSDCard_CMD9, 0) == 0) && McuSDCard_ReceiveDataBlock(csd, 16)) { + if ((csd[0] >> 6) == 1) { /* SDC ver 2.00 */ + csize = (uint16_t)(csd[9] + ((uint16_t)csd[8] << 8) + 1); + *(uint32_t*)buffer = (uint32_t)csize << 10; + } else { /* SDC ver 1.XX or MMC*/ + n = (uint8_t)((csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2); + csize = (uint16_t)((csd[8] >> 6) + ((uint16_t)csd[7] << 2) + ((uint16_t)(csd[6] & 3) << 10) + 1); + *(uint32_t*)buffer = (uint32_t)csize << (uint8_t)(n - 9); + } + } + break; +// case GET_SECTOR_SIZE : /* Get R/W sector size (uint16_t) */ +// *(uint16_t*)buff = McuSDCard_BLOCK_SIZE; +// break; + case GET_BLOCK_SIZE : /* Get erase block size in unit of sector (uint32_t) */ + if (CardType & CT_SD2) { /* SDC ver 2.00 */ + if (McuSDCard_SendCmd(McuSDCard_ACMD13, 0) == 0) { /* Read SD status */ + (void)McuSDCard_ReceiveByte(); + if (McuSDCard_ReceiveDataBlock(csd, 16)) { /* Read partial block */ + for (n = 64 - 16; n; n--) { + (void)McuSDCard_ReceiveByte(); /* Purge trailing data */ + } + *(uint32_t*)buffer = 16UL << (csd[10] >> 4); + } + } + } else { /* SDC ver 1.XX or MMC */ + if ((McuSDCard_SendCmd(McuSDCard_CMD9, 0) == 0) && McuSDCard_ReceiveDataBlock(csd, 16)) { /* Read CSD */ + if (CardType & CT_SD1) { /* SDC ver 1.XX */ + *(uint32_t*)buffer = (uint32_t)((((csd[10] & 63) << 1) + ((uint16_t)(csd[11] & 128) >> 7) + 1) << (uint8_t)((csd[13] >> 6) - 1)); + } else { /* MMC */ + *(uint32_t*)buffer = (uint32_t)(((uint16_t)((csd[10] & 124) >> 2) + 1) * (((csd[11] & 3) << 3) + ((csd[11] & 224) >> 5) + 1)); + } + } + } + break; + case MMC_GET_TYPE : /* Get card type flags (1 byte) */ + *ptr = CardType; + break; + + case MMC_GET_CSD : /* Receive CSD as a data block (16 bytes) */ + if (!(McuSDCard_SendCmd(McuSDCard_CMD9, 0) == 0 /* READ_CSD */ + && McuSDCard_ReceiveDataBlock(ptr, 16))) + { + result = RES_PARERR; + } + break; + case MMC_GET_CID : /* Receive CID as a data block (16 bytes) */ + if (!(McuSDCard_SendCmd(McuSDCard_CMD10, 0) == 0 /* READ_CID */ + && McuSDCard_ReceiveDataBlock(ptr, 16))) + { + result = RES_PARERR; + } + break; + + case MMC_GET_OCR : /* Receive OCR as an R3 resp (4 bytes) */ + if (McuSDCard_SendCmd(McuSDCard_CMD58, 0) == 0) { /* READ_OCR */ + for (n = 4; n; n--) { + *ptr++ = McuSDCard_ReceiveByte(); + } + } else { + result = RES_PARERR; + } + break; + + case MMC_GET_SDSTAT : /* Receive SD status as a data block (64 bytes) */ + if (McuSDCard_SendCmd(McuSDCard_ACMD13, 0) == 0) { /* SD_STATUS */ + (void)McuSDCard_ReceiveByte(); + if (!McuSDCard_ReceiveDataBlock(ptr, 64)) { + result = RES_PARERR; + } + } else { + result = RES_PARERR; + } + break; + + case MMC_GET_DRIVER_VERSION: /* 1 byte: return: 0 SPI driver, 1 LLD SDHC driver */ + *ptr = 0; + break; +/* << EST */ + + default: + result = RES_PARERR; + break; + } + return result; +} + +DSTATUS sdspi_disk_status(uint8_t physicalDrive) +{ + if (physicalDrive != SDSPIDISK) + { + return STA_NOINIT; + } + return 0; +} + +DSTATUS sdspi_disk_initialize(uint8_t physicalDrive) +{ + if (physicalDrive == SDSPIDISK) + { + spi_init(); + sdspi_host_init(); + SDSPI_Init(&g_card); + g_card.host = &g_host; + return 0; + } + return STA_NOINIT; +} + +/******************************************************************************* + * Code - SPI interface + ******************************************************************************/ + +void spi_init(void) +{ +#if McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_K22FN + uint32_t sourceClock; + dspi_master_config_t masterConfig; + + /*Master config*/ + masterConfig.whichCtar = DSPI_MASTER_CTAR; + masterConfig.ctarConfig.baudRate = DSPI_BUS_BAUDRATE; + masterConfig.ctarConfig.bitsPerFrame = 8; + masterConfig.ctarConfig.cpol = kDSPI_ClockPolarityActiveHigh; + masterConfig.ctarConfig.cpha = kDSPI_ClockPhaseFirstEdge; + masterConfig.ctarConfig.direction = kDSPI_MsbFirst; + masterConfig.ctarConfig.pcsToSckDelayInNanoSec = 0; + masterConfig.ctarConfig.lastSckToPcsDelayInNanoSec = 0; + masterConfig.ctarConfig.betweenTransferDelayInNanoSec = 0; + + masterConfig.whichPcs = DSPI_MASTER_PCS_CONFIG; + masterConfig.pcsActiveHighOrLow = kDSPI_PcsActiveLow; + + masterConfig.enableContinuousSCK = false; + masterConfig.enableRxFifoOverWrite = false; + masterConfig.enableModifiedTimingFormat = false; + masterConfig.samplePoint = kDSPI_SckToSin0Clock; + + sourceClock = CLOCK_GetFreq(DSPI_MASTER_CLK_SRC); + DSPI_MasterInit((SPI_Type *)BOARD_SDSPI_SPI_BASE, &masterConfig, sourceClock); +#elif McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC55S16 + spi_master_config_t userConfig = {0}; + uint32_t srcFreq = 0; + status_t res; + + SPI_MasterGetDefaultConfig(&userConfig); + srcFreq = SDSPI_SPI_MASTER_CLK_FREQ; + userConfig.sselNum = (spi_ssel_t)SDSPI_SPI_SSEL; + userConfig.sselPol = (spi_spol_t)SDSPI_SPI_SPOL; + userConfig.dataWidth = kSPI_Data8Bits; + userConfig.polarity = kSPI_ClockPolarityActiveHigh; + userConfig.phase = kSPI_ClockPhaseFirstEdge; + userConfig.direction = kSPI_MsbFirst; + userConfig.sselPol = kSPI_SpolActiveAllLow; /* low active CS */ + res = SPI_MasterInit(SDSPI_SPI_MASTER, &userConfig, srcFreq); + if (res!=kStatus_Success) { + for(;;) {} + } +#else + #error "unknown device" +#endif +} + +status_t spi_set_frequency(uint32_t frequency) +{ +#if McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_K22FN + uint32_t sourceClock; + + sourceClock = CLOCK_GetFreq(DSPI_MASTER_CLK_SRC); + /* If returns 0, indicates failed. */ + if (DSPI_MasterSetBaudRate((SPI_Type *)BOARD_SDSPI_SPI_BASE, DSPI_MASTER_CTAR, frequency, sourceClock)) + { + return kStatus_Success; + } + + return kStatus_Fail; +#elif McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC55S16 + uint32_t sourceClock; + status_t res; + + sourceClock = SDSPI_SPI_MASTER_CLK_FREQ; + /* If returns 0, indicates failed. */ + res = SPI_MasterSetBaud((SPI_Type *)SDSPI_SPI_MASTER, frequency, sourceClock); + if (res!=kStatus_Success) { + for(;;) {} + } + return res; +#else + #error "unknown device" +#endif +} + +status_t spi_exchange(uint8_t *in, uint8_t *out, uint32_t size) +{ +#if McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_K22FN + dspi_transfer_t masterTransfer; + + masterTransfer.txData = in; + masterTransfer.rxData = out; + masterTransfer.dataSize = size; + masterTransfer.configFlags = (kDSPI_MasterCtar0 | DSPI_MASTER_PCS_TRANSFER | kDSPI_MasterPcsContinuous); + return DSPI_MasterTransferBlocking((SPI_Type *)BOARD_SDSPI_SPI_BASE, &masterTransfer); +#elif McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC55S16 + spi_transfer_t xfer = {0}; + xfer.txData = in; + xfer.rxData = out; + xfer.dataSize = size; + xfer.configFlags = kSPI_FrameAssert; + return SPI_MasterTransferBlocking(SDSPI_SPI_MASTER, &xfer); +#else + #error "unknown device" +#endif +} + +#if 1 /* << EST */ +static void sdspi_init(void) { +} + +static void sdspi_deinit(void) { +} + +static void sdspi_activePolarity(sdspi_cs_active_polarity_t polarity) { /* used to change clock polarity */ +} +#endif + + +void sdspi_host_init(void) +{ + /* Saves host state and callback. */ + g_host.busBaudRate = DSPI_BUS_BAUDRATE; + g_host.setFrequency = spi_set_frequency; + g_host.exchange = spi_exchange; +#if 1 /* << EST */ + g_host.init = sdspi_init; + g_host.deinit = sdspi_deinit; + g_host.csActivePolarity = sdspi_activePolarity; +#endif + /* Saves card state. */ + g_card.host = &g_host; +} +#endif /* SDSPI_DISK_ENABLE */ + +#endif /* McuLib_CONFIG_USE_FAT_FS */ + diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/source/fsl_sdspi_disk/fsl_sdspi_disk.h b/TSM_PicoW_Sensor/McuLib/FatFS/source/fsl_sdspi_disk/fsl_sdspi_disk.h new file mode 100644 index 0000000..b6f175c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/source/fsl_sdspi_disk/fsl_sdspi_disk.h @@ -0,0 +1,195 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _FSL_SDSPI_DISK_H_ +#define _FSL_SDSPI_DISK_H_ + +#include +#include "ff.h" +#include "diskio.h" +#include "fsl_common.h" +#include "board.h" + +/*! + * @addtogroup SD Disk over SPI + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ +#if McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_K22FN +/* DSPI clock source */ +#if (BOARD_SDSPI_SPI_BASE == SPI0_BASE) +#define DSPI_MASTER_CLK_SRC (DSPI0_CLK_SRC) +#elif(BOARD_SDSPI_SPI_BASE == SPI1_BASE) +#define DSPI_MASTER_CLK_SRC (DSPI0_CLK_SRC) +#elif(BOARD_SDSPI_SPI_BASE == SPI2_BASE) +#define DSPI_MASTER_CLK_SRC (DSPI2_CLK_SRC) +#elif(BOARD_SDSPI_SPI_BASE == SPI3_BASE) +#define DSPI_MASTER_CLK_SRC (DSPI3_CLK_SRC) +#elif(BOARD_SDSPI_SPI_BASE == SPI4_BASE) +#define DSPI_MASTER_CLK_SRC (DSPI4_CLK_SRC) +#else +#error Should define the DSPI_MASTER_CLK_SRC! +#endif + +/* Which PCS used to select the slave */ +#if (BOARD_SDSPI_SPI_PCS_NUMBER == 0U) +#define DSPI_MASTER_PCS_CONFIG kDSPI_Pcs0 +#define DSPI_MASTER_PCS_TRANSFER kDSPI_MasterPcs0 +#elif(BOARD_SDSPI_SPI_PCS_NUMBER == 1U) +#define DSPI_MASTER_PCS_CONFIG kDSPI_Pcs1 +#define DSPI_MASTER_PCS_TRANSFER kDSPI_MasterPcs1 +#elif(BOARD_SDSPI_SPI_PCS_NUMBER == 2U) +#define DSPI_MASTER_PCS_CONFIG kDSPI_Pcs2 +#define DSPI_MASTER_PCS_TRANSFER kDSPI_MasterPcs2 +#elif(BOARD_SDSPI_SPI_PCS_NUMBER == 3U) +#define DSPI_MASTER_PCS_CONFIG kDSPI_Pcs3 +#define DSPI_MASTER_PCS_TRANSFER kDSPI_MasterPcs3 +#elif(BOARD_SDSPI_SPI_PCS_NUMBER == 4U) +#define DSPI_MASTER_PCS_CONFIG kDSPI_Pcs4 +#define DSPI_MASTER_PCS_TRANSFER kDSPI_MasterPcs4 +#elif(BOARD_SDSPI_SPI_PCS_NUMBER == 5U) +#define DSPI_MASTER_PCS_CONFIG kDSPI_Pcs5 +#define DSPI_MASTER_PCS_TRANSFER kDSPI_MasterPcs5 +#endif + +#define DSPI_MASTER_CTAR (kDSPI_Ctar0) /* The CTAR to describe the transfer attribute */ + +#elif McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC55S16 + +#define SDSPI_SPI_MASTER SPI8 +#define SDSPI_SPI_MASTER_IRQ FLEXCOMM8_IRQn +#define SDSPI_SPI_MASTER_CLK_SRC kCLOCK_Flexcomm8 +#define SDSPI_SPI_MASTER_CLK_FREQ CLOCK_GetFlexCommClkFreq(8U) +#define SDSPI_SPI_SSEL 1 +#define SDSPI_SPI_SPOL kSPI_SpolActiveAllLow +#else + #error "unknown device" +#endif /* McuLib_CONFIG_CPU_VARIANT */ + +#define DSPI_BUS_BAUDRATE (500000U) /* Transfer baudrate - 500k */ + +/************************************************************************************************* + * API - SD disk interface + ************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name SD over SPI Disk Function + * @{ + */ + +/*! + * @brief Initializes SD disk over SPI. + * + * @param physicalDrive Physical drive number. + * @retval STA_NOINIT Failed. + * @retval RES_OK Success. + */ +DSTATUS sdspi_disk_initialize(uint8_t physicalDrive); + +/*! + * Gets SD over SPI disk status + * + * @param physicalDrive Physical drive number. + * @retval STA_NOINIT Failed. + * @retval RES_OK Success. + */ +DSTATUS sdspi_disk_status(uint8_t physicalDrive); + +/*! + * @brief Reads SD disk over SPI. + * + * @param physicalDrive Physical drive number. + * @param buffer The data buffer pointer to store read content. + * @param sector The start sector number to be read. + * @param count The sector count to be read. + * @retval RES_PARERR Failed. + * @retval RES_OK Success. + */ +DRESULT sdspi_disk_read(uint8_t physicalDrive, uint8_t *buffer, uint32_t sector, uint8_t count); + +/*! + * @brief Writes to SD disk over SPI. + * + * @param physicalDrive Physical drive number. + * @param buffer The data buffer pointer to store write content. + * @param sector The start sector number to be written. + * @param count The sector count to be written. + * @retval RES_PARERR Failed. + * @retval RES_OK Success. + */ +DRESULT sdspi_disk_write(uint8_t physicalDrive, const uint8_t *buffer, uint32_t sector, uint8_t count); + +/*! + * @brief SD over SPI disk IO operation. + * + * @param physicalDrive Physical drive number. + * @param command The command to be set. + * @param buffer The buffer to store command result. + * @retval RES_PARERR Failed. + * @retval RES_OK Success. + */ +DRESULT sdspi_disk_ioctl(uint8_t physicalDrive, uint8_t command, void *buffer); + +/************************************************************************************************* + * API - SPI interface + ************************************************************************************************/ +/*! + * @brief Initializes the SPI. + */ +void spi_init(void); + +/*! + * @brief Sets the SPI bus frequency. + * + * @param frequency The frequency to set. + * @retval kStatus_Success Success. + * @retval kStatus_Fail Failed. + */ +status_t spi_set_frequency(uint32_t frequency); + +/*! + * @brief Transfers data over SPI bus in full-duplex way. + * + * @param in The buffer to save the data to be sent. + * @param out The buffer to save the data to be read. + * @param size The transfer data size. + * @return The status of the function DSPI_MasterTransferPolling(). + */ +status_t spi_exchange(uint8_t *in, uint8_t *out, uint32_t size); + +/*! + * @brief Initializes the timer to generator 1ms interrupt used to get current time in milliseconds. + */ +void timer_init(void); + +/*! + * @brief Gets current time in milliseconds. + * + * @return Current time in milliseconds. + */ +uint32_t timer_get_current_milliseconds(void); + +/*! + * @brief Initializes the host descriptor. + */ +void sdspi_host_init(void); + +/* @} */ +#if defined(__cplusplus) +} +#endif + +#endif /* _FSL_SDSPI_DISK_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/source/fsl_usb_disk/fsl_usb_disk.h b/TSM_PicoW_Sensor/McuLib/FatFS/source/fsl_usb_disk/fsl_usb_disk.h new file mode 100644 index 0000000..4b7099e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/source/fsl_usb_disk/fsl_usb_disk.h @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _MSD_DISKIO_H_ +#define _MSD_DISKIO_H_ + +#include "usb_host_config.h" +#include "usb_host.h" +#include "usb_host_msd.h" +#include "ff.h" +#include "diskio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @brief mass storage read/write retry time */ +#define USB_HOST_FATFS_RW_RETRY_TIMES (2U) + +/******************************************************************************* + * API + ******************************************************************************/ + +/*! + * @brief fatfs call this function to initialize physical disk. + * + * @param pdrv Physical drive number. + * + * @retval 0x00 success. + */ +extern DSTATUS USB_HostMsdInitializeDisk(BYTE pdrv); + +/*! + * @brief fatfs call this function to get physical disk status. + * + * @param pdrv Physical drive number. + * + * @retval 0x00 OK. + */ +extern DSTATUS USB_HostMsdGetDiskStatus(BYTE pdrv); + +/*! + * @brief fatfs call this function to write data to physical disk. + * + * @param pdrv Physical drive number. + * @param buff Pointer to the data buffer to store read data. + * @param sector Start sector number. + * @param count Number of sectors to read. + * + * @retval RES_PARERR parameter error. + * @retval RES_ERROR usb stack driver error. + * @retval RES_NOTRDY read disk error. + */ +extern DRESULT USB_HostMsdReadDisk(BYTE pdrv, BYTE *buff, DWORD sector, UINT count); + +/*! + * @brief fatfs call this function to write data to physical disk. + * + * @param pdrv Physical drive number. + * @param buff Pointer to the data buffer to be written. + * @param sector Start sector number. + * @param count Number of sectors to read. + * + * @retval RES_PARERR parameter error. + * @retval RES_ERROR usb stack driver error. + * @retval RES_NOTRDY write disk error. + */ +extern DRESULT USB_HostMsdWriteDisk(BYTE pdrv, const BYTE *buff, DWORD sector, UINT count); + +/*! + * @brief fatfs call this function to write data to physical disk. + * + * @param pdrv Physical drive number. + * @param cmd ioctl command, please reference to diskio.h + * @param buff Parameter or data buffer. + * + * @retval RES_PARERR parameter error. + * @retval RES_ERROR usb stack driver error. + * @retval RES_NOTRDY write disk error. + */ +extern DRESULT USB_HostMsdIoctlDisk(BYTE pdrv, BYTE cmd, void *buff); + +#endif /* _MSD_DISKIO_H_ */ + diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/source/fsl_usb_disk/fsl_usb_disk_bm.c b/TSM_PicoW_Sensor/McuLib/FatFS/source/fsl_usb_disk/fsl_usb_disk_bm.c new file mode 100644 index 0000000..078df8f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/source/fsl_usb_disk/fsl_usb_disk_bm.c @@ -0,0 +1,386 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuLib.h" +#if McuLib_CONFIG_USE_FAT_FS + +#include "ffconf.h" +/* This fatfs subcomponent is disabled by default + * To enable it, define following macro in ffconf.h */ +#ifdef USB_DISK_ENABLE + +#include "fsl_usb_disk.h" /* FatFs lower layer API */ + + +/******************************************************************************* + * Definitons + ******************************************************************************/ + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/*! + * @brief host msd ufi command callback. + * + * This function is used as callback function for ufi command . + * + * @param param NULL. + * @param data data buffer pointer. + * @param dataLength data length. + * @status transfer result status. + */ +static void USB_HostMsdUfiCallback(void *param, uint8_t *data, uint32_t dataLength, usb_status_t status); + +/******************************************************************************* + * Variables + ******************************************************************************/ + +extern usb_host_handle g_HostHandle; + +usb_host_class_handle g_UsbFatfsClassHandle; +static uint32_t s_FatfsSectorSize; +/* command on-going state. It should set to 1 when start command, it is set to 0 in the callback */ +static volatile uint8_t ufiIng; +/* command callback status */ +static volatile usb_status_t ufiStatus; + +#if (defined(USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE) && (USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE)) ||\ + (defined(DATA_SECTION_IS_CACHEABLE) && (DATA_SECTION_IS_CACHEABLE)) +USB_DMA_NONINIT_DATA_ALIGN(USB_DATA_ALIGN_SIZE) static uint8_t s_UsbTransferBuffer[FF_MAX_SS]; +#else +USB_DMA_NONINIT_DATA_ALIGN(USB_DATA_ALIGN_SIZE) static uint8_t s_UsbTransferBuffer[20]; +#endif + +/******************************************************************************* + * Code + ******************************************************************************/ + +static void USB_HostMsdUfiCallback(void *param, uint8_t *data, uint32_t dataLength, usb_status_t status) +{ + ufiIng = 0; + ufiStatus = status; +} + +static inline void USB_HostControllerTaskFunction(usb_host_handle hostHandle) +{ +#if ((defined USB_HOST_CONFIG_KHCI) && (USB_HOST_CONFIG_KHCI)) + USB_HostKhciTaskFunction(hostHandle); +#endif /* USB_HOST_CONFIG_KHCI */ +#if ((defined USB_HOST_CONFIG_EHCI) && (USB_HOST_CONFIG_EHCI)) + USB_HostEhciTaskFunction(hostHandle); +#endif /* USB_HOST_CONFIG_EHCI */ +#if ((defined USB_HOST_CONFIG_IP3516HS) && (USB_HOST_CONFIG_IP3516HS > 0U)) + USB_HostIp3516HsTaskFunction(g_HostHandle); +#endif /* USB_HOST_CONFIG_IP3516HS */ +#if ((defined USB_HOST_CONFIG_OHCI) && (USB_HOST_CONFIG_OHCI > 0U)) + USB_HostOhciTaskFunction(g_HostHandle); +#endif /* USB_HOST_CONFIG_OHCI */ +} + +DSTATUS USB_HostMsdInitializeDisk(BYTE pdrv) +{ + uint32_t address; + + /* test unit ready */ + ufiIng = 1; + if (g_UsbFatfsClassHandle == NULL) + { + return RES_ERROR; + } + if (USB_HostMsdTestUnitReady(g_UsbFatfsClassHandle, 0, USB_HostMsdUfiCallback, NULL) != kStatus_USB_Success) + { + return STA_NOINIT; + } + while (ufiIng) /* wait the command */ + { + USB_HostControllerTaskFunction(g_HostHandle); + } + + /*request sense */ + ufiIng = 1; + if (g_UsbFatfsClassHandle == NULL) + { + return RES_ERROR; + } + if (USB_HostMsdRequestSense(g_UsbFatfsClassHandle, 0, s_UsbTransferBuffer, sizeof(usb_host_ufi_sense_data_t), + USB_HostMsdUfiCallback, NULL) != kStatus_USB_Success) + { + return STA_NOINIT; + } + while (ufiIng) /* wait the command */ + { + USB_HostControllerTaskFunction(g_HostHandle); + } + + /* get the sector size */ + ufiIng = 1; + if (g_UsbFatfsClassHandle == NULL) + { + return RES_ERROR; + } + if (USB_HostMsdReadCapacity(g_UsbFatfsClassHandle, 0, s_UsbTransferBuffer, sizeof(usb_host_ufi_read_capacity_t), + USB_HostMsdUfiCallback, NULL) != kStatus_USB_Success) + { + return STA_NOINIT; + } + else + { + while (ufiIng) + { + USB_HostControllerTaskFunction(g_HostHandle); + } + if (ufiStatus == kStatus_USB_Success) + { + address = (uint32_t)&s_UsbTransferBuffer[0]; + address = (uint32_t)((usb_host_ufi_read_capacity_t *)(address))->blockLengthInBytes; + s_FatfsSectorSize = USB_LONG_FROM_BIG_ENDIAN_ADDRESS(((uint8_t *)address)); + } + else + { + s_FatfsSectorSize = 512; + } + } + + return 0x00; +} + +DSTATUS USB_HostMsdGetDiskStatus(BYTE pdrv) +{ + return 0x00; +} + +DRESULT USB_HostMsdReadDisk(BYTE pdrv, BYTE *buff, DWORD sector, UINT count) +{ + DRESULT fatfs_code = RES_ERROR; + usb_status_t status = kStatus_USB_Success; + uint32_t retry = USB_HOST_FATFS_RW_RETRY_TIMES; + uint8_t *transferBuf; + uint32_t sectorCount; + uint32_t sectorIndex; +#if (defined(USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE) && (USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE)) ||\ + (defined(DATA_SECTION_IS_CACHEABLE) && (DATA_SECTION_IS_CACHEABLE)) + uint32_t index; +#endif + + if (!count) + { + return RES_PARERR; + } + +#if (defined(USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE) && (USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE)) ||\ + (defined(DATA_SECTION_IS_CACHEABLE) && (DATA_SECTION_IS_CACHEABLE)) + transferBuf = s_UsbTransferBuffer; + sectorCount = 1; + for (index = 0; index < count; ++index) + { + sectorIndex = sector + index; +#else + transferBuf = buff; + sectorCount = count; + sectorIndex = sector; +#endif + retry = USB_HOST_FATFS_RW_RETRY_TIMES; + while (retry--) + { + ufiIng = 1; + if (g_UsbFatfsClassHandle == NULL) + { + return RES_ERROR; + } + status = USB_HostMsdRead10(g_UsbFatfsClassHandle, 0, sectorIndex, (uint8_t *)transferBuf, + (uint32_t)(s_FatfsSectorSize * sectorCount), sectorCount, USB_HostMsdUfiCallback, NULL); + if (status != kStatus_USB_Success) + { + fatfs_code = RES_ERROR; + } + else + { + while (ufiIng) + { + USB_HostControllerTaskFunction(g_HostHandle); + } + if (ufiStatus == kStatus_USB_Success) + { + fatfs_code = RES_OK; + break; + } + else + { + fatfs_code = RES_NOTRDY; + } + } + } +#if (defined(USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE) && (USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE)) ||\ + (defined(DATA_SECTION_IS_CACHEABLE) && (DATA_SECTION_IS_CACHEABLE)) + memcpy(buff + index * s_FatfsSectorSize, s_UsbTransferBuffer, s_FatfsSectorSize); + } +#endif + return fatfs_code; +} + +DRESULT USB_HostMsdWriteDisk(BYTE pdrv, const BYTE *buff, DWORD sector, UINT count) +{ + DRESULT fatfs_code = RES_ERROR; + usb_status_t status = kStatus_USB_Success; + uint32_t retry = USB_HOST_FATFS_RW_RETRY_TIMES; + const uint8_t *transferBuf; + uint32_t sectorCount; + uint32_t sectorIndex; +#if (defined(USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE) && (USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE)) ||\ + (defined(DATA_SECTION_IS_CACHEABLE) && (DATA_SECTION_IS_CACHEABLE)) + uint32_t index; +#endif + + if (!count) + { + return RES_PARERR; + } + +#if (defined(USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE) && (USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE)) ||\ + (defined(DATA_SECTION_IS_CACHEABLE) && (DATA_SECTION_IS_CACHEABLE)) + transferBuf = (const uint8_t *)s_UsbTransferBuffer; + sectorCount = 1; + for (index = 0; index < count; ++index) + { + sectorIndex = sector + index; + memcpy(s_UsbTransferBuffer, buff + index * s_FatfsSectorSize, s_FatfsSectorSize); +#else + transferBuf = buff; + sectorCount = count; + sectorIndex = sector; +#endif + retry = USB_HOST_FATFS_RW_RETRY_TIMES; + while (retry--) + { + ufiIng = 1; + if (g_UsbFatfsClassHandle == NULL) + { + return RES_ERROR; + } + status = USB_HostMsdWrite10(g_UsbFatfsClassHandle, 0, sectorIndex, (uint8_t *)transferBuf, + (uint32_t)(s_FatfsSectorSize * sectorCount), sectorCount, USB_HostMsdUfiCallback, NULL); + if (status != kStatus_USB_Success) + { + fatfs_code = RES_ERROR; + } + else + { + while (ufiIng) + { + USB_HostControllerTaskFunction(g_HostHandle); + } + if (ufiStatus == kStatus_USB_Success) + { + fatfs_code = RES_OK; + break; + } + else + { + fatfs_code = RES_NOTRDY; + } + } + } +#if (defined(USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE) && (USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE)) ||\ + (defined(DATA_SECTION_IS_CACHEABLE) && (DATA_SECTION_IS_CACHEABLE)) + } +#endif + return fatfs_code; +} + +DRESULT USB_HostMsdIoctlDisk(BYTE pdrv, BYTE cmd, void *buff) +{ + uint32_t address; + DRESULT fatfs_code = RES_ERROR; + usb_status_t status = kStatus_USB_Success; + uint32_t value; + + switch (cmd) + { + case GET_SECTOR_COUNT: + case GET_SECTOR_SIZE: + if (!buff) + { + return RES_ERROR; + } + + ufiIng = 1; + if (g_UsbFatfsClassHandle == NULL) + { + return RES_ERROR; + } + status = USB_HostMsdReadCapacity(g_UsbFatfsClassHandle, 0, s_UsbTransferBuffer, + sizeof(usb_host_ufi_read_capacity_t), USB_HostMsdUfiCallback, NULL); + if (status != kStatus_USB_Success) + { + fatfs_code = RES_ERROR; + } + else + { + while (ufiIng) + { + USB_HostControllerTaskFunction(g_HostHandle); + } + if (ufiStatus == kStatus_USB_Success) + { + fatfs_code = RES_OK; + } + else + { + fatfs_code = RES_NOTRDY; + } + } + + if (fatfs_code == RES_OK) + { + if (GET_SECTOR_COUNT == cmd) /* Get number of sectors on the disk (DWORD) */ + { + address = (uint32_t)&s_UsbTransferBuffer[0]; + address = (uint32_t)((usb_host_ufi_read_capacity_t *)(address))->lastLogicalBlockAddress; + value = USB_LONG_FROM_BIG_ENDIAN_ADDRESS(((uint8_t *)address)); + ((uint8_t *)buff)[0] = ((uint8_t*)&value)[0]; + ((uint8_t *)buff)[1] = ((uint8_t*)&value)[1]; + ((uint8_t *)buff)[2] = ((uint8_t*)&value)[2]; + ((uint8_t *)buff)[3] = ((uint8_t*)&value)[3]; + } + else /* Get the sector size in byte */ + { + address = (uint32_t)&s_UsbTransferBuffer[0]; + address = (uint32_t)((usb_host_ufi_read_capacity_t *)(address))->blockLengthInBytes; + value = USB_LONG_FROM_BIG_ENDIAN_ADDRESS(((uint8_t *)address)); + ((uint8_t *)buff)[0] = ((uint8_t*)&value)[0]; + ((uint8_t *)buff)[1] = ((uint8_t*)&value)[1]; + ((uint8_t *)buff)[2] = ((uint8_t*)&value)[2]; + ((uint8_t *)buff)[3] = ((uint8_t*)&value)[3]; + } + } + break; + + case GET_BLOCK_SIZE: + if (!buff) + { + return RES_ERROR; + } + *(uint32_t *)buff = 0; + fatfs_code = RES_OK; + break; + + case CTRL_SYNC: + fatfs_code = RES_OK; + break; + + default: + fatfs_code = RES_PARERR; + break; + } + return fatfs_code; +} +#endif /* USB_DISK_ENABLE */ + +#endif /* McuLib_CONFIG_USE_FAT_FS */ diff --git a/TSM_PicoW_Sensor/McuLib/FatFS/source/fsl_usb_disk/fsl_usb_disk_freertos.c b/TSM_PicoW_Sensor/McuLib/FatFS/source/fsl_usb_disk/fsl_usb_disk_freertos.c new file mode 100644 index 0000000..83e5ac0 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FatFS/source/fsl_usb_disk/fsl_usb_disk_freertos.c @@ -0,0 +1,376 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#include "McuLib.h" +#if McuLib_CONFIG_USE_FAT_FS + +#include "ffconf.h" +/* This fatfs subcomponent is disabled by default + * To enable it, define following macro in ffconf.h */ +#ifdef USB_DISK_ENABLE + +#include "fsl_usb_disk.h" /* FatFs lower layer API */ + +/******************************************************************************* + * Definitons + ******************************************************************************/ + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/*! + * @brief host msd ufi command callback. + * + * This function is used as callback function for ufi command . + * + * @param param NULL. + * @param data data buffer pointer. + * @param dataLength data length. + * @status transfer result status. + */ +static void USB_HostMsdUfiCallback(void *param, uint8_t *data, uint32_t dataLength, usb_status_t status); + +/******************************************************************************* + * Variables + ******************************************************************************/ + +extern usb_host_handle g_HostHandle; + +usb_host_class_handle g_UsbFatfsClassHandle; +static uint32_t s_FatfsSectorSize; +static SemaphoreHandle_t s_CommandSemaphore; +/* command callback status */ +static volatile usb_status_t ufiStatus; + +#if (defined(USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE) && (USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE)) ||\ + (defined(DATA_SECTION_IS_CACHEABLE) && (DATA_SECTION_IS_CACHEABLE)) +USB_DMA_NONINIT_DATA_ALIGN(USB_DATA_ALIGN_SIZE) static uint8_t s_UsbTransferBuffer[FF_MAX_SS]; +#else +USB_DMA_NONINIT_DATA_ALIGN(USB_DATA_ALIGN_SIZE) static uint8_t s_UsbTransferBuffer[20]; +#endif + +/******************************************************************************* + * Code + ******************************************************************************/ + +static void USB_HostMsdUfiCallback(void *param, uint8_t *data, uint32_t dataLength, usb_status_t status) +{ + xSemaphoreGive(s_CommandSemaphore); + ufiStatus = status; +} + +DSTATUS USB_HostMsdInitializeDisk(BYTE pdrv) +{ + uint32_t address; + + if (s_CommandSemaphore == NULL) + { + s_CommandSemaphore = xSemaphoreCreateCounting(0x01U, 0x00U); + } + else + { + vSemaphoreDelete(s_CommandSemaphore); + s_CommandSemaphore = xSemaphoreCreateCounting(0x01U, 0x00U); + } + if (NULL == s_CommandSemaphore) + { + return RES_ERROR; + } + + /* test unit ready */ + if (g_UsbFatfsClassHandle == NULL) + { + return RES_ERROR; + } + if (USB_HostMsdTestUnitReady(g_UsbFatfsClassHandle, 0, USB_HostMsdUfiCallback, NULL) != kStatus_USB_Success) + { + return STA_NOINIT; + } + if (pdTRUE != xSemaphoreTake(s_CommandSemaphore, portMAX_DELAY)) /* wait the command */ + { + return RES_ERROR; + } + + /*request sense */ + if (g_UsbFatfsClassHandle == NULL) + { + return RES_ERROR; + } + if (USB_HostMsdRequestSense(g_UsbFatfsClassHandle, 0, s_UsbTransferBuffer, sizeof(usb_host_ufi_sense_data_t), + USB_HostMsdUfiCallback, NULL) != kStatus_USB_Success) + { + return STA_NOINIT; + } + if (pdTRUE != xSemaphoreTake(s_CommandSemaphore, portMAX_DELAY)) /* wait the command */ + { + return RES_ERROR; + } + + /* get the sector size */ + if (g_UsbFatfsClassHandle == NULL) + { + return RES_ERROR; + } + if (USB_HostMsdReadCapacity(g_UsbFatfsClassHandle, 0, s_UsbTransferBuffer, sizeof(usb_host_ufi_read_capacity_t), + USB_HostMsdUfiCallback, NULL) != kStatus_USB_Success) + { + return STA_NOINIT; + } + else + { + if (pdTRUE != xSemaphoreTake(s_CommandSemaphore, portMAX_DELAY)) /* wait the command */ + { + return RES_ERROR; + } + if (ufiStatus == kStatus_USB_Success) + { + address = (uint32_t)&s_UsbTransferBuffer[0]; + address = (uint32_t)((usb_host_ufi_read_capacity_t *)(address))->blockLengthInBytes; + s_FatfsSectorSize = USB_LONG_FROM_BIG_ENDIAN_ADDRESS(((uint8_t *)address)); + } + else + { + s_FatfsSectorSize = 512; + } + } + + return 0x00; +} + +DSTATUS USB_HostMsdGetDiskStatus(BYTE pdrv) +{ + return 0x00; +} + +DRESULT USB_HostMsdReadDisk(BYTE pdrv, BYTE *buff, DWORD sector, UINT count) +{ + DRESULT fatfs_code = RES_ERROR; + usb_status_t status = kStatus_USB_Success; + uint32_t retry = USB_HOST_FATFS_RW_RETRY_TIMES; + uint8_t *transferBuf; + uint32_t sectorCount; + uint32_t sectorIndex; +#if (defined(USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE) && (USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE)) ||\ + (defined(DATA_SECTION_IS_CACHEABLE) && (DATA_SECTION_IS_CACHEABLE)) + uint32_t index; +#endif + + if (!count) + { + return RES_PARERR; + } + +#if (defined(USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE) && (USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE)) ||\ + (defined(DATA_SECTION_IS_CACHEABLE) && (DATA_SECTION_IS_CACHEABLE)) + transferBuf = s_UsbTransferBuffer; + sectorCount = 1; + for (index = 0; index < count; ++index) + { + sectorIndex = sector + index; +#else + transferBuf = buff; + sectorCount = count; + sectorIndex = sector; +#endif + retry = USB_HOST_FATFS_RW_RETRY_TIMES; + while (retry--) + { + if (g_UsbFatfsClassHandle == NULL) + { + return RES_ERROR; + } + status = USB_HostMsdRead10(g_UsbFatfsClassHandle, 0, sectorIndex, (uint8_t *)transferBuf, + (uint32_t)(s_FatfsSectorSize * sectorCount), sectorCount, USB_HostMsdUfiCallback, NULL); + if (status != kStatus_USB_Success) + { + fatfs_code = RES_ERROR; + } + else + { + if (pdTRUE != xSemaphoreTake(s_CommandSemaphore, portMAX_DELAY)) /* wait the command */ + { + return RES_ERROR; + } + if (ufiStatus == kStatus_USB_Success) + { + fatfs_code = RES_OK; + break; + } + else + { + fatfs_code = RES_NOTRDY; + } + } + } +#if (defined(USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE) && (USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE)) ||\ + (defined(DATA_SECTION_IS_CACHEABLE) && (DATA_SECTION_IS_CACHEABLE)) + memcpy(buff + index * s_FatfsSectorSize, s_UsbTransferBuffer, s_FatfsSectorSize); + } +#endif + return fatfs_code; +} + +DRESULT USB_HostMsdWriteDisk(BYTE pdrv, const BYTE *buff, DWORD sector, UINT count) +{ + DRESULT fatfs_code = RES_ERROR; + usb_status_t status = kStatus_USB_Success; + uint32_t retry = USB_HOST_FATFS_RW_RETRY_TIMES; + const uint8_t *transferBuf; + uint32_t sectorCount; + uint32_t sectorIndex; +#if (defined(USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE) && (USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE)) ||\ + (defined(DATA_SECTION_IS_CACHEABLE) && (DATA_SECTION_IS_CACHEABLE)) + uint32_t index; +#endif + + if (!count) + { + return RES_PARERR; + } + +#if (defined(USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE) && (USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE)) ||\ + (defined(DATA_SECTION_IS_CACHEABLE) && (DATA_SECTION_IS_CACHEABLE)) + transferBuf = (const uint8_t *)s_UsbTransferBuffer; + sectorCount = 1; + for (index = 0; index < count; ++index) + { + sectorIndex = sector + index; + memcpy(s_UsbTransferBuffer, buff + index * s_FatfsSectorSize, s_FatfsSectorSize); +#else + transferBuf = buff; + sectorCount = count; + sectorIndex = sector; +#endif + retry = USB_HOST_FATFS_RW_RETRY_TIMES; + while (retry--) + { + if (g_UsbFatfsClassHandle == NULL) + { + return RES_ERROR; + } + status = USB_HostMsdWrite10(g_UsbFatfsClassHandle, 0, sectorIndex, (uint8_t *)transferBuf, + (uint32_t)(s_FatfsSectorSize * sectorCount), sectorCount, USB_HostMsdUfiCallback, NULL); + if (status != kStatus_USB_Success) + { + fatfs_code = RES_ERROR; + } + else + { + if (pdTRUE != xSemaphoreTake(s_CommandSemaphore, portMAX_DELAY)) /* wait the command */ + { + return RES_ERROR; + } + if (ufiStatus == kStatus_USB_Success) + { + fatfs_code = RES_OK; + break; + } + else + { + fatfs_code = RES_NOTRDY; + } + } + } +#if (defined(USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE) && (USB_HOST_CONFIG_BUFFER_PROPERTY_CACHEABLE)) ||\ + (defined(DATA_SECTION_IS_CACHEABLE) && (DATA_SECTION_IS_CACHEABLE)) + } +#endif + return fatfs_code; +} + +DRESULT USB_HostMsdIoctlDisk(BYTE pdrv, BYTE cmd, void *buff) +{ + uint32_t address; + DRESULT fatfs_code = RES_ERROR; + usb_status_t status = kStatus_USB_Success; + uint32_t value; + + switch (cmd) + { + case GET_SECTOR_COUNT: + case GET_SECTOR_SIZE: + if (!buff) + { + return RES_ERROR; + } + + if (g_UsbFatfsClassHandle == NULL) + { + return RES_ERROR; + } + status = USB_HostMsdReadCapacity(g_UsbFatfsClassHandle, 0, s_UsbTransferBuffer, + sizeof(usb_host_ufi_read_capacity_t), USB_HostMsdUfiCallback, NULL); + if (status != kStatus_USB_Success) + { + fatfs_code = RES_ERROR; + } + else + { + if (pdTRUE != xSemaphoreTake(s_CommandSemaphore, portMAX_DELAY)) /* wait the command */ + { + return RES_ERROR; + } + if (ufiStatus == kStatus_USB_Success) + { + fatfs_code = RES_OK; + } + else + { + fatfs_code = RES_NOTRDY; + } + } + + if (fatfs_code == RES_OK) + { + if (GET_SECTOR_COUNT == cmd) /* Get number of sectors on the disk (DWORD) */ + { + address = (uint32_t)&s_UsbTransferBuffer[0]; + address = (uint32_t)((usb_host_ufi_read_capacity_t *)(address))->lastLogicalBlockAddress; + value = USB_LONG_FROM_BIG_ENDIAN_ADDRESS(((uint8_t *)address)); + ((uint8_t *)buff)[0] = ((uint8_t*)&value)[0]; + ((uint8_t *)buff)[1] = ((uint8_t*)&value)[1]; + ((uint8_t *)buff)[2] = ((uint8_t*)&value)[2]; + ((uint8_t *)buff)[3] = ((uint8_t*)&value)[3]; + } + else /* Get the sector size in byte */ + { + address = (uint32_t)&s_UsbTransferBuffer[0]; + address = (uint32_t)((usb_host_ufi_read_capacity_t *)(address))->blockLengthInBytes; + value = USB_LONG_FROM_BIG_ENDIAN_ADDRESS(((uint8_t *)address)); + ((uint8_t *)buff)[0] = ((uint8_t*)&value)[0]; + ((uint8_t *)buff)[1] = ((uint8_t*)&value)[1]; + ((uint8_t *)buff)[2] = ((uint8_t*)&value)[2]; + ((uint8_t *)buff)[3] = ((uint8_t*)&value)[3]; + } + } + break; + + case GET_BLOCK_SIZE: + if (!buff) + { + return RES_ERROR; + } + *(uint32_t *)buff = 0; + fatfs_code = RES_OK; + break; + + case CTRL_SYNC: + fatfs_code = RES_OK; + break; + + default: + fatfs_code = RES_PARERR; + break; + } + return fatfs_code; +} +#endif /* USB_DISK_ENABLE */ + +#endif /* McuLib_CONFIG_USE_FAT_FS */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/FreeRTOS_license.txt b/TSM_PicoW_Sensor/McuLib/FreeRTOS/FreeRTOS_license.txt new file mode 100644 index 0000000..2d78421 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/FreeRTOS_license.txt @@ -0,0 +1,38 @@ +The FreeRTOS kernel is released under the MIT open source license, the text of +which is provided below. + +This license covers the FreeRTOS kernel source files, which are located in the +/FreeRTOS/Source directory of the official FreeRTOS kernel download. It also +covers most of the source files in the demo application projects, which are +located in the /FreeRTOS/Demo directory of the official FreeRTOS download. The +demo projects may also include third party software that is not part of FreeRTOS +and is licensed separately to FreeRTOS. Examples of third party software +includes header files provided by chip or tools vendors, linker scripts, +peripheral drivers, etc. All the software in subdirectories of the /FreeRTOS +directory is either open source or distributed with permission, and is free for +use. For the avoidance of doubt, refer to the comments at the top of each +source file. + + +License text: +------------- + +Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/FreeRTOShooks.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/FreeRTOShooks.c new file mode 100644 index 0000000..3763c78 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/FreeRTOShooks.c @@ -0,0 +1,170 @@ +/* + * FreeRTOShooks.c + * + * Copyright (c) 2019, 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This is a default FreeRTOS hooks file you can use in your application. + */ + +#include "McuLibconfig.h" +#include "FreeRTOS.h" +#include "task.h" +/* +** =================================================================== +** Event : McuRTOS_vApplicationStackOverflowHook (module Events) +** +** Component : McuRTOS [McuRTOS] +** Description : +** if enabled, this hook will be called in case of a stack +** overflow. +** Parameters : +** NAME - DESCRIPTION +** pxTask - Task handle +** * pcTaskName - Pointer to task name +** Returns : Nothing +** =================================================================== +*/ +void McuRTOS_vApplicationStackOverflowHook(TaskHandle_t pxTask, char *pcTaskName) +{ + /* This will get called if a stack overflow is detected during the context + switch. Set configCHECK_FOR_STACK_OVERFLOWS to 2 to also check for stack + problems within nested interrupts, but only do this for debug purposes as + it will increase the context switch time. */ + (void)pxTask; + (void)pcTaskName; + taskDISABLE_INTERRUPTS(); + /* Write your code here ... */ +#if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M + __asm volatile("bkpt #0"); +#elif McuLib_CONFIG_CPU_IS_RISC_V + __asm volatile( "ebreak" ); +#endif + for(;;) {} +} + +/* +** =================================================================== +** Event : McuRTOS_vApplicationMallocFailedHook (module Events) +** +** Component : McuRTOS [McuRTOS] +** Description : +** If enabled, the McuRTOS will call this hook in case memory +** allocation failed. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuRTOS_vApplicationMallocFailedHook(void) +{ + /* Called if a call to pvPortMalloc() fails because there is insufficient + free memory available in the McuRTOS heap. pvPortMalloc() is called + internally by McuRTOS API functions that create tasks, queues, software + timers, and semaphores. The size of the McuRTOS heap is set by the + configTOTAL_HEAP_SIZE configuration constant in FreeRTOSConfig.h. */ + taskDISABLE_INTERRUPTS(); + /* Write your code here ... */ +#if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M + __asm volatile("bkpt #0"); +#elif McuLib_CONFIG_CPU_IS_RISC_V + __asm volatile( "ebreak" ); +#endif + for(;;) {} +} + +/* +** =================================================================== +** Event : McuRTOS_vApplicationTickHook (module Events) +** +** Component : McuRTOS [FreeRTOS] +** Description : +** If enabled, this hook will be called by the RTOS for every +** tick increment. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuRTOS_vApplicationTickHook(void) +{ + /* Hook called for every RTOS tick. */ +} + +/* +** =================================================================== +** Event : McuRTOS_vApplicationIdleHook (module Events) +** +** Component : McuRTOS [FreeRTOS] +** Description : +** If enabled, this hook will be called when the RTOS is idle. +** This might be a good place to go into low power mode. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuRTOS_vApplicationIdleHook(void) +{ + /* Called whenever the RTOS is idle (from the IDLE task). + Here would be a good place to put the CPU into low power mode. */ + /* Write your code here ... */ +} + + +/* +** =================================================================== +** Description : +** Used in tickless idle mode only, but required in this mode. +** Hook for the application to enter low power mode. +** Parameters : +** NAME - DESCRIPTION +** expectedIdleTicks - expected idle +** time, in ticks +** Returns : Nothing +** =================================================================== +*/ +void McuRTOS_vOnPreSleepProcessing(TickType_t expectedIdleTicks) +{ + (void)expectedIdleTicks; /* not used */ +#if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M + /* example for ARM Cortex-M (enable SetOperationMode() in CPU component): */ + /* Cpu_SetOperationMode(DOM_WAIT, NULL, NULL); */ /* Processor Expert way to get into WAIT mode */ + /* or to wait for interrupt: */ + __asm volatile("dsb"); + __asm volatile("wfi"); + __asm volatile("isb"); +#elif McuLib_CONFIG_CPU_IS_RISC_V + #warning "NYI" +#elif 0 + /* example for S08/S12/ColdFire V1 (enable SetWaitMode() in CPU): */ + Cpu_SetWaitMode(); +#elif 0 + /* example for ColdFire V2: */ + __asm("stop #0x2000"); */ +#else + #error "you *must* enter low power mode (wait for interrupt) here!" +#endif + /* Write your code here ... */ +} + +/* +** =================================================================== +** Description : +** Event called after the CPU woke up after low power mode. +** This event is optional. +** Parameters : +** NAME - DESCRIPTION +** expectedIdleTicks - expected idle +** time, in ticks +** Returns : Nothing +** =================================================================== +*/ +void McuRTOS_vOnPostSleepProcessing(TickType_t expectedIdleTicks) +{ + (void)expectedIdleTicks; /* not used (yet?) */ + /* Write your code here ... */ +} + +#if configENABLE_HEAP_PROTECTOR +void vApplicationGetRandomHeapCanary( portPOINTER_SIZE_TYPE *pxHeapCanary) { + *pxHeapCanary = 0xdeadcaab; +} +#endif diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/FreeRTOS_license.txt b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/FreeRTOS_license.txt new file mode 100644 index 0000000..9bcf6b9 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/FreeRTOS_license.txt @@ -0,0 +1,20 @@ +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/croutine.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/croutine.c new file mode 100644 index 0000000..c6bbc96 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/croutine.c @@ -0,0 +1,383 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include "FreeRTOS.h" +#include "task.h" +#include "croutine.h" + +/* Remove the whole file is co-routines are not being used. */ +#if ( configUSE_CO_ROUTINES != 0 ) + +/* + * Some kernel aware debuggers require data to be viewed to be global, rather + * than file scope. + */ + #ifdef portREMOVE_STATIC_QUALIFIER + #define static + #endif + + +/* Lists for ready and blocked co-routines. --------------------*/ + static List_t pxReadyCoRoutineLists[ configMAX_CO_ROUTINE_PRIORITIES ]; /**< Prioritised ready co-routines. */ + static List_t xDelayedCoRoutineList1; /**< Delayed co-routines. */ + static List_t xDelayedCoRoutineList2; /**< Delayed co-routines (two lists are used - one for delays that have overflowed the current tick count. */ + static List_t * pxDelayedCoRoutineList = NULL; /**< Points to the delayed co-routine list currently being used. */ + static List_t * pxOverflowDelayedCoRoutineList = NULL; /**< Points to the delayed co-routine list currently being used to hold co-routines that have overflowed the current tick count. */ + static List_t xPendingReadyCoRoutineList; /**< Holds co-routines that have been readied by an external event. They cannot be added directly to the ready lists as the ready lists cannot be accessed by interrupts. */ + +/* Other file private variables. --------------------------------*/ + CRCB_t * pxCurrentCoRoutine = NULL; + static UBaseType_t uxTopCoRoutineReadyPriority = 0; + static TickType_t xCoRoutineTickCount = 0, xLastTickCount = 0, xPassedTicks = 0; + +/* The initial state of the co-routine when it is created. */ + #define corINITIAL_STATE ( 0 ) + +/* + * Place the co-routine represented by pxCRCB into the appropriate ready queue + * for the priority. It is inserted at the end of the list. + * + * This macro accesses the co-routine ready lists and therefore must not be + * used from within an ISR. + */ + #define prvAddCoRoutineToReadyQueue( pxCRCB ) \ + do { \ + if( ( pxCRCB )->uxPriority > uxTopCoRoutineReadyPriority ) \ + { \ + uxTopCoRoutineReadyPriority = ( pxCRCB )->uxPriority; \ + } \ + vListInsertEnd( ( List_t * ) &( pxReadyCoRoutineLists[ ( pxCRCB )->uxPriority ] ), &( ( pxCRCB )->xGenericListItem ) ); \ + } while( 0 ) + +/* + * Utility to ready all the lists used by the scheduler. This is called + * automatically upon the creation of the first co-routine. + */ + static void prvInitialiseCoRoutineLists( void ); + +/* + * Co-routines that are readied by an interrupt cannot be placed directly into + * the ready lists (there is no mutual exclusion). Instead they are placed in + * in the pending ready list in order that they can later be moved to the ready + * list by the co-routine scheduler. + */ + static void prvCheckPendingReadyList( void ); + +/* + * Macro that looks at the list of co-routines that are currently delayed to + * see if any require waking. + * + * Co-routines are stored in the queue in the order of their wake time - + * meaning once one co-routine has been found whose timer has not expired + * we need not look any further down the list. + */ + static void prvCheckDelayedList( void ); + +/*-----------------------------------------------------------*/ + + BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, + UBaseType_t uxPriority, + UBaseType_t uxIndex ) + { + BaseType_t xReturn; + CRCB_t * pxCoRoutine; + + traceENTER_xCoRoutineCreate( pxCoRoutineCode, uxPriority, uxIndex ); + + /* Allocate the memory that will store the co-routine control block. */ + /* MISRA Ref 11.5.1 [Malloc memory assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + pxCoRoutine = ( CRCB_t * ) pvPortMalloc( sizeof( CRCB_t ) ); + + if( pxCoRoutine ) + { + /* If pxCurrentCoRoutine is NULL then this is the first co-routine to + * be created and the co-routine data structures need initialising. */ + if( pxCurrentCoRoutine == NULL ) + { + pxCurrentCoRoutine = pxCoRoutine; + prvInitialiseCoRoutineLists(); + } + + /* Check the priority is within limits. */ + if( uxPriority >= configMAX_CO_ROUTINE_PRIORITIES ) + { + uxPriority = configMAX_CO_ROUTINE_PRIORITIES - 1; + } + + /* Fill out the co-routine control block from the function parameters. */ + pxCoRoutine->uxState = corINITIAL_STATE; + pxCoRoutine->uxPriority = uxPriority; + pxCoRoutine->uxIndex = uxIndex; + pxCoRoutine->pxCoRoutineFunction = pxCoRoutineCode; + + /* Initialise all the other co-routine control block parameters. */ + vListInitialiseItem( &( pxCoRoutine->xGenericListItem ) ); + vListInitialiseItem( &( pxCoRoutine->xEventListItem ) ); + + /* Set the co-routine control block as a link back from the ListItem_t. + * This is so we can get back to the containing CRCB from a generic item + * in a list. */ + listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xGenericListItem ), pxCoRoutine ); + listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xEventListItem ), pxCoRoutine ); + + /* Event lists are always in priority order. */ + listSET_LIST_ITEM_VALUE( &( pxCoRoutine->xEventListItem ), ( ( TickType_t ) configMAX_CO_ROUTINE_PRIORITIES - ( TickType_t ) uxPriority ) ); + + /* Now the co-routine has been initialised it can be added to the ready + * list at the correct priority. */ + prvAddCoRoutineToReadyQueue( pxCoRoutine ); + + xReturn = pdPASS; + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + } + + traceRETURN_xCoRoutineCreate( xReturn ); + + return xReturn; + } +/*-----------------------------------------------------------*/ + + void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, + List_t * pxEventList ) + { + TickType_t xTimeToWake; + + traceENTER_vCoRoutineAddToDelayedList( xTicksToDelay, pxEventList ); + + /* Calculate the time to wake - this may overflow but this is + * not a problem. */ + xTimeToWake = xCoRoutineTickCount + xTicksToDelay; + + /* We must remove ourselves from the ready list before adding + * ourselves to the blocked list as the same list item is used for + * both lists. */ + ( void ) uxListRemove( ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentCoRoutine->xGenericListItem ), xTimeToWake ); + + if( xTimeToWake < xCoRoutineTickCount ) + { + /* Wake time has overflowed. Place this item in the + * overflow list. */ + vListInsert( ( List_t * ) pxOverflowDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + } + else + { + /* The wake time has not overflowed, so we can use the + * current block list. */ + vListInsert( ( List_t * ) pxDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + } + + if( pxEventList ) + { + /* Also add the co-routine to an event list. If this is done then the + * function must be called with interrupts disabled. */ + vListInsert( pxEventList, &( pxCurrentCoRoutine->xEventListItem ) ); + } + + traceRETURN_vCoRoutineAddToDelayedList(); + } +/*-----------------------------------------------------------*/ + + static void prvCheckPendingReadyList( void ) + { + /* Are there any co-routines waiting to get moved to the ready list? These + * are co-routines that have been readied by an ISR. The ISR cannot access + * the ready lists itself. */ + while( listLIST_IS_EMPTY( &xPendingReadyCoRoutineList ) == pdFALSE ) + { + CRCB_t * pxUnblockedCRCB; + + /* The pending ready list can be accessed by an ISR. */ + portDISABLE_INTERRUPTS(); + { + pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyCoRoutineList ) ); + ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); + } + portENABLE_INTERRUPTS(); + + ( void ) uxListRemove( &( pxUnblockedCRCB->xGenericListItem ) ); + prvAddCoRoutineToReadyQueue( pxUnblockedCRCB ); + } + } +/*-----------------------------------------------------------*/ + + static void prvCheckDelayedList( void ) + { + CRCB_t * pxCRCB; + + xPassedTicks = xTaskGetTickCount() - xLastTickCount; + + while( xPassedTicks ) + { + xCoRoutineTickCount++; + xPassedTicks--; + + /* If the tick count has overflowed we need to swap the ready lists. */ + if( xCoRoutineTickCount == 0 ) + { + List_t * pxTemp; + + /* Tick count has overflowed so we need to swap the delay lists. If there are + * any items in pxDelayedCoRoutineList here then there is an error! */ + pxTemp = pxDelayedCoRoutineList; + pxDelayedCoRoutineList = pxOverflowDelayedCoRoutineList; + pxOverflowDelayedCoRoutineList = pxTemp; + } + + /* See if this tick has made a timeout expire. */ + while( listLIST_IS_EMPTY( pxDelayedCoRoutineList ) == pdFALSE ) + { + pxCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedCoRoutineList ); + + if( xCoRoutineTickCount < listGET_LIST_ITEM_VALUE( &( pxCRCB->xGenericListItem ) ) ) + { + /* Timeout not yet expired. */ + break; + } + + portDISABLE_INTERRUPTS(); + { + /* The event could have occurred just before this critical + * section. If this is the case then the generic list item will + * have been moved to the pending ready list and the following + * line is still valid. Also the pvContainer parameter will have + * been set to NULL so the following lines are also valid. */ + ( void ) uxListRemove( &( pxCRCB->xGenericListItem ) ); + + /* Is the co-routine waiting on an event also? */ + if( pxCRCB->xEventListItem.pxContainer ) + { + ( void ) uxListRemove( &( pxCRCB->xEventListItem ) ); + } + } + portENABLE_INTERRUPTS(); + + prvAddCoRoutineToReadyQueue( pxCRCB ); + } + } + + xLastTickCount = xCoRoutineTickCount; + } +/*-----------------------------------------------------------*/ + + void vCoRoutineSchedule( void ) + { + traceENTER_vCoRoutineSchedule(); + + /* Only run a co-routine after prvInitialiseCoRoutineLists() has been + * called. prvInitialiseCoRoutineLists() is called automatically when a + * co-routine is created. */ + if( pxDelayedCoRoutineList != NULL ) + { + /* See if any co-routines readied by events need moving to the ready lists. */ + prvCheckPendingReadyList(); + + /* See if any delayed co-routines have timed out. */ + prvCheckDelayedList(); + + /* Find the highest priority queue that contains ready co-routines. */ + while( listLIST_IS_EMPTY( &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ) ) + { + if( uxTopCoRoutineReadyPriority == 0 ) + { + /* No more co-routines to check. */ + return; + } + + --uxTopCoRoutineReadyPriority; + } + + /* listGET_OWNER_OF_NEXT_ENTRY walks through the list, so the co-routines + * of the same priority get an equal share of the processor time. */ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentCoRoutine, &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ); + + /* Call the co-routine. */ + ( pxCurrentCoRoutine->pxCoRoutineFunction )( pxCurrentCoRoutine, pxCurrentCoRoutine->uxIndex ); + } + + traceRETURN_vCoRoutineSchedule(); + } +/*-----------------------------------------------------------*/ + + static void prvInitialiseCoRoutineLists( void ) + { + UBaseType_t uxPriority; + + for( uxPriority = 0; uxPriority < configMAX_CO_ROUTINE_PRIORITIES; uxPriority++ ) + { + vListInitialise( ( List_t * ) &( pxReadyCoRoutineLists[ uxPriority ] ) ); + } + + vListInitialise( ( List_t * ) &xDelayedCoRoutineList1 ); + vListInitialise( ( List_t * ) &xDelayedCoRoutineList2 ); + vListInitialise( ( List_t * ) &xPendingReadyCoRoutineList ); + + /* Start with pxDelayedCoRoutineList using list1 and the + * pxOverflowDelayedCoRoutineList using list2. */ + pxDelayedCoRoutineList = &xDelayedCoRoutineList1; + pxOverflowDelayedCoRoutineList = &xDelayedCoRoutineList2; + } +/*-----------------------------------------------------------*/ + + BaseType_t xCoRoutineRemoveFromEventList( const List_t * pxEventList ) + { + CRCB_t * pxUnblockedCRCB; + BaseType_t xReturn; + + traceENTER_xCoRoutineRemoveFromEventList( pxEventList ); + + /* This function is called from within an interrupt. It can only access + * event lists and the pending ready list. This function assumes that a + * check has already been made to ensure pxEventList is not empty. */ + pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); + ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); + vListInsertEnd( ( List_t * ) &( xPendingReadyCoRoutineList ), &( pxUnblockedCRCB->xEventListItem ) ); + + if( pxUnblockedCRCB->uxPriority >= pxCurrentCoRoutine->uxPriority ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + traceRETURN_xCoRoutineRemoveFromEventList( xReturn ); + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES == 0 */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/event_groups.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/event_groups.c new file mode 100644 index 0000000..26f0c55 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/event_groups.c @@ -0,0 +1,871 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "timers.h" +#include "event_groups.h" + +/* The MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined + * for the header files above, but not in this file, in order to generate the + * correct privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +typedef struct EventGroupDef_t +{ + EventBits_t uxEventBits; + List_t xTasksWaitingForBits; /**< List of tasks waiting for a bit to be set. */ + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxEventGroupNumber; + #endif + + #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucStaticallyAllocated; /**< Set to pdTRUE if the event group is statically allocated to ensure no attempt is made to free the memory. */ + #endif +} EventGroup_t; + +/*-----------------------------------------------------------*/ + +/* + * Test the bits set in uxCurrentEventBits to see if the wait condition is met. + * The wait condition is defined by xWaitForAllBits. If xWaitForAllBits is + * pdTRUE then the wait condition is met if all the bits set in uxBitsToWaitFor + * are also set in uxCurrentEventBits. If xWaitForAllBits is pdFALSE then the + * wait condition is met if any of the bits set in uxBitsToWait for are also set + * in uxCurrentEventBits. + */ +static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, + const EventBits_t uxBitsToWaitFor, + const BaseType_t xWaitForAllBits ) PRIVILEGED_FUNCTION; + +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + + EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer ) + { + EventGroup_t * pxEventBits; + + traceENTER_xEventGroupCreateStatic( pxEventGroupBuffer ); + + /* A StaticEventGroup_t object must be provided. */ + configASSERT( pxEventGroupBuffer ); + + #if ( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + * variable of type StaticEventGroup_t equals the size of the real + * event group structure. */ + volatile size_t xSize = sizeof( StaticEventGroup_t ); + configASSERT( xSize == sizeof( EventGroup_t ) ); + } + #endif /* configASSERT_DEFINED */ + + /* The user has provided a statically allocated event group - use it. */ + /* MISRA Ref 11.3.1 [Misaligned access] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */ + /* coverity[misra_c_2012_rule_11_3_violation] */ + pxEventBits = ( EventGroup_t * ) pxEventGroupBuffer; + + if( pxEventBits != NULL ) + { + pxEventBits->uxEventBits = 0; + vListInitialise( &( pxEventBits->xTasksWaitingForBits ) ); + + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* Both static and dynamic allocation can be used, so note that + * this event group was created statically in case the event group + * is later deleted. */ + pxEventBits->ucStaticallyAllocated = pdTRUE; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + + traceEVENT_GROUP_CREATE( pxEventBits ); + } + else + { + /* xEventGroupCreateStatic should only ever be called with + * pxEventGroupBuffer pointing to a pre-allocated (compile time + * allocated) StaticEventGroup_t variable. */ + traceEVENT_GROUP_CREATE_FAILED(); + } + + traceRETURN_xEventGroupCreateStatic( pxEventBits ); + + return pxEventBits; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + EventGroupHandle_t xEventGroupCreate( void ) + { + EventGroup_t * pxEventBits; + + traceENTER_xEventGroupCreate(); + + /* MISRA Ref 11.5.1 [Malloc memory assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) ); + + if( pxEventBits != NULL ) + { + pxEventBits->uxEventBits = 0; + vListInitialise( &( pxEventBits->xTasksWaitingForBits ) ); + + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* Both static and dynamic allocation can be used, so note this + * event group was allocated statically in case the event group is + * later deleted. */ + pxEventBits->ucStaticallyAllocated = pdFALSE; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + + traceEVENT_GROUP_CREATE( pxEventBits ); + } + else + { + traceEVENT_GROUP_CREATE_FAILED(); + } + + traceRETURN_xEventGroupCreate( pxEventBits ); + + return pxEventBits; + } + +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet, + const EventBits_t uxBitsToWaitFor, + TickType_t xTicksToWait ) +{ + EventBits_t uxOriginalBitValue, uxReturn; + EventGroup_t * pxEventBits = xEventGroup; + BaseType_t xAlreadyYielded; + BaseType_t xTimeoutOccurred = pdFALSE; + + traceENTER_xEventGroupSync( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTicksToWait ); + + configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + configASSERT( uxBitsToWaitFor != 0 ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + vTaskSuspendAll(); + { + uxOriginalBitValue = pxEventBits->uxEventBits; + + ( void ) xEventGroupSetBits( xEventGroup, uxBitsToSet ); + + if( ( ( uxOriginalBitValue | uxBitsToSet ) & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + /* All the rendezvous bits are now set - no need to block. */ + uxReturn = ( uxOriginalBitValue | uxBitsToSet ); + + /* Rendezvous always clear the bits. They will have been cleared + * already unless this is the only task in the rendezvous. */ + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + + xTicksToWait = 0; + } + else + { + if( xTicksToWait != ( TickType_t ) 0 ) + { + traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor ); + + /* Store the bits that the calling task is waiting for in the + * task's event list item so the kernel knows when a match is + * found. Then enter the blocked state. */ + vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | eventCLEAR_EVENTS_ON_EXIT_BIT | eventWAIT_FOR_ALL_BITS ), xTicksToWait ); + + /* This assignment is obsolete as uxReturn will get set after + * the task unblocks, but some compilers mistakenly generate a + * warning about uxReturn being returned without being set if the + * assignment is omitted. */ + uxReturn = 0; + } + else + { + /* The rendezvous bits were not set, but no block time was + * specified - just return the current event bit value. */ + uxReturn = pxEventBits->uxEventBits; + xTimeoutOccurred = pdTRUE; + } + } + } + xAlreadyYielded = xTaskResumeAll(); + + if( xTicksToWait != ( TickType_t ) 0 ) + { + if( xAlreadyYielded == pdFALSE ) + { + taskYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The task blocked to wait for its required bits to be set - at this + * point either the required bits were set or the block time expired. If + * the required bits were set they will have been stored in the task's + * event list item, and they should now be retrieved then cleared. */ + uxReturn = uxTaskResetEventItemValue(); + + if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 ) + { + /* The task timed out, just return the current event bit value. */ + taskENTER_CRITICAL(); + { + uxReturn = pxEventBits->uxEventBits; + + /* Although the task got here because it timed out before the + * bits it was waiting for were set, it is possible that since it + * unblocked another task has set the bits. If this is the case + * then it needs to clear the bits before exiting. */ + if( ( uxReturn & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + xTimeoutOccurred = pdTRUE; + } + else + { + /* The task unblocked because the bits were set. */ + } + + /* Control bits might be set as the task had blocked should not be + * returned. */ + uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES; + } + + traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred ); + + /* Prevent compiler warnings when trace macros are not used. */ + ( void ) xTimeoutOccurred; + + traceRETURN_xEventGroupSync( uxReturn ); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToWaitFor, + const BaseType_t xClearOnExit, + const BaseType_t xWaitForAllBits, + TickType_t xTicksToWait ) +{ + EventGroup_t * pxEventBits = xEventGroup; + EventBits_t uxReturn, uxControlBits = 0; + BaseType_t xWaitConditionMet, xAlreadyYielded; + BaseType_t xTimeoutOccurred = pdFALSE; + + traceENTER_xEventGroupWaitBits( xEventGroup, uxBitsToWaitFor, xClearOnExit, xWaitForAllBits, xTicksToWait ); + + /* Check the user is not attempting to wait on the bits used by the kernel + * itself, and that at least one bit is being requested. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + configASSERT( uxBitsToWaitFor != 0 ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + vTaskSuspendAll(); + { + const EventBits_t uxCurrentEventBits = pxEventBits->uxEventBits; + + /* Check to see if the wait condition is already met or not. */ + xWaitConditionMet = prvTestWaitCondition( uxCurrentEventBits, uxBitsToWaitFor, xWaitForAllBits ); + + if( xWaitConditionMet != pdFALSE ) + { + /* The wait condition has already been met so there is no need to + * block. */ + uxReturn = uxCurrentEventBits; + xTicksToWait = ( TickType_t ) 0; + + /* Clear the wait bits if requested to do so. */ + if( xClearOnExit != pdFALSE ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The wait condition has not been met, but no block time was + * specified, so just return the current value. */ + uxReturn = uxCurrentEventBits; + xTimeoutOccurred = pdTRUE; + } + else + { + /* The task is going to block to wait for its required bits to be + * set. uxControlBits are used to remember the specified behaviour of + * this call to xEventGroupWaitBits() - for use when the event bits + * unblock the task. */ + if( xClearOnExit != pdFALSE ) + { + uxControlBits |= eventCLEAR_EVENTS_ON_EXIT_BIT; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xWaitForAllBits != pdFALSE ) + { + uxControlBits |= eventWAIT_FOR_ALL_BITS; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Store the bits that the calling task is waiting for in the + * task's event list item so the kernel knows when a match is + * found. Then enter the blocked state. */ + vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | uxControlBits ), xTicksToWait ); + + /* This is obsolete as it will get set after the task unblocks, but + * some compilers mistakenly generate a warning about the variable + * being returned without being set if it is not done. */ + uxReturn = 0; + + traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor ); + } + } + xAlreadyYielded = xTaskResumeAll(); + + if( xTicksToWait != ( TickType_t ) 0 ) + { + if( xAlreadyYielded == pdFALSE ) + { + taskYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The task blocked to wait for its required bits to be set - at this + * point either the required bits were set or the block time expired. If + * the required bits were set they will have been stored in the task's + * event list item, and they should now be retrieved then cleared. */ + uxReturn = uxTaskResetEventItemValue(); + + if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 ) + { + taskENTER_CRITICAL(); + { + /* The task timed out, just return the current event bit value. */ + uxReturn = pxEventBits->uxEventBits; + + /* It is possible that the event bits were updated between this + * task leaving the Blocked state and running again. */ + if( prvTestWaitCondition( uxReturn, uxBitsToWaitFor, xWaitForAllBits ) != pdFALSE ) + { + if( xClearOnExit != pdFALSE ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xTimeoutOccurred = pdTRUE; + } + taskEXIT_CRITICAL(); + } + else + { + /* The task unblocked because the bits were set. */ + } + + /* The task blocked so control bits may have been set. */ + uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES; + } + + traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred ); + + /* Prevent compiler warnings when trace macros are not used. */ + ( void ) xTimeoutOccurred; + + traceRETURN_xEventGroupWaitBits( uxReturn ); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToClear ) +{ + EventGroup_t * pxEventBits = xEventGroup; + EventBits_t uxReturn; + + traceENTER_xEventGroupClearBits( xEventGroup, uxBitsToClear ); + + /* Check the user is not attempting to clear the bits used by the kernel + * itself. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToClear & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + + taskENTER_CRITICAL(); + { + traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear ); + + /* The value returned is the event group value prior to the bits being + * cleared. */ + uxReturn = pxEventBits->uxEventBits; + + /* Clear the bits. */ + pxEventBits->uxEventBits &= ~uxBitsToClear; + } + taskEXIT_CRITICAL(); + + traceRETURN_xEventGroupClearBits( uxReturn ); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) + + BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToClear ) + { + BaseType_t xReturn; + + traceENTER_xEventGroupClearBitsFromISR( xEventGroup, uxBitsToClear ); + + traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ); + xReturn = xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ); + + traceRETURN_xEventGroupClearBitsFromISR( xReturn ); + + return xReturn; + } + +#endif /* if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) */ +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) +{ + UBaseType_t uxSavedInterruptStatus; + EventGroup_t const * const pxEventBits = xEventGroup; + EventBits_t uxReturn; + + traceENTER_xEventGroupGetBitsFromISR( xEventGroup ); + + uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR(); + { + uxReturn = pxEventBits->uxEventBits; + } + taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus ); + + traceRETURN_xEventGroupGetBitsFromISR( uxReturn ); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet ) +{ + ListItem_t * pxListItem; + ListItem_t * pxNext; + ListItem_t const * pxListEnd; + List_t const * pxList; + EventBits_t uxBitsToClear = 0, uxBitsWaitedFor, uxControlBits; + EventGroup_t * pxEventBits = xEventGroup; + BaseType_t xMatchFound = pdFALSE; + + traceENTER_xEventGroupSetBits( xEventGroup, uxBitsToSet ); + + /* Check the user is not attempting to set the bits used by the kernel + * itself. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + + pxList = &( pxEventBits->xTasksWaitingForBits ); + pxListEnd = listGET_END_MARKER( pxList ); + vTaskSuspendAll(); + { + traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ); + + pxListItem = listGET_HEAD_ENTRY( pxList ); + + /* Set the bits. */ + pxEventBits->uxEventBits |= uxBitsToSet; + + /* See if the new bit value should unblock any tasks. */ + while( pxListItem != pxListEnd ) + { + pxNext = listGET_NEXT( pxListItem ); + uxBitsWaitedFor = listGET_LIST_ITEM_VALUE( pxListItem ); + xMatchFound = pdFALSE; + + /* Split the bits waited for from the control bits. */ + uxControlBits = uxBitsWaitedFor & eventEVENT_BITS_CONTROL_BYTES; + uxBitsWaitedFor &= ~eventEVENT_BITS_CONTROL_BYTES; + + if( ( uxControlBits & eventWAIT_FOR_ALL_BITS ) == ( EventBits_t ) 0 ) + { + /* Just looking for single bit being set. */ + if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) != ( EventBits_t ) 0 ) + { + xMatchFound = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) == uxBitsWaitedFor ) + { + /* All bits are set. */ + xMatchFound = pdTRUE; + } + else + { + /* Need all bits to be set, but not all the bits were set. */ + } + + if( xMatchFound != pdFALSE ) + { + /* The bits match. Should the bits be cleared on exit? */ + if( ( uxControlBits & eventCLEAR_EVENTS_ON_EXIT_BIT ) != ( EventBits_t ) 0 ) + { + uxBitsToClear |= uxBitsWaitedFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Store the actual event flag value in the task's event list + * item before removing the task from the event list. The + * eventUNBLOCKED_DUE_TO_BIT_SET bit is set so the task knows + * that is was unblocked due to its required bits matching, rather + * than because it timed out. */ + vTaskRemoveFromUnorderedEventList( pxListItem, pxEventBits->uxEventBits | eventUNBLOCKED_DUE_TO_BIT_SET ); + } + + /* Move onto the next list item. Note pxListItem->pxNext is not + * used here as the list item may have been removed from the event list + * and inserted into the ready/pending reading list. */ + pxListItem = pxNext; + } + + /* Clear any bits that matched when the eventCLEAR_EVENTS_ON_EXIT_BIT + * bit was set in the control word. */ + pxEventBits->uxEventBits &= ~uxBitsToClear; + } + ( void ) xTaskResumeAll(); + + traceRETURN_xEventGroupSetBits( pxEventBits->uxEventBits ); + + return pxEventBits->uxEventBits; +} +/*-----------------------------------------------------------*/ + +void vEventGroupDelete( EventGroupHandle_t xEventGroup ) +{ + EventGroup_t * pxEventBits = xEventGroup; + const List_t * pxTasksWaitingForBits; + + traceENTER_vEventGroupDelete( xEventGroup ); + + configASSERT( pxEventBits ); + + pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits ); + + vTaskSuspendAll(); + { + traceEVENT_GROUP_DELETE( xEventGroup ); + + while( listCURRENT_LIST_LENGTH( pxTasksWaitingForBits ) > ( UBaseType_t ) 0 ) + { + /* Unblock the task, returning 0 as the event list is being deleted + * and cannot therefore have any bits set. */ + configASSERT( pxTasksWaitingForBits->xListEnd.pxNext != ( const ListItem_t * ) &( pxTasksWaitingForBits->xListEnd ) ); + vTaskRemoveFromUnorderedEventList( pxTasksWaitingForBits->xListEnd.pxNext, eventUNBLOCKED_DUE_TO_BIT_SET ); + } + } + ( void ) xTaskResumeAll(); + + #if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) + { + /* The event group can only have been allocated dynamically - free + * it again. */ + vPortFree( pxEventBits ); + } + #elif ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + { + /* The event group could have been allocated statically or + * dynamically, so check before attempting to free the memory. */ + if( pxEventBits->ucStaticallyAllocated == ( uint8_t ) pdFALSE ) + { + vPortFree( pxEventBits ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + + traceRETURN_vEventGroupDelete(); +} +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + BaseType_t xEventGroupGetStaticBuffer( EventGroupHandle_t xEventGroup, + StaticEventGroup_t ** ppxEventGroupBuffer ) + { + BaseType_t xReturn; + EventGroup_t * pxEventBits = xEventGroup; + + traceENTER_xEventGroupGetStaticBuffer( xEventGroup, ppxEventGroupBuffer ); + + configASSERT( pxEventBits ); + configASSERT( ppxEventGroupBuffer ); + + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* Check if the event group was statically allocated. */ + if( pxEventBits->ucStaticallyAllocated == ( uint8_t ) pdTRUE ) + { + /* MISRA Ref 11.3.1 [Misaligned access] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */ + /* coverity[misra_c_2012_rule_11_3_violation] */ + *ppxEventGroupBuffer = ( StaticEventGroup_t * ) pxEventBits; + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + #else /* configSUPPORT_DYNAMIC_ALLOCATION */ + { + /* Event group must have been statically allocated. */ + /* MISRA Ref 11.3.1 [Misaligned access] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */ + /* coverity[misra_c_2012_rule_11_3_violation] */ + *ppxEventGroupBuffer = ( StaticEventGroup_t * ) pxEventBits; + xReturn = pdTRUE; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + + traceRETURN_xEventGroupGetStaticBuffer( xReturn ); + + return xReturn; + } +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +/* For internal use only - execute a 'set bits' command that was pended from + * an interrupt. */ +void vEventGroupSetBitsCallback( void * pvEventGroup, + uint32_t ulBitsToSet ) +{ + traceENTER_vEventGroupSetBitsCallback( pvEventGroup, ulBitsToSet ); + + /* MISRA Ref 11.5.4 [Callback function parameter] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + ( void ) xEventGroupSetBits( pvEventGroup, ( EventBits_t ) ulBitsToSet ); + + traceRETURN_vEventGroupSetBitsCallback(); +} +/*-----------------------------------------------------------*/ + +/* For internal use only - execute a 'clear bits' command that was pended from + * an interrupt. */ +void vEventGroupClearBitsCallback( void * pvEventGroup, + uint32_t ulBitsToClear ) +{ + traceENTER_vEventGroupClearBitsCallback( pvEventGroup, ulBitsToClear ); + + /* MISRA Ref 11.5.4 [Callback function parameter] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + ( void ) xEventGroupClearBits( pvEventGroup, ( EventBits_t ) ulBitsToClear ); + + traceRETURN_vEventGroupClearBitsCallback(); +} +/*-----------------------------------------------------------*/ + +static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, + const EventBits_t uxBitsToWaitFor, + const BaseType_t xWaitForAllBits ) +{ + BaseType_t xWaitConditionMet = pdFALSE; + + if( xWaitForAllBits == pdFALSE ) + { + /* Task only has to wait for one bit within uxBitsToWaitFor to be + * set. Is one already set? */ + if( ( uxCurrentEventBits & uxBitsToWaitFor ) != ( EventBits_t ) 0 ) + { + xWaitConditionMet = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Task has to wait for all the bits in uxBitsToWaitFor to be set. + * Are they set already? */ + if( ( uxCurrentEventBits & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + xWaitConditionMet = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + return xWaitConditionMet; +} +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) + + BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet, + BaseType_t * pxHigherPriorityTaskWoken ) + { + BaseType_t xReturn; + + traceENTER_xEventGroupSetBitsFromISR( xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken ); + + traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ); + xReturn = xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ); + + traceRETURN_xEventGroupSetBitsFromISR( xReturn ); + + return xReturn; + } + +#endif /* if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxEventGroupGetNumber( void * xEventGroup ) + { + UBaseType_t xReturn; + + /* MISRA Ref 11.5.2 [Opaque pointer] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + EventGroup_t const * pxEventBits = ( EventGroup_t * ) xEventGroup; + + traceENTER_uxEventGroupGetNumber( xEventGroup ); + + if( xEventGroup == NULL ) + { + xReturn = 0; + } + else + { + xReturn = pxEventBits->uxEventGroupNumber; + } + + traceRETURN_uxEventGroupGetNumber( xReturn ); + + return xReturn; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vEventGroupSetNumber( void * xEventGroup, + UBaseType_t uxEventGroupNumber ) + { + traceENTER_vEventGroupSetNumber( xEventGroup, uxEventGroupNumber ); + + /* MISRA Ref 11.5.2 [Opaque pointer] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + ( ( EventGroup_t * ) xEventGroup )->uxEventGroupNumber = uxEventGroupNumber; + + traceRETURN_vEventGroupSetNumber(); + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/FreeRTOS.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/FreeRTOS.h new file mode 100644 index 0000000..512ef42 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/FreeRTOS.h @@ -0,0 +1,3278 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef INC_FREERTOS_H +#define INC_FREERTOS_H + +/* + * Include the generic headers required for the FreeRTOS port being used. + */ +#include + +/* + * If stdint.h cannot be located then: + * + If using GCC ensure the -nostdint options is *not* being used. + * + Ensure the project's include path includes the directory in which your + * compiler stores stdint.h. + * + Set any compiler options necessary for it to support C99, as technically + * stdint.h is only mandatory with C99 (FreeRTOS does not require C99 in any + * other way). + * + The FreeRTOS download includes a simple stdint.h definition that can be + * used in cases where none is provided by the compiler. The files only + * contains the typedefs required to build FreeRTOS. Read the instructions + * in FreeRTOS/source/stdint.readme for more information. + */ +//#include /* READ COMMENT ABOVE. */ /*<< EST */ + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/* Acceptable values for configTICK_TYPE_WIDTH_IN_BITS. */ +#define TICK_TYPE_WIDTH_16_BITS 0 +#define TICK_TYPE_WIDTH_32_BITS 1 +#define TICK_TYPE_WIDTH_64_BITS 2 + +/* Application specific configuration options. */ +#include "FreeRTOSConfig.h" + +/* << EST */ +#if configSYSTICK_USE_LOW_POWER_TIMER && McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT + #include "SIM_PDD.h" /*! this is a PEx header */ +#endif +/* >> EST */ +/* Basic FreeRTOS definitions. */ +#include "projdefs.h" + +/* Definitions specific to the port being used. */ +#include "portable.h" + +/* Must be defaulted before configUSE_NEWLIB_REENTRANT is used below. */ +#ifndef configUSE_NEWLIB_REENTRANT + #define configUSE_NEWLIB_REENTRANT 0 +#endif + +/* Required if struct _reent is used. */ +#if ( configUSE_NEWLIB_REENTRANT == 1 ) + + #include "newlib-freertos.h" + +#endif /* if ( configUSE_NEWLIB_REENTRANT == 1 ) */ + +/* Must be defaulted before configUSE_PICOLIBC_TLS is used below. */ +#ifndef configUSE_PICOLIBC_TLS + #define configUSE_PICOLIBC_TLS 0 +#endif + +#if ( configUSE_PICOLIBC_TLS == 1 ) + + #include "picolibc-freertos.h" + +#endif /* if ( configUSE_PICOLIBC_TLS == 1 ) */ + +#ifndef configUSE_C_RUNTIME_TLS_SUPPORT + #define configUSE_C_RUNTIME_TLS_SUPPORT 0 +#endif + +#if ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) + + #ifndef configTLS_BLOCK_TYPE + #error Missing definition: configTLS_BLOCK_TYPE must be defined in FreeRTOSConfig.h when configUSE_C_RUNTIME_TLS_SUPPORT is set to 1. + #endif + + #ifndef configINIT_TLS_BLOCK + #error Missing definition: configINIT_TLS_BLOCK must be defined in FreeRTOSConfig.h when configUSE_C_RUNTIME_TLS_SUPPORT is set to 1. + #endif + + #ifndef configSET_TLS_BLOCK + #error Missing definition: configSET_TLS_BLOCK must be defined in FreeRTOSConfig.h when configUSE_C_RUNTIME_TLS_SUPPORT is set to 1. + #endif + + #ifndef configDEINIT_TLS_BLOCK + #error Missing definition: configDEINIT_TLS_BLOCK must be defined in FreeRTOSConfig.h when configUSE_C_RUNTIME_TLS_SUPPORT is set to 1. + #endif +#endif /* if ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) */ + +/* + * Check all the required application specific macros have been defined. + * These macros are application specific and (as downloaded) are defined + * within FreeRTOSConfig.h. + */ + +#ifndef configMINIMAL_STACK_SIZE + #error Missing definition: configMINIMAL_STACK_SIZE must be defined in FreeRTOSConfig.h. configMINIMAL_STACK_SIZE defines the size (in words) of the stack allocated to the idle task. Refer to the demo project provided for your port for a suitable value. +#endif + +#ifndef configMAX_PRIORITIES + #error Missing definition: configMAX_PRIORITIES must be defined in FreeRTOSConfig.h. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#if configMAX_PRIORITIES < 1 + #error configMAX_PRIORITIES must be defined to be greater than or equal to 1. +#endif + +#ifndef configUSE_PREEMPTION + #error Missing definition: configUSE_PREEMPTION must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_IDLE_HOOK + #error Missing definition: configUSE_IDLE_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#if ( configNUMBER_OF_CORES > 1 ) + #ifndef configUSE_PASSIVE_IDLE_HOOK + #error Missing definition: configUSE_PASSIVE_IDLE_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. + #endif +#endif + +#ifndef configUSE_TICK_HOOK + #error Missing definition: configUSE_TICK_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#if ( ( configTICK_TYPE_WIDTH_IN_BITS != TICK_TYPE_WIDTH_16_BITS ) && \ + ( configTICK_TYPE_WIDTH_IN_BITS != TICK_TYPE_WIDTH_32_BITS ) && \ + ( configTICK_TYPE_WIDTH_IN_BITS != TICK_TYPE_WIDTH_64_BITS ) ) + #error Macro configTICK_TYPE_WIDTH_IN_BITS is defined to incorrect value. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_CO_ROUTINES + #define configUSE_CO_ROUTINES 0 +#endif + +#ifndef INCLUDE_vTaskPrioritySet + #define INCLUDE_vTaskPrioritySet 0 +#endif + +#ifndef INCLUDE_uxTaskPriorityGet + #define INCLUDE_uxTaskPriorityGet 0 +#endif + +#ifndef INCLUDE_vTaskDelete + #define INCLUDE_vTaskDelete 0 +#endif + +#ifndef INCLUDE_vTaskSuspend + #define INCLUDE_vTaskSuspend 0 +#endif + +#ifdef INCLUDE_xTaskDelayUntil + #ifdef INCLUDE_vTaskDelayUntil + +/* INCLUDE_vTaskDelayUntil was replaced by INCLUDE_xTaskDelayUntil. Backward + * compatibility is maintained if only one or the other is defined, but + * there is a conflict if both are defined. */ + #error INCLUDE_vTaskDelayUntil and INCLUDE_xTaskDelayUntil are both defined. INCLUDE_vTaskDelayUntil is no longer required and should be removed + #endif +#endif + +#ifndef INCLUDE_xTaskDelayUntil + #ifdef INCLUDE_vTaskDelayUntil + +/* If INCLUDE_vTaskDelayUntil is set but INCLUDE_xTaskDelayUntil is not then + * the project's FreeRTOSConfig.h probably pre-dates the introduction of + * xTaskDelayUntil and setting INCLUDE_xTaskDelayUntil to whatever + * INCLUDE_vTaskDelayUntil is set to will ensure backward compatibility. + */ + #define INCLUDE_xTaskDelayUntil INCLUDE_vTaskDelayUntil + #endif +#endif + +#ifndef INCLUDE_xTaskDelayUntil + #define INCLUDE_xTaskDelayUntil 0 +#endif + +#ifndef INCLUDE_vTaskDelay + #define INCLUDE_vTaskDelay 0 +#endif + +#ifndef INCLUDE_xTaskGetIdleTaskHandle + #define INCLUDE_xTaskGetIdleTaskHandle 0 +#endif + +#ifndef INCLUDE_xTaskAbortDelay + #define INCLUDE_xTaskAbortDelay 0 +#endif + +#ifndef INCLUDE_xQueueGetMutexHolder + #define INCLUDE_xQueueGetMutexHolder 0 +#endif + +#ifndef INCLUDE_xSemaphoreGetMutexHolder + #define INCLUDE_xSemaphoreGetMutexHolder INCLUDE_xQueueGetMutexHolder +#endif + +#ifndef INCLUDE_xTaskGetHandle + #define INCLUDE_xTaskGetHandle 0 +#endif + +#ifndef INCLUDE_uxTaskGetStackHighWaterMark + #define INCLUDE_uxTaskGetStackHighWaterMark 0 +#endif + +#ifndef INCLUDE_uxTaskGetStackHighWaterMark2 + #define INCLUDE_uxTaskGetStackHighWaterMark2 0 +#endif + +#ifndef INCLUDE_eTaskGetState + #define INCLUDE_eTaskGetState 0 +#endif + +#ifndef INCLUDE_xTaskResumeFromISR + #define INCLUDE_xTaskResumeFromISR 1 +#endif + +#ifndef INCLUDE_xTimerPendFunctionCall + #define INCLUDE_xTimerPendFunctionCall 0 +#endif + +#ifndef INCLUDE_xTaskGetSchedulerState + #define INCLUDE_xTaskGetSchedulerState 0 +#endif + +#ifndef INCLUDE_xTaskGetCurrentTaskHandle + #define INCLUDE_xTaskGetCurrentTaskHandle 1 +#endif + +#if configUSE_CO_ROUTINES != 0 + #ifndef configMAX_CO_ROUTINE_PRIORITIES + #error configMAX_CO_ROUTINE_PRIORITIES must be greater than or equal to 1. + #endif +#endif + +#ifndef configUSE_DAEMON_TASK_STARTUP_HOOK + #define configUSE_DAEMON_TASK_STARTUP_HOOK 0 +#endif + +#ifndef configUSE_APPLICATION_TASK_TAG + #define configUSE_APPLICATION_TASK_TAG 0 +#endif + +#ifndef configNUM_THREAD_LOCAL_STORAGE_POINTERS + #define configNUM_THREAD_LOCAL_STORAGE_POINTERS 0 +#endif + +#ifndef configUSE_RECURSIVE_MUTEXES + #define configUSE_RECURSIVE_MUTEXES 0 +#endif + +#ifndef configUSE_MUTEXES + #define configUSE_MUTEXES 0 +#endif + +#ifndef configUSE_TIMERS + #define configUSE_TIMERS 0 +#endif + +#ifndef configUSE_COUNTING_SEMAPHORES + #define configUSE_COUNTING_SEMAPHORES 0 +#endif + +#ifndef configUSE_TASK_PREEMPTION_DISABLE + #define configUSE_TASK_PREEMPTION_DISABLE 0 +#endif + +#ifndef configUSE_ALTERNATIVE_API + #define configUSE_ALTERNATIVE_API 0 +#endif + +#ifndef portCRITICAL_NESTING_IN_TCB + #define portCRITICAL_NESTING_IN_TCB 0 +#endif + +#ifndef configMAX_TASK_NAME_LEN + #define configMAX_TASK_NAME_LEN 16 +#endif + +#ifndef configIDLE_SHOULD_YIELD + #define configIDLE_SHOULD_YIELD 1 +#endif + +#if configMAX_TASK_NAME_LEN < 1 + #error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h +#endif + +#ifndef configASSERT + #define configASSERT( x ) + #define configASSERT_DEFINED 0 +#else + #define configASSERT_DEFINED 1 +#endif + +/* configPRECONDITION should be defined as configASSERT. + * The CBMC proofs need a way to track assumptions and assertions. + * A configPRECONDITION statement should express an implicit invariant or + * assumption made. A configASSERT statement should express an invariant that must + * hold explicit before calling the code. */ +#ifndef configPRECONDITION + #define configPRECONDITION( X ) configASSERT( X ) + #define configPRECONDITION_DEFINED 0 +#else + #define configPRECONDITION_DEFINED 1 +#endif + +#ifndef configCHECK_HANDLER_INSTALLATION + #define configCHECK_HANDLER_INSTALLATION 1 +#else + +/* The application has explicitly defined configCHECK_HANDLER_INSTALLATION + * to 1. The checks requires configASSERT() to be defined. */ + #if ( ( configCHECK_HANDLER_INSTALLATION == 1 ) && ( configASSERT_DEFINED == 0 ) ) + #error You must define configASSERT() when configCHECK_HANDLER_INSTALLATION is 1. + #endif +#endif + +#ifndef portMEMORY_BARRIER + #define portMEMORY_BARRIER() +#endif + +#ifndef portSOFTWARE_BARRIER + #define portSOFTWARE_BARRIER() +#endif + +#ifndef configRUN_MULTIPLE_PRIORITIES + #define configRUN_MULTIPLE_PRIORITIES 0 +#endif + +#ifndef portGET_CORE_ID + + #if ( configNUMBER_OF_CORES == 1 ) + #define portGET_CORE_ID() 0 + #else + #error configNUMBER_OF_CORES is set to more than 1 then portGET_CORE_ID must also be defined. + #endif /* configNUMBER_OF_CORES */ + +#endif /* portGET_CORE_ID */ + +#ifndef portYIELD_CORE + + #if ( configNUMBER_OF_CORES == 1 ) + #define portYIELD_CORE( x ) portYIELD() + #else + #error configNUMBER_OF_CORES is set to more than 1 then portYIELD_CORE must also be defined. + #endif /* configNUMBER_OF_CORES */ + +#endif /* portYIELD_CORE */ + +#ifndef portSET_INTERRUPT_MASK + + #if ( configNUMBER_OF_CORES > 1 ) + #error portSET_INTERRUPT_MASK is required in SMP + #endif + +#endif /* portSET_INTERRUPT_MASK */ + +#ifndef portCLEAR_INTERRUPT_MASK + + #if ( configNUMBER_OF_CORES > 1 ) + #error portCLEAR_INTERRUPT_MASK is required in SMP + #endif + +#endif /* portCLEAR_INTERRUPT_MASK */ + +#ifndef portRELEASE_TASK_LOCK + + #if ( configNUMBER_OF_CORES == 1 ) + #define portRELEASE_TASK_LOCK() + #else + #error portRELEASE_TASK_LOCK is required in SMP + #endif + +#endif /* portRELEASE_TASK_LOCK */ + +#ifndef portGET_TASK_LOCK + + #if ( configNUMBER_OF_CORES == 1 ) + #define portGET_TASK_LOCK() + #else + #error portGET_TASK_LOCK is required in SMP + #endif + +#endif /* portGET_TASK_LOCK */ + +#ifndef portRELEASE_ISR_LOCK + + #if ( configNUMBER_OF_CORES == 1 ) + #define portRELEASE_ISR_LOCK() + #else + #error portRELEASE_ISR_LOCK is required in SMP + #endif + +#endif /* portRELEASE_ISR_LOCK */ + +#ifndef portGET_ISR_LOCK + + #if ( configNUMBER_OF_CORES == 1 ) + #define portGET_ISR_LOCK() + #else + #error portGET_ISR_LOCK is required in SMP + #endif + +#endif /* portGET_ISR_LOCK */ + +#ifndef portENTER_CRITICAL_FROM_ISR + + #if ( configNUMBER_OF_CORES > 1 ) + #error portENTER_CRITICAL_FROM_ISR is required in SMP + #endif + +#endif + +#ifndef portEXIT_CRITICAL_FROM_ISR + + #if ( configNUMBER_OF_CORES > 1 ) + #error portEXIT_CRITICAL_FROM_ISR is required in SMP + #endif + +#endif + +#ifndef configUSE_CORE_AFFINITY + #define configUSE_CORE_AFFINITY 0 +#endif /* configUSE_CORE_AFFINITY */ + +#ifndef configUSE_PASSIVE_IDLE_HOOK + #define configUSE_PASSIVE_IDLE_HOOK 0 +#endif /* configUSE_PASSIVE_IDLE_HOOK */ + +/* The timers module relies on xTaskGetSchedulerState(). */ +#if configUSE_TIMERS == 1 + + #ifndef configTIMER_TASK_PRIORITY + #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_PRIORITY must also be defined. + #endif /* configTIMER_TASK_PRIORITY */ + + #ifndef configTIMER_QUEUE_LENGTH + #error If configUSE_TIMERS is set to 1 then configTIMER_QUEUE_LENGTH must also be defined. + #endif /* configTIMER_QUEUE_LENGTH */ + + #ifndef configTIMER_TASK_STACK_DEPTH + #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_STACK_DEPTH must also be defined. + #endif /* configTIMER_TASK_STACK_DEPTH */ + + #ifndef portTIMER_CALLBACK_ATTRIBUTE + #define portTIMER_CALLBACK_ATTRIBUTE + #endif /* portTIMER_CALLBACK_ATTRIBUTE */ + +#endif /* configUSE_TIMERS */ + +#ifndef portSET_INTERRUPT_MASK_FROM_ISR + #define portSET_INTERRUPT_MASK_FROM_ISR() 0 +#endif + +#ifndef portCLEAR_INTERRUPT_MASK_FROM_ISR + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) ( uxSavedStatusValue ) +#endif + +#ifndef portCLEAN_UP_TCB + #define portCLEAN_UP_TCB( pxTCB ) ( void ) ( pxTCB ) +#endif + +#ifndef portPRE_TASK_DELETE_HOOK + #define portPRE_TASK_DELETE_HOOK( pvTaskToDelete, pxYieldPending ) +#endif + +#ifndef portSETUP_TCB + #define portSETUP_TCB( pxTCB ) ( void ) ( pxTCB ) +#endif + +#ifndef portTASK_SWITCH_HOOK + #define portTASK_SWITCH_HOOK( pxTCB ) ( void ) ( pxTCB ) +#endif + +#ifndef configQUEUE_REGISTRY_SIZE + #define configQUEUE_REGISTRY_SIZE 0U +#endif + +#if ( configQUEUE_REGISTRY_SIZE < 1 ) + #define vQueueAddToRegistry( xQueue, pcName ) + #define vQueueUnregisterQueue( xQueue ) + #define pcQueueGetName( xQueue ) +#endif + +#ifndef configUSE_MINI_LIST_ITEM + #define configUSE_MINI_LIST_ITEM 1 +#endif + +#ifndef portPOINTER_SIZE_TYPE + #define portPOINTER_SIZE_TYPE uint32_t +#endif + +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS /* << EST */ + #include "SEGGER_SYSVIEW_FreeRTOS.h" /* include Segger System Viewer macro definitions */ +#elif configUSE_PERCEPIO_TRACE_HOOKS /* << EST */ + #include "trcRecorder.h" +#endif + +/* Remove any unused trace macros. */ +#ifndef traceSTART + +/* Used to perform any necessary initialisation - for example, open a file + * into which trace is to be written. */ + #define traceSTART() +#endif + +#ifndef traceEND + +/* Use to close a trace, for example close a file into which trace has been + * written. */ + #define traceEND() +#endif + +#ifndef traceTASK_SWITCHED_IN + +/* Called after a task has been selected to run. pxCurrentTCB holds a pointer + * to the task control block of the selected task. */ + #define traceTASK_SWITCHED_IN() +#endif + +#ifndef traceINCREASE_TICK_COUNT + +/* Called before stepping the tick count after waking from tickless idle + * sleep. */ + #define traceINCREASE_TICK_COUNT( x ) +#endif + +#ifndef traceLOW_POWER_IDLE_BEGIN + /* Called immediately before entering tickless idle. */ + #define traceLOW_POWER_IDLE_BEGIN() +#endif + +#ifndef traceLOW_POWER_IDLE_END + /* Called when returning to the Idle task after a tickless idle. */ + #define traceLOW_POWER_IDLE_END() +#endif + +#ifndef traceTASK_SWITCHED_OUT + +/* Called before a task has been selected to run. pxCurrentTCB holds a pointer + * to the task control block of the task being switched out. */ + #define traceTASK_SWITCHED_OUT() +#endif + +#ifndef traceTASK_PRIORITY_INHERIT + +/* Called when a task attempts to take a mutex that is already held by a + * lower priority task. pxTCBOfMutexHolder is a pointer to the TCB of the task + * that holds the mutex. uxInheritedPriority is the priority the mutex holder + * will inherit (the priority of the task that is attempting to obtain the + * muted. */ + #define traceTASK_PRIORITY_INHERIT( pxTCBOfMutexHolder, uxInheritedPriority ) +#endif + +#ifndef traceTASK_PRIORITY_DISINHERIT + +/* Called when a task releases a mutex, the holding of which had resulted in + * the task inheriting the priority of a higher priority task. + * pxTCBOfMutexHolder is a pointer to the TCB of the task that is releasing the + * mutex. uxOriginalPriority is the task's configured (base) priority. */ + #define traceTASK_PRIORITY_DISINHERIT( pxTCBOfMutexHolder, uxOriginalPriority ) +#endif + +#ifndef traceBLOCKING_ON_QUEUE_RECEIVE + +/* Task is about to block because it cannot read from a + * queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + * upon which the read was attempted. pxCurrentTCB points to the TCB of the + * task that attempted the read. */ + #define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ) +#endif + +#ifndef traceBLOCKING_ON_QUEUE_PEEK + +/* Task is about to block because it cannot read from a + * queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + * upon which the read was attempted. pxCurrentTCB points to the TCB of the + * task that attempted the read. */ + #define traceBLOCKING_ON_QUEUE_PEEK( pxQueue ) +#endif + +#ifndef traceBLOCKING_ON_QUEUE_SEND + +/* Task is about to block because it cannot write to a + * queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + * upon which the write was attempted. pxCurrentTCB points to the TCB of the + * task that attempted the write. */ + #define traceBLOCKING_ON_QUEUE_SEND( pxQueue ) +#endif + +#ifndef configCHECK_FOR_STACK_OVERFLOW + #define configCHECK_FOR_STACK_OVERFLOW 0 +#endif + +#ifndef configRECORD_STACK_HIGH_ADDRESS + #define configRECORD_STACK_HIGH_ADDRESS 0 +#endif + +#ifndef configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H + #define configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H 0 +#endif + +/* The following event macros are embedded in the kernel API calls. */ + +#ifndef traceMOVED_TASK_TO_READY_STATE + #define traceMOVED_TASK_TO_READY_STATE( pxTCB ) +#endif + +#ifndef tracePOST_MOVED_TASK_TO_READY_STATE + #define tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB ) +#endif + +#ifndef traceMOVED_TASK_TO_DELAYED_LIST + #define traceMOVED_TASK_TO_DELAYED_LIST() +#endif + +#ifndef traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST + #define traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST() +#endif + +#ifndef traceQUEUE_CREATE + #define traceQUEUE_CREATE( pxNewQueue ) +#endif + +#ifndef traceQUEUE_CREATE_FAILED + #define traceQUEUE_CREATE_FAILED( ucQueueType ) +#endif + +#ifndef traceCREATE_MUTEX + #define traceCREATE_MUTEX( pxNewQueue ) +#endif + +#ifndef traceCREATE_MUTEX_FAILED + #define traceCREATE_MUTEX_FAILED() +#endif + +#ifndef traceGIVE_MUTEX_RECURSIVE + #define traceGIVE_MUTEX_RECURSIVE( pxMutex ) +#endif + +#ifndef traceGIVE_MUTEX_RECURSIVE_FAILED + #define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ) +#endif + +#ifndef traceTAKE_MUTEX_RECURSIVE + #define traceTAKE_MUTEX_RECURSIVE( pxMutex ) +#endif + +#ifndef traceTAKE_MUTEX_RECURSIVE_FAILED + #define traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ) +#endif + +#ifndef traceCREATE_COUNTING_SEMAPHORE + #define traceCREATE_COUNTING_SEMAPHORE() +#endif + +#ifndef traceCREATE_COUNTING_SEMAPHORE_FAILED + #define traceCREATE_COUNTING_SEMAPHORE_FAILED() +#endif + +#ifndef traceQUEUE_SET_SEND + #define traceQUEUE_SET_SEND traceQUEUE_SEND +#endif + +#ifndef traceQUEUE_SEND + #define traceQUEUE_SEND( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FAILED + #define traceQUEUE_SEND_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE + #define traceQUEUE_RECEIVE( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK + #define traceQUEUE_PEEK( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK_FAILED + #define traceQUEUE_PEEK_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK_FROM_ISR + #define traceQUEUE_PEEK_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FAILED + #define traceQUEUE_RECEIVE_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FROM_ISR + #define traceQUEUE_SEND_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FROM_ISR_FAILED + #define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FROM_ISR + #define traceQUEUE_RECEIVE_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FROM_ISR_FAILED + #define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK_FROM_ISR_FAILED + #define traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_DELETE + #define traceQUEUE_DELETE( pxQueue ) +#endif + +#ifndef traceTASK_CREATE + #define traceTASK_CREATE( pxNewTCB ) +#endif + +#ifndef traceTASK_CREATE_FAILED + #define traceTASK_CREATE_FAILED() +#endif + +#ifndef traceTASK_DELETE + #define traceTASK_DELETE( pxTaskToDelete ) +#endif + +#ifndef traceTASK_DELAY_UNTIL + #define traceTASK_DELAY_UNTIL( x ) +#endif + +#ifndef traceTASK_DELAY + #define traceTASK_DELAY() +#endif + +#ifndef traceTASK_PRIORITY_SET + #define traceTASK_PRIORITY_SET( pxTask, uxNewPriority ) +#endif + +#ifndef traceTASK_SUSPEND + #define traceTASK_SUSPEND( pxTaskToSuspend ) +#endif + +#ifndef traceTASK_RESUME + #define traceTASK_RESUME( pxTaskToResume ) +#endif + +#ifndef traceTASK_RESUME_FROM_ISR + #define traceTASK_RESUME_FROM_ISR( pxTaskToResume ) +#endif + +#ifndef traceTASK_INCREMENT_TICK + #define traceTASK_INCREMENT_TICK( xTickCount ) +#endif + +#ifndef traceTIMER_CREATE + #define traceTIMER_CREATE( pxNewTimer ) +#endif + +#ifndef traceTIMER_CREATE_FAILED + #define traceTIMER_CREATE_FAILED() +#endif + +#ifndef traceTIMER_COMMAND_SEND + #define traceTIMER_COMMAND_SEND( xTimer, xMessageID, xMessageValueValue, xReturn ) +#endif + +#ifndef traceTIMER_EXPIRED + #define traceTIMER_EXPIRED( pxTimer ) +#endif + +#ifndef traceTIMER_COMMAND_RECEIVED + #define traceTIMER_COMMAND_RECEIVED( pxTimer, xMessageID, xMessageValue ) +#endif + +#ifndef traceMALLOC + #define traceMALLOC( pvAddress, uiSize ) +#endif + +#ifndef traceFREE + #define traceFREE( pvAddress, uiSize ) +#endif + +#ifndef traceEVENT_GROUP_CREATE + #define traceEVENT_GROUP_CREATE( xEventGroup ) +#endif + +#ifndef traceEVENT_GROUP_CREATE_FAILED + #define traceEVENT_GROUP_CREATE_FAILED() +#endif + +#ifndef traceEVENT_GROUP_SYNC_BLOCK + #define traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor ) +#endif + +#ifndef traceEVENT_GROUP_SYNC_END + #define traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) ( xTimeoutOccurred ) +#endif + +#ifndef traceEVENT_GROUP_WAIT_BITS_BLOCK + #define traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor ) +#endif + +#ifndef traceEVENT_GROUP_WAIT_BITS_END + #define traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) ( xTimeoutOccurred ) +#endif + +#ifndef traceEVENT_GROUP_CLEAR_BITS + #define traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear ) +#endif + +#ifndef traceEVENT_GROUP_CLEAR_BITS_FROM_ISR + #define traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ) +#endif + +#ifndef traceEVENT_GROUP_SET_BITS + #define traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ) +#endif + +#ifndef traceEVENT_GROUP_SET_BITS_FROM_ISR + #define traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ) +#endif + +#ifndef traceEVENT_GROUP_DELETE + #define traceEVENT_GROUP_DELETE( xEventGroup ) +#endif + +#ifndef tracePEND_FUNC_CALL + #define tracePEND_FUNC_CALL( xFunctionToPend, pvParameter1, ulParameter2, ret ) +#endif + +#ifndef tracePEND_FUNC_CALL_FROM_ISR + #define tracePEND_FUNC_CALL_FROM_ISR( xFunctionToPend, pvParameter1, ulParameter2, ret ) +#endif + +#ifndef traceQUEUE_REGISTRY_ADD + #define traceQUEUE_REGISTRY_ADD( xQueue, pcQueueName ) +#endif + +#ifndef traceTASK_NOTIFY_TAKE_BLOCK + #define traceTASK_NOTIFY_TAKE_BLOCK( uxIndexToWait ) +#endif + +#ifndef traceTASK_NOTIFY_TAKE + #define traceTASK_NOTIFY_TAKE( uxIndexToWait ) +#endif + +#ifndef traceTASK_NOTIFY_WAIT_BLOCK + #define traceTASK_NOTIFY_WAIT_BLOCK( uxIndexToWait ) +#endif + +#ifndef traceTASK_NOTIFY_WAIT + #define traceTASK_NOTIFY_WAIT( uxIndexToWait ) +#endif + +#ifndef traceTASK_NOTIFY + #define traceTASK_NOTIFY( uxIndexToNotify ) +#endif + +#ifndef traceTASK_NOTIFY_FROM_ISR + #define traceTASK_NOTIFY_FROM_ISR( uxIndexToNotify ) +#endif + +#ifndef traceTASK_NOTIFY_GIVE_FROM_ISR + #define traceTASK_NOTIFY_GIVE_FROM_ISR( uxIndexToNotify ) +#endif + +#ifndef traceISR_EXIT_TO_SCHEDULER + #define traceISR_EXIT_TO_SCHEDULER() +#endif + +#ifndef traceISR_EXIT + #define traceISR_EXIT() +#endif + +#ifndef traceISR_ENTER + #define traceISR_ENTER() +#endif + +#ifndef traceSTREAM_BUFFER_CREATE_FAILED + #define traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_CREATE_STATIC_FAILED + #define traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_CREATE + #define traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_DELETE + #define traceSTREAM_BUFFER_DELETE( xStreamBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_RESET + #define traceSTREAM_BUFFER_RESET( xStreamBuffer ) +#endif + +#ifndef traceBLOCKING_ON_STREAM_BUFFER_SEND + #define traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_SEND + #define traceSTREAM_BUFFER_SEND( xStreamBuffer, xBytesSent ) +#endif + +#ifndef traceSTREAM_BUFFER_SEND_FAILED + #define traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_SEND_FROM_ISR + #define traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xBytesSent ) +#endif + +#ifndef traceBLOCKING_ON_STREAM_BUFFER_RECEIVE + #define traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_RECEIVE + #define traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength ) +#endif + +#ifndef traceSTREAM_BUFFER_RECEIVE_FAILED + #define traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_RECEIVE_FROM_ISR + #define traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength ) +#endif + +#ifndef traceENTER_xEventGroupCreateStatic + #define traceENTER_xEventGroupCreateStatic( pxEventGroupBuffer ) +#endif + +#ifndef traceRETURN_xEventGroupCreateStatic + #define traceRETURN_xEventGroupCreateStatic( pxEventBits ) +#endif + +#ifndef traceENTER_xEventGroupCreate + #define traceENTER_xEventGroupCreate() +#endif + +#ifndef traceRETURN_xEventGroupCreate + #define traceRETURN_xEventGroupCreate( pxEventBits ) +#endif + +#ifndef traceENTER_xEventGroupSync + #define traceENTER_xEventGroupSync( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTicksToWait ) +#endif + +#ifndef traceRETURN_xEventGroupSync + #define traceRETURN_xEventGroupSync( uxReturn ) +#endif + +#ifndef traceENTER_xEventGroupWaitBits + #define traceENTER_xEventGroupWaitBits( xEventGroup, uxBitsToWaitFor, xClearOnExit, xWaitForAllBits, xTicksToWait ) +#endif + +#ifndef traceRETURN_xEventGroupWaitBits + #define traceRETURN_xEventGroupWaitBits( uxReturn ) +#endif + +#ifndef traceENTER_xEventGroupClearBits + #define traceENTER_xEventGroupClearBits( xEventGroup, uxBitsToClear ) +#endif + +#ifndef traceRETURN_xEventGroupClearBits + #define traceRETURN_xEventGroupClearBits( uxReturn ) +#endif + +#ifndef traceENTER_xEventGroupClearBitsFromISR + #define traceENTER_xEventGroupClearBitsFromISR( xEventGroup, uxBitsToClear ) +#endif + +#ifndef traceRETURN_xEventGroupClearBitsFromISR + #define traceRETURN_xEventGroupClearBitsFromISR( xReturn ) +#endif + +#ifndef traceENTER_xEventGroupGetBitsFromISR + #define traceENTER_xEventGroupGetBitsFromISR( xEventGroup ) +#endif + +#ifndef traceRETURN_xEventGroupGetBitsFromISR + #define traceRETURN_xEventGroupGetBitsFromISR( uxReturn ) +#endif + +#ifndef traceENTER_xEventGroupSetBits + #define traceENTER_xEventGroupSetBits( xEventGroup, uxBitsToSet ) +#endif + +#ifndef traceRETURN_xEventGroupSetBits + #define traceRETURN_xEventGroupSetBits( uxEventBits ) +#endif + +#ifndef traceENTER_vEventGroupDelete + #define traceENTER_vEventGroupDelete( xEventGroup ) +#endif + +#ifndef traceRETURN_vEventGroupDelete + #define traceRETURN_vEventGroupDelete() +#endif + +#ifndef traceENTER_xEventGroupGetStaticBuffer + #define traceENTER_xEventGroupGetStaticBuffer( xEventGroup, ppxEventGroupBuffer ) +#endif + +#ifndef traceRETURN_xEventGroupGetStaticBuffer + #define traceRETURN_xEventGroupGetStaticBuffer( xReturn ) +#endif + +#ifndef traceENTER_vEventGroupSetBitsCallback + #define traceENTER_vEventGroupSetBitsCallback( pvEventGroup, ulBitsToSet ) +#endif + +#ifndef traceRETURN_vEventGroupSetBitsCallback + #define traceRETURN_vEventGroupSetBitsCallback() +#endif + +#ifndef traceENTER_vEventGroupClearBitsCallback + #define traceENTER_vEventGroupClearBitsCallback( pvEventGroup, ulBitsToClear ) +#endif + +#ifndef traceRETURN_vEventGroupClearBitsCallback + #define traceRETURN_vEventGroupClearBitsCallback() +#endif + +#ifndef traceENTER_xEventGroupSetBitsFromISR + #define traceENTER_xEventGroupSetBitsFromISR( xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken ) +#endif + +#ifndef traceRETURN_xEventGroupSetBitsFromISR + #define traceRETURN_xEventGroupSetBitsFromISR( xReturn ) +#endif + +#ifndef traceENTER_uxEventGroupGetNumber + #define traceENTER_uxEventGroupGetNumber( xEventGroup ) +#endif + +#ifndef traceRETURN_uxEventGroupGetNumber + #define traceRETURN_uxEventGroupGetNumber( xReturn ) +#endif + +#ifndef traceENTER_vEventGroupSetNumber + #define traceENTER_vEventGroupSetNumber( xEventGroup, uxEventGroupNumber ) +#endif + +#ifndef traceRETURN_vEventGroupSetNumber + #define traceRETURN_vEventGroupSetNumber() +#endif + +#ifndef traceENTER_xQueueGenericReset + #define traceENTER_xQueueGenericReset( xQueue, xNewQueue ) +#endif + +#ifndef traceRETURN_xQueueGenericReset + #define traceRETURN_xQueueGenericReset( xReturn ) +#endif + +#ifndef traceENTER_xQueueGenericCreateStatic + #define traceENTER_xQueueGenericCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxStaticQueue, ucQueueType ) +#endif + +#ifndef traceRETURN_xQueueGenericCreateStatic + #define traceRETURN_xQueueGenericCreateStatic( pxNewQueue ) +#endif + +#ifndef traceENTER_xQueueGenericGetStaticBuffers + #define traceENTER_xQueueGenericGetStaticBuffers( xQueue, ppucQueueStorage, ppxStaticQueue ) +#endif + +#ifndef traceRETURN_xQueueGenericGetStaticBuffers + #define traceRETURN_xQueueGenericGetStaticBuffers( xReturn ) +#endif + +#ifndef traceENTER_xQueueGenericCreate + #define traceENTER_xQueueGenericCreate( uxQueueLength, uxItemSize, ucQueueType ) +#endif + +#ifndef traceRETURN_xQueueGenericCreate + #define traceRETURN_xQueueGenericCreate( pxNewQueue ) +#endif + +#ifndef traceENTER_xQueueCreateMutex + #define traceENTER_xQueueCreateMutex( ucQueueType ) +#endif + +#ifndef traceRETURN_xQueueCreateMutex + #define traceRETURN_xQueueCreateMutex( xNewQueue ) +#endif + +#ifndef traceENTER_xQueueCreateMutexStatic + #define traceENTER_xQueueCreateMutexStatic( ucQueueType, pxStaticQueue ) +#endif + +#ifndef traceRETURN_xQueueCreateMutexStatic + #define traceRETURN_xQueueCreateMutexStatic( xNewQueue ) +#endif + +#ifndef traceENTER_xQueueGetMutexHolder + #define traceENTER_xQueueGetMutexHolder( xSemaphore ) +#endif + +#ifndef traceRETURN_xQueueGetMutexHolder + #define traceRETURN_xQueueGetMutexHolder( pxReturn ) +#endif + +#ifndef traceENTER_xQueueGetMutexHolderFromISR + #define traceENTER_xQueueGetMutexHolderFromISR( xSemaphore ) +#endif + +#ifndef traceRETURN_xQueueGetMutexHolderFromISR + #define traceRETURN_xQueueGetMutexHolderFromISR( pxReturn ) +#endif + +#ifndef traceENTER_xQueueGiveMutexRecursive + #define traceENTER_xQueueGiveMutexRecursive( xMutex ) +#endif + +#ifndef traceRETURN_xQueueGiveMutexRecursive + #define traceRETURN_xQueueGiveMutexRecursive( xReturn ) +#endif + +#ifndef traceENTER_xQueueTakeMutexRecursive + #define traceENTER_xQueueTakeMutexRecursive( xMutex, xTicksToWait ) +#endif + +#ifndef traceRETURN_xQueueTakeMutexRecursive + #define traceRETURN_xQueueTakeMutexRecursive( xReturn ) +#endif + +#ifndef traceENTER_xQueueCreateCountingSemaphoreStatic + #define traceENTER_xQueueCreateCountingSemaphoreStatic( uxMaxCount, uxInitialCount, pxStaticQueue ) +#endif + +#ifndef traceRETURN_xQueueCreateCountingSemaphoreStatic + #define traceRETURN_xQueueCreateCountingSemaphoreStatic( xHandle ) +#endif + +#ifndef traceENTER_xQueueCreateCountingSemaphore + #define traceENTER_xQueueCreateCountingSemaphore( uxMaxCount, uxInitialCount ) +#endif + +#ifndef traceRETURN_xQueueCreateCountingSemaphore + #define traceRETURN_xQueueCreateCountingSemaphore( xHandle ) +#endif + +#ifndef traceENTER_xQueueGenericSend + #define traceENTER_xQueueGenericSend( xQueue, pvItemToQueue, xTicksToWait, xCopyPosition ) +#endif + +#ifndef traceRETURN_xQueueGenericSend + #define traceRETURN_xQueueGenericSend( xReturn ) +#endif + +#ifndef traceENTER_xQueueGenericSendFromISR + #define traceENTER_xQueueGenericSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken, xCopyPosition ) +#endif + +#ifndef traceRETURN_xQueueGenericSendFromISR + #define traceRETURN_xQueueGenericSendFromISR( xReturn ) +#endif + +#ifndef traceENTER_xQueueGiveFromISR + #define traceENTER_xQueueGiveFromISR( xQueue, pxHigherPriorityTaskWoken ) +#endif + +#ifndef traceRETURN_xQueueGiveFromISR + #define traceRETURN_xQueueGiveFromISR( xReturn ) +#endif + +#ifndef traceENTER_xQueueReceive + #define traceENTER_xQueueReceive( xQueue, pvBuffer, xTicksToWait ) +#endif + +#ifndef traceRETURN_xQueueReceive + #define traceRETURN_xQueueReceive( xReturn ) +#endif + +#ifndef traceENTER_xQueueSemaphoreTake + #define traceENTER_xQueueSemaphoreTake( xQueue, xTicksToWait ) +#endif + +#ifndef traceRETURN_xQueueSemaphoreTake + #define traceRETURN_xQueueSemaphoreTake( xReturn ) +#endif + +#ifndef traceENTER_xQueuePeek + #define traceENTER_xQueuePeek( xQueue, pvBuffer, xTicksToWait ) +#endif + +#ifndef traceRETURN_xQueuePeek + #define traceRETURN_xQueuePeek( xReturn ) +#endif + +#ifndef traceENTER_xQueueReceiveFromISR + #define traceENTER_xQueueReceiveFromISR( xQueue, pvBuffer, pxHigherPriorityTaskWoken ) +#endif + +#ifndef traceRETURN_xQueueReceiveFromISR + #define traceRETURN_xQueueReceiveFromISR( xReturn ) +#endif + +#ifndef traceENTER_xQueuePeekFromISR + #define traceENTER_xQueuePeekFromISR( xQueue, pvBuffer ) +#endif + +#ifndef traceRETURN_xQueuePeekFromISR + #define traceRETURN_xQueuePeekFromISR( xReturn ) +#endif + +#ifndef traceENTER_uxQueueMessagesWaiting + #define traceENTER_uxQueueMessagesWaiting( xQueue ) +#endif + +#ifndef traceRETURN_uxQueueMessagesWaiting + #define traceRETURN_uxQueueMessagesWaiting( uxReturn ) +#endif + +#ifndef traceENTER_uxQueueSpacesAvailable + #define traceENTER_uxQueueSpacesAvailable( xQueue ) +#endif + +#ifndef traceRETURN_uxQueueSpacesAvailable + #define traceRETURN_uxQueueSpacesAvailable( uxReturn ) +#endif + +#ifndef traceENTER_uxQueueMessagesWaitingFromISR + #define traceENTER_uxQueueMessagesWaitingFromISR( xQueue ) +#endif + +#ifndef traceRETURN_uxQueueMessagesWaitingFromISR + #define traceRETURN_uxQueueMessagesWaitingFromISR( uxReturn ) +#endif + +#ifndef traceENTER_vQueueDelete + #define traceENTER_vQueueDelete( xQueue ) +#endif + +#ifndef traceRETURN_vQueueDelete + #define traceRETURN_vQueueDelete() +#endif + +#ifndef traceENTER_uxQueueGetQueueNumber + #define traceENTER_uxQueueGetQueueNumber( xQueue ) +#endif + +#ifndef traceRETURN_uxQueueGetQueueNumber + #define traceRETURN_uxQueueGetQueueNumber( uxQueueNumber ) +#endif + +#ifndef traceENTER_vQueueSetQueueNumber + #define traceENTER_vQueueSetQueueNumber( xQueue, uxQueueNumber ) +#endif + +#ifndef traceRETURN_vQueueSetQueueNumber + #define traceRETURN_vQueueSetQueueNumber() +#endif + +#ifndef traceENTER_ucQueueGetQueueType + #define traceENTER_ucQueueGetQueueType( xQueue ) +#endif + +#ifndef traceRETURN_ucQueueGetQueueType + #define traceRETURN_ucQueueGetQueueType( ucQueueType ) +#endif + +#ifndef traceENTER_uxQueueGetQueueItemSize + #define traceENTER_uxQueueGetQueueItemSize( xQueue ) +#endif + +#ifndef traceRETURN_uxQueueGetQueueItemSize + #define traceRETURN_uxQueueGetQueueItemSize( uxItemSize ) +#endif + +#ifndef traceENTER_uxQueueGetQueueLength + #define traceENTER_uxQueueGetQueueLength( xQueue ) +#endif + +#ifndef traceRETURN_uxQueueGetQueueLength + #define traceRETURN_uxQueueGetQueueLength( uxLength ) +#endif + +#ifndef traceENTER_xQueueIsQueueEmptyFromISR + #define traceENTER_xQueueIsQueueEmptyFromISR( xQueue ) +#endif + +#ifndef traceRETURN_xQueueIsQueueEmptyFromISR + #define traceRETURN_xQueueIsQueueEmptyFromISR( xReturn ) +#endif + +#ifndef traceENTER_xQueueIsQueueFullFromISR + #define traceENTER_xQueueIsQueueFullFromISR( xQueue ) +#endif + +#ifndef traceRETURN_xQueueIsQueueFullFromISR + #define traceRETURN_xQueueIsQueueFullFromISR( xReturn ) +#endif + +#ifndef traceENTER_xQueueCRSend + #define traceENTER_xQueueCRSend( xQueue, pvItemToQueue, xTicksToWait ) +#endif + +#ifndef traceRETURN_xQueueCRSend + #define traceRETURN_xQueueCRSend( xReturn ) +#endif + +#ifndef traceENTER_xQueueCRReceive + #define traceENTER_xQueueCRReceive( xQueue, pvBuffer, xTicksToWait ) +#endif + +#ifndef traceRETURN_xQueueCRReceive + #define traceRETURN_xQueueCRReceive( xReturn ) +#endif + +#ifndef traceENTER_xQueueCRSendFromISR + #define traceENTER_xQueueCRSendFromISR( xQueue, pvItemToQueue, xCoRoutinePreviouslyWoken ) +#endif + +#ifndef traceRETURN_xQueueCRSendFromISR + #define traceRETURN_xQueueCRSendFromISR( xCoRoutinePreviouslyWoken ) +#endif + +#ifndef traceENTER_xQueueCRReceiveFromISR + #define traceENTER_xQueueCRReceiveFromISR( xQueue, pvBuffer, pxCoRoutineWoken ) +#endif + +#ifndef traceRETURN_xQueueCRReceiveFromISR + #define traceRETURN_xQueueCRReceiveFromISR( xReturn ) +#endif + +#ifndef traceENTER_vQueueAddToRegistry + #define traceENTER_vQueueAddToRegistry( xQueue, pcQueueName ) +#endif + +#ifndef traceRETURN_vQueueAddToRegistry + #define traceRETURN_vQueueAddToRegistry() +#endif + +#ifndef traceENTER_pcQueueGetName + #define traceENTER_pcQueueGetName( xQueue ) +#endif + +#ifndef traceRETURN_pcQueueGetName + #define traceRETURN_pcQueueGetName( pcReturn ) +#endif + +#ifndef traceENTER_vQueueUnregisterQueue + #define traceENTER_vQueueUnregisterQueue( xQueue ) +#endif + +#ifndef traceRETURN_vQueueUnregisterQueue + #define traceRETURN_vQueueUnregisterQueue() +#endif + +#ifndef traceENTER_vQueueWaitForMessageRestricted + #define traceENTER_vQueueWaitForMessageRestricted( xQueue, xTicksToWait, xWaitIndefinitely ) +#endif + +#ifndef traceRETURN_vQueueWaitForMessageRestricted + #define traceRETURN_vQueueWaitForMessageRestricted() +#endif + +#ifndef traceENTER_xQueueCreateSet + #define traceENTER_xQueueCreateSet( uxEventQueueLength ) +#endif + +#ifndef traceRETURN_xQueueCreateSet + #define traceRETURN_xQueueCreateSet( pxQueue ) +#endif + +#ifndef traceENTER_xQueueAddToSet + #define traceENTER_xQueueAddToSet( xQueueOrSemaphore, xQueueSet ) +#endif + +#ifndef traceRETURN_xQueueAddToSet + #define traceRETURN_xQueueAddToSet( xReturn ) +#endif + +#ifndef traceENTER_xQueueRemoveFromSet + #define traceENTER_xQueueRemoveFromSet( xQueueOrSemaphore, xQueueSet ) +#endif + +#ifndef traceRETURN_xQueueRemoveFromSet + #define traceRETURN_xQueueRemoveFromSet( xReturn ) +#endif + +#ifndef traceENTER_xQueueSelectFromSet + #define traceENTER_xQueueSelectFromSet( xQueueSet, xTicksToWait ) +#endif + +#ifndef traceRETURN_xQueueSelectFromSet + #define traceRETURN_xQueueSelectFromSet( xReturn ) +#endif + +#ifndef traceENTER_xQueueSelectFromSetFromISR + #define traceENTER_xQueueSelectFromSetFromISR( xQueueSet ) +#endif + +#ifndef traceRETURN_xQueueSelectFromSetFromISR + #define traceRETURN_xQueueSelectFromSetFromISR( xReturn ) +#endif + +#ifndef traceENTER_xTimerCreateTimerTask + #define traceENTER_xTimerCreateTimerTask() +#endif + +#ifndef traceRETURN_xTimerCreateTimerTask + #define traceRETURN_xTimerCreateTimerTask( xReturn ) +#endif + +#ifndef traceENTER_xTimerCreate + #define traceENTER_xTimerCreate( pcTimerName, xTimerPeriodInTicks, xAutoReload, pvTimerID, pxCallbackFunction ) +#endif + +#ifndef traceRETURN_xTimerCreate + #define traceRETURN_xTimerCreate( pxNewTimer ) +#endif + +#ifndef traceENTER_xTimerCreateStatic + #define traceENTER_xTimerCreateStatic( pcTimerName, xTimerPeriodInTicks, xAutoReload, pvTimerID, pxCallbackFunction, pxTimerBuffer ) +#endif + +#ifndef traceRETURN_xTimerCreateStatic + #define traceRETURN_xTimerCreateStatic( pxNewTimer ) +#endif + +#ifndef traceENTER_xTimerGenericCommandFromTask + #define traceENTER_xTimerGenericCommandFromTask( xTimer, xCommandID, xOptionalValue, pxHigherPriorityTaskWoken, xTicksToWait ) +#endif + +#ifndef traceRETURN_xTimerGenericCommandFromTask + #define traceRETURN_xTimerGenericCommandFromTask( xReturn ) +#endif + +#ifndef traceENTER_xTimerGenericCommandFromISR + #define traceENTER_xTimerGenericCommandFromISR( xTimer, xCommandID, xOptionalValue, pxHigherPriorityTaskWoken, xTicksToWait ) +#endif + +#ifndef traceRETURN_xTimerGenericCommandFromISR + #define traceRETURN_xTimerGenericCommandFromISR( xReturn ) +#endif + +#ifndef traceENTER_xTimerGetTimerDaemonTaskHandle + #define traceENTER_xTimerGetTimerDaemonTaskHandle() +#endif + +#ifndef traceRETURN_xTimerGetTimerDaemonTaskHandle + #define traceRETURN_xTimerGetTimerDaemonTaskHandle( xTimerTaskHandle ) +#endif + +#ifndef traceENTER_xTimerGetPeriod + #define traceENTER_xTimerGetPeriod( xTimer ) +#endif + +#ifndef traceRETURN_xTimerGetPeriod + #define traceRETURN_xTimerGetPeriod( xTimerPeriodInTicks ) +#endif + +#ifndef traceENTER_vTimerSetReloadMode + #define traceENTER_vTimerSetReloadMode( xTimer, xAutoReload ) +#endif + +#ifndef traceRETURN_vTimerSetReloadMode + #define traceRETURN_vTimerSetReloadMode() +#endif + +#ifndef traceENTER_xTimerGetReloadMode + #define traceENTER_xTimerGetReloadMode( xTimer ) +#endif + +#ifndef traceRETURN_xTimerGetReloadMode + #define traceRETURN_xTimerGetReloadMode( xReturn ) +#endif + +#ifndef traceENTER_uxTimerGetReloadMode + #define traceENTER_uxTimerGetReloadMode( xTimer ) +#endif + +#ifndef traceRETURN_uxTimerGetReloadMode + #define traceRETURN_uxTimerGetReloadMode( uxReturn ) +#endif + +#ifndef traceENTER_xTimerGetExpiryTime + #define traceENTER_xTimerGetExpiryTime( xTimer ) +#endif + +#ifndef traceRETURN_xTimerGetExpiryTime + #define traceRETURN_xTimerGetExpiryTime( xReturn ) +#endif + +#ifndef traceENTER_xTimerGetStaticBuffer + #define traceENTER_xTimerGetStaticBuffer( xTimer, ppxTimerBuffer ) +#endif + +#ifndef traceRETURN_xTimerGetStaticBuffer + #define traceRETURN_xTimerGetStaticBuffer( xReturn ) +#endif + +#ifndef traceENTER_pcTimerGetName + #define traceENTER_pcTimerGetName( xTimer ) +#endif + +#ifndef traceRETURN_pcTimerGetName + #define traceRETURN_pcTimerGetName( pcTimerName ) +#endif + +#ifndef traceENTER_xTimerIsTimerActive + #define traceENTER_xTimerIsTimerActive( xTimer ) +#endif + +#ifndef traceRETURN_xTimerIsTimerActive + #define traceRETURN_xTimerIsTimerActive( xReturn ) +#endif + +#ifndef traceENTER_pvTimerGetTimerID + #define traceENTER_pvTimerGetTimerID( xTimer ) +#endif + +#ifndef traceRETURN_pvTimerGetTimerID + #define traceRETURN_pvTimerGetTimerID( pvReturn ) +#endif + +#ifndef traceENTER_vTimerSetTimerID + #define traceENTER_vTimerSetTimerID( xTimer, pvNewID ) +#endif + +#ifndef traceRETURN_vTimerSetTimerID + #define traceRETURN_vTimerSetTimerID() +#endif + +#ifndef traceENTER_xTimerPendFunctionCallFromISR + #define traceENTER_xTimerPendFunctionCallFromISR( xFunctionToPend, pvParameter1, ulParameter2, pxHigherPriorityTaskWoken ) +#endif + +#ifndef traceRETURN_xTimerPendFunctionCallFromISR + #define traceRETURN_xTimerPendFunctionCallFromISR( xReturn ) +#endif + +#ifndef traceENTER_xTimerPendFunctionCall + #define traceENTER_xTimerPendFunctionCall( xFunctionToPend, pvParameter1, ulParameter2, xTicksToWait ) +#endif + +#ifndef traceRETURN_xTimerPendFunctionCall + #define traceRETURN_xTimerPendFunctionCall( xReturn ) +#endif + +#ifndef traceENTER_uxTimerGetTimerNumber + #define traceENTER_uxTimerGetTimerNumber( xTimer ) +#endif + +#ifndef traceRETURN_uxTimerGetTimerNumber + #define traceRETURN_uxTimerGetTimerNumber( uxTimerNumber ) +#endif + +#ifndef traceENTER_vTimerSetTimerNumber + #define traceENTER_vTimerSetTimerNumber( xTimer, uxTimerNumber ) +#endif + +#ifndef traceRETURN_vTimerSetTimerNumber + #define traceRETURN_vTimerSetTimerNumber() +#endif + +#ifndef traceENTER_xTaskCreateStatic + #define traceENTER_xTaskCreateStatic( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer ) +#endif + +#ifndef traceRETURN_xTaskCreateStatic + #define traceRETURN_xTaskCreateStatic( xReturn ) +#endif + +#ifndef traceENTER_xTaskCreateStaticAffinitySet + #define traceENTER_xTaskCreateStaticAffinitySet( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer, uxCoreAffinityMask ) +#endif + +#ifndef traceRETURN_xTaskCreateStaticAffinitySet + #define traceRETURN_xTaskCreateStaticAffinitySet( xReturn ) +#endif + +#ifndef traceENTER_xTaskCreateRestrictedStatic + #define traceENTER_xTaskCreateRestrictedStatic( pxTaskDefinition, pxCreatedTask ) +#endif + +#ifndef traceRETURN_xTaskCreateRestrictedStatic + #define traceRETURN_xTaskCreateRestrictedStatic( xReturn ) +#endif + +#ifndef traceENTER_xTaskCreateRestrictedStaticAffinitySet + #define traceENTER_xTaskCreateRestrictedStaticAffinitySet( pxTaskDefinition, uxCoreAffinityMask, pxCreatedTask ) +#endif + +#ifndef traceRETURN_xTaskCreateRestrictedStaticAffinitySet + #define traceRETURN_xTaskCreateRestrictedStaticAffinitySet( xReturn ) +#endif + +#ifndef traceENTER_xTaskCreateRestricted + #define traceENTER_xTaskCreateRestricted( pxTaskDefinition, pxCreatedTask ) +#endif + +#ifndef traceRETURN_xTaskCreateRestricted + #define traceRETURN_xTaskCreateRestricted( xReturn ) +#endif + +#ifndef traceENTER_xTaskCreateRestrictedAffinitySet + #define traceENTER_xTaskCreateRestrictedAffinitySet( pxTaskDefinition, uxCoreAffinityMask, pxCreatedTask ) +#endif + +#ifndef traceRETURN_xTaskCreateRestrictedAffinitySet + #define traceRETURN_xTaskCreateRestrictedAffinitySet( xReturn ) +#endif + +#ifndef traceENTER_xTaskCreate + #define traceENTER_xTaskCreate( pxTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask ) +#endif + +#ifndef traceRETURN_xTaskCreate + #define traceRETURN_xTaskCreate( xReturn ) +#endif + +#ifndef traceENTER_xTaskCreateAffinitySet + #define traceENTER_xTaskCreateAffinitySet( pxTaskCode, pcName, usStackDepth, pvParameters, uxPriority, uxCoreAffinityMask, pxCreatedTask ) +#endif + +#ifndef traceRETURN_xTaskCreateAffinitySet + #define traceRETURN_xTaskCreateAffinitySet( xReturn ) +#endif + +#ifndef traceENTER_vTaskDelete + #define traceENTER_vTaskDelete( xTaskToDelete ) +#endif + +#ifndef traceRETURN_vTaskDelete + #define traceRETURN_vTaskDelete() +#endif + +#ifndef traceENTER_xTaskDelayUntil + #define traceENTER_xTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement ) +#endif + +#ifndef traceRETURN_xTaskDelayUntil + #define traceRETURN_xTaskDelayUntil( xShouldDelay ) +#endif + +#ifndef traceENTER_vTaskDelay + #define traceENTER_vTaskDelay( xTicksToDelay ) +#endif + +#ifndef traceRETURN_vTaskDelay + #define traceRETURN_vTaskDelay() +#endif + +#ifndef traceENTER_eTaskGetState + #define traceENTER_eTaskGetState( xTask ) +#endif + +#ifndef traceRETURN_eTaskGetState + #define traceRETURN_eTaskGetState( eReturn ) +#endif + +#ifndef traceENTER_uxTaskPriorityGet + #define traceENTER_uxTaskPriorityGet( xTask ) +#endif + +#ifndef traceRETURN_uxTaskPriorityGet + #define traceRETURN_uxTaskPriorityGet( uxReturn ) +#endif + +#ifndef traceENTER_uxTaskPriorityGetFromISR + #define traceENTER_uxTaskPriorityGetFromISR( xTask ) +#endif + +#ifndef traceRETURN_uxTaskPriorityGetFromISR + #define traceRETURN_uxTaskPriorityGetFromISR( uxReturn ) +#endif + +#ifndef traceENTER_uxTaskBasePriorityGet + #define traceENTER_uxTaskBasePriorityGet( xTask ) +#endif + +#ifndef traceRETURN_uxTaskBasePriorityGet + #define traceRETURN_uxTaskBasePriorityGet( uxReturn ) +#endif + +#ifndef traceENTER_uxTaskBasePriorityGetFromISR + #define traceENTER_uxTaskBasePriorityGetFromISR( xTask ) +#endif + +#ifndef traceRETURN_uxTaskBasePriorityGetFromISR + #define traceRETURN_uxTaskBasePriorityGetFromISR( uxReturn ) +#endif + +#ifndef traceENTER_vTaskPrioritySet + #define traceENTER_vTaskPrioritySet( xTask, uxNewPriority ) +#endif + +#ifndef traceRETURN_vTaskPrioritySet + #define traceRETURN_vTaskPrioritySet() +#endif + +#ifndef traceENTER_vTaskCoreAffinitySet + #define traceENTER_vTaskCoreAffinitySet( xTask, uxCoreAffinityMask ) +#endif + +#ifndef traceRETURN_vTaskCoreAffinitySet + #define traceRETURN_vTaskCoreAffinitySet() +#endif + +#ifndef traceENTER_vTaskCoreAffinityGet + #define traceENTER_vTaskCoreAffinityGet( xTask ) +#endif + +#ifndef traceRETURN_vTaskCoreAffinityGet + #define traceRETURN_vTaskCoreAffinityGet( uxCoreAffinityMask ) +#endif + +#ifndef traceENTER_vTaskPreemptionDisable + #define traceENTER_vTaskPreemptionDisable( xTask ) +#endif + +#ifndef traceRETURN_vTaskPreemptionDisable + #define traceRETURN_vTaskPreemptionDisable() +#endif + +#ifndef traceENTER_vTaskPreemptionEnable + #define traceENTER_vTaskPreemptionEnable( xTask ) +#endif + +#ifndef traceRETURN_vTaskPreemptionEnable + #define traceRETURN_vTaskPreemptionEnable() +#endif + +#ifndef traceENTER_vTaskSuspend + #define traceENTER_vTaskSuspend( xTaskToSuspend ) +#endif + +#ifndef traceRETURN_vTaskSuspend + #define traceRETURN_vTaskSuspend() +#endif + +#ifndef traceENTER_vTaskResume + #define traceENTER_vTaskResume( xTaskToResume ) +#endif + +#ifndef traceRETURN_vTaskResume + #define traceRETURN_vTaskResume() +#endif + +#ifndef traceENTER_xTaskResumeFromISR + #define traceENTER_xTaskResumeFromISR( xTaskToResume ) +#endif + +#ifndef traceRETURN_xTaskResumeFromISR + #define traceRETURN_xTaskResumeFromISR( xYieldRequired ) +#endif + +#ifndef traceENTER_vTaskStartScheduler + #define traceENTER_vTaskStartScheduler() +#endif + +#ifndef traceRETURN_vTaskStartScheduler + #define traceRETURN_vTaskStartScheduler() +#endif + +#ifndef traceENTER_vTaskEndScheduler + #define traceENTER_vTaskEndScheduler() +#endif + +#ifndef traceRETURN_vTaskEndScheduler + #define traceRETURN_vTaskEndScheduler() +#endif + +#ifndef traceENTER_vTaskSuspendAll + #define traceENTER_vTaskSuspendAll() +#endif + +#ifndef traceRETURN_vTaskSuspendAll + #define traceRETURN_vTaskSuspendAll() +#endif + +#ifndef traceENTER_xTaskResumeAll + #define traceENTER_xTaskResumeAll() +#endif + +#ifndef traceRETURN_xTaskResumeAll + #define traceRETURN_xTaskResumeAll( xAlreadyYielded ) +#endif + +#ifndef traceENTER_xTaskGetTickCount + #define traceENTER_xTaskGetTickCount() +#endif + +#ifndef traceRETURN_xTaskGetTickCount + #define traceRETURN_xTaskGetTickCount( xTicks ) +#endif + +#ifndef traceENTER_xTaskGetTickCountFromISR + #define traceENTER_xTaskGetTickCountFromISR() +#endif + +#ifndef traceRETURN_xTaskGetTickCountFromISR + #define traceRETURN_xTaskGetTickCountFromISR( xReturn ) +#endif + +#ifndef traceENTER_uxTaskGetNumberOfTasks + #define traceENTER_uxTaskGetNumberOfTasks() +#endif + +#ifndef traceRETURN_uxTaskGetNumberOfTasks + #define traceRETURN_uxTaskGetNumberOfTasks( uxCurrentNumberOfTasks ) +#endif + +#ifndef traceENTER_pcTaskGetName + #define traceENTER_pcTaskGetName( xTaskToQuery ) +#endif + +#ifndef traceRETURN_pcTaskGetName + #define traceRETURN_pcTaskGetName( pcTaskName ) +#endif + +#ifndef traceENTER_xTaskGetHandle + #define traceENTER_xTaskGetHandle( pcNameToQuery ) +#endif + +#ifndef traceRETURN_xTaskGetHandle + #define traceRETURN_xTaskGetHandle( pxTCB ) +#endif + +#ifndef traceENTER_xTaskGetStaticBuffers + #define traceENTER_xTaskGetStaticBuffers( xTask, ppuxStackBuffer, ppxTaskBuffer ) +#endif + +#ifndef traceRETURN_xTaskGetStaticBuffers + #define traceRETURN_xTaskGetStaticBuffers( xReturn ) +#endif + +#ifndef traceENTER_uxTaskGetSystemState + #define traceENTER_uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, pulTotalRunTime ) +#endif + +#ifndef traceRETURN_uxTaskGetSystemState + #define traceRETURN_uxTaskGetSystemState( uxTask ) +#endif + +#if ( configNUMBER_OF_CORES == 1 ) + #ifndef traceENTER_xTaskGetIdleTaskHandle + #define traceENTER_xTaskGetIdleTaskHandle() + #endif +#endif + +#if ( configNUMBER_OF_CORES == 1 ) + #ifndef traceRETURN_xTaskGetIdleTaskHandle + #define traceRETURN_xTaskGetIdleTaskHandle( xIdleTaskHandle ) + #endif +#endif + +#ifndef traceENTER_xTaskGetIdleTaskHandleForCore + #define traceENTER_xTaskGetIdleTaskHandleForCore( xCoreID ) +#endif + +#ifndef traceRETURN_xTaskGetIdleTaskHandleForCore + #define traceRETURN_xTaskGetIdleTaskHandleForCore( xIdleTaskHandle ) +#endif + +#ifndef traceENTER_vTaskStepTick + #define traceENTER_vTaskStepTick( xTicksToJump ) +#endif + +#ifndef traceRETURN_vTaskStepTick + #define traceRETURN_vTaskStepTick() +#endif + +#ifndef traceENTER_xTaskCatchUpTicks + #define traceENTER_xTaskCatchUpTicks( xTicksToCatchUp ) +#endif + +#ifndef traceRETURN_xTaskCatchUpTicks + #define traceRETURN_xTaskCatchUpTicks( xYieldOccurred ) +#endif + +#ifndef traceENTER_xTaskAbortDelay + #define traceENTER_xTaskAbortDelay( xTask ) +#endif + +#ifndef traceRETURN_xTaskAbortDelay + #define traceRETURN_xTaskAbortDelay( xReturn ) +#endif + +#ifndef traceENTER_xTaskIncrementTick + #define traceENTER_xTaskIncrementTick() +#endif + +#ifndef traceRETURN_xTaskIncrementTick + #define traceRETURN_xTaskIncrementTick( xSwitchRequired ) +#endif + +#ifndef traceENTER_vTaskSetApplicationTaskTag + #define traceENTER_vTaskSetApplicationTaskTag( xTask, pxHookFunction ) +#endif + +#ifndef traceRETURN_vTaskSetApplicationTaskTag + #define traceRETURN_vTaskSetApplicationTaskTag() +#endif + +#ifndef traceENTER_xTaskGetApplicationTaskTag + #define traceENTER_xTaskGetApplicationTaskTag( xTask ) +#endif + +#ifndef traceRETURN_xTaskGetApplicationTaskTag + #define traceRETURN_xTaskGetApplicationTaskTag( xReturn ) +#endif + +#ifndef traceENTER_xTaskGetApplicationTaskTagFromISR + #define traceENTER_xTaskGetApplicationTaskTagFromISR( xTask ) +#endif + +#ifndef traceRETURN_xTaskGetApplicationTaskTagFromISR + #define traceRETURN_xTaskGetApplicationTaskTagFromISR( xReturn ) +#endif + +#ifndef traceENTER_xTaskCallApplicationTaskHook + #define traceENTER_xTaskCallApplicationTaskHook( xTask, pvParameter ) +#endif + +#ifndef traceRETURN_xTaskCallApplicationTaskHook + #define traceRETURN_xTaskCallApplicationTaskHook( xReturn ) +#endif + +#ifndef traceENTER_vTaskSwitchContext + #define traceENTER_vTaskSwitchContext() +#endif + +#ifndef traceRETURN_vTaskSwitchContext + #define traceRETURN_vTaskSwitchContext() +#endif + +#ifndef traceENTER_vTaskPlaceOnEventList + #define traceENTER_vTaskPlaceOnEventList( pxEventList, xTicksToWait ) +#endif + +#ifndef traceRETURN_vTaskPlaceOnEventList + #define traceRETURN_vTaskPlaceOnEventList() +#endif + +#ifndef traceENTER_vTaskPlaceOnUnorderedEventList + #define traceENTER_vTaskPlaceOnUnorderedEventList( pxEventList, xItemValue, xTicksToWait ) +#endif + +#ifndef traceRETURN_vTaskPlaceOnUnorderedEventList + #define traceRETURN_vTaskPlaceOnUnorderedEventList() +#endif + +#ifndef traceENTER_vTaskPlaceOnEventListRestricted + #define traceENTER_vTaskPlaceOnEventListRestricted( pxEventList, xTicksToWait, xWaitIndefinitely ) +#endif + +#ifndef traceRETURN_vTaskPlaceOnEventListRestricted + #define traceRETURN_vTaskPlaceOnEventListRestricted() +#endif + +#ifndef traceENTER_xTaskRemoveFromEventList + #define traceENTER_xTaskRemoveFromEventList( pxEventList ) +#endif + +#ifndef traceRETURN_xTaskRemoveFromEventList + #define traceRETURN_xTaskRemoveFromEventList( xReturn ) +#endif + +#ifndef traceENTER_vTaskRemoveFromUnorderedEventList + #define traceENTER_vTaskRemoveFromUnorderedEventList( pxEventListItem, xItemValue ) +#endif + +#ifndef traceRETURN_vTaskRemoveFromUnorderedEventList + #define traceRETURN_vTaskRemoveFromUnorderedEventList() +#endif + +#ifndef traceENTER_vTaskSetTimeOutState + #define traceENTER_vTaskSetTimeOutState( pxTimeOut ) +#endif + +#ifndef traceRETURN_vTaskSetTimeOutState + #define traceRETURN_vTaskSetTimeOutState() +#endif + +#ifndef traceENTER_vTaskInternalSetTimeOutState + #define traceENTER_vTaskInternalSetTimeOutState( pxTimeOut ) +#endif + +#ifndef traceRETURN_vTaskInternalSetTimeOutState + #define traceRETURN_vTaskInternalSetTimeOutState() +#endif + +#ifndef traceENTER_xTaskCheckForTimeOut + #define traceENTER_xTaskCheckForTimeOut( pxTimeOut, pxTicksToWait ) +#endif + +#ifndef traceRETURN_xTaskCheckForTimeOut + #define traceRETURN_xTaskCheckForTimeOut( xReturn ) +#endif + +#ifndef traceENTER_vTaskMissedYield + #define traceENTER_vTaskMissedYield() +#endif + +#ifndef traceRETURN_vTaskMissedYield + #define traceRETURN_vTaskMissedYield() +#endif + +#ifndef traceENTER_uxTaskGetTaskNumber + #define traceENTER_uxTaskGetTaskNumber( xTask ) +#endif + +#ifndef traceRETURN_uxTaskGetTaskNumber + #define traceRETURN_uxTaskGetTaskNumber( uxReturn ) +#endif + +#ifndef traceENTER_vTaskSetTaskNumber + #define traceENTER_vTaskSetTaskNumber( xTask, uxHandle ) +#endif + +#ifndef traceRETURN_vTaskSetTaskNumber + #define traceRETURN_vTaskSetTaskNumber() +#endif + +#ifndef traceENTER_eTaskConfirmSleepModeStatus + #define traceENTER_eTaskConfirmSleepModeStatus() +#endif + +#ifndef traceRETURN_eTaskConfirmSleepModeStatus + #define traceRETURN_eTaskConfirmSleepModeStatus( eReturn ) +#endif + +#ifndef traceENTER_vTaskSetThreadLocalStoragePointer + #define traceENTER_vTaskSetThreadLocalStoragePointer( xTaskToSet, xIndex, pvValue ) +#endif + +#ifndef traceRETURN_vTaskSetThreadLocalStoragePointer + #define traceRETURN_vTaskSetThreadLocalStoragePointer() +#endif + +#ifndef traceENTER_pvTaskGetThreadLocalStoragePointer + #define traceENTER_pvTaskGetThreadLocalStoragePointer( xTaskToQuery, xIndex ) +#endif + +#ifndef traceRETURN_pvTaskGetThreadLocalStoragePointer + #define traceRETURN_pvTaskGetThreadLocalStoragePointer( pvReturn ) +#endif + +#ifndef traceENTER_vTaskAllocateMPURegions + #define traceENTER_vTaskAllocateMPURegions( xTaskToModify, pxRegions ) +#endif + +#ifndef traceRETURN_vTaskAllocateMPURegions + #define traceRETURN_vTaskAllocateMPURegions() +#endif + +#ifndef traceENTER_vTaskGetInfo + #define traceENTER_vTaskGetInfo( xTask, pxTaskStatus, xGetFreeStackSpace, eState ) +#endif + +#ifndef traceRETURN_vTaskGetInfo + #define traceRETURN_vTaskGetInfo() +#endif + +#ifndef traceENTER_uxTaskGetStackHighWaterMark2 + #define traceENTER_uxTaskGetStackHighWaterMark2( xTask ) +#endif + +#ifndef traceRETURN_uxTaskGetStackHighWaterMark2 + #define traceRETURN_uxTaskGetStackHighWaterMark2( uxReturn ) +#endif + +#ifndef traceENTER_uxTaskGetStackHighWaterMark + #define traceENTER_uxTaskGetStackHighWaterMark( xTask ) +#endif + +#ifndef traceRETURN_uxTaskGetStackHighWaterMark + #define traceRETURN_uxTaskGetStackHighWaterMark( uxReturn ) +#endif + +#ifndef traceENTER_xTaskGetCurrentTaskHandle + #define traceENTER_xTaskGetCurrentTaskHandle() +#endif + +#ifndef traceRETURN_xTaskGetCurrentTaskHandle + #define traceRETURN_xTaskGetCurrentTaskHandle( xReturn ) +#endif + +#ifndef traceENTER_xTaskGetCurrentTaskHandleForCore + #define traceENTER_xTaskGetCurrentTaskHandleForCore( xCoreID ) +#endif + +#ifndef traceRETURN_xTaskGetCurrentTaskHandleForCore + #define traceRETURN_xTaskGetCurrentTaskHandleForCore( xReturn ) +#endif + +#ifndef traceENTER_xTaskGetSchedulerState + #define traceENTER_xTaskGetSchedulerState() +#endif + +#ifndef traceRETURN_xTaskGetSchedulerState + #define traceRETURN_xTaskGetSchedulerState( xReturn ) +#endif + +#ifndef traceENTER_xTaskPriorityInherit + #define traceENTER_xTaskPriorityInherit( pxMutexHolder ) +#endif + +#ifndef traceRETURN_xTaskPriorityInherit + #define traceRETURN_xTaskPriorityInherit( xReturn ) +#endif + +#ifndef traceENTER_xTaskPriorityDisinherit + #define traceENTER_xTaskPriorityDisinherit( pxMutexHolder ) +#endif + +#ifndef traceRETURN_xTaskPriorityDisinherit + #define traceRETURN_xTaskPriorityDisinherit( xReturn ) +#endif + +#ifndef traceENTER_vTaskPriorityDisinheritAfterTimeout + #define traceENTER_vTaskPriorityDisinheritAfterTimeout( pxMutexHolder, uxHighestPriorityWaitingTask ) +#endif + +#ifndef traceRETURN_vTaskPriorityDisinheritAfterTimeout + #define traceRETURN_vTaskPriorityDisinheritAfterTimeout() +#endif + +#ifndef traceENTER_vTaskYieldWithinAPI + #define traceENTER_vTaskYieldWithinAPI() +#endif + +#ifndef traceRETURN_vTaskYieldWithinAPI + #define traceRETURN_vTaskYieldWithinAPI() +#endif + +#ifndef traceENTER_vTaskEnterCritical + #define traceENTER_vTaskEnterCritical() +#endif + +#ifndef traceRETURN_vTaskEnterCritical + #define traceRETURN_vTaskEnterCritical() +#endif + +#ifndef traceENTER_vTaskEnterCriticalFromISR + #define traceENTER_vTaskEnterCriticalFromISR() +#endif + +#ifndef traceRETURN_vTaskEnterCriticalFromISR + #define traceRETURN_vTaskEnterCriticalFromISR( uxSavedInterruptStatus ) +#endif + +#ifndef traceENTER_vTaskExitCritical + #define traceENTER_vTaskExitCritical() +#endif + +#ifndef traceRETURN_vTaskExitCritical + #define traceRETURN_vTaskExitCritical() +#endif + +#ifndef traceENTER_vTaskExitCriticalFromISR + #define traceENTER_vTaskExitCriticalFromISR( uxSavedInterruptStatus ) +#endif + +#ifndef traceRETURN_vTaskExitCriticalFromISR + #define traceRETURN_vTaskExitCriticalFromISR() +#endif + +#ifndef traceENTER_vTaskListTasks + #define traceENTER_vTaskListTasks( pcWriteBuffer, uxBufferLength ) +#endif + +#ifndef traceRETURN_vTaskListTasks + #define traceRETURN_vTaskListTasks() +#endif + +#ifndef traceENTER_vTaskGetRunTimeStatistics + #define traceENTER_vTaskGetRunTimeStatistics( pcWriteBuffer, uxBufferLength ) +#endif + +#ifndef traceRETURN_vTaskGetRunTimeStatistics + #define traceRETURN_vTaskGetRunTimeStatistics() +#endif + +#ifndef traceENTER_uxTaskResetEventItemValue + #define traceENTER_uxTaskResetEventItemValue() +#endif + +#ifndef traceRETURN_uxTaskResetEventItemValue + #define traceRETURN_uxTaskResetEventItemValue( uxReturn ) +#endif + +#ifndef traceENTER_pvTaskIncrementMutexHeldCount + #define traceENTER_pvTaskIncrementMutexHeldCount() +#endif + +#ifndef traceRETURN_pvTaskIncrementMutexHeldCount + #define traceRETURN_pvTaskIncrementMutexHeldCount( pxTCB ) +#endif + +#ifndef traceENTER_ulTaskGenericNotifyTake + #define traceENTER_ulTaskGenericNotifyTake( uxIndexToWaitOn, xClearCountOnExit, xTicksToWait ) +#endif + +#ifndef traceRETURN_ulTaskGenericNotifyTake + #define traceRETURN_ulTaskGenericNotifyTake( ulReturn ) +#endif + +#ifndef traceENTER_xTaskGenericNotifyWait + #define traceENTER_xTaskGenericNotifyWait( uxIndexToWaitOn, ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait ) +#endif + +#ifndef traceRETURN_xTaskGenericNotifyWait + #define traceRETURN_xTaskGenericNotifyWait( xReturn ) +#endif + +#ifndef traceENTER_xTaskGenericNotify + #define traceENTER_xTaskGenericNotify( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pulPreviousNotificationValue ) +#endif + +#ifndef traceRETURN_xTaskGenericNotify + #define traceRETURN_xTaskGenericNotify( xReturn ) +#endif + +#ifndef traceENTER_xTaskGenericNotifyFromISR + #define traceENTER_xTaskGenericNotifyFromISR( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pulPreviousNotificationValue, pxHigherPriorityTaskWoken ) +#endif + +#ifndef traceRETURN_xTaskGenericNotifyFromISR + #define traceRETURN_xTaskGenericNotifyFromISR( xReturn ) +#endif + +#ifndef traceENTER_vTaskGenericNotifyGiveFromISR + #define traceENTER_vTaskGenericNotifyGiveFromISR( xTaskToNotify, uxIndexToNotify, pxHigherPriorityTaskWoken ) +#endif + +#ifndef traceRETURN_vTaskGenericNotifyGiveFromISR + #define traceRETURN_vTaskGenericNotifyGiveFromISR() +#endif + +#ifndef traceENTER_xTaskGenericNotifyStateClear + #define traceENTER_xTaskGenericNotifyStateClear( xTask, uxIndexToClear ) +#endif + +#ifndef traceRETURN_xTaskGenericNotifyStateClear + #define traceRETURN_xTaskGenericNotifyStateClear( xReturn ) +#endif + +#ifndef traceENTER_ulTaskGenericNotifyValueClear + #define traceENTER_ulTaskGenericNotifyValueClear( xTask, uxIndexToClear, ulBitsToClear ) +#endif + +#ifndef traceRETURN_ulTaskGenericNotifyValueClear + #define traceRETURN_ulTaskGenericNotifyValueClear( ulReturn ) +#endif + +#ifndef traceENTER_ulTaskGetRunTimeCounter + #define traceENTER_ulTaskGetRunTimeCounter( xTask ) +#endif + +#ifndef traceRETURN_ulTaskGetRunTimeCounter + #define traceRETURN_ulTaskGetRunTimeCounter( ulRunTimeCounter ) +#endif + +#ifndef traceENTER_ulTaskGetRunTimePercent + #define traceENTER_ulTaskGetRunTimePercent( xTask ) +#endif + +#ifndef traceRETURN_ulTaskGetRunTimePercent + #define traceRETURN_ulTaskGetRunTimePercent( ulReturn ) +#endif + +#ifndef traceENTER_ulTaskGetIdleRunTimeCounter + #define traceENTER_ulTaskGetIdleRunTimeCounter() +#endif + +#ifndef traceRETURN_ulTaskGetIdleRunTimeCounter + #define traceRETURN_ulTaskGetIdleRunTimeCounter( ulReturn ) +#endif + +#ifndef traceENTER_ulTaskGetIdleRunTimePercent + #define traceENTER_ulTaskGetIdleRunTimePercent() +#endif + +#ifndef traceRETURN_ulTaskGetIdleRunTimePercent + #define traceRETURN_ulTaskGetIdleRunTimePercent( ulReturn ) +#endif + +#ifndef traceENTER_xTaskGetMPUSettings + #define traceENTER_xTaskGetMPUSettings( xTask ) +#endif + +#ifndef traceRETURN_xTaskGetMPUSettings + #define traceRETURN_xTaskGetMPUSettings( xMPUSettings ) +#endif + +#ifndef traceENTER_xStreamBufferGenericCreate + #define traceENTER_xStreamBufferGenericCreate( xBufferSizeBytes, xTriggerLevelBytes, xIsMessageBuffer, pxSendCompletedCallback, pxReceiveCompletedCallback ) +#endif + +#ifndef traceRETURN_xStreamBufferGenericCreate + #define traceRETURN_xStreamBufferGenericCreate( pvAllocatedMemory ) +#endif + +#ifndef traceENTER_xStreamBufferGenericCreateStatic + #define traceENTER_xStreamBufferGenericCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, xIsMessageBuffer, pucStreamBufferStorageArea, pxStaticStreamBuffer, pxSendCompletedCallback, pxReceiveCompletedCallback ) +#endif + +#ifndef traceRETURN_xStreamBufferGenericCreateStatic + #define traceRETURN_xStreamBufferGenericCreateStatic( xReturn ) +#endif + +#ifndef traceENTER_xStreamBufferGetStaticBuffers + #define traceENTER_xStreamBufferGetStaticBuffers( xStreamBuffer, ppucStreamBufferStorageArea, ppxStaticStreamBuffer ) +#endif + +#ifndef traceRETURN_xStreamBufferGetStaticBuffers + #define traceRETURN_xStreamBufferGetStaticBuffers( xReturn ) +#endif + +#ifndef traceENTER_vStreamBufferDelete + #define traceENTER_vStreamBufferDelete( xStreamBuffer ) +#endif + +#ifndef traceRETURN_vStreamBufferDelete + #define traceRETURN_vStreamBufferDelete() +#endif + +#ifndef traceENTER_xStreamBufferReset + #define traceENTER_xStreamBufferReset( xStreamBuffer ) +#endif + +#ifndef traceRETURN_xStreamBufferReset + #define traceRETURN_xStreamBufferReset( xReturn ) +#endif + +#ifndef traceENTER_xStreamBufferSetTriggerLevel + #define traceENTER_xStreamBufferSetTriggerLevel( xStreamBuffer, xTriggerLevel ) +#endif + +#ifndef traceRETURN_xStreamBufferSetTriggerLevel + #define traceRETURN_xStreamBufferSetTriggerLevel( xReturn ) +#endif + +#ifndef traceENTER_xStreamBufferSpacesAvailable + #define traceENTER_xStreamBufferSpacesAvailable( xStreamBuffer ) +#endif + +#ifndef traceRETURN_xStreamBufferSpacesAvailable + #define traceRETURN_xStreamBufferSpacesAvailable( xSpace ) +#endif + +#ifndef traceENTER_xStreamBufferBytesAvailable + #define traceENTER_xStreamBufferBytesAvailable( xStreamBuffer ) +#endif + +#ifndef traceRETURN_xStreamBufferBytesAvailable + #define traceRETURN_xStreamBufferBytesAvailable( xReturn ) +#endif + +#ifndef traceENTER_xStreamBufferSend + #define traceENTER_xStreamBufferSend( xStreamBuffer, pvTxData, xDataLengthBytes, xTicksToWait ) +#endif + +#ifndef traceRETURN_xStreamBufferSend + #define traceRETURN_xStreamBufferSend( xReturn ) +#endif + +#ifndef traceENTER_xStreamBufferSendFromISR + #define traceENTER_xStreamBufferSendFromISR( xStreamBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken ) +#endif + +#ifndef traceRETURN_xStreamBufferSendFromISR + #define traceRETURN_xStreamBufferSendFromISR( xReturn ) +#endif + +#ifndef traceENTER_xStreamBufferReceive + #define traceENTER_xStreamBufferReceive( xStreamBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ) +#endif + +#ifndef traceRETURN_xStreamBufferReceive + #define traceRETURN_xStreamBufferReceive( xReceivedLength ) +#endif + +#ifndef traceENTER_xStreamBufferNextMessageLengthBytes + #define traceENTER_xStreamBufferNextMessageLengthBytes( xStreamBuffer ) +#endif + +#ifndef traceRETURN_xStreamBufferNextMessageLengthBytes + #define traceRETURN_xStreamBufferNextMessageLengthBytes( xReturn ) +#endif + +#ifndef traceENTER_xStreamBufferReceiveFromISR + #define traceENTER_xStreamBufferReceiveFromISR( xStreamBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken ) +#endif + +#ifndef traceRETURN_xStreamBufferReceiveFromISR + #define traceRETURN_xStreamBufferReceiveFromISR( xReceivedLength ) +#endif + +#ifndef traceENTER_xStreamBufferIsEmpty + #define traceENTER_xStreamBufferIsEmpty( xStreamBuffer ) +#endif + +#ifndef traceRETURN_xStreamBufferIsEmpty + #define traceRETURN_xStreamBufferIsEmpty( xReturn ) +#endif + +#ifndef traceENTER_xStreamBufferIsFull + #define traceENTER_xStreamBufferIsFull( xStreamBuffer ) +#endif + +#ifndef traceRETURN_xStreamBufferIsFull + #define traceRETURN_xStreamBufferIsFull( xReturn ) +#endif + +#ifndef traceENTER_xStreamBufferSendCompletedFromISR + #define traceENTER_xStreamBufferSendCompletedFromISR( xStreamBuffer, pxHigherPriorityTaskWoken ) +#endif + +#ifndef traceRETURN_xStreamBufferSendCompletedFromISR + #define traceRETURN_xStreamBufferSendCompletedFromISR( xReturn ) +#endif + +#ifndef traceENTER_xStreamBufferReceiveCompletedFromISR + #define traceENTER_xStreamBufferReceiveCompletedFromISR( xStreamBuffer, pxHigherPriorityTaskWoken ) +#endif + +#ifndef traceRETURN_xStreamBufferReceiveCompletedFromISR + #define traceRETURN_xStreamBufferReceiveCompletedFromISR( xReturn ) +#endif + +#ifndef traceENTER_uxStreamBufferGetStreamBufferNumber + #define traceENTER_uxStreamBufferGetStreamBufferNumber( xStreamBuffer ) +#endif + +#ifndef traceRETURN_uxStreamBufferGetStreamBufferNumber + #define traceRETURN_uxStreamBufferGetStreamBufferNumber( uxStreamBufferNumber ) +#endif + +#ifndef traceENTER_vStreamBufferSetStreamBufferNumber + #define traceENTER_vStreamBufferSetStreamBufferNumber( xStreamBuffer, uxStreamBufferNumber ) +#endif + +#ifndef traceRETURN_vStreamBufferSetStreamBufferNumber + #define traceRETURN_vStreamBufferSetStreamBufferNumber() +#endif + +#ifndef traceENTER_ucStreamBufferGetStreamBufferType + #define traceENTER_ucStreamBufferGetStreamBufferType( xStreamBuffer ) +#endif + +#ifndef traceRETURN_ucStreamBufferGetStreamBufferType + #define traceRETURN_ucStreamBufferGetStreamBufferType( ucStreamBufferType ) +#endif + +#ifndef traceENTER_vListInitialise + #define traceENTER_vListInitialise( pxList ) +#endif + +#ifndef traceRETURN_vListInitialise + #define traceRETURN_vListInitialise() +#endif + +#ifndef traceENTER_vListInitialiseItem + #define traceENTER_vListInitialiseItem( pxItem ) +#endif + +#ifndef traceRETURN_vListInitialiseItem + #define traceRETURN_vListInitialiseItem() +#endif + +#ifndef traceENTER_vListInsertEnd + #define traceENTER_vListInsertEnd( pxList, pxNewListItem ) +#endif + +#ifndef traceRETURN_vListInsertEnd + #define traceRETURN_vListInsertEnd() +#endif + +#ifndef traceENTER_vListInsert + #define traceENTER_vListInsert( pxList, pxNewListItem ) +#endif + +#ifndef traceRETURN_vListInsert + #define traceRETURN_vListInsert() +#endif + +#ifndef traceENTER_uxListRemove + #define traceENTER_uxListRemove( pxItemToRemove ) +#endif + +#ifndef traceRETURN_uxListRemove + #define traceRETURN_uxListRemove( uxNumberOfItems ) +#endif + +#ifndef traceENTER_xCoRoutineCreate + #define traceENTER_xCoRoutineCreate( pxCoRoutineCode, uxPriority, uxIndex ) +#endif + +#ifndef traceRETURN_xCoRoutineCreate + #define traceRETURN_xCoRoutineCreate( xReturn ) +#endif + +#ifndef traceENTER_vCoRoutineAddToDelayedList + #define traceENTER_vCoRoutineAddToDelayedList( xTicksToDelay, pxEventList ) +#endif + +#ifndef traceRETURN_vCoRoutineAddToDelayedList + #define traceRETURN_vCoRoutineAddToDelayedList() +#endif + +#ifndef traceENTER_vCoRoutineSchedule + #define traceENTER_vCoRoutineSchedule() +#endif + +#ifndef traceRETURN_vCoRoutineSchedule + #define traceRETURN_vCoRoutineSchedule() +#endif + +#ifndef traceENTER_xCoRoutineRemoveFromEventList + #define traceENTER_xCoRoutineRemoveFromEventList( pxEventList ) +#endif + +#ifndef traceRETURN_xCoRoutineRemoveFromEventList + #define traceRETURN_xCoRoutineRemoveFromEventList( xReturn ) +#endif + +/* << EST ---------------------------------------------------------------------------------- */ +#if 1 /* << EST additional trace entries used by Segger SystemView */ +#ifndef INCLUDE_pxTaskGetStackStart + #define INCLUDE_pxTaskGetStackStart 0 +#endif + +#ifndef traceREADDED_TASK_TO_READY_STATE + #define traceREADDED_TASK_TO_READY_STATE( pxTCB ) traceMOVED_TASK_TO_READY_STATE( pxTCB ) +#endif + +#ifndef traceISR_ENTER + #define traceISR_ENTER() +#endif + +#ifndef traceISR_EXIT_TO_SCHEDULER + #define traceISR_EXIT_TO_SCHEDULER() +#endif + +#ifndef traceISR_EXIT + #define traceISR_EXIT() +#endif + +#ifndef traceMOVED_TASK_TO_SUSPENDED_LIST + #define traceMOVED_TASK_TO_SUSPENDED_LIST(x) +#endif + +#ifndef traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST + #define traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST() +#endif + +#ifndef traceMOVED_TASK_TO_DELAYED_LIST + #define traceMOVED_TASK_TO_DELAYED_LIST() +#endif + +#endif /* << EST */ +/* << EST ---------------------------------------------------------------------------------- */ + + +#ifndef configGENERATE_RUN_TIME_STATS + #define configGENERATE_RUN_TIME_STATS 0 +#endif + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + + #ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS + #error If configGENERATE_RUN_TIME_STATS is defined then portCONFIGURE_TIMER_FOR_RUN_TIME_STATS must also be defined. portCONFIGURE_TIMER_FOR_RUN_TIME_STATS should call a port layer function to setup a peripheral timer/counter that can then be used as the run time counter time base. + #endif /* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS */ + + #ifndef portGET_RUN_TIME_COUNTER_VALUE + #ifndef portALT_GET_RUN_TIME_COUNTER_VALUE + #error If configGENERATE_RUN_TIME_STATS is defined then either portGET_RUN_TIME_COUNTER_VALUE or portALT_GET_RUN_TIME_COUNTER_VALUE must also be defined. See the examples provided and the FreeRTOS web site for more information. + #endif /* portALT_GET_RUN_TIME_COUNTER_VALUE */ + #endif /* portGET_RUN_TIME_COUNTER_VALUE */ + +#endif /* configGENERATE_RUN_TIME_STATS */ + +#ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS + #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() +#endif + +#ifndef configUSE_MALLOC_FAILED_HOOK + #define configUSE_MALLOC_FAILED_HOOK 0 +#endif + +#ifndef portPRIVILEGE_BIT + #define portPRIVILEGE_BIT ( ( UBaseType_t ) 0x00 ) +#endif + +#ifndef portYIELD_WITHIN_API + #define portYIELD_WITHIN_API portYIELD +#endif + +#ifndef portSUPPRESS_TICKS_AND_SLEEP + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) +#endif + +#ifndef configEXPECTED_IDLE_TIME_BEFORE_SLEEP + #define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2 +#endif + +#if configEXPECTED_IDLE_TIME_BEFORE_SLEEP < 2 + #error configEXPECTED_IDLE_TIME_BEFORE_SLEEP must not be less than 2 +#endif + +#ifndef configUSE_TICKLESS_IDLE + #define configUSE_TICKLESS_IDLE 0 +#endif + +#ifndef configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING + #define configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( x ) +#endif + +#ifndef configPRE_SLEEP_PROCESSING + #define configPRE_SLEEP_PROCESSING( x ) +#endif + +#ifndef configPOST_SLEEP_PROCESSING + #define configPOST_SLEEP_PROCESSING( x ) +#endif + +#ifndef configUSE_QUEUE_SETS + #define configUSE_QUEUE_SETS 0 +#endif + +#ifndef portTASK_USES_FLOATING_POINT + #define portTASK_USES_FLOATING_POINT() +#endif + +#ifndef portALLOCATE_SECURE_CONTEXT + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) +#endif + +#ifndef portDONT_DISCARD + #define portDONT_DISCARD +#endif + +#ifndef configUSE_TIME_SLICING + #define configUSE_TIME_SLICING 1 +#endif + +#ifndef configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS + #define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0 +#endif + +#ifndef configUSE_STATS_FORMATTING_FUNCTIONS + #define configUSE_STATS_FORMATTING_FUNCTIONS 0 +#endif + +#ifndef portASSERT_IF_INTERRUPT_PRIORITY_INVALID + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() +#endif + +#ifndef configUSE_TRACE_FACILITY + #define configUSE_TRACE_FACILITY 0 +#endif + +#ifndef mtCOVERAGE_TEST_MARKER + #define mtCOVERAGE_TEST_MARKER() +#endif + +#ifndef mtCOVERAGE_TEST_DELAY + #define mtCOVERAGE_TEST_DELAY() +#endif + +#ifndef portASSERT_IF_IN_ISR + #define portASSERT_IF_IN_ISR() +#endif + +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 +#endif + +#ifndef configAPPLICATION_ALLOCATED_HEAP + #define configAPPLICATION_ALLOCATED_HEAP 0 +#endif + +#ifndef configENABLE_HEAP_PROTECTOR + #define configENABLE_HEAP_PROTECTOR 0 +#endif + +#ifndef configUSE_TASK_NOTIFICATIONS + #define configUSE_TASK_NOTIFICATIONS 1 +#endif + +#ifndef configTASK_NOTIFICATION_ARRAY_ENTRIES + #define configTASK_NOTIFICATION_ARRAY_ENTRIES 1 +#endif + +#if configTASK_NOTIFICATION_ARRAY_ENTRIES < 1 + #error configTASK_NOTIFICATION_ARRAY_ENTRIES must be at least 1 +#endif + +#ifndef configUSE_POSIX_ERRNO + #define configUSE_POSIX_ERRNO 0 +#endif + +#ifndef configUSE_SB_COMPLETED_CALLBACK + +/* By default per-instance callbacks are not enabled for stream buffer or message buffer. */ + #define configUSE_SB_COMPLETED_CALLBACK 0 +#endif + +#ifndef portTICK_TYPE_IS_ATOMIC + #define portTICK_TYPE_IS_ATOMIC 0 +#endif + +#ifndef configSUPPORT_STATIC_ALLOCATION + /* Defaults to 0 for backward compatibility. */ + #define configSUPPORT_STATIC_ALLOCATION 0 +#endif + +#ifndef configKERNEL_PROVIDED_STATIC_MEMORY + #define configKERNEL_PROVIDED_STATIC_MEMORY 0 +#endif + +#ifndef configSUPPORT_DYNAMIC_ALLOCATION + /* Defaults to 1 for backward compatibility. */ + #define configSUPPORT_DYNAMIC_ALLOCATION 1 +#endif + +#if ( ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION != 1 ) ) + #error configUSE_STATS_FORMATTING_FUNCTIONS cannot be used without dynamic allocation, but configSUPPORT_DYNAMIC_ALLOCATION is not set to 1. +#endif + +#if ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) + #if ( ( configUSE_TRACE_FACILITY != 1 ) && ( configGENERATE_RUN_TIME_STATS != 1 ) ) + #error configUSE_STATS_FORMATTING_FUNCTIONS is 1 but the functions it enables are not used because neither configUSE_TRACE_FACILITY or configGENERATE_RUN_TIME_STATS are 1. Set configUSE_STATS_FORMATTING_FUNCTIONS to 0 in FreeRTOSConfig.h. + #endif +#endif + +#ifndef configSTATS_BUFFER_MAX_LENGTH + #define configSTATS_BUFFER_MAX_LENGTH 0xFFFF +#endif + +#ifndef configSTACK_DEPTH_TYPE + +/* Defaults to uint16_t for backward compatibility, but can be overridden + * in FreeRTOSConfig.h if uint16_t is too restrictive. */ + #define configSTACK_DEPTH_TYPE uint16_t +#endif + +#ifndef configRUN_TIME_COUNTER_TYPE + +/* Defaults to uint32_t for backward compatibility, but can be overridden in + * FreeRTOSConfig.h if uint32_t is too restrictive. */ + + #define configRUN_TIME_COUNTER_TYPE uint32_t +#endif + +#ifndef configMESSAGE_BUFFER_LENGTH_TYPE + +/* Defaults to size_t for backward compatibility, but can be overridden + * in FreeRTOSConfig.h if lengths will always be less than the number of bytes + * in a size_t. */ + #define configMESSAGE_BUFFER_LENGTH_TYPE size_t +#endif + +/* Sanity check the configuration. */ +#if ( ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) ) + #error configSUPPORT_STATIC_ALLOCATION and configSUPPORT_DYNAMIC_ALLOCATION cannot both be 0, but can both be 1. +#endif + +#if ( ( configUSE_RECURSIVE_MUTEXES == 1 ) && ( configUSE_MUTEXES != 1 ) ) + #error configUSE_MUTEXES must be set to 1 to use recursive mutexes +#endif + +#if ( ( configRUN_MULTIPLE_PRIORITIES == 0 ) && ( configUSE_TASK_PREEMPTION_DISABLE != 0 ) ) + #error configRUN_MULTIPLE_PRIORITIES must be set to 1 to use task preemption disable +#endif + +#if ( ( configUSE_PREEMPTION == 0 ) && ( configUSE_TASK_PREEMPTION_DISABLE != 0 ) ) + #error configUSE_PREEMPTION must be set to 1 to use task preemption disable +#endif + +#if ( ( configNUMBER_OF_CORES == 1 ) && ( configUSE_TASK_PREEMPTION_DISABLE != 0 ) ) + #error configUSE_TASK_PREEMPTION_DISABLE is not supported in single core FreeRTOS +#endif + +#if ( ( configNUMBER_OF_CORES == 1 ) && ( configUSE_CORE_AFFINITY != 0 ) ) + #error configUSE_CORE_AFFINITY is not supported in single core FreeRTOS +#endif + +#if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_PORT_OPTIMISED_TASK_SELECTION != 0 ) ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION is not supported in SMP FreeRTOS +#endif + +#ifndef configINITIAL_TICK_COUNT + #define configINITIAL_TICK_COUNT 0 +#endif + +#if ( portTICK_TYPE_IS_ATOMIC == 0 ) + +/* Either variables of tick type cannot be read atomically, or + * portTICK_TYPE_IS_ATOMIC was not set - map the critical sections used when + * the tick count is returned to the standard critical section macros. */ + #define portTICK_TYPE_ENTER_CRITICAL() portENTER_CRITICAL() + #define portTICK_TYPE_EXIT_CRITICAL() portEXIT_CRITICAL() + #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR() + #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( ( x ) ) +#else + +/* The tick type can be read atomically, so critical sections used when the + * tick count is returned can be defined away. */ + #define portTICK_TYPE_ENTER_CRITICAL() + #define portTICK_TYPE_EXIT_CRITICAL() + #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() 0 + #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) ( void ) ( x ) +#endif /* if ( portTICK_TYPE_IS_ATOMIC == 0 ) */ + +/* Definitions to allow backward compatibility with FreeRTOS versions prior to + * V8 if desired. */ +#ifndef configENABLE_BACKWARD_COMPATIBILITY + #define configENABLE_BACKWARD_COMPATIBILITY 1 +#endif + +#ifndef configPRINTF + +/* configPRINTF() was not defined, so define it away to nothing. To use + * configPRINTF() then define it as follows (where MyPrintFunction() is + * provided by the application writer): + * + * void MyPrintFunction(const char *pcFormat, ... ); + #define configPRINTF( X ) MyPrintFunction X + * + * Then call like a standard printf() function, but placing brackets around + * all parameters so they are passed as a single parameter. For example: + * configPRINTF( ("Value = %d", MyVariable) ); */ + #define configPRINTF( X ) +#endif + +#ifndef configMAX + +/* The application writer has not provided their own MAX macro, so define + * the following generic implementation. */ + #define configMAX( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) ) +#endif + +#ifndef configMIN + +/* The application writer has not provided their own MIN macro, so define + * the following generic implementation. */ + #define configMIN( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) ) +#endif + +#if configENABLE_BACKWARD_COMPATIBILITY == 1 + #define eTaskStateGet eTaskGetState + #define portTickType TickType_t + #define xTaskHandle TaskHandle_t + #define xQueueHandle QueueHandle_t + #define xSemaphoreHandle SemaphoreHandle_t + #define xQueueSetHandle QueueSetHandle_t + #define xQueueSetMemberHandle QueueSetMemberHandle_t + #define xTimeOutType TimeOut_t + #define xMemoryRegion MemoryRegion_t + #define xTaskParameters TaskParameters_t + #define xTaskStatusType TaskStatus_t + #define xTimerHandle TimerHandle_t + #define xCoRoutineHandle CoRoutineHandle_t + #define pdTASK_HOOK_CODE TaskHookFunction_t + #define portTICK_RATE_MS portTICK_PERIOD_MS + #define pcTaskGetTaskName pcTaskGetName + #define pcTimerGetTimerName pcTimerGetName + #define pcQueueGetQueueName pcQueueGetName + #define vTaskGetTaskInfo vTaskGetInfo + #define xTaskGetIdleRunTimeCounter ulTaskGetIdleRunTimeCounter + +/* Backward compatibility within the scheduler code only - these definitions + * are not really required but are included for completeness. */ + #define tmrTIMER_CALLBACK TimerCallbackFunction_t + #define pdTASK_CODE TaskFunction_t + #define xListItem ListItem_t + #define xList List_t + +/* For libraries that break the list data hiding, and access list structure + * members directly (which is not supposed to be done). */ + #define pxContainer pvContainer +#endif /* configENABLE_BACKWARD_COMPATIBILITY */ + +#if ( configUSE_ALTERNATIVE_API != 0 ) + #error The alternative API was deprecated some time ago, and was removed in FreeRTOS V9.0 0 +#endif + +/* Set configUSE_TASK_FPU_SUPPORT to 0 to omit floating point support even + * if floating point hardware is otherwise supported by the FreeRTOS port in use. + * This constant is not supported by all FreeRTOS ports that include floating + * point support. */ +#ifndef configUSE_TASK_FPU_SUPPORT + #define configUSE_TASK_FPU_SUPPORT 1 +#endif + +/* Set configENABLE_MPU to 1 to enable MPU support and 0 to disable it. This is + * currently used in ARMv8M ports. */ +#ifndef configENABLE_MPU + #define configENABLE_MPU 0 +#endif + +/* Set configENABLE_FPU to 1 to enable FPU support and 0 to disable it. This is + * currently used in ARMv8M ports. */ +#ifndef configENABLE_FPU + #define configENABLE_FPU 1 +#endif + +/* Set configENABLE_MVE to 1 to enable MVE support and 0 to disable it. This is + * currently used in ARMv8M ports. */ +#ifndef configENABLE_MVE + #define configENABLE_MVE 0 +#endif + +/* Set configENABLE_TRUSTZONE to 1 enable TrustZone support and 0 to disable it. + * This is currently used in ARMv8M ports. */ +#ifndef configENABLE_TRUSTZONE + #define configENABLE_TRUSTZONE 1 +#endif + +/* Set configRUN_FREERTOS_SECURE_ONLY to 1 to run the FreeRTOS ARMv8M port on + * the Secure Side only. */ +#ifndef configRUN_FREERTOS_SECURE_ONLY + #define configRUN_FREERTOS_SECURE_ONLY 0 +#endif + +#ifndef configRUN_ADDITIONAL_TESTS + #define configRUN_ADDITIONAL_TESTS 0 +#endif + +/* The following config allows infinite loop control. For example, control the + * infinite loop in idle task function when performing unit tests. */ +#ifndef configCONTROL_INFINITE_LOOP + #define configCONTROL_INFINITE_LOOP() +#endif + +/* Sometimes the FreeRTOSConfig.h settings only allow a task to be created using + * dynamically allocated RAM, in which case when any task is deleted it is known + * that both the task's stack and TCB need to be freed. Sometimes the + * FreeRTOSConfig.h settings only allow a task to be created using statically + * allocated RAM, in which case when any task is deleted it is known that neither + * the task's stack or TCB should be freed. Sometimes the FreeRTOSConfig.h + * settings allow a task to be created using either statically or dynamically + * allocated RAM, in which case a member of the TCB is used to record whether the + * stack and/or TCB were allocated statically or dynamically, so when a task is + * deleted the RAM that was allocated dynamically is freed again and no attempt is + * made to free the RAM that was allocated statically. + * tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE is only true if it is possible for a + * task to be created using either statically or dynamically allocated RAM. Note + * that if portUSING_MPU_WRAPPERS is 1 then a protected task can be created with + * a statically allocated stack and a dynamically allocated TCB. + * + * The following table lists various combinations of portUSING_MPU_WRAPPERS, + * configSUPPORT_DYNAMIC_ALLOCATION and configSUPPORT_STATIC_ALLOCATION and + * when it is possible to have both static and dynamic allocation: + * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+ + * | MPU | Dynamic | Static | Available Functions | Possible Allocations | Both Dynamic and | Need Free | + * | | | | | | Static Possible | | + * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+ + * | 0 | 0 | 1 | xTaskCreateStatic | TCB - Static, Stack - Static | No | No | + * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| + * | 0 | 1 | 0 | xTaskCreate | TCB - Dynamic, Stack - Dynamic | No | Yes | + * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| + * | 0 | 1 | 1 | xTaskCreate, | 1. TCB - Dynamic, Stack - Dynamic | Yes | Yes | + * | | | | xTaskCreateStatic | 2. TCB - Static, Stack - Static | | | + * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| + * | 1 | 0 | 1 | xTaskCreateStatic, | TCB - Static, Stack - Static | No | No | + * | | | | xTaskCreateRestrictedStatic | | | | + * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| + * | 1 | 1 | 0 | xTaskCreate, | 1. TCB - Dynamic, Stack - Dynamic | Yes | Yes | + * | | | | xTaskCreateRestricted | 2. TCB - Dynamic, Stack - Static | | | + * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| + * | 1 | 1 | 1 | xTaskCreate, | 1. TCB - Dynamic, Stack - Dynamic | Yes | Yes | + * | | | | xTaskCreateStatic, | 2. TCB - Dynamic, Stack - Static | | | + * | | | | xTaskCreateRestricted, | 3. TCB - Static, Stack - Static | | | + * | | | | xTaskCreateRestrictedStatic | | | | + * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+ + */ +#define tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE \ + ( ( ( portUSING_MPU_WRAPPERS == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) || \ + ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) ) + +/* + * In line with software engineering best practice, FreeRTOS implements a strict + * data hiding policy, so the real structures used by FreeRTOS to maintain the + * state of tasks, queues, semaphores, etc. are not accessible to the application + * code. However, if the application writer wants to statically allocate such + * an object then the size of the object needs to be known. Dummy structures + * that are guaranteed to have the same size and alignment requirements of the + * real objects are used for this purpose. The dummy list and list item + * structures below are used for inclusion in such a dummy structure. + */ +struct xSTATIC_LIST_ITEM +{ + #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy1; + #endif + TickType_t xDummy2; + void * pvDummy3[ 4 ]; + #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy4; + #endif +}; +typedef struct xSTATIC_LIST_ITEM StaticListItem_t; + +#if ( configUSE_MINI_LIST_ITEM == 1 ) + /* See the comments above the struct xSTATIC_LIST_ITEM definition. */ + struct xSTATIC_MINI_LIST_ITEM + { + #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy1; + #endif + TickType_t xDummy2; + void * pvDummy3[ 2 ]; + }; + typedef struct xSTATIC_MINI_LIST_ITEM StaticMiniListItem_t; +#else /* if ( configUSE_MINI_LIST_ITEM == 1 ) */ + typedef struct xSTATIC_LIST_ITEM StaticMiniListItem_t; +#endif /* if ( configUSE_MINI_LIST_ITEM == 1 ) */ + +/* See the comments above the struct xSTATIC_LIST_ITEM definition. */ +typedef struct xSTATIC_LIST +{ + #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy1; + #endif + UBaseType_t uxDummy2; + void * pvDummy3; + StaticMiniListItem_t xDummy4; + #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy5; + #endif +} StaticList_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the Task structure used internally by + * FreeRTOS is not accessible to application code. However, if the application + * writer wants to statically allocate the memory required to create a task then + * the size of the task object needs to be known. The StaticTask_t structure + * below is provided for this purpose. Its sizes and alignment requirements are + * guaranteed to match those of the genuine structure, no matter which + * architecture is being used, and no matter how the values in FreeRTOSConfig.h + * are set. Its contents are somewhat obfuscated in the hope users will + * recognise that it would be unwise to make direct use of the structure members. + */ +typedef struct xSTATIC_TCB +{ + void * pxDummy1; + #if ( portUSING_MPU_WRAPPERS == 1 ) + xMPU_SETTINGS xDummy2; + #endif + #if ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 ) + UBaseType_t uxDummy26; + #endif + StaticListItem_t xDummy3[ 2 ]; + UBaseType_t uxDummy5; + void * pxDummy6; + #if ( configNUMBER_OF_CORES > 1 ) + BaseType_t xDummy23; + UBaseType_t uxDummy24; + #endif + uint8_t ucDummy7[ configMAX_TASK_NAME_LEN ]; + #if ( configUSE_TASK_PREEMPTION_DISABLE == 1 ) + BaseType_t xDummy25; + #endif + #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) ) + void * pxDummy8; + #endif + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + UBaseType_t uxDummy9; + #endif + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy10[ 2 ]; + #endif + #if ( configUSE_MUTEXES == 1 ) + UBaseType_t uxDummy12[ 2 ]; + #endif + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + void * pxDummy14; + #endif + #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + void * pvDummy15[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; + #endif + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + configRUN_TIME_COUNTER_TYPE ulDummy16; + #endif + #if ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) + configTLS_BLOCK_TYPE xDummy17; + #endif + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + uint32_t ulDummy18[ configTASK_NOTIFICATION_ARRAY_ENTRIES ]; + uint8_t ucDummy19[ configTASK_NOTIFICATION_ARRAY_ENTRIES ]; + #endif + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + uint8_t uxDummy20; + #endif + + #if ( INCLUDE_xTaskAbortDelay == 1 ) + uint8_t ucDummy21; + #endif + #if ( configUSE_POSIX_ERRNO == 1 ) + int iDummy22; + #endif +} StaticTask_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the Queue structure used internally by + * FreeRTOS is not accessible to application code. However, if the application + * writer wants to statically allocate the memory required to create a queue + * then the size of the queue object needs to be known. The StaticQueue_t + * structure below is provided for this purpose. Its sizes and alignment + * requirements are guaranteed to match those of the genuine structure, no + * matter which architecture is being used, and no matter how the values in + * FreeRTOSConfig.h are set. Its contents are somewhat obfuscated in the hope + * users will recognise that it would be unwise to make direct use of the + * structure members. + */ +typedef struct xSTATIC_QUEUE +{ + void * pvDummy1[ 3 ]; + + union + { + void * pvDummy2; + UBaseType_t uxDummy2; + } u; + + StaticList_t xDummy3[ 2 ]; + UBaseType_t uxDummy4[ 3 ]; + uint8_t ucDummy5[ 2 ]; + + #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucDummy6; + #endif + + #if ( configUSE_QUEUE_SETS == 1 ) + void * pvDummy7; + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy8; + uint8_t ucDummy9; + #endif +} StaticQueue_t; +typedef StaticQueue_t StaticSemaphore_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the event group structure used + * internally by FreeRTOS is not accessible to application code. However, if + * the application writer wants to statically allocate the memory required to + * create an event group then the size of the event group object needs to be + * know. The StaticEventGroup_t structure below is provided for this purpose. + * Its sizes and alignment requirements are guaranteed to match those of the + * genuine structure, no matter which architecture is being used, and no matter + * how the values in FreeRTOSConfig.h are set. Its contents are somewhat + * obfuscated in the hope users will recognise that it would be unwise to make + * direct use of the structure members. + */ +typedef struct xSTATIC_EVENT_GROUP +{ + TickType_t xDummy1; + StaticList_t xDummy2; + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy3; + #endif + + #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucDummy4; + #endif +} StaticEventGroup_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the software timer structure used + * internally by FreeRTOS is not accessible to application code. However, if + * the application writer wants to statically allocate the memory required to + * create a software timer then the size of the queue object needs to be known. + * The StaticTimer_t structure below is provided for this purpose. Its sizes + * and alignment requirements are guaranteed to match those of the genuine + * structure, no matter which architecture is being used, and no matter how the + * values in FreeRTOSConfig.h are set. Its contents are somewhat obfuscated in + * the hope users will recognise that it would be unwise to make direct use of + * the structure members. + */ +typedef struct xSTATIC_TIMER +{ + void * pvDummy1; + StaticListItem_t xDummy2; + TickType_t xDummy3; + void * pvDummy5; + TaskFunction_t pvDummy6; + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy7; + #endif + uint8_t ucDummy8; +} StaticTimer_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the stream buffer structure used + * internally by FreeRTOS is not accessible to application code. However, if + * the application writer wants to statically allocate the memory required to + * create a stream buffer then the size of the stream buffer object needs to be + * known. The StaticStreamBuffer_t structure below is provided for this + * purpose. Its size and alignment requirements are guaranteed to match those + * of the genuine structure, no matter which architecture is being used, and + * no matter how the values in FreeRTOSConfig.h are set. Its contents are + * somewhat obfuscated in the hope users will recognise that it would be unwise + * to make direct use of the structure members. + */ +typedef struct xSTATIC_STREAM_BUFFER +{ + size_t uxDummy1[ 4 ]; + void * pvDummy2[ 3 ]; + uint8_t ucDummy3; + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy4; + #endif + #if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + void * pvDummy5[ 2 ]; + #endif +} StaticStreamBuffer_t; + +/* Message buffers are built on stream buffers. */ +typedef StaticStreamBuffer_t StaticMessageBuffer_t; + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* INC_FREERTOS_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/FreeRTOSConfig.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/FreeRTOSConfig.h new file mode 100644 index 0000000..a57a1f3 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/FreeRTOSConfig.h @@ -0,0 +1,396 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +#include "McuLib.h" /* SDK and API used */ +#include "McuRTOSconfig.h" /* extra configuration settings not part of the original FreeRTOS ports */ + +#define configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H 1 /* 1: include additional header file at the end of task.c to help with debugging in GDB in combination with configUSE_TRACE_FACILITY; 0: no extra file included. */ +#define configENABLE_BACKWARD_COMPATIBILITY 0 /* 1: enable backward compatibility mode, using old names in kernel. 0: use new kernel structure names (recommended) */ +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ +#ifndef configGENERATE_RUN_TIME_STATS_USE_TICKS + #define configGENERATE_RUN_TIME_STATS_USE_TICKS 1 /* 1: Use the RTOS tick counter as runtime counter. 0: use extra timer */ +#endif +#ifndef configGENERATE_RUN_TIME_STATS + #define configGENERATE_RUN_TIME_STATS 1 /* 1: generate runtime statistics; 0: no runtime statistics */ +#endif +#if configGENERATE_RUN_TIME_STATS + #if configGENERATE_RUN_TIME_STATS_USE_TICKS + #ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS + #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() /* nothing */ /* default: use Tick counter as runtime counter */ + #endif + #ifndef portGET_RUN_TIME_COUNTER_VALUE + #define portGET_RUN_TIME_COUNTER_VALUE() xTaskGetTickCountFromISR() /* default: use Tick counter as runtime counter */ + #endif + #else /* use dedicated timer */ + #ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS + extern void McuRTOS_AppConfigureTimerForRuntimeStats(void); + #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() McuRTOS_AppConfigureTimerForRuntimeStats() + #endif + #ifndef portGET_RUN_TIME_COUNTER_VALUE + extern uint32_t McuRTOS_AppGetRuntimeCounterValueFromISR(void); + #define portGET_RUN_TIME_COUNTER_VALUE() McuRTOS_AppGetRuntimeCounterValueFromISR() + #endif + #endif +#else /* no runtime stats, use empty macros */ + #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() /* nothing */ + #define portGET_RUN_TIME_COUNTER_VALUE() /* nothing */ +#endif +#ifndef configUSE_PREEMPTION + #define configUSE_PREEMPTION 1 /* 1: pre-emptive mode; 0: cooperative mode */ +#endif +#ifndef configUSE_TIME_SLICING + #define configUSE_TIME_SLICING 1 /* 1: use time slicing; 0: don't time slice at tick interrupt time */ +#endif +#ifndef configUSE_IDLE_HOOK + #define configUSE_IDLE_HOOK 1 /* 1: use Idle hook; 0: no Idle hook */ +#endif +#ifndef configUSE_IDLE_HOOK_NAME + #define configUSE_IDLE_HOOK_NAME McuRTOS_vApplicationIdleHook +#endif +#ifndef configUSE_TICK_HOOK + #define configUSE_TICK_HOOK 1 /* 1: use Tick hook; 0: no Tick hook */ +#endif +#ifndef configUSE_TICK_HOOK_NAME + #define configUSE_TICK_HOOK_NAME McuRTOS_vApplicationTickHook +#endif +#ifndef configUSE_MALLOC_FAILED_HOOK + #define configUSE_MALLOC_FAILED_HOOK 1 /* 1: use MallocFailed hook; 0: no MallocFailed hook */ +#endif +#ifndef configUSE_MALLOC_FAILED_HOOK_NAME + #define configUSE_MALLOC_FAILED_HOOK_NAME McuRTOS_vApplicationMallocFailedHook +#endif +#ifndef configTICK_RATE_HZ + #define configTICK_RATE_HZ (1000) /* frequency of tick interrupt */ +#endif +#define portTICK_RATE_MS (1000/configTICK_RATE_HZ) /* needed for legacy drivers and modules like lwIP */ +#ifndef configSYSTICK_USE_LOW_POWER_TIMER + #define configSYSTICK_USE_LOW_POWER_TIMER 0 /* If using Kinetis Low Power Timer (LPTMR) instead of SysTick timer */ +#endif +#ifndef configSYSTICK_LOW_POWER_TIMER_CLOCK_HZ + #define configSYSTICK_LOW_POWER_TIMER_CLOCK_HZ 1000 /* Frequency of low power timer */ +#endif +#if McuLib_CONFIG_NXP_SDK_USED \ + || McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_GENERIC \ + || McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_NORDIC_NRF5 \ + || McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_RPI_PICO +/* The CMSIS variable SystemCoreClock contains the current clock speed */ + extern uint32_t SystemCoreClock; + #define configCPU_CLOCK_HZ SystemCoreClock /* CPU clock frequency */ + #define configBUS_CLOCK_HZ SystemCoreClock /* Bus clock frequency */ +#else + #define configCPU_CLOCK_HZ CPU_CORE_CLK_HZ /* CPU clock frequency */ + #define configBUS_CLOCK_HZ CPU_BUS_CLK_HZ /* Bus clock frequency */ +#endif /* #if McuLib_CONFIG_NXP_SDK_USED */ +#define configSYSTICK_USE_CORE_CLOCK 1 /* System Tick is using core clock */ +#define configSYSTICK_CLOCK_DIVIDER 1 /* no divider */ +#define configSYSTICK_CLOCK_HZ ((configCPU_CLOCK_HZ)/configSYSTICK_CLOCK_DIVIDER) /* frequency of system tick counter */ +#ifndef configMINIMAL_STACK_SIZE + #define configMINIMAL_STACK_SIZE (200) /* stack size in addressable stack units */ +#endif + +#ifndef configNUMBER_OF_CORES + #define configNUMBER_OF_CORES (1) /* number of cores for the kernel */ +#endif + +#ifndef configUSE_MINI_LIST_ITEM + #define configUSE_MINI_LIST_ITEM (1) + /*!< MiniListItem_t is used for start and end marker nodes in a FreeRTOS list and ListItem_t is used for all other nodes in a FreeRTOS list. + * When configUSE_MINI_LIST_ITEM is set to 0, MiniListItem_t and ListItem_t are both the same. When configUSE_MINI_LIST_ITEM is set to 1, + * MiniListItem_t contains 3 fewer fields than ListItem_t which saves some RAM at the cost of violating strict aliasing rules which some compilers + * depend on for optimization. If left undefined, configUSE_MINI_LIST_ITEM defaults to 1 for backward compatibility. + */ +#endif +/*----------------------------------------------------------*/ +/* Heap Memory */ +#ifndef configUSE_HEAP_SCHEME + #define configUSE_HEAP_SCHEME 4 /* either 1 (only alloc), 2 (alloc/free), 3 (malloc), 4 (coalesc blocks), 5 (multiple blocks), 6 (newlib) */ +#endif /* configUSE_HEAP_SCHEME */ +#define configFRTOS_MEMORY_SCHEME configUSE_HEAP_SCHEME /* for backwards compatible only with legacy name */ +#ifndef configTOTAL_HEAP_SIZE + #define configTOTAL_HEAP_SIZE (8192) /* size of heap in bytes */ +#endif /* configTOTAL_HEAP_SIZE */ +#ifndef configUSE_HEAP_SECTION_NAME + #define configUSE_HEAP_SECTION_NAME 0 /* set to 1 if a custom section name (configHEAP_SECTION_NAME_STRING) shall be used, 0 otherwise */ +#endif +#ifndef configHEAP_SECTION_NAME_STRING + #define configHEAP_SECTION_NAME_STRING ".m_data_20000000" /* heap section name (use e.g. ".m_data_20000000" for KDS/gcc, ".bss.$SRAM_LOWER.FreeRTOS" for MCUXpresso or "m_data_20000000" for IAR). Check your linker file for the name used. */ +#endif +#define configAPPLICATION_ALLOCATED_HEAP 0 /* set to one if application is defining heap ucHeap[] variable, 0 otherwise */ +#ifndef configSUPPORT_DYNAMIC_ALLOCATION + #define configSUPPORT_DYNAMIC_ALLOCATION 1 /* 1: make dynamic allocation functions for RTOS available. 0: only static functions are allowed */ +#endif +#ifndef configSUPPORT_STATIC_ALLOCATION + #define configSUPPORT_STATIC_ALLOCATION 0 /* 1: make static allocation functions for RTOS available. 0: only dynamic functions are allowed */ +#endif +#define configUSE_NEWLIB_REENTRANT (configUSE_HEAP_SCHEME==6) /* 1: a newlib reent structure will be allocated for each task; 0: no such reentr structure used */ +/*----------------------------------------------------------*/ +#ifndef configMAX_TASK_NAME_LEN + #define configMAX_TASK_NAME_LEN 12 /* task name length in bytes */ +#endif +#ifndef configUSE_TRACE_FACILITY + #define configUSE_TRACE_FACILITY 1 /* 1: include additional structure members and functions to assist with execution visualization and tracing, 0: no runtime stats/trace */ +#endif +#ifndef configUSE_STATS_FORMATTING_FUNCTIONS + #define configUSE_STATS_FORMATTING_FUNCTIONS (configUSE_TRACE_FACILITY || configGENERATE_RUN_TIME_STATS) +#endif +#define configUSE_16_BIT_TICKS 0 /* 1: use 16bit tick counter type, 0: use 32bit tick counter type */ +#ifndef configIDLE_SHOULD_YIELD + #define configIDLE_SHOULD_YIELD 1 /* 1: the IDEL task will yield as soon as possible. 0: The IDLE task waits until preemption. */ +#endif +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION (0 && configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY)) /* 1: the scheduler uses an optimized task selection as defined by the port (if available). 0: normal task selection is used */ +#endif +#ifndef configUSE_CO_ROUTINES + #define configUSE_CO_ROUTINES 0 +#endif +#ifndef configUSE_MUTEXES + #define configUSE_MUTEXES 1 +#endif +#ifndef configCHECK_FOR_STACK_OVERFLOW + #define configCHECK_FOR_STACK_OVERFLOW 1 /* 0 is disabling stack overflow. Set it to 1 for Method1 or 2 for Method2 */ +#endif +#ifndef configCHECK_FOR_STACK_OVERFLOW_NAME + #define configCHECK_FOR_STACK_OVERFLOW_NAME McuRTOS_vApplicationStackOverflowHook +#endif +#ifndef configUSE_RECURSIVE_MUTEXES + #define configUSE_RECURSIVE_MUTEXES 1 +#endif +#ifndef configQUEUE_REGISTRY_SIZE + #define configQUEUE_REGISTRY_SIZE 5 +#endif +#ifndef configUSE_QUEUE_SETS + #define configUSE_QUEUE_SETS 1 +#endif +#ifndef configUSE_COUNTING_SEMAPHORES + #define configUSE_COUNTING_SEMAPHORES 1 +#endif +#ifndef configUSE_APPLICATION_TASK_TAG + #define configUSE_APPLICATION_TASK_TAG 0 +#endif +#ifndef configUSE_TASK_NOTIFICATIONS + #define configUSE_TASK_NOTIFICATIONS 1 +#endif +/* Tickless Idle Mode ----------------------------------------------------------*/ +#ifndef configUSE_TICKLESS_IDLE + #define configUSE_TICKLESS_IDLE 0 /* set to 1 for tickless idle mode, 0 otherwise */ +#endif +#ifndef configEXPECTED_IDLE_TIME_BEFORE_SLEEP + #define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2 /* number of ticks must be larger than this to enter tickless idle mode */ +#endif +#ifndef configUSE_TICKLESS_IDLE_DECISION_HOOK + #define configUSE_TICKLESS_IDLE_DECISION_HOOK 0 /* set to 1 to enable application hook, zero otherwise */ +#endif +#ifndef configUSE_TICKLESS_IDLE_DECISION_HOOK_NAME + #define configUSE_TICKLESS_IDLE_DECISION_HOOK_NAME xEnterTicklessIdle /* function name of decision hook */ +#endif +#ifndef configNUM_THREAD_LOCAL_STORAGE_POINTERS + #define configNUM_THREAD_LOCAL_STORAGE_POINTERS 0 /* number of tread local storage pointers, 0 to disable functionality */ +#endif + +#ifndef configMAX_PRIORITIES + #define configMAX_PRIORITIES 6 /* task priorities can be from 0 up to this value-1 */ +#endif +#define configMAX_CO_ROUTINE_PRIORITIES 2 /* co-routine priorities can be from 0 up to this value-1 */ + +/* the following needs to be defined (present) or not (not present)! */ +#define configTASK_RETURN_ADDRESS 0 /* return address of task is zero */ + +#ifndef configRECORD_STACK_HIGH_ADDRESS + #define configRECORD_STACK_HIGH_ADDRESS 1 /* 1: record stack high address for the debugger, 0: do not record stack high address */ +#endif + +/* Software timer definitions. */ +#ifndef configUSE_TIMERS + #define configUSE_TIMERS 1 /* 1: enable software timers; 0: software timers disabled */ +#endif +#ifndef configTIMER_TASK_PRIORITY + #define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES-1U) /* e.g. (configMAX_PRIORITIES-1U) */ +#endif +#ifndef configTIMER_QUEUE_LENGTH + #define configTIMER_QUEUE_LENGTH 10 /* size of queue for the timer task */ +#endif +#ifndef configTIMER_TASK_STACK_DEPTH + #define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE) /* e.g. (configMINIMAL_STACK_SIZE) */ +#endif +#ifndef INCLUDE_xEventGroupSetBitFromISR + #define INCLUDE_xEventGroupSetBitFromISR 1 /* 1: function is included; 0: do not include function */ +#endif +#ifndef INCLUDE_xTimerPendFunctionCall + #define INCLUDE_xTimerPendFunctionCall 1 /* 1: function is included; 0: do not include function */ +#endif +#ifndef configUSE_DAEMON_TASK_STARTUP_HOOK + #define configUSE_DAEMON_TASK_STARTUP_HOOK 0 /* 1: use application specific vApplicationDaemonTaskStartupHook(), 0: do not use hook */ +#endif + +/* Set configUSE_TASK_FPU_SUPPORT to 0 to omit floating point support even +if floating point hardware is otherwise supported by the FreeRTOS port in use. +This constant is not supported by all FreeRTOS ports that include floating +point support. */ +#ifndef configUSE_TASK_FPU_SUPPORT + #define configUSE_TASK_FPU_SUPPORT 1 +#endif +/* Set the following definitions to 1 to include the API function, or zero + to exclude the API function. */ +#ifndef INCLUDE_vTaskEndScheduler + #define INCLUDE_vTaskEndScheduler 0 +#endif +#ifndef INCLUDE_vTaskPrioritySet + #define INCLUDE_vTaskPrioritySet 1 +#endif +#ifndef INCLUDE_uxTaskPriorityGet + #define INCLUDE_uxTaskPriorityGet 1 +#endif +#ifndef INCLUDE_vTaskDelete + #define INCLUDE_vTaskDelete 1 +#endif +#ifndef INCLUDE_vTaskCleanUpResources + #define INCLUDE_vTaskCleanUpResources 1 +#endif +#ifndef INCLUDE_vTaskSuspend + #define INCLUDE_vTaskSuspend 1 +#endif +#ifndef INCLUDE_vTaskDelayUntil + #define INCLUDE_vTaskDelayUntil 1 +#endif +#ifndef INCLUDE_vTaskDelay + #define INCLUDE_vTaskDelay 1 +#endif +#ifndef INCLUDE_uxTaskGetStackHighWaterMark + #define INCLUDE_uxTaskGetStackHighWaterMark 1 +#endif +#ifndef INCLUDE_xTaskGetSchedulerState + #define INCLUDE_xTaskGetSchedulerState 1 +#endif +#ifndef INCLUDE_xQueueGetMutexHolder + #define INCLUDE_xQueueGetMutexHolder 1 +#endif +#ifndef INCLUDE_xTaskGetHandle + #define INCLUDE_xTaskGetHandle 1 +#endif +#ifndef INCLUDE_xTaskAbortDelay + #define INCLUDE_xTaskAbortDelay 1 +#endif +#ifndef INCLUDE_xTaskGetCurrentTaskHandle + #define INCLUDE_xTaskGetCurrentTaskHandle 1 +#endif +#ifndef INCLUDE_xTaskGetIdleTaskHandle + #define INCLUDE_xTaskGetIdleTaskHandle 1 +#endif +#ifndef INCLUDE_xTaskResumeFromISR + #define INCLUDE_xTaskResumeFromISR 1 +#endif +#ifndef INCLUDE_eTaskGetState + #define INCLUDE_eTaskGetState 1 +#endif +#ifndef INCLUDE_pcTaskGetTaskName + #define INCLUDE_pcTaskGetTaskName 1 +#endif +/* -------------------------------------------------------------------- */ +#ifndef INCLUDE_pxTaskGetStackStart + #define INCLUDE_pxTaskGetStackStart (1 && configUSE_SEGGER_SYSTEM_VIEWER_HOOKS) +#endif +/* -------------------------------------------------------------------- */ +#if configCPU_FAMILY_IS_ARM(configCPU_FAMILY) + /* Cortex-M specific definitions. */ + #if configCPU_FAMILY_IS_ARM_M4(configCPU_FAMILY) + #define configPRIO_BITS 4 /* 4 bits/16 priority levels on ARM Cortex M4 (Kinetis K Family) */ + #else + #define configPRIO_BITS 2 /* 2 bits/4 priority levels on ARM Cortex M0+ (Kinetis L Family) */ + #endif + + /* The lowest interrupt priority that can be used in a call to a "set priority" function. */ + #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 + + /* The highest interrupt priority that can be used by any interrupt service + routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL + INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER + PRIORITY THAN THIS! (higher priorities are lower numeric values on an ARM Cortex-M). */ + #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 + + /* Interrupt priorities used by the kernel port layer itself. These are generic + to all Cortex-M ports, and do not rely on any particular library functions. */ + #define configKERNEL_INTERRUPT_PRIORITY (configLIBRARY_LOWEST_INTERRUPT_PRIORITY<<(8-configPRIO_BITS)) + + /* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! + See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ + #define configMAX_SYSCALL_INTERRUPT_PRIORITY (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY<<(8-configPRIO_BITS)) +#elif McuLib_CONFIG_CPU_IS_RISC_V + #define configKERNEL_INTERRUPT_PRIORITY (7) +#endif + +/* Normal assert() semantics without relying on the provision of an assert.h header file. */ +#ifndef configASSERT + #ifndef taskDISABLE_INTERRUPTS + #define taskDISABLE_INTERRUPTS() portDISABLE_INTERRUPTS() + #endif + #define configASSERT(x) if((x)==0) { taskDISABLE_INTERRUPTS(); for( ;; ); } + #if 0 /* version for RISC-V with a debug break: */ + #define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); __asm volatile( "ebreak" ); for( ;; ); } + #endif +#endif + +/* RISC-V only: If the target chip includes a Core Local Interrupter (CLINT) then set configCLINT_BASE_ADDRESS to the CLINT base address. + Otherwise set configCLINT_BASE_ADDRESS to 0. + */ +#define configCLINT_BASE_ADDRESS 0x0 + +/*---------------------------------------------------------------------------------------*/ +/* MPU and TrustZone settings */ +#ifndef configENABLE_FPU + #define configENABLE_FPU (0) +#endif /* configENABLE_FPU */ + +#ifndef configENABLE_MPU + #define configENABLE_MPU (0) +#endif /* configENABLE_MPU */ + +#ifndef configENABLE_TRUSTZONE + #define configENABLE_TRUSTZONE (0) +#endif /* configENABLE_TRUSTZONE */ +/*---------------------------------------------------------------------------------------*/ + +/* custom include file: */ +// #include "CustomFreeRTOSSettings.h + + +#endif /* FREERTOS_CONFIG_H */ + + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/atomic.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/atomic.h new file mode 100644 index 0000000..d0606a1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/atomic.h @@ -0,0 +1,420 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/** + * @file atomic.h + * @brief FreeRTOS atomic operation support. + * + * This file implements atomic functions by disabling interrupts globally. + * Implementations with architecture specific atomic instructions can be + * provided under each compiler directory. + */ + +#ifndef ATOMIC_H +#define ATOMIC_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include atomic.h" +#endif + +/* Standard includes. */ +#include + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/* + * Port specific definitions -- entering/exiting critical section. + * Refer template -- ./lib/FreeRTOS/portable/Compiler/Arch/portmacro.h + * + * Every call to ATOMIC_EXIT_CRITICAL() must be closely paired with + * ATOMIC_ENTER_CRITICAL(). + * + */ +#if defined( portSET_INTERRUPT_MASK_FROM_ISR ) + +/* Nested interrupt scheme is supported in this port. */ + #define ATOMIC_ENTER_CRITICAL() \ + UBaseType_t uxCriticalSectionType = portSET_INTERRUPT_MASK_FROM_ISR() + + #define ATOMIC_EXIT_CRITICAL() \ + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxCriticalSectionType ) + +#else + +/* Nested interrupt scheme is NOT supported in this port. */ + #define ATOMIC_ENTER_CRITICAL() portENTER_CRITICAL() + #define ATOMIC_EXIT_CRITICAL() portEXIT_CRITICAL() + +#endif /* portSET_INTERRUPT_MASK_FROM_ISR() */ + +/* + * Port specific definition -- "always inline". + * Inline is compiler specific, and may not always get inlined depending on your + * optimization level. Also, inline is considered as performance optimization + * for atomic. Thus, if portFORCE_INLINE is not provided by portmacro.h, + * instead of resulting error, simply define it away. + */ +#ifndef portFORCE_INLINE + #define portFORCE_INLINE +#endif + +#define ATOMIC_COMPARE_AND_SWAP_SUCCESS 0x1U /**< Compare and swap succeeded, swapped. */ +#define ATOMIC_COMPARE_AND_SWAP_FAILURE 0x0U /**< Compare and swap failed, did not swap. */ + +/*----------------------------- Swap && CAS ------------------------------*/ + +/** + * Atomic compare-and-swap + * + * @brief Performs an atomic compare-and-swap operation on the specified values. + * + * @param[in, out] pulDestination Pointer to memory location from where value is + * to be loaded and checked. + * @param[in] ulExchange If condition meets, write this value to memory. + * @param[in] ulComparand Swap condition. + * + * @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped. + * + * @note This function only swaps *pulDestination with ulExchange, if previous + * *pulDestination value equals ulComparand. + */ +static portFORCE_INLINE uint32_t Atomic_CompareAndSwap_u32( uint32_t volatile * pulDestination, + uint32_t ulExchange, + uint32_t ulComparand ) +{ + uint32_t ulReturnValue; + + ATOMIC_ENTER_CRITICAL(); + { + if( *pulDestination == ulComparand ) + { + *pulDestination = ulExchange; + ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS; + } + else + { + ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE; + } + } + ATOMIC_EXIT_CRITICAL(); + + return ulReturnValue; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic swap (pointers) + * + * @brief Atomically sets the address pointed to by *ppvDestination to the value + * of *pvExchange. + * + * @param[in, out] ppvDestination Pointer to memory location from where a pointer + * value is to be loaded and written back to. + * @param[in] pvExchange Pointer value to be written to *ppvDestination. + * + * @return The initial value of *ppvDestination. + */ +static portFORCE_INLINE void * Atomic_SwapPointers_p32( void * volatile * ppvDestination, + void * pvExchange ) +{ + void * pReturnValue; + + ATOMIC_ENTER_CRITICAL(); + { + pReturnValue = *ppvDestination; + *ppvDestination = pvExchange; + } + ATOMIC_EXIT_CRITICAL(); + + return pReturnValue; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic compare-and-swap (pointers) + * + * @brief Performs an atomic compare-and-swap operation on the specified pointer + * values. + * + * @param[in, out] ppvDestination Pointer to memory location from where a pointer + * value is to be loaded and checked. + * @param[in] pvExchange If condition meets, write this value to memory. + * @param[in] pvComparand Swap condition. + * + * @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped. + * + * @note This function only swaps *ppvDestination with pvExchange, if previous + * *ppvDestination value equals pvComparand. + */ +static portFORCE_INLINE uint32_t Atomic_CompareAndSwapPointers_p32( void * volatile * ppvDestination, + void * pvExchange, + void * pvComparand ) +{ + uint32_t ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE; + + ATOMIC_ENTER_CRITICAL(); + { + if( *ppvDestination == pvComparand ) + { + *ppvDestination = pvExchange; + ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS; + } + } + ATOMIC_EXIT_CRITICAL(); + + return ulReturnValue; +} + + +/*----------------------------- Arithmetic ------------------------------*/ + +/** + * Atomic add + * + * @brief Atomically adds count to the value of the specified pointer points to. + * + * @param[in,out] pulAddend Pointer to memory location from where value is to be + * loaded and written back to. + * @param[in] ulCount Value to be added to *pulAddend. + * + * @return previous *pulAddend value. + */ +static portFORCE_INLINE uint32_t Atomic_Add_u32( uint32_t volatile * pulAddend, + uint32_t ulCount ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulAddend; + *pulAddend += ulCount; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic subtract + * + * @brief Atomically subtracts count from the value of the specified pointer + * pointers to. + * + * @param[in,out] pulAddend Pointer to memory location from where value is to be + * loaded and written back to. + * @param[in] ulCount Value to be subtract from *pulAddend. + * + * @return previous *pulAddend value. + */ +static portFORCE_INLINE uint32_t Atomic_Subtract_u32( uint32_t volatile * pulAddend, + uint32_t ulCount ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulAddend; + *pulAddend -= ulCount; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic increment + * + * @brief Atomically increments the value of the specified pointer points to. + * + * @param[in,out] pulAddend Pointer to memory location from where value is to be + * loaded and written back to. + * + * @return *pulAddend value before increment. + */ +static portFORCE_INLINE uint32_t Atomic_Increment_u32( uint32_t volatile * pulAddend ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulAddend; + *pulAddend += 1; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic decrement + * + * @brief Atomically decrements the value of the specified pointer points to + * + * @param[in,out] pulAddend Pointer to memory location from where value is to be + * loaded and written back to. + * + * @return *pulAddend value before decrement. + */ +static portFORCE_INLINE uint32_t Atomic_Decrement_u32( uint32_t volatile * pulAddend ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulAddend; + *pulAddend -= 1; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} + +/*----------------------------- Bitwise Logical ------------------------------*/ + +/** + * Atomic OR + * + * @brief Performs an atomic OR operation on the specified values. + * + * @param [in, out] pulDestination Pointer to memory location from where value is + * to be loaded and written back to. + * @param [in] ulValue Value to be ORed with *pulDestination. + * + * @return The original value of *pulDestination. + */ +static portFORCE_INLINE uint32_t Atomic_OR_u32( uint32_t volatile * pulDestination, + uint32_t ulValue ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulDestination; + *pulDestination |= ulValue; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic AND + * + * @brief Performs an atomic AND operation on the specified values. + * + * @param [in, out] pulDestination Pointer to memory location from where value is + * to be loaded and written back to. + * @param [in] ulValue Value to be ANDed with *pulDestination. + * + * @return The original value of *pulDestination. + */ +static portFORCE_INLINE uint32_t Atomic_AND_u32( uint32_t volatile * pulDestination, + uint32_t ulValue ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulDestination; + *pulDestination &= ulValue; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic NAND + * + * @brief Performs an atomic NAND operation on the specified values. + * + * @param [in, out] pulDestination Pointer to memory location from where value is + * to be loaded and written back to. + * @param [in] ulValue Value to be NANDed with *pulDestination. + * + * @return The original value of *pulDestination. + */ +static portFORCE_INLINE uint32_t Atomic_NAND_u32( uint32_t volatile * pulDestination, + uint32_t ulValue ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulDestination; + *pulDestination = ~( ulCurrent & ulValue ); + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic XOR + * + * @brief Performs an atomic XOR operation on the specified values. + * + * @param [in, out] pulDestination Pointer to memory location from where value is + * to be loaded and written back to. + * @param [in] ulValue Value to be XORed with *pulDestination. + * + * @return The original value of *pulDestination. + */ +static portFORCE_INLINE uint32_t Atomic_XOR_u32( uint32_t volatile * pulDestination, + uint32_t ulValue ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulDestination; + *pulDestination ^= ulValue; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* ATOMIC_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/croutine.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/croutine.h new file mode 100644 index 0000000..75e59bd --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/croutine.h @@ -0,0 +1,756 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef CO_ROUTINE_H +#define CO_ROUTINE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include croutine.h" +#endif + +#include "list.h" + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/* Used to hide the implementation of the co-routine control block. The + * control block structure however has to be included in the header due to + * the macro implementation of the co-routine functionality. */ +typedef void * CoRoutineHandle_t; + +/* Defines the prototype to which co-routine functions must conform. */ +typedef void (* crCOROUTINE_CODE)( CoRoutineHandle_t xHandle, + UBaseType_t uxIndex ); + +typedef struct corCoRoutineControlBlock +{ + crCOROUTINE_CODE pxCoRoutineFunction; + ListItem_t xGenericListItem; /**< List item used to place the CRCB in ready and blocked queues. */ + ListItem_t xEventListItem; /**< List item used to place the CRCB in event lists. */ + UBaseType_t uxPriority; /**< The priority of the co-routine in relation to other co-routines. */ + UBaseType_t uxIndex; /**< Used to distinguish between co-routines when multiple co-routines use the same co-routine function. */ + uint16_t uxState; /**< Used internally by the co-routine implementation. */ +} CRCB_t; /* Co-routine control block. Note must be identical in size down to uxPriority with TCB_t. */ + +/** + * croutine. h + * @code{c} + * BaseType_t xCoRoutineCreate( + * crCOROUTINE_CODE pxCoRoutineCode, + * UBaseType_t uxPriority, + * UBaseType_t uxIndex + * ); + * @endcode + * + * Create a new co-routine and add it to the list of co-routines that are + * ready to run. + * + * @param pxCoRoutineCode Pointer to the co-routine function. Co-routine + * functions require special syntax - see the co-routine section of the WEB + * documentation for more information. + * + * @param uxPriority The priority with respect to other co-routines at which + * the co-routine will run. + * + * @param uxIndex Used to distinguish between different co-routines that + * execute the same function. See the example below and the co-routine section + * of the WEB documentation for further information. + * + * @return pdPASS if the co-routine was successfully created and added to a ready + * list, otherwise an error code defined with ProjDefs.h. + * + * Example usage: + * @code{c} + * // Co-routine to be created. + * void vFlashCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * // This may not be necessary for const variables. + * static const char cLedToFlash[ 2 ] = { 5, 6 }; + * static const TickType_t uxFlashRates[ 2 ] = { 200, 400 }; + * + * // Must start every co-routine with a call to crSTART(); + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // This co-routine just delays for a fixed period, then toggles + * // an LED. Two co-routines are created using this function, so + * // the uxIndex parameter is used to tell the co-routine which + * // LED to flash and how int32_t to delay. This assumes xQueue has + * // already been created. + * vParTestToggleLED( cLedToFlash[ uxIndex ] ); + * crDELAY( xHandle, uxFlashRates[ uxIndex ] ); + * } + * + * // Must end every co-routine with a call to crEND(); + * crEND(); + * } + * + * // Function that creates two co-routines. + * void vOtherFunction( void ) + * { + * uint8_t ucParameterToPass; + * TaskHandle_t xHandle; + * + * // Create two co-routines at priority 0. The first is given index 0 + * // so (from the code above) toggles LED 5 every 200 ticks. The second + * // is given index 1 so toggles LED 6 every 400 ticks. + * for( uxIndex = 0; uxIndex < 2; uxIndex++ ) + * { + * xCoRoutineCreate( vFlashCoRoutine, 0, uxIndex ); + * } + * } + * @endcode + * \defgroup xCoRoutineCreate xCoRoutineCreate + * \ingroup Tasks + */ +BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, + UBaseType_t uxPriority, + UBaseType_t uxIndex ); + + +/** + * croutine. h + * @code{c} + * void vCoRoutineSchedule( void ); + * @endcode + * + * Run a co-routine. + * + * vCoRoutineSchedule() executes the highest priority co-routine that is able + * to run. The co-routine will execute until it either blocks, yields or is + * preempted by a task. Co-routines execute cooperatively so one + * co-routine cannot be preempted by another, but can be preempted by a task. + * + * If an application comprises of both tasks and co-routines then + * vCoRoutineSchedule should be called from the idle task (in an idle task + * hook). + * + * Example usage: + * @code{c} + * // This idle task hook will schedule a co-routine each time it is called. + * // The rest of the idle task will execute between co-routine calls. + * void vApplicationIdleHook( void ) + * { + * vCoRoutineSchedule(); + * } + * + * // Alternatively, if you do not require any other part of the idle task to + * // execute, the idle task hook can call vCoRoutineSchedule() within an + * // infinite loop. + * void vApplicationIdleHook( void ) + * { + * for( ;; ) + * { + * vCoRoutineSchedule(); + * } + * } + * @endcode + * \defgroup vCoRoutineSchedule vCoRoutineSchedule + * \ingroup Tasks + */ +void vCoRoutineSchedule( void ); + +/** + * croutine. h + * @code{c} + * crSTART( CoRoutineHandle_t xHandle ); + * @endcode + * + * This macro MUST always be called at the start of a co-routine function. + * + * Example usage: + * @code{c} + * // Co-routine to be created. + * void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * static int32_t ulAVariable; + * + * // Must start every co-routine with a call to crSTART(); + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Co-routine functionality goes here. + * } + * + * // Must end every co-routine with a call to crEND(); + * crEND(); + * } + * @endcode + * \defgroup crSTART crSTART + * \ingroup Tasks + */ +#define crSTART( pxCRCB ) \ + switch( ( ( CRCB_t * ) ( pxCRCB ) )->uxState ) { \ + case 0: + +/** + * croutine. h + * @code{c} + * crEND(); + * @endcode + * + * This macro MUST always be called at the end of a co-routine function. + * + * Example usage: + * @code{c} + * // Co-routine to be created. + * void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * static int32_t ulAVariable; + * + * // Must start every co-routine with a call to crSTART(); + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Co-routine functionality goes here. + * } + * + * // Must end every co-routine with a call to crEND(); + * crEND(); + * } + * @endcode + * \defgroup crSTART crSTART + * \ingroup Tasks + */ +#define crEND() } + +/* + * These macros are intended for internal use by the co-routine implementation + * only. The macros should not be used directly by application writers. + */ +#define crSET_STATE0( xHandle ) \ + ( ( CRCB_t * ) ( xHandle ) )->uxState = ( __LINE__ * 2 ); return; \ + case ( __LINE__ * 2 ): +#define crSET_STATE1( xHandle ) \ + ( ( CRCB_t * ) ( xHandle ) )->uxState = ( ( __LINE__ * 2 ) + 1 ); return; \ + case ( ( __LINE__ * 2 ) + 1 ): + +/** + * croutine. h + * @code{c} + * crDELAY( CoRoutineHandle_t xHandle, TickType_t xTicksToDelay ); + * @endcode + * + * Delay a co-routine for a fixed period of time. + * + * crDELAY can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * @param xHandle The handle of the co-routine to delay. This is the xHandle + * parameter of the co-routine function. + * + * @param xTickToDelay The number of ticks that the co-routine should delay + * for. The actual amount of time this equates to is defined by + * configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant portTICK_PERIOD_MS + * can be used to convert ticks to milliseconds. + * + * Example usage: + * @code{c} + * // Co-routine to be created. + * void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * // This may not be necessary for const variables. + * // We are to delay for 200ms. + * static const xTickType xDelayTime = 200 / portTICK_PERIOD_MS; + * + * // Must start every co-routine with a call to crSTART(); + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Delay for 200ms. + * crDELAY( xHandle, xDelayTime ); + * + * // Do something here. + * } + * + * // Must end every co-routine with a call to crEND(); + * crEND(); + * } + * @endcode + * \defgroup crDELAY crDELAY + * \ingroup Tasks + */ +#define crDELAY( xHandle, xTicksToDelay ) \ + do { \ + if( ( xTicksToDelay ) > 0 ) \ + { \ + vCoRoutineAddToDelayedList( ( xTicksToDelay ), NULL ); \ + } \ + crSET_STATE0( ( xHandle ) ); \ + } while( 0 ) + +/** + * @code{c} + * crQUEUE_SEND( + * CoRoutineHandle_t xHandle, + * QueueHandle_t pxQueue, + * void *pvItemToQueue, + * TickType_t xTicksToWait, + * BaseType_t *pxResult + * ) + * @endcode + * + * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine + * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. + * + * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas + * xQueueSend() and xQueueReceive() can only be used from tasks. + * + * crQUEUE_SEND can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xHandle The handle of the calling co-routine. This is the xHandle + * parameter of the co-routine function. + * + * @param pxQueue The handle of the queue on which the data will be posted. + * The handle is obtained as the return value when the queue is created using + * the xQueueCreate() API function. + * + * @param pvItemToQueue A pointer to the data being posted onto the queue. + * The number of bytes of each queued item is specified when the queue is + * created. This number of bytes is copied from pvItemToQueue into the queue + * itself. + * + * @param xTickToDelay The number of ticks that the co-routine should block + * to wait for space to become available on the queue, should space not be + * available immediately. The actual amount of time this equates to is defined + * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant + * portTICK_PERIOD_MS can be used to convert ticks to milliseconds (see example + * below). + * + * @param pxResult The variable pointed to by pxResult will be set to pdPASS if + * data was successfully posted onto the queue, otherwise it will be set to an + * error defined within ProjDefs.h. + * + * Example usage: + * @code{c} + * // Co-routine function that blocks for a fixed period then posts a number onto + * // a queue. + * static void prvCoRoutineFlashTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * static BaseType_t xNumberToPost = 0; + * static BaseType_t xResult; + * + * // Co-routines must begin with a call to crSTART(). + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // This assumes the queue has already been created. + * crQUEUE_SEND( xHandle, xCoRoutineQueue, &xNumberToPost, NO_DELAY, &xResult ); + * + * if( xResult != pdPASS ) + * { + * // The message was not posted! + * } + * + * // Increment the number to be posted onto the queue. + * xNumberToPost++; + * + * // Delay for 100 ticks. + * crDELAY( xHandle, 100 ); + * } + * + * // Co-routines must end with a call to crEND(). + * crEND(); + * } + * @endcode + * \defgroup crQUEUE_SEND crQUEUE_SEND + * \ingroup Tasks + */ +#define crQUEUE_SEND( xHandle, pxQueue, pvItemToQueue, xTicksToWait, pxResult ) \ + do { \ + *( pxResult ) = xQueueCRSend( ( pxQueue ), ( pvItemToQueue ), ( xTicksToWait ) ); \ + if( *( pxResult ) == errQUEUE_BLOCKED ) \ + { \ + crSET_STATE0( ( xHandle ) ); \ + *pxResult = xQueueCRSend( ( pxQueue ), ( pvItemToQueue ), 0 ); \ + } \ + if( *pxResult == errQUEUE_YIELD ) \ + { \ + crSET_STATE1( ( xHandle ) ); \ + *pxResult = pdPASS; \ + } \ + } while( 0 ) + +/** + * croutine. h + * @code{c} + * crQUEUE_RECEIVE( + * CoRoutineHandle_t xHandle, + * QueueHandle_t pxQueue, + * void *pvBuffer, + * TickType_t xTicksToWait, + * BaseType_t *pxResult + * ) + * @endcode + * + * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine + * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. + * + * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas + * xQueueSend() and xQueueReceive() can only be used from tasks. + * + * crQUEUE_RECEIVE can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xHandle The handle of the calling co-routine. This is the xHandle + * parameter of the co-routine function. + * + * @param pxQueue The handle of the queue from which the data will be received. + * The handle is obtained as the return value when the queue is created using + * the xQueueCreate() API function. + * + * @param pvBuffer The buffer into which the received item is to be copied. + * The number of bytes of each queued item is specified when the queue is + * created. This number of bytes is copied into pvBuffer. + * + * @param xTickToDelay The number of ticks that the co-routine should block + * to wait for data to become available from the queue, should data not be + * available immediately. The actual amount of time this equates to is defined + * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant + * portTICK_PERIOD_MS can be used to convert ticks to milliseconds (see the + * crQUEUE_SEND example). + * + * @param pxResult The variable pointed to by pxResult will be set to pdPASS if + * data was successfully retrieved from the queue, otherwise it will be set to + * an error code as defined within ProjDefs.h. + * + * Example usage: + * @code{c} + * // A co-routine receives the number of an LED to flash from a queue. It + * // blocks on the queue until the number is received. + * static void prvCoRoutineFlashWorkTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * static BaseType_t xResult; + * static UBaseType_t uxLEDToFlash; + * + * // All co-routines must start with a call to crSTART(). + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Wait for data to become available on the queue. + * crQUEUE_RECEIVE( xHandle, xCoRoutineQueue, &uxLEDToFlash, portMAX_DELAY, &xResult ); + * + * if( xResult == pdPASS ) + * { + * // We received the LED to flash - flash it! + * vParTestToggleLED( uxLEDToFlash ); + * } + * } + * + * crEND(); + * } + * @endcode + * \defgroup crQUEUE_RECEIVE crQUEUE_RECEIVE + * \ingroup Tasks + */ +#define crQUEUE_RECEIVE( xHandle, pxQueue, pvBuffer, xTicksToWait, pxResult ) \ + do { \ + *( pxResult ) = xQueueCRReceive( ( pxQueue ), ( pvBuffer ), ( xTicksToWait ) ); \ + if( *( pxResult ) == errQUEUE_BLOCKED ) \ + { \ + crSET_STATE0( ( xHandle ) ); \ + *( pxResult ) = xQueueCRReceive( ( pxQueue ), ( pvBuffer ), 0 ); \ + } \ + if( *( pxResult ) == errQUEUE_YIELD ) \ + { \ + crSET_STATE1( ( xHandle ) ); \ + *( pxResult ) = pdPASS; \ + } \ + } while( 0 ) + +/** + * croutine. h + * @code{c} + * crQUEUE_SEND_FROM_ISR( + * QueueHandle_t pxQueue, + * void *pvItemToQueue, + * BaseType_t xCoRoutinePreviouslyWoken + * ) + * @endcode + * + * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the + * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() + * functions used by tasks. + * + * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to + * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and + * xQueueReceiveFromISR() can only be used to pass data between a task and and + * ISR. + * + * crQUEUE_SEND_FROM_ISR can only be called from an ISR to send data to a queue + * that is being used from within a co-routine. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xCoRoutinePreviouslyWoken This is included so an ISR can post onto + * the same queue multiple times from a single interrupt. The first call + * should always pass in pdFALSE. Subsequent calls should pass in + * the value returned from the previous call. + * + * @return pdTRUE if a co-routine was woken by posting onto the queue. This is + * used by the ISR to determine if a context switch may be required following + * the ISR. + * + * Example usage: + * @code{c} + * // A co-routine that blocks on a queue waiting for characters to be received. + * static void vReceivingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * char cRxedChar; + * BaseType_t xResult; + * + * // All co-routines must start with a call to crSTART(). + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Wait for data to become available on the queue. This assumes the + * // queue xCommsRxQueue has already been created! + * crQUEUE_RECEIVE( xHandle, xCommsRxQueue, &uxLEDToFlash, portMAX_DELAY, &xResult ); + * + * // Was a character received? + * if( xResult == pdPASS ) + * { + * // Process the character here. + * } + * } + * + * // All co-routines must end with a call to crEND(). + * crEND(); + * } + * + * // An ISR that uses a queue to send characters received on a serial port to + * // a co-routine. + * void vUART_ISR( void ) + * { + * char cRxedChar; + * BaseType_t xCRWokenByPost = pdFALSE; + * + * // We loop around reading characters until there are none left in the UART. + * while( UART_RX_REG_NOT_EMPTY() ) + * { + * // Obtain the character from the UART. + * cRxedChar = UART_RX_REG; + * + * // Post the character onto a queue. xCRWokenByPost will be pdFALSE + * // the first time around the loop. If the post causes a co-routine + * // to be woken (unblocked) then xCRWokenByPost will be set to pdTRUE. + * // In this manner we can ensure that if more than one co-routine is + * // blocked on the queue only one is woken by this ISR no matter how + * // many characters are posted to the queue. + * xCRWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsRxQueue, &cRxedChar, xCRWokenByPost ); + * } + * } + * @endcode + * \defgroup crQUEUE_SEND_FROM_ISR crQUEUE_SEND_FROM_ISR + * \ingroup Tasks + */ +#define crQUEUE_SEND_FROM_ISR( pxQueue, pvItemToQueue, xCoRoutinePreviouslyWoken ) \ + xQueueCRSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( xCoRoutinePreviouslyWoken ) ) + + +/** + * croutine. h + * @code{c} + * crQUEUE_SEND_FROM_ISR( + * QueueHandle_t pxQueue, + * void *pvBuffer, + * BaseType_t * pxCoRoutineWoken + * ) + * @endcode + * + * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the + * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() + * functions used by tasks. + * + * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to + * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and + * xQueueReceiveFromISR() can only be used to pass data between a task and and + * ISR. + * + * crQUEUE_RECEIVE_FROM_ISR can only be called from an ISR to receive data + * from a queue that is being used from within a co-routine (a co-routine + * posted to the queue). + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvBuffer A pointer to a buffer into which the received item will be + * placed. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from the queue into + * pvBuffer. + * + * @param pxCoRoutineWoken A co-routine may be blocked waiting for space to become + * available on the queue. If crQUEUE_RECEIVE_FROM_ISR causes such a + * co-routine to unblock *pxCoRoutineWoken will get set to pdTRUE, otherwise + * *pxCoRoutineWoken will remain unchanged. + * + * @return pdTRUE an item was successfully received from the queue, otherwise + * pdFALSE. + * + * Example usage: + * @code{c} + * // A co-routine that posts a character to a queue then blocks for a fixed + * // period. The character is incremented each time. + * static void vSendingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // cChar holds its value while this co-routine is blocked and must therefore + * // be declared static. + * static char cCharToTx = 'a'; + * BaseType_t xResult; + * + * // All co-routines must start with a call to crSTART(). + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Send the next character to the queue. + * crQUEUE_SEND( xHandle, xCoRoutineQueue, &cCharToTx, NO_DELAY, &xResult ); + * + * if( xResult == pdPASS ) + * { + * // The character was successfully posted to the queue. + * } + * else + * { + * // Could not post the character to the queue. + * } + * + * // Enable the UART Tx interrupt to cause an interrupt in this + * // hypothetical UART. The interrupt will obtain the character + * // from the queue and send it. + * ENABLE_RX_INTERRUPT(); + * + * // Increment to the next character then block for a fixed period. + * // cCharToTx will maintain its value across the delay as it is + * // declared static. + * cCharToTx++; + * if( cCharToTx > 'x' ) + * { + * cCharToTx = 'a'; + * } + * crDELAY( 100 ); + * } + * + * // All co-routines must end with a call to crEND(). + * crEND(); + * } + * + * // An ISR that uses a queue to receive characters to send on a UART. + * void vUART_ISR( void ) + * { + * char cCharToTx; + * BaseType_t xCRWokenByPost = pdFALSE; + * + * while( UART_TX_REG_EMPTY() ) + * { + * // Are there any characters in the queue waiting to be sent? + * // xCRWokenByPost will automatically be set to pdTRUE if a co-routine + * // is woken by the post - ensuring that only a single co-routine is + * // woken no matter how many times we go around this loop. + * if( crQUEUE_RECEIVE_FROM_ISR( pxQueue, &cCharToTx, &xCRWokenByPost ) ) + * { + * SEND_CHARACTER( cCharToTx ); + * } + * } + * } + * @endcode + * \defgroup crQUEUE_RECEIVE_FROM_ISR crQUEUE_RECEIVE_FROM_ISR + * \ingroup Tasks + */ +#define crQUEUE_RECEIVE_FROM_ISR( pxQueue, pvBuffer, pxCoRoutineWoken ) \ + xQueueCRReceiveFromISR( ( pxQueue ), ( pvBuffer ), ( pxCoRoutineWoken ) ) + +/* + * This function is intended for internal use by the co-routine macros only. + * The macro nature of the co-routine implementation requires that the + * prototype appears here. The function should not be used by application + * writers. + * + * Removes the current co-routine from its ready list and places it in the + * appropriate delayed list. + */ +void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, + List_t * pxEventList ); + +/* + * This function is intended for internal use by the queue implementation only. + * The function should not be used by application writers. + * + * Removes the highest priority co-routine from the event list and places it in + * the pending ready list. + */ +BaseType_t xCoRoutineRemoveFromEventList( const List_t * pxEventList ); + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* CO_ROUTINE_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/deprecated_definitions.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/deprecated_definitions.h new file mode 100644 index 0000000..78ff7e5 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/deprecated_definitions.h @@ -0,0 +1,282 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef DEPRECATED_DEFINITIONS_H +#define DEPRECATED_DEFINITIONS_H + + +/* Each FreeRTOS port has a unique portmacro.h header file. Originally a + * pre-processor definition was used to ensure the pre-processor found the correct + * portmacro.h file for the port being used. That scheme was deprecated in favour + * of setting the compiler's include path such that it found the correct + * portmacro.h file - removing the need for the constant and allowing the + * portmacro.h file to be located anywhere in relation to the port being used. The + * definitions below remain in the code for backward compatibility only. New + * projects should not use them. */ + +#ifdef OPEN_WATCOM_INDUSTRIAL_PC_PORT + #include "..\..\Source\portable\owatcom\16bitdos\pc\portmacro.h" + typedef void ( __interrupt __far * pxISR )(); +#endif + +#ifdef OPEN_WATCOM_FLASH_LITE_186_PORT + #include "..\..\Source\portable\owatcom\16bitdos\flsh186\portmacro.h" + typedef void ( __interrupt __far * pxISR )(); +#endif + +#ifdef GCC_MEGA_AVR + #include "../portable/GCC/ATMega323/portmacro.h" +#endif + +#ifdef IAR_MEGA_AVR + #include "../portable/IAR/ATMega323/portmacro.h" +#endif + +#ifdef MPLAB_PIC24_PORT + #include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" +#endif + +#ifdef MPLAB_DSPIC_PORT + #include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" +#endif + +#ifdef MPLAB_PIC18F_PORT + #include "../../Source/portable/MPLAB/PIC18F/portmacro.h" +#endif + +#ifdef MPLAB_PIC32MX_PORT + #include "../../Source/portable/MPLAB/PIC32MX/portmacro.h" +#endif + +#ifdef _FEDPICC + #include "libFreeRTOS/Include/portmacro.h" +#endif + +#ifdef SDCC_CYGNAL + #include "../../Source/portable/SDCC/Cygnal/portmacro.h" +#endif + +#ifdef GCC_ARM7 + #include "../../Source/portable/GCC/ARM7_LPC2000/portmacro.h" +#endif + +#ifdef GCC_ARM7_ECLIPSE + #include "portmacro.h" +#endif + +#ifdef ROWLEY_LPC23xx + #include "../../Source/portable/GCC/ARM7_LPC23xx/portmacro.h" +#endif + +#ifdef IAR_MSP430 + #include "..\..\Source\portable\IAR\MSP430\portmacro.h" +#endif + +#ifdef GCC_MSP430 + #include "../../Source/portable/GCC/MSP430F449/portmacro.h" +#endif + +#ifdef ROWLEY_MSP430 + #include "../../Source/portable/Rowley/MSP430F449/portmacro.h" +#endif + +#ifdef ARM7_LPC21xx_KEIL_RVDS + #include "..\..\Source\portable\RVDS\ARM7_LPC21xx\portmacro.h" +#endif + +#ifdef SAM7_GCC + #include "../../Source/portable/GCC/ARM7_AT91SAM7S/portmacro.h" +#endif + +#ifdef SAM7_IAR + #include "..\..\Source\portable\IAR\AtmelSAM7S64\portmacro.h" +#endif + +#ifdef SAM9XE_IAR + #include "..\..\Source\portable\IAR\AtmelSAM9XE\portmacro.h" +#endif + +#ifdef LPC2000_IAR + #include "..\..\Source\portable\IAR\LPC2000\portmacro.h" +#endif + +#ifdef STR71X_IAR + #include "..\..\Source\portable\IAR\STR71x\portmacro.h" +#endif + +#ifdef STR75X_IAR + #include "..\..\Source\portable\IAR\STR75x\portmacro.h" +#endif + +#ifdef STR75X_GCC + #include "..\..\Source\portable\GCC\STR75x\portmacro.h" +#endif + +#ifdef STR91X_IAR + #include "..\..\Source\portable\IAR\STR91x\portmacro.h" +#endif + +#ifdef GCC_H8S + #include "../../Source/portable/GCC/H8S2329/portmacro.h" +#endif + +#ifdef GCC_AT91FR40008 + #include "../../Source/portable/GCC/ARM7_AT91FR40008/portmacro.h" +#endif + +#ifdef RVDS_ARMCM3_LM3S102 + #include "../../Source/portable/RVDS/ARM_CM3/portmacro.h" +#endif + +#ifdef GCC_ARMCM3_LM3S102 + #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" +#endif + +#ifdef GCC_ARMCM3 + #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" +#endif + +#ifdef IAR_ARM_CM3 + #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" +#endif + +#ifdef IAR_ARMCM3_LM + #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" +#endif + +#ifdef HCS12_CODE_WARRIOR + #include "../../Source/portable/CodeWarrior/HCS12/portmacro.h" +#endif + +#ifdef MICROBLAZE_GCC + #include "../../Source/portable/GCC/MicroBlaze/portmacro.h" +#endif + +#ifdef TERN_EE + #include "..\..\Source\portable\Paradigm\Tern_EE\small\portmacro.h" +#endif + +#ifdef GCC_HCS12 + #include "../../Source/portable/GCC/HCS12/portmacro.h" +#endif + +#ifdef GCC_MCF5235 + #include "../../Source/portable/GCC/MCF5235/portmacro.h" +#endif + +#ifdef COLDFIRE_V2_GCC + #include "../../../Source/portable/GCC/ColdFire_V2/portmacro.h" +#endif + +#ifdef COLDFIRE_V2_CODEWARRIOR + #include "../../Source/portable/CodeWarrior/ColdFire_V2/portmacro.h" +#endif + +#ifdef GCC_PPC405 + #include "../../Source/portable/GCC/PPC405_Xilinx/portmacro.h" +#endif + +#ifdef GCC_PPC440 + #include "../../Source/portable/GCC/PPC440_Xilinx/portmacro.h" +#endif + +#ifdef _16FX_SOFTUNE + #include "..\..\Source\portable\Softune\MB96340\portmacro.h" +#endif + +#ifdef BCC_INDUSTRIAL_PC_PORT + +/* A short file name has to be used in place of the normal + * FreeRTOSConfig.h when using the Borland compiler. */ + #include "frconfig.h" + #include "..\portable\BCC\16BitDOS\PC\prtmacro.h" + typedef void ( __interrupt __far * pxISR )(); +#endif + +#ifdef BCC_FLASH_LITE_186_PORT + +/* A short file name has to be used in place of the normal + * FreeRTOSConfig.h when using the Borland compiler. */ + #include "frconfig.h" + #include "..\portable\BCC\16BitDOS\flsh186\prtmacro.h" + typedef void ( __interrupt __far * pxISR )(); +#endif + +#ifdef __GNUC__ + #ifdef __AVR32_AVR32A__ + #include "portmacro.h" + #endif +#endif + +#ifdef __ICCAVR32__ + #ifdef __CORE__ + #if __CORE__ == __AVR32A__ + #include "portmacro.h" + #endif + #endif +#endif + +#ifdef __91467D + #include "portmacro.h" +#endif + +#ifdef __96340 + #include "portmacro.h" +#endif + + +#ifdef __IAR_V850ES_Fx3__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx3__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx3_L__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx2__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Hx2__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_78K0R_Kx3__ + #include "../../Source/portable/IAR/78K0R/portmacro.h" +#endif + +#ifdef __IAR_78K0R_Kx3L__ + #include "../../Source/portable/IAR/78K0R/portmacro.h" +#endif + +#endif /* DEPRECATED_DEFINITIONS_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/event_groups.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/event_groups.h new file mode 100644 index 0000000..d27dc7d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/event_groups.h @@ -0,0 +1,828 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef EVENT_GROUPS_H +#define EVENT_GROUPS_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h" must appear in source files before "include event_groups.h" +#endif + +/* FreeRTOS includes. */ +#include "timers.h" + +/* The following bit fields convey control information in a task's event list + * item value. It is important they don't clash with the + * taskEVENT_LIST_ITEM_VALUE_IN_USE definition. */ +#if ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_16_BITS ) + #define eventCLEAR_EVENTS_ON_EXIT_BIT ( ( uint16_t ) 0x0100U ) + #define eventUNBLOCKED_DUE_TO_BIT_SET ( ( uint16_t ) 0x0200U ) + #define eventWAIT_FOR_ALL_BITS ( ( uint16_t ) 0x0400U ) + #define eventEVENT_BITS_CONTROL_BYTES ( ( uint16_t ) 0xff00U ) +#elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_32_BITS ) + #define eventCLEAR_EVENTS_ON_EXIT_BIT ( ( uint32_t ) 0x01000000UL ) + #define eventUNBLOCKED_DUE_TO_BIT_SET ( ( uint32_t ) 0x02000000UL ) + #define eventWAIT_FOR_ALL_BITS ( ( uint32_t ) 0x04000000UL ) + #define eventEVENT_BITS_CONTROL_BYTES ( ( uint32_t ) 0xff000000UL ) +#elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_64_BITS ) + #define eventCLEAR_EVENTS_ON_EXIT_BIT ( ( uint64_t ) 0x0100000000000000ULL ) + #define eventUNBLOCKED_DUE_TO_BIT_SET ( ( uint64_t ) 0x0200000000000000ULL ) + #define eventWAIT_FOR_ALL_BITS ( ( uint64_t ) 0x0400000000000000ULL ) + #define eventEVENT_BITS_CONTROL_BYTES ( ( uint64_t ) 0xff00000000000000ULL ) +#endif /* if ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_16_BITS ) */ + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/** + * An event group is a collection of bits to which an application can assign a + * meaning. For example, an application may create an event group to convey + * the status of various CAN bus related events in which bit 0 might mean "A CAN + * message has been received and is ready for processing", bit 1 might mean "The + * application has queued a message that is ready for sending onto the CAN + * network", and bit 2 might mean "It is time to send a SYNC message onto the + * CAN network" etc. A task can then test the bit values to see which events + * are active, and optionally enter the Blocked state to wait for a specified + * bit or a group of specified bits to be active. To continue the CAN bus + * example, a CAN controlling task can enter the Blocked state (and therefore + * not consume any processing time) until either bit 0, bit 1 or bit 2 are + * active, at which time the bit that was actually active would inform the task + * which action it had to take (process a received message, send a message, or + * send a SYNC). + * + * The event groups implementation contains intelligence to avoid race + * conditions that would otherwise occur were an application to use a simple + * variable for the same purpose. This is particularly important with respect + * to when a bit within an event group is to be cleared, and when bits have to + * be set and then tested atomically - as is the case where event groups are + * used to create a synchronisation point between multiple tasks (a + * 'rendezvous'). + */ + + + +/** + * event_groups.h + * + * Type by which event groups are referenced. For example, a call to + * xEventGroupCreate() returns an EventGroupHandle_t variable that can then + * be used as a parameter to other event group functions. + * + * \defgroup EventGroupHandle_t EventGroupHandle_t + * \ingroup EventGroup + */ +struct EventGroupDef_t; +typedef struct EventGroupDef_t * EventGroupHandle_t; + +/* + * The type that holds event bits always matches TickType_t - therefore the + * number of bits it holds is set by configTICK_TYPE_WIDTH_IN_BITS (16 bits if set to 0, + * 32 bits if set to 1, 64 bits if set to 2. + * + * \defgroup EventBits_t EventBits_t + * \ingroup EventGroup + */ +typedef TickType_t EventBits_t; + +/** + * event_groups.h + * @code{c} + * EventGroupHandle_t xEventGroupCreate( void ); + * @endcode + * + * Create a new event group. + * + * Internally, within the FreeRTOS implementation, event groups use a [small] + * block of memory, in which the event group's structure is stored. If an event + * groups is created using xEventGroupCreate() then the required memory is + * automatically dynamically allocated inside the xEventGroupCreate() function. + * (see https://www.FreeRTOS.org/a00111.html). If an event group is created + * using xEventGroupCreateStatic() then the application writer must instead + * provide the memory that will get used by the event group. + * xEventGroupCreateStatic() therefore allows an event group to be created + * without using any dynamic memory allocation. + * + * Although event groups are not related to ticks, for internal implementation + * reasons the number of bits available for use in an event group is dependent + * on the configTICK_TYPE_WIDTH_IN_BITS setting in FreeRTOSConfig.h. If + * configTICK_TYPE_WIDTH_IN_BITS is 0 then each event group contains 8 usable bits (bit + * 0 to bit 7). If configTICK_TYPE_WIDTH_IN_BITS is set to 1 then each event group has + * 24 usable bits (bit 0 to bit 23). If configTICK_TYPE_WIDTH_IN_BITS is set to 2 then + * each event group has 56 usable bits (bit 0 to bit 53). The EventBits_t type + * is used to store event bits within an event group. + * + * @return If the event group was created then a handle to the event group is + * returned. If there was insufficient FreeRTOS heap available to create the + * event group then NULL is returned. See https://www.FreeRTOS.org/a00111.html + * + * Example usage: + * @code{c} + * // Declare a variable to hold the created event group. + * EventGroupHandle_t xCreatedEventGroup; + * + * // Attempt to create the event group. + * xCreatedEventGroup = xEventGroupCreate(); + * + * // Was the event group created successfully? + * if( xCreatedEventGroup == NULL ) + * { + * // The event group was not created because there was insufficient + * // FreeRTOS heap available. + * } + * else + * { + * // The event group was created. + * } + * @endcode + * \defgroup xEventGroupCreate xEventGroupCreate + * \ingroup EventGroup + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + EventGroupHandle_t xEventGroupCreate( void ) PRIVILEGED_FUNCTION; +#endif + +/** + * event_groups.h + * @code{c} + * EventGroupHandle_t xEventGroupCreateStatic( EventGroupHandle_t * pxEventGroupBuffer ); + * @endcode + * + * Create a new event group. + * + * Internally, within the FreeRTOS implementation, event groups use a [small] + * block of memory, in which the event group's structure is stored. If an event + * groups is created using xEventGroupCreate() then the required memory is + * automatically dynamically allocated inside the xEventGroupCreate() function. + * (see https://www.FreeRTOS.org/a00111.html). If an event group is created + * using xEventGroupCreateStatic() then the application writer must instead + * provide the memory that will get used by the event group. + * xEventGroupCreateStatic() therefore allows an event group to be created + * without using any dynamic memory allocation. + * + * Although event groups are not related to ticks, for internal implementation + * reasons the number of bits available for use in an event group is dependent + * on the configTICK_TYPE_WIDTH_IN_BITS setting in FreeRTOSConfig.h. If + * configTICK_TYPE_WIDTH_IN_BITS is 0 then each event group contains 8 usable bits (bit + * 0 to bit 7). If configTICK_TYPE_WIDTH_IN_BITS is set to 1 then each event group has + * 24 usable bits (bit 0 to bit 23). If configTICK_TYPE_WIDTH_IN_BITS is set to 2 then + * each event group has 56 usable bits (bit 0 to bit 53). The EventBits_t type + * is used to store event bits within an event group. + * + * @param pxEventGroupBuffer pxEventGroupBuffer must point to a variable of type + * StaticEventGroup_t, which will be then be used to hold the event group's data + * structures, removing the need for the memory to be allocated dynamically. + * + * @return If the event group was created then a handle to the event group is + * returned. If pxEventGroupBuffer was NULL then NULL is returned. + * + * Example usage: + * @code{c} + * // StaticEventGroup_t is a publicly accessible structure that has the same + * // size and alignment requirements as the real event group structure. It is + * // provided as a mechanism for applications to know the size of the event + * // group (which is dependent on the architecture and configuration file + * // settings) without breaking the strict data hiding policy by exposing the + * // real event group internals. This StaticEventGroup_t variable is passed + * // into the xSemaphoreCreateEventGroupStatic() function and is used to store + * // the event group's data structures + * StaticEventGroup_t xEventGroupBuffer; + * + * // Create the event group without dynamically allocating any memory. + * xEventGroup = xEventGroupCreateStatic( &xEventGroupBuffer ); + * @endcode + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer ) PRIVILEGED_FUNCTION; +#endif + +/** + * event_groups.h + * @code{c} + * EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, + * const EventBits_t uxBitsToWaitFor, + * const BaseType_t xClearOnExit, + * const BaseType_t xWaitForAllBits, + * const TickType_t xTicksToWait ); + * @endcode + * + * [Potentially] block to wait for one or more bits to be set within a + * previously created event group. + * + * This function cannot be called from an interrupt. + * + * @param xEventGroup The event group in which the bits are being tested. The + * event group must have previously been created using a call to + * xEventGroupCreate(). + * + * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test + * inside the event group. For example, to wait for bit 0 and/or bit 2 set + * uxBitsToWaitFor to 0x05. To wait for bits 0 and/or bit 1 and/or bit 2 set + * uxBitsToWaitFor to 0x07. Etc. + * + * @param xClearOnExit If xClearOnExit is set to pdTRUE then any bits within + * uxBitsToWaitFor that are set within the event group will be cleared before + * xEventGroupWaitBits() returns if the wait condition was met (if the function + * returns for a reason other than a timeout). If xClearOnExit is set to + * pdFALSE then the bits set in the event group are not altered when the call to + * xEventGroupWaitBits() returns. + * + * @param xWaitForAllBits If xWaitForAllBits is set to pdTRUE then + * xEventGroupWaitBits() will return when either all the bits in uxBitsToWaitFor + * are set or the specified block time expires. If xWaitForAllBits is set to + * pdFALSE then xEventGroupWaitBits() will return when any one of the bits set + * in uxBitsToWaitFor is set or the specified block time expires. The block + * time is specified by the xTicksToWait parameter. + * + * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait + * for one/all (depending on the xWaitForAllBits value) of the bits specified by + * uxBitsToWaitFor to become set. A value of portMAX_DELAY can be used to block + * indefinitely (provided INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h). + * + * @return The value of the event group at the time either the bits being waited + * for became set, or the block time expired. Test the return value to know + * which bits were set. If xEventGroupWaitBits() returned because its timeout + * expired then not all the bits being waited for will be set. If + * xEventGroupWaitBits() returned because the bits it was waiting for were set + * then the returned value is the event group value before any bits were + * automatically cleared in the case that xClearOnExit parameter was set to + * pdTRUE. + * + * Example usage: + * @code{c} + * #define BIT_0 ( 1 << 0 ) + * #define BIT_4 ( 1 << 4 ) + * + * void aFunction( EventGroupHandle_t xEventGroup ) + * { + * EventBits_t uxBits; + * const TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS; + * + * // Wait a maximum of 100ms for either bit 0 or bit 4 to be set within + * // the event group. Clear the bits before exiting. + * uxBits = xEventGroupWaitBits( + * xEventGroup, // The event group being tested. + * BIT_0 | BIT_4, // The bits within the event group to wait for. + * pdTRUE, // BIT_0 and BIT_4 should be cleared before returning. + * pdFALSE, // Don't wait for both bits, either bit will do. + * xTicksToWait ); // Wait a maximum of 100ms for either bit to be set. + * + * if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) ) + * { + * // xEventGroupWaitBits() returned because both bits were set. + * } + * else if( ( uxBits & BIT_0 ) != 0 ) + * { + * // xEventGroupWaitBits() returned because just BIT_0 was set. + * } + * else if( ( uxBits & BIT_4 ) != 0 ) + * { + * // xEventGroupWaitBits() returned because just BIT_4 was set. + * } + * else + * { + * // xEventGroupWaitBits() returned because xTicksToWait ticks passed + * // without either BIT_0 or BIT_4 becoming set. + * } + * } + * @endcode + * \defgroup xEventGroupWaitBits xEventGroupWaitBits + * \ingroup EventGroup + */ +EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToWaitFor, + const BaseType_t xClearOnExit, + const BaseType_t xWaitForAllBits, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + * @code{c} + * EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ); + * @endcode + * + * Clear bits within an event group. This function cannot be called from an + * interrupt. + * + * @param xEventGroup The event group in which the bits are to be cleared. + * + * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear + * in the event group. For example, to clear bit 3 only, set uxBitsToClear to + * 0x08. To clear bit 3 and bit 0 set uxBitsToClear to 0x09. + * + * @return The value of the event group before the specified bits were cleared. + * + * Example usage: + * @code{c} + * #define BIT_0 ( 1 << 0 ) + * #define BIT_4 ( 1 << 4 ) + * + * void aFunction( EventGroupHandle_t xEventGroup ) + * { + * EventBits_t uxBits; + * + * // Clear bit 0 and bit 4 in xEventGroup. + * uxBits = xEventGroupClearBits( + * xEventGroup, // The event group being updated. + * BIT_0 | BIT_4 );// The bits being cleared. + * + * if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) ) + * { + * // Both bit 0 and bit 4 were set before xEventGroupClearBits() was + * // called. Both will now be clear (not set). + * } + * else if( ( uxBits & BIT_0 ) != 0 ) + * { + * // Bit 0 was set before xEventGroupClearBits() was called. It will + * // now be clear. + * } + * else if( ( uxBits & BIT_4 ) != 0 ) + * { + * // Bit 4 was set before xEventGroupClearBits() was called. It will + * // now be clear. + * } + * else + * { + * // Neither bit 0 nor bit 4 were set in the first place. + * } + * } + * @endcode + * \defgroup xEventGroupClearBits xEventGroupClearBits + * \ingroup EventGroup + */ +EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + * @code{c} + * BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ); + * @endcode + * + * A version of xEventGroupClearBits() that can be called from an interrupt. + * + * Setting bits in an event group is not a deterministic operation because there + * are an unknown number of tasks that may be waiting for the bit or bits being + * set. FreeRTOS does not allow nondeterministic operations to be performed + * while interrupts are disabled, so protects event groups that are accessed + * from tasks by suspending the scheduler rather than disabling interrupts. As + * a result event groups cannot be accessed directly from an interrupt service + * routine. Therefore xEventGroupClearBitsFromISR() sends a message to the + * timer task to have the clear operation performed in the context of the timer + * task. + * + * @note If this function returns pdPASS then the timer task is ready to run + * and a portYIELD_FROM_ISR(pdTRUE) should be executed to perform the needed + * clear on the event group. This behavior is different from + * xEventGroupSetBitsFromISR because the parameter xHigherPriorityTaskWoken is + * not present. + * + * @param xEventGroup The event group in which the bits are to be cleared. + * + * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear. + * For example, to clear bit 3 only, set uxBitsToClear to 0x08. To clear bit 3 + * and bit 0 set uxBitsToClear to 0x09. + * + * @return If the request to execute the function was posted successfully then + * pdPASS is returned, otherwise pdFALSE is returned. pdFALSE will be returned + * if the timer service queue was full. + * + * Example usage: + * @code{c} + * #define BIT_0 ( 1 << 0 ) + * #define BIT_4 ( 1 << 4 ) + * + * // An event group which it is assumed has already been created by a call to + * // xEventGroupCreate(). + * EventGroupHandle_t xEventGroup; + * + * void anInterruptHandler( void ) + * { + * // Clear bit 0 and bit 4 in xEventGroup. + * xResult = xEventGroupClearBitsFromISR( + * xEventGroup, // The event group being updated. + * BIT_0 | BIT_4 ); // The bits being set. + * + * if( xResult == pdPASS ) + * { + * // The message was posted successfully. + * portYIELD_FROM_ISR(pdTRUE); + * } + * } + * @endcode + * \defgroup xEventGroupClearBitsFromISR xEventGroupClearBitsFromISR + * \ingroup EventGroup + */ +#if ( configUSE_TRACE_FACILITY == 1 ) + BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION; +#else + #define xEventGroupClearBitsFromISR( xEventGroup, uxBitsToClear ) \ + xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) ( xEventGroup ), ( uint32_t ) ( uxBitsToClear ), NULL ) +#endif + +/** + * event_groups.h + * @code{c} + * EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ); + * @endcode + * + * Set bits within an event group. + * This function cannot be called from an interrupt. xEventGroupSetBitsFromISR() + * is a version that can be called from an interrupt. + * + * Setting bits in an event group will automatically unblock tasks that are + * blocked waiting for the bits. + * + * @param xEventGroup The event group in which the bits are to be set. + * + * @param uxBitsToSet A bitwise value that indicates the bit or bits to set. + * For example, to set bit 3 only, set uxBitsToSet to 0x08. To set bit 3 + * and bit 0 set uxBitsToSet to 0x09. + * + * @return The value of the event group at the time the call to + * xEventGroupSetBits() returns. There are two reasons why the returned value + * might have the bits specified by the uxBitsToSet parameter cleared. First, + * if setting a bit results in a task that was waiting for the bit leaving the + * blocked state then it is possible the bit will be cleared automatically + * (see the xClearBitOnExit parameter of xEventGroupWaitBits()). Second, any + * unblocked (or otherwise Ready state) task that has a priority above that of + * the task that called xEventGroupSetBits() will execute and may change the + * event group value before the call to xEventGroupSetBits() returns. + * + * Example usage: + * @code{c} + * #define BIT_0 ( 1 << 0 ) + * #define BIT_4 ( 1 << 4 ) + * + * void aFunction( EventGroupHandle_t xEventGroup ) + * { + * EventBits_t uxBits; + * + * // Set bit 0 and bit 4 in xEventGroup. + * uxBits = xEventGroupSetBits( + * xEventGroup, // The event group being updated. + * BIT_0 | BIT_4 );// The bits being set. + * + * if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) ) + * { + * // Both bit 0 and bit 4 remained set when the function returned. + * } + * else if( ( uxBits & BIT_0 ) != 0 ) + * { + * // Bit 0 remained set when the function returned, but bit 4 was + * // cleared. It might be that bit 4 was cleared automatically as a + * // task that was waiting for bit 4 was removed from the Blocked + * // state. + * } + * else if( ( uxBits & BIT_4 ) != 0 ) + * { + * // Bit 4 remained set when the function returned, but bit 0 was + * // cleared. It might be that bit 0 was cleared automatically as a + * // task that was waiting for bit 0 was removed from the Blocked + * // state. + * } + * else + * { + * // Neither bit 0 nor bit 4 remained set. It might be that a task + * // was waiting for both of the bits to be set, and the bits were + * // cleared as the task left the Blocked state. + * } + * } + * @endcode + * \defgroup xEventGroupSetBits xEventGroupSetBits + * \ingroup EventGroup + */ +EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + * @code{c} + * BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * A version of xEventGroupSetBits() that can be called from an interrupt. + * + * Setting bits in an event group is not a deterministic operation because there + * are an unknown number of tasks that may be waiting for the bit or bits being + * set. FreeRTOS does not allow nondeterministic operations to be performed in + * interrupts or from critical sections. Therefore xEventGroupSetBitsFromISR() + * sends a message to the timer task to have the set operation performed in the + * context of the timer task - where a scheduler lock is used in place of a + * critical section. + * + * @param xEventGroup The event group in which the bits are to be set. + * + * @param uxBitsToSet A bitwise value that indicates the bit or bits to set. + * For example, to set bit 3 only, set uxBitsToSet to 0x08. To set bit 3 + * and bit 0 set uxBitsToSet to 0x09. + * + * @param pxHigherPriorityTaskWoken As mentioned above, calling this function + * will result in a message being sent to the timer daemon task. If the + * priority of the timer daemon task is higher than the priority of the + * currently running task (the task the interrupt interrupted) then + * *pxHigherPriorityTaskWoken will be set to pdTRUE by + * xEventGroupSetBitsFromISR(), indicating that a context switch should be + * requested before the interrupt exits. For that reason + * *pxHigherPriorityTaskWoken must be initialised to pdFALSE. See the + * example code below. + * + * @return If the request to execute the function was posted successfully then + * pdPASS is returned, otherwise pdFALSE is returned. pdFALSE will be returned + * if the timer service queue was full. + * + * Example usage: + * @code{c} + * #define BIT_0 ( 1 << 0 ) + * #define BIT_4 ( 1 << 4 ) + * + * // An event group which it is assumed has already been created by a call to + * // xEventGroupCreate(). + * EventGroupHandle_t xEventGroup; + * + * void anInterruptHandler( void ) + * { + * BaseType_t xHigherPriorityTaskWoken, xResult; + * + * // xHigherPriorityTaskWoken must be initialised to pdFALSE. + * xHigherPriorityTaskWoken = pdFALSE; + * + * // Set bit 0 and bit 4 in xEventGroup. + * xResult = xEventGroupSetBitsFromISR( + * xEventGroup, // The event group being updated. + * BIT_0 | BIT_4 // The bits being set. + * &xHigherPriorityTaskWoken ); + * + * // Was the message posted successfully? + * if( xResult == pdPASS ) + * { + * // If xHigherPriorityTaskWoken is now set to pdTRUE then a context + * // switch should be requested. The macro used is port specific and + * // will be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - + * // refer to the documentation page for the port being used. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * } + * } + * @endcode + * \defgroup xEventGroupSetBitsFromISR xEventGroupSetBitsFromISR + * \ingroup EventGroup + */ +#if ( configUSE_TRACE_FACILITY == 1 ) + BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +#else + #define xEventGroupSetBitsFromISR( xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken ) \ + xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) ( xEventGroup ), ( uint32_t ) ( uxBitsToSet ), ( pxHigherPriorityTaskWoken ) ) +#endif + +/** + * event_groups.h + * @code{c} + * EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, + * const EventBits_t uxBitsToSet, + * const EventBits_t uxBitsToWaitFor, + * TickType_t xTicksToWait ); + * @endcode + * + * Atomically set bits within an event group, then wait for a combination of + * bits to be set within the same event group. This functionality is typically + * used to synchronise multiple tasks, where each task has to wait for the other + * tasks to reach a synchronisation point before proceeding. + * + * This function cannot be used from an interrupt. + * + * The function will return before its block time expires if the bits specified + * by the uxBitsToWait parameter are set, or become set within that time. In + * this case all the bits specified by uxBitsToWait will be automatically + * cleared before the function returns. + * + * @param xEventGroup The event group in which the bits are being tested. The + * event group must have previously been created using a call to + * xEventGroupCreate(). + * + * @param uxBitsToSet The bits to set in the event group before determining + * if, and possibly waiting for, all the bits specified by the uxBitsToWait + * parameter are set. + * + * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test + * inside the event group. For example, to wait for bit 0 and bit 2 set + * uxBitsToWaitFor to 0x05. To wait for bits 0 and bit 1 and bit 2 set + * uxBitsToWaitFor to 0x07. Etc. + * + * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait + * for all of the bits specified by uxBitsToWaitFor to become set. + * + * @return The value of the event group at the time either the bits being waited + * for became set, or the block time expired. Test the return value to know + * which bits were set. If xEventGroupSync() returned because its timeout + * expired then not all the bits being waited for will be set. If + * xEventGroupSync() returned because all the bits it was waiting for were + * set then the returned value is the event group value before any bits were + * automatically cleared. + * + * Example usage: + * @code{c} + * // Bits used by the three tasks. + * #define TASK_0_BIT ( 1 << 0 ) + * #define TASK_1_BIT ( 1 << 1 ) + * #define TASK_2_BIT ( 1 << 2 ) + * + * #define ALL_SYNC_BITS ( TASK_0_BIT | TASK_1_BIT | TASK_2_BIT ) + * + * // Use an event group to synchronise three tasks. It is assumed this event + * // group has already been created elsewhere. + * EventGroupHandle_t xEventBits; + * + * void vTask0( void *pvParameters ) + * { + * EventBits_t uxReturn; + * TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS; + * + * for( ;; ) + * { + * // Perform task functionality here. + * + * // Set bit 0 in the event flag to note this task has reached the + * // sync point. The other two tasks will set the other two bits defined + * // by ALL_SYNC_BITS. All three tasks have reached the synchronisation + * // point when all the ALL_SYNC_BITS are set. Wait a maximum of 100ms + * // for this to happen. + * uxReturn = xEventGroupSync( xEventBits, TASK_0_BIT, ALL_SYNC_BITS, xTicksToWait ); + * + * if( ( uxReturn & ALL_SYNC_BITS ) == ALL_SYNC_BITS ) + * { + * // All three tasks reached the synchronisation point before the call + * // to xEventGroupSync() timed out. + * } + * } + * } + * + * void vTask1( void *pvParameters ) + * { + * for( ;; ) + * { + * // Perform task functionality here. + * + * // Set bit 1 in the event flag to note this task has reached the + * // synchronisation point. The other two tasks will set the other two + * // bits defined by ALL_SYNC_BITS. All three tasks have reached the + * // synchronisation point when all the ALL_SYNC_BITS are set. Wait + * // indefinitely for this to happen. + * xEventGroupSync( xEventBits, TASK_1_BIT, ALL_SYNC_BITS, portMAX_DELAY ); + * + * // xEventGroupSync() was called with an indefinite block time, so + * // this task will only reach here if the synchronisation was made by all + * // three tasks, so there is no need to test the return value. + * } + * } + * + * void vTask2( void *pvParameters ) + * { + * for( ;; ) + * { + * // Perform task functionality here. + * + * // Set bit 2 in the event flag to note this task has reached the + * // synchronisation point. The other two tasks will set the other two + * // bits defined by ALL_SYNC_BITS. All three tasks have reached the + * // synchronisation point when all the ALL_SYNC_BITS are set. Wait + * // indefinitely for this to happen. + * xEventGroupSync( xEventBits, TASK_2_BIT, ALL_SYNC_BITS, portMAX_DELAY ); + * + * // xEventGroupSync() was called with an indefinite block time, so + * // this task will only reach here if the synchronisation was made by all + * // three tasks, so there is no need to test the return value. + * } + * } + * + * @endcode + * \defgroup xEventGroupSync xEventGroupSync + * \ingroup EventGroup + */ +EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet, + const EventBits_t uxBitsToWaitFor, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + + +/** + * event_groups.h + * @code{c} + * EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup ); + * @endcode + * + * Returns the current value of the bits in an event group. This function + * cannot be used from an interrupt. + * + * @param xEventGroup The event group being queried. + * + * @return The event group bits at the time xEventGroupGetBits() was called. + * + * \defgroup xEventGroupGetBits xEventGroupGetBits + * \ingroup EventGroup + */ +#define xEventGroupGetBits( xEventGroup ) xEventGroupClearBits( ( xEventGroup ), 0 ) + +/** + * event_groups.h + * @code{c} + * EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ); + * @endcode + * + * A version of xEventGroupGetBits() that can be called from an ISR. + * + * @param xEventGroup The event group being queried. + * + * @return The event group bits at the time xEventGroupGetBitsFromISR() was called. + * + * \defgroup xEventGroupGetBitsFromISR xEventGroupGetBitsFromISR + * \ingroup EventGroup + */ +EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + * @code{c} + * void xEventGroupDelete( EventGroupHandle_t xEventGroup ); + * @endcode + * + * Delete an event group that was previously created by a call to + * xEventGroupCreate(). Tasks that are blocked on the event group will be + * unblocked and obtain 0 as the event group's value. + * + * @param xEventGroup The event group being deleted. + */ +void vEventGroupDelete( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + * @code{c} + * BaseType_t xEventGroupGetStaticBuffer( EventGroupHandle_t xEventGroup, + * StaticEventGroup_t ** ppxEventGroupBuffer ); + * @endcode + * + * Retrieve a pointer to a statically created event groups's data structure + * buffer. It is the same buffer that is supplied at the time of creation. + * + * @param xEventGroup The event group for which to retrieve the buffer. + * + * @param ppxEventGroupBuffer Used to return a pointer to the event groups's + * data structure buffer. + * + * @return pdTRUE if the buffer was retrieved, pdFALSE otherwise. + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + BaseType_t xEventGroupGetStaticBuffer( EventGroupHandle_t xEventGroup, + StaticEventGroup_t ** ppxEventGroupBuffer ) PRIVILEGED_FUNCTION; +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/* For internal use only. */ +void vEventGroupSetBitsCallback( void * pvEventGroup, + uint32_t ulBitsToSet ) PRIVILEGED_FUNCTION; +void vEventGroupClearBitsCallback( void * pvEventGroup, + uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION; + + +#if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxEventGroupGetNumber( void * xEventGroup ) PRIVILEGED_FUNCTION; + void vEventGroupSetNumber( void * xEventGroup, + UBaseType_t uxEventGroupNumber ) PRIVILEGED_FUNCTION; +#endif + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* EVENT_GROUPS_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/freertos_tasks_c_additions.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/freertos_tasks_c_additions.h new file mode 100644 index 0000000..690bcd1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/freertos_tasks_c_additions.h @@ -0,0 +1,138 @@ +/* + * Copyright 2017-2020 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* freertos_tasks_c_additions.h Rev. 1.4 */ +#ifndef FREERTOS_TASKS_C_ADDITIONS_H +#define FREERTOS_TASKS_C_ADDITIONS_H + +#include +#if !defined(__HIWARE__) /* << EST */ + #include +#endif + +#if (configUSE_TRACE_FACILITY == 0) +#error "configUSE_TRACE_FACILITY must be enabled" +#endif + +#define FREERTOS_DEBUG_CONFIG_MAJOR_VERSION 1 +#define FREERTOS_DEBUG_CONFIG_MINOR_VERSION 2 + +/* NOTE!! + * Default to a FreeRTOS version which didn't include these macros. FreeRTOS + * v7.5.3 is used here. + */ +#ifndef tskKERNEL_VERSION_BUILD +#define tskKERNEL_VERSION_BUILD 3 +#endif +#ifndef tskKERNEL_VERSION_MINOR +#define tskKERNEL_VERSION_MINOR 5 +#endif +#ifndef tskKERNEL_VERSION_MAJOR +#define tskKERNEL_VERSION_MAJOR 7 +#endif + +/* NOTE!! + * The configFRTOS_MEMORY_SCHEME macro describes the heap scheme using a value + * 1 - 5 which corresponds to the following schemes: + * + * heap_1 - the very simplest, does not permit memory to be freed + * heap_2 - permits memory to be freed, but not does coalescence adjacent free + * blocks. + * heap_3 - simply wraps the standard malloc() and free() for thread safety + * heap_4 - coalesces adjacent free blocks to avoid fragmentation. Includes + * absolute address placement option + * heap_5 - as per heap_4, with the ability to span the heap across + * multiple nonOadjacent memory areas + * heap_6 - reentrant newlib implementation + */ +#ifndef configUSE_HEAP_SCHEME + #define configUSE_HEAP_SCHEME 3 /* thread safe malloc */ +#endif + +#if ((configUSE_HEAP_SCHEME > 6) || (configUSE_HEAP_SCHEME < 1)) /* <= 10) && (tskKERNEL_VERSION_MINOR >= 2) +// Need the portARCH_NAME define +#ifndef portARCH_NAME +#define portARCH_NAME NULL +#endif +#if defined(__GNUC__) +char *const portArch_Name __attribute__((section(".rodata"))) = portARCH_NAME; +#elif defined(__CC_ARM) || defined(__ARMCC_VERSION) +char *const portArch_Name __attribute__((used)) = portARCH_NAME; +#elif defined(__IAR_SYSTEMS_ICC__) +#pragma required=portArch_Name +char *const portArch_Name = portARCH_NAME; +#endif +#else +char *const portArch_Name = NULL; +#endif // tskKERNEL_VERSION_MAJOR + +#if defined(__GNUC__) + const uint8_t FreeRTOSDebugConfig[] __attribute__((used)) __attribute__((section(".rodata"))) __attribute__((aligned(4))) = /* needs to be 32bit aligned for LinkServer FreeRTOS thread awareness, otherwise problem with GDB. */ +#elif defined(__CC_ARM) || defined(__ARMCC_VERSION) + const uint8_t FreeRTOSDebugConfig[] __attribute__((used)) = +#elif defined(__IAR_SYSTEMS_ICC__) + #pragma required=FreeRTOSDebugConfig + const uint8_t FreeRTOSDebugConfig[] = +#else /* << EST generic compiler */ + const uint8_t FreeRTOSDebugConfig[] = +#endif +{ + FREERTOS_DEBUG_CONFIG_MAJOR_VERSION, + FREERTOS_DEBUG_CONFIG_MINOR_VERSION, + tskKERNEL_VERSION_MAJOR, + tskKERNEL_VERSION_MINOR, + tskKERNEL_VERSION_BUILD, + configUSE_HEAP_SCHEME, + offsetof(struct tskTaskControlBlock, pxTopOfStack), +#if (tskKERNEL_VERSION_MAJOR > 8) + offsetof(struct tskTaskControlBlock, xStateListItem), +#else + offsetof(struct tskTaskControlBlock, xGenericListItem), +#endif + offsetof(struct tskTaskControlBlock, xEventListItem), + offsetof(struct tskTaskControlBlock, pxStack), + offsetof(struct tskTaskControlBlock, pcTaskName), + offsetof(struct tskTaskControlBlock, uxTCBNumber), + offsetof(struct tskTaskControlBlock, uxTaskNumber), + configMAX_TASK_NAME_LEN, + configMAX_PRIORITIES, +#if (tskKERNEL_VERSION_MAJOR >= 10) && (tskKERNEL_VERSION_MINOR >= 2) + configENABLE_MPU, + configENABLE_FPU, + configENABLE_TRUSTZONE, + configRUN_FREERTOS_SECURE_ONLY, + 0, // 32-bit align + 0, 0, 0, 0 // padding +#else + 0 // pad to 32-bit boundary +#endif +}; + +#ifdef __cplusplus +} +#endif + +#endif // FREERTOS_TASKS_C_ADDITIONS_H + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/list.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/list.h new file mode 100644 index 0000000..88431e1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/list.h @@ -0,0 +1,504 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * This is the list implementation used by the scheduler. While it is tailored + * heavily for the schedulers needs, it is also available for use by + * application code. + * + * list_ts can only store pointers to list_item_ts. Each ListItem_t contains a + * numeric value (xItemValue). Most of the time the lists are sorted in + * ascending item value order. + * + * Lists are created already containing one list item. The value of this + * item is the maximum possible that can be stored, it is therefore always at + * the end of the list and acts as a marker. The list member pxHead always + * points to this marker - even though it is at the tail of the list. This + * is because the tail contains a wrap back pointer to the true head of + * the list. + * + * In addition to it's value, each list item contains a pointer to the next + * item in the list (pxNext), a pointer to the list it is in (pxContainer) + * and a pointer to back to the object that contains it. These later two + * pointers are included for efficiency of list manipulation. There is + * effectively a two way link between the object containing the list item and + * the list item itself. + * + * + * \page ListIntroduction List Implementation + * \ingroup FreeRTOSIntro + */ + + +#ifndef LIST_H +#define LIST_H + +#ifndef INC_FREERTOS_H + #error "FreeRTOS.h must be included before list.h" +#endif + +/* + * The list structure members are modified from within interrupts, and therefore + * by rights should be declared volatile. However, they are only modified in a + * functionally atomic way (within critical sections of with the scheduler + * suspended) and are either passed by reference into a function or indexed via + * a volatile variable. Therefore, in all use cases tested so far, the volatile + * qualifier can be omitted in order to provide a moderate performance + * improvement without adversely affecting functional behaviour. The assembly + * instructions generated by the IAR, ARM and GCC compilers when the respective + * compiler's options were set for maximum optimisation has been inspected and + * deemed to be as intended. That said, as compiler technology advances, and + * especially if aggressive cross module optimisation is used (a use case that + * has not been exercised to any great extend) then it is feasible that the + * volatile qualifier will be needed for correct optimisation. It is expected + * that a compiler removing essential code because, without the volatile + * qualifier on the list structure members and with aggressive cross module + * optimisation, the compiler deemed the code unnecessary will result in + * complete and obvious failure of the scheduler. If this is ever experienced + * then the volatile qualifier can be inserted in the relevant places within the + * list structures by simply defining configLIST_VOLATILE to volatile in + * FreeRTOSConfig.h (as per the example at the bottom of this comment block). + * If configLIST_VOLATILE is not defined then the preprocessor directives below + * will simply #define configLIST_VOLATILE away completely. + * + * To use volatile list structure members then add the following line to + * FreeRTOSConfig.h (without the quotes): + * "#define configLIST_VOLATILE volatile" + */ +#ifndef configLIST_VOLATILE + #define configLIST_VOLATILE +#endif /* configSUPPORT_CROSS_MODULE_OPTIMISATION */ + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/* Macros that can be used to place known values within the list structures, + * then check that the known values do not get corrupted during the execution of + * the application. These may catch the list data structures being overwritten in + * memory. They will not catch data errors caused by incorrect configuration or + * use of FreeRTOS.*/ +#if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 ) + /* Define the macros to do nothing. */ + #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE + #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE + #define listFIRST_LIST_INTEGRITY_CHECK_VALUE + #define listSECOND_LIST_INTEGRITY_CHECK_VALUE + #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) + #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) + #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ) + #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) + #define listTEST_LIST_ITEM_INTEGRITY( pxItem ) + #define listTEST_LIST_INTEGRITY( pxList ) +#else /* if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 ) */ + /* Define macros that add new members into the list structures. */ + #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue1; + #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue2; + #define listFIRST_LIST_INTEGRITY_CHECK_VALUE TickType_t xListIntegrityValue1; + #define listSECOND_LIST_INTEGRITY_CHECK_VALUE TickType_t xListIntegrityValue2; + +/* Define macros that set the new structure members to known values. */ + #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) ( pxItem )->xListItemIntegrityValue1 = pdINTEGRITY_CHECK_VALUE + #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) ( pxItem )->xListItemIntegrityValue2 = pdINTEGRITY_CHECK_VALUE + #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ) ( pxList )->xListIntegrityValue1 = pdINTEGRITY_CHECK_VALUE + #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) ( pxList )->xListIntegrityValue2 = pdINTEGRITY_CHECK_VALUE + +/* Define macros that will assert if one of the structure members does not + * contain its expected value. */ + #define listTEST_LIST_ITEM_INTEGRITY( pxItem ) configASSERT( ( ( pxItem )->xListItemIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxItem )->xListItemIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) + #define listTEST_LIST_INTEGRITY( pxList ) configASSERT( ( ( pxList )->xListIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxList )->xListIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) +#endif /* configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES */ + + +/* + * Definition of the only type of object that a list can contain. + */ +struct xLIST; +struct xLIST_ITEM +{ + listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /**< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + configLIST_VOLATILE TickType_t xItemValue; /**< The value being listed. In most cases this is used to sort the list in ascending order. */ + struct xLIST_ITEM * configLIST_VOLATILE pxNext; /**< Pointer to the next ListItem_t in the list. */ + struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; /**< Pointer to the previous ListItem_t in the list. */ + void * pvOwner; /**< Pointer to the object (normally a TCB) that contains the list item. There is therefore a two way link between the object containing the list item and the list item itself. */ + struct xLIST * configLIST_VOLATILE pxContainer; /**< Pointer to the list in which this list item is placed (if any). */ + listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE /**< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ +}; +typedef struct xLIST_ITEM ListItem_t; + +#if ( configUSE_MINI_LIST_ITEM == 1 ) + struct xMINI_LIST_ITEM + { + listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /**< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + configLIST_VOLATILE TickType_t xItemValue; + struct xLIST_ITEM * configLIST_VOLATILE pxNext; + struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; + }; + typedef struct xMINI_LIST_ITEM MiniListItem_t; +#else + typedef struct xLIST_ITEM MiniListItem_t; +#endif + +/* + * Definition of the type of queue used by the scheduler. + */ +typedef struct xLIST +{ + listFIRST_LIST_INTEGRITY_CHECK_VALUE /**< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + volatile UBaseType_t uxNumberOfItems; + ListItem_t * configLIST_VOLATILE pxIndex; /**< Used to walk through the list. Points to the last item returned by a call to listGET_OWNER_OF_NEXT_ENTRY (). */ + MiniListItem_t xListEnd; /**< List item that contains the maximum possible item value meaning it is always at the end of the list and is therefore used as a marker. */ + listSECOND_LIST_INTEGRITY_CHECK_VALUE /**< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ +} List_t; + +/* + * Access macro to set the owner of a list item. The owner of a list item + * is the object (usually a TCB) that contains the list item. + * + * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER + * \ingroup LinkedList + */ +#define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner ) ( ( pxListItem )->pvOwner = ( void * ) ( pxOwner ) ) + +/* + * Access macro to get the owner of a list item. The owner of a list item + * is the object (usually a TCB) that contains the list item. + * + * \page listGET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER + * \ingroup LinkedList + */ +#define listGET_LIST_ITEM_OWNER( pxListItem ) ( ( pxListItem )->pvOwner ) + +/* + * Access macro to set the value of the list item. In most cases the value is + * used to sort the list in ascending order. + * + * \page listSET_LIST_ITEM_VALUE listSET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listSET_LIST_ITEM_VALUE( pxListItem, xValue ) ( ( pxListItem )->xItemValue = ( xValue ) ) + +/* + * Access macro to retrieve the value of the list item. The value can + * represent anything - for example the priority of a task, or the time at + * which a task should be unblocked. + * + * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listGET_LIST_ITEM_VALUE( pxListItem ) ( ( pxListItem )->xItemValue ) + +/* + * Access macro to retrieve the value of the list item at the head of a given + * list. + * + * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext->xItemValue ) + +/* + * Return the list item at the head of the list. + * + * \page listGET_HEAD_ENTRY listGET_HEAD_ENTRY + * \ingroup LinkedList + */ +#define listGET_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext ) + +/* + * Return the next list item. + * + * \page listGET_NEXT listGET_NEXT + * \ingroup LinkedList + */ +#define listGET_NEXT( pxListItem ) ( ( pxListItem )->pxNext ) + +/* + * Return the list item that marks the end of the list + * + * \page listGET_END_MARKER listGET_END_MARKER + * \ingroup LinkedList + */ +#define listGET_END_MARKER( pxList ) ( ( ListItem_t const * ) ( &( ( pxList )->xListEnd ) ) ) + +/* + * Access macro to determine if a list contains any items. The macro will + * only have the value true if the list is empty. + * + * \page listLIST_IS_EMPTY listLIST_IS_EMPTY + * \ingroup LinkedList + */ +#define listLIST_IS_EMPTY( pxList ) ( ( ( pxList )->uxNumberOfItems == ( UBaseType_t ) 0 ) ? pdTRUE : pdFALSE ) + +/* + * Access macro to return the number of items in the list. + */ +#define listCURRENT_LIST_LENGTH( pxList ) ( ( pxList )->uxNumberOfItems ) + +/* + * Access function to obtain the owner of the next entry in a list. + * + * The list member pxIndex is used to walk through a list. Calling + * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list + * and returns that entry's pxOwner parameter. Using multiple calls to this + * function it is therefore possible to move through every item contained in + * a list. + * + * The pxOwner parameter of a list item is a pointer to the object that owns + * the list item. In the scheduler this is normally a task control block. + * The pxOwner parameter effectively creates a two way link between the list + * item and its owner. + * + * @param pxTCB pxTCB is set to the address of the owner of the next list item. + * @param pxList The list from which the next item owner is to be returned. + * + * \page listGET_OWNER_OF_NEXT_ENTRY listGET_OWNER_OF_NEXT_ENTRY + * \ingroup LinkedList + */ +#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList ) \ + do { \ + List_t * const pxConstList = ( pxList ); \ + /* Increment the index to the next item and return the item, ensuring */ \ + /* we don't return the marker used at the end of the list. */ \ + ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ + if( ( void * ) ( pxConstList )->pxIndex == ( void * ) &( ( pxConstList )->xListEnd ) ) \ + { \ + ( pxConstList )->pxIndex = ( pxConstList )->xListEnd.pxNext; \ + } \ + ( pxTCB ) = ( pxConstList )->pxIndex->pvOwner; \ + } while( 0 ) + +/* + * Version of uxListRemove() that does not return a value. Provided as a slight + * optimisation for xTaskIncrementTick() by being inline. + * + * Remove an item from a list. The list item has a pointer to the list that + * it is in, so only the list item need be passed into the function. + * + * @param uxListRemove The item to be removed. The item will remove itself from + * the list pointed to by it's pxContainer parameter. + * + * @return The number of items that remain in the list after the list item has + * been removed. + * + * \page listREMOVE_ITEM listREMOVE_ITEM + * \ingroup LinkedList + */ +#define listREMOVE_ITEM( pxItemToRemove ) \ + do { \ + /* The list item knows which list it is in. Obtain the list from the list \ + * item. */ \ + List_t * const pxList = ( pxItemToRemove )->pxContainer; \ + \ + ( pxItemToRemove )->pxNext->pxPrevious = ( pxItemToRemove )->pxPrevious; \ + ( pxItemToRemove )->pxPrevious->pxNext = ( pxItemToRemove )->pxNext; \ + /* Make sure the index is left pointing to a valid item. */ \ + if( pxList->pxIndex == ( pxItemToRemove ) ) \ + { \ + pxList->pxIndex = ( pxItemToRemove )->pxPrevious; \ + } \ + \ + ( pxItemToRemove )->pxContainer = NULL; \ + ( pxList->uxNumberOfItems )--; \ + } while( 0 ) + +/* + * Inline version of vListInsertEnd() to provide slight optimisation for + * xTaskIncrementTick(). + * + * Insert a list item into a list. The item will be inserted in a position + * such that it will be the last item within the list returned by multiple + * calls to listGET_OWNER_OF_NEXT_ENTRY. + * + * The list member pxIndex is used to walk through a list. Calling + * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list. + * Placing an item in a list using vListInsertEnd effectively places the item + * in the list position pointed to by pxIndex. This means that every other + * item within the list will be returned by listGET_OWNER_OF_NEXT_ENTRY before + * the pxIndex parameter again points to the item being inserted. + * + * @param pxList The list into which the item is to be inserted. + * + * @param pxNewListItem The list item to be inserted into the list. + * + * \page listINSERT_END listINSERT_END + * \ingroup LinkedList + */ +#define listINSERT_END( pxList, pxNewListItem ) \ + do { \ + ListItem_t * const pxIndex = ( pxList )->pxIndex; \ + \ + /* Only effective when configASSERT() is also defined, these tests may catch \ + * the list data structures being overwritten in memory. They will not catch \ + * data errors caused by incorrect configuration or use of FreeRTOS. */ \ + listTEST_LIST_INTEGRITY( ( pxList ) ); \ + listTEST_LIST_ITEM_INTEGRITY( ( pxNewListItem ) ); \ + \ + /* Insert a new list item into ( pxList ), but rather than sort the list, \ + * makes the new list item the last item to be removed by a call to \ + * listGET_OWNER_OF_NEXT_ENTRY(). */ \ + ( pxNewListItem )->pxNext = pxIndex; \ + ( pxNewListItem )->pxPrevious = pxIndex->pxPrevious; \ + \ + pxIndex->pxPrevious->pxNext = ( pxNewListItem ); \ + pxIndex->pxPrevious = ( pxNewListItem ); \ + \ + /* Remember which list the item is in. */ \ + ( pxNewListItem )->pxContainer = ( pxList ); \ + \ + ( ( pxList )->uxNumberOfItems )++; \ + } while( 0 ) + +/* + * Access function to obtain the owner of the first entry in a list. Lists + * are normally sorted in ascending item value order. + * + * This function returns the pxOwner member of the first item in the list. + * The pxOwner parameter of a list item is a pointer to the object that owns + * the list item. In the scheduler this is normally a task control block. + * The pxOwner parameter effectively creates a two way link between the list + * item and its owner. + * + * @param pxList The list from which the owner of the head item is to be + * returned. + * + * \page listGET_OWNER_OF_HEAD_ENTRY listGET_OWNER_OF_HEAD_ENTRY + * \ingroup LinkedList + */ +#define listGET_OWNER_OF_HEAD_ENTRY( pxList ) ( ( &( ( pxList )->xListEnd ) )->pxNext->pvOwner ) + +/* + * Check to see if a list item is within a list. The list item maintains a + * "container" pointer that points to the list it is in. All this macro does + * is check to see if the container and the list match. + * + * @param pxList The list we want to know if the list item is within. + * @param pxListItem The list item we want to know if is in the list. + * @return pdTRUE if the list item is in the list, otherwise pdFALSE. + */ +#define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( ( pxListItem )->pxContainer == ( pxList ) ) ? ( pdTRUE ) : ( pdFALSE ) ) + +/* + * Return the list a list item is contained within (referenced from). + * + * @param pxListItem The list item being queried. + * @return A pointer to the List_t object that references the pxListItem + */ +#define listLIST_ITEM_CONTAINER( pxListItem ) ( ( pxListItem )->pxContainer ) + +/* + * This provides a crude means of knowing if a list has been initialised, as + * pxList->xListEnd.xItemValue is set to portMAX_DELAY by the vListInitialise() + * function. + */ +#define listLIST_IS_INITIALISED( pxList ) ( ( pxList )->xListEnd.xItemValue == portMAX_DELAY ) + +/* + * Must be called before a list is used! This initialises all the members + * of the list structure and inserts the xListEnd item into the list as a + * marker to the back of the list. + * + * @param pxList Pointer to the list being initialised. + * + * \page vListInitialise vListInitialise + * \ingroup LinkedList + */ +void vListInitialise( List_t * const pxList ) PRIVILEGED_FUNCTION; + +/* + * Must be called before a list item is used. This sets the list container to + * null so the item does not think that it is already contained in a list. + * + * @param pxItem Pointer to the list item being initialised. + * + * \page vListInitialiseItem vListInitialiseItem + * \ingroup LinkedList + */ +void vListInitialiseItem( ListItem_t * const pxItem ) PRIVILEGED_FUNCTION; + +/* + * Insert a list item into a list. The item will be inserted into the list in + * a position determined by its item value (ascending item value order). + * + * @param pxList The list into which the item is to be inserted. + * + * @param pxNewListItem The item that is to be placed in the list. + * + * \page vListInsert vListInsert + * \ingroup LinkedList + */ +void vListInsert( List_t * const pxList, + ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; + +/* + * Insert a list item into a list. The item will be inserted in a position + * such that it will be the last item within the list returned by multiple + * calls to listGET_OWNER_OF_NEXT_ENTRY. + * + * The list member pxIndex is used to walk through a list. Calling + * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list. + * Placing an item in a list using vListInsertEnd effectively places the item + * in the list position pointed to by pxIndex. This means that every other + * item within the list will be returned by listGET_OWNER_OF_NEXT_ENTRY before + * the pxIndex parameter again points to the item being inserted. + * + * @param pxList The list into which the item is to be inserted. + * + * @param pxNewListItem The list item to be inserted into the list. + * + * \page vListInsertEnd vListInsertEnd + * \ingroup LinkedList + */ +void vListInsertEnd( List_t * const pxList, + ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; + +/* + * Remove an item from a list. The list item has a pointer to the list that + * it is in, so only the list item need be passed into the function. + * + * @param uxListRemove The item to be removed. The item will remove itself from + * the list pointed to by it's pxContainer parameter. + * + * @return The number of items that remain in the list after the list item has + * been removed. + * + * \page uxListRemove uxListRemove + * \ingroup LinkedList + */ +UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) PRIVILEGED_FUNCTION; + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* ifndef LIST_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/message_buffer.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/message_buffer.h new file mode 100644 index 0000000..580f359 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/message_buffer.h @@ -0,0 +1,888 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +/* + * Message buffers build functionality on top of FreeRTOS stream buffers. + * Whereas stream buffers are used to send a continuous stream of data from one + * task or interrupt to another, message buffers are used to send variable + * length discrete messages from one task or interrupt to another. Their + * implementation is light weight, making them particularly suited for interrupt + * to task and core to core communication scenarios. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xMessageBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xMessageBufferRead()) inside a critical section and set the receive + * timeout to 0. + * + * Message buffers hold variable length messages. To enable that, when a + * message is written to the message buffer an additional sizeof( size_t ) bytes + * are also written to store the message's length (that happens internally, with + * the API function). sizeof( size_t ) is typically 4 bytes on a 32-bit + * architecture, so writing a 10 byte message to a message buffer on a 32-bit + * architecture will actually reduce the available space in the message buffer + * by 14 bytes (10 byte are used by the message, and 4 bytes to hold the length + * of the message). + */ + +#ifndef FREERTOS_MESSAGE_BUFFER_H +#define FREERTOS_MESSAGE_BUFFER_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include message_buffer.h" +#endif + +/* Message buffers are built onto of stream buffers. */ +#include "stream_buffer.h" + +/* *INDENT-OFF* */ +#if defined( __cplusplus ) + extern "C" { +#endif +/* *INDENT-ON* */ + +/** + * Type by which message buffers are referenced. For example, a call to + * xMessageBufferCreate() returns an MessageBufferHandle_t variable that can + * then be used as a parameter to xMessageBufferSend(), xMessageBufferReceive(), + * etc. Message buffer is essentially built as a stream buffer hence its handle + * is also set to same type as a stream buffer handle. + */ +typedef StreamBufferHandle_t MessageBufferHandle_t; + +/*-----------------------------------------------------------*/ + +/** + * message_buffer.h + * + * @code{c} + * MessageBufferHandle_t xMessageBufferCreate( size_t xBufferSizeBytes ); + * @endcode + * + * Creates a new message buffer using dynamically allocated memory. See + * xMessageBufferCreateStatic() for a version that uses statically allocated + * memory (memory that is allocated at compile time). + * + * configSUPPORT_DYNAMIC_ALLOCATION must be set to 1 or left undefined in + * FreeRTOSConfig.h for xMessageBufferCreate() to be available. + * + * @param xBufferSizeBytes The total number of bytes (not messages) the message + * buffer will be able to hold at any one time. When a message is written to + * the message buffer an additional sizeof( size_t ) bytes are also written to + * store the message's length. sizeof( size_t ) is typically 4 bytes on a + * 32-bit architecture, so on most 32-bit architectures a 10 byte message will + * take up 14 bytes of message buffer space. + * + * @param pxSendCompletedCallback Callback invoked when a send operation to the + * message buffer is complete. If the parameter is NULL or xMessageBufferCreate() + * is called without the parameter, then it will use the default implementation + * provided by sbSEND_COMPLETED macro. To enable the callback, + * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h. + * + * @param pxReceiveCompletedCallback Callback invoked when a receive operation from + * the message buffer is complete. If the parameter is NULL or xMessageBufferCreate() + * is called without the parameter, it will use the default implementation provided + * by sbRECEIVE_COMPLETED macro. To enable the callback, + * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h. + * + * @return If NULL is returned, then the message buffer cannot be created + * because there is insufficient heap memory available for FreeRTOS to allocate + * the message buffer data structures and storage area. A non-NULL value being + * returned indicates that the message buffer has been created successfully - + * the returned value should be stored as the handle to the created message + * buffer. + * + * Example use: + * @code{c} + * + * void vAFunction( void ) + * { + * MessageBufferHandle_t xMessageBuffer; + * const size_t xMessageBufferSizeBytes = 100; + * + * // Create a message buffer that can hold 100 bytes. The memory used to hold + * // both the message buffer structure and the messages themselves is allocated + * // dynamically. Each message added to the buffer consumes an additional 4 + * // bytes which are used to hold the length of the message. + * xMessageBuffer = xMessageBufferCreate( xMessageBufferSizeBytes ); + * + * if( xMessageBuffer == NULL ) + * { + * // There was not enough heap memory space available to create the + * // message buffer. + * } + * else + * { + * // The message buffer was created successfully and can now be used. + * } + * + * @endcode + * \defgroup xMessageBufferCreate xMessageBufferCreate + * \ingroup MessageBufferManagement + */ +#define xMessageBufferCreate( xBufferSizeBytes ) \ + xStreamBufferGenericCreate( ( xBufferSizeBytes ), ( size_t ) 0, pdTRUE, NULL, NULL ) + +#if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + #define xMessageBufferCreateWithCallback( xBufferSizeBytes, pxSendCompletedCallback, pxReceiveCompletedCallback ) \ + xStreamBufferGenericCreate( ( xBufferSizeBytes ), ( size_t ) 0, pdTRUE, ( pxSendCompletedCallback ), ( pxReceiveCompletedCallback ) ) +#endif + +/** + * message_buffer.h + * + * @code{c} + * MessageBufferHandle_t xMessageBufferCreateStatic( size_t xBufferSizeBytes, + * uint8_t *pucMessageBufferStorageArea, + * StaticMessageBuffer_t *pxStaticMessageBuffer ); + * @endcode + * Creates a new message buffer using statically allocated memory. See + * xMessageBufferCreate() for a version that uses dynamically allocated memory. + * + * @param xBufferSizeBytes The size, in bytes, of the buffer pointed to by the + * pucMessageBufferStorageArea parameter. When a message is written to the + * message buffer an additional sizeof( size_t ) bytes are also written to store + * the message's length. sizeof( size_t ) is typically 4 bytes on a 32-bit + * architecture, so on most 32-bit architecture a 10 byte message will take up + * 14 bytes of message buffer space. The maximum number of bytes that can be + * stored in the message buffer is actually (xBufferSizeBytes - 1). + * + * @param pucMessageBufferStorageArea Must point to a uint8_t array that is at + * least xBufferSizeBytes big. This is the array to which messages are + * copied when they are written to the message buffer. + * + * @param pxStaticMessageBuffer Must point to a variable of type + * StaticMessageBuffer_t, which will be used to hold the message buffer's data + * structure. + * + * @param pxSendCompletedCallback Callback invoked when a new message is sent to the message buffer. + * If the parameter is NULL or xMessageBufferCreate() is called without the parameter, then it will use the default + * implementation provided by sbSEND_COMPLETED macro. To enable the callback, + * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h. + * + * @param pxReceiveCompletedCallback Callback invoked when a message is read from a + * message buffer. If the parameter is NULL or xMessageBufferCreate() is called without the parameter, it will + * use the default implementation provided by sbRECEIVE_COMPLETED macro. To enable the callback, + * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h. + * + * @return If the message buffer is created successfully then a handle to the + * created message buffer is returned. If either pucMessageBufferStorageArea or + * pxStaticmessageBuffer are NULL then NULL is returned. + * + * Example use: + * @code{c} + * + * // Used to dimension the array used to hold the messages. The available space + * // will actually be one less than this, so 999. + #define STORAGE_SIZE_BYTES 1000 + * + * // Defines the memory that will actually hold the messages within the message + * // buffer. + * static uint8_t ucStorageBuffer[ STORAGE_SIZE_BYTES ]; + * + * // The variable used to hold the message buffer structure. + * StaticMessageBuffer_t xMessageBufferStruct; + * + * void MyFunction( void ) + * { + * MessageBufferHandle_t xMessageBuffer; + * + * xMessageBuffer = xMessageBufferCreateStatic( sizeof( ucStorageBuffer ), + * ucStorageBuffer, + * &xMessageBufferStruct ); + * + * // As neither the pucMessageBufferStorageArea or pxStaticMessageBuffer + * // parameters were NULL, xMessageBuffer will not be NULL, and can be used to + * // reference the created message buffer in other message buffer API calls. + * + * // Other code that uses the message buffer can go here. + * } + * + * @endcode + * \defgroup xMessageBufferCreateStatic xMessageBufferCreateStatic + * \ingroup MessageBufferManagement + */ +#define xMessageBufferCreateStatic( xBufferSizeBytes, pucMessageBufferStorageArea, pxStaticMessageBuffer ) \ + xStreamBufferGenericCreateStatic( ( xBufferSizeBytes ), 0, pdTRUE, ( pucMessageBufferStorageArea ), ( pxStaticMessageBuffer ), NULL, NULL ) + +#if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + #define xMessageBufferCreateStaticWithCallback( xBufferSizeBytes, pucMessageBufferStorageArea, pxStaticMessageBuffer, pxSendCompletedCallback, pxReceiveCompletedCallback ) \ + xStreamBufferGenericCreateStatic( ( xBufferSizeBytes ), 0, pdTRUE, ( pucMessageBufferStorageArea ), ( pxStaticMessageBuffer ), ( pxSendCompletedCallback ), ( pxReceiveCompletedCallback ) ) +#endif + +/** + * message_buffer.h + * + * @code{c} + * BaseType_t xMessageBufferGetStaticBuffers( MessageBufferHandle_t xMessageBuffer, + * uint8_t ** ppucMessageBufferStorageArea, + * StaticMessageBuffer_t ** ppxStaticMessageBuffer ); + * @endcode + * + * Retrieve pointers to a statically created message buffer's data structure + * buffer and storage area buffer. These are the same buffers that are supplied + * at the time of creation. + * + * @param xMessageBuffer The message buffer for which to retrieve the buffers. + * + * @param ppucMessageBufferStorageArea Used to return a pointer to the + * message buffer's storage area buffer. + * + * @param ppxStaticMessageBuffer Used to return a pointer to the message + * buffer's data structure buffer. + * + * @return pdTRUE if buffers were retrieved, pdFALSE otherwise.. + * + * \defgroup xMessageBufferGetStaticBuffers xMessageBufferGetStaticBuffers + * \ingroup MessageBufferManagement + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xMessageBufferGetStaticBuffers( xMessageBuffer, ppucMessageBufferStorageArea, ppxStaticMessageBuffer ) \ + xStreamBufferGetStaticBuffers( ( xMessageBuffer ), ( ppucMessageBufferStorageArea ), ( ppxStaticMessageBuffer ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * message_buffer.h + * + * @code{c} + * size_t xMessageBufferSend( MessageBufferHandle_t xMessageBuffer, + * const void *pvTxData, + * size_t xDataLengthBytes, + * TickType_t xTicksToWait ); + * @endcode + * + * Sends a discrete message to the message buffer. The message can be any + * length that fits within the buffer's free space, and is copied into the + * buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xMessageBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xMessageBufferRead()) inside a critical section and set the receive + * block time to 0. + * + * Use xMessageBufferSend() to write to a message buffer from a task. Use + * xMessageBufferSendFromISR() to write to a message buffer from an interrupt + * service routine (ISR). + * + * @param xMessageBuffer The handle of the message buffer to which a message is + * being sent. + * + * @param pvTxData A pointer to the message that is to be copied into the + * message buffer. + * + * @param xDataLengthBytes The length of the message. That is, the number of + * bytes to copy from pvTxData into the message buffer. When a message is + * written to the message buffer an additional sizeof( size_t ) bytes are also + * written to store the message's length. sizeof( size_t ) is typically 4 bytes + * on a 32-bit architecture, so on most 32-bit architecture setting + * xDataLengthBytes to 20 will reduce the free space in the message buffer by 24 + * bytes (20 bytes of message data and 4 bytes to hold the message length). + * + * @param xTicksToWait The maximum amount of time the calling task should remain + * in the Blocked state to wait for enough space to become available in the + * message buffer, should the message buffer have insufficient space when + * xMessageBufferSend() is called. The calling task will never block if + * xTicksToWait is zero. The block time is specified in tick periods, so the + * absolute time it represents is dependent on the tick frequency. The macro + * pdMS_TO_TICKS() can be used to convert a time specified in milliseconds into + * a time specified in ticks. Setting xTicksToWait to portMAX_DELAY will cause + * the task to wait indefinitely (without timing out), provided + * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h. Tasks do not use any + * CPU time when they are in the Blocked state. + * + * @return The number of bytes written to the message buffer. If the call to + * xMessageBufferSend() times out before there was enough space to write the + * message into the message buffer then zero is returned. If the call did not + * time out then xDataLengthBytes is returned. + * + * Example use: + * @code{c} + * void vAFunction( MessageBufferHandle_t xMessageBuffer ) + * { + * size_t xBytesSent; + * uint8_t ucArrayToSend[] = { 0, 1, 2, 3 }; + * char *pcStringToSend = "String to send"; + * const TickType_t x100ms = pdMS_TO_TICKS( 100 ); + * + * // Send an array to the message buffer, blocking for a maximum of 100ms to + * // wait for enough space to be available in the message buffer. + * xBytesSent = xMessageBufferSend( xMessageBuffer, ( void * ) ucArrayToSend, sizeof( ucArrayToSend ), x100ms ); + * + * if( xBytesSent != sizeof( ucArrayToSend ) ) + * { + * // The call to xMessageBufferSend() times out before there was enough + * // space in the buffer for the data to be written. + * } + * + * // Send the string to the message buffer. Return immediately if there is + * // not enough space in the buffer. + * xBytesSent = xMessageBufferSend( xMessageBuffer, ( void * ) pcStringToSend, strlen( pcStringToSend ), 0 ); + * + * if( xBytesSent != strlen( pcStringToSend ) ) + * { + * // The string could not be added to the message buffer because there was + * // not enough free space in the buffer. + * } + * } + * @endcode + * \defgroup xMessageBufferSend xMessageBufferSend + * \ingroup MessageBufferManagement + */ +#define xMessageBufferSend( xMessageBuffer, pvTxData, xDataLengthBytes, xTicksToWait ) \ + xStreamBufferSend( ( xMessageBuffer ), ( pvTxData ), ( xDataLengthBytes ), ( xTicksToWait ) ) + +/** + * message_buffer.h + * + * @code{c} + * size_t xMessageBufferSendFromISR( MessageBufferHandle_t xMessageBuffer, + * const void *pvTxData, + * size_t xDataLengthBytes, + * BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * Interrupt safe version of the API function that sends a discrete message to + * the message buffer. The message can be any length that fits within the + * buffer's free space, and is copied into the buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xMessageBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xMessageBufferRead()) inside a critical section and set the receive + * block time to 0. + * + * Use xMessageBufferSend() to write to a message buffer from a task. Use + * xMessageBufferSendFromISR() to write to a message buffer from an interrupt + * service routine (ISR). + * + * @param xMessageBuffer The handle of the message buffer to which a message is + * being sent. + * + * @param pvTxData A pointer to the message that is to be copied into the + * message buffer. + * + * @param xDataLengthBytes The length of the message. That is, the number of + * bytes to copy from pvTxData into the message buffer. When a message is + * written to the message buffer an additional sizeof( size_t ) bytes are also + * written to store the message's length. sizeof( size_t ) is typically 4 bytes + * on a 32-bit architecture, so on most 32-bit architecture setting + * xDataLengthBytes to 20 will reduce the free space in the message buffer by 24 + * bytes (20 bytes of message data and 4 bytes to hold the message length). + * + * @param pxHigherPriorityTaskWoken It is possible that a message buffer will + * have a task blocked on it waiting for data. Calling + * xMessageBufferSendFromISR() can make data available, and so cause a task that + * was waiting for data to leave the Blocked state. If calling + * xMessageBufferSendFromISR() causes a task to leave the Blocked state, and the + * unblocked task has a priority higher than the currently executing task (the + * task that was interrupted), then, internally, xMessageBufferSendFromISR() + * will set *pxHigherPriorityTaskWoken to pdTRUE. If + * xMessageBufferSendFromISR() sets this value to pdTRUE, then normally a + * context switch should be performed before the interrupt is exited. This will + * ensure that the interrupt returns directly to the highest priority Ready + * state task. *pxHigherPriorityTaskWoken should be set to pdFALSE before it + * is passed into the function. See the code example below for an example. + * + * @return The number of bytes actually written to the message buffer. If the + * message buffer didn't have enough free space for the message to be stored + * then 0 is returned, otherwise xDataLengthBytes is returned. + * + * Example use: + * @code{c} + * // A message buffer that has already been created. + * MessageBufferHandle_t xMessageBuffer; + * + * void vAnInterruptServiceRoutine( void ) + * { + * size_t xBytesSent; + * char *pcStringToSend = "String to send"; + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE. + * + * // Attempt to send the string to the message buffer. + * xBytesSent = xMessageBufferSendFromISR( xMessageBuffer, + * ( void * ) pcStringToSend, + * strlen( pcStringToSend ), + * &xHigherPriorityTaskWoken ); + * + * if( xBytesSent != strlen( pcStringToSend ) ) + * { + * // The string could not be added to the message buffer because there was + * // not enough free space in the buffer. + * } + * + * // If xHigherPriorityTaskWoken was set to pdTRUE inside + * // xMessageBufferSendFromISR() then a task that has a priority above the + * // priority of the currently executing task was unblocked and a context + * // switch should be performed to ensure the ISR returns to the unblocked + * // task. In most FreeRTOS ports this is done by simply passing + * // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the + * // variables value, and perform the context switch if necessary. Check the + * // documentation for the port in use for port specific instructions. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * } + * @endcode + * \defgroup xMessageBufferSendFromISR xMessageBufferSendFromISR + * \ingroup MessageBufferManagement + */ +#define xMessageBufferSendFromISR( xMessageBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken ) \ + xStreamBufferSendFromISR( ( xMessageBuffer ), ( pvTxData ), ( xDataLengthBytes ), ( pxHigherPriorityTaskWoken ) ) + +/** + * message_buffer.h + * + * @code{c} + * size_t xMessageBufferReceive( MessageBufferHandle_t xMessageBuffer, + * void *pvRxData, + * size_t xBufferLengthBytes, + * TickType_t xTicksToWait ); + * @endcode + * + * Receives a discrete message from a message buffer. Messages can be of + * variable length and are copied out of the buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xMessageBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xMessageBufferRead()) inside a critical section and set the receive + * block time to 0. + * + * Use xMessageBufferReceive() to read from a message buffer from a task. Use + * xMessageBufferReceiveFromISR() to read from a message buffer from an + * interrupt service routine (ISR). + * + * @param xMessageBuffer The handle of the message buffer from which a message + * is being received. + * + * @param pvRxData A pointer to the buffer into which the received message is + * to be copied. + * + * @param xBufferLengthBytes The length of the buffer pointed to by the pvRxData + * parameter. This sets the maximum length of the message that can be received. + * If xBufferLengthBytes is too small to hold the next message then the message + * will be left in the message buffer and 0 will be returned. + * + * @param xTicksToWait The maximum amount of time the task should remain in the + * Blocked state to wait for a message, should the message buffer be empty. + * xMessageBufferReceive() will return immediately if xTicksToWait is zero and + * the message buffer is empty. The block time is specified in tick periods, so + * the absolute time it represents is dependent on the tick frequency. The + * macro pdMS_TO_TICKS() can be used to convert a time specified in milliseconds + * into a time specified in ticks. Setting xTicksToWait to portMAX_DELAY will + * cause the task to wait indefinitely (without timing out), provided + * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h. Tasks do not use any + * CPU time when they are in the Blocked state. + * + * @return The length, in bytes, of the message read from the message buffer, if + * any. If xMessageBufferReceive() times out before a message became available + * then zero is returned. If the length of the message is greater than + * xBufferLengthBytes then the message will be left in the message buffer and + * zero is returned. + * + * Example use: + * @code{c} + * void vAFunction( MessageBuffer_t xMessageBuffer ) + * { + * uint8_t ucRxData[ 20 ]; + * size_t xReceivedBytes; + * const TickType_t xBlockTime = pdMS_TO_TICKS( 20 ); + * + * // Receive the next message from the message buffer. Wait in the Blocked + * // state (so not using any CPU processing time) for a maximum of 100ms for + * // a message to become available. + * xReceivedBytes = xMessageBufferReceive( xMessageBuffer, + * ( void * ) ucRxData, + * sizeof( ucRxData ), + * xBlockTime ); + * + * if( xReceivedBytes > 0 ) + * { + * // A ucRxData contains a message that is xReceivedBytes long. Process + * // the message here.... + * } + * } + * @endcode + * \defgroup xMessageBufferReceive xMessageBufferReceive + * \ingroup MessageBufferManagement + */ +#define xMessageBufferReceive( xMessageBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ) \ + xStreamBufferReceive( ( xMessageBuffer ), ( pvRxData ), ( xBufferLengthBytes ), ( xTicksToWait ) ) + + +/** + * message_buffer.h + * + * @code{c} + * size_t xMessageBufferReceiveFromISR( MessageBufferHandle_t xMessageBuffer, + * void *pvRxData, + * size_t xBufferLengthBytes, + * BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * An interrupt safe version of the API function that receives a discrete + * message from a message buffer. Messages can be of variable length and are + * copied out of the buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xMessageBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xMessageBufferRead()) inside a critical section and set the receive + * block time to 0. + * + * Use xMessageBufferReceive() to read from a message buffer from a task. Use + * xMessageBufferReceiveFromISR() to read from a message buffer from an + * interrupt service routine (ISR). + * + * @param xMessageBuffer The handle of the message buffer from which a message + * is being received. + * + * @param pvRxData A pointer to the buffer into which the received message is + * to be copied. + * + * @param xBufferLengthBytes The length of the buffer pointed to by the pvRxData + * parameter. This sets the maximum length of the message that can be received. + * If xBufferLengthBytes is too small to hold the next message then the message + * will be left in the message buffer and 0 will be returned. + * + * @param pxHigherPriorityTaskWoken It is possible that a message buffer will + * have a task blocked on it waiting for space to become available. Calling + * xMessageBufferReceiveFromISR() can make space available, and so cause a task + * that is waiting for space to leave the Blocked state. If calling + * xMessageBufferReceiveFromISR() causes a task to leave the Blocked state, and + * the unblocked task has a priority higher than the currently executing task + * (the task that was interrupted), then, internally, + * xMessageBufferReceiveFromISR() will set *pxHigherPriorityTaskWoken to pdTRUE. + * If xMessageBufferReceiveFromISR() sets this value to pdTRUE, then normally a + * context switch should be performed before the interrupt is exited. That will + * ensure the interrupt returns directly to the highest priority Ready state + * task. *pxHigherPriorityTaskWoken should be set to pdFALSE before it is + * passed into the function. See the code example below for an example. + * + * @return The length, in bytes, of the message read from the message buffer, if + * any. + * + * Example use: + * @code{c} + * // A message buffer that has already been created. + * MessageBuffer_t xMessageBuffer; + * + * void vAnInterruptServiceRoutine( void ) + * { + * uint8_t ucRxData[ 20 ]; + * size_t xReceivedBytes; + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE. + * + * // Receive the next message from the message buffer. + * xReceivedBytes = xMessageBufferReceiveFromISR( xMessageBuffer, + * ( void * ) ucRxData, + * sizeof( ucRxData ), + * &xHigherPriorityTaskWoken ); + * + * if( xReceivedBytes > 0 ) + * { + * // A ucRxData contains a message that is xReceivedBytes long. Process + * // the message here.... + * } + * + * // If xHigherPriorityTaskWoken was set to pdTRUE inside + * // xMessageBufferReceiveFromISR() then a task that has a priority above the + * // priority of the currently executing task was unblocked and a context + * // switch should be performed to ensure the ISR returns to the unblocked + * // task. In most FreeRTOS ports this is done by simply passing + * // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the + * // variables value, and perform the context switch if necessary. Check the + * // documentation for the port in use for port specific instructions. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * } + * @endcode + * \defgroup xMessageBufferReceiveFromISR xMessageBufferReceiveFromISR + * \ingroup MessageBufferManagement + */ +#define xMessageBufferReceiveFromISR( xMessageBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken ) \ + xStreamBufferReceiveFromISR( ( xMessageBuffer ), ( pvRxData ), ( xBufferLengthBytes ), ( pxHigherPriorityTaskWoken ) ) + +/** + * message_buffer.h + * + * @code{c} + * void vMessageBufferDelete( MessageBufferHandle_t xMessageBuffer ); + * @endcode + * + * Deletes a message buffer that was previously created using a call to + * xMessageBufferCreate() or xMessageBufferCreateStatic(). If the message + * buffer was created using dynamic memory (that is, by xMessageBufferCreate()), + * then the allocated memory is freed. + * + * A message buffer handle must not be used after the message buffer has been + * deleted. + * + * @param xMessageBuffer The handle of the message buffer to be deleted. + * + */ +#define vMessageBufferDelete( xMessageBuffer ) \ + vStreamBufferDelete( xMessageBuffer ) + +/** + * message_buffer.h + * @code{c} + * BaseType_t xMessageBufferIsFull( MessageBufferHandle_t xMessageBuffer ); + * @endcode + * + * Tests to see if a message buffer is full. A message buffer is full if it + * cannot accept any more messages, of any size, until space is made available + * by a message being removed from the message buffer. + * + * @param xMessageBuffer The handle of the message buffer being queried. + * + * @return If the message buffer referenced by xMessageBuffer is full then + * pdTRUE is returned. Otherwise pdFALSE is returned. + */ +#define xMessageBufferIsFull( xMessageBuffer ) \ + xStreamBufferIsFull( xMessageBuffer ) + +/** + * message_buffer.h + * @code{c} + * BaseType_t xMessageBufferIsEmpty( MessageBufferHandle_t xMessageBuffer ); + * @endcode + * + * Tests to see if a message buffer is empty (does not contain any messages). + * + * @param xMessageBuffer The handle of the message buffer being queried. + * + * @return If the message buffer referenced by xMessageBuffer is empty then + * pdTRUE is returned. Otherwise pdFALSE is returned. + * + */ +#define xMessageBufferIsEmpty( xMessageBuffer ) \ + xStreamBufferIsEmpty( xMessageBuffer ) + +/** + * message_buffer.h + * @code{c} + * BaseType_t xMessageBufferReset( MessageBufferHandle_t xMessageBuffer ); + * @endcode + * + * Resets a message buffer to its initial empty state, discarding any message it + * contained. + * + * A message buffer can only be reset if there are no tasks blocked on it. + * + * @param xMessageBuffer The handle of the message buffer being reset. + * + * @return If the message buffer was reset then pdPASS is returned. If the + * message buffer could not be reset because either there was a task blocked on + * the message queue to wait for space to become available, or to wait for a + * a message to be available, then pdFAIL is returned. + * + * \defgroup xMessageBufferReset xMessageBufferReset + * \ingroup MessageBufferManagement + */ +#define xMessageBufferReset( xMessageBuffer ) \ + xStreamBufferReset( xMessageBuffer ) + + +/** + * message_buffer.h + * @code{c} + * size_t xMessageBufferSpaceAvailable( MessageBufferHandle_t xMessageBuffer ); + * @endcode + * Returns the number of bytes of free space in the message buffer. + * + * @param xMessageBuffer The handle of the message buffer being queried. + * + * @return The number of bytes that can be written to the message buffer before + * the message buffer would be full. When a message is written to the message + * buffer an additional sizeof( size_t ) bytes are also written to store the + * message's length. sizeof( size_t ) is typically 4 bytes on a 32-bit + * architecture, so if xMessageBufferSpacesAvailable() returns 10, then the size + * of the largest message that can be written to the message buffer is 6 bytes. + * + * \defgroup xMessageBufferSpaceAvailable xMessageBufferSpaceAvailable + * \ingroup MessageBufferManagement + */ +#define xMessageBufferSpaceAvailable( xMessageBuffer ) \ + xStreamBufferSpacesAvailable( xMessageBuffer ) +#define xMessageBufferSpacesAvailable( xMessageBuffer ) \ + xStreamBufferSpacesAvailable( xMessageBuffer ) /* Corrects typo in original macro name. */ + +/** + * message_buffer.h + * @code{c} + * size_t xMessageBufferNextLengthBytes( MessageBufferHandle_t xMessageBuffer ); + * @endcode + * Returns the length (in bytes) of the next message in a message buffer. + * Useful if xMessageBufferReceive() returned 0 because the size of the buffer + * passed into xMessageBufferReceive() was too small to hold the next message. + * + * @param xMessageBuffer The handle of the message buffer being queried. + * + * @return The length (in bytes) of the next message in the message buffer, or 0 + * if the message buffer is empty. + * + * \defgroup xMessageBufferNextLengthBytes xMessageBufferNextLengthBytes + * \ingroup MessageBufferManagement + */ +#define xMessageBufferNextLengthBytes( xMessageBuffer ) \ + xStreamBufferNextMessageLengthBytes( xMessageBuffer ) PRIVILEGED_FUNCTION; + +/** + * message_buffer.h + * + * @code{c} + * BaseType_t xMessageBufferSendCompletedFromISR( MessageBufferHandle_t xMessageBuffer, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * For advanced users only. + * + * The sbSEND_COMPLETED() macro is called from within the FreeRTOS APIs when + * data is sent to a message buffer or stream buffer. If there was a task that + * was blocked on the message or stream buffer waiting for data to arrive then + * the sbSEND_COMPLETED() macro sends a notification to the task to remove it + * from the Blocked state. xMessageBufferSendCompletedFromISR() does the same + * thing. It is provided to enable application writers to implement their own + * version of sbSEND_COMPLETED(), and MUST NOT BE USED AT ANY OTHER TIME. + * + * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for + * additional information. + * + * @param xMessageBuffer The handle of the stream buffer to which data was + * written. + * + * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be + * initialised to pdFALSE before it is passed into + * xMessageBufferSendCompletedFromISR(). If calling + * xMessageBufferSendCompletedFromISR() removes a task from the Blocked state, + * and the task has a priority above the priority of the currently running task, + * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a + * context switch should be performed before exiting the ISR. + * + * @return If a task was removed from the Blocked state then pdTRUE is returned. + * Otherwise pdFALSE is returned. + * + * \defgroup xMessageBufferSendCompletedFromISR xMessageBufferSendCompletedFromISR + * \ingroup StreamBufferManagement + */ +#define xMessageBufferSendCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) \ + xStreamBufferSendCompletedFromISR( ( xMessageBuffer ), ( pxHigherPriorityTaskWoken ) ) + +/** + * message_buffer.h + * + * @code{c} + * BaseType_t xMessageBufferReceiveCompletedFromISR( MessageBufferHandle_t xMessageBuffer, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * For advanced users only. + * + * The sbRECEIVE_COMPLETED() macro is called from within the FreeRTOS APIs when + * data is read out of a message buffer or stream buffer. If there was a task + * that was blocked on the message or stream buffer waiting for data to arrive + * then the sbRECEIVE_COMPLETED() macro sends a notification to the task to + * remove it from the Blocked state. xMessageBufferReceiveCompletedFromISR() + * does the same thing. It is provided to enable application writers to + * implement their own version of sbRECEIVE_COMPLETED(), and MUST NOT BE USED AT + * ANY OTHER TIME. + * + * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for + * additional information. + * + * @param xMessageBuffer The handle of the stream buffer from which data was + * read. + * + * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be + * initialised to pdFALSE before it is passed into + * xMessageBufferReceiveCompletedFromISR(). If calling + * xMessageBufferReceiveCompletedFromISR() removes a task from the Blocked state, + * and the task has a priority above the priority of the currently running task, + * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a + * context switch should be performed before exiting the ISR. + * + * @return If a task was removed from the Blocked state then pdTRUE is returned. + * Otherwise pdFALSE is returned. + * + * \defgroup xMessageBufferReceiveCompletedFromISR xMessageBufferReceiveCompletedFromISR + * \ingroup StreamBufferManagement + */ +#define xMessageBufferReceiveCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) \ + xStreamBufferReceiveCompletedFromISR( ( xMessageBuffer ), ( pxHigherPriorityTaskWoken ) ) + +/* *INDENT-OFF* */ +#if defined( __cplusplus ) + } /* extern "C" */ +#endif +/* *INDENT-ON* */ + +#endif /* !defined( FREERTOS_MESSAGE_BUFFER_H ) */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/mpu_prototypes.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/mpu_prototypes.h new file mode 100644 index 0000000..0cec6e6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/mpu_prototypes.h @@ -0,0 +1,389 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * When the MPU is used the standard (non MPU) API functions are mapped to + * equivalents that start "MPU_", the prototypes for which are defined in this + * header files. This will cause the application code to call the MPU_ version + * which wraps the non-MPU version with privilege promoting then demoting code, + * so the kernel code always runs will full privileges. + */ + + +#ifndef MPU_PROTOTYPES_H +#define MPU_PROTOTYPES_H + +typedef struct xTaskGenericNotifyParams +{ + TaskHandle_t xTaskToNotify; + UBaseType_t uxIndexToNotify; + uint32_t ulValue; + eNotifyAction eAction; + uint32_t * pulPreviousNotificationValue; +} xTaskGenericNotifyParams_t; + +typedef struct xTaskGenericNotifyWaitParams +{ + UBaseType_t uxIndexToWaitOn; + uint32_t ulBitsToClearOnEntry; + uint32_t ulBitsToClearOnExit; + uint32_t * pulNotificationValue; + TickType_t xTicksToWait; +} xTaskGenericNotifyWaitParams_t; + +typedef struct xTimerGenericCommandFromTaskParams +{ + TimerHandle_t xTimer; + BaseType_t xCommandID; + TickType_t xOptionalValue; + BaseType_t * pxHigherPriorityTaskWoken; + TickType_t xTicksToWait; +} xTimerGenericCommandFromTaskParams_t; + +typedef struct xEventGroupWaitBitsParams +{ + EventGroupHandle_t xEventGroup; + EventBits_t uxBitsToWaitFor; + BaseType_t xClearOnExit; + BaseType_t xWaitForAllBits; + TickType_t xTicksToWait; +} xEventGroupWaitBitsParams_t; + +/* MPU versions of task.h API functions. */ +void MPU_vTaskDelay( const TickType_t xTicksToDelay ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskDelayUntil( TickType_t * const pxPreviousWakeTime, + const TickType_t xTimeIncrement ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxTaskPriorityGet( const TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +eTaskState MPU_eTaskGetState( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskGetInfo( TaskHandle_t xTask, + TaskStatus_t * pxTaskStatus, + BaseType_t xGetFreeStackSpace, + eTaskState eState ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskSuspend( TaskHandle_t xTaskToSuspend ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskResume( TaskHandle_t xTaskToResume ) FREERTOS_SYSTEM_CALL; +TickType_t MPU_xTaskGetTickCount( void ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxTaskGetNumberOfTasks( void ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +configSTACK_DEPTH_TYPE MPU_uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask, + TaskHookFunction_t pxHookFunction ) FREERTOS_SYSTEM_CALL; +TaskHookFunction_t MPU_xTaskGetApplicationTaskTag( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, + BaseType_t xIndex, + void * pvValue ) FREERTOS_SYSTEM_CALL; +void * MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, + BaseType_t xIndex ) FREERTOS_SYSTEM_CALL; +TaskHandle_t MPU_xTaskGetIdleTaskHandle( void ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, + const UBaseType_t uxArraySize, + configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime ) FREERTOS_SYSTEM_CALL; +configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetRunTimeCounter( const TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetRunTimePercent( const TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimeCounter( void ) FREERTOS_SYSTEM_CALL; +configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimePercent( void ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskGenericNotify( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + uint32_t ulValue, + eNotifyAction eAction, + uint32_t * pulPreviousNotificationValue ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskGenericNotifyEntry( const xTaskGenericNotifyParams_t * pxParams ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskGenericNotifyWait( UBaseType_t uxIndexToWaitOn, + uint32_t ulBitsToClearOnEntry, + uint32_t ulBitsToClearOnExit, + uint32_t * pulNotificationValue, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskGenericNotifyWaitEntry( const xTaskGenericNotifyWaitParams_t * pxParams ) FREERTOS_SYSTEM_CALL; +uint32_t MPU_ulTaskGenericNotifyTake( UBaseType_t uxIndexToWaitOn, + BaseType_t xClearCountOnExit, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskGenericNotifyStateClear( TaskHandle_t xTask, + UBaseType_t uxIndexToClear ) FREERTOS_SYSTEM_CALL; +uint32_t MPU_ulTaskGenericNotifyValueClear( TaskHandle_t xTask, + UBaseType_t uxIndexToClear, + uint32_t ulBitsToClear ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, + TickType_t * const pxTicksToWait ) FREERTOS_SYSTEM_CALL; +TaskHandle_t MPU_xTaskGetCurrentTaskHandle( void ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskGetSchedulerState( void ) FREERTOS_SYSTEM_CALL; + +/* Privileged only wrappers for Task APIs. These are needed so that + * the application can use opaque handles maintained in mpu_wrappers.c + * with all the APIs. */ +BaseType_t MPU_xTaskCreate( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint16_t usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION; +TaskHandle_t MPU_xTaskCreateStatic( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer ) PRIVILEGED_FUNCTION; +void MPU_vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION; +void MPU_vTaskPrioritySet( TaskHandle_t xTask, + UBaseType_t uxNewPriority ) PRIVILEGED_FUNCTION; +TaskHandle_t MPU_xTaskGetHandle( const char * pcNameToQuery ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask, + void * pvParameter ) PRIVILEGED_FUNCTION; +char * MPU_pcTaskGetName( TaskHandle_t xTaskToQuery ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, + TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition, + TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION; +void MPU_vTaskAllocateMPURegions( TaskHandle_t xTaskToModify, + const MemoryRegion_t * const xRegions ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xTaskGetStaticBuffers( TaskHandle_t xTask, + StackType_t ** ppuxStackBuffer, + StaticTask_t ** ppxTaskBuffer ) PRIVILEGED_FUNCTION; +UBaseType_t MPU_uxTaskPriorityGetFromISR( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; +UBaseType_t MPU_uxTaskBasePriorityGet( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; +UBaseType_t MPU_uxTaskBasePriorityGetFromISR( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xTaskResumeFromISR( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; +TaskHookFunction_t MPU_xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + uint32_t ulValue, + eNotifyAction eAction, + uint32_t * pulPreviousNotificationValue, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +void MPU_vTaskGenericNotifyGiveFromISR( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/* MPU versions of queue.h API functions. */ +BaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue, + const void * const pvItemToQueue, + TickType_t xTicksToWait, + const BaseType_t xCopyPosition ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueReceive( QueueHandle_t xQueue, + void * const pvBuffer, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueuePeek( QueueHandle_t xQueue, + void * const pvBuffer, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueSemaphoreTake( QueueHandle_t xQueue, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxQueueMessagesWaiting( const QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxQueueSpacesAvailable( const QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; +TaskHandle_t MPU_xQueueGetMutexHolder( QueueHandle_t xSemaphore ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueTakeMutexRecursive( QueueHandle_t xMutex, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueGiveMutexRecursive( QueueHandle_t pxMutex ) FREERTOS_SYSTEM_CALL; +void MPU_vQueueAddToRegistry( QueueHandle_t xQueue, + const char * pcName ) FREERTOS_SYSTEM_CALL; +void MPU_vQueueUnregisterQueue( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; +const char * MPU_pcQueueGetName( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) FREERTOS_SYSTEM_CALL; +QueueSetMemberHandle_t MPU_xQueueSelectFromSet( QueueSetHandle_t xQueueSet, + const TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +void MPU_vQueueSetQueueNumber( QueueHandle_t xQueue, + UBaseType_t uxQueueNumber ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxQueueGetQueueNumber( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; +uint8_t MPU_ucQueueGetQueueType( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; + +/* Privileged only wrappers for Queue APIs. These are needed so that + * the application can use opaque handles maintained in mpu_wrappers.c + * with all the APIs. */ +void MPU_vQueueDelete( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +QueueHandle_t MPU_xQueueCreateMutex( const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; +QueueHandle_t MPU_xQueueCreateMutexStatic( const uint8_t ucQueueType, + StaticQueue_t * pxStaticQueue ) PRIVILEGED_FUNCTION; +QueueHandle_t MPU_xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount ) PRIVILEGED_FUNCTION; +QueueHandle_t MPU_xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount, + StaticQueue_t * pxStaticQueue ) PRIVILEGED_FUNCTION; +QueueHandle_t MPU_xQueueGenericCreate( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; +QueueHandle_t MPU_xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + uint8_t * pucQueueStorage, + StaticQueue_t * pxStaticQueue, + const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; +QueueSetHandle_t MPU_xQueueCreateSet( const UBaseType_t uxEventQueueLength ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xQueueGenericReset( QueueHandle_t xQueue, + BaseType_t xNewQueue ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xQueueGenericGetStaticBuffers( QueueHandle_t xQueue, + uint8_t ** ppucQueueStorage, + StaticQueue_t ** ppxStaticQueue ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xQueueGenericSendFromISR( QueueHandle_t xQueue, + const void * const pvItemToQueue, + BaseType_t * const pxHigherPriorityTaskWoken, + const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xQueueGiveFromISR( QueueHandle_t xQueue, + BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xQueuePeekFromISR( QueueHandle_t xQueue, + void * const pvBuffer ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xQueueReceiveFromISR( QueueHandle_t xQueue, + void * const pvBuffer, + BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +UBaseType_t MPU_uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +TaskHandle_t MPU_xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION; +QueueSetMemberHandle_t MPU_xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; + +/* MPU versions of timers.h API functions. */ +void * MPU_pvTimerGetTimerID( const TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +void MPU_vTimerSetTimerID( TimerHandle_t xTimer, + void * pvNewID ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTimerIsTimerActive( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandle( void ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTimerGenericCommandFromTask( TimerHandle_t xTimer, + const BaseType_t xCommandID, + const TickType_t xOptionalValue, + BaseType_t * const pxHigherPriorityTaskWoken, + const TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTimerGenericCommandFromTaskEntry( const xTimerGenericCommandFromTaskParams_t * pxParams ) FREERTOS_SYSTEM_CALL; +const char * MPU_pcTimerGetName( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +void MPU_vTimerSetReloadMode( TimerHandle_t xTimer, + const BaseType_t uxAutoReload ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTimerGetReloadMode( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxTimerGetReloadMode( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +TickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +TickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; + +/* Privileged only wrappers for Timer APIs. These are needed so that + * the application can use opaque handles maintained in mpu_wrappers.c + * with all the APIs. */ +TimerHandle_t MPU_xTimerCreate( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction ) PRIVILEGED_FUNCTION; +TimerHandle_t MPU_xTimerCreateStatic( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + StaticTimer_t * pxTimerBuffer ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xTimerGetStaticBuffer( TimerHandle_t xTimer, + StaticTimer_t ** ppxTimerBuffer ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xTimerGenericCommandFromISR( TimerHandle_t xTimer, + const BaseType_t xCommandID, + const TickType_t xOptionalValue, + BaseType_t * const pxHigherPriorityTaskWoken, + const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/* MPU versions of event_group.h API functions. */ +EventBits_t MPU_xEventGroupWaitBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToWaitFor, + const BaseType_t xClearOnExit, + const BaseType_t xWaitForAllBits, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +EventBits_t MPU_xEventGroupWaitBitsEntry( const xEventGroupWaitBitsParams_t * pxParams ) FREERTOS_SYSTEM_CALL; +EventBits_t MPU_xEventGroupClearBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToClear ) FREERTOS_SYSTEM_CALL; +EventBits_t MPU_xEventGroupSetBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet ) FREERTOS_SYSTEM_CALL; +EventBits_t MPU_xEventGroupSync( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet, + const EventBits_t uxBitsToWaitFor, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +#if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t MPU_uxEventGroupGetNumber( void * xEventGroup ) FREERTOS_SYSTEM_CALL; + void MPU_vEventGroupSetNumber( void * xEventGroup, + UBaseType_t uxEventGroupNumber ) FREERTOS_SYSTEM_CALL; +#endif /* ( configUSE_TRACE_FACILITY == 1 )*/ + +/* Privileged only wrappers for Event Group APIs. These are needed so that + * the application can use opaque handles maintained in mpu_wrappers.c + * with all the APIs. */ +EventGroupHandle_t MPU_xEventGroupCreate( void ) PRIVILEGED_FUNCTION; +EventGroupHandle_t MPU_xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer ) PRIVILEGED_FUNCTION; +void MPU_vEventGroupDelete( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xEventGroupGetStaticBuffer( EventGroupHandle_t xEventGroup, + StaticEventGroup_t ** ppxEventGroupBuffer ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +EventBits_t MPU_xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; + +/* MPU versions of message/stream_buffer.h API functions. */ +size_t MPU_xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +size_t MPU_xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +size_t MPU_xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +size_t MPU_xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, + size_t xTriggerLevel ) FREERTOS_SYSTEM_CALL; +size_t MPU_xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; + +/* Privileged only wrappers for Stream Buffer APIs. These are needed so that + * the application can use opaque handles maintained in mpu_wrappers.c + * with all the APIs. */ +StreamBufferHandle_t MPU_xStreamBufferGenericCreate( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer, + StreamBufferCallbackFunction_t pxSendCompletedCallback, + StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) PRIVILEGED_FUNCTION; +StreamBufferHandle_t MPU_xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer, + uint8_t * const pucStreamBufferStorageArea, + StaticStreamBuffer_t * const pxStaticStreamBuffer, + StreamBufferCallbackFunction_t pxSendCompletedCallback, + StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) PRIVILEGED_FUNCTION; +void MPU_vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xStreamBufferGetStaticBuffers( StreamBufferHandle_t xStreamBuffers, + uint8_t * ppucStreamBufferStorageArea, + StaticStreamBuffer_t * ppxStaticStreamBuffer ) PRIVILEGED_FUNCTION; +size_t MPU_xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +size_t MPU_xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +BaseType_t MPU_xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +#endif /* MPU_PROTOTYPES_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/mpu_syscall_numbers.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/mpu_syscall_numbers.h new file mode 100644 index 0000000..2db8ffb --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/mpu_syscall_numbers.h @@ -0,0 +1,105 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef MPU_SYSCALL_NUMBERS_H +#define MPU_SYSCALL_NUMBERS_H + +/* Numbers assigned to various system calls. */ +#define SYSTEM_CALL_xTaskGenericNotify 0 +#define SYSTEM_CALL_xTaskGenericNotifyWait 1 +#define SYSTEM_CALL_xTimerGenericCommandFromTask 2 +#define SYSTEM_CALL_xEventGroupWaitBits 3 +#define SYSTEM_CALL_xTaskDelayUntil 4 +#define SYSTEM_CALL_xTaskAbortDelay 5 +#define SYSTEM_CALL_vTaskDelay 6 +#define SYSTEM_CALL_uxTaskPriorityGet 7 +#define SYSTEM_CALL_eTaskGetState 8 +#define SYSTEM_CALL_vTaskGetInfo 9 +#define SYSTEM_CALL_xTaskGetIdleTaskHandle 10 +#define SYSTEM_CALL_vTaskSuspend 11 +#define SYSTEM_CALL_vTaskResume 12 +#define SYSTEM_CALL_xTaskGetTickCount 13 +#define SYSTEM_CALL_uxTaskGetNumberOfTasks 14 +#define SYSTEM_CALL_ulTaskGetRunTimeCounter 15 +#define SYSTEM_CALL_ulTaskGetRunTimePercent 16 +#define SYSTEM_CALL_ulTaskGetIdleRunTimePercent 17 +#define SYSTEM_CALL_ulTaskGetIdleRunTimeCounter 18 +#define SYSTEM_CALL_vTaskSetApplicationTaskTag 19 +#define SYSTEM_CALL_xTaskGetApplicationTaskTag 20 +#define SYSTEM_CALL_vTaskSetThreadLocalStoragePointer 21 +#define SYSTEM_CALL_pvTaskGetThreadLocalStoragePointer 22 +#define SYSTEM_CALL_uxTaskGetSystemState 23 +#define SYSTEM_CALL_uxTaskGetStackHighWaterMark 24 +#define SYSTEM_CALL_uxTaskGetStackHighWaterMark2 25 +#define SYSTEM_CALL_xTaskGetCurrentTaskHandle 26 +#define SYSTEM_CALL_xTaskGetSchedulerState 27 +#define SYSTEM_CALL_vTaskSetTimeOutState 28 +#define SYSTEM_CALL_xTaskCheckForTimeOut 29 +#define SYSTEM_CALL_ulTaskGenericNotifyTake 30 +#define SYSTEM_CALL_xTaskGenericNotifyStateClear 31 +#define SYSTEM_CALL_ulTaskGenericNotifyValueClear 32 +#define SYSTEM_CALL_xQueueGenericSend 33 +#define SYSTEM_CALL_uxQueueMessagesWaiting 34 +#define SYSTEM_CALL_uxQueueSpacesAvailable 35 +#define SYSTEM_CALL_xQueueReceive 36 +#define SYSTEM_CALL_xQueuePeek 37 +#define SYSTEM_CALL_xQueueSemaphoreTake 38 +#define SYSTEM_CALL_xQueueGetMutexHolder 39 +#define SYSTEM_CALL_xQueueTakeMutexRecursive 40 +#define SYSTEM_CALL_xQueueGiveMutexRecursive 41 +#define SYSTEM_CALL_xQueueSelectFromSet 42 +#define SYSTEM_CALL_xQueueAddToSet 43 +#define SYSTEM_CALL_vQueueAddToRegistry 44 +#define SYSTEM_CALL_vQueueUnregisterQueue 45 +#define SYSTEM_CALL_pcQueueGetName 46 +#define SYSTEM_CALL_pvTimerGetTimerID 47 +#define SYSTEM_CALL_vTimerSetTimerID 48 +#define SYSTEM_CALL_xTimerIsTimerActive 49 +#define SYSTEM_CALL_xTimerGetTimerDaemonTaskHandle 50 +#define SYSTEM_CALL_pcTimerGetName 51 +#define SYSTEM_CALL_vTimerSetReloadMode 52 +#define SYSTEM_CALL_xTimerGetReloadMode 53 +#define SYSTEM_CALL_uxTimerGetReloadMode 54 +#define SYSTEM_CALL_xTimerGetPeriod 55 +#define SYSTEM_CALL_xTimerGetExpiryTime 56 +#define SYSTEM_CALL_xEventGroupClearBits 57 +#define SYSTEM_CALL_xEventGroupSetBits 58 +#define SYSTEM_CALL_xEventGroupSync 59 +#define SYSTEM_CALL_uxEventGroupGetNumber 60 +#define SYSTEM_CALL_vEventGroupSetNumber 61 +#define SYSTEM_CALL_xStreamBufferSend 62 +#define SYSTEM_CALL_xStreamBufferReceive 63 +#define SYSTEM_CALL_xStreamBufferIsFull 64 +#define SYSTEM_CALL_xStreamBufferIsEmpty 65 +#define SYSTEM_CALL_xStreamBufferSpacesAvailable 66 +#define SYSTEM_CALL_xStreamBufferBytesAvailable 67 +#define SYSTEM_CALL_xStreamBufferSetTriggerLevel 68 +#define SYSTEM_CALL_xStreamBufferNextMessageLengthBytes 69 +#define NUM_SYSTEM_CALLS 70 /* Total number of system calls. */ + +#endif /* MPU_SYSCALL_NUMBERS_H */ diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/mpu_wrappers.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/mpu_wrappers.h new file mode 100644 index 0000000..6a70d34 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/mpu_wrappers.h @@ -0,0 +1,287 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef MPU_WRAPPERS_H +#define MPU_WRAPPERS_H + +/* This file redefines API functions to be called through a wrapper macro, but + * only for ports that are using the MPU. */ +#if ( portUSING_MPU_WRAPPERS == 1 ) + +/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE will be defined when this file is + * included from queue.c or task.c to prevent it from having an effect within + * those files. */ + #ifndef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* + * Map standard (non MPU) API functions to equivalents that start + * "MPU_". This will cause the application code to call the MPU_ + * version, which wraps the non-MPU version with privilege promoting + * then demoting code, so the kernel code always runs will full + * privileges. + */ + +/* Map standard task.h API functions to the MPU equivalents. */ + #define vTaskDelay MPU_vTaskDelay + #define xTaskDelayUntil MPU_xTaskDelayUntil + #define xTaskAbortDelay MPU_xTaskAbortDelay + #define uxTaskPriorityGet MPU_uxTaskPriorityGet + #define eTaskGetState MPU_eTaskGetState + #define vTaskGetInfo MPU_vTaskGetInfo + #define vTaskSuspend MPU_vTaskSuspend + #define vTaskResume MPU_vTaskResume + #define xTaskGetTickCount MPU_xTaskGetTickCount + #define uxTaskGetNumberOfTasks MPU_uxTaskGetNumberOfTasks + #define uxTaskGetStackHighWaterMark MPU_uxTaskGetStackHighWaterMark + #define uxTaskGetStackHighWaterMark2 MPU_uxTaskGetStackHighWaterMark2 + #define vTaskSetApplicationTaskTag MPU_vTaskSetApplicationTaskTag + #define xTaskGetApplicationTaskTag MPU_xTaskGetApplicationTaskTag + #define vTaskSetThreadLocalStoragePointer MPU_vTaskSetThreadLocalStoragePointer + #define pvTaskGetThreadLocalStoragePointer MPU_pvTaskGetThreadLocalStoragePointer + #define xTaskGetIdleTaskHandle MPU_xTaskGetIdleTaskHandle + #define uxTaskGetSystemState MPU_uxTaskGetSystemState + #define ulTaskGetIdleRunTimeCounter MPU_ulTaskGetIdleRunTimeCounter + #define ulTaskGetIdleRunTimePercent MPU_ulTaskGetIdleRunTimePercent + #define xTaskGenericNotify MPU_xTaskGenericNotify + #define xTaskGenericNotifyWait MPU_xTaskGenericNotifyWait + #define ulTaskGenericNotifyTake MPU_ulTaskGenericNotifyTake + #define xTaskGenericNotifyStateClear MPU_xTaskGenericNotifyStateClear + #define ulTaskGenericNotifyValueClear MPU_ulTaskGenericNotifyValueClear + #define vTaskSetTimeOutState MPU_vTaskSetTimeOutState + #define xTaskCheckForTimeOut MPU_xTaskCheckForTimeOut + #define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle + #define xTaskGetSchedulerState MPU_xTaskGetSchedulerState + + #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) + #define ulTaskGetRunTimeCounter MPU_ulTaskGetRunTimeCounter + #define ulTaskGetRunTimePercent MPU_ulTaskGetRunTimePercent + #endif /* #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) */ + +/* Privileged only wrappers for Task APIs. These are needed so that + * the application can use opaque handles maintained in mpu_wrappers.c + * with all the APIs. */ + #define xTaskCreate MPU_xTaskCreate + #define xTaskCreateStatic MPU_xTaskCreateStatic + #define vTaskDelete MPU_vTaskDelete + #define vTaskPrioritySet MPU_vTaskPrioritySet + #define xTaskGetHandle MPU_xTaskGetHandle + #define xTaskCallApplicationTaskHook MPU_xTaskCallApplicationTaskHook + + #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) + #define pcTaskGetName MPU_pcTaskGetName + #define xTaskCreateRestricted MPU_xTaskCreateRestricted + #define xTaskCreateRestrictedStatic MPU_xTaskCreateRestrictedStatic + #define vTaskAllocateMPURegions MPU_vTaskAllocateMPURegions + #define xTaskGetStaticBuffers MPU_xTaskGetStaticBuffers + #define uxTaskPriorityGetFromISR MPU_uxTaskPriorityGetFromISR + #define uxTaskBasePriorityGet MPU_uxTaskBasePriorityGet + #define uxTaskBasePriorityGetFromISR MPU_uxTaskBasePriorityGetFromISR + #define xTaskResumeFromISR MPU_xTaskResumeFromISR + #define xTaskGetApplicationTaskTagFromISR MPU_xTaskGetApplicationTaskTagFromISR + #define xTaskGenericNotifyFromISR MPU_xTaskGenericNotifyFromISR + #define vTaskGenericNotifyGiveFromISR MPU_vTaskGenericNotifyGiveFromISR + #endif /* #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) */ + +/* Map standard queue.h API functions to the MPU equivalents. */ + #define xQueueGenericSend MPU_xQueueGenericSend + #define xQueueReceive MPU_xQueueReceive + #define xQueuePeek MPU_xQueuePeek + #define xQueueSemaphoreTake MPU_xQueueSemaphoreTake + #define uxQueueMessagesWaiting MPU_uxQueueMessagesWaiting + #define uxQueueSpacesAvailable MPU_uxQueueSpacesAvailable + #define xQueueGetMutexHolder MPU_xQueueGetMutexHolder + #define xQueueTakeMutexRecursive MPU_xQueueTakeMutexRecursive + #define xQueueGiveMutexRecursive MPU_xQueueGiveMutexRecursive + #define xQueueAddToSet MPU_xQueueAddToSet + #define xQueueSelectFromSet MPU_xQueueSelectFromSet + + #if ( configQUEUE_REGISTRY_SIZE > 0 ) + #define vQueueAddToRegistry MPU_vQueueAddToRegistry + #define vQueueUnregisterQueue MPU_vQueueUnregisterQueue + #define pcQueueGetName MPU_pcQueueGetName + #endif /* #if ( configQUEUE_REGISTRY_SIZE > 0 ) */ + +/* Privileged only wrappers for Queue APIs. These are needed so that + * the application can use opaque handles maintained in mpu_wrappers.c + * with all the APIs. */ + #define vQueueDelete MPU_vQueueDelete + #define xQueueCreateMutex MPU_xQueueCreateMutex + #define xQueueCreateMutexStatic MPU_xQueueCreateMutexStatic + #define xQueueCreateCountingSemaphore MPU_xQueueCreateCountingSemaphore + #define xQueueCreateCountingSemaphoreStatic MPU_xQueueCreateCountingSemaphoreStatic + #define xQueueGenericCreate MPU_xQueueGenericCreate + #define xQueueGenericCreateStatic MPU_xQueueGenericCreateStatic + #define xQueueGenericReset MPU_xQueueGenericReset + #define xQueueCreateSet MPU_xQueueCreateSet + #define xQueueRemoveFromSet MPU_xQueueRemoveFromSet + + #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) + #define xQueueGenericGetStaticBuffers MPU_xQueueGenericGetStaticBuffers + #define xQueueGenericSendFromISR MPU_xQueueGenericSendFromISR + #define xQueueGiveFromISR MPU_xQueueGiveFromISR + #define xQueuePeekFromISR MPU_xQueuePeekFromISR + #define xQueueReceiveFromISR MPU_xQueueReceiveFromISR + #define xQueueIsQueueEmptyFromISR MPU_xQueueIsQueueEmptyFromISR + #define xQueueIsQueueFullFromISR MPU_xQueueIsQueueFullFromISR + #define uxQueueMessagesWaitingFromISR MPU_uxQueueMessagesWaitingFromISR + #define xQueueGetMutexHolderFromISR MPU_xQueueGetMutexHolderFromISR + #define xQueueSelectFromSetFromISR MPU_xQueueSelectFromSetFromISR + #endif /* if ( configUSE_MPU_WRAPPERS_V1 == 0 ) */ + +/* Map standard timer.h API functions to the MPU equivalents. */ + #define pvTimerGetTimerID MPU_pvTimerGetTimerID + #define vTimerSetTimerID MPU_vTimerSetTimerID + #define xTimerIsTimerActive MPU_xTimerIsTimerActive + #define xTimerGetTimerDaemonTaskHandle MPU_xTimerGetTimerDaemonTaskHandle + #define xTimerGenericCommandFromTask MPU_xTimerGenericCommandFromTask + #define pcTimerGetName MPU_pcTimerGetName + #define vTimerSetReloadMode MPU_vTimerSetReloadMode + #define uxTimerGetReloadMode MPU_uxTimerGetReloadMode + #define xTimerGetPeriod MPU_xTimerGetPeriod + #define xTimerGetExpiryTime MPU_xTimerGetExpiryTime + +/* Privileged only wrappers for Timer APIs. These are needed so that + * the application can use opaque handles maintained in mpu_wrappers.c + * with all the APIs. */ + #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) + #define xTimerGetReloadMode MPU_xTimerGetReloadMode + #define xTimerCreate MPU_xTimerCreate + #define xTimerCreateStatic MPU_xTimerCreateStatic + #define xTimerGetStaticBuffer MPU_xTimerGetStaticBuffer + #define xTimerGenericCommandFromISR MPU_xTimerGenericCommandFromISR + #endif /* #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) */ + +/* Map standard event_group.h API functions to the MPU equivalents. */ + #define xEventGroupWaitBits MPU_xEventGroupWaitBits + #define xEventGroupClearBits MPU_xEventGroupClearBits + #define xEventGroupSetBits MPU_xEventGroupSetBits + #define xEventGroupSync MPU_xEventGroupSync + + #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) + #define uxEventGroupGetNumber MPU_uxEventGroupGetNumber + #define vEventGroupSetNumber MPU_vEventGroupSetNumber + #endif /* #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */ + +/* Privileged only wrappers for Event Group APIs. These are needed so that + * the application can use opaque handles maintained in mpu_wrappers.c + * with all the APIs. */ + #define xEventGroupCreate MPU_xEventGroupCreate + #define xEventGroupCreateStatic MPU_xEventGroupCreateStatic + #define vEventGroupDelete MPU_vEventGroupDelete + + #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) + #define xEventGroupGetStaticBuffer MPU_xEventGroupGetStaticBuffer + #define xEventGroupClearBitsFromISR MPU_xEventGroupClearBitsFromISR + #define xEventGroupSetBitsFromISR MPU_xEventGroupSetBitsFromISR + #define xEventGroupGetBitsFromISR MPU_xEventGroupGetBitsFromISR + #endif /* #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) */ + +/* Map standard message/stream_buffer.h API functions to the MPU + * equivalents. */ + #define xStreamBufferSend MPU_xStreamBufferSend + #define xStreamBufferReceive MPU_xStreamBufferReceive + #define xStreamBufferIsFull MPU_xStreamBufferIsFull + #define xStreamBufferIsEmpty MPU_xStreamBufferIsEmpty + #define xStreamBufferSpacesAvailable MPU_xStreamBufferSpacesAvailable + #define xStreamBufferBytesAvailable MPU_xStreamBufferBytesAvailable + #define xStreamBufferSetTriggerLevel MPU_xStreamBufferSetTriggerLevel + #define xStreamBufferNextMessageLengthBytes MPU_xStreamBufferNextMessageLengthBytes + +/* Privileged only wrappers for Stream Buffer APIs. These are needed so that + * the application can use opaque handles maintained in mpu_wrappers.c + * with all the APIs. */ + + #define xStreamBufferGenericCreate MPU_xStreamBufferGenericCreate + #define xStreamBufferGenericCreateStatic MPU_xStreamBufferGenericCreateStatic + #define vStreamBufferDelete MPU_vStreamBufferDelete + #define xStreamBufferReset MPU_xStreamBufferReset + + #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) + #define xStreamBufferGetStaticBuffers MPU_xStreamBufferGetStaticBuffers + #define xStreamBufferSendFromISR MPU_xStreamBufferSendFromISR + #define xStreamBufferReceiveFromISR MPU_xStreamBufferReceiveFromISR + #define xStreamBufferSendCompletedFromISR MPU_xStreamBufferSendCompletedFromISR + #define xStreamBufferReceiveCompletedFromISR MPU_xStreamBufferReceiveCompletedFromISR + #endif /* #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) */ + +/* Remove the privileged function macro, but keep the PRIVILEGED_DATA + * macro so applications can place data in privileged access sections + * (useful when using statically allocated objects). */ + #define PRIVILEGED_FUNCTION + #define PRIVILEGED_DATA __attribute__( ( section( "privileged_data" ) ) ) + #define FREERTOS_SYSTEM_CALL + + + #if ( ( configUSE_MPU_WRAPPERS_V1 == 0 ) && ( configENABLE_ACCESS_CONTROL_LIST == 1 ) ) + + #define vGrantAccessToTask( xTask, xTaskToGrantAccess ) vGrantAccessToKernelObject( ( xTask ), ( int32_t ) ( xTaskToGrantAccess ) ) + #define vRevokeAccessToTask( xTask, xTaskToRevokeAccess ) vRevokeAccessToKernelObject( ( xTask ), ( int32_t ) ( xTaskToRevokeAccess ) ) + + #define vGrantAccessToSemaphore( xTask, xSemaphoreToGrantAccess ) vGrantAccessToKernelObject( ( xTask ), ( int32_t ) ( xSemaphoreToGrantAccess ) ) + #define vRevokeAccessToSemaphore( xTask, xSemaphoreToRevokeAccess ) vRevokeAccessToKernelObject( ( xTask ), ( int32_t ) ( xSemaphoreToRevokeAccess ) ) + + #define vGrantAccessToQueue( xTask, xQueueToGrantAccess ) vGrantAccessToKernelObject( ( xTask ), ( int32_t ) ( xQueueToGrantAccess ) ) + #define vRevokeAccessToQueue( xTask, xQueueToRevokeAccess ) vRevokeAccessToKernelObject( ( xTask ), ( int32_t ) ( xQueueToRevokeAccess ) ) + + #define vGrantAccessToQueueSet( xTask, xQueueSetToGrantAccess ) vGrantAccessToKernelObject( ( xTask ), ( int32_t ) ( xQueueSetToGrantAccess ) ) + #define vRevokeAccessToQueueSet( xTask, xQueueSetToRevokeAccess ) vRevokeAccessToKernelObject( ( xTask ), ( int32_t ) ( xQueueSetToRevokeAccess ) ) + + #define vGrantAccessToEventGroup( xTask, xEventGroupToGrantAccess ) vGrantAccessToKernelObject( ( xTask ), ( int32_t ) ( xEventGroupToGrantAccess ) ) + #define vRevokeAccessToEventGroup( xTask, xEventGroupToRevokeAccess ) vRevokeAccessToKernelObject( ( xTask ), ( int32_t ) ( xEventGroupToRevokeAccess ) ) + + #define vGrantAccessToStreamBuffer( xTask, xStreamBufferToGrantAccess ) vGrantAccessToKernelObject( ( xTask ), ( int32_t ) ( xStreamBufferToGrantAccess ) ) + #define vRevokeAccessToStreamBuffer( xTask, xStreamBufferToRevokeAccess ) vRevokeAccessToKernelObject( ( xTask ), ( int32_t ) ( xStreamBufferToRevokeAccess ) ) + + #define vGrantAccessToMessageBuffer( xTask, xMessageBufferToGrantAccess ) vGrantAccessToKernelObject( ( xTask ), ( int32_t ) ( xMessageBufferToGrantAccess ) ) + #define vRevokeAccessToMessageBuffer( xTask, xMessageBufferToRevokeAccess ) vRevokeAccessToKernelObject( ( xTask ), ( int32_t ) ( xMessageBufferToRevokeAccess ) ) + + #define vGrantAccessToTimer( xTask, xTimerToGrantAccess ) vGrantAccessToKernelObject( ( xTask ), ( int32_t ) ( xTimerToGrantAccess ) ) + #define vRevokeAccessToTimer( xTask, xTimerToRevokeAccess ) vRevokeAccessToKernelObject( ( xTask ), ( int32_t ) ( xTimerToRevokeAccess ) ) + + #endif /* #if ( ( configUSE_MPU_WRAPPERS_V1 == 0 ) && ( configENABLE_ACCESS_CONTROL_LIST == 1 ) ) */ + + #else /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ + +/* Ensure API functions go in the privileged execution section. */ + #define PRIVILEGED_FUNCTION __attribute__( ( section( "privileged_functions" ) ) ) + #define PRIVILEGED_DATA __attribute__( ( section( "privileged_data" ) ) ) + #define FREERTOS_SYSTEM_CALL __attribute__( ( section( "freertos_system_calls" ) ) ) + + #endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ + +#else /* portUSING_MPU_WRAPPERS */ + + #define PRIVILEGED_FUNCTION + #define PRIVILEGED_DATA + #define FREERTOS_SYSTEM_CALL + +#endif /* portUSING_MPU_WRAPPERS */ + + +#endif /* MPU_WRAPPERS_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/newlib-freertos.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/newlib-freertos.h new file mode 100644 index 0000000..dee4387 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/newlib-freertos.h @@ -0,0 +1,63 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef INC_NEWLIB_FREERTOS_H +#define INC_NEWLIB_FREERTOS_H + +/* Note Newlib support has been included by popular demand, but is not + * used by the FreeRTOS maintainers themselves. FreeRTOS is not + * responsible for resulting newlib operation. User must be familiar with + * newlib and must provide system-wide implementations of the necessary + * stubs. Be warned that (at the time of writing) the current newlib design + * implements a system-wide malloc() that must be provided with locks. + * + * See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html + * for additional information. */ + +#include + +#define configUSE_C_RUNTIME_TLS_SUPPORT 1 + +#ifndef configTLS_BLOCK_TYPE + #define configTLS_BLOCK_TYPE struct _reent +#endif + +#ifndef configINIT_TLS_BLOCK + #define configINIT_TLS_BLOCK( xTLSBlock, pxTopOfStack ) _REENT_INIT_PTR( &( xTLSBlock ) ) +#endif + +#ifndef configSET_TLS_BLOCK + #define configSET_TLS_BLOCK( xTLSBlock ) ( _impure_ptr = &( xTLSBlock ) ) +#endif + +#ifndef configDEINIT_TLS_BLOCK + #define configDEINIT_TLS_BLOCK( xTLSBlock ) _reclaim_reent( &( xTLSBlock ) ) +#endif + +#endif /* INC_NEWLIB_FREERTOS_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/picolibc-freertos.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/picolibc-freertos.h new file mode 100644 index 0000000..1581f38 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/picolibc-freertos.h @@ -0,0 +1,92 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef INC_PICOLIBC_FREERTOS_H +#define INC_PICOLIBC_FREERTOS_H + +/* Use picolibc TLS support to allocate space for __thread variables, + * initialize them at thread creation and set the TLS context at + * thread switch time. + * + * See the picolibc TLS docs: + * https://github.com/picolibc/picolibc/blob/main/doc/tls.md + * for additional information. */ + +#include + +#define configUSE_C_RUNTIME_TLS_SUPPORT 1 + +#define configTLS_BLOCK_TYPE void * + +#define picolibcTLS_SIZE ( ( portPOINTER_SIZE_TYPE ) _tls_size() ) +#define picolibcSTACK_ALIGNMENT_MASK ( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) + +#if __PICOLIBC_MAJOR__ > 1 || __PICOLIBC_MINOR__ >= 8 + +/* Picolibc 1.8 and newer have explicit alignment values provided + * by the _tls_align() inline */ + #define picolibcTLS_ALIGNMENT_MASK ( ( portPOINTER_SIZE_TYPE ) ( _tls_align() - 1 ) ) +#else + +/* For older Picolibc versions, use the general port alignment value */ + #define picolibcTLS_ALIGNMENT_MASK ( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) +#endif + +/* Allocate thread local storage block off the end of the + * stack. The picolibcTLS_SIZE macro returns the size (in + * bytes) of the total TLS area used by the application. + * Calculate the top of stack address. */ +#if ( portSTACK_GROWTH < 0 ) + + #define configINIT_TLS_BLOCK( xTLSBlock, pxTopOfStack ) \ + do { \ + xTLSBlock = ( void * ) ( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) - \ + picolibcTLS_SIZE ) & \ + ~picolibcTLS_ALIGNMENT_MASK ); \ + pxTopOfStack = ( StackType_t * ) ( ( ( ( portPOINTER_SIZE_TYPE ) xTLSBlock ) - 1 ) & \ + ~picolibcSTACK_ALIGNMENT_MASK ); \ + _init_tls( xTLSBlock ); \ + } while( 0 ) +#else /* portSTACK_GROWTH */ + #define configINIT_TLS_BLOCK( xTLSBlock, pxTopOfStack ) \ + do { \ + xTLSBlock = ( void * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack + \ + picolibcTLS_ALIGNMENT_MASK ) & ~picolibcTLS_ALIGNMENT_MASK ); \ + pxTopOfStack = ( StackType_t * ) ( ( ( ( ( portPOINTER_SIZE_TYPE ) xTLSBlock ) + \ + picolibcTLS_SIZE ) + picolibcSTACK_ALIGNMENT_MASK ) & \ + ~picolibcSTACK_ALIGNMENT_MASK ); \ + _init_tls( xTLSBlock ); \ + } while( 0 ) +#endif /* portSTACK_GROWTH */ + +#define configSET_TLS_BLOCK( xTLSBlock ) _set_tls( xTLSBlock ) + +#define configDEINIT_TLS_BLOCK( xTLSBlock ) + +#endif /* INC_PICOLIBC_FREERTOS_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/portable.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/portable.h new file mode 100644 index 0000000..25f826f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/portable.h @@ -0,0 +1,274 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Portable layer API. Each function must be defined for each port. +*----------------------------------------------------------*/ + +#ifndef PORTABLE_H +#define PORTABLE_H + +/* Each FreeRTOS port has a unique portmacro.h header file. Originally a + * pre-processor definition was used to ensure the pre-processor found the correct + * portmacro.h file for the port being used. That scheme was deprecated in favour + * of setting the compiler's include path such that it found the correct + * portmacro.h file - removing the need for the constant and allowing the + * portmacro.h file to be located anywhere in relation to the port being used. + * Purely for reasons of backward compatibility the old method is still valid, but + * to make it clear that new projects should not use it, support for the port + * specific constants has been moved into the deprecated_definitions.h header + * file. */ +#include "deprecated_definitions.h" + +/* If portENTER_CRITICAL is not defined then including deprecated_definitions.h + * did not result in a portmacro.h header file being included - and it should be + * included here. In this case the path to the correct portmacro.h header file + * must be set in the compiler's include path. */ +#ifndef portENTER_CRITICAL + #include "portmacro.h" +#endif + +#if portBYTE_ALIGNMENT == 32 + #define portBYTE_ALIGNMENT_MASK ( 0x001f ) +#elif portBYTE_ALIGNMENT == 16 + #define portBYTE_ALIGNMENT_MASK ( 0x000f ) +#elif portBYTE_ALIGNMENT == 8 + #define portBYTE_ALIGNMENT_MASK ( 0x0007 ) +#elif portBYTE_ALIGNMENT == 4 + #define portBYTE_ALIGNMENT_MASK ( 0x0003 ) +#elif portBYTE_ALIGNMENT == 2 + #define portBYTE_ALIGNMENT_MASK ( 0x0001 ) +#elif portBYTE_ALIGNMENT == 1 + #define portBYTE_ALIGNMENT_MASK ( 0x0000 ) +#else /* if portBYTE_ALIGNMENT == 32 */ + #error "Invalid portBYTE_ALIGNMENT definition" +#endif /* if portBYTE_ALIGNMENT == 32 */ + +#ifndef portUSING_MPU_WRAPPERS + #define portUSING_MPU_WRAPPERS 0 +#endif + +#ifndef portNUM_CONFIGURABLE_REGIONS + #define portNUM_CONFIGURABLE_REGIONS 1 +#endif + +#ifndef portHAS_STACK_OVERFLOW_CHECKING + #define portHAS_STACK_OVERFLOW_CHECKING 0 +#endif + +#ifndef portARCH_NAME + #define portARCH_NAME NULL +#endif + +#ifndef configSTACK_ALLOCATION_FROM_SEPARATE_HEAP + /* Defaults to 0 for backward compatibility. */ + #define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 0 +#endif + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +#include "mpu_wrappers.h" + +/* + * Setup the stack of a new task so it is ready to be placed under the + * scheduler control. The registers have to be placed on the stack in + * the order that the port expects to find them. + * + */ +#if ( portUSING_MPU_WRAPPERS == 1 ) + #if ( portHAS_STACK_OVERFLOW_CHECKING == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged, + xMPU_SETTINGS * xMPUSettings ) PRIVILEGED_FUNCTION; + #else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged, + xMPU_SETTINGS * xMPUSettings ) PRIVILEGED_FUNCTION; + #endif /* if ( portHAS_STACK_OVERFLOW_CHECKING == 1 ) */ +#else /* if ( portUSING_MPU_WRAPPERS == 1 ) */ + #if ( portHAS_STACK_OVERFLOW_CHECKING == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters ) PRIVILEGED_FUNCTION; + #else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) PRIVILEGED_FUNCTION; + #endif +#endif /* if ( portUSING_MPU_WRAPPERS == 1 ) */ + +/* Used by heap_5.c to define the start address and size of each memory region + * that together comprise the total FreeRTOS heap space. */ +typedef struct HeapRegion +{ + uint8_t * pucStartAddress; + size_t xSizeInBytes; +} HeapRegion_t; + +/* Used to pass information about the heap out of vPortGetHeapStats(). */ +typedef struct xHeapStats +{ + size_t xAvailableHeapSpaceInBytes; /* The total heap size currently available - this is the sum of all the free blocks, not the largest block that can be allocated. */ + size_t xSizeOfLargestFreeBlockInBytes; /* The maximum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */ + size_t xSizeOfSmallestFreeBlockInBytes; /* The minimum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */ + size_t xNumberOfFreeBlocks; /* The number of free memory blocks within the heap at the time vPortGetHeapStats() is called. */ + size_t xMinimumEverFreeBytesRemaining; /* The minimum amount of total free memory (sum of all free blocks) there has been in the heap since the system booted. */ + size_t xNumberOfSuccessfulAllocations; /* The number of calls to pvPortMalloc() that have returned a valid memory block. */ + size_t xNumberOfSuccessfulFrees; /* The number of calls to vPortFree() that has successfully freed a block of memory. */ +} HeapStats_t; + +/* + * Used to define multiple heap regions for use by heap_5.c. This function + * must be called before any calls to pvPortMalloc() - not creating a task, + * queue, semaphore, mutex, software timer, event group, etc. will result in + * pvPortMalloc being called. + * + * pxHeapRegions passes in an array of HeapRegion_t structures - each of which + * defines a region of memory that can be used as the heap. The array is + * terminated by a HeapRegions_t structure that has a size of 0. The region + * with the lowest start address must appear first in the array. + */ +void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) PRIVILEGED_FUNCTION; + +/* + * Returns a HeapStats_t structure filled with information about the current + * heap state. + */ +void vPortGetHeapStats( HeapStats_t * pxHeapStats ); + +/* + * Map to the memory management routines required for the port. + */ +void *pvPortMallocExt(size_t xWantedSize, unsigned int heapTag) PRIVILEGED_FUNCTION; /* << EST: used with SystemView */ +void * pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION; +void * pvPortCalloc( size_t xNum, + size_t xSize ) PRIVILEGED_FUNCTION; +void vPortFree( void * pv ) PRIVILEGED_FUNCTION; +void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION; +size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION; +size_t xPortGetMinimumEverFreeHeapSize( void ) PRIVILEGED_FUNCTION; +void vPortInitializeHeap(void) PRIVILEGED_FUNCTION; /* << EST */ + +#if ( configSTACK_ALLOCATION_FROM_SEPARATE_HEAP == 1 ) + void * pvPortMallocStack( size_t xSize ) PRIVILEGED_FUNCTION; + void vPortFreeStack( void * pv ) PRIVILEGED_FUNCTION; +#else + #define pvPortMallocStack pvPortMalloc + #define vPortFreeStack vPortFree +#endif + +#if ( configUSE_MALLOC_FAILED_HOOK == 1 ) + +/** + * task.h + * @code{c} + * void vApplicationMallocFailedHook( void ) + * @endcode + * + * This hook function is called when allocation failed. + */ + void vApplicationMallocFailedHook( void ); +#endif + +/* + * Setup the hardware ready for the scheduler to take control. This generally + * sets up a tick interrupt and sets timers for the correct tick frequency. + */ +BaseType_t xPortStartScheduler( void ) PRIVILEGED_FUNCTION; + +/* + * Undo any hardware/ISR setup that was performed by xPortStartScheduler() so + * the hardware is left in its original condition after the scheduler stops + * executing. + */ +void vPortEndScheduler( void ) PRIVILEGED_FUNCTION; + +/* + * The structures and methods of manipulating the MPU are contained within the + * port layer. + * + * Fills the xMPUSettings structure with the memory region information + * contained in xRegions. + */ +#if ( portUSING_MPU_WRAPPERS == 1 ) + struct xMEMORY_REGION; + void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) PRIVILEGED_FUNCTION; +#endif + +/** + * @brief Checks if the calling task is authorized to access the given buffer. + * + * @param pvBuffer The buffer which the calling task wants to access. + * @param ulBufferLength The length of the pvBuffer. + * @param ulAccessRequested The permissions that the calling task wants. + * + * @return pdTRUE if the calling task is authorized to access the buffer, + * pdFALSE otherwise. + */ +#if ( portUSING_MPU_WRAPPERS == 1 ) + BaseType_t xPortIsAuthorizedToAccessBuffer( const void * pvBuffer, + uint32_t ulBufferLength, + uint32_t ulAccessRequested ) PRIVILEGED_FUNCTION; +#endif + +/** + * @brief Checks if the calling task is authorized to access the given kernel object. + * + * @param lInternalIndexOfKernelObject The index of the kernel object in the kernel + * object handle pool. + * + * @return pdTRUE if the calling task is authorized to access the kernel object, + * pdFALSE otherwise. + */ +#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) + + BaseType_t xPortIsAuthorizedToAccessKernelObject( int32_t lInternalIndexOfKernelObject ) PRIVILEGED_FUNCTION; + +#endif + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* PORTABLE_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/projdefs.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/projdefs.h new file mode 100644 index 0000000..d9a08bd --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/projdefs.h @@ -0,0 +1,139 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PROJDEFS_H +#define PROJDEFS_H + +/* + * Defines the prototype to which task functions must conform. Defined in this + * file to ensure the type is known before portable.h is included. + */ +typedef void (* TaskFunction_t)( void * arg ); + +/* Converts a time in milliseconds to a time in ticks. This macro can be + * overridden by a macro of the same name defined in FreeRTOSConfig.h in case the + * definition here is not suitable for your application. */ +#ifndef pdMS_TO_TICKS + #define pdMS_TO_TICKS( xTimeInMs ) ( ( TickType_t ) ( ( ( uint64_t ) ( xTimeInMs ) * ( uint64_t ) configTICK_RATE_HZ ) / ( uint64_t ) 1000U ) ) +#endif + +/* Converts a time in ticks to a time in milliseconds. This macro can be + * overridden by a macro of the same name defined in FreeRTOSConfig.h in case the + * definition here is not suitable for your application. */ +#ifndef pdTICKS_TO_MS + #define pdTICKS_TO_MS( xTimeInTicks ) ( ( TickType_t ) ( ( ( uint64_t ) ( xTimeInTicks ) * ( uint64_t ) 1000U ) / ( uint64_t ) configTICK_RATE_HZ ) ) +#endif + +#define pdFALSE ( ( BaseType_t ) 0 ) +#define pdTRUE ( ( BaseType_t ) 1 ) +#define pdFALSE_SIGNED ( ( BaseType_t ) 0 ) +#define pdTRUE_SIGNED ( ( BaseType_t ) 1 ) +#define pdFALSE_UNSIGNED ( ( UBaseType_t ) 0 ) +#define pdTRUE_UNSIGNED ( ( UBaseType_t ) 1 ) + +#define pdPASS ( pdTRUE ) +#define pdFAIL ( pdFALSE ) +#define errQUEUE_EMPTY ( ( BaseType_t ) 0 ) +#define errQUEUE_FULL ( ( BaseType_t ) 0 ) + +/* FreeRTOS error definitions. */ +#define errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ( -1 ) +#define errQUEUE_BLOCKED ( -4 ) +#define errQUEUE_YIELD ( -5 ) + +/* Macros used for basic data corruption checks. */ +#ifndef configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES + #define configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES 0 +#endif + +#if ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_16_BITS ) + #define pdINTEGRITY_CHECK_VALUE 0x5a5a +#elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_32_BITS ) + #define pdINTEGRITY_CHECK_VALUE 0x5a5a5a5aUL +#elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_64_BITS ) + #define pdINTEGRITY_CHECK_VALUE 0x5a5a5a5a5a5a5a5aULL +#else + #error configTICK_TYPE_WIDTH_IN_BITS set to unsupported tick type width. +#endif + +/* The following errno values are used by FreeRTOS+ components, not FreeRTOS + * itself. */ +#define pdFREERTOS_ERRNO_NONE 0 /* No errors */ +#define pdFREERTOS_ERRNO_ENOENT 2 /* No such file or directory */ +#define pdFREERTOS_ERRNO_EINTR 4 /* Interrupted system call */ +#define pdFREERTOS_ERRNO_EIO 5 /* I/O error */ +#define pdFREERTOS_ERRNO_ENXIO 6 /* No such device or address */ +#define pdFREERTOS_ERRNO_EBADF 9 /* Bad file number */ +#define pdFREERTOS_ERRNO_EAGAIN 11 /* No more processes */ +#define pdFREERTOS_ERRNO_EWOULDBLOCK 11 /* Operation would block */ +#define pdFREERTOS_ERRNO_ENOMEM 12 /* Not enough memory */ +#define pdFREERTOS_ERRNO_EACCES 13 /* Permission denied */ +#define pdFREERTOS_ERRNO_EFAULT 14 /* Bad address */ +#define pdFREERTOS_ERRNO_EBUSY 16 /* Mount device busy */ +#define pdFREERTOS_ERRNO_EEXIST 17 /* File exists */ +#define pdFREERTOS_ERRNO_EXDEV 18 /* Cross-device link */ +#define pdFREERTOS_ERRNO_ENODEV 19 /* No such device */ +#define pdFREERTOS_ERRNO_ENOTDIR 20 /* Not a directory */ +#define pdFREERTOS_ERRNO_EISDIR 21 /* Is a directory */ +#define pdFREERTOS_ERRNO_EINVAL 22 /* Invalid argument */ +#define pdFREERTOS_ERRNO_ENOSPC 28 /* No space left on device */ +#define pdFREERTOS_ERRNO_ESPIPE 29 /* Illegal seek */ +#define pdFREERTOS_ERRNO_EROFS 30 /* Read only file system */ +#define pdFREERTOS_ERRNO_EUNATCH 42 /* Protocol driver not attached */ +#define pdFREERTOS_ERRNO_EBADE 50 /* Invalid exchange */ +#define pdFREERTOS_ERRNO_EFTYPE 79 /* Inappropriate file type or format */ +#define pdFREERTOS_ERRNO_ENMFILE 89 /* No more files */ +#define pdFREERTOS_ERRNO_ENOTEMPTY 90 /* Directory not empty */ +#define pdFREERTOS_ERRNO_ENAMETOOLONG 91 /* File or path name too long */ +#define pdFREERTOS_ERRNO_EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ +#define pdFREERTOS_ERRNO_EAFNOSUPPORT 97 /* Address family not supported by protocol */ +#define pdFREERTOS_ERRNO_ENOBUFS 105 /* No buffer space available */ +#define pdFREERTOS_ERRNO_ENOPROTOOPT 109 /* Protocol not available */ +#define pdFREERTOS_ERRNO_EADDRINUSE 112 /* Address already in use */ +#define pdFREERTOS_ERRNO_ETIMEDOUT 116 /* Connection timed out */ +#define pdFREERTOS_ERRNO_EINPROGRESS 119 /* Connection already in progress */ +#define pdFREERTOS_ERRNO_EALREADY 120 /* Socket already connected */ +#define pdFREERTOS_ERRNO_EADDRNOTAVAIL 125 /* Address not available */ +#define pdFREERTOS_ERRNO_EISCONN 127 /* Socket is already connected */ +#define pdFREERTOS_ERRNO_ENOTCONN 128 /* Socket is not connected */ +#define pdFREERTOS_ERRNO_ENOMEDIUM 135 /* No medium inserted */ +#define pdFREERTOS_ERRNO_EILSEQ 138 /* An invalid UTF-16 sequence was encountered. */ +#define pdFREERTOS_ERRNO_ECANCELED 140 /* Operation canceled. */ + +/* The following endian values are used by FreeRTOS+ components, not FreeRTOS + * itself. */ +#define pdFREERTOS_LITTLE_ENDIAN 0 +#define pdFREERTOS_BIG_ENDIAN 1 + +/* Re-defining endian values for generic naming. */ +#define pdLITTLE_ENDIAN pdFREERTOS_LITTLE_ENDIAN +#define pdBIG_ENDIAN pdFREERTOS_BIG_ENDIAN + + +#endif /* PROJDEFS_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/queue.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/queue.h new file mode 100644 index 0000000..a79f636 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/queue.h @@ -0,0 +1,1813 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef QUEUE_H +#define QUEUE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h" must appear in source files before "include queue.h" +#endif + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +#include "task.h" + +/** + * Type by which queues are referenced. For example, a call to xQueueCreate() + * returns an QueueHandle_t variable that can then be used as a parameter to + * xQueueSend(), xQueueReceive(), etc. + */ +struct QueueDefinition; /* Using old naming convention so as not to break kernel aware debuggers. */ +typedef struct QueueDefinition * QueueHandle_t; + +/** + * Type by which queue sets are referenced. For example, a call to + * xQueueCreateSet() returns an xQueueSet variable that can then be used as a + * parameter to xQueueSelectFromSet(), xQueueAddToSet(), etc. + */ +typedef struct QueueDefinition * QueueSetHandle_t; + +/** + * Queue sets can contain both queues and semaphores, so the + * QueueSetMemberHandle_t is defined as a type to be used where a parameter or + * return value can be either an QueueHandle_t or an SemaphoreHandle_t. + */ +typedef struct QueueDefinition * QueueSetMemberHandle_t; + +/* For internal use only. */ +#define queueSEND_TO_BACK ( ( BaseType_t ) 0 ) +#define queueSEND_TO_FRONT ( ( BaseType_t ) 1 ) +#define queueOVERWRITE ( ( BaseType_t ) 2 ) + +/* For internal use only. These definitions *must* match those in queue.c. */ +#define queueQUEUE_TYPE_BASE ( ( uint8_t ) 0U ) +#define queueQUEUE_TYPE_SET ( ( uint8_t ) 0U ) +#define queueQUEUE_TYPE_MUTEX ( ( uint8_t ) 1U ) +#define queueQUEUE_TYPE_COUNTING_SEMAPHORE ( ( uint8_t ) 2U ) +#define queueQUEUE_TYPE_BINARY_SEMAPHORE ( ( uint8_t ) 3U ) +#define queueQUEUE_TYPE_RECURSIVE_MUTEX ( ( uint8_t ) 4U ) + +/** + * queue. h + * @code{c} + * QueueHandle_t xQueueCreate( + * UBaseType_t uxQueueLength, + * UBaseType_t uxItemSize + * ); + * @endcode + * + * Creates a new queue instance, and returns a handle by which the new queue + * can be referenced. + * + * Internally, within the FreeRTOS implementation, queues use two blocks of + * memory. The first block is used to hold the queue's data structures. The + * second block is used to hold items placed into the queue. If a queue is + * created using xQueueCreate() then both blocks of memory are automatically + * dynamically allocated inside the xQueueCreate() function. (see + * https://www.FreeRTOS.org/a00111.html). If a queue is created using + * xQueueCreateStatic() then the application writer must provide the memory that + * will get used by the queue. xQueueCreateStatic() therefore allows a queue to + * be created without using any dynamic memory allocation. + * + * https://www.FreeRTOS.org/Embedded-RTOS-Queues.html + * + * @param uxQueueLength The maximum number of items that the queue can contain. + * + * @param uxItemSize The number of bytes each item in the queue will require. + * Items are queued by copy, not by reference, so this is the number of bytes + * that will be copied for each posted item. Each item on the queue must be + * the same size. + * + * @return If the queue is successfully create then a handle to the newly + * created queue is returned. If the queue cannot be created then 0 is + * returned. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * }; + * + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1, xQueue2; + * + * // Create a queue capable of containing 10 uint32_t values. + * xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); + * if( xQueue1 == 0 ) + * { + * // Queue was not created and must not be used. + * } + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * if( xQueue2 == 0 ) + * { + * // Queue was not created and must not be used. + * } + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueueCreate xQueueCreate + * \ingroup QueueManagement + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xQueueCreate( uxQueueLength, uxItemSize ) xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), ( queueQUEUE_TYPE_BASE ) ) +#endif + +/** + * queue. h + * @code{c} + * QueueHandle_t xQueueCreateStatic( + * UBaseType_t uxQueueLength, + * UBaseType_t uxItemSize, + * uint8_t *pucQueueStorage, + * StaticQueue_t *pxQueueBuffer + * ); + * @endcode + * + * Creates a new queue instance, and returns a handle by which the new queue + * can be referenced. + * + * Internally, within the FreeRTOS implementation, queues use two blocks of + * memory. The first block is used to hold the queue's data structures. The + * second block is used to hold items placed into the queue. If a queue is + * created using xQueueCreate() then both blocks of memory are automatically + * dynamically allocated inside the xQueueCreate() function. (see + * https://www.FreeRTOS.org/a00111.html). If a queue is created using + * xQueueCreateStatic() then the application writer must provide the memory that + * will get used by the queue. xQueueCreateStatic() therefore allows a queue to + * be created without using any dynamic memory allocation. + * + * https://www.FreeRTOS.org/Embedded-RTOS-Queues.html + * + * @param uxQueueLength The maximum number of items that the queue can contain. + * + * @param uxItemSize The number of bytes each item in the queue will require. + * Items are queued by copy, not by reference, so this is the number of bytes + * that will be copied for each posted item. Each item on the queue must be + * the same size. + * + * @param pucQueueStorage If uxItemSize is not zero then + * pucQueueStorage must point to a uint8_t array that is at least large + * enough to hold the maximum number of items that can be in the queue at any + * one time - which is ( uxQueueLength * uxItemsSize ) bytes. If uxItemSize is + * zero then pucQueueStorage can be NULL. + * + * @param pxQueueBuffer Must point to a variable of type StaticQueue_t, which + * will be used to hold the queue's data structure. + * + * @return If the queue is created then a handle to the created queue is + * returned. If pxQueueBuffer is NULL then NULL is returned. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * }; + * + #define QUEUE_LENGTH 10 + #define ITEM_SIZE sizeof( uint32_t ) + * + * // xQueueBuffer will hold the queue structure. + * StaticQueue_t xQueueBuffer; + * + * // ucQueueStorage will hold the items posted to the queue. Must be at least + * // [(queue length) * ( queue item size)] bytes long. + * uint8_t ucQueueStorage[ QUEUE_LENGTH * ITEM_SIZE ]; + * + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1; + * + * // Create a queue capable of containing 10 uint32_t values. + * xQueue1 = xQueueCreate( QUEUE_LENGTH, // The number of items the queue can hold. + * ITEM_SIZE // The size of each item in the queue + * &( ucQueueStorage[ 0 ] ), // The buffer that will hold the items in the queue. + * &xQueueBuffer ); // The buffer that will hold the queue structure. + * + * // The queue is guaranteed to be created successfully as no dynamic memory + * // allocation is used. Therefore xQueue1 is now a handle to a valid queue. + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueueCreateStatic xQueueCreateStatic + * \ingroup QueueManagement + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xQueueCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxQueueBuffer ) xQueueGenericCreateStatic( ( uxQueueLength ), ( uxItemSize ), ( pucQueueStorage ), ( pxQueueBuffer ), ( queueQUEUE_TYPE_BASE ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * queue. h + * @code{c} + * BaseType_t xQueueGetStaticBuffers( QueueHandle_t xQueue, + * uint8_t ** ppucQueueStorage, + * StaticQueue_t ** ppxStaticQueue ); + * @endcode + * + * Retrieve pointers to a statically created queue's data structure buffer + * and storage area buffer. These are the same buffers that are supplied + * at the time of creation. + * + * @param xQueue The queue for which to retrieve the buffers. + * + * @param ppucQueueStorage Used to return a pointer to the queue's storage + * area buffer. + * + * @param ppxStaticQueue Used to return a pointer to the queue's data + * structure buffer. + * + * @return pdTRUE if buffers were retrieved, pdFALSE otherwise. + * + * \defgroup xQueueGetStaticBuffers xQueueGetStaticBuffers + * \ingroup QueueManagement + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xQueueGetStaticBuffers( xQueue, ppucQueueStorage, ppxStaticQueue ) xQueueGenericGetStaticBuffers( ( xQueue ), ( ppucQueueStorage ), ( ppxStaticQueue ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * queue. h + * @code{c} + * BaseType_t xQueueSendToFront( + * QueueHandle_t xQueue, + * const void *pvItemToQueue, + * TickType_t xTicksToWait + * ); + * @endcode + * + * Post an item to the front of a queue. The item is queued by copy, not by + * reference. This function must not be called from an interrupt service + * routine. See xQueueSendFromISR () for an alternative which may be used + * in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * } xMessage; + * + * uint32_t ulVar = 10UL; + * + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1, xQueue2; + * struct AMessage *pxMessage; + * + * // Create a queue capable of containing 10 uint32_t values. + * xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * + * // ... + * + * if( xQueue1 != 0 ) + * { + * // Send an uint32_t. Wait for 10 ticks for space to become + * // available if necessary. + * if( xQueueSendToFront( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS ) + * { + * // Failed to post the message, even after 10 ticks. + * } + * } + * + * if( xQueue2 != 0 ) + * { + * // Send a pointer to a struct AMessage object. Don't block if the + * // queue is already full. + * pxMessage = & xMessage; + * xQueueSendToFront( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 ); + * } + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSendToFront( xQueue, pvItemToQueue, xTicksToWait ) \ + xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_FRONT ) + +/** + * queue. h + * @code{c} + * BaseType_t xQueueSendToBack( + * QueueHandle_t xQueue, + * const void *pvItemToQueue, + * TickType_t xTicksToWait + * ); + * @endcode + * + * This is a macro that calls xQueueGenericSend(). + * + * Post an item to the back of a queue. The item is queued by copy, not by + * reference. This function must not be called from an interrupt service + * routine. See xQueueSendFromISR () for an alternative which may be used + * in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the queue + * is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * } xMessage; + * + * uint32_t ulVar = 10UL; + * + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1, xQueue2; + * struct AMessage *pxMessage; + * + * // Create a queue capable of containing 10 uint32_t values. + * xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * + * // ... + * + * if( xQueue1 != 0 ) + * { + * // Send an uint32_t. Wait for 10 ticks for space to become + * // available if necessary. + * if( xQueueSendToBack( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS ) + * { + * // Failed to post the message, even after 10 ticks. + * } + * } + * + * if( xQueue2 != 0 ) + * { + * // Send a pointer to a struct AMessage object. Don't block if the + * // queue is already full. + * pxMessage = & xMessage; + * xQueueSendToBack( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 ); + * } + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSendToBack( xQueue, pvItemToQueue, xTicksToWait ) \ + xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) + +/** + * queue. h + * @code{c} + * BaseType_t xQueueSend( + * QueueHandle_t xQueue, + * const void * pvItemToQueue, + * TickType_t xTicksToWait + * ); + * @endcode + * + * This is a macro that calls xQueueGenericSend(). It is included for + * backward compatibility with versions of FreeRTOS.org that did not + * include the xQueueSendToFront() and xQueueSendToBack() macros. It is + * equivalent to xQueueSendToBack(). + * + * Post an item on a queue. The item is queued by copy, not by reference. + * This function must not be called from an interrupt service routine. + * See xQueueSendFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * } xMessage; + * + * uint32_t ulVar = 10UL; + * + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1, xQueue2; + * struct AMessage *pxMessage; + * + * // Create a queue capable of containing 10 uint32_t values. + * xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * + * // ... + * + * if( xQueue1 != 0 ) + * { + * // Send an uint32_t. Wait for 10 ticks for space to become + * // available if necessary. + * if( xQueueSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS ) + * { + * // Failed to post the message, even after 10 ticks. + * } + * } + * + * if( xQueue2 != 0 ) + * { + * // Send a pointer to a struct AMessage object. Don't block if the + * // queue is already full. + * pxMessage = & xMessage; + * xQueueSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 ); + * } + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) \ + xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) + +/** + * queue. h + * @code{c} + * BaseType_t xQueueOverwrite( + * QueueHandle_t xQueue, + * const void * pvItemToQueue + * ); + * @endcode + * + * Only for use with queues that have a length of one - so the queue is either + * empty or full. + * + * Post an item on a queue. If the queue is already full then overwrite the + * value held in the queue. The item is queued by copy, not by reference. + * + * This function must not be called from an interrupt service routine. + * See xQueueOverwriteFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle of the queue to which the data is being sent. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @return xQueueOverwrite() is a macro that calls xQueueGenericSend(), and + * therefore has the same return values as xQueueSendToFront(). However, pdPASS + * is the only value that can be returned because xQueueOverwrite() will write + * to the queue even when the queue is already full. + * + * Example usage: + * @code{c} + * + * void vFunction( void *pvParameters ) + * { + * QueueHandle_t xQueue; + * uint32_t ulVarToSend, ulValReceived; + * + * // Create a queue to hold one uint32_t value. It is strongly + * // recommended *not* to use xQueueOverwrite() on queues that can + * // contain more than one value, and doing so will trigger an assertion + * // if configASSERT() is defined. + * xQueue = xQueueCreate( 1, sizeof( uint32_t ) ); + * + * // Write the value 10 to the queue using xQueueOverwrite(). + * ulVarToSend = 10; + * xQueueOverwrite( xQueue, &ulVarToSend ); + * + * // Peeking the queue should now return 10, but leave the value 10 in + * // the queue. A block time of zero is used as it is known that the + * // queue holds a value. + * ulValReceived = 0; + * xQueuePeek( xQueue, &ulValReceived, 0 ); + * + * if( ulValReceived != 10 ) + * { + * // Error unless the item was removed by a different task. + * } + * + * // The queue is still full. Use xQueueOverwrite() to overwrite the + * // value held in the queue with 100. + * ulVarToSend = 100; + * xQueueOverwrite( xQueue, &ulVarToSend ); + * + * // This time read from the queue, leaving the queue empty once more. + * // A block time of 0 is used again. + * xQueueReceive( xQueue, &ulValReceived, 0 ); + * + * // The value read should be the last value written, even though the + * // queue was already full when the value was written. + * if( ulValReceived != 100 ) + * { + * // Error! + * } + * + * // ... + * } + * @endcode + * \defgroup xQueueOverwrite xQueueOverwrite + * \ingroup QueueManagement + */ +#define xQueueOverwrite( xQueue, pvItemToQueue ) \ + xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), 0, queueOVERWRITE ) + + +/** + * queue. h + * @code{c} + * BaseType_t xQueueGenericSend( + * QueueHandle_t xQueue, + * const void * pvItemToQueue, + * TickType_t xTicksToWait + * BaseType_t xCopyPosition + * ); + * @endcode + * + * It is preferred that the macros xQueueSend(), xQueueSendToFront() and + * xQueueSendToBack() are used in place of calling this function directly. + * + * Post an item on a queue. The item is queued by copy, not by reference. + * This function must not be called from an interrupt service routine. + * See xQueueSendFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the + * item at the back of the queue, or queueSEND_TO_FRONT to place the item + * at the front of the queue (for high priority messages). + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * } xMessage; + * + * uint32_t ulVar = 10UL; + * + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1, xQueue2; + * struct AMessage *pxMessage; + * + * // Create a queue capable of containing 10 uint32_t values. + * xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * + * // ... + * + * if( xQueue1 != 0 ) + * { + * // Send an uint32_t. Wait for 10 ticks for space to become + * // available if necessary. + * if( xQueueGenericSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10, queueSEND_TO_BACK ) != pdPASS ) + * { + * // Failed to post the message, even after 10 ticks. + * } + * } + * + * if( xQueue2 != 0 ) + * { + * // Send a pointer to a struct AMessage object. Don't block if the + * // queue is already full. + * pxMessage = & xMessage; + * xQueueGenericSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0, queueSEND_TO_BACK ); + * } + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +BaseType_t xQueueGenericSend( QueueHandle_t xQueue, + const void * const pvItemToQueue, + TickType_t xTicksToWait, + const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * BaseType_t xQueuePeek( + * QueueHandle_t xQueue, + * void * const pvBuffer, + * TickType_t xTicksToWait + * ); + * @endcode + * + * Receive an item from a queue without removing the item from the queue. + * The item is received by copy so a buffer of adequate size must be + * provided. The number of bytes copied into the buffer was defined when + * the queue was created. + * + * Successfully received items remain on the queue so will be returned again + * by the next call, or a call to xQueueReceive(). + * + * This macro must not be used in an interrupt service routine. See + * xQueuePeekFromISR() for an alternative that can be called from an interrupt + * service routine. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for an item to receive should the queue be empty at the time + * of the call. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * xQueuePeek() will return immediately if xTicksToWait is 0 and the queue + * is empty. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * } xMessage; + * + * QueueHandle_t xQueue; + * + * // Task to create a queue and post a value. + * void vATask( void *pvParameters ) + * { + * struct AMessage *pxMessage; + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * if( xQueue == 0 ) + * { + * // Failed to create the queue. + * } + * + * // ... + * + * // Send a pointer to a struct AMessage object. Don't block if the + * // queue is already full. + * pxMessage = & xMessage; + * xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 ); + * + * // ... Rest of task code. + * } + * + * // Task to peek the data from the queue. + * void vADifferentTask( void *pvParameters ) + * { + * struct AMessage *pxRxedMessage; + * + * if( xQueue != 0 ) + * { + * // Peek a message on the created queue. Block for 10 ticks if a + * // message is not immediately available. + * if( xQueuePeek( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) ) + * { + * // pcRxedMessage now points to the struct AMessage variable posted + * // by vATask, but the item still remains on the queue. + * } + * } + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueuePeek xQueuePeek + * \ingroup QueueManagement + */ +BaseType_t xQueuePeek( QueueHandle_t xQueue, + void * const pvBuffer, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * BaseType_t xQueuePeekFromISR( + * QueueHandle_t xQueue, + * void *pvBuffer, + * ); + * @endcode + * + * A version of xQueuePeek() that can be called from an interrupt service + * routine (ISR). + * + * Receive an item from a queue without removing the item from the queue. + * The item is received by copy so a buffer of adequate size must be + * provided. The number of bytes copied into the buffer was defined when + * the queue was created. + * + * Successfully received items remain on the queue so will be returned again + * by the next call, or a call to xQueueReceive(). + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * \defgroup xQueuePeekFromISR xQueuePeekFromISR + * \ingroup QueueManagement + */ +BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, + void * const pvBuffer ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * BaseType_t xQueueReceive( + * QueueHandle_t xQueue, + * void *pvBuffer, + * TickType_t xTicksToWait + * ); + * @endcode + * + * Receive an item from a queue. The item is received by copy so a buffer of + * adequate size must be provided. The number of bytes copied into the buffer + * was defined when the queue was created. + * + * Successfully received items are removed from the queue. + * + * This function must not be used in an interrupt service routine. See + * xQueueReceiveFromISR for an alternative that can. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for an item to receive should the queue be empty at the time + * of the call. xQueueReceive() will return immediately if xTicksToWait + * is zero and the queue is empty. The time is defined in tick periods so the + * constant portTICK_PERIOD_MS should be used to convert to real time if this is + * required. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * } xMessage; + * + * QueueHandle_t xQueue; + * + * // Task to create a queue and post a value. + * void vATask( void *pvParameters ) + * { + * struct AMessage *pxMessage; + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * if( xQueue == 0 ) + * { + * // Failed to create the queue. + * } + * + * // ... + * + * // Send a pointer to a struct AMessage object. Don't block if the + * // queue is already full. + * pxMessage = & xMessage; + * xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 ); + * + * // ... Rest of task code. + * } + * + * // Task to receive from the queue. + * void vADifferentTask( void *pvParameters ) + * { + * struct AMessage *pxRxedMessage; + * + * if( xQueue != 0 ) + * { + * // Receive a message on the created queue. Block for 10 ticks if a + * // message is not immediately available. + * if( xQueueReceive( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) ) + * { + * // pcRxedMessage now points to the struct AMessage variable posted + * // by vATask. + * } + * } + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueueReceive xQueueReceive + * \ingroup QueueManagement + */ +BaseType_t xQueueReceive( QueueHandle_t xQueue, + void * const pvBuffer, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ); + * @endcode + * + * Return the number of messages stored in a queue. + * + * @param xQueue A handle to the queue being queried. + * + * @return The number of messages available in the queue. + * + * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting + * \ingroup QueueManagement + */ +UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ); + * @endcode + * + * Return the number of free spaces available in a queue. This is equal to the + * number of items that can be sent to the queue before the queue becomes full + * if no items are removed. + * + * @param xQueue A handle to the queue being queried. + * + * @return The number of spaces available in the queue. + * + * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting + * \ingroup QueueManagement + */ +UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * void vQueueDelete( QueueHandle_t xQueue ); + * @endcode + * + * Delete a queue - freeing all the memory allocated for storing of items + * placed on the queue. + * + * @param xQueue A handle to the queue to be deleted. + * + * \defgroup vQueueDelete vQueueDelete + * \ingroup QueueManagement + */ +void vQueueDelete( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * BaseType_t xQueueSendToFrontFromISR( + * QueueHandle_t xQueue, + * const void *pvItemToQueue, + * BaseType_t *pxHigherPriorityTaskWoken + * ); + * @endcode + * + * This is a macro that calls xQueueGenericSendFromISR(). + * + * Post an item to the front of a queue. It is safe to use this macro from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendToFrontFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendToFrontFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + * @code{c} + * void vBufferISR( void ) + * { + * char cIn; + * BaseType_t xHigherPriorityTaskWoken; + * + * // We have not woken a task at the start of the ISR. + * xHigherPriorityTaskWoken = pdFALSE; + * + * // Loop until the buffer is empty. + * do + * { + * // Obtain a byte from the buffer. + * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + * + * // Post the byte. + * xQueueSendToFrontFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken ); + * + * } while( portINPUT_BYTE( BUFFER_COUNT ) ); + * + * // Now the buffer is empty we can switch context if necessary. + * if( xHigherPriorityTaskWoken ) + * { + * taskYIELD (); + * } + * } + * @endcode + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendToFrontFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \ + xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_FRONT ) + + +/** + * queue. h + * @code{c} + * BaseType_t xQueueSendToBackFromISR( + * QueueHandle_t xQueue, + * const void *pvItemToQueue, + * BaseType_t *pxHigherPriorityTaskWoken + * ); + * @endcode + * + * This is a macro that calls xQueueGenericSendFromISR(). + * + * Post an item to the back of a queue. It is safe to use this macro from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendToBackFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendToBackFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + * @code{c} + * void vBufferISR( void ) + * { + * char cIn; + * BaseType_t xHigherPriorityTaskWoken; + * + * // We have not woken a task at the start of the ISR. + * xHigherPriorityTaskWoken = pdFALSE; + * + * // Loop until the buffer is empty. + * do + * { + * // Obtain a byte from the buffer. + * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + * + * // Post the byte. + * xQueueSendToBackFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken ); + * + * } while( portINPUT_BYTE( BUFFER_COUNT ) ); + * + * // Now the buffer is empty we can switch context if necessary. + * if( xHigherPriorityTaskWoken ) + * { + * taskYIELD (); + * } + * } + * @endcode + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendToBackFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \ + xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) + +/** + * queue. h + * @code{c} + * BaseType_t xQueueOverwriteFromISR( + * QueueHandle_t xQueue, + * const void * pvItemToQueue, + * BaseType_t *pxHigherPriorityTaskWoken + * ); + * @endcode + * + * A version of xQueueOverwrite() that can be used in an interrupt service + * routine (ISR). + * + * Only for use with queues that can hold a single item - so the queue is either + * empty or full. + * + * Post an item on a queue. If the queue is already full then overwrite the + * value held in the queue. The item is queued by copy, not by reference. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueOverwriteFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueOverwriteFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return xQueueOverwriteFromISR() is a macro that calls + * xQueueGenericSendFromISR(), and therefore has the same return values as + * xQueueSendToFrontFromISR(). However, pdPASS is the only value that can be + * returned because xQueueOverwriteFromISR() will write to the queue even when + * the queue is already full. + * + * Example usage: + * @code{c} + * + * QueueHandle_t xQueue; + * + * void vFunction( void *pvParameters ) + * { + * // Create a queue to hold one uint32_t value. It is strongly + * // recommended *not* to use xQueueOverwriteFromISR() on queues that can + * // contain more than one value, and doing so will trigger an assertion + * // if configASSERT() is defined. + * xQueue = xQueueCreate( 1, sizeof( uint32_t ) ); + * } + * + * void vAnInterruptHandler( void ) + * { + * // xHigherPriorityTaskWoken must be set to pdFALSE before it is used. + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * uint32_t ulVarToSend, ulValReceived; + * + * // Write the value 10 to the queue using xQueueOverwriteFromISR(). + * ulVarToSend = 10; + * xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken ); + * + * // The queue is full, but calling xQueueOverwriteFromISR() again will still + * // pass because the value held in the queue will be overwritten with the + * // new value. + * ulVarToSend = 100; + * xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken ); + * + * // Reading from the queue will now return 100. + * + * // ... + * + * if( xHigherPrioritytaskWoken == pdTRUE ) + * { + * // Writing to the queue caused a task to unblock and the unblocked task + * // has a priority higher than or equal to the priority of the currently + * // executing task (the task this interrupt interrupted). Perform a context + * // switch so this interrupt returns directly to the unblocked task. + * // The macro used is port specific and will be either + * // portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - refer to the documentation + * // page for the port being used. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * } + * } + * @endcode + * \defgroup xQueueOverwriteFromISR xQueueOverwriteFromISR + * \ingroup QueueManagement + */ +#define xQueueOverwriteFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \ + xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueOVERWRITE ) + +/** + * queue. h + * @code{c} + * BaseType_t xQueueSendFromISR( + * QueueHandle_t xQueue, + * const void *pvItemToQueue, + * BaseType_t *pxHigherPriorityTaskWoken + * ); + * @endcode + * + * This is a macro that calls xQueueGenericSendFromISR(). It is included + * for backward compatibility with versions of FreeRTOS.org that did not + * include the xQueueSendToBackFromISR() and xQueueSendToFrontFromISR() + * macros. + * + * Post an item to the back of a queue. It is safe to use this function from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + * @code{c} + * void vBufferISR( void ) + * { + * char cIn; + * BaseType_t xHigherPriorityTaskWoken; + * + * // We have not woken a task at the start of the ISR. + * xHigherPriorityTaskWoken = pdFALSE; + * + * // Loop until the buffer is empty. + * do + * { + * // Obtain a byte from the buffer. + * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + * + * // Post the byte. + * xQueueSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken ); + * + * } while( portINPUT_BYTE( BUFFER_COUNT ) ); + * + * // Now the buffer is empty we can switch context if necessary. + * if( xHigherPriorityTaskWoken ) + * { + * // As xHigherPriorityTaskWoken is now set to pdTRUE then a context + * // switch should be requested. The macro used is port specific and + * // will be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - + * // refer to the documentation page for the port being used. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * } + * } + * @endcode + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \ + xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) + +/** + * queue. h + * @code{c} + * BaseType_t xQueueGenericSendFromISR( + * QueueHandle_t xQueue, + * const void *pvItemToQueue, + * BaseType_t *pxHigherPriorityTaskWoken, + * BaseType_t xCopyPosition + * ); + * @endcode + * + * It is preferred that the macros xQueueSendFromISR(), + * xQueueSendToFrontFromISR() and xQueueSendToBackFromISR() be used in place + * of calling this function directly. xQueueGiveFromISR() is an + * equivalent for use by semaphores that don't actually copy any data. + * + * Post an item on a queue. It is safe to use this function from within an + * interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueGenericSendFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueGenericSendFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the + * item at the back of the queue, or queueSEND_TO_FRONT to place the item + * at the front of the queue (for high priority messages). + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + * @code{c} + * void vBufferISR( void ) + * { + * char cIn; + * BaseType_t xHigherPriorityTaskWokenByPost; + * + * // We have not woken a task at the start of the ISR. + * xHigherPriorityTaskWokenByPost = pdFALSE; + * + * // Loop until the buffer is empty. + * do + * { + * // Obtain a byte from the buffer. + * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + * + * // Post each byte. + * xQueueGenericSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWokenByPost, queueSEND_TO_BACK ); + * + * } while( portINPUT_BYTE( BUFFER_COUNT ) ); + * + * // Now the buffer is empty we can switch context if necessary. + * if( xHigherPriorityTaskWokenByPost ) + * { + * // As xHigherPriorityTaskWokenByPost is now set to pdTRUE then a context + * // switch should be requested. The macro used is port specific and + * // will be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - + * // refer to the documentation page for the port being used. + * portYIELD_FROM_ISR( xHigherPriorityTaskWokenByPost ); + * } + * } + * @endcode + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, + const void * const pvItemToQueue, + BaseType_t * const pxHigherPriorityTaskWoken, + const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, + BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * BaseType_t xQueueReceiveFromISR( + * QueueHandle_t xQueue, + * void *pvBuffer, + * BaseType_t *pxTaskWoken + * ); + * @endcode + * + * Receive an item from a queue. It is safe to use this function from within an + * interrupt service routine. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param pxHigherPriorityTaskWoken A task may be blocked waiting for space to + * become available on the queue. If xQueueReceiveFromISR causes such a task + * to unblock *pxTaskWoken will get set to pdTRUE, otherwise *pxTaskWoken will + * remain unchanged. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: + * @code{c} + * + * QueueHandle_t xQueue; + * + * // Function to create a queue and post some values. + * void vAFunction( void *pvParameters ) + * { + * char cValueToPost; + * const TickType_t xTicksToWait = ( TickType_t )0xff; + * + * // Create a queue capable of containing 10 characters. + * xQueue = xQueueCreate( 10, sizeof( char ) ); + * if( xQueue == 0 ) + * { + * // Failed to create the queue. + * } + * + * // ... + * + * // Post some characters that will be used within an ISR. If the queue + * // is full then this task will block for xTicksToWait ticks. + * cValueToPost = 'a'; + * xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait ); + * cValueToPost = 'b'; + * xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait ); + * + * // ... keep posting characters ... this task may block when the queue + * // becomes full. + * + * cValueToPost = 'c'; + * xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait ); + * } + * + * // ISR that outputs all the characters received on the queue. + * void vISR_Routine( void ) + * { + * BaseType_t xTaskWokenByReceive = pdFALSE; + * char cRxedChar; + * + * while( xQueueReceiveFromISR( xQueue, ( void * ) &cRxedChar, &xTaskWokenByReceive) ) + * { + * // A character was received. Output the character now. + * vOutputCharacter( cRxedChar ); + * + * // If removing the character from the queue woke the task that was + * // posting onto the queue xTaskWokenByReceive will have been set to + * // pdTRUE. No matter how many times this loop iterates only one + * // task will be woken. + * } + * + * if( xTaskWokenByReceive != ( char ) pdFALSE; + * { + * taskYIELD (); + * } + * } + * @endcode + * \defgroup xQueueReceiveFromISR xQueueReceiveFromISR + * \ingroup QueueManagement + */ +BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, + void * const pvBuffer, + BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/* + * Utilities to query queues that are safe to use from an ISR. These utilities + * should be used only from within an ISR, or within a critical section. + */ +BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +#if ( configUSE_CO_ROUTINES == 1 ) + +/* + * The functions defined above are for passing data to and from tasks. The + * functions below are the equivalents for passing data to and from + * co-routines. + * + * These functions are called from the co-routine macro implementation and + * should not be called directly from application code. Instead use the macro + * wrappers defined within croutine.h. + */ + BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue, + const void * pvItemToQueue, + BaseType_t xCoRoutinePreviouslyWoken ); + BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue, + void * pvBuffer, + BaseType_t * pxTaskWoken ); + BaseType_t xQueueCRSend( QueueHandle_t xQueue, + const void * pvItemToQueue, + TickType_t xTicksToWait ); + BaseType_t xQueueCRReceive( QueueHandle_t xQueue, + void * pvBuffer, + TickType_t xTicksToWait ); + +#endif /* if ( configUSE_CO_ROUTINES == 1 ) */ + +/* + * For internal use only. Use xSemaphoreCreateMutex(), + * xSemaphoreCreateCounting() or xSemaphoreGetMutexHolder() instead of calling + * these functions directly. + */ +QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, + StaticQueue_t * pxStaticQueue ) PRIVILEGED_FUNCTION; +#endif + +#if ( configUSE_COUNTING_SEMAPHORES == 1 ) + QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount ) PRIVILEGED_FUNCTION; +#endif + +#if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount, + StaticQueue_t * pxStaticQueue ) PRIVILEGED_FUNCTION; +#endif + +BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) + TaskHandle_t xQueueGetMutexHolder( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION; + TaskHandle_t xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION; +#endif + +/* + * For internal use only. Use xSemaphoreTakeMutexRecursive() or + * xSemaphoreGiveMutexRecursive() instead of calling these functions directly. + */ +BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) PRIVILEGED_FUNCTION; + +/* + * Reset a queue back to its original empty state. The return value is now + * obsolete and is always set to pdPASS. + */ +#define xQueueReset( xQueue ) xQueueGenericReset( ( xQueue ), pdFALSE ) + +/* + * The registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add + * a queue, semaphore or mutex handle to the registry if you want the handle + * to be available to a kernel aware debugger. If you are not using a kernel + * aware debugger then this function can be ignored. + * + * configQUEUE_REGISTRY_SIZE defines the maximum number of handles the + * registry can hold. configQUEUE_REGISTRY_SIZE must be greater than 0 + * within FreeRTOSConfig.h for the registry to be available. Its value + * does not affect the number of queues, semaphores and mutexes that can be + * created - just the number that the registry can hold. + * + * If vQueueAddToRegistry is called more than once with the same xQueue + * parameter, the registry will store the pcQueueName parameter from the + * most recent call to vQueueAddToRegistry. + * + * @param xQueue The handle of the queue being added to the registry. This + * is the handle returned by a call to xQueueCreate(). Semaphore and mutex + * handles can also be passed in here. + * + * @param pcQueueName The name to be associated with the handle. This is the + * name that the kernel aware debugger will display. The queue registry only + * stores a pointer to the string - so the string must be persistent (global or + * preferably in ROM/Flash), not on the stack. + */ +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + void vQueueAddToRegistry( QueueHandle_t xQueue, + const char * pcQueueName ) PRIVILEGED_FUNCTION; +#endif + +/* + * The registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add + * a queue, semaphore or mutex handle to the registry if you want the handle + * to be available to a kernel aware debugger, and vQueueUnregisterQueue() to + * remove the queue, semaphore or mutex from the register. If you are not using + * a kernel aware debugger then this function can be ignored. + * + * @param xQueue The handle of the queue being removed from the registry. + */ +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + void vQueueUnregisterQueue( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +#endif + +/* + * The queue registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call pcQueueGetName() to look + * up and return the name of a queue in the queue registry from the queue's + * handle. + * + * @param xQueue The handle of the queue the name of which will be returned. + * @return If the queue is in the registry then a pointer to the name of the + * queue is returned. If the queue is not in the registry then NULL is + * returned. + */ +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + const char * pcQueueGetName( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +#endif + +/* + * Generic version of the function used to create a queue using dynamic memory + * allocation. This is called by other functions and macros that create other + * RTOS objects that use the queue structure as their base. + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; +#endif + +/* + * Generic version of the function used to create a queue using dynamic memory + * allocation. This is called by other functions and macros that create other + * RTOS objects that use the queue structure as their base. + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + uint8_t * pucQueueStorage, + StaticQueue_t * pxStaticQueue, + const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; +#endif + +/* + * Generic version of the function used to retrieve the buffers of statically + * created queues. This is called by other functions and macros that retrieve + * the buffers of other statically created RTOS objects that use the queue + * structure as their base. + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + BaseType_t xQueueGenericGetStaticBuffers( QueueHandle_t xQueue, + uint8_t ** ppucQueueStorage, + StaticQueue_t ** ppxStaticQueue ) PRIVILEGED_FUNCTION; +#endif + +/* + * Queue sets provide a mechanism to allow a task to block (pend) on a read + * operation from multiple queues or semaphores simultaneously. + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * A queue set must be explicitly created using a call to xQueueCreateSet() + * before it can be used. Once created, standard FreeRTOS queues and semaphores + * can be added to the set using calls to xQueueAddToSet(). + * xQueueSelectFromSet() is then used to determine which, if any, of the queues + * or semaphores contained in the set is in a state where a queue read or + * semaphore take operation would be successful. + * + * Note 1: See the documentation on https://www.FreeRTOS.org/RTOS-queue-sets.html + * for reasons why queue sets are very rarely needed in practice as there are + * simpler methods of blocking on multiple objects. + * + * Note 2: Blocking on a queue set that contains a mutex will not cause the + * mutex holder to inherit the priority of the blocked task. + * + * Note 3: An additional 4 bytes of RAM is required for each space in a every + * queue added to a queue set. Therefore counting semaphores that have a high + * maximum count value should not be added to a queue set. + * + * Note 4: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param uxEventQueueLength Queue sets store events that occur on + * the queues and semaphores contained in the set. uxEventQueueLength specifies + * the maximum number of events that can be queued at once. To be absolutely + * certain that events are not lost uxEventQueueLength should be set to the + * total sum of the length of the queues added to the set, where binary + * semaphores and mutexes have a length of 1, and counting semaphores have a + * length set by their maximum count value. Examples: + * + If a queue set is to hold a queue of length 5, another queue of length 12, + * and a binary semaphore, then uxEventQueueLength should be set to + * (5 + 12 + 1), or 18. + * + If a queue set is to hold three binary semaphores then uxEventQueueLength + * should be set to (1 + 1 + 1 ), or 3. + * + If a queue set is to hold a counting semaphore that has a maximum count of + * 5, and a counting semaphore that has a maximum count of 3, then + * uxEventQueueLength should be set to (5 + 3), or 8. + * + * @return If the queue set is created successfully then a handle to the created + * queue set is returned. Otherwise NULL is returned. + */ +#if ( ( configUSE_QUEUE_SETS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) PRIVILEGED_FUNCTION; +#endif + +/* + * Adds a queue or semaphore to a queue set that was previously created by a + * call to xQueueCreateSet(). + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * Note 1: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param xQueueOrSemaphore The handle of the queue or semaphore being added to + * the queue set (cast to an QueueSetMemberHandle_t type). + * + * @param xQueueSet The handle of the queue set to which the queue or semaphore + * is being added. + * + * @return If the queue or semaphore was successfully added to the queue set + * then pdPASS is returned. If the queue could not be successfully added to the + * queue set because it is already a member of a different queue set then pdFAIL + * is returned. + */ +#if ( configUSE_QUEUE_SETS == 1 ) + BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; +#endif + +/* + * Removes a queue or semaphore from a queue set. A queue or semaphore can only + * be removed from a set if the queue or semaphore is empty. + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * @param xQueueOrSemaphore The handle of the queue or semaphore being removed + * from the queue set (cast to an QueueSetMemberHandle_t type). + * + * @param xQueueSet The handle of the queue set in which the queue or semaphore + * is included. + * + * @return If the queue or semaphore was successfully removed from the queue set + * then pdPASS is returned. If the queue was not in the queue set, or the + * queue (or semaphore) was not empty, then pdFAIL is returned. + */ +#if ( configUSE_QUEUE_SETS == 1 ) + BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; +#endif + +/* + * xQueueSelectFromSet() selects from the members of a queue set a queue or + * semaphore that either contains data (in the case of a queue) or is available + * to take (in the case of a semaphore). xQueueSelectFromSet() effectively + * allows a task to block (pend) on a read operation on all the queues and + * semaphores in a queue set simultaneously. + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * Note 1: See the documentation on https://www.FreeRTOS.org/RTOS-queue-sets.html + * for reasons why queue sets are very rarely needed in practice as there are + * simpler methods of blocking on multiple objects. + * + * Note 2: Blocking on a queue set that contains a mutex will not cause the + * mutex holder to inherit the priority of the blocked task. + * + * Note 3: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param xQueueSet The queue set on which the task will (potentially) block. + * + * @param xTicksToWait The maximum time, in ticks, that the calling task will + * remain in the Blocked state (with other tasks executing) to wait for a member + * of the queue set to be ready for a successful queue read or semaphore take + * operation. + * + * @return xQueueSelectFromSet() will return the handle of a queue (cast to + * a QueueSetMemberHandle_t type) contained in the queue set that contains data, + * or the handle of a semaphore (cast to a QueueSetMemberHandle_t type) contained + * in the queue set that is available, or NULL if no such queue or semaphore + * exists before before the specified block time expires. + */ +#if ( configUSE_QUEUE_SETS == 1 ) + QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, + const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +#endif + +/* + * A version of xQueueSelectFromSet() that can be used from an ISR. + */ +#if ( configUSE_QUEUE_SETS == 1 ) + QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; +#endif + +/* Not public API functions. */ +void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, + TickType_t xTicksToWait, + const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGenericReset( QueueHandle_t xQueue, + BaseType_t xNewQueue ) PRIVILEGED_FUNCTION; + +#if ( configUSE_TRACE_FACILITY == 1 ) + void vQueueSetQueueNumber( QueueHandle_t xQueue, + UBaseType_t uxQueueNumber ) PRIVILEGED_FUNCTION; +#endif + +#if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +#endif + +#if ( configUSE_TRACE_FACILITY == 1 ) + uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +#endif + +UBaseType_t uxQueueGetQueueItemSize( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +UBaseType_t uxQueueGetQueueLength( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +void vQueueEndScheduler(void); /* << EST */ + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* QUEUE_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/semphr.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/semphr.h new file mode 100644 index 0000000..83ada2c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/semphr.h @@ -0,0 +1,1216 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef SEMAPHORE_H +#define SEMAPHORE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h" must appear in source files before "include semphr.h" +#endif + +#include "queue.h" + +typedef QueueHandle_t SemaphoreHandle_t; + +#define semBINARY_SEMAPHORE_QUEUE_LENGTH ( ( uint8_t ) 1U ) +#define semSEMAPHORE_QUEUE_ITEM_LENGTH ( ( uint8_t ) 0U ) +#define semGIVE_BLOCK_TIME ( ( TickType_t ) 0U ) + + +/** + * semphr. h + * @code{c} + * vSemaphoreCreateBinary( SemaphoreHandle_t xSemaphore ); + * @endcode + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a binary semaphore! + * https://www.FreeRTOS.org/RTOS-task-notifications.html + * + * This old vSemaphoreCreateBinary() macro is now deprecated in favour of the + * xSemaphoreCreateBinary() function. Note that binary semaphores created using + * the vSemaphoreCreateBinary() macro are created in a state such that the + * first call to 'take' the semaphore would pass, whereas binary semaphores + * created using xSemaphoreCreateBinary() are created in a state such that the + * the semaphore must first be 'given' before it can be 'taken'. + * + * Macro that implements a semaphore by using the existing queue mechanism. + * The queue length is 1 as this is a binary semaphore. The data size is 0 + * as we don't want to actually store any data - we just want to know if the + * queue is empty or full. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @param xSemaphore Handle to the created semaphore. Should be of type SemaphoreHandle_t. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore = NULL; + * + * void vATask( void * pvParameters ) + * { + * // Semaphore cannot be used before a call to vSemaphoreCreateBinary (). + * // This is a macro so pass the variable in directly. + * vSemaphoreCreateBinary( xSemaphore ); + * + * if( xSemaphore != NULL ) + * { + * // The semaphore was created successfully. + * // The semaphore can now be used. + * } + * } + * @endcode + * \defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary + * \ingroup Semaphores + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define vSemaphoreCreateBinary( xSemaphore ) \ + do { \ + ( xSemaphore ) = xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ); \ + if( ( xSemaphore ) != NULL ) \ + { \ + ( void ) xSemaphoreGive( ( xSemaphore ) ); \ + } \ + } while( 0 ) +#endif + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateBinary( void ); + * @endcode + * + * Creates a new binary semaphore instance, and returns a handle by which the + * new semaphore can be referenced. + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a binary semaphore! + * https://www.FreeRTOS.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, binary semaphores use a block + * of memory, in which the semaphore structure is stored. If a binary semaphore + * is created using xSemaphoreCreateBinary() then the required memory is + * automatically dynamically allocated inside the xSemaphoreCreateBinary() + * function. (see https://www.FreeRTOS.org/a00111.html). If a binary semaphore + * is created using xSemaphoreCreateBinaryStatic() then the application writer + * must provide the memory. xSemaphoreCreateBinaryStatic() therefore allows a + * binary semaphore to be created without using any dynamic memory allocation. + * + * The old vSemaphoreCreateBinary() macro is now deprecated in favour of this + * xSemaphoreCreateBinary() function. Note that binary semaphores created using + * the vSemaphoreCreateBinary() macro are created in a state such that the + * first call to 'take' the semaphore would pass, whereas binary semaphores + * created using xSemaphoreCreateBinary() are created in a state such that the + * the semaphore must first be 'given' before it can be 'taken'. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @return Handle to the created semaphore, or NULL if the memory required to + * hold the semaphore's data structures could not be allocated. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore = NULL; + * + * void vATask( void * pvParameters ) + * { + * // Semaphore cannot be used before a call to xSemaphoreCreateBinary(). + * // This is a macro so pass the variable in directly. + * xSemaphore = xSemaphoreCreateBinary(); + * + * if( xSemaphore != NULL ) + * { + * // The semaphore was created successfully. + * // The semaphore can now be used. + * } + * } + * @endcode + * \defgroup xSemaphoreCreateBinary xSemaphoreCreateBinary + * \ingroup Semaphores + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateBinary() xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ) +#endif + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer ); + * @endcode + * + * Creates a new binary semaphore instance, and returns a handle by which the + * new semaphore can be referenced. + * + * NOTE: In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a binary semaphore! + * https://www.FreeRTOS.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, binary semaphores use a block + * of memory, in which the semaphore structure is stored. If a binary semaphore + * is created using xSemaphoreCreateBinary() then the required memory is + * automatically dynamically allocated inside the xSemaphoreCreateBinary() + * function. (see https://www.FreeRTOS.org/a00111.html). If a binary semaphore + * is created using xSemaphoreCreateBinaryStatic() then the application writer + * must provide the memory. xSemaphoreCreateBinaryStatic() therefore allows a + * binary semaphore to be created without using any dynamic memory allocation. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the semaphore's data structure, removing the + * need for the memory to be allocated dynamically. + * + * @return If the semaphore is created then a handle to the created semaphore is + * returned. If pxSemaphoreBuffer is NULL then NULL is returned. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore = NULL; + * StaticSemaphore_t xSemaphoreBuffer; + * + * void vATask( void * pvParameters ) + * { + * // Semaphore cannot be used before a call to xSemaphoreCreateBinary(). + * // The semaphore's data structures will be placed in the xSemaphoreBuffer + * // variable, the address of which is passed into the function. The + * // function's parameter is not NULL, so the function will not attempt any + * // dynamic memory allocation, and therefore the function will not return + * // return NULL. + * xSemaphore = xSemaphoreCreateBinary( &xSemaphoreBuffer ); + * + * // Rest of task code goes here. + * } + * @endcode + * \defgroup xSemaphoreCreateBinaryStatic xSemaphoreCreateBinaryStatic + * \ingroup Semaphores + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateBinaryStatic( pxStaticSemaphore ) xQueueGenericCreateStatic( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, ( pxStaticSemaphore ), queueQUEUE_TYPE_BINARY_SEMAPHORE ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * semphr. h + * @code{c} + * xSemaphoreTake( + * SemaphoreHandle_t xSemaphore, + * TickType_t xBlockTime + * ); + * @endcode + * + * Macro to obtain a semaphore. The semaphore must have previously been + * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting(). + * + * @param xSemaphore A handle to the semaphore being taken - obtained when + * the semaphore was created. + * + * @param xBlockTime The time in ticks to wait for the semaphore to become + * available. The macro portTICK_PERIOD_MS can be used to convert this to a + * real time. A block time of zero can be used to poll the semaphore. A block + * time of portMAX_DELAY can be used to block indefinitely (provided + * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h). + * + * @return pdTRUE if the semaphore was obtained. pdFALSE + * if xBlockTime expired without the semaphore becoming available. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore = NULL; + * + * // A task that creates a semaphore. + * void vATask( void * pvParameters ) + * { + * // Create the semaphore to guard a shared resource. + * xSemaphore = xSemaphoreCreateBinary(); + * } + * + * // A task that uses the semaphore. + * void vAnotherTask( void * pvParameters ) + * { + * // ... Do other things. + * + * if( xSemaphore != NULL ) + * { + * // See if we can obtain the semaphore. If the semaphore is not available + * // wait 10 ticks to see if it becomes free. + * if( xSemaphoreTake( xSemaphore, ( TickType_t ) 10 ) == pdTRUE ) + * { + * // We were able to obtain the semaphore and can now access the + * // shared resource. + * + * // ... + * + * // We have finished accessing the shared resource. Release the + * // semaphore. + * xSemaphoreGive( xSemaphore ); + * } + * else + * { + * // We could not obtain the semaphore and can therefore not access + * // the shared resource safely. + * } + * } + * } + * @endcode + * \defgroup xSemaphoreTake xSemaphoreTake + * \ingroup Semaphores + */ +#define xSemaphoreTake( xSemaphore, xBlockTime ) xQueueSemaphoreTake( ( xSemaphore ), ( xBlockTime ) ) + +/** + * semphr. h + * @code{c} + * xSemaphoreTakeRecursive( + * SemaphoreHandle_t xMutex, + * TickType_t xBlockTime + * ); + * @endcode + * + * Macro to recursively obtain, or 'take', a mutex type semaphore. + * The mutex must have previously been created using a call to + * xSemaphoreCreateRecursiveMutex(); + * + * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this + * macro to be available. + * + * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * @param xMutex A handle to the mutex being obtained. This is the + * handle returned by xSemaphoreCreateRecursiveMutex(); + * + * @param xBlockTime The time in ticks to wait for the semaphore to become + * available. The macro portTICK_PERIOD_MS can be used to convert this to a + * real time. A block time of zero can be used to poll the semaphore. If + * the task already owns the semaphore then xSemaphoreTakeRecursive() will + * return immediately no matter what the value of xBlockTime. + * + * @return pdTRUE if the semaphore was obtained. pdFALSE if xBlockTime + * expired without the semaphore becoming available. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xMutex = NULL; + * + * // A task that creates a mutex. + * void vATask( void * pvParameters ) + * { + * // Create the mutex to guard a shared resource. + * xMutex = xSemaphoreCreateRecursiveMutex(); + * } + * + * // A task that uses the mutex. + * void vAnotherTask( void * pvParameters ) + * { + * // ... Do other things. + * + * if( xMutex != NULL ) + * { + * // See if we can obtain the mutex. If the mutex is not available + * // wait 10 ticks to see if it becomes free. + * if( xSemaphoreTakeRecursive( xSemaphore, ( TickType_t ) 10 ) == pdTRUE ) + * { + * // We were able to obtain the mutex and can now access the + * // shared resource. + * + * // ... + * // For some reason due to the nature of the code further calls to + * // xSemaphoreTakeRecursive() are made on the same mutex. In real + * // code these would not be just sequential calls as this would make + * // no sense. Instead the calls are likely to be buried inside + * // a more complex call structure. + * xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ); + * xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ); + * + * // The mutex has now been 'taken' three times, so will not be + * // available to another task until it has also been given back + * // three times. Again it is unlikely that real code would have + * // these calls sequentially, but instead buried in a more complex + * // call structure. This is just for illustrative purposes. + * xSemaphoreGiveRecursive( xMutex ); + * xSemaphoreGiveRecursive( xMutex ); + * xSemaphoreGiveRecursive( xMutex ); + * + * // Now the mutex can be taken by other tasks. + * } + * else + * { + * // We could not obtain the mutex and can therefore not access + * // the shared resource safely. + * } + * } + * } + * @endcode + * \defgroup xSemaphoreTakeRecursive xSemaphoreTakeRecursive + * \ingroup Semaphores + */ +#if ( configUSE_RECURSIVE_MUTEXES == 1 ) + #define xSemaphoreTakeRecursive( xMutex, xBlockTime ) xQueueTakeMutexRecursive( ( xMutex ), ( xBlockTime ) ) +#endif + +/** + * semphr. h + * @code{c} + * xSemaphoreGive( SemaphoreHandle_t xSemaphore ); + * @endcode + * + * Macro to release a semaphore. The semaphore must have previously been + * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting(). and obtained using sSemaphoreTake(). + * + * This macro must not be used from an ISR. See xSemaphoreGiveFromISR () for + * an alternative which can be used from an ISR. + * + * This macro must also not be used on semaphores created using + * xSemaphoreCreateRecursiveMutex(). + * + * @param xSemaphore A handle to the semaphore being released. This is the + * handle returned when the semaphore was created. + * + * @return pdTRUE if the semaphore was released. pdFALSE if an error occurred. + * Semaphores are implemented using queues. An error can occur if there is + * no space on the queue to post a message - indicating that the + * semaphore was not first obtained correctly. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore = NULL; + * + * void vATask( void * pvParameters ) + * { + * // Create the semaphore to guard a shared resource. + * xSemaphore = vSemaphoreCreateBinary(); + * + * if( xSemaphore != NULL ) + * { + * if( xSemaphoreGive( xSemaphore ) != pdTRUE ) + * { + * // We would expect this call to fail because we cannot give + * // a semaphore without first "taking" it! + * } + * + * // Obtain the semaphore - don't block if the semaphore is not + * // immediately available. + * if( xSemaphoreTake( xSemaphore, ( TickType_t ) 0 ) ) + * { + * // We now have the semaphore and can access the shared resource. + * + * // ... + * + * // We have finished accessing the shared resource so can free the + * // semaphore. + * if( xSemaphoreGive( xSemaphore ) != pdTRUE ) + * { + * // We would not expect this call to fail because we must have + * // obtained the semaphore to get here. + * } + * } + * } + * } + * @endcode + * \defgroup xSemaphoreGive xSemaphoreGive + * \ingroup Semaphores + */ +#define xSemaphoreGive( xSemaphore ) xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK ) + +/** + * semphr. h + * @code{c} + * xSemaphoreGiveRecursive( SemaphoreHandle_t xMutex ); + * @endcode + * + * Macro to recursively release, or 'give', a mutex type semaphore. + * The mutex must have previously been created using a call to + * xSemaphoreCreateRecursiveMutex(); + * + * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this + * macro to be available. + * + * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * @param xMutex A handle to the mutex being released, or 'given'. This is the + * handle returned by xSemaphoreCreateMutex(); + * + * @return pdTRUE if the semaphore was given. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xMutex = NULL; + * + * // A task that creates a mutex. + * void vATask( void * pvParameters ) + * { + * // Create the mutex to guard a shared resource. + * xMutex = xSemaphoreCreateRecursiveMutex(); + * } + * + * // A task that uses the mutex. + * void vAnotherTask( void * pvParameters ) + * { + * // ... Do other things. + * + * if( xMutex != NULL ) + * { + * // See if we can obtain the mutex. If the mutex is not available + * // wait 10 ticks to see if it becomes free. + * if( xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ) == pdTRUE ) + * { + * // We were able to obtain the mutex and can now access the + * // shared resource. + * + * // ... + * // For some reason due to the nature of the code further calls to + * // xSemaphoreTakeRecursive() are made on the same mutex. In real + * // code these would not be just sequential calls as this would make + * // no sense. Instead the calls are likely to be buried inside + * // a more complex call structure. + * xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ); + * xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ); + * + * // The mutex has now been 'taken' three times, so will not be + * // available to another task until it has also been given back + * // three times. Again it is unlikely that real code would have + * // these calls sequentially, it would be more likely that the calls + * // to xSemaphoreGiveRecursive() would be called as a call stack + * // unwound. This is just for demonstrative purposes. + * xSemaphoreGiveRecursive( xMutex ); + * xSemaphoreGiveRecursive( xMutex ); + * xSemaphoreGiveRecursive( xMutex ); + * + * // Now the mutex can be taken by other tasks. + * } + * else + * { + * // We could not obtain the mutex and can therefore not access + * // the shared resource safely. + * } + * } + * } + * @endcode + * \defgroup xSemaphoreGiveRecursive xSemaphoreGiveRecursive + * \ingroup Semaphores + */ +#if ( configUSE_RECURSIVE_MUTEXES == 1 ) + #define xSemaphoreGiveRecursive( xMutex ) xQueueGiveMutexRecursive( ( xMutex ) ) +#endif + +/** + * semphr. h + * @code{c} + * xSemaphoreGiveFromISR( + * SemaphoreHandle_t xSemaphore, + * BaseType_t *pxHigherPriorityTaskWoken + * ); + * @endcode + * + * Macro to release a semaphore. The semaphore must have previously been + * created with a call to xSemaphoreCreateBinary() or xSemaphoreCreateCounting(). + * + * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) + * must not be used with this macro. + * + * This macro can be used from an ISR. + * + * @param xSemaphore A handle to the semaphore being released. This is the + * handle returned when the semaphore was created. + * + * @param pxHigherPriorityTaskWoken xSemaphoreGiveFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if giving the semaphore caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xSemaphoreGiveFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the semaphore was successfully given, otherwise errQUEUE_FULL. + * + * Example usage: + * @code{c} + \#define LONG_TIME 0xffff + \#define TICKS_TO_WAIT 10 + * SemaphoreHandle_t xSemaphore = NULL; + * + * // Repetitive task. + * void vATask( void * pvParameters ) + * { + * for( ;; ) + * { + * // We want this task to run every 10 ticks of a timer. The semaphore + * // was created before this task was started. + * + * // Block waiting for the semaphore to become available. + * if( xSemaphoreTake( xSemaphore, LONG_TIME ) == pdTRUE ) + * { + * // It is time to execute. + * + * // ... + * + * // We have finished our task. Return to the top of the loop where + * // we will block on the semaphore until it is time to execute + * // again. Note when using the semaphore for synchronisation with an + * // ISR in this manner there is no need to 'give' the semaphore back. + * } + * } + * } + * + * // Timer ISR + * void vTimerISR( void * pvParameters ) + * { + * static uint8_t ucLocalTickCount = 0; + * static BaseType_t xHigherPriorityTaskWoken; + * + * // A timer tick has occurred. + * + * // ... Do other time functions. + * + * // Is it time for vATask () to run? + * xHigherPriorityTaskWoken = pdFALSE; + * ucLocalTickCount++; + * if( ucLocalTickCount >= TICKS_TO_WAIT ) + * { + * // Unblock the task by releasing the semaphore. + * xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken ); + * + * // Reset the count so we release the semaphore again in 10 ticks time. + * ucLocalTickCount = 0; + * } + * + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // We can force a context switch here. Context switching from an + * // ISR uses port specific syntax. Check the demo task for your port + * // to find the syntax required. + * } + * } + * @endcode + * \defgroup xSemaphoreGiveFromISR xSemaphoreGiveFromISR + * \ingroup Semaphores + */ +#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueGiveFromISR( ( QueueHandle_t ) ( xSemaphore ), ( pxHigherPriorityTaskWoken ) ) + +/** + * semphr. h + * @code{c} + * xSemaphoreTakeFromISR( + * SemaphoreHandle_t xSemaphore, + * BaseType_t *pxHigherPriorityTaskWoken + * ); + * @endcode + * + * Macro to take a semaphore from an ISR. The semaphore must have + * previously been created with a call to xSemaphoreCreateBinary() or + * xSemaphoreCreateCounting(). + * + * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) + * must not be used with this macro. + * + * This macro can be used from an ISR, however taking a semaphore from an ISR + * is not a common operation. It is likely to only be useful when taking a + * counting semaphore when an interrupt is obtaining an object from a resource + * pool (when the semaphore count indicates the number of resources available). + * + * @param xSemaphore A handle to the semaphore being taken. This is the + * handle returned when the semaphore was created. + * + * @param pxHigherPriorityTaskWoken xSemaphoreTakeFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if taking the semaphore caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xSemaphoreTakeFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the semaphore was successfully taken, otherwise + * pdFALSE + */ +#define xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueReceiveFromISR( ( QueueHandle_t ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ) ) + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateMutex( void ); + * @endcode + * + * Creates a new mutex type semaphore instance, and returns a handle by which + * the new mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, mutex semaphores use a block + * of memory, in which the mutex structure is stored. If a mutex is created + * using xSemaphoreCreateMutex() then the required memory is automatically + * dynamically allocated inside the xSemaphoreCreateMutex() function. (see + * https://www.FreeRTOS.org/a00111.html). If a mutex is created using + * xSemaphoreCreateMutexStatic() then the application writer must provided the + * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created + * without using any dynamic memory allocation. + * + * Mutexes created using this function can be accessed using the xSemaphoreTake() + * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and + * xSemaphoreGiveRecursive() macros must not be used. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @return If the mutex was successfully created then a handle to the created + * semaphore is returned. If there was not enough heap to allocate the mutex + * data structures then NULL is returned. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore; + * + * void vATask( void * pvParameters ) + * { + * // Semaphore cannot be used before a call to xSemaphoreCreateMutex(). + * // This is a macro so pass the variable in directly. + * xSemaphore = xSemaphoreCreateMutex(); + * + * if( xSemaphore != NULL ) + * { + * // The semaphore was created successfully. + * // The semaphore can now be used. + * } + * } + * @endcode + * \defgroup xSemaphoreCreateMutex xSemaphoreCreateMutex + * \ingroup Semaphores + */ +#if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_MUTEXES == 1 ) ) + #define xSemaphoreCreateMutex() xQueueCreateMutex( queueQUEUE_TYPE_MUTEX ) +#endif + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateMutexStatic( StaticSemaphore_t *pxMutexBuffer ); + * @endcode + * + * Creates a new mutex type semaphore instance, and returns a handle by which + * the new mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, mutex semaphores use a block + * of memory, in which the mutex structure is stored. If a mutex is created + * using xSemaphoreCreateMutex() then the required memory is automatically + * dynamically allocated inside the xSemaphoreCreateMutex() function. (see + * https://www.FreeRTOS.org/a00111.html). If a mutex is created using + * xSemaphoreCreateMutexStatic() then the application writer must provided the + * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created + * without using any dynamic memory allocation. + * + * Mutexes created using this function can be accessed using the xSemaphoreTake() + * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and + * xSemaphoreGiveRecursive() macros must not be used. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t, + * which will be used to hold the mutex's data structure, removing the need for + * the memory to be allocated dynamically. + * + * @return If the mutex was successfully created then a handle to the created + * mutex is returned. If pxMutexBuffer was NULL then NULL is returned. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore; + * StaticSemaphore_t xMutexBuffer; + * + * void vATask( void * pvParameters ) + * { + * // A mutex cannot be used before it has been created. xMutexBuffer is + * // into xSemaphoreCreateMutexStatic() so no dynamic memory allocation is + * // attempted. + * xSemaphore = xSemaphoreCreateMutexStatic( &xMutexBuffer ); + * + * // As no dynamic memory allocation was performed, xSemaphore cannot be NULL, + * // so there is no need to check it. + * } + * @endcode + * \defgroup xSemaphoreCreateMutexStatic xSemaphoreCreateMutexStatic + * \ingroup Semaphores + */ +#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_MUTEXES == 1 ) ) + #define xSemaphoreCreateMutexStatic( pxMutexBuffer ) xQueueCreateMutexStatic( queueQUEUE_TYPE_MUTEX, ( pxMutexBuffer ) ) +#endif + + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void ); + * @endcode + * + * Creates a new recursive mutex type semaphore instance, and returns a handle + * by which the new recursive mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, recursive mutexes use a block + * of memory, in which the mutex structure is stored. If a recursive mutex is + * created using xSemaphoreCreateRecursiveMutex() then the required memory is + * automatically dynamically allocated inside the + * xSemaphoreCreateRecursiveMutex() function. (see + * https://www.FreeRTOS.org/a00111.html). If a recursive mutex is created using + * xSemaphoreCreateRecursiveMutexStatic() then the application writer must + * provide the memory that will get used by the mutex. + * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to + * be created without using any dynamic memory allocation. + * + * Mutexes created using this macro can be accessed using the + * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The + * xSemaphoreTake() and xSemaphoreGive() macros must not be used. + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @return xSemaphore Handle to the created mutex semaphore. Should be of type + * SemaphoreHandle_t. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore; + * + * void vATask( void * pvParameters ) + * { + * // Semaphore cannot be used before a call to xSemaphoreCreateMutex(). + * // This is a macro so pass the variable in directly. + * xSemaphore = xSemaphoreCreateRecursiveMutex(); + * + * if( xSemaphore != NULL ) + * { + * // The semaphore was created successfully. + * // The semaphore can now be used. + * } + * } + * @endcode + * \defgroup xSemaphoreCreateRecursiveMutex xSemaphoreCreateRecursiveMutex + * \ingroup Semaphores + */ +#if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) + #define xSemaphoreCreateRecursiveMutex() xQueueCreateMutex( queueQUEUE_TYPE_RECURSIVE_MUTEX ) +#endif + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateRecursiveMutexStatic( StaticSemaphore_t *pxMutexBuffer ); + * @endcode + * + * Creates a new recursive mutex type semaphore instance, and returns a handle + * by which the new recursive mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, recursive mutexes use a block + * of memory, in which the mutex structure is stored. If a recursive mutex is + * created using xSemaphoreCreateRecursiveMutex() then the required memory is + * automatically dynamically allocated inside the + * xSemaphoreCreateRecursiveMutex() function. (see + * https://www.FreeRTOS.org/a00111.html). If a recursive mutex is created using + * xSemaphoreCreateRecursiveMutexStatic() then the application writer must + * provide the memory that will get used by the mutex. + * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to + * be created without using any dynamic memory allocation. + * + * Mutexes created using this macro can be accessed using the + * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The + * xSemaphoreTake() and xSemaphoreGive() macros must not be used. + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the recursive mutex's data structure, + * removing the need for the memory to be allocated dynamically. + * + * @return If the recursive mutex was successfully created then a handle to the + * created recursive mutex is returned. If pxMutexBuffer was NULL then NULL is + * returned. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore; + * StaticSemaphore_t xMutexBuffer; + * + * void vATask( void * pvParameters ) + * { + * // A recursive semaphore cannot be used before it is created. Here a + * // recursive mutex is created using xSemaphoreCreateRecursiveMutexStatic(). + * // The address of xMutexBuffer is passed into the function, and will hold + * // the mutexes data structures - so no dynamic memory allocation will be + * // attempted. + * xSemaphore = xSemaphoreCreateRecursiveMutexStatic( &xMutexBuffer ); + * + * // As no dynamic memory allocation was performed, xSemaphore cannot be NULL, + * // so there is no need to check it. + * } + * @endcode + * \defgroup xSemaphoreCreateRecursiveMutexStatic xSemaphoreCreateRecursiveMutexStatic + * \ingroup Semaphores + */ +#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) + #define xSemaphoreCreateRecursiveMutexStatic( pxStaticSemaphore ) xQueueCreateMutexStatic( queueQUEUE_TYPE_RECURSIVE_MUTEX, ( pxStaticSemaphore ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount ); + * @endcode + * + * Creates a new counting semaphore instance, and returns a handle by which the + * new counting semaphore can be referenced. + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a counting semaphore! + * https://www.FreeRTOS.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, counting semaphores use a + * block of memory, in which the counting semaphore structure is stored. If a + * counting semaphore is created using xSemaphoreCreateCounting() then the + * required memory is automatically dynamically allocated inside the + * xSemaphoreCreateCounting() function. (see + * https://www.FreeRTOS.org/a00111.html). If a counting semaphore is created + * using xSemaphoreCreateCountingStatic() then the application writer can + * instead optionally provide the memory that will get used by the counting + * semaphore. xSemaphoreCreateCountingStatic() therefore allows a counting + * semaphore to be created without using any dynamic memory allocation. + * + * Counting semaphores are typically used for two things: + * + * 1) Counting events. + * + * In this usage scenario an event handler will 'give' a semaphore each time + * an event occurs (incrementing the semaphore count value), and a handler + * task will 'take' a semaphore each time it processes an event + * (decrementing the semaphore count value). The count value is therefore + * the difference between the number of events that have occurred and the + * number that have been processed. In this case it is desirable for the + * initial count value to be zero. + * + * 2) Resource management. + * + * In this usage scenario the count value indicates the number of resources + * available. To obtain control of a resource a task must first obtain a + * semaphore - decrementing the semaphore count value. When the count value + * reaches zero there are no free resources. When a task finishes with the + * resource it 'gives' the semaphore back - incrementing the semaphore count + * value. In this case it is desirable for the initial count value to be + * equal to the maximum count value, indicating that all resources are free. + * + * @param uxMaxCount The maximum count value that can be reached. When the + * semaphore reaches this value it can no longer be 'given'. + * + * @param uxInitialCount The count value assigned to the semaphore when it is + * created. + * + * @return Handle to the created semaphore. Null if the semaphore could not be + * created. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore; + * + * void vATask( void * pvParameters ) + * { + * SemaphoreHandle_t xSemaphore = NULL; + * + * // Semaphore cannot be used before a call to xSemaphoreCreateCounting(). + * // The max value to which the semaphore can count should be 10, and the + * // initial value assigned to the count should be 0. + * xSemaphore = xSemaphoreCreateCounting( 10, 0 ); + * + * if( xSemaphore != NULL ) + * { + * // The semaphore was created successfully. + * // The semaphore can now be used. + * } + * } + * @endcode + * \defgroup xSemaphoreCreateCounting xSemaphoreCreateCounting + * \ingroup Semaphores + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) ) +#endif + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateCountingStatic( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount, StaticSemaphore_t *pxSemaphoreBuffer ); + * @endcode + * + * Creates a new counting semaphore instance, and returns a handle by which the + * new counting semaphore can be referenced. + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a counting semaphore! + * https://www.FreeRTOS.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, counting semaphores use a + * block of memory, in which the counting semaphore structure is stored. If a + * counting semaphore is created using xSemaphoreCreateCounting() then the + * required memory is automatically dynamically allocated inside the + * xSemaphoreCreateCounting() function. (see + * https://www.FreeRTOS.org/a00111.html). If a counting semaphore is created + * using xSemaphoreCreateCountingStatic() then the application writer must + * provide the memory. xSemaphoreCreateCountingStatic() therefore allows a + * counting semaphore to be created without using any dynamic memory allocation. + * + * Counting semaphores are typically used for two things: + * + * 1) Counting events. + * + * In this usage scenario an event handler will 'give' a semaphore each time + * an event occurs (incrementing the semaphore count value), and a handler + * task will 'take' a semaphore each time it processes an event + * (decrementing the semaphore count value). The count value is therefore + * the difference between the number of events that have occurred and the + * number that have been processed. In this case it is desirable for the + * initial count value to be zero. + * + * 2) Resource management. + * + * In this usage scenario the count value indicates the number of resources + * available. To obtain control of a resource a task must first obtain a + * semaphore - decrementing the semaphore count value. When the count value + * reaches zero there are no free resources. When a task finishes with the + * resource it 'gives' the semaphore back - incrementing the semaphore count + * value. In this case it is desirable for the initial count value to be + * equal to the maximum count value, indicating that all resources are free. + * + * @param uxMaxCount The maximum count value that can be reached. When the + * semaphore reaches this value it can no longer be 'given'. + * + * @param uxInitialCount The count value assigned to the semaphore when it is + * created. + * + * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the semaphore's data structure, removing the + * need for the memory to be allocated dynamically. + * + * @return If the counting semaphore was successfully created then a handle to + * the created counting semaphore is returned. If pxSemaphoreBuffer was NULL + * then NULL is returned. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore; + * StaticSemaphore_t xSemaphoreBuffer; + * + * void vATask( void * pvParameters ) + * { + * SemaphoreHandle_t xSemaphore = NULL; + * + * // Counting semaphore cannot be used before they have been created. Create + * // a counting semaphore using xSemaphoreCreateCountingStatic(). The max + * // value to which the semaphore can count is 10, and the initial value + * // assigned to the count will be 0. The address of xSemaphoreBuffer is + * // passed in and will be used to hold the semaphore structure, so no dynamic + * // memory allocation will be used. + * xSemaphore = xSemaphoreCreateCounting( 10, 0, &xSemaphoreBuffer ); + * + * // No memory allocation was attempted so xSemaphore cannot be NULL, so there + * // is no need to check its value. + * } + * @endcode + * \defgroup xSemaphoreCreateCountingStatic xSemaphoreCreateCountingStatic + * \ingroup Semaphores + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateCountingStatic( uxMaxCount, uxInitialCount, pxSemaphoreBuffer ) xQueueCreateCountingSemaphoreStatic( ( uxMaxCount ), ( uxInitialCount ), ( pxSemaphoreBuffer ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * semphr. h + * @code{c} + * void vSemaphoreDelete( SemaphoreHandle_t xSemaphore ); + * @endcode + * + * Delete a semaphore. This function must be used with care. For example, + * do not delete a mutex type semaphore if the mutex is held by a task. + * + * @param xSemaphore A handle to the semaphore to be deleted. + * + * \defgroup vSemaphoreDelete vSemaphoreDelete + * \ingroup Semaphores + */ +#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( QueueHandle_t ) ( xSemaphore ) ) + +/** + * semphr.h + * @code{c} + * TaskHandle_t xSemaphoreGetMutexHolder( SemaphoreHandle_t xMutex ); + * @endcode + * + * If xMutex is indeed a mutex type semaphore, return the current mutex holder. + * If xMutex is not a mutex type semaphore, or the mutex is available (not held + * by a task), return NULL. + * + * Note: This is a good way of determining if the calling task is the mutex + * holder, but not a good way of determining the identity of the mutex holder as + * the holder may change between the function exiting and the returned value + * being tested. + */ +#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) + #define xSemaphoreGetMutexHolder( xSemaphore ) xQueueGetMutexHolder( ( xSemaphore ) ) +#endif + +/** + * semphr.h + * @code{c} + * TaskHandle_t xSemaphoreGetMutexHolderFromISR( SemaphoreHandle_t xMutex ); + * @endcode + * + * If xMutex is indeed a mutex type semaphore, return the current mutex holder. + * If xMutex is not a mutex type semaphore, or the mutex is available (not held + * by a task), return NULL. + * + */ +#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) + #define xSemaphoreGetMutexHolderFromISR( xSemaphore ) xQueueGetMutexHolderFromISR( ( xSemaphore ) ) +#endif + +/** + * semphr.h + * @code{c} + * UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore ); + * @endcode + * + * If the semaphore is a counting semaphore then uxSemaphoreGetCount() returns + * its current count value. If the semaphore is a binary semaphore then + * uxSemaphoreGetCount() returns 1 if the semaphore is available, and 0 if the + * semaphore is not available. + * + */ +#define uxSemaphoreGetCount( xSemaphore ) uxQueueMessagesWaiting( ( QueueHandle_t ) ( xSemaphore ) ) + +/** + * semphr.h + * @code{c} + * UBaseType_t uxSemaphoreGetCountFromISR( SemaphoreHandle_t xSemaphore ); + * @endcode + * + * If the semaphore is a counting semaphore then uxSemaphoreGetCountFromISR() returns + * its current count value. If the semaphore is a binary semaphore then + * uxSemaphoreGetCountFromISR() returns 1 if the semaphore is available, and 0 if the + * semaphore is not available. + * + */ +#define uxSemaphoreGetCountFromISR( xSemaphore ) uxQueueMessagesWaitingFromISR( ( QueueHandle_t ) ( xSemaphore ) ) + +/** + * semphr.h + * @code{c} + * BaseType_t xSemaphoreGetStaticBuffer( SemaphoreHandle_t xSemaphore, + * StaticSemaphore_t ** ppxSemaphoreBuffer ); + * @endcode + * + * Retrieve pointer to a statically created binary semaphore, counting semaphore, + * or mutex semaphore's data structure buffer. This is the same buffer that is + * supplied at the time of creation. + * + * @param xSemaphore The semaphore for which to retrieve the buffer. + * + * @param ppxSemaphoreBuffer Used to return a pointer to the semaphore's + * data structure buffer. + * + * @return pdTRUE if buffer was retrieved, pdFALSE otherwise. + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreGetStaticBuffer( xSemaphore, ppxSemaphoreBuffer ) xQueueGenericGetStaticBuffers( ( QueueHandle_t ) ( xSemaphore ), NULL, ( ppxSemaphoreBuffer ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +#endif /* SEMAPHORE_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/stack_macros.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/stack_macros.h new file mode 100644 index 0000000..f05d872 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/stack_macros.h @@ -0,0 +1,142 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef STACK_MACROS_H +#define STACK_MACROS_H + +/* + * Call the stack overflow hook function if the stack of the task being swapped + * out is currently overflowed, or looks like it might have overflowed in the + * past. + * + * Setting configCHECK_FOR_STACK_OVERFLOW to 1 will cause the macro to check + * the current stack state only - comparing the current top of stack value to + * the stack limit. Setting configCHECK_FOR_STACK_OVERFLOW to greater than 1 + * will also cause the last few stack bytes to be checked to ensure the value + * to which the bytes were set when the task was created have not been + * overwritten. Note this second test does not guarantee that an overflowed + * stack will always be recognised. + */ + +/*-----------------------------------------------------------*/ + +/* + * portSTACK_LIMIT_PADDING is a number of extra words to consider to be in + * use on the stack. + */ +#ifndef portSTACK_LIMIT_PADDING + #define portSTACK_LIMIT_PADDING 0 +#endif + +#if ( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH < 0 ) ) + +/* Only the current stack state is to be checked. */ + #define taskCHECK_FOR_STACK_OVERFLOW() \ + do { \ + /* Is the currently saved stack pointer within the stack limit? */ \ + if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack + portSTACK_LIMIT_PADDING ) \ + { \ + char * pcOverflowTaskName = pxCurrentTCB->pcTaskName; \ + configCHECK_FOR_STACK_OVERFLOW_NAME( ( TaskHandle_t ) pxCurrentTCB, pcOverflowTaskName ); /* << EST: use macro name */ \ + } \ + } while( 0 ) + +#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ +/*-----------------------------------------------------------*/ + +#if ( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH > 0 ) ) + +/* Only the current stack state is to be checked. */ + #define taskCHECK_FOR_STACK_OVERFLOW() \ + do { \ + \ + /* Is the currently saved stack pointer within the stack limit? */ \ + if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack - portSTACK_LIMIT_PADDING ) \ + { \ + char * pcOverflowTaskName = pxCurrentTCB->pcTaskName; \ + configCHECK_FOR_STACK_OVERFLOW_NAME( ( TaskHandle_t ) pxCurrentTCB, pcOverflowTaskName ); /* << EST: use macro name */ \ + } \ + } while( 0 ) + +#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ +/*-----------------------------------------------------------*/ + +#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) ) + + #define taskCHECK_FOR_STACK_OVERFLOW() \ + do { \ + const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack; \ + const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5U; \ + \ + if( ( pulStack[ 0 ] != ulCheckValue ) || \ + ( pulStack[ 1 ] != ulCheckValue ) || \ + ( pulStack[ 2 ] != ulCheckValue ) || \ + ( pulStack[ 3 ] != ulCheckValue ) ) \ + { \ + char * pcOverflowTaskName = pxCurrentTCB->pcTaskName; \ + configCHECK_FOR_STACK_OVERFLOW_NAME( ( TaskHandle_t ) pxCurrentTCB, pcOverflowTaskName ); /* << EST: use macro name */ \ + } \ + } while( 0 ) + +#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ +/*-----------------------------------------------------------*/ + +#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) ) + + #define taskCHECK_FOR_STACK_OVERFLOW() \ + do { \ + int8_t * pcEndOfStack = ( int8_t * ) pxCurrentTCB->pxEndOfStack; \ + static const uint8_t ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \ + \ + \ + pcEndOfStack -= sizeof( ucExpectedStackBytes ); \ + \ + /* Has the extremity of the task stack ever been written over? */ \ + if( memcmp( ( void * ) pcEndOfStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \ + { \ + char * pcOverflowTaskName = pxCurrentTCB->pcTaskName; \ + configCHECK_FOR_STACK_OVERFLOW_NAME( ( TaskHandle_t ) pxCurrentTCB, pcOverflowTaskName ); /* << EST: use macro name */ \ + } \ + } while( 0 ) + +#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ +/*-----------------------------------------------------------*/ + +/* Remove stack overflow macro if not being used. */ +#ifndef taskCHECK_FOR_STACK_OVERFLOW + #define taskCHECK_FOR_STACK_OVERFLOW() +#endif + + + +#endif /* STACK_MACROS_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/stream_buffer.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/stream_buffer.h new file mode 100644 index 0000000..0ed062b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/stream_buffer.h @@ -0,0 +1,947 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * Stream buffers are used to send a continuous stream of data from one task or + * interrupt to another. Their implementation is light weight, making them + * particularly suited for interrupt to task and core to core communication + * scenarios. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xStreamBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xStreamBufferReceive()) inside a critical section section and set the + * receive block time to 0. + * + */ + +#ifndef STREAM_BUFFER_H +#define STREAM_BUFFER_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include stream_buffer.h" +#endif + +/* *INDENT-OFF* */ +#if defined( __cplusplus ) + extern "C" { +#endif +/* *INDENT-ON* */ + +/** + * Type by which stream buffers are referenced. For example, a call to + * xStreamBufferCreate() returns an StreamBufferHandle_t variable that can + * then be used as a parameter to xStreamBufferSend(), xStreamBufferReceive(), + * etc. + */ +struct StreamBufferDef_t; +typedef struct StreamBufferDef_t * StreamBufferHandle_t; + +/** + * Type used as a stream buffer's optional callback. + */ +typedef void (* StreamBufferCallbackFunction_t)( StreamBufferHandle_t xStreamBuffer, + BaseType_t xIsInsideISR, + BaseType_t * const pxHigherPriorityTaskWoken ); + +/** + * stream_buffer.h + * + * @code{c} + * StreamBufferHandle_t xStreamBufferCreate( size_t xBufferSizeBytes, size_t xTriggerLevelBytes ); + * @endcode + * + * Creates a new stream buffer using dynamically allocated memory. See + * xStreamBufferCreateStatic() for a version that uses statically allocated + * memory (memory that is allocated at compile time). + * + * configSUPPORT_DYNAMIC_ALLOCATION must be set to 1 or left undefined in + * FreeRTOSConfig.h for xStreamBufferCreate() to be available. + * + * @param xBufferSizeBytes The total number of bytes the stream buffer will be + * able to hold at any one time. + * + * @param xTriggerLevelBytes The number of bytes that must be in the stream + * buffer before a task that is blocked on the stream buffer to wait for data is + * moved out of the blocked state. For example, if a task is blocked on a read + * of an empty stream buffer that has a trigger level of 1 then the task will be + * unblocked when a single byte is written to the buffer or the task's block + * time expires. As another example, if a task is blocked on a read of an empty + * stream buffer that has a trigger level of 10 then the task will not be + * unblocked until the stream buffer contains at least 10 bytes or the task's + * block time expires. If a reading task's block time expires before the + * trigger level is reached then the task will still receive however many bytes + * are actually available. Setting a trigger level of 0 will result in a + * trigger level of 1 being used. It is not valid to specify a trigger level + * that is greater than the buffer size. + * + * @param pxSendCompletedCallback Callback invoked when number of bytes at least equal to + * trigger level is sent to the stream buffer. If the parameter is NULL, it will use the default + * implementation provided by sbSEND_COMPLETED macro. To enable the callback, + * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h. + * + * @param pxReceiveCompletedCallback Callback invoked when more than zero bytes are read from a + * stream buffer. If the parameter is NULL, it will use the default + * implementation provided by sbRECEIVE_COMPLETED macro. To enable the callback, + * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h. + * + * @return If NULL is returned, then the stream buffer cannot be created + * because there is insufficient heap memory available for FreeRTOS to allocate + * the stream buffer data structures and storage area. A non-NULL value being + * returned indicates that the stream buffer has been created successfully - + * the returned value should be stored as the handle to the created stream + * buffer. + * + * Example use: + * @code{c} + * + * void vAFunction( void ) + * { + * StreamBufferHandle_t xStreamBuffer; + * const size_t xStreamBufferSizeBytes = 100, xTriggerLevel = 10; + * + * // Create a stream buffer that can hold 100 bytes. The memory used to hold + * // both the stream buffer structure and the data in the stream buffer is + * // allocated dynamically. + * xStreamBuffer = xStreamBufferCreate( xStreamBufferSizeBytes, xTriggerLevel ); + * + * if( xStreamBuffer == NULL ) + * { + * // There was not enough heap memory space available to create the + * // stream buffer. + * } + * else + * { + * // The stream buffer was created successfully and can now be used. + * } + * } + * @endcode + * \defgroup xStreamBufferCreate xStreamBufferCreate + * \ingroup StreamBufferManagement + */ + +#define xStreamBufferCreate( xBufferSizeBytes, xTriggerLevelBytes ) \ + xStreamBufferGenericCreate( ( xBufferSizeBytes ), ( xTriggerLevelBytes ), pdFALSE, NULL, NULL ) + +#if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + #define xStreamBufferCreateWithCallback( xBufferSizeBytes, xTriggerLevelBytes, pxSendCompletedCallback, pxReceiveCompletedCallback ) \ + xStreamBufferGenericCreate( ( xBufferSizeBytes ), ( xTriggerLevelBytes ), pdFALSE, ( pxSendCompletedCallback ), ( pxReceiveCompletedCallback ) ) +#endif + +/** + * stream_buffer.h + * + * @code{c} + * StreamBufferHandle_t xStreamBufferCreateStatic( size_t xBufferSizeBytes, + * size_t xTriggerLevelBytes, + * uint8_t *pucStreamBufferStorageArea, + * StaticStreamBuffer_t *pxStaticStreamBuffer ); + * @endcode + * Creates a new stream buffer using statically allocated memory. See + * xStreamBufferCreate() for a version that uses dynamically allocated memory. + * + * configSUPPORT_STATIC_ALLOCATION must be set to 1 in FreeRTOSConfig.h for + * xStreamBufferCreateStatic() to be available. + * + * @param xBufferSizeBytes The size, in bytes, of the buffer pointed to by the + * pucStreamBufferStorageArea parameter. + * + * @param xTriggerLevelBytes The number of bytes that must be in the stream + * buffer before a task that is blocked on the stream buffer to wait for data is + * moved out of the blocked state. For example, if a task is blocked on a read + * of an empty stream buffer that has a trigger level of 1 then the task will be + * unblocked when a single byte is written to the buffer or the task's block + * time expires. As another example, if a task is blocked on a read of an empty + * stream buffer that has a trigger level of 10 then the task will not be + * unblocked until the stream buffer contains at least 10 bytes or the task's + * block time expires. If a reading task's block time expires before the + * trigger level is reached then the task will still receive however many bytes + * are actually available. Setting a trigger level of 0 will result in a + * trigger level of 1 being used. It is not valid to specify a trigger level + * that is greater than the buffer size. + * + * @param pucStreamBufferStorageArea Must point to a uint8_t array that is at + * least xBufferSizeBytes big. This is the array to which streams are + * copied when they are written to the stream buffer. + * + * @param pxStaticStreamBuffer Must point to a variable of type + * StaticStreamBuffer_t, which will be used to hold the stream buffer's data + * structure. + * + * @param pxSendCompletedCallback Callback invoked when number of bytes at least equal to + * trigger level is sent to the stream buffer. If the parameter is NULL, it will use the default + * implementation provided by sbSEND_COMPLETED macro. To enable the callback, + * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h. + * + * @param pxReceiveCompletedCallback Callback invoked when more than zero bytes are read from a + * stream buffer. If the parameter is NULL, it will use the default + * implementation provided by sbRECEIVE_COMPLETED macro. To enable the callback, + * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h. + * + * @return If the stream buffer is created successfully then a handle to the + * created stream buffer is returned. If either pucStreamBufferStorageArea or + * pxStaticstreamBuffer are NULL then NULL is returned. + * + * Example use: + * @code{c} + * + * // Used to dimension the array used to hold the streams. The available space + * // will actually be one less than this, so 999. + #define STORAGE_SIZE_BYTES 1000 + * + * // Defines the memory that will actually hold the streams within the stream + * // buffer. + * static uint8_t ucStorageBuffer[ STORAGE_SIZE_BYTES ]; + * + * // The variable used to hold the stream buffer structure. + * StaticStreamBuffer_t xStreamBufferStruct; + * + * void MyFunction( void ) + * { + * StreamBufferHandle_t xStreamBuffer; + * const size_t xTriggerLevel = 1; + * + * xStreamBuffer = xStreamBufferCreateStatic( sizeof( ucStorageBuffer ), + * xTriggerLevel, + * ucStorageBuffer, + * &xStreamBufferStruct ); + * + * // As neither the pucStreamBufferStorageArea or pxStaticStreamBuffer + * // parameters were NULL, xStreamBuffer will not be NULL, and can be used to + * // reference the created stream buffer in other stream buffer API calls. + * + * // Other code that uses the stream buffer can go here. + * } + * + * @endcode + * \defgroup xStreamBufferCreateStatic xStreamBufferCreateStatic + * \ingroup StreamBufferManagement + */ + +#define xStreamBufferCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, pucStreamBufferStorageArea, pxStaticStreamBuffer ) \ + xStreamBufferGenericCreateStatic( ( xBufferSizeBytes ), ( xTriggerLevelBytes ), pdFALSE, ( pucStreamBufferStorageArea ), ( pxStaticStreamBuffer ), NULL, NULL ) + +#if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + #define xStreamBufferCreateStaticWithCallback( xBufferSizeBytes, xTriggerLevelBytes, pucStreamBufferStorageArea, pxStaticStreamBuffer, pxSendCompletedCallback, pxReceiveCompletedCallback ) \ + xStreamBufferGenericCreateStatic( ( xBufferSizeBytes ), ( xTriggerLevelBytes ), pdFALSE, ( pucStreamBufferStorageArea ), ( pxStaticStreamBuffer ), ( pxSendCompletedCallback ), ( pxReceiveCompletedCallback ) ) +#endif + +/** + * stream_buffer.h + * + * @code{c} + * BaseType_t xStreamBufferGetStaticBuffers( StreamBufferHandle_t xStreamBuffer, + * uint8_t ** ppucStreamBufferStorageArea, + * StaticStreamBuffer_t ** ppxStaticStreamBuffer ); + * @endcode + * + * Retrieve pointers to a statically created stream buffer's data structure + * buffer and storage area buffer. These are the same buffers that are supplied + * at the time of creation. + * + * @param xStreamBuffer The stream buffer for which to retrieve the buffers. + * + * @param ppucStreamBufferStorageArea Used to return a pointer to the stream + * buffer's storage area buffer. + * + * @param ppxStaticStreamBuffer Used to return a pointer to the stream + * buffer's data structure buffer. + * + * @return pdTRUE if buffers were retrieved, pdFALSE otherwise. + * + * \defgroup xStreamBufferGetStaticBuffers xStreamBufferGetStaticBuffers + * \ingroup StreamBufferManagement + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + BaseType_t xStreamBufferGetStaticBuffers( StreamBufferHandle_t xStreamBuffer, + uint8_t ** ppucStreamBufferStorageArea, + StaticStreamBuffer_t ** ppxStaticStreamBuffer ) PRIVILEGED_FUNCTION; +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * stream_buffer.h + * + * @code{c} + * size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, + * const void *pvTxData, + * size_t xDataLengthBytes, + * TickType_t xTicksToWait ); + * @endcode + * + * Sends bytes to a stream buffer. The bytes are copied into the stream buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xStreamBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xStreamBufferReceive()) inside a critical section and set the receive + * block time to 0. + * + * Use xStreamBufferSend() to write to a stream buffer from a task. Use + * xStreamBufferSendFromISR() to write to a stream buffer from an interrupt + * service routine (ISR). + * + * @param xStreamBuffer The handle of the stream buffer to which a stream is + * being sent. + * + * @param pvTxData A pointer to the buffer that holds the bytes to be copied + * into the stream buffer. + * + * @param xDataLengthBytes The maximum number of bytes to copy from pvTxData + * into the stream buffer. + * + * @param xTicksToWait The maximum amount of time the task should remain in the + * Blocked state to wait for enough space to become available in the stream + * buffer, should the stream buffer contain too little space to hold the + * another xDataLengthBytes bytes. The block time is specified in tick periods, + * so the absolute time it represents is dependent on the tick frequency. The + * macro pdMS_TO_TICKS() can be used to convert a time specified in milliseconds + * into a time specified in ticks. Setting xTicksToWait to portMAX_DELAY will + * cause the task to wait indefinitely (without timing out), provided + * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h. If a task times out + * before it can write all xDataLengthBytes into the buffer it will still write + * as many bytes as possible. A task does not use any CPU time when it is in + * the blocked state. + * + * @return The number of bytes written to the stream buffer. If a task times + * out before it can write all xDataLengthBytes into the buffer it will still + * write as many bytes as possible. + * + * Example use: + * @code{c} + * void vAFunction( StreamBufferHandle_t xStreamBuffer ) + * { + * size_t xBytesSent; + * uint8_t ucArrayToSend[] = { 0, 1, 2, 3 }; + * char *pcStringToSend = "String to send"; + * const TickType_t x100ms = pdMS_TO_TICKS( 100 ); + * + * // Send an array to the stream buffer, blocking for a maximum of 100ms to + * // wait for enough space to be available in the stream buffer. + * xBytesSent = xStreamBufferSend( xStreamBuffer, ( void * ) ucArrayToSend, sizeof( ucArrayToSend ), x100ms ); + * + * if( xBytesSent != sizeof( ucArrayToSend ) ) + * { + * // The call to xStreamBufferSend() times out before there was enough + * // space in the buffer for the data to be written, but it did + * // successfully write xBytesSent bytes. + * } + * + * // Send the string to the stream buffer. Return immediately if there is not + * // enough space in the buffer. + * xBytesSent = xStreamBufferSend( xStreamBuffer, ( void * ) pcStringToSend, strlen( pcStringToSend ), 0 ); + * + * if( xBytesSent != strlen( pcStringToSend ) ) + * { + * // The entire string could not be added to the stream buffer because + * // there was not enough free space in the buffer, but xBytesSent bytes + * // were sent. Could try again to send the remaining bytes. + * } + * } + * @endcode + * \defgroup xStreamBufferSend xStreamBufferSend + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer, + * const void *pvTxData, + * size_t xDataLengthBytes, + * BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * Interrupt safe version of the API function that sends a stream of bytes to + * the stream buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xStreamBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xStreamBufferReceive()) inside a critical section and set the receive + * block time to 0. + * + * Use xStreamBufferSend() to write to a stream buffer from a task. Use + * xStreamBufferSendFromISR() to write to a stream buffer from an interrupt + * service routine (ISR). + * + * @param xStreamBuffer The handle of the stream buffer to which a stream is + * being sent. + * + * @param pvTxData A pointer to the data that is to be copied into the stream + * buffer. + * + * @param xDataLengthBytes The maximum number of bytes to copy from pvTxData + * into the stream buffer. + * + * @param pxHigherPriorityTaskWoken It is possible that a stream buffer will + * have a task blocked on it waiting for data. Calling + * xStreamBufferSendFromISR() can make data available, and so cause a task that + * was waiting for data to leave the Blocked state. If calling + * xStreamBufferSendFromISR() causes a task to leave the Blocked state, and the + * unblocked task has a priority higher than the currently executing task (the + * task that was interrupted), then, internally, xStreamBufferSendFromISR() + * will set *pxHigherPriorityTaskWoken to pdTRUE. If + * xStreamBufferSendFromISR() sets this value to pdTRUE, then normally a + * context switch should be performed before the interrupt is exited. This will + * ensure that the interrupt returns directly to the highest priority Ready + * state task. *pxHigherPriorityTaskWoken should be set to pdFALSE before it + * is passed into the function. See the example code below for an example. + * + * @return The number of bytes actually written to the stream buffer, which will + * be less than xDataLengthBytes if the stream buffer didn't have enough free + * space for all the bytes to be written. + * + * Example use: + * @code{c} + * // A stream buffer that has already been created. + * StreamBufferHandle_t xStreamBuffer; + * + * void vAnInterruptServiceRoutine( void ) + * { + * size_t xBytesSent; + * char *pcStringToSend = "String to send"; + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE. + * + * // Attempt to send the string to the stream buffer. + * xBytesSent = xStreamBufferSendFromISR( xStreamBuffer, + * ( void * ) pcStringToSend, + * strlen( pcStringToSend ), + * &xHigherPriorityTaskWoken ); + * + * if( xBytesSent != strlen( pcStringToSend ) ) + * { + * // There was not enough free space in the stream buffer for the entire + * // string to be written, ut xBytesSent bytes were written. + * } + * + * // If xHigherPriorityTaskWoken was set to pdTRUE inside + * // xStreamBufferSendFromISR() then a task that has a priority above the + * // priority of the currently executing task was unblocked and a context + * // switch should be performed to ensure the ISR returns to the unblocked + * // task. In most FreeRTOS ports this is done by simply passing + * // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the + * // variables value, and perform the context switch if necessary. Check the + * // documentation for the port in use for port specific instructions. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * } + * @endcode + * \defgroup xStreamBufferSendFromISR xStreamBufferSendFromISR + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, + * void *pvRxData, + * size_t xBufferLengthBytes, + * TickType_t xTicksToWait ); + * @endcode + * + * Receives bytes from a stream buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xStreamBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xStreamBufferReceive()) inside a critical section and set the receive + * block time to 0. + * + * Use xStreamBufferReceive() to read from a stream buffer from a task. Use + * xStreamBufferReceiveFromISR() to read from a stream buffer from an + * interrupt service routine (ISR). + * + * @param xStreamBuffer The handle of the stream buffer from which bytes are to + * be received. + * + * @param pvRxData A pointer to the buffer into which the received bytes will be + * copied. + * + * @param xBufferLengthBytes The length of the buffer pointed to by the + * pvRxData parameter. This sets the maximum number of bytes to receive in one + * call. xStreamBufferReceive will return as many bytes as possible up to a + * maximum set by xBufferLengthBytes. + * + * @param xTicksToWait The maximum amount of time the task should remain in the + * Blocked state to wait for data to become available if the stream buffer is + * empty. xStreamBufferReceive() will return immediately if xTicksToWait is + * zero. The block time is specified in tick periods, so the absolute time it + * represents is dependent on the tick frequency. The macro pdMS_TO_TICKS() can + * be used to convert a time specified in milliseconds into a time specified in + * ticks. Setting xTicksToWait to portMAX_DELAY will cause the task to wait + * indefinitely (without timing out), provided INCLUDE_vTaskSuspend is set to 1 + * in FreeRTOSConfig.h. A task does not use any CPU time when it is in the + * Blocked state. + * + * @return The number of bytes actually read from the stream buffer, which will + * be less than xBufferLengthBytes if the call to xStreamBufferReceive() timed + * out before xBufferLengthBytes were available. + * + * Example use: + * @code{c} + * void vAFunction( StreamBuffer_t xStreamBuffer ) + * { + * uint8_t ucRxData[ 20 ]; + * size_t xReceivedBytes; + * const TickType_t xBlockTime = pdMS_TO_TICKS( 20 ); + * + * // Receive up to another sizeof( ucRxData ) bytes from the stream buffer. + * // Wait in the Blocked state (so not using any CPU processing time) for a + * // maximum of 100ms for the full sizeof( ucRxData ) number of bytes to be + * // available. + * xReceivedBytes = xStreamBufferReceive( xStreamBuffer, + * ( void * ) ucRxData, + * sizeof( ucRxData ), + * xBlockTime ); + * + * if( xReceivedBytes > 0 ) + * { + * // A ucRxData contains another xReceivedBytes bytes of data, which can + * // be processed here.... + * } + * } + * @endcode + * \defgroup xStreamBufferReceive xStreamBufferReceive + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer, + * void *pvRxData, + * size_t xBufferLengthBytes, + * BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * An interrupt safe version of the API function that receives bytes from a + * stream buffer. + * + * Use xStreamBufferReceive() to read bytes from a stream buffer from a task. + * Use xStreamBufferReceiveFromISR() to read bytes from a stream buffer from an + * interrupt service routine (ISR). + * + * @param xStreamBuffer The handle of the stream buffer from which a stream + * is being received. + * + * @param pvRxData A pointer to the buffer into which the received bytes are + * copied. + * + * @param xBufferLengthBytes The length of the buffer pointed to by the + * pvRxData parameter. This sets the maximum number of bytes to receive in one + * call. xStreamBufferReceive will return as many bytes as possible up to a + * maximum set by xBufferLengthBytes. + * + * @param pxHigherPriorityTaskWoken It is possible that a stream buffer will + * have a task blocked on it waiting for space to become available. Calling + * xStreamBufferReceiveFromISR() can make space available, and so cause a task + * that is waiting for space to leave the Blocked state. If calling + * xStreamBufferReceiveFromISR() causes a task to leave the Blocked state, and + * the unblocked task has a priority higher than the currently executing task + * (the task that was interrupted), then, internally, + * xStreamBufferReceiveFromISR() will set *pxHigherPriorityTaskWoken to pdTRUE. + * If xStreamBufferReceiveFromISR() sets this value to pdTRUE, then normally a + * context switch should be performed before the interrupt is exited. That will + * ensure the interrupt returns directly to the highest priority Ready state + * task. *pxHigherPriorityTaskWoken should be set to pdFALSE before it is + * passed into the function. See the code example below for an example. + * + * @return The number of bytes read from the stream buffer, if any. + * + * Example use: + * @code{c} + * // A stream buffer that has already been created. + * StreamBuffer_t xStreamBuffer; + * + * void vAnInterruptServiceRoutine( void ) + * { + * uint8_t ucRxData[ 20 ]; + * size_t xReceivedBytes; + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE. + * + * // Receive the next stream from the stream buffer. + * xReceivedBytes = xStreamBufferReceiveFromISR( xStreamBuffer, + * ( void * ) ucRxData, + * sizeof( ucRxData ), + * &xHigherPriorityTaskWoken ); + * + * if( xReceivedBytes > 0 ) + * { + * // ucRxData contains xReceivedBytes read from the stream buffer. + * // Process the stream here.... + * } + * + * // If xHigherPriorityTaskWoken was set to pdTRUE inside + * // xStreamBufferReceiveFromISR() then a task that has a priority above the + * // priority of the currently executing task was unblocked and a context + * // switch should be performed to ensure the ISR returns to the unblocked + * // task. In most FreeRTOS ports this is done by simply passing + * // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the + * // variables value, and perform the context switch if necessary. Check the + * // documentation for the port in use for port specific instructions. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * } + * @endcode + * \defgroup xStreamBufferReceiveFromISR xStreamBufferReceiveFromISR + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ); + * @endcode + * + * Deletes a stream buffer that was previously created using a call to + * xStreamBufferCreate() or xStreamBufferCreateStatic(). If the stream + * buffer was created using dynamic memory (that is, by xStreamBufferCreate()), + * then the allocated memory is freed. + * + * A stream buffer handle must not be used after the stream buffer has been + * deleted. + * + * @param xStreamBuffer The handle of the stream buffer to be deleted. + * + * \defgroup vStreamBufferDelete vStreamBufferDelete + * \ingroup StreamBufferManagement + */ +void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ); + * @endcode + * + * Queries a stream buffer to see if it is full. A stream buffer is full if it + * does not have any free space, and therefore cannot accept any more data. + * + * @param xStreamBuffer The handle of the stream buffer being queried. + * + * @return If the stream buffer is full then pdTRUE is returned. Otherwise + * pdFALSE is returned. + * + * \defgroup xStreamBufferIsFull xStreamBufferIsFull + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ); + * @endcode + * + * Queries a stream buffer to see if it is empty. A stream buffer is empty if + * it does not contain any data. + * + * @param xStreamBuffer The handle of the stream buffer being queried. + * + * @return If the stream buffer is empty then pdTRUE is returned. Otherwise + * pdFALSE is returned. + * + * \defgroup xStreamBufferIsEmpty xStreamBufferIsEmpty + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ); + * @endcode + * + * Resets a stream buffer to its initial, empty, state. Any data that was in + * the stream buffer is discarded. A stream buffer can only be reset if there + * are no tasks blocked waiting to either send to or receive from the stream + * buffer. + * + * @param xStreamBuffer The handle of the stream buffer being reset. + * + * @return If the stream buffer is reset then pdPASS is returned. If there was + * a task blocked waiting to send to or read from the stream buffer then the + * stream buffer is not reset and pdFAIL is returned. + * + * \defgroup xStreamBufferReset xStreamBufferReset + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ); + * @endcode + * + * Queries a stream buffer to see how much free space it contains, which is + * equal to the amount of data that can be sent to the stream buffer before it + * is full. + * + * @param xStreamBuffer The handle of the stream buffer being queried. + * + * @return The number of bytes that can be written to the stream buffer before + * the stream buffer would be full. + * + * \defgroup xStreamBufferSpacesAvailable xStreamBufferSpacesAvailable + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ); + * @endcode + * + * Queries a stream buffer to see how much data it contains, which is equal to + * the number of bytes that can be read from the stream buffer before the stream + * buffer would be empty. + * + * @param xStreamBuffer The handle of the stream buffer being queried. + * + * @return The number of bytes that can be read from the stream buffer before + * the stream buffer would be empty. + * + * \defgroup xStreamBufferBytesAvailable xStreamBufferBytesAvailable + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel ); + * @endcode + * + * A stream buffer's trigger level is the number of bytes that must be in the + * stream buffer before a task that is blocked on the stream buffer to + * wait for data is moved out of the blocked state. For example, if a task is + * blocked on a read of an empty stream buffer that has a trigger level of 1 + * then the task will be unblocked when a single byte is written to the buffer + * or the task's block time expires. As another example, if a task is blocked + * on a read of an empty stream buffer that has a trigger level of 10 then the + * task will not be unblocked until the stream buffer contains at least 10 bytes + * or the task's block time expires. If a reading task's block time expires + * before the trigger level is reached then the task will still receive however + * many bytes are actually available. Setting a trigger level of 0 will result + * in a trigger level of 1 being used. It is not valid to specify a trigger + * level that is greater than the buffer size. + * + * A trigger level is set when the stream buffer is created, and can be modified + * using xStreamBufferSetTriggerLevel(). + * + * @param xStreamBuffer The handle of the stream buffer being updated. + * + * @param xTriggerLevel The new trigger level for the stream buffer. + * + * @return If xTriggerLevel was less than or equal to the stream buffer's length + * then the trigger level will be updated and pdTRUE is returned. Otherwise + * pdFALSE is returned. + * + * \defgroup xStreamBufferSetTriggerLevel xStreamBufferSetTriggerLevel + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, + size_t xTriggerLevel ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * For advanced users only. + * + * The sbSEND_COMPLETED() macro is called from within the FreeRTOS APIs when + * data is sent to a message buffer or stream buffer. If there was a task that + * was blocked on the message or stream buffer waiting for data to arrive then + * the sbSEND_COMPLETED() macro sends a notification to the task to remove it + * from the Blocked state. xStreamBufferSendCompletedFromISR() does the same + * thing. It is provided to enable application writers to implement their own + * version of sbSEND_COMPLETED(), and MUST NOT BE USED AT ANY OTHER TIME. + * + * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for + * additional information. + * + * @param xStreamBuffer The handle of the stream buffer to which data was + * written. + * + * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be + * initialised to pdFALSE before it is passed into + * xStreamBufferSendCompletedFromISR(). If calling + * xStreamBufferSendCompletedFromISR() removes a task from the Blocked state, + * and the task has a priority above the priority of the currently running task, + * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a + * context switch should be performed before exiting the ISR. + * + * @return If a task was removed from the Blocked state then pdTRUE is returned. + * Otherwise pdFALSE is returned. + * + * \defgroup xStreamBufferSendCompletedFromISR xStreamBufferSendCompletedFromISR + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * For advanced users only. + * + * The sbRECEIVE_COMPLETED() macro is called from within the FreeRTOS APIs when + * data is read out of a message buffer or stream buffer. If there was a task + * that was blocked on the message or stream buffer waiting for data to arrive + * then the sbRECEIVE_COMPLETED() macro sends a notification to the task to + * remove it from the Blocked state. xStreamBufferReceiveCompletedFromISR() + * does the same thing. It is provided to enable application writers to + * implement their own version of sbRECEIVE_COMPLETED(), and MUST NOT BE USED AT + * ANY OTHER TIME. + * + * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for + * additional information. + * + * @param xStreamBuffer The handle of the stream buffer from which data was + * read. + * + * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be + * initialised to pdFALSE before it is passed into + * xStreamBufferReceiveCompletedFromISR(). If calling + * xStreamBufferReceiveCompletedFromISR() removes a task from the Blocked state, + * and the task has a priority above the priority of the currently running task, + * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a + * context switch should be performed before exiting the ISR. + * + * @return If a task was removed from the Blocked state then pdTRUE is returned. + * Otherwise pdFALSE is returned. + * + * \defgroup xStreamBufferReceiveCompletedFromISR xStreamBufferReceiveCompletedFromISR + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/* Functions below here are not part of the public API. */ +StreamBufferHandle_t xStreamBufferGenericCreate( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer, + StreamBufferCallbackFunction_t pxSendCompletedCallback, + StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) PRIVILEGED_FUNCTION; + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + StreamBufferHandle_t xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer, + uint8_t * const pucStreamBufferStorageArea, + StaticStreamBuffer_t * const pxStaticStreamBuffer, + StreamBufferCallbackFunction_t pxSendCompletedCallback, + StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) PRIVILEGED_FUNCTION; +#endif + +size_t xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +#if ( configUSE_TRACE_FACILITY == 1 ) + void vStreamBufferSetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer, + UBaseType_t uxStreamBufferNumber ) PRIVILEGED_FUNCTION; + UBaseType_t uxStreamBufferGetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + uint8_t ucStreamBufferGetStreamBufferType( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; +#endif + +/* *INDENT-OFF* */ +#if defined( __cplusplus ) + } +#endif +/* *INDENT-ON* */ + +#endif /* !defined( STREAM_BUFFER_H ) */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/task.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/task.h new file mode 100644 index 0000000..8649d29 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/task.h @@ -0,0 +1,3801 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef INC_TASK_H +#define INC_TASK_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include task.h" +#endif + +#include "list.h" + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/*----------------------------------------------------------- +* MACROS AND DEFINITIONS +*----------------------------------------------------------*/ + +/* + * If tskKERNEL_VERSION_NUMBER ends with + it represents the version in development + * after the numbered release. + * + * The tskKERNEL_VERSION_MAJOR, tskKERNEL_VERSION_MINOR, tskKERNEL_VERSION_BUILD + * values will reflect the last released version number. + */ +#define tskKERNEL_VERSION_NUMBER "V11.0.0" +#define tskKERNEL_VERSION_MAJOR 11 +#define tskKERNEL_VERSION_MINOR 0 +#define tskKERNEL_VERSION_BUILD 0 + +/* MPU region parameters passed in ulParameters + * of MemoryRegion_t struct. */ +#define tskMPU_REGION_READ_ONLY ( 1UL << 0UL ) +#define tskMPU_REGION_READ_WRITE ( 1UL << 1UL ) +#define tskMPU_REGION_EXECUTE_NEVER ( 1UL << 2UL ) +#define tskMPU_REGION_NORMAL_MEMORY ( 1UL << 3UL ) +#define tskMPU_REGION_DEVICE_MEMORY ( 1UL << 4UL ) + +/* MPU region permissions stored in MPU settings to + * authorize access requests. */ +#define tskMPU_READ_PERMISSION ( 1UL << 0UL ) +#define tskMPU_WRITE_PERMISSION ( 1UL << 1UL ) + +/* The direct to task notification feature used to have only a single notification + * per task. Now there is an array of notifications per task that is dimensioned by + * configTASK_NOTIFICATION_ARRAY_ENTRIES. For backward compatibility, any use of the + * original direct to task notification defaults to using the first index in the + * array. */ +#define tskDEFAULT_INDEX_TO_NOTIFY ( 0 ) + +/** + * task. h + * + * Type by which tasks are referenced. For example, a call to xTaskCreate + * returns (via a pointer parameter) an TaskHandle_t variable that can then + * be used as a parameter to vTaskDelete to delete the task. + * + * \defgroup TaskHandle_t TaskHandle_t + * \ingroup Tasks + */ +struct tskTaskControlBlock; /* The old naming convention is used to prevent breaking kernel aware debuggers. */ +typedef struct tskTaskControlBlock * TaskHandle_t; +typedef const struct tskTaskControlBlock * ConstTaskHandle_t; + +/* + * Defines the prototype to which the application task hook function must + * conform. + */ +typedef BaseType_t (* TaskHookFunction_t)( void * arg ); + +/* Task states returned by eTaskGetState. */ +typedef enum +{ + eRunning = 0, /* A task is querying the state of itself, so must be running. */ + eReady, /* The task being queried is in a ready or pending ready list. */ + eBlocked, /* The task being queried is in the Blocked state. */ + eSuspended, /* The task being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */ + eDeleted, /* The task being queried has been deleted, but its TCB has not yet been freed. */ + eInvalid /* Used as an 'invalid state' value. */ +} eTaskState; + +/* Actions that can be performed when vTaskNotify() is called. */ +typedef enum +{ + eNoAction = 0, /* Notify the task without updating its notify value. */ + eSetBits, /* Set bits in the task's notification value. */ + eIncrement, /* Increment the task's notification value. */ + eSetValueWithOverwrite, /* Set the task's notification value to a specific value even if the previous value has not yet been read by the task. */ + eSetValueWithoutOverwrite /* Set the task's notification value if the previous value has been read by the task. */ +} eNotifyAction; + +/* + * Used internally only. + */ +typedef struct xTIME_OUT +{ + BaseType_t xOverflowCount; + TickType_t xTimeOnEntering; +} TimeOut_t; + +/* + * Defines the memory ranges allocated to the task when an MPU is used. + */ +typedef struct xMEMORY_REGION +{ + void * pvBaseAddress; + uint32_t ulLengthInBytes; + uint32_t ulParameters; +} MemoryRegion_t; + +/* + * Parameters required to create an MPU protected task. + */ +typedef struct xTASK_PARAMETERS +{ + TaskFunction_t pvTaskCode; + const char * pcName; + configSTACK_DEPTH_TYPE usStackDepth; + void * pvParameters; + UBaseType_t uxPriority; + StackType_t * puxStackBuffer; + MemoryRegion_t xRegions[ portNUM_CONFIGURABLE_REGIONS ]; + #if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + StaticTask_t * const pxTaskBuffer; + #endif +} TaskParameters_t; + +/* Used with the uxTaskGetSystemState() function to return the state of each task + * in the system. */ +typedef struct xTASK_STATUS +{ + TaskHandle_t xHandle; /* The handle of the task to which the rest of the information in the structure relates. */ + const char * pcTaskName; /* A pointer to the task's name. This value will be invalid if the task was deleted since the structure was populated! */ + UBaseType_t xTaskNumber; /* A number unique to the task. */ + eTaskState eCurrentState; /* The state in which the task existed when the structure was populated. */ + UBaseType_t uxCurrentPriority; /* The priority at which the task was running (may be inherited) when the structure was populated. */ + UBaseType_t uxBasePriority; /* The priority to which the task will return if the task's current priority has been inherited to avoid unbounded priority inversion when obtaining a mutex. Only valid if configUSE_MUTEXES is defined as 1 in FreeRTOSConfig.h. */ + configRUN_TIME_COUNTER_TYPE ulRunTimeCounter; /* The total run time allocated to the task so far, as defined by the run time stats clock. See https://www.FreeRTOS.org/rtos-run-time-stats.html. Only valid when configGENERATE_RUN_TIME_STATS is defined as 1 in FreeRTOSConfig.h. */ + StackType_t * pxStackBase; /* Points to the lowest address of the task's stack area. */ + #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) ) + StackType_t * pxTopOfStack; /* Points to the top address of the task's stack area. */ + StackType_t * pxEndOfStack; /* Points to the end address of the task's stack area. */ + #endif + configSTACK_DEPTH_TYPE usStackHighWaterMark; /* The minimum amount of stack space that has remained for the task since the task was created. The closer this value is to zero the closer the task has come to overflowing its stack. */ + #if ( ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 ) ) + UBaseType_t uxCoreAffinityMask; /* The core affinity mask for the task */ + #endif +} TaskStatus_t; + +/* Possible return values for eTaskConfirmSleepModeStatus(). */ +typedef enum +{ + eAbortSleep = 0, /* A task has been made ready or a context switch pended since portSUPPRESS_TICKS_AND_SLEEP() was called - abort entering a sleep mode. */ + eStandardSleep, /* Enter a sleep mode that will not last any longer than the expected idle time. */ + #if ( INCLUDE_vTaskSuspend == 1 ) + eNoTasksWaitingTimeout /* No tasks are waiting for a timeout so it is safe to enter a sleep mode that can only be exited by an external interrupt. */ + #endif /* INCLUDE_vTaskSuspend */ +} eSleepModeStatus; + +/** + * Defines the priority used by the idle task. This must not be modified. + * + * \ingroup TaskUtils + */ +#define tskIDLE_PRIORITY ( ( UBaseType_t ) 0U ) + +/** + * Defines affinity to all available cores. + * + * \ingroup TaskUtils + */ +#define tskNO_AFFINITY ( ( UBaseType_t ) -1 ) + +/** + * task. h + * + * Macro for forcing a context switch. + * + * \defgroup taskYIELD taskYIELD + * \ingroup SchedulerControl + */ +#define taskYIELD() portYIELD() + +/** + * task. h + * + * Macro to mark the start of a critical code region. Preemptive context + * switches cannot occur when in a critical region. + * + * NOTE: This may alter the stack (depending on the portable implementation) + * so must be used with care! + * + * \defgroup taskENTER_CRITICAL taskENTER_CRITICAL + * \ingroup SchedulerControl + */ +#define taskENTER_CRITICAL() portENTER_CRITICAL() +#if ( configNUMBER_OF_CORES == 1 ) + #define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR() +#else + #define taskENTER_CRITICAL_FROM_ISR() portENTER_CRITICAL_FROM_ISR() +#endif + +/** + * task. h + * + * Macro to mark the end of a critical code region. Preemptive context + * switches cannot occur when in a critical region. + * + * NOTE: This may alter the stack (depending on the portable implementation) + * so must be used with care! + * + * \defgroup taskEXIT_CRITICAL taskEXIT_CRITICAL + * \ingroup SchedulerControl + */ +#define taskEXIT_CRITICAL() portEXIT_CRITICAL() +#if ( configNUMBER_OF_CORES == 1 ) + #define taskEXIT_CRITICAL_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) +#else + #define taskEXIT_CRITICAL_FROM_ISR( x ) portEXIT_CRITICAL_FROM_ISR( x ) +#endif + +/** + * task. h + * + * Macro to disable all maskable interrupts. + * + * \defgroup taskDISABLE_INTERRUPTS taskDISABLE_INTERRUPTS + * \ingroup SchedulerControl + */ +#define taskDISABLE_INTERRUPTS() portDISABLE_INTERRUPTS() + +/** + * task. h + * + * Macro to enable microcontroller interrupts. + * + * \defgroup taskENABLE_INTERRUPTS taskENABLE_INTERRUPTS + * \ingroup SchedulerControl + */ +#define taskENABLE_INTERRUPTS() portENABLE_INTERRUPTS() + +/* Definitions returned by xTaskGetSchedulerState(). taskSCHEDULER_SUSPENDED is + * 0 to generate more optimal code when configASSERT() is defined as the constant + * is used in assert() statements. */ +#define taskSCHEDULER_SUSPENDED ( ( BaseType_t ) 0 ) +#define taskSCHEDULER_NOT_STARTED ( ( BaseType_t ) 1 ) +#define taskSCHEDULER_RUNNING ( ( BaseType_t ) 2 ) + +/* Checks if core ID is valid. */ +#define taskVALID_CORE_ID( xCoreID ) ( ( ( ( ( BaseType_t ) 0 <= ( xCoreID ) ) && ( ( xCoreID ) < ( BaseType_t ) configNUMBER_OF_CORES ) ) ) ? ( pdTRUE ) : ( pdFALSE ) ) + +/*----------------------------------------------------------- +* TASK CREATION API +*----------------------------------------------------------*/ + +/** + * task. h + * @code{c} + * BaseType_t xTaskCreate( + * TaskFunction_t pxTaskCode, + * const char *pcName, + * configSTACK_DEPTH_TYPE usStackDepth, + * void *pvParameters, + * UBaseType_t uxPriority, + * TaskHandle_t *pxCreatedTask + * ); + * @endcode + * + * Create a new task and add it to the list of tasks that are ready to run. + * + * Internally, within the FreeRTOS implementation, tasks use two blocks of + * memory. The first block is used to hold the task's data structures. The + * second block is used by the task as its stack. If a task is created using + * xTaskCreate() then both blocks of memory are automatically dynamically + * allocated inside the xTaskCreate() function. (see + * https://www.FreeRTOS.org/a00111.html). If a task is created using + * xTaskCreateStatic() then the application writer must provide the required + * memory. xTaskCreateStatic() therefore allows a task to be created without + * using any dynamic memory allocation. + * + * See xTaskCreateStatic() for a version that does not use any dynamic memory + * allocation. + * + * xTaskCreate() can only be used to create a task that has unrestricted + * access to the entire microcontroller memory map. Systems that include MPU + * support can alternatively create an MPU constrained task using + * xTaskCreateRestricted(). + * + * @param pxTaskCode Pointer to the task entry function. Tasks + * must be implemented to never return (i.e. continuous loop). + * + * @param pcName A descriptive name for the task. This is mainly used to + * facilitate debugging. Max length defined by configMAX_TASK_NAME_LEN - default + * is 16. + * + * @param usStackDepth The size of the task stack specified as the number of + * variables the stack can hold - not the number of bytes. For example, if + * the stack is 16 bits wide and usStackDepth is defined as 100, 200 bytes + * will be allocated for stack storage. + * + * @param pvParameters Pointer that will be used as the parameter for the task + * being created. + * + * @param uxPriority The priority at which the task should run. Systems that + * include MPU support can optionally create tasks in a privileged (system) + * mode by setting bit portPRIVILEGE_BIT of the priority parameter. For + * example, to create a privileged task at priority 2 the uxPriority parameter + * should be set to ( 2 | portPRIVILEGE_BIT ). + * + * @param pxCreatedTask Used to pass back a handle by which the created task + * can be referenced. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file projdefs.h + * + * Example usage: + * @code{c} + * // Task to be created. + * void vTaskCode( void * pvParameters ) + * { + * for( ;; ) + * { + * // Task code goes here. + * } + * } + * + * // Function that creates a task. + * void vOtherFunction( void ) + * { + * static uint8_t ucParameterToPass; + * TaskHandle_t xHandle = NULL; + * + * // Create the task, storing the handle. Note that the passed parameter ucParameterToPass + * // must exist for the lifetime of the task, so in this case is declared static. If it was just an + * // an automatic stack variable it might no longer exist, or at least have been corrupted, by the time + * // the new task attempts to access it. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle ); + * configASSERT( xHandle ); + * + * // Use the handle to delete the task. + * if( xHandle != NULL ) + * { + * vTaskDelete( xHandle ); + * } + * } + * @endcode + * \defgroup xTaskCreate xTaskCreate + * \ingroup Tasks + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, + const char * const pcName, + const configSTACK_DEPTH_TYPE usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif + +#if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + BaseType_t xTaskCreateAffinitySet( TaskFunction_t pxTaskCode, + const char * const pcName, + const configSTACK_DEPTH_TYPE usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + UBaseType_t uxCoreAffinityMask, + TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + * @code{c} + * TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, + * const char *pcName, + * uint32_t ulStackDepth, + * void *pvParameters, + * UBaseType_t uxPriority, + * StackType_t *puxStackBuffer, + * StaticTask_t *pxTaskBuffer ); + * @endcode + * + * Create a new task and add it to the list of tasks that are ready to run. + * + * Internally, within the FreeRTOS implementation, tasks use two blocks of + * memory. The first block is used to hold the task's data structures. The + * second block is used by the task as its stack. If a task is created using + * xTaskCreate() then both blocks of memory are automatically dynamically + * allocated inside the xTaskCreate() function. (see + * https://www.FreeRTOS.org/a00111.html). If a task is created using + * xTaskCreateStatic() then the application writer must provide the required + * memory. xTaskCreateStatic() therefore allows a task to be created without + * using any dynamic memory allocation. + * + * @param pxTaskCode Pointer to the task entry function. Tasks + * must be implemented to never return (i.e. continuous loop). + * + * @param pcName A descriptive name for the task. This is mainly used to + * facilitate debugging. The maximum length of the string is defined by + * configMAX_TASK_NAME_LEN in FreeRTOSConfig.h. + * + * @param ulStackDepth The size of the task stack specified as the number of + * variables the stack can hold - not the number of bytes. For example, if + * the stack is 32-bits wide and ulStackDepth is defined as 100 then 400 bytes + * will be allocated for stack storage. + * + * @param pvParameters Pointer that will be used as the parameter for the task + * being created. + * + * @param uxPriority The priority at which the task will run. + * + * @param puxStackBuffer Must point to a StackType_t array that has at least + * ulStackDepth indexes - the array will then be used as the task's stack, + * removing the need for the stack to be allocated dynamically. + * + * @param pxTaskBuffer Must point to a variable of type StaticTask_t, which will + * then be used to hold the task's data structures, removing the need for the + * memory to be allocated dynamically. + * + * @return If neither puxStackBuffer nor pxTaskBuffer are NULL, then the task + * will be created and a handle to the created task is returned. If either + * puxStackBuffer or pxTaskBuffer are NULL then the task will not be created and + * NULL is returned. + * + * Example usage: + * @code{c} + * + * // Dimensions of the buffer that the task being created will use as its stack. + * // NOTE: This is the number of words the stack will hold, not the number of + * // bytes. For example, if each stack item is 32-bits, and this is set to 100, + * // then 400 bytes (100 * 32-bits) will be allocated. + #define STACK_SIZE 200 + * + * // Structure that will hold the TCB of the task being created. + * StaticTask_t xTaskBuffer; + * + * // Buffer that the task being created will use as its stack. Note this is + * // an array of StackType_t variables. The size of StackType_t is dependent on + * // the RTOS port. + * StackType_t xStack[ STACK_SIZE ]; + * + * // Function that implements the task being created. + * void vTaskCode( void * pvParameters ) + * { + * // The parameter value is expected to be 1 as 1 is passed in the + * // pvParameters value in the call to xTaskCreateStatic(). + * configASSERT( ( uint32_t ) pvParameters == 1UL ); + * + * for( ;; ) + * { + * // Task code goes here. + * } + * } + * + * // Function that creates a task. + * void vOtherFunction( void ) + * { + * TaskHandle_t xHandle = NULL; + * + * // Create the task without using any dynamic memory allocation. + * xHandle = xTaskCreateStatic( + * vTaskCode, // Function that implements the task. + * "NAME", // Text name for the task. + * STACK_SIZE, // Stack size in words, not bytes. + * ( void * ) 1, // Parameter passed into the task. + * tskIDLE_PRIORITY,// Priority at which the task is created. + * xStack, // Array to use as the task's stack. + * &xTaskBuffer ); // Variable to hold the task's data structure. + * + * // puxStackBuffer and pxTaskBuffer were not NULL, so the task will have + * // been created, and xHandle will be the task's handle. Use the handle + * // to suspend the task. + * vTaskSuspend( xHandle ); + * } + * @endcode + * \defgroup xTaskCreateStatic xTaskCreateStatic + * \ingroup Tasks + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer ) PRIVILEGED_FUNCTION; +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + TaskHandle_t xTaskCreateStaticAffinitySet( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer, + UBaseType_t uxCoreAffinityMask ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + * @code{c} + * BaseType_t xTaskCreateRestricted( TaskParameters_t *pxTaskDefinition, TaskHandle_t *pxCreatedTask ); + * @endcode + * + * Only available when configSUPPORT_DYNAMIC_ALLOCATION is set to 1. + * + * xTaskCreateRestricted() should only be used in systems that include an MPU + * implementation. + * + * Create a new task and add it to the list of tasks that are ready to run. + * The function parameters define the memory regions and associated access + * permissions allocated to the task. + * + * See xTaskCreateRestrictedStatic() for a version that does not use any + * dynamic memory allocation. + * + * @param pxTaskDefinition Pointer to a structure that contains a member + * for each of the normal xTaskCreate() parameters (see the xTaskCreate() API + * documentation) plus an optional stack buffer and the memory region + * definitions. + * + * @param pxCreatedTask Used to pass back a handle by which the created task + * can be referenced. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file projdefs.h + * + * Example usage: + * @code{c} + * // Create an TaskParameters_t structure that defines the task to be created. + * static const TaskParameters_t xCheckTaskParameters = + * { + * vATask, // pvTaskCode - the function that implements the task. + * "ATask", // pcName - just a text name for the task to assist debugging. + * 100, // usStackDepth - the stack size DEFINED IN WORDS. + * NULL, // pvParameters - passed into the task function as the function parameters. + * ( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state. + * cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack. + * + * // xRegions - Allocate up to three separate memory regions for access by + * // the task, with appropriate access permissions. Different processors have + * // different memory alignment requirements - refer to the FreeRTOS documentation + * // for full information. + * { + * // Base address Length Parameters + * { cReadWriteArray, 32, portMPU_REGION_READ_WRITE }, + * { cReadOnlyArray, 32, portMPU_REGION_READ_ONLY }, + * { cPrivilegedOnlyAccessArray, 128, portMPU_REGION_PRIVILEGED_READ_WRITE } + * } + * }; + * + * int main( void ) + * { + * TaskHandle_t xHandle; + * + * // Create a task from the const structure defined above. The task handle + * // is requested (the second parameter is not NULL) but in this case just for + * // demonstration purposes as its not actually used. + * xTaskCreateRestricted( &xRegTest1Parameters, &xHandle ); + * + * // Start the scheduler. + * vTaskStartScheduler(); + * + * // Will only get here if there was insufficient memory to create the idle + * // and/or timer task. + * for( ;; ); + * } + * @endcode + * \defgroup xTaskCreateRestricted xTaskCreateRestricted + * \ingroup Tasks + */ +#if ( portUSING_MPU_WRAPPERS == 1 ) + BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, + TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif + +#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + BaseType_t xTaskCreateRestrictedAffinitySet( const TaskParameters_t * const pxTaskDefinition, + UBaseType_t uxCoreAffinityMask, + TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + * @code{c} + * BaseType_t xTaskCreateRestrictedStatic( TaskParameters_t *pxTaskDefinition, TaskHandle_t *pxCreatedTask ); + * @endcode + * + * Only available when configSUPPORT_STATIC_ALLOCATION is set to 1. + * + * xTaskCreateRestrictedStatic() should only be used in systems that include an + * MPU implementation. + * + * Internally, within the FreeRTOS implementation, tasks use two blocks of + * memory. The first block is used to hold the task's data structures. The + * second block is used by the task as its stack. If a task is created using + * xTaskCreateRestricted() then the stack is provided by the application writer, + * and the memory used to hold the task's data structure is automatically + * dynamically allocated inside the xTaskCreateRestricted() function. If a task + * is created using xTaskCreateRestrictedStatic() then the application writer + * must provide the memory used to hold the task's data structures too. + * xTaskCreateRestrictedStatic() therefore allows a memory protected task to be + * created without using any dynamic memory allocation. + * + * @param pxTaskDefinition Pointer to a structure that contains a member + * for each of the normal xTaskCreate() parameters (see the xTaskCreate() API + * documentation) plus an optional stack buffer and the memory region + * definitions. If configSUPPORT_STATIC_ALLOCATION is set to 1 the structure + * contains an additional member, which is used to point to a variable of type + * StaticTask_t - which is then used to hold the task's data structure. + * + * @param pxCreatedTask Used to pass back a handle by which the created task + * can be referenced. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file projdefs.h + * + * Example usage: + * @code{c} + * // Create an TaskParameters_t structure that defines the task to be created. + * // The StaticTask_t variable is only included in the structure when + * // configSUPPORT_STATIC_ALLOCATION is set to 1. The PRIVILEGED_DATA macro can + * // be used to force the variable into the RTOS kernel's privileged data area. + * static PRIVILEGED_DATA StaticTask_t xTaskBuffer; + * static const TaskParameters_t xCheckTaskParameters = + * { + * vATask, // pvTaskCode - the function that implements the task. + * "ATask", // pcName - just a text name for the task to assist debugging. + * 100, // usStackDepth - the stack size DEFINED IN WORDS. + * NULL, // pvParameters - passed into the task function as the function parameters. + * ( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state. + * cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack. + * + * // xRegions - Allocate up to three separate memory regions for access by + * // the task, with appropriate access permissions. Different processors have + * // different memory alignment requirements - refer to the FreeRTOS documentation + * // for full information. + * { + * // Base address Length Parameters + * { cReadWriteArray, 32, portMPU_REGION_READ_WRITE }, + * { cReadOnlyArray, 32, portMPU_REGION_READ_ONLY }, + * { cPrivilegedOnlyAccessArray, 128, portMPU_REGION_PRIVILEGED_READ_WRITE } + * } + * + * &xTaskBuffer; // Holds the task's data structure. + * }; + * + * int main( void ) + * { + * TaskHandle_t xHandle; + * + * // Create a task from the const structure defined above. The task handle + * // is requested (the second parameter is not NULL) but in this case just for + * // demonstration purposes as its not actually used. + * xTaskCreateRestrictedStatic( &xRegTest1Parameters, &xHandle ); + * + * // Start the scheduler. + * vTaskStartScheduler(); + * + * // Will only get here if there was insufficient memory to create the idle + * // and/or timer task. + * for( ;; ); + * } + * @endcode + * \defgroup xTaskCreateRestrictedStatic xTaskCreateRestrictedStatic + * \ingroup Tasks + */ +#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + BaseType_t xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition, + TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif + +#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + BaseType_t xTaskCreateRestrictedStaticAffinitySet( const TaskParameters_t * const pxTaskDefinition, + UBaseType_t uxCoreAffinityMask, + TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + * @code{c} + * void vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions ); + * @endcode + * + * Memory regions are assigned to a restricted task when the task is created by + * a call to xTaskCreateRestricted(). These regions can be redefined using + * vTaskAllocateMPURegions(). + * + * @param xTaskToModify The handle of the task being updated. + * + * @param[in] pxRegions A pointer to a MemoryRegion_t structure that contains the + * new memory region definitions. + * + * Example usage: + * @code{c} + * // Define an array of MemoryRegion_t structures that configures an MPU region + * // allowing read/write access for 1024 bytes starting at the beginning of the + * // ucOneKByte array. The other two of the maximum 3 definable regions are + * // unused so set to zero. + * static const MemoryRegion_t xAltRegions[ portNUM_CONFIGURABLE_REGIONS ] = + * { + * // Base address Length Parameters + * { ucOneKByte, 1024, portMPU_REGION_READ_WRITE }, + * { 0, 0, 0 }, + * { 0, 0, 0 } + * }; + * + * void vATask( void *pvParameters ) + * { + * // This task was created such that it has access to certain regions of + * // memory as defined by the MPU configuration. At some point it is + * // desired that these MPU regions are replaced with that defined in the + * // xAltRegions const struct above. Use a call to vTaskAllocateMPURegions() + * // for this purpose. NULL is used as the task handle to indicate that this + * // function should modify the MPU regions of the calling task. + * vTaskAllocateMPURegions( NULL, xAltRegions ); + * + * // Now the task can continue its function, but from this point on can only + * // access its stack and the ucOneKByte array (unless any other statically + * // defined or shared regions have been declared elsewhere). + * } + * @endcode + * \defgroup vTaskAllocateMPURegions vTaskAllocateMPURegions + * \ingroup Tasks + */ +#if ( portUSING_MPU_WRAPPERS == 1 ) + void vTaskAllocateMPURegions( TaskHandle_t xTaskToModify, + const MemoryRegion_t * const pxRegions ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + * @code{c} + * void vTaskDelete( TaskHandle_t xTaskToDelete ); + * @endcode + * + * INCLUDE_vTaskDelete must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Remove a task from the RTOS real time kernel's management. The task being + * deleted will be removed from all ready, blocked, suspended and event lists. + * + * NOTE: The idle task is responsible for freeing the kernel allocated + * memory from tasks that have been deleted. It is therefore important that + * the idle task is not starved of microcontroller processing time if your + * application makes any calls to vTaskDelete (). Memory allocated by the + * task code is not automatically freed, and should be freed before the task + * is deleted. + * + * See the demo application file death.c for sample code that utilises + * vTaskDelete (). + * + * @param xTaskToDelete The handle of the task to be deleted. Passing NULL will + * cause the calling task to be deleted. + * + * Example usage: + * @code{c} + * void vOtherFunction( void ) + * { + * TaskHandle_t xHandle; + * + * // Create the task, storing the handle. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + * + * // Use the handle to delete the task. + * vTaskDelete( xHandle ); + * } + * @endcode + * \defgroup vTaskDelete vTaskDelete + * \ingroup Tasks + */ +void vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- +* TASK CONTROL API +*----------------------------------------------------------*/ + +/** + * task. h + * @code{c} + * void vTaskDelay( const TickType_t xTicksToDelay ); + * @endcode + * + * Delay a task for a given number of ticks. The actual time that the + * task remains blocked depends on the tick rate. The constant + * portTICK_PERIOD_MS can be used to calculate real time from the tick + * rate - with the resolution of one tick period. + * + * INCLUDE_vTaskDelay must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * + * vTaskDelay() specifies a time at which the task wishes to unblock relative to + * the time at which vTaskDelay() is called. For example, specifying a block + * period of 100 ticks will cause the task to unblock 100 ticks after + * vTaskDelay() is called. vTaskDelay() does not therefore provide a good method + * of controlling the frequency of a periodic task as the path taken through the + * code, as well as other task and interrupt activity, will affect the frequency + * at which vTaskDelay() gets called and therefore the time at which the task + * next executes. See xTaskDelayUntil() for an alternative API function designed + * to facilitate fixed frequency execution. It does this by specifying an + * absolute time (rather than a relative time) at which the calling task should + * unblock. + * + * @param xTicksToDelay The amount of time, in tick periods, that + * the calling task should block. + * + * Example usage: + * + * void vTaskFunction( void * pvParameters ) + * { + * // Block for 500ms. + * const TickType_t xDelay = 500 / portTICK_PERIOD_MS; + * + * for( ;; ) + * { + * // Simply toggle the LED every 500ms, blocking between each toggle. + * vToggleLED(); + * vTaskDelay( xDelay ); + * } + * } + * + * \defgroup vTaskDelay vTaskDelay + * \ingroup TaskCtrl + */ +void vTaskDelay( const TickType_t xTicksToDelay ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * BaseType_t xTaskDelayUntil( TickType_t *pxPreviousWakeTime, const TickType_t xTimeIncrement ); + * @endcode + * + * INCLUDE_xTaskDelayUntil must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Delay a task until a specified time. This function can be used by periodic + * tasks to ensure a constant execution frequency. + * + * This function differs from vTaskDelay () in one important aspect: vTaskDelay () will + * cause a task to block for the specified number of ticks from the time vTaskDelay () is + * called. It is therefore difficult to use vTaskDelay () by itself to generate a fixed + * execution frequency as the time between a task starting to execute and that task + * calling vTaskDelay () may not be fixed [the task may take a different path though the + * code between calls, or may get interrupted or preempted a different number of times + * each time it executes]. + * + * Whereas vTaskDelay () specifies a wake time relative to the time at which the function + * is called, xTaskDelayUntil () specifies the absolute (exact) time at which it wishes to + * unblock. + * + * The macro pdMS_TO_TICKS() can be used to calculate the number of ticks from a + * time specified in milliseconds with a resolution of one tick period. + * + * @param pxPreviousWakeTime Pointer to a variable that holds the time at which the + * task was last unblocked. The variable must be initialised with the current time + * prior to its first use (see the example below). Following this the variable is + * automatically updated within xTaskDelayUntil (). + * + * @param xTimeIncrement The cycle time period. The task will be unblocked at + * time *pxPreviousWakeTime + xTimeIncrement. Calling xTaskDelayUntil with the + * same xTimeIncrement parameter value will cause the task to execute with + * a fixed interface period. + * + * @return Value which can be used to check whether the task was actually delayed. + * Will be pdTRUE if the task way delayed and pdFALSE otherwise. A task will not + * be delayed if the next expected wake time is in the past. + * + * Example usage: + * @code{c} + * // Perform an action every 10 ticks. + * void vTaskFunction( void * pvParameters ) + * { + * TickType_t xLastWakeTime; + * const TickType_t xFrequency = 10; + * BaseType_t xWasDelayed; + * + * // Initialise the xLastWakeTime variable with the current time. + * xLastWakeTime = xTaskGetTickCount (); + * for( ;; ) + * { + * // Wait for the next cycle. + * xWasDelayed = xTaskDelayUntil( &xLastWakeTime, xFrequency ); + * + * // Perform action here. xWasDelayed value can be used to determine + * // whether a deadline was missed if the code here took too long. + * } + * } + * @endcode + * \defgroup xTaskDelayUntil xTaskDelayUntil + * \ingroup TaskCtrl + */ +BaseType_t xTaskDelayUntil( TickType_t * const pxPreviousWakeTime, + const TickType_t xTimeIncrement ) PRIVILEGED_FUNCTION; + +/* + * vTaskDelayUntil() is the older version of xTaskDelayUntil() and does not + * return a value. + */ +#define vTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement ) \ + do { \ + ( void ) xTaskDelayUntil( ( pxPreviousWakeTime ), ( xTimeIncrement ) ); \ + } while( 0 ) + + +/** + * task. h + * @code{c} + * BaseType_t xTaskAbortDelay( TaskHandle_t xTask ); + * @endcode + * + * INCLUDE_xTaskAbortDelay must be defined as 1 in FreeRTOSConfig.h for this + * function to be available. + * + * A task will enter the Blocked state when it is waiting for an event. The + * event it is waiting for can be a temporal event (waiting for a time), such + * as when vTaskDelay() is called, or an event on an object, such as when + * xQueueReceive() or ulTaskNotifyTake() is called. If the handle of a task + * that is in the Blocked state is used in a call to xTaskAbortDelay() then the + * task will leave the Blocked state, and return from whichever function call + * placed the task into the Blocked state. + * + * There is no 'FromISR' version of this function as an interrupt would need to + * know which object a task was blocked on in order to know which actions to + * take. For example, if the task was blocked on a queue the interrupt handler + * would then need to know if the queue was locked. + * + * @param xTask The handle of the task to remove from the Blocked state. + * + * @return If the task referenced by xTask was not in the Blocked state then + * pdFAIL is returned. Otherwise pdPASS is returned. + * + * \defgroup xTaskAbortDelay xTaskAbortDelay + * \ingroup TaskCtrl + */ +#if ( INCLUDE_xTaskAbortDelay == 1 ) + BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + * @code{c} + * UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ); + * @endcode + * + * INCLUDE_uxTaskPriorityGet must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Obtain the priority of any task. + * + * @param xTask Handle of the task to be queried. Passing a NULL + * handle results in the priority of the calling task being returned. + * + * @return The priority of xTask. + * + * Example usage: + * @code{c} + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; + * + * // Create a task, storing the handle. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + * + * // ... + * + * // Use the handle to obtain the priority of the created task. + * // It was created with tskIDLE_PRIORITY, but may have changed + * // it itself. + * if( uxTaskPriorityGet( xHandle ) != tskIDLE_PRIORITY ) + * { + * // The task has changed it's priority. + * } + * + * // ... + * + * // Is our priority higher than the created task? + * if( uxTaskPriorityGet( xHandle ) < uxTaskPriorityGet( NULL ) ) + * { + * // Our priority (obtained using NULL handle) is higher. + * } + * } + * @endcode + * \defgroup uxTaskPriorityGet uxTaskPriorityGet + * \ingroup TaskCtrl + */ +UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask ); + * @endcode + * + * A version of uxTaskPriorityGet() that can be used from an ISR. + */ +UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * UBaseType_t uxTaskBasePriorityGet( const TaskHandle_t xTask ); + * @endcode + * + * INCLUDE_uxTaskPriorityGet and configUSE_MUTEXES must be defined as 1 for this + * function to be available. See the configuration section for more information. + * + * Obtain the base priority of any task. + * + * @param xTask Handle of the task to be queried. Passing a NULL + * handle results in the base priority of the calling task being returned. + * + * @return The base priority of xTask. + * + * \defgroup uxTaskPriorityGet uxTaskBasePriorityGet + * \ingroup TaskCtrl + */ +UBaseType_t uxTaskBasePriorityGet( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * UBaseType_t uxTaskBasePriorityGetFromISR( const TaskHandle_t xTask ); + * @endcode + * + * A version of uxTaskBasePriorityGet() that can be used from an ISR. + */ +UBaseType_t uxTaskBasePriorityGetFromISR( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * eTaskState eTaskGetState( TaskHandle_t xTask ); + * @endcode + * + * INCLUDE_eTaskGetState must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Obtain the state of any task. States are encoded by the eTaskState + * enumerated type. + * + * @param xTask Handle of the task to be queried. + * + * @return The state of xTask at the time the function was called. Note the + * state of the task might change between the function being called, and the + * functions return value being tested by the calling task. + */ +#if ( ( INCLUDE_eTaskGetState == 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_xTaskAbortDelay == 1 ) ) + eTaskState eTaskGetState( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + * @code{c} + * void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ); + * @endcode + * + * configUSE_TRACE_FACILITY must be defined as 1 for this function to be + * available. See the configuration section for more information. + * + * Populates a TaskStatus_t structure with information about a task. + * + * @param xTask Handle of the task being queried. If xTask is NULL then + * information will be returned about the calling task. + * + * @param pxTaskStatus A pointer to the TaskStatus_t structure that will be + * filled with information about the task referenced by the handle passed using + * the xTask parameter. + * + * @param xGetFreeStackSpace The TaskStatus_t structure contains a member to report + * the stack high water mark of the task being queried. Calculating the stack + * high water mark takes a relatively long time, and can make the system + * temporarily unresponsive - so the xGetFreeStackSpace parameter is provided to + * allow the high water mark checking to be skipped. The high watermark value + * will only be written to the TaskStatus_t structure if xGetFreeStackSpace is + * not set to pdFALSE; + * + * @param eState The TaskStatus_t structure contains a member to report the + * state of the task being queried. Obtaining the task state is not as fast as + * a simple assignment - so the eState parameter is provided to allow the state + * information to be omitted from the TaskStatus_t structure. To obtain state + * information then set eState to eInvalid - otherwise the value passed in + * eState will be reported as the task state in the TaskStatus_t structure. + * + * Example usage: + * @code{c} + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; + * TaskStatus_t xTaskDetails; + * + * // Obtain the handle of a task from its name. + * xHandle = xTaskGetHandle( "Task_Name" ); + * + * // Check the handle is not NULL. + * configASSERT( xHandle ); + * + * // Use the handle to obtain further information about the task. + * vTaskGetInfo( xHandle, + * &xTaskDetails, + * pdTRUE, // Include the high water mark in xTaskDetails. + * eInvalid ); // Include the task state in xTaskDetails. + * } + * @endcode + * \defgroup vTaskGetInfo vTaskGetInfo + * \ingroup TaskCtrl + */ +#if ( configUSE_TRACE_FACILITY == 1 ) + void vTaskGetInfo( TaskHandle_t xTask, + TaskStatus_t * pxTaskStatus, + BaseType_t xGetFreeStackSpace, + eTaskState eState ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + * @code{c} + * void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ); + * @endcode + * + * INCLUDE_vTaskPrioritySet must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Set the priority of any task. + * + * A context switch will occur before the function returns if the priority + * being set is higher than the currently executing task. + * + * @param xTask Handle to the task for which the priority is being set. + * Passing a NULL handle results in the priority of the calling task being set. + * + * @param uxNewPriority The priority to which the task will be set. + * + * Example usage: + * @code{c} + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; + * + * // Create a task, storing the handle. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + * + * // ... + * + * // Use the handle to raise the priority of the created task. + * vTaskPrioritySet( xHandle, tskIDLE_PRIORITY + 1 ); + * + * // ... + * + * // Use a NULL handle to raise our priority to the same value. + * vTaskPrioritySet( NULL, tskIDLE_PRIORITY + 1 ); + * } + * @endcode + * \defgroup vTaskPrioritySet vTaskPrioritySet + * \ingroup TaskCtrl + */ +void vTaskPrioritySet( TaskHandle_t xTask, + UBaseType_t uxNewPriority ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * void vTaskSuspend( TaskHandle_t xTaskToSuspend ); + * @endcode + * + * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Suspend any task. When suspended a task will never get any microcontroller + * processing time, no matter what its priority. + * + * Calls to vTaskSuspend are not accumulative - + * i.e. calling vTaskSuspend () twice on the same task still only requires one + * call to vTaskResume () to ready the suspended task. + * + * @param xTaskToSuspend Handle to the task being suspended. Passing a NULL + * handle will cause the calling task to be suspended. + * + * Example usage: + * @code{c} + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; + * + * // Create a task, storing the handle. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + * + * // ... + * + * // Use the handle to suspend the created task. + * vTaskSuspend( xHandle ); + * + * // ... + * + * // The created task will not run during this period, unless + * // another task calls vTaskResume( xHandle ). + * + * //... + * + * + * // Suspend ourselves. + * vTaskSuspend( NULL ); + * + * // We cannot get here unless another task calls vTaskResume + * // with our handle as the parameter. + * } + * @endcode + * \defgroup vTaskSuspend vTaskSuspend + * \ingroup TaskCtrl + */ +void vTaskSuspend( TaskHandle_t xTaskToSuspend ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * void vTaskResume( TaskHandle_t xTaskToResume ); + * @endcode + * + * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Resumes a suspended task. + * + * A task that has been suspended by one or more calls to vTaskSuspend () + * will be made available for running again by a single call to + * vTaskResume (). + * + * @param xTaskToResume Handle to the task being readied. + * + * Example usage: + * @code{c} + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; + * + * // Create a task, storing the handle. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + * + * // ... + * + * // Use the handle to suspend the created task. + * vTaskSuspend( xHandle ); + * + * // ... + * + * // The created task will not run during this period, unless + * // another task calls vTaskResume( xHandle ). + * + * //... + * + * + * // Resume the suspended task ourselves. + * vTaskResume( xHandle ); + * + * // The created task will once again get microcontroller processing + * // time in accordance with its priority within the system. + * } + * @endcode + * \defgroup vTaskResume vTaskResume + * \ingroup TaskCtrl + */ +void vTaskResume( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * void xTaskResumeFromISR( TaskHandle_t xTaskToResume ); + * @endcode + * + * INCLUDE_xTaskResumeFromISR must be defined as 1 for this function to be + * available. See the configuration section for more information. + * + * An implementation of vTaskResume() that can be called from within an ISR. + * + * A task that has been suspended by one or more calls to vTaskSuspend () + * will be made available for running again by a single call to + * xTaskResumeFromISR (). + * + * xTaskResumeFromISR() should not be used to synchronise a task with an + * interrupt if there is a chance that the interrupt could arrive prior to the + * task being suspended - as this can lead to interrupts being missed. Use of a + * semaphore as a synchronisation mechanism would avoid this eventuality. + * + * @param xTaskToResume Handle to the task being readied. + * + * @return pdTRUE if resuming the task should result in a context switch, + * otherwise pdFALSE. This is used by the ISR to determine if a context switch + * may be required following the ISR. + * + * \defgroup vTaskResumeFromISR vTaskResumeFromISR + * \ingroup TaskCtrl + */ +BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; + +#if ( configUSE_CORE_AFFINITY == 1 ) + +/** + * @brief Sets the core affinity mask for a task. + * + * It sets the cores on which a task can run. configUSE_CORE_AFFINITY must + * be defined as 1 for this function to be available. + * + * @param xTask The handle of the task to set the core affinity mask for. + * Passing NULL will set the core affinity mask for the calling task. + * + * @param uxCoreAffinityMask A bitwise value that indicates the cores on + * which the task can run. Cores are numbered from 0 to configNUMBER_OF_CORES - 1. + * For example, to ensure that a task can run on core 0 and core 1, set + * uxCoreAffinityMask to 0x03. + * + * Example usage: + * + * // The function that creates task. + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; + * UBaseType_t uxCoreAffinityMask; + * + * // Create a task, storing the handle. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &( xHandle ) ); + * + * // Define the core affinity mask such that this task can only run + * // on core 0 and core 2. + * uxCoreAffinityMask = ( ( 1 << 0 ) | ( 1 << 2 ) ); + * + * //Set the core affinity mask for the task. + * vTaskCoreAffinitySet( xHandle, uxCoreAffinityMask ); + * } + */ + void vTaskCoreAffinitySet( const TaskHandle_t xTask, + UBaseType_t uxCoreAffinityMask ); +#endif + +#if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + +/** + * @brief Gets the core affinity mask for a task. + * + * configUSE_CORE_AFFINITY must be defined as 1 for this function to be + * available. + * + * @param xTask The handle of the task to get the core affinity mask for. + * Passing NULL will get the core affinity mask for the calling task. + * + * @return The core affinity mask which is a bitwise value that indicates + * the cores on which a task can run. Cores are numbered from 0 to + * configNUMBER_OF_CORES - 1. For example, if a task can run on core 0 and core 1, + * the core affinity mask is 0x03. + * + * Example usage: + * + * // Task handle of the networking task - it is populated elsewhere. + * TaskHandle_t xNetworkingTaskHandle; + * + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; + * UBaseType_t uxNetworkingCoreAffinityMask; + * + * // Create a task, storing the handle. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &( xHandle ) ); + * + * //Get the core affinity mask for the networking task. + * uxNetworkingCoreAffinityMask = vTaskCoreAffinityGet( xNetworkingTaskHandle ); + * + * // Here is a hypothetical scenario, just for the example. Assume that we + * // have 2 cores - Core 0 and core 1. We want to pin the application task to + * // the core different than the networking task to ensure that the + * // application task does not interfere with networking. + * if( ( uxNetworkingCoreAffinityMask & ( 1 << 0 ) ) != 0 ) + * { + * // The networking task can run on core 0, pin our task to core 1. + * vTaskCoreAffinitySet( xHandle, ( 1 << 1 ) ); + * } + * else + * { + * // Otherwise, pin our task to core 0. + * vTaskCoreAffinitySet( xHandle, ( 1 << 0 ) ); + * } + * } + */ + UBaseType_t vTaskCoreAffinityGet( ConstTaskHandle_t xTask ); +#endif + +#if ( configUSE_TASK_PREEMPTION_DISABLE == 1 ) + +/** + * @brief Disables preemption for a task. + * + * @param xTask The handle of the task to disable preemption. Passing NULL + * disables preemption for the calling task. + * + * Example usage: + * + * void vTaskCode( void *pvParameters ) + * { + * // Silence warnings about unused parameters. + * ( void ) pvParameters; + * + * for( ;; ) + * { + * // ... Perform some function here. + * + * // Disable preemption for this task. + * vTaskPreemptionDisable( NULL ); + * + * // The task will not be preempted when it is executing in this portion ... + * + * // ... until the preemption is enabled again. + * vTaskPreemptionEnable( NULL ); + * + * // The task can be preempted when it is executing in this portion. + * } + * } + */ + void vTaskPreemptionDisable( const TaskHandle_t xTask ); +#endif + +#if ( configUSE_TASK_PREEMPTION_DISABLE == 1 ) + +/** + * @brief Enables preemption for a task. + * + * @param xTask The handle of the task to enable preemption. Passing NULL + * enables preemption for the calling task. + * + * Example usage: + * + * void vTaskCode( void *pvParameters ) + * { + * // Silence warnings about unused parameters. + * ( void ) pvParameters; + * + * for( ;; ) + * { + * // ... Perform some function here. + * + * // Disable preemption for this task. + * vTaskPreemptionDisable( NULL ); + * + * // The task will not be preempted when it is executing in this portion ... + * + * // ... until the preemption is enabled again. + * vTaskPreemptionEnable( NULL ); + * + * // The task can be preempted when it is executing in this portion. + * } + * } + */ + void vTaskPreemptionEnable( const TaskHandle_t xTask ); +#endif + +/*----------------------------------------------------------- +* SCHEDULER CONTROL +*----------------------------------------------------------*/ + +/** + * task. h + * @code{c} + * void vTaskStartScheduler( void ); + * @endcode + * + * Starts the real time kernel tick processing. After calling the kernel + * has control over which tasks are executed and when. + * + * See the demo application file main.c for an example of creating + * tasks and starting the kernel. + * + * Example usage: + * @code{c} + * void vAFunction( void ) + * { + * // Create at least one task before starting the kernel. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + * + * // Start the real time kernel with preemption. + * vTaskStartScheduler (); + * + * // Will not get here unless a task calls vTaskEndScheduler () + * } + * @endcode + * + * \defgroup vTaskStartScheduler vTaskStartScheduler + * \ingroup SchedulerControl + */ +void vTaskStartScheduler( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * void vTaskEndScheduler( void ); + * @endcode + * + * NOTE: At the time of writing only the x86 real mode port, which runs on a PC + * in place of DOS, implements this function. + * + * Stops the real time kernel tick. All created tasks will be automatically + * deleted and multitasking (either preemptive or cooperative) will + * stop. Execution then resumes from the point where vTaskStartScheduler () + * was called, as if vTaskStartScheduler () had just returned. + * + * See the demo application file main. c in the demo/PC directory for an + * example that uses vTaskEndScheduler (). + * + * vTaskEndScheduler () requires an exit function to be defined within the + * portable layer (see vPortEndScheduler () in port. c for the PC port). This + * performs hardware specific operations such as stopping the kernel tick. + * + * vTaskEndScheduler () will cause all of the resources allocated by the + * kernel to be freed - but will not free resources allocated by application + * tasks. + * + * Example usage: + * @code{c} + * void vTaskCode( void * pvParameters ) + * { + * for( ;; ) + * { + * // Task code goes here. + * + * // At some point we want to end the real time kernel processing + * // so call ... + * vTaskEndScheduler (); + * } + * } + * + * void vAFunction( void ) + * { + * // Create at least one task before starting the kernel. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + * + * // Start the real time kernel with preemption. + * vTaskStartScheduler (); + * + * // Will only get here when the vTaskCode () task has called + * // vTaskEndScheduler (). When we get here we are back to single task + * // execution. + * } + * @endcode + * + * \defgroup vTaskEndScheduler vTaskEndScheduler + * \ingroup SchedulerControl + */ +void vTaskEndScheduler( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * void vTaskSuspendAll( void ); + * @endcode + * + * Suspends the scheduler without disabling interrupts. Context switches will + * not occur while the scheduler is suspended. + * + * After calling vTaskSuspendAll () the calling task will continue to execute + * without risk of being swapped out until a call to xTaskResumeAll () has been + * made. + * + * API functions that have the potential to cause a context switch (for example, + * xTaskDelayUntil(), xQueueSend(), etc.) must not be called while the scheduler + * is suspended. + * + * Example usage: + * @code{c} + * void vTask1( void * pvParameters ) + * { + * for( ;; ) + * { + * // Task code goes here. + * + * // ... + * + * // At some point the task wants to perform a long operation during + * // which it does not want to get swapped out. It cannot use + * // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the + * // operation may cause interrupts to be missed - including the + * // ticks. + * + * // Prevent the real time kernel swapping out the task. + * vTaskSuspendAll (); + * + * // Perform the operation here. There is no need to use critical + * // sections as we have all the microcontroller processing time. + * // During this time interrupts will still operate and the kernel + * // tick count will be maintained. + * + * // ... + * + * // The operation is complete. Restart the kernel. + * xTaskResumeAll (); + * } + * } + * @endcode + * \defgroup vTaskSuspendAll vTaskSuspendAll + * \ingroup SchedulerControl + */ +void vTaskSuspendAll( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * BaseType_t xTaskResumeAll( void ); + * @endcode + * + * Resumes scheduler activity after it was suspended by a call to + * vTaskSuspendAll(). + * + * xTaskResumeAll() only resumes the scheduler. It does not unsuspend tasks + * that were previously suspended by a call to vTaskSuspend(). + * + * @return If resuming the scheduler caused a context switch then pdTRUE is + * returned, otherwise pdFALSE is returned. + * + * Example usage: + * @code{c} + * void vTask1( void * pvParameters ) + * { + * for( ;; ) + * { + * // Task code goes here. + * + * // ... + * + * // At some point the task wants to perform a long operation during + * // which it does not want to get swapped out. It cannot use + * // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the + * // operation may cause interrupts to be missed - including the + * // ticks. + * + * // Prevent the real time kernel swapping out the task. + * vTaskSuspendAll (); + * + * // Perform the operation here. There is no need to use critical + * // sections as we have all the microcontroller processing time. + * // During this time interrupts will still operate and the real + * // time kernel tick count will be maintained. + * + * // ... + * + * // The operation is complete. Restart the kernel. We want to force + * // a context switch - but there is no point if resuming the scheduler + * // caused a context switch already. + * if( !xTaskResumeAll () ) + * { + * taskYIELD (); + * } + * } + * } + * @endcode + * \defgroup xTaskResumeAll xTaskResumeAll + * \ingroup SchedulerControl + */ +BaseType_t xTaskResumeAll( void ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- +* TASK UTILITIES +*----------------------------------------------------------*/ + +/** + * task. h + * @code{c} + * TickType_t xTaskGetTickCount( void ); + * @endcode + * + * @return The count of ticks since vTaskStartScheduler was called. + * + * \defgroup xTaskGetTickCount xTaskGetTickCount + * \ingroup TaskUtils + */ +TickType_t xTaskGetTickCount( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * TickType_t xTaskGetTickCountFromISR( void ); + * @endcode + * + * @return The count of ticks since vTaskStartScheduler was called. + * + * This is a version of xTaskGetTickCount() that is safe to be called from an + * ISR - provided that TickType_t is the natural word size of the + * microcontroller being used or interrupt nesting is either not supported or + * not being used. + * + * \defgroup xTaskGetTickCountFromISR xTaskGetTickCountFromISR + * \ingroup TaskUtils + */ +TickType_t xTaskGetTickCountFromISR( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * uint16_t uxTaskGetNumberOfTasks( void ); + * @endcode + * + * @return The number of tasks that the real time kernel is currently managing. + * This includes all ready, blocked and suspended tasks. A task that + * has been deleted but not yet freed by the idle task will also be + * included in the count. + * + * \defgroup uxTaskGetNumberOfTasks uxTaskGetNumberOfTasks + * \ingroup TaskUtils + */ +UBaseType_t uxTaskGetNumberOfTasks( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * char *pcTaskGetName( TaskHandle_t xTaskToQuery ); + * @endcode + * + * @return The text (human readable) name of the task referenced by the handle + * xTaskToQuery. A task can query its own name by either passing in its own + * handle, or by setting xTaskToQuery to NULL. + * + * \defgroup pcTaskGetName pcTaskGetName + * \ingroup TaskUtils + */ +char * pcTaskGetName( TaskHandle_t xTaskToQuery ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * TaskHandle_t xTaskGetHandle( const char *pcNameToQuery ); + * @endcode + * + * NOTE: This function takes a relatively long time to complete and should be + * used sparingly. + * + * @return The handle of the task that has the human readable name pcNameToQuery. + * NULL is returned if no matching name is found. INCLUDE_xTaskGetHandle + * must be set to 1 in FreeRTOSConfig.h for pcTaskGetHandle() to be available. + * + * \defgroup pcTaskGetHandle pcTaskGetHandle + * \ingroup TaskUtils + */ +#if ( INCLUDE_xTaskGetHandle == 1 ) + TaskHandle_t xTaskGetHandle( const char * pcNameToQuery ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + * @code{c} + * BaseType_t xTaskGetStaticBuffers( TaskHandle_t xTask, + * StackType_t ** ppuxStackBuffer, + * StaticTask_t ** ppxTaskBuffer ); + * @endcode + * + * Retrieve pointers to a statically created task's data structure + * buffer and stack buffer. These are the same buffers that are supplied + * at the time of creation. + * + * @param xTask The task for which to retrieve the buffers. + * + * @param ppuxStackBuffer Used to return a pointer to the task's stack buffer. + * + * @param ppxTaskBuffer Used to return a pointer to the task's data structure + * buffer. + * + * @return pdTRUE if buffers were retrieved, pdFALSE otherwise. + * + * \defgroup xTaskGetStaticBuffers xTaskGetStaticBuffers + * \ingroup TaskUtils + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + BaseType_t xTaskGetStaticBuffers( TaskHandle_t xTask, + StackType_t ** ppuxStackBuffer, + StaticTask_t ** ppxTaskBuffer ) PRIVILEGED_FUNCTION; +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * task.h + * @code{c} + * UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ); + * @endcode + * + * INCLUDE_uxTaskGetStackHighWaterMark must be set to 1 in FreeRTOSConfig.h for + * this function to be available. + * + * Returns the high water mark of the stack associated with xTask. That is, + * the minimum free stack space there has been (in words, so on a 32 bit machine + * a value of 1 means 4 bytes) since the task started. The smaller the returned + * number the closer the task has come to overflowing its stack. + * + * uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the + * same except for their return type. Using configSTACK_DEPTH_TYPE allows the + * user to determine the return type. It gets around the problem of the value + * overflowing on 8-bit types without breaking backward compatibility for + * applications that expect an 8-bit return type. + * + * @param xTask Handle of the task associated with the stack to be checked. + * Set xTask to NULL to check the stack of the calling task. + * + * @return The smallest amount of free stack space there has been (in words, so + * actual spaces on the stack rather than bytes) since the task referenced by + * xTask was created. + */ +#if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) + UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; +#endif + +/** + * task.h + * @code{c} + * configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ); + * @endcode + * + * INCLUDE_uxTaskGetStackHighWaterMark2 must be set to 1 in FreeRTOSConfig.h for + * this function to be available. + * + * Returns the high water mark of the stack associated with xTask. That is, + * the minimum free stack space there has been (in words, so on a 32 bit machine + * a value of 1 means 4 bytes) since the task started. The smaller the returned + * number the closer the task has come to overflowing its stack. + * + * uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the + * same except for their return type. Using configSTACK_DEPTH_TYPE allows the + * user to determine the return type. It gets around the problem of the value + * overflowing on 8-bit types without breaking backward compatibility for + * applications that expect an 8-bit return type. + * + * @param xTask Handle of the task associated with the stack to be checked. + * Set xTask to NULL to check the stack of the calling task. + * + * @return The smallest amount of free stack space there has been (in words, so + * actual spaces on the stack rather than bytes) since the task referenced by + * xTask was created. + */ +#if ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) + configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; +#endif + +/* When using trace macros it is sometimes necessary to include task.h before + * FreeRTOS.h. When this is done TaskHookFunction_t will not yet have been defined, + * so the following two prototypes will cause a compilation error. This can be + * fixed by simply guarding against the inclusion of these two prototypes unless + * they are explicitly required by the configUSE_APPLICATION_TASK_TAG configuration + * constant. */ +#ifdef configUSE_APPLICATION_TASK_TAG + #if configUSE_APPLICATION_TASK_TAG == 1 + +/** + * task.h + * @code{c} + * void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction ); + * @endcode + * + * Sets pxHookFunction to be the task hook function used by the task xTask. + * Passing xTask as NULL has the effect of setting the calling tasks hook + * function. + */ + void vTaskSetApplicationTaskTag( TaskHandle_t xTask, + TaskHookFunction_t pxHookFunction ) PRIVILEGED_FUNCTION; + +/** + * task.h + * @code{c} + * void xTaskGetApplicationTaskTag( TaskHandle_t xTask ); + * @endcode + * + * Returns the pxHookFunction value assigned to the task xTask. Do not + * call from an interrupt service routine - call + * xTaskGetApplicationTaskTagFromISR() instead. + */ + TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task.h + * @code{c} + * void xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ); + * @endcode + * + * Returns the pxHookFunction value assigned to the task xTask. Can + * be called from an interrupt service routine. + */ + TaskHookFunction_t xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + #endif /* configUSE_APPLICATION_TASK_TAG ==1 */ +#endif /* ifdef configUSE_APPLICATION_TASK_TAG */ + +#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + +/* Each task contains an array of pointers that is dimensioned by the + * configNUM_THREAD_LOCAL_STORAGE_POINTERS setting in FreeRTOSConfig.h. The + * kernel does not use the pointers itself, so the application writer can use + * the pointers for any purpose they wish. The following two functions are + * used to set and query a pointer respectively. */ + void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, + BaseType_t xIndex, + void * pvValue ) PRIVILEGED_FUNCTION; + void * pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, + BaseType_t xIndex ) PRIVILEGED_FUNCTION; + +#endif + +#if ( configCHECK_FOR_STACK_OVERFLOW > 0 ) + +/** + * task.h + * @code{c} + * void vApplicationStackOverflowHook( TaskHandle_t xTask, char *pcTaskName); + * @endcode + * + * The application stack overflow hook is called when a stack overflow is detected for a task. + * + * Details on stack overflow detection can be found here: https://www.FreeRTOS.org/Stacks-and-stack-overflow-checking.html + * + * @param xTask the task that just exceeded its stack boundaries. + * @param pcTaskName A character string containing the name of the offending task. + */ + /* MISRA Ref 8.6.1 [External linkage] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-86 */ + /* coverity[misra_c_2012_rule_8_6_violation] */ +#if 1 /* << EST */ + void configCHECK_FOR_STACK_OVERFLOW_NAME( TaskHandle_t xTask, char *pcTaskName ); +#else + void vApplicationStackOverflowHook( TaskHandle_t xTask, + char * pcTaskName ); +#endif + +#endif + +#if ( configUSE_IDLE_HOOK == 1 ) + +/** + * task.h + * @code{c} + * void vApplicationIdleHook( void ); + * @endcode + * + * The application idle hook is called by the idle task. + * This allows the application designer to add background functionality without + * the overhead of a separate task. + * NOTE: vApplicationIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES, CALL A FUNCTION THAT MIGHT BLOCK. + */ + /* MISRA Ref 8.6.1 [External linkage] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-86 */ + /* coverity[misra_c_2012_rule_8_6_violation] */ +#if 1 /* << EST */ + void configUSE_TICK_HOOK_NAME(void); /*lint !e526 Symbol not defined as it is an application callback. */ +#else + void vApplicationIdleHook( void ); +#endif + +#endif + + +#if ( configUSE_TICK_HOOK != 0 ) + +/** + * task.h + * @code{c} + * void vApplicationTickHook( void ); + * @endcode + * + * This hook function is called in the system tick handler after any OS work is completed. + */ + /* MISRA Ref 8.6.1 [External linkage] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-86 */ + /* coverity[misra_c_2012_rule_8_6_violation] */ +#if 1 /* << EST */ + void configUSE_TICK_HOOK_NAME(void); /*lint !e526 Symbol not defined as it is an application callback. */ +#else + void vApplicationIdleHook( void ); +#endif + +#endif + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + +/** + * task.h + * @code{c} + * void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer, StackType_t ** ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ) + * @endcode + * + * This function is used to provide a statically allocated block of memory to FreeRTOS to hold the Idle Task TCB. This function is required when + * configSUPPORT_STATIC_ALLOCATION is set. For more information see this URI: https://www.FreeRTOS.org/a00110.html#configSUPPORT_STATIC_ALLOCATION + * + * @param ppxIdleTaskTCBBuffer A handle to a statically allocated TCB buffer + * @param ppxIdleTaskStackBuffer A handle to a statically allocated Stack buffer for the idle task + * @param pulIdleTaskStackSize A pointer to the number of elements that will fit in the allocated stack buffer + */ + void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer, + StackType_t ** ppxIdleTaskStackBuffer, + uint32_t * pulIdleTaskStackSize ); + +/** + * task.h + * @code{c} + * void vApplicationGetPassiveIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer, StackType_t ** ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize, BaseType_t xCoreID ) + * @endcode + * + * This function is used to provide a statically allocated block of memory to FreeRTOS to hold the Idle Tasks TCB. This function is required when + * configSUPPORT_STATIC_ALLOCATION is set. For more information see this URI: https://www.FreeRTOS.org/a00110.html#configSUPPORT_STATIC_ALLOCATION + * + * In the FreeRTOS SMP, there are a total of configNUMBER_OF_CORES idle tasks: + * 1. 1 Active idle task which does all the housekeeping. + * 2. ( configNUMBER_OF_CORES - 1 ) Passive idle tasks which do nothing. + * These idle tasks are created to ensure that each core has an idle task to run when + * no other task is available to run. + * + * The function vApplicationGetPassiveIdleTaskMemory is called with passive idle + * task index 0, 1 ... ( configNUMBER_OF_CORES - 2 ) to get memory for passive idle + * tasks. + * + * @param ppxIdleTaskTCBBuffer A handle to a statically allocated TCB buffer + * @param ppxIdleTaskStackBuffer A handle to a statically allocated Stack buffer for the idle task + * @param pulIdleTaskStackSize A pointer to the number of elements that will fit in the allocated stack buffer + * @param xPassiveIdleTaskIndex The passive idle task index of the idle task buffer + */ + #if ( configNUMBER_OF_CORES > 1 ) + void vApplicationGetPassiveIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer, + StackType_t ** ppxIdleTaskStackBuffer, + uint32_t * pulIdleTaskStackSize, + BaseType_t xPassiveIdleTaskIndex ); + #endif /* #if ( configNUMBER_OF_CORES > 1 ) */ +#endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ + +/** + * task.h + * @code{c} + * BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ); + * @endcode + * + * Calls the hook function associated with xTask. Passing xTask as NULL has + * the effect of calling the Running tasks (the calling task) hook function. + * + * pvParameter is passed to the hook function for the task to interpret as it + * wants. The return value is the value returned by the task hook function + * registered by the user. + */ +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, + void * pvParameter ) PRIVILEGED_FUNCTION; +#endif + +/** + * xTaskGetIdleTaskHandle() is only available if + * INCLUDE_xTaskGetIdleTaskHandle is set to 1 in FreeRTOSConfig.h. + * + * In single-core FreeRTOS, this function simply returns the handle of the idle + * task. It is not valid to call xTaskGetIdleTaskHandle() before the scheduler + * has been started. + * + * In the FreeRTOS SMP, there are a total of configNUMBER_OF_CORES idle tasks: + * 1. 1 Active idle task which does all the housekeeping. + * 2. ( configNUMBER_OF_CORES - 1 ) Passive idle tasks which do nothing. + * These idle tasks are created to ensure that each core has an idle task to run when + * no other task is available to run. Call xTaskGetIdleTaskHandle() or + * xTaskGetIdleTaskHandleForCore() with xCoreID set to 0 to get the Active + * idle task handle. Call xTaskGetIdleTaskHandleForCore() with xCoreID set to + * 1,2 ... ( configNUMBER_OF_CORES - 1 ) to get the Passive idle task handles. + */ +#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) + #if ( configNUMBER_OF_CORES == 1 ) + TaskHandle_t xTaskGetIdleTaskHandle( void ) PRIVILEGED_FUNCTION; + #endif /* #if ( configNUMBER_OF_CORES == 1 ) */ + + TaskHandle_t xTaskGetIdleTaskHandleForCore( BaseType_t xCoreID ) PRIVILEGED_FUNCTION; +#endif /* #if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) */ + +/** + * configUSE_TRACE_FACILITY must be defined as 1 in FreeRTOSConfig.h for + * uxTaskGetSystemState() to be available. + * + * uxTaskGetSystemState() populates an TaskStatus_t structure for each task in + * the system. TaskStatus_t structures contain, among other things, members + * for the task handle, task name, task priority, task state, and total amount + * of run time consumed by the task. See the TaskStatus_t structure + * definition in this file for the full member list. + * + * NOTE: This function is intended for debugging use only as its use results in + * the scheduler remaining suspended for an extended period. + * + * @param pxTaskStatusArray A pointer to an array of TaskStatus_t structures. + * The array must contain at least one TaskStatus_t structure for each task + * that is under the control of the RTOS. The number of tasks under the control + * of the RTOS can be determined using the uxTaskGetNumberOfTasks() API function. + * + * @param uxArraySize The size of the array pointed to by the pxTaskStatusArray + * parameter. The size is specified as the number of indexes in the array, or + * the number of TaskStatus_t structures contained in the array, not by the + * number of bytes in the array. + * + * @param pulTotalRunTime If configGENERATE_RUN_TIME_STATS is set to 1 in + * FreeRTOSConfig.h then *pulTotalRunTime is set by uxTaskGetSystemState() to the + * total run time (as defined by the run time stats clock, see + * https://www.FreeRTOS.org/rtos-run-time-stats.html) since the target booted. + * pulTotalRunTime can be set to NULL to omit the total run time information. + * + * @return The number of TaskStatus_t structures that were populated by + * uxTaskGetSystemState(). This should equal the number returned by the + * uxTaskGetNumberOfTasks() API function, but will be zero if the value passed + * in the uxArraySize parameter was too small. + * + * Example usage: + * @code{c} + * // This example demonstrates how a human readable table of run time stats + * // information is generated from raw data provided by uxTaskGetSystemState(). + * // The human readable table is written to pcWriteBuffer + * void vTaskGetRunTimeStats( char *pcWriteBuffer ) + * { + * TaskStatus_t *pxTaskStatusArray; + * volatile UBaseType_t uxArraySize, x; + * configRUN_TIME_COUNTER_TYPE ulTotalRunTime, ulStatsAsPercentage; + * + * // Make sure the write buffer does not contain a string. + * pcWriteBuffer = 0x00; + * + * // Take a snapshot of the number of tasks in case it changes while this + * // function is executing. + * uxArraySize = uxTaskGetNumberOfTasks(); + * + * // Allocate a TaskStatus_t structure for each task. An array could be + * // allocated statically at compile time. + * pxTaskStatusArray = pvPortMalloc( uxArraySize * sizeof( TaskStatus_t ) ); + * + * if( pxTaskStatusArray != NULL ) + * { + * // Generate raw status information about each task. + * uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalRunTime ); + * + * // For percentage calculations. + * ulTotalRunTime /= 100UL; + * + * // Avoid divide by zero errors. + * if( ulTotalRunTime > 0 ) + * { + * // For each populated position in the pxTaskStatusArray array, + * // format the raw data as human readable ASCII data + * for( x = 0; x < uxArraySize; x++ ) + * { + * // What percentage of the total run time has the task used? + * // This will always be rounded down to the nearest integer. + * // ulTotalRunTimeDiv100 has already been divided by 100. + * ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalRunTime; + * + * if( ulStatsAsPercentage > 0UL ) + * { + * sprintf( pcWriteBuffer, "%s\t\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage ); + * } + * else + * { + * // If the percentage is zero here then the task has + * // consumed less than 1% of the total run time. + * sprintf( pcWriteBuffer, "%s\t\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter ); + * } + * + * pcWriteBuffer += strlen( ( char * ) pcWriteBuffer ); + * } + * } + * + * // The array is no longer needed, free the memory it consumes. + * vPortFree( pxTaskStatusArray ); + * } + * } + * @endcode + */ +#if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, + const UBaseType_t uxArraySize, + configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + * @code{c} + * void vTaskListTasks( char *pcWriteBuffer, size_t uxBufferLength ); + * @endcode + * + * configUSE_TRACE_FACILITY and configUSE_STATS_FORMATTING_FUNCTIONS must + * both be defined as 1 for this function to be available. See the + * configuration section of the FreeRTOS.org website for more information. + * + * NOTE 1: This function will disable interrupts for its duration. It is + * not intended for normal application runtime use but as a debug aid. + * + * Lists all the current tasks, along with their current state and stack + * usage high water mark. + * + * Tasks are reported as blocked ('B'), ready ('R'), deleted ('D') or + * suspended ('S'). + * + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many of the + * demo applications. Do not consider it to be part of the scheduler. + * + * vTaskListTasks() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that displays task: + * names, states, priority, stack usage and task number. + * Stack usage specified as the number of unused StackType_t words stack can hold + * on top of stack - not the number of bytes. + * + * vTaskListTasks() has a dependency on the snprintf() C library function that might + * bloat the code size, use a lot of stack, and provide different results on + * different platforms. An alternative, tiny, third party, and limited + * functionality implementation of snprintf() is provided in many of the + * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note + * printf-stdarg.c does not provide a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly through a + * call to vTaskListTasks(). + * + * @param pcWriteBuffer A buffer into which the above mentioned details + * will be written, in ASCII form. This buffer is assumed to be large + * enough to contain the generated report. Approximately 40 bytes per + * task should be sufficient. + * + * @param uxBufferLength Length of the pcWriteBuffer. + * + * \defgroup vTaskListTasks vTaskListTasks + * \ingroup TaskUtils + */ +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + void vTaskListTasks( char * pcWriteBuffer, + size_t uxBufferLength ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + * @code{c} + * void vTaskList( char *pcWriteBuffer ); + * @endcode + * + * configUSE_TRACE_FACILITY and configUSE_STATS_FORMATTING_FUNCTIONS must + * both be defined as 1 for this function to be available. See the + * configuration section of the FreeRTOS.org website for more information. + * + * WARN: This function assumes that the pcWriteBuffer is of length + * configSTATS_BUFFER_MAX_LENGTH. This function is there only for + * backward compatibility. New applications are recommended to + * use vTaskListTasks and supply the length of the pcWriteBuffer explicitly. + * + * NOTE 1: This function will disable interrupts for its duration. It is + * not intended for normal application runtime use but as a debug aid. + * + * Lists all the current tasks, along with their current state and stack + * usage high water mark. + * + * Tasks are reported as blocked ('B'), ready ('R'), deleted ('D') or + * suspended ('S'). + * + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many of the + * demo applications. Do not consider it to be part of the scheduler. + * + * vTaskList() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that displays task: + * names, states, priority, stack usage and task number. + * Stack usage specified as the number of unused StackType_t words stack can hold + * on top of stack - not the number of bytes. + * + * vTaskList() has a dependency on the snprintf() C library function that might + * bloat the code size, use a lot of stack, and provide different results on + * different platforms. An alternative, tiny, third party, and limited + * functionality implementation of snprintf() is provided in many of the + * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note + * printf-stdarg.c does not provide a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly through a + * call to vTaskList(). + * + * @param pcWriteBuffer A buffer into which the above mentioned details + * will be written, in ASCII form. This buffer is assumed to be large + * enough to contain the generated report. Approximately 40 bytes per + * task should be sufficient. + * + * \defgroup vTaskList vTaskList + * \ingroup TaskUtils + */ +#define vTaskList( pcWriteBuffer ) vTaskListTasks( pcWriteBuffer, configSTATS_BUFFER_MAX_LENGTH ) + +/** + * task. h + * @code{c} + * void vTaskGetRunTimeStatistics( char *pcWriteBuffer, size_t uxBufferLength ); + * @endcode + * + * configGENERATE_RUN_TIME_STATS and configUSE_STATS_FORMATTING_FUNCTIONS + * must both be defined as 1 for this function to be available. The application + * must also then provide definitions for + * portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and portGET_RUN_TIME_COUNTER_VALUE() + * to configure a peripheral timer/counter and return the timers current count + * value respectively. The counter should be at least 10 times the frequency of + * the tick count. + * + * NOTE 1: This function will disable interrupts for its duration. It is + * not intended for normal application runtime use but as a debug aid. + * + * Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total + * accumulated execution time being stored for each task. The resolution + * of the accumulated time value depends on the frequency of the timer + * configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro. + * Calling vTaskGetRunTimeStatistics() writes the total execution time of each + * task into a buffer, both as an absolute count value and as a percentage + * of the total system execution time. + * + * NOTE 2: + * + * This function is provided for convenience only, and is used by many of the + * demo applications. Do not consider it to be part of the scheduler. + * + * vTaskGetRunTimeStatistics() calls uxTaskGetSystemState(), then formats part of + * the uxTaskGetSystemState() output into a human readable table that displays the + * amount of time each task has spent in the Running state in both absolute and + * percentage terms. + * + * vTaskGetRunTimeStatistics() has a dependency on the snprintf() C library function + * that might bloat the code size, use a lot of stack, and provide different + * results on different platforms. An alternative, tiny, third party, and + * limited functionality implementation of snprintf() is provided in many of the + * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note + * printf-stdarg.c does not provide a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() directly + * to get access to raw stats data, rather than indirectly through a call to + * vTaskGetRunTimeStatistics(). + * + * @param pcWriteBuffer A buffer into which the execution times will be + * written, in ASCII form. This buffer is assumed to be large enough to + * contain the generated report. Approximately 40 bytes per task should + * be sufficient. + * + * @param uxBufferLength Length of the pcWriteBuffer. + * + * \defgroup vTaskGetRunTimeStatistics vTaskGetRunTimeStatistics + * \ingroup TaskUtils + */ +#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configUSE_TRACE_FACILITY == 1 ) ) + void vTaskGetRunTimeStatistics( char * pcWriteBuffer, + size_t uxBufferLength ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + * @code{c} + * void vTaskGetRunTimeStats( char *pcWriteBuffer ); + * @endcode + * + * configGENERATE_RUN_TIME_STATS and configUSE_STATS_FORMATTING_FUNCTIONS + * must both be defined as 1 for this function to be available. The application + * must also then provide definitions for + * portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and portGET_RUN_TIME_COUNTER_VALUE() + * to configure a peripheral timer/counter and return the timers current count + * value respectively. The counter should be at least 10 times the frequency of + * the tick count. + * + * WARN: This function assumes that the pcWriteBuffer is of length + * configSTATS_BUFFER_MAX_LENGTH. This function is there only for + * backward compatiblity. New applications are recommended to use + * vTaskGetRunTimeStatistics and supply the length of the pcWriteBuffer + * explicitly. + * + * NOTE 1: This function will disable interrupts for its duration. It is + * not intended for normal application runtime use but as a debug aid. + * + * Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total + * accumulated execution time being stored for each task. The resolution + * of the accumulated time value depends on the frequency of the timer + * configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro. + * Calling vTaskGetRunTimeStats() writes the total execution time of each + * task into a buffer, both as an absolute count value and as a percentage + * of the total system execution time. + * + * NOTE 2: + * + * This function is provided for convenience only, and is used by many of the + * demo applications. Do not consider it to be part of the scheduler. + * + * vTaskGetRunTimeStats() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that displays the + * amount of time each task has spent in the Running state in both absolute and + * percentage terms. + * + * vTaskGetRunTimeStats() has a dependency on the snprintf() C library function + * that might bloat the code size, use a lot of stack, and provide different + * results on different platforms. An alternative, tiny, third party, and + * limited functionality implementation of snprintf() is provided in many of the + * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note + * printf-stdarg.c does not provide a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() directly + * to get access to raw stats data, rather than indirectly through a call to + * vTaskGetRunTimeStats(). + * + * @param pcWriteBuffer A buffer into which the execution times will be + * written, in ASCII form. This buffer is assumed to be large enough to + * contain the generated report. Approximately 40 bytes per task should + * be sufficient. + * + * \defgroup vTaskGetRunTimeStats vTaskGetRunTimeStats + * \ingroup TaskUtils + */ +#define vTaskGetRunTimeStats( pcWriteBuffer ) vTaskGetRunTimeStatistics( pcWriteBuffer, configSTATS_BUFFER_MAX_LENGTH ) + +/** + * task. h + * @code{c} + * configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimeCounter( const TaskHandle_t xTask ); + * configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimePercent( const TaskHandle_t xTask ); + * @endcode + * + * configGENERATE_RUN_TIME_STATS must be defined as 1 for these functions to be + * available. The application must also then provide definitions for + * portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and + * portGET_RUN_TIME_COUNTER_VALUE() to configure a peripheral timer/counter and + * return the timers current count value respectively. The counter should be + * at least 10 times the frequency of the tick count. + * + * Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total + * accumulated execution time being stored for each task. The resolution + * of the accumulated time value depends on the frequency of the timer + * configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro. + * While uxTaskGetSystemState() and vTaskGetRunTimeStats() writes the total + * execution time of each task into a buffer, ulTaskGetRunTimeCounter() + * returns the total execution time of just one task and + * ulTaskGetRunTimePercent() returns the percentage of the CPU time used by + * just one task. + * + * @return The total run time of the given task or the percentage of the total + * run time consumed by the given task. This is the amount of time the task + * has actually been executing. The unit of time is dependent on the frequency + * configured using the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and + * portGET_RUN_TIME_COUNTER_VALUE() macros. + * + * \defgroup ulTaskGetRunTimeCounter ulTaskGetRunTimeCounter + * \ingroup TaskUtils + */ +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimeCounter( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimePercent( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + * @code{c} + * configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimeCounter( void ); + * configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimePercent( void ); + * @endcode + * + * configGENERATE_RUN_TIME_STATS must be defined as 1 for these functions to be + * available. The application must also then provide definitions for + * portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and + * portGET_RUN_TIME_COUNTER_VALUE() to configure a peripheral timer/counter and + * return the timers current count value respectively. The counter should be + * at least 10 times the frequency of the tick count. + * + * Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total + * accumulated execution time being stored for each task. The resolution + * of the accumulated time value depends on the frequency of the timer + * configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro. + * While uxTaskGetSystemState() and vTaskGetRunTimeStats() writes the total + * execution time of each task into a buffer, ulTaskGetIdleRunTimeCounter() + * returns the total execution time of just the idle task and + * ulTaskGetIdleRunTimePercent() returns the percentage of the CPU time used by + * just the idle task. + * + * Note the amount of idle time is only a good measure of the slack time in a + * system if there are no other tasks executing at the idle priority, tickless + * idle is not used, and configIDLE_SHOULD_YIELD is set to 0. + * + * @return The total run time of the idle task or the percentage of the total + * run time consumed by the idle task. This is the amount of time the + * idle task has actually been executing. The unit of time is dependent on the + * frequency configured using the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and + * portGET_RUN_TIME_COUNTER_VALUE() macros. + * + * \defgroup ulTaskGetIdleRunTimeCounter ulTaskGetIdleRunTimeCounter + * \ingroup TaskUtils + */ +#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) + configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimeCounter( void ) PRIVILEGED_FUNCTION; + configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimePercent( void ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + * @code{c} + * BaseType_t xTaskNotifyIndexed( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify, uint32_t ulValue, eNotifyAction eAction ); + * BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction ); + * @endcode + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these + * functions to be available. + * + * Sends a direct to task notification to a task, with an optional value and + * action. + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment one of the task's notification values. In + * that way task notifications can be used to send data to a task, or be used as + * light weight and fast binary or counting semaphores. + * + * A task can use xTaskNotifyWaitIndexed() or ulTaskNotifyTakeIndexed() to + * [optionally] block to wait for a notification to be pending. The task does + * not consume any CPU time while it is in the Blocked state. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWaitIndexed() or ulTaskNotifyTakeIndexed() (or their + * un-indexed equivalents). If the task was already in the Blocked state to + * wait for a notification when the notification arrives then the task will + * automatically be removed from the Blocked state (unblocked) and the + * notification cleared. + * + * **NOTE** Each notification within the array operates independently - a task + * can only block on one notification within the array at a time and will not be + * unblocked by a notification sent to any other array index. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. xTaskNotify() is the original API function, and remains backward + * compatible by always operating on the notification value at index 0 in the + * array. Calling xTaskNotify() is equivalent to calling xTaskNotifyIndexed() + * with the uxIndexToNotify parameter set to 0. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @param uxIndexToNotify The index within the target task's array of + * notification values to which the notification is to be sent. uxIndexToNotify + * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES. xTaskNotify() does + * not have this parameter and always sends notifications to index 0. + * + * @param ulValue Data that can be sent with the notification. How the data is + * used depends on the value of the eAction parameter. + * + * @param eAction Specifies how the notification updates the task's notification + * value, if at all. Valid values for eAction are as follows: + * + * eSetBits - + * The target notification value is bitwise ORed with ulValue. + * xTaskNotifyIndexed() always returns pdPASS in this case. + * + * eIncrement - + * The target notification value is incremented. ulValue is not used and + * xTaskNotifyIndexed() always returns pdPASS in this case. + * + * eSetValueWithOverwrite - + * The target notification value is set to the value of ulValue, even if the + * task being notified had not yet processed the previous notification at the + * same array index (the task already had a notification pending at that index). + * xTaskNotifyIndexed() always returns pdPASS in this case. + * + * eSetValueWithoutOverwrite - + * If the task being notified did not already have a notification pending at the + * same array index then the target notification value is set to ulValue and + * xTaskNotifyIndexed() will return pdPASS. If the task being notified already + * had a notification pending at the same array index then no action is + * performed and pdFAIL is returned. + * + * eNoAction - + * The task receives a notification at the specified array index without the + * notification value at that index being updated. ulValue is not used and + * xTaskNotifyIndexed() always returns pdPASS in this case. + * + * pulPreviousNotificationValue - + * Can be used to pass out the subject task's notification value before any + * bits are modified by the notify function. + * + * @return Dependent on the value of eAction. See the description of the + * eAction parameter. + * + * \defgroup xTaskNotifyIndexed xTaskNotifyIndexed + * \ingroup TaskNotifications + */ +BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + uint32_t ulValue, + eNotifyAction eAction, + uint32_t * pulPreviousNotificationValue ) PRIVILEGED_FUNCTION; +#define xTaskNotify( xTaskToNotify, ulValue, eAction ) \ + xTaskGenericNotify( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulValue ), ( eAction ), NULL ) +#define xTaskNotifyIndexed( xTaskToNotify, uxIndexToNotify, ulValue, eAction ) \ + xTaskGenericNotify( ( xTaskToNotify ), ( uxIndexToNotify ), ( ulValue ), ( eAction ), NULL ) + +/** + * task. h + * @code{c} + * BaseType_t xTaskNotifyAndQueryIndexed( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotifyValue ); + * BaseType_t xTaskNotifyAndQuery( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotifyValue ); + * @endcode + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * xTaskNotifyAndQueryIndexed() performs the same operation as + * xTaskNotifyIndexed() with the addition that it also returns the subject + * task's prior notification value (the notification value at the time the + * function is called rather than when the function returns) in the additional + * pulPreviousNotifyValue parameter. + * + * xTaskNotifyAndQuery() performs the same operation as xTaskNotify() with the + * addition that it also returns the subject task's prior notification value + * (the notification value as it was at the time the function is called, rather + * than when the function returns) in the additional pulPreviousNotifyValue + * parameter. + * + * \defgroup xTaskNotifyAndQueryIndexed xTaskNotifyAndQueryIndexed + * \ingroup TaskNotifications + */ +#define xTaskNotifyAndQuery( xTaskToNotify, ulValue, eAction, pulPreviousNotifyValue ) \ + xTaskGenericNotify( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulValue ), ( eAction ), ( pulPreviousNotifyValue ) ) +#define xTaskNotifyAndQueryIndexed( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pulPreviousNotifyValue ) \ + xTaskGenericNotify( ( xTaskToNotify ), ( uxIndexToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotifyValue ) ) + +/** + * task. h + * @code{c} + * BaseType_t xTaskNotifyIndexedFromISR( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify, uint32_t ulValue, eNotifyAction eAction, BaseType_t *pxHigherPriorityTaskWoken ); + * BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these + * functions to be available. + * + * A version of xTaskNotifyIndexed() that can be used from an interrupt service + * routine (ISR). + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment one of the task's notification values. In + * that way task notifications can be used to send data to a task, or be used as + * light weight and fast binary or counting semaphores. + * + * A task can use xTaskNotifyWaitIndexed() to [optionally] block to wait for a + * notification to be pending, or ulTaskNotifyTakeIndexed() to [optionally] block + * to wait for a notification value to have a non-zero value. The task does + * not consume any CPU time while it is in the Blocked state. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWaitIndexed() or ulTaskNotifyTakeIndexed() (or their + * un-indexed equivalents). If the task was already in the Blocked state to + * wait for a notification when the notification arrives then the task will + * automatically be removed from the Blocked state (unblocked) and the + * notification cleared. + * + * **NOTE** Each notification within the array operates independently - a task + * can only block on one notification within the array at a time and will not be + * unblocked by a notification sent to any other array index. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. xTaskNotifyFromISR() is the original API function, and remains + * backward compatible by always operating on the notification value at index 0 + * within the array. Calling xTaskNotifyFromISR() is equivalent to calling + * xTaskNotifyIndexedFromISR() with the uxIndexToNotify parameter set to 0. + * + * @param uxIndexToNotify The index within the target task's array of + * notification values to which the notification is to be sent. uxIndexToNotify + * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES. xTaskNotifyFromISR() + * does not have this parameter and always sends notifications to index 0. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @param ulValue Data that can be sent with the notification. How the data is + * used depends on the value of the eAction parameter. + * + * @param eAction Specifies how the notification updates the task's notification + * value, if at all. Valid values for eAction are as follows: + * + * eSetBits - + * The task's notification value is bitwise ORed with ulValue. xTaskNotify() + * always returns pdPASS in this case. + * + * eIncrement - + * The task's notification value is incremented. ulValue is not used and + * xTaskNotify() always returns pdPASS in this case. + * + * eSetValueWithOverwrite - + * The task's notification value is set to the value of ulValue, even if the + * task being notified had not yet processed the previous notification (the + * task already had a notification pending). xTaskNotify() always returns + * pdPASS in this case. + * + * eSetValueWithoutOverwrite - + * If the task being notified did not already have a notification pending then + * the task's notification value is set to ulValue and xTaskNotify() will + * return pdPASS. If the task being notified already had a notification + * pending then no action is performed and pdFAIL is returned. + * + * eNoAction - + * The task receives a notification without its notification value being + * updated. ulValue is not used and xTaskNotify() always returns pdPASS in + * this case. + * + * @param pxHigherPriorityTaskWoken xTaskNotifyFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the + * task to which the notification was sent to leave the Blocked state, and the + * unblocked task has a priority higher than the currently running task. If + * xTaskNotifyFromISR() sets this value to pdTRUE then a context switch should + * be requested before the interrupt is exited. How a context switch is + * requested from an ISR is dependent on the port - see the documentation page + * for the port in use. + * + * @return Dependent on the value of eAction. See the description of the + * eAction parameter. + * + * \defgroup xTaskNotifyIndexedFromISR xTaskNotifyIndexedFromISR + * \ingroup TaskNotifications + */ +BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + uint32_t ulValue, + eNotifyAction eAction, + uint32_t * pulPreviousNotificationValue, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +#define xTaskNotifyFromISR( xTaskToNotify, ulValue, eAction, pxHigherPriorityTaskWoken ) \ + xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulValue ), ( eAction ), NULL, ( pxHigherPriorityTaskWoken ) ) +#define xTaskNotifyIndexedFromISR( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pxHigherPriorityTaskWoken ) \ + xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( uxIndexToNotify ), ( ulValue ), ( eAction ), NULL, ( pxHigherPriorityTaskWoken ) ) + +/** + * task. h + * @code{c} + * BaseType_t xTaskNotifyAndQueryIndexedFromISR( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken ); + * BaseType_t xTaskNotifyAndQueryFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * xTaskNotifyAndQueryIndexedFromISR() performs the same operation as + * xTaskNotifyIndexedFromISR() with the addition that it also returns the + * subject task's prior notification value (the notification value at the time + * the function is called rather than at the time the function returns) in the + * additional pulPreviousNotifyValue parameter. + * + * xTaskNotifyAndQueryFromISR() performs the same operation as + * xTaskNotifyFromISR() with the addition that it also returns the subject + * task's prior notification value (the notification value at the time the + * function is called rather than at the time the function returns) in the + * additional pulPreviousNotifyValue parameter. + * + * \defgroup xTaskNotifyAndQueryIndexedFromISR xTaskNotifyAndQueryIndexedFromISR + * \ingroup TaskNotifications + */ +#define xTaskNotifyAndQueryIndexedFromISR( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pulPreviousNotificationValue, pxHigherPriorityTaskWoken ) \ + xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( uxIndexToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotificationValue ), ( pxHigherPriorityTaskWoken ) ) +#define xTaskNotifyAndQueryFromISR( xTaskToNotify, ulValue, eAction, pulPreviousNotificationValue, pxHigherPriorityTaskWoken ) \ + xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulValue ), ( eAction ), ( pulPreviousNotificationValue ), ( pxHigherPriorityTaskWoken ) ) + +/** + * task. h + * @code{c} + * BaseType_t xTaskNotifyWaitIndexed( UBaseType_t uxIndexToWaitOn, uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ); + * + * BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ); + * @endcode + * + * Waits for a direct to task notification to be pending at a given index within + * an array of direct to task notifications. + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment one of the task's notification values. In + * that way task notifications can be used to send data to a task, or be used as + * light weight and fast binary or counting semaphores. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWaitIndexed() or ulTaskNotifyTakeIndexed() (or their + * un-indexed equivalents). If the task was already in the Blocked state to + * wait for a notification when the notification arrives then the task will + * automatically be removed from the Blocked state (unblocked) and the + * notification cleared. + * + * A task can use xTaskNotifyWaitIndexed() to [optionally] block to wait for a + * notification to be pending, or ulTaskNotifyTakeIndexed() to [optionally] block + * to wait for a notification value to have a non-zero value. The task does + * not consume any CPU time while it is in the Blocked state. + * + * **NOTE** Each notification within the array operates independently - a task + * can only block on one notification within the array at a time and will not be + * unblocked by a notification sent to any other array index. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. xTaskNotifyWait() is the original API function, and remains backward + * compatible by always operating on the notification value at index 0 in the + * array. Calling xTaskNotifyWait() is equivalent to calling + * xTaskNotifyWaitIndexed() with the uxIndexToWaitOn parameter set to 0. + * + * @param uxIndexToWaitOn The index within the calling task's array of + * notification values on which the calling task will wait for a notification to + * be received. uxIndexToWaitOn must be less than + * configTASK_NOTIFICATION_ARRAY_ENTRIES. xTaskNotifyWait() does + * not have this parameter and always waits for notifications on index 0. + * + * @param ulBitsToClearOnEntry Bits that are set in ulBitsToClearOnEntry value + * will be cleared in the calling task's notification value before the task + * checks to see if any notifications are pending, and optionally blocks if no + * notifications are pending. Setting ulBitsToClearOnEntry to ULONG_MAX (if + * limits.h is included) or 0xffffffffUL (if limits.h is not included) will have + * the effect of resetting the task's notification value to 0. Setting + * ulBitsToClearOnEntry to 0 will leave the task's notification value unchanged. + * + * @param ulBitsToClearOnExit If a notification is pending or received before + * the calling task exits the xTaskNotifyWait() function then the task's + * notification value (see the xTaskNotify() API function) is passed out using + * the pulNotificationValue parameter. Then any bits that are set in + * ulBitsToClearOnExit will be cleared in the task's notification value (note + * *pulNotificationValue is set before any bits are cleared). Setting + * ulBitsToClearOnExit to ULONG_MAX (if limits.h is included) or 0xffffffffUL + * (if limits.h is not included) will have the effect of resetting the task's + * notification value to 0 before the function exits. Setting + * ulBitsToClearOnExit to 0 will leave the task's notification value unchanged + * when the function exits (in which case the value passed out in + * pulNotificationValue will match the task's notification value). + * + * @param pulNotificationValue Used to pass the task's notification value out + * of the function. Note the value passed out will not be effected by the + * clearing of any bits caused by ulBitsToClearOnExit being non-zero. + * + * @param xTicksToWait The maximum amount of time that the task should wait in + * the Blocked state for a notification to be received, should a notification + * not already be pending when xTaskNotifyWait() was called. The task + * will not consume any processing time while it is in the Blocked state. This + * is specified in kernel ticks, the macro pdMS_TO_TICKS( value_in_ms ) can be + * used to convert a time specified in milliseconds to a time specified in + * ticks. + * + * @return If a notification was received (including notifications that were + * already pending when xTaskNotifyWait was called) then pdPASS is + * returned. Otherwise pdFAIL is returned. + * + * \defgroup xTaskNotifyWaitIndexed xTaskNotifyWaitIndexed + * \ingroup TaskNotifications + */ +BaseType_t xTaskGenericNotifyWait( UBaseType_t uxIndexToWaitOn, + uint32_t ulBitsToClearOnEntry, + uint32_t ulBitsToClearOnExit, + uint32_t * pulNotificationValue, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +#define xTaskNotifyWait( ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait ) \ + xTaskGenericNotifyWait( tskDEFAULT_INDEX_TO_NOTIFY, ( ulBitsToClearOnEntry ), ( ulBitsToClearOnExit ), ( pulNotificationValue ), ( xTicksToWait ) ) +#define xTaskNotifyWaitIndexed( uxIndexToWaitOn, ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait ) \ + xTaskGenericNotifyWait( ( uxIndexToWaitOn ), ( ulBitsToClearOnEntry ), ( ulBitsToClearOnExit ), ( pulNotificationValue ), ( xTicksToWait ) ) + +/** + * task. h + * @code{c} + * BaseType_t xTaskNotifyGiveIndexed( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify ); + * BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify ); + * @endcode + * + * Sends a direct to task notification to a particular index in the target + * task's notification array in a manner similar to giving a counting semaphore. + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for more details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these + * macros to be available. + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment one of the task's notification values. In + * that way task notifications can be used to send data to a task, or be used as + * light weight and fast binary or counting semaphores. + * + * xTaskNotifyGiveIndexed() is a helper macro intended for use when task + * notifications are used as light weight and faster binary or counting + * semaphore equivalents. Actual FreeRTOS semaphores are given using the + * xSemaphoreGive() API function, the equivalent action that instead uses a task + * notification is xTaskNotifyGiveIndexed(). + * + * When task notifications are being used as a binary or counting semaphore + * equivalent then the task being notified should wait for the notification + * using the ulTaskNotifyTakeIndexed() API function rather than the + * xTaskNotifyWaitIndexed() API function. + * + * **NOTE** Each notification within the array operates independently - a task + * can only block on one notification within the array at a time and will not be + * unblocked by a notification sent to any other array index. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. xTaskNotifyGive() is the original API function, and remains backward + * compatible by always operating on the notification value at index 0 in the + * array. Calling xTaskNotifyGive() is equivalent to calling + * xTaskNotifyGiveIndexed() with the uxIndexToNotify parameter set to 0. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @param uxIndexToNotify The index within the target task's array of + * notification values to which the notification is to be sent. uxIndexToNotify + * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES. xTaskNotifyGive() + * does not have this parameter and always sends notifications to index 0. + * + * @return xTaskNotifyGive() is a macro that calls xTaskNotify() with the + * eAction parameter set to eIncrement - so pdPASS is always returned. + * + * \defgroup xTaskNotifyGiveIndexed xTaskNotifyGiveIndexed + * \ingroup TaskNotifications + */ +#define xTaskNotifyGive( xTaskToNotify ) \ + xTaskGenericNotify( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( 0 ), eIncrement, NULL ) +#define xTaskNotifyGiveIndexed( xTaskToNotify, uxIndexToNotify ) \ + xTaskGenericNotify( ( xTaskToNotify ), ( uxIndexToNotify ), ( 0 ), eIncrement, NULL ) + +/** + * task. h + * @code{c} + * void vTaskNotifyGiveIndexedFromISR( TaskHandle_t xTaskHandle, UBaseType_t uxIndexToNotify, BaseType_t *pxHigherPriorityTaskWoken ); + * void vTaskNotifyGiveFromISR( TaskHandle_t xTaskHandle, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * A version of xTaskNotifyGiveIndexed() that can be called from an interrupt + * service routine (ISR). + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for more details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this macro + * to be available. + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment one of the task's notification values. In + * that way task notifications can be used to send data to a task, or be used as + * light weight and fast binary or counting semaphores. + * + * vTaskNotifyGiveIndexedFromISR() is intended for use when task notifications + * are used as light weight and faster binary or counting semaphore equivalents. + * Actual FreeRTOS semaphores are given from an ISR using the + * xSemaphoreGiveFromISR() API function, the equivalent action that instead uses + * a task notification is vTaskNotifyGiveIndexedFromISR(). + * + * When task notifications are being used as a binary or counting semaphore + * equivalent then the task being notified should wait for the notification + * using the ulTaskNotifyTakeIndexed() API function rather than the + * xTaskNotifyWaitIndexed() API function. + * + * **NOTE** Each notification within the array operates independently - a task + * can only block on one notification within the array at a time and will not be + * unblocked by a notification sent to any other array index. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. xTaskNotifyFromISR() is the original API function, and remains + * backward compatible by always operating on the notification value at index 0 + * within the array. Calling xTaskNotifyGiveFromISR() is equivalent to calling + * xTaskNotifyGiveIndexedFromISR() with the uxIndexToNotify parameter set to 0. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @param uxIndexToNotify The index within the target task's array of + * notification values to which the notification is to be sent. uxIndexToNotify + * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES. + * xTaskNotifyGiveFromISR() does not have this parameter and always sends + * notifications to index 0. + * + * @param pxHigherPriorityTaskWoken vTaskNotifyGiveFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the + * task to which the notification was sent to leave the Blocked state, and the + * unblocked task has a priority higher than the currently running task. If + * vTaskNotifyGiveFromISR() sets this value to pdTRUE then a context switch + * should be requested before the interrupt is exited. How a context switch is + * requested from an ISR is dependent on the port - see the documentation page + * for the port in use. + * + * \defgroup vTaskNotifyGiveIndexedFromISR vTaskNotifyGiveIndexedFromISR + * \ingroup TaskNotifications + */ +void vTaskGenericNotifyGiveFromISR( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +#define vTaskNotifyGiveFromISR( xTaskToNotify, pxHigherPriorityTaskWoken ) \ + vTaskGenericNotifyGiveFromISR( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( pxHigherPriorityTaskWoken ) ) +#define vTaskNotifyGiveIndexedFromISR( xTaskToNotify, uxIndexToNotify, pxHigherPriorityTaskWoken ) \ + vTaskGenericNotifyGiveFromISR( ( xTaskToNotify ), ( uxIndexToNotify ), ( pxHigherPriorityTaskWoken ) ) + +/** + * task. h + * @code{c} + * uint32_t ulTaskNotifyTakeIndexed( UBaseType_t uxIndexToWaitOn, BaseType_t xClearCountOnExit, TickType_t xTicksToWait ); + * + * uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ); + * @endcode + * + * Waits for a direct to task notification on a particular index in the calling + * task's notification array in a manner similar to taking a counting semaphore. + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment one of the task's notification values. In + * that way task notifications can be used to send data to a task, or be used as + * light weight and fast binary or counting semaphores. + * + * ulTaskNotifyTakeIndexed() is intended for use when a task notification is + * used as a faster and lighter weight binary or counting semaphore alternative. + * Actual FreeRTOS semaphores are taken using the xSemaphoreTake() API function, + * the equivalent action that instead uses a task notification is + * ulTaskNotifyTakeIndexed(). + * + * When a task is using its notification value as a binary or counting semaphore + * other tasks should send notifications to it using the xTaskNotifyGiveIndexed() + * macro, or xTaskNotifyIndex() function with the eAction parameter set to + * eIncrement. + * + * ulTaskNotifyTakeIndexed() can either clear the task's notification value at + * the array index specified by the uxIndexToWaitOn parameter to zero on exit, + * in which case the notification value acts like a binary semaphore, or + * decrement the notification value on exit, in which case the notification + * value acts like a counting semaphore. + * + * A task can use ulTaskNotifyTakeIndexed() to [optionally] block to wait for + * a notification. The task does not consume any CPU time while it is in the + * Blocked state. + * + * Where as xTaskNotifyWaitIndexed() will return when a notification is pending, + * ulTaskNotifyTakeIndexed() will return when the task's notification value is + * not zero. + * + * **NOTE** Each notification within the array operates independently - a task + * can only block on one notification within the array at a time and will not be + * unblocked by a notification sent to any other array index. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. ulTaskNotifyTake() is the original API function, and remains backward + * compatible by always operating on the notification value at index 0 in the + * array. Calling ulTaskNotifyTake() is equivalent to calling + * ulTaskNotifyTakeIndexed() with the uxIndexToWaitOn parameter set to 0. + * + * @param uxIndexToWaitOn The index within the calling task's array of + * notification values on which the calling task will wait for a notification to + * be non-zero. uxIndexToWaitOn must be less than + * configTASK_NOTIFICATION_ARRAY_ENTRIES. xTaskNotifyTake() does + * not have this parameter and always waits for notifications on index 0. + * + * @param xClearCountOnExit if xClearCountOnExit is pdFALSE then the task's + * notification value is decremented when the function exits. In this way the + * notification value acts like a counting semaphore. If xClearCountOnExit is + * not pdFALSE then the task's notification value is cleared to zero when the + * function exits. In this way the notification value acts like a binary + * semaphore. + * + * @param xTicksToWait The maximum amount of time that the task should wait in + * the Blocked state for the task's notification value to be greater than zero, + * should the count not already be greater than zero when + * ulTaskNotifyTake() was called. The task will not consume any processing + * time while it is in the Blocked state. This is specified in kernel ticks, + * the macro pdMS_TO_TICKS( value_in_ms ) can be used to convert a time + * specified in milliseconds to a time specified in ticks. + * + * @return The task's notification count before it is either cleared to zero or + * decremented (see the xClearCountOnExit parameter). + * + * \defgroup ulTaskNotifyTakeIndexed ulTaskNotifyTakeIndexed + * \ingroup TaskNotifications + */ +uint32_t ulTaskGenericNotifyTake( UBaseType_t uxIndexToWaitOn, + BaseType_t xClearCountOnExit, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +#define ulTaskNotifyTake( xClearCountOnExit, xTicksToWait ) \ + ulTaskGenericNotifyTake( ( tskDEFAULT_INDEX_TO_NOTIFY ), ( xClearCountOnExit ), ( xTicksToWait ) ) +#define ulTaskNotifyTakeIndexed( uxIndexToWaitOn, xClearCountOnExit, xTicksToWait ) \ + ulTaskGenericNotifyTake( ( uxIndexToWaitOn ), ( xClearCountOnExit ), ( xTicksToWait ) ) + +/** + * task. h + * @code{c} + * BaseType_t xTaskNotifyStateClearIndexed( TaskHandle_t xTask, UBaseType_t uxIndexToCLear ); + * + * BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask ); + * @endcode + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these + * functions to be available. + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * If a notification is sent to an index within the array of notifications then + * the notification at that index is said to be 'pending' until it is read or + * explicitly cleared by the receiving task. xTaskNotifyStateClearIndexed() + * is the function that clears a pending notification without reading the + * notification value. The notification value at the same array index is not + * altered. Set xTask to NULL to clear the notification state of the calling + * task. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. xTaskNotifyStateClear() is the original API function, and remains + * backward compatible by always operating on the notification value at index 0 + * within the array. Calling xTaskNotifyStateClear() is equivalent to calling + * xTaskNotifyStateClearIndexed() with the uxIndexToNotify parameter set to 0. + * + * @param xTask The handle of the RTOS task that will have a notification state + * cleared. Set xTask to NULL to clear a notification state in the calling + * task. To obtain a task's handle create the task using xTaskCreate() and + * make use of the pxCreatedTask parameter, or create the task using + * xTaskCreateStatic() and store the returned value, or use the task's name in + * a call to xTaskGetHandle(). + * + * @param uxIndexToClear The index within the target task's array of + * notification values to act upon. For example, setting uxIndexToClear to 1 + * will clear the state of the notification at index 1 within the array. + * uxIndexToClear must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES. + * ulTaskNotifyStateClear() does not have this parameter and always acts on the + * notification at index 0. + * + * @return pdTRUE if the task's notification state was set to + * eNotWaitingNotification, otherwise pdFALSE. + * + * \defgroup xTaskNotifyStateClearIndexed xTaskNotifyStateClearIndexed + * \ingroup TaskNotifications + */ +BaseType_t xTaskGenericNotifyStateClear( TaskHandle_t xTask, + UBaseType_t uxIndexToClear ) PRIVILEGED_FUNCTION; +#define xTaskNotifyStateClear( xTask ) \ + xTaskGenericNotifyStateClear( ( xTask ), ( tskDEFAULT_INDEX_TO_NOTIFY ) ) +#define xTaskNotifyStateClearIndexed( xTask, uxIndexToClear ) \ + xTaskGenericNotifyStateClear( ( xTask ), ( uxIndexToClear ) ) + +/** + * task. h + * @code{c} + * uint32_t ulTaskNotifyValueClearIndexed( TaskHandle_t xTask, UBaseType_t uxIndexToClear, uint32_t ulBitsToClear ); + * + * uint32_t ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear ); + * @endcode + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these + * functions to be available. + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * ulTaskNotifyValueClearIndexed() clears the bits specified by the + * ulBitsToClear bit mask in the notification value at array index uxIndexToClear + * of the task referenced by xTask. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. ulTaskNotifyValueClear() is the original API function, and remains + * backward compatible by always operating on the notification value at index 0 + * within the array. Calling ulTaskNotifyValueClear() is equivalent to calling + * ulTaskNotifyValueClearIndexed() with the uxIndexToClear parameter set to 0. + * + * @param xTask The handle of the RTOS task that will have bits in one of its + * notification values cleared. Set xTask to NULL to clear bits in a + * notification value of the calling task. To obtain a task's handle create the + * task using xTaskCreate() and make use of the pxCreatedTask parameter, or + * create the task using xTaskCreateStatic() and store the returned value, or + * use the task's name in a call to xTaskGetHandle(). + * + * @param uxIndexToClear The index within the target task's array of + * notification values in which to clear the bits. uxIndexToClear + * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES. + * ulTaskNotifyValueClear() does not have this parameter and always clears bits + * in the notification value at index 0. + * + * @param ulBitsToClear Bit mask of the bits to clear in the notification value of + * xTask. Set a bit to 1 to clear the corresponding bits in the task's notification + * value. Set ulBitsToClear to 0xffffffff (UINT_MAX on 32-bit architectures) to clear + * the notification value to 0. Set ulBitsToClear to 0 to query the task's + * notification value without clearing any bits. + * + * + * @return The value of the target task's notification value before the bits + * specified by ulBitsToClear were cleared. + * \defgroup ulTaskNotifyValueClear ulTaskNotifyValueClear + * \ingroup TaskNotifications + */ +uint32_t ulTaskGenericNotifyValueClear( TaskHandle_t xTask, + UBaseType_t uxIndexToClear, + uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION; +#define ulTaskNotifyValueClear( xTask, ulBitsToClear ) \ + ulTaskGenericNotifyValueClear( ( xTask ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulBitsToClear ) ) +#define ulTaskNotifyValueClearIndexed( xTask, uxIndexToClear, ulBitsToClear ) \ + ulTaskGenericNotifyValueClear( ( xTask ), ( uxIndexToClear ), ( ulBitsToClear ) ) + +/** + * task.h + * @code{c} + * void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ); + * @endcode + * + * Capture the current time for future use with xTaskCheckForTimeOut(). + * + * @param pxTimeOut Pointer to a timeout object into which the current time + * is to be captured. The captured time includes the tick count and the number + * of times the tick count has overflowed since the system first booted. + * \defgroup vTaskSetTimeOutState vTaskSetTimeOutState + * \ingroup TaskCtrl + */ +void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION; + +/** + * task.h + * @code{c} + * BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ); + * @endcode + * + * Determines if pxTicksToWait ticks has passed since a time was captured + * using a call to vTaskSetTimeOutState(). The captured time includes the tick + * count and the number of times the tick count has overflowed. + * + * @param pxTimeOut The time status as captured previously using + * vTaskSetTimeOutState. If the timeout has not yet occurred, it is updated + * to reflect the current time status. + * @param pxTicksToWait The number of ticks to check for timeout i.e. if + * pxTicksToWait ticks have passed since pxTimeOut was last updated (either by + * vTaskSetTimeOutState() or xTaskCheckForTimeOut()), the timeout has occurred. + * If the timeout has not occurred, pxTicksToWait is updated to reflect the + * number of remaining ticks. + * + * @return If timeout has occurred, pdTRUE is returned. Otherwise pdFALSE is + * returned and pxTicksToWait is updated to reflect the number of remaining + * ticks. + * + * @see https://www.FreeRTOS.org/xTaskCheckForTimeOut.html + * + * Example Usage: + * @code{c} + * // Driver library function used to receive uxWantedBytes from an Rx buffer + * // that is filled by a UART interrupt. If there are not enough bytes in the + * // Rx buffer then the task enters the Blocked state until it is notified that + * // more data has been placed into the buffer. If there is still not enough + * // data then the task re-enters the Blocked state, and xTaskCheckForTimeOut() + * // is used to re-calculate the Block time to ensure the total amount of time + * // spent in the Blocked state does not exceed MAX_TIME_TO_WAIT. This + * // continues until either the buffer contains at least uxWantedBytes bytes, + * // or the total amount of time spent in the Blocked state reaches + * // MAX_TIME_TO_WAIT - at which point the task reads however many bytes are + * // available up to a maximum of uxWantedBytes. + * + * size_t xUART_Receive( uint8_t *pucBuffer, size_t uxWantedBytes ) + * { + * size_t uxReceived = 0; + * TickType_t xTicksToWait = MAX_TIME_TO_WAIT; + * TimeOut_t xTimeOut; + * + * // Initialize xTimeOut. This records the time at which this function + * // was entered. + * vTaskSetTimeOutState( &xTimeOut ); + * + * // Loop until the buffer contains the wanted number of bytes, or a + * // timeout occurs. + * while( UART_bytes_in_rx_buffer( pxUARTInstance ) < uxWantedBytes ) + * { + * // The buffer didn't contain enough data so this task is going to + * // enter the Blocked state. Adjusting xTicksToWait to account for + * // any time that has been spent in the Blocked state within this + * // function so far to ensure the total amount of time spent in the + * // Blocked state does not exceed MAX_TIME_TO_WAIT. + * if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) != pdFALSE ) + * { + * //Timed out before the wanted number of bytes were available, + * // exit the loop. + * break; + * } + * + * // Wait for a maximum of xTicksToWait ticks to be notified that the + * // receive interrupt has placed more data into the buffer. + * ulTaskNotifyTake( pdTRUE, xTicksToWait ); + * } + * + * // Attempt to read uxWantedBytes from the receive buffer into pucBuffer. + * // The actual number of bytes read (which might be less than + * // uxWantedBytes) is returned. + * uxReceived = UART_read_from_receive_buffer( pxUARTInstance, + * pucBuffer, + * uxWantedBytes ); + * + * return uxReceived; + * } + * @endcode + * \defgroup xTaskCheckForTimeOut xTaskCheckForTimeOut + * \ingroup TaskCtrl + */ +BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, + TickType_t * const pxTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * task.h + * @code{c} + * BaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp ); + * @endcode + * + * This function corrects the tick count value after the application code has held + * interrupts disabled for an extended period resulting in tick interrupts having + * been missed. + * + * This function is similar to vTaskStepTick(), however, unlike + * vTaskStepTick(), xTaskCatchUpTicks() may move the tick count forward past a + * time at which a task should be removed from the blocked state. That means + * tasks may have to be removed from the blocked state as the tick count is + * moved. + * + * @param xTicksToCatchUp The number of tick interrupts that have been missed due to + * interrupts being disabled. Its value is not computed automatically, so must be + * computed by the application writer. + * + * @return pdTRUE if moving the tick count forward resulted in a task leaving the + * blocked state and a context switch being performed. Otherwise pdFALSE. + * + * \defgroup xTaskCatchUpTicks xTaskCatchUpTicks + * \ingroup TaskCtrl + */ +BaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) PRIVILEGED_FUNCTION; + + +/*----------------------------------------------------------- +* SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES +*----------------------------------------------------------*/ + +#if ( configNUMBER_OF_CORES == 1 ) + #define taskYIELD_WITHIN_API() portYIELD_WITHIN_API() +#else /* #if ( configNUMBER_OF_CORES == 1 ) */ + #define taskYIELD_WITHIN_API() vTaskYieldWithinAPI() +#endif /* #if ( configNUMBER_OF_CORES == 1 ) */ + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY + * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS + * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * Called from the real time kernel tick (either preemptive or cooperative), + * this increments the tick count and checks if any tasks that are blocked + * for a finite period required removing from a blocked list and placing on + * a ready list. If a non-zero value is returned then a context switch is + * required because either: + * + A task was removed from a blocked list because its timeout had expired, + * or + * + Time slicing is in use and there is a task of equal priority to the + * currently running task. + */ +BaseType_t xTaskIncrementTick( void ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * Removes the calling task from the ready list and places it both + * on the list of tasks waiting for a particular event, and the + * list of delayed tasks. The task will be removed from both lists + * and replaced on the ready list should either the event occur (and + * there be no higher priority tasks waiting on the same event) or + * the delay period expires. + * + * The 'unordered' version replaces the event list item value with the + * xItemValue value, and inserts the list item at the end of the list. + * + * The 'ordered' version uses the existing event list item value (which is the + * owning task's priority) to insert the list item into the event list in task + * priority order. + * + * @param pxEventList The list containing tasks that are blocked waiting + * for the event to occur. + * + * @param xItemValue The item value to use for the event list item when the + * event list is not ordered by task priority. + * + * @param xTicksToWait The maximum amount of time that the task should wait + * for the event to occur. This is specified in kernel ticks, the constant + * portTICK_PERIOD_MS can be used to convert kernel ticks into a real time + * period. + */ +void vTaskPlaceOnEventList( List_t * const pxEventList, + const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +void vTaskPlaceOnUnorderedEventList( List_t * pxEventList, + const TickType_t xItemValue, + const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * This function performs nearly the same function as vTaskPlaceOnEventList(). + * The difference being that this function does not permit tasks to block + * indefinitely, whereas vTaskPlaceOnEventList() does. + * + */ +void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, + TickType_t xTicksToWait, + const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * Removes a task from both the specified event list and the list of blocked + * tasks, and places it on a ready queue. + * + * xTaskRemoveFromEventList()/vTaskRemoveFromUnorderedEventList() will be called + * if either an event occurs to unblock a task, or the block timeout period + * expires. + * + * xTaskRemoveFromEventList() is used when the event list is in task priority + * order. It removes the list item from the head of the event list as that will + * have the highest priority owning task of all the tasks on the event list. + * vTaskRemoveFromUnorderedEventList() is used when the event list is not + * ordered and the event list items hold something other than the owning tasks + * priority. In this case the event list item value is updated to the value + * passed in the xItemValue parameter. + * + * @return pdTRUE if the task being removed has a higher priority than the task + * making the call, otherwise pdFALSE. + */ +BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList ) PRIVILEGED_FUNCTION; +void vTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, + const TickType_t xItemValue ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY + * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS + * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * Sets the pointer to the current TCB to the TCB of the highest priority task + * that is ready to run. + */ +#if ( configNUMBER_OF_CORES == 1 ) + portDONT_DISCARD void vTaskSwitchContext( void ) PRIVILEGED_FUNCTION; +#else + portDONT_DISCARD void vTaskSwitchContext( BaseType_t xCoreID ) PRIVILEGED_FUNCTION; +#endif + +/* + * THESE FUNCTIONS MUST NOT BE USED FROM APPLICATION CODE. THEY ARE USED BY + * THE EVENT BITS MODULE. + */ +TickType_t uxTaskResetEventItemValue( void ) PRIVILEGED_FUNCTION; + +/* + * Return the handle of the calling task. + */ +TaskHandle_t xTaskGetCurrentTaskHandle( void ) PRIVILEGED_FUNCTION; + +/* + * Return the handle of the task running on specified core. + */ +#if ( configNUMBER_OF_CORES > 1 ) + TaskHandle_t xTaskGetCurrentTaskHandleForCore( BaseType_t xCoreID ) PRIVILEGED_FUNCTION; +#endif + +/* + * Shortcut used by the queue implementation to prevent unnecessary call to + * taskYIELD(); + */ +void vTaskMissedYield( void ) PRIVILEGED_FUNCTION; + +/* + * Returns the scheduler state as taskSCHEDULER_RUNNING, + * taskSCHEDULER_NOT_STARTED or taskSCHEDULER_SUSPENDED. + */ +BaseType_t xTaskGetSchedulerState( void ) PRIVILEGED_FUNCTION; + +/* + * Raises the priority of the mutex holder to that of the calling task should + * the mutex holder have a priority less than the calling task. + */ +BaseType_t xTaskPriorityInherit( TaskHandle_t const pxMutexHolder ) PRIVILEGED_FUNCTION; + +/* + * Set the priority of a task back to its proper priority in the case that it + * inherited a higher priority while it was holding a semaphore. + */ +BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder ) PRIVILEGED_FUNCTION; + +/* + * If a higher priority task attempting to obtain a mutex caused a lower + * priority task to inherit the higher priority task's priority - but the higher + * priority task then timed out without obtaining the mutex, then the lower + * priority task will disinherit the priority again - but only down as far as + * the highest priority task that is still waiting for the mutex (if there were + * more than one task waiting for the mutex). + */ +void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, + UBaseType_t uxHighestPriorityWaitingTask ) PRIVILEGED_FUNCTION; + +/* + * Get the uxTaskNumber assigned to the task referenced by the xTask parameter. + */ +#if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; +#endif + +/* + * Set the uxTaskNumber of the task referenced by the xTask parameter to + * uxHandle. + */ +#if ( configUSE_TRACE_FACILITY == 1 ) + void vTaskSetTaskNumber( TaskHandle_t xTask, + const UBaseType_t uxHandle ) PRIVILEGED_FUNCTION; +#endif + +/* + * Only available when configUSE_TICKLESS_IDLE is set to 1. + * If tickless mode is being used, or a low power mode is implemented, then + * the tick interrupt will not execute during idle periods. When this is the + * case, the tick count value maintained by the scheduler needs to be kept up + * to date with the actual execution time by being skipped forward by a time + * equal to the idle period. + */ +#if ( configUSE_TICKLESS_IDLE != 0 ) + void vTaskStepTick( TickType_t xTicksToJump ) PRIVILEGED_FUNCTION; +#endif + +/* + * Only available when configUSE_TICKLESS_IDLE is set to 1. + * Provided for use within portSUPPRESS_TICKS_AND_SLEEP() to allow the port + * specific sleep function to determine if it is ok to proceed with the sleep, + * and if it is ok to proceed, if it is ok to sleep indefinitely. + * + * This function is necessary because portSUPPRESS_TICKS_AND_SLEEP() is only + * called with the scheduler suspended, not from within a critical section. It + * is therefore possible for an interrupt to request a context switch between + * portSUPPRESS_TICKS_AND_SLEEP() and the low power mode actually being + * entered. eTaskConfirmSleepModeStatus() should be called from a short + * critical section between the timer being stopped and the sleep mode being + * entered to ensure it is ok to proceed into the sleep mode. + */ +#if ( configUSE_TICKLESS_IDLE != 0 ) + eSleepModeStatus eTaskConfirmSleepModeStatus( void ) PRIVILEGED_FUNCTION; +#endif + +/* + * For internal use only. Increment the mutex held count when a mutex is + * taken and return the handle of the task that has taken the mutex. + */ +TaskHandle_t pvTaskIncrementMutexHeldCount( void ) PRIVILEGED_FUNCTION; + +/* + * For internal use only. Same as vTaskSetTimeOutState(), but without a critical + * section. + */ +void vTaskInternalSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION; + +/* + * For internal use only. Same as portYIELD_WITHIN_API() in single core FreeRTOS. + * For SMP this is not defined by the port. + */ +#if ( configNUMBER_OF_CORES > 1 ) + void vTaskYieldWithinAPI( void ); +#endif + +/* + * This function is only intended for use when implementing a port of the scheduler + * and is only available when portCRITICAL_NESTING_IN_TCB is set to 1 or configNUMBER_OF_CORES + * is greater than 1. This function can be used in the implementation of portENTER_CRITICAL + * if port wants to maintain critical nesting count in TCB in single core FreeRTOS. + * It should be used in the implementation of portENTER_CRITICAL if port is running a + * multiple core FreeRTOS. + */ +#if ( ( portCRITICAL_NESTING_IN_TCB == 1 ) || ( configNUMBER_OF_CORES > 1 ) ) + void vTaskEnterCritical( void ); +#endif + +/* + * This function is only intended for use when implementing a port of the scheduler + * and is only available when portCRITICAL_NESTING_IN_TCB is set to 1 or configNUMBER_OF_CORES + * is greater than 1. This function can be used in the implementation of portEXIT_CRITICAL + * if port wants to maintain critical nesting count in TCB in single core FreeRTOS. + * It should be used in the implementation of portEXIT_CRITICAL if port is running a + * multiple core FreeRTOS. + */ +#if ( ( portCRITICAL_NESTING_IN_TCB == 1 ) || ( configNUMBER_OF_CORES > 1 ) ) + void vTaskExitCritical( void ); +#endif + +/* + * This function is only intended for use when implementing a port of the scheduler + * and is only available when configNUMBER_OF_CORES is greater than 1. This function + * should be used in the implementation of portENTER_CRITICAL_FROM_ISR if port is + * running a multiple core FreeRTOS. + */ +#if ( configNUMBER_OF_CORES > 1 ) + UBaseType_t vTaskEnterCriticalFromISR( void ); +#endif + +/* + * This function is only intended for use when implementing a port of the scheduler + * and is only available when configNUMBER_OF_CORES is greater than 1. This function + * should be used in the implementation of portEXIT_CRITICAL_FROM_ISR if port is + * running a multiple core FreeRTOS. + */ +#if ( configNUMBER_OF_CORES > 1 ) + void vTaskExitCriticalFromISR( UBaseType_t uxSavedInterruptStatus ); +#endif + +#if ( portUSING_MPU_WRAPPERS == 1 ) + +/* + * For internal use only. Get MPU settings associated with a task. + */ + xMPU_SETTINGS * xTaskGetMPUSettings( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +#endif /* portUSING_MPU_WRAPPERS */ + + +#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) && ( configENABLE_ACCESS_CONTROL_LIST == 1 ) ) + +/* + * For internal use only. Grant/Revoke a task's access to a kernel object. + */ + void vGrantAccessToKernelObject( TaskHandle_t xExternalTaskHandle, + int32_t lExternalKernelObjectHandle ) PRIVILEGED_FUNCTION; + void vRevokeAccessToKernelObject( TaskHandle_t xExternalTaskHandle, + int32_t lExternalKernelObjectHandle ) PRIVILEGED_FUNCTION; + +/* + * For internal use only. Grant/Revoke a task's access to a kernel object. + */ + void vPortGrantAccessToKernelObject( TaskHandle_t xInternalTaskHandle, + int32_t lInternalIndexOfKernelObject ) PRIVILEGED_FUNCTION; + void vPortRevokeAccessToKernelObject( TaskHandle_t xInternalTaskHandle, + int32_t lInternalIndexOfKernelObject ) PRIVILEGED_FUNCTION; + +#endif /* #if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) && ( configENABLE_ACCESS_CONTROL_LIST == 1 ) ) */ + +#if 1 /* << EST */ +/*! + \brief Collects all the task handles present in the system and stores them in to an array of task handles. + \param pxTaskHandleArray Pointer to an array of task handles where the handles will be stored. + \param xNofTaskHandlesInArray Number of task handles in the array. + \return Number of task handles stored in array. + */ +UBaseType_t xGetTaskHandles(TaskHandle_t pxTaskHandleArray[], UBaseType_t xNofTaskHandlesInArray); + +/*! + * \brief Returns stack information about the given task handle. + * \param xTask Task handle + * \param ppxStart Returns the start of the stack area. This is the 'bottom' of the stack, with the stack pointer growing to the 'top'. + * \param ppxEnd Returns the end of the stack area. This is the 'top' of the stack where the stack pointer grows to. + * \param ppxTopOfStack Returns the current stack pointer value. + * \param pucStaticallyAllocated 0, if statically allocated, !=0 if allocated dynamically + */ +void vTaskGetStackInfo(TaskHandle_t xTask, StackType_t **ppxStart, StackType_t **ppxEnd, StackType_t **ppxTopOfStack, uint8_t *pucStaticallyAllocated); + +/*! + * \brief Return a pointer to the task start + * \param xTask Task handle + */ +uint8_t* pxTaskGetStackStart(TaskHandle_t xTask); +#endif + +/* *INDENT-OFF* */ + +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ +#endif /* INC_TASK_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/timers.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/timers.h new file mode 100644 index 0000000..fa6bd09 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/include/timers.h @@ -0,0 +1,1426 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef TIMERS_H +#define TIMERS_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include timers.h" +#endif + +#include "task.h" + + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/*----------------------------------------------------------- +* MACROS AND DEFINITIONS +*----------------------------------------------------------*/ + +/* IDs for commands that can be sent/received on the timer queue. These are to + * be used solely through the macros that make up the public software timer API, + * as defined below. The commands that are sent from interrupts must use the + * highest numbers as tmrFIRST_FROM_ISR_COMMAND is used to determine if the task + * or interrupt version of the queue send function should be used. */ +#define tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR ( ( BaseType_t ) -2 ) +#define tmrCOMMAND_EXECUTE_CALLBACK ( ( BaseType_t ) -1 ) +#define tmrCOMMAND_START_DONT_TRACE ( ( BaseType_t ) 0 ) +#define tmrCOMMAND_START ( ( BaseType_t ) 1 ) +#define tmrCOMMAND_RESET ( ( BaseType_t ) 2 ) +#define tmrCOMMAND_STOP ( ( BaseType_t ) 3 ) +#define tmrCOMMAND_CHANGE_PERIOD ( ( BaseType_t ) 4 ) +#define tmrCOMMAND_DELETE ( ( BaseType_t ) 5 ) + +#define tmrFIRST_FROM_ISR_COMMAND ( ( BaseType_t ) 6 ) +#define tmrCOMMAND_START_FROM_ISR ( ( BaseType_t ) 6 ) +#define tmrCOMMAND_RESET_FROM_ISR ( ( BaseType_t ) 7 ) +#define tmrCOMMAND_STOP_FROM_ISR ( ( BaseType_t ) 8 ) +#define tmrCOMMAND_CHANGE_PERIOD_FROM_ISR ( ( BaseType_t ) 9 ) + + +/** + * Type by which software timers are referenced. For example, a call to + * xTimerCreate() returns an TimerHandle_t variable that can then be used to + * reference the subject timer in calls to other software timer API functions + * (for example, xTimerStart(), xTimerReset(), etc.). + */ +struct tmrTimerControl; /* The old naming convention is used to prevent breaking kernel aware debuggers. */ +typedef struct tmrTimerControl * TimerHandle_t; + +/* + * Defines the prototype to which timer callback functions must conform. + */ +typedef void (* TimerCallbackFunction_t)( TimerHandle_t xTimer ); + +/* + * Defines the prototype to which functions used with the + * xTimerPendFunctionCallFromISR() function must conform. + */ +typedef void (* PendedFunction_t)( void * arg1, + uint32_t arg2 ); + +/** + * TimerHandle_t xTimerCreate( const char * const pcTimerName, + * TickType_t xTimerPeriodInTicks, + * BaseType_t xAutoReload, + * void * pvTimerID, + * TimerCallbackFunction_t pxCallbackFunction ); + * + * Creates a new software timer instance, and returns a handle by which the + * created software timer can be referenced. + * + * Internally, within the FreeRTOS implementation, software timers use a block + * of memory, in which the timer data structure is stored. If a software timer + * is created using xTimerCreate() then the required memory is automatically + * dynamically allocated inside the xTimerCreate() function. (see + * https://www.FreeRTOS.org/a00111.html). If a software timer is created using + * xTimerCreateStatic() then the application writer must provide the memory that + * will get used by the software timer. xTimerCreateStatic() therefore allows a + * software timer to be created without using any dynamic memory allocation. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a + * timer into the active state. + * + * @param pcTimerName A text name that is assigned to the timer. This is done + * purely to assist debugging. The kernel itself only ever references a timer + * by its handle, and never by its name. + * + * @param xTimerPeriodInTicks The timer period. The time is defined in tick + * periods so the constant portTICK_PERIOD_MS can be used to convert a time that + * has been specified in milliseconds. For example, if the timer must expire + * after 100 ticks, then xTimerPeriodInTicks should be set to 100. + * Alternatively, if the timer must expire after 500ms, then xPeriod can be set + * to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or + * equal to 1000. Time timer period must be greater than 0. + * + * @param xAutoReload If xAutoReload is set to pdTRUE then the timer will + * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter. + * If xAutoReload is set to pdFALSE then the timer will be a one-shot timer and + * enter the dormant state after it expires. + * + * @param pvTimerID An identifier that is assigned to the timer being created. + * Typically this would be used in the timer callback function to identify which + * timer expired when the same callback function is assigned to more than one + * timer. + * + * @param pxCallbackFunction The function to call when the timer expires. + * Callback functions must have the prototype defined by TimerCallbackFunction_t, + * which is "void vCallbackFunction( TimerHandle_t xTimer );". + * + * @return If the timer is successfully created then a handle to the newly + * created timer is returned. If the timer cannot be created because there is + * insufficient FreeRTOS heap remaining to allocate the timer + * structures then NULL is returned. + * + * Example usage: + * @verbatim + * #define NUM_TIMERS 5 + * + * // An array to hold handles to the created timers. + * TimerHandle_t xTimers[ NUM_TIMERS ]; + * + * // An array to hold a count of the number of times each timer expires. + * int32_t lExpireCounters[ NUM_TIMERS ] = { 0 }; + * + * // Define a callback function that will be used by multiple timer instances. + * // The callback function does nothing but count the number of times the + * // associated timer expires, and stop the timer once the timer has expired + * // 10 times. + * void vTimerCallback( TimerHandle_t pxTimer ) + * { + * int32_t lArrayIndex; + * const int32_t xMaxExpiryCountBeforeStopping = 10; + * + * // Optionally do something if the pxTimer parameter is NULL. + * configASSERT( pxTimer ); + * + * // Which timer expired? + * lArrayIndex = ( int32_t ) pvTimerGetTimerID( pxTimer ); + * + * // Increment the number of times that pxTimer has expired. + * lExpireCounters[ lArrayIndex ] += 1; + * + * // If the timer has expired 10 times then stop it from running. + * if( lExpireCounters[ lArrayIndex ] == xMaxExpiryCountBeforeStopping ) + * { + * // Do not use a block time if calling a timer API function from a + * // timer callback function, as doing so could cause a deadlock! + * xTimerStop( pxTimer, 0 ); + * } + * } + * + * void main( void ) + * { + * int32_t x; + * + * // Create then start some timers. Starting the timers before the scheduler + * // has been started means the timers will start running immediately that + * // the scheduler starts. + * for( x = 0; x < NUM_TIMERS; x++ ) + * { + * xTimers[ x ] = xTimerCreate( "Timer", // Just a text name, not used by the kernel. + * ( 100 * ( x + 1 ) ), // The timer period in ticks. + * pdTRUE, // The timers will auto-reload themselves when they expire. + * ( void * ) x, // Assign each timer a unique id equal to its array index. + * vTimerCallback // Each timer calls the same callback when it expires. + * ); + * + * if( xTimers[ x ] == NULL ) + * { + * // The timer was not created. + * } + * else + * { + * // Start the timer. No block time is specified, and even if one was + * // it would be ignored because the scheduler has not yet been + * // started. + * if( xTimerStart( xTimers[ x ], 0 ) != pdPASS ) + * { + * // The timer could not be set into the Active state. + * } + * } + * } + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timers running as they have already + * // been set into the active state. + * vTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + * @endverbatim + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + TimerHandle_t xTimerCreate( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const BaseType_t xAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction ) PRIVILEGED_FUNCTION; +#endif + +/** + * TimerHandle_t xTimerCreateStatic(const char * const pcTimerName, + * TickType_t xTimerPeriodInTicks, + * BaseType_t xAutoReload, + * void * pvTimerID, + * TimerCallbackFunction_t pxCallbackFunction, + * StaticTimer_t *pxTimerBuffer ); + * + * Creates a new software timer instance, and returns a handle by which the + * created software timer can be referenced. + * + * Internally, within the FreeRTOS implementation, software timers use a block + * of memory, in which the timer data structure is stored. If a software timer + * is created using xTimerCreate() then the required memory is automatically + * dynamically allocated inside the xTimerCreate() function. (see + * https://www.FreeRTOS.org/a00111.html). If a software timer is created using + * xTimerCreateStatic() then the application writer must provide the memory that + * will get used by the software timer. xTimerCreateStatic() therefore allows a + * software timer to be created without using any dynamic memory allocation. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a + * timer into the active state. + * + * @param pcTimerName A text name that is assigned to the timer. This is done + * purely to assist debugging. The kernel itself only ever references a timer + * by its handle, and never by its name. + * + * @param xTimerPeriodInTicks The timer period. The time is defined in tick + * periods so the constant portTICK_PERIOD_MS can be used to convert a time that + * has been specified in milliseconds. For example, if the timer must expire + * after 100 ticks, then xTimerPeriodInTicks should be set to 100. + * Alternatively, if the timer must expire after 500ms, then xPeriod can be set + * to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or + * equal to 1000. The timer period must be greater than 0. + * + * @param xAutoReload If xAutoReload is set to pdTRUE then the timer will + * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter. + * If xAutoReload is set to pdFALSE then the timer will be a one-shot timer and + * enter the dormant state after it expires. + * + * @param pvTimerID An identifier that is assigned to the timer being created. + * Typically this would be used in the timer callback function to identify which + * timer expired when the same callback function is assigned to more than one + * timer. + * + * @param pxCallbackFunction The function to call when the timer expires. + * Callback functions must have the prototype defined by TimerCallbackFunction_t, + * which is "void vCallbackFunction( TimerHandle_t xTimer );". + * + * @param pxTimerBuffer Must point to a variable of type StaticTimer_t, which + * will be then be used to hold the software timer's data structures, removing + * the need for the memory to be allocated dynamically. + * + * @return If the timer is created then a handle to the created timer is + * returned. If pxTimerBuffer was NULL then NULL is returned. + * + * Example usage: + * @verbatim + * + * // The buffer used to hold the software timer's data structure. + * static StaticTimer_t xTimerBuffer; + * + * // A variable that will be incremented by the software timer's callback + * // function. + * UBaseType_t uxVariableToIncrement = 0; + * + * // A software timer callback function that increments a variable passed to + * // it when the software timer was created. After the 5th increment the + * // callback function stops the software timer. + * static void prvTimerCallback( TimerHandle_t xExpiredTimer ) + * { + * UBaseType_t *puxVariableToIncrement; + * BaseType_t xReturned; + * + * // Obtain the address of the variable to increment from the timer ID. + * puxVariableToIncrement = ( UBaseType_t * ) pvTimerGetTimerID( xExpiredTimer ); + * + * // Increment the variable to show the timer callback has executed. + * ( *puxVariableToIncrement )++; + * + * // If this callback has executed the required number of times, stop the + * // timer. + * if( *puxVariableToIncrement == 5 ) + * { + * // This is called from a timer callback so must not block. + * xTimerStop( xExpiredTimer, staticDONT_BLOCK ); + * } + * } + * + * + * void main( void ) + * { + * // Create the software time. xTimerCreateStatic() has an extra parameter + * // than the normal xTimerCreate() API function. The parameter is a pointer + * // to the StaticTimer_t structure that will hold the software timer + * // structure. If the parameter is passed as NULL then the structure will be + * // allocated dynamically, just as if xTimerCreate() had been called. + * xTimer = xTimerCreateStatic( "T1", // Text name for the task. Helps debugging only. Not used by FreeRTOS. + * xTimerPeriod, // The period of the timer in ticks. + * pdTRUE, // This is an auto-reload timer. + * ( void * ) &uxVariableToIncrement, // A variable incremented by the software timer's callback function + * prvTimerCallback, // The function to execute when the timer expires. + * &xTimerBuffer ); // The buffer that will hold the software timer structure. + * + * // The scheduler has not started yet so a block time is not used. + * xReturned = xTimerStart( xTimer, 0 ); + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timers running as they have already + * // been set into the active state. + * vTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + * @endverbatim + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + TimerHandle_t xTimerCreateStatic( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const BaseType_t xAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + StaticTimer_t * pxTimerBuffer ) PRIVILEGED_FUNCTION; +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * void *pvTimerGetTimerID( TimerHandle_t xTimer ); + * + * Returns the ID assigned to the timer. + * + * IDs are assigned to timers using the pvTimerID parameter of the call to + * xTimerCreated() that was used to create the timer, and by calling the + * vTimerSetTimerID() API function. + * + * If the same callback function is assigned to multiple timers then the timer + * ID can be used as time specific (timer local) storage. + * + * @param xTimer The timer being queried. + * + * @return The ID assigned to the timer being queried. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + */ +void * pvTimerGetTimerID( const TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ); + * + * Sets the ID assigned to the timer. + * + * IDs are assigned to timers using the pvTimerID parameter of the call to + * xTimerCreated() that was used to create the timer. + * + * If the same callback function is assigned to multiple timers then the timer + * ID can be used as time specific (timer local) storage. + * + * @param xTimer The timer being updated. + * + * @param pvNewID The ID to assign to the timer. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + */ +void vTimerSetTimerID( TimerHandle_t xTimer, + void * pvNewID ) PRIVILEGED_FUNCTION; + +/** + * BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ); + * + * Queries a timer to see if it is active or dormant. + * + * A timer will be dormant if: + * 1) It has been created but not started, or + * 2) It is an expired one-shot timer that has not been restarted. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a timer into the + * active state. + * + * @param xTimer The timer being queried. + * + * @return pdFALSE will be returned if the timer is dormant. A value other than + * pdFALSE will be returned if the timer is active. + * + * Example usage: + * @verbatim + * // This function assumes xTimer has already been created. + * void vAFunction( TimerHandle_t xTimer ) + * { + * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" + * { + * // xTimer is active, do something. + * } + * else + * { + * // xTimer is not active, do something else. + * } + * } + * @endverbatim + */ +BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ); + * + * Simply returns the handle of the timer service/daemon task. It it not valid + * to call xTimerGetTimerDaemonTaskHandle() before the scheduler has been started. + */ +TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; + +/** + * BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerStart() starts a timer that was previously created using the + * xTimerCreate() API function. If the timer had already been started and was + * already in the active state, then xTimerStart() has equivalent functionality + * to the xTimerReset() API function. + * + * Starting a timer ensures the timer is in the active state. If the timer + * is not stopped, deleted, or reset in the mean time, the callback function + * associated with the timer will get called 'n' ticks after xTimerStart() was + * called, where 'n' is the timers defined period. + * + * It is valid to call xTimerStart() before the scheduler has been started, but + * when this is done the timer will not actually start until the scheduler is + * started, and the timers expiry time will be relative to when the scheduler is + * started, not relative to when xTimerStart() was called. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStart() + * to be available. + * + * @param xTimer The handle of the timer being started/restarted. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the start command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerStart() was called. xTicksToWait is ignored if xTimerStart() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the start command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system, although the + * timers expiry time is relative to when xTimerStart() is actually called. The + * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + * + */ +#define xTimerStart( xTimer, xTicksToWait ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerStop() stops a timer that was previously started using either of the + * The xTimerStart(), xTimerReset(), xTimerStartFromISR(), xTimerResetFromISR(), + * xTimerChangePeriod() or xTimerChangePeriodFromISR() API functions. + * + * Stopping a timer ensures the timer is not in the active state. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStop() + * to be available. + * + * @param xTimer The handle of the timer being stopped. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the stop command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerStop() was called. xTicksToWait is ignored if xTimerStop() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the stop command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + * + */ +#define xTimerStop( xTimer, xTicksToWait ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0U, NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerChangePeriod( TimerHandle_t xTimer, + * TickType_t xNewPeriod, + * TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerChangePeriod() changes the period of a timer that was previously + * created using the xTimerCreate() API function. + * + * xTimerChangePeriod() can be called to change the period of an active or + * dormant state timer. + * + * The configUSE_TIMERS configuration constant must be set to 1 for + * xTimerChangePeriod() to be available. + * + * @param xTimer The handle of the timer that is having its period changed. + * + * @param xNewPeriod The new period for xTimer. Timer periods are specified in + * tick periods, so the constant portTICK_PERIOD_MS can be used to convert a time + * that has been specified in milliseconds. For example, if the timer must + * expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively, + * if the timer must expire after 500ms, then xNewPeriod can be set to + * ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than + * or equal to 1000. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the change period command to be + * successfully sent to the timer command queue, should the queue already be + * full when xTimerChangePeriod() was called. xTicksToWait is ignored if + * xTimerChangePeriod() is called before the scheduler is started. + * + * @return pdFAIL will be returned if the change period command could not be + * sent to the timer command queue even after xTicksToWait ticks had passed. + * pdPASS will be returned if the command was successfully sent to the timer + * command queue. When the command is actually processed will depend on the + * priority of the timer service/daemon task relative to other tasks in the + * system. The timer service/daemon task priority is set by the + * configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This function assumes xTimer has already been created. If the timer + * // referenced by xTimer is already active when it is called, then the timer + * // is deleted. If the timer referenced by xTimer is not active when it is + * // called, then the period of the timer is set to 500ms and the timer is + * // started. + * void vAFunction( TimerHandle_t xTimer ) + * { + * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" + * { + * // xTimer is already active - delete it. + * xTimerDelete( xTimer ); + * } + * else + * { + * // xTimer is not active, change its period to 500ms. This will also + * // cause the timer to start. Block for a maximum of 100 ticks if the + * // change period command cannot immediately be sent to the timer + * // command queue. + * if( xTimerChangePeriod( xTimer, 500 / portTICK_PERIOD_MS, 100 ) == pdPASS ) + * { + * // The command was successfully sent. + * } + * else + * { + * // The command could not be sent, even after waiting for 100 ticks + * // to pass. Take appropriate action here. + * } + * } + * } + * @endverbatim + */ +#define xTimerChangePeriod( xTimer, xNewPeriod, xTicksToWait ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerDelete( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerDelete() deletes a timer that was previously created using the + * xTimerCreate() API function. + * + * The configUSE_TIMERS configuration constant must be set to 1 for + * xTimerDelete() to be available. + * + * @param xTimer The handle of the timer being deleted. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the delete command to be + * successfully sent to the timer command queue, should the queue already be + * full when xTimerDelete() was called. xTicksToWait is ignored if xTimerDelete() + * is called before the scheduler is started. + * + * @return pdFAIL will be returned if the delete command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerChangePeriod() API function example usage scenario. + */ +#define xTimerDelete( xTimer, xTicksToWait ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_DELETE, 0U, NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerReset() re-starts a timer that was previously created using the + * xTimerCreate() API function. If the timer had already been started and was + * already in the active state, then xTimerReset() will cause the timer to + * re-evaluate its expiry time so that it is relative to when xTimerReset() was + * called. If the timer was in the dormant state then xTimerReset() has + * equivalent functionality to the xTimerStart() API function. + * + * Resetting a timer ensures the timer is in the active state. If the timer + * is not stopped, deleted, or reset in the mean time, the callback function + * associated with the timer will get called 'n' ticks after xTimerReset() was + * called, where 'n' is the timers defined period. + * + * It is valid to call xTimerReset() before the scheduler has been started, but + * when this is done the timer will not actually start until the scheduler is + * started, and the timers expiry time will be relative to when the scheduler is + * started, not relative to when xTimerReset() was called. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerReset() + * to be available. + * + * @param xTimer The handle of the timer being reset/started/restarted. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the reset command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerReset() was called. xTicksToWait is ignored if xTimerReset() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the reset command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system, although the + * timers expiry time is relative to when xTimerStart() is actually called. The + * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * @verbatim + * // When a key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer. + * + * TimerHandle_t xBacklightTimer = NULL; + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press event handler. + * void vKeyPressEventHandler( char cKey ) + * { + * // Ensure the LCD back-light is on, then reset the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. Wait 10 ticks for the command to be successfully sent + * // if it cannot be sent immediately. + * vSetBacklightState( BACKLIGHT_ON ); + * if( xTimerReset( xBacklightTimer, 100 ) != pdPASS ) + * { + * // The reset command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * } + * + * void main( void ) + * { + * int32_t x; + * + * // Create then start the one-shot timer that is responsible for turning + * // the back-light off if no keys are pressed within a 5 second period. + * xBacklightTimer = xTimerCreate( "BacklightTimer", // Just a text name, not used by the kernel. + * ( 5000 / portTICK_PERIOD_MS), // The timer period in ticks. + * pdFALSE, // The timer is a one-shot timer. + * 0, // The id is not used by the callback so can take any value. + * vBacklightTimerCallback // The callback function that switches the LCD back-light off. + * ); + * + * if( xBacklightTimer == NULL ) + * { + * // The timer was not created. + * } + * else + * { + * // Start the timer. No block time is specified, and even if one was + * // it would be ignored because the scheduler has not yet been + * // started. + * if( xTimerStart( xBacklightTimer, 0 ) != pdPASS ) + * { + * // The timer could not be set into the Active state. + * } + * } + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timer running as it has already + * // been set into the active state. + * vTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + * @endverbatim + */ +#define xTimerReset( xTimer, xTicksToWait ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerStartFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerStart() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer being started/restarted. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerStartFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerStartFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerStartFromISR() function. If + * xTimerStartFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the start command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system, although the timers expiry time is + * relative to when xTimerStartFromISR() is actually called. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xBacklightTimer has already been created. When a + * // key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer, and unlike the example given for + * // the xTimerReset() function, the key press event handler is an interrupt + * // service routine. + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press interrupt service routine. + * void vKeyPressEventInterruptHandler( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // Ensure the LCD back-light is on, then restart the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. This is an interrupt service routine so can only + * // call FreeRTOS API functions that end in "FromISR". + * vSetBacklightState( BACKLIGHT_ON ); + * + * // xTimerStartFromISR() or xTimerResetFromISR() could be called here + * // as both cause the timer to re-calculate its expiry time. + * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was + * // declared (in this function). + * if( xTimerStartFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The start command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerStartFromISR( xTimer, pxHigherPriorityTaskWoken ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * BaseType_t xTimerStopFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerStop() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer being stopped. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerStopFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerStopFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerStopFromISR() function. If + * xTimerStopFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the stop command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system. The timer service/daemon task + * priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xTimer has already been created and started. When + * // an interrupt occurs, the timer should be simply stopped. + * + * // The interrupt service routine that stops the timer. + * void vAnExampleInterruptServiceRoutine( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // The interrupt has occurred - simply stop the timer. + * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined + * // (within this function). As this is an interrupt service routine, only + * // FreeRTOS API functions that end in "FromISR" can be used. + * if( xTimerStopFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The stop command was not executed successfully. Take appropriate + * // action here. + * } + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerStopFromISR( xTimer, pxHigherPriorityTaskWoken ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP_FROM_ISR, 0, ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * BaseType_t xTimerChangePeriodFromISR( TimerHandle_t xTimer, + * TickType_t xNewPeriod, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerChangePeriod() that can be called from an interrupt + * service routine. + * + * @param xTimer The handle of the timer that is having its period changed. + * + * @param xNewPeriod The new period for xTimer. Timer periods are specified in + * tick periods, so the constant portTICK_PERIOD_MS can be used to convert a time + * that has been specified in milliseconds. For example, if the timer must + * expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively, + * if the timer must expire after 500ms, then xNewPeriod can be set to + * ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than + * or equal to 1000. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerChangePeriodFromISR() writes a message to the + * timer command queue, so has the potential to transition the timer service/ + * daemon task out of the Blocked state. If calling xTimerChangePeriodFromISR() + * causes the timer service/daemon task to leave the Blocked state, and the + * timer service/daemon task has a priority equal to or greater than the + * currently executing task (the task that was interrupted), then + * *pxHigherPriorityTaskWoken will get set to pdTRUE internally within the + * xTimerChangePeriodFromISR() function. If xTimerChangePeriodFromISR() sets + * this value to pdTRUE then a context switch should be performed before the + * interrupt exits. + * + * @return pdFAIL will be returned if the command to change the timers period + * could not be sent to the timer command queue. pdPASS will be returned if the + * command was successfully sent to the timer command queue. When the command + * is actually processed will depend on the priority of the timer service/daemon + * task relative to other tasks in the system. The timer service/daemon task + * priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xTimer has already been created and started. When + * // an interrupt occurs, the period of xTimer should be changed to 500ms. + * + * // The interrupt service routine that changes the period of xTimer. + * void vAnExampleInterruptServiceRoutine( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // The interrupt has occurred - change the period of xTimer to 500ms. + * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined + * // (within this function). As this is an interrupt service routine, only + * // FreeRTOS API functions that end in "FromISR" can be used. + * if( xTimerChangePeriodFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The command to change the timers period was not executed + * // successfully. Take appropriate action here. + * } + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerChangePeriodFromISR( xTimer, xNewPeriod, pxHigherPriorityTaskWoken ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD_FROM_ISR, ( xNewPeriod ), ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * BaseType_t xTimerResetFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerReset() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer that is to be started, reset, or + * restarted. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerResetFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerResetFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerResetFromISR() function. If + * xTimerResetFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the reset command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system, although the timers expiry time is + * relative to when xTimerResetFromISR() is actually called. The timer service/daemon + * task priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xBacklightTimer has already been created. When a + * // key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer, and unlike the example given for + * // the xTimerReset() function, the key press event handler is an interrupt + * // service routine. + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press interrupt service routine. + * void vKeyPressEventInterruptHandler( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // Ensure the LCD back-light is on, then reset the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. This is an interrupt service routine so can only + * // call FreeRTOS API functions that end in "FromISR". + * vSetBacklightState( BACKLIGHT_ON ); + * + * // xTimerStartFromISR() or xTimerResetFromISR() could be called here + * // as both cause the timer to re-calculate its expiry time. + * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was + * // declared (in this function). + * if( xTimerResetFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The reset command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerResetFromISR( xTimer, pxHigherPriorityTaskWoken ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) + + +/** + * BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, + * void *pvParameter1, + * uint32_t ulParameter2, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * + * Used from application interrupt service routines to defer the execution of a + * function to the RTOS daemon task (the timer service task, hence this function + * is implemented in timers.c and is prefixed with 'Timer'). + * + * Ideally an interrupt service routine (ISR) is kept as short as possible, but + * sometimes an ISR either has a lot of processing to do, or needs to perform + * processing that is not deterministic. In these cases + * xTimerPendFunctionCallFromISR() can be used to defer processing of a function + * to the RTOS daemon task. + * + * A mechanism is provided that allows the interrupt to return directly to the + * task that will subsequently execute the pended callback function. This + * allows the callback function to execute contiguously in time with the + * interrupt - just as if the callback had executed in the interrupt itself. + * + * @param xFunctionToPend The function to execute from the timer service/ + * daemon task. The function must conform to the PendedFunction_t + * prototype. + * + * @param pvParameter1 The value of the callback function's first parameter. + * The parameter has a void * type to allow it to be used to pass any type. + * For example, unsigned longs can be cast to a void *, or the void * can be + * used to point to a structure. + * + * @param ulParameter2 The value of the callback function's second parameter. + * + * @param pxHigherPriorityTaskWoken As mentioned above, calling this function + * will result in a message being sent to the timer daemon task. If the + * priority of the timer daemon task (which is set using + * configTIMER_TASK_PRIORITY in FreeRTOSConfig.h) is higher than the priority of + * the currently running task (the task the interrupt interrupted) then + * *pxHigherPriorityTaskWoken will be set to pdTRUE within + * xTimerPendFunctionCallFromISR(), indicating that a context switch should be + * requested before the interrupt exits. For that reason + * *pxHigherPriorityTaskWoken must be initialised to pdFALSE. See the + * example code below. + * + * @return pdPASS is returned if the message was successfully sent to the + * timer daemon task, otherwise pdFALSE is returned. + * + * Example usage: + * @verbatim + * + * // The callback function that will execute in the context of the daemon task. + * // Note callback functions must all use this same prototype. + * void vProcessInterface( void *pvParameter1, uint32_t ulParameter2 ) + * { + * BaseType_t xInterfaceToService; + * + * // The interface that requires servicing is passed in the second + * // parameter. The first parameter is not used in this case. + * xInterfaceToService = ( BaseType_t ) ulParameter2; + * + * // ...Perform the processing here... + * } + * + * // An ISR that receives data packets from multiple interfaces + * void vAnISR( void ) + * { + * BaseType_t xInterfaceToService, xHigherPriorityTaskWoken; + * + * // Query the hardware to determine which interface needs processing. + * xInterfaceToService = prvCheckInterfaces(); + * + * // The actual processing is to be deferred to a task. Request the + * // vProcessInterface() callback function is executed, passing in the + * // number of the interface that needs processing. The interface to + * // service is passed in the second parameter. The first parameter is + * // not used in this case. + * xHigherPriorityTaskWoken = pdFALSE; + * xTimerPendFunctionCallFromISR( vProcessInterface, NULL, ( uint32_t ) xInterfaceToService, &xHigherPriorityTaskWoken ); + * + * // If xHigherPriorityTaskWoken is now set to pdTRUE then a context + * // switch should be requested. The macro used is port specific and will + * // be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - refer to + * // the documentation page for the port being used. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * + * } + * @endverbatim + */ +#if ( INCLUDE_xTimerPendFunctionCall == 1 ) + BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, + void * pvParameter1, + uint32_t ulParameter2, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +#endif + +/** + * BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, + * void *pvParameter1, + * uint32_t ulParameter2, + * TickType_t xTicksToWait ); + * + * + * Used to defer the execution of a function to the RTOS daemon task (the timer + * service task, hence this function is implemented in timers.c and is prefixed + * with 'Timer'). + * + * @param xFunctionToPend The function to execute from the timer service/ + * daemon task. The function must conform to the PendedFunction_t + * prototype. + * + * @param pvParameter1 The value of the callback function's first parameter. + * The parameter has a void * type to allow it to be used to pass any type. + * For example, unsigned longs can be cast to a void *, or the void * can be + * used to point to a structure. + * + * @param ulParameter2 The value of the callback function's second parameter. + * + * @param xTicksToWait Calling this function will result in a message being + * sent to the timer daemon task on a queue. xTicksToWait is the amount of + * time the calling task should remain in the Blocked state (so not using any + * processing time) for space to become available on the timer queue if the + * queue is found to be full. + * + * @return pdPASS is returned if the message was successfully sent to the + * timer daemon task, otherwise pdFALSE is returned. + * + */ +#if ( INCLUDE_xTimerPendFunctionCall == 1 ) + BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, + void * pvParameter1, + uint32_t ulParameter2, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +#endif + +/** + * const char * const pcTimerGetName( TimerHandle_t xTimer ); + * + * Returns the name that was assigned to a timer when the timer was created. + * + * @param xTimer The handle of the timer being queried. + * + * @return The name assigned to the timer specified by the xTimer parameter. + */ +const char * pcTimerGetName( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * void vTimerSetReloadMode( TimerHandle_t xTimer, const BaseType_t xAutoReload ); + * + * Updates a timer to be either an auto-reload timer, in which case the timer + * automatically resets itself each time it expires, or a one-shot timer, in + * which case the timer will only expire once unless it is manually restarted. + * + * @param xTimer The handle of the timer being updated. + * + * @param xAutoReload If xAutoReload is set to pdTRUE then the timer will + * expire repeatedly with a frequency set by the timer's period (see the + * xTimerPeriodInTicks parameter of the xTimerCreate() API function). If + * xAutoReload is set to pdFALSE then the timer will be a one-shot timer and + * enter the dormant state after it expires. + */ +void vTimerSetReloadMode( TimerHandle_t xTimer, + const BaseType_t xAutoReload ) PRIVILEGED_FUNCTION; + +/** + * BaseType_t xTimerGetReloadMode( TimerHandle_t xTimer ); + * + * Queries a timer to determine if it is an auto-reload timer, in which case the timer + * automatically resets itself each time it expires, or a one-shot timer, in + * which case the timer will only expire once unless it is manually restarted. + * + * @param xTimer The handle of the timer being queried. + * + * @return If the timer is an auto-reload timer then pdTRUE is returned, otherwise + * pdFALSE is returned. + */ +BaseType_t xTimerGetReloadMode( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer ); + * + * Queries a timer to determine if it is an auto-reload timer, in which case the timer + * automatically resets itself each time it expires, or a one-shot timer, in + * which case the timer will only expire once unless it is manually restarted. + * + * @param xTimer The handle of the timer being queried. + * + * @return If the timer is an auto-reload timer then pdTRUE is returned, otherwise + * pdFALSE is returned. + */ +UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * TickType_t xTimerGetPeriod( TimerHandle_t xTimer ); + * + * Returns the period of a timer. + * + * @param xTimer The handle of the timer being queried. + * + * @return The period of the timer in ticks. + */ +TickType_t xTimerGetPeriod( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ); + * + * Returns the time in ticks at which the timer will expire. If this is less + * than the current tick count then the expiry time has overflowed from the + * current time. + * + * @param xTimer The handle of the timer being queried. + * + * @return If the timer is running then the time in ticks at which the timer + * will next expire is returned. If the timer is not running then the return + * value is undefined. + */ +TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * BaseType_t xTimerGetStaticBuffer( TimerHandle_t xTimer, + * StaticTimer_t ** ppxTimerBuffer ); + * + * Retrieve pointer to a statically created timer's data structure + * buffer. This is the same buffer that is supplied at the time of + * creation. + * + * @param xTimer The timer for which to retrieve the buffer. + * + * @param ppxTaskBuffer Used to return a pointer to the timers's data + * structure buffer. + * + * @return pdTRUE if the buffer was retrieved, pdFALSE otherwise. + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + BaseType_t xTimerGetStaticBuffer( TimerHandle_t xTimer, + StaticTimer_t ** ppxTimerBuffer ) PRIVILEGED_FUNCTION; +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/* + * Functions beyond this part are not part of the public API and are intended + * for use by the kernel only. + */ +BaseType_t xTimerCreateTimerTask( void ) PRIVILEGED_FUNCTION; + +/* + * Splitting the xTimerGenericCommand into two sub functions and making it a macro + * removes a recursion path when called from ISRs. This is primarily for the XCore + * XCC port which detects the recursion path and throws an error during compilation + * when this is not split. + */ +BaseType_t xTimerGenericCommandFromTask( TimerHandle_t xTimer, + const BaseType_t xCommandID, + const TickType_t xOptionalValue, + BaseType_t * const pxHigherPriorityTaskWoken, + const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +BaseType_t xTimerGenericCommandFromISR( TimerHandle_t xTimer, + const BaseType_t xCommandID, + const TickType_t xOptionalValue, + BaseType_t * const pxHigherPriorityTaskWoken, + const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +#define xTimerGenericCommand( xTimer, xCommandID, xOptionalValue, pxHigherPriorityTaskWoken, xTicksToWait ) \ + ( ( xCommandID ) < tmrFIRST_FROM_ISR_COMMAND ? \ + xTimerGenericCommandFromTask( xTimer, xCommandID, xOptionalValue, pxHigherPriorityTaskWoken, xTicksToWait ) : \ + xTimerGenericCommandFromISR( xTimer, xCommandID, xOptionalValue, pxHigherPriorityTaskWoken, xTicksToWait ) ) +#if ( configUSE_TRACE_FACILITY == 1 ) + void vTimerSetTimerNumber( TimerHandle_t xTimer, + UBaseType_t uxTimerNumber ) PRIVILEGED_FUNCTION; + UBaseType_t uxTimerGetTimerNumber( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; +#endif + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + +/** + * task.h + * @code{c} + * void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer, StackType_t ** ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize ) + * @endcode + * + * This function is used to provide a statically allocated block of memory to FreeRTOS to hold the Timer Task TCB. This function is required when + * configSUPPORT_STATIC_ALLOCATION is set. For more information see this URI: https://www.FreeRTOS.org/a00110.html#configSUPPORT_STATIC_ALLOCATION + * + * @param ppxTimerTaskTCBBuffer A handle to a statically allocated TCB buffer + * @param ppxTimerTaskStackBuffer A handle to a statically allocated Stack buffer for the idle task + * @param pulTimerTaskStackSize A pointer to the number of elements that will fit in the allocated stack buffer + */ + void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer, + StackType_t ** ppxTimerTaskStackBuffer, + uint32_t * pulTimerTaskStackSize ); + +#endif + +#if ( configUSE_DAEMON_TASK_STARTUP_HOOK != 0 ) + +/** + * timers.h + * @code{c} + * void vApplicationDaemonTaskStartupHook( void ); + * @endcode + * + * This hook function is called form the timer task once when the task starts running. + */ + /* MISRA Ref 8.6.1 [External linkage] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-86 */ + /* coverity[misra_c_2012_rule_8_6_violation] */ + void vApplicationDaemonTaskStartupHook( void ); + +#endif + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ +#endif /* TIMERS_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/list.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/list.c new file mode 100644 index 0000000..7c21546 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/list.c @@ -0,0 +1,248 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "list.h" + +/* The MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be + * defined for the header files above, but not in this file, in order to + * generate the correct privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/*----------------------------------------------------------- +* PUBLIC LIST API documented in list.h +*----------------------------------------------------------*/ + +void vListInitialise( List_t * const pxList ) +{ + traceENTER_vListInitialise( pxList ); + + /* The list structure contains a list item which is used to mark the + * end of the list. To initialise the list the list end is inserted + * as the only list entry. */ + pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); + + listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( &( pxList->xListEnd ) ); + + /* The list end value is the highest possible value in the list to + * ensure it remains at the end of the list. */ + pxList->xListEnd.xItemValue = portMAX_DELAY; + + /* The list end next and previous pointers point to itself so we know + * when the list is empty. */ + pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd ); + pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd ); + + /* Initialize the remaining fields of xListEnd when it is a proper ListItem_t */ + #if ( configUSE_MINI_LIST_ITEM == 0 ) + { + pxList->xListEnd.pvOwner = NULL; + pxList->xListEnd.pxContainer = NULL; + listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( &( pxList->xListEnd ) ); + } + #endif + + pxList->uxNumberOfItems = ( UBaseType_t ) 0U; + + /* Write known values into the list if + * configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ); + listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ); + + traceRETURN_vListInitialise(); +} +/*-----------------------------------------------------------*/ + +void vListInitialiseItem( ListItem_t * const pxItem ) +{ + traceENTER_vListInitialiseItem( pxItem ); + + /* Make sure the list item is not recorded as being on a list. */ + pxItem->pxContainer = NULL; + + /* Write known values into the list item if + * configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); + listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); + + traceRETURN_vListInitialiseItem(); +} +/*-----------------------------------------------------------*/ + +void vListInsertEnd( List_t * const pxList, + ListItem_t * const pxNewListItem ) +{ + ListItem_t * const pxIndex = pxList->pxIndex; + + traceENTER_vListInsertEnd( pxList, pxNewListItem ); + + /* Only effective when configASSERT() is also defined, these tests may catch + * the list data structures being overwritten in memory. They will not catch + * data errors caused by incorrect configuration or use of FreeRTOS. */ + listTEST_LIST_INTEGRITY( pxList ); + listTEST_LIST_ITEM_INTEGRITY( pxNewListItem ); + + /* Insert a new list item into pxList, but rather than sort the list, + * makes the new list item the last item to be removed by a call to + * listGET_OWNER_OF_NEXT_ENTRY(). */ + pxNewListItem->pxNext = pxIndex; + pxNewListItem->pxPrevious = pxIndex->pxPrevious; + + /* Only used during decision coverage testing. */ + mtCOVERAGE_TEST_DELAY(); + + pxIndex->pxPrevious->pxNext = pxNewListItem; + pxIndex->pxPrevious = pxNewListItem; + + /* Remember which list the item is in. */ + pxNewListItem->pxContainer = pxList; + + ( pxList->uxNumberOfItems )++; + + traceRETURN_vListInsertEnd(); +} +/*-----------------------------------------------------------*/ + +void vListInsert( List_t * const pxList, + ListItem_t * const pxNewListItem ) +{ + ListItem_t * pxIterator; + const TickType_t xValueOfInsertion = pxNewListItem->xItemValue; + + traceENTER_vListInsert( pxList, pxNewListItem ); + + /* Only effective when configASSERT() is also defined, these tests may catch + * the list data structures being overwritten in memory. They will not catch + * data errors caused by incorrect configuration or use of FreeRTOS. */ + listTEST_LIST_INTEGRITY( pxList ); + listTEST_LIST_ITEM_INTEGRITY( pxNewListItem ); + + /* Insert the new list item into the list, sorted in xItemValue order. + * + * If the list already contains a list item with the same item value then the + * new list item should be placed after it. This ensures that TCBs which are + * stored in ready lists (all of which have the same xItemValue value) get a + * share of the CPU. However, if the xItemValue is the same as the back marker + * the iteration loop below will not end. Therefore the value is checked + * first, and the algorithm slightly modified if necessary. */ + if( xValueOfInsertion == portMAX_DELAY ) + { + pxIterator = pxList->xListEnd.pxPrevious; + } + else + { + /* *** NOTE *********************************************************** + * If you find your application is crashing here then likely causes are + * listed below. In addition see https://www.FreeRTOS.org/FAQHelp.html for + * more tips, and ensure configASSERT() is defined! + * https://www.FreeRTOS.org/a00110.html#configASSERT + * + * 1) Stack overflow - + * see https://www.FreeRTOS.org/Stacks-and-stack-overflow-checking.html + * 2) Incorrect interrupt priority assignment, especially on Cortex-M + * parts where numerically high priority values denote low actual + * interrupt priorities, which can seem counter intuitive. See + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html and the definition + * of configMAX_SYSCALL_INTERRUPT_PRIORITY on + * https://www.FreeRTOS.org/a00110.html + * 3) Calling an API function from within a critical section or when + * the scheduler is suspended, or calling an API function that does + * not end in "FromISR" from an interrupt. + * 4) Using a queue or semaphore before it has been initialised or + * before the scheduler has been started (are interrupts firing + * before vTaskStartScheduler() has been called?). + * 5) If the FreeRTOS port supports interrupt nesting then ensure that + * the priority of the tick interrupt is at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + **********************************************************************/ + + for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) + { + /* There is nothing to do here, just iterating to the wanted + * insertion position. */ + } + } + + pxNewListItem->pxNext = pxIterator->pxNext; + pxNewListItem->pxNext->pxPrevious = pxNewListItem; + pxNewListItem->pxPrevious = pxIterator; + pxIterator->pxNext = pxNewListItem; + + /* Remember which list the item is in. This allows fast removal of the + * item later. */ + pxNewListItem->pxContainer = pxList; + + ( pxList->uxNumberOfItems )++; + + traceRETURN_vListInsert(); +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) +{ + /* The list item knows which list it is in. Obtain the list from the list + * item. */ + List_t * const pxList = pxItemToRemove->pxContainer; + + traceENTER_uxListRemove( pxItemToRemove ); + + + + pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious; + pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext; + + /* Only used during decision coverage testing. */ + mtCOVERAGE_TEST_DELAY(); + + /* Make sure the index is left pointing to a valid item. */ + if( pxList->pxIndex == pxItemToRemove ) + { + pxList->pxIndex = pxItemToRemove->pxPrevious; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + pxItemToRemove->pxContainer = NULL; + ( pxList->uxNumberOfItems )--; + + traceRETURN_uxListRemove( pxList->uxNumberOfItems ); + + return pxList->uxNumberOfItems; +} +/*-----------------------------------------------------------*/ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/Common/mpu_wrappers.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/Common/mpu_wrappers.c new file mode 100644 index 0000000..c12318d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/Common/mpu_wrappers.c @@ -0,0 +1,2522 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * Implementation of the wrapper functions used to raise the processor privilege + * before calling a standard FreeRTOS API function. + */ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "timers.h" +#include "event_groups.h" +#include "stream_buffer.h" +#include "mpu_prototypes.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE +/*-----------------------------------------------------------*/ + +#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 1 ) ) + + #if ( configENABLE_ACCESS_CONTROL_LIST == 1 ) + #error Access control list is not available with this MPU wrapper. Please set configENABLE_ACCESS_CONTROL_LIST to 0. + #endif + + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + BaseType_t MPU_xTaskCreate( TaskFunction_t pvTaskCode, + const char * const pcName, + uint16_t usStackDepth, + void * pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * pxCreatedTask ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + uxPriority = uxPriority & ~( portPRIVILEGE_BIT ); + portMEMORY_BARRIER(); + + xReturn = xTaskCreate( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskCreate( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask ); + } + + return xReturn; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + TaskHandle_t MPU_xTaskCreateStatic( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer ) /* FREERTOS_SYSTEM_CALL */ + { + TaskHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + uxPriority = uxPriority & ~( portPRIVILEGE_BIT ); + portMEMORY_BARRIER(); + + xReturn = xTaskCreateStatic( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskCreateStatic( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer ); + } + + return xReturn; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_vTaskDelete == 1 ) + void MPU_vTaskDelete( TaskHandle_t pxTaskToDelete ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskDelete( pxTaskToDelete ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskDelete( pxTaskToDelete ); + } + } + #endif /* if ( INCLUDE_vTaskDelete == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_xTaskDelayUntil == 1 ) + BaseType_t MPU_xTaskDelayUntil( TickType_t * const pxPreviousWakeTime, + TickType_t xTimeIncrement ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement ); + } + + return xReturn; + } + #endif /* if ( INCLUDE_xTaskDelayUntil == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_xTaskAbortDelay == 1 ) + BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskAbortDelay( xTask ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskAbortDelay( xTask ); + } + + return xReturn; + } + #endif /* if ( INCLUDE_xTaskAbortDelay == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_vTaskDelay == 1 ) + void MPU_vTaskDelay( TickType_t xTicksToDelay ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskDelay( xTicksToDelay ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskDelay( xTicksToDelay ); + } + } + #endif /* if ( INCLUDE_vTaskDelay == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_uxTaskPriorityGet == 1 ) + UBaseType_t MPU_uxTaskPriorityGet( const TaskHandle_t pxTask ) /* FREERTOS_SYSTEM_CALL */ + { + UBaseType_t uxReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + uxReturn = uxTaskPriorityGet( pxTask ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + uxReturn = uxTaskPriorityGet( pxTask ); + } + + return uxReturn; + } + #endif /* if ( INCLUDE_uxTaskPriorityGet == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_vTaskPrioritySet == 1 ) + void MPU_vTaskPrioritySet( TaskHandle_t pxTask, + UBaseType_t uxNewPriority ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskPrioritySet( pxTask, uxNewPriority ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskPrioritySet( pxTask, uxNewPriority ); + } + } + #endif /* if ( INCLUDE_vTaskPrioritySet == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_eTaskGetState == 1 ) + eTaskState MPU_eTaskGetState( TaskHandle_t pxTask ) /* FREERTOS_SYSTEM_CALL */ + { + eTaskState eReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + eReturn = eTaskGetState( pxTask ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + eReturn = eTaskGetState( pxTask ); + } + + return eReturn; + } + #endif /* if ( INCLUDE_eTaskGetState == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TRACE_FACILITY == 1 ) + void MPU_vTaskGetInfo( TaskHandle_t xTask, + TaskStatus_t * pxTaskStatus, + BaseType_t xGetFreeStackSpace, + eTaskState eState ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskGetInfo( xTask, pxTaskStatus, xGetFreeStackSpace, eState ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskGetInfo( xTask, pxTaskStatus, xGetFreeStackSpace, eState ); + } + } + #endif /* if ( configUSE_TRACE_FACILITY == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) + TaskHandle_t MPU_xTaskGetIdleTaskHandle( void ) /* FREERTOS_SYSTEM_CALL */ + { + TaskHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + xReturn = xTaskGetIdleTaskHandle(); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskGetIdleTaskHandle(); + } + + return xReturn; + } + #endif /* if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_vTaskSuspend == 1 ) + void MPU_vTaskSuspend( TaskHandle_t pxTaskToSuspend ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskSuspend( pxTaskToSuspend ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskSuspend( pxTaskToSuspend ); + } + } + #endif /* if ( INCLUDE_vTaskSuspend == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_vTaskSuspend == 1 ) + void MPU_vTaskResume( TaskHandle_t pxTaskToResume ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskResume( pxTaskToResume ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskResume( pxTaskToResume ); + } + } + #endif /* if ( INCLUDE_vTaskSuspend == 1 ) */ +/*-----------------------------------------------------------*/ + + void MPU_vTaskSuspendAll( void ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskSuspendAll(); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskSuspendAll(); + } + } +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xTaskResumeAll( void ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskResumeAll(); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskResumeAll(); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + TickType_t MPU_xTaskGetTickCount( void ) /* FREERTOS_SYSTEM_CALL */ + { + TickType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskGetTickCount(); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskGetTickCount(); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + UBaseType_t MPU_uxTaskGetNumberOfTasks( void ) /* FREERTOS_SYSTEM_CALL */ + { + UBaseType_t uxReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + uxReturn = uxTaskGetNumberOfTasks(); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + uxReturn = uxTaskGetNumberOfTasks(); + } + + return uxReturn; + } +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_xTaskGetHandle == 1 ) + TaskHandle_t MPU_xTaskGetHandle( const char * pcNameToQuery ) /* FREERTOS_SYSTEM_CALL */ + { + TaskHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskGetHandle( pcNameToQuery ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskGetHandle( pcNameToQuery ); + } + + return xReturn; + } + #endif /* if ( INCLUDE_xTaskGetHandle == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + void MPU_vTaskList( char * pcWriteBuffer ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskList( pcWriteBuffer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskList( pcWriteBuffer ); + } + } + #endif /* if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + + #if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + void MPU_vTaskGetRunTimeStats( char * pcWriteBuffer ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskGetRunTimeStats( pcWriteBuffer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskGetRunTimeStats( pcWriteBuffer ); + } + } + #endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + + #if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) + configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimePercent( void ) /* FREERTOS_SYSTEM_CALL */ + { + configRUN_TIME_COUNTER_TYPE xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = ulTaskGetIdleRunTimePercent(); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = ulTaskGetIdleRunTimePercent(); + } + + return xReturn; + } + #endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) */ +/*-----------------------------------------------------------*/ + + #if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) + configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimeCounter( void ) /* FREERTOS_SYSTEM_CALL */ + { + configRUN_TIME_COUNTER_TYPE xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = ulTaskGetIdleRunTimeCounter(); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = ulTaskGetIdleRunTimeCounter(); + } + + return xReturn; + } + #endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + void MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask, + TaskHookFunction_t pxTagValue ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskSetApplicationTaskTag( xTask, pxTagValue ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskSetApplicationTaskTag( xTask, pxTagValue ); + } + } + #endif /* if ( configUSE_APPLICATION_TASK_TAG == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + TaskHookFunction_t MPU_xTaskGetApplicationTaskTag( TaskHandle_t xTask ) /* FREERTOS_SYSTEM_CALL */ + { + TaskHookFunction_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskGetApplicationTaskTag( xTask ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskGetApplicationTaskTag( xTask ); + } + + return xReturn; + } + #endif /* if ( configUSE_APPLICATION_TASK_TAG == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + void MPU_vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, + BaseType_t xIndex, + void * pvValue ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskSetThreadLocalStoragePointer( xTaskToSet, xIndex, pvValue ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskSetThreadLocalStoragePointer( xTaskToSet, xIndex, pvValue ); + } + } + #endif /* if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) */ +/*-----------------------------------------------------------*/ + + #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + void * MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, + BaseType_t xIndex ) /* FREERTOS_SYSTEM_CALL */ + { + void * pvReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + pvReturn = pvTaskGetThreadLocalStoragePointer( xTaskToQuery, xIndex ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + pvReturn = pvTaskGetThreadLocalStoragePointer( xTaskToQuery, xIndex ); + } + + return pvReturn; + } + #endif /* if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + BaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask, + void * pvParameter ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskCallApplicationTaskHook( xTask, pvParameter ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskCallApplicationTaskHook( xTask, pvParameter ); + } + + return xReturn; + } + #endif /* if ( configUSE_APPLICATION_TASK_TAG == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t * pxTaskStatusArray, + UBaseType_t uxArraySize, + configRUN_TIME_COUNTER_TYPE * pulTotalRunTime ) /* FREERTOS_SYSTEM_CALL */ + { + UBaseType_t uxReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + uxReturn = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, pulTotalRunTime ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + uxReturn = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, pulTotalRunTime ); + } + + return uxReturn; + } + #endif /* if ( configUSE_TRACE_FACILITY == 1 ) */ +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskCatchUpTicks( xTicksToCatchUp ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskCatchUpTicks( xTicksToCatchUp ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) + UBaseType_t MPU_uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) /* FREERTOS_SYSTEM_CALL */ + { + UBaseType_t uxReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + uxReturn = uxTaskGetStackHighWaterMark( xTask ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + uxReturn = uxTaskGetStackHighWaterMark( xTask ); + } + + return uxReturn; + } + #endif /* if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) + configSTACK_DEPTH_TYPE MPU_uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) /* FREERTOS_SYSTEM_CALL */ + { + configSTACK_DEPTH_TYPE uxReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + uxReturn = uxTaskGetStackHighWaterMark2( xTask ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + uxReturn = uxTaskGetStackHighWaterMark2( xTask ); + } + + return uxReturn; + } + #endif /* if ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) + TaskHandle_t MPU_xTaskGetCurrentTaskHandle( void ) /* FREERTOS_SYSTEM_CALL */ + { + TaskHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + xReturn = xTaskGetCurrentTaskHandle(); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskGetCurrentTaskHandle(); + } + + return xReturn; + } + #endif /* if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_xTaskGetSchedulerState == 1 ) + BaseType_t MPU_xTaskGetSchedulerState( void ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskGetSchedulerState(); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskGetSchedulerState(); + } + + return xReturn; + } + #endif /* if ( INCLUDE_xTaskGetSchedulerState == 1 ) */ +/*-----------------------------------------------------------*/ + + void MPU_vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskSetTimeOutState( pxTimeOut ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskSetTimeOutState( pxTimeOut ); + } + } +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, + TickType_t * const pxTicksToWait ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskCheckForTimeOut( pxTimeOut, pxTicksToWait ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskCheckForTimeOut( pxTimeOut, pxTicksToWait ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + BaseType_t MPU_xTaskGenericNotify( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + uint32_t ulValue, + eNotifyAction eAction, + uint32_t * pulPreviousNotificationValue ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskGenericNotify( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pulPreviousNotificationValue ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskGenericNotify( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pulPreviousNotificationValue ); + } + + return xReturn; + } + #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + BaseType_t MPU_xTaskGenericNotifyWait( UBaseType_t uxIndexToWaitOn, + uint32_t ulBitsToClearOnEntry, + uint32_t ulBitsToClearOnExit, + uint32_t * pulNotificationValue, + TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskGenericNotifyWait( uxIndexToWaitOn, ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskGenericNotifyWait( uxIndexToWaitOn, ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait ); + } + + return xReturn; + } + #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + uint32_t MPU_ulTaskGenericNotifyTake( UBaseType_t uxIndexToWaitOn, + BaseType_t xClearCountOnExit, + TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */ + { + uint32_t ulReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + ulReturn = ulTaskGenericNotifyTake( uxIndexToWaitOn, xClearCountOnExit, xTicksToWait ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + ulReturn = ulTaskGenericNotifyTake( uxIndexToWaitOn, xClearCountOnExit, xTicksToWait ); + } + + return ulReturn; + } + #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + BaseType_t MPU_xTaskGenericNotifyStateClear( TaskHandle_t xTask, + UBaseType_t uxIndexToClear ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskGenericNotifyStateClear( xTask, uxIndexToClear ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskGenericNotifyStateClear( xTask, uxIndexToClear ); + } + + return xReturn; + } + #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + uint32_t MPU_ulTaskGenericNotifyValueClear( TaskHandle_t xTask, + UBaseType_t uxIndexToClear, + uint32_t ulBitsToClear ) /* FREERTOS_SYSTEM_CALL */ + { + uint32_t ulReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + ulReturn = ulTaskGenericNotifyValueClear( xTask, uxIndexToClear, ulBitsToClear ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + ulReturn = ulTaskGenericNotifyValueClear( xTask, uxIndexToClear, ulBitsToClear ); + } + + return ulReturn; + } + #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + QueueHandle_t MPU_xQueueGenericCreate( UBaseType_t uxQueueLength, + UBaseType_t uxItemSize, + uint8_t ucQueueType ) /* FREERTOS_SYSTEM_CALL */ + { + QueueHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueGenericCreate( uxQueueLength, uxItemSize, ucQueueType ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueGenericCreate( uxQueueLength, uxItemSize, ucQueueType ); + } + + return xReturn; + } + #endif /* if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + QueueHandle_t MPU_xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + uint8_t * pucQueueStorage, + StaticQueue_t * pxStaticQueue, + const uint8_t ucQueueType ) /* FREERTOS_SYSTEM_CALL */ + { + QueueHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueGenericCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxStaticQueue, ucQueueType ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueGenericCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxStaticQueue, ucQueueType ); + } + + return xReturn; + } + #endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xQueueGenericReset( QueueHandle_t pxQueue, + BaseType_t xNewQueue ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueGenericReset( pxQueue, xNewQueue ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueGenericReset( pxQueue, xNewQueue ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue, + const void * const pvItemToQueue, + TickType_t xTicksToWait, + BaseType_t xCopyPosition ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueGenericSend( xQueue, pvItemToQueue, xTicksToWait, xCopyPosition ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueGenericSend( xQueue, pvItemToQueue, xTicksToWait, xCopyPosition ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + UBaseType_t MPU_uxQueueMessagesWaiting( const QueueHandle_t pxQueue ) /* FREERTOS_SYSTEM_CALL */ + { + UBaseType_t uxReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + uxReturn = uxQueueMessagesWaiting( pxQueue ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + uxReturn = uxQueueMessagesWaiting( pxQueue ); + } + + return uxReturn; + } +/*-----------------------------------------------------------*/ + + UBaseType_t MPU_uxQueueSpacesAvailable( const QueueHandle_t xQueue ) /* FREERTOS_SYSTEM_CALL */ + { + UBaseType_t uxReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + uxReturn = uxQueueSpacesAvailable( xQueue ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + uxReturn = uxQueueSpacesAvailable( xQueue ); + } + + return uxReturn; + } +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xQueueReceive( QueueHandle_t pxQueue, + void * const pvBuffer, + TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueReceive( pxQueue, pvBuffer, xTicksToWait ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueReceive( pxQueue, pvBuffer, xTicksToWait ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xQueuePeek( QueueHandle_t xQueue, + void * const pvBuffer, + TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueuePeek( xQueue, pvBuffer, xTicksToWait ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueuePeek( xQueue, pvBuffer, xTicksToWait ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xQueueSemaphoreTake( QueueHandle_t xQueue, + TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueSemaphoreTake( xQueue, xTicksToWait ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueSemaphoreTake( xQueue, xTicksToWait ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + #if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) + TaskHandle_t MPU_xQueueGetMutexHolder( QueueHandle_t xSemaphore ) /* FREERTOS_SYSTEM_CALL */ + { + void * xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueGetMutexHolder( xSemaphore ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueGetMutexHolder( xSemaphore ); + } + + return xReturn; + } + #endif /* if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) */ +/*-----------------------------------------------------------*/ + + #if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + QueueHandle_t MPU_xQueueCreateMutex( const uint8_t ucQueueType ) /* FREERTOS_SYSTEM_CALL */ + { + QueueHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueCreateMutex( ucQueueType ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueCreateMutex( ucQueueType ); + } + + return xReturn; + } + #endif /* if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + + #if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + QueueHandle_t MPU_xQueueCreateMutexStatic( const uint8_t ucQueueType, + StaticQueue_t * pxStaticQueue ) /* FREERTOS_SYSTEM_CALL */ + { + QueueHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueCreateMutexStatic( ucQueueType, pxStaticQueue ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueCreateMutexStatic( ucQueueType, pxStaticQueue ); + } + + return xReturn; + } + #endif /* if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + + #if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + QueueHandle_t MPU_xQueueCreateCountingSemaphore( UBaseType_t uxCountValue, + UBaseType_t uxInitialCount ) /* FREERTOS_SYSTEM_CALL */ + { + QueueHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueCreateCountingSemaphore( uxCountValue, uxInitialCount ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueCreateCountingSemaphore( uxCountValue, uxInitialCount ); + } + + return xReturn; + } + #endif /* if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + + #if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + + QueueHandle_t MPU_xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount, + StaticQueue_t * pxStaticQueue ) /* FREERTOS_SYSTEM_CALL */ + { + QueueHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueCreateCountingSemaphoreStatic( uxMaxCount, uxInitialCount, pxStaticQueue ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueCreateCountingSemaphoreStatic( uxMaxCount, uxInitialCount, pxStaticQueue ); + } + + return xReturn; + } + #endif /* if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_RECURSIVE_MUTEXES == 1 ) + BaseType_t MPU_xQueueTakeMutexRecursive( QueueHandle_t xMutex, + TickType_t xBlockTime ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueTakeMutexRecursive( xMutex, xBlockTime ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueTakeMutexRecursive( xMutex, xBlockTime ); + } + + return xReturn; + } + #endif /* if ( configUSE_RECURSIVE_MUTEXES == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_RECURSIVE_MUTEXES == 1 ) + BaseType_t MPU_xQueueGiveMutexRecursive( QueueHandle_t xMutex ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueGiveMutexRecursive( xMutex ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueGiveMutexRecursive( xMutex ); + } + + return xReturn; + } + #endif /* if ( configUSE_RECURSIVE_MUTEXES == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( ( configUSE_QUEUE_SETS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + QueueSetHandle_t MPU_xQueueCreateSet( UBaseType_t uxEventQueueLength ) /* FREERTOS_SYSTEM_CALL */ + { + QueueSetHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueCreateSet( uxEventQueueLength ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueCreateSet( uxEventQueueLength ); + } + + return xReturn; + } + #endif /* if ( ( configUSE_QUEUE_SETS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_QUEUE_SETS == 1 ) + QueueSetMemberHandle_t MPU_xQueueSelectFromSet( QueueSetHandle_t xQueueSet, + TickType_t xBlockTimeTicks ) /* FREERTOS_SYSTEM_CALL */ + { + QueueSetMemberHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueSelectFromSet( xQueueSet, xBlockTimeTicks ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueSelectFromSet( xQueueSet, xBlockTimeTicks ); + } + + return xReturn; + } + #endif /* if ( configUSE_QUEUE_SETS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_QUEUE_SETS == 1 ) + BaseType_t MPU_xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueAddToSet( xQueueOrSemaphore, xQueueSet ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueAddToSet( xQueueOrSemaphore, xQueueSet ); + } + + return xReturn; + } + #endif /* if ( configUSE_QUEUE_SETS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_QUEUE_SETS == 1 ) + BaseType_t MPU_xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueRemoveFromSet( xQueueOrSemaphore, xQueueSet ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueRemoveFromSet( xQueueOrSemaphore, xQueueSet ); + } + + return xReturn; + } + #endif /* if ( configUSE_QUEUE_SETS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if configQUEUE_REGISTRY_SIZE > 0 + void MPU_vQueueAddToRegistry( QueueHandle_t xQueue, + const char * pcName ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vQueueAddToRegistry( xQueue, pcName ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vQueueAddToRegistry( xQueue, pcName ); + } + } + #endif /* if configQUEUE_REGISTRY_SIZE > 0 */ +/*-----------------------------------------------------------*/ + + #if configQUEUE_REGISTRY_SIZE > 0 + void MPU_vQueueUnregisterQueue( QueueHandle_t xQueue ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vQueueUnregisterQueue( xQueue ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vQueueUnregisterQueue( xQueue ); + } + } + #endif /* if configQUEUE_REGISTRY_SIZE > 0 */ +/*-----------------------------------------------------------*/ + + #if configQUEUE_REGISTRY_SIZE > 0 + const char * MPU_pcQueueGetName( QueueHandle_t xQueue ) /* FREERTOS_SYSTEM_CALL */ + { + const char * pcReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + pcReturn = pcQueueGetName( xQueue ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + pcReturn = pcQueueGetName( xQueue ); + } + + return pcReturn; + } + #endif /* if configQUEUE_REGISTRY_SIZE > 0 */ +/*-----------------------------------------------------------*/ + + void MPU_vQueueDelete( QueueHandle_t xQueue ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vQueueDelete( xQueue ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vQueueDelete( xQueue ); + } + } +/*-----------------------------------------------------------*/ + + #if ( configUSE_TIMERS == 1 ) + void * MPU_pvTimerGetTimerID( const TimerHandle_t xTimer ) /* FREERTOS_SYSTEM_CALL */ + { + void * pvReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + pvReturn = pvTimerGetTimerID( xTimer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + pvReturn = pvTimerGetTimerID( xTimer ); + } + + return pvReturn; + } + #endif /* if ( configUSE_TIMERS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TIMERS == 1 ) + void MPU_vTimerSetTimerID( TimerHandle_t xTimer, + void * pvNewID ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTimerSetTimerID( xTimer, pvNewID ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTimerSetTimerID( xTimer, pvNewID ); + } + } + #endif /* if ( configUSE_TIMERS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TIMERS == 1 ) + BaseType_t MPU_xTimerIsTimerActive( TimerHandle_t xTimer ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTimerIsTimerActive( xTimer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTimerIsTimerActive( xTimer ); + } + + return xReturn; + } + #endif /* if ( configUSE_TIMERS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TIMERS == 1 ) + TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandle( void ) /* FREERTOS_SYSTEM_CALL */ + { + TaskHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTimerGetTimerDaemonTaskHandle(); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTimerGetTimerDaemonTaskHandle(); + } + + return xReturn; + } + #endif /* if ( configUSE_TIMERS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TIMERS == 1 ) + void MPU_vTimerSetReloadMode( TimerHandle_t xTimer, + const BaseType_t uxAutoReload ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTimerSetReloadMode( xTimer, uxAutoReload ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTimerSetReloadMode( xTimer, uxAutoReload ); + } + } + #endif /* if ( configUSE_TIMERS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TIMERS == 1 ) + UBaseType_t MPU_uxTimerGetReloadMode( TimerHandle_t xTimer ) + { + UBaseType_t uxReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + uxReturn = uxTimerGetReloadMode( xTimer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + uxReturn = uxTimerGetReloadMode( xTimer ); + } + + return uxReturn; + } + #endif /* if ( configUSE_TIMERS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TIMERS == 1 ) + const char * MPU_pcTimerGetName( TimerHandle_t xTimer ) /* FREERTOS_SYSTEM_CALL */ + { + const char * pcReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + pcReturn = pcTimerGetName( xTimer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + pcReturn = pcTimerGetName( xTimer ); + } + + return pcReturn; + } + #endif /* if ( configUSE_TIMERS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TIMERS == 1 ) + TickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer ) /* FREERTOS_SYSTEM_CALL */ + { + TickType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTimerGetPeriod( xTimer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTimerGetPeriod( xTimer ); + } + + return xReturn; + } + #endif /* if ( configUSE_TIMERS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TIMERS == 1 ) + TickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer ) /* FREERTOS_SYSTEM_CALL */ + { + TickType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTimerGetExpiryTime( xTimer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTimerGetExpiryTime( xTimer ); + } + + return xReturn; + } + #endif /* if ( configUSE_TIMERS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TIMERS == 1 ) + BaseType_t MPU_xTimerGenericCommandFromTask( TimerHandle_t xTimer, + const BaseType_t xCommandID, + const TickType_t xOptionalValue, + BaseType_t * const pxHigherPriorityTaskWoken, + const TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTimerGenericCommandFromTask( xTimer, xCommandID, xOptionalValue, pxHigherPriorityTaskWoken, xTicksToWait ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTimerGenericCommandFromTask( xTimer, xCommandID, xOptionalValue, pxHigherPriorityTaskWoken, xTicksToWait ); + } + + return xReturn; + } + #endif /* if ( configUSE_TIMERS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + EventGroupHandle_t MPU_xEventGroupCreate( void ) /* FREERTOS_SYSTEM_CALL */ + { + EventGroupHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xEventGroupCreate(); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xEventGroupCreate(); + } + + return xReturn; + } + #endif /* if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + EventGroupHandle_t MPU_xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer ) /* FREERTOS_SYSTEM_CALL */ + { + EventGroupHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xEventGroupCreateStatic( pxEventGroupBuffer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xEventGroupCreateStatic( pxEventGroupBuffer ); + } + + return xReturn; + } + #endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ +/*-----------------------------------------------------------*/ + + EventBits_t MPU_xEventGroupWaitBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToWaitFor, + const BaseType_t xClearOnExit, + const BaseType_t xWaitForAllBits, + TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */ + { + EventBits_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xEventGroupWaitBits( xEventGroup, uxBitsToWaitFor, xClearOnExit, xWaitForAllBits, xTicksToWait ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xEventGroupWaitBits( xEventGroup, uxBitsToWaitFor, xClearOnExit, xWaitForAllBits, xTicksToWait ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + EventBits_t MPU_xEventGroupClearBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToClear ) /* FREERTOS_SYSTEM_CALL */ + { + EventBits_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xEventGroupClearBits( xEventGroup, uxBitsToClear ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xEventGroupClearBits( xEventGroup, uxBitsToClear ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + EventBits_t MPU_xEventGroupSetBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet ) /* FREERTOS_SYSTEM_CALL */ + { + EventBits_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xEventGroupSetBits( xEventGroup, uxBitsToSet ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xEventGroupSetBits( xEventGroup, uxBitsToSet ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + EventBits_t MPU_xEventGroupSync( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet, + const EventBits_t uxBitsToWaitFor, + TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */ + { + EventBits_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xEventGroupSync( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTicksToWait ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xEventGroupSync( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTicksToWait ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + void MPU_vEventGroupDelete( EventGroupHandle_t xEventGroup ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vEventGroupDelete( xEventGroup ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vEventGroupDelete( xEventGroup ); + } + } +/*-----------------------------------------------------------*/ + + size_t MPU_xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */ + { + size_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xStreamBufferSend( xStreamBuffer, pvTxData, xDataLengthBytes, xTicksToWait ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xStreamBufferSend( xStreamBuffer, pvTxData, xDataLengthBytes, xTicksToWait ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + size_t MPU_xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) /* FREERTOS_SYSTEM_CALL */ + { + size_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xStreamBufferNextMessageLengthBytes( xStreamBuffer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xStreamBufferNextMessageLengthBytes( xStreamBuffer ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + size_t MPU_xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */ + { + size_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xStreamBufferReceive( xStreamBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xStreamBufferReceive( xStreamBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + void MPU_vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vStreamBufferDelete( xStreamBuffer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vStreamBufferDelete( xStreamBuffer ); + } + } +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xStreamBufferIsFull( xStreamBuffer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xStreamBufferIsFull( xStreamBuffer ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xStreamBufferIsEmpty( xStreamBuffer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xStreamBufferIsEmpty( xStreamBuffer ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xStreamBufferReset( xStreamBuffer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xStreamBufferReset( xStreamBuffer ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + size_t MPU_xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) /* FREERTOS_SYSTEM_CALL */ + { + size_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + xReturn = xStreamBufferSpacesAvailable( xStreamBuffer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xStreamBufferSpacesAvailable( xStreamBuffer ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + size_t MPU_xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) /* FREERTOS_SYSTEM_CALL */ + { + size_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xStreamBufferBytesAvailable( xStreamBuffer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xStreamBufferBytesAvailable( xStreamBuffer ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, + size_t xTriggerLevel ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xStreamBufferSetTriggerLevel( xStreamBuffer, xTriggerLevel ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xStreamBufferSetTriggerLevel( xStreamBuffer, xTriggerLevel ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + StreamBufferHandle_t MPU_xStreamBufferGenericCreate( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer, + StreamBufferCallbackFunction_t pxSendCompletedCallback, + StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) /* FREERTOS_SYSTEM_CALL */ + { + StreamBufferHandle_t xReturn; + + /** + * Streambuffer application level callback functionality is disabled for MPU + * enabled ports. + */ + configASSERT( ( pxSendCompletedCallback == NULL ) && + ( pxReceiveCompletedCallback == NULL ) ); + + if( ( pxSendCompletedCallback == NULL ) && + ( pxReceiveCompletedCallback == NULL ) ) + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xStreamBufferGenericCreate( xBufferSizeBytes, + xTriggerLevelBytes, + xIsMessageBuffer, + NULL, + NULL ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xStreamBufferGenericCreate( xBufferSizeBytes, + xTriggerLevelBytes, + xIsMessageBuffer, + NULL, + NULL ); + } + } + else + { + traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ); + xReturn = NULL; + } + + return xReturn; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + StreamBufferHandle_t MPU_xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer, + uint8_t * const pucStreamBufferStorageArea, + StaticStreamBuffer_t * const pxStaticStreamBuffer, + StreamBufferCallbackFunction_t pxSendCompletedCallback, + StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) /* FREERTOS_SYSTEM_CALL */ + { + StreamBufferHandle_t xReturn; + + /** + * Streambuffer application level callback functionality is disabled for MPU + * enabled ports. + */ + configASSERT( ( pxSendCompletedCallback == NULL ) && + ( pxReceiveCompletedCallback == NULL ) ); + + if( ( pxSendCompletedCallback == NULL ) && + ( pxReceiveCompletedCallback == NULL ) ) + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xStreamBufferGenericCreateStatic( xBufferSizeBytes, + xTriggerLevelBytes, + xIsMessageBuffer, + pucStreamBufferStorageArea, + pxStaticStreamBuffer, + NULL, + NULL ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xStreamBufferGenericCreateStatic( xBufferSizeBytes, + xTriggerLevelBytes, + xIsMessageBuffer, + pucStreamBufferStorageArea, + pxStaticStreamBuffer, + NULL, + NULL ); + } + } + else + { + traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer ); + xReturn = NULL; + } + + return xReturn; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + + +/* Functions that the application writer wants to execute in privileged mode + * can be defined in application_defined_privileged_functions.h. The functions + * must take the same format as those above whereby the privilege state on exit + * equals the privilege state on entry. For example: + * + * void MPU_FunctionName( [parameters ] ) FREERTOS_SYSTEM_CALL; + * void MPU_FunctionName( [parameters ] ) + * { + * if( portIS_PRIVILEGED() == pdFALSE ) + * { + * portRAISE_PRIVILEGE(); + * portMEMORY_BARRIER(); + * + * FunctionName( [parameters ] ); + * portMEMORY_BARRIER(); + * + * portRESET_PRIVILEGE(); + * portMEMORY_BARRIER(); + * } + * else + * { + * FunctionName( [parameters ] ); + * } + * } + */ + + #if configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS == 1 + #include "application_defined_privileged_functions.h" + #endif +/*-----------------------------------------------------------*/ + +#endif /* #if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 1 ) ) */ +/*-----------------------------------------------------------*/ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/port.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/port.c new file mode 100644 index 0000000..bd85a6f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/port.c @@ -0,0 +1,899 @@ +/* + * FreeRTOS Kernel V10.2.1 + * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/* Portasm includes. */ +#include "portasm.h" + +#if( configENABLE_TRUSTZONE == 1 ) + /* Secure components includes. */ + #include "secure_context.h" + #include "secure_init.h" +#endif /* configENABLE_TRUSTZONE */ + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/** + * The FreeRTOS Cortex M33 port can be configured to run on the Secure Side only + * i.e. the processor boots as secure and never jumps to the non-secure side. + * The Trust Zone support in the port must be disabled in order to run FreeRTOS + * on the secure side. The following are the valid configuration seetings: + * + * 1. Run FreeRTOS on the Secure Side: + * configRUN_FREERTOS_SECURE_ONLY = 1 and configENABLE_TRUSTZONE = 0 + * + * 2. Run FreeRTOS on the Non-Secure Side with Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 1 + * + * 3. Run FreeRTOS on the Non-Secure Side only i.e. no Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 0 + */ +#if( ( configRUN_FREERTOS_SECURE_ONLY == 1 ) && ( configENABLE_TRUSTZONE == 1 ) ) + #error TrustZone needs to be disabled in order to run FreeRTOS on the Secure Side. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the NVIC. + */ +#define portNVIC_SYSTICK_CTRL ( ( volatile uint32_t * ) 0xe000e010 ) +#define portNVIC_SYSTICK_LOAD ( ( volatile uint32_t * ) 0xe000e014 ) +#define portNVIC_SYSTICK_CURRENT_VALUE ( ( volatile uint32_t * ) 0xe000e018 ) +#define portNVIC_INT_CTRL ( ( volatile uint32_t * ) 0xe000ed04 ) +#define portNVIC_SYSPRI2 ( ( volatile uint32_t * ) 0xe000ed20 ) +#define portNVIC_SYSTICK_CLK ( 0x00000004 ) +#define portNVIC_SYSTICK_INT ( 0x00000002 ) +#define portNVIC_SYSTICK_ENABLE ( 0x00000001 ) +#define portNVIC_PENDSVSET ( 0x10000000 ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the SCB. + */ +#define portSCB_SYS_HANDLER_CTRL_STATE_REG ( * ( volatile uint32_t * ) 0xe000ed24 ) +#define portSCB_MEM_FAULT_ENABLE ( 1UL << 16UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the FPU. + */ +#define portCPACR ( ( volatile uint32_t * ) 0xe000ed88 ) /* Coprocessor Access Control Register. */ +#define portCPACR_CP10_VALUE ( 3UL ) +#define portCPACR_CP11_VALUE portCPACR_CP10_VALUE +#define portCPACR_CP10_POS ( 20UL ) +#define portCPACR_CP11_POS ( 22UL ) + +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define portFPCCR_ASPEN_POS ( 31UL ) +#define portFPCCR_ASPEN_MASK ( 1UL << portFPCCR_ASPEN_POS ) +#define portFPCCR_LSPEN_POS ( 30UL ) +#define portFPCCR_LSPEN_MASK ( 1UL << portFPCCR_LSPEN_POS ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the MPU. + */ +#define portMPU_TYPE_REG ( * ( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portMPU_RNR_REG ( * ( ( volatile uint32_t * ) 0xe000ed98 ) ) + +#define portMPU_RBAR_REG ( * ( ( volatile uint32_t * ) 0xe000ed9c ) ) +#define portMPU_RLAR_REG ( * ( ( volatile uint32_t * ) 0xe000eda0 ) ) + +#define portMPU_RBAR_A1_REG ( * ( ( volatile uint32_t * ) 0xe000eda4 ) ) +#define portMPU_RLAR_A1_REG ( * ( ( volatile uint32_t * ) 0xe000eda8 ) ) + +#define portMPU_RBAR_A2_REG ( * ( ( volatile uint32_t * ) 0xe000edac ) ) +#define portMPU_RLAR_A2_REG ( * ( ( volatile uint32_t * ) 0xe000edb0 ) ) + +#define portMPU_RBAR_A3_REG ( * ( ( volatile uint32_t * ) 0xe000edb4 ) ) +#define portMPU_RLAR_A3_REG ( * ( ( volatile uint32_t * ) 0xe000edb8 ) ) + +#define portMPU_MAIR0_REG ( * ( ( volatile uint32_t * ) 0xe000edc0 ) ) +#define portMPU_MAIR1_REG ( * ( ( volatile uint32_t * ) 0xe000edc4 ) ) + +#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ +#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ + +#define portMPU_MAIR_ATTR0_POS ( 0UL ) +#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR1_POS ( 8UL ) +#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR2_POS ( 16UL ) +#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR3_POS ( 24UL ) +#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 ) + +#define portMPU_MAIR_ATTR4_POS ( 0UL ) +#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR5_POS ( 8UL ) +#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR6_POS ( 16UL ) +#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR7_POS ( 24UL ) +#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 ) + +#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL ) + +#define portMPU_RLAR_REGION_ENABLE ( 1UL ) + +/* Enable privileged access to unmapped region. */ +#define portMPU_PRIV_BACKGROUND_ENABLE ( 1UL << 2UL ) + +/* Enable MPU. */ +#define portMPU_ENABLE ( 1UL << 0UL ) + +/* Expected value of the portMPU_TYPE register. */ +#define portEXPECTED_MPU_TYPE_VALUE ( 8UL << 8UL ) /* 8 regions, unified. */ +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to set up the initial stack. + */ +#define portINITIAL_XPSR ( 0x01000000 ) + +#if( configRUN_FREERTOS_SECURE_ONLY == 1 ) + /** + * @brief Initial EXC_RETURN value. + * + * FF FF FF FD + * 1111 1111 1111 1111 1111 1111 1111 1101 + * + * Bit[6] - 1 --> The exception was taken from the Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 1 --> The exception was taken to the Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xfffffffd ) +#else + /** + * @brief Initial EXC_RETURN value. + * + * FF FF FF BC + * 1111 1111 1111 1111 1111 1111 1011 1100 + * + * Bit[6] - 0 --> The exception was taken from the Non-Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 0 --> The exception was taken to the Non-Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xffffffbc ) +#endif /* configRUN_FREERTOS_SECURE_ONLY */ + +/** + * @brief CONTROL register privileged bit mask. + * + * Bit[0] in CONTROL register tells the privilege: + * Bit[0] = 0 ==> The task is privileged. + * Bit[0] = 1 ==> The task is not privileged. + */ +#define portCONTROL_PRIVILEGED_MASK ( 1UL << 0UL ) + +/** + * @brief Initial CONTROL register values. + */ +#define portINITIAL_CONTROL_UNPRIVILEGED ( 0x3 ) +#define portINITIAL_CONTROL_PRIVILEGED ( 0x2 ) + +/** + * @brief Let the user override the pre-loading of the initial LR with the + * address of prvTaskExitError() in case it messes up unwinding of the stack + * in the debugger. + */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/** + * @brief If portPRELOAD_REGISTERS then registers will be given an initial value + * when a task is created. This helps in debugging at the cost of code size. + */ +#define portPRELOAD_REGISTERS 1 + +/** + * @brief A task is created without a secure context, and must call + * portALLOCATE_SECURE_CONTEXT() to give itself a secure context before it makes + * any secure calls. + */ +#define portNO_SECURE_CONTEXT 0 +/*-----------------------------------------------------------*/ + +/** + * @brief Setup the timer to generate the tick interrupts. + */ +static void prvSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Used to catch tasks that attempt to return from their implementing + * function. + */ +static void prvTaskExitError( void ); + +#if( configENABLE_MPU == 1 ) + /** + * @brief Setup the Memory Protection Unit (MPU). + */ + static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_MPU */ + +#if( configENABLE_FPU == 1 ) + /** + * @brief Setup the Floating Point Unit (FPU). + */ + static void prvSetupFPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_FPU */ + +/** + * @brief Yield the processor. + */ +void vPortYield( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Enter critical section. + */ +void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Exit from critical section. + */ +void vPortExitCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief SysTick handler. + */ +void SysTick_Handler( void ) PRIVILEGED_FUNCTION; + +/** + * @brief C part of SVC handler. + */ +portDONT_DISCARD void vPortSVCHandler_C( uint32_t *pulCallerStackAddress ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + +/** + * @brief Each task maintains its own interrupt status in the critical nesting + * variable. + */ +static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL; + +#if( configENABLE_TRUSTZONE == 1 ) + /** + * @brief Saved as part of the task context to indicate which context the + * task is using on the secure side. + */ + portDONT_DISCARD volatile SecureContextHandle_t xSecureContext = portNO_SECURE_CONTEXT; +#endif /* configENABLE_TRUSTZONE */ +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Stop and reset the SysTick. */ + *( portNVIC_SYSTICK_CTRL ) = 0UL; + *( portNVIC_SYSTICK_CURRENT_VALUE ) = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + *( portNVIC_SYSTICK_LOAD ) = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + *( portNVIC_SYSTICK_CTRL ) = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ +volatile uint32_t ulDummy = 0UL; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). Artificially force an assert() + * to be triggered if configASSERT() is defined, then stop here so + * application writers can catch the error. */ + configASSERT( ulCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being + * defined but never called. ulDummy is used purely to quieten other + * warnings about code appearing after this function is called - making + * ulDummy volatile makes the compiler think the function could return + * and therefore not output an 'unreachable code' warning for code that + * appears after it. */ + } +} +/*-----------------------------------------------------------*/ + +#if( configENABLE_MPU == 1 ) + static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if defined( __ARMCC_VERSION ) + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_functions_start__; + extern uint32_t * __privileged_functions_end__; + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + extern uint32_t * __unprivileged_flash_start__; + extern uint32_t * __unprivileged_flash_end__; + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + extern uint32_t __unprivileged_flash_start__[]; + extern uint32_t __unprivileged_flash_end__[]; + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* Check that the MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* MAIR0 - Index 0. */ + portMPU_MAIR0_REG |= ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + /* MAIR0 - Index 1. */ + portMPU_MAIR0_REG |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* Setup privileged flash as Read Only so that privileged tasks can + * read it but not modify. */ + portMPU_RNR_REG = portPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_functions_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_functions_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged flash as Read Only by both privileged and + * unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __unprivileged_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __unprivileged_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged syscalls flash as Read Only by both privileged + * and unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_SYSCALLS_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __syscalls_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __syscalls_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup RAM containing kernel data for privileged access only. */ + portMPU_RNR_REG = portPRIVILEGED_RAM_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_sram_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_sram_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Enable mem fault. */ + portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_MEM_FAULT_ENABLE; + + /* Enable MPU with privileged background access i.e. unmapped + * regions have privileged access. */ + portMPU_CTRL_REG |= ( portMPU_PRIV_BACKGROUND_ENABLE | portMPU_ENABLE ); + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +#if( configENABLE_FPU == 1 ) + static void prvSetupFPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if( configENABLE_TRUSTZONE == 1 ) + { + /* Enable non-secure access to the FPU. */ + SecureInit_EnableNSFPUAccess(); + } + #endif /* configENABLE_TRUSTZONE */ + + /* CP10 = 11 ==> Full access to FPU i.e. both privileged and + * unprivileged code should be able to access FPU. CP11 should be + * programmed to the same value as CP10. */ + *( portCPACR ) |= ( ( portCPACR_CP10_VALUE << portCPACR_CP10_POS ) | + ( portCPACR_CP11_VALUE << portCPACR_CP11_POS ) + ); + + /* ASPEN = 1 ==> Hardware should automatically preserve floating point + * context on exception entry and restore on exception return. + * LSPEN = 1 ==> Enable lazy context save of FP state. */ + *( portFPCCR ) |= ( portFPCCR_ASPEN_MASK | portFPCCR_LSPEN_MASK ); + } +#endif /* configENABLE_FPU */ +/*-----------------------------------------------------------*/ + +void vPortYield( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Set a PendSV to request a context switch. */ + *( portNVIC_INT_CTRL ) = portNVIC_PENDSVSET; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile( "dsb" ::: "memory" ); + __asm volatile( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + portDISABLE_INTERRUPTS(); + ulCriticalNesting++; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile( "dsb" ::: "memory" ); + __asm volatile( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + configASSERT( ulCriticalNesting ); + ulCriticalNesting--; + + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void SysTick_Handler( void ) /* PRIVILEGED_FUNCTION */ +{ +uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + *( portNVIC_INT_CTRL ) = portNVIC_PENDSVSET; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler_C( uint32_t *pulCallerStackAddress ) /* PRIVILEGED_FUNCTION portDONT_DISCARD */ +{ +#if( configENABLE_MPU == 1 ) + #if defined( __ARMCC_VERSION ) + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ +#endif /* configENABLE_MPU */ + +uint32_t ulPC; + +#if( configENABLE_TRUSTZONE == 1 ) + uint32_t ulR0; + #if( configENABLE_MPU == 1 ) + uint32_t ulControl, ulIsTaskPrivileged; + #endif /* configENABLE_MPU */ +#endif /* configENABLE_TRUSTZONE */ +uint8_t ucSVCNumber; + + /* Register are stored on the stack in the following order - R0, R1, R2, R3, + * R12, LR, PC, xPSR. */ + ulPC = pulCallerStackAddress[ 6 ]; + ucSVCNumber = ( ( uint8_t *) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + #if( configENABLE_TRUSTZONE == 1 ) + case portSVC_ALLOCATE_SECURE_CONTEXT: + { + /* R0 contains the stack size passed as parameter to the + * vPortAllocateSecureContext function. */ + ulR0 = pulCallerStackAddress[ 0 ]; + + #if( configENABLE_MPU == 1 ) + { + /* Read the CONTROL register value. */ + __asm volatile ( "mrs %0, control" : "=r" ( ulControl ) ); + + /* The task that raised the SVC is privileged if Bit[0] + * in the CONTROL register is 0. */ + ulIsTaskPrivileged = ( ( ulControl & portCONTROL_PRIVILEGED_MASK ) == 0 ); + + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, ulIsTaskPrivileged ); + } + #else + { + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0 ); + } + #endif /* configENABLE_MPU */ + + configASSERT( xSecureContext != NULL ); + SecureContext_LoadContext( xSecureContext ); + } + break; + + case portSVC_FREE_SECURE_CONTEXT: + { + /* R0 contains the secure context handle to be freed. */ + ulR0 = pulCallerStackAddress[ 0 ]; + + /* Free the secure context. */ + SecureContext_FreeContext( ( SecureContextHandle_t ) ulR0 ); + } + break; + #endif /* configENABLE_TRUSTZONE */ + + case portSVC_START_SCHEDULER: + { + #if( configENABLE_TRUSTZONE == 1 ) + { + /* De-prioritize the non-secure exceptions so that the + * non-secure pendSV runs at the lowest priority. */ + SecureInit_DePrioritizeNSExceptions(); + + /* Initialize the secure context management system. */ + SecureContext_Init(); + } + #endif /* configENABLE_TRUSTZONE */ + + #if( configENABLE_FPU == 1 ) + { + /* Setup the Floating Point Unit (FPU). */ + prvSetupFPU(); + } + #endif /* configENABLE_FPU */ + + /* Setup the context of the first task so that the first task starts + * executing. */ + vRestoreContextOfFirstTask(); + } + break; + + #if( configENABLE_MPU == 1 ) + case portSVC_RAISE_PRIVILEGE: + { + /* Only raise the privilege, if the svc was raised from any of + * the system calls. */ + if( ulPC >= ( uint32_t ) __syscalls_flash_start__ && + ulPC <= ( uint32_t ) __syscalls_flash_end__ ) + { + vRaisePrivilege(); + } + } + break; + #endif /* configENABLE_MPU */ + + default: + { + /* Incorrect SVC call. */ + configASSERT( pdFALSE ); + } + } +} +/*-----------------------------------------------------------*/ + +#if( configENABLE_MPU == 1 ) + StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) /* PRIVILEGED_FUNCTION */ +#else + StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters ) /* PRIVILEGED_FUNCTION */ +#endif /* configENABLE_MPU */ +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + #if( portPRELOAD_REGISTERS == 0 ) + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 9; /* R11..R4, EXC_RETURN. */ + *pxTopOfStack = portINITIAL_EXC_RETURN; + + #if( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #else /* portPRELOAD_REGISTERS */ + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212UL; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303UL; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202UL; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101UL; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111UL; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010UL; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909UL; /* R09 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808UL; /* R08 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707UL; /* R07 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606UL; /* R06 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505UL; /* R05 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404UL; /* R04 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; /* EXC_RETURN */ + + #if( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #endif /* portPRELOAD_REGISTERS */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + *( portNVIC_SYSPRI2 ) |= portNVIC_PENDSV_PRI; + *( portNVIC_SYSPRI2 ) |= portNVIC_SYSTICK_PRI; + + #if( configENABLE_MPU == 1 ) + { + /* Setup the Memory Protection Unit (MPU). */ + prvSetupMPU(); + } + #endif /* configENABLE_MPU */ + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + prvSetupTimerInterrupt(); + + /* Initialize the critical nesting count ready for the first task. */ + ulCriticalNesting = 0; + + /* Start the first task. */ + vStartFirstTask(); + + /* Should never get here as the tasks will now be executing. Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimization does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +#if( configENABLE_MPU == 1 ) + void vPortStoreTaskMPUSettings( xMPU_SETTINGS *xMPUSettings, const struct xMEMORY_REGION * const xRegions, StackType_t *pxBottomOfStack, uint32_t ulStackDepth ) + { + uint32_t ulRegionStartAddress, ulRegionEndAddress, ulRegionNumber; + int32_t lIndex = 0; + + /* Setup MAIR0. */ + xMPUSettings->ulMAIR0 = ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + xMPUSettings->ulMAIR0 |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that + * the stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + /* Define the region that allows access to the stack. */ + ulRegionStartAddress = ( ( uint32_t ) pxBottomOfStack ) & portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress = ( uint32_t ) pxBottomOfStack + ( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) - 1; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + } + + /* User supplied configurable regions. */ + for( ulRegionNumber = 1; ulRegionNumber <= portNUM_CONFIGURABLE_REGIONS; ulRegionNumber++ ) + { + /* If xRegions is NULL i.e. the task has not specified any MPU + * region, the else part ensures that all the configurable MPU + * regions are invalidated. */ + if( ( xRegions != NULL ) && ( xRegions[ lIndex ].ulLengthInBytes > 0UL ) ) + { + /* Translate the generic region definition contained in xRegions + * into the ARMv8 specific MPU settings that are then stored in + * xMPUSettings. */ + ulRegionStartAddress = ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) & portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress = ( uint32_t ) xRegions[ lIndex ].pvBaseAddress + xRegions[ lIndex ].ulLengthInBytes - 1; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + /* Start address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ); + + /* RO/RW. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_READ_ONLY ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_ONLY ); + } + else + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_WRITE ); + } + + /* XN. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_EXECUTE_NEVER ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_EXECUTE_NEVER ); + } + + /* End Address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Normal memory/ Device memory. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_DEVICE_MEMORY ) != 0 ) + { + /* Attr1 in MAIR0 is configured as device memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX1; + } + else + { + /* Attr1 in MAIR0 is configured as normal memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX0; + } + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = 0UL; + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = 0UL; + } + + lIndex++; + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/portTicks.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/portTicks.c new file mode 100644 index 0000000..45c8ecc --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/portTicks.c @@ -0,0 +1,270 @@ +/* + * portTicks.c + * + * Created on: 24.04.2019 + * Author: Erich Styger + */ + +#include "FreeRTOSConfig.h" +#include "portTicks.h" + +/* --------------------------------------------------- */ +/* macros dealing with tick counter */ +#if configSYSTICK_USE_LOW_POWER_TIMER + #if !McuLib_CONFIG_PEX_SDK_USED + /*! \todo */ + #define LPTMR0_BASE_PTR LPTMR0 /* low power timer address base */ + #define configLOW_POWER_TIMER_VECTOR_NUMBER LPTMR0_IRQn /* low power timer IRQ number */ + #define ENABLE_TICK_COUNTER() LPTMR_StartTimer(LPTMR0_BASE_PTR); LPTMR_EnableInterrupts(LPTMR0_BASE_PTR, kLPTMR_TimerInterruptEnable) + #define DISABLE_TICK_COUNTER() LPTMR_StopTimer(LPTMR0_BASE_PTR) + #define RESET_TICK_COUNTER_VAL() LPTMR_StopTimer(LPTMR0_BASE_PTR); LPTMR_DisableInterrupts(LPTMR0_BASE_PTR, kLPTMR_TimerInterruptEnable) + #define ACKNOWLEDGE_TICK_ISR() LPTMR_ClearStatusFlags(LPTMR0_BASE_PTR, kLPTMR_TimerCompareFlag); + #elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT + #define ENABLE_TICK_COUNTER() LPTMR_PDD_EnableDevice(LPTMR0_BASE_PTR, PDD_ENABLE); LPTMR_PDD_EnableInterrupt(LPTMR0_BASE_PTR) + #define DISABLE_TICK_COUNTER() LPTMR_PDD_EnableDevice(LPTMR0_BASE_PTR, PDD_DISABLE); LPTMR_PDD_DisableInterrupt(LPTMR0_BASE_PTR) + #define RESET_TICK_COUNTER_VAL() DISABLE_TICK_COUNTER() /* CNR is reset when the LPTMR is disabled or counter register overflows */ + #define ACKNOWLEDGE_TICK_ISR() LPTMR_PDD_ClearInterruptFlag(LPTMR0_BASE_PTR) + #if defined(LDD_ivIndex_INT_LPTimer) /* Earlier version of Processor Expert use this vector name */ + #define configLOW_POWER_TIMER_VECTOR_NUMBER LDD_ivIndex_INT_LPTimer + #elif defined(LDD_ivIndex_INT_LPTMR0) /* Newer versions (Processor Expert for Kinetis v3.0.1 uses this name */ + #define configLOW_POWER_TIMER_VECTOR_NUMBER LDD_ivIndex_INT_LPTMR0 + #else + #error "Unknown Low Power Timer Interrupt Number?" + #endif + #endif +#else + #define ENABLE_TICK_COUNTER() portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT + #define DISABLE_TICK_COUNTER() portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT + #define RESET_TICK_COUNTER_VAL() portNVIC_SYSTICK_CURRENT_VALUE_REG = 0 /*portNVIC_SYSTICK_LOAD_REG*/ + #define ACKNOWLEDGE_TICK_ISR() /* not needed */ +#endif + +typedef unsigned long TickCounter_t; /* enough for 24 bit Systick */ +#if configSYSTICK_USE_LOW_POWER_TIMER + #define TICK_NOF_BITS 16 + #define COUNTS_UP 1 /* LPTMR is counting up */ + #if !McuLib_CONFIG_PEX_SDK_USED + #define SET_TICK_DURATION(val) LPTMR_SetTimerPeriod(LPTMR0_BASE_PTR, val); + #define GET_TICK_DURATION() LPTMR0_BASE_PTR->CNR /*! \todo SDK has no access method for this */ + #define GET_TICK_CURRENT_VAL(addr) *(addr)=LPTMR_GetCurrentTimerCount(LPTMR0_BASE_PTR) + #else + #define SET_TICK_DURATION(val) LPTMR_PDD_WriteCompareReg(LPTMR0_BASE_PTR, val) + #define GET_TICK_DURATION() LPTMR_PDD_ReadCompareReg(LPTMR0_BASE_PTR) + #define GET_TICK_CURRENT_VAL(addr) *(addr)=LPTMR_PDD_ReadCounterReg(LPTMR0_BASE_PTR) + #endif +#else + #define TICK_NOF_BITS 24 + #define COUNTS_UP 0 /* SysTick is counting down to zero */ + #define SET_TICK_DURATION(val) portNVIC_SYSTICK_LOAD_REG = val + #define GET_TICK_DURATION() portNVIC_SYSTICK_LOAD_REG + #define GET_TICK_CURRENT_VAL(addr) *(addr)=portNVIC_SYSTICK_CURRENT_VALUE_REG +#endif + +#if configSYSTICK_USE_LOW_POWER_TIMER + #define TIMER_COUNTS_FOR_ONE_TICK (configSYSTICK_LOW_POWER_TIMER_CLOCK_HZ/configTICK_RATE_HZ) +#else + #define TIMER_COUNTS_FOR_ONE_TICK (configSYSTICK_CLOCK_HZ/configTICK_RATE_HZ) +#endif + +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configCPU_FAMILY==configCPU_FAMILY_ARM_M0P + unsigned int SEGGER_SYSVIEW_TickCnt; /* tick counter for Segger SystemViewer */ +#endif + +#if configUSE_TICKLESS_IDLE + #define UL_TIMER_COUNTS_FOR_ONE_TICK ((TickCounter_t)(TIMER_COUNTS_FOR_ONE_TICK)) +#if configCPU_FAMILY_IS_ARM(configCPU_FAMILY) + #define TICKLESS_DISABLE_INTERRUPTS() __asm volatile("cpsid i") /* disable interrupts. Note that the wfi (wait for interrupt) instruction later will still be able to wait for interrupts! */ + #define TICKLESS_ENABLE_INTERRUPTS() __asm volatile("cpsie i") /* re-enable interrupts. */ +#elif (configCPU_FAMILY==configCPU_FAMILY_S08) || (configCPU_FAMILY==configCPU_FAMILY_S12) + #define TICKLESS_DISABLE_INTERRUPTS() __asm("sei"); /* disable interrupts */ + #define TICKLESS_ENABLE_INTERRUPTS() __asm("cli"); /* re-enable interrupts */ +#else + #define TICKLESS_DISABLE_INTERRUPTS() portDISABLE_INTERRUPTS() /* this disables interrupts! Make sure they are re-enabled in vOnPreSleepProcessing()! */ + #define TICKLESS_ENABLE_INTERRUPTS() portENABLE_INTERRUPTS() /* re-enable interrupts */ +#endif + + #if 1 + #if configSYSTICK_USE_LOW_POWER_TIMER + /* using Low Power Timer */ + #if CONFIG_PEX_SDK_USEDMcuLib_CONFIG_PEX_SDK_USED + #define LPTMR_CSR_TCF_MASK 0x80u + #define TICK_INTERRUPT_HAS_FIRED() (LPTMR0_BASE_PTR->CSR&LPTMR_CSR_TCF_MASK)!=0/*! \todo */ /* returns TRUE if tick interrupt had fired */ + #else + #define TICK_INTERRUPT_HAS_FIRED() (LPTMR_PDD_GetInterruptFlag(LPTMR0_BASE_PTR)!=0) /* returns TRUE if tick interrupt had fired */ + #endif + #define TICK_INTERRUPT_FLAG_RESET() /* not needed */ + #define TICK_INTERRUPT_FLAG_SET() /* not needed */ + #else + /* using directly SysTick Timer */ + #define TICK_INTERRUPT_HAS_FIRED() ((portNVIC_SYSTICK_CTRL_REG&portNVIC_SYSTICK_COUNT_FLAG_BIT)!=0) /* returns TRUE if tick interrupt had fired */ + #define TICK_INTERRUPT_FLAG_RESET() /* not needed */ + #define TICK_INTERRUPT_FLAG_SET() /* not needed */ + #endif + #else + /* using global variable to find out if interrupt has fired */ + volatile uint8_t portTickCntr; /* used to find out if we woke up by the tick interrupt */ + #define TICK_INTERRUPT_HAS_FIRED() (portTickCntr!=0) /* returns TRUE if tick interrupt had fired */ + #define TICK_INTERRUPT_FLAG_RESET() portTickCntr=0 + #define TICK_INTERRUPT_FLAG_SET() portTickCntr=1 + #endif +#endif /* configUSE_TICKLESS_IDLE == 1 */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * resolution of the tick timer. + */ +#if configUSE_TICKLESS_IDLE == 1 + static TickCounter_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the tick timer is stopped (low + * power functionality only). + */ +#if configUSE_TICKLESS_IDLE == 1 + static TickCounter_t ulStoppedTimerCompensation = 0; /* number of timer ticks to compensate */ + #ifndef configSTOPPED_TIMER_COMPENSATION + #define configSTOPPED_TIMER_COMPENSATION 45UL /* number of CPU cycles to compensate. ulStoppedTimerCompensation will contain the number of timer ticks. */ + #endif +#endif /* configUSE_TICKLESS_IDLE */ + +/* Flag indicating that the tick counter interval needs to be restored back to + * the normal setting. Used when woken up from a low power mode using the LPTMR. + */ +#if configUSE_TICKLESS_IDLE && configSYSTICK_USE_LOW_POWER_TIMER + static uint8_t restoreTickInterval = 0; /* used to flag in tick ISR that compare register needs to be reloaded */ +#endif + +#if (configCPU_FAMILY==configCPU_FAMILY_CF1) || (configCPU_FAMILY==configCPU_FAMILY_CF2) + #define portINITIAL_FORMAT_VECTOR ((portSTACK_TYPE)0x4000) + #define portINITIAL_STATUS_REGISTER ((portSTACK_TYPE)0x2000) /* Supervisor mode set. */ +#endif + +#if configCPU_FAMILY_IS_ARM(configCPU_FAMILY) + +/* For strict compliance with the Cortex-M spec the task start address should +have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Constants required to manipulate the core. + * SysTick register: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0662b/CIAGECDD.html + * Registers first... + */ +#define portNVIC_SYSTICK_CTRL_REG (*((volatile unsigned long *)0xe000e010)) /* SYST_CSR, SysTick Control and Status Register */ +#define portNVIC_SYSTICK_LOAD_REG (*((volatile unsigned long *)0xe000e014)) /* SYST_RVR, SysTick reload value register */ +#define portNVIC_SYSTICK_CURRENT_VALUE_REG (*((volatile unsigned long *)0xe000e018)) /* SYST_CVR, SysTick current value register */ +#define portNVIC_SYSTICK_CALIB_VALUE_REG (*((volatile unsigned long *)0xe000e01C)) /* SYST_CALIB, SysTick calibration value register */ +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_COUNT_FLAG_BIT (1UL<<16UL) /* returns 1 if timer counted to 0 since the last read of the register */ +#if configSYSTICK_USE_CORE_CLOCK + #define portNVIC_SYSTICK_CLK_BIT (1UL<<2UL) /* clock source. 1: core clock, 0: external reference clock */ +#else + #define portNVIC_SYSTICK_CLK_BIT (0UL<<2UL) /* clock source. 1: core clock, 0: external reference clock */ +#endif +#define portNVIC_SYSTICK_INT_BIT (1UL<<1UL) /* SysTick interrupt enable bit */ +#define portNVIC_SYSTICK_ENABLE_BIT (1UL<<0UL) /* SysTick enable bit */ + +#if 0 +/* Constants required to manipulate the NVIC: */ +#define portNVIC_INT_CTRL ((volatile unsigned long*)0xe000ed04) /* interrupt control and state register (ICSR) */ +#define portNVIC_PENDSVSET_BIT (1UL<<28UL) /* bit 28 in portNVIC_INT_CTRL (PENDSVSET), see http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/Cihfaaha.html */ +#define portNVIC_PENDSVCLEAR_BIT (1UL<<27UL) /* bit 27 in portNVIC_INT_CTRL (PENDSVCLR) */ +#define portNVIC_PEND_SYSTICK_SET_BIT (1UL<<26UL) /* bit 26 in portNVIC_INT_CTRL (PENDSTSET) */ +#define portNVIC_PEND_SYSTICK_CLEAR_BIT (1UL<<25UL) /* bit 25 in portNVIC_INT_CTRL (PENDSTCLR) */ + +#define portNVIC_SYSPRI2 ((volatile unsigned long*)0xe000ed1c) /* system handler priority register 2 (SHPR2), used for SVCall priority, http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0662b/CIAGECDD.html */ +#define portNVIC_SVCALL_PRI (((unsigned long)configKERNEL_INTERRUPT_PRIORITY)<<24) /* priority of SVCall interrupt (in portNVIC_SYSPRI2) */ + +#define portNVIC_SYSPRI3 ((volatile unsigned long*)0xe000ed20) /* system handler priority register 3 (SHPR3), used for SysTick and PendSV priority, http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0662b/CIAGECDD.html */ +#define portNVIC_SYSTICK_PRI (((unsigned long)configKERNEL_INTERRUPT_PRIORITY)<<24) /* priority of SysTick interrupt (in portNVIC_SYSPRI3) */ +#define portNVIC_PENDSV_PRI (((unsigned long)configKERNEL_INTERRUPT_PRIORITY)<<16) /* priority of PendableService interrupt (in portNVIC_SYSPRI3) */ + +#define portNVIC_SYSPRI7 ((volatile unsigned long*)0xe000e41c) /* system handler priority register 7, PRI_28 is LPTMR */ +#define portNVIC_LP_TIMER_PRI (((unsigned long)configKERNEL_INTERRUPT_PRIORITY)<<0) /* priority of low power timer interrupt */ +#endif + +#if configSYSTICK_USE_LOW_POWER_TIMER && McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT +#define IRQn_Type int +#define __NVIC_PRIO_BITS configPRIO_BITS +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ +/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +#if configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY) /* ARM M4(F)/M7/M33 core */ +typedef struct +{ + __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24]; + __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24]; + __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24]; + __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24]; + __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56]; + __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644]; + __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; +#else /* M0+ */ +typedef struct +{ + __IO uint32_t ISER[1]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31]; + __IO uint32_t ICER[1]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31]; + __IO uint32_t ISPR[1]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31]; + __IO uint32_t ICPR[1]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31]; + uint32_t RESERVED4[64]; + __IO uint32_t IP[8]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; +#endif + +/* Memory mapping of Cortex-M0+ Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + +/* Interrupt Priorities are WORD accessible only under ARMv6M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( (((uint32_t)(IRQn) ) & 0x03) * 8 ) +#define _IP_IDX(IRQn) ( ((uint32_t)(IRQn) >> 2) ) + +/** \brief Set Interrupt Priority + The function sets the priority of an interrupt. + \note The priority cannot be set for every core interrupt. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + */ +static void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) { + IRQn -= 16; /* PEx starts numbers with zero, while system interrupts would be negative */ +#if configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY) /* ARM M4(F)/M7/M33 core */ + NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); /* set Priority for device specific Interrupts */ +#else /* M0+ */ + NVIC->IP[_IP_IDX(IRQn)] = (NVIC->IP[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | + (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); /* set Priority for device specific Interrupts */ +#endif +} + +/** \brief Enable External Interrupt + The function enables a device-specific interrupt in the NVIC interrupt controller. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +static void NVIC_EnableIRQ(IRQn_Type IRQn) { + IRQn -= 16; /* PEx starts numbers with zero, while system interrupts would be negative */ +#if configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY) /* ARM M4(F)/M7/M33 core */ + NVIC->ISER[(uint32_t)((int32_t)IRQn) >> 5] = (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)); /* enable interrupt */ +#else /* M0+ */ + NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */ +#endif +} +#endif /* configSYSTICK_USE_LOW_POWER_TIMER */ + +#endif /* #if configCPU_FAMILY_IS_ARM(configCPU_FAMILY) */ + +void vPortStopTickTimer(void) { + DISABLE_TICK_COUNTER(); +} diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/portTicks.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/portTicks.h new file mode 100644 index 0000000..c57d9b6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/portTicks.h @@ -0,0 +1,111 @@ +/* + * FreeRTOS Kernel V10.2.1 + * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +#ifndef PORTTICKS_H_ +#define PORTTICKS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Interface header file to the Processor Expert Tick counter. + * This file is used to access the interface, especially for performance + * counters (e.g. for Percepio Trace). + * That way the a module can interface this wrapper header file instead + * of one of the standard FreeRTOS header files. + */ +#include "McuLib.h" /* include SDK and API used */ + +#include "FreeRTOSConfig.h" +#include "portmacro.h" + +#if !McuLib_CONFIG_PEX_SDK_USED + extern uint32_t SystemCoreClock; /* in Kinetis SDK, this contains the system core clock speed */ +#endif + +/*! + * \brief Return the tick raw counter value. It is assumed that the counter register has been reset at the last tick time + * \return Tick counter value. The value is reset at tick interrupt time. + * */ +uint32_t uxGetTickCounterValue(void); + +#if configSYSTICK_USE_LOW_POWER_TIMER + #define FREERTOS_HWTC_DOWN_COUNTER 0 /* LPTM is counting up */ + #define FREERTOS_HWTC_PERIOD ((1000/configSYSTICK_LOW_POWER_TIMER_CLOCK_HZ)-1UL) /* counter is incrementing from zero to this value */ +#else + #define FREERTOS_HWTC_DOWN_COUNTER 1 /* SysTick is counting down */ + #define FREERTOS_HWTC_PERIOD ((configCPU_CLOCK_HZ/configTICK_RATE_HZ)-1UL) /* counter is decrementing from this value to zero */ +#endif + +#if configUSE_TICKLESS_IDLE == 1 + extern volatile uint8_t portTickCntr; /* used to find out if we woke up by the tick interrupt */ +#endif + +#define FREERTOS_HWTC_FREQ_HZ configTICK_RATE_HZ + +#if configUSE_PERCEPIO_TRACE_HOOKS /* using Percepio Trace */ +#if (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_PROCESSOR_EXPERT) + /* tick information for Percepio Trace */ + + /* undefine previous values, where dummy anyway: make sure this header file is included last! */ + #undef TRC_HWTC_COUNT_DIRECTION + #undef TRC_HWTC_PERIOD + #undef TRC_HWTC_DIVISOR + #undef TRC_HWTC_COUNT + + #if FREERTOS_HWTC_DOWN_COUNTER + #define TRC_HWTC_COUNT_DIRECTION DIRECTION_DECREMENTING + #define TRC_HWTC_PERIOD FREERTOS_HWTC_PERIOD /* counter is decrementing from this value to zero */ + #else + #define TRC_HWTC_COUNT_DIRECTION DIRECTION_INCREMENTING + #define TRC_HWTC_PERIOD FREERTOS_HWTC_PERIOD /* counter is incrementing from zero to this value */ + #endif + + #if configCPU_FAMILY_IS_ARM(configCPU_FAMILY) + #if configSYSTICK_USE_LOW_POWER_TIMER + #define TRC_HWTC_DIVISOR 1 /* divisor for slow counter tick value */ + #else + #define TRC_HWTC_DIVISOR 2 /* divisor for fast counter tick value */ + #endif + #else + #define TRC_HWTC_DIVISOR 1 + #endif + + #define TRC_HWTC_COUNT (uxGetTickCounterValue()) + #define TRC_HWTC_TYPE TRC_FREE_RUNNING_32BIT_INCR + #define TRC_IRQ_PRIORITY_ORDER 0 /* 0: lower IRQ prios mean higher priority, 1: otherwise */ + #define TRC_HWTC_FREQ_HZ FREERTOS_HWTC_FREQ_HZ +#endif +#endif /* configUSE_PERCEPIO_TRACE_HOOKS */ + +#ifdef __cplusplus +} +#endif + +#endif /* PORTTICKS_H_ */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/portasm.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/portasm.c new file mode 100644 index 0000000..5a7ed0f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/portasm.c @@ -0,0 +1,417 @@ +/* + * FreeRTOS Kernel V10.2.1 + * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE ensures that PRIVILEGED_FUNCTION + * is defined correctly and privileged functions are placed in correct sections. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Portasm includes. */ +#include "portasm.h" + +/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE is needed to be defined only for the + * header files. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +void vRestoreContextOfFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r2, pxCurrentTCBConst2 \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r3, [r2] \n" /* Read pxCurrentTCB. */ + " ldr r0, [r3] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + " \n" + #if( configENABLE_MPU == 1 ) + " dmb \n" /* Complete outstanding transfers before disabling MPU. */ + " ldr r2, xMPUCTRLConst2 \n" /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n" /* Read the value of MPU_CTRL. */ + " bic r4, #1 \n" /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + " str r4, [r2] \n" /* Disable MPU. */ + " \n" + " adds r3, #4 \n" /* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */ + " ldr r4, [r3] \n" /* r4 = *r3 i.e. r4 = MAIR0. */ + " ldr r2, xMAIR0Const2 \n" /* r2 = 0xe000edc0 [Location of MAIR0]. */ + " str r4, [r2] \n" /* Program MAIR0. */ + " ldr r2, xRNRConst2 \n" /* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #4 \n" /* r4 = 4. */ + " str r4, [r2] \n" /* Program RNR = 4. */ + " adds r3, #4 \n" /* r3 = r3 + 4. r3 now points to first RBAR in TCB. */ + " ldr r2, xRBARConst2 \n" /* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r3!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */ + " \n" + " ldr r2, xMPUCTRLConst2 \n" /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n" /* Read the value of MPU_CTRL. */ + " orr r4, #1 \n" /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + " str r4, [r2] \n" /* Enable MPU. */ + " dsb \n" /* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if( configENABLE_MPU == 1 ) + " ldm r0!, {r1-r4} \n" /* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */ + " ldr r5, xSecureContextConst2 \n" + " str r1, [r5] \n" /* Set xSecureContext to this task's value for the same. */ + " msr psplim, r2 \n" /* Set this task's PSPLIM value. */ + " msr control, r3 \n" /* Set this task's CONTROL value. */ + " adds r0, #32 \n" /* Discard everything up to r0. */ + " msr psp, r0 \n" /* This is now the new top of stack to use in the task. */ + " isb \n" + " bx r4 \n" /* Finally, branch to EXC_RETURN. */ + #else /* configENABLE_MPU */ + " ldm r0!, {r1-r3} \n" /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */ + " ldr r4, xSecureContextConst2 \n" + " str r1, [r4] \n" /* Set xSecureContext to this task's value for the same. */ + " msr psplim, r2 \n" /* Set this task's PSPLIM value. */ + " movs r1, #2 \n" /* r1 = 2. */ + " msr CONTROL, r1 \n" /* Switch to use PSP in the thread mode. */ + " adds r0, #32 \n" /* Discard everything up to r0. */ + " msr psp, r0 \n" /* This is now the new top of stack to use in the task. */ + " isb \n" + " bx r3 \n" /* Finally, branch to EXC_RETURN. */ + #endif /* configENABLE_MPU */ + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" +#if( configENABLE_MPU == 1 ) /* << EST */ + "xSecureContextConst2: .word xSecureContext \n" +#endif + #if( configENABLE_MPU == 1 ) + "xMPUCTRLConst2: .word 0xe000ed94 \n" + "xMAIR0Const2: .word 0xe000edc0 \n" + "xRNRConst2: .word 0xe000ed98 \n" + "xRBARConst2: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " mrs r0, control \n" /* r0 = CONTROL. */ + " tst r0, #1 \n" /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + " ite ne \n" + " movne r0, #0 \n" /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + " moveq r0, #1 \n" /* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + " bx lr \n" /* Return. */ + " \n" + " .align 4 \n" + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " mrs r0, control \n" /* Read the CONTROL register. */ + " bic r0, #1 \n" /* Clear the bit 0. */ + " msr control, r0 \n" /* Write back the new CONTROL value. */ + " bx lr \n" /* Return to the caller. */ + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vResetPrivilege( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " mrs r0, control \n" /* r0 = CONTROL. */ + " orr r0, #1 \n" /* r0 = r0 | 1. */ + " msr control, r0 \n" /* CONTROL = r0. */ + " bx lr \n" /* Return to the caller. */ + :::"r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " ldr r0, xVTORConst \n" /* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" /* Read the VTOR register which gives the address of vector table. */ + " ldr r0, [r0] \n" /* The first entry in vector table is stack pointer. */ + " msr msp, r0 \n" /* Set the MSP back to the start of the stack. */ + " cpsie i \n" /* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc %0 \n" /* System call to start the first task. */ + " nop \n" + " \n" + " .align 4 \n" + "xVTORConst: .word 0xe000ed08 \n" + :: "i" ( portSVC_START_SCHEDULER ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +uint32_t ulSetInterruptMaskFromISR( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " mrs r0, PRIMASK \n" + " cpsid i \n" + " bx lr \n" + ::: "memory" + ); + +#if !defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + /* To avoid compiler warnings. The return statement will never be reached, + * but some compilers warn if it is not included, while others won't compile + * if it is. */ + return 0; +#endif +} +/*-----------------------------------------------------------*/ + +void vClearInterruptMaskFromISR( __attribute__( ( unused ) ) uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " msr PRIMASK, r0 \n" + " bx lr \n" + ::: "memory" + ); + +#if !defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + /* Just to avoid compiler warning. ulMask is used from the asm code but + * the compiler can't see that. Some compilers generate warnings without + * the following line, while others generate warnings if the line is + * included. */ + ( void ) ulMask; +#endif +} +/*-----------------------------------------------------------*/ + +void PendSV_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " .extern SecureContext_SaveContext \n" + " .extern SecureContext_LoadContext \n" + " \n" + " mrs r1, psp \n" /* Read PSP in r1. */ + " ldr r2, xSecureContextConst \n" /* Read the location of xSecureContext i.e. &( xSecureContext ). */ + " ldr r0, [r2] \n" /* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */ + " \n" + " cbz r0, save_ns_context \n" /* No secure context to save. */ + " push {r0-r2, r14} \n" + " bl SecureContext_SaveContext \n" + " pop {r0-r3} \n" /* LR is now in r3. */ + " mov lr, r3 \n" /* LR = r3. */ + " lsls r2, r3, #25 \n" /* r2 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + " bpl save_ns_context \n" /* bpl - branch if positive or zero. If r2 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + " ldr r3, pxCurrentTCBConst \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r2, [r3] \n" /* Read pxCurrentTCB. */ + #if( configENABLE_MPU == 1 ) + " subs r1, r1, #16 \n" /* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + " str r1, [r2] \n" /* Save the new top of stack in TCB. */ + " mrs r2, psplim \n" /* r2 = PSPLIM. */ + " mrs r3, control \n" /* r3 = CONTROL. */ + " mov r4, lr \n" /* r4 = LR/EXC_RETURN. */ + " stmia r1!, {r0, r2-r4} \n" /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + #else /* configENABLE_MPU */ + " subs r1, r1, #12 \n" /* Make space for xSecureContext, PSPLIM and LR on the stack. */ + " str r1, [r2] \n" /* Save the new top of stack in TCB. */ + " mrs r2, psplim \n" /* r2 = PSPLIM. */ + " mov r3, lr \n" /* r3 = LR/EXC_RETURN. */ + " stmia r1!, {r0, r2-r3} \n" /* Store xSecureContext, PSPLIM and LR on the stack. */ + #endif /* configENABLE_MPU */ + " b select_next_task \n" + " \n" + " save_ns_context: \n" + " ldr r3, pxCurrentTCBConst \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r2, [r3] \n" /* Read pxCurrentTCB. */ + #if( configENABLE_FPU == 1 ) + " tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the FPU is in use. */ + " it eq \n" + " vstmdbeq r1!, {s16-s31} \n" /* Store the FPU registers which are not saved automatically. */ + #endif /* configENABLE_FPU */ + #if( configENABLE_MPU == 1 ) + " subs r1, r1, #48 \n" /* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */ + " str r1, [r2] \n" /* Save the new top of stack in TCB. */ + " adds r1, r1, #16 \n" /* r1 = r1 + 16. */ + " stm r1, {r4-r11} \n" /* Store the registers that are not saved automatically. */ + " mrs r2, psplim \n" /* r2 = PSPLIM. */ + " mrs r3, control \n" /* r3 = CONTROL. */ + " mov r4, lr \n" /* r4 = LR/EXC_RETURN. */ + " subs r1, r1, #16 \n" /* r1 = r1 - 16. */ + " stm r1, {r0, r2-r4} \n" /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + #else /* configENABLE_MPU */ + " subs r1, r1, #44 \n" /* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */ + " str r1, [r2] \n" /* Save the new top of stack in TCB. */ + " adds r1, r1, #12 \n" /* r1 = r1 + 12. */ + " stm r1, {r4-r11} \n" /* Store the registers that are not saved automatically. */ + " mrs r2, psplim \n" /* r2 = PSPLIM. */ + " mov r3, lr \n" /* r3 = LR/EXC_RETURN. */ + " subs r1, r1, #12 \n" /* r1 = r1 - 12. */ + " stmia r1!, {r0, r2-r3} \n" /* Store xSecureContext, PSPLIM and LR on the stack. */ + #endif /* configENABLE_MPU */ + " \n" + " select_next_task: \n" + " cpsid i \n" + " bl vTaskSwitchContext \n" + " cpsie i \n" + " \n" + " ldr r2, pxCurrentTCBConst \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r3, [r2] \n" /* Read pxCurrentTCB. */ + " ldr r1, [r3] \n" /* The first item in pxCurrentTCB is the task top of stack. r1 now points to the top of stack. */ + " \n" + #if( configENABLE_MPU == 1 ) + " dmb \n" /* Complete outstanding transfers before disabling MPU. */ + " ldr r2, xMPUCTRLConst \n" /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n" /* Read the value of MPU_CTRL. */ + " bic r4, #1 \n" /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + " str r4, [r2] \n" /* Disable MPU. */ + " \n" + " adds r3, #4 \n" /* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */ + " ldr r4, [r3] \n" /* r4 = *r3 i.e. r4 = MAIR0. */ + " ldr r2, xMAIR0Const \n" /* r2 = 0xe000edc0 [Location of MAIR0]. */ + " str r4, [r2] \n" /* Program MAIR0. */ + " ldr r2, xRNRConst \n" /* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #4 \n" /* r4 = 4. */ + " str r4, [r2] \n" /* Program RNR = 4. */ + " adds r3, #4 \n" /* r3 = r3 + 4. r3 now points to first RBAR in TCB. */ + " ldr r2, xRBARConst \n" /* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r3!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */ + " \n" + " ldr r2, xMPUCTRLConst \n" /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n" /* Read the value of MPU_CTRL. */ + " orr r4, #1 \n" /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + " str r4, [r2] \n" /* Enable MPU. */ + " dsb \n" /* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if( configENABLE_MPU == 1 ) + " ldmia r1!, {r0, r2-r4} \n" /* Read from stack - r0 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = LR. */ + " msr psplim, r2 \n" /* Restore the PSPLIM register value for the task. */ + " msr control, r3 \n" /* Restore the CONTROL register value for the task. */ + " mov lr, r4 \n" /* LR = r4. */ + " ldr r2, xSecureContextConst \n" /* Read the location of xSecureContext i.e. &( xSecureContext ). */ + " str r0, [r2] \n" /* Restore the task's xSecureContext. */ + " cbz r0, restore_ns_context \n" /* If there is no secure context for the task, restore the non-secure context. */ + " push {r1,r4} \n" + " bl SecureContext_LoadContext \n" /* Restore the secure context. */ + " pop {r1,r4} \n" + " mov lr, r4 \n" /* LR = r4. */ + " lsls r2, r4, #25 \n" /* r2 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + " bpl restore_ns_context \n" /* bpl - branch if positive or zero. If r2 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + " msr psp, r1 \n" /* Remember the new top of stack for the task. */ + " bx lr \n" + #else /* configENABLE_MPU */ + " ldmia r1!, {r0, r2-r3} \n" /* Read from stack - r0 = xSecureContext, r2 = PSPLIM and r3 = LR. */ + " msr psplim, r2 \n" /* Restore the PSPLIM register value for the task. */ + " mov lr, r3 \n" /* LR = r3. */ + " ldr r2, xSecureContextConst \n" /* Read the location of xSecureContext i.e. &( xSecureContext ). */ + " str r0, [r2] \n" /* Restore the task's xSecureContext. */ + " cbz r0, restore_ns_context \n" /* If there is no secure context for the task, restore the non-secure context. */ + " push {r1,r3} \n" + " bl SecureContext_LoadContext \n" /* Restore the secure context. */ + " pop {r1,r3} \n" + " mov lr, r3 \n" /* LR = r3. */ + " lsls r2, r3, #25 \n" /* r2 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + " bpl restore_ns_context \n" /* bpl - branch if positive or zero. If r2 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + " msr psp, r1 \n" /* Remember the new top of stack for the task. */ + " bx lr \n" + #endif /* configENABLE_MPU */ + " \n" + " restore_ns_context: \n" + " ldmia r1!, {r4-r11} \n" /* Restore the registers that are not automatically restored. */ + #if( configENABLE_FPU == 1 ) + " tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the FPU is in use. */ + " it eq \n" + " vldmiaeq r1!, {s16-s31} \n" /* Restore the FPU registers which are not restored automatically. */ + #endif /* configENABLE_FPU */ + " msr psp, r1 \n" /* Remember the new top of stack for the task. */ + " bx lr \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + "xSecureContextConst: .word xSecureContext \n" + #if( configENABLE_MPU == 1 ) + "xMPUCTRLConst: .word 0xe000ed94 \n" + "xMAIR0Const: .word 0xe000edc0 \n" + "xRNRConst: .word 0xe000ed98 \n" + "xRBARConst: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ); +} +/*-----------------------------------------------------------*/ + +void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " tst lr, #4 \n" + " ite eq \n" + " mrseq r0, msp \n" + " mrsne r0, psp \n" + " ldr r1, svchandler_address_const \n" + " bx r1 \n" + " \n" + " .align 4 \n" + "svchandler_address_const: .word vPortSVCHandler_C \n" + ); +} +/*-----------------------------------------------------------*/ + +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " svc %0 \n" /* Secure context is allocated in the supervisor call. */ + " bx lr \n" /* Return. */ + :: "i" ( portSVC_ALLOCATE_SECURE_CONTEXT ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vPortFreeSecureContext( uint32_t *pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " ldr r1, [r0] \n" /* The first item in the TCB is the top of the stack. */ + " ldr r0, [r1] \n" /* The first item on the stack is the task's xSecureContext. */ + " cmp r0, #0 \n" /* Raise svc if task's xSecureContext is not NULL. */ + " it ne \n" + " svcne %0 \n" /* Secure context is freed in the supervisor call. */ + " bx lr \n" /* Return. */ + :: "i" ( portSVC_FREE_SECURE_CONTEXT ) : "memory" + ); +} +/*-----------------------------------------------------------*/ diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/portasm.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/portasm.h new file mode 100644 index 0000000..2ecf04e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/portasm.h @@ -0,0 +1,113 @@ +/* + * FreeRTOS Kernel V10.2.1 + * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +#ifndef __PORT_ASM_H__ +#define __PORT_ASM_H__ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/** + * @brief Restore the context of the first task so that the first task starts + * executing. + */ +void vRestoreContextOfFirstTask( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ) __attribute__ (( naked )); + +/** + * @brief Raises the privilege level by clearing the bit 0 of the CONTROL + * register. + * + * @note This is a privileged function and should only be called from the kenrel + * code. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vRaisePrivilege( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION; + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ) __attribute__ (( naked )); + +/** + * @brief Starts the first task. + */ +void vStartFirstTask( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION; + +/** + * @brief Disables interrupts. + */ +uint32_t ulSetInterruptMaskFromISR( void ) __attribute__(( naked )) PRIVILEGED_FUNCTION; + +/** + * @brief Enables interrupts. + */ +void vClearInterruptMaskFromISR( uint32_t ulMask ) __attribute__(( naked )) PRIVILEGED_FUNCTION; + +/** + * @brief PendSV Exception handler. + */ +void PendSV_Handler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION; + +/** + * @brief SVC Handler. + */ +void SVC_Handler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION; + +/** + * @brief Allocate a Secure context for the calling task. + * + * @param[in] ulSecureStackSize The size of the stack to be allocated on the + * secure side for the calling task. + */ +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__ (( naked )); + +/** + * @brief Free the task's secure context. + * + * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task. + */ +void vPortFreeSecureContext( uint32_t *pulTCB ) __attribute__ (( naked )) PRIVILEGED_FUNCTION; + +#endif /* __PORT_ASM_H__ */ diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/portmacro.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/portmacro.h new file mode 100644 index 0000000..a9e2aff --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/non_secure/portmacro.h @@ -0,0 +1,304 @@ +/* + * FreeRTOS Kernel V10.2.1 + * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +#ifndef configENABLE_FPU + #error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU. +#endif /* configENABLE_FPU */ + +#ifndef configENABLE_MPU + #error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU. +#endif /* configENABLE_MPU */ + +#ifndef configENABLE_TRUSTZONE + #error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone. +#endif /* configENABLE_TRUSTZONE */ + +/*-----------------------------------------------------------*/ + +/** + * @brief Type definitions. + */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M33" +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portNOP() +#define portINLINE __inline +#ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__(( always_inline )) +#endif +#define portHAS_STACK_OVERFLOW_CHECKING 1 +#define portDONT_DISCARD __attribute__(( used )) +/*-----------------------------------------------------------*/ + +/** + * @brief Extern declarations. + */ +extern void vPortYield( void ) /* PRIVILEGED_FUNCTION */; + +extern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */; +extern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */; + +extern uint32_t ulSetInterruptMaskFromISR( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; +extern void vClearInterruptMaskFromISR( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + +#if( configENABLE_TRUSTZONE == 1 ) + extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */ + extern void vPortFreeSecureContext( uint32_t *pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */; +#endif /* configENABLE_TRUSTZONE */ + +#if( configENABLE_MPU == 1 ) + extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */; + extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */; +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief MPU specific constants. + */ +#if( configENABLE_MPU == 1 ) + #define portUSING_MPU_WRAPPERS 1 + #define portPRIVILEGE_BIT ( 0x80000000UL ) +#else + #define portPRIVILEGE_BIT ( 0x0UL ) +#endif /* configENABLE_MPU */ + + +/* MPU regions. */ +#define portPRIVILEGED_FLASH_REGION ( 0UL ) +#define portUNPRIVILEGED_FLASH_REGION ( 1UL ) +#define portUNPRIVILEGED_SYSCALLS_REGION ( 2UL ) +#define portPRIVILEGED_RAM_REGION ( 3UL ) +#define portSTACK_REGION ( 4UL ) +#define portFIRST_CONFIGURABLE_REGION ( 5UL ) +#define portLAST_CONFIGURABLE_REGION ( 7UL ) +#define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) +#define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + +/* Device memory attributes used in MPU_MAIR registers. + * + * 8-bit values encoded as follows: + * Bit[7:4] - 0000 - Device Memory + * Bit[3:2] - 00 --> Device-nGnRnE + * 01 --> Device-nGnRE + * 10 --> Device-nGRE + * 11 --> Device-GRE + * Bit[1:0] - 00, Reserved. + */ +#define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */ +#define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */ +#define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */ +#define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */ + +/* Normal memory attributes used in MPU_MAIR registers. */ +#define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */ +#define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */ + +/* Attributes used in MPU_RBAR registers. */ +#define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL ) +#define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL ) +#define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL ) + +#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL ) +#define portMPU_REGION_READ_WRITE ( 1UL << 1UL ) +#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL ) +#define portMPU_REGION_READ_ONLY ( 3UL << 1UL ) + +#define portMPU_REGION_EXECUTE_NEVER ( 1UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Settings to define an MPU region. + */ +typedef struct MPURegionSettings +{ + uint32_t ulRBAR; /**< RBAR for the region. */ + uint32_t ulRLAR; /**< RLAR for the region. */ +} MPURegionSettings_t; + +/** + * @brief MPU settings as stored in the TCB. + */ +typedef struct MPU_SETTINGS +{ + uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */ + MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */ +} xMPU_SETTINGS; +/*-----------------------------------------------------------*/ + +/** + * @brief SVC numbers. + */ +#define portSVC_ALLOCATE_SECURE_CONTEXT 0 +#define portSVC_FREE_SECURE_CONTEXT 1 +#define portSVC_START_SCHEDULER 2 +#define portSVC_RAISE_PRIVILEGE 3 +/*-----------------------------------------------------------*/ + +/** + * @brief Scheduler utilities. + */ +#define portYIELD() vPortYield() +#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMaskFromISR() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vClearInterruptMaskFromISR( x ) +#define portDISABLE_INTERRUPTS() __asm volatile ( " cpsid i " ::: "memory" ) +#define portENABLE_INTERRUPTS() __asm volatile ( " cpsie i " ::: "memory" ) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +#if 1 /* << EST */ +#define portDISABLE_ALL_INTERRUPTS() __asm volatile("cpsid i") +#define portENABLE_ALL_INTERRUPTS() __asm volatile("cpsie i") +#endif + +/** + * @brief Task function macros as described on the FreeRTOS.org WEB site. + */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#if( configENABLE_TRUSTZONE == 1 ) + /** + * @brief Allocate a secure context for the task. + * + * Tasks are not created with a secure context. Any task that is going to call + * secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a + * secure context before it calls any secure function. + * + * @param[in] ulSecureStackSize The size of the secure stack to be allocated. + */ + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize ) + + /** + * @brief Called when a task is deleted to delete the task's secure context, + * if it has one. + * + * @param[in] pxTCB The TCB of the task being deleted. + */ + #define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB ) +#else + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) + #define portCLEAN_UP_TCB( pxTCB ) +#endif /* configENABLE_TRUSTZONE */ +/*-----------------------------------------------------------*/ + +#if( configENABLE_MPU == 1 ) + /** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ + #define portIS_PRIVILEGED() xIsPrivileged() + + /** + * @brief Raise an SVC request to raise privilege. + * + * The SVC handler checks that the SVC was raised from a system call and only + * then it raises the privilege. If this is called from any other place, + * the privilege is not raised. + */ + #define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" :: "i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + + /** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ + #define portRESET_PRIVILEGE() vResetPrivilege() +#else + #define portIS_PRIVILEGED() + #define portRAISE_PRIVILEGE() + #define portRESET_PRIVILEGE() +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief Barriers. + */ +#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" ) +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_context.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_context.c new file mode 100644 index 0000000..53535cd --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_context.c @@ -0,0 +1,204 @@ +/* + * FreeRTOS Kernel V10.2.1 + * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +/* Secure context includes. */ +#include "secure_context.h" + +/* Secure heap includes. */ +#include "secure_heap.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief CONTROL value for privileged tasks. + * + * Bit[0] - 0 --> Thread mode is privileged. + * Bit[1] - 1 --> Thread mode uses PSP. + */ +#define securecontextCONTROL_VALUE_PRIVILEGED 0x02 + +/** + * @brief CONTROL value for un-privileged tasks. + * + * Bit[0] - 1 --> Thread mode is un-privileged. + * Bit[1] - 1 --> Thread mode uses PSP. + */ +#define securecontextCONTROL_VALUE_UNPRIVILEGED 0x03 +/*-----------------------------------------------------------*/ + +/** + * @brief Structure to represent secure context. + * + * @note Since stack grows down, pucStackStart is the highest address while + * pucStackLimit is the first addess of the allocated memory. + */ +typedef struct SecureContext +{ + uint8_t *pucCurrentStackPointer; /**< Current value of stack pointer (PSP). */ + uint8_t *pucStackLimit; /**< Last location of the stack memory (PSPLIM). */ + uint8_t *pucStackStart; /**< First location of the stack memory. */ +} SecureContext_t; +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_Init( void ) +{ + uint32_t ulIPSR; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + /* No stack for thread mode until a task's context is loaded. */ + secureportSET_PSPLIM( securecontextNO_STACK ); + secureportSET_PSP( securecontextNO_STACK ); + + #if( configENABLE_MPU == 1 ) + { + /* Configure thread mode to use PSP and to be unprivileged. */ + secureportSET_CONTROL( securecontextCONTROL_VALUE_UNPRIVILEGED ); + } + #else /* configENABLE_MPU */ + { + /* Configure thread mode to use PSP and to be privileged.. */ + secureportSET_CONTROL( securecontextCONTROL_VALUE_PRIVILEGED ); + } + #endif /* configENABLE_MPU */ + } +} +/*-----------------------------------------------------------*/ + +#if( configENABLE_MPU == 1 ) + secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, uint32_t ulIsTaskPrivileged ) +#else /* configENABLE_MPU */ + secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize ) +#endif /* configENABLE_MPU */ +{ + uint8_t *pucStackMemory = NULL; + uint32_t ulIPSR; + SecureContextHandle_t xSecureContextHandle = NULL; + #if( configENABLE_MPU == 1 ) + uint32_t *pulCurrentStackPointer = NULL; + #endif /* configENABLE_MPU */ + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + /* Allocate the context structure. */ + xSecureContextHandle = ( SecureContextHandle_t ) pvPortMalloc( sizeof( SecureContext_t ) ); + + if( xSecureContextHandle != NULL ) + { + /* Allocate the stack space. */ + pucStackMemory = pvPortMalloc( ulSecureStackSize ); + + if( pucStackMemory != NULL ) + { + /* Since stack grows down, the starting point will be the last + * location. Note that this location is next to the last + * allocated byte because the hardware decrements the stack + * pointer before writing i.e. if stack pointer is 0x2, a push + * operation will decrement the stack pointer to 0x1 and then + * write at 0x1. */ + xSecureContextHandle->pucStackStart = pucStackMemory + ulSecureStackSize; + + /* The stack cannot go beyond this location. This value is + * programmed in the PSPLIM register on context switch.*/ + xSecureContextHandle->pucStackLimit = pucStackMemory; + + #if( configENABLE_MPU == 1 ) + { + /* Store the correct CONTROL value for the task on the stack. + * This value is programmed in the CONTROL register on + * context switch. */ + pulCurrentStackPointer = ( uint32_t * ) xSecureContextHandle->pucStackStart; + pulCurrentStackPointer--; + if( ulIsTaskPrivileged ) + { + *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_PRIVILEGED; + } + else + { + *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_UNPRIVILEGED; + } + + /* Store the current stack pointer. This value is programmed in + * the PSP register on context switch. */ + xSecureContextHandle->pucCurrentStackPointer = ( uint8_t * ) pulCurrentStackPointer; + } + #else /* configENABLE_MPU */ + { + /* Current SP is set to the starting of the stack. This + * value programmed in the PSP register on context switch. */ + xSecureContextHandle->pucCurrentStackPointer = xSecureContextHandle->pucStackStart; + + } + #endif /* configENABLE_MPU */ + } + else + { + /* Free the context to avoid memory leak and make sure to return + * NULL to indicate failure. */ + vPortFree( xSecureContextHandle ); + xSecureContextHandle = NULL; + } + } + } + + return xSecureContextHandle; +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle ) +{ + uint32_t ulIPSR; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + /* Ensure that valid parameters are passed. */ + secureportASSERT( xSecureContextHandle != NULL ); + + /* Free the stack space. */ + vPortFree( xSecureContextHandle->pucStackLimit ); + + /* Free the context itself. */ + vPortFree( xSecureContextHandle ); + } +} +/*-----------------------------------------------------------*/ diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_context.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_context.h new file mode 100644 index 0000000..e148bff --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_context.h @@ -0,0 +1,111 @@ +/* + * FreeRTOS Kernel V10.2.1 + * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +#ifndef __SECURE_CONTEXT_H__ +#define __SECURE_CONTEXT_H__ + +/* Standard includes. */ +#include + +/* FreeRTOS includes. */ +#include "FreeRTOSConfig.h" + +/** + * @brief PSP value when no task's context is loaded. + */ +#define securecontextNO_STACK 0x0 + +/** + * @brief Opaque handle. + */ +struct SecureContext; +typedef struct SecureContext* SecureContextHandle_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Initializes the secure context management system. + * + * PSP is set to NULL and therefore a task must allocate and load a context + * before calling any secure side function in the thread mode. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureContext_Init( void ); + +/** + * @brief Allocates a context on the secure side. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] ulSecureStackSize Size of the stack to allocate on secure side. + * @param[in] ulIsTaskPrivileged 1 if the calling task is privileged, 0 otherwise. + * + * @return Opaque context handle if context is successfully allocated, NULL + * otherwise. + */ +#if( configENABLE_MPU == 1 ) + SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, uint32_t ulIsTaskPrivileged ); +#else /* configENABLE_MPU */ + SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize ); +#endif /* configENABLE_MPU */ + +/** + * @brief Frees the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the + * context to be freed. + */ +void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle ); + +/** + * @brief Loads the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the context + * to be loaded. + */ +void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle ); + +/** + * @brief Saves the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the context + * to be saved. + */ +void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle ); + +#endif /* __SECURE_CONTEXT_H__ */ diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_context_port.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_context_port.c new file mode 100644 index 0000000..7c556f5 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_context_port.c @@ -0,0 +1,88 @@ +/* + * FreeRTOS Kernel V10.2.1 + * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +/* Secure context includes. */ +#include "secure_context.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +secureportNON_SECURE_CALLABLE void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle ) +{ + /* xSecureContextHandle value is in r0. */ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r1, ipsr \n" /* r1 = IPSR. */ + " cbz r1, load_ctx_therad_mode \n" /* Do nothing if the processor is running in the Thread Mode. */ + " ldmia r0!, {r1, r2} \n" /* r1 = xSecureContextHandle->pucCurrentStackPointer, r2 = xSecureContextHandle->pucStackLimit. */ + #if( configENABLE_MPU == 1 ) + " ldmia r1!, {r3} \n" /* Read CONTROL register value from task's stack. r3 = CONTROL. */ + " msr control, r3 \n" /* CONTROL = r3. */ + #endif /* configENABLE_MPU */ + " msr psplim, r2 \n" /* PSPLIM = r2. */ + " msr psp, r1 \n" /* PSP = r1. */ + " \n" + " load_ctx_therad_mode: \n" + " nop \n" + " \n" + :::"r0", "r1", "r2" + ); +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle ) +{ + /* xSecureContextHandle value is in r0. */ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r1, ipsr \n" /* r1 = IPSR. */ + " cbz r1, save_ctx_therad_mode \n" /* Do nothing if the processor is running in the Thread Mode. */ + " mrs r1, psp \n" /* r1 = PSP. */ + #if( configENABLE_FPU == 1 ) + " vstmdb r1!, {s0} \n" /* Trigger the defferred stacking of FPU registers. */ + " vldmia r1!, {s0} \n" /* Nullify the effect of the pervious statement. */ + #endif /* configENABLE_FPU */ + #if( configENABLE_MPU == 1 ) + " mrs r2, control \n" /* r2 = CONTROL. */ + " stmdb r1!, {r2} \n" /* Store CONTROL value on the stack. */ + #endif /* configENABLE_MPU */ + " str r1, [r0] \n" /* Save the top of stack in context. xSecureContextHandle->pucCurrentStackPointer = r1. */ + " movs r1, %0 \n" /* r1 = securecontextNO_STACK. */ + " msr psplim, r1 \n" /* PSPLIM = securecontextNO_STACK. */ + " msr psp, r1 \n" /* PSP = securecontextNO_STACK i.e. No stack for thread mode until next task's context is loaded. */ + " \n" + " save_ctx_therad_mode: \n" + " nop \n" + " \n" + :: "i" ( securecontextNO_STACK ) : "r1", "memory" + ); +} +/*-----------------------------------------------------------*/ diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_heap.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_heap.c new file mode 100644 index 0000000..60fce5c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_heap.c @@ -0,0 +1,450 @@ +/* + * FreeRTOS Kernel V10.2.1 + * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +/* Standard includes. */ +#include + +/* Secure context heap includes. */ +#include "secure_heap.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief Total heap size. + */ +#define secureconfigTOTAL_HEAP_SIZE ( ( ( size_t ) ( 10 * 1024 ) ) ) + +/* No test marker by default. */ +#ifndef mtCOVERAGE_TEST_MARKER + #define mtCOVERAGE_TEST_MARKER() +#endif + +/* No tracing by default. */ +#ifndef traceMALLOC + #define traceMALLOC( pvReturn, xWantedSize ) +#endif + +/* No tracing by default. */ +#ifndef traceFREE + #define traceFREE( pv, xBlockSize ) +#endif + +/* Block sizes must not get too small. */ +#define secureheapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) ) + +/* Assumes 8bit bytes! */ +#define secureheapBITS_PER_BYTE ( ( size_t ) 8 ) +/*-----------------------------------------------------------*/ + +/* Allocate the memory for the heap. */ +#if( configAPPLICATION_ALLOCATED_HEAP == 1 ) + /* The application writer has already defined the array used for the RTOS + * heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ]; +#else /* configAPPLICATION_ALLOCATED_HEAP */ + static uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + +/** + * @brief The linked list structure. + * + * This is used to link free blocks in order of their memory address. + */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK *pxNextFreeBlock; /**< The next free block in the list. */ + size_t xBlockSize; /**< The size of the free block. */ +} BlockLink_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Called automatically to setup the required heap structures the first + * time pvPortMalloc() is called. + */ +static void prvHeapInit( void ); + +/** + * @brief Inserts a block of memory that is being freed into the correct + * position in the list of free memory blocks. + * + * The block being freed will be merged with the block in front it and/or the + * block behind it if the memory blocks are adjacent to each other. + * + * @param[in] pxBlockToInsert The block being freed. + */ +static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert ); +/*-----------------------------------------------------------*/ + +/** + * @brief The size of the structure placed at the beginning of each allocated + * memory block must by correctly byte aligned. + */ +static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( secureportBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + +/** + * @brief Create a couple of list links to mark the start and end of the list. + */ +static BlockLink_t xStart, *pxEnd = NULL; + +/** + * @brief Keeps track of the number of free bytes remaining, but says nothing + * about fragmentation. + */ +static size_t xFreeBytesRemaining = 0U; +static size_t xMinimumEverFreeBytesRemaining = 0U; + +/** + * @brief Gets set to the top bit of an size_t type. + * + * When this bit in the xBlockSize member of an BlockLink_t structure is set + * then the block belongs to the application. When the bit is free the block is + * still part of the free heap space. + */ +static size_t xBlockAllocatedBit = 0; +/*-----------------------------------------------------------*/ + +static void prvHeapInit( void ) +{ +BlockLink_t *pxFirstFreeBlock; +uint8_t *pucAlignedHeap; +size_t uxAddress; +size_t xTotalHeapSize = secureconfigTOTAL_HEAP_SIZE; + + /* Ensure the heap starts on a correctly aligned boundary. */ + uxAddress = ( size_t ) ucHeap; + + if( ( uxAddress & secureportBYTE_ALIGNMENT_MASK ) != 0 ) + { + uxAddress += ( secureportBYTE_ALIGNMENT - 1 ); + uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + xTotalHeapSize -= uxAddress - ( size_t ) ucHeap; + } + + pucAlignedHeap = ( uint8_t * ) uxAddress; + + /* xStart is used to hold a pointer to the first item in the list of free + * blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + + /* pxEnd is used to mark the end of the list of free blocks and is inserted + * at the end of the heap space. */ + uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize; + uxAddress -= xHeapStructSize; + uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + pxEnd = ( void * ) uxAddress; + pxEnd->xBlockSize = 0; + pxEnd->pxNextFreeBlock = NULL; + + /* To start with there is a single free block that is sized to take up the + * entire heap space, minus the space taken by pxEnd. */ + pxFirstFreeBlock = ( void * ) pucAlignedHeap; + pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock; + pxFirstFreeBlock->pxNextFreeBlock = pxEnd; + + /* Only one block exists - and it covers the entire usable heap space. */ + xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + + /* Work out the position of the top bit in a size_t variable. */ + xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * secureheapBITS_PER_BYTE ) - 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert ) +{ +BlockLink_t *pxIterator; +uint8_t *puc; + + /* Iterate through the list until a block is found that has a higher address + * than the block being inserted. */ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) + { + /* Nothing to do here, just iterate to the right position. */ + } + + /* Do the block being inserted, and the block it is being inserted after + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) + { + pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; + pxBlockToInsert = pxIterator; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Do the block being inserted, and the block it is being inserted before + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxBlockToInsert; + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) + { + if( pxIterator->pxNextFreeBlock != pxEnd ) + { + /* Form one big block from the two blocks. */ + pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxEnd; + } + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + } + + /* If the block being inserted plugged a gab, so was merged with the block + * before and the block after, then it's pxNextFreeBlock pointer will have + * already been set, and should not be set here as that would make it point + * to itself. */ + if( pxIterator != pxBlockToInsert ) + { + pxIterator->pxNextFreeBlock = pxBlockToInsert; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink; +void *pvReturn = NULL; + + /* If this is the first call to malloc then the heap will require + * initialisation to setup the list of free blocks. */ + if( pxEnd == NULL ) + { + prvHeapInit(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Check the requested block size is not so large that the top bit is set. + * The top bit of the block size member of the BlockLink_t structure is used + * to determine who owns the block - the application or the kernel, so it + * must be free. */ + if( ( xWantedSize & xBlockAllocatedBit ) == 0 ) + { + /* The wanted size is increased so it can contain a BlockLink_t + * structure in addition to the requested amount of bytes. */ + if( xWantedSize > 0 ) + { + xWantedSize += xHeapStructSize; + + /* Ensure that blocks are always aligned to the required number of + * bytes. */ + if( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) != 0x00 ) + { + /* Byte alignment required. */ + xWantedSize += ( secureportBYTE_ALIGNMENT - ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) ); + secureportASSERT( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) == 0 ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Traverse the list from the start (lowest address) block until + * one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If the end marker was reached then a block of adequate size was + * not found. */ + if( pxBlock != pxEnd ) + { + /* Return the memory space pointed to - jumping over the + * BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); + + /* This block is being returned for use so must be taken out + * of the list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into + * two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > secureheapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new + * block following the number of bytes requested. The void + * cast is used to prevent byte alignment warnings from the + * compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + secureportASSERT( ( ( ( size_t ) pxNewBlockLink ) & secureportBYTE_ALIGNMENT_MASK ) == 0 ); + + /* Calculate the sizes of two blocks split from the single + * block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( pxNewBlockLink ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned by + * the application and has no "next" block. */ + pxBlock->xBlockSize |= xBlockAllocatedBit; + pxBlock->pxNextFreeBlock = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceMALLOC( pvReturn, xWantedSize ); + + #if( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif + + secureportASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) secureportBYTE_ALIGNMENT_MASK ) == 0 ); + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ +uint8_t *puc = ( uint8_t * ) pv; +BlockLink_t *pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + * before it. */ + puc -= xHeapStructSize; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + /* Check the block is actually allocated. */ + secureportASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); + secureportASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + * allocated. */ + pxLink->xBlockSize &= ~xBlockAllocatedBit; + + secureportDISABLE_NON_SECURE_INTERRUPTS(); + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + } + secureportENABLE_NON_SECURE_INTERRUPTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetMinimumEverFreeHeapSize( void ) +{ + return xMinimumEverFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* This just exists to keep the linker quiet. */ +} +/*-----------------------------------------------------------*/ diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_heap.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_heap.h new file mode 100644 index 0000000..69e4f2a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_heap.h @@ -0,0 +1,51 @@ +/* + * FreeRTOS Kernel V10.2.1 + * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +#ifndef __SECURE_HEAP_H__ +#define __SECURE_HEAP_H__ + +/* Standard includes. */ +#include + +/** + * @brief Allocates memory from heap. + * + * @param[in] xWantedSize The size of the memory to be allocated. + * + * @return Pointer to the memory region if the allocation is successful, NULL + * otherwise. + */ +void *pvPortMalloc( size_t xWantedSize ); + +/** + * @brief Frees the previously allocated memory. + * + * @param[in] pv Pointer to the memory to be freed. + */ +void vPortFree( void *pv ); + +#endif /* __SECURE_HEAP_H__ */ diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_init.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_init.c new file mode 100644 index 0000000..c6525f7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_init.c @@ -0,0 +1,105 @@ +/* + * FreeRTOS Kernel V10.2.1 + * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +/* Standard includes. */ +#include + +/* Secure init includes. */ +#include "secure_init.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief Constants required to manipulate the SCB. + */ +#define secureinitSCB_AIRCR ( ( volatile uint32_t * ) 0xe000ed0c ) /* Application Interrupt and Reset Control Register. */ +#define secureinitSCB_AIRCR_VECTKEY_POS ( 16UL ) +#define secureinitSCB_AIRCR_VECTKEY_MASK ( 0xFFFFUL << secureinitSCB_AIRCR_VECTKEY_POS ) +#define secureinitSCB_AIRCR_PRIS_POS ( 14UL ) +#define secureinitSCB_AIRCR_PRIS_MASK ( 1UL << secureinitSCB_AIRCR_PRIS_POS ) + +/** + * @brief Constants required to manipulate the FPU. + */ +#define secureinitFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define secureinitFPCCR_LSPENS_POS ( 29UL ) +#define secureinitFPCCR_LSPENS_MASK ( 1UL << secureinitFPCCR_LSPENS_POS ) +#define secureinitFPCCR_TS_POS ( 26UL ) +#define secureinitFPCCR_TS_MASK ( 1UL << secureinitFPCCR_TS_POS ) + +#define secureinitNSACR ( ( volatile uint32_t * ) 0xe000ed8c ) /* Non-secure Access Control Register. */ +#define secureinitNSACR_CP10_POS ( 10UL ) +#define secureinitNSACR_CP10_MASK ( 1UL << secureinitNSACR_CP10_POS ) +#define secureinitNSACR_CP11_POS ( 11UL ) +#define secureinitNSACR_CP11_MASK ( 1UL << secureinitNSACR_CP11_POS ) +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureInit_DePrioritizeNSExceptions( void ) +{ + uint32_t ulIPSR; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + *( secureinitSCB_AIRCR ) = ( *( secureinitSCB_AIRCR ) & ~( secureinitSCB_AIRCR_VECTKEY_MASK | secureinitSCB_AIRCR_PRIS_MASK ) ) | + ( ( 0x05FAUL << secureinitSCB_AIRCR_VECTKEY_POS ) & secureinitSCB_AIRCR_VECTKEY_MASK ) | + ( ( 0x1UL << secureinitSCB_AIRCR_PRIS_POS ) & secureinitSCB_AIRCR_PRIS_MASK ); + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureInit_EnableNSFPUAccess( void ) +{ + uint32_t ulIPSR; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + /* CP10 = 1 ==> Non-secure access to the Floating Point Unit is + * permitted. CP11 should be programmed to the same value as CP10. */ + *( secureinitNSACR ) |= ( secureinitNSACR_CP10_MASK | secureinitNSACR_CP11_MASK ); + + /* LSPENS = 0 ==> LSPEN is writable fron non-secure state. This ensures + * that we can enable/disable lazy stacking in port.c file. */ + *( secureinitFPCCR ) &= ~ ( secureinitFPCCR_LSPENS_MASK ); + + /* TS = 1 ==> Treat FP registers as secure i.e. callee saved FP + * registers (S16-S31) are also pushed to stack on exception entry and + * restored on exception return. */ + *( secureinitFPCCR ) |= ( secureinitFPCCR_TS_MASK ); + } +} +/*-----------------------------------------------------------*/ diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_init.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_init.h new file mode 100644 index 0000000..6c5bc71 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_init.h @@ -0,0 +1,53 @@ +/* + * FreeRTOS Kernel V10.2.1 + * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +#ifndef __SECURE_INIT_H__ +#define __SECURE_INIT_H__ + +/** + * @brief De-prioritizes the non-secure exceptions. + * + * This is needed to ensure that the non-secure PendSV runs at the lowest + * priority. Context switch is done in the non-secure PendSV handler. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureInit_DePrioritizeNSExceptions( void ); + +/** + * @brief Sets up the Floating Point Unit (FPU) for Non-Secure access. + * + * Also sets FPCCR.TS=1 to ensure that the content of the Floating Point + * Registers are not leaked to the non-secure side. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureInit_EnableNSFPUAccess( void ); + +#endif /* __SECURE_INIT_H__ */ diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_port_macros.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_port_macros.h new file mode 100644 index 0000000..760edab --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33/secure/secure_port_macros.h @@ -0,0 +1,133 @@ +/* + * FreeRTOS Kernel V10.2.1 + * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +#ifndef __SECURE_PORT_MACROS_H__ +#define __SECURE_PORT_MACROS_H__ + +/** + * @brief Byte alignment requirements. + */ +#define secureportBYTE_ALIGNMENT 8 +#define secureportBYTE_ALIGNMENT_MASK ( 0x0007 ) + +/** + * @brief Macro to declare a function as non-secure callable. + */ +#if defined( __IAR_SYSTEMS_ICC__ ) + #define secureportNON_SECURE_CALLABLE __cmse_nonsecure_entry __root +#else + #define secureportNON_SECURE_CALLABLE __attribute__((cmse_nonsecure_entry)) __attribute__((used)) +#endif + +/** + * @brief Set the secure PRIMASK value. + */ +#define secureportSET_SECURE_PRIMASK( ulPrimaskValue ) \ + __asm volatile ( "msr primask, %0" : : "r" ( ulPrimaskValue ) : "memory" ) + +/** + * @brief Set the non-secure PRIMASK value. + */ +#define secureportSET_NON_SECURE_PRIMASK( ulPrimaskValue ) \ + __asm volatile ( "msr primask_ns, %0" : : "r" ( ulPrimaskValue ) : "memory" ) + +/** + * @brief Read the PSP value in the given variable. + */ +#define secureportREAD_PSP( pucOutCurrentStackPointer ) \ + __asm volatile ( "mrs %0, psp" : "=r" ( pucOutCurrentStackPointer ) ) + +/** + * @brief Set the PSP to the given value. + */ +#define secureportSET_PSP( pucCurrentStackPointer ) \ + __asm volatile ( "msr psp, %0" : : "r" ( pucCurrentStackPointer ) ) + +/** + * @brief Set the PSPLIM to the given value. + */ +#define secureportSET_PSPLIM( pucStackLimit ) \ + __asm volatile ( "msr psplim, %0" : : "r" ( pucStackLimit ) ) + +/** + * @brief Set the NonSecure MSP to the given value. + */ +#define secureportSET_MSP_NS( pucMainStackPointer ) \ + __asm volatile ( "msr msp_ns, %0" : : "r" ( pucMainStackPointer ) ) + +/** + * @brief Set the CONTROL register to the given value. + */ +#define secureportSET_CONTROL( ulControl ) \ + __asm volatile ( "msr control, %0" : : "r" ( ulControl ) : "memory" ) + +/** + * @brief Read the Interrupt Program Status Register (IPSR) value in the given + * variable. + */ +#define secureportREAD_IPSR( ulIPSR ) \ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulIPSR ) ) + +/** + * @brief PRIMASK value to enable interrupts. + */ +#define secureportPRIMASK_ENABLE_INTERRUPTS_VAL 0 + +/** + * @brief PRIMASK value to disable interrupts. + */ +#define secureportPRIMASK_DISABLE_INTERRUPTS_VAL 1 + +/** + * @brief Disable secure interrupts. + */ +#define secureportDISABLE_SECURE_INTERRUPTS() secureportSET_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL ) + +/** + * @brief Disable non-secure interrupts. + * + * This effectively disables context switches. + */ +#define secureportDISABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL ) + +/** + * @brief Enable non-secure interrupts. + */ +#define secureportENABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_ENABLE_INTERRUPTS_VAL ) + +/** + * @brief Assert definition. + */ +#define secureportASSERT( x ) \ + if( ( x ) == 0 ) \ + { \ + secureportDISABLE_SECURE_INTERRUPTS(); \ + secureportDISABLE_NON_SECURE_INTERRUPTS(); \ + for( ;; ); \ + } + +#endif /* __SECURE_PORT_MACROS_H__ */ diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/.gdbinit-FreeRTOS-helpers b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/.gdbinit-FreeRTOS-helpers new file mode 100644 index 0000000..8718d5a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/.gdbinit-FreeRTOS-helpers @@ -0,0 +1,155 @@ +################################################################################# +# .gdbinit-FreeRTOS-helpers +# +# Created on: 29.03.2013 +# Author: Artem Pisarenko +# +# Helper script providing support for FreeRTOS-aware debugging +# Supported architectures: Cortex-M3 +# Features: +# - showing tasks (handle and name); +# - switching context to specified task from almost any context (excluding system exceptions); +# - restore current running context. +################################################################################# + +# Command "freertos_show_threads" +# Shows tasks table: handle(xTaskHandle) and name +define freertos_show_threads + set $thread_list_size = 0 + set $thread_list_size = uxCurrentNumberOfTasks + if ($thread_list_size == 0) + echo FreeRTOS missing or scheduler isn't started\n + else + set $current_thread = pxCurrentTCB + set $tasks_found = 0 + set $idx = 0 + + set $task_list = pxReadyTasksLists + set $task_list_size = sizeof(pxReadyTasksLists)/sizeof(pxReadyTasksLists[0]) + while ($idx < $task_list_size) + _freertos_show_thread_item $task_list[$idx] + set $idx = $idx + 1 + end + + _freertos_show_thread_item xDelayedTaskList1 + _freertos_show_thread_item xDelayedTaskList2 + _freertos_show_thread_item xPendingReadyList + + set $VAL_dbgFreeRTOSConfig_suspend = dbgFreeRTOSConfig_suspend_value + if ($VAL_dbgFreeRTOSConfig_suspend != 0) + _freertos_show_thread_item xSuspendedTaskList + end + + set $VAL_dbgFreeRTOSConfig_delete = dbgFreeRTOSConfig_delete_value + if ($VAL_dbgFreeRTOSConfig_delete != 0) + _freertos_show_thread_item xTasksWaitingTermination + end + end +end + +# Command "freertos_switch_to_task" +# Switches debugging context to specified task, argument - task handle +define freertos_switch_to_task + set var dbgPendingTaskHandle = $arg0 + set $current_IPSR_val = $xpsr & 0xFF + if (($current_IPSR_val >= 1) && ($current_IPSR_val <= 15)) + echo Switching from system exception context isn't supported + else + set $VAL_dbgPendSVHookState = dbgPendSVHookState + if ($VAL_dbgPendSVHookState == 0) + set $last_PRIMASK_val = $PRIMASK + set $last_SCB_ICSR_val = *((volatile unsigned long *)0xE000ED04) + set $last_SYSPRI2_val = *((volatile unsigned long *)0xE000ED20) + set $last_SCB_CCR_val = *((volatile unsigned long *)0xE000ED14) + set $running_IPSR_val = $current_IPSR_val + set $PRIMASK = 0 + # *(portNVIC_SYSPRI2) &= ~(255 << 16) // temporary increase PendSV priority to highest + set {unsigned int}0xe000ed20 = ($last_SYSPRI2_val & (~(255 << 16))) + # set SCB->CCR NONBASETHRDENA bit (allows processor enter thread mode from at any execution priority level) + set {unsigned int}0xE000ED14 = (1) | $last_SCB_CCR_val + set var dbgPendSVHookState = 1 + end + # *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET + set {unsigned int}0xe000ed04 = 0x10000000 + continue + # here we stuck at "bkpt" instruction just before "bx lr" (in helper's xPortPendSVHandler) + # force returning to thread mode with process stack + set $lr = 0xFFFFFFFD + stepi + stepi + # here we get rewound to task + end +end + +# Command "freertos_restore_running_context" +# Restores context of running task +define freertos_restore_running_context + set $VAL_dbgPendSVHookState = dbgPendSVHookState + if ($VAL_dbgPendSVHookState == 0) + echo Current task is RUNNING, ignoring command... + else + set var dbgPendingTaskHandle = (void *)pxCurrentTCB + # *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET + set {unsigned int}0xe000ed04 = 0x10000000 + continue + # here we stuck at "bkpt" instruction just before "bx lr" (in helper's xPortPendSVHandler) + # check what execution mode was in context we started to switch from + if ($running_IPSR_val == 0) + # force returning to thread mode with process stack + set $lr = 0xFFFFFFFD + else + # force returning to handler mode + set $lr = 0xFFFFFFF1 + end + stepi + stepi + # here we get rewound to running task at place we started switching + # restore processor state + set $PRIMASK = $last_PRIMASK_val + set {unsigned int}0xe000ed20 = $last_SYSPRI2_val + set {unsigned int}0xE000ED14 = $last_SCB_CCR_val + if ($last_SCB_ICSR_val & (1 << 28)) + set {unsigned int}0xe000ed04 = 0x10000000 + end + set var dbgPendSVHookState = 0 + end +end + +# Command "show_broken_backtrace" +# Workaround of issue when context is being stuck in the middle of function epilogue (i.e., in vTaskDelay()) +# This solution is applied to following situation only: +### ... function body end +### xxxxxxxx+0: add.w r7, r7, #16 +### xxxxxxxx+4: mov sp, r7 ; <- debug current instruction pointer +### xxxxxxxx+6: pop {r7, pc} +### } +# (Otherwise it will crash !) +define show_broken_backtrace + # cancel effect of xxxxxxxx+4 instruction twice (because we will step it to update eclipse views) + set $r7 = $r7 - 16 - 16 + set $pc = $pc - 4 + stepi +end + + +####################### +# Internal functions +define _freertos_show_thread_item + set $list_thread_count = $arg0.uxNumberOfItems + set $prev_list_elem_ptr = -1 + set $list_elem_ptr = $arg0.xListEnd.pxPrevious + while (($list_thread_count > 0) && ($list_elem_ptr != 0) && ($list_elem_ptr != $prev_list_elem_ptr) && ($tasks_found < $thread_list_size)) + set $threadid = $list_elem_ptr->pvOwner + set $thread_name_str = (*((tskTCB *)$threadid)).pcTaskName + set $tasks_found = $tasks_found + 1 + set $list_thread_count = $list_thread_count - 1 + set $prev_list_elem_ptr = $list_elem_ptr + set $list_elem_ptr = $prev_list_elem_ptr->pxPrevious + if ($threadid == $current_thread) + printf "0x%x\t%s\t\t<---RUNNING\n", $threadid, $thread_name_str + else + printf "0x%x\t%s\n", $threadid, $thread_name_str + end + end +end + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c new file mode 100644 index 0000000..cc3f77c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c @@ -0,0 +1,1789 @@ +#include "McuLibconfig.h" + +#if McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_RP2040 && (configNUMBER_OF_CORES == 2) + #include "rp2040_port.c" +#else +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * FreeRTOS for 56800EX port by Richy Ye in Jan. 2013. + *----------------------------------------------------------*/ +/* Scheduler includes. */ +#include "FreeRTOS.h" +#if McuLib_CONFIG_SDK_USE_FREERTOS + +#include "portmacro.h" /* for configCPU_FAMILY */ +#include "task.h" +#include "portTicks.h" /* for CPU_CORE_CLK_HZ used in configSYSTICK_CLOCK_HZ */ +#if configSYSTICK_USE_LOW_POWER_TIMER + #if McuLib_CONFIG_NXP_SDK_2_0_USED + #if McuLib_CONFIG_CPU_IS_KINETIS + #include "fsl_lptmr.h" /* SDK low power timer interface */ + #elif McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC804 + #include "fsl_wkt.h" + #include "fsl_power.h" + #endif + #elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT + #include "LPTMR_PDD.h" /* PDD interface to low power timer */ + #include "SIM_PDD.h" /* PDD interface to system integration module */ + #endif +#endif + +#include "McuLib.h" /* include SDK and API used */ +#if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M + +#if( configENABLE_TRUSTZONE == 1 ) + /* Secure components includes. */ + #include "secure_context.h" + #include "secure_init.h" +#endif /* configENABLE_TRUSTZONE */ + +#if (configNUMBER_OF_CORES>1) + UBaseType_t uxCriticalNestings[ configNUMBER_OF_CORES ]; +#endif + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/** + * The FreeRTOS Cortex M33 port can be configured to run on the Secure Side only + * i.e. the processor boots as secure and never jumps to the non-secure side. + * The Trust Zone support in the port must be disabled in order to run FreeRTOS + * on the secure side. The following are the valid configuration seetings: + * + * 1. Run FreeRTOS on the Secure Side: + * configRUN_FREERTOS_SECURE_ONLY = 1 and configENABLE_TRUSTZONE = 0 + * + * 2. Run FreeRTOS on the Non-Secure Side with Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 1 + * + * 3. Run FreeRTOS on the Non-Secure Side only i.e. no Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 0 + */ +#if( ( configRUN_FREERTOS_SECURE_ONLY == 1 ) && ( configENABLE_TRUSTZONE == 1 ) ) + #error TrustZone needs to be disabled in order to run FreeRTOS on the Secure Side. +#endif + +#endif /* McuLib_CONFIG_CPU_IS_ARM_CORTEX_M */ +/* --------------------------------------------------- */ +/* Let the user override the pre-loading of the initial LR with the address of + prvTaskExitError() in case is messes up unwinding of the stack in the + debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif +/* --------------------------------------------------- */ +/* macros dealing with tick counter */ +#if configSYSTICK_USE_LOW_POWER_TIMER + #if !McuLib_CONFIG_PEX_SDK_USED + #if McuLib_CONFIG_CPU_IS_KINETIS + #define LPTMR0_BASE_PTR LPTMR0 /* low power timer address base */ + #define configLOW_POWER_TIMER_VECTOR_NUMBER LPTMR0_IRQn /* low power timer IRQ number */ + #define ENABLE_TICK_COUNTER() LPTMR_StartTimer(LPTMR0_BASE_PTR); LPTMR_EnableInterrupts(LPTMR0_BASE_PTR, kLPTMR_TimerInterruptEnable) + #define DISABLE_TICK_COUNTER() LPTMR_StopTimer(LPTMR0_BASE_PTR) + #define RESET_TICK_COUNTER_VAL() LPTMR_StopTimer(LPTMR0_BASE_PTR); LPTMR_DisableInterrupts(LPTMR0_BASE_PTR, kLPTMR_TimerInterruptEnable) + #define ACKNOWLEDGE_TICK_ISR() LPTMR_ClearStatusFlags(LPTMR0_BASE_PTR, kLPTMR_TimerCompareFlag); + #elif McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC804 + #define LPTMR_BASE_PTR WKT /* low power timer address base */ + #define configLOW_POWER_TIMER_VECTOR_NUMBER WKT_IRQn /* low power timer IRQ number */ + #define ENABLE_TICK_COUNTER() /* already started with setting the value in SET_TICK_DURATION() */ + #define DISABLE_TICK_COUNTER() WKT_StopTimer(LPTMR_BASE_PTR) + #define RESET_TICK_COUNTER_VAL() /* not necessary */ + #define ACKNOWLEDGE_TICK_ISR() WKT_ClearStatusFlags(LPTMR_BASE_PTR, kWKT_AlarmFlag); + #endif + #elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT + #define ENABLE_TICK_COUNTER() LPTMR_PDD_EnableDevice(LPTMR0_BASE_PTR, PDD_ENABLE); LPTMR_PDD_EnableInterrupt(LPTMR0_BASE_PTR) + #define DISABLE_TICK_COUNTER() LPTMR_PDD_EnableDevice(LPTMR0_BASE_PTR, PDD_DISABLE); LPTMR_PDD_DisableInterrupt(LPTMR0_BASE_PTR) + #define RESET_TICK_COUNTER_VAL() DISABLE_TICK_COUNTER() /* CNR is reset when the LPTMR is disabled or counter register overflows */ + #define ACKNOWLEDGE_TICK_ISR() LPTMR_PDD_ClearInterruptFlag(LPTMR0_BASE_PTR) + #if defined(LDD_ivIndex_INT_LPTimer) /* Earlier version of Processor Expert use this vector name */ + #define configLOW_POWER_TIMER_VECTOR_NUMBER LDD_ivIndex_INT_LPTimer + #elif defined(LDD_ivIndex_INT_LPTMR0) /* Newer versions (Processor Expert for Kinetis v3.0.1 uses this name */ + #define configLOW_POWER_TIMER_VECTOR_NUMBER LDD_ivIndex_INT_LPTMR0 + #else + #error "Unknown Low Power Timer Interrupt Number?" + #endif + #endif +#else + #define ENABLE_TICK_COUNTER() portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT + #define DISABLE_TICK_COUNTER() portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT + #define RESET_TICK_COUNTER_VAL() portNVIC_SYSTICK_CURRENT_VALUE_REG = 0 /*portNVIC_SYSTICK_LOAD_REG*/ + #define ACKNOWLEDGE_TICK_ISR() /* not needed */ +#endif + +typedef unsigned long TickCounter_t; /* enough for 24 bit Systick */ +#if configSYSTICK_USE_LOW_POWER_TIMER + #if McuLib_CONFIG_CPU_IS_KINETIS + #define TICK_NOF_BITS 16 + #define COUNTS_UP 1 /* LPTMR is counting up */ + #elif McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC804 + #define TICK_NOF_BITS 32 + #define COUNTS_UP 0 /* WKT is counting down to zero */ + #endif + #if !McuLib_CONFIG_PEX_SDK_USED + #if McuLib_CONFIG_CPU_IS_KINETIS + #define SET_TICK_DURATION(val) LPTMR_SetTimerPeriod(LPTMR0_BASE_PTR, val+1) /* new SDK V2.8 requires a value >0 */ + #define GET_TICK_DURATION() LPTMR0_BASE_PTR->CMR /*!< SDK has no access method for getting the counter modulo register */ + #define GET_TICK_CURRENT_VAL(addr) *(addr)=LPTMR_GetCurrentTimerCount(LPTMR0_BASE_PTR) + #elif McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC804 + #define SET_TICK_DURATION(val) WKT_StartTimer(LPTMR_BASE_PTR, val) + /*#define GET_TICK_DURATION() */ /* not used */ + #define GET_TICK_CURRENT_VAL(addr) *(addr)=WKT_GetCounterValue(LPTMR_BASE_PTR) + #endif + #else + #define SET_TICK_DURATION(val) LPTMR_PDD_WriteCompareReg(LPTMR0_BASE_PTR, val) + #define GET_TICK_DURATION() LPTMR_PDD_ReadCompareReg(LPTMR0_BASE_PTR) + #define GET_TICK_CURRENT_VAL(addr) *(addr)=LPTMR_PDD_ReadCounterReg(LPTMR0_BASE_PTR) + #endif +#else + #define TICK_NOF_BITS 24 + #define COUNTS_UP 0 /* SysTick is counting down to zero */ + #define SET_TICK_DURATION(val) portNVIC_SYSTICK_LOAD_REG = val + #define GET_TICK_DURATION() portNVIC_SYSTICK_LOAD_REG + #define GET_TICK_CURRENT_VAL(addr) *(addr)=portNVIC_SYSTICK_CURRENT_VALUE_REG +#endif + +#if configSYSTICK_USE_LOW_POWER_TIMER + #define TIMER_COUNTS_FOR_ONE_TICK (configSYSTICK_LOW_POWER_TIMER_CLOCK_HZ/configTICK_RATE_HZ) +#else + #define TIMER_COUNTS_FOR_ONE_TICK (configSYSTICK_CLOCK_HZ/configTICK_RATE_HZ) +#endif + +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configCPU_FAMILY==configCPU_FAMILY_ARM_M0P + unsigned int SEGGER_SYSVIEW_TickCnt; /* tick counter for Segger SystemViewer */ +#endif + +#if configUSE_TICKLESS_IDLE + #define UL_TIMER_COUNTS_FOR_ONE_TICK ((TickCounter_t)(TIMER_COUNTS_FOR_ONE_TICK)) +#if configCPU_FAMILY_IS_ARM(configCPU_FAMILY) + #define TICKLESS_DISABLE_INTERRUPTS() __asm volatile("cpsid i") /* disable interrupts. Note that the wfi (wait for interrupt) instruction later will still be able to wait for interrupts! */ + #define TICKLESS_ENABLE_INTERRUPTS() __asm volatile("cpsie i") /* re-enable interrupts. */ +#elif (configCPU_FAMILY==configCPU_FAMILY_S08) || (configCPU_FAMILY==configCPU_FAMILY_S12) + #define TICKLESS_DISABLE_INTERRUPTS() __asm("sei"); /* disable interrupts */ + #define TICKLESS_ENABLE_INTERRUPTS() __asm("cli"); /* re-enable interrupts */ +#else + #define TICKLESS_DISABLE_INTERRUPTS() portDISABLE_INTERRUPTS() /* this disables interrupts! Make sure they are re-enabled in vOnPreSleepProcessing()! */ + #define TICKLESS_ENABLE_INTERRUPTS() portENABLE_INTERRUPTS() /* re-enable interrupts */ +#endif + + #if 1 /* using Hardware Timer */ + #if configSYSTICK_USE_LOW_POWER_TIMER + /* using Low Power Timer */ + #if McuLib_CONFIG_PEX_SDK_USED + #define LPTMR_CSR_TCF_MASK 0x80u + #define TICK_INTERRUPT_HAS_FIRED() (LPTMR0_BASE_PTR->CSR&LPTMR_CSR_TCF_MASK)!=0 /* returns TRUE if tick interrupt had fired */ + #elif McuLib_CONFIG_CPU_IS_KINETIS + #define TICK_INTERRUPT_HAS_FIRED() ((LPTMR_GetStatusFlags(LPTMR0_BASE_PTR)&kLPTMR_TimerCompareFlag)!=0) /* returns TRUE if tick interrupt had fired */ + #elif McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC804 + #define TICK_INTERRUPT_HAS_FIRED() (WKT_GetStatusFlags(LPTMR_BASE_PTR)==WKT_CTRL_ALARMFLAG_MASK) + #endif + #define TICK_INTERRUPT_FLAG_RESET() /* not needed */ + #define TICK_INTERRUPT_FLAG_SET() /* not needed */ + #else + /* using directly SysTick Timer */ + #define TICK_INTERRUPT_HAS_FIRED() ((portNVIC_SYSTICK_CTRL_REG&portNVIC_SYSTICK_COUNT_FLAG_BIT)!=0) /* returns TRUE if tick interrupt had fired */ + #define TICK_INTERRUPT_FLAG_RESET() /* not needed */ + #define TICK_INTERRUPT_FLAG_SET() /* not needed */ + #endif + #else + /* using global variable to find out if interrupt has fired */ + volatile uint8_t portTickCntr; /* used to find out if we woke up by the tick interrupt */ + #define TICK_INTERRUPT_HAS_FIRED() (portTickCntr!=0) /* returns TRUE if tick interrupt had fired */ + #define TICK_INTERRUPT_FLAG_RESET() portTickCntr=0 + #define TICK_INTERRUPT_FLAG_SET() portTickCntr=1 + #endif +#endif /* configUSE_TICKLESS_IDLE == 1 */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * resolution of the tick timer. + */ +#if configUSE_TICKLESS_IDLE == 1 + static TickCounter_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the tick timer is stopped (low + * power functionality only). + */ +#if configUSE_TICKLESS_IDLE == 1 + static TickCounter_t ulStoppedTimerCompensation = 0; /* number of timer ticks to compensate */ + #define configSTOPPED_TIMER_COMPENSATION 45UL /* number of CPU cycles to compensate. ulStoppedTimerCompensation will contain the number of timer ticks. */ +#endif /* configUSE_TICKLESS_IDLE */ + +/* Flag indicating that the tick counter interval needs to be restored back to + * the normal setting. Used when woken up from a low power mode using the LPTMR. + */ +#if configUSE_TICKLESS_IDLE && configSYSTICK_USE_LOW_POWER_TIMER + static uint8_t restoreTickInterval = 0; /* used to flag in tick ISR that compare register needs to be reloaded */ +#endif + +#if (configCPU_FAMILY==configCPU_FAMILY_CF1) || (configCPU_FAMILY==configCPU_FAMILY_CF2) + #define portINITIAL_FORMAT_VECTOR ((portSTACK_TYPE)0x4000) + #define portINITIAL_STATUS_REGISTER ((portSTACK_TYPE)0x2000) /* Supervisor mode set. */ +#endif + +#if configCPU_FAMILY_IS_ARM(configCPU_FAMILY) + +/* For strict compliance with the Cortex-M spec the task start address should +have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Constants required to manipulate the core. + * SysTick register: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0662b/CIAGECDD.html + * Registers first... + */ +#define portNVIC_SYSTICK_CTRL_REG (*((volatile unsigned long *)0xe000e010)) /* SYST_CSR, SysTick Control and Status Register */ +#define portNVIC_SYSTICK_LOAD_REG (*((volatile unsigned long *)0xe000e014)) /* SYST_RVR, SysTick reload value register */ +#define portNVIC_SYSTICK_CURRENT_VALUE_REG (*((volatile unsigned long *)0xe000e018)) /* SYST_CVR, SysTick current value register */ +#define portNVIC_SYSTICK_CALIB_VALUE_REG (*((volatile unsigned long *)0xe000e01C)) /* SYST_CALIB, SysTick calibration value register */ +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_COUNT_FLAG_BIT (1UL<<16UL) /* returns 1 if timer counted to 0 since the last read of the register */ +#if configSYSTICK_USE_CORE_CLOCK + #define portNVIC_SYSTICK_CLK_BIT (1UL<<2UL) /* clock source. 1: core clock, 0: external reference clock */ +#else + #define portNVIC_SYSTICK_CLK_BIT (0UL<<2UL) /* clock source. 1: core clock, 0: external reference clock */ +#endif +#define portNVIC_SYSTICK_INT_BIT (1UL<<1UL) /* SysTick interrupt enable bit */ +#define portNVIC_SYSTICK_ENABLE_BIT (1UL<<0UL) /* SysTick enable bit */ + +/* Constants required to manipulate the NVIC: */ +#define portNVIC_INT_CTRL ((volatile unsigned long*)0xe000ed04) /* interrupt control and state register (ICSR) */ +#define portNVIC_PENDSVSET_BIT (1UL<<28UL) /* bit 28 in portNVIC_INT_CTRL (PENDSVSET), see http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/Cihfaaha.html */ +#define portNVIC_PENDSVCLEAR_BIT (1UL<<27UL) /* bit 27 in portNVIC_INT_CTRL (PENDSVCLR) */ +#define portNVIC_PEND_SYSTICK_SET_BIT (1UL<<26UL) /* bit 26 in portNVIC_INT_CTRL (PENDSTSET) */ +#define portNVIC_PEND_SYSTICK_CLEAR_BIT (1UL<<25UL) /* bit 25 in portNVIC_INT_CTRL (PENDSTCLR) */ + +#define portNVIC_SYSPRI2 ((volatile unsigned long*)0xe000ed1c) /* system handler priority register 2 (SHPR2), used for SVCall priority, http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0662b/CIAGECDD.html */ +#define portNVIC_SVCALL_PRI (((unsigned long)configKERNEL_INTERRUPT_PRIORITY)<<24) /* priority of SVCall interrupt (in portNVIC_SYSPRI2) */ + +#define portNVIC_SYSPRI3 ((volatile unsigned long*)0xe000ed20) /* system handler priority register 3 (SHPR3), used for SysTick and PendSV priority, http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0662b/CIAGECDD.html */ +#define portNVIC_SYSTICK_PRI (((unsigned long)configKERNEL_INTERRUPT_PRIORITY)<<24) /* priority of SysTick interrupt (in portNVIC_SYSPRI3) */ +#define portNVIC_PENDSV_PRI (((unsigned long)configKERNEL_INTERRUPT_PRIORITY)<<16) /* priority of PendableService interrupt (in portNVIC_SYSPRI3) */ + +#define portNVIC_SYSPRI7 ((volatile unsigned long*)0xe000e41c) /* system handler priority register 7, PRI_28 is LPTMR */ +#define portNVIC_LP_TIMER_PRI (((unsigned long)configKERNEL_INTERRUPT_PRIORITY)<<0) /* priority of low power timer interrupt */ + +#if configSYSTICK_USE_LOW_POWER_TIMER && McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT +#define IRQn_Type int +#define __NVIC_PRIO_BITS configPRIO_BITS +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ +/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +#if configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY) /* ARM M4(F)/M7/M33 core */ +typedef struct +{ + __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24]; + __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24]; + __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24]; + __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24]; + __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56]; + __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644]; + __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; +#else /* M0+ */ +typedef struct +{ + __IO uint32_t ISER[1]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31]; + __IO uint32_t ICER[1]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31]; + __IO uint32_t ISPR[1]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31]; + __IO uint32_t ICPR[1]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31]; + uint32_t RESERVED4[64]; + __IO uint32_t IP[8]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; +#endif + +/* Memory mapping of Cortex-M0+ Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + +/* Interrupt Priorities are WORD accessible only under ARMv6M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( (((uint32_t)(IRQn) ) & 0x03) * 8 ) +#define _IP_IDX(IRQn) ( ((uint32_t)(IRQn) >> 2) ) + +/** \brief Set Interrupt Priority + The function sets the priority of an interrupt. + \note The priority cannot be set for every core interrupt. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + */ +static void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) { + IRQn -= 16; /* PEx starts numbers with zero, while system interrupts would be negative */ +#if configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY) /* ARM M4(F)/M7/M33 core */ + NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); /* set Priority for device specific Interrupts */ +#else /* M0+ */ + NVIC->IP[_IP_IDX(IRQn)] = (NVIC->IP[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | + (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); /* set Priority for device specific Interrupts */ +#endif +} + +/** \brief Enable External Interrupt + The function enables a device-specific interrupt in the NVIC interrupt controller. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +static void NVIC_EnableIRQ(IRQn_Type IRQn) { + IRQn -= 16; /* PEx starts numbers with zero, while system interrupts would be negative */ +#if configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY) /* ARM M4(F)/M7/M33 core */ + NVIC->ISER[(uint32_t)((int32_t)IRQn) >> 5] = (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)); /* enable interrupt */ +#else /* M0+ */ + NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */ +#endif +} +#endif /* configSYSTICK_USE_LOW_POWER_TIMER */ + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR (0x01000000) +#define portINITIAL_EXEC_RETURN (0xfffffffd) +#define portINITIAL_CONTROL_IF_UNPRIVILEGED (0x03) +#define portINITIAL_CONTROL_IF_PRIVILEGED (0x02) + +#if configENABLE_FPU + /* Constants required to manipulate the VFP. */ + #define portFPCCR ((volatile unsigned long *)0xe000ef34) /* Floating point context control register. */ + #define portASPEN_AND_LSPEN_BITS (0x3UL<<30UL) +#endif +#endif +/* Used to keep track of the number of nested calls to taskENTER_CRITICAL(). + This will be set to 0 prior to the first task being started. */ +/* Each task maintains its own interrupt status in the critical nesting variable. */ +static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa; + +#if INCLUDE_vTaskEndScheduler +#include +static jmp_buf xJumpBuf; /* Used to restore the original context when the scheduler is ended. */ +#endif +/*-----------------------------------------------------------*/ +void prvTaskExitError(void) { + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT(uxCriticalNesting == ~0UL); + portDISABLE_INTERRUPTS(); + for(;;) { + /* wait here */ + } +} +/*-----------------------------------------------------------*/ +#if (configCOMPILER==configCOMPILER_ARM_KEIL) && (configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY)) /* ARM M4(F)/M7/M33 core */ +__asm uint32_t ulPortSetInterruptMask(void) { + PRESERVE8 + + mrs r0, basepri + mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r1 + bx r14 +} +#endif /* (configCOMPILER==configCOMPILER_ARM_KEIL) */ +/*-----------------------------------------------------------*/ +#if (configCOMPILER==configCOMPILER_ARM_KEIL) && (configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY) /* ARM M4(F)/M7/M33 core */) +__asm void vPortClearInterruptMask(uint32_t ulNewMask) { + PRESERVE8 + + msr basepri, r0 + bx r14 +} +#endif /* (configCOMPILER==configCOMPILER_ARM_KEIL) */ +/*-----------------------------------------------------------*/ +#if configENABLE_MPU +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged) { +#else +StackType_t *pxPortInitialiseStack(portSTACK_TYPE *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters) { +#endif + /* Simulate the stack frame as it would be created by a context switch interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts, and to ensure alignment. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; +#if configENABLE_MPU + *pxTopOfStack = ((StackType_t)pxCode)&portSTART_ADDRESS_MASK; /* PC */ +#else + *pxTopOfStack = ((StackType_t)pxCode); /* PC */ +#endif + pxTopOfStack--; + *pxTopOfStack = (StackType_t)portTASK_RETURN_ADDRESS; /* LR */ + + /* Save code space by skipping register initialization. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = (portSTACK_TYPE)pvParameters; /* R0 */ + +#if configENABLE_FPU /* has floating point unit */ + /* A save method is being used that requires each task to maintain its + own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXEC_RETURN; +#endif +#if configENABLE_MPU + pxTopOfStack -= 9; /* R11, R10, R9, R8, R7, R6, R5 and R4 plus privilege level */ + if (xRunPrivileged == pdTRUE) { + *pxTopOfStack = portINITIAL_CONTROL_IF_PRIVILEGED; + } else { + *pxTopOfStack = portINITIAL_CONTROL_IF_UNPRIVILEGED; + } +#else + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ +#endif + return pxTopOfStack; +} + +/*-----------------------------------------------------------*/ +#if (configCOMPILER==configCOMPILER_S08_FSL) || (configCOMPILER==configCOMPILER_S12_FSL) +#if (configCOMPILER==configCOMPILER_S08_FSL) + #pragma MESSAGE DISABLE C1404 /* return expected */ + #pragma MESSAGE DISABLE C20000 /* dead code detected */ + #pragma NO_RETURN + #pragma CODE_SEG __NEAR_SEG NON_BANKED +#elif (configCOMPILER==configCOMPILER_S12_FSL) + #pragma MESSAGE DISABLE C1404 /* return expected */ + #pragma NO_RETURN +#endif + +static portBASE_TYPE xBankedStartScheduler(void) { + /* Restore the context of the first task. */ + portRESTORE_CONTEXT(); /* Simulate the end of an interrupt to start the scheduler off. */ + /* Should not get here! */ + return pdFALSE; +} + +#if (configCOMPILER==configCOMPILER_S08_FSL) + #pragma CODE_SEG DEFAULT + #pragma MESSAGE DEFAULT C1404 /* return expected */ + #pragma MESSAGE DEFAULT C20000 /* dead code detected */ +#elif (configCOMPILER==configCOMPILER_S12_FSL) + #pragma MESSAGE DEFAULT C1404 /* return expected */ +#endif +#endif +/*-----------------------------------------------------------*/ +#if configUSE_TICKLESS_IDLE == 1 +void McuRTOS_vOnPreSleepProcessing(TickType_t expectedIdleTicks); /* prototype */ + +void McuRTOS_vOnPostSleepProcessing(TickType_t expectedIdleTicks); /* prototype */ + +#if (configCOMPILER==configCOMPILER_ARM_GCC) || (configCOMPILER==configCOMPILER_ARM_KEIL) +__attribute__((weak)) +#endif +void vPortSuppressTicksAndSleep(TickType_t xExpectedIdleTime) { + unsigned long ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickIncrements; + TickCounter_t tmp; /* because of how we get the current tick counter */ + bool tickISRfired; + uint32_t tickDuration; + +#if configSYSTICK_USE_LOW_POWER_TIMER + /* if we wait for the tick interrupt, do not enter low power again below */ + if (restoreTickInterval!=0) { + McuRTOS_vOnPreSleepProcessing(xExpectedIdleTime); /* go into low power mode. Re-enable interrupts as needed! */ +#if 0 /* default example code */ + /* default wait/sleep code */ + __asm volatile("dsb"); + __asm volatile("wfi"); + __asm volatile("isb"); +#endif + return; + } +#endif + + /* Make sure the tick timer reload value does not overflow the counter. */ + if(xExpectedIdleTime > xMaximumPossibleSuppressedTicks) { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the tick timer momentarily. The time the counter is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. + */ +#if configSYSTICK_USE_LOW_POWER_TIMER && McuLib_CONFIG_CPU_IS_KINETIS + /* disabling the LPTMR does reset the timer register! So I need to get the value first, then disable the timer: */ + GET_TICK_CURRENT_VAL(&tmp); + DISABLE_TICK_COUNTER(); +#else /* using normal timer or SysTick */ + DISABLE_TICK_COUNTER(); + GET_TICK_CURRENT_VAL(&tmp); +#endif + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. This code will execute part way through one + * of the tick periods. + */ + /* -1UL is used because this code will execute part way through one of the tick periods */ +#if COUNTS_UP + ulReloadValue = (UL_TIMER_COUNTS_FOR_ONE_TICK*xExpectedIdleTime); + #if configSYSTICK_USE_LOW_POWER_TIMER + if (ulReloadValue > 0) { /* make sure it does not underflow */ + ulReloadValue -= 1UL; /* LPTMR: interrupt will happen at match of compare register && increment, thus minus 1 */ + } + #endif + if (tmp!=0 && ulReloadValue>=tmp) { /* make sure it does not underflow */ + ulReloadValue -= tmp; /* take into account what we already executed in the current tick period */ + } +#else + ulReloadValue = tmp+(UL_TIMER_COUNTS_FOR_ONE_TICK*(xExpectedIdleTime-1UL)); +#endif + if (ulStoppedTimerCompensation!=0 && ulReloadValue>ulStoppedTimerCompensation) { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. + */ + TICKLESS_DISABLE_INTERRUPTS(); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. + */ + if (eTaskConfirmSleepModeStatus()==eAbortSleep) { + /* Must restore the duration before re-enabling the timers */ +#if COUNTS_UP + #if configSYSTICK_USE_LOW_POWER_TIMER + tickDuration = UL_TIMER_COUNTS_FOR_ONE_TICK-1UL; /* LPTMR: interrupt will happen at match of compare register && increment, thus minus 1 */ + #else + tickDuration = UL_TIMER_COUNTS_FOR_ONE_TICK; + #endif + if (tmp!=0 && tickDuration >= tmp) { /* make sure it does not underflow */ + tickDuration -= tmp; /* take into account what we already executed in the current tick period */ + } +#else + tickDuration = tmp; +#endif + SET_TICK_DURATION(tickDuration); + ENABLE_TICK_COUNTER(); /* Restart tick timer. */ + TICKLESS_ENABLE_INTERRUPTS(); + } else { + SET_TICK_DURATION(ulReloadValue); /* Set the new reload value. */ + RESET_TICK_COUNTER_VAL(); /* Reset the counter. */ + ENABLE_TICK_COUNTER(); /* Restart tick timer. */ + TICK_INTERRUPT_FLAG_RESET(); /* reset flag so we know later if it has fired */ + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. + */ + + /* CPU *HAS TO WAIT* in the sequence below for an interrupt. If vOnPreSleepProcessing() is not used, a default implementation is provided */ + McuRTOS_vOnPreSleepProcessing(xExpectedIdleTime); /* go into low power mode. Re-enable interrupts as needed! */ +#if 0 /* example/default code */ + /* default wait/sleep code */ + __asm volatile("dsb"); + __asm volatile("wfi"); + __asm volatile("isb"); +#endif + /* ---------------------------------------------------------------------------- + * Here the CPU *HAS TO BE* in a low power mode, waiting to wake up by an interrupt + * ----------------------------------------------------------------------------*/ + McuRTOS_vOnPostSleepProcessing(xExpectedIdleTime); /* process post-low power actions */ + /* Stop tick counter. Again, the time the tick counter is stopped for is + * accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. + */ + tickISRfired = (bool)TICK_INTERRUPT_HAS_FIRED(); /* need to check Interrupt flag here, as might be modified below */ +#if configSYSTICK_USE_LOW_POWER_TIMER && McuLib_CONFIG_CPU_IS_KINETIS + /* disabling the LPTMR does reset the timer register! So I need to get the value first, then disable the timer: */ + GET_TICK_CURRENT_VAL(&tmp); + DISABLE_TICK_COUNTER(); +#else + DISABLE_TICK_COUNTER(); + GET_TICK_CURRENT_VAL(&tmp); +#endif + TICKLESS_ENABLE_INTERRUPTS();/* Re-enable interrupts */ + if (tickISRfired) { + /* The tick interrupt has already executed, and the timer + * count reloaded with the modulo/match value. + * Reset the counter register with whatever remains of + * this tick period. + */ +#if COUNTS_UP + #if configSYSTICK_USE_LOW_POWER_TIMER + tickDuration = (UL_TIMER_COUNTS_FOR_ONE_TICK-1UL); /* LPTMR: interrupt will happen at match of compare register && increment, thus minus 1 */ + #else + tickDuration = UL_TIMER_COUNTS_FOR_ONE_TICK; + #endif + if (tickDuration >= tmp) { /* make sure it does not underflow */ + tickDuration -= tmp; + } + if (tickDuration > 1) { + /*! Need to rethink this one! */ + //tickDuration -= 1; /* decrement by one, to compensate for one timer tick, as we are already part way through it */ + } else { + /* Not enough time to setup for the next tick, so skip it and setup for the + * next. Make sure to count the tick we skipped. + */ + tickDuration += (UL_TIMER_COUNTS_FOR_ONE_TICK - 1UL); + vTaskStepTick(1); + } +#else /* counting down */ + #if configSYSTICK_USE_LOW_POWER_TIMER && McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC804 + /* WKT counting down and fired, so the tmp or WKT->count is zero */ + tickDuration = UL_TIMER_COUNTS_FOR_ONE_TICK; + #else /* e.g. SysTick */ + tickDuration = (UL_TIMER_COUNTS_FOR_ONE_TICK-1UL)-(ulReloadValue-tmp); + #endif +#endif + SET_TICK_DURATION(tickDuration); + /* The tick interrupt handler will already have pended the tick + * processing in the kernel. As the pending tick will be + * processed as soon as this function exits, the tick value + * maintained by the tick is stepped forward by one less than the + * time spent waiting. + */ + ulCompleteTickPeriods = xExpectedIdleTime-1UL; /* -1 because we already added a completed tick from the tick interrupt */ + } else { + /* Something other than the tick interrupt ended the sleep. + * Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part ticks). + */ +#if COUNTS_UP + ulCompletedSysTickIncrements = tmp; + /* How many complete tick periods passed while the processor was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickIncrements/UL_TIMER_COUNTS_FOR_ONE_TICK; + /* The reload value is set to whatever fraction of a single tick period remains. */ + tickDuration = (((ulCompleteTickPeriods+1)*UL_TIMER_COUNTS_FOR_ONE_TICK)-1)-ulCompletedSysTickIncrements; + if (tickDuration > 1) { + tickDuration -= 1; /* decrement by one, to compensate for one timer tick, as we are already part way through it */ + } else { + /* Not enough time to setup for the next tick, so skip it and setup for the + * next. Make sure to count the tick we skipped. + */ + tickDuration += (UL_TIMER_COUNTS_FOR_ONE_TICK - 1UL); + if (tickDuration > 1) { /* check for underflow */ + tickDuration -= 1; + } + vTaskStepTick(1); + } +#else + ulCompletedSysTickIncrements = (xExpectedIdleTime*UL_TIMER_COUNTS_FOR_ONE_TICK)-tmp; + /* How many complete tick periods passed while the processor was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickIncrements/UL_TIMER_COUNTS_FOR_ONE_TICK; + /* The reload value is set to whatever fraction of a single tick period remains. */ + tickDuration = ((ulCompleteTickPeriods+1)*UL_TIMER_COUNTS_FOR_ONE_TICK)-ulCompletedSysTickIncrements; +#endif + SET_TICK_DURATION(tickDuration); + } + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + value. The critical section is used to ensure the tick interrupt + can only execute once in the case that the reload register is near + zero. + */ + RESET_TICK_COUNTER_VAL(); + portENTER_CRITICAL(); + { + ENABLE_TICK_COUNTER(); + if (ulCompleteTickPeriods>0) { + vTaskStepTick(ulCompleteTickPeriods); + } +#if configSYSTICK_USE_LOW_POWER_TIMER + /* The compare register of the LPTMR should not be modified when the + * timer is running, so wait for the next tick interrupt to change it. + */ + if (tickDuration != (UL_TIMER_COUNTS_FOR_ONE_TICK-1UL)) { /* minus one because of LPTMR way to trigger interrupts */ + if (tickISRfired) { + /* The pending tick interrupt will be immediately processed after + * exiting this function so we need to delay the change of the tick + * duration until the one after that. + */ + restoreTickInterval = 2; + } else { + /* Notify the tick interrupt that the tick duration needs to be + * changed back to the normal setting. + */ + restoreTickInterval = 1; + } + } else { + /* If the duration is the standard full tick, then there's no reason + * to stop and restart LPTMR in the tick interrupt. + */ + restoreTickInterval = 0; + } +#else + /* The systick has a load register that will automatically be used + * when the counter counts down to zero. + */ + SET_TICK_DURATION(UL_TIMER_COUNTS_FOR_ONE_TICK-1UL); +#endif + } + portEXIT_CRITICAL(); + } +} +#endif /* #if configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ +static void vPortInitTickTimer(void) { +#if configUSE_TICKLESS_IDLE == 1 +{ +#if TICK_NOF_BITS==32 + xMaximumPossibleSuppressedTicks = 0xffffffffUL/TIMER_COUNTS_FOR_ONE_TICK; /* 32bit timer register */ +#elif TICK_NOF_BITS==24 + xMaximumPossibleSuppressedTicks = 0xffffffUL/TIMER_COUNTS_FOR_ONE_TICK; /* 24bit timer register */ +#elif TICK_NOF_BITS==16 + xMaximumPossibleSuppressedTicks = 0xffffUL/TIMER_COUNTS_FOR_ONE_TICK; /* 16bit timer register */ +#elif TICK_NOF_BITS==8 + xMaximumPossibleSuppressedTicks = 0xffUL/TIMER_COUNTS_FOR_ONE_TICK; /* 8bit timer register */ +#else + error "unknown configuration!" +#endif +#if configSYSTICK_USE_LOW_POWER_TIMER + ulStoppedTimerCompensation = configSTOPPED_TIMER_COMPENSATION/(configCPU_CLOCK_HZ/configSYSTICK_LOW_POWER_TIMER_CLOCK_HZ); +#else + ulStoppedTimerCompensation = configSTOPPED_TIMER_COMPENSATION/(configCPU_CLOCK_HZ/configSYSTICK_CLOCK_HZ); +#endif +} +#endif /* configUSE_TICKLESS_IDLE */ +#if configSYSTICK_USE_LOW_POWER_TIMER + /* SIM_SCGx: enable clock to LPTMR */ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT + SIM_PDD_SetClockGate(SIM_BASE_PTR, SIM_PDD_CLOCK_GATE_LPTMR0, PDD_ENABLE); + + /* LPTRM0_CSR: clear TCF (Timer compare Flag) with writing a one to it */ + LPTMR_PDD_ClearInterruptFlag(LPTMR0_BASE_PTR); + + /* LPTMR_PSR: configure prescaler, bypass and clock source */ + /* PBYP PCS + * ERCLK32 1 10 + * LPO_1kHz 1 01 + * ERCLK 0 00 + * IRCLK 1 00 + */ + LPTMR_PDD_SelectPrescalerSource(LPTMR0_BASE_PTR, LPTMR_PDD_SOURCE_LPO1KHZ); + LPTMR_PDD_EnablePrescalerBypass(LPTMR0_BASE_PTR, LPTMR_PDD_BYPASS_ENABLED); +#elif McuLib_CONFIG_NXP_SDK_2_0_USED + #if McuLib_CONFIG_CPU_IS_KINETIS + { + lptmr_config_t config; + + LPTMR_GetDefaultConfig(&config); + LPTMR_Init(LPTMR0_BASE_PTR, &config); + } + #elif McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC804 + { + wkt_config_t wktConfig; + + POWER_EnableLPO(true); + wktConfig.clockSource = kWKT_LowPowerClockSource; + WKT_Init(WKT, &wktConfig); /* Init wkt module */ + NVIC_ClearPendingIRQ(WKT_IRQn); /* Clear Pending Interrupt */ + EnableIRQ(WKT_IRQn); /* Enable at the NVIC */ + } + #endif + +#endif + /* set timer interrupt priority in IP[] and enable it in ISER[] */ + NVIC_SetPriority(configLOW_POWER_TIMER_VECTOR_NUMBER, configLIBRARY_LOWEST_INTERRUPT_PRIORITY); + NVIC_EnableIRQ(configLOW_POWER_TIMER_VECTOR_NUMBER); /* enable IRQ in NVIC_ISER[] */ +#else /* use normal SysTick Counter */ + *(portNVIC_SYSPRI3) |= portNVIC_SYSTICK_PRI; /* set priority of SysTick interrupt */ +#endif + /* Configure timer to interrupt at the requested rate. */ + DISABLE_TICK_COUNTER(); /* disable the timer, just in case it is already running */ + SET_TICK_DURATION(TIMER_COUNTS_FOR_ONE_TICK-1UL); /* set tick period */ + RESET_TICK_COUNTER_VAL(); /* reset counter so it starts properly */ + ENABLE_TICK_COUNTER(); /* let it run */ +} +/*-----------------------------------------------------------*/ +static void vPortStartTickTimer(void) { + ENABLE_TICK_COUNTER(); +} +/*-----------------------------------------------------------*/ +void vPortStopTickTimer(void) { + DISABLE_TICK_COUNTER(); +} +/*-----------------------------------------------------------*/ +#if configENABLE_FPU /* has floating point unit */ +void vPortEnableVFP(void) { +#if 1 /* configLTO_HELPER: using implementation in C which is portable */ + #define CPACR_REG_MEM ((volatile int*)0xE000ED88) /* location of the CPACR register */ + + *CPACR_REG_MEM |= (0xf<<20); /* Enable CP10 and CP11 coprocessors */ +#else /* below is the original assembly code which fails with -flto because of the constant load */ + __asm volatile + ( + " ldr.w r0, =0xE000ED88 \n" /* The FPU enable bits are in the CPACR. */ + " ldr r1, [r0] \n" + " orr r1, r1, #( 0xf << 20 ) \n" /* Enable CP10 and CP11 coprocessors, then save back. */ + " str r1, [r0] \n" + " bx r14 " + ); +#endif +} +#endif /* M4/M7 */ +/*-----------------------------------------------------------*/ +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if (configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY) /* ARM M4(F)/M7/M33 core */) && (configASSERT_DEFINED == 1) + /* Constants required to check the validity of an interrupt priority. */ + #define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) + #define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) + #define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) + #define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) + #define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) + #define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) + #define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) + #define portPRIGROUP_SHIFT ( 8UL ) + + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +BaseType_t xPortStartScheduler(void) { + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + +#if configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY) /* ARM M4(F)/M7/M33 core */ + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ +#endif /* configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) */ /* ARM M4(F)/M7 core */ + +#if configCPU_FAMILY==configCPU_FAMILY_ARM_M7F + /* Constants used to detect a Cortex-M7 r0p1 core, which should use the ARM_CM7 r0p1 port. */ + #define portCPUID (*((volatile uint32_t*)0xE000ed00)) + #define portCORTEX_M7_r0p0_ID (0x410FC270UL) + #define portCORTEX_M7_r0p1_ID (0x410FC271UL) /* this one will require a special port! Writing to the BASEPRIO is not taking effect immediately, even with memory barrier instructions. Workaround: globally disable interrupts before writing to BASEPRIO, then write, then use memory barrier. */ + #define portCORTEX_M7_r0p2_ID (0x410FC272UL) /* is present on the TWR-KV57F220M */ + + configASSERT(portCPUID!=portCORTEX_M7_r0p1_ID); /* this one will require a special port! */ +#endif + + /* Make PendSV, SVCall and SysTick the lowest priority interrupts. SysTick priority will be set in vPortInitTickTimer(). */ +#if 0 /* do NOT set the SVCall priority */ + /* why: execution of an SVC instruction at a priority equal or higher than SVCall can cause a hard fault (at least on Cortex-M4), + see https://community.freescale.com/thread/302511 */ + *(portNVIC_SYSPRI2) |= portNVIC_SVCALL_PRI; /* set priority of SVCall interrupt */ +#endif + *(portNVIC_SYSPRI3) |= portNVIC_PENDSV_PRI; /* set priority of PendSV interrupt */ + uxCriticalNesting = 0; /* Initialize the critical nesting count ready for the first task. */ + vPortInitTickTimer(); /* initialize tick timer */ + vPortStartTickTimer(); /* start tick timer */ +#if configENABLE_FPU /* has floating point unit */ + vPortEnableVFP(); /* Ensure the VFP is enabled - it should be anyway */ + *(portFPCCR) |= portASPEN_AND_LSPEN_BITS; /* Lazy register save always */ +#endif +#if INCLUDE_vTaskEndScheduler + if(setjmp(xJumpBuf) != 0 ) { + /* here we will get in case of a call to vTaskEndScheduler() */ + __asm volatile( + " movs r0, #0 \n" /* Reset CONTROL register and switch back to the MSP stack. */ + " msr CONTROL, r0 \n" + " dsb \n" + " isb \n" + ); + return pdFALSE; + } +#endif + vPortStartFirstTask(); /* Start the first task. */ + /* Should not get here! */ + return pdFALSE; +} +/*-----------------------------------------------------------*/ +void vPortEndScheduler(void) { + vPortStopTickTimer(); + vPortInitializeHeap(); + uxCriticalNesting = 0xaaaaaaaa; + /* Jump back to the processor state prior to starting the + scheduler. This means we are not going to be using a + task stack frame so the task can be deleted. */ +#if INCLUDE_vTaskEndScheduler + longjmp(xJumpBuf, 1); +#else + for(;;){} /* wait here */ +#endif +} +/*-----------------------------------------------------------*/ +void vPortEnterCritical(void) { +/* + * Disable interrupts before incrementing the count of critical section nesting. + * The nesting count is maintained so we know when interrupts should be + * re-enabled. Once interrupts are disabled the nesting count can be accessed + * directly. Each task maintains its own nesting count. + */ + portDISABLE_INTERRUPTS(); + portPOST_ENABLE_DISABLE_INTERRUPTS(); + uxCriticalNesting++; +#if configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY) /* ARM M4(F)/M7/M33 core */ + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + /* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ + #define portVECTACTIVE_MASK (0xFFUL) + + configASSERT(((*portNVIC_INT_CTRL) & portVECTACTIVE_MASK)==0); + } +#endif + __asm volatile("dsb"); + __asm volatile("isb"); +} +/*-----------------------------------------------------------*/ +void vPortExitCritical(void) { + /* Interrupts are disabled so we can access the nesting count directly. If the + * nesting is found to be 0 (no nesting) then we are leaving the critical + * section and interrupts can be re-enabled. + */ + uxCriticalNesting--; + if (uxCriticalNesting == 0) { + portENABLE_INTERRUPTS(); + portPOST_ENABLE_DISABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ +void vPortYieldFromISR(void) { + /* Set a PendSV to request a context switch. */ + *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET_BIT; + /* Barriers are normally not required but do ensure the code is completely + within the specified behavior for the architecture. */ + __asm volatile("dsb"); + __asm volatile("isb"); +} +/*-----------------------------------------------------------*/ +/* return the tick raw counter value. It is assumed that the counter register has been reset at the last tick time */ + uint32_t uxGetTickCounterValue(void) { + long val; + + GET_TICK_CURRENT_VAL(&val); + return val; +} +/*-----------------------------------------------------------*/ +#if (configCOMPILER==configCOMPILER_ARM_KEIL) +#if !McuLib_CONFIG_PEX_SDK_USED /* the SDK expects different interrupt handler names */ +#if configSYSTICK_USE_LOW_POWER_TIMER +void LPTMR0_IRQHandler(void) { /* low power timer */ +#else +void SysTick_Handler(void) { /* normal SysTick */ +#endif +#else +void vPortTickHandler(void) { +#endif + /* this is how we get here: + RTOSTICKLDD1_Interrupt: + push {r4, lr} + ... RTOSTICKLDD1_OnCounterRestart + bl RTOSTICKLDD1_OnCounterRestart -> push {r4,lr} + pop {r4, lr} mov r4,r0 + bl vPortTickHandler + pop {r4,pc} + */ +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configCPU_FAMILY==configCPU_FAMILY_ARM_M0P + SEGGER_SYSVIEW_TickCnt++; /* tick counter for Segger SystemViewer */ +#endif +#if configUSE_TICKLESS_IDLE == 1 + TICK_INTERRUPT_FLAG_SET(); +#endif + portDISABLE_INTERRUPTS(); /* disable interrupts */ +#if (configUSE_TICKLESS_IDLE == 1) && configSYSTICK_USE_LOW_POWER_TIMER + if (restoreTickInterval > 0) { /* we got interrupted during tickless mode and non-standard compare value: reload normal compare value */ + if (restoreTickInterval == 1) { + DISABLE_TICK_COUNTER(); + SET_TICK_DURATION(UL_TIMER_COUNTS_FOR_ONE_TICK-1UL); + ENABLE_TICK_COUNTER(); + } + restoreTickInterval -= 1; + } +#endif + if (xTaskIncrementTick()!=pdFALSE) { /* increment tick count */ + taskYIELD(); + } + portENABLE_INTERRUPTS(); /* enable interrupts again */ +} +#endif +/*-----------------------------------------------------------*/ +#if (configCOMPILER==configCOMPILER_ARM_GCC) +#if McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_RPI_PICO +void isr_systick(void) { +#elif !McuLib_CONFIG_PEX_SDK_USED /* the SDK expects different interrupt handler names */ +#if configSYSTICK_USE_LOW_POWER_TIMER + #if McuLib_CONFIG_CPU_IS_KINETIS + void LPTMR0_IRQHandler(void) { /* low power timer */ + #elif McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC804 + void WKT_IRQHandler(void) { /* LPC804 WKT timer */ +#endif +#else +void SysTick_Handler(void) { /* normal SysTick */ +#endif +#else +void vPortTickHandler(void) { +#endif + ACKNOWLEDGE_TICK_ISR(); + +#if McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC804 + /* WKT Timer is counting down: set new value and start it again */ + SET_TICK_DURATION(TIMER_COUNTS_FOR_ONE_TICK-1UL); +#endif + +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configCPU_FAMILY==configCPU_FAMILY_ARM_M0P + SEGGER_SYSVIEW_TickCnt++; /* tick counter for Segger SystemViewer */ +#endif +#if configUSE_TICKLESS_IDLE == 1 + TICK_INTERRUPT_FLAG_SET(); +#endif +#if ( configNUMBER_OF_CORES > 1 ) + uint32_t ulPreviousMask; + + ulPreviousMask = taskENTER_CRITICAL_FROM_ISR(); +#else + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + executes all interrupts must be unmasked. There is therefore no need to + save and then restore the interrupt mask value as its value is already + known. */ + portDISABLE_INTERRUPTS(); /* disable interrupts */ +#endif + traceISR_ENTER(); +#if (configUSE_TICKLESS_IDLE == 1) && configSYSTICK_USE_LOW_POWER_TIMER + if (restoreTickInterval > 0) { /* we got interrupted during tickless mode and non-standard compare value: reload normal compare value */ + if (restoreTickInterval == 1) { + DISABLE_TICK_COUNTER(); + SET_TICK_DURATION(UL_TIMER_COUNTS_FOR_ONE_TICK-1UL); + ENABLE_TICK_COUNTER(); + } + restoreTickInterval -= 1; + } +#endif + if (xTaskIncrementTick()!=pdFALSE) { /* increment tick count */ + traceISR_EXIT_TO_SCHEDULER(); + taskYIELD(); + } else { + traceISR_EXIT(); + } +#if ( configNUMBER_OF_CORES > 1 ) + taskEXIT_CRITICAL_FROM_ISR(ulPreviousMask); +#else + portENABLE_INTERRUPTS(); /* re-enable interrupts */ +#endif +} +#endif +/*-----------------------------------------------------------*/ +#if (configCOMPILER==configCOMPILER_DSC_FSL) +void vPortStartFirstTask(void) { + /* Restore the context of the first task to run. */ + portRESTORE_CONTEXT(); + /* Simulate the end of the yield function. */ + __asm(rts); +} +#endif +/*-----------------------------------------------------------*/ +#if (configCOMPILER==configCOMPILER_ARM_KEIL) +__asm void vPortStartFirstTask(void) { +#if configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY) /* ARM M4(F)/M7/M33 core */ + /* Use the NVIC offset register to locate the stack. */ +#if configRESET_MSP && !INCLUDE_vTaskEndScheduler + ldr r0, =0xE000ED08 + ldr r0, [r0] + ldr r0, [r0] + /* Set the msp back to the start of the stack. */ + msr msp, r0 +#endif + /* Globally enable interrupts. */ + cpsie i + /* Call SVC to start the first task. */ + svc 0 + nop + nop + nop +#elif configCPU_FAMILY_IS_ARM_M0(configCPU_FAMILY) /* Cortex M0+ */ + /* With the latest FreeRTOS, the port for M0+ does not use the SVC instruction + * and does not need vPortSVCHandler() any more. + */ + extern pxCurrentTCB; + + PRESERVE8 + + /* The MSP stack is not reset as, unlike on M3/4 parts, there is no vector + table offset register that can be used to locate the initial stack value. + Not all M0 parts have the application vector table at address 0. */ + + ldr r3, =pxCurrentTCB /* Obtain location of pxCurrentTCB. */ + ldr r1, [r3] + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + movs r0, #2 /* Switch to the psp stack. */ + msr CONTROL, r0 + isb + pop {r0-r5} /* Pop the registers that are saved automatically. */ + mov lr, r5 /* lr is now in r5. */ + pop {r3} /* The return address is now in r3. */ + pop {r2} /* Pop and discard the XPSR. */ + cpsie i /* The first task has its context and interrupts can be enabled. */ + bx r3 /* Finally, jump to the user defined task code. */ + + ALIGN +#endif +} +#endif +/*-----------------------------------------------------------*/ +#if (configCOMPILER==configCOMPILER_ARM_GCC) +/* Need the 'noinline', as latest gcc with -O3 tries to inline it, and gives error message: "Error: symbol `pxCurrentTCBConst2' is already defined" */ +__attribute__((noinline)) +void vPortStartFirstTask(void) { +#if 0 && (configUSE_TOP_USED_PRIORITY || configLTO_HELPER) /* not in V11.0.0 any more */ + /* only needed for openOCD or Segger FreeRTOS thread awareness. It needs the symbol uxTopUsedPriority present after linking */ + { + extern const int uxTopUsedPriority; + __attribute__((__unused__)) volatile uint8_t dummy_value_for_openocd; + dummy_value_for_openocd = uxTopUsedPriority; + } +#endif +#if( configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H == 1 && configUSE_TRACE_FACILITY==1) + /* reference FreeRTOSDebugConfig, otherwise it might get removed by the linker or optimizations */ + { + extern volatile const uint8_t FreeRTOSDebugConfig[]; /* need to make it volatile, otherwise -O1 might remove it, with issue for LinkServer Thread Awareness */ + if (FreeRTOSDebugConfig[0]==0) { /* just use it, so the linker cannot remove FreeRTOSDebugConfig[] */ + for(;;); /* FreeRTOSDebugConfig[0] should always be non-zero, so this should never happen! */ + } + } +#endif +#if configHEAP_SCHEME_IDENTIFICATION + extern const uint8_t freeRTOSMemoryScheme; /* constant for NXP Kernel Awareness to indicate heap scheme */ + if (freeRTOSMemoryScheme>100) { /* reference/use variable so it does not get optimized by the linker */ + for(;;); + } +#endif +#if configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY) /* ARM M4(F)/M7/M33 core */ + __asm volatile ( +#if configRESET_MSP && !INCLUDE_vTaskEndScheduler +#if configLTO_HELPER /* with -flto, we cannot load the constant directly, otherwise we get "Error: offset out of range" with "lto-wrapper failed" */ + " mov r0, #0xE0000000 \n" /* build the constant 0xE000ED08. First load the upper 16 bits */ + " mov r1, #0xED00 \n" /* next load part of the lower 16 bit */ + " orr r0, r1 \n" /* and or it into R0. Now we have 0xE000ED00 in R0 */ + " mov r1, #0x08 \n" /* next load the lowest 8 bit */ + " orr r0, r1 \n" /* and or it into R0. Now we have 0xE000ED08 in R0 */ +#else + " ldr r0, =0xE000ED08 \n" /* Use the NVIC offset register to locate the stack. */ +#endif + " ldr r0, [r0] \n" /* load address of vector table */ + " ldr r0, [r0] \n" /* load first entry of vector table which is the reset stack pointer */ + " msr msp, r0 \n" /* Set the msp back to the start of the stack. */ +#endif + " cpsie i \n" /* Globally enable interrupts. */ + " svc 0 \n" /* System call to start first task. */ + " nop \n" + ); +#elif configCPU_FAMILY_IS_ARM_M0(configCPU_FAMILY) /* Cortex M0+ */ + /* With the latest FreeRTOS, the port for M0+ does not use the SVC instruction + * and does not need vPortSVCHandler() any more. + */ + /* The MSP stack is not reset as, unlike on M3/4 parts, there is no vector + table offset register that can be used to locate the initial stack value. + Not all M0 parts have the application vector table at address 0. */ + __asm volatile( + " ldr r2, pxCurrentTCBConst2 \n" /* Obtain location of pxCurrentTCB. */ + " ldr r3, [r2] \n" + " ldr r0, [r3] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " add r0, #32 \n" /* Discard everything up to r0. */ + " msr psp, r0 \n" /* This is now the new top of stack to use in the task. */ + " movs r0, #2 \n" /* Switch to the psp stack. */ + " msr CONTROL, r0 \n" + " isb \n" + " pop {r0-r5} \n" /* Pop the registers that are saved automatically. */ + " mov lr, r5 \n" /* lr is now in r5. */ + " pop {r3} \n" /* Return address is now in r3. */ + " pop {r2} \n" /* Pop and discard XPSR. */ + " cpsie i \n" /* The first task has its context and interrupts can be enabled. */ + " bx r3 \n" /* Finally, jump to the user defined task code. */ + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB" + ); +#endif +} +#endif +/*-----------------------------------------------------------*/ +#if (configCOMPILER==configCOMPILER_ARM_KEIL) +#if configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY) /* ARM M4(F)/M7/M33 core */ +#if !McuLib_CONFIG_PEX_SDK_USED /* the SDK expects different interrupt handler names */ +__asm void SVC_Handler(void) { +#else +__asm void vPortSVCHandler(void) { +#endif + PRESERVE8 + EXTERN pxCurrentTCB + + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r1, [r3] + ldr r0, [r1] + /* Pop the core registers. */ +#if configENABLE_FPU + ldmia r0!, {r4-r11, r14} /* r14, check http://sourceforge.net/p/freertos/discussion/382005/thread/a9406af1/?limit=25#3bc7 */ +#else + ldmia r0!, {r4-r11} +#endif + msr psp, r0 + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 +#if configENABLE_FPU +#else + orr r14, r14, #13 +#endif + bx r14 +} +/*-----------------------------------------------------------*/ +#elif configCPU_FAMILY_IS_ARM_M0(configCPU_FAMILY) /* Cortex M0+ and Keil */ +#if !McuLib_CONFIG_PEX_SDK_USED /* the SDK expects different interrupt handler names */ +__asm void SVC_Handler(void) { +#else +__asm void vPortSVCHandler(void) { +#endif + /* This function is no longer used, but retained for backward + compatibility. */ +} +#endif +#endif +/*-----------------------------------------------------------*/ +#if (configCOMPILER==configCOMPILER_ARM_GCC) +#if McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_RPI_PICO +__attribute__((naked)) void isr_svcall(void) { +#elif !McuLib_CONFIG_PEX_SDK_USED /* the SDK expects different interrupt handler names */ +__attribute__ ((naked)) void SVC_Handler(void) { +#else +__attribute__ ((naked)) void vPortSVCHandler(void) { +#endif +#if configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY) /* ARM M4(F)/M7/M33 core */ +__asm volatile ( + " ldr r3, pxCurrentTCBConst2 \n" /* Restore the context. */ + " ldr r1, [r3] \n" /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ + " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + /* pop the core registers */ +#if configENABLE_FPU + " ldmia r0!, {r4-r11, r14} \n" +#else + " ldmia r0!, {r4-r11} \n" +#endif + " msr psp, r0 \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" +#if configENABLE_FPU +#else + " orr r14, r14, #13 \n" +#endif + " bx r14 \n" + " \n" + " .align 2 \n" +#if (configNUMBER_OF_CORES == 1) + "pxCurrentTCBConst2: .word pxCurrentTCB \n" +#else + "pxCurrentTCBConst2: .word pxCurrentTCBs \n" +#endif + ); +#elif configCPU_FAMILY_IS_ARM_M0(configCPU_FAMILY) /* Cortex M0+ */ + /* This function is no longer used, but retained for backward + compatibility. */ +#endif +} +#endif /* (configCOMPILER==configCOMPILER_ARM_GCC) */ +/*-----------------------------------------------------------*/ +#if (configCOMPILER==configCOMPILER_ARM_KEIL) +#if configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY) /* ARM M4(F)/M7/M33 core */ +#if !McuLib_CONFIG_PEX_SDK_USED /* the SDK expects different interrupt handler names */ +__asm void PendSV_Handler(void) { +#else +__asm void vPortPendSVHandler(void) { +#endif + PRESERVE8 + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + + mrs r0, psp + ldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ + ldr r2, [r3] +#if configENABLE_FPU + tst r14, #0x10 /* Is the task using the FPU context? If so, push high vfp registers. */ + it eq + vstmdbeq r0!, {s16-s31} + + stmdb r0!, {r4-r11, r14} /* save remaining core registers */ +#else + stmdb r0!, {r4-r11} /* Save the core registers. */ +#endif + str r0, [r2] /* Save the new top of stack into the first member of the TCB. */ + stmdb sp!, {r3, r14} + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r3, r14} + ldr r1, [r3] /* The first item in pxCurrentTCB is the task top of stack. */ + ldr r0, [r1] +#if configENABLE_FPU + ldmia r0!, {r4-r11, r14} /* Pop the core registers */ + tst r14, #0x10 /* Is the task using the FPU context? If so, pop the high vfp registers too. */ + it eq + vldmiaeq r0!, {s16-s31} +#else + ldmia r0!, {r4-r11} /* Pop the core registers. */ +#endif + msr psp, r0 + bx r14 + nop +} +#elif configCPU_FAMILY_IS_ARM_M0(configCPU_FAMILY) /* Keil: Cortex M0+ */ +#if !McuLib_CONFIG_PEX_SDK_USED /* the SDK expects different interrupt handler names */ +__asm void PendSV_Handler(void) { +#else +__asm void vPortPendSVHandler(void) { +#endif + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + + mrs r0, psp + + ldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ + ldr r2, [r3] + + subs r0, #32 /* Make space for the remaining low registers. */ + str r0, [r2] /* Save the new top of stack. */ + stmia r0!, {r4-r7} /* Store the low registers that are not saved automatically. */ + mov r4, r8 /* Store the high registers. */ + mov r5, r9 + mov r6, r10 + mov r7, r11 + stmia r0!, {r4-r7} + + push {r3, r14} + cpsid i + bl vTaskSwitchContext + cpsie i + pop {r2, r3} /* lr goes in r3. r2 now holds tcb pointer. */ + + ldr r1, [r2] + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ + adds r0, #16 /* Move to the high registers. */ + ldmia r0!, {r4-r7} /* Pop the high registers. */ + mov r8, r4 + mov r9, r5 + mov r10, r6 + mov r11, r7 + + msr psp, r0 /* Remember the new top of stack for the task. */ + + subs r0, #32 /* Go back for the low registers that are not automatically restored. */ + ldmia r0!, {r4-r7} /* Pop low registers. */ + + bx r3 + nop +} +#endif +#endif /* (configCOMPILER==configCOMPILER_ARM_KEIL) */ +/*-----------------------------------------------------------*/ +#if (configCOMPILER==configCOMPILER_ARM_GCC) +#if configGDB_HELPER +/* prototypes to avoid compiler warnings */ +__attribute__ ((naked, used)) void vPortPendSVHandler_native(void); +__attribute__ ((naked, used)) void PendSV_Handler_jumper(void); + +__attribute__ ((naked, used)) void vPortPendSVHandler_native(void) { +#elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_RPI_PICO +__attribute__((naked, used)) void isr_pendsv(void) { +#elif !McuLib_CONFIG_PEX_SDK_USED /* the SDK expects different interrupt handler names */ +__attribute__ ((naked, used)) void PendSV_Handler(void) { +#else +__attribute__ ((naked, used)) void vPortPendSVHandler(void) { +#endif +#if configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY) /* ARM M4(F)/M7/M33 core */ + __asm volatile ( + " mrs r0, psp \n" + " ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */ + " ldr r2, [r3] \n" +#if configENABLE_FPU + " tst r14, #0x10 \n" /* Is the task using the FPU context? If so, push high vfp registers. */ + " it eq \n" + " vstmdbeq r0!, {s16-s31} \n" + + " stmdb r0!, {r4-r11, r14} \n" /* save remaining core registers */ +#else + " stmdb r0!, {r4-r11} \n" /* Save the core registers. */ +#endif + " str r0, [r2] \n" /* Save the new top of stack into the first member of the TCB. */ + " stmdb sp!, {r3, r14} \n" + " mov r0, %0 \n" + " msr basepri, r0 \n" +#if ( configNUMBER_OF_CORES > 1 ) + " mov r0, #0 \n" /* use core 0 */ +#endif + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r3, r14} \n" + " ldr r1, [r3] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " ldr r0, [r1] \n" +#if configENABLE_FPU + " ldmia r0!, {r4-r11, r14} \n" /* Pop the core registers */ + " tst r14, #0x10 \n" /* Is the task using the FPU context? If so, pop the high vfp registers too. */ + " it eq \n" + " vldmiaeq r0!, {s16-s31} \n" +#else + " ldmia r0!, {r4-r11} \n" /* Pop the core registers. */ +#endif + " msr psp, r0 \n" + " bx r14 \n" + " \n" + " .align 2 \n" +#if (configNUMBER_OF_CORES == 1) + "pxCurrentTCBConst: .word pxCurrentTCB \n" +#else + "pxCurrentTCBConst: .word pxCurrentTCBs \n" +#endif + ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) + ); +#else /* Cortex M0+ */ + __asm volatile ( + " mrs r0, psp \n" + " \n" + " ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " sub r0, r0, #32 \n" /* Make space for the remaining low registers. */ + " str r0, [r2] \n" /* Save the new top of stack. */ + " stmia r0!, {r4-r7} \n" /* Store the low registers that are not saved automatically. */ + " mov r4, r8 \n" /* Store the high registers. */ + " mov r5, r9 \n" + " mov r6, r10 \n" + " mov r7, r11 \n" + " stmia r0!, {r4-r7} \n" + " \n" + " push {r3, r14} \n" + " cpsid i \n" + " bl vTaskSwitchContext \n" + " cpsie i \n" + " pop {r2, r3} \n" /* lr goes in r3. r2 now holds tcb pointer. */ + " \n" + " ldr r1, [r2] \n" + " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " add r0, r0, #16 \n" /* Move to the high registers. */ + " ldmia r0!, {r4-r7} \n" /* Pop the high registers. */ + " mov r8, r4 \n" + " mov r9, r5 \n" + " mov r10, r6 \n" + " mov r11, r7 \n" + " \n" + " msr psp, r0 \n" /* Remember the new top of stack for the task. */ + " \n" + " sub r0, r0, #32 \n" /* Go back for the low registers that are not automatically restored. */ + " ldmia r0!, {r4-r7} \n" /* Pop low registers. */ + " \n" + " bx r3 \n" + " \n" + ".align 2 \n" + "pxCurrentTCBConst: .word pxCurrentTCB" + ); +#endif +} + +#if configGDB_HELPER /* if GDB debug helper is enabled */ +/* Credits to: + * - Artem Pisarneko for his initial contribution + * - Prasana for the PendSVHandler updates + * - Geoffrey Wossum for the Cortex-M4 contribution + */ + +/* Switch control variable: + * 0 - no hook installed (normal execution), + * 1 - hook installation performed, + * 2 - following hooked switches + */ +#ifdef __GNUC__ +__attribute__((used)) /* needed for -flto and highest optimizations */ +#endif +int volatile dbgPendSVHookState = 0; +/* Requested target task handle variable */ +#ifdef __GNUC__ +__attribute__((used)) /* needed for -flto and highest optimizations */ +#endif +void *volatile dbgPendingTaskHandle; + +#ifdef __GNUC__ +__attribute__((used)) /* needed for -flto and highest optimizations */ +#endif +const int volatile dbgFreeRTOSConfig_suspend_value = INCLUDE_vTaskSuspend; +#ifdef __GNUC__ +__attribute__((used)) /* needed for -flto and highest optimizations */ +#endif +const int volatile dbgFreeRTOSConfig_delete_value = INCLUDE_vTaskDelete; + +__attribute__ ((naked, used)) void PendSV_Handler_jumper(void) { + __asm volatile("b vPortPendSVHandler_native \n"); +} + +#if !McuLib_CONFIG_PEX_SDK_USED /* the SDK expects different interrupt handler names */ +__attribute__ ((naked)) void PendSV_Handler(void) { +#else +__attribute__ ((naked)) void vPortPendSVHandler(void) { +#endif +#if configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY) /* ARM M4(F)/M7/M33 core */ + __asm volatile ( +#if configGDB_HELPER + " ldr r1, _dbgPendSVHookState \n" /* Check hook installed */ + " ldr r0, [r1] \n" + " cmp r0, #0 \n" + " beq PendSV_Handler_jumper \n" /* if no hook installed then jump to native handler, else proceed... */ + " cmp r0, #1 \n" /* check whether hook triggered for the first time... */ + " bne dbg_switch_to_pending_task \n" /* if not so, then jump to switching right now, otherwise current task context must be saved first... */ + " mov r0, #2 \n" /* mark hook after triggered for the first time */ + " str r0, [r1] \n" +#endif /* configGDB_HELPER */ + " mrs r0, psp \n" + " ldr r3, pxCurrentTCBConstG \n" /* Get the location of the current TCB. */ + " ldr r2, [r3] \n" +#if configENABLE_FPU + " tst r14, #0x10 \n" /* Is the task using the FPU context? If so, push high vfp registers. */ + " it eq \n" + " vstmdbeq r0!, {s16-s31} \n" + + " stmdb r0!, {r4-r11, r14} \n" /* save remaining core registers */ +#else + " stmdb r0!, {r4-r11} \n" /* Save the core registers. */ +#endif + " str r0, [r2] \n" /* Save the new top of stack into the first member of the TCB. */ + " stmdb sp!, {r3, r14} \n" + " mov r0, %0 \n" + " msr basepri, r0 \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r3, r14} \n" +#if configGDB_HELPER + "dbg_switch_to_pending_task: \n" + " ldr r3, _dbgPendingTaskHandle \n" /* --> Load task handle going to switch to <-- */ +#endif /* configGDB_HELPER */ + " ldr r1, [r3] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " ldr r0, [r1] \n" +#if configENABLE_FPU + " ldmia r0!, {r4-r11, r14} \n" /* Pop the core registers */ + " tst r14, #0x10 \n" /* Is the task using the FPU context? If so, pop the high vfp registers too. */ + " it eq \n" + " vldmiaeq r0!, {s16-s31} \n" +#else + " ldmia r0!, {r4-r11} \n" /* Pop the core registers. */ +#endif + " msr psp, r0 \n" +#if configGDB_HELPER + " bkpt \n" /* <-- here debugger stops and steps out to target task context */ +#endif /* configGDB_HELPER */ + " bx r14 \n" + " \n" + " .align 2 \n" + "pxCurrentTCBConstG: .word pxCurrentTCB \n" +#if configGDB_HELPER + "_dbgPendSVHookState: .word dbgPendSVHookState \n" + "_dbgPendingTaskHandle: .word dbgPendingTaskHandle \n" + ".word dbgFreeRTOSConfig_suspend_value \n" /* force keep these symbols from cutting away by linker garbage collector */ + ".word dbgFreeRTOSConfig_delete_value \n" +#endif + ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) + ); +#else /* Cortex M0+ */ + __asm volatile ( + " mrs r0, psp \n" + " \n" + " ldr r3, pxCurrentTCBConstG \n" /* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " sub r0, r0, #32 \n" /* Make space for the remaining low registers. */ + " str r0, [r2] \n" /* Save the new top of stack. */ + " stmia r0!, {r4-r7} \n" /* Store the low registers that are not saved automatically. */ + " mov r4, r8 \n" /* Store the high registers. */ + " mov r5, r9 \n" + " mov r6, r10 \n" + " mov r7, r11 \n" + " stmia r0!, {r4-r7} \n" + " \n" + " push {r3, r14} \n" + " cpsid i \n" + " bl vTaskSwitchContext \n" + " cpsie i \n" + " pop {r2, r3} \n" /* lr goes in r3. r2 now holds tcb pointer. */ + " \n" + " ldr r1, [r2] \n" + " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " add r0, r0, #16 \n" /* Move to the high registers. */ + " ldmia r0!, {r4-r7} \n" /* Pop the high registers. */ + " mov r8, r4 \n" + " mov r9, r5 \n" + " mov r10, r6 \n" + " mov r11, r7 \n" + " \n" + " msr psp, r0 \n" /* Remember the new top of stack for the task. */ + " \n" + " sub r0, r0, #32 \n" /* Go back for the low registers that are not automatically restored. */ + " ldmia r0!, {r4-r7} \n" /* Pop low registers. */ + " \n" + " bx r3 \n" + " \n" + ".align 2 \n" + "pxCurrentTCBConstG: .word pxCurrentTCB" + ); +#endif +} + +#endif /* configGDB_HELPER */ + +#endif /* (configCOMPILER==configCOMPILER_ARM_GCC) */ +/*-----------------------------------------------------------*/ +#if configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY) /* ARM M4(F)/M7/M33 core */ + +#if configCOMPILER==configCOMPILER_ARM_KEIL +__asm uint32_t vPortGetIPSR(void) { + PRESERVE8 + + mrs r0, ipsr + bx r14 +} +#endif + +#if( configASSERT_DEFINED == 1 ) + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + #if configCOMPILER==configCOMPILER_ARM_KEIL + ulCurrentInterrupt = vPortGetIPSR(); + #else + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) ); + #endif + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ + +#endif /* ARM M4(F) core */ + +#endif /* McuLib_CONFIG_SDK_USE_FREERTOS */ + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/portTicks.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/portTicks.c new file mode 100644 index 0000000..b2cd860 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/portTicks.c @@ -0,0 +1,234 @@ +/* + * portTicks.c + * + * Created on: 24.04.2019 + * Author: Erich Styger + */ + +#include "FreeRTOSConfig.h" +#include "portTicks.h" + +/* --------------------------------------------------- */ +/* macros dealing with tick counter */ +#if configSYSTICK_USE_LOW_POWER_TIMER + #if !McuLib_CONFIG_PEX_SDK_USED + /*! \todo */ + #define LPTMR0_BASE_PTR LPTMR0 /* low power timer address base */ + #define configLOW_POWER_TIMER_VECTOR_NUMBER LPTMR0_IRQn /* low power timer IRQ number */ + #define ENABLE_TICK_COUNTER() LPTMR_StartTimer(LPTMR0_BASE_PTR); LPTMR_EnableInterrupts(LPTMR0_BASE_PTR, kLPTMR_TimerInterruptEnable) + #define DISABLE_TICK_COUNTER() LPTMR_StopTimer(LPTMR0_BASE_PTR) + #define RESET_TICK_COUNTER_VAL() LPTMR_StopTimer(LPTMR0_BASE_PTR); LPTMR_DisableInterrupts(LPTMR0_BASE_PTR, kLPTMR_TimerInterruptEnable) + #define ACKNOWLEDGE_TICK_ISR() LPTMR_ClearStatusFlags(LPTMR0_BASE_PTR, kLPTMR_TimerCompareFlag); + #elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT + #define ENABLE_TICK_COUNTER() LPTMR_PDD_EnableDevice(LPTMR0_BASE_PTR, PDD_ENABLE); LPTMR_PDD_EnableInterrupt(LPTMR0_BASE_PTR) + #define DISABLE_TICK_COUNTER() LPTMR_PDD_EnableDevice(LPTMR0_BASE_PTR, PDD_DISABLE); LPTMR_PDD_DisableInterrupt(LPTMR0_BASE_PTR) + #define RESET_TICK_COUNTER_VAL() DISABLE_TICK_COUNTER() /* CNR is reset when the LPTMR is disabled or counter register overflows */ + #define ACKNOWLEDGE_TICK_ISR() LPTMR_PDD_ClearInterruptFlag(LPTMR0_BASE_PTR) + #if defined(LDD_ivIndex_INT_LPTimer) /* Earlier version of Processor Expert use this vector name */ + #define configLOW_POWER_TIMER_VECTOR_NUMBER LDD_ivIndex_INT_LPTimer + #elif defined(LDD_ivIndex_INT_LPTMR0) /* Newer versions (Processor Expert for Kinetis v3.0.1 uses this name */ + #define configLOW_POWER_TIMER_VECTOR_NUMBER LDD_ivIndex_INT_LPTMR0 + #else + #error "Unknown Low Power Timer Interrupt Number?" + #endif + #endif +#else + #define ENABLE_TICK_COUNTER() portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT + #define DISABLE_TICK_COUNTER() portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT + #define RESET_TICK_COUNTER_VAL() portNVIC_SYSTICK_CURRENT_VALUE_REG = 0 /*portNVIC_SYSTICK_LOAD_REG*/ + #define ACKNOWLEDGE_TICK_ISR() /* not needed */ +#endif + +typedef unsigned long TickCounter_t; /* enough for 24 bit Systick */ +#if configSYSTICK_USE_LOW_POWER_TIMER + #define TICK_NOF_BITS 16 + #define COUNTS_UP 1 /* LPTMR is counting up */ + #if !McuLib_CONFIG_PEX_SDK_USED + #define SET_TICK_DURATION(val) LPTMR_SetTimerPeriod(LPTMR0_BASE_PTR, val); + #define GET_TICK_DURATION() LPTMR0_BASE_PTR->CNR /*! \todo SDK has no access method for this */ + #define GET_TICK_CURRENT_VAL(addr) *(addr)=LPTMR_GetCurrentTimerCount(LPTMR0_BASE_PTR) + #else + #define SET_TICK_DURATION(val) LPTMR_PDD_WriteCompareReg(LPTMR0_BASE_PTR, val) + #define GET_TICK_DURATION() LPTMR_PDD_ReadCompareReg(LPTMR0_BASE_PTR) + #define GET_TICK_CURRENT_VAL(addr) *(addr)=LPTMR_PDD_ReadCounterReg(LPTMR0_BASE_PTR) + #endif +#else + #define TICK_NOF_BITS 24 + #define COUNTS_UP 0 /* SysTick is counting down to zero */ + #define SET_TICK_DURATION(val) portNVIC_SYSTICK_LOAD_REG = val + #define GET_TICK_DURATION() portNVIC_SYSTICK_LOAD_REG + #define GET_TICK_CURRENT_VAL(addr) *(addr)=portNVIC_SYSTICK_CURRENT_VALUE_REG +#endif + +#if configUSE_TICKLESS_IDLE + #define UL_TIMER_COUNTS_FOR_ONE_TICK ((TickCounter_t)(TIMER_COUNTS_FOR_ONE_TICK)) +#if configCPU_FAMILY_IS_ARM(configCPU_FAMILY) + #define TICKLESS_DISABLE_INTERRUPTS() __asm volatile("cpsid i") /* disable interrupts. Note that the wfi (wait for interrupt) instruction later will still be able to wait for interrupts! */ + #define TICKLESS_ENABLE_INTERRUPTS() __asm volatile("cpsie i") /* re-enable interrupts. */ +#elif (configCPU_FAMILY==configCPU_FAMILY_S08) || (configCPU_FAMILY==configCPU_FAMILY_S12) + #define TICKLESS_DISABLE_INTERRUPTS() __asm("sei"); /* disable interrupts */ + #define TICKLESS_ENABLE_INTERRUPTS() __asm("cli"); /* re-enable interrupts */ +#else + #define TICKLESS_DISABLE_INTERRUPTS() portDISABLE_INTERRUPTS() /* this disables interrupts! Make sure they are re-enabled in vOnPreSleepProcessing()! */ + #define TICKLESS_ENABLE_INTERRUPTS() portENABLE_INTERRUPTS() /* re-enable interrupts */ +#endif + + #if 1 + #if configSYSTICK_USE_LOW_POWER_TIMER + /* using Low Power Timer */ + #if CONFIG_PEX_SDK_USEDMcuLib_CONFIG_PEX_SDK_USED + #define LPTMR_CSR_TCF_MASK 0x80u + #define TICK_INTERRUPT_HAS_FIRED() (LPTMR0_BASE_PTR->CSR&LPTMR_CSR_TCF_MASK)!=0/*! \todo */ /* returns TRUE if tick interrupt had fired */ + #else + #define TICK_INTERRUPT_HAS_FIRED() (LPTMR_PDD_GetInterruptFlag(LPTMR0_BASE_PTR)!=0) /* returns TRUE if tick interrupt had fired */ + #endif + #define TICK_INTERRUPT_FLAG_RESET() /* not needed */ + #define TICK_INTERRUPT_FLAG_SET() /* not needed */ + #else + /* using directly SysTick Timer */ + #define TICK_INTERRUPT_HAS_FIRED() ((portNVIC_SYSTICK_CTRL_REG&portNVIC_SYSTICK_COUNT_FLAG_BIT)!=0) /* returns TRUE if tick interrupt had fired */ + #define TICK_INTERRUPT_FLAG_RESET() /* not needed */ + #define TICK_INTERRUPT_FLAG_SET() /* not needed */ + #endif + #else + /* using global variable to find out if interrupt has fired */ + volatile uint8_t portTickCntr; /* used to find out if we woke up by the tick interrupt */ + #define TICK_INTERRUPT_HAS_FIRED() (portTickCntr!=0) /* returns TRUE if tick interrupt had fired */ + #define TICK_INTERRUPT_FLAG_RESET() portTickCntr=0 + #define TICK_INTERRUPT_FLAG_SET() portTickCntr=1 + #endif +#endif /* configUSE_TICKLESS_IDLE == 1 */ + +#if (configCPU_FAMILY==configCPU_FAMILY_CF1) || (configCPU_FAMILY==configCPU_FAMILY_CF2) + #define portINITIAL_FORMAT_VECTOR ((portSTACK_TYPE)0x4000) + #define portINITIAL_STATUS_REGISTER ((portSTACK_TYPE)0x2000) /* Supervisor mode set. */ +#endif + +#if configCPU_FAMILY_IS_ARM(configCPU_FAMILY) + +/* For strict compliance with the Cortex-M spec the task start address should +have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Constants required to manipulate the core. + * SysTick register: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0662b/CIAGECDD.html + * Registers first... + */ +#define portNVIC_SYSTICK_CTRL_REG (*((volatile unsigned long *)0xe000e010)) /* SYST_CSR, SysTick Control and Status Register */ +#define portNVIC_SYSTICK_LOAD_REG (*((volatile unsigned long *)0xe000e014)) /* SYST_RVR, SysTick reload value register */ +#define portNVIC_SYSTICK_CURRENT_VALUE_REG (*((volatile unsigned long *)0xe000e018)) /* SYST_CVR, SysTick current value register */ +#define portNVIC_SYSTICK_CALIB_VALUE_REG (*((volatile unsigned long *)0xe000e01C)) /* SYST_CALIB, SysTick calibration value register */ +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_COUNT_FLAG_BIT (1UL<<16UL) /* returns 1 if timer counted to 0 since the last read of the register */ +#if configSYSTICK_USE_CORE_CLOCK + #define portNVIC_SYSTICK_CLK_BIT (1UL<<2UL) /* clock source. 1: core clock, 0: external reference clock */ +#else + #define portNVIC_SYSTICK_CLK_BIT (0UL<<2UL) /* clock source. 1: core clock, 0: external reference clock */ +#endif +#define portNVIC_SYSTICK_INT_BIT (1UL<<1UL) /* SysTick interrupt enable bit */ +#define portNVIC_SYSTICK_ENABLE_BIT (1UL<<0UL) /* SysTick enable bit */ + +#if 0 +/* Constants required to manipulate the NVIC: */ +#define portNVIC_INT_CTRL ((volatile unsigned long*)0xe000ed04) /* interrupt control and state register (ICSR) */ +#define portNVIC_PENDSVSET_BIT (1UL<<28UL) /* bit 28 in portNVIC_INT_CTRL (PENDSVSET), see http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/Cihfaaha.html */ +#define portNVIC_PENDSVCLEAR_BIT (1UL<<27UL) /* bit 27 in portNVIC_INT_CTRL (PENDSVCLR) */ +#define portNVIC_PEND_SYSTICK_SET_BIT (1UL<<26UL) /* bit 26 in portNVIC_INT_CTRL (PENDSTSET) */ +#define portNVIC_PEND_SYSTICK_CLEAR_BIT (1UL<<25UL) /* bit 25 in portNVIC_INT_CTRL (PENDSTCLR) */ + +#define portNVIC_SYSPRI2 ((volatile unsigned long*)0xe000ed1c) /* system handler priority register 2 (SHPR2), used for SVCall priority, http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0662b/CIAGECDD.html */ +#define portNVIC_SVCALL_PRI (((unsigned long)configKERNEL_INTERRUPT_PRIORITY)<<24) /* priority of SVCall interrupt (in portNVIC_SYSPRI2) */ + +#define portNVIC_SYSPRI3 ((volatile unsigned long*)0xe000ed20) /* system handler priority register 3 (SHPR3), used for SysTick and PendSV priority, http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0662b/CIAGECDD.html */ +#define portNVIC_SYSTICK_PRI (((unsigned long)configKERNEL_INTERRUPT_PRIORITY)<<24) /* priority of SysTick interrupt (in portNVIC_SYSPRI3) */ +#define portNVIC_PENDSV_PRI (((unsigned long)configKERNEL_INTERRUPT_PRIORITY)<<16) /* priority of PendableService interrupt (in portNVIC_SYSPRI3) */ + +#define portNVIC_SYSPRI7 ((volatile unsigned long*)0xe000e41c) /* system handler priority register 7, PRI_28 is LPTMR */ +#define portNVIC_LP_TIMER_PRI (((unsigned long)configKERNEL_INTERRUPT_PRIORITY)<<0) /* priority of low power timer interrupt */ +#endif + +#if configSYSTICK_USE_LOW_POWER_TIMER && McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT +#define IRQn_Type int +#define __NVIC_PRIO_BITS configPRIO_BITS +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ +/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +#if configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY) /* ARM M4(F)/M7/M33 core */ +typedef struct +{ + __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24]; + __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24]; + __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24]; + __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24]; + __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56]; + __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644]; + __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; +#else /* M0+ */ +typedef struct +{ + __IO uint32_t ISER[1]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31]; + __IO uint32_t ICER[1]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31]; + __IO uint32_t ISPR[1]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31]; + __IO uint32_t ICPR[1]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31]; + uint32_t RESERVED4[64]; + __IO uint32_t IP[8]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; +#endif + +/* Memory mapping of Cortex-M0+ Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + +/* Interrupt Priorities are WORD accessible only under ARMv6M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( (((uint32_t)(IRQn) ) & 0x03) * 8 ) +#define _IP_IDX(IRQn) ( ((uint32_t)(IRQn) >> 2) ) + +/** \brief Set Interrupt Priority + The function sets the priority of an interrupt. + \note The priority cannot be set for every core interrupt. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + */ +static void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) { + IRQn -= 16; /* PEx starts numbers with zero, while system interrupts would be negative */ +#if configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY) /* ARM M4(F)/M7/M33 core */ + NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); /* set Priority for device specific Interrupts */ +#else /* M0+ */ + NVIC->IP[_IP_IDX(IRQn)] = (NVIC->IP[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | + (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); /* set Priority for device specific Interrupts */ +#endif +} + +/** \brief Enable External Interrupt + The function enables a device-specific interrupt in the NVIC interrupt controller. + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +static void NVIC_EnableIRQ(IRQn_Type IRQn) { + IRQn -= 16; /* PEx starts numbers with zero, while system interrupts would be negative */ +#if configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY) /* ARM M4(F)/M7/M33 core */ + NVIC->ISER[(uint32_t)((int32_t)IRQn) >> 5] = (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)); /* enable interrupt */ +#else /* M0+ */ + NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */ +#endif +} +#endif /* configSYSTICK_USE_LOW_POWER_TIMER */ + +#endif /* #if configCPU_FAMILY_IS_ARM(configCPU_FAMILY) */ + +//void vPortStopTickTimer(void) { +// DISABLE_TICK_COUNTER(); +//} diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/portTicks.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/portTicks.h new file mode 100644 index 0000000..c06699c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/portTicks.h @@ -0,0 +1,110 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTTICKS_H_ +#define PORTTICKS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Interface header file to the Processor Expert Tick counter. + * This file is used to access the interface, especially for performance + * counters (e.g. for Percepio Trace). + * That way the a module can interface this wrapper header file instead + * of one of the standard FreeRTOS header files. + */ +#include "McuLib.h" /* include SDK and API used */ + +#include "FreeRTOSConfig.h" +#include "portmacro.h" + +#if !McuLib_CONFIG_PEX_SDK_USED + extern uint32_t SystemCoreClock; /* in Kinetis SDK, this contains the system core clock speed */ +#endif + +/*! + * \brief Return the tick raw counter value. It is assumed that the counter register has been reset at the last tick time + * \return Tick counter value. The value is reset at tick interrupt time. + * */ +uint32_t uxGetTickCounterValue(void); + +#if configSYSTICK_USE_LOW_POWER_TIMER + #define FREERTOS_HWTC_DOWN_COUNTER 0 /* LPTM is counting up */ + #define FREERTOS_HWTC_PERIOD ((1000/configSYSTICK_LOW_POWER_TIMER_CLOCK_HZ)-1UL) /* counter is incrementing from zero to this value */ +#else + #define FREERTOS_HWTC_DOWN_COUNTER 1 /* SysTick is counting down */ + #define FREERTOS_HWTC_PERIOD ((configCPU_CLOCK_HZ/configTICK_RATE_HZ)-1UL) /* counter is decrementing from this value to zero */ +#endif + +#if configUSE_TICKLESS_IDLE == 1 + extern volatile uint8_t portTickCntr; /* used to find out if we woke up by the tick interrupt */ +#endif + +#define FREERTOS_HWTC_FREQ_HZ configTICK_RATE_HZ + +#if configUSE_PERCEPIO_TRACE_HOOKS /* using Percepio Trace */ +#if (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_PROCESSOR_EXPERT) + /* tick information for Percepio Trace */ + + /* undefine previous values, where dummy anyway: make sure this header file is included last! */ + #undef TRC_HWTC_COUNT_DIRECTION + #undef TRC_HWTC_PERIOD + #undef TRC_HWTC_DIVISOR + #undef TRC_HWTC_COUNT + + #if FREERTOS_HWTC_DOWN_COUNTER + #define TRC_HWTC_COUNT_DIRECTION DIRECTION_DECREMENTING + #define TRC_HWTC_PERIOD FREERTOS_HWTC_PERIOD /* counter is decrementing from this value to zero */ + #else + #define TRC_HWTC_COUNT_DIRECTION DIRECTION_INCREMENTING + #define TRC_HWTC_PERIOD FREERTOS_HWTC_PERIOD /* counter is incrementing from zero to this value */ + #endif + + #if configCPU_FAMILY_IS_ARM(configCPU_FAMILY) + #if configSYSTICK_USE_LOW_POWER_TIMER + #define TRC_HWTC_DIVISOR 1 /* divisor for slow counter tick value */ + #else + #define TRC_HWTC_DIVISOR 2 /* divisor for fast counter tick value */ + #endif + #else + #define TRC_HWTC_DIVISOR 1 + #endif + + #define TRC_HWTC_COUNT (uxGetTickCounterValue()) + #define TRC_HWTC_TYPE TRC_FREE_RUNNING_32BIT_INCR + #define TRC_IRQ_PRIORITY_ORDER 0 /* 0: lower IRQ prios mean higher priority, 1: otherwise */ + #define TRC_HWTC_FREQ_HZ FREERTOS_HWTC_FREQ_HZ +#endif +#endif /* configUSE_PERCEPIO_TRACE_HOOKS */ + +#ifdef __cplusplus +} +#endif + +#endif /* PORTTICKS_H_ */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/portasm.s b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/portasm.s new file mode 100644 index 0000000..f144010 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/portasm.s @@ -0,0 +1,28 @@ +/* file is intentionally empty as not needed for this GNU gcc FreeRTOS port */ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h new file mode 100644 index 0000000..b081f91 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h @@ -0,0 +1,630 @@ +#include "McuLibconfig.h" +#if McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_RP2040 && (configNUMBER_OF_CORES == 2) + #include "rp2040_portmacro.h" +#else + +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "FreeRTOSConfig.h" +#include "projdefs.h" /* for pdFALSE, pdTRUE */ + +void vPortStopTickTimer(void); +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ +#ifdef __GNUC__ /* << EST: 'used' attribute need for LTO (Link Time Optimization) */ + #define portDONT_DISCARD __attribute__( ( used ) ) +#else + #define portDONT_DISCARD /* nothing */ +#endif + +#ifndef configENABLE_FPU + #error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU. +#endif /* configENABLE_FPU */ + +#ifndef configENABLE_MPU + #error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU. +#endif /* configENABLE_MPU */ + +#ifndef configENABLE_TRUSTZONE + #error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone. +#endif /* configENABLE_TRUSTZONE */ + +#if (configCOMPILER==configCOMPILER_S12_FSL) || (configCOMPILER==configCOMPILER_S08_FSL) + /* disabling some warnings as the RTOS sources are not that clean... */ + #pragma MESSAGE DISABLE C5909 /* assignment in condition */ + #pragma MESSAGE DISABLE C2705 /* possible loss of data */ + #pragma MESSAGE DISABLE C5905 /* multiplication with one */ + #pragma MESSAGE DISABLE C5904 /* division by one */ + #pragma MESSAGE DISABLE C5660 /* removed dead code */ + #pragma MESSAGE DISABLE C5917 /* removed dead assignment */ + #pragma MESSAGE DISABLE C4001 /* condition always FALSE */ +#endif +#if configCOMPILER==configCOMPILER_S12_FSL + #pragma MESSAGE DISABLE C12053 /* SP change not in debug information */ + #pragma MESSAGE DISABLE C12056 /* SP debug information incorrect */ +#endif + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#if (configCPU_FAMILY==configCPU_FAMILY_CF1) || (configCPU_FAMILY==configCPU_FAMILY_CF2) || configCPU_FAMILY_IS_ARM(configCPU_FAMILY) || (configCPU_FAMILY==configCPU_FAMILY_DSC) + #define portSTACK_TYPE unsigned long +#elif (configCPU_FAMILY==configCPU_FAMILY_S08) || (configCPU_FAMILY==configCPU_FAMILY_S12) + #define portSTACK_TYPE unsigned char +#endif +typedef portSTACK_TYPE StackType_t; + +#define portUSE_CUSTOM_BASE_TYPE 0 /* 1: use custom base type */ + +#if portUSE_CUSTOM_BASE_TYPE + #define portBASE_TYPE char /* custom port base type */ + typedef portBASE_TYPE BaseType_t; + typedef unsigned portBASE_TYPE UBaseType_t; +#elif (configCPU_FAMILY==configCPU_FAMILY_CF1) || (configCPU_FAMILY==configCPU_FAMILY_CF2) || configCPU_FAMILY_IS_ARM(configCPU_FAMILY) || (configCPU_FAMILY==configCPU_FAMILY_DSC) + #define portBASE_TYPE long + typedef long BaseType_t; + typedef unsigned long UBaseType_t; +#elif (configCPU_FAMILY==configCPU_FAMILY_S08) || (configCPU_FAMILY==configCPU_FAMILY_S12) + #define portBASE_TYPE char + typedef signed char BaseType_t; + typedef unsigned char UBaseType_t; +#endif + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY (TickType_t)0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY (TickType_t)0xffffffff + +#if (configCPU_FAMILY==configCPU_FAMILY_CF1) || (configCPU_FAMILY==configCPU_FAMILY_CF2) || configCPU_FAMILY_IS_ARM(configCPU_FAMILY) + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif /* 32bit architecture */ + +#endif + +#if (configNUMBER_OF_CORES == 2) /* dummy entries for other cores */ + #define portGET_CORE_ID() 0 + #define portYIELD_CORE(x) vPortYieldFromISR() + + #define portGET_TASK_LOCK() /* empty */ + #define portRELEASE_TASK_LOCK() /* empty */ + + #define portGET_ISR_LOCK() /* empty */ + #define portRELEASE_ISR_LOCK() /* empty */ + + #define portENTER_CRITICAL_FROM_ISR() vTaskEnterCriticalFromISR() + #define portEXIT_CRITICAL_FROM_ISR(x) vTaskExitCriticalFromISR(x) + + /* Critical nesting count management. */ + extern UBaseType_t uxCriticalNestings[ configNUMBER_OF_CORES ]; + #define portGET_CRITICAL_NESTING_COUNT() ( uxCriticalNestings[ portGET_CORE_ID() ] ) + #define portSET_CRITICAL_NESTING_COUNT( x ) ( uxCriticalNestings[ portGET_CORE_ID() ] = ( x ) ) + #define portINCREMENT_CRITICAL_NESTING_COUNT() ( uxCriticalNestings[ portGET_CORE_ID() ]++ ) + #define portDECREMENT_CRITICAL_NESTING_COUNT() ( uxCriticalNestings[ portGET_CORE_ID() ]-- ) + +#endif + +#if( configENABLE_TRUSTZONE == 1 ) + extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); + extern void vPortFreeSecureContext( uint32_t *pulTCB ) /* PRIVILEGED_FUNCTION */; +#endif /* configENABLE_TRUSTZONE */ + +#if( configENABLE_MPU == 1 ) + extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */; + extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */; +#endif /* configENABLE_MPU */ + +/** + * @brief MPU specific constants. + */ +#if( configENABLE_MPU == 1 ) + #define portUSING_MPU_WRAPPERS 1 + #define portPRIVILEGE_BIT ( 0x80000000UL ) +#else + #define portPRIVILEGE_BIT ( 0x0UL ) +#endif /* configENABLE_MPU */ + +#if configENABLE_MPU +/*-----------------------------------------------------------*/ +/* MPU specific constants. */ + +#define portMPU_REGION_READ_WRITE ( 0x03UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 0x05UL << 24UL ) +#define portMPU_REGION_READ_ONLY ( 0x06UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0x01UL << 24UL ) +#define portMPU_REGION_CACHEABLE_BUFFERABLE ( 0x07UL << 16UL ) +#define portMPU_REGION_EXECUTE_NEVER ( 0x01UL << 28UL ) + +#define portUNPRIVILEGED_FLASH_REGION ( 0UL ) +#define portPRIVILEGED_FLASH_REGION ( 1UL ) +#define portPRIVILEGED_RAM_REGION ( 2UL ) +#define portGENERAL_PERIPHERALS_REGION ( 3UL ) +#define portSTACK_REGION ( 4UL ) +#define portFIRST_CONFIGURABLE_REGION ( 5UL ) +#define portLAST_CONFIGURABLE_REGION ( 7UL ) +#define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) +#define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + +#define portSWITCH_TO_USER_MODE() __asm volatile ( " mrs r0, control \n orr r0, #1 \n msr control, r0 " :::"r0" ) + +typedef struct MPU_REGION_REGISTERS +{ + uint32_t ulRegionBaseAddress; + uint32_t ulRegionAttribute; +} xMPU_REGION_REGISTERS; + +/* Plus 1 to create space for the stack region. */ +typedef struct MPU_SETTINGS +{ + xMPU_REGION_REGISTERS xRegion[ portTOTAL_NUM_REGIONS ]; +} xMPU_SETTINGS; +#endif /* configENABLE_MPU */ + +#if configENABLE_MPU /* check values for LPC55xx! */ +/* Devices Region. */ +#define portDEVICE_REGION_START_ADDRESS ( 0x50000000 ) +#define portDEVICE_REGION_END_ADDRESS ( 0x5FFFFFFF ) + +/* Device memory attributes used in MPU_MAIR registers. + * + * 8-bit values encoded as follows: + * Bit[7:4] - 0000 - Device Memory + * Bit[3:2] - 00 --> Device-nGnRnE + * 01 --> Device-nGnRE + * 10 --> Device-nGRE + * 11 --> Device-GRE + * Bit[1:0] - 00, Reserved. + */ +#define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */ +#define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */ +#define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */ +#define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */ + +/* Normal memory attributes used in MPU_MAIR registers. */ +#define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */ +#define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */ + +/* Attributes used in MPU_RBAR registers. */ +#define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL ) +#define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL ) +#define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL ) + +#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL ) +#define portMPU_REGION_READ_WRITE ( 1UL << 1UL ) +#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL ) +#define portMPU_REGION_READ_ONLY ( 3UL << 1UL ) + +#define portMPU_REGION_EXECUTE_NEVER ( 1UL ) + +/*-----------------------------------------------------------*/ + +/** + * @brief Settings to define an MPU region. + */ +typedef struct MPURegionSettings +{ + uint32_t ulRBAR; /**< RBAR for the region. */ + uint32_t ulRLAR; /**< RLAR for the region. */ +} MPURegionSettings_t; + +/** + * @brief MPU settings as stored in the TCB. + */ +typedef struct MPU_SETTINGS +{ + uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */ + MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */ +} xMPU_SETTINGS; + +/*-----------------------------------------------------------*/ + +/** + * @brief SVC numbers. + */ +#define portSVC_ALLOCATE_SECURE_CONTEXT 0 +#define portSVC_FREE_SECURE_CONTEXT 1 +#define portSVC_START_SCHEDULER 2 +#define portSVC_RAISE_PRIVILEGE 3 +/*-----------------------------------------------------------*/ + +#endif /* configENABLE_MPU */ + +/*-----------------------------------------------------------*/ +/* Hardware specifics. */ +#if (configCPU_FAMILY==configCPU_FAMILY_CF1) || (configCPU_FAMILY==configCPU_FAMILY_CF2) + #define portBYTE_ALIGNMENT 4 + #define portSTACK_GROWTH -1 /* stack grows from HIGH to LOW */ +#elif configCPU_FAMILY_IS_ARM(configCPU_FAMILY) + #define portBYTE_ALIGNMENT 8 + #define portSTACK_GROWTH -1 /* stack grows from HIGH to LOW */ +#elif (configCPU_FAMILY==configCPU_FAMILY_S08) || (configCPU_FAMILY==configCPU_FAMILY_S12) + #define portBYTE_ALIGNMENT 1 + #define portSTACK_GROWTH -1 /* stack grows from HIGH to LOW */ +#elif (configCPU_FAMILY==configCPU_FAMILY_DSC) + #define portBYTE_ALIGNMENT 4 + #define portSTACK_GROWTH 1 /* stack grows from LOW to HIGH */ +#endif + +#define portTICK_PERIOD_MS ((TickType_t)1000/configTICK_RATE_HZ) +/*-----------------------------------------------------------*/ +/* Critical section management. */ +unsigned long ulPortSetIPL(unsigned portLONG); + +/* If set to 1, then this port uses the critical nesting count from the TCB rather than +maintaining a separate value and then saving this value in the task stack. */ +#define portCRITICAL_NESTING_IN_TCB 0 + + +extern unsigned portBASE_TYPE uxPortSetInterruptMaskFromISR(void); +extern void vPortClearInterruptMaskFromISR(unsigned portBASE_TYPE); + + +#if configCOMPILER==configCOMPILER_DSC_FSL + /* for DSC, there is a possible skew after enable/disable Interrupts. */ + #define portPOST_ENABLE_DISABLE_INTERRUPTS() \ + asm(nop); asm(nop); asm(nop); asm(nop); asm(nop); asm(nop); +#else + #define portPOST_ENABLE_DISABLE_INTERRUPTS() /* nothing special needed */ +#endif + +#if configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY) /* Cortex M4/M7/M33 */ + #if (configCOMPILER==configCOMPILER_ARM_KEIL) + __asm uint32_t ulPortSetInterruptMask(void); + __asm void vPortClearInterruptMask(uint32_t ulNewMask); + + #define portSET_INTERRUPT_MASK() ulPortSetInterruptMask() + #define portCLEAR_INTERRUPT_MASK(x) vPortClearInterruptMask(x) + #elif (configCOMPILER==configCOMPILER_ARM_GCC) + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() + #define portSET_INTERRUPT_MASK() ulPortRaiseBASEPRI() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortSetBASEPRI(x) + #define portCLEAR_INTERRUPT_MASK(x) vPortSetBASEPRI(x) + #define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() + #define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + #elif (configCOMPILER==configCOMPILER_ARM_IAR) /* IAR */ || (configCOMPILER==configCOMPILER_ARM_FSL) /* legacy FSL ARM Compiler */ + void vPortSetInterruptMask(void); /* prototype, implemented in portasm.s */ + void vPortClearInterruptMask(void); /* prototype, implemented in portasm.s */ + #define portSET_INTERRUPT_MASK() vPortSetInterruptMask() + #define portCLEAR_INTERRUPT_MASK(x) vPortClearInterruptMask(x) + #else + #error "unknown compiler?" + #endif +#elif configCPU_FAMILY_IS_ARM_M0(configCPU_FAMILY) /* Cortex-M0+ */ + #if configCOMPILER==configCOMPILER_ARM_KEIL + #define portSET_INTERRUPT_MASK() __disable_irq() + #define portCLEAR_INTERRUPT_MASK(x) __enable_irq() + #else /* IAR, CW ARM or GNU ARM gcc */ + /* Critical section management. */ + #define portSET_INTERRUPT_MASK() __asm volatile("cpsid i") + #define portCLEAR_INTERRUPT_MASK(x) __asm volatile("cpsie i") + extern void vPortEnterCritical(void); + extern void vPortExitCritical(void); + #define portSET_INTERRUPT_MASK_FROM_ISR() 0;portSET_INTERRUPT_MASK() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) portCLEAR_INTERRUPT_MASK();(void)x + #define portDISABLE_INTERRUPTS() portSET_INTERRUPT_MASK() + #define portENABLE_INTERRUPTS() portCLEAR_INTERRUPT_MASK(0) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + #endif +#endif + +#if configCOMPILER==configCOMPILER_ARM_KEIL + #define portDISABLE_ALL_INTERRUPTS() __disable_irq() + #define portENABLE_ALL_INTERRUPTS() __enable_irq() +#else /* IAR, CW ARM or GNU ARM gcc */ + #define portDISABLE_ALL_INTERRUPTS() __asm volatile("cpsid i") + #define portENABLE_ALL_INTERRUPTS() __asm volatile("cpsie i") +#endif + +/* There are an uneven number of items on the initial stack, so +portALIGNMENT_ASSERT_pxCurrentTCB() will trigger false positive asserts. */ +#define portALIGNMENT_ASSERT_pxCurrentTCB (void) + +#if( configENABLE_TRUSTZONE == 1 ) + /** + * @brief Allocate a secure context for the task. + * + * Tasks are not created with a secure context. Any task that is going to call + * secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a + * secure context before it calls any secure function. + * + * @param[in] ulSecureStackSize The size of the secure stack to be allocated. + */ + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize ) + + /** + * @brief Called when a task is deleted to delete the task's secure context, + * if it has one. + * + * @param[in] pxTCB The TCB of the task being deleted. + */ + #define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB ) +#else + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) + #define portCLEAN_UP_TCB( pxTCB ) +#endif /* configENABLE_TRUSTZONE */ + +/*-----------------------------------------------------------*/ + +#if( configENABLE_MPU == 1 ) + /** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ + #define portIS_PRIVILEGED() xIsPrivileged() + + /** + * @brief Raise an SVC request to raise privilege. + * + * The SVC handler checks that the SVC was raised from a system call and only + * then it raises the privilege. If this is called from any other place, + * the privilege is not raised. + */ + #define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" :: "i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + + /** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ + #define portRESET_PRIVILEGE() vResetPrivilege() +#else + #define portIS_PRIVILEGED() + #define portRAISE_PRIVILEGE() + #define portRESET_PRIVILEGE() +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + + +/*-----------------------------------------------------------*/ +/* Scheduler utilities. */ + +extern void vPortYieldFromISR(void); +#define portYIELD() vPortYieldFromISR() +#define portEND_SWITCHING_ISR(xSwitchRequired) { if( xSwitchRequired != pdFALSE ) { traceISR_EXIT_TO_SCHEDULER(); portYIELD(); } else { traceISR_EXIT(); } } +#define portYIELD_FROM_ISR(x) portEND_SWITCHING_ISR(x) +/*-----------------------------------------------------------*/ + +/* Architecture specific optimizations. */ +#if configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + /* Generic helper function. */ + #if (configCOMPILER==configCOMPILER_ARM_GCC) + __attribute__((always_inline)) static inline unsigned char ucPortCountLeadingZeros(unsigned long ulBitmap) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) ); + return ucReturn; + } + #endif + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + #if (configCOMPILER==configCOMPILER_ARM_GCC) + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + #elif (configCOMPILER==configCOMPILER_ARM_KEIL) + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __clz( ( uxReadyPriorities ) ) ) + #elif (configCOMPILER==configCOMPILER_ARM_IAR) + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( ( uint32_t ) __CLZ( ( uxReadyPriorities ) ) ) ) + #endif + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ +#endif /* configCPU_FAMILY_IS_ARM_M4_M7 */ +/*-----------------------------------------------------------*/ + +#ifdef configASSERT +#if configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY) /* ARM M4/M7(F) core */ + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#else + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() +#endif +#endif + +/*-----------------------------------------------------------*/ +/* Tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep(TickType_t xExpectedIdleTime); + #define portSUPPRESS_TICKS_AND_SLEEP(xExpectedIdleTime) vPortSuppressTicksAndSleep(xExpectedIdleTime) +#endif +/*-----------------------------------------------------------*/ +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO(vFunction, pvParameters) void vFunction(void *pvParameters) +#define portTASK_FUNCTION(vFunction, pvParameters) void vFunction(void *pvParameters) +/*-----------------------------------------------------------*/ +void vPortStartFirstTask(void); + /* starts the first task, called from xPortStartScheduler() */ + +void vPortYieldHandler(void); + /* handler for the SWI interrupt */ + +#if configENABLE_FPU /* has floating point unit */ + void vPortEnableVFP(void); + /* enables floating point support in the CPU */ +#endif + +/* Prototypes for interrupt service handlers */ +#if !McuLib_CONFIG_PEX_SDK_USED /* the SDK expects different interrupt handler names */ + void SVC_Handler(void); /* SVC interrupt handler */ + void PendSV_Handler(void); /* PendSV interrupt handler */ + void SysTick_Handler(void); /* Systick interrupt handler */ +#else + void vPortSVCHandler(void); /* SVC interrupt handler */ + void vPortPendSVHandler(void); /* PendSV interrupt handler */ + void vPortTickHandler(void); /* Systick interrupt handler */ +#endif + +#if (configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY) || configCPU_FAMILY_IS_ARM_M4_M7(configCPU_FAMILY)) && (configCOMPILER==configCOMPILER_ARM_GCC) + #define portINLINE __inline + + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__(( always_inline)) + #endif + + #if configENABLE_MPU + /* Set the privilege level to user mode if xRunningPrivileged is false. */ + portFORCE_INLINE static void vPortResetPrivilege( BaseType_t xRunningPrivileged ) + { + if( xRunningPrivileged != pdTRUE ) + { + __asm volatile ( " mrs r0, control \n" \ + " orr r0, #1 \n" \ + " msr control, r0 \n" \ + :::"r0" ); + } + } + #endif + + portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) + { + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; + } + + /*-----------------------------------------------------------*/ + + portFORCE_INLINE static void vPortRaiseBASEPRI( void ) + { + uint32_t ulNewBASEPRI; + + __asm volatile + ( + " mov %0, %1 \n" \ + " msr basepri, %0 \n" \ + " isb \n" \ + " dsb \n" \ + :"=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); + } + + /*-----------------------------------------------------------*/ + + portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void ) + { + uint32_t ulOriginalBASEPRI, ulNewBASEPRI; + + __asm volatile + ( + " mrs %0, basepri \n" \ + " mov %1, %2 \n" \ + " msr basepri, %1 \n" \ + " isb \n" \ + " dsb \n" \ + :"=r" (ulOriginalBASEPRI), "=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); + + /* This return will not be reached but is necessary to prevent compiler + warnings. */ + return ulOriginalBASEPRI; + } + /*-----------------------------------------------------------*/ + + portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue ) + { + __asm volatile + ( + " msr basepri, %0 " :: "r" ( ulNewMaskValue ) : "memory" + ); + } + /*-----------------------------------------------------------*/ +#endif + +/* << EST needed for PICO-W lwIP, IPSR would be available on M4 too */ +#define portCHECK_IF_IN_ISR() ({ \ + uint32_t ulIPSR; \ + __asm volatile ("mrs %0, IPSR" : "=r" (ulIPSR)::); \ + ((uint8_t)ulIPSR)>0;}) + +#if configUSE_TICKLESS_IDLE_DECISION_HOOK /* << EST */ + BaseType_t configUSE_TICKLESS_IDLE_DECISION_HOOK_NAME(void); /* return pdTRUE if RTOS can enter tickless idle mode, pdFALSE otherwise */ +#endif + +void prvTaskExitError(void); + /* handler to catch task exit errors */ + +#if !configGENERATE_RUN_TIME_STATS_USE_TICKS + extern void McuRTOS_AppConfigureTimerForRuntimeStats(void); + extern uint32_t McuRTOS_AppGetRuntimeCounterValueFromISR(void); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/readme_gdbBacktraceDebug.txt b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/readme_gdbBacktraceDebug.txt new file mode 100644 index 0000000..b4e0d4f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/readme_gdbBacktraceDebug.txt @@ -0,0 +1,31 @@ +readme.txt +---------- +Tasks backtrace switcher/viewer snippet is from the following FreeRTOS Interactive site: +http://interactive.freertos.org/entries/23468301-Tasks-backtrace-switcher-viewer-snippet-for-debugger-gcc-gdb-ARM-Cortex-M3-MPU-port-Eclipse-support- + +It generates the following files: +- readme_gdbBacktraceDebug.txt (this file) +- .gdbinit-FreeRTOS-helpers (GDB script file) + +Usage: +- execute GDB script (either manually or in the launch configuration): + source .//Generated_Code//.gdbinit-FreeRTOS-helpers +- execute + freertos_show_threads + to show threads with handlers +- use + freertos_switch_to_task + to show task stack +- use + freertos_restore_running_context + to restore the context before running + +Credits to: +- Artem Pisarneko for his initial contribution +- Prasana for the PendSVHandler updates +- Geoffrey Wossum for the Cortex-M4 contribution + +Link to article: +http://mcuoneclipse.com/2015/10/03/freertos-arm-thread-debugging-with-eclipse-and-gdb/ + + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/rp2040_config.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/rp2040_config.h new file mode 100644 index 0000000..f106b1e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/rp2040_config.h @@ -0,0 +1,96 @@ +/* + * FreeRTOS Kernel V10.4.3 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (c) 2021 Raspberry Pi (Trading) Ltd. + * + * SPDX-License-Identifier: MIT AND BSD-3-Clause + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + */ + +#ifndef RP2040_CONFIG_H +#define RP2040_CONFIG_H + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +#include "hardware/sync.h" + +/* configUSE_DYNAMIC_EXCEPTION_HANDLERS == 1 means set the exception handlers dynamically on cores + * that need them in case the user has set up distinct vector table offsets per core + */ +#ifndef configUSE_DYNAMIC_EXCEPTION_HANDLERS + #if defined( PICO_NO_RAM_VECTOR_TABLE ) && ( PICO_NO_RAM_VECTOR_TABLE == 1 ) + #define configUSE_DYNAMIC_EXCEPTION_HANDLERS 0 + #else + #define configUSE_DYNAMIC_EXCEPTION_HANDLERS 1 + #endif +#endif + +/* configSUPPORT_PICO_SYNC_INTEROP == 1 means that SDK pico_sync + * sem/mutex/queue etc. will work correctly when called from FreeRTOS tasks + */ +#ifndef configSUPPORT_PICO_SYNC_INTEROP + #if LIB_PICO_SYNC + #define configSUPPORT_PICO_SYNC_INTEROP 1 + #endif +#endif + +/* configSUPPORT_PICO_SYNC_INTEROP == 1 means that SDK pico_time + * sleep_ms/sleep_us/sleep_until will work correctly when called from FreeRTOS + * tasks, and will actually block at the FreeRTOS level + */ +#ifndef configSUPPORT_PICO_TIME_INTEROP + #if LIB_PICO_TIME + #define configSUPPORT_PICO_TIME_INTEROP 1 + #endif +#endif + +#if ( configNUMBER_OF_CORES > 1 ) + +/* configTICK_CORE indicates which core should handle the SysTick + * interrupts */ + #ifndef configTICK_CORE + #define configTICK_CORE 0 + #endif +#endif + +/* This SMP port requires two spin locks, which are claimed from the SDK. + * the spin lock numbers to be used are defined statically and defaulted here + * to the values nominally set aside for RTOS by the SDK */ +#ifndef configSMP_SPINLOCK_0 + #define configSMP_SPINLOCK_0 PICO_SPINLOCK_ID_OS1 +#endif + +#ifndef configSMP_SPINLOCK_1 + #define configSMP_SPINLOCK_1 PICO_SPINLOCK_ID_OS2 +#endif + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* ifndef RP2040_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/rp2040_port.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/rp2040_port.c new file mode 100644 index 0000000..f62fc9a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/rp2040_port.c @@ -0,0 +1,1188 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (c) 2021 Raspberry Pi (Trading) Ltd. + * + * SPDX-License-Identifier: MIT AND BSD-3-Clause + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*---------------------------------------------------------------------- + * Implementation of functions defined in portable.h for the RP2040 port. + *----------------------------------------------------------------------*/ +#include "McuLibconfig.h" +#if McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_RP2040 +#include "FreeRTOS.h" +#include "task.h" +#include "rp2040_config.h" +#include "hardware/clocks.h" +#include "hardware/exception.h" + +/* + * LIB_PICO_MULTICORE == 1, if we are linked with pico_multicore (note that + * the non SMP FreeRTOS_Kernel is not linked with pico_multicore itself). We + * use this flag to determine if we need multi-core functionality. + */ +#if ( LIB_PICO_MULTICORE == 1 ) + #include "pico/multicore.h" +#endif /* LIB_PICO_MULTICORE */ + +/* TODO : consider to remove this macro. */ +#define portRUNNING_ON_BOTH_CORES ( configNUMBER_OF_CORES == portMAX_CORE_COUNT ) + +/* Constants required to manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#ifndef portMISSED_COUNTS_FACTOR + #define portMISSED_COUNTS_FACTOR ( 45UL ) +#endif + +/* Let the user override the pre-loading of the initial LR with the address of + * prvTaskExitError() in case it messes up unwinding of the stack in the + * debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__( ( naked ) ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void vPortStartFirstTask( void ) __attribute__( ( naked ) ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. This is initialized to 0 to allow vPortEnter/ExitCritical + * to be called before the scheduler is started */ +#if ( configNUMBER_OF_CORES == 1 ) + static UBaseType_t uxCriticalNesting; +#else /* #if ( configNUMBER_OF_CORES == 1 ) */ +UBaseType_t uxCriticalNestings[ configNUMBER_OF_CORES ] = { 0 }; +#endif /* #if ( configNUMBER_OF_CORES == 1 ) */ + +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_PICO_SYNC_INTEROP == 1 ) + #include "pico/lock_core.h" + #include "hardware/irq.h" + #include "event_groups.h" + #if configSUPPORT_STATIC_ALLOCATION + static StaticEventGroup_t xStaticEventGroup; + #define pEventGroup ( &xStaticEventGroup ) + #endif /* configSUPPORT_STATIC_ALLOCATION */ + static EventGroupHandle_t xEventGroup; + #if ( portRUNNING_ON_BOTH_CORES == 0 ) + static EventBits_t uxCrossCoreEventBits; + static spin_lock_t * pxCrossCoreSpinLock; + #endif + + static spin_lock_t * pxYieldSpinLock[ configNUMBER_OF_CORES ]; + static uint32_t ulYieldSpinLockSaveValue[ configNUMBER_OF_CORES ]; +#endif /* configSUPPORT_PICO_SYNC_INTEROP */ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ + +#define INVALID_PRIMARY_CORE_NUM 0xffu +/* The primary core number (the own which has the SysTick handler) */ +static uint8_t ucPrimaryCoreNum = INVALID_PRIMARY_CORE_NUM; + +/* Note: portIS_FREE_RTOS_CORE() also returns false until the scheduler is started */ +#if ( portRUNNING_ON_BOTH_CORES == 1 ) + #define portIS_FREE_RTOS_CORE() ( ucPrimaryCoreNum != INVALID_PRIMARY_CORE_NUM ) +#else + #define portIS_FREE_RTOS_CORE() ( ucPrimaryCoreNum == get_core_num() ) +#endif + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11..R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). */ + panic_unsupported(); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + /* This function is no longer used, but retained for backward + * compatibility. */ +} +/*-----------------------------------------------------------*/ + +void vPortStartFirstTask( void ) +{ + #if ( configNUMBER_OF_CORES == 1 ) + __asm volatile ( + " .syntax unified \n" + " ldr r2, pxCurrentTCBConst1 \n" /* Obtain location of pxCurrentTCB. */ + " ldr r3, [r2] \n" + " ldr r0, [r3] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " adds r0, #32 \n" /* Discard everything up to r0. */ + " msr psp, r0 \n" /* This is now the new top of stack to use in the task. */ + " movs r0, #2 \n" /* Switch to the psp stack. */ + " msr CONTROL, r0 \n" + " isb \n" + " pop {r0-r5} \n" /* Pop the registers that are saved automatically. */ + " mov lr, r5 \n" /* lr is now in r5. */ + " pop {r3} \n" /* Return address is now in r3. */ + " pop {r2} \n" /* Pop and discard XPSR. */ + " cpsie i \n" /* The first task has its context and interrupts can be enabled. */ + " bx r3 \n" /* Finally, jump to the user defined task code. */ + " .align 4 \n" + "pxCurrentTCBConst1: .word pxCurrentTCB\n" + ); + #else /* if ( configNUMBER_OF_CORES == 1 ) */ + __asm volatile ( + " .syntax unified \n" + #if configRESET_STACK_POINTER + " ldr r0, =0xE000ED08 \n" /* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n" /* Set the msp back to the start of the stack. */ + #endif /* configRESET_STACK_POINTER */ + #if portRUNNING_ON_BOTH_CORES + " adr r1, ulAsmLocals \n" /* Get the location of the current TCB for the current core. */ + " ldmia r1!, {r2, r3} \n" + " ldr r2, [r2] \n" /* r2 = Core number */ + " lsls r2, #2 \n" + " ldr r3, [r3, r2] \n" /* r3 = pxCurrentTCBs[get_core_num()] */ + #else + " ldr r3, =pxCurrentTCBs \n" + " ldr r3, [r3] \n" /* r3 = pxCurrentTCBs[0] */ + #endif /* portRUNNING_ON_BOTH_CORES */ + " ldr r0, [r3] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " adds r0, #32 \n" /* Discard everything up to r0. */ + " msr psp, r0 \n" /* This is now the new top of stack to use in the task. */ + " movs r0, #2 \n" /* Switch to the psp stack. */ + " msr CONTROL, r0 \n" + " isb \n" + " pop {r0-r5} \n" /* Pop the registers that are saved automatically. */ + " mov lr, r5 \n" /* lr is now in r5. */ + " pop {r3} \n" /* Return address is now in r3. */ + " pop {r2} \n" /* Pop and discard XPSR. */ + " cpsie i \n" /* The first task has its context and interrupts can be enabled. */ + " bx r3 \n" /* Finally, jump to the user defined task code. */ + #if portRUNNING_ON_BOTH_CORES + " \n" + " .align 4 \n" + "ulAsmLocals: \n" + " .word 0xD0000000 \n" /* SIO */ + " .word pxCurrentTCBs \n" + #endif /* portRUNNING_ON_BOTH_CORES */ + ); + #endif /* if ( configNUMBER_OF_CORES == 1 ) */ +} +/*-----------------------------------------------------------*/ + +#if ( LIB_PICO_MULTICORE == 1 ) && ( configSUPPORT_PICO_SYNC_INTEROP == 1 ) + static void prvFIFOInterruptHandler() + { + /* We must remove the contents (which we don't care about) + * to clear the IRQ */ + multicore_fifo_drain(); + + /* And explicitly clear any other IRQ flags. */ + multicore_fifo_clear_irq(); + + #if ( portRUNNING_ON_BOTH_CORES == 1 ) + portYIELD_FROM_ISR( pdTRUE ); + #elif ( configSUPPORT_PICO_SYNC_INTEROP == 1 ) + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + uint32_t ulSave = spin_lock_blocking( pxCrossCoreSpinLock ); + EventBits_t ulBits = uxCrossCoreEventBits; + uxCrossCoreEventBits &= ~ulBits; + spin_unlock( pxCrossCoreSpinLock, ulSave ); + xEventGroupSetBitsFromISR( xEventGroup, ulBits, &xHigherPriorityTaskWoken ); + portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + #endif /* portRUNNING_ON_BOTH_CORES */ + } +#endif /* if ( LIB_PICO_MULTICORE == 1 ) && ( configSUPPORT_PICO_SYNC_INTEROP == 1 ) */ + +#if ( configNUMBER_OF_CORES > 1 ) + +/* + * See header file for description. + */ + static BaseType_t xPortStartSchedulerOnCore() + { + if( ucPrimaryCoreNum == get_core_num() ) + { + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + #if ( configUSE_DYNAMIC_EXCEPTION_HANDLERS == 1 ) + exception_set_exclusive_handler( SYSTICK_EXCEPTION, xPortSysTickHandler ); + #endif + } + + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + + #if ( configUSE_DYNAMIC_EXCEPTION_HANDLERS == 1 ) + exception_set_exclusive_handler( PENDSV_EXCEPTION, xPortPendSVHandler ); + exception_set_exclusive_handler( SVCALL_EXCEPTION, vPortSVCHandler ); + #endif + + /* Install FIFO handler to receive interrupt from other core */ + multicore_fifo_clear_irq(); + multicore_fifo_drain(); + uint32_t ulIRQNum = SIO_IRQ_PROC0 + get_core_num(); + irq_set_priority( ulIRQNum, portMIN_INTERRUPT_PRIORITY ); + irq_set_exclusive_handler( ulIRQNum, prvFIFOInterruptHandler ); + irq_set_enabled( ulIRQNum, 1 ); + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimisation does not remove the + * symbol. */ + vTaskSwitchContext( portGET_CORE_ID() ); + prvTaskExitError(); + + /* Should not get here! */ + return 0; + } + + #if portRUNNING_ON_BOTH_CORES + static void prvDisableInterruptsAndPortStartSchedulerOnCore( void ) + { + portDISABLE_INTERRUPTS(); + xPortStartSchedulerOnCore(); + } + #endif + +/* + * See header file for description. + */ + BaseType_t xPortStartScheduler( void ) + { + configASSERT( ucPrimaryCoreNum == INVALID_PRIMARY_CORE_NUM ); + + /* No one else should use these! */ + spin_lock_claim( configSMP_SPINLOCK_0 ); + spin_lock_claim( configSMP_SPINLOCK_1 ); + + #if portRUNNING_ON_BOTH_CORES + ucPrimaryCoreNum = configTICK_CORE; + configASSERT( get_core_num() == 0 ); /* we must be started on core 0 */ + multicore_launch_core1( prvDisableInterruptsAndPortStartSchedulerOnCore ); + #else + ucPrimaryCoreNum = get_core_num(); + #endif + xPortStartSchedulerOnCore(); + + /* Should not get here! */ + return 0; + } + +#else /* if ( configNUMBER_OF_CORES > 1 ) */ + +/* + * See header file for description. + */ + BaseType_t xPortStartScheduler( void ) + { + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + #if ( configUSE_DYNAMIC_EXCEPTION_HANDLERS == 1 ) + exception_set_exclusive_handler( PENDSV_EXCEPTION, xPortPendSVHandler ); + exception_set_exclusive_handler( SYSTICK_EXCEPTION, xPortSysTickHandler ); + exception_set_exclusive_handler( SVCALL_EXCEPTION, vPortSVCHandler ); + #endif + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + ucPrimaryCoreNum = get_core_num(); + #if ( LIB_PICO_MULTICORE == 1 ) + #if ( configSUPPORT_PICO_SYNC_INTEROP == 1 ) + multicore_fifo_clear_irq(); + multicore_fifo_drain(); + uint32_t irq_num = 15 + get_core_num(); + irq_set_priority( irq_num, portMIN_INTERRUPT_PRIORITY ); + irq_set_exclusive_handler( irq_num, prvFIFOInterruptHandler ); + irq_set_enabled( irq_num, 1 ); + #endif + #endif + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimisation does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here! */ + return 0; + } +#endif /* if ( configNUMBER_OF_CORES > 1 ) */ + +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. */ + panic_unsupported(); +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ + #if ( configSUPPORT_PICO_SYNC_INTEROP == 1 ) + + /* We are not in an ISR, and pxYieldSpinLock is always dealt with and + * cleared when interrupts are re-enabled, so should be NULL */ + configASSERT( pxYieldSpinLock[ portGET_CORE_ID() ] == NULL ); + #endif /* configSUPPORT_PICO_SYNC_INTEROP */ + + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is completely + * within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} + +/*-----------------------------------------------------------*/ + +#if ( configNUMBER_OF_CORES == 1 ) + void vPortEnterCritical( void ) + { + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); + } +#endif /* #if ( configNUMBER_OF_CORES == 1 ) */ +/*-----------------------------------------------------------*/ + +#if ( configNUMBER_OF_CORES == 1 ) + void vPortExitCritical( void ) + { + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } + } +#endif /* #if ( configNUMBER_OF_CORES == 1 ) */ + +void vPortEnableInterrupts( void ) +{ + #if ( configSUPPORT_PICO_SYNC_INTEROP == 1 ) + int xCoreID = ( int ) portGET_CORE_ID(); + + if( pxYieldSpinLock[ xCoreID ] ) + { + spin_lock_t * const pxTmpLock = pxYieldSpinLock[ xCoreID ]; + pxYieldSpinLock[ xCoreID ] = NULL; + spin_unlock( pxTmpLock, ulYieldSpinLockSaveValue[ xCoreID ] ); + } + #endif + __asm volatile ( " cpsie i " ::: "memory" ); +} + +/*-----------------------------------------------------------*/ + +uint32_t ulSetInterruptMaskFromISR( void ) +{ + __asm volatile ( + " mrs r0, PRIMASK \n" + " cpsid i \n" + " bx lr " + ::: "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vClearInterruptMaskFromISR( __attribute__( ( unused ) ) uint32_t ulMask ) +{ + __asm volatile ( + " msr PRIMASK, r0 \n" + " bx lr " + ::: "memory" + ); +} + +/*-----------------------------------------------------------*/ + +void vYieldCore( int xCoreID ) +{ + /* Remove warning if configASSERT is not defined. + * xCoreID is not used in this function due to this is a dual-core system. The yielding core must be different from the current core. */ + ( void ) xCoreID; + + configASSERT( xCoreID != ( int ) portGET_CORE_ID() ); + + #if portRUNNING_ON_BOTH_CORES + + /* Non blocking, will cause interrupt on other core if the queue isn't already full, + * in which case an IRQ must be pending */ + sio_hw->fifo_wr = 0; + #endif +} + +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + #if ( configNUMBER_OF_CORES == 1 ) + __asm volatile + ( + " .syntax unified \n" + " mrs r0, psp \n" + " \n" + " ldr r3, pxCurrentTCBConst2 \n" /* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " subs r0, r0, #32 \n" /* Make space for the remaining low registers. */ + " str r0, [r2] \n" /* Save the new top of stack. */ + " stmia r0!, {r4-r7} \n" /* Store the low registers that are not saved automatically. */ + " mov r4, r8 \n" /* Store the high registers. */ + " mov r5, r9 \n" + " mov r6, r10 \n" + " mov r7, r11 \n" + " stmia r0!, {r4-r7} \n" + #if portUSE_DIVIDER_SAVE_RESTORE + " movs r2, #0xd \n" /* Store the divider state. */ + " lsls r2, #28 \n" + + /* We expect that the divider is ready at this point (which is + * necessary to safely save/restore), because: + * a) if we have not been interrupted since we entered this method, + * then >8 cycles have clearly passed, so the divider is done + * b) if we were interrupted in the interim, then any "safe" - i.e. + * does the right thing in an IRQ - use of the divider should + * have waited for any in-process divide to complete, saved and + * then fully restored the result, thus the result is ready in + * that case too. */ + " ldr r4, [r2, #0x60] \n" /* SIO_DIV_UDIVIDEND_OFFSET */ + " ldr r5, [r2, #0x64] \n" /* SIO_DIV_UDIVISOR_OFFSET */ + " ldr r6, [r2, #0x74] \n" /* SIO_DIV_REMAINDER_OFFSET */ + " ldr r7, [r2, #0x70] \n" /* SIO_DIV_QUOTIENT_OFFSET */ + + /* We actually save the divider state in the 4 words below + * our recorded stack pointer, so as not to disrupt the stack + * frame expected by debuggers - this is addressed by + * portEXTRA_STACK_SIZE */ + " subs r0, r0, #48 \n" + " stmia r0!, {r4-r7} \n" + #endif /* portUSE_DIVIDER_SAVE_RESTORE */ + " push {r3, r14} \n" + " cpsid i \n" + " bl vTaskSwitchContext \n" + " cpsie i \n" + " pop {r2, r3} \n" /* lr goes in r3. r2 now holds tcb pointer. */ + " \n" + " ldr r1, [r2] \n" + " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " adds r0, r0, #16 \n" /* Move to the high registers. */ + " ldmia r0!, {r4-r7} \n" /* Pop the high registers. */ + " mov r8, r4 \n" + " mov r9, r5 \n" + " mov r10, r6 \n" + " mov r11, r7 \n" + " \n" + " msr psp, r0 \n" /* Remember the new top of stack for the task. */ + " \n" + #if portUSE_DIVIDER_SAVE_RESTORE + " movs r2, #0xd \n" /* Pop the divider state. */ + " lsls r2, #28 \n" + " subs r0, r0, #48 \n" /* Go back for the divider state */ + " ldmia r0!, {r4-r7} \n" /* Pop the divider state. */ + + /* Note always restore via SIO_DIV_UDIVI*, because we will overwrite the + * results stopping the calculation anyway, however the sign of results + * is adjusted by the h/w at read time based on whether the last started + * division was signed and the inputs' signs differed */ + " str r4, [r2, #0x60] \n" /* SIO_DIV_UDIVIDEND_OFFSET */ + " str r5, [r2, #0x64] \n" /* SIO_DIV_UDIVISOR_OFFSET */ + " str r6, [r2, #0x74] \n" /* SIO_DIV_REMAINDER_OFFSET */ + " str r7, [r2, #0x70] \n" /* SIO_DIV_QUOTIENT_OFFSET */ + #else /* if portUSE_DIVIDER_SAVE_RESTORE */ + " subs r0, r0, #32 \n" /* Go back for the low registers that are not automatically restored. */ + #endif /* portUSE_DIVIDER_SAVE_RESTORE */ + " ldmia r0!, {r4-r7} \n" /* Pop low registers. */ + " \n" + " bx r3 \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); + #else /* if ( configNUMBER_OF_CORES == 1 ) */ + __asm volatile + ( + " .syntax unified \n" + " mrs r1, psp \n" + " \n" + " adr r0, ulAsmLocals2 \n" /* Get the location of the current TCB for the current core. */ + " ldmia r0!, {r2, r3} \n" + #if portRUNNING_ON_BOTH_CORES + " ldr r0, [r2] \n" /* r0 = Core number */ + " lsls r0, r0, #2 \n" + " adds r3, r0 \n" /* r3 = &pxCurrentTCBs[get_core_num()] */ + #else + " \n" /* r3 = &pxCurrentTCBs[0] */ + #endif /* portRUNNING_ON_BOTH_CORES */ + " ldr r0, [r3] \n" /* r0 = pxCurrentTCB */ + " \n" + " subs r1, r1, #32 \n" /* Make space for the remaining low registers. */ + " str r1, [r0] \n" /* Save the new top of stack. */ + " stmia r1!, {r4-r7} \n" /* Store the low registers that are not saved automatically. */ + " mov r4, r8 \n" /* Store the high registers. */ + " mov r5, r9 \n" + " mov r6, r10 \n" + " mov r7, r11 \n" + " stmia r1!, {r4-r7} \n" + #if portUSE_DIVIDER_SAVE_RESTORE + + /* We expect that the divider is ready at this point (which is + * necessary to safely save/restore), because: + * a) if we have not been interrupted since we entered this method, + * then >8 cycles have clearly passed, so the divider is done + * b) if we were interrupted in the interim, then any "safe" - i.e. + * does the right thing in an IRQ - use of the divider should + * have waited for any in-process divide to complete, saved and + * then fully restored the result, thus the result is ready in + * that case too. */ + " ldr r4, [r2, #0x60] \n" /* SIO_DIV_UDIVIDEND_OFFSET */ + " ldr r5, [r2, #0x64] \n" /* SIO_DIV_UDIVISOR_OFFSET */ + " ldr r6, [r2, #0x74] \n" /* SIO_DIV_REMAINDER_OFFSET */ + " ldr r7, [r2, #0x70] \n" /* SIO_DIV_QUOTIENT_OFFSET */ + + /* We actually save the divider state in the 4 words below + * our recorded stack pointer, so as not to disrupt the stack + * frame expected by debuggers - this is addressed by + * portEXTRA_STACK_SIZE */ + " subs r1, r1, #48 \n" + " stmia r1!, {r4-r7} \n" + #endif /* portUSE_DIVIDER_SAVE_RESTORE */ + #if portRUNNING_ON_BOTH_CORES + " ldr r0, [r2] \n" /* r0 = Core number */ + #else + " movs r0, #0 \n" + #endif /* portRUNNING_ON_BOTH_CORES */ + " push {r3, r14} \n" + " cpsid i \n" + " bl vTaskSwitchContext \n" + " cpsie i \n" + " pop {r2, r3} \n" /* lr goes in r3. r2 now holds tcb pointer. */ + " \n" + " ldr r1, [r2] \n" + " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " adds r0, r0, #16 \n" /* Move to the high registers. */ + " ldmia r0!, {r4-r7} \n" /* Pop the high registers. */ + " mov r8, r4 \n" + " mov r9, r5 \n" + " mov r10, r6 \n" + " mov r11, r7 \n" + " \n" + " msr psp, r0 \n" /* Remember the new top of stack for the task. */ + " \n" + #if portUSE_DIVIDER_SAVE_RESTORE + " movs r2, #0xd \n" /* Pop the divider state. */ + " lsls r2, #28 \n" + " subs r0, r0, #48 \n" /* Go back for the divider state */ + " ldmia r0!, {r4-r7} \n" /* Pop the divider state. */ + + /* Note always restore via SIO_DIV_UDIVI*, because we will overwrite the + * results stopping the calculation anyway, however the sign of results + * is adjusted by the h/w at read time based on whether the last started + * division was signed and the inputs' signs differed */ + " str r4, [r2, #0x60] \n" /* SIO_DIV_UDIVIDEND_OFFSET */ + " str r5, [r2, #0x64] \n" /* SIO_DIV_UDIVISOR_OFFSET */ + " str r6, [r2, #0x74] \n" /* SIO_DIV_REMAINDER_OFFSET */ + " str r7, [r2, #0x70] \n" /* SIO_DIV_QUOTIENT_OFFSET */ + #else /* if portUSE_DIVIDER_SAVE_RESTORE */ + " subs r0, r0, #32 \n" /* Go back for the low registers that are not automatically restored. */ + #endif /* portUSE_DIVIDER_SAVE_RESTORE */ + " ldmia r0!, {r4-r7} \n" /* Pop low registers. */ + " \n" + " bx r3 \n" + " \n" + " .align 4 \n" + "ulAsmLocals2: \n" + " .word 0xD0000000 \n" /* SIO */ + " .word pxCurrentTCBs \n" + ); + #endif /* if ( configNUMBER_OF_CORES == 1 ) */ +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + uint32_t ulPreviousMask; + + ulPreviousMask = taskENTER_CRITICAL_FROM_ISR(); + traceISR_ENTER(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + traceISR_EXIT_TO_SCHEDULER(); + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + else + { + traceISR_EXIT(); + } + } + taskEXIT_CRITICAL_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( clock_get_hz( clk_sys ) / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR; + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( clock_get_hz( clk_sys ) / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code will execute part way + * through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + * this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + * periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above the cpsid instruction() + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. see comments above + * __disable_interrupt() call above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT ); + + /* Determine if the SysTick clock has already counted to zero and + * been set back to the current reload value (the reload back being + * correct for the entire expected idle time) or if the SysTick is yet + * to count to zero (in which case an interrupt other than the SysTick + * must have brought the system out of sleep mode). */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt is already pending, and the SysTick count + * reloaded with ulReloadValue. Reset the + * portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + * period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + * Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + * again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + * value. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } + +#endif /* configUSE_TICKLESS_IDLE */ + +#if ( configSUPPORT_PICO_SYNC_INTEROP == 1 ) || ( configSUPPORT_PICO_TIME_INTEROP == 1 ) + static TickType_t prvGetTicksToWaitBefore( absolute_time_t t ) + { + int64_t xDelay = absolute_time_diff_us( get_absolute_time(), t ); + const uint32_t ulTickPeriod = 1000000 / configTICK_RATE_HZ; + + xDelay -= ulTickPeriod; + + if( xDelay >= ulTickPeriod ) + { + return xDelay / ulTickPeriod; + } + + return 0; + } +#endif /* if ( configSUPPORT_PICO_SYNC_INTEROP == 1 ) || ( configSUPPORT_PICO_TIME_INTEROP == 1 ) */ + +#if ( configSUPPORT_PICO_SYNC_INTEROP == 1 ) + uint32_t ulPortLockGetCurrentOwnerId() + { + if( portIS_FREE_RTOS_CORE() ) + { + uint32_t exception = __get_current_exception(); + + if( !exception ) + { + return ( uintptr_t ) xTaskGetCurrentTaskHandle(); + } + + /* Note: since ROM as at 0x00000000, these can't be confused with + * valid task handles (pointers) in RAM */ + /* We make all exception handler/core combinations distinct owners */ + return get_core_num() + exception * 2; + } + + /* Note: since ROM as at 0x00000000, this can't be confused with + * valid task handles (pointers) in RAM */ + return get_core_num(); + } + + static inline EventBits_t prvGetEventGroupBit( spin_lock_t * spinLock ) + { + uint32_t ulBit; + + #if ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_16_BITS ) + ulBit = 1u << ( spin_lock_get_num( spinLock ) & 0x7u ); + #elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_32_BITS ) + ulBit = 1u << spin_lock_get_num( spinLock ); + /* reduce to range 0-24 */ + ulBit |= ulBit << 8u; + ulBit >>= 8u; + #endif /* configTICK_TYPE_WIDTH_IN_BITS */ + return ( EventBits_t ) ulBit; + } + + static inline EventBits_t prvGetAllEventGroupBits() + { + #if ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_16_BITS ) + return ( EventBits_t ) 0xffu; + #elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_32_BITS ) + return ( EventBits_t ) 0xffffffu; + #endif /* configTICK_TYPE_WIDTH_IN_BITS */ + } + + void vPortLockInternalSpinUnlockWithWait( struct lock_core * pxLock, + uint32_t ulSave ) + { + configASSERT( !portCHECK_IF_IN_ISR() ); + + /* note no need to check LIB_PICO_MULTICORE, as this is always returns true if that is not defined */ + if( !portIS_FREE_RTOS_CORE() ) + { + spin_unlock( pxLock->spin_lock, ulSave ); + __wfe(); + } + else + { + configASSERT( pxYieldSpinLock[ portGET_CORE_ID() ] == NULL ); + + /* we want to hold the lock until the event bits have been set; since interrupts are currently disabled */ + /* by the spinlock, we can defer until portENABLE_INTERRUPTS is called which is always called when */ + /* the scheduler is unlocked during this call */ + configASSERT( pxLock->spin_lock ); + int xCoreID = ( int ) portGET_CORE_ID(); + pxYieldSpinLock[ xCoreID ] = pxLock->spin_lock; + ulYieldSpinLockSaveValue[ xCoreID ] = ulSave; + xEventGroupWaitBits( xEventGroup, prvGetEventGroupBit( pxLock->spin_lock ), + pdTRUE, pdFALSE, portMAX_DELAY ); + } + } + + void vPortLockInternalSpinUnlockWithNotify( struct lock_core * pxLock, + uint32_t ulSave ) + { + EventBits_t uxBits = prvGetEventGroupBit( pxLock->spin_lock ); + + if( portIS_FREE_RTOS_CORE() ) + { + #if LIB_PICO_MULTICORE + /* signal an event in case a regular core is waiting */ + __sev(); + #endif + spin_unlock( pxLock->spin_lock, ulSave ); + + if( !portCHECK_IF_IN_ISR() ) + { + xEventGroupSetBits( xEventGroup, uxBits ); + } + else + { + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + xEventGroupSetBitsFromISR( xEventGroup, uxBits, &xHigherPriorityTaskWoken ); + portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + } + } + else + { + __sev(); + #if ( portRUNNING_ON_BOTH_CORES == 0 ) + + /* We could sent the bits across the FIFO which would have required us to block here if the FIFO was full, + * or we could have just set all bits on the other side, however it seems reasonable instead to take + * the hit of another spin lock to protect an accurate bit set. */ + if( pxCrossCoreSpinLock != pxLock->spin_lock ) + { + spin_lock_unsafe_blocking( pxCrossCoreSpinLock ); + uxCrossCoreEventBits |= uxBits; + spin_unlock_unsafe( pxCrossCoreSpinLock ); + } + else + { + uxCrossCoreEventBits |= uxBits; + } + + /* This causes fifo irq on the other (FreeRTOS) core which will do the set the event bits */ + sio_hw->fifo_wr = 0; + #endif /* portRUNNING_ON_BOTH_CORES == 0 */ + spin_unlock( pxLock->spin_lock, ulSave ); + } + } + + bool xPortLockInternalSpinUnlockWithBestEffortWaitOrTimeout( struct lock_core * pxLock, + uint32_t ulSave, + absolute_time_t uxUntil ) + { + configASSERT( !portCHECK_IF_IN_ISR() ); + + /* note no need to check LIB_PICO_MULTICORE, as this is always returns true if that is not defined */ + if( !portIS_FREE_RTOS_CORE() ) + { + spin_unlock( pxLock->spin_lock, ulSave ); + return best_effort_wfe_or_timeout( uxUntil ); + } + else + { + configASSERT( portIS_FREE_RTOS_CORE() ); + configASSERT( pxYieldSpinLock[ portGET_CORE_ID() ] == NULL ); + + TickType_t uxTicksToWait = prvGetTicksToWaitBefore( uxUntil ); + + if( uxTicksToWait ) + { + /* We want to hold the lock until the event bits have been set; since interrupts are currently disabled + * by the spinlock, we can defer until portENABLE_INTERRUPTS is called which is always called when + * the scheduler is unlocked during this call */ + configASSERT( pxLock->spin_lock ); + int xCoreID = ( int ) portGET_CORE_ID(); + pxYieldSpinLock[ xCoreID ] = pxLock->spin_lock; + ulYieldSpinLockSaveValue[ xCoreID ] = ulSave; + xEventGroupWaitBits( xEventGroup, + prvGetEventGroupBit( pxLock->spin_lock ), pdTRUE, + pdFALSE, uxTicksToWait ); + } + else + { + spin_unlock( pxLock->spin_lock, ulSave ); + } + + if( time_reached( uxUntil ) ) + { + return true; + } + else + { + /* We do not want to hog the core */ + portYIELD(); + /* We aren't sure if we've reached the timeout yet; the caller will check */ + return false; + } + } + } + + #if ( configSUPPORT_PICO_SYNC_INTEROP == 1 ) + /* runs before main */ + static void __attribute__( ( constructor ) ) prvRuntimeInitializer( void ) + { + /* This must be done even before the scheduler is started, as the spin lock + * is used by the overrides of the SDK wait/notify primitives */ + #if ( portRUNNING_ON_BOTH_CORES == 0 ) + pxCrossCoreSpinLock = spin_lock_instance( next_striped_spin_lock_num() ); + #endif /* portRUNNING_ON_BOTH_CORES */ + + /* The event group is not used prior to scheduler init, but is initialized + * here to since it logically belongs with the spin lock */ + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + xEventGroup = xEventGroupCreateStatic( &xStaticEventGroup ); + #else + + /* Note that it is slightly dubious calling this here before the scheduler is initialized, + * however the only thing it touches is the allocator which then calls vPortEnterCritical + * and vPortExitCritical, and allocating here saves us checking the one time initialized variable in + * some rather critical code paths */ + xEventGroup = xEventGroupCreate(); + #endif /* configSUPPORT_STATIC_ALLOCATION */ + } + #endif /* if ( configSUPPORT_PICO_SYNC_INTEROP == 1 ) */ +#endif /* configSUPPORT_PICO_SYNC_INTEROP */ + +#if ( configSUPPORT_PICO_TIME_INTEROP == 1 ) + void xPortSyncInternalYieldUntilBefore( absolute_time_t t ) + { + TickType_t uxTicksToWait = prvGetTicksToWaitBefore( t ); + + if( uxTicksToWait ) + { + vTaskDelay( uxTicksToWait ); + } + } +#endif /* configSUPPORT_PICO_TIME_INTEROP */ + +#endif /* McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_RP2040 */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/rp2040_portmacro.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/rp2040_portmacro.h new file mode 100644 index 0000000..2634578 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/rp2040_portmacro.h @@ -0,0 +1,298 @@ +/* + * FreeRTOS Kernel V10.4.3 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (c) 2021 Raspberry Pi (Trading) Ltd. + * + * SPDX-License-Identifier: MIT AND BSD-3-Clause + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef RP2040_PORTMACRO_H +#define RP2040_PORTMACRO_H + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +#include "pico.h" +#include "hardware/sync.h" +#include "rp2040_config.h" +#include "FreeRTOSConfig.h" + +void vPortStopTickTimer(void); /* << EST */ +#if 1 /* << EST */ +#define portDISABLE_ALL_INTERRUPTS() __asm volatile("cpsid i") +#define portENABLE_ALL_INTERRUPTS() __asm volatile("cpsie i") +#endif +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef int32_t BaseType_t; +typedef uint32_t UBaseType_t; + +#if ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_16_BITS ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_32_BITS ) + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#else + #error configTICK_TYPE_WIDTH_IN_BITS set to unsupported tick type width. +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portDONT_DISCARD __attribute__( ( used ) ) + +/* We have to use PICO_DIVIDER_DISABLE_INTERRUPTS as the source of truth rathern than our config, + * as our FreeRTOSConfig.h header cannot be included by ASM code - which is what this affects in the SDK */ +#define portUSE_DIVIDER_SAVE_RESTORE !PICO_DIVIDER_DISABLE_INTERRUPTS +#if portUSE_DIVIDER_SAVE_RESTORE + #define portSTACK_LIMIT_PADDING 4 +#endif + +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ +extern void vPortYield( void ); +#define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portYIELD() vPortYield() +#define portEND_SWITCHING_ISR( xSwitchRequired ) \ + do \ + { \ + if( xSwitchRequired ) \ + { \ + traceISR_EXIT_TO_SCHEDULER(); \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + } \ + else \ + { \ + traceISR_EXIT(); \ + } \ + } while( 0 ) +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) + +/*-----------------------------------------------------------*/ + +/* Exception handlers */ +#if ( configUSE_DYNAMIC_EXCEPTION_HANDLERS == 0 ) + /* We only need to override the SDK's weak functions if we want to replace them at compile time */ + #define vPortSVCHandler isr_svcall + #define xPortPendSVHandler isr_pendsv + #define xPortSysTickHandler isr_systick +#endif + +/*-----------------------------------------------------------*/ + +/* Multi-core */ +#define portMAX_CORE_COUNT 2 + +/* Check validity of number of cores specified in config */ +#if ( configNUMBER_OF_CORES < 1 || portMAX_CORE_COUNT < configNUMBER_OF_CORES ) + #error "Invalid number of cores specified in config!" +#endif + +#if ( configTICK_CORE < 0 || configTICK_CORE > configNUMBER_OF_CORES ) + #error "Invalid tick core specified in config!" +#endif +/* FreeRTOS core id is always zero based, so always 0 if we're running on only one core */ +#if configNUMBER_OF_CORES == portMAX_CORE_COUNT + #define portGET_CORE_ID() get_core_num() +#else + #define portGET_CORE_ID() 0 +#endif + +#define portCHECK_IF_IN_ISR() \ + ( { \ + uint32_t ulIPSR; \ + __asm volatile ( "mrs %0, IPSR" : "=r" ( ulIPSR )::); \ + ( ( uint8_t ) ulIPSR ) > 0; } ) + +void vYieldCore( int xCoreID ); +#define portYIELD_CORE( a ) vYieldCore( a ) +#define portRESTORE_INTERRUPTS( ulState ) __asm volatile ( "msr PRIMASK,%0" ::"r" ( ulState ) : ) + +/*-----------------------------------------------------------*/ + +/* Critical nesting count management. */ +extern UBaseType_t uxCriticalNestings[ configNUMBER_OF_CORES ]; +#define portGET_CRITICAL_NESTING_COUNT() ( uxCriticalNestings[ portGET_CORE_ID() ] ) +#define portSET_CRITICAL_NESTING_COUNT( x ) ( uxCriticalNestings[ portGET_CORE_ID() ] = ( x ) ) +#define portINCREMENT_CRITICAL_NESTING_COUNT() ( uxCriticalNestings[ portGET_CORE_ID() ]++ ) +#define portDECREMENT_CRITICAL_NESTING_COUNT() ( uxCriticalNestings[ portGET_CORE_ID() ]-- ) + +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + +#define portSET_INTERRUPT_MASK() \ + ( { \ + uint32_t ulState; \ + __asm volatile ( "mrs %0, PRIMASK" : "=r" ( ulState )::); \ + __asm volatile ( " cpsid i " ::: "memory" ); \ + ulState; } ) + +#define portCLEAR_INTERRUPT_MASK( ulState ) __asm volatile ( "msr PRIMASK,%0" ::"r" ( ulState ) : ) + +extern uint32_t ulSetInterruptMaskFromISR( void ) __attribute__( ( naked ) ); +extern void vClearInterruptMaskFromISR( uint32_t ulMask ) __attribute__( ( naked ) ); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMaskFromISR() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMaskFromISR( x ) + +#define portDISABLE_INTERRUPTS() __asm volatile ( " cpsid i " ::: "memory" ) + +extern void vPortEnableInterrupts(); +#define portENABLE_INTERRUPTS() vPortEnableInterrupts() + +#if ( configNUMBER_OF_CORES == 1 ) + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() +#else + extern void vTaskEnterCritical( void ); + extern void vTaskExitCritical( void ); + extern UBaseType_t vTaskEnterCriticalFromISR( void ); + extern void vTaskExitCriticalFromISR( UBaseType_t uxSavedInterruptStatus ); + #define portENTER_CRITICAL() vTaskEnterCritical() + #define portEXIT_CRITICAL() vTaskExitCritical() + #define portENTER_CRITICAL_FROM_ISR() vTaskEnterCriticalFromISR() + #define portEXIT_CRITICAL_FROM_ISR( x ) vTaskExitCriticalFromISR( x ) +#endif /* if ( configNUMBER_OF_CORES == 1 ) */ + +#define portRTOS_SPINLOCK_COUNT 2 + +/* Note this is a single method with uxAcquire parameter since we have + * static vars, the method is always called with a compile time constant for + * uxAcquire, and the compiler should dothe right thing! */ +static inline void vPortRecursiveLock( uint32_t ulLockNum, + spin_lock_t * pxSpinLock, + BaseType_t uxAcquire ) +{ + static uint8_t ucOwnedByCore[ portMAX_CORE_COUNT ]; + static uint8_t ucRecursionCountByLock[ portRTOS_SPINLOCK_COUNT ]; + + configASSERT( ulLockNum < portRTOS_SPINLOCK_COUNT ); + uint32_t ulCoreNum = get_core_num(); + uint32_t ulLockBit = 1u << ulLockNum; + configASSERT( ulLockBit < 256u ); + + if( uxAcquire ) + { + if( __builtin_expect( !*pxSpinLock, 0 ) ) + { + if( ucOwnedByCore[ ulCoreNum ] & ulLockBit ) + { + configASSERT( ucRecursionCountByLock[ ulLockNum ] != 255u ); + ucRecursionCountByLock[ ulLockNum ]++; + return; + } + + while( __builtin_expect( !*pxSpinLock, 0 ) ) + { + } + } + + __mem_fence_acquire(); + configASSERT( ucRecursionCountByLock[ ulLockNum ] == 0 ); + ucRecursionCountByLock[ ulLockNum ] = 1; + ucOwnedByCore[ ulCoreNum ] |= ulLockBit; + } + else + { + configASSERT( ( ucOwnedByCore[ ulCoreNum ] & ulLockBit ) != 0 ); + configASSERT( ucRecursionCountByLock[ ulLockNum ] != 0 ); + + if( !--ucRecursionCountByLock[ ulLockNum ] ) + { + ucOwnedByCore[ ulCoreNum ] &= ~ulLockBit; + __mem_fence_release(); + *pxSpinLock = 1; + } + } +} + +#if ( configNUMBER_OF_CORES == 1 ) + #define portGET_ISR_LOCK() + #define portRELEASE_ISR_LOCK() + #define portGET_TASK_LOCK() + #define portRELEASE_TASK_LOCK() +#else + #define portGET_ISR_LOCK() vPortRecursiveLock( 0, spin_lock_instance( configSMP_SPINLOCK_0 ), pdTRUE ) + #define portRELEASE_ISR_LOCK() vPortRecursiveLock( 0, spin_lock_instance( configSMP_SPINLOCK_0 ), pdFALSE ) + #define portGET_TASK_LOCK() vPortRecursiveLock( 1, spin_lock_instance( configSMP_SPINLOCK_1 ), pdTRUE ) + #define portRELEASE_TASK_LOCK() vPortRecursiveLock( 1, spin_lock_instance( configSMP_SPINLOCK_1 ), pdFALSE ) +#endif + +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) +#endif +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +#define portNOP() + +#define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* PORTMACRO_H */ diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/rp2040_sdk_config.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/rp2040_sdk_config.h new file mode 100644 index 0000000..c9f7925 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F/rp2040_sdk_config.h @@ -0,0 +1,77 @@ +/* + * FreeRTOS Kernel V10.4.3 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (c) 2021 Raspberry Pi (Trading) Ltd. + * + * SPDX-License-Identifier: BSD-3-Clause + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + */ + +#ifndef FREERTOS_RP2040_SDK_CONFIG_H +#define FREERTOS_RP2040_SDK_CONFIG_H + +#ifndef __ASSEMBLER__ + #include "FreeRTOSConfig.h" + #include "rp2040_config.h" + #ifndef PICO_USE_MALLOC_MUTEX + /* malloc needs to be made thread safe */ + #define PICO_USE_MALLOC_MUTEX 1 + #endif /* PICO_USE_MALLOC_MUTEX */ + #if ( configSUPPORT_PICO_SYNC_INTEROP == 1 ) + /* increase the amount of time it may reasonably take to wake us up */ + #ifndef PICO_TIME_SLEEP_OVERHEAD_ADJUST_US + #define PICO_TIME_SLEEP_OVERHEAD_ADJUST_US 150 + #endif + + #define lock_owner_id_t uint32_t + extern uint32_t ulPortLockGetCurrentOwnerId( void ); + #define lock_get_caller_owner_id() ulPortLockGetCurrentOwnerId() + #define LOCK_INVALID_OWNER_ID ( ( uint32_t ) -1 ) + + struct lock_core; + #ifndef lock_internal_spin_unlock_with_wait + extern void vPortLockInternalSpinUnlockWithWait( struct lock_core * pxLock, + uint32_t ulSave ); + #define lock_internal_spin_unlock_with_wait( lock, save ) vPortLockInternalSpinUnlockWithWait( lock, save ) + #endif + + #ifndef lock_internal_spin_unlock_with_notify + extern void vPortLockInternalSpinUnlockWithNotify( struct lock_core * pxLock, + uint32_t save ); + #define lock_internal_spin_unlock_with_notify( lock, save ) vPortLockInternalSpinUnlockWithNotify( lock, save ); + #endif + + #ifndef lock_internal_spin_unlock_with_best_effort_wait_or_timeout + extern bool xPortLockInternalSpinUnlockWithBestEffortWaitOrTimeout( struct lock_core * pxLock, + uint32_t ulSave, + absolute_time_t uxUntil ); + #define lock_internal_spin_unlock_with_best_effort_wait_or_timeout( lock, save, until ) \ + xPortLockInternalSpinUnlockWithBestEffortWaitOrTimeout( lock, save, until ) + #endif + #endif /* configSUPPORT_PICO_SYNC_INTEROP */ + + #if ( configSUPPORT_PICO_TIME_INTEROP == 1 ) + extern void xPortSyncInternalYieldUntilBefore( absolute_time_t t ); + #define sync_internal_yield_until_before( t ) xPortSyncInternalYieldUntilBefore( t ) + #endif /* configSUPPORT_PICO_TIME_INTEROP */ +#endif /* __ASSEMBLER__ */ +#endif /* ifndef FREERTOS_RP2040_SDK_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/RISC-V/Documentation.url b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/RISC-V/Documentation.url new file mode 100644 index 0000000..6d32fd8 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/RISC-V/Documentation.url @@ -0,0 +1,5 @@ +[{000214A0-0000-0000-C000-000000000046}] +Prop3=19,11 +[InternetShortcut] +IDList= +URL=https://freertos.org/Using-FreeRTOS-on-RISC-V.html diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/RISC-V/freertos_risc_v_chip_specific_extensions.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/RISC-V/freertos_risc_v_chip_specific_extensions.h new file mode 100644 index 0000000..09eed1c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/RISC-V/freertos_risc_v_chip_specific_extensions.h @@ -0,0 +1,111 @@ +/* + * FreeRTOS Kernel V10.2.0 + * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and t + + o permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +/* + * The FreeRTOS kernel's RISC-V port is split between the the code that is + * common across all currently supported RISC-V chips (implementations of the + * RISC-V ISA), and code that tailors the port to a specific RISC-V chip: + * + * + FreeRTOS\Source\portable\GCC\RISC-V-RV32\portASM.S contains the code that + * is common to all currently supported RISC-V chips. There is only one + * portASM.S file because the same file is built for all RISC-V target chips. + * + * + Header files called freertos_risc_v_chip_specific_extensions.h contain the + * code that tailors the FreeRTOS kernel's RISC-V port to a specific RISC-V + * chip. There are multiple freertos_risc_v_chip_specific_extensions.h files + * as there are multiple RISC-V chip implementations. + * + * !!!NOTE!!! + * TAKE CARE TO INCLUDE THE CORRECT freertos_risc_v_chip_specific_extensions.h + * HEADER FILE FOR THE CHIP IN USE. This is done using the assembler's (not the + * compiler's!) include path. For example, if the chip in use includes a core + * local interrupter (CLINT) and does not include any chip specific register + * extensions then add the path below to the assembler's include path: + * FreeRTOS\Source\portable\GCC\RISC-V-RV32\chip_specific_extensions\RV32I_CLINT_no_extensions + * + */ + +/* + * This freertos_risc_v_chip_specific_extensions.h is for use with Pulpino Ri5cy + * devices, developed and tested using the Vega board RV32M1RM. + */ + +#ifndef __FREERTOS_RISC_V_EXTENSIONS_H__ +#define __FREERTOS_RISC_V_EXTENSIONS_H__ + +#define portasmHAS_CLINT 0 + +#define portasmHANDLE_INTERRUPT SystemIrqHandler /* << EST */ + +/* Constants to define the additional registers found on the Pulpino RI5KY. */ +#define lpstart0 0x7b0 +#define lpend0 0x7b1 +#define lpcount0 0x7b2 +#define lpstart1 0x7b4 +#define lpend1 0x7b5 +#define lpcount1 0x7b6 + +/* Six additional registers to save and restore, as per the #defines above. */ +#define portasmADDITIONAL_CONTEXT_SIZE 6 /* Must be even number on 32-bit cores. */ + +/* Save additional registers found on the Pulpino. */ +.macro portasmSAVE_ADDITIONAL_REGISTERS + addi sp, sp, -(portasmADDITIONAL_CONTEXT_SIZE * portWORD_SIZE) /* Make room for the additional registers. */ + csrr t0, lpstart0 /* Load additional registers into accessable temporary registers. */ + csrr t1, lpend0 + csrr t2, lpcount0 + csrr t3, lpstart1 + csrr t4, lpend1 + csrr t5, lpcount1 + sw t0, 1 * portWORD_SIZE( sp ) + sw t1, 2 * portWORD_SIZE( sp ) + sw t2, 3 * portWORD_SIZE( sp ) + sw t3, 4 * portWORD_SIZE( sp ) + sw t4, 5 * portWORD_SIZE( sp ) + sw t5, 6 * portWORD_SIZE( sp ) + .endm + +/* Restore the additional registers found on the Pulpino. */ +.macro portasmRESTORE_ADDITIONAL_REGISTERS + lw t0, 1 * portWORD_SIZE( sp ) /* Load additional registers into accessable temporary registers. */ + lw t1, 2 * portWORD_SIZE( sp ) + lw t2, 3 * portWORD_SIZE( sp ) + lw t3, 4 * portWORD_SIZE( sp ) + lw t4, 5 * portWORD_SIZE( sp ) + lw t5, 6 * portWORD_SIZE( sp ) + csrw lpstart0, t0 + csrw lpend0, t1 + csrw lpcount0, t2 + csrw lpstart1, t3 + csrw lpend1, t4 + csrw lpcount1, t5 + addi sp, sp, (portasmADDITIONAL_CONTEXT_SIZE * portWORD_SIZE )/* Remove space added for additional registers. */ + .endm + +#endif /* __FREERTOS_RISC_V_EXTENSIONS_H__ */ diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/RISC-V/port.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/RISC-V/port.c new file mode 100644 index 0000000..72c81c5 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/RISC-V/port.c @@ -0,0 +1,250 @@ +/* + * FreeRTOS Kernel V10.2.0 + * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the RISC-V RV32 port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "portmacro.h" + +#ifndef configCLINT_BASE_ADDRESS + #warning configCLINT_BASE_ADDRESS must be defined in FreeRTOSConfig.h. If the target chip includes a Core Local Interrupter (CLINT) then set configCLINT_BASE_ADDRESS to the CLINT base address. Otherwise set configCLINT_BASE_ADDRESS to 0. +#endif + +/* Let the user override the pre-loading of the initial LR with the address of +prvTaskExitError() in case it messes up unwinding of the stack in the +debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* The stack used by interrupt service routines. Set configISR_STACK_SIZE_WORDS +to use a statically allocated array as the interrupt stack. Alternative leave +configISR_STACK_SIZE_WORDS undefined and update the linker script so that a +linker variable names __freertos_irq_stack_top has the same value as the top +of the stack used by main. Using the linker script method will repurpose the +stack that was used by main before the scheduler was started for use as the +interrupt stack after the scheduler has started. */ +#ifdef configISR_STACK_SIZE_WORDS + static __attribute__ ((aligned(16))) StackType_t xISRStack[ configISR_STACK_SIZE_WORDS ] = { 0 }; + const StackType_t xISRStackTop = ( StackType_t ) &( xISRStack[ ( configISR_STACK_SIZE_WORDS & ~portBYTE_ALIGNMENT_MASK ) - 1 ] ); +#else + extern const uint32_t __freertos_irq_stack_top[]; + const StackType_t xISRStackTop = ( StackType_t ) __freertos_irq_stack_top; +#endif + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ) __attribute__(( weak )); + +/*-----------------------------------------------------------*/ + +/* Used to program the machine timer compare register. */ +uint64_t ullNextTime = 0ULL; +const uint64_t *pullNextTime = &ullNextTime; +#if 0 /* << EST */ +const uint32_t ulTimerIncrementsForOneTick = ( uint32_t ) ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ); /* Assumes increment won't go over 32-bits. */ +#else +static uint32_t ulTimerIncrementsForOneTick; +#endif +volatile uint64_t * const pullMachineTimerCompareRegister = ( volatile uint64_t * const ) ( configCLINT_BASE_ADDRESS + 0x4000 ); + +/* Set configCHECK_FOR_STACK_OVERFLOW to 3 to add ISR stack checking to task +stack checking. A problem in the ISR stack will trigger an assert, not call the +stack overflow hook function (because the stack overflow hook is specific to a +task stack, not the ISR stack). */ +#if( configCHECK_FOR_STACK_OVERFLOW > 2 ) + #warning This path not tested, or even compiled yet. + /* Don't use 0xa5 as the stack fill bytes as that is used by the kernerl for + the task stacks, and so will legitimately appear in many positions within + the ISR stack. */ + #define portISR_STACK_FILL_BYTE 0xee + + static const uint8_t ucExpectedStackBytes[] = { + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE }; \ + + #define portCHECK_ISR_STACK() configASSERT( ( memcmp( ( void * ) xISRStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) == 0 ) ) +#else + /* Define the function away. */ + #define portCHECK_ISR_STACK() +#endif /* configCHECK_FOR_STACK_OVERFLOW > 2 */ + +/*-----------------------------------------------------------*/ + +#if( configCLINT_BASE_ADDRESS != 0 ) + + void vPortSetupTimerInterrupt( void ) + { + uint32_t ulCurrentTimeHigh, ulCurrentTimeLow; + volatile uint32_t * const pulTimeHigh = ( volatile uint32_t * const ) ( configCLINT_BASE_ADDRESS + 0xBFFC ); + volatile uint32_t * const pulTimeLow = ( volatile uint32_t * const ) ( configCLINT_BASE_ADDRESS + 0xBFF8 ); + + do + { + ulCurrentTimeHigh = *pulTimeHigh; + ulCurrentTimeLow = *pulTimeLow; + } while( ulCurrentTimeHigh != *pulTimeHigh ); + + ullNextTime = ( uint64_t ) ulCurrentTimeHigh; + ullNextTime <<= 32ULL; + ullNextTime |= ( uint64_t ) ulCurrentTimeLow; + ullNextTime += ( uint64_t ) ulTimerIncrementsForOneTick; + *pullMachineTimerCompareRegister = ullNextTime; + + /* Prepare the time to use after the next tick interrupt. */ + ullNextTime += ( uint64_t ) ulTimerIncrementsForOneTick; + } + +#endif /* ( configCLINT_BASE_ADDRESS != 0 ) */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void xPortStartFirstTask( void ); +#if 1 /* << EST */ + ulTimerIncrementsForOneTick = ( uint32_t ) ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ); /* Assumes increment won't go over 32-bits. */ +#endif + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t mtvec = 0; + + /* Check the least significant two bits of mtvec are 00 - indicating + single vector mode. */ + __asm volatile( "csrr %0, mtvec" : "=r"( mtvec ) ); + configASSERT( ( mtvec & 0x03UL ) == 0 ); + + /* Check alignment of the interrupt stack - which is the same as the + stack that was being used by main() prior to the scheduler being + started. */ + configASSERT( ( xISRStackTop & portBYTE_ALIGNMENT_MASK ) == 0 ); + } + #endif /* configASSERT_DEFINED */ + + /* If there is a CLINT then it is ok to use the default implementation + in this file, otherwise vPortSetupTimerInterrupt() must be implemented to + configure whichever clock is to be used to generate the tick interrupt. */ + vPortSetupTimerInterrupt(); + + #if( configCLINT_BASE_ADDRESS != 0 ) + { + /* Enable mtime and external interrupts. 1<<7 for timer interrupt, 1<<11 + for external interrupt. _RB_ What happens here when mtime is not present as + with pulpino? */ + __asm volatile( "csrs mie, %0" :: "r"(0x880) ); + } + #else + { + /* Enable external interrupts. */ + __asm volatile( "csrs mie, %0" :: "r"(0x800) ); + } + #endif /* configCLINT_BASE_ADDRESS */ + + xPortStartFirstTask(); + + /* Should not get here as after calling xPortStartFirstTask() only tasks + should be executing. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented. */ + for( ;; ); +} + +/* << EST Begin .... */ +/*-----------------------------------------------------------*/ +//static void vPortStartTickTimer(void) { + //ENABLE_TICK_COUNTER(); +//} +/*-----------------------------------------------------------*/ +void vPortStopTickTimer(void) { + //DISABLE_TICK_COUNTER(); +} +/*-----------------------------------------------------------*/ +#include "fsl_clock.h" + +/* At the time of writing, interrupt nesting is not supported, so do not use +the default SystemIrqHandler() implementation as that enables interrupts. A +version that does not enable interrupts is provided below. THIS INTERRUPT +HANDLER IS SPECIFIC TO THE VEGA BOARD WHICH DOES NOT INCLUDE A CLINT! */ +void SystemIrqHandler(uint32_t mcause) { + uint32_t ulInterruptNumber; + typedef void ( * irq_handler_t )( void ); + extern const irq_handler_t isrTable[]; + + ulInterruptNumber = mcause & 0x1FUL; + + /* Clear pending flag in EVENT unit .*/ + EVENT_UNIT->INTPTPENDCLEAR = ( 1U << ulInterruptNumber ); + + /* Read back to make sure write finished. */ + (void)(EVENT_UNIT->INTPTPENDCLEAR); + + /* Now call the real irq handler for ulInterruptNumber */ + isrTable[ ulInterruptNumber ](); +} +/*-----------------------------------------------------------*/ +void vPortSetupTimerInterrupt( void ) { + //extern void SystemSetupSystick(uint32_t tickRateHz, uint32_t intPriority ); + + /* No CLINT so use the LPIT (Low Power Interrupt Timer) to generate the tick interrupt. */ + CLOCK_SetIpSrc(kCLOCK_Lpit0, kCLOCK_IpSrcFircAsync); + SystemSetupSystick(configTICK_RATE_HZ, configKERNEL_INTERRUPT_PRIORITY-1); +} + +/*-----------------------------------------------------------*/ +void LPIT0_IRQHandler(void) { + //BaseType_t xTaskIncrementTick( void ); + //void vTaskSwitchContext( void ); + #warning "requires critical section if interrpt nesting is used." + + /* vPortSetupTimerInterrupt() uses LPIT0 to generate the tick interrupt. */ + if(xTaskIncrementTick() != 0) { + vTaskSwitchContext(); + } + LPIT0->MSR = 1U; /* Clear LPIT0 interrupt flag. */ +} +/*-----------------------------------------------------------*/ + +/* << EST End */ + + + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/RISC-V/portASM.S b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/RISC-V/portASM.S new file mode 100644 index 0000000..1b1645f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/RISC-V/portASM.S @@ -0,0 +1,396 @@ +/* + * FreeRTOS Kernel V10.2.0 + * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +#if __riscv_xlen == 64 + #error Not implemented yet - change lw to ld, and sw to sd. + #define portWORD_SIZE 8 +#elif __riscv_xlen == 32 + #define portWORD_SIZE 4 +#else + #error Assembler did not define __riscv_xlen +#endif + +/* + * The FreeRTOS kernel's RISC-V port is split between the the code that is + * common across all currently supported RISC-V chips (implementations of the + * RISC-V ISA), and code which tailors the port to a specific RISC-V chip: + * + * + The code that is common to all RISC-V chips is implemented in + * FreeRTOS\Source\portable\GCC\RISC-V-RV32\portASM.S. There is only one + * portASM.S file because the same file is used no matter which RISC-V chip is + * in use. + * + * + The code that tailors the kernel's RISC-V port to a specific RISC-V + * chip is implemented in freertos_risc_v_chip_specific_extensions.h. There + * is one freertos_risc_v_chip_specific_extensions.h that can be used with any + * RISC-V chip that both includes a standard CLINT and does not add to the + * base set of RISC-V registers. There are additional + * freertos_risc_v_chip_specific_extensions.h files for RISC-V implementations + * that do not include a standard CLINT or do add to the base set of RISC-V + * registers. + * + * CARE MUST BE TAKEN TO INCLDUE THE CORRECT + * freertos_risc_v_chip_specific_extensions.h HEADER FILE FOR THE CHIP + * IN USE. To include the correct freertos_risc_v_chip_specific_extensions.h + * header file ensure the path to the correct header file is in the assembler's + * include path. + * + * This freertos_risc_v_chip_specific_extensions.h is for use on RISC-V chips + * that include a standard CLINT and do not add to the base set of RISC-V + * registers. + * + */ +#include "freertos_risc_v_chip_specific_extensions.h" + +/* Check the freertos_risc_v_chip_specific_extensions.h and/or command line +definitions. */ +#ifndef portasmHAS_CLINT + #error freertos_risc_v_chip_specific_extensions.h must define portasmHAS_CLINT to either 1 (CLINT present) or 0 (clint not present). +#endif + +#ifndef portasmHANDLE_INTERRUPT + #error portasmHANDLE_INTERRUPT must be defined to the function to be called to handle external/peripheral interrupts. portasmHANDLE_INTERRUPT can be defined on the assmbler command line or in the appropriate freertos_risc_v_chip_specific_extensions.h header file. +#endif + +/* Only the standard core registers are stored by default. Any additional +registers must be saved by the portasmSAVE_ADDITIONAL_REGISTERS and +portasmRESTORE_ADDITIONAL_REGISTERS macros - which can be defined in a chip +specific version of freertos_risc_v_chip_specific_extensions.h. See the notes +at the top of this file. */ +#define portCONTEXT_SIZE ( 30 * portWORD_SIZE ) + +.global xPortStartFirstTask +.global freertos_risc_v_trap_handler +.global pxPortInitialiseStack +.extern pxCurrentTCB +.extern ulPortTrapHandler +.extern vTaskSwitchContext +.extern Timer_IRQHandler +.extern pullMachineTimerCompareRegister +.extern pullNextTime +.extern ulTimerIncrementsForOneTick +.extern xISRStackTop + +/*-----------------------------------------------------------*/ + +.align 8 +.func +freertos_risc_v_trap_handler: + addi sp, sp, -portCONTEXT_SIZE + sw x1, 1 * portWORD_SIZE( sp ) + sw x5, 2 * portWORD_SIZE( sp ) + sw x6, 3 * portWORD_SIZE( sp ) + sw x7, 4 * portWORD_SIZE( sp ) + sw x8, 5 * portWORD_SIZE( sp ) + sw x9, 6 * portWORD_SIZE( sp ) + sw x10, 7 * portWORD_SIZE( sp ) + sw x11, 8 * portWORD_SIZE( sp ) + sw x12, 9 * portWORD_SIZE( sp ) + sw x13, 10 * portWORD_SIZE( sp ) + sw x14, 11 * portWORD_SIZE( sp ) + sw x15, 12 * portWORD_SIZE( sp ) + sw x16, 13 * portWORD_SIZE( sp ) + sw x17, 14 * portWORD_SIZE( sp ) + sw x18, 15 * portWORD_SIZE( sp ) + sw x19, 16 * portWORD_SIZE( sp ) + sw x20, 17 * portWORD_SIZE( sp ) + sw x21, 18 * portWORD_SIZE( sp ) + sw x22, 19 * portWORD_SIZE( sp ) + sw x23, 20 * portWORD_SIZE( sp ) + sw x24, 21 * portWORD_SIZE( sp ) + sw x25, 22 * portWORD_SIZE( sp ) + sw x26, 23 * portWORD_SIZE( sp ) + sw x27, 24 * portWORD_SIZE( sp ) + sw x28, 25 * portWORD_SIZE( sp ) + sw x29, 26 * portWORD_SIZE( sp ) + sw x30, 27 * portWORD_SIZE( sp ) + sw x31, 28 * portWORD_SIZE( sp ) + + csrr t0, mstatus /* Required for MPIE bit. */ + sw t0, 29 * portWORD_SIZE( sp ) + + portasmSAVE_ADDITIONAL_REGISTERS /* Defined in freertos_risc_v_chip_specific_extensions.h to save any registers unique to the RISC-V implementation. */ + + lw t0, pxCurrentTCB /* Load pxCurrentTCB. */ + sw sp, 0( t0 ) /* Write sp to first TCB member. */ + + csrr a0, mcause + csrr a1, mepc + +test_if_asynchronous: + srli a2, a0, 0x1f /* MSB of mcause is 1 if handing an asynchronous interrupt - shift to LSB to clear other bits. */ + beq a2, x0, handle_synchronous /* Branch past interrupt handing if not asynchronous. */ + sw a1, 0( sp ) /* Asynch so save unmodified exception return address. */ + +handle_asynchronous: + +#if( portasmHAS_CLINT != 0 ) + + test_if_mtimer: /* If there is a CLINT then the mtimer is used to generate the tick interrupt. */ + lui t0, 0x80000 + addi t1, t0, 7 /* 0x80000007 == machine timer interrupt. */ + bne a0, t1, test_if_external_interrupt + + lw t0, pullMachineTimerCompareRegister /* Load address of compare register into t0. */ + lw t1, pullNextTime /* Load the address of ullNextTime into t1. */ + lw t2, 0(t1) /* Load the low word of ullNextTime into t2. */ + lw t3, 4(t1) /* Load the high word of ullNextTime into t3. */ + sw t2, 0(t0) /* Store low word of ullNextTime into compare register. */ + sw t3, 4(t0) /* Store high word of ullNextTime into compare register. */ + lw t0, ulTimerIncrementsForOneTick /* Load the value of ullTimerIncrementForOneTick into t0 (could this be optimized by storing in an array next to pullNextTime?). */ + add t4, t0, t2 /* Add the low word of ullNextTime to the timer increments for one tick (assumes timer increment for one tick fits in 32-bits. */ + sltu t5, t4, t2 /* See if the sum of low words overflowed (what about the zero case?). */ + add t6, t3, t5 /* Add overflow to high word of ullNextTime. */ + sw t4, 0(t1) /* Store new low word of ullNextTime. */ + sw t6, 4(t1) /* Store new high word of ullNextTime. */ + lw sp, xISRStackTop /* Switch to ISR stack before function call. */ + jal xTaskIncrementTick + beqz a0, processed_source /* Don't switch context if incrementing tick didn't unblock a task. */ + jal vTaskSwitchContext + j processed_source + + test_if_external_interrupt: /* If there is a CLINT and the mtimer interrupt is not pending then check to see if an external interrupt is pending. */ + addi t1, t1, 4 /* 0x80000007 + 4 = 0x8000000b == Machine external interrupt. */ + bne a0, t1, as_yet_unhandled /* Something as yet unhandled. */ + +#endif /* portasmHAS_CLINT */ + + lw sp, xISRStackTop /* Switch to ISR stack before function call. */ + jal portasmHANDLE_INTERRUPT /* Jump to the interrupt handler if there is no CLINT or if there is a CLINT and it has been determined that an external interrupt is pending. */ + j processed_source + +handle_synchronous: + addi a1, a1, 4 /* Synchronous so updated exception return address to the instruction after the instruction that generated the exeption. */ + sw a1, 0( sp ) /* Save updated exception return address. */ + +test_if_environment_call: + li t0, 11 /* 11 == environment call. */ + bne a0, t0, is_exception /* Not an M environment call, so some other exception. */ + lw sp, xISRStackTop /* Switch to ISR stack before function call. */ + jal vTaskSwitchContext + j processed_source + +is_exception: + ebreak + j is_exception + +as_yet_unhandled: + ebreak + j as_yet_unhandled + +processed_source: + lw sp, pxCurrentTCB /* Load pxCurrentTCB. */ + lw sp, 0( sp ) /* Read sp from first TCB member. */ + + /* Load mret with the address of the next instruction in the task to run next. */ + lw t0, 0( sp ) + csrw mepc, t0 + + portasmRESTORE_ADDITIONAL_REGISTERS /* Defined in freertos_risc_v_chip_specific_extensions.h to restore any registers unique to the RISC-V implementation. */ + + /* Load mstatus with the interrupt enable bits used by the task. */ + lw t0, 29 * portWORD_SIZE( sp ) + csrw mstatus, t0 /* Required for MPIE bit. */ + + lw x1, 1 * portWORD_SIZE( sp ) + lw x5, 2 * portWORD_SIZE( sp ) /* t0 */ + lw x6, 3 * portWORD_SIZE( sp ) /* t1 */ + lw x7, 4 * portWORD_SIZE( sp ) /* t2 */ + lw x8, 5 * portWORD_SIZE( sp ) /* s0/fp */ + lw x9, 6 * portWORD_SIZE( sp ) /* s1 */ + lw x10, 7 * portWORD_SIZE( sp ) /* a0 */ + lw x11, 8 * portWORD_SIZE( sp ) /* a1 */ + lw x12, 9 * portWORD_SIZE( sp ) /* a2 */ + lw x13, 10 * portWORD_SIZE( sp ) /* a3 */ + lw x14, 11 * portWORD_SIZE( sp ) /* a4 */ + lw x15, 12 * portWORD_SIZE( sp ) /* a5 */ + lw x16, 13 * portWORD_SIZE( sp ) /* a6 */ + lw x17, 14 * portWORD_SIZE( sp ) /* a7 */ + lw x18, 15 * portWORD_SIZE( sp ) /* s2 */ + lw x19, 16 * portWORD_SIZE( sp ) /* s3 */ + lw x20, 17 * portWORD_SIZE( sp ) /* s4 */ + lw x21, 18 * portWORD_SIZE( sp ) /* s5 */ + lw x22, 19 * portWORD_SIZE( sp ) /* s6 */ + lw x23, 20 * portWORD_SIZE( sp ) /* s7 */ + lw x24, 21 * portWORD_SIZE( sp ) /* s8 */ + lw x25, 22 * portWORD_SIZE( sp ) /* s9 */ + lw x26, 23 * portWORD_SIZE( sp ) /* s10 */ + lw x27, 24 * portWORD_SIZE( sp ) /* s11 */ + lw x28, 25 * portWORD_SIZE( sp ) /* t3 */ + lw x29, 26 * portWORD_SIZE( sp ) /* t4 */ + lw x30, 27 * portWORD_SIZE( sp ) /* t5 */ + lw x31, 28 * portWORD_SIZE( sp ) /* t6 */ + addi sp, sp, portCONTEXT_SIZE + + mret + .endfunc +/*-----------------------------------------------------------*/ + +.align 8 +.func +xPortStartFirstTask: + +#if( portasmHAS_CLINT != 0 ) + /* If there is a clint then interrupts can branch directly to the FreeRTOS + trap handler. Otherwise the interrupt controller will need to be configured + outside of this file. */ + la t0, freertos_risc_v_trap_handler + csrw mtvec, t0 +#endif /* portasmHAS_CLILNT */ + + lw sp, pxCurrentTCB /* Load pxCurrentTCB. */ + lw sp, 0( sp ) /* Read sp from first TCB member. */ + + lw x1, 0( sp ) /* Note for starting the scheduler the exception return address is used as the function return address. */ + + portasmRESTORE_ADDITIONAL_REGISTERS /* Defined in freertos_risc_v_chip_specific_extensions.h to restore any registers unique to the RISC-V implementation. */ + + lw t0, 29 * portWORD_SIZE( sp ) /* mstatus */ + csrrw x0, mstatus, t0 /* Interrupts enabled from here! */ + + lw x5, 2 * portWORD_SIZE( sp ) /* t0 */ + lw x6, 3 * portWORD_SIZE( sp ) /* t1 */ + lw x7, 4 * portWORD_SIZE( sp ) /* t2 */ + lw x8, 5 * portWORD_SIZE( sp ) /* s0/fp */ + lw x9, 6 * portWORD_SIZE( sp ) /* s1 */ + lw x10, 7 * portWORD_SIZE( sp ) /* a0 */ + lw x11, 8 * portWORD_SIZE( sp ) /* a1 */ + lw x12, 9 * portWORD_SIZE( sp ) /* a2 */ + lw x13, 10 * portWORD_SIZE( sp ) /* a3 */ + lw x14, 11 * portWORD_SIZE( sp ) /* a4 */ + lw x15, 12 * portWORD_SIZE( sp ) /* a5 */ + lw x16, 13 * portWORD_SIZE( sp ) /* a6 */ + lw x17, 14 * portWORD_SIZE( sp ) /* a7 */ + lw x18, 15 * portWORD_SIZE( sp ) /* s2 */ + lw x19, 16 * portWORD_SIZE( sp ) /* s3 */ + lw x20, 17 * portWORD_SIZE( sp ) /* s4 */ + lw x21, 18 * portWORD_SIZE( sp ) /* s5 */ + lw x22, 19 * portWORD_SIZE( sp ) /* s6 */ + lw x23, 20 * portWORD_SIZE( sp ) /* s7 */ + lw x24, 21 * portWORD_SIZE( sp ) /* s8 */ + lw x25, 22 * portWORD_SIZE( sp ) /* s9 */ + lw x26, 23 * portWORD_SIZE( sp ) /* s10 */ + lw x27, 24 * portWORD_SIZE( sp ) /* s11 */ + lw x28, 25 * portWORD_SIZE( sp ) /* t3 */ + lw x29, 26 * portWORD_SIZE( sp ) /* t4 */ + lw x30, 27 * portWORD_SIZE( sp ) /* t5 */ + lw x31, 28 * portWORD_SIZE( sp ) /* t6 */ + addi sp, sp, portCONTEXT_SIZE + ret + .endfunc +/*-----------------------------------------------------------*/ + +/* + * Unlike other ports pxPortInitialiseStack() is written in assembly code as it + * needs access to the portasmADDITIONAL_CONTEXT_SIZE constant. The prototype + * for the function is as per the other ports: + * StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ); + * + * As per the standard RISC-V ABI pxTopcOfStack is passed in in a0, pxCode in + * a1, and pvParameters in a2. The new top of stack is passed out in a0. + * + * RISC-V maps registers to ABI names as follows (X1 to X31 integer registers + * for the 'I' profile, X1 to X15 for the 'E' profile, currently I assumed). + * + * Register ABI Name Description Saver + * x0 zero Hard-wired zero - + * x1 ra Return address Caller + * x2 sp Stack pointer Callee + * x3 gp Global pointer - + * x4 tp Thread pointer - + * x5-7 t0-2 Temporaries Caller + * x8 s0/fp Saved register/Frame pointer Callee + * x9 s1 Saved register Callee + * x10-11 a0-1 Function Arguments/return values Caller + * x12-17 a2-7 Function arguments Caller + * x18-27 s2-11 Saved registers Callee + * x28-31 t3-6 Temporaries Caller + * + * The RISC-V context is saved t FreeRTOS tasks in the following stack frame, + * where the global and thread pointers are currently assumed to be constant so + * are not saved: + * + * mstatus + * x31 + * x30 + * x29 + * x28 + * x27 + * x26 + * x25 + * x24 + * x23 + * x22 + * x21 + * x20 + * x19 + * x18 + * x17 + * x16 + * x15 + * x14 + * x13 + * x12 + * x11 + * pvParameters + * x9 + * x8 + * x7 + * x6 + * x5 + * portTASK_RETURN_ADDRESS + * [chip specific registers go here] + * pxCode + */ +.align 8 +.func +pxPortInitialiseStack: + + csrr t0, mstatus /* Obtain current mstatus value. */ + addi t1, x0, 0x188 /* Generate the value 0x1880, which are the MPIE and MPP bits to set in mstatus. */ + slli t1, t1, 4 + or t0, t0, t1 /* Set MPIE and MPP bits in mstatus value. */ + + addi a0, a0, -portWORD_SIZE + sw t0, 0(a0) /* mstatus onto the stack. */ + addi a0, a0, -(22 * portWORD_SIZE) /* Space for registers x11-x31. */ + sw a2, 0(a0) /* Task parameters (pvParameters parameter) goes into register X10/a0 on the stack. */ + addi a0, a0, -(6 * portWORD_SIZE) /* Space for registers x5-x9. */ + sw x0, 0(a0) /* Return address onto the stack, could be portTASK_RETURN_ADDRESS */ + addi t0, x0, portasmADDITIONAL_CONTEXT_SIZE /* The number of chip specific additional registers. */ +chip_specific_stack_frame: /* First add any chip specific registers to the stack frame being created. */ + beq t0, x0, 1f /* No more chip specific registers to save. */ + addi a0, a0, -portWORD_SIZE /* Make space for chip specific register. */ + sw x0, 0(a0) /* Give the chip specific register an initial value of zero. */ + addi t0, t0, -1 /* Decrement the count of chip specific registers remaining. */ + j chip_specific_stack_frame /* Until no more chip specific registers. */ +1: + addi a0, a0, -portWORD_SIZE + sw a1, 0(a0) /* mret value (pxCode parameter) onto the stack. */ + ret + .endfunc +/*-----------------------------------------------------------*/ diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/RISC-V/portmacro.h b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/RISC-V/portmacro.h new file mode 100644 index 0000000..64bc3cf --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/RISC-V/portmacro.h @@ -0,0 +1,146 @@ +/* + * FreeRTOS Kernel V10.2.0 + * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "FreeRTOSConfig.h" +#include "projdefs.h" /* for pdFALSE, pdTRUE */ + +void vPortStopTickTimer(void); /* << EST */ +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; +typedef uint32_t TickType_t; +#define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do +not need to be guarded with a critical section. */ +#define portTICK_TYPE_IS_ATOMIC 1 +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#ifdef __riscv64 + #error This is the RV32 port that has not yet been adapted for 64. + #define portBYTE_ALIGNMENT 16 +#else + #define portBYTE_ALIGNMENT 8 +#endif +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ +extern void vTaskSwitchContext( void ); +#define portYIELD() __asm volatile( "ecall" ); +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) vTaskSwitchContext() +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + + +/* Critical section management. */ +#define portCRITICAL_NESTING_IN_TCB 1 +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); + +#define portSET_INTERRUPT_MASK_FROM_ISR() 0 +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) uxSavedStatusValue +#define portDISABLE_INTERRUPTS() __asm volatile( "csrc mstatus, 8" ) +#define portENABLE_INTERRUPTS() __asm volatile( "csrs mstatus, 8" ) +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() +#define portDISABLE_ALL_INTERRUPTS() portDISABLE_INTERRUPTS() /* << EST */ + +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 ) + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - __builtin_clz( uxReadyPriorities ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/*-----------------------------------------------------------*/ + +#define portNOP() __asm volatile ( " nop " ) + +#define portINLINE __inline + +#ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__(( always_inline)) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/RISC-V/readme.txt b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/RISC-V/readme.txt new file mode 100644 index 0000000..b24c0b9 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/GCC/RISC-V/readme.txt @@ -0,0 +1,23 @@ +/* + * The FreeRTOS kernel's RISC-V port is split between the the code that is + * common across all currently supported RISC-V chips (implementations of the + * RISC-V ISA), and code that tailors the port to a specific RISC-V chip: + * + * + FreeRTOS\Source\portable\GCC\RISC-V-RV32\portASM.S contains the code that + * is common to all currently supported RISC-V chips. There is only one + * portASM.S file because the same file is built for all RISC-V target chips. + * + * + Header files called freertos_risc_v_chip_specific_extensions.h contain the + * code that tailors the FreeRTOS kernel's RISC-V port to a specific RISC-V + * chip. There are multiple freertos_risc_v_chip_specific_extensions.h files + * as there are multiple RISC-V chip implementations. + * + * !!!NOTE!!! + * TAKE CARE TO INCLUDE THE CORRECT freertos_risc_v_chip_specific_extensions.h + * HEADER FILE FOR THE CHIP IN USE. This is done using the assembler's (not the + * compiler's!) include path. For example, if the chip in use includes a core + * local interrupter (CLINT) and does not include any chip specific register + * extensions then add the path below to the assembler's include path: + * FreeRTOS\Source\portable\GCC\RISC-V-RV32\chip_specific_extensions\RV32I_CLINT_no_extensions + * + */ diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/MemMang/heap_1.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/MemMang/heap_1.c new file mode 100644 index 0000000..96a42ec --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/MemMang/heap_1.c @@ -0,0 +1,199 @@ +/* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ +/* << EST */ +#include "FreeRTOSConfig.h" +#if !defined(configUSE_HEAP_SCHEME) || (configUSE_HEAP_SCHEME==1 && configSUPPORT_DYNAMIC_ALLOCATION==1) +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +/* + * The simplest possible implementation of pvPortMalloc(). Note that this + * implementation does NOT allow allocated memory to be freed again. + * + * See heap_2.c, heap_3.c and heap_4.c for alternative implementations, and the + * memory management pages of https://www.FreeRTOS.org for more information. + */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + #include "SEGGER_SYSVIEW_Conf.h" + #include "SEGGER_SYSVIEW.h" +#endif + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0 +#endif + +/* A few bytes might be lost to byte aligning the heap start address. */ +#define configADJUSTED_HEAP_SIZE ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT ) + +/* Allocate the memory for the heap. */ +#if ( configAPPLICATION_ALLOCATED_HEAP == 1 ) + +/* The application writer has already defined the array used for the RTOS +* heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#elif configUSE_HEAP_SECTION_NAME && configCOMPILER==configCOMPILER_ARM_IAR /* << EST */ + #pragma language=extended + #pragma location = configHEAP_SECTION_NAME_STRING + static uint8_t ucHeap[configTOTAL_HEAP_SIZE] @ configHEAP_SECTION_NAME_STRING; +#elif configUSE_HEAP_SECTION_NAME /* << EST */ + static uint8_t __attribute__((section (configHEAP_SECTION_NAME_STRING))) ucHeap[configTOTAL_HEAP_SIZE]; +#else + static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + +/* Index into the ucHeap array. */ +static size_t xNextFreeByte = ( size_t ) 0; + +/*-----------------------------------------------------------*/ +static uint8_t *pucAlignedHeap = NULL; /* << EST: make it global, so it can be re-initialized */ + +void * pvPortMallocExt( size_t xWantedSize, unsigned int heapTag) /* << EST */ +{ + void * pvReturn = NULL; +//static uint8_t *pucAlignedHeap = NULL; /* << EST: make it global so it can be re-initialized */ + + /* Ensure that blocks are always aligned. */ + #if ( portBYTE_ALIGNMENT != 1 ) + { + if( xWantedSize & portBYTE_ALIGNMENT_MASK ) + { + /* Byte alignment required. Check for overflow. */ + if( ( xWantedSize + ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ) ) > xWantedSize ) + { + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + } + else + { + xWantedSize = 0; + } + } + } + #endif /* if ( portBYTE_ALIGNMENT != 1 ) */ + + vTaskSuspendAll(); + { + if( pucAlignedHeap == NULL ) + { +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + SEGGER_SYSVIEW_HeapDefine(ucHeap, ucHeap, sizeof(ucHeap), 0); + SEGGER_SYSVIEW_NameResource((uint32_t)ucHeap, "heap1"); +#endif + /* Ensure the heap starts on a correctly aligned boundary. */ + pucAlignedHeap = ( uint8_t * ) ( ( ( portPOINTER_SIZE_TYPE ) & ucHeap[ portBYTE_ALIGNMENT - 1 ] ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); + } + + /* Check there is enough room left for the allocation and. */ + if( ( xWantedSize > 0 ) && /* valid size */ + ( ( xNextFreeByte + xWantedSize ) < configADJUSTED_HEAP_SIZE ) && + ( ( xNextFreeByte + xWantedSize ) > xNextFreeByte ) ) /* Check for overflow. */ + { + /* Return the next free byte then increment the index past this + * block. */ + pvReturn = pucAlignedHeap + xNextFreeByte; + xNextFreeByte += xWantedSize; + } + +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + if (heapTag!=(unsigned)-1) { + SEGGER_SYSVIEW_HeapAllocEx(ucHeap, pvReturn, xWantedSize, heapTag); + } else { + SEGGER_SYSVIEW_HeapAlloc(ucHeap, pvReturn, xWantedSize); + } +#else + traceMALLOC( pvReturn, xWantedSize ); +#endif + } + ( void ) xTaskResumeAll(); + + #if ( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + #if 1/* << EST: Using configuration macro name for hook */ + extern void configUSE_MALLOC_FAILED_HOOK_NAME( void ); + configUSE_MALLOC_FAILED_HOOK_NAME(); + #else /* << EST */ + vApplicationMallocFailedHook(); + #endif + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void *pvPortMalloc(size_t xWantedSize) { /* << EST */ + return pvPortMallocExt(xWantedSize, -1); +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + /* Memory cannot be freed using this scheme. See heap_2.c, heap_3.c and + * heap_4.c for alternative implementations, and the memory management pages of + * https://www.FreeRTOS.org for more information. */ + ( void ) pv; + + /* Force an assert as it is invalid to call this function. */ + configASSERT( pv == NULL ); +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* Only required when static memory is not cleared. */ + xNextFreeByte = ( size_t ) 0; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return( configADJUSTED_HEAP_SIZE - xNextFreeByte ); +} +/*-----------------------------------------------------------*/ + +#if 1 /* << EST */ +void vPortInitializeHeap(void) { + xNextFreeByte = 0; + pucAlignedHeap = NULL; +} +#endif +#endif /* configUSE_HEAP_SCHEME==1 */ /* << EST */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/MemMang/heap_2.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/MemMang/heap_2.c new file mode 100644 index 0000000..10a0fc9 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/MemMang/heap_2.c @@ -0,0 +1,440 @@ +/* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ +/* << EST */ +#include "FreeRTOSConfig.h" +#if !defined(configUSE_HEAP_SCHEME) || (configUSE_HEAP_SCHEME==2 && configSUPPORT_DYNAMIC_ALLOCATION==1) + +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * A sample implementation of pvPortMalloc() and vPortFree() that permits + * allocated blocks to be freed, but does not combine adjacent free blocks + * into a single larger block (and so will fragment memory). See heap_4.c for + * an equivalent that does combine adjacent blocks into single larger blocks. + * + * See heap_1.c, heap_3.c and heap_4.c for alternative implementations, and the + * memory management pages of https://www.FreeRTOS.org for more information. + */ +#include +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + #include "SEGGER_SYSVIEW_Conf.h" + #include "SEGGER_SYSVIEW.h" +#endif + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0 +#endif + +#ifndef configHEAP_CLEAR_MEMORY_ON_FREE + #define configHEAP_CLEAR_MEMORY_ON_FREE 0 +#endif + +/* A few bytes might be lost to byte aligning the heap start address. */ +#define configADJUSTED_HEAP_SIZE ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT ) + +/* Assumes 8bit bytes! */ +#define heapBITS_PER_BYTE ( ( size_t ) 8 ) + +/* Max value that fits in a size_t type. */ +#define heapSIZE_MAX ( ~( ( size_t ) 0 ) ) + +/* Check if multiplying a and b will result in overflow. */ +#define heapMULTIPLY_WILL_OVERFLOW( a, b ) ( ( ( a ) > 0 ) && ( ( b ) > ( heapSIZE_MAX / ( a ) ) ) ) + +/* Check if adding a and b will result in overflow. */ +#define heapADD_WILL_OVERFLOW( a, b ) ( ( a ) > ( heapSIZE_MAX - ( b ) ) ) + +/* MSB of the xBlockSize member of an BlockLink_t structure is used to track + * the allocation status of a block. When MSB of the xBlockSize member of + * an BlockLink_t structure is set then the block belongs to the application. + * When the bit is free the block is still part of the free heap space. */ +#define heapBLOCK_ALLOCATED_BITMASK ( ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 ) ) +#define heapBLOCK_SIZE_IS_VALID( xBlockSize ) ( ( ( xBlockSize ) & heapBLOCK_ALLOCATED_BITMASK ) == 0 ) +#define heapBLOCK_IS_ALLOCATED( pxBlock ) ( ( ( pxBlock->xBlockSize ) & heapBLOCK_ALLOCATED_BITMASK ) != 0 ) +#define heapALLOCATE_BLOCK( pxBlock ) ( ( pxBlock->xBlockSize ) |= heapBLOCK_ALLOCATED_BITMASK ) +#define heapFREE_BLOCK( pxBlock ) ( ( pxBlock->xBlockSize ) &= ~heapBLOCK_ALLOCATED_BITMASK ) + +/*-----------------------------------------------------------*/ + +/* Allocate the memory for the heap. */ +#if ( configAPPLICATION_ALLOCATED_HEAP == 1 ) + +/* The application writer has already defined the array used for the RTOS +* heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#elif configUSE_HEAP_SECTION_NAME && configCOMPILER==configCOMPILER_ARM_IAR /* << EST */ + #pragma language=extended + #pragma location = configHEAP_SECTION_NAME_STRING + static uint8_t ucHeap[configTOTAL_HEAP_SIZE] @ configHEAP_SECTION_NAME_STRING; +#elif configUSE_HEAP_SECTION_NAME /* << EST */ + static uint8_t __attribute__((section (configHEAP_SECTION_NAME_STRING))) ucHeap[configTOTAL_HEAP_SIZE]; +#else + PRIVILEGED_DATA static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + + +/* Define the linked list structure. This is used to link free blocks in order + * of their size. */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK * pxNextFreeBlock; /*<< The next free block in the list. */ + size_t xBlockSize; /*<< The size of the free block. */ +} BlockLink_t; + + +static const size_t xHeapStructSize = ( ( sizeof( BlockLink_t ) + ( size_t ) ( portBYTE_ALIGNMENT - 1 ) ) & ~( ( size_t ) portBYTE_ALIGNMENT_MASK ) ); +#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize * 2 ) ) + +/* Create a couple of list links to mark the start and end of the list. */ +PRIVILEGED_DATA static BlockLink_t xStart, xEnd; + +/* Keeps track of the number of free bytes remaining, but says nothing about + * fragmentation. */ +PRIVILEGED_DATA static size_t xFreeBytesRemaining = configADJUSTED_HEAP_SIZE; + +/*-----------------------------------------------------------*/ + +/* + * Initialises the heap structures before their first use. + */ +static void prvHeapInit( void ) PRIVILEGED_FUNCTION; + +/*-----------------------------------------------------------*/ + +/* STATIC FUNCTIONS ARE DEFINED AS MACROS TO MINIMIZE THE FUNCTION CALL DEPTH. */ + +/* + * Insert a block into the list of free blocks - which is ordered by size of + * the block. Small blocks at the start of the list and large blocks at the end + * of the list. + */ +#define prvInsertBlockIntoFreeList( pxBlockToInsert ) \ + { \ + BlockLink_t * pxIterator; \ + size_t xBlockSize; \ + \ + xBlockSize = pxBlockToInsert->xBlockSize; \ + \ + /* Iterate through the list until a block is found that has a larger size */ \ + /* than the block we are inserting. */ \ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock->xBlockSize < xBlockSize; pxIterator = pxIterator->pxNextFreeBlock ) \ + { \ + /* There is nothing to do here - just iterate to the correct position. */ \ + } \ + \ + /* Update the list to include the block being inserted in the correct */ \ + /* position. */ \ + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; \ + pxIterator->pxNextFreeBlock = pxBlockToInsert; \ + } +/*-----------------------------------------------------------*/ +static BaseType_t xHeapHasBeenInitialised = pdFALSE; /* << EST: make it global, so it can be re-initialized */ + +void * pvPortMallocExt( size_t xWantedSize, unsigned int heapTag) /* << EST */ +{ + BlockLink_t * pxBlock; + BlockLink_t * pxPreviousBlock; + BlockLink_t * pxNewBlockLink; +// PRIVILEGED_DATA static BaseType_t xHeapHasBeenInitialised = pdFALSE; /* << EST: make it global so it can be re-initialized */ + void * pvReturn = NULL; + size_t xAdditionalRequiredSize; + + if( xWantedSize > 0 ) + { + /* The wanted size must be increased so it can contain a BlockLink_t + * structure in addition to the requested amount of bytes. */ + if( heapADD_WILL_OVERFLOW( xWantedSize, xHeapStructSize ) == 0 ) + { + xWantedSize += xHeapStructSize; + + /* Ensure that blocks are always aligned to the required number + * of bytes. */ + if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 ) + { + /* Byte alignment required. */ + xAdditionalRequiredSize = portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ); + + if( heapADD_WILL_OVERFLOW( xWantedSize, xAdditionalRequiredSize ) == 0 ) + { + xWantedSize += xAdditionalRequiredSize; + } + else + { + xWantedSize = 0; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xWantedSize = 0; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + vTaskSuspendAll(); + { + /* If this is the first call to malloc then the heap will require + * initialisation to setup the list of free blocks. */ + if( xHeapHasBeenInitialised == pdFALSE ) + { + prvHeapInit(); + xHeapHasBeenInitialised = pdTRUE; + } + + /* Check the block size we are trying to allocate is not so large that the + * top bit is set. The top bit of the block size member of the BlockLink_t + * structure is used to determine who owns the block - the application or + * the kernel, so it must be free. */ + if( heapBLOCK_SIZE_IS_VALID( xWantedSize ) != 0 ) + { + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Blocks are stored in byte order - traverse the list from the start + * (smallest) block until one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If we found the end marker then a block of adequate size was not found. */ + if( pxBlock != &xEnd ) + { + /* Return the memory space - jumping over the BlockLink_t structure + * at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); + + /* This block is being returned for use so must be taken out of the + * list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new block + * following the number of bytes requested. The void cast is + * used to prevent byte alignment warnings from the compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + + /* Calculate the sizes of two blocks split from the single + * block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. + * The list of free blocks is sorted by their size, we have to + * iterate to find the right place to insert new block. */ + prvInsertBlockIntoFreeList( ( pxNewBlockLink ) ); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + /* The block is being returned - it is allocated and owned + * by the application and has no "next" block. */ + heapALLOCATE_BLOCK( pxBlock ); + pxBlock->pxNextFreeBlock = NULL; + } + } + } +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + if (heapTag!=(unsigned)-1) { + SEGGER_SYSVIEW_HeapAllocEx(ucHeap, pvReturn, xWantedSize, heapTag); + } else { + SEGGER_SYSVIEW_HeapAlloc(ucHeap, pvReturn, xWantedSize); + } +#else + traceMALLOC( pvReturn, xWantedSize ); +#endif + } + ( void ) xTaskResumeAll(); + + #if ( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + #if 1 /* << EST: Using configuration macro name for hook */ + extern void configUSE_MALLOC_FAILED_HOOK_NAME( void ); + configUSE_MALLOC_FAILED_HOOK_NAME(); + #else + vApplicationMallocFailedHook(); + #endif + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void *pvPortMalloc(size_t xWantedSize) { /* << EST */ + return pvPortMallocExt(xWantedSize, -1); +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + uint8_t * puc = ( uint8_t * ) pv; + BlockLink_t * pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + * before it. */ + puc -= xHeapStructSize; + + /* This unexpected casting is to keep some compilers from issuing + * byte alignment warnings. */ + pxLink = ( void * ) puc; + + configASSERT( heapBLOCK_IS_ALLOCATED( pxLink ) != 0 ); + configASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( heapBLOCK_IS_ALLOCATED( pxLink ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + * allocated. */ + heapFREE_BLOCK( pxLink ); + #if ( configHEAP_CLEAR_MEMORY_ON_FREE == 1 ) + { + ( void ) memset( puc + xHeapStructSize, 0, pxLink->xBlockSize - xHeapStructSize ); + } + #endif + + vTaskSuspendAll(); + { + /* Add this block to the list of free blocks. */ + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + xFreeBytesRemaining += pxLink->xBlockSize; +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + SEGGER_SYSVIEW_HeapFree(ucHeap, pv); +#else + traceFREE( pv, pxLink->xBlockSize ); +#endif + } + ( void ) xTaskResumeAll(); + } + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* This just exists to keep the linker quiet. */ +} +/*-----------------------------------------------------------*/ + +void * pvPortCalloc( size_t xNum, + size_t xSize ) +{ + void * pv = NULL; + + if( heapMULTIPLY_WILL_OVERFLOW( xNum, xSize ) == 0 ) + { + pv = pvPortMalloc( xNum * xSize ); + + if( pv != NULL ) + { + ( void ) memset( pv, 0, xNum * xSize ); + } + } + + return pv; +} +/*-----------------------------------------------------------*/ + +static void prvHeapInit( void ) /* PRIVILEGED_FUNCTION */ +{ + BlockLink_t * pxFirstFreeBlock; + uint8_t * pucAlignedHeap; + + /* Ensure the heap starts on a correctly aligned boundary. */ + pucAlignedHeap = ( uint8_t * ) ( ( ( portPOINTER_SIZE_TYPE ) & ucHeap[ portBYTE_ALIGNMENT - 1 ] ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); + + /* xStart is used to hold a pointer to the first item in the list of free + * blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + + /* xEnd is used to mark the end of the list of free blocks. */ + xEnd.xBlockSize = configADJUSTED_HEAP_SIZE; + xEnd.pxNextFreeBlock = NULL; + + /* To start with there is a single free block that is sized to take up the + * entire heap space. */ + pxFirstFreeBlock = ( BlockLink_t * ) pucAlignedHeap; + pxFirstFreeBlock->xBlockSize = configADJUSTED_HEAP_SIZE; + pxFirstFreeBlock->pxNextFreeBlock = &xEnd; +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + SEGGER_SYSVIEW_HeapDefine(ucHeap, ucHeap, sizeof(ucHeap), sizeof(BlockLink_t)); + SEGGER_SYSVIEW_NameResource((uint32_t)ucHeap, "heap2"); +#endif +} +/*-----------------------------------------------------------*/ +#if 1 /* << EST */ +void vPortInitializeHeap(void) { + xStart.pxNextFreeBlock = NULL; + xStart.xBlockSize = 0; + xEnd.pxNextFreeBlock = NULL; + xEnd.xBlockSize = 0; + xFreeBytesRemaining = configADJUSTED_HEAP_SIZE; + xHeapHasBeenInitialised = pdFALSE; +} +#endif +#endif /* configUSE_HEAP_SCHEME==2 */ /* << EST */ + + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/MemMang/heap_3.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/MemMang/heap_3.c new file mode 100644 index 0000000..0d0f473 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/MemMang/heap_3.c @@ -0,0 +1,147 @@ +/* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ +/* << EST */ +#include "FreeRTOSConfig.h" +#if !defined(configUSE_HEAP_SCHEME) || (configUSE_HEAP_SCHEME==3 && configSUPPORT_DYNAMIC_ALLOCATION==1) + +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +/* + * Implementation of pvPortMalloc() and vPortFree() that relies on the + * compilers own malloc() and free() implementations. + * + * This file can only be used if the linker is configured to to generate + * a heap memory area. + * + * See heap_1.c, heap_2.c and heap_4.c for alternative implementations, and the + * memory management pages of https://www.FreeRTOS.org for more information. + */ + +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#if 0 && configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST: currently not fully supported for heap3 */ + #include "SEGGER_SYSVIEW_Conf.h" + #include "SEGGER_SYSVIEW.h" +#endif + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0 +#endif + +#if 0 && configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ +static bool firstMalloc = true; +#endif +/*-----------------------------------------------------------*/ + +void * pvPortMallocExt( size_t xWantedSize, unsigned int heapTag) /* << EST */ +{ + void * pvReturn; + + vTaskSuspendAll(); + { +#if 0 && configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + if (firstMalloc) { + firstMalloc = false; + SEGGER_SYSVIEW_HeapDefine(ucHeap, ucHeap, sizeof(ucHeap), sizeof(BlockLink_t)); + SEGGER_SYSVIEW_NameResource((uint32_t)ucHeap, "heap3"); + } +#endif + pvReturn = malloc( xWantedSize ); +#if 0 && configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + if (heapTag!=(unsigned)-1) { + SEGGER_SYSVIEW_HeapAllocEx(ucHeap, pvReturn, xWantedSize, heapTag); + } else { + SEGGER_SYSVIEW_HeapAlloc(ucHeap, pvReturn, xWantedSize); + } +#else + traceMALLOC( pvReturn, xWantedSize ); +#endif + } + ( void ) xTaskResumeAll(); + + #if ( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + #if 1 /* << EST: Using configuration macro name for hook */ + extern void configUSE_MALLOC_FAILED_HOOK_NAME( void ); + configUSE_MALLOC_FAILED_HOOK_NAME(); + #else + vApplicationMallocFailedHook(); + #endif + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void *pvPortMalloc(size_t xWantedSize) { /* << EST */ + return pvPortMallocExt(xWantedSize, -1); +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + if( pv != NULL ) + { + vTaskSuspendAll(); + { + free( pv ); +#if 0 && configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + SEGGER_SYSVIEW_HeapFree(ucHeap, pv); +#else + traceFREE( pv, 0 ); +#endif + } + ( void ) xTaskResumeAll(); + } +} +/*-----------------------------------------------------------*/ +#if 1 /* << EST */ +void vPortInitializeHeap(void) { +#if 0 && configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + firstMalloc = true; +#endif +} +#endif + +#endif /* configUSE_HEAP_SCHEME==3 */ /* << EST */ + + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/MemMang/heap_4.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/MemMang/heap_4.c new file mode 100644 index 0000000..894f47c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/MemMang/heap_4.c @@ -0,0 +1,707 @@ +/* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ +/* << EST */ +#include "FreeRTOSConfig.h" +#if !defined(configUSE_HEAP_SCHEME) || (configUSE_HEAP_SCHEME==4 && configSUPPORT_DYNAMIC_ALLOCATION==1) + +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * A sample implementation of pvPortMalloc() and vPortFree() that combines + * (coalescences) adjacent memory blocks as they are freed, and in so doing + * limits memory fragmentation. + * + * See heap_1.c, heap_2.c and heap_3.c for alternative implementations, and the + * memory management pages of https://www.FreeRTOS.org for more information. + */ +#include +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + #include "SEGGER_SYSVIEW_Conf.h" + #include "SEGGER_SYSVIEW.h" +#endif + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0 +#endif + +#ifndef configHEAP_CLEAR_MEMORY_ON_FREE + #define configHEAP_CLEAR_MEMORY_ON_FREE 0 +#endif + +/* Block sizes must not get too small. */ +#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) ) + +/* Assumes 8bit bytes! */ +#define heapBITS_PER_BYTE ( ( size_t ) 8 ) + +/* Max value that fits in a size_t type. */ +#define heapSIZE_MAX ( ~( ( size_t ) 0 ) ) + +/* Check if multiplying a and b will result in overflow. */ +#define heapMULTIPLY_WILL_OVERFLOW( a, b ) ( ( ( a ) > 0 ) && ( ( b ) > ( heapSIZE_MAX / ( a ) ) ) ) + +/* Check if adding a and b will result in overflow. */ +#define heapADD_WILL_OVERFLOW( a, b ) ( ( a ) > ( heapSIZE_MAX - ( b ) ) ) + +/* Check if the subtraction operation ( a - b ) will result in underflow. */ +#define heapSUBTRACT_WILL_UNDERFLOW( a, b ) ( ( a ) < ( b ) ) + +/* MSB of the xBlockSize member of an BlockLink_t structure is used to track + * the allocation status of a block. When MSB of the xBlockSize member of + * an BlockLink_t structure is set then the block belongs to the application. + * When the bit is free the block is still part of the free heap space. */ +#define heapBLOCK_ALLOCATED_BITMASK ( ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 ) ) +#define heapBLOCK_SIZE_IS_VALID( xBlockSize ) ( ( ( xBlockSize ) & heapBLOCK_ALLOCATED_BITMASK ) == 0 ) +#define heapBLOCK_IS_ALLOCATED( pxBlock ) ( ( ( pxBlock->xBlockSize ) & heapBLOCK_ALLOCATED_BITMASK ) != 0 ) +#define heapALLOCATE_BLOCK( pxBlock ) ( ( pxBlock->xBlockSize ) |= heapBLOCK_ALLOCATED_BITMASK ) +#define heapFREE_BLOCK( pxBlock ) ( ( pxBlock->xBlockSize ) &= ~heapBLOCK_ALLOCATED_BITMASK ) + +/*-----------------------------------------------------------*/ + +/* Allocate the memory for the heap. */ +#if ( configAPPLICATION_ALLOCATED_HEAP == 1 ) + +/* The application writer has already defined the array used for the RTOS +* heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#elif configUSE_HEAP_SECTION_NAME && configCOMPILER==configCOMPILER_ARM_IAR /* << EST */ + #pragma language=extended + #pragma location = configHEAP_SECTION_NAME_STRING + static unsigned char ucHeap[configTOTAL_HEAP_SIZE] @ configHEAP_SECTION_NAME_STRING; +#elif configUSE_HEAP_SECTION_NAME /* << EST */ + static unsigned char __attribute__((section (configHEAP_SECTION_NAME_STRING))) ucHeap[configTOTAL_HEAP_SIZE]; +#else + PRIVILEGED_DATA static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + +/* Define the linked list structure. This is used to link free blocks in order + * of their memory address. */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK * pxNextFreeBlock; /**< The next free block in the list. */ + size_t xBlockSize; /**< The size of the free block. */ +} BlockLink_t; + +/* Setting configENABLE_HEAP_PROTECTOR to 1 enables heap block pointers + * protection using an application supplied canary value to catch heap + * corruption should a heap buffer overflow occur. + */ +#if ( configENABLE_HEAP_PROTECTOR == 1 ) + +/** + * @brief Application provided function to get a random value to be used as canary. + * + * @param pxHeapCanary [out] Output parameter to return the canary value. + */ + extern void vApplicationGetRandomHeapCanary( portPOINTER_SIZE_TYPE * pxHeapCanary ); + +/* Canary value for protecting internal heap pointers. */ + PRIVILEGED_DATA static portPOINTER_SIZE_TYPE xHeapCanary; + +/* Macro to load/store BlockLink_t pointers to memory. By XORing the + * pointers with a random canary value, heap overflows will result + * in randomly unpredictable pointer values which will be caught by + * heapVALIDATE_BLOCK_POINTER assert. */ + #define heapPROTECT_BLOCK_POINTER( pxBlock ) ( ( BlockLink_t * ) ( ( ( portPOINTER_SIZE_TYPE ) ( pxBlock ) ) ^ xHeapCanary ) ) +#else + + #define heapPROTECT_BLOCK_POINTER( pxBlock ) ( pxBlock ) + +#endif /* configENABLE_HEAP_PROTECTOR */ + +/* Assert that a heap block pointer is within the heap bounds. */ +#define heapVALIDATE_BLOCK_POINTER( pxBlock ) \ + configASSERT( ( ( uint8_t * ) ( pxBlock ) >= &( ucHeap[ 0 ] ) ) && \ + ( ( uint8_t * ) ( pxBlock ) <= &( ucHeap[ configTOTAL_HEAP_SIZE - 1 ] ) ) ) + +/*-----------------------------------------------------------*/ + +/* + * Inserts a block of memory that is being freed into the correct position in + * the list of free memory blocks. The block being freed will be merged with + * the block in front it and/or the block behind it if the memory blocks are + * adjacent to each other. + */ +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ) PRIVILEGED_FUNCTION; + +/* + * Called automatically to setup the required heap structures the first time + * pvPortMalloc() is called. + */ +static void prvHeapInit( void ) PRIVILEGED_FUNCTION; + +/*-----------------------------------------------------------*/ + +/* The size of the structure placed at the beginning of each allocated memory + * block must by correctly byte aligned. */ +#if 0 /* << EST */ +static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( portBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); +#else /* << EST do not optimize this variable, needed for NXP TAD plugin */ +static const volatile size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( portBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); +#endif + +/* Create a couple of list links to mark the start and end of the list. */ +PRIVILEGED_DATA static BlockLink_t xStart; +PRIVILEGED_DATA static BlockLink_t * pxEnd = NULL; + +/* Keeps track of the number of calls to allocate and free memory as well as the + * number of free bytes remaining, but says nothing about fragmentation. */ +PRIVILEGED_DATA static size_t xFreeBytesRemaining = 0U; +PRIVILEGED_DATA static size_t xMinimumEverFreeBytesRemaining = 0U; +PRIVILEGED_DATA static size_t xNumberOfSuccessfulAllocations = 0; +PRIVILEGED_DATA static size_t xNumberOfSuccessfulFrees = 0; + +/*-----------------------------------------------------------*/ +void *pvPortMallocExt(size_t xWantedSize, unsigned int heapTag) /* << EST */ +{ + BlockLink_t * pxBlock; + BlockLink_t * pxPreviousBlock; + BlockLink_t * pxNewBlockLink; + void * pvReturn = NULL; + size_t xAdditionalRequiredSize; + + if( xWantedSize > 0 ) + { + /* The wanted size must be increased so it can contain a BlockLink_t + * structure in addition to the requested amount of bytes. */ + if( heapADD_WILL_OVERFLOW( xWantedSize, xHeapStructSize ) == 0 ) + { + xWantedSize += xHeapStructSize; + + /* Ensure that blocks are always aligned to the required number + * of bytes. */ + if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 ) + { + /* Byte alignment required. */ + xAdditionalRequiredSize = portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ); + + if( heapADD_WILL_OVERFLOW( xWantedSize, xAdditionalRequiredSize ) == 0 ) + { + xWantedSize += xAdditionalRequiredSize; + } + else + { + xWantedSize = 0; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xWantedSize = 0; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + vTaskSuspendAll(); + { + /* If this is the first call to malloc then the heap will require + * initialisation to setup the list of free blocks. */ + if( pxEnd == NULL ) + { + prvHeapInit(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Check the block size we are trying to allocate is not so large that the + * top bit is set. The top bit of the block size member of the BlockLink_t + * structure is used to determine who owns the block - the application or + * the kernel, so it must be free. */ + if( heapBLOCK_SIZE_IS_VALID( xWantedSize ) != 0 ) + { + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Traverse the list from the start (lowest address) block until + * one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = heapPROTECT_BLOCK_POINTER( xStart.pxNextFreeBlock ); + heapVALIDATE_BLOCK_POINTER( pxBlock ); + + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != heapPROTECT_BLOCK_POINTER( NULL ) ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = heapPROTECT_BLOCK_POINTER( pxBlock->pxNextFreeBlock ); + heapVALIDATE_BLOCK_POINTER( pxBlock ); + } + + /* If the end marker was reached then a block of adequate size + * was not found. */ + if( pxBlock != pxEnd ) + { + /* Return the memory space pointed to - jumping over the + * BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) heapPROTECT_BLOCK_POINTER( pxPreviousBlock->pxNextFreeBlock ) ) + xHeapStructSize ); + heapVALIDATE_BLOCK_POINTER( pvReturn ); + + /* This block is being returned for use so must be taken out + * of the list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into + * two. */ + configASSERT( heapSUBTRACT_WILL_UNDERFLOW( pxBlock->xBlockSize, xWantedSize ) == 0 ); + + if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new + * block following the number of bytes requested. The void + * cast is used to prevent byte alignment warnings from the + * compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + configASSERT( ( ( ( size_t ) pxNewBlockLink ) & portBYTE_ALIGNMENT_MASK ) == 0 ); + + /* Calculate the sizes of two blocks split from the + * single block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + pxNewBlockLink->pxNextFreeBlock = pxPreviousBlock->pxNextFreeBlock; + pxPreviousBlock->pxNextFreeBlock = heapPROTECT_BLOCK_POINTER( pxNewBlockLink ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned + * by the application and has no "next" block. */ + heapALLOCATE_BLOCK( pxBlock ); + pxBlock->pxNextFreeBlock = NULL; + xNumberOfSuccessfulAllocations++; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + if (heapTag!=(unsigned)-1) { + SEGGER_SYSVIEW_HeapAllocEx(&xStart, pvReturn, xWantedSize, heapTag); + } else { + SEGGER_SYSVIEW_HeapAlloc(&xStart, pvReturn, xWantedSize); + } +#else + traceMALLOC( pvReturn, xWantedSize ); +#endif + } + ( void ) xTaskResumeAll(); + + #if ( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + #if 1/* << EST: Using configuration macro name for hook */ + extern void configUSE_MALLOC_FAILED_HOOK_NAME( void ); + configUSE_MALLOC_FAILED_HOOK_NAME(); + #else /* << EST */ + vApplicationMallocFailedHook(); + #endif + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* if ( configUSE_MALLOC_FAILED_HOOK == 1 ) */ + + configASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) portBYTE_ALIGNMENT_MASK ) == 0 ); + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void *pvPortMalloc(size_t xWantedSize) { /* << EST */ + return pvPortMallocExt(xWantedSize, -1); +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + uint8_t * puc = ( uint8_t * ) pv; + BlockLink_t * pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + * before it. */ + puc -= xHeapStructSize; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + heapVALIDATE_BLOCK_POINTER( pxLink ); + configASSERT( heapBLOCK_IS_ALLOCATED( pxLink ) != 0 ); + configASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( heapBLOCK_IS_ALLOCATED( pxLink ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + * allocated. */ + heapFREE_BLOCK( pxLink ); + #if ( configHEAP_CLEAR_MEMORY_ON_FREE == 1 ) + { + /* Check for underflow as this can occur if xBlockSize is + * overwritten in a heap block. */ + if( heapSUBTRACT_WILL_UNDERFLOW( pxLink->xBlockSize, xHeapStructSize ) == 0 ) + { + ( void ) memset( puc + xHeapStructSize, 0, pxLink->xBlockSize - xHeapStructSize ); + } + } + #endif + + vTaskSuspendAll(); + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + SEGGER_SYSVIEW_HeapFree(&xStart, pv); +#else + traceFREE( pv, pxLink->xBlockSize ); +#endif + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + xNumberOfSuccessfulFrees++; + } + ( void ) xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetMinimumEverFreeHeapSize( void ) +{ + return xMinimumEverFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* This just exists to keep the linker quiet. */ +} +/*-----------------------------------------------------------*/ + +void * pvPortCalloc( size_t xNum, + size_t xSize ) +{ + void * pv = NULL; + + if( heapMULTIPLY_WILL_OVERFLOW( xNum, xSize ) == 0 ) + { + pv = pvPortMalloc( xNum * xSize ); + + if( pv != NULL ) + { + ( void ) memset( pv, 0, xNum * xSize ); + } + } + + return pv; +} +/*-----------------------------------------------------------*/ + +static void prvHeapInit( void ) /* PRIVILEGED_FUNCTION */ +{ + BlockLink_t * pxFirstFreeBlock; + portPOINTER_SIZE_TYPE uxStartAddress, uxEndAddress; + size_t xTotalHeapSize = configTOTAL_HEAP_SIZE; + + /* Ensure the heap starts on a correctly aligned boundary. */ + uxStartAddress = ( portPOINTER_SIZE_TYPE ) ucHeap; + + if( ( uxStartAddress & portBYTE_ALIGNMENT_MASK ) != 0 ) + { + uxStartAddress += ( portBYTE_ALIGNMENT - 1 ); + uxStartAddress &= ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ); + xTotalHeapSize -= ( size_t ) ( uxStartAddress - ( portPOINTER_SIZE_TYPE ) ucHeap ); + } + + #if ( configENABLE_HEAP_PROTECTOR == 1 ) + { + vApplicationGetRandomHeapCanary( &( xHeapCanary ) ); + } + #endif + + /* xStart is used to hold a pointer to the first item in the list of free + * blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( void * ) heapPROTECT_BLOCK_POINTER( uxStartAddress ); + xStart.xBlockSize = ( size_t ) 0; + + /* pxEnd is used to mark the end of the list of free blocks and is inserted + * at the end of the heap space. */ + uxEndAddress = uxStartAddress + ( portPOINTER_SIZE_TYPE ) xTotalHeapSize; + uxEndAddress -= ( portPOINTER_SIZE_TYPE ) xHeapStructSize; + uxEndAddress &= ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ); + pxEnd = ( BlockLink_t * ) uxEndAddress; + pxEnd->xBlockSize = 0; + pxEnd->pxNextFreeBlock = heapPROTECT_BLOCK_POINTER( NULL ); + + /* To start with there is a single free block that is sized to take up the + * entire heap space, minus the space taken by pxEnd. */ + pxFirstFreeBlock = ( BlockLink_t * ) uxStartAddress; + pxFirstFreeBlock->xBlockSize = ( size_t ) ( uxEndAddress - ( portPOINTER_SIZE_TYPE ) pxFirstFreeBlock ); + pxFirstFreeBlock->pxNextFreeBlock = heapPROTECT_BLOCK_POINTER( pxEnd ); + + /* Only one block exists - and it covers the entire usable heap space. */ + xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + SEGGER_SYSVIEW_HeapDefine(ucHeap, ucHeap, sizeof(ucHeap), sizeof(BlockLink_t)); + SEGGER_SYSVIEW_NameResource((uint32_t)ucHeap, "heap4"); +#endif +} +/*-----------------------------------------------------------*/ + +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ) /* PRIVILEGED_FUNCTION */ +{ + BlockLink_t * pxIterator; + uint8_t * puc; + + /* Iterate through the list until a block is found that has a higher address + * than the block being inserted. */ + for( pxIterator = &xStart; heapPROTECT_BLOCK_POINTER( pxIterator->pxNextFreeBlock ) < pxBlockToInsert; pxIterator = heapPROTECT_BLOCK_POINTER( pxIterator->pxNextFreeBlock ) ) + { + /* Nothing to do here, just iterate to the right position. */ + } + + if( pxIterator != &xStart ) + { + heapVALIDATE_BLOCK_POINTER( pxIterator ); + } + + /* Do the block being inserted, and the block it is being inserted after + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) + { + pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; + pxBlockToInsert = pxIterator; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Do the block being inserted, and the block it is being inserted before + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxBlockToInsert; + + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) heapPROTECT_BLOCK_POINTER( pxIterator->pxNextFreeBlock ) ) + { + if( heapPROTECT_BLOCK_POINTER( pxIterator->pxNextFreeBlock ) != pxEnd ) + { + /* Form one big block from the two blocks. */ + pxBlockToInsert->xBlockSize += heapPROTECT_BLOCK_POINTER( pxIterator->pxNextFreeBlock )->xBlockSize; + pxBlockToInsert->pxNextFreeBlock = heapPROTECT_BLOCK_POINTER( pxIterator->pxNextFreeBlock )->pxNextFreeBlock; + } + else + { + pxBlockToInsert->pxNextFreeBlock = heapPROTECT_BLOCK_POINTER( pxEnd ); + } + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + } + + /* If the block being inserted plugged a gab, so was merged with the block + * before and the block after, then it's pxNextFreeBlock pointer will have + * already been set, and should not be set here as that would make it point + * to itself. */ + if( pxIterator != pxBlockToInsert ) + { + pxIterator->pxNextFreeBlock = heapPROTECT_BLOCK_POINTER( pxBlockToInsert ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +void vPortGetHeapStats( HeapStats_t * pxHeapStats ) +{ + BlockLink_t * pxBlock; + size_t xBlocks = 0, xMaxSize = 0, xMinSize = portMAX_DELAY; /* portMAX_DELAY used as a portable way of getting the maximum value. */ + + vTaskSuspendAll(); + { + pxBlock = heapPROTECT_BLOCK_POINTER( xStart.pxNextFreeBlock ); + + /* pxBlock will be NULL if the heap has not been initialised. The heap + * is initialised automatically when the first allocation is made. */ + if( pxBlock != NULL ) + { + while( pxBlock != pxEnd ) + { + /* Increment the number of blocks and record the largest block seen + * so far. */ + xBlocks++; + + if( pxBlock->xBlockSize > xMaxSize ) + { + xMaxSize = pxBlock->xBlockSize; + } + + if( pxBlock->xBlockSize < xMinSize ) + { + xMinSize = pxBlock->xBlockSize; + } + + /* Move to the next block in the chain until the last block is + * reached. */ + pxBlock = heapPROTECT_BLOCK_POINTER( pxBlock->pxNextFreeBlock ); + } + } + } + ( void ) xTaskResumeAll(); + + pxHeapStats->xSizeOfLargestFreeBlockInBytes = xMaxSize; + pxHeapStats->xSizeOfSmallestFreeBlockInBytes = xMinSize; + pxHeapStats->xNumberOfFreeBlocks = xBlocks; + + taskENTER_CRITICAL(); + { + pxHeapStats->xAvailableHeapSpaceInBytes = xFreeBytesRemaining; + pxHeapStats->xNumberOfSuccessfulAllocations = xNumberOfSuccessfulAllocations; + pxHeapStats->xNumberOfSuccessfulFrees = xNumberOfSuccessfulFrees; + pxHeapStats->xMinimumEverFreeBytesRemaining = xMinimumEverFreeBytesRemaining; + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ +#if 1 /* << EST */ +void vPortInitializeHeap(void) { + pxEnd = NULL; /* force initialization of heap next time a block gets allocated */ + xStart.pxNextFreeBlock = NULL; + xStart.xBlockSize = 0; + xFreeBytesRemaining = 0; + xMinimumEverFreeBytesRemaining = 0; +} + +#include /* for memcpy() */ +#if 0 +void *pvPortRealloc(void *ptr, size_t new_size) { + void *newBlock; + uint8_t *puc; + BlockLink_t *pxLink; + size_t old_size; + + if (ptr==NULL) { /* if it is NULL, return a new block */ + return pvPortMalloc(new_size); + } + if (new_size==0) { /* if new size is zero, free up memory and return NULL */ + vPortFree(ptr); + return NULL; + } + /* The memory being freed will have an BlockLink_t structure immediately + * before it. */ + puc = (uint8_t*)ptr; + puc -= xHeapStructSize; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = (void *)puc; + configASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); + + old_size = (pxLink->xBlockSize & ~xBlockAllocatedBit)-xHeapStructSize; + if (new_size==old_size) { /* same size: don't need to do anything */ + return ptr; + } + newBlock = pvPortMalloc(new_size); /* allocate new block */ + if (newBlock==NULL) { + return NULL; /* if there is not enough memory, the old block is not freed and NULL is returned */ + } + if (old_size>new_size) { /* shrink memory block? */ + old_size = new_size; /* make sure we only copy up to the new size */ + } + memcpy(newBlock, ptr, old_size); /* copy old content to new block */ + vPortFree(ptr); /* free old block */ + return newBlock; +} +#endif + +#endif + +#endif /* configUSE_HEAP_SCHEME==4 */ /* << EST */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/MemMang/heap_5.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/MemMang/heap_5.c new file mode 100644 index 0000000..6d8f7fb --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/MemMang/heap_5.c @@ -0,0 +1,755 @@ +/* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ +/* << EST */ +#include "FreeRTOSConfig.h" +#if !defined(configUSE_HEAP_SCHEME) || (configUSE_HEAP_SCHEME==5 && configSUPPORT_DYNAMIC_ALLOCATION==1) +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * A sample implementation of pvPortMalloc() that allows the heap to be defined + * across multiple non-contiguous blocks and combines (coalescences) adjacent + * memory blocks as they are freed. + * + * See heap_1.c, heap_2.c, heap_3.c and heap_4.c for alternative + * implementations, and the memory management pages of https://www.FreeRTOS.org + * for more information. + * + * Usage notes: + * + * vPortDefineHeapRegions() ***must*** be called before pvPortMalloc(). + * pvPortMalloc() will be called if any task objects (tasks, queues, event + * groups, etc.) are created, therefore vPortDefineHeapRegions() ***must*** be + * called before any other objects are defined. + * + * vPortDefineHeapRegions() takes a single parameter. The parameter is an array + * of HeapRegion_t structures. HeapRegion_t is defined in portable.h as + * + * typedef struct HeapRegion + * { + * uint8_t *pucStartAddress; << Start address of a block of memory that will be part of the heap. + * size_t xSizeInBytes; << Size of the block of memory. + * } HeapRegion_t; + * + * The array is terminated using a NULL zero sized region definition, and the + * memory regions defined in the array ***must*** appear in address order from + * low address to high address. So the following is a valid example of how + * to use the function. + * + * HeapRegion_t xHeapRegions[] = + * { + * { ( uint8_t * ) 0x80000000UL, 0x10000 }, << Defines a block of 0x10000 bytes starting at address 0x80000000 + * { ( uint8_t * ) 0x90000000UL, 0xa0000 }, << Defines a block of 0xa0000 bytes starting at address of 0x90000000 + * { NULL, 0 } << Terminates the array. + * }; + * + * vPortDefineHeapRegions( xHeapRegions ); << Pass the array into vPortDefineHeapRegions(). + * + * Note 0x80000000 is the lower address so appears in the array first. + * + */ +#include +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + #include "SEGGER_SYSVIEW_Conf.h" + #include "SEGGER_SYSVIEW.h" +#endif + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0 +#endif + +#ifndef configHEAP_CLEAR_MEMORY_ON_FREE + #define configHEAP_CLEAR_MEMORY_ON_FREE 0 +#endif + +/* Block sizes must not get too small. */ +#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) ) + +/* Assumes 8bit bytes! */ +#define heapBITS_PER_BYTE ( ( size_t ) 8 ) + +/* Max value that fits in a size_t type. */ +#define heapSIZE_MAX ( ~( ( size_t ) 0 ) ) + +/* Check if multiplying a and b will result in overflow. */ +#define heapMULTIPLY_WILL_OVERFLOW( a, b ) ( ( ( a ) > 0 ) && ( ( b ) > ( heapSIZE_MAX / ( a ) ) ) ) + +/* Check if adding a and b will result in overflow. */ +#define heapADD_WILL_OVERFLOW( a, b ) ( ( a ) > ( heapSIZE_MAX - ( b ) ) ) + +/* Check if the subtraction operation ( a - b ) will result in underflow. */ +#define heapSUBTRACT_WILL_UNDERFLOW( a, b ) ( ( a ) < ( b ) ) + +/* MSB of the xBlockSize member of an BlockLink_t structure is used to track + * the allocation status of a block. When MSB of the xBlockSize member of + * an BlockLink_t structure is set then the block belongs to the application. + * When the bit is free the block is still part of the free heap space. */ +#define heapBLOCK_ALLOCATED_BITMASK ( ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 ) ) +#define heapBLOCK_SIZE_IS_VALID( xBlockSize ) ( ( ( xBlockSize ) & heapBLOCK_ALLOCATED_BITMASK ) == 0 ) +#define heapBLOCK_IS_ALLOCATED( pxBlock ) ( ( ( pxBlock->xBlockSize ) & heapBLOCK_ALLOCATED_BITMASK ) != 0 ) +#define heapALLOCATE_BLOCK( pxBlock ) ( ( pxBlock->xBlockSize ) |= heapBLOCK_ALLOCATED_BITMASK ) +#define heapFREE_BLOCK( pxBlock ) ( ( pxBlock->xBlockSize ) &= ~heapBLOCK_ALLOCATED_BITMASK ) + +/* Setting configENABLE_HEAP_PROTECTOR to 1 enables heap block pointers + * protection using an application supplied canary value to catch heap + * corruption should a heap buffer overflow occur. + */ +#if ( configENABLE_HEAP_PROTECTOR == 1 ) + +/* Macro to load/store BlockLink_t pointers to memory. By XORing the + * pointers with a random canary value, heap overflows will result + * in randomly unpredictable pointer values which will be caught by + * heapVALIDATE_BLOCK_POINTER assert. */ + #define heapPROTECT_BLOCK_POINTER( pxBlock ) ( ( BlockLink_t * ) ( ( ( portPOINTER_SIZE_TYPE ) ( pxBlock ) ) ^ xHeapCanary ) ) + +/* Assert that a heap block pointer is within the heap bounds. */ + #define heapVALIDATE_BLOCK_POINTER( pxBlock ) \ + configASSERT( ( pucHeapHighAddress != NULL ) && \ + ( pucHeapLowAddress != NULL ) && \ + ( ( uint8_t * ) ( pxBlock ) >= pucHeapLowAddress ) && \ + ( ( uint8_t * ) ( pxBlock ) < pucHeapHighAddress ) ) + +#else /* if ( configENABLE_HEAP_PROTECTOR == 1 ) */ + + #define heapPROTECT_BLOCK_POINTER( pxBlock ) ( pxBlock ) + + #define heapVALIDATE_BLOCK_POINTER( pxBlock ) + +#endif /* configENABLE_HEAP_PROTECTOR */ + +/*-----------------------------------------------------------*/ + +/* Define the linked list structure. This is used to link free blocks in order + * of their memory address. */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK * pxNextFreeBlock; /**< The next free block in the list. */ + size_t xBlockSize; /**< The size of the free block. */ +} BlockLink_t; + +/*-----------------------------------------------------------*/ + +/* + * Inserts a block of memory that is being freed into the correct position in + * the list of free memory blocks. The block being freed will be merged with + * the block in front it and/or the block behind it if the memory blocks are + * adjacent to each other. + */ +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ) PRIVILEGED_FUNCTION; +void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) PRIVILEGED_FUNCTION; + +#if ( configENABLE_HEAP_PROTECTOR == 1 ) + +/** + * @brief Application provided function to get a random value to be used as canary. + * + * @param pxHeapCanary [out] Output parameter to return the canary value. + */ + extern void vApplicationGetRandomHeapCanary( portPOINTER_SIZE_TYPE * pxHeapCanary ); +#endif /* configENABLE_HEAP_PROTECTOR */ + +/*-----------------------------------------------------------*/ + +/* The size of the structure placed at the beginning of each allocated memory + * block must by correctly byte aligned. */ +static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( portBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); + +/* Create a couple of list links to mark the start and end of the list. */ +PRIVILEGED_DATA static BlockLink_t xStart; +PRIVILEGED_DATA static BlockLink_t * pxEnd = NULL; + +/* Keeps track of the number of calls to allocate and free memory as well as the + * number of free bytes remaining, but says nothing about fragmentation. */ +PRIVILEGED_DATA static size_t xFreeBytesRemaining = 0U; +PRIVILEGED_DATA static size_t xMinimumEverFreeBytesRemaining = 0U; +PRIVILEGED_DATA static size_t xNumberOfSuccessfulAllocations = 0; +PRIVILEGED_DATA static size_t xNumberOfSuccessfulFrees = 0; + +#if ( configENABLE_HEAP_PROTECTOR == 1 ) + +/* Canary value for protecting internal heap pointers. */ + PRIVILEGED_DATA static portPOINTER_SIZE_TYPE xHeapCanary; + +/* Highest and lowest heap addresses used for heap block bounds checking. */ + PRIVILEGED_DATA static uint8_t * pucHeapHighAddress = NULL; + PRIVILEGED_DATA static uint8_t * pucHeapLowAddress = NULL; + +#endif /* configENABLE_HEAP_PROTECTOR */ + +/*-----------------------------------------------------------*/ + +void * pvPortMallocExt( size_t xWantedSize, unsigned int heapTag) /* << EST */ +{ + BlockLink_t * pxBlock; + BlockLink_t * pxPreviousBlock; + BlockLink_t * pxNewBlockLink; + void * pvReturn = NULL; + size_t xAdditionalRequiredSize; + + /* The heap must be initialised before the first call to + * pvPortMalloc(). */ + configASSERT( pxEnd ); + + if( xWantedSize > 0 ) + { + /* The wanted size must be increased so it can contain a BlockLink_t + * structure in addition to the requested amount of bytes. */ + if( heapADD_WILL_OVERFLOW( xWantedSize, xHeapStructSize ) == 0 ) + { + xWantedSize += xHeapStructSize; + + /* Ensure that blocks are always aligned to the required number + * of bytes. */ + if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 ) + { + /* Byte alignment required. */ + xAdditionalRequiredSize = portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ); + + if( heapADD_WILL_OVERFLOW( xWantedSize, xAdditionalRequiredSize ) == 0 ) + { + xWantedSize += xAdditionalRequiredSize; + } + else + { + xWantedSize = 0; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xWantedSize = 0; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + vTaskSuspendAll(); + { + /* Check the block size we are trying to allocate is not so large that the + * top bit is set. The top bit of the block size member of the BlockLink_t + * structure is used to determine who owns the block - the application or + * the kernel, so it must be free. */ + if( heapBLOCK_SIZE_IS_VALID( xWantedSize ) != 0 ) + { + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Traverse the list from the start (lowest address) block until + * one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = heapPROTECT_BLOCK_POINTER( xStart.pxNextFreeBlock ); + heapVALIDATE_BLOCK_POINTER( pxBlock ); + + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != heapPROTECT_BLOCK_POINTER( NULL ) ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = heapPROTECT_BLOCK_POINTER( pxBlock->pxNextFreeBlock ); + heapVALIDATE_BLOCK_POINTER( pxBlock ); + } + + /* If the end marker was reached then a block of adequate size + * was not found. */ + if( pxBlock != pxEnd ) + { + /* Return the memory space pointed to - jumping over the + * BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) heapPROTECT_BLOCK_POINTER( pxPreviousBlock->pxNextFreeBlock ) ) + xHeapStructSize ); + heapVALIDATE_BLOCK_POINTER( pvReturn ); + + /* This block is being returned for use so must be taken out + * of the list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into + * two. */ + configASSERT( heapSUBTRACT_WILL_UNDERFLOW( pxBlock->xBlockSize, xWantedSize ) == 0 ); + + if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new + * block following the number of bytes requested. The void + * cast is used to prevent byte alignment warnings from the + * compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + configASSERT( ( ( ( size_t ) pxNewBlockLink ) & portBYTE_ALIGNMENT_MASK ) == 0 ); + + /* Calculate the sizes of two blocks split from the + * single block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + pxNewBlockLink->pxNextFreeBlock = pxPreviousBlock->pxNextFreeBlock; + pxPreviousBlock->pxNextFreeBlock = heapPROTECT_BLOCK_POINTER( pxNewBlockLink ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned + * by the application and has no "next" block. */ + heapALLOCATE_BLOCK( pxBlock ); + pxBlock->pxNextFreeBlock = NULL; + xNumberOfSuccessfulAllocations++; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + if (heapTag!=(unsigned)-1) { + SEGGER_SYSVIEW_HeapAllocEx(&xStart, pvReturn, xWantedSize, heapTag); + } else { + SEGGER_SYSVIEW_HeapAlloc(&xStart, pvReturn, xWantedSize); + } +#else + traceMALLOC( pvReturn, xWantedSize ); +#endif + } + ( void ) xTaskResumeAll(); + + #if ( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + #if 1 /* << EST: Using configuration macro name for hook */ + extern void configUSE_MALLOC_FAILED_HOOK_NAME( void ); + configUSE_MALLOC_FAILED_HOOK_NAME(); + #else /* << EST */ + vApplicationMallocFailedHook(); + #endif + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* if ( configUSE_MALLOC_FAILED_HOOK == 1 ) */ + + configASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) portBYTE_ALIGNMENT_MASK ) == 0 ); + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void *pvPortMalloc(size_t xWantedSize) { /* << EST */ + return pvPortMallocExt(xWantedSize, -1); +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + uint8_t * puc = ( uint8_t * ) pv; + BlockLink_t * pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + * before it. */ + puc -= xHeapStructSize; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + heapVALIDATE_BLOCK_POINTER( pxLink ); + configASSERT( heapBLOCK_IS_ALLOCATED( pxLink ) != 0 ); + configASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( heapBLOCK_IS_ALLOCATED( pxLink ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + * allocated. */ + heapFREE_BLOCK( pxLink ); + #if ( configHEAP_CLEAR_MEMORY_ON_FREE == 1 ) + { + /* Check for underflow as this can occur if xBlockSize is + * overwritten in a heap block. */ + if( heapSUBTRACT_WILL_UNDERFLOW( pxLink->xBlockSize, xHeapStructSize ) == 0 ) + { + ( void ) memset( puc + xHeapStructSize, 0, pxLink->xBlockSize - xHeapStructSize ); + } + } + #endif + + vTaskSuspendAll(); + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + SEGGER_SYSVIEW_HeapFree(&xStart, pv); +#else + traceFREE( pv, pxLink->xBlockSize ); +#endif + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + xNumberOfSuccessfulFrees++; + } + ( void ) xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetMinimumEverFreeHeapSize( void ) +{ + return xMinimumEverFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +void * pvPortCalloc( size_t xNum, + size_t xSize ) +{ + void * pv = NULL; + + if( heapMULTIPLY_WILL_OVERFLOW( xNum, xSize ) == 0 ) + { + pv = pvPortMalloc( xNum * xSize); + + if( pv != NULL ) + { + ( void ) memset( pv, 0, xNum * xSize ); + } + } + + return pv; +} +/*-----------------------------------------------------------*/ + +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ) /* PRIVILEGED_FUNCTION */ +{ + BlockLink_t * pxIterator; + uint8_t * puc; + + /* Iterate through the list until a block is found that has a higher address + * than the block being inserted. */ + for( pxIterator = &xStart; heapPROTECT_BLOCK_POINTER( pxIterator->pxNextFreeBlock ) < pxBlockToInsert; pxIterator = heapPROTECT_BLOCK_POINTER( pxIterator->pxNextFreeBlock ) ) + { + /* Nothing to do here, just iterate to the right position. */ + } + + if( pxIterator != &xStart ) + { + heapVALIDATE_BLOCK_POINTER( pxIterator ); + } + + /* Do the block being inserted, and the block it is being inserted after + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) + { + pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; + pxBlockToInsert = pxIterator; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Do the block being inserted, and the block it is being inserted before + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxBlockToInsert; + + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) heapPROTECT_BLOCK_POINTER( pxIterator->pxNextFreeBlock ) ) + { + if( heapPROTECT_BLOCK_POINTER( pxIterator->pxNextFreeBlock ) != pxEnd ) + { + /* Form one big block from the two blocks. */ + pxBlockToInsert->xBlockSize += heapPROTECT_BLOCK_POINTER( pxIterator->pxNextFreeBlock )->xBlockSize; + pxBlockToInsert->pxNextFreeBlock = heapPROTECT_BLOCK_POINTER( pxIterator->pxNextFreeBlock )->pxNextFreeBlock; + } + else + { + pxBlockToInsert->pxNextFreeBlock = heapPROTECT_BLOCK_POINTER( pxEnd ); + } + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + } + + /* If the block being inserted plugged a gap, so was merged with the block + * before and the block after, then it's pxNextFreeBlock pointer will have + * already been set, and should not be set here as that would make it point + * to itself. */ + if( pxIterator != pxBlockToInsert ) + { + pxIterator->pxNextFreeBlock = heapPROTECT_BLOCK_POINTER( pxBlockToInsert ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) /* PRIVILEGED_FUNCTION */ +{ + BlockLink_t * pxFirstFreeBlockInRegion = NULL; + BlockLink_t * pxPreviousFreeBlock; + portPOINTER_SIZE_TYPE xAlignedHeap; + size_t xTotalRegionSize, xTotalHeapSize = 0; + BaseType_t xDefinedRegions = 0; + portPOINTER_SIZE_TYPE xAddress; + const HeapRegion_t * pxHeapRegion; + + /* Can only call once! */ + configASSERT( pxEnd == NULL ); + + #if ( configENABLE_HEAP_PROTECTOR == 1 ) + { + vApplicationGetRandomHeapCanary( &( xHeapCanary ) ); + } + #endif + + pxHeapRegion = &( pxHeapRegions[ xDefinedRegions ] ); + + while( pxHeapRegion->xSizeInBytes > 0 ) + { + xTotalRegionSize = pxHeapRegion->xSizeInBytes; + + /* Ensure the heap region starts on a correctly aligned boundary. */ + xAddress = ( portPOINTER_SIZE_TYPE ) pxHeapRegion->pucStartAddress; + + if( ( xAddress & portBYTE_ALIGNMENT_MASK ) != 0 ) + { + xAddress += ( portBYTE_ALIGNMENT - 1 ); + xAddress &= ~( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK; + + /* Adjust the size for the bytes lost to alignment. */ + xTotalRegionSize -= ( size_t ) ( xAddress - ( portPOINTER_SIZE_TYPE ) pxHeapRegion->pucStartAddress ); + } + + xAlignedHeap = xAddress; + + /* Set xStart if it has not already been set. */ + if( xDefinedRegions == 0 ) + { + /* xStart is used to hold a pointer to the first item in the list of + * free blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( BlockLink_t * ) heapPROTECT_BLOCK_POINTER( xAlignedHeap ); + xStart.xBlockSize = ( size_t ) 0; + } + else + { + /* Should only get here if one region has already been added to the + * heap. */ + configASSERT( pxEnd != heapPROTECT_BLOCK_POINTER( NULL ) ); + + /* Check blocks are passed in with increasing start addresses. */ + configASSERT( ( size_t ) xAddress > ( size_t ) pxEnd ); + } + + #if ( configENABLE_HEAP_PROTECTOR == 1 ) + { + if( ( pucHeapLowAddress == NULL ) || + ( ( uint8_t * ) xAlignedHeap < pucHeapLowAddress ) ) + { + pucHeapLowAddress = ( uint8_t * ) xAlignedHeap; + } + } + #endif /* configENABLE_HEAP_PROTECTOR */ + + /* Remember the location of the end marker in the previous region, if + * any. */ + pxPreviousFreeBlock = pxEnd; + + /* pxEnd is used to mark the end of the list of free blocks and is + * inserted at the end of the region space. */ + xAddress = xAlignedHeap + ( portPOINTER_SIZE_TYPE ) xTotalRegionSize; + xAddress -= ( portPOINTER_SIZE_TYPE ) xHeapStructSize; + xAddress &= ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ); + pxEnd = ( BlockLink_t * ) xAddress; + pxEnd->xBlockSize = 0; + pxEnd->pxNextFreeBlock = heapPROTECT_BLOCK_POINTER( NULL ); + + /* To start with there is a single free block in this region that is + * sized to take up the entire heap region minus the space taken by the + * free block structure. */ + pxFirstFreeBlockInRegion = ( BlockLink_t * ) xAlignedHeap; + pxFirstFreeBlockInRegion->xBlockSize = ( size_t ) ( xAddress - ( portPOINTER_SIZE_TYPE ) pxFirstFreeBlockInRegion ); + pxFirstFreeBlockInRegion->pxNextFreeBlock = heapPROTECT_BLOCK_POINTER( pxEnd ); + + /* If this is not the first region that makes up the entire heap space + * then link the previous region to this region. */ + if( pxPreviousFreeBlock != NULL ) + { + pxPreviousFreeBlock->pxNextFreeBlock = heapPROTECT_BLOCK_POINTER( pxFirstFreeBlockInRegion ); + } + + xTotalHeapSize += pxFirstFreeBlockInRegion->xBlockSize; + + #if ( configENABLE_HEAP_PROTECTOR == 1 ) + { + if( ( pucHeapHighAddress == NULL ) || + ( ( ( ( uint8_t * ) pxFirstFreeBlockInRegion ) + pxFirstFreeBlockInRegion->xBlockSize ) > pucHeapHighAddress ) ) + { + pucHeapHighAddress = ( ( uint8_t * ) pxFirstFreeBlockInRegion ) + pxFirstFreeBlockInRegion->xBlockSize; + } + } + #endif + + /* Move onto the next HeapRegion_t structure. */ + xDefinedRegions++; + pxHeapRegion = &( pxHeapRegions[ xDefinedRegions ] ); + } + + xMinimumEverFreeBytesRemaining = xTotalHeapSize; + xFreeBytesRemaining = xTotalHeapSize; + +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + SEGGER_SYSVIEW_HeapDefine(&xStart, xStart.pxNextFreeBlock, xTotalHeapSize, sizeof(BlockLink_t)); + SEGGER_SYSVIEW_NameResource((uint32_t)&xStart, "heap5"); +#endif + /* Check something was actually defined before it is accessed. */ + configASSERT( xTotalHeapSize ); +} +/*-----------------------------------------------------------*/ + +void vPortGetHeapStats( HeapStats_t * pxHeapStats ) +{ + BlockLink_t * pxBlock; + size_t xBlocks = 0, xMaxSize = 0, xMinSize = portMAX_DELAY; /* portMAX_DELAY used as a portable way of getting the maximum value. */ + + vTaskSuspendAll(); + { + pxBlock = heapPROTECT_BLOCK_POINTER( xStart.pxNextFreeBlock ); + + /* pxBlock will be NULL if the heap has not been initialised. The heap + * is initialised automatically when the first allocation is made. */ + if( pxBlock != NULL ) + { + while( pxBlock != pxEnd ) + { + /* Increment the number of blocks and record the largest block seen + * so far. */ + xBlocks++; + + if( pxBlock->xBlockSize > xMaxSize ) + { + xMaxSize = pxBlock->xBlockSize; + } + + /* Heap five will have a zero sized block at the end of each + * each region - the block is only used to link to the next + * heap region so it not a real block. */ + if( pxBlock->xBlockSize != 0 ) + { + if( pxBlock->xBlockSize < xMinSize ) + { + xMinSize = pxBlock->xBlockSize; + } + } + + /* Move to the next block in the chain until the last block is + * reached. */ + pxBlock = heapPROTECT_BLOCK_POINTER( pxBlock->pxNextFreeBlock ); + } + } + } + ( void ) xTaskResumeAll(); + + pxHeapStats->xSizeOfLargestFreeBlockInBytes = xMaxSize; + pxHeapStats->xSizeOfSmallestFreeBlockInBytes = xMinSize; + pxHeapStats->xNumberOfFreeBlocks = xBlocks; + + taskENTER_CRITICAL(); + { + pxHeapStats->xAvailableHeapSpaceInBytes = xFreeBytesRemaining; + pxHeapStats->xNumberOfSuccessfulAllocations = xNumberOfSuccessfulAllocations; + pxHeapStats->xNumberOfSuccessfulFrees = xNumberOfSuccessfulFrees; + pxHeapStats->xMinimumEverFreeBytesRemaining = xMinimumEverFreeBytesRemaining; + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ +#if 1 /* << EST */ +void vPortInitializeHeap(void) { + xStart.pxNextFreeBlock = NULL; + xStart.xBlockSize = 0; + pxEnd = NULL; +} +#endif + +/*-----------------------------------------------------------*/ + +#endif /* configUSE_HEAP_SCHEME==5 */ /* << EST */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/MemMang/heap_useNewlib.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/MemMang/heap_useNewlib.c new file mode 100644 index 0000000..d6813cc --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/MemMang/heap_useNewlib.c @@ -0,0 +1,235 @@ +/* Copyright (C) Dave Nadler 2017, All Rights Reserved. */ +#include "FreeRTOSConfig.h" +#if !defined(configUSE_HEAP_SCHEME) || (configUSE_HEAP_SCHEME==6) +/** + * \file heap_useNewlib.c + * \brief Wrappers required to use newlib malloc-family within FreeRTOS. + * + * \par Overview + * Route FreeRTOS memory management functions to newlib's malloc family. + * Thus newlib and FreeRTOS share memory-management routines and memory pool, + * and all newlib's internal memory-management requirements are supported. + * + * \author Dave Nadler + * \date 1-July-2017 + * + * \see https://sourceware.org/newlib/libc.html#Reentrancy + * \see https://sourceware.org/newlib/libc.html#malloc + * \see https://sourceware.org/newlib/libc.html#index-_005f_005fenv_005flock + * \see https://sourceware.org/newlib/libc.html#index-_005f_005fmalloc_005flock + * \see https://sourceforge.net/p/freertos/feature-requests/72/ + * \see http://www.billgatliff.com/newlib.html + * \see http://wiki.osdev.org/Porting_Newlib + * \see http://www.embecosm.com/appnotes/ean9/ean9-howto-newlib-1.0.html + * + * + * \copyright + * (c) Dave Nadler 2017, All Rights Reserved. + * Web: http://www.nadler.com + * email: drn@nadler.com + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * - Use or redistributions of source code must retain the above copyright notice, + * this list of conditions, ALL ORIGINAL COMMENTS, and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include // maps to newlib... +#include // mallinfo... +#include // ENOMEM + +#include "FreeRTOS.h" // defines public interface we're implementing here +#if !defined(configUSE_NEWLIB_REENTRANT) || (configUSE_NEWLIB_REENTRANT!=1) + #warning "#define configUSE_NEWLIB_REENTRANT 1 // Required for thread-safety of newlib sprintf, strtok, etc..." + // If you're *really* sure you don't need FreeRTOS's newlib reentrancy support, remove this warning... +#endif +#include "task.h" +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + #include "SEGGER_SYSVIEW_Conf.h" + #include "SEGGER_SYSVIEW.h" +#endif + +// ================================================================================================ +// External routines required by newlib's malloc (sbrk/_sbrk, __malloc_lock/unlock) +// ================================================================================================ + +#if 0 // suggested minimal implementation from https://sourceware.org/newlib/libc.html#Syscalls: + // sbrk: Increase program data space. As malloc and related functions depend on this, + // it is useful to have a working implementation. The following suffices for a standalone system; + // it exploits the symbol _end automatically defined by the GNU linker. + caddr_t sbrk(int incr) { + extern char _end; /* Defined by the linker */ + static char *heap_end; + char *prev_heap_end; + if (heap_end == 0) { + heap_end = &_end; + } + prev_heap_end = heap_end; + if (heap_end + incr > stack_ptr) { + write (1, "Heap and stack collision\n", 25); + abort (); + } + heap_end += incr; + return (caddr_t) prev_heap_end; + } +#endif +#if 0 // Freescale implementation + caddr_t _sbrk(int incr) + { + extern char end __asm("end"); + extern char heap_limit __asm("__HeapLimit"); + static char *heap_end; + char *prev_heap_end; + if (heap_end == NULL) + heap_end = &end; + prev_heap_end = heap_end; + if (heap_end + incr > &heap_limit) + { + errno = ENOMEM; + return (caddr_t)-1; + } + heap_end += incr; + return (caddr_t)prev_heap_end; + } +#endif + +#ifndef NDEBUG + static int totalBytesProvidedBySBRK = 0; +#endif +extern char configLINKER_HEAP_BASE_SYMBOL, configLINKER_HEAP_LIMIT_SYMBOL, configLINKER_HEAP_SIZE_SYMBOL; // make sure to define these symbols in linker command file +static int heapBytesRemaining = (int)&configLINKER_HEAP_SIZE_SYMBOL; // that's (&__HeapLimit)-(&__HeapBase) + +//! sbrk/_sbrk version supporting reentrant newlib (depends upon above symbols defined by linker control file). +char * sbrk(int incr) { + static char *currentHeapEnd = &configLINKER_HEAP_BASE_SYMBOL; + vTaskSuspendAll(); // Note: safe to use before FreeRTOS scheduler started +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + if (currentHeapEnd == &configLINKER_HEAP_BASE_SYMBOL && incr!=0) { + /* first call */ + SEGGER_SYSVIEW_HeapDefine(&configLINKER_HEAP_BASE_SYMBOL, &configLINKER_HEAP_BASE_SYMBOL, (int)&configLINKER_HEAP_SIZE_SYMBOL, 0); + SEGGER_SYSVIEW_NameResource(&configLINKER_HEAP_BASE_SYMBOL, "heapNewLib"); + } +#endif + char *previousHeapEnd = currentHeapEnd; + if (currentHeapEnd + incr > &configLINKER_HEAP_LIMIT_SYMBOL) { + #if( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + extern void configUSE_MALLOC_FAILED_HOOK_NAME( void ); + configUSE_MALLOC_FAILED_HOOK_NAME(); + } + #elif 0 + // If you want to alert debugger or halt... + while(1) { __asm("bkpt #0"); }; // Stop in GUI as if at a breakpoint (if debugging, otherwise loop forever) + #else + // If you prefer to believe your application will gracefully trap out-of-memory... + _impure_ptr->_errno = ENOMEM; // newlib's thread-specific errno + xTaskResumeAll(); + #endif + return (char *)-1; // the malloc-family routine that called sbrk will return 0 + } + currentHeapEnd += incr; + heapBytesRemaining -= incr; + #ifndef NDEBUG + totalBytesProvidedBySBRK += incr; + #endif + xTaskResumeAll(); + return (char *) previousHeapEnd; +} +//! Synonym for sbrk. +char * _sbrk(int incr) { return sbrk(incr); }; + +void __malloc_lock(struct _reent *p) { vTaskSuspendAll(); }; +void __malloc_unlock(struct _reent *p) { (void)xTaskResumeAll(); }; + +// newlib also requires implementing locks for the application's environment memory space, +// accessed by newlib's setenv() and getenv() functions. +// As these are trivial functions, momentarily suspend task switching (rather than semaphore). +// ToDo: Move __env_lock/unlock to a separate newlib helper file. +void __env_lock() { vTaskSuspendAll(); }; +void __env_unlock() { (void)xTaskResumeAll(); }; + +/// /brief Wrap malloc/malloc_r to help debug who requests memory and why. +/// Add to the linker command line: -Xlinker --wrap=malloc -Xlinker --wrap=_malloc_r +// Note: These functions are normally unused and stripped by linker. +void *__wrap_malloc(size_t nbytes) { + extern void * __real_malloc(size_t nbytes); + void *p = __real_malloc(nbytes); // Solely for debug breakpoint... + return p; +}; +void *__wrap__malloc_r(void *reent, size_t nbytes) { + extern void * __real__malloc_r(size_t nbytes); + void *p = __real__malloc_r(nbytes); // Solely for debug breakpoint... + return p; +}; + + +// ================================================================================================ +// Implement FreeRTOS's memory API using newlib-provided malloc family. +// ================================================================================================ + +void *pvPortMallocExt( size_t xSize, unsigned int heapTag) PRIVILEGED_FUNCTION { /* << EST */ + void *p = malloc(xSize); +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + if (heapTag!=(unsigned)-1) { + SEGGER_SYSVIEW_HeapAllocEx(&configLINKER_HEAP_BASE_SYMBOL, p, xSize, heapTag); + } else { + SEGGER_SYSVIEW_HeapAlloc(&configLINKER_HEAP_BASE_SYMBOL, p, xSize); + } +#else + traceMALLOC(p, xSize ); +#endif + return p; +} +/*-----------------------------------------------------------*/ + +void *pvPortMalloc(size_t xWantedSize) { /* << EST */ + return pvPortMallocExt(xWantedSize, -1); +} + +void vPortFree( void *pv ) PRIVILEGED_FUNCTION { + free(pv); +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + SEGGER_SYSVIEW_HeapFree(&configLINKER_HEAP_BASE_SYMBOL, pv); +#else + traceFREE(pv, 0); +#endif +}; + +size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION { + struct mallinfo mi = mallinfo(); + return mi.fordblks + heapBytesRemaining; +} + +// GetMinimumEverFree is not available in newlib's malloc implementation. +// So, no implementation provided: size_t xPortGetMinimumEverFreeHeapSize( void ) PRIVILEGED_FUNCTION; + +//! No implementation needed, but stub provided in case application already calls vPortInitialiseBlocks +void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION {}; + +/*-----------------------------------------------------------*/ +#if 1 /* << EST */ +void vPortInitializeHeap(void) { +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + SEGGER_SYSVIEW_HeapDefine(&configLINKER_HEAP_BASE_SYMBOL, &configLINKER_HEAP_BASE_SYMBOL, sizeof(ucHeap), sizeof(BlockLink_t)); + SEGGER_SYSVIEW_NameResource(&configLINKER_HEAP_BASE_SYMBOL, "heapNewLib"); +#endif +} +#endif + +#endif /* !defined(configUSE_HEAP_SCHEME) || (configUSE_HEAP_SCHEME==6) */ diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/MemMang/heap_useNewlib.txt b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/MemMang/heap_useNewlib.txt new file mode 100644 index 0000000..e0ddeb9 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/portable/MemMang/heap_useNewlib.txt @@ -0,0 +1,7 @@ +heap_useNewlib.txt +------------------ + +For details, see +- http://www.nadler.com/embedded/newlibAndFreeRTOS.html +- http://mcuoneclipse.com/2017/07/02/using-freertos-with-newlib-and-newlib-nano + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/queue.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/queue.c new file mode 100644 index 0000000..dd2ea63 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/queue.c @@ -0,0 +1,3359 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" + +#if ( configUSE_CO_ROUTINES == 1 ) + #include "croutine.h" +#endif + +/* The MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined + * for the header files above, but not in this file, in order to generate the + * correct privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + + +/* Constants used with the cRxLock and cTxLock structure members. */ +#define queueUNLOCKED ( ( int8_t ) -1 ) +#define queueLOCKED_UNMODIFIED ( ( int8_t ) 0 ) +#define queueINT8_MAX ( ( int8_t ) 127 ) + +/* When the Queue_t structure is used to represent a base queue its pcHead and + * pcTail members are used as pointers into the queue storage area. When the + * Queue_t structure is used to represent a mutex pcHead and pcTail pointers are + * not necessary, and the pcHead pointer is set to NULL to indicate that the + * structure instead holds a pointer to the mutex holder (if any). Map alternative + * names to the pcHead and structure member to ensure the readability of the code + * is maintained. The QueuePointers_t and SemaphoreData_t types are used to form + * a union as their usage is mutually exclusive dependent on what the queue is + * being used for. */ +#define uxQueueType pcHead +#define queueQUEUE_IS_MUTEX NULL + +typedef struct QueuePointers +{ + int8_t * pcTail; /**< Points to the byte at the end of the queue storage area. Once more byte is allocated than necessary to store the queue items, this is used as a marker. */ + int8_t * pcReadFrom; /**< Points to the last place that a queued item was read from when the structure is used as a queue. */ +} QueuePointers_t; + +typedef struct SemaphoreData +{ + TaskHandle_t xMutexHolder; /**< The handle of the task that holds the mutex. */ + UBaseType_t uxRecursiveCallCount; /**< Maintains a count of the number of times a recursive mutex has been recursively 'taken' when the structure is used as a mutex. */ +} SemaphoreData_t; + +/* Semaphores do not actually store or copy data, so have an item size of + * zero. */ +#define queueSEMAPHORE_QUEUE_ITEM_LENGTH ( ( UBaseType_t ) 0 ) +#define queueMUTEX_GIVE_BLOCK_TIME ( ( TickType_t ) 0U ) + +#if ( configUSE_PREEMPTION == 0 ) + +/* If the cooperative scheduler is being used then a yield should not be + * performed just because a higher priority task has been woken. */ + #define queueYIELD_IF_USING_PREEMPTION() +#else + #if ( configNUMBER_OF_CORES == 1 ) + #define queueYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API() + #else /* #if ( configNUMBER_OF_CORES == 1 ) */ + #define queueYIELD_IF_USING_PREEMPTION() vTaskYieldWithinAPI() + #endif /* #if ( configNUMBER_OF_CORES == 1 ) */ +#endif + +/* + * Definition of the queue used by the scheduler. + * Items are queued by copy, not reference. See the following link for the + * rationale: https://www.FreeRTOS.org/Embedded-RTOS-Queues.html + */ +typedef struct QueueDefinition /* The old naming convention is used to prevent breaking kernel aware debuggers. */ +{ + int8_t * pcHead; /**< Points to the beginning of the queue storage area. */ + int8_t * pcWriteTo; /**< Points to the free next place in the storage area. */ + + union + { + QueuePointers_t xQueue; /**< Data required exclusively when this structure is used as a queue. */ + SemaphoreData_t xSemaphore; /**< Data required exclusively when this structure is used as a semaphore. */ + } u; + + List_t xTasksWaitingToSend; /**< List of tasks that are blocked waiting to post onto this queue. Stored in priority order. */ + List_t xTasksWaitingToReceive; /**< List of tasks that are blocked waiting to read from this queue. Stored in priority order. */ + + volatile UBaseType_t uxMessagesWaiting; /**< The number of items currently in the queue. */ + UBaseType_t uxLength; /**< The length of the queue defined as the number of items it will hold, not the number of bytes. */ + UBaseType_t uxItemSize; /**< The size of each items that the queue will hold. */ + + volatile int8_t cRxLock; /**< Stores the number of items received from the queue (removed from the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ + volatile int8_t cTxLock; /**< Stores the number of items transmitted to the queue (added to the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ + + #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucStaticallyAllocated; /**< Set to pdTRUE if the memory used by the queue was statically allocated to ensure no attempt is made to free the memory. */ + #endif + + #if ( configUSE_QUEUE_SETS == 1 ) + struct QueueDefinition * pxQueueSetContainer; + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxQueueNumber; + uint8_t ucQueueType; + #endif +} xQUEUE; + +/* The old xQUEUE name is maintained above then typedefed to the new Queue_t + * name below to enable the use of older kernel aware debuggers. */ +typedef xQUEUE Queue_t; + +/*-----------------------------------------------------------*/ + +/* + * The queue registry is just a means for kernel aware debuggers to locate + * queue structures. It has no other purpose so is an optional component. + */ +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + +/* The type stored within the queue registry array. This allows a name + * to be assigned to each queue making kernel aware debugging a little + * more user friendly. */ + typedef struct QUEUE_REGISTRY_ITEM + { + const char * pcQueueName; + QueueHandle_t xHandle; + } xQueueRegistryItem; + +/* The old xQueueRegistryItem name is maintained above then typedefed to the + * new xQueueRegistryItem name below to enable the use of older kernel aware + * debuggers. */ + typedef xQueueRegistryItem QueueRegistryItem_t; + +/* The queue registry is simply an array of QueueRegistryItem_t structures. + * The pcQueueName member of a structure being NULL is indicative of the + * array position being vacant. */ + +/* MISRA Ref 8.4.2 [Declaration shall be visible] */ +/* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-84 */ +/* coverity[misra_c_2012_rule_8_4_violation] */ + PRIVILEGED_DATA QueueRegistryItem_t xQueueRegistry[ configQUEUE_REGISTRY_SIZE ]; + +#endif /* configQUEUE_REGISTRY_SIZE */ + +/* + * Unlocks a queue locked by a call to prvLockQueue. Locking a queue does not + * prevent an ISR from adding or removing items to the queue, but does prevent + * an ISR from removing tasks from the queue event lists. If an ISR finds a + * queue is locked it will instead increment the appropriate queue lock count + * to indicate that a task may require unblocking. When the queue in unlocked + * these lock counts are inspected, and the appropriate action taken. + */ +static void prvUnlockQueue( Queue_t * const pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Uses a critical section to determine if there is any data in a queue. + * + * @return pdTRUE if the queue contains no items, otherwise pdFALSE. + */ +static BaseType_t prvIsQueueEmpty( const Queue_t * pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Uses a critical section to determine if there is any space in a queue. + * + * @return pdTRUE if there is no space, otherwise pdFALSE; + */ +static BaseType_t prvIsQueueFull( const Queue_t * pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Copies an item into the queue, either at the front of the queue or the + * back of the queue. + */ +static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, + const void * pvItemToQueue, + const BaseType_t xPosition ) PRIVILEGED_FUNCTION; + +/* + * Copies an item out of a queue. + */ +static void prvCopyDataFromQueue( Queue_t * const pxQueue, + void * const pvBuffer ) PRIVILEGED_FUNCTION; + +#if ( configUSE_QUEUE_SETS == 1 ) + +/* + * Checks to see if a queue is a member of a queue set, and if so, notifies + * the queue set that the queue contains data. + */ + static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue ) PRIVILEGED_FUNCTION; +#endif + +/* + * Called after a Queue_t structure has been allocated either statically or + * dynamically to fill in the structure's members. + */ +static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + uint8_t * pucQueueStorage, + const uint8_t ucQueueType, + Queue_t * pxNewQueue ) PRIVILEGED_FUNCTION; + +/* + * Mutexes are a special type of queue. When a mutex is created, first the + * queue is created, then prvInitialiseMutex() is called to configure the queue + * as a mutex. + */ +#if ( configUSE_MUTEXES == 1 ) + static void prvInitialiseMutex( Queue_t * pxNewQueue ) PRIVILEGED_FUNCTION; +#endif + +#if ( configUSE_MUTEXES == 1 ) + +/* + * If a task waiting for a mutex causes the mutex holder to inherit a + * priority, but the waiting task times out, then the holder should + * disinherit the priority - but only down to the highest priority of any + * other tasks that are waiting for the same mutex. This function returns + * that priority. + */ + static UBaseType_t prvGetDisinheritPriorityAfterTimeout( const Queue_t * const pxQueue ) PRIVILEGED_FUNCTION; +#endif +/*-----------------------------------------------------------*/ + +/* + * Macro to mark a queue as locked. Locking a queue prevents an ISR from + * accessing the queue event lists. + */ +#define prvLockQueue( pxQueue ) \ + taskENTER_CRITICAL(); \ + { \ + if( ( pxQueue )->cRxLock == queueUNLOCKED ) \ + { \ + ( pxQueue )->cRxLock = queueLOCKED_UNMODIFIED; \ + } \ + if( ( pxQueue )->cTxLock == queueUNLOCKED ) \ + { \ + ( pxQueue )->cTxLock = queueLOCKED_UNMODIFIED; \ + } \ + } \ + taskEXIT_CRITICAL() + +/* + * Macro to increment cTxLock member of the queue data structure. It is + * capped at the number of tasks in the system as we cannot unblock more + * tasks than the number of tasks in the system. + */ +#define prvIncrementQueueTxLock( pxQueue, cTxLock ) \ + do { \ + const UBaseType_t uxNumberOfTasks = uxTaskGetNumberOfTasks(); \ + if( ( UBaseType_t ) ( cTxLock ) < uxNumberOfTasks ) \ + { \ + configASSERT( ( cTxLock ) != queueINT8_MAX ); \ + ( pxQueue )->cTxLock = ( int8_t ) ( ( cTxLock ) + ( int8_t ) 1 ); \ + } \ + } while( 0 ) + +/* + * Macro to increment cRxLock member of the queue data structure. It is + * capped at the number of tasks in the system as we cannot unblock more + * tasks than the number of tasks in the system. + */ +#define prvIncrementQueueRxLock( pxQueue, cRxLock ) \ + do { \ + const UBaseType_t uxNumberOfTasks = uxTaskGetNumberOfTasks(); \ + if( ( UBaseType_t ) ( cRxLock ) < uxNumberOfTasks ) \ + { \ + configASSERT( ( cRxLock ) != queueINT8_MAX ); \ + ( pxQueue )->cRxLock = ( int8_t ) ( ( cRxLock ) + ( int8_t ) 1 ); \ + } \ + } while( 0 ) +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGenericReset( QueueHandle_t xQueue, + BaseType_t xNewQueue ) +{ + BaseType_t xReturn = pdPASS; + Queue_t * const pxQueue = xQueue; + + traceENTER_xQueueGenericReset( xQueue, xNewQueue ); + + configASSERT( pxQueue ); + + if( ( pxQueue != NULL ) && + ( pxQueue->uxLength >= 1U ) && + /* Check for multiplication overflow. */ + ( ( SIZE_MAX / pxQueue->uxLength ) >= pxQueue->uxItemSize ) ) + { + taskENTER_CRITICAL(); + { + pxQueue->u.xQueue.pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize ); + pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U; + pxQueue->pcWriteTo = pxQueue->pcHead; + pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - 1U ) * pxQueue->uxItemSize ); + pxQueue->cRxLock = queueUNLOCKED; + pxQueue->cTxLock = queueUNLOCKED; + + if( xNewQueue == pdFALSE ) + { + /* If there are tasks blocked waiting to read from the queue, then + * the tasks will remain blocked as after this function exits the queue + * will still be empty. If there are tasks blocked waiting to write to + * the queue, then one should be unblocked as after this function exits + * it will be possible to write to it. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Ensure the event queues start in the correct state. */ + vListInitialise( &( pxQueue->xTasksWaitingToSend ) ); + vListInitialise( &( pxQueue->xTasksWaitingToReceive ) ); + } + } + taskEXIT_CRITICAL(); + } + else + { + xReturn = pdFAIL; + } + + configASSERT( xReturn != pdFAIL ); + + /* A value is returned for calling semantic consistency with previous + * versions. */ + traceRETURN_xQueueGenericReset( xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + + QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + uint8_t * pucQueueStorage, + StaticQueue_t * pxStaticQueue, + const uint8_t ucQueueType ) + { + Queue_t * pxNewQueue = NULL; + + traceENTER_xQueueGenericCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxStaticQueue, ucQueueType ); + + /* The StaticQueue_t structure and the queue storage area must be + * supplied. */ + configASSERT( pxStaticQueue ); + + if( ( uxQueueLength > ( UBaseType_t ) 0 ) && + ( pxStaticQueue != NULL ) && + + /* A queue storage area should be provided if the item size is not 0, and + * should not be provided if the item size is 0. */ + ( !( ( pucQueueStorage != NULL ) && ( uxItemSize == 0U ) ) ) && + ( !( ( pucQueueStorage == NULL ) && ( uxItemSize != 0U ) ) ) ) + { + #if ( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + * variable of type StaticQueue_t or StaticSemaphore_t equals the size of + * the real queue and semaphore structures. */ + volatile size_t xSize = sizeof( StaticQueue_t ); + + /* This assertion cannot be branch covered in unit tests */ + configASSERT( xSize == sizeof( Queue_t ) ); /* LCOV_EXCL_BR_LINE */ + ( void ) xSize; /* Prevent unused variable warning when configASSERT() is not defined. */ + } + #endif /* configASSERT_DEFINED */ + + /* The address of a statically allocated queue was passed in, use it. + * The address of a statically allocated storage area was also passed in + * but is already set. */ + /* MISRA Ref 11.3.1 [Misaligned access] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */ + /* coverity[misra_c_2012_rule_11_3_violation] */ + pxNewQueue = ( Queue_t * ) pxStaticQueue; + + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* Queues can be allocated wither statically or dynamically, so + * note this queue was allocated statically in case the queue is + * later deleted. */ + pxNewQueue->ucStaticallyAllocated = pdTRUE; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + + prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue ); + } + else + { + configASSERT( pxNewQueue ); + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_xQueueGenericCreateStatic( pxNewQueue ); + + return pxNewQueue; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + + BaseType_t xQueueGenericGetStaticBuffers( QueueHandle_t xQueue, + uint8_t ** ppucQueueStorage, + StaticQueue_t ** ppxStaticQueue ) + { + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; + + traceENTER_xQueueGenericGetStaticBuffers( xQueue, ppucQueueStorage, ppxStaticQueue ); + + configASSERT( pxQueue ); + configASSERT( ppxStaticQueue ); + + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* Check if the queue was statically allocated. */ + if( pxQueue->ucStaticallyAllocated == ( uint8_t ) pdTRUE ) + { + if( ppucQueueStorage != NULL ) + { + *ppucQueueStorage = ( uint8_t * ) pxQueue->pcHead; + } + + /* MISRA Ref 11.3.1 [Misaligned access] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */ + /* coverity[misra_c_2012_rule_11_3_violation] */ + *ppxStaticQueue = ( StaticQueue_t * ) pxQueue; + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + #else /* configSUPPORT_DYNAMIC_ALLOCATION */ + { + /* Queue must have been statically allocated. */ + if( ppucQueueStorage != NULL ) + { + *ppucQueueStorage = ( uint8_t * ) pxQueue->pcHead; + } + + *ppxStaticQueue = ( StaticQueue_t * ) pxQueue; + xReturn = pdTRUE; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + + traceRETURN_xQueueGenericGetStaticBuffers( xReturn ); + + return xReturn; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + const uint8_t ucQueueType ) + { + Queue_t * pxNewQueue = NULL; + size_t xQueueSizeInBytes; + uint8_t * pucQueueStorage; + + traceENTER_xQueueGenericCreate( uxQueueLength, uxItemSize, ucQueueType ); + + if( ( uxQueueLength > ( UBaseType_t ) 0 ) && + /* Check for multiplication overflow. */ + ( ( SIZE_MAX / uxQueueLength ) >= uxItemSize ) && + /* Check for addition overflow. */ + ( ( UBaseType_t ) ( SIZE_MAX - sizeof( Queue_t ) ) >= ( uxQueueLength * uxItemSize ) ) ) + { + /* Allocate enough space to hold the maximum number of items that + * can be in the queue at any time. It is valid for uxItemSize to be + * zero in the case the queue is used as a semaphore. */ + xQueueSizeInBytes = ( size_t ) ( ( size_t ) uxQueueLength * ( size_t ) uxItemSize ); + + /* MISRA Ref 11.5.1 [Malloc memory assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) + xQueueSizeInBytes ); + + if( pxNewQueue != NULL ) + { + /* Jump past the queue structure to find the location of the queue + * storage area. */ + pucQueueStorage = ( uint8_t * ) pxNewQueue; + pucQueueStorage += sizeof( Queue_t ); + + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* Queues can be created either statically or dynamically, so + * note this task was created dynamically in case it is later + * deleted. */ + pxNewQueue->ucStaticallyAllocated = pdFALSE; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + + prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue ); + } + else + { + traceQUEUE_CREATE_FAILED( ucQueueType ); + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + configASSERT( pxNewQueue ); + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_xQueueGenericCreate( pxNewQueue ); + + return pxNewQueue; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + uint8_t * pucQueueStorage, + const uint8_t ucQueueType, + Queue_t * pxNewQueue ) +{ + /* Remove compiler warnings about unused parameters should + * configUSE_TRACE_FACILITY not be set to 1. */ + ( void ) ucQueueType; + + if( uxItemSize == ( UBaseType_t ) 0 ) + { + /* No RAM was allocated for the queue storage area, but PC head cannot + * be set to NULL because NULL is used as a key to say the queue is used as + * a mutex. Therefore just set pcHead to point to the queue as a benign + * value that is known to be within the memory map. */ + pxNewQueue->pcHead = ( int8_t * ) pxNewQueue; + } + else + { + /* Set the head to the start of the queue storage area. */ + pxNewQueue->pcHead = ( int8_t * ) pucQueueStorage; + } + + /* Initialise the queue members as described where the queue type is + * defined. */ + pxNewQueue->uxLength = uxQueueLength; + pxNewQueue->uxItemSize = uxItemSize; + ( void ) xQueueGenericReset( pxNewQueue, pdTRUE ); + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + pxNewQueue->ucQueueType = ucQueueType; + } + #endif /* configUSE_TRACE_FACILITY */ + + #if ( configUSE_QUEUE_SETS == 1 ) + { + pxNewQueue->pxQueueSetContainer = NULL; + } + #endif /* configUSE_QUEUE_SETS */ + + traceQUEUE_CREATE( pxNewQueue ); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + static void prvInitialiseMutex( Queue_t * pxNewQueue ) + { + if( pxNewQueue != NULL ) + { + /* The queue create function will set all the queue structure members + * correctly for a generic queue, but this function is creating a + * mutex. Overwrite those members that need to be set differently - + * in particular the information required for priority inheritance. */ + pxNewQueue->u.xSemaphore.xMutexHolder = NULL; + pxNewQueue->uxQueueType = queueQUEUE_IS_MUTEX; + + /* In case this is a recursive mutex. */ + pxNewQueue->u.xSemaphore.uxRecursiveCallCount = 0; + + traceCREATE_MUTEX( pxNewQueue ); + + /* Start with the semaphore in the expected state. */ + ( void ) xQueueGenericSend( pxNewQueue, NULL, ( TickType_t ) 0U, queueSEND_TO_BACK ); + } + else + { + traceCREATE_MUTEX_FAILED(); + } + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) + { + QueueHandle_t xNewQueue; + const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0; + + traceENTER_xQueueCreateMutex( ucQueueType ); + + xNewQueue = xQueueGenericCreate( uxMutexLength, uxMutexSize, ucQueueType ); + prvInitialiseMutex( ( Queue_t * ) xNewQueue ); + + traceRETURN_xQueueCreateMutex( xNewQueue ); + + return xNewQueue; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, + StaticQueue_t * pxStaticQueue ) + { + QueueHandle_t xNewQueue; + const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0; + + traceENTER_xQueueCreateMutexStatic( ucQueueType, pxStaticQueue ); + + /* Prevent compiler warnings about unused parameters if + * configUSE_TRACE_FACILITY does not equal 1. */ + ( void ) ucQueueType; + + xNewQueue = xQueueGenericCreateStatic( uxMutexLength, uxMutexSize, NULL, pxStaticQueue, ucQueueType ); + prvInitialiseMutex( ( Queue_t * ) xNewQueue ); + + traceRETURN_xQueueCreateMutexStatic( xNewQueue ); + + return xNewQueue; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) + + TaskHandle_t xQueueGetMutexHolder( QueueHandle_t xSemaphore ) + { + TaskHandle_t pxReturn; + Queue_t * const pxSemaphore = ( Queue_t * ) xSemaphore; + + traceENTER_xQueueGetMutexHolder( xSemaphore ); + + configASSERT( xSemaphore ); + + /* This function is called by xSemaphoreGetMutexHolder(), and should not + * be called directly. Note: This is a good way of determining if the + * calling task is the mutex holder, but not a good way of determining the + * identity of the mutex holder, as the holder may change between the + * following critical section exiting and the function returning. */ + taskENTER_CRITICAL(); + { + if( pxSemaphore->uxQueueType == queueQUEUE_IS_MUTEX ) + { + pxReturn = pxSemaphore->u.xSemaphore.xMutexHolder; + } + else + { + pxReturn = NULL; + } + } + taskEXIT_CRITICAL(); + + traceRETURN_xQueueGetMutexHolder( pxReturn ); + + return pxReturn; + } + +#endif /* if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) + + TaskHandle_t xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore ) + { + TaskHandle_t pxReturn; + + traceENTER_xQueueGetMutexHolderFromISR( xSemaphore ); + + configASSERT( xSemaphore ); + + /* Mutexes cannot be used in interrupt service routines, so the mutex + * holder should not change in an ISR, and therefore a critical section is + * not required here. */ + if( ( ( Queue_t * ) xSemaphore )->uxQueueType == queueQUEUE_IS_MUTEX ) + { + pxReturn = ( ( Queue_t * ) xSemaphore )->u.xSemaphore.xMutexHolder; + } + else + { + pxReturn = NULL; + } + + traceRETURN_xQueueGetMutexHolderFromISR( pxReturn ); + + return pxReturn; + } + +#endif /* if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_RECURSIVE_MUTEXES == 1 ) + + BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) + { + BaseType_t xReturn; + Queue_t * const pxMutex = ( Queue_t * ) xMutex; + + traceENTER_xQueueGiveMutexRecursive( xMutex ); + + configASSERT( pxMutex ); + + /* If this is the task that holds the mutex then xMutexHolder will not + * change outside of this task. If this task does not hold the mutex then + * pxMutexHolder can never coincidentally equal the tasks handle, and as + * this is the only condition we are interested in it does not matter if + * pxMutexHolder is accessed simultaneously by another task. Therefore no + * mutual exclusion is required to test the pxMutexHolder variable. */ + if( pxMutex->u.xSemaphore.xMutexHolder == xTaskGetCurrentTaskHandle() ) + { + traceGIVE_MUTEX_RECURSIVE( pxMutex ); + + /* uxRecursiveCallCount cannot be zero if xMutexHolder is equal to + * the task handle, therefore no underflow check is required. Also, + * uxRecursiveCallCount is only modified by the mutex holder, and as + * there can only be one, no mutual exclusion is required to modify the + * uxRecursiveCallCount member. */ + ( pxMutex->u.xSemaphore.uxRecursiveCallCount )--; + + /* Has the recursive call count unwound to 0? */ + if( pxMutex->u.xSemaphore.uxRecursiveCallCount == ( UBaseType_t ) 0 ) + { + /* Return the mutex. This will automatically unblock any other + * task that might be waiting to access the mutex. */ + ( void ) xQueueGenericSend( pxMutex, NULL, queueMUTEX_GIVE_BLOCK_TIME, queueSEND_TO_BACK ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xReturn = pdPASS; + } + else + { + /* The mutex cannot be given because the calling task is not the + * holder. */ + xReturn = pdFAIL; + + traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ); + } + + traceRETURN_xQueueGiveMutexRecursive( xReturn ); + + return xReturn; + } + +#endif /* configUSE_RECURSIVE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_RECURSIVE_MUTEXES == 1 ) + + BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, + TickType_t xTicksToWait ) + { + BaseType_t xReturn; + Queue_t * const pxMutex = ( Queue_t * ) xMutex; + + traceENTER_xQueueTakeMutexRecursive( xMutex, xTicksToWait ); + + configASSERT( pxMutex ); + + /* Comments regarding mutual exclusion as per those within + * xQueueGiveMutexRecursive(). */ + + traceTAKE_MUTEX_RECURSIVE( pxMutex ); + + if( pxMutex->u.xSemaphore.xMutexHolder == xTaskGetCurrentTaskHandle() ) + { + ( pxMutex->u.xSemaphore.uxRecursiveCallCount )++; + xReturn = pdPASS; + } + else + { + xReturn = xQueueSemaphoreTake( pxMutex, xTicksToWait ); + + /* pdPASS will only be returned if the mutex was successfully + * obtained. The calling task may have entered the Blocked state + * before reaching here. */ + if( xReturn != pdFAIL ) + { + ( pxMutex->u.xSemaphore.uxRecursiveCallCount )++; + } + else + { + traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ); + } + } + + traceRETURN_xQueueTakeMutexRecursive( xReturn ); + + return xReturn; + } + +#endif /* configUSE_RECURSIVE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount, + StaticQueue_t * pxStaticQueue ) + { + QueueHandle_t xHandle = NULL; + + traceENTER_xQueueCreateCountingSemaphoreStatic( uxMaxCount, uxInitialCount, pxStaticQueue ); + + if( ( uxMaxCount != 0U ) && + ( uxInitialCount <= uxMaxCount ) ) + { + xHandle = xQueueGenericCreateStatic( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, pxStaticQueue, queueQUEUE_TYPE_COUNTING_SEMAPHORE ); + + if( xHandle != NULL ) + { + ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount; + + traceCREATE_COUNTING_SEMAPHORE(); + } + else + { + traceCREATE_COUNTING_SEMAPHORE_FAILED(); + } + } + else + { + configASSERT( xHandle ); + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_xQueueCreateCountingSemaphoreStatic( xHandle ); + + return xHandle; + } + +#endif /* ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount ) + { + QueueHandle_t xHandle = NULL; + + traceENTER_xQueueCreateCountingSemaphore( uxMaxCount, uxInitialCount ); + + if( ( uxMaxCount != 0U ) && + ( uxInitialCount <= uxMaxCount ) ) + { + xHandle = xQueueGenericCreate( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_COUNTING_SEMAPHORE ); + + if( xHandle != NULL ) + { + ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount; + + traceCREATE_COUNTING_SEMAPHORE(); + } + else + { + traceCREATE_COUNTING_SEMAPHORE_FAILED(); + } + } + else + { + configASSERT( xHandle ); + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_xQueueCreateCountingSemaphore( xHandle ); + + return xHandle; + } + +#endif /* ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGenericSend( QueueHandle_t xQueue, /* << EST @suppress("No return") */ + const void * const pvItemToQueue, + TickType_t xTicksToWait, + const BaseType_t xCopyPosition ) +{ + BaseType_t xEntryTimeSet = pdFALSE, xYieldRequired; + TimeOut_t xTimeOut; + Queue_t * const pxQueue = xQueue; + + traceENTER_xQueueGenericSend( xQueue, pvItemToQueue, xTicksToWait, xCopyPosition ); + + configASSERT( pxQueue ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + for( ; ; ) + { + taskENTER_CRITICAL(); + { + /* Is there room on the queue now? The running task must be the + * highest priority task wanting to access the queue. If the head item + * in the queue is to be overwritten then it does not matter if the + * queue is full. */ + if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) + { + traceQUEUE_SEND( pxQueue ); + + #if ( configUSE_QUEUE_SETS == 1 ) + { + const UBaseType_t uxPreviousMessagesWaiting = pxQueue->uxMessagesWaiting; + + xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( ( xCopyPosition == queueOVERWRITE ) && ( uxPreviousMessagesWaiting != ( UBaseType_t ) 0 ) ) + { + /* Do not notify the queue set as an existing item + * was overwritten in the queue so the number of items + * in the queue has not changed. */ + mtCOVERAGE_TEST_MARKER(); + } + else if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting + * to the queue set caused a higher priority task to + * unblock. A context switch is required. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* If there was a task waiting for data to arrive on the + * queue then unblock it now. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The unblocked task has a priority higher than + * our own so yield immediately. Yes it is ok to + * do this from within the critical section - the + * kernel takes care of that. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xYieldRequired != pdFALSE ) + { + /* This path is a special case that will only get + * executed if the task was holding multiple mutexes + * and the mutexes were given back in an order that is + * different to that in which they were taken. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + /* If there was a task waiting for data to arrive on the + * queue then unblock it now. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The unblocked task has a priority higher than + * our own so yield immediately. Yes it is ok to do + * this from within the critical section - the kernel + * takes care of that. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xYieldRequired != pdFALSE ) + { + /* This path is a special case that will only get + * executed if the task was holding multiple mutexes and + * the mutexes were given back in an order that is + * different to that in which they were taken. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_QUEUE_SETS */ + + taskEXIT_CRITICAL(); + + traceRETURN_xQueueGenericSend( pdPASS ); + + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The queue was full and no block time is specified (or + * the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + + /* Return to the original privilege level before exiting + * the function. */ + traceQUEUE_SEND_FAILED( pxQueue ); + traceRETURN_xQueueGenericSend( errQUEUE_FULL ); + + return errQUEUE_FULL; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was full and a block time was specified so + * configure the timeout structure. */ + vTaskInternalSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + * now the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + if( prvIsQueueFull( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_SEND( pxQueue ); + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait ); + + /* Unlocking the queue means queue events can effect the + * event list. It is possible that interrupts occurring now + * remove this task from the event list again - but as the + * scheduler is suspended the task will go onto the pending + * ready list instead of the actual ready list. */ + prvUnlockQueue( pxQueue ); + + /* Resuming the scheduler will move tasks from the pending + * ready list into the ready list - so it is feasible that this + * task is already in the ready list before it yields - in which + * case the yield will not cause a context switch unless there + * is also a higher priority task in the pending ready list. */ + if( xTaskResumeAll() == pdFALSE ) + { + taskYIELD_WITHIN_API(); + } + } + else + { + /* Try again. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + /* The timeout has expired. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + + traceQUEUE_SEND_FAILED( pxQueue ); + traceRETURN_xQueueGenericSend( errQUEUE_FULL ); + + return errQUEUE_FULL; + } + } +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, + const void * const pvItemToQueue, + BaseType_t * const pxHigherPriorityTaskWoken, + const BaseType_t xCopyPosition ) +{ + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + Queue_t * const pxQueue = xQueue; + + traceENTER_xQueueGenericSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken, xCopyPosition ); + + configASSERT( pxQueue ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + * system call (or maximum API call) interrupt priority. Interrupts that are + * above the maximum system call priority are kept permanently enabled, even + * when the RTOS kernel is in a critical section, but cannot make any calls to + * FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has been + * assigned a priority above the configured maximum system call priority. + * Only FreeRTOS functions that end in FromISR can be called from interrupts + * that have been assigned a priority at or (logically) below the maximum + * system call interrupt priority. FreeRTOS maintains a separate interrupt + * safe API to ensure interrupt entry is as fast and as simple as possible. + * More information (albeit Cortex-M specific) is provided on the following + * link: https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + /* Similar to xQueueGenericSend, except without blocking if there is no room + * in the queue. Also don't directly wake a task that was blocked on a queue + * read, instead return a flag to say whether a context switch is required or + * not (i.e. has a task with a higher priority than us been woken by this + * post). */ + uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR(); + { + if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) + { + const int8_t cTxLock = pxQueue->cTxLock; + const UBaseType_t uxPreviousMessagesWaiting = pxQueue->uxMessagesWaiting; + + traceQUEUE_SEND_FROM_ISR( pxQueue ); + + /* Semaphores use xQueueGiveFromISR(), so pxQueue will not be a + * semaphore or mutex. That means prvCopyDataToQueue() cannot result + * in a task disinheriting a priority and prvCopyDataToQueue() can be + * called here even though the disinherit function does not check if + * the scheduler is suspended before accessing the ready lists. */ + ( void ) prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + /* The event list is not altered if the queue is locked. This will + * be done when the queue is unlocked later. */ + if( cTxLock == queueUNLOCKED ) + { + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( ( xCopyPosition == queueOVERWRITE ) && ( uxPreviousMessagesWaiting != ( UBaseType_t ) 0 ) ) + { + /* Do not notify the queue set as an existing item + * was overwritten in the queue so the number of items + * in the queue has not changed. */ + mtCOVERAGE_TEST_MARKER(); + } + else if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting + * to the queue set caused a higher priority task to + * unblock. A context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so + * record that a context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + * context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Not used in this path. */ + ( void ) uxPreviousMessagesWaiting; + } + #endif /* configUSE_QUEUE_SETS */ + } + else + { + /* Increment the lock count so the task that unlocks the queue + * knows that data was posted while it was locked. */ + prvIncrementQueueTxLock( pxQueue, cTxLock ); + } + + xReturn = pdPASS; + } + else + { + traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ); + xReturn = errQUEUE_FULL; + } + } + taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus ); + + traceRETURN_xQueueGenericSendFromISR( xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, + BaseType_t * const pxHigherPriorityTaskWoken ) +{ + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + Queue_t * const pxQueue = xQueue; + + traceENTER_xQueueGiveFromISR( xQueue, pxHigherPriorityTaskWoken ); + + /* Similar to xQueueGenericSendFromISR() but used with semaphores where the + * item size is 0. Don't directly wake a task that was blocked on a queue + * read, instead return a flag to say whether a context switch is required or + * not (i.e. has a task with a higher priority than us been woken by this + * post). */ + + configASSERT( pxQueue ); + + /* xQueueGenericSendFromISR() should be used instead of xQueueGiveFromISR() + * if the item size is not 0. */ + configASSERT( pxQueue->uxItemSize == 0 ); + + /* Normally a mutex would not be given from an interrupt, especially if + * there is a mutex holder, as priority inheritance makes no sense for an + * interrupts, only tasks. */ + configASSERT( !( ( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) && ( pxQueue->u.xSemaphore.xMutexHolder != NULL ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + * system call (or maximum API call) interrupt priority. Interrupts that are + * above the maximum system call priority are kept permanently enabled, even + * when the RTOS kernel is in a critical section, but cannot make any calls to + * FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has been + * assigned a priority above the configured maximum system call priority. + * Only FreeRTOS functions that end in FromISR can be called from interrupts + * that have been assigned a priority at or (logically) below the maximum + * system call interrupt priority. FreeRTOS maintains a separate interrupt + * safe API to ensure interrupt entry is as fast and as simple as possible. + * More information (albeit Cortex-M specific) is provided on the following + * link: https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR(); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* When the queue is used to implement a semaphore no data is ever + * moved through the queue but it is still valid to see if the queue 'has + * space'. */ + if( uxMessagesWaiting < pxQueue->uxLength ) + { + const int8_t cTxLock = pxQueue->cTxLock; + + traceQUEUE_SEND_FROM_ISR( pxQueue ); + + /* A task can only have an inherited priority if it is a mutex + * holder - and if there is a mutex holder then the mutex cannot be + * given from an ISR. As this is the ISR version of the function it + * can be assumed there is no mutex holder and no need to determine if + * priority disinheritance is needed. Simply increase the count of + * messages (semaphores) available. */ + pxQueue->uxMessagesWaiting = ( UBaseType_t ) ( uxMessagesWaiting + ( UBaseType_t ) 1 ); + + /* The event list is not altered if the queue is locked. This will + * be done when the queue is unlocked later. */ + if( cTxLock == queueUNLOCKED ) + { + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE ) + { + /* The semaphore is a member of a queue set, and + * posting to the queue set caused a higher priority + * task to unblock. A context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so + * record that a context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + * context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_QUEUE_SETS */ + } + else + { + /* Increment the lock count so the task that unlocks the queue + * knows that data was posted while it was locked. */ + prvIncrementQueueTxLock( pxQueue, cTxLock ); + } + + xReturn = pdPASS; + } + else + { + traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ); + xReturn = errQUEUE_FULL; + } + } + taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus ); + + traceRETURN_xQueueGiveFromISR( xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueReceive( QueueHandle_t xQueue, /* << EST @suppress("No return") */ + void * const pvBuffer, + TickType_t xTicksToWait ) +{ + BaseType_t xEntryTimeSet = pdFALSE; + TimeOut_t xTimeOut; + Queue_t * const pxQueue = xQueue; + + traceENTER_xQueueReceive( xQueue, pvBuffer, xTicksToWait ); + + /* Check the pointer is not NULL. */ + configASSERT( ( pxQueue ) ); + + /* The buffer into which data is received can only be NULL if the data size + * is zero (so no data is copied into the buffer). */ + configASSERT( !( ( ( pvBuffer ) == NULL ) && ( ( pxQueue )->uxItemSize != ( UBaseType_t ) 0U ) ) ); + + /* Cannot block if the scheduler is suspended. */ + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + for( ; ; ) + { + taskENTER_CRITICAL(); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* Is there data in the queue now? To be running the calling task + * must be the highest priority task wanting to access the queue. */ + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Data available, remove one item. */ + prvCopyDataFromQueue( pxQueue, pvBuffer ); + traceQUEUE_RECEIVE( pxQueue ); + pxQueue->uxMessagesWaiting = ( UBaseType_t ) ( uxMessagesWaiting - ( UBaseType_t ) 1 ); + + /* There is now space in the queue, were any tasks waiting to + * post to the queue? If so, unblock the highest priority waiting + * task. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + taskEXIT_CRITICAL(); + + traceRETURN_xQueueReceive( pdPASS ); + + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The queue was empty and no block time is specified (or + * the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + + traceQUEUE_RECEIVE_FAILED( pxQueue ); + traceRETURN_xQueueReceive( errQUEUE_EMPTY ); + + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was empty and a block time was specified so + * configure the timeout structure. */ + vTaskInternalSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + * now the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + /* The timeout has not expired. If the queue is still empty place + * the task on the list of tasks waiting to receive from the queue. */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ); + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + prvUnlockQueue( pxQueue ); + + if( xTaskResumeAll() == pdFALSE ) + { + taskYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* The queue contains data again. Loop back to try and read the + * data. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + /* Timed out. If there is no data in the queue exit, otherwise loop + * back and attempt to read the data. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceQUEUE_RECEIVE_FAILED( pxQueue ); + traceRETURN_xQueueReceive( errQUEUE_EMPTY ); + + return errQUEUE_EMPTY; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, /* << EST @suppress("No return") */ + TickType_t xTicksToWait ) +{ + BaseType_t xEntryTimeSet = pdFALSE; + TimeOut_t xTimeOut; + Queue_t * const pxQueue = xQueue; + + #if ( configUSE_MUTEXES == 1 ) + BaseType_t xInheritanceOccurred = pdFALSE; + #endif + + traceENTER_xQueueSemaphoreTake( xQueue, xTicksToWait ); + + /* Check the queue pointer is not NULL. */ + configASSERT( ( pxQueue ) ); + + /* Check this really is a semaphore, in which case the item size will be + * 0. */ + configASSERT( pxQueue->uxItemSize == 0 ); + + /* Cannot block if the scheduler is suspended. */ + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + for( ; ; ) + { + taskENTER_CRITICAL(); + { + /* Semaphores are queues with an item size of 0, and where the + * number of messages in the queue is the semaphore's count value. */ + const UBaseType_t uxSemaphoreCount = pxQueue->uxMessagesWaiting; + + /* Is there data in the queue now? To be running the calling task + * must be the highest priority task wanting to access the queue. */ + if( uxSemaphoreCount > ( UBaseType_t ) 0 ) + { + traceQUEUE_RECEIVE( pxQueue ); + + /* Semaphores are queues with a data size of zero and where the + * messages waiting is the semaphore's count. Reduce the count. */ + pxQueue->uxMessagesWaiting = ( UBaseType_t ) ( uxSemaphoreCount - ( UBaseType_t ) 1 ); + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* Record the information required to implement + * priority inheritance should it become necessary. */ + pxQueue->u.xSemaphore.xMutexHolder = pvTaskIncrementMutexHeldCount(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_MUTEXES */ + + /* Check to see if other tasks are blocked waiting to give the + * semaphore, and if so, unblock the highest priority such task. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + taskEXIT_CRITICAL(); + + traceRETURN_xQueueSemaphoreTake( pdPASS ); + + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The semaphore count was 0 and no block time is specified + * (or the block time has expired) so exit now. */ + taskEXIT_CRITICAL(); + + traceQUEUE_RECEIVE_FAILED( pxQueue ); + traceRETURN_xQueueSemaphoreTake( errQUEUE_EMPTY ); + + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The semaphore count was 0 and a block time was specified + * so configure the timeout structure ready to block. */ + vTaskInternalSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can give to and take from the semaphore + * now the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + /* A block time is specified and not expired. If the semaphore + * count is 0 then enter the Blocked state to wait for a semaphore to + * become available. As semaphores are implemented with queues the + * queue being empty is equivalent to the semaphore count being 0. */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ); + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + taskENTER_CRITICAL(); + { + xInheritanceOccurred = xTaskPriorityInherit( pxQueue->u.xSemaphore.xMutexHolder ); + } + taskEXIT_CRITICAL(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* if ( configUSE_MUTEXES == 1 ) */ + + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + prvUnlockQueue( pxQueue ); + + if( xTaskResumeAll() == pdFALSE ) + { + taskYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* There was no timeout and the semaphore count was not 0, so + * attempt to take the semaphore again. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + /* Timed out. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + + /* If the semaphore count is 0 exit now as the timeout has + * expired. Otherwise return to attempt to take the semaphore that is + * known to be available. As semaphores are implemented by queues the + * queue being empty is equivalent to the semaphore count being 0. */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + #if ( configUSE_MUTEXES == 1 ) + { + /* xInheritanceOccurred could only have be set if + * pxQueue->uxQueueType == queueQUEUE_IS_MUTEX so no need to + * test the mutex type again to check it is actually a mutex. */ + if( xInheritanceOccurred != pdFALSE ) + { + taskENTER_CRITICAL(); + { + UBaseType_t uxHighestWaitingPriority; + + /* This task blocking on the mutex caused another + * task to inherit this task's priority. Now this task + * has timed out the priority should be disinherited + * again, but only as low as the next highest priority + * task that is waiting for the same mutex. */ + uxHighestWaitingPriority = prvGetDisinheritPriorityAfterTimeout( pxQueue ); + + /* vTaskPriorityDisinheritAfterTimeout uses the uxHighestWaitingPriority + * parameter to index pxReadyTasksLists when adding the task holding + * mutex to the ready list for its new priority. Coverity thinks that + * it can result in out-of-bounds access which is not true because + * uxHighestWaitingPriority, as returned by prvGetDisinheritPriorityAfterTimeout, + * is capped at ( configMAX_PRIORITIES - 1 ). */ + /* coverity[overrun] */ + vTaskPriorityDisinheritAfterTimeout( pxQueue->u.xSemaphore.xMutexHolder, uxHighestWaitingPriority ); + } + taskEXIT_CRITICAL(); + } + } + #endif /* configUSE_MUTEXES */ + + traceQUEUE_RECEIVE_FAILED( pxQueue ); + traceRETURN_xQueueSemaphoreTake( errQUEUE_EMPTY ); + + return errQUEUE_EMPTY; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueuePeek( QueueHandle_t xQueue, /* << EST @suppress("No return") */ + void * const pvBuffer, + TickType_t xTicksToWait ) +{ + BaseType_t xEntryTimeSet = pdFALSE; + TimeOut_t xTimeOut; + int8_t * pcOriginalReadPosition; + Queue_t * const pxQueue = xQueue; + + traceENTER_xQueuePeek( xQueue, pvBuffer, xTicksToWait ); + + /* Check the pointer is not NULL. */ + configASSERT( ( pxQueue ) ); + + /* The buffer into which data is received can only be NULL if the data size + * is zero (so no data is copied into the buffer. */ + configASSERT( !( ( ( pvBuffer ) == NULL ) && ( ( pxQueue )->uxItemSize != ( UBaseType_t ) 0U ) ) ); + + /* Cannot block if the scheduler is suspended. */ + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + for( ; ; ) + { + taskENTER_CRITICAL(); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* Is there data in the queue now? To be running the calling task + * must be the highest priority task wanting to access the queue. */ + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Remember the read position so it can be reset after the data + * is read from the queue as this function is only peeking the + * data, not removing it. */ + pcOriginalReadPosition = pxQueue->u.xQueue.pcReadFrom; + + prvCopyDataFromQueue( pxQueue, pvBuffer ); + traceQUEUE_PEEK( pxQueue ); + + /* The data is not being removed, so reset the read pointer. */ + pxQueue->u.xQueue.pcReadFrom = pcOriginalReadPosition; + + /* The data is being left in the queue, so see if there are + * any other tasks waiting for the data. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than this task. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + taskEXIT_CRITICAL(); + + traceRETURN_xQueuePeek( pdPASS ); + + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The queue was empty and no block time is specified (or + * the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + + traceQUEUE_PEEK_FAILED( pxQueue ); + traceRETURN_xQueuePeek( errQUEUE_EMPTY ); + + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was empty and a block time was specified so + * configure the timeout structure ready to enter the blocked + * state. */ + vTaskInternalSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + * now that the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + /* Timeout has not expired yet, check to see if there is data in the + * queue now, and if not enter the Blocked state to wait for data. */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_PEEK( pxQueue ); + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + prvUnlockQueue( pxQueue ); + + if( xTaskResumeAll() == pdFALSE ) + { + taskYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* There is data in the queue now, so don't enter the blocked + * state, instead return to try and obtain the data. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + /* The timeout has expired. If there is still no data in the queue + * exit, otherwise go back and try to read the data again. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceQUEUE_PEEK_FAILED( pxQueue ); + traceRETURN_xQueuePeek( errQUEUE_EMPTY ); + + return errQUEUE_EMPTY; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, + void * const pvBuffer, + BaseType_t * const pxHigherPriorityTaskWoken ) +{ + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + Queue_t * const pxQueue = xQueue; + + traceENTER_xQueueReceiveFromISR( xQueue, pvBuffer, pxHigherPriorityTaskWoken ); + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + * system call (or maximum API call) interrupt priority. Interrupts that are + * above the maximum system call priority are kept permanently enabled, even + * when the RTOS kernel is in a critical section, but cannot make any calls to + * FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has been + * assigned a priority above the configured maximum system call priority. + * Only FreeRTOS functions that end in FromISR can be called from interrupts + * that have been assigned a priority at or (logically) below the maximum + * system call interrupt priority. FreeRTOS maintains a separate interrupt + * safe API to ensure interrupt entry is as fast and as simple as possible. + * More information (albeit Cortex-M specific) is provided on the following + * link: https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR(); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* Cannot block in an ISR, so check there is data available. */ + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + const int8_t cRxLock = pxQueue->cRxLock; + + traceQUEUE_RECEIVE_FROM_ISR( pxQueue ); + + prvCopyDataFromQueue( pxQueue, pvBuffer ); + pxQueue->uxMessagesWaiting = ( UBaseType_t ) ( uxMessagesWaiting - ( UBaseType_t ) 1 ); + + /* If the queue is locked the event list will not be modified. + * Instead update the lock count so the task that unlocks the queue + * will know that an ISR has removed data while the queue was + * locked. */ + if( cRxLock == queueUNLOCKED ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than us so + * force a context switch. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Increment the lock count so the task that unlocks the queue + * knows that data was removed while it was locked. */ + prvIncrementQueueRxLock( pxQueue, cRxLock ); + } + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ); + } + } + taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus ); + + traceRETURN_xQueueReceiveFromISR( xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, + void * const pvBuffer ) +{ + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + int8_t * pcOriginalReadPosition; + Queue_t * const pxQueue = xQueue; + + traceENTER_xQueuePeekFromISR( xQueue, pvBuffer ); + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( pxQueue->uxItemSize != 0 ); /* Can't peek a semaphore. */ + + /* RTOS ports that support interrupt nesting have the concept of a maximum + * system call (or maximum API call) interrupt priority. Interrupts that are + * above the maximum system call priority are kept permanently enabled, even + * when the RTOS kernel is in a critical section, but cannot make any calls to + * FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has been + * assigned a priority above the configured maximum system call priority. + * Only FreeRTOS functions that end in FromISR can be called from interrupts + * that have been assigned a priority at or (logically) below the maximum + * system call interrupt priority. FreeRTOS maintains a separate interrupt + * safe API to ensure interrupt entry is as fast and as simple as possible. + * More information (albeit Cortex-M specific) is provided on the following + * link: https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR(); + { + /* Cannot block in an ISR, so check there is data available. */ + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + traceQUEUE_PEEK_FROM_ISR( pxQueue ); + + /* Remember the read position so it can be reset as nothing is + * actually being removed from the queue. */ + pcOriginalReadPosition = pxQueue->u.xQueue.pcReadFrom; + prvCopyDataFromQueue( pxQueue, pvBuffer ); + pxQueue->u.xQueue.pcReadFrom = pcOriginalReadPosition; + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ); + } + } + taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus ); + + traceRETURN_xQueuePeekFromISR( xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) +{ + UBaseType_t uxReturn; + + traceENTER_uxQueueMessagesWaiting( xQueue ); + + configASSERT( xQueue ); + + taskENTER_CRITICAL(); + { + uxReturn = ( ( Queue_t * ) xQueue )->uxMessagesWaiting; + } + taskEXIT_CRITICAL(); + + traceRETURN_uxQueueMessagesWaiting( uxReturn ); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) +{ + UBaseType_t uxReturn; + Queue_t * const pxQueue = xQueue; + + traceENTER_uxQueueSpacesAvailable( xQueue ); + + configASSERT( pxQueue ); + + taskENTER_CRITICAL(); + { + uxReturn = ( UBaseType_t ) ( pxQueue->uxLength - pxQueue->uxMessagesWaiting ); + } + taskEXIT_CRITICAL(); + + traceRETURN_uxQueueSpacesAvailable( uxReturn ); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) +{ + UBaseType_t uxReturn; + Queue_t * const pxQueue = xQueue; + + traceENTER_uxQueueMessagesWaitingFromISR( xQueue ); + + configASSERT( pxQueue ); + uxReturn = pxQueue->uxMessagesWaiting; + + traceRETURN_uxQueueMessagesWaitingFromISR( uxReturn ); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +void vQueueDelete( QueueHandle_t xQueue ) +{ + Queue_t * const pxQueue = xQueue; + + traceENTER_vQueueDelete( xQueue ); + + configASSERT( pxQueue ); + traceQUEUE_DELETE( pxQueue ); + + #if ( configQUEUE_REGISTRY_SIZE > 0 ) + { + vQueueUnregisterQueue( pxQueue ); + } + #endif + + #if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) + { + /* The queue can only have been allocated dynamically - free it + * again. */ + vPortFree( pxQueue ); + } + #elif ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + { + /* The queue could have been allocated statically or dynamically, so + * check before attempting to free the memory. */ + if( pxQueue->ucStaticallyAllocated == ( uint8_t ) pdFALSE ) + { + vPortFree( pxQueue ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #else /* if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) */ + { + /* The queue must have been statically allocated, so is not going to be + * deleted. Avoid compiler warnings about the unused parameter. */ + ( void ) pxQueue; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + + traceRETURN_vQueueDelete(); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) + { + traceENTER_uxQueueGetQueueNumber( xQueue ); + + traceRETURN_uxQueueGetQueueNumber( ( ( Queue_t * ) xQueue )->uxQueueNumber ); + + return ( ( Queue_t * ) xQueue )->uxQueueNumber; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vQueueSetQueueNumber( QueueHandle_t xQueue, + UBaseType_t uxQueueNumber ) + { + traceENTER_vQueueSetQueueNumber( xQueue, uxQueueNumber ); + + ( ( Queue_t * ) xQueue )->uxQueueNumber = uxQueueNumber; + + traceRETURN_vQueueSetQueueNumber(); + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) + { + traceENTER_ucQueueGetQueueType( xQueue ); + + traceRETURN_ucQueueGetQueueType( ( ( Queue_t * ) xQueue )->ucQueueType ); + + return ( ( Queue_t * ) xQueue )->ucQueueType; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +UBaseType_t uxQueueGetQueueItemSize( QueueHandle_t xQueue ) /* PRIVILEGED_FUNCTION */ +{ + traceENTER_uxQueueGetQueueItemSize( xQueue ); + + traceRETURN_uxQueueGetQueueItemSize( ( ( Queue_t * ) xQueue )->uxItemSize ); + + return ( ( Queue_t * ) xQueue )->uxItemSize; +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxQueueGetQueueLength( QueueHandle_t xQueue ) /* PRIVILEGED_FUNCTION */ +{ + traceENTER_uxQueueGetQueueLength( xQueue ); + + traceRETURN_uxQueueGetQueueLength( ( ( Queue_t * ) xQueue )->uxLength ); + + return ( ( Queue_t * ) xQueue )->uxLength; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + static UBaseType_t prvGetDisinheritPriorityAfterTimeout( const Queue_t * const pxQueue ) + { + UBaseType_t uxHighestPriorityOfWaitingTasks; + + /* If a task waiting for a mutex causes the mutex holder to inherit a + * priority, but the waiting task times out, then the holder should + * disinherit the priority - but only down to the highest priority of any + * other tasks that are waiting for the same mutex. For this purpose, + * return the priority of the highest priority task that is waiting for the + * mutex. */ + if( listCURRENT_LIST_LENGTH( &( pxQueue->xTasksWaitingToReceive ) ) > 0U ) + { + uxHighestPriorityOfWaitingTasks = ( UBaseType_t ) ( ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) listGET_ITEM_VALUE_OF_HEAD_ENTRY( &( pxQueue->xTasksWaitingToReceive ) ) ); + } + else + { + uxHighestPriorityOfWaitingTasks = tskIDLE_PRIORITY; + } + + return uxHighestPriorityOfWaitingTasks; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, + const void * pvItemToQueue, + const BaseType_t xPosition ) +{ + BaseType_t xReturn = pdFALSE; + UBaseType_t uxMessagesWaiting; + + /* This function is called from a critical section. */ + + uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + if( pxQueue->uxItemSize == ( UBaseType_t ) 0 ) + { + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* The mutex is no longer being held. */ + xReturn = xTaskPriorityDisinherit( pxQueue->u.xSemaphore.xMutexHolder ); + pxQueue->u.xSemaphore.xMutexHolder = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_MUTEXES */ + } + else if( xPosition == queueSEND_TO_BACK ) + { + ( void ) memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); + pxQueue->pcWriteTo += pxQueue->uxItemSize; + + if( pxQueue->pcWriteTo >= pxQueue->u.xQueue.pcTail ) + { + pxQueue->pcWriteTo = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + ( void ) memcpy( ( void * ) pxQueue->u.xQueue.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); + pxQueue->u.xQueue.pcReadFrom -= pxQueue->uxItemSize; + + if( pxQueue->u.xQueue.pcReadFrom < pxQueue->pcHead ) + { + pxQueue->u.xQueue.pcReadFrom = ( pxQueue->u.xQueue.pcTail - pxQueue->uxItemSize ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xPosition == queueOVERWRITE ) + { + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* An item is not being added but overwritten, so subtract + * one from the recorded number of items in the queue so when + * one is added again below the number of recorded items remains + * correct. */ + --uxMessagesWaiting; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + pxQueue->uxMessagesWaiting = ( UBaseType_t ) ( uxMessagesWaiting + ( UBaseType_t ) 1 ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +static void prvCopyDataFromQueue( Queue_t * const pxQueue, + void * const pvBuffer ) +{ + if( pxQueue->uxItemSize != ( UBaseType_t ) 0 ) + { + pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize; + + if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail ) + { + pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( size_t ) pxQueue->uxItemSize ); + } +} +/*-----------------------------------------------------------*/ + +static void prvUnlockQueue( Queue_t * const pxQueue ) +{ + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. */ + + /* The lock counts contains the number of extra data items placed or + * removed from the queue while the queue was locked. When a queue is + * locked items can be added or removed, but the event lists cannot be + * updated. */ + taskENTER_CRITICAL(); + { + int8_t cTxLock = pxQueue->cTxLock; + + /* See if data was added to the queue while it was locked. */ + while( cTxLock > queueLOCKED_UNMODIFIED ) + { + /* Data was posted while the queue was locked. Are any tasks + * blocked waiting for data to become available? */ + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting to + * the queue set caused a higher priority task to unblock. + * A context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Tasks that are removed from the event list will get + * added to the pending ready list as the scheduler is still + * suspended. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + * context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + break; + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + /* Tasks that are removed from the event list will get added to + * the pending ready list as the scheduler is still suspended. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that + * a context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + break; + } + } + #endif /* configUSE_QUEUE_SETS */ + + --cTxLock; + } + + pxQueue->cTxLock = queueUNLOCKED; + } + taskEXIT_CRITICAL(); + + /* Do the same for the Rx lock. */ + taskENTER_CRITICAL(); + { + int8_t cRxLock = pxQueue->cRxLock; + + while( cRxLock > queueLOCKED_UNMODIFIED ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + --cRxLock; + } + else + { + break; + } + } + + pxQueue->cRxLock = queueUNLOCKED; + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +static BaseType_t prvIsQueueEmpty( const Queue_t * pxQueue ) +{ + BaseType_t xReturn; + + taskENTER_CRITICAL(); + { + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) +{ + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; + + traceENTER_xQueueIsQueueEmptyFromISR( xQueue ); + + configASSERT( pxQueue ); + + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + traceRETURN_xQueueIsQueueEmptyFromISR( xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +static BaseType_t prvIsQueueFull( const Queue_t * pxQueue ) +{ + BaseType_t xReturn; + + taskENTER_CRITICAL(); + { + if( pxQueue->uxMessagesWaiting == pxQueue->uxLength ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) +{ + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; + + traceENTER_xQueueIsQueueFullFromISR( xQueue ); + + configASSERT( pxQueue ); + + if( pxQueue->uxMessagesWaiting == pxQueue->uxLength ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + traceRETURN_xQueueIsQueueFullFromISR( xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRSend( QueueHandle_t xQueue, + const void * pvItemToQueue, + TickType_t xTicksToWait ) + { + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; + + traceENTER_xQueueCRSend( xQueue, pvItemToQueue, xTicksToWait ); + + /* If the queue is already full we may have to block. A critical section + * is required to prevent an interrupt removing something from the queue + * between the check to see if the queue is full and blocking on the queue. */ + portDISABLE_INTERRUPTS(); + { + if( prvIsQueueFull( pxQueue ) != pdFALSE ) + { + /* The queue is full - do we want to block or just leave without + * posting? */ + if( xTicksToWait > ( TickType_t ) 0 ) + { + /* As this is called from a coroutine we cannot block directly, but + * return indicating that we need to block. */ + vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToSend ) ); + portENABLE_INTERRUPTS(); + return errQUEUE_BLOCKED; + } + else + { + portENABLE_INTERRUPTS(); + return errQUEUE_FULL; + } + } + } + portENABLE_INTERRUPTS(); + + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + /* There is room in the queue, copy the data into the queue. */ + prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); + xReturn = pdPASS; + + /* Were any co-routines waiting for data to become available? */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + /* In this instance the co-routine could be placed directly + * into the ready list as we are within a critical section. + * Instead the same pending ready list mechanism is used as if + * the event were caused from within an interrupt. */ + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The co-routine waiting has a higher priority so record + * that a yield might be appropriate. */ + xReturn = errQUEUE_YIELD; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xReturn = errQUEUE_FULL; + } + } + portENABLE_INTERRUPTS(); + + traceRETURN_xQueueCRSend( xReturn ); + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRReceive( QueueHandle_t xQueue, + void * pvBuffer, + TickType_t xTicksToWait ) + { + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; + + traceENTER_xQueueCRReceive( xQueue, pvBuffer, xTicksToWait ); + + /* If the queue is already empty we may have to block. A critical section + * is required to prevent an interrupt adding something to the queue + * between the check to see if the queue is empty and blocking on the queue. */ + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) + { + /* There are no messages in the queue, do we want to block or just + * leave with nothing? */ + if( xTicksToWait > ( TickType_t ) 0 ) + { + /* As this is a co-routine we cannot block directly, but return + * indicating that we need to block. */ + vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToReceive ) ); + portENABLE_INTERRUPTS(); + return errQUEUE_BLOCKED; + } + else + { + portENABLE_INTERRUPTS(); + return errQUEUE_FULL; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + portENABLE_INTERRUPTS(); + + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Data is available from the queue. */ + pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize; + + if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail ) + { + pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + --( pxQueue->uxMessagesWaiting ); + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + + xReturn = pdPASS; + + /* Were any co-routines waiting for space to become available? */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + /* In this instance the co-routine could be placed directly + * into the ready list as we are within a critical section. + * Instead the same pending ready list mechanism is used as if + * the event were caused from within an interrupt. */ + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + xReturn = errQUEUE_YIELD; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xReturn = pdFAIL; + } + } + portENABLE_INTERRUPTS(); + + traceRETURN_xQueueCRReceive( xReturn ); + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue, + const void * pvItemToQueue, + BaseType_t xCoRoutinePreviouslyWoken ) + { + Queue_t * const pxQueue = xQueue; + + traceENTER_xQueueCRSendFromISR( xQueue, pvItemToQueue, xCoRoutinePreviouslyWoken ); + + /* Cannot block within an ISR so if there is no space on the queue then + * exit without doing anything. */ + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); + + /* We only want to wake one co-routine per ISR, so check that a + * co-routine has not already been woken. */ + if( xCoRoutinePreviouslyWoken == pdFALSE ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + return pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_xQueueCRSendFromISR( xCoRoutinePreviouslyWoken ); + + return xCoRoutinePreviouslyWoken; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue, + void * pvBuffer, + BaseType_t * pxCoRoutineWoken ) + { + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; + + traceENTER_xQueueCRReceiveFromISR( xQueue, pvBuffer, pxCoRoutineWoken ); + + /* We cannot block from an ISR, so check there is data available. If + * not then just leave without doing anything. */ + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Copy the data from the queue. */ + pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize; + + if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail ) + { + pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + --( pxQueue->uxMessagesWaiting ); + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + + if( ( *pxCoRoutineWoken ) == pdFALSE ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + *pxCoRoutineWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + + traceRETURN_xQueueCRReceiveFromISR( xReturn ); + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + void vQueueAddToRegistry( QueueHandle_t xQueue, + const char * pcQueueName ) + { + UBaseType_t ux; + QueueRegistryItem_t * pxEntryToWrite = NULL; + + traceENTER_vQueueAddToRegistry( xQueue, pcQueueName ); + + configASSERT( xQueue ); + + if( pcQueueName != NULL ) + { + /* See if there is an empty space in the registry. A NULL name denotes + * a free slot. */ + for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) + { + /* Replace an existing entry if the queue is already in the registry. */ + if( xQueue == xQueueRegistry[ ux ].xHandle ) + { + pxEntryToWrite = &( xQueueRegistry[ ux ] ); + break; + } + /* Otherwise, store in the next empty location */ + else if( ( pxEntryToWrite == NULL ) && ( xQueueRegistry[ ux ].pcQueueName == NULL ) ) + { + pxEntryToWrite = &( xQueueRegistry[ ux ] ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + + if( pxEntryToWrite != NULL ) + { + /* Store the information on this queue. */ + pxEntryToWrite->pcQueueName = pcQueueName; + pxEntryToWrite->xHandle = xQueue; + + traceQUEUE_REGISTRY_ADD( xQueue, pcQueueName ); + } + + traceRETURN_vQueueAddToRegistry(); + } + +#endif /* configQUEUE_REGISTRY_SIZE */ +/*-----------------------------------------------------------*/ + +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + const char * pcQueueGetName( QueueHandle_t xQueue ) + { + UBaseType_t ux; + const char * pcReturn = NULL; + + traceENTER_pcQueueGetName( xQueue ); + + configASSERT( xQueue ); + + /* Note there is nothing here to protect against another task adding or + * removing entries from the registry while it is being searched. */ + + for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].xHandle == xQueue ) + { + pcReturn = xQueueRegistry[ ux ].pcQueueName; + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + traceRETURN_pcQueueGetName( pcReturn ); + + return pcReturn; + } + +#endif /* configQUEUE_REGISTRY_SIZE */ +/*-----------------------------------------------------------*/ + +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + void vQueueUnregisterQueue( QueueHandle_t xQueue ) + { + UBaseType_t ux; + + traceENTER_vQueueUnregisterQueue( xQueue ); + + configASSERT( xQueue ); + + /* See if the handle of the queue being unregistered in actually in the + * registry. */ + for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].xHandle == xQueue ) + { + /* Set the name to NULL to show that this slot if free again. */ + xQueueRegistry[ ux ].pcQueueName = NULL; + + /* Set the handle to NULL to ensure the same queue handle cannot + * appear in the registry twice if it is added, removed, then + * added again. */ + xQueueRegistry[ ux ].xHandle = ( QueueHandle_t ) 0; + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + traceRETURN_vQueueUnregisterQueue(); + } + +#endif /* configQUEUE_REGISTRY_SIZE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TIMERS == 1 ) + + void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, + TickType_t xTicksToWait, + const BaseType_t xWaitIndefinitely ) + { + Queue_t * const pxQueue = xQueue; + + traceENTER_vQueueWaitForMessageRestricted( xQueue, xTicksToWait, xWaitIndefinitely ); + + /* This function should not be called by application code hence the + * 'Restricted' in its name. It is not part of the public API. It is + * designed for use by kernel code, and has special calling requirements. + * It can result in vListInsert() being called on a list that can only + * possibly ever have one item in it, so the list will be fast, but even + * so it should be called with the scheduler locked and not from a critical + * section. */ + + /* Only do anything if there are no messages in the queue. This function + * will not actually cause the task to block, just place it on a blocked + * list. It will not block until the scheduler is unlocked - at which + * time a yield will be performed. If an item is added to the queue while + * the queue is locked, and the calling task blocks on the queue, then the + * calling task will be immediately unblocked when the queue is unlocked. */ + prvLockQueue( pxQueue ); + + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0U ) + { + /* There is nothing in the queue, block for the specified period. */ + vTaskPlaceOnEventListRestricted( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait, xWaitIndefinitely ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + prvUnlockQueue( pxQueue ); + + traceRETURN_vQueueWaitForMessageRestricted(); + } + +#endif /* configUSE_TIMERS */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_QUEUE_SETS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) + { + QueueSetHandle_t pxQueue; + + traceENTER_xQueueCreateSet( uxEventQueueLength ); + + pxQueue = xQueueGenericCreate( uxEventQueueLength, ( UBaseType_t ) sizeof( Queue_t * ), queueQUEUE_TYPE_SET ); + + traceRETURN_xQueueCreateSet( pxQueue ); + + return pxQueue; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) + { + BaseType_t xReturn; + + traceENTER_xQueueAddToSet( xQueueOrSemaphore, xQueueSet ); + + taskENTER_CRITICAL(); + { + if( ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer != NULL ) + { + /* Cannot add a queue/semaphore to more than one queue set. */ + xReturn = pdFAIL; + } + else if( ( ( Queue_t * ) xQueueOrSemaphore )->uxMessagesWaiting != ( UBaseType_t ) 0 ) + { + /* Cannot add a queue/semaphore to a queue set if there are already + * items in the queue/semaphore. */ + xReturn = pdFAIL; + } + else + { + ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer = xQueueSet; + xReturn = pdPASS; + } + } + taskEXIT_CRITICAL(); + + traceRETURN_xQueueAddToSet( xReturn ); + + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) + { + BaseType_t xReturn; + Queue_t * const pxQueueOrSemaphore = ( Queue_t * ) xQueueOrSemaphore; + + traceENTER_xQueueRemoveFromSet( xQueueOrSemaphore, xQueueSet ); + + if( pxQueueOrSemaphore->pxQueueSetContainer != xQueueSet ) + { + /* The queue was not a member of the set. */ + xReturn = pdFAIL; + } + else if( pxQueueOrSemaphore->uxMessagesWaiting != ( UBaseType_t ) 0 ) + { + /* It is dangerous to remove a queue from a set when the queue is + * not empty because the queue set will still hold pending events for + * the queue. */ + xReturn = pdFAIL; + } + else + { + taskENTER_CRITICAL(); + { + /* The queue is no longer contained in the set. */ + pxQueueOrSemaphore->pxQueueSetContainer = NULL; + } + taskEXIT_CRITICAL(); + xReturn = pdPASS; + } + + traceRETURN_xQueueRemoveFromSet( xReturn ); + + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, + TickType_t const xTicksToWait ) + { + QueueSetMemberHandle_t xReturn = NULL; + + traceENTER_xQueueSelectFromSet( xQueueSet, xTicksToWait ); + + ( void ) xQueueReceive( ( QueueHandle_t ) xQueueSet, &xReturn, xTicksToWait ); + + traceRETURN_xQueueSelectFromSet( xReturn ); + + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) + { + QueueSetMemberHandle_t xReturn = NULL; + + traceENTER_xQueueSelectFromSetFromISR( xQueueSet ); + + ( void ) xQueueReceiveFromISR( ( QueueHandle_t ) xQueueSet, &xReturn, NULL ); + + traceRETURN_xQueueSelectFromSetFromISR( xReturn ); + + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue ) + { + Queue_t * pxQueueSetContainer = pxQueue->pxQueueSetContainer; + BaseType_t xReturn = pdFALSE; + + /* This function must be called form a critical section. */ + + /* The following line is not reachable in unit tests because every call + * to prvNotifyQueueSetContainer is preceded by a check that + * pxQueueSetContainer != NULL */ + configASSERT( pxQueueSetContainer ); /* LCOV_EXCL_BR_LINE */ + configASSERT( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ); + + if( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ) + { + const int8_t cTxLock = pxQueueSetContainer->cTxLock; + + traceQUEUE_SET_SEND( pxQueueSetContainer ); + + /* The data copied is the handle of the queue that contains data. */ + xReturn = prvCopyDataToQueue( pxQueueSetContainer, &pxQueue, queueSEND_TO_BACK ); + + if( cTxLock == queueUNLOCKED ) + { + if( listLIST_IS_EMPTY( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority. */ + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + prvIncrementQueueTxLock( pxQueueSetContainer, cTxLock ); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ +void vQueueEndScheduler(void) { /* << EST */ +#if configQUEUE_REGISTRY_SIZE>0 + memset(xQueueRegistry, 0, sizeof(xQueueRegistry)); +#endif /* configQUEUE_REGISTRY_SIZE */ +} + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/stream_buffer.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/stream_buffer.c new file mode 100644 index 0000000..998bd50 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/stream_buffer.c @@ -0,0 +1,1572 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#if 1 /* << EST: handle HIWARE compiler and C++ mode, where UINT32_MAX does not exist */ +#ifndef __HIWARE__ /* C89 compiler does not know stdint.h */ +#include +#endif +#ifndef UINT32_MAX + #define UINT32_MAX 0xffffffff +#endif +#endif /* << EST */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "stream_buffer.h" + +#if ( configUSE_TASK_NOTIFICATIONS != 1 ) + #error configUSE_TASK_NOTIFICATIONS must be set to 1 to build stream_buffer.c +#endif + +#if ( INCLUDE_xTaskGetCurrentTaskHandle != 1 ) + #error INCLUDE_xTaskGetCurrentTaskHandle must be set to 1 to build stream_buffer.c +#endif + +/* The MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined + * for the header files above, but not in this file, in order to generate the + * correct privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* If the user has not provided application specific Rx notification macros, + * or #defined the notification macros away, then provide default implementations + * that uses task notifications. */ +#ifndef sbRECEIVE_COMPLETED + #define sbRECEIVE_COMPLETED( pxStreamBuffer ) \ + do \ + { \ + vTaskSuspendAll(); \ + { \ + if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL ) \ + { \ + ( void ) xTaskNotify( ( pxStreamBuffer )->xTaskWaitingToSend, \ + ( uint32_t ) 0, \ + eNoAction ); \ + ( pxStreamBuffer )->xTaskWaitingToSend = NULL; \ + } \ + } \ + ( void ) xTaskResumeAll(); \ + } while( 0 ) +#endif /* sbRECEIVE_COMPLETED */ + +/* If user has provided a per-instance receive complete callback, then + * invoke the callback else use the receive complete macro which is provided by default for all instances. + */ +#if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + #define prvRECEIVE_COMPLETED( pxStreamBuffer ) \ + do { \ + if( ( pxStreamBuffer )->pxReceiveCompletedCallback != NULL ) \ + { \ + ( pxStreamBuffer )->pxReceiveCompletedCallback( ( pxStreamBuffer ), pdFALSE, NULL ); \ + } \ + else \ + { \ + sbRECEIVE_COMPLETED( ( pxStreamBuffer ) ); \ + } \ + } while( 0 ) +#else /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */ + #define prvRECEIVE_COMPLETED( pxStreamBuffer ) sbRECEIVE_COMPLETED( ( pxStreamBuffer ) ) +#endif /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */ + +#ifndef sbRECEIVE_COMPLETED_FROM_ISR + #define sbRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer, \ + pxHigherPriorityTaskWoken ) \ + do { \ + UBaseType_t uxSavedInterruptStatus; \ + \ + uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR(); \ + { \ + if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL ) \ + { \ + ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToSend, \ + ( uint32_t ) 0, \ + eNoAction, \ + ( pxHigherPriorityTaskWoken ) ); \ + ( pxStreamBuffer )->xTaskWaitingToSend = NULL; \ + } \ + } \ + taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus ); \ + } while( 0 ) +#endif /* sbRECEIVE_COMPLETED_FROM_ISR */ + +#if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + #define prvRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer, \ + pxHigherPriorityTaskWoken ) \ + do { \ + if( ( pxStreamBuffer )->pxReceiveCompletedCallback != NULL ) \ + { \ + ( pxStreamBuffer )->pxReceiveCompletedCallback( ( pxStreamBuffer ), pdTRUE, ( pxHigherPriorityTaskWoken ) ); \ + } \ + else \ + { \ + sbRECEIVE_COMPLETED_FROM_ISR( ( pxStreamBuffer ), ( pxHigherPriorityTaskWoken ) ); \ + } \ + } while( 0 ) +#else /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */ + #define prvRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ) \ + sbRECEIVE_COMPLETED_FROM_ISR( ( pxStreamBuffer ), ( pxHigherPriorityTaskWoken ) ) +#endif /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */ + +/* If the user has not provided an application specific Tx notification macro, + * or #defined the notification macro away, then provide a default + * implementation that uses task notifications. + */ +#ifndef sbSEND_COMPLETED + #define sbSEND_COMPLETED( pxStreamBuffer ) \ + vTaskSuspendAll(); \ + { \ + if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL ) \ + { \ + ( void ) xTaskNotify( ( pxStreamBuffer )->xTaskWaitingToReceive, \ + ( uint32_t ) 0, \ + eNoAction ); \ + ( pxStreamBuffer )->xTaskWaitingToReceive = NULL; \ + } \ + } \ + ( void ) xTaskResumeAll() +#endif /* sbSEND_COMPLETED */ + +/* If user has provided a per-instance send completed callback, then + * invoke the callback else use the send complete macro which is provided by default for all instances. + */ +#if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + #define prvSEND_COMPLETED( pxStreamBuffer ) \ + do { \ + if( ( pxStreamBuffer )->pxSendCompletedCallback != NULL ) \ + { \ + ( pxStreamBuffer )->pxSendCompletedCallback( ( pxStreamBuffer ), pdFALSE, NULL ); \ + } \ + else \ + { \ + sbSEND_COMPLETED( ( pxStreamBuffer ) ); \ + } \ + } while( 0 ) +#else /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */ + #define prvSEND_COMPLETED( pxStreamBuffer ) sbSEND_COMPLETED( ( pxStreamBuffer ) ) +#endif /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */ + + +#ifndef sbSEND_COMPLETE_FROM_ISR + #define sbSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ) \ + do { \ + UBaseType_t uxSavedInterruptStatus; \ + \ + uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR(); \ + { \ + if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL ) \ + { \ + ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToReceive, \ + ( uint32_t ) 0, \ + eNoAction, \ + ( pxHigherPriorityTaskWoken ) ); \ + ( pxStreamBuffer )->xTaskWaitingToReceive = NULL; \ + } \ + } \ + taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus ); \ + } while( 0 ) +#endif /* sbSEND_COMPLETE_FROM_ISR */ + + +#if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + #define prvSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ) \ + do { \ + if( ( pxStreamBuffer )->pxSendCompletedCallback != NULL ) \ + { \ + ( pxStreamBuffer )->pxSendCompletedCallback( ( pxStreamBuffer ), pdTRUE, ( pxHigherPriorityTaskWoken ) ); \ + } \ + else \ + { \ + sbSEND_COMPLETE_FROM_ISR( ( pxStreamBuffer ), ( pxHigherPriorityTaskWoken ) ); \ + } \ + } while( 0 ) +#else /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */ + #define prvSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ) \ + sbSEND_COMPLETE_FROM_ISR( ( pxStreamBuffer ), ( pxHigherPriorityTaskWoken ) ) +#endif /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */ + +/* The number of bytes used to hold the length of a message in the buffer. */ +#define sbBYTES_TO_STORE_MESSAGE_LENGTH ( sizeof( configMESSAGE_BUFFER_LENGTH_TYPE ) ) + +/* Bits stored in the ucFlags field of the stream buffer. */ +#define sbFLAGS_IS_MESSAGE_BUFFER ( ( uint8_t ) 1 ) /* Set if the stream buffer was created as a message buffer, in which case it holds discrete messages rather than a stream. */ +#define sbFLAGS_IS_STATICALLY_ALLOCATED ( ( uint8_t ) 2 ) /* Set if the stream buffer was created using statically allocated memory. */ + +/*-----------------------------------------------------------*/ + +/* Structure that hold state information on the buffer. */ +typedef struct StreamBufferDef_t +{ + volatile size_t xTail; /* Index to the next item to read within the buffer. */ + volatile size_t xHead; /* Index to the next item to write within the buffer. */ + size_t xLength; /* The length of the buffer pointed to by pucBuffer. */ + size_t xTriggerLevelBytes; /* The number of bytes that must be in the stream buffer before a task that is waiting for data is unblocked. */ + volatile TaskHandle_t xTaskWaitingToReceive; /* Holds the handle of a task waiting for data, or NULL if no tasks are waiting. */ + volatile TaskHandle_t xTaskWaitingToSend; /* Holds the handle of a task waiting to send data to a message buffer that is full. */ + uint8_t * pucBuffer; /* Points to the buffer itself - that is - the RAM that stores the data passed through the buffer. */ + uint8_t ucFlags; + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxStreamBufferNumber; /* Used for tracing purposes. */ + #endif + + #if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + StreamBufferCallbackFunction_t pxSendCompletedCallback; /* Optional callback called on send complete. sbSEND_COMPLETED is called if this is NULL. */ + StreamBufferCallbackFunction_t pxReceiveCompletedCallback; /* Optional callback called on receive complete. sbRECEIVE_COMPLETED is called if this is NULL. */ + #endif +} StreamBuffer_t; + +/* + * The number of bytes available to be read from the buffer. + */ +static size_t prvBytesInBuffer( const StreamBuffer_t * const pxStreamBuffer ) PRIVILEGED_FUNCTION; + +/* + * Add xCount bytes from pucData into the pxStreamBuffer's data storage area. + * This function does not update the buffer's xHead pointer, so multiple writes + * may be chained together "atomically". This is useful for Message Buffers where + * the length and data bytes are written in two separate chunks, and we don't want + * the reader to see the buffer as having grown until after all data is copied over. + * This function takes a custom xHead value to indicate where to write to (necessary + * for chaining) and returns the the resulting xHead position. + * To mark the write as complete, manually set the buffer's xHead field with the + * returned xHead from this function. + */ +static size_t prvWriteBytesToBuffer( StreamBuffer_t * const pxStreamBuffer, + const uint8_t * pucData, + size_t xCount, + size_t xHead ) PRIVILEGED_FUNCTION; + +/* + * If the stream buffer is being used as a message buffer, then reads an entire + * message out of the buffer. If the stream buffer is being used as a stream + * buffer then read as many bytes as possible from the buffer. + * prvReadBytesFromBuffer() is called to actually extract the bytes from the + * buffer's data storage area. + */ +static size_t prvReadMessageFromBuffer( StreamBuffer_t * pxStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + size_t xBytesAvailable ) PRIVILEGED_FUNCTION; + +/* + * If the stream buffer is being used as a message buffer, then writes an entire + * message to the buffer. If the stream buffer is being used as a stream + * buffer then write as many bytes as possible to the buffer. + * prvWriteBytestoBuffer() is called to actually send the bytes to the buffer's + * data storage area. + */ +static size_t prvWriteMessageToBuffer( StreamBuffer_t * const pxStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + size_t xSpace, + size_t xRequiredSpace ) PRIVILEGED_FUNCTION; + +/* + * Copies xCount bytes from the pxStreamBuffer's data storage area to pucData. + * This function does not update the buffer's xTail pointer, so multiple reads + * may be chained together "atomically". This is useful for Message Buffers where + * the length and data bytes are read in two separate chunks, and we don't want + * the writer to see the buffer as having more free space until after all data is + * copied over, especially if we have to abort the read due to insufficient receiving space. + * This function takes a custom xTail value to indicate where to read from (necessary + * for chaining) and returns the the resulting xTail position. + * To mark the read as complete, manually set the buffer's xTail field with the + * returned xTail from this function. + */ +static size_t prvReadBytesFromBuffer( StreamBuffer_t * pxStreamBuffer, + uint8_t * pucData, + size_t xCount, + size_t xTail ) PRIVILEGED_FUNCTION; + +/* + * Called by both pxStreamBufferCreate() and pxStreamBufferCreateStatic() to + * initialise the members of the newly created stream buffer structure. + */ +static void prvInitialiseNewStreamBuffer( StreamBuffer_t * const pxStreamBuffer, + uint8_t * const pucBuffer, + size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + uint8_t ucFlags, + StreamBufferCallbackFunction_t pxSendCompletedCallback, + StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) PRIVILEGED_FUNCTION; + +/*-----------------------------------------------------------*/ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + StreamBufferHandle_t xStreamBufferGenericCreate( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer, + StreamBufferCallbackFunction_t pxSendCompletedCallback, + StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) + { + void * pvAllocatedMemory; + uint8_t ucFlags; + + traceENTER_xStreamBufferGenericCreate( xBufferSizeBytes, xTriggerLevelBytes, xIsMessageBuffer, pxSendCompletedCallback, pxReceiveCompletedCallback ); + + /* In case the stream buffer is going to be used as a message buffer + * (that is, it will hold discrete messages with a little meta data that + * says how big the next message is) check the buffer will be large enough + * to hold at least one message. */ + if( xIsMessageBuffer == pdTRUE ) + { + /* Is a message buffer but not statically allocated. */ + ucFlags = sbFLAGS_IS_MESSAGE_BUFFER; + configASSERT( xBufferSizeBytes > sbBYTES_TO_STORE_MESSAGE_LENGTH ); + } + else + { + /* Not a message buffer and not statically allocated. */ + ucFlags = 0; + configASSERT( xBufferSizeBytes > 0 ); + } + + configASSERT( xTriggerLevelBytes <= xBufferSizeBytes ); + + /* A trigger level of 0 would cause a waiting task to unblock even when + * the buffer was empty. */ + if( xTriggerLevelBytes == ( size_t ) 0 ) + { + xTriggerLevelBytes = ( size_t ) 1; + } + + /* A stream buffer requires a StreamBuffer_t structure and a buffer. + * Both are allocated in a single call to pvPortMalloc(). The + * StreamBuffer_t structure is placed at the start of the allocated memory + * and the buffer follows immediately after. The requested size is + * incremented so the free space is returned as the user would expect - + * this is a quirk of the implementation that means otherwise the free + * space would be reported as one byte smaller than would be logically + * expected. */ + if( xBufferSizeBytes < ( xBufferSizeBytes + 1U + sizeof( StreamBuffer_t ) ) ) + { + xBufferSizeBytes++; + pvAllocatedMemory = pvPortMalloc( xBufferSizeBytes + sizeof( StreamBuffer_t ) ); + } + else + { + pvAllocatedMemory = NULL; + } + + if( pvAllocatedMemory != NULL ) + { + /* MISRA Ref 11.5.1 [Malloc memory assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + prvInitialiseNewStreamBuffer( ( StreamBuffer_t * ) pvAllocatedMemory, /* Structure at the start of the allocated memory. */ + /* MISRA Ref 11.5.1 [Malloc memory assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + ( ( uint8_t * ) pvAllocatedMemory ) + sizeof( StreamBuffer_t ), /* Storage area follows. */ + xBufferSizeBytes, + xTriggerLevelBytes, + ucFlags, + pxSendCompletedCallback, + pxReceiveCompletedCallback ); + + traceSTREAM_BUFFER_CREATE( ( ( StreamBuffer_t * ) pvAllocatedMemory ), xIsMessageBuffer ); + } + else + { + traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ); + } + + traceRETURN_xStreamBufferGenericCreate( pvAllocatedMemory ); + + /* MISRA Ref 11.5.1 [Malloc memory assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + return ( StreamBufferHandle_t ) pvAllocatedMemory; + } +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + + StreamBufferHandle_t xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer, + uint8_t * const pucStreamBufferStorageArea, + StaticStreamBuffer_t * const pxStaticStreamBuffer, + StreamBufferCallbackFunction_t pxSendCompletedCallback, + StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) + { + /* MISRA Ref 11.3.1 [Misaligned access] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */ + /* coverity[misra_c_2012_rule_11_3_violation] */ + StreamBuffer_t * const pxStreamBuffer = ( StreamBuffer_t * ) pxStaticStreamBuffer; + StreamBufferHandle_t xReturn; + uint8_t ucFlags; + + traceENTER_xStreamBufferGenericCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, xIsMessageBuffer, pucStreamBufferStorageArea, pxStaticStreamBuffer, pxSendCompletedCallback, pxReceiveCompletedCallback ); + + configASSERT( pucStreamBufferStorageArea ); + configASSERT( pxStaticStreamBuffer ); + configASSERT( xTriggerLevelBytes <= xBufferSizeBytes ); + + /* A trigger level of 0 would cause a waiting task to unblock even when + * the buffer was empty. */ + if( xTriggerLevelBytes == ( size_t ) 0 ) + { + xTriggerLevelBytes = ( size_t ) 1; + } + + /* In case the stream buffer is going to be used as a message buffer + * (that is, it will hold discrete messages with a little meta data that + * says how big the next message is) check the buffer will be large enough + * to hold at least one message. */ + + if( xIsMessageBuffer != pdFALSE ) + { + /* Statically allocated message buffer. */ + ucFlags = sbFLAGS_IS_MESSAGE_BUFFER | sbFLAGS_IS_STATICALLY_ALLOCATED; + configASSERT( xBufferSizeBytes > sbBYTES_TO_STORE_MESSAGE_LENGTH ); + } + else + { + /* Statically allocated stream buffer. */ + ucFlags = sbFLAGS_IS_STATICALLY_ALLOCATED; + } + + #if ( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + * variable of type StaticStreamBuffer_t equals the size of the real + * message buffer structure. */ + volatile size_t xSize = sizeof( StaticStreamBuffer_t ); + configASSERT( xSize == sizeof( StreamBuffer_t ) ); + } + #endif /* configASSERT_DEFINED */ + + if( ( pucStreamBufferStorageArea != NULL ) && ( pxStaticStreamBuffer != NULL ) ) + { + prvInitialiseNewStreamBuffer( pxStreamBuffer, + pucStreamBufferStorageArea, + xBufferSizeBytes, + xTriggerLevelBytes, + ucFlags, + pxSendCompletedCallback, + pxReceiveCompletedCallback ); + + /* Remember this was statically allocated in case it is ever deleted + * again. */ + pxStreamBuffer->ucFlags |= sbFLAGS_IS_STATICALLY_ALLOCATED; + + traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer ); + + /* MISRA Ref 11.3.1 [Misaligned access] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */ + /* coverity[misra_c_2012_rule_11_3_violation] */ + xReturn = ( StreamBufferHandle_t ) pxStaticStreamBuffer; + } + else + { + xReturn = NULL; + traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer ); + } + + traceRETURN_xStreamBufferGenericCreateStatic( xReturn ); + + return xReturn; + } +#endif /* ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + BaseType_t xStreamBufferGetStaticBuffers( StreamBufferHandle_t xStreamBuffer, + uint8_t ** ppucStreamBufferStorageArea, + StaticStreamBuffer_t ** ppxStaticStreamBuffer ) + { + BaseType_t xReturn; + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + + traceENTER_xStreamBufferGetStaticBuffers( xStreamBuffer, ppucStreamBufferStorageArea, ppxStaticStreamBuffer ); + + configASSERT( pxStreamBuffer ); + configASSERT( ppucStreamBufferStorageArea ); + configASSERT( ppxStaticStreamBuffer ); + + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_STATICALLY_ALLOCATED ) != ( uint8_t ) 0 ) + { + *ppucStreamBufferStorageArea = pxStreamBuffer->pucBuffer; + /* MISRA Ref 11.3.1 [Misaligned access] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */ + /* coverity[misra_c_2012_rule_11_3_violation] */ + *ppxStaticStreamBuffer = ( StaticStreamBuffer_t * ) pxStreamBuffer; + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + traceRETURN_xStreamBufferGetStaticBuffers( xReturn ); + + return xReturn; + } +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) +{ + StreamBuffer_t * pxStreamBuffer = xStreamBuffer; + + traceENTER_vStreamBufferDelete( xStreamBuffer ); + + configASSERT( pxStreamBuffer ); + + traceSTREAM_BUFFER_DELETE( xStreamBuffer ); + + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_STATICALLY_ALLOCATED ) == ( uint8_t ) pdFALSE ) + { + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* Both the structure and the buffer were allocated using a single call + * to pvPortMalloc(), hence only one call to vPortFree() is required. */ + vPortFree( ( void * ) pxStreamBuffer ); + } + #else + { + /* Should not be possible to get here, ucFlags must be corrupt. + * Force an assert. */ + configASSERT( xStreamBuffer == ( StreamBufferHandle_t ) ~0 ); + } + #endif + } + else + { + /* The structure and buffer were not allocated dynamically and cannot be + * freed - just scrub the structure so future use will assert. */ + ( void ) memset( pxStreamBuffer, 0x00, sizeof( StreamBuffer_t ) ); + } + + traceRETURN_vStreamBufferDelete(); +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + BaseType_t xReturn = pdFAIL; + StreamBufferCallbackFunction_t pxSendCallback = NULL, pxReceiveCallback = NULL; + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxStreamBufferNumber; + #endif + + traceENTER_xStreamBufferReset( xStreamBuffer ); + + configASSERT( pxStreamBuffer ); + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + /* Store the stream buffer number so it can be restored after the + * reset. */ + uxStreamBufferNumber = pxStreamBuffer->uxStreamBufferNumber; + } + #endif + + /* Can only reset a message buffer if there are no tasks blocked on it. */ + taskENTER_CRITICAL(); + { + if( ( pxStreamBuffer->xTaskWaitingToReceive == NULL ) && ( pxStreamBuffer->xTaskWaitingToSend == NULL ) ) + { + #if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + { + pxSendCallback = pxStreamBuffer->pxSendCompletedCallback; + pxReceiveCallback = pxStreamBuffer->pxReceiveCompletedCallback; + } + #endif + + prvInitialiseNewStreamBuffer( pxStreamBuffer, + pxStreamBuffer->pucBuffer, + pxStreamBuffer->xLength, + pxStreamBuffer->xTriggerLevelBytes, + pxStreamBuffer->ucFlags, + pxSendCallback, + pxReceiveCallback ); + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + pxStreamBuffer->uxStreamBufferNumber = uxStreamBufferNumber; + } + #endif + + traceSTREAM_BUFFER_RESET( xStreamBuffer ); + + xReturn = pdPASS; + } + } + taskEXIT_CRITICAL(); + + traceRETURN_xStreamBufferReset( xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, + size_t xTriggerLevel ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + BaseType_t xReturn; + + traceENTER_xStreamBufferSetTriggerLevel( xStreamBuffer, xTriggerLevel ); + + configASSERT( pxStreamBuffer ); + + /* It is not valid for the trigger level to be 0. */ + if( xTriggerLevel == ( size_t ) 0 ) + { + xTriggerLevel = ( size_t ) 1; + } + + /* The trigger level is the number of bytes that must be in the stream + * buffer before a task that is waiting for data is unblocked. */ + if( xTriggerLevel < pxStreamBuffer->xLength ) + { + pxStreamBuffer->xTriggerLevelBytes = xTriggerLevel; + xReturn = pdPASS; + } + else + { + xReturn = pdFALSE; + } + + traceRETURN_xStreamBufferSetTriggerLevel( xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) +{ + const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xSpace; + size_t xOriginalTail; + + traceENTER_xStreamBufferSpacesAvailable( xStreamBuffer ); + + configASSERT( pxStreamBuffer ); + + /* The code below reads xTail and then xHead. This is safe if the stream + * buffer is updated once between the two reads - but not if the stream buffer + * is updated more than once between the two reads - hence the loop. */ + do + { + xOriginalTail = pxStreamBuffer->xTail; + xSpace = pxStreamBuffer->xLength + pxStreamBuffer->xTail; + xSpace -= pxStreamBuffer->xHead; + } while( xOriginalTail != pxStreamBuffer->xTail ); + + xSpace -= ( size_t ) 1; + + if( xSpace >= pxStreamBuffer->xLength ) + { + xSpace -= pxStreamBuffer->xLength; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_xStreamBufferSpacesAvailable( xSpace ); + + return xSpace; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) +{ + const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReturn; + + traceENTER_xStreamBufferBytesAvailable( xStreamBuffer ); + + configASSERT( pxStreamBuffer ); + + xReturn = prvBytesInBuffer( pxStreamBuffer ); + + traceRETURN_xStreamBufferBytesAvailable( xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + TickType_t xTicksToWait ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReturn, xSpace = 0; + size_t xRequiredSpace = xDataLengthBytes; + TimeOut_t xTimeOut; + size_t xMaxReportedSpace = 0; + + traceENTER_xStreamBufferSend( xStreamBuffer, pvTxData, xDataLengthBytes, xTicksToWait ); + + configASSERT( pvTxData ); + configASSERT( pxStreamBuffer ); + + /* The maximum amount of space a stream buffer will ever report is its length + * minus 1. */ + xMaxReportedSpace = pxStreamBuffer->xLength - ( size_t ) 1; + + /* This send function is used to write to both message buffers and stream + * buffers. If this is a message buffer then the space needed must be + * increased by the amount of bytes needed to store the length of the + * message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xRequiredSpace += sbBYTES_TO_STORE_MESSAGE_LENGTH; + + /* Overflow? */ + configASSERT( xRequiredSpace > xDataLengthBytes ); + + /* If this is a message buffer then it must be possible to write the + * whole message. */ + if( xRequiredSpace > xMaxReportedSpace ) + { + /* The message would not fit even if the entire buffer was empty, + * so don't wait for space. */ + xTicksToWait = ( TickType_t ) 0; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* If this is a stream buffer then it is acceptable to write only part + * of the message to the buffer. Cap the length to the total length of + * the buffer. */ + if( xRequiredSpace > xMaxReportedSpace ) + { + xRequiredSpace = xMaxReportedSpace; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + if( xTicksToWait != ( TickType_t ) 0 ) + { + vTaskSetTimeOutState( &xTimeOut ); + + do + { + /* Wait until the required number of bytes are free in the message + * buffer. */ + taskENTER_CRITICAL(); + { + xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer ); + + if( xSpace < xRequiredSpace ) + { + /* Clear notification state as going to wait for space. */ + ( void ) xTaskNotifyStateClear( NULL ); + + /* Should only be one writer. */ + configASSERT( pxStreamBuffer->xTaskWaitingToSend == NULL ); + pxStreamBuffer->xTaskWaitingToSend = xTaskGetCurrentTaskHandle(); + } + else + { + taskEXIT_CRITICAL(); + break; + } + } + taskEXIT_CRITICAL(); + + traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer ); + ( void ) xTaskNotifyWait( ( uint32_t ) 0, ( uint32_t ) 0, NULL, xTicksToWait ); + pxStreamBuffer->xTaskWaitingToSend = NULL; + } while( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xSpace == ( size_t ) 0 ) + { + xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xReturn = prvWriteMessageToBuffer( pxStreamBuffer, pvTxData, xDataLengthBytes, xSpace, xRequiredSpace ); + + if( xReturn > ( size_t ) 0 ) + { + traceSTREAM_BUFFER_SEND( xStreamBuffer, xReturn ); + + /* Was a task waiting for the data? */ + if( prvBytesInBuffer( pxStreamBuffer ) >= pxStreamBuffer->xTriggerLevelBytes ) + { + prvSEND_COMPLETED( pxStreamBuffer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer ); + } + + traceRETURN_xStreamBufferSend( xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + BaseType_t * const pxHigherPriorityTaskWoken ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReturn, xSpace; + size_t xRequiredSpace = xDataLengthBytes; + + traceENTER_xStreamBufferSendFromISR( xStreamBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken ); + + configASSERT( pvTxData ); + configASSERT( pxStreamBuffer ); + + /* This send function is used to write to both message buffers and stream + * buffers. If this is a message buffer then the space needed must be + * increased by the amount of bytes needed to store the length of the + * message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xRequiredSpace += sbBYTES_TO_STORE_MESSAGE_LENGTH; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer ); + xReturn = prvWriteMessageToBuffer( pxStreamBuffer, pvTxData, xDataLengthBytes, xSpace, xRequiredSpace ); + + if( xReturn > ( size_t ) 0 ) + { + /* Was a task waiting for the data? */ + if( prvBytesInBuffer( pxStreamBuffer ) >= pxStreamBuffer->xTriggerLevelBytes ) + { + prvSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xReturn ); + traceRETURN_xStreamBufferSendFromISR( xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +static size_t prvWriteMessageToBuffer( StreamBuffer_t * const pxStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + size_t xSpace, + size_t xRequiredSpace ) +{ + size_t xNextHead = pxStreamBuffer->xHead; + configMESSAGE_BUFFER_LENGTH_TYPE xMessageLength; + + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + /* This is a message buffer, as opposed to a stream buffer. */ + + /* Convert xDataLengthBytes to the message length type. */ + xMessageLength = ( configMESSAGE_BUFFER_LENGTH_TYPE ) xDataLengthBytes; + + /* Ensure the data length given fits within configMESSAGE_BUFFER_LENGTH_TYPE. */ + configASSERT( ( size_t ) xMessageLength == xDataLengthBytes ); + + if( xSpace >= xRequiredSpace ) + { + /* There is enough space to write both the message length and the message + * itself into the buffer. Start by writing the length of the data, the data + * itself will be written later in this function. */ + xNextHead = prvWriteBytesToBuffer( pxStreamBuffer, ( const uint8_t * ) &( xMessageLength ), sbBYTES_TO_STORE_MESSAGE_LENGTH, xNextHead ); + } + else + { + /* Not enough space, so do not write data to the buffer. */ + xDataLengthBytes = 0; + } + } + else + { + /* This is a stream buffer, as opposed to a message buffer, so writing a + * stream of bytes rather than discrete messages. Plan to write as many + * bytes as possible. */ + xDataLengthBytes = configMIN( xDataLengthBytes, xSpace ); + } + + if( xDataLengthBytes != ( size_t ) 0 ) + { + /* Write the data to the buffer. */ + /* MISRA Ref 11.5.5 [Void pointer assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + pxStreamBuffer->xHead = prvWriteBytesToBuffer( pxStreamBuffer, ( const uint8_t * ) pvTxData, xDataLengthBytes, xNextHead ); + } + + return xDataLengthBytes; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + TickType_t xTicksToWait ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReceivedLength = 0, xBytesAvailable, xBytesToStoreMessageLength; + + traceENTER_xStreamBufferReceive( xStreamBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ); + + configASSERT( pvRxData ); + configASSERT( pxStreamBuffer ); + + /* This receive function is used by both message buffers, which store + * discrete messages, and stream buffers, which store a continuous stream of + * bytes. Discrete messages include an additional + * sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the + * message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH; + } + else + { + xBytesToStoreMessageLength = 0; + } + + if( xTicksToWait != ( TickType_t ) 0 ) + { + /* Checking if there is data and clearing the notification state must be + * performed atomically. */ + taskENTER_CRITICAL(); + { + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + + /* If this function was invoked by a message buffer read then + * xBytesToStoreMessageLength holds the number of bytes used to hold + * the length of the next discrete message. If this function was + * invoked by a stream buffer read then xBytesToStoreMessageLength will + * be 0. */ + if( xBytesAvailable <= xBytesToStoreMessageLength ) + { + /* Clear notification state as going to wait for data. */ + ( void ) xTaskNotifyStateClear( NULL ); + + /* Should only be one reader. */ + configASSERT( pxStreamBuffer->xTaskWaitingToReceive == NULL ); + pxStreamBuffer->xTaskWaitingToReceive = xTaskGetCurrentTaskHandle(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + if( xBytesAvailable <= xBytesToStoreMessageLength ) + { + /* Wait for data to be available. */ + traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer ); + ( void ) xTaskNotifyWait( ( uint32_t ) 0, ( uint32_t ) 0, NULL, xTicksToWait ); + pxStreamBuffer->xTaskWaitingToReceive = NULL; + + /* Recheck the data available after blocking. */ + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + } + + /* Whether receiving a discrete message (where xBytesToStoreMessageLength + * holds the number of bytes used to store the message length) or a stream of + * bytes (where xBytesToStoreMessageLength is zero), the number of bytes + * available must be greater than xBytesToStoreMessageLength to be able to + * read bytes from the buffer. */ + if( xBytesAvailable > xBytesToStoreMessageLength ) + { + xReceivedLength = prvReadMessageFromBuffer( pxStreamBuffer, pvRxData, xBufferLengthBytes, xBytesAvailable ); + + /* Was a task waiting for space in the buffer? */ + if( xReceivedLength != ( size_t ) 0 ) + { + traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength ); + prvRECEIVE_COMPLETED( xStreamBuffer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer ); + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_xStreamBufferReceive( xReceivedLength ); + + return xReceivedLength; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReturn, xBytesAvailable; + configMESSAGE_BUFFER_LENGTH_TYPE xTempReturn; + + traceENTER_xStreamBufferNextMessageLengthBytes( xStreamBuffer ); + + configASSERT( pxStreamBuffer ); + + /* Ensure the stream buffer is being used as a message buffer. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + + if( xBytesAvailable > sbBYTES_TO_STORE_MESSAGE_LENGTH ) + { + /* The number of bytes available is greater than the number of bytes + * required to hold the length of the next message, so another message + * is available. */ + ( void ) prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) &xTempReturn, sbBYTES_TO_STORE_MESSAGE_LENGTH, pxStreamBuffer->xTail ); + xReturn = ( size_t ) xTempReturn; + } + else + { + /* The minimum amount of bytes in a message buffer is + * ( sbBYTES_TO_STORE_MESSAGE_LENGTH + 1 ), so if xBytesAvailable is + * less than sbBYTES_TO_STORE_MESSAGE_LENGTH the only other valid + * value is 0. */ + configASSERT( xBytesAvailable == 0 ); + xReturn = 0; + } + } + else + { + xReturn = 0; + } + + traceRETURN_xStreamBufferNextMessageLengthBytes( xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + BaseType_t * const pxHigherPriorityTaskWoken ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReceivedLength = 0, xBytesAvailable, xBytesToStoreMessageLength; + + traceENTER_xStreamBufferReceiveFromISR( xStreamBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken ); + + configASSERT( pvRxData ); + configASSERT( pxStreamBuffer ); + + /* This receive function is used by both message buffers, which store + * discrete messages, and stream buffers, which store a continuous stream of + * bytes. Discrete messages include an additional + * sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the + * message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH; + } + else + { + xBytesToStoreMessageLength = 0; + } + + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + + /* Whether receiving a discrete message (where xBytesToStoreMessageLength + * holds the number of bytes used to store the message length) or a stream of + * bytes (where xBytesToStoreMessageLength is zero), the number of bytes + * available must be greater than xBytesToStoreMessageLength to be able to + * read bytes from the buffer. */ + if( xBytesAvailable > xBytesToStoreMessageLength ) + { + xReceivedLength = prvReadMessageFromBuffer( pxStreamBuffer, pvRxData, xBufferLengthBytes, xBytesAvailable ); + + /* Was a task waiting for space in the buffer? */ + if( xReceivedLength != ( size_t ) 0 ) + { + prvRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength ); + traceRETURN_xStreamBufferReceiveFromISR( xReceivedLength ); + + return xReceivedLength; +} +/*-----------------------------------------------------------*/ + +static size_t prvReadMessageFromBuffer( StreamBuffer_t * pxStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + size_t xBytesAvailable ) +{ + size_t xCount, xNextMessageLength; + configMESSAGE_BUFFER_LENGTH_TYPE xTempNextMessageLength; + size_t xNextTail = pxStreamBuffer->xTail; + + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + /* A discrete message is being received. First receive the length + * of the message. */ + xNextTail = prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) &xTempNextMessageLength, sbBYTES_TO_STORE_MESSAGE_LENGTH, xNextTail ); + xNextMessageLength = ( size_t ) xTempNextMessageLength; + + /* Reduce the number of bytes available by the number of bytes just + * read out. */ + xBytesAvailable -= sbBYTES_TO_STORE_MESSAGE_LENGTH; + + /* Check there is enough space in the buffer provided by the + * user. */ + if( xNextMessageLength > xBufferLengthBytes ) + { + /* The user has provided insufficient space to read the message. */ + xNextMessageLength = 0; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* A stream of bytes is being received (as opposed to a discrete + * message), so read as many bytes as possible. */ + xNextMessageLength = xBufferLengthBytes; + } + + /* Use the minimum of the wanted bytes and the available bytes. */ + xCount = configMIN( xNextMessageLength, xBytesAvailable ); + + if( xCount != ( size_t ) 0 ) + { + /* Read the actual data and update the tail to mark the data as officially consumed. */ + /* MISRA Ref 11.5.5 [Void pointer assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + pxStreamBuffer->xTail = prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) pvRxData, xCount, xNextTail ); + } + + return xCount; +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) +{ + const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + BaseType_t xReturn; + size_t xTail; + + traceENTER_xStreamBufferIsEmpty( xStreamBuffer ); + + configASSERT( pxStreamBuffer ); + + /* True if no bytes are available. */ + xTail = pxStreamBuffer->xTail; + + if( pxStreamBuffer->xHead == xTail ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + traceRETURN_xStreamBufferIsEmpty( xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) +{ + BaseType_t xReturn; + size_t xBytesToStoreMessageLength; + const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + + traceENTER_xStreamBufferIsFull( xStreamBuffer ); + + configASSERT( pxStreamBuffer ); + + /* This generic version of the receive function is used by both message + * buffers, which store discrete messages, and stream buffers, which store a + * continuous stream of bytes. Discrete messages include an additional + * sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH; + } + else + { + xBytesToStoreMessageLength = 0; + } + + /* True if the available space equals zero. */ + if( xStreamBufferSpacesAvailable( xStreamBuffer ) <= xBytesToStoreMessageLength ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + traceRETURN_xStreamBufferIsFull( xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, + BaseType_t * pxHigherPriorityTaskWoken ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + + traceENTER_xStreamBufferSendCompletedFromISR( xStreamBuffer, pxHigherPriorityTaskWoken ); + + configASSERT( pxStreamBuffer ); + + uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR(); + { + if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL ) + { + ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToReceive, + ( uint32_t ) 0, + eNoAction, + pxHigherPriorityTaskWoken ); + ( pxStreamBuffer )->xTaskWaitingToReceive = NULL; + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus ); + + traceRETURN_xStreamBufferSendCompletedFromISR( xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, + BaseType_t * pxHigherPriorityTaskWoken ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + + traceENTER_xStreamBufferReceiveCompletedFromISR( xStreamBuffer, pxHigherPriorityTaskWoken ); + + configASSERT( pxStreamBuffer ); + + uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR(); + { + if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL ) + { + ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToSend, + ( uint32_t ) 0, + eNoAction, + pxHigherPriorityTaskWoken ); + ( pxStreamBuffer )->xTaskWaitingToSend = NULL; + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus ); + + traceRETURN_xStreamBufferReceiveCompletedFromISR( xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +static size_t prvWriteBytesToBuffer( StreamBuffer_t * const pxStreamBuffer, + const uint8_t * pucData, + size_t xCount, + size_t xHead ) +{ + size_t xFirstLength; + + configASSERT( xCount > ( size_t ) 0 ); + + /* Calculate the number of bytes that can be added in the first write - + * which may be less than the total number of bytes that need to be added if + * the buffer will wrap back to the beginning. */ + xFirstLength = configMIN( pxStreamBuffer->xLength - xHead, xCount ); + + /* Write as many bytes as can be written in the first write. */ + configASSERT( ( xHead + xFirstLength ) <= pxStreamBuffer->xLength ); + ( void ) memcpy( ( void * ) ( &( pxStreamBuffer->pucBuffer[ xHead ] ) ), ( const void * ) pucData, xFirstLength ); + + /* If the number of bytes written was less than the number that could be + * written in the first write... */ + if( xCount > xFirstLength ) + { + /* ...then write the remaining bytes to the start of the buffer. */ + configASSERT( ( xCount - xFirstLength ) <= pxStreamBuffer->xLength ); + ( void ) memcpy( ( void * ) pxStreamBuffer->pucBuffer, ( const void * ) &( pucData[ xFirstLength ] ), xCount - xFirstLength ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xHead += xCount; + + if( xHead >= pxStreamBuffer->xLength ) + { + xHead -= pxStreamBuffer->xLength; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xHead; +} +/*-----------------------------------------------------------*/ + +static size_t prvReadBytesFromBuffer( StreamBuffer_t * pxStreamBuffer, + uint8_t * pucData, + size_t xCount, + size_t xTail ) +{ + size_t xFirstLength; + + configASSERT( xCount != ( size_t ) 0 ); + + /* Calculate the number of bytes that can be read - which may be + * less than the number wanted if the data wraps around to the start of + * the buffer. */ + xFirstLength = configMIN( pxStreamBuffer->xLength - xTail, xCount ); + + /* Obtain the number of bytes it is possible to obtain in the first + * read. Asserts check bounds of read and write. */ + configASSERT( xFirstLength <= xCount ); + configASSERT( ( xTail + xFirstLength ) <= pxStreamBuffer->xLength ); + ( void ) memcpy( ( void * ) pucData, ( const void * ) &( pxStreamBuffer->pucBuffer[ xTail ] ), xFirstLength ); + + /* If the total number of wanted bytes is greater than the number + * that could be read in the first read... */ + if( xCount > xFirstLength ) + { + /* ...then read the remaining bytes from the start of the buffer. */ + ( void ) memcpy( ( void * ) &( pucData[ xFirstLength ] ), ( void * ) ( pxStreamBuffer->pucBuffer ), xCount - xFirstLength ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Move the tail pointer to effectively remove the data read from the buffer. */ + xTail += xCount; + + if( xTail >= pxStreamBuffer->xLength ) + { + xTail -= pxStreamBuffer->xLength; + } + + return xTail; +} +/*-----------------------------------------------------------*/ + +static size_t prvBytesInBuffer( const StreamBuffer_t * const pxStreamBuffer ) +{ +/* Returns the distance between xTail and xHead. */ + size_t xCount; + + xCount = pxStreamBuffer->xLength + pxStreamBuffer->xHead; + xCount -= pxStreamBuffer->xTail; + + if( xCount >= pxStreamBuffer->xLength ) + { + xCount -= pxStreamBuffer->xLength; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xCount; +} +/*-----------------------------------------------------------*/ + +static void prvInitialiseNewStreamBuffer( StreamBuffer_t * const pxStreamBuffer, + uint8_t * const pucBuffer, + size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + uint8_t ucFlags, + StreamBufferCallbackFunction_t pxSendCompletedCallback, + StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) +{ + /* Assert here is deliberately writing to the entire buffer to ensure it can + * be written to without generating exceptions, and is setting the buffer to a + * known value to assist in development/debugging. */ + #if ( configASSERT_DEFINED == 1 ) + { + /* The value written just has to be identifiable when looking at the + * memory. Don't use 0xA5 as that is the stack fill value and could + * result in confusion as to what is actually being observed. */ + #define STREAM_BUFFER_BUFFER_WRITE_VALUE ( 0x55 ) + configASSERT( memset( pucBuffer, ( int ) STREAM_BUFFER_BUFFER_WRITE_VALUE, xBufferSizeBytes ) == pucBuffer ); + } + #endif + + ( void ) memset( ( void * ) pxStreamBuffer, 0x00, sizeof( StreamBuffer_t ) ); + pxStreamBuffer->pucBuffer = pucBuffer; + pxStreamBuffer->xLength = xBufferSizeBytes; + pxStreamBuffer->xTriggerLevelBytes = xTriggerLevelBytes; + pxStreamBuffer->ucFlags = ucFlags; + #if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + { + pxStreamBuffer->pxSendCompletedCallback = pxSendCompletedCallback; + pxStreamBuffer->pxReceiveCompletedCallback = pxReceiveCompletedCallback; + } + #else + { + /* MISRA Ref 11.1.1 [Object type casting] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-111 */ + /* coverity[misra_c_2012_rule_11_1_violation] */ + ( void ) pxSendCompletedCallback; + + /* MISRA Ref 11.1.1 [Object type casting] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-111 */ + /* coverity[misra_c_2012_rule_11_1_violation] */ + ( void ) pxReceiveCompletedCallback; + } + #endif /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */ +} + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxStreamBufferGetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer ) + { + traceENTER_uxStreamBufferGetStreamBufferNumber( xStreamBuffer ); + + traceRETURN_uxStreamBufferGetStreamBufferNumber( xStreamBuffer->uxStreamBufferNumber ); + + return xStreamBuffer->uxStreamBufferNumber; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vStreamBufferSetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer, + UBaseType_t uxStreamBufferNumber ) + { + traceENTER_vStreamBufferSetStreamBufferNumber( xStreamBuffer, uxStreamBufferNumber ); + + xStreamBuffer->uxStreamBufferNumber = uxStreamBufferNumber; + + traceRETURN_vStreamBufferSetStreamBufferNumber(); + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + uint8_t ucStreamBufferGetStreamBufferType( StreamBufferHandle_t xStreamBuffer ) + { + traceENTER_ucStreamBufferGetStreamBufferType( xStreamBuffer ); + + traceRETURN_ucStreamBufferGetStreamBufferType( ( uint8_t ) ( xStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) ); + + return( ( uint8_t ) ( xStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) ); + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/tasks.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/tasks.c new file mode 100644 index 0000000..2e71f07 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/tasks.c @@ -0,0 +1,8859 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "timers.h" +#include "stack_macros.h" + + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) ) +#include "McuUtility.h" /* interface to utility because used for safe string routines */ /* << EST */ +#endif + +#if (configCOMPILER == configCOMPILER_ARM_IAR) /* << EST: suppress warnings for IAR */ +#pragma diag_suppress=pa082 /* Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement */ +#endif + +/* The MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined + * for the header files above, but not in this file, in order to generate the + * correct privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Set configUSE_STATS_FORMATTING_FUNCTIONS to 2 to include the stats formatting + * functions but without including stdio.h here. */ +#if ( configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) + +/* At the bottom of this file are two optional functions that can be used + * to generate human readable text from the raw data generated by the + * uxTaskGetSystemState() function. Note the formatting functions are provided + * for convenience only, and are NOT considered part of the kernel. */ + #include +#endif /* configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) */ + +#if ( configUSE_PREEMPTION == 0 ) + +/* If the cooperative scheduler is being used then a yield should not be + * performed just because a higher priority task has been woken. */ + #define taskYIELD_TASK_CORE_IF_USING_PREEMPTION( pxTCB ) + #define taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxTCB ) +#else + + #if ( configNUMBER_OF_CORES == 1 ) + +/* This macro requests the running task pxTCB to yield. In single core + * scheduler, a running task always runs on core 0 and portYIELD_WITHIN_API() + * can be used to request the task running on core 0 to yield. Therefore, pxTCB + * is not used in this macro. */ + #define taskYIELD_TASK_CORE_IF_USING_PREEMPTION( pxTCB ) \ + do { \ + ( void ) ( pxTCB ); \ + portYIELD_WITHIN_API(); \ + } while( 0 ) + + #define taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxTCB ) \ + do { \ + if( pxCurrentTCB->uxPriority < ( pxTCB )->uxPriority ) \ + { \ + portYIELD_WITHIN_API(); \ + } \ + else \ + { \ + mtCOVERAGE_TEST_MARKER(); \ + } \ + } while( 0 ) + + #else /* if ( configNUMBER_OF_CORES == 1 ) */ + +/* Yield the core on which this task is running. */ + #define taskYIELD_TASK_CORE_IF_USING_PREEMPTION( pxTCB ) prvYieldCore( ( pxTCB )->xTaskRunState ) + +/* Yield for the task if a running task has priority lower than this task. */ + #define taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxTCB ) prvYieldForTask( pxTCB ) + + #endif /* #if ( configNUMBER_OF_CORES == 1 ) */ + +#endif /* if ( configUSE_PREEMPTION == 0 ) */ + +/* Values that can be assigned to the ucNotifyState member of the TCB. */ +#define taskNOT_WAITING_NOTIFICATION ( ( uint8_t ) 0 ) /* Must be zero as it is the initialised value. */ +#define taskWAITING_NOTIFICATION ( ( uint8_t ) 1 ) +#define taskNOTIFICATION_RECEIVED ( ( uint8_t ) 2 ) + +/* + * The value used to fill the stack of a task when the task is created. This + * is used purely for checking the high water mark for tasks. + */ +#define tskSTACK_FILL_BYTE ( 0xa5U ) + +/* Bits used to record how a task's stack and TCB were allocated. */ +#define tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB ( ( uint8_t ) 0 ) +#define tskSTATICALLY_ALLOCATED_STACK_ONLY ( ( uint8_t ) 1 ) +#define tskSTATICALLY_ALLOCATED_STACK_AND_TCB ( ( uint8_t ) 2 ) + +/* If any of the following are set then task stacks are filled with a known + * value so the high water mark can be determined. If none of the following are + * set then don't fill the stack so there is no unnecessary dependency on memset. */ +#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) + #define tskSET_NEW_STACKS_TO_KNOWN_VALUE 1 +#else + #define tskSET_NEW_STACKS_TO_KNOWN_VALUE 0 +#endif + +/* + * Macros used by vListTask to indicate which state a task is in. + */ +#define tskRUNNING_CHAR ( 'X' ) +#define tskBLOCKED_CHAR ( 'B' ) +#define tskREADY_CHAR ( 'R' ) +#define tskDELETED_CHAR ( 'D' ) +#define tskSUSPENDED_CHAR ( 'S' ) + +/* + * Some kernel aware debuggers require the data the debugger needs access to to + * be global, rather than file scope. + */ +#ifdef portREMOVE_STATIC_QUALIFIER + #define static +#endif + +/* The name allocated to the Idle task. This can be overridden by defining + * configIDLE_TASK_NAME in FreeRTOSConfig.h. */ +#ifndef configIDLE_TASK_NAME + #define configIDLE_TASK_NAME "IDLE" +#endif + +#if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 ) + +/* If configUSE_PORT_OPTIMISED_TASK_SELECTION is 0 then task selection is + * performed in a generic way that is not optimised to any particular + * microcontroller architecture. */ + +/* uxTopReadyPriority holds the priority of the highest priority ready + * state task. */ + #define taskRECORD_READY_PRIORITY( uxPriority ) \ + do { \ + if( ( uxPriority ) > uxTopReadyPriority ) \ + { \ + uxTopReadyPriority = ( uxPriority ); \ + } \ + } while( 0 ) /* taskRECORD_READY_PRIORITY */ + +/*-----------------------------------------------------------*/ + + #if ( configNUMBER_OF_CORES == 1 ) + #define taskSELECT_HIGHEST_PRIORITY_TASK() \ + do { \ + UBaseType_t uxTopPriority = uxTopReadyPriority; \ + \ + /* Find the highest priority queue that contains ready tasks. */ \ + while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopPriority ] ) ) ) \ + { \ + configASSERT( uxTopPriority ); \ + --uxTopPriority; \ + } \ + \ + /* listGET_OWNER_OF_NEXT_ENTRY indexes through the list, so the tasks of \ + * the same priority get an equal share of the processor time. */ \ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) ); \ + uxTopReadyPriority = uxTopPriority; \ + } while( 0 ) /* taskSELECT_HIGHEST_PRIORITY_TASK */ + #else /* if ( configNUMBER_OF_CORES == 1 ) */ + + #define taskSELECT_HIGHEST_PRIORITY_TASK( xCoreID ) prvSelectHighestPriorityTask( xCoreID ) + + #endif /* if ( configNUMBER_OF_CORES == 1 ) */ + +/*-----------------------------------------------------------*/ + +/* Define away taskRESET_READY_PRIORITY() and portRESET_READY_PRIORITY() as + * they are only required when a port optimised method of task selection is + * being used. */ + #define taskRESET_READY_PRIORITY( uxPriority ) + #define portRESET_READY_PRIORITY( uxPriority, uxTopReadyPriority ) + +#else /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/* If configUSE_PORT_OPTIMISED_TASK_SELECTION is 1 then task selection is + * performed in a way that is tailored to the particular microcontroller + * architecture being used. */ + +/* A port optimised version is provided. Call the port defined macros. */ + #define taskRECORD_READY_PRIORITY( uxPriority ) portRECORD_READY_PRIORITY( ( uxPriority ), uxTopReadyPriority ) + +/*-----------------------------------------------------------*/ + + #define taskSELECT_HIGHEST_PRIORITY_TASK() \ + do { \ + UBaseType_t uxTopPriority; \ + \ + /* Find the highest priority list that contains ready tasks. */ \ + portGET_HIGHEST_PRIORITY( uxTopPriority, uxTopReadyPriority ); \ + configASSERT( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ uxTopPriority ] ) ) > 0 ); \ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) ); \ + } while( 0 ) + +/*-----------------------------------------------------------*/ + +/* A port optimised version is provided, call it only if the TCB being reset + * is being referenced from a ready list. If it is referenced from a delayed + * or suspended list then it won't be in a ready list. */ + #define taskRESET_READY_PRIORITY( uxPriority ) \ + do { \ + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ ( uxPriority ) ] ) ) == ( UBaseType_t ) 0 ) \ + { \ + portRESET_READY_PRIORITY( ( uxPriority ), ( uxTopReadyPriority ) ); \ + } \ + } while( 0 ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + +/* pxDelayedTaskList and pxOverflowDelayedTaskList are switched when the tick + * count overflows. */ +#define taskSWITCH_DELAYED_LISTS() \ + do { \ + List_t * pxTemp; \ + \ + /* The delayed tasks list should be empty when the lists are switched. */ \ + configASSERT( ( listLIST_IS_EMPTY( pxDelayedTaskList ) ) ); \ + \ + pxTemp = pxDelayedTaskList; \ + pxDelayedTaskList = pxOverflowDelayedTaskList; \ + pxOverflowDelayedTaskList = pxTemp; \ + xNumOfOverflows++; \ + prvResetNextTaskUnblockTime(); \ + } while( 0 ) + +/*-----------------------------------------------------------*/ + +/* + * Place the task represented by pxTCB into the appropriate ready list for + * the task. It is inserted at the end of the list. + */ +#define prvAddTaskToReadyList( pxTCB ) \ + do { \ + traceMOVED_TASK_TO_READY_STATE( pxTCB ); \ + taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority ); \ + listINSERT_END( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xStateListItem ) ); \ + tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB ); \ + } while( 0 ) +/*-----------------------------------------------------------*/ + +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS /* << EST */ +/* + * Place the task represented by pxTCB which has been in a ready list before + * into the appropriate ready list for the task. + * It is inserted at the end of the list. + */ +#define prvReAddTaskToReadyList( pxTCB ) \ + traceREADDED_TASK_TO_READY_STATE( pxTCB ); \ + taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority ); \ + vListInsertEnd( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xStateListItem ) ); \ + tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB ) +#endif /* configUSE_SEGGER_SYSTEM_VIEWER_HOOKS */ /* << EST */ + +/* + * Several functions take a TaskHandle_t parameter that can optionally be NULL, + * where NULL is used to indicate that the handle of the currently executing + * task should be used in place of the parameter. This macro simply checks to + * see if the parameter is NULL and returns a pointer to the appropriate TCB. + */ +#define prvGetTCBFromHandle( pxHandle ) ( ( ( pxHandle ) == NULL ) ? pxCurrentTCB : ( pxHandle ) ) + +/* The item value of the event list item is normally used to hold the priority + * of the task to which it belongs (coded to allow it to be held in reverse + * priority order). However, it is occasionally borrowed for other purposes. It + * is important its value is not updated due to a task priority change while it is + * being used for another purpose. The following bit definition is used to inform + * the scheduler that the value should not be changed - in which case it is the + * responsibility of whichever module is using the value to ensure it gets set back + * to its original value when it is released. */ +#if ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_16_BITS ) + #define taskEVENT_LIST_ITEM_VALUE_IN_USE ( ( uint16_t ) 0x8000U ) +#elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_32_BITS ) + #define taskEVENT_LIST_ITEM_VALUE_IN_USE ( ( uint32_t ) 0x80000000UL ) +#elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_64_BITS ) + #define taskEVENT_LIST_ITEM_VALUE_IN_USE ( ( uint64_t ) 0x8000000000000000ULL ) +#endif + +/* Indicates that the task is not actively running on any core. */ +#define taskTASK_NOT_RUNNING ( ( BaseType_t ) ( -1 ) ) + +/* Indicates that the task is actively running but scheduled to yield. */ +#define taskTASK_SCHEDULED_TO_YIELD ( ( BaseType_t ) ( -2 ) ) + +/* Returns pdTRUE if the task is actively running and not scheduled to yield. */ +#if ( configNUMBER_OF_CORES == 1 ) + #define taskTASK_IS_RUNNING( pxTCB ) ( ( ( pxTCB ) == pxCurrentTCB ) ? ( pdTRUE ) : ( pdFALSE ) ) + #define taskTASK_IS_RUNNING_OR_SCHEDULED_TO_YIELD( pxTCB ) ( ( ( pxTCB ) == pxCurrentTCB ) ? ( pdTRUE ) : ( pdFALSE ) ) +#else + #define taskTASK_IS_RUNNING( pxTCB ) ( ( ( ( pxTCB )->xTaskRunState >= ( BaseType_t ) 0 ) && ( ( pxTCB )->xTaskRunState < ( BaseType_t ) configNUMBER_OF_CORES ) ) ? ( pdTRUE ) : ( pdFALSE ) ) + #define taskTASK_IS_RUNNING_OR_SCHEDULED_TO_YIELD( pxTCB ) ( ( ( pxTCB )->xTaskRunState != taskTASK_NOT_RUNNING ) ? ( pdTRUE ) : ( pdFALSE ) ) +#endif + +/* Indicates that the task is an Idle task. */ +#define taskATTRIBUTE_IS_IDLE ( UBaseType_t ) ( 1UL << 0UL ) + +#if ( ( configNUMBER_OF_CORES > 1 ) && ( portCRITICAL_NESTING_IN_TCB == 1 ) ) + #define portGET_CRITICAL_NESTING_COUNT() ( pxCurrentTCBs[ portGET_CORE_ID() ]->uxCriticalNesting ) + #define portSET_CRITICAL_NESTING_COUNT( x ) ( pxCurrentTCBs[ portGET_CORE_ID() ]->uxCriticalNesting = ( x ) ) + #define portINCREMENT_CRITICAL_NESTING_COUNT() ( pxCurrentTCBs[ portGET_CORE_ID() ]->uxCriticalNesting++ ) + #define portDECREMENT_CRITICAL_NESTING_COUNT() ( pxCurrentTCBs[ portGET_CORE_ID() ]->uxCriticalNesting-- ) +#endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( portCRITICAL_NESTING_IN_TCB == 1 ) ) */ + +#define taskBITS_PER_BYTE ( ( size_t ) 8 ) + +#if ( configNUMBER_OF_CORES > 1 ) + +/* Yields the given core. This must be called from a critical section and xCoreID + * must be valid. This macro is not required in single core since there is only + * one core to yield. */ + #define prvYieldCore( xCoreID ) \ + do { \ + if( ( xCoreID ) == ( BaseType_t ) portGET_CORE_ID() ) \ + { \ + /* Pending a yield for this core since it is in the critical section. */ \ + xYieldPendings[ ( xCoreID ) ] = pdTRUE; \ + } \ + else \ + { \ + /* Request other core to yield if it is not requested before. */ \ + if( pxCurrentTCBs[ ( xCoreID ) ]->xTaskRunState != taskTASK_SCHEDULED_TO_YIELD ) \ + { \ + portYIELD_CORE( xCoreID ); \ + pxCurrentTCBs[ ( xCoreID ) ]->xTaskRunState = taskTASK_SCHEDULED_TO_YIELD; \ + } \ + } \ + } while( 0 ) +#endif /* #if ( configNUMBER_OF_CORES > 1 ) */ +/*-----------------------------------------------------------*/ + +/* + * Task control block. A task control block (TCB) is allocated for each task, + * and stores task state information, including a pointer to the task's context + * (the task's run time environment, including register values) + */ +typedef struct tskTaskControlBlock /* The old naming convention is used to prevent breaking kernel aware debuggers. */ +{ + volatile StackType_t * pxTopOfStack; /**< Points to the location of the last item placed on the tasks stack. THIS MUST BE THE FIRST MEMBER OF THE TCB STRUCT. */ + + #if ( portUSING_MPU_WRAPPERS == 1 ) + xMPU_SETTINGS xMPUSettings; /**< The MPU settings are defined as part of the port layer. THIS MUST BE THE SECOND MEMBER OF THE TCB STRUCT. */ + #endif + + #if ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 ) + UBaseType_t uxCoreAffinityMask; /**< Used to link the task to certain cores. UBaseType_t must have greater than or equal to the number of bits as configNUMBER_OF_CORES. */ + #endif + + ListItem_t xStateListItem; /**< The list that the state list item of a task is reference from denotes the state of that task (Ready, Blocked, Suspended ). */ + ListItem_t xEventListItem; /**< Used to reference a task from an event list. */ + UBaseType_t uxPriority; /**< The priority of the task. 0 is the lowest priority. */ + StackType_t * pxStack; /**< Points to the start of the stack. */ + #if ( configNUMBER_OF_CORES > 1 ) + volatile BaseType_t xTaskRunState; /**< Used to identify the core the task is running on, if the task is running. Otherwise, identifies the task's state - not running or yielding. */ + UBaseType_t uxTaskAttributes; /**< Task's attributes - currently used to identify the idle tasks. */ + #endif + char pcTaskName[ configMAX_TASK_NAME_LEN ]; /**< Descriptive name given to the task when created. Facilitates debugging only. */ + + #if ( configUSE_TASK_PREEMPTION_DISABLE == 1 ) + BaseType_t xPreemptionDisable; /**< Used to prevent the task from being preempted. */ + #endif + + #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) ) + StackType_t * pxEndOfStack; /**< Points to the highest valid address for the stack. */ + #endif + + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + UBaseType_t uxCriticalNesting; /**< Holds the critical section nesting depth for ports that do not maintain their own count in the port layer. */ + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxTCBNumber; /**< Stores a number that increments each time a TCB is created. It allows debuggers to determine when a task has been deleted and then recreated. */ + UBaseType_t uxTaskNumber; /**< Stores a number specifically for use by third party trace code. */ + #endif + + #if ( configUSE_MUTEXES == 1 ) + UBaseType_t uxBasePriority; /**< The priority last assigned to the task - used by the priority inheritance mechanism. */ + UBaseType_t uxMutexesHeld; + #endif + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + TaskHookFunction_t pxTaskTag; + #endif + + #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + void * pvThreadLocalStoragePointers[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + configRUN_TIME_COUNTER_TYPE ulRunTimeCounter; /**< Stores the amount of time the task has spent in the Running state. */ + #endif + + #if ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) + configTLS_BLOCK_TYPE xTLSBlock; /**< Memory block used as Thread Local Storage (TLS) Block for the task. */ + #endif + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + volatile uint32_t ulNotifiedValue[ configTASK_NOTIFICATION_ARRAY_ENTRIES ]; + volatile uint8_t ucNotifyState[ configTASK_NOTIFICATION_ARRAY_ENTRIES ]; + #endif + + /* See the comments in FreeRTOS.h with the definition of + * tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE. */ + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + uint8_t ucStaticallyAllocated; /**< Set to pdTRUE if the task is a statically allocated to ensure no attempt is made to free the memory. */ + #endif + + #if ( INCLUDE_xTaskAbortDelay == 1 ) + uint8_t ucDelayAborted; + #endif + + #if ( configUSE_POSIX_ERRNO == 1 ) + int iTaskErrno; + #endif +} tskTCB; + +/* The old tskTCB name is maintained above then typedefed to the new TCB_t name + * below to enable the use of older kernel aware debuggers. */ +typedef tskTCB TCB_t; + +#if ( configNUMBER_OF_CORES == 1 ) + /* MISRA Ref 8.4.1 [Declaration shall be visible] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-84 */ + /* coverity[misra_c_2012_rule_8_4_violation] */ + portDONT_DISCARD PRIVILEGED_DATA TCB_t * volatile pxCurrentTCB = NULL; +#else + /* MISRA Ref 8.4.1 [Declaration shall be visible] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-84 */ + /* coverity[misra_c_2012_rule_8_4_violation] */ + portDONT_DISCARD PRIVILEGED_DATA TCB_t * volatile pxCurrentTCBs[ configNUMBER_OF_CORES ]; + #define pxCurrentTCB xTaskGetCurrentTaskHandle() +#endif + +/* Lists for ready and blocked tasks. -------------------- + * xDelayedTaskList1 and xDelayedTaskList2 could be moved to function scope but + * doing so breaks some kernel aware debuggers and debuggers that rely on removing + * the static qualifier. */ +#if configLTO_HELPER /* << EST */ + /* If using -lto (Link Time Optimization), the linker might replace/remove the names of the following variables. + * If using a FreeRTOS Kernel aware debugger (e.g. Segger FreeRTOS task aware plugin), then the debugger won't be able to see the symbols and will fail. + * Therefore (more as of a hack) the symbols are defined with external linkage, even if not used from other modules. + * See https://mcuoneclipse.com/2017/07/27/troubleshooting-tips-for-freertos-thread-aware-debugging-in-eclipse/ + */ +PRIVILEGED_DATA /*static*/ List_t pxReadyTasksLists[ configMAX_PRIORITIES ]; /**< Prioritised ready tasks. */ +PRIVILEGED_DATA /*static*/ List_t xDelayedTaskList1; /**< Delayed tasks. */ +PRIVILEGED_DATA /*static*/ List_t xDelayedTaskList2; /**< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */ +PRIVILEGED_DATA /*static*/ List_t * volatile pxDelayedTaskList; /**< Points to the delayed task list currently being used. */ +PRIVILEGED_DATA /*static*/ List_t * volatile pxOverflowDelayedTaskList; /**< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */ +PRIVILEGED_DATA /*static*/ List_t xPendingReadyList; /**< Tasks that have been readied while the scheduler was suspended. They will be moved to the ready list when the scheduler is resumed. */ +#else +PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ]; /**< Prioritised ready tasks. */ +PRIVILEGED_DATA static List_t xDelayedTaskList1; /**< Delayed tasks. */ +PRIVILEGED_DATA static List_t xDelayedTaskList2; /**< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */ +PRIVILEGED_DATA static List_t * volatile pxDelayedTaskList; /**< Points to the delayed task list currently being used. */ +PRIVILEGED_DATA static List_t * volatile pxOverflowDelayedTaskList; /**< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */ +PRIVILEGED_DATA static List_t xPendingReadyList; /**< Tasks that have been readied while the scheduler was suspended. They will be moved to the ready list when the scheduler is resumed. */ +#endif + +#if ( INCLUDE_vTaskDelete == 1 ) + +#if configLTO_HELPER /* << EST */ + /* If using -lto (Link Time Optimization), the linker might replace/remove the names of the following variables. + * If using a FreeRTOS Kernel aware debugger (e.g. Segger FreeRTOS task aware plugin), then the debugger won't be able to see the symbols and will fail. + * Therefore (more as of a hack) the symbols are defined with external linkage, even if not used from other modules. + * See https://mcuoneclipse.com/2017/07/27/troubleshooting-tips-for-freertos-thread-aware-debugging-in-eclipse/ + */ + PRIVILEGED_DATA /*static*/ List_t xTasksWaitingTermination; /**< Tasks that have been deleted - but their memory not yet freed. */ +#else + PRIVILEGED_DATA static List_t xTasksWaitingTermination; /**< Tasks that have been deleted - but their memory not yet freed. */ +#endif + PRIVILEGED_DATA static volatile UBaseType_t uxDeletedTasksWaitingCleanUp = ( UBaseType_t ) 0U; + +#endif + +#if ( INCLUDE_vTaskSuspend == 1 ) + +#if configLTO_HELPER /* << EST */ + /* If using -lto (Link Time Optimization), the linker might replace/remove the names of the following variables. + * If using a FreeRTOS Kernel aware debugger (e.g. Segger FreeRTOS task aware plugin), then the debugger won't be able to see the symbols and will fail. + * Therefore (more as of a hack) the symbols are defined with external linkage, even if not used from other modules. + * See https://mcuoneclipse.com/2017/07/27/troubleshooting-tips-for-freertos-thread-aware-debugging-in-eclipse/ + */ + PRIVILEGED_DATA /*static*/ List_t xSuspendedTaskList; /**< Tasks that are currently suspended. */ +#else + PRIVILEGED_DATA static List_t xSuspendedTaskList; /**< Tasks that are currently suspended. */ +#endif + +#endif + +/* Global POSIX errno. Its value is changed upon context switching to match + * the errno of the currently running task. */ +#if ( configUSE_POSIX_ERRNO == 1 ) + int FreeRTOS_errno = 0; +#endif + +/* Other file private variables. --------------------------------*/ +PRIVILEGED_DATA static volatile UBaseType_t uxCurrentNumberOfTasks = ( UBaseType_t ) 0U; +PRIVILEGED_DATA static volatile TickType_t xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT; +PRIVILEGED_DATA static volatile UBaseType_t uxTopReadyPriority = tskIDLE_PRIORITY; +PRIVILEGED_DATA static volatile BaseType_t xSchedulerRunning = pdFALSE; +PRIVILEGED_DATA static volatile TickType_t xPendedTicks = ( TickType_t ) 0U; +PRIVILEGED_DATA static volatile BaseType_t xYieldPendings[ configNUMBER_OF_CORES ] = { pdFALSE }; +PRIVILEGED_DATA static volatile BaseType_t xNumOfOverflows = ( BaseType_t ) 0; +PRIVILEGED_DATA static UBaseType_t uxTaskNumber = ( UBaseType_t ) 0U; +PRIVILEGED_DATA static volatile TickType_t xNextTaskUnblockTime = ( TickType_t ) 0U; /* Initialised to portMAX_DELAY before the scheduler starts. */ +PRIVILEGED_DATA static TaskHandle_t xIdleTaskHandles[ configNUMBER_OF_CORES ]; /**< Holds the handles of the idle tasks. The idle tasks are created automatically when the scheduler is started. */ + +/* Improve support for OpenOCD. The kernel tracks Ready tasks via priority lists. + * For tracking the state of remote threads, OpenOCD uses uxTopUsedPriority + * to determine the number of priority lists to read back from the remote target. */ +static const volatile UBaseType_t uxTopUsedPriority = configMAX_PRIORITIES - 1U; + +/* Context switches are held pending while the scheduler is suspended. Also, + * interrupts must not manipulate the xStateListItem of a TCB, or any of the + * lists the xStateListItem can be referenced from, if the scheduler is suspended. + * If an interrupt needs to unblock a task while the scheduler is suspended then it + * moves the task's event list item into the xPendingReadyList, ready for the + * kernel to move the task from the pending ready list into the real ready list + * when the scheduler is unsuspended. The pending ready list itself can only be + * accessed from a critical section. + * + * Updates to uxSchedulerSuspended must be protected by both the task lock and the ISR lock + * and must not be done from an ISR. Reads must be protected by either lock and may be done + * from either an ISR or a task. */ +PRIVILEGED_DATA static volatile UBaseType_t uxSchedulerSuspended = ( UBaseType_t ) 0U; + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + +/* Do not move these variables to function scope as doing so prevents the + * code working with debuggers that need to remove the static qualifier. */ +PRIVILEGED_DATA static configRUN_TIME_COUNTER_TYPE ulTaskSwitchedInTime[ configNUMBER_OF_CORES ] = { 0U }; /**< Holds the value of a timer/counter the last time a task was switched in. */ +PRIVILEGED_DATA static volatile configRUN_TIME_COUNTER_TYPE ulTotalRunTime[ configNUMBER_OF_CORES ] = { 0U }; /**< Holds the total amount of execution time as defined by the run time counter clock. */ + +#endif + +/*-----------------------------------------------------------*/ + +/* File private functions. --------------------------------*/ + +/* + * Creates the idle tasks during scheduler start. + */ +static BaseType_t prvCreateIdleTasks( void ); + +#if ( configNUMBER_OF_CORES > 1 ) + +/* + * Checks to see if another task moved the current task out of the ready + * list while it was waiting to enter a critical section and yields, if so. + */ + static void prvCheckForRunStateChange( void ); +#endif /* #if ( configNUMBER_OF_CORES > 1 ) */ + +#if ( configNUMBER_OF_CORES > 1 ) + +/* + * Yields a core, or cores if multiple priorities are not allowed to run + * simultaneously, to allow the task pxTCB to run. + */ + static void prvYieldForTask( const TCB_t * pxTCB ); +#endif /* #if ( configNUMBER_OF_CORES > 1 ) */ + +#if ( configNUMBER_OF_CORES > 1 ) + +/* + * Selects the highest priority available task for the given core. + */ + static void prvSelectHighestPriorityTask( BaseType_t xCoreID ); +#endif /* #if ( configNUMBER_OF_CORES > 1 ) */ + +/** + * Utility task that simply returns pdTRUE if the task referenced by xTask is + * currently in the Suspended state, or pdFALSE if the task referenced by xTask + * is in any other state. + */ +#if ( INCLUDE_vTaskSuspend == 1 ) + + static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +#endif /* INCLUDE_vTaskSuspend */ + +/* + * Utility to ready all the lists used by the scheduler. This is called + * automatically upon the creation of the first task. + */ +static void prvInitialiseTaskLists( void ) PRIVILEGED_FUNCTION; + +/* + * The idle task, which as all tasks is implemented as a never ending loop. + * The idle task is automatically created and added to the ready lists upon + * creation of the first user task. + * + * In the FreeRTOS SMP, configNUMBER_OF_CORES - 1 passive idle tasks are also + * created to ensure that each core has an idle task to run when no other + * task is available to run. + * + * The portTASK_FUNCTION_PROTO() macro is used to allow port/compiler specific + * language extensions. The equivalent prototype for these functions are: + * + * void prvIdleTask( void *pvParameters ); + * void prvPassiveIdleTask( void *pvParameters ); + * + */ +static portTASK_FUNCTION_PROTO( prvIdleTask, pvParameters ) PRIVILEGED_FUNCTION; +#if ( configNUMBER_OF_CORES > 1 ) + static portTASK_FUNCTION_PROTO( prvPassiveIdleTask, pvParameters ) PRIVILEGED_FUNCTION; +#endif + +/* + * Utility to free all memory allocated by the scheduler to hold a TCB, + * including the stack pointed to by the TCB. + * + * This does not free memory allocated by the task itself (i.e. memory + * allocated by calls to pvPortMalloc from within the tasks application code). + */ +#if ( INCLUDE_vTaskDelete == 1 ) + + static void prvDeleteTCB( TCB_t * pxTCB ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Used only by the idle task. This checks to see if anything has been placed + * in the list of tasks waiting to be deleted. If so the task is cleaned up + * and its TCB deleted. + */ +static void prvCheckTasksWaitingTermination( void ) PRIVILEGED_FUNCTION; + +/* + * The currently executing task is entering the Blocked state. Add the task to + * either the current or the overflow delayed task list. + */ +static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait, + const BaseType_t xCanBlockIndefinitely ) PRIVILEGED_FUNCTION; + +/* + * Fills an TaskStatus_t structure with information on each task that is + * referenced from the pxList list (which may be a ready list, a delayed list, + * a suspended list, etc.). + * + * THIS FUNCTION IS INTENDED FOR DEBUGGING ONLY, AND SHOULD NOT BE CALLED FROM + * NORMAL APPLICATION CODE. + */ +#if ( configUSE_TRACE_FACILITY == 1 ) + + static UBaseType_t prvListTasksWithinSingleList( TaskStatus_t * pxTaskStatusArray, + List_t * pxList, + eTaskState eState ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Searches pxList for a task with name pcNameToQuery - returning a handle to + * the task if it is found, or NULL if the task is not found. + */ +#if ( INCLUDE_xTaskGetHandle == 1 ) + + static TCB_t * prvSearchForNameWithinSingleList( List_t * pxList, + const char pcNameToQuery[] ) PRIVILEGED_FUNCTION; + +#endif + +/* + * When a task is created, the stack of the task is filled with a known value. + * This function determines the 'high water mark' of the task stack by + * determining how much of the stack remains at the original preset value. + */ +#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) + + static configSTACK_DEPTH_TYPE prvTaskCheckFreeStackSpace( const uint8_t * pucStackByte ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Return the amount of time, in ticks, that will pass before the kernel will + * next move a task from the Blocked state to the Running state. + * + * This conditional compilation should use inequality to 0, not equality to 1. + * This is to ensure portSUPPRESS_TICKS_AND_SLEEP() can be called when user + * defined low power mode implementations require configUSE_TICKLESS_IDLE to be + * set to a value other than 1. + */ +#if ( configUSE_TICKLESS_IDLE != 0 ) + + static TickType_t prvGetExpectedIdleTime( void ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Set xNextTaskUnblockTime to the time at which the next Blocked state task + * will exit the Blocked state. + */ +static void prvResetNextTaskUnblockTime( void ) PRIVILEGED_FUNCTION; + +#if ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) + +/* + * Helper function used to pad task names with spaces when printing out + * human readable tables of task information. + */ + static char * prvWriteNameToBuffer( char * pcBuffer, + const char * pcTaskName ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Called after a Task_t structure has been allocated either statically or + * dynamically to fill in the structure's members. + */ +static void prvInitialiseNewTask( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask, + TCB_t * pxNewTCB, + const MemoryRegion_t * const xRegions ) PRIVILEGED_FUNCTION; + +/* + * Called after a new task has been created and initialised to place the task + * under the control of the scheduler. + */ +static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB ) PRIVILEGED_FUNCTION; + +/* + * Create a task with static buffer for both TCB and stack. Returns a handle to + * the task if it is created successfully. Otherwise, returns NULL. + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + static TCB_t * prvCreateStaticTask( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer, + TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif /* #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ + +/* + * Create a restricted task with static buffer for both TCB and stack. Returns + * a handle to the task if it is created successfully. Otherwise, returns NULL. + */ +#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + static TCB_t * prvCreateRestrictedStaticTask( const TaskParameters_t * const pxTaskDefinition, + TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif /* #if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) */ + +/* + * Create a restricted task with static buffer for task stack and allocated buffer + * for TCB. Returns a handle to the task if it is created successfully. Otherwise, + * returns NULL. + */ +#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + static TCB_t * prvCreateRestrictedTask( const TaskParameters_t * const pxTaskDefinition, + TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif /* #if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ + +/* + * Create a task with allocated buffer for both TCB and stack. Returns a handle to + * the task if it is created successfully. Otherwise, returns NULL. + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + static TCB_t * prvCreateTask( TaskFunction_t pxTaskCode, + const char * const pcName, + const configSTACK_DEPTH_TYPE usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif /* #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) */ + +/* + * freertos_tasks_c_additions_init() should only be called if the user definable + * macro FREERTOS_TASKS_C_ADDITIONS_INIT() is defined, as that is the only macro + * called by the function. + */ +#ifdef FREERTOS_TASKS_C_ADDITIONS_INIT + + static void freertos_tasks_c_additions_init( void ) PRIVILEGED_FUNCTION; + +#endif + +#if ( configUSE_PASSIVE_IDLE_HOOK == 1 ) + extern void vApplicationPassiveIdleHook( void ); +#endif /* #if ( configUSE_PASSIVE_IDLE_HOOK == 1 ) */ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + +/* + * Convert the snprintf return value to the number of characters + * written. The following are the possible cases: + * + * 1. The buffer supplied to snprintf is large enough to hold the + * generated string. The return value in this case is the number + * of characters actually written, not counting the terminating + * null character. + * 2. The buffer supplied to snprintf is NOT large enough to hold + * the generated string. The return value in this case is the + * number of characters that would have been written if the + * buffer had been sufficiently large, not counting the + * terminating null character. + * 3. Encoding error. The return value in this case is a negative + * number. + * + * From 1 and 2 above ==> Only when the return value is non-negative + * and less than the supplied buffer length, the string has been + * completely written. + */ + static size_t prvSnprintfReturnValueToCharsWritten( int iSnprintfReturnValue, + size_t n ); + +#endif /* #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( configNUMBER_OF_CORES > 1 ) + static void prvCheckForRunStateChange( void ) + { + UBaseType_t uxPrevCriticalNesting; + const TCB_t * pxThisTCB; + + /* This must only be called from within a task. */ + portASSERT_IF_IN_ISR(); + + /* This function is always called with interrupts disabled + * so this is safe. */ + pxThisTCB = pxCurrentTCBs[ portGET_CORE_ID() ]; + + while( pxThisTCB->xTaskRunState == taskTASK_SCHEDULED_TO_YIELD ) + { + /* We are only here if we just entered a critical section + * or if we just suspended the scheduler, and another task + * has requested that we yield. + * + * This is slightly complicated since we need to save and restore + * the suspension and critical nesting counts, as well as release + * and reacquire the correct locks. And then, do it all over again + * if our state changed again during the reacquisition. */ + uxPrevCriticalNesting = portGET_CRITICAL_NESTING_COUNT(); + + if( uxPrevCriticalNesting > 0U ) + { + portSET_CRITICAL_NESTING_COUNT( 0U ); + portRELEASE_ISR_LOCK(); + } + else + { + /* The scheduler is suspended. uxSchedulerSuspended is updated + * only when the task is not requested to yield. */ + mtCOVERAGE_TEST_MARKER(); + } + + portRELEASE_TASK_LOCK(); + portMEMORY_BARRIER(); + configASSERT( pxThisTCB->xTaskRunState == taskTASK_SCHEDULED_TO_YIELD ); + + portENABLE_INTERRUPTS(); + + /* Enabling interrupts should cause this core to immediately + * service the pending interrupt and yield. If the run state is still + * yielding here then that is a problem. */ + configASSERT( pxThisTCB->xTaskRunState != taskTASK_SCHEDULED_TO_YIELD ); + + portDISABLE_INTERRUPTS(); + portGET_TASK_LOCK(); + portGET_ISR_LOCK(); + + portSET_CRITICAL_NESTING_COUNT( uxPrevCriticalNesting ); + + if( uxPrevCriticalNesting == 0U ) + { + portRELEASE_ISR_LOCK(); + } + } + } +#endif /* #if ( configNUMBER_OF_CORES > 1 ) */ + +/*-----------------------------------------------------------*/ + +#if ( configNUMBER_OF_CORES > 1 ) + static void prvYieldForTask( const TCB_t * pxTCB ) + { + BaseType_t xLowestPriorityToPreempt; + BaseType_t xCurrentCoreTaskPriority; + BaseType_t xLowestPriorityCore = ( BaseType_t ) -1; + BaseType_t xCoreID; + + #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) + BaseType_t xYieldCount = 0; + #endif /* #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) */ + + /* This must be called from a critical section. */ + configASSERT( portGET_CRITICAL_NESTING_COUNT() > 0U ); + + #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) + + /* No task should yield for this one if it is a lower priority + * than priority level of currently ready tasks. */ + if( pxTCB->uxPriority >= uxTopReadyPriority ) + #else + /* Yield is not required for a task which is already running. */ + if( taskTASK_IS_RUNNING( pxTCB ) == pdFALSE ) + #endif + { + xLowestPriorityToPreempt = ( BaseType_t ) pxTCB->uxPriority; + + /* xLowestPriorityToPreempt will be decremented to -1 if the priority of pxTCB + * is 0. This is ok as we will give system idle tasks a priority of -1 below. */ + --xLowestPriorityToPreempt; + + for( xCoreID = ( BaseType_t ) 0; xCoreID < ( BaseType_t ) configNUMBER_OF_CORES; xCoreID++ ) + { + xCurrentCoreTaskPriority = ( BaseType_t ) pxCurrentTCBs[ xCoreID ]->uxPriority; + + /* System idle tasks are being assigned a priority of tskIDLE_PRIORITY - 1 here. */ + if( ( pxCurrentTCBs[ xCoreID ]->uxTaskAttributes & taskATTRIBUTE_IS_IDLE ) != 0U ) + { + xCurrentCoreTaskPriority = xCurrentCoreTaskPriority - 1; + } + + if( ( taskTASK_IS_RUNNING( pxCurrentTCBs[ xCoreID ] ) != pdFALSE ) && ( xYieldPendings[ xCoreID ] == pdFALSE ) ) + { + #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) + if( taskTASK_IS_RUNNING( pxTCB ) == pdFALSE ) + #endif + { + if( xCurrentCoreTaskPriority <= xLowestPriorityToPreempt ) + { + #if ( configUSE_CORE_AFFINITY == 1 ) + if( ( pxTCB->uxCoreAffinityMask & ( ( UBaseType_t ) 1U << ( UBaseType_t ) xCoreID ) ) != 0U ) + #endif + { + #if ( configUSE_TASK_PREEMPTION_DISABLE == 1 ) + if( pxCurrentTCBs[ xCoreID ]->xPreemptionDisable == pdFALSE ) + #endif + { + xLowestPriorityToPreempt = xCurrentCoreTaskPriority; + xLowestPriorityCore = xCoreID; + } + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) + { + /* Yield all currently running non-idle tasks with a priority lower than + * the task that needs to run. */ + if( ( xCurrentCoreTaskPriority > ( ( BaseType_t ) tskIDLE_PRIORITY - 1 ) ) && + ( xCurrentCoreTaskPriority < ( BaseType_t ) pxTCB->uxPriority ) ) + { + prvYieldCore( xCoreID ); + xYieldCount++; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) + if( ( xYieldCount == 0 ) && ( xLowestPriorityCore >= 0 ) ) + #else /* #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) */ + if( xLowestPriorityCore >= 0 ) + #endif /* #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) */ + { + prvYieldCore( xLowestPriorityCore ); + } + + #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) + /* Verify that the calling core always yields to higher priority tasks. */ + if( ( ( pxCurrentTCBs[ portGET_CORE_ID() ]->uxTaskAttributes & taskATTRIBUTE_IS_IDLE ) == 0U ) && + ( pxTCB->uxPriority > pxCurrentTCBs[ portGET_CORE_ID() ]->uxPriority ) ) + { + configASSERT( ( xYieldPendings[ portGET_CORE_ID() ] == pdTRUE ) || + ( taskTASK_IS_RUNNING( pxCurrentTCBs[ portGET_CORE_ID() ] ) == pdFALSE ) ); + } + #endif + } + } +#endif /* #if ( configNUMBER_OF_CORES > 1 ) */ +/*-----------------------------------------------------------*/ + +#if ( configNUMBER_OF_CORES > 1 ) + static void prvSelectHighestPriorityTask( BaseType_t xCoreID ) + { + UBaseType_t uxCurrentPriority = uxTopReadyPriority; + BaseType_t xTaskScheduled = pdFALSE; + BaseType_t xDecrementTopPriority = pdTRUE; + + #if ( configUSE_CORE_AFFINITY == 1 ) + const TCB_t * pxPreviousTCB = NULL; + #endif + #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) + BaseType_t xPriorityDropped = pdFALSE; + #endif + + /* This function should be called when scheduler is running. */ + configASSERT( xSchedulerRunning == pdTRUE ); + + /* A new task is created and a running task with the same priority yields + * itself to run the new task. When a running task yields itself, it is still + * in the ready list. This running task will be selected before the new task + * since the new task is always added to the end of the ready list. + * The other problem is that the running task still in the same position of + * the ready list when it yields itself. It is possible that it will be selected + * earlier then other tasks which waits longer than this task. + * + * To fix these problems, the running task should be put to the end of the + * ready list before searching for the ready task in the ready list. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxCurrentTCBs[ xCoreID ]->uxPriority ] ), + &pxCurrentTCBs[ xCoreID ]->xStateListItem ) == pdTRUE ) + { + ( void ) uxListRemove( &pxCurrentTCBs[ xCoreID ]->xStateListItem ); + vListInsertEnd( &( pxReadyTasksLists[ pxCurrentTCBs[ xCoreID ]->uxPriority ] ), + &pxCurrentTCBs[ xCoreID ]->xStateListItem ); + } + + while( xTaskScheduled == pdFALSE ) + { + #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) + { + if( uxCurrentPriority < uxTopReadyPriority ) + { + /* We can't schedule any tasks, other than idle, that have a + * priority lower than the priority of a task currently running + * on another core. */ + uxCurrentPriority = tskIDLE_PRIORITY; + } + } + #endif + + if( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxCurrentPriority ] ) ) == pdFALSE ) + { + const List_t * const pxReadyList = &( pxReadyTasksLists[ uxCurrentPriority ] ); + const ListItem_t * pxEndMarker = listGET_END_MARKER( pxReadyList ); + ListItem_t * pxIterator; + + /* The ready task list for uxCurrentPriority is not empty, so uxTopReadyPriority + * must not be decremented any further. */ + xDecrementTopPriority = pdFALSE; + + for( pxIterator = listGET_HEAD_ENTRY( pxReadyList ); pxIterator != pxEndMarker; pxIterator = listGET_NEXT( pxIterator ) ) + { + /* MISRA Ref 11.5.3 [Void pointer assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + TCB_t * pxTCB = ( TCB_t * ) listGET_LIST_ITEM_OWNER( pxIterator ); + + #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) + { + /* When falling back to the idle priority because only one priority + * level is allowed to run at a time, we should ONLY schedule the true + * idle tasks, not user tasks at the idle priority. */ + if( uxCurrentPriority < uxTopReadyPriority ) + { + if( ( pxTCB->uxTaskAttributes & taskATTRIBUTE_IS_IDLE ) == 0U ) + { + continue; + } + } + } + #endif /* #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) */ + + if( pxTCB->xTaskRunState == taskTASK_NOT_RUNNING ) + { + #if ( configUSE_CORE_AFFINITY == 1 ) + if( ( pxTCB->uxCoreAffinityMask & ( ( UBaseType_t ) 1U << ( UBaseType_t ) xCoreID ) ) != 0U ) + #endif + { + /* If the task is not being executed by any core swap it in. */ + pxCurrentTCBs[ xCoreID ]->xTaskRunState = taskTASK_NOT_RUNNING; + #if ( configUSE_CORE_AFFINITY == 1 ) + pxPreviousTCB = pxCurrentTCBs[ xCoreID ]; + #endif + pxTCB->xTaskRunState = xCoreID; + pxCurrentTCBs[ xCoreID ] = pxTCB; + xTaskScheduled = pdTRUE; + } + } + else if( pxTCB == pxCurrentTCBs[ xCoreID ] ) + { + configASSERT( ( pxTCB->xTaskRunState == xCoreID ) || ( pxTCB->xTaskRunState == taskTASK_SCHEDULED_TO_YIELD ) ); + + #if ( configUSE_CORE_AFFINITY == 1 ) + if( ( pxTCB->uxCoreAffinityMask & ( ( UBaseType_t ) 1U << ( UBaseType_t ) xCoreID ) ) != 0U ) + #endif + { + /* The task is already running on this core, mark it as scheduled. */ + pxTCB->xTaskRunState = xCoreID; + xTaskScheduled = pdTRUE; + } + } + else + { + /* This task is running on the core other than xCoreID. */ + mtCOVERAGE_TEST_MARKER(); + } + + if( xTaskScheduled != pdFALSE ) + { + /* A task has been selected to run on this core. */ + break; + } + } + } + else + { + if( xDecrementTopPriority != pdFALSE ) + { + uxTopReadyPriority--; + #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) + { + xPriorityDropped = pdTRUE; + } + #endif + } + } + + /* There are configNUMBER_OF_CORES Idle tasks created when scheduler started. + * The scheduler should be able to select a task to run when uxCurrentPriority + * is tskIDLE_PRIORITY. uxCurrentPriority is never decreased to value blow + * tskIDLE_PRIORITY. */ + if( uxCurrentPriority > tskIDLE_PRIORITY ) + { + uxCurrentPriority--; + } + else + { + /* This function is called when idle task is not created. Break the + * loop to prevent uxCurrentPriority overrun. */ + break; + } + } + + #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) + { + if( xTaskScheduled == pdTRUE ) + { + if( xPriorityDropped != pdFALSE ) + { + /* There may be several ready tasks that were being prevented from running because there was + * a higher priority task running. Now that the last of the higher priority tasks is no longer + * running, make sure all the other idle tasks yield. */ + BaseType_t x; + + for( x = ( BaseType_t ) 0; x < ( BaseType_t ) configNUMBER_OF_CORES; x++ ) + { + if( ( pxCurrentTCBs[ x ]->uxTaskAttributes & taskATTRIBUTE_IS_IDLE ) != 0U ) + { + prvYieldCore( x ); + } + } + } + } + } + #endif /* #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) */ + + #if ( configUSE_CORE_AFFINITY == 1 ) + { + if( xTaskScheduled == pdTRUE ) + { + if( ( pxPreviousTCB != NULL ) && ( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxPreviousTCB->uxPriority ] ), &( pxPreviousTCB->xStateListItem ) ) != pdFALSE ) ) + { + /* A ready task was just evicted from this core. See if it can be + * scheduled on any other core. */ + UBaseType_t uxCoreMap = pxPreviousTCB->uxCoreAffinityMask; + BaseType_t xLowestPriority = ( BaseType_t ) pxPreviousTCB->uxPriority; + BaseType_t xLowestPriorityCore = -1; + BaseType_t x; + + if( ( pxPreviousTCB->uxTaskAttributes & taskATTRIBUTE_IS_IDLE ) != 0U ) + { + xLowestPriority = xLowestPriority - 1; + } + + if( ( uxCoreMap & ( ( UBaseType_t ) 1U << ( UBaseType_t ) xCoreID ) ) != 0U ) + { + /* pxPreviousTCB was removed from this core and this core is not excluded + * from it's core affinity mask. + * + * pxPreviousTCB is preempted by the new higher priority task + * pxCurrentTCBs[ xCoreID ]. When searching a new core for pxPreviousTCB, + * we do not need to look at the cores on which pxCurrentTCBs[ xCoreID ] + * is allowed to run. The reason is - when more than one cores are + * eligible for an incoming task, we preempt the core with the minimum + * priority task. Because this core (i.e. xCoreID) was preempted for + * pxCurrentTCBs[ xCoreID ], this means that all the others cores + * where pxCurrentTCBs[ xCoreID ] can run, are running tasks with priority + * no lower than pxPreviousTCB's priority. Therefore, the only cores where + * which can be preempted for pxPreviousTCB are the ones where + * pxCurrentTCBs[ xCoreID ] is not allowed to run (and obviously, + * pxPreviousTCB is allowed to run). + * + * This is an optimization which reduces the number of cores needed to be + * searched for pxPreviousTCB to run. */ + uxCoreMap &= ~( pxCurrentTCBs[ xCoreID ]->uxCoreAffinityMask ); + } + else + { + /* pxPreviousTCB's core affinity mask is changed and it is no longer + * allowed to run on this core. Searching all the cores in pxPreviousTCB's + * new core affinity mask to find a core on which it can run. */ + } + + uxCoreMap &= ( ( 1U << configNUMBER_OF_CORES ) - 1U ); + + for( x = ( ( BaseType_t ) configNUMBER_OF_CORES - 1 ); x >= ( BaseType_t ) 0; x-- ) + { + UBaseType_t uxCore = ( UBaseType_t ) x; + BaseType_t xTaskPriority; + + if( ( uxCoreMap & ( ( UBaseType_t ) 1U << uxCore ) ) != 0U ) + { + xTaskPriority = ( BaseType_t ) pxCurrentTCBs[ uxCore ]->uxPriority; + + if( ( pxCurrentTCBs[ uxCore ]->uxTaskAttributes & taskATTRIBUTE_IS_IDLE ) != 0U ) + { + xTaskPriority = xTaskPriority - ( BaseType_t ) 1; + } + + uxCoreMap &= ~( ( UBaseType_t ) 1U << uxCore ); + + if( ( xTaskPriority < xLowestPriority ) && + ( taskTASK_IS_RUNNING( pxCurrentTCBs[ uxCore ] ) != pdFALSE ) && + ( xYieldPendings[ uxCore ] == pdFALSE ) ) + { + #if ( configUSE_TASK_PREEMPTION_DISABLE == 1 ) + if( pxCurrentTCBs[ uxCore ]->xPreemptionDisable == pdFALSE ) + #endif + { + xLowestPriority = xTaskPriority; + xLowestPriorityCore = ( BaseType_t ) uxCore; + } + } + } + } + + if( xLowestPriorityCore >= 0 ) + { + prvYieldCore( xLowestPriorityCore ); + } + } + } + } + #endif /* #if ( configUSE_CORE_AFFINITY == 1 ) */ + } + +#endif /* ( configNUMBER_OF_CORES > 1 ) */ + +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + + static TCB_t * prvCreateStaticTask( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer, + TaskHandle_t * const pxCreatedTask ) + { + TCB_t * pxNewTCB; + + configASSERT( puxStackBuffer != NULL ); + configASSERT( pxTaskBuffer != NULL ); + + #if ( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + * variable of type StaticTask_t equals the size of the real task + * structure. */ + volatile size_t xSize = sizeof( StaticTask_t ); + configASSERT( xSize == sizeof( TCB_t ) ); + ( void ) xSize; /* Prevent unused variable warning when configASSERT() is not used. */ + } + #endif /* configASSERT_DEFINED */ + + if( ( pxTaskBuffer != NULL ) && ( puxStackBuffer != NULL ) ) + { + /* The memory used for the task's TCB and stack are passed into this + * function - use them. */ + /* MISRA Ref 11.3.1 [Misaligned access] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */ + /* coverity[misra_c_2012_rule_11_3_violation] */ + pxNewTCB = ( TCB_t * ) pxTaskBuffer; + ( void ) memset( ( void * ) pxNewTCB, 0x00, sizeof( TCB_t ) ); + pxNewTCB->pxStack = ( StackType_t * ) puxStackBuffer; + + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + { + /* Tasks can be created statically or dynamically, so note this + * task was created statically in case the task is later deleted. */ + pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB; + } + #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ + + prvInitialiseNewTask( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, pxCreatedTask, pxNewTCB, NULL ); + } + else + { + pxNewTCB = NULL; + } + + return pxNewTCB; + } +/*-----------------------------------------------------------*/ + + TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer ) + { + TaskHandle_t xReturn = NULL; + TCB_t * pxNewTCB; + + traceENTER_xTaskCreateStatic( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer ); + + pxNewTCB = prvCreateStaticTask( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer, &xReturn ); + + if( pxNewTCB != NULL ) + { + #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + { + /* Set the task's affinity before scheduling it. */ + pxNewTCB->uxCoreAffinityMask = tskNO_AFFINITY; + } + #endif + + prvAddNewTaskToReadyList( pxNewTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_xTaskCreateStatic( xReturn ); + + return xReturn; + } +/*-----------------------------------------------------------*/ + + #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + TaskHandle_t xTaskCreateStaticAffinitySet( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer, + UBaseType_t uxCoreAffinityMask ) + { + TaskHandle_t xReturn = NULL; + TCB_t * pxNewTCB; + + traceENTER_xTaskCreateStaticAffinitySet( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer, uxCoreAffinityMask ); + + pxNewTCB = prvCreateStaticTask( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer, &xReturn ); + + if( pxNewTCB != NULL ) + { + /* Set the task's affinity before scheduling it. */ + pxNewTCB->uxCoreAffinityMask = uxCoreAffinityMask; + + prvAddNewTaskToReadyList( pxNewTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_xTaskCreateStaticAffinitySet( xReturn ); + + return xReturn; + } + #endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) */ + +#endif /* SUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + static TCB_t * prvCreateRestrictedStaticTask( const TaskParameters_t * const pxTaskDefinition, + TaskHandle_t * const pxCreatedTask ) + { + TCB_t * pxNewTCB; + + configASSERT( pxTaskDefinition->puxStackBuffer != NULL ); + configASSERT( pxTaskDefinition->pxTaskBuffer != NULL ); + + if( ( pxTaskDefinition->puxStackBuffer != NULL ) && ( pxTaskDefinition->pxTaskBuffer != NULL ) ) + { + /* Allocate space for the TCB. Where the memory comes from depends + * on the implementation of the port malloc function and whether or + * not static allocation is being used. */ + pxNewTCB = ( TCB_t * ) pxTaskDefinition->pxTaskBuffer; + ( void ) memset( ( void * ) pxNewTCB, 0x00, sizeof( TCB_t ) ); + + /* Store the stack location in the TCB. */ + pxNewTCB->pxStack = pxTaskDefinition->puxStackBuffer; + + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + { + /* Tasks can be created statically or dynamically, so note this + * task was created statically in case the task is later deleted. */ + pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB; + } + #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ + + prvInitialiseNewTask( pxTaskDefinition->pvTaskCode, + pxTaskDefinition->pcName, + ( uint32_t ) pxTaskDefinition->usStackDepth, + pxTaskDefinition->pvParameters, + pxTaskDefinition->uxPriority, + pxCreatedTask, pxNewTCB, + pxTaskDefinition->xRegions ); + } + else + { + pxNewTCB = NULL; + } + + return pxNewTCB; + } +/*-----------------------------------------------------------*/ + + BaseType_t xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition, + TaskHandle_t * pxCreatedTask ) + { + TCB_t * pxNewTCB; + BaseType_t xReturn; + + traceENTER_xTaskCreateRestrictedStatic( pxTaskDefinition, pxCreatedTask ); + + configASSERT( pxTaskDefinition != NULL ); + + pxNewTCB = prvCreateRestrictedStaticTask( pxTaskDefinition, pxCreatedTask ); + + if( pxNewTCB != NULL ) + { + #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + { + /* Set the task's affinity before scheduling it. */ + pxNewTCB->uxCoreAffinityMask = tskNO_AFFINITY; + } + #endif + + prvAddNewTaskToReadyList( pxNewTCB ); + xReturn = pdPASS; + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + } + + traceRETURN_xTaskCreateRestrictedStatic( xReturn ); + + return xReturn; + } +/*-----------------------------------------------------------*/ + + #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + BaseType_t xTaskCreateRestrictedStaticAffinitySet( const TaskParameters_t * const pxTaskDefinition, + UBaseType_t uxCoreAffinityMask, + TaskHandle_t * pxCreatedTask ) + { + TCB_t * pxNewTCB; + BaseType_t xReturn; + + traceENTER_xTaskCreateRestrictedStaticAffinitySet( pxTaskDefinition, uxCoreAffinityMask, pxCreatedTask ); + + configASSERT( pxTaskDefinition != NULL ); + + pxNewTCB = prvCreateRestrictedStaticTask( pxTaskDefinition, pxCreatedTask ); + + if( pxNewTCB != NULL ) + { + /* Set the task's affinity before scheduling it. */ + pxNewTCB->uxCoreAffinityMask = uxCoreAffinityMask; + + prvAddNewTaskToReadyList( pxNewTCB ); + xReturn = pdPASS; + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + } + + traceRETURN_xTaskCreateRestrictedStaticAffinitySet( xReturn ); + + return xReturn; + } + #endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) */ + +#endif /* ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ +/*-----------------------------------------------------------*/ + +#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + static TCB_t * prvCreateRestrictedTask( const TaskParameters_t * const pxTaskDefinition, + TaskHandle_t * const pxCreatedTask ) + { + TCB_t * pxNewTCB; + + configASSERT( pxTaskDefinition->puxStackBuffer ); + + if( pxTaskDefinition->puxStackBuffer != NULL ) + { + /* MISRA Ref 11.5.1 [Malloc memory assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); + + if( pxNewTCB != NULL ) + { + ( void ) memset( ( void * ) pxNewTCB, 0x00, sizeof( TCB_t ) ); + + /* Store the stack location in the TCB. */ + pxNewTCB->pxStack = pxTaskDefinition->puxStackBuffer; + + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + { + /* Tasks can be created statically or dynamically, so note + * this task had a statically allocated stack in case it is + * later deleted. The TCB was allocated dynamically. */ + pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_ONLY; + } + #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ + + prvInitialiseNewTask( pxTaskDefinition->pvTaskCode, + pxTaskDefinition->pcName, + ( uint32_t ) pxTaskDefinition->usStackDepth, + pxTaskDefinition->pvParameters, + pxTaskDefinition->uxPriority, + pxCreatedTask, pxNewTCB, + pxTaskDefinition->xRegions ); + } + } + else + { + pxNewTCB = NULL; + } + + return pxNewTCB; + } +/*-----------------------------------------------------------*/ + + BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, + TaskHandle_t * pxCreatedTask ) + { + TCB_t * pxNewTCB; + BaseType_t xReturn; + + traceENTER_xTaskCreateRestricted( pxTaskDefinition, pxCreatedTask ); + + pxNewTCB = prvCreateRestrictedTask( pxTaskDefinition, pxCreatedTask ); + + if( pxNewTCB != NULL ) + { + #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + { + /* Set the task's affinity before scheduling it. */ + pxNewTCB->uxCoreAffinityMask = tskNO_AFFINITY; + } + #endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) */ + + prvAddNewTaskToReadyList( pxNewTCB ); + + xReturn = pdPASS; + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + } + + traceRETURN_xTaskCreateRestricted( xReturn ); + + return xReturn; + } +/*-----------------------------------------------------------*/ + + #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + BaseType_t xTaskCreateRestrictedAffinitySet( const TaskParameters_t * const pxTaskDefinition, + UBaseType_t uxCoreAffinityMask, + TaskHandle_t * pxCreatedTask ) + { + TCB_t * pxNewTCB; + BaseType_t xReturn; + + traceENTER_xTaskCreateRestrictedAffinitySet( pxTaskDefinition, uxCoreAffinityMask, pxCreatedTask ); + + pxNewTCB = prvCreateRestrictedTask( pxTaskDefinition, pxCreatedTask ); + + if( pxNewTCB != NULL ) + { + /* Set the task's affinity before scheduling it. */ + pxNewTCB->uxCoreAffinityMask = uxCoreAffinityMask; + + prvAddNewTaskToReadyList( pxNewTCB ); + + xReturn = pdPASS; + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + } + + traceRETURN_xTaskCreateRestrictedAffinitySet( xReturn ); + + return xReturn; + } + #endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) */ + + +#endif /* portUSING_MPU_WRAPPERS */ +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + static TCB_t * prvCreateTask( TaskFunction_t pxTaskCode, + const char * const pcName, + const configSTACK_DEPTH_TYPE usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask ) + { + TCB_t * pxNewTCB; + + /* If the stack grows down then allocate the stack then the TCB so the stack + * does not grow into the TCB. Likewise if the stack grows up then allocate + * the TCB then the stack. */ + #if ( portSTACK_GROWTH > 0 ) + { + /* Allocate space for the TCB. Where the memory comes from depends on + * the implementation of the port malloc function and whether or not static + * allocation is being used. */ + /* MISRA Ref 11.5.1 [Malloc memory assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); + + if( pxNewTCB != NULL ) + { + ( void ) memset( ( void * ) pxNewTCB, 0x00, sizeof( TCB_t ) ); + + /* Allocate space for the stack used by the task being created. + * The base of the stack memory stored in the TCB so the task can + * be deleted later if required. */ + /* MISRA Ref 11.5.1 [Malloc memory assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + pxNewTCB->pxStack = ( StackType_t * ) pvPortMallocStack( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); + + if( pxNewTCB->pxStack == NULL ) + { + /* Could not allocate the stack. Delete the allocated TCB. */ + vPortFree( pxNewTCB ); + pxNewTCB = NULL; + } + } + } + #else /* portSTACK_GROWTH */ + { + StackType_t * pxStack; + + /* Allocate space for the stack used by the task being created. */ + /* MISRA Ref 11.5.1 [Malloc memory assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + pxStack = pvPortMallocStack( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); + + if( pxStack != NULL ) + { + /* Allocate space for the TCB. */ + /* MISRA Ref 11.5.1 [Malloc memory assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); + + if( pxNewTCB != NULL ) + { + ( void ) memset( ( void * ) pxNewTCB, 0x00, sizeof( TCB_t ) ); + + /* Store the stack location in the TCB. */ + pxNewTCB->pxStack = pxStack; + } + else + { + /* The stack cannot be used as the TCB was not created. Free + * it again. */ + vPortFreeStack( pxStack ); + } + } + else + { + pxNewTCB = NULL; + } + } + #endif /* portSTACK_GROWTH */ + + if( pxNewTCB != NULL ) + { + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + { + /* Tasks can be created statically or dynamically, so note this + * task was created dynamically in case it is later deleted. */ + pxNewTCB->ucStaticallyAllocated = tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB; + } + #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ + + prvInitialiseNewTask( pxTaskCode, pcName, ( uint32_t ) usStackDepth, pvParameters, uxPriority, pxCreatedTask, pxNewTCB, NULL ); + } + + return pxNewTCB; + } +/*-----------------------------------------------------------*/ + + BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, + const char * const pcName, + const configSTACK_DEPTH_TYPE usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask ) + { + TCB_t * pxNewTCB; + BaseType_t xReturn; + + traceENTER_xTaskCreate( pxTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask ); + + pxNewTCB = prvCreateTask( pxTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask ); + + if( pxNewTCB != NULL ) + { + #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + { + /* Set the task's affinity before scheduling it. */ + pxNewTCB->uxCoreAffinityMask = tskNO_AFFINITY; + } + #endif + + prvAddNewTaskToReadyList( pxNewTCB ); + xReturn = pdPASS; + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + } + + traceRETURN_xTaskCreate( xReturn ); + + return xReturn; + } +/*-----------------------------------------------------------*/ + + #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + BaseType_t xTaskCreateAffinitySet( TaskFunction_t pxTaskCode, + const char * const pcName, + const configSTACK_DEPTH_TYPE usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + UBaseType_t uxCoreAffinityMask, + TaskHandle_t * const pxCreatedTask ) + { + TCB_t * pxNewTCB; + BaseType_t xReturn; + + traceENTER_xTaskCreateAffinitySet( pxTaskCode, pcName, usStackDepth, pvParameters, uxPriority, uxCoreAffinityMask, pxCreatedTask ); + + pxNewTCB = prvCreateTask( pxTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask ); + + if( pxNewTCB != NULL ) + { + /* Set the task's affinity before scheduling it. */ + pxNewTCB->uxCoreAffinityMask = uxCoreAffinityMask; + + prvAddNewTaskToReadyList( pxNewTCB ); + xReturn = pdPASS; + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + } + + traceRETURN_xTaskCreateAffinitySet( xReturn ); + + return xReturn; + } + #endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) */ + +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseNewTask( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask, + TCB_t * pxNewTCB, + const MemoryRegion_t * const xRegions ) +{ + StackType_t * pxTopOfStack; + UBaseType_t x; + + #if ( portUSING_MPU_WRAPPERS == 1 ) + /* Should the task be created in privileged mode? */ + BaseType_t xRunPrivileged; + + if( ( uxPriority & portPRIVILEGE_BIT ) != 0U ) + { + xRunPrivileged = pdTRUE; + } + else + { + xRunPrivileged = pdFALSE; + } + uxPriority &= ~portPRIVILEGE_BIT; + #endif /* portUSING_MPU_WRAPPERS == 1 */ + + /* Avoid dependency on memset() if it is not required. */ + #if ( tskSET_NEW_STACKS_TO_KNOWN_VALUE == 1 ) + { + /* Fill the stack with a known value to assist debugging. */ + ( void ) memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) ulStackDepth * sizeof( StackType_t ) ); + } + #endif /* tskSET_NEW_STACKS_TO_KNOWN_VALUE */ + + /* Calculate the top of stack address. This depends on whether the stack + * grows from high memory to low (as per the 80x86) or vice versa. + * portSTACK_GROWTH is used to make the result positive or negative as required + * by the port. */ + #if ( portSTACK_GROWTH < 0 ) + { + pxTopOfStack = &( pxNewTCB->pxStack[ ulStackDepth - ( uint32_t ) 1 ] ); + pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); + + /* Check the alignment of the calculated top of stack is correct. */ + configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + + #if ( configRECORD_STACK_HIGH_ADDRESS == 1 ) + { + /* Also record the stack's high address, which may assist + * debugging. */ + pxNewTCB->pxEndOfStack = pxTopOfStack; + } + #endif /* configRECORD_STACK_HIGH_ADDRESS */ + } + #else /* portSTACK_GROWTH */ + { + pxTopOfStack = pxNewTCB->pxStack; + pxTopOfStack = ( StackType_t * ) ( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) + portBYTE_ALIGNMENT_MASK ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); + + /* Check the alignment of the calculated top of stack is correct. */ + configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + + /* The other extreme of the stack space is required if stack checking is + * performed. */ + pxNewTCB->pxEndOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 ); + } + #endif /* portSTACK_GROWTH */ + + /* Store the task name in the TCB. */ + if( pcName != NULL ) + { + for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) + { + pxNewTCB->pcTaskName[ x ] = pcName[ x ]; + + /* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than + * configMAX_TASK_NAME_LEN characters just in case the memory after the + * string is not accessible (extremely unlikely). */ + if( pcName[ x ] == ( char ) 0x00 ) + { + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + /* Ensure the name string is terminated in the case that the string length + * was greater or equal to configMAX_TASK_NAME_LEN. */ + pxNewTCB->pcTaskName[ configMAX_TASK_NAME_LEN - 1U ] = '\0'; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* This is used as an array index so must ensure it's not too large. */ + configASSERT( uxPriority < configMAX_PRIORITIES ); + + if( uxPriority >= ( UBaseType_t ) configMAX_PRIORITIES ) + { + uxPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + pxNewTCB->uxPriority = uxPriority; + #if ( configUSE_MUTEXES == 1 ) + { + pxNewTCB->uxBasePriority = uxPriority; + } + #endif /* configUSE_MUTEXES */ + + vListInitialiseItem( &( pxNewTCB->xStateListItem ) ); + vListInitialiseItem( &( pxNewTCB->xEventListItem ) ); + + /* Set the pxNewTCB as a link back from the ListItem_t. This is so we can get + * back to the containing TCB from a generic item in a list. */ + listSET_LIST_ITEM_OWNER( &( pxNewTCB->xStateListItem ), pxNewTCB ); + + /* Event lists are always in priority order. */ + listSET_LIST_ITEM_VALUE( &( pxNewTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriority ); + listSET_LIST_ITEM_OWNER( &( pxNewTCB->xEventListItem ), pxNewTCB ); + + #if ( portUSING_MPU_WRAPPERS == 1 ) + { + vPortStoreTaskMPUSettings( &( pxNewTCB->xMPUSettings ), xRegions, pxNewTCB->pxStack, ulStackDepth ); + } + #else + { + /* Avoid compiler warning about unreferenced parameter. */ + ( void ) xRegions; + } + #endif + + #if ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) + { + /* Allocate and initialize memory for the task's TLS Block. */ + configINIT_TLS_BLOCK( pxNewTCB->xTLSBlock, pxTopOfStack ); + } + #endif + + /* Initialize the TCB stack to look as if the task was already running, + * but had been interrupted by the scheduler. The return address is set + * to the start of the task function. Once the stack has been initialised + * the top of stack variable is updated. */ + #if ( portUSING_MPU_WRAPPERS == 1 ) + { + /* If the port has capability to detect stack overflow, + * pass the stack end address to the stack initialization + * function as well. */ + #if ( portHAS_STACK_OVERFLOW_CHECKING == 1 ) + { + #if ( portSTACK_GROWTH < 0 ) + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxStack, pxTaskCode, pvParameters, xRunPrivileged, &( pxNewTCB->xMPUSettings ) ); + } + #else /* portSTACK_GROWTH */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxEndOfStack, pxTaskCode, pvParameters, xRunPrivileged, &( pxNewTCB->xMPUSettings ) ); + } + #endif /* portSTACK_GROWTH */ + } + #else /* portHAS_STACK_OVERFLOW_CHECKING */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters, xRunPrivileged, &( pxNewTCB->xMPUSettings ) ); + } + #endif /* portHAS_STACK_OVERFLOW_CHECKING */ + } + #else /* portUSING_MPU_WRAPPERS */ + { + /* If the port has capability to detect stack overflow, + * pass the stack end address to the stack initialization + * function as well. */ + #if ( portHAS_STACK_OVERFLOW_CHECKING == 1 ) + { + #if ( portSTACK_GROWTH < 0 ) + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxStack, pxTaskCode, pvParameters ); + } + #else /* portSTACK_GROWTH */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxEndOfStack, pxTaskCode, pvParameters ); + } + #endif /* portSTACK_GROWTH */ + } + #else /* portHAS_STACK_OVERFLOW_CHECKING */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters ); + } + #endif /* portHAS_STACK_OVERFLOW_CHECKING */ + } + #endif /* portUSING_MPU_WRAPPERS */ + + /* Initialize task state and task attributes. */ + #if ( configNUMBER_OF_CORES > 1 ) + { + pxNewTCB->xTaskRunState = taskTASK_NOT_RUNNING; + + /* Is this an idle task? */ + if( ( ( TaskFunction_t ) pxTaskCode == ( TaskFunction_t ) prvIdleTask ) || ( ( TaskFunction_t ) pxTaskCode == ( TaskFunction_t ) prvPassiveIdleTask ) ) + { + pxNewTCB->uxTaskAttributes |= taskATTRIBUTE_IS_IDLE; + } + } + #endif /* #if ( configNUMBER_OF_CORES > 1 ) */ + + if( pxCreatedTask != NULL ) + { + /* Pass the handle out in an anonymous way. The handle can be used to + * change the created task's priority, delete the created task, etc.*/ + *pxCreatedTask = ( TaskHandle_t ) pxNewTCB; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +#if ( configNUMBER_OF_CORES == 1 ) + + static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB ) + { + /* Ensure interrupts don't access the task lists while the lists are being + * updated. */ + taskENTER_CRITICAL(); + { + uxCurrentNumberOfTasks++; + + if( pxCurrentTCB == NULL ) + { + /* There are no other tasks, or all the other tasks are in + * the suspended state - make this the current task. */ + pxCurrentTCB = pxNewTCB; + + if( uxCurrentNumberOfTasks == ( UBaseType_t ) 1 ) + { + /* This is the first task to be created so do the preliminary + * initialisation required. We will not recover if this call + * fails, but we will report the failure. */ + prvInitialiseTaskLists(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* If the scheduler is not already running, make this task the + * current task if it is the highest priority task to be created + * so far. */ + if( xSchedulerRunning == pdFALSE ) + { + if( pxCurrentTCB->uxPriority <= pxNewTCB->uxPriority ) + { + pxCurrentTCB = pxNewTCB; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + uxTaskNumber++; + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + /* Add a counter into the TCB for tracing only. */ + pxNewTCB->uxTCBNumber = uxTaskNumber; + } + #endif /* configUSE_TRACE_FACILITY */ + traceTASK_CREATE( pxNewTCB ); + + prvAddTaskToReadyList( pxNewTCB ); + + portSETUP_TCB( pxNewTCB ); + } + taskEXIT_CRITICAL(); + + if( xSchedulerRunning != pdFALSE ) + { + /* If the created task is of a higher priority than the current task + * then it should run now. */ + taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxNewTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#else /* #if ( configNUMBER_OF_CORES == 1 ) */ + + static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB ) + { + /* Ensure interrupts don't access the task lists while the lists are being + * updated. */ + taskENTER_CRITICAL(); + { + uxCurrentNumberOfTasks++; + + if( xSchedulerRunning == pdFALSE ) + { + if( uxCurrentNumberOfTasks == ( UBaseType_t ) 1 ) + { + /* This is the first task to be created so do the preliminary + * initialisation required. We will not recover if this call + * fails, but we will report the failure. */ + prvInitialiseTaskLists(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( ( pxNewTCB->uxTaskAttributes & taskATTRIBUTE_IS_IDLE ) != 0U ) + { + BaseType_t xCoreID; + + /* Check if a core is free. */ + for( xCoreID = ( BaseType_t ) 0; xCoreID < ( BaseType_t ) configNUMBER_OF_CORES; xCoreID++ ) + { + if( pxCurrentTCBs[ xCoreID ] == NULL ) + { + pxNewTCB->xTaskRunState = xCoreID; + pxCurrentTCBs[ xCoreID ] = pxNewTCB; + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + uxTaskNumber++; + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + /* Add a counter into the TCB for tracing only. */ + pxNewTCB->uxTCBNumber = uxTaskNumber; + } + #endif /* configUSE_TRACE_FACILITY */ + traceTASK_CREATE( pxNewTCB ); + + prvAddTaskToReadyList( pxNewTCB ); + + portSETUP_TCB( pxNewTCB ); + + if( xSchedulerRunning != pdFALSE ) + { + /* If the created task is of a higher priority than another + * currently running task and preemption is on then it should + * run now. */ + taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxNewTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + } + +#endif /* #if ( configNUMBER_OF_CORES == 1 ) */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + + static size_t prvSnprintfReturnValueToCharsWritten( int iSnprintfReturnValue, + size_t n ) + { + size_t uxCharsWritten; + + if( iSnprintfReturnValue < 0 ) + { + /* Encoding error - Return 0 to indicate that nothing + * was written to the buffer. */ + uxCharsWritten = 0; + } + else if( iSnprintfReturnValue >= ( int ) n ) + { + /* This is the case when the supplied buffer is not + * large to hold the generated string. Return the + * number of characters actually written without + * counting the terminating NULL character. */ + uxCharsWritten = n - 1U; + } + else + { + /* Complete string was written to the buffer. */ + uxCharsWritten = ( size_t ) iSnprintfReturnValue; + } + + return uxCharsWritten; + } + +#endif /* #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelete == 1 ) + + void vTaskDelete( TaskHandle_t xTaskToDelete ) + { + TCB_t * pxTCB; + + traceENTER_vTaskDelete( xTaskToDelete ); + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the calling task that is + * being deleted. */ + pxTCB = prvGetTCBFromHandle( xTaskToDelete ); + + /* Remove task from the ready/delayed list. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Is the task waiting on an event also? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Increment the uxTaskNumber also so kernel aware debuggers can + * detect that the task lists need re-generating. This is done before + * portPRE_TASK_DELETE_HOOK() as in the Windows port that macro will + * not return. */ + uxTaskNumber++; + + /* If the task is running (or yielding), we must add it to the + * termination list so that an idle task can delete it when it is + * no longer running. */ + if( taskTASK_IS_RUNNING_OR_SCHEDULED_TO_YIELD( pxTCB ) != pdFALSE ) + { + /* A running task or a task which is scheduled to yield is being + * deleted. This cannot complete when the task is still running + * on a core, as a context switch to another task is required. + * Place the task in the termination list. The idle task will check + * the termination list and free up any memory allocated by the + * scheduler for the TCB and stack of the deleted task. */ + vListInsertEnd( &xTasksWaitingTermination, &( pxTCB->xStateListItem ) ); + + /* Increment the ucTasksDeleted variable so the idle task knows + * there is a task that has been deleted and that it should therefore + * check the xTasksWaitingTermination list. */ + ++uxDeletedTasksWaitingCleanUp; + + /* Call the delete hook before portPRE_TASK_DELETE_HOOK() as + * portPRE_TASK_DELETE_HOOK() does not return in the Win32 port. */ + traceTASK_DELETE( pxTCB ); + + /* The pre-delete hook is primarily for the Windows simulator, + * in which Windows specific clean up operations are performed, + * after which it is not possible to yield away from this task - + * hence xYieldPending is used to latch that a context switch is + * required. */ + #if ( configNUMBER_OF_CORES == 1 ) + portPRE_TASK_DELETE_HOOK( pxTCB, &( xYieldPendings[ 0 ] ) ); + #else + portPRE_TASK_DELETE_HOOK( pxTCB, &( xYieldPendings[ pxTCB->xTaskRunState ] ) ); + #endif + } + else + { + --uxCurrentNumberOfTasks; + traceTASK_DELETE( pxTCB ); + + /* Reset the next expected unblock time in case it referred to + * the task that has just been deleted. */ + prvResetNextTaskUnblockTime(); + } + } + + #if ( configNUMBER_OF_CORES == 1 ) + { + taskEXIT_CRITICAL(); + + /* If the task is not deleting itself, call prvDeleteTCB from outside of + * critical section. If a task deletes itself, prvDeleteTCB is called + * from prvCheckTasksWaitingTermination which is called from Idle task. */ + if( pxTCB != pxCurrentTCB ) + { + prvDeleteTCB( pxTCB ); + } + + /* Force a reschedule if it is the currently running task that has just + * been deleted. */ + if( xSchedulerRunning != pdFALSE ) + { + if( pxTCB == pxCurrentTCB ) + { + configASSERT( uxSchedulerSuspended == 0 ); + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* #if ( configNUMBER_OF_CORES == 1 ) */ + { + /* If a running task is not deleting itself, call prvDeleteTCB. If a running + * task deletes itself, prvDeleteTCB is called from prvCheckTasksWaitingTermination + * which is called from Idle task. */ + if( pxTCB->xTaskRunState == taskTASK_NOT_RUNNING ) + { + prvDeleteTCB( pxTCB ); + } + + /* Force a reschedule if the task that has just been deleted was running. */ + if( ( xSchedulerRunning != pdFALSE ) && ( taskTASK_IS_RUNNING( pxTCB ) == pdTRUE ) ) + { + if( pxTCB->xTaskRunState == ( BaseType_t ) portGET_CORE_ID() ) + { + configASSERT( uxSchedulerSuspended == 0 ); + vTaskYieldWithinAPI(); + } + else + { + prvYieldCore( pxTCB->xTaskRunState ); + } + } + + taskEXIT_CRITICAL(); + } + #endif /* #if ( configNUMBER_OF_CORES == 1 ) */ + + traceRETURN_vTaskDelete(); + } + +#endif /* INCLUDE_vTaskDelete */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskDelayUntil == 1 ) + + BaseType_t xTaskDelayUntil( TickType_t * const pxPreviousWakeTime, + const TickType_t xTimeIncrement ) + { + TickType_t xTimeToWake; + BaseType_t xAlreadyYielded, xShouldDelay = pdFALSE; + + traceENTER_xTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement ); + + configASSERT( pxPreviousWakeTime ); + configASSERT( ( xTimeIncrement > 0U ) ); + + vTaskSuspendAll(); + { + /* Minor optimisation. The tick count cannot change in this + * block. */ + const TickType_t xConstTickCount = xTickCount; + + configASSERT( uxSchedulerSuspended == 1U ); + + /* Generate the tick time at which the task wants to wake. */ + xTimeToWake = *pxPreviousWakeTime + xTimeIncrement; + + if( xConstTickCount < *pxPreviousWakeTime ) + { + /* The tick count has overflowed since this function was + * lasted called. In this case the only time we should ever + * actually delay is if the wake time has also overflowed, + * and the wake time is greater than the tick time. When this + * is the case it is as if neither time had overflowed. */ + if( ( xTimeToWake < *pxPreviousWakeTime ) && ( xTimeToWake > xConstTickCount ) ) + { + xShouldDelay = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* The tick time has not overflowed. In this case we will + * delay if either the wake time has overflowed, and/or the + * tick time is less than the wake time. */ + if( ( xTimeToWake < *pxPreviousWakeTime ) || ( xTimeToWake > xConstTickCount ) ) + { + xShouldDelay = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + /* Update the wake time ready for the next call. */ + *pxPreviousWakeTime = xTimeToWake; + + if( xShouldDelay != pdFALSE ) + { + traceTASK_DELAY_UNTIL( xTimeToWake ); + + /* prvAddCurrentTaskToDelayedList() needs the block time, not + * the time to wake, so subtract the current tick count. */ + prvAddCurrentTaskToDelayedList( xTimeToWake - xConstTickCount, pdFALSE ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + xAlreadyYielded = xTaskResumeAll(); + + /* Force a reschedule if xTaskResumeAll has not already done so, we may + * have put ourselves to sleep. */ + if( xAlreadyYielded == pdFALSE ) + { + taskYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_xTaskDelayUntil( xShouldDelay ); + + return xShouldDelay; + } + +#endif /* INCLUDE_xTaskDelayUntil */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelay == 1 ) + + void vTaskDelay( const TickType_t xTicksToDelay ) + { + BaseType_t xAlreadyYielded = pdFALSE; + + traceENTER_vTaskDelay( xTicksToDelay ); + + /* A delay time of zero just forces a reschedule. */ + if( xTicksToDelay > ( TickType_t ) 0U ) + { + vTaskSuspendAll(); + { + configASSERT( uxSchedulerSuspended == 1U ); + + traceTASK_DELAY(); + + /* A task that is removed from the event list while the + * scheduler is suspended will not get placed in the ready + * list or removed from the blocked list until the scheduler + * is resumed. + * + * This task cannot be in an event list as it is the currently + * executing task. */ + prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE ); + } + xAlreadyYielded = xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Force a reschedule if xTaskResumeAll has not already done so, we may + * have put ourselves to sleep. */ + if( xAlreadyYielded == pdFALSE ) + { + taskYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_vTaskDelay(); + } + +#endif /* INCLUDE_vTaskDelay */ +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_eTaskGetState == 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_xTaskAbortDelay == 1 ) ) + + eTaskState eTaskGetState( TaskHandle_t xTask ) + { + eTaskState eReturn; + List_t const * pxStateList; + List_t const * pxEventList; + List_t const * pxDelayedList; + List_t const * pxOverflowedDelayedList; + const TCB_t * const pxTCB = xTask; + + traceENTER_eTaskGetState( xTask ); + + configASSERT( pxTCB ); + + #if ( configNUMBER_OF_CORES == 1 ) + if( pxTCB == pxCurrentTCB ) + { + /* The task calling this function is querying its own state. */ + eReturn = eRunning; + } + else + #endif + { + taskENTER_CRITICAL(); + { + pxStateList = listLIST_ITEM_CONTAINER( &( pxTCB->xStateListItem ) ); + pxEventList = listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ); + pxDelayedList = pxDelayedTaskList; + pxOverflowedDelayedList = pxOverflowDelayedTaskList; + } + taskEXIT_CRITICAL(); + + if( pxEventList == &xPendingReadyList ) + { + /* The task has been placed on the pending ready list, so its + * state is eReady regardless of what list the task's state list + * item is currently placed on. */ + eReturn = eReady; + } + else if( ( pxStateList == pxDelayedList ) || ( pxStateList == pxOverflowedDelayedList ) ) + { + /* The task being queried is referenced from one of the Blocked + * lists. */ + eReturn = eBlocked; + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + else if( pxStateList == &xSuspendedTaskList ) + { + /* The task being queried is referenced from the suspended + * list. Is it genuinely suspended or is it blocked + * indefinitely? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ) + { + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + { + BaseType_t x; + + /* The task does not appear on the event list item of + * and of the RTOS objects, but could still be in the + * blocked state if it is waiting on its notification + * rather than waiting on an object. If not, is + * suspended. */ + eReturn = eSuspended; + + for( x = ( BaseType_t ) 0; x < ( BaseType_t ) configTASK_NOTIFICATION_ARRAY_ENTRIES; x++ ) + { + if( pxTCB->ucNotifyState[ x ] == taskWAITING_NOTIFICATION ) + { + eReturn = eBlocked; + break; + } + } + } + #else /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */ + { + eReturn = eSuspended; + } + #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */ + } + else + { + eReturn = eBlocked; + } + } + #endif /* if ( INCLUDE_vTaskSuspend == 1 ) */ + + #if ( INCLUDE_vTaskDelete == 1 ) + else if( ( pxStateList == &xTasksWaitingTermination ) || ( pxStateList == NULL ) ) + { + /* The task being queried is referenced from the deleted + * tasks list, or it is not referenced from any lists at + * all. */ + eReturn = eDeleted; + } + #endif + + else + { + #if ( configNUMBER_OF_CORES == 1 ) + { + /* If the task is not in any other state, it must be in the + * Ready (including pending ready) state. */ + eReturn = eReady; + } + #else /* #if ( configNUMBER_OF_CORES == 1 ) */ + { + if( taskTASK_IS_RUNNING( pxTCB ) == pdTRUE ) + { + /* Is it actively running on a core? */ + eReturn = eRunning; + } + else + { + /* If the task is not in any other state, it must be in the + * Ready (including pending ready) state. */ + eReturn = eReady; + } + } + #endif /* #if ( configNUMBER_OF_CORES == 1 ) */ + } + } + + traceRETURN_eTaskGetState( eReturn ); + + return eReturn; + } + +#endif /* INCLUDE_eTaskGetState */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskPriorityGet == 1 ) + + UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ) + { + TCB_t const * pxTCB; + UBaseType_t uxReturn; + + traceENTER_uxTaskPriorityGet( xTask ); + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the priority of the task + * that called uxTaskPriorityGet() that is being queried. */ + pxTCB = prvGetTCBFromHandle( xTask ); + uxReturn = pxTCB->uxPriority; + } + taskEXIT_CRITICAL(); + + traceRETURN_uxTaskPriorityGet( uxReturn ); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskPriorityGet */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskPriorityGet == 1 ) + + UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask ) + { + TCB_t const * pxTCB; + UBaseType_t uxReturn; + UBaseType_t uxSavedInterruptStatus; + + traceENTER_uxTaskPriorityGetFromISR( xTask ); + + /* RTOS ports that support interrupt nesting have the concept of a + * maximum system call (or maximum API call) interrupt priority. + * Interrupts that are above the maximum system call priority are keep + * permanently enabled, even when the RTOS kernel is in a critical section, + * but cannot make any calls to FreeRTOS API functions. If configASSERT() + * is defined in FreeRTOSConfig.h then + * portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has + * been assigned a priority above the configured maximum system call + * priority. Only FreeRTOS functions that end in FromISR can be called + * from interrupts that have been assigned a priority at or (logically) + * below the maximum system call interrupt priority. FreeRTOS maintains a + * separate interrupt safe API to ensure interrupt entry is as fast and as + * simple as possible. More information (albeit Cortex-M specific) is + * provided on the following link: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR(); + { + /* If null is passed in here then it is the priority of the calling + * task that is being queried. */ + pxTCB = prvGetTCBFromHandle( xTask ); + uxReturn = pxTCB->uxPriority; + } + taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus ); + + traceRETURN_uxTaskPriorityGetFromISR( uxReturn ); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskPriorityGet */ +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_uxTaskPriorityGet == 1 ) && ( configUSE_MUTEXES == 1 ) ) + + UBaseType_t uxTaskBasePriorityGet( const TaskHandle_t xTask ) + { + TCB_t const * pxTCB; + UBaseType_t uxReturn; + + traceENTER_uxTaskBasePriorityGet( xTask ); + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the base priority of the task + * that called uxTaskBasePriorityGet() that is being queried. */ + pxTCB = prvGetTCBFromHandle( xTask ); + uxReturn = pxTCB->uxBasePriority; + } + taskEXIT_CRITICAL(); + + traceRETURN_uxTaskBasePriorityGet( uxReturn ); + + return uxReturn; + } + +#endif /* #if ( ( INCLUDE_uxTaskPriorityGet == 1 ) && ( configUSE_MUTEXES == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_uxTaskPriorityGet == 1 ) && ( configUSE_MUTEXES == 1 ) ) + + UBaseType_t uxTaskBasePriorityGetFromISR( const TaskHandle_t xTask ) + { + TCB_t const * pxTCB; + UBaseType_t uxReturn; + UBaseType_t uxSavedInterruptStatus; + + traceENTER_uxTaskBasePriorityGetFromISR( xTask ); + + /* RTOS ports that support interrupt nesting have the concept of a + * maximum system call (or maximum API call) interrupt priority. + * Interrupts that are above the maximum system call priority are keep + * permanently enabled, even when the RTOS kernel is in a critical section, + * but cannot make any calls to FreeRTOS API functions. If configASSERT() + * is defined in FreeRTOSConfig.h then + * portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has + * been assigned a priority above the configured maximum system call + * priority. Only FreeRTOS functions that end in FromISR can be called + * from interrupts that have been assigned a priority at or (logically) + * below the maximum system call interrupt priority. FreeRTOS maintains a + * separate interrupt safe API to ensure interrupt entry is as fast and as + * simple as possible. More information (albeit Cortex-M specific) is + * provided on the following link: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR(); + { + /* If null is passed in here then it is the base priority of the calling + * task that is being queried. */ + pxTCB = prvGetTCBFromHandle( xTask ); + uxReturn = pxTCB->uxBasePriority; + } + taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus ); + + traceRETURN_uxTaskBasePriorityGetFromISR( uxReturn ); + + return uxReturn; + } + +#endif /* #if ( ( INCLUDE_uxTaskPriorityGet == 1 ) && ( configUSE_MUTEXES == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskPrioritySet == 1 ) + + void vTaskPrioritySet( TaskHandle_t xTask, + UBaseType_t uxNewPriority ) + { + TCB_t * pxTCB; + UBaseType_t uxCurrentBasePriority, uxPriorityUsedOnEntry; + BaseType_t xYieldRequired = pdFALSE; + + #if ( configNUMBER_OF_CORES > 1 ) + BaseType_t xYieldForTask = pdFALSE; + #endif + + traceENTER_vTaskPrioritySet( xTask, uxNewPriority ); + + configASSERT( uxNewPriority < configMAX_PRIORITIES ); + + /* Ensure the new priority is valid. */ + if( uxNewPriority >= ( UBaseType_t ) configMAX_PRIORITIES ) + { + uxNewPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the priority of the calling + * task that is being changed. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + traceTASK_PRIORITY_SET( pxTCB, uxNewPriority ); + + #if ( configUSE_MUTEXES == 1 ) + { + uxCurrentBasePriority = pxTCB->uxBasePriority; + } + #else + { + uxCurrentBasePriority = pxTCB->uxPriority; + } + #endif + + if( uxCurrentBasePriority != uxNewPriority ) + { + /* The priority change may have readied a task of higher + * priority than a running task. */ + if( uxNewPriority > uxCurrentBasePriority ) + { + #if ( configNUMBER_OF_CORES == 1 ) + { + if( pxTCB != pxCurrentTCB ) + { + /* The priority of a task other than the currently + * running task is being raised. Is the priority being + * raised above that of the running task? */ + if( uxNewPriority > pxCurrentTCB->uxPriority ) + { + xYieldRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* The priority of the running task is being raised, + * but the running task must already be the highest + * priority task able to run so no yield is required. */ + } + } + #else /* #if ( configNUMBER_OF_CORES == 1 ) */ + { + /* The priority of a task is being raised so + * perform a yield for this task later. */ + xYieldForTask = pdTRUE; + } + #endif /* #if ( configNUMBER_OF_CORES == 1 ) */ + } + else if( taskTASK_IS_RUNNING( pxTCB ) == pdTRUE ) + { + /* Setting the priority of a running task down means + * there may now be another task of higher priority that + * is ready to execute. */ + #if ( configUSE_TASK_PREEMPTION_DISABLE == 1 ) + if( pxTCB->xPreemptionDisable == pdFALSE ) + #endif + { + xYieldRequired = pdTRUE; + } + } + else + { + /* Setting the priority of any other task down does not + * require a yield as the running task must be above the + * new priority of the task being modified. */ + } + + /* Remember the ready list the task might be referenced from + * before its uxPriority member is changed so the + * taskRESET_READY_PRIORITY() macro can function correctly. */ + uxPriorityUsedOnEntry = pxTCB->uxPriority; + + #if ( configUSE_MUTEXES == 1 ) + { + /* Only change the priority being used if the task is not + * currently using an inherited priority or the new priority + * is bigger than the inherited priority. */ + if( ( pxTCB->uxBasePriority == pxTCB->uxPriority ) || ( uxNewPriority > pxTCB->uxPriority ) ) + { + pxTCB->uxPriority = uxNewPriority; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The base priority gets set whatever. */ + pxTCB->uxBasePriority = uxNewPriority; + } + #else /* if ( configUSE_MUTEXES == 1 ) */ + { + pxTCB->uxPriority = uxNewPriority; + } + #endif /* if ( configUSE_MUTEXES == 1 ) */ + + /* Only reset the event list item value if the value is not + * being used for anything else. */ + if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == ( ( TickType_t ) 0UL ) ) + { + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxNewPriority ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* If the task is in the blocked or suspended list we need do + * nothing more than change its priority variable. However, if + * the task is in a ready list it needs to be removed and placed + * in the list appropriate to its new priority. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE ) + { + /* The task is currently in its ready list - remove before + * adding it to its new ready list. As we are in a critical + * section we can do this even if the scheduler is suspended. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* It is known that the task is in its ready list so + * there is no need to check again and the port level + * reset macro can be called directly. */ + portRESET_READY_PRIORITY( uxPriorityUsedOnEntry, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + prvAddTaskToReadyList( pxTCB ); + } + else + { + #if ( configNUMBER_OF_CORES == 1 ) + { + mtCOVERAGE_TEST_MARKER(); + } + #else + { + /* It's possible that xYieldForTask was already set to pdTRUE because + * its priority is being raised. However, since it is not in a ready list + * we don't actually need to yield for it. */ + xYieldForTask = pdFALSE; + } + #endif + } + + if( xYieldRequired != pdFALSE ) + { + /* The running task priority is set down. Request the task to yield. */ + taskYIELD_TASK_CORE_IF_USING_PREEMPTION( pxTCB ); + } + else + { + #if ( configNUMBER_OF_CORES > 1 ) + if( xYieldForTask != pdFALSE ) + { + /* The priority of the task is being raised. If a running + * task has priority lower than this task, it should yield + * for this task. */ + taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxTCB ); + } + else + #endif /* if ( configNUMBER_OF_CORES > 1 ) */ + { + mtCOVERAGE_TEST_MARKER(); + } + } + + /* Remove compiler warning about unused variables when the port + * optimised task selection is not being used. */ + ( void ) uxPriorityUsedOnEntry; + } + } + taskEXIT_CRITICAL(); + + traceRETURN_vTaskPrioritySet(); + } + +#endif /* INCLUDE_vTaskPrioritySet */ +/*-----------------------------------------------------------*/ + +#if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + void vTaskCoreAffinitySet( const TaskHandle_t xTask, + UBaseType_t uxCoreAffinityMask ) + { + TCB_t * pxTCB; + BaseType_t xCoreID; + UBaseType_t uxPrevCoreAffinityMask; + + #if ( configUSE_PREEMPTION == 1 ) + UBaseType_t uxPrevNotAllowedCores; + #endif + + traceENTER_vTaskCoreAffinitySet( xTask, uxCoreAffinityMask ); + + taskENTER_CRITICAL(); + { + pxTCB = prvGetTCBFromHandle( xTask ); + + uxPrevCoreAffinityMask = pxTCB->uxCoreAffinityMask; + pxTCB->uxCoreAffinityMask = uxCoreAffinityMask; + + if( xSchedulerRunning != pdFALSE ) + { + if( taskTASK_IS_RUNNING( pxTCB ) == pdTRUE ) + { + xCoreID = ( BaseType_t ) pxTCB->xTaskRunState; + + /* If the task can no longer run on the core it was running, + * request the core to yield. */ + if( ( uxCoreAffinityMask & ( ( UBaseType_t ) 1U << ( UBaseType_t ) xCoreID ) ) == 0U ) + { + prvYieldCore( xCoreID ); + } + } + else + { + #if ( configUSE_PREEMPTION == 1 ) + { + /* Calculate the cores on which this task was not allowed to + * run previously. */ + uxPrevNotAllowedCores = ( ~uxPrevCoreAffinityMask ) & ( ( 1U << configNUMBER_OF_CORES ) - 1U ); + + /* Does the new core mask enables this task to run on any of the + * previously not allowed cores? If yes, check if this task can be + * scheduled on any of those cores. */ + if( ( uxPrevNotAllowedCores & uxCoreAffinityMask ) != 0U ) + { + prvYieldForTask( pxTCB ); + } + } + #else /* #if( configUSE_PREEMPTION == 1 ) */ + { + mtCOVERAGE_TEST_MARKER(); + } + #endif /* #if( configUSE_PREEMPTION == 1 ) */ + } + } + } + taskEXIT_CRITICAL(); + + traceRETURN_vTaskCoreAffinitySet(); + } +#endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + UBaseType_t vTaskCoreAffinityGet( ConstTaskHandle_t xTask ) + { + const TCB_t * pxTCB; + UBaseType_t uxCoreAffinityMask; + + traceENTER_vTaskCoreAffinityGet( xTask ); + + taskENTER_CRITICAL(); + { + pxTCB = prvGetTCBFromHandle( xTask ); + uxCoreAffinityMask = pxTCB->uxCoreAffinityMask; + } + taskEXIT_CRITICAL(); + + traceRETURN_vTaskCoreAffinityGet( uxCoreAffinityMask ); + + return uxCoreAffinityMask; + } +#endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) */ + +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_PREEMPTION_DISABLE == 1 ) + + void vTaskPreemptionDisable( const TaskHandle_t xTask ) + { + TCB_t * pxTCB; + + traceENTER_vTaskPreemptionDisable( xTask ); + + taskENTER_CRITICAL(); + { + pxTCB = prvGetTCBFromHandle( xTask ); + + pxTCB->xPreemptionDisable = pdTRUE; + } + taskEXIT_CRITICAL(); + + traceRETURN_vTaskPreemptionDisable(); + } + +#endif /* #if ( configUSE_TASK_PREEMPTION_DISABLE == 1 ) */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_PREEMPTION_DISABLE == 1 ) + + void vTaskPreemptionEnable( const TaskHandle_t xTask ) + { + TCB_t * pxTCB; + BaseType_t xCoreID; + + traceENTER_vTaskPreemptionEnable( xTask ); + + taskENTER_CRITICAL(); + { + pxTCB = prvGetTCBFromHandle( xTask ); + + pxTCB->xPreemptionDisable = pdFALSE; + + if( xSchedulerRunning != pdFALSE ) + { + if( taskTASK_IS_RUNNING( pxTCB ) == pdTRUE ) + { + xCoreID = ( BaseType_t ) pxTCB->xTaskRunState; + prvYieldCore( xCoreID ); + } + } + } + taskEXIT_CRITICAL(); + + traceRETURN_vTaskPreemptionEnable(); + } + +#endif /* #if ( configUSE_TASK_PREEMPTION_DISABLE == 1 ) */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + void vTaskSuspend( TaskHandle_t xTaskToSuspend ) + { + TCB_t * pxTCB; + + #if ( configNUMBER_OF_CORES > 1 ) + BaseType_t xTaskRunningOnCore; + #endif + + traceENTER_vTaskSuspend( xTaskToSuspend ); + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the running task that is + * being suspended. */ + pxTCB = prvGetTCBFromHandle( xTaskToSuspend ); + + traceTASK_SUSPEND( pxTCB ); + + #if ( configNUMBER_OF_CORES > 1 ) + xTaskRunningOnCore = pxTCB->xTaskRunState; + #endif + + /* Remove task from the ready/delayed list and place in the + * suspended list. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Is the task waiting on an event also? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + vListInsertEnd( &xSuspendedTaskList, &( pxTCB->xStateListItem ) ); + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + { + BaseType_t x; + + for( x = ( BaseType_t ) 0; x < ( BaseType_t ) configTASK_NOTIFICATION_ARRAY_ENTRIES; x++ ) + { + if( pxTCB->ucNotifyState[ x ] == taskWAITING_NOTIFICATION ) + { + /* The task was blocked to wait for a notification, but is + * now suspended, so no notification was received. */ + pxTCB->ucNotifyState[ x ] = taskNOT_WAITING_NOTIFICATION; + } + } + } + #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */ + } + + #if ( configNUMBER_OF_CORES == 1 ) + { + taskEXIT_CRITICAL(); + + if( xSchedulerRunning != pdFALSE ) + { + /* Reset the next expected unblock time in case it referred to the + * task that is now in the Suspended state. */ + taskENTER_CRITICAL(); + { + prvResetNextTaskUnblockTime(); + } + taskEXIT_CRITICAL(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( pxTCB == pxCurrentTCB ) + { + if( xSchedulerRunning != pdFALSE ) + { + /* The current task has just been suspended. */ + configASSERT( uxSchedulerSuspended == 0 ); + portYIELD_WITHIN_API(); + } + else + { + /* The scheduler is not running, but the task that was pointed + * to by pxCurrentTCB has just been suspended and pxCurrentTCB + * must be adjusted to point to a different task. */ + if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == uxCurrentNumberOfTasks ) + { + /* No other tasks are ready, so set pxCurrentTCB back to + * NULL so when the next task is created pxCurrentTCB will + * be set to point to it no matter what its relative priority + * is. */ + pxCurrentTCB = NULL; + } + else + { + vTaskSwitchContext(); + } + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #else /* #if ( configNUMBER_OF_CORES == 1 ) */ + { + if( xSchedulerRunning != pdFALSE ) + { + /* Reset the next expected unblock time in case it referred to the + * task that is now in the Suspended state. */ + prvResetNextTaskUnblockTime(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( taskTASK_IS_RUNNING( pxTCB ) == pdTRUE ) + { + if( xSchedulerRunning != pdFALSE ) + { + if( xTaskRunningOnCore == ( BaseType_t ) portGET_CORE_ID() ) + { + /* The current task has just been suspended. */ + configASSERT( uxSchedulerSuspended == 0 ); + vTaskYieldWithinAPI(); + } + else + { + prvYieldCore( xTaskRunningOnCore ); + } + } + else + { + /* This code path is not possible because only Idle tasks are + * assigned a core before the scheduler is started ( i.e. + * taskTASK_IS_RUNNING is only true for idle tasks before + * the scheduler is started ) and idle tasks cannot be + * suspended. */ + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + taskEXIT_CRITICAL(); + } + #endif /* #if ( configNUMBER_OF_CORES == 1 ) */ + + traceRETURN_vTaskSuspend(); + } + +#endif /* INCLUDE_vTaskSuspend */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask ) + { + BaseType_t xReturn = pdFALSE; + const TCB_t * const pxTCB = xTask; + + /* Accesses xPendingReadyList so must be called from a critical + * section. */ + + /* It does not make sense to check if the calling task is suspended. */ + configASSERT( xTask ); + + /* Is the task being resumed actually in the suspended list? */ + if( listIS_CONTAINED_WITHIN( &xSuspendedTaskList, &( pxTCB->xStateListItem ) ) != pdFALSE ) + { + /* Has the task already been resumed from within an ISR? */ + if( listIS_CONTAINED_WITHIN( &xPendingReadyList, &( pxTCB->xEventListItem ) ) == pdFALSE ) + { + /* Is it in the suspended list because it is in the Suspended + * state, or because it is blocked with no timeout? */ + if( listIS_CONTAINED_WITHIN( NULL, &( pxTCB->xEventListItem ) ) != pdFALSE ) + { + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + { + BaseType_t x; + + /* The task does not appear on the event list item of + * and of the RTOS objects, but could still be in the + * blocked state if it is waiting on its notification + * rather than waiting on an object. If not, is + * suspended. */ + xReturn = pdTRUE; + + for( x = ( BaseType_t ) 0; x < ( BaseType_t ) configTASK_NOTIFICATION_ARRAY_ENTRIES; x++ ) + { + if( pxTCB->ucNotifyState[ x ] == taskWAITING_NOTIFICATION ) + { + xReturn = pdFALSE; + break; + } + } + } + #else /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */ + { + xReturn = pdTRUE; + } + #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; + } + +#endif /* INCLUDE_vTaskSuspend */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + void vTaskResume( TaskHandle_t xTaskToResume ) + { + TCB_t * const pxTCB = xTaskToResume; + + traceENTER_vTaskResume( xTaskToResume ); + + /* It does not make sense to resume the calling task. */ + configASSERT( xTaskToResume ); + + #if ( configNUMBER_OF_CORES == 1 ) + + /* The parameter cannot be NULL as it is impossible to resume the + * currently executing task. */ + if( ( pxTCB != pxCurrentTCB ) && ( pxTCB != NULL ) ) + #else + + /* The parameter cannot be NULL as it is impossible to resume the + * currently executing task. It is also impossible to resume a task + * that is actively running on another core but it is not safe + * to check their run state here. Therefore, we get into a critical + * section and check if the task is actually suspended or not. */ + if( pxTCB != NULL ) + #endif + { + taskENTER_CRITICAL(); + { + if( prvTaskIsTaskSuspended( pxTCB ) != pdFALSE ) + { + traceTASK_RESUME( pxTCB ); + + /* The ready list can be accessed even if the scheduler is + * suspended because this is inside a critical section. */ + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + + /* This yield may not cause the task just resumed to run, + * but will leave the lists in the correct state for the + * next yield. */ + taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_vTaskResume(); + } + +#endif /* INCLUDE_vTaskSuspend */ + +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) + + BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) + { + BaseType_t xYieldRequired = pdFALSE; + TCB_t * const pxTCB = xTaskToResume; + UBaseType_t uxSavedInterruptStatus; + + traceENTER_xTaskResumeFromISR( xTaskToResume ); + + configASSERT( xTaskToResume ); + + /* RTOS ports that support interrupt nesting have the concept of a + * maximum system call (or maximum API call) interrupt priority. + * Interrupts that are above the maximum system call priority are keep + * permanently enabled, even when the RTOS kernel is in a critical section, + * but cannot make any calls to FreeRTOS API functions. If configASSERT() + * is defined in FreeRTOSConfig.h then + * portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has + * been assigned a priority above the configured maximum system call + * priority. Only FreeRTOS functions that end in FromISR can be called + * from interrupts that have been assigned a priority at or (logically) + * below the maximum system call interrupt priority. FreeRTOS maintains a + * separate interrupt safe API to ensure interrupt entry is as fast and as + * simple as possible. More information (albeit Cortex-M specific) is + * provided on the following link: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR(); + { + if( prvTaskIsTaskSuspended( pxTCB ) != pdFALSE ) + { + traceTASK_RESUME_FROM_ISR( pxTCB ); + + /* Check the ready lists can be accessed. */ + if( uxSchedulerSuspended == ( UBaseType_t ) 0U ) + { + #if ( configNUMBER_OF_CORES == 1 ) + { + /* Ready lists can be accessed so move the task from the + * suspended list to the ready list directly. */ + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + xYieldRequired = pdTRUE; + + /* Mark that a yield is pending in case the user is not + * using the return value to initiate a context switch + * from the ISR using the port specific portYIELD_FROM_ISR(). */ + xYieldPendings[ 0 ] = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* #if ( configNUMBER_OF_CORES == 1 ) */ + + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* The delayed or ready lists cannot be accessed so the task + * is held in the pending ready list until the scheduler is + * unsuspended. */ + vListInsertEnd( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + + #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_PREEMPTION == 1 ) ) + { + prvYieldForTask( pxTCB ); + + if( xYieldPendings[ portGET_CORE_ID() ] != pdFALSE ) + { + xYieldRequired = pdTRUE; + } + } + #endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_PREEMPTION == 1 ) ) */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus ); + + traceRETURN_xTaskResumeFromISR( xYieldRequired ); + + return xYieldRequired; + } + +#endif /* ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) */ +/*-----------------------------------------------------------*/ + +static BaseType_t prvCreateIdleTasks( void ) +{ + BaseType_t xReturn = pdPASS; + BaseType_t xCoreID; + char cIdleName[ configMAX_TASK_NAME_LEN ]; + TaskFunction_t pxIdleTaskFunction = NULL; + BaseType_t xIdleTaskNameIndex; + + for( xIdleTaskNameIndex = ( BaseType_t ) 0; xIdleTaskNameIndex < ( BaseType_t ) configMAX_TASK_NAME_LEN; xIdleTaskNameIndex++ ) + { + cIdleName[ xIdleTaskNameIndex ] = configIDLE_TASK_NAME[ xIdleTaskNameIndex ]; + + /* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than + * configMAX_TASK_NAME_LEN characters just in case the memory after the + * string is not accessible (extremely unlikely). */ + if( cIdleName[ xIdleTaskNameIndex ] == ( char ) 0x00 ) + { + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + /* Add each idle task at the lowest priority. */ + for( xCoreID = ( BaseType_t ) 0; xCoreID < ( BaseType_t ) configNUMBER_OF_CORES; xCoreID++ ) + { + #if ( configNUMBER_OF_CORES == 1 ) + { + pxIdleTaskFunction = prvIdleTask; + } + #else /* #if ( configNUMBER_OF_CORES == 1 ) */ + { + /* In the FreeRTOS SMP, configNUMBER_OF_CORES - 1 passive idle tasks + * are also created to ensure that each core has an idle task to + * run when no other task is available to run. */ + if( xCoreID == 0 ) + { + pxIdleTaskFunction = prvIdleTask; + } + else + { + pxIdleTaskFunction = prvPassiveIdleTask; + } + } + #endif /* #if ( configNUMBER_OF_CORES == 1 ) */ + + /* Update the idle task name with suffix to differentiate the idle tasks. + * This function is not required in single core FreeRTOS since there is + * only one idle task. */ + #if ( configNUMBER_OF_CORES > 1 ) + { + /* Append the idle task number to the end of the name if there is space. */ + if( xIdleTaskNameIndex < ( BaseType_t ) configMAX_TASK_NAME_LEN ) + { + cIdleName[ xIdleTaskNameIndex ] = ( char ) ( xCoreID + '0' ); + + /* And append a null character if there is space. */ + if( ( xIdleTaskNameIndex + 1 ) < ( BaseType_t ) configMAX_TASK_NAME_LEN ) + { + cIdleName[ xIdleTaskNameIndex + 1 ] = '\0'; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* if ( configNUMBER_OF_CORES > 1 ) */ + + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + StaticTask_t * pxIdleTaskTCBBuffer = NULL; + StackType_t * pxIdleTaskStackBuffer = NULL; + uint32_t ulIdleTaskStackSize; + + /* The Idle task is created using user provided RAM - obtain the + * address of the RAM then create the idle task. */ + #if ( configNUMBER_OF_CORES == 1 ) + { + vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer, &pxIdleTaskStackBuffer, &ulIdleTaskStackSize ); + } + #else + { + if( xCoreID == 0 ) + { + vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer, &pxIdleTaskStackBuffer, &ulIdleTaskStackSize ); + } + else + { + vApplicationGetPassiveIdleTaskMemory( &pxIdleTaskTCBBuffer, &pxIdleTaskStackBuffer, &ulIdleTaskStackSize, xCoreID - 1 ); + } + } + #endif /* if ( configNUMBER_OF_CORES == 1 ) */ + xIdleTaskHandles[ xCoreID ] = xTaskCreateStatic( pxIdleTaskFunction, + cIdleName, + ulIdleTaskStackSize, + ( void * ) NULL, + portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */ + pxIdleTaskStackBuffer, + pxIdleTaskTCBBuffer ); + + if( xIdleTaskHandles[ xCoreID ] != NULL ) + { + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + } + #else /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ + { + /* The Idle task is being created using dynamically allocated RAM. */ + xReturn = xTaskCreate( pxIdleTaskFunction, + cIdleName, + configMINIMAL_STACK_SIZE, + ( void * ) NULL, + portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */ + &xIdleTaskHandles[ xCoreID ] ); + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + + /* Break the loop if any of the idle task is failed to be created. */ + if( xReturn == pdFAIL ) + { + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + return xReturn; +} + +/*-----------------------------------------------------------*/ + +void vTaskStartScheduler( void ) +{ + BaseType_t xReturn; + + traceENTER_vTaskStartScheduler(); + + #if ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 ) + { + /* Sanity check that the UBaseType_t must have greater than or equal to + * the number of bits as confNUMBER_OF_CORES. */ + configASSERT( ( sizeof( UBaseType_t ) * taskBITS_PER_BYTE ) >= configNUMBER_OF_CORES ); + } + #endif /* #if ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 ) */ + + xReturn = prvCreateIdleTasks(); + + #if ( configUSE_TIMERS == 1 ) + { + if( xReturn == pdPASS ) + { + xReturn = xTimerCreateTimerTask(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_TIMERS */ + + if( xReturn == pdPASS ) + { + /* freertos_tasks_c_additions_init() should only be called if the user + * definable macro FREERTOS_TASKS_C_ADDITIONS_INIT() is defined, as that is + * the only macro called by the function. */ + #ifdef FREERTOS_TASKS_C_ADDITIONS_INIT + { + freertos_tasks_c_additions_init(); + } + #endif + + /* Interrupts are turned off here, to ensure a tick does not occur + * before or during the call to xPortStartScheduler(). The stacks of + * the created tasks contain a status word with interrupts switched on + * so interrupts will automatically get re-enabled when the first task + * starts to run. */ + portDISABLE_INTERRUPTS(); + + #if ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) + { + /* Switch C-Runtime's TLS Block to point to the TLS + * block specific to the task that will run first. */ + configSET_TLS_BLOCK( pxCurrentTCB->xTLSBlock ); + } + #endif + + xNextTaskUnblockTime = portMAX_DELAY; + xSchedulerRunning = pdTRUE; + xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT; + + /* If configGENERATE_RUN_TIME_STATS is defined then the following + * macro must be defined to configure the timer/counter used to generate + * the run time counter time base. NOTE: If configGENERATE_RUN_TIME_STATS + * is set to 0 and the following line fails to build then ensure you do not + * have portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() defined in your + * FreeRTOSConfig.h file. */ + portCONFIGURE_TIMER_FOR_RUN_TIME_STATS(); + + traceTASK_SWITCHED_IN(); + + /* Setting up the timer tick is hardware specific and thus in the + * portable interface. */ + + /* The return value for xPortStartScheduler is not required + * hence using a void datatype. */ + ( void ) xPortStartScheduler(); + + /* In most cases, xPortStartScheduler() will not return. If it + * returns pdTRUE then there was not enough heap memory available + * to create either the Idle or the Timer task. If it returned + * pdFALSE, then the application called xTaskEndScheduler(). + * Most ports don't implement xTaskEndScheduler() as there is + * nothing to return to. */ + } + else + { + /* This line will only be reached if the kernel could not be started, + * because there was not enough FreeRTOS heap to create the idle task + * or the timer task. */ + configASSERT( xReturn != errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ); + } + + /* Prevent compiler warnings if INCLUDE_xTaskGetIdleTaskHandle is set to 0, + * meaning xIdleTaskHandles are not used anywhere else. */ + ( void ) xIdleTaskHandles; + + /* OpenOCD makes use of uxTopUsedPriority for thread debugging. Prevent uxTopUsedPriority + * from getting optimized out as it is no longer used by the kernel. */ + ( void ) uxTopUsedPriority; + + traceRETURN_vTaskStartScheduler(); +} +/*-----------------------------------------------------------*/ + +void vTaskEndScheduler( void ) +{ + traceENTER_vTaskEndScheduler(); + + /* Stop the scheduler interrupts and call the portable scheduler end + * routine so the original ISRs can be restored if necessary. The port + * layer must ensure interrupts enable bit is left in the correct state. */ + portDISABLE_INTERRUPTS(); + xSchedulerRunning = pdFALSE; + vPortEndScheduler(); + + traceRETURN_vTaskEndScheduler(); +} +/*----------------------------------------------------------*/ + +void vTaskSuspendAll( void ) +{ + traceENTER_vTaskSuspendAll(); + + #if ( configNUMBER_OF_CORES == 1 ) + { + /* A critical section is not required as the variable is of type + * BaseType_t. Please read Richard Barry's reply in the following link to a + * post in the FreeRTOS support forum before reporting this as a bug! - + * https://goo.gl/wu4acr */ + + /* portSOFTWARE_BARRIER() is only implemented for emulated/simulated ports that + * do not otherwise exhibit real time behaviour. */ + portSOFTWARE_BARRIER(); + + /* The scheduler is suspended if uxSchedulerSuspended is non-zero. An increment + * is used to allow calls to vTaskSuspendAll() to nest. */ + ++uxSchedulerSuspended; + + /* Enforces ordering for ports and optimised compilers that may otherwise place + * the above increment elsewhere. */ + portMEMORY_BARRIER(); + } + #else /* #if ( configNUMBER_OF_CORES == 1 ) */ + { + UBaseType_t ulState; + + /* This must only be called from within a task. */ + portASSERT_IF_IN_ISR(); + + if( xSchedulerRunning != pdFALSE ) + { + /* Writes to uxSchedulerSuspended must be protected by both the task AND ISR locks. + * We must disable interrupts before we grab the locks in the event that this task is + * interrupted and switches context before incrementing uxSchedulerSuspended. + * It is safe to re-enable interrupts after releasing the ISR lock and incrementing + * uxSchedulerSuspended since that will prevent context switches. */ + ulState = portSET_INTERRUPT_MASK(); + + /* portSOFRWARE_BARRIER() is only implemented for emulated/simulated ports that + * do not otherwise exhibit real time behaviour. */ + portSOFTWARE_BARRIER(); + + portGET_TASK_LOCK(); + + /* uxSchedulerSuspended is increased after prvCheckForRunStateChange. The + * purpose is to prevent altering the variable when fromISR APIs are readying + * it. */ + if( uxSchedulerSuspended == 0U ) + { + if( portGET_CRITICAL_NESTING_COUNT() == 0U ) + { + prvCheckForRunStateChange(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + portGET_ISR_LOCK(); + + /* The scheduler is suspended if uxSchedulerSuspended is non-zero. An increment + * is used to allow calls to vTaskSuspendAll() to nest. */ + ++uxSchedulerSuspended; + portRELEASE_ISR_LOCK(); + + portCLEAR_INTERRUPT_MASK( ulState ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* #if ( configNUMBER_OF_CORES == 1 ) */ + + traceRETURN_vTaskSuspendAll(); +} + +/*----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE != 0 ) + + static TickType_t prvGetExpectedIdleTime( void ) + { + TickType_t xReturn; + UBaseType_t uxHigherPriorityReadyTasks = pdFALSE; + + /* uxHigherPriorityReadyTasks takes care of the case where + * configUSE_PREEMPTION is 0, so there may be tasks above the idle priority + * task that are in the Ready state, even though the idle task is + * running. */ + #if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 ) + { + if( uxTopReadyPriority > tskIDLE_PRIORITY ) + { + uxHigherPriorityReadyTasks = pdTRUE; + } + } + #else + { + const UBaseType_t uxLeastSignificantBit = ( UBaseType_t ) 0x01; + + /* When port optimised task selection is used the uxTopReadyPriority + * variable is used as a bit map. If bits other than the least + * significant bit are set then there are tasks that have a priority + * above the idle priority that are in the Ready state. This takes + * care of the case where the co-operative scheduler is in use. */ + if( uxTopReadyPriority > uxLeastSignificantBit ) + { + uxHigherPriorityReadyTasks = pdTRUE; + } + } + #endif /* if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 ) */ + + if( pxCurrentTCB->uxPriority > tskIDLE_PRIORITY ) + { + xReturn = 0; + } + else if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > 1U ) + { + /* There are other idle priority tasks in the ready state. If + * time slicing is used then the very next tick interrupt must be + * processed. */ + xReturn = 0; + } + else if( uxHigherPriorityReadyTasks != pdFALSE ) + { + /* There are tasks in the Ready state that have a priority above the + * idle priority. This path can only be reached if + * configUSE_PREEMPTION is 0. */ + xReturn = 0; + } + else + { + xReturn = xNextTaskUnblockTime; + xReturn -= xTickCount; + } + + return xReturn; + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*----------------------------------------------------------*/ + +BaseType_t xTaskResumeAll( void ) +{ + TCB_t * pxTCB = NULL; + BaseType_t xAlreadyYielded = pdFALSE; + + traceENTER_xTaskResumeAll(); + + #if ( configNUMBER_OF_CORES > 1 ) + if( xSchedulerRunning != pdFALSE ) + #endif + { + /* It is possible that an ISR caused a task to be removed from an event + * list while the scheduler was suspended. If this was the case then the + * removed task will have been added to the xPendingReadyList. Once the + * scheduler has been resumed it is safe to move all the pending ready + * tasks from this list into their appropriate ready list. */ + taskENTER_CRITICAL(); + { + BaseType_t xCoreID; + xCoreID = ( BaseType_t ) portGET_CORE_ID(); + + /* If uxSchedulerSuspended is zero then this function does not match a + * previous call to vTaskSuspendAll(). */ + configASSERT( uxSchedulerSuspended != 0U ); + + --uxSchedulerSuspended; + portRELEASE_TASK_LOCK(); + + if( uxSchedulerSuspended == ( UBaseType_t ) 0U ) + { + if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U ) + { + /* Move any readied tasks from the pending list into the + * appropriate ready list. */ + while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE ) + { + /* MISRA Ref 11.5.3 [Void pointer assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) ); + listREMOVE_ITEM( &( pxTCB->xEventListItem ) ); + portMEMORY_BARRIER(); + listREMOVE_ITEM( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + + #if ( configNUMBER_OF_CORES == 1 ) + { + /* If the moved task has a priority higher than the current + * task then a yield must be performed. */ + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + xYieldPendings[ xCoreID ] = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #else /* #if ( configNUMBER_OF_CORES == 1 ) */ + { + /* All appropriate tasks yield at the moment a task is added to xPendingReadyList. + * If the current core yielded then vTaskSwitchContext() has already been called + * which sets xYieldPendings for the current core to pdTRUE. */ + } + #endif /* #if ( configNUMBER_OF_CORES == 1 ) */ + } + + if( pxTCB != NULL ) + { + /* A task was unblocked while the scheduler was suspended, + * which may have prevented the next unblock time from being + * re-calculated, in which case re-calculate it now. Mainly + * important for low power tickless implementations, where + * this can prevent an unnecessary exit from low power + * state. */ + prvResetNextTaskUnblockTime(); + } + + /* If any ticks occurred while the scheduler was suspended then + * they should be processed now. This ensures the tick count does + * not slip, and that any delayed tasks are resumed at the correct + * time. + * + * It should be safe to call xTaskIncrementTick here from any core + * since we are in a critical section and xTaskIncrementTick itself + * protects itself within a critical section. Suspending the scheduler + * from any core causes xTaskIncrementTick to increment uxPendedCounts. */ + { + TickType_t xPendedCounts = xPendedTicks; /* Non-volatile copy. */ + + if( xPendedCounts > ( TickType_t ) 0U ) + { + do + { + if( xTaskIncrementTick() != pdFALSE ) + { + /* Other cores are interrupted from + * within xTaskIncrementTick(). */ + xYieldPendings[ xCoreID ] = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + --xPendedCounts; + } while( xPendedCounts > ( TickType_t ) 0U ); + + xPendedTicks = 0; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + if( xYieldPendings[ xCoreID ] != pdFALSE ) + { + #if ( configUSE_PREEMPTION != 0 ) + { + xAlreadyYielded = pdTRUE; + } + #endif /* #if ( configUSE_PREEMPTION != 0 ) */ + + #if ( configNUMBER_OF_CORES == 1 ) + { + taskYIELD_TASK_CORE_IF_USING_PREEMPTION( pxCurrentTCB ); + } + #endif /* #if ( configNUMBER_OF_CORES == 1 ) */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + } + + traceRETURN_xTaskResumeAll( xAlreadyYielded ); + + return xAlreadyYielded; +} +/*-----------------------------------------------------------*/ + +TickType_t xTaskGetTickCount( void ) +{ + TickType_t xTicks; + + traceENTER_xTaskGetTickCount(); + + /* Critical section required if running on a 16 bit processor. */ + portTICK_TYPE_ENTER_CRITICAL(); + { + xTicks = xTickCount; + } + portTICK_TYPE_EXIT_CRITICAL(); + + traceRETURN_xTaskGetTickCount( xTicks ); + + return xTicks; +} +/*-----------------------------------------------------------*/ + +TickType_t xTaskGetTickCountFromISR( void ) +{ + TickType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + + traceENTER_xTaskGetTickCountFromISR(); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + * system call (or maximum API call) interrupt priority. Interrupts that are + * above the maximum system call priority are kept permanently enabled, even + * when the RTOS kernel is in a critical section, but cannot make any calls to + * FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has been + * assigned a priority above the configured maximum system call priority. + * Only FreeRTOS functions that end in FromISR can be called from interrupts + * that have been assigned a priority at or (logically) below the maximum + * system call interrupt priority. FreeRTOS maintains a separate interrupt + * safe API to ensure interrupt entry is as fast and as simple as possible. + * More information (albeit Cortex-M specific) is provided on the following + * link: https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR(); + { + xReturn = xTickCount; + } + portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + traceRETURN_xTaskGetTickCountFromISR( xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxTaskGetNumberOfTasks( void ) +{ + traceENTER_uxTaskGetNumberOfTasks(); + + /* A critical section is not required because the variables are of type + * BaseType_t. */ + traceRETURN_uxTaskGetNumberOfTasks( uxCurrentNumberOfTasks ); + + return uxCurrentNumberOfTasks; +} +/*-----------------------------------------------------------*/ + +char * pcTaskGetName( TaskHandle_t xTaskToQuery ) +{ + TCB_t * pxTCB; + + traceENTER_pcTaskGetName( xTaskToQuery ); + + /* If null is passed in here then the name of the calling task is being + * queried. */ + pxTCB = prvGetTCBFromHandle( xTaskToQuery ); + configASSERT( pxTCB ); + + traceRETURN_pcTaskGetName( &( pxTCB->pcTaskName[ 0 ] ) ); + + return &( pxTCB->pcTaskName[ 0 ] ); +} +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetHandle == 1 ) + + #if ( configNUMBER_OF_CORES == 1 ) + static TCB_t * prvSearchForNameWithinSingleList( List_t * pxList, + const char pcNameToQuery[] ) + { + TCB_t * pxNextTCB; + TCB_t * pxFirstTCB; + TCB_t * pxReturn = NULL; + UBaseType_t x; + char cNextChar; + BaseType_t xBreakLoop; + + /* This function is called with the scheduler suspended. */ + + if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) + { + /* MISRA Ref 11.5.3 [Void pointer assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); + + do + { + /* MISRA Ref 11.5.3 [Void pointer assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); + + /* Check each character in the name looking for a match or + * mismatch. */ + xBreakLoop = pdFALSE; + + for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) + { + cNextChar = pxNextTCB->pcTaskName[ x ]; + + if( cNextChar != pcNameToQuery[ x ] ) + { + /* Characters didn't match. */ + xBreakLoop = pdTRUE; + } + else if( cNextChar == ( char ) 0x00 ) + { + /* Both strings terminated, a match must have been + * found. */ + pxReturn = pxNextTCB; + xBreakLoop = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xBreakLoop != pdFALSE ) + { + break; + } + } + + if( pxReturn != NULL ) + { + /* The handle has been found. */ + break; + } + } while( pxNextTCB != pxFirstTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return pxReturn; + } + #else /* if ( configNUMBER_OF_CORES == 1 ) */ + static TCB_t * prvSearchForNameWithinSingleList( List_t * pxList, + const char pcNameToQuery[] ) + { + TCB_t * pxReturn = NULL; + UBaseType_t x; + char cNextChar; + BaseType_t xBreakLoop; + const ListItem_t * pxEndMarker = listGET_END_MARKER( pxList ); + ListItem_t * pxIterator; + + /* This function is called with the scheduler suspended. */ + + if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) + { + for( pxIterator = listGET_HEAD_ENTRY( pxList ); pxIterator != pxEndMarker; pxIterator = listGET_NEXT( pxIterator ) ) + { + /* MISRA Ref 11.5.3 [Void pointer assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + TCB_t * pxTCB = listGET_LIST_ITEM_OWNER( pxIterator ); + + /* Check each character in the name looking for a match or + * mismatch. */ + xBreakLoop = pdFALSE; + + for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) + { + cNextChar = pxTCB->pcTaskName[ x ]; + + if( cNextChar != pcNameToQuery[ x ] ) + { + /* Characters didn't match. */ + xBreakLoop = pdTRUE; + } + else if( cNextChar == ( char ) 0x00 ) + { + /* Both strings terminated, a match must have been + * found. */ + pxReturn = pxTCB; + xBreakLoop = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xBreakLoop != pdFALSE ) + { + break; + } + } + + if( pxReturn != NULL ) + { + /* The handle has been found. */ + break; + } + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return pxReturn; + } + #endif /* #if ( configNUMBER_OF_CORES == 1 ) */ + +#endif /* INCLUDE_xTaskGetHandle */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetHandle == 1 ) + + TaskHandle_t xTaskGetHandle( const char * pcNameToQuery ) + { + UBaseType_t uxQueue = configMAX_PRIORITIES; + TCB_t * pxTCB; + + traceENTER_xTaskGetHandle( pcNameToQuery ); + + /* Task names will be truncated to configMAX_TASK_NAME_LEN - 1 bytes. */ + configASSERT( strlen( pcNameToQuery ) < configMAX_TASK_NAME_LEN ); + + vTaskSuspendAll(); + { + /* Search the ready lists. */ + do + { + uxQueue--; + pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) &( pxReadyTasksLists[ uxQueue ] ), pcNameToQuery ); + + if( pxTCB != NULL ) + { + /* Found the handle. */ + break; + } + } while( uxQueue > ( UBaseType_t ) tskIDLE_PRIORITY ); + + /* Search the delayed lists. */ + if( pxTCB == NULL ) + { + pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) pxDelayedTaskList, pcNameToQuery ); + } + + if( pxTCB == NULL ) + { + pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) pxOverflowDelayedTaskList, pcNameToQuery ); + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( pxTCB == NULL ) + { + /* Search the suspended list. */ + pxTCB = prvSearchForNameWithinSingleList( &xSuspendedTaskList, pcNameToQuery ); + } + } + #endif + + #if ( INCLUDE_vTaskDelete == 1 ) + { + if( pxTCB == NULL ) + { + /* Search the deleted list. */ + pxTCB = prvSearchForNameWithinSingleList( &xTasksWaitingTermination, pcNameToQuery ); + } + } + #endif + } + ( void ) xTaskResumeAll(); + + traceRETURN_xTaskGetHandle( pxTCB ); + + return pxTCB; + } + +#endif /* INCLUDE_xTaskGetHandle */ +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + + BaseType_t xTaskGetStaticBuffers( TaskHandle_t xTask, + StackType_t ** ppuxStackBuffer, + StaticTask_t ** ppxTaskBuffer ) + { + BaseType_t xReturn; + TCB_t * pxTCB; + + traceENTER_xTaskGetStaticBuffers( xTask, ppuxStackBuffer, ppxTaskBuffer ); + + configASSERT( ppuxStackBuffer != NULL ); + configASSERT( ppxTaskBuffer != NULL ); + + pxTCB = prvGetTCBFromHandle( xTask ); + + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE == 1 ) + { + if( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_AND_TCB ) + { + *ppuxStackBuffer = pxTCB->pxStack; + /* MISRA Ref 11.3.1 [Misaligned access] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */ + /* coverity[misra_c_2012_rule_11_3_violation] */ + *ppxTaskBuffer = ( StaticTask_t * ) pxTCB; + xReturn = pdTRUE; + } + else if( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_ONLY ) + { + *ppuxStackBuffer = pxTCB->pxStack; + *ppxTaskBuffer = NULL; + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + #else /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE == 1 */ + { + *ppuxStackBuffer = pxTCB->pxStack; + *ppxTaskBuffer = ( StaticTask_t * ) pxTCB; + xReturn = pdTRUE; + } + #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE == 1 */ + + traceRETURN_xTaskGetStaticBuffers( xReturn ); + + return xReturn; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, + const UBaseType_t uxArraySize, + configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime ) + { + UBaseType_t uxTask = 0, uxQueue = configMAX_PRIORITIES; + + traceENTER_uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, pulTotalRunTime ); + + vTaskSuspendAll(); + { + /* Is there a space in the array for each task in the system? */ + if( uxArraySize >= uxCurrentNumberOfTasks ) + { + /* Fill in an TaskStatus_t structure with information on each + * task in the Ready state. */ + do + { + uxQueue--; + uxTask = ( UBaseType_t ) ( uxTask + prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &( pxReadyTasksLists[ uxQueue ] ), eReady ) ); + } while( uxQueue > ( UBaseType_t ) tskIDLE_PRIORITY ); + + /* Fill in an TaskStatus_t structure with information on each + * task in the Blocked state. */ + uxTask = ( UBaseType_t ) ( uxTask + prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxDelayedTaskList, eBlocked ) ); + uxTask = ( UBaseType_t ) ( uxTask + prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxOverflowDelayedTaskList, eBlocked ) ); + + #if ( INCLUDE_vTaskDelete == 1 ) + { + /* Fill in an TaskStatus_t structure with information on + * each task that has been deleted but not yet cleaned up. */ + uxTask = ( UBaseType_t ) ( uxTask + prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xTasksWaitingTermination, eDeleted ) ); + } + #endif + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + /* Fill in an TaskStatus_t structure with information on + * each task in the Suspended state. */ + uxTask = ( UBaseType_t ) ( uxTask + prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xSuspendedTaskList, eSuspended ) ); + } + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + if( pulTotalRunTime != NULL ) + { + #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE + portALT_GET_RUN_TIME_COUNTER_VALUE( ( *pulTotalRunTime ) ); + #else + *pulTotalRunTime = ( configRUN_TIME_COUNTER_TYPE ) portGET_RUN_TIME_COUNTER_VALUE(); + #endif + } + } + #else /* if ( configGENERATE_RUN_TIME_STATS == 1 ) */ + { + if( pulTotalRunTime != NULL ) + { + *pulTotalRunTime = 0; + } + } + #endif /* if ( configGENERATE_RUN_TIME_STATS == 1 ) */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + ( void ) xTaskResumeAll(); + + traceRETURN_uxTaskGetSystemState( uxTask ); + + return uxTask; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) + + #if ( configNUMBER_OF_CORES == 1 ) + TaskHandle_t xTaskGetIdleTaskHandle( void ) + { + traceENTER_xTaskGetIdleTaskHandle(); + + /* If xTaskGetIdleTaskHandle() is called before the scheduler has been + * started, then xIdleTaskHandles will be NULL. */ + configASSERT( ( xIdleTaskHandles[ 0 ] != NULL ) ); + + traceRETURN_xTaskGetIdleTaskHandle( xIdleTaskHandles[ 0 ] ); + + return xIdleTaskHandles[ 0 ]; + } + #endif /* if ( configNUMBER_OF_CORES == 1 ) */ + + TaskHandle_t xTaskGetIdleTaskHandleForCore( BaseType_t xCoreID ) + { + traceENTER_xTaskGetIdleTaskHandleForCore( xCoreID ); + + /* Ensure the core ID is valid. */ + configASSERT( taskVALID_CORE_ID( xCoreID ) == pdTRUE ); + + /* If xTaskGetIdleTaskHandle() is called before the scheduler has been + * started, then xIdleTaskHandles will be NULL. */ + configASSERT( ( xIdleTaskHandles[ xCoreID ] != NULL ) ); + + traceRETURN_xTaskGetIdleTaskHandleForCore( xIdleTaskHandles[ xCoreID ] ); + + return xIdleTaskHandles[ xCoreID ]; + } + +#endif /* INCLUDE_xTaskGetIdleTaskHandle */ +/*----------------------------------------------------------*/ + +/* This conditional compilation should use inequality to 0, not equality to 1. + * This is to ensure vTaskStepTick() is available when user defined low power mode + * implementations require configUSE_TICKLESS_IDLE to be set to a value other than + * 1. */ +#if ( configUSE_TICKLESS_IDLE != 0 ) + + void vTaskStepTick( TickType_t xTicksToJump ) + { + TickType_t xUpdatedTickCount; + + traceENTER_vTaskStepTick( xTicksToJump ); + + /* Correct the tick count value after a period during which the tick + * was suppressed. Note this does *not* call the tick hook function for + * each stepped tick. */ + xUpdatedTickCount = xTickCount + xTicksToJump; + configASSERT( xUpdatedTickCount <= xNextTaskUnblockTime ); + + if( xUpdatedTickCount == xNextTaskUnblockTime ) + { + /* Arrange for xTickCount to reach xNextTaskUnblockTime in + * xTaskIncrementTick() when the scheduler resumes. This ensures + * that any delayed tasks are resumed at the correct time. */ + configASSERT( uxSchedulerSuspended != ( UBaseType_t ) 0U ); + configASSERT( xTicksToJump != ( TickType_t ) 0 ); + + /* Prevent the tick interrupt modifying xPendedTicks simultaneously. */ + taskENTER_CRITICAL(); + { + xPendedTicks++; + } + taskEXIT_CRITICAL(); + xTicksToJump--; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xTickCount += xTicksToJump; + + traceINCREASE_TICK_COUNT( xTicksToJump ); + traceRETURN_vTaskStepTick(); + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*----------------------------------------------------------*/ + +BaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) +{ + BaseType_t xYieldOccurred; + + traceENTER_xTaskCatchUpTicks( xTicksToCatchUp ); + + /* Must not be called with the scheduler suspended as the implementation + * relies on xPendedTicks being wound down to 0 in xTaskResumeAll(). */ + configASSERT( uxSchedulerSuspended == ( UBaseType_t ) 0U ); + + /* Use xPendedTicks to mimic xTicksToCatchUp number of ticks occurring when + * the scheduler is suspended so the ticks are executed in xTaskResumeAll(). */ + vTaskSuspendAll(); + + /* Prevent the tick interrupt modifying xPendedTicks simultaneously. */ + taskENTER_CRITICAL(); + { + xPendedTicks += xTicksToCatchUp; + } + taskEXIT_CRITICAL(); + xYieldOccurred = xTaskResumeAll(); + + traceRETURN_xTaskCatchUpTicks( xYieldOccurred ); + + return xYieldOccurred; +} +/*----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskAbortDelay == 1 ) + + BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) + { + TCB_t * pxTCB = xTask; + BaseType_t xReturn; + + traceENTER_xTaskAbortDelay( xTask ); + + configASSERT( pxTCB ); + + vTaskSuspendAll(); + { + /* A task can only be prematurely removed from the Blocked state if + * it is actually in the Blocked state. */ + if( eTaskGetState( xTask ) == eBlocked ) + { + xReturn = pdPASS; + + /* Remove the reference to the task from the blocked list. An + * interrupt won't touch the xStateListItem because the + * scheduler is suspended. */ + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + + /* Is the task waiting on an event also? If so remove it from + * the event list too. Interrupts can touch the event list item, + * even though the scheduler is suspended, so a critical section + * is used. */ + taskENTER_CRITICAL(); + { + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + + /* This lets the task know it was forcibly removed from the + * blocked state so it should not re-evaluate its block time and + * then block again. */ + pxTCB->ucDelayAborted = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + /* Place the unblocked task into the appropriate ready list. */ + prvAddTaskToReadyList( pxTCB ); + + /* A task being unblocked cannot cause an immediate context + * switch if preemption is turned off. */ + #if ( configUSE_PREEMPTION == 1 ) + { + #if ( configNUMBER_OF_CORES == 1 ) + { + /* Preemption is on, but a context switch should only be + * performed if the unblocked task has a priority that is + * higher than the currently executing task. */ + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* Pend the yield to be performed when the scheduler + * is unsuspended. */ + xYieldPendings[ 0 ] = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #else /* #if ( configNUMBER_OF_CORES == 1 ) */ + { + taskENTER_CRITICAL(); + { + prvYieldForTask( pxTCB ); + } + taskEXIT_CRITICAL(); + } + #endif /* #if ( configNUMBER_OF_CORES == 1 ) */ + } + #endif /* #if ( configUSE_PREEMPTION == 1 ) */ + } + else + { + xReturn = pdFAIL; + } + } + ( void ) xTaskResumeAll(); + + traceRETURN_xTaskAbortDelay( xReturn ); + + return xReturn; + } + +#endif /* INCLUDE_xTaskAbortDelay */ +/*----------------------------------------------------------*/ + +BaseType_t xTaskIncrementTick( void ) +{ + TCB_t * pxTCB; + TickType_t xItemValue; + BaseType_t xSwitchRequired = pdFALSE; + + #if ( configUSE_PREEMPTION == 1 ) && ( configNUMBER_OF_CORES > 1 ) + BaseType_t xYieldRequiredForCore[ configNUMBER_OF_CORES ] = { pdFALSE }; + #endif /* #if ( configUSE_PREEMPTION == 1 ) && ( configNUMBER_OF_CORES > 1 ) */ + + traceENTER_xTaskIncrementTick(); + + /* Called by the portable layer each time a tick interrupt occurs. + * Increments the tick then checks to see if the new tick value will cause any + * tasks to be unblocked. */ + traceTASK_INCREMENT_TICK( xTickCount ); + + /* Tick increment should occur on every kernel timer event. Core 0 has the + * responsibility to increment the tick, or increment the pended ticks if the + * scheduler is suspended. If pended ticks is greater than zero, the core that + * calls xTaskResumeAll has the responsibility to increment the tick. */ + if( uxSchedulerSuspended == ( UBaseType_t ) 0U ) + { + /* Minor optimisation. The tick count cannot change in this + * block. */ + const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1; + + /* Increment the RTOS tick, switching the delayed and overflowed + * delayed lists if it wraps to 0. */ + xTickCount = xConstTickCount; + + if( xConstTickCount == ( TickType_t ) 0U ) + { + taskSWITCH_DELAYED_LISTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* See if this tick has made a timeout expire. Tasks are stored in + * the queue in the order of their wake time - meaning once one task + * has been found whose block time has not expired there is no need to + * look any further down the list. */ + if( xConstTickCount >= xNextTaskUnblockTime ) + { + for( ; ; ) + { + if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) + { + /* The delayed list is empty. Set xNextTaskUnblockTime + * to the maximum possible value so it is extremely + * unlikely that the + * if( xTickCount >= xNextTaskUnblockTime ) test will pass + * next time through. */ + xNextTaskUnblockTime = portMAX_DELAY; + break; + } + else + { + /* The delayed list is not empty, get the value of the + * item at the head of the delayed list. This is the time + * at which the task at the head of the delayed list must + * be removed from the Blocked state. */ + /* MISRA Ref 11.5.3 [Void pointer assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + pxTCB = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); + xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xStateListItem ) ); + + if( xConstTickCount < xItemValue ) + { + /* It is not time to unblock this item yet, but the + * item value is the time at which the task at the head + * of the blocked list must be removed from the Blocked + * state - so record the item value in + * xNextTaskUnblockTime. */ + xNextTaskUnblockTime = xItemValue; + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* It is time to remove the item from the Blocked state. */ + listREMOVE_ITEM( &( pxTCB->xStateListItem ) ); + + /* Is the task waiting on an event also? If so remove + * it from the event list. */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + listREMOVE_ITEM( &( pxTCB->xEventListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Place the unblocked task into the appropriate ready + * list. */ + prvAddTaskToReadyList( pxTCB ); + + /* A task being unblocked cannot cause an immediate + * context switch if preemption is turned off. */ + #if ( configUSE_PREEMPTION == 1 ) + { + #if ( configNUMBER_OF_CORES == 1 ) + { + /* Preemption is on, but a context switch should + * only be performed if the unblocked task's + * priority is higher than the currently executing + * task. + * The case of equal priority tasks sharing + * processing time (which happens when both + * preemption and time slicing are on) is + * handled below.*/ + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + xSwitchRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #else /* #if( configNUMBER_OF_CORES == 1 ) */ + { + prvYieldForTask( pxTCB ); + } + #endif /* #if( configNUMBER_OF_CORES == 1 ) */ + } + #endif /* #if ( configUSE_PREEMPTION == 1 ) */ + } + } + } + + /* Tasks of equal priority to the currently running task will share + * processing time (time slice) if preemption is on, and the application + * writer has not explicitly turned time slicing off. */ + #if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) + { + #if ( configNUMBER_OF_CORES == 1 ) + { + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ pxCurrentTCB->uxPriority ] ) ) > 1U ) + { + xSwitchRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #else /* #if ( configNUMBER_OF_CORES == 1 ) */ + { + BaseType_t xCoreID; + + for( xCoreID = 0; xCoreID < ( ( BaseType_t ) configNUMBER_OF_CORES ); xCoreID++ ) + { + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ pxCurrentTCBs[ xCoreID ]->uxPriority ] ) ) > 1U ) + { + xYieldRequiredForCore[ xCoreID ] = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #endif /* #if ( configNUMBER_OF_CORES == 1 ) */ + } + #endif /* #if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) */ + + #if ( configUSE_TICK_HOOK == 1 ) + { + /* Guard against the tick hook being called when the pended tick + * count is being unwound (when the scheduler is being unlocked). */ + if( xPendedTicks == ( TickType_t ) 0 ) + { + #if 1 + /* << EST: using configuration name macro */ + configUSE_TICK_HOOK_NAME(); + #else + vApplicationTickHook(); + #endif + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_TICK_HOOK */ + + #if ( configUSE_PREEMPTION == 1 ) + { + #if ( configNUMBER_OF_CORES == 1 ) + { + /* For single core the core ID is always 0. */ + if( xYieldPendings[ 0 ] != pdFALSE ) + { + xSwitchRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #else /* #if ( configNUMBER_OF_CORES == 1 ) */ + { + BaseType_t xCoreID, xCurrentCoreID; + xCurrentCoreID = ( BaseType_t ) portGET_CORE_ID(); + + for( xCoreID = 0; xCoreID < ( BaseType_t ) configNUMBER_OF_CORES; xCoreID++ ) + { + #if ( configUSE_TASK_PREEMPTION_DISABLE == 1 ) + if( pxCurrentTCBs[ xCoreID ]->xPreemptionDisable == pdFALSE ) + #endif + { + if( ( xYieldRequiredForCore[ xCoreID ] != pdFALSE ) || ( xYieldPendings[ xCoreID ] != pdFALSE ) ) + { + if( xCoreID == xCurrentCoreID ) + { + xSwitchRequired = pdTRUE; + } + else + { + prvYieldCore( xCoreID ); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + } + #endif /* #if ( configNUMBER_OF_CORES == 1 ) */ + } + #endif /* #if ( configUSE_PREEMPTION == 1 ) */ + } + else + { + ++xPendedTicks; + + /* The tick hook gets called at regular intervals, even if the + * scheduler is locked. */ + #if ( configUSE_TICK_HOOK == 1 ) + { +#if 1 + /* << EST: using configuration name macro */ + configUSE_TICK_HOOK_NAME(); +#else + vApplicationTickHook(); +#endif + } + #endif + } + + traceRETURN_xTaskIncrementTick( xSwitchRequired ); + + return xSwitchRequired; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + void vTaskSetApplicationTaskTag( TaskHandle_t xTask, + TaskHookFunction_t pxHookFunction ) + { + TCB_t * xTCB; + + traceENTER_vTaskSetApplicationTaskTag( xTask, pxHookFunction ); + + /* If xTask is NULL then it is the task hook of the calling task that is + * getting set. */ + if( xTask == NULL ) + { + xTCB = ( TCB_t * ) pxCurrentTCB; + } + else + { + xTCB = xTask; + } + + /* Save the hook function in the TCB. A critical section is required as + * the value can be accessed from an interrupt. */ + taskENTER_CRITICAL(); + { + xTCB->pxTaskTag = pxHookFunction; + } + taskEXIT_CRITICAL(); + + traceRETURN_vTaskSetApplicationTaskTag(); + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) + { + TCB_t * pxTCB; + TaskHookFunction_t xReturn; + + traceENTER_xTaskGetApplicationTaskTag( xTask ); + + /* If xTask is NULL then set the calling task's hook. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + /* Save the hook function in the TCB. A critical section is required as + * the value can be accessed from an interrupt. */ + taskENTER_CRITICAL(); + { + xReturn = pxTCB->pxTaskTag; + } + taskEXIT_CRITICAL(); + + traceRETURN_xTaskGetApplicationTaskTag( xReturn ); + + return xReturn; + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + TaskHookFunction_t xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ) + { + TCB_t * pxTCB; + TaskHookFunction_t xReturn; + UBaseType_t uxSavedInterruptStatus; + + traceENTER_xTaskGetApplicationTaskTagFromISR( xTask ); + + /* If xTask is NULL then set the calling task's hook. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + /* Save the hook function in the TCB. A critical section is required as + * the value can be accessed from an interrupt. */ + uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR(); + { + xReturn = pxTCB->pxTaskTag; + } + taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus ); + + traceRETURN_xTaskGetApplicationTaskTagFromISR( xReturn ); + + return xReturn; + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, + void * pvParameter ) + { + TCB_t * xTCB; + BaseType_t xReturn; + + traceENTER_xTaskCallApplicationTaskHook( xTask, pvParameter ); + + /* If xTask is NULL then we are calling our own task hook. */ + if( xTask == NULL ) + { + xTCB = pxCurrentTCB; + } + else + { + xTCB = xTask; + } + + if( xTCB->pxTaskTag != NULL ) + { + xReturn = xTCB->pxTaskTag( pvParameter ); + } + else + { + xReturn = pdFAIL; + } + + traceRETURN_xTaskCallApplicationTaskHook( xReturn ); + + return xReturn; + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +#if ( configNUMBER_OF_CORES == 1 ) + void vTaskSwitchContext( void ) + { + traceENTER_vTaskSwitchContext(); + + if( uxSchedulerSuspended != ( UBaseType_t ) 0U ) + { + /* The scheduler is currently suspended - do not allow a context + * switch. */ + xYieldPendings[ 0 ] = pdTRUE; + } + else + { + xYieldPendings[ 0 ] = pdFALSE; + traceTASK_SWITCHED_OUT(); + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE + portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalRunTime[ 0 ] ); + #else + ulTotalRunTime[ 0 ] = portGET_RUN_TIME_COUNTER_VALUE(); + #endif + + /* Add the amount of time the task has been running to the + * accumulated time so far. The time the task started running was + * stored in ulTaskSwitchedInTime. Note that there is no overflow + * protection here so count values are only valid until the timer + * overflows. The guard against negative values is to protect + * against suspect run time stat counter implementations - which + * are provided by the application, not the kernel. */ + if( ulTotalRunTime[ 0 ] > ulTaskSwitchedInTime[ 0 ] ) + { + pxCurrentTCB->ulRunTimeCounter += ( ulTotalRunTime[ 0 ] - ulTaskSwitchedInTime[ 0 ] ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + ulTaskSwitchedInTime[ 0 ] = ulTotalRunTime[ 0 ]; + } + #endif /* configGENERATE_RUN_TIME_STATS */ + + /* Check for stack overflow, if configured. */ + taskCHECK_FOR_STACK_OVERFLOW(); + + /* Before the currently running task is switched out, save its errno. */ + #if ( configUSE_POSIX_ERRNO == 1 ) + { + pxCurrentTCB->iTaskErrno = FreeRTOS_errno; + } + #endif + + /* Select a new task to run using either the generic C or port + * optimised asm code. */ + /* MISRA Ref 11.5.3 [Void pointer assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + taskSELECT_HIGHEST_PRIORITY_TASK(); + traceTASK_SWITCHED_IN(); + + /* Macro to inject port specific behaviour immediately after + * switching tasks, such as setting an end of stack watchpoint + * or reconfiguring the MPU. */ + portTASK_SWITCH_HOOK( pxCurrentTCB ); + + /* After the new task is switched in, update the global errno. */ + #if ( configUSE_POSIX_ERRNO == 1 ) + { + FreeRTOS_errno = pxCurrentTCB->iTaskErrno; + } + #endif + + #if ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) + { + /* Switch C-Runtime's TLS Block to point to the TLS + * Block specific to this task. */ + configSET_TLS_BLOCK( pxCurrentTCB->xTLSBlock ); + } + #endif + } + + traceRETURN_vTaskSwitchContext(); + } +#else /* if ( configNUMBER_OF_CORES == 1 ) */ + void vTaskSwitchContext( BaseType_t xCoreID ) + { + traceENTER_vTaskSwitchContext(); + + /* Acquire both locks: + * - The ISR lock protects the ready list from simultaneous access by + * both other ISRs and tasks. + * - We also take the task lock to pause here in case another core has + * suspended the scheduler. We don't want to simply set xYieldPending + * and move on if another core suspended the scheduler. We should only + * do that if the current core has suspended the scheduler. */ + + portGET_TASK_LOCK(); /* Must always acquire the task lock first. */ + portGET_ISR_LOCK(); + { + /* vTaskSwitchContext() must never be called from within a critical section. + * This is not necessarily true for single core FreeRTOS, but it is for this + * SMP port. */ + configASSERT( portGET_CRITICAL_NESTING_COUNT() == 0 ); + + if( uxSchedulerSuspended != ( UBaseType_t ) 0U ) + { + /* The scheduler is currently suspended - do not allow a context + * switch. */ + xYieldPendings[ xCoreID ] = pdTRUE; + } + else + { + xYieldPendings[ xCoreID ] = pdFALSE; + traceTASK_SWITCHED_OUT(); + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE + portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalRunTime[ xCoreID ] ); + #else + ulTotalRunTime[ xCoreID ] = portGET_RUN_TIME_COUNTER_VALUE(); + #endif + + /* Add the amount of time the task has been running to the + * accumulated time so far. The time the task started running was + * stored in ulTaskSwitchedInTime. Note that there is no overflow + * protection here so count values are only valid until the timer + * overflows. The guard against negative values is to protect + * against suspect run time stat counter implementations - which + * are provided by the application, not the kernel. */ + if( ulTotalRunTime[ xCoreID ] > ulTaskSwitchedInTime[ xCoreID ] ) + { + pxCurrentTCBs[ xCoreID ]->ulRunTimeCounter += ( ulTotalRunTime[ xCoreID ] - ulTaskSwitchedInTime[ xCoreID ] ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + ulTaskSwitchedInTime[ xCoreID ] = ulTotalRunTime[ xCoreID ]; + } + #endif /* configGENERATE_RUN_TIME_STATS */ + + /* Check for stack overflow, if configured. */ + taskCHECK_FOR_STACK_OVERFLOW(); + + /* Before the currently running task is switched out, save its errno. */ + #if ( configUSE_POSIX_ERRNO == 1 ) + { + pxCurrentTCBs[ xCoreID ]->iTaskErrno = FreeRTOS_errno; + } + #endif + + /* Select a new task to run. */ + taskSELECT_HIGHEST_PRIORITY_TASK( xCoreID ); + traceTASK_SWITCHED_IN(); + + /* Macro to inject port specific behaviour immediately after + * switching tasks, such as setting an end of stack watchpoint + * or reconfiguring the MPU. */ + portTASK_SWITCH_HOOK( pxCurrentTCBs[ portGET_CORE_ID() ] ); + + /* After the new task is switched in, update the global errno. */ + #if ( configUSE_POSIX_ERRNO == 1 ) + { + FreeRTOS_errno = pxCurrentTCBs[ xCoreID ]->iTaskErrno; + } + #endif + + #if ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) + { + /* Switch C-Runtime's TLS Block to point to the TLS + * Block specific to this task. */ + configSET_TLS_BLOCK( pxCurrentTCBs[ xCoreID ]->xTLSBlock ); + } + #endif + } + } + portRELEASE_ISR_LOCK(); + portRELEASE_TASK_LOCK(); + + traceRETURN_vTaskSwitchContext(); + } +#endif /* if ( configNUMBER_OF_CORES > 1 ) */ +/*-----------------------------------------------------------*/ + +void vTaskPlaceOnEventList( List_t * const pxEventList, + const TickType_t xTicksToWait ) +{ + traceENTER_vTaskPlaceOnEventList( pxEventList, xTicksToWait ); + + configASSERT( pxEventList ); + + /* THIS FUNCTION MUST BE CALLED WITH THE + * SCHEDULER SUSPENDED AND THE QUEUE BEING ACCESSED LOCKED. */ + + /* Place the event list item of the TCB in the appropriate event list. + * This is placed in the list in priority order so the highest priority task + * is the first to be woken by the event. + * + * Note: Lists are sorted in ascending order by ListItem_t.xItemValue. + * Normally, the xItemValue of a TCB's ListItem_t members is: + * xItemValue = ( configMAX_PRIORITIES - uxPriority ) + * Therefore, the event list is sorted in descending priority order. + * + * The queue that contains the event list is locked, preventing + * simultaneous access from interrupts. */ + vListInsert( pxEventList, &( pxCurrentTCB->xEventListItem ) ); + + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); + + traceRETURN_vTaskPlaceOnEventList(); +} +/*-----------------------------------------------------------*/ + +void vTaskPlaceOnUnorderedEventList( List_t * pxEventList, + const TickType_t xItemValue, + const TickType_t xTicksToWait ) +{ + traceENTER_vTaskPlaceOnUnorderedEventList( pxEventList, xItemValue, xTicksToWait ); + + configASSERT( pxEventList ); + + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. It is used by + * the event groups implementation. */ + configASSERT( uxSchedulerSuspended != ( UBaseType_t ) 0U ); + + /* Store the item value in the event list item. It is safe to access the + * event list item here as interrupts won't access the event list item of a + * task that is not in the Blocked state. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ), xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE ); + + /* Place the event list item of the TCB at the end of the appropriate event + * list. It is safe to access the event list here because it is part of an + * event group implementation - and interrupts don't access event groups + * directly (instead they access them indirectly by pending function calls to + * the task level). */ + listINSERT_END( pxEventList, &( pxCurrentTCB->xEventListItem ) ); + + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); + + traceRETURN_vTaskPlaceOnUnorderedEventList(); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TIMERS == 1 ) + + void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, + TickType_t xTicksToWait, + const BaseType_t xWaitIndefinitely ) + { + traceENTER_vTaskPlaceOnEventListRestricted( pxEventList, xTicksToWait, xWaitIndefinitely ); + + configASSERT( pxEventList ); + + /* This function should not be called by application code hence the + * 'Restricted' in its name. It is not part of the public API. It is + * designed for use by kernel code, and has special calling requirements - + * it should be called with the scheduler suspended. */ + + + /* Place the event list item of the TCB in the appropriate event list. + * In this case it is assume that this is the only task that is going to + * be waiting on this event list, so the faster vListInsertEnd() function + * can be used in place of vListInsert. */ + listINSERT_END( pxEventList, &( pxCurrentTCB->xEventListItem ) ); + + /* If the task should block indefinitely then set the block time to a + * value that will be recognised as an indefinite delay inside the + * prvAddCurrentTaskToDelayedList() function. */ + if( xWaitIndefinitely != pdFALSE ) + { + xTicksToWait = portMAX_DELAY; + } + + traceTASK_DELAY_UNTIL( ( xTickCount + xTicksToWait ) ); + prvAddCurrentTaskToDelayedList( xTicksToWait, xWaitIndefinitely ); + + traceRETURN_vTaskPlaceOnEventListRestricted(); + } + +#endif /* configUSE_TIMERS */ +/*-----------------------------------------------------------*/ + +BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList ) +{ + TCB_t * pxUnblockedTCB; + BaseType_t xReturn; + + traceENTER_xTaskRemoveFromEventList( pxEventList ); + + /* THIS FUNCTION MUST BE CALLED FROM A CRITICAL SECTION. It can also be + * called from a critical section within an ISR. */ + + /* The event list is sorted in priority order, so the first in the list can + * be removed as it is known to be the highest priority. Remove the TCB from + * the delayed list, and add it to the ready list. + * + * If an event is for a queue that is locked then this function will never + * get called - the lock count on the queue will get modified instead. This + * means exclusive access to the event list is guaranteed here. + * + * This function assumes that a check has already been made to ensure that + * pxEventList is not empty. */ + /* MISRA Ref 11.5.3 [Void pointer assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + pxUnblockedTCB = listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); + configASSERT( pxUnblockedTCB ); + listREMOVE_ITEM( &( pxUnblockedTCB->xEventListItem ) ); + + if( uxSchedulerSuspended == ( UBaseType_t ) 0U ) + { + listREMOVE_ITEM( &( pxUnblockedTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxUnblockedTCB ); + + #if ( configUSE_TICKLESS_IDLE != 0 ) + { + /* If a task is blocked on a kernel object then xNextTaskUnblockTime + * might be set to the blocked task's time out time. If the task is + * unblocked for a reason other than a timeout xNextTaskUnblockTime is + * normally left unchanged, because it is automatically reset to a new + * value when the tick count equals xNextTaskUnblockTime. However if + * tickless idling is used it might be more important to enter sleep mode + * at the earliest possible time - so reset xNextTaskUnblockTime here to + * ensure it is updated at the earliest possible time. */ + prvResetNextTaskUnblockTime(); + } + #endif + } + else + { + /* The delayed and ready lists cannot be accessed, so hold this task + * pending until the scheduler is resumed. */ + listINSERT_END( &( xPendingReadyList ), &( pxUnblockedTCB->xEventListItem ) ); + } + + #if ( configNUMBER_OF_CORES == 1 ) + { + if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* Return true if the task removed from the event list has a higher + * priority than the calling task. This allows the calling task to know if + * it should force a context switch now. */ + xReturn = pdTRUE; + + /* Mark that a yield is pending in case the user is not using the + * "xHigherPriorityTaskWoken" parameter to an ISR safe FreeRTOS function. */ + xYieldPendings[ 0 ] = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + #else /* #if ( configNUMBER_OF_CORES == 1 ) */ + { + xReturn = pdFALSE; + + #if ( configUSE_PREEMPTION == 1 ) + { + prvYieldForTask( pxUnblockedTCB ); + + if( xYieldPendings[ portGET_CORE_ID() ] != pdFALSE ) + { + xReturn = pdTRUE; + } + } + #endif /* #if ( configUSE_PREEMPTION == 1 ) */ + } + #endif /* #if ( configNUMBER_OF_CORES == 1 ) */ + + traceRETURN_xTaskRemoveFromEventList( xReturn ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, + const TickType_t xItemValue ) +{ + TCB_t * pxUnblockedTCB; + + traceENTER_vTaskRemoveFromUnorderedEventList( pxEventListItem, xItemValue ); + + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. It is used by + * the event flags implementation. */ + configASSERT( uxSchedulerSuspended != ( UBaseType_t ) 0U ); + + /* Store the new item value in the event list. */ + listSET_LIST_ITEM_VALUE( pxEventListItem, xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE ); + + /* Remove the event list form the event flag. Interrupts do not access + * event flags. */ + /* MISRA Ref 11.5.3 [Void pointer assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + pxUnblockedTCB = listGET_LIST_ITEM_OWNER( pxEventListItem ); + configASSERT( pxUnblockedTCB ); + listREMOVE_ITEM( pxEventListItem ); + + #if ( configUSE_TICKLESS_IDLE != 0 ) + { + /* If a task is blocked on a kernel object then xNextTaskUnblockTime + * might be set to the blocked task's time out time. If the task is + * unblocked for a reason other than a timeout xNextTaskUnblockTime is + * normally left unchanged, because it is automatically reset to a new + * value when the tick count equals xNextTaskUnblockTime. However if + * tickless idling is used it might be more important to enter sleep mode + * at the earliest possible time - so reset xNextTaskUnblockTime here to + * ensure it is updated at the earliest possible time. */ + prvResetNextTaskUnblockTime(); + } + #endif + + /* Remove the task from the delayed list and add it to the ready list. The + * scheduler is suspended so interrupts will not be accessing the ready + * lists. */ + listREMOVE_ITEM( &( pxUnblockedTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxUnblockedTCB ); + + #if ( configNUMBER_OF_CORES == 1 ) + { + if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The unblocked task has a priority above that of the calling task, so + * a context switch is required. This function is called with the + * scheduler suspended so xYieldPending is set so the context switch + * occurs immediately that the scheduler is resumed (unsuspended). */ + xYieldPendings[ 0 ] = pdTRUE; + } + } + #else /* #if ( configNUMBER_OF_CORES == 1 ) */ + { + #if ( configUSE_PREEMPTION == 1 ) + { + taskENTER_CRITICAL(); + { + prvYieldForTask( pxUnblockedTCB ); + } + taskEXIT_CRITICAL(); + } + #endif + } + #endif /* #if ( configNUMBER_OF_CORES == 1 ) */ + + traceRETURN_vTaskRemoveFromUnorderedEventList(); +} +/*-----------------------------------------------------------*/ + +void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) +{ + traceENTER_vTaskSetTimeOutState( pxTimeOut ); + + configASSERT( pxTimeOut ); + taskENTER_CRITICAL(); + { + pxTimeOut->xOverflowCount = xNumOfOverflows; + pxTimeOut->xTimeOnEntering = xTickCount; + } + taskEXIT_CRITICAL(); + + traceRETURN_vTaskSetTimeOutState(); +} +/*-----------------------------------------------------------*/ + +void vTaskInternalSetTimeOutState( TimeOut_t * const pxTimeOut ) +{ + traceENTER_vTaskInternalSetTimeOutState( pxTimeOut ); + + /* For internal use only as it does not use a critical section. */ + pxTimeOut->xOverflowCount = xNumOfOverflows; + pxTimeOut->xTimeOnEntering = xTickCount; + + traceRETURN_vTaskInternalSetTimeOutState(); +} +/*-----------------------------------------------------------*/ + +BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, + TickType_t * const pxTicksToWait ) +{ + BaseType_t xReturn; + + traceENTER_xTaskCheckForTimeOut( pxTimeOut, pxTicksToWait ); + + configASSERT( pxTimeOut ); + configASSERT( pxTicksToWait ); + + taskENTER_CRITICAL(); + { + /* Minor optimisation. The tick count cannot change in this block. */ + const TickType_t xConstTickCount = xTickCount; + const TickType_t xElapsedTime = xConstTickCount - pxTimeOut->xTimeOnEntering; + + #if ( INCLUDE_xTaskAbortDelay == 1 ) + if( pxCurrentTCB->ucDelayAborted != ( uint8_t ) pdFALSE ) + { + /* The delay was aborted, which is not the same as a time out, + * but has the same result. */ + pxCurrentTCB->ucDelayAborted = pdFALSE; + xReturn = pdTRUE; + } + else + #endif + + #if ( INCLUDE_vTaskSuspend == 1 ) + if( *pxTicksToWait == portMAX_DELAY ) + { + /* If INCLUDE_vTaskSuspend is set to 1 and the block time + * specified is the maximum block time then the task should block + * indefinitely, and therefore never time out. */ + xReturn = pdFALSE; + } + else + #endif + + if( ( xNumOfOverflows != pxTimeOut->xOverflowCount ) && ( xConstTickCount >= pxTimeOut->xTimeOnEntering ) ) + { + /* The tick count is greater than the time at which + * vTaskSetTimeout() was called, but has also overflowed since + * vTaskSetTimeOut() was called. It must have wrapped all the way + * around and gone past again. This passed since vTaskSetTimeout() + * was called. */ + xReturn = pdTRUE; + *pxTicksToWait = ( TickType_t ) 0; + } + else if( xElapsedTime < *pxTicksToWait ) + { + /* Not a genuine timeout. Adjust parameters for time remaining. */ + *pxTicksToWait -= xElapsedTime; + vTaskInternalSetTimeOutState( pxTimeOut ); + xReturn = pdFALSE; + } + else + { + *pxTicksToWait = ( TickType_t ) 0; + xReturn = pdTRUE; + } + } + taskEXIT_CRITICAL(); + + traceRETURN_xTaskCheckForTimeOut( xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vTaskMissedYield( void ) +{ + traceENTER_vTaskMissedYield(); + + /* Must be called from within a critical section. */ + xYieldPendings[ portGET_CORE_ID() ] = pdTRUE; + + traceRETURN_vTaskMissedYield(); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask ) + { + UBaseType_t uxReturn; + TCB_t const * pxTCB; + + traceENTER_uxTaskGetTaskNumber( xTask ); + + if( xTask != NULL ) + { + pxTCB = xTask; + uxReturn = pxTCB->uxTaskNumber; + } + else + { + uxReturn = 0U; + } + + traceRETURN_uxTaskGetTaskNumber( uxReturn ); + + return uxReturn; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vTaskSetTaskNumber( TaskHandle_t xTask, + const UBaseType_t uxHandle ) + { + TCB_t * pxTCB; + + traceENTER_vTaskSetTaskNumber( xTask, uxHandle ); + + if( xTask != NULL ) + { + pxTCB = xTask; + pxTCB->uxTaskNumber = uxHandle; + } + + traceRETURN_vTaskSetTaskNumber(); + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +/* + * ----------------------------------------------------------- + * The passive idle task. + * ---------------------------------------------------------- + * + * The passive idle task is used for all the additional cores in a SMP + * system. There must be only 1 active idle task and the rest are passive + * idle tasks. + * + * The portTASK_FUNCTION() macro is used to allow port/compiler specific + * language extensions. The equivalent prototype for this function is: + * + * void prvPassiveIdleTask( void *pvParameters ); + */ + +#if ( configNUMBER_OF_CORES > 1 ) + static portTASK_FUNCTION( prvPassiveIdleTask, pvParameters ) + { + ( void ) pvParameters; + + taskYIELD(); + + for( ; configCONTROL_INFINITE_LOOP(); ) + { + #if ( configUSE_PREEMPTION == 0 ) + { + /* If we are not using preemption we keep forcing a task switch to + * see if any other task has become available. If we are using + * preemption we don't need to do this as any task becoming available + * will automatically get the processor anyway. */ + taskYIELD(); + } + #endif /* configUSE_PREEMPTION */ + + #if ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) + { + /* When using preemption tasks of equal priority will be + * timesliced. If a task that is sharing the idle priority is ready + * to run then the idle task should yield before the end of the + * timeslice. + * + * A critical region is not required here as we are just reading from + * the list, and an occasional incorrect value will not matter. If + * the ready list at the idle priority contains one more task than the + * number of idle tasks, which is equal to the configured numbers of cores + * then a task other than the idle task is ready to execute. */ + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) configNUMBER_OF_CORES ) + { + taskYIELD(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) */ + + #if ( configUSE_PASSIVE_IDLE_HOOK == 1 ) + { + /* Call the user defined function from within the idle task. This + * allows the application designer to add background functionality + * without the overhead of a separate task. + * + * This hook is intended to manage core activity such as disabling cores that go idle. + * + * NOTE: vApplicationPassiveIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES, + * CALL A FUNCTION THAT MIGHT BLOCK. */ + vApplicationPassiveIdleHook(); + } + #endif /* configUSE_PASSIVE_IDLE_HOOK */ + } + } +#endif /* #if ( configNUMBER_OF_CORES > 1 ) */ + +/* + * ----------------------------------------------------------- + * The idle task. + * ---------------------------------------------------------- + * + * The portTASK_FUNCTION() macro is used to allow port/compiler specific + * language extensions. The equivalent prototype for this function is: + * + * void prvIdleTask( void *pvParameters ); + * + */ + +static portTASK_FUNCTION( prvIdleTask, pvParameters ) +{ + /* Stop warnings. */ + ( void ) pvParameters; + + /** THIS IS THE RTOS IDLE TASK - WHICH IS CREATED AUTOMATICALLY WHEN THE + * SCHEDULER IS STARTED. **/ + + /* In case a task that has a secure context deletes itself, in which case + * the idle task is responsible for deleting the task's secure context, if + * any. */ + portALLOCATE_SECURE_CONTEXT( configMINIMAL_SECURE_STACK_SIZE ); + + #if ( configNUMBER_OF_CORES > 1 ) + { + /* SMP all cores start up in the idle task. This initial yield gets the application + * tasks started. */ + taskYIELD(); + } + #endif /* #if ( configNUMBER_OF_CORES > 1 ) */ + + for( ; configCONTROL_INFINITE_LOOP(); ) + { + /* See if any tasks have deleted themselves - if so then the idle task + * is responsible for freeing the deleted task's TCB and stack. */ + prvCheckTasksWaitingTermination(); + + #if ( configUSE_PREEMPTION == 0 ) + { + /* If we are not using preemption we keep forcing a task switch to + * see if any other task has become available. If we are using + * preemption we don't need to do this as any task becoming available + * will automatically get the processor anyway. */ + taskYIELD(); + } + #endif /* configUSE_PREEMPTION */ + + #if ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) + { + /* When using preemption tasks of equal priority will be + * timesliced. If a task that is sharing the idle priority is ready + * to run then the idle task should yield before the end of the + * timeslice. + * + * A critical region is not required here as we are just reading from + * the list, and an occasional incorrect value will not matter. If + * the ready list at the idle priority contains one more task than the + * number of idle tasks, which is equal to the configured numbers of cores + * then a task other than the idle task is ready to execute. */ + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) configNUMBER_OF_CORES ) + { + taskYIELD(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) */ + + #if ( configUSE_IDLE_HOOK == 1 ) + { + /* Call the user defined function from within the idle task. */ +#if 1 /* << EST */ + extern void configUSE_IDLE_HOOK_NAME(void); + configUSE_IDLE_HOOK_NAME(); +#else + vApplicationIdleHook(); +#endif + + } + #endif /* configUSE_IDLE_HOOK */ + + /* This conditional compilation should use inequality to 0, not equality + * to 1. This is to ensure portSUPPRESS_TICKS_AND_SLEEP() is called when + * user defined low power mode implementations require + * configUSE_TICKLESS_IDLE to be set to a value other than 1. */ + #if ( configUSE_TICKLESS_IDLE != 0 ) + { + TickType_t xExpectedIdleTime; + + /* It is not desirable to suspend then resume the scheduler on + * each iteration of the idle task. Therefore, a preliminary + * test of the expected idle time is performed without the + * scheduler suspended. The result here is not necessarily + * valid. */ + xExpectedIdleTime = prvGetExpectedIdleTime(); + + if( xExpectedIdleTime >= ( TickType_t ) configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) + { + vTaskSuspendAll(); + { + /* Now the scheduler is suspended, the expected idle + * time can be sampled again, and this time its value can + * be used. */ + configASSERT( xNextTaskUnblockTime >= xTickCount ); + xExpectedIdleTime = prvGetExpectedIdleTime(); + + /* Define the following macro to set xExpectedIdleTime to 0 + * if the application does not want + * portSUPPRESS_TICKS_AND_SLEEP() to be called. */ + configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( xExpectedIdleTime ); + + if( xExpectedIdleTime >= ( TickType_t ) configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) + { + traceLOW_POWER_IDLE_BEGIN(); + portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ); + traceLOW_POWER_IDLE_END(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + ( void ) xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_TICKLESS_IDLE */ + + #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_PASSIVE_IDLE_HOOK == 1 ) ) + { + /* Call the user defined function from within the idle task. This + * allows the application designer to add background functionality + * without the overhead of a separate task. + * + * This hook is intended to manage core activity such as disabling cores that go idle. + * + * NOTE: vApplicationPassiveIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES, + * CALL A FUNCTION THAT MIGHT BLOCK. */ + vApplicationPassiveIdleHook(); + } + #endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_PASSIVE_IDLE_HOOK == 1 ) ) */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE != 0 ) + + eSleepModeStatus eTaskConfirmSleepModeStatus( void ) + { + #if ( INCLUDE_vTaskSuspend == 1 ) + /* The idle task exists in addition to the application tasks. */ + const UBaseType_t uxNonApplicationTasks = configNUMBER_OF_CORES; + #endif /* INCLUDE_vTaskSuspend */ + + eSleepModeStatus eReturn = eStandardSleep; + + traceENTER_eTaskConfirmSleepModeStatus(); + + /* This function must be called from a critical section. */ + + if( listCURRENT_LIST_LENGTH( &xPendingReadyList ) != 0U ) + { + /* A task was made ready while the scheduler was suspended. */ + eReturn = eAbortSleep; + } + else if( xYieldPendings[ portGET_CORE_ID() ] != pdFALSE ) + { + /* A yield was pended while the scheduler was suspended. */ + eReturn = eAbortSleep; + } + else if( xPendedTicks != 0U ) + { + /* A tick interrupt has already occurred but was held pending + * because the scheduler is suspended. */ + eReturn = eAbortSleep; + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + else if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == ( uxCurrentNumberOfTasks - uxNonApplicationTasks ) ) + { + /* If all the tasks are in the suspended list (which might mean they + * have an infinite block time rather than actually being suspended) + * then it is safe to turn all clocks off and just wait for external + * interrupts. */ + eReturn = eNoTasksWaitingTimeout; + } + #endif /* INCLUDE_vTaskSuspend */ + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_eTaskConfirmSleepModeStatus( eReturn ); + + return eReturn; + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + + void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, + BaseType_t xIndex, + void * pvValue ) + { + TCB_t * pxTCB; + + traceENTER_vTaskSetThreadLocalStoragePointer( xTaskToSet, xIndex, pvValue ); + + if( ( xIndex >= 0 ) && + ( xIndex < ( BaseType_t ) configNUM_THREAD_LOCAL_STORAGE_POINTERS ) ) + { + pxTCB = prvGetTCBFromHandle( xTaskToSet ); + configASSERT( pxTCB != NULL ); + pxTCB->pvThreadLocalStoragePointers[ xIndex ] = pvValue; + } + + traceRETURN_vTaskSetThreadLocalStoragePointer(); + } + +#endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS */ +/*-----------------------------------------------------------*/ + +#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + + void * pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, + BaseType_t xIndex ) + { + void * pvReturn = NULL; + TCB_t * pxTCB; + + traceENTER_pvTaskGetThreadLocalStoragePointer( xTaskToQuery, xIndex ); + + if( ( xIndex >= 0 ) && + ( xIndex < ( BaseType_t ) configNUM_THREAD_LOCAL_STORAGE_POINTERS ) ) + { + pxTCB = prvGetTCBFromHandle( xTaskToQuery ); + pvReturn = pxTCB->pvThreadLocalStoragePointers[ xIndex ]; + } + else + { + pvReturn = NULL; + } + + traceRETURN_pvTaskGetThreadLocalStoragePointer( pvReturn ); + + return pvReturn; + } + +#endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS */ +/*-----------------------------------------------------------*/ + +#if ( portUSING_MPU_WRAPPERS == 1 ) + + void vTaskAllocateMPURegions( TaskHandle_t xTaskToModify, + const MemoryRegion_t * const pxRegions ) + { + TCB_t * pxTCB; + + traceENTER_vTaskAllocateMPURegions( xTaskToModify, pxRegions ); + + /* If null is passed in here then we are modifying the MPU settings of + * the calling task. */ + pxTCB = prvGetTCBFromHandle( xTaskToModify ); + + vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), pxRegions, NULL, 0 ); + + traceRETURN_vTaskAllocateMPURegions(); + } + +#endif /* portUSING_MPU_WRAPPERS */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseTaskLists( void ) +{ + UBaseType_t uxPriority; + + for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ ) + { + vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) ); + } + + vListInitialise( &xDelayedTaskList1 ); + vListInitialise( &xDelayedTaskList2 ); + vListInitialise( &xPendingReadyList ); + + #if ( INCLUDE_vTaskDelete == 1 ) + { + vListInitialise( &xTasksWaitingTermination ); + } + #endif /* INCLUDE_vTaskDelete */ + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + vListInitialise( &xSuspendedTaskList ); + } + #endif /* INCLUDE_vTaskSuspend */ + + /* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList + * using list2. */ + pxDelayedTaskList = &xDelayedTaskList1; + pxOverflowDelayedTaskList = &xDelayedTaskList2; +} +/*-----------------------------------------------------------*/ + +static void prvCheckTasksWaitingTermination( void ) +{ + /** THIS FUNCTION IS CALLED FROM THE RTOS IDLE TASK **/ + + #if ( INCLUDE_vTaskDelete == 1 ) + { + TCB_t * pxTCB; + + /* uxDeletedTasksWaitingCleanUp is used to prevent taskENTER_CRITICAL() + * being called too often in the idle task. */ + while( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U ) + { + #if ( configNUMBER_OF_CORES == 1 ) + { + taskENTER_CRITICAL(); + { + { + /* MISRA Ref 11.5.3 [Void pointer assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) ); + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + --uxCurrentNumberOfTasks; + --uxDeletedTasksWaitingCleanUp; + } + } + taskEXIT_CRITICAL(); + + prvDeleteTCB( pxTCB ); + } + #else /* #if( configNUMBER_OF_CORES == 1 ) */ + { + pxTCB = NULL; + + taskENTER_CRITICAL(); + { + /* For SMP, multiple idles can be running simultaneously + * and we need to check that other idles did not cleanup while we were + * waiting to enter the critical section. */ + if( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U ) + { + /* MISRA Ref 11.5.3 [Void pointer assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) ); + + if( pxTCB->xTaskRunState == taskTASK_NOT_RUNNING ) + { + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + --uxCurrentNumberOfTasks; + --uxDeletedTasksWaitingCleanUp; + } + else + { + /* The TCB to be deleted still has not yet been switched out + * by the scheduler, so we will just exit this loop early and + * try again next time. */ + taskEXIT_CRITICAL(); + break; + } + } + } + taskEXIT_CRITICAL(); + + if( pxTCB != NULL ) + { + prvDeleteTCB( pxTCB ); + } + } + #endif /* #if( configNUMBER_OF_CORES == 1 ) */ + } + } + #endif /* INCLUDE_vTaskDelete */ +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vTaskGetInfo( TaskHandle_t xTask, + TaskStatus_t * pxTaskStatus, + BaseType_t xGetFreeStackSpace, + eTaskState eState ) + { + TCB_t * pxTCB; + + traceENTER_vTaskGetInfo( xTask, pxTaskStatus, xGetFreeStackSpace, eState ); + + /* xTask is NULL then get the state of the calling task. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + pxTaskStatus->xHandle = pxTCB; + pxTaskStatus->pcTaskName = ( const char * ) &( pxTCB->pcTaskName[ 0 ] ); + pxTaskStatus->uxCurrentPriority = pxTCB->uxPriority; + pxTaskStatus->pxStackBase = pxTCB->pxStack; + #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) ) + pxTaskStatus->pxTopOfStack = ( StackType_t * ) pxTCB->pxTopOfStack; + pxTaskStatus->pxEndOfStack = pxTCB->pxEndOfStack; + #endif + pxTaskStatus->xTaskNumber = pxTCB->uxTCBNumber; + + #if ( ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 ) ) + { + pxTaskStatus->uxCoreAffinityMask = pxTCB->uxCoreAffinityMask; + } + #endif + + #if ( configUSE_MUTEXES == 1 ) + { + pxTaskStatus->uxBasePriority = pxTCB->uxBasePriority; + } + #else + { + pxTaskStatus->uxBasePriority = 0; + } + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + pxTaskStatus->ulRunTimeCounter = pxTCB->ulRunTimeCounter; + } + #else + { + pxTaskStatus->ulRunTimeCounter = ( configRUN_TIME_COUNTER_TYPE ) 0; + } + #endif + + /* Obtaining the task state is a little fiddly, so is only done if the + * value of eState passed into this function is eInvalid - otherwise the + * state is just set to whatever is passed in. */ + if( eState != eInvalid ) + { + if( taskTASK_IS_RUNNING( pxTCB ) == pdTRUE ) + { + pxTaskStatus->eCurrentState = eRunning; + } + else + { + pxTaskStatus->eCurrentState = eState; + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + /* If the task is in the suspended list then there is a + * chance it is actually just blocked indefinitely - so really + * it should be reported as being in the Blocked state. */ + if( eState == eSuspended ) + { + vTaskSuspendAll(); + { + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + pxTaskStatus->eCurrentState = eBlocked; + } + else + { + BaseType_t x; + + /* The task does not appear on the event list item of + * and of the RTOS objects, but could still be in the + * blocked state if it is waiting on its notification + * rather than waiting on an object. If not, is + * suspended. */ + for( x = ( BaseType_t ) 0; x < ( BaseType_t ) configTASK_NOTIFICATION_ARRAY_ENTRIES; x++ ) + { + if( pxTCB->ucNotifyState[ x ] == taskWAITING_NOTIFICATION ) + { + pxTaskStatus->eCurrentState = eBlocked; + break; + } + } + } + } + ( void ) xTaskResumeAll(); + } + } + #endif /* INCLUDE_vTaskSuspend */ + + /* Tasks can be in pending ready list and other state list at the + * same time. These tasks are in ready state no matter what state + * list the task is in. */ + taskENTER_CRITICAL(); + { + if( listIS_CONTAINED_WITHIN( &xPendingReadyList, &( pxTCB->xEventListItem ) ) != pdFALSE ) + { + pxTaskStatus->eCurrentState = eReady; + } + } + taskEXIT_CRITICAL(); + } + } + else + { + pxTaskStatus->eCurrentState = eTaskGetState( pxTCB ); + } + + /* Obtaining the stack space takes some time, so the xGetFreeStackSpace + * parameter is provided to allow it to be skipped. */ + if( xGetFreeStackSpace != pdFALSE ) + { + #if ( portSTACK_GROWTH > 0 ) + { + pxTaskStatus->usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxTCB->pxEndOfStack ); + } + #else + { + pxTaskStatus->usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxTCB->pxStack ); + } + #endif + } + else + { + pxTaskStatus->usStackHighWaterMark = 0; + } + + traceRETURN_vTaskGetInfo(); + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + static UBaseType_t prvListTasksWithinSingleList( TaskStatus_t * pxTaskStatusArray, + List_t * pxList, + eTaskState eState ) + { + configLIST_VOLATILE TCB_t * pxNextTCB; + configLIST_VOLATILE TCB_t * pxFirstTCB; + UBaseType_t uxTask = 0; + + if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) + { + /* MISRA Ref 11.5.3 [Void pointer assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); + + /* Populate an TaskStatus_t structure within the + * pxTaskStatusArray array for each task that is referenced from + * pxList. See the definition of TaskStatus_t in task.h for the + * meaning of each TaskStatus_t structure member. */ + do + { + /* MISRA Ref 11.5.3 [Void pointer assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); + vTaskGetInfo( ( TaskHandle_t ) pxNextTCB, &( pxTaskStatusArray[ uxTask ] ), pdTRUE, eState ); + uxTask++; + } while( pxNextTCB != pxFirstTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return uxTask; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) + + static configSTACK_DEPTH_TYPE prvTaskCheckFreeStackSpace( const uint8_t * pucStackByte ) + { + uint32_t ulCount = 0U; + + while( *pucStackByte == ( uint8_t ) tskSTACK_FILL_BYTE ) + { + pucStackByte -= portSTACK_GROWTH; + ulCount++; + } + + ulCount /= ( uint32_t ) sizeof( StackType_t ); + + return ( configSTACK_DEPTH_TYPE ) ulCount; + } + +#endif /* ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) + +/* uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the + * same except for their return type. Using configSTACK_DEPTH_TYPE allows the + * user to determine the return type. It gets around the problem of the value + * overflowing on 8-bit types without breaking backward compatibility for + * applications that expect an 8-bit return type. */ + configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) + { + TCB_t * pxTCB; + uint8_t * pucEndOfStack; + configSTACK_DEPTH_TYPE uxReturn; + + traceENTER_uxTaskGetStackHighWaterMark2( xTask ); + + /* uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are + * the same except for their return type. Using configSTACK_DEPTH_TYPE + * allows the user to determine the return type. It gets around the + * problem of the value overflowing on 8-bit types without breaking + * backward compatibility for applications that expect an 8-bit return + * type. */ + + pxTCB = prvGetTCBFromHandle( xTask ); + + #if portSTACK_GROWTH < 0 + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxStack; + } + #else + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxEndOfStack; + } + #endif + + uxReturn = prvTaskCheckFreeStackSpace( pucEndOfStack ); + + traceRETURN_uxTaskGetStackHighWaterMark2( uxReturn ); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskGetStackHighWaterMark2 */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) + + UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) + { + TCB_t * pxTCB; + uint8_t * pucEndOfStack; + UBaseType_t uxReturn; + + traceENTER_uxTaskGetStackHighWaterMark( xTask ); + + pxTCB = prvGetTCBFromHandle( xTask ); + + #if portSTACK_GROWTH < 0 + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxStack; + } + #else + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxEndOfStack; + } + #endif + + uxReturn = ( UBaseType_t ) prvTaskCheckFreeStackSpace( pucEndOfStack ); + + traceRETURN_uxTaskGetStackHighWaterMark( uxReturn ); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskGetStackHighWaterMark */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelete == 1 ) + + static void prvDeleteTCB( TCB_t * pxTCB ) + { + /* This call is required specifically for the TriCore port. It must be + * above the vPortFree() calls. The call is also used by ports/demos that + * want to allocate and clean RAM statically. */ + portCLEAN_UP_TCB( pxTCB ); + + #if ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) + { + /* Free up the memory allocated for the task's TLS Block. */ + configDEINIT_TLS_BLOCK( pxTCB->xTLSBlock ); + } + #endif + + #if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( portUSING_MPU_WRAPPERS == 0 ) ) + { + /* The task can only have been allocated dynamically - free both + * the stack and TCB. */ + vPortFreeStack( pxTCB->pxStack ); + vPortFree( pxTCB ); + } + #elif ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + { + /* The task could have been allocated statically or dynamically, so + * check what was statically allocated before trying to free the + * memory. */ + if( pxTCB->ucStaticallyAllocated == tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB ) + { + /* Both the stack and TCB were allocated dynamically, so both + * must be freed. */ + vPortFreeStack( pxTCB->pxStack ); + vPortFree( pxTCB ); + } + else if( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_ONLY ) + { + /* Only the stack was statically allocated, so the TCB is the + * only memory that must be freed. */ + vPortFree( pxTCB ); + } + else + { + /* Neither the stack nor the TCB were allocated dynamically, so + * nothing needs to be freed. */ + configASSERT( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_AND_TCB ); + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + } + +#endif /* INCLUDE_vTaskDelete */ +/*-----------------------------------------------------------*/ + +static void prvResetNextTaskUnblockTime( void ) +{ + if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) + { + /* The new current delayed list is empty. Set xNextTaskUnblockTime to + * the maximum possible value so it is extremely unlikely that the + * if( xTickCount >= xNextTaskUnblockTime ) test will pass until + * there is an item in the delayed list. */ + xNextTaskUnblockTime = portMAX_DELAY; + } + else + { + /* The new current delayed list is not empty, get the value of + * the item at the head of the delayed list. This is the time at + * which the task at the head of the delayed list should be removed + * from the Blocked state. */ + xNextTaskUnblockTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxDelayedTaskList ); + } +} +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) || ( configNUMBER_OF_CORES > 1 ) + + #if ( configNUMBER_OF_CORES == 1 ) + TaskHandle_t xTaskGetCurrentTaskHandle( void ) + { + TaskHandle_t xReturn; + + traceENTER_xTaskGetCurrentTaskHandle(); + + /* A critical section is not required as this is not called from + * an interrupt and the current TCB will always be the same for any + * individual execution thread. */ + xReturn = pxCurrentTCB; + + traceRETURN_xTaskGetCurrentTaskHandle( xReturn ); + + return xReturn; + } + #else /* #if ( configNUMBER_OF_CORES == 1 ) */ + TaskHandle_t xTaskGetCurrentTaskHandle( void ) + { + TaskHandle_t xReturn; + UBaseType_t uxSavedInterruptStatus; + + traceENTER_xTaskGetCurrentTaskHandle(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK(); + { + xReturn = pxCurrentTCBs[ portGET_CORE_ID() ]; + } + portCLEAR_INTERRUPT_MASK( uxSavedInterruptStatus ); + + traceRETURN_xTaskGetCurrentTaskHandle( xReturn ); + + return xReturn; + } + + TaskHandle_t xTaskGetCurrentTaskHandleForCore( BaseType_t xCoreID ) + { + TaskHandle_t xReturn = NULL; + + traceENTER_xTaskGetCurrentTaskHandleForCore( xCoreID ); + + if( taskVALID_CORE_ID( xCoreID ) != pdFALSE ) + { + xReturn = pxCurrentTCBs[ xCoreID ]; + } + + traceRETURN_xTaskGetCurrentTaskHandleForCore( xReturn ); + + return xReturn; + } + #endif /* #if ( configNUMBER_OF_CORES == 1 ) */ + +#endif /* ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + + BaseType_t xTaskGetSchedulerState( void ) + { + BaseType_t xReturn; + + traceENTER_xTaskGetSchedulerState(); + + if( xSchedulerRunning == pdFALSE ) + { + xReturn = taskSCHEDULER_NOT_STARTED; + } + else + { + #if ( configNUMBER_OF_CORES > 1 ) + taskENTER_CRITICAL(); + #endif + { + if( uxSchedulerSuspended == ( UBaseType_t ) 0U ) + { + xReturn = taskSCHEDULER_RUNNING; + } + else + { + xReturn = taskSCHEDULER_SUSPENDED; + } + } + #if ( configNUMBER_OF_CORES > 1 ) + taskEXIT_CRITICAL(); + #endif + } + + traceRETURN_xTaskGetSchedulerState( xReturn ); + + return xReturn; + } + +#endif /* ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + BaseType_t xTaskPriorityInherit( TaskHandle_t const pxMutexHolder ) + { + TCB_t * const pxMutexHolderTCB = pxMutexHolder; + BaseType_t xReturn = pdFALSE; + + traceENTER_xTaskPriorityInherit( pxMutexHolder ); + + /* If the mutex is taken by an interrupt, the mutex holder is NULL. Priority + * inheritance is not applied in this scenario. */ + if( pxMutexHolder != NULL ) + { + /* If the holder of the mutex has a priority below the priority of + * the task attempting to obtain the mutex then it will temporarily + * inherit the priority of the task attempting to obtain the mutex. */ + if( pxMutexHolderTCB->uxPriority < pxCurrentTCB->uxPriority ) + { + /* Adjust the mutex holder state to account for its new + * priority. Only reset the event list item value if the value is + * not being used for anything else. */ + if( ( listGET_LIST_ITEM_VALUE( &( pxMutexHolderTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == ( ( TickType_t ) 0UL ) ) + { + listSET_LIST_ITEM_VALUE( &( pxMutexHolderTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* If the task being modified is in the ready state it will need + * to be moved into a new list. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxMutexHolderTCB->uxPriority ] ), &( pxMutexHolderTCB->xStateListItem ) ) != pdFALSE ) + { + if( uxListRemove( &( pxMutexHolderTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* It is known that the task is in its ready list so + * there is no need to check again and the port level + * reset macro can be called directly. */ + portRESET_READY_PRIORITY( pxMutexHolderTCB->uxPriority, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Inherit the priority before being moved into the new list. */ + pxMutexHolderTCB->uxPriority = pxCurrentTCB->uxPriority; + prvAddTaskToReadyList( pxMutexHolderTCB ); + #if ( configNUMBER_OF_CORES > 1 ) + { + /* The priority of the task is raised. Yield for this task + * if it is not running. */ + if( taskTASK_IS_RUNNING( pxMutexHolderTCB ) != pdTRUE ) + { + prvYieldForTask( pxMutexHolderTCB ); + } + } + #endif /* if ( configNUMBER_OF_CORES > 1 ) */ + } + else + { + /* Just inherit the priority. */ + pxMutexHolderTCB->uxPriority = pxCurrentTCB->uxPriority; + } + + traceTASK_PRIORITY_INHERIT( pxMutexHolderTCB, pxCurrentTCB->uxPriority ); + + /* Inheritance occurred. */ + xReturn = pdTRUE; + } + else + { + if( pxMutexHolderTCB->uxBasePriority < pxCurrentTCB->uxPriority ) + { + /* The base priority of the mutex holder is lower than the + * priority of the task attempting to take the mutex, but the + * current priority of the mutex holder is not lower than the + * priority of the task attempting to take the mutex. + * Therefore the mutex holder must have already inherited a + * priority, but inheritance would have occurred if that had + * not been the case. */ + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_xTaskPriorityInherit( xReturn ); + + return xReturn; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder ) + { + TCB_t * const pxTCB = pxMutexHolder; + BaseType_t xReturn = pdFALSE; + + traceENTER_xTaskPriorityDisinherit( pxMutexHolder ); + + if( pxMutexHolder != NULL ) + { + /* A task can only have an inherited priority if it holds the mutex. + * If the mutex is held by a task then it cannot be given from an + * interrupt, and if a mutex is given by the holding task then it must + * be the running state task. */ + configASSERT( pxTCB == pxCurrentTCB ); + configASSERT( pxTCB->uxMutexesHeld ); + ( pxTCB->uxMutexesHeld )--; + + /* Has the holder of the mutex inherited the priority of another + * task? */ + if( pxTCB->uxPriority != pxTCB->uxBasePriority ) + { + /* Only disinherit if no other mutexes are held. */ + if( pxTCB->uxMutexesHeld == ( UBaseType_t ) 0 ) + { + /* A task can only have an inherited priority if it holds + * the mutex. If the mutex is held by a task then it cannot be + * given from an interrupt, and if a mutex is given by the + * holding task then it must be the running state task. Remove + * the holding task from the ready list. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + portRESET_READY_PRIORITY( pxTCB->uxPriority, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Disinherit the priority before adding the task into the + * new ready list. */ + traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority ); + pxTCB->uxPriority = pxTCB->uxBasePriority; + + /* Reset the event list item value. It cannot be in use for + * any other purpose if this task is running, and it must be + * running to give back the mutex. */ + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxTCB->uxPriority ); + prvAddTaskToReadyList( pxTCB ); + #if ( configNUMBER_OF_CORES > 1 ) + { + /* The priority of the task is dropped. Yield the core on + * which the task is running. */ + if( taskTASK_IS_RUNNING( pxTCB ) == pdTRUE ) + { + prvYieldCore( pxTCB->xTaskRunState ); + } + } + #endif /* if ( configNUMBER_OF_CORES > 1 ) */ + + /* Return true to indicate that a context switch is required. + * This is only actually required in the corner case whereby + * multiple mutexes were held and the mutexes were given back + * in an order different to that in which they were taken. + * If a context switch did not occur when the first mutex was + * returned, even if a task was waiting on it, then a context + * switch should occur when the last mutex is returned whether + * a task is waiting on it or not. */ + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_xTaskPriorityDisinherit( xReturn ); + + return xReturn; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, + UBaseType_t uxHighestPriorityWaitingTask ) + { + TCB_t * const pxTCB = pxMutexHolder; + UBaseType_t uxPriorityUsedOnEntry, uxPriorityToUse; + const UBaseType_t uxOnlyOneMutexHeld = ( UBaseType_t ) 1; + + traceENTER_vTaskPriorityDisinheritAfterTimeout( pxMutexHolder, uxHighestPriorityWaitingTask ); + + if( pxMutexHolder != NULL ) + { + /* If pxMutexHolder is not NULL then the holder must hold at least + * one mutex. */ + configASSERT( pxTCB->uxMutexesHeld ); + + /* Determine the priority to which the priority of the task that + * holds the mutex should be set. This will be the greater of the + * holding task's base priority and the priority of the highest + * priority task that is waiting to obtain the mutex. */ + if( pxTCB->uxBasePriority < uxHighestPriorityWaitingTask ) + { + uxPriorityToUse = uxHighestPriorityWaitingTask; + } + else + { + uxPriorityToUse = pxTCB->uxBasePriority; + } + + /* Does the priority need to change? */ + if( pxTCB->uxPriority != uxPriorityToUse ) + { + /* Only disinherit if no other mutexes are held. This is a + * simplification in the priority inheritance implementation. If + * the task that holds the mutex is also holding other mutexes then + * the other mutexes may have caused the priority inheritance. */ + if( pxTCB->uxMutexesHeld == uxOnlyOneMutexHeld ) + { + /* If a task has timed out because it already holds the + * mutex it was trying to obtain then it cannot of inherited + * its own priority. */ + configASSERT( pxTCB != pxCurrentTCB ); + + /* Disinherit the priority, remembering the previous + * priority to facilitate determining the subject task's + * state. */ + traceTASK_PRIORITY_DISINHERIT( pxTCB, uxPriorityToUse ); + uxPriorityUsedOnEntry = pxTCB->uxPriority; + pxTCB->uxPriority = uxPriorityToUse; + + /* Only reset the event list item value if the value is not + * being used for anything else. */ + if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == ( ( TickType_t ) 0UL ) ) + { + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriorityToUse ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* If the running task is not the task that holds the mutex + * then the task that holds the mutex could be in either the + * Ready, Blocked or Suspended states. Only remove the task + * from its current state list if it is in the Ready state as + * the task's priority is going to change and there is one + * Ready list per priority. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE ) + { + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* It is known that the task is in its ready list so + * there is no need to check again and the port level + * reset macro can be called directly. */ + portRESET_READY_PRIORITY( pxTCB->uxPriority, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + prvAddTaskToReadyList( pxTCB ); + #if ( configNUMBER_OF_CORES > 1 ) + { + /* The priority of the task is dropped. Yield the core on + * which the task is running. */ + if( taskTASK_IS_RUNNING( pxTCB ) == pdTRUE ) + { + prvYieldCore( pxTCB->xTaskRunState ); + } + } + #endif /* if ( configNUMBER_OF_CORES > 1 ) */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_vTaskPriorityDisinheritAfterTimeout(); + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( configNUMBER_OF_CORES > 1 ) + +/* If not in a critical section then yield immediately. + * Otherwise set xYieldPendings to true to wait to + * yield until exiting the critical section. + */ + void vTaskYieldWithinAPI( void ) + { + traceENTER_vTaskYieldWithinAPI(); + + if( portGET_CRITICAL_NESTING_COUNT() == 0U ) + { + portYIELD(); + } + else + { + xYieldPendings[ portGET_CORE_ID() ] = pdTRUE; + } + + traceRETURN_vTaskYieldWithinAPI(); + } +#endif /* #if ( configNUMBER_OF_CORES > 1 ) */ + +/*-----------------------------------------------------------*/ + +#if ( ( portCRITICAL_NESTING_IN_TCB == 1 ) && ( configNUMBER_OF_CORES == 1 ) ) + + void vTaskEnterCritical( void ) + { + traceENTER_vTaskEnterCritical(); + + portDISABLE_INTERRUPTS(); + + if( xSchedulerRunning != pdFALSE ) + { + ( pxCurrentTCB->uxCriticalNesting )++; + + /* This is not the interrupt safe version of the enter critical + * function so assert() if it is being called from an interrupt + * context. Only API functions that end in "FromISR" can be used in an + * interrupt. Only assert if the critical nesting count is 1 to + * protect against recursive calls if the assert function also uses a + * critical section. */ + if( pxCurrentTCB->uxCriticalNesting == 1U ) + { + portASSERT_IF_IN_ISR(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_vTaskEnterCritical(); + } + +#endif /* #if ( ( portCRITICAL_NESTING_IN_TCB == 1 ) && ( configNUMBER_OF_CORES == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( configNUMBER_OF_CORES > 1 ) + + void vTaskEnterCritical( void ) + { + traceENTER_vTaskEnterCritical(); + + portDISABLE_INTERRUPTS(); + + if( xSchedulerRunning != pdFALSE ) + { + if( portGET_CRITICAL_NESTING_COUNT() == 0U ) + { + portGET_TASK_LOCK(); + portGET_ISR_LOCK(); + } + + portINCREMENT_CRITICAL_NESTING_COUNT(); + + /* This is not the interrupt safe version of the enter critical + * function so assert() if it is being called from an interrupt + * context. Only API functions that end in "FromISR" can be used in an + * interrupt. Only assert if the critical nesting count is 1 to + * protect against recursive calls if the assert function also uses a + * critical section. */ + if( portGET_CRITICAL_NESTING_COUNT() == 1U ) + { + portASSERT_IF_IN_ISR(); + + if( uxSchedulerSuspended == 0U ) + { + /* The only time there would be a problem is if this is called + * before a context switch and vTaskExitCritical() is called + * after pxCurrentTCB changes. Therefore this should not be + * used within vTaskSwitchContext(). */ + prvCheckForRunStateChange(); + } + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_vTaskEnterCritical(); + } + +#endif /* #if ( configNUMBER_OF_CORES > 1 ) */ + +/*-----------------------------------------------------------*/ + +#if ( configNUMBER_OF_CORES > 1 ) + + UBaseType_t vTaskEnterCriticalFromISR( void ) + { + UBaseType_t uxSavedInterruptStatus = 0; + + traceENTER_vTaskEnterCriticalFromISR(); + + if( xSchedulerRunning != pdFALSE ) + { + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + + if( portGET_CRITICAL_NESTING_COUNT() == 0U ) + { + portGET_ISR_LOCK(); + } + + portINCREMENT_CRITICAL_NESTING_COUNT(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_vTaskEnterCriticalFromISR( uxSavedInterruptStatus ); + + return uxSavedInterruptStatus; + } + +#endif /* #if ( configNUMBER_OF_CORES > 1 ) */ +/*-----------------------------------------------------------*/ + +#if ( ( portCRITICAL_NESTING_IN_TCB == 1 ) && ( configNUMBER_OF_CORES == 1 ) ) + + void vTaskExitCritical( void ) + { + traceENTER_vTaskExitCritical(); + + if( xSchedulerRunning != pdFALSE ) + { + /* If pxCurrentTCB->uxCriticalNesting is zero then this function + * does not match a previous call to vTaskEnterCritical(). */ + configASSERT( pxCurrentTCB->uxCriticalNesting > 0U ); + + /* This function should not be called in ISR. Use vTaskExitCriticalFromISR + * to exit critical section from ISR. */ + portASSERT_IF_IN_ISR(); + + if( pxCurrentTCB->uxCriticalNesting > 0U ) + { + ( pxCurrentTCB->uxCriticalNesting )--; + + if( pxCurrentTCB->uxCriticalNesting == 0U ) + { + portENABLE_INTERRUPTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_vTaskExitCritical(); + } + +#endif /* #if ( ( portCRITICAL_NESTING_IN_TCB == 1 ) && ( configNUMBER_OF_CORES == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( configNUMBER_OF_CORES > 1 ) + + void vTaskExitCritical( void ) + { + traceENTER_vTaskExitCritical(); + + if( xSchedulerRunning != pdFALSE ) + { + /* If critical nesting count is zero then this function + * does not match a previous call to vTaskEnterCritical(). */ + configASSERT( portGET_CRITICAL_NESTING_COUNT() > 0U ); + + /* This function should not be called in ISR. Use vTaskExitCriticalFromISR + * to exit critical section from ISR. */ + portASSERT_IF_IN_ISR(); + + if( portGET_CRITICAL_NESTING_COUNT() > 0U ) + { + portDECREMENT_CRITICAL_NESTING_COUNT(); + + if( portGET_CRITICAL_NESTING_COUNT() == 0U ) + { + BaseType_t xYieldCurrentTask; + + /* Get the xYieldPending stats inside the critical section. */ + xYieldCurrentTask = xYieldPendings[ portGET_CORE_ID() ]; + + portRELEASE_ISR_LOCK(); + portRELEASE_TASK_LOCK(); + portENABLE_INTERRUPTS(); + + /* When a task yields in a critical section it just sets + * xYieldPending to true. So now that we have exited the + * critical section check if xYieldPending is true, and + * if so yield. */ + if( xYieldCurrentTask != pdFALSE ) + { + portYIELD(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_vTaskExitCritical(); + } + +#endif /* #if ( configNUMBER_OF_CORES > 1 ) */ +/*-----------------------------------------------------------*/ + +#if ( configNUMBER_OF_CORES > 1 ) + + void vTaskExitCriticalFromISR( UBaseType_t uxSavedInterruptStatus ) + { + traceENTER_vTaskExitCriticalFromISR( uxSavedInterruptStatus ); + + if( xSchedulerRunning != pdFALSE ) + { + /* If critical nesting count is zero then this function + * does not match a previous call to vTaskEnterCritical(). */ + configASSERT( portGET_CRITICAL_NESTING_COUNT() > 0U ); + + if( portGET_CRITICAL_NESTING_COUNT() > 0U ) + { + portDECREMENT_CRITICAL_NESTING_COUNT(); + + if( portGET_CRITICAL_NESTING_COUNT() == 0U ) + { + portRELEASE_ISR_LOCK(); + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_vTaskExitCriticalFromISR(); + } + +#endif /* #if ( configNUMBER_OF_CORES > 1 ) */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) + + static char * prvWriteNameToBuffer( char * pcBuffer, + const char * pcTaskName ) + { + size_t x; + + /* Start by copying the entire string. */ + ( void ) strcpy( pcBuffer, pcTaskName ); + + /* Pad the end of the string with spaces to ensure columns line up when + * printed out. */ + for( x = strlen( pcBuffer ); x < ( size_t ) ( ( size_t ) configMAX_TASK_NAME_LEN - 1U ); x++ ) + { + pcBuffer[ x ] = ' '; + } + + /* Terminate. */ + pcBuffer[ x ] = ( char ) 0x00; + + /* Return the new end of string. */ + return &( pcBuffer[ x ] ); + } + +#endif /* ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + + void vTaskListTasks( char * pcWriteBuffer, + size_t uxBufferLength ) + { + TaskStatus_t * pxTaskStatusArray; + size_t uxConsumedBufferLength = 0; + size_t uxCharsWrittenBySnprintf; + int iSnprintfReturnValue; + BaseType_t xOutputBufferFull = pdFALSE; + UBaseType_t uxArraySize, x; + char cStatus; + + traceENTER_vTaskListTasks( pcWriteBuffer, uxBufferLength ); + + /* + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many + * of the demo applications. Do not consider it to be part of the + * scheduler. + * + * vTaskListTasks() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that + * displays task: names, states, priority, stack usage and task number. + * Stack usage specified as the number of unused StackType_t words stack can hold + * on top of stack - not the number of bytes. + * + * vTaskListTasks() has a dependency on the snprintf() C library function that + * might bloat the code size, use a lot of stack, and provide different + * results on different platforms. An alternative, tiny, third party, + * and limited functionality implementation of snprintf() is provided in + * many of the FreeRTOS/Demo sub-directories in a file called + * printf-stdarg.c (note printf-stdarg.c does not provide a full + * snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly + * through a call to vTaskListTasks(). + */ + + + /* Make sure the write buffer does not contain a string. */ + *pcWriteBuffer = ( char ) 0x00; + + /* Take a snapshot of the number of tasks in case it changes while this + * function is executing. */ + uxArraySize = uxCurrentNumberOfTasks; + + /* Allocate an array index for each task. NOTE! if + * configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will + * equate to NULL. */ + /* MISRA Ref 11.5.1 [Malloc memory assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); + + if( pxTaskStatusArray != NULL ) + { + /* Generate the (binary) data. */ + uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, NULL ); + + /* Create a human readable table from the binary data. */ + for( x = 0; x < uxArraySize; x++ ) + { + switch( pxTaskStatusArray[ x ].eCurrentState ) + { + case eRunning: + cStatus = tskRUNNING_CHAR; + break; + + case eReady: + cStatus = tskREADY_CHAR; + break; + + case eBlocked: + cStatus = tskBLOCKED_CHAR; + break; + + case eSuspended: + cStatus = tskSUSPENDED_CHAR; + break; + + case eDeleted: + cStatus = tskDELETED_CHAR; + break; + + case eInvalid: /* Fall through. */ + default: /* Should not get here, but it is included + * to prevent static checking errors. */ + cStatus = ( char ) 0x00; + break; + } + + /* Is there enough space in the buffer to hold task name? */ + if( ( uxConsumedBufferLength + configMAX_TASK_NAME_LEN ) <= uxBufferLength ) + { + /* Write the task name to the string, padding with spaces so it + * can be printed in tabular form more easily. */ + pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName ); + /* Do not count the terminating null character. */ + uxConsumedBufferLength = uxConsumedBufferLength + ( configMAX_TASK_NAME_LEN - 1U ); + + /* Is there space left in the buffer? -1 is done because snprintf + * writes a terminating null character. So we are essentially + * checking if the buffer has space to write at least one non-null + * character. */ + if( uxConsumedBufferLength < ( uxBufferLength - 1U ) ) + { + /* Write the rest of the string. */ + #if ( ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 ) ) + /* MISRA Ref 21.6.1 [snprintf for utility] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-216 */ + /* coverity[misra_c_2012_rule_21_6_violation] */ + iSnprintfReturnValue = snprintf( pcWriteBuffer, + uxBufferLength - uxConsumedBufferLength, + "\t%c\t%u\t%u\t%u\t0x%x\r\n", + cStatus, + ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, + ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, + ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber, + ( unsigned int ) pxTaskStatusArray[ x ].uxCoreAffinityMask ); + #else /* ( ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 ) ) */ + /* MISRA Ref 21.6.1 [snprintf for utility] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-216 */ + /* coverity[misra_c_2012_rule_21_6_violation] */ + iSnprintfReturnValue = snprintf( pcWriteBuffer, + uxBufferLength - uxConsumedBufferLength, + "\t%c\t%u\t%u\t%u\r\n", + cStatus, + ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, + ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, + ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber ); + #endif /* ( ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 ) ) */ + uxCharsWrittenBySnprintf = prvSnprintfReturnValueToCharsWritten( iSnprintfReturnValue, uxBufferLength - uxConsumedBufferLength ); + + uxConsumedBufferLength += uxCharsWrittenBySnprintf; + pcWriteBuffer += uxCharsWrittenBySnprintf; + } + else + { + xOutputBufferFull = pdTRUE; + } + } + else + { + xOutputBufferFull = pdTRUE; + } + + if( xOutputBufferFull == pdTRUE ) + { + break; + } + } + + /* Free the array again. NOTE! If configSUPPORT_DYNAMIC_ALLOCATION + * is 0 then vPortFree() will be #defined to nothing. */ + vPortFree( pxTaskStatusArray ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_vTaskListTasks(); + } + +#endif /* ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) */ +/*----------------------------------------------------------*/ + +#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configUSE_TRACE_FACILITY == 1 ) ) + + void vTaskGetRunTimeStatistics( char * pcWriteBuffer, + size_t uxBufferLength ) + { + TaskStatus_t * pxTaskStatusArray; + size_t uxConsumedBufferLength = 0; + size_t uxCharsWrittenBySnprintf; + int iSnprintfReturnValue; + BaseType_t xOutputBufferFull = pdFALSE; + UBaseType_t uxArraySize, x; + configRUN_TIME_COUNTER_TYPE ulTotalTime = 0; + configRUN_TIME_COUNTER_TYPE ulStatsAsPercentage; + + traceENTER_vTaskGetRunTimeStatistics( pcWriteBuffer, uxBufferLength ); + + /* + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many + * of the demo applications. Do not consider it to be part of the + * scheduler. + * + * vTaskGetRunTimeStatistics() calls uxTaskGetSystemState(), then formats part + * of the uxTaskGetSystemState() output into a human readable table that + * displays the amount of time each task has spent in the Running state + * in both absolute and percentage terms. + * + * vTaskGetRunTimeStatistics() has a dependency on the snprintf() C library + * function that might bloat the code size, use a lot of stack, and + * provide different results on different platforms. An alternative, + * tiny, third party, and limited functionality implementation of + * snprintf() is provided in many of the FreeRTOS/Demo sub-directories in + * a file called printf-stdarg.c (note printf-stdarg.c does not provide + * a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly + * through a call to vTaskGetRunTimeStatistics(). + */ + + /* Make sure the write buffer does not contain a string. */ + *pcWriteBuffer = ( char ) 0x00; + + /* Take a snapshot of the number of tasks in case it changes while this + * function is executing. */ + uxArraySize = uxCurrentNumberOfTasks; + + /* Allocate an array index for each task. NOTE! If + * configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will + * equate to NULL. */ + /* MISRA Ref 11.5.1 [Malloc memory assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); + + if( pxTaskStatusArray != NULL ) + { + /* Generate the (binary) data. */ + uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalTime ); + + /* For percentage calculations. */ + ulTotalTime /= ( ( configRUN_TIME_COUNTER_TYPE ) 100UL ); + + /* Avoid divide by zero errors. */ + if( ulTotalTime > 0UL ) + { + /* Create a human readable table from the binary data. */ + for( x = 0; x < uxArraySize; x++ ) + { + /* What percentage of the total run time has the task used? + * This will always be rounded down to the nearest integer. + * ulTotalRunTime has already been divided by 100. */ + ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalTime; + + /* Is there enough space in the buffer to hold task name? */ + if( ( uxConsumedBufferLength + configMAX_TASK_NAME_LEN ) <= uxBufferLength ) + { + /* Write the task name to the string, padding with + * spaces so it can be printed in tabular form more + * easily. */ + pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName ); + /* Do not count the terminating null character. */ + uxConsumedBufferLength = uxConsumedBufferLength + ( configMAX_TASK_NAME_LEN - 1U ); + + /* Is there space left in the buffer? -1 is done because snprintf + * writes a terminating null character. So we are essentially + * checking if the buffer has space to write at least one non-null + * character. */ + if( uxConsumedBufferLength < ( uxBufferLength - 1U ) ) + { + if( ulStatsAsPercentage > 0UL ) + { + #ifdef portLU_PRINTF_SPECIFIER_REQUIRED + { + /* MISRA Ref 21.6.1 [snprintf for utility] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-216 */ + /* coverity[misra_c_2012_rule_21_6_violation] */ + iSnprintfReturnValue = snprintf( pcWriteBuffer, + uxBufferLength - uxConsumedBufferLength, + "\t%lu\t\t%lu%\r\n", + pxTaskStatusArray[ x ].ulRunTimeCounter, + ulStatsAsPercentage ); + } + #else /* ifdef portLU_PRINTF_SPECIFIER_REQUIRED */ + { + /* sizeof( int ) == sizeof( long ) so a smaller + * printf() library can be used. */ + /* MISRA Ref 21.6.1 [snprintf for utility] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-216 */ + /* coverity[misra_c_2012_rule_21_6_violation] */ + iSnprintfReturnValue = snprintf( pcWriteBuffer, + uxBufferLength - uxConsumedBufferLength, + "\t%u\t\t%u%%\r\n", + ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter, + ( unsigned int ) ulStatsAsPercentage ); + } + #endif /* ifdef portLU_PRINTF_SPECIFIER_REQUIRED */ + } + else + { + /* If the percentage is zero here then the task has + * consumed less than 1% of the total run time. */ + #ifdef portLU_PRINTF_SPECIFIER_REQUIRED + { + /* MISRA Ref 21.6.1 [snprintf for utility] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-216 */ + /* coverity[misra_c_2012_rule_21_6_violation] */ + iSnprintfReturnValue = snprintf( pcWriteBuffer, + uxBufferLength - uxConsumedBufferLength, + "\t%lu\t\t<1%%\r\n", + pxTaskStatusArray[ x ].ulRunTimeCounter ); + } + #else + { + /* sizeof( int ) == sizeof( long ) so a smaller + * printf() library can be used. */ + /* MISRA Ref 21.6.1 [snprintf for utility] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-216 */ + /* coverity[misra_c_2012_rule_21_6_violation] */ + iSnprintfReturnValue = snprintf( pcWriteBuffer, + uxBufferLength - uxConsumedBufferLength, + "\t%u\t\t<1%%\r\n", + ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter ); + } + #endif /* ifdef portLU_PRINTF_SPECIFIER_REQUIRED */ + } + + uxCharsWrittenBySnprintf = prvSnprintfReturnValueToCharsWritten( iSnprintfReturnValue, uxBufferLength - uxConsumedBufferLength ); + uxConsumedBufferLength += uxCharsWrittenBySnprintf; + pcWriteBuffer += uxCharsWrittenBySnprintf; + } + else + { + xOutputBufferFull = pdTRUE; + } + } + else + { + xOutputBufferFull = pdTRUE; + } + + if( xOutputBufferFull == pdTRUE ) + { + break; + } + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Free the array again. NOTE! If configSUPPORT_DYNAMIC_ALLOCATION + * is 0 then vPortFree() will be #defined to nothing. */ + vPortFree( pxTaskStatusArray ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_vTaskGetRunTimeStatistics(); + } + +#endif /* ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) */ +/*-----------------------------------------------------------*/ + +TickType_t uxTaskResetEventItemValue( void ) +{ + TickType_t uxReturn; + + traceENTER_uxTaskResetEventItemValue(); + + uxReturn = listGET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ) ); + + /* Reset the event list item to its normal value - so it can be used with + * queues and semaphores. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ), ( ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB->uxPriority ) ); + + traceRETURN_uxTaskResetEventItemValue( uxReturn ); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + TaskHandle_t pvTaskIncrementMutexHeldCount( void ) + { + TCB_t * pxTCB; + + traceENTER_pvTaskIncrementMutexHeldCount(); + + pxTCB = pxCurrentTCB; + + /* If xSemaphoreCreateMutex() is called before any tasks have been created + * then pxCurrentTCB will be NULL. */ + if( pxTCB != NULL ) + { + ( pxTCB->uxMutexesHeld )++; + } + + traceRETURN_pvTaskIncrementMutexHeldCount( pxTCB ); + + return pxTCB; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_NOTIFICATIONS == 1 ) + + uint32_t ulTaskGenericNotifyTake( UBaseType_t uxIndexToWaitOn, + BaseType_t xClearCountOnExit, + TickType_t xTicksToWait ) + { + uint32_t ulReturn; + BaseType_t xAlreadyYielded; + + traceENTER_ulTaskGenericNotifyTake( uxIndexToWaitOn, xClearCountOnExit, xTicksToWait ); + + configASSERT( uxIndexToWaitOn < configTASK_NOTIFICATION_ARRAY_ENTRIES ); + + taskENTER_CRITICAL(); + + /* Only block if the notification count is not already non-zero. */ + if( pxCurrentTCB->ulNotifiedValue[ uxIndexToWaitOn ] == 0UL ) + { + /* Mark this task as waiting for a notification. */ + pxCurrentTCB->ucNotifyState[ uxIndexToWaitOn ] = taskWAITING_NOTIFICATION; + + if( xTicksToWait > ( TickType_t ) 0 ) + { + traceTASK_NOTIFY_TAKE_BLOCK( uxIndexToWaitOn ); + + /* We MUST suspend the scheduler before exiting the critical + * section (i.e. before enabling interrupts). + * + * If we do not do so, a notification sent from an ISR, which + * happens after exiting the critical section and before + * suspending the scheduler, will get lost. The sequence of + * events will be: + * 1. Exit critical section. + * 2. Interrupt - ISR calls xTaskNotifyFromISR which adds the + * task to the Ready list. + * 3. Suspend scheduler. + * 4. prvAddCurrentTaskToDelayedList moves the task to the + * delayed or suspended list. + * 5. Resume scheduler does not touch the task (because it is + * not on the pendingReady list), effectively losing the + * notification from the ISR. + * + * The same does not happen when we suspend the scheduler before + * exiting the critical section. The sequence of events in this + * case will be: + * 1. Suspend scheduler. + * 2. Exit critical section. + * 3. Interrupt - ISR calls xTaskNotifyFromISR which adds the + * task to the pendingReady list as the scheduler is + * suspended. + * 4. prvAddCurrentTaskToDelayedList adds the task to delayed or + * suspended list. Note that this operation does not nullify + * the add to pendingReady list done in the above step because + * a different list item, namely xEventListItem, is used for + * adding the task to the pendingReady list. In other words, + * the task still remains on the pendingReady list. + * 5. Resume scheduler moves the task from pendingReady list to + * the Ready list. + */ + vTaskSuspendAll(); + { + taskEXIT_CRITICAL(); + + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); + } + xAlreadyYielded = xTaskResumeAll(); + + if( xAlreadyYielded == pdFALSE ) + { + taskYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + taskEXIT_CRITICAL(); + } + } + else + { + taskEXIT_CRITICAL(); + } + + taskENTER_CRITICAL(); + { + traceTASK_NOTIFY_TAKE( uxIndexToWaitOn ); + ulReturn = pxCurrentTCB->ulNotifiedValue[ uxIndexToWaitOn ]; + + if( ulReturn != 0UL ) + { + if( xClearCountOnExit != pdFALSE ) + { + pxCurrentTCB->ulNotifiedValue[ uxIndexToWaitOn ] = ( uint32_t ) 0UL; + } + else + { + pxCurrentTCB->ulNotifiedValue[ uxIndexToWaitOn ] = ulReturn - ( uint32_t ) 1; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + pxCurrentTCB->ucNotifyState[ uxIndexToWaitOn ] = taskNOT_WAITING_NOTIFICATION; + } + taskEXIT_CRITICAL(); + + traceRETURN_ulTaskGenericNotifyTake( ulReturn ); + + return ulReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskGenericNotifyWait( UBaseType_t uxIndexToWaitOn, + uint32_t ulBitsToClearOnEntry, + uint32_t ulBitsToClearOnExit, + uint32_t * pulNotificationValue, + TickType_t xTicksToWait ) + { + BaseType_t xReturn, xAlreadyYielded; + + traceENTER_xTaskGenericNotifyWait( uxIndexToWaitOn, ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait ); + + configASSERT( uxIndexToWaitOn < configTASK_NOTIFICATION_ARRAY_ENTRIES ); + + taskENTER_CRITICAL(); + + /* Only block if a notification is not already pending. */ + if( pxCurrentTCB->ucNotifyState[ uxIndexToWaitOn ] != taskNOTIFICATION_RECEIVED ) + { + /* Clear bits in the task's notification value as bits may get + * set by the notifying task or interrupt. This can be used to + * clear the value to zero. */ + pxCurrentTCB->ulNotifiedValue[ uxIndexToWaitOn ] &= ~ulBitsToClearOnEntry; + + /* Mark this task as waiting for a notification. */ + pxCurrentTCB->ucNotifyState[ uxIndexToWaitOn ] = taskWAITING_NOTIFICATION; + + if( xTicksToWait > ( TickType_t ) 0 ) + { + traceTASK_NOTIFY_WAIT_BLOCK( uxIndexToWaitOn ); + + /* We MUST suspend the scheduler before exiting the critical + * section (i.e. before enabling interrupts). + * + * If we do not do so, a notification sent from an ISR, which + * happens after exiting the critical section and before + * suspending the scheduler, will get lost. The sequence of + * events will be: + * 1. Exit critical section. + * 2. Interrupt - ISR calls xTaskNotifyFromISR which adds the + * task to the Ready list. + * 3. Suspend scheduler. + * 4. prvAddCurrentTaskToDelayedList moves the task to the + * delayed or suspended list. + * 5. Resume scheduler does not touch the task (because it is + * not on the pendingReady list), effectively losing the + * notification from the ISR. + * + * The same does not happen when we suspend the scheduler before + * exiting the critical section. The sequence of events in this + * case will be: + * 1. Suspend scheduler. + * 2. Exit critical section. + * 3. Interrupt - ISR calls xTaskNotifyFromISR which adds the + * task to the pendingReady list as the scheduler is + * suspended. + * 4. prvAddCurrentTaskToDelayedList adds the task to delayed or + * suspended list. Note that this operation does not nullify + * the add to pendingReady list done in the above step because + * a different list item, namely xEventListItem, is used for + * adding the task to the pendingReady list. In other words, + * the task still remains on the pendingReady list. + * 5. Resume scheduler moves the task from pendingReady list to + * the Ready list. + */ + vTaskSuspendAll(); + { + taskEXIT_CRITICAL(); + + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); + } + xAlreadyYielded = xTaskResumeAll(); + + if( xAlreadyYielded == pdFALSE ) + { + taskYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + taskEXIT_CRITICAL(); + } + } + else + { + taskEXIT_CRITICAL(); + } + + taskENTER_CRITICAL(); + { + traceTASK_NOTIFY_WAIT( uxIndexToWaitOn ); + + if( pulNotificationValue != NULL ) + { + /* Output the current notification value, which may or may not + * have changed. */ + *pulNotificationValue = pxCurrentTCB->ulNotifiedValue[ uxIndexToWaitOn ]; + } + + /* If ucNotifyValue is set then either the task never entered the + * blocked state (because a notification was already pending) or the + * task unblocked because of a notification. Otherwise the task + * unblocked because of a timeout. */ + if( pxCurrentTCB->ucNotifyState[ uxIndexToWaitOn ] != taskNOTIFICATION_RECEIVED ) + { + /* A notification was not received. */ + xReturn = pdFALSE; + } + else + { + /* A notification was already pending or a notification was + * received while the task was waiting. */ + pxCurrentTCB->ulNotifiedValue[ uxIndexToWaitOn ] &= ~ulBitsToClearOnExit; + xReturn = pdTRUE; + } + + pxCurrentTCB->ucNotifyState[ uxIndexToWaitOn ] = taskNOT_WAITING_NOTIFICATION; + } + taskEXIT_CRITICAL(); + + traceRETURN_xTaskGenericNotifyWait( xReturn ); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + uint32_t ulValue, + eNotifyAction eAction, + uint32_t * pulPreviousNotificationValue ) + { + TCB_t * pxTCB; + BaseType_t xReturn = pdPASS; + uint8_t ucOriginalNotifyState; + + traceENTER_xTaskGenericNotify( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pulPreviousNotificationValue ); + + configASSERT( uxIndexToNotify < configTASK_NOTIFICATION_ARRAY_ENTRIES ); + configASSERT( xTaskToNotify ); + pxTCB = xTaskToNotify; + + taskENTER_CRITICAL(); + { + if( pulPreviousNotificationValue != NULL ) + { + *pulPreviousNotificationValue = pxTCB->ulNotifiedValue[ uxIndexToNotify ]; + } + + ucOriginalNotifyState = pxTCB->ucNotifyState[ uxIndexToNotify ]; + + pxTCB->ucNotifyState[ uxIndexToNotify ] = taskNOTIFICATION_RECEIVED; + + switch( eAction ) + { + case eSetBits: + pxTCB->ulNotifiedValue[ uxIndexToNotify ] |= ulValue; + break; + + case eIncrement: + ( pxTCB->ulNotifiedValue[ uxIndexToNotify ] )++; + break; + + case eSetValueWithOverwrite: + pxTCB->ulNotifiedValue[ uxIndexToNotify ] = ulValue; + break; + + case eSetValueWithoutOverwrite: + + if( ucOriginalNotifyState != taskNOTIFICATION_RECEIVED ) + { + pxTCB->ulNotifiedValue[ uxIndexToNotify ] = ulValue; + } + else + { + /* The value could not be written to the task. */ + xReturn = pdFAIL; + } + + break; + + case eNoAction: + + /* The task is being notified without its notify value being + * updated. */ + break; + + default: + + /* Should not get here if all enums are handled. + * Artificially force an assert by testing a value the + * compiler can't assume is const. */ + configASSERT( xTickCount == ( TickType_t ) 0 ); + + break; + } + + traceTASK_NOTIFY( uxIndexToNotify ); + + /* If the task is in the blocked state specifically to wait for a + * notification then unblock it now. */ + if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) + { + listREMOVE_ITEM( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + + #if ( configUSE_TICKLESS_IDLE != 0 ) + { + /* If a task is blocked waiting for a notification then + * xNextTaskUnblockTime might be set to the blocked task's time + * out time. If the task is unblocked for a reason other than + * a timeout xNextTaskUnblockTime is normally left unchanged, + * because it will automatically get reset to a new value when + * the tick count equals xNextTaskUnblockTime. However if + * tickless idling is used it might be more important to enter + * sleep mode at the earliest possible time - so reset + * xNextTaskUnblockTime here to ensure it is updated at the + * earliest possible time. */ + prvResetNextTaskUnblockTime(); + } + #endif + + /* Check if the notified task has a priority above the currently + * executing task. */ + taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + traceRETURN_xTaskGenericNotify( xReturn ); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + uint32_t ulValue, + eNotifyAction eAction, + uint32_t * pulPreviousNotificationValue, + BaseType_t * pxHigherPriorityTaskWoken ) + { + TCB_t * pxTCB; + uint8_t ucOriginalNotifyState; + BaseType_t xReturn = pdPASS; + UBaseType_t uxSavedInterruptStatus; + + traceENTER_xTaskGenericNotifyFromISR( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pulPreviousNotificationValue, pxHigherPriorityTaskWoken ); + + configASSERT( xTaskToNotify ); + configASSERT( uxIndexToNotify < configTASK_NOTIFICATION_ARRAY_ENTRIES ); + + /* RTOS ports that support interrupt nesting have the concept of a + * maximum system call (or maximum API call) interrupt priority. + * Interrupts that are above the maximum system call priority are keep + * permanently enabled, even when the RTOS kernel is in a critical section, + * but cannot make any calls to FreeRTOS API functions. If configASSERT() + * is defined in FreeRTOSConfig.h then + * portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has + * been assigned a priority above the configured maximum system call + * priority. Only FreeRTOS functions that end in FromISR can be called + * from interrupts that have been assigned a priority at or (logically) + * below the maximum system call interrupt priority. FreeRTOS maintains a + * separate interrupt safe API to ensure interrupt entry is as fast and as + * simple as possible. More information (albeit Cortex-M specific) is + * provided on the following link: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + pxTCB = xTaskToNotify; + + uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR(); + { + if( pulPreviousNotificationValue != NULL ) + { + *pulPreviousNotificationValue = pxTCB->ulNotifiedValue[ uxIndexToNotify ]; + } + + ucOriginalNotifyState = pxTCB->ucNotifyState[ uxIndexToNotify ]; + pxTCB->ucNotifyState[ uxIndexToNotify ] = taskNOTIFICATION_RECEIVED; + + switch( eAction ) + { + case eSetBits: + pxTCB->ulNotifiedValue[ uxIndexToNotify ] |= ulValue; + break; + + case eIncrement: + ( pxTCB->ulNotifiedValue[ uxIndexToNotify ] )++; + break; + + case eSetValueWithOverwrite: + pxTCB->ulNotifiedValue[ uxIndexToNotify ] = ulValue; + break; + + case eSetValueWithoutOverwrite: + + if( ucOriginalNotifyState != taskNOTIFICATION_RECEIVED ) + { + pxTCB->ulNotifiedValue[ uxIndexToNotify ] = ulValue; + } + else + { + /* The value could not be written to the task. */ + xReturn = pdFAIL; + } + + break; + + case eNoAction: + + /* The task is being notified without its notify value being + * updated. */ + break; + + default: + + /* Should not get here if all enums are handled. + * Artificially force an assert by testing a value the + * compiler can't assume is const. */ + configASSERT( xTickCount == ( TickType_t ) 0 ); + break; + } + + traceTASK_NOTIFY_FROM_ISR( uxIndexToNotify ); + + /* If the task is in the blocked state specifically to wait for a + * notification then unblock it now. */ + if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) + { + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + + if( uxSchedulerSuspended == ( UBaseType_t ) 0U ) + { + listREMOVE_ITEM( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* The delayed and ready lists cannot be accessed, so hold + * this task pending until the scheduler is resumed. */ + listINSERT_END( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + + #if ( configNUMBER_OF_CORES == 1 ) + { + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The notified task has a priority above the currently + * executing task so a yield is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + + /* Mark that a yield is pending in case the user is not + * using the "xHigherPriorityTaskWoken" parameter to an ISR + * safe FreeRTOS function. */ + xYieldPendings[ 0 ] = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #else /* #if ( configNUMBER_OF_CORES == 1 ) */ + { + #if ( configUSE_PREEMPTION == 1 ) + { + prvYieldForTask( pxTCB ); + + if( xYieldPendings[ portGET_CORE_ID() ] == pdTRUE ) + { + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + } + } + #endif /* if ( configUSE_PREEMPTION == 1 ) */ + } + #endif /* #if ( configNUMBER_OF_CORES == 1 ) */ + } + } + taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus ); + + traceRETURN_xTaskGenericNotifyFromISR( xReturn ); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_NOTIFICATIONS == 1 ) + + void vTaskGenericNotifyGiveFromISR( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + BaseType_t * pxHigherPriorityTaskWoken ) + { + TCB_t * pxTCB; + uint8_t ucOriginalNotifyState; + UBaseType_t uxSavedInterruptStatus; + + traceENTER_vTaskGenericNotifyGiveFromISR( xTaskToNotify, uxIndexToNotify, pxHigherPriorityTaskWoken ); + + configASSERT( xTaskToNotify ); + configASSERT( uxIndexToNotify < configTASK_NOTIFICATION_ARRAY_ENTRIES ); + + /* RTOS ports that support interrupt nesting have the concept of a + * maximum system call (or maximum API call) interrupt priority. + * Interrupts that are above the maximum system call priority are keep + * permanently enabled, even when the RTOS kernel is in a critical section, + * but cannot make any calls to FreeRTOS API functions. If configASSERT() + * is defined in FreeRTOSConfig.h then + * portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has + * been assigned a priority above the configured maximum system call + * priority. Only FreeRTOS functions that end in FromISR can be called + * from interrupts that have been assigned a priority at or (logically) + * below the maximum system call interrupt priority. FreeRTOS maintains a + * separate interrupt safe API to ensure interrupt entry is as fast and as + * simple as possible. More information (albeit Cortex-M specific) is + * provided on the following link: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + pxTCB = xTaskToNotify; + + uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR(); + { + ucOriginalNotifyState = pxTCB->ucNotifyState[ uxIndexToNotify ]; + pxTCB->ucNotifyState[ uxIndexToNotify ] = taskNOTIFICATION_RECEIVED; + + /* 'Giving' is equivalent to incrementing a count in a counting + * semaphore. */ + ( pxTCB->ulNotifiedValue[ uxIndexToNotify ] )++; + + traceTASK_NOTIFY_GIVE_FROM_ISR( uxIndexToNotify ); + + /* If the task is in the blocked state specifically to wait for a + * notification then unblock it now. */ + if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) + { + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + + if( uxSchedulerSuspended == ( UBaseType_t ) 0U ) + { + listREMOVE_ITEM( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* The delayed and ready lists cannot be accessed, so hold + * this task pending until the scheduler is resumed. */ + listINSERT_END( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + + #if ( configNUMBER_OF_CORES == 1 ) + { + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The notified task has a priority above the currently + * executing task so a yield is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + + /* Mark that a yield is pending in case the user is not + * using the "xHigherPriorityTaskWoken" parameter in an ISR + * safe FreeRTOS function. */ + xYieldPendings[ 0 ] = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #else /* #if ( configNUMBER_OF_CORES == 1 ) */ + { + #if ( configUSE_PREEMPTION == 1 ) + { + prvYieldForTask( pxTCB ); + + if( xYieldPendings[ portGET_CORE_ID() ] == pdTRUE ) + { + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + } + } + #endif /* #if ( configUSE_PREEMPTION == 1 ) */ + } + #endif /* #if ( configNUMBER_OF_CORES == 1 ) */ + } + } + taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus ); + + traceRETURN_vTaskGenericNotifyGiveFromISR(); + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskGenericNotifyStateClear( TaskHandle_t xTask, + UBaseType_t uxIndexToClear ) + { + TCB_t * pxTCB; + BaseType_t xReturn; + + traceENTER_xTaskGenericNotifyStateClear( xTask, uxIndexToClear ); + + configASSERT( uxIndexToClear < configTASK_NOTIFICATION_ARRAY_ENTRIES ); + + /* If null is passed in here then it is the calling task that is having + * its notification state cleared. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + taskENTER_CRITICAL(); + { + if( pxTCB->ucNotifyState[ uxIndexToClear ] == taskNOTIFICATION_RECEIVED ) + { + pxTCB->ucNotifyState[ uxIndexToClear ] = taskNOT_WAITING_NOTIFICATION; + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + } + taskEXIT_CRITICAL(); + + traceRETURN_xTaskGenericNotifyStateClear( xReturn ); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_NOTIFICATIONS == 1 ) + + uint32_t ulTaskGenericNotifyValueClear( TaskHandle_t xTask, + UBaseType_t uxIndexToClear, + uint32_t ulBitsToClear ) + { + TCB_t * pxTCB; + uint32_t ulReturn; + + traceENTER_ulTaskGenericNotifyValueClear( xTask, uxIndexToClear, ulBitsToClear ); + + configASSERT( uxIndexToClear < configTASK_NOTIFICATION_ARRAY_ENTRIES ); + + /* If null is passed in here then it is the calling task that is having + * its notification state cleared. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + taskENTER_CRITICAL(); + { + /* Return the notification as it was before the bits were cleared, + * then clear the bit mask. */ + ulReturn = pxTCB->ulNotifiedValue[ uxIndexToClear ]; + pxTCB->ulNotifiedValue[ uxIndexToClear ] &= ~ulBitsToClear; + } + taskEXIT_CRITICAL(); + + traceRETURN_ulTaskGenericNotifyValueClear( ulReturn ); + + return ulReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + + configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimeCounter( const TaskHandle_t xTask ) + { + TCB_t * pxTCB; + + traceENTER_ulTaskGetRunTimeCounter( xTask ); + + pxTCB = prvGetTCBFromHandle( xTask ); + + traceRETURN_ulTaskGetRunTimeCounter( pxTCB->ulRunTimeCounter ); + + return pxTCB->ulRunTimeCounter; + } + +#endif /* if ( configGENERATE_RUN_TIME_STATS == 1 ) */ +/*-----------------------------------------------------------*/ + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + + configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimePercent( const TaskHandle_t xTask ) + { + TCB_t * pxTCB; + configRUN_TIME_COUNTER_TYPE ulTotalTime, ulReturn; + + traceENTER_ulTaskGetRunTimePercent( xTask ); + + ulTotalTime = ( configRUN_TIME_COUNTER_TYPE ) portGET_RUN_TIME_COUNTER_VALUE(); + + /* For percentage calculations. */ + ulTotalTime /= ( configRUN_TIME_COUNTER_TYPE ) 100; + + /* Avoid divide by zero errors. */ + if( ulTotalTime > ( configRUN_TIME_COUNTER_TYPE ) 0 ) + { + pxTCB = prvGetTCBFromHandle( xTask ); + ulReturn = pxTCB->ulRunTimeCounter / ulTotalTime; + } + else + { + ulReturn = 0; + } + + traceRETURN_ulTaskGetRunTimePercent( ulReturn ); + + return ulReturn; + } + +#endif /* if ( configGENERATE_RUN_TIME_STATS == 1 ) */ +/*-----------------------------------------------------------*/ + +#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) + + configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimeCounter( void ) + { + configRUN_TIME_COUNTER_TYPE ulReturn = 0; + BaseType_t i; + + traceENTER_ulTaskGetIdleRunTimeCounter(); + + for( i = 0; i < ( BaseType_t ) configNUMBER_OF_CORES; i++ ) + { + ulReturn += xIdleTaskHandles[ i ]->ulRunTimeCounter; + } + + traceRETURN_ulTaskGetIdleRunTimeCounter( ulReturn ); + + return ulReturn; + } + +#endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) + + configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimePercent( void ) + { + configRUN_TIME_COUNTER_TYPE ulTotalTime, ulReturn; + configRUN_TIME_COUNTER_TYPE ulRunTimeCounter = 0; + BaseType_t i; + + traceENTER_ulTaskGetIdleRunTimePercent(); + + ulTotalTime = portGET_RUN_TIME_COUNTER_VALUE() * configNUMBER_OF_CORES; + + /* For percentage calculations. */ + ulTotalTime /= ( configRUN_TIME_COUNTER_TYPE ) 100; + + /* Avoid divide by zero errors. */ + if( ulTotalTime > ( configRUN_TIME_COUNTER_TYPE ) 0 ) + { + for( i = 0; i < ( BaseType_t ) configNUMBER_OF_CORES; i++ ) + { + ulRunTimeCounter += xIdleTaskHandles[ i ]->ulRunTimeCounter; + } + + ulReturn = ulRunTimeCounter / ulTotalTime; + } + else + { + ulReturn = 0; + } + + traceRETURN_ulTaskGetIdleRunTimePercent( ulReturn ); + + return ulReturn; + } + +#endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) */ +/*-----------------------------------------------------------*/ + +static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait, + const BaseType_t xCanBlockIndefinitely ) +{ + TickType_t xTimeToWake; + const TickType_t xConstTickCount = xTickCount; + List_t * const pxDelayedList = pxDelayedTaskList; + List_t * const pxOverflowDelayedList = pxOverflowDelayedTaskList; + + #if ( INCLUDE_xTaskAbortDelay == 1 ) + { + /* About to enter a delayed list, so ensure the ucDelayAborted flag is + * reset to pdFALSE so it can be detected as having been set to pdTRUE + * when the task leaves the Blocked state. */ + pxCurrentTCB->ucDelayAborted = pdFALSE; + } + #endif + + /* Remove the task from the ready list before adding it to the blocked list + * as the same list item is used for both lists. */ + if( uxListRemove( &( pxCurrentTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* The current task must be in a ready list, so there is no need to + * check, and the port reset macro can be called directly. */ + portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( ( xTicksToWait == portMAX_DELAY ) && ( xCanBlockIndefinitely != pdFALSE ) ) + { + /* Add the task to the suspended task list instead of a delayed task + * list to ensure it is not woken by a timing event. It will block + * indefinitely. */ + listINSERT_END( &xSuspendedTaskList, &( pxCurrentTCB->xStateListItem ) ); + } + else + { + /* Calculate the time at which the task should be woken if the event + * does not occur. This may overflow but this doesn't matter, the + * kernel will manage it correctly. */ + xTimeToWake = xConstTickCount + xTicksToWait; + + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake ); + + if( xTimeToWake < xConstTickCount ) + { + /* Wake time has overflowed. Place this item in the overflow + * list. */ + traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST(); + vListInsert( pxOverflowDelayedList, &( pxCurrentTCB->xStateListItem ) ); + } + else + { + /* The wake time has not overflowed, so the current block list + * is used. */ + traceMOVED_TASK_TO_DELAYED_LIST(); + vListInsert( pxDelayedList, &( pxCurrentTCB->xStateListItem ) ); + + /* If the task entering the blocked state was placed at the + * head of the list of blocked tasks then xNextTaskUnblockTime + * needs to be updated too. */ + if( xTimeToWake < xNextTaskUnblockTime ) + { + xNextTaskUnblockTime = xTimeToWake; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + } + #else /* INCLUDE_vTaskSuspend */ + { + /* Calculate the time at which the task should be woken if the event + * does not occur. This may overflow but this doesn't matter, the kernel + * will manage it correctly. */ + xTimeToWake = xConstTickCount + xTicksToWait; + + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake ); + + if( xTimeToWake < xConstTickCount ) + { + traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST(); + /* Wake time has overflowed. Place this item in the overflow list. */ + vListInsert( pxOverflowDelayedList, &( pxCurrentTCB->xStateListItem ) ); + } + else + { + traceMOVED_TASK_TO_DELAYED_LIST(); + /* The wake time has not overflowed, so the current block list is used. */ + vListInsert( pxDelayedList, &( pxCurrentTCB->xStateListItem ) ); + + /* If the task entering the blocked state was placed at the head of the + * list of blocked tasks then xNextTaskUnblockTime needs to be updated + * too. */ + if( xTimeToWake < xNextTaskUnblockTime ) + { + xNextTaskUnblockTime = xTimeToWake; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + /* Avoid compiler warning when INCLUDE_vTaskSuspend is not 1. */ + ( void ) xCanBlockIndefinitely; + } + #endif /* INCLUDE_vTaskSuspend */ +} +/*-----------------------------------------------------------*/ + +#if ( portUSING_MPU_WRAPPERS == 1 ) + + xMPU_SETTINGS * xTaskGetMPUSettings( TaskHandle_t xTask ) + { + TCB_t * pxTCB; + + traceENTER_xTaskGetMPUSettings( xTask ); + + pxTCB = prvGetTCBFromHandle( xTask ); + + traceRETURN_xTaskGetMPUSettings( &( pxTCB->xMPUSettings ) ); + + return &( pxTCB->xMPUSettings ); + } + +#endif /* portUSING_MPU_WRAPPERS */ +/*-----------------------------------------------------------*/ + +/* Code below here allows additional code to be inserted into this source file, + * especially where access to file scope functions and data is needed (for example + * when performing module tests). */ + +#ifdef FREERTOS_MODULE_TEST + #include "tasks_test_access_functions.h" +#endif + + +#if ( configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H == 1 ) + + #include "freertos_tasks_c_additions.h" + + #ifdef FREERTOS_TASKS_C_ADDITIONS_INIT + static void freertos_tasks_c_additions_init( void ) + { + FREERTOS_TASKS_C_ADDITIONS_INIT(); + } + #endif + +#endif /* if ( configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H == 1 ) */ +/*-----------------------------------------------------------*/ + +#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configKERNEL_PROVIDED_STATIC_MEMORY == 1 ) && ( portUSING_MPU_WRAPPERS == 0 ) ) + +/* + * This is the kernel provided implementation of vApplicationGetIdleTaskMemory() + * to provide the memory that is used by the Idle task. It is used when + * configKERNEL_PROVIDED_STATIC_MEMORY is set to 1. The application can provide + * it's own implementation of vApplicationGetIdleTaskMemory by setting + * configKERNEL_PROVIDED_STATIC_MEMORY to 0 or leaving it undefined. + */ + void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer, + StackType_t ** ppxIdleTaskStackBuffer, + uint32_t * pulIdleTaskStackSize ) + { + static StaticTask_t xIdleTaskTCB; + static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ]; + + *ppxIdleTaskTCBBuffer = &( xIdleTaskTCB ); + *ppxIdleTaskStackBuffer = &( uxIdleTaskStack[ 0 ] ); + *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; + } + + #if ( configNUMBER_OF_CORES > 1 ) + + void vApplicationGetPassiveIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer, + StackType_t ** ppxIdleTaskStackBuffer, + uint32_t * pulIdleTaskStackSize, + BaseType_t xPassiveIdleTaskIndex ) + { + static StaticTask_t xIdleTaskTCBs[ configNUMBER_OF_CORES - 1 ]; + static StackType_t uxIdleTaskStacks[ configNUMBER_OF_CORES - 1 ][ configMINIMAL_STACK_SIZE ]; + + *ppxIdleTaskTCBBuffer = &( xIdleTaskTCBs[ xPassiveIdleTaskIndex ] ); + *ppxIdleTaskStackBuffer = &( uxIdleTaskStacks[ xPassiveIdleTaskIndex ][ 0 ] ); + *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; + } + + #endif /* #if ( configNUMBER_OF_CORES > 1 ) */ + +#endif /* #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configKERNEL_PROVIDED_STATIC_MEMORY == 1 ) && ( portUSING_MPU_WRAPPERS == 0 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configKERNEL_PROVIDED_STATIC_MEMORY == 1 ) && ( portUSING_MPU_WRAPPERS == 0 ) ) + +/* + * This is the kernel provided implementation of vApplicationGetTimerTaskMemory() + * to provide the memory that is used by the Timer service task. It is used when + * configKERNEL_PROVIDED_STATIC_MEMORY is set to 1. The application can provide + * it's own implementation of vApplicationGetTimerTaskMemory by setting + * configKERNEL_PROVIDED_STATIC_MEMORY to 0 or leaving it undefined. + */ + void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer, + StackType_t ** ppxTimerTaskStackBuffer, + uint32_t * pulTimerTaskStackSize ) + { + static StaticTask_t xTimerTaskTCB; + static StackType_t uxTimerTaskStack[ configTIMER_TASK_STACK_DEPTH ]; + + *ppxTimerTaskTCBBuffer = &( xTimerTaskTCB ); + *ppxTimerTaskStackBuffer = &( uxTimerTaskStack[ 0 ] ); + *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; + } + +#endif /* #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configKERNEL_PROVIDED_STATIC_MEMORY == 1 ) && ( portUSING_MPU_WRAPPERS == 0 ) ) */ +/*-----------------------------------------------------------*/ +#if 1 /* << EST: additional functionality to iterate through task handles. */ +static void prvCollectTaskHandlesWithinSingleList( List_t *pxList, TaskHandle_t taskHandleArray[], UBaseType_t noTaskHandlesInArray, UBaseType_t *idxCounter) +{ + TCB_t *pxNextTCB, *pxFirstTCB; + + /* This function is called with the scheduler suspended. */ + if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); + do + { + listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); + if (*idxCounter ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + /* Search the delayed lists. */ + prvCollectTaskHandlesWithinSingleList( ( List_t * ) pxDelayedTaskList, pxTaskHandleArray, xNofTaskHandlesInArray, &idxCounter); + prvCollectTaskHandlesWithinSingleList( ( List_t * ) pxOverflowDelayedTaskList, pxTaskHandleArray, xNofTaskHandlesInArray, &idxCounter); + #if ( INCLUDE_vTaskSuspend == 1 ) + { + /* Search the suspended list. */ + prvCollectTaskHandlesWithinSingleList( &xSuspendedTaskList, pxTaskHandleArray, xNofTaskHandlesInArray, &idxCounter); + } + #endif + #if( INCLUDE_vTaskDelete == 1 ) + { + /* Search the deleted list. */ + prvCollectTaskHandlesWithinSingleList( &xTasksWaitingTermination, pxTaskHandleArray, xNofTaskHandlesInArray, &idxCounter); + } + #endif + } + ( void ) xTaskResumeAll(); + return idxCounter; +} + +void vTaskGetStackInfo(TaskHandle_t xTask, StackType_t **ppxStart, StackType_t **ppxEnd, StackType_t **ppxTopOfStack, uint8_t *pucStaticallyAllocated) +{ + TCB_t *pxTCB; + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the priority of the that + called uxTaskPriorityGet() that is being queried. */ + pxTCB = prvGetTCBFromHandle( xTask ); +#if ( portSTACK_GROWTH > 0 ) + *ppxStart = pxTCB->pxStack; + *ppxEnd = pxTCB->pxEndOfStack; +#elif (configRECORD_STACK_HIGH_ADDRESS == 1) + *ppxStart = pxTCB->pxEndOfStack; + *ppxEnd = pxTCB->pxStack; +#else /* no stack end information, return a zero size */ + *ppxStart = pxTCB->pxStack; + *ppxEnd = pxTCB->pxStack; +#endif + *ppxTopOfStack = (StackType_t*)pxTCB->pxTopOfStack; +#if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + *pucStaticallyAllocated = pxTCB->ucStaticallyAllocated; +#elif (configSUPPORT_STATIC_ALLOCATION && !configSUPPORT_DYNAMIC_ALLOCATION) /* only static allocation */ + *pucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB; +#else /* only configSUPPORT_DYNAMIC_ALLOCATION */ + *pucStaticallyAllocated = tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB; +#endif + } + taskEXIT_CRITICAL(); +} +#endif /* << EST end */ + diff --git a/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/timers.c b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/timers.c new file mode 100644 index 0000000..6485c60 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/FreeRTOS/Source/timers.c @@ -0,0 +1,1329 @@ +/* + * FreeRTOS Kernel V11.0.0 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "timers.h" + +#if ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 0 ) + #error configUSE_TIMERS must be set to 1 to make the xTimerPendFunctionCall() function available. +#endif + +/* The MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined + * for the header files above, but not in this file, in order to generate the + * correct privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + + +/* This entire source file will be skipped if the application is not configured + * to include software timer functionality. This #if is closed at the very bottom + * of this file. If you want to include software timer functionality then ensure + * configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ +#if ( configUSE_TIMERS == 1 ) + +/* Misc definitions. */ + #define tmrNO_DELAY ( ( TickType_t ) 0U ) + #define tmrMAX_TIME_BEFORE_OVERFLOW ( ( TickType_t ) -1 ) + +/* The name assigned to the timer service task. This can be overridden by + * defining configTIMER_SERVICE_TASK_NAME in FreeRTOSConfig.h. */ + #ifndef configTIMER_SERVICE_TASK_NAME + #define configTIMER_SERVICE_TASK_NAME "Tmr Svc" + #endif + + #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + +/* The core affinity assigned to the timer service task on SMP systems. + * This can be overridden by defining configTIMER_SERVICE_TASK_CORE_AFFINITY in FreeRTOSConfig.h. */ + #ifndef configTIMER_SERVICE_TASK_CORE_AFFINITY + #define configTIMER_SERVICE_TASK_CORE_AFFINITY tskNO_AFFINITY + #endif + #endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) */ + +/* Bit definitions used in the ucStatus member of a timer structure. */ + #define tmrSTATUS_IS_ACTIVE ( 0x01U ) + #define tmrSTATUS_IS_STATICALLY_ALLOCATED ( 0x02U ) + #define tmrSTATUS_IS_AUTORELOAD ( 0x04U ) + +/* The definition of the timers themselves. */ + typedef struct tmrTimerControl /* The old naming convention is used to prevent breaking kernel aware debuggers. */ + { + const char * pcTimerName; /**< Text name. This is not used by the kernel, it is included simply to make debugging easier. */ + ListItem_t xTimerListItem; /**< Standard linked list item as used by all kernel features for event management. */ + TickType_t xTimerPeriodInTicks; /**< How quickly and often the timer expires. */ + void * pvTimerID; /**< An ID to identify the timer. This allows the timer to be identified when the same callback is used for multiple timers. */ + portTIMER_CALLBACK_ATTRIBUTE TimerCallbackFunction_t pxCallbackFunction; /**< The function that will be called when the timer expires. */ + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxTimerNumber; /**< An ID assigned by trace tools such as FreeRTOS+Trace */ + #endif + uint8_t ucStatus; /**< Holds bits to say if the timer was statically allocated or not, and if it is active or not. */ + } xTIMER; + +/* The old xTIMER name is maintained above then typedefed to the new Timer_t + * name below to enable the use of older kernel aware debuggers. */ + typedef xTIMER Timer_t; + +/* The definition of messages that can be sent and received on the timer queue. + * Two types of message can be queued - messages that manipulate a software timer, + * and messages that request the execution of a non-timer related callback. The + * two message types are defined in two separate structures, xTimerParametersType + * and xCallbackParametersType respectively. */ + typedef struct tmrTimerParameters + { + TickType_t xMessageValue; /**< An optional value used by a subset of commands, for example, when changing the period of a timer. */ + Timer_t * pxTimer; /**< The timer to which the command will be applied. */ + } TimerParameter_t; + + + typedef struct tmrCallbackParameters + { + portTIMER_CALLBACK_ATTRIBUTE + PendedFunction_t pxCallbackFunction; /* << The callback function to execute. */ + void * pvParameter1; /* << The value that will be used as the callback functions first parameter. */ + uint32_t ulParameter2; /* << The value that will be used as the callback functions second parameter. */ + } CallbackParameters_t; + +/* The structure that contains the two message types, along with an identifier + * that is used to determine which message type is valid. */ + typedef struct tmrTimerQueueMessage + { + BaseType_t xMessageID; /**< The command being sent to the timer service task. */ + union + { + TimerParameter_t xTimerParameters; + + /* Don't include xCallbackParameters if it is not going to be used as + * it makes the structure (and therefore the timer queue) larger. */ + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) + CallbackParameters_t xCallbackParameters; + #endif /* INCLUDE_xTimerPendFunctionCall */ + } u; + } DaemonTaskMessage_t; + +/* The list in which active timers are stored. Timers are referenced in expire + * time order, with the nearest expiry time at the front of the list. Only the + * timer service task is allowed to access these lists. + * xActiveTimerList1 and xActiveTimerList2 could be at function scope but that + * breaks some kernel aware debuggers, and debuggers that reply on removing the + * static qualifier. */ + PRIVILEGED_DATA static List_t xActiveTimerList1; + PRIVILEGED_DATA static List_t xActiveTimerList2; + PRIVILEGED_DATA static List_t * pxCurrentTimerList; + PRIVILEGED_DATA static List_t * pxOverflowTimerList; + +/* A queue that is used to send commands to the timer service task. */ + PRIVILEGED_DATA static QueueHandle_t xTimerQueue = NULL; + PRIVILEGED_DATA static TaskHandle_t xTimerTaskHandle = NULL; + +/*-----------------------------------------------------------*/ + +/* + * Initialise the infrastructure used by the timer service task if it has not + * been initialised already. + */ + static void prvCheckForValidListAndQueue( void ) PRIVILEGED_FUNCTION; + +/* + * The timer service task (daemon). Timer functionality is controlled by this + * task. Other tasks communicate with the timer service task using the + * xTimerQueue queue. + */ + static portTASK_FUNCTION_PROTO( prvTimerTask, pvParameters ) PRIVILEGED_FUNCTION; + +/* + * Called by the timer service task to interpret and process a command it + * received on the timer queue. + */ + static void prvProcessReceivedCommands( void ) PRIVILEGED_FUNCTION; + +/* + * Insert the timer into either xActiveTimerList1, or xActiveTimerList2, + * depending on if the expire time causes a timer counter overflow. + */ + static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, + const TickType_t xNextExpiryTime, + const TickType_t xTimeNow, + const TickType_t xCommandTime ) PRIVILEGED_FUNCTION; + +/* + * Reload the specified auto-reload timer. If the reloading is backlogged, + * clear the backlog, calling the callback for each additional reload. When + * this function returns, the next expiry time is after xTimeNow. + */ + static void prvReloadTimer( Timer_t * const pxTimer, + TickType_t xExpiredTime, + const TickType_t xTimeNow ) PRIVILEGED_FUNCTION; + +/* + * An active timer has reached its expire time. Reload the timer if it is an + * auto-reload timer, then call its callback. + */ + static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, + const TickType_t xTimeNow ) PRIVILEGED_FUNCTION; + +/* + * The tick count has overflowed. Switch the timer lists after ensuring the + * current timer list does not still reference some timers. + */ + static void prvSwitchTimerLists( void ) PRIVILEGED_FUNCTION; + +/* + * Obtain the current tick count, setting *pxTimerListsWereSwitched to pdTRUE + * if a tick count overflow occurred since prvSampleTimeNow() was last called. + */ + static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched ) PRIVILEGED_FUNCTION; + +/* + * If the timer list contains any active timers then return the expire time of + * the timer that will expire first and set *pxListWasEmpty to false. If the + * timer list does not contain any timers then return 0 and set *pxListWasEmpty + * to pdTRUE. + */ + static TickType_t prvGetNextExpireTime( BaseType_t * const pxListWasEmpty ) PRIVILEGED_FUNCTION; + +/* + * If a timer has expired, process it. Otherwise, block the timer service task + * until either a timer does expire or a command is received. + */ + static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, + BaseType_t xListWasEmpty ) PRIVILEGED_FUNCTION; + +/* + * Called after a Timer_t structure has been allocated either statically or + * dynamically to fill in the structure's members. + */ + static void prvInitialiseNewTimer( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const BaseType_t xAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + Timer_t * pxNewTimer ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + + BaseType_t xTimerCreateTimerTask( void ) + { + BaseType_t xReturn = pdFAIL; + + traceENTER_xTimerCreateTimerTask(); + + /* This function is called when the scheduler is started if + * configUSE_TIMERS is set to 1. Check that the infrastructure used by the + * timer service task has been created/initialised. If timers have already + * been created then the initialisation will already have been performed. */ + prvCheckForValidListAndQueue(); + + if( xTimerQueue != NULL ) + { + #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) + { + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + StaticTask_t * pxTimerTaskTCBBuffer = NULL; + StackType_t * pxTimerTaskStackBuffer = NULL; + uint32_t ulTimerTaskStackSize; + + vApplicationGetTimerTaskMemory( &pxTimerTaskTCBBuffer, &pxTimerTaskStackBuffer, &ulTimerTaskStackSize ); + xTimerTaskHandle = xTaskCreateStaticAffinitySet( prvTimerTask, + configTIMER_SERVICE_TASK_NAME, + ulTimerTaskStackSize, + NULL, + ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, + pxTimerTaskStackBuffer, + pxTimerTaskTCBBuffer, + configTIMER_SERVICE_TASK_CORE_AFFINITY ); + + if( xTimerTaskHandle != NULL ) + { + xReturn = pdPASS; + } + } + #else /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ + { + xReturn = xTaskCreateAffinitySet( prvTimerTask, + configTIMER_SERVICE_TASK_NAME, + configTIMER_TASK_STACK_DEPTH, + NULL, + ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, + configTIMER_SERVICE_TASK_CORE_AFFINITY, + &xTimerTaskHandle ); + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + } + #else /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) */ + { + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + StaticTask_t * pxTimerTaskTCBBuffer = NULL; + StackType_t * pxTimerTaskStackBuffer = NULL; + uint32_t ulTimerTaskStackSize; + + vApplicationGetTimerTaskMemory( &pxTimerTaskTCBBuffer, &pxTimerTaskStackBuffer, &ulTimerTaskStackSize ); + xTimerTaskHandle = xTaskCreateStatic( prvTimerTask, + configTIMER_SERVICE_TASK_NAME, + ulTimerTaskStackSize, + NULL, + ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, + pxTimerTaskStackBuffer, + pxTimerTaskTCBBuffer ); + + if( xTimerTaskHandle != NULL ) + { + xReturn = pdPASS; + } + } + #else /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ + { + xReturn = xTaskCreate( prvTimerTask, + configTIMER_SERVICE_TASK_NAME, + configTIMER_TASK_STACK_DEPTH, + NULL, + ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, + &xTimerTaskHandle ); + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + } + #endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + configASSERT( xReturn ); + + traceRETURN_xTimerCreateTimerTask( xReturn ); + + return xReturn; + } +/*-----------------------------------------------------------*/ + + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + TimerHandle_t xTimerCreate( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const BaseType_t xAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction ) + { + Timer_t * pxNewTimer; + + traceENTER_xTimerCreate( pcTimerName, xTimerPeriodInTicks, xAutoReload, pvTimerID, pxCallbackFunction ); + + /* MISRA Ref 11.5.1 [Malloc memory assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + pxNewTimer = ( Timer_t * ) pvPortMalloc( sizeof( Timer_t ) ); + + if( pxNewTimer != NULL ) + { + /* Status is thus far zero as the timer is not created statically + * and has not been started. The auto-reload bit may get set in + * prvInitialiseNewTimer. */ + pxNewTimer->ucStatus = 0x00; + prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, xAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer ); + } + + traceRETURN_xTimerCreate( pxNewTimer ); + + return pxNewTimer; + } + + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + + TimerHandle_t xTimerCreateStatic( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const BaseType_t xAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + StaticTimer_t * pxTimerBuffer ) + { + Timer_t * pxNewTimer; + + traceENTER_xTimerCreateStatic( pcTimerName, xTimerPeriodInTicks, xAutoReload, pvTimerID, pxCallbackFunction, pxTimerBuffer ); + + #if ( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + * variable of type StaticTimer_t equals the size of the real timer + * structure. */ + volatile size_t xSize = sizeof( StaticTimer_t ); + configASSERT( xSize == sizeof( Timer_t ) ); + ( void ) xSize; /* Prevent unused variable warning when configASSERT() is not defined. */ + } + #endif /* configASSERT_DEFINED */ + + /* A pointer to a StaticTimer_t structure MUST be provided, use it. */ + configASSERT( pxTimerBuffer ); + /* MISRA Ref 11.3.1 [Misaligned access] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */ + /* coverity[misra_c_2012_rule_11_3_violation] */ + pxNewTimer = ( Timer_t * ) pxTimerBuffer; + + if( pxNewTimer != NULL ) + { + /* Timers can be created statically or dynamically so note this + * timer was created statically in case it is later deleted. The + * auto-reload bit may get set in prvInitialiseNewTimer(). */ + pxNewTimer->ucStatus = ( uint8_t ) tmrSTATUS_IS_STATICALLY_ALLOCATED; + + prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, xAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer ); + } + + traceRETURN_xTimerCreateStatic( pxNewTimer ); + + return pxNewTimer; + } + + #endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + + static void prvInitialiseNewTimer( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const BaseType_t xAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + Timer_t * pxNewTimer ) + { + /* 0 is not a valid value for xTimerPeriodInTicks. */ + configASSERT( ( xTimerPeriodInTicks > 0 ) ); + + /* Ensure the infrastructure used by the timer service task has been + * created/initialised. */ + prvCheckForValidListAndQueue(); + + /* Initialise the timer structure members using the function + * parameters. */ + pxNewTimer->pcTimerName = pcTimerName; + pxNewTimer->xTimerPeriodInTicks = xTimerPeriodInTicks; + pxNewTimer->pvTimerID = pvTimerID; + pxNewTimer->pxCallbackFunction = pxCallbackFunction; + vListInitialiseItem( &( pxNewTimer->xTimerListItem ) ); + + if( xAutoReload != pdFALSE ) + { + pxNewTimer->ucStatus |= ( uint8_t ) tmrSTATUS_IS_AUTORELOAD; + } + + traceTIMER_CREATE( pxNewTimer ); + } +/*-----------------------------------------------------------*/ + + BaseType_t xTimerGenericCommandFromTask( TimerHandle_t xTimer, + const BaseType_t xCommandID, + const TickType_t xOptionalValue, + BaseType_t * const pxHigherPriorityTaskWoken, + const TickType_t xTicksToWait ) + { + BaseType_t xReturn = pdFAIL; + DaemonTaskMessage_t xMessage; + + ( void ) pxHigherPriorityTaskWoken; + + traceENTER_xTimerGenericCommandFromTask( xTimer, xCommandID, xOptionalValue, pxHigherPriorityTaskWoken, xTicksToWait ); + + configASSERT( xTimer ); + + /* Send a message to the timer service task to perform a particular action + * on a particular timer definition. */ + if( xTimerQueue != NULL ) + { + /* Send a command to the timer service task to start the xTimer timer. */ + xMessage.xMessageID = xCommandID; + xMessage.u.xTimerParameters.xMessageValue = xOptionalValue; + xMessage.u.xTimerParameters.pxTimer = xTimer; + + configASSERT( xCommandID < tmrFIRST_FROM_ISR_COMMAND ); + + if( xCommandID < tmrFIRST_FROM_ISR_COMMAND ) + { + if( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING ) + { + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait ); + } + else + { + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, tmrNO_DELAY ); + } + } + + traceTIMER_COMMAND_SEND( xTimer, xCommandID, xOptionalValue, xReturn ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_xTimerGenericCommandFromTask( xReturn ); + + return xReturn; + } +/*-----------------------------------------------------------*/ + + BaseType_t xTimerGenericCommandFromISR( TimerHandle_t xTimer, + const BaseType_t xCommandID, + const TickType_t xOptionalValue, + BaseType_t * const pxHigherPriorityTaskWoken, + const TickType_t xTicksToWait ) + { + BaseType_t xReturn = pdFAIL; + DaemonTaskMessage_t xMessage; + + ( void ) xTicksToWait; + + traceENTER_xTimerGenericCommandFromISR( xTimer, xCommandID, xOptionalValue, pxHigherPriorityTaskWoken, xTicksToWait ); + + configASSERT( xTimer ); + + /* Send a message to the timer service task to perform a particular action + * on a particular timer definition. */ + if( xTimerQueue != NULL ) + { + /* Send a command to the timer service task to start the xTimer timer. */ + xMessage.xMessageID = xCommandID; + xMessage.u.xTimerParameters.xMessageValue = xOptionalValue; + xMessage.u.xTimerParameters.pxTimer = xTimer; + + configASSERT( xCommandID >= tmrFIRST_FROM_ISR_COMMAND ); + + if( xCommandID >= tmrFIRST_FROM_ISR_COMMAND ) + { + xReturn = xQueueSendToBackFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken ); + } + + traceTIMER_COMMAND_SEND( xTimer, xCommandID, xOptionalValue, xReturn ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceRETURN_xTimerGenericCommandFromISR( xReturn ); + + return xReturn; + } +/*-----------------------------------------------------------*/ + + TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) + { + traceENTER_xTimerGetTimerDaemonTaskHandle(); + + /* If xTimerGetTimerDaemonTaskHandle() is called before the scheduler has been + * started, then xTimerTaskHandle will be NULL. */ + configASSERT( ( xTimerTaskHandle != NULL ) ); + + traceRETURN_xTimerGetTimerDaemonTaskHandle( xTimerTaskHandle ); + + return xTimerTaskHandle; + } +/*-----------------------------------------------------------*/ + + TickType_t xTimerGetPeriod( TimerHandle_t xTimer ) + { + Timer_t * pxTimer = xTimer; + + traceENTER_xTimerGetPeriod( xTimer ); + + configASSERT( xTimer ); + + traceRETURN_xTimerGetPeriod( pxTimer->xTimerPeriodInTicks ); + + return pxTimer->xTimerPeriodInTicks; + } +/*-----------------------------------------------------------*/ + + void vTimerSetReloadMode( TimerHandle_t xTimer, + const BaseType_t xAutoReload ) + { + Timer_t * pxTimer = xTimer; + + traceENTER_vTimerSetReloadMode( xTimer, xAutoReload ); + + configASSERT( xTimer ); + taskENTER_CRITICAL(); + { + if( xAutoReload != pdFALSE ) + { + pxTimer->ucStatus |= ( uint8_t ) tmrSTATUS_IS_AUTORELOAD; + } + else + { + pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_AUTORELOAD ); + } + } + taskEXIT_CRITICAL(); + + traceRETURN_vTimerSetReloadMode(); + } +/*-----------------------------------------------------------*/ + + BaseType_t xTimerGetReloadMode( TimerHandle_t xTimer ) + { + Timer_t * pxTimer = xTimer; + BaseType_t xReturn; + + traceENTER_xTimerGetReloadMode( xTimer ); + + configASSERT( xTimer ); + taskENTER_CRITICAL(); + { + if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) == 0U ) + { + /* Not an auto-reload timer. */ + xReturn = pdFALSE; + } + else + { + /* Is an auto-reload timer. */ + xReturn = pdTRUE; + } + } + taskEXIT_CRITICAL(); + + traceRETURN_xTimerGetReloadMode( xReturn ); + + return xReturn; + } + + UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer ) + { + UBaseType_t uxReturn; + + traceENTER_uxTimerGetReloadMode( xTimer ); + + uxReturn = ( UBaseType_t ) xTimerGetReloadMode( xTimer ); + + traceRETURN_uxTimerGetReloadMode( uxReturn ); + + return uxReturn; + } +/*-----------------------------------------------------------*/ + + TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ) + { + Timer_t * pxTimer = xTimer; + TickType_t xReturn; + + traceENTER_xTimerGetExpiryTime( xTimer ); + + configASSERT( xTimer ); + xReturn = listGET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ) ); + + traceRETURN_xTimerGetExpiryTime( xReturn ); + + return xReturn; + } +/*-----------------------------------------------------------*/ + + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + BaseType_t xTimerGetStaticBuffer( TimerHandle_t xTimer, + StaticTimer_t ** ppxTimerBuffer ) + { + BaseType_t xReturn; + Timer_t * pxTimer = xTimer; + + traceENTER_xTimerGetStaticBuffer( xTimer, ppxTimerBuffer ); + + configASSERT( ppxTimerBuffer != NULL ); + + if( ( pxTimer->ucStatus & tmrSTATUS_IS_STATICALLY_ALLOCATED ) != 0U ) + { + /* MISRA Ref 11.3.1 [Misaligned access] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */ + /* coverity[misra_c_2012_rule_11_3_violation] */ + *ppxTimerBuffer = ( StaticTimer_t * ) pxTimer; + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + traceRETURN_xTimerGetStaticBuffer( xReturn ); + + return xReturn; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + + const char * pcTimerGetName( TimerHandle_t xTimer ) + { + Timer_t * pxTimer = xTimer; + + traceENTER_pcTimerGetName( xTimer ); + + configASSERT( xTimer ); + + traceRETURN_pcTimerGetName( pxTimer->pcTimerName ); + + return pxTimer->pcTimerName; + } +/*-----------------------------------------------------------*/ + + static void prvReloadTimer( Timer_t * const pxTimer, + TickType_t xExpiredTime, + const TickType_t xTimeNow ) + { + /* Insert the timer into the appropriate list for the next expiry time. + * If the next expiry time has already passed, advance the expiry time, + * call the callback function, and try again. */ + while( prvInsertTimerInActiveList( pxTimer, ( xExpiredTime + pxTimer->xTimerPeriodInTicks ), xTimeNow, xExpiredTime ) != pdFALSE ) + { + /* Advance the expiry time. */ + xExpiredTime += pxTimer->xTimerPeriodInTicks; + + /* Call the timer callback. */ + traceTIMER_EXPIRED( pxTimer ); + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); + } + } +/*-----------------------------------------------------------*/ + + static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, + const TickType_t xTimeNow ) + { + /* MISRA Ref 11.5.3 [Void pointer assignment] */ + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */ + /* coverity[misra_c_2012_rule_11_5_violation] */ + Timer_t * const pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); + + /* Remove the timer from the list of active timers. A check has already + * been performed to ensure the list is not empty. */ + + ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); + + /* If the timer is an auto-reload timer then calculate the next + * expiry time and re-insert the timer in the list of active timers. */ + if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0U ) + { + prvReloadTimer( pxTimer, xNextExpireTime, xTimeNow ); + } + else + { + pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE ); + } + + /* Call the timer callback. */ + traceTIMER_EXPIRED( pxTimer ); + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); + } +/*-----------------------------------------------------------*/ + + static portTASK_FUNCTION( prvTimerTask, pvParameters ) + { + TickType_t xNextExpireTime; + BaseType_t xListWasEmpty; + + /* Just to avoid compiler warnings. */ + ( void ) pvParameters; + + #if ( configUSE_DAEMON_TASK_STARTUP_HOOK == 1 ) + { + /* Allow the application writer to execute some code in the context of + * this task at the point the task starts executing. This is useful if the + * application includes initialisation code that would benefit from + * executing after the scheduler has been started. */ + vApplicationDaemonTaskStartupHook(); + } + #endif /* configUSE_DAEMON_TASK_STARTUP_HOOK */ + + for( ; configCONTROL_INFINITE_LOOP(); ) + { + /* Query the timers list to see if it contains any timers, and if so, + * obtain the time at which the next timer will expire. */ + xNextExpireTime = prvGetNextExpireTime( &xListWasEmpty ); + + /* If a timer has expired, process it. Otherwise, block this task + * until either a timer does expire, or a command is received. */ + prvProcessTimerOrBlockTask( xNextExpireTime, xListWasEmpty ); + + /* Empty the command queue. */ + prvProcessReceivedCommands(); + } + } +/*-----------------------------------------------------------*/ + + static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, + BaseType_t xListWasEmpty ) + { + TickType_t xTimeNow; + BaseType_t xTimerListsWereSwitched; + + vTaskSuspendAll(); + { + /* Obtain the time now to make an assessment as to whether the timer + * has expired or not. If obtaining the time causes the lists to switch + * then don't process this timer as any timers that remained in the list + * when the lists were switched will have been processed within the + * prvSampleTimeNow() function. */ + xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); + + if( xTimerListsWereSwitched == pdFALSE ) + { + /* The tick count has not overflowed, has the timer expired? */ + if( ( xListWasEmpty == pdFALSE ) && ( xNextExpireTime <= xTimeNow ) ) + { + ( void ) xTaskResumeAll(); + prvProcessExpiredTimer( xNextExpireTime, xTimeNow ); + } + else + { + /* The tick count has not overflowed, and the next expire + * time has not been reached yet. This task should therefore + * block to wait for the next expire time or a command to be + * received - whichever comes first. The following line cannot + * be reached unless xNextExpireTime > xTimeNow, except in the + * case when the current timer list is empty. */ + if( xListWasEmpty != pdFALSE ) + { + /* The current timer list is empty - is the overflow list + * also empty? */ + xListWasEmpty = listLIST_IS_EMPTY( pxOverflowTimerList ); + } + + vQueueWaitForMessageRestricted( xTimerQueue, ( xNextExpireTime - xTimeNow ), xListWasEmpty ); + + if( xTaskResumeAll() == pdFALSE ) + { + /* Yield to wait for either a command to arrive, or the + * block time to expire. If a command arrived between the + * critical section being exited and this yield then the yield + * will not cause the task to block. */ + taskYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + else + { + ( void ) xTaskResumeAll(); + } + } + } +/*-----------------------------------------------------------*/ + + static TickType_t prvGetNextExpireTime( BaseType_t * const pxListWasEmpty ) + { + TickType_t xNextExpireTime; + + /* Timers are listed in expiry time order, with the head of the list + * referencing the task that will expire first. Obtain the time at which + * the timer with the nearest expiry time will expire. If there are no + * active timers then just set the next expire time to 0. That will cause + * this task to unblock when the tick count overflows, at which point the + * timer lists will be switched and the next expiry time can be + * re-assessed. */ + *pxListWasEmpty = listLIST_IS_EMPTY( pxCurrentTimerList ); + + if( *pxListWasEmpty == pdFALSE ) + { + xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); + } + else + { + /* Ensure the task unblocks when the tick count rolls over. */ + xNextExpireTime = ( TickType_t ) 0U; + } + + return xNextExpireTime; + } +/*-----------------------------------------------------------*/ + + static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched ) + { + TickType_t xTimeNow; + PRIVILEGED_DATA static TickType_t xLastTime = ( TickType_t ) 0U; + + xTimeNow = xTaskGetTickCount(); + + if( xTimeNow < xLastTime ) + { + prvSwitchTimerLists(); + *pxTimerListsWereSwitched = pdTRUE; + } + else + { + *pxTimerListsWereSwitched = pdFALSE; + } + + xLastTime = xTimeNow; + + return xTimeNow; + } +/*-----------------------------------------------------------*/ + + static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, + const TickType_t xNextExpiryTime, + const TickType_t xTimeNow, + const TickType_t xCommandTime ) + { + BaseType_t xProcessTimerNow = pdFALSE; + + listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xNextExpiryTime ); + listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer ); + + if( xNextExpiryTime <= xTimeNow ) + { + /* Has the expiry time elapsed between the command to start/reset a + * timer was issued, and the time the command was processed? */ + if( ( ( TickType_t ) ( xTimeNow - xCommandTime ) ) >= pxTimer->xTimerPeriodInTicks ) + { + /* The time between a command being issued and the command being + * processed actually exceeds the timers period. */ + xProcessTimerNow = pdTRUE; + } + else + { + vListInsert( pxOverflowTimerList, &( pxTimer->xTimerListItem ) ); + } + } + else + { + if( ( xTimeNow < xCommandTime ) && ( xNextExpiryTime >= xCommandTime ) ) + { + /* If, since the command was issued, the tick count has overflowed + * but the expiry time has not, then the timer must have already passed + * its expiry time and should be processed immediately. */ + xProcessTimerNow = pdTRUE; + } + else + { + vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) ); + } + } + + return xProcessTimerNow; + } +/*-----------------------------------------------------------*/ + + static void prvProcessReceivedCommands( void ) + { + DaemonTaskMessage_t xMessage = { 0 }; + Timer_t * pxTimer; + BaseType_t xTimerListsWereSwitched; + TickType_t xTimeNow; + + while( xQueueReceive( xTimerQueue, &xMessage, tmrNO_DELAY ) != pdFAIL ) + { + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) + { + /* Negative commands are pended function calls rather than timer + * commands. */ + if( xMessage.xMessageID < ( BaseType_t ) 0 ) + { + const CallbackParameters_t * const pxCallback = &( xMessage.u.xCallbackParameters ); + + /* The timer uses the xCallbackParameters member to request a + * callback be executed. Check the callback is not NULL. */ + configASSERT( pxCallback ); + + /* Call the function. */ + pxCallback->pxCallbackFunction( pxCallback->pvParameter1, pxCallback->ulParameter2 ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* INCLUDE_xTimerPendFunctionCall */ + + /* Commands that are positive are timer commands rather than pended + * function calls. */ + if( xMessage.xMessageID >= ( BaseType_t ) 0 ) + { + /* The messages uses the xTimerParameters member to work on a + * software timer. */ + pxTimer = xMessage.u.xTimerParameters.pxTimer; + + if( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) == pdFALSE ) + { + /* The timer is in a list, remove it. */ + ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceTIMER_COMMAND_RECEIVED( pxTimer, xMessage.xMessageID, xMessage.u.xTimerParameters.xMessageValue ); + + /* In this case the xTimerListsWereSwitched parameter is not used, but + * it must be present in the function call. prvSampleTimeNow() must be + * called after the message is received from xTimerQueue so there is no + * possibility of a higher priority task adding a message to the message + * queue with a time that is ahead of the timer daemon task (because it + * pre-empted the timer daemon task after the xTimeNow value was set). */ + xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); + + switch( xMessage.xMessageID ) + { + case tmrCOMMAND_START: + case tmrCOMMAND_START_FROM_ISR: + case tmrCOMMAND_RESET: + case tmrCOMMAND_RESET_FROM_ISR: + /* Start or restart a timer. */ + pxTimer->ucStatus |= ( uint8_t ) tmrSTATUS_IS_ACTIVE; + + if( prvInsertTimerInActiveList( pxTimer, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow, xMessage.u.xTimerParameters.xMessageValue ) != pdFALSE ) + { + /* The timer expired before it was added to the active + * timer list. Process it now. */ + if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0U ) + { + prvReloadTimer( pxTimer, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow ); + } + else + { + pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE ); + } + + /* Call the timer callback. */ + traceTIMER_EXPIRED( pxTimer ); + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + break; + + case tmrCOMMAND_STOP: + case tmrCOMMAND_STOP_FROM_ISR: + /* The timer has already been removed from the active list. */ + pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE ); + break; + + case tmrCOMMAND_CHANGE_PERIOD: + case tmrCOMMAND_CHANGE_PERIOD_FROM_ISR: + pxTimer->ucStatus |= ( uint8_t ) tmrSTATUS_IS_ACTIVE; + pxTimer->xTimerPeriodInTicks = xMessage.u.xTimerParameters.xMessageValue; + configASSERT( ( pxTimer->xTimerPeriodInTicks > 0 ) ); + + /* The new period does not really have a reference, and can + * be longer or shorter than the old one. The command time is + * therefore set to the current time, and as the period cannot + * be zero the next expiry time can only be in the future, + * meaning (unlike for the xTimerStart() case above) there is + * no fail case that needs to be handled here. */ + ( void ) prvInsertTimerInActiveList( pxTimer, ( xTimeNow + pxTimer->xTimerPeriodInTicks ), xTimeNow, xTimeNow ); + break; + + case tmrCOMMAND_DELETE: + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* The timer has already been removed from the active list, + * just free up the memory if the memory was dynamically + * allocated. */ + if( ( pxTimer->ucStatus & tmrSTATUS_IS_STATICALLY_ALLOCATED ) == ( uint8_t ) 0 ) + { + vPortFree( pxTimer ); + } + else + { + pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE ); + } + } + #else /* if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) */ + { + /* If dynamic allocation is not enabled, the memory + * could not have been dynamically allocated. So there is + * no need to free the memory - just mark the timer as + * "not active". */ + pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE ); + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + break; + + default: + /* Don't expect to get here. */ + break; + } + } + } + } +/*-----------------------------------------------------------*/ + + static void prvSwitchTimerLists( void ) + { + TickType_t xNextExpireTime; + List_t * pxTemp; + + /* The tick count has overflowed. The timer lists must be switched. + * If there are any timers still referenced from the current timer list + * then they must have expired and should be processed before the lists + * are switched. */ + while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE ) + { + xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); + + /* Process the expired timer. For auto-reload timers, be careful to + * process only expirations that occur on the current list. Further + * expirations must wait until after the lists are switched. */ + prvProcessExpiredTimer( xNextExpireTime, tmrMAX_TIME_BEFORE_OVERFLOW ); + } + + pxTemp = pxCurrentTimerList; + pxCurrentTimerList = pxOverflowTimerList; + pxOverflowTimerList = pxTemp; + } +/*-----------------------------------------------------------*/ + + static void prvCheckForValidListAndQueue( void ) + { + /* Check that the list from which active timers are referenced, and the + * queue used to communicate with the timer service, have been + * initialised. */ + taskENTER_CRITICAL(); + { + if( xTimerQueue == NULL ) + { + vListInitialise( &xActiveTimerList1 ); + vListInitialise( &xActiveTimerList2 ); + pxCurrentTimerList = &xActiveTimerList1; + pxOverflowTimerList = &xActiveTimerList2; + + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* The timer queue is allocated statically in case + * configSUPPORT_DYNAMIC_ALLOCATION is 0. */ + PRIVILEGED_DATA static StaticQueue_t xStaticTimerQueue; + PRIVILEGED_DATA static uint8_t ucStaticTimerQueueStorage[ ( size_t ) configTIMER_QUEUE_LENGTH * sizeof( DaemonTaskMessage_t ) ]; + + xTimerQueue = xQueueCreateStatic( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, ( UBaseType_t ) sizeof( DaemonTaskMessage_t ), &( ucStaticTimerQueueStorage[ 0 ] ), &xStaticTimerQueue ); + } + #else + { + xTimerQueue = xQueueCreate( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, ( UBaseType_t ) sizeof( DaemonTaskMessage_t ) ); + } + #endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ + + #if ( configQUEUE_REGISTRY_SIZE > 0 ) + { + if( xTimerQueue != NULL ) + { + vQueueAddToRegistry( xTimerQueue, "TmrQ" ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configQUEUE_REGISTRY_SIZE */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + } +/*-----------------------------------------------------------*/ + + BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ) + { + BaseType_t xReturn; + Timer_t * pxTimer = xTimer; + + traceENTER_xTimerIsTimerActive( xTimer ); + + configASSERT( xTimer ); + + /* Is the timer in the list of active timers? */ + taskENTER_CRITICAL(); + { + if( ( pxTimer->ucStatus & tmrSTATUS_IS_ACTIVE ) == 0U ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + } + taskEXIT_CRITICAL(); + + traceRETURN_xTimerIsTimerActive( xReturn ); + + return xReturn; + } +/*-----------------------------------------------------------*/ + + void * pvTimerGetTimerID( const TimerHandle_t xTimer ) + { + Timer_t * const pxTimer = xTimer; + void * pvReturn; + + traceENTER_pvTimerGetTimerID( xTimer ); + + configASSERT( xTimer ); + + taskENTER_CRITICAL(); + { + pvReturn = pxTimer->pvTimerID; + } + taskEXIT_CRITICAL(); + + traceRETURN_pvTimerGetTimerID( pvReturn ); + + return pvReturn; + } +/*-----------------------------------------------------------*/ + + void vTimerSetTimerID( TimerHandle_t xTimer, + void * pvNewID ) + { + Timer_t * const pxTimer = xTimer; + + traceENTER_vTimerSetTimerID( xTimer, pvNewID ); + + configASSERT( xTimer ); + + taskENTER_CRITICAL(); + { + pxTimer->pvTimerID = pvNewID; + } + taskEXIT_CRITICAL(); + + traceRETURN_vTimerSetTimerID(); + } +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) + + BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, + void * pvParameter1, + uint32_t ulParameter2, + BaseType_t * pxHigherPriorityTaskWoken ) + { + DaemonTaskMessage_t xMessage; + BaseType_t xReturn; + + traceENTER_xTimerPendFunctionCallFromISR( xFunctionToPend, pvParameter1, ulParameter2, pxHigherPriorityTaskWoken ); + + /* Complete the message with the function parameters and post it to the + * daemon task. */ + xMessage.xMessageID = tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR; + xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend; + xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1; + xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2; + + xReturn = xQueueSendFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken ); + + tracePEND_FUNC_CALL_FROM_ISR( xFunctionToPend, pvParameter1, ulParameter2, xReturn ); + traceRETURN_xTimerPendFunctionCallFromISR( xReturn ); + + return xReturn; + } + + #endif /* INCLUDE_xTimerPendFunctionCall */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) + + BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, + void * pvParameter1, + uint32_t ulParameter2, + TickType_t xTicksToWait ) + { + DaemonTaskMessage_t xMessage; + BaseType_t xReturn; + + traceENTER_xTimerPendFunctionCall( xFunctionToPend, pvParameter1, ulParameter2, xTicksToWait ); + + /* This function can only be called after a timer has been created or + * after the scheduler has been started because, until then, the timer + * queue does not exist. */ + configASSERT( xTimerQueue ); + + /* Complete the message with the function parameters and post it to the + * daemon task. */ + xMessage.xMessageID = tmrCOMMAND_EXECUTE_CALLBACK; + xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend; + xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1; + xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2; + + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait ); + + tracePEND_FUNC_CALL( xFunctionToPend, pvParameter1, ulParameter2, xReturn ); + traceRETURN_xTimerPendFunctionCall( xReturn ); + + return xReturn; + } + + #endif /* INCLUDE_xTimerPendFunctionCall */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxTimerGetTimerNumber( TimerHandle_t xTimer ) + { + traceENTER_uxTimerGetTimerNumber( xTimer ); + + traceRETURN_uxTimerGetTimerNumber( ( ( Timer_t * ) xTimer )->uxTimerNumber ); + + return ( ( Timer_t * ) xTimer )->uxTimerNumber; + } + + #endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TRACE_FACILITY == 1 ) + + void vTimerSetTimerNumber( TimerHandle_t xTimer, + UBaseType_t uxTimerNumber ) + { + traceENTER_vTimerSetTimerNumber( xTimer, uxTimerNumber ); + + ( ( Timer_t * ) xTimer )->uxTimerNumber = uxTimerNumber; + + traceRETURN_vTimerSetTimerNumber(); + } + + #endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +/* This entire source file will be skipped if the application is not configured + * to include software timer functionality. If you want to include software timer + * functionality then ensure configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ +#endif /* configUSE_TIMERS == 1 */ + diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB01.c b/TSM_PicoW_Sensor/McuLib/HD44780/DB01.c new file mode 100644 index 0000000..6e88136 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB01.c @@ -0,0 +1,537 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : DB01.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : DB01 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool DB01_GetDir(void); +** SetDir - void DB01_SetDir(bool Dir); +** SetInput - void DB01_SetInput(void); +** SetOutput - void DB01_SetOutput(void); +** GetVal - bool DB01_GetVal(void); +** PutVal - void DB01_PutVal(bool Val); +** ClrVal - void DB01_ClrVal(void); +** SetVal - void DB01_SetVal(void); +** NegVal - void DB01_NegVal(void); +** Init - void DB01_Init(void); +** Deinit - void DB01_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file DB01.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup DB01_module DB01 module documentation +** @{ +*/ + +/* MODULE DB01. */ + +#include "DB01.h" +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if DB01_CONFIG_DO_PIN_MUXING + #if McuLib_CONFIG_CPU_IS_LPC + #include "fsl_iocon.h" /* include SDK header file for I/O connection muxing */ + #else /* Kinetis */ + #include "fsl_port.h" /* include SDK header file for port muxing */ + #endif + #endif + #include "fsl_gpio.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + #include "pins_gpio_hw_access.h" + #include "pins_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + #include "nrf_gpio.h" +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + #include "McuGPIO.h" +#else + #error "Unsupported SDK!" +#endif + +#if McuLib_CONFIG_NXP_SDK_2_0_USED + static const gpio_pin_config_t DB01_configOutput = { + kGPIO_DigitalOutput, /* use as output pin */ + DB01_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; + + static const gpio_pin_config_t DB01_configInput = { + kGPIO_DigitalInput, /* use as input pin */ + DB01_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + const gpio_output_pin_user_config_t DB01_OutputConfig[] = { + { + .pinName = DB01_CONFIG_PIN_SYMBOL, + .config.outputLogic = DB01_CONFIG_INIT_PIN_VALUE, + #if FSL_FEATURE_PORT_HAS_SLEW_RATE + .config.slewRate = kPortSlowSlewRate, + #endif + #if FSL_FEATURE_PORT_HAS_OPEN_DRAIN + .config.isOpenDrainEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH + .config.driveStrength = kPortLowDriveStrength, + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; + + const gpio_input_pin_user_config_t DB01_InputConfig[] = { + { + .pinName = DB01_CONFIG_PIN_SYMBOL, + #if FSL_FEATURE_PORT_HAS_PULL_ENABLE + #if DB01_CONFIG_PULL_RESISTOR==0 /* 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ + .config.isPullEnable = false, + #else + .config.isPullEnable = true, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PULL_SELECTION + #if DB01_CONFIG_PULL_RESISTOR==1 + .config.pullSelect = kPortPullUp, + #else + .config.pullSelect = kPortPullDown, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER + .config.isPassiveFilterEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER + .config.isDigitalFilterEnabled = true, + #endif + #if FSL_FEATURE_GPIO_HAS_INTERRUPT_VECTOR + .config.interrupt = kPortIntDisabled + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + static McuGPIO_Handle_t pin; +#endif + +static bool DB01_isOutput = false; +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB01_ClrVal(void) +{ +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if McuLib_CONFIG_CPU_IS_LPC + GPIO_PortClear(DB01_CONFIG_GPIO_NAME, DB01_CONFIG_PORT_NAME, 1< input */ + PINS_DRV_SetPinsDirection(DB01_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_input(DB01_CONFIG_PIN_NUMBER, NRF_GPIO_PIN_NOPULL); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsInput(pin); +#endif + DB01_isOutput = false; +} + +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB01_SetOutput(void) +{ +#if McuLib_CONFIG_CPU_IS_LPC + GPIO_PinInit(DB01_CONFIG_GPIO_NAME, DB01_CONFIG_PORT_NAME, DB01_CONFIG_PIN_NUMBER, &DB01_configOutput); +#elif McuLib_CONFIG_NXP_SDK_2_0_USED + GPIO_PinInit(DB01_CONFIG_GPIO_NAME, DB01_CONFIG_PIN_NUMBER, &DB01_configOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + GPIO_DRV_SetPinDir(DB01_CONFIG_PIN_SYMBOL, kGpioDigitalOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + pins_channel_type_t val; + + val = PINS_GPIO_GetPinsDirection(DB01_CONFIG_PORT_NAME); /* bit 0: pin is input; 1: pin is output */ + val |= (1< output */ + PINS_DRV_SetPinsDirection(DB01_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_output(DB01_CONFIG_PIN_NUMBER); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsOutput(pin, false /* don't care */); +#endif + DB01_isOutput = true; +} + +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ +void DB01_PutVal(bool Val) +{ +#if McuLib_CONFIG_CPU_IS_LPC + if (Val) { + GPIO_PortSet(DB01_CONFIG_GPIO_NAME, DB01_CONFIG_PORT_NAME, 1<_ */ + _IOCON_PIO_FUNC0 | + /* Selects pull-up function */ + _IOCON_PIO_MODE_PULLUP | + /* Standard mode, output slew rate control is enabled */ + _IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + _IOCON_PIO_INV_DI | + /* Enables digital function */ + _IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + _IOCON_PIO_OPENDRAIN_DI); + #if (McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0) + IOCON_PinMuxSet(DB01_CONFIG_PORT_NAME, DB01_CONFIG_PIN_NUMBER, port_pin_config); + #else + IOCON_PinMuxSet(IOCON, DB01_CONFIG_PORT_NAME, DB01_CONFIG_PIN_NUMBER, port_pin_config); + #endif + #else + PORT_SetPinMux(DB01_CONFIG_PORT_NAME, DB01_CONFIG_PIN_NUMBER, kPORT_MuxAsGpio); /* mux as GPIO */ + #endif + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + /*! Pin Muxing not implemented */ + GPIO_DRV_Init(DB01_InputConfig, DB01_OutputConfig); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + /* the following needs to be called in the application first: + PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); + */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + config.hw.pin = DB01_CONFIG_PIN_NUMBER; + config.isInput = true; + pin = McuGPIO_InitGPIO(&config); +#endif +#if DB01_CONFIG_INIT_PIN_DIRECTION == DB01_CONFIG_INIT_PIN_DIRECTION_INPUT + DB01_SetInput(); +#elif DB01_CONFIG_INIT_PIN_DIRECTION == DB01_CONFIG_INIT_PIN_DIRECTION_OUTPUT + DB01_SetOutput(); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB01_Deinit(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + pin = McuGPIO_DeinitGPIO(pin); +#endif +} + +/* END DB01. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB01.h b/TSM_PicoW_Sensor/McuLib/HD44780/DB01.h new file mode 100644 index 0000000..f554991 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB01.h @@ -0,0 +1,243 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : DB01.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : DB01 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool DB01_GetDir(void); +** SetDir - void DB01_SetDir(bool Dir); +** SetInput - void DB01_SetInput(void); +** SetOutput - void DB01_SetOutput(void); +** GetVal - bool DB01_GetVal(void); +** PutVal - void DB01_PutVal(bool Val); +** ClrVal - void DB01_ClrVal(void); +** SetVal - void DB01_SetVal(void); +** NegVal - void DB01_NegVal(void); +** Init - void DB01_Init(void); +** Deinit - void DB01_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file DB01.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup DB01_module DB01 module documentation +** @{ +*/ + +#ifndef __DB01_H +#define __DB01_H + +/* MODULE DB01. */ +#include "McuLib.h" /* SDK and API used */ +#include "DB01config.h" /* configuration */ + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" + + /* only GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF and GPIOG are currently supported */ + #define DB01_GPIO_IDX GPIOA_IDX /* GPIOA */ + + enum DB01_pinNames{ + DB01_CONFIG_PIN_SYMBOL = GPIO_MAKE_PIN(DB01_GPIO_IDX, DB01_CONFIG_PIN_NUMBER), + }; + + extern const gpio_output_pin_user_config_t DB01_OutputConfig[]; + extern const gpio_input_pin_user_config_t DB01_InputConfig[]; +#endif + +void DB01_Init(void); +/* +** =================================================================== +** Method : Init (component SDK_BitIO) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB01_ClrVal(void); +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB01_SetVal(void); +/* +** =================================================================== +** Method : SetVal (component SDK_BitIO) +** +** Description : +** Sets the pin value to a high value. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB01_NegVal(void); +/* +** =================================================================== +** Method : NegVal (component SDK_BitIO) +** +** Description : +** Toggles/negates the pin value +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB01_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +bool DB01_GetVal(void); +/* +** =================================================================== +** Method : GetVal (component SDK_BitIO) +** +** Description : +** Returns the pin value +** Parameters : None +** Returns : +** --- - Returns the value of the pin: +** FALSE/logical level '0' or TRUE/logical +** level '1' +** =================================================================== +*/ + +bool DB01_GetDir(void); +/* +** =================================================================== +** Method : GetDir (component SDK_BitIO) +** +** Description : +** Return the direction of the pin (input/output) +** Parameters : None +** Returns : +** --- - FALSE if port is input, TRUE if port is +** output +** =================================================================== +*/ + +void DB01_SetDir(bool Dir); +/* +** =================================================================== +** Method : SetDir (component SDK_BitIO) +** +** Description : +** Sets the direction of the pin (input or output) +** Parameters : +** NAME - DESCRIPTION +** Dir - FALSE: input, TRUE: output +** Returns : Nothing +** =================================================================== +*/ + +void DB01_SetInput(void); +/* +** =================================================================== +** Method : SetInput (component SDK_BitIO) +** +** Description : +** Sets the pin as input +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB01_SetOutput(void); +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB01_PutVal(bool Val); +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ + +/* END DB01. */ + +#endif +/* ifndef __DB01_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB01config.h b/TSM_PicoW_Sensor/McuLib/HD44780/DB01config.h new file mode 100644 index 0000000..1c6be70 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB01config.h @@ -0,0 +1,87 @@ +/** + * \file + * \brief Configuration header file for SDK_BitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SDK Bit I/O module. + */ + +#ifndef __DB01_CONFIG_H +#define __DB01_CONFIG_H + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_MCUXPRESSO_2_0 + #include "pin_mux.h" /* include pin muxing header file */ + + #if defined(BOARD_INITPINS_DB01_PIN) + #define DB01_CONFIG_PIN_NUMBER BOARD_INITPINS_DB01_PIN + #endif + #if defined(BOARD_INITPINS_DB01_GPIO) + #define DB01_CONFIG_GPIO_NAME BOARD_INITPINS_DB01_GPIO + #endif + #if defined(BOARD_INITPINS_DB01_PORT) + #define DB01_CONFIG_PORT_NAME BOARD_INITPINS_DB01_PORT + #endif +#endif + +#ifndef DB01_CONFIG_PORT_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define DB01_CONFIG_PORT_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define DB01_CONFIG_PORT_NAME 0 + #else /* name from properties */ + #define DB01_CONFIG_PORT_NAME PORTA + #endif + /*!< name of PORT, is pointer to PORT_Type */ +#endif + +#ifndef DB01_CONFIG_GPIO_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define DB01_CONFIG_GPIO_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define DB01_CONFIG_GPIO_NAME GPIO + #elif McuLib_CONFIG_CPU_IS_KINETIS && McuLib_CONFIG_IS_KINETIS_KE + #define DB01_CONFIG_GPIO_NAME 0 + #elif McuLib_CONFIG_CPU_IS_MCX + #define DB01_CONFIG_GPIO_NAME GPIO0 + #else /* name from properties */ + #define DB01_CONFIG_GPIO_NAME GPIOA + #endif + /*!< name of GPIO, is pointer to GPIO_Type, not used for S32K SDK */ +#endif + +#ifndef DB01_CONFIG_PIN_NUMBER + #define DB01_CONFIG_PIN_NUMBER 0u + /*!< number of pin, type unsigned integer */ +#endif + +#ifndef DB01_CONFIG_PIN_SYMBOL + #define DB01_CONFIG_PIN_SYMBOL LED_RED + /*!< symbolic name for pin, used for NXP SDK V1.3 */ +#endif + +#ifndef DB01_CONFIG_INIT_PIN_VALUE + #define DB01_CONFIG_INIT_PIN_VALUE 0 + /*!< 0: Pin data is initialized with 0 (low); 1: pin value is initialized with 1 (high) */ +#endif + +/* different types of pin direction settings */ +#define DB01_CONFIG_INIT_PIN_DIRECTION_NONE (0) +#define DB01_CONFIG_INIT_PIN_DIRECTION_INPUT (1) +#define DB01_CONFIG_INIT_PIN_DIRECTION_OUTPUT (2) + +#ifndef DB01_CONFIG_INIT_PIN_DIRECTION + #define DB01_CONFIG_INIT_PIN_DIRECTION DB01_CONFIG_INIT_PIN_DIRECTION_OUTPUT +#endif + +#ifndef DB01_CONFIG_DO_PIN_MUXING + #define DB01_CONFIG_DO_PIN_MUXING 0 + /*!< 1: perform pin muxing in Init(), 0: do not do pin muxing */ +#endif + +#ifndef DB01_CONFIG_PULL_RESISTOR + #define DB01_CONFIG_PULL_RESISTOR 0 + /*!< pull resistor setting. 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ +#endif + +#endif /* __DB01_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB11.c b/TSM_PicoW_Sensor/McuLib/HD44780/DB11.c new file mode 100644 index 0000000..5406f52 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB11.c @@ -0,0 +1,537 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : DB11.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : DB11 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool DB11_GetDir(void); +** SetDir - void DB11_SetDir(bool Dir); +** SetInput - void DB11_SetInput(void); +** SetOutput - void DB11_SetOutput(void); +** GetVal - bool DB11_GetVal(void); +** PutVal - void DB11_PutVal(bool Val); +** ClrVal - void DB11_ClrVal(void); +** SetVal - void DB11_SetVal(void); +** NegVal - void DB11_NegVal(void); +** Init - void DB11_Init(void); +** Deinit - void DB11_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file DB11.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup DB11_module DB11 module documentation +** @{ +*/ + +/* MODULE DB11. */ + +#include "DB11.h" +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if DB11_CONFIG_DO_PIN_MUXING + #if McuLib_CONFIG_CPU_IS_LPC + #include "fsl_iocon.h" /* include SDK header file for I/O connection muxing */ + #else /* Kinetis */ + #include "fsl_port.h" /* include SDK header file for port muxing */ + #endif + #endif + #include "fsl_gpio.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + #include "pins_gpio_hw_access.h" + #include "pins_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + #include "nrf_gpio.h" +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + #include "McuGPIO.h" +#else + #error "Unsupported SDK!" +#endif + +#if McuLib_CONFIG_NXP_SDK_2_0_USED + static const gpio_pin_config_t DB11_configOutput = { + kGPIO_DigitalOutput, /* use as output pin */ + DB11_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; + + static const gpio_pin_config_t DB11_configInput = { + kGPIO_DigitalInput, /* use as input pin */ + DB11_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + const gpio_output_pin_user_config_t DB11_OutputConfig[] = { + { + .pinName = DB11_CONFIG_PIN_SYMBOL, + .config.outputLogic = DB11_CONFIG_INIT_PIN_VALUE, + #if FSL_FEATURE_PORT_HAS_SLEW_RATE + .config.slewRate = kPortSlowSlewRate, + #endif + #if FSL_FEATURE_PORT_HAS_OPEN_DRAIN + .config.isOpenDrainEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH + .config.driveStrength = kPortLowDriveStrength, + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; + + const gpio_input_pin_user_config_t DB11_InputConfig[] = { + { + .pinName = DB11_CONFIG_PIN_SYMBOL, + #if FSL_FEATURE_PORT_HAS_PULL_ENABLE + #if DB11_CONFIG_PULL_RESISTOR==0 /* 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ + .config.isPullEnable = false, + #else + .config.isPullEnable = true, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PULL_SELECTION + #if DB11_CONFIG_PULL_RESISTOR==1 + .config.pullSelect = kPortPullUp, + #else + .config.pullSelect = kPortPullDown, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER + .config.isPassiveFilterEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER + .config.isDigitalFilterEnabled = true, + #endif + #if FSL_FEATURE_GPIO_HAS_INTERRUPT_VECTOR + .config.interrupt = kPortIntDisabled + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + static McuGPIO_Handle_t pin; +#endif + +static bool DB11_isOutput = false; +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB11_ClrVal(void) +{ +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if McuLib_CONFIG_CPU_IS_LPC + GPIO_PortClear(DB11_CONFIG_GPIO_NAME, DB11_CONFIG_PORT_NAME, 1< input */ + PINS_DRV_SetPinsDirection(DB11_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_input(DB11_CONFIG_PIN_NUMBER, NRF_GPIO_PIN_NOPULL); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsInput(pin); +#endif + DB11_isOutput = false; +} + +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB11_SetOutput(void) +{ +#if McuLib_CONFIG_CPU_IS_LPC + GPIO_PinInit(DB11_CONFIG_GPIO_NAME, DB11_CONFIG_PORT_NAME, DB11_CONFIG_PIN_NUMBER, &DB11_configOutput); +#elif McuLib_CONFIG_NXP_SDK_2_0_USED + GPIO_PinInit(DB11_CONFIG_GPIO_NAME, DB11_CONFIG_PIN_NUMBER, &DB11_configOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + GPIO_DRV_SetPinDir(DB11_CONFIG_PIN_SYMBOL, kGpioDigitalOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + pins_channel_type_t val; + + val = PINS_GPIO_GetPinsDirection(DB11_CONFIG_PORT_NAME); /* bit 0: pin is input; 1: pin is output */ + val |= (1< output */ + PINS_DRV_SetPinsDirection(DB11_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_output(DB11_CONFIG_PIN_NUMBER); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsOutput(pin, false /* don't care */); +#endif + DB11_isOutput = true; +} + +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ +void DB11_PutVal(bool Val) +{ +#if McuLib_CONFIG_CPU_IS_LPC + if (Val) { + GPIO_PortSet(DB11_CONFIG_GPIO_NAME, DB11_CONFIG_PORT_NAME, 1<_ */ + _IOCON_PIO_FUNC0 | + /* Selects pull-up function */ + _IOCON_PIO_MODE_PULLUP | + /* Standard mode, output slew rate control is enabled */ + _IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + _IOCON_PIO_INV_DI | + /* Enables digital function */ + _IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + _IOCON_PIO_OPENDRAIN_DI); + #if (McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0) + IOCON_PinMuxSet(DB11_CONFIG_PORT_NAME, DB11_CONFIG_PIN_NUMBER, port_pin_config); + #else + IOCON_PinMuxSet(IOCON, DB11_CONFIG_PORT_NAME, DB11_CONFIG_PIN_NUMBER, port_pin_config); + #endif + #else + PORT_SetPinMux(DB11_CONFIG_PORT_NAME, DB11_CONFIG_PIN_NUMBER, kPORT_MuxAsGpio); /* mux as GPIO */ + #endif + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + /*! Pin Muxing not implemented */ + GPIO_DRV_Init(DB11_InputConfig, DB11_OutputConfig); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + /* the following needs to be called in the application first: + PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); + */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + config.hw.pin = DB11_CONFIG_PIN_NUMBER; + config.isInput = true; + pin = McuGPIO_InitGPIO(&config); +#endif +#if DB11_CONFIG_INIT_PIN_DIRECTION == DB11_CONFIG_INIT_PIN_DIRECTION_INPUT + DB11_SetInput(); +#elif DB11_CONFIG_INIT_PIN_DIRECTION == DB11_CONFIG_INIT_PIN_DIRECTION_OUTPUT + DB11_SetOutput(); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB11_Deinit(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + pin = McuGPIO_DeinitGPIO(pin); +#endif +} + +/* END DB11. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB11.h b/TSM_PicoW_Sensor/McuLib/HD44780/DB11.h new file mode 100644 index 0000000..c7044ae --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB11.h @@ -0,0 +1,243 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : DB11.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : DB11 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool DB11_GetDir(void); +** SetDir - void DB11_SetDir(bool Dir); +** SetInput - void DB11_SetInput(void); +** SetOutput - void DB11_SetOutput(void); +** GetVal - bool DB11_GetVal(void); +** PutVal - void DB11_PutVal(bool Val); +** ClrVal - void DB11_ClrVal(void); +** SetVal - void DB11_SetVal(void); +** NegVal - void DB11_NegVal(void); +** Init - void DB11_Init(void); +** Deinit - void DB11_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file DB11.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup DB11_module DB11 module documentation +** @{ +*/ + +#ifndef __DB11_H +#define __DB11_H + +/* MODULE DB11. */ +#include "McuLib.h" /* SDK and API used */ +#include "DB11config.h" /* configuration */ + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" + + /* only GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF and GPIOG are currently supported */ + #define DB11_GPIO_IDX GPIOA_IDX /* GPIOA */ + + enum DB11_pinNames{ + DB11_CONFIG_PIN_SYMBOL = GPIO_MAKE_PIN(DB11_GPIO_IDX, DB11_CONFIG_PIN_NUMBER), + }; + + extern const gpio_output_pin_user_config_t DB11_OutputConfig[]; + extern const gpio_input_pin_user_config_t DB11_InputConfig[]; +#endif + +void DB11_Init(void); +/* +** =================================================================== +** Method : Init (component SDK_BitIO) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB11_ClrVal(void); +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB11_SetVal(void); +/* +** =================================================================== +** Method : SetVal (component SDK_BitIO) +** +** Description : +** Sets the pin value to a high value. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB11_NegVal(void); +/* +** =================================================================== +** Method : NegVal (component SDK_BitIO) +** +** Description : +** Toggles/negates the pin value +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB11_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +bool DB11_GetVal(void); +/* +** =================================================================== +** Method : GetVal (component SDK_BitIO) +** +** Description : +** Returns the pin value +** Parameters : None +** Returns : +** --- - Returns the value of the pin: +** FALSE/logical level '0' or TRUE/logical +** level '1' +** =================================================================== +*/ + +bool DB11_GetDir(void); +/* +** =================================================================== +** Method : GetDir (component SDK_BitIO) +** +** Description : +** Return the direction of the pin (input/output) +** Parameters : None +** Returns : +** --- - FALSE if port is input, TRUE if port is +** output +** =================================================================== +*/ + +void DB11_SetDir(bool Dir); +/* +** =================================================================== +** Method : SetDir (component SDK_BitIO) +** +** Description : +** Sets the direction of the pin (input or output) +** Parameters : +** NAME - DESCRIPTION +** Dir - FALSE: input, TRUE: output +** Returns : Nothing +** =================================================================== +*/ + +void DB11_SetInput(void); +/* +** =================================================================== +** Method : SetInput (component SDK_BitIO) +** +** Description : +** Sets the pin as input +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB11_SetOutput(void); +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB11_PutVal(bool Val); +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ + +/* END DB11. */ + +#endif +/* ifndef __DB11_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB11config.h b/TSM_PicoW_Sensor/McuLib/HD44780/DB11config.h new file mode 100644 index 0000000..9364556 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB11config.h @@ -0,0 +1,87 @@ +/** + * \file + * \brief Configuration header file for SDK_BitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SDK Bit I/O module. + */ + +#ifndef __DB11_CONFIG_H +#define __DB11_CONFIG_H + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_MCUXPRESSO_2_0 + #include "pin_mux.h" /* include pin muxing header file */ + + #if defined(BOARD_INITPINS_DB11_PIN) + #define DB11_CONFIG_PIN_NUMBER BOARD_INITPINS_DB11_PIN + #endif + #if defined(BOARD_INITPINS_DB11_GPIO) + #define DB11_CONFIG_GPIO_NAME BOARD_INITPINS_DB11_GPIO + #endif + #if defined(BOARD_INITPINS_DB11_PORT) + #define DB11_CONFIG_PORT_NAME BOARD_INITPINS_DB11_PORT + #endif +#endif + +#ifndef DB11_CONFIG_PORT_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define DB11_CONFIG_PORT_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define DB11_CONFIG_PORT_NAME 0 + #else /* name from properties */ + #define DB11_CONFIG_PORT_NAME PORTA + #endif + /*!< name of PORT, is pointer to PORT_Type */ +#endif + +#ifndef DB11_CONFIG_GPIO_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define DB11_CONFIG_GPIO_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define DB11_CONFIG_GPIO_NAME GPIO + #elif McuLib_CONFIG_CPU_IS_KINETIS && McuLib_CONFIG_IS_KINETIS_KE + #define DB11_CONFIG_GPIO_NAME 0 + #elif McuLib_CONFIG_CPU_IS_MCX + #define DB11_CONFIG_GPIO_NAME GPIO0 + #else /* name from properties */ + #define DB11_CONFIG_GPIO_NAME GPIOA + #endif + /*!< name of GPIO, is pointer to GPIO_Type, not used for S32K SDK */ +#endif + +#ifndef DB11_CONFIG_PIN_NUMBER + #define DB11_CONFIG_PIN_NUMBER 0u + /*!< number of pin, type unsigned integer */ +#endif + +#ifndef DB11_CONFIG_PIN_SYMBOL + #define DB11_CONFIG_PIN_SYMBOL LED_RED + /*!< symbolic name for pin, used for NXP SDK V1.3 */ +#endif + +#ifndef DB11_CONFIG_INIT_PIN_VALUE + #define DB11_CONFIG_INIT_PIN_VALUE 0 + /*!< 0: Pin data is initialized with 0 (low); 1: pin value is initialized with 1 (high) */ +#endif + +/* different types of pin direction settings */ +#define DB11_CONFIG_INIT_PIN_DIRECTION_NONE (0) +#define DB11_CONFIG_INIT_PIN_DIRECTION_INPUT (1) +#define DB11_CONFIG_INIT_PIN_DIRECTION_OUTPUT (2) + +#ifndef DB11_CONFIG_INIT_PIN_DIRECTION + #define DB11_CONFIG_INIT_PIN_DIRECTION DB11_CONFIG_INIT_PIN_DIRECTION_OUTPUT +#endif + +#ifndef DB11_CONFIG_DO_PIN_MUXING + #define DB11_CONFIG_DO_PIN_MUXING 0 + /*!< 1: perform pin muxing in Init(), 0: do not do pin muxing */ +#endif + +#ifndef DB11_CONFIG_PULL_RESISTOR + #define DB11_CONFIG_PULL_RESISTOR 0 + /*!< pull resistor setting. 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ +#endif + +#endif /* __DB11_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB21.c b/TSM_PicoW_Sensor/McuLib/HD44780/DB21.c new file mode 100644 index 0000000..3350a7d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB21.c @@ -0,0 +1,537 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : DB21.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : DB21 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool DB21_GetDir(void); +** SetDir - void DB21_SetDir(bool Dir); +** SetInput - void DB21_SetInput(void); +** SetOutput - void DB21_SetOutput(void); +** GetVal - bool DB21_GetVal(void); +** PutVal - void DB21_PutVal(bool Val); +** ClrVal - void DB21_ClrVal(void); +** SetVal - void DB21_SetVal(void); +** NegVal - void DB21_NegVal(void); +** Init - void DB21_Init(void); +** Deinit - void DB21_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file DB21.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup DB21_module DB21 module documentation +** @{ +*/ + +/* MODULE DB21. */ + +#include "DB21.h" +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if DB21_CONFIG_DO_PIN_MUXING + #if McuLib_CONFIG_CPU_IS_LPC + #include "fsl_iocon.h" /* include SDK header file for I/O connection muxing */ + #else /* Kinetis */ + #include "fsl_port.h" /* include SDK header file for port muxing */ + #endif + #endif + #include "fsl_gpio.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + #include "pins_gpio_hw_access.h" + #include "pins_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + #include "nrf_gpio.h" +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + #include "McuGPIO.h" +#else + #error "Unsupported SDK!" +#endif + +#if McuLib_CONFIG_NXP_SDK_2_0_USED + static const gpio_pin_config_t DB21_configOutput = { + kGPIO_DigitalOutput, /* use as output pin */ + DB21_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; + + static const gpio_pin_config_t DB21_configInput = { + kGPIO_DigitalInput, /* use as input pin */ + DB21_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + const gpio_output_pin_user_config_t DB21_OutputConfig[] = { + { + .pinName = DB21_CONFIG_PIN_SYMBOL, + .config.outputLogic = DB21_CONFIG_INIT_PIN_VALUE, + #if FSL_FEATURE_PORT_HAS_SLEW_RATE + .config.slewRate = kPortSlowSlewRate, + #endif + #if FSL_FEATURE_PORT_HAS_OPEN_DRAIN + .config.isOpenDrainEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH + .config.driveStrength = kPortLowDriveStrength, + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; + + const gpio_input_pin_user_config_t DB21_InputConfig[] = { + { + .pinName = DB21_CONFIG_PIN_SYMBOL, + #if FSL_FEATURE_PORT_HAS_PULL_ENABLE + #if DB21_CONFIG_PULL_RESISTOR==0 /* 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ + .config.isPullEnable = false, + #else + .config.isPullEnable = true, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PULL_SELECTION + #if DB21_CONFIG_PULL_RESISTOR==1 + .config.pullSelect = kPortPullUp, + #else + .config.pullSelect = kPortPullDown, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER + .config.isPassiveFilterEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER + .config.isDigitalFilterEnabled = true, + #endif + #if FSL_FEATURE_GPIO_HAS_INTERRUPT_VECTOR + .config.interrupt = kPortIntDisabled + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + static McuGPIO_Handle_t pin; +#endif + +static bool DB21_isOutput = false; +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB21_ClrVal(void) +{ +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if McuLib_CONFIG_CPU_IS_LPC + GPIO_PortClear(DB21_CONFIG_GPIO_NAME, DB21_CONFIG_PORT_NAME, 1< input */ + PINS_DRV_SetPinsDirection(DB21_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_input(DB21_CONFIG_PIN_NUMBER, NRF_GPIO_PIN_NOPULL); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsInput(pin); +#endif + DB21_isOutput = false; +} + +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB21_SetOutput(void) +{ +#if McuLib_CONFIG_CPU_IS_LPC + GPIO_PinInit(DB21_CONFIG_GPIO_NAME, DB21_CONFIG_PORT_NAME, DB21_CONFIG_PIN_NUMBER, &DB21_configOutput); +#elif McuLib_CONFIG_NXP_SDK_2_0_USED + GPIO_PinInit(DB21_CONFIG_GPIO_NAME, DB21_CONFIG_PIN_NUMBER, &DB21_configOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + GPIO_DRV_SetPinDir(DB21_CONFIG_PIN_SYMBOL, kGpioDigitalOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + pins_channel_type_t val; + + val = PINS_GPIO_GetPinsDirection(DB21_CONFIG_PORT_NAME); /* bit 0: pin is input; 1: pin is output */ + val |= (1< output */ + PINS_DRV_SetPinsDirection(DB21_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_output(DB21_CONFIG_PIN_NUMBER); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsOutput(pin, false /* don't care */); +#endif + DB21_isOutput = true; +} + +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ +void DB21_PutVal(bool Val) +{ +#if McuLib_CONFIG_CPU_IS_LPC + if (Val) { + GPIO_PortSet(DB21_CONFIG_GPIO_NAME, DB21_CONFIG_PORT_NAME, 1<_ */ + _IOCON_PIO_FUNC0 | + /* Selects pull-up function */ + _IOCON_PIO_MODE_PULLUP | + /* Standard mode, output slew rate control is enabled */ + _IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + _IOCON_PIO_INV_DI | + /* Enables digital function */ + _IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + _IOCON_PIO_OPENDRAIN_DI); + #if (McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0) + IOCON_PinMuxSet(DB21_CONFIG_PORT_NAME, DB21_CONFIG_PIN_NUMBER, port_pin_config); + #else + IOCON_PinMuxSet(IOCON, DB21_CONFIG_PORT_NAME, DB21_CONFIG_PIN_NUMBER, port_pin_config); + #endif + #else + PORT_SetPinMux(DB21_CONFIG_PORT_NAME, DB21_CONFIG_PIN_NUMBER, kPORT_MuxAsGpio); /* mux as GPIO */ + #endif + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + /*! Pin Muxing not implemented */ + GPIO_DRV_Init(DB21_InputConfig, DB21_OutputConfig); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + /* the following needs to be called in the application first: + PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); + */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + config.hw.pin = DB21_CONFIG_PIN_NUMBER; + config.isInput = true; + pin = McuGPIO_InitGPIO(&config); +#endif +#if DB21_CONFIG_INIT_PIN_DIRECTION == DB21_CONFIG_INIT_PIN_DIRECTION_INPUT + DB21_SetInput(); +#elif DB21_CONFIG_INIT_PIN_DIRECTION == DB21_CONFIG_INIT_PIN_DIRECTION_OUTPUT + DB21_SetOutput(); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB21_Deinit(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + pin = McuGPIO_DeinitGPIO(pin); +#endif +} + +/* END DB21. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB21.h b/TSM_PicoW_Sensor/McuLib/HD44780/DB21.h new file mode 100644 index 0000000..58c1184 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB21.h @@ -0,0 +1,243 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : DB21.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : DB21 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool DB21_GetDir(void); +** SetDir - void DB21_SetDir(bool Dir); +** SetInput - void DB21_SetInput(void); +** SetOutput - void DB21_SetOutput(void); +** GetVal - bool DB21_GetVal(void); +** PutVal - void DB21_PutVal(bool Val); +** ClrVal - void DB21_ClrVal(void); +** SetVal - void DB21_SetVal(void); +** NegVal - void DB21_NegVal(void); +** Init - void DB21_Init(void); +** Deinit - void DB21_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file DB21.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup DB21_module DB21 module documentation +** @{ +*/ + +#ifndef __DB21_H +#define __DB21_H + +/* MODULE DB21. */ +#include "McuLib.h" /* SDK and API used */ +#include "DB21config.h" /* configuration */ + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" + + /* only GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF and GPIOG are currently supported */ + #define DB21_GPIO_IDX GPIOA_IDX /* GPIOA */ + + enum DB21_pinNames{ + DB21_CONFIG_PIN_SYMBOL = GPIO_MAKE_PIN(DB21_GPIO_IDX, DB21_CONFIG_PIN_NUMBER), + }; + + extern const gpio_output_pin_user_config_t DB21_OutputConfig[]; + extern const gpio_input_pin_user_config_t DB21_InputConfig[]; +#endif + +void DB21_Init(void); +/* +** =================================================================== +** Method : Init (component SDK_BitIO) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB21_ClrVal(void); +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB21_SetVal(void); +/* +** =================================================================== +** Method : SetVal (component SDK_BitIO) +** +** Description : +** Sets the pin value to a high value. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB21_NegVal(void); +/* +** =================================================================== +** Method : NegVal (component SDK_BitIO) +** +** Description : +** Toggles/negates the pin value +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB21_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +bool DB21_GetVal(void); +/* +** =================================================================== +** Method : GetVal (component SDK_BitIO) +** +** Description : +** Returns the pin value +** Parameters : None +** Returns : +** --- - Returns the value of the pin: +** FALSE/logical level '0' or TRUE/logical +** level '1' +** =================================================================== +*/ + +bool DB21_GetDir(void); +/* +** =================================================================== +** Method : GetDir (component SDK_BitIO) +** +** Description : +** Return the direction of the pin (input/output) +** Parameters : None +** Returns : +** --- - FALSE if port is input, TRUE if port is +** output +** =================================================================== +*/ + +void DB21_SetDir(bool Dir); +/* +** =================================================================== +** Method : SetDir (component SDK_BitIO) +** +** Description : +** Sets the direction of the pin (input or output) +** Parameters : +** NAME - DESCRIPTION +** Dir - FALSE: input, TRUE: output +** Returns : Nothing +** =================================================================== +*/ + +void DB21_SetInput(void); +/* +** =================================================================== +** Method : SetInput (component SDK_BitIO) +** +** Description : +** Sets the pin as input +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB21_SetOutput(void); +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB21_PutVal(bool Val); +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ + +/* END DB21. */ + +#endif +/* ifndef __DB21_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB21config.h b/TSM_PicoW_Sensor/McuLib/HD44780/DB21config.h new file mode 100644 index 0000000..b7e6d40 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB21config.h @@ -0,0 +1,87 @@ +/** + * \file + * \brief Configuration header file for SDK_BitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SDK Bit I/O module. + */ + +#ifndef __DB21_CONFIG_H +#define __DB21_CONFIG_H + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_MCUXPRESSO_2_0 + #include "pin_mux.h" /* include pin muxing header file */ + + #if defined(BOARD_INITPINS_DB21_PIN) + #define DB21_CONFIG_PIN_NUMBER BOARD_INITPINS_DB21_PIN + #endif + #if defined(BOARD_INITPINS_DB21_GPIO) + #define DB21_CONFIG_GPIO_NAME BOARD_INITPINS_DB21_GPIO + #endif + #if defined(BOARD_INITPINS_DB21_PORT) + #define DB21_CONFIG_PORT_NAME BOARD_INITPINS_DB21_PORT + #endif +#endif + +#ifndef DB21_CONFIG_PORT_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define DB21_CONFIG_PORT_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define DB21_CONFIG_PORT_NAME 0 + #else /* name from properties */ + #define DB21_CONFIG_PORT_NAME PORTA + #endif + /*!< name of PORT, is pointer to PORT_Type */ +#endif + +#ifndef DB21_CONFIG_GPIO_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define DB21_CONFIG_GPIO_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define DB21_CONFIG_GPIO_NAME GPIO + #elif McuLib_CONFIG_CPU_IS_KINETIS && McuLib_CONFIG_IS_KINETIS_KE + #define DB21_CONFIG_GPIO_NAME 0 + #elif McuLib_CONFIG_CPU_IS_MCX + #define DB21_CONFIG_GPIO_NAME GPIO0 + #else /* name from properties */ + #define DB21_CONFIG_GPIO_NAME GPIOA + #endif + /*!< name of GPIO, is pointer to GPIO_Type, not used for S32K SDK */ +#endif + +#ifndef DB21_CONFIG_PIN_NUMBER + #define DB21_CONFIG_PIN_NUMBER 0u + /*!< number of pin, type unsigned integer */ +#endif + +#ifndef DB21_CONFIG_PIN_SYMBOL + #define DB21_CONFIG_PIN_SYMBOL LED_RED + /*!< symbolic name for pin, used for NXP SDK V1.3 */ +#endif + +#ifndef DB21_CONFIG_INIT_PIN_VALUE + #define DB21_CONFIG_INIT_PIN_VALUE 0 + /*!< 0: Pin data is initialized with 0 (low); 1: pin value is initialized with 1 (high) */ +#endif + +/* different types of pin direction settings */ +#define DB21_CONFIG_INIT_PIN_DIRECTION_NONE (0) +#define DB21_CONFIG_INIT_PIN_DIRECTION_INPUT (1) +#define DB21_CONFIG_INIT_PIN_DIRECTION_OUTPUT (2) + +#ifndef DB21_CONFIG_INIT_PIN_DIRECTION + #define DB21_CONFIG_INIT_PIN_DIRECTION DB21_CONFIG_INIT_PIN_DIRECTION_OUTPUT +#endif + +#ifndef DB21_CONFIG_DO_PIN_MUXING + #define DB21_CONFIG_DO_PIN_MUXING 0 + /*!< 1: perform pin muxing in Init(), 0: do not do pin muxing */ +#endif + +#ifndef DB21_CONFIG_PULL_RESISTOR + #define DB21_CONFIG_PULL_RESISTOR 0 + /*!< pull resistor setting. 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ +#endif + +#endif /* __DB21_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB31.c b/TSM_PicoW_Sensor/McuLib/HD44780/DB31.c new file mode 100644 index 0000000..28502d0 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB31.c @@ -0,0 +1,537 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : DB31.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : DB31 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool DB31_GetDir(void); +** SetDir - void DB31_SetDir(bool Dir); +** SetInput - void DB31_SetInput(void); +** SetOutput - void DB31_SetOutput(void); +** GetVal - bool DB31_GetVal(void); +** PutVal - void DB31_PutVal(bool Val); +** ClrVal - void DB31_ClrVal(void); +** SetVal - void DB31_SetVal(void); +** NegVal - void DB31_NegVal(void); +** Init - void DB31_Init(void); +** Deinit - void DB31_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file DB31.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup DB31_module DB31 module documentation +** @{ +*/ + +/* MODULE DB31. */ + +#include "DB31.h" +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if DB31_CONFIG_DO_PIN_MUXING + #if McuLib_CONFIG_CPU_IS_LPC + #include "fsl_iocon.h" /* include SDK header file for I/O connection muxing */ + #else /* Kinetis */ + #include "fsl_port.h" /* include SDK header file for port muxing */ + #endif + #endif + #include "fsl_gpio.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + #include "pins_gpio_hw_access.h" + #include "pins_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + #include "nrf_gpio.h" +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + #include "McuGPIO.h" +#else + #error "Unsupported SDK!" +#endif + +#if McuLib_CONFIG_NXP_SDK_2_0_USED + static const gpio_pin_config_t DB31_configOutput = { + kGPIO_DigitalOutput, /* use as output pin */ + DB31_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; + + static const gpio_pin_config_t DB31_configInput = { + kGPIO_DigitalInput, /* use as input pin */ + DB31_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + const gpio_output_pin_user_config_t DB31_OutputConfig[] = { + { + .pinName = DB31_CONFIG_PIN_SYMBOL, + .config.outputLogic = DB31_CONFIG_INIT_PIN_VALUE, + #if FSL_FEATURE_PORT_HAS_SLEW_RATE + .config.slewRate = kPortSlowSlewRate, + #endif + #if FSL_FEATURE_PORT_HAS_OPEN_DRAIN + .config.isOpenDrainEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH + .config.driveStrength = kPortLowDriveStrength, + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; + + const gpio_input_pin_user_config_t DB31_InputConfig[] = { + { + .pinName = DB31_CONFIG_PIN_SYMBOL, + #if FSL_FEATURE_PORT_HAS_PULL_ENABLE + #if DB31_CONFIG_PULL_RESISTOR==0 /* 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ + .config.isPullEnable = false, + #else + .config.isPullEnable = true, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PULL_SELECTION + #if DB31_CONFIG_PULL_RESISTOR==1 + .config.pullSelect = kPortPullUp, + #else + .config.pullSelect = kPortPullDown, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER + .config.isPassiveFilterEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER + .config.isDigitalFilterEnabled = true, + #endif + #if FSL_FEATURE_GPIO_HAS_INTERRUPT_VECTOR + .config.interrupt = kPortIntDisabled + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + static McuGPIO_Handle_t pin; +#endif + +static bool DB31_isOutput = false; +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB31_ClrVal(void) +{ +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if McuLib_CONFIG_CPU_IS_LPC + GPIO_PortClear(DB31_CONFIG_GPIO_NAME, DB31_CONFIG_PORT_NAME, 1< input */ + PINS_DRV_SetPinsDirection(DB31_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_input(DB31_CONFIG_PIN_NUMBER, NRF_GPIO_PIN_NOPULL); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsInput(pin); +#endif + DB31_isOutput = false; +} + +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB31_SetOutput(void) +{ +#if McuLib_CONFIG_CPU_IS_LPC + GPIO_PinInit(DB31_CONFIG_GPIO_NAME, DB31_CONFIG_PORT_NAME, DB31_CONFIG_PIN_NUMBER, &DB31_configOutput); +#elif McuLib_CONFIG_NXP_SDK_2_0_USED + GPIO_PinInit(DB31_CONFIG_GPIO_NAME, DB31_CONFIG_PIN_NUMBER, &DB31_configOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + GPIO_DRV_SetPinDir(DB31_CONFIG_PIN_SYMBOL, kGpioDigitalOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + pins_channel_type_t val; + + val = PINS_GPIO_GetPinsDirection(DB31_CONFIG_PORT_NAME); /* bit 0: pin is input; 1: pin is output */ + val |= (1< output */ + PINS_DRV_SetPinsDirection(DB31_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_output(DB31_CONFIG_PIN_NUMBER); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsOutput(pin, false /* don't care */); +#endif + DB31_isOutput = true; +} + +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ +void DB31_PutVal(bool Val) +{ +#if McuLib_CONFIG_CPU_IS_LPC + if (Val) { + GPIO_PortSet(DB31_CONFIG_GPIO_NAME, DB31_CONFIG_PORT_NAME, 1<_ */ + _IOCON_PIO_FUNC0 | + /* Selects pull-up function */ + _IOCON_PIO_MODE_PULLUP | + /* Standard mode, output slew rate control is enabled */ + _IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + _IOCON_PIO_INV_DI | + /* Enables digital function */ + _IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + _IOCON_PIO_OPENDRAIN_DI); + #if (McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0) + IOCON_PinMuxSet(DB31_CONFIG_PORT_NAME, DB31_CONFIG_PIN_NUMBER, port_pin_config); + #else + IOCON_PinMuxSet(IOCON, DB31_CONFIG_PORT_NAME, DB31_CONFIG_PIN_NUMBER, port_pin_config); + #endif + #else + PORT_SetPinMux(DB31_CONFIG_PORT_NAME, DB31_CONFIG_PIN_NUMBER, kPORT_MuxAsGpio); /* mux as GPIO */ + #endif + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + /*! Pin Muxing not implemented */ + GPIO_DRV_Init(DB31_InputConfig, DB31_OutputConfig); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + /* the following needs to be called in the application first: + PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); + */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + config.hw.pin = DB31_CONFIG_PIN_NUMBER; + config.isInput = true; + pin = McuGPIO_InitGPIO(&config); +#endif +#if DB31_CONFIG_INIT_PIN_DIRECTION == DB31_CONFIG_INIT_PIN_DIRECTION_INPUT + DB31_SetInput(); +#elif DB31_CONFIG_INIT_PIN_DIRECTION == DB31_CONFIG_INIT_PIN_DIRECTION_OUTPUT + DB31_SetOutput(); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB31_Deinit(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + pin = McuGPIO_DeinitGPIO(pin); +#endif +} + +/* END DB31. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB31.h b/TSM_PicoW_Sensor/McuLib/HD44780/DB31.h new file mode 100644 index 0000000..ce1dc09 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB31.h @@ -0,0 +1,243 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : DB31.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : DB31 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool DB31_GetDir(void); +** SetDir - void DB31_SetDir(bool Dir); +** SetInput - void DB31_SetInput(void); +** SetOutput - void DB31_SetOutput(void); +** GetVal - bool DB31_GetVal(void); +** PutVal - void DB31_PutVal(bool Val); +** ClrVal - void DB31_ClrVal(void); +** SetVal - void DB31_SetVal(void); +** NegVal - void DB31_NegVal(void); +** Init - void DB31_Init(void); +** Deinit - void DB31_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file DB31.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup DB31_module DB31 module documentation +** @{ +*/ + +#ifndef __DB31_H +#define __DB31_H + +/* MODULE DB31. */ +#include "McuLib.h" /* SDK and API used */ +#include "DB31config.h" /* configuration */ + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" + + /* only GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF and GPIOG are currently supported */ + #define DB31_GPIO_IDX GPIOA_IDX /* GPIOA */ + + enum DB31_pinNames{ + DB31_CONFIG_PIN_SYMBOL = GPIO_MAKE_PIN(DB31_GPIO_IDX, DB31_CONFIG_PIN_NUMBER), + }; + + extern const gpio_output_pin_user_config_t DB31_OutputConfig[]; + extern const gpio_input_pin_user_config_t DB31_InputConfig[]; +#endif + +void DB31_Init(void); +/* +** =================================================================== +** Method : Init (component SDK_BitIO) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB31_ClrVal(void); +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB31_SetVal(void); +/* +** =================================================================== +** Method : SetVal (component SDK_BitIO) +** +** Description : +** Sets the pin value to a high value. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB31_NegVal(void); +/* +** =================================================================== +** Method : NegVal (component SDK_BitIO) +** +** Description : +** Toggles/negates the pin value +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB31_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +bool DB31_GetVal(void); +/* +** =================================================================== +** Method : GetVal (component SDK_BitIO) +** +** Description : +** Returns the pin value +** Parameters : None +** Returns : +** --- - Returns the value of the pin: +** FALSE/logical level '0' or TRUE/logical +** level '1' +** =================================================================== +*/ + +bool DB31_GetDir(void); +/* +** =================================================================== +** Method : GetDir (component SDK_BitIO) +** +** Description : +** Return the direction of the pin (input/output) +** Parameters : None +** Returns : +** --- - FALSE if port is input, TRUE if port is +** output +** =================================================================== +*/ + +void DB31_SetDir(bool Dir); +/* +** =================================================================== +** Method : SetDir (component SDK_BitIO) +** +** Description : +** Sets the direction of the pin (input or output) +** Parameters : +** NAME - DESCRIPTION +** Dir - FALSE: input, TRUE: output +** Returns : Nothing +** =================================================================== +*/ + +void DB31_SetInput(void); +/* +** =================================================================== +** Method : SetInput (component SDK_BitIO) +** +** Description : +** Sets the pin as input +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB31_SetOutput(void); +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB31_PutVal(bool Val); +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ + +/* END DB31. */ + +#endif +/* ifndef __DB31_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB31config.h b/TSM_PicoW_Sensor/McuLib/HD44780/DB31config.h new file mode 100644 index 0000000..ce8e6bd --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB31config.h @@ -0,0 +1,87 @@ +/** + * \file + * \brief Configuration header file for SDK_BitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SDK Bit I/O module. + */ + +#ifndef __DB31_CONFIG_H +#define __DB31_CONFIG_H + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_MCUXPRESSO_2_0 + #include "pin_mux.h" /* include pin muxing header file */ + + #if defined(BOARD_INITPINS_DB31_PIN) + #define DB31_CONFIG_PIN_NUMBER BOARD_INITPINS_DB31_PIN + #endif + #if defined(BOARD_INITPINS_DB31_GPIO) + #define DB31_CONFIG_GPIO_NAME BOARD_INITPINS_DB31_GPIO + #endif + #if defined(BOARD_INITPINS_DB31_PORT) + #define DB31_CONFIG_PORT_NAME BOARD_INITPINS_DB31_PORT + #endif +#endif + +#ifndef DB31_CONFIG_PORT_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define DB31_CONFIG_PORT_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define DB31_CONFIG_PORT_NAME 0 + #else /* name from properties */ + #define DB31_CONFIG_PORT_NAME PORTA + #endif + /*!< name of PORT, is pointer to PORT_Type */ +#endif + +#ifndef DB31_CONFIG_GPIO_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define DB31_CONFIG_GPIO_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define DB31_CONFIG_GPIO_NAME GPIO + #elif McuLib_CONFIG_CPU_IS_KINETIS && McuLib_CONFIG_IS_KINETIS_KE + #define DB31_CONFIG_GPIO_NAME 0 + #elif McuLib_CONFIG_CPU_IS_MCX + #define DB31_CONFIG_GPIO_NAME GPIO0 + #else /* name from properties */ + #define DB31_CONFIG_GPIO_NAME GPIOA + #endif + /*!< name of GPIO, is pointer to GPIO_Type, not used for S32K SDK */ +#endif + +#ifndef DB31_CONFIG_PIN_NUMBER + #define DB31_CONFIG_PIN_NUMBER 0u + /*!< number of pin, type unsigned integer */ +#endif + +#ifndef DB31_CONFIG_PIN_SYMBOL + #define DB31_CONFIG_PIN_SYMBOL LED_RED + /*!< symbolic name for pin, used for NXP SDK V1.3 */ +#endif + +#ifndef DB31_CONFIG_INIT_PIN_VALUE + #define DB31_CONFIG_INIT_PIN_VALUE 0 + /*!< 0: Pin data is initialized with 0 (low); 1: pin value is initialized with 1 (high) */ +#endif + +/* different types of pin direction settings */ +#define DB31_CONFIG_INIT_PIN_DIRECTION_NONE (0) +#define DB31_CONFIG_INIT_PIN_DIRECTION_INPUT (1) +#define DB31_CONFIG_INIT_PIN_DIRECTION_OUTPUT (2) + +#ifndef DB31_CONFIG_INIT_PIN_DIRECTION + #define DB31_CONFIG_INIT_PIN_DIRECTION DB31_CONFIG_INIT_PIN_DIRECTION_OUTPUT +#endif + +#ifndef DB31_CONFIG_DO_PIN_MUXING + #define DB31_CONFIG_DO_PIN_MUXING 0 + /*!< 1: perform pin muxing in Init(), 0: do not do pin muxing */ +#endif + +#ifndef DB31_CONFIG_PULL_RESISTOR + #define DB31_CONFIG_PULL_RESISTOR 0 + /*!< pull resistor setting. 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ +#endif + +#endif /* __DB31_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB41.c b/TSM_PicoW_Sensor/McuLib/HD44780/DB41.c new file mode 100644 index 0000000..b1109b6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB41.c @@ -0,0 +1,537 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : DB41.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : DB41 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool DB41_GetDir(void); +** SetDir - void DB41_SetDir(bool Dir); +** SetInput - void DB41_SetInput(void); +** SetOutput - void DB41_SetOutput(void); +** GetVal - bool DB41_GetVal(void); +** PutVal - void DB41_PutVal(bool Val); +** ClrVal - void DB41_ClrVal(void); +** SetVal - void DB41_SetVal(void); +** NegVal - void DB41_NegVal(void); +** Init - void DB41_Init(void); +** Deinit - void DB41_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file DB41.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup DB41_module DB41 module documentation +** @{ +*/ + +/* MODULE DB41. */ + +#include "DB41.h" +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if DB41_CONFIG_DO_PIN_MUXING + #if McuLib_CONFIG_CPU_IS_LPC + #include "fsl_iocon.h" /* include SDK header file for I/O connection muxing */ + #else /* Kinetis */ + #include "fsl_port.h" /* include SDK header file for port muxing */ + #endif + #endif + #include "fsl_gpio.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + #include "pins_gpio_hw_access.h" + #include "pins_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + #include "nrf_gpio.h" +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + #include "McuGPIO.h" +#else + #error "Unsupported SDK!" +#endif + +#if McuLib_CONFIG_NXP_SDK_2_0_USED + static const gpio_pin_config_t DB41_configOutput = { + kGPIO_DigitalOutput, /* use as output pin */ + DB41_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; + + static const gpio_pin_config_t DB41_configInput = { + kGPIO_DigitalInput, /* use as input pin */ + DB41_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + const gpio_output_pin_user_config_t DB41_OutputConfig[] = { + { + .pinName = DB41_CONFIG_PIN_SYMBOL, + .config.outputLogic = DB41_CONFIG_INIT_PIN_VALUE, + #if FSL_FEATURE_PORT_HAS_SLEW_RATE + .config.slewRate = kPortSlowSlewRate, + #endif + #if FSL_FEATURE_PORT_HAS_OPEN_DRAIN + .config.isOpenDrainEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH + .config.driveStrength = kPortLowDriveStrength, + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; + + const gpio_input_pin_user_config_t DB41_InputConfig[] = { + { + .pinName = DB41_CONFIG_PIN_SYMBOL, + #if FSL_FEATURE_PORT_HAS_PULL_ENABLE + #if DB41_CONFIG_PULL_RESISTOR==0 /* 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ + .config.isPullEnable = false, + #else + .config.isPullEnable = true, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PULL_SELECTION + #if DB41_CONFIG_PULL_RESISTOR==1 + .config.pullSelect = kPortPullUp, + #else + .config.pullSelect = kPortPullDown, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER + .config.isPassiveFilterEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER + .config.isDigitalFilterEnabled = true, + #endif + #if FSL_FEATURE_GPIO_HAS_INTERRUPT_VECTOR + .config.interrupt = kPortIntDisabled + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + static McuGPIO_Handle_t pin; +#endif + +static bool DB41_isOutput = false; +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB41_ClrVal(void) +{ +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if McuLib_CONFIG_CPU_IS_LPC + GPIO_PortClear(DB41_CONFIG_GPIO_NAME, DB41_CONFIG_PORT_NAME, 1< input */ + PINS_DRV_SetPinsDirection(DB41_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_input(DB41_CONFIG_PIN_NUMBER, NRF_GPIO_PIN_NOPULL); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsInput(pin); +#endif + DB41_isOutput = false; +} + +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB41_SetOutput(void) +{ +#if McuLib_CONFIG_CPU_IS_LPC + GPIO_PinInit(DB41_CONFIG_GPIO_NAME, DB41_CONFIG_PORT_NAME, DB41_CONFIG_PIN_NUMBER, &DB41_configOutput); +#elif McuLib_CONFIG_NXP_SDK_2_0_USED + GPIO_PinInit(DB41_CONFIG_GPIO_NAME, DB41_CONFIG_PIN_NUMBER, &DB41_configOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + GPIO_DRV_SetPinDir(DB41_CONFIG_PIN_SYMBOL, kGpioDigitalOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + pins_channel_type_t val; + + val = PINS_GPIO_GetPinsDirection(DB41_CONFIG_PORT_NAME); /* bit 0: pin is input; 1: pin is output */ + val |= (1< output */ + PINS_DRV_SetPinsDirection(DB41_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_output(DB41_CONFIG_PIN_NUMBER); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsOutput(pin, false /* don't care */); +#endif + DB41_isOutput = true; +} + +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ +void DB41_PutVal(bool Val) +{ +#if McuLib_CONFIG_CPU_IS_LPC + if (Val) { + GPIO_PortSet(DB41_CONFIG_GPIO_NAME, DB41_CONFIG_PORT_NAME, 1<_ */ + _IOCON_PIO_FUNC0 | + /* Selects pull-up function */ + _IOCON_PIO_MODE_PULLUP | + /* Standard mode, output slew rate control is enabled */ + _IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + _IOCON_PIO_INV_DI | + /* Enables digital function */ + _IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + _IOCON_PIO_OPENDRAIN_DI); + #if (McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0) + IOCON_PinMuxSet(DB41_CONFIG_PORT_NAME, DB41_CONFIG_PIN_NUMBER, port_pin_config); + #else + IOCON_PinMuxSet(IOCON, DB41_CONFIG_PORT_NAME, DB41_CONFIG_PIN_NUMBER, port_pin_config); + #endif + #else + PORT_SetPinMux(DB41_CONFIG_PORT_NAME, DB41_CONFIG_PIN_NUMBER, kPORT_MuxAsGpio); /* mux as GPIO */ + #endif + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + /*! Pin Muxing not implemented */ + GPIO_DRV_Init(DB41_InputConfig, DB41_OutputConfig); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + /* the following needs to be called in the application first: + PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); + */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + config.hw.pin = DB41_CONFIG_PIN_NUMBER; + config.isInput = true; + pin = McuGPIO_InitGPIO(&config); +#endif +#if DB41_CONFIG_INIT_PIN_DIRECTION == DB41_CONFIG_INIT_PIN_DIRECTION_INPUT + DB41_SetInput(); +#elif DB41_CONFIG_INIT_PIN_DIRECTION == DB41_CONFIG_INIT_PIN_DIRECTION_OUTPUT + DB41_SetOutput(); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB41_Deinit(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + pin = McuGPIO_DeinitGPIO(pin); +#endif +} + +/* END DB41. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB41.h b/TSM_PicoW_Sensor/McuLib/HD44780/DB41.h new file mode 100644 index 0000000..3155879 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB41.h @@ -0,0 +1,243 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : DB41.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : DB41 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool DB41_GetDir(void); +** SetDir - void DB41_SetDir(bool Dir); +** SetInput - void DB41_SetInput(void); +** SetOutput - void DB41_SetOutput(void); +** GetVal - bool DB41_GetVal(void); +** PutVal - void DB41_PutVal(bool Val); +** ClrVal - void DB41_ClrVal(void); +** SetVal - void DB41_SetVal(void); +** NegVal - void DB41_NegVal(void); +** Init - void DB41_Init(void); +** Deinit - void DB41_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file DB41.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup DB41_module DB41 module documentation +** @{ +*/ + +#ifndef __DB41_H +#define __DB41_H + +/* MODULE DB41. */ +#include "McuLib.h" /* SDK and API used */ +#include "DB41config.h" /* configuration */ + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" + + /* only GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF and GPIOG are currently supported */ + #define DB41_GPIO_IDX GPIOA_IDX /* GPIOA */ + + enum DB41_pinNames{ + DB41_CONFIG_PIN_SYMBOL = GPIO_MAKE_PIN(DB41_GPIO_IDX, DB41_CONFIG_PIN_NUMBER), + }; + + extern const gpio_output_pin_user_config_t DB41_OutputConfig[]; + extern const gpio_input_pin_user_config_t DB41_InputConfig[]; +#endif + +void DB41_Init(void); +/* +** =================================================================== +** Method : Init (component SDK_BitIO) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB41_ClrVal(void); +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB41_SetVal(void); +/* +** =================================================================== +** Method : SetVal (component SDK_BitIO) +** +** Description : +** Sets the pin value to a high value. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB41_NegVal(void); +/* +** =================================================================== +** Method : NegVal (component SDK_BitIO) +** +** Description : +** Toggles/negates the pin value +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB41_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +bool DB41_GetVal(void); +/* +** =================================================================== +** Method : GetVal (component SDK_BitIO) +** +** Description : +** Returns the pin value +** Parameters : None +** Returns : +** --- - Returns the value of the pin: +** FALSE/logical level '0' or TRUE/logical +** level '1' +** =================================================================== +*/ + +bool DB41_GetDir(void); +/* +** =================================================================== +** Method : GetDir (component SDK_BitIO) +** +** Description : +** Return the direction of the pin (input/output) +** Parameters : None +** Returns : +** --- - FALSE if port is input, TRUE if port is +** output +** =================================================================== +*/ + +void DB41_SetDir(bool Dir); +/* +** =================================================================== +** Method : SetDir (component SDK_BitIO) +** +** Description : +** Sets the direction of the pin (input or output) +** Parameters : +** NAME - DESCRIPTION +** Dir - FALSE: input, TRUE: output +** Returns : Nothing +** =================================================================== +*/ + +void DB41_SetInput(void); +/* +** =================================================================== +** Method : SetInput (component SDK_BitIO) +** +** Description : +** Sets the pin as input +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB41_SetOutput(void); +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB41_PutVal(bool Val); +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ + +/* END DB41. */ + +#endif +/* ifndef __DB41_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB41config.h b/TSM_PicoW_Sensor/McuLib/HD44780/DB41config.h new file mode 100644 index 0000000..3ee2985 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB41config.h @@ -0,0 +1,87 @@ +/** + * \file + * \brief Configuration header file for SDK_BitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SDK Bit I/O module. + */ + +#ifndef __DB41_CONFIG_H +#define __DB41_CONFIG_H + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_MCUXPRESSO_2_0 + #include "pin_mux.h" /* include pin muxing header file */ + + #if defined(BOARD_INITPINS_DB41_PIN) + #define DB41_CONFIG_PIN_NUMBER BOARD_INITPINS_DB41_PIN + #endif + #if defined(BOARD_INITPINS_DB41_GPIO) + #define DB41_CONFIG_GPIO_NAME BOARD_INITPINS_DB41_GPIO + #endif + #if defined(BOARD_INITPINS_DB41_PORT) + #define DB41_CONFIG_PORT_NAME BOARD_INITPINS_DB41_PORT + #endif +#endif + +#ifndef DB41_CONFIG_PORT_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define DB41_CONFIG_PORT_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define DB41_CONFIG_PORT_NAME 0 + #else /* name from properties */ + #define DB41_CONFIG_PORT_NAME PORTA + #endif + /*!< name of PORT, is pointer to PORT_Type */ +#endif + +#ifndef DB41_CONFIG_GPIO_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define DB41_CONFIG_GPIO_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define DB41_CONFIG_GPIO_NAME GPIO + #elif McuLib_CONFIG_CPU_IS_KINETIS && McuLib_CONFIG_IS_KINETIS_KE + #define DB41_CONFIG_GPIO_NAME 0 + #elif McuLib_CONFIG_CPU_IS_MCX + #define DB41_CONFIG_GPIO_NAME GPIO0 + #else /* name from properties */ + #define DB41_CONFIG_GPIO_NAME GPIOA + #endif + /*!< name of GPIO, is pointer to GPIO_Type, not used for S32K SDK */ +#endif + +#ifndef DB41_CONFIG_PIN_NUMBER + #define DB41_CONFIG_PIN_NUMBER 0u + /*!< number of pin, type unsigned integer */ +#endif + +#ifndef DB41_CONFIG_PIN_SYMBOL + #define DB41_CONFIG_PIN_SYMBOL LED_RED + /*!< symbolic name for pin, used for NXP SDK V1.3 */ +#endif + +#ifndef DB41_CONFIG_INIT_PIN_VALUE + #define DB41_CONFIG_INIT_PIN_VALUE 0 + /*!< 0: Pin data is initialized with 0 (low); 1: pin value is initialized with 1 (high) */ +#endif + +/* different types of pin direction settings */ +#define DB41_CONFIG_INIT_PIN_DIRECTION_NONE (0) +#define DB41_CONFIG_INIT_PIN_DIRECTION_INPUT (1) +#define DB41_CONFIG_INIT_PIN_DIRECTION_OUTPUT (2) + +#ifndef DB41_CONFIG_INIT_PIN_DIRECTION + #define DB41_CONFIG_INIT_PIN_DIRECTION DB41_CONFIG_INIT_PIN_DIRECTION_OUTPUT +#endif + +#ifndef DB41_CONFIG_DO_PIN_MUXING + #define DB41_CONFIG_DO_PIN_MUXING 0 + /*!< 1: perform pin muxing in Init(), 0: do not do pin muxing */ +#endif + +#ifndef DB41_CONFIG_PULL_RESISTOR + #define DB41_CONFIG_PULL_RESISTOR 0 + /*!< pull resistor setting. 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ +#endif + +#endif /* __DB41_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB51.c b/TSM_PicoW_Sensor/McuLib/HD44780/DB51.c new file mode 100644 index 0000000..8861019 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB51.c @@ -0,0 +1,537 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : DB51.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : DB51 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool DB51_GetDir(void); +** SetDir - void DB51_SetDir(bool Dir); +** SetInput - void DB51_SetInput(void); +** SetOutput - void DB51_SetOutput(void); +** GetVal - bool DB51_GetVal(void); +** PutVal - void DB51_PutVal(bool Val); +** ClrVal - void DB51_ClrVal(void); +** SetVal - void DB51_SetVal(void); +** NegVal - void DB51_NegVal(void); +** Init - void DB51_Init(void); +** Deinit - void DB51_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file DB51.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup DB51_module DB51 module documentation +** @{ +*/ + +/* MODULE DB51. */ + +#include "DB51.h" +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if DB51_CONFIG_DO_PIN_MUXING + #if McuLib_CONFIG_CPU_IS_LPC + #include "fsl_iocon.h" /* include SDK header file for I/O connection muxing */ + #else /* Kinetis */ + #include "fsl_port.h" /* include SDK header file for port muxing */ + #endif + #endif + #include "fsl_gpio.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + #include "pins_gpio_hw_access.h" + #include "pins_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + #include "nrf_gpio.h" +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + #include "McuGPIO.h" +#else + #error "Unsupported SDK!" +#endif + +#if McuLib_CONFIG_NXP_SDK_2_0_USED + static const gpio_pin_config_t DB51_configOutput = { + kGPIO_DigitalOutput, /* use as output pin */ + DB51_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; + + static const gpio_pin_config_t DB51_configInput = { + kGPIO_DigitalInput, /* use as input pin */ + DB51_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + const gpio_output_pin_user_config_t DB51_OutputConfig[] = { + { + .pinName = DB51_CONFIG_PIN_SYMBOL, + .config.outputLogic = DB51_CONFIG_INIT_PIN_VALUE, + #if FSL_FEATURE_PORT_HAS_SLEW_RATE + .config.slewRate = kPortSlowSlewRate, + #endif + #if FSL_FEATURE_PORT_HAS_OPEN_DRAIN + .config.isOpenDrainEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH + .config.driveStrength = kPortLowDriveStrength, + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; + + const gpio_input_pin_user_config_t DB51_InputConfig[] = { + { + .pinName = DB51_CONFIG_PIN_SYMBOL, + #if FSL_FEATURE_PORT_HAS_PULL_ENABLE + #if DB51_CONFIG_PULL_RESISTOR==0 /* 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ + .config.isPullEnable = false, + #else + .config.isPullEnable = true, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PULL_SELECTION + #if DB51_CONFIG_PULL_RESISTOR==1 + .config.pullSelect = kPortPullUp, + #else + .config.pullSelect = kPortPullDown, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER + .config.isPassiveFilterEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER + .config.isDigitalFilterEnabled = true, + #endif + #if FSL_FEATURE_GPIO_HAS_INTERRUPT_VECTOR + .config.interrupt = kPortIntDisabled + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + static McuGPIO_Handle_t pin; +#endif + +static bool DB51_isOutput = false; +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB51_ClrVal(void) +{ +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if McuLib_CONFIG_CPU_IS_LPC + GPIO_PortClear(DB51_CONFIG_GPIO_NAME, DB51_CONFIG_PORT_NAME, 1< input */ + PINS_DRV_SetPinsDirection(DB51_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_input(DB51_CONFIG_PIN_NUMBER, NRF_GPIO_PIN_NOPULL); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsInput(pin); +#endif + DB51_isOutput = false; +} + +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB51_SetOutput(void) +{ +#if McuLib_CONFIG_CPU_IS_LPC + GPIO_PinInit(DB51_CONFIG_GPIO_NAME, DB51_CONFIG_PORT_NAME, DB51_CONFIG_PIN_NUMBER, &DB51_configOutput); +#elif McuLib_CONFIG_NXP_SDK_2_0_USED + GPIO_PinInit(DB51_CONFIG_GPIO_NAME, DB51_CONFIG_PIN_NUMBER, &DB51_configOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + GPIO_DRV_SetPinDir(DB51_CONFIG_PIN_SYMBOL, kGpioDigitalOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + pins_channel_type_t val; + + val = PINS_GPIO_GetPinsDirection(DB51_CONFIG_PORT_NAME); /* bit 0: pin is input; 1: pin is output */ + val |= (1< output */ + PINS_DRV_SetPinsDirection(DB51_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_output(DB51_CONFIG_PIN_NUMBER); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsOutput(pin, false /* don't care */); +#endif + DB51_isOutput = true; +} + +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ +void DB51_PutVal(bool Val) +{ +#if McuLib_CONFIG_CPU_IS_LPC + if (Val) { + GPIO_PortSet(DB51_CONFIG_GPIO_NAME, DB51_CONFIG_PORT_NAME, 1<_ */ + _IOCON_PIO_FUNC0 | + /* Selects pull-up function */ + _IOCON_PIO_MODE_PULLUP | + /* Standard mode, output slew rate control is enabled */ + _IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + _IOCON_PIO_INV_DI | + /* Enables digital function */ + _IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + _IOCON_PIO_OPENDRAIN_DI); + #if (McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0) + IOCON_PinMuxSet(DB51_CONFIG_PORT_NAME, DB51_CONFIG_PIN_NUMBER, port_pin_config); + #else + IOCON_PinMuxSet(IOCON, DB51_CONFIG_PORT_NAME, DB51_CONFIG_PIN_NUMBER, port_pin_config); + #endif + #else + PORT_SetPinMux(DB51_CONFIG_PORT_NAME, DB51_CONFIG_PIN_NUMBER, kPORT_MuxAsGpio); /* mux as GPIO */ + #endif + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + /*! Pin Muxing not implemented */ + GPIO_DRV_Init(DB51_InputConfig, DB51_OutputConfig); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + /* the following needs to be called in the application first: + PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); + */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + config.hw.pin = DB51_CONFIG_PIN_NUMBER; + config.isInput = true; + pin = McuGPIO_InitGPIO(&config); +#endif +#if DB51_CONFIG_INIT_PIN_DIRECTION == DB51_CONFIG_INIT_PIN_DIRECTION_INPUT + DB51_SetInput(); +#elif DB51_CONFIG_INIT_PIN_DIRECTION == DB51_CONFIG_INIT_PIN_DIRECTION_OUTPUT + DB51_SetOutput(); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB51_Deinit(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + pin = McuGPIO_DeinitGPIO(pin); +#endif +} + +/* END DB51. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB51.h b/TSM_PicoW_Sensor/McuLib/HD44780/DB51.h new file mode 100644 index 0000000..d31790a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB51.h @@ -0,0 +1,243 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : DB51.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : DB51 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool DB51_GetDir(void); +** SetDir - void DB51_SetDir(bool Dir); +** SetInput - void DB51_SetInput(void); +** SetOutput - void DB51_SetOutput(void); +** GetVal - bool DB51_GetVal(void); +** PutVal - void DB51_PutVal(bool Val); +** ClrVal - void DB51_ClrVal(void); +** SetVal - void DB51_SetVal(void); +** NegVal - void DB51_NegVal(void); +** Init - void DB51_Init(void); +** Deinit - void DB51_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file DB51.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup DB51_module DB51 module documentation +** @{ +*/ + +#ifndef __DB51_H +#define __DB51_H + +/* MODULE DB51. */ +#include "McuLib.h" /* SDK and API used */ +#include "DB51config.h" /* configuration */ + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" + + /* only GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF and GPIOG are currently supported */ + #define DB51_GPIO_IDX GPIOA_IDX /* GPIOA */ + + enum DB51_pinNames{ + DB51_CONFIG_PIN_SYMBOL = GPIO_MAKE_PIN(DB51_GPIO_IDX, DB51_CONFIG_PIN_NUMBER), + }; + + extern const gpio_output_pin_user_config_t DB51_OutputConfig[]; + extern const gpio_input_pin_user_config_t DB51_InputConfig[]; +#endif + +void DB51_Init(void); +/* +** =================================================================== +** Method : Init (component SDK_BitIO) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB51_ClrVal(void); +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB51_SetVal(void); +/* +** =================================================================== +** Method : SetVal (component SDK_BitIO) +** +** Description : +** Sets the pin value to a high value. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB51_NegVal(void); +/* +** =================================================================== +** Method : NegVal (component SDK_BitIO) +** +** Description : +** Toggles/negates the pin value +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB51_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +bool DB51_GetVal(void); +/* +** =================================================================== +** Method : GetVal (component SDK_BitIO) +** +** Description : +** Returns the pin value +** Parameters : None +** Returns : +** --- - Returns the value of the pin: +** FALSE/logical level '0' or TRUE/logical +** level '1' +** =================================================================== +*/ + +bool DB51_GetDir(void); +/* +** =================================================================== +** Method : GetDir (component SDK_BitIO) +** +** Description : +** Return the direction of the pin (input/output) +** Parameters : None +** Returns : +** --- - FALSE if port is input, TRUE if port is +** output +** =================================================================== +*/ + +void DB51_SetDir(bool Dir); +/* +** =================================================================== +** Method : SetDir (component SDK_BitIO) +** +** Description : +** Sets the direction of the pin (input or output) +** Parameters : +** NAME - DESCRIPTION +** Dir - FALSE: input, TRUE: output +** Returns : Nothing +** =================================================================== +*/ + +void DB51_SetInput(void); +/* +** =================================================================== +** Method : SetInput (component SDK_BitIO) +** +** Description : +** Sets the pin as input +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB51_SetOutput(void); +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB51_PutVal(bool Val); +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ + +/* END DB51. */ + +#endif +/* ifndef __DB51_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB51config.h b/TSM_PicoW_Sensor/McuLib/HD44780/DB51config.h new file mode 100644 index 0000000..96d5703 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB51config.h @@ -0,0 +1,87 @@ +/** + * \file + * \brief Configuration header file for SDK_BitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SDK Bit I/O module. + */ + +#ifndef __DB51_CONFIG_H +#define __DB51_CONFIG_H + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_MCUXPRESSO_2_0 + #include "pin_mux.h" /* include pin muxing header file */ + + #if defined(BOARD_INITPINS_DB51_PIN) + #define DB51_CONFIG_PIN_NUMBER BOARD_INITPINS_DB51_PIN + #endif + #if defined(BOARD_INITPINS_DB51_GPIO) + #define DB51_CONFIG_GPIO_NAME BOARD_INITPINS_DB51_GPIO + #endif + #if defined(BOARD_INITPINS_DB51_PORT) + #define DB51_CONFIG_PORT_NAME BOARD_INITPINS_DB51_PORT + #endif +#endif + +#ifndef DB51_CONFIG_PORT_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define DB51_CONFIG_PORT_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define DB51_CONFIG_PORT_NAME 0 + #else /* name from properties */ + #define DB51_CONFIG_PORT_NAME PORTA + #endif + /*!< name of PORT, is pointer to PORT_Type */ +#endif + +#ifndef DB51_CONFIG_GPIO_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define DB51_CONFIG_GPIO_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define DB51_CONFIG_GPIO_NAME GPIO + #elif McuLib_CONFIG_CPU_IS_KINETIS && McuLib_CONFIG_IS_KINETIS_KE + #define DB51_CONFIG_GPIO_NAME 0 + #elif McuLib_CONFIG_CPU_IS_MCX + #define DB51_CONFIG_GPIO_NAME GPIO0 + #else /* name from properties */ + #define DB51_CONFIG_GPIO_NAME GPIOA + #endif + /*!< name of GPIO, is pointer to GPIO_Type, not used for S32K SDK */ +#endif + +#ifndef DB51_CONFIG_PIN_NUMBER + #define DB51_CONFIG_PIN_NUMBER 0u + /*!< number of pin, type unsigned integer */ +#endif + +#ifndef DB51_CONFIG_PIN_SYMBOL + #define DB51_CONFIG_PIN_SYMBOL LED_RED + /*!< symbolic name for pin, used for NXP SDK V1.3 */ +#endif + +#ifndef DB51_CONFIG_INIT_PIN_VALUE + #define DB51_CONFIG_INIT_PIN_VALUE 0 + /*!< 0: Pin data is initialized with 0 (low); 1: pin value is initialized with 1 (high) */ +#endif + +/* different types of pin direction settings */ +#define DB51_CONFIG_INIT_PIN_DIRECTION_NONE (0) +#define DB51_CONFIG_INIT_PIN_DIRECTION_INPUT (1) +#define DB51_CONFIG_INIT_PIN_DIRECTION_OUTPUT (2) + +#ifndef DB51_CONFIG_INIT_PIN_DIRECTION + #define DB51_CONFIG_INIT_PIN_DIRECTION DB51_CONFIG_INIT_PIN_DIRECTION_OUTPUT +#endif + +#ifndef DB51_CONFIG_DO_PIN_MUXING + #define DB51_CONFIG_DO_PIN_MUXING 0 + /*!< 1: perform pin muxing in Init(), 0: do not do pin muxing */ +#endif + +#ifndef DB51_CONFIG_PULL_RESISTOR + #define DB51_CONFIG_PULL_RESISTOR 0 + /*!< pull resistor setting. 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ +#endif + +#endif /* __DB51_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB61.c b/TSM_PicoW_Sensor/McuLib/HD44780/DB61.c new file mode 100644 index 0000000..3429f60 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB61.c @@ -0,0 +1,537 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : DB61.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : DB61 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool DB61_GetDir(void); +** SetDir - void DB61_SetDir(bool Dir); +** SetInput - void DB61_SetInput(void); +** SetOutput - void DB61_SetOutput(void); +** GetVal - bool DB61_GetVal(void); +** PutVal - void DB61_PutVal(bool Val); +** ClrVal - void DB61_ClrVal(void); +** SetVal - void DB61_SetVal(void); +** NegVal - void DB61_NegVal(void); +** Init - void DB61_Init(void); +** Deinit - void DB61_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file DB61.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup DB61_module DB61 module documentation +** @{ +*/ + +/* MODULE DB61. */ + +#include "DB61.h" +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if DB61_CONFIG_DO_PIN_MUXING + #if McuLib_CONFIG_CPU_IS_LPC + #include "fsl_iocon.h" /* include SDK header file for I/O connection muxing */ + #else /* Kinetis */ + #include "fsl_port.h" /* include SDK header file for port muxing */ + #endif + #endif + #include "fsl_gpio.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + #include "pins_gpio_hw_access.h" + #include "pins_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + #include "nrf_gpio.h" +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + #include "McuGPIO.h" +#else + #error "Unsupported SDK!" +#endif + +#if McuLib_CONFIG_NXP_SDK_2_0_USED + static const gpio_pin_config_t DB61_configOutput = { + kGPIO_DigitalOutput, /* use as output pin */ + DB61_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; + + static const gpio_pin_config_t DB61_configInput = { + kGPIO_DigitalInput, /* use as input pin */ + DB61_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + const gpio_output_pin_user_config_t DB61_OutputConfig[] = { + { + .pinName = DB61_CONFIG_PIN_SYMBOL, + .config.outputLogic = DB61_CONFIG_INIT_PIN_VALUE, + #if FSL_FEATURE_PORT_HAS_SLEW_RATE + .config.slewRate = kPortSlowSlewRate, + #endif + #if FSL_FEATURE_PORT_HAS_OPEN_DRAIN + .config.isOpenDrainEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH + .config.driveStrength = kPortLowDriveStrength, + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; + + const gpio_input_pin_user_config_t DB61_InputConfig[] = { + { + .pinName = DB61_CONFIG_PIN_SYMBOL, + #if FSL_FEATURE_PORT_HAS_PULL_ENABLE + #if DB61_CONFIG_PULL_RESISTOR==0 /* 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ + .config.isPullEnable = false, + #else + .config.isPullEnable = true, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PULL_SELECTION + #if DB61_CONFIG_PULL_RESISTOR==1 + .config.pullSelect = kPortPullUp, + #else + .config.pullSelect = kPortPullDown, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER + .config.isPassiveFilterEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER + .config.isDigitalFilterEnabled = true, + #endif + #if FSL_FEATURE_GPIO_HAS_INTERRUPT_VECTOR + .config.interrupt = kPortIntDisabled + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + static McuGPIO_Handle_t pin; +#endif + +static bool DB61_isOutput = false; +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB61_ClrVal(void) +{ +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if McuLib_CONFIG_CPU_IS_LPC + GPIO_PortClear(DB61_CONFIG_GPIO_NAME, DB61_CONFIG_PORT_NAME, 1< input */ + PINS_DRV_SetPinsDirection(DB61_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_input(DB61_CONFIG_PIN_NUMBER, NRF_GPIO_PIN_NOPULL); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsInput(pin); +#endif + DB61_isOutput = false; +} + +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB61_SetOutput(void) +{ +#if McuLib_CONFIG_CPU_IS_LPC + GPIO_PinInit(DB61_CONFIG_GPIO_NAME, DB61_CONFIG_PORT_NAME, DB61_CONFIG_PIN_NUMBER, &DB61_configOutput); +#elif McuLib_CONFIG_NXP_SDK_2_0_USED + GPIO_PinInit(DB61_CONFIG_GPIO_NAME, DB61_CONFIG_PIN_NUMBER, &DB61_configOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + GPIO_DRV_SetPinDir(DB61_CONFIG_PIN_SYMBOL, kGpioDigitalOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + pins_channel_type_t val; + + val = PINS_GPIO_GetPinsDirection(DB61_CONFIG_PORT_NAME); /* bit 0: pin is input; 1: pin is output */ + val |= (1< output */ + PINS_DRV_SetPinsDirection(DB61_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_output(DB61_CONFIG_PIN_NUMBER); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsOutput(pin, false /* don't care */); +#endif + DB61_isOutput = true; +} + +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ +void DB61_PutVal(bool Val) +{ +#if McuLib_CONFIG_CPU_IS_LPC + if (Val) { + GPIO_PortSet(DB61_CONFIG_GPIO_NAME, DB61_CONFIG_PORT_NAME, 1<_ */ + _IOCON_PIO_FUNC0 | + /* Selects pull-up function */ + _IOCON_PIO_MODE_PULLUP | + /* Standard mode, output slew rate control is enabled */ + _IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + _IOCON_PIO_INV_DI | + /* Enables digital function */ + _IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + _IOCON_PIO_OPENDRAIN_DI); + #if (McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0) + IOCON_PinMuxSet(DB61_CONFIG_PORT_NAME, DB61_CONFIG_PIN_NUMBER, port_pin_config); + #else + IOCON_PinMuxSet(IOCON, DB61_CONFIG_PORT_NAME, DB61_CONFIG_PIN_NUMBER, port_pin_config); + #endif + #else + PORT_SetPinMux(DB61_CONFIG_PORT_NAME, DB61_CONFIG_PIN_NUMBER, kPORT_MuxAsGpio); /* mux as GPIO */ + #endif + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + /*! Pin Muxing not implemented */ + GPIO_DRV_Init(DB61_InputConfig, DB61_OutputConfig); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + /* the following needs to be called in the application first: + PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); + */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + config.hw.pin = DB61_CONFIG_PIN_NUMBER; + config.isInput = true; + pin = McuGPIO_InitGPIO(&config); +#endif +#if DB61_CONFIG_INIT_PIN_DIRECTION == DB61_CONFIG_INIT_PIN_DIRECTION_INPUT + DB61_SetInput(); +#elif DB61_CONFIG_INIT_PIN_DIRECTION == DB61_CONFIG_INIT_PIN_DIRECTION_OUTPUT + DB61_SetOutput(); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB61_Deinit(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + pin = McuGPIO_DeinitGPIO(pin); +#endif +} + +/* END DB61. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB61.h b/TSM_PicoW_Sensor/McuLib/HD44780/DB61.h new file mode 100644 index 0000000..8e4a76c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB61.h @@ -0,0 +1,243 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : DB61.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : DB61 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool DB61_GetDir(void); +** SetDir - void DB61_SetDir(bool Dir); +** SetInput - void DB61_SetInput(void); +** SetOutput - void DB61_SetOutput(void); +** GetVal - bool DB61_GetVal(void); +** PutVal - void DB61_PutVal(bool Val); +** ClrVal - void DB61_ClrVal(void); +** SetVal - void DB61_SetVal(void); +** NegVal - void DB61_NegVal(void); +** Init - void DB61_Init(void); +** Deinit - void DB61_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file DB61.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup DB61_module DB61 module documentation +** @{ +*/ + +#ifndef __DB61_H +#define __DB61_H + +/* MODULE DB61. */ +#include "McuLib.h" /* SDK and API used */ +#include "DB61config.h" /* configuration */ + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" + + /* only GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF and GPIOG are currently supported */ + #define DB61_GPIO_IDX GPIOA_IDX /* GPIOA */ + + enum DB61_pinNames{ + DB61_CONFIG_PIN_SYMBOL = GPIO_MAKE_PIN(DB61_GPIO_IDX, DB61_CONFIG_PIN_NUMBER), + }; + + extern const gpio_output_pin_user_config_t DB61_OutputConfig[]; + extern const gpio_input_pin_user_config_t DB61_InputConfig[]; +#endif + +void DB61_Init(void); +/* +** =================================================================== +** Method : Init (component SDK_BitIO) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB61_ClrVal(void); +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB61_SetVal(void); +/* +** =================================================================== +** Method : SetVal (component SDK_BitIO) +** +** Description : +** Sets the pin value to a high value. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB61_NegVal(void); +/* +** =================================================================== +** Method : NegVal (component SDK_BitIO) +** +** Description : +** Toggles/negates the pin value +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB61_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +bool DB61_GetVal(void); +/* +** =================================================================== +** Method : GetVal (component SDK_BitIO) +** +** Description : +** Returns the pin value +** Parameters : None +** Returns : +** --- - Returns the value of the pin: +** FALSE/logical level '0' or TRUE/logical +** level '1' +** =================================================================== +*/ + +bool DB61_GetDir(void); +/* +** =================================================================== +** Method : GetDir (component SDK_BitIO) +** +** Description : +** Return the direction of the pin (input/output) +** Parameters : None +** Returns : +** --- - FALSE if port is input, TRUE if port is +** output +** =================================================================== +*/ + +void DB61_SetDir(bool Dir); +/* +** =================================================================== +** Method : SetDir (component SDK_BitIO) +** +** Description : +** Sets the direction of the pin (input or output) +** Parameters : +** NAME - DESCRIPTION +** Dir - FALSE: input, TRUE: output +** Returns : Nothing +** =================================================================== +*/ + +void DB61_SetInput(void); +/* +** =================================================================== +** Method : SetInput (component SDK_BitIO) +** +** Description : +** Sets the pin as input +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB61_SetOutput(void); +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB61_PutVal(bool Val); +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ + +/* END DB61. */ + +#endif +/* ifndef __DB61_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB61config.h b/TSM_PicoW_Sensor/McuLib/HD44780/DB61config.h new file mode 100644 index 0000000..f0d9189 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB61config.h @@ -0,0 +1,87 @@ +/** + * \file + * \brief Configuration header file for SDK_BitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SDK Bit I/O module. + */ + +#ifndef __DB61_CONFIG_H +#define __DB61_CONFIG_H + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_MCUXPRESSO_2_0 + #include "pin_mux.h" /* include pin muxing header file */ + + #if defined(BOARD_INITPINS_DB61_PIN) + #define DB61_CONFIG_PIN_NUMBER BOARD_INITPINS_DB61_PIN + #endif + #if defined(BOARD_INITPINS_DB61_GPIO) + #define DB61_CONFIG_GPIO_NAME BOARD_INITPINS_DB61_GPIO + #endif + #if defined(BOARD_INITPINS_DB61_PORT) + #define DB61_CONFIG_PORT_NAME BOARD_INITPINS_DB61_PORT + #endif +#endif + +#ifndef DB61_CONFIG_PORT_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define DB61_CONFIG_PORT_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define DB61_CONFIG_PORT_NAME 0 + #else /* name from properties */ + #define DB61_CONFIG_PORT_NAME PORTA + #endif + /*!< name of PORT, is pointer to PORT_Type */ +#endif + +#ifndef DB61_CONFIG_GPIO_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define DB61_CONFIG_GPIO_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define DB61_CONFIG_GPIO_NAME GPIO + #elif McuLib_CONFIG_CPU_IS_KINETIS && McuLib_CONFIG_IS_KINETIS_KE + #define DB61_CONFIG_GPIO_NAME 0 + #elif McuLib_CONFIG_CPU_IS_MCX + #define DB61_CONFIG_GPIO_NAME GPIO0 + #else /* name from properties */ + #define DB61_CONFIG_GPIO_NAME GPIOA + #endif + /*!< name of GPIO, is pointer to GPIO_Type, not used for S32K SDK */ +#endif + +#ifndef DB61_CONFIG_PIN_NUMBER + #define DB61_CONFIG_PIN_NUMBER 0u + /*!< number of pin, type unsigned integer */ +#endif + +#ifndef DB61_CONFIG_PIN_SYMBOL + #define DB61_CONFIG_PIN_SYMBOL LED_RED + /*!< symbolic name for pin, used for NXP SDK V1.3 */ +#endif + +#ifndef DB61_CONFIG_INIT_PIN_VALUE + #define DB61_CONFIG_INIT_PIN_VALUE 0 + /*!< 0: Pin data is initialized with 0 (low); 1: pin value is initialized with 1 (high) */ +#endif + +/* different types of pin direction settings */ +#define DB61_CONFIG_INIT_PIN_DIRECTION_NONE (0) +#define DB61_CONFIG_INIT_PIN_DIRECTION_INPUT (1) +#define DB61_CONFIG_INIT_PIN_DIRECTION_OUTPUT (2) + +#ifndef DB61_CONFIG_INIT_PIN_DIRECTION + #define DB61_CONFIG_INIT_PIN_DIRECTION DB61_CONFIG_INIT_PIN_DIRECTION_OUTPUT +#endif + +#ifndef DB61_CONFIG_DO_PIN_MUXING + #define DB61_CONFIG_DO_PIN_MUXING 0 + /*!< 1: perform pin muxing in Init(), 0: do not do pin muxing */ +#endif + +#ifndef DB61_CONFIG_PULL_RESISTOR + #define DB61_CONFIG_PULL_RESISTOR 0 + /*!< pull resistor setting. 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ +#endif + +#endif /* __DB61_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB71.c b/TSM_PicoW_Sensor/McuLib/HD44780/DB71.c new file mode 100644 index 0000000..3ea8891 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB71.c @@ -0,0 +1,537 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : DB71.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : DB71 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool DB71_GetDir(void); +** SetDir - void DB71_SetDir(bool Dir); +** SetInput - void DB71_SetInput(void); +** SetOutput - void DB71_SetOutput(void); +** GetVal - bool DB71_GetVal(void); +** PutVal - void DB71_PutVal(bool Val); +** ClrVal - void DB71_ClrVal(void); +** SetVal - void DB71_SetVal(void); +** NegVal - void DB71_NegVal(void); +** Init - void DB71_Init(void); +** Deinit - void DB71_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file DB71.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup DB71_module DB71 module documentation +** @{ +*/ + +/* MODULE DB71. */ + +#include "DB71.h" +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if DB71_CONFIG_DO_PIN_MUXING + #if McuLib_CONFIG_CPU_IS_LPC + #include "fsl_iocon.h" /* include SDK header file for I/O connection muxing */ + #else /* Kinetis */ + #include "fsl_port.h" /* include SDK header file for port muxing */ + #endif + #endif + #include "fsl_gpio.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + #include "pins_gpio_hw_access.h" + #include "pins_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + #include "nrf_gpio.h" +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + #include "McuGPIO.h" +#else + #error "Unsupported SDK!" +#endif + +#if McuLib_CONFIG_NXP_SDK_2_0_USED + static const gpio_pin_config_t DB71_configOutput = { + kGPIO_DigitalOutput, /* use as output pin */ + DB71_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; + + static const gpio_pin_config_t DB71_configInput = { + kGPIO_DigitalInput, /* use as input pin */ + DB71_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + const gpio_output_pin_user_config_t DB71_OutputConfig[] = { + { + .pinName = DB71_CONFIG_PIN_SYMBOL, + .config.outputLogic = DB71_CONFIG_INIT_PIN_VALUE, + #if FSL_FEATURE_PORT_HAS_SLEW_RATE + .config.slewRate = kPortSlowSlewRate, + #endif + #if FSL_FEATURE_PORT_HAS_OPEN_DRAIN + .config.isOpenDrainEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH + .config.driveStrength = kPortLowDriveStrength, + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; + + const gpio_input_pin_user_config_t DB71_InputConfig[] = { + { + .pinName = DB71_CONFIG_PIN_SYMBOL, + #if FSL_FEATURE_PORT_HAS_PULL_ENABLE + #if DB71_CONFIG_PULL_RESISTOR==0 /* 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ + .config.isPullEnable = false, + #else + .config.isPullEnable = true, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PULL_SELECTION + #if DB71_CONFIG_PULL_RESISTOR==1 + .config.pullSelect = kPortPullUp, + #else + .config.pullSelect = kPortPullDown, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER + .config.isPassiveFilterEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER + .config.isDigitalFilterEnabled = true, + #endif + #if FSL_FEATURE_GPIO_HAS_INTERRUPT_VECTOR + .config.interrupt = kPortIntDisabled + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + static McuGPIO_Handle_t pin; +#endif + +static bool DB71_isOutput = false; +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB71_ClrVal(void) +{ +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if McuLib_CONFIG_CPU_IS_LPC + GPIO_PortClear(DB71_CONFIG_GPIO_NAME, DB71_CONFIG_PORT_NAME, 1< input */ + PINS_DRV_SetPinsDirection(DB71_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_input(DB71_CONFIG_PIN_NUMBER, NRF_GPIO_PIN_NOPULL); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsInput(pin); +#endif + DB71_isOutput = false; +} + +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB71_SetOutput(void) +{ +#if McuLib_CONFIG_CPU_IS_LPC + GPIO_PinInit(DB71_CONFIG_GPIO_NAME, DB71_CONFIG_PORT_NAME, DB71_CONFIG_PIN_NUMBER, &DB71_configOutput); +#elif McuLib_CONFIG_NXP_SDK_2_0_USED + GPIO_PinInit(DB71_CONFIG_GPIO_NAME, DB71_CONFIG_PIN_NUMBER, &DB71_configOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + GPIO_DRV_SetPinDir(DB71_CONFIG_PIN_SYMBOL, kGpioDigitalOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + pins_channel_type_t val; + + val = PINS_GPIO_GetPinsDirection(DB71_CONFIG_PORT_NAME); /* bit 0: pin is input; 1: pin is output */ + val |= (1< output */ + PINS_DRV_SetPinsDirection(DB71_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_output(DB71_CONFIG_PIN_NUMBER); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsOutput(pin, false /* don't care */); +#endif + DB71_isOutput = true; +} + +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ +void DB71_PutVal(bool Val) +{ +#if McuLib_CONFIG_CPU_IS_LPC + if (Val) { + GPIO_PortSet(DB71_CONFIG_GPIO_NAME, DB71_CONFIG_PORT_NAME, 1<_ */ + _IOCON_PIO_FUNC0 | + /* Selects pull-up function */ + _IOCON_PIO_MODE_PULLUP | + /* Standard mode, output slew rate control is enabled */ + _IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + _IOCON_PIO_INV_DI | + /* Enables digital function */ + _IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + _IOCON_PIO_OPENDRAIN_DI); + #if (McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0) + IOCON_PinMuxSet(DB71_CONFIG_PORT_NAME, DB71_CONFIG_PIN_NUMBER, port_pin_config); + #else + IOCON_PinMuxSet(IOCON, DB71_CONFIG_PORT_NAME, DB71_CONFIG_PIN_NUMBER, port_pin_config); + #endif + #else + PORT_SetPinMux(DB71_CONFIG_PORT_NAME, DB71_CONFIG_PIN_NUMBER, kPORT_MuxAsGpio); /* mux as GPIO */ + #endif + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + /*! Pin Muxing not implemented */ + GPIO_DRV_Init(DB71_InputConfig, DB71_OutputConfig); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + /* the following needs to be called in the application first: + PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); + */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + config.hw.pin = DB71_CONFIG_PIN_NUMBER; + config.isInput = true; + pin = McuGPIO_InitGPIO(&config); +#endif +#if DB71_CONFIG_INIT_PIN_DIRECTION == DB71_CONFIG_INIT_PIN_DIRECTION_INPUT + DB71_SetInput(); +#elif DB71_CONFIG_INIT_PIN_DIRECTION == DB71_CONFIG_INIT_PIN_DIRECTION_OUTPUT + DB71_SetOutput(); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DB71_Deinit(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + pin = McuGPIO_DeinitGPIO(pin); +#endif +} + +/* END DB71. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB71.h b/TSM_PicoW_Sensor/McuLib/HD44780/DB71.h new file mode 100644 index 0000000..f39d372 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB71.h @@ -0,0 +1,243 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : DB71.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : DB71 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool DB71_GetDir(void); +** SetDir - void DB71_SetDir(bool Dir); +** SetInput - void DB71_SetInput(void); +** SetOutput - void DB71_SetOutput(void); +** GetVal - bool DB71_GetVal(void); +** PutVal - void DB71_PutVal(bool Val); +** ClrVal - void DB71_ClrVal(void); +** SetVal - void DB71_SetVal(void); +** NegVal - void DB71_NegVal(void); +** Init - void DB71_Init(void); +** Deinit - void DB71_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file DB71.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup DB71_module DB71 module documentation +** @{ +*/ + +#ifndef __DB71_H +#define __DB71_H + +/* MODULE DB71. */ +#include "McuLib.h" /* SDK and API used */ +#include "DB71config.h" /* configuration */ + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" + + /* only GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF and GPIOG are currently supported */ + #define DB71_GPIO_IDX GPIOA_IDX /* GPIOA */ + + enum DB71_pinNames{ + DB71_CONFIG_PIN_SYMBOL = GPIO_MAKE_PIN(DB71_GPIO_IDX, DB71_CONFIG_PIN_NUMBER), + }; + + extern const gpio_output_pin_user_config_t DB71_OutputConfig[]; + extern const gpio_input_pin_user_config_t DB71_InputConfig[]; +#endif + +void DB71_Init(void); +/* +** =================================================================== +** Method : Init (component SDK_BitIO) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB71_ClrVal(void); +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB71_SetVal(void); +/* +** =================================================================== +** Method : SetVal (component SDK_BitIO) +** +** Description : +** Sets the pin value to a high value. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB71_NegVal(void); +/* +** =================================================================== +** Method : NegVal (component SDK_BitIO) +** +** Description : +** Toggles/negates the pin value +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB71_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +bool DB71_GetVal(void); +/* +** =================================================================== +** Method : GetVal (component SDK_BitIO) +** +** Description : +** Returns the pin value +** Parameters : None +** Returns : +** --- - Returns the value of the pin: +** FALSE/logical level '0' or TRUE/logical +** level '1' +** =================================================================== +*/ + +bool DB71_GetDir(void); +/* +** =================================================================== +** Method : GetDir (component SDK_BitIO) +** +** Description : +** Return the direction of the pin (input/output) +** Parameters : None +** Returns : +** --- - FALSE if port is input, TRUE if port is +** output +** =================================================================== +*/ + +void DB71_SetDir(bool Dir); +/* +** =================================================================== +** Method : SetDir (component SDK_BitIO) +** +** Description : +** Sets the direction of the pin (input or output) +** Parameters : +** NAME - DESCRIPTION +** Dir - FALSE: input, TRUE: output +** Returns : Nothing +** =================================================================== +*/ + +void DB71_SetInput(void); +/* +** =================================================================== +** Method : SetInput (component SDK_BitIO) +** +** Description : +** Sets the pin as input +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB71_SetOutput(void); +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DB71_PutVal(bool Val); +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ + +/* END DB71. */ + +#endif +/* ifndef __DB71_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/DB71config.h b/TSM_PicoW_Sensor/McuLib/HD44780/DB71config.h new file mode 100644 index 0000000..2cc3a84 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/DB71config.h @@ -0,0 +1,87 @@ +/** + * \file + * \brief Configuration header file for SDK_BitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SDK Bit I/O module. + */ + +#ifndef __DB71_CONFIG_H +#define __DB71_CONFIG_H + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_MCUXPRESSO_2_0 + #include "pin_mux.h" /* include pin muxing header file */ + + #if defined(BOARD_INITPINS_DB71_PIN) + #define DB71_CONFIG_PIN_NUMBER BOARD_INITPINS_DB71_PIN + #endif + #if defined(BOARD_INITPINS_DB71_GPIO) + #define DB71_CONFIG_GPIO_NAME BOARD_INITPINS_DB71_GPIO + #endif + #if defined(BOARD_INITPINS_DB71_PORT) + #define DB71_CONFIG_PORT_NAME BOARD_INITPINS_DB71_PORT + #endif +#endif + +#ifndef DB71_CONFIG_PORT_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define DB71_CONFIG_PORT_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define DB71_CONFIG_PORT_NAME 0 + #else /* name from properties */ + #define DB71_CONFIG_PORT_NAME PORTA + #endif + /*!< name of PORT, is pointer to PORT_Type */ +#endif + +#ifndef DB71_CONFIG_GPIO_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define DB71_CONFIG_GPIO_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define DB71_CONFIG_GPIO_NAME GPIO + #elif McuLib_CONFIG_CPU_IS_KINETIS && McuLib_CONFIG_IS_KINETIS_KE + #define DB71_CONFIG_GPIO_NAME 0 + #elif McuLib_CONFIG_CPU_IS_MCX + #define DB71_CONFIG_GPIO_NAME GPIO0 + #else /* name from properties */ + #define DB71_CONFIG_GPIO_NAME GPIOA + #endif + /*!< name of GPIO, is pointer to GPIO_Type, not used for S32K SDK */ +#endif + +#ifndef DB71_CONFIG_PIN_NUMBER + #define DB71_CONFIG_PIN_NUMBER 0u + /*!< number of pin, type unsigned integer */ +#endif + +#ifndef DB71_CONFIG_PIN_SYMBOL + #define DB71_CONFIG_PIN_SYMBOL LED_RED + /*!< symbolic name for pin, used for NXP SDK V1.3 */ +#endif + +#ifndef DB71_CONFIG_INIT_PIN_VALUE + #define DB71_CONFIG_INIT_PIN_VALUE 0 + /*!< 0: Pin data is initialized with 0 (low); 1: pin value is initialized with 1 (high) */ +#endif + +/* different types of pin direction settings */ +#define DB71_CONFIG_INIT_PIN_DIRECTION_NONE (0) +#define DB71_CONFIG_INIT_PIN_DIRECTION_INPUT (1) +#define DB71_CONFIG_INIT_PIN_DIRECTION_OUTPUT (2) + +#ifndef DB71_CONFIG_INIT_PIN_DIRECTION + #define DB71_CONFIG_INIT_PIN_DIRECTION DB71_CONFIG_INIT_PIN_DIRECTION_OUTPUT +#endif + +#ifndef DB71_CONFIG_DO_PIN_MUXING + #define DB71_CONFIG_DO_PIN_MUXING 0 + /*!< 1: perform pin muxing in Init(), 0: do not do pin muxing */ +#endif + +#ifndef DB71_CONFIG_PULL_RESISTOR + #define DB71_CONFIG_PULL_RESISTOR 0 + /*!< pull resistor setting. 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ +#endif + +#endif /* __DB71_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/EN1.c b/TSM_PicoW_Sensor/McuLib/HD44780/EN1.c new file mode 100644 index 0000000..f0ee02e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/EN1.c @@ -0,0 +1,537 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : EN1.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : EN1 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool EN1_GetDir(void); +** SetDir - void EN1_SetDir(bool Dir); +** SetInput - void EN1_SetInput(void); +** SetOutput - void EN1_SetOutput(void); +** GetVal - bool EN1_GetVal(void); +** PutVal - void EN1_PutVal(bool Val); +** ClrVal - void EN1_ClrVal(void); +** SetVal - void EN1_SetVal(void); +** NegVal - void EN1_NegVal(void); +** Init - void EN1_Init(void); +** Deinit - void EN1_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file EN1.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup EN1_module EN1 module documentation +** @{ +*/ + +/* MODULE EN1. */ + +#include "EN1.h" +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if EN1_CONFIG_DO_PIN_MUXING + #if McuLib_CONFIG_CPU_IS_LPC + #include "fsl_iocon.h" /* include SDK header file for I/O connection muxing */ + #else /* Kinetis */ + #include "fsl_port.h" /* include SDK header file for port muxing */ + #endif + #endif + #include "fsl_gpio.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + #include "pins_gpio_hw_access.h" + #include "pins_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + #include "nrf_gpio.h" +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + #include "McuGPIO.h" +#else + #error "Unsupported SDK!" +#endif + +#if McuLib_CONFIG_NXP_SDK_2_0_USED + static const gpio_pin_config_t EN1_configOutput = { + kGPIO_DigitalOutput, /* use as output pin */ + EN1_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; + + static const gpio_pin_config_t EN1_configInput = { + kGPIO_DigitalInput, /* use as input pin */ + EN1_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + const gpio_output_pin_user_config_t EN1_OutputConfig[] = { + { + .pinName = EN1_CONFIG_PIN_SYMBOL, + .config.outputLogic = EN1_CONFIG_INIT_PIN_VALUE, + #if FSL_FEATURE_PORT_HAS_SLEW_RATE + .config.slewRate = kPortSlowSlewRate, + #endif + #if FSL_FEATURE_PORT_HAS_OPEN_DRAIN + .config.isOpenDrainEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH + .config.driveStrength = kPortLowDriveStrength, + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; + + const gpio_input_pin_user_config_t EN1_InputConfig[] = { + { + .pinName = EN1_CONFIG_PIN_SYMBOL, + #if FSL_FEATURE_PORT_HAS_PULL_ENABLE + #if EN1_CONFIG_PULL_RESISTOR==0 /* 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ + .config.isPullEnable = false, + #else + .config.isPullEnable = true, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PULL_SELECTION + #if EN1_CONFIG_PULL_RESISTOR==1 + .config.pullSelect = kPortPullUp, + #else + .config.pullSelect = kPortPullDown, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER + .config.isPassiveFilterEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER + .config.isDigitalFilterEnabled = true, + #endif + #if FSL_FEATURE_GPIO_HAS_INTERRUPT_VECTOR + .config.interrupt = kPortIntDisabled + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + static McuGPIO_Handle_t pin; +#endif + +static bool EN1_isOutput = false; +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void EN1_ClrVal(void) +{ +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if McuLib_CONFIG_CPU_IS_LPC + GPIO_PortClear(EN1_CONFIG_GPIO_NAME, EN1_CONFIG_PORT_NAME, 1< input */ + PINS_DRV_SetPinsDirection(EN1_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_input(EN1_CONFIG_PIN_NUMBER, NRF_GPIO_PIN_NOPULL); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsInput(pin); +#endif + EN1_isOutput = false; +} + +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void EN1_SetOutput(void) +{ +#if McuLib_CONFIG_CPU_IS_LPC + GPIO_PinInit(EN1_CONFIG_GPIO_NAME, EN1_CONFIG_PORT_NAME, EN1_CONFIG_PIN_NUMBER, &EN1_configOutput); +#elif McuLib_CONFIG_NXP_SDK_2_0_USED + GPIO_PinInit(EN1_CONFIG_GPIO_NAME, EN1_CONFIG_PIN_NUMBER, &EN1_configOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + GPIO_DRV_SetPinDir(EN1_CONFIG_PIN_SYMBOL, kGpioDigitalOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + pins_channel_type_t val; + + val = PINS_GPIO_GetPinsDirection(EN1_CONFIG_PORT_NAME); /* bit 0: pin is input; 1: pin is output */ + val |= (1< output */ + PINS_DRV_SetPinsDirection(EN1_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_output(EN1_CONFIG_PIN_NUMBER); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsOutput(pin, false /* don't care */); +#endif + EN1_isOutput = true; +} + +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ +void EN1_PutVal(bool Val) +{ +#if McuLib_CONFIG_CPU_IS_LPC + if (Val) { + GPIO_PortSet(EN1_CONFIG_GPIO_NAME, EN1_CONFIG_PORT_NAME, 1<_ */ + _IOCON_PIO_FUNC0 | + /* Selects pull-up function */ + _IOCON_PIO_MODE_PULLUP | + /* Standard mode, output slew rate control is enabled */ + _IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + _IOCON_PIO_INV_DI | + /* Enables digital function */ + _IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + _IOCON_PIO_OPENDRAIN_DI); + #if (McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0) + IOCON_PinMuxSet(EN1_CONFIG_PORT_NAME, EN1_CONFIG_PIN_NUMBER, port_pin_config); + #else + IOCON_PinMuxSet(IOCON, EN1_CONFIG_PORT_NAME, EN1_CONFIG_PIN_NUMBER, port_pin_config); + #endif + #else + PORT_SetPinMux(EN1_CONFIG_PORT_NAME, EN1_CONFIG_PIN_NUMBER, kPORT_MuxAsGpio); /* mux as GPIO */ + #endif + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + /*! Pin Muxing not implemented */ + GPIO_DRV_Init(EN1_InputConfig, EN1_OutputConfig); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + /* the following needs to be called in the application first: + PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); + */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + config.hw.pin = EN1_CONFIG_PIN_NUMBER; + config.isInput = true; + pin = McuGPIO_InitGPIO(&config); +#endif +#if EN1_CONFIG_INIT_PIN_DIRECTION == EN1_CONFIG_INIT_PIN_DIRECTION_INPUT + EN1_SetInput(); +#elif EN1_CONFIG_INIT_PIN_DIRECTION == EN1_CONFIG_INIT_PIN_DIRECTION_OUTPUT + EN1_SetOutput(); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void EN1_Deinit(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + pin = McuGPIO_DeinitGPIO(pin); +#endif +} + +/* END EN1. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/EN1.h b/TSM_PicoW_Sensor/McuLib/HD44780/EN1.h new file mode 100644 index 0000000..0e573ca --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/EN1.h @@ -0,0 +1,243 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : EN1.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : EN1 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool EN1_GetDir(void); +** SetDir - void EN1_SetDir(bool Dir); +** SetInput - void EN1_SetInput(void); +** SetOutput - void EN1_SetOutput(void); +** GetVal - bool EN1_GetVal(void); +** PutVal - void EN1_PutVal(bool Val); +** ClrVal - void EN1_ClrVal(void); +** SetVal - void EN1_SetVal(void); +** NegVal - void EN1_NegVal(void); +** Init - void EN1_Init(void); +** Deinit - void EN1_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file EN1.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup EN1_module EN1 module documentation +** @{ +*/ + +#ifndef __EN1_H +#define __EN1_H + +/* MODULE EN1. */ +#include "McuLib.h" /* SDK and API used */ +#include "EN1config.h" /* configuration */ + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" + + /* only GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF and GPIOG are currently supported */ + #define EN1_GPIO_IDX GPIOA_IDX /* GPIOA */ + + enum EN1_pinNames{ + EN1_CONFIG_PIN_SYMBOL = GPIO_MAKE_PIN(EN1_GPIO_IDX, EN1_CONFIG_PIN_NUMBER), + }; + + extern const gpio_output_pin_user_config_t EN1_OutputConfig[]; + extern const gpio_input_pin_user_config_t EN1_InputConfig[]; +#endif + +void EN1_Init(void); +/* +** =================================================================== +** Method : Init (component SDK_BitIO) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void EN1_ClrVal(void); +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void EN1_SetVal(void); +/* +** =================================================================== +** Method : SetVal (component SDK_BitIO) +** +** Description : +** Sets the pin value to a high value. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void EN1_NegVal(void); +/* +** =================================================================== +** Method : NegVal (component SDK_BitIO) +** +** Description : +** Toggles/negates the pin value +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void EN1_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +bool EN1_GetVal(void); +/* +** =================================================================== +** Method : GetVal (component SDK_BitIO) +** +** Description : +** Returns the pin value +** Parameters : None +** Returns : +** --- - Returns the value of the pin: +** FALSE/logical level '0' or TRUE/logical +** level '1' +** =================================================================== +*/ + +bool EN1_GetDir(void); +/* +** =================================================================== +** Method : GetDir (component SDK_BitIO) +** +** Description : +** Return the direction of the pin (input/output) +** Parameters : None +** Returns : +** --- - FALSE if port is input, TRUE if port is +** output +** =================================================================== +*/ + +void EN1_SetDir(bool Dir); +/* +** =================================================================== +** Method : SetDir (component SDK_BitIO) +** +** Description : +** Sets the direction of the pin (input or output) +** Parameters : +** NAME - DESCRIPTION +** Dir - FALSE: input, TRUE: output +** Returns : Nothing +** =================================================================== +*/ + +void EN1_SetInput(void); +/* +** =================================================================== +** Method : SetInput (component SDK_BitIO) +** +** Description : +** Sets the pin as input +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void EN1_SetOutput(void); +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void EN1_PutVal(bool Val); +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ + +/* END EN1. */ + +#endif +/* ifndef __EN1_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/EN1config.h b/TSM_PicoW_Sensor/McuLib/HD44780/EN1config.h new file mode 100644 index 0000000..fc52667 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/EN1config.h @@ -0,0 +1,87 @@ +/** + * \file + * \brief Configuration header file for SDK_BitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SDK Bit I/O module. + */ + +#ifndef __EN1_CONFIG_H +#define __EN1_CONFIG_H + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_MCUXPRESSO_2_0 + #include "pin_mux.h" /* include pin muxing header file */ + + #if defined(BOARD_INITPINS_EN1_PIN) + #define EN1_CONFIG_PIN_NUMBER BOARD_INITPINS_EN1_PIN + #endif + #if defined(BOARD_INITPINS_EN1_GPIO) + #define EN1_CONFIG_GPIO_NAME BOARD_INITPINS_EN1_GPIO + #endif + #if defined(BOARD_INITPINS_EN1_PORT) + #define EN1_CONFIG_PORT_NAME BOARD_INITPINS_EN1_PORT + #endif +#endif + +#ifndef EN1_CONFIG_PORT_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define EN1_CONFIG_PORT_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define EN1_CONFIG_PORT_NAME 0 + #else /* name from properties */ + #define EN1_CONFIG_PORT_NAME PORTA + #endif + /*!< name of PORT, is pointer to PORT_Type */ +#endif + +#ifndef EN1_CONFIG_GPIO_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define EN1_CONFIG_GPIO_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define EN1_CONFIG_GPIO_NAME GPIO + #elif McuLib_CONFIG_CPU_IS_KINETIS && McuLib_CONFIG_IS_KINETIS_KE + #define EN1_CONFIG_GPIO_NAME 0 + #elif McuLib_CONFIG_CPU_IS_MCX + #define EN1_CONFIG_GPIO_NAME GPIO0 + #else /* name from properties */ + #define EN1_CONFIG_GPIO_NAME GPIOA + #endif + /*!< name of GPIO, is pointer to GPIO_Type, not used for S32K SDK */ +#endif + +#ifndef EN1_CONFIG_PIN_NUMBER + #define EN1_CONFIG_PIN_NUMBER 0u + /*!< number of pin, type unsigned integer */ +#endif + +#ifndef EN1_CONFIG_PIN_SYMBOL + #define EN1_CONFIG_PIN_SYMBOL LED_RED + /*!< symbolic name for pin, used for NXP SDK V1.3 */ +#endif + +#ifndef EN1_CONFIG_INIT_PIN_VALUE + #define EN1_CONFIG_INIT_PIN_VALUE 0 + /*!< 0: Pin data is initialized with 0 (low); 1: pin value is initialized with 1 (high) */ +#endif + +/* different types of pin direction settings */ +#define EN1_CONFIG_INIT_PIN_DIRECTION_NONE (0) +#define EN1_CONFIG_INIT_PIN_DIRECTION_INPUT (1) +#define EN1_CONFIG_INIT_PIN_DIRECTION_OUTPUT (2) + +#ifndef EN1_CONFIG_INIT_PIN_DIRECTION + #define EN1_CONFIG_INIT_PIN_DIRECTION EN1_CONFIG_INIT_PIN_DIRECTION_OUTPUT +#endif + +#ifndef EN1_CONFIG_DO_PIN_MUXING + #define EN1_CONFIG_DO_PIN_MUXING 0 + /*!< 1: perform pin muxing in Init(), 0: do not do pin muxing */ +#endif + +#ifndef EN1_CONFIG_PULL_RESISTOR + #define EN1_CONFIG_PULL_RESISTOR 0 + /*!< pull resistor setting. 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ +#endif + +#endif /* __EN1_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/EN2.c b/TSM_PicoW_Sensor/McuLib/HD44780/EN2.c new file mode 100644 index 0000000..bc975c9 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/EN2.c @@ -0,0 +1,537 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : EN2.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : EN2 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool EN2_GetDir(void); +** SetDir - void EN2_SetDir(bool Dir); +** SetInput - void EN2_SetInput(void); +** SetOutput - void EN2_SetOutput(void); +** GetVal - bool EN2_GetVal(void); +** PutVal - void EN2_PutVal(bool Val); +** ClrVal - void EN2_ClrVal(void); +** SetVal - void EN2_SetVal(void); +** NegVal - void EN2_NegVal(void); +** Init - void EN2_Init(void); +** Deinit - void EN2_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file EN2.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup EN2_module EN2 module documentation +** @{ +*/ + +/* MODULE EN2. */ + +#include "EN2.h" +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if EN2_CONFIG_DO_PIN_MUXING + #if McuLib_CONFIG_CPU_IS_LPC + #include "fsl_iocon.h" /* include SDK header file for I/O connection muxing */ + #else /* Kinetis */ + #include "fsl_port.h" /* include SDK header file for port muxing */ + #endif + #endif + #include "fsl_gpio.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + #include "pins_gpio_hw_access.h" + #include "pins_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + #include "nrf_gpio.h" +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + #include "McuGPIO.h" +#else + #error "Unsupported SDK!" +#endif + +#if McuLib_CONFIG_NXP_SDK_2_0_USED + static const gpio_pin_config_t EN2_configOutput = { + kGPIO_DigitalOutput, /* use as output pin */ + EN2_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; + + static const gpio_pin_config_t EN2_configInput = { + kGPIO_DigitalInput, /* use as input pin */ + EN2_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + const gpio_output_pin_user_config_t EN2_OutputConfig[] = { + { + .pinName = EN2_CONFIG_PIN_SYMBOL, + .config.outputLogic = EN2_CONFIG_INIT_PIN_VALUE, + #if FSL_FEATURE_PORT_HAS_SLEW_RATE + .config.slewRate = kPortSlowSlewRate, + #endif + #if FSL_FEATURE_PORT_HAS_OPEN_DRAIN + .config.isOpenDrainEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH + .config.driveStrength = kPortLowDriveStrength, + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; + + const gpio_input_pin_user_config_t EN2_InputConfig[] = { + { + .pinName = EN2_CONFIG_PIN_SYMBOL, + #if FSL_FEATURE_PORT_HAS_PULL_ENABLE + #if EN2_CONFIG_PULL_RESISTOR==0 /* 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ + .config.isPullEnable = false, + #else + .config.isPullEnable = true, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PULL_SELECTION + #if EN2_CONFIG_PULL_RESISTOR==1 + .config.pullSelect = kPortPullUp, + #else + .config.pullSelect = kPortPullDown, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER + .config.isPassiveFilterEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER + .config.isDigitalFilterEnabled = true, + #endif + #if FSL_FEATURE_GPIO_HAS_INTERRUPT_VECTOR + .config.interrupt = kPortIntDisabled + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + static McuGPIO_Handle_t pin; +#endif + +static bool EN2_isOutput = false; +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void EN2_ClrVal(void) +{ +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if McuLib_CONFIG_CPU_IS_LPC + GPIO_PortClear(EN2_CONFIG_GPIO_NAME, EN2_CONFIG_PORT_NAME, 1< input */ + PINS_DRV_SetPinsDirection(EN2_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_input(EN2_CONFIG_PIN_NUMBER, NRF_GPIO_PIN_NOPULL); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsInput(pin); +#endif + EN2_isOutput = false; +} + +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void EN2_SetOutput(void) +{ +#if McuLib_CONFIG_CPU_IS_LPC + GPIO_PinInit(EN2_CONFIG_GPIO_NAME, EN2_CONFIG_PORT_NAME, EN2_CONFIG_PIN_NUMBER, &EN2_configOutput); +#elif McuLib_CONFIG_NXP_SDK_2_0_USED + GPIO_PinInit(EN2_CONFIG_GPIO_NAME, EN2_CONFIG_PIN_NUMBER, &EN2_configOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + GPIO_DRV_SetPinDir(EN2_CONFIG_PIN_SYMBOL, kGpioDigitalOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + pins_channel_type_t val; + + val = PINS_GPIO_GetPinsDirection(EN2_CONFIG_PORT_NAME); /* bit 0: pin is input; 1: pin is output */ + val |= (1< output */ + PINS_DRV_SetPinsDirection(EN2_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_output(EN2_CONFIG_PIN_NUMBER); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsOutput(pin, false /* don't care */); +#endif + EN2_isOutput = true; +} + +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ +void EN2_PutVal(bool Val) +{ +#if McuLib_CONFIG_CPU_IS_LPC + if (Val) { + GPIO_PortSet(EN2_CONFIG_GPIO_NAME, EN2_CONFIG_PORT_NAME, 1<_ */ + _IOCON_PIO_FUNC0 | + /* Selects pull-up function */ + _IOCON_PIO_MODE_PULLUP | + /* Standard mode, output slew rate control is enabled */ + _IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + _IOCON_PIO_INV_DI | + /* Enables digital function */ + _IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + _IOCON_PIO_OPENDRAIN_DI); + #if (McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0) + IOCON_PinMuxSet(EN2_CONFIG_PORT_NAME, EN2_CONFIG_PIN_NUMBER, port_pin_config); + #else + IOCON_PinMuxSet(IOCON, EN2_CONFIG_PORT_NAME, EN2_CONFIG_PIN_NUMBER, port_pin_config); + #endif + #else + PORT_SetPinMux(EN2_CONFIG_PORT_NAME, EN2_CONFIG_PIN_NUMBER, kPORT_MuxAsGpio); /* mux as GPIO */ + #endif + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + /*! Pin Muxing not implemented */ + GPIO_DRV_Init(EN2_InputConfig, EN2_OutputConfig); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + /* the following needs to be called in the application first: + PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); + */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + config.hw.pin = EN2_CONFIG_PIN_NUMBER; + config.isInput = true; + pin = McuGPIO_InitGPIO(&config); +#endif +#if EN2_CONFIG_INIT_PIN_DIRECTION == EN2_CONFIG_INIT_PIN_DIRECTION_INPUT + EN2_SetInput(); +#elif EN2_CONFIG_INIT_PIN_DIRECTION == EN2_CONFIG_INIT_PIN_DIRECTION_OUTPUT + EN2_SetOutput(); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void EN2_Deinit(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + pin = McuGPIO_DeinitGPIO(pin); +#endif +} + +/* END EN2. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/EN2.h b/TSM_PicoW_Sensor/McuLib/HD44780/EN2.h new file mode 100644 index 0000000..6f4c10b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/EN2.h @@ -0,0 +1,243 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : EN2.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : EN2 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool EN2_GetDir(void); +** SetDir - void EN2_SetDir(bool Dir); +** SetInput - void EN2_SetInput(void); +** SetOutput - void EN2_SetOutput(void); +** GetVal - bool EN2_GetVal(void); +** PutVal - void EN2_PutVal(bool Val); +** ClrVal - void EN2_ClrVal(void); +** SetVal - void EN2_SetVal(void); +** NegVal - void EN2_NegVal(void); +** Init - void EN2_Init(void); +** Deinit - void EN2_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file EN2.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup EN2_module EN2 module documentation +** @{ +*/ + +#ifndef __EN2_H +#define __EN2_H + +/* MODULE EN2. */ +#include "McuLib.h" /* SDK and API used */ +#include "EN2config.h" /* configuration */ + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" + + /* only GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF and GPIOG are currently supported */ + #define EN2_GPIO_IDX GPIOA_IDX /* GPIOA */ + + enum EN2_pinNames{ + EN2_CONFIG_PIN_SYMBOL = GPIO_MAKE_PIN(EN2_GPIO_IDX, EN2_CONFIG_PIN_NUMBER), + }; + + extern const gpio_output_pin_user_config_t EN2_OutputConfig[]; + extern const gpio_input_pin_user_config_t EN2_InputConfig[]; +#endif + +void EN2_Init(void); +/* +** =================================================================== +** Method : Init (component SDK_BitIO) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void EN2_ClrVal(void); +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void EN2_SetVal(void); +/* +** =================================================================== +** Method : SetVal (component SDK_BitIO) +** +** Description : +** Sets the pin value to a high value. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void EN2_NegVal(void); +/* +** =================================================================== +** Method : NegVal (component SDK_BitIO) +** +** Description : +** Toggles/negates the pin value +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void EN2_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +bool EN2_GetVal(void); +/* +** =================================================================== +** Method : GetVal (component SDK_BitIO) +** +** Description : +** Returns the pin value +** Parameters : None +** Returns : +** --- - Returns the value of the pin: +** FALSE/logical level '0' or TRUE/logical +** level '1' +** =================================================================== +*/ + +bool EN2_GetDir(void); +/* +** =================================================================== +** Method : GetDir (component SDK_BitIO) +** +** Description : +** Return the direction of the pin (input/output) +** Parameters : None +** Returns : +** --- - FALSE if port is input, TRUE if port is +** output +** =================================================================== +*/ + +void EN2_SetDir(bool Dir); +/* +** =================================================================== +** Method : SetDir (component SDK_BitIO) +** +** Description : +** Sets the direction of the pin (input or output) +** Parameters : +** NAME - DESCRIPTION +** Dir - FALSE: input, TRUE: output +** Returns : Nothing +** =================================================================== +*/ + +void EN2_SetInput(void); +/* +** =================================================================== +** Method : SetInput (component SDK_BitIO) +** +** Description : +** Sets the pin as input +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void EN2_SetOutput(void); +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void EN2_PutVal(bool Val); +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ + +/* END EN2. */ + +#endif +/* ifndef __EN2_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/EN2config.h b/TSM_PicoW_Sensor/McuLib/HD44780/EN2config.h new file mode 100644 index 0000000..cae4ba3 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/EN2config.h @@ -0,0 +1,87 @@ +/** + * \file + * \brief Configuration header file for SDK_BitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SDK Bit I/O module. + */ + +#ifndef __EN2_CONFIG_H +#define __EN2_CONFIG_H + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_MCUXPRESSO_2_0 + #include "pin_mux.h" /* include pin muxing header file */ + + #if defined(BOARD_INITPINS_EN2_PIN) + #define EN2_CONFIG_PIN_NUMBER BOARD_INITPINS_EN2_PIN + #endif + #if defined(BOARD_INITPINS_EN2_GPIO) + #define EN2_CONFIG_GPIO_NAME BOARD_INITPINS_EN2_GPIO + #endif + #if defined(BOARD_INITPINS_EN2_PORT) + #define EN2_CONFIG_PORT_NAME BOARD_INITPINS_EN2_PORT + #endif +#endif + +#ifndef EN2_CONFIG_PORT_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define EN2_CONFIG_PORT_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define EN2_CONFIG_PORT_NAME 0 + #else /* name from properties */ + #define EN2_CONFIG_PORT_NAME PORTA + #endif + /*!< name of PORT, is pointer to PORT_Type */ +#endif + +#ifndef EN2_CONFIG_GPIO_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define EN2_CONFIG_GPIO_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define EN2_CONFIG_GPIO_NAME GPIO + #elif McuLib_CONFIG_CPU_IS_KINETIS && McuLib_CONFIG_IS_KINETIS_KE + #define EN2_CONFIG_GPIO_NAME 0 + #elif McuLib_CONFIG_CPU_IS_MCX + #define EN2_CONFIG_GPIO_NAME GPIO0 + #else /* name from properties */ + #define EN2_CONFIG_GPIO_NAME GPIOA + #endif + /*!< name of GPIO, is pointer to GPIO_Type, not used for S32K SDK */ +#endif + +#ifndef EN2_CONFIG_PIN_NUMBER + #define EN2_CONFIG_PIN_NUMBER 0u + /*!< number of pin, type unsigned integer */ +#endif + +#ifndef EN2_CONFIG_PIN_SYMBOL + #define EN2_CONFIG_PIN_SYMBOL LED_RED + /*!< symbolic name for pin, used for NXP SDK V1.3 */ +#endif + +#ifndef EN2_CONFIG_INIT_PIN_VALUE + #define EN2_CONFIG_INIT_PIN_VALUE 0 + /*!< 0: Pin data is initialized with 0 (low); 1: pin value is initialized with 1 (high) */ +#endif + +/* different types of pin direction settings */ +#define EN2_CONFIG_INIT_PIN_DIRECTION_NONE (0) +#define EN2_CONFIG_INIT_PIN_DIRECTION_INPUT (1) +#define EN2_CONFIG_INIT_PIN_DIRECTION_OUTPUT (2) + +#ifndef EN2_CONFIG_INIT_PIN_DIRECTION + #define EN2_CONFIG_INIT_PIN_DIRECTION EN2_CONFIG_INIT_PIN_DIRECTION_OUTPUT +#endif + +#ifndef EN2_CONFIG_DO_PIN_MUXING + #define EN2_CONFIG_DO_PIN_MUXING 0 + /*!< 1: perform pin muxing in Init(), 0: do not do pin muxing */ +#endif + +#ifndef EN2_CONFIG_PULL_RESISTOR + #define EN2_CONFIG_PULL_RESISTOR 0 + /*!< pull resistor setting. 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ +#endif + +#endif /* __EN2_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/McuHD44780.c b/TSM_PicoW_Sensor/McuLib/HD44780/McuHD44780.c new file mode 100644 index 0000000..4f4e668 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/McuHD44780.c @@ -0,0 +1,1182 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuHD44780.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : LCDHTA +** Version : Component 01.031, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-14, 06:24, # CodeGen: 679 +** Abstract : +** This component implements a driver for multiple 2x16 character displays. +** Settings : +** Component name : McuHD44780 +** HW Interface : +** LCD Type : generic +** LCD Lines : 2 +** Characters per Line : 16 +** Line Addresses : +** Line 1 : 0x00 +** Line 2 : 0x40 +** Line 3 : 0x10 +** Line 4 : 0x50 +** LCD Enable Signal : Disabled +** Read from Display : Enabled +** R/W signal : SDK_BitIO +** Check Busy Flag : yes +** Wait (us) : 0 +** E signal : SDK_BitIO +** E2 : Enabled +** E2 signal : SDK_BitIO +** RS signal : SDK_BitIO +** Data/Control Bus : +** Data/Control Bus Width : 8bit +** DB0..DB3 : Enabled +** DB0 : SDK_BitIO +** DB1 : SDK_BitIO +** DB2 : SDK_BitIO +** DB3 : SDK_BitIO +** DB4..DB7 : Enabled +** DB4 : SDK_BitIO +** DB5 : SDK_BitIO +** DB6 : SDK_BitIO +** DB7 : SDK_BitIO +** Bits/Byte Bus : Disabled +** System Interface : +** Wait : McuWait +** Contents : +** WriteLCDCommand - void McuHD44780_WriteLCDCommand(uint8_t cmd); +** Write - void McuHD44780_Write(char ch); +** WriteLn - void McuHD44780_WriteLn(void); +** WriteLineStr - void McuHD44780_WriteLineStr(uint8_t line, char *str); +** WriteString - void McuHD44780_WriteString(char *str); +** LoadSoftChar - void McuHD44780_LoadSoftChar(uint8_t charCode, uint8_t *softChar); +** ShiftLeft - void McuHD44780_ShiftLeft(void); +** ShiftRight - void McuHD44780_ShiftRight(void); +** GotoXY - void McuHD44780_GotoXY(uint8_t line, uint8_t column); +** SetEntryMode - void McuHD44780_SetEntryMode(bool increment, bool shiftLeft); +** DisplayOn - void McuHD44780_DisplayOn(void); +** DisplayOff - void McuHD44780_DisplayOff(void); +** CursorOn - void McuHD44780_CursorOn(void); +** CursorOff - void McuHD44780_CursorOff(void); +** CursorShiftRight - void McuHD44780_CursorShiftRight(void); +** CursorShiftLeft - void McuHD44780_CursorShiftLeft(void); +** BlinkingOn - void McuHD44780_BlinkingOn(void); +** BlinkingOff - void McuHD44780_BlinkingOff(void); +** Home - void McuHD44780_Home(void); +** Line - void McuHD44780_Line(uint8_t line); +** Clear - void McuHD44780_Clear(void); +** UseDisplay - uint8_t McuHD44780_UseDisplay(uint8_t display); +** DeInit - void McuHD44780_DeInit(void); +** +** * Copyright (c) 2008-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuHD44780.h +** @version 01.00 +** @brief +** This component implements a driver for multiple 2x16 character displays. +*/ +/*! +** @addtogroup McuHD44780_module McuHD44780 module documentation +** @{ +*/ + +/* MODULE McuHD44780. */ +#include "McuHD44780.h" +#include "McuWait.h" + +/* DEFINES for display commands. + See + - www.freescale.com/files/microcontrollers/doc/app_note/AN1745.pdf + - http://www.mikrocontroller.net/articles/HD44780 + for additional details. +*/ +#define ClearDisplayCmd 0x01 /* clears the display */ + +#define ReturnHomeCmd 0x02 /* moves the cursor to the beginning of the first line */ + +#define EntryModeSetCmd 0x04 + #define EntryModeSet_ShiftOn 1 /* S flag: shift display */ + #define EntryModeSet_IncrementOn 2 /* I/D flag: increment cursor */ + +#define DisplayOnOffControlCmd 0x08 /* Display on/off control command. There are 3 bits D, C and B as well */ + #define DisplayOnOffControl_BlinkOn 1 /* B flag: blinking cursor on/off; B=1 blinking, B=0 not blinking */ + #define DisplayOnOffControl_CursorOn 2 /* C flag: cursor on/off, C=1 cursor on, C=0 cursor off */ + #define DisplayOnOffControl_DisplayOn 4 /* D flag: display on/off, D=1 display on, D=0 display off */ + +#define FunctionSetCmd 0x20 + #define FunctionSet_8bit 0x10 /* DL flag: DL=1: 8bit, DL=0: 4bit */ + #define FunctionSet_4bit 0 /* DL flag: DL=1: 8bit, DL=0: 4bit */ + #define FunctionSet_2Lines 0x08 /* N flag: number of display lines: N=1 2 or 4 lines, N=0 1 line */ + #define FunctionSet_1Line 0 /* N flag: number of display lines: N=1 2 or 4 lines, N=0 1 line */ + #define FunctionSet_Font5x10 0x04 /* F flag: character font, F=1 5x10 dots, F=0 5x8 dots */ + #define FunctionSet_Font5x8 0 /* F flag: character font, F=1 5x10 dots, F=0 5x8 dots */ + +#define CursorOnCmd (DisplayOnOffControlCmd|DisplayOnOffControl_DisplayOn|DisplayOnOffControl_CursorOn) +#define CursorOffCmd (DisplayOnOffControlCmd|DisplayOnOffControl_DisplayOn) +#define GotoXYCmd 0x80 /* 0x80 | Display RAM address */ +#define Line1Offset 0x00 /* Display RAM address of first line, usually 0x00 */ +#define Line2Offset 0x40 /* Display RAM address of second line, usually 0x40 */ +#define Line3Offset 0x10 /* Display RAM address of third line, usually 0x10 */ +#define Line4Offset 0x50 /* Display RAM address of fourth line, usually 0x50 */ +#define FirstLineCmd (GotoXYCmd|Line1Offset) +#define SecondLineCmd (GotoXYCmd|Line2Offset) +#define ThirdLineCmd (GotoXYCmd|Line3Offset) +#define FourthLineCmd (GotoXYCmd|Line4Offset) + +#define RightShiftCmd 0x1C +#define LeftShiftCmd 0x18 +#define RightShiftCursor 0x14 +#define LeftShiftCursor 0x10 + +static uint8_t DisplayOnOffControlStatus = 0; + +#define BusyFlag 0x80 /* BF Flag */ + +/* support for custom soft characters in the display which can be used with McuHD44780_LoadSoftChar() */ +const uint8_t McuHD44780_SoftCharUE[8] = { /* ü */ + 0x11, 0x00, 0x11, 0x11, 0x11, 0x13, 0x0d, 0 +/* X...X + ..... + X...X + X...X + X...X + X..XX + .XX.X */ +}; + +const uint8_t McuHD44780_SoftCharAE[8] = { /* ä */ + 0x11, 0x00, 0x0E, 0x01, 0x0F, 0x11, 0x0F, 0 +/* X...X + ..... + .XXX. + ....X + .XXXX + X...X + .XXXX */ +}; + +const uint8_t McuHD44780_SoftCharOE[8] = { /* ö */ + 0x11, 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E, 0 +/* X...X + ..... + .XXX. + X...X + X...X + X...X + .XXX. */ +}; + +#if McuHD44780_CONFIG_USE_RW_SIGNAL +/* macros for the RW pin */ +#define ClrRW() \ + RW1_ClrVal() /* RW=0: write mode */ +#define SetRW() \ + RW1_SetVal() /* RW=1: read mode */ +#endif /* McuHD44780_CONFIG_USE_RW_SIGNAL */ + +/* macros for the RS pin */ +#define ClrRS() \ + RS1_ClrVal() /* RS=0: command mode */ +#define SetRS() \ + RS1_SetVal() /* RS=1: data mode */ + +/* macros for the EN pin */ +#define ClrEN() \ + EN1_ClrVal() /* EN=0 */ +#define SetEN() \ + EN1_SetVal() /* EN=1 */ + +#if McuHD44780_CONFIG_USE_E2_SIGNAL + /* macros for the EN2 pin */ + #define ClrEN2() \ + EN2_ClrVal() /* E2=0 */ + #define SetEN2() \ + EN2_SetVal() /* E2=1 */ + static uint8_t McuHD44780_currDisplay = 1; /* only for displays with E1 and E2: if set to 1, it will use E1, if set to 2 it will use E2 */ +#endif + +/* macros for the data bus */ +#if McuHD44780_CONFIG_LCD_DATA_BUS_WIDTH==8 + #define DataAsOutput03() \ + DB01_SetOutput(); /* set data port as output */ \ + DB11_SetOutput(); /* set data port as output */ \ + DB21_SetOutput(); /* set data port as output */ \ + DB31_SetOutput(); /* set data port as output */ +#endif + +#if McuHD44780_CONFIG_LCD_DATA_BUS_WIDTH==8 || McuHD44780_CONFIG_LCD_DATA_BUS_WIDTH==4 + #define DataAsOutput47() \ + DB41_SetOutput(); /* set data port as output */ \ + DB51_SetOutput(); /* set data port as output */ \ + DB61_SetOutput(); /* set data port as output */ \ + DB71_SetOutput() /* set data port as output */ +#endif + +#if McuHD44780_CONFIG_LCD_DATA_BUS_WIDTH==8 || McuHD44780_CONFIG_LCD_DATA_BUS_WIDTH==4 + #define DataAsInput03() \ + DB01_SetInput(); /* set data port as input */ \ + DB11_SetInput(); /* set data port as input */ \ + DB21_SetInput(); /* set data port as input */ \ + DB31_SetInput(); /* set data port as input */ +#endif + +#if McuHD44780_CONFIG_LCD_DATA_BUS_WIDTH==4 + #define DataAsInput47() \ + DB41_SetInput(); /* set data port as input */ \ + DB51_SetInput(); /* set data port as input */ \ + DB61_SetInput(); /* set data port as input */ \ + DB71_SetInput() /* set data port as input */ +#endif + +#if McuHD44780_CONFIG_LCD_DATA_BUS_PORT_8BIT + #define DataAsOutput() DataBus_SetOutput() /* set data port as output */ + #define DataAsInput() DataBus_SetInput() /* set data port as input */ +#elif McuHD44780_CONFIG_LCD_DATA_BUS_WIDTH==4 + #define DataAsOutput() DataAsOutput47() + #define DataAsInput() DataAsInput47() +#elif McuHD44780_CONFIG_LCD_DATA_BUS_WIDTH==8 + #define DataAsOutput() DataAsOutput03(); DataAsOutput47() + #define DataAsInput() DataAsInput03(); DataAsInput47() +#endif + + + +/* waiting macros */ +#define Waitns(x) \ + McuWait_Waitns(x) /* Wait x ns */ +#define Waitus(x) \ + McuWait_Waitus(x) /* Wait x us */ +#define Waitms(x) \ + McuWait_Waitms(x) /* Wait x ms */ + +/* timings from Hitachi HD44708.pdf */ +#define Timing_PWeh_ns 230 /* PWeh: Enable Pulse width (high level) */ +#define Timing_tAS_ns 40 /* tAB: Address set-up time (RS, RW to E ) */ +#define Timing_tDDR_ns 160 /* tDDR: Data delay time */ +#define Timing_tCYCLE_ns 500 /* tCYLE: Enable Cycle time */ + +#if McuHD44780_CONFIG_USE_DISPLAY_READ && McuHD44780_CONFIG_USE_DISPLAY_READ_CHECK_BUSY_FLAG +static uint8_t DataGet(void) { + uint8_t val; + +#if McuHD44780_CONFIG_LCD_DATA_BUS_WIDTH==4 + val = (DB71_GetVal()<<3) + |(DB61_GetVal()<<2) + |(DB51_GetVal()<<1) + |(DB41_GetVal()<<0); +#elif McuHD44780_CONFIG_LCD_DATA_BUS_WIDTH==8 /* 8bit */ + val = (DB71_GetVal()<<7) + |(DB61_GetVal()<<6) + |(DB51_GetVal()<<5) + |(DB41_GetVal()<<4) + |(DB31_GetVal()<<3) + |(DB21_GetVal()<<2) + |(DB11_GetVal()<<1) + |(DB01_GetVal()<<0); +#endif + return val; +} +#endif /* #if McuHD44780_CONFIG_USE_DISPLAY_READ && McuHD44780_CONFIG_USE_DISPLAY_READ_CHECK_BUSY_FLAG */ + +static void DataPut(uint8_t val) { +#if McuHD44780_CONFIG_LCD_DATA_BUS_WIDTH==4 + DB71_PutVal((val&(1<<3))!=0); + DB61_PutVal((val&(1<<2))!=0); + DB51_PutVal((val&(1<<1))!=0); + DB41_PutVal((val&(1<<0))!=0); +#else /* 8bit */ + DB71_PutVal((val&(1<<7))!=0); + DB61_PutVal((val&(1<<6))!=0); + DB51_PutVal((val&(1<<5))!=0); + DB41_PutVal((val&(1<<4))!=0); + DB31_PutVal((val&(1<<3))!=0); + DB21_PutVal((val&(1<<2))!=0); + DB11_PutVal((val&(1<<1))!=0); + DB01_PutVal((val&(1<<0))!=0); +#endif +} + +/* Internal method prototypes */ +static void EnablePulse(void); + +/* +** =================================================================== +** Method : EnablePulse (component LCDHTA) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +static void EnablePulse(void) +{ +#if McuHD44780_CONFIG_USE_E2_SIGNAL + if (McuHD44780_currDisplay==1) { + SetEN(); + } else { + SetEN2(); + } +#else + SetEN(); +#endif /* set EN to 1 to create pulse */ +#if McuHD44780_CONFIG_LCD_TYPE==1 + /* Diplaytech 162c: not clear why this is not according to the 500ns spec? */ + Waitms(2); +#else + Waitns(Timing_PWeh_ns); +#endif +#if McuHD44780_CONFIG_USE_E2_SIGNAL + if (McuHD44780_currDisplay==1) { + ClrEN(); /* set to 0 to finish pulse */ + } else { + ClrEN2(); /* set to 0 to finish pulse */ + } +#else + ClrEN(); /* set to 0 to finish pulse */ +#endif +} + +#if McuHD44780_CONFIG_USE_DISPLAY_READ && McuHD44780_CONFIG_USE_DISPLAY_READ_CHECK_BUSY_FLAG +/* +** =================================================================== +** Method : McuHD44780_WaitForLCDReady (component LCDHTA) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +void McuHD44780_WaitForLCDReady(void) +{ + uint8_t ch; + + /* Wait until the display is ready for new data. + This means that we wait until the busy flag (MSB) in the status register is cleared */ + DataAsInput(); /* set data port as input */ + SetRW(); /* RW = 1: read mode */ + Waitns(Timing_tAS_ns); + for(;;) { /* loop breaks as soon the busy flag is cleared */ + #if McuHD44780_CONFIG_USE_E2_SIGNAL + if(McuHD44780_currDisplay==1) { + SetEN(); /* EN = 1; EN to high for getting the busy flag */ + } else { + SetEN2(); /* EN = 1; EN to high for getting the busy flag */ + } + #else + SetEN(); /* EN = 1; EN to high for getting the busy flag */ + #endif + Waitns(Timing_tDDR_ns); /* Read mode timing tDDR: time until we can read data */ +#if McuHD44780_CONFIG_LCD_DATA_BUS_WIDTH==4 + /* for 4bit data bus: need to do read twice */ + ch = (uint8_t)(DataGet()<<4); /* read high byte */ + Waitns(Timing_PWeh_ns-Timing_tDDR_ns); /* for accurate lenght of EN pulse */ + #if McuHD44780_CONFIG_USE_E2_SIGNAL + if(McuHD44780_currDisplay==1) { + ClrEN(); + } else { + ClrEN2(); + } + #else + ClrEN(); + #endif + Waitns(Timing_tCYCLE_ns-Timing_PWeh_ns); /* need to wait a cycle time until we can enable EN again */ + #if McuHD44780_CONFIG_USE_E2_SIGNAL + if(McuHD44780_currDisplay==1) { + SetEN(); /* EN = 1; EN to high for getting the busy flag */ + } else { + SetEN2(); /* EN = 1; EN to high for getting the busy flag */ + } + #else + SetEN(); /* EN = 1; EN to high for getting the busy flag */ + #endif + Waitns(Timing_tDDR_ns); /* Read mode timing tDDR: time until we can read data */ + ch |= DataGet(); /* read low byte */ +#else + ch = DataGet(); /* read status */ +#endif + Waitns(Timing_PWeh_ns-Timing_tDDR_ns); /* for accurate length of EN pulse */ + #if McuHD44780_CONFIG_USE_E2_SIGNAL + if(McuHD44780_currDisplay==1) { + ClrEN(); + } else { + ClrEN2(); + } + #else + ClrEN(); + #endif + if (!(ch&BusyFlag)) { + break; + } + Waitns(Timing_tCYCLE_ns-Timing_PWeh_ns); /* need to wait a cycle time until we can enable EN again */ + } /* for */ + #if McuHD44780_CONFIG_USE_RW_SIGNAL + ClrRW(); /* RW = 0: back to write mode */ + #endif + DataAsOutput(); /* set data port as output */ +} +#endif /* McuHD44780_CONFIG_USE_DISPLAY_READ && McuHD44780_CONFIG_USE_DISPLAY_READ_CHECK_BUSY_FLAG */ + +/* +** =================================================================== +** Method : WriteLCDCommand (component LCDHTA) +** +** Description : +** Writes a command to the display +** Parameters : +** NAME - DESCRIPTION +** cmd - command passed to the LCD +** Returns : Nothing +** =================================================================== +*/ +void McuHD44780_WriteLCDCommand(uint8_t cmd) +{ +#if McuHD44780_CONFIG_WAIT_DISPLAY_US > 0 + McuWait_Waitus(McuHD44780_CONFIG_WAIT_DISPLAY_US); /* wait for some time not to write to the display while he may be busy with previous command */ +#endif +#if McuHD44780_CONFIG_USE_DISPLAY_READ && McuHD44780_CONFIG_USE_DISPLAY_READ_CHECK_BUSY_FLAG + McuHD44780_WaitForLCDReady(); /* Wait until LCD is ready */ +#endif +#if McuHD44780_CONFIG_LCD_DATA_BUS_WIDTH==4 + /* 2 4bit transfer */ + DataPut((uint8_t)((cmd&0xF0)>>4)); /* Write the data (cycle #1) */ + EnablePulse(); /* transfer data */ + Waitus(McuHD44780_CONFIG_WAIT_LCD_CMD_AFTER_4BIT_DATA1_US); + DataPut((uint8_t)(cmd&0x0F) ); /* Write the data (cycle #2) */ + EnablePulse(); /* do the command transfer */ + Waitus(McuHD44780_CONFIG_WAIT_LCD_CMD_AFTER_4BIT_DATA2_US); +#else + /* 8bit transfer */ + DataPut(cmd); /* put data on bus */ + EnablePulse(); /* do the command transfer */ +#endif +} + +/* +** =================================================================== +** Method : Clear (component LCDHTA) +** +** Description : +** Clears the display and moves the cursor to the first line. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuHD44780_Clear(void) +{ + McuHD44780_WriteLCDCommand(ClearDisplayCmd); /* send the clear command to the LCD */ +} + +/* +** =================================================================== +** Method : Home (component LCDHTA) +** +** Description : +** Moves the cursor to the beginning of the first line. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuHD44780_Home(void) +{ + McuHD44780_WriteLCDCommand(ReturnHomeCmd); /* moves the cursor to the beginning of the first line */ +} + +/* +** =================================================================== +** Method : McuHD44780_WriteLCDData (component LCDHTA) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +void McuHD44780_WriteLCDData(uint8_t ch) +{ +#if McuHD44780_CONFIG_WAIT_DISPLAY_US > 0 + McuWait_Waitus(McuHD44780_CONFIG_WAIT_DISPLAY_US); /* wait for some time not to write to the display while he may be busy with previous command */ +#endif +#if McuHD44780_CONFIG_USE_DISPLAY_READ && McuHD44780_CONFIG_USE_DISPLAY_READ_CHECK_BUSY_FLAG + McuHD44780_WaitForLCDReady(); /* Wait until LCD is ready */ +#endif + SetRS(); /* RS = 1: data mode */ +#if McuHD44780_CONFIG_LCD_DATA_BUS_WIDTH==4 + /* 2 4bit transfer */ + DataPut((uint8_t)((ch&0xF0)>>4)); /* Write the data (cycle #1) */ + EnablePulse(); /* transfer data */ + Waitus(McuHD44780_CONFIG_WAIT_LCD_CMD_AFTER_4BIT_DATA1_US); + DataPut((uint8_t)(ch&0x0F)); /* Write the data (cycle #2) */ + EnablePulse(); /* do the command transfer */ + Waitus(McuHD44780_CONFIG_WAIT_LCD_CMD_AFTER_4BIT_DATA2_US); +#else + /* 8bit data transfer */ + DataPut(ch); /* put data on bus */ + EnablePulse(); /* do the command transfer */ +#endif + ClrRS(); /* RS = 0: back to command mode */ +} + +/* +** =================================================================== +** Method : GotoXY (component LCDHTA) +** +** Description : +** Places the cursor on a specified position on the display. +** Parameters : +** NAME - DESCRIPTION +** line - Line number starting with 1 +** column - Column number starting with 1 +** Returns : Nothing +** =================================================================== +*/ +void McuHD44780_GotoXY(uint8_t line, uint8_t column) +{ +/* row is in the range 1..LCD_Nof_Lines and column in the range 1..LCD_Nof_Columns */ +#if McuHD44780_CONFIG_LCD_NOF_LINES==1 + /* only one line in LCD: ignore line argument */ + (void)line; /* to avoid compiler warning about unused variable */ + McuHD44780_WriteLCDCommand((uint8_t)(GotoXYCmd + (column-1))); +#elif McuHD44780_CONFIG_LCD_NOF_LINES==2 + McuHD44780_WriteLCDCommand((uint8_t)(GotoXYCmd + (column-1) + (line==1 ? 0x00:Line2Offset))); +#elif McuHD44780_CONFIG_LCD_NOF_LINES==3 + uint8_t offset; + + if (line==1) { + offset = 0x00; + } else if (line==2) { + offset = Line2Offset; + } else { /* line 3 */ + offset = Line3Offset; + } + McuHD44780_WriteLCDCommand((uint8_t)(GotoXYCmd + (column-1) + offset)); +#elif McuHD44780_CONFIG_LCD_NOF_LINES==4 + uint8_t offset; + + if (line==1) { + offset = 0x00; + } else if (line==2) { + offset = Line2Offset; + } else if (line==3) { + offset = Line3Offset; + } else { /* line 4 */ + offset = Line4Offset; + } + McuHD44780_WriteLCDCommand((uint8_t)(GotoXYCmd + (column-1) + offset)); +#else + #error "only up to 4 LCD lines are supported!" +#endif +} + +/* +** =================================================================== +** Method : ShiftLeft (component LCDHTA) +** +** Description : +** Shifts all characters to the left. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuHD44780_ShiftLeft(void) +{ + McuHD44780_WriteLCDCommand(LeftShiftCmd); +} + +/* +** =================================================================== +** Method : Write (component LCDHTA) +** +** Description : +** Write a single character to the display +** Parameters : +** NAME - DESCRIPTION +** ch - Character to write +** Returns : Nothing +** =================================================================== +*/ +/* The method is implemented as a macro, see McuHD44780.h */ +/* +** =================================================================== +** Method : WriteLn (component LCDHTA) +** +** Description : +** Writes a new line to the display +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuHD44780_WriteLn(void) +{ +#if McuHD44780_CONFIG_LCD_NOF_LINES==1 + /* only one line in LCD: move to beginning of first line */ + McuHD44780_WriteLCDCommand(FirstLineCmd); +#elif McuHD44780_CONFIG_LCD_NOF_LINES==2 + McuHD44780_WriteLCDCommand(SecondLineCmd); +#else + /* more than 2 lines, cannot use WriteLn() */ +#endif +} + +/* +** =================================================================== +** Method : WriteString (component LCDHTA) +** +** Description : +** Writes a string to the display at the current cursor +** position. +** Parameters : +** NAME - DESCRIPTION +** * str - Pointer to string (zero byte terminated) +** to write to the display +** Returns : Nothing +** =================================================================== +*/ +void McuHD44780_WriteString(char *str) +{ + while (*str != '\0'){ + McuHD44780_Write(*str); + str++; + } +} + +/* +** =================================================================== +** Method : WriteLineStr (component LCDHTA) +** +** Description : +** Writes a full line to the display (clears the rest of the +** line). +** Parameters : +** NAME - DESCRIPTION +** line - Line number (starting with 1). +** * str - Pointer to the string which should be +** shown on the display. +** Returns : Nothing +** =================================================================== +*/ +void McuHD44780_WriteLineStr(uint8_t line, char *str) +{ + uint8_t i; + + McuHD44780_Line(line); /* select line */ + for(i = 0; i < McuHD44780_MAX_LCD_LINE_CHARS && *str!='\0'; i++, str++) { + McuHD44780_Write(*str); + } + /* Clear the rest of the line */ + for (; i < McuHD44780_MAX_LCD_LINE_CHARS; i++) { + McuHD44780_Write(' '); + } +} + +/* +** =================================================================== +** Method : Line (component LCDHTA) +** +** Description : +** Sets the current line. +** Parameters : +** NAME - DESCRIPTION +** line - Line number, starting with 1 +** Returns : Nothing +** =================================================================== +*/ +void McuHD44780_Line(uint8_t line) +{ +#if McuHD44780_CONFIG_LCD_NOF_LINES==1 + /* we only have one line, so moving to the first line */ + (void)line; /* to avoid compiler warning about unused variable */ + McuHD44780_WriteLCDCommand(FirstLineCmd); +#elif McuHD44780_CONFIG_LCD_NOF_LINES==2 + McuHD44780_WriteLCDCommand((uint8_t)(line==1?FirstLineCmd:SecondLineCmd)); +#elif McuHD44780_CONFIG_LCD_NOF_LINES==3 + if (line==1) { + McuHD44780_WriteLCDCommand((uint8_t)(FirstLineCmd)); + } else if (line==2) { + McuHD44780_WriteLCDCommand((uint8_t)(SecondLineCmd)); + } else { /* line == 3 */ + McuHD44780_WriteLCDCommand((uint8_t)(ThirdLineCmd)); + } +#elif McuHD44780_CONFIG_LCD_NOF_LINES==4 + if (line==1) { + McuHD44780_WriteLCDCommand((uint8_t)(FirstLineCmd)); + } else if (line==2) { + McuHD44780_WriteLCDCommand((uint8_t)(SecondLineCmd)); + } else if (line==3) { + McuHD44780_WriteLCDCommand((uint8_t)(ThirdLineCmd)); + } else { /* line == 4 */ + McuHD44780_WriteLCDCommand((uint8_t)(FourthLineCmd)); + } +#else + #error "only up to 4 LCD lines are supported!" +#endif +} + +/* +** =================================================================== +** Method : McuHD44780_Init (component LCDHTA) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +void McuHD44780_Init(void) +{ + /* for non-Processor Expert projects, initialize the used pins */ +#if McuLib_CONFIG_SDK_VERSION_USED != McuLib_CONFIG_SDK_PROCESSOR_EXPERT + RS1_Init(); + EN1_Init(); + #if McuHD44780_CONFIG_LCD_DATA_BUS_WIDTH==8 + DB01_Init(); + DB11_Init(); + DB21_Init(); + DB31_Init(); + #endif + + DB41_Init(); + DB51_Init(); + DB61_Init(); + DB71_Init(); + #if McuHD44780_CONFIG_USE_E2_SIGNAL + EN2_Init(); + #endif + #if McuHD44780_CONFIG_USE_RW_SIGNAL + RW1_Init(); + #endif +#endif + + /* This function initializes the driver. + The low level init already shall have set our data port to input/output, currently set to output, + plus all control pins are set as outputs with low values. To be sure, we do it here again. */ + ClrEN(); /* EN Pin low */ +#if McuHD44780_CONFIG_USE_E2_SIGNAL + ClrEN2(); /* EN2 Pin low */ +#endif +#if McuHD44780_CONFIG_USE_RW_SIGNAL + ClrRW(); /* RW Pin low */ +#endif + ClrRS(); /* RS Pin low: command mode */ + DataPut(0); + + /* make pins output */ + DataAsOutput(); + + /* send the reset sequence according to the data sheet */ + Waitms(80); /* wait for more than 15ms after Vcc rises to 4.5V, wait for more than 40ms after Vcc rises to 2.7V. In case of POR (Power On Reset) we need some additional time. */ +#if McuHD44780_CONFIG_LCD_DATA_BUS_WIDTH==4 + DataPut(0x3); /* BF cannot be checked before this function, function set (interface is 8bits long) */ +#if McuHD44780_CONFIG_USE_E2_SIGNAL + McuHD44780_UseDisplay(1); + EnablePulse(); /* transfer data */ + McuHD44780_UseDisplay(2); + EnablePulse(); /* transfer data */ +#else + EnablePulse(); /* transfer data */ +#endif + Waitms(5); /* wait for more than 4.1 ms */ + /* 0x3 is already on the bus from previous DataPut(), do not need to put it again here */ +#if McuHD44780_CONFIG_USE_E2_SIGNAL + McuHD44780_UseDisplay(1); + EnablePulse(); /* transfer data */ + McuHD44780_UseDisplay(2); + EnablePulse(); /* transfer data */ +#else + EnablePulse(); /* transfer data */ +#endif + Waitus(100); /* wait for more than 100us */ + /* 0x3 is already on the bus from previous DataPut(), do not need to put it again here */ +#if McuHD44780_CONFIG_USE_E2_SIGNAL + McuHD44780_UseDisplay(1); + EnablePulse(); /* transfer data */ + McuHD44780_UseDisplay(2); + EnablePulse(); /* transfer data */ +#else + EnablePulse(); /* transfer data */ +#endif + Waitus(100); /* wait for more than 100us */ + + DataPut(0x2); /* Function set */ +#if McuHD44780_CONFIG_USE_E2_SIGNAL + McuHD44780_UseDisplay(1); + EnablePulse(); /* transfer data */ + McuHD44780_UseDisplay(2); + EnablePulse(); /* transfer data */ +#else + EnablePulse(); /* transfer data */ +#endif + Waitus(100); +#else + DataPut(FunctionSetCmd|FunctionSet_8bit); /* Function set (interface is 8bit) */ +#if McuHD44780_CONFIG_USE_E2_SIGNAL + McuHD44780_UseDisplay(1); + EnablePulse(); /* transfer data */ + McuHD44780_UseDisplay(2); + EnablePulse(); /* transfer data */ +#else + EnablePulse(); /* transfer data */ +#endif + Waitms(5); /* wait at least 4.1ms */ + /* transmit again the same data (which is already on the bus */ +#if McuHD44780_CONFIG_USE_E2_SIGNAL + McuHD44780_UseDisplay(1); + EnablePulse(); /* transfer data */ + McuHD44780_UseDisplay(2); + EnablePulse(); /* transfer data */ +#else + EnablePulse(); /* transfer data */ +#endif + Waitus(100); /* wait at least 100us */ + /* transmit again the same data (which is already on the bus */ +#if McuHD44780_CONFIG_USE_E2_SIGNAL + McuHD44780_UseDisplay(1); + EnablePulse(); /* transfer data */ + McuHD44780_UseDisplay(2); + EnablePulse(); /* transfer data */ +#else + EnablePulse(); /* transfer data */ +#endif /* McuHD44780_CONFIG_LCD_DATA_BUS_WIDTH==4 */ + Waitus(100); +#endif + +#if McuHD44780_CONFIG_USE_E2_SIGNAL + McuHD44780_UseDisplay(1); +#endif + McuHD44780_WriteLCDCommand(FunctionSetCmd|FunctionSet_Font5x8 +#if McuHD44780_CONFIG_LCD_DATA_BUS_WIDTH==4 + |FunctionSet_4bit /* we are using 4bit data bus */ +#else + |FunctionSet_8bit /* we are using 8bit data bus */ +#endif + #if McuHD44780_CONFIG_LCD_NOF_LINES==1 + |FunctionSet_1Line /* we are using only one line */ + #else + |FunctionSet_2Lines /* we are using two or more lines */ + #endif + ); +#if McuHD44780_CONFIG_USE_E2_SIGNAL + McuHD44780_UseDisplay(2); + McuHD44780_WriteLCDCommand(FunctionSetCmd|FunctionSet_Font5x8 +#if McuHD44780_CONFIG_LCD_DATA_BUS_WIDTH==4 + |FunctionSet_4bit /* we are using 4bit data bus */ +#else + |FunctionSet_8bit /* we are using 8bit data bus */ +#endif + #if McuHD44780_CONFIG_LCD_NOF_LINES==1 + |FunctionSet_1Line /* we are using only one line */ + #else + |FunctionSet_2Lines /* we are using two or more lines */ + #endif + ); +#endif + + DisplayOnOffControlStatus = DisplayOnOffControlCmd|DisplayOnOffControl_DisplayOn; /* Display on, cursor on, do not blink */ +#if McuHD44780_CONFIG_USE_E2_SIGNAL + McuHD44780_UseDisplay(1); +#endif + McuHD44780_WriteLCDCommand(DisplayOnOffControlStatus); +#if McuHD44780_CONFIG_USE_E2_SIGNAL + McuHD44780_UseDisplay(2); + McuHD44780_WriteLCDCommand(DisplayOnOffControlStatus); +#endif +#if McuHD44780_CONFIG_USE_E2_SIGNAL + McuHD44780_UseDisplay(1); +#endif + McuHD44780_WriteLCDCommand(ClearDisplayCmd); /* Clear display */ + McuHD44780_WriteLCDCommand(EntryModeSetCmd|EntryModeSet_IncrementOn); /* Entry mode set: Increment mode, display shift off */ +#if McuHD44780_CONFIG_USE_E2_SIGNAL + McuHD44780_UseDisplay(2); + McuHD44780_WriteLCDCommand(ClearDisplayCmd); /* Clear display */ + McuHD44780_WriteLCDCommand(EntryModeSetCmd|EntryModeSet_IncrementOn); /* Entry mode set: Increment mode, display shift off */ +#endif +#if McuHD44780_CONFIG_USE_E2_SIGNAL + McuHD44780_UseDisplay(1); +#endif +} + +/* +** =================================================================== +** Method : LoadSoftChar (component LCDHTA) +** +** Description : +** Loads a user defined (softchar) into the display CGRAM. +** Parameters : +** NAME - DESCRIPTION +** charCode - The character code to be defined +** (0..7) +** * softChar - Pointer to an array of 8 bytes +** defining the soft character +** Example of the soft character 'ü': +** const byte SoftCharUE[8] = { // ü +** 0x11, 0x00, 0x11, 0x11, 0x11, 0x13, 0x0d, 0 +** // X...X +** // ..... +** // X...X +** // X...X +** // X...X +** // X..XX +** // .XX.X +** }; +** Returns : Nothing +** =================================================================== +*/ +void McuHD44780_LoadSoftChar(uint8_t charCode, uint8_t *softChar) +{ + /* Loads a user defined character (soft character, 5x8 dots) into the CG-RAM + in the display. The character can be used afterwards like a normal character code */ + #define CGAddress 0x40 /* Base address for softchars */ + #define DDAddress 0x80 /* To finish the download mode */ + uint8_t i; + + McuHD44780_WriteLCDCommand((uint8_t)(CGAddress + (charCode * 0x08))); /* Set CG Ram: Character code * 0x08 [size] */ + for (i=0; i<=7; i++){ + McuHD44780_Write(softChar[i]); + } + McuHD44780_WriteLCDCommand(DDAddress); /* finish the download */ +} + +/* +** =================================================================== +** Method : ShiftRight (component LCDHTA) +** +** Description : +** Shifts all characters to the right. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuHD44780_ShiftRight(void) +{ + McuHD44780_WriteLCDCommand(RightShiftCmd); +} + +/* +** =================================================================== +** Method : CursorOn (component LCDHTA) +** +** Description : +** Enables the cursor. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuHD44780_CursorOn(void) +{ + DisplayOnOffControlStatus |= DisplayOnOffControl_CursorOn; + McuHD44780_WriteLCDCommand(DisplayOnOffControlStatus); +} + +/* +** =================================================================== +** Method : CursorOff (component LCDHTA) +** +** Description : +** Disables the cursor. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuHD44780_CursorOff(void) +{ + DisplayOnOffControlStatus &= ~DisplayOnOffControl_CursorOn; + McuHD44780_WriteLCDCommand(DisplayOnOffControlStatus); +} + +/* +** =================================================================== +** Method : DisplayOn (component LCDHTA) +** +** Description : +** Sends the display on command to the display. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuHD44780_DisplayOn(void) +{ + DisplayOnOffControlStatus |= DisplayOnOffControl_DisplayOn; + McuHD44780_WriteLCDCommand(DisplayOnOffControlStatus); +} + +/* +** =================================================================== +** Method : DisplayOff (component LCDHTA) +** +** Description : +** Sends the display off command to the display. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuHD44780_DisplayOff(void) +{ + DisplayOnOffControlStatus &= ~DisplayOnOffControl_DisplayOn; + McuHD44780_WriteLCDCommand(DisplayOnOffControlStatus); +} + +/* +** =================================================================== +** Method : BlinkingOn (component LCDHTA) +** +** Description : +** Sends the display off command to the display. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuHD44780_BlinkingOn(void) +{ + DisplayOnOffControlStatus |= DisplayOnOffControl_BlinkOn; + McuHD44780_WriteLCDCommand(DisplayOnOffControlStatus); +} + +/* +** =================================================================== +** Method : BlinkingOff (component LCDHTA) +** +** Description : +** Puts the display in blinking off mode. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuHD44780_BlinkingOff(void) +{ + DisplayOnOffControlStatus &= ~DisplayOnOffControl_BlinkOn; + McuHD44780_WriteLCDCommand(DisplayOnOffControlStatus); +} + +/* +** =================================================================== +** Method : SetEntryMode (component LCDHTA) +** +** Description : +** Configures the display entry mode, if the cursor has to +** shift and/or if the display shall shift content while +** displaying text. +** Parameters : +** NAME - DESCRIPTION +** increment - Increments (TRUE) or +** decrements (FALSE) the display address by 1 +** when a character code is written into or +** read from DDRAM. The cursor or blinking +** moves to the right when incremented by 1 +** and to the left when decremented by 1. +** shiftLeft - The display does not shift if +** the 'shift' is FALSE. If 'shift' is TRUE, +** it will seem as if the cursor does not move +** but the display does. +** Returns : Nothing +** =================================================================== +*/ +void McuHD44780_SetEntryMode(bool increment, bool shiftLeft) +{ + uint8_t flags = 0; + + if (increment) { + flags |= EntryModeSet_IncrementOn; + } + if (shiftLeft) { + flags |= EntryModeSet_ShiftOn; + } + McuHD44780_WriteLCDCommand((uint8_t)(EntryModeSetCmd|flags)); /* Entry mode set: Increment mode, display shift mode */ +} + +/* +** =================================================================== +** Method : UseDisplay (component LCDHTA) +** +** Description : +** +** Parameters : +** NAME - DESCRIPTION +** display - Has to be either 1 (top display, +** using E1) or 2 (bottom display, using E2) +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuHD44780_UseDisplay(uint8_t display) +{ +#if McuHD44780_CONFIG_USE_E2_SIGNAL + if (!(display==1 || display==2)) { + return ERR_FAILED; /* wrong argument */ + } + McuHD44780_currDisplay = display; +#else + (void)display; /* not used, as not using E2 (additional enable) signal */ +#endif + return ERR_OK; +} + +/* +** =================================================================== +** Method : CursorShiftRight (component LCDHTA) +** +** Description : +** Shift the cursor to the right. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuHD44780_CursorShiftRight(void) +{ + McuHD44780_WriteLCDCommand(RightShiftCursor); +} + +/* +** =================================================================== +** Method : CursorShiftLeft (component LCDHTA) +** +** Description : +** Shift the cursor to the left. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuHD44780_CursorShiftLeft(void) +{ + McuHD44780_WriteLCDCommand(LeftShiftCursor); +} + +/* +** =================================================================== +** Method : DeInit (component LCDHTA) +** +** Description : +** Driver de-initialization routine +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuHD44780_DeInit(void) +{ + /* nothing needed */ +} + +/* END McuHD44780. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/McuHD44780.h b/TSM_PicoW_Sensor/McuLib/HD44780/McuHD44780.h new file mode 100644 index 0000000..2266376 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/McuHD44780.h @@ -0,0 +1,497 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuHD44780.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : LCDHTA +** Version : Component 01.031, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-14, 06:24, # CodeGen: 679 +** Abstract : +** This component implements a driver for multiple 2x16 character displays. +** Settings : +** Component name : McuHD44780 +** HW Interface : +** LCD Type : generic +** LCD Lines : 2 +** Characters per Line : 16 +** Line Addresses : +** Line 1 : 0x00 +** Line 2 : 0x40 +** Line 3 : 0x10 +** Line 4 : 0x50 +** LCD Enable Signal : Disabled +** Read from Display : Enabled +** R/W signal : SDK_BitIO +** Check Busy Flag : yes +** Wait (us) : 0 +** E signal : SDK_BitIO +** E2 : Enabled +** E2 signal : SDK_BitIO +** RS signal : SDK_BitIO +** Data/Control Bus : +** Data/Control Bus Width : 8bit +** DB0..DB3 : Enabled +** DB0 : SDK_BitIO +** DB1 : SDK_BitIO +** DB2 : SDK_BitIO +** DB3 : SDK_BitIO +** DB4..DB7 : Enabled +** DB4 : SDK_BitIO +** DB5 : SDK_BitIO +** DB6 : SDK_BitIO +** DB7 : SDK_BitIO +** Bits/Byte Bus : Disabled +** System Interface : +** Wait : McuWait +** Contents : +** WriteLCDCommand - void McuHD44780_WriteLCDCommand(uint8_t cmd); +** Write - void McuHD44780_Write(char ch); +** WriteLn - void McuHD44780_WriteLn(void); +** WriteLineStr - void McuHD44780_WriteLineStr(uint8_t line, char *str); +** WriteString - void McuHD44780_WriteString(char *str); +** LoadSoftChar - void McuHD44780_LoadSoftChar(uint8_t charCode, uint8_t *softChar); +** ShiftLeft - void McuHD44780_ShiftLeft(void); +** ShiftRight - void McuHD44780_ShiftRight(void); +** GotoXY - void McuHD44780_GotoXY(uint8_t line, uint8_t column); +** SetEntryMode - void McuHD44780_SetEntryMode(bool increment, bool shiftLeft); +** DisplayOn - void McuHD44780_DisplayOn(void); +** DisplayOff - void McuHD44780_DisplayOff(void); +** CursorOn - void McuHD44780_CursorOn(void); +** CursorOff - void McuHD44780_CursorOff(void); +** CursorShiftRight - void McuHD44780_CursorShiftRight(void); +** CursorShiftLeft - void McuHD44780_CursorShiftLeft(void); +** BlinkingOn - void McuHD44780_BlinkingOn(void); +** BlinkingOff - void McuHD44780_BlinkingOff(void); +** Home - void McuHD44780_Home(void); +** Line - void McuHD44780_Line(uint8_t line); +** Clear - void McuHD44780_Clear(void); +** UseDisplay - uint8_t McuHD44780_UseDisplay(uint8_t display); +** DeInit - void McuHD44780_DeInit(void); +** +** * Copyright (c) 2008-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuHD44780.h +** @version 01.00 +** @brief +** This component implements a driver for multiple 2x16 character displays. +*/ +/*! +** @addtogroup McuHD44780_module McuHD44780 module documentation +** @{ +*/ + +#ifndef __McuHD44780_H +#define __McuHD44780_H + +/* MODULE McuHD44780. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuHD44780config.h" /* configuration */ + + + +/* ID's for the soft characters which can be used as first argument for McuHD44780_LoadSoftChar(). + Note that ID's can start with zero, but if you want to use a zero byte in McuHD44780_WriteString() + then this would be the zero delimiter byte, so not very useful. */ +#define McuHD44780_SOFTCHAR_UE 1 /* input */ + PINS_DRV_SetPinsDirection(RS1_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_input(RS1_CONFIG_PIN_NUMBER, NRF_GPIO_PIN_NOPULL); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsInput(pin); +#endif + RS1_isOutput = false; +} + +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void RS1_SetOutput(void) +{ +#if McuLib_CONFIG_CPU_IS_LPC + GPIO_PinInit(RS1_CONFIG_GPIO_NAME, RS1_CONFIG_PORT_NAME, RS1_CONFIG_PIN_NUMBER, &RS1_configOutput); +#elif McuLib_CONFIG_NXP_SDK_2_0_USED + GPIO_PinInit(RS1_CONFIG_GPIO_NAME, RS1_CONFIG_PIN_NUMBER, &RS1_configOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + GPIO_DRV_SetPinDir(RS1_CONFIG_PIN_SYMBOL, kGpioDigitalOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + pins_channel_type_t val; + + val = PINS_GPIO_GetPinsDirection(RS1_CONFIG_PORT_NAME); /* bit 0: pin is input; 1: pin is output */ + val |= (1< output */ + PINS_DRV_SetPinsDirection(RS1_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_output(RS1_CONFIG_PIN_NUMBER); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsOutput(pin, false /* don't care */); +#endif + RS1_isOutput = true; +} + +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ +void RS1_PutVal(bool Val) +{ +#if McuLib_CONFIG_CPU_IS_LPC + if (Val) { + GPIO_PortSet(RS1_CONFIG_GPIO_NAME, RS1_CONFIG_PORT_NAME, 1<_ */ + _IOCON_PIO_FUNC0 | + /* Selects pull-up function */ + _IOCON_PIO_MODE_PULLUP | + /* Standard mode, output slew rate control is enabled */ + _IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + _IOCON_PIO_INV_DI | + /* Enables digital function */ + _IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + _IOCON_PIO_OPENDRAIN_DI); + #if (McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0) + IOCON_PinMuxSet(RS1_CONFIG_PORT_NAME, RS1_CONFIG_PIN_NUMBER, port_pin_config); + #else + IOCON_PinMuxSet(IOCON, RS1_CONFIG_PORT_NAME, RS1_CONFIG_PIN_NUMBER, port_pin_config); + #endif + #else + PORT_SetPinMux(RS1_CONFIG_PORT_NAME, RS1_CONFIG_PIN_NUMBER, kPORT_MuxAsGpio); /* mux as GPIO */ + #endif + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + /*! Pin Muxing not implemented */ + GPIO_DRV_Init(RS1_InputConfig, RS1_OutputConfig); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + /* the following needs to be called in the application first: + PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); + */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + config.hw.pin = RS1_CONFIG_PIN_NUMBER; + config.isInput = true; + pin = McuGPIO_InitGPIO(&config); +#endif +#if RS1_CONFIG_INIT_PIN_DIRECTION == RS1_CONFIG_INIT_PIN_DIRECTION_INPUT + RS1_SetInput(); +#elif RS1_CONFIG_INIT_PIN_DIRECTION == RS1_CONFIG_INIT_PIN_DIRECTION_OUTPUT + RS1_SetOutput(); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void RS1_Deinit(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + pin = McuGPIO_DeinitGPIO(pin); +#endif +} + +/* END RS1. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/RS1.h b/TSM_PicoW_Sensor/McuLib/HD44780/RS1.h new file mode 100644 index 0000000..8ed5a00 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/RS1.h @@ -0,0 +1,243 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : RS1.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : RS1 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool RS1_GetDir(void); +** SetDir - void RS1_SetDir(bool Dir); +** SetInput - void RS1_SetInput(void); +** SetOutput - void RS1_SetOutput(void); +** GetVal - bool RS1_GetVal(void); +** PutVal - void RS1_PutVal(bool Val); +** ClrVal - void RS1_ClrVal(void); +** SetVal - void RS1_SetVal(void); +** NegVal - void RS1_NegVal(void); +** Init - void RS1_Init(void); +** Deinit - void RS1_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file RS1.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup RS1_module RS1 module documentation +** @{ +*/ + +#ifndef __RS1_H +#define __RS1_H + +/* MODULE RS1. */ +#include "McuLib.h" /* SDK and API used */ +#include "RS1config.h" /* configuration */ + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" + + /* only GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF and GPIOG are currently supported */ + #define RS1_GPIO_IDX GPIOA_IDX /* GPIOA */ + + enum RS1_pinNames{ + RS1_CONFIG_PIN_SYMBOL = GPIO_MAKE_PIN(RS1_GPIO_IDX, RS1_CONFIG_PIN_NUMBER), + }; + + extern const gpio_output_pin_user_config_t RS1_OutputConfig[]; + extern const gpio_input_pin_user_config_t RS1_InputConfig[]; +#endif + +void RS1_Init(void); +/* +** =================================================================== +** Method : Init (component SDK_BitIO) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void RS1_ClrVal(void); +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void RS1_SetVal(void); +/* +** =================================================================== +** Method : SetVal (component SDK_BitIO) +** +** Description : +** Sets the pin value to a high value. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void RS1_NegVal(void); +/* +** =================================================================== +** Method : NegVal (component SDK_BitIO) +** +** Description : +** Toggles/negates the pin value +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void RS1_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +bool RS1_GetVal(void); +/* +** =================================================================== +** Method : GetVal (component SDK_BitIO) +** +** Description : +** Returns the pin value +** Parameters : None +** Returns : +** --- - Returns the value of the pin: +** FALSE/logical level '0' or TRUE/logical +** level '1' +** =================================================================== +*/ + +bool RS1_GetDir(void); +/* +** =================================================================== +** Method : GetDir (component SDK_BitIO) +** +** Description : +** Return the direction of the pin (input/output) +** Parameters : None +** Returns : +** --- - FALSE if port is input, TRUE if port is +** output +** =================================================================== +*/ + +void RS1_SetDir(bool Dir); +/* +** =================================================================== +** Method : SetDir (component SDK_BitIO) +** +** Description : +** Sets the direction of the pin (input or output) +** Parameters : +** NAME - DESCRIPTION +** Dir - FALSE: input, TRUE: output +** Returns : Nothing +** =================================================================== +*/ + +void RS1_SetInput(void); +/* +** =================================================================== +** Method : SetInput (component SDK_BitIO) +** +** Description : +** Sets the pin as input +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void RS1_SetOutput(void); +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void RS1_PutVal(bool Val); +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ + +/* END RS1. */ + +#endif +/* ifndef __RS1_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/RS1config.h b/TSM_PicoW_Sensor/McuLib/HD44780/RS1config.h new file mode 100644 index 0000000..79d868b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/RS1config.h @@ -0,0 +1,87 @@ +/** + * \file + * \brief Configuration header file for SDK_BitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SDK Bit I/O module. + */ + +#ifndef __RS1_CONFIG_H +#define __RS1_CONFIG_H + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_MCUXPRESSO_2_0 + #include "pin_mux.h" /* include pin muxing header file */ + + #if defined(BOARD_INITPINS_RS1_PIN) + #define RS1_CONFIG_PIN_NUMBER BOARD_INITPINS_RS1_PIN + #endif + #if defined(BOARD_INITPINS_RS1_GPIO) + #define RS1_CONFIG_GPIO_NAME BOARD_INITPINS_RS1_GPIO + #endif + #if defined(BOARD_INITPINS_RS1_PORT) + #define RS1_CONFIG_PORT_NAME BOARD_INITPINS_RS1_PORT + #endif +#endif + +#ifndef RS1_CONFIG_PORT_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define RS1_CONFIG_PORT_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define RS1_CONFIG_PORT_NAME 0 + #else /* name from properties */ + #define RS1_CONFIG_PORT_NAME PORTA + #endif + /*!< name of PORT, is pointer to PORT_Type */ +#endif + +#ifndef RS1_CONFIG_GPIO_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define RS1_CONFIG_GPIO_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define RS1_CONFIG_GPIO_NAME GPIO + #elif McuLib_CONFIG_CPU_IS_KINETIS && McuLib_CONFIG_IS_KINETIS_KE + #define RS1_CONFIG_GPIO_NAME 0 + #elif McuLib_CONFIG_CPU_IS_MCX + #define RS1_CONFIG_GPIO_NAME GPIO0 + #else /* name from properties */ + #define RS1_CONFIG_GPIO_NAME GPIOA + #endif + /*!< name of GPIO, is pointer to GPIO_Type, not used for S32K SDK */ +#endif + +#ifndef RS1_CONFIG_PIN_NUMBER + #define RS1_CONFIG_PIN_NUMBER 0u + /*!< number of pin, type unsigned integer */ +#endif + +#ifndef RS1_CONFIG_PIN_SYMBOL + #define RS1_CONFIG_PIN_SYMBOL LED_RED + /*!< symbolic name for pin, used for NXP SDK V1.3 */ +#endif + +#ifndef RS1_CONFIG_INIT_PIN_VALUE + #define RS1_CONFIG_INIT_PIN_VALUE 0 + /*!< 0: Pin data is initialized with 0 (low); 1: pin value is initialized with 1 (high) */ +#endif + +/* different types of pin direction settings */ +#define RS1_CONFIG_INIT_PIN_DIRECTION_NONE (0) +#define RS1_CONFIG_INIT_PIN_DIRECTION_INPUT (1) +#define RS1_CONFIG_INIT_PIN_DIRECTION_OUTPUT (2) + +#ifndef RS1_CONFIG_INIT_PIN_DIRECTION + #define RS1_CONFIG_INIT_PIN_DIRECTION RS1_CONFIG_INIT_PIN_DIRECTION_OUTPUT +#endif + +#ifndef RS1_CONFIG_DO_PIN_MUXING + #define RS1_CONFIG_DO_PIN_MUXING 0 + /*!< 1: perform pin muxing in Init(), 0: do not do pin muxing */ +#endif + +#ifndef RS1_CONFIG_PULL_RESISTOR + #define RS1_CONFIG_PULL_RESISTOR 0 + /*!< pull resistor setting. 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ +#endif + +#endif /* __RS1_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/RW1.c b/TSM_PicoW_Sensor/McuLib/HD44780/RW1.c new file mode 100644 index 0000000..c6c6f18 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/RW1.c @@ -0,0 +1,537 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : RW1.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : RW1 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool RW1_GetDir(void); +** SetDir - void RW1_SetDir(bool Dir); +** SetInput - void RW1_SetInput(void); +** SetOutput - void RW1_SetOutput(void); +** GetVal - bool RW1_GetVal(void); +** PutVal - void RW1_PutVal(bool Val); +** ClrVal - void RW1_ClrVal(void); +** SetVal - void RW1_SetVal(void); +** NegVal - void RW1_NegVal(void); +** Init - void RW1_Init(void); +** Deinit - void RW1_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file RW1.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup RW1_module RW1 module documentation +** @{ +*/ + +/* MODULE RW1. */ + +#include "RW1.h" +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if RW1_CONFIG_DO_PIN_MUXING + #if McuLib_CONFIG_CPU_IS_LPC + #include "fsl_iocon.h" /* include SDK header file for I/O connection muxing */ + #else /* Kinetis */ + #include "fsl_port.h" /* include SDK header file for port muxing */ + #endif + #endif + #include "fsl_gpio.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + #include "pins_gpio_hw_access.h" + #include "pins_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + #include "nrf_gpio.h" +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + #include "McuGPIO.h" +#else + #error "Unsupported SDK!" +#endif + +#if McuLib_CONFIG_NXP_SDK_2_0_USED + static const gpio_pin_config_t RW1_configOutput = { + kGPIO_DigitalOutput, /* use as output pin */ + RW1_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; + + static const gpio_pin_config_t RW1_configInput = { + kGPIO_DigitalInput, /* use as input pin */ + RW1_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + const gpio_output_pin_user_config_t RW1_OutputConfig[] = { + { + .pinName = RW1_CONFIG_PIN_SYMBOL, + .config.outputLogic = RW1_CONFIG_INIT_PIN_VALUE, + #if FSL_FEATURE_PORT_HAS_SLEW_RATE + .config.slewRate = kPortSlowSlewRate, + #endif + #if FSL_FEATURE_PORT_HAS_OPEN_DRAIN + .config.isOpenDrainEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH + .config.driveStrength = kPortLowDriveStrength, + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; + + const gpio_input_pin_user_config_t RW1_InputConfig[] = { + { + .pinName = RW1_CONFIG_PIN_SYMBOL, + #if FSL_FEATURE_PORT_HAS_PULL_ENABLE + #if RW1_CONFIG_PULL_RESISTOR==0 /* 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ + .config.isPullEnable = false, + #else + .config.isPullEnable = true, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PULL_SELECTION + #if RW1_CONFIG_PULL_RESISTOR==1 + .config.pullSelect = kPortPullUp, + #else + .config.pullSelect = kPortPullDown, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER + .config.isPassiveFilterEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER + .config.isDigitalFilterEnabled = true, + #endif + #if FSL_FEATURE_GPIO_HAS_INTERRUPT_VECTOR + .config.interrupt = kPortIntDisabled + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + static McuGPIO_Handle_t pin; +#endif + +static bool RW1_isOutput = false; +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void RW1_ClrVal(void) +{ +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if McuLib_CONFIG_CPU_IS_LPC + GPIO_PortClear(RW1_CONFIG_GPIO_NAME, RW1_CONFIG_PORT_NAME, 1< input */ + PINS_DRV_SetPinsDirection(RW1_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_input(RW1_CONFIG_PIN_NUMBER, NRF_GPIO_PIN_NOPULL); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsInput(pin); +#endif + RW1_isOutput = false; +} + +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void RW1_SetOutput(void) +{ +#if McuLib_CONFIG_CPU_IS_LPC + GPIO_PinInit(RW1_CONFIG_GPIO_NAME, RW1_CONFIG_PORT_NAME, RW1_CONFIG_PIN_NUMBER, &RW1_configOutput); +#elif McuLib_CONFIG_NXP_SDK_2_0_USED + GPIO_PinInit(RW1_CONFIG_GPIO_NAME, RW1_CONFIG_PIN_NUMBER, &RW1_configOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + GPIO_DRV_SetPinDir(RW1_CONFIG_PIN_SYMBOL, kGpioDigitalOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + pins_channel_type_t val; + + val = PINS_GPIO_GetPinsDirection(RW1_CONFIG_PORT_NAME); /* bit 0: pin is input; 1: pin is output */ + val |= (1< output */ + PINS_DRV_SetPinsDirection(RW1_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_output(RW1_CONFIG_PIN_NUMBER); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsOutput(pin, false /* don't care */); +#endif + RW1_isOutput = true; +} + +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ +void RW1_PutVal(bool Val) +{ +#if McuLib_CONFIG_CPU_IS_LPC + if (Val) { + GPIO_PortSet(RW1_CONFIG_GPIO_NAME, RW1_CONFIG_PORT_NAME, 1<_ */ + _IOCON_PIO_FUNC0 | + /* Selects pull-up function */ + _IOCON_PIO_MODE_PULLUP | + /* Standard mode, output slew rate control is enabled */ + _IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + _IOCON_PIO_INV_DI | + /* Enables digital function */ + _IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + _IOCON_PIO_OPENDRAIN_DI); + #if (McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0) + IOCON_PinMuxSet(RW1_CONFIG_PORT_NAME, RW1_CONFIG_PIN_NUMBER, port_pin_config); + #else + IOCON_PinMuxSet(IOCON, RW1_CONFIG_PORT_NAME, RW1_CONFIG_PIN_NUMBER, port_pin_config); + #endif + #else + PORT_SetPinMux(RW1_CONFIG_PORT_NAME, RW1_CONFIG_PIN_NUMBER, kPORT_MuxAsGpio); /* mux as GPIO */ + #endif + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + /*! Pin Muxing not implemented */ + GPIO_DRV_Init(RW1_InputConfig, RW1_OutputConfig); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + /* the following needs to be called in the application first: + PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); + */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + config.hw.pin = RW1_CONFIG_PIN_NUMBER; + config.isInput = true; + pin = McuGPIO_InitGPIO(&config); +#endif +#if RW1_CONFIG_INIT_PIN_DIRECTION == RW1_CONFIG_INIT_PIN_DIRECTION_INPUT + RW1_SetInput(); +#elif RW1_CONFIG_INIT_PIN_DIRECTION == RW1_CONFIG_INIT_PIN_DIRECTION_OUTPUT + RW1_SetOutput(); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void RW1_Deinit(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + pin = McuGPIO_DeinitGPIO(pin); +#endif +} + +/* END RW1. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/RW1.h b/TSM_PicoW_Sensor/McuLib/HD44780/RW1.h new file mode 100644 index 0000000..6698be1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/RW1.h @@ -0,0 +1,243 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : RW1.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : RW1 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool RW1_GetDir(void); +** SetDir - void RW1_SetDir(bool Dir); +** SetInput - void RW1_SetInput(void); +** SetOutput - void RW1_SetOutput(void); +** GetVal - bool RW1_GetVal(void); +** PutVal - void RW1_PutVal(bool Val); +** ClrVal - void RW1_ClrVal(void); +** SetVal - void RW1_SetVal(void); +** NegVal - void RW1_NegVal(void); +** Init - void RW1_Init(void); +** Deinit - void RW1_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file RW1.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup RW1_module RW1 module documentation +** @{ +*/ + +#ifndef __RW1_H +#define __RW1_H + +/* MODULE RW1. */ +#include "McuLib.h" /* SDK and API used */ +#include "RW1config.h" /* configuration */ + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" + + /* only GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF and GPIOG are currently supported */ + #define RW1_GPIO_IDX GPIOA_IDX /* GPIOA */ + + enum RW1_pinNames{ + RW1_CONFIG_PIN_SYMBOL = GPIO_MAKE_PIN(RW1_GPIO_IDX, RW1_CONFIG_PIN_NUMBER), + }; + + extern const gpio_output_pin_user_config_t RW1_OutputConfig[]; + extern const gpio_input_pin_user_config_t RW1_InputConfig[]; +#endif + +void RW1_Init(void); +/* +** =================================================================== +** Method : Init (component SDK_BitIO) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void RW1_ClrVal(void); +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void RW1_SetVal(void); +/* +** =================================================================== +** Method : SetVal (component SDK_BitIO) +** +** Description : +** Sets the pin value to a high value. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void RW1_NegVal(void); +/* +** =================================================================== +** Method : NegVal (component SDK_BitIO) +** +** Description : +** Toggles/negates the pin value +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void RW1_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +bool RW1_GetVal(void); +/* +** =================================================================== +** Method : GetVal (component SDK_BitIO) +** +** Description : +** Returns the pin value +** Parameters : None +** Returns : +** --- - Returns the value of the pin: +** FALSE/logical level '0' or TRUE/logical +** level '1' +** =================================================================== +*/ + +bool RW1_GetDir(void); +/* +** =================================================================== +** Method : GetDir (component SDK_BitIO) +** +** Description : +** Return the direction of the pin (input/output) +** Parameters : None +** Returns : +** --- - FALSE if port is input, TRUE if port is +** output +** =================================================================== +*/ + +void RW1_SetDir(bool Dir); +/* +** =================================================================== +** Method : SetDir (component SDK_BitIO) +** +** Description : +** Sets the direction of the pin (input or output) +** Parameters : +** NAME - DESCRIPTION +** Dir - FALSE: input, TRUE: output +** Returns : Nothing +** =================================================================== +*/ + +void RW1_SetInput(void); +/* +** =================================================================== +** Method : SetInput (component SDK_BitIO) +** +** Description : +** Sets the pin as input +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void RW1_SetOutput(void); +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void RW1_PutVal(bool Val); +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ + +/* END RW1. */ + +#endif +/* ifndef __RW1_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/HD44780/RW1config.h b/TSM_PicoW_Sensor/McuLib/HD44780/RW1config.h new file mode 100644 index 0000000..13e4321 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/HD44780/RW1config.h @@ -0,0 +1,87 @@ +/** + * \file + * \brief Configuration header file for SDK_BitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SDK Bit I/O module. + */ + +#ifndef __RW1_CONFIG_H +#define __RW1_CONFIG_H + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_MCUXPRESSO_2_0 + #include "pin_mux.h" /* include pin muxing header file */ + + #if defined(BOARD_INITPINS_RW1_PIN) + #define RW1_CONFIG_PIN_NUMBER BOARD_INITPINS_RW1_PIN + #endif + #if defined(BOARD_INITPINS_RW1_GPIO) + #define RW1_CONFIG_GPIO_NAME BOARD_INITPINS_RW1_GPIO + #endif + #if defined(BOARD_INITPINS_RW1_PORT) + #define RW1_CONFIG_PORT_NAME BOARD_INITPINS_RW1_PORT + #endif +#endif + +#ifndef RW1_CONFIG_PORT_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define RW1_CONFIG_PORT_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define RW1_CONFIG_PORT_NAME 0 + #else /* name from properties */ + #define RW1_CONFIG_PORT_NAME PORTA + #endif + /*!< name of PORT, is pointer to PORT_Type */ +#endif + +#ifndef RW1_CONFIG_GPIO_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define RW1_CONFIG_GPIO_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define RW1_CONFIG_GPIO_NAME GPIO + #elif McuLib_CONFIG_CPU_IS_KINETIS && McuLib_CONFIG_IS_KINETIS_KE + #define RW1_CONFIG_GPIO_NAME 0 + #elif McuLib_CONFIG_CPU_IS_MCX + #define RW1_CONFIG_GPIO_NAME GPIO0 + #else /* name from properties */ + #define RW1_CONFIG_GPIO_NAME GPIOA + #endif + /*!< name of GPIO, is pointer to GPIO_Type, not used for S32K SDK */ +#endif + +#ifndef RW1_CONFIG_PIN_NUMBER + #define RW1_CONFIG_PIN_NUMBER 0u + /*!< number of pin, type unsigned integer */ +#endif + +#ifndef RW1_CONFIG_PIN_SYMBOL + #define RW1_CONFIG_PIN_SYMBOL LED_RED + /*!< symbolic name for pin, used for NXP SDK V1.3 */ +#endif + +#ifndef RW1_CONFIG_INIT_PIN_VALUE + #define RW1_CONFIG_INIT_PIN_VALUE 0 + /*!< 0: Pin data is initialized with 0 (low); 1: pin value is initialized with 1 (high) */ +#endif + +/* different types of pin direction settings */ +#define RW1_CONFIG_INIT_PIN_DIRECTION_NONE (0) +#define RW1_CONFIG_INIT_PIN_DIRECTION_INPUT (1) +#define RW1_CONFIG_INIT_PIN_DIRECTION_OUTPUT (2) + +#ifndef RW1_CONFIG_INIT_PIN_DIRECTION + #define RW1_CONFIG_INIT_PIN_DIRECTION RW1_CONFIG_INIT_PIN_DIRECTION_OUTPUT +#endif + +#ifndef RW1_CONFIG_DO_PIN_MUXING + #define RW1_CONFIG_DO_PIN_MUXING 0 + /*!< 1: perform pin muxing in Init(), 0: do not do pin muxing */ +#endif + +#ifndef RW1_CONFIG_PULL_RESISTOR + #define RW1_CONFIG_PULL_RESISTOR 0 + /*!< pull resistor setting. 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ +#endif + +#endif /* __RW1_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/LICENSE.md b/TSM_PicoW_Sensor/McuLib/LICENSE.md new file mode 100644 index 0000000..fca1552 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LICENSE.md @@ -0,0 +1,44 @@ +The provided files are provided under the following permissive license (with exceptions noted below): + +/* +* Copyright (c) 2011-2023, Erich Styger +* Web: https://mcuoneclipse.com +* SourceForge: https://sourceforge.net/projects/mcuoneclipse +* Git: https://github.com/ErichStyger/McuOnEclipse_PEx +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* +* - Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer. +* +* - Redistributions in binary form must reproduce the above copyright notice, this +* list of conditions and the following disclaimer in the documentation and/or +* other materials provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +EXCEPTIONS and different licenses: +- FreeRTOS: see lib\FreeRTOS\Source\FreeRTOS_license.txt +- FatFS: Copyright (c) Elm Chan +- TraceRecorder: (c) Copyright Percepio AB, www.percepio.com +- Xformat: (c) Copyright Mario Viara, 2014-2016, https://github.com/MarioViara/xprintfc +- xatoi() in Utility: Copyright (C) 2010, ChaN, all right reserved. +- LittlevGL: Copyright (c) 2016 Gabor Kiss-Vamosi, https://lvgl.io +- littleFS: Copyright (c) 2022, The littlefs authors. Copyright (c) 2017, Arm Limited. +- minIni: Copyright (c) CompuPhase, 2008-2012 +- unity: Copyright (c) Mark VanderVoord, Mike Karlesky, and Greg Williams, http://www.throwtheswitch.org/unity + +See the license information in the respective sub-folders. + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/.gitignore b/TSM_PicoW_Sensor/McuLib/LittlevGL/.gitignore new file mode 100644 index 0000000..395e102 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/.gitignore @@ -0,0 +1,3 @@ +/CMakeFiles/ +Makefile +*.a diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/CMakeLists.txt b/TSM_PicoW_Sensor/McuLib/LittlevGL/CMakeLists.txt new file mode 100644 index 0000000..99a7f9f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/CMakeLists.txt @@ -0,0 +1,27 @@ +# file: Collect all files that need to be compiled. + +# search recursively all files: +file(GLOB_RECURSE LVGL_FILES "lvgl/src/*.c") + +# add_library: With this declaration, you express the intent to build a library. +# The first argument, is the name of the library, +# the second argument are the files that will be compiled to create your library. +add_library(lvglLib + ${LVGL_FILES} +) + +# target_link_libraries: If you link with other libraries, list them here +target_link_libraries( + lvglLib +) + +# target_include_directories: Libraries need to publish their header files +# so that you can import them in source code. This statement expresses where to find the files +# - typically in an include directory of your projects. +target_include_directories( + lvglLib + PUBLIC + ./ + ./lvgl + ) + \ No newline at end of file diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lv_conf_template.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lv_conf_template.h new file mode 100644 index 0000000..782a913 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lv_conf_template.h @@ -0,0 +1,786 @@ +/** + * @file lv_conf.h + * Configuration file for v8.3.3 + */ + +/* + * Copy this file as `lv_conf.h` + * 1. simply next to the `lvgl` folder + * 2. or any other places and + * - define `LV_CONF_INCLUDE_SIMPLE` + * - add the path as include path + */ + +/* clang-format off */ +#if 0 /*Set it to "1" to enable content*/ + +#ifndef LV_CONF_H +#define LV_CONF_H + +#include + +/*==================== + COLOR SETTINGS + *====================*/ + +/*Color depth: 1 (1 bit per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/ +#define LV_COLOR_DEPTH 1 + +#define LV_HOR_RES (128) +#define LV_VER_RES (64) +/* default font: see LV_FONT_DEFAULT */ +//#define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_14 /* default + +/*Enable features to draw on transparent background. + *It's required if opa, and transform_* style properties are used. + *Can be also used if the UI is above another layer, e.g. an OSD menu or video player.*/ +#define LV_COLOR_SCREEN_TRANSP 0 + +/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. + * 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */ +#define LV_COLOR_MIX_ROUND_OFS 0 + +/*Images pixels with this color will not be drawn if they are chroma keyed)*/ +#define LV_COLOR_CHROMA_KEY lv_color_hex(0x00ff00) /*pure green*/ + +/*========================= + STDLIB WRAPPER SETTINGS + *=========================*/ + +/*Enable and configure the built-in memory manager*/ +#define LV_USE_BUILTIN_MALLOC 0 +#if LV_USE_BUILTIN_MALLOC + /*Size of the memory available for `lv_malloc()` in bytes (>= 2kB)*/ + #define LV_MEM_SIZE (128U * 1024U) /*[bytes]*/ + + /*Size of the memory expand for `lv_malloc()` in bytes*/ + #define LV_MEM_POOL_EXPAND_SIZE 0 + + /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/ + #define LV_MEM_ADR 0 /*0: unused*/ + /*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/ + #if LV_MEM_ADR == 0 + #undef LV_MEM_POOL_INCLUDE + #undef LV_MEM_POOL_ALLOC + #endif +#endif /*LV_USE_BUILTIN_MALLOC*/ + +/*Enable lv_memcpy_builtin, lv_memset_builtin, lv_strlen_builtin, lv_strncpy_builtin*/ +#define LV_USE_BUILTIN_MEMCPY 1 + +/*Enable and configure the built-in (v)snprintf */ +#define LV_USE_BUILTIN_SNPRINTF 1 +#if LV_USE_BUILTIN_SNPRINTF + #define LV_SPRINTF_USE_FLOAT 0 +#endif /*LV_USE_BUILTIN_SNPRINTF*/ + +#define LV_STDIO_INCLUDE +#define LV_STRING_INCLUDE +#define LV_STDLIB_INCLUDE +#if LV_USE_BUILTIN_MALLOC + #define LV_MALLOC lv_malloc_builtin + #define LV_REALLOC lv_realloc_builtin + #define LV_FREE lv_free_builtin +#else + #define LV_MEM_CUSTOM_INCLUDE "FreeRTOS.h" + #define CONFIG_LV_MALLOC pvPortMalloc + #define CONFIG_LV_REALLOC pvPortRealloc + #define CONFIG_LV_FREE vPortFree +#endif +#define LV_MEMSET lv_memset_builtin +#define LV_MEMCPY lv_memcpy_builtin +#define LV_SNPRINTF lv_snprintf_builtin +#define LV_VSNPRINTF lv_vsnprintf_builtin +#define LV_STRLEN lv_strlen_builtin +#define LV_STRNCPY lv_strncpy_builtin + +/*==================== + HAL SETTINGS + *====================*/ + +/*Default display refresh period. LVG will redraw changed areas with this period time*/ +#define LV_DISP_DEF_REFR_PERIOD 30 /*[ms]*/ + +/*Input device read period in milliseconds*/ +#define LV_INDEV_DEF_READ_PERIOD 30 /*[ms]*/ + +/*Use a custom tick source that tells the elapsed time in milliseconds. + *It removes the need to manually update the tick with `lv_tick_inc()`)*/ +#define LV_TICK_CUSTOM 0 +#if LV_TICK_CUSTOM + #define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/ + #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/ +#endif /*LV_TICK_CUSTOM*/ + +/*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. + *(Not so important, you can adjust it to modify default sizes and spaces)*/ +#define LV_DPI_DEF LV_CONFIG_DPI /*130*/ /*[px/inch]*/ + +/*======================== + * DRAW CONFIGURATION + *========================*/ + +/*Enable the built in mask engine. + *Required to draw shadow, rounded corners, circles, arc, skew lines, or any other masks*/ +#define LV_USE_DRAW_MASKS 1 + +#define LV_USE_DRAW_SW 1 +#if LV_USE_DRAW_SW + + /*Enable complex draw engine. + *Required to draw shadow, gradient, rounded corners, circles, arc, skew lines, image transformations or any masks*/ + #define LV_DRAW_SW_COMPLEX 1 + + /* If a widget has `style_opa < 255` (not `bg_opa`, `text_opa` etc) or not NORMAL blend mode + * it is buffered into a "simple" layer before rendering. The widget can be buffered in smaller chunks. + * "Transformed layers" (if `transform_angle/zoom` are set) use larger buffers + * and can't be drawn in chunks. */ + + /*The target buffer size for simple layer chunks.*/ + #define LV_DRAW_SW_LAYER_SIMPLE_BUF_SIZE (24 * 1024) /*[bytes]*/ + + /*Used if `LV_DRAW_SW_LAYER_SIMPLE_BUF_SIZE` couldn't be allocated.*/ + #define LV_DRAW_SW_LAYER_SIMPLE_FALLBACK_BUF_SIZE (3 * 1024) /*[bytes]*/ + + /*Allow buffering some shadow calculation. + *LV_DRAW_SW_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius` + *Caching has LV_DRAW_SW_SHADOW_CACHE_SIZE^2 RAM cost*/ + #define LV_DRAW_SW_SHADOW_CACHE_SIZE 0 + + /* Set number of maximally cached circle data. + * The circumference of 1/4 circle are saved for anti-aliasing + * radius * 4 bytes are used per circle (the most often used radiuses are saved) + * 0: to disable caching */ + #define LV_DRAW_SW_CIRCLE_CACHE_SIZE 4 + + /*Default gradient buffer size. + *When LVGL calculates the gradient "maps" it can save them into a cache to avoid calculating them again. + *LV_DRAW_SW_GRADIENT_CACHE_DEF_SIZE sets the size of this cache in bytes. + *If the cache is too small the map will be allocated only while it's required for the drawing. + *0 mean no caching.*/ + #define LV_DRAW_SW_GRADIENT_CACHE_DEF_SIZE 0 + + /*Allow dithering the gradients (to achieve visual smooth color gradients on limited color depth display) + *LV_DRAW_SW_GRADIENT_DITHER implies allocating one or two more lines of the object's rendering surface + *The increase in memory consumption is (32 bits * object width) plus 24 bits * object width if using error diffusion */ + #define LV_DRAW_SW_GRADIENT_DITHER 0 + #if LV_DRAW_SW_GRADIENT_DITHER + /*Add support for error diffusion dithering. + *Error diffusion dithering gets a much better visual result, but implies more CPU consumption and memory when drawing. + *The increase in memory consumption is (24 bits * object's width)*/ + #define LV_DRAW_SW_GRADIENT_DITHER_ERROR_DIFFUSION 0 + #endif + + /*Enable subpixel rendering*/ + #define LV_DRAW_SW_FONT_SUBPX 0 + #if LV_DRAW_SW_FONT_SUBPX + /*Set the pixel order of the display. Physical order of RGB channels. Doesn't matter with "normal" fonts.*/ + #define LV_DRAW_SW_FONT_SUBPX_BGR 0 /*0: RGB; 1:BGR order*/ + #endif +#endif + +/*Use SDL renderer API*/ +#define LV_USE_DRAW_SDL 0 +#if LV_USE_DRAW_SDL + #define LV_DRAW_SDL_INCLUDE_PATH + /*Texture cache size, 8MB by default*/ + #define LV_DRAW_SDL_LRU_SIZE (1024 * 1024 * 8) + /*Custom blend mode for mask drawing, disable if you need to link with older SDL2 lib*/ + #define LV_DRAW_SDL_CUSTOM_BLEND_MODE (SDL_VERSION_ATLEAST(2, 0, 6)) +#endif + +/*===================== + * GPU CONFIGURATION + *=====================*/ + +/*Use Arm's 2D acceleration library Arm-2D */ +#define LV_USE_GPU_ARM2D 0 + +/*Use STM32's DMA2D (aka Chrom Art) GPU*/ +#define LV_USE_GPU_STM32_DMA2D 0 +#if LV_USE_GPU_STM32_DMA2D + /*Must be defined to include path of CMSIS header of target processor + e.g. "stm32f769xx.h" or "stm32f429xx.h"*/ + #define LV_GPU_DMA2D_CMSIS_INCLUDE +#endif + +/*Use GD32 IPA GPU + * This adds support for Image Processing Accelerator on GD32F450 and GD32F470 series MCUs + * + * NOTE: IPA on GD32F450 has a bug where the fill operation overwrites data beyond the + * framebuffer. This driver works around it by saving and restoring affected memory, but + * this makes it not thread-safe. GD32F470 is not affected. */ +#define LV_USE_GPU_GD32_IPA 0 + +/*Use NXP's PXP GPU iMX RTxxx platforms*/ +#define LV_USE_GPU_NXP_PXP 0 +#if LV_USE_GPU_NXP_PXP + /*1: Add default bare metal and FreeRTOS interrupt handling routines for PXP (lv_gpu_nxp_pxp_osa.c) + * and call lv_gpu_nxp_pxp_init() automatically during lv_init(). Note that symbol SDK_OS_FREE_RTOS + * has to be defined in order to use FreeRTOS OSA, otherwise bare-metal implementation is selected. + *0: lv_gpu_nxp_pxp_init() has to be called manually before lv_init() + */ + #define LV_USE_GPU_NXP_PXP_AUTO_INIT 0 +#endif + +/*Use NXP's VG-Lite GPU iMX RTxxx platforms*/ +#define LV_USE_GPU_NXP_VG_LITE 0 + +/*Use SWM341's DMA2D GPU*/ +#define LV_USE_GPU_SWM341_DMA2D 0 +#if LV_USE_GPU_SWM341_DMA2D + #define LV_GPU_SWM341_DMA2D_INCLUDE "SWM341.h" +#endif + +/*======================= + * FEATURE CONFIGURATION + *=======================*/ + +/*------------- + * Logging + *-----------*/ + +/*Enable the log module*/ +#define LV_USE_LOG 0 +#if LV_USE_LOG + + /*How important log should be added: + *LV_LOG_LEVEL_TRACE A lot of logs to give detailed information + *LV_LOG_LEVEL_INFO Log important events + *LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem + *LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail + *LV_LOG_LEVEL_USER Only logs added by the user + *LV_LOG_LEVEL_NONE Do not log anything*/ + #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN + + /*1: Print the log with 'printf'; + *0: User need to register a callback with `lv_log_register_print_cb()`*/ + #define LV_LOG_PRINTF 0 + + /*1: Enable print timestamp; + *0: Disable print timestamp*/ + #define LV_LOG_USE_TIMESTAMP 1 + + /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/ + #define LV_LOG_TRACE_MEM 1 + #define LV_LOG_TRACE_TIMER 1 + #define LV_LOG_TRACE_INDEV 1 + #define LV_LOG_TRACE_DISP_REFR 1 + #define LV_LOG_TRACE_EVENT 1 + #define LV_LOG_TRACE_OBJ_CREATE 1 + #define LV_LOG_TRACE_LAYOUT 1 + #define LV_LOG_TRACE_ANIM 1 + +#endif /*LV_USE_LOG*/ + +/*------------- + * Asserts + *-----------*/ + +/*Enable asserts if an operation is failed or an invalid data is found. + *If LV_USE_LOG is enabled an error message will be printed on failure*/ +#define LV_USE_ASSERT_NULL 1 /*Check if the parameter is NULL. (Very fast, recommended)*/ +#define LV_USE_ASSERT_MALLOC 1 /*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/ +#define LV_USE_ASSERT_STYLE 0 /*Check if the styles are properly initialized. (Very fast, recommended)*/ +#define LV_USE_ASSERT_MEM_INTEGRITY 0 /*Check the integrity of `lv_mem` after critical operations. (Slow)*/ +#define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/ + +/*Add a custom handler when assert happens e.g. to restart the MCU*/ +#define LV_ASSERT_HANDLER_INCLUDE +#define LV_ASSERT_HANDLER while(1); /*Halt by default*/ + +/*------------- + * Others + *-----------*/ + +/*1: Show CPU usage and FPS count*/ +#define LV_USE_PERF_MONITOR 0 +#if LV_USE_PERF_MONITOR + #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT +#endif + +/*1: Show the used memory and the memory fragmentation + * Requires `LV_USE_BUILTIN_MALLOC = 1`*/ +#define LV_USE_MEM_MONITOR 0 +#if LV_USE_MEM_MONITOR + #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT +#endif + +/*1: Draw random colored rectangles over the redrawn areas*/ +#define LV_USE_REFR_DEBUG 0 + +/*Maximum buffer size to allocate for rotation. + *Only used if software rotation is enabled in the display driver.*/ +#define LV_DISP_ROT_MAX_BUF (10*1024) + +#define LV_USE_USER_DATA 1 + +/*Garbage Collector settings + *Used if lvgl is bound to higher level language and the memory is managed by that language*/ +#define LV_ENABLE_GC 0 +#if LV_ENABLE_GC != 0 + #define LV_GC_INCLUDE "gc.h" /*Include Garbage Collector related things*/ +#endif /*LV_ENABLE_GC*/ + +/*Default image cache size. Image caching keeps some images opened. + *If only the built-in image formats are used there is no real advantage of caching. + *With other image decoders (e.g. PNG or JPG) caching save the continuous open/decode of images. + *However the opened images consume additional RAM. + *0: to disable caching*/ +#define LV_IMG_CACHE_DEF_SIZE 0 + + +/*Number of stops allowed per gradient. Increase this to allow more stops. + *This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/ +#define LV_GRADIENT_MAX_STOPS 2 + +/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. + * 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */ +#define LV_COLOR_MIX_ROUND_OFS 0 + +/*===================== + * COMPILER SETTINGS + *====================*/ + +/*For big endian systems set to 1*/ +#define LV_BIG_ENDIAN_SYSTEM 0 + +/*Define a custom attribute to `lv_tick_inc` function*/ +#define LV_ATTRIBUTE_TICK_INC + +/*Define a custom attribute to `lv_timer_handler` function*/ +#define LV_ATTRIBUTE_TIMER_HANDLER + +/*Define a custom attribute to `lv_disp_flush_ready` function*/ +#define LV_ATTRIBUTE_FLUSH_READY + +/*Required alignment size for buffers*/ +#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1 + +/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default). + * E.g. __attribute__((aligned(4)))*/ +#define LV_ATTRIBUTE_MEM_ALIGN + +/*Attribute to mark large constant arrays for example font's bitmaps*/ +#define LV_ATTRIBUTE_LARGE_CONST + +/*Compiler prefix for a big array declaration in RAM*/ +#define LV_ATTRIBUTE_LARGE_RAM_ARRAY + +/*Place performance critical functions into a faster memory (e.g RAM)*/ +#define LV_ATTRIBUTE_FAST_MEM + + +/*Export integer constant to binding. This macro is used with constants in the form of LV_ that + *should also appear on LVGL binding API such as Micropython.*/ +#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /*The default value just prevents GCC warning*/ + +/*Extend the default -32k..32k coordinate range to -4M..4M by using int32_t for coordinates instead of int16_t*/ +#define LV_USE_LARGE_COORD 0 + +/*================== + * FONT USAGE + *===================*/ + +/*Montserrat fonts with ASCII range and some symbols using bpp = 4 + *https://fonts.google.com/specimen/Montserrat*/ +#define LV_FONT_MONTSERRAT_8 1 +#define LV_FONT_MONTSERRAT_10 1 +#define LV_FONT_MONTSERRAT_12 1 +#define LV_FONT_MONTSERRAT_14 1 +#define LV_FONT_MONTSERRAT_16 0 +#define LV_FONT_MONTSERRAT_18 0 +#define LV_FONT_MONTSERRAT_20 0 +#define LV_FONT_MONTSERRAT_22 0 +#define LV_FONT_MONTSERRAT_24 0 +#define LV_FONT_MONTSERRAT_26 0 +#define LV_FONT_MONTSERRAT_28 0 +#define LV_FONT_MONTSERRAT_30 0 +#define LV_FONT_MONTSERRAT_32 0 +#define LV_FONT_MONTSERRAT_34 0 +#define LV_FONT_MONTSERRAT_36 0 +#define LV_FONT_MONTSERRAT_38 0 +#define LV_FONT_MONTSERRAT_40 0 +#define LV_FONT_MONTSERRAT_42 0 +#define LV_FONT_MONTSERRAT_44 0 +#define LV_FONT_MONTSERRAT_46 0 +#define LV_FONT_MONTSERRAT_48 0 + +/*Demonstrate special features*/ +#define LV_FONT_MONTSERRAT_12_SUBPX 0 +#define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /*bpp = 3*/ +#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /*Hebrew, Arabic, Persian letters and all their forms*/ +#define LV_FONT_SIMSUN_16_CJK 0 /*1000 most common CJK radicals*/ + +/*Pixel perfect monospace fonts*/ +#define LV_FONT_UNSCII_8 0 +#define LV_FONT_UNSCII_16 0 + +/*Optionally declare custom fonts here. + *You can use these fonts as default font too and they will be available globally. + *E.g. #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/ +#define LV_FONT_CUSTOM_DECLARE + +/*Always set a default font*/ +#define LV_FONT_DEFAULT &lv_font_montserrat_14 + +/*Enable handling large font and/or fonts with a lot of characters. + *The limit depends on the font size, font face and bpp. + *Compiler error will be triggered if a font needs it.*/ +#define LV_FONT_FMT_TXT_LARGE 0 + +/*Enables/disables support for compressed fonts.*/ +#define LV_USE_FONT_COMPRESSED 0 + +/*Enable drawing placeholders when glyph dsc is not found*/ +#define LV_USE_FONT_PLACEHOLDER 1 + +/*================= + * TEXT SETTINGS + *=================*/ + +/** + * Select a character encoding for strings. + * Your IDE or editor should have the same character encoding + * - LV_TXT_ENC_UTF8 + * - LV_TXT_ENC_ASCII + */ +#define LV_TXT_ENC LV_TXT_ENC_UTF8 + +/*Can break (wrap) texts on these chars*/ +#define LV_TXT_BREAK_CHARS " ,.;:-_)]}" + +/*If a word is at least this long, will break wherever "prettiest" + *To disable, set to a value <= 0*/ +#define LV_TXT_LINE_BREAK_LONG_LEN 0 + +/*Minimum number of characters in a long word to put on a line before a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 + +/*Minimum number of characters in a long word to put on a line after a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 + +/*The control character to use for signalling text recoloring.*/ +#define LV_TXT_COLOR_CMD "#" + +/*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts. + *The direction will be processed according to the Unicode Bidirectional Algorithm: + *https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/ +#define LV_USE_BIDI 0 +#if LV_USE_BIDI + /*Set the default direction. Supported values: + *`LV_BASE_DIR_LTR` Left-to-Right + *`LV_BASE_DIR_RTL` Right-to-Left + *`LV_BASE_DIR_AUTO` detect texts base direction*/ + #define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO +#endif + +/*Enable Arabic/Persian processing + *In these languages characters should be replaced with an other form based on their position in the text*/ +#define LV_USE_ARABIC_PERSIAN_CHARS 0 + +/*================== + * WIDGETS + *================*/ + +/*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/ + +#define LV_USE_ANIMIMG 0 + +#define LV_USE_ARC 1 + +#define LV_USE_BAR 1 + +#define LV_USE_BTN 1 + +#define LV_USE_BTNMATRIX 1 + +#define LV_USE_CALENDAR 0 +#if LV_USE_CALENDAR + #define LV_CALENDAR_WEEK_STARTS_MONDAY 0 + #if LV_CALENDAR_WEEK_STARTS_MONDAY + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"} + #else + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"} + #endif + + #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} + #define LV_USE_CALENDAR_HEADER_ARROW 1 + #define LV_USE_CALENDAR_HEADER_DROPDOWN 1 +#endif /*LV_USE_CALENDAR*/ + +#define LV_USE_CANVAS 0 + +#define LV_USE_CHART 0 + +#define LV_USE_CHECKBOX 1 + +#define LV_USE_COLORWHEEL 0 + +#define LV_USE_DROPDOWN 1 /*Requires: lv_label*/ + +#define LV_USE_IMG 1 /*Requires: lv_label*/ + +#define LV_USE_IMGBTN 0 + +#define LV_USE_KEYBOARD 0 + +#define LV_USE_LABEL 1 +#if LV_USE_LABEL + #define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/ + #define LV_LABEL_LONG_TXT_HINT 1 /*Store some extra info in labels to speed up drawing of very long texts*/ +#endif + +#define LV_USE_LED 0 + +#define LV_USE_LINE 1 + +#define LV_USE_LIST 0 + +#define LV_USE_MENU 0 + +#define LV_USE_METER 0 + +#define LV_USE_MSGBOX 0 + +#define LV_USE_ROLLER 1 /*Requires: lv_label*/ + +#define LV_USE_SLIDER 1 /*Requires: lv_bar*/ + +#define LV_USE_SPAN 0 +#if LV_USE_SPAN + /*A line text can contain maximum num of span descriptor */ + #define LV_SPAN_SNIPPET_STACK_SIZE 64 +#endif + +#define LV_USE_SPINBOX 0 + +#define LV_USE_SPINNER 0 + +#define LV_USE_SWITCH 1 + +#define LV_USE_TEXTAREA 1 /*Requires: lv_label*/ +#if LV_USE_TEXTAREA != 0 + #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ +#endif + +#define LV_USE_TABLE 0 + +#define LV_USE_TABVIEW 0 + +#define LV_USE_TILEVIEW 0 + +#define LV_USE_WIN 0 + +/*================== + * THEMES + *==================*/ + +/*A simple, impressive and very complete theme*/ +#define LV_USE_THEME_DEFAULT 0 +#if LV_USE_THEME_DEFAULT + + /*0: Light mode; 1: Dark mode*/ + #define LV_THEME_DEFAULT_DARK 0 + + /*1: Enable grow on press*/ + #define LV_THEME_DEFAULT_GROW 1 + + /*Default transition time in [ms]*/ + #define LV_THEME_DEFAULT_TRANSITION_TIME 80 +#endif /*LV_USE_THEME_DEFAULT*/ + +/*A very simple theme that is a good starting point for a custom theme*/ +#define LV_USE_THEME_BASIC 0 + +/*A theme designed for monochrome displays*/ +#define LV_USE_THEME_MONO 1 + +/*================== + * LAYOUTS + *==================*/ + +/*A layout similar to Flexbox in CSS.*/ +#define LV_USE_FLEX 1 /* 1 */ + +/*A layout similar to Grid in CSS.*/ +#define LV_USE_GRID 0 + +/*==================== + * 3RD PARTS LIBRARIES + *====================*/ + +/*File system interfaces for common APIs */ + +/*API for fopen, fread, etc*/ +#define LV_USE_FS_STDIO 0 +#if LV_USE_FS_STDIO + #define LV_FS_STDIO_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for open, read, etc*/ +#define LV_USE_FS_POSIX 0 +#if LV_USE_FS_POSIX + #define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for CreateFile, ReadFile, etc*/ +#define LV_USE_FS_WIN32 0 +#if LV_USE_FS_WIN32 + #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/ +#define LV_USE_FS_FATFS 0 +#if LV_USE_FS_FATFS + #define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*PNG decoder library*/ +#define LV_USE_PNG 0 + +/*BMP decoder library*/ +#define LV_USE_BMP 0 + +/* JPG + split JPG decoder library. + * Split JPG is a custom format optimized for embedded systems. */ +#define LV_USE_SJPG 0 + +/*GIF decoder library*/ +#define LV_USE_GIF 0 + +/*QR code library*/ +#define LV_USE_QRCODE 0 + +/*FreeType library*/ +#define LV_USE_FREETYPE 0 +#if LV_USE_FREETYPE + /*Memory used by FreeType to cache characters [bytes]*/ + #define LV_FREETYPE_CACHE_SIZE (64 * 1024) + + /*Let FreeType to use LVGL memory and file porting*/ + #define LV_FREETYPE_USE_LVGL_PORT 0 + + /* 1: bitmap cache use the sbit cache, 0:bitmap cache use the image cache. */ + /* sbit cache:it is much more memory efficient for small bitmaps(font size < 256) */ + /* if font size >= 256, must be configured as image cache */ + #define LV_FREETYPE_SBIT_CACHE 0 + + /* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. */ + /* (0:use system defaults) */ + #define LV_FREETYPE_CACHE_FT_FACES 4 + #define LV_FREETYPE_CACHE_FT_SIZES 4 +#endif + +/* Built-in TTF decoder */ +#define LV_USE_TINY_TTF 0 +#if LV_USE_TINY_TTF + /* Enable loading TTF data from files */ + #define LV_TINY_TTF_FILE_SUPPORT 0 +#endif + +/*Rlottie library*/ +#define LV_USE_RLOTTIE 0 + +/*FFmpeg library for image decoding and playing videos + *Supports all major image formats so do not enable other image decoder with it*/ +#define LV_USE_FFMPEG 0 +#if LV_USE_FFMPEG + /*Dump input information to stderr*/ + #define LV_FFMPEG_DUMP_FORMAT 0 +#endif + +/*----------- + * Others + *----------*/ + +/*1: Enable API to take snapshot for object*/ +#define LV_USE_SNAPSHOT 0 + +/*1: Enable Monkey test*/ +#define LV_USE_MONKEY 0 + +/*1: Enable grid navigation*/ +#define LV_USE_GRIDNAV 0 + +/*1: Enable lv_obj fragment*/ +#define LV_USE_FRAGMENT 0 + +/*1: Support using images as font in label or span widgets */ +#define LV_USE_IMGFONT 0 + +/*1: Enable a published subscriber based messaging system */ +#define LV_USE_MSG 0 + +/*1: Enable Pinyin input method*/ +/*Requires: lv_keyboard*/ +#define LV_USE_IME_PINYIN 0 +#if LV_USE_IME_PINYIN + /*1: Use default thesaurus*/ + /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesauruss*/ + #define LV_IME_PINYIN_USE_DEFAULT_DICT 1 + /*Set the maximum number of candidate panels that can be displayed*/ + /*This needs to be adjusted according to the size of the screen*/ + #define LV_IME_PINYIN_CAND_TEXT_NUM 6 + + /*Use 9 key input(k9)*/ + #define LV_IME_PINYIN_USE_K9_MODE 1 + #if LV_IME_PINYIN_USE_K9_MODE == 1 + #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3 + #endif // LV_IME_PINYIN_USE_K9_MODE +#endif + +/*================== +* EXAMPLES +*==================*/ + +/*Enable the examples to be built with the library*/ +#define LV_BUILD_EXAMPLES 0 + +/*=================== + * DEMO USAGE + ====================*/ + +/*Show some widget. It might be required to increase `LV_MEM_SIZE` */ +#define LV_USE_DEMO_WIDGETS 0 +#if LV_USE_DEMO_WIDGETS +#define LV_DEMO_WIDGETS_SLIDESHOW 0 +#endif + +/*Demonstrate the usage of encoder and keyboard*/ +#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0 + +/*Benchmark your system*/ +#define LV_USE_DEMO_BENCHMARK 0 +#if LV_USE_DEMO_BENCHMARK +/*Use RGB565A8 images with 16 bit color depth instead of ARGB8565*/ +#define LV_DEMO_BENCHMARK_RGB565A8 0 +#endif + +/*Stress test for LVGL*/ +#define LV_USE_DEMO_STRESS 0 + +/*Music player demo*/ +#define LV_USE_DEMO_MUSIC 0 +#if LV_USE_DEMO_MUSIC + #define LV_DEMO_MUSIC_SQUARE 0 + #define LV_DEMO_MUSIC_LANDSCAPE 0 + #define LV_DEMO_MUSIC_ROUND 0 + #define LV_DEMO_MUSIC_LARGE 0 + #define LV_DEMO_MUSIC_AUTO_PLAY 0 +#endif + +/*--END OF LV_CONF_H--*/ + +#endif /*LV_CONF_H*/ + +#endif /*End of "Content enable"*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/LICENCE.txt b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/LICENCE.txt new file mode 100644 index 0000000..f877abb --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/LICENCE.txt @@ -0,0 +1,8 @@ +MIT licence +Copyright (c) 2021 LVGL Kft + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Softwareâ€), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS ISâ€, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/README.md b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/README.md new file mode 100644 index 0000000..aea07a8 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/README.md @@ -0,0 +1,186 @@ +

LVGL - Light and Versatile Graphics Library

+ +

+ +

+ +

+LVGL provides everything you need to create an embedded GUI with easy-to-use graphical elements, beautiful visual effects and a low memory footprint. +

+ +

+Website · +Docs · +Forum · +Services · +Interactive examples +

+ + +**English** | [中文](./README_zh.md) | [Português do Brasil](./README_pt_BR.md) + + +--- + +#### Table of content +- [Overview](#overview) +- [Get started](#get-started) +- [Examples](#examples) +- [Services](#services) +- [Contributing](#contributing) + +## Overview +### Features +* Powerful [building blocks](https://docs.lvgl.io/master/widgets/index.html): buttons, charts, lists, sliders, images, etc. +* Advanced graphics engine: animations, anti-aliasing, opacity, smooth scrolling, blending modes, etc +* Supports [various input devices](https://docs.lvgl.io/master/overview/indev.html): touchscreen, mouse, keyboard, encoder, buttons, etc. +* Supports [multiple displays](https://docs.lvgl.io/master/overview/display.html) +* Hardware independent, can be use with any microcontroller and display +* Scalable to operate with little memory (64 kB Flash, 16 kB RAM) +* Multi-language support with UTF-8 handling, CJK, Bidirectional and Arabic script support +* Fully customizable graphical elements via [CSS-like styles](https://docs.lvgl.io/master/overview/style.html) +* Powerful layouts inspired by CSS: [Flexbox](https://docs.lvgl.io/master/layouts/flex.html) and [Grid](https://docs.lvgl.io/master/layouts/grid.html) +* OS, External memory and GPU are supported but not required. (built in support for STM32 DMA2D, SWM341 DMA2D, and NXP PXP and VGLite) +* Smooth rendering even with a [single frame buffer](https://docs.lvgl.io/master/porting/display.html) +* Written in C and compatible with C++ +* Micropython Binding exposes [LVGL API in Micropython](https://blog.lvgl.io/2019-02-20/micropython-bindings) +* [Simulator](https://docs.lvgl.io/master/get-started/platforms/pc-simulator.html) to develop on PC without embedded hardware +* 100+ simple [Examples](https://github.com/lvgl/lvgl/tree/master/examples) +* [Documentation](http://docs.lvgl.io/) and API references online and in PDF + +### Requirements +Basically, every modern controller (which is able to drive a display) is suitable to run LVGL. The minimal requirements are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name MinimalRecommended
Architecture16, 32 or 64 bit microcontroller or processor
Clock > 16 MHz > 48 MHz
Flash/ROM > 64 kB > 180 kB
Static RAM > 16 kB > 48 kB
Draw buffer > 1 × hor. res. pixels > 1/10 screen size
Compiler C99 or newer
+ +*Note that the memory usage might vary depending on the architecture, compiler and build options.* + +### Supported platforms +LVGL is completely platform independent and can be used with any MCU that fulfills the requirements. +Just to mention some platforms: +- NXP: Kinetis, LPC, iMX, iMX RT +- STM32F1, STM32F3, STM32F4, STM32F7, STM32L4, STM32L5, STM32H7 +- Microchip dsPIC33, PIC24, PIC32MX, PIC32MZ +- [Linux frame buffer](https://blog.lvgl.io/2018-01-03/linux_fb) (/dev/fb) +- [Raspberry Pi](https://github.com/lvgl/lv_port_linux_frame_buffer) +- [Espressif ESP32](https://github.com/lvgl/lv_port_esp32) +- [Infineon Aurix](https://github.com/lvgl/lv_port_aurix) +- Nordic NRF52 Bluetooth modules +- Quectel modems +- [SYNWIT SWM341](http://www.synwit.cn/) + +LVGL is also available as: +- [Arduino library](https://docs.lvgl.io/master/get-started/platforms/arduino.html) +- [PlatformIO package](https://registry.platformio.org/libraries/lvgl/lvgl) +- [Zephyr library](https://docs.zephyrproject.org/latest/reference/kconfig/CONFIG_LVGL.html) +- [ESP32 component](https://docs.lvgl.io/master/get-started/platforms/espressif.html) +- [NXP MCUXpresso component](https://www.nxp.com/design/software/embedded-software/lvgl-open-source-graphics-library:LITTLEVGL-OPEN-SOURCE-GRAPHICS-LIBRARY) +- [NuttX library](https://docs.lvgl.io/master/get-started/os/nuttx.html) +- [RT-Thread RTOS](https://docs.lvgl.io/master/get-started/os/rt-thread.html) + + +## Get started +This list shows the recommended way of learning the library: +1. Check the [Online demos](https://lvgl.io/demos) to see LVGL in action (3 minutes) +2. Read the [Introduction](https://docs.lvgl.io/master/intro/index.html) page of the documentation (5 minutes) +3. Get familiar with the basics on the [Quick overview](https://docs.lvgl.io/master/get-started/quick-overview.html) page (15 minutes) +4. Set up a [Simulator](https://docs.lvgl.io/master/get-started/platforms/pc-simulator.html) (10 minutes) +5. Try out some [Examples](https://github.com/lvgl/lvgl/tree/master/examples) +6. Port LVGL to a board. See the [Porting](https://docs.lvgl.io/master/porting/index.html) guide or check the ready to use [Projects](https://github.com/lvgl?q=lv_port_) +7. Read the [Overview](https://docs.lvgl.io/master/overview/index.html) page to get a better understanding of the library (2-3 hours) +8. Check the documentation of the [Widgets](https://docs.lvgl.io/master/widgets/index.html) to see their features and usage +9. If you have questions go to the [Forum](http://forum.lvgl.io/) +10. Read the [Contributing](https://docs.lvgl.io/master/CONTRIBUTING.html) guide to see how you can help to improve LVGL (15 minutes) + +## Examples + +For more examples see the [examples](https://github.com/lvgl/lvgl/tree/master/examples) folder. + +![LVGL button with label example](https://github.com/lvgl/lvgl/raw/master/docs/misc/btn_example.png) + +### C +```c +lv_obj_t * btn = lv_btn_create(lv_scr_act()); /*Add a button to the current screen*/ +lv_obj_set_pos(btn, 10, 10); /*Set its position*/ +lv_obj_set_size(btn, 100, 50); /*Set its size*/ +lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_CLICKED, NULL); /*Assign a callback to the button*/ + +lv_obj_t * label = lv_label_create(btn); /*Add a label to the button*/ +lv_label_set_text(label, "Button"); /*Set the labels text*/ +lv_obj_center(label); /*Align the label to the center*/ +... + +void btn_event_cb(lv_event_t * e) +{ + printf("Clicked\n"); +} +``` +### Micropython +Learn more about [Micropython](https://docs.lvgl.io/master/get-started/bindings/micropython.html). +```python +def btn_event_cb(e): + print("Clicked") + +# Create a Button and a Label +btn = lv.btn(lv.scr_act()) +btn.set_pos(10, 10) +btn.set_size(100, 50) +btn.add_event_cb(btn_event_cb, lv.EVENT.CLICKED, None) + +label = lv.label(btn) +label.set_text("Button") +label.center() +``` + +## Services +LVGL Kft was established to provide a solid background for LVGL library. We offer several type of services to help you in UI development: +- Graphics design +- UI implementation +- Consulting/Support + +For more information see https://lvgl.io/services +Feel free to contact us if you have any questions. + + +## Contributing +LVGL is an open project and contribution is very welcome. There are many ways to contribute from simply speaking about your project, through writing examples, improving the documentation, fixing bugs to hosting your own project under the LVGL organization. + +For a detailed description of contribution opportunities visit the [Contributing](https://docs.lvgl.io/master/CONTRIBUTING.html) section of the documentation. + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/README_pt_BR.md b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/README_pt_BR.md new file mode 100644 index 0000000..f62f0a0 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/README_pt_BR.md @@ -0,0 +1,206 @@ +

LVGL - Biblioteca gráfica leve e versátil

+

+ +

+

+ O LVGL fornece tudo o que você precisa para criar uma GUI incorporada com elementos gráficos fáceis de usar, belos efeitos visuais e um baixo consumo de memória. +

+

+ Site · + Documentação · + Fórum · + Serviços · + Exemplos interativos +

+ +[English](./README.md) | [中文](./README_zh.md) | **Português do Brasil** + +--- + +### Tabela de conteúdo + +- [Visão Geral](#visão-geral) +- [Iniciando](#iniciando) +- [Exemplos](#exemplos) +- [Serviços](#serviços) +- [Contribuindo](#contribuindo) + +## Visão Geral + +### Recursos +* Poderosos [widgets](https://docs.lvgl.io/master/widgets/index.html): botões, gráficos, listas, controles deslizantes (sliders), imagens, etc. +* Mecanismo gráfico avançado: animações, anti-aliasing, opacidade, rolagem suave, modos de mesclagem (blending modes), etc. +* Suporte à [vários dispositivos de entrada](https://docs.lvgl.io/master/overview/indev.html): tela sensível ao toque, mouse, teclado, codificador, botões, etc. +* Suporte à [vários monitores](https://docs.lvgl.io/master/overview/display.html) +* Pode ser usado com qualquer microcontrolador e display, independente do hardware +* Escalável para operar com pouca memória (64 kB Flash, 16 kB RAM) +* Suporte multilíngue com manipulação UTF-8, suporte ao alfabeto bidirecional, árabe e CJK (Chinês, Japonês e Coreano) +* Elementos gráficos totalmente personalizáveis por meio de [CSS](https://docs.lvgl.io/master/overview/style.html) +* Layouts poderosos inspirados em CSS: [Flexbox](https://docs.lvgl.io/master/layouts/flex.html) e [Grid](https://docs.lvgl.io/master/layouts/grid.html) +* SO, memória externa e GPU são suportados, mas não obrigatórios. (suporte integrado para STM32 DMA2D, SWM341 DMA2D e NXP PXP e VGLite) +* Renderização suave mesmo com um [buffer de quadro único](https://docs.lvgl.io/master/porting/display.html) (single frame buffer) +* Escrito em C e compatível com C++ +* Uso do LittlevGL com Micropython simplificado com [LVGL API in Micropython](https://blog.lvgl.io/2019-02-20/micropython-bindings) +* [Simulador](https://docs.lvgl.io/master/get-started/platforms/pc-simulator.html) para desenvolver no PC sem hardware embutido +* Mais de 100 [exemplos simples](https://github.com/lvgl/lvgl/tree/master/examples) +* [Documentação](http://docs.lvgl.io/) e referências de API online e em PDF + +### Requerimentos +Basicamente, todo controlador moderno (que é capaz de acionar um display) é adequado para executar LVGL. Os requisitos mínimos são: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Nome + + Minímo + + Recomendado +
+ Arquitetura + Microcontrolador ou processador de 16, 32 ou 64 bits
+ Clock + > 16 MHz> 48 MHz
+ Flash/ROM + > 64 kB> 180 kB
+ RAM estática + > 16 kB> 48 kB
+ Draw buffer + > 1 × hor. res. pixels> tamanho da tela de 1/10
+ Compilador + Padrão C99 ou mais recente
+ +*Observe que o uso de memória pode variar dependendo da arquitetura, do compilador e das opções de compilação.* + +### Plataformas suportadas +O LVGL é completamente independente de plataforma e pode ser usado com qualquer MCU que atenda aos requisitos. +Apenas para citar algumas plataformas: + +- NXP: Kinetis, LPC, iMX, iMX RT +- STM32F1, STM32F3, STM32F4, STM32F7, STM32L4, STM32L5, STM32H7 +- Microchip dsPIC33, PIC24, PIC32MX, PIC32MZ +- [Linux frame buffer](https://blog.lvgl.io/2018-01-03/linux_fb) (/dev/fb) +- [Raspberry Pi](http://www.vk3erw.com/index.php/16-software/63-raspberry-pi-official-7-touchscreen-and-littlevgl) +- [Espressif ESP32](https://github.com/lvgl/lv_port_esp32) +- [Infineon Aurix](https://github.com/lvgl/lv_port_aurix) +- Nordic NRF52 Bluetooth modules +- Quectel modems +- [SYNWIT SWM341](https://www.synwit.cn/) + +LVGL também está disponível para: +- [Arduino library](https://docs.lvgl.io/master/get-started/platforms/arduino.html) +- [PlatformIO package](https://registry.platformio.org/libraries/lvgl/lvgl) +- [Zephyr library](https://docs.zephyrproject.org/latest/reference/kconfig/CONFIG_LVGL.html) +- [ESP32 component](https://docs.lvgl.io/master/get-started/platforms/espressif.html) +- [NXP MCUXpresso component](https://www.nxp.com/design/software/embedded-software/lvgl-open-source-graphics-library:LITTLEVGL-OPEN-SOURCE-GRAPHICS-LIBRARY) +- [NuttX library](https://docs.lvgl.io/master/get-started/os/nuttx.html) +- [RT-Thread RTOS](https://docs.lvgl.io/master/get-started/os/rt-thread.html) + +## Iniciando +Esta lista mostra a maneira recomendada de aprender sobre a biblioteca: + +1. Confira as [demos on-line](https://lvgl.io/demos) para ver o LVGL em ação (3 minutos) +2. Leia a [introdução](https://docs.lvgl.io/master/intro/index.html) da documentação (5 minutos) +3. Familiarize-se com o básico da [Visão geral rápida](https://docs.lvgl.io/master/get-started/quick-overview.html) (15 minutos) +4. Configure um [simulador](https://docs.lvgl.io/master/get-started/platforms/pc-simulator.html) (10 minutos) +5. Experimente alguns [Exemplos](https://github.com/lvgl/lvgl/tree/master/examples) +6. Placa para porta LVGL. Veja o guia [porting](https://docs.lvgl.io/master/porting/index.html) ou verifique o pronto para usar [Projects](https://github.com/lvgl?q=lv_port_) +7. Leia a [visão geral](https://docs.lvgl.io/master/overview/index.html) para entender melhor a biblioteca (2-3 horas) +8. Verifique a documentação dos [widgets](https://docs.lvgl.io/master/widgets/index.html) para ver seus recursos e como utilizá-los +9. Se você tiver dúvidas, acesse o [fórum](http://forum.lvgl.io/) +10. Leia o guia de [contribuição](https://docs.lvgl.io/master/CONTRIBUTING.html) para ver como você pode ajudar a melhorar o LVGL (15 minutos) + +## Exemplos +Para mais exemplos, veja a pasta [examples](https://github.com/lvgl/lvgl/tree/master/examples). + +![Exemplo de botão LVGL com rótulo (label)](https://github.com/lvgl/lvgl/raw/master/docs/misc/btn_example.png) + +### C + +```c +lv_obj_t * button = lv_btn_create(lv_scr_act()); /* Adiciona um botão à tela atual */ +lv_obj_set_pos(button, 10, 10); /* Define uma posição ao botão na tela */ +lv_obj_set_size(button, 100, 50); /* Define o tamanho */ +lv_obj_add_event_cb(button, button_event_callback, LV_EVENT_CLICKED, NULL); /* Atribui um retorno de chamada (callback) */ + +lv_obj_t * label = lv_label_create(button); /* Adiciona um rótulo (label) */ +lv_label_set_text(label, "Clique aqui"); /* Define o texto do rótulo (label) */ +lv_obj_center(label); /* Alinha o texto ao centro */ +... + +void button_event_callback(lv_event_t * e) +{ + printf("Clicado\n"); +} +``` + +### Micropython +Saiba mais em [Micropython](https://docs.lvgl.io/master/get-started/bindings/micropython.html) + +```python +def button_event_callback(event): + print("Clicado") + +# Cria um botão e um rótulo (label) +button = lv.btn(lv.scr_act()) +button.set_pos(10, 10) +button.set_size(100, 50) +button.add_event_cb(button_event_callback, lv.EVENT.CLICKED, None) + +label = lv.label(button) +label.set_text("Cliquq aqui") +label.center() +``` + +## Serviços +O LVGL Kft foi estabelecido para fornecer uma base sólida para a biblioteca LVGL. Oferecemos vários tipos de serviços +para ajudá-lo no desenvolvimento da interface do usuário: + +- Design gráfico +- Implementação de IU +- Consultoria/Suporte + +Para mais informações, consulte [LVGL Serviços](https://lvgl.io/services). Sinta-se à vontade para entrar em contato +conosco se tiver alguma dúvida. + +## Contribuindo +O LVGL é um projeto aberto e sua contribuição é muito bem-vinda. Há muitas maneiras de contribuir, desde simplesmente +falando sobre seu projeto, escrevendo exemplos, melhorando a documentação, corrigindo bugs até hospedar seu próprio +projeto sob a organização LVGL. + +Para obter uma descrição detalhada das oportunidades de contribuição, visite a seção de [contribuição](https://docs.lvgl.io/master/CONTRIBUTING.html) da documentação. diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/README_zh.md b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/README_zh.md new file mode 100644 index 0000000..cac080d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/README_zh.md @@ -0,0 +1,193 @@ +

LVGL - Light and Versatile Graphics Library

+

LVGL - è½»é‡çº§é€šç”¨åž‹å›¾å½¢åº“

+ + + +

+ +

+

+LVGL是一个高度å¯è£å‰ªã€ä½Žèµ„æºå ç”¨ã€ç•Œé¢ç¾Žè§‚且易用的嵌入å¼ç³»ç»Ÿå›¾å½¢åº“ +

+ + +

+官网 · +文档 · +è®ºå› · +æœåŠ¡ · +例程 +

+ + +[English](./README.md) | **中文** | [Português do Brasil](./README_pt_BR.md) + + +--- + +#### 目录 +- [概况与总览](#概况与总览) +- [如何入门](#如何入门) +- [例程](#例程) +- [æœåŠ¡](#æœåŠ¡) +- [如何å‘社区贡献](#如何å‘社区贡献) + +## 概况与总览 +### 特性 +* 丰富且强大的模å—化[图形组件](https://docs.lvgl.io/master/widgets/index.html):按钮 (buttons)ã€å›¾è¡¨ (charts)ã€åˆ—表 (lists)ã€æ»‘åŠ¨æ¡ (sliders)ã€å›¾ç‰‡ (images) ç­‰ +* é«˜çº§çš„å›¾å½¢å¼•æ“Žï¼šåŠ¨ç”»ã€æŠ—é”¯é½¿ã€é€æ˜Žåº¦ã€å¹³æ»‘滚动ã€å›¾å±‚æ··åˆç­‰æ•ˆæžœ +* 支æŒå¤šç§[输入设备](https://docs.lvgl.io/master/overview/indev.html):触摸å±ã€ 键盘ã€ç¼–ç å™¨ã€æŒ‰é”®ç­‰ +* 支æŒ[多显示设备](https://docs.lvgl.io/master/overview/display.html) +* ä¸ä¾èµ–特定的硬件平å°ï¼Œå¯ä»¥åœ¨ä»»ä½•显示å±ä¸Šè¿è¡Œ +* é…ç½®å¯è£å‰ªï¼ˆæœ€ä½Žèµ„æºå ç”¨ï¼š64 kB Flash,16 kB RAM) +* 基于UTF-8çš„å¤šè¯­ç§æ”¯æŒï¼Œä¾‹å¦‚ä¸­æ–‡ã€æ—¥æ–‡ã€éŸ©æ–‡ã€é˜¿æ‹‰ä¼¯æ–‡ç­‰ +* å¯ä»¥é€šè¿‡[ç±»CSS](https://docs.lvgl.io/master/overview/style.html)çš„æ–¹å¼æ¥è®¾è®¡ã€å¸ƒå±€å›¾å½¢ç•Œé¢ï¼ˆä¾‹å¦‚:[Flexbox](https://docs.lvgl.io/master/layouts/flex.html)ã€[Grid](https://docs.lvgl.io/master/layouts/grid.html)) +* æ”¯æŒæ“作系统ã€å¤–置内存ã€ä»¥åŠç¡¬ä»¶åŠ é€Ÿï¼ˆLVGL已内建支æŒSTM32 DMA2Dã€SWM341 DMA2Dã€NXP PXPå’ŒVGLite) +* å³ä¾¿ä»…有[å•缓冲区(frame buffer)](https://docs.lvgl.io/master/porting/display.html)的情况下,也å¯ä¿è¯æ¸²æŸ“如ä¸èˆ¬é¡ºæ»‘ +* 全部由C编写完æˆï¼Œå¹¶æ”¯æŒC++调用 +* 支æŒMicropython编程,å‚è§ï¼š[LVGL API in Micropython](https://blog.lvgl.io/2019-02-20/micropython-bindings) +* 支æŒ[模拟器](https://docs.lvgl.io/master/get-started/platforms/pc-simulator.html)仿真,å¯ä»¥æ— ç¡¬ä»¶ä¾æ‰˜è¿›è¡Œå¼€å‘ +* 丰富详实的[例程](https://github.com/lvgl/lvgl/tree/master/examples) +* 详尽的[文档](http://docs.lvgl.io/)以åŠAPIå‚考手册,å¯çº¿ä¸ŠæŸ¥é˜…或å¯ä¸‹è½½ä¸ºPDFæ ¼å¼ + +### ç¡¬ä»¶è¦æ±‚ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
è¦æ±‚ æœ€ä½Žè¦æ±‚å»ºè®®è¦æ±‚
æž¶æž„16ã€32ã€64ä½å¾®æŽ§åˆ¶å™¨æˆ–微处ç†å™¨
æ—¶é’Ÿ > 16 MHz > 48 MHz
Flash/ROM > 64 kB > 180 kB
Static RAM > 16 kB > 48 kB
Draw buffer > 1 × hor. res. pixels > 1/10å±å¹•大å°
编译器 C99或更新
+ +*注æ„:资æºå ç”¨æƒ…况与具体硬件平å°ã€ç¼–译器等因素有关,上表中仅给出å‚考值* + +### å·²ç»æ”¯æŒçš„å¹³å° +LVGL本身并ä¸ä¾èµ–特定的硬件平å°ï¼Œä»»ä½•满足LVGL硬件é…ç½®è¦æ±‚的微控制器å‡å¯è¿è¡ŒLVGL。 +如下仅列举其中一部分: + +- NXP: Kinetis, LPC, iMX, iMX RT +- STM32F1, STM32F3, STM32F4, STM32F7, STM32L4, STM32L5, STM32H7 +- Microchip dsPIC33, PIC24, PIC32MX, PIC32MZ +- [Linux frame buffer](https://blog.lvgl.io/2018-01-03/linux_fb) (/dev/fb) +- [Raspberry Pi](http://www.vk3erw.com/index.php/16-software/63-raspberry-pi-official-7-touchscreen-and-littlevgl) +- [Espressif ESP32](https://github.com/lvgl/lv_port_esp32) +- [Infineon Aurix](https://github.com/lvgl/lv_port_aurix) +- Nordic NRF52 Bluetooth modules +- Quectel modems +- [SYNWIT SWM341](https://www.synwit.cn/) + +LVGL也支æŒï¼š +- [Arduino library](https://docs.lvgl.io/master/get-started/platforms/arduino.html) +- [PlatformIO package](https://platformio.org/lib/show/12440/lvgl) +- [Zephyr library](https://docs.zephyrproject.org/latest/reference/kconfig/CONFIG_LVGL.html) +- [ESP32 component](https://docs.lvgl.io/master/get-started/platforms/espressif.html) +- [NXP MCUXpresso component](https://www.nxp.com/design/software/embedded-software/lvgl-open-source-graphics-library:LITTLEVGL-OPEN-SOURCE-GRAPHICS-LIBRARY) +- [NuttX library](https://docs.lvgl.io/master/get-started/os/nuttx.html) +- [RT-Thread RTOS](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/packages-manual/lvgl-docs/introduction) + + +## 如何入门 +è¯·æŒ‰ç…§å¦‚ä¸‹é¡ºåºæ¥å­¦ä¹ LVGL: +1. 使用[网页在线例程](https://lvgl.io/demos)æ¥ä½“验LVGL(3分钟) +2. 阅读文档[简介](https://docs.lvgl.io/master/intro/index.html)章节æ¥åˆæ­¥äº†è§£LVGL(5分钟) +3. 冿¥é˜…读一下文档快速[快速概览](https://docs.lvgl.io/master/get-started/quick-overview.html)章节æ¥äº†è§£LVGL的基本知识(15分钟) +4. 学习如何使用[模拟器](https://docs.lvgl.io/master/get-started/platforms/pc-simulator.html)æ¥åœ¨ç”µè„‘上仿真LVGL(10分钟) +5. 试ç€åŠ¨æ‰‹å®žè·µä¸€äº›[例程](https://github.com/lvgl/lvgl/tree/master/examples) +6. å‚考[ç§»æ¤æŒ‡å—](https://docs.lvgl.io/master/porting/index.html)å°è¯•å°†LVGLç§»æ¤åˆ°ä¸€å—开呿¿ä¸Šï¼ŒLVGLä¹Ÿå·²ç»æä¾›äº†ä¸€äº›ç§»æ¤å¥½çš„[工程](https://github.com/lvgl?q=lv_port_) +7. 仔细阅读文档[总览](https://docs.lvgl.io/master/overview/index.html)ç« èŠ‚æ¥æ›´åŠ æ·±å…¥çš„äº†è§£å’Œç†Ÿæ‚‰LVGL(2-3å°æ—¶ï¼‰ +8. æµè§ˆæ–‡æ¡£[组件(Widgets)](https://docs.lvgl.io/master/widgets/index.html)章节æ¥äº†è§£å¦‚何使用它们 +9. 如果你有问题å¯ä»¥åˆ°LVGL[论å›](http://forum.lvgl.io/)æé—® +10. 阅读文档[如何å‘社区贡献](https://docs.lvgl.io/master/CONTRIBUTING.html)章节æ¥çœ‹çœ‹ä½ èƒ½å¸®LVGL社区åšäº›ä»€ä¹ˆï¼Œä»¥ä¿ƒè¿›LVGL软件质é‡çš„䏿–­æé«˜ï¼ˆ15分钟) + +## 例程 + +更多例程请å‚è§ [examples](https://github.com/lvgl/lvgl/tree/master/examples) 文件夹。 + +![LVGL button with label example](https://github.com/lvgl/lvgl/raw/master/docs/misc/btn_example.png) + +### C +```c +lv_obj_t * btn = lv_btn_create(lv_scr_act()); /*Add a button to the current screen*/ +lv_obj_set_pos(btn, 10, 10); /*Set its position*/ +lv_obj_set_size(btn, 100, 50); /*Set its size*/ +lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_CLICKED, NULL); /*Assign a callback to the button*/ + +lv_obj_t * label = lv_label_create(btn); /*Add a label to the button*/ +lv_label_set_text(label, "Button"); /*Set the labels text*/ +lv_obj_center(label); /*Align the label to the center*/ +... + +void btn_event_cb(lv_event_t * e) +{ + printf("Clicked\n"); +} +``` +### Micropython +更多信æ¯è¯·åˆ° [Micropython官网](https://docs.lvgl.io/master/get-started/bindings/micropython.html) 查询. +```python +def btn_event_cb(e): + print("Clicked") + +# Create a Button and a Label +btn = lv.btn(lv.scr_act()) +btn.set_pos(10, 10) +btn.set_size(100, 50) +btn.add_event_cb(btn_event_cb, lv.EVENT.CLICKED, None) + +label = lv.label(btn) +label.set_text("Button") +label.center() +``` + +## æœåŠ¡ +LVGL 责任有é™å…¬å¸æˆç«‹çš„目的是为了给用户使用LVGL图形库æä¾›é¢å¤–的技术支æŒï¼Œæˆ‘们致力于æä¾›ä»¥ä¸‹æœåŠ¡ï¼š + +- 图形设计 +- UI设计 +- æŠ€æœ¯å’¨è¯¢ä»¥åŠæŠ€æœ¯æ”¯æŒ + +更多信æ¯è¯·å‚è§ https://lvgl.io/services ï¼Œå¦‚æžœæœ‰ä»»ä½•é—®é¢˜è¯·éšæ—¶è”系我们。 + + +## 如何å‘社区贡献 +LVGL是一个开æºé¡¹ç›®ï¼Œéžå¸¸æ¬¢è¿Žæ‚¨å‚ä¸Žåˆ°ç¤¾åŒºè´¡çŒ®å½“ä¸­ã€‚æ‚¨æœ‰å¾ˆå¤šç§æ–¹å¼æ¥ä¸ºæé«˜LVGL贡献您的一份力é‡ï¼ŒåŒ…括但ä¸é™äºŽï¼š + +- 介ç»ä½ åŸºäºŽLVGLè®¾è®¡çš„ä½œå“æˆ–项目 +- 写一些例程 +- 修改以åŠå®Œå–„文档 +- ä¿®å¤bug + +请å‚è§æ–‡æ¡£[如何å‘社区贡献](https://docs.lvgl.io/master/CONTRIBUTING.html)章节æ¥èŽ·å–æ›´å¤šä¿¡æ¯ã€‚ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/lv_conf_template.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/lv_conf_template.h new file mode 100644 index 0000000..3d087f0 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/lv_conf_template.h @@ -0,0 +1,759 @@ +/** + * @file lv_conf.h + * Configuration file for v8.3.3 + */ + +/* + * Copy this file as `lv_conf.h` + * 1. simply next to the `lvgl` folder + * 2. or any other places and + * - define `LV_CONF_INCLUDE_SIMPLE` + * - add the path as include path + */ + +/* clang-format off */ +#if 0 /*Set it to "1" to enable content*/ + +#ifndef LV_CONF_H +#define LV_CONF_H + +#include + +/*==================== + COLOR SETTINGS + *====================*/ + +/*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/ +#define LV_COLOR_DEPTH 16 + +/*Swap the 2 bytes of RGB565 color. Useful if the display has an 8-bit interface (e.g. SPI)*/ +#define LV_COLOR_16_SWAP 0 + +/*Enable features to draw on transparent background. + *It's required if opa, and transform_* style properties are used. + *Can be also used if the UI is above another layer, e.g. an OSD menu or video player.*/ +#define LV_COLOR_SCREEN_TRANSP 0 + +/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. + * 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */ +#define LV_COLOR_MIX_ROUND_OFS 0 + +/*Images pixels with this color will not be drawn if they are chroma keyed)*/ +#define LV_COLOR_CHROMA_KEY lv_color_hex(0x00ff00) /*pure green*/ + +/*========================= + MEMORY SETTINGS + *=========================*/ + +/*1: use custom malloc/free, 0: use the built-in `lv_mem_alloc()` and `lv_mem_free()`*/ +#define LV_MEM_CUSTOM 0 +#if LV_MEM_CUSTOM == 0 + /*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/ + #define LV_MEM_SIZE (48U * 1024U) /*[bytes]*/ + + /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/ + #define LV_MEM_ADR 0 /*0: unused*/ + /*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/ + #if LV_MEM_ADR == 0 + #undef LV_MEM_POOL_INCLUDE + #undef LV_MEM_POOL_ALLOC + #endif + +#else /*LV_MEM_CUSTOM*/ + #define LV_MEM_CUSTOM_INCLUDE /*Header for the dynamic memory function*/ + #define LV_MEM_CUSTOM_ALLOC malloc + #define LV_MEM_CUSTOM_FREE free + #define LV_MEM_CUSTOM_REALLOC realloc +#endif /*LV_MEM_CUSTOM*/ + +/*Number of the intermediate memory buffer used during rendering and other internal processing mechanisms. + *You will see an error log message if there wasn't enough buffers. */ +#define LV_MEM_BUF_MAX_NUM 16 + +/*Use the standard `memcpy` and `memset` instead of LVGL's own functions. (Might or might not be faster).*/ +#define LV_MEMCPY_MEMSET_STD 0 + +/*==================== + HAL SETTINGS + *====================*/ + +/*Default display refresh period. LVG will redraw changed areas with this period time*/ +#define LV_DISP_DEF_REFR_PERIOD 30 /*[ms]*/ + +/*Input device read period in milliseconds*/ +#define LV_INDEV_DEF_READ_PERIOD 30 /*[ms]*/ + +/*Use a custom tick source that tells the elapsed time in milliseconds. + *It removes the need to manually update the tick with `lv_tick_inc()`)*/ +#define LV_TICK_CUSTOM 0 +#if LV_TICK_CUSTOM + #define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/ + #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/ +#endif /*LV_TICK_CUSTOM*/ + +/*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. + *(Not so important, you can adjust it to modify default sizes and spaces)*/ +#define LV_DPI_DEF 130 /*[px/inch]*/ + +/*======================= + * FEATURE CONFIGURATION + *=======================*/ + +/*------------- + * Drawing + *-----------*/ + +/*Enable complex draw engine. + *Required to draw shadow, gradient, rounded corners, circles, arc, skew lines, image transformations or any masks*/ +#define LV_DRAW_COMPLEX 1 +#if LV_DRAW_COMPLEX != 0 + + /*Allow buffering some shadow calculation. + *LV_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius` + *Caching has LV_SHADOW_CACHE_SIZE^2 RAM cost*/ + #define LV_SHADOW_CACHE_SIZE 0 + + /* Set number of maximally cached circle data. + * The circumference of 1/4 circle are saved for anti-aliasing + * radius * 4 bytes are used per circle (the most often used radiuses are saved) + * 0: to disable caching */ + #define LV_CIRCLE_CACHE_SIZE 4 +#endif /*LV_DRAW_COMPLEX*/ + +/** + * "Simple layers" are used when a widget has `style_opa < 255` to buffer the widget into a layer + * and blend it as an image with the given opacity. + * Note that `bg_opa`, `text_opa` etc don't require buffering into layer) + * The widget can be buffered in smaller chunks to avoid using large buffers. + * + * - LV_LAYER_SIMPLE_BUF_SIZE: [bytes] the optimal target buffer size. LVGL will try to allocate it + * - LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE: [bytes] used if `LV_LAYER_SIMPLE_BUF_SIZE` couldn't be allocated. + * + * Both buffer sizes are in bytes. + * "Transformed layers" (where transform_angle/zoom properties are used) use larger buffers + * and can't be drawn in chunks. So these settings affects only widgets with opacity. + */ +#define LV_LAYER_SIMPLE_BUF_SIZE (24 * 1024) +#define LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE (3 * 1024) + +/*Default image cache size. Image caching keeps the images opened. + *If only the built-in image formats are used there is no real advantage of caching. (I.e. if no new image decoder is added) + *With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images. + *However the opened images might consume additional RAM. + *0: to disable caching*/ +#define LV_IMG_CACHE_DEF_SIZE 0 + +/*Number of stops allowed per gradient. Increase this to allow more stops. + *This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/ +#define LV_GRADIENT_MAX_STOPS 2 + +/*Default gradient buffer size. + *When LVGL calculates the gradient "maps" it can save them into a cache to avoid calculating them again. + *LV_GRAD_CACHE_DEF_SIZE sets the size of this cache in bytes. + *If the cache is too small the map will be allocated only while it's required for the drawing. + *0 mean no caching.*/ +#define LV_GRAD_CACHE_DEF_SIZE 0 + +/*Allow dithering the gradients (to achieve visual smooth color gradients on limited color depth display) + *LV_DITHER_GRADIENT implies allocating one or two more lines of the object's rendering surface + *The increase in memory consumption is (32 bits * object width) plus 24 bits * object width if using error diffusion */ +#define LV_DITHER_GRADIENT 0 +#if LV_DITHER_GRADIENT + /*Add support for error diffusion dithering. + *Error diffusion dithering gets a much better visual result, but implies more CPU consumption and memory when drawing. + *The increase in memory consumption is (24 bits * object's width)*/ + #define LV_DITHER_ERROR_DIFFUSION 0 +#endif + +/*Maximum buffer size to allocate for rotation. + *Only used if software rotation is enabled in the display driver.*/ +#define LV_DISP_ROT_MAX_BUF (10*1024) + +/*------------- + * GPU + *-----------*/ + +/*Use Arm's 2D acceleration library Arm-2D */ +#define LV_USE_GPU_ARM2D 0 + +/*Use STM32's DMA2D (aka Chrom Art) GPU*/ +#define LV_USE_GPU_STM32_DMA2D 0 +#if LV_USE_GPU_STM32_DMA2D + /*Must be defined to include path of CMSIS header of target processor + e.g. "stm32f769xx.h" or "stm32f429xx.h"*/ + #define LV_GPU_DMA2D_CMSIS_INCLUDE +#endif + +/*Use SWM341's DMA2D GPU*/ +#define LV_USE_GPU_SWM341_DMA2D 0 +#if LV_USE_GPU_SWM341_DMA2D + #define LV_GPU_SWM341_DMA2D_INCLUDE "SWM341.h" +#endif + +/*Use NXP's PXP GPU iMX RTxxx platforms*/ +#define LV_USE_GPU_NXP_PXP 0 +#if LV_USE_GPU_NXP_PXP + /*1: Add default bare metal and FreeRTOS interrupt handling routines for PXP (lv_gpu_nxp_pxp_osa.c) + * and call lv_gpu_nxp_pxp_init() automatically during lv_init(). Note that symbol SDK_OS_FREE_RTOS + * has to be defined in order to use FreeRTOS OSA, otherwise bare-metal implementation is selected. + *0: lv_gpu_nxp_pxp_init() has to be called manually before lv_init() + */ + #define LV_USE_GPU_NXP_PXP_AUTO_INIT 0 +#endif + +/*Use NXP's VG-Lite GPU iMX RTxxx platforms*/ +#define LV_USE_GPU_NXP_VG_LITE 0 + +/*Use SDL renderer API*/ +#define LV_USE_GPU_SDL 0 +#if LV_USE_GPU_SDL + #define LV_GPU_SDL_INCLUDE_PATH + /*Texture cache size, 8MB by default*/ + #define LV_GPU_SDL_LRU_SIZE (1024 * 1024 * 8) + /*Custom blend mode for mask drawing, disable if you need to link with older SDL2 lib*/ + #define LV_GPU_SDL_CUSTOM_BLEND_MODE (SDL_VERSION_ATLEAST(2, 0, 6)) +#endif + +/*------------- + * Logging + *-----------*/ + +/*Enable the log module*/ +#define LV_USE_LOG 0 +#if LV_USE_LOG + + /*How important log should be added: + *LV_LOG_LEVEL_TRACE A lot of logs to give detailed information + *LV_LOG_LEVEL_INFO Log important events + *LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem + *LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail + *LV_LOG_LEVEL_USER Only logs added by the user + *LV_LOG_LEVEL_NONE Do not log anything*/ + #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN + + /*1: Print the log with 'printf'; + *0: User need to register a callback with `lv_log_register_print_cb()`*/ + #define LV_LOG_PRINTF 0 + + /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/ + #define LV_LOG_TRACE_MEM 1 + #define LV_LOG_TRACE_TIMER 1 + #define LV_LOG_TRACE_INDEV 1 + #define LV_LOG_TRACE_DISP_REFR 1 + #define LV_LOG_TRACE_EVENT 1 + #define LV_LOG_TRACE_OBJ_CREATE 1 + #define LV_LOG_TRACE_LAYOUT 1 + #define LV_LOG_TRACE_ANIM 1 + +#endif /*LV_USE_LOG*/ + +/*------------- + * Asserts + *-----------*/ + +/*Enable asserts if an operation is failed or an invalid data is found. + *If LV_USE_LOG is enabled an error message will be printed on failure*/ +#define LV_USE_ASSERT_NULL 1 /*Check if the parameter is NULL. (Very fast, recommended)*/ +#define LV_USE_ASSERT_MALLOC 1 /*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/ +#define LV_USE_ASSERT_STYLE 0 /*Check if the styles are properly initialized. (Very fast, recommended)*/ +#define LV_USE_ASSERT_MEM_INTEGRITY 0 /*Check the integrity of `lv_mem` after critical operations. (Slow)*/ +#define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/ + +/*Add a custom handler when assert happens e.g. to restart the MCU*/ +#define LV_ASSERT_HANDLER_INCLUDE +#define LV_ASSERT_HANDLER while(1); /*Halt by default*/ + +/*------------- + * Others + *-----------*/ + +/*1: Show CPU usage and FPS count*/ +#define LV_USE_PERF_MONITOR 0 +#if LV_USE_PERF_MONITOR + #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT +#endif + +/*1: Show the used memory and the memory fragmentation + * Requires LV_MEM_CUSTOM = 0*/ +#define LV_USE_MEM_MONITOR 0 +#if LV_USE_MEM_MONITOR + #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT +#endif + +/*1: Draw random colored rectangles over the redrawn areas*/ +#define LV_USE_REFR_DEBUG 0 + +/*Change the built in (v)snprintf functions*/ +#define LV_SPRINTF_CUSTOM 0 +#if LV_SPRINTF_CUSTOM + #define LV_SPRINTF_INCLUDE + #define lv_snprintf snprintf + #define lv_vsnprintf vsnprintf +#else /*LV_SPRINTF_CUSTOM*/ + #define LV_SPRINTF_USE_FLOAT 0 +#endif /*LV_SPRINTF_CUSTOM*/ + +#define LV_USE_USER_DATA 1 + +/*Garbage Collector settings + *Used if lvgl is bound to higher level language and the memory is managed by that language*/ +#define LV_ENABLE_GC 0 +#if LV_ENABLE_GC != 0 + #define LV_GC_INCLUDE "gc.h" /*Include Garbage Collector related things*/ +#endif /*LV_ENABLE_GC*/ + +/*===================== + * COMPILER SETTINGS + *====================*/ + +/*For big endian systems set to 1*/ +#define LV_BIG_ENDIAN_SYSTEM 0 + +/*Define a custom attribute to `lv_tick_inc` function*/ +#define LV_ATTRIBUTE_TICK_INC + +/*Define a custom attribute to `lv_timer_handler` function*/ +#define LV_ATTRIBUTE_TIMER_HANDLER + +/*Define a custom attribute to `lv_disp_flush_ready` function*/ +#define LV_ATTRIBUTE_FLUSH_READY + +/*Required alignment size for buffers*/ +#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1 + +/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default). + * E.g. __attribute__((aligned(4)))*/ +#define LV_ATTRIBUTE_MEM_ALIGN + +/*Attribute to mark large constant arrays for example font's bitmaps*/ +#define LV_ATTRIBUTE_LARGE_CONST + +/*Compiler prefix for a big array declaration in RAM*/ +#define LV_ATTRIBUTE_LARGE_RAM_ARRAY + +/*Place performance critical functions into a faster memory (e.g RAM)*/ +#define LV_ATTRIBUTE_FAST_MEM + +/*Prefix variables that are used in GPU accelerated operations, often these need to be placed in RAM sections that are DMA accessible*/ +#define LV_ATTRIBUTE_DMA + +/*Export integer constant to binding. This macro is used with constants in the form of LV_ that + *should also appear on LVGL binding API such as Micropython.*/ +#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /*The default value just prevents GCC warning*/ + +/*Extend the default -32k..32k coordinate range to -4M..4M by using int32_t for coordinates instead of int16_t*/ +#define LV_USE_LARGE_COORD 0 + +/*================== + * FONT USAGE + *===================*/ + +/*Montserrat fonts with ASCII range and some symbols using bpp = 4 + *https://fonts.google.com/specimen/Montserrat*/ +#define LV_FONT_MONTSERRAT_8 0 +#define LV_FONT_MONTSERRAT_10 0 +#define LV_FONT_MONTSERRAT_12 0 +#define LV_FONT_MONTSERRAT_14 1 +#define LV_FONT_MONTSERRAT_16 0 +#define LV_FONT_MONTSERRAT_18 0 +#define LV_FONT_MONTSERRAT_20 0 +#define LV_FONT_MONTSERRAT_22 0 +#define LV_FONT_MONTSERRAT_24 0 +#define LV_FONT_MONTSERRAT_26 0 +#define LV_FONT_MONTSERRAT_28 0 +#define LV_FONT_MONTSERRAT_30 0 +#define LV_FONT_MONTSERRAT_32 0 +#define LV_FONT_MONTSERRAT_34 0 +#define LV_FONT_MONTSERRAT_36 0 +#define LV_FONT_MONTSERRAT_38 0 +#define LV_FONT_MONTSERRAT_40 0 +#define LV_FONT_MONTSERRAT_42 0 +#define LV_FONT_MONTSERRAT_44 0 +#define LV_FONT_MONTSERRAT_46 0 +#define LV_FONT_MONTSERRAT_48 0 + +/*Demonstrate special features*/ +#define LV_FONT_MONTSERRAT_12_SUBPX 0 +#define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /*bpp = 3*/ +#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /*Hebrew, Arabic, Persian letters and all their forms*/ +#define LV_FONT_SIMSUN_16_CJK 0 /*1000 most common CJK radicals*/ + +/*Pixel perfect monospace fonts*/ +#define LV_FONT_UNSCII_8 0 +#define LV_FONT_UNSCII_16 0 + +/*Optionally declare custom fonts here. + *You can use these fonts as default font too and they will be available globally. + *E.g. #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/ +#define LV_FONT_CUSTOM_DECLARE + +/*Always set a default font*/ +#define LV_FONT_DEFAULT &lv_font_montserrat_14 + +/*Enable handling large font and/or fonts with a lot of characters. + *The limit depends on the font size, font face and bpp. + *Compiler error will be triggered if a font needs it.*/ +#define LV_FONT_FMT_TXT_LARGE 0 + +/*Enables/disables support for compressed fonts.*/ +#define LV_USE_FONT_COMPRESSED 0 + +/*Enable subpixel rendering*/ +#define LV_USE_FONT_SUBPX 0 +#if LV_USE_FONT_SUBPX + /*Set the pixel order of the display. Physical order of RGB channels. Doesn't matter with "normal" fonts.*/ + #define LV_FONT_SUBPX_BGR 0 /*0: RGB; 1:BGR order*/ +#endif + +/*Enable drawing placeholders when glyph dsc is not found*/ +#define LV_USE_FONT_PLACEHOLDER 1 + +/*================= + * TEXT SETTINGS + *=================*/ + +/** + * Select a character encoding for strings. + * Your IDE or editor should have the same character encoding + * - LV_TXT_ENC_UTF8 + * - LV_TXT_ENC_ASCII + */ +#define LV_TXT_ENC LV_TXT_ENC_UTF8 + +/*Can break (wrap) texts on these chars*/ +#define LV_TXT_BREAK_CHARS " ,.;:-_" + +/*If a word is at least this long, will break wherever "prettiest" + *To disable, set to a value <= 0*/ +#define LV_TXT_LINE_BREAK_LONG_LEN 0 + +/*Minimum number of characters in a long word to put on a line before a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 + +/*Minimum number of characters in a long word to put on a line after a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 + +/*The control character to use for signalling text recoloring.*/ +#define LV_TXT_COLOR_CMD "#" + +/*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts. + *The direction will be processed according to the Unicode Bidirectional Algorithm: + *https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/ +#define LV_USE_BIDI 0 +#if LV_USE_BIDI + /*Set the default direction. Supported values: + *`LV_BASE_DIR_LTR` Left-to-Right + *`LV_BASE_DIR_RTL` Right-to-Left + *`LV_BASE_DIR_AUTO` detect texts base direction*/ + #define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO +#endif + +/*Enable Arabic/Persian processing + *In these languages characters should be replaced with an other form based on their position in the text*/ +#define LV_USE_ARABIC_PERSIAN_CHARS 0 + +/*================== + * WIDGET USAGE + *================*/ + +/*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/ + +#define LV_USE_ARC 1 + +#define LV_USE_BAR 1 + +#define LV_USE_BTN 1 + +#define LV_USE_BTNMATRIX 1 + +#define LV_USE_CANVAS 1 + +#define LV_USE_CHECKBOX 1 + +#define LV_USE_DROPDOWN 1 /*Requires: lv_label*/ + +#define LV_USE_IMG 1 /*Requires: lv_label*/ + +#define LV_USE_LABEL 1 +#if LV_USE_LABEL + #define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/ + #define LV_LABEL_LONG_TXT_HINT 1 /*Store some extra info in labels to speed up drawing of very long texts*/ +#endif + +#define LV_USE_LINE 1 + +#define LV_USE_ROLLER 1 /*Requires: lv_label*/ +#if LV_USE_ROLLER + #define LV_ROLLER_INF_PAGES 7 /*Number of extra "pages" when the roller is infinite*/ +#endif + +#define LV_USE_SLIDER 1 /*Requires: lv_bar*/ + +#define LV_USE_SWITCH 1 + +#define LV_USE_TEXTAREA 1 /*Requires: lv_label*/ +#if LV_USE_TEXTAREA != 0 + #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ +#endif + +#define LV_USE_TABLE 1 + +/*================== + * EXTRA COMPONENTS + *==================*/ + +/*----------- + * Widgets + *----------*/ +#define LV_USE_ANIMIMG 1 + +#define LV_USE_CALENDAR 1 +#if LV_USE_CALENDAR + #define LV_CALENDAR_WEEK_STARTS_MONDAY 0 + #if LV_CALENDAR_WEEK_STARTS_MONDAY + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"} + #else + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"} + #endif + + #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} + #define LV_USE_CALENDAR_HEADER_ARROW 1 + #define LV_USE_CALENDAR_HEADER_DROPDOWN 1 +#endif /*LV_USE_CALENDAR*/ + +#define LV_USE_CHART 1 + +#define LV_USE_COLORWHEEL 1 + +#define LV_USE_IMGBTN 1 + +#define LV_USE_KEYBOARD 1 + +#define LV_USE_LED 1 + +#define LV_USE_LIST 1 + +#define LV_USE_MENU 1 + +#define LV_USE_METER 1 + +#define LV_USE_MSGBOX 1 + +#define LV_USE_SPAN 1 +#if LV_USE_SPAN + /*A line text can contain maximum num of span descriptor */ + #define LV_SPAN_SNIPPET_STACK_SIZE 64 +#endif + +#define LV_USE_SPINBOX 1 + +#define LV_USE_SPINNER 1 + +#define LV_USE_TABVIEW 1 + +#define LV_USE_TILEVIEW 1 + +#define LV_USE_WIN 1 + +/*----------- + * Themes + *----------*/ + +/*A simple, impressive and very complete theme*/ +#define LV_USE_THEME_DEFAULT 1 +#if LV_USE_THEME_DEFAULT + + /*0: Light mode; 1: Dark mode*/ + #define LV_THEME_DEFAULT_DARK 0 + + /*1: Enable grow on press*/ + #define LV_THEME_DEFAULT_GROW 1 + + /*Default transition time in [ms]*/ + #define LV_THEME_DEFAULT_TRANSITION_TIME 80 +#endif /*LV_USE_THEME_DEFAULT*/ + +/*A very simple theme that is a good starting point for a custom theme*/ +#define LV_USE_THEME_BASIC 1 + +/*A theme designed for monochrome displays*/ +#define LV_USE_THEME_MONO 1 + +/*----------- + * Layouts + *----------*/ + +/*A layout similar to Flexbox in CSS.*/ +#define LV_USE_FLEX 1 + +/*A layout similar to Grid in CSS.*/ +#define LV_USE_GRID 1 + +/*--------------------- + * 3rd party libraries + *--------------------*/ + +/*File system interfaces for common APIs */ + +/*API for fopen, fread, etc*/ +#define LV_USE_FS_STDIO 0 +#if LV_USE_FS_STDIO + #define LV_FS_STDIO_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for open, read, etc*/ +#define LV_USE_FS_POSIX 0 +#if LV_USE_FS_POSIX + #define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for CreateFile, ReadFile, etc*/ +#define LV_USE_FS_WIN32 0 +#if LV_USE_FS_WIN32 + #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/ +#define LV_USE_FS_FATFS 0 +#if LV_USE_FS_FATFS + #define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*PNG decoder library*/ +#define LV_USE_PNG 0 + +/*BMP decoder library*/ +#define LV_USE_BMP 0 + +/* JPG + split JPG decoder library. + * Split JPG is a custom format optimized for embedded systems. */ +#define LV_USE_SJPG 0 + +/*GIF decoder library*/ +#define LV_USE_GIF 0 + +/*QR code library*/ +#define LV_USE_QRCODE 0 + +/*FreeType library*/ +#define LV_USE_FREETYPE 0 +#if LV_USE_FREETYPE + /*Memory used by FreeType to cache characters [bytes] (-1: no caching)*/ + #define LV_FREETYPE_CACHE_SIZE (16 * 1024) + #if LV_FREETYPE_CACHE_SIZE >= 0 + /* 1: bitmap cache use the sbit cache, 0:bitmap cache use the image cache. */ + /* sbit cache:it is much more memory efficient for small bitmaps(font size < 256) */ + /* if font size >= 256, must be configured as image cache */ + #define LV_FREETYPE_SBIT_CACHE 0 + /* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. */ + /* (0:use system defaults) */ + #define LV_FREETYPE_CACHE_FT_FACES 0 + #define LV_FREETYPE_CACHE_FT_SIZES 0 + #endif +#endif + +/*Rlottie library*/ +#define LV_USE_RLOTTIE 0 + +/*FFmpeg library for image decoding and playing videos + *Supports all major image formats so do not enable other image decoder with it*/ +#define LV_USE_FFMPEG 0 +#if LV_USE_FFMPEG + /*Dump input information to stderr*/ + #define LV_FFMPEG_DUMP_FORMAT 0 +#endif + +/*----------- + * Others + *----------*/ + +/*1: Enable API to take snapshot for object*/ +#define LV_USE_SNAPSHOT 0 + +/*1: Enable Monkey test*/ +#define LV_USE_MONKEY 0 + +/*1: Enable grid navigation*/ +#define LV_USE_GRIDNAV 0 + +/*1: Enable lv_obj fragment*/ +#define LV_USE_FRAGMENT 0 + +/*1: Support using images as font in label or span widgets */ +#define LV_USE_IMGFONT 0 + +/*1: Enable a published subscriber based messaging system */ +#define LV_USE_MSG 0 + +/*1: Enable Pinyin input method*/ +/*Requires: lv_keyboard*/ +#define LV_USE_IME_PINYIN 0 +#if LV_USE_IME_PINYIN + /*1: Use default thesaurus*/ + /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesauruss*/ + #define LV_IME_PINYIN_USE_DEFAULT_DICT 1 + /*Set the maximum number of candidate panels that can be displayed*/ + /*This needs to be adjusted according to the size of the screen*/ + #define LV_IME_PINYIN_CAND_TEXT_NUM 6 + + /*Use 9 key input(k9)*/ + #define LV_IME_PINYIN_USE_K9_MODE 1 + #if LV_IME_PINYIN_USE_K9_MODE == 1 + #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3 + #endif // LV_IME_PINYIN_USE_K9_MODE +#endif + +/*================== +* EXAMPLES +*==================*/ + +/*Enable the examples to be built with the library*/ +#define LV_BUILD_EXAMPLES 1 + +/*=================== + * DEMO USAGE + ====================*/ + +/*Show some widget. It might be required to increase `LV_MEM_SIZE` */ +#define LV_USE_DEMO_WIDGETS 0 +#if LV_USE_DEMO_WIDGETS +#define LV_DEMO_WIDGETS_SLIDESHOW 0 +#endif + +/*Demonstrate the usage of encoder and keyboard*/ +#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0 + +/*Benchmark your system*/ +#define LV_USE_DEMO_BENCHMARK 0 +#if LV_USE_DEMO_BENCHMARK +/*Use RGB565A8 images with 16 bit color depth instead of ARGB8565*/ +#define LV_DEMO_BENCHMARK_RGB565A8 0 +#endif + +/*Stress test for LVGL*/ +#define LV_USE_DEMO_STRESS 0 + +/*Music player demo*/ +#define LV_USE_DEMO_MUSIC 0 +#if LV_USE_DEMO_MUSIC + #define LV_DEMO_MUSIC_SQUARE 0 + #define LV_DEMO_MUSIC_LANDSCAPE 0 + #define LV_DEMO_MUSIC_ROUND 0 + #define LV_DEMO_MUSIC_LARGE 0 + #define LV_DEMO_MUSIC_AUTO_PLAY 0 +#endif + +/*--END OF LV_CONF_H--*/ + +#endif /*LV_CONF_H*/ + +#endif /*End of "Content enable"*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/lvgl.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/lvgl.h new file mode 100644 index 0000000..c0be411 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/lvgl.h @@ -0,0 +1,138 @@ +/** + * @file lvgl.h + * Include all LVGL related headers + */ + +#ifndef LVGL_H +#define LVGL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*************************** + * CURRENT VERSION OF LVGL + ***************************/ +#define LVGL_VERSION_MAJOR 8 +#define LVGL_VERSION_MINOR 3 +#define LVGL_VERSION_PATCH 3 +#define LVGL_VERSION_INFO "" + +/********************* + * INCLUDES + *********************/ + +#include "src/misc/lv_log.h" +#include "src/misc/lv_timer.h" +#include "src/misc/lv_math.h" +#include "src/misc/lv_mem.h" +#include "src/misc/lv_async.h" +#include "src/misc/lv_anim_timeline.h" +#include "src/misc/lv_printf.h" + +#include "src/hal/lv_hal.h" + +#include "src/core/lv_obj.h" +#include "src/core/lv_group.h" +#include "src/core/lv_indev.h" +#include "src/core/lv_refr.h" +#include "src/core/lv_disp.h" +#include "src/core/lv_theme.h" + +#include "src/font/lv_font.h" +#include "src/font/lv_font_loader.h" +#include "src/font/lv_font_fmt_txt.h" + +#include "src/widgets/lv_arc.h" +#include "src/widgets/lv_btn.h" +#include "src/widgets/lv_img.h" +#include "src/widgets/lv_label.h" +#include "src/widgets/lv_line.h" +#include "src/widgets/lv_table.h" +#include "src/widgets/lv_checkbox.h" +#include "src/widgets/lv_bar.h" +#include "src/widgets/lv_slider.h" +#include "src/widgets/lv_btnmatrix.h" +#include "src/widgets/lv_dropdown.h" +#include "src/widgets/lv_roller.h" +#include "src/widgets/lv_textarea.h" +#include "src/widgets/lv_canvas.h" +#include "src/widgets/lv_switch.h" + +#include "src/draw/lv_draw.h" + +#include "src/lv_api_map.h" + +/*----------------- + * EXTRAS + *----------------*/ +#include "src/extra/lv_extra.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +/** Gives 1 if the x.y.z version is supported in the current version + * Usage: + * + * - Require v6 + * #if LV_VERSION_CHECK(6,0,0) + * new_func_in_v6(); + * #endif + * + * + * - Require at least v5.3 + * #if LV_VERSION_CHECK(5,3,0) + * new_feature_from_v5_3(); + * #endif + * + * + * - Require v5.3.2 bugfixes + * #if LV_VERSION_CHECK(5,3,2) + * bugfix_in_v5_3_2(); + * #endif + * + */ +#define LV_VERSION_CHECK(x,y,z) (x == LVGL_VERSION_MAJOR && (y < LVGL_VERSION_MINOR || (y == LVGL_VERSION_MINOR && z <= LVGL_VERSION_PATCH))) + +/** + * Wrapper functions for VERSION macros + */ + +static inline int lv_version_major(void) +{ + return LVGL_VERSION_MAJOR; +} + +static inline int lv_version_minor(void) +{ + return LVGL_VERSION_MINOR; +} + +static inline int lv_version_patch(void) +{ + return LVGL_VERSION_PATCH; +} + +static inline const char *lv_version_info(void) +{ + return LVGL_VERSION_INFO; +} + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LVGL_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_core.mk b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_core.mk new file mode 100644 index 0000000..677a9f6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_core.mk @@ -0,0 +1,20 @@ +CSRCS += lv_disp.c +CSRCS += lv_group.c +CSRCS += lv_indev.c +CSRCS += lv_indev_scroll.c +CSRCS += lv_obj.c +CSRCS += lv_obj_class.c +CSRCS += lv_obj_draw.c +CSRCS += lv_obj_pos.c +CSRCS += lv_obj_scroll.c +CSRCS += lv_obj_style.c +CSRCS += lv_obj_style_gen.c +CSRCS += lv_obj_tree.c +CSRCS += lv_event.c +CSRCS += lv_refr.c +CSRCS += lv_theme.c + +DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/core +VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/core + +CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/core" diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_disp.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_disp.c new file mode 100644 index 0000000..a1022b5 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_disp.c @@ -0,0 +1,534 @@ +/** + * @file lv_disp.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_disp.h" +#include "../misc/lv_math.h" +#include "../core/lv_refr.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void scr_load_internal(lv_obj_t * scr); +static void scr_load_anim_start(lv_anim_t * a); +static void opa_scale_anim(void * obj, int32_t v); +static void set_x_anim(void * obj, int32_t v); +static void set_y_anim(void * obj, int32_t v); +static void scr_anim_ready(lv_anim_t * a); +static bool is_out_anim(lv_scr_load_anim_t a); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Return with a pointer to the active screen + * @param disp pointer to display which active screen should be get. (NULL to use the default + * screen) + * @return pointer to the active screen object (loaded by 'lv_scr_load()') + */ +lv_obj_t * lv_disp_get_scr_act(lv_disp_t * disp) +{ + if(!disp) disp = lv_disp_get_default(); + if(!disp) { + LV_LOG_WARN("no display registered to get its active screen"); + return NULL; + } + + return disp->act_scr; +} + +/** + * Return with a pointer to the previous screen. Only used during screen transitions. + * @param disp pointer to display which previous screen should be get. (NULL to use the default + * screen) + * @return pointer to the previous screen object or NULL if not used now + */ +lv_obj_t * lv_disp_get_scr_prev(lv_disp_t * disp) +{ + if(!disp) disp = lv_disp_get_default(); + if(!disp) { + LV_LOG_WARN("no display registered to get its previous screen"); + return NULL; + } + + return disp->prev_scr; +} + +/** + * Make a screen active + * @param scr pointer to a screen + */ +void lv_disp_load_scr(lv_obj_t * scr) +{ + lv_scr_load_anim(scr, LV_SCR_LOAD_ANIM_NONE, 0, 0, false); +} + +/** + * Return with the top layer. (Same on every screen and it is above the normal screen layer) + * @param disp pointer to display which top layer should be get. (NULL to use the default screen) + * @return pointer to the top layer object (transparent screen sized lv_obj) + */ +lv_obj_t * lv_disp_get_layer_top(lv_disp_t * disp) +{ + if(!disp) disp = lv_disp_get_default(); + if(!disp) { + LV_LOG_WARN("lv_layer_top: no display registered to get its top layer"); + return NULL; + } + + return disp->top_layer; +} + +/** + * Return with the sys. layer. (Same on every screen and it is above the normal screen and the top + * layer) + * @param disp pointer to display which sys. layer should be retrieved. (NULL to use the default screen) + * @return pointer to the sys layer object (transparent screen sized lv_obj) + */ +lv_obj_t * lv_disp_get_layer_sys(lv_disp_t * disp) +{ + if(!disp) disp = lv_disp_get_default(); + if(!disp) { + LV_LOG_WARN("lv_layer_sys: no display registered to get its sys. layer"); + return NULL; + } + + return disp->sys_layer; +} + +/** + * Set the theme of a display + * @param disp pointer to a display + */ +void lv_disp_set_theme(lv_disp_t * disp, lv_theme_t * th) +{ + if(!disp) disp = lv_disp_get_default(); + if(!disp) { + LV_LOG_WARN("no display registered"); + return; + } + + disp->theme = th; + + if(disp->screen_cnt == 3 && + lv_obj_get_child_cnt(disp->screens[0]) == 0 && + lv_obj_get_child_cnt(disp->screens[1]) == 0 && + lv_obj_get_child_cnt(disp->screens[2]) == 0) { + lv_theme_apply(disp->screens[0]); + } +} +/** + * Get the theme of a display + * @param disp pointer to a display + * @return the display's theme (can be NULL) + */ +lv_theme_t * lv_disp_get_theme(lv_disp_t * disp) +{ + if(disp == NULL) disp = lv_disp_get_default(); + return disp->theme; +} + +/** + * Set the background color of a display + * @param disp pointer to a display + * @param color color of the background + */ +void lv_disp_set_bg_color(lv_disp_t * disp, lv_color_t color) +{ + if(!disp) disp = lv_disp_get_default(); + if(!disp) { + LV_LOG_WARN("no display registered"); + return; + } + + disp->bg_color = color; + + lv_area_t a; + lv_area_set(&a, 0, 0, lv_disp_get_hor_res(disp) - 1, lv_disp_get_ver_res(disp) - 1); + _lv_inv_area(disp, &a); + +} + +/** + * Set the background image of a display + * @param disp pointer to a display + * @param img_src path to file or pointer to an `lv_img_dsc_t` variable + */ +void lv_disp_set_bg_image(lv_disp_t * disp, const void * img_src) +{ + if(!disp) disp = lv_disp_get_default(); + if(!disp) { + LV_LOG_WARN("no display registered"); + return; + } + + disp->bg_img = img_src; + + lv_area_t a; + lv_area_set(&a, 0, 0, lv_disp_get_hor_res(disp) - 1, lv_disp_get_ver_res(disp) - 1); + _lv_inv_area(disp, &a); +} + +/** + * Set opacity of the background + * @param disp pointer to a display + * @param opa opacity (0..255) + */ +void lv_disp_set_bg_opa(lv_disp_t * disp, lv_opa_t opa) +{ + if(!disp) disp = lv_disp_get_default(); + if(!disp) { + LV_LOG_WARN("no display registered"); + return; + } + + disp->bg_opa = opa; + + lv_area_t a; + lv_area_set(&a, 0, 0, lv_disp_get_hor_res(disp) - 1, lv_disp_get_ver_res(disp) - 1); + _lv_inv_area(disp, &a); +} + +/** + * Switch screen with animation + * @param scr pointer to the new screen to load + * @param anim_type type of the animation from `lv_scr_load_anim_t`, e.g. `LV_SCR_LOAD_ANIM_MOVE_LEFT` + * @param time time of the animation + * @param delay delay before the transition + * @param auto_del true: automatically delete the old screen + */ +void lv_scr_load_anim(lv_obj_t * new_scr, lv_scr_load_anim_t anim_type, uint32_t time, uint32_t delay, bool auto_del) +{ + + lv_disp_t * d = lv_obj_get_disp(new_scr); + lv_obj_t * act_scr = lv_scr_act(); + + /*If an other screen load animation is in progress + *make target screen loaded immediately. */ + if(d->scr_to_load && act_scr != d->scr_to_load) { + scr_load_internal(d->scr_to_load); + lv_anim_del(d->scr_to_load, NULL); + lv_obj_set_pos(d->scr_to_load, 0, 0); + lv_obj_remove_local_style_prop(d->scr_to_load, LV_STYLE_OPA, 0); + + if(d->del_prev) { + lv_obj_del(act_scr); + } + act_scr = d->scr_to_load; + } + + d->scr_to_load = new_scr; + + if(d->prev_scr && d->del_prev) { + lv_obj_del(d->prev_scr); + d->prev_scr = NULL; + } + + d->draw_prev_over_act = is_out_anim(anim_type); + d->del_prev = auto_del; + + /*Be sure there is no other animation on the screens*/ + lv_anim_del(new_scr, NULL); + lv_anim_del(lv_scr_act(), NULL); + + /*Be sure both screens are in a normal position*/ + lv_obj_set_pos(new_scr, 0, 0); + lv_obj_set_pos(lv_scr_act(), 0, 0); + lv_obj_remove_local_style_prop(new_scr, LV_STYLE_OPA, 0); + lv_obj_remove_local_style_prop(lv_scr_act(), LV_STYLE_OPA, 0); + + + /*Shortcut for immediate load*/ + if(time == 0 && delay == 0) { + scr_load_internal(new_scr); + return; + } + + lv_anim_t a_new; + lv_anim_init(&a_new); + lv_anim_set_var(&a_new, new_scr); + lv_anim_set_start_cb(&a_new, scr_load_anim_start); + lv_anim_set_ready_cb(&a_new, scr_anim_ready); + lv_anim_set_time(&a_new, time); + lv_anim_set_delay(&a_new, delay); + + lv_anim_t a_old; + lv_anim_init(&a_old); + lv_anim_set_var(&a_old, d->act_scr); + lv_anim_set_time(&a_old, time); + lv_anim_set_delay(&a_old, delay); + + switch(anim_type) { + case LV_SCR_LOAD_ANIM_NONE: + /*Create a dummy animation to apply the delay*/ + lv_anim_set_exec_cb(&a_new, set_x_anim); + lv_anim_set_values(&a_new, 0, 0); + break; + case LV_SCR_LOAD_ANIM_OVER_LEFT: + lv_anim_set_exec_cb(&a_new, set_x_anim); + lv_anim_set_values(&a_new, lv_disp_get_hor_res(d), 0); + break; + case LV_SCR_LOAD_ANIM_OVER_RIGHT: + lv_anim_set_exec_cb(&a_new, set_x_anim); + lv_anim_set_values(&a_new, -lv_disp_get_hor_res(d), 0); + break; + case LV_SCR_LOAD_ANIM_OVER_TOP: + lv_anim_set_exec_cb(&a_new, set_y_anim); + lv_anim_set_values(&a_new, lv_disp_get_ver_res(d), 0); + break; + case LV_SCR_LOAD_ANIM_OVER_BOTTOM: + lv_anim_set_exec_cb(&a_new, set_y_anim); + lv_anim_set_values(&a_new, -lv_disp_get_ver_res(d), 0); + break; + case LV_SCR_LOAD_ANIM_MOVE_LEFT: + lv_anim_set_exec_cb(&a_new, set_x_anim); + lv_anim_set_values(&a_new, lv_disp_get_hor_res(d), 0); + + lv_anim_set_exec_cb(&a_old, set_x_anim); + lv_anim_set_values(&a_old, 0, -lv_disp_get_hor_res(d)); + break; + case LV_SCR_LOAD_ANIM_MOVE_RIGHT: + lv_anim_set_exec_cb(&a_new, set_x_anim); + lv_anim_set_values(&a_new, -lv_disp_get_hor_res(d), 0); + + lv_anim_set_exec_cb(&a_old, set_x_anim); + lv_anim_set_values(&a_old, 0, lv_disp_get_hor_res(d)); + break; + case LV_SCR_LOAD_ANIM_MOVE_TOP: + lv_anim_set_exec_cb(&a_new, set_y_anim); + lv_anim_set_values(&a_new, lv_disp_get_ver_res(d), 0); + + lv_anim_set_exec_cb(&a_old, set_y_anim); + lv_anim_set_values(&a_old, 0, -lv_disp_get_ver_res(d)); + break; + case LV_SCR_LOAD_ANIM_MOVE_BOTTOM: + lv_anim_set_exec_cb(&a_new, set_y_anim); + lv_anim_set_values(&a_new, -lv_disp_get_ver_res(d), 0); + + lv_anim_set_exec_cb(&a_old, set_y_anim); + lv_anim_set_values(&a_old, 0, lv_disp_get_ver_res(d)); + break; + case LV_SCR_LOAD_ANIM_FADE_IN: + lv_anim_set_exec_cb(&a_new, opa_scale_anim); + lv_anim_set_values(&a_new, LV_OPA_TRANSP, LV_OPA_COVER); + break; + case LV_SCR_LOAD_ANIM_FADE_OUT: + lv_anim_set_exec_cb(&a_old, opa_scale_anim); + lv_anim_set_values(&a_old, LV_OPA_COVER, LV_OPA_TRANSP); + break; + case LV_SCR_LOAD_ANIM_OUT_LEFT: + lv_anim_set_exec_cb(&a_old, set_x_anim); + lv_anim_set_values(&a_old, 0, -lv_disp_get_hor_res(d)); + break; + case LV_SCR_LOAD_ANIM_OUT_RIGHT: + lv_anim_set_exec_cb(&a_old, set_x_anim); + lv_anim_set_values(&a_old, 0, lv_disp_get_hor_res(d)); + break; + case LV_SCR_LOAD_ANIM_OUT_TOP: + lv_anim_set_exec_cb(&a_old, set_y_anim); + lv_anim_set_values(&a_old, 0, -lv_disp_get_ver_res(d)); + break; + case LV_SCR_LOAD_ANIM_OUT_BOTTOM: + lv_anim_set_exec_cb(&a_old, set_y_anim); + lv_anim_set_values(&a_old, 0, lv_disp_get_ver_res(d)); + break; + } + + lv_event_send(act_scr, LV_EVENT_SCREEN_UNLOAD_START, NULL); + + lv_anim_start(&a_new); + lv_anim_start(&a_old); +} + +/** + * Get elapsed time since last user activity on a display (e.g. click) + * @param disp pointer to a display (NULL to get the overall smallest inactivity) + * @return elapsed ticks (milliseconds) since the last activity + */ +uint32_t lv_disp_get_inactive_time(const lv_disp_t * disp) +{ + if(disp) return lv_tick_elaps(disp->last_activity_time); + + lv_disp_t * d; + uint32_t t = UINT32_MAX; + d = lv_disp_get_next(NULL); + while(d) { + uint32_t elaps = lv_tick_elaps(d->last_activity_time); + t = LV_MIN(t, elaps); + d = lv_disp_get_next(d); + } + + return t; +} + +/** + * Manually trigger an activity on a display + * @param disp pointer to a display (NULL to use the default display) + */ +void lv_disp_trig_activity(lv_disp_t * disp) +{ + if(!disp) disp = lv_disp_get_default(); + if(!disp) { + LV_LOG_WARN("lv_disp_trig_activity: no display registered"); + return; + } + + disp->last_activity_time = lv_tick_get(); +} + +/** + * Clean any CPU cache that is related to the display. + * @param disp pointer to a display (NULL to use the default display) + */ +void lv_disp_clean_dcache(lv_disp_t * disp) +{ + if(!disp) disp = lv_disp_get_default(); + if(!disp) { + LV_LOG_WARN("lv_disp_clean_dcache: no display registered"); + return; + } + + if(disp->driver->clean_dcache_cb) + disp->driver->clean_dcache_cb(disp->driver); +} + +/** + * Temporarily enable and disable the invalidation of the display. + * @param disp pointer to a display (NULL to use the default display) + * @param en true: enable invalidation; false: invalidation + */ +void lv_disp_enable_invalidation(lv_disp_t * disp, bool en) +{ + if(!disp) disp = lv_disp_get_default(); + if(!disp) { + LV_LOG_WARN("no display registered"); + return; + } + + disp->inv_en_cnt += en ? 1 : -1; +} + +/** + * Get display invalidation is enabled. + * @param disp pointer to a display (NULL to use the default display) + * @return return true if invalidation is enabled + */ +bool lv_disp_is_invalidation_enabled(lv_disp_t * disp) +{ + if(!disp) disp = lv_disp_get_default(); + if(!disp) { + LV_LOG_WARN("no display registered"); + return false; + } + + return (disp->inv_en_cnt > 0); +} + +/** + * Get a pointer to the screen refresher timer to + * modify its parameters with `lv_timer_...` functions. + * @param disp pointer to a display + * @return pointer to the display refresher timer. (NULL on error) + */ +lv_timer_t * _lv_disp_get_refr_timer(lv_disp_t * disp) +{ + if(!disp) disp = lv_disp_get_default(); + if(!disp) { + LV_LOG_WARN("lv_disp_get_refr_timer: no display registered"); + return NULL; + } + + return disp->refr_timer; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void scr_load_internal(lv_obj_t * scr) +{ + lv_disp_t * d = lv_obj_get_disp(scr); + if(!d) return; /*Shouldn't happen, just to be sure*/ + + lv_obj_t * old_scr = d->act_scr; + + if(d->act_scr) lv_event_send(old_scr, LV_EVENT_SCREEN_UNLOAD_START, NULL); + if(d->act_scr) lv_event_send(scr, LV_EVENT_SCREEN_LOAD_START, NULL); + + d->act_scr = scr; + + if(d->act_scr) lv_event_send(scr, LV_EVENT_SCREEN_LOADED, NULL); + if(d->act_scr) lv_event_send(old_scr, LV_EVENT_SCREEN_UNLOADED, NULL); + + lv_obj_invalidate(scr); +} + +static void scr_load_anim_start(lv_anim_t * a) +{ + lv_disp_t * d = lv_obj_get_disp(a->var); + + d->prev_scr = lv_scr_act(); + d->act_scr = a->var; + + lv_event_send(d->act_scr, LV_EVENT_SCREEN_LOAD_START, NULL); +} + +static void opa_scale_anim(void * obj, int32_t v) +{ + lv_obj_set_style_opa(obj, v, 0); +} + +static void set_x_anim(void * obj, int32_t v) +{ + lv_obj_set_x(obj, v); +} + +static void set_y_anim(void * obj, int32_t v) +{ + lv_obj_set_y(obj, v); +} + +static void scr_anim_ready(lv_anim_t * a) +{ + lv_disp_t * d = lv_obj_get_disp(a->var); + + lv_event_send(d->act_scr, LV_EVENT_SCREEN_LOADED, NULL); + lv_event_send(d->prev_scr, LV_EVENT_SCREEN_UNLOADED, NULL); + + if(d->prev_scr && d->del_prev) lv_obj_del(d->prev_scr); + d->prev_scr = NULL; + d->draw_prev_over_act = false; + d->scr_to_load = NULL; + lv_obj_remove_local_style_prop(a->var, LV_STYLE_OPA, 0); + lv_obj_invalidate(d->act_scr); +} + +static bool is_out_anim(lv_scr_load_anim_t anim_type) +{ + return anim_type == LV_SCR_LOAD_ANIM_FADE_OUT || + anim_type == LV_SCR_LOAD_ANIM_OUT_LEFT || + anim_type == LV_SCR_LOAD_ANIM_OUT_RIGHT || + anim_type == LV_SCR_LOAD_ANIM_OUT_TOP || + anim_type == LV_SCR_LOAD_ANIM_OUT_BOTTOM; +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_disp.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_disp.h new file mode 100644 index 0000000..7854cb7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_disp.h @@ -0,0 +1,264 @@ +/** + * @file lv_disp.h + * + */ + +#ifndef LV_DISP_H +#define LV_DISP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../hal/lv_hal.h" +#include "lv_obj.h" +#include "lv_theme.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_SCR_LOAD_ANIM_NONE, + LV_SCR_LOAD_ANIM_OVER_LEFT, + LV_SCR_LOAD_ANIM_OVER_RIGHT, + LV_SCR_LOAD_ANIM_OVER_TOP, + LV_SCR_LOAD_ANIM_OVER_BOTTOM, + LV_SCR_LOAD_ANIM_MOVE_LEFT, + LV_SCR_LOAD_ANIM_MOVE_RIGHT, + LV_SCR_LOAD_ANIM_MOVE_TOP, + LV_SCR_LOAD_ANIM_MOVE_BOTTOM, + LV_SCR_LOAD_ANIM_FADE_IN, + LV_SCR_LOAD_ANIM_FADE_ON = LV_SCR_LOAD_ANIM_FADE_IN, /*For backward compatibility*/ + LV_SCR_LOAD_ANIM_FADE_OUT, + LV_SCR_LOAD_ANIM_OUT_LEFT, + LV_SCR_LOAD_ANIM_OUT_RIGHT, + LV_SCR_LOAD_ANIM_OUT_TOP, + LV_SCR_LOAD_ANIM_OUT_BOTTOM, +} lv_scr_load_anim_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Return with a pointer to the active screen + * @param disp pointer to display which active screen should be get. (NULL to use the default + * screen) + * @return pointer to the active screen object (loaded by 'lv_scr_load()') + */ +lv_obj_t * lv_disp_get_scr_act(lv_disp_t * disp); + +/** + * Return with a pointer to the previous screen. Only used during screen transitions. + * @param disp pointer to display which previous screen should be get. (NULL to use the default + * screen) + * @return pointer to the previous screen object or NULL if not used now + */ +lv_obj_t * lv_disp_get_scr_prev(lv_disp_t * disp); + +/** + * Make a screen active + * @param scr pointer to a screen + */ +void lv_disp_load_scr(lv_obj_t * scr); + +/** + * Return with the top layer. (Same on every screen and it is above the normal screen layer) + * @param disp pointer to display which top layer should be get. (NULL to use the default screen) + * @return pointer to the top layer object (transparent screen sized lv_obj) + */ +lv_obj_t * lv_disp_get_layer_top(lv_disp_t * disp); + +/** + * Return with the sys. layer. (Same on every screen and it is above the normal screen and the top + * layer) + * @param disp pointer to display which sys. layer should be retrieved. (NULL to use the default screen) + * @return pointer to the sys layer object (transparent screen sized lv_obj) + */ +lv_obj_t * lv_disp_get_layer_sys(lv_disp_t * disp); + +/** + * Set the theme of a display + * @param disp pointer to a display + */ +void lv_disp_set_theme(lv_disp_t * disp, lv_theme_t * th); + +/** + * Get the theme of a display + * @param disp pointer to a display + * @return the display's theme (can be NULL) + */ +lv_theme_t * lv_disp_get_theme(lv_disp_t * disp); + +/** + * Set the background color of a display + * @param disp pointer to a display + * @param color color of the background + */ +void lv_disp_set_bg_color(lv_disp_t * disp, lv_color_t color); + +/** + * Set the background image of a display + * @param disp pointer to a display + * @param img_src path to file or pointer to an `lv_img_dsc_t` variable + */ +void lv_disp_set_bg_image(lv_disp_t * disp, const void * img_src); + +/** + * Set opacity of the background + * @param disp pointer to a display + * @param opa opacity (0..255) + */ +void lv_disp_set_bg_opa(lv_disp_t * disp, lv_opa_t opa); + +/** + * Switch screen with animation + * @param scr pointer to the new screen to load + * @param anim_type type of the animation from `lv_scr_load_anim_t`, e.g. `LV_SCR_LOAD_ANIM_MOVE_LEFT` + * @param time time of the animation + * @param delay delay before the transition + * @param auto_del true: automatically delete the old screen + */ +void lv_scr_load_anim(lv_obj_t * scr, lv_scr_load_anim_t anim_type, uint32_t time, uint32_t delay, bool auto_del); + +/** + * Get elapsed time since last user activity on a display (e.g. click) + * @param disp pointer to a display (NULL to get the overall smallest inactivity) + * @return elapsed ticks (milliseconds) since the last activity + */ +uint32_t lv_disp_get_inactive_time(const lv_disp_t * disp); + +/** + * Manually trigger an activity on a display + * @param disp pointer to a display (NULL to use the default display) + */ +void lv_disp_trig_activity(lv_disp_t * disp); + +/** + * Clean any CPU cache that is related to the display. + * @param disp pointer to a display (NULL to use the default display) + */ +void lv_disp_clean_dcache(lv_disp_t * disp); + +/** + * Temporarily enable and disable the invalidation of the display. + * @param disp pointer to a display (NULL to use the default display) + * @param en true: enable invalidation; false: invalidation + */ +void lv_disp_enable_invalidation(lv_disp_t * disp, bool en); + +/** + * Get display invalidation is enabled. + * @param disp pointer to a display (NULL to use the default display) + * @return return true if invalidation is enabled + */ +bool lv_disp_is_invalidation_enabled(lv_disp_t * disp); + +/** + * Get a pointer to the screen refresher timer to + * modify its parameters with `lv_timer_...` functions. + * @param disp pointer to a display + * @return pointer to the display refresher timer. (NULL on error) + */ +lv_timer_t * _lv_disp_get_refr_timer(lv_disp_t * disp); + +/*------------------------------------------------ + * To improve backward compatibility + * Recommended only if you have one display + *------------------------------------------------*/ + +/** + * Get the active screen of the default display + * @return pointer to the active screen + */ +static inline lv_obj_t * lv_scr_act(void) +{ + return lv_disp_get_scr_act(lv_disp_get_default()); +} + +/** + * Get the top layer of the default display + * @return pointer to the top layer + */ +static inline lv_obj_t * lv_layer_top(void) +{ + return lv_disp_get_layer_top(lv_disp_get_default()); +} + +/** + * Get the active screen of the default display + * @return pointer to the sys layer + */ +static inline lv_obj_t * lv_layer_sys(void) +{ + return lv_disp_get_layer_sys(lv_disp_get_default()); +} + +static inline void lv_scr_load(lv_obj_t * scr) +{ + lv_disp_load_scr(scr); +} + +/********************** + * MACROS + **********************/ + +/*------------------------------------------------ + * To improve backward compatibility + * Recommended only if you have one display + *------------------------------------------------*/ + +#ifndef LV_HOR_RES +/** + * The horizontal resolution of the currently active display. + */ +#define LV_HOR_RES lv_disp_get_hor_res(lv_disp_get_default()) +#endif + +#ifndef LV_VER_RES +/** + * The vertical resolution of the currently active display. + */ +#define LV_VER_RES lv_disp_get_ver_res(lv_disp_get_default()) +#endif + +/** + * Scale the given number of pixels (a distance or size) relative to a 160 DPI display + * considering the DPI of the default display. + * It ensures that e.g. `lv_dpx(100)` will have the same physical size regardless to the + * DPI of the display. + * @param n the number of pixels to scale + * @return `n x current_dpi/160` + */ +static inline lv_coord_t lv_dpx(lv_coord_t n) +{ + return LV_DPX(n); +} + +/** + * Scale the given number of pixels (a distance or size) relative to a 160 DPI display + * considering the DPI of the given display. + * It ensures that e.g. `lv_dpx(100)` will have the same physical size regardless to the + * DPI of the display. + * @param obj a display whose dpi should be considered + * @param n the number of pixels to scale + * @return `n x current_dpi/160` + */ +static inline lv_coord_t lv_disp_dpx(const lv_disp_t * disp, lv_coord_t n) +{ + return _LV_DPX_CALC(lv_disp_get_dpi(disp), n); +} + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DISP_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_event.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_event.c new file mode 100644 index 0000000..f53ceac --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_event.c @@ -0,0 +1,527 @@ +/** + * @file lv_event.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj.h" +#include "lv_indev.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_obj_class + +/********************** + * TYPEDEFS + **********************/ +typedef struct _lv_event_dsc_t { + lv_event_cb_t cb; + void * user_data; + lv_event_code_t filter : 8; +} lv_event_dsc_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_event_dsc_t * lv_obj_get_event_dsc(const lv_obj_t * obj, uint32_t id); +static lv_res_t event_send_core(lv_event_t * e); +static bool event_is_bubbled(lv_event_t * e); + + +/********************** + * STATIC VARIABLES + **********************/ +static lv_event_t * event_head; + +/********************** + * MACROS + **********************/ +#if LV_LOG_TRACE_EVENT + #define EVENT_TRACE(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define EVENT_TRACE(...) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_res_t lv_event_send(lv_obj_t * obj, lv_event_code_t event_code, void * param) +{ + if(obj == NULL) return LV_RES_OK; + + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_event_t e; + e.target = obj; + e.current_target = obj; + e.code = event_code; + e.user_data = NULL; + e.param = param; + e.deleted = 0; + e.stop_bubbling = 0; + e.stop_processing = 0; + + /*Build a simple linked list from the objects used in the events + *It's important to know if this object was deleted by a nested event + *called from this `event_cb`.*/ + e.prev = event_head; + event_head = &e; + + /*Send the event*/ + lv_res_t res = event_send_core(&e); + + /*Remove this element from the list*/ + event_head = e.prev; + + return res; +} + + +lv_res_t lv_obj_event_base(const lv_obj_class_t * class_p, lv_event_t * e) +{ + const lv_obj_class_t * base; + if(class_p == NULL) base = e->current_target->class_p; + else base = class_p->base_class; + + /*Find a base in which call the ancestor's event handler_cb if set*/ + while(base && base->event_cb == NULL) base = base->base_class; + + if(base == NULL) return LV_RES_OK; + if(base->event_cb == NULL) return LV_RES_OK; + + /*Call the actual event callback*/ + e->user_data = NULL; + base->event_cb(base, e); + + lv_res_t res = LV_RES_OK; + /*Stop if the object is deleted*/ + if(e->deleted) res = LV_RES_INV; + + return res; +} + + +lv_obj_t * lv_event_get_target(lv_event_t * e) +{ + return e->target; +} + +lv_obj_t * lv_event_get_current_target(lv_event_t * e) +{ + return e->current_target; +} + +lv_event_code_t lv_event_get_code(lv_event_t * e) +{ + return e->code & ~LV_EVENT_PREPROCESS; +} + +void * lv_event_get_param(lv_event_t * e) +{ + return e->param; +} + +void * lv_event_get_user_data(lv_event_t * e) +{ + return e->user_data; +} + +void lv_event_stop_bubbling(lv_event_t * e) +{ + e->stop_bubbling = 1; +} + +void lv_event_stop_processing(lv_event_t * e) +{ + e->stop_processing = 1; +} + + +uint32_t lv_event_register_id(void) +{ + static uint32_t last_id = _LV_EVENT_LAST; + last_id ++; + return last_id; +} + +void _lv_event_mark_deleted(lv_obj_t * obj) +{ + lv_event_t * e = event_head; + + while(e) { + if(e->current_target == obj || e->target == obj) e->deleted = 1; + e = e->prev; + } +} + + +struct _lv_event_dsc_t * lv_obj_add_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb, lv_event_code_t filter, + void * user_data) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_obj_allocate_spec_attr(obj); + + obj->spec_attr->event_dsc_cnt++; + obj->spec_attr->event_dsc = lv_mem_realloc(obj->spec_attr->event_dsc, + obj->spec_attr->event_dsc_cnt * sizeof(lv_event_dsc_t)); + LV_ASSERT_MALLOC(obj->spec_attr->event_dsc); + + obj->spec_attr->event_dsc[obj->spec_attr->event_dsc_cnt - 1].cb = event_cb; + obj->spec_attr->event_dsc[obj->spec_attr->event_dsc_cnt - 1].filter = filter; + obj->spec_attr->event_dsc[obj->spec_attr->event_dsc_cnt - 1].user_data = user_data; + + return &obj->spec_attr->event_dsc[obj->spec_attr->event_dsc_cnt - 1]; +} + +bool lv_obj_remove_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + if(obj->spec_attr == NULL) return false; + + int32_t i = 0; + for(i = 0; i < obj->spec_attr->event_dsc_cnt; i++) { + if(event_cb == NULL || obj->spec_attr->event_dsc[i].cb == event_cb) { + /*Shift the remaining event handlers forward*/ + for(; i < (obj->spec_attr->event_dsc_cnt - 1); i++) { + obj->spec_attr->event_dsc[i] = obj->spec_attr->event_dsc[i + 1]; + } + obj->spec_attr->event_dsc_cnt--; + obj->spec_attr->event_dsc = lv_mem_realloc(obj->spec_attr->event_dsc, + obj->spec_attr->event_dsc_cnt * sizeof(lv_event_dsc_t)); + LV_ASSERT_MALLOC(obj->spec_attr->event_dsc); + return true; + } + } + + /*No event handler found*/ + return false; +} + +bool lv_obj_remove_event_cb_with_user_data(lv_obj_t * obj, lv_event_cb_t event_cb, const void * user_data) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + if(obj->spec_attr == NULL) return false; + + int32_t i = 0; + for(i = 0; i < obj->spec_attr->event_dsc_cnt; i++) { + if((event_cb == NULL || obj->spec_attr->event_dsc[i].cb == event_cb) && + obj->spec_attr->event_dsc[i].user_data == user_data) { + /*Shift the remaining event handlers forward*/ + for(; i < (obj->spec_attr->event_dsc_cnt - 1); i++) { + obj->spec_attr->event_dsc[i] = obj->spec_attr->event_dsc[i + 1]; + } + obj->spec_attr->event_dsc_cnt--; + obj->spec_attr->event_dsc = lv_mem_realloc(obj->spec_attr->event_dsc, + obj->spec_attr->event_dsc_cnt * sizeof(lv_event_dsc_t)); + LV_ASSERT_MALLOC(obj->spec_attr->event_dsc); + return true; + } + } + + /*No event handler found*/ + return false; +} + + +bool lv_obj_remove_event_dsc(lv_obj_t * obj, struct _lv_event_dsc_t * event_dsc) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + if(obj->spec_attr == NULL) return false; + + int32_t i = 0; + for(i = 0; i < obj->spec_attr->event_dsc_cnt; i++) { + if(&obj->spec_attr->event_dsc[i] == event_dsc) { + /*Shift the remaining event handlers forward*/ + for(; i < (obj->spec_attr->event_dsc_cnt - 1); i++) { + obj->spec_attr->event_dsc[i] = obj->spec_attr->event_dsc[i + 1]; + } + obj->spec_attr->event_dsc_cnt--; + obj->spec_attr->event_dsc = lv_mem_realloc(obj->spec_attr->event_dsc, + obj->spec_attr->event_dsc_cnt * sizeof(lv_event_dsc_t)); + LV_ASSERT_MALLOC(obj->spec_attr->event_dsc); + return true; + } + } + + /*No event handler found*/ + return false; +} + +void * lv_obj_get_event_user_data(struct _lv_obj_t * obj, lv_event_cb_t event_cb) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + if(obj->spec_attr == NULL) return NULL; + + int32_t i = 0; + for(i = 0; i < obj->spec_attr->event_dsc_cnt; i++) { + if(event_cb == obj->spec_attr->event_dsc[i].cb) return obj->spec_attr->event_dsc[i].user_data; + } + return NULL; +} + +lv_indev_t * lv_event_get_indev(lv_event_t * e) +{ + + if(e->code == LV_EVENT_PRESSED || + e->code == LV_EVENT_PRESSING || + e->code == LV_EVENT_PRESS_LOST || + e->code == LV_EVENT_SHORT_CLICKED || + e->code == LV_EVENT_LONG_PRESSED || + e->code == LV_EVENT_LONG_PRESSED_REPEAT || + e->code == LV_EVENT_CLICKED || + e->code == LV_EVENT_RELEASED || + e->code == LV_EVENT_SCROLL_BEGIN || + e->code == LV_EVENT_SCROLL_END || + e->code == LV_EVENT_SCROLL || + e->code == LV_EVENT_GESTURE || + e->code == LV_EVENT_KEY || + e->code == LV_EVENT_FOCUSED || + e->code == LV_EVENT_DEFOCUSED || + e->code == LV_EVENT_LEAVE) { + return lv_event_get_param(e); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return NULL; + } +} + +lv_obj_draw_part_dsc_t * lv_event_get_draw_part_dsc(lv_event_t * e) +{ + if(e->code == LV_EVENT_DRAW_PART_BEGIN || + e->code == LV_EVENT_DRAW_PART_END) { + return lv_event_get_param(e); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return NULL; + } +} + +lv_draw_ctx_t * lv_event_get_draw_ctx(lv_event_t * e) +{ + if(e->code == LV_EVENT_DRAW_MAIN || + e->code == LV_EVENT_DRAW_MAIN_BEGIN || + e->code == LV_EVENT_DRAW_MAIN_END || + e->code == LV_EVENT_DRAW_POST || + e->code == LV_EVENT_DRAW_POST_BEGIN || + e->code == LV_EVENT_DRAW_POST_END) { + return lv_event_get_param(e); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return NULL; + } +} + +const lv_area_t * lv_event_get_old_size(lv_event_t * e) +{ + if(e->code == LV_EVENT_SIZE_CHANGED) { + return lv_event_get_param(e); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return NULL; + } +} + +uint32_t lv_event_get_key(lv_event_t * e) +{ + if(e->code == LV_EVENT_KEY) { + uint32_t * k = lv_event_get_param(e); + if(k) return *k; + else return 0; + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return 0; + } +} + +lv_anim_t * lv_event_get_scroll_anim(lv_event_t * e) +{ + if(e->code == LV_EVENT_SCROLL_BEGIN) { + return lv_event_get_param(e); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return 0; + } +} + +void lv_event_set_ext_draw_size(lv_event_t * e, lv_coord_t size) +{ + if(e->code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + lv_coord_t * cur_size = lv_event_get_param(e); + *cur_size = LV_MAX(*cur_size, size); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + } +} + +lv_point_t * lv_event_get_self_size_info(lv_event_t * e) +{ + if(e->code == LV_EVENT_GET_SELF_SIZE) { + return lv_event_get_param(e); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return 0; + } +} + +lv_hit_test_info_t * lv_event_get_hit_test_info(lv_event_t * e) +{ + if(e->code == LV_EVENT_HIT_TEST) { + return lv_event_get_param(e); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return 0; + } +} + +const lv_area_t * lv_event_get_cover_area(lv_event_t * e) +{ + if(e->code == LV_EVENT_COVER_CHECK) { + lv_cover_check_info_t * p = lv_event_get_param(e); + return p->area; + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return NULL; + } +} + +void lv_event_set_cover_res(lv_event_t * e, lv_cover_res_t res) +{ + if(e->code == LV_EVENT_COVER_CHECK) { + lv_cover_check_info_t * p = lv_event_get_param(e); + if(res > p->res) p->res = res; /*Save only "stronger" results*/ + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_event_dsc_t * lv_obj_get_event_dsc(const lv_obj_t * obj, uint32_t id) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(!obj->spec_attr) return NULL; + if(id >= obj->spec_attr->event_dsc_cnt) return NULL; + + return &obj->spec_attr->event_dsc[id]; +} + +static lv_res_t event_send_core(lv_event_t * e) +{ + EVENT_TRACE("Sending event %d to %p with %p param", e->code, (void *)e->current_target, e->param); + + /*Call the input device's feedback callback if set*/ + lv_indev_t * indev_act = lv_indev_get_act(); + if(indev_act) { + if(indev_act->driver->feedback_cb) indev_act->driver->feedback_cb(indev_act->driver, e->code); + if(e->stop_processing) return LV_RES_OK; + if(e->deleted) return LV_RES_INV; + } + + lv_res_t res = LV_RES_OK; + lv_event_dsc_t * event_dsc = lv_obj_get_event_dsc(e->current_target, 0); + + uint32_t i = 0; + while(event_dsc && res == LV_RES_OK) { + if(event_dsc->cb && ((event_dsc->filter & LV_EVENT_PREPROCESS) == LV_EVENT_PREPROCESS) + && (event_dsc->filter == (LV_EVENT_ALL | LV_EVENT_PREPROCESS) || + (event_dsc->filter & ~LV_EVENT_PREPROCESS) == e->code)) { + e->user_data = event_dsc->user_data; + event_dsc->cb(e); + + if(e->stop_processing) return LV_RES_OK; + /*Stop if the object is deleted*/ + if(e->deleted) return LV_RES_INV; + } + + i++; + event_dsc = lv_obj_get_event_dsc(e->current_target, i); + } + + res = lv_obj_event_base(NULL, e); + + event_dsc = res == LV_RES_INV ? NULL : lv_obj_get_event_dsc(e->current_target, 0); + + i = 0; + while(event_dsc && res == LV_RES_OK) { + if(event_dsc->cb && ((event_dsc->filter & LV_EVENT_PREPROCESS) == 0) + && (event_dsc->filter == LV_EVENT_ALL || event_dsc->filter == e->code)) { + e->user_data = event_dsc->user_data; + event_dsc->cb(e); + + if(e->stop_processing) return LV_RES_OK; + /*Stop if the object is deleted*/ + if(e->deleted) return LV_RES_INV; + } + + i++; + event_dsc = lv_obj_get_event_dsc(e->current_target, i); + } + + if(res == LV_RES_OK && e->current_target->parent && event_is_bubbled(e)) { + e->current_target = e->current_target->parent; + res = event_send_core(e); + if(res != LV_RES_OK) return LV_RES_INV; + } + + return res; +} + +static bool event_is_bubbled(lv_event_t * e) +{ + if(e->stop_bubbling) return false; + + /*Event codes that always bubble*/ + switch(e->code) { + case LV_EVENT_CHILD_CREATED: + case LV_EVENT_CHILD_DELETED: + return true; + default: + break; + } + + /*Check other codes only if bubbling is enabled*/ + if(lv_obj_has_flag(e->current_target, LV_OBJ_FLAG_EVENT_BUBBLE) == false) return false; + + switch(e->code) { + case LV_EVENT_HIT_TEST: + case LV_EVENT_COVER_CHECK: + case LV_EVENT_REFR_EXT_DRAW_SIZE: + case LV_EVENT_DRAW_MAIN_BEGIN: + case LV_EVENT_DRAW_MAIN: + case LV_EVENT_DRAW_MAIN_END: + case LV_EVENT_DRAW_POST_BEGIN: + case LV_EVENT_DRAW_POST: + case LV_EVENT_DRAW_POST_END: + case LV_EVENT_DRAW_PART_BEGIN: + case LV_EVENT_DRAW_PART_END: + case LV_EVENT_REFRESH: + case LV_EVENT_DELETE: + case LV_EVENT_CHILD_CREATED: + case LV_EVENT_CHILD_DELETED: + case LV_EVENT_CHILD_CHANGED: + case LV_EVENT_SIZE_CHANGED: + case LV_EVENT_STYLE_CHANGED: + case LV_EVENT_GET_SELF_SIZE: + return false; + default: + return true; + } +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_event.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_event.h new file mode 100644 index 0000000..d5a9eb6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_event.h @@ -0,0 +1,363 @@ +/** + * @file lv_event.h + * + */ + +#ifndef LV_EVENT_H +#define LV_EVENT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_obj_t; +struct _lv_event_dsc_t; + +/** + * Type of event being sent to the object. + */ +typedef enum { + LV_EVENT_ALL = 0, + + /** Input device events*/ + LV_EVENT_PRESSED, /**< The object has been pressed*/ + LV_EVENT_PRESSING, /**< The object is being pressed (called continuously while pressing)*/ + LV_EVENT_PRESS_LOST, /**< The object is still being pressed but slid cursor/finger off of the object */ + LV_EVENT_SHORT_CLICKED, /**< The object was pressed for a short period of time, then released it. Not called if scrolled.*/ + LV_EVENT_LONG_PRESSED, /**< Object has been pressed for at least `long_press_time`. Not called if scrolled.*/ + LV_EVENT_LONG_PRESSED_REPEAT, /**< Called after `long_press_time` in every `long_press_repeat_time` ms. Not called if scrolled.*/ + LV_EVENT_CLICKED, /**< Called on release if not scrolled (regardless to long press)*/ + LV_EVENT_RELEASED, /**< Called in every cases when the object has been released*/ + LV_EVENT_SCROLL_BEGIN, /**< Scrolling begins. The event parameter is a pointer to the animation of the scroll. Can be modified*/ + LV_EVENT_SCROLL_END, /**< Scrolling ends*/ + LV_EVENT_SCROLL, /**< Scrolling*/ + LV_EVENT_GESTURE, /**< A gesture is detected. Get the gesture with `lv_indev_get_gesture_dir(lv_indev_get_act());` */ + LV_EVENT_KEY, /**< A key is sent to the object. Get the key with `lv_indev_get_key(lv_indev_get_act());`*/ + LV_EVENT_FOCUSED, /**< The object is focused*/ + LV_EVENT_DEFOCUSED, /**< The object is defocused*/ + LV_EVENT_LEAVE, /**< The object is defocused but still selected*/ + LV_EVENT_HIT_TEST, /**< Perform advanced hit-testing*/ + + /** Drawing events*/ + LV_EVENT_COVER_CHECK, /**< Check if the object fully covers an area. The event parameter is `lv_cover_check_info_t *`.*/ + LV_EVENT_REFR_EXT_DRAW_SIZE, /**< Get the required extra draw area around the object (e.g. for shadow). The event parameter is `lv_coord_t *` to store the size.*/ + LV_EVENT_DRAW_MAIN_BEGIN, /**< Starting the main drawing phase*/ + LV_EVENT_DRAW_MAIN, /**< Perform the main drawing*/ + LV_EVENT_DRAW_MAIN_END, /**< Finishing the main drawing phase*/ + LV_EVENT_DRAW_POST_BEGIN, /**< Starting the post draw phase (when all children are drawn)*/ + LV_EVENT_DRAW_POST, /**< Perform the post draw phase (when all children are drawn)*/ + LV_EVENT_DRAW_POST_END, /**< Finishing the post draw phase (when all children are drawn)*/ + LV_EVENT_DRAW_PART_BEGIN, /**< Starting to draw a part. The event parameter is `lv_obj_draw_dsc_t *`. */ + LV_EVENT_DRAW_PART_END, /**< Finishing to draw a part. The event parameter is `lv_obj_draw_dsc_t *`. */ + + /** Special events*/ + LV_EVENT_VALUE_CHANGED, /**< The object's value has changed (i.e. slider moved)*/ + LV_EVENT_INSERT, /**< A text is inserted to the object. The event data is `char *` being inserted.*/ + LV_EVENT_REFRESH, /**< Notify the object to refresh something on it (for the user)*/ + LV_EVENT_READY, /**< A process has finished*/ + LV_EVENT_CANCEL, /**< A process has been cancelled */ + + /** Other events*/ + LV_EVENT_DELETE, /**< Object is being deleted*/ + LV_EVENT_CHILD_CHANGED, /**< Child was removed, added, or its size, position were changed */ + LV_EVENT_CHILD_CREATED, /**< Child was created, always bubbles up to all parents*/ + LV_EVENT_CHILD_DELETED, /**< Child was deleted, always bubbles up to all parents*/ + LV_EVENT_SCREEN_UNLOAD_START, /**< A screen unload started, fired immediately when scr_load is called*/ + LV_EVENT_SCREEN_LOAD_START, /**< A screen load started, fired when the screen change delay is expired*/ + LV_EVENT_SCREEN_LOADED, /**< A screen was loaded*/ + LV_EVENT_SCREEN_UNLOADED, /**< A screen was unloaded*/ + LV_EVENT_SIZE_CHANGED, /**< Object coordinates/size have changed*/ + LV_EVENT_STYLE_CHANGED, /**< Object's style has changed*/ + LV_EVENT_LAYOUT_CHANGED, /**< The children position has changed due to a layout recalculation*/ + LV_EVENT_GET_SELF_SIZE, /**< Get the internal size of a widget*/ + + _LV_EVENT_LAST, /** Number of default events*/ + + + LV_EVENT_PREPROCESS = 0x80, /** This is a flag that can be set with an event so it's processed + before the class default event processing */ +} lv_event_code_t; + +typedef struct _lv_event_t { + struct _lv_obj_t * target; + struct _lv_obj_t * current_target; + lv_event_code_t code; + void * user_data; + void * param; + struct _lv_event_t * prev; + uint8_t deleted : 1; + uint8_t stop_processing : 1; + uint8_t stop_bubbling : 1; +} lv_event_t; + +/** + * @brief Event callback. + * Events are used to notify the user of some action being taken on the object. + * For details, see ::lv_event_t. + */ +typedef void (*lv_event_cb_t)(lv_event_t * e); + +/** + * Used as the event parameter of ::LV_EVENT_HIT_TEST to check if an `point` can click the object or not. + * `res` should be set like this: + * - If already set to `false` an other event wants that point non clickable. If you want to respect it leave it as `false` or set `true` to overwrite it. + * - If already set `true` and `point` shouldn't be clickable set to `false` + * - If already set to `true` you agree that `point` can click the object leave it as `true` + */ +typedef struct { + const lv_point_t * point; /**< A point relative to screen to check if it can click the object or not*/ + bool res; /**< true: `point` can click the object; false: it cannot*/ +} lv_hit_test_info_t; + +/** + * Used as the event parameter of ::LV_EVENT_COVER_CHECK to check if an area is covered by the object or not. + * In the event use `const lv_area_t * area = lv_event_get_cover_area(e)` to get the area to check + * and `lv_event_set_cover_res(e, res)` to set the result. + */ +typedef struct { + lv_cover_res_t res; + const lv_area_t * area; +} lv_cover_check_info_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Send an event to the object + * @param obj pointer to an object + * @param event_code the type of the event from `lv_event_t` + * @param param arbitrary data depending on the widget type and the event. (Usually `NULL`) + * @return LV_RES_OK: `obj` was not deleted in the event; LV_RES_INV: `obj` was deleted in the event_code + */ +lv_res_t lv_event_send(struct _lv_obj_t * obj, lv_event_code_t event_code, void * param); + +/** + * Used by the widgets internally to call the ancestor widget types's event handler + * @param class_p pointer to the class of the widget (NOT the ancestor class) + * @param e pointer to the event descriptor + * @return LV_RES_OK: the target object was not deleted in the event; LV_RES_INV: it was deleted in the event_code + */ +lv_res_t lv_obj_event_base(const lv_obj_class_t * class_p, lv_event_t * e); + +/** + * Get the object originally targeted by the event. It's the same even if the event is bubbled. + * @param e pointer to the event descriptor + * @return the target of the event_code + */ +struct _lv_obj_t * lv_event_get_target(lv_event_t * e); + +/** + * Get the current target of the event. It's the object which event handler being called. + * If the event is not bubbled it's the same as "normal" target. + * @param e pointer to the event descriptor + * @return pointer to the current target of the event_code + */ +struct _lv_obj_t * lv_event_get_current_target(lv_event_t * e); + +/** + * Get the event code of an event + * @param e pointer to the event descriptor + * @return the event code. (E.g. `LV_EVENT_CLICKED`, `LV_EVENT_FOCUSED`, etc) + */ +lv_event_code_t lv_event_get_code(lv_event_t * e); + +/** + * Get the parameter passed when the event was sent + * @param e pointer to the event descriptor + * @return pointer to the parameter + */ +void * lv_event_get_param(lv_event_t * e); + +/** + * Get the user_data passed when the event was registered on the object + * @param e pointer to the event descriptor + * @return pointer to the user_data + */ +void * lv_event_get_user_data(lv_event_t * e); + +/** + * Stop the event from bubbling. + * This is only valid when called in the middle of an event processing chain. + * @param e pointer to the event descriptor + */ +void lv_event_stop_bubbling(lv_event_t * e); + +/** + * Stop processing this event. + * This is only valid when called in the middle of an event processing chain. + * @param e pointer to the event descriptor + */ +void lv_event_stop_processing(lv_event_t * e); + +/** + * Register a new, custom event ID. + * It can be used the same way as e.g. `LV_EVENT_CLICKED` to send custom events + * @return the new event id + * @example + * uint32_t LV_EVENT_MINE = 0; + * ... + * e = lv_event_register_id(); + * ... + * lv_event_send(obj, LV_EVENT_MINE, &some_data); + */ +uint32_t lv_event_register_id(void); + +/** + * Nested events can be called and one of them might belong to an object that is being deleted. + * Mark this object's `event_temp_data` deleted to know that its `lv_event_send` should return `LV_RES_INV` + * @param obj pointer to an object to mark as deleted + */ +void _lv_event_mark_deleted(struct _lv_obj_t * obj); + + +/** + * Add an event handler function for an object. + * Used by the user to react on event which happens with the object. + * An object can have multiple event handler. They will be called in the same order as they were added. + * @param obj pointer to an object + * @param filter and event code (e.g. `LV_EVENT_CLICKED`) on which the event should be called. `LV_EVENT_ALL` can be sued the receive all the events. + * @param event_cb the new event function + * @param user_data custom data data will be available in `event_cb` + * @return a pointer the event descriptor. Can be used in ::lv_obj_remove_event_dsc + */ +struct _lv_event_dsc_t * lv_obj_add_event_cb(struct _lv_obj_t * obj, lv_event_cb_t event_cb, lv_event_code_t filter, + void * user_data); + +/** + * Remove an event handler function for an object. + * @param obj pointer to an object + * @param event_cb the event function to remove, or `NULL` to remove the firstly added event callback + * @return true if any event handlers were removed + */ +bool lv_obj_remove_event_cb(struct _lv_obj_t * obj, lv_event_cb_t event_cb); + +/** + * Remove an event handler function with a specific user_data from an object. + * @param obj pointer to an object + * @param event_cb the event function to remove, or `NULL` only `user_data` matters. + * @param event_user_data the user_data specified in ::lv_obj_add_event_cb + * @return true if any event handlers were removed + */ +bool lv_obj_remove_event_cb_with_user_data(struct _lv_obj_t * obj, lv_event_cb_t event_cb, + const void * event_user_data); + +/** + * DEPRECATED because doesn't work if multiple event handlers are added to an object. + * Remove an event handler function for an object. + * @param obj pointer to an object + * @param event_dsc pointer to an event descriptor to remove (returned by ::lv_obj_add_event_cb) + * @return true if any event handlers were removed + */ +bool lv_obj_remove_event_dsc(struct _lv_obj_t * obj, struct _lv_event_dsc_t * event_dsc); + +/** + * The user data of an event object event callback. Always the first match with `event_cb` will be returned. + * @param obj pointer to an object + * @param event_cb the event function + * @return the user_data + */ +void * lv_obj_get_event_user_data(struct _lv_obj_t * obj, lv_event_cb_t event_cb); + +/** + * Get the input device passed as parameter to indev related events. + * @param e pointer to an event + * @return the indev that triggered the event or NULL if called on a not indev related event + */ +lv_indev_t * lv_event_get_indev(lv_event_t * e); + +/** + * Get the part draw descriptor passed as parameter to `LV_EVENT_DRAW_PART_BEGIN/END`. + * @param e pointer to an event + * @return the part draw descriptor to hook the drawing or NULL if called on an unrelated event + */ +lv_obj_draw_part_dsc_t * lv_event_get_draw_part_dsc(lv_event_t * e); + +/** + * Get the draw context which should be the first parameter of the draw functions. + * Namely: `LV_EVENT_DRAW_MAIN/POST`, `LV_EVENT_DRAW_MAIN/POST_BEGIN`, `LV_EVENT_DRAW_MAIN/POST_END` + * @param e pointer to an event + * @return pointer to a draw context or NULL if called on an unrelated event + */ +lv_draw_ctx_t * lv_event_get_draw_ctx(lv_event_t * e); + +/** + * Get the old area of the object before its size was changed. Can be used in `LV_EVENT_SIZE_CHANGED` + * @param e pointer to an event + * @return the old absolute area of the object or NULL if called on an unrelated event + */ +const lv_area_t * lv_event_get_old_size(lv_event_t * e); + +/** + * Get the key passed as parameter to an event. Can be used in `LV_EVENT_KEY` + * @param e pointer to an event + * @return the triggering key or NULL if called on an unrelated event + */ +uint32_t lv_event_get_key(lv_event_t * e); + +/** + * Get the animation descriptor of a scrolling. Can be used in `LV_EVENT_SCROLL_BEGIN` + * @param e pointer to an event + * @return the animation that will scroll the object. (can be modified as required) + */ +lv_anim_t * lv_event_get_scroll_anim(lv_event_t * e); + +/** + * Set the new extra draw size. Can be used in `LV_EVENT_REFR_EXT_DRAW_SIZE` + * @param e pointer to an event + * @param size The new extra draw size + */ +void lv_event_set_ext_draw_size(lv_event_t * e, lv_coord_t size); + +/** + * Get a pointer to an `lv_point_t` variable in which the self size should be saved (width in `point->x` and height `point->y`). + * Can be used in `LV_EVENT_GET_SELF_SIZE` + * @param e pointer to an event + * @return pointer to `lv_point_t` or NULL if called on an unrelated event + */ +lv_point_t * lv_event_get_self_size_info(lv_event_t * e); + +/** + * Get a pointer to an `lv_hit_test_info_t` variable in which the hit test result should be saved. Can be used in `LV_EVENT_HIT_TEST` + * @param e pointer to an event + * @return pointer to `lv_hit_test_info_t` or NULL if called on an unrelated event + */ +lv_hit_test_info_t * lv_event_get_hit_test_info(lv_event_t * e); + +/** + * Get a pointer to an area which should be examined whether the object fully covers it or not. + * Can be used in `LV_EVENT_HIT_TEST` + * @param e pointer to an event + * @return an area with absolute coordinates to check + */ +const lv_area_t * lv_event_get_cover_area(lv_event_t * e); + +/** + * Set the result of cover checking. Can be used in `LV_EVENT_COVER_CHECK` + * @param e pointer to an event + * @param res an element of ::lv_cover_check_info_t + */ +void lv_event_set_cover_res(lv_event_t * e, lv_cover_res_t res); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_EVENT_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_group.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_group.c new file mode 100644 index 0000000..2c4fa93 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_group.c @@ -0,0 +1,497 @@ +/** + * @file lv_group.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include + +#include "lv_group.h" +#include "../misc/lv_gc.h" +#include "../core/lv_obj.h" +#include "../core/lv_indev.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static bool focus_next_core(lv_group_t * group, void * (*begin)(const lv_ll_t *), + void * (*move)(const lv_ll_t *, const void *)); +static void lv_group_refocus(lv_group_t * g); +static lv_indev_t * get_indev(const lv_group_t * g); + +/********************** + * STATIC VARIABLES + **********************/ +static lv_group_t * default_group; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void _lv_group_init(void) +{ + _lv_ll_init(&LV_GC_ROOT(_lv_group_ll), sizeof(lv_group_t)); +} + +lv_group_t * lv_group_create(void) +{ + lv_group_t * group = _lv_ll_ins_head(&LV_GC_ROOT(_lv_group_ll)); + LV_ASSERT_MALLOC(group); + if(group == NULL) return NULL; + _lv_ll_init(&group->obj_ll, sizeof(lv_obj_t *)); + + group->obj_focus = NULL; + group->frozen = 0; + group->focus_cb = NULL; + group->edge_cb = NULL; + group->editing = 0; + group->refocus_policy = LV_GROUP_REFOCUS_POLICY_PREV; + group->wrap = 1; + +#if LV_USE_USER_DATA + group->user_data = NULL; +#endif + + return group; +} + +void lv_group_del(lv_group_t * group) +{ + /*Defocus the currently focused object*/ + if(group->obj_focus != NULL) { + lv_event_send(*group->obj_focus, LV_EVENT_DEFOCUSED, get_indev(group)); + lv_obj_invalidate(*group->obj_focus); + } + + /*Remove the objects from the group*/ + lv_obj_t ** obj; + _LV_LL_READ(&group->obj_ll, obj) { + if((*obj)->spec_attr)(*obj)->spec_attr->group_p = NULL; + } + + /*Remove the group from any indev devices */ + lv_indev_t * indev = lv_indev_get_next(NULL); + while(indev) { + if(indev->group == group) { + lv_indev_set_group(indev, NULL); + } + indev = lv_indev_get_next(indev); + } + + _lv_ll_clear(&(group->obj_ll)); + _lv_ll_remove(&LV_GC_ROOT(_lv_group_ll), group); + lv_mem_free(group); +} + +void lv_group_set_default(lv_group_t * group) +{ + default_group = group; +} + +lv_group_t * lv_group_get_default(void) +{ + return default_group; +} + +void lv_group_add_obj(lv_group_t * group, lv_obj_t * obj) +{ + if(group == NULL) return; + + LV_LOG_TRACE("begin"); + + /*Be sure the object is removed from its current group*/ + lv_group_remove_obj(obj); + + /*Do not add the object twice*/ + lv_obj_t ** obj_i; + _LV_LL_READ(&group->obj_ll, obj_i) { + if((*obj_i) == obj) { + LV_LOG_INFO("the object is already added to this group"); + return; + } + } + + /*If the object is already in a group and focused then refocus it*/ + lv_group_t * group_cur = lv_obj_get_group(obj); + if(group_cur) { + if(obj->spec_attr->group_p && *(obj->spec_attr->group_p->obj_focus) == obj) { + lv_group_refocus(group_cur); + + LV_LOG_INFO("changing object's group"); + } + } + + if(obj->spec_attr == NULL) lv_obj_allocate_spec_attr(obj); + obj->spec_attr->group_p = group; + + lv_obj_t ** next = _lv_ll_ins_tail(&group->obj_ll); + LV_ASSERT_MALLOC(next); + if(next == NULL) return; + *next = obj; + + /*If the head and the tail is equal then there is only one object in the linked list. + *In this case automatically activate it*/ + if(_lv_ll_get_head(&group->obj_ll) == next) { + lv_group_refocus(group); + } + + LV_LOG_TRACE("finished"); +} + +void lv_group_swap_obj(lv_obj_t * obj1, lv_obj_t * obj2) +{ + lv_group_t * g1 = lv_obj_get_group(obj1); + lv_group_t * g2 = lv_obj_get_group(obj2); + if(g1 != g2) return; + if(g1 == NULL) return; + + /*Do not add the object twice*/ + lv_obj_t ** obj_i; + _LV_LL_READ(&g1->obj_ll, obj_i) { + if((*obj_i) == obj1)(*obj_i) = obj2; + else if((*obj_i) == obj2)(*obj_i) = obj1; + } + + if(*g1->obj_focus == obj1) lv_group_focus_obj(obj2); + else if(*g1->obj_focus == obj2) lv_group_focus_obj(obj1); + +} + +void lv_group_remove_obj(lv_obj_t * obj) +{ + lv_group_t * g = lv_obj_get_group(obj); + if(g == NULL) return; + + LV_LOG_TRACE("begin"); + + /*Focus on the next object*/ + if(g->obj_focus && *g->obj_focus == obj) { + if(g->frozen) g->frozen = 0; + + /*If this is the only object in the group then focus to nothing.*/ + if(_lv_ll_get_head(&g->obj_ll) == g->obj_focus && _lv_ll_get_tail(&g->obj_ll) == g->obj_focus) { + lv_event_send(*g->obj_focus, LV_EVENT_DEFOCUSED, get_indev(g)); + } + /*If there more objects in the group then focus to the next/prev object*/ + else { + lv_group_refocus(g); + } + } + + /*If the focuses object is still the same then it was the only object in the group but it will + *be deleted. Set the `obj_focus` to NULL to get back to the initial state of the group with + *zero objects*/ + if(g->obj_focus && *g->obj_focus == obj) { + g->obj_focus = NULL; + } + + /*Search the object and remove it from its group*/ + lv_obj_t ** i; + _LV_LL_READ(&g->obj_ll, i) { + if(*i == obj) { + _lv_ll_remove(&g->obj_ll, i); + lv_mem_free(i); + if(obj->spec_attr) obj->spec_attr->group_p = NULL; + break; + } + } + LV_LOG_TRACE("finished"); +} + +void lv_group_remove_all_objs(lv_group_t * group) +{ + /*Defocus the currently focused object*/ + if(group->obj_focus != NULL) { + lv_event_send(*group->obj_focus, LV_EVENT_DEFOCUSED, get_indev(group)); + lv_obj_invalidate(*group->obj_focus); + group->obj_focus = NULL; + } + + /*Remove the objects from the group*/ + lv_obj_t ** obj; + _LV_LL_READ(&group->obj_ll, obj) { + if((*obj)->spec_attr)(*obj)->spec_attr->group_p = NULL; + } + + _lv_ll_clear(&(group->obj_ll)); +} + +void lv_group_focus_obj(lv_obj_t * obj) +{ + if(obj == NULL) return; + lv_group_t * g = lv_obj_get_group(obj); + if(g == NULL) return; + + if(g->frozen != 0) return; + + /*On defocus edit mode must be leaved*/ + lv_group_set_editing(g, false); + + lv_obj_t ** i; + _LV_LL_READ(&g->obj_ll, i) { + if(*i == obj) { + if(g->obj_focus != NULL && obj != *g->obj_focus) { /*Do not defocus if the same object needs to be focused again*/ + lv_res_t res = lv_event_send(*g->obj_focus, LV_EVENT_DEFOCUSED, get_indev(g)); + if(res != LV_RES_OK) return; + lv_obj_invalidate(*g->obj_focus); + } + + g->obj_focus = i; + + if(g->obj_focus != NULL) { + if(g->focus_cb) g->focus_cb(g); + lv_res_t res = lv_event_send(*g->obj_focus, LV_EVENT_FOCUSED, get_indev(g)); + if(res != LV_RES_OK) return; + lv_obj_invalidate(*g->obj_focus); + } + break; + } + } +} + +void lv_group_focus_next(lv_group_t * group) +{ + bool focus_changed = focus_next_core(group, _lv_ll_get_head, _lv_ll_get_next); + if(group->edge_cb) { + if(!focus_changed) + group->edge_cb(group, true); + } +} + +void lv_group_focus_prev(lv_group_t * group) +{ + bool focus_changed = focus_next_core(group, _lv_ll_get_tail, _lv_ll_get_prev); + if(group->edge_cb) { + if(!focus_changed) + group->edge_cb(group, false); + } +} + +void lv_group_focus_freeze(lv_group_t * group, bool en) +{ + if(en == false) group->frozen = 0; + else group->frozen = 1; +} + +lv_res_t lv_group_send_data(lv_group_t * group, uint32_t c) +{ + lv_obj_t * act = lv_group_get_focused(group); + if(act == NULL) return LV_RES_OK; + + if(lv_obj_has_state(act, LV_STATE_DISABLED)) return LV_RES_OK; + + return lv_event_send(act, LV_EVENT_KEY, &c); +} + +void lv_group_set_focus_cb(lv_group_t * group, lv_group_focus_cb_t focus_cb) +{ + group->focus_cb = focus_cb; +} + +void lv_group_set_edge_cb(lv_group_t * group, lv_group_edge_cb_t edge_cb) +{ + group->edge_cb = edge_cb; +} + +void lv_group_set_editing(lv_group_t * group, bool edit) +{ + if(group == NULL) return; + uint8_t en_val = edit ? 1 : 0; + + if(en_val == group->editing) return; /*Do not set the same mode again*/ + + group->editing = en_val; + lv_obj_t * focused = lv_group_get_focused(group); + + if(focused) { + lv_res_t res = lv_event_send(*group->obj_focus, LV_EVENT_FOCUSED, get_indev(group)); + if(res != LV_RES_OK) return; + + lv_obj_invalidate(focused); + } +} + +void lv_group_set_refocus_policy(lv_group_t * group, lv_group_refocus_policy_t policy) +{ + group->refocus_policy = policy & 0x01; +} + +void lv_group_set_wrap(lv_group_t * group, bool en) +{ + group->wrap = en ? 1 : 0; +} + +lv_obj_t * lv_group_get_focused(const lv_group_t * group) +{ + if(!group) return NULL; + if(group->obj_focus == NULL) return NULL; + + return *group->obj_focus; +} + +lv_group_focus_cb_t lv_group_get_focus_cb(const lv_group_t * group) +{ + if(!group) return NULL; + return group->focus_cb; +} + +lv_group_edge_cb_t lv_group_get_edge_cb(const lv_group_t * group) +{ + if(!group) return NULL; + return group->edge_cb; +} + +bool lv_group_get_editing(const lv_group_t * group) +{ + if(!group) return false; + return group->editing ? true : false; +} + +bool lv_group_get_wrap(lv_group_t * group) +{ + if(!group) return false; + return group->wrap ? true : false; +} + +uint32_t lv_group_get_obj_count(lv_group_t * group) +{ + return _lv_ll_get_len(&group->obj_ll); +} +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_group_refocus(lv_group_t * g) +{ + /*Refocus must temporarily allow wrapping to work correctly*/ + uint8_t temp_wrap = g->wrap; + g->wrap = 1; + + if(g->refocus_policy == LV_GROUP_REFOCUS_POLICY_NEXT) + lv_group_focus_next(g); + else if(g->refocus_policy == LV_GROUP_REFOCUS_POLICY_PREV) + lv_group_focus_prev(g); + /*Restore wrap property*/ + g->wrap = temp_wrap; +} + +static bool focus_next_core(lv_group_t * group, void * (*begin)(const lv_ll_t *), + void * (*move)(const lv_ll_t *, const void *)) +{ + bool focus_changed = false; + if(group->frozen) return focus_changed; + + lv_obj_t ** obj_next = group->obj_focus; + lv_obj_t ** obj_sentinel = NULL; + bool can_move = true; + bool can_begin = true; + + for(;;) { + if(obj_next == NULL) { + if(group->wrap || obj_sentinel == NULL) { + if(!can_begin) return focus_changed; + obj_next = begin(&group->obj_ll); + can_move = false; + can_begin = false; + } + else { + /*Currently focused object is the last/first in the group, keep it that way*/ + return focus_changed; + } + } + + if(obj_sentinel == NULL) { + obj_sentinel = obj_next; + if(obj_sentinel == NULL) return focus_changed; /*Group is empty*/ + } + + if(can_move) { + obj_next = move(&group->obj_ll, obj_next); + + /*Give up if we walked the entire list and haven't found another visible object*/ + if(obj_next == obj_sentinel) return focus_changed; + } + + can_move = true; + + if(obj_next == NULL) continue; + if(lv_obj_get_state(*obj_next) & LV_STATE_DISABLED) continue; + + /*Hidden objects don't receive focus. + *If any parent is hidden, the object is also hidden)*/ + lv_obj_t * parent = *obj_next; + while(parent) { + if(lv_obj_has_flag(parent, LV_OBJ_FLAG_HIDDEN)) break; + parent = lv_obj_get_parent(parent); + } + + if(parent && lv_obj_has_flag(parent, LV_OBJ_FLAG_HIDDEN)) continue; + + /*If we got her a good candidate is found*/ + break; + } + + if(obj_next == group->obj_focus) return focus_changed; /*There's only one visible object and it's already focused*/ + + if(group->obj_focus) { + lv_res_t res = lv_event_send(*group->obj_focus, LV_EVENT_DEFOCUSED, get_indev(group)); + if(res != LV_RES_OK) return focus_changed; + lv_obj_invalidate(*group->obj_focus); + } + + group->obj_focus = obj_next; + + lv_res_t res = lv_event_send(*group->obj_focus, LV_EVENT_FOCUSED, get_indev(group)); + if(res != LV_RES_OK) return focus_changed; + + lv_obj_invalidate(*group->obj_focus); + + if(group->focus_cb) group->focus_cb(group); + focus_changed = true; + return focus_changed; +} + +/** + * Find an indev preferably with KEYPAD or ENCOEDR type that uses the given group. + * In other words, find an indev, that is related to the given group. + * In the worst case simply return the latest indev + * @param g a group the find in the indevs + * @return the suggested indev + */ +static lv_indev_t * get_indev(const lv_group_t * g) +{ + lv_indev_t * indev_encoder = NULL; + lv_indev_t * indev_group = NULL; + lv_indev_t * indev = lv_indev_get_next(NULL); + while(indev) { + lv_indev_type_t indev_type = lv_indev_get_type(indev); + if(indev->group == g) { + /*Prefer KEYPAD*/ + if(indev_type == LV_INDEV_TYPE_KEYPAD) return indev; + if(indev_type == LV_INDEV_TYPE_ENCODER) indev_encoder = indev; + indev_group = indev; + } + indev = lv_indev_get_next(indev); + } + + if(indev_encoder) return indev_encoder; + if(indev_group) return indev_group; + + /*In lack of a better option use the first input device. (It can be NULL if there is no input device)*/ + return lv_indev_get_next(NULL); +} + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_group.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_group.h new file mode 100644 index 0000000..0910597 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_group.h @@ -0,0 +1,266 @@ +/** + * @file lv_group.h + * + */ + +#ifndef LV_GROUP_H +#define LV_GROUP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lv_conf_internal.h" + +#include +#include +#include "../misc/lv_ll.h" +#include "../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ +/*Predefined keys to control the focused object via lv_group_send(group, c)*/ + +enum { + LV_KEY_UP = 17, /*0x11*/ + LV_KEY_DOWN = 18, /*0x12*/ + LV_KEY_RIGHT = 19, /*0x13*/ + LV_KEY_LEFT = 20, /*0x14*/ + LV_KEY_ESC = 27, /*0x1B*/ + LV_KEY_DEL = 127, /*0x7F*/ + LV_KEY_BACKSPACE = 8, /*0x08*/ + LV_KEY_ENTER = 10, /*0x0A, '\n'*/ + LV_KEY_NEXT = 9, /*0x09, '\t'*/ + LV_KEY_PREV = 11, /*0x0B, '*/ + LV_KEY_HOME = 2, /*0x02, STX*/ + LV_KEY_END = 3, /*0x03, ETX*/ +}; +typedef uint8_t lv_key_t; + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_obj_t; +struct _lv_group_t; + +typedef void (*lv_group_focus_cb_t)(struct _lv_group_t *); +typedef void (*lv_group_edge_cb_t)(struct _lv_group_t *, bool); + +/** + * Groups can be used to logically hold objects so that they can be individually focused. + * They are NOT for laying out objects on a screen (try layouts for that). + */ +typedef struct _lv_group_t { + lv_ll_t obj_ll; /**< Linked list to store the objects in the group*/ + struct _lv_obj_t ** obj_focus; /**< The object in focus*/ + + lv_group_focus_cb_t focus_cb; /**< A function to call when a new object is focused (optional)*/ + lv_group_edge_cb_t edge_cb; /**< A function to call when an edge is reached, no more focus + targets are available in this direction (to allow edge feedback + like a sound or a scroll bounce) */ + +#if LV_USE_USER_DATA + void * user_data; +#endif + + uint8_t frozen : 1; /**< 1: can't focus to new object*/ + uint8_t editing : 1; /**< 1: Edit mode, 0: Navigate mode*/ + uint8_t refocus_policy : 1; /**< 1: Focus prev if focused on deletion. 0: Focus next if focused on + deletion.*/ + uint8_t wrap : 1; /**< 1: Focus next/prev can wrap at end of list. 0: Focus next/prev stops at end + of list.*/ +} lv_group_t; + + +typedef enum { + LV_GROUP_REFOCUS_POLICY_NEXT = 0, + LV_GROUP_REFOCUS_POLICY_PREV = 1 +} lv_group_refocus_policy_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Init. the group module + * @remarks Internal function, do not call directly. + */ +void _lv_group_init(void); + +/** + * Create a new object group + * @return pointer to the new object group + */ +lv_group_t * lv_group_create(void); + +/** + * Delete a group object + * @param group pointer to a group + */ +void lv_group_del(lv_group_t * group); + +/** + * Set a default group. New object are added to this group if it's enabled in their class with `add_to_def_group = true` + * @param group pointer to a group (can be `NULL`) + */ +void lv_group_set_default(lv_group_t * group); + +/** + * Get the default group + * @return pointer to the default group + */ +lv_group_t * lv_group_get_default(void); + +/** + * Add an object to a group + * @param group pointer to a group + * @param obj pointer to an object to add + */ +void lv_group_add_obj(lv_group_t * group, struct _lv_obj_t * obj); + +/** + * Swap 2 object in a group. The object must be in the same group + * @param obj1 pointer to an object + * @param obj2 pointer to an other object + */ +void lv_group_swap_obj(struct _lv_obj_t * obj1, struct _lv_obj_t * obj2); + +/** + * Remove an object from its group + * @param obj pointer to an object to remove + */ +void lv_group_remove_obj(struct _lv_obj_t * obj); + +/** + * Remove all objects from a group + * @param group pointer to a group + */ +void lv_group_remove_all_objs(lv_group_t * group); + +/** + * Focus on an object (defocus the current) + * @param obj pointer to an object to focus on + */ +void lv_group_focus_obj(struct _lv_obj_t * obj); + +/** + * Focus the next object in a group (defocus the current) + * @param group pointer to a group + */ +void lv_group_focus_next(lv_group_t * group); + +/** + * Focus the previous object in a group (defocus the current) + * @param group pointer to a group + */ +void lv_group_focus_prev(lv_group_t * group); + +/** + * Do not let to change the focus from the current object + * @param group pointer to a group + * @param en true: freeze, false: release freezing (normal mode) + */ +void lv_group_focus_freeze(lv_group_t * group, bool en); + +/** + * Send a control character to the focuses object of a group + * @param group pointer to a group + * @param c a character (use LV_KEY_.. to navigate) + * @return result of focused object in group. + */ +lv_res_t lv_group_send_data(lv_group_t * group, uint32_t c); + +/** + * Set a function for a group which will be called when a new object is focused + * @param group pointer to a group + * @param focus_cb the call back function or NULL if unused + */ +void lv_group_set_focus_cb(lv_group_t * group, lv_group_focus_cb_t focus_cb); + +/** + * Set a function for a group which will be called when a focus edge is reached + * @param group pointer to a group + * @param edge_cb the call back function or NULL if unused + */ +void lv_group_set_edge_cb(lv_group_t * group, lv_group_edge_cb_t edge_cb); + + +/** + * Set whether the next or previous item in a group is focused if the currently focused obj is + * deleted. + * @param group pointer to a group + * @param policy new refocus policy enum + */ +void lv_group_set_refocus_policy(lv_group_t * group, lv_group_refocus_policy_t policy); + +/** + * Manually set the current mode (edit or navigate). + * @param group pointer to group + * @param edit true: edit mode; false: navigate mode + */ +void lv_group_set_editing(lv_group_t * group, bool edit); + +/** + * Set whether focus next/prev will allow wrapping from first->last or last->first object. + * @param group pointer to group + * @param en true: wrapping enabled; false: wrapping disabled + */ +void lv_group_set_wrap(lv_group_t * group, bool en); + +/** + * Get the focused object or NULL if there isn't one + * @param group pointer to a group + * @return pointer to the focused object + */ +struct _lv_obj_t * lv_group_get_focused(const lv_group_t * group); + +/** + * Get the focus callback function of a group + * @param group pointer to a group + * @return the call back function or NULL if not set + */ +lv_group_focus_cb_t lv_group_get_focus_cb(const lv_group_t * group); + +/** + * Get the edge callback function of a group + * @param group pointer to a group + * @return the call back function or NULL if not set + */ +lv_group_edge_cb_t lv_group_get_edge_cb(const lv_group_t * group); + +/** + * Get the current mode (edit or navigate). + * @param group pointer to group + * @return true: edit mode; false: navigate mode + */ +bool lv_group_get_editing(const lv_group_t * group); + +/** + * Get whether focus next/prev will allow wrapping from first->last or last->first object. + * @param group pointer to group + * @param en true: wrapping enabled; false: wrapping disabled + */ +bool lv_group_get_wrap(lv_group_t * group); + +/** + * Get the number of object in the group + * @param group pointer to a group + * @return number of objects in the group + */ +uint32_t lv_group_get_obj_count(lv_group_t * group); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GROUP_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_indev.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_indev.c new file mode 100644 index 0000000..ab1265e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_indev.c @@ -0,0 +1,1161 @@ +/** + * @file lv_indev.c + * + */ + +/********************* + * INCLUDES + ********************/ +#include "lv_indev.h" +#include "lv_disp.h" +#include "lv_obj.h" +#include "lv_indev_scroll.h" +#include "lv_group.h" +#include "lv_refr.h" + +#include "../hal/lv_hal_tick.h" +#include "../misc/lv_timer.h" +#include "../misc/lv_math.h" + +/********************* + * DEFINES + *********************/ +#if LV_INDEV_DEF_SCROLL_THROW <= 0 + #warning "LV_INDEV_DRAG_THROW must be greater than 0" +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void indev_pointer_proc(lv_indev_t * i, lv_indev_data_t * data); +static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data); +static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data); +static void indev_button_proc(lv_indev_t * i, lv_indev_data_t * data); +static void indev_proc_press(_lv_indev_proc_t * proc); +static void indev_proc_release(_lv_indev_proc_t * proc); +static void indev_proc_reset_query_handler(lv_indev_t * indev); +static void indev_click_focus(_lv_indev_proc_t * proc); +static void indev_gesture(_lv_indev_proc_t * proc); +static bool indev_reset_check(_lv_indev_proc_t * proc); + +/********************** + * STATIC VARIABLES + **********************/ +static lv_indev_t * indev_act; +static lv_obj_t * indev_obj_act = NULL; + +/********************** + * MACROS + **********************/ +#if LV_LOG_TRACE_INDEV + #define INDEV_TRACE(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define INDEV_TRACE(...) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_indev_read_timer_cb(lv_timer_t * timer) +{ + INDEV_TRACE("begin"); + + lv_indev_data_t data; + + indev_act = timer->user_data; + + /*Read and process all indevs*/ + if(indev_act->driver->disp == NULL) return; /*Not assigned to any displays*/ + + /*Handle reset query before processing the point*/ + indev_proc_reset_query_handler(indev_act); + + if(indev_act->proc.disabled || + indev_act->driver->disp->prev_scr != NULL) return; /*Input disabled or screen animation active*/ + bool continue_reading; + do { + /*Read the data*/ + _lv_indev_read(indev_act, &data); + continue_reading = data.continue_reading; + + /*The active object might be deleted even in the read function*/ + indev_proc_reset_query_handler(indev_act); + indev_obj_act = NULL; + + indev_act->proc.state = data.state; + + /*Save the last activity time*/ + if(indev_act->proc.state == LV_INDEV_STATE_PRESSED) { + indev_act->driver->disp->last_activity_time = lv_tick_get(); + } + else if(indev_act->driver->type == LV_INDEV_TYPE_ENCODER && data.enc_diff) { + indev_act->driver->disp->last_activity_time = lv_tick_get(); + } + + if(indev_act->driver->type == LV_INDEV_TYPE_POINTER) { + indev_pointer_proc(indev_act, &data); + } + else if(indev_act->driver->type == LV_INDEV_TYPE_KEYPAD) { + indev_keypad_proc(indev_act, &data); + } + else if(indev_act->driver->type == LV_INDEV_TYPE_ENCODER) { + indev_encoder_proc(indev_act, &data); + } + else if(indev_act->driver->type == LV_INDEV_TYPE_BUTTON) { + indev_button_proc(indev_act, &data); + } + /*Handle reset query if it happened in during processing*/ + indev_proc_reset_query_handler(indev_act); + } while(continue_reading); + + /*End of indev processing, so no act indev*/ + indev_act = NULL; + indev_obj_act = NULL; + + INDEV_TRACE("finished"); +} + +void lv_indev_enable(lv_indev_t * indev, bool en) +{ + uint8_t enable = en ? 0 : 1; + + if(indev) { + indev->proc.disabled = enable; + } + else { + lv_indev_t * i = lv_indev_get_next(NULL); + while(i) { + i->proc.disabled = enable; + i = lv_indev_get_next(i); + } + } +} + +lv_indev_t * lv_indev_get_act(void) +{ + return indev_act; +} + +lv_indev_type_t lv_indev_get_type(const lv_indev_t * indev) +{ + if(indev == NULL) return LV_INDEV_TYPE_NONE; + + return indev->driver->type; +} + +void lv_indev_reset(lv_indev_t * indev, lv_obj_t * obj) +{ + if(indev) { + indev->proc.reset_query = 1; + if(indev_act == indev) indev_obj_act = NULL; + if(indev->driver->type == LV_INDEV_TYPE_POINTER || indev->driver->type == LV_INDEV_TYPE_KEYPAD) { + if(obj == NULL || indev->proc.types.pointer.last_pressed == obj) { + indev->proc.types.pointer.last_pressed = NULL; + } + if(obj == NULL || indev->proc.types.pointer.act_obj == obj) { + indev->proc.types.pointer.act_obj = NULL; + } + if(obj == NULL || indev->proc.types.pointer.last_obj == obj) { + indev->proc.types.pointer.last_obj = NULL; + } + } + } + else { + lv_indev_t * i = lv_indev_get_next(NULL); + while(i) { + i->proc.reset_query = 1; + if(i->driver->type == LV_INDEV_TYPE_POINTER || i->driver->type == LV_INDEV_TYPE_KEYPAD) { + if(obj == NULL || i->proc.types.pointer.last_pressed == obj) { + i->proc.types.pointer.last_pressed = NULL; + } + if(obj == NULL || i->proc.types.pointer.act_obj == obj) { + i->proc.types.pointer.act_obj = NULL; + } + if(obj == NULL || i->proc.types.pointer.last_obj == obj) { + i->proc.types.pointer.last_obj = NULL; + } + } + i = lv_indev_get_next(i); + } + indev_obj_act = NULL; + } +} + +void lv_indev_reset_long_press(lv_indev_t * indev) +{ + indev->proc.long_pr_sent = 0; + indev->proc.longpr_rep_timestamp = lv_tick_get(); + indev->proc.pr_timestamp = lv_tick_get(); +} + +void lv_indev_set_cursor(lv_indev_t * indev, lv_obj_t * cur_obj) +{ + if(indev->driver->type != LV_INDEV_TYPE_POINTER) return; + + indev->cursor = cur_obj; + lv_obj_set_parent(indev->cursor, lv_disp_get_layer_sys(indev->driver->disp)); + lv_obj_set_pos(indev->cursor, indev->proc.types.pointer.act_point.x, indev->proc.types.pointer.act_point.y); + lv_obj_clear_flag(indev->cursor, LV_OBJ_FLAG_CLICKABLE); + lv_obj_add_flag(indev->cursor, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_FLOATING); +} + +void lv_indev_set_group(lv_indev_t * indev, lv_group_t * group) +{ + if(indev->driver->type == LV_INDEV_TYPE_KEYPAD || indev->driver->type == LV_INDEV_TYPE_ENCODER) { + indev->group = group; + } +} + +void lv_indev_set_button_points(lv_indev_t * indev, const lv_point_t points[]) +{ + if(indev->driver->type == LV_INDEV_TYPE_BUTTON) { + indev->btn_points = points; + } +} + +void lv_indev_get_point(const lv_indev_t * indev, lv_point_t * point) +{ + if(indev == NULL) { + point->x = 0; + point->y = 0; + return; + } + if(indev->driver->type != LV_INDEV_TYPE_POINTER && indev->driver->type != LV_INDEV_TYPE_BUTTON) { + point->x = -1; + point->y = -1; + } + else { + point->x = indev->proc.types.pointer.act_point.x; + point->y = indev->proc.types.pointer.act_point.y; + } +} + +lv_dir_t lv_indev_get_gesture_dir(const lv_indev_t * indev) +{ + return indev->proc.types.pointer.gesture_dir; +} + +uint32_t lv_indev_get_key(const lv_indev_t * indev) +{ + if(indev->driver->type != LV_INDEV_TYPE_KEYPAD) + return 0; + else + return indev->proc.types.keypad.last_key; +} + +lv_dir_t lv_indev_get_scroll_dir(const lv_indev_t * indev) +{ + if(indev == NULL) return false; + if(indev->driver->type != LV_INDEV_TYPE_POINTER && indev->driver->type != LV_INDEV_TYPE_BUTTON) return false; + return indev->proc.types.pointer.scroll_dir; +} + +lv_obj_t * lv_indev_get_scroll_obj(const lv_indev_t * indev) +{ + if(indev == NULL) return NULL; + if(indev->driver->type != LV_INDEV_TYPE_POINTER && indev->driver->type != LV_INDEV_TYPE_BUTTON) return NULL; + return indev->proc.types.pointer.scroll_obj; +} + +void lv_indev_get_vect(const lv_indev_t * indev, lv_point_t * point) +{ + point->x = 0; + point->y = 0; + + if(indev == NULL) return; + + if(indev->driver->type == LV_INDEV_TYPE_POINTER || indev->driver->type == LV_INDEV_TYPE_BUTTON) { + point->x = indev->proc.types.pointer.vect.x; + point->y = indev->proc.types.pointer.vect.y; + } +} + +void lv_indev_wait_release(lv_indev_t * indev) +{ + if(indev == NULL)return; + indev->proc.wait_until_release = 1; +} + +lv_obj_t * lv_indev_get_obj_act(void) +{ + return indev_obj_act; +} + +lv_timer_t * lv_indev_get_read_timer(lv_disp_t * indev) +{ + if(!indev) { + LV_LOG_WARN("lv_indev_get_read_timer: indev was NULL"); + return NULL; + } + + return indev->refr_timer; +} + + +lv_obj_t * lv_indev_search_obj(lv_obj_t * obj, lv_point_t * point) +{ + lv_obj_t * found_p = NULL; + + /*If this obj is hidden the children are hidden too so return immediately*/ + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return NULL; + + lv_point_t p_trans = *point; + lv_obj_transform_point(obj, &p_trans, false, true); + + bool hit_test_ok = lv_obj_hit_test(obj, &p_trans); + + /*If the point is on this object or has overflow visible check its children too*/ + if(_lv_area_is_point_on(&obj->coords, &p_trans, 0) || lv_obj_has_flag(obj, LV_OBJ_FLAG_OVERFLOW_VISIBLE)) { + int32_t i; + uint32_t child_cnt = lv_obj_get_child_cnt(obj); + + /*If a child matches use it*/ + for(i = child_cnt - 1; i >= 0; i--) { + lv_obj_t * child = obj->spec_attr->children[i]; + found_p = lv_indev_search_obj(child, &p_trans); + if(found_p) return found_p; + } + } + + /*If not return earlier for a clicked child and this obj's hittest was ok use it + *else return NULL*/ + if(hit_test_ok) return obj; + else return NULL; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Process a new point from LV_INDEV_TYPE_POINTER input device + * @param i pointer to an input device + * @param data pointer to the data read from the input device + */ +static void indev_pointer_proc(lv_indev_t * i, lv_indev_data_t * data) +{ + lv_disp_t * disp = i->driver->disp; + /*Save the raw points so they can be used again in _lv_indev_read*/ + i->proc.types.pointer.last_raw_point.x = data->point.x; + i->proc.types.pointer.last_raw_point.y = data->point.y; + + if(disp->driver->rotated == LV_DISP_ROT_180 || disp->driver->rotated == LV_DISP_ROT_270) { + data->point.x = disp->driver->hor_res - data->point.x - 1; + data->point.y = disp->driver->ver_res - data->point.y - 1; + } + if(disp->driver->rotated == LV_DISP_ROT_90 || disp->driver->rotated == LV_DISP_ROT_270) { + lv_coord_t tmp = data->point.y; + data->point.y = data->point.x; + data->point.x = disp->driver->ver_res - tmp - 1; + } + + /*Simple sanity check*/ + if(data->point.x < 0) { + LV_LOG_WARN("X is %d which is smaller than zero", data->point.x); + } + if(data->point.x >= lv_disp_get_hor_res(i->driver->disp)) { + LV_LOG_WARN("X is %d which is greater than hor. res", data->point.x); + } + if(data->point.y < 0) { + LV_LOG_WARN("Y is %d which is smaller than zero", data->point.y); + } + if(data->point.y >= lv_disp_get_ver_res(i->driver->disp)) { + LV_LOG_WARN("Y is %d which is greater than ver. res", data->point.y); + } + + /*Move the cursor if set and moved*/ + if(i->cursor != NULL && + (i->proc.types.pointer.last_point.x != data->point.x || i->proc.types.pointer.last_point.y != data->point.y)) { + lv_obj_set_pos(i->cursor, data->point.x, data->point.y); + } + + i->proc.types.pointer.act_point.x = data->point.x; + i->proc.types.pointer.act_point.y = data->point.y; + + if(i->proc.state == LV_INDEV_STATE_PRESSED) { + indev_proc_press(&i->proc); + } + else { + indev_proc_release(&i->proc); + } + + i->proc.types.pointer.last_point.x = i->proc.types.pointer.act_point.x; + i->proc.types.pointer.last_point.y = i->proc.types.pointer.act_point.y; +} + +/** + * Process a new point from LV_INDEV_TYPE_KEYPAD input device + * @param i pointer to an input device + * @param data pointer to the data read from the input device + */ +static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data) +{ + if(data->state == LV_INDEV_STATE_PRESSED && i->proc.wait_until_release) return; + + if(i->proc.wait_until_release) { + i->proc.wait_until_release = 0; + i->proc.pr_timestamp = 0; + i->proc.long_pr_sent = 0; + i->proc.types.keypad.last_state = LV_INDEV_STATE_RELEASED; /*To skip the processing of release*/ + } + + lv_group_t * g = i->group; + if(g == NULL) return; + + indev_obj_act = lv_group_get_focused(g); + if(indev_obj_act == NULL) return; + + bool dis = lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED); + + /*Save the last key to compare it with the current latter on RELEASE*/ + uint32_t prev_key = i->proc.types.keypad.last_key; + + /*Save the last key. + *It must be done here else `lv_indev_get_key` will return the last key in events*/ + i->proc.types.keypad.last_key = data->key; + + /*Save the previous state so we can detect state changes below and also set the last state now + *so if any event handler on the way returns `LV_RES_INV` the last state is remembered + *for the next time*/ + uint32_t prev_state = i->proc.types.keypad.last_state; + i->proc.types.keypad.last_state = data->state; + + /*Key press happened*/ + if(data->state == LV_INDEV_STATE_PRESSED && prev_state == LV_INDEV_STATE_RELEASED) { + LV_LOG_INFO("%" LV_PRIu32 " key is pressed", data->key); + i->proc.pr_timestamp = lv_tick_get(); + + /*Move the focus on NEXT*/ + if(data->key == LV_KEY_NEXT) { + lv_group_set_editing(g, false); /*Editing is not used by KEYPAD is be sure it is disabled*/ + lv_group_focus_next(g); + if(indev_reset_check(&i->proc)) return; + } + /*Move the focus on PREV*/ + else if(data->key == LV_KEY_PREV) { + lv_group_set_editing(g, false); /*Editing is not used by KEYPAD is be sure it is disabled*/ + lv_group_focus_prev(g); + if(indev_reset_check(&i->proc)) return; + } + else if(!dis) { + /*Simulate a press on the object if ENTER was pressed*/ + if(data->key == LV_KEY_ENTER) { + /*Send the ENTER as a normal KEY*/ + lv_group_send_data(g, LV_KEY_ENTER); + if(indev_reset_check(&i->proc)) return; + + if(!dis) lv_event_send(indev_obj_act, LV_EVENT_PRESSED, indev_act); + if(indev_reset_check(&i->proc)) return; + } + else if(data->key == LV_KEY_ESC) { + /*Send the ESC as a normal KEY*/ + lv_group_send_data(g, LV_KEY_ESC); + if(indev_reset_check(&i->proc)) return; + + lv_event_send(indev_obj_act, LV_EVENT_CANCEL, indev_act); + if(indev_reset_check(&i->proc)) return; + } + /*Just send other keys to the object (e.g. 'A' or `LV_GROUP_KEY_RIGHT`)*/ + else { + lv_group_send_data(g, data->key); + if(indev_reset_check(&i->proc)) return; + } + } + } + /*Pressing*/ + else if(!dis && data->state == LV_INDEV_STATE_PRESSED && prev_state == LV_INDEV_STATE_PRESSED) { + + if(data->key == LV_KEY_ENTER) { + lv_event_send(indev_obj_act, LV_EVENT_PRESSING, indev_act); + if(indev_reset_check(&i->proc)) return; + } + + /*Long press time has elapsed?*/ + if(i->proc.long_pr_sent == 0 && lv_tick_elaps(i->proc.pr_timestamp) > i->driver->long_press_time) { + i->proc.long_pr_sent = 1; + if(data->key == LV_KEY_ENTER) { + i->proc.longpr_rep_timestamp = lv_tick_get(); + lv_event_send(indev_obj_act, LV_EVENT_LONG_PRESSED, indev_act); + if(indev_reset_check(&i->proc)) return; + } + } + /*Long press repeated time has elapsed?*/ + else if(i->proc.long_pr_sent != 0 && + lv_tick_elaps(i->proc.longpr_rep_timestamp) > i->driver->long_press_repeat_time) { + + i->proc.longpr_rep_timestamp = lv_tick_get(); + + /*Send LONG_PRESS_REP on ENTER*/ + if(data->key == LV_KEY_ENTER) { + lv_event_send(indev_obj_act, LV_EVENT_LONG_PRESSED_REPEAT, indev_act); + if(indev_reset_check(&i->proc)) return; + } + /*Move the focus on NEXT again*/ + else if(data->key == LV_KEY_NEXT) { + lv_group_set_editing(g, false); /*Editing is not used by KEYPAD is be sure it is disabled*/ + lv_group_focus_next(g); + if(indev_reset_check(&i->proc)) return; + } + /*Move the focus on PREV again*/ + else if(data->key == LV_KEY_PREV) { + lv_group_set_editing(g, false); /*Editing is not used by KEYPAD is be sure it is disabled*/ + lv_group_focus_prev(g); + if(indev_reset_check(&i->proc)) return; + } + /*Just send other keys again to the object (e.g. 'A' or `LV_GROUP_KEY_RIGHT)*/ + else { + lv_group_send_data(g, data->key); + if(indev_reset_check(&i->proc)) return; + } + } + } + /*Release happened*/ + else if(!dis && data->state == LV_INDEV_STATE_RELEASED && prev_state == LV_INDEV_STATE_PRESSED) { + LV_LOG_INFO("%" LV_PRIu32 " key is released", data->key); + /*The user might clear the key when it was released. Always release the pressed key*/ + data->key = prev_key; + if(data->key == LV_KEY_ENTER) { + + lv_event_send(indev_obj_act, LV_EVENT_RELEASED, indev_act); + if(indev_reset_check(&i->proc)) return; + + if(i->proc.long_pr_sent == 0) { + lv_event_send(indev_obj_act, LV_EVENT_SHORT_CLICKED, indev_act); + if(indev_reset_check(&i->proc)) return; + } + + lv_event_send(indev_obj_act, LV_EVENT_CLICKED, indev_act); + if(indev_reset_check(&i->proc)) return; + + } + i->proc.pr_timestamp = 0; + i->proc.long_pr_sent = 0; + } + indev_obj_act = NULL; +} + +/** + * Process a new point from LV_INDEV_TYPE_ENCODER input device + * @param i pointer to an input device + * @param data pointer to the data read from the input device + */ +static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data) +{ + if(data->state == LV_INDEV_STATE_PRESSED && i->proc.wait_until_release) return; + + if(i->proc.wait_until_release) { + i->proc.wait_until_release = 0; + i->proc.pr_timestamp = 0; + i->proc.long_pr_sent = 0; + i->proc.types.keypad.last_state = LV_INDEV_STATE_RELEASED; /*To skip the processing of release*/ + } + + /*Save the last keys before anything else. + *They need to be already saved if the function returns for any reason*/ + lv_indev_state_t last_state = i->proc.types.keypad.last_state; + i->proc.types.keypad.last_state = data->state; + i->proc.types.keypad.last_key = data->key; + + lv_group_t * g = i->group; + if(g == NULL) return; + + indev_obj_act = lv_group_get_focused(g); + if(indev_obj_act == NULL) return; + + /*Process the steps they are valid only with released button*/ + if(data->state != LV_INDEV_STATE_RELEASED) { + data->enc_diff = 0; + } + + /*Refresh the focused object. It might change due to lv_group_focus_prev/next*/ + indev_obj_act = lv_group_get_focused(g); + if(indev_obj_act == NULL) return; + + /*Button press happened*/ + if(data->state == LV_INDEV_STATE_PRESSED && last_state == LV_INDEV_STATE_RELEASED) { + LV_LOG_INFO("pressed"); + + i->proc.pr_timestamp = lv_tick_get(); + + if(data->key == LV_KEY_ENTER) { + bool editable_or_scrollable = lv_obj_is_editable(indev_obj_act) || + lv_obj_has_flag(indev_obj_act, LV_OBJ_FLAG_SCROLLABLE); + if(lv_group_get_editing(g) == true || editable_or_scrollable == false) { + lv_event_send(indev_obj_act, LV_EVENT_PRESSED, indev_act); + if(indev_reset_check(&i->proc)) return; + } + } + else if(data->key == LV_KEY_LEFT) { + /*emulate encoder left*/ + data->enc_diff--; + } + else if(data->key == LV_KEY_RIGHT) { + /*emulate encoder right*/ + data->enc_diff++; + } + else if(data->key == LV_KEY_ESC) { + /*Send the ESC as a normal KEY*/ + lv_group_send_data(g, LV_KEY_ESC); + if(indev_reset_check(&i->proc)) return; + + lv_event_send(indev_obj_act, LV_EVENT_CANCEL, indev_act); + if(indev_reset_check(&i->proc)) return; + } + /*Just send other keys to the object (e.g. 'A' or `LV_GROUP_KEY_RIGHT`)*/ + else { + lv_group_send_data(g, data->key); + if(indev_reset_check(&i->proc)) return; + } + } + /*Pressing*/ + else if(data->state == LV_INDEV_STATE_PRESSED && last_state == LV_INDEV_STATE_PRESSED) { + /*Long press*/ + if(i->proc.long_pr_sent == 0 && lv_tick_elaps(i->proc.pr_timestamp) > i->driver->long_press_time) { + + i->proc.long_pr_sent = 1; + i->proc.longpr_rep_timestamp = lv_tick_get(); + + if(data->key == LV_KEY_ENTER) { + bool editable_or_scrollable = lv_obj_is_editable(indev_obj_act) || + lv_obj_has_flag(indev_obj_act, LV_OBJ_FLAG_SCROLLABLE); + + /*On enter long press toggle edit mode.*/ + if(editable_or_scrollable) { + /*Don't leave edit mode if there is only one object (nowhere to navigate)*/ + if(lv_group_get_obj_count(g) > 1) { + LV_LOG_INFO("toggling edit mode"); + lv_group_set_editing(g, lv_group_get_editing(g) ? false : true); /*Toggle edit mode on long press*/ + lv_obj_clear_state(indev_obj_act, LV_STATE_PRESSED); /*Remove the pressed state manually*/ + } + } + /*If not editable then just send a long press Call the ancestor's event handler*/ + else { + lv_event_send(indev_obj_act, LV_EVENT_LONG_PRESSED, indev_act); + if(indev_reset_check(&i->proc)) return; + } + } + + i->proc.long_pr_sent = 1; + } + /*Long press repeated time has elapsed?*/ + else if(i->proc.long_pr_sent != 0 && lv_tick_elaps(i->proc.longpr_rep_timestamp) > i->driver->long_press_repeat_time) { + + i->proc.longpr_rep_timestamp = lv_tick_get(); + + if(data->key == LV_KEY_ENTER) { + lv_event_send(indev_obj_act, LV_EVENT_LONG_PRESSED_REPEAT, indev_act); + if(indev_reset_check(&i->proc)) return; + } + else if(data->key == LV_KEY_LEFT) { + /*emulate encoder left*/ + data->enc_diff--; + } + else if(data->key == LV_KEY_RIGHT) { + /*emulate encoder right*/ + data->enc_diff++; + } + else { + lv_group_send_data(g, data->key); + if(indev_reset_check(&i->proc)) return; + } + + } + + } + /*Release happened*/ + else if(data->state == LV_INDEV_STATE_RELEASED && last_state == LV_INDEV_STATE_PRESSED) { + LV_LOG_INFO("released"); + + if(data->key == LV_KEY_ENTER) { + bool editable_or_scrollable = lv_obj_is_editable(indev_obj_act) || + lv_obj_has_flag(indev_obj_act, LV_OBJ_FLAG_SCROLLABLE); + + /*The button was released on a non-editable object. Just send enter*/ + if(editable_or_scrollable == false) { + lv_event_send(indev_obj_act, LV_EVENT_RELEASED, indev_act); + if(indev_reset_check(&i->proc)) return; + + if(i->proc.long_pr_sent == 0) lv_event_send(indev_obj_act, LV_EVENT_SHORT_CLICKED, indev_act); + if(indev_reset_check(&i->proc)) return; + + lv_event_send(indev_obj_act, LV_EVENT_CLICKED, indev_act); + if(indev_reset_check(&i->proc)) return; + + } + /*An object is being edited and the button is released.*/ + else if(lv_group_get_editing(g)) { + /*Ignore long pressed enter release because it comes from mode switch*/ + if(!i->proc.long_pr_sent || lv_group_get_obj_count(g) <= 1) { + lv_event_send(indev_obj_act, LV_EVENT_RELEASED, indev_act); + if(indev_reset_check(&i->proc)) return; + + lv_event_send(indev_obj_act, LV_EVENT_SHORT_CLICKED, indev_act); + if(indev_reset_check(&i->proc)) return; + + lv_event_send(indev_obj_act, LV_EVENT_CLICKED, indev_act); + if(indev_reset_check(&i->proc)) return; + + lv_group_send_data(g, LV_KEY_ENTER); + if(indev_reset_check(&i->proc)) return; + } + else { + lv_obj_clear_state(indev_obj_act, LV_STATE_PRESSED); /*Remove the pressed state manually*/ + } + } + /*If the focused object is editable and now in navigate mode then on enter switch edit + mode*/ + else if(!i->proc.long_pr_sent) { + LV_LOG_INFO("entering edit mode"); + lv_group_set_editing(g, true); /*Set edit mode*/ + } + } + + i->proc.pr_timestamp = 0; + i->proc.long_pr_sent = 0; + } + indev_obj_act = NULL; + + /*if encoder steps or simulated steps via left/right keys*/ + if(data->enc_diff != 0) { + /*In edit mode send LEFT/RIGHT keys*/ + if(lv_group_get_editing(g)) { + LV_LOG_INFO("rotated by %+d (edit)", data->enc_diff); + int32_t s; + if(data->enc_diff < 0) { + for(s = 0; s < -data->enc_diff; s++) { + lv_group_send_data(g, LV_KEY_LEFT); + if(indev_reset_check(&i->proc)) return; + } + } + else if(data->enc_diff > 0) { + for(s = 0; s < data->enc_diff; s++) { + lv_group_send_data(g, LV_KEY_RIGHT); + if(indev_reset_check(&i->proc)) return; + } + } + } + /*In navigate mode focus on the next/prev objects*/ + else { + LV_LOG_INFO("rotated by %+d (nav)", data->enc_diff); + int32_t s; + if(data->enc_diff < 0) { + for(s = 0; s < -data->enc_diff; s++) { + lv_group_focus_prev(g); + if(indev_reset_check(&i->proc)) return; + } + } + else if(data->enc_diff > 0) { + for(s = 0; s < data->enc_diff; s++) { + lv_group_focus_next(g); + if(indev_reset_check(&i->proc)) return; + } + } + } + } +} + +/** + * Process new points from an input device. indev->state.pressed has to be set + * @param indev pointer to an input device state + * @param x x coordinate of the next point + * @param y y coordinate of the next point + */ +static void indev_button_proc(lv_indev_t * i, lv_indev_data_t * data) +{ + /*Die gracefully if i->btn_points is NULL*/ + if(i->btn_points == NULL) { + LV_LOG_WARN("btn_points is NULL"); + return; + } + + lv_coord_t x = i->btn_points[data->btn_id].x; + lv_coord_t y = i->btn_points[data->btn_id].y; + + static lv_indev_state_t prev_state = LV_INDEV_STATE_RELEASED; + if(prev_state != data->state) { + if(data->state == LV_INDEV_STATE_PRESSED) { + LV_LOG_INFO("button %" LV_PRIu32 " is pressed (x:%d y:%d)", data->btn_id, x, y); + } + else { + LV_LOG_INFO("button %" LV_PRIu32 " is released (x:%d y:%d)", data->btn_id, x, y); + } + } + + /*If a new point comes always make a release*/ + if(data->state == LV_INDEV_STATE_PRESSED) { + if(i->proc.types.pointer.last_point.x != x || + i->proc.types.pointer.last_point.y != y) { + indev_proc_release(&i->proc); + } + } + + if(indev_reset_check(&i->proc)) return; + + /*Save the new points*/ + i->proc.types.pointer.act_point.x = x; + i->proc.types.pointer.act_point.y = y; + + if(data->state == LV_INDEV_STATE_PRESSED) indev_proc_press(&i->proc); + else indev_proc_release(&i->proc); + + if(indev_reset_check(&i->proc)) return; + + i->proc.types.pointer.last_point.x = i->proc.types.pointer.act_point.x; + i->proc.types.pointer.last_point.y = i->proc.types.pointer.act_point.y; +} + +/** + * Process the pressed state of LV_INDEV_TYPE_POINTER input devices + * @param indev pointer to an input device 'proc' + * @return LV_RES_OK: no indev reset required; LV_RES_INV: indev reset is required + */ +static void indev_proc_press(_lv_indev_proc_t * proc) +{ + LV_LOG_INFO("pressed at x:%d y:%d", proc->types.pointer.act_point.x, proc->types.pointer.act_point.y); + indev_obj_act = proc->types.pointer.act_obj; + + if(proc->wait_until_release != 0) return; + + lv_disp_t * disp = indev_act->driver->disp; + bool new_obj_searched = false; + + /*If there is no last object then search*/ + if(indev_obj_act == NULL) { + indev_obj_act = lv_indev_search_obj(lv_disp_get_layer_sys(disp), &proc->types.pointer.act_point); + if(indev_obj_act == NULL) indev_obj_act = lv_indev_search_obj(lv_disp_get_layer_top(disp), + &proc->types.pointer.act_point); + if(indev_obj_act == NULL) indev_obj_act = lv_indev_search_obj(lv_disp_get_scr_act(disp), + &proc->types.pointer.act_point); + new_obj_searched = true; + } + /*If there is last object but it is not scrolled and not protected also search*/ + else if(proc->types.pointer.scroll_obj == NULL && + lv_obj_has_flag(indev_obj_act, LV_OBJ_FLAG_PRESS_LOCK) == false) { + indev_obj_act = lv_indev_search_obj(lv_disp_get_layer_sys(disp), &proc->types.pointer.act_point); + if(indev_obj_act == NULL) indev_obj_act = lv_indev_search_obj(lv_disp_get_layer_top(disp), + &proc->types.pointer.act_point); + if(indev_obj_act == NULL) indev_obj_act = lv_indev_search_obj(lv_disp_get_scr_act(disp), + &proc->types.pointer.act_point); + new_obj_searched = true; + } + + /*The last object might have scroll throw. Stop it manually*/ + if(new_obj_searched && proc->types.pointer.last_obj) { + proc->types.pointer.scroll_throw_vect.x = 0; + proc->types.pointer.scroll_throw_vect.y = 0; + _lv_indev_scroll_throw_handler(proc); + if(indev_reset_check(proc)) return; + } + + lv_obj_transform_point(indev_obj_act, &proc->types.pointer.act_point, true, true); + + /*If a new object was found reset some variables and send a pressed event handler*/ + if(indev_obj_act != proc->types.pointer.act_obj) { + proc->types.pointer.last_point.x = proc->types.pointer.act_point.x; + proc->types.pointer.last_point.y = proc->types.pointer.act_point.y; + + /*If a new object found the previous was lost, so send a Call the ancestor's event handler*/ + if(proc->types.pointer.act_obj != NULL) { + /*Save the obj because in special cases `act_obj` can change in the Call the ancestor's event handler function*/ + lv_obj_t * last_obj = proc->types.pointer.act_obj; + + lv_event_send(last_obj, LV_EVENT_PRESS_LOST, indev_act); + if(indev_reset_check(proc)) return; + } + + proc->types.pointer.act_obj = indev_obj_act; /*Save the pressed object*/ + proc->types.pointer.last_obj = indev_obj_act; + + if(indev_obj_act != NULL) { + /*Save the time when the obj pressed to count long press time.*/ + proc->pr_timestamp = lv_tick_get(); + proc->long_pr_sent = 0; + proc->types.pointer.scroll_sum.x = 0; + proc->types.pointer.scroll_sum.y = 0; + proc->types.pointer.scroll_dir = LV_DIR_NONE; + proc->types.pointer.gesture_dir = LV_DIR_NONE; + proc->types.pointer.gesture_sent = 0; + proc->types.pointer.gesture_sum.x = 0; + proc->types.pointer.gesture_sum.y = 0; + proc->types.pointer.vect.x = 0; + proc->types.pointer.vect.y = 0; + + /*Call the ancestor's event handler about the press*/ + lv_event_send(indev_obj_act, LV_EVENT_PRESSED, indev_act); + if(indev_reset_check(proc)) return; + + if(indev_act->proc.wait_until_release) return; + + /*Handle focus*/ + indev_click_focus(&indev_act->proc); + if(indev_reset_check(proc)) return; + + } + } + + /*Calculate the vector and apply a low pass filter: new value = 0.5 * old_value + 0.5 * new_value*/ + proc->types.pointer.vect.x = proc->types.pointer.act_point.x - proc->types.pointer.last_point.x; + proc->types.pointer.vect.y = proc->types.pointer.act_point.y - proc->types.pointer.last_point.y; + + proc->types.pointer.scroll_throw_vect.x = (proc->types.pointer.scroll_throw_vect.x + proc->types.pointer.vect.x) / 2; + proc->types.pointer.scroll_throw_vect.y = (proc->types.pointer.scroll_throw_vect.y + proc->types.pointer.vect.y) / 2; + + proc->types.pointer.scroll_throw_vect_ori = proc->types.pointer.scroll_throw_vect; + + if(indev_obj_act) { + lv_event_send(indev_obj_act, LV_EVENT_PRESSING, indev_act); + if(indev_reset_check(proc)) return; + + if(indev_act->proc.wait_until_release) return; + + _lv_indev_scroll_handler(proc); + if(indev_reset_check(proc)) return; + indev_gesture(proc); + if(indev_reset_check(proc)) return; + + /*If there is no scrolling then check for long press time*/ + if(proc->types.pointer.scroll_obj == NULL && proc->long_pr_sent == 0) { + /*Call the ancestor's event handler about the long press if enough time elapsed*/ + if(lv_tick_elaps(proc->pr_timestamp) > indev_act->driver->long_press_time) { + lv_event_send(indev_obj_act, LV_EVENT_LONG_PRESSED, indev_act); + if(indev_reset_check(proc)) return; + + /*Mark the Call the ancestor's event handler sending to do not send it again*/ + proc->long_pr_sent = 1; + + /*Save the long press time stamp for the long press repeat handler*/ + proc->longpr_rep_timestamp = lv_tick_get(); + } + } + + /*Send long press repeated Call the ancestor's event handler*/ + if(proc->types.pointer.scroll_obj == NULL && proc->long_pr_sent == 1) { + /*Call the ancestor's event handler about the long press repeat if enough time elapsed*/ + if(lv_tick_elaps(proc->longpr_rep_timestamp) > indev_act->driver->long_press_repeat_time) { + lv_event_send(indev_obj_act, LV_EVENT_LONG_PRESSED_REPEAT, indev_act); + if(indev_reset_check(proc)) return; + proc->longpr_rep_timestamp = lv_tick_get(); + } + } + } +} + +/** + * Process the released state of LV_INDEV_TYPE_POINTER input devices + * @param proc pointer to an input device 'proc' + */ +static void indev_proc_release(_lv_indev_proc_t * proc) +{ + if(proc->wait_until_release != 0) { + lv_event_send(proc->types.pointer.act_obj, LV_EVENT_PRESS_LOST, indev_act); + if(indev_reset_check(proc)) return; + + proc->types.pointer.act_obj = NULL; + proc->types.pointer.last_obj = NULL; + proc->pr_timestamp = 0; + proc->longpr_rep_timestamp = 0; + proc->wait_until_release = 0; + } + indev_obj_act = proc->types.pointer.act_obj; + lv_obj_t * scroll_obj = proc->types.pointer.scroll_obj; + + /*Forget the act obj and send a released Call the ancestor's event handler*/ + if(indev_obj_act) { + LV_LOG_INFO("released"); + + /*Send RELEASE Call the ancestor's event handler and event*/ + lv_event_send(indev_obj_act, LV_EVENT_RELEASED, indev_act); + if(indev_reset_check(proc)) return; + + /*Send CLICK if no scrolling*/ + if(scroll_obj == NULL) { + if(proc->long_pr_sent == 0) { + lv_event_send(indev_obj_act, LV_EVENT_SHORT_CLICKED, indev_act); + if(indev_reset_check(proc)) return; + } + + lv_event_send(indev_obj_act, LV_EVENT_CLICKED, indev_act); + if(indev_reset_check(proc)) return; + } + + proc->types.pointer.act_obj = NULL; + proc->pr_timestamp = 0; + proc->longpr_rep_timestamp = 0; + + } + + /*The reset can be set in the Call the ancestor's event handler function. + * In case of reset query ignore the remaining parts.*/ + if(scroll_obj) { + _lv_indev_scroll_throw_handler(proc); + if(indev_reset_check(proc)) return; + } +} + +/** + * Process a new point from LV_INDEV_TYPE_BUTTON input device + * @param i pointer to an input device + * @param data pointer to the data read from the input device + * Reset input device if a reset query has been sent to it + * @param indev pointer to an input device + */ +static void indev_proc_reset_query_handler(lv_indev_t * indev) +{ + if(indev->proc.reset_query) { + indev->proc.types.pointer.act_obj = NULL; + indev->proc.types.pointer.last_obj = NULL; + indev->proc.types.pointer.scroll_obj = NULL; + indev->proc.long_pr_sent = 0; + indev->proc.pr_timestamp = 0; + indev->proc.longpr_rep_timestamp = 0; + indev->proc.types.pointer.scroll_sum.x = 0; + indev->proc.types.pointer.scroll_sum.y = 0; + indev->proc.types.pointer.scroll_dir = LV_DIR_NONE; + indev->proc.types.pointer.scroll_throw_vect.x = 0; + indev->proc.types.pointer.scroll_throw_vect.y = 0; + indev->proc.types.pointer.gesture_sum.x = 0; + indev->proc.types.pointer.gesture_sum.y = 0; + indev->proc.reset_query = 0; + indev_obj_act = NULL; + } +} + +/** + * Handle focus/defocus on click for POINTER input devices + * @param proc pointer to the state of the indev + */ +static void indev_click_focus(_lv_indev_proc_t * proc) +{ + /*Handle click focus*/ + if(lv_obj_has_flag(indev_obj_act, LV_OBJ_FLAG_CLICK_FOCUSABLE) == false || + proc->types.pointer.last_pressed == indev_obj_act) { + return; + } + + lv_group_t * g_act = lv_obj_get_group(indev_obj_act); + lv_group_t * g_prev = proc->types.pointer.last_pressed ? lv_obj_get_group(proc->types.pointer.last_pressed) : NULL; + + /*If both the last and act. obj. are in the same group (or have no group)*/ + if(g_act == g_prev) { + /*The objects are in a group*/ + if(g_act) { + lv_group_focus_obj(indev_obj_act); + if(indev_reset_check(proc)) return; + } + /*The object are not in group*/ + else { + if(proc->types.pointer.last_pressed) { + lv_event_send(proc->types.pointer.last_pressed, LV_EVENT_DEFOCUSED, indev_act); + if(indev_reset_check(proc)) return; + } + + lv_event_send(indev_obj_act, LV_EVENT_FOCUSED, indev_act); + if(indev_reset_check(proc)) return; + } + } + /*The object are not in the same group (in different groups or one has no group)*/ + else { + /*If the prev. obj. is not in a group then defocus it.*/ + if(g_prev == NULL && proc->types.pointer.last_pressed) { + lv_event_send(proc->types.pointer.last_pressed, LV_EVENT_DEFOCUSED, indev_act); + if(indev_reset_check(proc)) return; + } + /*Focus on a non-group object*/ + else { + if(proc->types.pointer.last_pressed) { + /*If the prev. object also wasn't in a group defocus it*/ + if(g_prev == NULL) { + lv_event_send(proc->types.pointer.last_pressed, LV_EVENT_DEFOCUSED, indev_act); + if(indev_reset_check(proc)) return; + } + /*If the prev. object also was in a group at least "LEAVE" it instead of defocus*/ + else { + lv_event_send(proc->types.pointer.last_pressed, LV_EVENT_LEAVE, indev_act); + if(indev_reset_check(proc)) return; + } + } + } + + /*Focus to the act. in its group*/ + if(g_act) { + lv_group_focus_obj(indev_obj_act); + if(indev_reset_check(proc)) return; + } + else { + lv_event_send(indev_obj_act, LV_EVENT_FOCUSED, indev_act); + if(indev_reset_check(proc)) return; + } + } + proc->types.pointer.last_pressed = indev_obj_act; +} + +/** +* Handle the gesture of indev_proc_p->types.pointer.act_obj +* @param indev pointer to an input device state +*/ +void indev_gesture(_lv_indev_proc_t * proc) +{ + + if(proc->types.pointer.scroll_obj) return; + if(proc->types.pointer.gesture_sent) return; + + lv_obj_t * gesture_obj = proc->types.pointer.act_obj; + + /*If gesture parent is active check recursively the gesture attribute*/ + while(gesture_obj && lv_obj_has_flag(gesture_obj, LV_OBJ_FLAG_GESTURE_BUBBLE)) { + gesture_obj = lv_obj_get_parent(gesture_obj); + } + + if(gesture_obj == NULL) return; + + if((LV_ABS(proc->types.pointer.vect.x) < indev_act->driver->gesture_min_velocity) && + (LV_ABS(proc->types.pointer.vect.y) < indev_act->driver->gesture_min_velocity)) { + proc->types.pointer.gesture_sum.x = 0; + proc->types.pointer.gesture_sum.y = 0; + } + + /*Count the movement by gesture*/ + proc->types.pointer.gesture_sum.x += proc->types.pointer.vect.x; + proc->types.pointer.gesture_sum.y += proc->types.pointer.vect.y; + + if((LV_ABS(proc->types.pointer.gesture_sum.x) > indev_act->driver->gesture_limit) || + (LV_ABS(proc->types.pointer.gesture_sum.y) > indev_act->driver->gesture_limit)) { + + proc->types.pointer.gesture_sent = 1; + + if(LV_ABS(proc->types.pointer.gesture_sum.x) > LV_ABS(proc->types.pointer.gesture_sum.y)) { + if(proc->types.pointer.gesture_sum.x > 0) + proc->types.pointer.gesture_dir = LV_DIR_RIGHT; + else + proc->types.pointer.gesture_dir = LV_DIR_LEFT; + } + else { + if(proc->types.pointer.gesture_sum.y > 0) + proc->types.pointer.gesture_dir = LV_DIR_BOTTOM; + else + proc->types.pointer.gesture_dir = LV_DIR_TOP; + } + + lv_event_send(gesture_obj, LV_EVENT_GESTURE, indev_act); + if(indev_reset_check(proc)) return; + } +} + +/** + * Checks if the reset_query flag has been set. If so, perform necessary global indev cleanup actions + * @param proc pointer to an input device 'proc' + * @return true if indev query should be immediately truncated. + */ +static bool indev_reset_check(_lv_indev_proc_t * proc) +{ + if(proc->reset_query) { + indev_obj_act = NULL; + } + + return proc->reset_query ? true : false; +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_indev.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_indev.h new file mode 100644 index 0000000..a98df86 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_indev.h @@ -0,0 +1,176 @@ +/** + * @file lv_indev.h + * + */ + +#ifndef LV_INDEV_H +#define LV_INDEV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_obj.h" +#include "../hal/lv_hal_indev.h" +#include "lv_group.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Called periodically to read the input devices + * @param timer pointer to a timer to read + */ +void lv_indev_read_timer_cb(lv_timer_t * timer); + +/** + * Enable or disable one or all input devices (default enabled) + * @param indev pointer to an input device or NULL to enable/disable all of them + * @param en true to enable, false to disable + */ +void lv_indev_enable(lv_indev_t * indev, bool en); + +/** + * Get the currently processed input device. Can be used in action functions too. + * @return pointer to the currently processed input device or NULL if no input device processing + * right now + */ +lv_indev_t * lv_indev_get_act(void); + +/** + * Get the type of an input device + * @param indev pointer to an input device + * @return the type of the input device from `lv_hal_indev_type_t` (`LV_INDEV_TYPE_...`) + */ +lv_indev_type_t lv_indev_get_type(const lv_indev_t * indev); + +/** + * Reset one or all input devices + * @param indev pointer to an input device to reset or NULL to reset all of them + * @param obj pointer to an object which triggers the reset. + */ +void lv_indev_reset(lv_indev_t * indev, lv_obj_t * obj); + +/** + * Reset the long press state of an input device + * @param indev pointer to an input device + */ +void lv_indev_reset_long_press(lv_indev_t * indev); + +/** + * Set a cursor for a pointer input device (for LV_INPUT_TYPE_POINTER and LV_INPUT_TYPE_BUTTON) + * @param indev pointer to an input device + * @param cur_obj pointer to an object to be used as cursor + */ +void lv_indev_set_cursor(lv_indev_t * indev, lv_obj_t * cur_obj); + +/** + * Set a destination group for a keypad input device (for LV_INDEV_TYPE_KEYPAD) + * @param indev pointer to an input device + * @param group point to a group + */ +void lv_indev_set_group(lv_indev_t * indev, lv_group_t * group); + +/** + * Set the an array of points for LV_INDEV_TYPE_BUTTON. + * These points will be assigned to the buttons to press a specific point on the screen + * @param indev pointer to an input device + * @param group point to a group + */ +void lv_indev_set_button_points(lv_indev_t * indev, const lv_point_t points[]); + +/** + * Get the last point of an input device (for LV_INDEV_TYPE_POINTER and LV_INDEV_TYPE_BUTTON) + * @param indev pointer to an input device + * @param point pointer to a point to store the result + */ +void lv_indev_get_point(const lv_indev_t * indev, lv_point_t * point); + +/** +* Get the current gesture direct +* @param indev pointer to an input device +* @return current gesture direct +*/ +lv_dir_t lv_indev_get_gesture_dir(const lv_indev_t * indev); + +/** + * Get the last pressed key of an input device (for LV_INDEV_TYPE_KEYPAD) + * @param indev pointer to an input device + * @return the last pressed key (0 on error) + */ +uint32_t lv_indev_get_key(const lv_indev_t * indev); + +/** + * Check the current scroll direction of an input device (for LV_INDEV_TYPE_POINTER and + * LV_INDEV_TYPE_BUTTON) + * @param indev pointer to an input device + * @return LV_DIR_NONE: no scrolling now + * LV_DIR_HOR/VER + */ +lv_dir_t lv_indev_get_scroll_dir(const lv_indev_t * indev); + +/** + * Get the currently scrolled object (for LV_INDEV_TYPE_POINTER and + * LV_INDEV_TYPE_BUTTON) + * @param indev pointer to an input device + * @return pointer to the currently scrolled object or NULL if no scrolling by this indev + */ +lv_obj_t * lv_indev_get_scroll_obj(const lv_indev_t * indev); + +/** + * Get the movement vector of an input device (for LV_INDEV_TYPE_POINTER and + * LV_INDEV_TYPE_BUTTON) + * @param indev pointer to an input device + * @param point pointer to a point to store the types.pointer.vector + */ +void lv_indev_get_vect(const lv_indev_t * indev, lv_point_t * point); + +/** + * Do nothing until the next release + * @param indev pointer to an input device + */ +void lv_indev_wait_release(lv_indev_t * indev); + +/** + * Gets a pointer to the currently active object in the currently processed input device. + * @return pointer to currently active object or NULL if no active object + */ +lv_obj_t * lv_indev_get_obj_act(void); + +/** + * Get a pointer to the indev read timer to + * modify its parameters with `lv_timer_...` functions. + * @param indev pointer to an input device + * @return pointer to the indev read refresher timer. (NULL on error) + */ +lv_timer_t * lv_indev_get_read_timer(lv_disp_t * indev); + +/** + * Search the most top, clickable object by a point + * @param obj pointer to a start object, typically the screen + * @param point pointer to a point for searching the most top child + * @return pointer to the found object or NULL if there was no suitable object + */ +lv_obj_t * lv_indev_search_obj(lv_obj_t * obj, lv_point_t * point); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_INDEV_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_indev_scroll.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_indev_scroll.c new file mode 100644 index 0000000..c05e345 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_indev_scroll.c @@ -0,0 +1,652 @@ +/** + * @file lv_indev_scroll.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_indev.h" +#include "lv_indev_scroll.h" + +/********************* + * DEFINES + *********************/ +#define ELASTIC_SLOWNESS_FACTOR 4 /*Scrolling on elastic parts are slower by this factor*/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_obj_t * find_scroll_obj(_lv_indev_proc_t * proc); +static void init_scroll_limits(_lv_indev_proc_t * proc); +static lv_coord_t find_snap_point_x(const lv_obj_t * obj, lv_coord_t min, lv_coord_t max, lv_coord_t ofs); +static lv_coord_t find_snap_point_y(const lv_obj_t * obj, lv_coord_t min, lv_coord_t max, lv_coord_t ofs); +static void scroll_limit_diff(_lv_indev_proc_t * proc, lv_coord_t * diff_x, lv_coord_t * diff_y); +static lv_coord_t scroll_throw_predict_y(_lv_indev_proc_t * proc); +static lv_coord_t scroll_throw_predict_x(_lv_indev_proc_t * proc); +static lv_coord_t elastic_diff(lv_obj_t * scroll_obj, lv_coord_t diff, lv_coord_t scroll_start, lv_coord_t scroll_end, + lv_dir_t dir); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void _lv_indev_scroll_handler(_lv_indev_proc_t * proc) +{ + lv_obj_t * scroll_obj = proc->types.pointer.scroll_obj; + /*If there is no scroll object yet try to find one*/ + if(scroll_obj == NULL) { + proc->types.pointer.scroll_sum.x += proc->types.pointer.vect.x; + proc->types.pointer.scroll_sum.y += proc->types.pointer.vect.y; + + scroll_obj = find_scroll_obj(proc); + if(scroll_obj == NULL) return; + + init_scroll_limits(proc); + + lv_event_send(scroll_obj, LV_EVENT_SCROLL_BEGIN, NULL); + if(proc->reset_query) return; + } + + /*Set new position or scroll if the vector is not zero*/ + if(proc->types.pointer.vect.x != 0 || proc->types.pointer.vect.y != 0) { + lv_coord_t diff_x = 0; + lv_coord_t diff_y = 0; + + if(proc->types.pointer.scroll_dir == LV_DIR_HOR) { + lv_coord_t sr = lv_obj_get_scroll_right(scroll_obj); + lv_coord_t sl = lv_obj_get_scroll_left(scroll_obj); + diff_x = elastic_diff(scroll_obj, proc->types.pointer.vect.x, sl, sr, LV_DIR_HOR); + } + else { + lv_coord_t st = lv_obj_get_scroll_top(scroll_obj); + lv_coord_t sb = lv_obj_get_scroll_bottom(scroll_obj); + diff_y = elastic_diff(scroll_obj, proc->types.pointer.vect.y, st, sb, LV_DIR_VER); + } + + lv_dir_t scroll_dir = lv_obj_get_scroll_dir(scroll_obj); + if((scroll_dir & LV_DIR_LEFT) == 0 && diff_x > 0) diff_x = 0; + if((scroll_dir & LV_DIR_RIGHT) == 0 && diff_x < 0) diff_x = 0; + if((scroll_dir & LV_DIR_TOP) == 0 && diff_y > 0) diff_y = 0; + if((scroll_dir & LV_DIR_BOTTOM) == 0 && diff_y < 0) diff_y = 0; + + /*Respect the scroll limit area*/ + scroll_limit_diff(proc, &diff_x, &diff_y); + + _lv_obj_scroll_by_raw(scroll_obj, diff_x, diff_y); + if(proc->reset_query) return; + proc->types.pointer.scroll_sum.x += diff_x; + proc->types.pointer.scroll_sum.y += diff_y; + } +} + + +void _lv_indev_scroll_throw_handler(_lv_indev_proc_t * proc) +{ + lv_obj_t * scroll_obj = proc->types.pointer.scroll_obj; + if(scroll_obj == NULL) return; + if(proc->types.pointer.scroll_dir == LV_DIR_NONE) return; + + + lv_indev_t * indev_act = lv_indev_get_act(); + lv_coord_t scroll_throw = indev_act->driver->scroll_throw; + + if(lv_obj_has_flag(scroll_obj, LV_OBJ_FLAG_SCROLL_MOMENTUM) == false) { + proc->types.pointer.scroll_throw_vect.y = 0; + proc->types.pointer.scroll_throw_vect.x = 0; + } + + lv_scroll_snap_t align_x = lv_obj_get_scroll_snap_x(scroll_obj); + lv_scroll_snap_t align_y = lv_obj_get_scroll_snap_y(scroll_obj); + + if(proc->types.pointer.scroll_dir == LV_DIR_VER) { + proc->types.pointer.scroll_throw_vect.x = 0; + /*If no snapping "throw"*/ + if(align_y == LV_SCROLL_SNAP_NONE) { + proc->types.pointer.scroll_throw_vect.y = + proc->types.pointer.scroll_throw_vect.y * (100 - scroll_throw) / 100; + + lv_coord_t sb = lv_obj_get_scroll_bottom(scroll_obj); + lv_coord_t st = lv_obj_get_scroll_top(scroll_obj); + + proc->types.pointer.scroll_throw_vect.y = elastic_diff(scroll_obj, proc->types.pointer.scroll_throw_vect.y, st, sb, + LV_DIR_VER); + + lv_obj_scroll_by(scroll_obj, 0, proc->types.pointer.scroll_throw_vect.y, LV_ANIM_OFF); + } + /*With snapping find the nearest snap point and scroll there*/ + else { + lv_coord_t diff_y = scroll_throw_predict_y(proc); + proc->types.pointer.scroll_throw_vect.y = 0; + scroll_limit_diff(proc, NULL, &diff_y); + lv_coord_t y = find_snap_point_y(scroll_obj, LV_COORD_MIN, LV_COORD_MAX, diff_y); + lv_obj_scroll_by(scroll_obj, 0, diff_y + y, LV_ANIM_ON); + } + } + else if(proc->types.pointer.scroll_dir == LV_DIR_HOR) { + proc->types.pointer.scroll_throw_vect.y = 0; + /*If no snapping "throw"*/ + if(align_x == LV_SCROLL_SNAP_NONE) { + proc->types.pointer.scroll_throw_vect.x = + proc->types.pointer.scroll_throw_vect.x * (100 - scroll_throw) / 100; + + lv_coord_t sl = lv_obj_get_scroll_left(scroll_obj); + lv_coord_t sr = lv_obj_get_scroll_right(scroll_obj); + + proc->types.pointer.scroll_throw_vect.x = elastic_diff(scroll_obj, proc->types.pointer.scroll_throw_vect.x, sl, sr, + LV_DIR_HOR); + + lv_obj_scroll_by(scroll_obj, proc->types.pointer.scroll_throw_vect.x, 0, LV_ANIM_OFF); + } + /*With snapping find the nearest snap point and scroll there*/ + else { + lv_coord_t diff_x = scroll_throw_predict_x(proc); + proc->types.pointer.scroll_throw_vect.x = 0; + scroll_limit_diff(proc, &diff_x, NULL); + lv_coord_t x = find_snap_point_x(scroll_obj, LV_COORD_MIN, LV_COORD_MAX, diff_x); + lv_obj_scroll_by(scroll_obj, x + diff_x, 0, LV_ANIM_ON); + } + } + + /*Check if the scroll has finished*/ + if(proc->types.pointer.scroll_throw_vect.x == 0 && proc->types.pointer.scroll_throw_vect.y == 0) { + /*Revert if scrolled in*/ + /*If vertically scrollable and not controlled by snap*/ + if(align_y == LV_SCROLL_SNAP_NONE) { + lv_coord_t st = lv_obj_get_scroll_top(scroll_obj); + lv_coord_t sb = lv_obj_get_scroll_bottom(scroll_obj); + if(st > 0 || sb > 0) { + if(st < 0) { + lv_obj_scroll_by(scroll_obj, 0, st, LV_ANIM_ON); + } + else if(sb < 0) { + lv_obj_scroll_by(scroll_obj, 0, -sb, LV_ANIM_ON); + } + } + } + + /*If horizontally scrollable and not controlled by snap*/ + if(align_x == LV_SCROLL_SNAP_NONE) { + lv_coord_t sl = lv_obj_get_scroll_left(scroll_obj); + lv_coord_t sr = lv_obj_get_scroll_right(scroll_obj); + if(sl > 0 || sr > 0) { + if(sl < 0) { + lv_obj_scroll_by(scroll_obj, sl, 0, LV_ANIM_ON); + } + else if(sr < 0) { + lv_obj_scroll_by(scroll_obj, -sr, 0, LV_ANIM_ON); + } + } + } + + lv_event_send(scroll_obj, LV_EVENT_SCROLL_END, indev_act); + if(proc->reset_query) return; + + proc->types.pointer.scroll_dir = LV_DIR_NONE; + proc->types.pointer.scroll_obj = NULL; + } +} + +/** + * Predict where would a scroll throw end + * @param indev pointer to an input device + * @param dir `LV_DIR_VER` or `LV_DIR_HOR` + * @return the difference compared to the current position when the throw would be finished + */ +lv_coord_t lv_indev_scroll_throw_predict(lv_indev_t * indev, lv_dir_t dir) +{ + if(indev == NULL) return 0; + lv_coord_t v; + switch(dir) { + case LV_DIR_VER: + v = indev->proc.types.pointer.scroll_throw_vect_ori.y; + break; + case LV_DIR_HOR: + v = indev->proc.types.pointer.scroll_throw_vect_ori.x; + break; + default: + return 0; + } + + lv_coord_t scroll_throw = indev->driver->scroll_throw; + lv_coord_t sum = 0; + while(v) { + sum += v; + v = v * (100 - scroll_throw) / 100; + } + + return sum; +} + +void lv_indev_scroll_get_snap_dist(lv_obj_t * obj, lv_point_t * p) +{ + p->x = find_snap_point_x(obj, obj->coords.x1, obj->coords.x2, 0); + p->y = find_snap_point_y(obj, obj->coords.y1, obj->coords.y2, 0); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_obj_t * find_scroll_obj(_lv_indev_proc_t * proc) +{ + lv_obj_t * obj_candidate = NULL; + lv_dir_t dir_candidate = LV_DIR_NONE; + lv_indev_t * indev_act = lv_indev_get_act(); + lv_coord_t scroll_limit = indev_act->driver->scroll_limit; + + /*Go until find a scrollable object in the current direction + *More precisely: + * 1. Check the pressed object and all of its ancestors and try to find an object which is scrollable + * 2. Scrollable means it has some content out of its area + * 3. If an object can be scrolled into the current direction then use it ("real match"") + * 4. If can be scrolled on the current axis (hor/ver) save it as candidate (at least show an elastic scroll effect) + * 5. Use the last candidate. Always the "deepest" parent or the object from point 3*/ + lv_obj_t * obj_act = proc->types.pointer.act_obj; + + /*Decide if it's a horizontal or vertical scroll*/ + bool hor_en = false; + bool ver_en = false; + if(LV_ABS(proc->types.pointer.scroll_sum.x) > LV_ABS(proc->types.pointer.scroll_sum.y)) { + hor_en = true; + } + else { + ver_en = true; + } + + while(obj_act) { + if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLLABLE) == false) { + /*If this object don't want to chain the scroll to the parent stop searching*/ + if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLL_CHAIN_HOR) == false && hor_en) break; + if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLL_CHAIN_VER) == false && ver_en) break; + + obj_act = lv_obj_get_parent(obj_act); + continue; + } + + /*Consider both up-down or left/right scrollable according to the current direction*/ + bool up_en = ver_en; + bool down_en = ver_en; + bool left_en = hor_en; + bool right_en = hor_en; + + /*The object might have disabled some directions.*/ + lv_dir_t scroll_dir = lv_obj_get_scroll_dir(obj_act); + if((scroll_dir & LV_DIR_LEFT) == 0) left_en = false; + if((scroll_dir & LV_DIR_RIGHT) == 0) right_en = false; + if((scroll_dir & LV_DIR_TOP) == 0) up_en = false; + if((scroll_dir & LV_DIR_BOTTOM) == 0) down_en = false; + + /*The object is scrollable to a direction if its content overflow in that direction.*/ + lv_coord_t st = lv_obj_get_scroll_top(obj_act); + lv_coord_t sb = lv_obj_get_scroll_bottom(obj_act); + lv_coord_t sl = lv_obj_get_scroll_left(obj_act); + lv_coord_t sr = lv_obj_get_scroll_right(obj_act); + + /*If this object is scrollable into the current scroll direction then save it as a candidate. + *It's important only to be scrollable on the current axis (hor/ver) because if the scroll + *is propagated to this object it can show at least elastic scroll effect. + *But if not hor/ver scrollable do not scroll it at all (so it's not a good candidate)*/ + if((st > 0 || sb > 0) && + ((up_en && proc->types.pointer.scroll_sum.y >= scroll_limit) || + (down_en && proc->types.pointer.scroll_sum.y <= - scroll_limit))) { + obj_candidate = obj_act; + dir_candidate = LV_DIR_VER; + } + + if((sl > 0 || sr > 0) && + ((left_en && proc->types.pointer.scroll_sum.x >= scroll_limit) || + (right_en && proc->types.pointer.scroll_sum.x <= - scroll_limit))) { + obj_candidate = obj_act; + dir_candidate = LV_DIR_HOR; + } + + if(st <= 0) up_en = false; + if(sb <= 0) down_en = false; + if(sl <= 0) left_en = false; + if(sr <= 0) right_en = false; + + /*If the object really can be scrolled into the current direction the use it.*/ + if((left_en && proc->types.pointer.scroll_sum.x >= scroll_limit) || + (right_en && proc->types.pointer.scroll_sum.x <= - scroll_limit) || + (up_en && proc->types.pointer.scroll_sum.y >= scroll_limit) || + (down_en && proc->types.pointer.scroll_sum.y <= - scroll_limit)) { + proc->types.pointer.scroll_dir = hor_en ? LV_DIR_HOR : LV_DIR_VER; + break; + } + + /*If this object don't want to chain the scroll to the parent stop searching*/ + if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLL_CHAIN_HOR) == false && hor_en) break; + if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLL_CHAIN_VER) == false && ver_en) break; + + /*Try the parent*/ + obj_act = lv_obj_get_parent(obj_act); + } + + /*Use the last candidate*/ + if(obj_candidate) { + proc->types.pointer.scroll_dir = dir_candidate; + proc->types.pointer.scroll_obj = obj_candidate; + proc->types.pointer.scroll_sum.x = 0; + proc->types.pointer.scroll_sum.y = 0; + } + + return obj_candidate; +} + +static void init_scroll_limits(_lv_indev_proc_t * proc) +{ + lv_obj_t * obj = proc->types.pointer.scroll_obj; + /*If there no STOP allow scrolling anywhere*/ + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_SCROLL_ONE) == false) { + lv_area_set(&proc->types.pointer.scroll_area, LV_COORD_MIN, LV_COORD_MIN, LV_COORD_MAX, LV_COORD_MAX); + } + /*With STOP limit the scrolling to the perv and next snap point*/ + else { + switch(lv_obj_get_scroll_snap_y(obj)) { + case LV_SCROLL_SNAP_START: + proc->types.pointer.scroll_area.y1 = find_snap_point_y(obj, obj->coords.y1 + 1, LV_COORD_MAX, 0); + proc->types.pointer.scroll_area.y2 = find_snap_point_y(obj, LV_COORD_MIN, obj->coords.y1 - 1, 0); + break; + case LV_SCROLL_SNAP_END: + proc->types.pointer.scroll_area.y1 = find_snap_point_y(obj, obj->coords.y2, LV_COORD_MAX, 0); + proc->types.pointer.scroll_area.y2 = find_snap_point_y(obj, LV_COORD_MIN, obj->coords.y2, 0); + break; + case LV_SCROLL_SNAP_CENTER: { + lv_coord_t y_mid = obj->coords.y1 + lv_area_get_height(&obj->coords) / 2; + proc->types.pointer.scroll_area.y1 = find_snap_point_y(obj, y_mid + 1, LV_COORD_MAX, 0); + proc->types.pointer.scroll_area.y2 = find_snap_point_y(obj, LV_COORD_MIN, y_mid - 1, 0); + break; + } + default: + proc->types.pointer.scroll_area.y1 = LV_COORD_MIN; + proc->types.pointer.scroll_area.y2 = LV_COORD_MAX; + break; + } + + switch(lv_obj_get_scroll_snap_x(obj)) { + case LV_SCROLL_SNAP_START: + proc->types.pointer.scroll_area.x1 = find_snap_point_x(obj, obj->coords.x1, LV_COORD_MAX, 0); + proc->types.pointer.scroll_area.x2 = find_snap_point_x(obj, LV_COORD_MIN, obj->coords.x1, 0); + break; + case LV_SCROLL_SNAP_END: + proc->types.pointer.scroll_area.x1 = find_snap_point_x(obj, obj->coords.x2, LV_COORD_MAX, 0); + proc->types.pointer.scroll_area.x2 = find_snap_point_x(obj, LV_COORD_MIN, obj->coords.x2, 0); + break; + case LV_SCROLL_SNAP_CENTER: { + lv_coord_t x_mid = obj->coords.x1 + lv_area_get_width(&obj->coords) / 2; + proc->types.pointer.scroll_area.x1 = find_snap_point_x(obj, x_mid + 1, LV_COORD_MAX, 0); + proc->types.pointer.scroll_area.x2 = find_snap_point_x(obj, LV_COORD_MIN, x_mid - 1, 0); + break; + } + default: + proc->types.pointer.scroll_area.x1 = LV_COORD_MIN; + proc->types.pointer.scroll_area.x2 = LV_COORD_MAX; + break; + } + } + + /*Allow scrolling on the edges. It will be reverted to the edge due to snapping anyway*/ + if(proc->types.pointer.scroll_area.x1 == 0) proc->types.pointer.scroll_area.x1 = LV_COORD_MIN; + if(proc->types.pointer.scroll_area.x2 == 0) proc->types.pointer.scroll_area.x2 = LV_COORD_MAX; + if(proc->types.pointer.scroll_area.y1 == 0) proc->types.pointer.scroll_area.y1 = LV_COORD_MIN; + if(proc->types.pointer.scroll_area.y2 == 0) proc->types.pointer.scroll_area.y2 = LV_COORD_MAX; +} + +/** + * Search for snap point in the `min` - `max` range. + * @param obj the object on which snap point should be found + * @param min ignore snap points smaller than this. (Absolute coordinate) + * @param max ignore snap points greater than this. (Absolute coordinate) + * @param ofs offset to snap points. Useful the get a snap point in an imagined case + * what if children are already moved by this value + * @return the distance of the snap point. + */ +static lv_coord_t find_snap_point_x(const lv_obj_t * obj, lv_coord_t min, lv_coord_t max, lv_coord_t ofs) +{ + lv_scroll_snap_t align = lv_obj_get_scroll_snap_x(obj); + if(align == LV_SCROLL_SNAP_NONE) return 0; + + lv_coord_t dist = LV_COORD_MAX; + + lv_coord_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + lv_coord_t pad_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_cnt(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + if(lv_obj_has_flag(child, LV_OBJ_FLAG_SNAPPABLE)) { + lv_coord_t x_child = 0; + lv_coord_t x_parent = 0; + switch(align) { + case LV_SCROLL_SNAP_START: + x_child = child->coords.x1; + x_parent = obj->coords.x1 + pad_left; + break; + case LV_SCROLL_SNAP_END: + x_child = child->coords.x2; + x_parent = obj->coords.x2 - pad_right; + break; + case LV_SCROLL_SNAP_CENTER: + x_child = child->coords.x1 + lv_area_get_width(&child->coords) / 2; + x_parent = obj->coords.x1 + pad_left + (lv_area_get_width(&obj->coords) - pad_left - pad_right) / 2; + break; + default: + continue; + } + + x_child += ofs; + if(x_child >= min && x_child <= max) { + lv_coord_t x = x_child - x_parent; + if(LV_ABS(x) < LV_ABS(dist)) dist = x; + } + } + } + + return dist == LV_COORD_MAX ? 0 : -dist; +} + +/** + * Search for snap point in the `min` - `max` range. + * @param obj the object on which snap point should be found + * @param min ignore snap points smaller than this. (Absolute coordinate) + * @param max ignore snap points greater than this. (Absolute coordinate) + * @param ofs offset to snap points. Useful to get a snap point in an imagined case + * what if children are already moved by this value + * @return the distance of the snap point. + */ +static lv_coord_t find_snap_point_y(const lv_obj_t * obj, lv_coord_t min, lv_coord_t max, lv_coord_t ofs) +{ + lv_scroll_snap_t align = lv_obj_get_scroll_snap_y(obj); + if(align == LV_SCROLL_SNAP_NONE) return 0; + + lv_coord_t dist = LV_COORD_MAX; + + lv_coord_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + lv_coord_t pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_cnt(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + if(lv_obj_has_flag(child, LV_OBJ_FLAG_SNAPPABLE)) { + lv_coord_t y_child = 0; + lv_coord_t y_parent = 0; + switch(align) { + case LV_SCROLL_SNAP_START: + y_child = child->coords.y1; + y_parent = obj->coords.y1 + pad_top; + break; + case LV_SCROLL_SNAP_END: + y_child = child->coords.y2; + y_parent = obj->coords.y2 - pad_bottom; + break; + case LV_SCROLL_SNAP_CENTER: + y_child = child->coords.y1 + lv_area_get_height(&child->coords) / 2; + y_parent = obj->coords.y1 + pad_top + (lv_area_get_height(&obj->coords) - pad_top - pad_bottom) / 2; + break; + default: + continue; + } + + y_child += ofs; + if(y_child >= min && y_child <= max) { + lv_coord_t y = y_child - y_parent; + if(LV_ABS(y) < LV_ABS(dist)) dist = y; + } + } + } + + return dist == LV_COORD_MAX ? 0 : -dist; +} + +static void scroll_limit_diff(_lv_indev_proc_t * proc, lv_coord_t * diff_x, lv_coord_t * diff_y) +{ + if(diff_y) { + if(proc->types.pointer.scroll_sum.y + *diff_y < proc->types.pointer.scroll_area.y1) { + *diff_y = proc->types.pointer.scroll_area.y1 - proc->types.pointer.scroll_sum.y; + } + + if(proc->types.pointer.scroll_sum.y + *diff_y > proc->types.pointer.scroll_area.y2) { + *diff_y = proc->types.pointer.scroll_area.y2 - proc->types.pointer.scroll_sum.y; + } + } + + if(diff_x) { + if(proc->types.pointer.scroll_sum.x + *diff_x < proc->types.pointer.scroll_area.x1) { + *diff_x = proc->types.pointer.scroll_area.x1 - proc->types.pointer.scroll_sum.x; + } + + if(proc->types.pointer.scroll_sum.x + *diff_x > proc->types.pointer.scroll_area.x2) { + *diff_x = proc->types.pointer.scroll_area.x2 - proc->types.pointer.scroll_sum.x; + } + } +} + + + +static lv_coord_t scroll_throw_predict_y(_lv_indev_proc_t * proc) +{ + lv_coord_t y = proc->types.pointer.scroll_throw_vect.y; + lv_coord_t move = 0; + + lv_indev_t * indev_act = lv_indev_get_act(); + lv_coord_t scroll_throw = indev_act->driver->scroll_throw; + + while(y) { + move += y; + y = y * (100 - scroll_throw) / 100; + } + return move; +} + + +static lv_coord_t scroll_throw_predict_x(_lv_indev_proc_t * proc) +{ + lv_coord_t x = proc->types.pointer.scroll_throw_vect.x; + lv_coord_t move = 0; + + lv_indev_t * indev_act = lv_indev_get_act(); + lv_coord_t scroll_throw = indev_act->driver->scroll_throw; + + while(x) { + move += x; + x = x * (100 - scroll_throw) / 100; + } + return move; +} + +static lv_coord_t elastic_diff(lv_obj_t * scroll_obj, lv_coord_t diff, lv_coord_t scroll_start, lv_coord_t scroll_end, + lv_dir_t dir) +{ + if(lv_obj_has_flag(scroll_obj, LV_OBJ_FLAG_SCROLL_ELASTIC)) { + /*If there is snapping in the current direction don't use the elastic factor because + *it's natural that the first and last items are scrolled (snapped) in.*/ + lv_scroll_snap_t snap; + snap = dir == LV_DIR_HOR ? lv_obj_get_scroll_snap_x(scroll_obj) : lv_obj_get_scroll_snap_y(scroll_obj); + + lv_obj_t * act_obj = lv_indev_get_obj_act(); + lv_coord_t snap_point = 0; + lv_coord_t act_obj_point = 0; + + if(dir == LV_DIR_HOR) { + lv_coord_t pad_left = lv_obj_get_style_pad_left(scroll_obj, LV_PART_MAIN); + lv_coord_t pad_right = lv_obj_get_style_pad_right(scroll_obj, LV_PART_MAIN); + + switch(snap) { + case LV_SCROLL_SNAP_CENTER: + snap_point = pad_left + (lv_area_get_width(&scroll_obj->coords) - pad_left - pad_right) / 2 + scroll_obj->coords.x1; + act_obj_point = lv_area_get_width(&act_obj->coords) / 2 + act_obj->coords.x1; + break; + case LV_SCROLL_SNAP_START: + snap_point = scroll_obj->coords.x1 + pad_left; + act_obj_point = act_obj->coords.x1; + break; + case LV_SCROLL_SNAP_END: + snap_point = scroll_obj->coords.x2 - pad_right; + act_obj_point = act_obj->coords.x2; + break; + } + } + else { + lv_coord_t pad_top = lv_obj_get_style_pad_top(scroll_obj, LV_PART_MAIN); + lv_coord_t pad_bottom = lv_obj_get_style_pad_bottom(scroll_obj, LV_PART_MAIN); + + switch(snap) { + case LV_SCROLL_SNAP_CENTER: + snap_point = pad_top + (lv_area_get_height(&scroll_obj->coords) - pad_top - pad_bottom) / 2 + scroll_obj->coords.y1; + act_obj_point = lv_area_get_height(&act_obj->coords) / 2 + act_obj->coords.y1; + break; + case LV_SCROLL_SNAP_START: + snap_point = scroll_obj->coords.y1 + pad_top; + act_obj_point = act_obj->coords.y1; + break; + case LV_SCROLL_SNAP_END: + snap_point = scroll_obj->coords.y2 - pad_bottom; + act_obj_point = act_obj->coords.y2; + break; + } + } + + if(scroll_end < 0) { + if(snap != LV_SCROLL_SNAP_NONE && act_obj_point > snap_point) return diff; + + /*Rounding*/ + if(diff < 0) diff -= ELASTIC_SLOWNESS_FACTOR / 2; + if(diff > 0) diff += ELASTIC_SLOWNESS_FACTOR / 2; + return diff / ELASTIC_SLOWNESS_FACTOR; + } + else if(scroll_start < 0) { + if(snap != LV_SCROLL_SNAP_NONE && act_obj_point < snap_point) return diff; + + /*Rounding*/ + if(diff < 0) diff -= ELASTIC_SLOWNESS_FACTOR / 2; + if(diff > 0) diff += ELASTIC_SLOWNESS_FACTOR / 2; + return diff / ELASTIC_SLOWNESS_FACTOR; + } + } + else { + /*Scroll back to the boundary if required*/ + if(scroll_end + diff < 0) diff = - scroll_end; + if(scroll_start - diff < 0) diff = scroll_start; + } + + return diff; +} + + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_indev_scroll.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_indev_scroll.h new file mode 100644 index 0000000..76c64d1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_indev_scroll.h @@ -0,0 +1,65 @@ +/** + * @file lv_indev_scroll.h + * + */ + +#ifndef LV_INDEV_SCROLL_H +#define LV_INDEV_SCROLL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_obj.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Handle scrolling. Called by LVGL during input device processing + * @param proc pointer to an input device's proc field + */ +void _lv_indev_scroll_handler(_lv_indev_proc_t * proc); + +/** + * Handle throwing after scrolling. Called by LVGL during input device processing + * @param proc pointer to an input device's proc field + */ +void _lv_indev_scroll_throw_handler(_lv_indev_proc_t * proc); + +/** + * Predict where would a scroll throw end + * @param indev pointer to an input device + * @param dir ` LV_DIR_VER` or `LV_DIR_HOR` + * @return the difference compared to the current position when the throw would be finished + */ +lv_coord_t lv_indev_scroll_throw_predict(lv_indev_t * indev, lv_dir_t dir); + +/** + * Get the distance of the nearest snap point + * @param obj the object on which snap points should be found + * @param p save the distance of the found snap point there + */ +void lv_indev_scroll_get_snap_dist(lv_obj_t * obj, lv_point_t * p); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_INDEV_SCROLL_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj.c new file mode 100644 index 0000000..8890fcb --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj.c @@ -0,0 +1,948 @@ +/** + * @file lv_obj.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj.h" +#include "lv_indev.h" +#include "lv_refr.h" +#include "lv_group.h" +#include "lv_disp.h" +#include "lv_theme.h" +#include "../misc/lv_assert.h" +#include "../draw/lv_draw.h" +#include "../misc/lv_anim.h" +#include "../misc/lv_timer.h" +#include "../misc/lv_async.h" +#include "../misc/lv_fs.h" +#include "../misc/lv_gc.h" +#include "../misc/lv_math.h" +#include "../misc/lv_log.h" +#include "../hal/lv_hal.h" +#include "../extra/lv_extra.h" +#include +#include + +#if LV_USE_GPU_STM32_DMA2D + #include "../draw/stm32_dma2d/lv_gpu_stm32_dma2d.h" +#endif + +#if LV_USE_GPU_SWM341_DMA2D + #include "../draw/swm341_dma2d/lv_gpu_swm341_dma2d.h" +#endif + +#if LV_USE_GPU_NXP_PXP && LV_USE_GPU_NXP_PXP_AUTO_INIT + #include "../draw/nxp/pxp/lv_gpu_nxp_pxp.h" +#endif + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_obj_class +#define LV_OBJ_DEF_WIDTH (LV_DPX(100)) +#define LV_OBJ_DEF_HEIGHT (LV_DPX(50)) +#define STYLE_TRANSITION_MAX 32 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_obj_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_obj_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_obj_draw(lv_event_t * e); +static void lv_obj_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_scrollbar(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx); +static lv_res_t scrollbar_init_draw_dsc(lv_obj_t * obj, lv_draw_rect_dsc_t * dsc); +static bool obj_valid_child(const lv_obj_t * parent, const lv_obj_t * obj_to_find); +static void lv_obj_set_state(lv_obj_t * obj, lv_state_t new_state); + +/********************** + * STATIC VARIABLES + **********************/ +static bool lv_initialized = false; +const lv_obj_class_t lv_obj_class = { + .constructor_cb = lv_obj_constructor, + .destructor_cb = lv_obj_destructor, + .event_cb = lv_obj_event, + .width_def = LV_DPI_DEF, + .height_def = LV_DPI_DEF, + .editable = LV_OBJ_CLASS_EDITABLE_FALSE, + .group_def = LV_OBJ_CLASS_GROUP_DEF_FALSE, + .instance_size = (sizeof(lv_obj_t)), + .base_class = NULL, +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +bool lv_is_initialized(void) +{ + return lv_initialized; +} + +void lv_init(void) +{ + /*Do nothing if already initialized*/ + if(lv_initialized) { + LV_LOG_WARN("lv_init: already inited"); + return; + } + + LV_LOG_INFO("begin"); + + /*Initialize the misc modules*/ + lv_mem_init(); + + _lv_timer_core_init(); + + _lv_fs_init(); + + _lv_anim_core_init(); + + _lv_group_init(); + + lv_draw_init(); + +#if LV_USE_GPU_STM32_DMA2D + /*Initialize DMA2D GPU*/ + lv_draw_stm32_dma2d_init(); +#endif + +#if LV_USE_GPU_SWM341_DMA2D + /*Initialize DMA2D GPU*/ + lv_draw_swm341_dma2d_init(); +#endif + +#if LV_USE_GPU_NXP_PXP && LV_USE_GPU_NXP_PXP_AUTO_INIT + PXP_COND_STOP(!lv_gpu_nxp_pxp_init(), "PXP init failed."); +#endif + + _lv_obj_style_init(); + _lv_ll_init(&LV_GC_ROOT(_lv_disp_ll), sizeof(lv_disp_t)); + _lv_ll_init(&LV_GC_ROOT(_lv_indev_ll), sizeof(lv_indev_t)); + + /*Initialize the screen refresh system*/ + _lv_refr_init(); + + _lv_img_decoder_init(); +#if LV_IMG_CACHE_DEF_SIZE + lv_img_cache_set_size(LV_IMG_CACHE_DEF_SIZE); +#endif + /*Test if the IDE has UTF-8 encoding*/ + char * txt = "Ã"; + + uint8_t * txt_u8 = (uint8_t *)txt; + if(txt_u8[0] != 0xc3 || txt_u8[1] != 0x81 || txt_u8[2] != 0x00) { + LV_LOG_WARN("The strings have no UTF-8 encoding. Non-ASCII characters won't be displayed."); + } + + uint32_t endianess_test = 0x11223344; + uint8_t * endianess_test_p = (uint8_t *) &endianess_test; + bool big_endian = endianess_test_p[0] == 0x11 ? true : false; + + if(big_endian) { + LV_ASSERT_MSG(LV_BIG_ENDIAN_SYSTEM == 1, + "It's a big endian system but LV_BIG_ENDIAN_SYSTEM is not enabled in lv_conf.h"); + } + else { + LV_ASSERT_MSG(LV_BIG_ENDIAN_SYSTEM == 0, + "It's a little endian system but LV_BIG_ENDIAN_SYSTEM is enabled in lv_conf.h"); + } + +#if LV_USE_ASSERT_MEM_INTEGRITY + LV_LOG_WARN("Memory integrity checks are enabled via LV_USE_ASSERT_MEM_INTEGRITY which makes LVGL much slower"); +#endif + +#if LV_USE_ASSERT_OBJ + LV_LOG_WARN("Object sanity checks are enabled via LV_USE_ASSERT_OBJ which makes LVGL much slower"); +#endif + +#if LV_USE_ASSERT_STYLE + LV_LOG_WARN("Style sanity checks are enabled that uses more RAM"); +#endif + +#if LV_LOG_LEVEL == LV_LOG_LEVEL_TRACE + LV_LOG_WARN("Log level is set to 'Trace' which makes LVGL much slower"); +#endif + + lv_extra_init(); + + lv_initialized = true; + + LV_LOG_TRACE("finished"); +} + +#if LV_ENABLE_GC || !LV_MEM_CUSTOM + +void lv_deinit(void) +{ + _lv_gc_clear_roots(); + + lv_disp_set_default(NULL); + lv_mem_deinit(); + lv_initialized = false; + + LV_LOG_INFO("lv_deinit done"); + +#if LV_USE_LOG + lv_log_register_print_cb(NULL); +#endif +} +#endif + +lv_obj_t * lv_obj_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +/*----------------- + * Attribute set + *----------------*/ + +void lv_obj_add_flag(lv_obj_t * obj, lv_obj_flag_t f) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + bool was_on_layout = lv_obj_is_layout_positioned(obj); + + if(f & LV_OBJ_FLAG_HIDDEN) lv_obj_invalidate(obj); + + obj->flags |= f; + + if(f & LV_OBJ_FLAG_HIDDEN) { + lv_obj_invalidate(obj); + } + + if((was_on_layout != lv_obj_is_layout_positioned(obj)) || (f & (LV_OBJ_FLAG_LAYOUT_1 | LV_OBJ_FLAG_LAYOUT_2))) { + lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); + lv_obj_mark_layout_as_dirty(obj); + } + + if(f & LV_OBJ_FLAG_SCROLLABLE) { + lv_area_t hor_area, ver_area; + lv_obj_get_scrollbar_area(obj, &hor_area, &ver_area); + lv_obj_invalidate_area(obj, &hor_area); + lv_obj_invalidate_area(obj, &ver_area); + } +} + +void lv_obj_clear_flag(lv_obj_t * obj, lv_obj_flag_t f) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + bool was_on_layout = lv_obj_is_layout_positioned(obj); + if(f & LV_OBJ_FLAG_SCROLLABLE) { + lv_area_t hor_area, ver_area; + lv_obj_get_scrollbar_area(obj, &hor_area, &ver_area); + lv_obj_invalidate_area(obj, &hor_area); + lv_obj_invalidate_area(obj, &ver_area); + } + + obj->flags &= (~f); + + if(f & LV_OBJ_FLAG_HIDDEN) { + lv_obj_invalidate(obj); + if(lv_obj_is_layout_positioned(obj)) { + lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); + lv_obj_mark_layout_as_dirty(obj); + } + } + + if((was_on_layout != lv_obj_is_layout_positioned(obj)) || (f & (LV_OBJ_FLAG_LAYOUT_1 | LV_OBJ_FLAG_LAYOUT_2))) { + lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); + } + +} + +void lv_obj_add_state(lv_obj_t * obj, lv_state_t state) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_state_t new_state = obj->state | state; + if(obj->state != new_state) { + lv_obj_set_state(obj, new_state); + } +} + +void lv_obj_clear_state(lv_obj_t * obj, lv_state_t state) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_state_t new_state = obj->state & (~state); + if(obj->state != new_state) { + lv_obj_set_state(obj, new_state); + } +} + +/*======================= + * Getter functions + *======================*/ + +bool lv_obj_has_flag(const lv_obj_t * obj, lv_obj_flag_t f) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return (obj->flags & f) == f ? true : false; +} + +bool lv_obj_has_flag_any(const lv_obj_t * obj, lv_obj_flag_t f) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return (obj->flags & f) ? true : false; +} + +lv_state_t lv_obj_get_state(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return obj->state; +} + +bool lv_obj_has_state(const lv_obj_t * obj, lv_state_t state) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return obj->state & state ? true : false; +} + +void * lv_obj_get_group(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(obj->spec_attr) return obj->spec_attr->group_p; + else return NULL; +} + +/*------------------- + * OTHER FUNCTIONS + *------------------*/ + +void lv_obj_allocate_spec_attr(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(obj->spec_attr == NULL) { + static uint32_t x = 0; + x++; + obj->spec_attr = lv_mem_alloc(sizeof(_lv_obj_spec_attr_t)); + LV_ASSERT_MALLOC(obj->spec_attr); + if(obj->spec_attr == NULL) return; + + lv_memset_00(obj->spec_attr, sizeof(_lv_obj_spec_attr_t)); + + obj->spec_attr->scroll_dir = LV_DIR_ALL; + obj->spec_attr->scrollbar_mode = LV_SCROLLBAR_MODE_AUTO; + } +} + +bool lv_obj_check_type(const lv_obj_t * obj, const lv_obj_class_t * class_p) +{ + if(obj == NULL) return false; + return obj->class_p == class_p ? true : false; +} + +bool lv_obj_has_class(const lv_obj_t * obj, const lv_obj_class_t * class_p) +{ + const lv_obj_class_t * obj_class = obj->class_p; + while(obj_class) { + if(obj_class == class_p) return true; + obj_class = obj_class->base_class; + } + + return false; +} + +const lv_obj_class_t * lv_obj_get_class(const lv_obj_t * obj) +{ + return obj->class_p; +} + +bool lv_obj_is_valid(const lv_obj_t * obj) +{ + lv_disp_t * disp = lv_disp_get_next(NULL); + while(disp) { + uint32_t i; + for(i = 0; i < disp->screen_cnt; i++) { + if(disp->screens[i] == obj) return true; + bool found = obj_valid_child(disp->screens[i], obj); + if(found) return true; + } + + disp = lv_disp_get_next(disp); + } + + return false; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_obj_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_obj_t * parent = obj->parent; + if(parent) { + lv_coord_t sl = lv_obj_get_scroll_left(parent); + lv_coord_t st = lv_obj_get_scroll_top(parent); + + obj->coords.y1 = parent->coords.y1 + lv_obj_get_style_pad_top(parent, LV_PART_MAIN) - st; + obj->coords.y2 = obj->coords.y1 - 1; + obj->coords.x1 = parent->coords.x1 + lv_obj_get_style_pad_left(parent, LV_PART_MAIN) - sl; + obj->coords.x2 = obj->coords.x1 - 1; + } + + /*Set attributes*/ + obj->flags = LV_OBJ_FLAG_CLICKABLE; + obj->flags |= LV_OBJ_FLAG_SNAPPABLE; + if(parent) obj->flags |= LV_OBJ_FLAG_PRESS_LOCK; + if(parent) obj->flags |= LV_OBJ_FLAG_SCROLL_CHAIN; + obj->flags |= LV_OBJ_FLAG_CLICK_FOCUSABLE; + obj->flags |= LV_OBJ_FLAG_SCROLLABLE; + obj->flags |= LV_OBJ_FLAG_SCROLL_ELASTIC; + obj->flags |= LV_OBJ_FLAG_SCROLL_MOMENTUM; + obj->flags |= LV_OBJ_FLAG_SCROLL_WITH_ARROW; + if(parent) obj->flags |= LV_OBJ_FLAG_GESTURE_BUBBLE; + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_obj_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + _lv_event_mark_deleted(obj); + + /*Remove all style*/ + lv_obj_enable_style_refresh(false); /*No need to refresh the style because the object will be deleted*/ + lv_obj_remove_style_all(obj); + lv_obj_enable_style_refresh(true); + + /*Remove the animations from this object*/ + lv_anim_del(obj, NULL); + + /*Delete from the group*/ + lv_group_t * group = lv_obj_get_group(obj); + if(group) lv_group_remove_obj(obj); + + if(obj->spec_attr) { + if(obj->spec_attr->children) { + lv_mem_free(obj->spec_attr->children); + obj->spec_attr->children = NULL; + } + if(obj->spec_attr->event_dsc) { + lv_mem_free(obj->spec_attr->event_dsc); + obj->spec_attr->event_dsc = NULL; + } + + lv_mem_free(obj->spec_attr); + obj->spec_attr = NULL; + } +} + +static void lv_obj_draw(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + if(code == LV_EVENT_COVER_CHECK) { + lv_cover_check_info_t * info = lv_event_get_param(e); + if(info->res == LV_COVER_RES_MASKED) return; + if(lv_obj_get_style_clip_corner(obj, LV_PART_MAIN)) { + info->res = LV_COVER_RES_MASKED; + return; + } + + /*Most trivial test. Is the mask fully IN the object? If no it surely doesn't cover it*/ + lv_coord_t r = lv_obj_get_style_radius(obj, LV_PART_MAIN); + lv_coord_t w = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); + lv_coord_t h = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); + lv_area_t coords; + lv_area_copy(&coords, &obj->coords); + coords.x1 -= w; + coords.x2 += w; + coords.y1 -= h; + coords.y2 += h; + + if(_lv_area_is_in(info->area, &coords, r) == false) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + + if(lv_obj_get_style_bg_opa(obj, LV_PART_MAIN) < LV_OPA_MAX) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + + info->res = LV_COVER_RES_COVER; + + } + else if(code == LV_EVENT_DRAW_MAIN) { + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + lv_draw_rect_dsc_t draw_dsc; + lv_draw_rect_dsc_init(&draw_dsc); + /*If the border is drawn later disable loading its properties*/ + if(lv_obj_get_style_border_post(obj, LV_PART_MAIN)) { + draw_dsc.border_post = 1; + } + + lv_obj_init_draw_rect_dsc(obj, LV_PART_MAIN, &draw_dsc); + lv_coord_t w = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); + lv_coord_t h = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); + lv_area_t coords; + lv_area_copy(&coords, &obj->coords); + coords.x1 -= w; + coords.x2 += w; + coords.y1 -= h; + coords.y2 += h; + + lv_obj_draw_part_dsc_t part_dsc; + lv_obj_draw_dsc_init(&part_dsc, draw_ctx); + part_dsc.class_p = MY_CLASS; + part_dsc.type = LV_OBJ_DRAW_PART_RECTANGLE; + part_dsc.rect_dsc = &draw_dsc; + part_dsc.draw_area = &coords; + part_dsc.part = LV_PART_MAIN; + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_dsc); + +#if LV_DRAW_COMPLEX + /*With clip corner enabled draw the bg img separately to make it clipped*/ + bool clip_corner = (lv_obj_get_style_clip_corner(obj, LV_PART_MAIN) && draw_dsc.radius != 0) ? true : false; + const void * bg_img_src = draw_dsc.bg_img_src; + if(clip_corner) { + draw_dsc.bg_img_src = NULL; + } +#endif + + lv_draw_rect(draw_ctx, &draw_dsc, &coords); + + +#if LV_DRAW_COMPLEX + if(clip_corner) { + lv_draw_mask_radius_param_t * mp = lv_mem_buf_get(sizeof(lv_draw_mask_radius_param_t)); + lv_draw_mask_radius_init(mp, &obj->coords, draw_dsc.radius, false); + /*Add the mask and use `obj+8` as custom id. Don't use `obj` directly because it might be used by the user*/ + lv_draw_mask_add(mp, obj + 8); + + if(bg_img_src) { + draw_dsc.bg_opa = LV_OPA_TRANSP; + draw_dsc.border_opa = LV_OPA_TRANSP; + draw_dsc.outline_opa = LV_OPA_TRANSP; + draw_dsc.shadow_opa = LV_OPA_TRANSP; + draw_dsc.bg_img_src = bg_img_src; + lv_draw_rect(draw_ctx, &draw_dsc, &coords); + } + + } +#endif + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_dsc); + } + else if(code == LV_EVENT_DRAW_POST) { + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + draw_scrollbar(obj, draw_ctx); + +#if LV_DRAW_COMPLEX + if(lv_obj_get_style_clip_corner(obj, LV_PART_MAIN)) { + lv_draw_mask_radius_param_t * param = lv_draw_mask_remove_custom(obj + 8); + if(param) { + lv_draw_mask_free_param(param); + lv_mem_buf_release(param); + } + } +#endif + + /*If the border is drawn later disable loading other properties*/ + if(lv_obj_get_style_border_post(obj, LV_PART_MAIN)) { + lv_draw_rect_dsc_t draw_dsc; + lv_draw_rect_dsc_init(&draw_dsc); + draw_dsc.bg_opa = LV_OPA_TRANSP; + draw_dsc.bg_img_opa = LV_OPA_TRANSP; + draw_dsc.outline_opa = LV_OPA_TRANSP; + draw_dsc.shadow_opa = LV_OPA_TRANSP; + lv_obj_init_draw_rect_dsc(obj, LV_PART_MAIN, &draw_dsc); + + lv_coord_t w = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); + lv_coord_t h = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); + lv_area_t coords; + lv_area_copy(&coords, &obj->coords); + coords.x1 -= w; + coords.x2 += w; + coords.y1 -= h; + coords.y2 += h; + + lv_obj_draw_part_dsc_t part_dsc; + lv_obj_draw_dsc_init(&part_dsc, draw_ctx); + part_dsc.class_p = MY_CLASS; + part_dsc.type = LV_OBJ_DRAW_PART_BORDER_POST; + part_dsc.rect_dsc = &draw_dsc; + part_dsc.draw_area = &coords; + part_dsc.part = LV_PART_MAIN; + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_dsc); + + lv_draw_rect(draw_ctx, &draw_dsc, &coords); + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_dsc); + } + } +} + +static void draw_scrollbar(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx) +{ + + lv_area_t hor_area; + lv_area_t ver_area; + lv_obj_get_scrollbar_area(obj, &hor_area, &ver_area); + + if(lv_area_get_size(&hor_area) <= 0 && lv_area_get_size(&ver_area) <= 0) return; + + lv_draw_rect_dsc_t draw_dsc; + lv_res_t sb_res = scrollbar_init_draw_dsc(obj, &draw_dsc); + if(sb_res != LV_RES_OK) return; + + lv_obj_draw_part_dsc_t part_dsc; + lv_obj_draw_dsc_init(&part_dsc, draw_ctx); + part_dsc.class_p = MY_CLASS; + part_dsc.type = LV_OBJ_DRAW_PART_SCROLLBAR; + part_dsc.rect_dsc = &draw_dsc; + part_dsc.part = LV_PART_SCROLLBAR; + + if(lv_area_get_size(&hor_area) > 0) { + part_dsc.draw_area = &hor_area; + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_dsc); + lv_draw_rect(draw_ctx, &draw_dsc, &hor_area); + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_dsc); + } + if(lv_area_get_size(&ver_area) > 0) { + part_dsc.draw_area = &ver_area; + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_dsc); + part_dsc.draw_area = &ver_area; + lv_draw_rect(draw_ctx, &draw_dsc, &ver_area); + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_dsc); + } +} + +/** + * Initialize the draw descriptor for the scrollbar + * @param obj pointer to an object + * @param dsc the draw descriptor to initialize + * @return LV_RES_OK: the scrollbar is visible; LV_RES_INV: the scrollbar is not visible + */ +static lv_res_t scrollbar_init_draw_dsc(lv_obj_t * obj, lv_draw_rect_dsc_t * dsc) +{ + lv_draw_rect_dsc_init(dsc); + dsc->bg_opa = lv_obj_get_style_bg_opa(obj, LV_PART_SCROLLBAR); + if(dsc->bg_opa > LV_OPA_MIN) { + dsc->bg_color = lv_obj_get_style_bg_color(obj, LV_PART_SCROLLBAR); + } + + dsc->border_opa = lv_obj_get_style_border_opa(obj, LV_PART_SCROLLBAR); + if(dsc->border_opa > LV_OPA_MIN) { + dsc->border_width = lv_obj_get_style_border_width(obj, LV_PART_SCROLLBAR); + if(dsc->border_width > 0) { + dsc->border_color = lv_obj_get_style_border_color(obj, LV_PART_SCROLLBAR); + } + else { + dsc->border_opa = LV_OPA_TRANSP; + } + } + +#if LV_DRAW_COMPLEX + dsc->shadow_opa = lv_obj_get_style_shadow_opa(obj, LV_PART_SCROLLBAR); + if(dsc->shadow_opa > LV_OPA_MIN) { + dsc->shadow_width = lv_obj_get_style_shadow_width(obj, LV_PART_SCROLLBAR); + if(dsc->shadow_width > 0) { + dsc->shadow_spread = lv_obj_get_style_shadow_spread(obj, LV_PART_SCROLLBAR); + dsc->shadow_color = lv_obj_get_style_shadow_color(obj, LV_PART_SCROLLBAR); + } + else { + dsc->shadow_opa = LV_OPA_TRANSP; + } + } + + lv_opa_t opa = lv_obj_get_style_opa(obj, LV_PART_SCROLLBAR); + if(opa < LV_OPA_MAX) { + dsc->bg_opa = (dsc->bg_opa * opa) >> 8; + dsc->border_opa = (dsc->bg_opa * opa) >> 8; + dsc->shadow_opa = (dsc->bg_opa * opa) >> 8; + } + + if(dsc->bg_opa != LV_OPA_TRANSP || dsc->border_opa != LV_OPA_TRANSP || dsc->shadow_opa != LV_OPA_TRANSP) { + dsc->radius = lv_obj_get_style_radius(obj, LV_PART_SCROLLBAR); + return LV_RES_OK; + } + else { + return LV_RES_INV; + } +#else + if(dsc->bg_opa != LV_OPA_TRANSP || dsc->border_opa != LV_OPA_TRANSP) return LV_RES_OK; + else return LV_RES_INV; +#endif +} + +static void lv_obj_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + if(code == LV_EVENT_PRESSED) { + lv_obj_add_state(obj, LV_STATE_PRESSED); + } + else if(code == LV_EVENT_RELEASED) { + lv_obj_clear_state(obj, LV_STATE_PRESSED); + void * param = lv_event_get_param(e); + /*Go the checked state if enabled*/ + if(lv_indev_get_scroll_obj(param) == NULL && lv_obj_has_flag(obj, LV_OBJ_FLAG_CHECKABLE)) { + if(!(lv_obj_get_state(obj) & LV_STATE_CHECKED)) lv_obj_add_state(obj, LV_STATE_CHECKED); + else lv_obj_clear_state(obj, LV_STATE_CHECKED); + + lv_res_t res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RES_OK) return; + } + } + else if(code == LV_EVENT_PRESS_LOST) { + lv_obj_clear_state(obj, LV_STATE_PRESSED); + } + else if(code == LV_EVENT_STYLE_CHANGED) { + uint32_t child_cnt = lv_obj_get_child_cnt(obj); + for(uint32_t i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + lv_obj_mark_layout_as_dirty(child); + } + } + else if(code == LV_EVENT_KEY) { + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_CHECKABLE)) { + char c = *((char *)lv_event_get_param(e)); + if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { + lv_obj_add_state(obj, LV_STATE_CHECKED); + } + else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { + lv_obj_clear_state(obj, LV_STATE_CHECKED); + } + + /*With Enter LV_EVENT_RELEASED will send VALUE_CHANGE event*/ + if(c != LV_KEY_ENTER) { + lv_res_t res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RES_OK) return; + } + } + else if(lv_obj_has_flag(obj, LV_OBJ_FLAG_SCROLLABLE | LV_OBJ_FLAG_SCROLL_WITH_ARROW) && !lv_obj_is_editable(obj)) { + /*scroll by keypad or encoder*/ + lv_anim_enable_t anim_enable = LV_ANIM_OFF; + lv_coord_t sl = lv_obj_get_scroll_left(obj); + lv_coord_t sr = lv_obj_get_scroll_right(obj); + char c = *((char *)lv_event_get_param(e)); + if(c == LV_KEY_DOWN) { + /*use scroll_to_x/y functions to enforce scroll limits*/ + lv_obj_scroll_to_y(obj, lv_obj_get_scroll_y(obj) + lv_obj_get_height(obj) / 4, anim_enable); + } + else if(c == LV_KEY_UP) { + lv_obj_scroll_to_y(obj, lv_obj_get_scroll_y(obj) - lv_obj_get_height(obj) / 4, anim_enable); + } + else if(c == LV_KEY_RIGHT) { + /*If the object can't be scrolled horizontally then scroll it vertically*/ + if(!((lv_obj_get_scroll_dir(obj) & LV_DIR_HOR) && (sl > 0 || sr > 0))) + lv_obj_scroll_to_y(obj, lv_obj_get_scroll_y(obj) + lv_obj_get_height(obj) / 4, anim_enable); + else + lv_obj_scroll_to_x(obj, lv_obj_get_scroll_x(obj) + lv_obj_get_width(obj) / 4, anim_enable); + } + else if(c == LV_KEY_LEFT) { + /*If the object can't be scrolled horizontally then scroll it vertically*/ + if(!((lv_obj_get_scroll_dir(obj) & LV_DIR_HOR) && (sl > 0 || sr > 0))) + lv_obj_scroll_to_y(obj, lv_obj_get_scroll_y(obj) - lv_obj_get_height(obj) / 4, anim_enable); + else + lv_obj_scroll_to_x(obj, lv_obj_get_scroll_x(obj) - lv_obj_get_width(obj) / 4, anim_enable); + } + } + } + else if(code == LV_EVENT_FOCUSED) { + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS)) { + lv_obj_scroll_to_view_recursive(obj, LV_ANIM_ON); + } + + bool editing = false; + editing = lv_group_get_editing(lv_obj_get_group(obj)); + lv_state_t state = LV_STATE_FOCUSED; + + /* Use the indev for then indev handler. + * But if the obj was focused manually it returns NULL so try to + * use the indev from the event*/ + lv_indev_t * indev = lv_indev_get_act(); + if(indev == NULL) indev = lv_event_get_indev(e); + + lv_indev_type_t indev_type = lv_indev_get_type(indev); + if(indev_type == LV_INDEV_TYPE_KEYPAD || indev_type == LV_INDEV_TYPE_ENCODER) state |= LV_STATE_FOCUS_KEY; + if(editing) { + state |= LV_STATE_EDITED; + lv_obj_add_state(obj, state); + } + else { + lv_obj_add_state(obj, state); + lv_obj_clear_state(obj, LV_STATE_EDITED); + } + } + else if(code == LV_EVENT_SCROLL_BEGIN) { + lv_obj_add_state(obj, LV_STATE_SCROLLED); + } + else if(code == LV_EVENT_SCROLL_END) { + lv_obj_clear_state(obj, LV_STATE_SCROLLED); + if(lv_obj_get_scrollbar_mode(obj) == LV_SCROLLBAR_MODE_ACTIVE) { + lv_area_t hor_area, ver_area; + lv_obj_get_scrollbar_area(obj, &hor_area, &ver_area); + lv_obj_invalidate_area(obj, &hor_area); + lv_obj_invalidate_area(obj, &ver_area); + } + } + else if(code == LV_EVENT_DEFOCUSED) { + lv_obj_clear_state(obj, LV_STATE_FOCUSED | LV_STATE_EDITED | LV_STATE_FOCUS_KEY); + } + else if(code == LV_EVENT_SIZE_CHANGED) { + lv_coord_t align = lv_obj_get_style_align(obj, LV_PART_MAIN); + uint16_t layout = lv_obj_get_style_layout(obj, LV_PART_MAIN); + if(layout || align) { + lv_obj_mark_layout_as_dirty(obj); + } + + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_cnt(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + lv_obj_mark_layout_as_dirty(child); + } + } + else if(code == LV_EVENT_CHILD_CHANGED) { + lv_coord_t w = lv_obj_get_style_width(obj, LV_PART_MAIN); + lv_coord_t h = lv_obj_get_style_height(obj, LV_PART_MAIN); + lv_coord_t align = lv_obj_get_style_align(obj, LV_PART_MAIN); + uint16_t layout = lv_obj_get_style_layout(obj, LV_PART_MAIN); + if(layout || align || w == LV_SIZE_CONTENT || h == LV_SIZE_CONTENT) { + lv_obj_mark_layout_as_dirty(obj); + } + } + else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + lv_coord_t d = lv_obj_calculate_ext_draw_size(obj, LV_PART_MAIN); + lv_event_set_ext_draw_size(e, d); + } + else if(code == LV_EVENT_DRAW_MAIN || code == LV_EVENT_DRAW_POST || code == LV_EVENT_COVER_CHECK) { + lv_obj_draw(e); + } +} + +/** + * Set the state (fully overwrite) of an object. + * If specified in the styles, transition animations will be started from the previous state to the current. + * @param obj pointer to an object + * @param state the new state + */ +static void lv_obj_set_state(lv_obj_t * obj, lv_state_t new_state) +{ + if(obj->state == new_state) return; + + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_state_t prev_state = obj->state; + obj->state = new_state; + + _lv_style_state_cmp_t cmp_res = _lv_obj_style_state_compare(obj, prev_state, new_state); + /*If there is no difference in styles there is nothing else to do*/ + if(cmp_res == _LV_STYLE_STATE_CMP_SAME) return; + + _lv_obj_style_transition_dsc_t * ts = lv_mem_buf_get(sizeof(_lv_obj_style_transition_dsc_t) * STYLE_TRANSITION_MAX); + lv_memset_00(ts, sizeof(_lv_obj_style_transition_dsc_t) * STYLE_TRANSITION_MAX); + uint32_t tsi = 0; + uint32_t i; + for(i = 0; i < obj->style_cnt && tsi < STYLE_TRANSITION_MAX; i++) { + _lv_obj_style_t * obj_style = &obj->styles[i]; + lv_state_t state_act = lv_obj_style_get_selector_state(obj->styles[i].selector); + lv_part_t part_act = lv_obj_style_get_selector_part(obj->styles[i].selector); + if(state_act & (~new_state)) continue; /*Skip unrelated styles*/ + if(obj_style->is_trans) continue; + + lv_style_value_t v; + if(lv_style_get_prop_inlined(obj_style->style, LV_STYLE_TRANSITION, &v) != LV_STYLE_RES_FOUND) continue; + const lv_style_transition_dsc_t * tr = v.ptr; + + /*Add the props to the set if not added yet or added but with smaller weight*/ + uint32_t j; + for(j = 0; tr->props[j] != 0 && tsi < STYLE_TRANSITION_MAX; j++) { + uint32_t t; + for(t = 0; t < tsi; t++) { + lv_style_selector_t selector = ts[t].selector; + lv_state_t state_ts = lv_obj_style_get_selector_state(selector); + lv_part_t part_ts = lv_obj_style_get_selector_part(selector); + if(ts[t].prop == tr->props[j] && part_ts == part_act && state_ts >= state_act) break; + } + + /*If not found add it*/ + if(t == tsi) { + ts[tsi].time = tr->time; + ts[tsi].delay = tr->delay; + ts[tsi].path_cb = tr->path_xcb; + ts[tsi].prop = tr->props[j]; +#if LV_USE_USER_DATA + ts[tsi].user_data = tr->user_data; +#endif + ts[tsi].selector = obj_style->selector; + tsi++; + } + } + } + + for(i = 0; i < tsi; i++) { + lv_part_t part_act = lv_obj_style_get_selector_part(ts[i].selector); + _lv_obj_style_create_transition(obj, part_act, prev_state, new_state, &ts[i]); + } + + lv_mem_buf_release(ts); + + if(cmp_res == _LV_STYLE_STATE_CMP_DIFF_REDRAW) { + lv_obj_invalidate(obj); + } + else if(cmp_res == _LV_STYLE_STATE_CMP_DIFF_LAYOUT) { + lv_obj_refresh_style(obj, LV_PART_ANY, LV_STYLE_PROP_ANY); + } + else if(cmp_res == _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD) { + lv_obj_invalidate(obj); + lv_obj_refresh_ext_draw_size(obj); + } +} + +static bool obj_valid_child(const lv_obj_t * parent, const lv_obj_t * obj_to_find) +{ + /*Check all children of `parent`*/ + uint32_t child_cnt = 0; + if(parent->spec_attr) child_cnt = parent->spec_attr->child_cnt; + uint32_t i; + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = parent->spec_attr->children[i]; + if(child == obj_to_find) { + return true; + } + + /*Check the children*/ + bool found = obj_valid_child(child, obj_to_find); + if(found) { + return true; + } + } + return false; +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj.h new file mode 100644 index 0000000..c89e460 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj.h @@ -0,0 +1,409 @@ +/** + * @file lv_obj.h + * + */ + +#ifndef LV_OBJ_H +#define LV_OBJ_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include +#include +#include "../misc/lv_style.h" +#include "../misc/lv_types.h" +#include "../misc/lv_area.h" +#include "../misc/lv_color.h" +#include "../misc/lv_assert.h" +#include "../hal/lv_hal.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_obj_t; + +/** + * Possible states of a widget. + * OR-ed values are possible + */ +enum { + LV_STATE_DEFAULT = 0x0000, + LV_STATE_CHECKED = 0x0001, + LV_STATE_FOCUSED = 0x0002, + LV_STATE_FOCUS_KEY = 0x0004, + LV_STATE_EDITED = 0x0008, + LV_STATE_HOVERED = 0x0010, + LV_STATE_PRESSED = 0x0020, + LV_STATE_SCROLLED = 0x0040, + LV_STATE_DISABLED = 0x0080, + + LV_STATE_USER_1 = 0x1000, + LV_STATE_USER_2 = 0x2000, + LV_STATE_USER_3 = 0x4000, + LV_STATE_USER_4 = 0x8000, + + LV_STATE_ANY = 0xFFFF, /**< Special value can be used in some functions to target all states*/ +}; + +typedef uint16_t lv_state_t; + +/** + * The possible parts of widgets. + * The parts can be considered as the internal building block of the widgets. + * E.g. slider = background + indicator + knob + * Not all parts are used by every widget + */ +enum { + LV_PART_MAIN = 0x000000, /**< A background like rectangle*/ + LV_PART_SCROLLBAR = 0x010000, /**< The scrollbar(s)*/ + LV_PART_INDICATOR = 0x020000, /**< Indicator, e.g. for slider, bar, switch, or the tick box of the checkbox*/ + LV_PART_KNOB = 0x030000, /**< Like handle to grab to adjust the value*/ + LV_PART_SELECTED = 0x040000, /**< Indicate the currently selected option or section*/ + LV_PART_ITEMS = 0x050000, /**< Used if the widget has multiple similar elements (e.g. table cells)*/ + LV_PART_TICKS = 0x060000, /**< Ticks on scale e.g. for a chart or meter*/ + LV_PART_CURSOR = 0x070000, /**< Mark a specific place e.g. for text area's cursor or on a chart*/ + + LV_PART_CUSTOM_FIRST = 0x080000, /**< Extension point for custom widgets*/ + + LV_PART_ANY = 0x0F0000, /**< Special value can be used in some functions to target all parts*/ +}; + +typedef uint32_t lv_part_t; + +/** + * On/Off features controlling the object's behavior. + * OR-ed values are possible + */ +enum { + LV_OBJ_FLAG_HIDDEN = (1L << 0), /**< Make the object hidden. (Like it wasn't there at all)*/ + LV_OBJ_FLAG_CLICKABLE = (1L << 1), /**< Make the object clickable by the input devices*/ + LV_OBJ_FLAG_CLICK_FOCUSABLE = (1L << 2), /**< Add focused state to the object when clicked*/ + LV_OBJ_FLAG_CHECKABLE = (1L << 3), /**< Toggle checked state when the object is clicked*/ + LV_OBJ_FLAG_SCROLLABLE = (1L << 4), /**< Make the object scrollable*/ + LV_OBJ_FLAG_SCROLL_ELASTIC = (1L << 5), /**< Allow scrolling inside but with slower speed*/ + LV_OBJ_FLAG_SCROLL_MOMENTUM = (1L << 6), /**< Make the object scroll further when "thrown"*/ + LV_OBJ_FLAG_SCROLL_ONE = (1L << 7), /**< Allow scrolling only one snappable children*/ + LV_OBJ_FLAG_SCROLL_CHAIN_HOR = (1L << 8), /**< Allow propagating the horizontal scroll to a parent*/ + LV_OBJ_FLAG_SCROLL_CHAIN_VER = (1L << 9), /**< Allow propagating the vertical scroll to a parent*/ + LV_OBJ_FLAG_SCROLL_CHAIN = (LV_OBJ_FLAG_SCROLL_CHAIN_HOR | LV_OBJ_FLAG_SCROLL_CHAIN_VER), + LV_OBJ_FLAG_SCROLL_ON_FOCUS = (1L << 10), /**< Automatically scroll object to make it visible when focused*/ + LV_OBJ_FLAG_SCROLL_WITH_ARROW = (1L << 11), /**< Allow scrolling the focused object with arrow keys*/ + LV_OBJ_FLAG_SNAPPABLE = (1L << 12), /**< If scroll snap is enabled on the parent it can snap to this object*/ + LV_OBJ_FLAG_PRESS_LOCK = (1L << 13), /**< Keep the object pressed even if the press slid from the object*/ + LV_OBJ_FLAG_EVENT_BUBBLE = (1L << 14), /**< Propagate the events to the parent too*/ + LV_OBJ_FLAG_GESTURE_BUBBLE = (1L << 15), /**< Propagate the gestures to the parent*/ + LV_OBJ_FLAG_ADV_HITTEST = (1L << 16), /**< Allow performing more accurate hit (click) test. E.g. consider rounded corners.*/ + LV_OBJ_FLAG_IGNORE_LAYOUT = (1L << 17), /**< Make the object position-able by the layouts*/ + LV_OBJ_FLAG_FLOATING = (1L << 18), /**< Do not scroll the object when the parent scrolls and ignore layout*/ + LV_OBJ_FLAG_OVERFLOW_VISIBLE = (1L << 19), /**< Do not clip the children's content to the parent's boundary*/ + + LV_OBJ_FLAG_LAYOUT_1 = (1L << 23), /**< Custom flag, free to use by layouts*/ + LV_OBJ_FLAG_LAYOUT_2 = (1L << 24), /**< Custom flag, free to use by layouts*/ + + LV_OBJ_FLAG_WIDGET_1 = (1L << 25), /**< Custom flag, free to use by widget*/ + LV_OBJ_FLAG_WIDGET_2 = (1L << 26), /**< Custom flag, free to use by widget*/ + LV_OBJ_FLAG_USER_1 = (1L << 27), /**< Custom flag, free to use by user*/ + LV_OBJ_FLAG_USER_2 = (1L << 28), /**< Custom flag, free to use by user*/ + LV_OBJ_FLAG_USER_3 = (1L << 29), /**< Custom flag, free to use by user*/ + LV_OBJ_FLAG_USER_4 = (1L << 30), /**< Custom flag, free to use by user*/ + +}; + + +typedef uint32_t lv_obj_flag_t; + +/** + * `type` field in `lv_obj_draw_part_dsc_t` if `class_p = lv_obj_class` + * Used in `LV_EVENT_DRAW_PART_BEGIN` and `LV_EVENT_DRAW_PART_END` + */ +typedef enum { + LV_OBJ_DRAW_PART_RECTANGLE, /**< The main rectangle*/ + LV_OBJ_DRAW_PART_BORDER_POST,/**< The border if style_border_post = true*/ + LV_OBJ_DRAW_PART_SCROLLBAR, /**< The scrollbar*/ +} lv_obj_draw_part_type_t; + +#include "lv_obj_tree.h" +#include "lv_obj_pos.h" +#include "lv_obj_scroll.h" +#include "lv_obj_style.h" +#include "lv_obj_draw.h" +#include "lv_obj_class.h" +#include "lv_event.h" +#include "lv_group.h" + +/** + * Make the base object's class publicly available. + */ +extern const lv_obj_class_t lv_obj_class; + +/** + * Special, rarely used attributes. + * They are allocated automatically if any elements is set. + */ +typedef struct { + struct _lv_obj_t ** children; /**< Store the pointer of the children in an array.*/ + uint32_t child_cnt; /**< Number of children*/ + lv_group_t * group_p; + + struct _lv_event_dsc_t * event_dsc; /**< Dynamically allocated event callback and user data array*/ + lv_point_t scroll; /**< The current X/Y scroll offset*/ + + lv_coord_t ext_click_pad; /**< Extra click padding in all direction*/ + lv_coord_t ext_draw_size; /**< EXTend the size in every direction for drawing.*/ + + lv_scrollbar_mode_t scrollbar_mode : 2; /**< How to display scrollbars*/ + lv_scroll_snap_t scroll_snap_x : 2; /**< Where to align the snappable children horizontally*/ + lv_scroll_snap_t scroll_snap_y : 2; /**< Where to align the snappable children vertically*/ + lv_dir_t scroll_dir : 4; /**< The allowed scroll direction(s)*/ + uint8_t event_dsc_cnt : 6; /**< Number of event callbacks stored in `event_dsc` array*/ + uint8_t layer_type : 2; /**< Cache the layer type here. Element of @lv_intermediate_layer_type_t */ +} _lv_obj_spec_attr_t; + +typedef struct _lv_obj_t { + const lv_obj_class_t * class_p; + struct _lv_obj_t * parent; + _lv_obj_spec_attr_t * spec_attr; + _lv_obj_style_t * styles; +#if LV_USE_USER_DATA + void * user_data; +#endif + lv_area_t coords; + lv_obj_flag_t flags; + lv_state_t state; + uint16_t layout_inv : 1; + uint16_t scr_layout_inv : 1; + uint16_t skip_trans : 1; + uint16_t style_cnt : 6; + uint16_t h_layout : 1; + uint16_t w_layout : 1; +} lv_obj_t; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize LVGL library. + * Should be called before any other LVGL related function. + */ +void lv_init(void); + +#if LV_ENABLE_GC || !LV_MEM_CUSTOM + +/** + * Deinit the 'lv' library + * Currently only implemented when not using custom allocators, or GC is enabled. + */ +void lv_deinit(void); + +#endif + +/** + * Returns whether the 'lv' library is currently initialized + */ +bool lv_is_initialized(void); + +/** + * Create a base object (a rectangle) + * @param parent pointer to a parent object. If NULL then a screen will be created. + * @return pointer to the new object + */ +lv_obj_t * lv_obj_create(lv_obj_t * parent); + + +/*===================== + * Setter functions + *====================*/ + +/** + * Set one or more flags + * @param obj pointer to an object + * @param f R-ed values from `lv_obj_flag_t` to set. + */ +void lv_obj_add_flag(lv_obj_t * obj, lv_obj_flag_t f); + +/** + * Clear one or more flags + * @param obj pointer to an object + * @param f OR-ed values from `lv_obj_flag_t` to set. + */ +void lv_obj_clear_flag(lv_obj_t * obj, lv_obj_flag_t f); + + +/** + * Add one or more states to the object. The other state bits will remain unchanged. + * If specified in the styles, transition animation will be started from the previous state to the current. + * @param obj pointer to an object + * @param state the states to add. E.g `LV_STATE_PRESSED | LV_STATE_FOCUSED` + */ +void lv_obj_add_state(lv_obj_t * obj, lv_state_t state); + +/** + * Remove one or more states to the object. The other state bits will remain unchanged. + * If specified in the styles, transition animation will be started from the previous state to the current. + * @param obj pointer to an object + * @param state the states to add. E.g `LV_STATE_PRESSED | LV_STATE_FOCUSED` + */ +void lv_obj_clear_state(lv_obj_t * obj, lv_state_t state); + +/** + * Set the user_data field of the object + * @param obj pointer to an object + * @param user_data pointer to the new user_data. + */ +#if LV_USE_USER_DATA +static inline void lv_obj_set_user_data(lv_obj_t * obj, void * user_data) +{ + obj->user_data = user_data; +} +#endif + +/*======================= + * Getter functions + *======================*/ + +/** + * Check if a given flag or all the given flags are set on an object. + * @param obj pointer to an object + * @param f the flag(s) to check (OR-ed values can be used) + * @return true: all flags are set; false: not all flags are set + */ +bool lv_obj_has_flag(const lv_obj_t * obj, lv_obj_flag_t f); + +/** + * Check if a given flag or any of the flags are set on an object. + * @param obj pointer to an object + * @param f the flag(s) to check (OR-ed values can be used) + * @return true: at lest one flag flag is set; false: none of the flags are set + */ +bool lv_obj_has_flag_any(const lv_obj_t * obj, lv_obj_flag_t f); + +/** + * Get the state of an object + * @param obj pointer to an object + * @return the state (OR-ed values from `lv_state_t`) + */ +lv_state_t lv_obj_get_state(const lv_obj_t * obj); + +/** + * Check if the object is in a given state or not. + * @param obj pointer to an object + * @param state a state or combination of states to check + * @return true: `obj` is in `state`; false: `obj` is not in `state` + */ +bool lv_obj_has_state(const lv_obj_t * obj, lv_state_t state); + +/** + * Get the group of the object + * @param obj pointer to an object + * @return the pointer to group of the object + */ +void * lv_obj_get_group(const lv_obj_t * obj); + +/** + * Get the user_data field of the object + * @param obj pointer to an object + * @return the pointer to the user_data of the object + */ +#if LV_USE_USER_DATA +static inline void * lv_obj_get_user_data(lv_obj_t * obj) +{ + return obj->user_data; +} +#endif + +/*======================= + * Other functions + *======================*/ + +/** + * Allocate special data for an object if not allocated yet. + * @param obj pointer to an object + */ +void lv_obj_allocate_spec_attr(lv_obj_t * obj); + +/** + * Check the type of obj. + * @param obj pointer to an object + * @param class_p a class to check (e.g. `lv_slider_class`) + * @return true: `class_p` is the `obj` class. + */ +bool lv_obj_check_type(const lv_obj_t * obj, const lv_obj_class_t * class_p); + +/** + * Check if any object has a given class (type). + * It checks the ancestor classes too. + * @param obj pointer to an object + * @param class_p a class to check (e.g. `lv_slider_class`) + * @return true: `obj` has the given class + */ +bool lv_obj_has_class(const lv_obj_t * obj, const lv_obj_class_t * class_p); + +/** + * Get the class (type) of the object + * @param obj pointer to an object + * @return the class (type) of the object + */ +const lv_obj_class_t * lv_obj_get_class(const lv_obj_t * obj); + +/** + * Check if any object is still "alive". + * @param obj pointer to an object + * @return true: valid + */ +bool lv_obj_is_valid(const lv_obj_t * obj); + +/** + * Scale the given number of pixels (a distance or size) relative to a 160 DPI display + * considering the DPI of the `obj`'s display. + * It ensures that e.g. `lv_dpx(100)` will have the same physical size regardless to the + * DPI of the display. + * @param obj an object whose display's dpi should be considered + * @param n the number of pixels to scale + * @return `n x current_dpi/160` + */ +static inline lv_coord_t lv_obj_dpx(const lv_obj_t * obj, lv_coord_t n) +{ + return _LV_DPX_CALC(lv_disp_get_dpi(lv_obj_get_disp(obj)), n); +} + +/********************** + * MACROS + **********************/ + +#if LV_USE_ASSERT_OBJ +# define LV_ASSERT_OBJ(obj_p, obj_class) \ + do { \ + LV_ASSERT_MSG(obj_p != NULL, "The object is NULL"); \ + LV_ASSERT_MSG(lv_obj_has_class(obj_p, obj_class) == true, "Incompatible object type."); \ + LV_ASSERT_MSG(lv_obj_is_valid(obj_p) == true, "The object is invalid, deleted or corrupted?"); \ + } while(0) +# else +# define LV_ASSERT_OBJ(obj_p, obj_class) do{}while(0) +#endif + +#if LV_USE_LOG && LV_LOG_TRACE_OBJ_CREATE +# define LV_TRACE_OBJ_CREATE(...) LV_LOG_TRACE(__VA_ARGS__) +#else +# define LV_TRACE_OBJ_CREATE(...) +#endif + + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_class.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_class.c new file mode 100644 index 0000000..fe20448 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_class.c @@ -0,0 +1,202 @@ +/** + * @file lv_obj_class.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj.h" +#include "lv_theme.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_obj_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_obj_construct(lv_obj_t * obj); +static uint32_t get_instance_size(const lv_obj_class_t * class_p); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_obj_class_create_obj(const lv_obj_class_t * class_p, lv_obj_t * parent) +{ + LV_TRACE_OBJ_CREATE("Creating object with %p class on %p parent", (void *)class_p, (void *)parent); + uint32_t s = get_instance_size(class_p); + lv_obj_t * obj = lv_mem_alloc(s); + if(obj == NULL) return NULL; + lv_memset_00(obj, s); + obj->class_p = class_p; + obj->parent = parent; + + /*Create a screen*/ + if(parent == NULL) { + LV_TRACE_OBJ_CREATE("creating a screen"); + lv_disp_t * disp = lv_disp_get_default(); + if(!disp) { + LV_LOG_WARN("No display created yet. No place to assign the new screen"); + lv_mem_free(obj); + return NULL; + } + + if(disp->screens == NULL) { + disp->screens = lv_mem_alloc(sizeof(lv_obj_t *)); + disp->screens[0] = obj; + disp->screen_cnt = 1; + } + else { + disp->screen_cnt++; + disp->screens = lv_mem_realloc(disp->screens, sizeof(lv_obj_t *) * disp->screen_cnt); + disp->screens[disp->screen_cnt - 1] = obj; + } + + /*Set coordinates to full screen size*/ + obj->coords.x1 = 0; + obj->coords.y1 = 0; + obj->coords.x2 = lv_disp_get_hor_res(NULL) - 1; + obj->coords.y2 = lv_disp_get_ver_res(NULL) - 1; + } + /*Create a normal object*/ + else { + LV_TRACE_OBJ_CREATE("creating normal object"); + LV_ASSERT_OBJ(parent, MY_CLASS); + if(parent->spec_attr == NULL) { + lv_obj_allocate_spec_attr(parent); + } + + if(parent->spec_attr->children == NULL) { + parent->spec_attr->children = lv_mem_alloc(sizeof(lv_obj_t *)); + parent->spec_attr->children[0] = obj; + parent->spec_attr->child_cnt = 1; + } + else { + parent->spec_attr->child_cnt++; + parent->spec_attr->children = lv_mem_realloc(parent->spec_attr->children, + sizeof(lv_obj_t *) * parent->spec_attr->child_cnt); + parent->spec_attr->children[parent->spec_attr->child_cnt - 1] = obj; + } + } + + return obj; +} + +void lv_obj_class_init_obj(lv_obj_t * obj) +{ + lv_obj_mark_layout_as_dirty(obj); + lv_obj_enable_style_refresh(false); + + lv_theme_apply(obj); + lv_obj_construct(obj); + + lv_obj_enable_style_refresh(true); + lv_obj_refresh_style(obj, LV_PART_ANY, LV_STYLE_PROP_ANY); + + lv_obj_refresh_self_size(obj); + + lv_group_t * def_group = lv_group_get_default(); + if(def_group && lv_obj_is_group_def(obj)) { + lv_group_add_obj(def_group, obj); + } + + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent) { + /*Call the ancestor's event handler to the parent to notify it about the new child. + *Also triggers layout update*/ + lv_event_send(parent, LV_EVENT_CHILD_CHANGED, obj); + lv_event_send(parent, LV_EVENT_CHILD_CREATED, obj); + + /*Invalidate the area if not screen created*/ + lv_obj_invalidate(obj); + } +} + +void _lv_obj_destruct(lv_obj_t * obj) +{ + if(obj->class_p->destructor_cb) obj->class_p->destructor_cb(obj->class_p, obj); + + if(obj->class_p->base_class) { + /*Don't let the descendant methods run during destructing the ancestor type*/ + obj->class_p = obj->class_p->base_class; + + /*Call the base class's destructor too*/ + _lv_obj_destruct(obj); + } +} + +bool lv_obj_is_editable(lv_obj_t * obj) +{ + const lv_obj_class_t * class_p = obj->class_p; + + /*Find a base in which editable is set*/ + while(class_p && class_p->editable == LV_OBJ_CLASS_EDITABLE_INHERIT) class_p = class_p->base_class; + + if(class_p == NULL) return false; + + return class_p->editable == LV_OBJ_CLASS_EDITABLE_TRUE ? true : false; +} + +bool lv_obj_is_group_def(lv_obj_t * obj) +{ + const lv_obj_class_t * class_p = obj->class_p; + + /*Find a base in which group_def is set*/ + while(class_p && class_p->group_def == LV_OBJ_CLASS_GROUP_DEF_INHERIT) class_p = class_p->base_class; + + if(class_p == NULL) return false; + + return class_p->group_def == LV_OBJ_CLASS_GROUP_DEF_TRUE ? true : false; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_obj_construct(lv_obj_t * obj) +{ + const lv_obj_class_t * original_class_p = obj->class_p; + + if(obj->class_p->base_class) { + /*Don't let the descendant methods run during constructing the ancestor type*/ + obj->class_p = obj->class_p->base_class; + + /*Construct the base first*/ + lv_obj_construct(obj); + } + + /*Restore the original class*/ + obj->class_p = original_class_p; + + if(obj->class_p->constructor_cb) obj->class_p->constructor_cb(obj->class_p, obj); +} + +static uint32_t get_instance_size(const lv_obj_class_t * class_p) +{ + /*Find a base in which instance size is set*/ + const lv_obj_class_t * base = class_p; + while(base && base->instance_size == 0) base = base->base_class; + + if(base == NULL) return 0; /*Never happens: set at least in `lv_obj` class*/ + + return base->instance_size; +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_class.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_class.h new file mode 100644 index 0000000..01a7248 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_class.h @@ -0,0 +1,94 @@ +/** + * @file lv_obj_class.h + * + */ + +#ifndef LV_OBJ_CLASS_H +#define LV_OBJ_CLASS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include + +/********************* + * DEFINES + *********************/ + + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_obj_t; +struct _lv_obj_class_t; +struct _lv_event_t; + +typedef enum { + LV_OBJ_CLASS_EDITABLE_INHERIT, /**< Check the base class. Must have 0 value to let zero initialized class inherit*/ + LV_OBJ_CLASS_EDITABLE_TRUE, + LV_OBJ_CLASS_EDITABLE_FALSE, +} lv_obj_class_editable_t; + +typedef enum { + LV_OBJ_CLASS_GROUP_DEF_INHERIT, /**< Check the base class. Must have 0 value to let zero initialized class inherit*/ + LV_OBJ_CLASS_GROUP_DEF_TRUE, + LV_OBJ_CLASS_GROUP_DEF_FALSE, +} lv_obj_class_group_def_t; + +typedef void (*lv_obj_class_event_cb_t)(struct _lv_obj_class_t * class_p, struct _lv_event_t * e); +/** + * Describe the common methods of every object. + * Similar to a C++ class. + */ +typedef struct _lv_obj_class_t { + const struct _lv_obj_class_t * base_class; + void (*constructor_cb)(const struct _lv_obj_class_t * class_p, struct _lv_obj_t * obj); + void (*destructor_cb)(const struct _lv_obj_class_t * class_p, struct _lv_obj_t * obj); +#if LV_USE_USER_DATA + void * user_data; +#endif + void (*event_cb)(const struct _lv_obj_class_t * class_p, + struct _lv_event_t * e); /**< Widget type specific event function*/ + lv_coord_t width_def; + lv_coord_t height_def; + uint32_t editable : 2; /**< Value from ::lv_obj_class_editable_t*/ + uint32_t group_def : 2; /**< Value from ::lv_obj_class_group_def_t*/ + uint32_t instance_size : 16; +} lv_obj_class_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an object form a class descriptor + * @param class_p pointer to a class + * @param parent pointer to an object where the new object should be created + * @return pointer to the created object + */ +struct _lv_obj_t * lv_obj_class_create_obj(const struct _lv_obj_class_t * class_p, struct _lv_obj_t * parent); + +void lv_obj_class_init_obj(struct _lv_obj_t * obj); + +void _lv_obj_destruct(struct _lv_obj_t * obj); + +bool lv_obj_is_editable(struct _lv_obj_t * obj); + +bool lv_obj_is_group_def(struct _lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_CLASS_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_draw.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_draw.c new file mode 100644 index 0000000..f2428cd --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_draw.c @@ -0,0 +1,406 @@ +/** + * @file lv_obj_draw.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj_draw.h" +#include "lv_obj.h" +#include "lv_disp.h" +#include "lv_indev.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_obj_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint32_t part, lv_draw_rect_dsc_t * draw_dsc) +{ + lv_opa_t opa = LV_OPA_COVER; + if(part != LV_PART_MAIN) { + opa = lv_obj_get_style_opa(obj, part); + if(opa <= LV_OPA_MIN) { + draw_dsc->bg_opa = LV_OPA_TRANSP; + draw_dsc->bg_img_opa = LV_OPA_TRANSP; + draw_dsc->border_opa = LV_OPA_TRANSP; + draw_dsc->outline_opa = LV_OPA_TRANSP; + draw_dsc->shadow_opa = LV_OPA_TRANSP; + return; + } + } + +#if LV_DRAW_COMPLEX + if(part != LV_PART_MAIN) draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part); + + draw_dsc->radius = lv_obj_get_style_radius(obj, part); + + if(draw_dsc->bg_opa != LV_OPA_TRANSP) { + draw_dsc->bg_opa = lv_obj_get_style_bg_opa(obj, part); + if(draw_dsc->bg_opa > LV_OPA_MIN) { + draw_dsc->bg_color = lv_obj_get_style_bg_color_filtered(obj, part); + const lv_grad_dsc_t * grad = lv_obj_get_style_bg_grad(obj, part); + if(grad && grad->dir != LV_GRAD_DIR_NONE) { + lv_memcpy(&draw_dsc->bg_grad, grad, sizeof(*grad)); + } + else { + draw_dsc->bg_grad.dir = lv_obj_get_style_bg_grad_dir(obj, part); + if(draw_dsc->bg_grad.dir != LV_GRAD_DIR_NONE) { + draw_dsc->bg_grad.stops[0].color = lv_obj_get_style_bg_color_filtered(obj, part); + draw_dsc->bg_grad.stops[1].color = lv_obj_get_style_bg_grad_color_filtered(obj, part); + draw_dsc->bg_grad.stops[0].frac = lv_obj_get_style_bg_main_stop(obj, part); + draw_dsc->bg_grad.stops[1].frac = lv_obj_get_style_bg_grad_stop(obj, part); + } + draw_dsc->bg_grad.dither = lv_obj_get_style_bg_dither_mode(obj, part); + } + } + } + + draw_dsc->border_width = lv_obj_get_style_border_width(obj, part); + if(draw_dsc->border_width) { + if(draw_dsc->border_opa != LV_OPA_TRANSP) { + draw_dsc->border_opa = lv_obj_get_style_border_opa(obj, part); + if(draw_dsc->border_opa > LV_OPA_MIN) { + draw_dsc->border_side = lv_obj_get_style_border_side(obj, part); + draw_dsc->border_color = lv_obj_get_style_border_color_filtered(obj, part); + } + } + } + + draw_dsc->outline_width = lv_obj_get_style_outline_width(obj, part); + if(draw_dsc->outline_width) { + if(draw_dsc->outline_opa != LV_OPA_TRANSP) { + draw_dsc->outline_opa = lv_obj_get_style_outline_opa(obj, part); + if(draw_dsc->outline_opa > LV_OPA_MIN) { + draw_dsc->outline_pad = lv_obj_get_style_outline_pad(obj, part); + draw_dsc->outline_color = lv_obj_get_style_outline_color_filtered(obj, part); + } + } + } + + if(draw_dsc->bg_img_opa != LV_OPA_TRANSP) { + draw_dsc->bg_img_src = lv_obj_get_style_bg_img_src(obj, part); + if(draw_dsc->bg_img_src) { + draw_dsc->bg_img_opa = lv_obj_get_style_bg_img_opa(obj, part); + if(draw_dsc->bg_img_opa > LV_OPA_MIN) { + if(lv_img_src_get_type(draw_dsc->bg_img_src) == LV_IMG_SRC_SYMBOL) { + draw_dsc->bg_img_symbol_font = lv_obj_get_style_text_font(obj, part); + draw_dsc->bg_img_recolor = lv_obj_get_style_text_color_filtered(obj, part); + } + else { + draw_dsc->bg_img_recolor = lv_obj_get_style_bg_img_recolor_filtered(obj, part); + draw_dsc->bg_img_recolor_opa = lv_obj_get_style_bg_img_recolor_opa(obj, part); + draw_dsc->bg_img_tiled = lv_obj_get_style_bg_img_tiled(obj, part); + } + } + } + } + + if(draw_dsc->shadow_opa) { + draw_dsc->shadow_width = lv_obj_get_style_shadow_width(obj, part); + if(draw_dsc->shadow_width) { + if(draw_dsc->shadow_opa > LV_OPA_MIN) { + draw_dsc->shadow_opa = lv_obj_get_style_shadow_opa(obj, part); + if(draw_dsc->shadow_opa > LV_OPA_MIN) { + draw_dsc->shadow_ofs_x = lv_obj_get_style_shadow_ofs_x(obj, part); + draw_dsc->shadow_ofs_y = lv_obj_get_style_shadow_ofs_y(obj, part); + draw_dsc->shadow_spread = lv_obj_get_style_shadow_spread(obj, part); + draw_dsc->shadow_color = lv_obj_get_style_shadow_color_filtered(obj, part); + } + } + } + } + +#else /*LV_DRAW_COMPLEX*/ + if(draw_dsc->bg_opa != LV_OPA_TRANSP) { + draw_dsc->bg_opa = lv_obj_get_style_bg_opa(obj, part); + if(draw_dsc->bg_opa > LV_OPA_MIN) { + draw_dsc->bg_color = lv_obj_get_style_bg_color_filtered(obj, part); + } + } + + draw_dsc->border_width = lv_obj_get_style_border_width(obj, part); + if(draw_dsc->border_width) { + if(draw_dsc->border_opa != LV_OPA_TRANSP) { + draw_dsc->border_opa = lv_obj_get_style_border_opa(obj, part); + if(draw_dsc->border_opa > LV_OPA_MIN) { + draw_dsc->border_color = lv_obj_get_style_border_color_filtered(obj, part); + draw_dsc->border_side = lv_obj_get_style_border_side(obj, part); + } + } + } + + draw_dsc->outline_width = lv_obj_get_style_outline_width(obj, part); + if(draw_dsc->outline_width) { + if(draw_dsc->outline_opa != LV_OPA_TRANSP) { + draw_dsc->outline_opa = lv_obj_get_style_outline_opa(obj, part); + if(draw_dsc->outline_opa > LV_OPA_MIN) { + draw_dsc->outline_pad = lv_obj_get_style_outline_pad(obj, part); + draw_dsc->outline_color = lv_obj_get_style_outline_color_filtered(obj, part); + } + } + } + + if(draw_dsc->bg_img_opa != LV_OPA_TRANSP) { + draw_dsc->bg_img_src = lv_obj_get_style_bg_img_src(obj, part); + if(draw_dsc->bg_img_src) { + draw_dsc->bg_img_opa = lv_obj_get_style_bg_img_opa(obj, part); + if(draw_dsc->bg_img_opa > LV_OPA_MIN) { + if(lv_img_src_get_type(draw_dsc->bg_img_src) == LV_IMG_SRC_SYMBOL) { + draw_dsc->bg_img_symbol_font = lv_obj_get_style_text_font(obj, part); + draw_dsc->bg_img_recolor = lv_obj_get_style_text_color_filtered(obj, part); + } + else { + draw_dsc->bg_img_recolor = lv_obj_get_style_bg_img_recolor_filtered(obj, part); + draw_dsc->bg_img_recolor_opa = lv_obj_get_style_bg_img_recolor_opa(obj, part); + draw_dsc->bg_img_tiled = lv_obj_get_style_bg_img_tiled(obj, part); + } + } + } + } +#endif + + if(part != LV_PART_MAIN) { + if(opa < LV_OPA_MAX) { + draw_dsc->bg_opa = (opa * draw_dsc->shadow_opa) >> 8; + draw_dsc->bg_img_opa = (opa * draw_dsc->shadow_opa) >> 8; + draw_dsc->border_opa = (opa * draw_dsc->shadow_opa) >> 8; + draw_dsc->outline_opa = (opa * draw_dsc->shadow_opa) >> 8; + draw_dsc->shadow_opa = (opa * draw_dsc->shadow_opa) >> 8; + } + } +} + +void lv_obj_init_draw_label_dsc(lv_obj_t * obj, uint32_t part, lv_draw_label_dsc_t * draw_dsc) +{ + draw_dsc->opa = lv_obj_get_style_text_opa(obj, part); + if(draw_dsc->opa <= LV_OPA_MIN) return; + + if(part != LV_PART_MAIN) { + lv_opa_t opa = lv_obj_get_style_opa(obj, part); + if(opa <= LV_OPA_MIN) { + draw_dsc->opa = LV_OPA_TRANSP; + return; + } + if(opa < LV_OPA_MAX) { + draw_dsc->opa = (opa * draw_dsc->opa) >> 8; + } + } + + draw_dsc->color = lv_obj_get_style_text_color_filtered(obj, part); + draw_dsc->letter_space = lv_obj_get_style_text_letter_space(obj, part); + draw_dsc->line_space = lv_obj_get_style_text_line_space(obj, part); + draw_dsc->decor = lv_obj_get_style_text_decor(obj, part); +#if LV_DRAW_COMPLEX + if(part != LV_PART_MAIN) draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part); +#endif + + draw_dsc->font = lv_obj_get_style_text_font(obj, part); + +#if LV_USE_BIDI + draw_dsc->bidi_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); +#endif + + draw_dsc->align = lv_obj_get_style_text_align(obj, part); +} + +void lv_obj_init_draw_img_dsc(lv_obj_t * obj, uint32_t part, lv_draw_img_dsc_t * draw_dsc) +{ + draw_dsc->opa = lv_obj_get_style_img_opa(obj, part); + if(draw_dsc->opa <= LV_OPA_MIN) return; + + if(part != LV_PART_MAIN) { + lv_opa_t opa = lv_obj_get_style_opa(obj, part); + if(opa <= LV_OPA_MIN) { + draw_dsc->opa = LV_OPA_TRANSP; + return; + } + if(opa < LV_OPA_MAX) { + draw_dsc->opa = (opa * draw_dsc->opa) >> 8; + } + } + + draw_dsc->angle = 0; + draw_dsc->zoom = LV_IMG_ZOOM_NONE; + draw_dsc->pivot.x = lv_area_get_width(&obj->coords) / 2; + draw_dsc->pivot.y = lv_area_get_height(&obj->coords) / 2; + + draw_dsc->recolor_opa = lv_obj_get_style_img_recolor_opa(obj, part); + if(draw_dsc->recolor_opa > 0) { + draw_dsc->recolor = lv_obj_get_style_img_recolor_filtered(obj, part); + } +#if LV_DRAW_COMPLEX + if(part != LV_PART_MAIN) draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part); +#endif +} + +void lv_obj_init_draw_line_dsc(lv_obj_t * obj, uint32_t part, lv_draw_line_dsc_t * draw_dsc) +{ + draw_dsc->opa = lv_obj_get_style_line_opa(obj, part); + if(draw_dsc->opa <= LV_OPA_MIN) return; + + if(part != LV_PART_MAIN) { + lv_opa_t opa = lv_obj_get_style_opa(obj, part); + if(opa <= LV_OPA_MIN) { + draw_dsc->opa = LV_OPA_TRANSP; + return; + } + if(opa < LV_OPA_MAX) { + draw_dsc->opa = (opa * draw_dsc->opa) >> 8; + } + } + + draw_dsc->width = lv_obj_get_style_line_width(obj, part); + if(draw_dsc->width == 0) return; + + draw_dsc->color = lv_obj_get_style_line_color_filtered(obj, part); + + draw_dsc->dash_width = lv_obj_get_style_line_dash_width(obj, part); + if(draw_dsc->dash_width) { + draw_dsc->dash_gap = lv_obj_get_style_line_dash_gap(obj, part); + } + + draw_dsc->round_start = lv_obj_get_style_line_rounded(obj, part); + draw_dsc->round_end = draw_dsc->round_start; + +#if LV_DRAW_COMPLEX + if(part != LV_PART_MAIN) draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part); +#endif +} + +void lv_obj_init_draw_arc_dsc(lv_obj_t * obj, uint32_t part, lv_draw_arc_dsc_t * draw_dsc) +{ + draw_dsc->width = lv_obj_get_style_arc_width(obj, part); + if(draw_dsc->width == 0) return; + + draw_dsc->opa = lv_obj_get_style_arc_opa(obj, part); + if(draw_dsc->opa <= LV_OPA_MIN) return; + + if(part != LV_PART_MAIN) { + lv_opa_t opa = lv_obj_get_style_opa(obj, part); + if(opa <= LV_OPA_MIN) { + draw_dsc->opa = LV_OPA_TRANSP; + return; + } + if(opa < LV_OPA_MAX) { + draw_dsc->opa = (opa * draw_dsc->opa) >> 8; + } + } + + draw_dsc->color = lv_obj_get_style_arc_color_filtered(obj, part); + draw_dsc->img_src = lv_obj_get_style_arc_img_src(obj, part); + + draw_dsc->rounded = lv_obj_get_style_arc_rounded(obj, part); + +#if LV_DRAW_COMPLEX + if(part != LV_PART_MAIN) draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part); +#endif +} + +lv_coord_t lv_obj_calculate_ext_draw_size(lv_obj_t * obj, uint32_t part) +{ + lv_coord_t s = 0; + + lv_coord_t sh_width = lv_obj_get_style_shadow_width(obj, part); + if(sh_width) { + lv_opa_t sh_opa = lv_obj_get_style_shadow_opa(obj, part); + if(sh_opa > LV_OPA_MIN) { + sh_width = sh_width / 2 + 1; /*The blur adds only half width*/ + sh_width += lv_obj_get_style_shadow_spread(obj, part); + lv_coord_t sh_ofs_x = lv_obj_get_style_shadow_ofs_x(obj, part); + lv_coord_t sh_ofs_y = lv_obj_get_style_shadow_ofs_y(obj, part); + sh_width += LV_MAX(LV_ABS(sh_ofs_x), LV_ABS(sh_ofs_y)); + s = LV_MAX(s, sh_width); + } + } + + lv_coord_t outline_width = lv_obj_get_style_outline_width(obj, part); + if(outline_width) { + lv_opa_t outline_opa = lv_obj_get_style_outline_opa(obj, part); + if(outline_opa > LV_OPA_MIN) { + lv_coord_t outline_pad = lv_obj_get_style_outline_pad(obj, part); + s = LV_MAX(s, outline_pad + outline_width); + } + } + + lv_coord_t w = lv_obj_get_style_transform_width(obj, part); + lv_coord_t h = lv_obj_get_style_transform_height(obj, part); + lv_coord_t wh = LV_MAX(w, h); + if(wh > 0) s += wh; + + return s; +} + +void lv_obj_draw_dsc_init(lv_obj_draw_part_dsc_t * dsc, lv_draw_ctx_t * draw_ctx) +{ + lv_memset_00(dsc, sizeof(lv_obj_draw_part_dsc_t)); + dsc->draw_ctx = draw_ctx; +} + +bool lv_obj_draw_part_check_type(lv_obj_draw_part_dsc_t * dsc, const lv_obj_class_t * class_p, uint32_t type) +{ + if(dsc->class_p == class_p && dsc->type == type) return true; + else return false; +} + +void lv_obj_refresh_ext_draw_size(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_coord_t s_old = _lv_obj_get_ext_draw_size(obj); + lv_coord_t s_new = 0; + lv_event_send(obj, LV_EVENT_REFR_EXT_DRAW_SIZE, &s_new); + + if(s_new != s_old) lv_obj_invalidate(obj); + + /*Store the result if the special attrs already allocated*/ + if(obj->spec_attr) { + obj->spec_attr->ext_draw_size = s_new; + } + /*Allocate spec. attrs. only if the result is not zero. + *Zero is the default value if the spec. attr. are not defined.*/ + else if(s_new != 0) { + lv_obj_allocate_spec_attr(obj); + obj->spec_attr->ext_draw_size = s_new; + } + + if(s_new != s_old) lv_obj_invalidate(obj); +} + +lv_coord_t _lv_obj_get_ext_draw_size(const lv_obj_t * obj) +{ + if(obj->spec_attr) return obj->spec_attr->ext_draw_size; + else return 0; +} + +lv_layer_type_t _lv_obj_get_layer_type(const lv_obj_t * obj) +{ + + if(obj->spec_attr) return obj->spec_attr->layer_type; + else return LV_LAYER_TYPE_NONE; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_draw.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_draw.h new file mode 100644 index 0000000..3f9d0f3 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_draw.h @@ -0,0 +1,172 @@ +/** + * @file lv_obj_draw.h + * + */ + +#ifndef LV_OBJ_DRAW_H +#define LV_OBJ_DRAW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../draw/lv_draw.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_obj_t; +struct _lv_obj_class_t; + +/** Cover check results.*/ +typedef enum { + LV_COVER_RES_COVER = 0, + LV_COVER_RES_NOT_COVER = 1, + LV_COVER_RES_MASKED = 2, +} lv_cover_res_t; + +typedef enum { + LV_LAYER_TYPE_NONE, + LV_LAYER_TYPE_SIMPLE, + LV_LAYER_TYPE_TRANSFORM, +} lv_layer_type_t; + +typedef struct { + lv_draw_ctx_t * draw_ctx; /**< Draw context*/ + const struct _lv_obj_class_t * class_p; /**< The class that sent the event */ + uint32_t type; /**< The type if part being draw. Element of `lv__draw_part_type_t` */ + lv_area_t * draw_area; /**< The area of the part being drawn*/ + lv_draw_rect_dsc_t * + rect_dsc; /**< A draw descriptor that can be modified to changed what LVGL will draw. Set only for rectangle-like parts*/ + lv_draw_label_dsc_t * + label_dsc; /**< A draw descriptor that can be modified to changed what LVGL will draw. Set only for text-like parts*/ + lv_draw_line_dsc_t * + line_dsc; /**< A draw descriptor that can be modified to changed what LVGL will draw. Set only for line-like parts*/ + lv_draw_img_dsc_t * + img_dsc; /**< A draw descriptor that can be modified to changed what LVGL will draw. Set only for image-like parts*/ + lv_draw_arc_dsc_t * + arc_dsc; /**< A draw descriptor that can be modified to changed what LVGL will draw. Set only for arc-like parts*/ + const lv_point_t * + p1; /**< A point calculated during drawing. E.g. a point of chart or the center of an arc.*/ + const lv_point_t * p2; /**< A point calculated during drawing. E.g. a point of chart.*/ + char * text; /**< A text calculated during drawing. Can be modified. E.g. tick labels on a chart axis.*/ + uint32_t text_length; /**< Size of the text buffer containing null-terminated text string calculated during drawing.*/ + uint32_t part; /**< The current part for which the event is sent*/ + uint32_t id; /**< The index of the part. E.g. a button's index on button matrix or table cell index.*/ + lv_coord_t radius; /**< E.g. the radius of an arc (not the corner radius).*/ + int32_t value; /**< A value calculated during drawing. E.g. Chart's tick line value.*/ + const void * sub_part_ptr; /**< A pointer the identifies something in the part. E.g. chart series. */ +} lv_obj_draw_part_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize a rectangle draw descriptor from an object's styles in its current state + * @param obj pointer to an object + * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc + * @param draw_dsc the descriptor to initialize. + * If an `..._opa` field is set to `LV_OPA_TRANSP` the related properties won't be initialized. + * Should be initialized with `lv_draw_rect_dsc_init(draw_dsc)`. + * @note Only the relevant fields will be set. + * E.g. if `border width == 0` the other border properties won't be evaluated. + */ +void lv_obj_init_draw_rect_dsc(struct _lv_obj_t * obj, uint32_t part, lv_draw_rect_dsc_t * draw_dsc); + +/** + * Initialize a label draw descriptor from an object's styles in its current state + * @param obj pointer to an object + * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc + * @param draw_dsc the descriptor to initialize. + * If the `opa` field is set to or the property is equal to `LV_OPA_TRANSP` the rest won't be initialized. + * Should be initialized with `lv_draw_label_dsc_init(draw_dsc)`. + */ +void lv_obj_init_draw_label_dsc(struct _lv_obj_t * obj, uint32_t part, lv_draw_label_dsc_t * draw_dsc); + +/** + * Initialize an image draw descriptor from an object's styles in its current state + * @param obj pointer to an object + * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc + * @param draw_dsc the descriptor to initialize. + * Should be initialized with `lv_draw_image_dsc_init(draw_dsc)`. + */ +void lv_obj_init_draw_img_dsc(struct _lv_obj_t * obj, uint32_t part, lv_draw_img_dsc_t * draw_dsc); + + +/** + * Initialize a line draw descriptor from an object's styles in its current state + * @param obj pointer to an object + * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc + * @param draw_dsc the descriptor to initialize. + * Should be initialized with `lv_draw_line_dsc_init(draw_dsc)`. + */ +void lv_obj_init_draw_line_dsc(struct _lv_obj_t * obj, uint32_t part, lv_draw_line_dsc_t * draw_dsc); + +/** + * Initialize an arc draw descriptor from an object's styles in its current state + * @param obj pointer to an object + * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc + * @param draw_dsc the descriptor to initialize. + * Should be initialized with `lv_draw_arc_dsc_init(draw_dsc)`. + */ +void lv_obj_init_draw_arc_dsc(struct _lv_obj_t * obj, uint32_t part, lv_draw_arc_dsc_t * draw_dsc); + +/** + * Get the required extra size (around the object's part) to draw shadow, outline, value etc. + * @param obj pointer to an object + * @param part part of the object + * @return the extra size required around the object + */ +lv_coord_t lv_obj_calculate_ext_draw_size(struct _lv_obj_t * obj, uint32_t part); + +/** + * Initialize a draw descriptor used in events. + * @param dsc pointer to a descriptor. Later it should be passed as parameter to an `LV_EVENT_DRAW_PART_BEGIN/END` event. + * @param draw the current draw context. (usually returned by `lv_event_get_draw_ctx(e)`) + */ +void lv_obj_draw_dsc_init(lv_obj_draw_part_dsc_t * dsc, lv_draw_ctx_t * draw_ctx); + +/** + * Check the type obj a part draw descriptor + * @param dsc the descriptor (normally the event parameter) + * @param class_p pointer to class to which `type` is related + * @param type element of `lv__draw_part_type_t` + * @return true if ::dsc is related to ::class_p and ::type + */ +bool lv_obj_draw_part_check_type(lv_obj_draw_part_dsc_t * dsc, const struct _lv_obj_class_t * class_p, uint32_t type); + +/** + * Send a 'LV_EVENT_REFR_EXT_DRAW_SIZE' Call the ancestor's event handler to the object to refresh the value of the extended draw size. + * The result will be saved in `obj`. + * @param obj pointer to an object + */ +void lv_obj_refresh_ext_draw_size(struct _lv_obj_t * obj); + +/** + * Get the extended draw area of an object. + * @param obj pointer to an object + * @return the size extended draw area around the real coordinates + */ +lv_coord_t _lv_obj_get_ext_draw_size(const struct _lv_obj_t * obj); + + +lv_layer_type_t _lv_obj_get_layer_type(const struct _lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_DRAW_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_pos.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_pos.c new file mode 100644 index 0000000..a31c11d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_pos.c @@ -0,0 +1,1172 @@ +/** + * @file lv_obj_pos.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj.h" +#include "lv_disp.h" +#include "lv_refr.h" +#include "../misc/lv_gc.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_obj_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_coord_t calc_content_width(lv_obj_t * obj); +static lv_coord_t calc_content_height(lv_obj_t * obj); +static void layout_update_core(lv_obj_t * obj); +static void transform_point(const lv_obj_t * obj, lv_point_t * p, bool inv); + +/********************** + * STATIC VARIABLES + **********************/ +static uint32_t layout_cnt; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_obj_set_pos(lv_obj_t * obj, lv_coord_t x, lv_coord_t y) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_set_x(obj, x); + lv_obj_set_y(obj, y); +} + +void lv_obj_set_x(lv_obj_t * obj, lv_coord_t x) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_res_t res_x; + lv_style_value_t v_x; + + res_x = lv_obj_get_local_style_prop(obj, LV_STYLE_X, &v_x, 0); + + if((res_x == LV_RES_OK && v_x.num != x) || res_x == LV_RES_INV) { + lv_obj_set_style_x(obj, x, 0); + } +} + +void lv_obj_set_y(lv_obj_t * obj, lv_coord_t y) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_res_t res_y; + lv_style_value_t v_y; + + res_y = lv_obj_get_local_style_prop(obj, LV_STYLE_Y, &v_y, 0); + + if((res_y == LV_RES_OK && v_y.num != y) || res_y == LV_RES_INV) { + lv_obj_set_style_y(obj, y, 0); + } +} + +bool lv_obj_refr_size(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + /*If the width or height is set by a layout do not modify them*/ + if(obj->w_layout && obj->h_layout) return false; + + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent == NULL) return false; + + lv_coord_t sl_ori = lv_obj_get_scroll_left(obj); + bool w_is_content = false; + bool w_is_pct = false; + + lv_coord_t w; + if(obj->w_layout) { + w = lv_obj_get_width(obj); + } + else { + w = lv_obj_get_style_width(obj, LV_PART_MAIN); + w_is_content = w == LV_SIZE_CONTENT ? true : false; + w_is_pct = LV_COORD_IS_PCT(w) ? true : false; + lv_coord_t parent_w = lv_obj_get_content_width(parent); + + if(w_is_content) { + w = calc_content_width(obj); + } + else if(w_is_pct) { + /*If parent has content size and the child has pct size + *a circular dependency will occur. To solve it keep child size at zero */ + if(parent->w_layout == 0 && lv_obj_get_style_width(parent, 0) == LV_SIZE_CONTENT) { + lv_coord_t border_w = lv_obj_get_style_border_width(obj, 0); + w = lv_obj_get_style_pad_left(obj, 0) + border_w; + w += lv_obj_get_style_pad_right(obj, 0) + border_w; + } + else { + w = (LV_COORD_GET_PCT(w) * parent_w) / 100; + } + } + + lv_coord_t minw = lv_obj_get_style_min_width(obj, LV_PART_MAIN); + lv_coord_t maxw = lv_obj_get_style_max_width(obj, LV_PART_MAIN); + w = lv_clamp_width(w, minw, maxw, parent_w); + } + + lv_coord_t st_ori = lv_obj_get_scroll_top(obj); + lv_coord_t h; + bool h_is_content = false; + bool h_is_pct = false; + if(obj->h_layout) { + h = lv_obj_get_height(obj); + } + else { + h = lv_obj_get_style_height(obj, LV_PART_MAIN); + h_is_content = h == LV_SIZE_CONTENT ? true : false; + h_is_pct = LV_COORD_IS_PCT(h) ? true : false; + lv_coord_t parent_h = lv_obj_get_content_height(parent); + + if(h_is_content) { + h = calc_content_height(obj); + } + else if(h_is_pct) { + /*If parent has content size and the child has pct size + *a circular dependency will occur. To solve it keep child size at zero */ + if(parent->h_layout == 0 && lv_obj_get_style_height(parent, 0) == LV_SIZE_CONTENT) { + lv_coord_t border_w = lv_obj_get_style_border_width(obj, 0); + h = lv_obj_get_style_pad_top(obj, 0) + border_w; + h += lv_obj_get_style_pad_bottom(obj, 0) + border_w; + } + else { + h = (LV_COORD_GET_PCT(h) * parent_h) / 100; + } + } + + lv_coord_t minh = lv_obj_get_style_min_height(obj, LV_PART_MAIN); + lv_coord_t maxh = lv_obj_get_style_max_height(obj, LV_PART_MAIN); + h = lv_clamp_height(h, minh, maxh, parent_h); + } + + /*calc_auto_size set the scroll x/y to 0 so revert the original value*/ + if(w_is_content || h_is_content) { + lv_obj_scroll_to(obj, sl_ori, st_ori, LV_ANIM_OFF); + } + + /*Do nothing if the size is not changed*/ + /*It is very important else recursive resizing can occur without size change*/ + if(lv_obj_get_width(obj) == w && lv_obj_get_height(obj) == h) return false; + + /*Invalidate the original area*/ + lv_obj_invalidate(obj); + + /*Save the original coordinates*/ + lv_area_t ori; + lv_obj_get_coords(obj, &ori); + + /*Check if the object inside the parent or not*/ + lv_area_t parent_fit_area; + lv_obj_get_content_coords(parent, &parent_fit_area); + + /*If the object is already out of the parent and its position is changes + *surely the scrollbars also changes so invalidate them*/ + bool on1 = _lv_area_is_in(&ori, &parent_fit_area, 0); + if(!on1) lv_obj_scrollbar_invalidate(parent); + + /*Set the length and height + *Be sure the content is not scrolled in an invalid position on the new size*/ + obj->coords.y2 = obj->coords.y1 + h - 1; + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL) { + obj->coords.x1 = obj->coords.x2 - w + 1; + } + else { + obj->coords.x2 = obj->coords.x1 + w - 1; + } + + /*Call the ancestor's event handler to the object with its new coordinates*/ + lv_event_send(obj, LV_EVENT_SIZE_CHANGED, &ori); + + /*Call the ancestor's event handler to the parent too*/ + lv_event_send(parent, LV_EVENT_CHILD_CHANGED, obj); + + /*Invalidate the new area*/ + lv_obj_invalidate(obj); + + lv_obj_readjust_scroll(obj, LV_ANIM_OFF); + + /*If the object was out of the parent invalidate the new scrollbar area too. + *If it wasn't out of the parent but out now, also invalidate the scrollbars*/ + bool on2 = _lv_area_is_in(&obj->coords, &parent_fit_area, 0); + if(on1 || (!on1 && on2)) lv_obj_scrollbar_invalidate(parent); + + lv_obj_refresh_ext_draw_size(obj); + + return true; +} + +void lv_obj_set_size(lv_obj_t * obj, lv_coord_t w, lv_coord_t h) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_set_width(obj, w); + lv_obj_set_height(obj, h); +} + +void lv_obj_set_width(lv_obj_t * obj, lv_coord_t w) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_res_t res_w; + lv_style_value_t v_w; + + res_w = lv_obj_get_local_style_prop(obj, LV_STYLE_WIDTH, &v_w, 0); + + if((res_w == LV_RES_OK && v_w.num != w) || res_w == LV_RES_INV) { + lv_obj_set_style_width(obj, w, 0); + } +} + +void lv_obj_set_height(lv_obj_t * obj, lv_coord_t h) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_res_t res_h; + lv_style_value_t v_h; + + res_h = lv_obj_get_local_style_prop(obj, LV_STYLE_HEIGHT, &v_h, 0); + + if((res_h == LV_RES_OK && v_h.num != h) || res_h == LV_RES_INV) { + lv_obj_set_style_height(obj, h, 0); + } +} + +void lv_obj_set_content_width(lv_obj_t * obj, lv_coord_t w) +{ + lv_coord_t pleft = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + lv_coord_t pright = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + + lv_obj_set_width(obj, w + pleft + pright + 2 * border_width); +} + +void lv_obj_set_content_height(lv_obj_t * obj, lv_coord_t h) +{ + lv_coord_t ptop = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + lv_coord_t pbottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + + lv_obj_set_height(obj, h + ptop + pbottom + 2 * border_width); +} + +void lv_obj_set_layout(lv_obj_t * obj, uint32_t layout) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_set_style_layout(obj, layout, 0); + + lv_obj_mark_layout_as_dirty(obj); +} + +bool lv_obj_is_layout_positioned(const lv_obj_t * obj) +{ + if(lv_obj_has_flag_any(obj, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_FLOATING)) return false; + + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent == NULL) return false; + + uint32_t layout = lv_obj_get_style_layout(parent, LV_PART_MAIN); + if(layout) return true; + else return false; +} + +void lv_obj_mark_layout_as_dirty(lv_obj_t * obj) +{ + obj->layout_inv = 1; + + /*Mark the screen as dirty too to mark that there is something to do on this screen*/ + lv_obj_t * scr = lv_obj_get_screen(obj); + scr->scr_layout_inv = 1; + + /*Make the display refreshing*/ + lv_disp_t * disp = lv_obj_get_disp(scr); + if(disp->refr_timer) lv_timer_resume(disp->refr_timer); +} + +void lv_obj_update_layout(const lv_obj_t * obj) +{ + static bool mutex = false; + if(mutex) { + LV_LOG_TRACE("Already running, returning"); + return; + } + mutex = true; + + lv_obj_t * scr = lv_obj_get_screen(obj); + + /*Repeat until there where layout invalidations*/ + while(scr->scr_layout_inv) { + LV_LOG_INFO("Layout update begin"); + scr->scr_layout_inv = 0; + layout_update_core(scr); + LV_LOG_TRACE("Layout update end"); + } + + mutex = false; +} + +uint32_t lv_layout_register(lv_layout_update_cb_t cb, void * user_data) +{ + layout_cnt++; + LV_GC_ROOT(_lv_layout_list) = lv_mem_realloc(LV_GC_ROOT(_lv_layout_list), layout_cnt * sizeof(lv_layout_dsc_t)); + LV_ASSERT_MALLOC(LV_GC_ROOT(_lv_layout_list)); + + LV_GC_ROOT(_lv_layout_list)[layout_cnt - 1].cb = cb; + LV_GC_ROOT(_lv_layout_list)[layout_cnt - 1].user_data = user_data; + return layout_cnt; /*No -1 to skip 0th index*/ +} + +void lv_obj_set_align(lv_obj_t * obj, lv_align_t align) +{ + lv_obj_set_style_align(obj, align, 0); +} + +void lv_obj_align(lv_obj_t * obj, lv_align_t align, lv_coord_t x_ofs, lv_coord_t y_ofs) +{ + lv_obj_set_style_align(obj, align, 0); + lv_obj_set_pos(obj, x_ofs, y_ofs); +} + +void lv_obj_align_to(lv_obj_t * obj, const lv_obj_t * base, lv_align_t align, lv_coord_t x_ofs, lv_coord_t y_ofs) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_update_layout(obj); + if(base == NULL) base = lv_obj_get_parent(obj); + + LV_ASSERT_OBJ(base, MY_CLASS); + + lv_coord_t x = 0; + lv_coord_t y = 0; + + lv_obj_t * parent = lv_obj_get_parent(obj); + lv_coord_t pborder = lv_obj_get_style_border_width(parent, LV_PART_MAIN); + lv_coord_t pleft = lv_obj_get_style_pad_left(parent, LV_PART_MAIN) + pborder; + lv_coord_t ptop = lv_obj_get_style_pad_top(parent, LV_PART_MAIN) + pborder; + + lv_coord_t bborder = lv_obj_get_style_border_width(base, LV_PART_MAIN); + lv_coord_t bleft = lv_obj_get_style_pad_left(base, LV_PART_MAIN) + bborder; + lv_coord_t btop = lv_obj_get_style_pad_top(base, LV_PART_MAIN) + bborder; + + if(align == LV_ALIGN_DEFAULT) { + if(lv_obj_get_style_base_dir(base, LV_PART_MAIN) == LV_BASE_DIR_RTL) align = LV_ALIGN_TOP_RIGHT; + else align = LV_ALIGN_TOP_LEFT; + } + + switch(align) { + case LV_ALIGN_CENTER: + x = lv_obj_get_content_width(base) / 2 - lv_obj_get_width(obj) / 2 + bleft; + y = lv_obj_get_content_height(base) / 2 - lv_obj_get_height(obj) / 2 + btop; + break; + case LV_ALIGN_TOP_LEFT: + x = bleft; + y = btop; + break; + case LV_ALIGN_TOP_MID: + x = lv_obj_get_content_width(base) / 2 - lv_obj_get_width(obj) / 2 + bleft; + y = btop; + break; + + case LV_ALIGN_TOP_RIGHT: + x = lv_obj_get_content_width(base) - lv_obj_get_width(obj) + bleft; + y = btop; + break; + + case LV_ALIGN_BOTTOM_LEFT: + x = bleft; + y = lv_obj_get_content_height(base) - lv_obj_get_height(obj) + btop; + break; + case LV_ALIGN_BOTTOM_MID: + x = lv_obj_get_content_width(base) / 2 - lv_obj_get_width(obj) / 2 + bleft; + y = lv_obj_get_content_height(base) - lv_obj_get_height(obj) + btop; + break; + + case LV_ALIGN_BOTTOM_RIGHT: + x = lv_obj_get_content_width(base) - lv_obj_get_width(obj) + bleft; + y = lv_obj_get_content_height(base) - lv_obj_get_height(obj) + btop; + break; + + case LV_ALIGN_LEFT_MID: + x = bleft; + y = lv_obj_get_content_height(base) / 2 - lv_obj_get_height(obj) / 2 + btop; + break; + + case LV_ALIGN_RIGHT_MID: + x = lv_obj_get_content_width(base) - lv_obj_get_width(obj) + bleft; + y = lv_obj_get_content_height(base) / 2 - lv_obj_get_height(obj) / 2 + btop; + break; + + case LV_ALIGN_OUT_TOP_LEFT: + x = 0; + y = -lv_obj_get_height(obj); + break; + + case LV_ALIGN_OUT_TOP_MID: + x = lv_obj_get_width(base) / 2 - lv_obj_get_width(obj) / 2; + y = -lv_obj_get_height(obj); + break; + + case LV_ALIGN_OUT_TOP_RIGHT: + x = lv_obj_get_width(base) - lv_obj_get_width(obj); + y = -lv_obj_get_height(obj); + break; + + case LV_ALIGN_OUT_BOTTOM_LEFT: + x = 0; + y = lv_obj_get_height(base); + break; + + case LV_ALIGN_OUT_BOTTOM_MID: + x = lv_obj_get_width(base) / 2 - lv_obj_get_width(obj) / 2; + y = lv_obj_get_height(base); + break; + + case LV_ALIGN_OUT_BOTTOM_RIGHT: + x = lv_obj_get_width(base) - lv_obj_get_width(obj); + y = lv_obj_get_height(base); + break; + + case LV_ALIGN_OUT_LEFT_TOP: + x = -lv_obj_get_width(obj); + y = 0; + break; + + case LV_ALIGN_OUT_LEFT_MID: + x = -lv_obj_get_width(obj); + y = lv_obj_get_height(base) / 2 - lv_obj_get_height(obj) / 2; + break; + + case LV_ALIGN_OUT_LEFT_BOTTOM: + x = -lv_obj_get_width(obj); + y = lv_obj_get_height(base) - lv_obj_get_height(obj); + break; + + case LV_ALIGN_OUT_RIGHT_TOP: + x = lv_obj_get_width(base); + y = 0; + break; + + case LV_ALIGN_OUT_RIGHT_MID: + x = lv_obj_get_width(base); + y = lv_obj_get_height(base) / 2 - lv_obj_get_height(obj) / 2; + break; + + case LV_ALIGN_OUT_RIGHT_BOTTOM: + x = lv_obj_get_width(base); + y = lv_obj_get_height(base) - lv_obj_get_height(obj); + break; + } + + if(lv_obj_get_style_base_dir(parent, LV_PART_MAIN) == LV_BASE_DIR_RTL) { + x += x_ofs + base->coords.x1 - parent->coords.x1 + lv_obj_get_scroll_right(parent) - pleft; + } + else { + x += x_ofs + base->coords.x1 - parent->coords.x1 + lv_obj_get_scroll_left(parent) - pleft; + } + y += y_ofs + base->coords.y1 - parent->coords.y1 + lv_obj_get_scroll_top(parent) - ptop; + lv_obj_set_style_align(obj, LV_ALIGN_TOP_LEFT, 0); + lv_obj_set_pos(obj, x, y); + +} + +void lv_obj_get_coords(const lv_obj_t * obj, lv_area_t * coords) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_area_copy(coords, &obj->coords); +} + +lv_coord_t lv_obj_get_x(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_coord_t rel_x; + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent) { + rel_x = obj->coords.x1 - parent->coords.x1; + rel_x += lv_obj_get_scroll_x(parent); + rel_x -= lv_obj_get_style_pad_left(parent, LV_PART_MAIN); + rel_x -= lv_obj_get_style_border_width(parent, LV_PART_MAIN); + } + else { + rel_x = obj->coords.x1; + } + return rel_x; +} + +lv_coord_t lv_obj_get_x2(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return lv_obj_get_x(obj) + lv_obj_get_width(obj); +} + +lv_coord_t lv_obj_get_y(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_coord_t rel_y; + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent) { + rel_y = obj->coords.y1 - parent->coords.y1; + rel_y += lv_obj_get_scroll_y(parent); + rel_y -= lv_obj_get_style_pad_top(parent, LV_PART_MAIN); + rel_y -= lv_obj_get_style_border_width(parent, LV_PART_MAIN); + } + else { + rel_y = obj->coords.y1; + } + return rel_y; +} + +lv_coord_t lv_obj_get_y2(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return lv_obj_get_y(obj) + lv_obj_get_height(obj); +} + +lv_coord_t lv_obj_get_x_aligned(const lv_obj_t * obj) +{ + return lv_obj_get_style_x(obj, LV_PART_MAIN); +} + +lv_coord_t lv_obj_get_y_aligned(const lv_obj_t * obj) +{ + return lv_obj_get_style_y(obj, LV_PART_MAIN); +} + + +lv_coord_t lv_obj_get_width(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return lv_area_get_width(&obj->coords); +} + +lv_coord_t lv_obj_get_height(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return lv_area_get_height(&obj->coords); +} + +lv_coord_t lv_obj_get_content_width(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_coord_t left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + lv_coord_t right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + + return lv_obj_get_width(obj) - left - right - 2 * border_width; +} + +lv_coord_t lv_obj_get_content_height(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_coord_t top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + lv_coord_t bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + + return lv_obj_get_height(obj) - top - bottom - 2 * border_width; +} + +void lv_obj_get_content_coords(const lv_obj_t * obj, lv_area_t * area) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + + lv_obj_get_coords(obj, area); + lv_area_increase(area, -border_width, -border_width); + area->x1 += lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + area->x2 -= lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + area->y1 += lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + area->y2 -= lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + +} + +lv_coord_t lv_obj_get_self_width(const lv_obj_t * obj) +{ + lv_point_t p = {0, LV_COORD_MIN}; + lv_event_send((lv_obj_t *)obj, LV_EVENT_GET_SELF_SIZE, &p); + return p.x; +} + +lv_coord_t lv_obj_get_self_height(const lv_obj_t * obj) +{ + lv_point_t p = {LV_COORD_MIN, 0}; + lv_event_send((lv_obj_t *)obj, LV_EVENT_GET_SELF_SIZE, &p); + return p.y; +} + +bool lv_obj_refresh_self_size(lv_obj_t * obj) +{ + lv_coord_t w_set = lv_obj_get_style_width(obj, LV_PART_MAIN); + lv_coord_t h_set = lv_obj_get_style_height(obj, LV_PART_MAIN); + if(w_set != LV_SIZE_CONTENT && h_set != LV_SIZE_CONTENT) return false; + + lv_obj_mark_layout_as_dirty(obj); + return true; +} + +void lv_obj_refr_pos(lv_obj_t * obj) +{ + if(lv_obj_is_layout_positioned(obj)) return; + + + lv_obj_t * parent = lv_obj_get_parent(obj); + lv_coord_t x = lv_obj_get_style_x(obj, LV_PART_MAIN); + lv_coord_t y = lv_obj_get_style_y(obj, LV_PART_MAIN); + + if(parent == NULL) { + lv_obj_move_to(obj, x, y); + return; + } + + /*Handle percentage value*/ + lv_coord_t pw = lv_obj_get_content_width(parent); + lv_coord_t ph = lv_obj_get_content_height(parent); + if(LV_COORD_IS_PCT(x)) x = (pw * LV_COORD_GET_PCT(x)) / 100; + if(LV_COORD_IS_PCT(y)) y = (ph * LV_COORD_GET_PCT(y)) / 100; + + /*Handle percentage value of translate*/ + lv_coord_t tr_x = lv_obj_get_style_translate_x(obj, LV_PART_MAIN); + lv_coord_t tr_y = lv_obj_get_style_translate_y(obj, LV_PART_MAIN); + lv_coord_t w = lv_obj_get_width(obj); + lv_coord_t h = lv_obj_get_height(obj); + if(LV_COORD_IS_PCT(tr_x)) tr_x = (w * LV_COORD_GET_PCT(tr_x)) / 100; + if(LV_COORD_IS_PCT(tr_y)) tr_y = (h * LV_COORD_GET_PCT(tr_y)) / 100; + + /*Use the translation*/ + x += tr_x; + y += tr_y; + + lv_align_t align = lv_obj_get_style_align(obj, LV_PART_MAIN); + + if(align == LV_ALIGN_DEFAULT) { + if(lv_obj_get_style_base_dir(parent, LV_PART_MAIN) == LV_BASE_DIR_RTL) align = LV_ALIGN_TOP_RIGHT; + else align = LV_ALIGN_TOP_LEFT; + } + + if(align == LV_ALIGN_TOP_LEFT) { + lv_obj_move_to(obj, x, y); + } + else { + + switch(align) { + case LV_ALIGN_TOP_MID: + x += pw / 2 - w / 2; + break; + case LV_ALIGN_TOP_RIGHT: + x += pw - w; + break; + case LV_ALIGN_LEFT_MID: + y += ph / 2 - h / 2; + break; + case LV_ALIGN_BOTTOM_LEFT: + y += ph - h; + break; + case LV_ALIGN_BOTTOM_MID: + x += pw / 2 - w / 2; + y += ph - h; + break; + case LV_ALIGN_BOTTOM_RIGHT: + x += pw - w; + y += ph - h; + break; + case LV_ALIGN_RIGHT_MID: + x += pw - w; + y += ph / 2 - h / 2; + break; + case LV_ALIGN_CENTER: + x += pw / 2 - w / 2; + y += ph / 2 - h / 2; + break; + default: + break; + } + lv_obj_move_to(obj, x, y); + } +} + +void lv_obj_move_to(lv_obj_t * obj, lv_coord_t x, lv_coord_t y) +{ + /*Convert x and y to absolute coordinates*/ + lv_obj_t * parent = obj->parent; + + if(parent) { + lv_coord_t pad_left = lv_obj_get_style_pad_left(parent, LV_PART_MAIN); + lv_coord_t pad_top = lv_obj_get_style_pad_top(parent, LV_PART_MAIN); + + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_FLOATING)) { + x += pad_left + parent->coords.x1; + y += pad_top + parent->coords.y1; + } + else { + x += pad_left + parent->coords.x1 - lv_obj_get_scroll_x(parent); + y += pad_top + parent->coords.y1 - lv_obj_get_scroll_y(parent); + } + + lv_coord_t border_width = lv_obj_get_style_border_width(parent, LV_PART_MAIN); + x += border_width; + y += border_width; + } + + /*Calculate and set the movement*/ + lv_point_t diff; + diff.x = x - obj->coords.x1; + diff.y = y - obj->coords.y1; + + /*Do nothing if the position is not changed*/ + /*It is very important else recursive positioning can + *occur without position change*/ + if(diff.x == 0 && diff.y == 0) return; + + /*Invalidate the original area*/ + lv_obj_invalidate(obj); + + /*Save the original coordinates*/ + lv_area_t ori; + lv_obj_get_coords(obj, &ori); + + /*Check if the object inside the parent or not*/ + lv_area_t parent_fit_area; + bool on1 = false; + if(parent) { + lv_obj_get_content_coords(parent, &parent_fit_area); + + /*If the object is already out of the parent and its position is changes + *surely the scrollbars also changes so invalidate them*/ + on1 = _lv_area_is_in(&ori, &parent_fit_area, 0); + if(!on1) lv_obj_scrollbar_invalidate(parent); + } + + obj->coords.x1 += diff.x; + obj->coords.y1 += diff.y; + obj->coords.x2 += diff.x; + obj->coords.y2 += diff.y; + + lv_obj_move_children_by(obj, diff.x, diff.y, false); + + /*Call the ancestor's event handler to the parent too*/ + if(parent) lv_event_send(parent, LV_EVENT_CHILD_CHANGED, obj); + + /*Invalidate the new area*/ + lv_obj_invalidate(obj); + + /*If the object was out of the parent invalidate the new scrollbar area too. + *If it wasn't out of the parent but out now, also invalidate the srollbars*/ + if(parent) { + bool on2 = _lv_area_is_in(&obj->coords, &parent_fit_area, 0); + if(on1 || (!on1 && on2)) lv_obj_scrollbar_invalidate(parent); + } +} + +void lv_obj_move_children_by(lv_obj_t * obj, lv_coord_t x_diff, lv_coord_t y_diff, bool ignore_floating) +{ + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_cnt(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + if(ignore_floating && lv_obj_has_flag(child, LV_OBJ_FLAG_FLOATING)) continue; + child->coords.x1 += x_diff; + child->coords.y1 += y_diff; + child->coords.x2 += x_diff; + child->coords.y2 += y_diff; + + lv_obj_move_children_by(child, x_diff, y_diff, false); + } +} + +void lv_obj_transform_point(const lv_obj_t * obj, lv_point_t * p, bool recursive, bool inv) +{ + if(obj) { + lv_layer_type_t layer_type = _lv_obj_get_layer_type(obj); + bool do_tranf = layer_type == LV_LAYER_TYPE_TRANSFORM; + if(inv) { + if(recursive) lv_obj_transform_point(lv_obj_get_parent(obj), p, recursive, inv); + if(do_tranf) transform_point(obj, p, inv); + } + else { + if(do_tranf) transform_point(obj, p, inv); + if(recursive) lv_obj_transform_point(lv_obj_get_parent(obj), p, recursive, inv); + } + } +} + +void lv_obj_get_transformed_area(const lv_obj_t * obj, lv_area_t * area, bool recursive, + bool inv) +{ + lv_point_t p[4] = { + {area->x1, area->y1}, + {area->x1, area->y2}, + {area->x2, area->y1}, + {area->x2, area->y2}, + }; + + lv_obj_transform_point(obj, &p[0], recursive, inv); + lv_obj_transform_point(obj, &p[1], recursive, inv); + lv_obj_transform_point(obj, &p[2], recursive, inv); + lv_obj_transform_point(obj, &p[3], recursive, inv); + + area->x1 = LV_MIN4(p[0].x, p[1].x, p[2].x, p[3].x); + area->x2 = LV_MAX4(p[0].x, p[1].x, p[2].x, p[3].x); + area->y1 = LV_MIN4(p[0].y, p[1].y, p[2].y, p[3].y); + area->y2 = LV_MAX4(p[0].y, p[1].y, p[2].y, p[3].y); + lv_area_increase(area, 5, 5); +} + + +void lv_obj_invalidate_area(const lv_obj_t * obj, const lv_area_t * area) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_disp_t * disp = lv_obj_get_disp(obj); + if(!lv_disp_is_invalidation_enabled(disp)) return; + + lv_area_t area_tmp; + lv_area_copy(&area_tmp, area); + if(!lv_obj_area_is_visible(obj, &area_tmp)) return; + + _lv_inv_area(lv_obj_get_disp(obj), &area_tmp); +} + +void lv_obj_invalidate(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + /*Truncate the area to the object*/ + lv_area_t obj_coords; + lv_coord_t ext_size = _lv_obj_get_ext_draw_size(obj); + lv_area_copy(&obj_coords, &obj->coords); + obj_coords.x1 -= ext_size; + obj_coords.y1 -= ext_size; + obj_coords.x2 += ext_size; + obj_coords.y2 += ext_size; + + lv_obj_invalidate_area(obj, &obj_coords); + +} + +bool lv_obj_area_is_visible(const lv_obj_t * obj, lv_area_t * area) +{ + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return false; + + /*Invalidate the object only if it belongs to the current or previous or one of the layers'*/ + lv_obj_t * obj_scr = lv_obj_get_screen(obj); + lv_disp_t * disp = lv_obj_get_disp(obj_scr); + if(obj_scr != lv_disp_get_scr_act(disp) && + obj_scr != lv_disp_get_scr_prev(disp) && + obj_scr != lv_disp_get_layer_top(disp) && + obj_scr != lv_disp_get_layer_sys(disp)) { + return false; + } + + /*Truncate the area to the object*/ + if(!lv_obj_has_flag_any(obj, LV_OBJ_FLAG_OVERFLOW_VISIBLE)) { + lv_area_t obj_coords; + lv_coord_t ext_size = _lv_obj_get_ext_draw_size(obj); + lv_area_copy(&obj_coords, &obj->coords); + obj_coords.x1 -= ext_size; + obj_coords.y1 -= ext_size; + obj_coords.x2 += ext_size; + obj_coords.y2 += ext_size; + + /*The area is not on the object*/ + if(!_lv_area_intersect(area, area, &obj_coords)) return false; + } + + lv_obj_get_transformed_area(obj, area, true, false); + + + /*Truncate recursively to the parents*/ + lv_obj_t * par = lv_obj_get_parent(obj); + while(par != NULL) { + /*If the parent is hidden then the child is hidden and won't be drawn*/ + if(lv_obj_has_flag(par, LV_OBJ_FLAG_HIDDEN)) return false; + + /*Truncate to the parent and if no common parts break*/ + if(!lv_obj_has_flag_any(par, LV_OBJ_FLAG_OVERFLOW_VISIBLE)) { + lv_area_t par_area = par->coords; + lv_obj_get_transformed_area(par, &par_area, true, false); + if(!_lv_area_intersect(area, area, &par_area)) return false; + } + + par = lv_obj_get_parent(par); + } + + return true; +} + +bool lv_obj_is_visible(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_area_t obj_coords; + lv_coord_t ext_size = _lv_obj_get_ext_draw_size(obj); + lv_area_copy(&obj_coords, &obj->coords); + obj_coords.x1 -= ext_size; + obj_coords.y1 -= ext_size; + obj_coords.x2 += ext_size; + obj_coords.y2 += ext_size; + + return lv_obj_area_is_visible(obj, &obj_coords); + +} + +void lv_obj_set_ext_click_area(lv_obj_t * obj, lv_coord_t size) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_allocate_spec_attr(obj); + obj->spec_attr->ext_click_pad = size; +} + +void lv_obj_get_click_area(const lv_obj_t * obj, lv_area_t * area) +{ + lv_area_copy(area, &obj->coords); + if(obj->spec_attr) { + area->x1 -= obj->spec_attr->ext_click_pad; + area->x2 += obj->spec_attr->ext_click_pad; + area->y1 -= obj->spec_attr->ext_click_pad; + area->y2 += obj->spec_attr->ext_click_pad; + } +} + +bool lv_obj_hit_test(lv_obj_t * obj, const lv_point_t * point) +{ + if(!lv_obj_has_flag(obj, LV_OBJ_FLAG_CLICKABLE)) return false; + if(lv_obj_has_state(obj, LV_STATE_DISABLED)) return false; + + lv_area_t a; + lv_obj_get_click_area(obj, &a); + bool res = _lv_area_is_point_on(&a, point, 0); + if(res == false) return false; + + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_ADV_HITTEST)) { + lv_hit_test_info_t hit_info; + hit_info.point = point; + hit_info.res = true; + lv_event_send(obj, LV_EVENT_HIT_TEST, &hit_info); + return hit_info.res; + } + + return res; +} + +lv_coord_t lv_clamp_width(lv_coord_t width, lv_coord_t min_width, lv_coord_t max_width, lv_coord_t ref_width) +{ + if(LV_COORD_IS_PCT(min_width)) min_width = (ref_width * LV_COORD_GET_PCT(min_width)) / 100; + if(LV_COORD_IS_PCT(max_width)) max_width = (ref_width * LV_COORD_GET_PCT(max_width)) / 100; + return LV_CLAMP(min_width, width, max_width); +} + +lv_coord_t lv_clamp_height(lv_coord_t height, lv_coord_t min_height, lv_coord_t max_height, lv_coord_t ref_height) +{ + if(LV_COORD_IS_PCT(min_height)) min_height = (ref_height * LV_COORD_GET_PCT(min_height)) / 100; + if(LV_COORD_IS_PCT(max_height)) max_height = (ref_height * LV_COORD_GET_PCT(max_height)) / 100; + return LV_CLAMP(min_height, height, max_height); +} + + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_coord_t calc_content_width(lv_obj_t * obj) +{ + lv_obj_scroll_to_x(obj, 0, LV_ANIM_OFF); + + lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_coord_t pad_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN) + border_width; + lv_coord_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; + + lv_coord_t self_w; + self_w = lv_obj_get_self_width(obj) + pad_left + pad_right; + + lv_coord_t child_res = LV_COORD_MIN; + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_cnt(obj); + /*With RTL find the left most coordinate*/ + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL) { + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + + if(!lv_obj_is_layout_positioned(child)) { + lv_align_t align = lv_obj_get_style_align(child, 0); + switch(align) { + case LV_ALIGN_DEFAULT: + case LV_ALIGN_TOP_RIGHT: + case LV_ALIGN_BOTTOM_RIGHT: + case LV_ALIGN_RIGHT_MID: + /*Normal right aligns. Other are ignored due to possible circular dependencies*/ + child_res = LV_MAX(child_res, obj->coords.x2 - child->coords.x1 + 1); + break; + default: + /* Consider other cases only if x=0 and use the width of the object. + * With x!=0 circular dependency could occur. */ + if(lv_obj_get_style_x(child, 0) == 0) { + child_res = LV_MAX(child_res, lv_area_get_width(&child->coords) + pad_right); + } + } + } + else { + child_res = LV_MAX(child_res, obj->coords.x2 - child->coords.x1 + 1); + } + } + if(child_res != LV_COORD_MIN) { + child_res += pad_left; + } + } + /*Else find the right most coordinate*/ + else { + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + + if(!lv_obj_is_layout_positioned(child)) { + lv_align_t align = lv_obj_get_style_align(child, 0); + switch(align) { + case LV_ALIGN_DEFAULT: + case LV_ALIGN_TOP_LEFT: + case LV_ALIGN_BOTTOM_LEFT: + case LV_ALIGN_LEFT_MID: + /*Normal left aligns.*/ + child_res = LV_MAX(child_res, child->coords.x2 - obj->coords.x1 + 1); + break; + default: + /* Consider other cases only if x=0 and use the width of the object. + * With x!=0 circular dependency could occur. */ + if(lv_obj_get_style_y(child, 0) == 0) { + child_res = LV_MAX(child_res, lv_area_get_width(&child->coords) + pad_left); + } + } + } + else { + child_res = LV_MAX(child_res, child->coords.x2 - obj->coords.x1 + 1); + } + } + + if(child_res != LV_COORD_MIN) { + child_res += pad_right; + } + } + + if(child_res == LV_COORD_MIN) return self_w; + else return LV_MAX(child_res, self_w); +} + +static lv_coord_t calc_content_height(lv_obj_t * obj) +{ + lv_obj_scroll_to_y(obj, 0, LV_ANIM_OFF); + + lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_coord_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width; + lv_coord_t pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN) + border_width; + + lv_coord_t self_h; + self_h = lv_obj_get_self_height(obj) + pad_top + pad_bottom; + + lv_coord_t child_res = LV_COORD_MIN; + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_cnt(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + + + if(!lv_obj_is_layout_positioned(child)) { + lv_align_t align = lv_obj_get_style_align(child, 0); + switch(align) { + case LV_ALIGN_DEFAULT: + case LV_ALIGN_TOP_RIGHT: + case LV_ALIGN_TOP_MID: + case LV_ALIGN_TOP_LEFT: + /*Normal top aligns. */ + child_res = LV_MAX(child_res, child->coords.y2 - obj->coords.y1 + 1); + break; + default: + /* Consider other cases only if y=0 and use the height of the object. + * With y!=0 circular dependency could occur. */ + if(lv_obj_get_style_y(child, 0) == 0) { + child_res = LV_MAX(child_res, lv_area_get_height(&child->coords) + pad_top); + } + break; + } + } + else { + child_res = LV_MAX(child_res, child->coords.y2 - obj->coords.y1 + 1); + } + } + + if(child_res != LV_COORD_MIN) { + child_res += pad_bottom; + return LV_MAX(child_res, self_h); + } + else { + return self_h; + } + +} + +static void layout_update_core(lv_obj_t * obj) +{ + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_cnt(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + layout_update_core(child); + } + + if(obj->layout_inv == 0) return; + + obj->layout_inv = 0; + + lv_obj_refr_size(obj); + lv_obj_refr_pos(obj); + + if(child_cnt > 0) { + uint32_t layout_id = lv_obj_get_style_layout(obj, LV_PART_MAIN); + if(layout_id > 0 && layout_id <= layout_cnt) { + void * user_data = LV_GC_ROOT(_lv_layout_list)[layout_id - 1].user_data; + LV_GC_ROOT(_lv_layout_list)[layout_id - 1].cb(obj, user_data); + } + } +} + +static void transform_point(const lv_obj_t * obj, lv_point_t * p, bool inv) +{ + int16_t angle = lv_obj_get_style_transform_angle(obj, 0); + int16_t zoom = lv_obj_get_style_transform_zoom(obj, 0); + + if(angle == 0 && zoom == LV_IMG_ZOOM_NONE) return; + + lv_point_t pivot; + pivot.x = obj->coords.x1 + lv_obj_get_style_transform_pivot_x(obj, 0); + pivot.y = obj->coords.y1 + lv_obj_get_style_transform_pivot_y(obj, 0); + if(inv) { + angle = -angle; + zoom = (256 * 256) / zoom; + } + + lv_point_transform(p, angle, zoom, &pivot); +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_pos.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_pos.h new file mode 100644 index 0000000..d20ee96 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_pos.h @@ -0,0 +1,449 @@ +/** + * @file lv_obj_pos.h + * + */ + +#ifndef LV_OBJ_POS_H +#define LV_OBJ_POS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_area.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +struct _lv_obj_t; + +typedef void (*lv_layout_update_cb_t)(struct _lv_obj_t *, void * user_data); +typedef struct { + lv_layout_update_cb_t cb; + void * user_data; +} lv_layout_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Set the position of an object relative to the set alignment. + * @param obj pointer to an object + * @param x new x coordinate + * @param y new y coordinate + * @note With default alignment it's the distance from the top left corner + * @note E.g. LV_ALIGN_CENTER alignment it's the offset from the center of the parent + * @note The position is interpreted on the content area of the parent + * @note The values can be set in pixel or in percentage of parent size with `lv_pct(v)` + */ +void lv_obj_set_pos(struct _lv_obj_t * obj, lv_coord_t x, lv_coord_t y); + +/** + * Set the x coordinate of an object + * @param obj pointer to an object + * @param x new x coordinate + * @note With default alignment it's the distance from the top left corner + * @note E.g. LV_ALIGN_CENTER alignment it's the offset from the center of the parent + * @note The position is interpreted on the content area of the parent + * @note The values can be set in pixel or in percentage of parent size with `lv_pct(v)` + */ +void lv_obj_set_x(struct _lv_obj_t * obj, lv_coord_t x); + +/** + * Set the y coordinate of an object + * @param obj pointer to an object + * @param y new y coordinate + * @note With default alignment it's the distance from the top left corner + * @note E.g. LV_ALIGN_CENTER alignment it's the offset from the center of the parent + * @note The position is interpreted on the content area of the parent + * @note The values can be set in pixel or in percentage of parent size with `lv_pct(v)` + */ +void lv_obj_set_y(struct _lv_obj_t * obj, lv_coord_t y); + +/** + * Set the size of an object. + * @param obj pointer to an object + * @param w the new width + * @param h the new height + * @note possible values are: + * pixel simple set the size accordingly + * LV_SIZE_CONTENT set the size to involve all children in the given direction + * LV_SIZE_PCT(x) to set size in percentage of the parent's content area size (the size without paddings). + * x should be in [0..1000]% range + */ +void lv_obj_set_size(struct _lv_obj_t * obj, lv_coord_t w, lv_coord_t h); + +/** + * Recalculate the size of the object + * @param obj pointer to an object + * @return true: the size has been changed + */ +bool lv_obj_refr_size(struct _lv_obj_t * obj); + +/** + * Set the width of an object + * @param obj pointer to an object + * @param w the new width + * @note possible values are: + * pixel simple set the size accordingly + * LV_SIZE_CONTENT set the size to involve all children in the given direction + * lv_pct(x) to set size in percentage of the parent's content area size (the size without paddings). + * x should be in [0..1000]% range + */ +void lv_obj_set_width(struct _lv_obj_t * obj, lv_coord_t w); + +/** + * Set the height of an object + * @param obj pointer to an object + * @param h the new height + * @note possible values are: + * pixel simple set the size accordingly + * LV_SIZE_CONTENT set the size to involve all children in the given direction + * lv_pct(x) to set size in percentage of the parent's content area size (the size without paddings). + * x should be in [0..1000]% range + */ +void lv_obj_set_height(struct _lv_obj_t * obj, lv_coord_t h); + +/** + * Set the width reduced by the left and right padding and the border width. + * @param obj pointer to an object + * @param w the width without paddings in pixels + */ +void lv_obj_set_content_width(struct _lv_obj_t * obj, lv_coord_t w); + +/** + * Set the height reduced by the top and bottom padding and the border width. + * @param obj pointer to an object + * @param h the height without paddings in pixels + */ +void lv_obj_set_content_height(struct _lv_obj_t * obj, lv_coord_t h); + +/** + * Set a layout for an object + * @param obj pointer to an object + * @param layout pointer to a layout descriptor to set + */ +void lv_obj_set_layout(struct _lv_obj_t * obj, uint32_t layout); + +/** + * Test whether the and object is positioned by a layout or not + * @param obj pointer to an object to test + * @return true: positioned by a layout; false: not positioned by a layout + */ +bool lv_obj_is_layout_positioned(const struct _lv_obj_t * obj); + +/** + * Mark the object for layout update. + * @param obj pointer to an object whose children needs to be updated + */ +void lv_obj_mark_layout_as_dirty(struct _lv_obj_t * obj); + +/** + * Update the layout of an object. + * @param obj pointer to an object whose children needs to be updated + */ +void lv_obj_update_layout(const struct _lv_obj_t * obj); + +/** + * Register a new layout + * @param cb the layout update callback + * @param user_data custom data that will be passed to `cb` + * @return the ID of the new layout + */ +uint32_t lv_layout_register(lv_layout_update_cb_t cb, void * user_data); + +/** + * Change the alignment of an object. + * @param obj pointer to an object to align + * @param align type of alignment (see 'lv_align_t' enum) `LV_ALIGN_OUT_...` can't be used. + */ +void lv_obj_set_align(struct _lv_obj_t * obj, lv_align_t align); + +/** + * Change the alignment of an object and set new coordinates. + * Equivalent to: + * lv_obj_set_align(obj, align); + * lv_obj_set_pos(obj, x_ofs, y_ofs); + * @param obj pointer to an object to align + * @param align type of alignment (see 'lv_align_t' enum) `LV_ALIGN_OUT_...` can't be used. + * @param x_ofs x coordinate offset after alignment + * @param y_ofs y coordinate offset after alignment + */ +void lv_obj_align(struct _lv_obj_t * obj, lv_align_t align, lv_coord_t x_ofs, lv_coord_t y_ofs); + +/** + * Align an object to an other object. + * @param obj pointer to an object to align + * @param base pointer to an other object (if NULL `obj`s parent is used). 'obj' will be aligned to it. + * @param align type of alignment (see 'lv_align_t' enum) + * @param x_ofs x coordinate offset after alignment + * @param y_ofs y coordinate offset after alignment + * @note if the position or size of `base` changes `obj` needs to be aligned manually again + */ +void lv_obj_align_to(struct _lv_obj_t * obj, const struct _lv_obj_t * base, lv_align_t align, lv_coord_t x_ofs, + lv_coord_t y_ofs); + +/** + * Align an object to the center on its parent. + * @param obj pointer to an object to align + * @note if the parent size changes `obj` needs to be aligned manually again + */ +static inline void lv_obj_center(struct _lv_obj_t * obj) +{ + lv_obj_align(obj, LV_ALIGN_CENTER, 0, 0); +} + + +/** + * Copy the coordinates of an object to an area + * @param obj pointer to an object + * @param coords pointer to an area to store the coordinates + */ +void lv_obj_get_coords(const struct _lv_obj_t * obj, lv_area_t * coords); + +/** + * Get the x coordinate of object. + * @param obj pointer to an object + * @return distance of `obj` from the left side of its parent plus the parent's left padding + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @note Zero return value means the object is on the left padding of the parent, and not on the left edge. + * @note Scrolling of the parent doesn't change the returned value. + * @note The returned value is always the distance from the parent even if `obj` is positioned by a layout. + */ +lv_coord_t lv_obj_get_x(const struct _lv_obj_t * obj); + +/** + * Get the x2 coordinate of object. + * @param obj pointer to an object + * @return distance of `obj` from the right side of its parent plus the parent's right padding + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @note Zero return value means the object is on the right padding of the parent, and not on the right edge. + * @note Scrolling of the parent doesn't change the returned value. + * @note The returned value is always the distance from the parent even if `obj` is positioned by a layout. + */ +lv_coord_t lv_obj_get_x2(const struct _lv_obj_t * obj); + +/** + * Get the y coordinate of object. + * @param obj pointer to an object + * @return distance of `obj` from the top side of its parent plus the parent's top padding + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @note Zero return value means the object is on the top padding of the parent, and not on the top edge. + * @note Scrolling of the parent doesn't change the returned value. + * @note The returned value is always the distance from the parent even if `obj` is positioned by a layout. + */ +lv_coord_t lv_obj_get_y(const struct _lv_obj_t * obj); + +/** + * Get the y2 coordinate of object. + * @param obj pointer to an object + * @return distance of `obj` from the bottom side of its parent plus the parent's bottom padding + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @note Zero return value means the object is on the bottom padding of the parent, and not on the bottom edge. + * @note Scrolling of the parent doesn't change the returned value. + * @note The returned value is always the distance from the parent even if `obj` is positioned by a layout. + */ +lv_coord_t lv_obj_get_y2(const struct _lv_obj_t * obj); + +/** + * Get the actually set x coordinate of object, i.e. the offset form the set alignment + * @param obj pointer to an object + * @return the set x coordinate + */ +lv_coord_t lv_obj_get_x_aligned(const struct _lv_obj_t * obj); + +/** + * Get the actually set y coordinate of object, i.e. the offset form the set alignment + * @param obj pointer to an object + * @return the set y coordinate + */ +lv_coord_t lv_obj_get_y_aligned(const struct _lv_obj_t * obj); + +/** + * Get the width of an object + * @param obj pointer to an object + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @return the width in pixels + */ +lv_coord_t lv_obj_get_width(const struct _lv_obj_t * obj); + +/** + * Get the height of an object + * @param obj pointer to an object + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @return the height in pixels + */ +lv_coord_t lv_obj_get_height(const struct _lv_obj_t * obj); + +/** + * Get the width reduced by the left and right padding and the border width. + * @param obj pointer to an object + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @return the width which still fits into its parent without causing overflow (making the parent scrollable) + */ +lv_coord_t lv_obj_get_content_width(const struct _lv_obj_t * obj); + +/** + * Get the height reduced by the top and bottom padding and the border width. + * @param obj pointer to an object + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @return the height which still fits into the parent without causing overflow (making the parent scrollable) + */ +lv_coord_t lv_obj_get_content_height(const struct _lv_obj_t * obj); + +/** + * Get the area reduced by the paddings and the border width. + * @param obj pointer to an object + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @param area the area which still fits into the parent without causing overflow (making the parent scrollable) + */ +void lv_obj_get_content_coords(const struct _lv_obj_t * obj, lv_area_t * area); + +/** + * Get the width occupied by the "parts" of the widget. E.g. the width of all columns of a table. + * @param obj pointer to an objects + * @return the width of the virtually drawn content + * @note This size independent from the real size of the widget. + * It just tells how large the internal ("virtual") content is. + */ +lv_coord_t lv_obj_get_self_width(const struct _lv_obj_t * obj); + +/** + * Get the height occupied by the "parts" of the widget. E.g. the height of all rows of a table. + * @param obj pointer to an objects + * @return the width of the virtually drawn content + * @note This size independent from the real size of the widget. + * It just tells how large the internal ("virtual") content is. + */ +lv_coord_t lv_obj_get_self_height(const struct _lv_obj_t * obj); + +/** + * Handle if the size of the internal ("virtual") content of an object has changed. + * @param obj pointer to an object + * @return false: nothing happened; true: refresh happened + */ +bool lv_obj_refresh_self_size(struct _lv_obj_t * obj); + +void lv_obj_refr_pos(struct _lv_obj_t * obj); + +void lv_obj_move_to(struct _lv_obj_t * obj, lv_coord_t x, lv_coord_t y); + + +void lv_obj_move_children_by(struct _lv_obj_t * obj, lv_coord_t x_diff, lv_coord_t y_diff, bool ignore_floating); + +/** + * Transform a point using the angle and zoom style properties of an object + * @param obj pointer to an object whose style properties should be used + * @param p a point to transform, the result will be written back here too + * @param recursive consider the transformation properties of the parents too + * @param inv do the inverse of the transformation (-angle and 1/zoom) + */ +void lv_obj_transform_point(const struct _lv_obj_t * obj, lv_point_t * p, bool recursive, bool inv); + +/** + * Transform an area using the angle and zoom style properties of an object + * @param obj pointer to an object whose style properties should be used + * @param area an area to transform, the result will be written back here too + * @param recursive consider the transformation properties of the parents too + * @param inv do the inverse of the transformation (-angle and 1/zoom) + */ +void lv_obj_get_transformed_area(const struct _lv_obj_t * obj, lv_area_t * area, bool recursive, bool inv); + +/** + * Mark an area of an object as invalid. + * The area will be truncated to the object's area and marked for redraw. + * @param obj pointer to an object + * @param area the area to redraw + */ +void lv_obj_invalidate_area(const struct _lv_obj_t * obj, const lv_area_t * area); + +/** + * Mark the object as invalid to redrawn its area + * @param obj pointer to an object + */ +void lv_obj_invalidate(const struct _lv_obj_t * obj); + +/** + * Tell whether an area of an object is visible (even partially) now or not + * @param obj pointer to an object + * @param area the are to check. The visible part of the area will be written back here. + * @return true visible; false not visible (hidden, out of parent, on other screen, etc) + */ +bool lv_obj_area_is_visible(const struct _lv_obj_t * obj, lv_area_t * area); + +/** + * Tell whether an object is visible (even partially) now or not + * @param obj pointer to an object + * @return true: visible; false not visible (hidden, out of parent, on other screen, etc) + */ +bool lv_obj_is_visible(const struct _lv_obj_t * obj); + +/** + * Set the size of an extended clickable area + * @param obj pointer to an object + * @param size extended clickable area in all 4 directions [px] + */ +void lv_obj_set_ext_click_area(struct _lv_obj_t * obj, lv_coord_t size); + +/** + * Get the an area where to object can be clicked. + * It's the object's normal area plus the extended click area. + * @param obj pointer to an object + * @param area store the result area here + */ +void lv_obj_get_click_area(const struct _lv_obj_t * obj, lv_area_t * area); + +/** + * Hit-test an object given a particular point in screen space. + * @param obj object to hit-test + * @param point screen-space point (absolute coordinate) + * @return true: if the object is considered under the point + */ +bool lv_obj_hit_test(struct _lv_obj_t * obj, const lv_point_t * point); + +/** + * Clamp a width between min and max width. If the min/max width is in percentage value use the ref_width + * @param width width to clamp + * @param min_width the minimal width + * @param max_width the maximal width + * @param ref_width the reference width used when min/max width is in percentage + * @return the clamped width + */ +lv_coord_t lv_clamp_width(lv_coord_t width, lv_coord_t min_width, lv_coord_t max_width, lv_coord_t ref_width); + +/** + * Clamp a height between min and max height. If the min/max height is in percentage value use the ref_height + * @param height height to clamp + * @param min_height the minimal height + * @param max_height the maximal height + * @param ref_height the reference height used when min/max height is in percentage + * @return the clamped height + */ +lv_coord_t lv_clamp_height(lv_coord_t height, lv_coord_t min_height, lv_coord_t max_height, lv_coord_t ref_height); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_POS_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_scroll.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_scroll.c new file mode 100644 index 0000000..02b9826 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_scroll.c @@ -0,0 +1,800 @@ +/** + * @file lv_obj_scroll.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj_scroll.h" +#include "lv_obj.h" +#include "lv_indev.h" +#include "lv_disp.h" +#include "lv_indev_scroll.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_obj_class +#define SCROLL_ANIM_TIME_MIN 200 /*ms*/ +#define SCROLL_ANIM_TIME_MAX 400 /*ms*/ +#define SCROLLBAR_MIN_SIZE (LV_DPX(10)) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void scroll_x_anim(void * obj, int32_t v); +static void scroll_y_anim(void * obj, int32_t v); +static void scroll_anim_ready_cb(lv_anim_t * a); +static void scroll_area_into_view(const lv_area_t * area, lv_obj_t * child, lv_point_t * scroll_value, + lv_anim_enable_t anim_en); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/*===================== + * Setter functions + *====================*/ + +void lv_obj_set_scrollbar_mode(lv_obj_t * obj, lv_scrollbar_mode_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_allocate_spec_attr(obj); + + if(obj->spec_attr->scrollbar_mode == mode) return; + obj->spec_attr->scrollbar_mode = mode; + lv_obj_invalidate(obj); +} + +void lv_obj_set_scroll_dir(lv_obj_t * obj, lv_dir_t dir) +{ + lv_obj_allocate_spec_attr(obj); + + if(dir != obj->spec_attr->scroll_dir) { + obj->spec_attr->scroll_dir = dir; + } +} + +void lv_obj_set_scroll_snap_x(lv_obj_t * obj, lv_scroll_snap_t align) +{ + lv_obj_allocate_spec_attr(obj); + obj->spec_attr->scroll_snap_x = align; +} + +void lv_obj_set_scroll_snap_y(lv_obj_t * obj, lv_scroll_snap_t align) +{ + lv_obj_allocate_spec_attr(obj); + obj->spec_attr->scroll_snap_y = align; +} + +/*===================== + * Getter functions + *====================*/ + +lv_scrollbar_mode_t lv_obj_get_scrollbar_mode(const lv_obj_t * obj) +{ + if(obj->spec_attr) return obj->spec_attr->scrollbar_mode; + else return LV_SCROLLBAR_MODE_AUTO; +} + +lv_dir_t lv_obj_get_scroll_dir(const lv_obj_t * obj) +{ + if(obj->spec_attr) return obj->spec_attr->scroll_dir; + else return LV_DIR_ALL; +} + +lv_scroll_snap_t lv_obj_get_scroll_snap_x(const lv_obj_t * obj) +{ + if(obj->spec_attr) return obj->spec_attr->scroll_snap_x; + else return LV_SCROLL_SNAP_NONE; +} + +lv_scroll_snap_t lv_obj_get_scroll_snap_y(const lv_obj_t * obj) +{ + if(obj->spec_attr) return obj->spec_attr->scroll_snap_y; + else return LV_SCROLL_SNAP_NONE; +} + +lv_coord_t lv_obj_get_scroll_x(const lv_obj_t * obj) +{ + if(obj->spec_attr == NULL) return 0; + return -obj->spec_attr->scroll.x; +} + +lv_coord_t lv_obj_get_scroll_y(const lv_obj_t * obj) +{ + if(obj->spec_attr == NULL) return 0; + return -obj->spec_attr->scroll.y; +} + +lv_coord_t lv_obj_get_scroll_top(lv_obj_t * obj) +{ + if(obj->spec_attr == NULL) return 0; + return -obj->spec_attr->scroll.y; +} + +lv_coord_t lv_obj_get_scroll_bottom(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_coord_t child_res = LV_COORD_MIN; + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_cnt(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + child_res = LV_MAX(child_res, child->coords.y2); + } + + lv_coord_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + lv_coord_t pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + + if(child_res != LV_COORD_MIN) { + child_res -= (obj->coords.y2 - pad_bottom - border_width); + } + + lv_coord_t self_h = lv_obj_get_self_height(obj); + self_h = self_h - (lv_obj_get_height(obj) - pad_top - pad_bottom - 2 * border_width); + self_h -= lv_obj_get_scroll_y(obj); + return LV_MAX(child_res, self_h); +} + +lv_coord_t lv_obj_get_scroll_left(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + /*Normally can't scroll the object out on the left. + *So simply use the current scroll position as "left size"*/ + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) != LV_BASE_DIR_RTL) { + if(obj->spec_attr == NULL) return 0; + return -obj->spec_attr->scroll.x; + } + + /*With RTL base direction scrolling the left is normal so find the left most coordinate*/ + lv_coord_t pad_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + lv_coord_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + + lv_coord_t child_res = 0; + + uint32_t i; + lv_coord_t x1 = LV_COORD_MAX; + uint32_t child_cnt = lv_obj_get_child_cnt(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + x1 = LV_MIN(x1, child->coords.x1); + + } + + if(x1 != LV_COORD_MAX) { + child_res = x1; + child_res = (obj->coords.x1 + pad_left + border_width) - child_res; + } + else { + child_res = LV_COORD_MIN; + } + + lv_coord_t self_w = lv_obj_get_self_width(obj); + self_w = self_w - (lv_obj_get_width(obj) - pad_right - pad_left - 2 * border_width); + self_w += lv_obj_get_scroll_x(obj); + + return LV_MAX(child_res, self_w); +} + +lv_coord_t lv_obj_get_scroll_right(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + /*With RTL base dir can't scroll to the object out on the right. + *So simply use the current scroll position as "right size"*/ + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL) { + if(obj->spec_attr == NULL) return 0; + return obj->spec_attr->scroll.x; + } + + /*With other base direction (LTR) scrolling to the right is normal so find the right most coordinate*/ + lv_coord_t child_res = LV_COORD_MIN; + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_cnt(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + child_res = LV_MAX(child_res, child->coords.x2); + } + + lv_coord_t pad_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + lv_coord_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + + if(child_res != LV_COORD_MIN) { + child_res -= (obj->coords.x2 - pad_right - border_width); + } + + lv_coord_t self_w; + self_w = lv_obj_get_self_width(obj); + self_w = self_w - (lv_obj_get_width(obj) - pad_right - pad_left - 2 * border_width); + self_w -= lv_obj_get_scroll_x(obj); + return LV_MAX(child_res, self_w); +} + +void lv_obj_get_scroll_end(struct _lv_obj_t * obj, lv_point_t * end) +{ + lv_anim_t * a; + a = lv_anim_get(obj, scroll_x_anim); + end->x = a ? -a->end_value : lv_obj_get_scroll_x(obj); + + a = lv_anim_get(obj, scroll_y_anim); + end->y = a ? -a->end_value : lv_obj_get_scroll_y(obj); +} + +/*===================== + * Other functions + *====================*/ + +void lv_obj_scroll_by_bounded(lv_obj_t * obj, lv_coord_t dx, lv_coord_t dy, lv_anim_enable_t anim_en) +{ + if(dx == 0 && dy == 0) return; + + /*We need to know the final sizes for bound check*/ + lv_obj_update_layout(obj); + + /*Don't let scroll more then naturally possible by the size of the content*/ + lv_coord_t x_current = -lv_obj_get_scroll_x(obj); + lv_coord_t x_bounded = x_current + dx; + + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) != LV_BASE_DIR_RTL) { + if(x_bounded > 0) x_bounded = 0; + if(x_bounded < 0) { + lv_coord_t scroll_max = lv_obj_get_scroll_left(obj) + lv_obj_get_scroll_right(obj); + if(scroll_max < 0) scroll_max = 0; + + if(x_bounded < -scroll_max) x_bounded = -scroll_max; + } + } + else { + if(x_bounded < 0) x_bounded = 0; + if(x_bounded > 0) { + lv_coord_t scroll_max = lv_obj_get_scroll_left(obj) + lv_obj_get_scroll_right(obj); + if(scroll_max < 0) scroll_max = 0; + + if(x_bounded > scroll_max) x_bounded = scroll_max; + } + } + + /*Don't let scroll more then naturally possible by the size of the content*/ + lv_coord_t y_current = -lv_obj_get_scroll_y(obj); + lv_coord_t y_bounded = y_current + dy; + + if(y_bounded > 0) y_bounded = 0; + if(y_bounded < 0) { + lv_coord_t scroll_max = lv_obj_get_scroll_top(obj) + lv_obj_get_scroll_bottom(obj); + if(scroll_max < 0) scroll_max = 0; + if(y_bounded < -scroll_max) y_bounded = -scroll_max; + } + + dx = x_bounded - x_current; + dy = y_bounded - y_current; + if(dx || dy) { + lv_obj_scroll_by(obj, dx, dy, anim_en); + } +} + + +void lv_obj_scroll_by(lv_obj_t * obj, lv_coord_t dx, lv_coord_t dy, lv_anim_enable_t anim_en) +{ + if(dx == 0 && dy == 0) return; + if(anim_en == LV_ANIM_ON) { + lv_disp_t * d = lv_obj_get_disp(obj); + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, obj); + lv_anim_set_ready_cb(&a, scroll_anim_ready_cb); + + if(dx) { + uint32_t t = lv_anim_speed_to_time((lv_disp_get_hor_res(d) * 2) >> 2, 0, dx); + if(t < SCROLL_ANIM_TIME_MIN) t = SCROLL_ANIM_TIME_MIN; + if(t > SCROLL_ANIM_TIME_MAX) t = SCROLL_ANIM_TIME_MAX; + lv_anim_set_time(&a, t); + lv_coord_t sx = lv_obj_get_scroll_x(obj); + lv_anim_set_values(&a, -sx, -sx + dx); + lv_anim_set_exec_cb(&a, scroll_x_anim); + lv_anim_set_path_cb(&a, lv_anim_path_ease_out); + + lv_res_t res; + res = lv_event_send(obj, LV_EVENT_SCROLL_BEGIN, &a); + if(res != LV_RES_OK) return; + lv_anim_start(&a); + } + + if(dy) { + uint32_t t = lv_anim_speed_to_time((lv_disp_get_ver_res(d) * 2) >> 2, 0, dy); + if(t < SCROLL_ANIM_TIME_MIN) t = SCROLL_ANIM_TIME_MIN; + if(t > SCROLL_ANIM_TIME_MAX) t = SCROLL_ANIM_TIME_MAX; + lv_anim_set_time(&a, t); + lv_coord_t sy = lv_obj_get_scroll_y(obj); + lv_anim_set_values(&a, -sy, -sy + dy); + lv_anim_set_exec_cb(&a, scroll_y_anim); + lv_anim_set_path_cb(&a, lv_anim_path_ease_out); + + lv_res_t res; + res = lv_event_send(obj, LV_EVENT_SCROLL_BEGIN, &a); + if(res != LV_RES_OK) return; + lv_anim_start(&a); + } + } + else { + /*Remove pending animations*/ + lv_anim_del(obj, scroll_y_anim); + lv_anim_del(obj, scroll_x_anim); + + lv_res_t res; + res = lv_event_send(obj, LV_EVENT_SCROLL_BEGIN, NULL); + if(res != LV_RES_OK) return; + + res = _lv_obj_scroll_by_raw(obj, dx, dy); + if(res != LV_RES_OK) return; + + res = lv_event_send(obj, LV_EVENT_SCROLL_END, NULL); + if(res != LV_RES_OK) return; + } +} + +void lv_obj_scroll_to(lv_obj_t * obj, lv_coord_t x, lv_coord_t y, lv_anim_enable_t anim_en) +{ + lv_obj_scroll_to_x(obj, x, anim_en); + lv_obj_scroll_to_y(obj, y, anim_en); +} + +void lv_obj_scroll_to_x(lv_obj_t * obj, lv_coord_t x, lv_anim_enable_t anim_en) +{ + lv_anim_del(obj, scroll_x_anim); + + lv_coord_t scroll_x = lv_obj_get_scroll_x(obj); + lv_coord_t diff = -x + scroll_x; + + lv_obj_scroll_by_bounded(obj, diff, 0, anim_en); +} + +void lv_obj_scroll_to_y(lv_obj_t * obj, lv_coord_t y, lv_anim_enable_t anim_en) +{ + lv_anim_del(obj, scroll_y_anim); + + lv_coord_t scroll_y = lv_obj_get_scroll_y(obj); + lv_coord_t diff = -y + scroll_y; + + lv_obj_scroll_by_bounded(obj, 0, diff, anim_en); +} + +void lv_obj_scroll_to_view(lv_obj_t * obj, lv_anim_enable_t anim_en) +{ + /*Be sure the screens layout is correct*/ + lv_obj_update_layout(obj); + + lv_point_t p = {0, 0}; + scroll_area_into_view(&obj->coords, obj, &p, anim_en); +} + +void lv_obj_scroll_to_view_recursive(lv_obj_t * obj, lv_anim_enable_t anim_en) +{ + /*Be sure the screens layout is correct*/ + lv_obj_update_layout(obj); + + lv_point_t p = {0, 0}; + lv_obj_t * child = obj; + lv_obj_t * parent = lv_obj_get_parent(child); + while(parent) { + scroll_area_into_view(&obj->coords, child, &p, anim_en); + child = parent; + parent = lv_obj_get_parent(parent); + } +} + +lv_res_t _lv_obj_scroll_by_raw(lv_obj_t * obj, lv_coord_t x, lv_coord_t y) +{ + if(x == 0 && y == 0) return LV_RES_OK; + + lv_obj_allocate_spec_attr(obj); + + obj->spec_attr->scroll.x += x; + obj->spec_attr->scroll.y += y; + + lv_obj_move_children_by(obj, x, y, true); + lv_res_t res = lv_event_send(obj, LV_EVENT_SCROLL, NULL); + if(res != LV_RES_OK) return res; + lv_obj_invalidate(obj); + return LV_RES_OK; +} + + +bool lv_obj_is_scrolling(const lv_obj_t * obj) +{ + lv_indev_t * indev = lv_indev_get_next(NULL); + while(indev) { + if(lv_indev_get_scroll_obj(indev) == obj) return true; + indev = lv_indev_get_next(indev); + } + + return false; +} + +void lv_obj_update_snap(lv_obj_t * obj, lv_anim_enable_t anim_en) +{ + lv_obj_update_layout(obj); + lv_point_t p; + lv_indev_scroll_get_snap_dist(obj, &p); + lv_obj_scroll_by(obj, p.x, p.y, anim_en); +} + +void lv_obj_get_scrollbar_area(lv_obj_t * obj, lv_area_t * hor_area, lv_area_t * ver_area) +{ + lv_area_set(hor_area, 0, 0, -1, -1); + lv_area_set(ver_area, 0, 0, -1, -1); + + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_SCROLLABLE) == false) return; + + lv_dir_t sm = lv_obj_get_scrollbar_mode(obj); + if(sm == LV_SCROLLBAR_MODE_OFF) return; + + /*If there is no indev scrolling this object but `mode==active` return*/ + lv_indev_t * indev = lv_indev_get_next(NULL); + if(sm == LV_SCROLLBAR_MODE_ACTIVE) { + while(indev) { + if(lv_indev_get_scroll_obj(indev) == obj) break; + indev = lv_indev_get_next(indev); + } + if(indev == NULL) return; + } + + lv_coord_t st = lv_obj_get_scroll_top(obj); + lv_coord_t sb = lv_obj_get_scroll_bottom(obj); + lv_coord_t sl = lv_obj_get_scroll_left(obj); + lv_coord_t sr = lv_obj_get_scroll_right(obj); + + lv_dir_t dir = lv_obj_get_scroll_dir(obj); + + bool ver_draw = false; + if((dir & LV_DIR_VER) && + ((sm == LV_SCROLLBAR_MODE_ON) || + (sm == LV_SCROLLBAR_MODE_AUTO && (st > 0 || sb > 0)) || + (sm == LV_SCROLLBAR_MODE_ACTIVE && lv_indev_get_scroll_dir(indev) == LV_DIR_VER))) { + ver_draw = true; + } + + + bool hor_draw = false; + if((dir & LV_DIR_HOR) && + ((sm == LV_SCROLLBAR_MODE_ON) || + (sm == LV_SCROLLBAR_MODE_AUTO && (sl > 0 || sr > 0)) || + (sm == LV_SCROLLBAR_MODE_ACTIVE && lv_indev_get_scroll_dir(indev) == LV_DIR_HOR))) { + hor_draw = true; + } + + if(!hor_draw && !ver_draw) return; + + bool rtl = lv_obj_get_style_base_dir(obj, LV_PART_SCROLLBAR) == LV_BASE_DIR_RTL ? true : false; + + lv_coord_t top_space = lv_obj_get_style_pad_top(obj, LV_PART_SCROLLBAR); + lv_coord_t bottom_space = lv_obj_get_style_pad_bottom(obj, LV_PART_SCROLLBAR); + lv_coord_t left_space = lv_obj_get_style_pad_left(obj, LV_PART_SCROLLBAR); + lv_coord_t right_space = lv_obj_get_style_pad_right(obj, LV_PART_SCROLLBAR); + lv_coord_t tickness = lv_obj_get_style_width(obj, LV_PART_SCROLLBAR); + + lv_coord_t obj_h = lv_obj_get_height(obj); + lv_coord_t obj_w = lv_obj_get_width(obj); + + /*Space required for the vertical and horizontal scrollbars*/ + lv_coord_t ver_reg_space = ver_draw ? tickness : 0; + lv_coord_t hor_req_space = hor_draw ? tickness : 0; + lv_coord_t rem; + + if(lv_obj_get_style_bg_opa(obj, LV_PART_SCROLLBAR) < LV_OPA_MIN && + lv_obj_get_style_border_opa(obj, LV_PART_SCROLLBAR) < LV_OPA_MIN) { + return; + } + + /*Draw vertical scrollbar if the mode is ON or can be scrolled in this direction*/ + lv_coord_t content_h = obj_h + st + sb; + if(ver_draw && content_h) { + ver_area->y1 = obj->coords.y1; + ver_area->y2 = obj->coords.y2; + if(rtl) { + ver_area->x1 = obj->coords.x1 + left_space; + ver_area->x2 = ver_area->x1 + tickness - 1; + } + else { + ver_area->x2 = obj->coords.x2 - right_space; + ver_area->x1 = ver_area->x2 - tickness + 1; + } + + lv_coord_t sb_h = ((obj_h - top_space - bottom_space - hor_req_space) * obj_h) / content_h; + sb_h = LV_MAX(sb_h, SCROLLBAR_MIN_SIZE); + rem = (obj_h - top_space - bottom_space - hor_req_space) - + sb_h; /*Remaining size from the scrollbar track that is not the scrollbar itself*/ + lv_coord_t scroll_h = content_h - obj_h; /*The size of the content which can be really scrolled*/ + if(scroll_h <= 0) { + ver_area->y1 = obj->coords.y1 + top_space; + ver_area->y2 = obj->coords.y2 - bottom_space - hor_req_space - 1; + } + else { + lv_coord_t sb_y = (rem * sb) / scroll_h; + sb_y = rem - sb_y; + + ver_area->y1 = obj->coords.y1 + sb_y + top_space; + ver_area->y2 = ver_area->y1 + sb_h - 1; + if(ver_area->y1 < obj->coords.y1 + top_space) { + ver_area->y1 = obj->coords.y1 + top_space; + if(ver_area->y1 + SCROLLBAR_MIN_SIZE > ver_area->y2) { + ver_area->y2 = ver_area->y1 + SCROLLBAR_MIN_SIZE; + } + } + if(ver_area->y2 > obj->coords.y2 - hor_req_space - bottom_space) { + ver_area->y2 = obj->coords.y2 - hor_req_space - bottom_space; + if(ver_area->y2 - SCROLLBAR_MIN_SIZE < ver_area->y1) { + ver_area->y1 = ver_area->y2 - SCROLLBAR_MIN_SIZE; + } + } + } + } + + /*Draw horizontal scrollbar if the mode is ON or can be scrolled in this direction*/ + lv_coord_t content_w = obj_w + sl + sr; + if(hor_draw && content_w) { + hor_area->y2 = obj->coords.y2 - bottom_space; + hor_area->y1 = hor_area->y2 - tickness + 1; + hor_area->x1 = obj->coords.x1; + hor_area->x2 = obj->coords.x2; + + lv_coord_t sb_w = ((obj_w - left_space - right_space - ver_reg_space) * obj_w) / content_w; + sb_w = LV_MAX(sb_w, SCROLLBAR_MIN_SIZE); + rem = (obj_w - left_space - right_space - ver_reg_space) - + sb_w; /*Remaining size from the scrollbar track that is not the scrollbar itself*/ + lv_coord_t scroll_w = content_w - obj_w; /*The size of the content which can be really scrolled*/ + if(scroll_w <= 0) { + if(rtl) { + hor_area->x1 = obj->coords.x1 + left_space + ver_reg_space - 1; + hor_area->x2 = obj->coords.x2 - right_space; + } + else { + hor_area->x1 = obj->coords.x1 + left_space; + hor_area->x2 = obj->coords.x2 - right_space - ver_reg_space - 1; + } + } + else { + lv_coord_t sb_x = (rem * sr) / scroll_w; + sb_x = rem - sb_x; + + if(rtl) { + hor_area->x1 = obj->coords.x1 + sb_x + left_space + ver_reg_space; + hor_area->x2 = hor_area->x1 + sb_w - 1; + if(hor_area->x1 < obj->coords.x1 + left_space + ver_reg_space) { + hor_area->x1 = obj->coords.x1 + left_space + ver_reg_space; + if(hor_area->x1 + SCROLLBAR_MIN_SIZE > hor_area->x2) { + hor_area->x2 = hor_area->x1 + SCROLLBAR_MIN_SIZE; + } + } + if(hor_area->x2 > obj->coords.x2 - right_space) { + hor_area->x2 = obj->coords.x2 - right_space; + if(hor_area->x2 - SCROLLBAR_MIN_SIZE < hor_area->x1) { + hor_area->x1 = hor_area->x2 - SCROLLBAR_MIN_SIZE; + } + } + } + else { + hor_area->x1 = obj->coords.x1 + sb_x + left_space; + hor_area->x2 = hor_area->x1 + sb_w - 1; + if(hor_area->x1 < obj->coords.x1 + left_space) { + hor_area->x1 = obj->coords.x1 + left_space; + if(hor_area->x1 + SCROLLBAR_MIN_SIZE > hor_area->x2) { + hor_area->x2 = hor_area->x1 + SCROLLBAR_MIN_SIZE; + } + } + if(hor_area->x2 > obj->coords.x2 - ver_reg_space - right_space) { + hor_area->x2 = obj->coords.x2 - ver_reg_space - right_space; + if(hor_area->x2 - SCROLLBAR_MIN_SIZE < hor_area->x1) { + hor_area->x1 = hor_area->x2 - SCROLLBAR_MIN_SIZE; + } + } + } + } + } +} + +void lv_obj_scrollbar_invalidate(lv_obj_t * obj) +{ + lv_area_t hor_area; + lv_area_t ver_area; + lv_obj_get_scrollbar_area(obj, &hor_area, &ver_area); + + if(lv_area_get_size(&hor_area) <= 0 && lv_area_get_size(&ver_area) <= 0) return; + + if(lv_area_get_size(&hor_area) > 0) lv_obj_invalidate_area(obj, &hor_area); + if(lv_area_get_size(&ver_area) > 0) lv_obj_invalidate_area(obj, &ver_area); +} + +void lv_obj_readjust_scroll(lv_obj_t * obj, lv_anim_enable_t anim_en) +{ + /*Be sure the bottom side is not remains scrolled in*/ + /*With snapping the content can't be scrolled in*/ + if(lv_obj_get_scroll_snap_y(obj) == LV_SCROLL_SNAP_NONE) { + lv_coord_t st = lv_obj_get_scroll_top(obj); + lv_coord_t sb = lv_obj_get_scroll_bottom(obj); + if(sb < 0 && st > 0) { + sb = LV_MIN(st, -sb); + lv_obj_scroll_by(obj, 0, sb, anim_en); + } + } + + if(lv_obj_get_scroll_snap_x(obj) == LV_SCROLL_SNAP_NONE) { + lv_coord_t sl = lv_obj_get_scroll_left(obj); + lv_coord_t sr = lv_obj_get_scroll_right(obj); + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) != LV_BASE_DIR_RTL) { + /*Be sure the left side is not remains scrolled in*/ + if(sr < 0 && sl > 0) { + sr = LV_MIN(sl, -sr); + lv_obj_scroll_by(obj, sr, 0, anim_en); + } + } + else { + /*Be sure the right side is not remains scrolled in*/ + if(sl < 0 && sr > 0) { + sr = LV_MIN(sr, -sl); + lv_obj_scroll_by(obj, sl, 0, anim_en); + } + } + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + + +static void scroll_x_anim(void * obj, int32_t v) +{ + _lv_obj_scroll_by_raw(obj, v + lv_obj_get_scroll_x(obj), 0); +} + +static void scroll_y_anim(void * obj, int32_t v) +{ + _lv_obj_scroll_by_raw(obj, 0, v + lv_obj_get_scroll_y(obj)); +} + +static void scroll_anim_ready_cb(lv_anim_t * a) +{ + lv_event_send(a->var, LV_EVENT_SCROLL_END, NULL); +} + +static void scroll_area_into_view(const lv_area_t * area, lv_obj_t * child, lv_point_t * scroll_value, + lv_anim_enable_t anim_en) +{ + lv_obj_t * parent = lv_obj_get_parent(child); + if(!lv_obj_has_flag(parent, LV_OBJ_FLAG_SCROLLABLE)) return; + + lv_dir_t scroll_dir = lv_obj_get_scroll_dir(parent); + lv_coord_t snap_goal = 0; + lv_coord_t act = 0; + const lv_area_t * area_tmp; + + lv_coord_t y_scroll = 0; + lv_scroll_snap_t snap_y = lv_obj_get_scroll_snap_y(parent); + if(snap_y != LV_SCROLL_SNAP_NONE) area_tmp = &child->coords; + else area_tmp = area; + + lv_coord_t border_width = lv_obj_get_style_border_width(parent, LV_PART_MAIN); + lv_coord_t ptop = lv_obj_get_style_pad_top(parent, LV_PART_MAIN) + border_width; + lv_coord_t pbottom = lv_obj_get_style_pad_bottom(parent, LV_PART_MAIN) + border_width; + lv_coord_t top_diff = parent->coords.y1 + ptop - area_tmp->y1 - scroll_value->y; + lv_coord_t bottom_diff = -(parent->coords.y2 - pbottom - area_tmp->y2 - scroll_value->y); + lv_coord_t parent_h = lv_obj_get_height(parent) - ptop - pbottom; + if((top_diff >= 0 && bottom_diff >= 0)) y_scroll = 0; + else if(top_diff > 0) { + y_scroll = top_diff; + /*Do not let scrolling in*/ + lv_coord_t st = lv_obj_get_scroll_top(parent); + if(st - y_scroll < 0) y_scroll = 0; + } + else if(bottom_diff > 0) { + y_scroll = -bottom_diff; + /*Do not let scrolling in*/ + lv_coord_t sb = lv_obj_get_scroll_bottom(parent); + if(sb + y_scroll < 0) y_scroll = 0; + } + + switch(snap_y) { + case LV_SCROLL_SNAP_START: + snap_goal = parent->coords.y1 + ptop; + act = area_tmp->y1 + y_scroll; + y_scroll += snap_goal - act; + break; + case LV_SCROLL_SNAP_END: + snap_goal = parent->coords.y2 - pbottom; + act = area_tmp->y2 + y_scroll; + y_scroll += snap_goal - act; + break; + case LV_SCROLL_SNAP_CENTER: + snap_goal = parent->coords.y1 + ptop + parent_h / 2; + act = lv_area_get_height(area_tmp) / 2 + area_tmp->y1 + y_scroll; + y_scroll += snap_goal - act; + break; + } + + lv_coord_t x_scroll = 0; + lv_scroll_snap_t snap_x = lv_obj_get_scroll_snap_x(parent); + if(snap_x != LV_SCROLL_SNAP_NONE) area_tmp = &child->coords; + else area_tmp = area; + + lv_coord_t pleft = lv_obj_get_style_pad_left(parent, LV_PART_MAIN) + border_width; + lv_coord_t pright = lv_obj_get_style_pad_right(parent, LV_PART_MAIN) + border_width; + lv_coord_t left_diff = parent->coords.x1 + pleft - area_tmp->x1 - scroll_value->x; + lv_coord_t right_diff = -(parent->coords.x2 - pright - area_tmp->x2 - scroll_value->x); + if((left_diff >= 0 && right_diff >= 0)) x_scroll = 0; + else if(left_diff > 0) { + x_scroll = left_diff; + /*Do not let scrolling in*/ + lv_coord_t sl = lv_obj_get_scroll_left(parent); + if(sl - x_scroll < 0) x_scroll = 0; + } + else if(right_diff > 0) { + x_scroll = -right_diff; + /*Do not let scrolling in*/ + lv_coord_t sr = lv_obj_get_scroll_right(parent); + if(sr + x_scroll < 0) x_scroll = 0; + } + + lv_coord_t parent_w = lv_obj_get_width(parent) - pleft - pright; + switch(snap_x) { + case LV_SCROLL_SNAP_START: + snap_goal = parent->coords.x1 + pleft; + act = area_tmp->x1 + x_scroll; + x_scroll += snap_goal - act; + break; + case LV_SCROLL_SNAP_END: + snap_goal = parent->coords.x2 - pright; + act = area_tmp->x2 + x_scroll; + x_scroll += snap_goal - act; + break; + case LV_SCROLL_SNAP_CENTER: + snap_goal = parent->coords.x1 + pleft + parent_w / 2; + act = lv_area_get_width(area_tmp) / 2 + area_tmp->x1 + x_scroll; + x_scroll += snap_goal - act; + break; + } + + /*Remove any pending scroll animations.*/ + bool y_del = lv_anim_del(parent, scroll_y_anim); + bool x_del = lv_anim_del(parent, scroll_x_anim); + if(y_del || x_del) { + lv_res_t res; + res = lv_event_send(parent, LV_EVENT_SCROLL_END, NULL); + if(res != LV_RES_OK) return; + } + + if((scroll_dir & LV_DIR_LEFT) == 0 && x_scroll < 0) x_scroll = 0; + if((scroll_dir & LV_DIR_RIGHT) == 0 && x_scroll > 0) x_scroll = 0; + if((scroll_dir & LV_DIR_TOP) == 0 && y_scroll < 0) y_scroll = 0; + if((scroll_dir & LV_DIR_BOTTOM) == 0 && y_scroll > 0) y_scroll = 0; + + scroll_value->x += anim_en == LV_ANIM_OFF ? 0 : x_scroll; + scroll_value->y += anim_en == LV_ANIM_OFF ? 0 : y_scroll; + lv_obj_scroll_by(parent, x_scroll, y_scroll, anim_en); +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_scroll.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_scroll.h new file mode 100644 index 0000000..e1da245 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_scroll.h @@ -0,0 +1,307 @@ +/** + * @file lv_obj_scroll.h + * + */ + +#ifndef LV_OBJ_SCROLL_H +#define LV_OBJ_SCROLL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_area.h" +#include "../misc/lv_anim.h" +#include "../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Can't include lv_obj.h because it includes this header file*/ +struct _lv_obj_t; + +/** Scrollbar modes: shows when should the scrollbars be visible*/ +enum { + LV_SCROLLBAR_MODE_OFF, /**< Never show scrollbars*/ + LV_SCROLLBAR_MODE_ON, /**< Always show scrollbars*/ + LV_SCROLLBAR_MODE_ACTIVE, /**< Show scroll bars when object is being scrolled*/ + LV_SCROLLBAR_MODE_AUTO, /**< Show scroll bars when the content is large enough to be scrolled*/ +}; +typedef uint8_t lv_scrollbar_mode_t; + + +/** Scroll span align options. Tells where to align the snappable children when scroll stops.*/ +enum { + LV_SCROLL_SNAP_NONE, /**< Do not align, leave where it is*/ + LV_SCROLL_SNAP_START, /**< Align to the left/top*/ + LV_SCROLL_SNAP_END, /**< Align to the right/bottom*/ + LV_SCROLL_SNAP_CENTER /**< Align to the center*/ +}; +typedef uint8_t lv_scroll_snap_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/*===================== + * Setter functions + *====================*/ + +/** + * Set how the scrollbars should behave. + * @param obj pointer to an object + * @param mode LV_SCROLL_MODE_ON/OFF/AUTO/ACTIVE + */ +void lv_obj_set_scrollbar_mode(struct _lv_obj_t * obj, lv_scrollbar_mode_t mode); + +/** + * Set the object in which directions can be scrolled + * @param obj pointer to an object + * @param dir the allow scroll directions. An element or OR-ed values of `lv_dir_t` + */ +void lv_obj_set_scroll_dir(struct _lv_obj_t * obj, lv_dir_t dir); + +/** + * Set where to snap the children when scrolling ends horizontally + * @param obj pointer to an object + * @param align the snap align to set from `lv_scroll_snap_t` + */ +void lv_obj_set_scroll_snap_x(struct _lv_obj_t * obj, lv_scroll_snap_t align); + +/** + * Set where to snap the children when scrolling ends vertically + * @param obj pointer to an object + * @param align the snap align to set from `lv_scroll_snap_t` + */ +void lv_obj_set_scroll_snap_y(struct _lv_obj_t * obj, lv_scroll_snap_t align); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the current scroll mode (when to hide the scrollbars) + * @param obj pointer to an object + * @return the current scroll mode from `lv_scrollbar_mode_t` + */ +lv_scrollbar_mode_t lv_obj_get_scrollbar_mode(const struct _lv_obj_t * obj); + +/** + * Get the object in which directions can be scrolled + * @param obj pointer to an object + * @param dir the allow scroll directions. An element or OR-ed values of `lv_dir_t` + */ +lv_dir_t lv_obj_get_scroll_dir(const struct _lv_obj_t * obj); + +/** + * Get where to snap the children when scrolling ends horizontally + * @param obj pointer to an object + * @return the current snap align from `lv_scroll_snap_t` + */ +lv_scroll_snap_t lv_obj_get_scroll_snap_x(const struct _lv_obj_t * obj); + +/** + * Get where to snap the children when scrolling ends vertically + * @param obj pointer to an object + * @return the current snap align from `lv_scroll_snap_t` + */ +lv_scroll_snap_t lv_obj_get_scroll_snap_y(const struct _lv_obj_t * obj); + +/** + * Get current X scroll position. + * @param obj pointer to an object + * @return the current scroll position from the left edge. + * If the object is not scrolled return 0 + * If scrolled return > 0 + * If scrolled in (elastic scroll) return < 0 + */ +lv_coord_t lv_obj_get_scroll_x(const struct _lv_obj_t * obj); + +/** + * Get current Y scroll position. + * @param obj pointer to an object + * @return the current scroll position from the top edge. + * If the object is not scrolled return 0 + * If scrolled return > 0 + * If scrolled inside return < 0 + */ +lv_coord_t lv_obj_get_scroll_y(const struct _lv_obj_t * obj); + +/** + * Return the height of the area above the object. + * That is the number of pixels the object can be scrolled down. + * Normally positive but can be negative when scrolled inside. + * @param obj pointer to an object + * @return the scrollable area above the object in pixels + */ +lv_coord_t lv_obj_get_scroll_top(struct _lv_obj_t * obj); + +/** + * Return the height of the area below the object. + * That is the number of pixels the object can be scrolled down. + * Normally positive but can be negative when scrolled inside. + * @param obj pointer to an object + * @return the scrollable area below the object in pixels + */ +lv_coord_t lv_obj_get_scroll_bottom(struct _lv_obj_t * obj); + +/** + * Return the width of the area on the left the object. + * That is the number of pixels the object can be scrolled down. + * Normally positive but can be negative when scrolled inside. + * @param obj pointer to an object + * @return the scrollable area on the left the object in pixels + */ +lv_coord_t lv_obj_get_scroll_left(struct _lv_obj_t * obj); + +/** + * Return the width of the area on the right the object. + * That is the number of pixels the object can be scrolled down. + * Normally positive but can be negative when scrolled inside. + * @param obj pointer to an object + * @return the scrollable area on the right the object in pixels + */ +lv_coord_t lv_obj_get_scroll_right(struct _lv_obj_t * obj); + +/** + * Get the X and Y coordinates where the scrolling will end for this object if a scrolling animation is in progress. + * If no scrolling animation, give the current `x` or `y` scroll position. + * @param obj pointer to an object + * @param end pointer to store the result + */ +void lv_obj_get_scroll_end(struct _lv_obj_t * obj, lv_point_t * end); + +/*===================== + * Other functions + *====================*/ + +/** + * Scroll by a given amount of pixels + * @param obj pointer to an object to scroll + * @param dx pixels to scroll horizontally + * @param dy pixels to scroll vertically + * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately + * @note > 0 value means scroll right/bottom (show the more content on the right/bottom) + * @note e.g. dy = -20 means scroll down 20 px + */ +void lv_obj_scroll_by(struct _lv_obj_t * obj, lv_coord_t x, lv_coord_t y, lv_anim_enable_t anim_en); + +/** + * Scroll by a given amount of pixels. + * `dx` and `dy` will be limited internally to allow scrolling only on the content area. + * @param obj pointer to an object to scroll + * @param dx pixels to scroll horizontally + * @param dy pixels to scroll vertically + * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately + * @note e.g. dy = -20 means scroll down 20 px + */ +void lv_obj_scroll_by_bounded(struct _lv_obj_t * obj, lv_coord_t dx, lv_coord_t dy, lv_anim_enable_t anim_en); + +/** + * Scroll to a given coordinate on an object. + * `x` and `y` will be limited internally to allow scrolling only on the content area. + * @param obj pointer to an object to scroll + * @param x pixels to scroll horizontally + * @param y pixels to scroll vertically + * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately + */ +void lv_obj_scroll_to(struct _lv_obj_t * obj, lv_coord_t x, lv_coord_t y, lv_anim_enable_t anim_en); + +/** + * Scroll to a given X coordinate on an object. + * `x` will be limited internally to allow scrolling only on the content area. + * @param obj pointer to an object to scroll + * @param x pixels to scroll horizontally + * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately + */ +void lv_obj_scroll_to_x(struct _lv_obj_t * obj, lv_coord_t x, lv_anim_enable_t anim_en); + +/** + * Scroll to a given Y coordinate on an object + * `y` will be limited internally to allow scrolling only on the content area. + * @param obj pointer to an object to scroll + * @param y pixels to scroll vertically + * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately + */ +void lv_obj_scroll_to_y(struct _lv_obj_t * obj, lv_coord_t y, lv_anim_enable_t anim_en); + +/** + * Scroll to an object until it becomes visible on its parent + * @param obj pointer to an object to scroll into view + * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately + */ +void lv_obj_scroll_to_view(struct _lv_obj_t * obj, lv_anim_enable_t anim_en); + +/** + * Scroll to an object until it becomes visible on its parent. + * Do the same on the parent's parent, and so on. + * Therefore the object will be scrolled into view even it has nested scrollable parents + * @param obj pointer to an object to scroll into view + * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately + */ +void lv_obj_scroll_to_view_recursive(struct _lv_obj_t * obj, lv_anim_enable_t anim_en); + + +/** + * Low level function to scroll by given x and y coordinates. + * `LV_EVENT_SCROLL` is sent. + * @param obj pointer to an object to scroll + * @param x pixels to scroll horizontally + * @param y pixels to scroll vertically + * @return `LV_RES_INV`: to object was deleted in `LV_EVENT_SCROLL`; + * `LV_RES_OK`: if the object is still valid + */ +lv_res_t _lv_obj_scroll_by_raw(struct _lv_obj_t * obj, lv_coord_t x, lv_coord_t y); + +/** + * Tell whether an object is being scrolled or not at this moment + * @param obj pointer to an object + * @return true: `obj` is being scrolled + */ +bool lv_obj_is_scrolling(const struct _lv_obj_t * obj); + +/** + * Check the children of `obj` and scroll `obj` to fulfill the scroll_snap settings + * @param obj an object whose children needs to checked and snapped + * @param anim_en LV_ANIM_ON/OFF + */ +void lv_obj_update_snap(struct _lv_obj_t * obj, lv_anim_enable_t anim_en); + +/** + * Get the area of the scrollbars + * @param obj pointer to an object + * @param hor pointer to store the area of the horizontal scrollbar + * @param ver pointer to store the area of the vertical scrollbar + */ +void lv_obj_get_scrollbar_area(struct _lv_obj_t * obj, lv_area_t * hor, lv_area_t * ver); + +/** + * Invalidate the area of the scrollbars + * @param obj pointer to an object + */ +void lv_obj_scrollbar_invalidate(struct _lv_obj_t * obj); + +/** + * Checked if the content is scrolled "in" and adjusts it to a normal position. + * @param obj pointer to an object + * @param anim_en LV_ANIM_ON/OFF + */ +void lv_obj_readjust_scroll(struct _lv_obj_t * obj, lv_anim_enable_t anim_en); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_SCROLL_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_style.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_style.c new file mode 100644 index 0000000..c6cdf82 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_style.c @@ -0,0 +1,866 @@ +/** + * @file lv_obj_style.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj.h" +#include "lv_disp.h" +#include "../misc/lv_gc.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_obj_class + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_obj_t * obj; + lv_style_prop_t prop; + lv_style_selector_t selector; + lv_style_value_t start_value; + lv_style_value_t end_value; +} trans_t; + +typedef enum { + CACHE_ZERO = 0, + CACHE_TRUE = 1, + CACHE_UNSET = 2, + CACHE_255 = 3, + CACHE_NEED_CHECK = 4, +} cache_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_style_t * get_local_style(lv_obj_t * obj, lv_style_selector_t selector); +static _lv_obj_style_t * get_trans_style(lv_obj_t * obj, uint32_t part); +static lv_style_res_t get_prop_core(const lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop, lv_style_value_t * v); +static void report_style_change_core(void * style, lv_obj_t * obj); +static void refresh_children_style(lv_obj_t * obj); +static bool trans_del(lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop, trans_t * tr_limit); +static void trans_anim_cb(void * _tr, int32_t v); +static void trans_anim_start_cb(lv_anim_t * a); +static void trans_anim_ready_cb(lv_anim_t * a); +static lv_layer_type_t calculate_layer_type(lv_obj_t * obj); +static void fade_anim_cb(void * obj, int32_t v); +static void fade_in_anim_ready(lv_anim_t * a); + +/********************** + * STATIC VARIABLES + **********************/ +static bool style_refr = true; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void _lv_obj_style_init(void) +{ + _lv_ll_init(&LV_GC_ROOT(_lv_obj_style_trans_ll), sizeof(trans_t)); +} + +void lv_obj_add_style(lv_obj_t * obj, lv_style_t * style, lv_style_selector_t selector) +{ + trans_del(obj, selector, LV_STYLE_PROP_ANY, NULL); + + uint32_t i; + /*Go after the transition and local styles*/ + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_trans) continue; + if(obj->styles[i].is_local) continue; + break; + } + + /*Now `i` is at the first normal style. Insert the new style before this*/ + + /*Allocate space for the new style and shift the rest of the style to the end*/ + obj->style_cnt++; + obj->styles = lv_mem_realloc(obj->styles, obj->style_cnt * sizeof(_lv_obj_style_t)); + + uint32_t j; + for(j = obj->style_cnt - 1; j > i ; j--) { + obj->styles[j] = obj->styles[j - 1]; + } + + lv_memset_00(&obj->styles[i], sizeof(_lv_obj_style_t)); + obj->styles[i].style = style; + obj->styles[i].selector = selector; + + lv_obj_refresh_style(obj, selector, LV_STYLE_PROP_ANY); +} + +void lv_obj_remove_style(lv_obj_t * obj, lv_style_t * style, lv_style_selector_t selector) +{ + lv_state_t state = lv_obj_style_get_selector_state(selector); + lv_part_t part = lv_obj_style_get_selector_part(selector); + lv_style_prop_t prop = LV_STYLE_PROP_ANY; + if(style && style->prop_cnt == 0) prop = LV_STYLE_PROP_INV; + + uint32_t i = 0; + bool deleted = false; + while(i < obj->style_cnt) { + lv_state_t state_act = lv_obj_style_get_selector_state(obj->styles[i].selector); + lv_part_t part_act = lv_obj_style_get_selector_part(obj->styles[i].selector); + if((state != LV_STATE_ANY && state_act != state) || + (part != LV_PART_ANY && part_act != part) || + (style != NULL && style != obj->styles[i].style)) { + i++; + continue; + } + + if(obj->styles[i].is_trans) { + trans_del(obj, part, LV_STYLE_PROP_ANY, NULL); + } + + if(obj->styles[i].is_local || obj->styles[i].is_trans) { + lv_style_reset(obj->styles[i].style); + lv_mem_free(obj->styles[i].style); + obj->styles[i].style = NULL; + } + + /*Shift the styles after `i` by one*/ + uint32_t j; + for(j = i; j < (uint32_t)obj->style_cnt - 1 ; j++) { + obj->styles[j] = obj->styles[j + 1]; + } + + obj->style_cnt--; + obj->styles = lv_mem_realloc(obj->styles, obj->style_cnt * sizeof(_lv_obj_style_t)); + + deleted = true; + /*The style from the current `i` index is removed, so `i` points to the next style. + *Therefore it doesn't needs to be incremented*/ + } + if(deleted && prop != LV_STYLE_PROP_INV) { + lv_obj_refresh_style(obj, part, prop); + } +} + +void lv_obj_report_style_change(lv_style_t * style) +{ + if(!style_refr) return; + lv_disp_t * d = lv_disp_get_next(NULL); + + while(d) { + uint32_t i; + for(i = 0; i < d->screen_cnt; i++) { + report_style_change_core(style, d->screens[i]); + } + d = lv_disp_get_next(d); + } +} + +void lv_obj_refresh_style(lv_obj_t * obj, lv_style_selector_t selector, lv_style_prop_t prop) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(!style_refr) return; + + lv_obj_invalidate(obj); + + lv_part_t part = lv_obj_style_get_selector_part(selector); + + bool is_layout_refr = lv_style_prop_has_flag(prop, LV_STYLE_PROP_LAYOUT_REFR); + bool is_ext_draw = lv_style_prop_has_flag(prop, LV_STYLE_PROP_EXT_DRAW); + bool is_inheritable = lv_style_prop_has_flag(prop, LV_STYLE_PROP_INHERIT); + bool is_layer_refr = lv_style_prop_has_flag(prop, LV_STYLE_PROP_LAYER_REFR); + + if(is_layout_refr) { + if(part == LV_PART_ANY || + part == LV_PART_MAIN || + lv_obj_get_style_height(obj, 0) == LV_SIZE_CONTENT || + lv_obj_get_style_width(obj, 0) == LV_SIZE_CONTENT) { + lv_event_send(obj, LV_EVENT_STYLE_CHANGED, NULL); + lv_obj_mark_layout_as_dirty(obj); + } + } + if((part == LV_PART_ANY || part == LV_PART_MAIN) && (prop == LV_STYLE_PROP_ANY || is_layout_refr)) { + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent) lv_obj_mark_layout_as_dirty(parent); + } + + /*Cache the layer type*/ + if((part == LV_PART_ANY || part == LV_PART_MAIN) && is_layer_refr) { + lv_layer_type_t layer_type = calculate_layer_type(obj); + if(obj->spec_attr) obj->spec_attr->layer_type = layer_type; + else if(layer_type != LV_LAYER_TYPE_NONE) { + lv_obj_allocate_spec_attr(obj); + obj->spec_attr->layer_type = layer_type; + } + } + + if(prop == LV_STYLE_PROP_ANY || is_ext_draw) { + lv_obj_refresh_ext_draw_size(obj); + } + lv_obj_invalidate(obj); + + if(prop == LV_STYLE_PROP_ANY || (is_inheritable && (is_ext_draw || is_layout_refr))) { + if(part != LV_PART_SCROLLBAR) { + refresh_children_style(obj); + } + } +} + +void lv_obj_enable_style_refresh(bool en) +{ + style_refr = en; +} + +lv_style_value_t lv_obj_get_style_prop(const lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop) +{ + lv_style_value_t value_act; + bool inheritable = lv_style_prop_has_flag(prop, LV_STYLE_PROP_INHERIT); + lv_style_res_t found = LV_STYLE_RES_NOT_FOUND; + while(obj) { + found = get_prop_core(obj, part, prop, &value_act); + if(found == LV_STYLE_RES_FOUND) break; + if(!inheritable) break; + + /*If not found, check the `MAIN` style first*/ + if(found != LV_STYLE_RES_INHERIT && part != LV_PART_MAIN) { + part = LV_PART_MAIN; + continue; + } + + /*Check the parent too.*/ + obj = lv_obj_get_parent(obj); + } + + if(found != LV_STYLE_RES_FOUND) { + if(part == LV_PART_MAIN && (prop == LV_STYLE_WIDTH || prop == LV_STYLE_HEIGHT)) { + const lv_obj_class_t * cls = obj->class_p; + while(cls) { + if(prop == LV_STYLE_WIDTH) { + if(cls->width_def != 0) break; + } + else { + if(cls->height_def != 0) break; + } + cls = cls->base_class; + } + + if(cls) { + value_act.num = prop == LV_STYLE_WIDTH ? cls->width_def : cls->height_def; + } + else { + value_act.num = 0; + } + } + else { + value_act = lv_style_prop_get_default(prop); + } + } + return value_act; +} + +void lv_obj_set_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t value, + lv_style_selector_t selector) +{ + lv_style_t * style = get_local_style(obj, selector); + lv_style_set_prop(style, prop, value); + lv_obj_refresh_style(obj, selector, prop); +} + +void lv_obj_set_local_style_prop_meta(lv_obj_t * obj, lv_style_prop_t prop, uint16_t meta, + lv_style_selector_t selector) +{ + lv_style_t * style = get_local_style(obj, selector); + lv_style_set_prop_meta(style, prop, meta); + lv_obj_refresh_style(obj, selector, prop); +} + + +lv_style_res_t lv_obj_get_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t * value, + lv_style_selector_t selector) +{ + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_local && + obj->styles[i].selector == selector) { + return lv_style_get_prop(obj->styles[i].style, prop, value); + } + } + + return LV_STYLE_RES_NOT_FOUND; +} + +bool lv_obj_remove_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_selector_t selector) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + uint32_t i; + /*Find the style*/ + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_local && + obj->styles[i].selector == selector) { + break; + } + } + + /*The style is not found*/ + if(i == obj->style_cnt) return false; + + lv_res_t res = lv_style_remove_prop(obj->styles[i].style, prop); + if(res == LV_RES_OK) { + lv_obj_refresh_style(obj, selector, prop); + } + + return res; +} + +void _lv_obj_style_create_transition(lv_obj_t * obj, lv_part_t part, lv_state_t prev_state, lv_state_t new_state, + const _lv_obj_style_transition_dsc_t * tr_dsc) +{ + trans_t * tr; + + /*Get the previous and current values*/ + obj->skip_trans = 1; + obj->state = prev_state; + lv_style_value_t v1 = lv_obj_get_style_prop(obj, part, tr_dsc->prop); + obj->state = new_state; + lv_style_value_t v2 = lv_obj_get_style_prop(obj, part, tr_dsc->prop); + obj->skip_trans = 0; + + if(v1.ptr == v2.ptr && v1.num == v2.num && v1.color.full == v2.color.full) return; + obj->state = prev_state; + v1 = lv_obj_get_style_prop(obj, part, tr_dsc->prop); + obj->state = new_state; + + _lv_obj_style_t * style_trans = get_trans_style(obj, part); + lv_style_set_prop(style_trans->style, tr_dsc->prop, v1); /*Be sure `trans_style` has a valid value*/ + + if(tr_dsc->prop == LV_STYLE_RADIUS) { + if(v1.num == LV_RADIUS_CIRCLE || v2.num == LV_RADIUS_CIRCLE) { + lv_coord_t whalf = lv_obj_get_width(obj) / 2; + lv_coord_t hhalf = lv_obj_get_height(obj) / 2; + if(v1.num == LV_RADIUS_CIRCLE) v1.num = LV_MIN(whalf + 1, hhalf + 1); + if(v2.num == LV_RADIUS_CIRCLE) v2.num = LV_MIN(whalf + 1, hhalf + 1); + } + } + + tr = _lv_ll_ins_head(&LV_GC_ROOT(_lv_obj_style_trans_ll)); + LV_ASSERT_MALLOC(tr); + if(tr == NULL) return; + tr->start_value = v1; + tr->end_value = v2; + tr->obj = obj; + tr->prop = tr_dsc->prop; + tr->selector = part; + + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, tr); + lv_anim_set_exec_cb(&a, trans_anim_cb); + lv_anim_set_start_cb(&a, trans_anim_start_cb); + lv_anim_set_ready_cb(&a, trans_anim_ready_cb); + lv_anim_set_values(&a, 0x00, 0xFF); + lv_anim_set_time(&a, tr_dsc->time); + lv_anim_set_delay(&a, tr_dsc->delay); + lv_anim_set_path_cb(&a, tr_dsc->path_cb); + lv_anim_set_early_apply(&a, false); +#if LV_USE_USER_DATA + a.user_data = tr_dsc->user_data; +#endif + lv_anim_start(&a); +} + + +lv_style_value_t _lv_obj_style_apply_color_filter(const lv_obj_t * obj, uint32_t part, lv_style_value_t v) +{ + if(obj == NULL) return v; + const lv_color_filter_dsc_t * f = lv_obj_get_style_color_filter_dsc(obj, part); + if(f && f->filter_cb) { + lv_opa_t f_opa = lv_obj_get_style_color_filter_opa(obj, part); + if(f_opa != 0) v.color = f->filter_cb(f, v.color, f_opa); + } + return v; +} + +_lv_style_state_cmp_t _lv_obj_style_state_compare(lv_obj_t * obj, lv_state_t state1, lv_state_t state2) +{ + _lv_style_state_cmp_t res = _LV_STYLE_STATE_CMP_SAME; + + /*Are there any new styles for the new state?*/ + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_trans) continue; + + lv_state_t state_act = lv_obj_style_get_selector_state(obj->styles[i].selector); + /*The style is valid for a state but not the other*/ + bool valid1 = state_act & (~state1) ? false : true; + bool valid2 = state_act & (~state2) ? false : true; + if(valid1 != valid2) { + lv_style_t * style = obj->styles[i].style; + lv_style_value_t v; + /*If there is layout difference on the main part, return immediately. There is no more serious difference*/ + bool layout_diff = false; + if(lv_style_get_prop(style, LV_STYLE_PAD_TOP, &v))layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_PAD_BOTTOM, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_PAD_LEFT, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_PAD_RIGHT, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_PAD_COLUMN, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_PAD_ROW, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_LAYOUT, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_TRANSLATE_X, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_TRANSLATE_Y, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_WIDTH, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_HEIGHT, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_MIN_WIDTH, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_MAX_WIDTH, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_MIN_HEIGHT, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_MAX_HEIGHT, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_BORDER_WIDTH, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_ANGLE, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_ZOOM, &v)) layout_diff = true; + + if(layout_diff) { + return _LV_STYLE_STATE_CMP_DIFF_LAYOUT; + } + + /*Check for draw pad changes*/ + if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_WIDTH, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_HEIGHT, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_ANGLE, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_ZOOM, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_OUTLINE_OPA, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_OUTLINE_PAD, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_OUTLINE_WIDTH, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_SHADOW_WIDTH, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_SHADOW_OPA, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_SHADOW_OFS_X, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_SHADOW_OFS_Y, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_SHADOW_SPREAD, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_LINE_WIDTH, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(res == _LV_STYLE_STATE_CMP_SAME) res = _LV_STYLE_STATE_CMP_DIFF_REDRAW; + } + } + + return res; +} + +void lv_obj_fade_in(lv_obj_t * obj, uint32_t time, uint32_t delay) +{ + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, obj); + lv_anim_set_values(&a, 0, LV_OPA_COVER); + lv_anim_set_exec_cb(&a, fade_anim_cb); + lv_anim_set_ready_cb(&a, fade_in_anim_ready); + lv_anim_set_time(&a, time); + lv_anim_set_delay(&a, delay); + lv_anim_start(&a); +} + +void lv_obj_fade_out(lv_obj_t * obj, uint32_t time, uint32_t delay) +{ + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, obj); + lv_anim_set_values(&a, lv_obj_get_style_opa(obj, 0), LV_OPA_TRANSP); + lv_anim_set_exec_cb(&a, fade_anim_cb); + lv_anim_set_time(&a, time); + lv_anim_set_delay(&a, delay); + lv_anim_start(&a); +} + +lv_state_t lv_obj_style_get_selector_state(lv_style_selector_t selector) +{ + return selector & 0xFFFF; +} + +lv_part_t lv_obj_style_get_selector_part(lv_style_selector_t selector) +{ + return selector & 0xFF0000; +} + + +lv_text_align_t lv_obj_calculate_style_text_align(const struct _lv_obj_t * obj, lv_part_t part, const char * txt) +{ + lv_text_align_t align = lv_obj_get_style_text_align(obj, part); + lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, part); + lv_bidi_calculate_align(&align, &base_dir, txt); + return align; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Get the local style of an object for a given part and for a given state. + * If the local style for the part-state pair doesn't exist allocate and return it. + * @param obj pointer to an object + * @param selector OR-ed value of parts and state for which the style should be get + * @return pointer to the local style + */ +static lv_style_t * get_local_style(lv_obj_t * obj, lv_style_selector_t selector) +{ + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_local && + obj->styles[i].selector == selector) { + return obj->styles[i].style; + } + } + + obj->style_cnt++; + obj->styles = lv_mem_realloc(obj->styles, obj->style_cnt * sizeof(_lv_obj_style_t)); + LV_ASSERT_MALLOC(obj->styles); + + for(i = obj->style_cnt - 1; i > 0 ; i--) { + /*Copy only normal styles (not local and transition). + *The new local style will be added as the last local style*/ + if(obj->styles[i - 1].is_local || obj->styles[i - 1].is_trans) break; + obj->styles[i] = obj->styles[i - 1]; + } + + lv_memset_00(&obj->styles[i], sizeof(_lv_obj_style_t)); + obj->styles[i].style = lv_mem_alloc(sizeof(lv_style_t)); + lv_style_init(obj->styles[i].style); + obj->styles[i].is_local = 1; + obj->styles[i].selector = selector; + return obj->styles[i].style; +} + +/** + * Get the transition style of an object for a given part and for a given state. + * If the transition style for the part-state pair doesn't exist allocate and return it. + * @param obj pointer to an object + * @param selector OR-ed value of parts and state for which the style should be get + * @return pointer to the transition style + */ +static _lv_obj_style_t * get_trans_style(lv_obj_t * obj, lv_style_selector_t selector) +{ + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_trans && obj->styles[i].selector == selector) break; + } + + /*Already have a transition style for it*/ + if(i != obj->style_cnt) return &obj->styles[i]; + + obj->style_cnt++; + obj->styles = lv_mem_realloc(obj->styles, obj->style_cnt * sizeof(_lv_obj_style_t)); + + for(i = obj->style_cnt - 1; i > 0 ; i--) { + obj->styles[i] = obj->styles[i - 1]; + } + + lv_memset_00(&obj->styles[0], sizeof(_lv_obj_style_t)); + obj->styles[0].style = lv_mem_alloc(sizeof(lv_style_t)); + lv_style_init(obj->styles[0].style); + obj->styles[0].is_trans = 1; + obj->styles[0].selector = selector; + return &obj->styles[0]; +} + + +static lv_style_res_t get_prop_core(const lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop, lv_style_value_t * v) +{ + uint8_t group = 1 << _lv_style_get_prop_group(prop); + int32_t weight = -1; + lv_state_t state = obj->state; + lv_state_t state_inv = ~state; + lv_style_value_t value_tmp; + bool skip_trans = obj->skip_trans; + uint32_t i; + lv_style_res_t found; + for(i = 0; i < obj->style_cnt; i++) { + _lv_obj_style_t * obj_style = &obj->styles[i]; + if(obj_style->is_trans == false) break; + if(skip_trans) continue; + + lv_part_t part_act = lv_obj_style_get_selector_part(obj->styles[i].selector); + + if(part_act != part) continue; + if((obj_style->style->has_group & group) == 0) continue; + found = lv_style_get_prop(obj_style->style, prop, &value_tmp); + if(found == LV_STYLE_RES_FOUND) { + *v = value_tmp; + return LV_STYLE_RES_FOUND; + } + else if(found == LV_STYLE_RES_INHERIT) { + return LV_STYLE_RES_INHERIT; + } + } + + for(; i < obj->style_cnt; i++) { + if((obj->styles[i].style->has_group & group) == 0) continue; + _lv_obj_style_t * obj_style = &obj->styles[i]; + lv_part_t part_act = lv_obj_style_get_selector_part(obj->styles[i].selector); + lv_state_t state_act = lv_obj_style_get_selector_state(obj->styles[i].selector); + if(part_act != part) continue; + + /*Be sure the style not specifies other state than the requested. + *E.g. For HOVER+PRESS object state, HOVER style only is OK, but HOVER+FOCUS style is not*/ + if((state_act & state_inv)) continue; + + /*Check only better candidates*/ + if(state_act <= weight) continue; + + found = lv_style_get_prop(obj_style->style, prop, &value_tmp); + + if(found == LV_STYLE_RES_FOUND) { + if(state_act == state) { + *v = value_tmp; + return LV_STYLE_RES_FOUND; + } + if(weight < state_act) { + weight = state_act; + *v = value_tmp; + } + } + else if(found == LV_STYLE_RES_INHERIT) { + return LV_STYLE_RES_INHERIT; + } + } + + if(weight >= 0) { + *v = value_tmp; + return LV_STYLE_RES_FOUND; + } + else return LV_STYLE_RES_NOT_FOUND; +} + +/** + * Refresh the style of all children of an object. (Called recursively) + * @param style refresh objects only with this + * @param obj pointer to an object + */ +static void report_style_change_core(void * style, lv_obj_t * obj) +{ + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(style == NULL || obj->styles[i].style == style) { + lv_obj_refresh_style(obj, LV_PART_ANY, LV_STYLE_PROP_ANY); + break; + } + } + + uint32_t child_cnt = lv_obj_get_child_cnt(obj); + for(i = 0; i < child_cnt; i++) { + report_style_change_core(style, obj->spec_attr->children[i]); + } +} + +/** + * Recursively refresh the style of the children. Go deeper until a not NULL style is found + * because the NULL styles are inherited from the parent + * @param obj pointer to an object + */ +static void refresh_children_style(lv_obj_t * obj) +{ + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_cnt(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + lv_obj_invalidate(child); + lv_event_send(child, LV_EVENT_STYLE_CHANGED, NULL); + lv_obj_invalidate(child); + + refresh_children_style(child); /*Check children too*/ + } +} + +/** + * Remove the transition from object's part's property. + * - Remove the transition from `_lv_obj_style_trans_ll` and free it + * - Delete pending transitions + * @param obj pointer to an object which transition(s) should be removed + * @param part a part of object or 0xFF to remove from all parts + * @param prop a property or 0xFF to remove all properties + * @param tr_limit delete transitions only "older" than this. `NULL` if not used + */ +static bool trans_del(lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop, trans_t * tr_limit) +{ + trans_t * tr; + trans_t * tr_prev; + bool removed = false; + tr = _lv_ll_get_tail(&LV_GC_ROOT(_lv_obj_style_trans_ll)); + while(tr != NULL) { + if(tr == tr_limit) break; + + /*'tr' might be deleted, so get the next object while 'tr' is valid*/ + tr_prev = _lv_ll_get_prev(&LV_GC_ROOT(_lv_obj_style_trans_ll), tr); + + if(tr->obj == obj && (part == tr->selector || part == LV_PART_ANY) && (prop == tr->prop || prop == LV_STYLE_PROP_ANY)) { + /*Remove any transitioned properties from the trans. style + *to allow changing it by normal styles*/ + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_trans && (part == LV_PART_ANY || obj->styles[i].selector == part)) { + lv_style_remove_prop(obj->styles[i].style, tr->prop); + } + } + + /*Free the transition descriptor too*/ + lv_anim_del(tr, NULL); + _lv_ll_remove(&LV_GC_ROOT(_lv_obj_style_trans_ll), tr); + lv_mem_free(tr); + removed = true; + + } + tr = tr_prev; + } + return removed; +} + +static void trans_anim_cb(void * _tr, int32_t v) +{ + trans_t * tr = _tr; + lv_obj_t * obj = tr->obj; + + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_trans == 0 || obj->styles[i].selector != tr->selector) continue; + + lv_style_value_t value_final; + switch(tr->prop) { + + case LV_STYLE_BORDER_SIDE: + case LV_STYLE_BORDER_POST: + case LV_STYLE_BLEND_MODE: + if(v < 255) value_final.num = tr->start_value.num; + else value_final.num = tr->end_value.num; + break; + case LV_STYLE_TRANSITION: + case LV_STYLE_TEXT_FONT: + if(v < 255) value_final.ptr = tr->start_value.ptr; + else value_final.ptr = tr->end_value.ptr; + break; + case LV_STYLE_COLOR_FILTER_DSC: + if(tr->start_value.ptr == NULL) value_final.ptr = tr->end_value.ptr; + else if(tr->end_value.ptr == NULL) value_final.ptr = tr->start_value.ptr; + else if(v < 128) value_final.ptr = tr->start_value.ptr; + else value_final.ptr = tr->end_value.ptr; + break; + case LV_STYLE_BG_COLOR: + case LV_STYLE_BORDER_COLOR: + case LV_STYLE_TEXT_COLOR: + case LV_STYLE_SHADOW_COLOR: + case LV_STYLE_OUTLINE_COLOR: + case LV_STYLE_IMG_RECOLOR: + if(v <= 0) value_final.color = tr->start_value.color; + else if(v >= 255) value_final.color = tr->end_value.color; + else value_final.color = lv_color_mix(tr->end_value.color, tr->start_value.color, v); + break; + + default: + if(v == 0) value_final.num = tr->start_value.num; + else if(v == 255) value_final.num = tr->end_value.num; + else value_final.num = tr->start_value.num + ((int32_t)((int32_t)(tr->end_value.num - tr->start_value.num) * v) >> 8); + break; + } + + lv_style_value_t old_value; + bool refr = true; + if(lv_style_get_prop(obj->styles[i].style, tr->prop, &old_value)) { + if(value_final.ptr == old_value.ptr && value_final.color.full == old_value.color.full && + value_final.num == old_value.num) { + refr = false; + } + } + lv_style_set_prop(obj->styles[i].style, tr->prop, value_final); + if(refr) lv_obj_refresh_style(tr->obj, tr->selector, tr->prop); + break; + + } + +} + +static void trans_anim_start_cb(lv_anim_t * a) +{ + trans_t * tr = a->var; + + lv_part_t part = lv_obj_style_get_selector_part(tr->selector); + tr->start_value = lv_obj_get_style_prop(tr->obj, part, tr->prop); + + /*Init prop to an invalid values to be sure `trans_del` won't delete this added `tr`*/ + lv_style_prop_t prop_tmp = tr->prop; + tr->prop = LV_STYLE_PROP_INV; + + /*Delete the related transitions if any*/ + trans_del(tr->obj, part, prop_tmp, tr); + + tr->prop = prop_tmp; + + _lv_obj_style_t * style_trans = get_trans_style(tr->obj, tr->selector); + lv_style_set_prop(style_trans->style, tr->prop, tr->start_value); /*Be sure `trans_style` has a valid value*/ + +} + +static void trans_anim_ready_cb(lv_anim_t * a) +{ + trans_t * tr = a->var; + lv_obj_t * obj = tr->obj; + lv_style_prop_t prop = tr->prop; + + /*Remove the transitioned property from trans. style + *if there no more transitions for this property + *It allows changing it by normal styles*/ + bool running = false; + trans_t * tr_i; + _LV_LL_READ(&LV_GC_ROOT(_lv_obj_style_trans_ll), tr_i) { + if(tr_i != tr && tr_i->obj == tr->obj && tr_i->selector == tr->selector && tr_i->prop == tr->prop) { + running = true; + break; + } + } + + if(!running) { + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_trans && obj->styles[i].selector == tr->selector) { + _lv_ll_remove(&LV_GC_ROOT(_lv_obj_style_trans_ll), tr); + lv_mem_free(tr); + + _lv_obj_style_t * obj_style = &obj->styles[i]; + lv_style_remove_prop(obj_style->style, prop); + + if(lv_style_is_empty(obj->styles[i].style)) { + lv_obj_remove_style(obj, obj_style->style, obj_style->selector); + + } + break; + } + } + } +} + +static lv_layer_type_t calculate_layer_type(lv_obj_t * obj) +{ + if(lv_obj_get_style_transform_angle(obj, 0) != 0) return LV_LAYER_TYPE_TRANSFORM; + if(lv_obj_get_style_transform_zoom(obj, 0) != 256) return LV_LAYER_TYPE_TRANSFORM; + if(lv_obj_get_style_opa(obj, 0) != LV_OPA_COVER) return LV_LAYER_TYPE_SIMPLE; + +#if LV_DRAW_COMPLEX + if(lv_obj_get_style_blend_mode(obj, 0) != LV_BLEND_MODE_NORMAL) return LV_LAYER_TYPE_SIMPLE; +#endif + return LV_LAYER_TYPE_NONE; +} + +static void fade_anim_cb(void * obj, int32_t v) +{ + lv_obj_set_style_opa(obj, v, 0); +} + +static void fade_in_anim_ready(lv_anim_t * a) +{ + lv_obj_remove_local_style_prop(a->var, LV_STYLE_OPA, 0); +} + + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_style.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_style.h new file mode 100644 index 0000000..5d122ca --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_style.h @@ -0,0 +1,248 @@ +/** + * @file lv_obj_style.h + * + */ + +#ifndef LV_OBJ_STYLE_H +#define LV_OBJ_STYLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include +#include "../misc/lv_bidi.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +/*Can't include lv_obj.h because it includes this header file*/ +struct _lv_obj_t; + +typedef enum { + _LV_STYLE_STATE_CMP_SAME, /*The style properties in the 2 states are identical*/ + _LV_STYLE_STATE_CMP_DIFF_REDRAW, /*The differences can be shown with a simple redraw*/ + _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD, /*The differences can be shown with a simple redraw*/ + _LV_STYLE_STATE_CMP_DIFF_LAYOUT, /*The differences can be shown with a simple redraw*/ +} _lv_style_state_cmp_t; + +typedef uint32_t lv_style_selector_t; + +typedef struct { + lv_style_t * style; + uint32_t selector : 24; + uint32_t is_local : 1; + uint32_t is_trans : 1; +} _lv_obj_style_t; + +typedef struct { + uint16_t time; + uint16_t delay; + lv_style_selector_t selector; + lv_style_prop_t prop; + lv_anim_path_cb_t path_cb; +#if LV_USE_USER_DATA + void * user_data; +#endif +} _lv_obj_style_transition_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the object related style manager module. + * Called by LVGL in `lv_init()` + */ +void _lv_obj_style_init(void); + +/** + * Add a style to an object. + * @param obj pointer to an object + * @param style pointer to a style to add + * @param selector OR-ed value of parts and state to which the style should be added + * @example lv_obj_add_style(btn, &style_btn, 0); //Default button style + * @example lv_obj_add_style(btn, &btn_red, LV_STATE_PRESSED); //Overwrite only some colors to red when pressed + */ +void lv_obj_add_style(struct _lv_obj_t * obj, lv_style_t * style, lv_style_selector_t selector); + +/** + * Add a style to an object. + * @param obj pointer to an object + * @param style pointer to a style to remove. Can be NULL to check only the selector + * @param selector OR-ed values of states and a part to remove only styles with matching selectors. LV_STATE_ANY and LV_PART_ANY can be used + * @example lv_obj_remove_style(obj, &style, LV_PART_ANY | LV_STATE_ANY); //Remove a specific style + * @example lv_obj_remove_style(obj, NULL, LV_PART_MAIN | LV_STATE_ANY); //Remove all styles from the main part + * @example lv_obj_remove_style(obj, NULL, LV_PART_ANY | LV_STATE_ANY); //Remove all styles + */ +void lv_obj_remove_style(struct _lv_obj_t * obj, lv_style_t * style, lv_style_selector_t selector); + +/** + * Remove all styles from an object + * @param obj pointer to an object + */ +static inline void lv_obj_remove_style_all(struct _lv_obj_t * obj) +{ + lv_obj_remove_style(obj, NULL, LV_PART_ANY | LV_STATE_ANY); +} + +/** + * Notify all object if a style is modified + * @param style pointer to a style. Only the objects with this style will be notified + * (NULL to notify all objects) + */ +void lv_obj_report_style_change(lv_style_t * style); + +/** + * Notify an object and its children about its style is modified. + * @param obj pointer to an object + * @param part the part whose style was changed. E.g. `LV_PART_ANY`, `LV_PART_MAIN` + * @param prop `LV_STYLE_PROP_ANY` or an `LV_STYLE_...` property. + * It is used to optimize what needs to be refreshed. + * `LV_STYLE_PROP_INV` to perform only a style cache update + */ +void lv_obj_refresh_style(struct _lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop); + +/** + * Enable or disable automatic style refreshing when a new style is added/removed to/from an object + * or any other style change happens. + * @param en true: enable refreshing; false: disable refreshing + */ +void lv_obj_enable_style_refresh(bool en); + +/** + * Get the value of a style property. The current state of the object will be considered. + * Inherited properties will be inherited. + * If a property is not set a default value will be returned. + * @param obj pointer to an object + * @param part a part from which the property should be get + * @param prop the property to get + * @return the value of the property. + * Should be read from the correct field of the `lv_style_value_t` according to the type of the property. + */ +lv_style_value_t lv_obj_get_style_prop(const struct _lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop); + +/** + * Set local style property on an object's part and state. + * @param obj pointer to an object + * @param prop the property + * @param value value of the property. The correct element should be set according to the type of the property + * @param selector OR-ed value of parts and state for which the style should be set + */ +void lv_obj_set_local_style_prop(struct _lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t value, + lv_style_selector_t selector); + +void lv_obj_set_local_style_prop_meta(struct _lv_obj_t * obj, lv_style_prop_t prop, uint16_t meta, + lv_style_selector_t selector); + +lv_style_res_t lv_obj_get_local_style_prop(struct _lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t * value, + lv_style_selector_t selector); + +/** + * Remove a local style property from a part of an object with a given state. + * @param obj pointer to an object + * @param prop a style property to remove. + * @param selector OR-ed value of parts and state for which the style should be removed + * @return true the property was found and removed; false: the property was not found + */ +bool lv_obj_remove_local_style_prop(struct _lv_obj_t * obj, lv_style_prop_t prop, lv_style_selector_t selector); + +/** + * Used internally for color filtering + */ +lv_style_value_t _lv_obj_style_apply_color_filter(const struct _lv_obj_t * obj, uint32_t part, lv_style_value_t v); + +/** + * Used internally to create a style transition + * @param obj + * @param part + * @param prev_state + * @param new_state + * @param tr + */ +void _lv_obj_style_create_transition(struct _lv_obj_t * obj, lv_part_t part, lv_state_t prev_state, + lv_state_t new_state, const _lv_obj_style_transition_dsc_t * tr); + +/** + * Used internally to compare the appearance of an object in 2 states + * @param obj + * @param state1 + * @param state2 + * @return + */ +_lv_style_state_cmp_t _lv_obj_style_state_compare(struct _lv_obj_t * obj, lv_state_t state1, lv_state_t state2); + +/** + * Fade in an an object and all its children. + * @param obj the object to fade in + * @param time time of fade + * @param delay delay to start the animation + */ +void lv_obj_fade_in(struct _lv_obj_t * obj, uint32_t time, uint32_t delay); + +/** + * Fade out an an object and all its children. + * @param obj the object to fade out + * @param time time of fade + * @param delay delay to start the animation + */ +void lv_obj_fade_out(struct _lv_obj_t * obj, uint32_t time, uint32_t delay); + +lv_state_t lv_obj_style_get_selector_state(lv_style_selector_t selector); + +lv_part_t lv_obj_style_get_selector_part(lv_style_selector_t selector); + +#include "lv_obj_style_gen.h" + +static inline void lv_obj_set_style_pad_all(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_obj_set_style_pad_left(obj, value, selector); + lv_obj_set_style_pad_right(obj, value, selector); + lv_obj_set_style_pad_top(obj, value, selector); + lv_obj_set_style_pad_bottom(obj, value, selector); +} + +static inline void lv_obj_set_style_pad_hor(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_obj_set_style_pad_left(obj, value, selector); + lv_obj_set_style_pad_right(obj, value, selector); +} + +static inline void lv_obj_set_style_pad_ver(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_obj_set_style_pad_top(obj, value, selector); + lv_obj_set_style_pad_bottom(obj, value, selector); +} + +static inline void lv_obj_set_style_pad_gap(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_obj_set_style_pad_row(obj, value, selector); + lv_obj_set_style_pad_column(obj, value, selector); +} + +static inline void lv_obj_set_style_size(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_obj_set_style_width(obj, value, selector); + lv_obj_set_style_height(obj, value, selector); +} + +lv_text_align_t lv_obj_calculate_style_text_align(const struct _lv_obj_t * obj, lv_part_t part, const char * txt); + + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_STYLE_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_style_gen.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_style_gen.c new file mode 100644 index 0000000..64a0bb2 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_style_gen.c @@ -0,0 +1,673 @@ +#include "lv_obj.h" + +void lv_obj_set_style_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_WIDTH, v, selector); +} + +void lv_obj_set_style_min_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_MIN_WIDTH, v, selector); +} + +void lv_obj_set_style_max_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_MAX_WIDTH, v, selector); +} + +void lv_obj_set_style_height(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_HEIGHT, v, selector); +} + +void lv_obj_set_style_min_height(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_MIN_HEIGHT, v, selector); +} + +void lv_obj_set_style_max_height(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_MAX_HEIGHT, v, selector); +} + +void lv_obj_set_style_x(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_X, v, selector); +} + +void lv_obj_set_style_y(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_Y, v, selector); +} + +void lv_obj_set_style_align(struct _lv_obj_t * obj, lv_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ALIGN, v, selector); +} + +void lv_obj_set_style_transform_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_WIDTH, v, selector); +} + +void lv_obj_set_style_transform_height(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_HEIGHT, v, selector); +} + +void lv_obj_set_style_translate_x(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSLATE_X, v, selector); +} + +void lv_obj_set_style_translate_y(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSLATE_Y, v, selector); +} + +void lv_obj_set_style_transform_zoom(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_ZOOM, v, selector); +} + +void lv_obj_set_style_transform_angle(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_ANGLE, v, selector); +} + +void lv_obj_set_style_transform_pivot_x(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_PIVOT_X, v, selector); +} + +void lv_obj_set_style_transform_pivot_y(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_PIVOT_Y, v, selector); +} + +void lv_obj_set_style_pad_top(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_TOP, v, selector); +} + +void lv_obj_set_style_pad_bottom(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_BOTTOM, v, selector); +} + +void lv_obj_set_style_pad_left(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_LEFT, v, selector); +} + +void lv_obj_set_style_pad_right(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_RIGHT, v, selector); +} + +void lv_obj_set_style_pad_row(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_ROW, v, selector); +} + +void lv_obj_set_style_pad_column(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_COLUMN, v, selector); +} + +void lv_obj_set_style_bg_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_COLOR, v, selector); +} + +void lv_obj_set_style_bg_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_OPA, v, selector); +} + +void lv_obj_set_style_bg_grad_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD_COLOR, v, selector); +} + +void lv_obj_set_style_bg_grad_dir(struct _lv_obj_t * obj, lv_grad_dir_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD_DIR, v, selector); +} + +void lv_obj_set_style_bg_main_stop(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_MAIN_STOP, v, selector); +} + +void lv_obj_set_style_bg_grad_stop(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD_STOP, v, selector); +} + +void lv_obj_set_style_bg_grad(struct _lv_obj_t * obj, const lv_grad_dsc_t * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD, v, selector); +} + +void lv_obj_set_style_bg_dither_mode(struct _lv_obj_t * obj, lv_dither_mode_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_DITHER_MODE, v, selector); +} + +void lv_obj_set_style_bg_img_src(struct _lv_obj_t * obj, const void * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_IMG_SRC, v, selector); +} + +void lv_obj_set_style_bg_img_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_IMG_OPA, v, selector); +} + +void lv_obj_set_style_bg_img_recolor(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_IMG_RECOLOR, v, selector); +} + +void lv_obj_set_style_bg_img_recolor_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_IMG_RECOLOR_OPA, v, selector); +} + +void lv_obj_set_style_bg_img_tiled(struct _lv_obj_t * obj, bool value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_IMG_TILED, v, selector); +} + +void lv_obj_set_style_border_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BORDER_COLOR, v, selector); +} + +void lv_obj_set_style_border_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BORDER_OPA, v, selector); +} + +void lv_obj_set_style_border_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BORDER_WIDTH, v, selector); +} + +void lv_obj_set_style_border_side(struct _lv_obj_t * obj, lv_border_side_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BORDER_SIDE, v, selector); +} + +void lv_obj_set_style_border_post(struct _lv_obj_t * obj, bool value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BORDER_POST, v, selector); +} + +void lv_obj_set_style_outline_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_OUTLINE_WIDTH, v, selector); +} + +void lv_obj_set_style_outline_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_OUTLINE_COLOR, v, selector); +} + +void lv_obj_set_style_outline_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_OUTLINE_OPA, v, selector); +} + +void lv_obj_set_style_outline_pad(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_OUTLINE_PAD, v, selector); +} + +void lv_obj_set_style_shadow_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_WIDTH, v, selector); +} + +void lv_obj_set_style_shadow_ofs_x(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_OFS_X, v, selector); +} + +void lv_obj_set_style_shadow_ofs_y(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_OFS_Y, v, selector); +} + +void lv_obj_set_style_shadow_spread(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_SPREAD, v, selector); +} + +void lv_obj_set_style_shadow_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_COLOR, v, selector); +} + +void lv_obj_set_style_shadow_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_OPA, v, selector); +} + +void lv_obj_set_style_img_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_IMG_OPA, v, selector); +} + +void lv_obj_set_style_img_recolor(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_IMG_RECOLOR, v, selector); +} + +void lv_obj_set_style_img_recolor_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_IMG_RECOLOR_OPA, v, selector); +} + +void lv_obj_set_style_line_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_WIDTH, v, selector); +} + +void lv_obj_set_style_line_dash_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_DASH_WIDTH, v, selector); +} + +void lv_obj_set_style_line_dash_gap(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_DASH_GAP, v, selector); +} + +void lv_obj_set_style_line_rounded(struct _lv_obj_t * obj, bool value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_ROUNDED, v, selector); +} + +void lv_obj_set_style_line_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_COLOR, v, selector); +} + +void lv_obj_set_style_line_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_OPA, v, selector); +} + +void lv_obj_set_style_arc_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ARC_WIDTH, v, selector); +} + +void lv_obj_set_style_arc_rounded(struct _lv_obj_t * obj, bool value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ARC_ROUNDED, v, selector); +} + +void lv_obj_set_style_arc_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ARC_COLOR, v, selector); +} + +void lv_obj_set_style_arc_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ARC_OPA, v, selector); +} + +void lv_obj_set_style_arc_img_src(struct _lv_obj_t * obj, const void * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ARC_IMG_SRC, v, selector); +} + +void lv_obj_set_style_text_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_COLOR, v, selector); +} + +void lv_obj_set_style_text_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_OPA, v, selector); +} + +void lv_obj_set_style_text_font(struct _lv_obj_t * obj, const lv_font_t * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_FONT, v, selector); +} + +void lv_obj_set_style_text_letter_space(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_LETTER_SPACE, v, selector); +} + +void lv_obj_set_style_text_line_space(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_LINE_SPACE, v, selector); +} + +void lv_obj_set_style_text_decor(struct _lv_obj_t * obj, lv_text_decor_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_DECOR, v, selector); +} + +void lv_obj_set_style_text_align(struct _lv_obj_t * obj, lv_text_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_ALIGN, v, selector); +} + +void lv_obj_set_style_radius(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_RADIUS, v, selector); +} + +void lv_obj_set_style_clip_corner(struct _lv_obj_t * obj, bool value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_CLIP_CORNER, v, selector); +} + +void lv_obj_set_style_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_OPA, v, selector); +} + +void lv_obj_set_style_color_filter_dsc(struct _lv_obj_t * obj, const lv_color_filter_dsc_t * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_COLOR_FILTER_DSC, v, selector); +} + +void lv_obj_set_style_color_filter_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_COLOR_FILTER_OPA, v, selector); +} + +void lv_obj_set_style_anim(struct _lv_obj_t * obj, const lv_anim_t * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ANIM, v, selector); +} + +void lv_obj_set_style_anim_time(struct _lv_obj_t * obj, uint32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ANIM_TIME, v, selector); +} + +void lv_obj_set_style_anim_speed(struct _lv_obj_t * obj, uint32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ANIM_SPEED, v, selector); +} + +void lv_obj_set_style_transition(struct _lv_obj_t * obj, const lv_style_transition_dsc_t * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSITION, v, selector); +} + +void lv_obj_set_style_blend_mode(struct _lv_obj_t * obj, lv_blend_mode_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BLEND_MODE, v, selector); +} + +void lv_obj_set_style_layout(struct _lv_obj_t * obj, uint16_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_LAYOUT, v, selector); +} + +void lv_obj_set_style_base_dir(struct _lv_obj_t * obj, lv_base_dir_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BASE_DIR, v, selector); +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_style_gen.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_style_gen.h new file mode 100644 index 0000000..576927d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_style_gen.h @@ -0,0 +1,648 @@ +static inline lv_coord_t lv_obj_get_style_width(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_WIDTH); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_min_width(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MIN_WIDTH); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_max_width(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MAX_WIDTH); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_height(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_HEIGHT); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_min_height(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MIN_HEIGHT); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_max_height(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MAX_HEIGHT); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_x(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_X); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_y(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_Y); + return (lv_coord_t)v.num; +} + +static inline lv_align_t lv_obj_get_style_align(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ALIGN); + return (lv_align_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_transform_width(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_WIDTH); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_transform_height(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_HEIGHT); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_translate_x(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSLATE_X); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_translate_y(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSLATE_Y); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_transform_zoom(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_ZOOM); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_transform_angle(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_ANGLE); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_transform_pivot_x(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_PIVOT_X); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_transform_pivot_y(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_PIVOT_Y); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_pad_top(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_TOP); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_pad_bottom(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_BOTTOM); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_pad_left(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_LEFT); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_pad_right(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_RIGHT); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_pad_row(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_ROW); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_pad_column(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_COLUMN); + return (lv_coord_t)v.num; +} + +static inline lv_color_t lv_obj_get_style_bg_color(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_COLOR); + return v.color; +} + +static inline lv_color_t lv_obj_get_style_bg_color_filtered(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BG_COLOR)); + return v.color; +} + +static inline lv_opa_t lv_obj_get_style_bg_opa(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_OPA); + return (lv_opa_t)v.num; +} + +static inline lv_color_t lv_obj_get_style_bg_grad_color(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_COLOR); + return v.color; +} + +static inline lv_color_t lv_obj_get_style_bg_grad_color_filtered(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_COLOR)); + return v.color; +} + +static inline lv_grad_dir_t lv_obj_get_style_bg_grad_dir(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_DIR); + return (lv_grad_dir_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_bg_main_stop(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_MAIN_STOP); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_bg_grad_stop(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_STOP); + return (lv_coord_t)v.num; +} + +static inline const lv_grad_dsc_t * lv_obj_get_style_bg_grad(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD); + return (const lv_grad_dsc_t *)v.ptr; +} + +static inline lv_dither_mode_t lv_obj_get_style_bg_dither_mode(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_DITHER_MODE); + return (lv_dither_mode_t)v.num; +} + +static inline const void * lv_obj_get_style_bg_img_src(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMG_SRC); + return (const void *)v.ptr; +} + +static inline lv_opa_t lv_obj_get_style_bg_img_opa(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMG_OPA); + return (lv_opa_t)v.num; +} + +static inline lv_color_t lv_obj_get_style_bg_img_recolor(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMG_RECOLOR); + return v.color; +} + +static inline lv_color_t lv_obj_get_style_bg_img_recolor_filtered(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMG_RECOLOR)); + return v.color; +} + +static inline lv_opa_t lv_obj_get_style_bg_img_recolor_opa(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMG_RECOLOR_OPA); + return (lv_opa_t)v.num; +} + +static inline bool lv_obj_get_style_bg_img_tiled(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMG_TILED); + return (bool)v.num; +} + +static inline lv_color_t lv_obj_get_style_border_color(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_COLOR); + return v.color; +} + +static inline lv_color_t lv_obj_get_style_border_color_filtered(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_COLOR)); + return v.color; +} + +static inline lv_opa_t lv_obj_get_style_border_opa(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_OPA); + return (lv_opa_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_border_width(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_WIDTH); + return (lv_coord_t)v.num; +} + +static inline lv_border_side_t lv_obj_get_style_border_side(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_SIDE); + return (lv_border_side_t)v.num; +} + +static inline bool lv_obj_get_style_border_post(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_POST); + return (bool)v.num; +} + +static inline lv_coord_t lv_obj_get_style_outline_width(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_WIDTH); + return (lv_coord_t)v.num; +} + +static inline lv_color_t lv_obj_get_style_outline_color(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_COLOR); + return v.color; +} + +static inline lv_color_t lv_obj_get_style_outline_color_filtered(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_COLOR)); + return v.color; +} + +static inline lv_opa_t lv_obj_get_style_outline_opa(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_OPA); + return (lv_opa_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_outline_pad(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_PAD); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_shadow_width(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_WIDTH); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_shadow_ofs_x(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_OFS_X); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_shadow_ofs_y(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_OFS_Y); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_shadow_spread(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_SPREAD); + return (lv_coord_t)v.num; +} + +static inline lv_color_t lv_obj_get_style_shadow_color(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_COLOR); + return v.color; +} + +static inline lv_color_t lv_obj_get_style_shadow_color_filtered(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_COLOR)); + return v.color; +} + +static inline lv_opa_t lv_obj_get_style_shadow_opa(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_OPA); + return (lv_opa_t)v.num; +} + +static inline lv_opa_t lv_obj_get_style_img_opa(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_IMG_OPA); + return (lv_opa_t)v.num; +} + +static inline lv_color_t lv_obj_get_style_img_recolor(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_IMG_RECOLOR); + return v.color; +} + +static inline lv_color_t lv_obj_get_style_img_recolor_filtered(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_IMG_RECOLOR)); + return v.color; +} + +static inline lv_opa_t lv_obj_get_style_img_recolor_opa(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_IMG_RECOLOR_OPA); + return (lv_opa_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_line_width(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_WIDTH); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_line_dash_width(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_DASH_WIDTH); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_line_dash_gap(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_DASH_GAP); + return (lv_coord_t)v.num; +} + +static inline bool lv_obj_get_style_line_rounded(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_ROUNDED); + return (bool)v.num; +} + +static inline lv_color_t lv_obj_get_style_line_color(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_COLOR); + return v.color; +} + +static inline lv_color_t lv_obj_get_style_line_color_filtered(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_COLOR)); + return v.color; +} + +static inline lv_opa_t lv_obj_get_style_line_opa(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_OPA); + return (lv_opa_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_arc_width(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_WIDTH); + return (lv_coord_t)v.num; +} + +static inline bool lv_obj_get_style_arc_rounded(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_ROUNDED); + return (bool)v.num; +} + +static inline lv_color_t lv_obj_get_style_arc_color(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_COLOR); + return v.color; +} + +static inline lv_color_t lv_obj_get_style_arc_color_filtered(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_COLOR)); + return v.color; +} + +static inline lv_opa_t lv_obj_get_style_arc_opa(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_OPA); + return (lv_opa_t)v.num; +} + +static inline const void * lv_obj_get_style_arc_img_src(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_IMG_SRC); + return (const void *)v.ptr; +} + +static inline lv_color_t lv_obj_get_style_text_color(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_COLOR); + return v.color; +} + +static inline lv_color_t lv_obj_get_style_text_color_filtered(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_COLOR)); + return v.color; +} + +static inline lv_opa_t lv_obj_get_style_text_opa(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_OPA); + return (lv_opa_t)v.num; +} + +static inline const lv_font_t * lv_obj_get_style_text_font(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_FONT); + return (const lv_font_t *)v.ptr; +} + +static inline lv_coord_t lv_obj_get_style_text_letter_space(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_LETTER_SPACE); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_text_line_space(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_LINE_SPACE); + return (lv_coord_t)v.num; +} + +static inline lv_text_decor_t lv_obj_get_style_text_decor(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_DECOR); + return (lv_text_decor_t)v.num; +} + +static inline lv_text_align_t lv_obj_get_style_text_align(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_ALIGN); + return (lv_text_align_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_radius(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_RADIUS); + return (lv_coord_t)v.num; +} + +static inline bool lv_obj_get_style_clip_corner(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_CLIP_CORNER); + return (bool)v.num; +} + +static inline lv_opa_t lv_obj_get_style_opa(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OPA); + return (lv_opa_t)v.num; +} + +static inline const lv_color_filter_dsc_t * lv_obj_get_style_color_filter_dsc(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_COLOR_FILTER_DSC); + return (const lv_color_filter_dsc_t *)v.ptr; +} + +static inline lv_opa_t lv_obj_get_style_color_filter_opa(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_COLOR_FILTER_OPA); + return (lv_opa_t)v.num; +} + +static inline const lv_anim_t * lv_obj_get_style_anim(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ANIM); + return (const lv_anim_t *)v.ptr; +} + +static inline uint32_t lv_obj_get_style_anim_time(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ANIM_TIME); + return (uint32_t)v.num; +} + +static inline uint32_t lv_obj_get_style_anim_speed(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ANIM_SPEED); + return (uint32_t)v.num; +} + +static inline const lv_style_transition_dsc_t * lv_obj_get_style_transition(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSITION); + return (const lv_style_transition_dsc_t *)v.ptr; +} + +static inline lv_blend_mode_t lv_obj_get_style_blend_mode(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BLEND_MODE); + return (lv_blend_mode_t)v.num; +} + +static inline uint16_t lv_obj_get_style_layout(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LAYOUT); + return (uint16_t)v.num; +} + +static inline lv_base_dir_t lv_obj_get_style_base_dir(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BASE_DIR); + return (lv_base_dir_t)v.num; +} + +void lv_obj_set_style_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_min_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_max_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_height(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_min_height(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_max_height(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_x(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_y(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_align(struct _lv_obj_t * obj, lv_align_t value, lv_style_selector_t selector); +void lv_obj_set_style_transform_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_transform_height(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_translate_x(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_translate_y(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_transform_zoom(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_transform_angle(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_transform_pivot_x(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_transform_pivot_y(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_pad_top(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_pad_bottom(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_pad_left(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_pad_right(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_pad_row(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_pad_column(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_grad_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_grad_dir(struct _lv_obj_t * obj, lv_grad_dir_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_main_stop(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_grad_stop(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_grad(struct _lv_obj_t * obj, const lv_grad_dsc_t * value, lv_style_selector_t selector); +void lv_obj_set_style_bg_dither_mode(struct _lv_obj_t * obj, lv_dither_mode_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_img_src(struct _lv_obj_t * obj, const void * value, lv_style_selector_t selector); +void lv_obj_set_style_bg_img_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_img_recolor(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_img_recolor_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_img_tiled(struct _lv_obj_t * obj, bool value, lv_style_selector_t selector); +void lv_obj_set_style_border_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); +void lv_obj_set_style_border_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_border_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_border_side(struct _lv_obj_t * obj, lv_border_side_t value, lv_style_selector_t selector); +void lv_obj_set_style_border_post(struct _lv_obj_t * obj, bool value, lv_style_selector_t selector); +void lv_obj_set_style_outline_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_outline_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); +void lv_obj_set_style_outline_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_outline_pad(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_shadow_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_shadow_ofs_x(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_shadow_ofs_y(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_shadow_spread(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_shadow_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); +void lv_obj_set_style_shadow_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_img_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_img_recolor(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); +void lv_obj_set_style_img_recolor_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_line_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_line_dash_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_line_dash_gap(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_line_rounded(struct _lv_obj_t * obj, bool value, lv_style_selector_t selector); +void lv_obj_set_style_line_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); +void lv_obj_set_style_line_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_arc_width(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_arc_rounded(struct _lv_obj_t * obj, bool value, lv_style_selector_t selector); +void lv_obj_set_style_arc_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); +void lv_obj_set_style_arc_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_arc_img_src(struct _lv_obj_t * obj, const void * value, lv_style_selector_t selector); +void lv_obj_set_style_text_color(struct _lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); +void lv_obj_set_style_text_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_text_font(struct _lv_obj_t * obj, const lv_font_t * value, lv_style_selector_t selector); +void lv_obj_set_style_text_letter_space(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_text_line_space(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_text_decor(struct _lv_obj_t * obj, lv_text_decor_t value, lv_style_selector_t selector); +void lv_obj_set_style_text_align(struct _lv_obj_t * obj, lv_text_align_t value, lv_style_selector_t selector); +void lv_obj_set_style_radius(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_clip_corner(struct _lv_obj_t * obj, bool value, lv_style_selector_t selector); +void lv_obj_set_style_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_color_filter_dsc(struct _lv_obj_t * obj, const lv_color_filter_dsc_t * value, lv_style_selector_t selector); +void lv_obj_set_style_color_filter_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_anim(struct _lv_obj_t * obj, const lv_anim_t * value, lv_style_selector_t selector); +void lv_obj_set_style_anim_time(struct _lv_obj_t * obj, uint32_t value, lv_style_selector_t selector); +void lv_obj_set_style_anim_speed(struct _lv_obj_t * obj, uint32_t value, lv_style_selector_t selector); +void lv_obj_set_style_transition(struct _lv_obj_t * obj, const lv_style_transition_dsc_t * value, lv_style_selector_t selector); +void lv_obj_set_style_blend_mode(struct _lv_obj_t * obj, lv_blend_mode_t value, lv_style_selector_t selector); +void lv_obj_set_style_layout(struct _lv_obj_t * obj, uint16_t value, lv_style_selector_t selector); +void lv_obj_set_style_base_dir(struct _lv_obj_t * obj, lv_base_dir_t value, lv_style_selector_t selector); diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_tree.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_tree.c new file mode 100644 index 0000000..d3ad16a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_tree.c @@ -0,0 +1,452 @@ +/** + * @file lv_obj_tree.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include + +#include "lv_obj.h" +#include "lv_indev.h" +#include "../misc/lv_anim.h" +#include "../misc/lv_gc.h" +#include "../misc/lv_async.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_obj_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_obj_del_async_cb(void * obj); +static void obj_del_core(lv_obj_t * obj); +static lv_obj_tree_walk_res_t walk_core(lv_obj_t * obj, lv_obj_tree_walk_cb_t cb, void * user_data); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_obj_del(lv_obj_t * obj) +{ + LV_LOG_TRACE("begin (delete %p)", (void *)obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_obj_invalidate(obj); + + lv_obj_t * par = lv_obj_get_parent(obj); + if(par) { + lv_obj_scrollbar_invalidate(par); + } + + lv_disp_t * disp = NULL; + bool act_scr_del = false; + if(par == NULL) { + disp = lv_obj_get_disp(obj); + if(!disp) return; /*Shouldn't happen*/ + if(disp->act_scr == obj) act_scr_del = true; + } + + obj_del_core(obj); + + /*Call the ancestor's event handler to the parent to notify it about the child delete*/ + if(par) { + lv_obj_update_layout(par); + lv_obj_readjust_scroll(par, LV_ANIM_OFF); + lv_obj_scrollbar_invalidate(par); + lv_event_send(par, LV_EVENT_CHILD_CHANGED, NULL); + lv_event_send(par, LV_EVENT_CHILD_DELETED, NULL); + } + + /*Handle if the active screen was deleted*/ + if(act_scr_del) { + LV_LOG_WARN("the active screen was deleted"); + disp->act_scr = NULL; + } + + LV_ASSERT_MEM_INTEGRITY(); + LV_LOG_TRACE("finished (delete %p)", (void *)obj); +} + +void lv_obj_clean(lv_obj_t * obj) +{ + LV_LOG_TRACE("begin (delete %p)", (void *)obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_invalidate(obj); + + lv_obj_t * child = lv_obj_get_child(obj, 0); + while(child) { + obj_del_core(child); + child = lv_obj_get_child(obj, 0); + } + /*Just to remove scroll animations if any*/ + lv_obj_scroll_to(obj, 0, 0, LV_ANIM_OFF); + if(obj->spec_attr) { + obj->spec_attr->scroll.x = 0; + obj->spec_attr->scroll.y = 0; + } + + LV_ASSERT_MEM_INTEGRITY(); + + LV_LOG_TRACE("finished (delete %p)", (void *)obj); +} + +void lv_obj_del_delayed(lv_obj_t * obj, uint32_t delay_ms) +{ + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, obj); + lv_anim_set_exec_cb(&a, NULL); + lv_anim_set_time(&a, 1); + lv_anim_set_delay(&a, delay_ms); + lv_anim_set_ready_cb(&a, lv_obj_del_anim_ready_cb); + lv_anim_start(&a); +} + +void lv_obj_del_anim_ready_cb(lv_anim_t * a) +{ + lv_obj_del(a->var); +} + +void lv_obj_del_async(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_async_call(lv_obj_del_async_cb, obj); +} + +void lv_obj_set_parent(lv_obj_t * obj, lv_obj_t * parent) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_OBJ(parent, MY_CLASS); + + if(obj->parent == NULL) { + LV_LOG_WARN("Can't set the parent of a screen"); + return; + } + + if(parent == NULL) { + LV_LOG_WARN("Can't set parent == NULL to an object"); + return; + } + + lv_obj_invalidate(obj); + + lv_obj_allocate_spec_attr(parent); + + lv_obj_t * old_parent = obj->parent; + /*Remove the object from the old parent's child list*/ + int32_t i; + for(i = lv_obj_get_index(obj); i <= (int32_t)lv_obj_get_child_cnt(old_parent) - 2; i++) { + old_parent->spec_attr->children[i] = old_parent->spec_attr->children[i + 1]; + } + old_parent->spec_attr->child_cnt--; + if(old_parent->spec_attr->child_cnt) { + old_parent->spec_attr->children = lv_mem_realloc(old_parent->spec_attr->children, + old_parent->spec_attr->child_cnt * (sizeof(lv_obj_t *))); + } + else { + lv_mem_free(old_parent->spec_attr->children); + old_parent->spec_attr->children = NULL; + } + + /*Add the child to the new parent as the last (newest child)*/ + parent->spec_attr->child_cnt++; + parent->spec_attr->children = lv_mem_realloc(parent->spec_attr->children, + parent->spec_attr->child_cnt * (sizeof(lv_obj_t *))); + parent->spec_attr->children[lv_obj_get_child_cnt(parent) - 1] = obj; + + obj->parent = parent; + + /*Notify the original parent because one of its children is lost*/ + lv_obj_readjust_scroll(old_parent, LV_ANIM_OFF); + lv_obj_scrollbar_invalidate(old_parent); + lv_event_send(old_parent, LV_EVENT_CHILD_CHANGED, obj); + lv_event_send(old_parent, LV_EVENT_CHILD_DELETED, NULL); + + /*Notify the new parent about the child*/ + lv_event_send(parent, LV_EVENT_CHILD_CHANGED, obj); + lv_event_send(parent, LV_EVENT_CHILD_CREATED, NULL); + + lv_obj_mark_layout_as_dirty(obj); + + lv_obj_invalidate(obj); +} + +void lv_obj_move_to_index(lv_obj_t * obj, int32_t index) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(index < 0) { + index = lv_obj_get_child_cnt(lv_obj_get_parent(obj)) + index; + } + + const int32_t old_index = lv_obj_get_index(obj); + + lv_obj_t * parent = lv_obj_get_parent(obj); + + if(index < 0) return; + if(index >= (int32_t) lv_obj_get_child_cnt(parent)) return; + if(index == old_index) return; + + int32_t i = old_index; + if(index < old_index) { + while(i > index) { + parent->spec_attr->children[i] = parent->spec_attr->children[i - 1]; + i--; + } + } + else { + while(i < index) { + parent->spec_attr->children[i] = parent->spec_attr->children[i + 1]; + i++; + } + } + + parent->spec_attr->children[index] = obj; + lv_event_send(parent, LV_EVENT_CHILD_CHANGED, NULL); + lv_obj_invalidate(parent); +} + +void lv_obj_swap(lv_obj_t * obj1, lv_obj_t * obj2) +{ + LV_ASSERT_OBJ(obj1, MY_CLASS); + LV_ASSERT_OBJ(obj2, MY_CLASS); + + lv_obj_t * parent = lv_obj_get_parent(obj1); + lv_obj_t * parent2 = lv_obj_get_parent(obj2); + + uint_fast32_t index1 = lv_obj_get_index(obj1); + uint_fast32_t index2 = lv_obj_get_index(obj2); + + lv_event_send(parent2, LV_EVENT_CHILD_DELETED, obj2); + lv_event_send(parent, LV_EVENT_CHILD_DELETED, obj1); + + parent->spec_attr->children[index1] = obj2; + parent2->spec_attr->children[index2] = obj1; + + lv_event_send(parent, LV_EVENT_CHILD_CHANGED, obj2); + lv_event_send(parent, LV_EVENT_CHILD_CREATED, obj2); + lv_event_send(parent2, LV_EVENT_CHILD_CHANGED, obj1); + lv_event_send(parent2, LV_EVENT_CHILD_CREATED, obj1); + + lv_obj_invalidate(parent); + + if(parent != parent2) { + lv_obj_invalidate(parent2); + } + lv_group_swap_obj(obj1, obj2); +} + +lv_obj_t * lv_obj_get_screen(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + const lv_obj_t * par = obj; + const lv_obj_t * act_par; + + do { + act_par = par; + par = lv_obj_get_parent(act_par); + } while(par != NULL); + + return (lv_obj_t *)act_par; +} + +lv_disp_t * lv_obj_get_disp(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + const lv_obj_t * scr; + + if(obj->parent == NULL) scr = obj; /*`obj` is a screen*/ + else scr = lv_obj_get_screen(obj); /*get the screen of `obj`*/ + + lv_disp_t * d; + _LV_LL_READ(&LV_GC_ROOT(_lv_disp_ll), d) { + uint32_t i; + for(i = 0; i < d->screen_cnt; i++) { + if(d->screens[i] == scr) return d; + } + } + + LV_LOG_WARN("No screen found"); + return NULL; +} + +lv_obj_t * lv_obj_get_parent(const lv_obj_t * obj) +{ + if(obj == NULL) return NULL; + LV_ASSERT_OBJ(obj, MY_CLASS); + + return obj->parent; +} + +lv_obj_t * lv_obj_get_child(const lv_obj_t * obj, int32_t id) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(obj->spec_attr == NULL) return NULL; + + uint32_t idu; + if(id < 0) { + id = obj->spec_attr->child_cnt + id; + if(id < 0) return NULL; + idu = (uint32_t) id; + } + else { + idu = id; + } + + if(idu >= obj->spec_attr->child_cnt) return NULL; + else return obj->spec_attr->children[id]; +} + +uint32_t lv_obj_get_child_cnt(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + if(obj->spec_attr == NULL) return 0; + return obj->spec_attr->child_cnt; +} + +uint32_t lv_obj_get_index(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent == NULL) return 0; + + uint32_t i = 0; + for(i = 0; i < lv_obj_get_child_cnt(parent); i++) { + if(lv_obj_get_child(parent, i) == obj) return i; + } + + return 0xFFFFFFFF; /*Shouldn't happen*/ +} + +void lv_obj_tree_walk(lv_obj_t * start_obj, lv_obj_tree_walk_cb_t cb, void * user_data) +{ + walk_core(start_obj, cb, user_data); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_obj_del_async_cb(void * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_del(obj); +} + +static void obj_del_core(lv_obj_t * obj) +{ + /*Let the user free the resources used in `LV_EVENT_DELETE`*/ + lv_res_t res = lv_event_send(obj, LV_EVENT_DELETE, NULL); + if(res == LV_RES_INV) return; + + /*Recursively delete the children*/ + lv_obj_t * child = lv_obj_get_child(obj, 0); + while(child) { + obj_del_core(child); + child = lv_obj_get_child(obj, 0); + } + + lv_group_t * group = lv_obj_get_group(obj); + + /*Reset all input devices if the object to delete is used*/ + lv_indev_t * indev = lv_indev_get_next(NULL); + while(indev) { + if(indev->proc.types.pointer.act_obj == obj || indev->proc.types.pointer.last_obj == obj) { + lv_indev_reset(indev, obj); + } + if(indev->proc.types.pointer.last_pressed == obj) { + indev->proc.types.pointer.last_pressed = NULL; + } + + if(indev->group == group && obj == lv_indev_get_obj_act()) { + lv_indev_reset(indev, obj); + } + indev = lv_indev_get_next(indev); + } + + /*All children deleted. Now clean up the object specific data*/ + _lv_obj_destruct(obj); + + /*Remove the screen for the screen list*/ + if(obj->parent == NULL) { + lv_disp_t * disp = lv_obj_get_disp(obj); + uint32_t i; + /*Find the screen in the list*/ + for(i = 0; i < disp->screen_cnt; i++) { + if(disp->screens[i] == obj) break; + } + + uint32_t id = i; + for(i = id; i < disp->screen_cnt - 1; i++) { + disp->screens[i] = disp->screens[i + 1]; + } + disp->screen_cnt--; + disp->screens = lv_mem_realloc(disp->screens, disp->screen_cnt * sizeof(lv_obj_t *)); + } + /*Remove the object from the child list of its parent*/ + else { + uint32_t id = lv_obj_get_index(obj); + uint32_t i; + for(i = id; i < obj->parent->spec_attr->child_cnt - 1; i++) { + obj->parent->spec_attr->children[i] = obj->parent->spec_attr->children[i + 1]; + } + obj->parent->spec_attr->child_cnt--; + obj->parent->spec_attr->children = lv_mem_realloc(obj->parent->spec_attr->children, + obj->parent->spec_attr->child_cnt * sizeof(lv_obj_t *)); + } + + /*Free the object itself*/ + lv_mem_free(obj); +} + + +static lv_obj_tree_walk_res_t walk_core(lv_obj_t * obj, lv_obj_tree_walk_cb_t cb, void * user_data) +{ + lv_obj_tree_walk_res_t res = LV_OBJ_TREE_WALK_NEXT; + + if(obj == NULL) { + lv_disp_t * disp = lv_disp_get_next(NULL); + while(disp) { + uint32_t i; + for(i = 0; i < disp->screen_cnt; i++) { + walk_core(disp->screens[i], cb, user_data); + } + disp = lv_disp_get_next(disp); + } + return LV_OBJ_TREE_WALK_END; /*The value doesn't matter as it wasn't called recursively*/ + } + + res = cb(obj, user_data); + + if(res == LV_OBJ_TREE_WALK_END) return LV_OBJ_TREE_WALK_END; + + if(res != LV_OBJ_TREE_WALK_SKIP_CHILDREN) { + uint32_t i; + for(i = 0; i < lv_obj_get_child_cnt(obj); i++) { + res = walk_core(lv_obj_get_child(obj, i), cb, user_data); + if(res == LV_OBJ_TREE_WALK_END) return LV_OBJ_TREE_WALK_END; + } + } + return LV_OBJ_TREE_WALK_NEXT; +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_tree.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_tree.h new file mode 100644 index 0000000..bee9e16 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_obj_tree.h @@ -0,0 +1,172 @@ +/** + * @file struct _lv_obj_tree.h + * + */ + +#ifndef LV_OBJ_TREE_H +#define LV_OBJ_TREE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include + +/********************* + * DEFINES + *********************/ + + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_obj_t; +struct _lv_obj_class_t; + +typedef enum { + LV_OBJ_TREE_WALK_NEXT, + LV_OBJ_TREE_WALK_SKIP_CHILDREN, + LV_OBJ_TREE_WALK_END, +} lv_obj_tree_walk_res_t; + +typedef lv_obj_tree_walk_res_t (*lv_obj_tree_walk_cb_t)(struct _lv_obj_t *, void *); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Delete an object and all of its children. + * Also remove the objects from their group and remove all animations (if any). + * Send `LV_EVENT_DELETED` to deleted objects. + * @param obj pointer to an object + */ +void lv_obj_del(struct _lv_obj_t * obj); + +/** + * Delete all children of an object. + * Also remove the objects from their group and remove all animations (if any). + * Send `LV_EVENT_DELETED` to deleted objects. + * @param obj pointer to an object + */ +void lv_obj_clean(struct _lv_obj_t * obj); + +/** + * Delete an object after some delay + * @param obj pointer to an object + * @param delay_ms time to wait before delete in milliseconds + */ +void lv_obj_del_delayed(struct _lv_obj_t * obj, uint32_t delay_ms); + +/** + * A function to be easily used in animation ready callback to delete an object when the animation is ready + * @param a pointer to the animation + */ +void lv_obj_del_anim_ready_cb(lv_anim_t * a); + +/** + * Helper function for asynchronously deleting objects. + * Useful for cases where you can't delete an object directly in an `LV_EVENT_DELETE` handler (i.e. parent). + * @param obj object to delete + * @see lv_async_call + */ +void lv_obj_del_async(struct _lv_obj_t * obj); + +/** + * Move the parent of an object. The relative coordinates will be kept. + * + * @param obj pointer to an object whose parent needs to be changed + * @param parent pointer to the new parent + */ +void lv_obj_set_parent(struct _lv_obj_t * obj, struct _lv_obj_t * parent); + +/** + * Swap the positions of two objects. + * When used in listboxes, it can be used to sort the listbox items. + * @param obj1 pointer to the first object + * @param obj2 pointer to the second object + */ +void lv_obj_swap(struct _lv_obj_t * obj1, struct _lv_obj_t * obj2); + +/** + * moves the object to the given index in its parent. + * When used in listboxes, it can be used to sort the listbox items. + * @param obj pointer to the object to be moved. + * @param index new index in parent. -1 to count from the back + * @note to move to the background: lv_obj_move_to_index(obj, 0) + * @note to move forward (up): lv_obj_move_to_index(obj, lv_obj_get_index(obj) - 1) + */ +void lv_obj_move_to_index(struct _lv_obj_t * obj, int32_t index); + +/** + * Get the screen of an object + * @param obj pointer to an object + * @return pointer to the object's screen + */ +struct _lv_obj_t * lv_obj_get_screen(const struct _lv_obj_t * obj); + +/** + * Get the display of the object + * @param obj pointer to an object + * @return pointer to the object's display + */ +lv_disp_t * lv_obj_get_disp(const struct _lv_obj_t * obj); + +/** + * Get the parent of an object + * @param obj pointer to an object + * @return the parent of the object. (NULL if `obj` was a screen) + */ +struct _lv_obj_t * lv_obj_get_parent(const struct _lv_obj_t * obj); + +/** + * Get the child of an object by the child's index. + * @param obj pointer to an object whose child should be get + * @param id the index of the child. + * 0: the oldest (firstly created) child + * 1: the second oldest + * child count-1: the youngest + * -1: the youngest + * -2: the second youngest + * @return pointer to the child or NULL if the index was invalid + */ +struct _lv_obj_t * lv_obj_get_child(const struct _lv_obj_t * obj, int32_t id); + +/** + * Get the number of children + * @param obj pointer to an object + * @return the number of children + */ +uint32_t lv_obj_get_child_cnt(const struct _lv_obj_t * obj); + +/** + * Get the index of a child. + * @param obj pointer to an object + * @return the child index of the object. + * E.g. 0: the oldest (firstly created child) + */ +uint32_t lv_obj_get_index(const struct _lv_obj_t * obj); + +/** + * Iterate through all children of any object. + * @param start_obj start integrating from this object + * @param cb call this callback on the objects + * @param user_data pointer to any user related data (will be passed to `cb`) + */ +void lv_obj_tree_walk(struct _lv_obj_t * start_obj, lv_obj_tree_walk_cb_t cb, void * user_data); + +/********************** + * MACROS + **********************/ + + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_TREE_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_refr.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_refr.c new file mode 100644 index 0000000..1a56fed --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_refr.c @@ -0,0 +1,1255 @@ +/** + * @file lv_refr.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include +#include "lv_refr.h" +#include "lv_disp.h" +#include "../hal/lv_hal_tick.h" +#include "../hal/lv_hal_disp.h" +#include "../misc/lv_timer.h" +#include "../misc/lv_mem.h" +#include "../misc/lv_math.h" +#include "../misc/lv_gc.h" +#include "../draw/lv_draw.h" +#include "../font/lv_font_fmt_txt.h" +#include "../extra/others/snapshot/lv_snapshot.h" + +#if LV_USE_PERF_MONITOR || LV_USE_MEM_MONITOR + #include "../widgets/lv_label.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + uint32_t perf_last_time; + uint32_t elaps_sum; + uint32_t frame_cnt; + uint32_t fps_sum_cnt; + uint32_t fps_sum_all; +#if LV_USE_LABEL + lv_obj_t * perf_label; +#endif +} perf_monitor_t; + +typedef struct { + uint32_t mem_last_time; +#if LV_USE_LABEL + lv_obj_t * mem_label; +#endif +} mem_monitor_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_refr_join_area(void); +static void refr_invalid_areas(void); +static void refr_area(const lv_area_t * area_p); +static void refr_area_part(lv_draw_ctx_t * draw_ctx); +static lv_obj_t * lv_refr_get_top_obj(const lv_area_t * area_p, lv_obj_t * obj); +static void refr_obj_and_children(lv_draw_ctx_t * draw_ctx, lv_obj_t * top_obj); +static void refr_obj(lv_draw_ctx_t * draw_ctx, lv_obj_t * obj); +static uint32_t get_max_row(lv_disp_t * disp, lv_coord_t area_w, lv_coord_t area_h); +static void draw_buf_flush(lv_disp_t * disp); +static void call_flush_cb(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_p); + +#if LV_USE_PERF_MONITOR + static void perf_monitor_init(perf_monitor_t * perf_monitor); +#endif +#if LV_USE_MEM_MONITOR + static void mem_monitor_init(mem_monitor_t * mem_monitor); +#endif + +/********************** + * STATIC VARIABLES + **********************/ +static uint32_t px_num; +static lv_disp_t * disp_refr; /*Display being refreshed*/ + +#if LV_USE_PERF_MONITOR + static perf_monitor_t perf_monitor; +#endif + +#if LV_USE_MEM_MONITOR + static mem_monitor_t mem_monitor; +#endif + +/********************** + * MACROS + **********************/ +#if LV_LOG_TRACE_DISP_REFR + #define REFR_TRACE(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define REFR_TRACE(...) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Initialize the screen refresh subsystem + */ +void _lv_refr_init(void) +{ +#if LV_USE_PERF_MONITOR + perf_monitor_init(&perf_monitor); +#endif +#if LV_USE_MEM_MONITOR + mem_monitor_init(&mem_monitor); +#endif +} + +void lv_refr_now(lv_disp_t * disp) +{ + lv_anim_refr_now(); + + if(disp) { + if(disp->refr_timer) _lv_disp_refr_timer(disp->refr_timer); + } + else { + lv_disp_t * d; + d = lv_disp_get_next(NULL); + while(d) { + if(d->refr_timer) _lv_disp_refr_timer(d->refr_timer); + d = lv_disp_get_next(d); + } + } +} + +void lv_obj_redraw(lv_draw_ctx_t * draw_ctx, lv_obj_t * obj) +{ + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + lv_area_t clip_coords_for_obj; + + /*Truncate the clip area to `obj size + ext size` area*/ + lv_area_t obj_coords_ext; + lv_obj_get_coords(obj, &obj_coords_ext); + lv_coord_t ext_draw_size = _lv_obj_get_ext_draw_size(obj); + lv_area_increase(&obj_coords_ext, ext_draw_size, ext_draw_size); + bool com_clip_res = _lv_area_intersect(&clip_coords_for_obj, clip_area_ori, &obj_coords_ext); + /*If the object is visible on the current clip area OR has overflow visible draw it. + *With overflow visible drawing should happen to apply the masks which might affect children */ + bool should_draw = com_clip_res || lv_obj_has_flag(obj, LV_OBJ_FLAG_OVERFLOW_VISIBLE); + if(should_draw) { + draw_ctx->clip_area = &clip_coords_for_obj; + + lv_event_send(obj, LV_EVENT_DRAW_MAIN_BEGIN, draw_ctx); + lv_event_send(obj, LV_EVENT_DRAW_MAIN, draw_ctx); + lv_event_send(obj, LV_EVENT_DRAW_MAIN_END, draw_ctx); +#if LV_USE_REFR_DEBUG + lv_color_t debug_color = lv_color_make(lv_rand(0, 0xFF), lv_rand(0, 0xFF), lv_rand(0, 0xFF)); + lv_draw_rect_dsc_t draw_dsc; + lv_draw_rect_dsc_init(&draw_dsc); + draw_dsc.bg_color.full = debug_color.full; + draw_dsc.bg_opa = LV_OPA_20; + draw_dsc.border_width = 1; + draw_dsc.border_opa = LV_OPA_30; + draw_dsc.border_color = debug_color; + lv_draw_rect(draw_ctx, &draw_dsc, &obj_coords_ext); +#endif + } + + /*With overflow visible keep the previous clip area to let the children visible out of this object too + *With not overflow visible limit the clip are to the object's coordinates to clip the children*/ + lv_area_t clip_coords_for_children; + bool refr_children = true; + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_OVERFLOW_VISIBLE)) { + clip_coords_for_children = *clip_area_ori; + } + else { + if(!_lv_area_intersect(&clip_coords_for_children, clip_area_ori, &obj->coords)) { + refr_children = false; + } + } + + if(refr_children) { + draw_ctx->clip_area = &clip_coords_for_children; + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_cnt(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + refr_obj(draw_ctx, child); + } + } + + /*If the object was visible on the clip area call the post draw events too*/ + if(should_draw) { + draw_ctx->clip_area = &clip_coords_for_obj; + + /*If all the children are redrawn make 'post draw' draw*/ + lv_event_send(obj, LV_EVENT_DRAW_POST_BEGIN, draw_ctx); + lv_event_send(obj, LV_EVENT_DRAW_POST, draw_ctx); + lv_event_send(obj, LV_EVENT_DRAW_POST_END, draw_ctx); + } + + draw_ctx->clip_area = clip_area_ori; +} + + +/** + * Invalidate an area on display to redraw it + * @param area_p pointer to area which should be invalidated (NULL: delete the invalidated areas) + * @param disp pointer to display where the area should be invalidated (NULL can be used if there is + * only one display) + */ +void _lv_inv_area(lv_disp_t * disp, const lv_area_t * area_p) +{ + if(!disp) disp = lv_disp_get_default(); + if(!disp) return; + if(!lv_disp_is_invalidation_enabled(disp)) return; + + if(disp->rendering_in_progress) { + LV_LOG_ERROR("detected modifying dirty areas in render"); + return; + } + + /*Clear the invalidate buffer if the parameter is NULL*/ + if(area_p == NULL) { + disp->inv_p = 0; + return; + } + + lv_area_t scr_area; + scr_area.x1 = 0; + scr_area.y1 = 0; + scr_area.x2 = lv_disp_get_hor_res(disp) - 1; + scr_area.y2 = lv_disp_get_ver_res(disp) - 1; + + lv_area_t com_area; + bool suc; + + suc = _lv_area_intersect(&com_area, area_p, &scr_area); + if(suc == false) return; /*Out of the screen*/ + + /*If there were at least 1 invalid area in full refresh mode, redraw the whole screen*/ + if(disp->driver->full_refresh) { + disp->inv_areas[0] = scr_area; + disp->inv_p = 1; + if(disp->refr_timer) lv_timer_resume(disp->refr_timer); + return; + } + + if(disp->driver->rounder_cb) disp->driver->rounder_cb(disp->driver, &com_area); + + /*Save only if this area is not in one of the saved areas*/ + uint16_t i; + for(i = 0; i < disp->inv_p; i++) { + if(_lv_area_is_in(&com_area, &disp->inv_areas[i], 0) != false) return; + } + + /*Save the area*/ + if(disp->inv_p < LV_INV_BUF_SIZE) { + lv_area_copy(&disp->inv_areas[disp->inv_p], &com_area); + } + else { /*If no place for the area add the screen*/ + disp->inv_p = 0; + lv_area_copy(&disp->inv_areas[disp->inv_p], &scr_area); + } + disp->inv_p++; + if(disp->refr_timer) lv_timer_resume(disp->refr_timer); +} + +/** + * Get the display which is being refreshed + * @return the display being refreshed + */ +lv_disp_t * _lv_refr_get_disp_refreshing(void) +{ + return disp_refr; +} + +/** + * Set the display which is being refreshed. + * It shouldn't be used directly by the user. + * It can be used to trick the drawing functions about there is an active display. + * @param the display being refreshed + */ +void _lv_refr_set_disp_refreshing(lv_disp_t * disp) +{ + disp_refr = disp; +} + +/** + * Called periodically to handle the refreshing + * @param tmr pointer to the timer itself + */ +void _lv_disp_refr_timer(lv_timer_t * tmr) +{ + REFR_TRACE("begin"); + + uint32_t start = lv_tick_get(); + volatile uint32_t elaps = 0; + + if(tmr) { + disp_refr = tmr->user_data; +#if LV_USE_PERF_MONITOR == 0 && LV_USE_MEM_MONITOR == 0 + /** + * Ensure the timer does not run again automatically. + * This is done before refreshing in case refreshing invalidates something else. + */ + lv_timer_pause(tmr); +#endif + } + else { + disp_refr = lv_disp_get_default(); + } + + /*Refresh the screen's layout if required*/ + lv_obj_update_layout(disp_refr->act_scr); + if(disp_refr->prev_scr) lv_obj_update_layout(disp_refr->prev_scr); + + lv_obj_update_layout(disp_refr->top_layer); + lv_obj_update_layout(disp_refr->sys_layer); + + /*Do nothing if there is no active screen*/ + if(disp_refr->act_scr == NULL) { + disp_refr->inv_p = 0; + LV_LOG_WARN("there is no active screen"); + REFR_TRACE("finished"); + return; + } + + lv_refr_join_area(); + + refr_invalid_areas(); + + /*If refresh happened ...*/ + if(disp_refr->inv_p != 0) { + + /*Clean up*/ + lv_memset_00(disp_refr->inv_areas, sizeof(disp_refr->inv_areas)); + lv_memset_00(disp_refr->inv_area_joined, sizeof(disp_refr->inv_area_joined)); + disp_refr->inv_p = 0; + + elaps = lv_tick_elaps(start); + + /*Call monitor cb if present*/ + if(disp_refr->driver->monitor_cb) { + disp_refr->driver->monitor_cb(disp_refr->driver, elaps, px_num); + } + } + + lv_mem_buf_free_all(); + _lv_font_clean_up_fmt_txt(); + +#if LV_DRAW_COMPLEX + _lv_draw_mask_cleanup(); +#endif + +#if LV_USE_PERF_MONITOR && LV_USE_LABEL + lv_obj_t * perf_label = perf_monitor.perf_label; + if(perf_label == NULL) { + perf_label = lv_label_create(lv_layer_sys()); + lv_obj_set_style_bg_opa(perf_label, LV_OPA_50, 0); + lv_obj_set_style_bg_color(perf_label, lv_color_black(), 0); + lv_obj_set_style_text_color(perf_label, lv_color_white(), 0); + lv_obj_set_style_pad_top(perf_label, 3, 0); + lv_obj_set_style_pad_bottom(perf_label, 3, 0); + lv_obj_set_style_pad_left(perf_label, 3, 0); + lv_obj_set_style_pad_right(perf_label, 3, 0); + lv_obj_set_style_text_align(perf_label, LV_TEXT_ALIGN_RIGHT, 0); + lv_label_set_text(perf_label, "?"); + lv_obj_align(perf_label, LV_USE_PERF_MONITOR_POS, 0, 0); + perf_monitor.perf_label = perf_label; + } + + if(lv_tick_elaps(perf_monitor.perf_last_time) < 300) { + if(px_num > 5000) { + perf_monitor.elaps_sum += elaps; + perf_monitor.frame_cnt ++; + } + } + else { + perf_monitor.perf_last_time = lv_tick_get(); + uint32_t fps_limit; + uint32_t fps; + + if(disp_refr->refr_timer) { + fps_limit = 1000 / disp_refr->refr_timer->period; + } + else { + fps_limit = 1000 / LV_DISP_DEF_REFR_PERIOD; + } + + if(perf_monitor.elaps_sum == 0) { + perf_monitor.elaps_sum = 1; + } + if(perf_monitor.frame_cnt == 0) { + fps = fps_limit; + } + else { + fps = (1000 * perf_monitor.frame_cnt) / perf_monitor.elaps_sum; + } + perf_monitor.elaps_sum = 0; + perf_monitor.frame_cnt = 0; + if(fps > fps_limit) { + fps = fps_limit; + } + + perf_monitor.fps_sum_all += fps; + perf_monitor.fps_sum_cnt ++; + uint32_t cpu = 100 - lv_timer_get_idle(); + lv_label_set_text_fmt(perf_label, "%"LV_PRIu32" FPS\n%"LV_PRIu32"%% CPU", fps, cpu); + } +#endif + +#if LV_USE_MEM_MONITOR && LV_MEM_CUSTOM == 0 && LV_USE_LABEL + lv_obj_t * mem_label = mem_monitor.mem_label; + if(mem_label == NULL) { + mem_label = lv_label_create(lv_layer_sys()); + lv_obj_set_style_bg_opa(mem_label, LV_OPA_50, 0); + lv_obj_set_style_bg_color(mem_label, lv_color_black(), 0); + lv_obj_set_style_text_color(mem_label, lv_color_white(), 0); + lv_obj_set_style_pad_top(mem_label, 3, 0); + lv_obj_set_style_pad_bottom(mem_label, 3, 0); + lv_obj_set_style_pad_left(mem_label, 3, 0); + lv_obj_set_style_pad_right(mem_label, 3, 0); + lv_label_set_text(mem_label, "?"); + lv_obj_align(mem_label, LV_USE_MEM_MONITOR_POS, 0, 0); + mem_monitor.mem_label = mem_label; + } + + if(lv_tick_elaps(mem_monitor.mem_last_time) > 300) { + mem_monitor.mem_last_time = lv_tick_get(); + lv_mem_monitor_t mon; + lv_mem_monitor(&mon); + uint32_t used_size = mon.total_size - mon.free_size;; + uint32_t used_kb = used_size / 1024; + uint32_t used_kb_tenth = (used_size - (used_kb * 1024)) / 102; + lv_label_set_text_fmt(mem_label, + "%"LV_PRIu32 ".%"LV_PRIu32 " kB used (%d %%)\n" + "%d%% frag.", + used_kb, used_kb_tenth, mon.used_pct, + mon.frag_pct); + } +#endif + + REFR_TRACE("finished"); +} + +#if LV_USE_PERF_MONITOR +void lv_refr_reset_fps_counter(void) +{ + perf_monitor.fps_sum_all = 0; + perf_monitor.fps_sum_cnt = 0; +} + +uint32_t lv_refr_get_fps_avg(void) +{ + if(perf_monitor.fps_sum_cnt == 0) { + return 0; + } + return perf_monitor.fps_sum_all / perf_monitor.fps_sum_cnt; +} +#endif + + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Join the areas which has got common parts + */ +static void lv_refr_join_area(void) +{ + uint32_t join_from; + uint32_t join_in; + lv_area_t joined_area; + for(join_in = 0; join_in < disp_refr->inv_p; join_in++) { + if(disp_refr->inv_area_joined[join_in] != 0) continue; + + /*Check all areas to join them in 'join_in'*/ + for(join_from = 0; join_from < disp_refr->inv_p; join_from++) { + /*Handle only unjoined areas and ignore itself*/ + if(disp_refr->inv_area_joined[join_from] != 0 || join_in == join_from) { + continue; + } + + /*Check if the areas are on each other*/ + if(_lv_area_is_on(&disp_refr->inv_areas[join_in], &disp_refr->inv_areas[join_from]) == false) { + continue; + } + + _lv_area_join(&joined_area, &disp_refr->inv_areas[join_in], &disp_refr->inv_areas[join_from]); + + /*Join two area only if the joined area size is smaller*/ + if(lv_area_get_size(&joined_area) < (lv_area_get_size(&disp_refr->inv_areas[join_in]) + + lv_area_get_size(&disp_refr->inv_areas[join_from]))) { + lv_area_copy(&disp_refr->inv_areas[join_in], &joined_area); + + /*Mark 'join_form' is joined into 'join_in'*/ + disp_refr->inv_area_joined[join_from] = 1; + } + } + } +} + +/** + * Refresh the joined areas + */ +static void refr_invalid_areas(void) +{ + px_num = 0; + + if(disp_refr->inv_p == 0) return; + + /*Find the last area which will be drawn*/ + int32_t i; + int32_t last_i = 0; + for(i = disp_refr->inv_p - 1; i >= 0; i--) { + if(disp_refr->inv_area_joined[i] == 0) { + last_i = i; + break; + } + } + + /*Notify the display driven rendering has started*/ + if(disp_refr->driver->render_start_cb) { + disp_refr->driver->render_start_cb(disp_refr->driver); + } + + disp_refr->driver->draw_buf->last_area = 0; + disp_refr->driver->draw_buf->last_part = 0; + disp_refr->rendering_in_progress = true; + + for(i = 0; i < disp_refr->inv_p; i++) { + /*Refresh the unjoined areas*/ + if(disp_refr->inv_area_joined[i] == 0) { + + if(i == last_i) disp_refr->driver->draw_buf->last_area = 1; + disp_refr->driver->draw_buf->last_part = 0; + refr_area(&disp_refr->inv_areas[i]); + + px_num += lv_area_get_size(&disp_refr->inv_areas[i]); + } + } + + disp_refr->rendering_in_progress = false; +} + +/** + * Refresh an area if there is Virtual Display Buffer + * @param area_p pointer to an area to refresh + */ +static void refr_area(const lv_area_t * area_p) +{ + lv_draw_ctx_t * draw_ctx = disp_refr->driver->draw_ctx; + draw_ctx->buf = disp_refr->driver->draw_buf->buf_act; + + /*With full refresh just redraw directly into the buffer*/ + /*In direct mode draw directly on the absolute coordinates of the buffer*/ + if(disp_refr->driver->full_refresh || disp_refr->driver->direct_mode) { + lv_area_t disp_area; + lv_area_set(&disp_area, 0, 0, lv_disp_get_hor_res(disp_refr) - 1, lv_disp_get_ver_res(disp_refr) - 1); + draw_ctx->buf_area = &disp_area; + + if(disp_refr->driver->full_refresh) { + disp_refr->driver->draw_buf->last_part = 1; + draw_ctx->clip_area = &disp_area; + refr_area_part(draw_ctx); + } + else { + disp_refr->driver->draw_buf->last_part = disp_refr->driver->draw_buf->last_area; + draw_ctx->clip_area = area_p; + refr_area_part(draw_ctx); + } + return; + } + + /*Normal refresh: draw the area in parts*/ + /*Calculate the max row num*/ + lv_coord_t w = lv_area_get_width(area_p); + lv_coord_t h = lv_area_get_height(area_p); + lv_coord_t y2 = area_p->y2 >= lv_disp_get_ver_res(disp_refr) ? + lv_disp_get_ver_res(disp_refr) - 1 : area_p->y2; + + int32_t max_row = get_max_row(disp_refr, w, h); + + lv_coord_t row; + lv_coord_t row_last = 0; + lv_area_t sub_area; + for(row = area_p->y1; row + max_row - 1 <= y2; row += max_row) { + /*Calc. the next y coordinates of draw_buf*/ + sub_area.x1 = area_p->x1; + sub_area.x2 = area_p->x2; + sub_area.y1 = row; + sub_area.y2 = row + max_row - 1; + draw_ctx->buf_area = &sub_area; + draw_ctx->clip_area = &sub_area; + draw_ctx->buf = disp_refr->driver->draw_buf->buf_act; + if(sub_area.y2 > y2) sub_area.y2 = y2; + row_last = sub_area.y2; + if(y2 == row_last) disp_refr->driver->draw_buf->last_part = 1; + refr_area_part(draw_ctx); + } + + /*If the last y coordinates are not handled yet ...*/ + if(y2 != row_last) { + /*Calc. the next y coordinates of draw_buf*/ + sub_area.x1 = area_p->x1; + sub_area.x2 = area_p->x2; + sub_area.y1 = row; + sub_area.y2 = y2; + draw_ctx->buf_area = &sub_area; + draw_ctx->clip_area = &sub_area; + draw_ctx->buf = disp_refr->driver->draw_buf->buf_act; + disp_refr->driver->draw_buf->last_part = 1; + refr_area_part(draw_ctx); + } +} + +static void refr_area_part(lv_draw_ctx_t * draw_ctx) +{ + lv_disp_draw_buf_t * draw_buf = lv_disp_get_draw_buf(disp_refr); + + /* Below the `area_p` area will be redrawn into the draw buffer. + * In single buffered mode wait here until the buffer is freed. + * In full double buffered mode wait here while the buffers are swapped and a buffer becomes available*/ + bool full_sized = draw_buf->size == (uint32_t)disp_refr->driver->hor_res * disp_refr->driver->ver_res; + if((draw_buf->buf1 && !draw_buf->buf2) || + (draw_buf->buf1 && draw_buf->buf2 && full_sized)) { + while(draw_buf->flushing) { + if(disp_refr->driver->wait_cb) disp_refr->driver->wait_cb(disp_refr->driver); + } + + /*If the screen is transparent initialize it when the flushing is ready*/ +#if LV_COLOR_SCREEN_TRANSP + if(disp_refr->driver->screen_transp) { + if(disp_refr->driver->clear_cb) { + disp_refr->driver->clear_cb(disp_refr->driver, disp_refr->driver->draw_buf->buf_act, disp_refr->driver->draw_buf->size); + } + else { + lv_memset_00(disp_refr->driver->draw_buf->buf_act, disp_refr->driver->draw_buf->size * LV_IMG_PX_SIZE_ALPHA_BYTE); + } + } +#endif + } + + lv_obj_t * top_act_scr = NULL; + lv_obj_t * top_prev_scr = NULL; + + /*Get the most top object which is not covered by others*/ + top_act_scr = lv_refr_get_top_obj(draw_ctx->buf_area, lv_disp_get_scr_act(disp_refr)); + if(disp_refr->prev_scr) { + top_prev_scr = lv_refr_get_top_obj(draw_ctx->buf_area, disp_refr->prev_scr); + } + + /*Draw a display background if there is no top object*/ + if(top_act_scr == NULL && top_prev_scr == NULL) { + lv_area_t a; + lv_area_set(&a, 0, 0, + lv_disp_get_hor_res(disp_refr) - 1, lv_disp_get_ver_res(disp_refr) - 1); + if(draw_ctx->draw_bg) { + lv_draw_rect_dsc_t dsc; + lv_draw_rect_dsc_init(&dsc); + dsc.bg_img_src = disp_refr->bg_img; + dsc.bg_img_opa = disp_refr->bg_opa; + dsc.bg_color = disp_refr->bg_color; + dsc.bg_opa = disp_refr->bg_opa; + draw_ctx->draw_bg(draw_ctx, &dsc, &a); + } + else if(disp_refr->bg_img) { + lv_img_header_t header; + lv_res_t res = lv_img_decoder_get_info(disp_refr->bg_img, &header); + if(res == LV_RES_OK) { + lv_draw_img_dsc_t dsc; + lv_draw_img_dsc_init(&dsc); + dsc.opa = disp_refr->bg_opa; + lv_draw_img(draw_ctx, &dsc, &a, disp_refr->bg_img); + } + else { + LV_LOG_WARN("Can't draw the background image"); + } + } + else { + lv_draw_rect_dsc_t dsc; + lv_draw_rect_dsc_init(&dsc); + dsc.bg_color = disp_refr->bg_color; + dsc.bg_opa = disp_refr->bg_opa; + lv_draw_rect(draw_ctx, &dsc, draw_ctx->buf_area); + } + } + + if(disp_refr->draw_prev_over_act) { + if(top_act_scr == NULL) top_act_scr = disp_refr->act_scr; + refr_obj_and_children(draw_ctx, top_act_scr); + + /*Refresh the previous screen if any*/ + if(disp_refr->prev_scr) { + if(top_prev_scr == NULL) top_prev_scr = disp_refr->prev_scr; + refr_obj_and_children(draw_ctx, top_prev_scr); + } + } + else { + /*Refresh the previous screen if any*/ + if(disp_refr->prev_scr) { + if(top_prev_scr == NULL) top_prev_scr = disp_refr->prev_scr; + refr_obj_and_children(draw_ctx, top_prev_scr); + } + + if(top_act_scr == NULL) top_act_scr = disp_refr->act_scr; + refr_obj_and_children(draw_ctx, top_act_scr); + } + + /*Also refresh top and sys layer unconditionally*/ + refr_obj_and_children(draw_ctx, lv_disp_get_layer_top(disp_refr)); + refr_obj_and_children(draw_ctx, lv_disp_get_layer_sys(disp_refr)); + + draw_buf_flush(disp_refr); +} + +/** + * Search the most top object which fully covers an area + * @param area_p pointer to an area + * @param obj the first object to start the searching (typically a screen) + * @return + */ +static lv_obj_t * lv_refr_get_top_obj(const lv_area_t * area_p, lv_obj_t * obj) +{ + lv_obj_t * found_p = NULL; + + if(_lv_area_is_in(area_p, &obj->coords, 0) == false) return NULL; + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return NULL; + if(_lv_obj_get_layer_type(obj) != LV_LAYER_TYPE_NONE) return NULL; + + /*If this object is fully cover the draw area then check the children too*/ + lv_cover_check_info_t info; + info.res = LV_COVER_RES_COVER; + info.area = area_p; + lv_event_send(obj, LV_EVENT_COVER_CHECK, &info); + if(info.res == LV_COVER_RES_MASKED) return NULL; + + int32_t i; + int32_t child_cnt = lv_obj_get_child_cnt(obj); + for(i = child_cnt - 1; i >= 0; i--) { + lv_obj_t * child = obj->spec_attr->children[i]; + found_p = lv_refr_get_top_obj(area_p, child); + + /*If a children is ok then break*/ + if(found_p != NULL) { + break; + } + } + + /*If no better children use this object*/ + if(found_p == NULL && info.res == LV_COVER_RES_COVER) { + found_p = obj; + } + + return found_p; +} + +/** + * Make the refreshing from an object. Draw all its children and the youngers too. + * @param top_p pointer to an objects. Start the drawing from it. + * @param mask_p pointer to an area, the objects will be drawn only here + */ +static void refr_obj_and_children(lv_draw_ctx_t * draw_ctx, lv_obj_t * top_obj) +{ + /*Normally always will be a top_obj (at least the screen) + *but in special cases (e.g. if the screen has alpha) it won't. + *In this case use the screen directly*/ + if(top_obj == NULL) top_obj = lv_disp_get_scr_act(disp_refr); + if(top_obj == NULL) return; /*Shouldn't happen*/ + + /*Refresh the top object and its children*/ + refr_obj(draw_ctx, top_obj); + + /*Draw the 'younger' sibling objects because they can be on top_obj*/ + lv_obj_t * parent; + lv_obj_t * border_p = top_obj; + + parent = lv_obj_get_parent(top_obj); + + /*Do until not reach the screen*/ + while(parent != NULL) { + bool go = false; + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_cnt(parent); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = parent->spec_attr->children[i]; + if(!go) { + if(child == border_p) go = true; + } + else { + /*Refresh the objects*/ + refr_obj(draw_ctx, child); + } + } + + /*Call the post draw draw function of the parents of the to object*/ + lv_event_send(parent, LV_EVENT_DRAW_POST_BEGIN, (void *)draw_ctx); + lv_event_send(parent, LV_EVENT_DRAW_POST, (void *)draw_ctx); + lv_event_send(parent, LV_EVENT_DRAW_POST_END, (void *)draw_ctx); + + /*The new border will be the last parents, + *so the 'younger' brothers of parent will be refreshed*/ + border_p = parent; + /*Go a level deeper*/ + parent = lv_obj_get_parent(parent); + } +} + + +static lv_res_t layer_get_area(lv_draw_ctx_t * draw_ctx, lv_obj_t * obj, lv_layer_type_t layer_type, + lv_area_t * layer_area_out) +{ + lv_coord_t ext_draw_size = _lv_obj_get_ext_draw_size(obj); + lv_area_t obj_coords_ext; + lv_obj_get_coords(obj, &obj_coords_ext); + lv_area_increase(&obj_coords_ext, ext_draw_size, ext_draw_size); + + if(layer_type == LV_LAYER_TYPE_TRANSFORM) { + /*Get the transformed area and clip it to the current clip area. + *This area needs to be updated on the screen.*/ + lv_area_t clip_coords_for_obj; + lv_area_t tranf_coords = obj_coords_ext; + lv_obj_get_transformed_area(obj, &tranf_coords, false, false); + if(!_lv_area_intersect(&clip_coords_for_obj, draw_ctx->clip_area, &tranf_coords)) { + return LV_RES_INV; + } + + /*Transform back (inverse) the transformed area. + *It will tell which area of the non-transformed widget needs to be redrawn + *in order to cover transformed area after transformation.*/ + lv_area_t inverse_clip_coords_for_obj = clip_coords_for_obj; + lv_obj_get_transformed_area(obj, &inverse_clip_coords_for_obj, false, true); + if(!_lv_area_intersect(&inverse_clip_coords_for_obj, &inverse_clip_coords_for_obj, &obj_coords_ext)) { + return LV_RES_INV; + } + + *layer_area_out = inverse_clip_coords_for_obj; + } + else if(layer_type == LV_LAYER_TYPE_SIMPLE) { + lv_area_t clip_coords_for_obj; + if(!_lv_area_intersect(&clip_coords_for_obj, draw_ctx->clip_area, &obj_coords_ext)) { + return LV_RES_INV; + } + *layer_area_out = clip_coords_for_obj; + } + else { + LV_LOG_WARN("Unhandled intermediate layer type"); + return LV_RES_INV; + } + + return LV_RES_OK; +} + +static void layer_alpha_test(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx, + lv_draw_layer_flags_t flags) +{ + bool has_alpha; + /*If globally the layer has alpha maybe this smaller section has not (e.g. not on a rounded corner) + *If turns out that this section has no alpha renderer can choose faster algorithms*/ + if(flags & LV_DRAW_LAYER_FLAG_HAS_ALPHA) { + /*Test for alpha by assuming there is no alpha. If it fails, fall back to rendering with alpha*/ + has_alpha = true; + if(_lv_area_is_in(&layer_ctx->area_act, &obj->coords, 0)) { + lv_cover_check_info_t info; + info.res = LV_COVER_RES_COVER; + info.area = &layer_ctx->area_act; + lv_event_send(obj, LV_EVENT_COVER_CHECK, &info); + if(info.res == LV_COVER_RES_COVER) has_alpha = false; + } + + if(has_alpha) { + layer_ctx->area_act.y2 = layer_ctx->area_act.y1 + layer_ctx->max_row_with_alpha - 1; + } + } + else { + has_alpha = false; + } + + if(layer_ctx->area_act.y2 > layer_ctx->area_full.y2) layer_ctx->area_act.y2 = layer_ctx->area_full.y2; + lv_draw_layer_adjust(draw_ctx, layer_ctx, has_alpha ? LV_DRAW_LAYER_FLAG_HAS_ALPHA : LV_DRAW_LAYER_FLAG_NONE); +} + + +void refr_obj(lv_draw_ctx_t * draw_ctx, lv_obj_t * obj) +{ + /*Do not refresh hidden objects*/ + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return; + lv_layer_type_t layer_type = _lv_obj_get_layer_type(obj); + if(layer_type == LV_LAYER_TYPE_NONE) { + lv_obj_redraw(draw_ctx, obj); + } + else { + lv_opa_t opa = lv_obj_get_style_opa(obj, 0); + if(opa < LV_OPA_MIN) return; + + lv_area_t layer_area_full; + lv_res_t res = layer_get_area(draw_ctx, obj, layer_type, &layer_area_full); + if(res != LV_RES_OK) return; + + lv_draw_layer_flags_t flags = LV_DRAW_LAYER_FLAG_HAS_ALPHA; + + if(_lv_area_is_in(&layer_area_full, &obj->coords, 0)) { + lv_cover_check_info_t info; + info.res = LV_COVER_RES_COVER; + info.area = &layer_area_full; + lv_event_send(obj, LV_EVENT_COVER_CHECK, &info); + if(info.res == LV_COVER_RES_COVER) flags &= ~LV_DRAW_LAYER_FLAG_HAS_ALPHA; + } + + if(layer_type == LV_LAYER_TYPE_SIMPLE) flags |= LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE; + + lv_draw_layer_ctx_t * layer_ctx = lv_draw_layer_create(draw_ctx, &layer_area_full, flags); + if(layer_ctx == NULL) { + LV_LOG_WARN("Couldn't create a new layer context"); + return; + } + lv_point_t pivot = { + .x = lv_obj_get_style_transform_pivot_x(obj, 0), + .y = lv_obj_get_style_transform_pivot_y(obj, 0) + }; + + lv_draw_img_dsc_t draw_dsc; + lv_draw_img_dsc_init(&draw_dsc); + draw_dsc.opa = opa; + draw_dsc.angle = lv_obj_get_style_transform_angle(obj, 0); + if(draw_dsc.angle > 3600) draw_dsc.angle -= 3600; + else if(draw_dsc.angle < 0) draw_dsc.angle += 3600; + + draw_dsc.zoom = lv_obj_get_style_transform_zoom(obj, 0); + draw_dsc.blend_mode = lv_obj_get_style_blend_mode(obj, 0); + draw_dsc.antialias = disp_refr->driver->antialiasing; + + if(flags & LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE) { + layer_ctx->area_act = layer_ctx->area_full; + layer_ctx->area_act.y2 = layer_ctx->area_act.y1 + layer_ctx->max_row_with_no_alpha - 1; + if(layer_ctx->area_act.y2 > layer_ctx->area_full.y2) layer_ctx->area_act.y2 = layer_ctx->area_full.y2; + } + + while(layer_ctx->area_act.y1 <= layer_area_full.y2) { + if(flags & LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE) { + layer_alpha_test(obj, draw_ctx, layer_ctx, flags); + } + + lv_obj_redraw(draw_ctx, obj); + + draw_dsc.pivot.x = obj->coords.x1 + pivot.x - draw_ctx->buf_area->x1; + draw_dsc.pivot.y = obj->coords.y1 + pivot.y - draw_ctx->buf_area->y1; + + /*With LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE it should also go the next chunk*/ + lv_draw_layer_blend(draw_ctx, layer_ctx, &draw_dsc); + + if((flags & LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE) == 0) break; + + layer_ctx->area_act.y1 = layer_ctx->area_act.y2 + 1; + layer_ctx->area_act.y2 = layer_ctx->area_act.y1 + layer_ctx->max_row_with_no_alpha - 1; + } + + lv_draw_layer_destroy(draw_ctx, layer_ctx); + } +} + + +static uint32_t get_max_row(lv_disp_t * disp, lv_coord_t area_w, lv_coord_t area_h) +{ + int32_t max_row = (uint32_t)disp->driver->draw_buf->size / area_w; + + if(max_row > area_h) max_row = area_h; + + /*Round down the lines of draw_buf if rounding is added*/ + if(disp_refr->driver->rounder_cb) { + lv_area_t tmp; + tmp.x1 = 0; + tmp.x2 = 0; + tmp.y1 = 0; + + lv_coord_t h_tmp = max_row; + do { + tmp.y2 = h_tmp - 1; + disp_refr->driver->rounder_cb(disp_refr->driver, &tmp); + + /*If this height fits into `max_row` then fine*/ + if(lv_area_get_height(&tmp) <= max_row) break; + + /*Decrement the height of the area until it fits into `max_row` after rounding*/ + h_tmp--; + } while(h_tmp > 0); + + if(h_tmp <= 0) { + LV_LOG_WARN("Can't set draw_buf height using the round function. (Wrong round_cb or to " + "small draw_buf)"); + return 0; + } + else { + max_row = tmp.y2 + 1; + } + } + + return max_row; +} + +static void draw_buf_rotate_180(lv_disp_drv_t * drv, lv_area_t * area, lv_color_t * color_p) +{ + lv_coord_t area_w = lv_area_get_width(area); + lv_coord_t area_h = lv_area_get_height(area); + uint32_t total = area_w * area_h; + /*Swap the beginning and end values*/ + lv_color_t tmp; + uint32_t i = total - 1, j = 0; + while(i > j) { + tmp = color_p[i]; + color_p[i] = color_p[j]; + color_p[j] = tmp; + i--; + j++; + } + lv_coord_t tmp_coord; + tmp_coord = area->y2; + area->y2 = drv->ver_res - area->y1 - 1; + area->y1 = drv->ver_res - tmp_coord - 1; + tmp_coord = area->x2; + area->x2 = drv->hor_res - area->x1 - 1; + area->x1 = drv->hor_res - tmp_coord - 1; +} + +static LV_ATTRIBUTE_FAST_MEM void draw_buf_rotate_90(bool invert_i, lv_coord_t area_w, lv_coord_t area_h, + lv_color_t * orig_color_p, lv_color_t * rot_buf) +{ + + uint32_t invert = (area_w * area_h) - 1; + uint32_t initial_i = ((area_w - 1) * area_h); + for(lv_coord_t y = 0; y < area_h; y++) { + uint32_t i = initial_i + y; + if(invert_i) + i = invert - i; + for(lv_coord_t x = 0; x < area_w; x++) { + rot_buf[i] = *(orig_color_p++); + if(invert_i) + i += area_h; + else + i -= area_h; + } + } +} + +/** + * Helper function for draw_buf_rotate_90_sqr. Given a list of four numbers, rotate the entire list to the left. + */ +static inline void draw_buf_rotate4(lv_color_t * a, lv_color_t * b, lv_color_t * c, lv_color_t * d) +{ + lv_color_t tmp; + tmp = *a; + *a = *b; + *b = *c; + *c = *d; + *d = tmp; +} + +/** + * Rotate a square image 90/270 degrees in place. + * @note inspired by https://stackoverflow.com/a/43694906 + */ +static void draw_buf_rotate_90_sqr(bool is_270, lv_coord_t w, lv_color_t * color_p) +{ + for(lv_coord_t i = 0; i < w / 2; i++) { + for(lv_coord_t j = 0; j < (w + 1) / 2; j++) { + lv_coord_t inv_i = (w - 1) - i; + lv_coord_t inv_j = (w - 1) - j; + if(is_270) { + draw_buf_rotate4( + &color_p[i * w + j], + &color_p[inv_j * w + i], + &color_p[inv_i * w + inv_j], + &color_p[j * w + inv_i] + ); + } + else { + draw_buf_rotate4( + &color_p[i * w + j], + &color_p[j * w + inv_i], + &color_p[inv_i * w + inv_j], + &color_p[inv_j * w + i] + ); + } + + } + } +} + +/** + * Rotate the draw_buf to the display's native orientation. + */ +static void draw_buf_rotate(lv_area_t * area, lv_color_t * color_p) +{ + lv_disp_drv_t * drv = disp_refr->driver; + if(disp_refr->driver->full_refresh && drv->sw_rotate) { + LV_LOG_ERROR("cannot rotate a full refreshed display!"); + return; + } + if(drv->rotated == LV_DISP_ROT_180) { + draw_buf_rotate_180(drv, area, color_p); + call_flush_cb(drv, area, color_p); + } + else if(drv->rotated == LV_DISP_ROT_90 || drv->rotated == LV_DISP_ROT_270) { + /*Allocate a temporary buffer to store rotated image*/ + lv_color_t * rot_buf = NULL; + lv_disp_draw_buf_t * draw_buf = lv_disp_get_draw_buf(disp_refr); + lv_coord_t area_w = lv_area_get_width(area); + lv_coord_t area_h = lv_area_get_height(area); + /*Determine the maximum number of rows that can be rotated at a time*/ + lv_coord_t max_row = LV_MIN((lv_coord_t)((LV_DISP_ROT_MAX_BUF / sizeof(lv_color_t)) / area_w), area_h); + lv_coord_t init_y_off; + init_y_off = area->y1; + if(drv->rotated == LV_DISP_ROT_90) { + area->y2 = drv->ver_res - area->x1 - 1; + area->y1 = area->y2 - area_w + 1; + } + else { + area->y1 = area->x1; + area->y2 = area->y1 + area_w - 1; + } + + /*Rotate the screen in chunks, flushing after each one*/ + lv_coord_t row = 0; + while(row < area_h) { + lv_coord_t height = LV_MIN(max_row, area_h - row); + draw_buf->flushing = 1; + if((row == 0) && (area_h >= area_w)) { + /*Rotate the initial area as a square*/ + height = area_w; + draw_buf_rotate_90_sqr(drv->rotated == LV_DISP_ROT_270, area_w, color_p); + if(drv->rotated == LV_DISP_ROT_90) { + area->x1 = init_y_off; + area->x2 = init_y_off + area_w - 1; + } + else { + area->x2 = drv->hor_res - 1 - init_y_off; + area->x1 = area->x2 - area_w + 1; + } + } + else { + /*Rotate other areas using a maximum buffer size*/ + if(rot_buf == NULL) rot_buf = lv_mem_buf_get(LV_DISP_ROT_MAX_BUF); + draw_buf_rotate_90(drv->rotated == LV_DISP_ROT_270, area_w, height, color_p, rot_buf); + + if(drv->rotated == LV_DISP_ROT_90) { + area->x1 = init_y_off + row; + area->x2 = init_y_off + row + height - 1; + } + else { + area->x2 = drv->hor_res - 1 - init_y_off - row; + area->x1 = area->x2 - height + 1; + } + } + + /* The original part (chunk of the current area) were split into more parts here. + * Set the original last_part flag on the last part of rotation. */ + if(row + height >= area_h && draw_buf->last_area && draw_buf->last_part) { + draw_buf->flushing_last = 1; + } + else { + draw_buf->flushing_last = 0; + } + + /*Flush the completed area to the display*/ + call_flush_cb(drv, area, rot_buf == NULL ? color_p : rot_buf); + /*FIXME: Rotation forces legacy behavior where rendering and flushing are done serially*/ + while(draw_buf->flushing) { + if(drv->wait_cb) drv->wait_cb(drv); + } + color_p += area_w * height; + row += height; + } + /*Free the allocated buffer at the end if necessary*/ + if(rot_buf != NULL) lv_mem_buf_release(rot_buf); + } +} + +/** + * Flush the content of the draw buffer + */ +static void draw_buf_flush(lv_disp_t * disp) +{ + lv_disp_draw_buf_t * draw_buf = lv_disp_get_draw_buf(disp_refr); + + /*Flush the rendered content to the display*/ + lv_draw_ctx_t * draw_ctx = disp->driver->draw_ctx; + if(draw_ctx->wait_for_finish) draw_ctx->wait_for_finish(draw_ctx); + + /* In partial double buffered mode wait until the other buffer is freed + * and driver is ready to receive the new buffer */ + bool full_sized = draw_buf->size == (uint32_t)disp_refr->driver->hor_res * disp_refr->driver->ver_res; + if(draw_buf->buf1 && draw_buf->buf2 && !full_sized) { + while(draw_buf->flushing) { + if(disp_refr->driver->wait_cb) disp_refr->driver->wait_cb(disp_refr->driver); + } + } + + draw_buf->flushing = 1; + + if(disp_refr->driver->draw_buf->last_area && disp_refr->driver->draw_buf->last_part) draw_buf->flushing_last = 1; + else draw_buf->flushing_last = 0; + + bool flushing_last = draw_buf->flushing_last; + + if(disp->driver->flush_cb) { + /*Rotate the buffer to the display's native orientation if necessary*/ + if(disp->driver->rotated != LV_DISP_ROT_NONE && disp->driver->sw_rotate) { + draw_buf_rotate(draw_ctx->buf_area, draw_ctx->buf); + } + else { + call_flush_cb(disp->driver, draw_ctx->buf_area, draw_ctx->buf); + } + } + + /*If there are 2 buffers swap them. With direct mode swap only on the last area*/ + if(draw_buf->buf1 && draw_buf->buf2 && (!disp->driver->direct_mode || flushing_last)) { + if(draw_buf->buf_act == draw_buf->buf1) + draw_buf->buf_act = draw_buf->buf2; + else + draw_buf->buf_act = draw_buf->buf1; + } +} + +static void call_flush_cb(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_p) +{ + REFR_TRACE("Calling flush_cb on (%d;%d)(%d;%d) area with %p image pointer", area->x1, area->y1, area->x2, area->y2, + (void *)color_p); + + lv_area_t offset_area = { + .x1 = area->x1 + drv->offset_x, + .y1 = area->y1 + drv->offset_y, + .x2 = area->x2 + drv->offset_x, + .y2 = area->y2 + drv->offset_y + }; + + drv->flush_cb(drv, &offset_area, color_p); +} + +#if LV_USE_PERF_MONITOR +static void perf_monitor_init(perf_monitor_t * _perf_monitor) +{ + LV_ASSERT_NULL(_perf_monitor); + _perf_monitor->elaps_sum = 0; + _perf_monitor->fps_sum_all = 0; + _perf_monitor->fps_sum_cnt = 0; + _perf_monitor->frame_cnt = 0; + _perf_monitor->perf_last_time = 0; + _perf_monitor->perf_label = NULL; +} +#endif + +#if LV_USE_MEM_MONITOR +static void mem_monitor_init(mem_monitor_t * _mem_monitor) +{ + LV_ASSERT_NULL(_mem_monitor); + _mem_monitor->mem_last_time = 0; + _mem_monitor->mem_label = NULL; +} +#endif + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_refr.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_refr.h new file mode 100644 index 0000000..72e8d6c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_refr.h @@ -0,0 +1,115 @@ +/** + * @file lv_refr.h + * + */ + +#ifndef LV_REFR_H +#define LV_REFR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_obj.h" +#include + +/********************* + * DEFINES + *********************/ + +#define LV_REFR_TASK_PRIO LV_TASK_PRIO_MID + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Initialize the screen refresh subsystem + */ +void _lv_refr_init(void); + +/** + * Redraw the invalidated areas now. + * Normally the redrawing is periodically executed in `lv_timer_handler` but a long blocking process + * can prevent the call of `lv_timer_handler`. In this case if the GUI is updated in the process + * (e.g. progress bar) this function can be called when the screen should be updated. + * @param disp pointer to display to refresh. NULL to refresh all displays. + */ +void lv_refr_now(lv_disp_t * disp); + +/** + * Redrawn on object an all its children using the passed draw context + * @param draw pointer to an initialized draw context + * @param obj the start object from the redraw should start + */ +void lv_obj_redraw(lv_draw_ctx_t * draw_ctx, lv_obj_t * obj); + +/** + * Invalidate an area on display to redraw it + * @param area_p pointer to area which should be invalidated (NULL: delete the invalidated areas) + * @param disp pointer to display where the area should be invalidated (NULL can be used if there is + * only one display) + */ +void _lv_inv_area(lv_disp_t * disp, const lv_area_t * area_p); + +/** + * Get the display which is being refreshed + * @return the display being refreshed + */ +lv_disp_t * _lv_refr_get_disp_refreshing(void); + +/** + * Set the display which is being refreshed. + * It shouldn't be used directly by the user. + * It can be used to trick the drawing functions about there is an active display. + * @param the display being refreshed + */ +void _lv_refr_set_disp_refreshing(lv_disp_t * disp); + +#if LV_USE_PERF_MONITOR +/** + * Reset FPS counter + */ +void lv_refr_reset_fps_counter(void); + +/** + * Get the average FPS + * @return the average FPS + */ +uint32_t lv_refr_get_fps_avg(void); +#endif + +/** + * Called periodically to handle the refreshing + * @param timer pointer to the timer itself + */ +void _lv_disp_refr_timer(lv_timer_t * timer); + +/********************** + * STATIC FUNCTIONS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_REFR_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_theme.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_theme.c new file mode 100644 index 0000000..b46cdcc --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_theme.c @@ -0,0 +1,118 @@ +/** + * @file lv_theme.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lvgl.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void apply_theme(lv_theme_t * th, lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_theme_t * lv_theme_get_from_obj(lv_obj_t * obj) +{ + lv_disp_t * disp = obj ? lv_obj_get_disp(obj) : lv_disp_get_default(); + return lv_disp_get_theme(disp); +} + +/** + * Apply the active theme on an object + * @param obj pointer to an object + * @param name the name of the theme element to apply. E.g. `LV_THEME_BTN` + */ +void lv_theme_apply(lv_obj_t * obj) +{ + lv_theme_t * th = lv_theme_get_from_obj(obj); + if(th == NULL) return; + + lv_obj_remove_style_all(obj); + + apply_theme(th, obj); /*Apply the theme including the base theme(s)*/ +} + +/** + * Set a base theme for a theme. + * The styles from the base them will be added before the styles of the current theme. + * Arbitrary long chain of themes can be created by setting base themes. + * @param new_theme pointer to theme which base should be set + * @param base pointer to the base theme + */ +void lv_theme_set_parent(lv_theme_t * new_theme, lv_theme_t * base) +{ + new_theme->parent = base; +} + +/** + * Set a callback for a theme. + * The callback is used to add styles to different objects + * @param theme pointer to theme which callback should be set + * @param cb pointer to the callback + */ +void lv_theme_set_apply_cb(lv_theme_t * theme, lv_theme_apply_cb_t apply_cb) +{ + theme->apply_cb = apply_cb; +} + +const lv_font_t * lv_theme_get_font_small(lv_obj_t * obj) +{ + lv_theme_t * th = lv_theme_get_from_obj(obj); + return th ? th->font_small : LV_FONT_DEFAULT; +} + +const lv_font_t * lv_theme_get_font_normal(lv_obj_t * obj) +{ + lv_theme_t * th = lv_theme_get_from_obj(obj); + return th ? th->font_normal : LV_FONT_DEFAULT; +} + +const lv_font_t * lv_theme_get_font_large(lv_obj_t * obj) +{ + lv_theme_t * th = lv_theme_get_from_obj(obj); + return th ? th->font_large : LV_FONT_DEFAULT; +} + +lv_color_t lv_theme_get_color_primary(lv_obj_t * obj) +{ + lv_theme_t * th = lv_theme_get_from_obj(obj); + return th ? th->color_primary : lv_palette_main(LV_PALETTE_BLUE_GREY); +} + +lv_color_t lv_theme_get_color_secondary(lv_obj_t * obj) +{ + lv_theme_t * th = lv_theme_get_from_obj(obj); + return th ? th->color_secondary : lv_palette_main(LV_PALETTE_BLUE); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void apply_theme(lv_theme_t * th, lv_obj_t * obj) +{ + if(th->parent) apply_theme(th->parent, obj); + if(th->apply_cb) th->apply_cb(th, obj); +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_theme.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_theme.h new file mode 100644 index 0000000..ef46336 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/core/lv_theme.h @@ -0,0 +1,120 @@ +/** + *@file lv_theme.h + * + */ + +#ifndef LV_THEME_H +#define LV_THEME_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_theme_t; +struct _lv_disp_t; + +typedef void (*lv_theme_apply_cb_t)(struct _lv_theme_t *, lv_obj_t *); + +typedef struct _lv_theme_t { + lv_theme_apply_cb_t apply_cb; + struct _lv_theme_t * parent; /**< Apply the current theme's style on top of this theme.*/ + void * user_data; + struct _lv_disp_t * disp; + lv_color_t color_primary; + lv_color_t color_secondary; + const lv_font_t * font_small; + const lv_font_t * font_normal; + const lv_font_t * font_large; + uint32_t flags; /*Any custom flag used by the theme*/ +} lv_theme_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Get the theme assigned to the display of the object + * @param obj pointer to a theme object + * @return the theme of the object's display (can be NULL) + */ +lv_theme_t * lv_theme_get_from_obj(lv_obj_t * obj); + +/** + * Apply the active theme on an object + * @param obj pointer to an object + */ +void lv_theme_apply(lv_obj_t * obj); + +/** + * Set a base theme for a theme. + * The styles from the base them will be added before the styles of the current theme. + * Arbitrary long chain of themes can be created by setting base themes. + * @param new_theme pointer to theme which base should be set + * @param parent pointer to the base theme + */ +void lv_theme_set_parent(lv_theme_t * new_theme, lv_theme_t * parent); + +/** + * Set an apply callback for a theme. + * The apply callback is used to add styles to different objects + * @param theme pointer to theme which callback should be set + * @param apply_cb pointer to the callback + */ +void lv_theme_set_apply_cb(lv_theme_t * theme, lv_theme_apply_cb_t apply_cb); + +/** + * Get the small font of the theme + * @param obj pointer to an object + * @return pointer to the font + */ +const lv_font_t * lv_theme_get_font_small(lv_obj_t * obj); +/** + * Get the normal font of the theme + * @param obj pointer to an object + * @return pointer to the font + */ +const lv_font_t * lv_theme_get_font_normal(lv_obj_t * obj); + +/** + * Get the subtitle font of the theme + * @param obj pointer to an object + * @return pointer to the font + */ +const lv_font_t * lv_theme_get_font_large(lv_obj_t * obj); + +/** + * Get the primary color of the theme + * @param obj pointer to an object + * @return the color + */ +lv_color_t lv_theme_get_color_primary(lv_obj_t * obj); + +/** + * Get the secondary color of the theme + * @param obj pointer to an object + * @return the color + */ +lv_color_t lv_theme_get_color_secondary(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_THEME_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/arm2d/lv_draw_arm2d.mk b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/arm2d/lv_draw_arm2d.mk new file mode 100644 index 0000000..17219b0 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/arm2d/lv_draw_arm2d.mk @@ -0,0 +1,6 @@ +CSRCS += lv_gpu_arm2d.c + +DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/arm2d +VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/arm2d + +CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/arm2d" diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/arm2d/lv_gpu_arm2d.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/arm2d/lv_gpu_arm2d.c new file mode 100644 index 0000000..7777fe2 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/arm2d/lv_gpu_arm2d.c @@ -0,0 +1,1376 @@ +/** + * @file lv_gpu_arm2d.c + * + */ + +/********************* + * INCLUDES + *********************/ +#if defined(__clang__) + #pragma clang diagnostic ignored "-Wunknown-warning-option" + #pragma clang diagnostic ignored "-Wreserved-identifier" + #pragma clang diagnostic ignored "-Wincompatible-pointer-types-discards-qualifiers" + #pragma clang diagnostic ignored "-Wmissing-variable-declarations" + #pragma clang diagnostic ignored "-Wcast-qual" + #pragma clang diagnostic ignored "-Wcast-align" + #pragma clang diagnostic ignored "-Wextra-semi-stmt" + #pragma clang diagnostic ignored "-Wsign-conversion" + #pragma clang diagnostic ignored "-Wunused-function" + #pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" + #pragma clang diagnostic ignored "-Wdouble-promotion" + #pragma clang diagnostic ignored "-Wunused-parameter" + #pragma clang diagnostic ignored "-Wimplicit-float-conversion" + #pragma clang diagnostic ignored "-Wimplicit-int-conversion" + #pragma clang diagnostic ignored "-Wtautological-pointer-compare" + #pragma clang diagnostic ignored "-Wsign-compare" + #pragma clang diagnostic ignored "-Wfloat-conversion" + #pragma clang diagnostic ignored "-Wmissing-prototypes" + #pragma clang diagnostic ignored "-Wpadded" + #pragma clang diagnostic ignored "-Wundef" + #pragma clang diagnostic ignored "-Wdeclaration-after-statement" + #pragma clang diagnostic ignored "-Wdisabled-macro-expansion" + #pragma clang diagnostic ignored "-Wunused-variable" + #pragma clang diagnostic ignored "-Wunused-but-set-variable" + #pragma clang diagnostic ignored "-Wint-conversion" +#endif + + +#include "lv_gpu_arm2d.h" +#include "../../core/lv_refr.h" + +#if LV_USE_GPU_ARM2D +#include "arm_2d.h" +#include "__arm_2d_impl.h" + + +#if defined(__IS_COMPILER_ARM_COMPILER_5__) + #pragma diag_suppress 174,177,188,68,513,144,1296 +#elif defined(__IS_COMPILER_IAR__) + #pragma diag_suppress=Pa093 +#elif defined(__IS_COMPILER_GCC__) + #pragma GCC diagnostic ignored "-Wdiscarded-qualifiers" +#endif + +/********************* + * DEFINES + *********************/ +#if ( !defined(__ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__) \ + || !__ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__) \ +&& LV_COLOR_DEPTH == 32 \ +&& !defined(__ARM_2D_LVGL_CFG_NO_WARNING__) +#warning Please set macro __ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__ to 1 to get more acceleration opportunities. Or you can define macro __ARM_2D_LVGL_CFG_NO_WARNING__ to suppress this warning. +#endif + +#define MAX_BUF_SIZE (uint32_t) lv_disp_get_hor_res(_lv_refr_get_disp_refreshing()) + +#if LV_COLOR_DEPTH == 16 +#define arm_2d_fill_colour arm_2d_rgb16_fill_colour +#define arm_2d_fill_colour_with_alpha arm_2d_rgb565_fill_colour_with_alpha +#define arm_2d_fill_colour_with_mask arm_2d_rgb565_fill_colour_with_mask +#define arm_2d_fill_colour_with_mask_and_opacity \ + arm_2d_rgb565_fill_colour_with_mask_and_opacity +#define arm_2d_tile_copy arm_2d_rgb16_tile_copy +#define arm_2d_alpha_blending arm_2d_rgb565_alpha_blending +#define arm_2d_tile_copy_with_src_mask arm_2d_rgb565_tile_copy_with_src_mask +#define arm_2d_color_t arm_2d_color_rgb565_t + +/* arm-2d direct mode apis */ +#define __arm_2d_impl_colour_filling __arm_2d_impl_rgb16_colour_filling +#define __arm_2d_impl_colour_filling_with_opacity \ + __arm_2d_impl_rgb565_colour_filling_with_opacity +#define __arm_2d_impl_colour_filling_mask \ + __arm_2d_impl_rgb565_colour_filling_mask +#define __arm_2d_impl_colour_filling_mask_opacity \ + __arm_2d_impl_rgb565_colour_filling_mask_opacity +#define __arm_2d_impl_copy __arm_2d_impl_rgb16_copy +#define __arm_2d_impl_alpha_blending __arm_2d_impl_rgb565_alpha_blending +#define __arm_2d_impl_src_msk_copy __arm_2d_impl_rgb565_src_msk_copy +#define __arm_2d_impl_src_chn_msk_copy __arm_2d_impl_rgb565_src_chn_msk_copy +#define __arm_2d_impl_cl_key_copy __arm_2d_impl_rgb16_cl_key_copy +#define __arm_2d_impl_alpha_blending_colour_keying \ + __arm_2d_impl_rgb565_alpha_blending_colour_keying +#define arm_2d_tile_transform_with_src_mask_and_opacity \ + arm_2d_rgb565_tile_transform_with_src_mask_and_opacity +#define arm_2d_tile_transform_with_opacity \ + arm_2d_rgb565_tile_transform_with_opacity + +#define __ARM_2D_PIXEL_BLENDING_OPA __ARM_2D_PIXEL_BLENDING_OPA_RGB565 + +#define color_int uint16_t + +#elif LV_COLOR_DEPTH == 32 +#define arm_2d_fill_colour arm_2d_rgb32_fill_colour +#define arm_2d_fill_colour_with_alpha arm_2d_cccn888_fill_colour_with_alpha +#define arm_2d_fill_colour_with_mask arm_2d_cccn888_fill_colour_with_mask +#define arm_2d_fill_colour_with_mask_and_opacity \ + arm_2d_cccn888_fill_colour_with_mask_and_opacity +#define arm_2d_tile_copy arm_2d_rgb32_tile_copy +#define arm_2d_alpha_blending arm_2d_cccn888_alpha_blending +#define arm_2d_tile_copy_with_src_mask arm_2d_cccn888_tile_copy_with_src_mask +#define arm_2d_color_t arm_2d_color_cccn888_t + +/* arm-2d direct mode apis */ +#define __arm_2d_impl_colour_filling __arm_2d_impl_rgb32_colour_filling +#define __arm_2d_impl_colour_filling_with_opacity \ + __arm_2d_impl_cccn888_colour_filling_with_opacity +#define __arm_2d_impl_colour_filling_mask \ + __arm_2d_impl_cccn888_colour_filling_mask +#define __arm_2d_impl_colour_filling_mask_opacity \ + __arm_2d_impl_cccn888_colour_filling_mask_opacity +#define __arm_2d_impl_copy __arm_2d_impl_rgb32_copy +#define __arm_2d_impl_alpha_blending __arm_2d_impl_cccn888_alpha_blending +#define __arm_2d_impl_src_msk_copy __arm_2d_impl_cccn888_src_msk_copy +#define __arm_2d_impl_src_chn_msk_copy __arm_2d_impl_cccn888_src_chn_msk_copy +#define __arm_2d_impl_cl_key_copy __arm_2d_impl_rgb32_cl_key_copy +#define __arm_2d_impl_alpha_blending_colour_keying \ + __arm_2d_impl_cccn888_alpha_blending_colour_keying +#define arm_2d_tile_transform_with_src_mask_and_opacity \ + arm_2d_cccn888_tile_transform_with_src_mask_and_opacity +#define arm_2d_tile_transform_with_opacity \ + arm_2d_cccn888_tile_transform_with_opacity + +#define __ARM_2D_PIXEL_BLENDING_OPA __ARM_2D_PIXEL_BLENDING_OPA_CCCN888 + +#define color_int uint32_t + +#else +#error The specified LV_COLOR_DEPTH is not supported by this version of lv_gpu_arm2d.c. +#endif + +/* *INDENT-OFF* */ +#define __PREPARE_LL_ACCELERATION__() \ + int32_t src_stride = lv_area_get_width(coords); \ + \ + uint8_t px_size_byte = cf == LV_IMG_CF_TRUE_COLOR_ALPHA \ + ? LV_IMG_PX_SIZE_ALPHA_BYTE \ + : sizeof(lv_color_t); \ + \ + const uint8_t * src_buf_tmp = src_buf; \ + src_buf_tmp += src_stride \ + * (draw_area.y1 - coords->y1) \ + * px_size_byte; \ + src_buf_tmp += (draw_area.x1 - coords->x1) * px_size_byte; \ + \ + lv_area_t blend_area2; \ + if(!_lv_area_intersect(&blend_area2, \ + &draw_area, \ + draw_ctx->clip_area)) return; \ + \ + int32_t w = lv_area_get_width(&blend_area2); \ + int32_t h = lv_area_get_height(&blend_area2); \ + \ + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); \ + \ + lv_color_t * dest_buf = draw_ctx->buf; \ + dest_buf += dest_stride * (blend_area2.y1 - draw_ctx->buf_area->y1) \ + + (blend_area2.x1 - draw_ctx->buf_area->x1); \ + \ + arm_2d_size_t copy_size = { \ + .iWidth = lv_area_get_width(&blend_area2), \ + .iHeight = lv_area_get_height(&blend_area2), \ + } + +#define __PREPARE_TARGET_TILE__(__blend_area) \ + static arm_2d_tile_t target_tile; \ + static arm_2d_region_t target_region; \ + \ + lv_color_t * dest_buf = draw_ctx->buf; \ + \ + target_tile = (arm_2d_tile_t) { \ + .tRegion = { \ + .tSize = { \ + .iWidth = lv_area_get_width(draw_ctx->buf_area), \ + .iHeight = lv_area_get_height(draw_ctx->buf_area), \ + }, \ + }, \ + .tInfo.bIsRoot = true, \ + .phwBuffer = (uint16_t *)draw_ctx->buf, \ + }; \ + \ + target_region = (arm_2d_region_t) { \ + .tLocation = { \ + .iX = (__blend_area).x1 - draw_ctx->buf_area->x1, \ + .iY = (__blend_area).y1 - draw_ctx->buf_area->y1, \ + }, \ + .tSize = { \ + .iWidth = lv_area_get_width(&(__blend_area)), \ + .iHeight = lv_area_get_height(&(__blend_area)), \ + }, \ + } + +#define __PREPARE_SOURCE_TILE__(__dsc, __blend_area) \ + static arm_2d_tile_t source_tile_orig; \ + static arm_2d_tile_t source_tile; \ + const lv_color_t * src_buf = (__dsc)->src_buf; \ + if (src_buf) { \ + source_tile_orig = (arm_2d_tile_t) { \ + .tRegion = { \ + .tSize = { \ + .iWidth = lv_area_get_width((__dsc)->blend_area), \ + .iHeight = lv_area_get_height((__dsc)->blend_area), \ + }, \ + }, \ + .tInfo.bIsRoot = true, \ + .phwBuffer = (uint16_t *)src_buf, \ + }; \ + \ + arm_2d_tile_generate_child( \ + &source_tile_orig, \ + (arm_2d_region_t []) { \ + { \ + .tLocation = { \ + .iX = (__blend_area).x1 - (__dsc)->blend_area->x1, \ + .iY = (__blend_area).y1 - (__dsc)->blend_area->y1, \ + }, \ + .tSize = source_tile_orig.tRegion.tSize, \ + } \ + }, \ + &source_tile, \ + false); \ + source_tile.tInfo.bDerivedResource = true; \ + } + +#define __PREPARE_MASK_TILE__(__dsc, __blend_area, __mask, __is_chn) \ + static arm_2d_tile_t mask_tile_orig; \ + static arm_2d_tile_t mask_tile; \ + if(NULL != (__mask)) { \ + mask_tile_orig = (arm_2d_tile_t) { \ + .tRegion = { \ + .tSize = { \ + .iWidth = lv_area_get_width((__dsc)->mask_area), \ + .iHeight = lv_area_get_height((__dsc)->mask_area), \ + }, \ + }, \ + .tInfo = { \ + .bIsRoot = true, \ + .bHasEnforcedColour = true, \ + .tColourInfo = { \ + .chScheme = (__is_chn) ? ARM_2D_CHANNEL_8in32 \ + : ARM_2D_COLOUR_8BIT, \ + }, \ + }, \ + .pchBuffer = ((uint8_t *)(__mask)) + (__is_chn) ? 3 : 0, \ + }; \ + \ + arm_2d_tile_generate_child( \ + &mask_tile_orig, \ + (arm_2d_region_t []) { \ + { \ + .tLocation = { \ + .iX = (__dsc)->mask_area->x1 - (__blend_area).x1, \ + .iY = (__dsc)->mask_area->y1 - (__blend_area).y1, \ + }, \ + .tSize = mask_tile_orig.tRegion.tSize, \ + } \ + }, \ + &mask_tile, \ + false); \ + mask_tile.tInfo.bDerivedResource = true; \ + } +/* *INDENT-ON* */ + +/* *INDENT-OFF* */ +#define __RECOLOUR_WRAPPER(...) \ + do { \ + lv_color_t *rgb_tmp_buf = NULL; \ + if(draw_dsc->recolor_opa > LV_OPA_MIN) { \ + rgb_tmp_buf \ + = lv_mem_buf_get(src_w * src_h * sizeof(lv_color_t)); \ + if (NULL == rgb_tmp_buf) { \ + LV_LOG_WARN( \ + "Failed to allocate memory for accelerating recolour, " \ + "use normal route instead."); \ + break; \ + } \ + lv_memcpy(rgb_tmp_buf, src_buf, src_w * src_h * sizeof(lv_color_t));\ + arm_2d_size_t copy_size = { \ + .iWidth = src_w, \ + .iHeight = src_h, \ + }; \ + /* apply re-colour */ \ + __arm_2d_impl_colour_filling_with_opacity( \ + (color_int *)rgb_tmp_buf, \ + src_w, \ + ©_size, \ + (color_int)draw_dsc->recolor.full, \ + draw_dsc->recolor_opa); \ + \ + /* replace src_buf for the following operation */ \ + src_buf = (const uint8_t *)rgb_tmp_buf; \ + } \ + __VA_ARGS__ \ + if (NULL != rgb_tmp_buf) { \ + lv_mem_buf_release(rgb_tmp_buf); \ + } \ + } while(0); +/* *INDENT-ON* */ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +#if __ARM_2D_HAS_HW_ACC__ +LV_ATTRIBUTE_FAST_MEM +static bool lv_draw_arm2d_fill_colour(const arm_2d_tile_t * target_tile, + const arm_2d_region_t * region, + lv_color_t color, + lv_opa_t opa, + const arm_2d_tile_t * mask_tile); + +LV_ATTRIBUTE_FAST_MEM +static bool lv_draw_arm2d_tile_copy(const arm_2d_tile_t * target_tile, + const arm_2d_region_t * region, + arm_2d_tile_t * source_tile, + lv_opa_t opa, + arm_2d_tile_t * mask_tile); +#else + +static void convert_cb(const lv_area_t * dest_area, + const void * src_buf, + lv_coord_t src_w, + lv_coord_t src_h, + lv_coord_t src_stride, + const lv_draw_img_dsc_t * draw_dsc, + lv_img_cf_t cf, + lv_color_t * cbuf, + lv_opa_t * abuf); + +LV_ATTRIBUTE_FAST_MEM +static bool arm_2d_fill_normal(lv_color_t * dest_buf, + const lv_area_t * dest_area, + lv_coord_t dest_stride, + lv_color_t color, + lv_opa_t opa, + const lv_opa_t * mask, + lv_coord_t mask_stride); + +LV_ATTRIBUTE_FAST_MEM +static bool arm_2d_copy_normal(lv_color_t * dest_buf, + const lv_area_t * dest_area, + lv_coord_t dest_stride, + const lv_color_t * src_buf, + lv_coord_t src_stride, + lv_opa_t opa, + const lv_opa_t * mask, + lv_coord_t mask_stride); +#endif + +LV_ATTRIBUTE_FAST_MEM +static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); +LV_ATTRIBUTE_FAST_MEM +static void lv_gpu_arm2d_wait_cb(lv_draw_ctx_t * draw_ctx); +LV_ATTRIBUTE_FAST_MEM +static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, + const lv_draw_img_dsc_t * draw_dsc, + const lv_area_t * coords, + const uint8_t * src_buf, + lv_img_cf_t cf); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_arm2d_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + arm_2d_init(); + + lv_draw_sw_init_ctx(drv, draw_ctx); + + lv_draw_arm2d_ctx_t * arm2d_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx; + + arm2d_draw_ctx->blend = lv_draw_arm2d_blend; + arm2d_draw_ctx->base_draw.wait_for_finish = lv_gpu_arm2d_wait_cb; + +#if !__ARM_2D_HAS_HW_ACC__ + arm2d_draw_ctx->base_draw.draw_img_decoded = lv_draw_arm2d_img_decoded; +#endif + +} + +void lv_draw_arm2d_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + LV_UNUSED(drv); + LV_UNUSED(draw_ctx); +} + +extern void test_flush(lv_color_t * color_p); + +#if __ARM_2D_HAS_HW_ACC__ +LV_ATTRIBUTE_FAST_MEM +static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) +{ + const lv_opa_t * mask; + if(dsc->mask_buf == NULL) mask = NULL; + if(dsc->mask_buf && dsc->mask_res == LV_DRAW_MASK_RES_TRANSP) return; + else if(dsc->mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask = NULL; + else mask = dsc->mask_buf; + + + lv_area_t blend_area; + if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) { + return; + } + + bool is_accelerated = false; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL + && lv_area_get_size(&blend_area) > 100) { + + __PREPARE_TARGET_TILE__(blend_area); + __PREPARE_SOURCE_TILE__(dsc, blend_area); + __PREPARE_MASK_TILE__(dsc, blend_area, mask, false); + + if(src_buf) { + is_accelerated = lv_draw_arm2d_tile_copy( + &target_tile, + &target_region, + &source_tile, + dsc->opa, + (NULL == mask) ? NULL : &mask_tile); + } + else { + is_accelerated = lv_draw_arm2d_fill_colour( + &target_tile, + &target_region, + dsc->color, + dsc->opa, + (NULL == mask) ? NULL : &mask_tile); + } + } + + if(!is_accelerated) { + lv_draw_sw_blend_basic(draw_ctx, dsc); + } +} + + +LV_ATTRIBUTE_FAST_MEM +static bool lv_draw_arm2d_fill_colour(const arm_2d_tile_t * target_tile, + const arm_2d_region_t * region, + lv_color_t color, + lv_opa_t opa, + const arm_2d_tile_t * mask_tile) +{ + arm_fsm_rt_t result = (arm_fsm_rt_t)ARM_2D_ERR_NONE; + + if(NULL == mask_tile) { + if(opa >= LV_OPA_MAX) { + result = arm_2d_fill_colour(target_tile, region, color.full); + } + else { +#if LV_COLOR_SCREEN_TRANSP + return false; +#else + result = arm_2d_fill_colour_with_alpha( + target_tile, + region, + (arm_2d_color_t) { + color.full + }, + opa); +#endif + } + } + else { + + if(opa >= LV_OPA_MAX) { + result = arm_2d_fill_colour_with_mask( + target_tile, + region, + mask_tile, + (arm_2d_color_t) { + color.full + }); + } + else { +#if LV_COLOR_SCREEN_TRANSP + return false; +#else + result = arm_2d_fill_colour_with_mask_and_opacity( + target_tile, + region, + mask_tile, + (arm_2d_color_t) { + color.full + }, + opa); +#endif + } + } + + if(result < 0) { + /* error detected */ + return false; + } + + return true; + +} + +LV_ATTRIBUTE_FAST_MEM +static bool lv_draw_arm2d_tile_copy(const arm_2d_tile_t * target_tile, + const arm_2d_region_t * region, + arm_2d_tile_t * source_tile, + lv_opa_t opa, + arm_2d_tile_t * mask_tile) +{ + arm_fsm_rt_t result = (arm_fsm_rt_t)ARM_2D_ERR_NONE; + + if(NULL == mask_tile) { + if(opa >= LV_OPA_MAX) { + result = arm_2d_tile_copy(source_tile, + target_tile, + region, + ARM_2D_CP_MODE_COPY); + } +#if LV_COLOR_SCREEN_TRANSP + else { + return false; /* not supported */ + } +#else + else { + result = arm_2d_alpha_blending(source_tile, + target_tile, + region, + opa); + } +#endif + } + else { +#if LV_COLOR_SCREEN_TRANSP + return false; /* not support */ +#else + + if(opa >= LV_OPA_MAX) { + result = arm_2d_tile_copy_with_src_mask(source_tile, + mask_tile, + target_tile, + region, + ARM_2D_CP_MODE_COPY); + } + else { + return false; + } +#endif + } + + if(result < 0) { + /* error detected */ + return false; + } + + return true; +} + +static void lv_gpu_arm2d_wait_cb(lv_draw_ctx_t * draw_ctx) +{ + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + + arm_2d_op_wait_async(NULL); + if(disp->driver && disp->driver->wait_cb) { + disp->driver->wait_cb(disp->driver); + } + lv_draw_sw_wait_for_finish(draw_ctx); +} +#else + + +LV_ATTRIBUTE_FAST_MEM +static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) +{ + const lv_opa_t * mask; + if(dsc->mask_buf == NULL) mask = NULL; + if(dsc->mask_buf && dsc->mask_res == LV_DRAW_MASK_RES_TRANSP) return; + else if(dsc->mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask = NULL; + else mask = dsc->mask_buf; + + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + + lv_area_t blend_area; + if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) return; + + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + + bool is_accelerated = false; + do { + if(NULL != disp->driver->set_px_cb) { + break; + } + + lv_color_t * dest_buf = draw_ctx->buf; + dest_buf += dest_stride * (blend_area.y1 - draw_ctx->buf_area->y1) + + (blend_area.x1 - draw_ctx->buf_area->x1); + + const lv_color_t * src_buf = dsc->src_buf; + lv_coord_t src_stride; + if(src_buf) { + src_stride = lv_area_get_width(dsc->blend_area); + src_buf += src_stride * (blend_area.y1 - dsc->blend_area->y1) + (blend_area.x1 - dsc->blend_area->x1); + } + else { + src_stride = 0; + } + + lv_coord_t mask_stride; + if(mask) { + mask_stride = lv_area_get_width(dsc->mask_area); + mask += mask_stride * (blend_area.y1 - dsc->mask_area->y1) + (blend_area.x1 - dsc->mask_area->x1); + } + else { + mask_stride = 0; + } + + lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + + if(dsc->src_buf == NULL) { + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + is_accelerated = arm_2d_fill_normal(dest_buf, + &blend_area, + dest_stride, + dsc->color, + dsc->opa, + mask, + mask_stride); + } +#if LV_DRAW_COMPLEX + else { + break; + } +#endif + } + else { + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + is_accelerated = arm_2d_copy_normal(dest_buf, + &blend_area, + dest_stride, + src_buf, + src_stride, + dsc->opa, + mask, + mask_stride); + } +#if LV_DRAW_COMPLEX + else { + break; + } +#endif + } + } while(0); + + if(!is_accelerated) lv_draw_sw_blend_basic(draw_ctx, dsc); +} + +LV_ATTRIBUTE_FAST_MEM +static bool arm_2d_fill_normal(lv_color_t * dest_buf, + const lv_area_t * dest_area, + lv_coord_t dest_stride, + lv_color_t color, + lv_opa_t opa, + const lv_opa_t * mask, + lv_coord_t mask_stride) +{ + arm_2d_size_t target_size = { + .iWidth = lv_area_get_width(dest_area), + .iHeight = lv_area_get_height(dest_area), + }; + + /*No mask*/ + if(mask == NULL) { + if(opa >= LV_OPA_MAX) { + __arm_2d_impl_colour_filling((color_int *)dest_buf, + dest_stride, + &target_size, + color.full); + } + /*Has opacity*/ + else { +#if LV_COLOR_SCREEN_TRANSP + return false; +#else + __arm_2d_impl_colour_filling_with_opacity((color_int *)dest_buf, + dest_stride, + &target_size, + color.full, + opa); +#endif + } + } + /*Masked*/ + else { + /*Only the mask matters*/ + if(opa >= LV_OPA_MAX) { + __arm_2d_impl_colour_filling_mask((color_int *)dest_buf, + dest_stride, + (uint8_t *)mask, + mask_stride, + &target_size, + color.full); + } + /*With opacity*/ + else { +#if LV_COLOR_SCREEN_TRANSP + return false; +#else + __arm_2d_impl_colour_filling_mask_opacity((color_int *)dest_buf, + dest_stride, + (uint8_t *)mask, + mask_stride, + &target_size, + color.full, + opa); +#endif + } + } + + return true; +} + + +LV_ATTRIBUTE_FAST_MEM +static bool arm_2d_copy_normal(lv_color_t * dest_buf, + const lv_area_t * dest_area, + lv_coord_t dest_stride, + const lv_color_t * src_buf, + lv_coord_t src_stride, + lv_opa_t opa, + const lv_opa_t * mask, + lv_coord_t mask_stride) + +{ + int32_t w = lv_area_get_width(dest_area); + int32_t h = lv_area_get_height(dest_area); + + arm_2d_size_t copy_size = { + .iWidth = lv_area_get_width(dest_area), + .iHeight = lv_area_get_height(dest_area), + }; + +#if LV_COLOR_SCREEN_TRANSP + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); +#endif + + /*Simple fill (maybe with opacity), no masking*/ + if(mask == NULL) { + if(opa >= LV_OPA_MAX) { + __arm_2d_impl_copy((color_int *)src_buf, + src_stride, + (color_int *)dest_buf, + dest_stride, + ©_size); + } + else { +#if LV_COLOR_SCREEN_TRANSP + return false; +#else + __arm_2d_impl_alpha_blending((color_int *)src_buf, + src_stride, + (color_int *)dest_buf, + dest_stride, + ©_size, + opa); +#endif + } + } + /*Masked*/ + else { + /*Only the mask matters*/ + if(opa > LV_OPA_MAX) { +#if LV_COLOR_SCREEN_TRANSP + return false; +#else + __arm_2d_impl_src_msk_copy((color_int *)src_buf, + src_stride, + (uint8_t *)mask, + mask_stride, + ©_size, + (color_int *)dest_buf, + dest_stride, + ©_size); +#endif + } + /*Handle opa and mask values too*/ + else { +#if LV_COLOR_SCREEN_TRANSP + return false; +#else + __arm_2d_impl_gray8_alpha_blending((uint8_t *)mask, + mask_stride, + (uint8_t *)mask, + mask_stride, + ©_size, + opa); + + __arm_2d_impl_src_msk_copy((color_int *)src_buf, + src_stride, + (uint8_t *)mask, + mask_stride, + ©_size, + (color_int *)dest_buf, + dest_stride, + ©_size); +#endif + } + } + + return true; +} + +LV_ATTRIBUTE_FAST_MEM +static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, + const lv_draw_img_dsc_t * draw_dsc, + const lv_area_t * coords, + const uint8_t * src_buf, + lv_img_cf_t cf) +{ + /*Use the clip area as draw area*/ + lv_area_t draw_area; + lv_area_copy(&draw_area, draw_ctx->clip_area); + + bool mask_any = lv_draw_mask_is_any(&draw_area); + bool transform = draw_dsc->angle != 0 || draw_dsc->zoom != LV_IMG_ZOOM_NONE ? true : false; + + lv_area_t blend_area; + lv_draw_sw_blend_dsc_t blend_dsc; + + lv_memset_00(&blend_dsc, sizeof(lv_draw_sw_blend_dsc_t)); + blend_dsc.opa = draw_dsc->opa; + blend_dsc.blend_mode = draw_dsc->blend_mode; + blend_dsc.blend_area = &blend_area; + + /*The simplest case just copy the pixels into the draw_buf*/ + if(!mask_any && !transform && cf == LV_IMG_CF_TRUE_COLOR && draw_dsc->recolor_opa == LV_OPA_TRANSP) { + blend_dsc.src_buf = (const lv_color_t *)src_buf; + + blend_dsc.blend_area = coords; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + else if(!mask_any && !transform && cf == LV_IMG_CF_ALPHA_8BIT) { + blend_dsc.mask_buf = (lv_opa_t *)src_buf; + blend_dsc.mask_area = coords; + blend_dsc.src_buf = NULL; + blend_dsc.color = draw_dsc->recolor; + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + + blend_dsc.blend_area = coords; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } +#if LV_COLOR_DEPTH == 16 + else if(!mask_any && !transform && cf == LV_IMG_CF_RGB565A8 && draw_dsc->recolor_opa == LV_OPA_TRANSP) { + lv_coord_t src_w = lv_area_get_width(coords); + lv_coord_t src_h = lv_area_get_height(coords); + blend_dsc.src_buf = (const lv_color_t *)src_buf; + blend_dsc.mask_buf = (lv_opa_t *)src_buf; + blend_dsc.mask_buf += sizeof(lv_color_t) * src_w * src_h; + blend_dsc.blend_area = coords; + blend_dsc.mask_area = coords; + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } +#endif + /*In the other cases every pixel need to be checked one-by-one*/ + else { + blend_area.x1 = draw_ctx->clip_area->x1; + blend_area.x2 = draw_ctx->clip_area->x2; + blend_area.y1 = draw_ctx->clip_area->y1; + blend_area.y2 = draw_ctx->clip_area->y2; + + lv_coord_t src_w = lv_area_get_width(coords); + lv_coord_t src_h = lv_area_get_height(coords); + lv_coord_t blend_h = lv_area_get_height(&blend_area); + lv_coord_t blend_w = lv_area_get_width(&blend_area); + + uint32_t max_buf_size = MAX_BUF_SIZE; + uint32_t blend_size = lv_area_get_size(&blend_area); + uint32_t buf_h; + uint32_t buf_w = blend_w; + if(blend_size <= max_buf_size) { + buf_h = blend_h; + } + else { + /*Round to full lines*/ + buf_h = max_buf_size / blend_w; + } + + /*Create buffers and masks*/ + uint32_t buf_size = buf_w * buf_h; + + lv_color_t * rgb_buf = lv_mem_buf_get(buf_size * sizeof(lv_color_t)); + lv_opa_t * mask_buf = lv_mem_buf_get(buf_size); + blend_dsc.mask_buf = mask_buf; + blend_dsc.mask_area = &blend_area; + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + blend_dsc.src_buf = rgb_buf; + lv_coord_t y_last = blend_area.y2; + blend_area.y2 = blend_area.y1 + buf_h - 1; + + lv_draw_mask_res_t mask_res_def = (cf != LV_IMG_CF_TRUE_COLOR || draw_dsc->angle || + draw_dsc->zoom != LV_IMG_ZOOM_NONE) ? + LV_DRAW_MASK_RES_CHANGED : LV_DRAW_MASK_RES_FULL_COVER; + blend_dsc.mask_res = mask_res_def; + + bool is_accelerated = false; + + if(!transform) { + if(LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED == cf) { + /* copy with colour keying */ + + /* *INDENT-OFF* */ + __RECOLOUR_WRAPPER( + + lv_color_t chrome_key = LV_COLOR_CHROMA_KEY; + /* calculate new chrome-key colour */ + if(draw_dsc->recolor_opa > LV_OPA_MIN) { + __ARM_2D_PIXEL_BLENDING_OPA( + (color_int *) & (draw_dsc->recolor.full), + (color_int *) & (chrome_key.full), + draw_dsc->recolor_opa + ); + } + + __PREPARE_LL_ACCELERATION__(); + + if(blend_dsc.opa >= LV_OPA_MAX) { + __arm_2d_impl_cl_key_copy( + (color_int *)src_buf_tmp, + src_stride, + (color_int *)dest_buf, + dest_stride, + ©_size, + (color_int)chrome_key.full); + } + else { + __arm_2d_impl_alpha_blending_colour_keying( + (color_int *)src_buf_tmp, + src_stride, + (color_int *)dest_buf, + dest_stride, + ©_size, + blend_dsc.opa, + (color_int)chrome_key.full); + } + is_accelerated = true; + ) + /* *INDENT-ON* */ + } + else if((LV_COLOR_DEPTH == 32) + && !mask_any + && (cf == LV_IMG_CF_TRUE_COLOR_ALPHA)) { + /* accelerate copy-with-source-masks-and-opacity */ + + /* *INDENT-OFF* */ + __RECOLOUR_WRAPPER( + __PREPARE_LL_ACCELERATION__(); + + uint8_t * mask_temp_buf = NULL; + if(blend_dsc.opa < LV_OPA_MAX) { + mask_temp_buf = lv_mem_buf_get(copy_size.iHeight * copy_size.iWidth); + if(NULL == mask_temp_buf) { + LV_LOG_WARN( + "Failed to allocate memory for alpha mask," + " use normal route instead."); + break; + } + lv_memset_00(mask_temp_buf, copy_size.iHeight * copy_size.iWidth); + + __arm_2d_impl_gray8_colour_filling_channel_mask_opacity( + mask_temp_buf, + src_stride, + (uint32_t *) + ((uintptr_t)src_buf_tmp + LV_IMG_PX_SIZE_ALPHA_BYTE - 1), + src_stride, + ©_size, + 0xFF, + blend_dsc.opa); + + __arm_2d_impl_src_msk_copy( + (color_int *)src_buf_tmp, + src_stride, + mask_temp_buf, + src_stride, + ©_size, + (color_int *)dest_buf, + dest_stride, + ©_size); + + lv_mem_buf_release(mask_temp_buf); + } + else { + __arm_2d_impl_src_chn_msk_copy( + (color_int *)src_buf_tmp, + src_stride, + (uint32_t *) + ((uintptr_t)src_buf_tmp + LV_IMG_PX_SIZE_ALPHA_BYTE - 1), + src_stride, + ©_size, + (color_int *)dest_buf, + dest_stride, + ©_size); + } + + is_accelerated = true; + ) + /* *INDENT-ON* */ + } + else if(!mask_any && (cf == LV_IMG_CF_TRUE_COLOR)) { + /* accelerate copy-with-source-masks-and-opacity */ + + /* *INDENT-OFF* */ + __RECOLOUR_WRAPPER( + __PREPARE_LL_ACCELERATION__(); + + if(blend_dsc.opa >= LV_OPA_MAX) { + __arm_2d_impl_copy( + (color_int *)src_buf_tmp, + src_stride, + (color_int *)dest_buf, + dest_stride, + ©_size); + } + else { + __arm_2d_impl_alpha_blending( + (color_int *)src_buf_tmp, + src_stride, + (color_int *)dest_buf, + dest_stride, + ©_size, + blend_dsc.opa); + } + is_accelerated = true; + ) + /* *INDENT-ON* */ + } + } + else if(!mask_any +#if defined(__ARM_2D_HAS_ANTI_ALIAS_TRANSFORM__) && __ARM_2D_HAS_ANTI_ALIAS_TRANSFORM__ + && (draw_dsc->antialias == 1) +#else + && (draw_dsc->antialias == 0) +#endif + && (draw_dsc->recolor_opa == LV_OPA_TRANSP) + && (((LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED == cf) + || (LV_IMG_CF_TRUE_COLOR == cf)) +#if defined(__ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__) && __ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__ + || ((LV_IMG_CF_TRUE_COLOR_ALPHA == cf) + && (LV_COLOR_DEPTH == 32)) +#endif + ) + ) { + + /* *INDENT-OFF* */ + __RECOLOUR_WRAPPER( + /* accelerate transform without re-color */ + + static arm_2d_tile_t target_tile_origin; + static arm_2d_tile_t target_tile; + arm_2d_region_t clip_region; + static arm_2d_region_t target_region; + + lv_color_t * dest_buf = draw_ctx->buf; + + target_tile_origin = (arm_2d_tile_t) { + .tRegion = { + .tSize = { + .iWidth = lv_area_get_width(draw_ctx->buf_area), + .iHeight = lv_area_get_height(draw_ctx->buf_area), + }, + }, + .tInfo.bIsRoot = true, + .phwBuffer = (uint16_t *)draw_ctx->buf, + }; + + clip_region = (arm_2d_region_t) { + .tLocation = { + .iX = draw_ctx->clip_area->x1 - draw_ctx->buf_area->x1, + .iY = draw_ctx->clip_area->y1 - draw_ctx->buf_area->y1, + }, + .tSize = { + .iWidth = lv_area_get_width(draw_ctx->clip_area), + .iHeight = lv_area_get_height(draw_ctx->clip_area), + }, + }; + + arm_2d_tile_generate_child(&target_tile_origin, + &clip_region, + &target_tile, + false); + + target_region = (arm_2d_region_t) { + .tLocation = { + .iX = coords->x1 - draw_ctx->clip_area->x1, + .iY = coords->y1 - draw_ctx->clip_area->y1, + }, + .tSize = { + .iWidth = lv_area_get_width(coords), + .iHeight = lv_area_get_height(coords), + }, + }; + + static arm_2d_tile_t source_tile; + + source_tile = (arm_2d_tile_t) { + .tRegion = { + .tSize = { + .iWidth = src_w, + .iHeight = src_h, + }, + }, + .tInfo.bIsRoot = true, + .pchBuffer = (uint8_t *)src_buf, + }; + + static arm_2d_tile_t mask_tile; + mask_tile = source_tile; + + mask_tile.tInfo.bHasEnforcedColour = true; + mask_tile.tInfo.tColourInfo.chScheme = ARM_2D_CHANNEL_8in32; + mask_tile.pchBuffer += 3; + + static arm_2d_location_t source_center, target_center; + source_center.iX = draw_dsc->pivot.x; + source_center.iY = draw_dsc->pivot.y; + + + if((LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED == cf) || + (LV_IMG_CF_TRUE_COLOR == cf)) { + arm_2d_tile_transform_with_opacity( + &source_tile, + &target_tile, + &target_region, + source_center, + ARM_2D_ANGLE((draw_dsc->angle / 10.0f)), + draw_dsc->zoom / 256.0f, + (color_int)LV_COLOR_CHROMA_KEY.full, + blend_dsc.opa); + + is_accelerated = true; + } + #if defined(__ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__) \ + && __ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__ + else if((LV_IMG_CF_TRUE_COLOR_ALPHA == cf) && + (LV_COLOR_DEPTH == 32)) { + arm_2d_tile_transform_with_src_mask_and_opacity( + &source_tile, + &mask_tile, + &target_tile, + &target_region, + source_center, + ARM_2D_ANGLE((draw_dsc->angle / 10.0f)), + draw_dsc->zoom / 256.0f, + blend_dsc.opa); + + is_accelerated = true; + } + #endif + ) + /* *INDENT-ON* */ + } + + /* *INDENT-OFF* */ + if(!is_accelerated) while(blend_area.y1 <= y_last) { + /*Apply transformations if any or separate the channels*/ + lv_area_t transform_area; + lv_area_copy(&transform_area, &blend_area); + lv_area_move(&transform_area, -coords->x1, -coords->y1); + if(transform) { + lv_draw_transform(draw_ctx, &transform_area, src_buf, src_w, src_h, src_w, + draw_dsc, cf, rgb_buf, mask_buf); + } + else { + convert_cb(&transform_area, src_buf, src_w, src_h, src_w, draw_dsc, cf, rgb_buf, mask_buf); + } + + /*Apply recolor*/ + if(draw_dsc->recolor_opa > LV_OPA_MIN) { + arm_2d_size_t copy_size = { + .iWidth = buf_w, + .iHeight = buf_h, + }; + + /* apply re-colour */ + __arm_2d_impl_colour_filling_with_opacity( + (color_int *)rgb_buf, + buf_w, + ©_size, + (color_int)draw_dsc->recolor.full, + draw_dsc->recolor_opa); + } +#if LV_DRAW_COMPLEX + /*Apply the masks if any*/ + if(mask_any) { + lv_coord_t y; + lv_opa_t * mask_buf_tmp = mask_buf; + for(y = blend_area.y1; y <= blend_area.y2; y++) { + lv_draw_mask_res_t mask_res_line; + mask_res_line = lv_draw_mask_apply(mask_buf_tmp, blend_area.x1, y, blend_w); + + if(mask_res_line == LV_DRAW_MASK_RES_TRANSP) { + lv_memset_00(mask_buf_tmp, blend_w); + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + } + else if(mask_res_line == LV_DRAW_MASK_RES_CHANGED) { + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + } + mask_buf_tmp += blend_w; + } + } +#endif + + /*Blend*/ + lv_draw_sw_blend(draw_ctx, &blend_dsc); + + /*Go the the next lines*/ + blend_area.y1 = blend_area.y2 + 1; + blend_area.y2 = blend_area.y1 + buf_h - 1; + if(blend_area.y2 > y_last) blend_area.y2 = y_last; + } + + lv_mem_buf_release(mask_buf); + lv_mem_buf_release(rgb_buf); + } +} + +static void lv_gpu_arm2d_wait_cb(lv_draw_ctx_t * draw_ctx) +{ + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + + arm_2d_op_wait_async(NULL); + if(disp->driver && disp->driver->wait_cb) { + disp->driver->wait_cb(disp->driver); + } + lv_draw_sw_wait_for_finish(draw_ctx); +} + + +#endif + + +/********************** + * STATIC FUNCTIONS + **********************/ +/* Separate the image channels to RGB and Alpha to match LV_COLOR_DEPTH settings*/ +static void convert_cb(const lv_area_t * dest_area, const void * src_buf, lv_coord_t src_w, lv_coord_t src_h, + lv_coord_t src_stride, const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t cf, lv_color_t * cbuf, lv_opa_t * abuf) +{ + LV_UNUSED(draw_dsc); + LV_UNUSED(src_h); + LV_UNUSED(src_w); + + const uint8_t * src_tmp8 = (const uint8_t *)src_buf; + lv_coord_t y; + lv_coord_t x; + + if(cf == LV_IMG_CF_TRUE_COLOR || cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) { + uint32_t px_cnt = lv_area_get_size(dest_area); + lv_memset_ff(abuf, px_cnt); + + src_tmp8 += (src_stride * dest_area->y1 * sizeof(lv_color_t)) + dest_area->x1 * sizeof(lv_color_t); + uint32_t dest_w = lv_area_get_width(dest_area); + uint32_t dest_w_byte = dest_w * sizeof(lv_color_t); + + lv_coord_t src_stride_byte = src_stride * sizeof(lv_color_t); + lv_color_t * cbuf_tmp = cbuf; + for(y = dest_area->y1; y <= dest_area->y2; y++) { + lv_memcpy(cbuf_tmp, src_tmp8, dest_w_byte); + src_tmp8 += src_stride_byte; + cbuf_tmp += dest_w; + } + + /*Make "holes" for with Chroma keying*/ + if(cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) { + uint32_t i; + lv_color_t chk = LV_COLOR_CHROMA_KEY; +#if LV_COLOR_DEPTH == 8 || LV_COLOR_DEPTH == 1 + uint8_t * cbuf_uint = (uint8_t *)cbuf; + uint8_t chk_v = chk.full; +#elif LV_COLOR_DEPTH == 16 + uint16_t * cbuf_uint = (uint16_t *)cbuf; + uint16_t chk_v = chk.full; +#elif LV_COLOR_DEPTH == 32 + uint32_t * cbuf_uint = (uint32_t *)cbuf; + uint32_t chk_v = chk.full; +#endif + for(i = 0; i < px_cnt; i++) { + if(chk_v == cbuf_uint[i]) abuf[i] = 0x00; + } + } + } + else if(cf == LV_IMG_CF_TRUE_COLOR_ALPHA) { + src_tmp8 += (src_stride * dest_area->y1 * LV_IMG_PX_SIZE_ALPHA_BYTE) + dest_area->x1 * LV_IMG_PX_SIZE_ALPHA_BYTE; + + lv_coord_t src_new_line_step_px = (src_stride - lv_area_get_width(dest_area)); + lv_coord_t src_new_line_step_byte = src_new_line_step_px * LV_IMG_PX_SIZE_ALPHA_BYTE; + + lv_coord_t dest_h = lv_area_get_height(dest_area); + lv_coord_t dest_w = lv_area_get_width(dest_area); + for(y = 0; y < dest_h; y++) { + for(x = 0; x < dest_w; x++) { + abuf[x] = src_tmp8[LV_IMG_PX_SIZE_ALPHA_BYTE - 1]; +#if LV_COLOR_DEPTH == 8 || LV_COLOR_DEPTH == 1 + cbuf[x].full = *src_tmp8; +#elif LV_COLOR_DEPTH == 16 + cbuf[x].full = *src_tmp8 + ((*(src_tmp8 + 1)) << 8); +#elif LV_COLOR_DEPTH == 32 + cbuf[x] = *((lv_color_t *) src_tmp8); + cbuf[x].ch.alpha = 0xff; +#endif + src_tmp8 += LV_IMG_PX_SIZE_ALPHA_BYTE; + + } + cbuf += dest_w; + abuf += dest_w; + src_tmp8 += src_new_line_step_byte; + } + } + else if(cf == LV_IMG_CF_RGB565A8) { + src_tmp8 += (src_stride * dest_area->y1 * sizeof(lv_color_t)) + dest_area->x1 * sizeof(lv_color_t); + + lv_coord_t src_stride_byte = src_stride * sizeof(lv_color_t); + + lv_coord_t dest_h = lv_area_get_height(dest_area); + lv_coord_t dest_w = lv_area_get_width(dest_area); + for(y = 0; y < dest_h; y++) { + lv_memcpy(cbuf, src_tmp8, dest_w * sizeof(lv_color_t)); + cbuf += dest_w; + src_tmp8 += src_stride_byte; + } + + src_tmp8 = (const uint8_t *)src_buf; + src_tmp8 += sizeof(lv_color_t) * src_w * src_h; + src_tmp8 += src_stride * dest_area->y1 + dest_area->x1; + for(y = 0; y < dest_h; y++) { + lv_memcpy(abuf, src_tmp8, dest_w); + abuf += dest_w; + src_tmp8 += src_stride; + } + } +} + +#if 0 +static void invalidate_cache(void) +{ + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + if(disp->driver->clean_dcache_cb) disp->driver->clean_dcache_cb(disp->driver); + else { +#if __CORTEX_M >= 0x07 + if((SCB->CCR) & (uint32_t)SCB_CCR_DC_Msk) + SCB_CleanInvalidateDCache(); +#endif + } +} +#endif + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/arm2d/lv_gpu_arm2d.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/arm2d/lv_gpu_arm2d.h new file mode 100644 index 0000000..50fa5a8 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/arm2d/lv_gpu_arm2d.h @@ -0,0 +1,51 @@ +/** + * @file lv_gpu_arm2d.h + * + */ + +#ifndef LV_GPU_ARM2D_H +#define LV_GPU_ARM2D_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../misc/lv_color.h" +#include "../../hal/lv_hal_disp.h" +#include "../sw/lv_draw_sw.h" + +#if LV_USE_GPU_ARM2D + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef lv_draw_sw_ctx_t lv_draw_arm2d_ctx_t; + +struct _lv_disp_drv_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_arm2d_ctx_init(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); + +void lv_draw_arm2d_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GPU_ARM2D*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GPU_ARM2D_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw.c new file mode 100644 index 0000000..823f707 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw.c @@ -0,0 +1,53 @@ +/** + * @file lv_draw.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw.h" +#include "sw/lv_draw_sw.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_init(void) +{ + /*Nothing to init now*/ +} + +void lv_draw_wait_for_finish(lv_draw_ctx_t * draw_ctx) +{ + if(draw_ctx->wait_for_finish) draw_ctx->wait_for_finish(draw_ctx); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw.h new file mode 100644 index 0000000..80b62e9 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw.h @@ -0,0 +1,218 @@ +/** + * @file lv_draw.h + * + */ + +#ifndef LV_DRAW_H +#define LV_DRAW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include "../misc/lv_style.h" +#include "../misc/lv_txt.h" +#include "lv_img_decoder.h" +#include "lv_img_cache.h" + +#include "lv_draw_rect.h" +#include "lv_draw_label.h" +#include "lv_draw_img.h" +#include "lv_draw_line.h" +#include "lv_draw_triangle.h" +#include "lv_draw_arc.h" +#include "lv_draw_mask.h" +#include "lv_draw_transform.h" +#include "lv_draw_layer.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + void * user_data; +} lv_draw_mask_t; + +typedef struct _lv_draw_layer_ctx_t { + lv_area_t area_full; + lv_area_t area_act; + lv_coord_t max_row_with_alpha; + lv_coord_t max_row_with_no_alpha; + void * buf; + struct { + const lv_area_t * clip_area; + lv_area_t * buf_area; + void * buf; + bool screen_transp; + } original; +} lv_draw_layer_ctx_t; + +typedef struct _lv_draw_ctx_t { + /** + * Pointer to a buffer to draw into + */ + void * buf; + + /** + * The position and size of `buf` (absolute coordinates) + */ + lv_area_t * buf_area; + + /** + * The current clip area with absolute coordinates, always the same or smaller than `buf_area` + */ + const lv_area_t * clip_area; + + + void (*draw_rect)(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); + + void (*draw_arc)(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, + uint16_t radius, uint16_t start_angle, uint16_t end_angle); + + void (*draw_img_decoded)(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, + const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t color_format); + + lv_res_t (*draw_img)(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * draw_dsc, + const lv_area_t * coords, const void * src); + + void (*draw_letter)(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, + uint32_t letter); + + + void (*draw_line)(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, + const lv_point_t * point2); + + + void (*draw_polygon)(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * draw_dsc, + const lv_point_t * points, uint16_t point_cnt); + + + /** + * Get an area of a transformed image (zoomed and/or rotated) + * @param draw_ctx pointer to a draw context + * @param dest_area get this area of the result image. It assumes that the original image is placed to the 0;0 position. + * @param src_buf the source image + * @param src_w width of the source image in [px] + * @param src_h height of the source image in [px] + * @param src_stride the stride in [px]. + * @param draw_dsc an `lv_draw_img_dsc_t` descriptor containing the transformation parameters + * @param cf the color format of `src_buf` + * @param cbuf place the colors of the pixels on `dest_area` here in RGB format + * @param abuf place the opacity of the pixels on `dest_area` here + */ + void (*draw_transform)(struct _lv_draw_ctx_t * draw_ctx, const lv_area_t * dest_area, const void * src_buf, + lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride, + const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t cf, lv_color_t * cbuf, lv_opa_t * abuf); + + /** + * Replace the buffer with a rect without decoration like radius or borders + */ + void (*draw_bg)(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * draw_dsc, const lv_area_t * coords); + + /** + * Wait until all background operations are finished. (E.g. GPU operations) + */ + void (*wait_for_finish)(struct _lv_draw_ctx_t * draw_ctx); + + /** + * Copy an area from buffer to an other + * @param draw_ctx pointer to a draw context + * @param dest_buf copy the buffer into this buffer + * @param dest_stride the width of the dest_buf in pixels + * @param dest_area the destination area + * @param src_buf copy from this buffer + * @param src_stride the width of src_buf in pixels + * @param src_area the source area. + * + * @note dest_area and src_area must have the same width and height + * but can have different x and y position. + * @note dest_area and src_area must be clipped to the real dimensions of the buffers + */ + void (*buffer_copy)(struct _lv_draw_ctx_t * draw_ctx, void * dest_buf, lv_coord_t dest_stride, + const lv_area_t * dest_area, + void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area); + + /** + * Initialize a new layer context. + * The original buffer and area data are already saved from `draw_ctx` to `layer_ctx` + * @param draw_ctx pointer to the current draw context + * @param layer_area the coordinates of the layer + * @param flags OR-ed flags from @lv_draw_layer_flags_t + * @return pointer to the layer context, or NULL on error + */ + struct _lv_draw_layer_ctx_t * (*layer_init)(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx, + lv_draw_layer_flags_t flags); + + /** + * Adjust the layer_ctx and/or draw_ctx based on the `layer_ctx->area_act`. + * It's called only if flags has `LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE` + * @param draw_ctx pointer to the current draw context + * @param layer_ctx pointer to a layer context + * @param flags OR-ed flags from @lv_draw_layer_flags_t + */ + void (*layer_adjust)(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx, + lv_draw_layer_flags_t flags); + + /** + * Blend a rendered layer to `layer_ctx->area_act` + * @param draw_ctx pointer to the current draw context + * @param layer_ctx pointer to a layer context + * @param draw_dsc pointer to an image draw descriptor + */ + void (*layer_blend)(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx, + const lv_draw_img_dsc_t * draw_dsc); + + /** + * Destroy a layer context. The original buffer and area data of the `draw_ctx` will be restored + * and the `layer_ctx` itself will be freed automatically. + * @param draw_ctx pointer to the current draw context + * @param layer_ctx pointer to a layer context + */ + void (*layer_destroy)(struct _lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx); + + /** + * Size of a layer context in bytes. + */ + size_t layer_instance_size; + +#if LV_USE_USER_DATA + void * user_data; +#endif + +} lv_draw_ctx_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_init(void); + + +void lv_draw_wait_for_finish(lv_draw_ctx_t * draw_ctx); + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * POST INCLUDES + *********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw.mk b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw.mk new file mode 100644 index 0000000..f48f48f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw.mk @@ -0,0 +1,25 @@ +CSRCS += lv_draw_arc.c +CSRCS += lv_draw.c +CSRCS += lv_draw_img.c +CSRCS += lv_draw_label.c +CSRCS += lv_draw_line.c +CSRCS += lv_draw_mask.c +CSRCS += lv_draw_rect.c +CSRCS += lv_draw_transform.c +CSRCS += lv_draw_layer.c +CSRCS += lv_draw_triangle.c +CSRCS += lv_img_buf.c +CSRCS += lv_img_cache.c +CSRCS += lv_img_decoder.c + +DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw +VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw + +CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw" + +include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/arm2d/lv_draw_arm2d.mk +include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/lv_draw_nxp.mk +include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/sdl/lv_draw_sdl.mk +include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/stm32_dma2d/lv_draw_stm32_dma2d.mk +include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/sw/lv_draw_sw.mk +include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/swm341_dma2d/lv_draw_swm341_dma2d.mk diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_arc.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_arc.c new file mode 100644 index 0000000..b806a00 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_arc.c @@ -0,0 +1,152 @@ +/** + * @file lv_draw_arc.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw.h" +#include "lv_draw_arc.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_arc_dsc_init(lv_draw_arc_dsc_t * dsc) +{ + lv_memset_00(dsc, sizeof(lv_draw_arc_dsc_t)); + dsc->width = 1; + dsc->opa = LV_OPA_COVER; + dsc->color = lv_color_black(); +} + +void lv_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, uint16_t radius, + uint16_t start_angle, uint16_t end_angle) +{ + if(dsc->opa <= LV_OPA_MIN) return; + if(dsc->width == 0) return; + if(start_angle == end_angle) return; + + draw_ctx->draw_arc(draw_ctx, dsc, center, radius, start_angle, end_angle); + + // const lv_draw_backend_t * backend = lv_draw_backend_get(); + // backend->draw_arc(center_x, center_y, radius, start_angle, end_angle, clip_area, dsc); +} + +void lv_draw_arc_get_area(lv_coord_t x, lv_coord_t y, uint16_t radius, uint16_t start_angle, uint16_t end_angle, + lv_coord_t w, bool rounded, lv_area_t * area) +{ + lv_coord_t rout = radius; + + /*Special case: full arc invalidation */ + if(end_angle == start_angle + 360) { + area->x1 = x - rout; + area->y1 = y - rout; + area->x2 = x + rout; + area->y2 = y + rout; + return; + } + + if(start_angle > 360) start_angle -= 360; + if(end_angle > 360) end_angle -= 360; + + lv_coord_t rin = radius - w; + lv_coord_t extra_area = rounded ? w / 2 + 1 : 0; + uint8_t start_quarter = start_angle / 90; + uint8_t end_quarter = end_angle / 90; + + /*360 deg still counts as quarter 3 (360 / 90 would be 4)*/ + if(start_quarter == 4) start_quarter = 3; + if(end_quarter == 4) end_quarter = 3; + + if(start_quarter == end_quarter && start_angle <= end_angle) { + if(start_quarter == 0) { + area->y1 = y + ((lv_trigo_sin(start_angle) * rin) >> LV_TRIGO_SHIFT) - extra_area; + area->x2 = x + ((lv_trigo_sin(start_angle + 90) * rout) >> LV_TRIGO_SHIFT) + extra_area; + + area->y2 = y + ((lv_trigo_sin(end_angle) * rout) >> LV_TRIGO_SHIFT) + extra_area; + area->x1 = x + ((lv_trigo_sin(end_angle + 90) * rin) >> LV_TRIGO_SHIFT) - extra_area; + } + else if(start_quarter == 1) { + area->y2 = y + ((lv_trigo_sin(start_angle) * rout) >> LV_TRIGO_SHIFT) + extra_area; + area->x2 = x + ((lv_trigo_sin(start_angle + 90) * rin) >> LV_TRIGO_SHIFT) + extra_area; + + area->y1 = y + ((lv_trigo_sin(end_angle) * rin) >> LV_TRIGO_SHIFT) - extra_area; + area->x1 = x + ((lv_trigo_sin(end_angle + 90) * rout) >> LV_TRIGO_SHIFT) - extra_area; + } + else if(start_quarter == 2) { + area->x1 = x + ((lv_trigo_sin(start_angle + 90) * rout) >> LV_TRIGO_SHIFT) - extra_area; + area->y2 = y + ((lv_trigo_sin(start_angle) * rin) >> LV_TRIGO_SHIFT) + extra_area; + + area->y1 = y + ((lv_trigo_sin(end_angle) * rout) >> LV_TRIGO_SHIFT) - extra_area; + area->x2 = x + ((lv_trigo_sin(end_angle + 90) * rin) >> LV_TRIGO_SHIFT) + extra_area; + } + else if(start_quarter == 3) { + area->x1 = x + ((lv_trigo_sin(start_angle + 90) * rin) >> LV_TRIGO_SHIFT) - extra_area; + area->y1 = y + ((lv_trigo_sin(start_angle) * rout) >> LV_TRIGO_SHIFT) - extra_area; + + area->x2 = x + ((lv_trigo_sin(end_angle + 90) * rout) >> LV_TRIGO_SHIFT) + extra_area; + area->y2 = y + ((lv_trigo_sin(end_angle) * rin) >> LV_TRIGO_SHIFT) + extra_area; + } + } + else if(start_quarter == 0 && end_quarter == 1) { + area->x1 = x + ((lv_trigo_sin(end_angle + 90) * rout) >> LV_TRIGO_SHIFT) - extra_area; + area->y1 = y + ((LV_MIN(lv_trigo_sin(end_angle), + lv_trigo_sin(start_angle)) * rin) >> LV_TRIGO_SHIFT) - extra_area; + area->x2 = x + ((lv_trigo_sin(start_angle + 90) * rout) >> LV_TRIGO_SHIFT) + extra_area; + area->y2 = y + rout + extra_area; + } + else if(start_quarter == 1 && end_quarter == 2) { + area->x1 = x - rout - extra_area; + area->y1 = y + ((lv_trigo_sin(end_angle) * rout) >> LV_TRIGO_SHIFT) - extra_area; + area->x2 = x + ((LV_MAX(lv_trigo_sin(start_angle + 90), + lv_trigo_sin(end_angle + 90)) * rin) >> LV_TRIGO_SHIFT) + extra_area; + area->y2 = y + ((lv_trigo_sin(start_angle) * rout) >> LV_TRIGO_SHIFT) + extra_area; + } + else if(start_quarter == 2 && end_quarter == 3) { + area->x1 = x + ((lv_trigo_sin(start_angle + 90) * rout) >> LV_TRIGO_SHIFT) - extra_area; + area->y1 = y - rout - extra_area; + area->x2 = x + ((lv_trigo_sin(end_angle + 90) * rout) >> LV_TRIGO_SHIFT) + extra_area; + area->y2 = y + (LV_MAX(lv_trigo_sin(end_angle) * rin, + lv_trigo_sin(start_angle) * rin) >> LV_TRIGO_SHIFT) + extra_area; + } + else if(start_quarter == 3 && end_quarter == 0) { + area->x1 = x + ((LV_MIN(lv_trigo_sin(end_angle + 90), + lv_trigo_sin(start_angle + 90)) * rin) >> LV_TRIGO_SHIFT) - extra_area; + area->y1 = y + ((lv_trigo_sin(start_angle) * rout) >> LV_TRIGO_SHIFT) - extra_area; + area->x2 = x + rout + extra_area; + area->y2 = y + ((lv_trigo_sin(end_angle) * rout) >> LV_TRIGO_SHIFT) + extra_area; + + } + else { + area->x1 = x - rout; + area->y1 = y - rout; + area->x2 = x + rout; + area->y2 = y + rout; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_arc.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_arc.h new file mode 100644 index 0000000..8783f13 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_arc.h @@ -0,0 +1,83 @@ +/** + * @file lv_draw_arc.h + * + */ + +#ifndef LV_DRAW_ARC_H +#define LV_DRAW_ARC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "../misc/lv_color.h" +#include "../misc/lv_area.h" +#include "../misc/lv_style.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_color_t color; + lv_coord_t width; + uint16_t start_angle; + uint16_t end_angle; + const void * img_src; + lv_opa_t opa; + lv_blend_mode_t blend_mode : 2; + uint8_t rounded : 1; +} lv_draw_arc_dsc_t; + +struct _lv_draw_ctx_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_arc_dsc_init(lv_draw_arc_dsc_t * dsc); + +/** + * Draw an arc. (Can draw pie too with great thickness.) + * @param center_x the x coordinate of the center of the arc + * @param center_y the y coordinate of the center of the arc + * @param radius the radius of the arc + * @param mask the arc will be drawn only in this mask + * @param start_angle the start angle of the arc (0 deg on the bottom, 90 deg on the right) + * @param end_angle the end angle of the arc + * @param clip_area the arc will be drawn only in this area + * @param dsc pointer to an initialized `lv_draw_line_dsc_t` variable + */ +void lv_draw_arc(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, + uint16_t radius, uint16_t start_angle, uint16_t end_angle); + +/** + * Get an area the should be invalidated when the arcs angle changed between start_angle and end_ange + * @param x the x coordinate of the center of the arc + * @param y the y coordinate of the center of the arc + * @param radius the radius of the arc + * @param start_angle the start angle of the arc (0 deg on the bottom, 90 deg on the right) + * @param end_angle the end angle of the arc + * @param w width of the arc + * @param rounded true: the arc is rounded + * @param area store the area to invalidate here + */ +void lv_draw_arc_get_area(lv_coord_t x, lv_coord_t y, uint16_t radius, uint16_t start_angle, uint16_t end_angle, + lv_coord_t w, bool rounded, lv_area_t * area); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_ARC_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_img.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_img.c new file mode 100644 index 0000000..41dc0f0 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_img.c @@ -0,0 +1,364 @@ +/** + * @file lv_draw_img.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_img.h" +#include "lv_img_cache.h" +#include "../hal/lv_hal_disp.h" +#include "../misc/lv_log.h" +#include "../core/lv_refr.h" +#include "../misc/lv_mem.h" +#include "../misc/lv_math.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +LV_ATTRIBUTE_FAST_MEM static lv_res_t decode_and_draw(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * draw_dsc, + const lv_area_t * coords, const void * src); + +static void show_error(lv_draw_ctx_t * draw_ctx, const lv_area_t * coords, const char * msg); +static void draw_cleanup(_lv_img_cache_entry_t * cache); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_img_dsc_init(lv_draw_img_dsc_t * dsc) +{ + lv_memset_00(dsc, sizeof(lv_draw_img_dsc_t)); + dsc->recolor = lv_color_black(); + dsc->opa = LV_OPA_COVER; + dsc->zoom = LV_IMG_ZOOM_NONE; + dsc->antialias = LV_COLOR_DEPTH > 8 ? 1 : 0; +} + +/** + * Draw an image + * @param coords the coordinates of the image + * @param mask the image will be drawn only in this area + * @param src pointer to a lv_color_t array which contains the pixels of the image + * @param dsc pointer to an initialized `lv_draw_img_dsc_t` variable + */ +void lv_draw_img(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, const lv_area_t * coords, const void * src) +{ + if(src == NULL) { + LV_LOG_WARN("Image draw: src is NULL"); + show_error(draw_ctx, coords, "No\ndata"); + return; + } + + if(dsc->opa <= LV_OPA_MIN) return; + + lv_res_t res; + if(draw_ctx->draw_img) { + res = draw_ctx->draw_img(draw_ctx, dsc, coords, src); + } + else { + res = decode_and_draw(draw_ctx, dsc, coords, src); + } + + if(res == LV_RES_INV) { + LV_LOG_WARN("Image draw error"); + show_error(draw_ctx, coords, "No\ndata"); + return; + } +} + +/** + * Get the pixel size of a color format in bits + * @param cf a color format (`LV_IMG_CF_...`) + * @return the pixel size in bits + */ +uint8_t lv_img_cf_get_px_size(lv_img_cf_t cf) +{ + uint8_t px_size = 0; + + switch(cf) { + case LV_IMG_CF_UNKNOWN: + case LV_IMG_CF_RAW: + px_size = 0; + break; + case LV_IMG_CF_TRUE_COLOR: + case LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED: + px_size = LV_COLOR_SIZE; + break; + case LV_IMG_CF_TRUE_COLOR_ALPHA: + px_size = LV_IMG_PX_SIZE_ALPHA_BYTE << 3; + break; + case LV_IMG_CF_INDEXED_1BIT: + case LV_IMG_CF_ALPHA_1BIT: + px_size = 1; + break; + case LV_IMG_CF_INDEXED_2BIT: + case LV_IMG_CF_ALPHA_2BIT: + px_size = 2; + break; + case LV_IMG_CF_INDEXED_4BIT: + case LV_IMG_CF_ALPHA_4BIT: + px_size = 4; + break; + case LV_IMG_CF_INDEXED_8BIT: + case LV_IMG_CF_ALPHA_8BIT: + px_size = 8; + break; + default: + px_size = 0; + break; + } + + return px_size; +} + +/** + * Check if a color format is chroma keyed or not + * @param cf a color format (`LV_IMG_CF_...`) + * @return true: chroma keyed; false: not chroma keyed + */ +bool lv_img_cf_is_chroma_keyed(lv_img_cf_t cf) +{ + bool is_chroma_keyed = false; + + switch(cf) { + case LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED: + case LV_IMG_CF_RAW_CHROMA_KEYED: + is_chroma_keyed = true; + break; + + default: + is_chroma_keyed = false; + break; + } + + return is_chroma_keyed; +} + +/** + * Check if a color format has alpha channel or not + * @param cf a color format (`LV_IMG_CF_...`) + * @return true: has alpha channel; false: doesn't have alpha channel + */ +bool lv_img_cf_has_alpha(lv_img_cf_t cf) +{ + bool has_alpha = false; + + switch(cf) { + case LV_IMG_CF_TRUE_COLOR_ALPHA: + case LV_IMG_CF_RAW_ALPHA: + case LV_IMG_CF_INDEXED_1BIT: + case LV_IMG_CF_INDEXED_2BIT: + case LV_IMG_CF_INDEXED_4BIT: + case LV_IMG_CF_INDEXED_8BIT: + case LV_IMG_CF_ALPHA_1BIT: + case LV_IMG_CF_ALPHA_2BIT: + case LV_IMG_CF_ALPHA_4BIT: + case LV_IMG_CF_ALPHA_8BIT: + has_alpha = true; + break; + default: + has_alpha = false; + break; + } + + return has_alpha; +} + +/** + * Get the type of an image source + * @param src pointer to an image source: + * - pointer to an 'lv_img_t' variable (image stored internally and compiled into the code) + * - a path to a file (e.g. "S:/folder/image.bin") + * - or a symbol (e.g. LV_SYMBOL_CLOSE) + * @return type of the image source LV_IMG_SRC_VARIABLE/FILE/SYMBOL/UNKNOWN + */ +lv_img_src_t lv_img_src_get_type(const void * src) +{ + lv_img_src_t img_src_type = LV_IMG_SRC_UNKNOWN; + + if(src == NULL) return img_src_type; + const uint8_t * u8_p = src; + + /*The first byte shows the type of the image source*/ + if(u8_p[0] >= 0x20 && u8_p[0] <= 0x7F) { + img_src_type = LV_IMG_SRC_FILE; /*If it's an ASCII character then it's file name*/ + } + else if(u8_p[0] >= 0x80) { + img_src_type = LV_IMG_SRC_SYMBOL; /*Symbols begins after 0x7F*/ + } + else { + img_src_type = LV_IMG_SRC_VARIABLE; /*`lv_img_dsc_t` is draw to the first byte < 0x20*/ + } + + if(LV_IMG_SRC_UNKNOWN == img_src_type) { + LV_LOG_WARN("lv_img_src_get_type: unknown image type"); + } + + return img_src_type; +} + +void lv_draw_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, + const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t color_format) +{ + if(draw_ctx->draw_img_decoded == NULL) return; + + draw_ctx->draw_img_decoded(draw_ctx, dsc, coords, map_p, color_format); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +LV_ATTRIBUTE_FAST_MEM static lv_res_t decode_and_draw(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * draw_dsc, + const lv_area_t * coords, const void * src) +{ + if(draw_dsc->opa <= LV_OPA_MIN) return LV_RES_OK; + + _lv_img_cache_entry_t * cdsc = _lv_img_cache_open(src, draw_dsc->recolor, draw_dsc->frame_id); + + if(cdsc == NULL) return LV_RES_INV; + + lv_img_cf_t cf; + if(lv_img_cf_is_chroma_keyed(cdsc->dec_dsc.header.cf)) cf = LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED; + else if(LV_IMG_CF_ALPHA_8BIT == cdsc->dec_dsc.header.cf) cf = LV_IMG_CF_ALPHA_8BIT; + else if(LV_IMG_CF_RGB565A8 == cdsc->dec_dsc.header.cf) cf = LV_IMG_CF_RGB565A8; + else if(lv_img_cf_has_alpha(cdsc->dec_dsc.header.cf)) cf = LV_IMG_CF_TRUE_COLOR_ALPHA; + else cf = LV_IMG_CF_TRUE_COLOR; + + if(cf == LV_IMG_CF_ALPHA_8BIT) { + if(draw_dsc->angle || draw_dsc->zoom != LV_IMG_ZOOM_NONE) { + /* resume normal method */ + cf = LV_IMG_CF_TRUE_COLOR_ALPHA; + cdsc->dec_dsc.img_data = NULL; + } + } + + if(cdsc->dec_dsc.error_msg != NULL) { + LV_LOG_WARN("Image draw error"); + + show_error(draw_ctx, coords, cdsc->dec_dsc.error_msg); + } + /*The decoder could open the image and gave the entire uncompressed image. + *Just draw it!*/ + else if(cdsc->dec_dsc.img_data) { + lv_area_t map_area_rot; + lv_area_copy(&map_area_rot, coords); + if(draw_dsc->angle || draw_dsc->zoom != LV_IMG_ZOOM_NONE) { + int32_t w = lv_area_get_width(coords); + int32_t h = lv_area_get_height(coords); + + _lv_img_buf_get_transformed_area(&map_area_rot, w, h, draw_dsc->angle, draw_dsc->zoom, &draw_dsc->pivot); + + map_area_rot.x1 += coords->x1; + map_area_rot.y1 += coords->y1; + map_area_rot.x2 += coords->x1; + map_area_rot.y2 += coords->y1; + } + + lv_area_t clip_com; /*Common area of mask and coords*/ + bool union_ok; + union_ok = _lv_area_intersect(&clip_com, draw_ctx->clip_area, &map_area_rot); + /*Out of mask. There is nothing to draw so the image is drawn successfully.*/ + if(union_ok == false) { + draw_cleanup(cdsc); + return LV_RES_OK; + } + + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + draw_ctx->clip_area = &clip_com; + lv_draw_img_decoded(draw_ctx, draw_dsc, coords, cdsc->dec_dsc.img_data, cf); + draw_ctx->clip_area = clip_area_ori; + } + /*The whole uncompressed image is not available. Try to read it line-by-line*/ + else { + lv_area_t mask_com; /*Common area of mask and coords*/ + bool union_ok; + union_ok = _lv_area_intersect(&mask_com, draw_ctx->clip_area, coords); + /*Out of mask. There is nothing to draw so the image is drawn successfully.*/ + if(union_ok == false) { + draw_cleanup(cdsc); + return LV_RES_OK; + } + + int32_t width = lv_area_get_width(&mask_com); + + uint8_t * buf = lv_mem_buf_get(lv_area_get_width(&mask_com) * + LV_IMG_PX_SIZE_ALPHA_BYTE); /*+1 because of the possible alpha byte*/ + + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + lv_area_t line; + lv_area_copy(&line, &mask_com); + lv_area_set_height(&line, 1); + int32_t x = mask_com.x1 - coords->x1; + int32_t y = mask_com.y1 - coords->y1; + int32_t row; + lv_res_t read_res; + for(row = mask_com.y1; row <= mask_com.y2; row++) { + lv_area_t mask_line; + union_ok = _lv_area_intersect(&mask_line, clip_area_ori, &line); + if(union_ok == false) continue; + + read_res = lv_img_decoder_read_line(&cdsc->dec_dsc, x, y, width, buf); + if(read_res != LV_RES_OK) { + lv_img_decoder_close(&cdsc->dec_dsc); + LV_LOG_WARN("Image draw can't read the line"); + lv_mem_buf_release(buf); + draw_cleanup(cdsc); + draw_ctx->clip_area = clip_area_ori; + return LV_RES_INV; + } + + draw_ctx->clip_area = &mask_line; + lv_draw_img_decoded(draw_ctx, draw_dsc, &line, buf, cf); + line.y1++; + line.y2++; + y++; + } + draw_ctx->clip_area = clip_area_ori; + lv_mem_buf_release(buf); + } + + draw_cleanup(cdsc); + return LV_RES_OK; +} + + +static void show_error(lv_draw_ctx_t * draw_ctx, const lv_area_t * coords, const char * msg) +{ + lv_draw_rect_dsc_t rect_dsc; + lv_draw_rect_dsc_init(&rect_dsc); + rect_dsc.bg_color = lv_color_white(); + lv_draw_rect(draw_ctx, &rect_dsc, coords); + + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + lv_draw_label(draw_ctx, &label_dsc, coords, msg, NULL); +} + +static void draw_cleanup(_lv_img_cache_entry_t * cache) +{ + /*Automatically close images with no caching*/ +#if LV_IMG_CACHE_DEF_SIZE == 0 + lv_img_decoder_close(&cache->dec_dsc); +#else + LV_UNUSED(cache); +#endif +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_img.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_img.h new file mode 100644 index 0000000..a88a33c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_img.h @@ -0,0 +1,104 @@ +/** + * @file lv_draw_img.h + * + */ + +#ifndef LV_DRAW_IMG_H +#define LV_DRAW_IMG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_img_decoder.h" +#include "lv_img_buf.h" +#include "../misc/lv_style.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + + int16_t angle; + uint16_t zoom; + lv_point_t pivot; + + lv_color_t recolor; + lv_opa_t recolor_opa; + + lv_opa_t opa; + lv_blend_mode_t blend_mode : 4; + + int32_t frame_id; + uint8_t antialias : 1; +} lv_draw_img_dsc_t; + +struct _lv_draw_ctx_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_img_dsc_init(lv_draw_img_dsc_t * dsc); +/** + * Draw an image + * @param coords the coordinates of the image + * @param mask the image will be drawn only in this area + * @param src pointer to a lv_color_t array which contains the pixels of the image + * @param dsc pointer to an initialized `lv_draw_img_dsc_t` variable + */ +void lv_draw_img(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, const lv_area_t * coords, + const void * src); + + +void lv_draw_img_decoded(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, + const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t color_format); + +/** + * Get the type of an image source + * @param src pointer to an image source: + * - pointer to an 'lv_img_t' variable (image stored internally and compiled into the code) + * - a path to a file (e.g. "S:/folder/image.bin") + * - or a symbol (e.g. LV_SYMBOL_CLOSE) + * @return type of the image source LV_IMG_SRC_VARIABLE/FILE/SYMBOL/UNKNOWN + */ +lv_img_src_t lv_img_src_get_type(const void * src); + +/** + * Get the pixel size of a color format in bits + * @param cf a color format (`LV_IMG_CF_...`) + * @return the pixel size in bits + */ +uint8_t lv_img_cf_get_px_size(lv_img_cf_t cf); + +/** + * Check if a color format is chroma keyed or not + * @param cf a color format (`LV_IMG_CF_...`) + * @return true: chroma keyed; false: not chroma keyed + */ +bool lv_img_cf_is_chroma_keyed(lv_img_cf_t cf); + +/** + * Check if a color format has alpha channel or not + * @param cf a color format (`LV_IMG_CF_...`) + * @return true: has alpha channel; false: doesn't have alpha channel + */ +bool lv_img_cf_has_alpha(lv_img_cf_t cf); + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_IMG_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_label.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_label.c new file mode 100644 index 0000000..7f80df4 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_label.c @@ -0,0 +1,417 @@ +/** + * @file lv_draw_label.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw.h" +#include "lv_draw_label.h" +#include "../misc/lv_math.h" +#include "../hal/lv_hal_disp.h" +#include "../core/lv_refr.h" +#include "../misc/lv_bidi.h" +#include "../misc/lv_assert.h" + +/********************* + * DEFINES + *********************/ +#define LABEL_RECOLOR_PAR_LENGTH 6 +#define LV_LABEL_HINT_UPDATE_TH 1024 /*Update the "hint" if the label's y coordinates have changed more then this*/ + +/********************** + * TYPEDEFS + **********************/ +enum { + CMD_STATE_WAIT, + CMD_STATE_PAR, + CMD_STATE_IN, +}; +typedef uint8_t cmd_state_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static uint8_t hex_char_to_num(char hex); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc) +{ + lv_memset_00(dsc, sizeof(lv_draw_label_dsc_t)); + dsc->opa = LV_OPA_COVER; + dsc->color = lv_color_black(); + dsc->font = LV_FONT_DEFAULT; + dsc->sel_start = LV_DRAW_LABEL_NO_TXT_SEL; + dsc->sel_end = LV_DRAW_LABEL_NO_TXT_SEL; + dsc->sel_color = lv_color_black(); + dsc->sel_bg_color = lv_palette_main(LV_PALETTE_BLUE); + dsc->bidi_dir = LV_BASE_DIR_LTR; +} + +/** + * Write a text + * @param coords coordinates of the label + * @param mask the label will be drawn only in this area + * @param dsc pointer to draw descriptor + * @param txt `\0` terminated text to write + * @param hint pointer to a `lv_draw_label_hint_t` variable. + * It is managed by the draw to speed up the drawing of very long texts (thousands of lines). + */ +LV_ATTRIBUTE_FAST_MEM void lv_draw_label(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords, const char * txt, lv_draw_label_hint_t * hint) +{ + if(dsc->opa <= LV_OPA_MIN) return; + if(dsc->font == NULL) { + LV_LOG_WARN("dsc->font == NULL"); + return; + } + + if(draw_ctx->draw_letter == NULL) { + LV_LOG_WARN("draw->draw_letter == NULL (there is no function to draw letters)"); + return; + } + + lv_draw_label_dsc_t dsc_mod = *dsc; + + const lv_font_t * font = dsc->font; + int32_t w; + + /*No need to waste processor time if string is empty*/ + if(txt == NULL || txt[0] == '\0') + return; + + lv_area_t clipped_area; + bool clip_ok = _lv_area_intersect(&clipped_area, coords, draw_ctx->clip_area); + if(!clip_ok) return; + + lv_text_align_t align = dsc->align; + lv_base_dir_t base_dir = dsc->bidi_dir; + + lv_bidi_calculate_align(&align, &base_dir, txt); + + if((dsc->flag & LV_TEXT_FLAG_EXPAND) == 0) { + /*Normally use the label's width as width*/ + w = lv_area_get_width(coords); + } + else { + /*If EXPAND is enabled then not limit the text's width to the object's width*/ + lv_point_t p; + lv_txt_get_size(&p, txt, dsc->font, dsc->letter_space, dsc->line_space, LV_COORD_MAX, + dsc->flag); + w = p.x; + } + + int32_t line_height_font = lv_font_get_line_height(font); + int32_t line_height = line_height_font + dsc->line_space; + + /*Init variables for the first line*/ + int32_t line_width = 0; + lv_point_t pos; + pos.x = coords->x1; + pos.y = coords->y1; + + int32_t x_ofs = 0; + int32_t y_ofs = 0; + x_ofs = dsc->ofs_x; + y_ofs = dsc->ofs_y; + pos.y += y_ofs; + + uint32_t line_start = 0; + int32_t last_line_start = -1; + + /*Check the hint to use the cached info*/ + if(hint && y_ofs == 0 && coords->y1 < 0) { + /*If the label changed too much recalculate the hint.*/ + if(LV_ABS(hint->coord_y - coords->y1) > LV_LABEL_HINT_UPDATE_TH - 2 * line_height) { + hint->line_start = -1; + } + last_line_start = hint->line_start; + } + + /*Use the hint if it's valid*/ + if(hint && last_line_start >= 0) { + line_start = last_line_start; + pos.y += hint->y; + } + + uint32_t line_end = line_start + _lv_txt_get_next_line(&txt[line_start], font, dsc->letter_space, w, NULL, dsc->flag); + + /*Go the first visible line*/ + while(pos.y + line_height_font < draw_ctx->clip_area->y1) { + /*Go to next line*/ + line_start = line_end; + line_end += _lv_txt_get_next_line(&txt[line_start], font, dsc->letter_space, w, NULL, dsc->flag); + pos.y += line_height; + + /*Save at the threshold coordinate*/ + if(hint && pos.y >= -LV_LABEL_HINT_UPDATE_TH && hint->line_start < 0) { + hint->line_start = line_start; + hint->y = pos.y - coords->y1; + hint->coord_y = coords->y1; + } + + if(txt[line_start] == '\0') return; + } + + /*Align to middle*/ + if(align == LV_TEXT_ALIGN_CENTER) { + line_width = lv_txt_get_width(&txt[line_start], line_end - line_start, font, dsc->letter_space, dsc->flag); + + pos.x += (lv_area_get_width(coords) - line_width) / 2; + + } + /*Align to the right*/ + else if(align == LV_TEXT_ALIGN_RIGHT) { + line_width = lv_txt_get_width(&txt[line_start], line_end - line_start, font, dsc->letter_space, dsc->flag); + pos.x += lv_area_get_width(coords) - line_width; + } + uint32_t sel_start = dsc->sel_start; + uint32_t sel_end = dsc->sel_end; + if(sel_start > sel_end) { + uint32_t tmp = sel_start; + sel_start = sel_end; + sel_end = tmp; + } + lv_draw_line_dsc_t line_dsc; + + if((dsc->decor & LV_TEXT_DECOR_UNDERLINE) || (dsc->decor & LV_TEXT_DECOR_STRIKETHROUGH)) { + lv_draw_line_dsc_init(&line_dsc); + line_dsc.color = dsc->color; + line_dsc.width = font->underline_thickness ? font->underline_thickness : 1; + line_dsc.opa = dsc->opa; + line_dsc.blend_mode = dsc->blend_mode; + } + + cmd_state_t cmd_state = CMD_STATE_WAIT; + uint32_t i; + uint32_t par_start = 0; + lv_color_t recolor = lv_color_black(); + lv_color_t color = lv_color_black(); + int32_t letter_w; + + lv_draw_rect_dsc_t draw_dsc_sel; + lv_draw_rect_dsc_init(&draw_dsc_sel); + draw_dsc_sel.bg_color = dsc->sel_bg_color; + + int32_t pos_x_start = pos.x; + /*Write out all lines*/ + while(txt[line_start] != '\0') { + pos.x += x_ofs; + + /*Write all letter of a line*/ + cmd_state = CMD_STATE_WAIT; + i = 0; +#if LV_USE_BIDI + char * bidi_txt = lv_mem_buf_get(line_end - line_start + 1); + _lv_bidi_process_paragraph(txt + line_start, bidi_txt, line_end - line_start, base_dir, NULL, 0); +#else + const char * bidi_txt = txt + line_start; +#endif + + while(i < line_end - line_start) { + uint32_t logical_char_pos = 0; + if(sel_start != 0xFFFF && sel_end != 0xFFFF) { +#if LV_USE_BIDI + logical_char_pos = _lv_txt_encoded_get_char_id(txt, line_start); + uint32_t t = _lv_txt_encoded_get_char_id(bidi_txt, i); + logical_char_pos += _lv_bidi_get_logical_pos(bidi_txt, NULL, line_end - line_start, base_dir, t, NULL); +#else + logical_char_pos = _lv_txt_encoded_get_char_id(txt, line_start + i); +#endif + } + + uint32_t letter; + uint32_t letter_next; + _lv_txt_encoded_letter_next_2(bidi_txt, &letter, &letter_next, &i); + /*Handle the re-color command*/ + if((dsc->flag & LV_TEXT_FLAG_RECOLOR) != 0) { + if(letter == (uint32_t)LV_TXT_COLOR_CMD[0]) { + if(cmd_state == CMD_STATE_WAIT) { /*Start char*/ + par_start = i; + cmd_state = CMD_STATE_PAR; + continue; + } + else if(cmd_state == CMD_STATE_PAR) { /*Other start char in parameter escaped cmd. char*/ + cmd_state = CMD_STATE_WAIT; + } + else if(cmd_state == CMD_STATE_IN) { /*Command end*/ + cmd_state = CMD_STATE_WAIT; + continue; + } + } + + /*Skip the color parameter and wait the space after it*/ + if(cmd_state == CMD_STATE_PAR) { + if(letter == ' ') { + /*Get the parameter*/ + if(i - par_start == LABEL_RECOLOR_PAR_LENGTH + 1) { + char buf[LABEL_RECOLOR_PAR_LENGTH + 1]; + lv_memcpy_small(buf, &bidi_txt[par_start], LABEL_RECOLOR_PAR_LENGTH); + buf[LABEL_RECOLOR_PAR_LENGTH] = '\0'; + int r, g, b; + r = (hex_char_to_num(buf[0]) << 4) + hex_char_to_num(buf[1]); + g = (hex_char_to_num(buf[2]) << 4) + hex_char_to_num(buf[3]); + b = (hex_char_to_num(buf[4]) << 4) + hex_char_to_num(buf[5]); + recolor = lv_color_make(r, g, b); + } + else { + recolor.full = dsc->color.full; + } + cmd_state = CMD_STATE_IN; /*After the parameter the text is in the command*/ + } + continue; + } + } + + color = dsc->color; + + if(cmd_state == CMD_STATE_IN) color = recolor; + + letter_w = lv_font_get_glyph_width(font, letter, letter_next); + + if(sel_start != 0xFFFF && sel_end != 0xFFFF) { + if(logical_char_pos >= sel_start && logical_char_pos < sel_end) { + lv_area_t sel_coords; + sel_coords.x1 = pos.x; + sel_coords.y1 = pos.y; + sel_coords.x2 = pos.x + letter_w + dsc->letter_space - 1; + sel_coords.y2 = pos.y + line_height - 1; + lv_draw_rect(draw_ctx, &draw_dsc_sel, &sel_coords); + color = dsc->sel_color; + } + } + + dsc_mod.color = color; + lv_draw_letter(draw_ctx, &dsc_mod, &pos, letter); + + if(letter_w > 0) { + pos.x += letter_w + dsc->letter_space; + } + } + + if(dsc->decor & LV_TEXT_DECOR_STRIKETHROUGH) { + lv_point_t p1; + lv_point_t p2; + p1.x = pos_x_start; + p1.y = pos.y + (dsc->font->line_height / 2) + line_dsc.width / 2; + p2.x = pos.x; + p2.y = p1.y; + line_dsc.color = color; + lv_draw_line(draw_ctx, &line_dsc, &p1, &p2); + } + + if(dsc->decor & LV_TEXT_DECOR_UNDERLINE) { + lv_point_t p1; + lv_point_t p2; + p1.x = pos_x_start; + p1.y = pos.y + dsc->font->line_height - dsc->font->base_line - font->underline_position; + p2.x = pos.x; + p2.y = p1.y; + line_dsc.color = color; + lv_draw_line(draw_ctx, &line_dsc, &p1, &p2); + } + +#if LV_USE_BIDI + lv_mem_buf_release(bidi_txt); + bidi_txt = NULL; +#endif + /*Go to next line*/ + line_start = line_end; + line_end += _lv_txt_get_next_line(&txt[line_start], font, dsc->letter_space, w, NULL, dsc->flag); + + pos.x = coords->x1; + /*Align to middle*/ + if(align == LV_TEXT_ALIGN_CENTER) { + line_width = + lv_txt_get_width(&txt[line_start], line_end - line_start, font, dsc->letter_space, dsc->flag); + + pos.x += (lv_area_get_width(coords) - line_width) / 2; + + } + /*Align to the right*/ + else if(align == LV_TEXT_ALIGN_RIGHT) { + line_width = + lv_txt_get_width(&txt[line_start], line_end - line_start, font, dsc->letter_space, dsc->flag); + pos.x += lv_area_get_width(coords) - line_width; + } + + /*Go the next line position*/ + pos.y += line_height; + + if(pos.y > draw_ctx->clip_area->y2) return; + } + + LV_ASSERT_MEM_INTEGRITY(); +} + +void lv_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, + uint32_t letter) +{ + draw_ctx->draw_letter(draw_ctx, dsc, pos_p, letter); +} + + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Convert a hexadecimal characters to a number (0..15) + * @param hex Pointer to a hexadecimal character (0..9, A..F) + * @return the numerical value of `hex` or 0 on error + */ +static uint8_t hex_char_to_num(char hex) +{ + uint8_t result = 0; + + if(hex >= '0' && hex <= '9') { + result = hex - '0'; + } + else { + if(hex >= 'a') hex -= 'a' - 'A'; /*Convert to upper case*/ + + switch(hex) { + case 'A': + result = 10; + break; + case 'B': + result = 11; + break; + case 'C': + result = 12; + break; + case 'D': + result = 13; + break; + case 'E': + result = 14; + break; + case 'F': + result = 15; + break; + default: + result = 0; + break; + } + } + + return result; +} + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_label.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_label.h new file mode 100644 index 0000000..de72edd --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_label.h @@ -0,0 +1,100 @@ +/** + * @file lv_draw_label.h + * + */ + +#ifndef LV_DRAW_LABEL_H +#define LV_DRAW_LABEL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_bidi.h" +#include "../misc/lv_txt.h" +#include "../misc/lv_color.h" +#include "../misc/lv_style.h" + +/********************* + * DEFINES + *********************/ +#define LV_DRAW_LABEL_NO_TXT_SEL (0xFFFF) + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + const lv_font_t * font; + uint32_t sel_start; + uint32_t sel_end; + lv_color_t color; + lv_color_t sel_color; + lv_color_t sel_bg_color; + lv_coord_t line_space; + lv_coord_t letter_space; + lv_coord_t ofs_x; + lv_coord_t ofs_y; + lv_opa_t opa; + lv_base_dir_t bidi_dir; + lv_text_align_t align; + lv_text_flag_t flag; + lv_text_decor_t decor : 3; + lv_blend_mode_t blend_mode: 3; +} lv_draw_label_dsc_t; + +/** Store some info to speed up drawing of very large texts + * It takes a lot of time to get the first visible character because + * all the previous characters needs to be checked to calculate the positions. + * This structure stores an earlier (e.g. at -1000 px) coordinate and the index of that line. + * Therefore the calculations can start from here.*/ +typedef struct _lv_draw_label_hint_t { + /** Index of the line at `y` coordinate*/ + int32_t line_start; + + /** Give the `y` coordinate of the first letter at `line start` index. Relative to the label's coordinates*/ + int32_t y; + + /** The 'y1' coordinate of the label when the hint was saved. + * Used to invalidate the hint if the label has moved too much.*/ + int32_t coord_y; +} lv_draw_label_hint_t; + +struct _lv_draw_ctx_t; +/********************** + * GLOBAL PROTOTYPES + **********************/ + +LV_ATTRIBUTE_FAST_MEM void lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc); + +/** + * Write a text + * @param coords coordinates of the label + * @param mask the label will be drawn only in this area + * @param dsc pointer to draw descriptor + * @param txt `\0` terminated text to write + * @param hint pointer to a `lv_draw_label_hint_t` variable. + * It is managed by the draw to speed up the drawing of very long texts (thousands of lines). + */ +LV_ATTRIBUTE_FAST_MEM void lv_draw_label(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords, const char * txt, lv_draw_label_hint_t * hint); + +void lv_draw_letter(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, + uint32_t letter); + +/*********************** + * GLOBAL VARIABLES + ***********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_LABEL_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_layer.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_layer.c new file mode 100644 index 0000000..da35682 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_layer.c @@ -0,0 +1,93 @@ +/** + * @file lv_draw_layer.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw.h" +#include "lv_draw_arc.h" +#include "../core/lv_refr.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_draw_layer_ctx_t * lv_draw_layer_create(lv_draw_ctx_t * draw_ctx, const lv_area_t * layer_area, + lv_draw_layer_flags_t flags) +{ + if(draw_ctx->layer_init == NULL) return NULL; + + lv_draw_layer_ctx_t * layer_ctx = lv_mem_alloc(draw_ctx->layer_instance_size); + LV_ASSERT_MALLOC(layer_ctx); + if(layer_ctx == NULL) { + LV_LOG_WARN("Couldn't allocate a new layer context"); + return NULL; + } + + lv_memset_00(layer_ctx, draw_ctx->layer_instance_size); + + lv_disp_t * disp_refr = _lv_refr_get_disp_refreshing(); + layer_ctx->original.buf = draw_ctx->buf; + layer_ctx->original.buf_area = draw_ctx->buf_area; + layer_ctx->original.clip_area = draw_ctx->clip_area; + layer_ctx->original.screen_transp = disp_refr->driver->screen_transp; + layer_ctx->area_full = *layer_area; + + lv_draw_layer_ctx_t * init_layer_ctx = draw_ctx->layer_init(draw_ctx, layer_ctx, flags); + if(NULL == init_layer_ctx) { + lv_mem_free(layer_ctx); + } + return init_layer_ctx; +} + +void lv_draw_layer_adjust(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx, + lv_draw_layer_flags_t flags) +{ + if(draw_ctx->layer_adjust) draw_ctx->layer_adjust(draw_ctx, layer_ctx, flags); +} + +void lv_draw_layer_blend(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx, + lv_draw_img_dsc_t * draw_dsc) +{ + if(draw_ctx->layer_blend) draw_ctx->layer_blend(draw_ctx, layer_ctx, draw_dsc); +} + +void lv_draw_layer_destroy(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx) +{ + + lv_draw_wait_for_finish(draw_ctx); + draw_ctx->buf = layer_ctx->original.buf; + draw_ctx->buf_area = layer_ctx->original.buf_area; + draw_ctx->clip_area = layer_ctx->original.clip_area; + lv_disp_t * disp_refr = _lv_refr_get_disp_refreshing(); + disp_refr->driver->screen_transp = layer_ctx->original.screen_transp; + + if(draw_ctx->layer_destroy) draw_ctx->layer_destroy(draw_ctx, layer_ctx); + lv_mem_free(layer_ctx); +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_layer.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_layer.h new file mode 100644 index 0000000..cd64149 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_layer.h @@ -0,0 +1,83 @@ +/** + * @file lv_draw_layer.h + * + */ + +#ifndef LV_DRAW_LAYER_H +#define LV_DRAW_LAYER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +struct _lv_draw_ctx_t; +struct _lv_draw_layer_ctx_t; + +typedef enum { + LV_DRAW_LAYER_FLAG_NONE, + LV_DRAW_LAYER_FLAG_HAS_ALPHA, + LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE, +} lv_draw_layer_flags_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a new layer context. It is used to start and independent rendering session + * with the current draw_ctx + * @param draw_ctx pointer to the current draw context + * @param layer_area the coordinates of the layer + * @param flags OR-ed flags from @lv_draw_layer_flags_t + * @return pointer to the layer context, or NULL on error + */ +struct _lv_draw_layer_ctx_t * lv_draw_layer_create(struct _lv_draw_ctx_t * draw_ctx, const lv_area_t * layer_area, + lv_draw_layer_flags_t flags); + +/** + * Adjust the layer_ctx and/or draw_ctx based on the `layer_ctx->area_act`. + * It's called only if flags has `LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE` + * @param draw_ctx pointer to the current draw context + * @param layer_ctx pointer to a layer context + * @param flags OR-ed flags from @lv_draw_layer_flags_t + */ +void lv_draw_layer_adjust(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx, + lv_draw_layer_flags_t flags); + +/** + * Blend a rendered layer to `layer_ctx->area_act` + * @param draw_ctx pointer to the current draw context + * @param layer_ctx pointer to a layer context + * @param draw_dsc pointer to an image draw descriptor + */ +void lv_draw_layer_blend(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx, + lv_draw_img_dsc_t * draw_dsc); + +/** + * Destroy a layer context. + * @param draw_ctx pointer to the current draw context + * @param layer_ctx pointer to a layer context + */ +void lv_draw_layer_destroy(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_LAYER_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_line.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_line.c new file mode 100644 index 0000000..b4844db --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_line.c @@ -0,0 +1,56 @@ +/** + * @file lv_draw_line.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include +#include "../core/lv_refr.h" +#include "../misc/lv_math.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +LV_ATTRIBUTE_FAST_MEM void lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc) +{ + lv_memset_00(dsc, sizeof(lv_draw_line_dsc_t)); + dsc->width = 1; + dsc->opa = LV_OPA_COVER; + dsc->color = lv_color_black(); +} + +LV_ATTRIBUTE_FAST_MEM void lv_draw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, + const lv_point_t * point1, const lv_point_t * point2) +{ + if(dsc->width == 0) return; + if(dsc->opa <= LV_OPA_MIN) return; + + draw_ctx->draw_line(draw_ctx, dsc, point1, point2); +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_line.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_line.h new file mode 100644 index 0000000..d82ea51 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_line.h @@ -0,0 +1,67 @@ +/** + * @file lv_draw_line.h + * + */ + +#ifndef LV_DRAW_LINE_H +#define LV_DRAW_LINE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "../misc/lv_color.h" +#include "../misc/lv_area.h" +#include "../misc/lv_style.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_color_t color; + lv_coord_t width; + lv_coord_t dash_width; + lv_coord_t dash_gap; + lv_opa_t opa; + lv_blend_mode_t blend_mode : 2; + uint8_t round_start : 1; + uint8_t round_end : 1; + uint8_t raw_end : 1; /*Do not bother with perpendicular line ending if it's not visible for any reason*/ +} lv_draw_line_dsc_t; + +struct _lv_draw_ctx_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +LV_ATTRIBUTE_FAST_MEM void lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc); + +/** + * Draw a line + * @param point1 first point of the line + * @param point2 second point of the line + * @param clip the line will be drawn only in this area + * @param dsc pointer to an initialized `lv_draw_line_dsc_t` variable + */ +void lv_draw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, + const lv_point_t * point2); + + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_LINE_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_mask.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_mask.c new file mode 100644 index 0000000..2170da9 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_mask.c @@ -0,0 +1,1530 @@ +/** + * @file lv_mask.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw.h" +#if LV_DRAW_COMPLEX +#include "../misc/lv_math.h" +#include "../misc/lv_log.h" +#include "../misc/lv_assert.h" +#include "../misc/lv_gc.h" + +/********************* + * DEFINES + *********************/ +#define CIRCLE_CACHE_LIFE_MAX 1000 +#define CIRCLE_CACHE_AGING(life, r) life = LV_MIN(life + (r < 16 ? 1 : (r >> 4)), 1000) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_line(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_line_param_t * param); +LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_radius(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_radius_param_t * param); +LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_angle(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_angle_param_t * param); +LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_fade(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_fade_param_t * param); +LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_map(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_map_param_t * param); +LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_polygon(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_polygon_param_t * param); + +LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t line_mask_flat(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, + lv_coord_t len, + lv_draw_mask_line_param_t * p); +LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t line_mask_steep(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, + lv_coord_t len, + lv_draw_mask_line_param_t * p); + +static void circ_init(lv_point_t * c, lv_coord_t * tmp, lv_coord_t radius); +static bool circ_cont(lv_point_t * c); +static void circ_next(lv_point_t * c, lv_coord_t * tmp); +static void circ_calc_aa4(_lv_draw_mask_radius_circle_dsc_t * c, lv_coord_t radius); +static lv_opa_t * get_next_line(_lv_draw_mask_radius_circle_dsc_t * c, lv_coord_t y, lv_coord_t * len, + lv_coord_t * x_start); +LV_ATTRIBUTE_FAST_MEM static inline lv_opa_t mask_mix(lv_opa_t mask_act, lv_opa_t mask_new); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Add a draw mask. Everything drawn after it (until removing the mask) will be affected by the mask. + * @param param an initialized mask parameter. Only the pointer is saved. + * @param custom_id a custom pointer to identify the mask. Used in `lv_draw_mask_remove_custom`. + * @return the an integer, the ID of the mask. Can be used in `lv_draw_mask_remove_id`. + */ +int16_t lv_draw_mask_add(void * param, void * custom_id) +{ + /*Look for a free entry*/ + uint8_t i; + for(i = 0; i < _LV_MASK_MAX_NUM; i++) { + if(LV_GC_ROOT(_lv_draw_mask_list[i]).param == NULL) break; + } + + if(i >= _LV_MASK_MAX_NUM) { + LV_LOG_WARN("lv_mask_add: no place to add the mask"); + return LV_MASK_ID_INV; + } + + LV_GC_ROOT(_lv_draw_mask_list[i]).param = param; + LV_GC_ROOT(_lv_draw_mask_list[i]).custom_id = custom_id; + + return i; +} + +/** + * Apply the added buffers on a line. Used internally by the library's drawing routines. + * @param mask_buf store the result mask here. Has to be `len` byte long. Should be initialized with `0xFF`. + * @param abs_x absolute X coordinate where the line to calculate start + * @param abs_y absolute Y coordinate where the line to calculate start + * @param len length of the line to calculate (in pixel count) + * @return One of these values: + * - `LV_DRAW_MASK_RES_FULL_TRANSP`: the whole line is transparent. `mask_buf` is not set to zero + * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged + * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line + */ +LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, + lv_coord_t len) +{ + bool changed = false; + _lv_draw_mask_common_dsc_t * dsc; + + _lv_draw_mask_saved_t * m = LV_GC_ROOT(_lv_draw_mask_list); + + while(m->param) { + dsc = m->param; + lv_draw_mask_res_t res = LV_DRAW_MASK_RES_FULL_COVER; + res = dsc->cb(mask_buf, abs_x, abs_y, len, (void *)m->param); + if(res == LV_DRAW_MASK_RES_TRANSP) return LV_DRAW_MASK_RES_TRANSP; + else if(res == LV_DRAW_MASK_RES_CHANGED) changed = true; + + m++; + } + + return changed ? LV_DRAW_MASK_RES_CHANGED : LV_DRAW_MASK_RES_FULL_COVER; +} + +/** + * Apply the specified buffers on a line. Used internally by the library's drawing routines. + * @param mask_buf store the result mask here. Has to be `len` byte long. Should be initialized with `0xFF`. + * @param abs_x absolute X coordinate where the line to calculate start + * @param abs_y absolute Y coordinate where the line to calculate start + * @param len length of the line to calculate (in pixel count) + * @param ids ID array of added buffers + * @param ids_count number of ID array + * @return One of these values: + * - `LV_DRAW_MASK_RES_FULL_TRANSP`: the whole line is transparent. `mask_buf` is not set to zero + * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged + * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line + */ +LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply_ids(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, + lv_coord_t len, const int16_t * ids, int16_t ids_count) +{ + bool changed = false; + _lv_draw_mask_common_dsc_t * dsc; + + for(int i = 0; i < ids_count; i++) { + int16_t id = ids[i]; + if(id == LV_MASK_ID_INV) continue; + dsc = LV_GC_ROOT(_lv_draw_mask_list[id]).param; + if(!dsc) continue; + lv_draw_mask_res_t res = LV_DRAW_MASK_RES_FULL_COVER; + res = dsc->cb(mask_buf, abs_x, abs_y, len, dsc); + if(res == LV_DRAW_MASK_RES_TRANSP) return LV_DRAW_MASK_RES_TRANSP; + else if(res == LV_DRAW_MASK_RES_CHANGED) changed = true; + } + + return changed ? LV_DRAW_MASK_RES_CHANGED : LV_DRAW_MASK_RES_FULL_COVER; +} + +/** + * Remove a mask with a given ID + * @param id the ID of the mask. Returned by `lv_draw_mask_add` + * @return the parameter of the removed mask. + * If more masks have `custom_id` ID then the last mask's parameter will be returned + */ +void * lv_draw_mask_remove_id(int16_t id) +{ + _lv_draw_mask_common_dsc_t * p = NULL; + + if(id != LV_MASK_ID_INV) { + p = LV_GC_ROOT(_lv_draw_mask_list[id]).param; + LV_GC_ROOT(_lv_draw_mask_list[id]).param = NULL; + LV_GC_ROOT(_lv_draw_mask_list[id]).custom_id = NULL; + } + + return p; +} + +/** + * Remove all mask with a given custom ID + * @param custom_id a pointer used in `lv_draw_mask_add` + * @return return the parameter of the removed mask. + * If more masks have `custom_id` ID then the last mask's parameter will be returned + */ +void * lv_draw_mask_remove_custom(void * custom_id) +{ + _lv_draw_mask_common_dsc_t * p = NULL; + uint8_t i; + for(i = 0; i < _LV_MASK_MAX_NUM; i++) { + if(LV_GC_ROOT(_lv_draw_mask_list[i]).custom_id == custom_id) { + p = LV_GC_ROOT(_lv_draw_mask_list[i]).param; + lv_draw_mask_remove_id(i); + } + } + return p; +} + +/** + * Free the data from the parameter. + * It's called inside `lv_draw_mask_remove_id` and `lv_draw_mask_remove_custom` + * Needs to be called only in special cases when the mask is not added by `lv_draw_mask_add` + * and not removed by `lv_draw_mask_remove_id` or `lv_draw_mask_remove_custom` + * @param p pointer to a mask parameter + */ +void lv_draw_mask_free_param(void * p) +{ + _lv_draw_mask_common_dsc_t * pdsc = p; + if(pdsc->type == LV_DRAW_MASK_TYPE_RADIUS) { + lv_draw_mask_radius_param_t * radius_p = (lv_draw_mask_radius_param_t *) p; + if(radius_p->circle) { + if(radius_p->circle->life < 0) { + lv_mem_free(radius_p->circle->cir_opa); + lv_mem_free(radius_p->circle); + } + else { + radius_p->circle->used_cnt--; + } + } + } + else if(pdsc->type == LV_DRAW_MASK_TYPE_POLYGON) { + lv_draw_mask_polygon_param_t * poly_p = (lv_draw_mask_polygon_param_t *) p; + lv_mem_free(poly_p->cfg.points); + } +} + +void _lv_draw_mask_cleanup(void) +{ + uint8_t i; + for(i = 0; i < LV_CIRCLE_CACHE_SIZE; i++) { + if(LV_GC_ROOT(_lv_circle_cache[i]).buf) { + lv_mem_free(LV_GC_ROOT(_lv_circle_cache[i]).buf); + } + lv_memset_00(&LV_GC_ROOT(_lv_circle_cache[i]), sizeof(LV_GC_ROOT(_lv_circle_cache[i]))); + } +} + +/** + * Count the currently added masks + * @return number of active masks + */ +LV_ATTRIBUTE_FAST_MEM uint8_t lv_draw_mask_get_cnt(void) +{ + uint8_t cnt = 0; + uint8_t i; + for(i = 0; i < _LV_MASK_MAX_NUM; i++) { + if(LV_GC_ROOT(_lv_draw_mask_list[i]).param) cnt++; + } + return cnt; +} + +bool lv_draw_mask_is_any(const lv_area_t * a) +{ + if(a == NULL) return LV_GC_ROOT(_lv_draw_mask_list[0]).param ? true : false; + + uint8_t i; + for(i = 0; i < _LV_MASK_MAX_NUM; i++) { + _lv_draw_mask_common_dsc_t * comm_param = LV_GC_ROOT(_lv_draw_mask_list[i]).param; + if(comm_param == NULL) continue; + if(comm_param->type == LV_DRAW_MASK_TYPE_RADIUS) { + lv_draw_mask_radius_param_t * radius_param = LV_GC_ROOT(_lv_draw_mask_list[i]).param; + if(radius_param->cfg.outer) { + if(!_lv_area_is_out(a, &radius_param->cfg.rect, radius_param->cfg.radius)) return true; + } + else { + if(!_lv_area_is_in(a, &radius_param->cfg.rect, radius_param->cfg.radius)) return true; + } + } + else { + return true; + } + } + + return false; + +} + +/** + *Initialize a line mask from two points. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param p1x X coordinate of the first point of the line + * @param p1y Y coordinate of the first point of the line + * @param p2x X coordinate of the second point of the line + * @param p2y y coordinate of the second point of the line + * @param side and element of `lv_draw_mask_line_side_t` to describe which side to keep. + * With `LV_DRAW_MASK_LINE_SIDE_LEFT/RIGHT` and horizontal line all pixels are kept + * With `LV_DRAW_MASK_LINE_SIDE_TOP/BOTTOM` and vertical line all pixels are kept + */ +void lv_draw_mask_line_points_init(lv_draw_mask_line_param_t * param, lv_coord_t p1x, lv_coord_t p1y, lv_coord_t p2x, + lv_coord_t p2y, lv_draw_mask_line_side_t side) +{ + lv_memset_00(param, sizeof(lv_draw_mask_line_param_t)); + + if(p1y == p2y && side == LV_DRAW_MASK_LINE_SIDE_BOTTOM) { + p1y--; + p2y--; + } + + if(p1y > p2y) { + lv_coord_t t; + t = p2x; + p2x = p1x; + p1x = t; + + t = p2y; + p2y = p1y; + p1y = t; + } + + param->cfg.p1.x = p1x; + param->cfg.p1.y = p1y; + param->cfg.p2.x = p2x; + param->cfg.p2.y = p2y; + param->cfg.side = side; + + param->origo.x = p1x; + param->origo.y = p1y; + param->flat = (LV_ABS(p2x - p1x) > LV_ABS(p2y - p1y)) ? 1 : 0; + param->yx_steep = 0; + param->xy_steep = 0; + param->dsc.cb = (lv_draw_mask_xcb_t)lv_draw_mask_line; + param->dsc.type = LV_DRAW_MASK_TYPE_LINE; + + int32_t dx = p2x - p1x; + int32_t dy = p2y - p1y; + + if(param->flat) { + /*Normalize the steep. Delta x should be relative to delta x = 1024*/ + int32_t m; + + if(dx) { + m = (1L << 20) / dx; /*m is multiplier to normalize y (upscaled by 1024)*/ + param->yx_steep = (m * dy) >> 10; + } + + if(dy) { + m = (1L << 20) / dy; /*m is multiplier to normalize x (upscaled by 1024)*/ + param->xy_steep = (m * dx) >> 10; + } + param->steep = param->yx_steep; + } + else { + /*Normalize the steep. Delta y should be relative to delta x = 1024*/ + int32_t m; + + if(dy) { + m = (1L << 20) / dy; /*m is multiplier to normalize x (upscaled by 1024)*/ + param->xy_steep = (m * dx) >> 10; + } + + if(dx) { + m = (1L << 20) / dx; /*m is multiplier to normalize x (upscaled by 1024)*/ + param->yx_steep = (m * dy) >> 10; + } + param->steep = param->xy_steep; + } + + if(param->cfg.side == LV_DRAW_MASK_LINE_SIDE_LEFT) param->inv = 0; + else if(param->cfg.side == LV_DRAW_MASK_LINE_SIDE_RIGHT) param->inv = 1; + else if(param->cfg.side == LV_DRAW_MASK_LINE_SIDE_TOP) { + if(param->steep > 0) param->inv = 1; + else param->inv = 0; + } + else if(param->cfg.side == LV_DRAW_MASK_LINE_SIDE_BOTTOM) { + if(param->steep > 0) param->inv = 0; + else param->inv = 1; + } + + param->spx = param->steep >> 2; + if(param->steep < 0) param->spx = -param->spx; +} + +/** + *Initialize a line mask from a point and an angle. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param px X coordinate of a point of the line + * @param py X coordinate of a point of the line + * @param angle right 0 deg, bottom: 90 + * @param side and element of `lv_draw_mask_line_side_t` to describe which side to keep. + * With `LV_DRAW_MASK_LINE_SIDE_LEFT/RIGHT` and horizontal line all pixels are kept + * With `LV_DRAW_MASK_LINE_SIDE_TOP/BOTTOM` and vertical line all pixels are kept + */ +void lv_draw_mask_line_angle_init(lv_draw_mask_line_param_t * param, lv_coord_t p1x, lv_coord_t py, int16_t angle, + lv_draw_mask_line_side_t side) +{ + /*Find an optimal degree. + *lv_mask_line_points_init will swap the points to keep the smaller y in p1 + *Theoretically a line with `angle` or `angle+180` is the same only the points are swapped + *Find the degree which keeps the origo in place*/ + if(angle > 180) angle -= 180; /*> 180 will swap the origo*/ + + int32_t p2x; + int32_t p2y; + + p2x = (lv_trigo_sin(angle + 90) >> 5) + p1x; + p2y = (lv_trigo_sin(angle) >> 5) + py; + + lv_draw_mask_line_points_init(param, p1x, py, p2x, p2y, side); +} + +/** + * Initialize an angle mask. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param vertex_x X coordinate of the angle vertex (absolute coordinates) + * @param vertex_y Y coordinate of the angle vertex (absolute coordinates) + * @param start_angle start angle in degrees. 0 deg on the right, 90 deg, on the bottom + * @param end_angle end angle + */ +void lv_draw_mask_angle_init(lv_draw_mask_angle_param_t * param, lv_coord_t vertex_x, lv_coord_t vertex_y, + lv_coord_t start_angle, lv_coord_t end_angle) +{ + lv_draw_mask_line_side_t start_side; + lv_draw_mask_line_side_t end_side; + + /*Constrain the input angles*/ + if(start_angle < 0) + start_angle = 0; + else if(start_angle > 359) + start_angle = 359; + + if(end_angle < 0) + end_angle = 0; + else if(end_angle > 359) + end_angle = 359; + + if(end_angle < start_angle) { + param->delta_deg = 360 - start_angle + end_angle; + } + else { + param->delta_deg = LV_ABS(end_angle - start_angle); + } + + param->cfg.start_angle = start_angle; + param->cfg.end_angle = end_angle; + param->cfg.vertex_p.x = vertex_x; + param->cfg.vertex_p.y = vertex_y; + param->dsc.cb = (lv_draw_mask_xcb_t)lv_draw_mask_angle; + param->dsc.type = LV_DRAW_MASK_TYPE_ANGLE; + + LV_ASSERT_MSG(start_angle >= 0 && start_angle <= 360, "Unexpected start angle"); + + if(start_angle >= 0 && start_angle < 180) { + start_side = LV_DRAW_MASK_LINE_SIDE_LEFT; + } + else + start_side = LV_DRAW_MASK_LINE_SIDE_RIGHT; /*silence compiler*/ + + LV_ASSERT_MSG(end_angle >= 0 && start_angle <= 360, "Unexpected end angle"); + + if(end_angle >= 0 && end_angle < 180) { + end_side = LV_DRAW_MASK_LINE_SIDE_RIGHT; + } + else if(end_angle >= 180 && end_angle < 360) { + end_side = LV_DRAW_MASK_LINE_SIDE_LEFT; + } + else + end_side = LV_DRAW_MASK_LINE_SIDE_RIGHT; /*silence compiler*/ + + lv_draw_mask_line_angle_init(¶m->start_line, vertex_x, vertex_y, start_angle, start_side); + lv_draw_mask_line_angle_init(¶m->end_line, vertex_x, vertex_y, end_angle, end_side); +} + +/** + * Initialize a fade mask. + * @param param pointer to an `lv_draw_mask_radius_param_t` to initialize + * @param rect coordinates of the rectangle to affect (absolute coordinates) + * @param radius radius of the rectangle + * @param inv true: keep the pixels inside the rectangle; keep the pixels outside of the rectangle + */ +void lv_draw_mask_radius_init(lv_draw_mask_radius_param_t * param, const lv_area_t * rect, lv_coord_t radius, bool inv) +{ + lv_coord_t w = lv_area_get_width(rect); + lv_coord_t h = lv_area_get_height(rect); + int32_t short_side = LV_MIN(w, h); + if(radius > short_side >> 1) radius = short_side >> 1; + if(radius < 0) radius = 0; + + lv_area_copy(¶m->cfg.rect, rect); + param->cfg.radius = radius; + param->cfg.outer = inv ? 1 : 0; + param->dsc.cb = (lv_draw_mask_xcb_t)lv_draw_mask_radius; + param->dsc.type = LV_DRAW_MASK_TYPE_RADIUS; + + if(radius == 0) { + param->circle = NULL; + return; + } + + uint32_t i; + + /*Try to reuse a circle cache entry*/ + for(i = 0; i < LV_CIRCLE_CACHE_SIZE; i++) { + if(LV_GC_ROOT(_lv_circle_cache[i]).radius == radius) { + LV_GC_ROOT(_lv_circle_cache[i]).used_cnt++; + CIRCLE_CACHE_AGING(LV_GC_ROOT(_lv_circle_cache[i]).life, radius); + param->circle = &LV_GC_ROOT(_lv_circle_cache[i]); + return; + } + } + + /*If not found find a free entry with lowest life*/ + _lv_draw_mask_radius_circle_dsc_t * entry = NULL; + for(i = 0; i < LV_CIRCLE_CACHE_SIZE; i++) { + if(LV_GC_ROOT(_lv_circle_cache[i]).used_cnt == 0) { + if(!entry) entry = &LV_GC_ROOT(_lv_circle_cache[i]); + else if(LV_GC_ROOT(_lv_circle_cache[i]).life < entry->life) entry = &LV_GC_ROOT(_lv_circle_cache[i]); + } + } + + if(!entry) { + entry = lv_mem_alloc(sizeof(_lv_draw_mask_radius_circle_dsc_t)); + LV_ASSERT_MALLOC(entry); + lv_memset_00(entry, sizeof(_lv_draw_mask_radius_circle_dsc_t)); + entry->life = -1; + } + else { + entry->used_cnt++; + entry->life = 0; + CIRCLE_CACHE_AGING(entry->life, radius); + } + + param->circle = entry; + + circ_calc_aa4(param->circle, radius); +} + +/** + * Initialize a fade mask. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param coords coordinates of the area to affect (absolute coordinates) + * @param opa_top opacity on the top + * @param y_top at which coordinate start to change to opacity to `opa_bottom` + * @param opa_bottom opacity at the bottom + * @param y_bottom at which coordinate reach `opa_bottom`. + */ +void lv_draw_mask_fade_init(lv_draw_mask_fade_param_t * param, const lv_area_t * coords, lv_opa_t opa_top, + lv_coord_t y_top, + lv_opa_t opa_bottom, lv_coord_t y_bottom) +{ + lv_area_copy(¶m->cfg.coords, coords); + param->cfg.opa_top = opa_top; + param->cfg.opa_bottom = opa_bottom; + param->cfg.y_top = y_top; + param->cfg.y_bottom = y_bottom; + param->dsc.cb = (lv_draw_mask_xcb_t)lv_draw_mask_fade; + param->dsc.type = LV_DRAW_MASK_TYPE_FADE; +} + +/** + * Initialize a map mask. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param coords coordinates of the map (absolute coordinates) + * @param map array of bytes with the mask values + */ +void lv_draw_mask_map_init(lv_draw_mask_map_param_t * param, const lv_area_t * coords, const lv_opa_t * map) +{ + lv_area_copy(¶m->cfg.coords, coords); + param->cfg.map = map; + param->dsc.cb = (lv_draw_mask_xcb_t)lv_draw_mask_map; + param->dsc.type = LV_DRAW_MASK_TYPE_MAP; +} + +void lv_draw_mask_polygon_init(lv_draw_mask_polygon_param_t * param, const lv_point_t * points, uint16_t point_cnt) +{ + /*Join adjacent points if they are on the same coordinate*/ + lv_point_t * p = lv_mem_alloc(point_cnt * sizeof(lv_point_t)); + if(p == NULL) return; + uint16_t i; + uint16_t pcnt = 0; + p[0] = points[0]; + for(i = 0; i < point_cnt - 1; i++) { + if(points[i].x != points[i + 1].x || points[i].y != points[i + 1].y) { + p[pcnt] = points[i]; + pcnt++; + } + } + /*The first and the last points are also adjacent*/ + if(points[0].x != points[point_cnt - 1].x || points[0].y != points[point_cnt - 1].y) { + p[pcnt] = points[point_cnt - 1]; + pcnt++; + } + param->cfg.points = p; + param->cfg.point_cnt = pcnt; + param->dsc.cb = (lv_draw_mask_xcb_t)lv_draw_mask_polygon; + param->dsc.type = LV_DRAW_MASK_TYPE_POLYGON; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_line(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_line_param_t * p) +{ + /*Make to points relative to the vertex*/ + abs_y -= p->origo.y; + abs_x -= p->origo.x; + + /*Handle special cases*/ + if(p->steep == 0) { + /*Horizontal*/ + if(p->flat) { + /*Non sense: Can't be on the right/left of a horizontal line*/ + if(p->cfg.side == LV_DRAW_MASK_LINE_SIDE_LEFT || + p->cfg.side == LV_DRAW_MASK_LINE_SIDE_RIGHT) return LV_DRAW_MASK_RES_FULL_COVER; + else if(p->cfg.side == LV_DRAW_MASK_LINE_SIDE_TOP && abs_y + 1 < 0) return LV_DRAW_MASK_RES_FULL_COVER; + else if(p->cfg.side == LV_DRAW_MASK_LINE_SIDE_BOTTOM && abs_y > 0) return LV_DRAW_MASK_RES_FULL_COVER; + else { + return LV_DRAW_MASK_RES_TRANSP; + } + } + /*Vertical*/ + else { + /*Non sense: Can't be on the top/bottom of a vertical line*/ + if(p->cfg.side == LV_DRAW_MASK_LINE_SIDE_TOP || + p->cfg.side == LV_DRAW_MASK_LINE_SIDE_BOTTOM) return LV_DRAW_MASK_RES_FULL_COVER; + else if(p->cfg.side == LV_DRAW_MASK_LINE_SIDE_RIGHT && abs_x > 0) return LV_DRAW_MASK_RES_FULL_COVER; + else if(p->cfg.side == LV_DRAW_MASK_LINE_SIDE_LEFT) { + if(abs_x + len < 0) return LV_DRAW_MASK_RES_FULL_COVER; + else { + int32_t k = - abs_x; + if(k < 0) return LV_DRAW_MASK_RES_TRANSP; + if(k >= 0 && k < len) lv_memset_00(&mask_buf[k], len - k); + return LV_DRAW_MASK_RES_CHANGED; + } + } + else { + if(abs_x + len < 0) return LV_DRAW_MASK_RES_TRANSP; + else { + int32_t k = - abs_x; + if(k < 0) k = 0; + if(k >= len) return LV_DRAW_MASK_RES_TRANSP; + else if(k >= 0 && k < len) lv_memset_00(&mask_buf[0], k); + return LV_DRAW_MASK_RES_CHANGED; + } + } + } + } + + lv_draw_mask_res_t res; + if(p->flat) { + res = line_mask_flat(mask_buf, abs_x, abs_y, len, p); + } + else { + res = line_mask_steep(mask_buf, abs_x, abs_y, len, p); + } + + return res; +} + +LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t line_mask_flat(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, + lv_coord_t len, + lv_draw_mask_line_param_t * p) +{ + + int32_t y_at_x; + y_at_x = (int32_t)((int32_t)p->yx_steep * abs_x) >> 10; + + if(p->yx_steep > 0) { + if(y_at_x > abs_y) { + if(p->inv) { + return LV_DRAW_MASK_RES_FULL_COVER; + } + else { + return LV_DRAW_MASK_RES_TRANSP; + } + } + } + else { + if(y_at_x < abs_y) { + if(p->inv) { + return LV_DRAW_MASK_RES_FULL_COVER; + } + else { + return LV_DRAW_MASK_RES_TRANSP; + } + } + } + + /*At the end of the mask if the limit line is smaller than the mask's y. + *Then the mask is in the "good" area*/ + y_at_x = (int32_t)((int32_t)p->yx_steep * (abs_x + len)) >> 10; + if(p->yx_steep > 0) { + if(y_at_x < abs_y) { + if(p->inv) { + return LV_DRAW_MASK_RES_TRANSP; + } + else { + return LV_DRAW_MASK_RES_FULL_COVER; + } + } + } + else { + if(y_at_x > abs_y) { + if(p->inv) { + return LV_DRAW_MASK_RES_TRANSP; + } + else { + return LV_DRAW_MASK_RES_FULL_COVER; + } + } + } + + int32_t xe; + if(p->yx_steep > 0) xe = ((abs_y * 256) * p->xy_steep) >> 10; + else xe = (((abs_y + 1) * 256) * p->xy_steep) >> 10; + + int32_t xei = xe >> 8; + int32_t xef = xe & 0xFF; + + int32_t px_h; + if(xef == 0) px_h = 255; + else px_h = 255 - (((255 - xef) * p->spx) >> 8); + int32_t k = xei - abs_x; + lv_opa_t m; + + if(xef) { + if(k >= 0 && k < len) { + m = 255 - (((255 - xef) * (255 - px_h)) >> 9); + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + k++; + } + + while(px_h > p->spx) { + if(k >= 0 && k < len) { + m = px_h - (p->spx >> 1); + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + px_h -= p->spx; + k++; + if(k >= len) break; + } + + if(k < len && k >= 0) { + int32_t x_inters = (px_h * p->xy_steep) >> 10; + m = (x_inters * px_h) >> 9; + if(p->yx_steep < 0) m = 255 - m; + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + + if(p->inv) { + k = xei - abs_x; + if(k > len) { + return LV_DRAW_MASK_RES_TRANSP; + } + if(k >= 0) { + lv_memset_00(&mask_buf[0], k); + } + } + else { + k++; + if(k < 0) { + return LV_DRAW_MASK_RES_TRANSP; + } + if(k <= len) { + lv_memset_00(&mask_buf[k], len - k); + } + } + + return LV_DRAW_MASK_RES_CHANGED; +} + +LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t line_mask_steep(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, + lv_coord_t len, + lv_draw_mask_line_param_t * p) +{ + int32_t k; + int32_t x_at_y; + /*At the beginning of the mask if the limit line is greater than the mask's y. + *Then the mask is in the "wrong" area*/ + x_at_y = (int32_t)((int32_t)p->xy_steep * abs_y) >> 10; + if(p->xy_steep > 0) x_at_y++; + if(x_at_y < abs_x) { + if(p->inv) { + return LV_DRAW_MASK_RES_FULL_COVER; + } + else { + return LV_DRAW_MASK_RES_TRANSP; + } + } + + /*At the end of the mask if the limit line is smaller than the mask's y. + *Then the mask is in the "good" area*/ + x_at_y = (int32_t)((int32_t)p->xy_steep * (abs_y)) >> 10; + if(x_at_y > abs_x + len) { + if(p->inv) { + return LV_DRAW_MASK_RES_TRANSP; + } + else { + return LV_DRAW_MASK_RES_FULL_COVER; + } + } + + /*X start*/ + int32_t xs = ((abs_y * 256) * p->xy_steep) >> 10; + int32_t xsi = xs >> 8; + int32_t xsf = xs & 0xFF; + + /*X end*/ + int32_t xe = (((abs_y + 1) * 256) * p->xy_steep) >> 10; + int32_t xei = xe >> 8; + int32_t xef = xe & 0xFF; + + lv_opa_t m; + + k = xsi - abs_x; + if(xsi != xei && (p->xy_steep < 0 && xsf == 0)) { + xsf = 0xFF; + xsi = xei; + k--; + } + + if(xsi == xei) { + if(k >= 0 && k < len) { + m = (xsf + xef) >> 1; + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + k++; + + if(p->inv) { + k = xsi - abs_x; + if(k >= len) { + return LV_DRAW_MASK_RES_TRANSP; + } + if(k >= 0) lv_memset_00(&mask_buf[0], k); + + } + else { + if(k > len) k = len; + if(k == 0) return LV_DRAW_MASK_RES_TRANSP; + else if(k > 0) lv_memset_00(&mask_buf[k], len - k); + } + + } + else { + int32_t y_inters; + if(p->xy_steep < 0) { + y_inters = (xsf * (-p->yx_steep)) >> 10; + if(k >= 0 && k < len) { + m = (y_inters * xsf) >> 9; + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + k--; + + int32_t x_inters = ((255 - y_inters) * (-p->xy_steep)) >> 10; + + if(k >= 0 && k < len) { + m = 255 - (((255 - y_inters) * x_inters) >> 9); + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + + k += 2; + + if(p->inv) { + k = xsi - abs_x - 1; + + if(k > len) k = len; + else if(k > 0) lv_memset_00(&mask_buf[0], k); + + } + else { + if(k > len) return LV_DRAW_MASK_RES_FULL_COVER; + if(k >= 0) lv_memset_00(&mask_buf[k], len - k); + } + + } + else { + y_inters = ((255 - xsf) * p->yx_steep) >> 10; + if(k >= 0 && k < len) { + m = 255 - ((y_inters * (255 - xsf)) >> 9); + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + + k++; + + int32_t x_inters = ((255 - y_inters) * p->xy_steep) >> 10; + if(k >= 0 && k < len) { + m = ((255 - y_inters) * x_inters) >> 9; + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + k++; + + if(p->inv) { + k = xsi - abs_x; + if(k > len) return LV_DRAW_MASK_RES_TRANSP; + if(k >= 0) lv_memset_00(&mask_buf[0], k); + + } + else { + if(k > len) k = len; + if(k == 0) return LV_DRAW_MASK_RES_TRANSP; + else if(k > 0) lv_memset_00(&mask_buf[k], len - k); + } + } + } + + return LV_DRAW_MASK_RES_CHANGED; +} + +LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_angle(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_angle_param_t * p) +{ + int32_t rel_y = abs_y - p->cfg.vertex_p.y; + int32_t rel_x = abs_x - p->cfg.vertex_p.x; + + if(p->cfg.start_angle < 180 && p->cfg.end_angle < 180 && + p->cfg.start_angle != 0 && p->cfg.end_angle != 0 && + p->cfg.start_angle > p->cfg.end_angle) { + + if(abs_y < p->cfg.vertex_p.y) { + return LV_DRAW_MASK_RES_FULL_COVER; + } + + /*Start angle mask can work only from the end of end angle mask*/ + int32_t end_angle_first = (rel_y * p->end_line.xy_steep) >> 10; + int32_t start_angle_last = ((rel_y + 1) * p->start_line.xy_steep) >> 10; + + /*Do not let the line end cross the vertex else it will affect the opposite part*/ + if(p->cfg.start_angle > 270 && p->cfg.start_angle <= 359 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.start_angle > 0 && p->cfg.start_angle <= 90 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.start_angle > 90 && p->cfg.start_angle < 270 && start_angle_last > 0) start_angle_last = 0; + + if(p->cfg.end_angle > 270 && p->cfg.end_angle <= 359 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.end_angle > 0 && p->cfg.end_angle <= 90 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.end_angle > 90 && p->cfg.end_angle < 270 && start_angle_last > 0) start_angle_last = 0; + + int32_t dist = (end_angle_first - start_angle_last) >> 1; + + lv_draw_mask_res_t res1 = LV_DRAW_MASK_RES_FULL_COVER; + lv_draw_mask_res_t res2 = LV_DRAW_MASK_RES_FULL_COVER; + + int32_t tmp = start_angle_last + dist - rel_x; + if(tmp > len) tmp = len; + if(tmp > 0) { + res1 = lv_draw_mask_line(&mask_buf[0], abs_x, abs_y, tmp, &p->start_line); + if(res1 == LV_DRAW_MASK_RES_TRANSP) { + lv_memset_00(&mask_buf[0], tmp); + } + } + + if(tmp > len) tmp = len; + if(tmp < 0) tmp = 0; + res2 = lv_draw_mask_line(&mask_buf[tmp], abs_x + tmp, abs_y, len - tmp, &p->end_line); + if(res2 == LV_DRAW_MASK_RES_TRANSP) { + lv_memset_00(&mask_buf[tmp], len - tmp); + } + if(res1 == res2) return res1; + else return LV_DRAW_MASK_RES_CHANGED; + } + else if(p->cfg.start_angle > 180 && p->cfg.end_angle > 180 && p->cfg.start_angle > p->cfg.end_angle) { + + if(abs_y > p->cfg.vertex_p.y) { + return LV_DRAW_MASK_RES_FULL_COVER; + } + + /*Start angle mask can work only from the end of end angle mask*/ + int32_t end_angle_first = (rel_y * p->end_line.xy_steep) >> 10; + int32_t start_angle_last = ((rel_y + 1) * p->start_line.xy_steep) >> 10; + + /*Do not let the line end cross the vertex else it will affect the opposite part*/ + if(p->cfg.start_angle > 270 && p->cfg.start_angle <= 359 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.start_angle > 0 && p->cfg.start_angle <= 90 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.start_angle > 90 && p->cfg.start_angle < 270 && start_angle_last > 0) start_angle_last = 0; + + if(p->cfg.end_angle > 270 && p->cfg.end_angle <= 359 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.end_angle > 0 && p->cfg.end_angle <= 90 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.end_angle > 90 && p->cfg.end_angle < 270 && start_angle_last > 0) start_angle_last = 0; + + int32_t dist = (end_angle_first - start_angle_last) >> 1; + + lv_draw_mask_res_t res1 = LV_DRAW_MASK_RES_FULL_COVER; + lv_draw_mask_res_t res2 = LV_DRAW_MASK_RES_FULL_COVER; + + int32_t tmp = start_angle_last + dist - rel_x; + if(tmp > len) tmp = len; + if(tmp > 0) { + res1 = lv_draw_mask_line(&mask_buf[0], abs_x, abs_y, tmp, (lv_draw_mask_line_param_t *)&p->end_line); + if(res1 == LV_DRAW_MASK_RES_TRANSP) { + lv_memset_00(&mask_buf[0], tmp); + } + } + + if(tmp > len) tmp = len; + if(tmp < 0) tmp = 0; + res2 = lv_draw_mask_line(&mask_buf[tmp], abs_x + tmp, abs_y, len - tmp, (lv_draw_mask_line_param_t *)&p->start_line); + if(res2 == LV_DRAW_MASK_RES_TRANSP) { + lv_memset_00(&mask_buf[tmp], len - tmp); + } + if(res1 == res2) return res1; + else return LV_DRAW_MASK_RES_CHANGED; + } + else { + + lv_draw_mask_res_t res1 = LV_DRAW_MASK_RES_FULL_COVER; + lv_draw_mask_res_t res2 = LV_DRAW_MASK_RES_FULL_COVER; + + if(p->cfg.start_angle == 180) { + if(abs_y < p->cfg.vertex_p.y) res1 = LV_DRAW_MASK_RES_FULL_COVER; + else res1 = LV_DRAW_MASK_RES_UNKNOWN; + } + else if(p->cfg.start_angle == 0) { + if(abs_y < p->cfg.vertex_p.y) res1 = LV_DRAW_MASK_RES_UNKNOWN; + else res1 = LV_DRAW_MASK_RES_FULL_COVER; + } + else if((p->cfg.start_angle < 180 && abs_y < p->cfg.vertex_p.y) || + (p->cfg.start_angle > 180 && abs_y >= p->cfg.vertex_p.y)) { + res1 = LV_DRAW_MASK_RES_UNKNOWN; + } + else { + res1 = lv_draw_mask_line(mask_buf, abs_x, abs_y, len, &p->start_line); + } + + if(p->cfg.end_angle == 180) { + if(abs_y < p->cfg.vertex_p.y) res2 = LV_DRAW_MASK_RES_UNKNOWN; + else res2 = LV_DRAW_MASK_RES_FULL_COVER; + } + else if(p->cfg.end_angle == 0) { + if(abs_y < p->cfg.vertex_p.y) res2 = LV_DRAW_MASK_RES_FULL_COVER; + else res2 = LV_DRAW_MASK_RES_UNKNOWN; + } + else if((p->cfg.end_angle < 180 && abs_y < p->cfg.vertex_p.y) || + (p->cfg.end_angle > 180 && abs_y >= p->cfg.vertex_p.y)) { + res2 = LV_DRAW_MASK_RES_UNKNOWN; + } + else { + res2 = lv_draw_mask_line(mask_buf, abs_x, abs_y, len, &p->end_line); + } + + if(res1 == LV_DRAW_MASK_RES_TRANSP || res2 == LV_DRAW_MASK_RES_TRANSP) return LV_DRAW_MASK_RES_TRANSP; + else if(res1 == LV_DRAW_MASK_RES_UNKNOWN && res2 == LV_DRAW_MASK_RES_UNKNOWN) return LV_DRAW_MASK_RES_TRANSP; + else if(res1 == LV_DRAW_MASK_RES_FULL_COVER && res2 == LV_DRAW_MASK_RES_FULL_COVER) return LV_DRAW_MASK_RES_FULL_COVER; + else return LV_DRAW_MASK_RES_CHANGED; + } +} + + + +LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_radius(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_radius_param_t * p) +{ + bool outer = p->cfg.outer; + int32_t radius = p->cfg.radius; + lv_area_t rect; + lv_area_copy(&rect, &p->cfg.rect); + + if(outer == false) { + if((abs_y < rect.y1 || abs_y > rect.y2)) { + return LV_DRAW_MASK_RES_TRANSP; + } + } + else { + if(abs_y < rect.y1 || abs_y > rect.y2) { + return LV_DRAW_MASK_RES_FULL_COVER; + } + } + + if((abs_x >= rect.x1 + radius && abs_x + len <= rect.x2 - radius) || + (abs_y >= rect.y1 + radius && abs_y <= rect.y2 - radius)) { + if(outer == false) { + /*Remove the edges*/ + int32_t last = rect.x1 - abs_x; + if(last > len) return LV_DRAW_MASK_RES_TRANSP; + if(last >= 0) { + lv_memset_00(&mask_buf[0], last); + } + + int32_t first = rect.x2 - abs_x + 1; + if(first <= 0) return LV_DRAW_MASK_RES_TRANSP; + else if(first < len) { + lv_memset_00(&mask_buf[first], len - first); + } + if(last == 0 && first == len) return LV_DRAW_MASK_RES_FULL_COVER; + else return LV_DRAW_MASK_RES_CHANGED; + } + else { + int32_t first = rect.x1 - abs_x; + if(first < 0) first = 0; + if(first <= len) { + int32_t last = rect.x2 - abs_x - first + 1; + if(first + last > len) last = len - first; + if(last >= 0) { + lv_memset_00(&mask_buf[first], last); + } + } + } + return LV_DRAW_MASK_RES_CHANGED; + } + // printf("exec: x:%d.. %d, y:%d: r:%d, %s\n", abs_x, abs_x + len - 1, abs_y, p->cfg.radius, p->cfg.outer ? "inv" : "norm"); + + + // if( abs_x == 276 && abs_x + len - 1 == 479 && abs_y == 63 && p->cfg.radius == 5 && p->cfg.outer == 1) { + // char x = 0; + // } + //exec: x:276.. 479, y:63: r:5, inv) + + int32_t k = rect.x1 - abs_x; /*First relevant coordinate on the of the mask*/ + int32_t w = lv_area_get_width(&rect); + int32_t h = lv_area_get_height(&rect); + abs_x -= rect.x1; + abs_y -= rect.y1; + + lv_coord_t aa_len; + lv_coord_t x_start; + lv_coord_t cir_y; + if(abs_y < radius) { + cir_y = radius - abs_y - 1; + } + else { + cir_y = abs_y - (h - radius); + } + lv_opa_t * aa_opa = get_next_line(p->circle, cir_y, &aa_len, &x_start); + lv_coord_t cir_x_right = k + w - radius + x_start; + lv_coord_t cir_x_left = k + radius - x_start - 1; + lv_coord_t i; + + if(outer == false) { + for(i = 0; i < aa_len; i++) { + lv_opa_t opa = aa_opa[aa_len - i - 1]; + if(cir_x_right + i >= 0 && cir_x_right + i < len) { + mask_buf[cir_x_right + i] = mask_mix(opa, mask_buf[cir_x_right + i]); + } + if(cir_x_left - i >= 0 && cir_x_left - i < len) { + mask_buf[cir_x_left - i] = mask_mix(opa, mask_buf[cir_x_left - i]); + } + } + + /*Clean the right side*/ + cir_x_right = LV_CLAMP(0, cir_x_right + i, len); + lv_memset_00(&mask_buf[cir_x_right], len - cir_x_right); + + /*Clean the left side*/ + cir_x_left = LV_CLAMP(0, cir_x_left - aa_len + 1, len); + lv_memset_00(&mask_buf[0], cir_x_left); + } + else { + for(i = 0; i < aa_len; i++) { + lv_opa_t opa = 255 - (aa_opa[aa_len - 1 - i]); + if(cir_x_right + i >= 0 && cir_x_right + i < len) { + mask_buf[cir_x_right + i] = mask_mix(opa, mask_buf[cir_x_right + i]); + } + if(cir_x_left - i >= 0 && cir_x_left - i < len) { + mask_buf[cir_x_left - i] = mask_mix(opa, mask_buf[cir_x_left - i]); + } + } + + lv_coord_t clr_start = LV_CLAMP(0, cir_x_left + 1, len); + lv_coord_t clr_len = LV_CLAMP(0, cir_x_right - clr_start, len - clr_start); + lv_memset_00(&mask_buf[clr_start], clr_len); + } + + return LV_DRAW_MASK_RES_CHANGED; +} + +LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_fade(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_fade_param_t * p) +{ + if(abs_y < p->cfg.coords.y1) return LV_DRAW_MASK_RES_FULL_COVER; + if(abs_y > p->cfg.coords.y2) return LV_DRAW_MASK_RES_FULL_COVER; + if(abs_x + len < p->cfg.coords.x1) return LV_DRAW_MASK_RES_FULL_COVER; + if(abs_x > p->cfg.coords.x2) return LV_DRAW_MASK_RES_FULL_COVER; + + if(abs_x + len > p->cfg.coords.x2) len -= abs_x + len - p->cfg.coords.x2 - 1; + + if(abs_x < p->cfg.coords.x1) { + int32_t x_ofs = 0; + x_ofs = p->cfg.coords.x1 - abs_x; + len -= x_ofs; + mask_buf += x_ofs; + } + + int32_t i; + + if(abs_y <= p->cfg.y_top) { + for(i = 0; i < len; i++) { + mask_buf[i] = mask_mix(mask_buf[i], p->cfg.opa_top); + } + return LV_DRAW_MASK_RES_CHANGED; + } + else if(abs_y >= p->cfg.y_bottom) { + for(i = 0; i < len; i++) { + mask_buf[i] = mask_mix(mask_buf[i], p->cfg.opa_bottom); + } + return LV_DRAW_MASK_RES_CHANGED; + } + else { + /*Calculate the opa proportionally*/ + int16_t opa_diff = p->cfg.opa_bottom - p->cfg.opa_top; + int32_t y_diff = p->cfg.y_bottom - p->cfg.y_top + 1; + lv_opa_t opa_act = (int32_t)((int32_t)(abs_y - p->cfg.y_top) * opa_diff) / y_diff; + opa_act += p->cfg.opa_top; + + for(i = 0; i < len; i++) { + mask_buf[i] = mask_mix(mask_buf[i], opa_act); + } + return LV_DRAW_MASK_RES_CHANGED; + } +} + +LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_map(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_map_param_t * p) +{ + /*Handle out of the mask cases*/ + if(abs_y < p->cfg.coords.y1) return LV_DRAW_MASK_RES_FULL_COVER; + if(abs_y > p->cfg.coords.y2) return LV_DRAW_MASK_RES_FULL_COVER; + if(abs_x + len < p->cfg.coords.x1) return LV_DRAW_MASK_RES_FULL_COVER; + if(abs_x > p->cfg.coords.x2) return LV_DRAW_MASK_RES_FULL_COVER; + + /*Got to the current row in the map*/ + const lv_opa_t * map_tmp = p->cfg.map; + map_tmp += (abs_y - p->cfg.coords.y1) * lv_area_get_width(&p->cfg.coords); + + if(abs_x + len > p->cfg.coords.x2) len -= abs_x + len - p->cfg.coords.x2 - 1; + + if(abs_x < p->cfg.coords.x1) { + int32_t x_ofs = 0; + x_ofs = p->cfg.coords.x1 - abs_x; + len -= x_ofs; + mask_buf += x_ofs; + } + else { + map_tmp += (abs_x - p->cfg.coords.x1); + } + + int32_t i; + for(i = 0; i < len; i++) { + mask_buf[i] = mask_mix(mask_buf[i], map_tmp[i]); + } + + return LV_DRAW_MASK_RES_CHANGED; +} + +LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_polygon(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_polygon_param_t * param) +{ + uint16_t i; + struct { + lv_point_t p1; + lv_point_t p2; + } lines[2], tmp; + uint16_t line_cnt = 0; + lv_memset_00(&lines, sizeof(lines)); + int psign_prev = 0; + for(i = 0; i < param->cfg.point_cnt; i++) { + lv_point_t p1 = param->cfg.points[i]; + lv_point_t p2 = param->cfg.points[i + 1 < param->cfg.point_cnt ? i + 1 : 0]; + int pdiff = p1.y - p2.y, psign = pdiff / LV_ABS(pdiff); + if(pdiff > 0) { + if(abs_y > p1.y || abs_y < p2.y) continue; + lines[line_cnt].p1 = p2; + lines[line_cnt].p2 = p1; + } + else { + if(abs_y < p1.y || abs_y > p2.y) continue; + lines[line_cnt].p1 = p1; + lines[line_cnt].p2 = p2; + } + if(psign_prev && psign_prev == psign) continue; + psign_prev = psign; + line_cnt++; + if(line_cnt == 2) break; + } + if(line_cnt != 2) return LV_DRAW_MASK_RES_TRANSP; + if(lines[0].p1.x > lines[1].p1.x || lines[0].p2.x > lines[1].p2.x) { + tmp = lines[0]; + lines[0] = lines[1]; + lines[1] = tmp; + } + lv_draw_mask_line_param_t line_p; + lv_draw_mask_line_points_init(&line_p, lines[0].p1.x, lines[0].p1.y, lines[0].p2.x, lines[0].p2.y, + LV_DRAW_MASK_LINE_SIDE_RIGHT); + if(line_p.steep == 0 && line_p.flat) { + lv_coord_t x1 = LV_MIN(lines[0].p1.x, lines[0].p2.x); + lv_coord_t x2 = LV_MAX(lines[0].p1.x, lines[0].p2.x); + for(i = 0; i < len; i++) { + mask_buf[i] = mask_mix(mask_buf[i], (abs_x + i >= x1 && abs_x + i <= x2) * 0xFF); + } + lv_draw_mask_free_param(&line_p); + return LV_DRAW_MASK_RES_CHANGED; + } + lv_draw_mask_res_t res1 = lv_draw_mask_line(mask_buf, abs_x, abs_y, len, &line_p); + lv_draw_mask_free_param(&line_p); + if(res1 == LV_DRAW_MASK_RES_TRANSP) { + return LV_DRAW_MASK_RES_TRANSP; + } + lv_draw_mask_line_points_init(&line_p, lines[1].p1.x, lines[1].p1.y, lines[1].p2.x, lines[1].p2.y, + LV_DRAW_MASK_LINE_SIDE_LEFT); + if(line_p.steep == 0 && line_p.flat) { + lv_coord_t x1 = LV_MIN(lines[1].p1.x, lines[1].p2.x); + lv_coord_t x2 = LV_MAX(lines[1].p1.x, lines[1].p2.x); + for(i = 0; i < len; i++) { + mask_buf[i] = mask_mix(mask_buf[i], (abs_x + i >= x1 && abs_x + i <= x2) * 0xFF); + } + lv_draw_mask_free_param(&line_p); + return LV_DRAW_MASK_RES_CHANGED; + } + lv_draw_mask_res_t res2 = lv_draw_mask_line(mask_buf, abs_x, abs_y, len, &line_p); + lv_draw_mask_free_param(&line_p); + if(res2 == LV_DRAW_MASK_RES_TRANSP) { + return LV_DRAW_MASK_RES_TRANSP; + } + if(res1 == LV_DRAW_MASK_RES_CHANGED || res2 == LV_DRAW_MASK_RES_CHANGED) return LV_DRAW_MASK_RES_CHANGED; + return res1; +} +/** + * Initialize the circle drawing + * @param c pointer to a point. The coordinates will be calculated here + * @param tmp point to a variable. It will store temporary data + * @param radius radius of the circle + */ +static void circ_init(lv_point_t * c, lv_coord_t * tmp, lv_coord_t radius) +{ + c->x = radius; + c->y = 0; + *tmp = 1 - radius; +} + +/** + * Test the circle drawing is ready or not + * @param c same as in circ_init + * @return true if the circle is not ready yet + */ +static bool circ_cont(lv_point_t * c) +{ + return c->y <= c->x ? true : false; +} + +/** + * Get the next point from the circle + * @param c same as in circ_init. The next point stored here. + * @param tmp same as in circ_init. + */ +static void circ_next(lv_point_t * c, lv_coord_t * tmp) +{ + + if(*tmp <= 0) { + (*tmp) += 2 * c->y + 3; /*Change in decision criterion for y -> y+1*/ + } + else { + (*tmp) += 2 * (c->y - c->x) + 5; /*Change for y -> y+1, x -> x-1*/ + c->x--; + } + c->y++; +} + +static void circ_calc_aa4(_lv_draw_mask_radius_circle_dsc_t * c, lv_coord_t radius) +{ + if(radius == 0) return; + c->radius = radius; + + /*Allocate buffers*/ + if(c->buf) lv_mem_free(c->buf); + + c->buf = lv_mem_alloc(radius * 6 + 6); /*Use uint16_t for opa_start_on_y and x_start_on_y*/ + LV_ASSERT_MALLOC(c->buf); + c->cir_opa = c->buf; + c->opa_start_on_y = (uint16_t *)(c->buf + 2 * radius + 2); + c->x_start_on_y = (uint16_t *)(c->buf + 4 * radius + 4); + + /*Special case, handle manually*/ + if(radius == 1) { + c->cir_opa[0] = 180; + c->opa_start_on_y[0] = 0; + c->opa_start_on_y[1] = 1; + c->x_start_on_y[0] = 0; + return; + } + + lv_coord_t * cir_x = lv_mem_buf_get((radius + 1) * 2 * 2 * sizeof(lv_coord_t)); + lv_coord_t * cir_y = &cir_x[(radius + 1) * 2]; + + uint32_t y_8th_cnt = 0; + lv_point_t cp; + lv_coord_t tmp; + circ_init(&cp, &tmp, radius * 4); /*Upscale by 4*/ + int32_t i; + + uint32_t x_int[4]; + uint32_t x_fract[4]; + lv_coord_t cir_size = 0; + x_int[0] = cp.x >> 2; + x_fract[0] = 0; + + /*Calculate an 1/8 circle*/ + while(circ_cont(&cp)) { + /*Calculate 4 point of the circle */ + for(i = 0; i < 4; i++) { + circ_next(&cp, &tmp); + if(circ_cont(&cp) == false) break; + x_int[i] = cp.x >> 2; + x_fract[i] = cp.x & 0x3; + } + if(i != 4) break; + + /*All lines on the same x when downscaled*/ + if(x_int[0] == x_int[3]) { + cir_x[cir_size] = x_int[0]; + cir_y[cir_size] = y_8th_cnt; + c->cir_opa[cir_size] = x_fract[0] + x_fract[1] + x_fract[2] + x_fract[3]; + c->cir_opa[cir_size] *= 16; + cir_size++; + } + /*Second line on new x when downscaled*/ + else if(x_int[0] != x_int[1]) { + cir_x[cir_size] = x_int[0]; + cir_y[cir_size] = y_8th_cnt; + c->cir_opa[cir_size] = x_fract[0]; + c->cir_opa[cir_size] *= 16; + cir_size++; + + cir_x[cir_size] = x_int[0] - 1; + cir_y[cir_size] = y_8th_cnt; + c->cir_opa[cir_size] = 1 * 4 + x_fract[1] + x_fract[2] + x_fract[3];; + c->cir_opa[cir_size] *= 16; + cir_size++; + } + /*Third line on new x when downscaled*/ + else if(x_int[0] != x_int[2]) { + cir_x[cir_size] = x_int[0]; + cir_y[cir_size] = y_8th_cnt; + c->cir_opa[cir_size] = x_fract[0] + x_fract[1]; + c->cir_opa[cir_size] *= 16; + cir_size++; + + cir_x[cir_size] = x_int[0] - 1; + cir_y[cir_size] = y_8th_cnt; + c->cir_opa[cir_size] = 2 * 4 + x_fract[2] + x_fract[3];; + c->cir_opa[cir_size] *= 16; + cir_size++; + } + /*Forth line on new x when downscaled*/ + else { + cir_x[cir_size] = x_int[0]; + cir_y[cir_size] = y_8th_cnt; + c->cir_opa[cir_size] = x_fract[0] + x_fract[1] + x_fract[2]; + c->cir_opa[cir_size] *= 16; + cir_size++; + + cir_x[cir_size] = x_int[0] - 1; + cir_y[cir_size] = y_8th_cnt; + c->cir_opa[cir_size] = 3 * 4 + x_fract[3];; + c->cir_opa[cir_size] *= 16; + cir_size++; + } + + y_8th_cnt++; + } + + /*The point on the 1/8 circle is special, calculate it manually*/ + int32_t mid = radius * 723; + int32_t mid_int = mid >> 10; + if(cir_x[cir_size - 1] != mid_int || cir_y[cir_size - 1] != mid_int) { + int32_t tmp_val = mid - (mid_int << 10); + if(tmp_val <= 512) { + tmp_val = tmp_val * tmp_val * 2; + tmp_val = tmp_val >> (10 + 6); + } + else { + tmp_val = 1024 - tmp_val; + tmp_val = tmp_val * tmp_val * 2; + tmp_val = tmp_val >> (10 + 6); + tmp_val = 15 - tmp_val; + } + + cir_x[cir_size] = mid_int; + cir_y[cir_size] = mid_int; + c->cir_opa[cir_size] = tmp_val; + c->cir_opa[cir_size] *= 16; + cir_size++; + } + + /*Build the second octet by mirroring the first*/ + for(i = cir_size - 2; i >= 0; i--, cir_size++) { + cir_x[cir_size] = cir_y[i]; + cir_y[cir_size] = cir_x[i]; + c->cir_opa[cir_size] = c->cir_opa[i]; + } + + lv_coord_t y = 0; + i = 0; + c->opa_start_on_y[0] = 0; + while(i < cir_size) { + c->opa_start_on_y[y] = i; + c->x_start_on_y[y] = cir_x[i]; + for(; cir_y[i] == y && i < (int32_t)cir_size; i++) { + c->x_start_on_y[y] = LV_MIN(c->x_start_on_y[y], cir_x[i]); + } + y++; + } + + lv_mem_buf_release(cir_x); +} + +static lv_opa_t * get_next_line(_lv_draw_mask_radius_circle_dsc_t * c, lv_coord_t y, lv_coord_t * len, + lv_coord_t * x_start) +{ + *len = c->opa_start_on_y[y + 1] - c->opa_start_on_y[y]; + *x_start = c->x_start_on_y[y]; + return &c->cir_opa[c->opa_start_on_y[y]]; +} + + +LV_ATTRIBUTE_FAST_MEM static inline lv_opa_t mask_mix(lv_opa_t mask_act, lv_opa_t mask_new) +{ + if(mask_new >= LV_OPA_MAX) return mask_act; + if(mask_new <= LV_OPA_MIN) return 0; + + return LV_UDIV255(mask_act * mask_new);// >> 8); +} + + +#endif /*LV_DRAW_COMPLEX*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_mask.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_mask.h new file mode 100644 index 0000000..b7e4e1c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_mask.h @@ -0,0 +1,394 @@ +/** + * @file lv_draw_mask.h + * + */ + +#ifndef LV_DRAW_MASK_H +#define LV_DRAW_MASK_H + +#ifdef __cplusplus +extern "C" { +#endif + + +/********************* + * INCLUDES + *********************/ +#include +#include "../misc/lv_area.h" +#include "../misc/lv_color.h" +#include "../misc/lv_math.h" + +/********************* + * DEFINES + *********************/ +#define LV_MASK_ID_INV (-1) +#if LV_DRAW_COMPLEX +# define _LV_MASK_MAX_NUM 16 +#else +# define _LV_MASK_MAX_NUM 1 +#endif + +/********************** + * TYPEDEFS + **********************/ + +enum { + LV_DRAW_MASK_RES_TRANSP, + LV_DRAW_MASK_RES_FULL_COVER, + LV_DRAW_MASK_RES_CHANGED, + LV_DRAW_MASK_RES_UNKNOWN +}; + +typedef uint8_t lv_draw_mask_res_t; + +typedef struct { + void * param; + void * custom_id; +} _lv_draw_mask_saved_t; + +typedef _lv_draw_mask_saved_t _lv_draw_mask_saved_arr_t[_LV_MASK_MAX_NUM]; + + + +#if LV_DRAW_COMPLEX == 0 +static inline uint8_t lv_draw_mask_get_cnt(void) +{ + return 0; +} + +static inline bool lv_draw_mask_is_any(const lv_area_t * a) +{ + LV_UNUSED(a); + return false; +} + +#endif + +#if LV_DRAW_COMPLEX + +enum { + LV_DRAW_MASK_TYPE_LINE, + LV_DRAW_MASK_TYPE_ANGLE, + LV_DRAW_MASK_TYPE_RADIUS, + LV_DRAW_MASK_TYPE_FADE, + LV_DRAW_MASK_TYPE_MAP, + LV_DRAW_MASK_TYPE_POLYGON, +}; + +typedef uint8_t lv_draw_mask_type_t; + +enum { + LV_DRAW_MASK_LINE_SIDE_LEFT = 0, + LV_DRAW_MASK_LINE_SIDE_RIGHT, + LV_DRAW_MASK_LINE_SIDE_TOP, + LV_DRAW_MASK_LINE_SIDE_BOTTOM, +}; + +/** + * A common callback type for every mask type. + * Used internally by the library. + */ +typedef lv_draw_mask_res_t (*lv_draw_mask_xcb_t)(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, + lv_coord_t len, + void * p); + +typedef uint8_t lv_draw_mask_line_side_t; + +typedef struct { + lv_draw_mask_xcb_t cb; + lv_draw_mask_type_t type; +} _lv_draw_mask_common_dsc_t; + +typedef struct { + /*The first element must be the common descriptor*/ + _lv_draw_mask_common_dsc_t dsc; + + struct { + /*First point*/ + lv_point_t p1; + + /*Second point*/ + lv_point_t p2; + + /*Which side to keep?*/ + lv_draw_mask_line_side_t side : 2; + } cfg; + + /*A point of the line*/ + lv_point_t origo; + + /*X / (1024*Y) steepness (X is 0..1023 range). What is the change of X in 1024 Y?*/ + int32_t xy_steep; + + /*Y / (1024*X) steepness (Y is 0..1023 range). What is the change of Y in 1024 X?*/ + int32_t yx_steep; + + /*Helper which stores yx_steep for flat lines and xy_steep for steep (non flat) lines*/ + int32_t steep; + + /*Steepness in 1 px in 0..255 range. Used only by flat lines.*/ + int32_t spx; + + /*1: It's a flat line? (Near to horizontal)*/ + uint8_t flat : 1; + + /*Invert the mask. The default is: Keep the left part. + *It is used to select left/right/top/bottom*/ + uint8_t inv: 1; +} lv_draw_mask_line_param_t; + +typedef struct { + /*The first element must be the common descriptor*/ + _lv_draw_mask_common_dsc_t dsc; + + struct { + lv_point_t vertex_p; + lv_coord_t start_angle; + lv_coord_t end_angle; + } cfg; + + lv_draw_mask_line_param_t start_line; + lv_draw_mask_line_param_t end_line; + uint16_t delta_deg; +} lv_draw_mask_angle_param_t; + +typedef struct { + uint8_t * buf; + lv_opa_t * cir_opa; /*Opacity of values on the circumference of an 1/4 circle*/ + uint16_t * x_start_on_y; /*The x coordinate of the circle for each y value*/ + uint16_t * opa_start_on_y; /*The index of `cir_opa` for each y value*/ + int32_t life; /*How many times the entry way used*/ + uint32_t used_cnt; /*Like a semaphore to count the referencing masks*/ + lv_coord_t radius; /*The radius of the entry*/ +} _lv_draw_mask_radius_circle_dsc_t; + +typedef _lv_draw_mask_radius_circle_dsc_t _lv_draw_mask_radius_circle_dsc_arr_t[LV_CIRCLE_CACHE_SIZE]; + +typedef struct { + /*The first element must be the common descriptor*/ + _lv_draw_mask_common_dsc_t dsc; + + struct { + lv_area_t rect; + lv_coord_t radius; + /*Invert the mask. 0: Keep the pixels inside.*/ + uint8_t outer: 1; + } cfg; + + _lv_draw_mask_radius_circle_dsc_t * circle; +} lv_draw_mask_radius_param_t; + + +typedef struct { + /*The first element must be the common descriptor*/ + _lv_draw_mask_common_dsc_t dsc; + + struct { + lv_area_t coords; + lv_coord_t y_top; + lv_coord_t y_bottom; + lv_opa_t opa_top; + lv_opa_t opa_bottom; + } cfg; + +} lv_draw_mask_fade_param_t; + + +typedef struct _lv_draw_mask_map_param_t { + /*The first element must be the common descriptor*/ + _lv_draw_mask_common_dsc_t dsc; + + struct { + lv_area_t coords; + const lv_opa_t * map; + } cfg; +} lv_draw_mask_map_param_t; + +typedef struct { + /*The first element must be the common descriptor*/ + _lv_draw_mask_common_dsc_t dsc; + + struct { + lv_point_t * points; + uint16_t point_cnt; + } cfg; +} lv_draw_mask_polygon_param_t; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Add a draw mask. Everything drawn after it (until removing the mask) will be affected by the mask. + * @param param an initialized mask parameter. Only the pointer is saved. + * @param custom_id a custom pointer to identify the mask. Used in `lv_draw_mask_remove_custom`. + * @return the an integer, the ID of the mask. Can be used in `lv_draw_mask_remove_id`. + */ +int16_t lv_draw_mask_add(void * param, void * custom_id); + +//! @cond Doxygen_Suppress + +/** + * Apply the added buffers on a line. Used internally by the library's drawing routines. + * @param mask_buf store the result mask here. Has to be `len` byte long. Should be initialized with `0xFF`. + * @param abs_x absolute X coordinate where the line to calculate start + * @param abs_y absolute Y coordinate where the line to calculate start + * @param len length of the line to calculate (in pixel count) + * @return One of these values: + * - `LV_DRAW_MASK_RES_FULL_TRANSP`: the whole line is transparent. `mask_buf` is not set to zero + * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged + * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line + */ +LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, + lv_coord_t len); + +/** + * Apply the specified buffers on a line. Used internally by the library's drawing routines. + * @param mask_buf store the result mask here. Has to be `len` byte long. Should be initialized with `0xFF`. + * @param abs_x absolute X coordinate where the line to calculate start + * @param abs_y absolute Y coordinate where the line to calculate start + * @param len length of the line to calculate (in pixel count) + * @param ids ID array of added buffers + * @param ids_count number of ID array + * @return One of these values: + * - `LV_DRAW_MASK_RES_FULL_TRANSP`: the whole line is transparent. `mask_buf` is not set to zero + * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged + * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line + */ +LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply_ids(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, + lv_coord_t len, const int16_t * ids, int16_t ids_count); + +//! @endcond + +/** + * Remove a mask with a given ID + * @param id the ID of the mask. Returned by `lv_draw_mask_add` + * @return the parameter of the removed mask. + * If more masks have `custom_id` ID then the last mask's parameter will be returned + */ +void * lv_draw_mask_remove_id(int16_t id); + +/** + * Remove all mask with a given custom ID + * @param custom_id a pointer used in `lv_draw_mask_add` + * @return return the parameter of the removed mask. + * If more masks have `custom_id` ID then the last mask's parameter will be returned + */ +void * lv_draw_mask_remove_custom(void * custom_id); + +/** + * Free the data from the parameter. + * It's called inside `lv_draw_mask_remove_id` and `lv_draw_mask_remove_custom` + * Needs to be called only in special cases when the mask is not added by `lv_draw_mask_add` + * and not removed by `lv_draw_mask_remove_id` or `lv_draw_mask_remove_custom` + * @param p pointer to a mask parameter + */ +void lv_draw_mask_free_param(void * p); + +/** + * Called by LVGL the rendering of a screen is ready to clean up + * the temporal (cache) data of the masks + */ +void _lv_draw_mask_cleanup(void); + +//! @cond Doxygen_Suppress + +/** + * Count the currently added masks + * @return number of active masks + */ +LV_ATTRIBUTE_FAST_MEM uint8_t lv_draw_mask_get_cnt(void); + + +/** + * Check if there is any added draw mask + * @param a an area to test for affecting masks. + * @return true: there is t least 1 draw mask; false: there are no draw masks + */ +bool lv_draw_mask_is_any(const lv_area_t * a); + +//! @endcond + +/** + *Initialize a line mask from two points. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param p1x X coordinate of the first point of the line + * @param p1y Y coordinate of the first point of the line + * @param p2x X coordinate of the second point of the line + * @param p2y y coordinate of the second point of the line + * @param side and element of `lv_draw_mask_line_side_t` to describe which side to keep. + * With `LV_DRAW_MASK_LINE_SIDE_LEFT/RIGHT` and horizontal line all pixels are kept + * With `LV_DRAW_MASK_LINE_SIDE_TOP/BOTTOM` and vertical line all pixels are kept + */ +void lv_draw_mask_line_points_init(lv_draw_mask_line_param_t * param, lv_coord_t p1x, lv_coord_t p1y, lv_coord_t p2x, + lv_coord_t p2y, lv_draw_mask_line_side_t side); + +/** + *Initialize a line mask from a point and an angle. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param px X coordinate of a point of the line + * @param py X coordinate of a point of the line + * @param angle right 0 deg, bottom: 90 + * @param side and element of `lv_draw_mask_line_side_t` to describe which side to keep. + * With `LV_DRAW_MASK_LINE_SIDE_LEFT/RIGHT` and horizontal line all pixels are kept + * With `LV_DRAW_MASK_LINE_SIDE_TOP/BOTTOM` and vertical line all pixels are kept + */ +void lv_draw_mask_line_angle_init(lv_draw_mask_line_param_t * param, lv_coord_t p1x, lv_coord_t py, int16_t angle, + lv_draw_mask_line_side_t side); + +/** + * Initialize an angle mask. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param vertex_x X coordinate of the angle vertex (absolute coordinates) + * @param vertex_y Y coordinate of the angle vertex (absolute coordinates) + * @param start_angle start angle in degrees. 0 deg on the right, 90 deg, on the bottom + * @param end_angle end angle + */ +void lv_draw_mask_angle_init(lv_draw_mask_angle_param_t * param, lv_coord_t vertex_x, lv_coord_t vertex_y, + lv_coord_t start_angle, lv_coord_t end_angle); + +/** + * Initialize a fade mask. + * @param param pointer to an `lv_draw_mask_radius_param_t` to initialize + * @param rect coordinates of the rectangle to affect (absolute coordinates) + * @param radius radius of the rectangle + * @param inv true: keep the pixels inside the rectangle; keep the pixels outside of the rectangle + */ +void lv_draw_mask_radius_init(lv_draw_mask_radius_param_t * param, const lv_area_t * rect, lv_coord_t radius, bool inv); + +/** + * Initialize a fade mask. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param coords coordinates of the area to affect (absolute coordinates) + * @param opa_top opacity on the top + * @param y_top at which coordinate start to change to opacity to `opa_bottom` + * @param opa_bottom opacity at the bottom + * @param y_bottom at which coordinate reach `opa_bottom`. + */ +void lv_draw_mask_fade_init(lv_draw_mask_fade_param_t * param, const lv_area_t * coords, lv_opa_t opa_top, + lv_coord_t y_top, + lv_opa_t opa_bottom, lv_coord_t y_bottom); + +/** + * Initialize a map mask. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param coords coordinates of the map (absolute coordinates) + * @param map array of bytes with the mask values + */ +void lv_draw_mask_map_init(lv_draw_mask_map_param_t * param, const lv_area_t * coords, const lv_opa_t * map); + +void lv_draw_mask_polygon_init(lv_draw_mask_polygon_param_t * param, const lv_point_t * points, uint16_t point_cnt); + +#endif /*LV_DRAW_COMPLEX*/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_MASK_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_rect.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_rect.c new file mode 100644 index 0000000..f34854d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_rect.c @@ -0,0 +1,73 @@ +/** + * @file lv_draw_rect.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw.h" +#include "lv_draw_rect.h" +#include "../misc/lv_assert.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +LV_ATTRIBUTE_FAST_MEM void lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc) +{ + lv_memset_00(dsc, sizeof(lv_draw_rect_dsc_t)); + dsc->bg_color = lv_color_white(); + dsc->bg_grad.stops[0].color = lv_color_white(); + dsc->bg_grad.stops[1].color = lv_color_black(); + dsc->bg_grad.stops[1].frac = 0xFF; + dsc->bg_grad.stops_count = 2; + dsc->border_color = lv_color_black(); + dsc->shadow_color = lv_color_black(); + dsc->bg_img_symbol_font = LV_FONT_DEFAULT; + dsc->bg_opa = LV_OPA_COVER; + dsc->bg_img_opa = LV_OPA_COVER; + dsc->outline_opa = LV_OPA_COVER; + dsc->border_opa = LV_OPA_COVER; + dsc->shadow_opa = LV_OPA_COVER; + dsc->border_side = LV_BORDER_SIDE_FULL; +} + +/** + * Draw a rectangle + * @param coords the coordinates of the rectangle + * @param mask the rectangle will be drawn only in this mask + * @param dsc pointer to an initialized `lv_draw_rect_dsc_t` variable + */ +void lv_draw_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) +{ + if(lv_area_get_height(coords) < 1 || lv_area_get_width(coords) < 1) return; + + draw_ctx->draw_rect(draw_ctx, dsc, coords); + + LV_ASSERT_MEM_INTEGRITY(); +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_rect.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_rect.h new file mode 100644 index 0000000..1583e3e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_rect.h @@ -0,0 +1,96 @@ +/** + * @file lv_draw_rect.h + * + */ + +#ifndef LV_DRAW_RECT_H +#define LV_DRAW_RECT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "../misc/lv_color.h" +#include "../misc/lv_area.h" +#include "../misc/lv_style.h" +#include "sw/lv_draw_sw_gradient.h" + +/********************* + * DEFINES + *********************/ +#define LV_RADIUS_CIRCLE 0x7FFF /**< A very big radius to always draw as circle*/ +LV_EXPORT_CONST_INT(LV_RADIUS_CIRCLE); + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_coord_t radius; + lv_blend_mode_t blend_mode; + + /*Background*/ + lv_opa_t bg_opa; + lv_color_t bg_color; /**< First element of a gradient is a color, so it maps well here*/ + lv_grad_dsc_t bg_grad; + + /*Background img*/ + const void * bg_img_src; + const void * bg_img_symbol_font; + lv_color_t bg_img_recolor; + lv_opa_t bg_img_opa; + lv_opa_t bg_img_recolor_opa; + uint8_t bg_img_tiled; + + /*Border*/ + lv_color_t border_color; + lv_coord_t border_width; + lv_opa_t border_opa; + uint8_t border_post : 1; /*There is a border it will be drawn later.*/ + lv_border_side_t border_side : 5; + + /*Outline*/ + lv_color_t outline_color; + lv_coord_t outline_width; + lv_coord_t outline_pad; + lv_opa_t outline_opa; + + /*Shadow*/ + lv_color_t shadow_color; + lv_coord_t shadow_width; + lv_coord_t shadow_ofs_x; + lv_coord_t shadow_ofs_y; + lv_coord_t shadow_spread; + lv_opa_t shadow_opa; +} lv_draw_rect_dsc_t; + +struct _lv_draw_ctx_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +LV_ATTRIBUTE_FAST_MEM void lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc); + + +/** + * Draw a rectangle + * @param coords the coordinates of the rectangle + * @param clip the rectangle will be drawn only in this area + * @param dsc pointer to an initialized `lv_draw_rect_dsc_t` variable + */ +void lv_draw_rect(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_RECT_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_transform.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_transform.c new file mode 100644 index 0000000..580351d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_transform.c @@ -0,0 +1,54 @@ +/** + * @file lv_draw_transform.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw.h" +#include "lv_draw_transform.h" +#include "../misc/lv_assert.h" +#include "../misc/lv_area.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_transform(lv_draw_ctx_t * draw_ctx, const lv_area_t * dest_area, const void * src_buf, lv_coord_t src_w, + lv_coord_t src_h, + lv_coord_t src_stride, const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t cf, lv_color_t * cbuf, lv_opa_t * abuf) +{ + LV_ASSERT_NULL(draw_ctx); + if(draw_ctx->draw_transform == NULL) { + LV_LOG_WARN("draw_ctx->draw_transform == NULL"); + return; + } + + draw_ctx->draw_transform(draw_ctx, dest_area, src_buf, src_w, src_h, src_stride, draw_dsc, cf, cbuf, abuf); + +} + + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_transform.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_transform.h new file mode 100644 index 0000000..1926c2f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_transform.h @@ -0,0 +1,44 @@ +/** + * @file lv_draw_transform.h + * + */ + +#ifndef LV_DRAW_TRANSFORM_H +#define LV_DRAW_TRANSFORM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "../misc/lv_area.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +struct _lv_draw_ctx_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_transform(struct _lv_draw_ctx_t * draw_ctx, const lv_area_t * dest_area, const void * src_buf, + lv_coord_t src_w, lv_coord_t src_h, + lv_coord_t src_stride, const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t cf, lv_color_t * cbuf, lv_opa_t * abuf); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_TRANSFORM_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_triangle.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_triangle.c new file mode 100644 index 0000000..42b4d77 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_triangle.c @@ -0,0 +1,52 @@ +/** + * @file lv_draw_triangle.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw.h" +#include "lv_draw_triangle.h" +#include "../misc/lv_math.h" +#include "../misc/lv_mem.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_polygon(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * draw_dsc, const lv_point_t points[], + uint16_t point_cnt) +{ + draw_ctx->draw_polygon(draw_ctx, draw_dsc, points, point_cnt); +} + +void lv_draw_triangle(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * draw_dsc, const lv_point_t points[]) +{ + + draw_ctx->draw_polygon(draw_ctx, draw_dsc, points, 3); +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_triangle.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_triangle.h new file mode 100644 index 0000000..e8d8575 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_draw_triangle.h @@ -0,0 +1,42 @@ +/** + * @file lv_draw_triangle.h + * + */ + +#ifndef LV_DRAW_TRIANGLE_H +#define LV_DRAW_TRIANGLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_rect.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_polygon(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * draw_dsc, const lv_point_t points[], + uint16_t point_cnt); + +void lv_draw_triangle(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * draw_dsc, const lv_point_t points[]); +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_TRIANGLE_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_img_buf.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_img_buf.c new file mode 100644 index 0000000..4c939dd --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_img_buf.c @@ -0,0 +1,463 @@ +/** + * @file lv_img_buf.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include +#include +#include "lv_img_buf.h" +#include "lv_draw_img.h" +#include "../misc/lv_math.h" +#include "../misc/lv_log.h" +#include "../misc/lv_mem.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Get the color of an image's pixel + * @param dsc an image descriptor + * @param x x coordinate of the point to get + * @param y x coordinate of the point to get + * @param color the color of the image. In case of `LV_IMG_CF_ALPHA_1/2/4/8` this color is used. + * Not used in other cases. + * @param safe true: check out of bounds + * @return color of the point + */ +lv_color_t lv_img_buf_get_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t color) +{ + lv_color_t p_color = lv_color_black(); + uint8_t * buf_u8 = (uint8_t *)dsc->data; + + if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR || dsc->header.cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED || + dsc->header.cf == LV_IMG_CF_TRUE_COLOR_ALPHA || dsc->header.cf == LV_IMG_CF_RGB565A8) { + uint8_t px_size = lv_img_cf_get_px_size(dsc->header.cf) >> 3; + uint32_t px = dsc->header.w * y * px_size + x * px_size; + lv_memcpy_small(&p_color, &buf_u8[px], sizeof(lv_color_t)); +#if LV_COLOR_SIZE == 32 + p_color.ch.alpha = 0xFF; /*Only the color should be get so use a default alpha value*/ +#endif + } + else if(dsc->header.cf == LV_IMG_CF_INDEXED_1BIT) { + buf_u8 += 4 * 2; + uint8_t bit = x & 0x7; + x = x >> 3; + + /*Get the current pixel. + *dsc->header.w + 7 means rounding up to 8 because the lines are byte aligned + *so the possible real width are 8, 16, 24 ...*/ + uint32_t px = ((dsc->header.w + 7) >> 3) * y + x; + p_color.full = (buf_u8[px] & (1 << (7 - bit))) >> (7 - bit); + } + else if(dsc->header.cf == LV_IMG_CF_INDEXED_2BIT) { + buf_u8 += 4 * 4; + uint8_t bit = (x & 0x3) * 2; + x = x >> 2; + + /*Get the current pixel. + *dsc->header.w + 3 means rounding up to 4 because the lines are byte aligned + *so the possible real width are 4, 8, 12 ...*/ + uint32_t px = ((dsc->header.w + 3) >> 2) * y + x; + p_color.full = (buf_u8[px] & (3 << (6 - bit))) >> (6 - bit); + } + else if(dsc->header.cf == LV_IMG_CF_INDEXED_4BIT) { + buf_u8 += 4 * 16; + uint8_t bit = (x & 0x1) * 4; + x = x >> 1; + + /*Get the current pixel. + *dsc->header.w + 1 means rounding up to 2 because the lines are byte aligned + *so the possible real width are 2, 4, 6 ...*/ + uint32_t px = ((dsc->header.w + 1) >> 1) * y + x; + p_color.full = (buf_u8[px] & (0xF << (4 - bit))) >> (4 - bit); + } + else if(dsc->header.cf == LV_IMG_CF_INDEXED_8BIT) { + buf_u8 += 4 * 256; + uint32_t px = dsc->header.w * y + x; + p_color.full = buf_u8[px]; + } + else if(dsc->header.cf == LV_IMG_CF_ALPHA_1BIT || dsc->header.cf == LV_IMG_CF_ALPHA_2BIT || + dsc->header.cf == LV_IMG_CF_ALPHA_4BIT || dsc->header.cf == LV_IMG_CF_ALPHA_8BIT) { + p_color = color; + } + return p_color; +} + +/** + * Get the alpha value of an image's pixel + * @param dsc pointer to an image descriptor + * @param x x coordinate of the point to set + * @param y x coordinate of the point to set + * @param safe true: check out of bounds + * @return alpha value of the point + */ +lv_opa_t lv_img_buf_get_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y) +{ + uint8_t * buf_u8 = (uint8_t *)dsc->data; + + if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR_ALPHA) { + uint32_t px = dsc->header.w * y * LV_IMG_PX_SIZE_ALPHA_BYTE + x * LV_IMG_PX_SIZE_ALPHA_BYTE; + return buf_u8[px + LV_IMG_PX_SIZE_ALPHA_BYTE - 1]; + } + else if(dsc->header.cf == LV_IMG_CF_ALPHA_1BIT) { + uint8_t bit = x & 0x7; + x = x >> 3; + + /*Get the current pixel. + *dsc->header.w + 7 means rounding up to 8 because the lines are byte aligned + *so the possible real width are 8 ,16, 24 ...*/ + uint32_t px = ((dsc->header.w + 7) >> 3) * y + x; + uint8_t px_opa = (buf_u8[px] & (1 << (7 - bit))) >> (7 - bit); + return px_opa ? LV_OPA_TRANSP : LV_OPA_COVER; + } + else if(dsc->header.cf == LV_IMG_CF_ALPHA_2BIT) { + const uint8_t opa_table[4] = {0, 85, 170, 255}; /*Opacity mapping with bpp = 2*/ + + uint8_t bit = (x & 0x3) * 2; + x = x >> 2; + + /*Get the current pixel. + *dsc->header.w + 4 means rounding up to 8 because the lines are byte aligned + *so the possible real width are 4 ,8, 12 ...*/ + uint32_t px = ((dsc->header.w + 3) >> 2) * y + x; + uint8_t px_opa = (buf_u8[px] & (3 << (6 - bit))) >> (6 - bit); + return opa_table[px_opa]; + } + else if(dsc->header.cf == LV_IMG_CF_ALPHA_4BIT) { + const uint8_t opa_table[16] = {0, 17, 34, 51, /*Opacity mapping with bpp = 4*/ + 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255 + }; + + uint8_t bit = (x & 0x1) * 4; + x = x >> 1; + + /*Get the current pixel. + *dsc->header.w + 1 means rounding up to 8 because the lines are byte aligned + *so the possible real width are 2 ,4, 6 ...*/ + uint32_t px = ((dsc->header.w + 1) >> 1) * y + x; + uint8_t px_opa = (buf_u8[px] & (0xF << (4 - bit))) >> (4 - bit); + return opa_table[px_opa]; + } + else if(dsc->header.cf == LV_IMG_CF_ALPHA_8BIT) { + uint32_t px = dsc->header.w * y + x; + return buf_u8[px]; + } + + return LV_OPA_COVER; +} + +/** + * Set the alpha value of a pixel of an image. The color won't be affected + * @param dsc pointer to an image descriptor + * @param x x coordinate of the point to set + * @param y x coordinate of the point to set + * @param opa the desired opacity + * @param safe true: check out of bounds + */ +void lv_img_buf_set_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_opa_t opa) +{ + uint8_t * buf_u8 = (uint8_t *)dsc->data; + + if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR_ALPHA) { + uint8_t px_size = lv_img_cf_get_px_size(dsc->header.cf) >> 3; + uint32_t px = dsc->header.w * y * px_size + x * px_size; + buf_u8[px + px_size - 1] = opa; + } + else if(dsc->header.cf == LV_IMG_CF_ALPHA_1BIT) { + opa = opa >> 7; /*opa -> [0,1]*/ + uint8_t bit = x & 0x7; + x = x >> 3; + + /*Get the current pixel. + *dsc->header.w + 7 means rounding up to 8 because the lines are byte aligned + *so the possible real width are 8 ,16, 24 ...*/ + uint32_t px = ((dsc->header.w + 7) >> 3) * y + x; + buf_u8[px] = buf_u8[px] & ~(1 << (7 - bit)); + buf_u8[px] = buf_u8[px] | ((opa & 0x1) << (7 - bit)); + } + else if(dsc->header.cf == LV_IMG_CF_ALPHA_2BIT) { + opa = opa >> 6; /*opa -> [0,3]*/ + uint8_t bit = (x & 0x3) * 2; + x = x >> 2; + + /*Get the current pixel. + *dsc->header.w + 4 means rounding up to 8 because the lines are byte aligned + *so the possible real width are 4 ,8, 12 ...*/ + uint32_t px = ((dsc->header.w + 3) >> 2) * y + x; + buf_u8[px] = buf_u8[px] & ~(3 << (6 - bit)); + buf_u8[px] = buf_u8[px] | ((opa & 0x3) << (6 - bit)); + } + else if(dsc->header.cf == LV_IMG_CF_ALPHA_4BIT) { + opa = opa >> 4; /*opa -> [0,15]*/ + uint8_t bit = (x & 0x1) * 4; + x = x >> 1; + + /*Get the current pixel. + *dsc->header.w + 1 means rounding up to 8 because the lines are byte aligned + *so the possible real width are 2 ,4, 6 ...*/ + uint32_t px = ((dsc->header.w + 1) >> 1) * y + x; + buf_u8[px] = buf_u8[px] & ~(0xF << (4 - bit)); + buf_u8[px] = buf_u8[px] | ((opa & 0xF) << (4 - bit)); + } + else if(dsc->header.cf == LV_IMG_CF_ALPHA_8BIT) { + uint32_t px = dsc->header.w * y + x; + buf_u8[px] = opa; + } +} + +/** + * Set the color of a pixel of an image. The alpha channel won't be affected. + * @param dsc pointer to an image descriptor + * @param x x coordinate of the point to set + * @param y x coordinate of the point to set + * @param c color of the point + * @param safe true: check out of bounds + */ +void lv_img_buf_set_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t c) +{ + uint8_t * buf_u8 = (uint8_t *)dsc->data; + + if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR || dsc->header.cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) { + uint8_t px_size = lv_img_cf_get_px_size(dsc->header.cf) >> 3; + uint32_t px = dsc->header.w * y * px_size + x * px_size; + lv_memcpy_small(&buf_u8[px], &c, px_size); + } + else if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR_ALPHA) { + uint8_t px_size = lv_img_cf_get_px_size(dsc->header.cf) >> 3; + uint32_t px = dsc->header.w * y * px_size + x * px_size; + lv_memcpy_small(&buf_u8[px], &c, px_size - 1); /*-1 to not overwrite the alpha value*/ + } + else if(dsc->header.cf == LV_IMG_CF_INDEXED_1BIT) { + buf_u8 += sizeof(lv_color32_t) * 2; /*Skip the palette*/ + + uint8_t bit = x & 0x7; + x = x >> 3; + + /*Get the current pixel. + *dsc->header.w + 7 means rounding up to 8 because the lines are byte aligned + *so the possible real width are 8 ,16, 24 ...*/ + uint32_t px = ((dsc->header.w + 7) >> 3) * y + x; + buf_u8[px] = buf_u8[px] & ~(1 << (7 - bit)); + buf_u8[px] = buf_u8[px] | ((c.full & 0x1) << (7 - bit)); + } + else if(dsc->header.cf == LV_IMG_CF_INDEXED_2BIT) { + buf_u8 += sizeof(lv_color32_t) * 4; /*Skip the palette*/ + uint8_t bit = (x & 0x3) * 2; + x = x >> 2; + + /*Get the current pixel. + *dsc->header.w + 3 means rounding up to 4 because the lines are byte aligned + *so the possible real width are 4, 8 ,12 ...*/ + uint32_t px = ((dsc->header.w + 3) >> 2) * y + x; + + buf_u8[px] = buf_u8[px] & ~(3 << (6 - bit)); + buf_u8[px] = buf_u8[px] | ((c.full & 0x3) << (6 - bit)); + } + else if(dsc->header.cf == LV_IMG_CF_INDEXED_4BIT) { + buf_u8 += sizeof(lv_color32_t) * 16; /*Skip the palette*/ + uint8_t bit = (x & 0x1) * 4; + x = x >> 1; + + /*Get the current pixel. + *dsc->header.w + 1 means rounding up to 2 because the lines are byte aligned + *so the possible real width are 2 ,4, 6 ...*/ + uint32_t px = ((dsc->header.w + 1) >> 1) * y + x; + buf_u8[px] = buf_u8[px] & ~(0xF << (4 - bit)); + buf_u8[px] = buf_u8[px] | ((c.full & 0xF) << (4 - bit)); + } + else if(dsc->header.cf == LV_IMG_CF_INDEXED_8BIT) { + buf_u8 += sizeof(lv_color32_t) * 256; /*Skip the palette*/ + uint32_t px = dsc->header.w * y + x; + buf_u8[px] = c.full; + } +} + +/** + * Set the palette color of an indexed image. Valid only for `LV_IMG_CF_INDEXED1/2/4/8` + * @param dsc pointer to an image descriptor + * @param id the palette color to set: + * - for `LV_IMG_CF_INDEXED1`: 0..1 + * - for `LV_IMG_CF_INDEXED2`: 0..3 + * - for `LV_IMG_CF_INDEXED4`: 0..15 + * - for `LV_IMG_CF_INDEXED8`: 0..255 + * @param c the color to set + */ +void lv_img_buf_set_palette(lv_img_dsc_t * dsc, uint8_t id, lv_color_t c) +{ + if((dsc->header.cf == LV_IMG_CF_ALPHA_1BIT && id > 1) || (dsc->header.cf == LV_IMG_CF_ALPHA_2BIT && id > 3) || + (dsc->header.cf == LV_IMG_CF_ALPHA_4BIT && id > 15) || (dsc->header.cf == LV_IMG_CF_ALPHA_8BIT)) { + LV_LOG_WARN("lv_img_buf_set_px_alpha: invalid 'id'"); + return; + } + + lv_color32_t c32; + c32.full = lv_color_to32(c); + uint8_t * buf = (uint8_t *)dsc->data; + lv_memcpy_small(&buf[id * sizeof(c32)], &c32, sizeof(c32)); +} + +/** + * Allocate an image buffer in RAM + * @param w width of image + * @param h height of image + * @param cf a color format (`LV_IMG_CF_...`) + * @return an allocated image, or NULL on failure + */ +lv_img_dsc_t * lv_img_buf_alloc(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf) +{ + /*Allocate image descriptor*/ + lv_img_dsc_t * dsc = lv_mem_alloc(sizeof(lv_img_dsc_t)); + if(dsc == NULL) + return NULL; + + lv_memset_00(dsc, sizeof(lv_img_dsc_t)); + + /*Get image data size*/ + dsc->data_size = lv_img_buf_get_img_size(w, h, cf); + if(dsc->data_size == 0) { + lv_mem_free(dsc); + return NULL; + } + + /*Allocate raw buffer*/ + dsc->data = lv_mem_alloc(dsc->data_size); + if(dsc->data == NULL) { + lv_mem_free(dsc); + return NULL; + } + lv_memset_00((uint8_t *)dsc->data, dsc->data_size); + + /*Fill in header*/ + dsc->header.always_zero = 0; + dsc->header.w = w; + dsc->header.h = h; + dsc->header.cf = cf; + return dsc; +} + +/** + * Free an allocated image buffer + * @param dsc image buffer to free + */ +void lv_img_buf_free(lv_img_dsc_t * dsc) +{ + if(dsc != NULL) { + if(dsc->data != NULL) + lv_mem_free((void *)dsc->data); + + lv_mem_free(dsc); + } +} + +/** + * Get the memory consumption of a raw bitmap, given color format and dimensions. + * @param w width + * @param h height + * @param cf color format + * @return size in bytes + */ +uint32_t lv_img_buf_get_img_size(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf) +{ + switch(cf) { + case LV_IMG_CF_TRUE_COLOR: + return LV_IMG_BUF_SIZE_TRUE_COLOR(w, h); + case LV_IMG_CF_TRUE_COLOR_ALPHA: + case LV_IMG_CF_RGB565A8: + return LV_IMG_BUF_SIZE_TRUE_COLOR_ALPHA(w, h); + case LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED: + return LV_IMG_BUF_SIZE_TRUE_COLOR_CHROMA_KEYED(w, h); + case LV_IMG_CF_ALPHA_1BIT: + return LV_IMG_BUF_SIZE_ALPHA_1BIT(w, h); + case LV_IMG_CF_ALPHA_2BIT: + return LV_IMG_BUF_SIZE_ALPHA_2BIT(w, h); + case LV_IMG_CF_ALPHA_4BIT: + return LV_IMG_BUF_SIZE_ALPHA_4BIT(w, h); + case LV_IMG_CF_ALPHA_8BIT: + return LV_IMG_BUF_SIZE_ALPHA_8BIT(w, h); + case LV_IMG_CF_INDEXED_1BIT: + return LV_IMG_BUF_SIZE_INDEXED_1BIT(w, h); + case LV_IMG_CF_INDEXED_2BIT: + return LV_IMG_BUF_SIZE_INDEXED_2BIT(w, h); + case LV_IMG_CF_INDEXED_4BIT: + return LV_IMG_BUF_SIZE_INDEXED_4BIT(w, h); + case LV_IMG_CF_INDEXED_8BIT: + return LV_IMG_BUF_SIZE_INDEXED_8BIT(w, h); + default: + return 0; + } +} + +/** + * Get the area of a rectangle if its rotated and scaled + * @param res store the coordinates here + * @param w width of the rectangle to transform + * @param h height of the rectangle to transform + * @param angle angle of rotation + * @param zoom zoom, (256 no zoom) + * @param pivot x,y pivot coordinates of rotation + */ +void _lv_img_buf_get_transformed_area(lv_area_t * res, lv_coord_t w, lv_coord_t h, int16_t angle, uint16_t zoom, + const lv_point_t * pivot) +{ +#if LV_DRAW_COMPLEX + if(angle == 0 && zoom == LV_IMG_ZOOM_NONE) { + res->x1 = 0; + res->y1 = 0; + res->x2 = w - 1; + res->y2 = h - 1; + return; + } + + lv_point_t p[4] = { + {0, 0}, + {w, 0}, + {0, h}, + {w, h}, + }; + lv_point_transform(&p[0], angle, zoom, pivot); + lv_point_transform(&p[1], angle, zoom, pivot); + lv_point_transform(&p[2], angle, zoom, pivot); + lv_point_transform(&p[3], angle, zoom, pivot); + res->x1 = LV_MIN4(p[0].x, p[1].x, p[2].x, p[3].x) - 2; + res->x2 = LV_MAX4(p[0].x, p[1].x, p[2].x, p[3].x) + 2; + res->y1 = LV_MIN4(p[0].y, p[1].y, p[2].y, p[3].y) - 2; + res->y2 = LV_MAX4(p[0].y, p[1].y, p[2].y, p[3].y) + 2; + +#else + LV_UNUSED(angle); + LV_UNUSED(zoom); + LV_UNUSED(pivot); + res->x1 = 0; + res->y1 = 0; + res->x2 = w - 1; + res->y2 = h - 1; +#endif +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_img_buf.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_img_buf.h new file mode 100644 index 0000000..1be7bb6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_img_buf.h @@ -0,0 +1,249 @@ +/** + * @file lv_img_buf.h + * + */ + +#ifndef LV_IMG_BUF_H +#define LV_IMG_BUF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include "../misc/lv_color.h" +#include "../misc/lv_area.h" + +/********************* + * DEFINES + *********************/ +/*If image pixels contains alpha we need to know how much byte is a pixel*/ +#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8 +#define LV_IMG_PX_SIZE_ALPHA_BYTE 2 +#elif LV_COLOR_DEPTH == 16 +#define LV_IMG_PX_SIZE_ALPHA_BYTE 3 +#elif LV_COLOR_DEPTH == 32 +#define LV_IMG_PX_SIZE_ALPHA_BYTE 4 +#endif + +#define LV_IMG_BUF_SIZE_TRUE_COLOR(w, h) ((LV_COLOR_SIZE / 8) * w * h) +#define LV_IMG_BUF_SIZE_TRUE_COLOR_CHROMA_KEYED(w, h) ((LV_COLOR_SIZE / 8) * w * h) +#define LV_IMG_BUF_SIZE_TRUE_COLOR_ALPHA(w, h) (LV_IMG_PX_SIZE_ALPHA_BYTE * w * h) + +/*+ 1: to be sure no fractional row*/ +#define LV_IMG_BUF_SIZE_ALPHA_1BIT(w, h) ((((w / 8) + 1) * h)) +#define LV_IMG_BUF_SIZE_ALPHA_2BIT(w, h) ((((w / 4) + 1) * h)) +#define LV_IMG_BUF_SIZE_ALPHA_4BIT(w, h) ((((w / 2) + 1) * h)) +#define LV_IMG_BUF_SIZE_ALPHA_8BIT(w, h) ((w * h)) + +/*4 * X: for palette*/ +#define LV_IMG_BUF_SIZE_INDEXED_1BIT(w, h) (LV_IMG_BUF_SIZE_ALPHA_1BIT(w, h) + 4 * 2) +#define LV_IMG_BUF_SIZE_INDEXED_2BIT(w, h) (LV_IMG_BUF_SIZE_ALPHA_2BIT(w, h) + 4 * 4) +#define LV_IMG_BUF_SIZE_INDEXED_4BIT(w, h) (LV_IMG_BUF_SIZE_ALPHA_4BIT(w, h) + 4 * 16) +#define LV_IMG_BUF_SIZE_INDEXED_8BIT(w, h) (LV_IMG_BUF_SIZE_ALPHA_8BIT(w, h) + 4 * 256) + +#define _LV_ZOOM_INV_UPSCALE 5 + +/********************** + * TYPEDEFS + **********************/ + +/*Image color format*/ +enum { + LV_IMG_CF_UNKNOWN = 0, + + LV_IMG_CF_RAW, /**< Contains the file as it is. Needs custom decoder function*/ + LV_IMG_CF_RAW_ALPHA, /**< Contains the file as it is. The image has alpha. Needs custom decoder + function*/ + LV_IMG_CF_RAW_CHROMA_KEYED, /**< Contains the file as it is. The image is chroma keyed. Needs + custom decoder function*/ + + LV_IMG_CF_TRUE_COLOR, /**< Color format and depth should match with LV_COLOR settings*/ + LV_IMG_CF_TRUE_COLOR_ALPHA, /**< Same as `LV_IMG_CF_TRUE_COLOR` but every pixel has an alpha byte*/ + LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED, /**< Same as `LV_IMG_CF_TRUE_COLOR` but LV_COLOR_TRANSP pixels + will be transparent*/ + + LV_IMG_CF_INDEXED_1BIT, /**< Can have 2 different colors in a palette (can't be chroma keyed)*/ + LV_IMG_CF_INDEXED_2BIT, /**< Can have 4 different colors in a palette (can't be chroma keyed)*/ + LV_IMG_CF_INDEXED_4BIT, /**< Can have 16 different colors in a palette (can't be chroma keyed)*/ + LV_IMG_CF_INDEXED_8BIT, /**< Can have 256 different colors in a palette (can't be chroma keyed)*/ + + LV_IMG_CF_ALPHA_1BIT, /**< Can have one color and it can be drawn or not*/ + LV_IMG_CF_ALPHA_2BIT, /**< Can have one color but 4 different alpha value*/ + LV_IMG_CF_ALPHA_4BIT, /**< Can have one color but 16 different alpha value*/ + LV_IMG_CF_ALPHA_8BIT, /**< Can have one color but 256 different alpha value*/ + + LV_IMG_CF_RGB888, + LV_IMG_CF_RGBA8888, + LV_IMG_CF_RGBX8888, + LV_IMG_CF_RGB565, + LV_IMG_CF_RGBA5658, + LV_IMG_CF_RGB565A8, + + LV_IMG_CF_RESERVED_15, /**< Reserved for further use.*/ + LV_IMG_CF_RESERVED_16, /**< Reserved for further use.*/ + LV_IMG_CF_RESERVED_17, /**< Reserved for further use.*/ + LV_IMG_CF_RESERVED_18, /**< Reserved for further use.*/ + LV_IMG_CF_RESERVED_19, /**< Reserved for further use.*/ + LV_IMG_CF_RESERVED_20, /**< Reserved for further use.*/ + LV_IMG_CF_RESERVED_21, /**< Reserved for further use.*/ + LV_IMG_CF_RESERVED_22, /**< Reserved for further use.*/ + LV_IMG_CF_RESERVED_23, /**< Reserved for further use.*/ + + LV_IMG_CF_USER_ENCODED_0, /**< User holder encoding format.*/ + LV_IMG_CF_USER_ENCODED_1, /**< User holder encoding format.*/ + LV_IMG_CF_USER_ENCODED_2, /**< User holder encoding format.*/ + LV_IMG_CF_USER_ENCODED_3, /**< User holder encoding format.*/ + LV_IMG_CF_USER_ENCODED_4, /**< User holder encoding format.*/ + LV_IMG_CF_USER_ENCODED_5, /**< User holder encoding format.*/ + LV_IMG_CF_USER_ENCODED_6, /**< User holder encoding format.*/ + LV_IMG_CF_USER_ENCODED_7, /**< User holder encoding format.*/ +}; +typedef uint8_t lv_img_cf_t; + + +/** + * The first 8 bit is very important to distinguish the different source types. + * For more info see `lv_img_get_src_type()` in lv_img.c + * On big endian systems the order is reversed so cf and always_zero must be at + * the end of the struct. + */ +#if LV_BIG_ENDIAN_SYSTEM +typedef struct { + + uint32_t h : 11; /*Height of the image map*/ + uint32_t w : 11; /*Width of the image map*/ + uint32_t reserved : 2; /*Reserved to be used later*/ + uint32_t always_zero : 3; /*It the upper bits of the first byte. Always zero to look like a + non-printable character*/ + uint32_t cf : 5; /*Color format: See `lv_img_color_format_t`*/ + +} lv_img_header_t; +#else +typedef struct { + + uint32_t cf : 5; /*Color format: See `lv_img_color_format_t`*/ + uint32_t always_zero : 3; /*It the upper bits of the first byte. Always zero to look like a + non-printable character*/ + + uint32_t reserved : 2; /*Reserved to be used later*/ + + uint32_t w : 11; /*Width of the image map*/ + uint32_t h : 11; /*Height of the image map*/ +} lv_img_header_t; +#endif + +/** Image header it is compatible with + * the result from image converter utility*/ +typedef struct { + lv_img_header_t header; /**< A header describing the basics of the image*/ + uint32_t data_size; /**< Size of the image in bytes*/ + const uint8_t * data; /**< Pointer to the data of the image*/ +} lv_img_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Allocate an image buffer in RAM + * @param w width of image + * @param h height of image + * @param cf a color format (`LV_IMG_CF_...`) + * @return an allocated image, or NULL on failure + */ +lv_img_dsc_t * lv_img_buf_alloc(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf); + +/** + * Get the color of an image's pixel + * @param dsc an image descriptor + * @param x x coordinate of the point to get + * @param y x coordinate of the point to get + * @param color the color of the image. In case of `LV_IMG_CF_ALPHA_1/2/4/8` this color is used. + * Not used in other cases. + * @param safe true: check out of bounds + * @return color of the point + */ +lv_color_t lv_img_buf_get_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t color); + +/** + * Get the alpha value of an image's pixel + * @param dsc pointer to an image descriptor + * @param x x coordinate of the point to set + * @param y x coordinate of the point to set + * @param safe true: check out of bounds + * @return alpha value of the point + */ +lv_opa_t lv_img_buf_get_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y); + +/** + * Set the color of a pixel of an image. The alpha channel won't be affected. + * @param dsc pointer to an image descriptor + * @param x x coordinate of the point to set + * @param y x coordinate of the point to set + * @param c color of the point + * @param safe true: check out of bounds + */ +void lv_img_buf_set_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t c); + +/** + * Set the alpha value of a pixel of an image. The color won't be affected + * @param dsc pointer to an image descriptor + * @param x x coordinate of the point to set + * @param y x coordinate of the point to set + * @param opa the desired opacity + * @param safe true: check out of bounds + */ +void lv_img_buf_set_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_opa_t opa); + +/** + * Set the palette color of an indexed image. Valid only for `LV_IMG_CF_INDEXED1/2/4/8` + * @param dsc pointer to an image descriptor + * @param id the palette color to set: + * - for `LV_IMG_CF_INDEXED1`: 0..1 + * - for `LV_IMG_CF_INDEXED2`: 0..3 + * - for `LV_IMG_CF_INDEXED4`: 0..15 + * - for `LV_IMG_CF_INDEXED8`: 0..255 + * @param c the color to set + */ +void lv_img_buf_set_palette(lv_img_dsc_t * dsc, uint8_t id, lv_color_t c); + +/** + * Free an allocated image buffer + * @param dsc image buffer to free + */ +void lv_img_buf_free(lv_img_dsc_t * dsc); + +/** + * Get the memory consumption of a raw bitmap, given color format and dimensions. + * @param w width + * @param h height + * @param cf color format + * @return size in bytes + */ +uint32_t lv_img_buf_get_img_size(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf); + +/** + * Get the area of a rectangle if its rotated and scaled + * @param res store the coordinates here + * @param w width of the rectangle to transform + * @param h height of the rectangle to transform + * @param angle angle of rotation + * @param zoom zoom, (256 no zoom) + * @param pivot x,y pivot coordinates of rotation + */ +void _lv_img_buf_get_transformed_area(lv_area_t * res, lv_coord_t w, lv_coord_t h, int16_t angle, uint16_t zoom, + const lv_point_t * pivot); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IMG_BUF_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_img_cache.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_img_cache.c new file mode 100644 index 0000000..2caf512 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_img_cache.c @@ -0,0 +1,215 @@ +/** + * @file lv_img_cache.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_assert.h" +#include "lv_img_cache.h" +#include "lv_img_decoder.h" +#include "lv_draw_img.h" +#include "../hal/lv_hal_tick.h" +#include "../misc/lv_gc.h" + +/********************* + * DEFINES + *********************/ +/*Decrement life with this value on every open*/ +#define LV_IMG_CACHE_AGING 1 + +/*Boost life by this factor (multiply time_to_open with this value)*/ +#define LV_IMG_CACHE_LIFE_GAIN 1 + +/*Don't let life to be greater than this limit because it would require a lot of time to + * "die" from very high values*/ +#define LV_IMG_CACHE_LIFE_LIMIT 1000 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +#if LV_IMG_CACHE_DEF_SIZE + static bool lv_img_cache_match(const void * src1, const void * src2); +#endif + +/********************** + * STATIC VARIABLES + **********************/ +#if LV_IMG_CACHE_DEF_SIZE + static uint16_t entry_cnt; +#endif + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Open an image using the image decoder interface and cache it. + * The image will be left open meaning if the image decoder open callback allocated memory then it will remain. + * The image is closed if a new image is opened and the new image takes its place in the cache. + * @param src source of the image. Path to file or pointer to an `lv_img_dsc_t` variable + * @param color color The color of the image with `LV_IMG_CF_ALPHA_...` + * @return pointer to the cache entry or NULL if can open the image + */ +_lv_img_cache_entry_t * _lv_img_cache_open(const void * src, lv_color_t color, int32_t frame_id) +{ + /*Is the image cached?*/ + _lv_img_cache_entry_t * cached_src = NULL; + +#if LV_IMG_CACHE_DEF_SIZE + if(entry_cnt == 0) { + LV_LOG_WARN("lv_img_cache_open: the cache size is 0"); + return NULL; + } + + _lv_img_cache_entry_t * cache = LV_GC_ROOT(_lv_img_cache_array); + + /*Decrement all lifes. Make the entries older*/ + uint16_t i; + for(i = 0; i < entry_cnt; i++) { + if(cache[i].life > INT32_MIN + LV_IMG_CACHE_AGING) { + cache[i].life -= LV_IMG_CACHE_AGING; + } + } + + for(i = 0; i < entry_cnt; i++) { + if(color.full == cache[i].dec_dsc.color.full && + frame_id == cache[i].dec_dsc.frame_id && + lv_img_cache_match(src, cache[i].dec_dsc.src)) { + /*If opened increment its life. + *Image difficult to open should live longer to keep avoid frequent their recaching. + *Therefore increase `life` with `time_to_open`*/ + cached_src = &cache[i]; + cached_src->life += cached_src->dec_dsc.time_to_open * LV_IMG_CACHE_LIFE_GAIN; + if(cached_src->life > LV_IMG_CACHE_LIFE_LIMIT) cached_src->life = LV_IMG_CACHE_LIFE_LIMIT; + LV_LOG_TRACE("image source found in the cache"); + break; + } + } + + /*The image is not cached then cache it now*/ + if(cached_src) return cached_src; + + /*Find an entry to reuse. Select the entry with the least life*/ + cached_src = &cache[0]; + for(i = 1; i < entry_cnt; i++) { + if(cache[i].life < cached_src->life) { + cached_src = &cache[i]; + } + } + + /*Close the decoder to reuse if it was opened (has a valid source)*/ + if(cached_src->dec_dsc.src) { + lv_img_decoder_close(&cached_src->dec_dsc); + LV_LOG_INFO("image draw: cache miss, close and reuse an entry"); + } + else { + LV_LOG_INFO("image draw: cache miss, cached to an empty entry"); + } +#else + cached_src = &LV_GC_ROOT(_lv_img_cache_single); +#endif + /*Open the image and measure the time to open*/ + uint32_t t_start = lv_tick_get(); + lv_res_t open_res = lv_img_decoder_open(&cached_src->dec_dsc, src, color, frame_id); + if(open_res == LV_RES_INV) { + LV_LOG_WARN("Image draw cannot open the image resource"); + lv_memset_00(cached_src, sizeof(_lv_img_cache_entry_t)); + cached_src->life = INT32_MIN; /*Make the empty entry very "weak" to force its us*/ + return NULL; + } + + cached_src->life = 0; + + /*If `time_to_open` was not set in the open function set it here*/ + if(cached_src->dec_dsc.time_to_open == 0) { + cached_src->dec_dsc.time_to_open = lv_tick_elaps(t_start); + } + + if(cached_src->dec_dsc.time_to_open == 0) cached_src->dec_dsc.time_to_open = 1; + + return cached_src; +} + +/** + * Set the number of images to be cached. + * More cached images mean more opened image at same time which might mean more memory usage. + * E.g. if 20 PNG or JPG images are open in the RAM they consume memory while opened in the cache. + * @param new_entry_cnt number of image to cache + */ +void lv_img_cache_set_size(uint16_t new_entry_cnt) +{ +#if LV_IMG_CACHE_DEF_SIZE == 0 + LV_UNUSED(new_entry_cnt); + LV_LOG_WARN("Can't change cache size because it's disabled by LV_IMG_CACHE_DEF_SIZE = 0"); +#else + if(LV_GC_ROOT(_lv_img_cache_array) != NULL) { + /*Clean the cache before free it*/ + lv_img_cache_invalidate_src(NULL); + lv_mem_free(LV_GC_ROOT(_lv_img_cache_array)); + } + + /*Reallocate the cache*/ + LV_GC_ROOT(_lv_img_cache_array) = lv_mem_alloc(sizeof(_lv_img_cache_entry_t) * new_entry_cnt); + LV_ASSERT_MALLOC(LV_GC_ROOT(_lv_img_cache_array)); + if(LV_GC_ROOT(_lv_img_cache_array) == NULL) { + entry_cnt = 0; + return; + } + entry_cnt = new_entry_cnt; + + /*Clean the cache*/ + lv_memset_00(LV_GC_ROOT(_lv_img_cache_array), entry_cnt * sizeof(_lv_img_cache_entry_t)); +#endif +} + +/** + * Invalidate an image source in the cache. + * Useful if the image source is updated therefore it needs to be cached again. + * @param src an image source path to a file or pointer to an `lv_img_dsc_t` variable. + */ +void lv_img_cache_invalidate_src(const void * src) +{ + LV_UNUSED(src); +#if LV_IMG_CACHE_DEF_SIZE + _lv_img_cache_entry_t * cache = LV_GC_ROOT(_lv_img_cache_array); + + uint16_t i; + for(i = 0; i < entry_cnt; i++) { + if(src == NULL || lv_img_cache_match(src, cache[i].dec_dsc.src)) { + if(cache[i].dec_dsc.src != NULL) { + lv_img_decoder_close(&cache[i].dec_dsc); + } + + lv_memset_00(&cache[i], sizeof(_lv_img_cache_entry_t)); + } + } +#endif +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#if LV_IMG_CACHE_DEF_SIZE +static bool lv_img_cache_match(const void * src1, const void * src2) +{ + lv_img_src_t src_type = lv_img_src_get_type(src1); + if(src_type == LV_IMG_SRC_VARIABLE) + return src1 == src2; + if(src_type != LV_IMG_SRC_FILE) + return false; + if(lv_img_src_get_type(src2) != LV_IMG_SRC_FILE) + return false; + return strcmp(src1, src2) == 0; +} +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_img_cache.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_img_cache.h new file mode 100644 index 0000000..dc0c5d9 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_img_cache.h @@ -0,0 +1,78 @@ +/** + * @file lv_img_cache.h + * + */ + +#ifndef LV_IMG_CACHE_H +#define LV_IMG_CACHE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_img_decoder.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * When loading images from the network it can take a long time to download and decode the image. + * + * To avoid repeating this heavy load images can be cached. + */ +typedef struct { + lv_img_decoder_dsc_t dec_dsc; /**< Image information*/ + + /** Count the cache entries's life. Add `time_to_open` to `life` when the entry is used. + * Decrement all lifes by one every in every ::lv_img_cache_open. + * If life == 0 the entry can be reused*/ + int32_t life; +} _lv_img_cache_entry_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Open an image using the image decoder interface and cache it. + * The image will be left open meaning if the image decoder open callback allocated memory then it will remain. + * The image is closed if a new image is opened and the new image takes its place in the cache. + * @param src source of the image. Path to file or pointer to an `lv_img_dsc_t` variable + * @param color The color of the image with `LV_IMG_CF_ALPHA_...` + * @param frame_id the index of the frame. Used only with animated images, set 0 for normal images + * @return pointer to the cache entry or NULL if can open the image + */ +_lv_img_cache_entry_t * _lv_img_cache_open(const void * src, lv_color_t color, int32_t frame_id); + +/** + * Set the number of images to be cached. + * More cached images mean more opened image at same time which might mean more memory usage. + * E.g. if 20 PNG or JPG images are open in the RAM they consume memory while opened in the cache. + * @param new_entry_cnt number of image to cache + */ +void lv_img_cache_set_size(uint16_t new_slot_num); + +/** + * Invalidate an image source in the cache. + * Useful if the image source is updated therefore it needs to be cached again. + * @param src an image source path to a file or pointer to an `lv_img_dsc_t` variable. + */ +void lv_img_cache_invalidate_src(const void * src); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IMG_CACHE_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_img_decoder.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_img_decoder.c new file mode 100644 index 0000000..13050b8 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_img_decoder.c @@ -0,0 +1,705 @@ +/** + * @file lv_img_decoder.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_img_decoder.h" +#include "../misc/lv_assert.h" +#include "../draw/lv_draw_img.h" +#include "../misc/lv_ll.h" +#include "../misc/lv_gc.h" + +/********************* + * DEFINES + *********************/ +#define CF_BUILT_IN_FIRST LV_IMG_CF_TRUE_COLOR +#define CF_BUILT_IN_LAST LV_IMG_CF_RGB565A8 + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_fs_file_t f; + lv_color_t * palette; + lv_opa_t * opa; +} lv_img_decoder_built_in_data_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_res_t lv_img_decoder_built_in_line_true_color(lv_img_decoder_dsc_t * dsc, lv_coord_t x, lv_coord_t y, + lv_coord_t len, uint8_t * buf); +static lv_res_t lv_img_decoder_built_in_line_alpha(lv_img_decoder_dsc_t * dsc, lv_coord_t x, lv_coord_t y, + lv_coord_t len, uint8_t * buf); +static lv_res_t lv_img_decoder_built_in_line_indexed(lv_img_decoder_dsc_t * dsc, lv_coord_t x, lv_coord_t y, + lv_coord_t len, uint8_t * buf); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Initialize the image decoder module + */ +void _lv_img_decoder_init(void) +{ + _lv_ll_init(&LV_GC_ROOT(_lv_img_decoder_ll), sizeof(lv_img_decoder_t)); + + lv_img_decoder_t * decoder; + + /*Create a decoder for the built in color format*/ + decoder = lv_img_decoder_create(); + LV_ASSERT_MALLOC(decoder); + if(decoder == NULL) { + LV_LOG_WARN("lv_img_decoder_init: out of memory"); + return; + } + + lv_img_decoder_set_info_cb(decoder, lv_img_decoder_built_in_info); + lv_img_decoder_set_open_cb(decoder, lv_img_decoder_built_in_open); + lv_img_decoder_set_read_line_cb(decoder, lv_img_decoder_built_in_read_line); + lv_img_decoder_set_close_cb(decoder, lv_img_decoder_built_in_close); +} + +/** + * Get information about an image. + * Try the created image decoder one by one. Once one is able to get info that info will be used. + * @param src the image source. E.g. file name or variable. + * @param header the image info will be stored here + * @return LV_RES_OK: success; LV_RES_INV: wasn't able to get info about the image + */ +lv_res_t lv_img_decoder_get_info(const void * src, lv_img_header_t * header) +{ + lv_memset_00(header, sizeof(lv_img_header_t)); + + if(src == NULL) return LV_RES_INV; + + lv_img_src_t src_type = lv_img_src_get_type(src); + if(src_type == LV_IMG_SRC_VARIABLE) { + const lv_img_dsc_t * img_dsc = src; + if(img_dsc->data == NULL) return LV_RES_INV; + } + + lv_res_t res = LV_RES_INV; + lv_img_decoder_t * d; + _LV_LL_READ(&LV_GC_ROOT(_lv_img_decoder_ll), d) { + if(d->info_cb) { + res = d->info_cb(d, src, header); + if(res == LV_RES_OK) break; + } + } + + return res; +} + +lv_res_t lv_img_decoder_open(lv_img_decoder_dsc_t * dsc, const void * src, lv_color_t color, int32_t frame_id) +{ + lv_memset_00(dsc, sizeof(lv_img_decoder_dsc_t)); + + if(src == NULL) return LV_RES_INV; + lv_img_src_t src_type = lv_img_src_get_type(src); + if(src_type == LV_IMG_SRC_VARIABLE) { + const lv_img_dsc_t * img_dsc = src; + if(img_dsc->data == NULL) return LV_RES_INV; + } + + dsc->color = color; + dsc->src_type = src_type; + dsc->frame_id = frame_id; + + if(dsc->src_type == LV_IMG_SRC_FILE) { + size_t fnlen = strlen(src); + dsc->src = lv_mem_alloc(fnlen + 1); + LV_ASSERT_MALLOC(dsc->src); + if(dsc->src == NULL) { + LV_LOG_WARN("lv_img_decoder_open: out of memory"); + return LV_RES_INV; + } + strcpy((char *)dsc->src, src); + } + else { + dsc->src = src; + } + + lv_res_t res = LV_RES_INV; + + lv_img_decoder_t * decoder; + _LV_LL_READ(&LV_GC_ROOT(_lv_img_decoder_ll), decoder) { + /*Info and Open callbacks are required*/ + if(decoder->info_cb == NULL || decoder->open_cb == NULL) continue; + + res = decoder->info_cb(decoder, src, &dsc->header); + if(res != LV_RES_OK) continue; + + dsc->decoder = decoder; + res = decoder->open_cb(decoder, dsc); + + /*Opened successfully. It is a good decoder for this image source*/ + if(res == LV_RES_OK) return res; + + /*Prepare for the next loop*/ + lv_memset_00(&dsc->header, sizeof(lv_img_header_t)); + + dsc->error_msg = NULL; + dsc->img_data = NULL; + dsc->user_data = NULL; + dsc->time_to_open = 0; + } + + if(dsc->src_type == LV_IMG_SRC_FILE) + lv_mem_free((void *)dsc->src); + + return res; +} + +/** + * Read a line from an opened image + * @param dsc pointer to `lv_img_decoder_dsc_t` used in `lv_img_decoder_open` + * @param x start X coordinate (from left) + * @param y start Y coordinate (from top) + * @param len number of pixels to read + * @param buf store the data here + * @return LV_RES_OK: success; LV_RES_INV: an error occurred + */ +lv_res_t lv_img_decoder_read_line(lv_img_decoder_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_coord_t len, uint8_t * buf) +{ + lv_res_t res = LV_RES_INV; + if(dsc->decoder->read_line_cb) res = dsc->decoder->read_line_cb(dsc->decoder, dsc, x, y, len, buf); + + return res; +} + +/** + * Close a decoding session + * @param dsc pointer to `lv_img_decoder_dsc_t` used in `lv_img_decoder_open` + */ +void lv_img_decoder_close(lv_img_decoder_dsc_t * dsc) +{ + if(dsc->decoder) { + if(dsc->decoder->close_cb) dsc->decoder->close_cb(dsc->decoder, dsc); + + if(dsc->src_type == LV_IMG_SRC_FILE) { + lv_mem_free((void *)dsc->src); + dsc->src = NULL; + } + } +} + +/** + * Create a new image decoder + * @return pointer to the new image decoder + */ +lv_img_decoder_t * lv_img_decoder_create(void) +{ + lv_img_decoder_t * decoder; + decoder = _lv_ll_ins_head(&LV_GC_ROOT(_lv_img_decoder_ll)); + LV_ASSERT_MALLOC(decoder); + if(decoder == NULL) return NULL; + + lv_memset_00(decoder, sizeof(lv_img_decoder_t)); + + return decoder; +} + +/** + * Delete an image decoder + * @param decoder pointer to an image decoder + */ +void lv_img_decoder_delete(lv_img_decoder_t * decoder) +{ + _lv_ll_remove(&LV_GC_ROOT(_lv_img_decoder_ll), decoder); + lv_mem_free(decoder); +} + +/** + * Set a callback to get information about the image + * @param decoder pointer to an image decoder + * @param info_cb a function to collect info about an image (fill an `lv_img_header_t` struct) + */ +void lv_img_decoder_set_info_cb(lv_img_decoder_t * decoder, lv_img_decoder_info_f_t info_cb) +{ + decoder->info_cb = info_cb; +} + +/** + * Set a callback to open an image + * @param decoder pointer to an image decoder + * @param open_cb a function to open an image + */ +void lv_img_decoder_set_open_cb(lv_img_decoder_t * decoder, lv_img_decoder_open_f_t open_cb) +{ + decoder->open_cb = open_cb; +} + +/** + * Set a callback to a decoded line of an image + * @param decoder pointer to an image decoder + * @param read_line_cb a function to read a line of an image + */ +void lv_img_decoder_set_read_line_cb(lv_img_decoder_t * decoder, lv_img_decoder_read_line_f_t read_line_cb) +{ + decoder->read_line_cb = read_line_cb; +} + +/** + * Set a callback to close a decoding session. E.g. close files and free other resources. + * @param decoder pointer to an image decoder + * @param close_cb a function to close a decoding session + */ +void lv_img_decoder_set_close_cb(lv_img_decoder_t * decoder, lv_img_decoder_close_f_t close_cb) +{ + decoder->close_cb = close_cb; +} + +/** + * Get info about a built-in image + * @param decoder the decoder where this function belongs + * @param src the image source: pointer to an `lv_img_dsc_t` variable, a file path or a symbol + * @param header store the image data here + * @return LV_RES_OK: the info is successfully stored in `header`; LV_RES_INV: unknown format or other error. + */ +lv_res_t lv_img_decoder_built_in_info(lv_img_decoder_t * decoder, const void * src, lv_img_header_t * header) +{ + LV_UNUSED(decoder); /*Unused*/ + + lv_img_src_t src_type = lv_img_src_get_type(src); + if(src_type == LV_IMG_SRC_VARIABLE) { + lv_img_cf_t cf = ((lv_img_dsc_t *)src)->header.cf; + if(cf < CF_BUILT_IN_FIRST || cf > CF_BUILT_IN_LAST) return LV_RES_INV; + + header->w = ((lv_img_dsc_t *)src)->header.w; + header->h = ((lv_img_dsc_t *)src)->header.h; + header->cf = ((lv_img_dsc_t *)src)->header.cf; + } + else if(src_type == LV_IMG_SRC_FILE) { + /*Support only "*.bin" files*/ + if(strcmp(lv_fs_get_ext(src), "bin")) return LV_RES_INV; + + lv_fs_file_t f; + lv_fs_res_t res = lv_fs_open(&f, src, LV_FS_MODE_RD); + if(res == LV_FS_RES_OK) { + uint32_t rn; + res = lv_fs_read(&f, header, sizeof(lv_img_header_t), &rn); + lv_fs_close(&f); + if(res != LV_FS_RES_OK || rn != sizeof(lv_img_header_t)) { + LV_LOG_WARN("Image get info get read file header"); + return LV_RES_INV; + } + } + + if(header->cf < CF_BUILT_IN_FIRST || header->cf > CF_BUILT_IN_LAST) return LV_RES_INV; + } + else if(src_type == LV_IMG_SRC_SYMBOL) { + /*The size depend on the font but it is unknown here. It should be handled outside of the + *function*/ + header->w = 1; + header->h = 1; + /*Symbols always have transparent parts. Important because of cover check in the draw + *function. The actual value doesn't matter because lv_draw_label will draw it*/ + header->cf = LV_IMG_CF_ALPHA_1BIT; + } + else { + LV_LOG_WARN("Image get info found unknown src type"); + return LV_RES_INV; + } + return LV_RES_OK; +} + +/** + * Open a built in image + * @param decoder the decoder where this function belongs + * @param dsc pointer to decoder descriptor. `src`, `color` are already initialized in it. + * @return LV_RES_OK: the info is successfully stored in `header`; LV_RES_INV: unknown format or other error. + */ +lv_res_t lv_img_decoder_built_in_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc) +{ + /*Open the file if it's a file*/ + if(dsc->src_type == LV_IMG_SRC_FILE) { + /*Support only "*.bin" files*/ + if(strcmp(lv_fs_get_ext(dsc->src), "bin")) return LV_RES_INV; + + lv_fs_file_t f; + lv_fs_res_t res = lv_fs_open(&f, dsc->src, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) { + LV_LOG_WARN("Built-in image decoder can't open the file"); + return LV_RES_INV; + } + + /*If the file was open successfully save the file descriptor*/ + if(dsc->user_data == NULL) { + dsc->user_data = lv_mem_alloc(sizeof(lv_img_decoder_built_in_data_t)); + LV_ASSERT_MALLOC(dsc->user_data); + if(dsc->user_data == NULL) { + LV_LOG_ERROR("img_decoder_built_in_open: out of memory"); + lv_fs_close(&f); + return LV_RES_INV; + } + lv_memset_00(dsc->user_data, sizeof(lv_img_decoder_built_in_data_t)); + } + + lv_img_decoder_built_in_data_t * user_data = dsc->user_data; + lv_memcpy_small(&user_data->f, &f, sizeof(f)); + } + else if(dsc->src_type == LV_IMG_SRC_VARIABLE) { + /*The variables should have valid data*/ + if(((lv_img_dsc_t *)dsc->src)->data == NULL) { + return LV_RES_INV; + } + } + + lv_img_cf_t cf = dsc->header.cf; + /*Process true color formats*/ + if(cf == LV_IMG_CF_TRUE_COLOR || cf == LV_IMG_CF_TRUE_COLOR_ALPHA || + cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED || cf == LV_IMG_CF_RGB565A8 || + cf == LV_IMG_CF_ALPHA_8BIT) { + if(dsc->src_type == LV_IMG_SRC_VARIABLE) { + /*In case of uncompressed formats the image stored in the ROM/RAM. + *So simply give its pointer*/ + dsc->img_data = ((lv_img_dsc_t *)dsc->src)->data; + return LV_RES_OK; + } + else { + /*If it's a file it need to be read line by line later*/ + return LV_RES_OK; + } + } + /*Process indexed images. Build a palette*/ + else if(cf == LV_IMG_CF_INDEXED_1BIT || cf == LV_IMG_CF_INDEXED_2BIT || cf == LV_IMG_CF_INDEXED_4BIT || + cf == LV_IMG_CF_INDEXED_8BIT) { + uint8_t px_size = lv_img_cf_get_px_size(cf); + uint32_t palette_size = 1 << px_size; + + /*Allocate the palette*/ + if(dsc->user_data == NULL) { + dsc->user_data = lv_mem_alloc(sizeof(lv_img_decoder_built_in_data_t)); + LV_ASSERT_MALLOC(dsc->user_data); + if(dsc->user_data == NULL) { + LV_LOG_ERROR("img_decoder_built_in_open: out of memory"); + return LV_RES_INV; + } + lv_memset_00(dsc->user_data, sizeof(lv_img_decoder_built_in_data_t)); + } + + lv_img_decoder_built_in_data_t * user_data = dsc->user_data; + user_data->palette = lv_mem_alloc(palette_size * sizeof(lv_color_t)); + LV_ASSERT_MALLOC(user_data->palette); + user_data->opa = lv_mem_alloc(palette_size * sizeof(lv_opa_t)); + LV_ASSERT_MALLOC(user_data->opa); + if(user_data->palette == NULL || user_data->opa == NULL) { + LV_LOG_ERROR("img_decoder_built_in_open: out of memory"); + lv_img_decoder_built_in_close(decoder, dsc); + return LV_RES_INV; + } + + if(dsc->src_type == LV_IMG_SRC_FILE) { + /*Read the palette from file*/ + lv_fs_seek(&user_data->f, 4, LV_FS_SEEK_SET); /*Skip the header*/ + lv_color32_t cur_color; + uint32_t i; + for(i = 0; i < palette_size; i++) { + lv_fs_read(&user_data->f, &cur_color, sizeof(lv_color32_t), NULL); + user_data->palette[i] = lv_color_make(cur_color.ch.red, cur_color.ch.green, cur_color.ch.blue); + user_data->opa[i] = cur_color.ch.alpha; + } + } + else { + /*The palette begins in the beginning of the image data. Just point to it.*/ + lv_color32_t * palette_p = (lv_color32_t *)((lv_img_dsc_t *)dsc->src)->data; + + uint32_t i; + for(i = 0; i < palette_size; i++) { + user_data->palette[i] = lv_color_make(palette_p[i].ch.red, palette_p[i].ch.green, palette_p[i].ch.blue); + user_data->opa[i] = palette_p[i].ch.alpha; + } + } + + return LV_RES_OK; + } + /*Alpha indexed images.*/ + else if(cf == LV_IMG_CF_ALPHA_1BIT || cf == LV_IMG_CF_ALPHA_2BIT || cf == LV_IMG_CF_ALPHA_4BIT) { + return LV_RES_OK; /*Nothing to process*/ + } + /*Unknown format. Can't decode it.*/ + else { + /*Free the potentially allocated memories*/ + lv_img_decoder_built_in_close(decoder, dsc); + + LV_LOG_WARN("Image decoder open: unknown color format"); + return LV_RES_INV; + } +} + +/** + * Decode `len` pixels starting from the given `x`, `y` coordinates and store them in `buf`. + * Required only if the "open" function can't return with the whole decoded pixel array. + * @param decoder pointer to the decoder the function associated with + * @param dsc pointer to decoder descriptor + * @param x start x coordinate + * @param y start y coordinate + * @param len number of pixels to decode + * @param buf a buffer to store the decoded pixels + * @return LV_RES_OK: ok; LV_RES_INV: failed + */ +lv_res_t lv_img_decoder_built_in_read_line(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc, lv_coord_t x, + lv_coord_t y, lv_coord_t len, uint8_t * buf) +{ + LV_UNUSED(decoder); /*Unused*/ + + lv_res_t res = LV_RES_INV; + + if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR || dsc->header.cf == LV_IMG_CF_TRUE_COLOR_ALPHA || + dsc->header.cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) { + /*For TRUE_COLOR images read line required only for files. + *For variables the image data was returned in `open`*/ + if(dsc->src_type == LV_IMG_SRC_FILE) { + res = lv_img_decoder_built_in_line_true_color(dsc, x, y, len, buf); + } + } + else if(dsc->header.cf == LV_IMG_CF_ALPHA_1BIT || dsc->header.cf == LV_IMG_CF_ALPHA_2BIT || + dsc->header.cf == LV_IMG_CF_ALPHA_4BIT || dsc->header.cf == LV_IMG_CF_ALPHA_8BIT) { + res = lv_img_decoder_built_in_line_alpha(dsc, x, y, len, buf); + } + else if(dsc->header.cf == LV_IMG_CF_INDEXED_1BIT || dsc->header.cf == LV_IMG_CF_INDEXED_2BIT || + dsc->header.cf == LV_IMG_CF_INDEXED_4BIT || dsc->header.cf == LV_IMG_CF_INDEXED_8BIT) { + res = lv_img_decoder_built_in_line_indexed(dsc, x, y, len, buf); + } + else { + LV_LOG_WARN("Built-in image decoder read not supports the color format"); + return LV_RES_INV; + } + + return res; +} + +/** + * Close the pending decoding. Free resources etc. + * @param decoder pointer to the decoder the function associated with + * @param dsc pointer to decoder descriptor + */ +void lv_img_decoder_built_in_close(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); /*Unused*/ + + lv_img_decoder_built_in_data_t * user_data = dsc->user_data; + if(user_data) { + if(dsc->src_type == LV_IMG_SRC_FILE) { + lv_fs_close(&user_data->f); + } + if(user_data->palette) lv_mem_free(user_data->palette); + if(user_data->opa) lv_mem_free(user_data->opa); + + lv_mem_free(user_data); + dsc->user_data = NULL; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_res_t lv_img_decoder_built_in_line_true_color(lv_img_decoder_dsc_t * dsc, lv_coord_t x, lv_coord_t y, + lv_coord_t len, uint8_t * buf) +{ + lv_img_decoder_built_in_data_t * user_data = dsc->user_data; + lv_fs_res_t res; + uint8_t px_size = lv_img_cf_get_px_size(dsc->header.cf); + + uint32_t pos = ((y * dsc->header.w + x) * px_size) >> 3; + pos += 4; /*Skip the header*/ + res = lv_fs_seek(&user_data->f, pos, LV_FS_SEEK_SET); + if(res != LV_FS_RES_OK) { + LV_LOG_WARN("Built-in image decoder seek failed"); + return LV_RES_INV; + } + uint32_t btr = len * (px_size >> 3); + uint32_t br = 0; + res = lv_fs_read(&user_data->f, buf, btr, &br); + if(res != LV_FS_RES_OK || btr != br) { + LV_LOG_WARN("Built-in image decoder read failed"); + return LV_RES_INV; + } + + return LV_RES_OK; +} + +static lv_res_t lv_img_decoder_built_in_line_alpha(lv_img_decoder_dsc_t * dsc, lv_coord_t x, lv_coord_t y, + lv_coord_t len, uint8_t * buf) +{ + const lv_opa_t alpha1_opa_table[2] = {0, 255}; /*Opacity mapping with bpp = 1 (Just for compatibility)*/ + const lv_opa_t alpha2_opa_table[4] = {0, 85, 170, 255}; /*Opacity mapping with bpp = 2*/ + const lv_opa_t alpha4_opa_table[16] = {0, 17, 34, 51, /*Opacity mapping with bpp = 4*/ + 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255 + }; + + /*Simply fill the buffer with the color. Later only the alpha value will be modified.*/ + lv_color_t bg_color = dsc->color; + lv_coord_t i; + for(i = 0; i < len; i++) { +#if LV_COLOR_DEPTH == 8 || LV_COLOR_DEPTH == 1 + buf[i * LV_IMG_PX_SIZE_ALPHA_BYTE] = bg_color.full; +#elif LV_COLOR_DEPTH == 16 + /*Because of Alpha byte 16 bit color can start on odd address which can cause crash*/ + buf[i * LV_IMG_PX_SIZE_ALPHA_BYTE] = bg_color.full & 0xFF; + buf[i * LV_IMG_PX_SIZE_ALPHA_BYTE + 1] = (bg_color.full >> 8) & 0xFF; +#elif LV_COLOR_DEPTH == 32 + *((uint32_t *)&buf[i * LV_IMG_PX_SIZE_ALPHA_BYTE]) = bg_color.full; +#else +#error "Invalid LV_COLOR_DEPTH. Check it in lv_conf.h" +#endif + } + + const lv_opa_t * opa_table = NULL; + uint8_t px_size = lv_img_cf_get_px_size(dsc->header.cf); + uint16_t mask = (1 << px_size) - 1; /*E.g. px_size = 2; mask = 0x03*/ + + lv_coord_t w = 0; + uint32_t ofs = 0; + int8_t pos = 0; + switch(dsc->header.cf) { + case LV_IMG_CF_ALPHA_1BIT: + w = (dsc->header.w + 7) >> 3; /*E.g. w = 20 -> w = 2 + 1*/ + ofs += w * y + (x >> 3); /*First pixel*/ + pos = 7 - (x & 0x7); + opa_table = alpha1_opa_table; + break; + case LV_IMG_CF_ALPHA_2BIT: + w = (dsc->header.w + 3) >> 2; /*E.g. w = 13 -> w = 3 + 1 (bytes)*/ + ofs += w * y + (x >> 2); /*First pixel*/ + pos = 6 - (x & 0x3) * 2; + opa_table = alpha2_opa_table; + break; + case LV_IMG_CF_ALPHA_4BIT: + w = (dsc->header.w + 1) >> 1; /*E.g. w = 13 -> w = 6 + 1 (bytes)*/ + ofs += w * y + (x >> 1); /*First pixel*/ + pos = 4 - (x & 0x1) * 4; + opa_table = alpha4_opa_table; + break; + case LV_IMG_CF_ALPHA_8BIT: + w = dsc->header.w; /*E.g. x = 7 -> w = 7 (bytes)*/ + ofs += w * y + x; /*First pixel*/ + pos = 0; + break; + } + + lv_img_decoder_built_in_data_t * user_data = dsc->user_data; + uint8_t * fs_buf = lv_mem_buf_get(w); + if(fs_buf == NULL) return LV_RES_INV; + + const uint8_t * data_tmp = NULL; + if(dsc->src_type == LV_IMG_SRC_VARIABLE) { + const lv_img_dsc_t * img_dsc = dsc->src; + + data_tmp = img_dsc->data + ofs; + } + else { + lv_fs_seek(&user_data->f, ofs + 4, LV_FS_SEEK_SET); /*+4 to skip the header*/ + lv_fs_read(&user_data->f, fs_buf, w, NULL); + data_tmp = fs_buf; + } + + for(i = 0; i < len; i++) { + uint8_t val_act = (*data_tmp >> pos) & mask; + + buf[i * LV_IMG_PX_SIZE_ALPHA_BYTE + LV_IMG_PX_SIZE_ALPHA_BYTE - 1] = + dsc->header.cf == LV_IMG_CF_ALPHA_8BIT ? val_act : opa_table[val_act]; + + pos -= px_size; + if(pos < 0) { + pos = 8 - px_size; + data_tmp++; + } + } + lv_mem_buf_release(fs_buf); + return LV_RES_OK; +} + +static lv_res_t lv_img_decoder_built_in_line_indexed(lv_img_decoder_dsc_t * dsc, lv_coord_t x, lv_coord_t y, + lv_coord_t len, uint8_t * buf) +{ + uint8_t px_size = lv_img_cf_get_px_size(dsc->header.cf); + uint16_t mask = (1 << px_size) - 1; /*E.g. px_size = 2; mask = 0x03*/ + + lv_coord_t w = 0; + int8_t pos = 0; + uint32_t ofs = 0; + switch(dsc->header.cf) { + case LV_IMG_CF_INDEXED_1BIT: + w = (dsc->header.w + 7) >> 3; /*E.g. w = 20 -> w = 2 + 1*/ + ofs += w * y + (x >> 3); /*First pixel*/ + ofs += 8; /*Skip the palette*/ + pos = 7 - (x & 0x7); + break; + case LV_IMG_CF_INDEXED_2BIT: + w = (dsc->header.w + 3) >> 2; /*E.g. w = 13 -> w = 3 + 1 (bytes)*/ + ofs += w * y + (x >> 2); /*First pixel*/ + ofs += 16; /*Skip the palette*/ + pos = 6 - (x & 0x3) * 2; + break; + case LV_IMG_CF_INDEXED_4BIT: + w = (dsc->header.w + 1) >> 1; /*E.g. w = 13 -> w = 6 + 1 (bytes)*/ + ofs += w * y + (x >> 1); /*First pixel*/ + ofs += 64; /*Skip the palette*/ + pos = 4 - (x & 0x1) * 4; + break; + case LV_IMG_CF_INDEXED_8BIT: + w = dsc->header.w; /*E.g. x = 7 -> w = 7 (bytes)*/ + ofs += w * y + x; /*First pixel*/ + ofs += 1024; /*Skip the palette*/ + pos = 0; + break; + } + + lv_img_decoder_built_in_data_t * user_data = dsc->user_data; + + uint8_t * fs_buf = lv_mem_buf_get(w); + if(fs_buf == NULL) return LV_RES_INV; + const uint8_t * data_tmp = NULL; + if(dsc->src_type == LV_IMG_SRC_VARIABLE) { + const lv_img_dsc_t * img_dsc = dsc->src; + data_tmp = img_dsc->data + ofs; + } + else { + lv_fs_seek(&user_data->f, ofs + 4, LV_FS_SEEK_SET); /*+4 to skip the header*/ + lv_fs_read(&user_data->f, fs_buf, w, NULL); + data_tmp = fs_buf; + } + + lv_coord_t i; + for(i = 0; i < len; i++) { + uint8_t val_act = (*data_tmp >> pos) & mask; + + lv_color_t color = user_data->palette[val_act]; +#if LV_COLOR_DEPTH == 8 || LV_COLOR_DEPTH == 1 + buf[i * LV_IMG_PX_SIZE_ALPHA_BYTE] = color.full; +#elif LV_COLOR_DEPTH == 16 + /*Because of Alpha byte 16 bit color can start on odd address which can cause crash*/ + buf[i * LV_IMG_PX_SIZE_ALPHA_BYTE] = color.full & 0xFF; + buf[i * LV_IMG_PX_SIZE_ALPHA_BYTE + 1] = (color.full >> 8) & 0xFF; +#elif LV_COLOR_DEPTH == 32 + *((uint32_t *)&buf[i * LV_IMG_PX_SIZE_ALPHA_BYTE]) = color.full; +#else +#error "Invalid LV_COLOR_DEPTH. Check it in lv_conf.h" +#endif + buf[i * LV_IMG_PX_SIZE_ALPHA_BYTE + LV_IMG_PX_SIZE_ALPHA_BYTE - 1] = user_data->opa[val_act]; + + pos -= px_size; + if(pos < 0) { + pos = 8 - px_size; + data_tmp++; + } + } + lv_mem_buf_release(fs_buf); + return LV_RES_OK; +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_img_decoder.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_img_decoder.h new file mode 100644 index 0000000..9dc84dd --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/lv_img_decoder.h @@ -0,0 +1,274 @@ +/** + * @file lv_img_decoder.h + * + */ + +#ifndef LV_IMG_DECODER_H +#define LV_IMG_DECODER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include +#include "lv_img_buf.h" +#include "../misc/lv_fs.h" +#include "../misc/lv_types.h" +#include "../misc/lv_area.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Source of image.*/ +enum { + LV_IMG_SRC_VARIABLE, /** Binary/C variable*/ + LV_IMG_SRC_FILE, /** File in filesystem*/ + LV_IMG_SRC_SYMBOL, /** Symbol (@ref lv_symbol_def.h)*/ + LV_IMG_SRC_UNKNOWN, /** Unknown source*/ +}; + +typedef uint8_t lv_img_src_t; + +/*Decoder function definitions*/ +struct _lv_img_decoder_dsc_t; +struct _lv_img_decoder_t; + +/** + * Get info from an image and store in the `header` + * @param src the image source. Can be a pointer to a C array or a file name (Use + * `lv_img_src_get_type` to determine the type) + * @param header store the info here + * @return LV_RES_OK: info written correctly; LV_RES_INV: failed + */ +typedef lv_res_t (*lv_img_decoder_info_f_t)(struct _lv_img_decoder_t * decoder, const void * src, + lv_img_header_t * header); + +/** + * Open an image for decoding. Prepare it as it is required to read it later + * @param decoder pointer to the decoder the function associated with + * @param dsc pointer to decoder descriptor. `src`, `color` are already initialized in it. + */ +typedef lv_res_t (*lv_img_decoder_open_f_t)(struct _lv_img_decoder_t * decoder, struct _lv_img_decoder_dsc_t * dsc); + +/** + * Decode `len` pixels starting from the given `x`, `y` coordinates and store them in `buf`. + * Required only if the "open" function can't return with the whole decoded pixel array. + * @param decoder pointer to the decoder the function associated with + * @param dsc pointer to decoder descriptor + * @param x start x coordinate + * @param y start y coordinate + * @param len number of pixels to decode + * @param buf a buffer to store the decoded pixels + * @return LV_RES_OK: ok; LV_RES_INV: failed + */ +typedef lv_res_t (*lv_img_decoder_read_line_f_t)(struct _lv_img_decoder_t * decoder, struct _lv_img_decoder_dsc_t * dsc, + lv_coord_t x, lv_coord_t y, lv_coord_t len, uint8_t * buf); + +/** + * Close the pending decoding. Free resources etc. + * @param decoder pointer to the decoder the function associated with + * @param dsc pointer to decoder descriptor + */ +typedef void (*lv_img_decoder_close_f_t)(struct _lv_img_decoder_t * decoder, struct _lv_img_decoder_dsc_t * dsc); + + +typedef struct _lv_img_decoder_t { + lv_img_decoder_info_f_t info_cb; + lv_img_decoder_open_f_t open_cb; + lv_img_decoder_read_line_f_t read_line_cb; + lv_img_decoder_close_f_t close_cb; + +#if LV_USE_USER_DATA + void * user_data; +#endif +} lv_img_decoder_t; + + +/**Describe an image decoding session. Stores data about the decoding*/ +typedef struct _lv_img_decoder_dsc_t { + /**The decoder which was able to open the image source*/ + lv_img_decoder_t * decoder; + + /**The image source. A file path like "S:my_img.png" or pointer to an `lv_img_dsc_t` variable*/ + const void * src; + + /**Color to draw the image. USed when the image has alpha channel only*/ + lv_color_t color; + + /**Frame of the image, using with animated images*/ + int32_t frame_id; + + /**Type of the source: file or variable. Can be set in `open` function if required*/ + lv_img_src_t src_type; + + /**Info about the opened image: color format, size, etc. MUST be set in `open` function*/ + lv_img_header_t header; + + /** Pointer to a buffer where the image's data (pixels) are stored in a decoded, plain format. + * MUST be set in `open` function*/ + const uint8_t * img_data; + + /** How much time did it take to open the image. [ms] + * If not set `lv_img_cache` will measure and set the time to open*/ + uint32_t time_to_open; + + /**A text to display instead of the image when the image can't be opened. + * Can be set in `open` function or set NULL.*/ + const char * error_msg; + + /**Store any custom data here is required*/ + void * user_data; +} lv_img_decoder_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the image decoder module + */ +void _lv_img_decoder_init(void); + +/** + * Get information about an image. + * Try the created image decoder one by one. Once one is able to get info that info will be used. + * @param src the image source. Can be + * 1) File name: E.g. "S:folder/img1.png" (The drivers needs to registered via `lv_fs_drv_register()`) + * 2) Variable: Pointer to an `lv_img_dsc_t` variable + * 3) Symbol: E.g. `LV_SYMBOL_OK` + * @param header the image info will be stored here + * @return LV_RES_OK: success; LV_RES_INV: wasn't able to get info about the image + */ +lv_res_t lv_img_decoder_get_info(const void * src, lv_img_header_t * header); + +/** + * Open an image. + * Try the created image decoders one by one. Once one is able to open the image that decoder is saved in `dsc` + * @param dsc describes a decoding session. Simply a pointer to an `lv_img_decoder_dsc_t` variable. + * @param src the image source. Can be + * 1) File name: E.g. "S:folder/img1.png" (The drivers needs to registered via `lv_fs_drv_register())`) + * 2) Variable: Pointer to an `lv_img_dsc_t` variable + * 3) Symbol: E.g. `LV_SYMBOL_OK` + * @param color The color of the image with `LV_IMG_CF_ALPHA_...` + * @param frame_id the index of the frame. Used only with animated images, set 0 for normal images + * @return LV_RES_OK: opened the image. `dsc->img_data` and `dsc->header` are set. + * LV_RES_INV: none of the registered image decoders were able to open the image. + */ +lv_res_t lv_img_decoder_open(lv_img_decoder_dsc_t * dsc, const void * src, lv_color_t color, int32_t frame_id); + +/** + * Read a line from an opened image + * @param dsc pointer to `lv_img_decoder_dsc_t` used in `lv_img_decoder_open` + * @param x start X coordinate (from left) + * @param y start Y coordinate (from top) + * @param len number of pixels to read + * @param buf store the data here + * @return LV_RES_OK: success; LV_RES_INV: an error occurred + */ +lv_res_t lv_img_decoder_read_line(lv_img_decoder_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_coord_t len, + uint8_t * buf); + +/** + * Close a decoding session + * @param dsc pointer to `lv_img_decoder_dsc_t` used in `lv_img_decoder_open` + */ +void lv_img_decoder_close(lv_img_decoder_dsc_t * dsc); + +/** + * Create a new image decoder + * @return pointer to the new image decoder + */ +lv_img_decoder_t * lv_img_decoder_create(void); + +/** + * Delete an image decoder + * @param decoder pointer to an image decoder + */ +void lv_img_decoder_delete(lv_img_decoder_t * decoder); + +/** + * Set a callback to get information about the image + * @param decoder pointer to an image decoder + * @param info_cb a function to collect info about an image (fill an `lv_img_header_t` struct) + */ +void lv_img_decoder_set_info_cb(lv_img_decoder_t * decoder, lv_img_decoder_info_f_t info_cb); + +/** + * Set a callback to open an image + * @param decoder pointer to an image decoder + * @param open_cb a function to open an image + */ +void lv_img_decoder_set_open_cb(lv_img_decoder_t * decoder, lv_img_decoder_open_f_t open_cb); + +/** + * Set a callback to a decoded line of an image + * @param decoder pointer to an image decoder + * @param read_line_cb a function to read a line of an image + */ +void lv_img_decoder_set_read_line_cb(lv_img_decoder_t * decoder, lv_img_decoder_read_line_f_t read_line_cb); + +/** + * Set a callback to close a decoding session. E.g. close files and free other resources. + * @param decoder pointer to an image decoder + * @param close_cb a function to close a decoding session + */ +void lv_img_decoder_set_close_cb(lv_img_decoder_t * decoder, lv_img_decoder_close_f_t close_cb); + +/** + * Get info about a built-in image + * @param decoder the decoder where this function belongs + * @param src the image source: pointer to an `lv_img_dsc_t` variable, a file path or a symbol + * @param header store the image data here + * @return LV_RES_OK: the info is successfully stored in `header`; LV_RES_INV: unknown format or other error. + */ +lv_res_t lv_img_decoder_built_in_info(lv_img_decoder_t * decoder, const void * src, lv_img_header_t * header); + +/** + * Open a built in image + * @param decoder the decoder where this function belongs + * @param dsc pointer to decoder descriptor. `src`, `style` are already initialized in it. + * @return LV_RES_OK: the info is successfully stored in `header`; LV_RES_INV: unknown format or other error. + */ +lv_res_t lv_img_decoder_built_in_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc); + +/** + * Decode `len` pixels starting from the given `x`, `y` coordinates and store them in `buf`. + * Required only if the "open" function can't return with the whole decoded pixel array. + * @param decoder pointer to the decoder the function associated with + * @param dsc pointer to decoder descriptor + * @param x start x coordinate + * @param y start y coordinate + * @param len number of pixels to decode + * @param buf a buffer to store the decoded pixels + * @return LV_RES_OK: ok; LV_RES_INV: failed + */ +lv_res_t lv_img_decoder_built_in_read_line(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc, lv_coord_t x, + lv_coord_t y, lv_coord_t len, uint8_t * buf); + +/** + * Close the pending decoding. Free resources etc. + * @param decoder pointer to the decoder the function associated with + * @param dsc pointer to decoder descriptor + */ +void lv_img_decoder_built_in_close(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IMG_DECODER_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/lv_draw_nxp.mk b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/lv_draw_nxp.mk new file mode 100644 index 0000000..17371ac --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/lv_draw_nxp.mk @@ -0,0 +1,9 @@ +CSRCS += lv_gpu_nxp.c + +DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp +VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp + +CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp" + +include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk +include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/lv_gpu_nxp.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/lv_gpu_nxp.c new file mode 100644 index 0000000..46da933 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/lv_gpu_nxp.c @@ -0,0 +1,418 @@ +/** + * @file lv_gpu_nxp.c + * + */ + +/** + * MIT License + * + * Copyright 2022 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_gpu_nxp.h" + +#if LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE + +/* + * allow to use both PXP and VGLITE + + * both 2D accelerators can be used at the same time: + * thus VGLITE can be used to accelerate widget drawing + * while PXP accelerates Blit & Fill operations. + */ +#if LV_USE_GPU_NXP_PXP + #include "pxp/lv_draw_pxp_blend.h" +#endif +#if LV_USE_GPU_NXP_VG_LITE + #include "vglite/lv_draw_vglite_blend.h" + #include "vglite/lv_draw_vglite_rect.h" + #include "vglite/lv_draw_vglite_arc.h" +#endif + +#if LV_COLOR_DEPTH != 32 + #include "../../core/lv_refr.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_draw_nxp_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, + const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t cf); + +static void lv_draw_nxp_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); + +static void lv_draw_nxp_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); + +static lv_res_t draw_nxp_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); + +static void lv_draw_nxp_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, + uint16_t radius, uint16_t start_angle, uint16_t end_angle); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_nxp_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + lv_draw_sw_init_ctx(drv, draw_ctx); + + lv_draw_nxp_ctx_t * nxp_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx; + + nxp_draw_ctx->base_draw.draw_arc = lv_draw_nxp_arc; + nxp_draw_ctx->base_draw.draw_rect = lv_draw_nxp_rect; + nxp_draw_ctx->base_draw.draw_img_decoded = lv_draw_nxp_img_decoded; + nxp_draw_ctx->blend = lv_draw_nxp_blend; + //nxp_draw_ctx->base_draw.wait_for_finish = lv_draw_nxp_wait_cb; +} + +void lv_draw_nxp_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + lv_draw_sw_deinit_ctx(drv, draw_ctx); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * During rendering, LVGL might initializes new draw_ctxs and start drawing into + * a separate buffer (called layer). If the content to be rendered has "holes", + * e.g. rounded corner, LVGL temporarily sets the disp_drv.screen_transp flag. + * It means the renderers should draw into an ARGB buffer. + * With 32 bit color depth it's not a big problem but with 16 bit color depth + * the target pixel format is ARGB8565 which is not supported by the GPU. + * In this case, the NXP callbacks should fallback to SW rendering. + */ +static inline bool need_argb8565_support() +{ +#if LV_COLOR_DEPTH != 32 + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + + if(disp->driver->screen_transp == 1) + return true; +#endif + + return false; +} + +static void lv_draw_nxp_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) +{ + lv_area_t blend_area; + + /*Let's get the blend area which is the intersection of the area to fill and the clip area.*/ + if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) + return; /*Fully clipped, nothing to do*/ + + /*Make the blend area relative to the buffer*/ + lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + bool done = false; + + /*Fill/Blend only non masked, normal blended*/ + if(dsc->mask_buf == NULL && dsc->blend_mode == LV_BLEND_MODE_NORMAL && !need_argb8565_support()) { + lv_color_t * dest_buf = draw_ctx->buf; + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); +#if LV_USE_GPU_NXP_VG_LITE + lv_coord_t dest_width = lv_area_get_width(draw_ctx->buf_area); + lv_coord_t dest_height = lv_area_get_height(draw_ctx->buf_area); +#endif + + const lv_color_t * src_buf = dsc->src_buf; + + if(src_buf == NULL) { +#if LV_USE_GPU_NXP_PXP + done = (lv_gpu_nxp_pxp_fill(dest_buf, dest_stride, &blend_area, + dsc->color, dsc->opa) == LV_RES_OK); + if(!done) + PXP_LOG_TRACE("PXP fill failed. Fallback."); + +#endif +#if LV_USE_GPU_NXP_VG_LITE + if(!done) { + done = (lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &blend_area, + dsc->color, dsc->opa) == LV_RES_OK); + if(!done) + VG_LITE_LOG_TRACE("VG-Lite fill failed. Fallback."); + } +#endif + } + else { +#if LV_USE_GPU_NXP_PXP + done = (lv_gpu_nxp_pxp_blit(dest_buf, &blend_area, dest_stride, src_buf, dsc->blend_area, + dsc->opa, LV_DISP_ROT_NONE) == LV_RES_OK); + if(!done) + PXP_LOG_TRACE("PXP blit failed. Fallback."); +#endif +#if LV_USE_GPU_NXP_VG_LITE + if(!done) { + lv_gpu_nxp_vglite_blit_info_t blit; + lv_coord_t src_stride = lv_area_get_width(dsc->blend_area); + + blit.src = src_buf; + blit.src_width = lv_area_get_width(dsc->blend_area); + blit.src_height = lv_area_get_height(dsc->blend_area); + blit.src_stride = src_stride * (int32_t)sizeof(lv_color_t); + blit.src_area.x1 = (blend_area.x1 - (dsc->blend_area->x1 - draw_ctx->buf_area->x1)); + blit.src_area.y1 = (blend_area.y1 - (dsc->blend_area->y1 - draw_ctx->buf_area->y1)); + blit.src_area.x2 = blit.src_area.x1 + blit.src_width - 1; + blit.src_area.y2 = blit.src_area.y1 + blit.src_height - 1; + + blit.dst = dest_buf; + blit.dst_width = dest_width; + blit.dst_height = dest_height; + blit.dst_stride = dest_stride * (int32_t)sizeof(lv_color_t); + blit.dst_area.x1 = blend_area.x1; + blit.dst_area.y1 = blend_area.y1; + blit.dst_area.x2 = blend_area.x2; + blit.dst_area.y2 = blend_area.y2; + + blit.opa = dsc->opa; + blit.zoom = LV_IMG_ZOOM_NONE; + blit.angle = 0; + + done = (lv_gpu_nxp_vglite_blit(&blit) == LV_RES_OK); + + if(!done) + VG_LITE_LOG_TRACE("VG-Lite blit failed. Fallback."); + } +#endif + } + } + + if(!done) + lv_draw_sw_blend_basic(draw_ctx, dsc); +} + +static void lv_draw_nxp_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, + const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t cf) +{ + /*Use the clip area as draw area*/ + lv_area_t draw_area; + lv_area_copy(&draw_area, draw_ctx->clip_area); + bool mask_any = lv_draw_mask_is_any(&draw_area); +#if LV_USE_GPU_NXP_VG_LITE + bool recolor = (dsc->recolor_opa != LV_OPA_TRANSP); +#endif +#if LV_USE_GPU_NXP_PXP + bool scale = (dsc->zoom != LV_IMG_ZOOM_NONE); +#endif + bool done = false; + + lv_area_t blend_area; + /*Let's get the blend area which is the intersection of the area to fill and the clip area.*/ + if(!_lv_area_intersect(&blend_area, coords, draw_ctx->clip_area)) + return; /*Fully clipped, nothing to do*/ + + /*Make the blend area relative to the buffer*/ + lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + const lv_color_t * src_buf = (const lv_color_t *)map_p; + if(!src_buf) { + lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf); + return; + } + + lv_color_t * dest_buf = draw_ctx->buf; + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + +#if LV_USE_GPU_NXP_PXP + if(!mask_any && !scale && !need_argb8565_support() +#if LV_COLOR_DEPTH!=32 + && !lv_img_cf_has_alpha(cf) +#endif + ) { + done = (lv_gpu_nxp_pxp_blit_transform(dest_buf, &blend_area, dest_stride, src_buf, coords, + dsc, cf) == LV_RES_OK); + if(!done) + PXP_LOG_TRACE("PXP blit transform failed. Fallback."); + } +#endif + +#if LV_USE_GPU_NXP_VG_LITE + if(!done && !mask_any && !need_argb8565_support() && + !lv_img_cf_is_chroma_keyed(cf) && !recolor +#if LV_COLOR_DEPTH!=32 + && !lv_img_cf_has_alpha(cf) +#endif + ) { + lv_gpu_nxp_vglite_blit_info_t blit; + lv_coord_t src_stride = lv_area_get_width(coords); + + blit.src = src_buf; + blit.src_width = lv_area_get_width(coords); + blit.src_height = lv_area_get_height(coords); + blit.src_stride = src_stride * (int32_t)sizeof(lv_color_t); + blit.src_area.x1 = (blend_area.x1 - (coords->x1 - draw_ctx->buf_area->x1)); + blit.src_area.y1 = (blend_area.y1 - (coords->y1 - draw_ctx->buf_area->y1)); + blit.src_area.x2 = blit.src_area.x1 + blit.src_width - 1; + blit.src_area.y2 = blit.src_area.y1 + blit.src_height - 1; + + blit.dst = dest_buf; + blit.dst_width = lv_area_get_width(draw_ctx->buf_area); + blit.dst_height = lv_area_get_height(draw_ctx->buf_area); + blit.dst_stride = dest_stride * (int32_t)sizeof(lv_color_t); + blit.dst_area.x1 = blend_area.x1; + blit.dst_area.y1 = blend_area.y1; + blit.dst_area.x2 = blend_area.x2; + blit.dst_area.y2 = blend_area.y2; + + blit.opa = dsc->opa; + blit.angle = dsc->angle; + blit.pivot = dsc->pivot; + blit.zoom = dsc->zoom; + + done = (lv_gpu_nxp_vglite_blit_transform(&blit) == LV_RES_OK); + + if(!done) + VG_LITE_LOG_TRACE("VG-Lite blit transform failed. Fallback."); + } +#endif + + if(!done) + lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf); +} + +static void lv_draw_nxp_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) +{ + bool done = false; + lv_draw_rect_dsc_t nxp_dsc; + + lv_memcpy(&nxp_dsc, dsc, sizeof(nxp_dsc)); +#if LV_DRAW_COMPLEX + /* Draw only the shadow */ + nxp_dsc.bg_opa = 0; + nxp_dsc.bg_img_opa = 0; + nxp_dsc.border_opa = 0; + nxp_dsc.outline_opa = 0; + + lv_draw_sw_rect(draw_ctx, &nxp_dsc, coords); + + /* Draw the background */ + nxp_dsc.shadow_opa = 0; + nxp_dsc.bg_opa = dsc->bg_opa; + done = (draw_nxp_bg(draw_ctx, &nxp_dsc, coords) == LV_RES_OK); +#endif /*LV_DRAW_COMPLEX*/ + + /* Draw the remaining parts */ + nxp_dsc.shadow_opa = 0; + if(done) + nxp_dsc.bg_opa = 0; + nxp_dsc.bg_img_opa = dsc->bg_img_opa; + nxp_dsc.border_opa = dsc->border_opa; + nxp_dsc.outline_opa = dsc->outline_opa; + + lv_draw_sw_rect(draw_ctx, &nxp_dsc, coords); +} + +static lv_res_t draw_nxp_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->bg_opa <= LV_OPA_MIN) + return LV_RES_INV; + + lv_area_t bg_coords; + lv_area_copy(&bg_coords, coords); + + /*If the border fully covers make the bg area 1px smaller to avoid artifacts on the corners*/ + if(dsc->border_width > 1 && dsc->border_opa >= (lv_opa_t)LV_OPA_MAX && dsc->radius != 0) { + bg_coords.x1 += (dsc->border_side & LV_BORDER_SIDE_LEFT) ? 1 : 0; + bg_coords.y1 += (dsc->border_side & LV_BORDER_SIDE_TOP) ? 1 : 0; + bg_coords.x2 -= (dsc->border_side & LV_BORDER_SIDE_RIGHT) ? 1 : 0; + bg_coords.y2 -= (dsc->border_side & LV_BORDER_SIDE_BOTTOM) ? 1 : 0; + } + + lv_area_t clipped_coords; + if(!_lv_area_intersect(&clipped_coords, &bg_coords, draw_ctx->clip_area)) + return LV_RES_INV; + + lv_grad_dir_t grad_dir = dsc->bg_grad.dir; + lv_color_t bg_color = grad_dir == LV_GRAD_DIR_NONE ? dsc->bg_color : dsc->bg_grad.stops[0].color; + if(bg_color.full == dsc->bg_grad.stops[1].color.full) grad_dir = LV_GRAD_DIR_NONE; + + bool mask_any = lv_draw_mask_is_any(&bg_coords); + + /* + * Most simple case: just a plain rectangle (no mask, no radius, no gradient) + * shall fallback to lv_draw_sw_blend(). + * + * Complex case: gradient or radius but no mask. + */ + if(!mask_any && ((dsc->radius != 0) || (grad_dir != LV_GRAD_DIR_NONE)) && !need_argb8565_support()) { +#if LV_USE_GPU_NXP_VG_LITE + lv_res_t res = lv_gpu_nxp_vglite_draw_bg(draw_ctx, dsc, &bg_coords); + if(res != LV_RES_OK) + VG_LITE_LOG_TRACE("VG-Lite draw bg failed. Fallback."); + + return res; +#endif + } + + return LV_RES_INV; +} + +static void lv_draw_nxp_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, + uint16_t radius, uint16_t start_angle, uint16_t end_angle) +{ + bool done = false; + +#if LV_DRAW_COMPLEX + if(dsc->opa <= LV_OPA_MIN) + return; + if(dsc->width == 0) + return; + if(start_angle == end_angle) + return; + +#if LV_USE_GPU_NXP_VG_LITE + if(!need_argb8565_support()) { + done = (lv_gpu_nxp_vglite_draw_arc(draw_ctx, dsc, center, (int32_t)radius, + (int32_t)start_angle, (int32_t)end_angle) == LV_RES_OK); + if(!done) + VG_LITE_LOG_TRACE("VG-Lite draw arc failed. Fallback."); + } +#endif +#endif/*LV_DRAW_COMPLEX*/ + + if(!done) + lv_draw_sw_arc(draw_ctx, dsc, center, radius, start_angle, end_angle); +} + +#endif /*LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/lv_gpu_nxp.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/lv_gpu_nxp.h new file mode 100644 index 0000000..899aff2 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/lv_gpu_nxp.h @@ -0,0 +1,71 @@ +/** + * @file lv_gpu_nxp.h + * + */ + +/** + * MIT License + * + * Copyright 2022 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LV_GPU_NXP_H +#define LV_GPU_NXP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" +#if LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE +#include "../sw/lv_draw_sw.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef lv_draw_sw_ctx_t lv_draw_nxp_ctx_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_nxp_ctx_init(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); + +void lv_draw_nxp_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); + +/********************** + * MACROS + **********************/ +#endif /*LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GPU_NXP_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk new file mode 100644 index 0000000..ff475a1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk @@ -0,0 +1,8 @@ +CSRCS += lv_draw_pxp_blend.c +CSRCS += lv_gpu_nxp_pxp_osa.c +CSRCS += lv_gpu_nxp_pxp.c + +DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/pxp +VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/pxp + +CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/pxp" diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.c new file mode 100644 index 0000000..c0a6eca --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.c @@ -0,0 +1,632 @@ +/** + * @file lv_draw_pxp_blend.c + * + */ + +/** + * MIT License + * + * Copyright 2020-2022 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_pxp_blend.h" + +#if LV_USE_GPU_NXP_PXP + +/********************* + * DEFINES + *********************/ + +#if LV_COLOR_16_SWAP + #error Color swap not implemented. Disable LV_COLOR_16_SWAP feature. +#endif + +#if LV_COLOR_DEPTH==16 + #define PXP_OUT_PIXEL_FORMAT kPXP_OutputPixelFormatRGB565 + #define PXP_AS_PIXEL_FORMAT kPXP_AsPixelFormatRGB565 + #define PXP_PS_PIXEL_FORMAT kPXP_PsPixelFormatRGB565 +#elif LV_COLOR_DEPTH==32 + #define PXP_OUT_PIXEL_FORMAT kPXP_OutputPixelFormatARGB8888 + #define PXP_AS_PIXEL_FORMAT kPXP_AsPixelFormatARGB8888 + #define PXP_PS_PIXEL_FORMAT kPXP_PsPixelFormatRGB888 +#elif + #error Only 16bit and 32bit color depth are supported. Set LV_COLOR_DEPTH to 16 or 32. +#endif + +#if defined (__alpha__) || defined (__ia64__) || defined (__x86_64__) \ + || defined (_WIN64) || defined (__LP64__) || defined (__LLP64__) + #define ALIGN_SIZE 8 +#else + #define ALIGN_SIZE 4 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/** + * BLock Image Transfer - copy rectangular image from src buffer to dst buffer + * with combination of transformation (rotation, scale, recolor) and opacity, alpha channel + * or color keying. This requires two steps. First step is used for transformation into + * a temporary buffer and the second one will handle the color format or opacity. + * + * @param[in/out] dest_buf destination buffer + * @param[in] dest_area area to be copied from src_buf to dst_buf + * @param[in] dest_stride width (stride) of destination buffer in pixels + * @param[in] src_buf source buffer + * @param[in] src_area source area with absolute coordinates to draw on destination buffer + * @param[in] dsc image descriptor + * @param[in] cf color format + * @retval LV_RES_OK Fill completed + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS) + */ +static lv_res_t lv_gpu_nxp_pxp_blit_opa(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, + const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf); + +/** + * BLock Image Transfer - copy rectangular image from src buffer to dst buffer + * with transformation and full opacity. + * + * @param[in/out] dest_buf destination buffer + * @param[in] dest_area area to be copied from src_buf to dst_buf + * @param[in] dest_stride width (stride) of destination buffer in pixels + * @param[in] src_buf source buffer + * @param[in] src_area source area with absolute coordinates to draw on destination buffer + * @param[in] dsc image descriptor + * @param[in] cf color format + * @retval LV_RES_OK Fill completed + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS) + */ +static lv_res_t lv_gpu_nxp_pxp_blit_cover(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, + const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf); + +/** + * BLock Image Transfer - copy rectangular image from src buffer to dst buffer + * without transformation but handling color format or opacity. + * + * @param[in/out] dest_buf destination buffer + * @param[in] dest_area area to be copied from src_buf to dst_buf + * @param[in] dest_stride width (stride) of destination buffer in pixels + * @param[in] src_buf source buffer + * @param[in] src_area source area with absolute coordinates to draw on destination buffer + * @param[in] dsc image descriptor + * @param[in] cf color format + * @retval LV_RES_OK Fill completed + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS) + */ +static lv_res_t lv_gpu_nxp_pxp_blit_cf(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, + const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#define ROUND_UP(x, align) ((x + (align - 1)) & ~(align - 1)) + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_res_t lv_gpu_nxp_pxp_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, const lv_area_t * fill_area, + lv_color_t color, lv_opa_t opa) +{ + uint32_t area_size = lv_area_get_size(fill_area); + lv_coord_t area_w = lv_area_get_width(fill_area); + lv_coord_t area_h = lv_area_get_height(fill_area); + + if(opa >= (lv_opa_t)LV_OPA_MAX) { + if(area_size < LV_GPU_NXP_PXP_FILL_SIZE_LIMIT) { + PXP_LOG_TRACE("Area size %d smaller than limit %d.", area_size, LV_GPU_NXP_PXP_FILL_SIZE_LIMIT); + return LV_RES_INV; + } + } + else { + if(area_size < LV_GPU_NXP_PXP_FILL_OPA_SIZE_LIMIT) { + PXP_LOG_TRACE("Area size %d smaller than limit %d.", area_size, LV_GPU_NXP_PXP_FILL_OPA_SIZE_LIMIT); + return LV_RES_INV; + } + } + + PXP_Init(LV_GPU_NXP_PXP_ID); + PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/ + PXP_SetProcessBlockSize(LV_GPU_NXP_PXP_ID, kPXP_BlockSize16); /*Block size 16x16 for higher performance*/ + + /*OUT buffer configure*/ + pxp_output_buffer_config_t outputConfig = { + .pixelFormat = PXP_OUT_PIXEL_FORMAT, + .interlacedMode = kPXP_OutputProgressive, + .buffer0Addr = (uint32_t)(dest_buf + dest_stride * fill_area->y1 + fill_area->x1), + .buffer1Addr = (uint32_t)NULL, + .pitchBytes = dest_stride * sizeof(lv_color_t), + .width = area_w, + .height = area_h + }; + + PXP_SetOutputBufferConfig(LV_GPU_NXP_PXP_ID, &outputConfig); + + if(opa >= (lv_opa_t)LV_OPA_MAX) { + /*Simple color fill without opacity - AS disabled*/ + PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); + + } + else { + /*Fill with opacity - AS used as source (same as OUT)*/ + pxp_as_buffer_config_t asBufferConfig = { + .pixelFormat = PXP_AS_PIXEL_FORMAT, + .bufferAddr = (uint32_t)outputConfig.buffer0Addr, + .pitchBytes = outputConfig.pitchBytes + }; + + PXP_SetAlphaSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &asBufferConfig); + PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, area_w, area_h); + } + + /*Disable PS, use as color generator*/ + PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); + PXP_SetProcessSurfaceBackGroundColor(LV_GPU_NXP_PXP_ID, lv_color_to32(color)); + + /** + * Configure Porter-Duff blending - src settings are unused for fill without opacity (opa = 0xff). + * + * Note: srcFactorMode and dstFactorMode are inverted in fsl_pxp.h: + * srcFactorMode is actually applied on PS alpha value + * dstFactorMode is actually applied on AS alpha value + */ + pxp_porter_duff_config_t pdConfig = { + .enable = 1, + .dstColorMode = kPXP_PorterDuffColorNoAlpha, + .srcColorMode = kPXP_PorterDuffColorNoAlpha, + .dstGlobalAlphaMode = kPXP_PorterDuffGlobalAlpha, + .srcGlobalAlphaMode = kPXP_PorterDuffGlobalAlpha, + .dstFactorMode = kPXP_PorterDuffFactorStraight, + .srcFactorMode = (opa >= (lv_opa_t)LV_OPA_MAX) ? kPXP_PorterDuffFactorStraight : kPXP_PorterDuffFactorInversed, + .dstGlobalAlpha = opa, + .srcGlobalAlpha = opa, + .dstAlphaMode = kPXP_PorterDuffAlphaStraight, /*don't care*/ + .srcAlphaMode = kPXP_PorterDuffAlphaStraight /*don't care*/ + }; + + PXP_SetPorterDuffConfig(LV_GPU_NXP_PXP_ID, &pdConfig); + + lv_gpu_nxp_pxp_run(); /*Start PXP task*/ + + return LV_RES_OK; +} + +lv_res_t lv_gpu_nxp_pxp_blit(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_opa_t opa, lv_disp_rot_t angle) +{ + uint32_t dest_size = lv_area_get_size(dest_area); + lv_coord_t dest_w = lv_area_get_width(dest_area); + lv_coord_t dest_h = lv_area_get_height(dest_area); + + if(opa >= (lv_opa_t)LV_OPA_MAX) { + if(dest_size < LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT) { + PXP_LOG_TRACE("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT); + return LV_RES_INV; + } + } + else { + if(dest_size < LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT) { + PXP_LOG_TRACE("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT); + return LV_RES_INV; + } + } + + PXP_Init(LV_GPU_NXP_PXP_ID); + PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/ + PXP_SetProcessBlockSize(LV_GPU_NXP_PXP_ID, kPXP_BlockSize16); /*block size 16x16 for higher performance*/ + + /* convert rotation angle */ + pxp_rotate_degree_t pxp_rot; + switch(angle) { + case LV_DISP_ROT_NONE: + pxp_rot = kPXP_Rotate0; + break; + case LV_DISP_ROT_90: + pxp_rot = kPXP_Rotate90; + break; + case LV_DISP_ROT_180: + pxp_rot = kPXP_Rotate180; + break; + case LV_DISP_ROT_270: + pxp_rot = kPXP_Rotate270; + break; + default: + pxp_rot = kPXP_Rotate0; + break; + } + PXP_SetRotateConfig(LV_GPU_NXP_PXP_ID, kPXP_RotateOutputBuffer, pxp_rot, kPXP_FlipDisable); + + pxp_as_blend_config_t asBlendConfig = { + .alpha = opa, + .invertAlpha = false, + .alphaMode = kPXP_AlphaRop, + .ropMode = kPXP_RopMergeAs + }; + + if(opa >= (lv_opa_t)LV_OPA_MAX) { + /*Simple blit, no effect - Disable PS buffer*/ + PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); + } + else { + pxp_ps_buffer_config_t psBufferConfig = { + .pixelFormat = PXP_PS_PIXEL_FORMAT, + .swapByte = false, + .bufferAddr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_area->x1), + .bufferAddrU = 0U, + .bufferAddrV = 0U, + .pitchBytes = dest_stride * sizeof(lv_color_t) + }; + + asBlendConfig.alphaMode = kPXP_AlphaOverride; + + PXP_SetProcessSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &psBufferConfig); + PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1, dest_h - 1); + } + + lv_coord_t src_stride = lv_area_get_width(src_area); + + /*AS buffer - source image*/ + pxp_as_buffer_config_t asBufferConfig = { + .pixelFormat = PXP_AS_PIXEL_FORMAT, + .bufferAddr = (uint32_t)src_buf, + .pitchBytes = src_stride * sizeof(lv_color_t) + }; + PXP_SetAlphaSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &asBufferConfig); + PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U); + PXP_SetAlphaSurfaceBlendConfig(LV_GPU_NXP_PXP_ID, &asBlendConfig); + PXP_EnableAlphaSurfaceOverlayColorKey(LV_GPU_NXP_PXP_ID, false); + + /*Output buffer.*/ + pxp_output_buffer_config_t outputBufferConfig = { + .pixelFormat = (pxp_output_pixel_format_t)PXP_OUT_PIXEL_FORMAT, + .interlacedMode = kPXP_OutputProgressive, + .buffer0Addr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_area->x1), + .buffer1Addr = (uint32_t)0U, + .pitchBytes = dest_stride * sizeof(lv_color_t), + .width = dest_w, + .height = dest_h + }; + PXP_SetOutputBufferConfig(LV_GPU_NXP_PXP_ID, &outputBufferConfig); + + lv_gpu_nxp_pxp_run(); /* Start PXP task */ + + return LV_RES_OK; +} + +lv_res_t lv_gpu_nxp_pxp_blit_transform(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, + const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf) +{ + uint32_t dest_size = lv_area_get_size(dest_area); + + if(dsc->opa >= (lv_opa_t)LV_OPA_MAX) { + if(dest_size < LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT) { + PXP_LOG_TRACE("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT); + return LV_RES_INV; + } + } + else { + if(dest_size < LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT) { + PXP_LOG_TRACE("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT); + return LV_RES_INV; + } + } + + bool recolor = (dsc->recolor_opa != LV_OPA_TRANSP); + bool rotation = (dsc->angle != 0); + + if(rotation) { + if(dsc->angle != 0 && dsc->angle != 900 && dsc->angle != 1800 && dsc->angle != 2700) { + PXP_LOG_TRACE("Rotation angle %d is not supported. PXP can rotate only 90x angle.", dsc->angle); + return LV_RES_INV; + } + } + + if(recolor || rotation) { + if(dsc->opa >= (lv_opa_t)LV_OPA_MAX && !lv_img_cf_has_alpha(cf) && !lv_img_cf_is_chroma_keyed(cf)) + return lv_gpu_nxp_pxp_blit_cover(dest_buf, dest_area, dest_stride, src_buf, src_area, dsc, cf); + else + /*Recolor and/or rotation with alpha or opacity is done in two steps.*/ + return lv_gpu_nxp_pxp_blit_opa(dest_buf, dest_area, dest_stride, src_buf, src_area, dsc, cf); + } + + return lv_gpu_nxp_pxp_blit_cf(dest_buf, dest_area, dest_stride, src_buf, src_area, dsc, cf); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_res_t lv_gpu_nxp_pxp_blit_opa(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, + const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf) +{ + lv_coord_t dest_w = lv_area_get_width(dest_area); + lv_coord_t dest_h = lv_area_get_height(dest_area); + lv_res_t res; + uint32_t size = dest_w * dest_h * sizeof(lv_color_t); + + if(ROUND_UP(size, ALIGN_SIZE) >= LV_MEM_SIZE) + PXP_RETURN_INV("Insufficient memory for temporary buffer. Please increase LV_MEM_SIZE."); + + lv_color_t * tmp_buf = (lv_color_t *)lv_mem_buf_get(size); + if(!tmp_buf) + PXP_RETURN_INV("Allocating temporary buffer failed."); + + const lv_area_t tmp_area = { + .x1 = 0, + .y1 = 0, + .x2 = dest_w - 1, + .y2 = dest_h - 1 + }; + + /*Step 1: Transform with full opacity to temporary buffer*/ + res = lv_gpu_nxp_pxp_blit_cover(tmp_buf, &tmp_area, dest_w, src_buf, src_area, dsc, cf); + if(res != LV_RES_OK) { + PXP_LOG_TRACE("Blit cover with full opacity failed."); + lv_mem_buf_release(tmp_buf); + + return res; + } + + /*Step 2: Blit temporary results with required opacity to output*/ + res = lv_gpu_nxp_pxp_blit_cf(dest_buf, dest_area, dest_stride, tmp_buf, &tmp_area, dsc, cf); + + /*Clean-up memory*/ + lv_mem_buf_release(tmp_buf); + + return res; +} + +static lv_res_t lv_gpu_nxp_pxp_blit_cover(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, + const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf) +{ + lv_coord_t dest_w = lv_area_get_width(dest_area); + lv_coord_t dest_h = lv_area_get_height(dest_area); + + bool recolor = (dsc->recolor_opa != LV_OPA_TRANSP); + bool rotation = (dsc->angle != 0); + + PXP_Init(LV_GPU_NXP_PXP_ID); + PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/ + PXP_SetProcessBlockSize(LV_GPU_NXP_PXP_ID, kPXP_BlockSize16); /*block size 16x16 for higher performance*/ + + if(rotation) { + /* + * PXP is set to process 16x16 blocks to optimize the system for memory + * bandwidth and image processing time. + * The output engine essentially truncates any output pixels after the + * desired number of pixels has been written. + * When rotating a source image and the output is not divisible by the block + * size, the incorrect pixels could be truncated and the final output image + * can look shifted. + */ + if(lv_area_get_width(src_area) % 16 || lv_area_get_height(src_area) % 16) { + PXP_LOG_TRACE("Rotation is not supported for image w/o alignment to block size 16x16."); + return LV_RES_INV; + } + + /*Convert rotation angle*/ + pxp_rotate_degree_t pxp_rot; + switch(dsc->angle) { + case 0: + pxp_rot = kPXP_Rotate0; + break; + case 900: + pxp_rot = kPXP_Rotate90; + break; + case 1800: + pxp_rot = kPXP_Rotate180; + break; + case 2700: + pxp_rot = kPXP_Rotate270; + break; + default: + PXP_LOG_TRACE("Rotation angle %d is not supported. PXP can rotate only 90x angle.", dsc->angle); + return LV_RES_INV; + } + PXP_SetRotateConfig(LV_GPU_NXP_PXP_ID, kPXP_RotateOutputBuffer, pxp_rot, kPXP_FlipDisable); + } + + lv_coord_t src_stride = lv_area_get_width(src_area); + + /*AS buffer - source image*/ + pxp_as_buffer_config_t asBufferConfig = { + .pixelFormat = PXP_AS_PIXEL_FORMAT, + .bufferAddr = (uint32_t)src_buf, + .pitchBytes = src_stride * sizeof(lv_color_t) + }; + PXP_SetAlphaSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &asBufferConfig); + PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U); + + /*Disable PS buffer*/ + PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); + if(recolor) + /*Use as color generator*/ + PXP_SetProcessSurfaceBackGroundColor(LV_GPU_NXP_PXP_ID, lv_color_to32(dsc->recolor)); + + /*Output buffer*/ + pxp_output_buffer_config_t outputBufferConfig = { + .pixelFormat = (pxp_output_pixel_format_t)PXP_OUT_PIXEL_FORMAT, + .interlacedMode = kPXP_OutputProgressive, + .buffer0Addr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_area->x1), + .buffer1Addr = (uint32_t)0U, + .pitchBytes = dest_stride * sizeof(lv_color_t), + .width = dest_w, + .height = dest_h + }; + PXP_SetOutputBufferConfig(LV_GPU_NXP_PXP_ID, &outputBufferConfig); + + if(recolor || lv_img_cf_has_alpha(cf)) { + /** + * Configure Porter-Duff blending. + * + * Note: srcFactorMode and dstFactorMode are inverted in fsl_pxp.h: + * srcFactorMode is actually applied on PS alpha value + * dstFactorMode is actually applied on AS alpha value + */ + pxp_porter_duff_config_t pdConfig = { + .enable = 1, + .dstColorMode = kPXP_PorterDuffColorWithAlpha, + .srcColorMode = kPXP_PorterDuffColorNoAlpha, + .dstGlobalAlphaMode = kPXP_PorterDuffGlobalAlpha, + .srcGlobalAlphaMode = lv_img_cf_has_alpha(cf) ? kPXP_PorterDuffLocalAlpha : kPXP_PorterDuffGlobalAlpha, + .dstFactorMode = kPXP_PorterDuffFactorStraight, + .srcFactorMode = kPXP_PorterDuffFactorInversed, + .dstGlobalAlpha = recolor ? dsc->recolor_opa : 0x00, + .srcGlobalAlpha = 0xff, + .dstAlphaMode = kPXP_PorterDuffAlphaStraight, /*don't care*/ + .srcAlphaMode = kPXP_PorterDuffAlphaStraight + }; + PXP_SetPorterDuffConfig(LV_GPU_NXP_PXP_ID, &pdConfig); + } + + lv_gpu_nxp_pxp_run(); /*Start PXP task*/ + + return LV_RES_OK; +} + +static lv_res_t lv_gpu_nxp_pxp_blit_cf(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, + const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf) +{ + lv_coord_t dest_w = lv_area_get_width(dest_area); + lv_coord_t dest_h = lv_area_get_height(dest_area); + + PXP_Init(LV_GPU_NXP_PXP_ID); + PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/ + PXP_SetProcessBlockSize(LV_GPU_NXP_PXP_ID, kPXP_BlockSize16); /*block size 16x16 for higher performance*/ + + pxp_as_blend_config_t asBlendConfig = { + .alpha = dsc->opa, + .invertAlpha = false, + .alphaMode = kPXP_AlphaRop, + .ropMode = kPXP_RopMergeAs + }; + + if(dsc->opa >= (lv_opa_t)LV_OPA_MAX && !lv_img_cf_is_chroma_keyed(cf) && !lv_img_cf_has_alpha(cf)) { + /*Simple blit, no effect - Disable PS buffer*/ + PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); + } + else { + /*PS must be enabled to fetch background pixels. + PS and OUT buffers are the same, blend will be done in-place*/ + pxp_ps_buffer_config_t psBufferConfig = { + .pixelFormat = PXP_PS_PIXEL_FORMAT, + .swapByte = false, + .bufferAddr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_area->x1), + .bufferAddrU = 0U, + .bufferAddrV = 0U, + .pitchBytes = dest_stride * sizeof(lv_color_t) + }; + if(dsc->opa >= (lv_opa_t)LV_OPA_MAX) { + asBlendConfig.alphaMode = lv_img_cf_has_alpha(cf) ? kPXP_AlphaEmbedded : kPXP_AlphaOverride; + } + else { + asBlendConfig.alphaMode = lv_img_cf_has_alpha(cf) ? kPXP_AlphaMultiply : kPXP_AlphaOverride; + } + PXP_SetProcessSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &psBufferConfig); + PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1, dest_h - 1); + } + + lv_coord_t src_stride = lv_area_get_width(src_area); + + /*AS buffer - source image*/ + pxp_as_buffer_config_t asBufferConfig = { + .pixelFormat = PXP_AS_PIXEL_FORMAT, + .bufferAddr = (uint32_t)src_buf, + .pitchBytes = src_stride * sizeof(lv_color_t) + }; + PXP_SetAlphaSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &asBufferConfig); + PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U); + PXP_SetAlphaSurfaceBlendConfig(LV_GPU_NXP_PXP_ID, &asBlendConfig); + + if(lv_img_cf_is_chroma_keyed(cf)) { + lv_color_t colorKeyLow = LV_COLOR_CHROMA_KEY; + lv_color_t colorKeyHigh = LV_COLOR_CHROMA_KEY; + + bool recolor = (dsc->recolor_opa != LV_OPA_TRANSP); + + if(recolor) { + /* New color key after recoloring */ + lv_color_t colorKey = lv_color_mix(dsc->recolor, LV_COLOR_CHROMA_KEY, dsc->recolor_opa); + + LV_COLOR_SET_R(colorKeyLow, colorKey.ch.red != 0 ? colorKey.ch.red - 1 : 0); + LV_COLOR_SET_G(colorKeyLow, colorKey.ch.green != 0 ? colorKey.ch.green - 1 : 0); + LV_COLOR_SET_B(colorKeyLow, colorKey.ch.blue != 0 ? colorKey.ch.blue - 1 : 0); + +#if LV_COLOR_DEPTH==16 + LV_COLOR_SET_R(colorKeyHigh, colorKey.ch.red != 0x1f ? colorKey.ch.red + 1 : 0x1f); + LV_COLOR_SET_G(colorKeyHigh, colorKey.ch.green != 0x3f ? colorKey.ch.green + 1 : 0x3f); + LV_COLOR_SET_B(colorKeyHigh, colorKey.ch.blue != 0x1f ? colorKey.ch.blue + 1 : 0x1f); +#else /*LV_COLOR_DEPTH==32*/ + LV_COLOR_SET_R(colorKeyHigh, colorKey.ch.red != 0xff ? colorKey.ch.red + 1 : 0xff); + LV_COLOR_SET_G(colorKeyHigh, colorKey.ch.green != 0xff ? colorKey.ch.green + 1 : 0xff); + LV_COLOR_SET_B(colorKeyHigh, colorKey.ch.blue != 0xff ? colorKey.ch.blue + 1 : 0xff); +#endif + } + + PXP_SetAlphaSurfaceOverlayColorKey(LV_GPU_NXP_PXP_ID, lv_color_to32(colorKeyLow), + lv_color_to32(colorKeyHigh)); + } + + PXP_EnableAlphaSurfaceOverlayColorKey(LV_GPU_NXP_PXP_ID, lv_img_cf_is_chroma_keyed(cf)); + + /*Output buffer.*/ + pxp_output_buffer_config_t outputBufferConfig = { + .pixelFormat = (pxp_output_pixel_format_t)PXP_OUT_PIXEL_FORMAT, + .interlacedMode = kPXP_OutputProgressive, + .buffer0Addr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_area->x1), + .buffer1Addr = (uint32_t)0U, + .pitchBytes = dest_stride * sizeof(lv_color_t), + .width = dest_w, + .height = dest_h + }; + PXP_SetOutputBufferConfig(LV_GPU_NXP_PXP_ID, &outputBufferConfig); + + lv_gpu_nxp_pxp_run(); /* Start PXP task */ + + return LV_RES_OK; +} + +#endif /*LV_USE_GPU_NXP_PXP*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.h new file mode 100644 index 0000000..43a6440 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.h @@ -0,0 +1,143 @@ +/** + * @file lv_draw_pxp_blend.h + * + */ + +/** + * MIT License + * + * Copyright 2020-2022 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LV_DRAW_PXP_BLEND_H +#define LV_DRAW_PXP_BLEND_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_GPU_NXP_PXP +#include "lv_gpu_nxp_pxp.h" +#include "../../sw/lv_draw_sw.h" + +/********************* + * DEFINES + *********************/ + +#ifndef LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT +/** Minimum area (in pixels) for image copy with 100% opacity to be handled by PXP*/ +#define LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT 5000 +#endif + +#ifndef LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT +/** Minimum area (in pixels) for image copy with transparency to be handled by PXP*/ +#define LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT 5000 +#endif + +#ifndef LV_GPU_NXP_PXP_BUFF_SYNC_BLIT_SIZE_LIMIT +/** Minimum invalidated area (in pixels) to be synchronized by PXP during buffer sync */ +#define LV_GPU_NXP_PXP_BUFF_SYNC_BLIT_SIZE_LIMIT 5000 +#endif + +#ifndef LV_GPU_NXP_PXP_FILL_SIZE_LIMIT +/** Minimum area (in pixels) to be filled by PXP with 100% opacity*/ +#define LV_GPU_NXP_PXP_FILL_SIZE_LIMIT 5000 +#endif + +#ifndef LV_GPU_NXP_PXP_FILL_OPA_SIZE_LIMIT +/** Minimum area (in pixels) to be filled by PXP with transparency*/ +#define LV_GPU_NXP_PXP_FILL_OPA_SIZE_LIMIT 5000 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Fill area, with optional opacity. + * + * @param[in/out] dest_buf destination buffer + * @param[in] dest_stride width (stride) of destination buffer in pixels + * @param[in] fill_area area to fill + * @param[in] color color + * @param[in] opa transparency of the color + * @retval LV_RES_OK Fill completed + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS) + */ +lv_res_t lv_gpu_nxp_pxp_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, const lv_area_t * fill_area, + lv_color_t color, lv_opa_t opa); + +/** + * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with effects. + * By default, image is copied directly, with optional opacity. This function can also + * rotate the display output buffer to a specified angle (90x step). + * + * @param[in/out] dest_buf destination buffer + * @param[in] dest_area destination area + * @param[in] dest_stride width (stride) of destination buffer in pixels + * @param[in] src_buf source buffer + * @param[in] src_area source area with absolute coordinates to draw on destination buffer + * @param[in] opa opacity of the result + * @param[in] angle display rotation angle (90x) + * @retval LV_RES_OK Fill completed + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS) + */ +lv_res_t lv_gpu_nxp_pxp_blit(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_opa_t opa, lv_disp_rot_t angle); + +/** + * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with transformation. + * + * + * @param[in/out] dest_buf destination buffer + * @param[in] dest_area destination area + * @param[in] dest_stride width (stride) of destination buffer in pixels + * @param[in] src_buf source buffer + * @param[in] src_area source area with absolute coordinates to draw on destination buffer + * @param[in] dsc image descriptor + * @param[in] cf color format + * @retval LV_RES_OK Fill completed + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS) + */ +lv_res_t lv_gpu_nxp_pxp_blit_transform(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GPU_NXP_PXP*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_PXP_BLEND_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c new file mode 100644 index 0000000..94d242a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c @@ -0,0 +1,116 @@ +/** + * @file lv_gpu_nxp_pxp.c + * + */ + +/** + * MIT License + * + * Copyright 2020-2022 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_gpu_nxp_pxp.h" + +#if LV_USE_GPU_NXP_PXP +#include "lv_gpu_nxp_pxp_osa.h" +#include "../../../core/lv_refr.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/** + * Clean & invalidate cache. + */ +static void invalidate_cache(void); + +/********************** + * STATIC VARIABLES + **********************/ + +static lv_nxp_pxp_cfg_t * pxp_cfg; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_res_t lv_gpu_nxp_pxp_init(void) +{ + pxp_cfg = lv_gpu_nxp_pxp_get_cfg(); + + if(!pxp_cfg || !pxp_cfg->pxp_interrupt_deinit || !pxp_cfg->pxp_interrupt_init || !pxp_cfg->pxp_run) + PXP_RETURN_INV("PXP configuration error."); + + PXP_Init(LV_GPU_NXP_PXP_ID); + PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/ + PXP_EnableInterrupts(LV_GPU_NXP_PXP_ID, kPXP_CompleteInterruptEnable); + + if(pxp_cfg->pxp_interrupt_init() != LV_RES_OK) { + PXP_Deinit(LV_GPU_NXP_PXP_ID); + PXP_RETURN_INV("PXP interrupt init failed."); + } + + return LV_RES_OK; +} + +void lv_gpu_nxp_pxp_deinit(void) +{ + pxp_cfg->pxp_interrupt_deinit(); + PXP_DisableInterrupts(PXP, kPXP_CompleteInterruptEnable); + PXP_Deinit(LV_GPU_NXP_PXP_ID); +} + +void lv_gpu_nxp_pxp_run(void) +{ + /*Clean & invalidate cache*/ + invalidate_cache(); + + pxp_cfg->pxp_run(); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void invalidate_cache(void) +{ + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + if(disp->driver->clean_dcache_cb) + disp->driver->clean_dcache_cb(disp->driver); +} + +#endif /*LV_USE_GPU_NXP_PXP*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h new file mode 100644 index 0000000..e695d8f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h @@ -0,0 +1,153 @@ +/** + * @file lv_gpu_nxp_pxp.h + * + */ + +/** + * MIT License + * + * Copyright 2020-2022 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LV_GPU_NXP_PXP_H +#define LV_GPU_NXP_PXP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_GPU_NXP_PXP +#include "fsl_cache.h" +#include "fsl_pxp.h" + +#include "../../../misc/lv_log.h" + +/********************* + * DEFINES + *********************/ + +/** PXP module instance to use*/ +#define LV_GPU_NXP_PXP_ID PXP + +/** PXP interrupt line ID*/ +#define LV_GPU_NXP_PXP_IRQ_ID PXP_IRQn + +#ifndef LV_GPU_NXP_PXP_LOG_ERRORS +/** Enable logging of PXP errors (\see LV_LOG_ERROR)*/ +#define LV_GPU_NXP_PXP_LOG_ERRORS 1 +#endif + +#ifndef LV_GPU_NXP_PXP_LOG_TRACES +/** Enable logging of PXP errors (\see LV_LOG_ERROR)*/ +#define LV_GPU_NXP_PXP_LOG_TRACES 0 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/** + * NXP PXP device configuration - call-backs used for + * interrupt init/wait/deinit. + */ +typedef struct { + /** Callback for PXP interrupt initialization*/ + lv_res_t (*pxp_interrupt_init)(void); + + /** Callback for PXP interrupt de-initialization*/ + void (*pxp_interrupt_deinit)(void); + + /** Callback that should start PXP and wait for operation complete*/ + void (*pxp_run)(void); +} lv_nxp_pxp_cfg_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Reset and initialize PXP device. This function should be called as a part + * of display init sequence. + * + * @retval LV_RES_OK PXP init completed + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS) + */ +lv_res_t lv_gpu_nxp_pxp_init(void); + +/** + * Disable PXP device. Should be called during display deinit sequence. + */ +void lv_gpu_nxp_pxp_deinit(void); + +/** + * Start PXP job and wait for completion. + */ +void lv_gpu_nxp_pxp_run(void); + +/********************** + * MACROS + **********************/ + +#define PXP_COND_STOP(cond, txt) \ + do { \ + if (cond) { \ + LV_LOG_ERROR("%s. STOP!", txt); \ + for ( ; ; ); \ + } \ + } while(0) + +#if LV_GPU_NXP_PXP_LOG_ERRORS +#define PXP_RETURN_INV(fmt, ...) \ + do { \ + LV_LOG_ERROR(fmt, ##__VA_ARGS__); \ + return LV_RES_INV; \ + } while (0) +#else +#define PXP_RETURN_INV(fmt, ...) \ + do { \ + return LV_RES_INV; \ + }while(0) +#endif /*LV_GPU_NXP_PXP_LOG_ERRORS*/ + +#if LV_GPU_NXP_PXP_LOG_TRACES +#define PXP_LOG_TRACE(fmt, ...) \ + do { \ + LV_LOG_ERROR(fmt, ##__VA_ARGS__); \ + } while (0) +#else +#define PXP_LOG_TRACE(fmt, ...) \ + do { \ + } while (0) +#endif /*LV_GPU_NXP_PXP_LOG_TRACES*/ + +#endif /*LV_USE_GPU_NXP_PXP*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GPU_NXP_PXP_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c new file mode 100644 index 0000000..c4b8dbe --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c @@ -0,0 +1,164 @@ +/** + * @file lv_gpu_nxp_pxp_osa.c + * + */ + +/** + * MIT License + * + * Copyright 2020, 2022 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_gpu_nxp_pxp_osa.h" + +#if LV_USE_GPU_NXP_PXP && LV_USE_GPU_NXP_PXP_AUTO_INIT +#include "../../../misc/lv_log.h" +#include "fsl_pxp.h" + +#if defined(SDK_OS_FREE_RTOS) + #include "FreeRTOS.h" + #include "semphr.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/** + * PXP interrupt initialization. + */ +static lv_res_t _lv_gpu_nxp_pxp_interrupt_init(void); + +/** + * PXP interrupt de-initialization. + */ +static void _lv_gpu_nxp_pxp_interrupt_deinit(void); + +/** + * Start the PXP job and wait for task completion. + */ +static void _lv_gpu_nxp_pxp_run(void); + +/********************** + * STATIC VARIABLES + **********************/ + +#if defined(SDK_OS_FREE_RTOS) + static SemaphoreHandle_t s_pxpIdle; +#else + static volatile bool s_pxpIdle; +#endif + +static lv_nxp_pxp_cfg_t pxp_default_cfg = { + .pxp_interrupt_init = _lv_gpu_nxp_pxp_interrupt_init, + .pxp_interrupt_deinit = _lv_gpu_nxp_pxp_interrupt_deinit, + .pxp_run = _lv_gpu_nxp_pxp_run +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void PXP_IRQHandler(void) +{ +#if defined(SDK_OS_FREE_RTOS) + BaseType_t taskAwake = pdFALSE; +#endif + + if(kPXP_CompleteFlag & PXP_GetStatusFlags(LV_GPU_NXP_PXP_ID)) { + PXP_ClearStatusFlags(LV_GPU_NXP_PXP_ID, kPXP_CompleteFlag); +#if defined(SDK_OS_FREE_RTOS) + xSemaphoreGiveFromISR(s_pxpIdle, &taskAwake); + portYIELD_FROM_ISR(taskAwake); +#else + s_pxpIdle = true; +#endif + } +} + +lv_nxp_pxp_cfg_t * lv_gpu_nxp_pxp_get_cfg(void) +{ + return &pxp_default_cfg; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_res_t _lv_gpu_nxp_pxp_interrupt_init(void) +{ +#if defined(SDK_OS_FREE_RTOS) + s_pxpIdle = xSemaphoreCreateBinary(); + if(s_pxpIdle == NULL) + return LV_RES_INV; + + NVIC_SetPriority(LV_GPU_NXP_PXP_IRQ_ID, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 1); +#else + s_pxpIdle = true; +#endif + + NVIC_EnableIRQ(LV_GPU_NXP_PXP_IRQ_ID); + + return LV_RES_OK; +} + +static void _lv_gpu_nxp_pxp_interrupt_deinit(void) +{ + NVIC_DisableIRQ(LV_GPU_NXP_PXP_IRQ_ID); +#if defined(SDK_OS_FREE_RTOS) + vSemaphoreDelete(s_pxpIdle); +#endif +} + +static void _lv_gpu_nxp_pxp_run(void) +{ +#if !defined(SDK_OS_FREE_RTOS) + s_pxpIdle = false; +#endif + + PXP_EnableInterrupts(LV_GPU_NXP_PXP_ID, kPXP_CompleteInterruptEnable); + PXP_Start(LV_GPU_NXP_PXP_ID); + +#if defined(SDK_OS_FREE_RTOS) + PXP_COND_STOP(!xSemaphoreTake(s_pxpIdle, portMAX_DELAY), "xSemaphoreTake failed."); +#else + while(s_pxpIdle == false) { + } +#endif +} + +#endif /*LV_USE_GPU_NXP_PXP && LV_USE_GPU_NXP_PXP_AUTO_INIT*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.h new file mode 100644 index 0000000..5c87824 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.h @@ -0,0 +1,78 @@ +/** + * @file lv_gpu_nxp_pxp_osa.h + * + */ + +/** + * MIT License + * + * Copyright 2020, 2022 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LV_GPU_NXP_PXP_OSA_H +#define LV_GPU_NXP_PXP_OSA_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_GPU_NXP_PXP && LV_USE_GPU_NXP_PXP_AUTO_INIT +#include "lv_gpu_nxp_pxp.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * PXP device interrupt handler. Used to check PXP task completion status. + */ +void PXP_IRQHandler(void); + +/** + * Helper function to get the PXP default configuration. + */ +lv_nxp_pxp_cfg_t * lv_gpu_nxp_pxp_get_cfg(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GPU_NXP_PXP && LV_USE_GPU_NXP_PXP_AUTO_INIT*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GPU_NXP_PXP_OSA_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk new file mode 100644 index 0000000..c84e2e4 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk @@ -0,0 +1,9 @@ +CSRCS += lv_draw_vglite_arc.c +CSRCS += lv_draw_vglite_blend.c +CSRCS += lv_draw_vglite_rect.c +CSRCS += lv_gpu_nxp_vglite.c + +DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/vglite +VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/vglite + +CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/vglite" diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.c new file mode 100644 index 0000000..194f03d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.c @@ -0,0 +1,699 @@ +/** + * @file lv_draw_vglite_arc.c + * + */ + +/** + * MIT License + * + * Copyright 2021, 2022 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vglite_arc.h" + +#if LV_USE_GPU_NXP_VG_LITE +#include "math.h" + +/********************* + * DEFINES + *********************/ + +#define T_FRACTION 16384.0f + +#define DICHOTO_ITER 5 + +static const uint16_t TperDegree[90] = { + 0, 174, 348, 522, 697, 873, 1049, 1226, 1403, 1581, + 1759, 1938, 2117, 2297, 2477, 2658, 2839, 3020, 3202, 3384, + 3567, 3749, 3933, 4116, 4300, 4484, 4668, 4852, 5037, 5222, + 5407, 5592, 5777, 5962, 6148, 6334, 6519, 6705, 6891, 7077, + 7264, 7450, 7636, 7822, 8008, 8193, 8378, 8564, 8750, 8936, + 9122, 9309, 9495, 9681, 9867, 10052, 10238, 10424, 10609, 10794, + 10979, 11164, 11349, 11534, 11718, 11902, 12086, 12270, 12453, 12637, + 12819, 13002, 13184, 13366, 13547, 13728, 13909, 14089, 14269, 14448, + 14627, 14805, 14983, 15160, 15337, 15513, 15689, 15864, 16038, 16212 +}; + +/********************** + * TYPEDEFS + **********************/ + +/* intermediate arc params */ +typedef struct _vg_arc { + int32_t angle; /* angle <90deg */ + int32_t quarter; /* 0-3 counter-clockwise */ + int32_t rad; /* radius */ + int32_t p0x; /* point P0 */ + int32_t p0y; + int32_t p1x; /* point P1 */ + int32_t p1y; + int32_t p2x; /* point P2 */ + int32_t p2y; + int32_t p3x; /* point P3 */ + int32_t p3y; +} vg_arc; + +typedef struct _cubic_cont_pt { + float p0; + float p1; + float p2; + float p3; +} cubic_cont_pt; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void rotate_point(int32_t angle, int32_t * x, int32_t * y); +static void add_arc_path(int32_t * arc_path, int * pidx, int32_t radius, + int32_t start_angle, int32_t end_angle, lv_point_t center, bool cw); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_res_t lv_gpu_nxp_vglite_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, + int32_t radius, int32_t start_angle, int32_t end_angle) +{ + + vg_lite_buffer_t vgbuf; + vg_lite_error_t err = VG_LITE_SUCCESS; + lv_color32_t col32 = {.full = lv_color_to32(dsc->color)}; /*Convert color to RGBA8888*/ + lv_coord_t dest_width = lv_area_get_width(draw_ctx->buf_area); + lv_coord_t dest_height = lv_area_get_height(draw_ctx->buf_area); + vg_lite_path_t path; + vg_lite_color_t vgcol; /* vglite takes ABGR */ + vg_lite_matrix_t matrix; + lv_opa_t opa = dsc->opa; + bool donut = ((end_angle - start_angle) % 360 == 0) ? true : false; + lv_point_t clip_center = {center->x - draw_ctx->buf_area->x1, center->y - draw_ctx->buf_area->y1}; + + /* path: max size = 16 cubic bezier (7 words each) */ + int32_t arc_path[16 * 7]; + lv_memset_00(arc_path, sizeof(arc_path)); + + /*** Init destination buffer ***/ + if(lv_vglite_init_buf(&vgbuf, (uint32_t)dest_width, (uint32_t)dest_height, (uint32_t)dest_width * sizeof(lv_color_t), + (const lv_color_t *)draw_ctx->buf, false) != LV_RES_OK) + VG_LITE_RETURN_INV("Init buffer failed."); + + /*** Init path ***/ + lv_coord_t width = dsc->width; /* inner arc radius = outer arc radius - width */ + if(width > (lv_coord_t)radius) + width = radius; + + int pidx = 0; + int32_t cp_x, cp_y; /* control point coords */ + + /* first control point of curve */ + cp_x = radius; + cp_y = 0; + rotate_point(start_angle, &cp_x, &cp_y); + arc_path[pidx++] = VLC_OP_MOVE; + arc_path[pidx++] = clip_center.x + cp_x; + arc_path[pidx++] = clip_center.y + cp_y; + + /* draw 1-5 outer quarters */ + add_arc_path(arc_path, &pidx, radius, start_angle, end_angle, clip_center, true); + + if(donut) { + /* close outer circle */ + cp_x = radius; + cp_y = 0; + rotate_point(start_angle, &cp_x, &cp_y); + arc_path[pidx++] = VLC_OP_LINE; + arc_path[pidx++] = clip_center.x + cp_x; + arc_path[pidx++] = clip_center.y + cp_y; + /* start inner circle */ + cp_x = radius - width; + cp_y = 0; + rotate_point(start_angle, &cp_x, &cp_y); + arc_path[pidx++] = VLC_OP_MOVE; + arc_path[pidx++] = clip_center.x + cp_x; + arc_path[pidx++] = clip_center.y + cp_y; + + } + else if(dsc->rounded != 0U) { /* 1st rounded arc ending */ + cp_x = radius - width / 2; + cp_y = 0; + rotate_point(end_angle, &cp_x, &cp_y); + lv_point_t round_center = {clip_center.x + cp_x, clip_center.y + cp_y}; + add_arc_path(arc_path, &pidx, width / 2, end_angle, (end_angle + 180), + round_center, true); + + } + else { /* 1st flat ending */ + cp_x = radius - width; + cp_y = 0; + rotate_point(end_angle, &cp_x, &cp_y); + arc_path[pidx++] = VLC_OP_LINE; + arc_path[pidx++] = clip_center.x + cp_x; + arc_path[pidx++] = clip_center.y + cp_y; + } + + /* draw 1-5 inner quarters */ + add_arc_path(arc_path, &pidx, radius - width, start_angle, end_angle, clip_center, false); + + /* last control point of curve */ + if(donut) { /* close the loop */ + cp_x = radius - width; + cp_y = 0; + rotate_point(start_angle, &cp_x, &cp_y); + arc_path[pidx++] = VLC_OP_LINE; + arc_path[pidx++] = clip_center.x + cp_x; + arc_path[pidx++] = clip_center.y + cp_y; + + } + else if(dsc->rounded != 0U) { /* 2nd rounded arc ending */ + cp_x = radius - width / 2; + cp_y = 0; + rotate_point(start_angle, &cp_x, &cp_y); + lv_point_t round_center = {clip_center.x + cp_x, clip_center.y + cp_y}; + add_arc_path(arc_path, &pidx, width / 2, (start_angle + 180), (start_angle + 360), + round_center, true); + + } + else { /* 2nd flat ending */ + cp_x = radius; + cp_y = 0; + rotate_point(start_angle, &cp_x, &cp_y); + arc_path[pidx++] = VLC_OP_LINE; + arc_path[pidx++] = clip_center.x + cp_x; + arc_path[pidx++] = clip_center.y + cp_y; + } + + arc_path[pidx++] = VLC_OP_END; + + err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_HIGH, (uint32_t)pidx * sizeof(int32_t), arc_path, + (vg_lite_float_t) draw_ctx->clip_area->x1, (vg_lite_float_t) draw_ctx->clip_area->y1, + ((vg_lite_float_t) draw_ctx->clip_area->x2) + 1.0f, ((vg_lite_float_t) draw_ctx->clip_area->y2) + 1.0f); + VG_LITE_ERR_RETURN_INV(err, "Init path failed."); + + /* set rotation angle */ + vg_lite_identity(&matrix); + + if(opa <= (lv_opa_t)LV_OPA_MAX) { + /* Only pre-multiply color if hardware pre-multiplication is not present */ + if(!vg_lite_query_feature(gcFEATURE_BIT_VG_PE_PREMULTIPLY)) { + col32.ch.red = (uint8_t)(((uint16_t)col32.ch.red * opa) >> 8); + col32.ch.green = (uint8_t)(((uint16_t)col32.ch.green * opa) >> 8); + col32.ch.blue = (uint8_t)(((uint16_t)col32.ch.blue * opa) >> 8); + } + col32.ch.alpha = opa; + } + +#if LV_COLOR_DEPTH==16 + vgcol = col32.full; +#else /*LV_COLOR_DEPTH==32*/ + vgcol = ((uint32_t)col32.ch.alpha << 24) | ((uint32_t)col32.ch.blue << 16) | ((uint32_t)col32.ch.green << 8) | + (uint32_t)col32.ch.red; +#endif + + /*Clean & invalidate cache*/ + lv_vglite_invalidate_cache(); + + /*** Draw arc ***/ + err = vg_lite_draw(&vgbuf, &path, VG_LITE_FILL_NON_ZERO, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol); + VG_LITE_ERR_RETURN_INV(err, "Draw arc failed."); + + err = vg_lite_finish(); + VG_LITE_ERR_RETURN_INV(err, "Finish failed."); + + err = vg_lite_clear_path(&path); + VG_LITE_ERR_RETURN_INV(err, "Clear path failed."); + + return LV_RES_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void copy_arc(vg_arc * dst, vg_arc * src) +{ + dst->quarter = src->quarter; + dst->rad = src->rad; + dst->angle = src->angle; + dst->p0x = src->p0x; + dst->p1x = src->p1x; + dst->p2x = src->p2x; + dst->p3x = src->p3x; + dst->p0y = src->p0y; + dst->p1y = src->p1y; + dst->p2y = src->p2y; + dst->p3y = src->p3y; +} + +/** + * Rotate the point according given rotation angle rotation center is 0,0 + */ +static void rotate_point(int32_t angle, int32_t * x, int32_t * y) +{ + int32_t ori_x = *x; + int32_t ori_y = *y; + int16_t alpha = (int16_t)angle; + *x = ((lv_trigo_cos(alpha) * ori_x) / LV_TRIGO_SIN_MAX) - ((lv_trigo_sin(alpha) * ori_y) / LV_TRIGO_SIN_MAX); + *y = ((lv_trigo_sin(alpha) * ori_x) / LV_TRIGO_SIN_MAX) + ((lv_trigo_cos(alpha) * ori_y) / LV_TRIGO_SIN_MAX); +} + +/** + * Set full arc control points depending on quarter. + * Control points match the best approximation of a circle. + * Arc Quarter position is: + * Q2 | Q3 + * ---+--- + * Q1 | Q0 + */ +static void set_full_arc(vg_arc * fullarc) +{ + /* the tangent lenght for the bezier circle approx */ + float tang = ((float)fullarc->rad) * BEZIER_OPTIM_CIRCLE; + switch(fullarc->quarter) { + case 0: + /* first quarter */ + fullarc->p0x = fullarc->rad; + fullarc->p0y = 0; + fullarc->p1x = fullarc->rad; + fullarc->p1y = (int32_t)tang; + fullarc->p2x = (int32_t)tang; + fullarc->p2y = fullarc->rad; + fullarc->p3x = 0; + fullarc->p3y = fullarc->rad; + break; + case 1: + /* second quarter */ + fullarc->p0x = 0; + fullarc->p0y = fullarc->rad; + fullarc->p1x = 0 - (int32_t)tang; + fullarc->p1y = fullarc->rad; + fullarc->p2x = 0 - fullarc->rad; + fullarc->p2y = (int32_t)tang; + fullarc->p3x = 0 - fullarc->rad; + fullarc->p3y = 0; + break; + case 2: + /* third quarter */ + fullarc->p0x = 0 - fullarc->rad; + fullarc->p0y = 0; + fullarc->p1x = 0 - fullarc->rad; + fullarc->p1y = 0 - (int32_t)tang; + fullarc->p2x = 0 - (int32_t)tang; + fullarc->p2y = 0 - fullarc->rad; + fullarc->p3x = 0; + fullarc->p3y = 0 - fullarc->rad; + break; + case 3: + /* fourth quarter */ + fullarc->p0x = 0; + fullarc->p0y = 0 - fullarc->rad; + fullarc->p1x = (int32_t)tang; + fullarc->p1y = 0 - fullarc->rad; + fullarc->p2x = fullarc->rad; + fullarc->p2y = 0 - (int32_t)tang; + fullarc->p3x = fullarc->rad; + fullarc->p3y = 0; + break; + default: + LV_LOG_ERROR("Invalid arc quarter value."); + break; + } +} + +/** + * Linear interpolation between two points 'a' and 'b' + * 't' parameter is the proportion ratio expressed in range [0 ; T_FRACTION ] + */ +static inline float lerp(float coord_a, float coord_b, uint16_t t) +{ + float tf = (float)t; + return ((T_FRACTION - tf) * coord_a + tf * coord_b) / T_FRACTION; +} + +/** + * Computes a point of bezier curve given 't' param + */ +static inline float comp_bezier_point(float t, cubic_cont_pt cp) +{ + float t_sq = t * t; + float inv_t_sq = (1.0f - t) * (1.0f - t); + float apt = (1.0f - t) * inv_t_sq * cp.p0 + 3.0f * inv_t_sq * t * cp.p1 + 3.0f * (1.0f - t) * t_sq * cp.p2 + t * t_sq * + cp.p3; + return apt; +} + +/** + * Find parameter 't' in curve at point 'pt' + * proceed by dichotomy on only 1 dimension, + * works only if the curve is monotonic + * bezier curve is defined by control points [p0 p1 p2 p3] + * 'dec' tells if curve is decreasing (true) or increasing (false) + */ +static uint16_t get_bez_t_from_pos(float pt, cubic_cont_pt cp, bool dec) +{ + /* initialize dichotomy with boundary 't' values */ + float t_low = 0.0f; + float t_mid = 0.5f; + float t_hig = 1.0f; + float a_pt; + /* dichotomy loop */ + for(int i = 0; i < DICHOTO_ITER; i++) { + a_pt = comp_bezier_point(t_mid, cp); + /* check mid-point position on bezier curve versus targeted point */ + if((a_pt > pt) != dec) { + t_hig = t_mid; + } + else { + t_low = t_mid; + } + /* define new 't' param for mid-point */ + t_mid = (t_low + t_hig) / 2.0f; + } + /* return parameter 't' in integer range [0 ; T_FRACTION] */ + return (uint16_t)floorf(t_mid * T_FRACTION + 0.5f); +} + +/** + * Gives relative coords of the control points + * for the sub-arc starting at angle with given angle span + */ +static void get_subarc_control_points(vg_arc * arc, int32_t span) +{ + vg_arc fullarc; + fullarc.angle = arc->angle; + fullarc.quarter = arc->quarter; + fullarc.rad = arc->rad; + set_full_arc(&fullarc); + + /* special case of full arc */ + if(arc->angle == 90) { + copy_arc(arc, &fullarc); + return; + } + + /* compute 1st arc using the geometric construction of curve */ + uint16_t t2 = TperDegree[arc->angle + span]; + + /* lerp for A */ + float a2x = lerp((float)fullarc.p0x, (float)fullarc.p1x, t2); + float a2y = lerp((float)fullarc.p0y, (float)fullarc.p1y, t2); + /* lerp for B */ + float b2x = lerp((float)fullarc.p1x, (float)fullarc.p2x, t2); + float b2y = lerp((float)fullarc.p1y, (float)fullarc.p2y, t2); + /* lerp for C */ + float c2x = lerp((float)fullarc.p2x, (float)fullarc.p3x, t2); + float c2y = lerp((float)fullarc.p2y, (float)fullarc.p3y, t2); + + /* lerp for D */ + float d2x = lerp(a2x, b2x, t2); + float d2y = lerp(a2y, b2y, t2); + /* lerp for E */ + float e2x = lerp(b2x, c2x, t2); + float e2y = lerp(b2y, c2y, t2); + + float pt2x = lerp(d2x, e2x, t2); + float pt2y = lerp(d2y, e2y, t2); + + /* compute sub-arc using the geometric construction of curve */ + uint16_t t1 = TperDegree[arc->angle]; + + /* lerp for A */ + float a1x = lerp((float)fullarc.p0x, (float)fullarc.p1x, t1); + float a1y = lerp((float)fullarc.p0y, (float)fullarc.p1y, t1); + /* lerp for B */ + float b1x = lerp((float)fullarc.p1x, (float)fullarc.p2x, t1); + float b1y = lerp((float)fullarc.p1y, (float)fullarc.p2y, t1); + /* lerp for C */ + float c1x = lerp((float)fullarc.p2x, (float)fullarc.p3x, t1); + float c1y = lerp((float)fullarc.p2y, (float)fullarc.p3y, t1); + + /* lerp for D */ + float d1x = lerp(a1x, b1x, t1); + float d1y = lerp(a1y, b1y, t1); + /* lerp for E */ + float e1x = lerp(b1x, c1x, t1); + float e1y = lerp(b1y, c1y, t1); + + float pt1x = lerp(d1x, e1x, t1); + float pt1y = lerp(d1y, e1y, t1); + + /* find the 't3' parameter for point P(t1) on the sub-arc [P0 A2 D2 P(t2)] using dichotomy + * use position of x axis only */ + uint16_t t3; + t3 = get_bez_t_from_pos(pt1x, + (cubic_cont_pt) { + .p0 = ((float)fullarc.p0x), .p1 = a2x, .p2 = d2x, .p3 = pt2x + }, + (bool)(pt2x < (float)fullarc.p0x)); + + /* lerp for B */ + float b3x = lerp(a2x, d2x, t3); + float b3y = lerp(a2y, d2y, t3); + /* lerp for C */ + float c3x = lerp(d2x, pt2x, t3); + float c3y = lerp(d2y, pt2y, t3); + + /* lerp for E */ + float e3x = lerp(b3x, c3x, t3); + float e3y = lerp(b3y, c3y, t3); + + arc->p0x = (int32_t)floorf(0.5f + pt1x); + arc->p0y = (int32_t)floorf(0.5f + pt1y); + arc->p1x = (int32_t)floorf(0.5f + e3x); + arc->p1y = (int32_t)floorf(0.5f + e3y); + arc->p2x = (int32_t)floorf(0.5f + c3x); + arc->p2y = (int32_t)floorf(0.5f + c3y); + arc->p3x = (int32_t)floorf(0.5f + pt2x); + arc->p3y = (int32_t)floorf(0.5f + pt2y); +} + +/** + * Gives relative coords of the control points + */ +static void get_arc_control_points(vg_arc * arc, bool start) +{ + vg_arc fullarc; + fullarc.angle = arc->angle; + fullarc.quarter = arc->quarter; + fullarc.rad = arc->rad; + set_full_arc(&fullarc); + + /* special case of full arc */ + if(arc->angle == 90) { + copy_arc(arc, &fullarc); + return; + } + + /* compute sub-arc using the geometric construction of curve */ + uint16_t t = TperDegree[arc->angle]; + /* lerp for A */ + float ax = lerp((float)fullarc.p0x, (float)fullarc.p1x, t); + float ay = lerp((float)fullarc.p0y, (float)fullarc.p1y, t); + /* lerp for B */ + float bx = lerp((float)fullarc.p1x, (float)fullarc.p2x, t); + float by = lerp((float)fullarc.p1y, (float)fullarc.p2y, t); + /* lerp for C */ + float cx = lerp((float)fullarc.p2x, (float)fullarc.p3x, t); + float cy = lerp((float)fullarc.p2y, (float)fullarc.p3y, t); + + /* lerp for D */ + float dx = lerp(ax, bx, t); + float dy = lerp(ay, by, t); + /* lerp for E */ + float ex = lerp(bx, cx, t); + float ey = lerp(by, cy, t); + + /* sub-arc's control points are tangents of DeCasteljau's algorithm */ + if(start) { + arc->p0x = (int32_t)floorf(0.5f + lerp(dx, ex, t)); + arc->p0y = (int32_t)floorf(0.5f + lerp(dy, ey, t)); + arc->p1x = (int32_t)floorf(0.5f + ex); + arc->p1y = (int32_t)floorf(0.5f + ey); + arc->p2x = (int32_t)floorf(0.5f + cx); + arc->p2y = (int32_t)floorf(0.5f + cy); + arc->p3x = fullarc.p3x; + arc->p3y = fullarc.p3y; + } + else { + arc->p0x = fullarc.p0x; + arc->p0y = fullarc.p0y; + arc->p1x = (int32_t)floorf(0.5f + ax); + arc->p1y = (int32_t)floorf(0.5f + ay); + arc->p2x = (int32_t)floorf(0.5f + dx); + arc->p2y = (int32_t)floorf(0.5f + dy); + arc->p3x = (int32_t)floorf(0.5f + lerp(dx, ex, t)); + arc->p3y = (int32_t)floorf(0.5f + lerp(dy, ey, t)); + } +} + +/** + * Add the arc control points into the path data for vglite, + * taking into account the real center of the arc (translation). + * arc_path: (in/out) the path data array for vglite + * pidx: (in/out) index of last element added in arc_path + * q_arc: (in) the arc data containing control points + * center: (in) the center of the circle in draw coordinates + * cw: (in) true if arc is clockwise + */ +static void add_split_arc_path(int32_t * arc_path, int * pidx, vg_arc * q_arc, lv_point_t center, bool cw) +{ + /* assumes first control point already in array arc_path[] */ + int idx = *pidx; + if(cw) { +#if BEZIER_DBG_CONTROL_POINTS + arc_path[idx++] = VLC_OP_LINE; + arc_path[idx++] = q_arc->p1x + center.x; + arc_path[idx++] = q_arc->p1y + center.y; + arc_path[idx++] = VLC_OP_LINE; + arc_path[idx++] = q_arc->p2x + center.x; + arc_path[idx++] = q_arc->p2y + center.y; + arc_path[idx++] = VLC_OP_LINE; + arc_path[idx++] = q_arc->p3x + center.x; + arc_path[idx++] = q_arc->p3y + center.y; +#else + arc_path[idx++] = VLC_OP_CUBIC; + arc_path[idx++] = q_arc->p1x + center.x; + arc_path[idx++] = q_arc->p1y + center.y; + arc_path[idx++] = q_arc->p2x + center.x; + arc_path[idx++] = q_arc->p2y + center.y; + arc_path[idx++] = q_arc->p3x + center.x; + arc_path[idx++] = q_arc->p3y + center.y; +#endif + } + else { /* reverse points order when counter-clockwise */ +#if BEZIER_DBG_CONTROL_POINTS + arc_path[idx++] = VLC_OP_LINE; + arc_path[idx++] = q_arc->p2x + center.x; + arc_path[idx++] = q_arc->p2y + center.y; + arc_path[idx++] = VLC_OP_LINE; + arc_path[idx++] = q_arc->p1x + center.x; + arc_path[idx++] = q_arc->p1y + center.y; + arc_path[idx++] = VLC_OP_LINE; + arc_path[idx++] = q_arc->p0x + center.x; + arc_path[idx++] = q_arc->p0y + center.y; +#else + arc_path[idx++] = VLC_OP_CUBIC; + arc_path[idx++] = q_arc->p2x + center.x; + arc_path[idx++] = q_arc->p2y + center.y; + arc_path[idx++] = q_arc->p1x + center.x; + arc_path[idx++] = q_arc->p1y + center.y; + arc_path[idx++] = q_arc->p0x + center.x; + arc_path[idx++] = q_arc->p0y + center.y; +#endif + } + /* update index i n path array*/ + *pidx = idx; +} + +static void add_arc_path(int32_t * arc_path, int * pidx, int32_t radius, + int32_t start_angle, int32_t end_angle, lv_point_t center, bool cw) +{ + /* set number of arcs to draw */ + vg_arc q_arc; + int32_t start_arc_angle = start_angle % 90; + int32_t end_arc_angle = end_angle % 90; + int32_t inv_start_arc_angle = (start_arc_angle > 0) ? (90 - start_arc_angle) : 0; + int32_t nbarc = (end_angle - start_angle - inv_start_arc_angle - end_arc_angle) / 90; + q_arc.rad = radius; + + /* handle special case of start & end point in the same quarter */ + if(((start_angle / 90) == (end_angle / 90)) && (nbarc <= 0)) { + q_arc.quarter = (start_angle / 90) % 4; + q_arc.angle = start_arc_angle; + get_subarc_control_points(&q_arc, end_arc_angle - start_arc_angle); + add_split_arc_path(arc_path, pidx, &q_arc, center, cw); + return; + } + + if(cw) { + /* partial starting arc */ + if(start_arc_angle > 0) { + q_arc.quarter = (start_angle / 90) % 4; + q_arc.angle = start_arc_angle; + /* get cubic points relative to center */ + get_arc_control_points(&q_arc, true); + /* put cubic points in arc_path */ + add_split_arc_path(arc_path, pidx, &q_arc, center, cw); + } + /* full arcs */ + for(int32_t q = 0; q < nbarc ; q++) { + q_arc.quarter = (q + ((start_angle + 89) / 90)) % 4; + q_arc.angle = 90; + /* get cubic points relative to center */ + get_arc_control_points(&q_arc, true); /* 2nd parameter 'start' ignored */ + /* put cubic points in arc_path */ + add_split_arc_path(arc_path, pidx, &q_arc, center, cw); + } + /* partial ending arc */ + if(end_arc_angle > 0) { + q_arc.quarter = (end_angle / 90) % 4; + q_arc.angle = end_arc_angle; + /* get cubic points relative to center */ + get_arc_control_points(&q_arc, false); + /* put cubic points in arc_path */ + add_split_arc_path(arc_path, pidx, &q_arc, center, cw); + } + + } + else { /* counter clockwise */ + + /* partial ending arc */ + if(end_arc_angle > 0) { + q_arc.quarter = (end_angle / 90) % 4; + q_arc.angle = end_arc_angle; + /* get cubic points relative to center */ + get_arc_control_points(&q_arc, false); + /* put cubic points in arc_path */ + add_split_arc_path(arc_path, pidx, &q_arc, center, cw); + } + /* full arcs */ + for(int32_t q = nbarc - 1; q >= 0; q--) { + q_arc.quarter = (q + ((start_angle + 89) / 90)) % 4; + q_arc.angle = 90; + /* get cubic points relative to center */ + get_arc_control_points(&q_arc, true); /* 2nd parameter 'start' ignored */ + /* put cubic points in arc_path */ + add_split_arc_path(arc_path, pidx, &q_arc, center, cw); + } + /* partial starting arc */ + if(start_arc_angle > 0) { + q_arc.quarter = (start_angle / 90) % 4; + q_arc.angle = start_arc_angle; + /* get cubic points relative to center */ + get_arc_control_points(&q_arc, true); + /* put cubic points in arc_path */ + add_split_arc_path(arc_path, pidx, &q_arc, center, cw); + } + } +} + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.h new file mode 100644 index 0000000..98ba8a3 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.h @@ -0,0 +1,79 @@ +/** + * @file lv_draw_vglite_arc.h + * + */ + +/** + * MIT License + * + * Copyright 2021, 2022 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LV_DRAW_VGLITE_ARC_H +#define LV_DRAW_VGLITE_ARC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" + +#if LV_USE_GPU_NXP_VG_LITE +#include "lv_gpu_nxp_vglite.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/*** + * Draw arc shape with effects + * @param draw_ctx drawing context + * @param dsc the arc description structure (width, rounded ending, opacity) + * @param center the coordinates of the arc center + * @param radius the radius of external arc + * @param start_angle the starting angle in degrees + * @param end_angle the ending angle in degrees + */ +lv_res_t lv_gpu_nxp_vglite_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, + int32_t radius, int32_t start_angle, int32_t end_angle); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_VGLITE_ARC_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.c new file mode 100644 index 0000000..b59b143 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.c @@ -0,0 +1,618 @@ +/** + * @file lv_draw_vglite_blend.c + * + */ + +/** + * MIT License + * + * Copyright 2020-2022 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vglite_blend.h" + +#if LV_USE_GPU_NXP_VG_LITE + +/********************* + * DEFINES + *********************/ + +/* Enable BLIT quality degradation workaround for RT595, recommended for screen's dimension > 352 pixels */ +#define RT595_BLIT_WRKRND_ENABLED 1 + +/* Internal compound symbol */ +#if (defined(CPU_MIMXRT595SFFOB) || defined(CPU_MIMXRT595SFFOB_cm33) || \ + defined(CPU_MIMXRT595SFFOC) || defined(CPU_MIMXRT595SFFOC_cm33)) && \ + RT595_BLIT_WRKRND_ENABLED +#define VG_LITE_BLIT_SPLIT_ENABLED 1 +#else +#define VG_LITE_BLIT_SPLIT_ENABLED 0 +#endif + +/** + * BLIT split threshold - BLITs with width or height higher than this value will be done + * in multiple steps. Value must be 16-aligned. Don't change. + */ +#define LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR 352 + + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/** + * BLock Image Transfer - single direct BLIT. + * + * @param[in] blit Description of the transfer + * @retval LV_RES_OK Transfer complete + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + */ +static lv_res_t _lv_gpu_nxp_vglite_blit_single(lv_gpu_nxp_vglite_blit_info_t * blit); + +#if VG_LITE_BLIT_SPLIT_ENABLED + + /** + * Move buffer pointer as close as possible to area, but with respect to alignment requirements. X-axis only. + * + * @param[in,out] area Area to be updated + * @param[in,out] buf Pointer to be updated + */ + static void _align_x(lv_area_t * area, lv_color_t ** buf); + + /** + * Move buffer pointer to the area start and update variables, Y-axis only. + * + * @param[in,out] area Area to be updated + * @param[in,out] buf Pointer to be updated + * @param[in] stridePx Buffer stride in pixels + */ + static void _align_y(lv_area_t * area, lv_color_t ** buf, uint32_t stridePx); + + /** + * Software BLIT as a fall-back scenario. + * + * @param[in] blit BLIT configuration + */ + static void _sw_blit(lv_gpu_nxp_vglite_blit_info_t * blit); + + /** + * Verify BLIT structure - widths, stride, pointer alignment + * + * @param[in] blit BLIT configuration + * @retval LV_RES_OK + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + */ + static lv_res_t _lv_gpu_nxp_vglite_check_blit(lv_gpu_nxp_vglite_blit_info_t * blit); + + /** + * BLock Image Transfer - split BLIT. + * + * @param[in] blit BLIT configuration + * @retval LV_RES_OK Transfer complete + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + */ + static lv_res_t _lv_gpu_nxp_vglite_blit_split(lv_gpu_nxp_vglite_blit_info_t * blit); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_res_t lv_gpu_nxp_vglite_fill(lv_color_t * dest_buf, lv_coord_t dest_width, lv_coord_t dest_height, + const lv_area_t * fill_area, lv_color_t color, lv_opa_t opa) +{ + uint32_t area_size = lv_area_get_size(fill_area); + lv_coord_t area_w = lv_area_get_width(fill_area); + lv_coord_t area_h = lv_area_get_height(fill_area); + + if(opa >= (lv_opa_t)LV_OPA_MAX) { + if(area_size < LV_GPU_NXP_VG_LITE_FILL_SIZE_LIMIT) + VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", area_size, LV_GPU_NXP_VG_LITE_FILL_SIZE_LIMIT); + } + else { + if(area_size < LV_GPU_NXP_VG_LITE_FILL_OPA_SIZE_LIMIT) + VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", area_size, LV_GPU_NXP_VG_LITE_FILL_OPA_SIZE_LIMIT); + } + + vg_lite_buffer_t vgbuf; + vg_lite_rectangle_t rect; + vg_lite_error_t err = VG_LITE_SUCCESS; + lv_color32_t col32 = {.full = lv_color_to32(color)}; /*Convert color to RGBA8888*/ + vg_lite_color_t vgcol; /* vglite takes ABGR */ + + if(lv_vglite_init_buf(&vgbuf, (uint32_t)dest_width, (uint32_t)dest_height, (uint32_t)dest_width * sizeof(lv_color_t), + (const lv_color_t *)dest_buf, false) != LV_RES_OK) + VG_LITE_RETURN_INV("Init buffer failed."); + + if(opa >= (lv_opa_t)LV_OPA_MAX) { /*Opaque fill*/ + rect.x = fill_area->x1; + rect.y = fill_area->y1; + rect.width = area_w; + rect.height = area_h; + + /*Clean & invalidate cache*/ + lv_vglite_invalidate_cache(); + +#if LV_COLOR_DEPTH==16 + vgcol = col32.full; +#else /*LV_COLOR_DEPTH==32*/ + vgcol = ((uint32_t)col32.ch.alpha << 24) | ((uint32_t)col32.ch.blue << 16) | ((uint32_t)col32.ch.green << 8) | + (uint32_t)col32.ch.red; +#endif + + err = vg_lite_clear(&vgbuf, &rect, vgcol); + VG_LITE_ERR_RETURN_INV(err, "Clear failed."); + + err = vg_lite_finish(); + VG_LITE_ERR_RETURN_INV(err, "Finish failed."); + } + else { /*fill with transparency*/ + + vg_lite_path_t path; + int32_t path_data[] = { /*VG rectangular path*/ + VLC_OP_MOVE, fill_area->x1, fill_area->y1, + VLC_OP_LINE, fill_area->x2 + 1, fill_area->y1, + VLC_OP_LINE, fill_area->x2 + 1, fill_area->y2 + 1, + VLC_OP_LINE, fill_area->x1, fill_area->y2 + 1, + VLC_OP_LINE, fill_area->x1, fill_area->y1, + VLC_OP_END + }; + + err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_LOW, sizeof(path_data), path_data, + (vg_lite_float_t) fill_area->x1, (vg_lite_float_t) fill_area->y1, + ((vg_lite_float_t) fill_area->x2) + 1.0f, ((vg_lite_float_t) fill_area->y2) + 1.0f); + VG_LITE_ERR_RETURN_INV(err, "Init path failed."); + + /* Only pre-multiply color if hardware pre-multiplication is not present */ + if(!vg_lite_query_feature(gcFEATURE_BIT_VG_PE_PREMULTIPLY)) { + col32.ch.red = (uint8_t)(((uint16_t)col32.ch.red * opa) >> 8); + col32.ch.green = (uint8_t)(((uint16_t)col32.ch.green * opa) >> 8); + col32.ch.blue = (uint8_t)(((uint16_t)col32.ch.blue * opa) >> 8); + } + col32.ch.alpha = opa; + +#if LV_COLOR_DEPTH==16 + vgcol = col32.full; +#else /*LV_COLOR_DEPTH==32*/ + vgcol = ((uint32_t)col32.ch.alpha << 24) | ((uint32_t)col32.ch.blue << 16) | ((uint32_t)col32.ch.green << 8) | + (uint32_t)col32.ch.red; +#endif + + /*Clean & invalidate cache*/ + lv_vglite_invalidate_cache(); + + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); + + /*Draw rectangle*/ + err = vg_lite_draw(&vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol); + VG_LITE_ERR_RETURN_INV(err, "Draw rectangle failed."); + + err = vg_lite_finish(); + VG_LITE_ERR_RETURN_INV(err, "Finish failed."); + + err = vg_lite_clear_path(&path); + VG_LITE_ERR_RETURN_INV(err, "Clear path failed."); + } + + return LV_RES_OK; +} + +lv_res_t lv_gpu_nxp_vglite_blit(lv_gpu_nxp_vglite_blit_info_t * blit) +{ + uint32_t dest_size = lv_area_get_size(&blit->dst_area); + + if(blit->opa >= (lv_opa_t)LV_OPA_MAX) { + if(dest_size < LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT) + VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT); + } + else { + if(dest_size < LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT) + VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT); + } + +#if VG_LITE_BLIT_SPLIT_ENABLED + return _lv_gpu_nxp_vglite_blit_split(blit); +#endif /* non RT595 */ + + /* Just pass down */ + return _lv_gpu_nxp_vglite_blit_single(blit); +} + +lv_res_t lv_gpu_nxp_vglite_blit_transform(lv_gpu_nxp_vglite_blit_info_t * blit) +{ + uint32_t dest_size = lv_area_get_size(&blit->dst_area); + + if(blit->opa >= (lv_opa_t)LV_OPA_MAX) { + if(dest_size < LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT) + VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT); + } + else { + if(dest_size < LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT) + VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT); + } + + return _lv_gpu_nxp_vglite_blit_single(blit); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#if VG_LITE_BLIT_SPLIT_ENABLED +static lv_res_t _lv_gpu_nxp_vglite_blit_split(lv_gpu_nxp_vglite_blit_info_t * blit) +{ + lv_res_t rv = LV_RES_INV; + + if(_lv_gpu_nxp_vglite_check_blit(blit) != LV_RES_OK) { + PRINT_BLT("Blit check failed\n"); + return LV_RES_INV; + } + + PRINT_BLT("BLIT from: " + "Area: %03d,%03d - %03d,%03d " + "Addr: %d\n\n", + blit->src_area.x1, blit->src_area.y1, + blit->src_area.x2, blit->src_area.y2, + (uintptr_t) blit->src); + + PRINT_BLT("BLIT to: " + "Area: %03d,%03d - %03d,%03d " + "Addr: %d\n\n", + blit->dst_area.x1, blit->dst_area.y1, + blit->dst_area.x2, blit->dst_area.y2, + (uintptr_t) blit->src); + + /* Stage 1: Move starting pointers as close as possible to [x1, y1], so coordinates are as small as possible. */ + _align_x(&blit->src_area, (lv_color_t **)&blit->src); + _align_y(&blit->src_area, (lv_color_t **)&blit->src, blit->src_stride / sizeof(lv_color_t)); + _align_x(&blit->dst_area, (lv_color_t **)&blit->dst); + _align_y(&blit->dst_area, (lv_color_t **)&blit->dst, blit->dst_stride / sizeof(lv_color_t)); + + /* Stage 2: If we're in limit, do a single BLIT */ + if((blit->src_area.x2 < LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) && + (blit->src_area.y2 < LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR)) { + PRINT_BLT("Simple blit!\n"); + return _lv_gpu_nxp_vglite_blit_single(blit); + }; + + /* Stage 3: Split the BLIT into multiple tiles */ + PRINT_BLT("Split blit!\n"); + + PRINT_BLT("Blit " + "([%03d,%03d], [%03d,%03d]) -> " + "([%03d,%03d], [%03d,%03d]) | " + "([%03dx%03d] -> [%03dx%03d]) | " + "A:(%d -> %d)\n", + blit->src_area.x1, blit->src_area.y1, blit->src_area.x2, blit->src_area.y2, + blit->dst_area.x1, blit->dst_area.y1, blit->dst_area.x2, blit->dst_area.y2, + lv_area_get_width(&blit->src_area), lv_area_get_height(&blit->src_area), + lv_area_get_width(&blit->dst_area), lv_area_get_height(&blit->dst_area), + (uintptr_t) blit->src, (uintptr_t) blit->dst); + + + lv_coord_t totalWidth = lv_area_get_width(&blit->src_area); + lv_coord_t totalHeight = lv_area_get_height(&blit->src_area); + + lv_gpu_nxp_vglite_blit_info_t tileBlit; + + /* Number of tiles needed */ + int totalTilesX = (blit->src_area.x1 + totalWidth + LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1) / + LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR; + int totalTilesY = (blit->src_area.y1 + totalHeight + LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1) / + LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR; + + /* src and dst buffer shift against each other. Src buffer real data [0,0] may start actually at [3,0] in buffer, as + * the buffer pointer has to be aligned, while dst buffer real data [0,0] may start at [1,0] in buffer. alignment may be + * different */ + int shiftSrcX = (blit->src_area.x1 > blit->dst_area.x1) ? (blit->src_area.x1 - blit->dst_area.x1) : 0; + int shiftDstX = (blit->src_area.x1 < blit->dst_area.x1) ? (blit->dst_area.x1 - blit->src_area.x1) : 0; + + PRINT_BLT("\n"); + PRINT_BLT("Align shift: src: %d, dst: %d\n", shiftSrcX, shiftDstX); + + tileBlit = *blit; + + for(int tileY = 0; tileY < totalTilesY; tileY++) { + + tileBlit.src_area.y1 = 0; /* no vertical alignment, always start from 0 */ + tileBlit.src_area.y2 = totalHeight - tileY * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; + if(tileBlit.src_area.y2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) { + tileBlit.src_area.y2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; /* Should never happen */ + } + tileBlit.src = blit->src + tileY * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR * blit->src_stride / sizeof( + lv_color_t); /* stride in px! */ + + tileBlit.dst_area.y1 = tileBlit.src_area.y1; /* y has no alignment, always in sync with src */ + tileBlit.dst_area.y2 = tileBlit.src_area.y2; + + tileBlit.dst = blit->dst + tileY * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR * blit->dst_stride / sizeof( + lv_color_t); /* stride in px! */ + + for(int tileX = 0; tileX < totalTilesX; tileX++) { + + if(tileX == 0) { + /* 1st tile is special - there may be a gap between buffer start pointer + * and area.x1 value, as the pointer has to be aligned. + * tileBlit.src pointer - keep init value from Y-loop. + * Also, 1st tile start is not shifted! shift is applied from 2nd tile */ + tileBlit.src_area.x1 = blit->src_area.x1; + tileBlit.dst_area.x1 = blit->dst_area.x1; + } + else { + /* subsequent tiles always starts from 0, but shifted*/ + tileBlit.src_area.x1 = 0 + shiftSrcX; + tileBlit.dst_area.x1 = 0 + shiftDstX; + /* and advance start pointer + 1 tile size */ + tileBlit.src += LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR; + tileBlit.dst += LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR; + } + + /* Clip tile end coordinates */ + tileBlit.src_area.x2 = totalWidth + blit->src_area.x1 - tileX * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; + if(tileBlit.src_area.x2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) { + tileBlit.src_area.x2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; + } + + tileBlit.dst_area.x2 = totalWidth + blit->dst_area.x1 - tileX * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; + if(tileBlit.dst_area.x2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) { + tileBlit.dst_area.x2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; + } + + if(tileX < (totalTilesX - 1)) { + /* And adjust end coords if shifted, but not for last tile! */ + tileBlit.src_area.x2 += shiftSrcX; + tileBlit.dst_area.x2 += shiftDstX; + } + + rv = _lv_gpu_nxp_vglite_blit_single(&tileBlit); + +#if BLIT_DBG_AREAS + lv_vglite_dbg_draw_rectangle((lv_color_t *) tileBlit.dst, tileBlit.dst_width, tileBlit.dst_height, &tileBlit.dst_area, + LV_COLOR_RED); + lv_vglite_dbg_draw_rectangle((lv_color_t *) tileBlit.src, tileBlit.src_width, tileBlit.src_height, &tileBlit.src_area, + LV_COLOR_GREEN); +#endif + + PRINT_BLT("Tile [%d, %d]: " + "([%d,%d], [%d,%d]) -> " + "([%d,%d], [%d,%d]) | " + "([%dx%d] -> [%dx%d]) | " + "A:(0x%8X -> 0x%8X) %s\n", + tileX, tileY, + tileBlit.src_area.x1, tileBlit.src_area.y1, tileBlit.src_area.x2, tileBlit.src_area.y2, + tileBlit.dst_area.x1, tileBlit.dst_area.y1, tileBlit.dst_area.x2, tileBlit.dst_area.y2, + lv_area_get_width(&tileBlit.src_area), lv_area_get_height(&tileBlit.src_area), + lv_area_get_width(&tileBlit.dst_area), lv_area_get_height(&tileBlit.dst_area), + (uintptr_t) tileBlit.src, (uintptr_t) tileBlit.dst, + rv == LV_RES_OK ? "OK!" : "!!! FAILED !!!"); + + if(rv != LV_RES_OK) { /* if anything goes wrong... */ +#if LV_GPU_NXP_VG_LITE_LOG_ERRORS + LV_LOG_ERROR("Split blit failed. Trying SW blit instead."); +#endif + _sw_blit(&tileBlit); + rv = LV_RES_OK; /* Don't report error, as SW BLIT was performed */ + } + + } + PRINT_BLT(" \n"); + } + + return rv; /* should never fail */ +} +#endif /* VG_LITE_BLIT_SPLIT_ENABLED */ + +static lv_res_t _lv_gpu_nxp_vglite_blit_single(lv_gpu_nxp_vglite_blit_info_t * blit) +{ + vg_lite_buffer_t src_vgbuf, dst_vgbuf; + vg_lite_error_t err = VG_LITE_SUCCESS; + uint32_t rect[4]; + vg_lite_float_t scale = 1.0; + + if(blit == NULL) { + /*Wrong parameter*/ + return LV_RES_INV; + } + + if(blit->opa < (lv_opa_t) LV_OPA_MIN) { + return LV_RES_OK; /*Nothing to BLIT*/ + } + + /*Wrap src/dst buffer into VG-Lite buffer*/ + if(lv_vglite_init_buf(&src_vgbuf, (uint32_t)blit->src_width, (uint32_t)blit->src_height, (uint32_t)blit->src_stride, + blit->src, true) != LV_RES_OK) + VG_LITE_RETURN_INV("Init buffer failed."); + + if(lv_vglite_init_buf(&dst_vgbuf, (uint32_t)blit->dst_width, (uint32_t)blit->dst_height, (uint32_t)blit->dst_stride, + blit->dst, false) != LV_RES_OK) + VG_LITE_RETURN_INV("Init buffer failed."); + + rect[0] = (uint32_t)blit->src_area.x1; /* start x */ + rect[1] = (uint32_t)blit->src_area.y1; /* start y */ + rect[2] = (uint32_t)blit->src_area.x2 - (uint32_t)blit->src_area.x1 + 1U; /* width */ + rect[3] = (uint32_t)blit->src_area.y2 - (uint32_t)blit->src_area.y1 + 1U; /* height */ + + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); + vg_lite_translate((vg_lite_float_t)blit->dst_area.x1, (vg_lite_float_t)blit->dst_area.y1, &matrix); + + if((blit->angle != 0) || (blit->zoom != LV_IMG_ZOOM_NONE)) { + vg_lite_translate(blit->pivot.x, blit->pivot.y, &matrix); + vg_lite_rotate(blit->angle / 10.0f, &matrix); /* angle is 1/10 degree */ + scale = 1.0f * blit->zoom / LV_IMG_ZOOM_NONE; + vg_lite_scale(scale, scale, &matrix); + vg_lite_translate(0.0f - blit->pivot.x, 0.0f - blit->pivot.y, &matrix); + } + + /*Clean & invalidate cache*/ + lv_vglite_invalidate_cache(); + + uint32_t color; + vg_lite_blend_t blend; + if(blit->opa >= (lv_opa_t)LV_OPA_MAX) { + color = 0xFFFFFFFFU; + blend = VG_LITE_BLEND_SRC_OVER; + src_vgbuf.transparency_mode = VG_LITE_IMAGE_TRANSPARENT; + } + else { + uint32_t opa = (uint32_t)blit->opa; + if(vg_lite_query_feature(gcFEATURE_BIT_VG_PE_PREMULTIPLY)) { + color = (opa << 24) | 0x00FFFFFFU; + } + else { + color = (opa << 24) | (opa << 16) | (opa << 8) | opa; + } + blend = VG_LITE_BLEND_SRC_OVER; + src_vgbuf.image_mode = VG_LITE_MULTIPLY_IMAGE_MODE; + src_vgbuf.transparency_mode = VG_LITE_IMAGE_TRANSPARENT; + } + + err = vg_lite_blit_rect(&dst_vgbuf, &src_vgbuf, rect, &matrix, blend, color, VG_LITE_FILTER_POINT); + VG_LITE_ERR_RETURN_INV(err, "Blit rectangle failed."); + + err = vg_lite_finish(); + VG_LITE_ERR_RETURN_INV(err, "Finish failed."); + + return LV_RES_OK; +} + +#if VG_LITE_BLIT_SPLIT_ENABLED + +static void _sw_blit(lv_gpu_nxp_vglite_blit_info_t * blit) +{ + int x, y; + + lv_coord_t w = lv_area_get_width(&blit->src_area); + lv_coord_t h = lv_area_get_height(&blit->src_area); + + int32_t srcStridePx = blit->src_stride / (int32_t)sizeof(lv_color_t); + int32_t dstStridePx = blit->dst_stride / (int32_t)sizeof(lv_color_t); + + lv_color_t * src = (lv_color_t *)blit->src + blit->src_area.y1 * srcStridePx + blit->src_area.x1; + lv_color_t * dst = (lv_color_t *)blit->dst + blit->dst_area.y1 * dstStridePx + blit->dst_area.x1; + + if(blit->opa >= (lv_opa_t)LV_OPA_MAX) { + /* simple copy */ + for(y = 0; y < h; y++) { + lv_memcpy(dst, src, (uint32_t)w * sizeof(lv_color_t)); + src += srcStridePx; + dst += dstStridePx; + } + } + else if(blit->opa >= LV_OPA_MIN) { + /* alpha blending */ + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dst[x] = lv_color_mix(src[x], dst[x], blit->opa); + } + src += srcStridePx; + dst += dstStridePx; + } + } +} + +static lv_res_t _lv_gpu_nxp_vglite_check_blit(lv_gpu_nxp_vglite_blit_info_t * blit) +{ + + /* Test for minimal width */ + if(lv_area_get_width(&blit->src_area) < (lv_coord_t)LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX) + VG_LITE_RETURN_INV("Src area width (%d) is smaller than required (%d).", lv_area_get_width(&blit->src_area), + LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX); + + /* Test for minimal width */ + if(lv_area_get_width(&blit->dst_area) < (lv_coord_t)LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX) + VG_LITE_RETURN_INV("Dest area width (%d) is smaller than required (%d).", lv_area_get_width(&blit->dst_area), + LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX); + + /* Test for pointer alignment */ + if((((uintptr_t) blit->src) % LV_ATTRIBUTE_MEM_ALIGN_SIZE) != 0x0) + VG_LITE_RETURN_INV("Src buffer ptr (0x%X) not aligned to %d.", (size_t) blit->src, LV_ATTRIBUTE_MEM_ALIGN_SIZE); + + /* No alignment requirement for destination pixel buffer when using mode VG_LITE_LINEAR */ + + /* Test for stride alignment */ + if((blit->src_stride % (LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * LV_COLOR_DEPTH / 8)) != 0x0) + VG_LITE_RETURN_INV("Src buffer stride (%d px) not aligned to %d px.", blit->src_stride, + LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX); + + /* Test for stride alignment */ + if((blit->dst_stride % (LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * LV_COLOR_DEPTH / 8)) != 0x0) + VG_LITE_RETURN_INV("Dest buffer stride (%d px) not aligned to %d px.", blit->dst_stride, + LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX); + + if((lv_area_get_width(&blit->src_area) != lv_area_get_width(&blit->dst_area)) || + (lv_area_get_height(&blit->src_area) != lv_area_get_height(&blit->dst_area))) + VG_LITE_RETURN_INV("Src and dest buffer areas are not equal."); + + return LV_RES_OK; +} + +static void _align_x(lv_area_t * area, lv_color_t ** buf) +{ + + int alignedAreaStartPx = area->x1 - (area->x1 % (LV_ATTRIBUTE_MEM_ALIGN_SIZE * 8 / LV_COLOR_DEPTH)); + VG_LITE_COND_STOP(alignedAreaStartPx < 0, "Negative X alignment."); + + area->x1 -= alignedAreaStartPx; + area->x2 -= alignedAreaStartPx; + *buf += alignedAreaStartPx; +} + +static void _align_y(lv_area_t * area, lv_color_t ** buf, uint32_t stridePx) +{ + int LineToAlignMem; + int alignedAreaStartPy; + /* find how many lines of pixels will respect memory alignment requirement */ + if(stridePx % (uint32_t)LV_ATTRIBUTE_MEM_ALIGN_SIZE == 0U) { + alignedAreaStartPy = area->y1; + } + else { + LineToAlignMem = LV_ATTRIBUTE_MEM_ALIGN_SIZE / (sizeof(lv_color_t) * LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX); + VG_LITE_COND_STOP(LV_ATTRIBUTE_MEM_ALIGN_SIZE % (sizeof(lv_color_t) * LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX), + "Complex case: need gcd function."); + alignedAreaStartPy = area->y1 - (area->y1 % LineToAlignMem); + VG_LITE_COND_STOP(alignedAreaStartPy < 0, "Negative Y alignment."); + } + + area->y1 -= alignedAreaStartPy; + area->y2 -= alignedAreaStartPy; + *buf += (uint32_t)alignedAreaStartPy * stridePx; +} +#endif /*VG_LITE_BLIT_SPLIT_ENABLED*/ + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.h new file mode 100644 index 0000000..bc448c6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.h @@ -0,0 +1,149 @@ +/** + * @file lv_draw_vglite_blend.h + * + */ + +/** + * MIT License + * + * Copyright 2020-2022 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LV_DRAW_VGLITE_BLEND_H +#define LV_DRAW_VGLITE_BLEND_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_GPU_NXP_VG_LITE +#include "lv_gpu_nxp_vglite.h" + +/********************* + * DEFINES + *********************/ + +#ifndef LV_GPU_NXP_VG_LITE_FILL_SIZE_LIMIT +/** Minimum area (in pixels) to be filled by VG-Lite with 100% opacity*/ +#define LV_GPU_NXP_VG_LITE_FILL_SIZE_LIMIT 5000 +#endif + +#ifndef LV_GPU_NXP_VG_LITE_FILL_OPA_SIZE_LIMIT +/** Minimum area (in pixels) to be filled by VG-Lite with transparency*/ +#define LV_GPU_NXP_VG_LITE_FILL_OPA_SIZE_LIMIT 5000 +#endif + +#ifndef LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT +/** Minimum area (in pixels) for image copy with 100% opacity to be handled by VG-Lite*/ +#define LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT 5000 +#endif + +#ifndef LV_GPU_NXP_VG_LITE_BUFF_SYNC_BLIT_SIZE_LIMIT +/** Minimum invalidated area (in pixels) to be synchronized by VG-Lite during buffer sync */ +#define LV_GPU_NXP_VG_LITE_BUFF_SYNC_BLIT_SIZE_LIMIT 5000 +#endif + +#ifndef LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT +/** Minimum area (in pixels) for image copy with transparency to be handled by VG-Lite*/ +#define LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT 5000 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/** + * BLock Image Transfer descriptor structure + */ +typedef struct { + + const lv_color_t * src; /**< Source buffer pointer (must be aligned on 32 bytes)*/ + lv_area_t src_area; /**< Area to be copied from source*/ + lv_coord_t src_width; /**< Source buffer width*/ + lv_coord_t src_height; /**< Source buffer height*/ + int32_t src_stride; /**< Source buffer stride in bytes (must be aligned on 16 px)*/ + + const lv_color_t * dst; /**< Destination buffer pointer (must be aligned on 32 bytes)*/ + lv_area_t dst_area; /**< Target area in destination buffer (must be the same as src_area)*/ + lv_coord_t dst_width; /**< Destination buffer width*/ + lv_coord_t dst_height; /**< Destination buffer height*/ + int32_t dst_stride; /**< Destination buffer stride in bytes (must be aligned on 16 px)*/ + + lv_opa_t opa; /**< Opacity - alpha mix (0 = source not copied, 255 = 100% opaque)*/ + uint32_t angle; /**< Rotation angle (1/10 of degree)*/ + uint32_t zoom; /**< 256 = no zoom (1:1 scale ratio)*/ + lv_point_t pivot; /**< The coordinates of rotation pivot in source image buffer*/ +} lv_gpu_nxp_vglite_blit_info_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Fill area, with optional opacity. + * + * @param[in/out] dest_buf Destination buffer pointer (must be aligned on 32 bytes) + * @param[in] dest_width Destination buffer width in pixels (must be aligned on 16 px) + * @param[in] dest_height Destination buffer height in pixels + * @param[in] fill_area Area to be filled + * @param[in] color Fill color + * @param[in] opa Opacity (255 = full, 128 = 50% background/50% color, 0 = no fill) + * @retval LV_RES_OK Fill completed + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + */ +lv_res_t lv_gpu_nxp_vglite_fill(lv_color_t * dest_buf, lv_coord_t dest_width, lv_coord_t dest_height, + const lv_area_t * fill_area, lv_color_t color, lv_opa_t opa); + +/** + * BLock Image Transfer. + * + * @param[in] blit Description of the transfer + * @retval LV_RES_OK Transfer complete + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + */ +lv_res_t lv_gpu_nxp_vglite_blit(lv_gpu_nxp_vglite_blit_info_t * blit); + +/** + * BLock Image Transfer with transformation. + * + * @param[in] blit Description of the transfer + * @retval LV_RES_OK Transfer complete + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + */ +lv_res_t lv_gpu_nxp_vglite_blit_transform(lv_gpu_nxp_vglite_blit_info_t * blit); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_VGLITE_BLEND_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.c new file mode 100644 index 0000000..bc1d55c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.c @@ -0,0 +1,244 @@ +/** + * @file lv_draw_vglite_rect.c + * + */ + +/** + * MIT License + * + * Copyright 2021, 2022 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vglite_rect.h" + +#if LV_USE_GPU_NXP_VG_LITE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_res_t lv_gpu_nxp_vglite_draw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) +{ + vg_lite_buffer_t vgbuf; + vg_lite_error_t err = VG_LITE_SUCCESS; + lv_coord_t dest_width = lv_area_get_width(draw_ctx->buf_area); + lv_coord_t dest_height = lv_area_get_height(draw_ctx->buf_area); + vg_lite_path_t path; + vg_lite_color_t vgcol; /* vglite takes ABGR */ + vg_lite_matrix_t matrix; + lv_coord_t width = lv_area_get_width(coords); + lv_coord_t height = lv_area_get_height(coords); + vg_lite_linear_gradient_t gradient; + vg_lite_matrix_t * grad_matrix; + + if(dsc->radius < 0) + return LV_RES_INV; + + /* Make areas relative to draw buffer */ + lv_area_t rel_coords; + lv_area_copy(&rel_coords, coords); + lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_area_t rel_clip; + lv_area_copy(&rel_clip, draw_ctx->clip_area); + lv_area_move(&rel_clip, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + /*** Init destination buffer ***/ + if(lv_vglite_init_buf(&vgbuf, (uint32_t)dest_width, (uint32_t)dest_height, (uint32_t)dest_width * sizeof(lv_color_t), + (const lv_color_t *)draw_ctx->buf, false) != LV_RES_OK) + VG_LITE_RETURN_INV("Init buffer failed."); + + /*** Init path ***/ + int32_t rad = dsc->radius; + if(dsc->radius == LV_RADIUS_CIRCLE) { + rad = (width > height) ? height / 2 : width / 2; + } + + if((dsc->radius == LV_RADIUS_CIRCLE) && (width == height)) { + float tang = ((float)rad * BEZIER_OPTIM_CIRCLE); + int32_t cpoff = (int32_t)tang; + int32_t circle_path[] = { /*VG circle path*/ + VLC_OP_MOVE, rel_coords.x1 + rad, rel_coords.y1, + VLC_OP_CUBIC_REL, cpoff, 0, rad, rad - cpoff, rad, rad, /* top-right */ + VLC_OP_CUBIC_REL, 0, cpoff, cpoff - rad, rad, 0 - rad, rad, /* bottom-right */ + VLC_OP_CUBIC_REL, 0 - cpoff, 0, 0 - rad, cpoff - rad, 0 - rad, 0 - rad, /* bottom-left */ + VLC_OP_CUBIC_REL, 0, 0 - cpoff, rad - cpoff, 0 - rad, rad, 0 - rad, /* top-left */ + VLC_OP_END + }; + err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_HIGH, sizeof(circle_path), circle_path, + (vg_lite_float_t) rel_clip.x1, (vg_lite_float_t) rel_clip.y1, + ((vg_lite_float_t) rel_clip.x2) + 1.0f, ((vg_lite_float_t) rel_clip.y2) + 1.0f); + } + else if(dsc->radius > 0) { + float tang = ((float)rad * BEZIER_OPTIM_CIRCLE); + int32_t cpoff = (int32_t)tang; + int32_t rounded_path[] = { /*VG rounded rectangular path*/ + VLC_OP_MOVE, rel_coords.x1 + rad, rel_coords.y1, + VLC_OP_LINE, rel_coords.x2 - rad + 1, rel_coords.y1, /* top */ + VLC_OP_CUBIC_REL, cpoff, 0, rad, rad - cpoff, rad, rad, /* top-right */ + VLC_OP_LINE, rel_coords.x2 + 1, rel_coords.y2 - rad + 1, /* right */ + VLC_OP_CUBIC_REL, 0, cpoff, cpoff - rad, rad, 0 - rad, rad, /* bottom-right */ + VLC_OP_LINE, rel_coords.x1 + rad, rel_coords.y2 + 1, /* bottom */ + VLC_OP_CUBIC_REL, 0 - cpoff, 0, 0 - rad, cpoff - rad, 0 - rad, 0 - rad, /* bottom-left */ + VLC_OP_LINE, rel_coords.x1, rel_coords.y1 + rad, /* left */ + VLC_OP_CUBIC_REL, 0, 0 - cpoff, rad - cpoff, 0 - rad, rad, 0 - rad, /* top-left */ + VLC_OP_END + }; + err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_HIGH, sizeof(rounded_path), rounded_path, + (vg_lite_float_t) rel_clip.x1, (vg_lite_float_t) rel_clip.y1, + ((vg_lite_float_t) rel_clip.x2) + 1.0f, ((vg_lite_float_t) rel_clip.y2) + 1.0f); + } + else { + int32_t rect_path[] = { /*VG rectangular path*/ + VLC_OP_MOVE, rel_coords.x1, rel_coords.y1, + VLC_OP_LINE, rel_coords.x2 + 1, rel_coords.y1, + VLC_OP_LINE, rel_coords.x2 + 1, rel_coords.y2 + 1, + VLC_OP_LINE, rel_coords.x1, rel_coords.y2 + 1, + VLC_OP_LINE, rel_coords.x1, rel_coords.y1, + VLC_OP_END + }; + err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_LOW, sizeof(rect_path), rect_path, + (vg_lite_float_t) rel_clip.x1, (vg_lite_float_t) rel_clip.y1, + ((vg_lite_float_t) rel_clip.x2) + 1.0f, ((vg_lite_float_t) rel_clip.y2) + 1.0f); + } + + VG_LITE_ERR_RETURN_INV(err, "Init path failed."); + vg_lite_identity(&matrix); + + /*** Init Color/Gradient ***/ + if(dsc->bg_grad.dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE) { + uint32_t colors[2]; + uint32_t stops[2]; + lv_color32_t col32[2]; + + /* Gradient setup */ + uint8_t cnt = MAX(dsc->bg_grad.stops_count, 2); + for(uint8_t i = 0; i < cnt; i++) { + col32[i].full = lv_color_to32(dsc->bg_grad.stops[i].color); /*Convert color to RGBA8888*/ + stops[i] = dsc->bg_grad.stops[i].frac; +#if LV_COLOR_DEPTH==16 + colors[i] = ((uint32_t)col32[i].ch.alpha << 24) | ((uint32_t)col32[i].ch.blue << 16) | + ((uint32_t)col32[i].ch.green << 8) | (uint32_t)col32[i].ch.red; +#else /*LV_COLOR_DEPTH==32*/ + /* watchout: red and blue color components are inverted versus vg_lite_color_t order */ + colors[i] = ((uint32_t)col32[i].ch.alpha << 24) | ((uint32_t)col32[i].ch.red << 16) | + ((uint32_t)col32[i].ch.green << 8) | (uint32_t)col32[i].ch.blue; +#endif + } + + lv_memset_00(&gradient, sizeof(vg_lite_linear_gradient_t)); + + err = vg_lite_init_grad(&gradient); + VG_LITE_ERR_RETURN_INV(err, "Init gradient failed"); + + err = vg_lite_set_grad(&gradient, cnt, colors, stops); + VG_LITE_ERR_RETURN_INV(err, "Set gradient failed."); + + err = vg_lite_update_grad(&gradient); + VG_LITE_ERR_RETURN_INV(err, "Update gradient failed."); + + grad_matrix = vg_lite_get_grad_matrix(&gradient); + vg_lite_identity(grad_matrix); + vg_lite_translate((float)rel_coords.x1, (float)rel_coords.y1, grad_matrix); + + if(dsc->bg_grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_VER) { + vg_lite_scale(1.0f, (float)height / 256.0f, grad_matrix); + vg_lite_rotate(90.0f, grad_matrix); + } + else { /*LV_GRAD_DIR_HOR*/ + vg_lite_scale((float)width / 256.0f, 1.0f, grad_matrix); + } + } + + lv_opa_t bg_opa = dsc->bg_opa; + lv_color32_t bg_col32 = {.full = lv_color_to32(dsc->bg_color)}; /*Convert color to RGBA8888*/ + if(bg_opa <= (lv_opa_t)LV_OPA_MAX) { + /* Only pre-multiply color if hardware pre-multiplication is not present */ + if(!vg_lite_query_feature(gcFEATURE_BIT_VG_PE_PREMULTIPLY)) { + bg_col32.ch.red = (uint8_t)(((uint16_t)bg_col32.ch.red * bg_opa) >> 8); + bg_col32.ch.green = (uint8_t)(((uint16_t)bg_col32.ch.green * bg_opa) >> 8); + bg_col32.ch.blue = (uint8_t)(((uint16_t)bg_col32.ch.blue * bg_opa) >> 8); + } + bg_col32.ch.alpha = bg_opa; + } + +#if LV_COLOR_DEPTH==16 + vgcol = bg_col32.full; +#else /*LV_COLOR_DEPTH==32*/ + vgcol = ((uint32_t)bg_col32.ch.alpha << 24) | ((uint32_t)bg_col32.ch.blue << 16) | + ((uint32_t)bg_col32.ch.green << 8) | (uint32_t)bg_col32.ch.red; +#endif + + /*Clean & invalidate cache*/ + lv_vglite_invalidate_cache(); + + /*** Draw rectangle ***/ + if(dsc->bg_grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_NONE) { + err = vg_lite_draw(&vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol); + } + else { + err = vg_lite_draw_gradient(&vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, &gradient, VG_LITE_BLEND_SRC_OVER); + } + VG_LITE_ERR_RETURN_INV(err, "Draw gradient failed."); + + err = vg_lite_finish(); + VG_LITE_ERR_RETURN_INV(err, "Finish failed."); + + err = vg_lite_clear_path(&path); + VG_LITE_ERR_RETURN_INV(err, "Clear path failed."); + + if(dsc->bg_grad.dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE) { + err = vg_lite_clear_grad(&gradient); + VG_LITE_ERR_RETURN_INV(err, "Clear gradient failed."); + } + + return LV_RES_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.h new file mode 100644 index 0000000..d708e7b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.h @@ -0,0 +1,77 @@ +/** + * @file lv_draw_vglite_rect.h + * + */ + +/** + * MIT License + * + * Copyright 2021, 2022 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LV_DRAW_VGLITE_RECT_H +#define LV_DRAW_VGLITE_RECT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" + +#if LV_USE_GPU_NXP_VG_LITE +#include "lv_gpu_nxp_vglite.h" +#include "../../lv_draw_rect.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Draw rectangle shape with effects (rounded corners, gradient) + * + * @param draw_ctx drawing context + * @param dsc description of the rectangle + * @param coords the area where rectangle is clipped + */ +lv_res_t lv_gpu_nxp_vglite_draw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_VGLITE_RECT_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_gpu_nxp_vglite.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_gpu_nxp_vglite.c new file mode 100644 index 0000000..f65ec1d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_gpu_nxp_vglite.c @@ -0,0 +1,153 @@ +/** + * @file lv_gpu_nxp_vglite.c + * + */ + +/** + * MIT License + * + * Copyright 2020-2022 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_gpu_nxp_vglite.h" + +#if LV_USE_GPU_NXP_VG_LITE +#include "../../../core/lv_refr.h" +#if BLIT_DBG_AREAS + #include "lv_draw_vglite_blend.h" +#endif + +/********************* + * DEFINES + *********************/ + +#if LV_COLOR_DEPTH==16 + #define VG_LITE_PX_FMT VG_LITE_RGB565 +#elif LV_COLOR_DEPTH==32 + #define VG_LITE_PX_FMT VG_LITE_BGRA8888 +#else + #error Only 16bit and 32bit color depth are supported. Set LV_COLOR_DEPTH to 16 or 32. +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_res_t lv_vglite_init_buf(vg_lite_buffer_t * vgbuf, uint32_t width, uint32_t height, uint32_t stride, + const lv_color_t * ptr, bool source) +{ + /*Test for memory alignment*/ + if((((uintptr_t)ptr) % (uintptr_t)LV_ATTRIBUTE_MEM_ALIGN_SIZE) != (uintptr_t)0x0U) + VG_LITE_RETURN_INV("%s buffer (0x%x) not aligned to %d.", source ? "Src" : "Dest", + (size_t) ptr, LV_ATTRIBUTE_MEM_ALIGN_SIZE); + + /*Test for stride alignment*/ + if(source && (stride % (LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * sizeof(lv_color_t))) != 0x0U) + VG_LITE_RETURN_INV("Src buffer stride (%d bytes) not aligned to %d bytes.", stride, + LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * sizeof(lv_color_t)); + + vgbuf->format = VG_LITE_PX_FMT; + vgbuf->tiled = VG_LITE_LINEAR; + vgbuf->image_mode = VG_LITE_NORMAL_IMAGE_MODE; + vgbuf->transparency_mode = VG_LITE_IMAGE_OPAQUE; + + vgbuf->width = (int32_t)width; + vgbuf->height = (int32_t)height; + vgbuf->stride = (int32_t)stride; + + lv_memset_00(&vgbuf->yuv, sizeof(vgbuf->yuv)); + + vgbuf->memory = (void *)ptr; + vgbuf->address = (uint32_t)vgbuf->memory; + vgbuf->handle = NULL; + + return LV_RES_OK; +} + +#if BLIT_DBG_AREAS +void lv_vglite_dbg_draw_rectangle(lv_color_t * dest_buf, lv_coord_t dest_width, lv_coord_t dest_height, + lv_area_t * fill_area, lv_color_t color) +{ + lv_area_t a; + + /* top line */ + a.x1 = fill_area->x1; + a.x2 = fill_area->x2; + a.y1 = fill_area->y1; + a.y2 = fill_area->y1; + lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &a, color, LV_OPA_COVER); + + + /* bottom line */ + a.x1 = fill_area->x1; + a.x2 = fill_area->x2; + a.y1 = fill_area->y2; + a.y2 = fill_area->y2; + lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &a, color, LV_OPA_COVER); + + /* left line */ + a.x1 = fill_area->x1; + a.x2 = fill_area->x1; + a.y1 = fill_area->y1; + a.y2 = fill_area->y2; + lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &a, color, LV_OPA_COVER); + + /* right line */ + a.x1 = fill_area->x2; + a.x2 = fill_area->x2; + a.y1 = fill_area->y1; + a.y2 = fill_area->y2; + lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &a, color, LV_OPA_COVER); +} +#endif /* BLIT_DBG_AREAS */ + +void lv_vglite_invalidate_cache(void) +{ + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + if(disp->driver->clean_dcache_cb) + disp->driver->clean_dcache_cb(disp->driver); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_gpu_nxp_vglite.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_gpu_nxp_vglite.h new file mode 100644 index 0000000..c22cae1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/nxp/vglite/lv_gpu_nxp_vglite.h @@ -0,0 +1,185 @@ +/** + * @file lv_gpu_nxp_vglite.h + * + */ + +/** + * MIT License + * + * Copyright 2020-2022 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LV_GPU_NXP_VGLITE_H +#define LV_GPU_NXP_VGLITE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" + +#if LV_USE_GPU_NXP_VG_LITE +#include "vg_lite.h" +#include "../../sw/lv_draw_sw.h" +#include "../../../misc/lv_log.h" +#include "fsl_debug_console.h" + +/********************* + * DEFINES + *********************/ + +/** Use this symbol as limit to disable feature (value has to be larger than supported resolution) */ +#define LV_GPU_NXP_VG_LITE_FEATURE_DISABLED (1920*1080+1) + +/** Stride in px required by VG-Lite HW. Don't change this. */ +#define LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX 16U + +#ifndef LV_GPU_NXP_VG_LITE_LOG_ERRORS +/** Enable logging of VG-Lite errors (\see LV_LOG_ERROR)*/ +#define LV_GPU_NXP_VG_LITE_LOG_ERRORS 1 +#endif + +#ifndef LV_GPU_NXP_VG_LITE_LOG_TRACES +/** Enable logging of VG-Lite errors (\see LV_LOG_ERROR)*/ +#define LV_GPU_NXP_VG_LITE_LOG_TRACES 0 +#endif + +/* Draw rectangles around BLIT tiles */ +#define BLIT_DBG_AREAS 0 + +/* Print detailed info to SDK console (NOT to LVGL log system) */ +#define BLIT_DBG_VERBOSE 0 + +/* Verbose debug print */ +#if BLIT_DBG_VERBOSE +#define PRINT_BLT PRINTF +#else +#define PRINT_BLT(...) +#endif + +/* The optimal Bezier control point offset for radial unit + * see: https://spencermortensen.com/articles/bezier-circle/ + **/ +#define BEZIER_OPTIM_CIRCLE 0.551915024494f + +/* Draw lines for control points of Bezier curves */ +#define BEZIER_DBG_CONTROL_POINTS 0 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Fills vg_lite_buffer_t structure according given parameters. + * + * @param[in/out] vgbuf Buffer structure to be filled + * @param[in] width Width of buffer in pixels + * @param[in] height Height of buffer in pixels + * @param[in] stride Stride of the buffer in bytes + * @param[in] ptr Pointer to the buffer (must be aligned according VG-Lite requirements) + * @param[in] source Boolean to check if this is a source buffer + */ +lv_res_t lv_vglite_init_buf(vg_lite_buffer_t * vgbuf, uint32_t width, uint32_t height, uint32_t stride, + const lv_color_t * ptr, bool source); + +#if BLIT_DBG_AREAS +/** + * Draw a simple rectangle, 1 px line width. + * + * @param dest_buf Destination buffer + * @param dest_width Destination buffer width (must be aligned on 16px) + * @param dest_height Destination buffer height + * @param fill_area Rectangle coordinates + * @param color Rectangle color + */ +void lv_vglite_dbg_draw_rectangle(lv_color_t * dest_buf, lv_coord_t dest_width, lv_coord_t dest_height, + lv_area_t * fill_area, lv_color_t color); +#endif + +/** + * Clean & invalidate cache. + */ +void lv_vglite_invalidate_cache(void); + +/********************** + * MACROS + **********************/ + +#define VG_LITE_COND_STOP(cond, txt) \ + do { \ + if (cond) { \ + LV_LOG_ERROR("%s. STOP!", txt); \ + for ( ; ; ); \ + } \ + } while(0) + +#if LV_GPU_NXP_VG_LITE_LOG_ERRORS +#define VG_LITE_ERR_RETURN_INV(err, fmt, ...) \ + do { \ + if(err != VG_LITE_SUCCESS) { \ + LV_LOG_ERROR(fmt, ##__VA_ARGS__); \ + return LV_RES_INV; \ + } \ + } while (0) +#else +#define VG_LITE_ERR_RETURN_INV(err, fmt, ...) \ + do { \ + if(err != VG_LITE_SUCCESS) { \ + return LV_RES_INV; \ + } \ + }while(0) +#endif /*LV_GPU_NXP_VG_LITE_LOG_ERRORS*/ + +#if LV_GPU_NXP_VG_LITE_LOG_TRACES +#define VG_LITE_LOG_TRACE(fmt, ...) \ + do { \ + LV_LOG_ERROR(fmt, ##__VA_ARGS__); \ + } while (0) + +#define VG_LITE_RETURN_INV(fmt, ...) \ + do { \ + LV_LOG_ERROR(fmt, ##__VA_ARGS__); \ + return LV_RES_INV; \ + } while (0) +#else +#define VG_LITE_LOG_TRACE(fmt, ...) \ + do { \ + } while (0) +#define VG_LITE_RETURN_INV(fmt, ...) \ + do { \ + return LV_RES_INV; \ + }while(0) +#endif /*LV_GPU_NXP_VG_LITE_LOG_TRACES*/ + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GPU_NXP_VGLITE_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/README.md b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/README.md new file mode 100644 index 0000000..4415ffa --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/README.md @@ -0,0 +1,28 @@ +# SDL_Renderer Based Drawing Functions + +In LVGL, drawing was performed by CPU. To improve drawing performance on platforms with GPU, +we should perform drawing operations on GPU if possible. + +This implementation has moved most bitmap blending and drawing procedures to utilize SDL_Renderer, +which takes advantages of hardware acceleration APIs like DirectX or OpenGL. + +This implementation can be also considered as a reference implementation, for contributors wants to +develop accelerated drawing functions with other APIs such as OpenGL/OpenGL ES. + +## Caveats +`lv_draw_arc`, `lv_draw_line` is not enabled, due to incomplete implementation. So lines and arcs will +have significant impact to drawing performances. + +Performance of this implementation still has room to improve. Or we should use more powerful APIs +such as OpenGL. + +## Notices for files + +### `lv_draw_sdl_stack_blur.c` + +Contains modified code from [android-stackblur](https://github.com/kikoso/android-stackblur) project. +Apache License 2.0 + +### `lv_draw_sdl_lru.c`/`lv_draw_sdl_lru.h` + +Contains modified code from [C-LRU-Cache](https://github.com/willcannings/C-LRU-Cache) project. No license defined. \ No newline at end of file diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl.c new file mode 100644 index 0000000..e3cdf57 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl.c @@ -0,0 +1,103 @@ +/** + * @file lv_draw_sdl.c + * + */ + +/********************* + * INCLUDES + *********************/ + + +#include "../../lv_conf_internal.h" + +#if LV_USE_GPU_SDL + +#include "lv_draw_sdl.h" +#include "lv_draw_sdl_utils.h" +#include "lv_draw_sdl_texture_cache.h" +#include "lv_draw_sdl_layer.h" + +/********************* + * DEFINES + *********************/ +void lv_draw_sdl_draw_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); + +lv_res_t lv_draw_sdl_img_core(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * draw_dsc, + const lv_area_t * coords, const void * src); + +void lv_draw_sdl_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, + uint32_t letter); + +void lv_draw_sdl_draw_line(lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, + const lv_point_t * point2); + +void lv_draw_sdl_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, + uint16_t radius, uint16_t start_angle, uint16_t end_angle); + +void lv_draw_sdl_polygon(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * draw_dsc, const lv_point_t * points, + uint16_t point_cnt); + +void lv_draw_sdl_draw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sdl_init_ctx(lv_disp_drv_t * disp_drv, lv_draw_ctx_t * draw_ctx) +{ + _lv_draw_sdl_utils_init(); + lv_memset_00(draw_ctx, sizeof(lv_draw_sdl_ctx_t)); + draw_ctx->draw_rect = lv_draw_sdl_draw_rect; + draw_ctx->draw_img = lv_draw_sdl_img_core; + draw_ctx->draw_letter = lv_draw_sdl_draw_letter; + draw_ctx->draw_line = lv_draw_sdl_draw_line; + draw_ctx->draw_arc = lv_draw_sdl_draw_arc; + draw_ctx->draw_polygon = lv_draw_sdl_polygon; + draw_ctx->draw_bg = lv_draw_sdl_draw_bg; + draw_ctx->layer_init = lv_draw_sdl_layer_init; + draw_ctx->layer_blend = lv_draw_sdl_layer_blend; + draw_ctx->layer_destroy = lv_draw_sdl_layer_destroy; + draw_ctx->layer_instance_size = sizeof(lv_draw_sdl_layer_ctx_t); + lv_draw_sdl_ctx_t * draw_ctx_sdl = (lv_draw_sdl_ctx_t *) draw_ctx; + draw_ctx_sdl->renderer = ((lv_draw_sdl_drv_param_t *) disp_drv->user_data)->renderer; + draw_ctx_sdl->internals = lv_mem_alloc(sizeof(lv_draw_sdl_context_internals_t)); + lv_memset_00(draw_ctx_sdl->internals, sizeof(lv_draw_sdl_context_internals_t)); + lv_draw_sdl_texture_cache_init(draw_ctx_sdl); +} + +void lv_draw_sdl_deinit_ctx(lv_disp_drv_t * disp_drv, lv_draw_ctx_t * draw_ctx) +{ + lv_draw_sdl_ctx_t * draw_ctx_sdl = (lv_draw_sdl_ctx_t *) draw_ctx; + lv_draw_sdl_texture_cache_deinit(draw_ctx_sdl); + lv_mem_free(draw_ctx_sdl->internals); + _lv_draw_sdl_utils_deinit(); +} + +SDL_Texture * lv_draw_sdl_create_screen_texture(SDL_Renderer * renderer, lv_coord_t hor, lv_coord_t ver) +{ + SDL_Texture * texture = SDL_CreateTexture(renderer, LV_DRAW_SDL_TEXTURE_FORMAT, SDL_TEXTUREACCESS_TARGET, hor, ver); + SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); + return texture; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_GPU_SDL*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl.h new file mode 100644 index 0000000..9b44a7b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl.h @@ -0,0 +1,96 @@ +/** + * @file lv_draw_sdl.h + * + */ + +#ifndef LV_DRAW_SDL_H +#define LV_DRAW_SDL_H + + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_GPU_SDL + +#include LV_GPU_SDL_INCLUDE_PATH + +#include "../lv_draw.h" +#include "../../core/lv_disp.h" + +/********************* + * DEFINES + *********************/ + +#if SDL_BYTEORDER == SDL_BIG_ENDIAN +#define LV_DRAW_SDL_TEXTURE_FORMAT SDL_PIXELFORMAT_ARGB8888 +#else +#define LV_DRAW_SDL_TEXTURE_FORMAT SDL_PIXELFORMAT_RGBA8888 +#endif + +/********************** + * TYPEDEFS + **********************/ + +struct lv_draw_sdl_context_internals_t; + +typedef struct { + /** + * Render for display driver + */ + SDL_Renderer * renderer; + void * user_data; +} lv_draw_sdl_drv_param_t; + +typedef struct { + lv_draw_ctx_t base_draw; + SDL_Renderer * renderer; + struct lv_draw_sdl_context_internals_t * internals; +} lv_draw_sdl_ctx_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_sdl_init_ctx(lv_disp_drv_t * disp_drv, lv_draw_ctx_t * draw_ctx); + +/** + * @brief Free caches + * + */ +void lv_draw_sdl_deinit_ctx(lv_disp_drv_t * disp_drv, lv_draw_ctx_t * draw_ctx); + +SDL_Texture * lv_draw_sdl_create_screen_texture(SDL_Renderer * renderer, lv_coord_t hor, lv_coord_t ver); + +/*====================== + * Add/remove functions + *=====================*/ + +/*===================== + * Setter functions + *====================*/ + +/*===================== + * Getter functions + *====================*/ + +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GPU_SDL*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SDL_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl.mk b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl.mk new file mode 100644 index 0000000..c5c28b6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl.mk @@ -0,0 +1,19 @@ +CSRCS += lv_draw_sdl.c +CSRCS += lv_draw_sdl_arc.c +CSRCS += lv_draw_sdl_bg.c +CSRCS += lv_draw_sdl_composite.c +CSRCS += lv_draw_sdl_img.c +CSRCS += lv_draw_sdl_label.c +CSRCS += lv_draw_sdl_line.c +CSRCS += lv_draw_sdl_mask.c +CSRCS += lv_draw_sdl_polygon.c +CSRCS += lv_draw_sdl_rect.c +CSRCS += lv_draw_sdl_stack_blur.c +CSRCS += lv_draw_sdl_texture_cache.c +CSRCS += lv_draw_sdl_utils.c +CSRCS += lv_draw_sdl_layer.c + +DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/sdl +VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/sdl + +CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/sdl" diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_arc.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_arc.c new file mode 100644 index 0000000..5786eae --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_arc.c @@ -0,0 +1,238 @@ +/** + * @file lv_draw_sdl_arc.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_GPU_SDL + +#include "lv_draw_sdl.h" +#include "lv_draw_sdl_utils.h" +#include "lv_draw_sdl_texture_cache.h" +#include "lv_draw_sdl_composite.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +static void dump_masks(SDL_Texture * texture, const lv_area_t * coords, const int16_t * ids, int16_t ids_count, + const int16_t * caps); + +static void get_cap_area(int16_t angle, lv_coord_t thickness, uint16_t radius, const lv_point_t * center, + lv_area_t * out); + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_sdl_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, + uint16_t radius, uint16_t start_angle, uint16_t end_angle) +{ + lv_draw_sdl_ctx_t * ctx = (lv_draw_sdl_ctx_t *) draw_ctx; + + lv_area_t area_out; + area_out.x1 = center->x - radius; + area_out.y1 = center->y - radius; + area_out.x2 = center->x + radius - 1; /*-1 because the center already belongs to the left/bottom part*/ + area_out.y2 = center->y + radius - 1; + + lv_area_t draw_area; + if(!_lv_area_intersect(&draw_area, &area_out, draw_ctx->clip_area)) { + return; + } + + lv_area_t area_in; + lv_area_copy(&area_in, &area_out); + area_in.x1 += dsc->width; + area_in.y1 += dsc->width; + area_in.x2 -= dsc->width; + area_in.y2 -= dsc->width; + + + while(start_angle >= 360) start_angle -= 360; + while(end_angle >= 360) end_angle -= 360; + + int16_t mask_ids[3] = {LV_MASK_ID_INV, LV_MASK_ID_INV, LV_MASK_ID_INV}, mask_ids_count = 1; + int16_t cap_ids[2] = {LV_MASK_ID_INV, LV_MASK_ID_INV}; + + lv_draw_mask_radius_param_t mask_out_param; + lv_draw_mask_radius_init(&mask_out_param, &area_out, LV_RADIUS_CIRCLE, false); + mask_ids[0] = lv_draw_mask_add(&mask_out_param, NULL); + + lv_draw_mask_radius_param_t mask_in_param; + if(lv_area_get_width(&area_in) > 0 && lv_area_get_height(&area_in) > 0) { + lv_draw_mask_radius_init(&mask_in_param, &area_in, LV_RADIUS_CIRCLE, true); + mask_ids[1] = lv_draw_mask_add(&mask_in_param, NULL); + mask_ids_count++; + } + + lv_draw_mask_angle_param_t mask_angle_param; + if((start_angle - end_angle) % 360) { + lv_draw_mask_angle_init(&mask_angle_param, center->x, center->y, start_angle, end_angle); + mask_ids[2] = lv_draw_mask_add(&mask_angle_param, NULL); + mask_ids_count++; + } + + lv_draw_mask_radius_param_t cap_start_param, cap_end_param; + if(mask_ids_count == 3 && dsc->rounded) { + lv_area_t start_area, end_area; + get_cap_area((int16_t) start_angle, dsc->width, radius, center, &start_area); + get_cap_area((int16_t) end_angle, dsc->width, radius, center, &end_area); + lv_draw_mask_radius_init(&cap_start_param, &start_area, dsc->width / 2, false); + cap_ids[0] = lv_draw_mask_add(&cap_start_param, NULL); + lv_draw_mask_radius_init(&cap_end_param, &end_area, dsc->width / 2, false); + cap_ids[1] = lv_draw_mask_add(&cap_end_param, NULL); + } + + lv_coord_t w = lv_area_get_width(&draw_area), h = lv_area_get_height(&draw_area); + SDL_Texture * texture = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_STREAM1, w, h); + SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); + dump_masks(texture, &draw_area, mask_ids, mask_ids_count, cap_ids[0] != LV_MASK_ID_INV ? cap_ids : NULL); + + lv_draw_mask_remove_id(mask_ids[0]); + lv_draw_mask_free_param(&mask_out_param); + + if(mask_ids_count > 1) { + lv_draw_mask_remove_id(mask_ids[1]); + lv_draw_mask_free_param(&mask_in_param); + } + + if(mask_ids_count > 2) { + lv_draw_mask_remove_id(mask_ids[2]); + lv_draw_mask_free_param(&mask_angle_param); + } + + if(cap_ids[0] != LV_MASK_ID_INV) { + lv_draw_mask_remove_id(cap_ids[0]); + lv_draw_mask_remove_id(cap_ids[1]); + lv_draw_mask_free_param(&cap_start_param); + lv_draw_mask_free_param(&cap_end_param); + } + + SDL_Rect srcrect = {0, 0, w, h}, dstrect; + lv_area_to_sdl_rect(&draw_area, &dstrect); + SDL_Color color; + lv_color_to_sdl_color(&dsc->color, &color); + SDL_SetTextureColorMod(texture, color.r, color.g, color.b); + SDL_SetTextureAlphaMod(texture, dsc->opa); + SDL_RenderCopy(ctx->renderer, texture, &srcrect, &dstrect); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void dump_masks(SDL_Texture * texture, const lv_area_t * coords, const int16_t * ids, int16_t ids_count, + const int16_t * caps) +{ + lv_coord_t w = lv_area_get_width(coords), h = lv_area_get_height(coords); + SDL_assert(w > 0 && h > 0); + SDL_Rect rect = {0, 0, w, h}; + uint8_t * pixels; + int pitch; + if(SDL_LockTexture(texture, &rect, (void **) &pixels, &pitch) != 0) return; + + lv_opa_t * line_buf = lv_mem_buf_get(rect.w); + for(lv_coord_t y = 0; y < rect.h; y++) { + lv_memset_ff(line_buf, rect.w); + lv_coord_t abs_x = (lv_coord_t) coords->x1, abs_y = (lv_coord_t)(y + coords->y1), len = (lv_coord_t) rect.w; + lv_draw_mask_res_t res; + res = lv_draw_mask_apply_ids(line_buf, abs_x, abs_y, len, ids, ids_count); + if(res == LV_DRAW_MASK_RES_TRANSP) { + lv_memset_00(&pixels[y * pitch], 4 * rect.w); + } + else if(res == LV_DRAW_MASK_RES_FULL_COVER) { + lv_memset_ff(&pixels[y * pitch], 4 * rect.w); + } + else { + for(int x = 0; x < rect.w; x++) { + uint8_t * pixel = &pixels[y * pitch + x * 4]; + *pixel = line_buf[x]; + pixel[1] = pixel[2] = pixel[3] = 0xFF; + } + } + if(caps) { + for(int i = 0; i < 2; i++) { + lv_memset_ff(line_buf, rect.w); + res = lv_draw_mask_apply_ids(line_buf, abs_x, abs_y, len, &caps[i], 1); + if(res == LV_DRAW_MASK_RES_TRANSP) { + /* Ignore */ + } + else if(res == LV_DRAW_MASK_RES_FULL_COVER) { + lv_memset_ff(&pixels[y * pitch], 4 * rect.w); + } + else { + for(int x = 0; x < rect.w; x++) { + uint8_t * pixel = &pixels[y * pitch + x * 4]; + uint16_t old_opa = line_buf[x] + *pixel; + *pixel = LV_MIN(old_opa, 0xFF); + pixel[1] = pixel[2] = pixel[3] = 0xFF; + } + } + } + } + } + lv_mem_buf_release(line_buf); + SDL_UnlockTexture(texture); +} + +static void get_cap_area(int16_t angle, lv_coord_t thickness, uint16_t radius, const lv_point_t * center, + lv_area_t * out) +{ + const uint8_t ps = 8; + const uint8_t pa = 127; + + int32_t thick_half = thickness / 2; + uint8_t thick_corr = (thickness & 0x01) ? 0 : 1; + + int32_t cir_x; + int32_t cir_y; + + cir_x = ((radius - thick_half) * lv_trigo_sin((int16_t)(90 - angle))) >> (LV_TRIGO_SHIFT - ps); + cir_y = ((radius - thick_half) * lv_trigo_sin(angle)) >> (LV_TRIGO_SHIFT - ps); + + /*Actually the center of the pixel need to be calculated so apply 1/2 px offset*/ + if(cir_x > 0) { + cir_x = (cir_x - pa) >> ps; + out->x1 = cir_x - thick_half + thick_corr; + out->x2 = cir_x + thick_half; + } + else { + cir_x = (cir_x + pa) >> ps; + out->x1 = cir_x - thick_half; + out->x2 = cir_x + thick_half - thick_corr; + } + + if(cir_y > 0) { + cir_y = (cir_y - pa) >> ps; + out->y1 = cir_y - thick_half + thick_corr; + out->y2 = cir_y + thick_half; + } + else { + cir_y = (cir_y + pa) >> ps; + out->y1 = cir_y - thick_half; + out->y2 = cir_y + thick_half - thick_corr; + } + lv_area_move(out, center->x, center->y); +} + +#endif /*LV_USE_GPU_SDL*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_bg.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_bg.c new file mode 100644 index 0000000..48e0f6b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_bg.c @@ -0,0 +1,106 @@ +/** + * @file lv_draw_sdl_bg.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_GPU_SDL + +#include "../lv_draw_rect.h" +#include "../lv_draw_img.h" +#include "../lv_draw_label.h" +#include "../lv_draw_mask.h" +#include "../../core/lv_refr.h" +#include "lv_draw_sdl_utils.h" +#include "lv_draw_sdl_texture_cache.h" +#include "lv_draw_sdl_composite.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void draw_bg_color(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, + const lv_draw_rect_dsc_t * dsc); + +static void draw_bg_img(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, + const lv_draw_rect_dsc_t * dsc); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sdl_draw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) +{ + const lv_area_t * clip = draw_ctx->clip_area; + lv_draw_sdl_ctx_t * ctx = (lv_draw_sdl_ctx_t *) draw_ctx; + /* Coords will be translated so coords will start at (0,0) */ + lv_area_t t_area; + bool has_content = _lv_area_intersect(&t_area, coords, clip); + + /* Shadows and outlines will also draw in extended area */ + if(has_content) { + if(dsc->bg_img_src) { + draw_bg_img(ctx, coords, &t_area, dsc); + } + else { + draw_bg_color(ctx, coords, &t_area, dsc); + } + } + +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void draw_bg_color(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, + const lv_draw_rect_dsc_t * dsc) +{ + SDL_Color bg_color; + lv_color_to_sdl_color(&dsc->bg_color, &bg_color); + SDL_SetRenderDrawBlendMode(ctx->renderer, SDL_BLENDMODE_NONE); + SDL_SetRenderDrawColor(ctx->renderer, bg_color.r, bg_color.g, bg_color.b, dsc->bg_opa); + + SDL_Rect rect; + lv_area_to_sdl_rect(draw_area, &rect); + SDL_RenderFillRect(ctx->renderer, &rect); + + SDL_SetRenderDrawBlendMode(ctx->renderer, SDL_BLENDMODE_BLEND); +} + +static void draw_bg_img(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, + const lv_draw_rect_dsc_t * dsc) +{ + SDL_SetRenderDrawBlendMode(ctx->renderer, SDL_BLENDMODE_NONE); + SDL_SetRenderDrawColor(ctx->renderer, 0, 0, 0, 0); + + SDL_Rect rect; + lv_area_to_sdl_rect(draw_area, &rect); + SDL_RenderFillRect(ctx->renderer, &rect); + + SDL_SetRenderDrawBlendMode(ctx->renderer, SDL_BLENDMODE_BLEND); + lv_draw_rect((lv_draw_ctx_t *) ctx, dsc, coords); +} + +#endif /*LV_USE_GPU_SDL*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_composite.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_composite.c new file mode 100644 index 0000000..4d0603d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_composite.c @@ -0,0 +1,262 @@ +/** + * @file lv_draw_sdl_composite.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_GPU_SDL + +#include "../../misc/lv_gc.h" +#include "../../core/lv_refr.h" +#include "lv_draw_sdl_composite.h" +#include "lv_draw_sdl_utils.h" +#include "lv_draw_sdl_priv.h" +#include "lv_draw_sdl_texture_cache.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_sdl_cache_key_magic_t magic; + lv_draw_sdl_composite_texture_id_t type; +} composite_key_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static composite_key_t mask_key_create(lv_draw_sdl_composite_texture_id_t type); + +static lv_coord_t next_pow_of_2(lv_coord_t num); + +static void dump_masks(SDL_Texture * texture, const lv_area_t * coords); +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +bool lv_draw_sdl_composite_begin(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords_in, const lv_area_t * clip_in, + const lv_area_t * extension, lv_blend_mode_t blend_mode, lv_area_t * coords_out, + lv_area_t * clip_out, lv_area_t * apply_area) +{ + lv_area_t full_coords = *coords_in; + + /* Normalize full_coords */ + if(full_coords.x1 > full_coords.x2) { + lv_coord_t x2 = full_coords.x2; + full_coords.x2 = full_coords.x1; + full_coords.x1 = x2; + } + if(full_coords.y1 > full_coords.y2) { + lv_coord_t y2 = full_coords.y2; + full_coords.y2 = full_coords.y1; + full_coords.y1 = y2; + } + + if(extension) { + full_coords.x1 -= extension->x1; + full_coords.x2 += extension->x2; + full_coords.y1 -= extension->y1; + full_coords.y2 += extension->y2; + } + + if(!_lv_area_intersect(apply_area, &full_coords, clip_in)) return false; + bool has_mask = lv_draw_mask_is_any(apply_area); + + const bool draw_mask = has_mask && LV_GPU_SDL_CUSTOM_BLEND_MODE; + const bool draw_blend = blend_mode != LV_BLEND_MODE_NORMAL; + if(draw_mask || draw_blend) { + lv_draw_sdl_context_internals_t * internals = ctx->internals; + LV_ASSERT(internals->mask == NULL && internals->composition == NULL && internals->target_backup == NULL); + + lv_coord_t w = lv_area_get_width(apply_area), h = lv_area_get_height(apply_area); + internals->composition = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TARGET0, w, h); + /* Don't need to worry about integral overflow */ + lv_coord_t ofs_x = (lv_coord_t) - apply_area->x1, ofs_y = (lv_coord_t) - apply_area->y1; + /* Offset draw area to start with (0,0) of coords */ + lv_area_move(coords_out, ofs_x, ofs_y); + lv_area_move(clip_out, ofs_x, ofs_y); + internals->target_backup = SDL_GetRenderTarget(ctx->renderer); + SDL_SetRenderTarget(ctx->renderer, internals->composition); + SDL_SetRenderDrawColor(ctx->renderer, 255, 255, 255, 0); + /* SDL_RenderClear is not working properly, so we overwrite the target with solid color */ + SDL_SetRenderDrawBlendMode(ctx->renderer, SDL_BLENDMODE_NONE); + SDL_RenderFillRect(ctx->renderer, NULL); + SDL_SetRenderDrawBlendMode(ctx->renderer, SDL_BLENDMODE_BLEND); +#if LV_GPU_SDL_CUSTOM_BLEND_MODE + internals->mask = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_STREAM0, w, h); + dump_masks(internals->mask, apply_area); +#endif + } + else if(has_mask) { + /* Fallback mask handling. This will at least make bars looks less bad */ + for(uint8_t i = 0; i < _LV_MASK_MAX_NUM; i++) { + _lv_draw_mask_common_dsc_t * comm_param = LV_GC_ROOT(_lv_draw_mask_list[i]).param; + if(comm_param == NULL) continue; + switch(comm_param->type) { + case LV_DRAW_MASK_TYPE_RADIUS: { + const lv_draw_mask_radius_param_t * param = (const lv_draw_mask_radius_param_t *) comm_param; + if(param->cfg.outer) break; + _lv_area_intersect(clip_out, apply_area, ¶m->cfg.rect); + break; + } + default: + break; + } + } + } + return has_mask; +} + +void lv_draw_sdl_composite_end(lv_draw_sdl_ctx_t * ctx, const lv_area_t * apply_area, lv_blend_mode_t blend_mode) +{ + lv_draw_sdl_context_internals_t * internals = ctx->internals; + SDL_Rect src_rect = {0, 0, lv_area_get_width(apply_area), lv_area_get_height(apply_area)}; +#if LV_GPU_SDL_CUSTOM_BLEND_MODE + if(internals->mask) { + SDL_BlendMode mode = SDL_ComposeCustomBlendMode(SDL_BLENDFACTOR_ZERO, SDL_BLENDFACTOR_ONE, + SDL_BLENDOPERATION_ADD, SDL_BLENDFACTOR_ZERO, + SDL_BLENDFACTOR_SRC_ALPHA, SDL_BLENDOPERATION_ADD); + SDL_SetTextureBlendMode(internals->mask, mode); + SDL_RenderCopy(ctx->renderer, internals->mask, &src_rect, &src_rect); + } +#endif + + /* Shapes are drawn on composite layer when mask or blend mode is present */ + if(internals->composition) { + SDL_Rect dst_rect; + lv_area_to_sdl_rect(apply_area, &dst_rect); + + SDL_SetRenderTarget(ctx->renderer, internals->target_backup); + switch(blend_mode) { + case LV_BLEND_MODE_NORMAL: + SDL_SetTextureBlendMode(internals->composition, SDL_BLENDMODE_BLEND); + break; + case LV_BLEND_MODE_ADDITIVE: + SDL_SetTextureBlendMode(internals->composition, SDL_BLENDMODE_ADD); + break; +#if LV_GPU_SDL_CUSTOM_BLEND_MODE + case LV_BLEND_MODE_SUBTRACTIVE: { + SDL_BlendMode mode = SDL_ComposeCustomBlendMode(SDL_BLENDFACTOR_ONE, SDL_BLENDFACTOR_ONE, + SDL_BLENDOPERATION_SUBTRACT, SDL_BLENDFACTOR_ONE, + SDL_BLENDFACTOR_ONE, SDL_BLENDOPERATION_SUBTRACT); + SDL_SetTextureBlendMode(internals->composition, mode); + break; + } + case LV_BLEND_MODE_MULTIPLY: { + SDL_BlendMode mode = SDL_ComposeCustomBlendMode(SDL_BLENDFACTOR_ZERO, SDL_BLENDFACTOR_SRC_COLOR, + SDL_BLENDOPERATION_ADD, SDL_BLENDFACTOR_ZERO, + SDL_BLENDFACTOR_DST_ALPHA, SDL_BLENDOPERATION_ADD); + SDL_SetTextureBlendMode(internals->composition, mode); + break; + } +#endif + default: + LV_LOG_WARN("Doesn't support blend mode %d", blend_mode); + SDL_SetTextureBlendMode(internals->composition, SDL_BLENDMODE_BLEND); + /* Unsupported yet */ + break; + } + SDL_RenderCopy(ctx->renderer, internals->composition, &src_rect, &dst_rect); + } + + internals->mask = internals->composition = internals->target_backup = NULL; +} + +SDL_Texture * lv_draw_sdl_composite_texture_obtain(lv_draw_sdl_ctx_t * ctx, lv_draw_sdl_composite_texture_id_t id, + lv_coord_t w, lv_coord_t h) +{ + lv_point_t * tex_size = NULL; + composite_key_t mask_key = mask_key_create(id); + SDL_Texture * result = lv_draw_sdl_texture_cache_get_with_userdata(ctx, &mask_key, sizeof(composite_key_t), NULL, + (void **) &tex_size); + if(!result || tex_size->x < w || tex_size->y < h) { + lv_coord_t size = next_pow_of_2(LV_MAX(w, h)); + int access = SDL_TEXTUREACCESS_STREAMING; + if(id >= LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TRANSFORM0) { + access = SDL_TEXTUREACCESS_TARGET; + } + else if(id >= LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TARGET0) { + access = SDL_TEXTUREACCESS_TARGET; + } + result = SDL_CreateTexture(ctx->renderer, LV_DRAW_SDL_TEXTURE_FORMAT, access, size, size); + tex_size = lv_mem_alloc(sizeof(lv_point_t)); + tex_size->x = tex_size->y = size; + lv_draw_sdl_texture_cache_put_advanced(ctx, &mask_key, sizeof(composite_key_t), result, tex_size, lv_mem_free, 0); + } + return result; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static composite_key_t mask_key_create(lv_draw_sdl_composite_texture_id_t type) +{ + composite_key_t key; + /* VERY IMPORTANT! Padding between members is uninitialized, so we have to wipe them manually */ + SDL_memset(&key, 0, sizeof(key)); + key.magic = LV_GPU_CACHE_KEY_MAGIC_MASK; + key.type = type; + return key; +} + +static lv_coord_t next_pow_of_2(lv_coord_t num) +{ + lv_coord_t n = 128; + while(n < num && n < 16384) { + n = n << 1; + } + return n; +} + +static void dump_masks(SDL_Texture * texture, const lv_area_t * coords) +{ + lv_coord_t w = lv_area_get_width(coords), h = lv_area_get_height(coords); + SDL_assert(w > 0 && h > 0); + SDL_Rect rect = {0, 0, w, h}; + uint8_t * pixels; + int pitch; + if(SDL_LockTexture(texture, &rect, (void **) &pixels, &pitch) != 0) return; + + lv_opa_t * line_buf = lv_mem_buf_get(rect.w); + for(lv_coord_t y = 0; y < rect.h; y++) { + lv_memset_ff(line_buf, rect.w); + lv_coord_t abs_x = (lv_coord_t) coords->x1, abs_y = (lv_coord_t)(y + coords->y1), len = (lv_coord_t) rect.w; + lv_draw_mask_res_t res; + res = lv_draw_mask_apply(line_buf, abs_x, abs_y, len); + if(res == LV_DRAW_MASK_RES_TRANSP) { + lv_memset_00(&pixels[y * pitch], 4 * rect.w); + } + else if(res == LV_DRAW_MASK_RES_FULL_COVER) { + lv_memset_ff(&pixels[y * pitch], 4 * rect.w); + } + else { + for(int x = 0; x < rect.w; x++) { + const size_t idx = y * pitch + x * 4; + pixels[idx] = line_buf[x]; + pixels[idx + 1] = pixels[idx + 2] = pixels[idx + 3] = 0xFF; + } + } + } + lv_mem_buf_release(line_buf); + SDL_UnlockTexture(texture); +} + +#endif /*LV_USE_GPU_SDL*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_composite.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_composite.h new file mode 100644 index 0000000..72a2dae --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_composite.h @@ -0,0 +1,73 @@ +/** + * @file lv_draw_sdl_composite.h + * + */ + +#ifndef LV_DRAW_SDL_COMPOSITE_H +#define LV_DRAW_SDL_COMPOSITE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#include LV_GPU_SDL_INCLUDE_PATH + +#include "lv_draw_sdl.h" +#include "../../misc/lv_area.h" +#include "../../misc/lv_color.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef enum lv_draw_sdl_composite_texture_id_t { + LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_STREAM0, + LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_STREAM1, + LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TARGET0, + LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TARGET1, + LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TRANSFORM0, +} lv_draw_sdl_composite_texture_id_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Begin drawing with mask. Render target will be switched to a temporary texture, + * and drawing coordinates may get clipped or translated + * @param coords_in Original coordinates + * @param clip_in Original clip area + * @param extension Useful for shadows or outlines, can be NULL + * @param coords_out Translated coords + * @param clip_out Translated clip area + * @param apply_area Area of actual composited texture will be drawn + * @return true if there are any mask needs to be drawn, false otherwise + */ +bool lv_draw_sdl_composite_begin(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords_in, const lv_area_t * clip_in, + const lv_area_t * extension, lv_blend_mode_t blend_mode, lv_area_t * coords_out, + lv_area_t * clip_out, lv_area_t * apply_area); + +void lv_draw_sdl_composite_end(lv_draw_sdl_ctx_t * ctx, const lv_area_t * apply_area, lv_blend_mode_t blend_mode); + +SDL_Texture * lv_draw_sdl_composite_texture_obtain(lv_draw_sdl_ctx_t * ctx, lv_draw_sdl_composite_texture_id_t id, + lv_coord_t w, lv_coord_t h); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SDL_COMPOSITE_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_img.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_img.c new file mode 100644 index 0000000..3c955d8 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_img.c @@ -0,0 +1,467 @@ +/** + * @file lv_draw_sdl_img.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_GPU_SDL + +#include "../lv_draw_img.h" +#include "../lv_img_cache.h" +#include "../lv_draw_mask.h" +#include "../../misc/lv_lru.h" +#include "../../misc/lv_gc.h" + +#include "lv_draw_sdl_img.h" +#include "lv_draw_sdl_utils.h" +#include "lv_draw_sdl_texture_cache.h" +#include "lv_draw_sdl_composite.h" +#include "lv_draw_sdl_rect.h" +#include "lv_draw_sdl_layer.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_sdl_cache_key_magic_t magic; + const SDL_Texture * texture; + lv_coord_t w, h, radius; +} lv_draw_img_rounded_key_t; + +enum { + ROUNDED_IMG_PART_LEFT = 0, + ROUNDED_IMG_PART_HCENTER = 1, + ROUNDED_IMG_PART_RIGHT = 2, + ROUNDED_IMG_PART_TOP = 3, + ROUNDED_IMG_PART_VCENTER = 4, + ROUNDED_IMG_PART_BOTTOM = 5, +}; + +enum { + ROUNDED_IMG_CORNER_TOP_LEFT = 0, + ROUNDED_IMG_CORNER_TOP_RIGHT = 1, + ROUNDED_IMG_CORNER_BOTTOM_RIGHT = 2, + ROUNDED_IMG_CORNER_BOTTOM_LEFT = 3, +}; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static SDL_Texture * upload_img_texture(SDL_Renderer * renderer, lv_img_decoder_dsc_t * dsc); + +static SDL_Texture * upload_img_texture_fallback(SDL_Renderer * renderer, lv_img_decoder_dsc_t * dsc); + +static bool check_mask_simple_radius(const lv_area_t * coords, lv_coord_t * radius); + +static void draw_img_simple(lv_draw_sdl_ctx_t * ctx, SDL_Texture * texture, const lv_draw_sdl_img_header_t * header, + const lv_draw_img_dsc_t * draw_dsc, const lv_area_t * coords, const lv_area_t * clip); + +static void draw_img_rounded(lv_draw_sdl_ctx_t * ctx, SDL_Texture * texture, const lv_draw_sdl_img_header_t * header, + const lv_draw_img_dsc_t * draw_dsc, const lv_area_t * coords, const lv_area_t * clip, + lv_coord_t radius); + +static SDL_Texture * img_rounded_frag_obtain(lv_draw_sdl_ctx_t * ctx, SDL_Texture * texture, + const lv_draw_sdl_img_header_t * header, int w, int h, lv_coord_t radius); + +static lv_draw_img_rounded_key_t rounded_key_create(const SDL_Texture * texture, lv_coord_t w, lv_coord_t h, + lv_coord_t radius); + +static void calc_draw_part(SDL_Texture * texture, const lv_draw_sdl_img_header_t * header, const lv_area_t * coords, + const lv_area_t * clip, SDL_Rect * clipped_src, SDL_Rect * clipped_dst); +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + + +static void apply_recolor_opa(SDL_Texture * texture, const lv_draw_img_dsc_t * draw_dsc); + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_res_t lv_draw_sdl_img_core(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * draw_dsc, + const lv_area_t * coords, const void * src) +{ + const lv_area_t * clip = draw_ctx->clip_area; + lv_draw_sdl_ctx_t * ctx = (lv_draw_sdl_ctx_t *) draw_ctx; + + size_t key_size; + lv_draw_sdl_cache_key_head_img_t * key = lv_draw_sdl_texture_img_key_create(src, draw_dsc->frame_id, &key_size); + bool texture_found = false; + lv_draw_sdl_img_header_t * header = NULL; + SDL_Texture * texture = lv_draw_sdl_texture_cache_get_with_userdata(ctx, key, key_size, &texture_found, + (void **) &header); + if(!texture_found) { + lv_draw_sdl_img_load_texture(ctx, key, key_size, src, draw_dsc->frame_id, &texture, &header); + } + SDL_free(key); + if(!texture) { + return LV_RES_INV; + } + + lv_area_t zoomed_cords; + _lv_img_buf_get_transformed_area(&zoomed_cords, lv_area_get_width(coords), lv_area_get_height(coords), 0, + draw_dsc->zoom, &draw_dsc->pivot); + lv_area_move(&zoomed_cords, coords->x1, coords->y1); + + /* When in > 0, draw simple radius */ + lv_coord_t radius = 0; + /* Coords will be translated so coords will start at (0,0) */ + lv_area_t t_coords = zoomed_cords, t_clip = *clip, apply_area; + + bool has_composite = false; + + if(!check_mask_simple_radius(&t_coords, &radius)) { + has_composite = lv_draw_sdl_composite_begin(ctx, &zoomed_cords, clip, NULL, draw_dsc->blend_mode, + &t_coords, &t_clip, &apply_area); + } + + lv_draw_sdl_transform_areas_offset(ctx, has_composite, &apply_area, &t_coords, &t_clip); + + SDL_Rect clip_rect, coords_rect; + lv_area_to_sdl_rect(&t_clip, &clip_rect); + lv_area_to_sdl_rect(&t_coords, &coords_rect); + + SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); + + if(radius > 0) { + draw_img_rounded(ctx, texture, header, draw_dsc, &t_coords, &t_clip, radius); + } + else { + draw_img_simple(ctx, texture, header, draw_dsc, &t_coords, &t_clip); + } + + lv_draw_sdl_composite_end(ctx, &apply_area, draw_dsc->blend_mode); + + return LV_RES_OK; +} + +static void calc_draw_part(SDL_Texture * texture, const lv_draw_sdl_img_header_t * header, const lv_area_t * coords, + const lv_area_t * clip, SDL_Rect * clipped_src, SDL_Rect * clipped_dst) +{ + double x = 0, y = 0, w, h; + if(SDL_RectEmpty(&header->rect)) { + Uint32 format = 0; + int access = 0, tw, th; + SDL_QueryTexture(texture, &format, &access, &tw, &th); + w = tw; + h = th; + } + else { + x = header->rect.x; + y = header->rect.y; + w = header->rect.w; + h = header->rect.h; + } + if(clip) { + lv_area_t clipped_area; + _lv_area_intersect(&clipped_area, coords, clip); + lv_area_to_sdl_rect(&clipped_area, clipped_dst); + } + else { + lv_area_to_sdl_rect(coords, clipped_dst); + } + lv_coord_t coords_w = lv_area_get_width(coords), coords_h = lv_area_get_height(coords); + clipped_src->x = (int)(x + (clipped_dst->x - coords->x1) * w / coords_w); + clipped_src->y = (int)(y + (clipped_dst->y - coords->y1) * h / coords_h); + clipped_src->w = (int)(w - (coords_w - clipped_dst->w) * w / coords_w); + clipped_src->h = (int)(h - (coords_h - clipped_dst->h) * h / coords_h); +} + +bool lv_draw_sdl_img_load_texture(lv_draw_sdl_ctx_t * ctx, lv_draw_sdl_cache_key_head_img_t * key, size_t key_size, + const void * src, int32_t frame_id, SDL_Texture ** texture, + lv_draw_sdl_img_header_t ** header) +{ + _lv_img_cache_entry_t * cdsc = _lv_img_cache_open(src, lv_color_white(), frame_id); + lv_draw_sdl_cache_flag_t tex_flags = 0; + SDL_Rect rect; + SDL_memset(&rect, 0, sizeof(SDL_Rect)); + if(cdsc) { + lv_img_decoder_dsc_t * dsc = &cdsc->dec_dsc; + if(dsc->user_data && SDL_memcmp(dsc->user_data, LV_DRAW_SDL_DEC_DSC_TEXTURE_HEAD, 8) == 0) { + lv_draw_sdl_dec_dsc_userdata_t * ptr = (lv_draw_sdl_dec_dsc_userdata_t *) dsc->user_data; + *texture = ptr->texture; + rect = ptr->rect; + if(ptr->texture_managed) { + tex_flags |= LV_DRAW_SDL_CACHE_FLAG_MANAGED; + } + ptr->texture_referenced = true; + } + else { + *texture = upload_img_texture(ctx->renderer, dsc); + } +#if LV_IMG_CACHE_DEF_SIZE == 0 + lv_img_decoder_close(dsc); +#endif + } + if(texture && cdsc) { + *header = SDL_malloc(sizeof(lv_draw_sdl_img_header_t)); + SDL_memcpy(&(*header)->base, &cdsc->dec_dsc.header, sizeof(lv_img_header_t)); + (*header)->rect = rect; + lv_draw_sdl_texture_cache_put_advanced(ctx, key, key_size, *texture, *header, SDL_free, tex_flags); + } + else { + lv_draw_sdl_texture_cache_put(ctx, key, key_size, NULL); + return false; + } + return true; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static SDL_Texture * upload_img_texture(SDL_Renderer * renderer, lv_img_decoder_dsc_t * dsc) +{ + if(!dsc->img_data) { + return upload_img_texture_fallback(renderer, dsc); + } + bool chroma_keyed = dsc->header.cf == (uint32_t) LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED; + int h = (int) dsc->header.h; + int w = (int) dsc->header.w; + void * data = (void *) dsc->img_data; + Uint32 rmask = 0x00FF0000; + Uint32 gmask = 0x0000FF00; + Uint32 bmask = 0x000000FF; + Uint32 amask = 0xFF000000; + if(chroma_keyed) { + amask = 0x00; + } + SDL_Surface * surface = SDL_CreateRGBSurfaceFrom(data, w, h, LV_COLOR_DEPTH, w * LV_COLOR_DEPTH / 8, + rmask, gmask, bmask, amask); + SDL_SetColorKey(surface, chroma_keyed, lv_color_to32(LV_COLOR_CHROMA_KEY)); + SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer, surface); + SDL_FreeSurface(surface); + return texture; +} + +static SDL_Texture * upload_img_texture_fallback(SDL_Renderer * renderer, lv_img_decoder_dsc_t * dsc) +{ + lv_coord_t h = (lv_coord_t) dsc->header.h; + lv_coord_t w = (lv_coord_t) dsc->header.w; + uint8_t * data = lv_mem_buf_get(w * h * sizeof(lv_color_t)); + for(lv_coord_t y = 0; y < h; y++) { + lv_img_decoder_read_line(dsc, 0, y, w, &data[y * w * sizeof(lv_color_t)]); + } + Uint32 rmask = 0x00FF0000; + Uint32 gmask = 0x0000FF00; + Uint32 bmask = 0x000000FF; + Uint32 amask = 0xFF000000; + SDL_Surface * surface = SDL_CreateRGBSurfaceFrom(data, w, h, LV_COLOR_DEPTH, w * LV_COLOR_DEPTH / 8, + rmask, gmask, bmask, amask); + SDL_SetColorKey(surface, SDL_TRUE, lv_color_to32(LV_COLOR_CHROMA_KEY)); + SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer, surface); + SDL_FreeSurface(surface); + lv_mem_buf_release(data); + return texture; +} + +/** + * Check if there is only one radius mask + * @param radius Set to radius value if the only mask is a radius mask + * @return true if the only mask is a radius mask + */ +static bool check_mask_simple_radius(const lv_area_t * coords, lv_coord_t * radius) +{ + if(lv_draw_mask_get_cnt() != 1) return false; + for(uint8_t i = 0; i < _LV_MASK_MAX_NUM; i++) { + _lv_draw_mask_common_dsc_t * param = LV_GC_ROOT(_lv_draw_mask_list[i]).param; + if(param->type == LV_DRAW_MASK_TYPE_RADIUS) { + lv_draw_mask_radius_param_t * rparam = (lv_draw_mask_radius_param_t *) param; + if(rparam->cfg.outer) return false; + if(!_lv_area_is_equal(&rparam->cfg.rect, coords)) return false; + *radius = rparam->cfg.radius; + return true; + } + } + return false; +} + +static void draw_img_simple(lv_draw_sdl_ctx_t * ctx, SDL_Texture * texture, const lv_draw_sdl_img_header_t * header, + const lv_draw_img_dsc_t * draw_dsc, const lv_area_t * coords, const lv_area_t * clip) +{ + apply_recolor_opa(texture, draw_dsc); + SDL_Point pivot = {.x = draw_dsc->pivot.x, .y = draw_dsc->pivot.y}; + + /*Image needs to be rotated, so we have to use clip rect which is slower*/ + if(draw_dsc->angle != 0) { + /* No radius, set clip here */ + SDL_Rect clip_rect; + lv_area_to_sdl_rect(clip, &clip_rect); + SDL_RenderSetClipRect(ctx->renderer, &clip_rect); + } + SDL_Rect src_rect, dst_rect; + calc_draw_part(texture, header, coords, clip, &src_rect, &dst_rect); + SDL_RenderCopyEx(ctx->renderer, texture, &src_rect, &dst_rect, draw_dsc->angle, &pivot, SDL_FLIP_NONE); + if(draw_dsc->angle != 0) { + SDL_RenderSetClipRect(ctx->renderer, NULL); + } +} + + +static void draw_img_rounded(lv_draw_sdl_ctx_t * ctx, SDL_Texture * texture, const lv_draw_sdl_img_header_t * header, + const lv_draw_img_dsc_t * draw_dsc, const lv_area_t * coords, const lv_area_t * clip, + lv_coord_t radius) +{ + const int w = lv_area_get_width(coords), h = lv_area_get_height(coords); + lv_coord_t real_radius = LV_MIN3(radius, w, h); + SDL_Texture * frag = img_rounded_frag_obtain(ctx, texture, header, w, h, real_radius); + apply_recolor_opa(frag, draw_dsc); + lv_draw_sdl_rect_bg_frag_draw_corners(ctx, frag, real_radius, coords, clip, true); + + apply_recolor_opa(texture, draw_dsc); + + SDL_Rect src_rect, dst_rect; + /* Draw 3 parts */ + lv_area_t clip_tmp, part; + calc_draw_part(texture, header, coords, NULL, &src_rect, &dst_rect); + for(int i = w > h ? ROUNDED_IMG_PART_LEFT : ROUNDED_IMG_PART_TOP, j = i + 3; i <= j; i++) { + switch(i) { + case ROUNDED_IMG_PART_LEFT: + lv_area_set(&part, coords->x1, coords->y1 + radius, coords->x1 + radius - 1, coords->y2 - radius); + break; + case ROUNDED_IMG_PART_HCENTER: + lv_area_set(&part, coords->x1 + radius, coords->y1, coords->x2 - radius, coords->y2); + break; + case ROUNDED_IMG_PART_RIGHT: + lv_area_set(&part, coords->x2 - radius + 1, coords->y1 + radius, coords->x2, coords->y2 - radius); + break; + case ROUNDED_IMG_PART_TOP: + lv_area_set(&part, coords->x1 + radius, coords->y1, coords->x2 - radius, coords->y1 + radius - 1); + break; + case ROUNDED_IMG_PART_VCENTER: + lv_area_set(&part, coords->x1 + radius, coords->y2 - radius + 1, coords->x2 - radius, coords->y2); + break; + case ROUNDED_IMG_PART_BOTTOM: + lv_area_set(&part, coords->x1, coords->y1 + radius, coords->x2, coords->y2 - radius); + break; + default: + break; + } + if(!_lv_area_intersect(&clip_tmp, &part, clip)) continue; + SDL_Rect clip_rect; + lv_area_to_sdl_rect(&clip_tmp, &clip_rect); + SDL_RenderSetClipRect(ctx->renderer, &clip_rect); + SDL_RenderCopy(ctx->renderer, texture, &src_rect, &dst_rect); + } + SDL_RenderSetClipRect(ctx->renderer, NULL); +} + +static void apply_recolor_opa(SDL_Texture * texture, const lv_draw_img_dsc_t * draw_dsc) +{ + if(draw_dsc->recolor_opa > LV_OPA_TRANSP) { + /* Draw with mixed recolor */ + lv_color_t recolor = lv_color_mix(draw_dsc->recolor, lv_color_white(), draw_dsc->recolor_opa); + SDL_SetTextureColorMod(texture, recolor.ch.red, recolor.ch.green, recolor.ch.blue); + } + else { + /* Draw with no recolor */ + SDL_SetTextureColorMod(texture, 0xFF, 0xFF, 0xFF); + } + SDL_SetTextureAlphaMod(texture, draw_dsc->opa); +} + +static SDL_Texture * img_rounded_frag_obtain(lv_draw_sdl_ctx_t * ctx, SDL_Texture * texture, + const lv_draw_sdl_img_header_t * header, int w, int h, lv_coord_t radius) +{ + lv_draw_img_rounded_key_t key = rounded_key_create(texture, w, h, radius); + SDL_Texture * mask_frag = lv_draw_sdl_rect_bg_frag_obtain(ctx, radius); + SDL_Texture * img_frag = lv_draw_sdl_texture_cache_get(ctx, &key, sizeof(key), NULL); + if(img_frag == NULL) { + const lv_coord_t full_frag_size = radius * 2 + 3; + img_frag = SDL_CreateTexture(ctx->renderer, LV_DRAW_SDL_TEXTURE_FORMAT, SDL_TEXTUREACCESS_TARGET, + full_frag_size, full_frag_size); + SDL_SetTextureBlendMode(img_frag, SDL_BLENDMODE_BLEND); + SDL_Texture * old_target = SDL_GetRenderTarget(ctx->renderer); + SDL_SetRenderTarget(ctx->renderer, img_frag); + SDL_SetRenderDrawColor(ctx->renderer, 0, 0, 0, 0); + /* SDL_RenderClear is not working properly, so we overwrite the target with solid color */ + SDL_SetRenderDrawBlendMode(ctx->renderer, SDL_BLENDMODE_NONE); + SDL_RenderFillRect(ctx->renderer, NULL); + SDL_SetRenderDrawBlendMode(ctx->renderer, SDL_BLENDMODE_BLEND); + + lv_area_t coords = {0, 0, w - 1, h - 1}, clip; + lv_area_t frag_coords = {0, 0, full_frag_size - 1, full_frag_size - 1}; + lv_draw_sdl_rect_bg_frag_draw_corners(ctx, mask_frag, radius, &frag_coords, NULL, false); + + SDL_SetTextureAlphaMod(texture, 0xFF); + SDL_SetTextureColorMod(texture, 0xFF, 0xFF, 0xFF); +#if LV_GPU_SDL_CUSTOM_BLEND_MODE + SDL_BlendMode blend_mode = SDL_ComposeCustomBlendMode(SDL_BLENDFACTOR_ONE, SDL_BLENDFACTOR_ZERO, + SDL_BLENDOPERATION_ADD, SDL_BLENDFACTOR_DST_ALPHA, + SDL_BLENDFACTOR_ZERO, SDL_BLENDOPERATION_ADD); + SDL_SetTextureBlendMode(texture, blend_mode); +#else + SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_MOD); +#endif + SDL_Rect srcrect, cliprect, dstrect = {0, 0, radius, radius}; + + cliprect.w = cliprect.h = radius; + for(int i = 0; i <= ROUNDED_IMG_CORNER_BOTTOM_LEFT; i++) { + switch(i) { + case ROUNDED_IMG_CORNER_TOP_LEFT: + cliprect.x = 0; + cliprect.y = 0; + lv_area_align(&frag_coords, &coords, LV_ALIGN_TOP_LEFT, 0, 0); + break; + case ROUNDED_IMG_CORNER_TOP_RIGHT: + cliprect.x = full_frag_size - radius; + cliprect.y = 0; + lv_area_align(&frag_coords, &coords, LV_ALIGN_TOP_RIGHT, 0, 0); + break; + case ROUNDED_IMG_CORNER_BOTTOM_RIGHT: + cliprect.x = full_frag_size - radius; + cliprect.y = full_frag_size - radius; + lv_area_align(&frag_coords, &coords, LV_ALIGN_BOTTOM_RIGHT, 0, 0); + break; + case ROUNDED_IMG_CORNER_BOTTOM_LEFT: + cliprect.x = 0; + cliprect.y = full_frag_size - radius; + lv_area_align(&frag_coords, &coords, LV_ALIGN_BOTTOM_LEFT, 0, 0); + break; + default: + break; + } + calc_draw_part(texture, header, &coords, NULL, &srcrect, &dstrect); + SDL_RenderSetClipRect(ctx->renderer, &cliprect); + SDL_RenderCopy(ctx->renderer, texture, &srcrect, &dstrect); + } + SDL_RenderSetClipRect(ctx->renderer, NULL); + + SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); + + SDL_SetRenderTarget(ctx->renderer, old_target); + lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), img_frag); + } + return img_frag; +} + +static lv_draw_img_rounded_key_t rounded_key_create(const SDL_Texture * texture, lv_coord_t w, lv_coord_t h, + lv_coord_t radius) +{ + lv_draw_img_rounded_key_t key; + SDL_memset(&key, 0, sizeof(key)); + key.magic = LV_GPU_CACHE_KEY_MAGIC_IMG_ROUNDED_CORNERS; + key.texture = texture; + key.w = w; + key.h = h; + key.radius = radius; + return key; +} + +#endif /*LV_USE_GPU_SDL*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_img.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_img.h new file mode 100644 index 0000000..0e27027 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_img.h @@ -0,0 +1,72 @@ +/** + * @file lv_draw_sdl_img.h + * + */ + +#ifndef LV_DRAW_SDL_IMG_H +#define LV_DRAW_SDL_IMG_H + + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_GPU_SDL + +#include LV_GPU_SDL_INCLUDE_PATH + +#include "../lv_draw.h" + +#include "lv_draw_sdl_texture_cache.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct lv_draw_sdl_img_header_t { + lv_img_header_t base; + SDL_Rect rect; +} lv_draw_sdl_img_header_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/*====================== + * Add/remove functions + *=====================*/ + +/*===================== + * Setter functions + *====================*/ + +/*===================== + * Getter functions + *====================*/ + +/*===================== + * Other functions + *====================*/ +bool lv_draw_sdl_img_load_texture(lv_draw_sdl_ctx_t * ctx, lv_draw_sdl_cache_key_head_img_t * key, size_t key_size, + const void * src, int32_t frame_id, SDL_Texture ** texture, + lv_draw_sdl_img_header_t ** header); +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GPU_SDL*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SDL_IMG_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_label.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_label.c new file mode 100644 index 0000000..b8c79ae --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_label.c @@ -0,0 +1,176 @@ +/** + * @file lv_draw_sdl_label.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_GPU_SDL + +#include LV_GPU_SDL_INCLUDE_PATH + +#include "../lv_draw_label.h" +#include "../../misc/lv_utils.h" + +#include "lv_draw_sdl_utils.h" +#include "lv_draw_sdl_texture_cache.h" +#include "lv_draw_sdl_composite.h" +#include "lv_draw_sdl_layer.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_sdl_cache_key_magic_t magic; + const lv_font_t * font_p; + uint32_t letter; +} lv_font_glyph_key_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_font_glyph_key_t font_key_glyph_create(const lv_font_t * font_p, uint32_t letter); + + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sdl_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, + uint32_t letter) +{ + const lv_area_t * clip_area = draw_ctx->clip_area; + const lv_font_t * font_p = dsc->font; + lv_opa_t opa = dsc->opa; + lv_color_t color = dsc->color; + if(opa < LV_OPA_MIN) return; + if(opa > LV_OPA_MAX) opa = LV_OPA_COVER; + + if(font_p == NULL) { + LV_LOG_WARN("lv_draw_letter: font is NULL"); + return; + } + + lv_font_glyph_dsc_t g; + bool g_ret = lv_font_get_glyph_dsc(font_p, &g, letter, '\0'); + if(g_ret == false) { + /*Add warning if the dsc is not found + *but do not print warning for non printable ASCII chars (e.g. '\n')*/ + if(letter >= 0x20 && + letter != 0xf8ff && /*LV_SYMBOL_DUMMY*/ + letter != 0x200c) { /*ZERO WIDTH NON-JOINER*/ + LV_LOG_WARN("lv_draw_letter: glyph dsc. not found for U+%X", letter); + + /* draw placeholder */ + lv_area_t glyph_coords; + lv_draw_rect_dsc_t glyph_dsc; + lv_coord_t begin_x = pos_p->x + g.ofs_x; + lv_coord_t begin_y = pos_p->y + g.ofs_y; + lv_area_set(&glyph_coords, begin_x, begin_y, begin_x + g.box_w, begin_y + g.box_h); + lv_draw_rect_dsc_init(&glyph_dsc); + glyph_dsc.bg_opa = LV_OPA_MIN; + glyph_dsc.outline_opa = LV_OPA_MIN; + glyph_dsc.shadow_opa = LV_OPA_MIN; + glyph_dsc.bg_img_opa = LV_OPA_MIN; + glyph_dsc.border_color = dsc->color; + glyph_dsc.border_width = 1; + draw_ctx->draw_rect(draw_ctx, &glyph_dsc, &glyph_coords); + } + return; + } + + /*Don't draw anything if the character is empty. E.g. space*/ + if((g.box_h == 0) || (g.box_w == 0)) return; + + int32_t pos_x = pos_p->x + g.ofs_x; + int32_t pos_y = pos_p->y + (font_p->line_height - font_p->base_line) - g.box_h - g.ofs_y; + + const lv_area_t letter_area = {pos_x, pos_y, pos_x + g.box_w - 1, pos_y + g.box_h - 1}; + lv_area_t draw_area; + + /*If the letter is completely out of mask don't draw it*/ + if(!_lv_area_intersect(&draw_area, &letter_area, clip_area)) { + return; + } + + lv_draw_sdl_ctx_t * ctx = (lv_draw_sdl_ctx_t *) draw_ctx; + SDL_Renderer * renderer = ctx->renderer; + + lv_font_glyph_key_t glyph_key = font_key_glyph_create(font_p, letter); + bool glyph_found = false; + SDL_Texture * texture = lv_draw_sdl_texture_cache_get(ctx, &glyph_key, sizeof(glyph_key), &glyph_found); + if(!glyph_found) { + if(g.resolved_font) { + font_p = g.resolved_font; + } + const uint8_t * bmp = lv_font_get_glyph_bitmap(font_p, letter); + uint8_t * buf = lv_mem_alloc(g.box_w * g.box_h); + lv_sdl_to_8bpp(buf, bmp, g.box_w, g.box_h, g.box_w, g.bpp); + SDL_Surface * mask = lv_sdl_create_opa_surface(buf, g.box_w, g.box_h, g.box_w); + texture = SDL_CreateTextureFromSurface(renderer, mask); + SDL_FreeSurface(mask); + lv_mem_free(buf); + lv_draw_sdl_texture_cache_put(ctx, &glyph_key, sizeof(glyph_key), texture); + } + if(!texture) { + return; + } + + lv_area_t t_letter = letter_area, t_clip = *clip_area, apply_area; + bool has_composite = lv_draw_sdl_composite_begin(ctx, &letter_area, clip_area, NULL, dsc->blend_mode, &t_letter, + &t_clip, &apply_area); + + lv_draw_sdl_transform_areas_offset(ctx, has_composite, &apply_area, &t_letter, &t_clip); + + /*If the letter is completely out of mask don't draw it*/ + if(!_lv_area_intersect(&draw_area, &t_letter, &t_clip)) { + return; + } + SDL_Rect srcrect, dstrect; + lv_area_to_sdl_rect(&draw_area, &dstrect); + srcrect.x = draw_area.x1 - t_letter.x1; + srcrect.y = draw_area.y1 - t_letter.y1; + srcrect.w = dstrect.w; + srcrect.h = dstrect.h; + SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); + SDL_SetTextureAlphaMod(texture, opa); + SDL_SetTextureColorMod(texture, color.ch.red, color.ch.green, color.ch.blue); + SDL_RenderCopy(renderer, texture, &srcrect, &dstrect); + + lv_draw_sdl_composite_end(ctx, &apply_area, dsc->blend_mode); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_font_glyph_key_t font_key_glyph_create(const lv_font_t * font_p, uint32_t letter) +{ + lv_font_glyph_key_t key; + /* VERY IMPORTANT! Padding between members is uninitialized, so we have to wipe them manually */ + SDL_memset(&key, 0, sizeof(key)); + key.magic = LV_GPU_CACHE_KEY_MAGIC_FONT_GLYPH; + key.font_p = font_p; + key.letter = letter; + return key; +} + +#endif /*LV_USE_GPU_SDL*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_layer.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_layer.c new file mode 100644 index 0000000..ae5c327 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_layer.c @@ -0,0 +1,141 @@ +/** + * @file lv_draw_sdl_refr.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_GPU_SDL + +#include "../../core/lv_refr.h" + +#include "lv_draw_sdl.h" +#include "lv_draw_sdl_priv.h" +#include "lv_draw_sdl_composite.h" +#include "lv_draw_sdl_utils.h" +#include "lv_draw_sdl_layer.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_draw_layer_ctx_t * lv_draw_sdl_layer_init(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx, + lv_draw_layer_flags_t flags) +{ + lv_draw_sdl_ctx_t * ctx = (lv_draw_sdl_ctx_t *) draw_ctx; + SDL_Renderer * renderer = ctx->renderer; + + lv_draw_sdl_layer_ctx_t * transform_ctx = (lv_draw_sdl_layer_ctx_t *) layer_ctx; + + transform_ctx->flags = flags; + transform_ctx->orig_target = SDL_GetRenderTarget(renderer); + + lv_coord_t target_w = lv_area_get_width(&layer_ctx->area_full); + lv_coord_t target_h = lv_area_get_height(&layer_ctx->area_full); + + enum lv_draw_sdl_composite_texture_id_t texture_id = LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TRANSFORM0 + + ctx->internals->transform_count; + transform_ctx->target = lv_draw_sdl_composite_texture_obtain(ctx, texture_id, target_w, target_h); + transform_ctx->target_rect.x = 0; + transform_ctx->target_rect.y = 0; + transform_ctx->target_rect.w = target_w; + transform_ctx->target_rect.h = target_h; + + layer_ctx->max_row_with_alpha = target_h; + layer_ctx->max_row_with_no_alpha = target_h; + + SDL_SetTextureBlendMode(transform_ctx->target, SDL_BLENDMODE_BLEND); + SDL_SetRenderTarget(renderer, transform_ctx->target); + + /* SDL_RenderClear is not working properly, so we overwrite the target with solid color */ + SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE); + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0); + SDL_RenderFillRect(renderer, NULL); + SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND); + + /* Set proper drawing context for transform layer */ + ctx->internals->transform_count += 1; + draw_ctx->buf_area = &layer_ctx->area_full; + draw_ctx->clip_area = &layer_ctx->area_full; + + return layer_ctx; +} + +void lv_draw_sdl_layer_blend(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx, + const lv_draw_img_dsc_t * draw_dsc) +{ + lv_draw_sdl_ctx_t * ctx = (lv_draw_sdl_ctx_t *) draw_ctx; + lv_draw_sdl_layer_ctx_t * transform_ctx = (lv_draw_sdl_layer_ctx_t *) layer_ctx; + + SDL_Renderer * renderer = ctx->renderer; + + SDL_Rect trans_rect; + + if(transform_ctx->flags & LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE) { + lv_area_zoom_to_sdl_rect(&layer_ctx->area_act, &trans_rect, draw_dsc->zoom, &draw_dsc->pivot); + } + else { + lv_area_zoom_to_sdl_rect(&layer_ctx->area_full, &trans_rect, draw_dsc->zoom, &draw_dsc->pivot); + } + + SDL_SetRenderTarget(renderer, transform_ctx->orig_target); + + /*Render off-screen texture, transformed*/ + SDL_Rect clip_rect; + lv_area_to_sdl_rect(layer_ctx->original.clip_area, &clip_rect); + SDL_Point center = {.x = draw_dsc->pivot.x, .y = draw_dsc->pivot.y}; + SDL_RenderSetClipRect(renderer, &clip_rect); + SDL_SetTextureAlphaMod(transform_ctx->target, draw_dsc->opa); + SDL_RenderCopyEx(renderer, transform_ctx->target, &transform_ctx->target_rect, &trans_rect, + draw_dsc->angle, ¢er, SDL_FLIP_NONE); + SDL_RenderSetClipRect(renderer, NULL); +} + +void lv_draw_sdl_layer_destroy(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx) +{ + lv_draw_sdl_ctx_t * ctx = (lv_draw_sdl_ctx_t *) draw_ctx; + ctx->internals->transform_count -= 1; +} + +void lv_draw_sdl_transform_areas_offset(lv_draw_sdl_ctx_t * ctx, bool has_composite, lv_area_t * apply_area, + lv_area_t * coords, lv_area_t * clip) +{ + if(ctx->internals->transform_count == 0) { + return; + } + lv_area_t * area = ctx->base_draw.buf_area; + lv_area_move(coords, -area->x1, -area->y1); + lv_area_move(clip, -area->x1, -area->y1); + if(has_composite) { + lv_area_move(apply_area, -area->x1, -area->y1); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_GPU_SDL*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_layer.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_layer.h new file mode 100644 index 0000000..b60303c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_layer.h @@ -0,0 +1,55 @@ +/** + * @file lv_draw_sdl_refr.h + * + */ + +#ifndef LV_TEMPL_H +#define LV_TEMPL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sdl.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct _lv_draw_sdl_layer_ctx_t { + lv_draw_layer_ctx_t base; + + SDL_Texture * orig_target; + SDL_Texture * target; + SDL_Rect target_rect; + lv_draw_layer_flags_t flags; +} lv_draw_sdl_layer_ctx_t; +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_draw_layer_ctx_t * lv_draw_sdl_layer_init(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx, + lv_draw_layer_flags_t flags); + +void lv_draw_sdl_layer_blend(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * transform_ctx, + const lv_draw_img_dsc_t * draw_dsc); + +void lv_draw_sdl_layer_destroy(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx); + +void lv_draw_sdl_transform_areas_offset(lv_draw_sdl_ctx_t * ctx, bool has_composite, lv_area_t * apply_area, + lv_area_t * coords, lv_area_t * clip); +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEMPL_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_line.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_line.c new file mode 100644 index 0000000..3a15d6d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_line.c @@ -0,0 +1,157 @@ +/** + * @file lv_draw_sdl_line.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_GPU_SDL + +#include "lv_draw_sdl.h" +#include "lv_draw_sdl_utils.h" +#include "lv_draw_sdl_texture_cache.h" +#include "lv_draw_sdl_composite.h" +#include "lv_draw_sdl_mask.h" + +/********************* + * DEFINES + *********************/ +#define ROUND_START 0x01 +#define ROUND_END 0x02 +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_sdl_cache_key_magic_t magic; + lv_coord_t length; + lv_coord_t width; + uint8_t round; +} lv_draw_line_key_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +static lv_draw_line_key_t line_key_create(const lv_draw_line_dsc_t * dsc, lv_coord_t length); + +static SDL_Texture * line_texture_create(lv_draw_sdl_ctx_t * sdl_ctx, const lv_draw_line_dsc_t * dsc, + lv_coord_t length); + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_sdl_draw_line(lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, + const lv_point_t * point2) +{ + lv_draw_sdl_ctx_t * sdl_ctx = (lv_draw_sdl_ctx_t *) draw_ctx; + SDL_Renderer * renderer = sdl_ctx->renderer; + lv_coord_t x1 = point1->x, x2 = point2->x, y1 = point1->y, y2 = point2->y; + double length = SDL_sqrt(SDL_pow(x2 - x1, 2) + SDL_pow(y2 - y1, 2)); + if(length - (long) length > 0.5) { + length = (long) length + 1; + } + + double angle = SDL_atan2(y2 - y1, x2 - x1) * 180 / M_PI; + lv_draw_line_key_t key = line_key_create(dsc, (lv_coord_t) length); + SDL_Texture * texture = lv_draw_sdl_texture_cache_get(sdl_ctx, &key, sizeof(key), NULL); + if(!texture) { + texture = line_texture_create(sdl_ctx, dsc, (lv_coord_t) length); + lv_draw_sdl_texture_cache_put(sdl_ctx, &key, sizeof(key), texture); + } + + lv_area_t coords = {x1, y1, x2, y2}; + const lv_area_t * clip = draw_ctx->clip_area; + + SDL_Rect coords_r, clip_r; + lv_area_to_sdl_rect(&coords, &coords_r); + lv_area_to_sdl_rect(clip, &clip_r); + + lv_area_t t_coords = coords, t_clip = *clip, apply_area; + lv_area_t extension = {dsc->width / 2, dsc->width / 2, dsc->width / 2, dsc->width / 2}; + lv_draw_sdl_composite_begin(sdl_ctx, &coords, clip, &extension, dsc->blend_mode, &t_coords, &t_clip, + &apply_area); + + SDL_Color color; + lv_color_to_sdl_color(&dsc->color, &color); + + SDL_SetTextureColorMod(texture, color.r, color.g, color.b); + SDL_SetTextureAlphaMod(texture, dsc->opa); + SDL_Rect srcrect = {0, 0, (int) length + dsc->width + 2, dsc->width + 2}, + dstrect = {t_coords.x1 - 1 - dsc->width / 2, t_coords.y1 - 1, srcrect.w, srcrect.h}; + SDL_Point center = {1 + dsc->width / 2, 1 + dsc->width / 2}; + + SDL_Rect clip_rect; + lv_area_to_sdl_rect(&t_clip, &clip_rect); + if(!SDL_RectEquals(&clip_rect, &dstrect) || angle != 0) { + SDL_RenderSetClipRect(renderer, &clip_rect); + } + SDL_RenderCopyEx(renderer, texture, &srcrect, &dstrect, angle, ¢er, 0); + SDL_RenderSetClipRect(renderer, NULL); + + lv_draw_sdl_composite_end(sdl_ctx, &apply_area, dsc->blend_mode); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_draw_line_key_t line_key_create(const lv_draw_line_dsc_t * dsc, lv_coord_t length) +{ + lv_draw_line_key_t key; + lv_memset_00(&key, sizeof(lv_draw_line_key_t)); + key.magic = LV_GPU_CACHE_KEY_MAGIC_LINE; + key.length = length; + key.width = dsc->width; + key.round = (dsc->round_start ? ROUND_START : 0) | (dsc->round_end ? ROUND_END : 0); + return key; +} + +static SDL_Texture * line_texture_create(lv_draw_sdl_ctx_t * sdl_ctx, const lv_draw_line_dsc_t * dsc, lv_coord_t length) +{ + SDL_Texture * texture = SDL_CreateTexture(sdl_ctx->renderer, LV_DRAW_SDL_TEXTURE_FORMAT, SDL_TEXTUREACCESS_TARGET, + length + dsc->width + 2, dsc->width + 2); + SDL_Texture * target = SDL_GetRenderTarget(sdl_ctx->renderer); + SDL_SetRenderTarget(sdl_ctx->renderer, texture); + SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); + SDL_SetRenderDrawColor(sdl_ctx->renderer, 0xFF, 0xFF, 0xFF, 0x0); + /* SDL_RenderClear is not working properly, so we overwrite the target with solid color */ + SDL_SetRenderDrawBlendMode(sdl_ctx->renderer, SDL_BLENDMODE_NONE); + SDL_RenderFillRect(sdl_ctx->renderer, NULL); + SDL_SetRenderDrawBlendMode(sdl_ctx->renderer, SDL_BLENDMODE_BLEND); + SDL_SetRenderDrawColor(sdl_ctx->renderer, 0xFF, 0xFF, 0xFF, 0xFF); + SDL_Rect line_rect = {1 + dsc->width / 2, 1, length, dsc->width}; + SDL_RenderFillRect(sdl_ctx->renderer, &line_rect); + if(dsc->round_start || dsc->round_end) { + lv_draw_mask_radius_param_t param; + lv_area_t round_area = {0, 0, dsc->width - 1, dsc->width - 1}; + lv_draw_mask_radius_init(¶m, &round_area, LV_RADIUS_CIRCLE, false); + + int16_t mask_id = lv_draw_mask_add(¶m, NULL); + SDL_Texture * round_texture = lv_draw_sdl_mask_dump_texture(sdl_ctx->renderer, &round_area, &mask_id, 1); + lv_draw_mask_remove_id(mask_id); + + SDL_Rect round_src = {0, 0, dsc->width, dsc->width}; + SDL_Rect round_dst = {line_rect.x - dsc->width / 2, 1, dsc->width, dsc->width}; + SDL_RenderCopy(sdl_ctx->renderer, round_texture, &round_src, &round_dst); + round_dst.x = line_rect.w + dsc->width / 2; + SDL_RenderCopy(sdl_ctx->renderer, round_texture, &round_src, &round_dst); + SDL_DestroyTexture(round_texture); + } + + SDL_SetRenderTarget(sdl_ctx->renderer, target); + return texture; +} + +#endif /*LV_USE_GPU_SDL*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_mask.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_mask.c new file mode 100644 index 0000000..7bb5bbb --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_mask.c @@ -0,0 +1,84 @@ +/** + * @file lv_draw_sdl_mask.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_GPU_SDL + +#include "../../misc/lv_gc.h" +#include "lv_draw_sdl_mask.h" +#include "lv_draw_sdl_utils.h" + +/********************* + * DEFINES + *********************/ +#ifndef HAVE_SDL_CUSTOM_BLEND_MODE + #define HAVE_SDL_CUSTOM_BLEND_MODE (SDL_VERSION_ATLEAST(2, 0, 6)) +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_opa_t * lv_draw_sdl_mask_dump_opa(const lv_area_t * coords, const int16_t * ids, int16_t ids_count) +{ + SDL_assert(coords->x2 >= coords->x1); + SDL_assert(coords->y2 >= coords->y1); + lv_coord_t w = lv_area_get_width(coords), h = lv_area_get_height(coords); + lv_opa_t * mask_buf = lv_mem_buf_get(w * h); + for(lv_coord_t y = 0; y < h; y++) { + lv_opa_t * line_buf = &mask_buf[y * w]; + lv_memset_ff(line_buf, w); + lv_coord_t abs_x = (lv_coord_t) coords->x1, abs_y = (lv_coord_t)(y + coords->y1), len = (lv_coord_t) w; + lv_draw_mask_res_t res; + if(ids) { + res = lv_draw_mask_apply_ids(line_buf, abs_x, abs_y, len, ids, ids_count); + } + else { + res = lv_draw_mask_apply(line_buf, abs_x, abs_y, len); + } + if(res == LV_DRAW_MASK_RES_TRANSP) { + lv_memset_00(line_buf, w); + } + } + return mask_buf; +} + +SDL_Texture * lv_draw_sdl_mask_dump_texture(SDL_Renderer * renderer, const lv_area_t * coords, const int16_t * ids, + int16_t ids_count) +{ + lv_coord_t w = lv_area_get_width(coords), h = lv_area_get_height(coords); + lv_opa_t * mask_buf = lv_draw_sdl_mask_dump_opa(coords, ids, ids_count); + SDL_Surface * surface = lv_sdl_create_opa_surface(mask_buf, w, h, w); + lv_mem_buf_release(mask_buf); + SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer, surface); + SDL_FreeSurface(surface); + return texture; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_GPU_SDL*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_mask.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_mask.h new file mode 100644 index 0000000..a562d73 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_mask.h @@ -0,0 +1,51 @@ +/** + * @file lv_draw_sdl_mask.h + * + */ + +#ifndef LV_DRAW_SDL_MASK_H +#define LV_DRAW_SDL_MASK_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#include LV_GPU_SDL_INCLUDE_PATH + +#include "lv_draw_sdl.h" +#include "../../misc/lv_area.h" +#include "../../misc/lv_color.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_opa_t * lv_draw_sdl_mask_dump_opa(const lv_area_t * coords, const int16_t * ids, int16_t ids_count); + +SDL_Texture * lv_draw_sdl_mask_dump_texture(SDL_Renderer * renderer, const lv_area_t * coords, const int16_t * ids, + int16_t ids_count); + + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SDL_MASK_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_polygon.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_polygon.c new file mode 100644 index 0000000..c5df50c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_polygon.c @@ -0,0 +1,133 @@ +/** + * @file lv_draw_sdl_polygon.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_GPU_SDL + +#include "lv_draw_sdl.h" +#include "lv_draw_sdl_utils.h" +#include "lv_draw_sdl_texture_cache.h" +#include "lv_draw_sdl_composite.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +static void dump_masks(SDL_Texture * texture, const lv_area_t * coords); + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_sdl_polygon(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * draw_dsc, const lv_point_t * points, + uint16_t point_cnt) +{ + if(point_cnt < 3) return; + if(points == NULL) return; + + lv_draw_mask_polygon_param_t polygon_param; + lv_draw_mask_polygon_init(&polygon_param, points, point_cnt); + + if(polygon_param.cfg.point_cnt < 3) { + lv_draw_mask_free_param(&polygon_param); + return; + } + + lv_area_t poly_coords = {.x1 = LV_COORD_MAX, .y1 = LV_COORD_MAX, .x2 = LV_COORD_MIN, .y2 = LV_COORD_MIN}; + + uint16_t i; + for(i = 0; i < point_cnt; i++) { + poly_coords.x1 = LV_MIN(poly_coords.x1, polygon_param.cfg.points[i].x); + poly_coords.y1 = LV_MIN(poly_coords.y1, polygon_param.cfg.points[i].y); + poly_coords.x2 = LV_MAX(poly_coords.x2, polygon_param.cfg.points[i].x); + poly_coords.y2 = LV_MAX(poly_coords.y2, polygon_param.cfg.points[i].y); + } + + bool is_common; + lv_area_t draw_area; + is_common = _lv_area_intersect(&draw_area, &poly_coords, draw_ctx->clip_area); + if(!is_common) { + lv_draw_mask_free_param(&polygon_param); + return; + } + + lv_draw_sdl_ctx_t * ctx = (lv_draw_sdl_ctx_t *) draw_ctx; + + int16_t mask_id = lv_draw_mask_add(&polygon_param, NULL); + + lv_coord_t w = lv_area_get_width(&draw_area), h = lv_area_get_height(&draw_area); + SDL_Texture * texture = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_STREAM1, w, h); + SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); + dump_masks(texture, &draw_area); + + lv_draw_mask_remove_id(mask_id); + lv_draw_mask_free_param(&polygon_param); + + SDL_Rect srcrect = {0, 0, w, h}, dstrect; + lv_area_to_sdl_rect(&draw_area, &dstrect); + SDL_Color color; + lv_color_to_sdl_color(&draw_dsc->bg_color, &color); + SDL_SetTextureColorMod(texture, color.r, color.g, color.b); + SDL_SetTextureAlphaMod(texture, draw_dsc->bg_opa); + SDL_RenderCopy(ctx->renderer, texture, &srcrect, &dstrect); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void dump_masks(SDL_Texture * texture, const lv_area_t * coords) +{ + lv_coord_t w = lv_area_get_width(coords), h = lv_area_get_height(coords); + SDL_assert(w > 0 && h > 0); + SDL_Rect rect = {0, 0, w, h}; + uint8_t * pixels; + int pitch; + if(SDL_LockTexture(texture, &rect, (void **) &pixels, &pitch) != 0) return; + + lv_opa_t * line_buf = lv_mem_buf_get(rect.w); + for(lv_coord_t y = 0; y < rect.h; y++) { + lv_memset_ff(line_buf, rect.w); + lv_coord_t abs_x = (lv_coord_t) coords->x1, abs_y = (lv_coord_t)(y + coords->y1), len = (lv_coord_t) rect.w; + lv_draw_mask_res_t res; + res = lv_draw_mask_apply(line_buf, abs_x, abs_y, len); + if(res == LV_DRAW_MASK_RES_TRANSP) { + lv_memset_00(&pixels[y * pitch], 4 * rect.w); + } + else if(res == LV_DRAW_MASK_RES_FULL_COVER) { + lv_memset_ff(&pixels[y * pitch], 4 * rect.w); + } + else { + for(int x = 0; x < rect.w; x++) { + uint8_t * pixel = &pixels[y * pitch + x * 4]; + *pixel = line_buf[x]; + pixel[1] = pixel[2] = pixel[3] = 0xFF; + } + } + } + lv_mem_buf_release(line_buf); + SDL_UnlockTexture(texture); +} + +#endif /*LV_USE_GPU_SDL*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_priv.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_priv.h new file mode 100644 index 0000000..24a8762 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_priv.h @@ -0,0 +1,72 @@ +/** + * @file lv_draw_sdl_priv.h + * + */ + +#ifndef LV_DRAW_SDL_PRIV_H +#define LV_DRAW_SDL_PRIV_H + + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_GPU_SDL + +#include LV_GPU_SDL_INCLUDE_PATH + +#include "../lv_draw.h" +#include "../../misc/lv_lru.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct lv_draw_sdl_context_internals_t { + lv_lru_t * texture_cache; + SDL_Texture * mask; + SDL_Texture * composition; + SDL_Texture * target_backup; + uint8_t transform_count; +} lv_draw_sdl_context_internals_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/*====================== + * Add/remove functions + *=====================*/ + +/*===================== + * Setter functions + *====================*/ + +/*===================== + * Getter functions + *====================*/ + +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GPU_SDL*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SDL_PRIV_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_rect.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_rect.c new file mode 100644 index 0000000..a303ac7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_rect.c @@ -0,0 +1,712 @@ +/** + * @file lv_draw_sdl_rect.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_GPU_SDL + +#include "../lv_draw_rect.h" +#include "../lv_draw_img.h" +#include "../lv_draw_label.h" +#include "../lv_draw_mask.h" +#include "../../core/lv_refr.h" +#include "lv_draw_sdl_utils.h" +#include "lv_draw_sdl_texture_cache.h" +#include "lv_draw_sdl_composite.h" +#include "lv_draw_sdl_mask.h" +#include "lv_draw_sdl_stack_blur.h" +#include "lv_draw_sdl_layer.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_sdl_cache_key_magic_t magic; + lv_coord_t radius; + lv_coord_t size; +} lv_draw_rect_bg_key_t; + +typedef struct { + lv_sdl_cache_key_magic_t magic; + lv_coord_t radius; + lv_coord_t size; + lv_coord_t blur; +} lv_draw_rect_shadow_key_t; + +typedef struct { + lv_sdl_cache_key_magic_t magic; + lv_coord_t rout, rin; + lv_area_t offsets; +} lv_draw_rect_border_key_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void draw_bg_color(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, + const lv_draw_rect_dsc_t * dsc); + +static void draw_bg_img(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, + const lv_draw_rect_dsc_t * dsc); + +static void draw_border(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, + const lv_draw_rect_dsc_t * dsc); + +static void draw_shadow(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * clip, + const lv_draw_rect_dsc_t * dsc); + +static void draw_outline(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * clip, + const lv_draw_rect_dsc_t * dsc); + +static void draw_border_generic(lv_draw_sdl_ctx_t * ctx, const lv_area_t * outer_area, const lv_area_t * inner_area, + const lv_area_t * clip, lv_coord_t rout, lv_coord_t rin, lv_color_t color, lv_opa_t opa, + lv_blend_mode_t blend_mode); + +static void frag_render_borders(SDL_Renderer * renderer, SDL_Texture * frag, lv_coord_t frag_size, + const lv_area_t * coords, const lv_area_t * clipped, bool full); + +static void frag_render_center(SDL_Renderer * renderer, SDL_Texture * frag, lv_coord_t frag_size, + const lv_area_t * coords, const lv_area_t * clipped, bool full); + +static lv_draw_rect_bg_key_t rect_bg_key_create(lv_coord_t radius, lv_coord_t size); + +static lv_draw_rect_shadow_key_t rect_shadow_key_create(lv_coord_t radius, lv_coord_t size, lv_coord_t blur); + +static lv_draw_rect_border_key_t rect_border_key_create(lv_coord_t rout, lv_coord_t rin, const lv_area_t * outer_area, + const lv_area_t * inner_area); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#define SKIP_BORDER(dsc) ((dsc)->border_opa <= LV_OPA_MIN || (dsc)->border_width == 0 || (dsc)->border_side == LV_BORDER_SIDE_NONE || (dsc)->border_post) +#define SKIP_SHADOW(dsc) ((dsc)->shadow_width == 0 || (dsc)->shadow_opa <= LV_OPA_MIN || ((dsc)->shadow_width == 1 && (dsc)->shadow_spread <= 0 && (dsc)->shadow_ofs_x == 0 && (dsc)->shadow_ofs_y == 0)) +#define SKIP_IMAGE(dsc) ((dsc)->bg_img_src == NULL || (dsc)->bg_img_opa <= LV_OPA_MIN) +#define SKIP_OUTLINE(dsc) ((dsc)->outline_opa <= LV_OPA_MIN || (dsc)->outline_width == 0) + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sdl_draw_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) +{ + const lv_area_t * clip = draw_ctx->clip_area; + lv_draw_sdl_ctx_t * ctx = (lv_draw_sdl_ctx_t *) draw_ctx; + + lv_area_t extension = {0, 0, 0, 0}; + if(!SKIP_SHADOW(dsc)) { + lv_coord_t ext = (lv_coord_t)(dsc->shadow_spread - dsc->shadow_width / 2 + 1); + extension.x1 = LV_MAX(extension.x1, -dsc->shadow_ofs_x + ext); + extension.x2 = LV_MAX(extension.x2, dsc->shadow_ofs_x + ext); + extension.y1 = LV_MAX(extension.y1, -dsc->shadow_ofs_y + ext); + extension.y2 = LV_MAX(extension.y2, dsc->shadow_ofs_y + ext); + } + if(!SKIP_OUTLINE(dsc)) { + lv_coord_t ext = (lv_coord_t)(dsc->outline_pad - 1 + dsc->outline_width); + extension.x1 = LV_MAX(extension.x1, ext); + extension.x2 = LV_MAX(extension.x2, ext); + extension.y1 = LV_MAX(extension.y1, ext); + extension.y2 = LV_MAX(extension.y2, ext); + } + /* Coords will be translated so coords will start at (0,0) */ + lv_area_t t_coords = *coords, t_clip = *clip, apply_area, t_area; + bool has_composite = lv_draw_sdl_composite_begin(ctx, coords, clip, &extension, dsc->blend_mode, &t_coords, &t_clip, + &apply_area); + + lv_draw_sdl_transform_areas_offset(ctx, has_composite, &apply_area, &t_coords, &t_clip); + + bool has_content = _lv_area_intersect(&t_area, &t_coords, &t_clip); + + SDL_Rect clip_rect; + lv_area_to_sdl_rect(&t_clip, &clip_rect); + draw_shadow(ctx, &t_coords, &t_clip, dsc); + /* Shadows and outlines will also draw in extended area */ + if(has_content) { + draw_bg_color(ctx, &t_coords, &t_area, dsc); + draw_bg_img(ctx, &t_coords, &t_area, dsc); + draw_border(ctx, &t_coords, &t_area, dsc); + } + draw_outline(ctx, &t_coords, &t_clip, dsc); + + lv_draw_sdl_composite_end(ctx, &apply_area, dsc->blend_mode); +} + +SDL_Texture * lv_draw_sdl_rect_bg_frag_obtain(lv_draw_sdl_ctx_t * ctx, lv_coord_t radius) +{ + lv_draw_rect_bg_key_t key = rect_bg_key_create(radius, radius); + lv_area_t coords = {0, 0, radius * 2 - 1, radius * 2 - 1}; + lv_area_t coords_frag = {0, 0, radius - 1, radius - 1}; + SDL_Texture * texture = lv_draw_sdl_texture_cache_get(ctx, &key, sizeof(key), NULL); + if(texture == NULL) { + lv_draw_mask_radius_param_t mask_rout_param; + lv_draw_mask_radius_init(&mask_rout_param, &coords, radius, false); + int16_t mask_id = lv_draw_mask_add(&mask_rout_param, NULL); + texture = lv_draw_sdl_mask_dump_texture(ctx->renderer, &coords_frag, &mask_id, 1); + lv_draw_mask_remove_id(mask_id); + SDL_assert(texture); + lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + } + return texture; +} + +void lv_draw_sdl_rect_bg_frag_draw_corners(lv_draw_sdl_ctx_t * ctx, SDL_Texture * frag, lv_coord_t frag_size, + const lv_area_t * coords, const lv_area_t * clip, bool full) +{ + if(!clip) clip = coords; + lv_area_t corner_area, dst_area; + /* Upper left */ + corner_area.x1 = coords->x1; + corner_area.y1 = coords->y1; + corner_area.x2 = coords->x1 + frag_size - 1; + corner_area.y2 = coords->y1 + frag_size - 1; + if(_lv_area_intersect(&dst_area, &corner_area, clip)) { + SDL_Rect dst_rect; + lv_area_to_sdl_rect(&dst_area, &dst_rect); + + lv_coord_t dw = lv_area_get_width(&dst_area), dh = lv_area_get_height(&dst_area); + lv_coord_t sx = (lv_coord_t)(dst_area.x1 - corner_area.x1), sy = (lv_coord_t)(dst_area.y1 - corner_area.y1); + SDL_Rect src_rect = {sx, sy, dw, dh}; + SDL_RenderCopy(ctx->renderer, frag, &src_rect, &dst_rect); + } + /* Upper right, clip right edge if too big */ + corner_area.x1 = LV_MAX(coords->x2 - frag_size + 1, coords->x1 + frag_size); + corner_area.x2 = coords->x2; + if(_lv_area_intersect(&dst_area, &corner_area, clip)) { + SDL_Rect dst_rect; + lv_area_to_sdl_rect(&dst_area, &dst_rect); + + lv_coord_t dw = lv_area_get_width(&dst_area), dh = lv_area_get_height(&dst_area); + if(full) { + lv_coord_t sx = (lv_coord_t)(dst_area.x1 - corner_area.x1), + sy = (lv_coord_t)(dst_area.y1 - corner_area.y1); + SDL_Rect src_rect = {frag_size + 3 + sx, sy, dw, dh}; + SDL_RenderCopy(ctx->renderer, frag, &src_rect, &dst_rect); + } + else { + SDL_Rect src_rect = {corner_area.x2 - dst_area.x2, dst_area.y1 - corner_area.y1, dw, dh}; + SDL_RenderCopyEx(ctx->renderer, frag, &src_rect, &dst_rect, 0, NULL, SDL_FLIP_HORIZONTAL); + } + } + /* Lower right, clip bottom edge if too big */ + corner_area.y1 = LV_MAX(coords->y2 - frag_size + 1, coords->y1 + frag_size); + corner_area.y2 = coords->y2; + if(_lv_area_intersect(&dst_area, &corner_area, clip)) { + SDL_Rect dst_rect; + lv_area_to_sdl_rect(&dst_area, &dst_rect); + + lv_coord_t dw = lv_area_get_width(&dst_area), dh = lv_area_get_height(&dst_area); + if(full) { + lv_coord_t sx = (lv_coord_t)(dst_area.x1 - corner_area.x1), + sy = (lv_coord_t)(dst_area.y1 - corner_area.y1); + SDL_Rect src_rect = {frag_size + 3 + sx, frag_size + 3 + sy, dw, dh}; + SDL_RenderCopy(ctx->renderer, frag, &src_rect, &dst_rect); + } + else { + SDL_Rect src_rect = {corner_area.x2 - dst_area.x2, corner_area.y2 - dst_area.y2, dw, dh}; + SDL_RenderCopyEx(ctx->renderer, frag, &src_rect, &dst_rect, 0, NULL, SDL_FLIP_HORIZONTAL | SDL_FLIP_VERTICAL); + } + } + /* Lower left, right edge should not be clip */ + corner_area.x1 = coords->x1; + corner_area.x2 = coords->x1 + frag_size - 1; + if(_lv_area_intersect(&dst_area, &corner_area, clip)) { + SDL_Rect dst_rect; + lv_area_to_sdl_rect(&dst_area, &dst_rect); + + lv_coord_t dw = lv_area_get_width(&dst_area), dh = lv_area_get_height(&dst_area); + if(full) { + lv_coord_t sx = (lv_coord_t)(dst_area.x1 - corner_area.x1), + sy = (lv_coord_t)(dst_area.y1 - corner_area.y1); + SDL_Rect src_rect = {sx, frag_size + 3 + sy, dw, dh}; + SDL_RenderCopy(ctx->renderer, frag, &src_rect, &dst_rect); + } + else { + SDL_Rect src_rect = {dst_area.x1 - corner_area.x1, corner_area.y2 - dst_area.y2, dw, dh}; + SDL_RenderCopyEx(ctx->renderer, frag, &src_rect, &dst_rect, 0, NULL, SDL_FLIP_VERTICAL); + } + } +} + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void draw_bg_color(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, + const lv_draw_rect_dsc_t * dsc) +{ + if(dsc->bg_opa == 0) { + return; + } + SDL_Color bg_color; + lv_color_to_sdl_color(&dsc->bg_color, &bg_color); + lv_coord_t radius = dsc->radius; + if(radius <= 0) { + SDL_Rect rect; + lv_area_to_sdl_rect(draw_area, &rect); + SDL_SetRenderDrawColor(ctx->renderer, bg_color.r, bg_color.g, bg_color.b, dsc->bg_opa); + SDL_SetRenderDrawBlendMode(ctx->renderer, SDL_BLENDMODE_BLEND); + SDL_RenderFillRect(ctx->renderer, &rect); + return; + } + + /*A small texture with a quarter of the rect is enough*/ + lv_coord_t bg_w = lv_area_get_width(coords), bg_h = lv_area_get_height(coords); + lv_coord_t real_radius = LV_MIN3(bg_w / 2, bg_h / 2, radius); + SDL_Texture * texture = lv_draw_sdl_rect_bg_frag_obtain(ctx, real_radius); + + SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); + SDL_SetTextureAlphaMod(texture, dsc->bg_opa); + SDL_SetTextureColorMod(texture, bg_color.r, bg_color.g, bg_color.b); + lv_draw_sdl_rect_bg_frag_draw_corners(ctx, texture, real_radius, coords, draw_area, false); + frag_render_borders(ctx->renderer, texture, real_radius, coords, draw_area, false); + frag_render_center(ctx->renderer, texture, real_radius, coords, draw_area, false); +} + +static void draw_bg_img(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, + const lv_draw_rect_dsc_t * dsc) +{ + if(SKIP_IMAGE(dsc)) return; + + lv_img_src_t src_type = lv_img_src_get_type(dsc->bg_img_src); + if(src_type == LV_IMG_SRC_SYMBOL) { + lv_point_t size; + lv_txt_get_size(&size, dsc->bg_img_src, dsc->bg_img_symbol_font, 0, 0, LV_COORD_MAX, LV_TEXT_FLAG_NONE); + lv_area_t a; + a.x1 = coords->x1 + lv_area_get_width(coords) / 2 - size.x / 2; + a.x2 = a.x1 + size.x - 1; + a.y1 = coords->y1 + lv_area_get_height(coords) / 2 - size.y / 2; + a.y2 = a.y1 + size.y - 1; + + lv_draw_label_dsc_t label_draw_dsc; + lv_draw_label_dsc_init(&label_draw_dsc); + label_draw_dsc.font = dsc->bg_img_symbol_font; + label_draw_dsc.color = dsc->bg_img_recolor; + label_draw_dsc.opa = dsc->bg_img_opa; + lv_draw_label((lv_draw_ctx_t *) ctx, &label_draw_dsc, &a, dsc->bg_img_src, NULL); + } + else { + lv_img_header_t header; + size_t key_size; + lv_draw_sdl_cache_key_head_img_t * key = lv_draw_sdl_texture_img_key_create(dsc->bg_img_src, 0, &key_size); + bool key_found; + lv_img_header_t * cache_header = NULL; + SDL_Texture * texture = lv_draw_sdl_texture_cache_get_with_userdata(ctx, key, key_size, &key_found, + (void **) &cache_header); + SDL_free(key); + if(texture) { + header = *cache_header; + } + else if(key_found || lv_img_decoder_get_info(dsc->bg_img_src, &header) != LV_RES_OK) { + /* When cache hit but with negative result, use default decoder. If still fail, return.*/ + LV_LOG_WARN("Couldn't read the background image"); + return; + } + + lv_draw_img_dsc_t img_dsc; + lv_draw_img_dsc_init(&img_dsc); + img_dsc.blend_mode = dsc->blend_mode; + img_dsc.recolor = dsc->bg_img_recolor; + img_dsc.recolor_opa = dsc->bg_img_recolor_opa; + img_dsc.opa = dsc->bg_img_opa; + img_dsc.frame_id = 0; + + int16_t radius_mask_id = LV_MASK_ID_INV; + lv_draw_mask_radius_param_t radius_param; + if(dsc->radius > 0) { + lv_draw_mask_radius_init(&radius_param, coords, dsc->radius, false); + radius_mask_id = lv_draw_mask_add(&radius_param, NULL); + } + + /*Center align*/ + if(dsc->bg_img_tiled == false) { + lv_area_t area; + area.x1 = coords->x1 + lv_area_get_width(coords) / 2 - header.w / 2; + area.y1 = coords->y1 + lv_area_get_height(coords) / 2 - header.h / 2; + area.x2 = area.x1 + header.w - 1; + area.y2 = area.y1 + header.h - 1; + + lv_draw_img((lv_draw_ctx_t *) ctx, &img_dsc, &area, dsc->bg_img_src); + } + else { + lv_area_t area; + area.y1 = coords->y1; + area.y2 = area.y1 + header.h - 1; + + for(; area.y1 <= coords->y2; area.y1 += header.h, area.y2 += header.h) { + + area.x1 = coords->x1; + area.x2 = area.x1 + header.w - 1; + for(; area.x1 <= coords->x2; area.x1 += header.w, area.x2 += header.w) { + lv_draw_img((lv_draw_ctx_t *) ctx, &img_dsc, &area, dsc->bg_img_src); + } + } + } + + if(radius_mask_id != LV_MASK_ID_INV) { + lv_draw_mask_remove_id(radius_mask_id); + lv_draw_mask_free_param(&radius_param); + } + } +} + +static void draw_shadow(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * clip, + const lv_draw_rect_dsc_t * dsc) +{ + /*Check whether the shadow is visible*/ + if(SKIP_SHADOW(dsc)) return; + + lv_coord_t sw = dsc->shadow_width; + + lv_area_t core_area; + core_area.x1 = coords->x1 + dsc->shadow_ofs_x - dsc->shadow_spread; + core_area.x2 = coords->x2 + dsc->shadow_ofs_x + dsc->shadow_spread; + core_area.y1 = coords->y1 + dsc->shadow_ofs_y - dsc->shadow_spread; + core_area.y2 = coords->y2 + dsc->shadow_ofs_y + dsc->shadow_spread; + + lv_area_t shadow_area; + shadow_area.x1 = core_area.x1 - sw / 2 - 1; + shadow_area.x2 = core_area.x2 + sw / 2 + 1; + shadow_area.y1 = core_area.y1 - sw / 2 - 1; + shadow_area.y2 = core_area.y2 + sw / 2 + 1; + + lv_opa_t opa = dsc->shadow_opa; + + if(opa > LV_OPA_MAX) opa = LV_OPA_COVER; + + /*Get clipped draw area which is the real draw area. + *It is always the same or inside `shadow_area`*/ + lv_area_t draw_area; + if(!_lv_area_intersect(&draw_area, &shadow_area, clip)) return; + + SDL_Rect core_area_rect; + lv_area_to_sdl_rect(&shadow_area, &core_area_rect); + + lv_coord_t radius = dsc->radius; + /* No matter how big the shadow is, what we need is just a corner */ + lv_coord_t frag_size = LV_MIN3(lv_area_get_width(&core_area) / 2, lv_area_get_height(&core_area) / 2, + LV_MAX(sw / 2, radius)); + + /* This is how big the corner is after blurring */ + lv_coord_t blur_growth = (lv_coord_t)(sw / 2 + 1); + + lv_coord_t blur_frag_size = (lv_coord_t)(frag_size + blur_growth); + + lv_draw_rect_shadow_key_t key = rect_shadow_key_create(radius, frag_size, sw); + + SDL_Texture * texture = lv_draw_sdl_texture_cache_get(ctx, &key, sizeof(key), NULL); + if(texture == NULL) { + lv_area_t mask_area = {blur_growth, blur_growth}, mask_area_blurred = {0, 0}; + lv_area_set_width(&mask_area, frag_size * 2); + lv_area_set_height(&mask_area, frag_size * 2); + lv_area_set_width(&mask_area_blurred, blur_frag_size * 2); + lv_area_set_height(&mask_area_blurred, blur_frag_size * 2); + + lv_draw_mask_radius_param_t mask_rout_param; + lv_draw_mask_radius_init(&mask_rout_param, &mask_area, radius, false); + int16_t mask_id = lv_draw_mask_add(&mask_rout_param, NULL); + lv_opa_t * mask_buf = lv_draw_sdl_mask_dump_opa(&mask_area_blurred, &mask_id, 1); + lv_stack_blur_grayscale(mask_buf, lv_area_get_width(&mask_area_blurred), lv_area_get_height(&mask_area_blurred), + sw / 2 + sw % 2); + texture = lv_sdl_create_opa_texture(ctx->renderer, mask_buf, blur_frag_size, blur_frag_size, + lv_area_get_width(&mask_area_blurred)); + lv_mem_buf_release(mask_buf); + lv_draw_mask_remove_id(mask_id); + SDL_assert(texture); + lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + } + + SDL_Color shadow_color; + lv_color_to_sdl_color(&dsc->shadow_color, &shadow_color); + SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); + SDL_SetTextureAlphaMod(texture, opa); + SDL_SetTextureColorMod(texture, shadow_color.r, shadow_color.g, shadow_color.b); + + lv_draw_sdl_rect_bg_frag_draw_corners(ctx, texture, blur_frag_size, &shadow_area, clip, false); + frag_render_borders(ctx->renderer, texture, blur_frag_size, &shadow_area, clip, false); + frag_render_center(ctx->renderer, texture, blur_frag_size, &shadow_area, clip, false); +} + + +static void draw_border(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, + const lv_draw_rect_dsc_t * dsc) +{ + if(SKIP_BORDER(dsc)) return; + + SDL_Color border_color; + lv_color_to_sdl_color(&dsc->border_color, &border_color); + + lv_coord_t coords_w = lv_area_get_width(coords), coords_h = lv_area_get_height(coords); + lv_coord_t short_side = LV_MIN(coords_w, coords_h); + lv_coord_t rout = LV_MIN(dsc->radius, short_side / 2);/*Get the inner area*/ + lv_area_t area_inner; + lv_area_copy(&area_inner, coords);// lv_area_increase(&area_inner, 1, 1); + area_inner.x1 += ((dsc->border_side & LV_BORDER_SIDE_LEFT) ? dsc->border_width : -(dsc->border_width + rout)); + area_inner.x2 -= ((dsc->border_side & LV_BORDER_SIDE_RIGHT) ? dsc->border_width : -(dsc->border_width + rout)); + area_inner.y1 += ((dsc->border_side & LV_BORDER_SIDE_TOP) ? dsc->border_width : -(dsc->border_width + rout)); + area_inner.y2 -= ((dsc->border_side & LV_BORDER_SIDE_BOTTOM) ? dsc->border_width : -(dsc->border_width + rout)); + lv_coord_t rin = LV_MAX(rout - dsc->border_width, 0); + draw_border_generic(ctx, coords, &area_inner, draw_area, rout, rin, dsc->border_color, dsc->border_opa, + dsc->blend_mode); +} + +static void draw_outline(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * clip, + const lv_draw_rect_dsc_t * dsc) +{ + if(SKIP_OUTLINE(dsc)) return; + + lv_opa_t opa = dsc->outline_opa; + + if(opa > LV_OPA_MAX) opa = LV_OPA_COVER; + + /*Get the inner radius*/ + lv_area_t area_inner; + lv_area_copy(&area_inner, coords); + + /*Bring the outline closer to make sure there is no color bleeding with pad=0*/ + lv_coord_t pad = dsc->outline_pad - 1; + area_inner.x1 -= pad; + area_inner.y1 -= pad; + area_inner.x2 += pad; + area_inner.y2 += pad; + + lv_area_t area_outer; + lv_area_copy(&area_outer, &area_inner); + + area_outer.x1 -= dsc->outline_width; + area_outer.x2 += dsc->outline_width; + area_outer.y1 -= dsc->outline_width; + area_outer.y2 += dsc->outline_width; + + lv_area_t draw_area; + if(!_lv_area_intersect(&draw_area, &area_outer, clip)) return; + + int32_t inner_w = lv_area_get_width(&area_inner); + int32_t inner_h = lv_area_get_height(&area_inner); + lv_coord_t rin = dsc->radius; + int32_t short_side = LV_MIN(inner_w, inner_h); + if(rin > short_side >> 1) rin = short_side >> 1; + + lv_coord_t rout = rin + dsc->outline_width; + + draw_border_generic(ctx, &area_outer, &area_inner, clip, rout, rin, dsc->outline_color, dsc->outline_opa, + dsc->blend_mode); +} + +static void draw_border_generic(lv_draw_sdl_ctx_t * ctx, const lv_area_t * outer_area, const lv_area_t * inner_area, + const lv_area_t * clip, lv_coord_t rout, lv_coord_t rin, lv_color_t color, lv_opa_t opa, + lv_blend_mode_t blend_mode) +{ + opa = opa >= LV_OPA_COVER ? LV_OPA_COVER : opa; + + SDL_Renderer * renderer = ctx->renderer; + + lv_draw_rect_border_key_t key = rect_border_key_create(rout, rin, outer_area, inner_area); + lv_coord_t radius = LV_MIN3(rout, lv_area_get_width(outer_area) / 2, lv_area_get_height(outer_area) / 2); + lv_coord_t max_side = LV_MAX4(key.offsets.x1, key.offsets.y1, -key.offsets.x2, -key.offsets.y2); + lv_coord_t frag_size = LV_MAX(radius, max_side); + SDL_Texture * texture = lv_draw_sdl_texture_cache_get(ctx, &key, sizeof(key), NULL); + if(texture == NULL) { + /* Create a mask texture with size of (frag_size * 2 + 3) */ + const lv_area_t frag_area = {0, 0, frag_size * 2 + 2, frag_size * 2 + 2}; + + /*Create mask for the outer area*/ + int16_t mask_ids[2] = {LV_MASK_ID_INV, LV_MASK_ID_INV}; + lv_draw_mask_radius_param_t mask_rout_param; + if(rout > 0) { + lv_draw_mask_radius_init(&mask_rout_param, &frag_area, rout, false); + mask_ids[0] = lv_draw_mask_add(&mask_rout_param, NULL); + } + + /*Create mask for the inner mask*/ + if(rin < 0) rin = 0; + const lv_area_t frag_inner_area = {frag_area.x1 + key.offsets.x1, frag_area.y1 + key.offsets.y1, + frag_area.x2 + key.offsets.x2, frag_area.y2 + key.offsets.y2 + }; + lv_draw_mask_radius_param_t mask_rin_param; + lv_draw_mask_radius_init(&mask_rin_param, &frag_inner_area, rin, true); + mask_ids[1] = lv_draw_mask_add(&mask_rin_param, NULL); + + texture = lv_draw_sdl_mask_dump_texture(renderer, &frag_area, mask_ids, 2); + + lv_draw_mask_remove_id(mask_ids[1]); + lv_draw_mask_remove_id(mask_ids[0]); + SDL_assert(texture); + lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + } + + SDL_Rect outer_rect; + lv_area_to_sdl_rect(outer_area, &outer_rect); + SDL_Color color_sdl; + lv_color_to_sdl_color(&color, &color_sdl); + + SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); + SDL_SetTextureAlphaMod(texture, opa); + SDL_SetTextureColorMod(texture, color_sdl.r, color_sdl.g, color_sdl.b); + + lv_draw_sdl_rect_bg_frag_draw_corners(ctx, texture, frag_size, outer_area, clip, true); + frag_render_borders(renderer, texture, frag_size, outer_area, clip, true); +} + +static void frag_render_borders(SDL_Renderer * renderer, SDL_Texture * frag, lv_coord_t frag_size, + const lv_area_t * coords, const lv_area_t * clipped, bool full) +{ + lv_area_t border_area, dst_area; + /* Top border */ + border_area.x1 = coords->x1 + frag_size; + border_area.y1 = coords->y1; + border_area.x2 = coords->x2 - frag_size; + border_area.y2 = coords->y1 + frag_size - 1; + if(_lv_area_intersect(&dst_area, &border_area, clipped)) { + SDL_Rect dst_rect; + lv_area_to_sdl_rect(&dst_area, &dst_rect); + + lv_coord_t sy = (lv_coord_t)(dst_area.y1 - border_area.y1); + if(full) { + SDL_Rect src_rect = {frag_size + 1, sy, 1, lv_area_get_height(&dst_area)}; + SDL_RenderCopy(renderer, frag, &src_rect, &dst_rect); + } + else { + SDL_Rect src_rect = {frag_size - 1, sy, 1, lv_area_get_height(&dst_area)}; + SDL_RenderCopy(renderer, frag, &src_rect, &dst_rect); + } + } + /* Bottom border */ + border_area.y1 = LV_MAX(coords->y2 - frag_size + 1, coords->y1 + frag_size); + border_area.y2 = coords->y2; + if(_lv_area_intersect(&dst_area, &border_area, clipped)) { + SDL_Rect dst_rect; + lv_area_to_sdl_rect(&dst_area, &dst_rect); + + lv_coord_t dh = lv_area_get_height(&dst_area); + if(full) { + lv_coord_t sy = (lv_coord_t)(dst_area.y1 - border_area.y1); + SDL_Rect src_rect = {frag_size + 1, frag_size + 3 + sy, 1, dh}; + SDL_RenderCopy(renderer, frag, &src_rect, &dst_rect); + } + else { + lv_coord_t sy = (lv_coord_t)(border_area.y2 - dst_area.y2); + SDL_Rect src_rect = {frag_size - 1, sy, 1, dh}; + SDL_RenderCopyEx(renderer, frag, &src_rect, &dst_rect, 0, NULL, SDL_FLIP_VERTICAL); + } + } + /* Left border */ + border_area.x1 = coords->x1; + border_area.y1 = coords->y1 + frag_size; + border_area.x2 = coords->x1 + frag_size - 1; + border_area.y2 = coords->y2 - frag_size; + if(_lv_area_intersect(&dst_area, &border_area, clipped)) { + SDL_Rect dst_rect; + lv_area_to_sdl_rect(&dst_area, &dst_rect); + + lv_coord_t dw = lv_area_get_width(&dst_area); + lv_coord_t sx = (lv_coord_t)(dst_area.x1 - border_area.x1); + if(full) { + SDL_Rect src_rect = {sx, frag_size + 1, dw, 1}; + SDL_RenderCopy(renderer, frag, &src_rect, &dst_rect); + } + else { + SDL_Rect src_rect = {sx, frag_size - 1, dw, 1}; + SDL_RenderCopy(renderer, frag, &src_rect, &dst_rect); + } + } + /* Right border */ + border_area.x1 = LV_MAX(coords->x2 - frag_size + 1, coords->x1 + frag_size); + border_area.x2 = coords->x2; + if(_lv_area_intersect(&dst_area, &border_area, clipped)) { + SDL_Rect dst_rect; + lv_area_to_sdl_rect(&dst_area, &dst_rect); + + lv_coord_t dw = lv_area_get_width(&dst_area); + if(full) { + lv_coord_t sx = (lv_coord_t)(dst_area.x1 - border_area.x1); + SDL_Rect src_rect = {frag_size + 3 + sx, frag_size + 1, dw, 1}; + SDL_RenderCopy(renderer, frag, &src_rect, &dst_rect); + } + else { + lv_coord_t sx = (lv_coord_t)(border_area.x2 - dst_area.x2); + SDL_Rect src_rect = {sx, frag_size - 1, dw, 1}; + SDL_RenderCopyEx(renderer, frag, &src_rect, &dst_rect, 0, NULL, SDL_FLIP_HORIZONTAL); + } + } +} + +static void frag_render_center(SDL_Renderer * renderer, SDL_Texture * frag, lv_coord_t frag_size, + const lv_area_t * coords, + const lv_area_t * clipped, bool full) +{ + lv_area_t center_area = { + coords->x1 + frag_size, + coords->y1 + frag_size, + coords->x2 - frag_size, + coords->y2 - frag_size, + }; + if(center_area.x2 < center_area.x1 || center_area.y2 < center_area.y1) return; + lv_area_t draw_area; + if(!_lv_area_intersect(&draw_area, ¢er_area, clipped)) { + return; + } + SDL_Rect dst_rect; + lv_area_to_sdl_rect(&draw_area, &dst_rect); + if(full) { + SDL_Rect src_rect = {frag_size, frag_size, 1, 1}; + SDL_RenderCopy(renderer, frag, &src_rect, &dst_rect); + } + else { + SDL_Rect src_rect = {frag_size - 1, frag_size - 1, 1, 1}; + SDL_RenderCopy(renderer, frag, &src_rect, &dst_rect); + } +} + +static lv_draw_rect_bg_key_t rect_bg_key_create(lv_coord_t radius, lv_coord_t size) +{ + lv_draw_rect_bg_key_t key; + SDL_memset(&key, 0, sizeof(key)); + key.magic = LV_GPU_CACHE_KEY_MAGIC_RECT_BG; + key.radius = radius; + key.size = size; + return key; +} + +static lv_draw_rect_shadow_key_t rect_shadow_key_create(lv_coord_t radius, lv_coord_t size, lv_coord_t blur) +{ + lv_draw_rect_shadow_key_t key; + SDL_memset(&key, 0, sizeof(key)); + key.magic = LV_GPU_CACHE_KEY_MAGIC_RECT_SHADOW; + key.radius = radius; + key.size = size; + key.blur = blur; + return key; +} + +static lv_draw_rect_border_key_t rect_border_key_create(lv_coord_t rout, lv_coord_t rin, const lv_area_t * outer_area, + const lv_area_t * inner_area) +{ + lv_draw_rect_border_key_t key; + /* VERY IMPORTANT! Padding between members is uninitialized, so we have to wipe them manually */ + SDL_memset(&key, 0, sizeof(key)); + key.magic = LV_GPU_CACHE_KEY_MAGIC_RECT_BORDER; + key.rout = rout; + key.rin = rin; + key.offsets.x1 = inner_area->x1 - outer_area->x1; + key.offsets.x2 = inner_area->x2 - outer_area->x2; + key.offsets.y1 = inner_area->y1 - outer_area->y1; + key.offsets.y2 = inner_area->y2 - outer_area->y2; + return key; +} + +#endif /*LV_USE_GPU_SDL*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_rect.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_rect.h new file mode 100644 index 0000000..1e9be34 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_rect.h @@ -0,0 +1,75 @@ +/** + * @file lv_draw_sdl_rect.h + * + */ + +#ifndef LV_DRAW_SDL_RECT_H +#define LV_DRAW_SDL_RECT_H + + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_GPU_SDL + +#include LV_GPU_SDL_INCLUDE_PATH + +#include "../lv_draw.h" + +#include "lv_draw_sdl_texture_cache.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct lv_draw_sdl_rect_header_t { + lv_img_header_t base; + SDL_Rect rect; +} lv_draw_sdl_rect_header_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/*====================== + * Add/remove functions + *=====================*/ + +/*===================== + * Setter functions + *====================*/ + +/*===================== + * Getter functions + *====================*/ + +/*===================== + * Other functions + *====================*/ + +SDL_Texture * lv_draw_sdl_rect_bg_frag_obtain(lv_draw_sdl_ctx_t * ctx, lv_coord_t radius); + +void lv_draw_sdl_rect_bg_frag_draw_corners(lv_draw_sdl_ctx_t * ctx, SDL_Texture * frag, lv_coord_t frag_size, + const lv_area_t * coords, const lv_area_t * clip, bool full); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GPU_SDL*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SDL_RECT_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_stack_blur.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_stack_blur.c new file mode 100644 index 0000000..1c411b0 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_stack_blur.c @@ -0,0 +1,249 @@ +/** + * @file lv_draw_sdl_stack_blur.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sdl_stack_blur.h" + +#if LV_USE_GPU_SDL +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void +stack_blur_job(lv_opa_t * src, unsigned int w, unsigned int h, unsigned int radius, int cores, int core, int step); + +/********************** + * STATIC VARIABLES + **********************/ + +// Based heavily on http://vitiy.info/Code/stackblur.cpp +// See http://vitiy.info/stackblur-algorithm-multi-threaded-blur-for-cpp/ +// Stack Blur Algorithm by Mario Klingemann + +static unsigned short const stackblur_mul[255] = { + 512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512, + 454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512, + 482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456, + 437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512, + 497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328, + 320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456, + 446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335, + 329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512, + 505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405, + 399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328, + 324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271, + 268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456, + 451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388, + 385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335, + 332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292, + 289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259 +}; + +static unsigned char const stackblur_shr[255] = { + 9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, + 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24 +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_stack_blur_grayscale(lv_opa_t * buf, uint16_t w, uint16_t h, uint16_t r) +{ + stack_blur_job(buf, w, h, r, 1, 0, 1); + stack_blur_job(buf, w, h, r, 1, 0, 2); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void stack_blur_job(lv_opa_t * src, unsigned int w, unsigned int h, unsigned int radius, int cores, int core, + int step) +{ + if(radius < 2 || radius > 254) { + /* Silently ignore bad radius */ + return; + } + + unsigned int x, y, xp, yp, i; + unsigned int sp; + unsigned int stack_start; + unsigned char * stack_ptr; + + lv_opa_t * src_ptr; + lv_opa_t * dst_ptr; + + unsigned long sum_r; + unsigned long sum_in_r; + unsigned long sum_out_r; + + unsigned int wm = w - 1; + unsigned int hm = h - 1; + unsigned int stride = w; + unsigned int div = (radius * 2) + 1; + unsigned int mul_sum = stackblur_mul[radius]; + unsigned char shr_sum = stackblur_shr[radius]; + unsigned char stack[254 * 2 + 1]; + + if(step == 1) { + unsigned int minY = core * h / cores; + unsigned int maxY = (core + 1) * h / cores; + + for(y = minY; y < maxY; y++) { + sum_r = + sum_in_r = + sum_out_r = 0; + + src_ptr = src + stride * y; // start of line (0,y) + + for(i = 0; i <= radius; i++) { + stack_ptr = &stack[i]; + stack_ptr[0] = src_ptr[0]; + sum_r += src_ptr[0] * (i + 1); + sum_out_r += src_ptr[0]; + } + + + for(i = 1; i <= radius; i++) { + if(i <= wm) src_ptr += 1; + stack_ptr = &stack[i + radius]; + stack_ptr[0] = src_ptr[0]; + sum_r += src_ptr[0] * (radius + 1 - i); + sum_in_r += src_ptr[0]; + } + + + sp = radius; + xp = radius; + if(xp > wm) xp = wm; + src_ptr = src + (xp + y * w); // img.pix_ptr(xp, y); + dst_ptr = src + y * stride; // img.pix_ptr(0, y); + for(x = 0; x < w; x++) { + dst_ptr[0] = LV_CLAMP((sum_r * mul_sum) >> shr_sum, 0, 255); + dst_ptr += 1; + + sum_r -= sum_out_r; + + stack_start = sp + div - radius; + if(stack_start >= div) stack_start -= div; + stack_ptr = &stack[stack_start]; + + sum_out_r -= stack_ptr[0]; + + if(xp < wm) { + src_ptr += 1; + ++xp; + } + + stack_ptr[0] = src_ptr[0]; + + sum_in_r += src_ptr[0]; + sum_r += sum_in_r; + + ++sp; + if(sp >= div) sp = 0; + stack_ptr = &stack[sp]; + + sum_out_r += stack_ptr[0]; + sum_in_r -= stack_ptr[0]; + } + + } + } + + // step 2 + if(step == 2) { + unsigned int minX = core * w / cores; + unsigned int maxX = (core + 1) * w / cores; + + for(x = minX; x < maxX; x++) { + sum_r = + sum_in_r = + sum_out_r = 0; + + src_ptr = src + x; // x,0 + for(i = 0; i <= radius; i++) { + stack_ptr = &stack[i]; + stack_ptr[0] = src_ptr[0]; + sum_r += src_ptr[0] * (i + 1); + sum_out_r += src_ptr[0]; + } + for(i = 1; i <= radius; i++) { + if(i <= hm) src_ptr += stride; // +stride + + stack_ptr = &stack[i + radius]; + stack_ptr[0] = src_ptr[0]; + sum_r += src_ptr[0] * (radius + 1 - i); + sum_in_r += src_ptr[0]; + } + + sp = radius; + yp = radius; + if(yp > hm) yp = hm; + src_ptr = src + (x + yp * w); // img.pix_ptr(x, yp); + dst_ptr = src + x; // img.pix_ptr(x, 0); + for(y = 0; y < h; y++) { + dst_ptr[0] = LV_CLAMP((sum_r * mul_sum) >> shr_sum, 0, 255); + dst_ptr += stride; + + sum_r -= sum_out_r; + + stack_start = sp + div - radius; + if(stack_start >= div) stack_start -= div; + stack_ptr = &stack[stack_start]; + + sum_out_r -= stack_ptr[0]; + + if(yp < hm) { + src_ptr += stride; // stride + ++yp; + } + + stack_ptr[0] = src_ptr[0]; + + sum_in_r += src_ptr[0]; + sum_r += sum_in_r; + + ++sp; + if(sp >= div) sp = 0; + stack_ptr = &stack[sp]; + + sum_out_r += stack_ptr[0]; + sum_in_r -= stack_ptr[0]; + } + } + } +} + +#endif /*LV_USE_GPU_SDL*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_stack_blur.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_stack_blur.h new file mode 100644 index 0000000..413b1c9 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_stack_blur.h @@ -0,0 +1,46 @@ +/** + * @file lv_draw_sdl_stack_blur.h + * + */ +#ifndef LV_DRAW_SDL_STACK_BLUR_H +#define LV_DRAW_SDL_STACK_BLUR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_GPU_SDL + +#include "../../misc/lv_color.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_stack_blur_grayscale(lv_opa_t * buf, uint16_t w, uint16_t h, uint16_t r); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GPU_SDL*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SDL_STACK_BLUR_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_texture_cache.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_texture_cache.c new file mode 100644 index 0000000..6845add --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_texture_cache.c @@ -0,0 +1,178 @@ +/** + * @file lv_draw_sdl_texture_cache.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_GPU_SDL + +#include "lv_draw_sdl_texture_cache.h" + +#include "lv_draw_sdl_utils.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + SDL_Texture * texture; + void * userdata; + lv_lru_free_t * userdata_free; + lv_draw_sdl_cache_flag_t flags; +} draw_cache_value_t; + +typedef struct { + lv_sdl_cache_key_magic_t magic; +} temp_texture_key_t; + +typedef struct { + lv_coord_t width, height; +} temp_texture_userdata_t; + +static void draw_cache_free_value(draw_cache_value_t *); + +static draw_cache_value_t * draw_cache_get_entry(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, + bool * found); +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sdl_texture_cache_init(lv_draw_sdl_ctx_t * ctx) +{ + ctx->internals->texture_cache = lv_lru_create(LV_GPU_SDL_LRU_SIZE, 65536, + (lv_lru_free_t *) draw_cache_free_value, NULL); +} + +void lv_draw_sdl_texture_cache_deinit(lv_draw_sdl_ctx_t * ctx) +{ + lv_lru_del(ctx->internals->texture_cache); +} + +SDL_Texture * lv_draw_sdl_texture_cache_get(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, bool * found) +{ + return lv_draw_sdl_texture_cache_get_with_userdata(ctx, key, key_length, found, NULL); +} + +SDL_Texture * lv_draw_sdl_texture_cache_get_with_userdata(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, + bool * found, void ** userdata) +{ + draw_cache_value_t * value = draw_cache_get_entry(ctx, key, key_length, found); + if(!value) return NULL; + if(userdata) { + *userdata = value->userdata; + } + return value->texture; +} + +void lv_draw_sdl_texture_cache_put(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, SDL_Texture * texture) +{ + lv_draw_sdl_texture_cache_put_advanced(ctx, key, key_length, texture, NULL, NULL, 0); +} + +void lv_draw_sdl_texture_cache_put_advanced(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, + SDL_Texture * texture, void * userdata, void userdata_free(void *), + lv_draw_sdl_cache_flag_t flags) +{ + lv_lru_t * lru = ctx->internals->texture_cache; + draw_cache_value_t * value = SDL_malloc(sizeof(draw_cache_value_t)); + value->texture = texture; + value->userdata = userdata; + value->userdata_free = userdata_free; + value->flags = flags; + if(!texture) { + lv_lru_set(lru, key, key_length, value, 1); + return; + } + if(flags & LV_DRAW_SDL_CACHE_FLAG_MANAGED) { + /* Managed texture doesn't count into cache size */ + LV_LOG_INFO("cache texture %p", texture); + lv_lru_set(lru, key, key_length, value, 1); + return; + } + Uint32 format; + int access, width, height; + if(SDL_QueryTexture(texture, &format, &access, &width, &height) != 0) { + return; + } + LV_LOG_INFO("cache texture %p, %d*%d@%dbpp", texture, width, height, SDL_BITSPERPIXEL(format)); + lv_lru_set(lru, key, key_length, value, width * height * SDL_BITSPERPIXEL(format) / 8); +} + +lv_draw_sdl_cache_key_head_img_t * lv_draw_sdl_texture_img_key_create(const void * src, int32_t frame_id, size_t * size) +{ + lv_draw_sdl_cache_key_head_img_t header; + /* VERY IMPORTANT! Padding between members is uninitialized, so we have to wipe them manually */ + SDL_memset(&header, 0, sizeof(header)); + header.magic = LV_GPU_CACHE_KEY_MAGIC_IMG; + header.type = lv_img_src_get_type(src); + header.frame_id = frame_id; + void * key; + size_t key_size; + if(header.type == LV_IMG_SRC_FILE || header.type == LV_IMG_SRC_SYMBOL) { + size_t srclen = SDL_strlen(src); + key_size = sizeof(header) + srclen; + key = SDL_malloc(key_size); + SDL_memcpy(key, &header, sizeof(header)); + /*Copy string content as key value*/ + SDL_memcpy(key + sizeof(header), src, srclen); + } + else { + key_size = sizeof(header) + sizeof(void *); + key = SDL_malloc(key_size); + SDL_memcpy(key, &header, sizeof(header)); + /*Copy address number as key value*/ + SDL_memcpy(key + sizeof(header), &src, sizeof(void *)); + } + *size = key_size; + return (lv_draw_sdl_cache_key_head_img_t *) key; +} + +static void draw_cache_free_value(draw_cache_value_t * value) +{ + if(value->texture && !(value->flags & LV_DRAW_SDL_CACHE_FLAG_MANAGED)) { + LV_LOG_INFO("destroy texture %p", value->texture); + SDL_DestroyTexture(value->texture); + } + if(value->userdata_free) { + value->userdata_free(value->userdata); + } + SDL_free(value); +} + +static draw_cache_value_t * draw_cache_get_entry(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, + bool * found) +{ + lv_lru_t * lru = ctx->internals->texture_cache; + draw_cache_value_t * value = NULL; + lv_lru_get(lru, key, key_length, (void **) &value); + if(!value) { + if(found) { + *found = false; + } + return NULL; + } + if(found) { + *found = true; + } + return value; +} + +#endif /*LV_USE_GPU_SDL*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_texture_cache.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_texture_cache.h new file mode 100644 index 0000000..dc8b578 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_texture_cache.h @@ -0,0 +1,102 @@ +/** + * @file lv_draw_sdl_texture_cache.h + * + */ + +#ifndef LV_DRAW_SDL_TEXTURE_CACHE_H +#define LV_DRAW_SDL_TEXTURE_CACHE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_GPU_SDL + +#include LV_GPU_SDL_INCLUDE_PATH +#include "lv_draw_sdl.h" +#include "lv_draw_sdl_priv.h" +#include "../../draw/lv_img_decoder.h" +#include "../../misc/lv_area.h" + +/********************* + * DEFINES + *********************/ + +#define LV_DRAW_SDL_DEC_DSC_TEXTURE_HEAD "@LVSDLTex" + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + char head[8]; + SDL_Texture * texture; + SDL_Rect rect; + bool texture_managed; + bool texture_referenced; +} lv_draw_sdl_dec_dsc_userdata_t; + +typedef enum { + LV_GPU_CACHE_KEY_MAGIC_ARC = 0x01, + LV_GPU_CACHE_KEY_MAGIC_IMG = 0x11, + LV_GPU_CACHE_KEY_MAGIC_IMG_ROUNDED_CORNERS = 0x12, + LV_GPU_CACHE_KEY_MAGIC_LINE = 0x21, + LV_GPU_CACHE_KEY_MAGIC_RECT_BG = 0x31, + LV_GPU_CACHE_KEY_MAGIC_RECT_SHADOW = 0x32, + LV_GPU_CACHE_KEY_MAGIC_RECT_BORDER = 0x33, + LV_GPU_CACHE_KEY_MAGIC_FONT_GLYPH = 0x41, + LV_GPU_CACHE_KEY_MAGIC_MASK = 0x51, +} lv_sdl_cache_key_magic_t; + +typedef enum { + LV_DRAW_SDL_CACHE_FLAG_NONE = 0, + LV_DRAW_SDL_CACHE_FLAG_MANAGED = 1, +} lv_draw_sdl_cache_flag_t; + +typedef struct { + lv_sdl_cache_key_magic_t magic; + lv_img_src_t type; + int32_t frame_id; +} lv_draw_sdl_cache_key_head_img_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_sdl_texture_cache_init(lv_draw_sdl_ctx_t * ctx); + +void lv_draw_sdl_texture_cache_deinit(lv_draw_sdl_ctx_t * ctx); + +/** + * Find cached texture by key. The texture can be destroyed during usage. + */ +SDL_Texture * lv_draw_sdl_texture_cache_get(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, bool * found); + +SDL_Texture * lv_draw_sdl_texture_cache_get_with_userdata(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, + bool * found, void ** userdata); + +void lv_draw_sdl_texture_cache_put(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, SDL_Texture * texture); + +void lv_draw_sdl_texture_cache_put_advanced(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, + SDL_Texture * texture, void * userdata, void userdata_free(void *), + lv_draw_sdl_cache_flag_t flags); + +lv_draw_sdl_cache_key_head_img_t * lv_draw_sdl_texture_img_key_create(const void * src, int32_t frame_id, + size_t * size); + +/********************** + * MACROS + **********************/ +#endif /*LV_USE_GPU_SDL*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SDL_TEXTURE_CACHE_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_utils.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_utils.c new file mode 100644 index 0000000..3ca0fad --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_utils.c @@ -0,0 +1,183 @@ +/** + * @file lv_draw_sdl_utils.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_GPU_SDL + +#include "lv_draw_sdl_utils.h" + +#include "../lv_draw.h" +#include "../lv_draw_label.h" +#include "../../core/lv_refr.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +/********************** + * STATIC VARIABLES + **********************/ +extern const uint8_t _lv_bpp1_opa_table[2]; +extern const uint8_t _lv_bpp2_opa_table[4]; +extern const uint8_t _lv_bpp4_opa_table[16]; +extern const uint8_t _lv_bpp8_opa_table[256]; + +static int utils_init_count = 0; +static SDL_Palette * lv_sdl_palette_grayscale8 = NULL; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void _lv_draw_sdl_utils_init() +{ + utils_init_count++; + if(utils_init_count > 1) { + return; + } + lv_sdl_palette_grayscale8 = lv_sdl_alloc_palette_for_bpp(_lv_bpp8_opa_table, 8); +} + +void _lv_draw_sdl_utils_deinit() +{ + if(utils_init_count == 0) { + return; + } + utils_init_count--; + if(utils_init_count == 0) { + SDL_FreePalette(lv_sdl_palette_grayscale8); + lv_sdl_palette_grayscale8 = NULL; + } +} + +void lv_area_to_sdl_rect(const lv_area_t * in, SDL_Rect * out) +{ + out->x = in->x1; + out->y = in->y1; + out->w = in->x2 - in->x1 + 1; + out->h = in->y2 - in->y1 + 1; +} + +void lv_color_to_sdl_color(const lv_color_t * in, SDL_Color * out) +{ +#if LV_COLOR_DEPTH == 32 + out->a = in->ch.alpha; + out->r = in->ch.red; + out->g = in->ch.green; + out->b = in->ch.blue; +#else + uint32_t color32 = lv_color_to32(*in); + lv_color32_t * color32_t = (lv_color32_t *) &color32; + out->a = color32_t->ch.alpha; + out->r = color32_t->ch.red; + out->g = color32_t->ch.green; + out->b = color32_t->ch.blue; +#endif +} + +void lv_area_zoom_to_sdl_rect(const lv_area_t * in, SDL_Rect * out, uint16_t zoom, const lv_point_t * pivot) +{ + if(zoom == LV_IMG_ZOOM_NONE) { + lv_area_to_sdl_rect(in, out); + return; + } + lv_area_t tmp; + _lv_img_buf_get_transformed_area(&tmp, lv_area_get_width(in), lv_area_get_height(in), 0, zoom, pivot); + lv_area_move(&tmp, in->x1, in->y1); + lv_area_to_sdl_rect(&tmp, out); +} + +SDL_Palette * lv_sdl_alloc_palette_for_bpp(const uint8_t * mapping, uint8_t bpp) +{ + SDL_assert(bpp >= 1 && bpp <= 8); + int color_cnt = 1 << bpp; + SDL_Palette * result = SDL_AllocPalette(color_cnt); + SDL_Color palette[256]; + for(int i = 0; i < color_cnt; i++) { + palette[i].r = palette[i].g = palette[i].b = 0xFF; + palette[i].a = mapping ? mapping[i] : i; + } + SDL_SetPaletteColors(result, palette, 0, color_cnt); + return result; +} + +SDL_Surface * lv_sdl_create_opa_surface(lv_opa_t * opa, lv_coord_t width, lv_coord_t height, lv_coord_t stride) +{ + SDL_Surface * indexed = SDL_CreateRGBSurfaceFrom(opa, width, height, 8, stride, 0, 0, 0, 0); + SDL_SetSurfacePalette(indexed, lv_sdl_palette_grayscale8); + SDL_Surface * converted = SDL_ConvertSurfaceFormat(indexed, LV_DRAW_SDL_TEXTURE_FORMAT, 0); + SDL_FreeSurface(indexed); + return converted; +} + +SDL_Texture * lv_sdl_create_opa_texture(SDL_Renderer * renderer, lv_opa_t * pixels, lv_coord_t width, + lv_coord_t height, lv_coord_t stride) +{ + SDL_Surface * indexed = lv_sdl_create_opa_surface(pixels, width, height, stride); + SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer, indexed); + SDL_FreeSurface(indexed); + return texture; +} + +void lv_sdl_to_8bpp(uint8_t * dest, const uint8_t * src, int width, int height, int stride, uint8_t bpp) +{ + int src_len = width * height; + int cur = 0; + int curbit; + uint8_t opa_mask; + const uint8_t * opa_table; + switch(bpp) { + case 1: + opa_mask = 0x1; + opa_table = _lv_bpp1_opa_table; + break; + case 2: + opa_mask = 0x4; + opa_table = _lv_bpp2_opa_table; + break; + case 4: + opa_mask = 0xF; + opa_table = _lv_bpp4_opa_table; + break; + case 8: + opa_mask = 0xFF; + opa_table = _lv_bpp8_opa_table; + break; + default: + return; + } + /* Does this work well on big endian systems? */ + while(cur < src_len) { + curbit = 8 - bpp; + uint8_t src_byte = src[cur * bpp / 8]; + while(curbit >= 0 && cur < src_len) { + uint8_t src_bits = opa_mask & (src_byte >> curbit); + dest[(cur / width * stride) + (cur % width)] = opa_table[src_bits]; + curbit -= bpp; + cur++; + } + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_GPU_SDL*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_utils.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_utils.h new file mode 100644 index 0000000..9afae68 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sdl/lv_draw_sdl_utils.h @@ -0,0 +1,65 @@ +/** + * @file lv_draw_sdl_utils.h + * + */ +#ifndef LV_DRAW_SDL_UTILS_H +#define LV_DRAW_SDL_UTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" +#if LV_USE_GPU_SDL + +#include "lv_draw_sdl.h" +#include "../../misc/lv_color.h" +#include "../../misc/lv_area.h" + +#include LV_GPU_SDL_INCLUDE_PATH + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void _lv_draw_sdl_utils_init(); + +void _lv_draw_sdl_utils_deinit(); + +void lv_area_to_sdl_rect(const lv_area_t * in, SDL_Rect * out); + +void lv_color_to_sdl_color(const lv_color_t * in, SDL_Color * out); + +void lv_area_zoom_to_sdl_rect(const lv_area_t * in, SDL_Rect * out, uint16_t zoom, const lv_point_t * pivot); + +SDL_Palette * lv_sdl_alloc_palette_for_bpp(const uint8_t * mapping, uint8_t bpp); + +SDL_Surface * lv_sdl_create_opa_surface(lv_opa_t * opa, lv_coord_t width, lv_coord_t height, lv_coord_t stride); + +SDL_Texture * lv_sdl_create_opa_texture(SDL_Renderer * renderer, lv_opa_t * pixels, lv_coord_t width, + lv_coord_t height, lv_coord_t stride); + +void lv_sdl_to_8bpp(uint8_t * dest, const uint8_t * src, int width, int height, int stride, uint8_t bpp); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GPU_SDL*/ +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SDL_UTILS_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/stm32_dma2d/lv_draw_stm32_dma2d.mk b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/stm32_dma2d/lv_draw_stm32_dma2d.mk new file mode 100644 index 0000000..8ed00b0 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/stm32_dma2d/lv_draw_stm32_dma2d.mk @@ -0,0 +1,6 @@ +CSRCS += lv_gpu_stm32_dma2d.c + +DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/stm32_dma2d +VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/stm32_dma2d + +CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/stm32_dma2d" diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c new file mode 100644 index 0000000..4eb1940 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c @@ -0,0 +1,265 @@ +/** + * @file lv_gpu_stm32_dma2d.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_gpu_stm32_dma2d.h" +#include "../../core/lv_refr.h" + +#if LV_USE_GPU_STM32_DMA2D + +#include LV_GPU_DMA2D_CMSIS_INCLUDE + +/********************* + * DEFINES + *********************/ + +#if LV_COLOR_16_SWAP + // TODO: F7 has red blue swap bit in control register for all layers and output + #error "Can't use DMA2D with LV_COLOR_16_SWAP 1" +#endif + +#if LV_COLOR_DEPTH == 8 + #error "Can't use DMA2D with LV_COLOR_DEPTH == 8" +#endif + +#if LV_COLOR_DEPTH == 16 + #define LV_DMA2D_COLOR_FORMAT LV_DMA2D_RGB565 +#elif LV_COLOR_DEPTH == 32 + #define LV_DMA2D_COLOR_FORMAT LV_DMA2D_ARGB8888 +#else + /*Can't use GPU with other formats*/ +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_draw_stm32_dma2d_blend_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, const lv_area_t * fill_area, + lv_color_t color); + + +static void lv_draw_stm32_dma2d_blend_map(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa); + +static void lv_draw_stm32_dma2d_img_decoded(lv_draw_ctx_t * draw, const lv_draw_img_dsc_t * dsc, + const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t color_format); + + +static void invalidate_cache(void); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Turn on the peripheral and set output color mode, this only needs to be done once + */ +void lv_draw_stm32_dma2d_init(void) +{ + /*Enable DMA2D clock*/ +#if defined(STM32F4) || defined(STM32F7) + RCC->AHB1ENR |= RCC_AHB1ENR_DMA2DEN; +#elif defined(STM32H7) + RCC->AHB3ENR |= RCC_AHB3ENR_DMA2DEN; +#else +# warning "LVGL can't enable the clock of DMA2D" +#endif + + /*Wait for hardware access to complete*/ + __asm volatile("DSB\n"); + + /*Delay after setting peripheral clock*/ + volatile uint32_t temp = RCC->AHB1ENR; + LV_UNUSED(temp); + + /*set output colour mode*/ + DMA2D->OPFCCR = LV_DMA2D_COLOR_FORMAT; +} + + +void lv_draw_stm32_dma2d_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + + lv_draw_sw_init_ctx(drv, draw_ctx); + + lv_draw_stm32_dma2d_ctx_t * dma2d_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx; + + dma2d_draw_ctx->blend = lv_draw_stm32_dma2d_blend; + // dma2d_draw_ctx->base_draw.draw_img_decoded = lv_draw_stm32_dma2d_img_decoded; + dma2d_draw_ctx->base_draw.wait_for_finish = lv_gpu_stm32_dma2d_wait_cb; + dma2d_draw_ctx->base_draw.buffer_copy = lv_draw_stm32_dma2d_buffer_copy; + +} + +void lv_draw_stm32_dma2d_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + LV_UNUSED(drv); + LV_UNUSED(draw_ctx); +} + + +void lv_draw_stm32_dma2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) +{ + lv_area_t blend_area; + if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) return; + + bool done = false; + + if(dsc->mask_buf == NULL && dsc->blend_mode == LV_BLEND_MODE_NORMAL && lv_area_get_size(&blend_area) > 100) { + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + + lv_color_t * dest_buf = draw_ctx->buf; + dest_buf += dest_stride * (blend_area.y1 - draw_ctx->buf_area->y1) + (blend_area.x1 - draw_ctx->buf_area->x1); + + const lv_color_t * src_buf = dsc->src_buf; + if(src_buf) { + lv_draw_sw_blend_basic(draw_ctx, dsc); + lv_coord_t src_stride; + src_stride = lv_area_get_width(dsc->blend_area); + src_buf += src_stride * (blend_area.y1 - dsc->blend_area->y1) + (blend_area.x1 - dsc->blend_area->x1); + lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + lv_draw_stm32_dma2d_blend_map(dest_buf, &blend_area, dest_stride, src_buf, src_stride, dsc->opa); + done = true; + } + else if(dsc->opa >= LV_OPA_MAX) { + lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + lv_draw_stm32_dma2d_blend_fill(dest_buf, dest_stride, &blend_area, dsc->color); + done = true; + } + } + + if(!done) lv_draw_sw_blend_basic(draw_ctx, dsc); +} + +void lv_draw_stm32_dma2d_buffer_copy(lv_draw_ctx_t * draw_ctx, + void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, + void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area) +{ + LV_UNUSED(draw_ctx); + lv_draw_stm32_dma2d_blend_map(dest_buf, dest_area, dest_stride, src_buf, src_stride, LV_OPA_MAX); +} + + +static void lv_draw_stm32_dma2d_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, + const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t color_format) +{ + /*TODO basic ARGB8888 image can be handles here*/ + + lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, color_format); +} + +static void lv_draw_stm32_dma2d_blend_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, const lv_area_t * fill_area, + lv_color_t color) +{ + /*Simply fill an area*/ + int32_t area_w = lv_area_get_width(fill_area); + int32_t area_h = lv_area_get_height(fill_area); + invalidate_cache(); + + DMA2D->CR = 0x30000; + DMA2D->OMAR = (uint32_t)dest_buf; + /*as input color mode is same as output we don't need to convert here do we?*/ + DMA2D->OCOLR = color.full; + DMA2D->OOR = dest_stride - area_w; + DMA2D->NLR = (area_w << DMA2D_NLR_PL_Pos) | (area_h << DMA2D_NLR_NL_Pos); + + /*start transfer*/ + DMA2D->CR |= DMA2D_CR_START_Msk; + +} + + +static void lv_draw_stm32_dma2d_blend_map(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa) +{ + + /*Simple copy*/ + int32_t dest_w = lv_area_get_width(dest_area); + int32_t dest_h = lv_area_get_height(dest_area); + + invalidate_cache(); + if(opa >= LV_OPA_MAX) { + DMA2D->CR = 0; + /*copy output colour mode, this register controls both input and output colour format*/ + DMA2D->FGPFCCR = LV_DMA2D_COLOR_FORMAT; + DMA2D->FGMAR = (uint32_t)src_buf; + DMA2D->FGOR = src_stride - dest_w; + DMA2D->OMAR = (uint32_t)dest_buf; + DMA2D->OOR = dest_stride - dest_w; + DMA2D->NLR = (dest_w << DMA2D_NLR_PL_Pos) | (dest_h << DMA2D_NLR_NL_Pos); + + /*start transfer*/ + DMA2D->CR |= DMA2D_CR_START_Msk; + } + else { + DMA2D->CR = 0x20000; + + DMA2D->BGPFCCR = LV_DMA2D_COLOR_FORMAT; + DMA2D->BGMAR = (uint32_t)dest_buf; + DMA2D->BGOR = dest_stride - dest_w; + + DMA2D->FGPFCCR = (uint32_t)LV_DMA2D_COLOR_FORMAT + /*alpha mode 2, replace with foreground * alpha value*/ + | (2 << DMA2D_FGPFCCR_AM_Pos) + /*alpha value*/ + | (opa << DMA2D_FGPFCCR_ALPHA_Pos); + DMA2D->FGMAR = (uint32_t)src_buf; + DMA2D->FGOR = src_stride - dest_w; + + DMA2D->OMAR = (uint32_t)dest_buf; + DMA2D->OOR = dest_stride - dest_w; + DMA2D->NLR = (dest_w << DMA2D_NLR_PL_Pos) | (dest_h << DMA2D_NLR_NL_Pos); + + /*start transfer*/ + DMA2D->CR |= DMA2D_CR_START_Msk; + } +} + +void lv_gpu_stm32_dma2d_wait_cb(lv_draw_ctx_t * draw_ctx) +{ + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + if(disp->driver && disp->driver->wait_cb) { + while(DMA2D->CR & DMA2D_CR_START_Msk) { + disp->driver->wait_cb(disp->driver); + } + } + else { + while(DMA2D->CR & DMA2D_CR_START_Msk); + } + lv_draw_sw_wait_for_finish(draw_ctx); + +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void invalidate_cache(void) +{ + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + if(disp->driver->clean_dcache_cb) disp->driver->clean_dcache_cb(disp->driver); + else { +#if __CORTEX_M >= 0x07 + if((SCB->CCR) & (uint32_t)SCB_CCR_DC_Msk) + SCB_CleanInvalidateDCache(); +#endif + } +} + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h new file mode 100644 index 0000000..fa7070e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h @@ -0,0 +1,70 @@ +/** + * @file lv_gpu_stm32_dma2d.h + * + */ + +#ifndef LV_GPU_STM32_DMA2D_H +#define LV_GPU_STM32_DMA2D_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../misc/lv_color.h" +#include "../../hal/lv_hal_disp.h" +#include "../sw/lv_draw_sw.h" + +#if LV_USE_GPU_STM32_DMA2D + +/********************* + * DEFINES + *********************/ + +#define LV_DMA2D_ARGB8888 0 +#define LV_DMA2D_RGB888 1 +#define LV_DMA2D_RGB565 2 +#define LV_DMA2D_ARGB1555 3 +#define LV_DMA2D_ARGB4444 4 + +/********************** + * TYPEDEFS + **********************/ +typedef lv_draw_sw_ctx_t lv_draw_stm32_dma2d_ctx_t; + +struct _lv_disp_drv_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Turn on the peripheral and set output color mode, this only needs to be done once + */ +void lv_draw_stm32_dma2d_init(void); + +void lv_draw_stm32_dma2d_ctx_init(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); + +void lv_draw_stm32_dma2d_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); + +void lv_draw_stm32_dma2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); + +void lv_draw_stm32_dma2d_buffer_copy(lv_draw_ctx_t * draw_ctx, + void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, + void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area); + +void lv_gpu_stm32_dma2d_wait_cb(lv_draw_ctx_t * draw_ctx); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GPU_STM32_DMA2D*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GPU_STM32_DMA2D_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw.c new file mode 100644 index 0000000..1c0c6d4 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw.c @@ -0,0 +1,108 @@ +/** + * @file lv_draw_sw.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw.h" +#include "lv_draw_sw.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_init_ctx(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + LV_UNUSED(drv); + + lv_draw_sw_ctx_t * draw_sw_ctx = (lv_draw_sw_ctx_t *) draw_ctx; + lv_memset_00(draw_sw_ctx, sizeof(lv_draw_sw_ctx_t)); + + draw_sw_ctx->base_draw.draw_arc = lv_draw_sw_arc; + draw_sw_ctx->base_draw.draw_rect = lv_draw_sw_rect; + draw_sw_ctx->base_draw.draw_bg = lv_draw_sw_bg; + draw_sw_ctx->base_draw.draw_letter = lv_draw_sw_letter; + draw_sw_ctx->base_draw.draw_img_decoded = lv_draw_sw_img_decoded; + draw_sw_ctx->base_draw.draw_line = lv_draw_sw_line; + draw_sw_ctx->base_draw.draw_polygon = lv_draw_sw_polygon; +#if LV_DRAW_COMPLEX + draw_sw_ctx->base_draw.draw_transform = lv_draw_sw_transform; +#endif + draw_sw_ctx->base_draw.wait_for_finish = lv_draw_sw_wait_for_finish; + draw_sw_ctx->base_draw.buffer_copy = lv_draw_sw_buffer_copy; + draw_sw_ctx->base_draw.layer_init = lv_draw_sw_layer_create; + draw_sw_ctx->base_draw.layer_adjust = lv_draw_sw_layer_adjust; + draw_sw_ctx->base_draw.layer_blend = lv_draw_sw_layer_blend; + draw_sw_ctx->base_draw.layer_destroy = lv_draw_sw_layer_destroy; + draw_sw_ctx->blend = lv_draw_sw_blend_basic; + draw_ctx->layer_instance_size = sizeof(lv_draw_sw_layer_ctx_t); +} + +void lv_draw_sw_deinit_ctx(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + LV_UNUSED(drv); + + lv_draw_sw_ctx_t * draw_sw_ctx = (lv_draw_sw_ctx_t *) draw_ctx; + lv_memset_00(draw_sw_ctx, sizeof(lv_draw_sw_ctx_t)); +} + +void lv_draw_sw_wait_for_finish(lv_draw_ctx_t * draw_ctx) +{ + LV_UNUSED(draw_ctx); + /*Nothing to wait for*/ +} + +void lv_draw_sw_buffer_copy(lv_draw_ctx_t * draw_ctx, + void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, + void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area) +{ + LV_UNUSED(draw_ctx); + + lv_color_t * dest_bufc = dest_buf; + lv_color_t * src_bufc = src_buf; + + /*Got the first pixel of each buffer*/ + dest_bufc += dest_stride * dest_area->y1; + dest_bufc += dest_area->x1; + + src_bufc += src_stride * src_area->y1; + src_bufc += src_area->x1; + + uint32_t line_length = lv_area_get_width(dest_area) * sizeof(lv_color_t); + lv_coord_t y; + for(y = dest_area->y1; y <= dest_area->y2; y++) { + lv_memcpy(dest_bufc, src_bufc, line_length); + dest_bufc += dest_stride; + src_bufc += src_stride; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw.h new file mode 100644 index 0000000..1618649 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw.h @@ -0,0 +1,104 @@ +/** + * @file lv_draw_sw.h + * + */ + +#ifndef LV_DRAW_SW_H +#define LV_DRAW_SW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_blend.h" +#include "../lv_draw.h" +#include "../../misc/lv_area.h" +#include "../../misc/lv_color.h" +#include "../../hal/lv_hal_disp.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_disp_drv_t; + +typedef struct { + lv_draw_ctx_t base_draw; + + /** Fill an area of the destination buffer with a color*/ + void (*blend)(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); +} lv_draw_sw_ctx_t; + +typedef struct { + lv_draw_layer_ctx_t base_draw; + + uint32_t buf_size_bytes: 31; + uint32_t has_alpha : 1; +} lv_draw_sw_layer_ctx_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_sw_init_ctx(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); +void lv_draw_sw_deinit_ctx(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); + +void lv_draw_sw_wait_for_finish(lv_draw_ctx_t * draw_ctx); + +void lv_draw_sw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, uint16_t radius, + uint16_t start_angle, uint16_t end_angle); + +void lv_draw_sw_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); + +void lv_draw_sw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); +void lv_draw_sw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, + uint32_t letter); + +LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_img_decoded(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * draw_dsc, + const lv_area_t * coords, const uint8_t * src_buf, lv_img_cf_t cf); + +LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, + const lv_point_t * point1, const lv_point_t * point2); + +void lv_draw_sw_polygon(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * draw_dsc, + const lv_point_t * points, uint16_t point_cnt); + +void lv_draw_sw_buffer_copy(lv_draw_ctx_t * draw_ctx, + void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, + void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area); + +void lv_draw_sw_transform(lv_draw_ctx_t * draw_ctx, const lv_area_t * dest_area, const void * src_buf, + lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride, + const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t cf, lv_color_t * cbuf, lv_opa_t * abuf); + +struct _lv_draw_layer_ctx_t * lv_draw_sw_layer_create(struct _lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx, + lv_draw_layer_flags_t flags); + +void lv_draw_sw_layer_adjust(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx, + lv_draw_layer_flags_t flags); + +void lv_draw_sw_layer_blend(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx, + const lv_draw_img_dsc_t * draw_dsc); + +void lv_draw_sw_layer_destroy(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx); + +/*********************** + * GLOBAL VARIABLES + ***********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw.mk b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw.mk new file mode 100644 index 0000000..4625cbc --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw.mk @@ -0,0 +1,17 @@ +CSRCS += lv_draw_sw.c +CSRCS += lv_draw_sw_arc.c +CSRCS += lv_draw_sw_blend.c +CSRCS += lv_draw_sw_dither.c +CSRCS += lv_draw_sw_gradient.c +CSRCS += lv_draw_sw_img.c +CSRCS += lv_draw_sw_letter.c +CSRCS += lv_draw_sw_line.c +CSRCS += lv_draw_sw_polygon.c +CSRCS += lv_draw_sw_rect.c +CSRCS += lv_draw_sw_transform.c +CSRCS += lv_draw_sw_layer.c + +DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/sw +VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/sw + +CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/sw" diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_arc.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_arc.c new file mode 100644 index 0000000..3ed62b6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_arc.c @@ -0,0 +1,537 @@ +/** + * @file lv_draw_arc.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_log.h" +#include "../../misc/lv_mem.h" +#include "../lv_draw.h" + +/********************* + * DEFINES + *********************/ +#define SPLIT_RADIUS_LIMIT 10 /*With radius greater than this the arc will drawn in quarters. A quarter is drawn only if there is arc in it*/ +#define SPLIT_ANGLE_GAP_LIMIT 60 /*With small gaps in the arc don't bother with splitting because there is nothing to skip.*/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + const lv_point_t * center; + lv_coord_t radius; + uint16_t start_angle; + uint16_t end_angle; + uint16_t start_quarter; + uint16_t end_quarter; + lv_coord_t width; + lv_draw_rect_dsc_t * draw_dsc; + const lv_area_t * draw_area; + lv_draw_ctx_t * draw_ctx; +} quarter_draw_dsc_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +#if LV_DRAW_COMPLEX + static void draw_quarter_0(quarter_draw_dsc_t * q); + static void draw_quarter_1(quarter_draw_dsc_t * q); + static void draw_quarter_2(quarter_draw_dsc_t * q); + static void draw_quarter_3(quarter_draw_dsc_t * q); + static void get_rounded_area(int16_t angle, lv_coord_t radius, uint8_t thickness, lv_area_t * res_area); +#endif /*LV_DRAW_COMPLEX*/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, uint16_t radius, + uint16_t start_angle, uint16_t end_angle) +{ +#if LV_DRAW_COMPLEX + if(dsc->opa <= LV_OPA_MIN) return; + if(dsc->width == 0) return; + if(start_angle == end_angle) return; + + lv_coord_t width = dsc->width; + if(width > radius) width = radius; + + lv_draw_rect_dsc_t cir_dsc; + lv_draw_rect_dsc_init(&cir_dsc); + cir_dsc.blend_mode = dsc->blend_mode; + if(dsc->img_src) { + cir_dsc.bg_opa = LV_OPA_TRANSP; + cir_dsc.bg_img_src = dsc->img_src; + cir_dsc.bg_img_opa = dsc->opa; + } + else { + cir_dsc.bg_opa = dsc->opa; + cir_dsc.bg_color = dsc->color; + } + + lv_area_t area_out; + area_out.x1 = center->x - radius; + area_out.y1 = center->y - radius; + area_out.x2 = center->x + radius - 1; /*-1 because the center already belongs to the left/bottom part*/ + area_out.y2 = center->y + radius - 1; + + lv_area_t area_in; + lv_area_copy(&area_in, &area_out); + area_in.x1 += dsc->width; + area_in.y1 += dsc->width; + area_in.x2 -= dsc->width; + area_in.y2 -= dsc->width; + + /*Create inner the mask*/ + int16_t mask_in_id = LV_MASK_ID_INV; + lv_draw_mask_radius_param_t mask_in_param; + bool mask_in_param_valid = false; + if(lv_area_get_width(&area_in) > 0 && lv_area_get_height(&area_in) > 0) { + lv_draw_mask_radius_init(&mask_in_param, &area_in, LV_RADIUS_CIRCLE, true); + mask_in_param_valid = true; + mask_in_id = lv_draw_mask_add(&mask_in_param, NULL); + } + + lv_draw_mask_radius_param_t mask_out_param; + lv_draw_mask_radius_init(&mask_out_param, &area_out, LV_RADIUS_CIRCLE, false); + int16_t mask_out_id = lv_draw_mask_add(&mask_out_param, NULL); + + /*Draw a full ring*/ + if(start_angle + 360 == end_angle || start_angle == end_angle + 360) { + cir_dsc.radius = LV_RADIUS_CIRCLE; + lv_draw_rect(draw_ctx, &cir_dsc, &area_out); + + lv_draw_mask_remove_id(mask_out_id); + if(mask_in_id != LV_MASK_ID_INV) lv_draw_mask_remove_id(mask_in_id); + + lv_draw_mask_free_param(&mask_out_param); + if(mask_in_param_valid) { + lv_draw_mask_free_param(&mask_in_param); + } + + return; + } + + while(start_angle >= 360) start_angle -= 360; + while(end_angle >= 360) end_angle -= 360; + + lv_draw_mask_angle_param_t mask_angle_param; + lv_draw_mask_angle_init(&mask_angle_param, center->x, center->y, start_angle, end_angle); + int16_t mask_angle_id = lv_draw_mask_add(&mask_angle_param, NULL); + + int32_t angle_gap; + if(end_angle > start_angle) { + angle_gap = 360 - (end_angle - start_angle); + } + else { + angle_gap = start_angle - end_angle; + } + + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + + if(angle_gap > SPLIT_ANGLE_GAP_LIMIT && radius > SPLIT_RADIUS_LIMIT) { + /*Handle each quarter individually and skip which is empty*/ + quarter_draw_dsc_t q_dsc; + q_dsc.center = center; + q_dsc.radius = radius; + q_dsc.start_angle = start_angle; + q_dsc.end_angle = end_angle; + q_dsc.start_quarter = (start_angle / 90) & 0x3; + q_dsc.end_quarter = (end_angle / 90) & 0x3; + q_dsc.width = width; + q_dsc.draw_dsc = &cir_dsc; + q_dsc.draw_area = &area_out; + q_dsc.draw_ctx = draw_ctx; + + draw_quarter_0(&q_dsc); + draw_quarter_1(&q_dsc); + draw_quarter_2(&q_dsc); + draw_quarter_3(&q_dsc); + } + else { + lv_draw_rect(draw_ctx, &cir_dsc, &area_out); + } + + lv_draw_mask_free_param(&mask_angle_param); + lv_draw_mask_free_param(&mask_out_param); + if(mask_in_param_valid) { + lv_draw_mask_free_param(&mask_in_param); + } + + lv_draw_mask_remove_id(mask_angle_id); + lv_draw_mask_remove_id(mask_out_id); + if(mask_in_id != LV_MASK_ID_INV) lv_draw_mask_remove_id(mask_in_id); + + if(dsc->rounded) { + + lv_draw_mask_radius_param_t mask_end_param; + + lv_area_t round_area; + get_rounded_area(start_angle, radius, width, &round_area); + round_area.x1 += center->x; + round_area.x2 += center->x; + round_area.y1 += center->y; + round_area.y2 += center->y; + lv_area_t clip_area2; + if(_lv_area_intersect(&clip_area2, clip_area_ori, &round_area)) { + lv_draw_mask_radius_init(&mask_end_param, &round_area, LV_RADIUS_CIRCLE, false); + int16_t mask_end_id = lv_draw_mask_add(&mask_end_param, NULL); + + draw_ctx->clip_area = &clip_area2; + lv_draw_rect(draw_ctx, &cir_dsc, &area_out); + lv_draw_mask_remove_id(mask_end_id); + lv_draw_mask_free_param(&mask_end_param); + } + + get_rounded_area(end_angle, radius, width, &round_area); + round_area.x1 += center->x; + round_area.x2 += center->x; + round_area.y1 += center->y; + round_area.y2 += center->y; + if(_lv_area_intersect(&clip_area2, clip_area_ori, &round_area)) { + lv_draw_mask_radius_init(&mask_end_param, &round_area, LV_RADIUS_CIRCLE, false); + int16_t mask_end_id = lv_draw_mask_add(&mask_end_param, NULL); + + draw_ctx->clip_area = &clip_area2; + lv_draw_rect(draw_ctx, &cir_dsc, &area_out); + lv_draw_mask_remove_id(mask_end_id); + lv_draw_mask_free_param(&mask_end_param); + } + draw_ctx->clip_area = clip_area_ori; + } +#else + LV_LOG_WARN("Can't draw arc with LV_DRAW_COMPLEX == 0"); + LV_UNUSED(center); + LV_UNUSED(radius); + LV_UNUSED(start_angle); + LV_UNUSED(end_angle); + LV_UNUSED(draw_ctx); + LV_UNUSED(dsc); +#endif /*LV_DRAW_COMPLEX*/ +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#if LV_DRAW_COMPLEX +static void draw_quarter_0(quarter_draw_dsc_t * q) +{ + const lv_area_t * clip_area_ori = q->draw_ctx->clip_area; + lv_area_t quarter_area; + + if(q->start_quarter == 0 && q->end_quarter == 0 && q->start_angle < q->end_angle) { + /*Small arc here*/ + quarter_area.y1 = q->center->y + ((lv_trigo_sin(q->start_angle) * (q->radius - q->width)) >> LV_TRIGO_SHIFT); + quarter_area.x2 = q->center->x + ((lv_trigo_sin(q->start_angle + 90) * (q->radius)) >> LV_TRIGO_SHIFT); + + quarter_area.y2 = q->center->y + ((lv_trigo_sin(q->end_angle) * q->radius) >> LV_TRIGO_SHIFT); + quarter_area.x1 = q->center->x + ((lv_trigo_sin(q->end_angle + 90) * (q->radius - q->width)) >> LV_TRIGO_SHIFT); + + bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori); + if(ok) { + q->draw_ctx->clip_area = &quarter_area; + lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area); + } + } + else if(q->start_quarter == 0 || q->end_quarter == 0) { + /*Start and/or end arcs here*/ + if(q->start_quarter == 0) { + quarter_area.x1 = q->center->x; + quarter_area.y2 = q->center->y + q->radius; + + quarter_area.y1 = q->center->y + ((lv_trigo_sin(q->start_angle) * (q->radius - q->width)) >> LV_TRIGO_SHIFT); + quarter_area.x2 = q->center->x + ((lv_trigo_sin(q->start_angle + 90) * (q->radius)) >> LV_TRIGO_SHIFT); + + bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori); + if(ok) { + q->draw_ctx->clip_area = &quarter_area; + lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area); + } + } + if(q->end_quarter == 0) { + quarter_area.x2 = q->center->x + q->radius; + quarter_area.y1 = q->center->y; + + quarter_area.y2 = q->center->y + ((lv_trigo_sin(q->end_angle) * q->radius) >> LV_TRIGO_SHIFT); + quarter_area.x1 = q->center->x + ((lv_trigo_sin(q->end_angle + 90) * (q->radius - q->width)) >> LV_TRIGO_SHIFT); + + bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori); + if(ok) { + q->draw_ctx->clip_area = &quarter_area; + lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area); + } + } + } + else if((q->start_quarter == q->end_quarter && q->start_quarter != 0 && q->end_angle < q->start_angle) || + (q->start_quarter == 2 && q->end_quarter == 1) || + (q->start_quarter == 3 && q->end_quarter == 2) || + (q->start_quarter == 3 && q->end_quarter == 1)) { + /*Arc crosses here*/ + quarter_area.x1 = q->center->x; + quarter_area.y1 = q->center->y; + quarter_area.x2 = q->center->x + q->radius; + quarter_area.y2 = q->center->y + q->radius; + + bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori); + if(ok) { + q->draw_ctx->clip_area = &quarter_area; + lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area); + } + } + q->draw_ctx->clip_area = clip_area_ori; +} + +static void draw_quarter_1(quarter_draw_dsc_t * q) +{ + const lv_area_t * clip_area_ori = q->draw_ctx->clip_area; + lv_area_t quarter_area; + + if(q->start_quarter == 1 && q->end_quarter == 1 && q->start_angle < q->end_angle) { + /*Small arc here*/ + quarter_area.y2 = q->center->y + ((lv_trigo_sin(q->start_angle) * (q->radius)) >> LV_TRIGO_SHIFT); + quarter_area.x2 = q->center->x + ((lv_trigo_sin(q->start_angle + 90) * (q->radius - q->width)) >> LV_TRIGO_SHIFT); + + quarter_area.y1 = q->center->y + ((lv_trigo_sin(q->end_angle) * (q->radius - q->width)) >> LV_TRIGO_SHIFT); + quarter_area.x1 = q->center->x + ((lv_trigo_sin(q->end_angle + 90) * (q->radius)) >> LV_TRIGO_SHIFT); + + bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori); + if(ok) { + q->draw_ctx->clip_area = &quarter_area; + lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area); + } + } + else if(q->start_quarter == 1 || q->end_quarter == 1) { + /*Start and/or end arcs here*/ + if(q->start_quarter == 1) { + quarter_area.x1 = q->center->x - q->radius; + quarter_area.y1 = q->center->y; + + quarter_area.y2 = q->center->y + ((lv_trigo_sin(q->start_angle) * (q->radius)) >> LV_TRIGO_SHIFT); + quarter_area.x2 = q->center->x + ((lv_trigo_sin(q->start_angle + 90) * (q->radius - q->width)) >> LV_TRIGO_SHIFT); + + bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori); + if(ok) { + q->draw_ctx->clip_area = &quarter_area; + lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area); + } + } + if(q->end_quarter == 1) { + quarter_area.x2 = q->center->x - 1; + quarter_area.y2 = q->center->y + q->radius; + + quarter_area.y1 = q->center->y + ((lv_trigo_sin(q->end_angle) * (q->radius - q->width)) >> LV_TRIGO_SHIFT); + quarter_area.x1 = q->center->x + ((lv_trigo_sin(q->end_angle + 90) * (q->radius)) >> LV_TRIGO_SHIFT); + + bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori); + if(ok) { + q->draw_ctx->clip_area = &quarter_area; + lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area); + } + } + } + else if((q->start_quarter == q->end_quarter && q->start_quarter != 1 && q->end_angle < q->start_angle) || + (q->start_quarter == 0 && q->end_quarter == 2) || + (q->start_quarter == 0 && q->end_quarter == 3) || + (q->start_quarter == 3 && q->end_quarter == 2)) { + /*Arc crosses here*/ + quarter_area.x1 = q->center->x - q->radius; + quarter_area.y1 = q->center->y; + quarter_area.x2 = q->center->x - 1; + quarter_area.y2 = q->center->y + q->radius; + + bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori); + if(ok) { + q->draw_ctx->clip_area = &quarter_area; + lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area); + } + } + q->draw_ctx->clip_area = clip_area_ori; +} + +static void draw_quarter_2(quarter_draw_dsc_t * q) +{ + const lv_area_t * clip_area_ori = q->draw_ctx->clip_area; + lv_area_t quarter_area; + + if(q->start_quarter == 2 && q->end_quarter == 2 && q->start_angle < q->end_angle) { + /*Small arc here*/ + quarter_area.x1 = q->center->x + ((lv_trigo_sin(q->start_angle + 90) * (q->radius)) >> LV_TRIGO_SHIFT); + quarter_area.y2 = q->center->y + ((lv_trigo_sin(q->start_angle) * (q->radius - q->width)) >> LV_TRIGO_SHIFT); + + quarter_area.y1 = q->center->y + ((lv_trigo_sin(q->end_angle) * q->radius) >> LV_TRIGO_SHIFT); + quarter_area.x2 = q->center->x + ((lv_trigo_sin(q->end_angle + 90) * (q->radius - q->width)) >> LV_TRIGO_SHIFT); + + bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori); + if(ok) { + q->draw_ctx->clip_area = &quarter_area; + lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area); + } + } + else if(q->start_quarter == 2 || q->end_quarter == 2) { + /*Start and/or end arcs here*/ + if(q->start_quarter == 2) { + quarter_area.x2 = q->center->x - 1; + quarter_area.y1 = q->center->y - q->radius; + + quarter_area.x1 = q->center->x + ((lv_trigo_sin(q->start_angle + 90) * (q->radius)) >> LV_TRIGO_SHIFT); + quarter_area.y2 = q->center->y + ((lv_trigo_sin(q->start_angle) * (q->radius - q->width)) >> LV_TRIGO_SHIFT); + + bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori); + if(ok) { + q->draw_ctx->clip_area = &quarter_area; + lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area); + } + } + if(q->end_quarter == 2) { + quarter_area.x1 = q->center->x - q->radius; + quarter_area.y2 = q->center->y - 1; + + quarter_area.x2 = q->center->x + ((lv_trigo_sin(q->end_angle + 90) * (q->radius - q->width)) >> LV_TRIGO_SHIFT); + quarter_area.y1 = q->center->y + ((lv_trigo_sin(q->end_angle) * (q->radius)) >> LV_TRIGO_SHIFT); + + bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori); + if(ok) { + q->draw_ctx->clip_area = &quarter_area; + lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area); + } + } + } + else if((q->start_quarter == q->end_quarter && q->start_quarter != 2 && q->end_angle < q->start_angle) || + (q->start_quarter == 0 && q->end_quarter == 3) || + (q->start_quarter == 1 && q->end_quarter == 3) || + (q->start_quarter == 1 && q->end_quarter == 0)) { + /*Arc crosses here*/ + quarter_area.x1 = q->center->x - q->radius; + quarter_area.y1 = q->center->y - q->radius; + quarter_area.x2 = q->center->x - 1; + quarter_area.y2 = q->center->y - 1; + + bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori); + if(ok) { + q->draw_ctx->clip_area = &quarter_area; + lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area); + } + } + q->draw_ctx->clip_area = clip_area_ori; +} + +static void draw_quarter_3(quarter_draw_dsc_t * q) +{ + const lv_area_t * clip_area_ori = q->draw_ctx->clip_area; + lv_area_t quarter_area; + + if(q->start_quarter == 3 && q->end_quarter == 3 && q->start_angle < q->end_angle) { + /*Small arc here*/ + quarter_area.x1 = q->center->x + ((lv_trigo_sin(q->start_angle + 90) * (q->radius - q->width)) >> LV_TRIGO_SHIFT); + quarter_area.y1 = q->center->y + ((lv_trigo_sin(q->start_angle) * (q->radius)) >> LV_TRIGO_SHIFT); + + quarter_area.x2 = q->center->x + ((lv_trigo_sin(q->end_angle + 90) * (q->radius)) >> LV_TRIGO_SHIFT); + quarter_area.y2 = q->center->y + ((lv_trigo_sin(q->end_angle) * (q->radius - q->width)) >> LV_TRIGO_SHIFT); + + bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori); + if(ok) { + q->draw_ctx->clip_area = &quarter_area; + lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area); + } + } + else if(q->start_quarter == 3 || q->end_quarter == 3) { + /*Start and/or end arcs here*/ + if(q->start_quarter == 3) { + quarter_area.x2 = q->center->x + q->radius; + quarter_area.y2 = q->center->y - 1; + + quarter_area.x1 = q->center->x + ((lv_trigo_sin(q->start_angle + 90) * (q->radius - q->width)) >> LV_TRIGO_SHIFT); + quarter_area.y1 = q->center->y + ((lv_trigo_sin(q->start_angle) * (q->radius)) >> LV_TRIGO_SHIFT); + + bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori); + if(ok) { + q->draw_ctx->clip_area = &quarter_area; + lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area); + } + } + if(q->end_quarter == 3) { + quarter_area.x1 = q->center->x; + quarter_area.y1 = q->center->y - q->radius; + + quarter_area.x2 = q->center->x + ((lv_trigo_sin(q->end_angle + 90) * (q->radius)) >> LV_TRIGO_SHIFT); + quarter_area.y2 = q->center->y + ((lv_trigo_sin(q->end_angle) * (q->radius - q->width)) >> LV_TRIGO_SHIFT); + + bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori); + if(ok) { + q->draw_ctx->clip_area = &quarter_area; + lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area); + } + } + } + else if((q->start_quarter == q->end_quarter && q->start_quarter != 3 && q->end_angle < q->start_angle) || + (q->start_quarter == 2 && q->end_quarter == 0) || + (q->start_quarter == 1 && q->end_quarter == 0) || + (q->start_quarter == 2 && q->end_quarter == 1)) { + /*Arc crosses here*/ + quarter_area.x1 = q->center->x; + quarter_area.y1 = q->center->y - q->radius; + quarter_area.x2 = q->center->x + q->radius; + quarter_area.y2 = q->center->y - 1; + + bool ok = _lv_area_intersect(&quarter_area, &quarter_area, clip_area_ori); + if(ok) { + q->draw_ctx->clip_area = &quarter_area; + lv_draw_rect(q->draw_ctx, q->draw_dsc, q->draw_area); + } + } + + q->draw_ctx->clip_area = clip_area_ori; +} + +static void get_rounded_area(int16_t angle, lv_coord_t radius, uint8_t thickness, lv_area_t * res_area) +{ + const uint8_t ps = 8; + const uint8_t pa = 127; + + int32_t thick_half = thickness / 2; + uint8_t thick_corr = (thickness & 0x01) ? 0 : 1; + + int32_t cir_x; + int32_t cir_y; + + cir_x = ((radius - thick_half) * lv_trigo_sin(90 - angle)) >> (LV_TRIGO_SHIFT - ps); + cir_y = ((radius - thick_half) * lv_trigo_sin(angle)) >> (LV_TRIGO_SHIFT - ps); + + /*Actually the center of the pixel need to be calculated so apply 1/2 px offset*/ + if(cir_x > 0) { + cir_x = (cir_x - pa) >> ps; + res_area->x1 = cir_x - thick_half + thick_corr; + res_area->x2 = cir_x + thick_half; + } + else { + cir_x = (cir_x + pa) >> ps; + res_area->x1 = cir_x - thick_half; + res_area->x2 = cir_x + thick_half - thick_corr; + } + + if(cir_y > 0) { + cir_y = (cir_y - pa) >> ps; + res_area->y1 = cir_y - thick_half + thick_corr; + res_area->y2 = cir_y + thick_half; + } + else { + cir_y = (cir_y + pa) >> ps; + res_area->y1 = cir_y - thick_half; + res_area->y2 = cir_y + thick_half - thick_corr; + } +} + +#endif /*LV_DRAW_COMPLEX*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_blend.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_blend.c new file mode 100644 index 0000000..428aba6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_blend.c @@ -0,0 +1,1039 @@ +/** + * @file lv_draw_sw_blend.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw.h" +#include "../../misc/lv_math.h" +#include "../../hal/lv_hal_disp.h" +#include "../../core/lv_refr.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void fill_set_px(lv_color_t * dest_buf, const lv_area_t * blend_area, lv_coord_t dest_stride, + lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stide); + +LV_ATTRIBUTE_FAST_MEM static void fill_normal(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride); + + +#if LV_COLOR_SCREEN_TRANSP +LV_ATTRIBUTE_FAST_MEM static void fill_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride); +#endif /*LV_COLOR_SCREEN_TRANSP*/ + +#if LV_DRAW_COMPLEX +static void fill_blended(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, lv_color_t color, + lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride, lv_blend_mode_t blend_mode); +#endif /*LV_DRAW_COMPLEX*/ + +static void map_set_px(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride); + +LV_ATTRIBUTE_FAST_MEM static void map_normal(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride); + +#if LV_COLOR_SCREEN_TRANSP +LV_ATTRIBUTE_FAST_MEM static void map_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, + const lv_opa_t * mask, lv_coord_t mask_stride, lv_blend_mode_t blend_mode); + +#endif /*LV_COLOR_SCREEN_TRANSP*/ + +#if LV_DRAW_COMPLEX +static void map_blended(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, + const lv_opa_t * mask, lv_coord_t mask_stride, lv_blend_mode_t blend_mode); + +static inline lv_color_t color_blend_true_color_additive(lv_color_t fg, lv_color_t bg, lv_opa_t opa); +static inline lv_color_t color_blend_true_color_subtractive(lv_color_t fg, lv_color_t bg, lv_opa_t opa); +static inline lv_color_t color_blend_true_color_multiply(lv_color_t fg, lv_color_t bg, lv_opa_t opa); +#endif /*LV_DRAW_COMPLEX*/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#define FILL_NORMAL_MASK_PX(color) \ + if(*mask == LV_OPA_COVER) *dest_buf = color; \ + else *dest_buf = lv_color_mix(color, *dest_buf, *mask); \ + mask++; \ + dest_buf++; + +#define MAP_NORMAL_MASK_PX(x) \ + if(*mask_tmp_x) { \ + if(*mask_tmp_x == LV_OPA_COVER) dest_buf[x] = src_buf[x]; \ + else dest_buf[x] = lv_color_mix(src_buf[x], dest_buf[x], *mask_tmp_x); \ + } \ + mask_tmp_x++; + + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) +{ + /*Do not draw transparent things*/ + if(dsc->opa <= LV_OPA_MIN) return; + + lv_area_t blend_area; + if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) return; + + if(draw_ctx->wait_for_finish) draw_ctx->wait_for_finish(draw_ctx); + + ((lv_draw_sw_ctx_t *)draw_ctx)->blend(draw_ctx, dsc); +} + +LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_basic(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) +{ + const lv_opa_t * mask; + if(dsc->mask_buf == NULL) mask = NULL; + if(dsc->mask_buf && dsc->mask_res == LV_DRAW_MASK_RES_TRANSP) return; + else if(dsc->mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask = NULL; + else mask = dsc->mask_buf; + + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + + lv_area_t blend_area; + if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) return; + + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + lv_color_t * dest_buf = draw_ctx->buf; + if(disp->driver->set_px_cb == NULL) { + if(disp->driver->screen_transp == 0) { + dest_buf += dest_stride * (blend_area.y1 - draw_ctx->buf_area->y1) + (blend_area.x1 - draw_ctx->buf_area->x1); + } + else { + /*With LV_COLOR_DEPTH 16 it means ARGB8565 (3 bytes format)*/ + uint8_t * dest_buf8 = (uint8_t *) dest_buf; + dest_buf8 += dest_stride * (blend_area.y1 - draw_ctx->buf_area->y1) * LV_IMG_PX_SIZE_ALPHA_BYTE; + dest_buf8 += (blend_area.x1 - draw_ctx->buf_area->x1) * LV_IMG_PX_SIZE_ALPHA_BYTE; + dest_buf = (lv_color_t *)dest_buf8; + } + } + + + const lv_color_t * src_buf = dsc->src_buf; + lv_coord_t src_stride; + if(src_buf) { + src_stride = lv_area_get_width(dsc->blend_area); + src_buf += src_stride * (blend_area.y1 - dsc->blend_area->y1) + (blend_area.x1 - dsc->blend_area->x1); + } + else { + src_stride = 0; + } + + lv_coord_t mask_stride; + if(mask) { + mask_stride = lv_area_get_width(dsc->mask_area); + mask += mask_stride * (blend_area.y1 - dsc->mask_area->y1) + (blend_area.x1 - dsc->mask_area->x1); + } + else { + mask_stride = 0; + } + + lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + + if(disp->driver->set_px_cb) { + if(dsc->src_buf == NULL) { + fill_set_px(dest_buf, &blend_area, dest_stride, dsc->color, dsc->opa, mask, mask_stride); + } + else { + map_set_px(dest_buf, &blend_area, dest_stride, src_buf, src_stride, dsc->opa, mask, mask_stride); + } + } +#if LV_COLOR_SCREEN_TRANSP + else if(disp->driver->screen_transp) { + if(dsc->src_buf == NULL) { + fill_argb(dest_buf, &blend_area, dest_stride, dsc->color, dsc->opa, mask, mask_stride); + } + else { + map_argb(dest_buf, &blend_area, dest_stride, src_buf, src_stride, dsc->opa, mask, mask_stride, dsc->blend_mode); + } + } +#endif + else if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(dsc->src_buf == NULL) { + fill_normal(dest_buf, &blend_area, dest_stride, dsc->color, dsc->opa, mask, mask_stride); + } + else { + map_normal(dest_buf, &blend_area, dest_stride, src_buf, src_stride, dsc->opa, mask, mask_stride); + } + } + else { +#if LV_DRAW_COMPLEX + if(dsc->src_buf == NULL) { + fill_blended(dest_buf, &blend_area, dest_stride, dsc->color, dsc->opa, mask, mask_stride, dsc->blend_mode); + } + else { + map_blended(dest_buf, &blend_area, dest_stride, src_buf, src_stride, dsc->opa, mask, mask_stride, dsc->blend_mode); + } +#endif + } +} + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void fill_set_px(lv_color_t * dest_buf, const lv_area_t * blend_area, lv_coord_t dest_stride, + lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stide) +{ + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + + int32_t x; + int32_t y; + + if(mask == NULL) { + for(y = blend_area->y1; y <= blend_area->y2; y++) { + for(x = blend_area->x1; x <= blend_area->x2; x++) { + disp->driver->set_px_cb(disp->driver, (void *)dest_buf, dest_stride, x, y, color, opa); + } + } + } + else { + int32_t w = lv_area_get_width(blend_area); + int32_t h = lv_area_get_height(blend_area); + + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + if(mask[x]) { + + + disp->driver->set_px_cb(disp->driver, (void *)dest_buf, dest_stride, blend_area->x1 + x, blend_area->y1 + y, color, + (uint32_t)((uint32_t)opa * mask[x]) >> 8); + } + } + mask += mask_stide; + } + } +} + +LV_ATTRIBUTE_FAST_MEM static void fill_normal(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride) +{ + int32_t w = lv_area_get_width(dest_area); + int32_t h = lv_area_get_height(dest_area); + + int32_t x; + int32_t y; + + /*No mask*/ + if(mask == NULL) { + if(opa >= LV_OPA_MAX) { + for(y = 0; y < h; y++) { + lv_color_fill(dest_buf, color, w); + dest_buf += dest_stride; + } + } + /*Has opacity*/ + else { + lv_color_t last_dest_color = lv_color_black(); + lv_color_t last_res_color = lv_color_mix(color, last_dest_color, opa); + +#if LV_COLOR_MIX_ROUND_OFS == 0 && LV_COLOR_DEPTH == 16 + /*lv_color_mix work with an optimized algorithm with 16 bit color depth. + *However, it introduces some rounded error on opa. + *Introduce the same error here too to make lv_color_premult produces the same result */ + opa = (uint32_t)((uint32_t)opa + 4) >> 3; + opa = opa << 3; +#endif + + uint16_t color_premult[3]; + lv_color_premult(color, opa, color_premult); + lv_opa_t opa_inv = 255 - opa; + + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + if(last_dest_color.full != dest_buf[x].full) { + last_dest_color = dest_buf[x]; + last_res_color = lv_color_mix_premult(color_premult, dest_buf[x], opa_inv); + } + dest_buf[x] = last_res_color; + } + dest_buf += dest_stride; + } + } + } + /*Masked*/ + else { +#if LV_COLOR_DEPTH == 16 + uint32_t c32 = color.full + ((uint32_t)color.full << 16); +#endif + /*Only the mask matters*/ + if(opa >= LV_OPA_MAX) { + int32_t x_end4 = w - 4; + for(y = 0; y < h; y++) { + for(x = 0; x < w && ((lv_uintptr_t)(mask) & 0x3); x++) { + FILL_NORMAL_MASK_PX(color) + } + + for(; x <= x_end4; x += 4) { + uint32_t mask32 = *((uint32_t *)mask); + if(mask32 == 0xFFFFFFFF) { +#if LV_COLOR_DEPTH == 16 + if((lv_uintptr_t)dest_buf & 0x3) { + *(dest_buf + 0) = color; + uint32_t * d = (uint32_t *)(dest_buf + 1); + *d = c32; + *(dest_buf + 3) = color; + } + else { + uint32_t * d = (uint32_t *)dest_buf; + *d = c32; + *(d + 1) = c32; + } +#else + dest_buf[0] = color; + dest_buf[1] = color; + dest_buf[2] = color; + dest_buf[3] = color; +#endif + dest_buf += 4; + mask += 4; + } + else if(mask32) { + FILL_NORMAL_MASK_PX(color) + FILL_NORMAL_MASK_PX(color) + FILL_NORMAL_MASK_PX(color) + FILL_NORMAL_MASK_PX(color) + } + else { + mask += 4; + dest_buf += 4; + } + } + + for(; x < w ; x++) { + FILL_NORMAL_MASK_PX(color) + } + dest_buf += (dest_stride - w); + mask += (mask_stride - w); + } + } + /*With opacity*/ + else { + /*Buffer the result color to avoid recalculating the same color*/ + lv_color_t last_dest_color; + lv_color_t last_res_color; + lv_opa_t last_mask = LV_OPA_TRANSP; + last_dest_color.full = dest_buf[0].full; + last_res_color.full = dest_buf[0].full; + lv_opa_t opa_tmp = LV_OPA_TRANSP; + + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + if(*mask) { + if(*mask != last_mask) opa_tmp = *mask == LV_OPA_COVER ? opa : + (uint32_t)((uint32_t)(*mask) * opa) >> 8; + if(*mask != last_mask || last_dest_color.full != dest_buf[x].full) { + if(opa_tmp == LV_OPA_COVER) last_res_color = color; + else last_res_color = lv_color_mix(color, dest_buf[x], opa_tmp); + last_mask = *mask; + last_dest_color.full = dest_buf[x].full; + } + dest_buf[x] = last_res_color; + } + mask++; + } + dest_buf += dest_stride; + mask += (mask_stride - w); + } + } + } +} + +#if LV_COLOR_SCREEN_TRANSP +static inline void set_px_argb(uint8_t * buf, lv_color_t color, lv_opa_t opa) +{ + lv_color_t bg_color; + lv_color_t res_color; + lv_opa_t bg_opa = buf[LV_IMG_PX_SIZE_ALPHA_BYTE - 1]; +#if LV_COLOR_DEPTH == 8 + bg_color.full = buf[0]; + lv_color_mix_with_alpha(bg_color, bg_opa, color, opa, &res_color, &buf[1]); + if(buf[1] <= LV_OPA_MIN) return; + buf[0] = res_color.full; +#elif LV_COLOR_DEPTH == 16 + bg_color.full = buf[0] + (buf[1] << 8); + lv_color_mix_with_alpha(bg_color, bg_opa, color, opa, &res_color, &buf[2]); + if(buf[2] <= LV_OPA_MIN) return; + buf[0] = res_color.full & 0xff; + buf[1] = res_color.full >> 8; +#elif LV_COLOR_DEPTH == 32 + bg_color = *((lv_color_t *)buf); + lv_color_mix_with_alpha(bg_color, bg_opa, color, opa, &res_color, &buf[3]); + if(buf[3] <= LV_OPA_MIN) return; + buf[0] = res_color.ch.blue; + buf[1] = res_color.ch.green; + buf[2] = res_color.ch.red; +#endif +} + +static inline void set_px_argb_blend(uint8_t * buf, lv_color_t color, lv_opa_t opa, lv_color_t (*blend_fp)(lv_color_t, + lv_color_t, lv_opa_t)) +{ + static lv_color_t last_dest_color; + static lv_color_t last_src_color; + static lv_color_t last_res_color; + static uint32_t last_opa = 0xffff; /*Set to an invalid value for first*/ + + lv_color_t bg_color; + + /*Get the BG color*/ +#if LV_COLOR_DEPTH == 8 + if(buf[1] <= LV_OPA_MIN) return; + bg_color.full = buf[0]; +#elif LV_COLOR_DEPTH == 16 + if(buf[2] <= LV_OPA_MIN) return; + bg_color.full = buf[0] + (buf[1] << 8); +#elif LV_COLOR_DEPTH == 32 + if(buf[3] <= LV_OPA_MIN) return; + bg_color = *((lv_color_t *)buf); +#endif + + /*Get the result color*/ + if(last_dest_color.full != bg_color.full || last_src_color.full != color.full || last_opa != opa) { + last_dest_color = bg_color; + last_src_color = color; + last_opa = opa; + last_res_color = blend_fp(last_src_color, last_dest_color, last_opa); + } + + /*Set the result color*/ +#if LV_COLOR_DEPTH == 8 + buf[0] = res_color.full; +#elif LV_COLOR_DEPTH == 16 + buf[0] = last_res_color.full & 0xff; + buf[1] = last_res_color.full >> 8; +#elif LV_COLOR_DEPTH == 32 + buf[0] = last_res_color.ch.blue; + buf[1] = last_res_color.ch.green; + buf[2] = last_res_color.ch.red; +#endif + +} + +LV_ATTRIBUTE_FAST_MEM static void fill_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride) +{ + uint8_t * dest_buf8 = (uint8_t *) dest_buf; + int32_t w = lv_area_get_width(dest_area); + int32_t h = lv_area_get_height(dest_area); + + int32_t x; + int32_t y; + + uint8_t ctmp[LV_IMG_PX_SIZE_ALPHA_BYTE]; + lv_memcpy(ctmp, &color, sizeof(lv_color_t)); + ctmp[LV_IMG_PX_SIZE_ALPHA_BYTE - 1] = opa; + + /*No mask*/ + if(mask == NULL) { + if(opa >= LV_OPA_MAX) { + for(x = 0; x < w; x++) { + lv_memcpy(dest_buf8, ctmp, LV_IMG_PX_SIZE_ALPHA_BYTE); + dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE; + } + + dest_buf8 += (dest_stride - w) * LV_IMG_PX_SIZE_ALPHA_BYTE; + + for(y = 1; y < h; y++) { + lv_memcpy(dest_buf8, (uint8_t *) dest_buf, w * LV_IMG_PX_SIZE_ALPHA_BYTE); + dest_buf8 += dest_stride * LV_IMG_PX_SIZE_ALPHA_BYTE; + } + } + /*Has opacity*/ + else { + uint8_t * dest_buf8_row = dest_buf8; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + set_px_argb(dest_buf8, color, opa); + dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE; + } + dest_buf8_row += dest_stride * LV_IMG_PX_SIZE_ALPHA_BYTE; + dest_buf8 = dest_buf8_row; + } + } + } + /*Masked*/ + else { + /*Only the mask matters*/ + if(opa >= LV_OPA_MAX) { + uint8_t * dest_buf8_row = dest_buf8; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + set_px_argb(dest_buf8, color, *mask); + mask++; + dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE; + } + dest_buf8_row += dest_stride * LV_IMG_PX_SIZE_ALPHA_BYTE; + dest_buf8 = dest_buf8_row; + } + } + /*With opacity*/ + else { + /*Buffer the result color to avoid recalculating the same color*/ + lv_opa_t last_mask = LV_OPA_TRANSP; + lv_opa_t opa_tmp = LV_OPA_TRANSP; + + uint8_t * dest_buf8_row = dest_buf8; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + if(*mask) { + if(*mask != last_mask) opa_tmp = *mask == LV_OPA_COVER ? opa : + (uint32_t)((uint32_t)(*mask) * opa) >> 8; + + set_px_argb(dest_buf8, color, opa_tmp); + } + dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE; + mask++; + } + dest_buf8_row += dest_stride * LV_IMG_PX_SIZE_ALPHA_BYTE; + dest_buf8 = dest_buf8_row; + mask += (mask_stride - w); + } + } + } +} +#endif + +#if LV_DRAW_COMPLEX +static void fill_blended(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride, + lv_blend_mode_t blend_mode) +{ + + int32_t w = lv_area_get_width(dest_area); + int32_t h = lv_area_get_height(dest_area); + + int32_t x; + int32_t y; + + lv_color_t (*blend_fp)(lv_color_t, lv_color_t, lv_opa_t); + switch(blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + blend_fp = color_blend_true_color_additive; + break; + case LV_BLEND_MODE_SUBTRACTIVE: + blend_fp = color_blend_true_color_subtractive; + break; + case LV_BLEND_MODE_MULTIPLY: + blend_fp = color_blend_true_color_multiply; + break; + default: + LV_LOG_WARN("fill_blended: unsupported blend mode"); + return; + } + + /*Simple fill (maybe with opacity), no masking*/ + if(mask == NULL) { + lv_color_t last_dest_color = dest_buf[0]; + lv_color_t last_res_color = blend_fp(color, dest_buf[0], opa); + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + if(last_dest_color.full != dest_buf[x].full) { + last_dest_color = dest_buf[x]; + last_res_color = blend_fp(color, dest_buf[x], opa); + } + dest_buf[x] = last_res_color; + } + dest_buf += dest_stride; + } + } + /*Masked*/ + else { + /*Buffer the result color to avoid recalculating the same color*/ + lv_color_t last_dest_color; + lv_color_t last_res_color; + lv_opa_t last_mask = LV_OPA_TRANSP; + last_dest_color = dest_buf[0]; + lv_opa_t opa_tmp = mask[0] >= LV_OPA_MAX ? opa : (uint32_t)((uint32_t)mask[0] * opa) >> 8; + last_res_color = blend_fp(color, last_dest_color, opa_tmp); + + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + if(mask[x] == 0) continue; + if(mask[x] != last_mask || last_dest_color.full != dest_buf[x].full) { + opa_tmp = mask[x] >= LV_OPA_MAX ? opa : (uint32_t)((uint32_t)mask[x] * opa) >> 8; + + last_res_color = blend_fp(color, dest_buf[x], opa_tmp); + last_mask = mask[x]; + last_dest_color.full = dest_buf[x].full; + } + dest_buf[x] = last_res_color; + } + dest_buf += dest_stride; + mask += mask_stride; + } + } +} +#endif + +static void map_set_px(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride) + +{ + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + + int32_t w = lv_area_get_width(dest_area); + int32_t h = lv_area_get_height(dest_area); + + int32_t x; + int32_t y; + + if(mask == NULL) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + disp->driver->set_px_cb(disp->driver, (void *)dest_buf, dest_stride, dest_area->x1 + x, dest_area->y1 + y, src_buf[x], + opa); + } + src_buf += src_stride; + } + } + else { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + if(mask[x]) { + disp->driver->set_px_cb(disp->driver, (void *)dest_buf, dest_stride, dest_area->x1 + x, dest_area->y1 + y, src_buf[x], + (uint32_t)((uint32_t)opa * mask[x]) >> 8); + } + } + mask += mask_stride; + src_buf += src_stride; + } + } +} + +LV_ATTRIBUTE_FAST_MEM static void map_normal(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride) + +{ + int32_t w = lv_area_get_width(dest_area); + int32_t h = lv_area_get_height(dest_area); + + int32_t x; + int32_t y; + + /*Simple fill (maybe with opacity), no masking*/ + if(mask == NULL) { + if(opa >= LV_OPA_MAX) { + for(y = 0; y < h; y++) { + lv_memcpy(dest_buf, src_buf, w * sizeof(lv_color_t)); + dest_buf += dest_stride; + src_buf += src_stride; + } + } + else { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf[x] = lv_color_mix(src_buf[x], dest_buf[x], opa); + } + dest_buf += dest_stride; + src_buf += src_stride; + } + } + } + /*Masked*/ + else { + /*Only the mask matters*/ + if(opa > LV_OPA_MAX) { + int32_t x_end4 = w - 4; + + for(y = 0; y < h; y++) { + const lv_opa_t * mask_tmp_x = mask; +#if 0 + for(x = 0; x < w; x++) { + MAP_NORMAL_MASK_PX(x); + } +#else + for(x = 0; x < w && ((lv_uintptr_t)mask_tmp_x & 0x3); x++) { + MAP_NORMAL_MASK_PX(x) + } + + uint32_t * mask32 = (uint32_t *)mask_tmp_x; + for(; x < x_end4; x += 4) { + if(*mask32) { + if((*mask32) == 0xFFFFFFFF) { + dest_buf[x] = src_buf[x]; + dest_buf[x + 1] = src_buf[x + 1]; + dest_buf[x + 2] = src_buf[x + 2]; + dest_buf[x + 3] = src_buf[x + 3]; + } + else { + mask_tmp_x = (const lv_opa_t *)mask32; + MAP_NORMAL_MASK_PX(x) + MAP_NORMAL_MASK_PX(x + 1) + MAP_NORMAL_MASK_PX(x + 2) + MAP_NORMAL_MASK_PX(x + 3) + } + } + mask32++; + } + + mask_tmp_x = (const lv_opa_t *)mask32; + for(; x < w ; x++) { + MAP_NORMAL_MASK_PX(x) + } +#endif + dest_buf += dest_stride; + src_buf += src_stride; + mask += mask_stride; + } + } + /*Handle opa and mask values too*/ + else { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + if(mask[x]) { + lv_opa_t opa_tmp = mask[x] >= LV_OPA_MAX ? opa : ((opa * mask[x]) >> 8); + dest_buf[x] = lv_color_mix(src_buf[x], dest_buf[x], opa_tmp); + } + } + dest_buf += dest_stride; + src_buf += src_stride; + mask += mask_stride; + } + } + } +} + + + +#if LV_COLOR_SCREEN_TRANSP +LV_ATTRIBUTE_FAST_MEM static void map_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, + const lv_opa_t * mask, lv_coord_t mask_stride, lv_blend_mode_t blend_mode) + +{ + uint8_t * dest_buf8 = (uint8_t *) dest_buf; + + int32_t w = lv_area_get_width(dest_area); + int32_t h = lv_area_get_height(dest_area); + + int32_t x; + int32_t y; + + lv_color_t (*blend_fp)(lv_color_t, lv_color_t, lv_opa_t); + switch(blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + blend_fp = color_blend_true_color_additive; + break; + case LV_BLEND_MODE_SUBTRACTIVE: + blend_fp = color_blend_true_color_subtractive; + break; + case LV_BLEND_MODE_MULTIPLY: + blend_fp = color_blend_true_color_multiply; + break; + default: + blend_fp = NULL; + } + + /*Simple fill (maybe with opacity), no masking*/ + if(mask == NULL) { + if(opa >= LV_OPA_MAX) { + if(blend_fp == NULL && LV_COLOR_DEPTH == 32) { + for(y = 0; y < h; y++) { + lv_memcpy(dest_buf, src_buf, w * sizeof(lv_color_t)); + dest_buf += dest_stride; + src_buf += src_stride; + } + } + else { + uint8_t * dest_buf8_row = dest_buf8; + for(y = 0; y < h; y++) { + if(blend_fp == NULL) { + for(x = 0; x < w; x++) { + set_px_argb(dest_buf8, src_buf[x], LV_OPA_COVER); + dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE; + } + } + else { + for(x = 0; x < w; x++) { + set_px_argb_blend(dest_buf8, src_buf[x], LV_OPA_COVER, blend_fp); + dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE; + } + } + + dest_buf8_row += dest_stride * LV_IMG_PX_SIZE_ALPHA_BYTE; + dest_buf8 = dest_buf8_row; + src_buf += src_stride; + } + } + } + /*No mask but opacity*/ + else { + uint8_t * dest_buf8_row = dest_buf8; + for(y = 0; y < h; y++) { + if(blend_fp == NULL) { + for(x = 0; x < w; x++) { + set_px_argb(dest_buf8, src_buf[x], opa); + dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE; + } + } + else { + for(x = 0; x < w; x++) { + set_px_argb_blend(dest_buf8, src_buf[x], opa, blend_fp); + dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE; + } + } + + dest_buf8_row += dest_stride * LV_IMG_PX_SIZE_ALPHA_BYTE; + dest_buf8 = dest_buf8_row; + src_buf += src_stride; + } + } + } + /*Masked*/ + else { + /*Only the mask matters*/ + if(opa > LV_OPA_MAX) { + uint8_t * dest_buf8_row = dest_buf8; + for(y = 0; y < h; y++) { + if(blend_fp == NULL) { + for(x = 0; x < w; x++) { + set_px_argb(dest_buf8, src_buf[x], mask[x]); + dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE; + } + } + else { + for(x = 0; x < w; x++) { + set_px_argb_blend(dest_buf8, src_buf[x], mask[x], blend_fp); + dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE; + } + } + dest_buf8_row += dest_stride * LV_IMG_PX_SIZE_ALPHA_BYTE; + dest_buf8 = dest_buf8_row; + src_buf += src_stride; + mask += mask_stride; + } + } + /*Handle opa and mask values too*/ + else { + uint8_t * dest_buf8_row = dest_buf8; + for(y = 0; y < h; y++) { + if(blend_fp == NULL) { + for(x = 0; x < w; x++) { + if(mask[x]) { + lv_opa_t opa_tmp = mask[x] >= LV_OPA_MAX ? opa : ((opa * mask[x]) >> 8); + set_px_argb(dest_buf8, src_buf[x], opa_tmp); + } + dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE; + } + } + else { + for(x = 0; x < w; x++) { + if(mask[x]) { + lv_opa_t opa_tmp = mask[x] >= LV_OPA_MAX ? opa : ((opa * mask[x]) >> 8); + set_px_argb_blend(dest_buf8, src_buf[x], opa_tmp, blend_fp); + } + dest_buf8 += LV_IMG_PX_SIZE_ALPHA_BYTE; + } + } + dest_buf8_row += dest_stride * LV_IMG_PX_SIZE_ALPHA_BYTE; + dest_buf8 = dest_buf8_row; + src_buf += src_stride; + mask += mask_stride; + } + } + } +} +#endif + + +#if LV_DRAW_COMPLEX +static void map_blended(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, + const lv_opa_t * mask, lv_coord_t mask_stride, lv_blend_mode_t blend_mode) +{ + + int32_t w = lv_area_get_width(dest_area); + int32_t h = lv_area_get_height(dest_area); + + int32_t x; + int32_t y; + + lv_color_t (*blend_fp)(lv_color_t, lv_color_t, lv_opa_t); + switch(blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + blend_fp = color_blend_true_color_additive; + break; + case LV_BLEND_MODE_SUBTRACTIVE: + blend_fp = color_blend_true_color_subtractive; + break; + case LV_BLEND_MODE_MULTIPLY: + blend_fp = color_blend_true_color_multiply; + break; + default: + LV_LOG_WARN("fill_blended: unsupported blend mode"); + return; + } + + lv_color_t last_dest_color; + lv_color_t last_src_color; + /*Simple fill (maybe with opacity), no masking*/ + if(mask == NULL) { + last_dest_color = dest_buf[0]; + last_src_color = src_buf[0]; + lv_color_t last_res_color = blend_fp(last_src_color, last_dest_color, opa); + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + if(last_src_color.full != src_buf[x].full || last_dest_color.full != dest_buf[x].full) { + last_dest_color = dest_buf[x]; + last_src_color = src_buf[x]; + last_res_color = blend_fp(last_src_color, last_dest_color, opa); + } + dest_buf[x] = last_res_color; + } + dest_buf += dest_stride; + src_buf += src_stride; + } + } + /*Masked*/ + else { + last_dest_color = dest_buf[0]; + last_src_color = src_buf[0]; + lv_opa_t last_opa = mask[0] >= LV_OPA_MAX ? opa : ((opa * mask[0]) >> 8); + lv_color_t last_res_color = blend_fp(last_src_color, last_dest_color, last_opa); + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + if(mask[x] == 0) continue; + lv_opa_t opa_tmp = mask[x] >= LV_OPA_MAX ? opa : ((opa * mask[x]) >> 8); + if(last_src_color.full != src_buf[x].full || last_dest_color.full != dest_buf[x].full || last_opa != opa_tmp) { + last_dest_color = dest_buf[x]; + last_src_color = src_buf[x]; + last_opa = opa_tmp; + last_res_color = blend_fp(last_src_color, last_dest_color, last_opa); + } + dest_buf[x] = last_res_color; + } + dest_buf += dest_stride; + src_buf += src_stride; + mask += mask_stride; + } + } +} + +static inline lv_color_t color_blend_true_color_additive(lv_color_t fg, lv_color_t bg, lv_opa_t opa) +{ + + if(opa <= LV_OPA_MIN) return bg; + + uint32_t tmp; +#if LV_COLOR_DEPTH == 1 + tmp = bg.full + fg.full; + fg.full = LV_MIN(tmp, 1); +#else + tmp = bg.ch.red + fg.ch.red; +#if LV_COLOR_DEPTH == 8 + fg.ch.red = LV_MIN(tmp, 7); +#elif LV_COLOR_DEPTH == 16 + fg.ch.red = LV_MIN(tmp, 31); +#elif LV_COLOR_DEPTH == 32 + fg.ch.red = LV_MIN(tmp, 255); +#endif + +#if LV_COLOR_DEPTH == 8 + tmp = bg.ch.green + fg.ch.green; + fg.ch.green = LV_MIN(tmp, 7); +#elif LV_COLOR_DEPTH == 16 +#if LV_COLOR_16_SWAP == 0 + tmp = bg.ch.green + fg.ch.green; + fg.ch.green = LV_MIN(tmp, 63); +#else + tmp = (bg.ch.green_h << 3) + bg.ch.green_l + (fg.ch.green_h << 3) + fg.ch.green_l; + tmp = LV_MIN(tmp, 63); + fg.ch.green_h = tmp >> 3; + fg.ch.green_l = tmp & 0x7; +#endif + +#elif LV_COLOR_DEPTH == 32 + tmp = bg.ch.green + fg.ch.green; + fg.ch.green = LV_MIN(tmp, 255); +#endif + + tmp = bg.ch.blue + fg.ch.blue; +#if LV_COLOR_DEPTH == 8 + fg.ch.blue = LV_MIN(tmp, 4); +#elif LV_COLOR_DEPTH == 16 + fg.ch.blue = LV_MIN(tmp, 31); +#elif LV_COLOR_DEPTH == 32 + fg.ch.blue = LV_MIN(tmp, 255); +#endif +#endif + + if(opa == LV_OPA_COVER) return fg; + + return lv_color_mix(fg, bg, opa); +} + +static inline lv_color_t color_blend_true_color_subtractive(lv_color_t fg, lv_color_t bg, lv_opa_t opa) +{ + if(opa <= LV_OPA_MIN) return bg; + + int32_t tmp; + tmp = bg.ch.red - fg.ch.red; + fg.ch.red = LV_MAX(tmp, 0); + +#if LV_COLOR_16_SWAP == 0 + tmp = bg.ch.green - fg.ch.green; + fg.ch.green = LV_MAX(tmp, 0); +#else + tmp = (bg.ch.green_h << 3) + bg.ch.green_l + (fg.ch.green_h << 3) + fg.ch.green_l; + tmp = LV_MAX(tmp, 0); + fg.ch.green_h = tmp >> 3; + fg.ch.green_l = tmp & 0x7; +#endif + + tmp = bg.ch.blue - fg.ch.blue; + fg.ch.blue = LV_MAX(tmp, 0); + + if(opa == LV_OPA_COVER) return fg; + + return lv_color_mix(fg, bg, opa); +} + +static inline lv_color_t color_blend_true_color_multiply(lv_color_t fg, lv_color_t bg, lv_opa_t opa) +{ + if(opa <= LV_OPA_MIN) return bg; + +#if LV_COLOR_DEPTH == 32 + fg.ch.red = (fg.ch.red * bg.ch.red) >> 8; + fg.ch.green = (fg.ch.green * bg.ch.green) >> 8; + fg.ch.blue = (fg.ch.blue * bg.ch.blue) >> 8; +#elif LV_COLOR_DEPTH == 16 + fg.ch.red = (fg.ch.red * bg.ch.red) >> 5; + fg.ch.blue = (fg.ch.blue * bg.ch.blue) >> 5; + LV_COLOR_SET_G(fg, (LV_COLOR_GET_G(fg) * LV_COLOR_GET_G(bg)) >> 6); +#elif LV_COLOR_DEPTH == 8 + fg.ch.red = (fg.ch.red * bg.ch.red) >> 3; + fg.ch.green = (fg.ch.green * bg.ch.green) >> 3; + fg.ch.blue = (fg.ch.blue * bg.ch.blue) >> 2; +#endif + + if(opa == LV_OPA_COVER) return fg; + + return lv_color_mix(fg, bg, opa); +} + +#endif + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_blend.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_blend.h new file mode 100644 index 0000000..9a00e53 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_blend.h @@ -0,0 +1,69 @@ +/** + * @file lv_draw_sw_blend.h + * + */ + +#ifndef LV_DRAW_SW_BLEND_H +#define LV_DRAW_SW_BLEND_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../misc/lv_color.h" +#include "../../misc/lv_area.h" +#include "../../misc/lv_style.h" +#include "../lv_draw_mask.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + const lv_area_t * blend_area; /**< The area with absolute coordinates to draw on `draw_ctx->buf` + * will be clipped to `draw_ctx->clip_area` */ + const lv_color_t * src_buf; /**< Pointer to an image to blend. If set `fill_color` is ignored */ + lv_color_t color; /**< Fill color*/ + lv_opa_t * mask_buf; /**< NULL if ignored, or an alpha mask to apply on `blend_area`*/ + lv_draw_mask_res_t mask_res; /**< The result of the previous mask operation */ + const lv_area_t * mask_area; /**< The area of `mask_buf` with absolute coordinates*/ + lv_opa_t opa; /**< The overall opacity*/ + lv_blend_mode_t blend_mode; /**< E.g. LV_BLEND_MODE_ADDITIVE*/ +} lv_draw_sw_blend_dsc_t; + +struct _lv_draw_ctx_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Call the blend function of the `draw_ctx`. + * @param draw_ctx pointer to a draw context + * @param dsc pointer to an initialized blend descriptor + */ +void lv_draw_sw_blend(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); + +/** + * The basic blend function used with software rendering. + * @param draw_ctx pointer to a draw context + * @param dsc pointer to an initialized blend descriptor + */ +LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_basic(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_BLEND_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_dither.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_dither.c new file mode 100644 index 0000000..ff9ebf3 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_dither.c @@ -0,0 +1,213 @@ +/** + * @file lv_draw_sw_dither.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_dither.h" +#include "lv_draw_sw_gradient.h" +#include "../../misc/lv_color.h" + +/********************** + * STATIC FUNCTIONS + **********************/ + + +#if _DITHER_GRADIENT + +LV_ATTRIBUTE_FAST_MEM void lv_dither_none(lv_grad_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w) +{ + LV_UNUSED(x); + LV_UNUSED(y); + if(grad == NULL || grad->filled) return; + for(lv_coord_t i = 0; i < w; i++) { + grad->map[i] = lv_color_hex(grad->hmap[i].full); + } + grad->filled = 1; +} + +static const uint8_t dither_ordered_threshold_matrix[8 * 8] = { + 0, 48, 12, 60, 3, 51, 15, 63, + 32, 16, 44, 28, 35, 19, 47, 31, + 8, 56, 4, 52, 11, 59, 7, 55, + 40, 24, 36, 20, 43, 27, 39, 23, + 2, 50, 14, 62, 1, 49, 13, 61, + 34, 18, 46, 30, 33, 17, 45, 29, + 10, 58, 6, 54, 9, 57, 5, 53, + 42, 26, 38, 22, 41, 25, 37, 21 +}; /* Shift by 6 to normalize */ + + +LV_ATTRIBUTE_FAST_MEM void lv_dither_ordered_hor(lv_grad_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w) +{ + LV_UNUSED(x); + /* For vertical dithering, the error is spread on the next column (and not next line). + Since the renderer is scanline based, it's not obvious what could be used to perform the rendering efficiently. + The algorithm below is based on few assumptions: + 1. An error diffusion algorithm (like Floyd Steinberg) here would be hard to implement since it means that a pixel on column n depends on the pixel on row n + 2. Instead an ordered dithering algorithm shift the value a bit, but the influence only spread from the matrix size (used 8x8 here) + 3. It means that a pixel i,j only depends on the value of a pixel i-7, j-7 to i,j and no other one. + Then we compute a complete row of ordered dither and store it in out. */ + + /*The apply the algorithm for this patch*/ + for(lv_coord_t j = 0; j < w; j++) { + int8_t factor = dither_ordered_threshold_matrix[(y & 7) * 8 + ((j) & 7)] - 32; + lv_color32_t tmp = grad->hmap[LV_CLAMP(0, j - 4, grad->size)]; + lv_color32_t t; + t.ch.red = LV_CLAMP(0, tmp.ch.red + factor, 255); + t.ch.green = LV_CLAMP(0, tmp.ch.green + factor, 255); + t.ch.blue = LV_CLAMP(0, tmp.ch.blue + factor, 255); + + grad->map[j] = lv_color_hex(t.full); + } +} +LV_ATTRIBUTE_FAST_MEM void lv_dither_ordered_ver(lv_grad_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w) +{ + /* For vertical dithering, the error is spread on the next column (and not next line). + Since the renderer is scanline based, it's not obvious what could be used to perform the rendering efficiently. + The algorithm below is based on few assumptions: + 1. An error diffusion algorithm (like Floyd Steinberg) here would be hard to implement since it means that a pixel on column n depends on the pixel on row n + 2. Instead an ordered dithering algorithm shift the value a bit, but the influence only spread from the matrix size (used 8x8 here) + 3. It means that a pixel i,j only depends on the value of a pixel i-7, j-7 to i,j and no other one. + Then we compute a complete row of ordered dither and store it in out. */ + + /*Extract patch for working with, selected pseudo randomly*/ + lv_color32_t tmp = grad->hmap[LV_CLAMP(0, y - 4, grad->size)]; + + /*The apply the algorithm for this patch*/ + for(lv_coord_t j = 0; j < 8; j++) { + int8_t factor = dither_ordered_threshold_matrix[(y & 7) * 8 + ((j + x) & 7)] - 32; + lv_color32_t t; + t.ch.red = LV_CLAMP(0, tmp.ch.red + factor, 255); + t.ch.green = LV_CLAMP(0, tmp.ch.green + factor, 255); + t.ch.blue = LV_CLAMP(0, tmp.ch.blue + factor, 255); + + grad->map[j] = lv_color_hex(t.full); + } + /*Finally fill the line*/ + lv_coord_t j = 8; + for(; j < w - 8; j += 8) { + lv_memcpy(grad->map + j, grad->map, 8 * sizeof(*grad->map)); + } + /* Prevent overwriting */ + for(; j < w; j++) { + grad->map[j] = grad->map[j & 7]; + } +} + + +#if LV_DITHER_ERROR_DIFFUSION == 1 +LV_ATTRIBUTE_FAST_MEM void lv_dither_err_diff_hor(lv_grad_t * grad, lv_coord_t xs, lv_coord_t y, lv_coord_t w) +{ + LV_UNUSED(xs); + LV_UNUSED(y); + LV_UNUSED(w); + + /* Implement Floyd Steinberg algorithm, see https://surma.dev/things/ditherpunk/ + Coefs are: x 7 + 3 5 1 + / 16 + Can be implemented as: x (x<<3 - x) + (x<<2 - x) (x<<2+x) x + */ + int coef[4] = {0, 0, 0, 0}; +#define FS_COMPUTE_ERROR(e) { coef[0] = (e<<3) - e; coef[1] = (e<<2) - e; coef[2] = (e<<2) + e; coef[3] = e; } +#define FS_COMPONENTS(A, OP, B, C) A.ch.red = LV_CLAMP(0, A.ch.red OP B.r OP C.r, 255); A.ch.green = LV_CLAMP(0, A.ch.green OP B.g OP C.g, 255); A.ch.blue = LV_CLAMP(0, A.ch.blue OP B.b OP C.b, 255); +#define FS_QUANT_ERROR(e, t, q) { lv_color32_t u; u.full = lv_color_to32(q); e.r = (int8_t)(t.ch.red - u.ch.red); e.g = (int8_t)(t.ch.green - u.ch.green); e.b = (int8_t)(t.ch.blue - u.ch.blue); } + lv_scolor24_t next_px_err = {0}, next_l = {0}, error; + /*First last pixel are not dithered */ + grad->map[0] = lv_color_hex(grad->hmap[0].full); + for(lv_coord_t x = 1; x < grad->size - 1; x++) { + lv_color32_t t = grad->hmap[x]; + lv_color_t q; + /*Add error term*/ + FS_COMPONENTS(t, +, next_px_err, next_l); + next_l = grad->error_acc[x + 1]; + /*Quantify*/ + q = lv_color_hex(t.full); + /*Then compute error*/ + FS_QUANT_ERROR(error, t, q); + /*Dither the error*/ + FS_COMPUTE_ERROR(error.r); + next_px_err.r = coef[0] >> 4; + grad->error_acc[x - 1].r += coef[1] >> 4; + grad->error_acc[x].r += coef[2] >> 4; + grad->error_acc[x + 1].r = coef[3] >> 4; + + FS_COMPUTE_ERROR(error.g); + next_px_err.g = coef[0] >> 4; + grad->error_acc[x - 1].g += coef[1] >> 4; + grad->error_acc[x].g += coef[2] >> 4; + grad->error_acc[x + 1].g = coef[3] >> 4; + + FS_COMPUTE_ERROR(error.b); + next_px_err.b = coef[0] >> 4; + grad->error_acc[x - 1].b += coef[1] >> 4; + grad->error_acc[x].b += coef[2] >> 4; + grad->error_acc[x + 1].b = coef[3] >> 4; + + grad->map[x] = q; + } + grad->map[grad->size - 1] = lv_color_hex(grad->hmap[grad->size - 1].full); +} + +LV_ATTRIBUTE_FAST_MEM void lv_dither_err_diff_ver(lv_grad_t * grad, lv_coord_t xs, lv_coord_t y, lv_coord_t w) +{ + /* Try to implement error diffusion on a vertical gradient and an horizontal map using those tricks: + Since the given hi-resolution gradient (in src) is vertical, the Floyd Steinberg algorithm pass need to be rotated, + so we'll get this instead (from top to bottom): + + A B C + 1 [ ][ ][ ] + 2 [ ][ ][ ] Pixel A2 will spread its error on pixel A3 with coefficient 7, + 3 [ ][ ][ ] Pixel A2 will spread its error on pixel B1 with coefficient 3, B2 with coef 5 and B3 with coef 1 + + When taking into account an arbitrary pixel P(i,j), its added error diffusion term is: + e(i,j) = 1/16 * [ e(i-1,j) * 5 + e(i-1,j+1) * 3 + e(i-1,j-1) * 1 + e(i,j-1) * 7] + + This means that the error term depends on pixel W, NW, N and SW. + If we consider that we are generating the error diffused gradient map from top to bottom, we can remember the previous + line (N, NW) in the term above. Also, we remember the (W) term too since we are computing the gradient map from left to right. + However, the SW term is painful for us, we can't support it (since to get it, we need its own SW term and so on). + Let's remove it and re-dispatch the error factor accordingly so they stays normalized: + e(i,j) ~= 1/16 * [ e(i-1,j) * 6 + e(i-1,j-1) * 1 + e(i,j-1) * 9] + + That's the idea of this pseudo Floyd Steinberg dithering */ +#define FS_APPLY(d, s, c) d.r = (int8_t)(s.r * c) >> 4; d.g = (int8_t)(s.g * c) >> 4; d.b = (int8_t)(s.b * c) >> 4; +#define FS_COMPONENTS3(A, OP, B, b, C, c, D, d) \ + A.ch.red = LV_CLAMP(0, A.ch.red OP ((B.r * b OP C.r * c OP D.r * d) >> 4), 255); \ + A.ch.green = LV_CLAMP(0, A.ch.green OP ((B.r * b OP C.r * c OP D.r * d) >> 4), 255); \ + A.ch.blue = LV_CLAMP(0, A.ch.blue OP ((B.r * b OP C.r * c OP D.r * d) >> 4), 255); + + lv_scolor24_t next_px_err, prev_l = grad->error_acc[0]; + /*Compute the error term for the current pixel (first pixel is never dithered)*/ + if(xs == 0) { + grad->map[0] = lv_color_hex(grad->hmap[y].full); + FS_QUANT_ERROR(next_px_err, grad->hmap[y], grad->map[0]); + } + else { + lv_color_t tmp = lv_color_hex(grad->hmap[y].full); + lv_color32_t t = grad->hmap[y]; + FS_QUANT_ERROR(next_px_err, grad->hmap[y], tmp); + FS_COMPONENTS3(t, +, next_px_err, 6, prev_l, 1, grad->error_acc[0], 9); + grad->map[0] = lv_color_hex(t.full); + } + + for(lv_coord_t x = 1; x < w; x++) { + lv_color32_t t = grad->hmap[y]; + lv_color_t q; + /*Add the current error term*/ + FS_COMPONENTS3(t, +, next_px_err, 6, prev_l, 1, grad->error_acc[x], 9); + prev_l = grad->error_acc[x]; + /*Quantize and compute error term*/ + q = lv_color_hex(t.full); + FS_QUANT_ERROR(next_px_err, t, q); + /*Store error for next line computation*/ + grad->error_acc[x] = next_px_err; + grad->map[x] = q; + } +} +#endif +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_dither.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_dither.h new file mode 100644 index 0000000..6362c5a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_dither.h @@ -0,0 +1,70 @@ +/** + * @file lv_draw_sw_dither.h + * + */ + +#ifndef LV_DRAW_SW_DITHER_H +#define LV_DRAW_SW_DITHER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj_pos.h" + + +/********************* + * DEFINES + *********************/ +#if LV_COLOR_DEPTH < 32 && LV_DITHER_GRADIENT == 1 +#define _DITHER_GRADIENT 1 +#else +#define _DITHER_GRADIENT 0 +#endif + +/********************** + * TYPEDEFS + **********************/ +#if _DITHER_GRADIENT +/*A signed error color component*/ +typedef struct { + int8_t r, g, b; +} lv_scolor24_t; + +struct _lv_gradient_cache_t; +typedef void (*lv_dither_func_t)(struct _lv_gradient_cache_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w); + +#endif + + +/********************** + * PROTOTYPES + **********************/ +#if LV_DRAW_COMPLEX +#if _DITHER_GRADIENT +LV_ATTRIBUTE_FAST_MEM void lv_dither_none(struct _lv_gradient_cache_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w); + +LV_ATTRIBUTE_FAST_MEM void lv_dither_ordered_hor(struct _lv_gradient_cache_t * grad, const lv_coord_t xs, + const lv_coord_t y, const lv_coord_t w); +LV_ATTRIBUTE_FAST_MEM void lv_dither_ordered_ver(struct _lv_gradient_cache_t * grad, const lv_coord_t xs, + const lv_coord_t y, const lv_coord_t w); + +#if LV_DITHER_ERROR_DIFFUSION == 1 +LV_ATTRIBUTE_FAST_MEM void lv_dither_err_diff_hor(struct _lv_gradient_cache_t * grad, const lv_coord_t xs, + const lv_coord_t y, const lv_coord_t w); +LV_ATTRIBUTE_FAST_MEM void lv_dither_err_diff_ver(struct _lv_gradient_cache_t * grad, const lv_coord_t xs, + const lv_coord_t y, const lv_coord_t w); +#endif /* LV_DITHER_ERROR_DIFFUSION */ + +#endif /* _DITHER_GRADIENT */ +#endif + + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_gradient.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_gradient.c new file mode 100644 index 0000000..4e46632 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_gradient.c @@ -0,0 +1,346 @@ +/** + * @file lv_draw_sw_gradient.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_gradient.h" +#include "../../misc/lv_gc.h" +#include "../../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ +#if _DITHER_GRADIENT + #define GRAD_CM(r,g,b) LV_COLOR_MAKE32(r,g,b) + #define GRAD_CONV(t, x) t.full = lv_color_to32(x) +#else + #define GRAD_CM(r,g,b) LV_COLOR_MAKE(r,g,b) + #define GRAD_CONV(t, x) t = x +#endif + +#undef ALIGN +#if defined(LV_ARCH_64) + #define ALIGN(X) (((X) + 7) & ~7) +#else + #define ALIGN(X) (((X) + 3) & ~3) +#endif + +#if LV_GRAD_CACHE_DEF_SIZE != 0 && LV_GRAD_CACHE_DEF_SIZE < 256 + #error "LV_GRAD_CACHE_DEF_SIZE is too small" +#endif + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_grad_t * next_in_cache(lv_grad_t * item); + +typedef lv_res_t (*op_cache_t)(lv_grad_t * c, void * ctx); +static lv_res_t iterate_cache(op_cache_t func, void * ctx, lv_grad_t ** out); +static size_t get_cache_item_size(lv_grad_t * c); +static lv_grad_t * allocate_item(const lv_grad_dsc_t * g, lv_coord_t w, lv_coord_t h); +static lv_res_t find_oldest_item_life(lv_grad_t * c, void * ctx); +static lv_res_t kill_oldest_item(lv_grad_t * c, void * ctx); +static lv_res_t find_item(lv_grad_t * c, void * ctx); +static void free_item(lv_grad_t * c); +static uint32_t compute_key(const lv_grad_dsc_t * g, lv_coord_t w, lv_coord_t h); + + +/********************** + * STATIC VARIABLE + **********************/ +static size_t grad_cache_size = 0; +static uint8_t * grad_cache_end = 0; + +/********************** + * STATIC FUNCTIONS + **********************/ +union void_cast { + const void * ptr; + const uint32_t value; +}; + +static uint32_t compute_key(const lv_grad_dsc_t * g, lv_coord_t size, lv_coord_t w) +{ + union void_cast v; + v.ptr = g; + return (v.value ^ size ^ (w >> 1)); /*Yes, this is correct, it's like a hash that changes if the width changes*/ +} + +static size_t get_cache_item_size(lv_grad_t * c) +{ + size_t s = ALIGN(sizeof(*c)) + ALIGN(c->alloc_size * sizeof(lv_color_t)); +#if _DITHER_GRADIENT + s += ALIGN(c->size * sizeof(lv_color32_t)); +#if LV_DITHER_ERROR_DIFFUSION == 1 + s += ALIGN(c->w * sizeof(lv_scolor24_t)); +#endif +#endif + return s; +} + +static lv_grad_t * next_in_cache(lv_grad_t * item) +{ + if(grad_cache_size == 0) return NULL; + + if(item == NULL) + return (lv_grad_t *)LV_GC_ROOT(_lv_grad_cache_mem); + + size_t s = get_cache_item_size(item); + /*Compute the size for this cache item*/ + if((uint8_t *)item + s >= grad_cache_end) return NULL; + else return (lv_grad_t *)((uint8_t *)item + s); +} + +static lv_res_t iterate_cache(op_cache_t func, void * ctx, lv_grad_t ** out) +{ + lv_grad_t * first = next_in_cache(NULL); + while(first != NULL && first->life) { + if((*func)(first, ctx) == LV_RES_OK) { + if(out != NULL) *out = first; + return LV_RES_OK; + } + first = next_in_cache(first); + } + return LV_RES_INV; +} + +static lv_res_t find_oldest_item_life(lv_grad_t * c, void * ctx) +{ + uint32_t * min_life = (uint32_t *)ctx; + if(c->life < *min_life) *min_life = c->life; + return LV_RES_INV; +} + +static void free_item(lv_grad_t * c) +{ + size_t size = get_cache_item_size(c); + size_t next_items_size = (size_t)(grad_cache_end - (uint8_t *)c) - size; + grad_cache_end -= size; + if(next_items_size) { + uint8_t * old = (uint8_t *)c; + lv_memcpy(c, ((uint8_t *)c) + size, next_items_size); + /* Then need to fix all internal pointers too */ + while((uint8_t *)c != grad_cache_end) { + c->map = (lv_color_t *)(((uint8_t *)c->map) - size); +#if _DITHER_GRADIENT + c->hmap = (lv_color32_t *)(((uint8_t *)c->hmap) - size); +#if LV_DITHER_ERROR_DIFFUSION == 1 + c->error_acc = (lv_scolor24_t *)(((uint8_t *)c->error_acc) - size); +#endif +#endif + c = (lv_grad_t *)(((uint8_t *)c) + get_cache_item_size(c)); + } + lv_memset_00(old + next_items_size, size); + } +} + +static lv_res_t kill_oldest_item(lv_grad_t * c, void * ctx) +{ + uint32_t * min_life = (uint32_t *)ctx; + if(c->life == *min_life) { + /*Found, let's kill it*/ + free_item(c); + return LV_RES_OK; + } + return LV_RES_INV; +} + +static lv_res_t find_item(lv_grad_t * c, void * ctx) +{ + uint32_t * k = (uint32_t *)ctx; + if(c->key == *k) return LV_RES_OK; + return LV_RES_INV; +} + +static lv_grad_t * allocate_item(const lv_grad_dsc_t * g, lv_coord_t w, lv_coord_t h) +{ + lv_coord_t size = g->dir == LV_GRAD_DIR_HOR ? w : h; + lv_coord_t map_size = LV_MAX(w, h); /* The map is being used horizontally (width) unless + no dithering is selected where it's used vertically */ + + size_t req_size = ALIGN(sizeof(lv_grad_t)) + ALIGN(map_size * sizeof(lv_color_t)); +#if _DITHER_GRADIENT + req_size += ALIGN(size * sizeof(lv_color32_t)); +#if LV_DITHER_ERROR_DIFFUSION == 1 + req_size += ALIGN(w * sizeof(lv_scolor24_t)); +#endif +#endif + + size_t act_size = (size_t)(grad_cache_end - LV_GC_ROOT(_lv_grad_cache_mem)); + lv_grad_t * item = NULL; + if(req_size + act_size < grad_cache_size) { + item = (lv_grad_t *)grad_cache_end; + item->not_cached = 0; + } + else { + /*Need to evict items from cache until we find enough space to allocate this one */ + if(req_size <= grad_cache_size) { + while(act_size + req_size > grad_cache_size) { + uint32_t oldest_life = UINT32_MAX; + iterate_cache(&find_oldest_item_life, &oldest_life, NULL); + iterate_cache(&kill_oldest_item, &oldest_life, NULL); + act_size = (size_t)(grad_cache_end - LV_GC_ROOT(_lv_grad_cache_mem)); + } + item = (lv_grad_t *)grad_cache_end; + item->not_cached = 0; + } + else { + /*The cache is too small. Allocate the item manually and free it later.*/ + item = lv_mem_alloc(req_size); + LV_ASSERT_MALLOC(item); + if(item == NULL) return NULL; + item->not_cached = 1; + } + } + + item->key = compute_key(g, size, w); + item->life = 1; + item->filled = 0; + item->alloc_size = map_size; + item->size = size; + if(item->not_cached) { + uint8_t * p = (uint8_t *)item; + item->map = (lv_color_t *)(p + ALIGN(sizeof(*item))); +#if _DITHER_GRADIENT + item->hmap = (lv_color32_t *)(p + ALIGN(sizeof(*item)) + ALIGN(map_size * sizeof(lv_color_t))); +#if LV_DITHER_ERROR_DIFFUSION == 1 + item->error_acc = (lv_scolor24_t *)(p + ALIGN(sizeof(*item)) + ALIGN(size * sizeof(lv_grad_color_t)) + + ALIGN(map_size * sizeof(lv_color_t))); + item->w = w; +#endif +#endif + } + else { + item->map = (lv_color_t *)(grad_cache_end + ALIGN(sizeof(*item))); +#if _DITHER_GRADIENT + item->hmap = (lv_color32_t *)(grad_cache_end + ALIGN(sizeof(*item)) + ALIGN(map_size * sizeof(lv_color_t))); +#if LV_DITHER_ERROR_DIFFUSION == 1 + item->error_acc = (lv_scolor24_t *)(grad_cache_end + ALIGN(sizeof(*item)) + ALIGN(size * sizeof(lv_grad_color_t)) + + ALIGN(map_size * sizeof(lv_color_t))); + item->w = w; +#endif +#endif + grad_cache_end += req_size; + } + return item; +} + + +/********************** + * FUNCTIONS + **********************/ +void lv_gradient_free_cache(void) +{ + lv_mem_free(LV_GC_ROOT(_lv_grad_cache_mem)); + LV_GC_ROOT(_lv_grad_cache_mem) = grad_cache_end = NULL; + grad_cache_size = 0; +} + +void lv_gradient_set_cache_size(size_t max_bytes) +{ + lv_mem_free(LV_GC_ROOT(_lv_grad_cache_mem)); + grad_cache_end = LV_GC_ROOT(_lv_grad_cache_mem) = lv_mem_alloc(max_bytes); + LV_ASSERT_MALLOC(LV_GC_ROOT(_lv_grad_cache_mem)); + lv_memset_00(LV_GC_ROOT(_lv_grad_cache_mem), max_bytes); + grad_cache_size = max_bytes; +} + +lv_grad_t * lv_gradient_get(const lv_grad_dsc_t * g, lv_coord_t w, lv_coord_t h) +{ + /* No gradient, no cache */ + if(g->dir == LV_GRAD_DIR_NONE) return NULL; + + /* Step 0: Check if the cache exist (else create it) */ + static bool inited = false; + if(!inited) { + lv_gradient_set_cache_size(LV_GRAD_CACHE_DEF_SIZE); + inited = true; + } + + /* Step 1: Search cache for the given key */ + lv_coord_t size = g->dir == LV_GRAD_DIR_HOR ? w : h; + uint32_t key = compute_key(g, size, w); + lv_grad_t * item = NULL; + if(iterate_cache(&find_item, &key, &item) == LV_RES_OK) { + item->life++; /* Don't forget to bump the counter */ + return item; + } + + /* Step 2: Need to allocate an item for it */ + item = allocate_item(g, w, h); + if(item == NULL) { + LV_LOG_WARN("Faild to allcoate item for teh gradient"); + return item; + } + + /* Step 3: Fill it with the gradient, as expected */ +#if _DITHER_GRADIENT + for(lv_coord_t i = 0; i < item->size; i++) { + item->hmap[i] = lv_gradient_calculate(g, item->size, i); + } +#if LV_DITHER_ERROR_DIFFUSION == 1 + lv_memset_00(item->error_acc, w * sizeof(lv_scolor24_t)); +#endif +#else + for(lv_coord_t i = 0; i < item->size; i++) { + item->map[i] = lv_gradient_calculate(g, item->size, i); + } +#endif + + return item; +} + +LV_ATTRIBUTE_FAST_MEM lv_grad_color_t lv_gradient_calculate(const lv_grad_dsc_t * dsc, lv_coord_t range, + lv_coord_t frac) +{ + lv_grad_color_t tmp; + lv_color32_t one, two; + /*Clip out-of-bounds first*/ + int32_t min = (dsc->stops[0].frac * range) >> 8; + if(frac <= min) { + GRAD_CONV(tmp, dsc->stops[0].color); + return tmp; + } + + int32_t max = (dsc->stops[dsc->stops_count - 1].frac * range) >> 8; + if(frac >= max) { + GRAD_CONV(tmp, dsc->stops[dsc->stops_count - 1].color); + return tmp; + } + + /*Find the 2 closest stop now*/ + int32_t d = 0; + for(uint8_t i = 1; i < dsc->stops_count; i++) { + int32_t cur = (dsc->stops[i].frac * range) >> 8; + if(frac <= cur) { + one.full = lv_color_to32(dsc->stops[i - 1].color); + two.full = lv_color_to32(dsc->stops[i].color); + min = (dsc->stops[i - 1].frac * range) >> 8; + max = (dsc->stops[i].frac * range) >> 8; + d = max - min; + break; + } + } + + LV_ASSERT(d != 0); + + /*Then interpolate*/ + frac -= min; + lv_opa_t mix = (frac * 255) / d; + lv_opa_t imix = 255 - mix; + + lv_grad_color_t r = GRAD_CM(LV_UDIV255(two.ch.red * mix + one.ch.red * imix), + LV_UDIV255(two.ch.green * mix + one.ch.green * imix), + LV_UDIV255(two.ch.blue * mix + one.ch.blue * imix)); + return r; +} + +void lv_gradient_cleanup(lv_grad_t * grad) +{ + if(grad->not_cached) { + lv_mem_free(grad); + } +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_gradient.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_gradient.h new file mode 100644 index 0000000..f5f3215 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_gradient.h @@ -0,0 +1,97 @@ +/** + * @file lv_draw_sw_gradient.h + * + */ + +#ifndef LV_DRAW_SW_GRADIENT_H +#define LV_DRAW_SW_GRADIENT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../misc/lv_color.h" +#include "../../misc/lv_style.h" +#include "lv_draw_sw_dither.h" + +/********************* + * DEFINES + *********************/ +#if LV_GRADIENT_MAX_STOPS < 2 +#error LVGL needs at least 2 stops for gradients. Please increase the LV_GRADIENT_MAX_STOPS +#endif + + +/********************** + * TYPEDEFS + **********************/ +#if _DITHER_GRADIENT +typedef lv_color32_t lv_grad_color_t; +#else +typedef lv_color_t lv_grad_color_t; +#endif + +/** To avoid recomputing gradient for each draw operation, + * it's possible to cache the computation in this structure instance. + * Whenever possible, this structure is reused instead of recomputing the gradient map */ +typedef struct _lv_gradient_cache_t { + uint32_t key; /**< A discriminating key that's built from the drawing operation. + * If the key does not match, the cache item is not used */ + uint32_t life : 30; /**< A life counter that's incremented on usage. Higher counter is + * less likely to be evicted from the cache */ + uint32_t filled : 1; /**< Used to skip dithering in it if already done */ + uint32_t not_cached: 1; /**< The cache was too small so this item is not managed by the cache*/ + lv_color_t * map; /**< The computed gradient low bitdepth color map, points into the + * cache's buffer, no free needed */ + lv_coord_t alloc_size; /**< The map allocated size in colors */ + lv_coord_t size; /**< The computed gradient color map size, in colors */ +#if _DITHER_GRADIENT + lv_color32_t * hmap; /**< If dithering, we need to store the current, high bitdepth gradient + * map too, points to the cache's buffer, no free needed */ +#if LV_DITHER_ERROR_DIFFUSION == 1 + lv_scolor24_t * error_acc; /**< Error diffusion dithering algorithm requires storing the last error + * drawn, points to the cache's buffer, no free needed */ + lv_coord_t w; /**< The error array width in pixels */ +#endif +#endif +} lv_grad_t; + + +/********************** + * PROTOTYPES + **********************/ +/** Compute the color in the given gradient and fraction + * Gradient are specified in a virtual [0-255] range, so this function scales the virtual range to the given range + * @param dsc The gradient descriptor to use + * @param range The range to use in computation. + * @param frac The current part used in the range. frac is in [0; range] + */ +LV_ATTRIBUTE_FAST_MEM lv_grad_color_t lv_gradient_calculate(const lv_grad_dsc_t * dsc, lv_coord_t range, + lv_coord_t frac); + +/** + * Set the gradient cache size + * @param max_bytes Max cahce size + */ +void lv_gradient_set_cache_size(size_t max_bytes); + +/** Free the gradient cache */ +void lv_gradient_free_cache(void); + +/** Get a gradient cache from the given parameters */ +lv_grad_t * lv_gradient_get(const lv_grad_dsc_t * gradient, lv_coord_t w, lv_coord_t h); + +/** + * Clean up the gradient item after it was get with `lv_grad_get_from_cache`. + * @param grad pointer to a gradient + */ +void lv_gradient_cleanup(lv_grad_t * grad); + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_GRADIENT_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_img.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_img.c new file mode 100644 index 0000000..9578bc7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_img.c @@ -0,0 +1,297 @@ +/** + * @file lv_draw_img.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw.h" +#include "../lv_img_cache.h" +#include "../../hal/lv_hal_disp.h" +#include "../../misc/lv_log.h" +#include "../../core/lv_refr.h" +#include "../../misc/lv_mem.h" +#include "../../misc/lv_math.h" + +/********************* + * DEFINES + *********************/ +#define MAX_BUF_SIZE (uint32_t) lv_disp_get_hor_res(_lv_refr_get_disp_refreshing()) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void convert_cb(const lv_area_t * dest_area, const void * src_buf, lv_coord_t src_w, lv_coord_t src_h, + lv_coord_t src_stride, const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t cf, lv_color_t * cbuf, lv_opa_t * abuf); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + + +LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_img_decoded(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * draw_dsc, + const lv_area_t * coords, const uint8_t * src_buf, lv_img_cf_t cf) +{ + /*Use the clip area as draw area*/ + lv_area_t draw_area; + lv_area_copy(&draw_area, draw_ctx->clip_area); + + bool mask_any = lv_draw_mask_is_any(&draw_area); + bool transform = draw_dsc->angle != 0 || draw_dsc->zoom != LV_IMG_ZOOM_NONE ? true : false; + + lv_area_t blend_area; + lv_draw_sw_blend_dsc_t blend_dsc; + + lv_memset_00(&blend_dsc, sizeof(lv_draw_sw_blend_dsc_t)); + blend_dsc.opa = draw_dsc->opa; + blend_dsc.blend_mode = draw_dsc->blend_mode; + blend_dsc.blend_area = &blend_area; + + /*The simplest case just copy the pixels into the draw_buf*/ + if(!mask_any && !transform && cf == LV_IMG_CF_TRUE_COLOR && draw_dsc->recolor_opa == LV_OPA_TRANSP) { + blend_dsc.src_buf = (const lv_color_t *)src_buf; + + blend_dsc.blend_area = coords; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + else if(!mask_any && !transform && cf == LV_IMG_CF_ALPHA_8BIT) { + lv_area_t clipped_coords; + if(!_lv_area_intersect(&clipped_coords, coords, draw_ctx->clip_area)) return; + + blend_dsc.mask_buf = (lv_opa_t *)src_buf; + blend_dsc.mask_area = coords; + blend_dsc.src_buf = NULL; + blend_dsc.color = draw_dsc->recolor; + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + + blend_dsc.blend_area = coords; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } +#if LV_COLOR_DEPTH == 16 + else if(!mask_any && !transform && cf == LV_IMG_CF_RGB565A8 && draw_dsc->recolor_opa == LV_OPA_TRANSP) { + lv_coord_t src_w = lv_area_get_width(coords); + lv_coord_t src_h = lv_area_get_height(coords); + blend_dsc.src_buf = (const lv_color_t *)src_buf; + blend_dsc.mask_buf = (lv_opa_t *)src_buf; + blend_dsc.mask_buf += sizeof(lv_color_t) * src_w * src_h; + blend_dsc.blend_area = coords; + blend_dsc.mask_area = coords; + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } +#endif + /*In the other cases every pixel need to be checked one-by-one*/ + else { + blend_area.x1 = draw_ctx->clip_area->x1; + blend_area.x2 = draw_ctx->clip_area->x2; + blend_area.y1 = draw_ctx->clip_area->y1; + blend_area.y2 = draw_ctx->clip_area->y2; + + lv_coord_t src_w = lv_area_get_width(coords); + lv_coord_t src_h = lv_area_get_height(coords); + lv_coord_t blend_h = lv_area_get_height(&blend_area); + lv_coord_t blend_w = lv_area_get_width(&blend_area); + + uint32_t max_buf_size = MAX_BUF_SIZE; + uint32_t blend_size = lv_area_get_size(&blend_area); + uint32_t buf_h; + uint32_t buf_w = blend_w; + if(blend_size <= max_buf_size) { + buf_h = blend_h; + } + else { + /*Round to full lines*/ + buf_h = max_buf_size / blend_w; + } + + /*Create buffers and masks*/ + uint32_t buf_size = buf_w * buf_h; + + lv_color_t * rgb_buf = lv_mem_buf_get(buf_size * sizeof(lv_color_t)); + lv_opa_t * mask_buf = lv_mem_buf_get(buf_size); + blend_dsc.mask_buf = mask_buf; + blend_dsc.mask_area = &blend_area; + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + blend_dsc.src_buf = rgb_buf; + lv_coord_t y_last = blend_area.y2; + blend_area.y2 = blend_area.y1 + buf_h - 1; + + lv_draw_mask_res_t mask_res_def = (cf != LV_IMG_CF_TRUE_COLOR || draw_dsc->angle || + draw_dsc->zoom != LV_IMG_ZOOM_NONE) ? + LV_DRAW_MASK_RES_CHANGED : LV_DRAW_MASK_RES_FULL_COVER; + blend_dsc.mask_res = mask_res_def; + + while(blend_area.y1 <= y_last) { + /*Apply transformations if any or separate the channels*/ + lv_area_t transform_area; + lv_area_copy(&transform_area, &blend_area); + lv_area_move(&transform_area, -coords->x1, -coords->y1); + if(transform) { + lv_draw_transform(draw_ctx, &transform_area, src_buf, src_w, src_h, src_w, + draw_dsc, cf, rgb_buf, mask_buf); + } + else { + convert_cb(&transform_area, src_buf, src_w, src_h, src_w, draw_dsc, cf, rgb_buf, mask_buf); + } + + /*Apply recolor*/ + if(draw_dsc->recolor_opa > LV_OPA_MIN) { + uint16_t premult_v[3]; + lv_opa_t recolor_opa = draw_dsc->recolor_opa; + lv_color_t recolor = draw_dsc->recolor; + lv_color_premult(recolor, recolor_opa, premult_v); + recolor_opa = 255 - recolor_opa; + uint32_t i; + for(i = 0; i < buf_size; i++) { + rgb_buf[i] = lv_color_mix_premult(premult_v, rgb_buf[i], recolor_opa); + } + } +#if LV_DRAW_COMPLEX + /*Apply the masks if any*/ + if(mask_any) { + lv_coord_t y; + lv_opa_t * mask_buf_tmp = mask_buf; + for(y = blend_area.y1; y <= blend_area.y2; y++) { + lv_draw_mask_res_t mask_res_line; + mask_res_line = lv_draw_mask_apply(mask_buf_tmp, blend_area.x1, y, blend_w); + + if(mask_res_line == LV_DRAW_MASK_RES_TRANSP) { + lv_memset_00(mask_buf_tmp, blend_w); + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + } + else if(mask_res_line == LV_DRAW_MASK_RES_CHANGED) { + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + } + mask_buf_tmp += blend_w; + } + } +#endif + + /*Blend*/ + lv_draw_sw_blend(draw_ctx, &blend_dsc); + + /*Go the the next lines*/ + blend_area.y1 = blend_area.y2 + 1; + blend_area.y2 = blend_area.y1 + buf_h - 1; + if(blend_area.y2 > y_last) blend_area.y2 = y_last; + } + + lv_mem_buf_release(mask_buf); + lv_mem_buf_release(rgb_buf); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/* Separate the image channels to RGB and Alpha to match LV_COLOR_DEPTH settings*/ +static void convert_cb(const lv_area_t * dest_area, const void * src_buf, lv_coord_t src_w, lv_coord_t src_h, + lv_coord_t src_stride, const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t cf, lv_color_t * cbuf, lv_opa_t * abuf) +{ + LV_UNUSED(draw_dsc); + LV_UNUSED(src_h); + LV_UNUSED(src_w); + + const uint8_t * src_tmp8 = (const uint8_t *)src_buf; + lv_coord_t y; + lv_coord_t x; + + if(cf == LV_IMG_CF_TRUE_COLOR || cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) { + uint32_t px_cnt = lv_area_get_size(dest_area); + lv_memset_ff(abuf, px_cnt); + + src_tmp8 += (src_stride * dest_area->y1 * sizeof(lv_color_t)) + dest_area->x1 * sizeof(lv_color_t); + uint32_t dest_w = lv_area_get_width(dest_area); + uint32_t dest_w_byte = dest_w * sizeof(lv_color_t); + + lv_coord_t src_stride_byte = src_stride * sizeof(lv_color_t); + lv_color_t * cbuf_tmp = cbuf; + for(y = dest_area->y1; y <= dest_area->y2; y++) { + lv_memcpy(cbuf_tmp, src_tmp8, dest_w_byte); + src_tmp8 += src_stride_byte; + cbuf_tmp += dest_w; + } + + /*Make "holes" for with Chroma keying*/ + if(cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) { + uint32_t i; + lv_color_t chk = LV_COLOR_CHROMA_KEY; +#if LV_COLOR_DEPTH == 8 || LV_COLOR_DEPTH == 1 + uint8_t * cbuf_uint = (uint8_t *)cbuf; + uint8_t chk_v = chk.full; +#elif LV_COLOR_DEPTH == 16 + uint16_t * cbuf_uint = (uint16_t *)cbuf; + uint16_t chk_v = chk.full; +#elif LV_COLOR_DEPTH == 32 + uint32_t * cbuf_uint = (uint32_t *)cbuf; + uint32_t chk_v = chk.full; +#endif + for(i = 0; i < px_cnt; i++) { + if(chk_v == cbuf_uint[i]) abuf[i] = 0x00; + } + } + } + else if(cf == LV_IMG_CF_TRUE_COLOR_ALPHA) { + src_tmp8 += (src_stride * dest_area->y1 * LV_IMG_PX_SIZE_ALPHA_BYTE) + dest_area->x1 * LV_IMG_PX_SIZE_ALPHA_BYTE; + + lv_coord_t src_new_line_step_px = (src_stride - lv_area_get_width(dest_area)); + lv_coord_t src_new_line_step_byte = src_new_line_step_px * LV_IMG_PX_SIZE_ALPHA_BYTE; + + lv_coord_t dest_h = lv_area_get_height(dest_area); + lv_coord_t dest_w = lv_area_get_width(dest_area); + for(y = 0; y < dest_h; y++) { + for(x = 0; x < dest_w; x++) { + abuf[x] = src_tmp8[LV_IMG_PX_SIZE_ALPHA_BYTE - 1]; +#if LV_COLOR_DEPTH == 8 || LV_COLOR_DEPTH == 1 + cbuf[x].full = *src_tmp8; +#elif LV_COLOR_DEPTH == 16 + cbuf[x].full = *src_tmp8 + ((*(src_tmp8 + 1)) << 8); +#elif LV_COLOR_DEPTH == 32 + cbuf[x] = *((lv_color_t *) src_tmp8); + cbuf[x].ch.alpha = 0xff; +#endif + src_tmp8 += LV_IMG_PX_SIZE_ALPHA_BYTE; + + } + cbuf += dest_w; + abuf += dest_w; + src_tmp8 += src_new_line_step_byte; + } + } + else if(cf == LV_IMG_CF_RGB565A8) { + src_tmp8 += (src_stride * dest_area->y1 * sizeof(lv_color_t)) + dest_area->x1 * sizeof(lv_color_t); + + lv_coord_t src_stride_byte = src_stride * sizeof(lv_color_t); + + lv_coord_t dest_h = lv_area_get_height(dest_area); + lv_coord_t dest_w = lv_area_get_width(dest_area); + for(y = 0; y < dest_h; y++) { + lv_memcpy(cbuf, src_tmp8, dest_w * sizeof(lv_color_t)); + cbuf += dest_w; + src_tmp8 += src_stride_byte; + } + + src_tmp8 = (const uint8_t *)src_buf; + src_tmp8 += sizeof(lv_color_t) * src_w * src_h; + src_tmp8 += src_stride * dest_area->y1 + dest_area->x1; + for(y = 0; y < dest_h; y++) { + lv_memcpy(abuf, src_tmp8, dest_w); + abuf += dest_w; + src_tmp8 += src_stride; + } + } +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_layer.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_layer.c new file mode 100644 index 0000000..b53c662 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_layer.c @@ -0,0 +1,150 @@ +/** + * @file lv_draw_sw_layer.h + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw.h" +#include "../../hal/lv_hal_disp.h" +#include "../../misc/lv_area.h" +#include "../../core/lv_refr.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + + +struct _lv_draw_layer_ctx_t * lv_draw_sw_layer_create(struct _lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx, + lv_draw_layer_flags_t flags) +{ + if(LV_COLOR_SCREEN_TRANSP == 0 && (flags & LV_DRAW_LAYER_FLAG_HAS_ALPHA)) { + LV_LOG_WARN("Rendering this widget needs LV_COLOR_SCREEN_TRANSP 1"); + return NULL; + } + + lv_draw_sw_layer_ctx_t * layer_sw_ctx = (lv_draw_sw_layer_ctx_t *) layer_ctx; + uint32_t px_size = flags & LV_DRAW_LAYER_FLAG_HAS_ALPHA ? LV_IMG_PX_SIZE_ALPHA_BYTE : sizeof(lv_color_t); + if(flags & LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE) { + layer_sw_ctx->buf_size_bytes = LV_LAYER_SIMPLE_BUF_SIZE; + uint32_t full_size = lv_area_get_size(&layer_sw_ctx->base_draw.area_full) * px_size; + if(layer_sw_ctx->buf_size_bytes > full_size) layer_sw_ctx->buf_size_bytes = full_size; + layer_sw_ctx->base_draw.buf = lv_mem_alloc(layer_sw_ctx->buf_size_bytes); + if(layer_sw_ctx->base_draw.buf == NULL) { + LV_LOG_WARN("Cannot allocate %"LV_PRIu32" bytes for layer buffer. Allocating %"LV_PRIu32" bytes instead. (Reduced performance)", + (uint32_t)layer_sw_ctx->buf_size_bytes, (uint32_t)LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE * px_size); + layer_sw_ctx->buf_size_bytes = LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE; + layer_sw_ctx->base_draw.buf = lv_mem_alloc(layer_sw_ctx->buf_size_bytes); + if(layer_sw_ctx->base_draw.buf == NULL) { + return NULL; + } + } + layer_sw_ctx->base_draw.area_act = layer_sw_ctx->base_draw.area_full; + layer_sw_ctx->base_draw.area_act.y2 = layer_sw_ctx->base_draw.area_full.y1; + lv_coord_t w = lv_area_get_width(&layer_sw_ctx->base_draw.area_act); + layer_sw_ctx->base_draw.max_row_with_alpha = layer_sw_ctx->buf_size_bytes / w / LV_IMG_PX_SIZE_ALPHA_BYTE; + layer_sw_ctx->base_draw.max_row_with_no_alpha = layer_sw_ctx->buf_size_bytes / w / sizeof(lv_color_t); + } + else { + layer_sw_ctx->base_draw.area_act = layer_sw_ctx->base_draw.area_full; + layer_sw_ctx->buf_size_bytes = lv_area_get_size(&layer_sw_ctx->base_draw.area_full) * px_size; + layer_sw_ctx->base_draw.buf = lv_mem_alloc(layer_sw_ctx->buf_size_bytes); + lv_memset_00(layer_sw_ctx->base_draw.buf, layer_sw_ctx->buf_size_bytes); + layer_sw_ctx->has_alpha = flags & LV_DRAW_LAYER_FLAG_HAS_ALPHA ? 1 : 0; + if(layer_sw_ctx->base_draw.buf == NULL) { + return NULL; + } + + draw_ctx->buf = layer_sw_ctx->base_draw.buf; + draw_ctx->buf_area = &layer_sw_ctx->base_draw.area_act; + draw_ctx->clip_area = &layer_sw_ctx->base_draw.area_act; + + lv_disp_t * disp_refr = _lv_refr_get_disp_refreshing(); + disp_refr->driver->screen_transp = flags & LV_DRAW_LAYER_FLAG_HAS_ALPHA ? 1 : 0; + } + + return layer_ctx; +} + +void lv_draw_sw_layer_adjust(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx, + lv_draw_layer_flags_t flags) +{ + + lv_draw_sw_layer_ctx_t * layer_sw_ctx = (lv_draw_sw_layer_ctx_t *) layer_ctx; + lv_disp_t * disp_refr = _lv_refr_get_disp_refreshing(); + if(flags & LV_DRAW_LAYER_FLAG_HAS_ALPHA) { + lv_memset_00(layer_ctx->buf, layer_sw_ctx->buf_size_bytes); + layer_sw_ctx->has_alpha = 1; + disp_refr->driver->screen_transp = 1; + } + else { + layer_sw_ctx->has_alpha = 0; + disp_refr->driver->screen_transp = 0; + } + + draw_ctx->buf = layer_ctx->buf; + draw_ctx->buf_area = &layer_ctx->area_act; + draw_ctx->clip_area = &layer_ctx->area_act; +} + +void lv_draw_sw_layer_blend(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx, + const lv_draw_img_dsc_t * draw_dsc) +{ + lv_draw_sw_layer_ctx_t * layer_sw_ctx = (lv_draw_sw_layer_ctx_t *) layer_ctx; + + lv_img_dsc_t img; + img.data = draw_ctx->buf; + img.header.always_zero = 0; + img.header.w = lv_area_get_width(draw_ctx->buf_area); + img.header.h = lv_area_get_height(draw_ctx->buf_area); + img.header.cf = layer_sw_ctx->has_alpha ? LV_IMG_CF_TRUE_COLOR_ALPHA : LV_IMG_CF_TRUE_COLOR; + + /*Restore the original draw_ctx*/ + draw_ctx->buf = layer_ctx->original.buf; + draw_ctx->buf_area = layer_ctx->original.buf_area; + draw_ctx->clip_area = layer_ctx->original.clip_area; + lv_disp_t * disp_refr = _lv_refr_get_disp_refreshing(); + disp_refr->driver->screen_transp = layer_ctx->original.screen_transp; + + /*Blend the layer*/ + lv_draw_img(draw_ctx, draw_dsc, &layer_ctx->area_act, &img); + lv_draw_wait_for_finish(draw_ctx); + lv_img_cache_invalidate_src(&img); +} + +void lv_draw_sw_layer_destroy(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx) +{ + LV_UNUSED(draw_ctx); + + lv_mem_free(layer_ctx->buf); +} + + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_letter.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_letter.c new file mode 100644 index 0000000..9522888 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_letter.c @@ -0,0 +1,573 @@ +/** + * @file lv_draw_sw_letter.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw.h" +#include "../../hal/lv_hal_disp.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_area.h" +#include "../../misc/lv_style.h" +#include "../../font/lv_font.h" +#include "../../core/lv_refr.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +LV_ATTRIBUTE_FAST_MEM static void draw_letter_normal(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, + const lv_point_t * pos, lv_font_glyph_dsc_t * g, const uint8_t * map_p); + + +#if LV_DRAW_COMPLEX && LV_USE_FONT_SUBPX +static void draw_letter_subpx(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos, + lv_font_glyph_dsc_t * g, const uint8_t * map_p); +#endif /*LV_DRAW_COMPLEX && LV_USE_FONT_SUBPX*/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ + +const uint8_t _lv_bpp1_opa_table[2] = {0, 255}; /*Opacity mapping with bpp = 1 (Just for compatibility)*/ +const uint8_t _lv_bpp2_opa_table[4] = {0, 85, 170, 255}; /*Opacity mapping with bpp = 2*/ + +const uint8_t _lv_bpp3_opa_table[8] = {0, 36, 73, 109, /*Opacity mapping with bpp = 3*/ + 146, 182, 219, 255 + }; + +const uint8_t _lv_bpp4_opa_table[16] = {0, 17, 34, 51, /*Opacity mapping with bpp = 4*/ + 68, 85, 102, 119, + 136, 153, 170, 187, + 204, 221, 238, 255 + }; + +const uint8_t _lv_bpp8_opa_table[256] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 + }; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Draw a letter in the Virtual Display Buffer + * @param pos_p left-top coordinate of the latter + * @param mask_p the letter will be drawn only on this area (truncated to draw_buf area) + * @param font_p pointer to font + * @param letter a letter to draw + * @param color color of letter + * @param opa opacity of letter (0..255) + */ +void lv_draw_sw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, + uint32_t letter) +{ + lv_font_glyph_dsc_t g; + bool g_ret = lv_font_get_glyph_dsc(dsc->font, &g, letter, '\0'); + if(g_ret == false) { + /*Add warning if the dsc is not found + *but do not print warning for non printable ASCII chars (e.g. '\n')*/ + if(letter >= 0x20 && + letter != 0xf8ff && /*LV_SYMBOL_DUMMY*/ + letter != 0x200c) { /*ZERO WIDTH NON-JOINER*/ + LV_LOG_WARN("lv_draw_letter: glyph dsc. not found for U+%" PRIX32, letter); + +#if LV_USE_FONT_PLACEHOLDER + /* draw placeholder */ + lv_area_t glyph_coords; + lv_draw_rect_dsc_t glyph_dsc; + lv_coord_t begin_x = pos_p->x + g.ofs_x; + lv_coord_t begin_y = pos_p->y + g.ofs_y; + lv_area_set(&glyph_coords, begin_x, begin_y, begin_x + g.box_w, begin_y + g.box_h); + lv_draw_rect_dsc_init(&glyph_dsc); + glyph_dsc.bg_opa = LV_OPA_MIN; + glyph_dsc.outline_opa = LV_OPA_MIN; + glyph_dsc.shadow_opa = LV_OPA_MIN; + glyph_dsc.bg_img_opa = LV_OPA_MIN; + glyph_dsc.border_color = dsc->color; + glyph_dsc.border_width = 1; + draw_ctx->draw_rect(draw_ctx, &glyph_dsc, &glyph_coords); +#endif + } + return; + } + + /*Don't draw anything if the character is empty. E.g. space*/ + if((g.box_h == 0) || (g.box_w == 0)) return; + + lv_point_t gpos; + gpos.x = pos_p->x + g.ofs_x; + gpos.y = pos_p->y + (dsc->font->line_height - dsc->font->base_line) - g.box_h - g.ofs_y; + + /*If the letter is completely out of mask don't draw it*/ + if(gpos.x + g.box_w < draw_ctx->clip_area->x1 || + gpos.x > draw_ctx->clip_area->x2 || + gpos.y + g.box_h < draw_ctx->clip_area->y1 || + gpos.y > draw_ctx->clip_area->y2) { + return; + } + + const uint8_t * map_p = lv_font_get_glyph_bitmap(g.resolved_font, letter); + if(map_p == NULL) { + LV_LOG_WARN("lv_draw_letter: character's bitmap not found"); + return; + } + + if(g.resolved_font->subpx) { +#if LV_DRAW_COMPLEX && LV_USE_FONT_SUBPX + draw_letter_subpx(draw_ctx, dsc, &gpos, &g, map_p); +#else + LV_LOG_WARN("Can't draw sub-pixel rendered letter because LV_USE_FONT_SUBPX == 0 in lv_conf.h"); +#endif + } + else { + draw_letter_normal(draw_ctx, dsc, &gpos, &g, map_p); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +LV_ATTRIBUTE_FAST_MEM static void draw_letter_normal(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, + const lv_point_t * pos, lv_font_glyph_dsc_t * g, const uint8_t * map_p) +{ + + const uint8_t * bpp_opa_table_p; + uint32_t bitmask_init; + uint32_t bitmask; + uint32_t bpp = g->bpp; + lv_opa_t opa = dsc->opa; + uint32_t shades; + if(bpp == 3) bpp = 4; + +#if LV_USE_IMGFONT + if(bpp == LV_IMGFONT_BPP) { //is imgfont + lv_area_t fill_area; + fill_area.x1 = pos->x; + fill_area.y1 = pos->y; + fill_area.x2 = pos->x + g->box_w - 1; + fill_area.y2 = pos->y + g->box_h - 1; + lv_draw_img_dsc_t img_dsc; + lv_draw_img_dsc_init(&img_dsc); + img_dsc.angle = 0; + img_dsc.zoom = LV_IMG_ZOOM_NONE; + img_dsc.opa = dsc->opa; + img_dsc.blend_mode = dsc->blend_mode; + lv_draw_img(draw_ctx, &img_dsc, &fill_area, map_p); + return; + } +#endif + + switch(bpp) { + case 1: + bpp_opa_table_p = _lv_bpp1_opa_table; + bitmask_init = 0x80; + shades = 2; + break; + case 2: + bpp_opa_table_p = _lv_bpp2_opa_table; + bitmask_init = 0xC0; + shades = 4; + break; + case 4: + bpp_opa_table_p = _lv_bpp4_opa_table; + bitmask_init = 0xF0; + shades = 16; + break; + case 8: + bpp_opa_table_p = _lv_bpp8_opa_table; + bitmask_init = 0xFF; + shades = 256; + break; /*No opa table, pixel value will be used directly*/ + default: + LV_LOG_WARN("lv_draw_letter: invalid bpp"); + return; /*Invalid bpp. Can't render the letter*/ + } + + static lv_opa_t opa_table[256]; + static lv_opa_t prev_opa = LV_OPA_TRANSP; + static uint32_t prev_bpp = 0; + if(opa < LV_OPA_MAX) { + if(prev_opa != opa || prev_bpp != bpp) { + uint32_t i; + for(i = 0; i < shades; i++) { + opa_table[i] = bpp_opa_table_p[i] == LV_OPA_COVER ? opa : ((bpp_opa_table_p[i] * opa) >> 8); + } + } + bpp_opa_table_p = opa_table; + prev_opa = opa; + prev_bpp = bpp; + } + + int32_t col, row; + int32_t box_w = g->box_w; + int32_t box_h = g->box_h; + int32_t width_bit = box_w * bpp; /*Letter width in bits*/ + + /*Calculate the col/row start/end on the map*/ + int32_t col_start = pos->x >= draw_ctx->clip_area->x1 ? 0 : draw_ctx->clip_area->x1 - pos->x; + int32_t col_end = pos->x + box_w <= draw_ctx->clip_area->x2 ? box_w : draw_ctx->clip_area->x2 - pos->x + 1; + int32_t row_start = pos->y >= draw_ctx->clip_area->y1 ? 0 : draw_ctx->clip_area->y1 - pos->y; + int32_t row_end = pos->y + box_h <= draw_ctx->clip_area->y2 ? box_h : draw_ctx->clip_area->y2 - pos->y + 1; + + /*Move on the map too*/ + uint32_t bit_ofs = (row_start * width_bit) + (col_start * bpp); + map_p += bit_ofs >> 3; + + uint8_t letter_px; + uint32_t col_bit; + col_bit = bit_ofs & 0x7; /*"& 0x7" equals to "% 8" just faster*/ + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memset_00(&blend_dsc, sizeof(blend_dsc)); + blend_dsc.color = dsc->color; + blend_dsc.opa = dsc->opa; + blend_dsc.blend_mode = dsc->blend_mode; + + lv_coord_t hor_res = lv_disp_get_hor_res(_lv_refr_get_disp_refreshing()); + uint32_t mask_buf_size = box_w * box_h > hor_res ? hor_res : box_w * box_h; + lv_opa_t * mask_buf = lv_mem_buf_get(mask_buf_size); + blend_dsc.mask_buf = mask_buf; + int32_t mask_p = 0; + + lv_area_t fill_area; + fill_area.x1 = col_start + pos->x; + fill_area.x2 = col_end + pos->x - 1; + fill_area.y1 = row_start + pos->y; + fill_area.y2 = fill_area.y1; +#if LV_DRAW_COMPLEX + lv_coord_t fill_w = lv_area_get_width(&fill_area); + lv_area_t mask_area; + lv_area_copy(&mask_area, &fill_area); + mask_area.y2 = mask_area.y1 + row_end; + bool mask_any = lv_draw_mask_is_any(&mask_area); +#endif + blend_dsc.blend_area = &fill_area; + blend_dsc.mask_area = &fill_area; + + uint32_t col_bit_max = 8 - bpp; + uint32_t col_bit_row_ofs = (box_w + col_start - col_end) * bpp; + + for(row = row_start ; row < row_end; row++) { +#if LV_DRAW_COMPLEX + int32_t mask_p_start = mask_p; +#endif + bitmask = bitmask_init >> col_bit; + for(col = col_start; col < col_end; col++) { + /*Load the pixel's opacity into the mask*/ + letter_px = (*map_p & bitmask) >> (col_bit_max - col_bit); + if(letter_px) { + mask_buf[mask_p] = bpp_opa_table_p[letter_px]; + } + else { + mask_buf[mask_p] = 0; + } + + /*Go to the next column*/ + if(col_bit < col_bit_max) { + col_bit += bpp; + bitmask = bitmask >> bpp; + } + else { + col_bit = 0; + bitmask = bitmask_init; + map_p++; + } + + /*Next mask byte*/ + mask_p++; + } + +#if LV_DRAW_COMPLEX + /*Apply masks if any*/ + if(mask_any) { + blend_dsc.mask_res = lv_draw_mask_apply(mask_buf + mask_p_start, fill_area.x1, fill_area.y2, + fill_w); + if(blend_dsc.mask_res == LV_DRAW_MASK_RES_TRANSP) { + lv_memset_00(mask_buf + mask_p_start, fill_w); + } + } +#endif + + if((uint32_t) mask_p + (col_end - col_start) < mask_buf_size) { + fill_area.y2 ++; + } + else { + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + + fill_area.y1 = fill_area.y2 + 1; + fill_area.y2 = fill_area.y1; + mask_p = 0; + } + + col_bit += col_bit_row_ofs; + map_p += (col_bit >> 3); + col_bit = col_bit & 0x7; + } + + /*Flush the last part*/ + if(fill_area.y1 != fill_area.y2) { + fill_area.y2--; + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + mask_p = 0; + } + + lv_mem_buf_release(mask_buf); +} + +#if LV_DRAW_COMPLEX && LV_USE_FONT_SUBPX +static void draw_letter_subpx(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos, + lv_font_glyph_dsc_t * g, const uint8_t * map_p) +{ + const uint8_t * bpp_opa_table; + uint32_t bitmask_init; + uint32_t bitmask; + uint32_t bpp = g->bpp; + lv_opa_t opa = dsc->opa; + if(bpp == 3) bpp = 4; + + switch(bpp) { + case 1: + bpp_opa_table = _lv_bpp1_opa_table; + bitmask_init = 0x80; + break; + case 2: + bpp_opa_table = _lv_bpp2_opa_table; + bitmask_init = 0xC0; + break; + case 4: + bpp_opa_table = _lv_bpp4_opa_table; + bitmask_init = 0xF0; + break; + case 8: + bpp_opa_table = _lv_bpp8_opa_table; + bitmask_init = 0xFF; + break; /*No opa table, pixel value will be used directly*/ + default: + LV_LOG_WARN("lv_draw_letter: invalid bpp not found"); + return; /*Invalid bpp. Can't render the letter*/ + } + + int32_t col, row; + + int32_t box_w = g->box_w; + int32_t box_h = g->box_h; + int32_t width_bit = box_w * bpp; /*Letter width in bits*/ + + /*Calculate the col/row start/end on the map*/ + int32_t col_start = pos->x >= draw_ctx->clip_area->x1 ? 0 : (draw_ctx->clip_area->x1 - pos->x) * 3; + int32_t col_end = pos->x + box_w / 3 <= draw_ctx->clip_area->x2 ? box_w : (draw_ctx->clip_area->x2 - pos->x + 1) * 3; + int32_t row_start = pos->y >= draw_ctx->clip_area->y1 ? 0 : draw_ctx->clip_area->y1 - pos->y; + int32_t row_end = pos->y + box_h <= draw_ctx->clip_area->y2 ? box_h : draw_ctx->clip_area->y2 - pos->y + 1; + + /*Move on the map too*/ + int32_t bit_ofs = (row_start * width_bit) + (col_start * bpp); + map_p += bit_ofs >> 3; + + uint8_t letter_px; + lv_opa_t px_opa; + int32_t col_bit; + col_bit = bit_ofs & 0x7; /*"& 0x7" equals to "% 8" just faster*/ + + lv_area_t map_area; + map_area.x1 = col_start / 3 + pos->x; + map_area.x2 = col_end / 3 + pos->x - 1; + map_area.y1 = row_start + pos->y; + map_area.y2 = map_area.y1; + + if(map_area.x2 <= map_area.x1) return; + + lv_coord_t hor_res = lv_disp_get_hor_res(_lv_refr_get_disp_refreshing()); + int32_t mask_buf_size = box_w * box_h > hor_res ? hor_res : g->box_w * g->box_h; + lv_opa_t * mask_buf = lv_mem_buf_get(mask_buf_size); + int32_t mask_p = 0; + + lv_color_t * color_buf = lv_mem_buf_get(mask_buf_size * sizeof(lv_color_t)); + + int32_t dest_buf_stride = lv_area_get_width(draw_ctx->buf_area); + lv_color_t * dest_buf_tmp = draw_ctx->buf; + + /*Set a pointer on draw_buf to the first pixel of the letter*/ + dest_buf_tmp += ((pos->y - draw_ctx->buf_area->y1) * dest_buf_stride) + pos->x - draw_ctx->buf_area->x1; + + /*If the letter is partially out of mask the move there on draw_buf*/ + dest_buf_tmp += (row_start * dest_buf_stride) + col_start / 3; + + lv_area_t mask_area; + lv_area_copy(&mask_area, &map_area); + mask_area.y2 = mask_area.y1 + row_end; + bool mask_any = lv_draw_mask_is_any(&map_area); + uint8_t font_rgb[3]; + + lv_color_t color = dsc->color; +#if LV_COLOR_16_SWAP == 0 + uint8_t txt_rgb[3] = {color.ch.red, color.ch.green, color.ch.blue}; +#else + uint8_t txt_rgb[3] = {color.ch.red, (color.ch.green_h << 3) + color.ch.green_l, color.ch.blue}; +#endif + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memset_00(&blend_dsc, sizeof(blend_dsc)); + blend_dsc.blend_area = &map_area; + blend_dsc.mask_area = &map_area; + blend_dsc.src_buf = color_buf; + blend_dsc.mask_buf = mask_buf; + blend_dsc.opa = opa; + blend_dsc.blend_mode = dsc->blend_mode; + + for(row = row_start ; row < row_end; row++) { + uint32_t subpx_cnt = 0; + bitmask = bitmask_init >> col_bit; + int32_t mask_p_start = mask_p; + + for(col = col_start; col < col_end; col++) { + /*Load the pixel's opacity into the mask*/ + letter_px = (*map_p & bitmask) >> (8 - col_bit - bpp); + if(letter_px != 0) { + if(opa >= LV_OPA_MAX) { + px_opa = bpp == 8 ? letter_px : bpp_opa_table[letter_px]; + } + else { + px_opa = bpp == 8 ? (uint32_t)((uint32_t)letter_px * opa) >> 8 + : (uint32_t)((uint32_t)bpp_opa_table[letter_px] * opa) >> 8; + } + } + else { + px_opa = 0; + } + + font_rgb[subpx_cnt] = px_opa; + + subpx_cnt ++; + if(subpx_cnt == 3) { + subpx_cnt = 0; + + lv_color_t res_color; +#if LV_COLOR_16_SWAP == 0 + uint8_t bg_rgb[3] = {dest_buf_tmp->ch.red, dest_buf_tmp->ch.green, dest_buf_tmp->ch.blue}; +#else + uint8_t bg_rgb[3] = {dest_buf_tmp->ch.red, + (dest_buf_tmp->ch.green_h << 3) + dest_buf_tmp->ch.green_l, + dest_buf_tmp->ch.blue + }; +#endif + +#if LV_FONT_SUBPX_BGR + res_color.ch.blue = (uint32_t)((uint32_t)txt_rgb[0] * font_rgb[0] + (bg_rgb[0] * (255 - font_rgb[0]))) >> 8; + res_color.ch.red = (uint32_t)((uint32_t)txt_rgb[2] * font_rgb[2] + (bg_rgb[2] * (255 - font_rgb[2]))) >> 8; +#else + res_color.ch.red = (uint32_t)((uint16_t)txt_rgb[0] * font_rgb[0] + (bg_rgb[0] * (255 - font_rgb[0]))) >> 8; + res_color.ch.blue = (uint32_t)((uint16_t)txt_rgb[2] * font_rgb[2] + (bg_rgb[2] * (255 - font_rgb[2]))) >> 8; +#endif + +#if LV_COLOR_16_SWAP == 0 + res_color.ch.green = (uint32_t)((uint32_t)txt_rgb[1] * font_rgb[1] + (bg_rgb[1] * (255 - font_rgb[1]))) >> 8; +#else + uint8_t green = (uint32_t)((uint32_t)txt_rgb[1] * font_rgb[1] + (bg_rgb[1] * (255 - font_rgb[1]))) >> 8; + res_color.ch.green_h = green >> 3; + res_color.ch.green_l = green & 0x7; +#endif + +#if LV_COLOR_DEPTH == 32 + res_color.ch.alpha = 0xff; +#endif + + if(font_rgb[0] == 0 && font_rgb[1] == 0 && font_rgb[2] == 0) mask_buf[mask_p] = LV_OPA_TRANSP; + else mask_buf[mask_p] = LV_OPA_COVER; + color_buf[mask_p] = res_color; + + /*Next mask byte*/ + mask_p++; + dest_buf_tmp++; + } + + /*Go to the next column*/ + if(col_bit < (int32_t)(8 - bpp)) { + col_bit += bpp; + bitmask = bitmask >> bpp; + } + else { + col_bit = 0; + bitmask = bitmask_init; + map_p++; + } + } + + /*Apply masks if any*/ + if(mask_any) { + blend_dsc.mask_res = lv_draw_mask_apply(mask_buf + mask_p_start, map_area.x1, map_area.y2, + lv_area_get_width(&map_area)); + if(blend_dsc.mask_res == LV_DRAW_MASK_RES_TRANSP) { + lv_memset_00(mask_buf + mask_p_start, lv_area_get_width(&map_area)); + } + } + + if((int32_t) mask_p + (col_end - col_start) < mask_buf_size) { + map_area.y2 ++; + } + else { + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + + map_area.y1 = map_area.y2 + 1; + map_area.y2 = map_area.y1; + mask_p = 0; + } + + col_bit += ((box_w - col_end) + col_start) * bpp; + + map_p += (col_bit >> 3); + col_bit = col_bit & 0x7; + + /*Next row in draw_buf*/ + dest_buf_tmp += dest_buf_stride - (col_end - col_start) / 3; + } + + /*Flush the last part*/ + if(map_area.y1 != map_area.y2) { + map_area.y2--; + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + + lv_mem_buf_release(mask_buf); + lv_mem_buf_release(color_buf); +} +#endif /*LV_DRAW_COMPLEX && LV_USE_FONT_SUBPX*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_line.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_line.c new file mode 100644 index 0000000..73833c1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_line.c @@ -0,0 +1,443 @@ +/** + * @file lv_draw_line.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include +#include "lv_draw_sw.h" +#include "../../misc/lv_math.h" +#include "../../core/lv_refr.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +LV_ATTRIBUTE_FAST_MEM static void draw_line_skew(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, + const lv_point_t * point1, const lv_point_t * point2); +LV_ATTRIBUTE_FAST_MEM static void draw_line_hor(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, + const lv_point_t * point1, const lv_point_t * point2); +LV_ATTRIBUTE_FAST_MEM static void draw_line_ver(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, + const lv_point_t * point1, const lv_point_t * point2); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Draw a line + * @param point1 first point of the line + * @param point2 second point of the line + * @param clip the line will be drawn only in this area + * @param dsc pointer to an initialized `lv_draw_line_dsc_t` variable + */ +LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, + const lv_point_t * point1, const lv_point_t * point2) +{ + if(dsc->width == 0) return; + if(dsc->opa <= LV_OPA_MIN) return; + + if(point1->x == point2->x && point1->y == point2->y) return; + + lv_area_t clip_line; + clip_line.x1 = LV_MIN(point1->x, point2->x) - dsc->width / 2; + clip_line.x2 = LV_MAX(point1->x, point2->x) + dsc->width / 2; + clip_line.y1 = LV_MIN(point1->y, point2->y) - dsc->width / 2; + clip_line.y2 = LV_MAX(point1->y, point2->y) + dsc->width / 2; + + bool is_common; + is_common = _lv_area_intersect(&clip_line, &clip_line, draw_ctx->clip_area); + if(!is_common) return; + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + draw_ctx->clip_area = &clip_line; + + if(point1->y == point2->y) draw_line_hor(draw_ctx, dsc, point1, point2); + else if(point1->x == point2->x) draw_line_ver(draw_ctx, dsc, point1, point2); + else draw_line_skew(draw_ctx, dsc, point1, point2); + + if(dsc->round_end || dsc->round_start) { + lv_draw_rect_dsc_t cir_dsc; + lv_draw_rect_dsc_init(&cir_dsc); + cir_dsc.bg_color = dsc->color; + cir_dsc.radius = LV_RADIUS_CIRCLE; + cir_dsc.bg_opa = dsc->opa; + + int32_t r = (dsc->width >> 1); + int32_t r_corr = (dsc->width & 1) ? 0 : 1; + lv_area_t cir_area; + + if(dsc->round_start) { + cir_area.x1 = point1->x - r; + cir_area.y1 = point1->y - r; + cir_area.x2 = point1->x + r - r_corr; + cir_area.y2 = point1->y + r - r_corr ; + lv_draw_rect(draw_ctx, &cir_dsc, &cir_area); + } + + if(dsc->round_end) { + cir_area.x1 = point2->x - r; + cir_area.y1 = point2->y - r; + cir_area.x2 = point2->x + r - r_corr; + cir_area.y2 = point2->y + r - r_corr ; + lv_draw_rect(draw_ctx, &cir_dsc, &cir_area); + } + } + + draw_ctx->clip_area = clip_area_ori; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + + +LV_ATTRIBUTE_FAST_MEM static void draw_line_hor(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, + const lv_point_t * point1, const lv_point_t * point2) +{ + int32_t w = dsc->width - 1; + int32_t w_half0 = w >> 1; + int32_t w_half1 = w_half0 + (w & 0x1); /*Compensate rounding error*/ + + lv_area_t blend_area; + blend_area.x1 = LV_MIN(point1->x, point2->x); + blend_area.x2 = LV_MAX(point1->x, point2->x) - 1; + blend_area.y1 = point1->y - w_half1; + blend_area.y2 = point1->y + w_half0; + + bool is_common; + is_common = _lv_area_intersect(&blend_area, &blend_area, draw_ctx->clip_area); + if(!is_common) return; + + bool dashed = dsc->dash_gap && dsc->dash_width ? true : false; + bool simple_mode = true; + if(lv_draw_mask_is_any(&blend_area)) simple_mode = false; + else if(dashed) simple_mode = false; + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memset_00(&blend_dsc, sizeof(blend_dsc)); + blend_dsc.blend_area = &blend_area; + blend_dsc.color = dsc->color; + blend_dsc.opa = dsc->opa; + + /*If there is no mask then simply draw a rectangle*/ + if(simple_mode) { + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } +#if LV_DRAW_COMPLEX + /*If there other mask apply it*/ + else { + + int32_t blend_area_w = lv_area_get_width(&blend_area); + + lv_coord_t y2 = blend_area.y2; + blend_area.y2 = blend_area.y1; + + lv_coord_t dash_start = 0; + if(dashed) { + dash_start = (blend_area.x1) % (dsc->dash_gap + dsc->dash_width); + } + + lv_opa_t * mask_buf = lv_mem_buf_get(blend_area_w); + blend_dsc.mask_buf = mask_buf; + blend_dsc.mask_area = &blend_area; + int32_t h; + for(h = blend_area.y1; h <= y2; h++) { + lv_memset_ff(mask_buf, blend_area_w); + blend_dsc.mask_res = lv_draw_mask_apply(mask_buf, blend_area.x1, h, blend_area_w); + + if(dashed) { + if(blend_dsc.mask_res != LV_DRAW_MASK_RES_TRANSP) { + lv_coord_t dash_cnt = dash_start; + lv_coord_t i; + for(i = 0; i < blend_area_w; i++, dash_cnt++) { + if(dash_cnt <= dsc->dash_width) { + int16_t diff = dsc->dash_width - dash_cnt; + i += diff; + dash_cnt += diff; + } + else if(dash_cnt >= dsc->dash_gap + dsc->dash_width) { + dash_cnt = 0; + } + else { + mask_buf[i] = 0x00; + } + } + + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + } + } + + lv_draw_sw_blend(draw_ctx, &blend_dsc); + + blend_area.y1++; + blend_area.y2++; + } + lv_mem_buf_release(mask_buf); + } +#endif /*LV_DRAW_COMPLEX*/ +} + +LV_ATTRIBUTE_FAST_MEM static void draw_line_ver(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, + const lv_point_t * point1, const lv_point_t * point2) +{ + int32_t w = dsc->width - 1; + int32_t w_half0 = w >> 1; + int32_t w_half1 = w_half0 + (w & 0x1); /*Compensate rounding error*/ + + lv_area_t blend_area; + blend_area.x1 = point1->x - w_half1; + blend_area.x2 = point1->x + w_half0; + blend_area.y1 = LV_MIN(point1->y, point2->y); + blend_area.y2 = LV_MAX(point1->y, point2->y) - 1; + + bool is_common; + is_common = _lv_area_intersect(&blend_area, &blend_area, draw_ctx->clip_area); + if(!is_common) return; + + bool dashed = dsc->dash_gap && dsc->dash_width ? true : false; + bool simple_mode = true; + if(lv_draw_mask_is_any(&blend_area)) simple_mode = false; + else if(dashed) simple_mode = false; + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memset_00(&blend_dsc, sizeof(blend_dsc)); + blend_dsc.blend_area = &blend_area; + blend_dsc.color = dsc->color; + blend_dsc.opa = dsc->opa; + + /*If there is no mask then simply draw a rectangle*/ + if(simple_mode) { + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + +#if LV_DRAW_COMPLEX + /*If there other mask apply it*/ + else { + int32_t draw_area_w = lv_area_get_width(&blend_area); + + lv_coord_t y2 = blend_area.y2; + blend_area.y2 = blend_area.y1; + + lv_opa_t * mask_buf = lv_mem_buf_get(draw_area_w); + blend_dsc.mask_buf = mask_buf; + blend_dsc.mask_area = &blend_area; + + lv_coord_t dash_start = 0; + if(dashed) { + dash_start = (blend_area.y1) % (dsc->dash_gap + dsc->dash_width); + } + + lv_coord_t dash_cnt = dash_start; + + int32_t h; + for(h = blend_area.y1; h <= y2; h++) { + lv_memset_ff(mask_buf, draw_area_w); + blend_dsc.mask_res = lv_draw_mask_apply(mask_buf, blend_area.x1, h, draw_area_w); + + if(dashed) { + if(blend_dsc.mask_res != LV_DRAW_MASK_RES_TRANSP) { + if(dash_cnt > dsc->dash_width) { + blend_dsc.mask_res = LV_DRAW_MASK_RES_TRANSP; + } + + if(dash_cnt >= dsc->dash_gap + dsc->dash_width) { + dash_cnt = 0; + } + } + dash_cnt ++; + } + + lv_draw_sw_blend(draw_ctx, &blend_dsc); + + blend_area.y1++; + blend_area.y2++; + } + lv_mem_buf_release(mask_buf); + } +#endif /*LV_DRAW_COMPLEX*/ +} + +LV_ATTRIBUTE_FAST_MEM static void draw_line_skew(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, + const lv_point_t * point1, const lv_point_t * point2) +{ +#if LV_DRAW_COMPLEX + /*Keep the great y in p1*/ + lv_point_t p1; + lv_point_t p2; + if(point1->y < point2->y) { + p1.y = point1->y; + p2.y = point2->y; + p1.x = point1->x; + p2.x = point2->x; + } + else { + p1.y = point2->y; + p2.y = point1->y; + p1.x = point2->x; + p2.x = point1->x; + } + + int32_t xdiff = p2.x - p1.x; + int32_t ydiff = p2.y - p1.y; + bool flat = LV_ABS(xdiff) > LV_ABS(ydiff) ? true : false; + + static const uint8_t wcorr[] = { + 128, 128, 128, 129, 129, 130, 130, 131, + 132, 133, 134, 135, 137, 138, 140, 141, + 143, 145, 147, 149, 151, 153, 155, 158, + 160, 162, 165, 167, 170, 173, 175, 178, + 181, + }; + + int32_t w = dsc->width; + int32_t wcorr_i = 0; + if(flat) wcorr_i = (LV_ABS(ydiff) << 5) / LV_ABS(xdiff); + else wcorr_i = (LV_ABS(xdiff) << 5) / LV_ABS(ydiff); + + w = (w * wcorr[wcorr_i] + 63) >> 7; /*+ 63 for rounding*/ + int32_t w_half0 = w >> 1; + int32_t w_half1 = w_half0 + (w & 0x1); /*Compensate rounding error*/ + + lv_area_t blend_area; + blend_area.x1 = LV_MIN(p1.x, p2.x) - w; + blend_area.x2 = LV_MAX(p1.x, p2.x) + w; + blend_area.y1 = LV_MIN(p1.y, p2.y) - w; + blend_area.y2 = LV_MAX(p1.y, p2.y) + w; + + /*Get the union of `coords` and `clip`*/ + /*`clip` is already truncated to the `draw_buf` size + *in 'lv_refr_area' function*/ + bool is_common = _lv_area_intersect(&blend_area, &blend_area, draw_ctx->clip_area); + if(is_common == false) return; + + lv_draw_mask_line_param_t mask_left_param; + lv_draw_mask_line_param_t mask_right_param; + lv_draw_mask_line_param_t mask_top_param; + lv_draw_mask_line_param_t mask_bottom_param; + + if(flat) { + if(xdiff > 0) { + lv_draw_mask_line_points_init(&mask_left_param, p1.x, p1.y - w_half0, p2.x, p2.y - w_half0, + LV_DRAW_MASK_LINE_SIDE_LEFT); + lv_draw_mask_line_points_init(&mask_right_param, p1.x, p1.y + w_half1, p2.x, p2.y + w_half1, + LV_DRAW_MASK_LINE_SIDE_RIGHT); + } + else { + lv_draw_mask_line_points_init(&mask_left_param, p1.x, p1.y + w_half1, p2.x, p2.y + w_half1, + LV_DRAW_MASK_LINE_SIDE_LEFT); + lv_draw_mask_line_points_init(&mask_right_param, p1.x, p1.y - w_half0, p2.x, p2.y - w_half0, + LV_DRAW_MASK_LINE_SIDE_RIGHT); + } + } + else { + lv_draw_mask_line_points_init(&mask_left_param, p1.x + w_half1, p1.y, p2.x + w_half1, p2.y, + LV_DRAW_MASK_LINE_SIDE_LEFT); + lv_draw_mask_line_points_init(&mask_right_param, p1.x - w_half0, p1.y, p2.x - w_half0, p2.y, + LV_DRAW_MASK_LINE_SIDE_RIGHT); + } + + /*Use the normal vector for the endings*/ + + int16_t mask_left_id = lv_draw_mask_add(&mask_left_param, NULL); + int16_t mask_right_id = lv_draw_mask_add(&mask_right_param, NULL); + int16_t mask_top_id = LV_MASK_ID_INV; + int16_t mask_bottom_id = LV_MASK_ID_INV; + + if(!dsc->raw_end) { + lv_draw_mask_line_points_init(&mask_top_param, p1.x, p1.y, p1.x - ydiff, p1.y + xdiff, LV_DRAW_MASK_LINE_SIDE_BOTTOM); + lv_draw_mask_line_points_init(&mask_bottom_param, p2.x, p2.y, p2.x - ydiff, p2.y + xdiff, LV_DRAW_MASK_LINE_SIDE_TOP); + mask_top_id = lv_draw_mask_add(&mask_top_param, NULL); + mask_bottom_id = lv_draw_mask_add(&mask_bottom_param, NULL); + } + + /*The real draw area is around the line. + *It's easy to calculate with steep lines, but the area can be very wide with very flat lines. + *So deal with it only with steep lines.*/ + int32_t draw_area_w = lv_area_get_width(&blend_area); + + /*Draw the background line by line*/ + int32_t h; + uint32_t hor_res = (uint32_t)lv_disp_get_hor_res(_lv_refr_get_disp_refreshing()); + size_t mask_buf_size = LV_MIN(lv_area_get_size(&blend_area), hor_res); + lv_opa_t * mask_buf = lv_mem_buf_get(mask_buf_size); + + lv_coord_t y2 = blend_area.y2; + blend_area.y2 = blend_area.y1; + + uint32_t mask_p = 0; + lv_memset_ff(mask_buf, mask_buf_size); + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memset_00(&blend_dsc, sizeof(blend_dsc)); + blend_dsc.blend_area = &blend_area; + blend_dsc.color = dsc->color; + blend_dsc.opa = dsc->opa; + blend_dsc.mask_buf = mask_buf; + blend_dsc.mask_area = &blend_area; + + /*Fill the first row with 'color'*/ + for(h = blend_area.y1; h <= y2; h++) { + blend_dsc.mask_res = lv_draw_mask_apply(&mask_buf[mask_p], blend_area.x1, h, draw_area_w); + if(blend_dsc.mask_res == LV_DRAW_MASK_RES_TRANSP) { + lv_memset_00(&mask_buf[mask_p], draw_area_w); + } + + mask_p += draw_area_w; + if((uint32_t) mask_p + draw_area_w < mask_buf_size) { + blend_area.y2 ++; + } + else { + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + + blend_area.y1 = blend_area.y2 + 1; + blend_area.y2 = blend_area.y1; + mask_p = 0; + lv_memset_ff(mask_buf, mask_buf_size); + } + } + + /*Flush the last part*/ + if(blend_area.y1 != blend_area.y2) { + blend_area.y2--; + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + + lv_mem_buf_release(mask_buf); + + lv_draw_mask_free_param(&mask_left_param); + lv_draw_mask_free_param(&mask_right_param); + if(mask_top_id != LV_MASK_ID_INV) lv_draw_mask_free_param(&mask_top_param); + if(mask_bottom_id != LV_MASK_ID_INV) lv_draw_mask_free_param(&mask_bottom_param); + lv_draw_mask_remove_id(mask_left_id); + lv_draw_mask_remove_id(mask_right_id); + lv_draw_mask_remove_id(mask_top_id); + lv_draw_mask_remove_id(mask_bottom_id); +#else + LV_UNUSED(point1); + LV_UNUSED(point2); + LV_UNUSED(draw_ctx); + LV_UNUSED(dsc); + LV_LOG_WARN("Can't draw skewed line with LV_DRAW_COMPLEX == 0"); +#endif /*LV_DRAW_COMPLEX*/ +} + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_polygon.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_polygon.c new file mode 100644 index 0000000..a05b471 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_polygon.c @@ -0,0 +1,207 @@ +/** + * @file lv_draw_sw_polygon.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_mem.h" +#include "../../misc/lv_area.h" +#include "../../misc/lv_color.h" +#include "../lv_draw_rect.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Draw a polygon. Only convex polygons are supported + * @param points an array of points + * @param point_cnt number of points + * @param clip_area polygon will be drawn only in this area + * @param draw_dsc pointer to an initialized `lv_draw_rect_dsc_t` variable + */ +void lv_draw_sw_polygon(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * draw_dsc, const lv_point_t * points, + uint16_t point_cnt) +{ +#if LV_DRAW_COMPLEX + if(point_cnt < 3) return; + if(points == NULL) return; + + /*Join adjacent points if they are on the same coordinate*/ + lv_point_t * p = lv_mem_buf_get(point_cnt * sizeof(lv_point_t)); + if(p == NULL) return; + uint16_t i; + uint16_t pcnt = 0; + p[0] = points[0]; + for(i = 0; i < point_cnt - 1; i++) { + if(points[i].x != points[i + 1].x || points[i].y != points[i + 1].y) { + p[pcnt] = points[i]; + pcnt++; + } + } + /*The first and the last points are also adjacent*/ + if(points[0].x != points[point_cnt - 1].x || points[0].y != points[point_cnt - 1].y) { + p[pcnt] = points[point_cnt - 1]; + pcnt++; + } + + point_cnt = pcnt; + if(point_cnt < 3) { + lv_mem_buf_release(p); + return; + } + + lv_area_t poly_coords = {.x1 = LV_COORD_MAX, .y1 = LV_COORD_MAX, .x2 = LV_COORD_MIN, .y2 = LV_COORD_MIN}; + + for(i = 0; i < point_cnt; i++) { + poly_coords.x1 = LV_MIN(poly_coords.x1, p[i].x); + poly_coords.y1 = LV_MIN(poly_coords.y1, p[i].y); + poly_coords.x2 = LV_MAX(poly_coords.x2, p[i].x); + poly_coords.y2 = LV_MAX(poly_coords.y2, p[i].y); + } + + bool is_common; + lv_area_t clip_area; + is_common = _lv_area_intersect(&clip_area, &poly_coords, draw_ctx->clip_area); + if(!is_common) { + lv_mem_buf_release(p); + return; + } + + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + draw_ctx->clip_area = &clip_area; + + /*Find the lowest point*/ + lv_coord_t y_min = p[0].y; + int16_t y_min_i = 0; + + for(i = 1; i < point_cnt; i++) { + if(p[i].y < y_min) { + y_min = p[i].y; + y_min_i = i; + } + } + + lv_draw_mask_line_param_t * mp = lv_mem_buf_get(sizeof(lv_draw_mask_line_param_t) * point_cnt); + lv_draw_mask_line_param_t * mp_next = mp; + + int32_t i_prev_left = y_min_i; + int32_t i_prev_right = y_min_i; + int32_t i_next_left; + int32_t i_next_right; + uint32_t mask_cnt = 0; + + /*Get the index of the left and right points*/ + i_next_left = y_min_i - 1; + if(i_next_left < 0) i_next_left = point_cnt + i_next_left; + + i_next_right = y_min_i + 1; + if(i_next_right > point_cnt - 1) i_next_right = 0; + + /** + * Check if the order of points is inverted or not. + * The normal case is when the left point is on `y_min_i - 1` + * Explanation: + * if angle(p_left) < angle(p_right) -> inverted + * dy_left/dx_left < dy_right/dx_right + * dy_left * dx_right < dy_right * dx_left + */ + lv_coord_t dxl = p[i_next_left].x - p[y_min_i].x; + lv_coord_t dxr = p[i_next_right].x - p[y_min_i].x; + lv_coord_t dyl = p[i_next_left].y - p[y_min_i].y; + lv_coord_t dyr = p[i_next_right].y - p[y_min_i].y; + + bool inv = false; + if(dyl * dxr < dyr * dxl) inv = true; + + do { + if(!inv) { + i_next_left = i_prev_left - 1; + if(i_next_left < 0) i_next_left = point_cnt + i_next_left; + + i_next_right = i_prev_right + 1; + if(i_next_right > point_cnt - 1) i_next_right = 0; + } + else { + i_next_left = i_prev_left + 1; + if(i_next_left > point_cnt - 1) i_next_left = 0; + + i_next_right = i_prev_right - 1; + if(i_next_right < 0) i_next_right = point_cnt + i_next_right; + } + + if(p[i_next_left].y >= p[i_prev_left].y) { + if(p[i_next_left].y != p[i_prev_left].y && + p[i_next_left].x != p[i_prev_left].x) { + lv_draw_mask_line_points_init(mp_next, p[i_prev_left].x, p[i_prev_left].y, + p[i_next_left].x, p[i_next_left].y, + LV_DRAW_MASK_LINE_SIDE_RIGHT); + lv_draw_mask_add(mp_next, mp); + mp_next++; + } + mask_cnt++; + i_prev_left = i_next_left; + } + + if(mask_cnt == point_cnt) break; + + if(p[i_next_right].y >= p[i_prev_right].y) { + if(p[i_next_right].y != p[i_prev_right].y && + p[i_next_right].x != p[i_prev_right].x) { + + lv_draw_mask_line_points_init(mp_next, p[i_prev_right].x, p[i_prev_right].y, + p[i_next_right].x, p[i_next_right].y, + LV_DRAW_MASK_LINE_SIDE_LEFT); + lv_draw_mask_add(mp_next, mp); + mp_next++; + } + mask_cnt++; + i_prev_right = i_next_right; + } + + } while(mask_cnt < point_cnt); + + lv_draw_rect(draw_ctx, draw_dsc, &poly_coords); + + lv_draw_mask_remove_custom(mp); + + lv_mem_buf_release(mp); + lv_mem_buf_release(p); + + draw_ctx->clip_area = clip_area_ori; +#else + LV_UNUSED(points); + LV_UNUSED(point_cnt); + LV_UNUSED(draw_ctx); + LV_UNUSED(draw_dsc); + LV_LOG_WARN("Can't draw polygon with LV_DRAW_COMPLEX == 0"); +#endif /*LV_DRAW_COMPLEX*/ +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_rect.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_rect.c new file mode 100644 index 0000000..706ec6b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_rect.c @@ -0,0 +1,1436 @@ +/** + * @file lv_draw_rect.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_txt_ap.h" +#include "../../core/lv_refr.h" +#include "../../misc/lv_assert.h" +#include "lv_draw_sw_dither.h" + +/********************* + * DEFINES + *********************/ +#define SHADOW_UPSCALE_SHIFT 6 +#define SHADOW_ENHANCE 1 +#define SPLIT_LIMIT 50 + + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void draw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); +static void draw_bg_img(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); +static void draw_border(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); + +static void draw_outline(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); + +#if LV_DRAW_COMPLEX +LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, + const lv_area_t * coords); +LV_ATTRIBUTE_FAST_MEM static void shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf, lv_coord_t s, + lv_coord_t r); +LV_ATTRIBUTE_FAST_MEM static void shadow_blur_corner(lv_coord_t size, lv_coord_t sw, uint16_t * sh_ups_buf); +#endif + +void draw_border_generic(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area, const lv_area_t * inner_area, + lv_coord_t rout, lv_coord_t rin, lv_color_t color, lv_opa_t opa, lv_blend_mode_t blend_mode); + +static void draw_border_simple(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area, const lv_area_t * inner_area, + lv_color_t color, lv_opa_t opa); + + +/********************** + * STATIC VARIABLES + **********************/ +#if defined(LV_SHADOW_CACHE_SIZE) && LV_SHADOW_CACHE_SIZE > 0 + static uint8_t sh_cache[LV_SHADOW_CACHE_SIZE * LV_SHADOW_CACHE_SIZE]; + static int32_t sh_cache_size = -1; + static int32_t sh_cache_r = -1; +#endif + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) +{ +#if LV_DRAW_COMPLEX + draw_shadow(draw_ctx, dsc, coords); +#endif + + draw_bg(draw_ctx, dsc, coords); + draw_bg_img(draw_ctx, dsc, coords); + + draw_border(draw_ctx, dsc, coords); + + draw_outline(draw_ctx, dsc, coords); + + LV_ASSERT_MEM_INTEGRITY(); +} + +void lv_draw_sw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) +{ +#if LV_COLOR_SCREEN_TRANSP && LV_COLOR_DEPTH == 32 + lv_memset_00(draw_ctx->buf, lv_area_get_size(draw_ctx->buf_area) * sizeof(lv_color_t)); +#endif + + draw_bg(draw_ctx, dsc, coords); + draw_bg_img(draw_ctx, dsc, coords); +} + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void draw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->bg_opa <= LV_OPA_MIN) return; + + lv_area_t bg_coords; + lv_area_copy(&bg_coords, coords); + + /*If the border fully covers make the bg area 1px smaller to avoid artifacts on the corners*/ + if(dsc->border_width > 1 && dsc->border_opa >= LV_OPA_MAX && dsc->radius != 0) { + bg_coords.x1 += (dsc->border_side & LV_BORDER_SIDE_LEFT) ? 1 : 0; + bg_coords.y1 += (dsc->border_side & LV_BORDER_SIDE_TOP) ? 1 : 0; + bg_coords.x2 -= (dsc->border_side & LV_BORDER_SIDE_RIGHT) ? 1 : 0; + bg_coords.y2 -= (dsc->border_side & LV_BORDER_SIDE_BOTTOM) ? 1 : 0; + } + + lv_area_t clipped_coords; + if(!_lv_area_intersect(&clipped_coords, &bg_coords, draw_ctx->clip_area)) return; + + lv_grad_dir_t grad_dir = dsc->bg_grad.dir; + lv_color_t bg_color = grad_dir == LV_GRAD_DIR_NONE ? dsc->bg_color : dsc->bg_grad.stops[0].color; + if(bg_color.full == dsc->bg_grad.stops[1].color.full) grad_dir = LV_GRAD_DIR_NONE; + + bool mask_any = lv_draw_mask_is_any(&bg_coords); + lv_draw_sw_blend_dsc_t blend_dsc = {0}; + blend_dsc.blend_mode = dsc->blend_mode; + blend_dsc.color = bg_color; + + /*Most simple case: just a plain rectangle*/ + if(!mask_any && dsc->radius == 0 && (grad_dir == LV_GRAD_DIR_NONE)) { + blend_dsc.blend_area = &bg_coords; + blend_dsc.opa = dsc->bg_opa; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + return; + } + + /*Complex case: there is gradient, mask, or radius*/ +#if LV_DRAW_COMPLEX == 0 + LV_LOG_WARN("Can't draw complex rectangle because LV_DRAW_COMPLEX = 0"); +#else + lv_opa_t opa = dsc->bg_opa >= LV_OPA_MAX ? LV_OPA_COVER : dsc->bg_opa; + + /*Get the real radius. Can't be larger than the half of the shortest side */ + lv_coord_t coords_bg_w = lv_area_get_width(&bg_coords); + lv_coord_t coords_bg_h = lv_area_get_height(&bg_coords); + int32_t short_side = LV_MIN(coords_bg_w, coords_bg_h); + int32_t rout = LV_MIN(dsc->radius, short_side >> 1); + + /*Add a radius mask if there is radius*/ + int32_t clipped_w = lv_area_get_width(&clipped_coords); + int16_t mask_rout_id = LV_MASK_ID_INV; + lv_opa_t * mask_buf = NULL; + lv_draw_mask_radius_param_t mask_rout_param; + if(rout > 0 || mask_any) { + mask_buf = lv_mem_buf_get(clipped_w); + lv_draw_mask_radius_init(&mask_rout_param, &bg_coords, rout, false); + mask_rout_id = lv_draw_mask_add(&mask_rout_param, NULL); + } + + int32_t h; + + lv_area_t blend_area; + blend_area.x1 = clipped_coords.x1; + blend_area.x2 = clipped_coords.x2; + + blend_dsc.mask_buf = mask_buf; + blend_dsc.blend_area = &blend_area; + blend_dsc.mask_area = &blend_area; + blend_dsc.opa = LV_OPA_COVER; + + + /*Get gradient if appropriate*/ + lv_grad_t * grad = lv_gradient_get(&dsc->bg_grad, coords_bg_w, coords_bg_h); + if(grad && grad_dir == LV_GRAD_DIR_HOR) { + blend_dsc.src_buf = grad->map + clipped_coords.x1 - bg_coords.x1; + } + +#if _DITHER_GRADIENT + lv_dither_mode_t dither_mode = dsc->bg_grad.dither; + lv_dither_func_t dither_func = &lv_dither_none; + lv_coord_t grad_size = coords_bg_w; + if(grad_dir == LV_GRAD_DIR_VER && dither_mode != LV_DITHER_NONE) { + /* When dithering, we are still using a map that's changing from line to line*/ + blend_dsc.src_buf = grad->map; + } + + if(grad && dither_mode == LV_DITHER_NONE) { + grad->filled = 0; /*Should we force refilling it each draw call ?*/ + if(grad_dir == LV_GRAD_DIR_VER) + grad_size = coords_bg_h; + } + else +#if LV_DITHER_ERROR_DIFFUSION + if(dither_mode == LV_DITHER_ORDERED) +#endif + switch(grad_dir) { + case LV_GRAD_DIR_HOR: + dither_func = lv_dither_ordered_hor; + break; + case LV_GRAD_DIR_VER: + dither_func = lv_dither_ordered_ver; + break; + default: + dither_func = NULL; + } + +#if LV_DITHER_ERROR_DIFFUSION + else if(dither_mode == LV_DITHER_ERR_DIFF) + switch(grad_dir) { + case LV_GRAD_DIR_HOR: + dither_func = lv_dither_err_diff_hor; + break; + case LV_GRAD_DIR_VER: + dither_func = lv_dither_err_diff_ver; + break; + default: + dither_func = NULL; + } +#endif +#endif + + /*There is another mask too. Draw line by line. */ + if(mask_any) { + for(h = clipped_coords.y1; h <= clipped_coords.y2; h++) { + blend_area.y1 = h; + blend_area.y2 = h; + + /* Initialize the mask to opa instead of 0xFF and blend with LV_OPA_COVER. + * It saves calculating the final opa in lv_draw_sw_blend*/ + lv_memset(mask_buf, opa, clipped_w); + blend_dsc.mask_res = lv_draw_mask_apply(mask_buf, clipped_coords.x1, h, clipped_w); + if(blend_dsc.mask_res == LV_DRAW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + +#if _DITHER_GRADIENT + if(dither_func) dither_func(grad, blend_area.x1, h - bg_coords.y1, grad_size); +#endif + if(grad_dir == LV_GRAD_DIR_VER) blend_dsc.color = grad->map[h - bg_coords.y1]; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + goto bg_clean_up; + } + + + /* Draw the top of the rectangle line by line and mirror it to the bottom. */ + for(h = 0; h < rout; h++) { + lv_coord_t top_y = bg_coords.y1 + h; + lv_coord_t bottom_y = bg_coords.y2 - h; + if(top_y < clipped_coords.y1 && bottom_y > clipped_coords.y2) continue; /*This line is clipped now*/ + + /* Initialize the mask to opa instead of 0xFF and blend with LV_OPA_COVER. + * It saves calculating the final opa in lv_draw_sw_blend*/ + lv_memset(mask_buf, opa, clipped_w); + blend_dsc.mask_res = lv_draw_mask_apply(mask_buf, blend_area.x1, top_y, clipped_w); + if(blend_dsc.mask_res == LV_DRAW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + + if(top_y >= clipped_coords.y1) { + blend_area.y1 = top_y; + blend_area.y2 = top_y; + +#if _DITHER_GRADIENT + if(dither_func) dither_func(grad, blend_area.x1, top_y - bg_coords.y1, grad_size); +#endif + if(grad_dir == LV_GRAD_DIR_VER) blend_dsc.color = grad->map[top_y - bg_coords.y1]; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + + if(bottom_y <= clipped_coords.y2) { + blend_area.y1 = bottom_y; + blend_area.y2 = bottom_y; + +#if _DITHER_GRADIENT + if(dither_func) dither_func(grad, blend_area.x1, bottom_y - bg_coords.y1, grad_size); +#endif + if(grad_dir == LV_GRAD_DIR_VER) blend_dsc.color = grad->map[bottom_y - bg_coords.y1]; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + } + + /* Draw the center of the rectangle.*/ + + /*If no other masks and no gradient, the center is a simple rectangle*/ + lv_area_t center_coords; + center_coords.x1 = bg_coords.x1; + center_coords.x2 = bg_coords.x2; + center_coords.y1 = bg_coords.y1 + rout; + center_coords.y2 = bg_coords.y2 - rout; + bool mask_any_center = lv_draw_mask_is_any(¢er_coords); + if(!mask_any_center && grad_dir == LV_GRAD_DIR_NONE) { + blend_area.y1 = bg_coords.y1 + rout; + blend_area.y2 = bg_coords.y2 - rout; + blend_dsc.opa = opa; + blend_dsc.mask_buf = NULL; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + /*With gradient and/or mask draw line by line*/ + else { + blend_dsc.opa = opa; + blend_dsc.mask_res = LV_DRAW_MASK_RES_FULL_COVER; + int32_t h_end = bg_coords.y2 - rout; + for(h = bg_coords.y1 + rout; h <= h_end; h++) { + /*If there is no other mask do not apply mask as in the center there is no radius to mask*/ + if(mask_any_center) { + lv_memset(mask_buf, opa, clipped_w); + blend_dsc.mask_res = lv_draw_mask_apply(mask_buf, clipped_coords.x1, h, clipped_w); + } + + blend_area.y1 = h; + blend_area.y2 = h; + +#if _DITHER_GRADIENT + if(dither_func) dither_func(grad, blend_area.x1, h - bg_coords.y1, grad_size); +#endif + if(grad_dir == LV_GRAD_DIR_VER) blend_dsc.color = grad->map[h - bg_coords.y1]; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + } + + +bg_clean_up: + if(mask_buf) lv_mem_buf_release(mask_buf); + if(mask_rout_id != LV_MASK_ID_INV) { + lv_draw_mask_remove_id(mask_rout_id); + lv_draw_mask_free_param(&mask_rout_param); + } + if(grad) { + lv_gradient_cleanup(grad); + } + +#endif +} + +static void draw_bg_img(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->bg_img_src == NULL) return; + if(dsc->bg_img_opa <= LV_OPA_MIN) return; + + lv_area_t clip_area; + if(!_lv_area_intersect(&clip_area, coords, draw_ctx->clip_area)) { + return; + } + + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + draw_ctx->clip_area = &clip_area; + + lv_img_src_t src_type = lv_img_src_get_type(dsc->bg_img_src); + if(src_type == LV_IMG_SRC_SYMBOL) { + lv_point_t size; + lv_txt_get_size(&size, dsc->bg_img_src, dsc->bg_img_symbol_font, 0, 0, LV_COORD_MAX, LV_TEXT_FLAG_NONE); + lv_area_t a; + a.x1 = coords->x1 + lv_area_get_width(coords) / 2 - size.x / 2; + a.x2 = a.x1 + size.x - 1; + a.y1 = coords->y1 + lv_area_get_height(coords) / 2 - size.y / 2; + a.y2 = a.y1 + size.y - 1; + + lv_draw_label_dsc_t label_draw_dsc; + lv_draw_label_dsc_init(&label_draw_dsc); + label_draw_dsc.font = dsc->bg_img_symbol_font; + label_draw_dsc.color = dsc->bg_img_recolor; + label_draw_dsc.opa = dsc->bg_img_opa; + lv_draw_label(draw_ctx, &label_draw_dsc, &a, dsc->bg_img_src, NULL); + } + else { + lv_img_header_t header; + lv_res_t res = lv_img_decoder_get_info(dsc->bg_img_src, &header); + if(res == LV_RES_OK) { + lv_draw_img_dsc_t img_dsc; + lv_draw_img_dsc_init(&img_dsc); + img_dsc.blend_mode = dsc->blend_mode; + img_dsc.recolor = dsc->bg_img_recolor; + img_dsc.recolor_opa = dsc->bg_img_recolor_opa; + img_dsc.opa = dsc->bg_img_opa; + + /*Center align*/ + if(dsc->bg_img_tiled == false) { + lv_area_t area; + area.x1 = coords->x1 + lv_area_get_width(coords) / 2 - header.w / 2; + area.y1 = coords->y1 + lv_area_get_height(coords) / 2 - header.h / 2; + area.x2 = area.x1 + header.w - 1; + area.y2 = area.y1 + header.h - 1; + + lv_draw_img(draw_ctx, &img_dsc, &area, dsc->bg_img_src); + } + else { + lv_area_t area; + area.y1 = coords->y1; + area.y2 = area.y1 + header.h - 1; + + for(; area.y1 <= coords->y2; area.y1 += header.h, area.y2 += header.h) { + + area.x1 = coords->x1; + area.x2 = area.x1 + header.w - 1; + for(; area.x1 <= coords->x2; area.x1 += header.w, area.x2 += header.w) { + lv_draw_img(draw_ctx, &img_dsc, &area, dsc->bg_img_src); + } + } + } + } + else { + LV_LOG_WARN("Couldn't read the background image"); + } + } + + draw_ctx->clip_area = clip_area_ori; +} + +static void draw_border(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->border_opa <= LV_OPA_MIN) return; + if(dsc->border_width == 0) return; + if(dsc->border_side == LV_BORDER_SIDE_NONE) return; + if(dsc->border_post) return; + + int32_t coords_w = lv_area_get_width(coords); + int32_t coords_h = lv_area_get_height(coords); + int32_t rout = dsc->radius; + int32_t short_side = LV_MIN(coords_w, coords_h); + if(rout > short_side >> 1) rout = short_side >> 1; + + /*Get the inner area*/ + lv_area_t area_inner; + lv_area_copy(&area_inner, coords); + area_inner.x1 += ((dsc->border_side & LV_BORDER_SIDE_LEFT) ? dsc->border_width : - (dsc->border_width + rout)); + area_inner.x2 -= ((dsc->border_side & LV_BORDER_SIDE_RIGHT) ? dsc->border_width : - (dsc->border_width + rout)); + area_inner.y1 += ((dsc->border_side & LV_BORDER_SIDE_TOP) ? dsc->border_width : - (dsc->border_width + rout)); + area_inner.y2 -= ((dsc->border_side & LV_BORDER_SIDE_BOTTOM) ? dsc->border_width : - (dsc->border_width + rout)); + + lv_coord_t rin = rout - dsc->border_width; + if(rin < 0) rin = 0; + + draw_border_generic(draw_ctx, coords, &area_inner, rout, rin, dsc->border_color, dsc->border_opa, dsc->blend_mode); + +} + +#if LV_DRAW_COMPLEX +LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, + const lv_area_t * coords) +{ + /*Check whether the shadow is visible*/ + if(dsc->shadow_width == 0) return; + if(dsc->shadow_opa <= LV_OPA_MIN) return; + + if(dsc->shadow_width == 1 && dsc->shadow_spread <= 0 && + dsc->shadow_ofs_x == 0 && dsc->shadow_ofs_y == 0) { + return; + } + + /*Calculate the rectangle which is blurred to get the shadow in `shadow_area`*/ + lv_area_t core_area; + core_area.x1 = coords->x1 + dsc->shadow_ofs_x - dsc->shadow_spread; + core_area.x2 = coords->x2 + dsc->shadow_ofs_x + dsc->shadow_spread; + core_area.y1 = coords->y1 + dsc->shadow_ofs_y - dsc->shadow_spread; + core_area.y2 = coords->y2 + dsc->shadow_ofs_y + dsc->shadow_spread; + + /*Calculate the bounding box of the shadow*/ + lv_area_t shadow_area; + shadow_area.x1 = core_area.x1 - dsc->shadow_width / 2 - 1; + shadow_area.x2 = core_area.x2 + dsc->shadow_width / 2 + 1; + shadow_area.y1 = core_area.y1 - dsc->shadow_width / 2 - 1; + shadow_area.y2 = core_area.y2 + dsc->shadow_width / 2 + 1; + + lv_opa_t opa = dsc->shadow_opa; + if(opa > LV_OPA_MAX) opa = LV_OPA_COVER; + + /*Get clipped draw area which is the real draw area. + *It is always the same or inside `shadow_area`*/ + lv_area_t draw_area; + if(!_lv_area_intersect(&draw_area, &shadow_area, draw_ctx->clip_area)) return; + + /*Consider 1 px smaller bg to be sure the edge will be covered by the shadow*/ + lv_area_t bg_area; + lv_area_copy(&bg_area, coords); + lv_area_increase(&bg_area, -1, -1); + + /*Get the clamped radius*/ + int32_t r_bg = dsc->radius; + lv_coord_t short_side = LV_MIN(lv_area_get_width(&bg_area), lv_area_get_height(&bg_area)); + if(r_bg > short_side >> 1) r_bg = short_side >> 1; + + /*Get the clamped radius*/ + int32_t r_sh = dsc->radius; + short_side = LV_MIN(lv_area_get_width(&core_area), lv_area_get_height(&core_area)); + if(r_sh > short_side >> 1) r_sh = short_side >> 1; + + + /*Get how many pixels are affected by the blur on the corners*/ + int32_t corner_size = dsc->shadow_width + r_sh; + + lv_opa_t * sh_buf; + +#if LV_SHADOW_CACHE_SIZE + if(sh_cache_size == corner_size && sh_cache_r == r_sh) { + /*Use the cache if available*/ + sh_buf = lv_mem_buf_get(corner_size * corner_size); + lv_memcpy(sh_buf, sh_cache, corner_size * corner_size); + } + else { + /*A larger buffer is required for calculation*/ + sh_buf = lv_mem_buf_get(corner_size * corner_size * sizeof(uint16_t)); + shadow_draw_corner_buf(&core_area, (uint16_t *)sh_buf, dsc->shadow_width, r_sh); + + /*Cache the corner if it fits into the cache size*/ + if((uint32_t)corner_size * corner_size < sizeof(sh_cache)) { + lv_memcpy(sh_cache, sh_buf, corner_size * corner_size); + sh_cache_size = corner_size; + sh_cache_r = r_sh; + } + } +#else + sh_buf = lv_mem_buf_get(corner_size * corner_size * sizeof(uint16_t)); + shadow_draw_corner_buf(&core_area, (uint16_t *)sh_buf, dsc->shadow_width, r_sh); +#endif + + /*Skip a lot of masking if the background will cover the shadow that would be masked out*/ + bool mask_any = lv_draw_mask_is_any(&shadow_area); + bool simple = true; + if(mask_any || dsc->bg_opa < LV_OPA_COVER || dsc->blend_mode != LV_BLEND_MODE_NORMAL) simple = false; + + /*Create a radius mask to clip remove shadow on the bg area*/ + + lv_draw_mask_radius_param_t mask_rout_param; + int16_t mask_rout_id = LV_MASK_ID_INV; + if(!simple) { + lv_draw_mask_radius_init(&mask_rout_param, &bg_area, r_bg, true); + mask_rout_id = lv_draw_mask_add(&mask_rout_param, NULL); + } + lv_opa_t * mask_buf = lv_mem_buf_get(lv_area_get_width(&shadow_area)); + lv_area_t blend_area; + lv_area_t clip_area_sub; + lv_opa_t * sh_buf_tmp; + lv_coord_t y; + bool simple_sub; + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memset_00(&blend_dsc, sizeof(blend_dsc)); + blend_dsc.blend_area = &blend_area; + blend_dsc.mask_area = &blend_area; + blend_dsc.mask_buf = mask_buf; + blend_dsc.color = dsc->shadow_color; + blend_dsc.opa = dsc->shadow_opa; + blend_dsc.blend_mode = dsc->blend_mode; + + lv_coord_t w_half = shadow_area.x1 + lv_area_get_width(&shadow_area) / 2; + lv_coord_t h_half = shadow_area.y1 + lv_area_get_height(&shadow_area) / 2; + + /*Draw the corners if they are on the current clip area and not fully covered by the bg*/ + + /*Top right corner*/ + blend_area.x2 = shadow_area.x2; + blend_area.x1 = shadow_area.x2 - corner_size + 1; + blend_area.y1 = shadow_area.y1; + blend_area.y2 = shadow_area.y1 + corner_size - 1; + /*Do not overdraw the other top corners*/ + blend_area.x1 = LV_MAX(blend_area.x1, w_half); + blend_area.y2 = LV_MIN(blend_area.y2, h_half); + + if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_ctx->clip_area) && + !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + lv_coord_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (clip_area_sub.y1 - shadow_area.y1) * corner_size; + sh_buf_tmp += clip_area_sub.x1 - (shadow_area.x2 - corner_size + 1); + + /*Do not mask if out of the bg*/ + if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + if(w > 0) { + blend_dsc.mask_buf = mask_buf; + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ + for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { + blend_area.y1 = y; + blend_area.y2 = y; + + if(!simple_sub) { + lv_memcpy(mask_buf, sh_buf_tmp, corner_size); + blend_dsc.mask_res = lv_draw_mask_apply(mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + } + else { + blend_dsc.mask_buf = sh_buf_tmp; + } + lv_draw_sw_blend(draw_ctx, &blend_dsc); + sh_buf_tmp += corner_size; + } + } + } + + /*Bottom right corner. + *Almost the same as top right just read the lines of `sh_buf` from then end*/ + blend_area.x2 = shadow_area.x2; + blend_area.x1 = shadow_area.x2 - corner_size + 1; + blend_area.y1 = shadow_area.y2 - corner_size + 1; + blend_area.y2 = shadow_area.y2; + /*Do not overdraw the other corners*/ + blend_area.x1 = LV_MAX(blend_area.x1, w_half); + blend_area.y1 = LV_MAX(blend_area.y1, h_half + 1); + + if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_ctx->clip_area) && + !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + lv_coord_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (blend_area.y2 - clip_area_sub.y2) * corner_size; + sh_buf_tmp += clip_area_sub.x1 - (shadow_area.x2 - corner_size + 1); + /*Do not mask if out of the bg*/ + if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + + if(w > 0) { + blend_dsc.mask_buf = mask_buf; + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ + for(y = clip_area_sub.y2; y >= clip_area_sub.y1; y--) { + blend_area.y1 = y; + blend_area.y2 = y; + + if(!simple_sub) { + lv_memcpy(mask_buf, sh_buf_tmp, corner_size); + blend_dsc.mask_res = lv_draw_mask_apply(mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + } + else { + blend_dsc.mask_buf = sh_buf_tmp; + } + lv_draw_sw_blend(draw_ctx, &blend_dsc); + sh_buf_tmp += corner_size; + } + } + } + + /*Top side*/ + blend_area.x1 = shadow_area.x1 + corner_size; + blend_area.x2 = shadow_area.x2 - corner_size; + blend_area.y1 = shadow_area.y1; + blend_area.y2 = shadow_area.y1 + corner_size - 1; + blend_area.y2 = LV_MIN(blend_area.y2, h_half); + + if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_ctx->clip_area) && + !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + lv_coord_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (clip_area_sub.y1 - blend_area.y1) * corner_size; + + /*Do not mask if out of the bg*/ + if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + + if(w > 0) { + if(!simple_sub) { + blend_dsc.mask_buf = mask_buf; + } + else { + blend_dsc.mask_buf = NULL; + } + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + + for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { + blend_area.y1 = y; + blend_area.y2 = y; + + if(!simple_sub) { + lv_memset(mask_buf, sh_buf_tmp[0], w); + blend_dsc.mask_res = lv_draw_mask_apply(mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + else { + blend_dsc.opa = opa == LV_OPA_COVER ? sh_buf_tmp[0] : (sh_buf_tmp[0] * dsc->shadow_opa) >> 8; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + sh_buf_tmp += corner_size; + } + } + } + blend_dsc.opa = dsc->shadow_opa; /*Restore*/ + + /*Bottom side*/ + blend_area.x1 = shadow_area.x1 + corner_size; + blend_area.x2 = shadow_area.x2 - corner_size; + blend_area.y1 = shadow_area.y2 - corner_size + 1; + blend_area.y2 = shadow_area.y2; + blend_area.y1 = LV_MAX(blend_area.y1, h_half + 1); + + + if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_ctx->clip_area) && + !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + lv_coord_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (blend_area.y2 - clip_area_sub.y2) * corner_size; + if(w > 0) { + /*Do not mask if out of the bg*/ + if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + + if(!simple_sub) { + blend_dsc.mask_buf = mask_buf; + } + else { + blend_dsc.mask_buf = NULL; + } + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + + for(y = clip_area_sub.y2; y >= clip_area_sub.y1; y--) { + blend_area.y1 = y; + blend_area.y2 = y; + + /*Do not mask if out of the bg*/ + if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + + if(!simple_sub) { + lv_memset(mask_buf, sh_buf_tmp[0], w); + blend_dsc.mask_res = lv_draw_mask_apply(mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + else { + blend_dsc.opa = opa == LV_OPA_COVER ? sh_buf_tmp[0] : (sh_buf_tmp[0] * dsc->shadow_opa) >> 8; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + + } + sh_buf_tmp += corner_size; + } + } + } + + blend_dsc.opa = dsc->shadow_opa; /*Restore*/ + + /*Right side*/ + blend_area.x1 = shadow_area.x2 - corner_size + 1; + blend_area.x2 = shadow_area.x2; + blend_area.y1 = shadow_area.y1 + corner_size; + blend_area.y2 = shadow_area.y2 - corner_size; + /*Do not overdraw the other corners*/ + blend_area.y1 = LV_MIN(blend_area.y1, h_half + 1); + blend_area.y2 = LV_MAX(blend_area.y2, h_half); + blend_area.x1 = LV_MAX(blend_area.x1, w_half); + + if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_ctx->clip_area) && + !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + lv_coord_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (corner_size - 1) * corner_size; + sh_buf_tmp += clip_area_sub.x1 - (shadow_area.x2 - corner_size + 1); + + /*Do not mask if out of the bg*/ + if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + blend_dsc.mask_buf = simple_sub ? sh_buf_tmp : mask_buf; + + if(w > 0) { + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ + for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { + blend_area.y1 = y; + blend_area.y2 = y; + + if(!simple_sub) { + lv_memcpy(mask_buf, sh_buf_tmp, w); + blend_dsc.mask_res = lv_draw_mask_apply(mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + } + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + } + } + + /*Mirror the shadow corner buffer horizontally*/ + sh_buf_tmp = sh_buf ; + for(y = 0; y < corner_size; y++) { + int32_t x; + lv_opa_t * start = sh_buf_tmp; + lv_opa_t * end = sh_buf_tmp + corner_size - 1; + for(x = 0; x < corner_size / 2; x++) { + lv_opa_t tmp = *start; + *start = *end; + *end = tmp; + + start++; + end--; + } + sh_buf_tmp += corner_size; + } + + /*Left side*/ + blend_area.x1 = shadow_area.x1; + blend_area.x2 = shadow_area.x1 + corner_size - 1; + blend_area.y1 = shadow_area.y1 + corner_size; + blend_area.y2 = shadow_area.y2 - corner_size; + /*Do not overdraw the other corners*/ + blend_area.y1 = LV_MIN(blend_area.y1, h_half + 1); + blend_area.y2 = LV_MAX(blend_area.y2, h_half); + blend_area.x2 = LV_MIN(blend_area.x2, w_half - 1); + + if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_ctx->clip_area) && + !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + lv_coord_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (corner_size - 1) * corner_size; + sh_buf_tmp += clip_area_sub.x1 - blend_area.x1; + + /*Do not mask if out of the bg*/ + if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + blend_dsc.mask_buf = simple_sub ? sh_buf_tmp : mask_buf; + if(w > 0) { + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ + for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { + blend_area.y1 = y; + blend_area.y2 = y; + + if(!simple_sub) { + lv_memcpy(mask_buf, sh_buf_tmp, w); + blend_dsc.mask_res = lv_draw_mask_apply(mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + } + + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + } + } + + /*Top left corner*/ + blend_area.x1 = shadow_area.x1; + blend_area.x2 = shadow_area.x1 + corner_size - 1; + blend_area.y1 = shadow_area.y1; + blend_area.y2 = shadow_area.y1 + corner_size - 1; + /*Do not overdraw the other corners*/ + blend_area.x2 = LV_MIN(blend_area.x2, w_half - 1); + blend_area.y2 = LV_MIN(blend_area.y2, h_half); + + if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_ctx->clip_area) && + !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + lv_coord_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (clip_area_sub.y1 - blend_area.y1) * corner_size; + sh_buf_tmp += clip_area_sub.x1 - blend_area.x1; + + /*Do not mask if out of the bg*/ + if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + blend_dsc.mask_buf = mask_buf; + + if(w > 0) { + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ + for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { + blend_area.y1 = y; + blend_area.y2 = y; + + if(!simple_sub) { + lv_memcpy(mask_buf, sh_buf_tmp, corner_size); + blend_dsc.mask_res = lv_draw_mask_apply(mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + } + else { + blend_dsc.mask_buf = sh_buf_tmp; + } + + lv_draw_sw_blend(draw_ctx, &blend_dsc); + sh_buf_tmp += corner_size; + } + } + } + + /*Bottom left corner. + *Almost the same as bottom right just read the lines of `sh_buf` from then end*/ + blend_area.x1 = shadow_area.x1 ; + blend_area.x2 = shadow_area.x1 + corner_size - 1; + blend_area.y1 = shadow_area.y2 - corner_size + 1; + blend_area.y2 = shadow_area.y2; + /*Do not overdraw the other corners*/ + blend_area.y1 = LV_MAX(blend_area.y1, h_half + 1); + blend_area.x2 = LV_MIN(blend_area.x2, w_half - 1); + + if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_ctx->clip_area) && + !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + lv_coord_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (blend_area.y2 - clip_area_sub.y2) * corner_size; + sh_buf_tmp += clip_area_sub.x1 - blend_area.x1; + + /*Do not mask if out of the bg*/ + if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + blend_dsc.mask_buf = mask_buf; + if(w > 0) { + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ + for(y = clip_area_sub.y2; y >= clip_area_sub.y1; y--) { + blend_area.y1 = y; + blend_area.y2 = y; + + if(!simple_sub) { + lv_memcpy(mask_buf, sh_buf_tmp, corner_size); + blend_dsc.mask_res = lv_draw_mask_apply(mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + } + else { + blend_dsc.mask_buf = sh_buf_tmp; + } + lv_draw_sw_blend(draw_ctx, &blend_dsc); + sh_buf_tmp += corner_size; + } + } + } + + /*Draw the center rectangle.*/ + blend_area.x1 = shadow_area.x1 + corner_size ; + blend_area.x2 = shadow_area.x2 - corner_size; + blend_area.y1 = shadow_area.y1 + corner_size; + blend_area.y2 = shadow_area.y2 - corner_size; + blend_dsc.mask_buf = mask_buf; + + if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_ctx->clip_area) && + !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + lv_coord_t w = lv_area_get_width(&clip_area_sub); + if(w > 0) { + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { + blend_area.y1 = y; + blend_area.y2 = y; + + lv_memset_ff(mask_buf, w); + blend_dsc.mask_res = lv_draw_mask_apply(mask_buf, clip_area_sub.x1, y, w); + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + } + } + + if(!simple) { + lv_draw_mask_free_param(&mask_rout_param); + lv_draw_mask_remove_id(mask_rout_id); + } + lv_mem_buf_release(sh_buf); + lv_mem_buf_release(mask_buf); +} + +/** + * Calculate a blurred corner + * @param coords Coordinates of the shadow + * @param sh_buf a buffer to store the result. Its size should be `(sw + r)^2 * 2` + * @param sw shadow width + * @param r radius + */ +LV_ATTRIBUTE_FAST_MEM static void shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf, lv_coord_t sw, + lv_coord_t r) +{ + int32_t sw_ori = sw; + int32_t size = sw_ori + r; + + lv_area_t sh_area; + lv_area_copy(&sh_area, coords); + sh_area.x2 = sw / 2 + r - 1 - ((sw & 1) ? 0 : 1); + sh_area.y1 = sw / 2 + 1; + + sh_area.x1 = sh_area.x2 - lv_area_get_width(coords); + sh_area.y2 = sh_area.y1 + lv_area_get_height(coords); + + lv_draw_mask_radius_param_t mask_param; + lv_draw_mask_radius_init(&mask_param, &sh_area, r, false); + +#if SHADOW_ENHANCE + /*Set half shadow width width because blur will be repeated*/ + if(sw_ori == 1) sw = 1; + else sw = sw_ori >> 1; +#endif + + int32_t y; + lv_opa_t * mask_line = lv_mem_buf_get(size); + uint16_t * sh_ups_tmp_buf = (uint16_t *)sh_buf; + for(y = 0; y < size; y++) { + lv_memset_ff(mask_line, size); + lv_draw_mask_res_t mask_res = mask_param.dsc.cb(mask_line, 0, y, size, &mask_param); + if(mask_res == LV_DRAW_MASK_RES_TRANSP) { + lv_memset_00(sh_ups_tmp_buf, size * sizeof(sh_ups_tmp_buf[0])); + } + else { + int32_t i; + sh_ups_tmp_buf[0] = (mask_line[0] << SHADOW_UPSCALE_SHIFT) / sw; + for(i = 1; i < size; i++) { + if(mask_line[i] == mask_line[i - 1]) sh_ups_tmp_buf[i] = sh_ups_tmp_buf[i - 1]; + else sh_ups_tmp_buf[i] = (mask_line[i] << SHADOW_UPSCALE_SHIFT) / sw; + } + } + + sh_ups_tmp_buf += size; + } + lv_mem_buf_release(mask_line); + + lv_draw_mask_free_param(&mask_param); + + if(sw == 1) { + int32_t i; + lv_opa_t * res_buf = (lv_opa_t *)sh_buf; + for(i = 0; i < size * size; i++) { + res_buf[i] = (sh_buf[i] >> SHADOW_UPSCALE_SHIFT); + } + return; + } + + shadow_blur_corner(size, sw, sh_buf); + +#if SHADOW_ENHANCE == 0 + /*The result is required in lv_opa_t not uint16_t*/ + uint32_t x; + lv_opa_t * res_buf = (lv_opa_t *)sh_buf; + for(x = 0; x < size * size; x++) { + res_buf[x] = sh_buf[x]; + } +#else + sw += sw_ori & 1; + if(sw > 1) { + uint32_t i; + uint32_t max_v_div = (LV_OPA_COVER << SHADOW_UPSCALE_SHIFT) / sw; + for(i = 0; i < (uint32_t)size * size; i++) { + if(sh_buf[i] == 0) continue; + else if(sh_buf[i] == LV_OPA_COVER) sh_buf[i] = max_v_div; + else sh_buf[i] = (sh_buf[i] << SHADOW_UPSCALE_SHIFT) / sw; + } + + shadow_blur_corner(size, sw, sh_buf); + } + int32_t x; + lv_opa_t * res_buf = (lv_opa_t *)sh_buf; + for(x = 0; x < size * size; x++) { + res_buf[x] = sh_buf[x]; + } +#endif + +} + +LV_ATTRIBUTE_FAST_MEM static void shadow_blur_corner(lv_coord_t size, lv_coord_t sw, uint16_t * sh_ups_buf) +{ + int32_t s_left = sw >> 1; + int32_t s_right = (sw >> 1); + if((sw & 1) == 0) s_left--; + + /*Horizontal blur*/ + uint16_t * sh_ups_blur_buf = lv_mem_buf_get(size * sizeof(uint16_t)); + + int32_t x; + int32_t y; + + uint16_t * sh_ups_tmp_buf = sh_ups_buf; + + for(y = 0; y < size; y++) { + int32_t v = sh_ups_tmp_buf[size - 1] * sw; + for(x = size - 1; x >= 0; x--) { + sh_ups_blur_buf[x] = v; + + /*Forget the right pixel*/ + uint32_t right_val = 0; + if(x + s_right < size) right_val = sh_ups_tmp_buf[x + s_right]; + v -= right_val; + + /*Add the left pixel*/ + uint32_t left_val; + if(x - s_left - 1 < 0) left_val = sh_ups_tmp_buf[0]; + else left_val = sh_ups_tmp_buf[x - s_left - 1]; + v += left_val; + } + lv_memcpy(sh_ups_tmp_buf, sh_ups_blur_buf, size * sizeof(uint16_t)); + sh_ups_tmp_buf += size; + } + + /*Vertical blur*/ + uint32_t i; + uint32_t max_v = LV_OPA_COVER << SHADOW_UPSCALE_SHIFT; + uint32_t max_v_div = max_v / sw; + for(i = 0; i < (uint32_t)size * size; i++) { + if(sh_ups_buf[i] == 0) continue; + else if(sh_ups_buf[i] == max_v) sh_ups_buf[i] = max_v_div; + else sh_ups_buf[i] = sh_ups_buf[i] / sw; + } + + for(x = 0; x < size; x++) { + sh_ups_tmp_buf = &sh_ups_buf[x]; + int32_t v = sh_ups_tmp_buf[0] * sw; + for(y = 0; y < size ; y++, sh_ups_tmp_buf += size) { + sh_ups_blur_buf[y] = v < 0 ? 0 : (v >> SHADOW_UPSCALE_SHIFT); + + /*Forget the top pixel*/ + uint32_t top_val; + if(y - s_right <= 0) top_val = sh_ups_tmp_buf[0]; + else top_val = sh_ups_buf[(y - s_right) * size + x]; + v -= top_val; + + /*Add the bottom pixel*/ + uint32_t bottom_val; + if(y + s_left + 1 < size) bottom_val = sh_ups_buf[(y + s_left + 1) * size + x]; + else bottom_val = sh_ups_buf[(size - 1) * size + x]; + v += bottom_val; + } + + /*Write back the result into `sh_ups_buf`*/ + sh_ups_tmp_buf = &sh_ups_buf[x]; + for(y = 0; y < size; y++, sh_ups_tmp_buf += size) { + (*sh_ups_tmp_buf) = sh_ups_blur_buf[y]; + } + } + + lv_mem_buf_release(sh_ups_blur_buf); +} +#endif + +static void draw_outline(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->outline_opa <= LV_OPA_MIN) return; + if(dsc->outline_width == 0) return; + + lv_opa_t opa = dsc->outline_opa; + + if(opa > LV_OPA_MAX) opa = LV_OPA_COVER; + + /*Get the inner radius*/ + lv_area_t area_inner; + lv_area_copy(&area_inner, coords); + + /*Bring the outline closer to make sure there is no color bleeding with pad=0*/ + lv_coord_t pad = dsc->outline_pad - 1; + area_inner.x1 -= pad; + area_inner.y1 -= pad; + area_inner.x2 += pad; + area_inner.y2 += pad; + + lv_area_t area_outer; + lv_area_copy(&area_outer, &area_inner); + + area_outer.x1 -= dsc->outline_width; + area_outer.x2 += dsc->outline_width; + area_outer.y1 -= dsc->outline_width; + area_outer.y2 += dsc->outline_width; + + + int32_t inner_w = lv_area_get_width(&area_inner); + int32_t inner_h = lv_area_get_height(&area_inner); + int32_t rin = dsc->radius; + int32_t short_side = LV_MIN(inner_w, inner_h); + if(rin > short_side >> 1) rin = short_side >> 1; + + lv_coord_t rout = rin + dsc->outline_width; + + draw_border_generic(draw_ctx, &area_outer, &area_inner, rout, rin, dsc->outline_color, dsc->outline_opa, + dsc->blend_mode); +} + +void draw_border_generic(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area, const lv_area_t * inner_area, + lv_coord_t rout, lv_coord_t rin, lv_color_t color, lv_opa_t opa, lv_blend_mode_t blend_mode) +{ + opa = opa >= LV_OPA_COVER ? LV_OPA_COVER : opa; + + bool mask_any = lv_draw_mask_is_any(outer_area); + +#if LV_DRAW_COMPLEX + + if(!mask_any && rout == 0 && rin == 0) { + draw_border_simple(draw_ctx, outer_area, inner_area, color, opa); + return; + } + + /*Get clipped draw area which is the real draw area. + *It is always the same or inside `coords`*/ + lv_area_t draw_area; + if(!_lv_area_intersect(&draw_area, outer_area, draw_ctx->clip_area)) return; + int32_t draw_area_w = lv_area_get_width(&draw_area); + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memset_00(&blend_dsc, sizeof(blend_dsc)); + blend_dsc.mask_buf = lv_mem_buf_get(draw_area_w);; + + + /*Create mask for the outer area*/ + int16_t mask_rout_id = LV_MASK_ID_INV; + lv_draw_mask_radius_param_t mask_rout_param; + if(rout > 0) { + lv_draw_mask_radius_init(&mask_rout_param, outer_area, rout, false); + mask_rout_id = lv_draw_mask_add(&mask_rout_param, NULL); + } + + /*Create mask for the inner mask*/ + lv_draw_mask_radius_param_t mask_rin_param; + lv_draw_mask_radius_init(&mask_rin_param, inner_area, rin, true); + int16_t mask_rin_id = lv_draw_mask_add(&mask_rin_param, NULL); + + int32_t h; + lv_area_t blend_area; + blend_dsc.blend_area = &blend_area; + blend_dsc.mask_area = &blend_area; + blend_dsc.color = color; + blend_dsc.opa = opa; + blend_dsc.blend_mode = blend_mode; + + /*Calculate the x and y coordinates where the straight parts area*/ + lv_area_t core_area; + core_area.x1 = LV_MAX(outer_area->x1 + rout, inner_area->x1); + core_area.x2 = LV_MIN(outer_area->x2 - rout, inner_area->x2); + core_area.y1 = LV_MAX(outer_area->y1 + rout, inner_area->y1); + core_area.y2 = LV_MIN(outer_area->y2 - rout, inner_area->y2); + lv_coord_t core_w = lv_area_get_width(&core_area); + + bool top_side = outer_area->y1 <= inner_area->y1 ? true : false; + bool bottom_side = outer_area->y2 >= inner_area->y2 ? true : false; + + /*If there is other masks, need to draw line by line*/ + if(mask_any) { + blend_area.x1 = draw_area.x1; + blend_area.x2 = draw_area.x2; + for(h = draw_area.y1; h <= draw_area.y2; h++) { + if(!top_side && h < core_area.y1) continue; + if(!bottom_side && h > core_area.y2) break; + + blend_area.y1 = h; + blend_area.y2 = h; + + lv_memset_ff(blend_dsc.mask_buf, draw_area_w); + blend_dsc.mask_res = lv_draw_mask_apply(blend_dsc.mask_buf, draw_area.x1, h, draw_area_w); + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + + lv_draw_mask_free_param(&mask_rin_param); + lv_draw_mask_remove_id(mask_rin_id); + if(mask_rout_id != LV_MASK_ID_INV) { + lv_draw_mask_free_param(&mask_rout_param); + lv_draw_mask_remove_id(mask_rout_id); + } + lv_mem_buf_release(blend_dsc.mask_buf); + return; + } + + /*No masks*/ + bool left_side = outer_area->x1 <= inner_area->x1 ? true : false; + bool right_side = outer_area->x2 >= inner_area->x2 ? true : false; + + bool split_hor = true; + if(left_side && right_side && top_side && bottom_side && + core_w < SPLIT_LIMIT) { + split_hor = false; + } + + blend_dsc.mask_res = LV_DRAW_MASK_RES_FULL_COVER; + /*Draw the straight lines first if they are long enough*/ + if(top_side && split_hor) { + blend_area.x1 = core_area.x1; + blend_area.x2 = core_area.x2; + blend_area.y1 = outer_area->y1; + blend_area.y2 = inner_area->y1 - 1; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + + if(bottom_side && split_hor) { + blend_area.x1 = core_area.x1; + blend_area.x2 = core_area.x2; + blend_area.y1 = inner_area->y2 + 1; + blend_area.y2 = outer_area->y2; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + + if(left_side) { + blend_area.x1 = outer_area->x1; + blend_area.x2 = inner_area->x1 - 1; + blend_area.y1 = core_area.y1; + blend_area.y2 = core_area.y2; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + + if(right_side) { + blend_area.x1 = inner_area->x2 + 1; + blend_area.x2 = outer_area->x2; + blend_area.y1 = core_area.y1; + blend_area.y2 = core_area.y2; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + + /*Draw the corners*/ + lv_coord_t blend_w; + + /*Left and right corner together if they are close to each other*/ + if(!split_hor) { + /*Calculate the top corner and mirror it to the bottom*/ + blend_area.x1 = draw_area.x1; + blend_area.x2 = draw_area.x2; + lv_coord_t max_h = LV_MAX(rout, inner_area->y1 - outer_area->y1); + for(h = 0; h < max_h; h++) { + lv_coord_t top_y = outer_area->y1 + h; + lv_coord_t bottom_y = outer_area->y2 - h; + if(top_y < draw_area.y1 && bottom_y > draw_area.y2) continue; /*This line is clipped now*/ + + lv_memset_ff(blend_dsc.mask_buf, draw_area_w); + blend_dsc.mask_res = lv_draw_mask_apply(blend_dsc.mask_buf, blend_area.x1, top_y, draw_area_w); + + if(top_y >= draw_area.y1) { + blend_area.y1 = top_y; + blend_area.y2 = top_y; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + + if(bottom_y <= draw_area.y2) { + blend_area.y1 = bottom_y; + blend_area.y2 = bottom_y; + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + } + } + else { + /*Left corners*/ + blend_area.x1 = draw_area.x1; + blend_area.x2 = LV_MIN(draw_area.x2, core_area.x1 - 1); + blend_w = lv_area_get_width(&blend_area); + if(blend_w > 0) { + if(left_side || top_side) { + for(h = draw_area.y1; h < core_area.y1; h++) { + blend_area.y1 = h; + blend_area.y2 = h; + + lv_memset_ff(blend_dsc.mask_buf, blend_w); + blend_dsc.mask_res = lv_draw_mask_apply(blend_dsc.mask_buf, blend_area.x1, h, blend_w); + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + } + + if(left_side || bottom_side) { + for(h = core_area.y2 + 1; h <= draw_area.y2; h++) { + blend_area.y1 = h; + blend_area.y2 = h; + + lv_memset_ff(blend_dsc.mask_buf, blend_w); + blend_dsc.mask_res = lv_draw_mask_apply(blend_dsc.mask_buf, blend_area.x1, h, blend_w); + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + } + } + + /*Right corners*/ + blend_area.x1 = LV_MAX(draw_area.x1, core_area.x2 + 1); + blend_area.x2 = draw_area.x2; + blend_w = lv_area_get_width(&blend_area); + + if(blend_w > 0) { + if(right_side || top_side) { + for(h = draw_area.y1; h < core_area.y1; h++) { + blend_area.y1 = h; + blend_area.y2 = h; + + lv_memset_ff(blend_dsc.mask_buf, blend_w); + blend_dsc.mask_res = lv_draw_mask_apply(blend_dsc.mask_buf, blend_area.x1, h, blend_w); + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + } + + if(right_side || bottom_side) { + for(h = core_area.y2 + 1; h <= draw_area.y2; h++) { + blend_area.y1 = h; + blend_area.y2 = h; + + lv_memset_ff(blend_dsc.mask_buf, blend_w); + blend_dsc.mask_res = lv_draw_mask_apply(blend_dsc.mask_buf, blend_area.x1, h, blend_w); + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + } + } + } + + lv_draw_mask_free_param(&mask_rin_param); + lv_draw_mask_remove_id(mask_rin_id); + lv_draw_mask_free_param(&mask_rout_param); + lv_draw_mask_remove_id(mask_rout_id); + lv_mem_buf_release(blend_dsc.mask_buf); + +#else /*LV_DRAW_COMPLEX*/ + LV_UNUSED(blend_mode); + LV_UNUSED(rout); + LV_UNUSED(rin); + if(!mask_any) { + draw_border_simple(draw_ctx, outer_area, inner_area, color, opa); + return; + } + +#endif /*LV_DRAW_COMPLEX*/ +} +static void draw_border_simple(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area, const lv_area_t * inner_area, + lv_color_t color, lv_opa_t opa) +{ + lv_area_t a; + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memset_00(&blend_dsc, sizeof(lv_draw_sw_blend_dsc_t)); + blend_dsc.blend_area = &a; + blend_dsc.color = color; + blend_dsc.opa = opa; + + bool top_side = outer_area->y1 <= inner_area->y1 ? true : false; + bool bottom_side = outer_area->y2 >= inner_area->y2 ? true : false; + bool left_side = outer_area->x1 <= inner_area->x1 ? true : false; + bool right_side = outer_area->x2 >= inner_area->x2 ? true : false; + + + /*Top*/ + a.x1 = outer_area->x1; + a.x2 = outer_area->x2; + a.y1 = outer_area->y1; + a.y2 = inner_area->y1 - 1; + if(top_side) { + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + + /*Bottom*/ + a.y1 = inner_area->y2 + 1; + a.y2 = outer_area->y2; + if(bottom_side) { + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + + /*Left*/ + a.x1 = outer_area->x1; + a.x2 = inner_area->x1 - 1; + a.y1 = (top_side) ? inner_area->y1 : outer_area->y1; + a.y2 = (bottom_side) ? inner_area->y2 : outer_area->y2; + if(left_side) { + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } + + /*Right*/ + a.x1 = inner_area->x2 + 1; + a.x2 = outer_area->x2; + if(right_side) { + lv_draw_sw_blend(draw_ctx, &blend_dsc); + } +} + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_transform.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_transform.c new file mode 100644 index 0000000..80b1e6d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/sw/lv_draw_sw_transform.c @@ -0,0 +1,496 @@ +/** + * @file lv_draw_sw_tranform.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_area.h" +#include "../../core/lv_refr.h" + +#if LV_DRAW_COMPLEX +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + int32_t x_in; + int32_t y_in; + int32_t x_out; + int32_t y_out; + int32_t sinma; + int32_t cosma; + int32_t zoom; + int32_t angle; + int32_t pivot_x_256; + int32_t pivot_y_256; + lv_point_t pivot; +} point_transform_dsc_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +/** + * Transform a point with 1/256 precision (the output coordinates are upscaled by 256) + * @param t pointer to n initialized `point_transform_dsc_t` structure + * @param xin X coordinate to rotate + * @param yin Y coordinate to rotate + * @param xout upscaled, transformed X + * @param yout upscaled, transformed Y + */ +static void transform_point_upscaled(point_transform_dsc_t * t, int32_t xin, int32_t yin, int32_t * xout, + int32_t * yout); + +static void argb_no_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, lv_color_t * cbuf, uint8_t * abuf); + +static void rgb_no_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, lv_color_t * cbuf, uint8_t * abuf, lv_img_cf_t cf); + +#if LV_COLOR_DEPTH == 16 +static void rgb565a8_no_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, lv_color_t * cbuf, uint8_t * abuf); +#endif + +static void argb_and_rgb_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, lv_color_t * cbuf, uint8_t * abuf, lv_img_cf_t cf); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_transform(lv_draw_ctx_t * draw_ctx, const lv_area_t * dest_area, const void * src_buf, + lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride, + const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t cf, lv_color_t * cbuf, lv_opa_t * abuf) +{ + LV_UNUSED(draw_ctx); + + point_transform_dsc_t tr_dsc; + tr_dsc.angle = -draw_dsc->angle; + tr_dsc.zoom = (256 * 256) / draw_dsc->zoom; + tr_dsc.pivot = draw_dsc->pivot; + + int32_t angle_low = tr_dsc.angle / 10; + int32_t angle_high = angle_low + 1; + int32_t angle_rem = tr_dsc.angle - (angle_low * 10); + + int32_t s1 = lv_trigo_sin(angle_low); + int32_t s2 = lv_trigo_sin(angle_high); + + int32_t c1 = lv_trigo_sin(angle_low + 90); + int32_t c2 = lv_trigo_sin(angle_high + 90); + + tr_dsc.sinma = (s1 * (10 - angle_rem) + s2 * angle_rem) / 10; + tr_dsc.cosma = (c1 * (10 - angle_rem) + c2 * angle_rem) / 10; + tr_dsc.sinma = tr_dsc.sinma >> (LV_TRIGO_SHIFT - 10); + tr_dsc.cosma = tr_dsc.cosma >> (LV_TRIGO_SHIFT - 10); + tr_dsc.pivot_x_256 = tr_dsc.pivot.x * 256; + tr_dsc.pivot_y_256 = tr_dsc.pivot.y * 256; + + lv_coord_t dest_w = lv_area_get_width(dest_area); + lv_coord_t dest_h = lv_area_get_height(dest_area); + lv_coord_t y; + for(y = 0; y < dest_h; y++) { + int32_t xs1_ups, ys1_ups, xs2_ups, ys2_ups; + + transform_point_upscaled(&tr_dsc, dest_area->x1, dest_area->y1 + y, &xs1_ups, &ys1_ups); + transform_point_upscaled(&tr_dsc, dest_area->x2, dest_area->y1 + y, &xs2_ups, &ys2_ups); + + int32_t xs_diff = xs2_ups - xs1_ups; + int32_t ys_diff = ys2_ups - ys1_ups; + int32_t xs_step_256 = 0; + int32_t ys_step_256 = 0; + if(dest_w > 1) { + xs_step_256 = (256 * xs_diff) / (dest_w - 1); + ys_step_256 = (256 * ys_diff) / (dest_w - 1); + } + int32_t xs_ups = xs1_ups; + int32_t ys_ups = ys1_ups; + + if(draw_dsc->antialias == 0) { + switch(cf) { + case LV_IMG_CF_TRUE_COLOR_ALPHA: + argb_no_aa(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, cbuf, abuf); + break; + case LV_IMG_CF_TRUE_COLOR: + case LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED: + rgb_no_aa(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, cbuf, abuf, cf); + break; + +#if LV_COLOR_DEPTH == 16 + case LV_IMG_CF_RGB565A8: + rgb565a8_no_aa(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, cbuf, abuf); + break; +#endif + default: + break; + } + } + else { + argb_and_rgb_aa(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, cbuf, abuf, cf); + } + + cbuf += dest_w; + abuf += dest_w; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void rgb_no_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, lv_color_t * cbuf, uint8_t * abuf, lv_img_cf_t cf) +{ + int32_t xs_ups_start = xs_ups; + int32_t ys_ups_start = ys_ups; + lv_disp_t * d = _lv_refr_get_disp_refreshing(); + lv_color_t ck = d->driver->color_chroma_key; + + lv_memset_ff(abuf, x_end); + + lv_coord_t x; + for(x = 0; x < x_end; x++) { + xs_ups = xs_ups_start + ((xs_step * x) >> 8); + ys_ups = ys_ups_start + ((ys_step * x) >> 8); + + int32_t xs_int = xs_ups >> 8; + int32_t ys_int = ys_ups >> 8; + if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) { + abuf[x] = 0x00; + } + else { + +#if LV_COLOR_DEPTH == 8 + const uint8_t * src_tmp = src; + src_tmp += ys_int * src_stride + xs_int; + cbuf[x].full = src_tmp[0]; +#elif LV_COLOR_DEPTH == 16 + const lv_color_t * src_tmp = (const lv_color_t *)src; + src_tmp += ys_int * src_stride + xs_int; + cbuf[x] = *src_tmp; +#elif LV_COLOR_DEPTH == 32 + const uint8_t * src_tmp = src; + src_tmp += (ys_int * src_stride * sizeof(lv_color_t)) + xs_int * sizeof(lv_color_t); + cbuf[x].full = *((uint32_t *)src_tmp); +#endif + } + if(cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED && cbuf[x].full == ck.full) { + abuf[x] = 0x00; + } + } +} + +static void argb_no_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, lv_color_t * cbuf, uint8_t * abuf) +{ + int32_t xs_ups_start = xs_ups; + int32_t ys_ups_start = ys_ups; + + lv_coord_t x; + for(x = 0; x < x_end; x++) { + xs_ups = xs_ups_start + ((xs_step * x) >> 8); + ys_ups = ys_ups_start + ((ys_step * x) >> 8); + + int32_t xs_int = xs_ups >> 8; + int32_t ys_int = ys_ups >> 8; + if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) { + abuf[x] = 0; + } + else { + const uint8_t * src_tmp = src; + src_tmp += (ys_int * src_stride * LV_IMG_PX_SIZE_ALPHA_BYTE) + xs_int * LV_IMG_PX_SIZE_ALPHA_BYTE; + +#if LV_COLOR_DEPTH == 8 + cbuf[x].full = src_tmp[0]; +#elif LV_COLOR_DEPTH == 16 + cbuf[x].full = src_tmp[0] + (src_tmp[1] << 8); +#elif LV_COLOR_DEPTH == 32 + cbuf[x].full = *((uint32_t *)src_tmp); +#endif + abuf[x] = src_tmp[LV_IMG_PX_SIZE_ALPHA_BYTE - 1]; + } + } +} + +#if LV_COLOR_DEPTH == 16 +static void rgb565a8_no_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, lv_color_t * cbuf, uint8_t * abuf) +{ + int32_t xs_ups_start = xs_ups; + int32_t ys_ups_start = ys_ups; + + lv_coord_t x; + for(x = 0; x < x_end; x++) { + xs_ups = xs_ups_start + ((xs_step * x) >> 8); + ys_ups = ys_ups_start + ((ys_step * x) >> 8); + + int32_t xs_int = xs_ups >> 8; + int32_t ys_int = ys_ups >> 8; + if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) { + abuf[x] = 0; + } + else { + const lv_color_t * src_tmp = (const lv_color_t *)src; + src_tmp += ys_int * src_stride + xs_int; + cbuf[x] = *src_tmp; + + const lv_opa_t * a_tmp = src + src_stride * src_h * sizeof(lv_color_t); + a_tmp += ys_int * src_stride + xs_int; + abuf[x] = *a_tmp; + } + } +} +#endif + + +static void argb_and_rgb_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, lv_color_t * cbuf, uint8_t * abuf, lv_img_cf_t cf) +{ + int32_t xs_ups_start = xs_ups; + int32_t ys_ups_start = ys_ups; + bool has_alpha; + int32_t px_size; + lv_color_t ck = {0}; + switch(cf) { + case LV_IMG_CF_TRUE_COLOR: + has_alpha = false; + px_size = sizeof(lv_color_t); + break; + case LV_IMG_CF_TRUE_COLOR_ALPHA: + has_alpha = true; + px_size = LV_IMG_PX_SIZE_ALPHA_BYTE; + break; + case LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED: { + has_alpha = true; + px_size = sizeof(lv_color_t); + lv_disp_t * d = _lv_refr_get_disp_refreshing(); + ck = d->driver->color_chroma_key; + break; + } +#if LV_COLOR_DEPTH == 16 + case LV_IMG_CF_RGB565A8: + has_alpha = true; + px_size = sizeof(lv_color_t); + break; +#endif + default: + return; + } + + lv_coord_t x; + for(x = 0; x < x_end; x++) { + xs_ups = xs_ups_start + ((xs_step * x) >> 8); + ys_ups = ys_ups_start + ((ys_step * x) >> 8); + + int32_t xs_int = xs_ups >> 8; + int32_t ys_int = ys_ups >> 8; + + /*Fully out of the image*/ + if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) { + abuf[x] = 0x00; + continue; + } + + /*Get the direction the hor and ver neighbor + *`fract` will be in range of 0x00..0xFF and `next` (+/-1) indicates the direction*/ + int32_t xs_fract = xs_ups & 0xFF; + int32_t ys_fract = ys_ups & 0xFF; + + int32_t x_next; + int32_t y_next; + if(xs_fract < 0x80) { + x_next = -1; + xs_fract = (0x7F - xs_fract) * 2; + } + else { + x_next = 1; + xs_fract = (xs_fract - 0x80) * 2; + } + if(ys_fract < 0x80) { + y_next = -1; + ys_fract = (0x7F - ys_fract) * 2; + } + else { + y_next = 1; + ys_fract = (ys_fract - 0x80) * 2; + } + + const uint8_t * src_tmp = src; + src_tmp += (ys_int * src_stride * px_size) + xs_int * px_size; + + + if(xs_int + x_next >= 0 && + xs_int + x_next <= src_w - 1 && + ys_int + y_next >= 0 && + ys_int + y_next <= src_h - 1) { + + const uint8_t * px_base = src_tmp; + const uint8_t * px_hor = src_tmp + x_next * px_size; + const uint8_t * px_ver = src_tmp + y_next * src_stride * px_size; + lv_color_t c_base; + lv_color_t c_ver; + lv_color_t c_hor; + + if(has_alpha) { + lv_opa_t a_base; + lv_opa_t a_ver; + lv_opa_t a_hor; + if(cf == LV_IMG_CF_TRUE_COLOR_ALPHA) { + a_base = px_base[LV_IMG_PX_SIZE_ALPHA_BYTE - 1]; + a_ver = px_ver[LV_IMG_PX_SIZE_ALPHA_BYTE - 1]; + a_hor = px_hor[LV_IMG_PX_SIZE_ALPHA_BYTE - 1]; + } +#if LV_COLOR_DEPTH == 16 + else if(cf == LV_IMG_CF_RGB565A8) { + const lv_opa_t * a_tmp = src + src_stride * src_h * sizeof(lv_color_t); + a_base = *(a_tmp + (ys_int * src_stride) + xs_int); + a_hor = *(a_tmp + (ys_int * src_stride) + xs_int + x_next); + a_ver = *(a_tmp + ((ys_int + y_next) * src_stride) + xs_int); + } +#endif + else if(cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) { + if(((lv_color_t *)px_base)->full == ck.full || + ((lv_color_t *)px_ver)->full == ck.full || + ((lv_color_t *)px_hor)->full == ck.full) { + abuf[x] = 0x00; + continue; + } + else { + a_base = 0xff; + a_ver = 0xff; + a_hor = 0xff; + } + } + else { + a_base = 0xff; + a_ver = 0xff; + a_hor = 0xff; + } + + if(a_ver != a_base) a_ver = ((a_ver * ys_fract) + (a_base * (0x100 - ys_fract))) >> 8; + if(a_hor != a_base) a_hor = ((a_hor * xs_fract) + (a_base * (0x100 - xs_fract))) >> 8; + abuf[x] = (a_ver + a_hor) >> 1; + + if(abuf[x] == 0x00) continue; + +#if LV_COLOR_DEPTH == 8 + c_base.full = px_base[0]; + c_ver.full = px_ver[0]; + c_hor.full = px_hor[0]; +#elif LV_COLOR_DEPTH == 16 + c_base.full = px_base[0] + (px_base[1] << 8); + c_ver.full = px_ver[0] + (px_ver[1] << 8); + c_hor.full = px_hor[0] + (px_hor[1] << 8); +#elif LV_COLOR_DEPTH == 32 + c_base.full = *((uint32_t *)px_base); + c_ver.full = *((uint32_t *)px_ver); + c_hor.full = *((uint32_t *)px_hor); +#endif + } + /*No alpha channel -> RGB*/ + else { + c_base = *((const lv_color_t *) px_base); + c_hor = *((const lv_color_t *) px_hor); + c_ver = *((const lv_color_t *) px_ver); + abuf[x] = 0xff; + } + + if(c_base.full == c_ver.full && c_base.full == c_hor.full) { + cbuf[x] = c_base; + } + else { + c_ver = lv_color_mix(c_ver, c_base, ys_fract); + c_hor = lv_color_mix(c_hor, c_base, xs_fract); + cbuf[x] = lv_color_mix(c_hor, c_ver, LV_OPA_50); + } + } + /*Partially out of the image*/ + else { +#if LV_COLOR_DEPTH == 8 + cbuf[x].full = src_tmp[0]; +#elif LV_COLOR_DEPTH == 16 + cbuf[x].full = src_tmp[0] + (src_tmp[1] << 8); +#elif LV_COLOR_DEPTH == 32 + cbuf[x].full = *((uint32_t *)src_tmp); +#endif + lv_opa_t a; + switch(cf) { + case LV_IMG_CF_TRUE_COLOR_ALPHA: + a = src_tmp[LV_IMG_PX_SIZE_ALPHA_BYTE - 1]; + break; + case LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED: + a = cbuf[x].full == ck.full ? 0x00 : 0xff; + break; +#if LV_COLOR_DEPTH == 16 + case LV_IMG_CF_RGB565A8: + a = *(src + src_stride * src_h * sizeof(lv_color_t) + (ys_int * src_stride) + xs_int); + break; +#endif + default: + a = 0xff; + } + + if((xs_int == 0 && x_next < 0) || (xs_int == src_w - 1 && x_next > 0)) { + abuf[x] = (a * (0xFF - xs_fract)) >> 8; + } + else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0)) { + abuf[x] = (a * (0xFF - ys_fract)) >> 8; + } + else { + abuf[x] = 0x00; + } + } + } +} + +static void transform_point_upscaled(point_transform_dsc_t * t, int32_t xin, int32_t yin, int32_t * xout, + int32_t * yout) +{ + if(t->angle == 0 && t->zoom == LV_IMG_ZOOM_NONE) { + *xout = xin * 256; + *yout = yin * 256; + return; + } + + xin -= t->pivot.x; + yin -= t->pivot.y; + + if(t->angle == 0) { + *xout = ((int32_t)(xin * t->zoom)) + (t->pivot_x_256); + *yout = ((int32_t)(yin * t->zoom)) + (t->pivot_y_256); + } + else if(t->zoom == LV_IMG_ZOOM_NONE) { + *xout = ((t->cosma * xin - t->sinma * yin) >> 2) + (t->pivot_x_256); + *yout = ((t->sinma * xin + t->cosma * yin) >> 2) + (t->pivot_y_256); + } + else { + *xout = (((t->cosma * xin - t->sinma * yin) * t->zoom) >> 10) + (t->pivot_x_256); + *yout = (((t->sinma * xin + t->cosma * yin) * t->zoom) >> 10) + (t->pivot_y_256); + } +} + +#endif + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/swm341_dma2d/lv_draw_swm341_dma2d.mk b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/swm341_dma2d/lv_draw_swm341_dma2d.mk new file mode 100644 index 0000000..bc19e38 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/swm341_dma2d/lv_draw_swm341_dma2d.mk @@ -0,0 +1,6 @@ +CSRCS += lv_gpu_swm341_dma2d.c + +DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/swm341_dma2d +VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/swm341_dma2d + +CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/swm341_dma2d" diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.c new file mode 100644 index 0000000..74a5394 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.c @@ -0,0 +1,241 @@ +/** + * @file lv_gpu_swm341_dma2d.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_gpu_swm341_dma2d.h" +#include "../../core/lv_refr.h" + +#if LV_USE_GPU_SWM341_DMA2D + +#include LV_GPU_SWM341_DMA2D_INCLUDE + +/********************* + * DEFINES + *********************/ + +#if LV_COLOR_16_SWAP + #error "Can't use DMA2D with LV_COLOR_16_SWAP 1" +#endif + +#if LV_COLOR_DEPTH == 8 + #error "Can't use DMA2D with LV_COLOR_DEPTH == 8" +#endif + +#if LV_COLOR_DEPTH == 16 + #define LV_DMA2D_COLOR_FORMAT LV_SWM341_DMA2D_RGB565 +#elif LV_COLOR_DEPTH == 32 + #define LV_DMA2D_COLOR_FORMAT LV_SWM341_DMA2D_ARGB8888 +#else + /*Can't use GPU with other formats*/ +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_draw_swm341_dma2d_blend_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, const lv_area_t * fill_area, + lv_color_t color); + +static void lv_draw_swm341_dma2d_blend_map(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa); + +static void lv_draw_swm341_dma2d_img_decoded(lv_draw_ctx_t * draw, const lv_draw_img_dsc_t * dsc, + const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t color_format); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Turn on the peripheral and set output color mode, this only needs to be done once + */ +void lv_draw_swm341_dma2d_init(void) +{ + /*Enable DMA2D clock*/ + SYS->CLKEN0 |= (1 << SYS_CLKEN0_DMA2D_Pos); + + DMA2D->CR &= ~DMA2D_CR_WAIT_Msk; + DMA2D->CR |= (CyclesPerUs << DMA2D_CR_WAIT_Pos); + + DMA2D->IF = 0xFF; + DMA2D->IE = (0 << DMA2D_IE_DONE_Pos); + + /*set output colour mode*/ + DMA2D->L[DMA2D_LAYER_OUT].PFCCR = (LV_DMA2D_COLOR_FORMAT << DMA2D_PFCCR_CFMT_Pos); +} + +void lv_draw_swm341_dma2d_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + + lv_draw_sw_init_ctx(drv, draw_ctx); + + lv_draw_swm341_dma2d_ctx_t * dma2d_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx; + + dma2d_draw_ctx->blend = lv_draw_swm341_dma2d_blend; + // dma2d_draw_ctx->base_draw.draw_img_decoded = lv_draw_swm341_dma2d_img_decoded; + dma2d_draw_ctx->base_draw.wait_for_finish = lv_gpu_swm341_dma2d_wait_cb; +} + +void lv_draw_swm341_dma2d_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + LV_UNUSED(drv); + LV_UNUSED(draw_ctx); +} + +void lv_draw_swm341_dma2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) +{ + lv_area_t blend_area; + if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) + return; + + bool done = false; + + if(dsc->mask_buf == NULL && dsc->blend_mode == LV_BLEND_MODE_NORMAL && lv_area_get_size(&blend_area) > 100) { + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + + lv_color_t * dest_buf = draw_ctx->buf; + dest_buf += dest_stride * (blend_area.y1 - draw_ctx->buf_area->y1) + (blend_area.x1 - draw_ctx->buf_area->x1); + + const lv_color_t * src_buf = dsc->src_buf; + if(src_buf) { + lv_draw_sw_blend_basic(draw_ctx, dsc); + lv_coord_t src_stride; + src_stride = lv_area_get_width(dsc->blend_area); + src_buf += src_stride * (blend_area.y1 - dsc->blend_area->y1) + (blend_area.x1 - dsc->blend_area->x1); + lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + lv_draw_swm341_dma2d_blend_map(dest_buf, &blend_area, dest_stride, src_buf, src_stride, dsc->opa); + done = true; + } + else if(dsc->opa >= LV_OPA_MAX) { + lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + lv_draw_swm341_dma2d_blend_fill(dest_buf, dest_stride, &blend_area, dsc->color); + done = true; + } + } + + if(!done) lv_draw_sw_blend_basic(draw_ctx, dsc); +} + +static void lv_draw_swm341_dma2d_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, + const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t color_format) +{ + /*TODO basic ARGB8888 image can be handles here*/ + + lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, color_format); +} + +static void lv_draw_swm341_dma2d_blend_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, const lv_area_t * fill_area, + lv_color_t color) +{ + /*Simply fill an area*/ + int32_t area_w = lv_area_get_width(fill_area); + int32_t area_h = lv_area_get_height(fill_area); + +#if 1 + DMA2D->L[DMA2D_LAYER_OUT].COLOR = color.full; + + DMA2D->L[DMA2D_LAYER_OUT].MAR = (uint32_t)dest_buf; + DMA2D->L[DMA2D_LAYER_OUT].OR = dest_stride - area_w; + DMA2D->NLR = ((area_w - 1) << DMA2D_NLR_NPIXEL_Pos) | ((area_h - 1) << DMA2D_NLR_NLINE_Pos); + + /*start transfer*/ + DMA2D->CR &= ~DMA2D_CR_MODE_Msk; + DMA2D->CR |= (3 << DMA2D_CR_MODE_Pos) | + (1 << DMA2D_CR_START_Pos); +#else + for(uint32_t y = 0; y < area_h; y++) { + for(uint32_t x = 0; x < area_w; x++) { + dest_buf[y * dest_stride + x] = color; + } + } +#endif +} + +static void lv_draw_swm341_dma2d_blend_map(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa) +{ + + /*Simple copy*/ + int32_t dest_w = lv_area_get_width(dest_area); + int32_t dest_h = lv_area_get_height(dest_area); + + if(opa >= LV_OPA_MAX) { +#if 1 + /*copy output colour mode, this register controls both input and output colour format*/ + DMA2D->L[DMA2D_LAYER_FG].MAR = (uint32_t)src_buf; + DMA2D->L[DMA2D_LAYER_FG].OR = src_stride - dest_w; + DMA2D->L[DMA2D_LAYER_FG].PFCCR = (LV_DMA2D_COLOR_FORMAT << DMA2D_PFCCR_CFMT_Pos); + + DMA2D->L[DMA2D_LAYER_OUT].MAR = (uint32_t)dest_buf; + DMA2D->L[DMA2D_LAYER_OUT].OR = dest_stride - dest_w; + + DMA2D->NLR = ((dest_w - 1) << DMA2D_NLR_NPIXEL_Pos) | ((dest_h - 1) << DMA2D_NLR_NLINE_Pos); + + /*start transfer*/ + DMA2D->CR &= ~DMA2D_CR_MODE_Msk; + DMA2D->CR |= (0 << DMA2D_CR_MODE_Pos) | + (1 << DMA2D_CR_START_Pos); +#else + lv_color_t temp_buf[1024]; + for(uint32_t y = 0; y < dest_h; y++) { + memcpy(temp_buf, &src_buf[y * src_stride], dest_w * sizeof(lv_color_t)); + memcpy(&dest_buf[y * dest_stride], temp_buf, dest_w * sizeof(lv_color_t)); + } +#endif + } + else { + DMA2D->L[DMA2D_LAYER_FG].MAR = (uint32_t)src_buf; + DMA2D->L[DMA2D_LAYER_FG].OR = src_stride - dest_w; + DMA2D->L[DMA2D_LAYER_FG].PFCCR = (LV_DMA2D_COLOR_FORMAT << DMA2D_PFCCR_CFMT_Pos) + /*alpha mode 2, replace with foreground * alpha value*/ + | (2 << DAM2D_PFCCR_AMODE_Pos) + /*alpha value*/ + | (opa << DMA2D_PFCCR_ALPHA_Pos); + + DMA2D->L[DMA2D_LAYER_BG].MAR = (uint32_t)dest_buf; + DMA2D->L[DMA2D_LAYER_BG].OR = dest_stride - dest_w; + DMA2D->L[DMA2D_LAYER_BG].PFCCR = (LV_DMA2D_COLOR_FORMAT << DMA2D_PFCCR_CFMT_Pos); + + DMA2D->L[DMA2D_LAYER_OUT].MAR = (uint32_t)dest_buf; + DMA2D->L[DMA2D_LAYER_OUT].OR = dest_stride - dest_w; + + DMA2D->NLR = ((dest_w - 1) << DMA2D_NLR_NPIXEL_Pos) | ((dest_h - 1) << DMA2D_NLR_NLINE_Pos); + + /*start transfer*/ + DMA2D->CR &= ~DMA2D_CR_MODE_Msk; + DMA2D->CR |= (2 << DMA2D_CR_MODE_Pos) | + (1 << DMA2D_CR_START_Pos); + } +} + +void lv_gpu_swm341_dma2d_wait_cb(lv_draw_ctx_t * draw_ctx) +{ + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + if(disp->driver && disp->driver->wait_cb) { + while(DMA2D->CR & DMA2D_CR_START_Msk) { + disp->driver->wait_cb(disp->driver); + } + } + else { + while(DMA2D->CR & DMA2D_CR_START_Msk); + } + lv_draw_sw_wait_for_finish(draw_ctx); +} + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.h new file mode 100644 index 0000000..20b8922 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.h @@ -0,0 +1,64 @@ +/** + * @file lv_gpu_swm341_dma2d.h + * + */ + +#ifndef LV_GPU_SWM341_DMA2D_H +#define LV_GPU_SWM341_DMA2D_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../misc/lv_color.h" +#include "../../hal/lv_hal_disp.h" +#include "../sw/lv_draw_sw.h" + +#if LV_USE_GPU_SWM341_DMA2D + +/********************* + * DEFINES + *********************/ + +#define LV_SWM341_DMA2D_ARGB8888 0 +#define LV_SWM341_DMA2D_RGB888 1 +#define LV_SWM341_DMA2D_RGB565 2 + +/********************** + * TYPEDEFS + **********************/ +typedef lv_draw_sw_ctx_t lv_draw_swm341_dma2d_ctx_t; + +struct _lv_disp_drv_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Turn on the peripheral and set output color mode, this only needs to be done once + */ +void lv_draw_swm341_dma2d_init(void); + +void lv_draw_swm341_dma2d_ctx_init(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); + +void lv_draw_swm341_dma2d_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); + +void lv_draw_swm341_dma2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); + +void lv_gpu_swm341_dma2d_wait_cb(lv_draw_ctx_t * draw_ctx); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GPU_SWM341_DMA2D*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GPU_SWM341_DMA2D_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/README.md b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/README.md new file mode 100644 index 0000000..80bb49d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/README.md @@ -0,0 +1,31 @@ +# Extra components + +This directory contains extra (optional) components to lvgl. +It's a good place for contributions as there are less strict expectations about the completeness and flexibility of the components here. + +In other words, if you have created a complex widget from other widgets, or modified an existing widget with special events, styles or animations, or have a new feature that could work as a plugin to lvgl feel free to the share it here. + +## How to contribute +- Create a [Pull request](https://docs.lvgl.io/8.0/CONTRIBUTING.html#pull-request) with your new content +- Please and follow the [Coding style](https://github.com/lvgl/lvgl/blob/master/docs/CODING_STYLE.md) of LVGL +- Add setter/getter functions in pair +- Update [lv_conf_template.h](https://github.com/lvgl/lvgl/blob/master/lv_conf_template.h) +- Add description in the [docs](https://github.com/lvgl/lvgl/tree/master/docs) +- Add [examples](https://github.com/lvgl/lvgl/tree/master/examples) +- Update the [changelog](https://github.com/lvgl/lvgl/tree/master/docs/CHANGELOG.md) +- Add yourself to the [Contributors](#contributors) section below. + +## Ideas +Here some ideas as inspiration feel free to contribute with ideas too. +- New [Calendar headers](https://github.com/lvgl/lvgl/tree/master/src/extra/widgets/calendar) +- Color picker with RGB and or HSV bars +- Ruler, horizontal or vertical with major and minor ticks and labels +- New [List items types](https://github.com/lvgl/lvgl/tree/master/src/extra/widgets/list) +- [Preloaders](https://www.google.com/search?q=preloader&sxsrf=ALeKk01ddA4YB0WEgLLN1bZNSm8YER7pkg:1623080551559&source=lnms&tbm=isch&sa=X&ved=2ahUKEwiwoN6d7oXxAhVuw4sKHVedBB4Q_AUoAXoECAEQAw&biw=952&bih=940) +- Drop-down list with a container to which content can be added +- 9 patch button: Similar to [lv_imgbtn](https://docs.lvgl.io/8.0/widgets/extra/imgbtn.html) but 9 images for 4 corner, 4 sides and the center + +## Contributors +- lv_animimg: @ZhaoQiang-b45475 +- lv_span: @guoweilkd +- lv_menu: @HX2003 \ No newline at end of file diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/layouts/flex/lv_flex.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/layouts/flex/lv_flex.c new file mode 100644 index 0000000..405a56b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/layouts/flex/lv_flex.c @@ -0,0 +1,596 @@ +/** + * @file lv_flex.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_layouts.h" + +#if LV_USE_FLEX + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_flex_align_t main_place; + lv_flex_align_t cross_place; + lv_flex_align_t track_place; + uint8_t row : 1; + uint8_t wrap : 1; + uint8_t rev : 1; +} flex_t; + +typedef struct { + lv_obj_t * item; + lv_coord_t min_size; + lv_coord_t max_size; + lv_coord_t final_size; + uint32_t grow_value; + uint32_t clamped : 1; +} grow_dsc_t; + +typedef struct { + lv_coord_t track_cross_size; + lv_coord_t track_main_size; /*For all items*/ + lv_coord_t track_fix_main_size; /*For non grow items*/ + uint32_t item_cnt; + grow_dsc_t * grow_dsc; + uint32_t grow_item_cnt; + uint32_t grow_dsc_calc : 1; +} track_t; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void flex_update(lv_obj_t * cont, void * user_data); +static int32_t find_track_end(lv_obj_t * cont, flex_t * f, int32_t item_start_id, lv_coord_t max_main_size, + lv_coord_t item_gap, track_t * t); +static void children_repos(lv_obj_t * cont, flex_t * f, int32_t item_first_id, int32_t item_last_id, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t max_main_size, lv_coord_t item_gap, track_t * t); +static void place_content(lv_flex_align_t place, lv_coord_t max_size, lv_coord_t content_size, lv_coord_t item_cnt, + lv_coord_t * start_pos, lv_coord_t * gap); +static lv_obj_t * get_next_item(lv_obj_t * cont, bool rev, int32_t * item_id); + +/********************** + * GLOBAL VARIABLES + **********************/ +uint16_t LV_LAYOUT_FLEX; +lv_style_prop_t LV_STYLE_FLEX_FLOW; +lv_style_prop_t LV_STYLE_FLEX_MAIN_PLACE; +lv_style_prop_t LV_STYLE_FLEX_CROSS_PLACE; +lv_style_prop_t LV_STYLE_FLEX_TRACK_PLACE; +lv_style_prop_t LV_STYLE_FLEX_GROW; + + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/*===================== + * Setter functions + *====================*/ + +void lv_flex_init(void) +{ + LV_LAYOUT_FLEX = lv_layout_register(flex_update, NULL); + + LV_STYLE_FLEX_FLOW = lv_style_register_prop(LV_STYLE_PROP_FLAG_NONE); + LV_STYLE_FLEX_MAIN_PLACE = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); + LV_STYLE_FLEX_CROSS_PLACE = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); + LV_STYLE_FLEX_TRACK_PLACE = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); +} + +void lv_obj_set_flex_flow(lv_obj_t * obj, lv_flex_flow_t flow) +{ + lv_obj_set_style_flex_flow(obj, flow, 0); + lv_obj_set_style_layout(obj, LV_LAYOUT_FLEX, 0); +} + +void lv_obj_set_flex_align(lv_obj_t * obj, lv_flex_align_t main_place, lv_flex_align_t cross_place, + lv_flex_align_t track_place) +{ + lv_obj_set_style_flex_main_place(obj, main_place, 0); + lv_obj_set_style_flex_cross_place(obj, cross_place, 0); + lv_obj_set_style_flex_track_place(obj, track_place, 0); + lv_obj_set_style_layout(obj, LV_LAYOUT_FLEX, 0); +} + +void lv_obj_set_flex_grow(lv_obj_t * obj, uint8_t grow) +{ + lv_obj_set_style_flex_grow(obj, grow, 0); + lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); +} + + +void lv_style_set_flex_flow(lv_style_t * style, lv_flex_flow_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_FLEX_FLOW, v); +} + +void lv_style_set_flex_main_place(lv_style_t * style, lv_flex_align_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_FLEX_MAIN_PLACE, v); +} + +void lv_style_set_flex_cross_place(lv_style_t * style, lv_flex_align_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_FLEX_CROSS_PLACE, v); +} + +void lv_style_set_flex_track_place(lv_style_t * style, lv_flex_align_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_FLEX_TRACK_PLACE, v); +} + +void lv_style_set_flex_grow(lv_style_t * style, uint8_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_FLEX_GROW, v); +} + + +void lv_obj_set_style_flex_flow(lv_obj_t * obj, lv_flex_flow_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t) value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_FLEX_FLOW, v, selector); +} + +void lv_obj_set_style_flex_main_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t) value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_FLEX_MAIN_PLACE, v, selector); +} + +void lv_obj_set_style_flex_cross_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t) value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_FLEX_CROSS_PLACE, v, selector); +} + +void lv_obj_set_style_flex_track_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t) value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_FLEX_TRACK_PLACE, v, selector); +} + +void lv_obj_set_style_flex_grow(lv_obj_t * obj, uint8_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t) value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_FLEX_GROW, v, selector); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void flex_update(lv_obj_t * cont, void * user_data) +{ + LV_LOG_INFO("update %p container", (void *)cont); + LV_UNUSED(user_data); + + flex_t f; + lv_flex_flow_t flow = lv_obj_get_style_flex_flow(cont, LV_PART_MAIN); + f.row = flow & _LV_FLEX_COLUMN ? 0 : 1; + f.wrap = flow & _LV_FLEX_WRAP ? 1 : 0; + f.rev = flow & _LV_FLEX_REVERSE ? 1 : 0; + f.main_place = lv_obj_get_style_flex_main_place(cont, LV_PART_MAIN); + f.cross_place = lv_obj_get_style_flex_cross_place(cont, LV_PART_MAIN); + f.track_place = lv_obj_get_style_flex_track_place(cont, LV_PART_MAIN); + + bool rtl = lv_obj_get_style_base_dir(cont, LV_PART_MAIN) == LV_BASE_DIR_RTL ? true : false; + lv_coord_t track_gap = !f.row ? lv_obj_get_style_pad_column(cont, LV_PART_MAIN) : lv_obj_get_style_pad_row(cont, + LV_PART_MAIN); + lv_coord_t item_gap = f.row ? lv_obj_get_style_pad_column(cont, LV_PART_MAIN) : lv_obj_get_style_pad_row(cont, + LV_PART_MAIN); + lv_coord_t max_main_size = (f.row ? lv_obj_get_content_width(cont) : lv_obj_get_content_height(cont)); + lv_coord_t border_width = lv_obj_get_style_border_width(cont, LV_PART_MAIN); + lv_coord_t abs_y = cont->coords.y1 + lv_obj_get_style_pad_top(cont, + LV_PART_MAIN) + border_width - lv_obj_get_scroll_y(cont); + lv_coord_t abs_x = cont->coords.x1 + lv_obj_get_style_pad_left(cont, + LV_PART_MAIN) + border_width - lv_obj_get_scroll_x(cont); + + lv_flex_align_t track_cross_place = f.track_place; + lv_coord_t * cross_pos = (f.row ? &abs_y : &abs_x); + + lv_coord_t w_set = lv_obj_get_style_width(cont, LV_PART_MAIN); + lv_coord_t h_set = lv_obj_get_style_height(cont, LV_PART_MAIN); + + /*Content sized objects should squeezed the gap between the children, therefore any alignment will look like `START`*/ + if((f.row && h_set == LV_SIZE_CONTENT && cont->h_layout == 0) || + (!f.row && w_set == LV_SIZE_CONTENT && cont->w_layout == 0)) { + track_cross_place = LV_FLEX_ALIGN_START; + } + + if(rtl && !f.row) { + if(track_cross_place == LV_FLEX_ALIGN_START) track_cross_place = LV_FLEX_ALIGN_END; + else if(track_cross_place == LV_FLEX_ALIGN_END) track_cross_place = LV_FLEX_ALIGN_START; + } + + lv_coord_t total_track_cross_size = 0; + lv_coord_t gap = 0; + uint32_t track_cnt = 0; + int32_t track_first_item; + int32_t next_track_first_item; + + if(track_cross_place != LV_FLEX_ALIGN_START) { + track_first_item = f.rev ? cont->spec_attr->child_cnt - 1 : 0; + track_t t; + while(track_first_item < (int32_t)cont->spec_attr->child_cnt && track_first_item >= 0) { + /*Search the first item of the next row*/ + t.grow_dsc_calc = 0; + next_track_first_item = find_track_end(cont, &f, track_first_item, max_main_size, item_gap, &t); + total_track_cross_size += t.track_cross_size + track_gap; + track_cnt++; + track_first_item = next_track_first_item; + } + + if(track_cnt) total_track_cross_size -= track_gap; /*No gap after the last track*/ + + /*Place the tracks to get the start position*/ + lv_coord_t max_cross_size = (f.row ? lv_obj_get_content_height(cont) : lv_obj_get_content_width(cont)); + place_content(track_cross_place, max_cross_size, total_track_cross_size, track_cnt, cross_pos, &gap); + } + + track_first_item = f.rev ? cont->spec_attr->child_cnt - 1 : 0; + + if(rtl && !f.row) { + *cross_pos += total_track_cross_size; + } + + while(track_first_item < (int32_t)cont->spec_attr->child_cnt && track_first_item >= 0) { + track_t t; + t.grow_dsc_calc = 1; + /*Search the first item of the next row*/ + next_track_first_item = find_track_end(cont, &f, track_first_item, max_main_size, item_gap, &t); + + if(rtl && !f.row) { + *cross_pos -= t.track_cross_size; + } + children_repos(cont, &f, track_first_item, next_track_first_item, abs_x, abs_y, max_main_size, item_gap, &t); + track_first_item = next_track_first_item; + lv_mem_buf_release(t.grow_dsc); + t.grow_dsc = NULL; + if(rtl && !f.row) { + *cross_pos -= gap + track_gap; + } + else { + *cross_pos += t.track_cross_size + gap + track_gap; + } + } + LV_ASSERT_MEM_INTEGRITY(); + + if(w_set == LV_SIZE_CONTENT || h_set == LV_SIZE_CONTENT) { + lv_obj_refr_size(cont); + } + + lv_event_send(cont, LV_EVENT_LAYOUT_CHANGED, NULL); + + LV_TRACE_LAYOUT("finished"); +} + +/** + * Find the last item of a track + */ +static int32_t find_track_end(lv_obj_t * cont, flex_t * f, int32_t item_start_id, lv_coord_t max_main_size, + lv_coord_t item_gap, track_t * t) +{ + lv_coord_t w_set = lv_obj_get_style_width(cont, LV_PART_MAIN); + lv_coord_t h_set = lv_obj_get_style_height(cont, LV_PART_MAIN); + + /*Can't wrap if the size if auto (i.e. the size depends on the children)*/ + if(f->wrap && ((f->row && w_set == LV_SIZE_CONTENT) || (!f->row && h_set == LV_SIZE_CONTENT))) { + f->wrap = false; + } + lv_coord_t(*get_main_size)(const lv_obj_t *) = (f->row ? lv_obj_get_width : lv_obj_get_height); + lv_coord_t(*get_cross_size)(const lv_obj_t *) = (!f->row ? lv_obj_get_width : lv_obj_get_height); + + t->track_main_size = 0; + t->track_fix_main_size = 0; + t->grow_item_cnt = 0; + t->track_cross_size = 0; + t->item_cnt = 0; + t->grow_dsc = NULL; + + int32_t item_id = item_start_id; + + lv_obj_t * item = lv_obj_get_child(cont, item_id); + while(item) { + if(item_id != item_start_id && lv_obj_has_flag(item, LV_OBJ_FLAG_FLEX_IN_NEW_TRACK)) break; + + if(!lv_obj_has_flag_any(item, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) { + uint8_t grow_value = lv_obj_get_style_flex_grow(item, LV_PART_MAIN); + if(grow_value) { + t->grow_item_cnt++; + t->track_fix_main_size += item_gap; + if(t->grow_dsc_calc) { + grow_dsc_t * new_dsc = lv_mem_buf_get(sizeof(grow_dsc_t) * (t->grow_item_cnt)); + LV_ASSERT_MALLOC(new_dsc); + if(new_dsc == NULL) return item_id; + + if(t->grow_dsc) { + lv_memcpy(new_dsc, t->grow_dsc, sizeof(grow_dsc_t) * (t->grow_item_cnt - 1)); + lv_mem_buf_release(t->grow_dsc); + } + new_dsc[t->grow_item_cnt - 1].item = item; + new_dsc[t->grow_item_cnt - 1].min_size = f->row ? lv_obj_get_style_min_width(item, + LV_PART_MAIN) : lv_obj_get_style_min_height(item, LV_PART_MAIN); + new_dsc[t->grow_item_cnt - 1].max_size = f->row ? lv_obj_get_style_max_width(item, + LV_PART_MAIN) : lv_obj_get_style_max_height(item, LV_PART_MAIN); + new_dsc[t->grow_item_cnt - 1].grow_value = grow_value; + new_dsc[t->grow_item_cnt - 1].clamped = 0; + t->grow_dsc = new_dsc; + } + } + else { + lv_coord_t item_size = get_main_size(item); + if(f->wrap && t->track_fix_main_size + item_size > max_main_size) break; + t->track_fix_main_size += item_size + item_gap; + } + + + t->track_cross_size = LV_MAX(get_cross_size(item), t->track_cross_size); + t->item_cnt++; + } + + item_id += f->rev ? -1 : +1; + if(item_id < 0) break; + item = lv_obj_get_child(cont, item_id); + } + + if(t->track_fix_main_size > 0) t->track_fix_main_size -= item_gap; /*There is no gap after the last item*/ + + /*If there is at least one "grow item" the track takes the full space*/ + t->track_main_size = t->grow_item_cnt ? max_main_size : t->track_fix_main_size; + + /*Have at least one item in a row*/ + if(item && item_id == item_start_id) { + item = cont->spec_attr->children[item_id]; + get_next_item(cont, f->rev, &item_id); + if(item) { + t->track_cross_size = get_cross_size(item); + t->track_main_size = get_main_size(item); + t->item_cnt = 1; + } + } + + return item_id; +} + +/** + * Position the children in the same track + */ +static void children_repos(lv_obj_t * cont, flex_t * f, int32_t item_first_id, int32_t item_last_id, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t max_main_size, lv_coord_t item_gap, track_t * t) +{ + void (*area_set_main_size)(lv_area_t *, lv_coord_t) = (f->row ? lv_area_set_width : lv_area_set_height); + lv_coord_t (*area_get_main_size)(const lv_area_t *) = (f->row ? lv_area_get_width : lv_area_get_height); + lv_coord_t (*area_get_cross_size)(const lv_area_t *) = (!f->row ? lv_area_get_width : lv_area_get_height); + + /*Calculate the size of grow items first*/ + uint32_t i; + bool grow_reiterate = true; + while(grow_reiterate) { + grow_reiterate = false; + lv_coord_t grow_value_sum = 0; + lv_coord_t grow_max_size = t->track_main_size - t->track_fix_main_size; + for(i = 0; i < t->grow_item_cnt; i++) { + if(t->grow_dsc[i].clamped == 0) { + grow_value_sum += t->grow_dsc[i].grow_value; + } + else { + grow_max_size -= t->grow_dsc[i].final_size; + } + } + lv_coord_t grow_unit; + + for(i = 0; i < t->grow_item_cnt; i++) { + if(t->grow_dsc[i].clamped == 0) { + LV_ASSERT(grow_value_sum != 0); + grow_unit = grow_max_size / grow_value_sum; + lv_coord_t size = grow_unit * t->grow_dsc[i].grow_value; + lv_coord_t size_clamp = LV_CLAMP(t->grow_dsc[i].min_size, size, t->grow_dsc[i].max_size); + + if(size_clamp != size) { + t->grow_dsc[i].clamped = 1; + grow_reiterate = true; + } + t->grow_dsc[i].final_size = size_clamp; + grow_value_sum -= t->grow_dsc[i].grow_value; + grow_max_size -= t->grow_dsc[i].final_size; + } + } + } + + + bool rtl = lv_obj_get_style_base_dir(cont, LV_PART_MAIN) == LV_BASE_DIR_RTL ? true : false; + + lv_coord_t main_pos = 0; + + lv_coord_t place_gap = 0; + place_content(f->main_place, max_main_size, t->track_main_size, t->item_cnt, &main_pos, &place_gap); + if(f->row && rtl) main_pos += lv_obj_get_content_width(cont); + + lv_obj_t * item = lv_obj_get_child(cont, item_first_id); + /*Reposition the children*/ + while(item && item_first_id != item_last_id) { + if(lv_obj_has_flag_any(item, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) { + item = get_next_item(cont, f->rev, &item_first_id); + continue; + } + lv_coord_t grow_size = lv_obj_get_style_flex_grow(item, LV_PART_MAIN); + if(grow_size) { + lv_coord_t s = 0; + for(i = 0; i < t->grow_item_cnt; i++) { + if(t->grow_dsc[i].item == item) { + s = t->grow_dsc[i].final_size; + break; + } + } + + if(f->row) item->w_layout = 1; + else item->h_layout = 1; + + if(s != area_get_main_size(&item->coords)) { + lv_obj_invalidate(item); + + lv_area_t old_coords; + lv_area_copy(&old_coords, &item->coords); + area_set_main_size(&item->coords, s); + lv_event_send(item, LV_EVENT_SIZE_CHANGED, &old_coords); + lv_event_send(lv_obj_get_parent(item), LV_EVENT_CHILD_CHANGED, item); + lv_obj_invalidate(item); + } + } + else { + item->w_layout = 0; + item->h_layout = 0; + } + + lv_coord_t cross_pos = 0; + switch(f->cross_place) { + case LV_FLEX_ALIGN_CENTER: + /*Round up the cross size to avoid rounding error when dividing by 2 + *The issue comes up e,g, with column direction with center cross direction if an element's width changes*/ + cross_pos = (((t->track_cross_size + 1) & (~1)) - area_get_cross_size(&item->coords)) / 2; + break; + case LV_FLEX_ALIGN_END: + cross_pos = t->track_cross_size - area_get_cross_size(&item->coords); + break; + default: + break; + } + + if(f->row && rtl) main_pos -= area_get_main_size(&item->coords); + + + /*Handle percentage value of translate*/ + lv_coord_t tr_x = lv_obj_get_style_translate_x(item, LV_PART_MAIN); + lv_coord_t tr_y = lv_obj_get_style_translate_y(item, LV_PART_MAIN); + lv_coord_t w = lv_obj_get_width(item); + lv_coord_t h = lv_obj_get_height(item); + if(LV_COORD_IS_PCT(tr_x)) tr_x = (w * LV_COORD_GET_PCT(tr_x)) / 100; + if(LV_COORD_IS_PCT(tr_y)) tr_y = (h * LV_COORD_GET_PCT(tr_y)) / 100; + + lv_coord_t diff_x = abs_x - item->coords.x1 + tr_x; + lv_coord_t diff_y = abs_y - item->coords.y1 + tr_y; + diff_x += f->row ? main_pos : cross_pos; + diff_y += f->row ? cross_pos : main_pos; + + if(diff_x || diff_y) { + lv_obj_invalidate(item); + item->coords.x1 += diff_x; + item->coords.x2 += diff_x; + item->coords.y1 += diff_y; + item->coords.y2 += diff_y; + lv_obj_invalidate(item); + lv_obj_move_children_by(item, diff_x, diff_y, false); + } + + if(!(f->row && rtl)) main_pos += area_get_main_size(&item->coords) + item_gap + place_gap; + else main_pos -= item_gap + place_gap; + + item = get_next_item(cont, f->rev, &item_first_id); + } +} + +/** + * Tell a start coordinate and gap for a placement type. + */ +static void place_content(lv_flex_align_t place, lv_coord_t max_size, lv_coord_t content_size, lv_coord_t item_cnt, + lv_coord_t * start_pos, lv_coord_t * gap) +{ + if(item_cnt <= 1) { + switch(place) { + case LV_FLEX_ALIGN_SPACE_BETWEEN: + case LV_FLEX_ALIGN_SPACE_AROUND: + case LV_FLEX_ALIGN_SPACE_EVENLY: + place = LV_FLEX_ALIGN_CENTER; + break; + default: + break; + } + } + + switch(place) { + case LV_FLEX_ALIGN_CENTER: + *gap = 0; + *start_pos += (max_size - content_size) / 2; + break; + case LV_FLEX_ALIGN_END: + *gap = 0; + *start_pos += max_size - content_size; + break; + case LV_FLEX_ALIGN_SPACE_BETWEEN: + *gap = (lv_coord_t)(max_size - content_size) / (lv_coord_t)(item_cnt - 1); + break; + case LV_FLEX_ALIGN_SPACE_AROUND: + *gap += (lv_coord_t)(max_size - content_size) / (lv_coord_t)(item_cnt); + *start_pos += *gap / 2; + break; + case LV_FLEX_ALIGN_SPACE_EVENLY: + *gap = (lv_coord_t)(max_size - content_size) / (lv_coord_t)(item_cnt + 1); + *start_pos += *gap; + break; + default: + *gap = 0; + } +} + +static lv_obj_t * get_next_item(lv_obj_t * cont, bool rev, int32_t * item_id) +{ + if(rev) { + (*item_id)--; + if(*item_id >= 0) return cont->spec_attr->children[*item_id]; + else return NULL; + } + else { + (*item_id)++; + if((*item_id) < (int32_t)cont->spec_attr->child_cnt) return cont->spec_attr->children[*item_id]; + else return NULL; + } +} + +#endif /*LV_USE_FLEX*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/layouts/flex/lv_flex.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/layouts/flex/lv_flex.h new file mode 100644 index 0000000..58c3221 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/layouts/flex/lv_flex.h @@ -0,0 +1,152 @@ +/** + * @file lv_flex.h + * + */ + +#ifndef LV_FLEX_H +#define LV_FLEX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../core/lv_obj.h" +#if LV_USE_FLEX + +/********************* + * DEFINES + *********************/ + +#define LV_OBJ_FLAG_FLEX_IN_NEW_TRACK LV_OBJ_FLAG_LAYOUT_1 +LV_EXPORT_CONST_INT(LV_OBJ_FLAG_FLEX_IN_NEW_TRACK); + +#define _LV_FLEX_COLUMN (1 << 0) +#define _LV_FLEX_WRAP (1 << 2) +#define _LV_FLEX_REVERSE (1 << 3) + +/********************** + * TYPEDEFS + **********************/ + +/*Can't include lv_obj.h because it includes this header file*/ +struct _lv_obj_t; + +typedef enum { + LV_FLEX_ALIGN_START, + LV_FLEX_ALIGN_END, + LV_FLEX_ALIGN_CENTER, + LV_FLEX_ALIGN_SPACE_EVENLY, + LV_FLEX_ALIGN_SPACE_AROUND, + LV_FLEX_ALIGN_SPACE_BETWEEN, +} lv_flex_align_t; + +typedef enum { + LV_FLEX_FLOW_ROW = 0x00, + LV_FLEX_FLOW_COLUMN = _LV_FLEX_COLUMN, + LV_FLEX_FLOW_ROW_WRAP = LV_FLEX_FLOW_ROW | _LV_FLEX_WRAP, + LV_FLEX_FLOW_ROW_REVERSE = LV_FLEX_FLOW_ROW | _LV_FLEX_REVERSE, + LV_FLEX_FLOW_ROW_WRAP_REVERSE = LV_FLEX_FLOW_ROW | _LV_FLEX_WRAP | _LV_FLEX_REVERSE, + LV_FLEX_FLOW_COLUMN_WRAP = LV_FLEX_FLOW_COLUMN | _LV_FLEX_WRAP, + LV_FLEX_FLOW_COLUMN_REVERSE = LV_FLEX_FLOW_COLUMN | _LV_FLEX_REVERSE, + LV_FLEX_FLOW_COLUMN_WRAP_REVERSE = LV_FLEX_FLOW_COLUMN | _LV_FLEX_WRAP | _LV_FLEX_REVERSE, +} lv_flex_flow_t; + +/********************** + * GLOBAL VARIABLES + **********************/ +extern uint16_t LV_LAYOUT_FLEX; +extern lv_style_prop_t LV_STYLE_FLEX_FLOW; +extern lv_style_prop_t LV_STYLE_FLEX_MAIN_PLACE; +extern lv_style_prop_t LV_STYLE_FLEX_CROSS_PLACE; +extern lv_style_prop_t LV_STYLE_FLEX_TRACK_PLACE; +extern lv_style_prop_t LV_STYLE_FLEX_GROW; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize a flex layout the default values + * @param flex pointer to a flex layout descriptor + */ +void lv_flex_init(void); + +/** + * Set hot the item should flow + * @param flex pointer to a flex layout descriptor + * @param flow an element of `lv_flex_flow_t`. + */ +void lv_obj_set_flex_flow(lv_obj_t * obj, lv_flex_flow_t flow); + +/** + * Set how to place (where to align) the items and tracks + * @param flex pointer: to a flex layout descriptor + * @param main_place where to place the items on main axis (in their track). Any value of `lv_flex_align_t`. + * @param cross_place where to place the item in their track on the cross axis. `LV_FLEX_ALIGN_START/END/CENTER` + * @param track_place where to place the tracks in the cross direction. Any value of `lv_flex_align_t`. + */ +void lv_obj_set_flex_align(lv_obj_t * obj, lv_flex_align_t main_place, lv_flex_align_t cross_place, + lv_flex_align_t track_cross_place); + +/** + * Sets the width or height (on main axis) to grow the object in order fill the free space + * @param obj pointer to an object. The parent must have flex layout else nothing will happen. + * @param grow a value to set how much free space to take proportionally to other growing items. + */ +void lv_obj_set_flex_grow(lv_obj_t * obj, uint8_t grow); + +void lv_style_set_flex_flow(lv_style_t * style, lv_flex_flow_t value); +void lv_style_set_flex_main_place(lv_style_t * style, lv_flex_align_t value); +void lv_style_set_flex_cross_place(lv_style_t * style, lv_flex_align_t value); +void lv_style_set_flex_track_place(lv_style_t * style, lv_flex_align_t value); +void lv_style_set_flex_grow(lv_style_t * style, uint8_t value); +void lv_obj_set_style_flex_flow(lv_obj_t * obj, lv_flex_flow_t value, lv_style_selector_t selector); +void lv_obj_set_style_flex_main_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector); +void lv_obj_set_style_flex_cross_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector); +void lv_obj_set_style_flex_track_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector); +void lv_obj_set_style_flex_grow(lv_obj_t * obj, uint8_t value, lv_style_selector_t selector); + +static inline lv_flex_flow_t lv_obj_get_style_flex_flow(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_FLOW); + return (lv_flex_flow_t)v.num; +} + +static inline lv_flex_align_t lv_obj_get_style_flex_main_place(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_MAIN_PLACE); + return (lv_flex_align_t)v.num; +} + +static inline lv_flex_align_t lv_obj_get_style_flex_cross_place(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_CROSS_PLACE); + return (lv_flex_align_t)v.num; +} + +static inline lv_flex_align_t lv_obj_get_style_flex_track_place(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_TRACK_PLACE); + return (lv_flex_align_t)v.num; +} + +static inline uint8_t lv_obj_get_style_flex_grow(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_GROW); + return (uint8_t)v.num; +} + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_FLEX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FLEX_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/layouts/grid/lv_grid.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/layouts/grid/lv_grid.c new file mode 100644 index 0000000..74f8e95 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/layouts/grid/lv_grid.c @@ -0,0 +1,782 @@ +/** + * @file lv_grid.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_layouts.h" + +#if LV_USE_GRID + +/********************* + * DEFINES + *********************/ +/** + * Some helper defines + */ +#define IS_FR(x) (x >= LV_COORD_MAX - 100) +#define IS_CONTENT(x) (x == LV_COORD_MAX - 101) +#define GET_FR(x) (x - (LV_COORD_MAX - 100)) + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + uint32_t col; + uint32_t row; + lv_point_t grid_abs; +} item_repos_hint_t; + +typedef struct { + lv_coord_t * x; + lv_coord_t * y; + lv_coord_t * w; + lv_coord_t * h; + uint32_t col_num; + uint32_t row_num; + lv_coord_t grid_w; + lv_coord_t grid_h; +} _lv_grid_calc_t; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void grid_update(lv_obj_t * cont, void * user_data); +static void calc(lv_obj_t * obj, _lv_grid_calc_t * calc); +static void calc_free(_lv_grid_calc_t * calc); +static void calc_cols(lv_obj_t * cont, _lv_grid_calc_t * c); +static void calc_rows(lv_obj_t * cont, _lv_grid_calc_t * c); +static void item_repos(lv_obj_t * item, _lv_grid_calc_t * c, item_repos_hint_t * hint); +static lv_coord_t grid_align(lv_coord_t cont_size, bool auto_size, uint8_t align, lv_coord_t gap, uint32_t track_num, + lv_coord_t * size_array, lv_coord_t * pos_array, bool reverse); +static uint32_t count_tracks(const lv_coord_t * templ); + +static inline const lv_coord_t * get_col_dsc(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_column_dsc_array(obj, 0); +} +static inline const lv_coord_t * get_row_dsc(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_row_dsc_array(obj, 0); +} +static inline uint8_t get_col_pos(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_cell_column_pos(obj, 0); +} +static inline uint8_t get_row_pos(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_cell_row_pos(obj, 0); +} +static inline uint8_t get_col_span(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_cell_column_span(obj, 0); +} +static inline uint8_t get_row_span(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_cell_row_span(obj, 0); +} +static inline uint8_t get_cell_col_align(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_cell_x_align(obj, 0); +} +static inline uint8_t get_cell_row_align(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_cell_y_align(obj, 0); +} +static inline uint8_t get_grid_col_align(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_column_align(obj, 0); +} +static inline uint8_t get_grid_row_align(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_row_align(obj, 0); +} + +/********************** + * GLOBAL VARIABLES + **********************/ +uint16_t LV_LAYOUT_GRID; +lv_style_prop_t LV_STYLE_GRID_COLUMN_DSC_ARRAY; +lv_style_prop_t LV_STYLE_GRID_COLUMN_ALIGN; +lv_style_prop_t LV_STYLE_GRID_ROW_DSC_ARRAY; +lv_style_prop_t LV_STYLE_GRID_ROW_ALIGN; +lv_style_prop_t LV_STYLE_GRID_CELL_COLUMN_POS; +lv_style_prop_t LV_STYLE_GRID_CELL_COLUMN_SPAN; +lv_style_prop_t LV_STYLE_GRID_CELL_X_ALIGN; +lv_style_prop_t LV_STYLE_GRID_CELL_ROW_POS; +lv_style_prop_t LV_STYLE_GRID_CELL_ROW_SPAN; +lv_style_prop_t LV_STYLE_GRID_CELL_Y_ALIGN; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + + +void lv_grid_init(void) +{ + LV_LAYOUT_GRID = lv_layout_register(grid_update, NULL); + + LV_STYLE_GRID_COLUMN_DSC_ARRAY = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); + LV_STYLE_GRID_ROW_DSC_ARRAY = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); + LV_STYLE_GRID_COLUMN_ALIGN = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); + LV_STYLE_GRID_ROW_ALIGN = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); + + LV_STYLE_GRID_CELL_ROW_SPAN = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); + LV_STYLE_GRID_CELL_ROW_POS = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); + LV_STYLE_GRID_CELL_COLUMN_SPAN = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); + LV_STYLE_GRID_CELL_COLUMN_POS = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); + LV_STYLE_GRID_CELL_X_ALIGN = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); + LV_STYLE_GRID_CELL_Y_ALIGN = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); +} + +void lv_obj_set_grid_dsc_array(lv_obj_t * obj, const lv_coord_t col_dsc[], const lv_coord_t row_dsc[]) +{ + lv_obj_set_style_grid_column_dsc_array(obj, col_dsc, 0); + lv_obj_set_style_grid_row_dsc_array(obj, row_dsc, 0); + lv_obj_set_style_layout(obj, LV_LAYOUT_GRID, 0); +} + +void lv_obj_set_grid_align(lv_obj_t * obj, lv_grid_align_t column_align, lv_grid_align_t row_align) +{ + lv_obj_set_style_grid_column_align(obj, column_align, 0); + lv_obj_set_style_grid_row_align(obj, row_align, 0); + +} + +void lv_obj_set_grid_cell(lv_obj_t * obj, lv_grid_align_t x_align, uint8_t col_pos, uint8_t col_span, + lv_grid_align_t y_align, uint8_t row_pos, uint8_t row_span) + +{ + lv_obj_set_style_grid_cell_column_pos(obj, col_pos, 0); + lv_obj_set_style_grid_cell_row_pos(obj, row_pos, 0); + lv_obj_set_style_grid_cell_x_align(obj, x_align, 0); + lv_obj_set_style_grid_cell_column_span(obj, col_span, 0); + lv_obj_set_style_grid_cell_row_span(obj, row_span, 0); + lv_obj_set_style_grid_cell_y_align(obj, y_align, 0); + + lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); +} + + +void lv_style_set_grid_row_dsc_array(lv_style_t * style, const lv_coord_t value[]) +{ + lv_style_value_t v = { + .ptr = (const void *)value + }; + lv_style_set_prop(style, LV_STYLE_GRID_ROW_DSC_ARRAY, v); +} + +void lv_style_set_grid_column_dsc_array(lv_style_t * style, const lv_coord_t value[]) +{ + lv_style_value_t v = { + .ptr = (const void *)value + }; + lv_style_set_prop(style, LV_STYLE_GRID_COLUMN_DSC_ARRAY, v); +} + +void lv_style_set_grid_row_align(lv_style_t * style, lv_grid_align_t value) +{ + lv_style_value_t v = { + .num = (lv_grid_align_t)value + }; + lv_style_set_prop(style, LV_STYLE_GRID_ROW_ALIGN, v); +} + +void lv_style_set_grid_column_align(lv_style_t * style, lv_grid_align_t value) +{ + lv_style_value_t v = { + .num = (lv_grid_align_t)value + }; + lv_style_set_prop(style, LV_STYLE_GRID_COLUMN_ALIGN, v); +} + + +void lv_style_set_grid_cell_column_pos(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = value + }; + lv_style_set_prop(style, LV_STYLE_GRID_CELL_COLUMN_POS, v); +} + +void lv_style_set_grid_cell_column_span(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = value + }; + lv_style_set_prop(style, LV_STYLE_GRID_CELL_COLUMN_SPAN, v); +} + +void lv_style_set_grid_cell_row_pos(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = value + }; + lv_style_set_prop(style, LV_STYLE_GRID_CELL_ROW_POS, v); +} + +void lv_style_set_grid_cell_row_span(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = value + }; + lv_style_set_prop(style, LV_STYLE_GRID_CELL_ROW_SPAN, v); +} + +void lv_style_set_grid_cell_x_align(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = value + }; + lv_style_set_prop(style, LV_STYLE_GRID_CELL_X_ALIGN, v); +} + +void lv_style_set_grid_cell_y_align(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = value + }; + lv_style_set_prop(style, LV_STYLE_GRID_CELL_Y_ALIGN, v); +} + +void lv_obj_set_style_grid_row_dsc_array(lv_obj_t * obj, const lv_coord_t value[], lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = (const void *)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_ROW_DSC_ARRAY, v, selector); +} + +void lv_obj_set_style_grid_column_dsc_array(lv_obj_t * obj, const lv_coord_t value[], lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = (const void *)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_COLUMN_DSC_ARRAY, v, selector); +} + + +void lv_obj_set_style_grid_row_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t) value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_ROW_ALIGN, v, selector); +} + +void lv_obj_set_style_grid_column_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t) value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_COLUMN_ALIGN, v, selector); +} + + +void lv_obj_set_style_grid_cell_column_pos(lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_COLUMN_POS, v, selector); +} + +void lv_obj_set_style_grid_cell_column_span(lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_COLUMN_SPAN, v, selector); +} + +void lv_obj_set_style_grid_cell_row_pos(lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_ROW_POS, v, selector); +} + +void lv_obj_set_style_grid_cell_row_span(lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_ROW_SPAN, v, selector); +} + +void lv_obj_set_style_grid_cell_x_align(lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_X_ALIGN, v, selector); +} + +void lv_obj_set_style_grid_cell_y_align(lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_Y_ALIGN, v, selector); +} + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void grid_update(lv_obj_t * cont, void * user_data) +{ + LV_LOG_INFO("update %p container", (void *)cont); + LV_UNUSED(user_data); + + const lv_coord_t * col_templ = get_col_dsc(cont); + const lv_coord_t * row_templ = get_row_dsc(cont); + if(col_templ == NULL || row_templ == NULL) return; + + _lv_grid_calc_t c; + calc(cont, &c); + + item_repos_hint_t hint; + lv_memset_00(&hint, sizeof(hint)); + + /*Calculate the grids absolute x and y coordinates. + *It will be used as helper during item repositioning to avoid calculating this value for every children*/ + lv_coord_t border_widt = lv_obj_get_style_border_width(cont, LV_PART_MAIN); + lv_coord_t pad_left = lv_obj_get_style_pad_left(cont, LV_PART_MAIN) + border_widt; + lv_coord_t pad_top = lv_obj_get_style_pad_top(cont, LV_PART_MAIN) + border_widt; + hint.grid_abs.x = pad_left + cont->coords.x1 - lv_obj_get_scroll_x(cont); + hint.grid_abs.y = pad_top + cont->coords.y1 - lv_obj_get_scroll_y(cont); + + uint32_t i; + for(i = 0; i < cont->spec_attr->child_cnt; i++) { + lv_obj_t * item = cont->spec_attr->children[i]; + item_repos(item, &c, &hint); + } + calc_free(&c); + + lv_coord_t w_set = lv_obj_get_style_width(cont, LV_PART_MAIN); + lv_coord_t h_set = lv_obj_get_style_height(cont, LV_PART_MAIN); + if(w_set == LV_SIZE_CONTENT || h_set == LV_SIZE_CONTENT) { + lv_obj_refr_size(cont); + } + + lv_event_send(cont, LV_EVENT_LAYOUT_CHANGED, NULL); + + LV_TRACE_LAYOUT("finished"); +} + +/** + * Calculate the grid cells coordinates + * @param cont an object that has a grid + * @param calc store the calculated cells sizes here + * @note `_lv_grid_calc_free(calc_out)` needs to be called when `calc_out` is not needed anymore + */ +static void calc(lv_obj_t * cont, _lv_grid_calc_t * calc_out) +{ + if(lv_obj_get_child(cont, 0) == NULL) { + lv_memset_00(calc_out, sizeof(_lv_grid_calc_t)); + return; + } + + calc_rows(cont, calc_out); + calc_cols(cont, calc_out); + + lv_coord_t col_gap = lv_obj_get_style_pad_column(cont, LV_PART_MAIN); + lv_coord_t row_gap = lv_obj_get_style_pad_row(cont, LV_PART_MAIN); + + bool rev = lv_obj_get_style_base_dir(cont, LV_PART_MAIN) == LV_BASE_DIR_RTL ? true : false; + + lv_coord_t w_set = lv_obj_get_style_width(cont, LV_PART_MAIN); + lv_coord_t h_set = lv_obj_get_style_height(cont, LV_PART_MAIN); + bool auto_w = (w_set == LV_SIZE_CONTENT && !cont->w_layout) ? true : false; + lv_coord_t cont_w = lv_obj_get_content_width(cont); + calc_out->grid_w = grid_align(cont_w, auto_w, get_grid_col_align(cont), col_gap, calc_out->col_num, calc_out->w, + calc_out->x, rev); + + bool auto_h = (h_set == LV_SIZE_CONTENT && !cont->h_layout) ? true : false; + lv_coord_t cont_h = lv_obj_get_content_height(cont); + calc_out->grid_h = grid_align(cont_h, auto_h, get_grid_row_align(cont), row_gap, calc_out->row_num, calc_out->h, + calc_out->y, false); + + LV_ASSERT_MEM_INTEGRITY(); +} + +/** + * Free the a grid calculation's data + * @param calc pointer to the calculated grid cell coordinates + */ +static void calc_free(_lv_grid_calc_t * calc) +{ + lv_mem_buf_release(calc->x); + lv_mem_buf_release(calc->y); + lv_mem_buf_release(calc->w); + lv_mem_buf_release(calc->h); +} + +static void calc_cols(lv_obj_t * cont, _lv_grid_calc_t * c) +{ + const lv_coord_t * col_templ = get_col_dsc(cont); + lv_coord_t cont_w = lv_obj_get_content_width(cont); + + c->col_num = count_tracks(col_templ); + c->x = lv_mem_buf_get(sizeof(lv_coord_t) * c->col_num); + c->w = lv_mem_buf_get(sizeof(lv_coord_t) * c->col_num); + + /*Set sizes for CONTENT cells*/ + uint32_t i; + for(i = 0; i < c->col_num; i++) { + lv_coord_t size = LV_COORD_MIN; + if(IS_CONTENT(col_templ[i])) { + /*Check the size of children of this cell*/ + uint32_t ci; + for(ci = 0; ci < lv_obj_get_child_cnt(cont); ci++) { + lv_obj_t * item = lv_obj_get_child(cont, ci); + if(lv_obj_has_flag_any(item, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + uint32_t col_span = get_col_span(item); + if(col_span != 1) continue; + + uint32_t col_pos = get_col_pos(item); + if(col_pos != i) continue; + + size = LV_MAX(size, lv_obj_get_width(item)); + } + if(size >= 0) c->w[i] = size; + else c->w[i] = 0; + } + } + + uint32_t col_fr_cnt = 0; + lv_coord_t grid_w = 0; + + for(i = 0; i < c->col_num; i++) { + lv_coord_t x = col_templ[i]; + if(IS_FR(x)) { + col_fr_cnt += GET_FR(x); + } + else if(IS_CONTENT(x)) { + grid_w += c->w[i]; + } + else { + c->w[i] = x; + grid_w += x; + } + } + + lv_coord_t col_gap = lv_obj_get_style_pad_column(cont, LV_PART_MAIN); + cont_w -= col_gap * (c->col_num - 1); + lv_coord_t free_w = cont_w - grid_w; + if(free_w < 0) free_w = 0; + + int32_t last_fr_i = -1; + int32_t last_fr_x = 0; + for(i = 0; i < c->col_num; i++) { + lv_coord_t x = col_templ[i]; + if(IS_FR(x)) { + lv_coord_t f = GET_FR(x); + c->w[i] = (free_w * f) / col_fr_cnt; + last_fr_i = i; + last_fr_x = f; + } + } + + /*To avoid rounding errors set the last FR track to the remaining size */ + if(last_fr_i >= 0) { + c->w[last_fr_i] = free_w - ((free_w * (col_fr_cnt - last_fr_x)) / col_fr_cnt); + } +} + +static void calc_rows(lv_obj_t * cont, _lv_grid_calc_t * c) +{ + uint32_t i; + const lv_coord_t * row_templ = get_row_dsc(cont); + c->row_num = count_tracks(row_templ); + c->y = lv_mem_buf_get(sizeof(lv_coord_t) * c->row_num); + c->h = lv_mem_buf_get(sizeof(lv_coord_t) * c->row_num); + /*Set sizes for CONTENT cells*/ + for(i = 0; i < c->row_num; i++) { + lv_coord_t size = LV_COORD_MIN; + if(IS_CONTENT(row_templ[i])) { + /*Check the size of children of this cell*/ + uint32_t ci; + for(ci = 0; ci < lv_obj_get_child_cnt(cont); ci++) { + lv_obj_t * item = lv_obj_get_child(cont, ci); + if(lv_obj_has_flag_any(item, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + uint32_t row_span = get_row_span(item); + if(row_span != 1) continue; + + uint32_t row_pos = get_row_pos(item); + if(row_pos != i) continue; + + size = LV_MAX(size, lv_obj_get_height(item)); + } + if(size >= 0) c->h[i] = size; + else c->h[i] = 0; + } + } + + uint32_t row_fr_cnt = 0; + lv_coord_t grid_h = 0; + + for(i = 0; i < c->row_num; i++) { + lv_coord_t x = row_templ[i]; + if(IS_FR(x)) { + row_fr_cnt += GET_FR(x); + } + else if(IS_CONTENT(x)) { + grid_h += c->h[i]; + } + else { + c->h[i] = x; + grid_h += x; + } + } + + + lv_coord_t row_gap = lv_obj_get_style_pad_row(cont, LV_PART_MAIN); + lv_coord_t cont_h = lv_obj_get_content_height(cont) - row_gap * (c->row_num - 1); + lv_coord_t free_h = cont_h - grid_h; + if(free_h < 0) free_h = 0; + + int32_t last_fr_i = -1; + int32_t last_fr_x = 0; + for(i = 0; i < c->row_num; i++) { + lv_coord_t x = row_templ[i]; + if(IS_FR(x)) { + lv_coord_t f = GET_FR(x); + c->h[i] = (free_h * f) / row_fr_cnt; + last_fr_i = i; + last_fr_x = f; + } + } + + /*To avoid rounding errors set the last FR track to the remaining size */ + if(last_fr_i >= 0) { + c->h[last_fr_i] = free_h - ((free_h * (row_fr_cnt - last_fr_x)) / row_fr_cnt); + } +} + +/** + * Reposition a grid item in its cell + * @param item a grid item to reposition + * @param calc the calculated grid of `cont` + * @param child_id_ext helper value if the ID of the child is know (order from the oldest) else -1 + * @param grid_abs helper value, the absolute position of the grid, NULL if unknown + */ +static void item_repos(lv_obj_t * item, _lv_grid_calc_t * c, item_repos_hint_t * hint) +{ + if(lv_obj_has_flag_any(item, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) return; + uint32_t col_span = get_col_span(item); + uint32_t row_span = get_row_span(item); + if(row_span == 0 || col_span == 0) return; + + uint32_t col_pos = get_col_pos(item); + uint32_t row_pos = get_row_pos(item); + lv_grid_align_t col_align = get_cell_col_align(item); + lv_grid_align_t row_align = get_cell_row_align(item); + + + lv_coord_t col_x1 = c->x[col_pos]; + lv_coord_t col_x2 = c->x[col_pos + col_span - 1] + c->w[col_pos + col_span - 1]; + lv_coord_t col_w = col_x2 - col_x1; + + lv_coord_t row_y1 = c->y[row_pos]; + lv_coord_t row_y2 = c->y[row_pos + row_span - 1] + c->h[row_pos + row_span - 1]; + lv_coord_t row_h = row_y2 - row_y1; + + + /*If the item has RTL base dir switch start and end*/ + if(lv_obj_get_style_base_dir(item, LV_PART_MAIN) == LV_BASE_DIR_RTL) { + if(col_align == LV_GRID_ALIGN_START) col_align = LV_GRID_ALIGN_END; + else if(col_align == LV_GRID_ALIGN_END) col_align = LV_GRID_ALIGN_START; + } + + lv_coord_t x; + lv_coord_t y; + lv_coord_t item_w = lv_area_get_width(&item->coords); + lv_coord_t item_h = lv_area_get_height(&item->coords); + + switch(col_align) { + default: + case LV_GRID_ALIGN_START: + x = c->x[col_pos]; + item->w_layout = 0; + break; + case LV_GRID_ALIGN_STRETCH: + x = c->x[col_pos]; + item_w = col_w; + item->w_layout = 1; + break; + case LV_GRID_ALIGN_CENTER: + x = c->x[col_pos] + (col_w - item_w) / 2; + item->w_layout = 0; + break; + case LV_GRID_ALIGN_END: + x = c->x[col_pos] + col_w - lv_obj_get_width(item); + item->w_layout = 0; + break; + } + + switch(row_align) { + default: + case LV_GRID_ALIGN_START: + y = c->y[row_pos]; + item->h_layout = 0; + break; + case LV_GRID_ALIGN_STRETCH: + y = c->y[row_pos]; + item_h = row_h; + item->h_layout = 1; + break; + case LV_GRID_ALIGN_CENTER: + y = c->y[row_pos] + (row_h - item_h) / 2; + item->h_layout = 0; + break; + case LV_GRID_ALIGN_END: + y = c->y[row_pos] + row_h - lv_obj_get_height(item); + item->h_layout = 0; + break; + } + + /*Set a new size if required*/ + if(lv_obj_get_width(item) != item_w || lv_obj_get_height(item) != item_h) { + lv_area_t old_coords; + lv_area_copy(&old_coords, &item->coords); + lv_obj_invalidate(item); + lv_area_set_width(&item->coords, item_w); + lv_area_set_height(&item->coords, item_h); + lv_obj_invalidate(item); + lv_event_send(item, LV_EVENT_SIZE_CHANGED, &old_coords); + lv_event_send(lv_obj_get_parent(item), LV_EVENT_CHILD_CHANGED, item); + + } + + /*Handle percentage value of translate*/ + lv_coord_t tr_x = lv_obj_get_style_translate_x(item, LV_PART_MAIN); + lv_coord_t tr_y = lv_obj_get_style_translate_y(item, LV_PART_MAIN); + lv_coord_t w = lv_obj_get_width(item); + lv_coord_t h = lv_obj_get_height(item); + if(LV_COORD_IS_PCT(tr_x)) tr_x = (w * LV_COORD_GET_PCT(tr_x)) / 100; + if(LV_COORD_IS_PCT(tr_y)) tr_y = (h * LV_COORD_GET_PCT(tr_y)) / 100; + + x += tr_x; + y += tr_y; + + lv_coord_t diff_x = hint->grid_abs.x + x - item->coords.x1; + lv_coord_t diff_y = hint->grid_abs.y + y - item->coords.y1; + if(diff_x || diff_y) { + lv_obj_invalidate(item); + item->coords.x1 += diff_x; + item->coords.x2 += diff_x; + item->coords.y1 += diff_y; + item->coords.y2 += diff_y; + lv_obj_invalidate(item); + lv_obj_move_children_by(item, diff_x, diff_y, false); + } +} + +/** + * Place the grid track according to align methods. It keeps the track sizes but sets their position. + * It can process both columns or rows according to the passed parameters. + * @param cont_size size of the containers content area (width/height) + * @param auto_size true: the container has auto size in the current direction + * @param align align method + * @param gap grid gap + * @param track_num number of tracks + * @param size_array array with the track sizes + * @param pos_array write the positions of the tracks here + * @return the total size of the grid + */ +static lv_coord_t grid_align(lv_coord_t cont_size, bool auto_size, uint8_t align, lv_coord_t gap, uint32_t track_num, + lv_coord_t * size_array, lv_coord_t * pos_array, bool reverse) +{ + lv_coord_t grid_size = 0; + uint32_t i; + + if(auto_size) { + pos_array[0] = 0; + } + else { + /*With spaced alignment gap will be calculated from the remaining space*/ + if(align == LV_GRID_ALIGN_SPACE_AROUND || align == LV_GRID_ALIGN_SPACE_BETWEEN || align == LV_GRID_ALIGN_SPACE_EVENLY) { + gap = 0; + if(track_num == 1) align = LV_GRID_ALIGN_CENTER; + } + + /*Get the full grid size with gap*/ + for(i = 0; i < track_num; i++) { + grid_size += size_array[i] + gap; + } + grid_size -= gap; + + /*Calculate the position of the first item and set gap is necessary*/ + switch(align) { + case LV_GRID_ALIGN_START: + pos_array[0] = 0; + break; + case LV_GRID_ALIGN_CENTER: + pos_array[0] = (cont_size - grid_size) / 2; + break; + case LV_GRID_ALIGN_END: + pos_array[0] = cont_size - grid_size; + break; + case LV_GRID_ALIGN_SPACE_BETWEEN: + pos_array[0] = 0; + gap = (lv_coord_t)(cont_size - grid_size) / (lv_coord_t)(track_num - 1); + break; + case LV_GRID_ALIGN_SPACE_AROUND: + gap = (lv_coord_t)(cont_size - grid_size) / (lv_coord_t)(track_num); + pos_array[0] = gap / 2; + break; + case LV_GRID_ALIGN_SPACE_EVENLY: + gap = (lv_coord_t)(cont_size - grid_size) / (lv_coord_t)(track_num + 1); + pos_array[0] = gap; + break; + + } + } + + /*Set the position of all tracks from the start position, gaps and track sizes*/ + for(i = 0; i < track_num - 1; i++) { + pos_array[i + 1] = pos_array[i] + size_array[i] + gap; + } + + lv_coord_t total_gird_size = pos_array[track_num - 1] + size_array[track_num - 1] - pos_array[0]; + + if(reverse) { + for(i = 0; i < track_num; i++) { + pos_array[i] = cont_size - pos_array[i] - size_array[i]; + } + + } + + /*Return the full size of the grid*/ + return total_gird_size; +} + +static uint32_t count_tracks(const lv_coord_t * templ) +{ + uint32_t i; + for(i = 0; templ[i] != LV_GRID_TEMPLATE_LAST; i++); + + return i; +} + + +#endif /*LV_USE_GRID*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/layouts/grid/lv_grid.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/layouts/grid/lv_grid.h new file mode 100644 index 0000000..5c4f767 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/layouts/grid/lv_grid.h @@ -0,0 +1,194 @@ +/** + * @file lv_grid.h + * + */ + +#ifndef LV_GRID_H +#define LV_GRID_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../core/lv_obj.h" +#if LV_USE_GRID + +/********************* + * DEFINES + *********************/ +/** + * Can be used track size to make the track fill the free space. + * @param x how much space to take proportionally to other FR tracks + * @return a special track size + */ +#define LV_GRID_FR(x) (LV_COORD_MAX - 100 + x) + +#define LV_GRID_CONTENT (LV_COORD_MAX - 101) +LV_EXPORT_CONST_INT(LV_GRID_CONTENT); + +#define LV_GRID_TEMPLATE_LAST (LV_COORD_MAX) +LV_EXPORT_CONST_INT(LV_GRID_TEMPLATE_LAST); + +/********************** + * TYPEDEFS + **********************/ + +/*Can't include lv_obj.h because it includes this header file*/ +struct _lv_obj_t; + +typedef enum { + LV_GRID_ALIGN_START, + LV_GRID_ALIGN_CENTER, + LV_GRID_ALIGN_END, + LV_GRID_ALIGN_STRETCH, + LV_GRID_ALIGN_SPACE_EVENLY, + LV_GRID_ALIGN_SPACE_AROUND, + LV_GRID_ALIGN_SPACE_BETWEEN, +} lv_grid_align_t; + +/********************** + * GLOBAL VARIABLES + **********************/ + +extern uint16_t LV_LAYOUT_GRID; +extern lv_style_prop_t LV_STYLE_GRID_COLUMN_DSC_ARRAY; +extern lv_style_prop_t LV_STYLE_GRID_COLUMN_ALIGN; +extern lv_style_prop_t LV_STYLE_GRID_ROW_DSC_ARRAY; +extern lv_style_prop_t LV_STYLE_GRID_ROW_ALIGN; +extern lv_style_prop_t LV_STYLE_GRID_CELL_COLUMN_POS; +extern lv_style_prop_t LV_STYLE_GRID_CELL_COLUMN_SPAN; +extern lv_style_prop_t LV_STYLE_GRID_CELL_X_ALIGN; +extern lv_style_prop_t LV_STYLE_GRID_CELL_ROW_POS; +extern lv_style_prop_t LV_STYLE_GRID_CELL_ROW_SPAN; +extern lv_style_prop_t LV_STYLE_GRID_CELL_Y_ALIGN; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_grid_init(void); + +void lv_obj_set_grid_dsc_array(lv_obj_t * obj, const lv_coord_t col_dsc[], const lv_coord_t row_dsc[]); + +void lv_obj_set_grid_align(lv_obj_t * obj, lv_grid_align_t column_align, lv_grid_align_t row_align); + +/** + * Set the cell of an object. The object's parent needs to have grid layout, else nothing will happen + * @param obj pointer to an object + * @param column_align the vertical alignment in the cell. `LV_GRID_START/END/CENTER/STRETCH` + * @param col_pos column ID + * @param col_span number of columns to take (>= 1) + * @param row_align the horizontal alignment in the cell. `LV_GRID_START/END/CENTER/STRETCH` + * @param row_pos row ID + * @param row_span number of rows to take (>= 1) + */ +void lv_obj_set_grid_cell(lv_obj_t * obj, lv_grid_align_t column_align, uint8_t col_pos, uint8_t col_span, + lv_grid_align_t row_align, uint8_t row_pos, uint8_t row_span); + +/** + * Just a wrapper to `LV_GRID_FR` for bindings. + */ +static inline lv_coord_t lv_grid_fr(uint8_t x) +{ + return LV_GRID_FR(x); +} + +void lv_style_set_grid_row_dsc_array(lv_style_t * style, const lv_coord_t value[]); +void lv_style_set_grid_column_dsc_array(lv_style_t * style, const lv_coord_t value[]); +void lv_style_set_grid_row_align(lv_style_t * style, lv_grid_align_t value); +void lv_style_set_grid_column_align(lv_style_t * style, lv_grid_align_t value); +void lv_style_set_grid_cell_column_pos(lv_style_t * style, lv_coord_t value); +void lv_style_set_grid_cell_column_span(lv_style_t * style, lv_coord_t value); +void lv_style_set_grid_cell_row_pos(lv_style_t * style, lv_coord_t value); +void lv_style_set_grid_cell_row_span(lv_style_t * style, lv_coord_t value); +void lv_style_set_grid_cell_x_align(lv_style_t * style, lv_coord_t value); +void lv_style_set_grid_cell_y_align(lv_style_t * style, lv_coord_t value); + +void lv_obj_set_style_grid_row_dsc_array(lv_obj_t * obj, const lv_coord_t value[], lv_style_selector_t selector); +void lv_obj_set_style_grid_column_dsc_array(lv_obj_t * obj, const lv_coord_t value[], lv_style_selector_t selector); +void lv_obj_set_style_grid_row_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector); +void lv_obj_set_style_grid_column_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector); +void lv_obj_set_style_grid_cell_column_pos(lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_grid_cell_column_span(lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_grid_cell_row_pos(lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_grid_cell_row_span(lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_grid_cell_x_align(lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); +void lv_obj_set_style_grid_cell_y_align(lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); + +static inline const lv_coord_t * lv_obj_get_style_grid_row_dsc_array(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_ROW_DSC_ARRAY); + return (const lv_coord_t *)v.ptr; +} + +static inline const lv_coord_t * lv_obj_get_style_grid_column_dsc_array(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_COLUMN_DSC_ARRAY); + return (const lv_coord_t *)v.ptr; +} + +static inline lv_grid_align_t lv_obj_get_style_grid_row_align(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_ROW_ALIGN); + return (lv_grid_align_t)v.num; +} + +static inline lv_grid_align_t lv_obj_get_style_grid_column_align(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_COLUMN_ALIGN); + return (lv_grid_align_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_grid_cell_column_pos(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_COLUMN_POS); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_grid_cell_column_span(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_COLUMN_SPAN); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_grid_cell_row_pos(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_ROW_POS); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_grid_cell_row_span(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_ROW_SPAN); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_grid_cell_x_align(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_X_ALIGN); + return (lv_coord_t)v.num; +} + +static inline lv_coord_t lv_obj_get_style_grid_cell_y_align(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_Y_ALIGN); + return (lv_coord_t)v.num; +} + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#endif /*LV_USE_GRID*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GRID_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/layouts/lv_layouts.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/layouts/lv_layouts.h new file mode 100644 index 0000000..9c1e958 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/layouts/lv_layouts.h @@ -0,0 +1,44 @@ +/** + * @file lv_layouts.h + * + */ + +#ifndef LV_LAYOUTS_H +#define LV_LAYOUTS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "flex/lv_flex.h" +#include "grid/lv_grid.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ +#if LV_USE_LOG && LV_LOG_TRACE_LAYOUT +# define LV_TRACE_LAYOUT(...) LV_LOG_TRACE(__VA_ARGS__) +#else +# define LV_TRACE_LAYOUT(...) +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LAYOUTS_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/bmp/lv_bmp.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/bmp/lv_bmp.c new file mode 100644 index 0000000..f89a0a8 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/bmp/lv_bmp.c @@ -0,0 +1,258 @@ +/** + * @file lv_bmp.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" +#if LV_USE_BMP + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_fs_file_t f; + unsigned int px_offset; + int px_width; + int px_height; + unsigned int bpp; + int row_size_bytes; +} bmp_dsc_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_res_t decoder_info(lv_img_decoder_t * decoder, const void * src, lv_img_header_t * header); +static lv_res_t decoder_open(lv_img_decoder_t * dec, lv_img_decoder_dsc_t * dsc); + + +static lv_res_t decoder_read_line(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc, + lv_coord_t x, lv_coord_t y, lv_coord_t len, uint8_t * buf); + +static void decoder_close(lv_img_decoder_t * dec, lv_img_decoder_dsc_t * dsc); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_bmp_init(void) +{ + lv_img_decoder_t * dec = lv_img_decoder_create(); + lv_img_decoder_set_info_cb(dec, decoder_info); + lv_img_decoder_set_open_cb(dec, decoder_open); + lv_img_decoder_set_read_line_cb(dec, decoder_read_line); + lv_img_decoder_set_close_cb(dec, decoder_close); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Get info about a PNG image + * @param src can be file name or pointer to a C array + * @param header store the info here + * @return LV_RES_OK: no error; LV_RES_INV: can't get the info + */ +static lv_res_t decoder_info(lv_img_decoder_t * decoder, const void * src, lv_img_header_t * header) +{ + LV_UNUSED(decoder); + + lv_img_src_t src_type = lv_img_src_get_type(src); /*Get the source type*/ + + /*If it's a BMP file...*/ + if(src_type == LV_IMG_SRC_FILE) { + const char * fn = src; + if(strcmp(lv_fs_get_ext(fn), "bmp") == 0) { /*Check the extension*/ + /*Save the data in the header*/ + lv_fs_file_t f; + lv_fs_res_t res = lv_fs_open(&f, src, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) return LV_RES_INV; + uint8_t headers[54]; + + lv_fs_read(&f, headers, 54, NULL); + uint32_t w; + uint32_t h; + memcpy(&w, headers + 18, 4); + memcpy(&h, headers + 22, 4); + header->w = w; + header->h = h; + header->always_zero = 0; + lv_fs_close(&f); +#if LV_COLOR_DEPTH == 32 + uint16_t bpp; + memcpy(&bpp, headers + 28, 2); + header->cf = bpp == 32 ? LV_IMG_CF_TRUE_COLOR_ALPHA : LV_IMG_CF_TRUE_COLOR; +#else + header->cf = LV_IMG_CF_TRUE_COLOR; +#endif + return LV_RES_OK; + } + } + /* BMP file as data not supported for simplicity. + * Convert them to LVGL compatible C arrays directly. */ + else if(src_type == LV_IMG_SRC_VARIABLE) { + return LV_RES_INV; + } + + return LV_RES_INV; /*If didn't succeeded earlier then it's an error*/ +} + + +/** + * Open a PNG image and return the decided image + * @param src can be file name or pointer to a C array + * @param style style of the image object (unused now but certain formats might use it) + * @return pointer to the decoded image or `LV_IMG_DECODER_OPEN_FAIL` if failed + */ +static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + + /*If it's a PNG file...*/ + if(dsc->src_type == LV_IMG_SRC_FILE) { + const char * fn = dsc->src; + + if(strcmp(lv_fs_get_ext(fn), "bmp") != 0) { + return LV_RES_INV; /*Check the extension*/ + } + + bmp_dsc_t b; + memset(&b, 0x00, sizeof(b)); + + lv_fs_res_t res = lv_fs_open(&b.f, dsc->src, LV_FS_MODE_RD); + if(res == LV_RES_OK) return LV_RES_INV; + + uint8_t header[54]; + lv_fs_read(&b.f, header, 54, NULL); + + if(0x42 != header[0] || 0x4d != header[1]) { + lv_fs_close(&b.f); + return LV_RES_INV; + } + + memcpy(&b.px_offset, header + 10, 4); + memcpy(&b.px_width, header + 18, 4); + memcpy(&b.px_height, header + 22, 4); + memcpy(&b.bpp, header + 28, 2); + b.row_size_bytes = ((b.bpp * b.px_width + 31) / 32) * 4; + + bool color_depth_error = false; + if(LV_COLOR_DEPTH == 32 && (b.bpp != 32 && b.bpp != 24)) { + LV_LOG_WARN("LV_COLOR_DEPTH == 32 but bpp is %d (should be 32 or 24)", b.bpp); + color_depth_error = true; + } + else if(LV_COLOR_DEPTH == 16 && b.bpp != 16) { + LV_LOG_WARN("LV_COLOR_DEPTH == 16 but bpp is %d (should be 16)", b.bpp); + color_depth_error = true; + } + else if(LV_COLOR_DEPTH == 8 && b.bpp != 8) { + LV_LOG_WARN("LV_COLOR_DEPTH == 8 but bpp is %d (should be 8)", b.bpp); + color_depth_error = true; + } + + if(color_depth_error) { + dsc->error_msg = "Color depth mismatch"; + lv_fs_close(&b.f); + return LV_RES_INV; + } + + dsc->user_data = lv_mem_alloc(sizeof(bmp_dsc_t)); + LV_ASSERT_MALLOC(dsc->user_data); + if(dsc->user_data == NULL) return LV_RES_INV; + memcpy(dsc->user_data, &b, sizeof(b)); + + dsc->img_data = NULL; + return LV_RES_OK; + } + /* BMP file as data not supported for simplicity. + * Convert them to LVGL compatible C arrays directly. */ + else if(dsc->src_type == LV_IMG_SRC_VARIABLE) { + return LV_RES_INV; + } + + return LV_RES_INV; /*If not returned earlier then it failed*/ +} + + +static lv_res_t decoder_read_line(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc, + lv_coord_t x, lv_coord_t y, lv_coord_t len, uint8_t * buf) +{ + LV_UNUSED(decoder); + + bmp_dsc_t * b = dsc->user_data; + y = (b->px_height - 1) - y; /*BMP images are stored upside down*/ + uint32_t p = b->px_offset + b->row_size_bytes * y; + p += x * (b->bpp / 8); + lv_fs_seek(&b->f, p, LV_FS_SEEK_SET); + lv_fs_read(&b->f, buf, len * (b->bpp / 8), NULL); + +#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 1 + for(unsigned int i = 0; i < len * (b->bpp / 8); i += 2) { + buf[i] = buf[i] ^ buf[i + 1]; + buf[i + 1] = buf[i] ^ buf[i + 1]; + buf[i] = buf[i] ^ buf[i + 1]; + } + +#elif LV_COLOR_DEPTH == 32 + if(b->bpp == 32) { + lv_coord_t i; + for(i = 0; i < len; i++) { + uint8_t b0 = buf[i * 4]; + uint8_t b1 = buf[i * 4 + 1]; + uint8_t b2 = buf[i * 4 + 2]; + uint8_t b3 = buf[i * 4 + 3]; + lv_color32_t * c = (lv_color32_t *)&buf[i * 4]; + c->ch.red = b2; + c->ch.green = b1; + c->ch.blue = b0; + c->ch.alpha = b3; + } + } + if(b->bpp == 24) { + lv_coord_t i; + + for(i = len - 1; i >= 0; i--) { + uint8_t * t = &buf[i * 3]; + lv_color32_t * c = (lv_color32_t *)&buf[i * 4]; + c->ch.red = t[2]; + c->ch.green = t[1]; + c->ch.blue = t[0]; + c->ch.alpha = 0xff; + } + } +#endif + + return LV_RES_OK; +} + + +/** + * Free the allocated resources + */ +static void decoder_close(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + bmp_dsc_t * b = dsc->user_data; + lv_fs_close(&b->f); + lv_mem_free(dsc->user_data); + +} + +#endif /*LV_USE_BMP*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/bmp/lv_bmp.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/bmp/lv_bmp.h new file mode 100644 index 0000000..db1e540 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/bmp/lv_bmp.h @@ -0,0 +1,42 @@ +/** + * @file lv_bmp.h + * + */ + +#ifndef LV_BMP_H +#define LV_BMP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" +#if LV_USE_BMP + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void lv_bmp_init(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_BMP*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_BMP_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/ffmpeg/lv_ffmpeg.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/ffmpeg/lv_ffmpeg.c new file mode 100644 index 0000000..efaa692 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/ffmpeg/lv_ffmpeg.c @@ -0,0 +1,875 @@ +/** + * @file lv_ffmpeg.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_ffmpeg.h" +#if LV_USE_FFMPEG != 0 + +#include +#include +#include +#include +#include +#include + +/********************* + * DEFINES + *********************/ +#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8 + #define AV_PIX_FMT_TRUE_COLOR AV_PIX_FMT_RGB8 +#elif LV_COLOR_DEPTH == 16 + #if LV_COLOR_16_SWAP == 0 + #define AV_PIX_FMT_TRUE_COLOR AV_PIX_FMT_RGB565LE + #else + #define AV_PIX_FMT_TRUE_COLOR AV_PIX_FMT_RGB565BE + #endif +#elif LV_COLOR_DEPTH == 32 + #define AV_PIX_FMT_TRUE_COLOR AV_PIX_FMT_BGR0 +#else + #error Unsupported LV_COLOR_DEPTH +#endif + +#define MY_CLASS &lv_ffmpeg_player_class + +#define FRAME_DEF_REFR_PERIOD 33 /*[ms]*/ + +/********************** + * TYPEDEFS + **********************/ +struct ffmpeg_context_s { + AVFormatContext * fmt_ctx; + AVCodecContext * video_dec_ctx; + AVStream * video_stream; + uint8_t * video_src_data[4]; + uint8_t * video_dst_data[4]; + struct SwsContext * sws_ctx; + AVFrame * frame; + AVPacket pkt; + int video_stream_idx; + int video_src_linesize[4]; + int video_dst_linesize[4]; + enum AVPixelFormat video_dst_pix_fmt; + bool has_alpha; +}; + +#pragma pack(1) + +struct lv_img_pixel_color_s { + lv_color_t c; + uint8_t alpha; +}; + +#pragma pack() + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_res_t decoder_info(lv_img_decoder_t * decoder, const void * src, lv_img_header_t * header); +static lv_res_t decoder_open(lv_img_decoder_t * dec, lv_img_decoder_dsc_t * dsc); +static void decoder_close(lv_img_decoder_t * dec, lv_img_decoder_dsc_t * dsc); + +static struct ffmpeg_context_s * ffmpeg_open_file(const char * path); +static void ffmpeg_close(struct ffmpeg_context_s * ffmpeg_ctx); +static void ffmpeg_close_src_ctx(struct ffmpeg_context_s * ffmpeg_ctx); +static void ffmpeg_close_dst_ctx(struct ffmpeg_context_s * ffmpeg_ctx); +static int ffmpeg_image_allocate(struct ffmpeg_context_s * ffmpeg_ctx); +static int ffmpeg_get_img_header(const char * path, lv_img_header_t * header); +static int ffmpeg_get_frame_refr_period(struct ffmpeg_context_s * ffmpeg_ctx); +static uint8_t * ffmpeg_get_img_data(struct ffmpeg_context_s * ffmpeg_ctx); +static int ffmpeg_update_next_frame(struct ffmpeg_context_s * ffmpeg_ctx); +static int ffmpeg_output_video_frame(struct ffmpeg_context_s * ffmpeg_ctx); +static bool ffmpeg_pix_fmt_has_alpha(enum AVPixelFormat pix_fmt); +static bool ffmpeg_pix_fmt_is_yuv(enum AVPixelFormat pix_fmt); + +static void lv_ffmpeg_player_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_ffmpeg_player_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); + +#if LV_COLOR_DEPTH != 32 + static void convert_color_depth(uint8_t * img, uint32_t px_cnt); +#endif + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_ffmpeg_player_class = { + .constructor_cb = lv_ffmpeg_player_constructor, + .destructor_cb = lv_ffmpeg_player_destructor, + .instance_size = sizeof(lv_ffmpeg_player_t), + .base_class = &lv_img_class +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_ffmpeg_init(void) +{ + lv_img_decoder_t * dec = lv_img_decoder_create(); + lv_img_decoder_set_info_cb(dec, decoder_info); + lv_img_decoder_set_open_cb(dec, decoder_open); + lv_img_decoder_set_close_cb(dec, decoder_close); + +#if LV_FFMPEG_AV_DUMP_FORMAT == 0 + av_log_set_level(AV_LOG_QUIET); +#endif +} + +int lv_ffmpeg_get_frame_num(const char * path) +{ + int ret = -1; + struct ffmpeg_context_s * ffmpeg_ctx = ffmpeg_open_file(path); + + if(ffmpeg_ctx) { + ret = ffmpeg_ctx->video_stream->nb_frames; + ffmpeg_close(ffmpeg_ctx); + } + + return ret; +} + +lv_obj_t * lv_ffmpeg_player_create(lv_obj_t * parent) +{ + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +lv_res_t lv_ffmpeg_player_set_src(lv_obj_t * obj, const char * path) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_res_t res = LV_RES_INV; + + lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; + + if(player->ffmpeg_ctx) { + ffmpeg_close(player->ffmpeg_ctx); + player->ffmpeg_ctx = NULL; + } + + lv_timer_pause(player->timer); + + player->ffmpeg_ctx = ffmpeg_open_file(path); + + if(!player->ffmpeg_ctx) { + LV_LOG_ERROR("ffmpeg file open failed: %s", path); + goto failed; + } + + if(ffmpeg_image_allocate(player->ffmpeg_ctx) < 0) { + LV_LOG_ERROR("ffmpeg image allocate failed"); + ffmpeg_close(player->ffmpeg_ctx); + goto failed; + } + + bool has_alpha = player->ffmpeg_ctx->has_alpha; + int width = player->ffmpeg_ctx->video_dec_ctx->width; + int height = player->ffmpeg_ctx->video_dec_ctx->height; + uint32_t data_size = 0; + + if(has_alpha) { + data_size = width * height * LV_IMG_PX_SIZE_ALPHA_BYTE; + } + else { + data_size = width * height * LV_COLOR_SIZE / 8; + } + + player->imgdsc.header.always_zero = 0; + player->imgdsc.header.w = width; + player->imgdsc.header.h = height; + player->imgdsc.data_size = data_size; + player->imgdsc.header.cf = has_alpha ? LV_IMG_CF_TRUE_COLOR_ALPHA : LV_IMG_CF_TRUE_COLOR; + player->imgdsc.data = ffmpeg_get_img_data(player->ffmpeg_ctx); + + lv_img_set_src(&player->img.obj, &(player->imgdsc)); + + int period = ffmpeg_get_frame_refr_period(player->ffmpeg_ctx); + + if(period > 0) { + LV_LOG_INFO("frame refresh period = %d ms, rate = %d fps", + period, 1000 / period); + lv_timer_set_period(player->timer, period); + } + else { + LV_LOG_WARN("unable to get frame refresh period"); + } + + res = LV_RES_OK; + +failed: + return res; +} + +void lv_ffmpeg_player_set_cmd(lv_obj_t * obj, lv_ffmpeg_player_cmd_t cmd) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; + + if(!player->ffmpeg_ctx) { + LV_LOG_ERROR("ffmpeg_ctx is NULL"); + return; + } + + lv_timer_t * timer = player->timer; + + switch(cmd) { + case LV_FFMPEG_PLAYER_CMD_START: + av_seek_frame(player->ffmpeg_ctx->fmt_ctx, + 0, 0, AVSEEK_FLAG_BACKWARD); + lv_timer_resume(timer); + LV_LOG_INFO("ffmpeg player start"); + break; + case LV_FFMPEG_PLAYER_CMD_STOP: + av_seek_frame(player->ffmpeg_ctx->fmt_ctx, + 0, 0, AVSEEK_FLAG_BACKWARD); + lv_timer_pause(timer); + LV_LOG_INFO("ffmpeg player stop"); + break; + case LV_FFMPEG_PLAYER_CMD_PAUSE: + lv_timer_pause(timer); + LV_LOG_INFO("ffmpeg player pause"); + break; + case LV_FFMPEG_PLAYER_CMD_RESUME: + lv_timer_resume(timer); + LV_LOG_INFO("ffmpeg player resume"); + break; + default: + LV_LOG_ERROR("Error cmd: %d", cmd); + break; + } +} + +void lv_ffmpeg_player_set_auto_restart(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; + player->auto_restart = en; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_res_t decoder_info(lv_img_decoder_t * decoder, const void * src, lv_img_header_t * header) +{ + /* Get the source type */ + lv_img_src_t src_type = lv_img_src_get_type(src); + + if(src_type == LV_IMG_SRC_FILE) { + const char * fn = src; + + if(ffmpeg_get_img_header(fn, header) < 0) { + LV_LOG_ERROR("ffmpeg can't get image header"); + return LV_RES_INV; + } + + return LV_RES_OK; + } + + /* If didn't succeeded earlier then it's an error */ + return LV_RES_INV; +} + +static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc) +{ + if(dsc->src_type == LV_IMG_SRC_FILE) { + const char * path = dsc->src; + + struct ffmpeg_context_s * ffmpeg_ctx = ffmpeg_open_file(path); + + if(ffmpeg_ctx == NULL) { + return LV_RES_INV; + } + + if(ffmpeg_image_allocate(ffmpeg_ctx) < 0) { + LV_LOG_ERROR("ffmpeg image allocate failed"); + ffmpeg_close(ffmpeg_ctx); + return LV_RES_INV; + } + + if(ffmpeg_update_next_frame(ffmpeg_ctx) < 0) { + ffmpeg_close(ffmpeg_ctx); + LV_LOG_ERROR("ffmpeg update frame failed"); + return LV_RES_INV; + } + + ffmpeg_close_src_ctx(ffmpeg_ctx); + uint8_t * img_data = ffmpeg_get_img_data(ffmpeg_ctx); + +#if LV_COLOR_DEPTH != 32 + if(ffmpeg_ctx->has_alpha) { + convert_color_depth(img_data, dsc->header.w * dsc->header.h); + } +#endif + + dsc->user_data = ffmpeg_ctx; + dsc->img_data = img_data; + + /* The image is fully decoded. Return with its pointer */ + return LV_RES_OK; + } + + /* If not returned earlier then it failed */ + return LV_RES_INV; +} + +static void decoder_close(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc) +{ + struct ffmpeg_context_s * ffmpeg_ctx = dsc->user_data; + ffmpeg_close(ffmpeg_ctx); +} + +#if LV_COLOR_DEPTH != 32 + +static void convert_color_depth(uint8_t * img, uint32_t px_cnt) +{ + lv_color32_t * img_src_p = (lv_color32_t *)img; + struct lv_img_pixel_color_s * img_dst_p = (struct lv_img_pixel_color_s *)img; + + for(uint32_t i = 0; i < px_cnt; i++) { + lv_color32_t temp = *img_src_p; + img_dst_p->c = lv_color_hex(temp.full); + img_dst_p->alpha = temp.ch.alpha; + + img_src_p++; + img_dst_p++; + } +} + +#endif + +static uint8_t * ffmpeg_get_img_data(struct ffmpeg_context_s * ffmpeg_ctx) +{ + uint8_t * img_data = ffmpeg_ctx->video_dst_data[0]; + + if(img_data == NULL) { + LV_LOG_ERROR("ffmpeg video dst data is NULL"); + } + + return img_data; +} + +static bool ffmpeg_pix_fmt_has_alpha(enum AVPixelFormat pix_fmt) +{ + const AVPixFmtDescriptor * desc = av_pix_fmt_desc_get(pix_fmt); + + if(desc == NULL) { + return false; + } + + if(pix_fmt == AV_PIX_FMT_PAL8) { + return true; + } + + return (desc->flags & AV_PIX_FMT_FLAG_ALPHA) ? true : false; +} + +static bool ffmpeg_pix_fmt_is_yuv(enum AVPixelFormat pix_fmt) +{ + const AVPixFmtDescriptor * desc = av_pix_fmt_desc_get(pix_fmt); + + if(desc == NULL) { + return false; + } + + return !(desc->flags & AV_PIX_FMT_FLAG_RGB) && desc->nb_components >= 2; +} + +static int ffmpeg_output_video_frame(struct ffmpeg_context_s * ffmpeg_ctx) +{ + int ret = -1; + + int width = ffmpeg_ctx->video_dec_ctx->width; + int height = ffmpeg_ctx->video_dec_ctx->height; + AVFrame * frame = ffmpeg_ctx->frame; + + if(frame->width != width + || frame->height != height + || frame->format != ffmpeg_ctx->video_dec_ctx->pix_fmt) { + + /* To handle this change, one could call av_image_alloc again and + * decode the following frames into another rawvideo file. + */ + LV_LOG_ERROR("Width, height and pixel format have to be " + "constant in a rawvideo file, but the width, height or " + "pixel format of the input video changed:\n" + "old: width = %d, height = %d, format = %s\n" + "new: width = %d, height = %d, format = %s\n", + width, + height, + av_get_pix_fmt_name(ffmpeg_ctx->video_dec_ctx->pix_fmt), + frame->width, frame->height, + av_get_pix_fmt_name(frame->format)); + goto failed; + } + + LV_LOG_TRACE("video_frame coded_n:%d", frame->coded_picture_number); + + /* copy decoded frame to destination buffer: + * this is required since rawvideo expects non aligned data + */ + av_image_copy(ffmpeg_ctx->video_src_data, ffmpeg_ctx->video_src_linesize, + (const uint8_t **)(frame->data), frame->linesize, + ffmpeg_ctx->video_dec_ctx->pix_fmt, width, height); + + if(ffmpeg_ctx->sws_ctx == NULL) { + int swsFlags = SWS_BILINEAR; + + if(ffmpeg_pix_fmt_is_yuv(ffmpeg_ctx->video_dec_ctx->pix_fmt)) { + + /* When the video width and height are not multiples of 8, + * and there is no size change in the conversion, + * a blurry screen will appear on the right side + * This problem was discovered in 2012 and + * continues to exist in version 4.1.3 in 2019 + * This problem can be avoided by increasing SWS_ACCURATE_RND + */ + if((width & 0x7) || (height & 0x7)) { + LV_LOG_WARN("The width(%d) and height(%d) the image " + "is not a multiple of 8, " + "the decoding speed may be reduced", + width, height); + swsFlags |= SWS_ACCURATE_RND; + } + } + + ffmpeg_ctx->sws_ctx = sws_getContext( + width, height, ffmpeg_ctx->video_dec_ctx->pix_fmt, + width, height, ffmpeg_ctx->video_dst_pix_fmt, + swsFlags, + NULL, NULL, NULL); + } + + if(!ffmpeg_ctx->has_alpha) { + int lv_linesize = sizeof(lv_color_t) * width; + int dst_linesize = ffmpeg_ctx->video_dst_linesize[0]; + if(dst_linesize != lv_linesize) { + LV_LOG_WARN("ffmpeg linesize = %d, but lvgl image require %d", + dst_linesize, + lv_linesize); + ffmpeg_ctx->video_dst_linesize[0] = lv_linesize; + } + } + + ret = sws_scale( + ffmpeg_ctx->sws_ctx, + (const uint8_t * const *)(ffmpeg_ctx->video_src_data), + ffmpeg_ctx->video_src_linesize, + 0, + height, + ffmpeg_ctx->video_dst_data, + ffmpeg_ctx->video_dst_linesize); + +failed: + return ret; +} + +static int ffmpeg_decode_packet(AVCodecContext * dec, const AVPacket * pkt, + struct ffmpeg_context_s * ffmpeg_ctx) +{ + int ret = 0; + + /* submit the packet to the decoder */ + ret = avcodec_send_packet(dec, pkt); + if(ret < 0) { + LV_LOG_ERROR("Error submitting a packet for decoding (%s)", + av_err2str(ret)); + return ret; + } + + /* get all the available frames from the decoder */ + while(ret >= 0) { + ret = avcodec_receive_frame(dec, ffmpeg_ctx->frame); + if(ret < 0) { + + /* those two return values are special and mean there is + * no output frame available, + * but there were no errors during decoding + */ + if(ret == AVERROR_EOF || ret == AVERROR(EAGAIN)) { + return 0; + } + + LV_LOG_ERROR("Error during decoding (%s)", av_err2str(ret)); + return ret; + } + + /* write the frame data to output file */ + if(dec->codec->type == AVMEDIA_TYPE_VIDEO) { + ret = ffmpeg_output_video_frame(ffmpeg_ctx); + } + + av_frame_unref(ffmpeg_ctx->frame); + if(ret < 0) { + LV_LOG_WARN("ffmpeg_decode_packet ended %d", ret); + return ret; + } + } + + return 0; +} + +static int ffmpeg_open_codec_context(int * stream_idx, + AVCodecContext ** dec_ctx, AVFormatContext * fmt_ctx, + enum AVMediaType type) +{ + int ret; + int stream_index; + AVStream * st; + AVCodec * dec = NULL; + AVDictionary * opts = NULL; + + ret = av_find_best_stream(fmt_ctx, type, -1, -1, NULL, 0); + if(ret < 0) { + LV_LOG_ERROR("Could not find %s stream in input file", + av_get_media_type_string(type)); + return ret; + } + else { + stream_index = ret; + st = fmt_ctx->streams[stream_index]; + + /* find decoder for the stream */ + dec = avcodec_find_decoder(st->codecpar->codec_id); + if(dec == NULL) { + LV_LOG_ERROR("Failed to find %s codec", + av_get_media_type_string(type)); + return AVERROR(EINVAL); + } + + /* Allocate a codec context for the decoder */ + *dec_ctx = avcodec_alloc_context3(dec); + if(*dec_ctx == NULL) { + LV_LOG_ERROR("Failed to allocate the %s codec context", + av_get_media_type_string(type)); + return AVERROR(ENOMEM); + } + + /* Copy codec parameters from input stream to output codec context */ + if((ret = avcodec_parameters_to_context(*dec_ctx, st->codecpar)) < 0) { + LV_LOG_ERROR( + "Failed to copy %s codec parameters to decoder context", + av_get_media_type_string(type)); + return ret; + } + + /* Init the decoders */ + if((ret = avcodec_open2(*dec_ctx, dec, &opts)) < 0) { + LV_LOG_ERROR("Failed to open %s codec", + av_get_media_type_string(type)); + return ret; + } + + *stream_idx = stream_index; + } + + return 0; +} + +static int ffmpeg_get_img_header(const char * filepath, + lv_img_header_t * header) +{ + int ret = -1; + + AVFormatContext * fmt_ctx = NULL; + AVCodecContext * video_dec_ctx = NULL; + int video_stream_idx; + + /* open input file, and allocate format context */ + if(avformat_open_input(&fmt_ctx, filepath, NULL, NULL) < 0) { + LV_LOG_ERROR("Could not open source file %s", filepath); + goto failed; + } + + /* retrieve stream information */ + if(avformat_find_stream_info(fmt_ctx, NULL) < 0) { + LV_LOG_ERROR("Could not find stream information"); + goto failed; + } + + if(ffmpeg_open_codec_context(&video_stream_idx, &video_dec_ctx, + fmt_ctx, AVMEDIA_TYPE_VIDEO) + >= 0) { + bool has_alpha = ffmpeg_pix_fmt_has_alpha(video_dec_ctx->pix_fmt); + + /* allocate image where the decoded image will be put */ + header->w = video_dec_ctx->width; + header->h = video_dec_ctx->height; + header->always_zero = 0; + header->cf = (has_alpha ? LV_IMG_CF_TRUE_COLOR_ALPHA : LV_IMG_CF_TRUE_COLOR); + + ret = 0; + } + +failed: + avcodec_free_context(&video_dec_ctx); + avformat_close_input(&fmt_ctx); + + return ret; +} + +static int ffmpeg_get_frame_refr_period(struct ffmpeg_context_s * ffmpeg_ctx) +{ + int avg_frame_rate_num = ffmpeg_ctx->video_stream->avg_frame_rate.num; + if(avg_frame_rate_num > 0) { + int period = 1000 * (int64_t)ffmpeg_ctx->video_stream->avg_frame_rate.den + / avg_frame_rate_num; + return period; + } + + return -1; +} + +static int ffmpeg_update_next_frame(struct ffmpeg_context_s * ffmpeg_ctx) +{ + int ret = 0; + + while(1) { + + /* read frames from the file */ + if(av_read_frame(ffmpeg_ctx->fmt_ctx, &(ffmpeg_ctx->pkt)) >= 0) { + bool is_image = false; + + /* check if the packet belongs to a stream we are interested in, + * otherwise skip it + */ + if(ffmpeg_ctx->pkt.stream_index == ffmpeg_ctx->video_stream_idx) { + ret = ffmpeg_decode_packet(ffmpeg_ctx->video_dec_ctx, + &(ffmpeg_ctx->pkt), ffmpeg_ctx); + is_image = true; + } + + av_packet_unref(&(ffmpeg_ctx->pkt)); + + if(ret < 0) { + LV_LOG_WARN("video frame is empty %d", ret); + break; + } + + /* Used to filter data that is not an image */ + if(is_image) { + break; + } + } + else { + ret = -1; + break; + } + } + + return ret; +} + +struct ffmpeg_context_s * ffmpeg_open_file(const char * path) +{ + if(path == NULL || strlen(path) == 0) { + LV_LOG_ERROR("file path is empty"); + return NULL; + } + + struct ffmpeg_context_s * ffmpeg_ctx = calloc(1, sizeof(struct ffmpeg_context_s)); + + if(ffmpeg_ctx == NULL) { + LV_LOG_ERROR("ffmpeg_ctx malloc failed"); + goto failed; + } + + /* open input file, and allocate format context */ + + if(avformat_open_input(&(ffmpeg_ctx->fmt_ctx), path, NULL, NULL) < 0) { + LV_LOG_ERROR("Could not open source file %s", path); + goto failed; + } + + /* retrieve stream information */ + + if(avformat_find_stream_info(ffmpeg_ctx->fmt_ctx, NULL) < 0) { + LV_LOG_ERROR("Could not find stream information"); + goto failed; + } + + if(ffmpeg_open_codec_context( + &(ffmpeg_ctx->video_stream_idx), + &(ffmpeg_ctx->video_dec_ctx), + ffmpeg_ctx->fmt_ctx, AVMEDIA_TYPE_VIDEO) + >= 0) { + ffmpeg_ctx->video_stream = ffmpeg_ctx->fmt_ctx->streams[ffmpeg_ctx->video_stream_idx]; + + ffmpeg_ctx->has_alpha = ffmpeg_pix_fmt_has_alpha(ffmpeg_ctx->video_dec_ctx->pix_fmt); + + ffmpeg_ctx->video_dst_pix_fmt = (ffmpeg_ctx->has_alpha ? AV_PIX_FMT_BGRA : AV_PIX_FMT_TRUE_COLOR); + } + +#if LV_FFMPEG_AV_DUMP_FORMAT != 0 + /* dump input information to stderr */ + av_dump_format(ffmpeg_ctx->fmt_ctx, 0, path, 0); +#endif + + if(ffmpeg_ctx->video_stream == NULL) { + LV_LOG_ERROR("Could not find video stream in the input, aborting"); + goto failed; + } + + return ffmpeg_ctx; + +failed: + ffmpeg_close(ffmpeg_ctx); + return NULL; +} + +static int ffmpeg_image_allocate(struct ffmpeg_context_s * ffmpeg_ctx) +{ + int ret; + + /* allocate image where the decoded image will be put */ + ret = av_image_alloc( + ffmpeg_ctx->video_src_data, + ffmpeg_ctx->video_src_linesize, + ffmpeg_ctx->video_dec_ctx->width, + ffmpeg_ctx->video_dec_ctx->height, + ffmpeg_ctx->video_dec_ctx->pix_fmt, + 4); + + if(ret < 0) { + LV_LOG_ERROR("Could not allocate src raw video buffer"); + return ret; + } + + LV_LOG_INFO("alloc video_src_bufsize = %d", ret); + + ret = av_image_alloc( + ffmpeg_ctx->video_dst_data, + ffmpeg_ctx->video_dst_linesize, + ffmpeg_ctx->video_dec_ctx->width, + ffmpeg_ctx->video_dec_ctx->height, + ffmpeg_ctx->video_dst_pix_fmt, + 4); + + if(ret < 0) { + LV_LOG_ERROR("Could not allocate dst raw video buffer"); + return ret; + } + + LV_LOG_INFO("allocate video_dst_bufsize = %d", ret); + + ffmpeg_ctx->frame = av_frame_alloc(); + + if(ffmpeg_ctx->frame == NULL) { + LV_LOG_ERROR("Could not allocate frame"); + return -1; + } + + /* initialize packet, set data to NULL, let the demuxer fill it */ + av_init_packet(&ffmpeg_ctx->pkt); + ffmpeg_ctx->pkt.data = NULL; + ffmpeg_ctx->pkt.size = 0; + + return 0; +} + +static void ffmpeg_close_src_ctx(struct ffmpeg_context_s * ffmpeg_ctx) +{ + avcodec_free_context(&(ffmpeg_ctx->video_dec_ctx)); + avformat_close_input(&(ffmpeg_ctx->fmt_ctx)); + av_frame_free(&(ffmpeg_ctx->frame)); + if(ffmpeg_ctx->video_src_data[0] != NULL) { + av_free(ffmpeg_ctx->video_src_data[0]); + ffmpeg_ctx->video_src_data[0] = NULL; + } +} + +static void ffmpeg_close_dst_ctx(struct ffmpeg_context_s * ffmpeg_ctx) +{ + if(ffmpeg_ctx->video_dst_data[0] != NULL) { + av_free(ffmpeg_ctx->video_dst_data[0]); + ffmpeg_ctx->video_dst_data[0] = NULL; + } +} + +static void ffmpeg_close(struct ffmpeg_context_s * ffmpeg_ctx) +{ + if(ffmpeg_ctx == NULL) { + LV_LOG_WARN("ffmpeg_ctx is NULL"); + return; + } + + sws_freeContext(ffmpeg_ctx->sws_ctx); + ffmpeg_close_src_ctx(ffmpeg_ctx); + ffmpeg_close_dst_ctx(ffmpeg_ctx); + free(ffmpeg_ctx); + + LV_LOG_INFO("ffmpeg_ctx closed"); +} + +static void lv_ffmpeg_player_frame_update_cb(lv_timer_t * timer) +{ + lv_obj_t * obj = (lv_obj_t *)timer->user_data; + lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; + + if(!player->ffmpeg_ctx) { + return; + } + + int has_next = ffmpeg_update_next_frame(player->ffmpeg_ctx); + + if(has_next < 0) { + lv_ffmpeg_player_set_cmd(obj, player->auto_restart ? LV_FFMPEG_PLAYER_CMD_START : LV_FFMPEG_PLAYER_CMD_STOP); + return; + } + +#if LV_COLOR_DEPTH != 32 + if(player->ffmpeg_ctx->has_alpha) { + convert_color_depth((uint8_t *)(player->imgdsc.data), + player->imgdsc.header.w * player->imgdsc.header.h); + } +#endif + + lv_img_cache_invalidate_src(lv_img_get_src(obj)); + lv_obj_invalidate(obj); +} + +static void lv_ffmpeg_player_constructor(const lv_obj_class_t * class_p, + lv_obj_t * obj) +{ + LV_TRACE_OBJ_CREATE("begin"); + + lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; + + player->auto_restart = false; + player->ffmpeg_ctx = NULL; + player->timer = lv_timer_create(lv_ffmpeg_player_frame_update_cb, + FRAME_DEF_REFR_PERIOD, obj); + lv_timer_pause(player->timer); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_ffmpeg_player_destructor(const lv_obj_class_t * class_p, + lv_obj_t * obj) +{ + LV_TRACE_OBJ_CREATE("begin"); + + lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; + + if(player->timer) { + lv_timer_del(player->timer); + player->timer = NULL; + } + + lv_img_cache_invalidate_src(lv_img_get_src(obj)); + + ffmpeg_close(player->ffmpeg_ctx); + player->ffmpeg_ctx = NULL; + + LV_TRACE_OBJ_CREATE("finished"); +} + +#endif /*LV_USE_FFMPEG*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/ffmpeg/lv_ffmpeg.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/ffmpeg/lv_ffmpeg.h new file mode 100644 index 0000000..8c7fc26 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/ffmpeg/lv_ffmpeg.h @@ -0,0 +1,104 @@ +/** + * @file lv_ffmpeg.h + * + */ +#ifndef LV_FFMPEG_H +#define LV_FFMPEG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" +#if LV_USE_FFMPEG != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +struct ffmpeg_context_s; + +extern const lv_obj_class_t lv_ffmpeg_player_class; + +typedef struct { + lv_img_t img; + lv_timer_t * timer; + lv_img_dsc_t imgdsc; + bool auto_restart; + struct ffmpeg_context_s * ffmpeg_ctx; +} lv_ffmpeg_player_t; + +typedef enum { + LV_FFMPEG_PLAYER_CMD_START, + LV_FFMPEG_PLAYER_CMD_STOP, + LV_FFMPEG_PLAYER_CMD_PAUSE, + LV_FFMPEG_PLAYER_CMD_RESUME, + _LV_FFMPEG_PLAYER_CMD_LAST +} lv_ffmpeg_player_cmd_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Register FFMPEG image decoder + */ +void lv_ffmpeg_init(void); + +/** + * Get the number of frames contained in the file + * @param path image or video file name + * @return Number of frames, less than 0 means failed + */ +int lv_ffmpeg_get_frame_num(const char * path); + +/** + * Create ffmpeg_player object + * @param parent pointer to an object, it will be the parent of the new player + * @return pointer to the created ffmpeg_player + */ +lv_obj_t * lv_ffmpeg_player_create(lv_obj_t * parent); + +/** + * Set the path of the file to be played + * @param obj pointer to a ffmpeg_player object + * @param path video file path + * @return LV_RES_OK: no error; LV_RES_INV: can't get the info. + */ +lv_res_t lv_ffmpeg_player_set_src(lv_obj_t * obj, const char * path); + +/** + * Set command control video player + * @param obj pointer to a ffmpeg_player object + * @param cmd control commands + */ +void lv_ffmpeg_player_set_cmd(lv_obj_t * obj, lv_ffmpeg_player_cmd_t cmd); + +/** + * Set the video to automatically replay + * @param obj pointer to a ffmpeg_player object + * @param en true: enable the auto restart + */ +void lv_ffmpeg_player_set_auto_restart(lv_obj_t * obj, bool en); + +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_FFMPEG*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FFMPEG_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/freetype/arial.ttf b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/freetype/arial.ttf new file mode 100644 index 0000000..886789b Binary files /dev/null and b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/freetype/arial.ttf differ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/freetype/lv_freetype.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/freetype/lv_freetype.c new file mode 100644 index 0000000..4bf6602 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/freetype/lv_freetype.c @@ -0,0 +1,687 @@ +/** + * @file lv_freetype.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_freetype.h" +#if LV_USE_FREETYPE + +#include "ft2build.h" +#include FT_FREETYPE_H +#include FT_GLYPH_H +#include FT_CACHE_H +#include FT_SIZES_H +#include FT_IMAGE_H +#include FT_OUTLINE_H + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_ll_t face_ll; +} lv_faces_control_t; + +typedef struct name_refer_t { + const char * name; /* point to font name string */ + int32_t cnt; /* reference count */ +} name_refer_t; + +typedef struct { + const void * mem; + const char * name; + size_t mem_size; +#if LV_FREETYPE_CACHE_SIZE < 0 + FT_Size size; +#endif + lv_font_t * font; + uint16_t style; + uint16_t height; +} lv_font_fmt_ft_dsc_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +#if LV_FREETYPE_CACHE_SIZE >= 0 +static FT_Error font_face_requester(FTC_FaceID face_id, + FT_Library library_is, FT_Pointer req_data, FT_Face * aface); +static bool lv_ft_font_init_cache(lv_ft_info_t * info); +static void lv_ft_font_destroy_cache(lv_font_t * font); +#else +static FT_Face face_find_in_list(lv_ft_info_t * info); +static void face_add_to_list(FT_Face face); +static void face_remove_from_list(FT_Face face); +static void face_generic_finalizer(void * object); +static bool lv_ft_font_init_nocache(lv_ft_info_t * info); +static void lv_ft_font_destroy_nocache(lv_font_t * font); +#endif + +static const char * name_refer_save(const char * name); +static void name_refer_del(const char * name); +static const char * name_refer_find(const char * name); + +/********************** +* STATIC VARIABLES +**********************/ +static FT_Library library; +static lv_ll_t names_ll; + +#if LV_FREETYPE_CACHE_SIZE >= 0 + static FTC_Manager cache_manager; + static FTC_CMapCache cmap_cache; + static FT_Face current_face = NULL; + + #if LV_FREETYPE_SBIT_CACHE + static FTC_SBitCache sbit_cache; + static FTC_SBit sbit; + #else + static FTC_ImageCache image_cache; + static FT_Glyph image_glyph; + #endif + +#else + static lv_faces_control_t face_control; +#endif + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +bool lv_freetype_init(uint16_t max_faces, uint16_t max_sizes, uint32_t max_bytes) +{ + FT_Error error = FT_Init_FreeType(&library); + if(error) { + LV_LOG_ERROR("init freeType error(%d)", error); + return false; + } + + _lv_ll_init(&names_ll, sizeof(name_refer_t)); + +#if LV_FREETYPE_CACHE_SIZE >= 0 + error = FTC_Manager_New(library, max_faces, max_sizes, + max_bytes, font_face_requester, NULL, &cache_manager); + if(error) { + FT_Done_FreeType(library); + LV_LOG_ERROR("Failed to open cache manager"); + return false; + } + + error = FTC_CMapCache_New(cache_manager, &cmap_cache); + if(error) { + LV_LOG_ERROR("Failed to open Cmap Cache"); + goto Fail; + } + +#if LV_FREETYPE_SBIT_CACHE + error = FTC_SBitCache_New(cache_manager, &sbit_cache); + if(error) { + LV_LOG_ERROR("Failed to open sbit cache"); + goto Fail; + } +#else + error = FTC_ImageCache_New(cache_manager, &image_cache); + if(error) { + LV_LOG_ERROR("Failed to open image cache"); + goto Fail; + } +#endif + + return true; +Fail: + FTC_Manager_Done(cache_manager); + FT_Done_FreeType(library); + return false; +#else + LV_UNUSED(max_faces); + LV_UNUSED(max_sizes); + LV_UNUSED(max_bytes); + _lv_ll_init(&face_control.face_ll, sizeof(FT_Face *)); + return true; +#endif/* LV_FREETYPE_CACHE_SIZE */ +} + +void lv_freetype_destroy(void) +{ +#if LV_FREETYPE_CACHE_SIZE >= 0 + FTC_Manager_Done(cache_manager); +#endif + FT_Done_FreeType(library); +} + +bool lv_ft_font_init(lv_ft_info_t * info) +{ +#if LV_FREETYPE_CACHE_SIZE >= 0 + return lv_ft_font_init_cache(info); +#else + return lv_ft_font_init_nocache(info); +#endif +} + +void lv_ft_font_destroy(lv_font_t * font) +{ +#if LV_FREETYPE_CACHE_SIZE >= 0 + lv_ft_font_destroy_cache(font); +#else + lv_ft_font_destroy_nocache(font); +#endif +} + +/********************** + * STATIC FUNCTIONS + **********************/ +#if LV_FREETYPE_CACHE_SIZE >= 0 + +static FT_Error font_face_requester(FTC_FaceID face_id, + FT_Library library_is, FT_Pointer req_data, FT_Face * aface) +{ + LV_UNUSED(library_is); + LV_UNUSED(req_data); + + lv_font_fmt_ft_dsc_t * dsc = (lv_font_fmt_ft_dsc_t *)face_id; + FT_Error error; + if(dsc->mem) { + error = FT_New_Memory_Face(library, dsc->mem, dsc->mem_size, 0, aface); + } + else { + error = FT_New_Face(library, dsc->name, 0, aface); + } + if(error) { + LV_LOG_ERROR("FT_New_Face error:%d\n", error); + return error; + } + return FT_Err_Ok; +} + +static bool get_bold_glyph(const lv_font_t * font, FT_Face face, + FT_UInt glyph_index, lv_font_glyph_dsc_t * dsc_out) +{ + if(FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT)) { + return false; + } + + lv_font_fmt_ft_dsc_t * dsc = (lv_font_fmt_ft_dsc_t *)(font->dsc); + if(face->glyph->format == FT_GLYPH_FORMAT_OUTLINE) { + if(dsc->style & FT_FONT_STYLE_BOLD) { + int strength = 1 << 6; + FT_Outline_Embolden(&face->glyph->outline, strength); + } + } + + if(FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL)) { + return false; + } + + dsc_out->adv_w = (face->glyph->metrics.horiAdvance >> 6); + dsc_out->box_h = face->glyph->bitmap.rows; /*Height of the bitmap in [px]*/ + dsc_out->box_w = face->glyph->bitmap.width; /*Width of the bitmap in [px]*/ + dsc_out->ofs_x = face->glyph->bitmap_left; /*X offset of the bitmap in [pf]*/ + dsc_out->ofs_y = face->glyph->bitmap_top - + face->glyph->bitmap.rows; /*Y offset of the bitmap measured from the as line*/ + dsc_out->bpp = 8; /*Bit per pixel: 1/2/4/8*/ + + return true; +} + +static bool get_glyph_dsc_cb_cache(const lv_font_t * font, + lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, uint32_t unicode_letter_next) +{ + LV_UNUSED(unicode_letter_next); + if(unicode_letter < 0x20) { + dsc_out->adv_w = 0; + dsc_out->box_h = 0; + dsc_out->box_w = 0; + dsc_out->ofs_x = 0; + dsc_out->ofs_y = 0; + dsc_out->bpp = 0; + return true; + } + + lv_font_fmt_ft_dsc_t * dsc = (lv_font_fmt_ft_dsc_t *)(font->dsc); + + FTC_FaceID face_id = (FTC_FaceID)dsc; + FT_Size face_size; + struct FTC_ScalerRec_ scaler; + scaler.face_id = face_id; + scaler.width = dsc->height; + scaler.height = dsc->height; + scaler.pixel = 1; + if(FTC_Manager_LookupSize(cache_manager, &scaler, &face_size) != 0) { + return false; + } + + FT_Face face = face_size->face; + FT_UInt charmap_index = FT_Get_Charmap_Index(face->charmap); + FT_UInt glyph_index = FTC_CMapCache_Lookup(cmap_cache, face_id, charmap_index, unicode_letter); + dsc_out->is_placeholder = glyph_index == 0; + + if(dsc->style & FT_FONT_STYLE_ITALIC) { + FT_Matrix italic_matrix; + italic_matrix.xx = 1 << 16; + italic_matrix.xy = 0x5800; + italic_matrix.yx = 0; + italic_matrix.yy = 1 << 16; + FT_Set_Transform(face, &italic_matrix, NULL); + } + + if(dsc->style & FT_FONT_STYLE_BOLD) { + current_face = face; + if(!get_bold_glyph(font, face, glyph_index, dsc_out)) { + current_face = NULL; + return false; + } + goto end; + } + + FTC_ImageTypeRec desc_type; + desc_type.face_id = face_id; + desc_type.flags = FT_LOAD_RENDER | FT_LOAD_TARGET_NORMAL; + desc_type.height = dsc->height; + desc_type.width = dsc->height; + +#if LV_FREETYPE_SBIT_CACHE + FT_Error error = FTC_SBitCache_Lookup(sbit_cache, &desc_type, glyph_index, &sbit, NULL); + if(error) { + LV_LOG_ERROR("SBitCache_Lookup error"); + return false; + } + + dsc_out->adv_w = sbit->xadvance; + dsc_out->box_h = sbit->height; /*Height of the bitmap in [px]*/ + dsc_out->box_w = sbit->width; /*Width of the bitmap in [px]*/ + dsc_out->ofs_x = sbit->left; /*X offset of the bitmap in [pf]*/ + dsc_out->ofs_y = sbit->top - sbit->height; /*Y offset of the bitmap measured from the as line*/ + dsc_out->bpp = 8; /*Bit per pixel: 1/2/4/8*/ +#else + FT_Error error = FTC_ImageCache_Lookup(image_cache, &desc_type, glyph_index, &image_glyph, NULL); + if(error) { + LV_LOG_ERROR("ImageCache_Lookup error"); + return false; + } + if(image_glyph->format != FT_GLYPH_FORMAT_BITMAP) { + LV_LOG_ERROR("Glyph_To_Bitmap error"); + return false; + } + + FT_BitmapGlyph glyph_bitmap = (FT_BitmapGlyph)image_glyph; + dsc_out->adv_w = (glyph_bitmap->root.advance.x >> 16); + dsc_out->box_h = glyph_bitmap->bitmap.rows; /*Height of the bitmap in [px]*/ + dsc_out->box_w = glyph_bitmap->bitmap.width; /*Width of the bitmap in [px]*/ + dsc_out->ofs_x = glyph_bitmap->left; /*X offset of the bitmap in [pf]*/ + dsc_out->ofs_y = glyph_bitmap->top - + glyph_bitmap->bitmap.rows; /*Y offset of the bitmap measured from the as line*/ + dsc_out->bpp = 8; /*Bit per pixel: 1/2/4/8*/ +#endif + +end: + if((dsc->style & FT_FONT_STYLE_ITALIC) && (unicode_letter_next == '\0')) { + dsc_out->adv_w = dsc_out->box_w + dsc_out->ofs_x; + } + + return true; +} + +static const uint8_t * get_glyph_bitmap_cb_cache(const lv_font_t * font, uint32_t unicode_letter) +{ + LV_UNUSED(unicode_letter); + + lv_font_fmt_ft_dsc_t * dsc = (lv_font_fmt_ft_dsc_t *)(font->dsc); + if(dsc->style & FT_FONT_STYLE_BOLD) { + if(current_face && current_face->glyph->format == FT_GLYPH_FORMAT_BITMAP) { + return (const uint8_t *)(current_face->glyph->bitmap.buffer); + } + return NULL; + } + +#if LV_FREETYPE_SBIT_CACHE + return (const uint8_t *)sbit->buffer; +#else + FT_BitmapGlyph glyph_bitmap = (FT_BitmapGlyph)image_glyph; + return (const uint8_t *)glyph_bitmap->bitmap.buffer; +#endif +} + +static bool lv_ft_font_init_cache(lv_ft_info_t * info) +{ + size_t need_size = sizeof(lv_font_fmt_ft_dsc_t) + sizeof(lv_font_t); + lv_font_fmt_ft_dsc_t * dsc = lv_mem_alloc(need_size); + if(dsc == NULL) return false; + lv_memset_00(dsc, need_size); + + dsc->font = (lv_font_t *)(((char *)dsc) + sizeof(lv_font_fmt_ft_dsc_t)); + dsc->mem = info->mem; + dsc->mem_size = info->mem_size; + dsc->name = name_refer_save(info->name); + dsc->height = info->weight; + dsc->style = info->style; + + /* use to get font info */ + FT_Size face_size; + struct FTC_ScalerRec_ scaler; + scaler.face_id = (FTC_FaceID)dsc; + scaler.width = info->weight; + scaler.height = info->weight; + scaler.pixel = 1; + FT_Error error = FTC_Manager_LookupSize(cache_manager, &scaler, &face_size); + if(error) { + LV_LOG_ERROR("Failed to LookupSize"); + goto Fail; + } + + lv_font_t * font = dsc->font; + font->dsc = dsc; + font->get_glyph_dsc = get_glyph_dsc_cb_cache; + font->get_glyph_bitmap = get_glyph_bitmap_cb_cache; + font->subpx = LV_FONT_SUBPX_NONE; + font->line_height = (face_size->face->size->metrics.height >> 6); + font->base_line = -(face_size->face->size->metrics.descender >> 6); + + FT_Fixed scale = face_size->face->size->metrics.y_scale; + int8_t thickness = FT_MulFix(scale, face_size->face->underline_thickness) >> 6; + font->underline_position = FT_MulFix(scale, face_size->face->underline_position) >> 6; + font->underline_thickness = thickness < 1 ? 1 : thickness; + + /* return to user */ + info->font = font; + + return true; + +Fail: + lv_mem_free(dsc); + return false; +} + +void lv_ft_font_destroy_cache(lv_font_t * font) +{ + if(font == NULL) { + return; + } + + lv_font_fmt_ft_dsc_t * dsc = (lv_font_fmt_ft_dsc_t *)(font->dsc); + if(dsc) { + FTC_Manager_RemoveFaceID(cache_manager, (FTC_FaceID)dsc); + name_refer_del(dsc->name); + lv_mem_free(dsc); + } +} +#else/* LV_FREETYPE_CACHE_SIZE */ + +static FT_Face face_find_in_list(lv_ft_info_t * info) +{ + lv_font_fmt_ft_dsc_t * dsc; + FT_Face * pface = _lv_ll_get_head(&face_control.face_ll); + while(pface) { + dsc = (lv_font_fmt_ft_dsc_t *)(*pface)->generic.data; + if(strcmp(dsc->name, info->name) == 0) { + return *pface; + } + pface = _lv_ll_get_next(&face_control.face_ll, pface); + } + + return NULL; +} + +static void face_add_to_list(FT_Face face) +{ + FT_Face * pface; + pface = (FT_Face *)_lv_ll_ins_tail(&face_control.face_ll); + *pface = face; +} + +static void face_remove_from_list(FT_Face face) +{ + FT_Face * pface = _lv_ll_get_head(&face_control.face_ll); + while(pface) { + if(*pface == face) { + _lv_ll_remove(&face_control.face_ll, pface); + lv_mem_free(pface); + break; + } + pface = _lv_ll_get_next(&face_control.face_ll, pface); + } +} + +static void face_generic_finalizer(void * object) +{ + FT_Face face = (FT_Face)object; + face_remove_from_list(face); + LV_LOG_INFO("face finalizer(%p)\n", face); +} + +static bool get_glyph_dsc_cb_nocache(const lv_font_t * font, + lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, uint32_t unicode_letter_next) +{ + LV_UNUSED(unicode_letter_next); + if(unicode_letter < 0x20) { + dsc_out->adv_w = 0; + dsc_out->box_h = 0; + dsc_out->box_w = 0; + dsc_out->ofs_x = 0; + dsc_out->ofs_y = 0; + dsc_out->bpp = 0; + return true; + } + + FT_Error error; + lv_font_fmt_ft_dsc_t * dsc = (lv_font_fmt_ft_dsc_t *)(font->dsc); + FT_Face face = dsc->size->face; + + FT_UInt glyph_index = FT_Get_Char_Index(face, unicode_letter); + + if(face->size != dsc->size) { + FT_Activate_Size(dsc->size); + } + dsc_out->is_placeholder = glyph_index == 0; + + error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); + if(error) { + return false; + } + + if(face->glyph->format == FT_GLYPH_FORMAT_OUTLINE) { + if(dsc->style & FT_FONT_STYLE_BOLD) { + int strength = 1 << 6; + FT_Outline_Embolden(&face->glyph->outline, strength); + } + + if(dsc->style & FT_FONT_STYLE_ITALIC) { + FT_Matrix italic_matrix; + italic_matrix.xx = 1 << 16; + italic_matrix.xy = 0x5800; + italic_matrix.yx = 0; + italic_matrix.yy = 1 << 16; + FT_Outline_Transform(&face->glyph->outline, &italic_matrix); + } + } + + error = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL); + if(error) { + return false; + } + + dsc_out->adv_w = (face->glyph->metrics.horiAdvance >> 6); + dsc_out->box_h = face->glyph->bitmap.rows; /*Height of the bitmap in [px]*/ + dsc_out->box_w = face->glyph->bitmap.width; /*Width of the bitmap in [px]*/ + dsc_out->ofs_x = face->glyph->bitmap_left; /*X offset of the bitmap in [pf]*/ + dsc_out->ofs_y = face->glyph->bitmap_top - + face->glyph->bitmap.rows; /*Y offset of the bitmap measured from the as line*/ + dsc_out->bpp = 8; /*Bit per pixel: 1/2/4/8*/ + + if((dsc->style & FT_FONT_STYLE_ITALIC) && (unicode_letter_next == '\0')) { + dsc_out->adv_w = dsc_out->box_w + dsc_out->ofs_x; + } + + return true; +} + +static const uint8_t * get_glyph_bitmap_cb_nocache(const lv_font_t * font, uint32_t unicode_letter) +{ + LV_UNUSED(unicode_letter); + lv_font_fmt_ft_dsc_t * dsc = (lv_font_fmt_ft_dsc_t *)(font->dsc); + FT_Face face = dsc->size->face; + return (const uint8_t *)(face->glyph->bitmap.buffer); +} + +static bool lv_ft_font_init_nocache(lv_ft_info_t * info) +{ + size_t need_size = sizeof(lv_font_fmt_ft_dsc_t) + sizeof(lv_font_t); + lv_font_fmt_ft_dsc_t * dsc = lv_mem_alloc(need_size); + if(dsc == NULL) return false; + lv_memset_00(dsc, need_size); + + dsc->font = (lv_font_t *)(((char *)dsc) + sizeof(lv_font_fmt_ft_dsc_t)); + dsc->mem = info->mem; + dsc->mem_size = info->mem_size; + dsc->name = name_refer_save(info->name); + dsc->height = info->weight; + dsc->style = info->style; + + FT_Face face = face_find_in_list(info); + if(face == NULL) { + FT_Error error; + if(dsc->mem) { + error = FT_New_Memory_Face(library, dsc->mem, (FT_Long) dsc->mem_size, 0, &face); + } + else { + error = FT_New_Face(library, dsc->name, 0, &face); + } + if(error) { + LV_LOG_WARN("create face error(%d)", error); + goto Fail; + } + + /* link face and face info */ + face->generic.data = dsc; + face->generic.finalizer = face_generic_finalizer; + face_add_to_list(face); + } + else { + FT_Size size; + FT_Error error = FT_New_Size(face, &size); + if(error) { + goto Fail; + } + FT_Activate_Size(size); + FT_Reference_Face(face); + } + + FT_Set_Pixel_Sizes(face, 0, info->weight); + dsc->size = face->size; + + lv_font_t * font = dsc->font; + font->dsc = dsc; + font->get_glyph_dsc = get_glyph_dsc_cb_nocache; + font->get_glyph_bitmap = get_glyph_bitmap_cb_nocache; + font->line_height = (face->size->metrics.height >> 6); + font->base_line = -(face->size->metrics.descender >> 6); + font->subpx = LV_FONT_SUBPX_NONE; + + FT_Fixed scale = face->size->metrics.y_scale; + int8_t thickness = FT_MulFix(scale, face->underline_thickness) >> 6; + font->underline_position = FT_MulFix(scale, face->underline_position) >> 6; + font->underline_thickness = thickness < 1 ? 1 : thickness; + + info->font = font; + return true; + +Fail: + lv_mem_free(dsc); + return false; +} + +static void lv_ft_font_destroy_nocache(lv_font_t * font) +{ + if(font == NULL) { + return; + } + + lv_font_fmt_ft_dsc_t * dsc = (lv_font_fmt_ft_dsc_t *)(font->dsc); + if(dsc) { + FT_Face face = dsc->size->face; + FT_Done_Size(dsc->size); + FT_Done_Face(face); + name_refer_del(dsc->name); + lv_mem_free(dsc); + } +} + +#endif/* LV_FREETYPE_CACHE_SIZE */ + +/** + * find name string in names list.name string cnt += 1 if find. + * @param name name string + * @return the string pointer of name. + */ +static const char * name_refer_find(const char * name) +{ + name_refer_t * refer = _lv_ll_get_head(&names_ll); + while(refer) { + if(strcmp(refer->name, name) == 0) { + refer->cnt += 1; + return refer->name; + } + refer = _lv_ll_get_next(&names_ll, refer); + } + return NULL; +} + +/** + * del name string from list. + */ +static void name_refer_del(const char * name) +{ + name_refer_t * refer = _lv_ll_get_head(&names_ll); + while(refer) { + if(strcmp(refer->name, name) == 0) { + refer->cnt -= 1; + if(refer->cnt <= 0) { + _lv_ll_remove(&names_ll, refer); + lv_mem_free((void *)refer->name); + lv_mem_free(refer); + } + return; + } + refer = _lv_ll_get_next(&names_ll, refer); + } + + LV_LOG_WARN("name_in_names_del error(not find:%p).", name); +} + +/** + * save name string to list. + * @param name name string + * @return Saved string pointer + */ +static const char * name_refer_save(const char * name) +{ + const char * pos = name_refer_find(name); + if(pos) { + return pos; + } + + name_refer_t * refer = _lv_ll_ins_tail(&names_ll); + if(refer) { + uint32_t len = strlen(name) + 1; + refer->name = lv_mem_alloc(len); + if(refer->name) { + lv_memcpy((void *)refer->name, name, len); + refer->cnt = 1; + return refer->name; + } + _lv_ll_remove(&names_ll, refer); + lv_mem_free(refer); + } + LV_LOG_WARN("save_name_to_names error(not memory)."); + return ""; +} + +#endif /*LV_USE_FREETYPE*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/freetype/lv_freetype.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/freetype/lv_freetype.h new file mode 100644 index 0000000..247a7fb --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/freetype/lv_freetype.h @@ -0,0 +1,83 @@ +/** + * @file lv_freetype.h + * + */ +#ifndef LV_FREETYPE_H +#define LV_FREETYPE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" +#if LV_USE_FREETYPE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef enum { + FT_FONT_STYLE_NORMAL = 0, + FT_FONT_STYLE_ITALIC = 1 << 0, + FT_FONT_STYLE_BOLD = 1 << 1 +} LV_FT_FONT_STYLE; + +typedef struct { + const char * name; /* The name of the font file */ + const void * mem; /* The pointer of the font file */ + size_t mem_size; /* The size of the memory */ + lv_font_t * font; /* point to lvgl font */ + uint16_t weight; /* font size */ + uint16_t style; /* font style */ +} lv_ft_info_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * init freetype library + * @param max_faces Maximum number of opened FT_Face objects managed by this cache instance. Use 0 for defaults. + * @param max_sizes Maximum number of opened FT_Size objects managed by this cache instance. Use 0 for defaults. + * @param max_bytes Maximum number of bytes to use for cached data nodes. Use 0 for defaults. + * Note that this value does not account for managed FT_Face and FT_Size objects. + * @return true on success, otherwise false. + */ +bool lv_freetype_init(uint16_t max_faces, uint16_t max_sizes, uint32_t max_bytes); + +/** + * Destroy freetype library + */ +void lv_freetype_destroy(void); + +/** + * Creates a font with info parameter specified. + * @param info See lv_ft_info_t for details. + * when success, lv_ft_info_t->font point to the font you created. + * @return true on success, otherwise false. + */ +bool lv_ft_font_init(lv_ft_info_t * info); + +/** + * Destroy a font that has been created. + * @param font pointer to font. + */ +void lv_ft_font_destroy(lv_font_t * font); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_FREETYPE*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_FREETYPE_H */ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/fsdrv/lv_fs_fatfs.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/fsdrv/lv_fs_fatfs.c new file mode 100644 index 0000000..cc1d2e6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/fsdrv/lv_fs_fatfs.c @@ -0,0 +1,290 @@ +/** + * @file lv_fs_fatfs.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_FS_FATFS +#include "ff.h" + +/********************* + * DEFINES + *********************/ + +#if LV_FS_FATFS_LETTER == '\0' + #error "LV_FS_FATFS_LETTER must be an upper case ASCII letter" +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void fs_init(void); + +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn); +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_fs_fatfs_init(void) +{ + /*---------------------------------------------------- + * Initialize your storage device and File System + * -------------------------------------------------*/ + fs_init(); + + /*--------------------------------------------------- + * Register the file system interface in LVGL + *--------------------------------------------------*/ + + /*Add a simple drive to open images*/ + static lv_fs_drv_t fs_drv; /*A driver descriptor*/ + lv_fs_drv_init(&fs_drv); + + /*Set up fields...*/ + fs_drv.letter = LV_FS_FATFS_LETTER; + fs_drv.cache_size = LV_FS_FATFS_CACHE_SIZE; + + fs_drv.open_cb = fs_open; + fs_drv.close_cb = fs_close; + fs_drv.read_cb = fs_read; + fs_drv.write_cb = fs_write; + fs_drv.seek_cb = fs_seek; + fs_drv.tell_cb = fs_tell; + + fs_drv.dir_close_cb = fs_dir_close; + fs_drv.dir_open_cb = fs_dir_open; + fs_drv.dir_read_cb = fs_dir_read; + + lv_fs_drv_register(&fs_drv); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/*Initialize your Storage device and File system.*/ +static void fs_init(void) +{ + /*Initialize the SD card and FatFS itself. + *Better to do it in your code to keep this library untouched for easy updating*/ +} + +/** + * Open a file + * @param drv pointer to a driver where this function belongs + * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) + * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR + * @return pointer to FIL struct or NULL in case of fail + */ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + LV_UNUSED(drv); + uint8_t flags = 0; + + if(mode == LV_FS_MODE_WR) flags = FA_WRITE | FA_OPEN_ALWAYS; + else if(mode == LV_FS_MODE_RD) flags = FA_READ; + else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) flags = FA_READ | FA_WRITE | FA_OPEN_ALWAYS; + + FIL * f = lv_mem_alloc(sizeof(FIL)); + if(f == NULL) return NULL; + + FRESULT res = f_open(f, path, flags); + if(res == FR_OK) { + return f; + } + else { + lv_mem_free(f); + return NULL; + } +} + +/** + * Close an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FIL variable. (opened with fs_open) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + LV_UNUSED(drv); + f_close(file_p); + lv_mem_free(file_p); + return LV_FS_RES_OK; +} + +/** + * Read data from an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FIL variable. + * @param buf pointer to a memory block where to store the read data + * @param btr number of Bytes To Read + * @param br the real number of read bytes (Byte Read) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + LV_UNUSED(drv); + FRESULT res = f_read(file_p, buf, btr, (UINT *)br); + if(res == FR_OK) return LV_FS_RES_OK; + else return LV_FS_RES_UNKNOWN; +} + +/** + * Write into a file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FIL variable + * @param buf pointer to a buffer with the bytes to write + * @param btw Bytes To Write + * @param bw the number of real written bytes (Bytes Written). NULL if unused. + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ + LV_UNUSED(drv); + FRESULT res = f_write(file_p, buf, btw, (UINT *)bw); + if(res == FR_OK) return LV_FS_RES_OK; + else return LV_FS_RES_UNKNOWN; +} + +/** + * Set the read write pointer. Also expand the file size if necessary. + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FIL variable. (opened with fs_open ) + * @param pos the new position of read write pointer + * @param whence only LV_SEEK_SET is supported + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + LV_UNUSED(drv); + switch(whence) { + case LV_FS_SEEK_SET: + f_lseek(file_p, pos); + break; + case LV_FS_SEEK_CUR: + f_lseek(file_p, f_tell((FIL *)file_p) + pos); + break; + case LV_FS_SEEK_END: + f_lseek(file_p, f_size((FIL *)file_p) + pos); + break; + default: + break; + } + return LV_FS_RES_OK; +} + +/** + * Give the position of the read write pointer + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FIL variable. + * @param pos_p pointer to to store the result + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + LV_UNUSED(drv); + *pos_p = f_tell((FIL *)file_p); + return LV_FS_RES_OK; +} + +/** + * Initialize a 'DIR' variable for directory reading + * @param drv pointer to a driver where this function belongs + * @param path path to a directory + * @return pointer to an initialized 'DIR' variable + */ +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) +{ + LV_UNUSED(drv); + DIR * d = lv_mem_alloc(sizeof(DIR)); + if(d == NULL) return NULL; + + FRESULT res = f_opendir(d, path); + if(res != FR_OK) { + lv_mem_free(d); + d = NULL; + } + return d; +} + +/** + * Read the next filename from a directory. + * The name of the directories will begin with '/' + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' variable + * @param fn pointer to a buffer to store the filename + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn) +{ + LV_UNUSED(drv); + FRESULT res; + FILINFO fno; + fn[0] = '\0'; + + do { + res = f_readdir(dir_p, &fno); + if(res != FR_OK) return LV_FS_RES_UNKNOWN; + + if(fno.fattrib & AM_DIR) { + fn[0] = '/'; + strcpy(&fn[1], fno.fname); + } + else strcpy(fn, fno.fname); + + } while(strcmp(fn, "/.") == 0 || strcmp(fn, "/..") == 0); + + return LV_FS_RES_OK; +} + +/** + * Close the directory reading + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' variable + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p) +{ + LV_UNUSED(drv); + f_closedir(dir_p); + lv_mem_free(dir_p); + return LV_FS_RES_OK; +} + +#else /*LV_USE_FS_FATFS == 0*/ + +#if defined(LV_FS_FATFS_LETTER) && LV_FS_FATFS_LETTER != '\0' + #warning "LV_USE_FS_FATFS is not enabled but LV_FS_FATFS_LETTER is set" +#endif + +#endif /*LV_USE_FS_POSIX*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/fsdrv/lv_fs_posix.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/fsdrv/lv_fs_posix.c new file mode 100644 index 0000000..f988dae --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/fsdrv/lv_fs_posix.c @@ -0,0 +1,319 @@ +/** + * @file lv_fs_posix.c + * + */ + + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_FS_POSIX + +#include +#include +#ifndef WIN32 + #include + #include +#else + #include +#endif + +/********************* + * DEFINES + *********************/ + +#if LV_FS_POSIX_LETTER == '\0' + #error "LV_FS_POSIX_LETTER must be an upper case ASCII letter" +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn); +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Register a driver for the File system interface + */ +void lv_fs_posix_init(void) +{ + /*--------------------------------------------------- + * Register the file system interface in LVGL + *--------------------------------------------------*/ + + /*Add a simple drive to open images*/ + static lv_fs_drv_t fs_drv; /*A driver descriptor*/ + lv_fs_drv_init(&fs_drv); + + /*Set up fields...*/ + fs_drv.letter = LV_FS_POSIX_LETTER; + fs_drv.cache_size = LV_FS_POSIX_CACHE_SIZE; + + fs_drv.open_cb = fs_open; + fs_drv.close_cb = fs_close; + fs_drv.read_cb = fs_read; + fs_drv.write_cb = fs_write; + fs_drv.seek_cb = fs_seek; + fs_drv.tell_cb = fs_tell; + + fs_drv.dir_close_cb = fs_dir_close; + fs_drv.dir_open_cb = fs_dir_open; + fs_drv.dir_read_cb = fs_dir_read; + + lv_fs_drv_register(&fs_drv); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Open a file + * @param drv pointer to a driver where this function belongs + * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) + * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR + * @return a file handle or -1 in case of fail + */ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + LV_UNUSED(drv); + + uint32_t flags = 0; + if(mode == LV_FS_MODE_WR) flags = O_WRONLY; + else if(mode == LV_FS_MODE_RD) flags = O_RDONLY; + else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) flags = O_RDWR; + + /*Make the path relative to the current directory (the projects root folder)*/ + char buf[256]; + lv_snprintf(buf, sizeof(buf), LV_FS_POSIX_PATH "%s", path); + + int f = open(buf, flags); + if(f < 0) return NULL; + + return (void *)(lv_uintptr_t)f; +} + +/** + * Close an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p a file handle. (opened with fs_open) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + LV_UNUSED(drv); + close((lv_uintptr_t)file_p); + return LV_FS_RES_OK; +} + +/** + * Read data from an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p a file handle variable. + * @param buf pointer to a memory block where to store the read data + * @param btr number of Bytes To Read + * @param br the real number of read bytes (Byte Read) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + LV_UNUSED(drv); + *br = read((lv_uintptr_t)file_p, buf, btr); + return (int32_t)(*br) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +/** + * Write into a file + * @param drv pointer to a driver where this function belongs + * @param file_p a file handle variable + * @param buf pointer to a buffer with the bytes to write + * @param btw Bytes To Write + * @param bw the number of real written bytes (Bytes Written). NULL if unused. + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ + LV_UNUSED(drv); + *bw = write((lv_uintptr_t)file_p, buf, btw); + return (int32_t)(*bw) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +/** + * Set the read write pointer. Also expand the file size if necessary. + * @param drv pointer to a driver where this function belongs + * @param file_p a file handle variable. (opened with fs_open ) + * @param pos the new position of read write pointer + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + LV_UNUSED(drv); + off_t offset = lseek((lv_uintptr_t)file_p, pos, whence); + return offset < 0 ? LV_FS_RES_FS_ERR : LV_FS_RES_OK; +} + +/** + * Give the position of the read write pointer + * @param drv pointer to a driver where this function belongs + * @param file_p a file handle variable. + * @param pos_p pointer to to store the result + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + LV_UNUSED(drv); + off_t offset = lseek((lv_uintptr_t)file_p, 0, SEEK_CUR); + *pos_p = offset; + return offset < 0 ? LV_FS_RES_FS_ERR : LV_FS_RES_OK; +} + +#ifdef WIN32 + static char next_fn[256]; +#endif + +/** + * Initialize a 'fs_read_dir_t' variable for directory reading + * @param drv pointer to a driver where this function belongs + * @param path path to a directory + * @return pointer to an initialized 'DIR' or 'HANDLE' variable + */ +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) +{ + LV_UNUSED(drv); + +#ifndef WIN32 + /*Make the path relative to the current directory (the projects root folder)*/ + char buf[256]; + lv_snprintf(buf, sizeof(buf), LV_FS_POSIX_PATH "%s", path); + return opendir(buf); +#else + HANDLE d = INVALID_HANDLE_VALUE; + WIN32_FIND_DATA fdata; + + /*Make the path relative to the current directory (the projects root folder)*/ + char buf[256]; + lv_snprintf(buf, sizeof(buf), LV_FS_POSIX_PATH "%s\\*", path); + + strcpy(next_fn, ""); + d = FindFirstFile(buf, &fdata); + do { + if(strcmp(fdata.cFileName, ".") == 0 || strcmp(fdata.cFileName, "..") == 0) { + continue; + } + else { + if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + sprintf(next_fn, "/%s", fdata.cFileName); + } + else { + sprintf(next_fn, "%s", fdata.cFileName); + } + break; + } + } while(FindNextFileA(d, &fdata)); + + return d; +#endif +} + +/** + * Read the next filename from a directory. + * The name of the directories will begin with '/' + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable + * @param fn pointer to a buffer to store the filename + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn) +{ + LV_UNUSED(drv); + +#ifndef WIN32 + struct dirent * entry; + do { + entry = readdir(dir_p); + if(entry) { + if(entry->d_type == DT_DIR) sprintf(fn, "/%s", entry->d_name); + else strcpy(fn, entry->d_name); + } + else { + strcpy(fn, ""); + } + } while(strcmp(fn, "/.") == 0 || strcmp(fn, "/..") == 0); +#else + strcpy(fn, next_fn); + + strcpy(next_fn, ""); + WIN32_FIND_DATA fdata; + + if(FindNextFile(dir_p, &fdata) == false) return LV_FS_RES_OK; + do { + if(strcmp(fdata.cFileName, ".") == 0 || strcmp(fdata.cFileName, "..") == 0) { + continue; + } + else { + if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + sprintf(next_fn, "/%s", fdata.cFileName); + } + else { + sprintf(next_fn, "%s", fdata.cFileName); + } + break; + } + } while(FindNextFile(dir_p, &fdata)); + +#endif + return LV_FS_RES_OK; +} + +/** + * Close the directory reading + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p) +{ + LV_UNUSED(drv); +#ifndef WIN32 + closedir(dir_p); +#else + FindClose(dir_p); +#endif + return LV_FS_RES_OK; +} +#else /*LV_USE_FS_POSIX == 0*/ + +#if defined(LV_FS_POSIX_LETTER) && LV_FS_POSIX_LETTER != '\0' + #warning "LV_USE_FS_POSIX is not enabled but LV_FS_POSIX_LETTER is set" +#endif + +#endif /*LV_USE_FS_POSIX*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/fsdrv/lv_fs_stdio.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/fsdrv/lv_fs_stdio.c new file mode 100644 index 0000000..c2de688 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/fsdrv/lv_fs_stdio.c @@ -0,0 +1,329 @@ +/** + * @file lv_fs_stdio.c + * + */ + + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" +#if LV_USE_FS_STDIO != '\0' + +#include +#ifndef WIN32 + #include + #include +#else + #include +#endif + +/********************* + * DEFINES + *********************/ +#define MAX_PATH_LEN 256 + +/********************** + * TYPEDEFS + **********************/ +typedef struct { +#ifdef WIN32 + HANDLE dir_p; + char next_fn[MAX_PATH_LEN]; +#else + DIR * dir_p; +#endif +} dir_handle_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn); +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Register a driver for the File system interface + */ +void lv_fs_stdio_init(void) +{ + /*--------------------------------------------------- + * Register the file system interface in LVGL + *--------------------------------------------------*/ + + /*Add a simple drive to open images*/ + static lv_fs_drv_t fs_drv; /*A driver descriptor*/ + lv_fs_drv_init(&fs_drv); + + /*Set up fields...*/ + fs_drv.letter = LV_FS_STDIO_LETTER; + fs_drv.cache_size = LV_FS_STDIO_CACHE_SIZE; + + fs_drv.open_cb = fs_open; + fs_drv.close_cb = fs_close; + fs_drv.read_cb = fs_read; + fs_drv.write_cb = fs_write; + fs_drv.seek_cb = fs_seek; + fs_drv.tell_cb = fs_tell; + + fs_drv.dir_close_cb = fs_dir_close; + fs_drv.dir_open_cb = fs_dir_open; + fs_drv.dir_read_cb = fs_dir_read; + + lv_fs_drv_register(&fs_drv); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Open a file + * @param drv pointer to a driver where this function belongs + * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) + * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR + * @return pointer to FIL struct or NULL in case of fail + */ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + LV_UNUSED(drv); + + const char * flags = ""; + + if(mode == LV_FS_MODE_WR) flags = "wb"; + else if(mode == LV_FS_MODE_RD) flags = "rb"; + else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) flags = "rb+"; + + /*Make the path relative to the current directory (the projects root folder)*/ + + char buf[MAX_PATH_LEN]; + lv_snprintf(buf, sizeof(buf), LV_FS_STDIO_PATH "%s", path); + + return fopen(buf, flags); +} + +/** + * Close an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. (opened with fs_open) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + LV_UNUSED(drv); + fclose(file_p); + return LV_FS_RES_OK; +} + +/** + * Read data from an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. + * @param buf pointer to a memory block where to store the read data + * @param btr number of Bytes To Read + * @param br the real number of read bytes (Byte Read) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + LV_UNUSED(drv); + *br = fread(buf, 1, btr, file_p); + return (int32_t)(*br) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +/** + * Write into a file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable + * @param buf pointer to a buffer with the bytes to write + * @param btw Bytes To Write + * @param bw the number of real written bytes (Bytes Written). NULL if unused. + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ + LV_UNUSED(drv); + *bw = fwrite(buf, 1, btw, file_p); + return (int32_t)(*bw) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +/** + * Set the read write pointer. Also expand the file size if necessary. + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. (opened with fs_open ) + * @param pos the new position of read write pointer + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + LV_UNUSED(drv); + fseek(file_p, pos, whence); + return LV_FS_RES_OK; +} + +/** + * Give the position of the read write pointer + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. + * @param pos_p pointer to to store the result + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + LV_UNUSED(drv); + *pos_p = ftell(file_p); + return LV_FS_RES_OK; +} + +/** + * Initialize a 'DIR' or 'HANDLE' variable for directory reading + * @param drv pointer to a driver where this function belongs + * @param path path to a directory + * @return pointer to an initialized 'DIR' or 'HANDLE' variable + */ +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) +{ + LV_UNUSED(drv); + dir_handle_t * handle = (dir_handle_t *)lv_mem_alloc(sizeof(dir_handle_t)); +#ifndef WIN32 + /*Make the path relative to the current directory (the projects root folder)*/ + char buf[MAX_PATH_LEN]; + lv_snprintf(buf, sizeof(buf), LV_FS_STDIO_PATH "%s", path); + handle->dir_p = opendir(buf); + if(handle->dir_p == NULL) { + lv_mem_free(handle); + return NULL; + } + return handle; +#else + handle->dir_p = INVALID_HANDLE_VALUE; + WIN32_FIND_DATAA fdata; + + /*Make the path relative to the current directory (the projects root folder)*/ + char buf[MAX_PATH_LEN]; + lv_snprintf(buf, sizeof(buf), LV_FS_STDIO_PATH "%s\\*", path); + + strcpy(handle->next_fn, ""); + handle->dir_p = FindFirstFileA(buf, &fdata); + do { + if(strcmp(fdata.cFileName, ".") == 0 || strcmp(fdata.cFileName, "..") == 0) { + continue; + } + else { + if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "/%s", fdata.cFileName); + } + else { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "%s", fdata.cFileName); + } + break; + } + } while(FindNextFileA(handle->dir_p, &fdata)); + + if(handle->dir_p == INVALID_HANDLE_VALUE) { + lv_mem_free(handle); + return INVALID_HANDLE_VALUE; + } + return handle; +#endif +} + +/** + * Read the next filename form a directory. + * The name of the directories will begin with '/' + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable + * @param fn pointer to a buffer to store the filename + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn) +{ + LV_UNUSED(drv); + dir_handle_t * handle = (dir_handle_t *)dir_p; +#ifndef WIN32 + struct dirent * entry; + do { + entry = readdir(handle->dir_p); + if(entry) { + if(entry->d_type == DT_DIR) lv_snprintf(fn, MAX_PATH_LEN, "/%s", entry->d_name); + else strcpy(fn, entry->d_name); + } + else { + strcpy(fn, ""); + } + } while(strcmp(fn, "/.") == 0 || strcmp(fn, "/..") == 0); +#else + strcpy(fn, handle->next_fn); + + strcpy(handle->next_fn, ""); + WIN32_FIND_DATAA fdata; + + if(FindNextFileA(handle->dir_p, &fdata) == false) return LV_FS_RES_OK; + do { + if(strcmp(fdata.cFileName, ".") == 0 || strcmp(fdata.cFileName, "..") == 0) { + continue; + } + else { + if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "/%s", fdata.cFileName); + } + else { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "%s", fdata.cFileName); + } + break; + } + } while(FindNextFileA(handle->dir_p, &fdata)); + +#endif + return LV_FS_RES_OK; +} + +/** + * Close the directory reading + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p) +{ + LV_UNUSED(drv); + dir_handle_t * handle = (dir_handle_t *)dir_p; +#ifndef WIN32 + closedir(handle->dir_p); +#else + FindClose(handle->dir_p); +#endif + lv_mem_free(handle); + return LV_FS_RES_OK; +} + +#else /*LV_USE_FS_STDIO == 0*/ + +#if defined(LV_FS_STDIO_LETTER) && LV_FS_STDIO_LETTER != '\0' + #warning "LV_USE_FS_STDIO is not enabled but LV_FS_STDIO_LETTER is set" +#endif + +#endif /*LV_USE_FS_POSIX*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/fsdrv/lv_fs_win32.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/fsdrv/lv_fs_win32.c new file mode 100644 index 0000000..1a59aa4 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/fsdrv/lv_fs_win32.c @@ -0,0 +1,466 @@ +/** + * @file lv_fs_win32.c + * + */ + + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" +#if LV_USE_FS_WIN32 != '\0' + +#include +#include + +/********************* + * DEFINES + *********************/ +#define MAX_PATH_LEN 256 + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + HANDLE dir_p; + char next_fn[MAX_PATH_LEN]; + lv_fs_res_t next_error; +} dir_handle_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static bool is_dots_name(const char * name); +static lv_fs_res_t fs_error_from_win32(DWORD error); +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn); +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Register a driver for the File system interface + */ +void lv_fs_win32_init(void) +{ + /*--------------------------------------------------- + * Register the file system interface in LVGL + *--------------------------------------------------*/ + + /*Add a simple driver to open images*/ + static lv_fs_drv_t fs_drv; /*A driver descriptor*/ + lv_fs_drv_init(&fs_drv); + + /*Set up fields...*/ + fs_drv.letter = LV_FS_WIN32_LETTER; + fs_drv.cache_size = LV_FS_WIN32_CACHE_SIZE; + + fs_drv.open_cb = fs_open; + fs_drv.close_cb = fs_close; + fs_drv.read_cb = fs_read; + fs_drv.write_cb = fs_write; + fs_drv.seek_cb = fs_seek; + fs_drv.tell_cb = fs_tell; + + fs_drv.dir_close_cb = fs_dir_close; + fs_drv.dir_open_cb = fs_dir_open; + fs_drv.dir_read_cb = fs_dir_read; + + lv_fs_drv_register(&fs_drv); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Check the dots name + * @param name file or dir name + * @return true if the name is dots name + */ +static bool is_dots_name(const char * name) +{ + return name[0] == '.' && (!name[1] || (name[1] == '.' && !name[2])); +} + +/** + * Convert Win32 error code to error from lv_fs_res_t enum + * @param error Win32 error code + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_error_from_win32(DWORD error) +{ + lv_fs_res_t res; + + switch(error) { + case ERROR_SUCCESS: + res = LV_FS_RES_OK; + break; + case ERROR_BAD_UNIT: + case ERROR_NOT_READY: + case ERROR_CRC: + case ERROR_SEEK: + case ERROR_NOT_DOS_DISK: + case ERROR_WRITE_FAULT: + case ERROR_READ_FAULT: + case ERROR_GEN_FAILURE: + case ERROR_WRONG_DISK: + res = LV_FS_RES_HW_ERR; + break; + case ERROR_INVALID_HANDLE: + case ERROR_INVALID_TARGET_HANDLE: + res = LV_FS_RES_FS_ERR; + break; + case ERROR_FILE_NOT_FOUND: + case ERROR_PATH_NOT_FOUND: + case ERROR_INVALID_DRIVE: + case ERROR_NO_MORE_FILES: + case ERROR_SECTOR_NOT_FOUND: + case ERROR_BAD_NETPATH: + case ERROR_BAD_NET_NAME: + case ERROR_BAD_PATHNAME: + case ERROR_FILENAME_EXCED_RANGE: + res = LV_FS_RES_NOT_EX; + break; + case ERROR_DISK_FULL: + res = LV_FS_RES_FULL; + break; + case ERROR_SHARING_VIOLATION: + case ERROR_LOCK_VIOLATION: + case ERROR_DRIVE_LOCKED: + res = LV_FS_RES_LOCKED; + break; + case ERROR_ACCESS_DENIED: + case ERROR_CURRENT_DIRECTORY: + case ERROR_WRITE_PROTECT: + case ERROR_NETWORK_ACCESS_DENIED: + case ERROR_CANNOT_MAKE: + case ERROR_FAIL_I24: + case ERROR_SEEK_ON_DEVICE: + case ERROR_NOT_LOCKED: + case ERROR_LOCK_FAILED: + res = LV_FS_RES_DENIED; + break; + case ERROR_BUSY: + res = LV_FS_RES_BUSY; + break; + case ERROR_TIMEOUT: + res = LV_FS_RES_TOUT; + break; + case ERROR_NOT_SAME_DEVICE: + case ERROR_DIRECT_ACCESS_HANDLE: + res = LV_FS_RES_NOT_IMP; + break; + case ERROR_TOO_MANY_OPEN_FILES: + case ERROR_ARENA_TRASHED: + case ERROR_NOT_ENOUGH_MEMORY: + case ERROR_INVALID_BLOCK: + case ERROR_OUT_OF_PAPER: + case ERROR_SHARING_BUFFER_EXCEEDED: + case ERROR_NOT_ENOUGH_QUOTA: + res = LV_FS_RES_OUT_OF_MEM; + break; + case ERROR_INVALID_FUNCTION: + case ERROR_INVALID_ACCESS: + case ERROR_INVALID_DATA: + case ERROR_BAD_COMMAND: + case ERROR_BAD_LENGTH: + case ERROR_INVALID_PARAMETER: + case ERROR_NEGATIVE_SEEK: + res = LV_FS_RES_INV_PARAM; + break; + default: + res = LV_FS_RES_UNKNOWN; + break; + } + + return res; +} + +/** + * Open a file + * @param drv pointer to a driver where this function belongs + * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) + * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR + * @return pointer to FIL struct or NULL in case of fail + */ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + LV_UNUSED(drv); + + DWORD desired_access = 0; + + if(mode & LV_FS_MODE_RD) { + desired_access |= GENERIC_READ; + } + + if(mode & LV_FS_MODE_WR) { + desired_access |= GENERIC_WRITE; + } + + /*Make the path relative to the current directory (the projects root folder)*/ + + char buf[MAX_PATH]; + lv_snprintf(buf, sizeof(buf), LV_FS_WIN32_PATH "%s", path); + + return (void *)CreateFileA( + buf, + desired_access, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); +} + +/** + * Close an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. (opened with fs_open) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + LV_UNUSED(drv); + return CloseHandle((HANDLE)file_p) + ? LV_FS_RES_OK + : fs_error_from_win32(GetLastError()); +} + +/** + * Read data from an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. + * @param buf pointer to a memory block where to store the read data + * @param btr number of Bytes To Read + * @param br the real number of read bytes (Byte Read) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + LV_UNUSED(drv); + return ReadFile((HANDLE)file_p, buf, btr, (LPDWORD)br, NULL) + ? LV_FS_RES_OK + : fs_error_from_win32(GetLastError()); +} + +/** + * Write into a file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable + * @param buf pointer to a buffer with the bytes to write + * @param btw Bytes To Write + * @param bw the number of real written bytes (Bytes Written). NULL if unused. + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ + LV_UNUSED(drv); + return WriteFile((HANDLE)file_p, buf, btw, (LPDWORD)bw, NULL) + ? LV_FS_RES_OK + : fs_error_from_win32(GetLastError()); +} + +/** + * Set the read write pointer. Also expand the file size if necessary. + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. (opened with fs_open ) + * @param pos the new position of read write pointer + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + LV_UNUSED(drv); + + DWORD move_method = (DWORD) -1; + if(whence == LV_FS_SEEK_SET) { + move_method = FILE_BEGIN; + } + else if(whence == LV_FS_SEEK_CUR) { + move_method = FILE_CURRENT; + } + else if(whence == LV_FS_SEEK_END) { + move_method = FILE_END; + } + + LARGE_INTEGER distance_to_move; + distance_to_move.QuadPart = pos; + return SetFilePointerEx((HANDLE)file_p, distance_to_move, NULL, move_method) + ? LV_FS_RES_OK + : fs_error_from_win32(GetLastError()); +} + +/** + * Give the position of the read write pointer + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. + * @param pos_p pointer to to store the result + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + LV_UNUSED(drv); + + if(!pos_p) { + return LV_FS_RES_INV_PARAM; + } + + LARGE_INTEGER file_pointer; + file_pointer.QuadPart = 0; + + LARGE_INTEGER distance_to_move; + distance_to_move.QuadPart = 0; + if(SetFilePointerEx( + (HANDLE)file_p, + distance_to_move, + &file_pointer, + FILE_CURRENT)) { + if(file_pointer.QuadPart > LONG_MAX) { + return LV_FS_RES_INV_PARAM; + } + else { + *pos_p = file_pointer.LowPart; + return LV_FS_RES_OK; + } + } + else { + return fs_error_from_win32(GetLastError()); + } +} + +/** + * Initialize a 'DIR' or 'HANDLE' variable for directory reading + * @param drv pointer to a driver where this function belongs + * @param path path to a directory + * @return pointer to an initialized 'DIR' or 'HANDLE' variable + */ +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) +{ + LV_UNUSED(drv); + dir_handle_t * handle = (dir_handle_t *)lv_mem_alloc(sizeof(dir_handle_t)); + handle->dir_p = INVALID_HANDLE_VALUE; + handle->next_error = LV_FS_RES_OK; + WIN32_FIND_DATAA fdata; + + /*Make the path relative to the current directory (the projects root folder)*/ + char buf[MAX_PATH_LEN]; +#ifdef LV_FS_WIN32_PATH + lv_snprintf(buf, sizeof(buf), LV_FS_WIN32_PATH "%s\\*", path); +#else + lv_snprintf(buf, sizeof(buf), "%s\\*", path); +#endif + + strcpy(handle->next_fn, ""); + handle->dir_p = FindFirstFileA(buf, &fdata); + do { + if(is_dots_name(fdata.cFileName)) { + continue; + } + else { + if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "/%s", fdata.cFileName); + } + else { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "%s", fdata.cFileName); + } + break; + } + } while(FindNextFileA(handle->dir_p, &fdata)); + + if(handle->dir_p == INVALID_HANDLE_VALUE) { + lv_mem_free(handle); + handle->next_error = fs_error_from_win32(GetLastError()); + return INVALID_HANDLE_VALUE; + } + else { + handle->next_error = LV_FS_RES_OK; + return handle; + } +} + +/** + * Read the next filename from a directory. + * The name of the directories will begin with '/' + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable + * @param fn pointer to a buffer to store the filename + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn) +{ + LV_UNUSED(drv); + dir_handle_t * handle = (dir_handle_t *)dir_p; + strcpy(fn, handle->next_fn); + lv_fs_res_t current_error = handle->next_error; + strcpy(handle->next_fn, ""); + + WIN32_FIND_DATAA fdata; + + while(FindNextFileA(handle->dir_p, &fdata)) { + if(is_dots_name(fdata.cFileName)) { + continue; + } + else { + if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "/%s", fdata.cFileName); + } + else { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "%s", fdata.cFileName); + } + break; + } + } + + if(handle->next_fn[0] == '\0') { + handle->next_error = fs_error_from_win32(GetLastError()); + } + + return current_error; +} + +/** + * Close the directory reading + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p) +{ + LV_UNUSED(drv); + dir_handle_t * handle = (dir_handle_t *)dir_p; + lv_fs_res_t res = FindClose(handle->dir_p) + ? LV_FS_RES_OK + : fs_error_from_win32(GetLastError()); + lv_mem_free(handle); + return res; +} + +#else /*LV_USE_FS_WIN32 == 0*/ + +#if defined(LV_FS_WIN32_LETTER) && LV_FS_WIN32_LETTER != '\0' + #warning "LV_USE_FS_WIN32 is not enabled but LV_FS_WIN32_LETTER is set" +#endif + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/fsdrv/lv_fsdrv.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/fsdrv/lv_fsdrv.h new file mode 100644 index 0000000..285d598 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/fsdrv/lv_fsdrv.h @@ -0,0 +1,55 @@ +/** + * @file lv_fsdrv.h + * + */ + +#ifndef LV_FSDRV_H +#define LV_FSDRV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +#if LV_USE_FS_FATFS != '\0' +void lv_fs_fatfs_init(void); +#endif + +#if LV_USE_FS_STDIO != '\0' +void lv_fs_stdio_init(void); +#endif + +#if LV_USE_FS_POSIX != '\0' +void lv_fs_posix_init(void); +#endif + +#if LV_USE_FS_WIN32 != '\0' +void lv_fs_win32_init(void); +#endif + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_FSDRV_H*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/gif/gifdec.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/gif/gifdec.c new file mode 100644 index 0000000..68f5005 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/gif/gifdec.c @@ -0,0 +1,659 @@ +#include "gifdec.h" +#include "../../../misc/lv_log.h" +#include "../../../misc/lv_mem.h" +#include "../../../misc/lv_color.h" +#if LV_USE_GIF + +#include +#include +#include + +#define MIN(A, B) ((A) < (B) ? (A) : (B)) +#define MAX(A, B) ((A) > (B) ? (A) : (B)) + +typedef struct Entry { + uint16_t length; + uint16_t prefix; + uint8_t suffix; +} Entry; + +typedef struct Table { + int bulk; + int nentries; + Entry *entries; +} Table; + +static gd_GIF * gif_open(gd_GIF * gif); +static bool f_gif_open(gd_GIF * gif, const void * path, bool is_file); +static void f_gif_read(gd_GIF * gif, void * buf, size_t len); +static int f_gif_seek(gd_GIF * gif, size_t pos, int k); +static void f_gif_close(gd_GIF * gif); + +static uint16_t +read_num(gd_GIF * gif) +{ + uint8_t bytes[2]; + + f_gif_read(gif, bytes, 2); + return bytes[0] + (((uint16_t) bytes[1]) << 8); +} + + + +gd_GIF * +gd_open_gif_file(const char *fname) +{ + gd_GIF gif_base; + memset(&gif_base, 0, sizeof(gif_base)); + + bool res = f_gif_open(&gif_base, fname, true); + if(!res) return NULL; + + return gif_open(&gif_base); +} + + +gd_GIF * +gd_open_gif_data(const void *data) +{ + gd_GIF gif_base; + memset(&gif_base, 0, sizeof(gif_base)); + + bool res = f_gif_open(&gif_base, data, false); + if(!res) return NULL; + + return gif_open(&gif_base); +} + +static gd_GIF * gif_open(gd_GIF * gif_base) +{ + uint8_t sigver[3]; + uint16_t width, height, depth; + uint8_t fdsz, bgidx, aspect; + int i; + uint8_t *bgcolor; + int gct_sz; + gd_GIF *gif = NULL; + + /* Header */ + f_gif_read(gif_base, sigver, 3); + if (memcmp(sigver, "GIF", 3) != 0) { + LV_LOG_WARN("invalid signature\n"); + goto fail; + } + /* Version */ + f_gif_read(gif_base, sigver, 3); + if (memcmp(sigver, "89a", 3) != 0) { + LV_LOG_WARN("invalid version\n"); + goto fail; + } + /* Width x Height */ + width = read_num(gif_base); + height = read_num(gif_base); + /* FDSZ */ + f_gif_read(gif_base, &fdsz, 1); + /* Presence of GCT */ + if (!(fdsz & 0x80)) { + LV_LOG_WARN("no global color table\n"); + goto fail; + } + /* Color Space's Depth */ + depth = ((fdsz >> 4) & 7) + 1; + /* Ignore Sort Flag. */ + /* GCT Size */ + gct_sz = 1 << ((fdsz & 0x07) + 1); + /* Background Color Index */ + f_gif_read(gif_base, &bgidx, 1); + /* Aspect Ratio */ + f_gif_read(gif_base, &aspect, 1); + /* Create gd_GIF Structure. */ +#if LV_COLOR_DEPTH == 32 + gif = lv_mem_alloc(sizeof(gd_GIF) + 5 * width * height); +#elif LV_COLOR_DEPTH == 16 + gif = lv_mem_alloc(sizeof(gd_GIF) + 4 * width * height); +#elif LV_COLOR_DEPTH == 8 || LV_COLOR_DEPTH == 1 + gif = lv_mem_alloc(sizeof(gd_GIF) + 3 * width * height); +#endif + + if (!gif) goto fail; + memcpy(gif, gif_base, sizeof(gd_GIF)); + gif->width = width; + gif->height = height; + gif->depth = depth; + /* Read GCT */ + gif->gct.size = gct_sz; + f_gif_read(gif, gif->gct.colors, 3 * gif->gct.size); + gif->palette = &gif->gct; + gif->bgindex = bgidx; + gif->canvas = (uint8_t *) &gif[1]; +#if LV_COLOR_DEPTH == 32 + gif->frame = &gif->canvas[4 * width * height]; +#elif LV_COLOR_DEPTH == 16 + gif->frame = &gif->canvas[3 * width * height]; +#elif LV_COLOR_DEPTH == 8 || LV_COLOR_DEPTH == 1 + gif->frame = &gif->canvas[2 * width * height]; +#endif + if (gif->bgindex) { + memset(gif->frame, gif->bgindex, gif->width * gif->height); + } + bgcolor = &gif->palette->colors[gif->bgindex*3]; + + for (i = 0; i < gif->width * gif->height; i++) { +#if LV_COLOR_DEPTH == 32 + gif->canvas[i*4 + 0] = *(bgcolor + 2); + gif->canvas[i*4 + 1] = *(bgcolor + 1); + gif->canvas[i*4 + 2] = *(bgcolor + 0); + gif->canvas[i*4 + 3] = 0xff; +#elif LV_COLOR_DEPTH == 16 + lv_color_t c = lv_color_make(*(bgcolor + 0), *(bgcolor + 1), *(bgcolor + 2)); + gif->canvas[i*3 + 0] = c.full & 0xff; + gif->canvas[i*3 + 1] = (c.full >> 8) & 0xff; + gif->canvas[i*3 + 2] = 0xff; +#elif LV_COLOR_DEPTH == 8 + lv_color_t c = lv_color_make(*(bgcolor + 0), *(bgcolor + 1), *(bgcolor + 2)); + gif->canvas[i*2 + 0] = c.full; + gif->canvas[i*2 + 1] = 0xff; +#elif LV_COLOR_DEPTH == 1 + lv_color_t c = lv_color_make(*(bgcolor + 0), *(bgcolor + 1), *(bgcolor + 2)); + gif->canvas[i*2 + 0] = c.ch.red > 128 ? 1 : 0; + gif->canvas[i*2 + 1] = 0xff; +#endif + } + gif->anim_start = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); + goto ok; +fail: + f_gif_close(gif_base); +ok: + return gif; +} + +static void +discard_sub_blocks(gd_GIF *gif) +{ + uint8_t size; + + do { + f_gif_read(gif, &size, 1); + f_gif_seek(gif, size, LV_FS_SEEK_CUR); + } while (size); +} + +static void +read_plain_text_ext(gd_GIF *gif) +{ + if (gif->plain_text) { + uint16_t tx, ty, tw, th; + uint8_t cw, ch, fg, bg; + size_t sub_block; + f_gif_seek(gif, 1, LV_FS_SEEK_CUR); /* block size = 12 */ + tx = read_num(gif); + ty = read_num(gif); + tw = read_num(gif); + th = read_num(gif); + f_gif_read(gif, &cw, 1); + f_gif_read(gif, &ch, 1); + f_gif_read(gif, &fg, 1); + f_gif_read(gif, &bg, 1); + sub_block = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); + gif->plain_text(gif, tx, ty, tw, th, cw, ch, fg, bg); + f_gif_seek(gif, sub_block, LV_FS_SEEK_SET); + } else { + /* Discard plain text metadata. */ + f_gif_seek(gif, 13, LV_FS_SEEK_CUR); + } + /* Discard plain text sub-blocks. */ + discard_sub_blocks(gif); +} + +static void +read_graphic_control_ext(gd_GIF *gif) +{ + uint8_t rdit; + + /* Discard block size (always 0x04). */ + f_gif_seek(gif, 1, LV_FS_SEEK_CUR); + f_gif_read(gif, &rdit, 1); + gif->gce.disposal = (rdit >> 2) & 3; + gif->gce.input = rdit & 2; + gif->gce.transparency = rdit & 1; + gif->gce.delay = read_num(gif); + f_gif_read(gif, &gif->gce.tindex, 1); + /* Skip block terminator. */ + f_gif_seek(gif, 1, LV_FS_SEEK_CUR); +} + +static void +read_comment_ext(gd_GIF *gif) +{ + if (gif->comment) { + size_t sub_block = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); + gif->comment(gif); + f_gif_seek(gif, sub_block, LV_FS_SEEK_SET); + } + /* Discard comment sub-blocks. */ + discard_sub_blocks(gif); +} + +static void +read_application_ext(gd_GIF *gif) +{ + char app_id[8]; + char app_auth_code[3]; + + /* Discard block size (always 0x0B). */ + f_gif_seek(gif, 1, LV_FS_SEEK_CUR); + /* Application Identifier. */ + f_gif_read(gif, app_id, 8); + /* Application Authentication Code. */ + f_gif_read(gif, app_auth_code, 3); + if (!strncmp(app_id, "NETSCAPE", sizeof(app_id))) { + /* Discard block size (0x03) and constant byte (0x01). */ + f_gif_seek(gif, 2, LV_FS_SEEK_CUR); + gif->loop_count = read_num(gif); + /* Skip block terminator. */ + f_gif_seek(gif, 1, LV_FS_SEEK_CUR); + } else if (gif->application) { + size_t sub_block = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); + gif->application(gif, app_id, app_auth_code); + f_gif_seek(gif, sub_block, LV_FS_SEEK_SET); + discard_sub_blocks(gif); + } else { + discard_sub_blocks(gif); + } +} + +static void +read_ext(gd_GIF *gif) +{ + uint8_t label; + + f_gif_read(gif, &label, 1); + switch (label) { + case 0x01: + read_plain_text_ext(gif); + break; + case 0xF9: + read_graphic_control_ext(gif); + break; + case 0xFE: + read_comment_ext(gif); + break; + case 0xFF: + read_application_ext(gif); + break; + default: + LV_LOG_WARN("unknown extension: %02X\n", label); + } +} + +static Table * +new_table(int key_size) +{ + int key; + int init_bulk = MAX(1 << (key_size + 1), 0x100); + Table *table = lv_mem_alloc(sizeof(*table) + sizeof(Entry) * init_bulk); + if (table) { + table->bulk = init_bulk; + table->nentries = (1 << key_size) + 2; + table->entries = (Entry *) &table[1]; + for (key = 0; key < (1 << key_size); key++) + table->entries[key] = (Entry) {1, 0xFFF, key}; + } + return table; +} + +/* Add table entry. Return value: + * 0 on success + * +1 if key size must be incremented after this addition + * -1 if could not realloc table */ +static int +add_entry(Table **tablep, uint16_t length, uint16_t prefix, uint8_t suffix) +{ + Table *table = *tablep; + if (table->nentries == table->bulk) { + table->bulk *= 2; + table = lv_mem_realloc(table, sizeof(*table) + sizeof(Entry) * table->bulk); + if (!table) return -1; + table->entries = (Entry *) &table[1]; + *tablep = table; + } + table->entries[table->nentries] = (Entry) {length, prefix, suffix}; + table->nentries++; + if ((table->nentries & (table->nentries - 1)) == 0) + return 1; + return 0; +} + +static uint16_t +get_key(gd_GIF *gif, int key_size, uint8_t *sub_len, uint8_t *shift, uint8_t *byte) +{ + int bits_read; + int rpad; + int frag_size; + uint16_t key; + + key = 0; + for (bits_read = 0; bits_read < key_size; bits_read += frag_size) { + rpad = (*shift + bits_read) % 8; + if (rpad == 0) { + /* Update byte. */ + if (*sub_len == 0) { + f_gif_read(gif, sub_len, 1); /* Must be nonzero! */ + if (*sub_len == 0) return 0x1000; + } + f_gif_read(gif, byte, 1); + (*sub_len)--; + } + frag_size = MIN(key_size - bits_read, 8 - rpad); + key |= ((uint16_t) ((*byte) >> rpad)) << bits_read; + } + /* Clear extra bits to the left. */ + key &= (1 << key_size) - 1; + *shift = (*shift + key_size) % 8; + return key; +} + +/* Compute output index of y-th input line, in frame of height h. */ +static int +interlaced_line_index(int h, int y) +{ + int p; /* number of lines in current pass */ + + p = (h - 1) / 8 + 1; + if (y < p) /* pass 1 */ + return y * 8; + y -= p; + p = (h - 5) / 8 + 1; + if (y < p) /* pass 2 */ + return y * 8 + 4; + y -= p; + p = (h - 3) / 4 + 1; + if (y < p) /* pass 3 */ + return y * 4 + 2; + y -= p; + /* pass 4 */ + return y * 2 + 1; +} + +/* Decompress image pixels. + * Return 0 on success or -1 on out-of-memory (w.r.t. LZW code table). */ +static int +read_image_data(gd_GIF *gif, int interlace) +{ + uint8_t sub_len, shift, byte; + int init_key_size, key_size, table_is_full=0; + int frm_off, frm_size, str_len=0, i, p, x, y; + uint16_t key, clear, stop; + int ret; + Table *table; + Entry entry = {0}; + size_t start, end; + + f_gif_read(gif, &byte, 1); + key_size = (int) byte; + start = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); + discard_sub_blocks(gif); + end = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); + f_gif_seek(gif, start, LV_FS_SEEK_SET); + clear = 1 << key_size; + stop = clear + 1; + table = new_table(key_size); + key_size++; + init_key_size = key_size; + sub_len = shift = 0; + key = get_key(gif, key_size, &sub_len, &shift, &byte); /* clear code */ + frm_off = 0; + ret = 0; + frm_size = gif->fw*gif->fh; + while (frm_off < frm_size) { + if (key == clear) { + key_size = init_key_size; + table->nentries = (1 << (key_size - 1)) + 2; + table_is_full = 0; + } else if (!table_is_full) { + ret = add_entry(&table, str_len + 1, key, entry.suffix); + if (ret == -1) { + lv_mem_free(table); + return -1; + } + if (table->nentries == 0x1000) { + ret = 0; + table_is_full = 1; + } + } + key = get_key(gif, key_size, &sub_len, &shift, &byte); + if (key == clear) continue; + if (key == stop || key == 0x1000) break; + if (ret == 1) key_size++; + entry = table->entries[key]; + str_len = entry.length; + for (i = 0; i < str_len; i++) { + p = frm_off + entry.length - 1; + x = p % gif->fw; + y = p / gif->fw; + if (interlace) + y = interlaced_line_index((int) gif->fh, y); + gif->frame[(gif->fy + y) * gif->width + gif->fx + x] = entry.suffix; + if (entry.prefix == 0xFFF) + break; + else + entry = table->entries[entry.prefix]; + } + frm_off += str_len; + if (key < table->nentries - 1 && !table_is_full) + table->entries[table->nentries - 1].suffix = entry.suffix; + } + lv_mem_free(table); + if (key == stop) f_gif_read(gif, &sub_len, 1); /* Must be zero! */ + f_gif_seek(gif, end, LV_FS_SEEK_SET); + return 0; +} + +/* Read image. + * Return 0 on success or -1 on out-of-memory (w.r.t. LZW code table). */ +static int +read_image(gd_GIF *gif) +{ + uint8_t fisrz; + int interlace; + + /* Image Descriptor. */ + gif->fx = read_num(gif); + gif->fy = read_num(gif); + gif->fw = read_num(gif); + gif->fh = read_num(gif); + f_gif_read(gif, &fisrz, 1); + interlace = fisrz & 0x40; + /* Ignore Sort Flag. */ + /* Local Color Table? */ + if (fisrz & 0x80) { + /* Read LCT */ + gif->lct.size = 1 << ((fisrz & 0x07) + 1); + f_gif_read(gif, gif->lct.colors, 3 * gif->lct.size); + gif->palette = &gif->lct; + } else + gif->palette = &gif->gct; + /* Image Data. */ + return read_image_data(gif, interlace); +} + +static void +render_frame_rect(gd_GIF *gif, uint8_t *buffer) +{ + int i, j, k; + uint8_t index, *color; + i = gif->fy * gif->width + gif->fx; + for (j = 0; j < gif->fh; j++) { + for (k = 0; k < gif->fw; k++) { + index = gif->frame[(gif->fy + j) * gif->width + gif->fx + k]; + color = &gif->palette->colors[index*3]; + if (!gif->gce.transparency || index != gif->gce.tindex) { +#if LV_COLOR_DEPTH == 32 + buffer[(i+k)*4 + 0] = *(color + 2); + buffer[(i+k)*4 + 1] = *(color + 1); + buffer[(i+k)*4 + 2] = *(color + 0); + buffer[(i+k)*4 + 3] = 0xFF; +#elif LV_COLOR_DEPTH == 16 + lv_color_t c = lv_color_make(*(color + 0), *(color + 1), *(color + 2)); + buffer[(i+k)*3 + 0] = c.full & 0xff; + buffer[(i+k)*3 + 1] = (c.full >> 8) & 0xff; + buffer[(i+k)*3 + 2] = 0xff; +#elif LV_COLOR_DEPTH == 8 + lv_color_t c = lv_color_make(*(color + 0), *(color + 1), *(color + 2)); + buffer[(i+k)*2 + 0] = c.full; + buffer[(i+k)*2 + 1] = 0xff; +#elif LV_COLOR_DEPTH == 1 + uint8_t b = (*(color + 0)) | (*(color + 1)) | (*(color + 2)); + buffer[(i+k)*2 + 0] = b > 128 ? 1 : 0; + buffer[(i+k)*2 + 1] = 0xff; +#endif + } + } + i += gif->width; + } +} + +static void +dispose(gd_GIF *gif) +{ + int i, j, k; + uint8_t *bgcolor; + switch (gif->gce.disposal) { + case 2: /* Restore to background color. */ + bgcolor = &gif->palette->colors[gif->bgindex*3]; + + uint8_t opa = 0xff; + if(gif->gce.transparency) opa = 0x00; + + i = gif->fy * gif->width + gif->fx; + for (j = 0; j < gif->fh; j++) { + for (k = 0; k < gif->fw; k++) { +#if LV_COLOR_DEPTH == 32 + gif->canvas[(i+k)*4 + 0] = *(bgcolor + 2); + gif->canvas[(i+k)*4 + 1] = *(bgcolor + 1); + gif->canvas[(i+k)*4 + 2] = *(bgcolor + 0); + gif->canvas[(i+k)*4 + 3] = opa; +#elif LV_COLOR_DEPTH == 16 + lv_color_t c = lv_color_make(*(bgcolor + 0), *(bgcolor + 1), *(bgcolor + 2)); + gif->canvas[(i+k)*3 + 0] = c.full & 0xff; + gif->canvas[(i+k)*3 + 1] = (c.full >> 8) & 0xff; + gif->canvas[(i+k)*3 + 2] = opa; +#elif LV_COLOR_DEPTH == 8 + lv_color_t c = lv_color_make(*(bgcolor + 0), *(bgcolor + 1), *(bgcolor + 2)); + gif->canvas[(i+k)*2 + 0] = c.full; + gif->canvas[(i+k)*2 + 1] = opa; +#elif LV_COLOR_DEPTH == 1 + uint8_t b = (*(bgcolor + 0)) | (*(bgcolor + 1)) | (*(bgcolor + 2)); + gif->canvas[(i+k)*2 + 0] = b > 128 ? 1 : 0; + gif->canvas[(i+k)*2 + 1] = opa; +#endif + } + i += gif->width; + } + break; + case 3: /* Restore to previous, i.e., don't update canvas.*/ + break; + default: + /* Add frame non-transparent pixels to canvas. */ + render_frame_rect(gif, gif->canvas); + } +} + +/* Return 1 if got a frame; 0 if got GIF trailer; -1 if error. */ +int +gd_get_frame(gd_GIF *gif) +{ + char sep; + + dispose(gif); + f_gif_read(gif, &sep, 1); + while (sep != ',') { + if (sep == ';') + return 0; + if (sep == '!') + read_ext(gif); + else return -1; + f_gif_read(gif, &sep, 1); + } + if (read_image(gif) == -1) + return -1; + return 1; +} + +void +gd_render_frame(gd_GIF *gif, uint8_t *buffer) +{ +// uint32_t i; +// uint32_t j; +// for(i = 0, j = 0; i < gif->width * gif->height * 3; i+= 3, j+=4) { +// buffer[j + 0] = gif->canvas[i + 2]; +// buffer[j + 1] = gif->canvas[i + 1]; +// buffer[j + 2] = gif->canvas[i + 0]; +// buffer[j + 3] = 0xFF; +// } +// memcpy(buffer, gif->canvas, gif->width * gif->height * 3); + render_frame_rect(gif, buffer); +} + +void +gd_rewind(gd_GIF *gif) +{ + f_gif_seek(gif, gif->anim_start, LV_FS_SEEK_SET); +} + +void +gd_close_gif(gd_GIF *gif) +{ + f_gif_close(gif); + lv_mem_free(gif); +} + +static bool f_gif_open(gd_GIF * gif, const void * path, bool is_file) +{ + gif->f_rw_p = 0; + gif->data = NULL; + gif->is_file = is_file; + + if(is_file) { + lv_fs_res_t res = lv_fs_open(&gif->fd, path, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) return false; + else return true; + } else { + gif->data = path; + return true; + } +} + +static void f_gif_read(gd_GIF * gif, void * buf, size_t len) +{ + if(gif->is_file) { + lv_fs_read(&gif->fd, buf, len, NULL); + } else + { + memcpy(buf, &gif->data[gif->f_rw_p], len); + gif->f_rw_p += len; + } +} + +static int f_gif_seek(gd_GIF * gif, size_t pos, int k) +{ + if(gif->is_file) { + lv_fs_seek(&gif->fd, pos, k); + uint32_t x; + lv_fs_tell(&gif->fd, &x); + return x; + } else { + if(k == LV_FS_SEEK_CUR) gif->f_rw_p += pos; + else if(k == LV_FS_SEEK_SET) gif->f_rw_p = pos; + return gif->f_rw_p; + } +} + +static void f_gif_close(gd_GIF * gif) +{ + if(gif->is_file) { + lv_fs_close(&gif->fd); + } +} + +#endif /*LV_USE_GIF*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/gif/gifdec.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/gif/gifdec.h new file mode 100644 index 0000000..00f17c1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/gif/gifdec.h @@ -0,0 +1,60 @@ +#ifndef GIFDEC_H +#define GIFDEC_H + +#include +#include "../../../misc/lv_fs.h" + +#if LV_USE_GIF + +typedef struct gd_Palette { + int size; + uint8_t colors[0x100 * 3]; +} gd_Palette; + +typedef struct gd_GCE { + uint16_t delay; + uint8_t tindex; + uint8_t disposal; + int input; + int transparency; +} gd_GCE; + + + +typedef struct gd_GIF { + lv_fs_file_t fd; + const char * data; + uint8_t is_file; + uint32_t f_rw_p; + int32_t anim_start; + uint16_t width, height; + uint16_t depth; + uint16_t loop_count; + gd_GCE gce; + gd_Palette *palette; + gd_Palette lct, gct; + void (*plain_text)( + struct gd_GIF *gif, uint16_t tx, uint16_t ty, + uint16_t tw, uint16_t th, uint8_t cw, uint8_t ch, + uint8_t fg, uint8_t bg + ); + void (*comment)(struct gd_GIF *gif); + void (*application)(struct gd_GIF *gif, char id[8], char auth[3]); + uint16_t fx, fy, fw, fh; + uint8_t bgindex; + uint8_t *canvas, *frame; +} gd_GIF; + +gd_GIF * gd_open_gif_file(const char *fname); + +gd_GIF * gd_open_gif_data(const void *data); + +void gd_render_frame(gd_GIF *gif, uint8_t *buffer); + +int gd_get_frame(gd_GIF *gif); +void gd_rewind(gd_GIF *gif); +void gd_close_gif(gd_GIF *gif); + +#endif /*LV_USE_GIF*/ + +#endif /* GIFDEC_H */ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/gif/lv_gif.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/gif/lv_gif.c new file mode 100644 index 0000000..4cb2955 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/gif/lv_gif.c @@ -0,0 +1,155 @@ +/** + * @file lv_gifenc.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_gif.h" +#if LV_USE_GIF + +#include "gifdec.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_gif_class + +/********************** + * TYPEDEFS + **********************/ + + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_gif_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_gif_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void next_frame_task_cb(lv_timer_t * t); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_gif_class = { + .constructor_cb = lv_gif_constructor, + .destructor_cb = lv_gif_destructor, + .instance_size = sizeof(lv_gif_t), + .base_class = &lv_img_class +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_gif_create(lv_obj_t * parent) +{ + + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +void lv_gif_set_src(lv_obj_t * obj, const void * src) +{ + lv_gif_t * gifobj = (lv_gif_t *) obj; + + /*Close previous gif if any*/ + if(gifobj->gif) { + lv_img_cache_invalidate_src(&gifobj->imgdsc); + gd_close_gif(gifobj->gif); + gifobj->gif = NULL; + gifobj->imgdsc.data = NULL; + } + + if(lv_img_src_get_type(src) == LV_IMG_SRC_VARIABLE) { + const lv_img_dsc_t * img_dsc = src; + gifobj->gif = gd_open_gif_data(img_dsc->data); + } + else if(lv_img_src_get_type(src) == LV_IMG_SRC_FILE) { + gifobj->gif = gd_open_gif_file(src); + } + if(gifobj->gif == NULL) { + LV_LOG_WARN("Could't load the source"); + return; + } + + gifobj->imgdsc.data = gifobj->gif->canvas; + gifobj->imgdsc.header.always_zero = 0; + gifobj->imgdsc.header.cf = LV_IMG_CF_TRUE_COLOR_ALPHA; + gifobj->imgdsc.header.h = gifobj->gif->height; + gifobj->imgdsc.header.w = gifobj->gif->width; + gifobj->last_call = lv_tick_get(); + + lv_img_set_src(obj, &gifobj->imgdsc); + + lv_timer_resume(gifobj->timer); + lv_timer_reset(gifobj->timer); + + next_frame_task_cb(gifobj->timer); + +} + +void lv_gif_restart(lv_obj_t * obj) +{ + lv_gif_t * gifobj = (lv_gif_t *) obj; + gd_rewind(gifobj->gif); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_gif_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + lv_gif_t * gifobj = (lv_gif_t *) obj; + + gifobj->timer = lv_timer_create(next_frame_task_cb, 10, obj); + lv_timer_pause(gifobj->timer); +} + +static void lv_gif_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_gif_t * gifobj = (lv_gif_t *) obj; + lv_img_cache_invalidate_src(&gifobj->imgdsc); + gd_close_gif(gifobj->gif); + lv_timer_del(gifobj->timer); +} + +static void next_frame_task_cb(lv_timer_t * t) +{ + lv_obj_t * obj = t->user_data; + lv_gif_t * gifobj = (lv_gif_t *) obj; + uint32_t elaps = lv_tick_elaps(gifobj->last_call); + if(elaps < gifobj->gif->gce.delay * 10) return; + + gifobj->last_call = lv_tick_get(); + + int has_next = gd_get_frame(gifobj->gif); + if(has_next == 0) { + /*It was the last repeat*/ + if(gifobj->gif->loop_count == 1) { + lv_res_t res = lv_event_send(obj, LV_EVENT_READY, NULL); + if(res != LV_FS_RES_OK) return; + } + else { + if(gifobj->gif->loop_count > 1) gifobj->gif->loop_count--; + gd_rewind(gifobj->gif); + } + } + + gd_render_frame(gifobj->gif, (uint8_t *)gifobj->imgdsc.data); + + lv_img_cache_invalidate_src(lv_img_get_src(obj)); + lv_obj_invalidate(obj); +} + +#endif /*LV_USE_GIF*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/gif/lv_gif.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/gif/lv_gif.h new file mode 100644 index 0000000..d8c93db --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/gif/lv_gif.h @@ -0,0 +1,58 @@ +/** + * @file lv_gif.h + * + */ + +#ifndef LV_GIF_H +#define LV_GIF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lvgl.h" +#if LV_USE_GIF + +#include "gifdec.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_img_t img; + gd_GIF * gif; + lv_timer_t * timer; + lv_img_dsc_t imgdsc; + uint32_t last_call; +} lv_gif_t; + +extern const lv_obj_class_t lv_gif_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_obj_t * lv_gif_create(lv_obj_t * parent); +void lv_gif_set_src(lv_obj_t * obj, const void * src); +void lv_gif_restart(lv_obj_t * gif); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GIF*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_GIF_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/lv_libs.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/lv_libs.h new file mode 100644 index 0000000..6782b1d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/lv_libs.h @@ -0,0 +1,46 @@ +/** + * @file lv_libs.h + * + */ + +#ifndef LV_LIBS_H +#define LV_LIBS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "bmp/lv_bmp.h" +#include "fsdrv/lv_fsdrv.h" +#include "png/lv_png.h" +#include "gif/lv_gif.h" +#include "qrcode/lv_qrcode.h" +#include "sjpg/lv_sjpg.h" +#include "freetype/lv_freetype.h" +#include "rlottie/lv_rlottie.h" +#include "ffmpeg/lv_ffmpeg.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LIBS_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/png/lodepng.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/png/lodepng.c new file mode 100644 index 0000000..82e18e1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/png/lodepng.c @@ -0,0 +1,6469 @@ +/* +LodePNG version 20201017 + +Copyright (c) 2005-2020 Lode Vandevenne + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ + +/* +The manual and changelog are in the header file "lodepng.h" +Rename this file to lodepng.cpp to use it for C++, or to lodepng.c to use it for C. +*/ + +#include "lodepng.h" +#if LV_USE_PNG + +#ifdef LODEPNG_COMPILE_DISK +#include /* LONG_MAX */ +#endif /* LODEPNG_COMPILE_DISK */ + +#ifdef LODEPNG_COMPILE_ALLOCATORS +#include /* allocations */ +#endif /* LODEPNG_COMPILE_ALLOCATORS */ + +#if defined(_MSC_VER) && (_MSC_VER >= 1310) /*Visual Studio: A few warning types are not desired here.*/ +#pragma warning( disable : 4244 ) /*implicit conversions: not warned by gcc -Wall -Wextra and requires too much casts*/ +#pragma warning( disable : 4996 ) /*VS does not like fopen, but fopen_s is not standard C so unusable here*/ +#endif /*_MSC_VER */ + +const char* LODEPNG_VERSION_STRING = "20201017"; + +/* +This source file is built up in the following large parts. The code sections +with the "LODEPNG_COMPILE_" #defines divide this up further in an intermixed way. +-Tools for C and common code for PNG and Zlib +-C Code for Zlib (huffman, deflate, ...) +-C Code for PNG (file format chunks, adam7, PNG filters, color conversions, ...) +-The C++ wrapper around all of the above +*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // Tools for C, and common code for PNG and Zlib. // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*The malloc, realloc and free functions defined here with "lodepng_" in front +of the name, so that you can easily change them to others related to your +platform if needed. Everything else in the code calls these. Pass +-DLODEPNG_NO_COMPILE_ALLOCATORS to the compiler, or comment out +#define LODEPNG_COMPILE_ALLOCATORS in the header, to disable the ones here and +define them in your own project's source files without needing to change +lodepng source code. Don't forget to remove "static" if you copypaste them +from here.*/ + +#ifdef LODEPNG_COMPILE_ALLOCATORS +static void* lodepng_malloc(size_t size) { +#ifdef LODEPNG_MAX_ALLOC + if(size > LODEPNG_MAX_ALLOC) return 0; +#endif + return lv_mem_alloc(size); +} + +/* NOTE: when realloc returns NULL, it leaves the original memory untouched */ +static void* lodepng_realloc(void* ptr, size_t new_size) { +#ifdef LODEPNG_MAX_ALLOC + if(new_size > LODEPNG_MAX_ALLOC) return 0; +#endif + return lv_mem_realloc(ptr, new_size); +} + +static void lodepng_free(void* ptr) { + lv_mem_free(ptr); +} +#else /*LODEPNG_COMPILE_ALLOCATORS*/ +/* TODO: support giving additional void* payload to the custom allocators */ +void* lodepng_malloc(size_t size); +void* lodepng_realloc(void* ptr, size_t new_size); +void lodepng_free(void* ptr); +#endif /*LODEPNG_COMPILE_ALLOCATORS*/ + +/* convince the compiler to inline a function, for use when this measurably improves performance */ +/* inline is not available in C90, but use it when supported by the compiler */ +#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || (defined(__cplusplus) && (__cplusplus >= 199711L)) +#define LODEPNG_INLINE inline +#else +#define LODEPNG_INLINE /* not available */ +#endif + +/* restrict is not available in C90, but use it when supported by the compiler */ +#if (defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))) ||\ + (defined(_MSC_VER) && (_MSC_VER >= 1400)) || \ + (defined(__WATCOMC__) && (__WATCOMC__ >= 1250) && !defined(__cplusplus)) +#define LODEPNG_RESTRICT __restrict +#else +#define LODEPNG_RESTRICT /* not available */ +#endif + +/* Replacements for C library functions such as memcpy and strlen, to support platforms +where a full C library is not available. The compiler can recognize them and compile +to something as fast. */ + +static void lodepng_memcpy(void* LODEPNG_RESTRICT dst, + const void* LODEPNG_RESTRICT src, size_t size) { + lv_memcpy(dst, src, size); +} + +static void lodepng_memset(void* LODEPNG_RESTRICT dst, + int value, size_t num) { + lv_memset(dst, value, num); +} + +/* does not check memory out of bounds, do not use on untrusted data */ +static size_t lodepng_strlen(const char* a) { + const char* orig = a; + /* avoid warning about unused function in case of disabled COMPILE... macros */ + (void)(&lodepng_strlen); + while(*a) a++; + return (size_t)(a - orig); +} + +#define LODEPNG_MAX(a, b) (((a) > (b)) ? (a) : (b)) +#define LODEPNG_MIN(a, b) (((a) < (b)) ? (a) : (b)) +#define LODEPNG_ABS(x) ((x) < 0 ? -(x) : (x)) + +#if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_DECODER) +/* Safely check if adding two integers will overflow (no undefined +behavior, compiler removing the code, etc...) and output result. */ +static int lodepng_addofl(size_t a, size_t b, size_t* result) { + *result = a + b; /* Unsigned addition is well defined and safe in C90 */ + return *result < a; +} +#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_DECODER)*/ + +#ifdef LODEPNG_COMPILE_DECODER +/* Safely check if multiplying two integers will overflow (no undefined +behavior, compiler removing the code, etc...) and output result. */ +static int lodepng_mulofl(size_t a, size_t b, size_t* result) { + *result = a * b; /* Unsigned multiplication is well defined and safe in C90 */ + return (a != 0 && *result / a != b); +} + +#ifdef LODEPNG_COMPILE_ZLIB +/* Safely check if a + b > c, even if overflow could happen. */ +static int lodepng_gtofl(size_t a, size_t b, size_t c) { + size_t d; + if(lodepng_addofl(a, b, &d)) return 1; + return d > c; +} +#endif /*LODEPNG_COMPILE_ZLIB*/ +#endif /*LODEPNG_COMPILE_DECODER*/ + + +/* +Often in case of an error a value is assigned to a variable and then it breaks +out of a loop (to go to the cleanup phase of a function). This macro does that. +It makes the error handling code shorter and more readable. + +Example: if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83); +*/ +#define CERROR_BREAK(errorvar, code){\ + errorvar = code;\ + break;\ +} + +/*version of CERROR_BREAK that assumes the common case where the error variable is named "error"*/ +#define ERROR_BREAK(code) CERROR_BREAK(error, code) + +/*Set error var to the error code, and return it.*/ +#define CERROR_RETURN_ERROR(errorvar, code){\ + errorvar = code;\ + return code;\ +} + +/*Try the code, if it returns error, also return the error.*/ +#define CERROR_TRY_RETURN(call){\ + unsigned error = call;\ + if(error) return error;\ +} + +/*Set error var to the error code, and return from the void function.*/ +#define CERROR_RETURN(errorvar, code){\ + errorvar = code;\ + return;\ +} + +/* +About uivector, ucvector and string: +-All of them wrap dynamic arrays or text strings in a similar way. +-LodePNG was originally written in C++. The vectors replace the std::vectors that were used in the C++ version. +-The string tools are made to avoid problems with compilers that declare things like strncat as deprecated. +-They're not used in the interface, only internally in this file as static functions. +-As with many other structs in this file, the init and cleanup functions serve as ctor and dtor. +*/ + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_ENCODER +/*dynamic vector of unsigned ints*/ +typedef struct uivector { + unsigned* data; + size_t size; /*size in number of unsigned longs*/ + size_t allocsize; /*allocated size in bytes*/ +} uivector; + +static void uivector_cleanup(void* p) { + ((uivector*)p)->size = ((uivector*)p)->allocsize = 0; + lodepng_free(((uivector*)p)->data); + ((uivector*)p)->data = NULL; +} + +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned uivector_resize(uivector* p, size_t size) { + size_t allocsize = size * sizeof(unsigned); + if(allocsize > p->allocsize) { + size_t newsize = allocsize + (p->allocsize >> 1u); + void* data = lodepng_realloc(p->data, newsize); + if(data) { + p->allocsize = newsize; + p->data = (unsigned*)data; + } + else return 0; /*error: not enough memory*/ + } + p->size = size; + return 1; /*success*/ +} + +static void uivector_init(uivector* p) { + p->data = NULL; + p->size = p->allocsize = 0; +} + +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned uivector_push_back(uivector* p, unsigned c) { + if(!uivector_resize(p, p->size + 1)) return 0; + p->data[p->size - 1] = c; + return 1; +} +#endif /*LODEPNG_COMPILE_ENCODER*/ +#endif /*LODEPNG_COMPILE_ZLIB*/ + +/* /////////////////////////////////////////////////////////////////////////// */ + +/*dynamic vector of unsigned chars*/ +typedef struct ucvector { + unsigned char* data; + size_t size; /*used size*/ + size_t allocsize; /*allocated size*/ +} ucvector; + +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned ucvector_resize(ucvector* p, size_t size) { + if(size > p->allocsize) { + size_t newsize = size + (p->allocsize >> 1u); + void* data = lodepng_realloc(p->data, newsize); + if(data) { + p->allocsize = newsize; + p->data = (unsigned char*)data; + } + else return 0; /*error: not enough memory*/ + } + p->size = size; + return 1; /*success*/ +} + +static ucvector ucvector_init(unsigned char* buffer, size_t size) { + ucvector v; + v.data = buffer; + v.allocsize = v.size = size; + return v; +} + +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_PNG +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + +/*free string pointer and set it to NULL*/ +static void string_cleanup(char** out) { + lodepng_free(*out); + *out = NULL; +} + +/*also appends null termination character*/ +static char* alloc_string_sized(const char* in, size_t insize) { + char* out = (char*)lodepng_malloc(insize + 1); + if(out) { + lodepng_memcpy(out, in, insize); + out[insize] = 0; + } + return out; +} + +/* dynamically allocates a new string with a copy of the null terminated input text */ +static char* alloc_string(const char* in) { + return alloc_string_sized(in, lodepng_strlen(in)); +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +/* ////////////////////////////////////////////////////////////////////////// */ + +#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_PNG) +static unsigned lodepng_read32bitInt(const unsigned char* buffer) { + return (((unsigned)buffer[0] << 24u) | ((unsigned)buffer[1] << 16u) | + ((unsigned)buffer[2] << 8u) | (unsigned)buffer[3]); +} +#endif /*defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_PNG)*/ + +#if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER) +/*buffer must have at least 4 allocated bytes available*/ +static void lodepng_set32bitInt(unsigned char* buffer, unsigned value) { + buffer[0] = (unsigned char)((value >> 24) & 0xff); + buffer[1] = (unsigned char)((value >> 16) & 0xff); + buffer[2] = (unsigned char)((value >> 8) & 0xff); + buffer[3] = (unsigned char)((value ) & 0xff); +} +#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / File IO / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_DISK + +/* returns negative value on error. This should be pure C compatible, so no fstat. */ +static long lodepng_filesize(const char* filename) { + lv_fs_file_t f; + lv_fs_res_t res = lv_fs_open(&f, filename, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) return -1; + uint32_t size = 0; + if(lv_fs_seek(&f, 0, LV_FS_SEEK_END) != 0) { + lv_fs_close(&f); + return -1; + } + + lv_fs_tell(&f, &size); + lv_fs_close(&f); + return size; +} + +/* load file into buffer that already has the correct allocated size. Returns error code.*/ +static unsigned lodepng_buffer_file(unsigned char* out, size_t size, const char* filename) { + lv_fs_file_t f; + lv_fs_res_t res = lv_fs_open(&f, filename, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) return 78; + + uint32_t br; + res = lv_fs_read(&f, out, size, &br); + if(res != LV_FS_RES_OK) return 78; + if (br != size) return 78; + lv_fs_close(&f); + return 0; +} + +unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename) { + long size = lodepng_filesize(filename); + if(size < 0) return 78; + *outsize = (size_t)size; + + *out = (unsigned char*)lodepng_malloc((size_t)size); + if(!(*out) && size > 0) return 83; /*the above malloc failed*/ + + return lodepng_buffer_file(*out, (size_t)size, filename); +} + +/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ +unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename) { + lv_fs_file_t f; + lv_fs_res_t res = lv_fs_open(&f, filename, LV_FS_MODE_WR); + if(res != LV_FS_RES_OK) return 79; + + uint32_t bw; + res = lv_fs_write(&f, buffer, buffersize, &bw); + lv_fs_close(&f); + return 0; +} + +#endif /*LODEPNG_COMPILE_DISK*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // End of common code and tools. Begin of Zlib related code. // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_ENCODER + +typedef struct { + ucvector* data; + unsigned char bp; /*ok to overflow, indicates bit pos inside byte*/ +} LodePNGBitWriter; + +static void LodePNGBitWriter_init(LodePNGBitWriter* writer, ucvector* data) { + writer->data = data; + writer->bp = 0; +} + +/*TODO: this ignores potential out of memory errors*/ +#define WRITEBIT(writer, bit){\ + /* append new byte */\ + if(((writer->bp) & 7u) == 0) {\ + if(!ucvector_resize(writer->data, writer->data->size + 1)) return;\ + writer->data->data[writer->data->size - 1] = 0;\ + }\ + (writer->data->data[writer->data->size - 1]) |= (bit << ((writer->bp) & 7u));\ + ++writer->bp;\ +} + +/* LSB of value is written first, and LSB of bytes is used first */ +static void writeBits(LodePNGBitWriter* writer, unsigned value, size_t nbits) { + if(nbits == 1) { /* compiler should statically compile this case if nbits == 1 */ + WRITEBIT(writer, value); + } else { + /* TODO: increase output size only once here rather than in each WRITEBIT */ + size_t i; + for(i = 0; i != nbits; ++i) { + WRITEBIT(writer, (unsigned char)((value >> i) & 1)); + } + } +} + +/* This one is to use for adding huffman symbol, the value bits are written MSB first */ +static void writeBitsReversed(LodePNGBitWriter* writer, unsigned value, size_t nbits) { + size_t i; + for(i = 0; i != nbits; ++i) { + /* TODO: increase output size only once here rather than in each WRITEBIT */ + WRITEBIT(writer, (unsigned char)((value >> (nbits - 1u - i)) & 1u)); + } +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_DECODER + +typedef struct { + const unsigned char* data; + size_t size; /*size of data in bytes*/ + size_t bitsize; /*size of data in bits, end of valid bp values, should be 8*size*/ + size_t bp; + unsigned buffer; /*buffer for reading bits. NOTE: 'unsigned' must support at least 32 bits*/ +} LodePNGBitReader; + +/* data size argument is in bytes. Returns error if size too large causing overflow */ +static unsigned LodePNGBitReader_init(LodePNGBitReader* reader, const unsigned char* data, size_t size) { + size_t temp; + reader->data = data; + reader->size = size; + /* size in bits, return error if overflow (if size_t is 32 bit this supports up to 500MB) */ + if(lodepng_mulofl(size, 8u, &reader->bitsize)) return 105; + /*ensure incremented bp can be compared to bitsize without overflow even when it would be incremented 32 too much and + trying to ensure 32 more bits*/ + if(lodepng_addofl(reader->bitsize, 64u, &temp)) return 105; + reader->bp = 0; + reader->buffer = 0; + return 0; /*ok*/ +} + +/* +ensureBits functions: +Ensures the reader can at least read nbits bits in one or more readBits calls, +safely even if not enough bits are available. +Returns 1 if there are enough bits available, 0 if not. +*/ + +/*See ensureBits documentation above. This one ensures exactly 1 bit */ +/*static unsigned ensureBits1(LodePNGBitReader* reader) { + if(reader->bp >= reader->bitsize) return 0; + reader->buffer = (unsigned)reader->data[reader->bp >> 3u] >> (reader->bp & 7u); + return 1; +}*/ + +/*See ensureBits documentation above. This one ensures up to 9 bits */ +static unsigned ensureBits9(LodePNGBitReader* reader, size_t nbits) { + size_t start = reader->bp >> 3u; + size_t size = reader->size; + if(start + 1u < size) { + reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u); + reader->buffer >>= (reader->bp & 7u); + return 1; + } else { + reader->buffer = 0; + if(start + 0u < size) reader->buffer |= reader->data[start + 0]; + reader->buffer >>= (reader->bp & 7u); + return reader->bp + nbits <= reader->bitsize; + } +} + +/*See ensureBits documentation above. This one ensures up to 17 bits */ +static unsigned ensureBits17(LodePNGBitReader* reader, size_t nbits) { + size_t start = reader->bp >> 3u; + size_t size = reader->size; + if(start + 2u < size) { + reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) | + ((unsigned)reader->data[start + 2] << 16u); + reader->buffer >>= (reader->bp & 7u); + return 1; + } else { + reader->buffer = 0; + if(start + 0u < size) reader->buffer |= reader->data[start + 0]; + if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u); + reader->buffer >>= (reader->bp & 7u); + return reader->bp + nbits <= reader->bitsize; + } +} + +/*See ensureBits documentation above. This one ensures up to 25 bits */ +static LODEPNG_INLINE unsigned ensureBits25(LodePNGBitReader* reader, size_t nbits) { + size_t start = reader->bp >> 3u; + size_t size = reader->size; + if(start + 3u < size) { + reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) | + ((unsigned)reader->data[start + 2] << 16u) | ((unsigned)reader->data[start + 3] << 24u); + reader->buffer >>= (reader->bp & 7u); + return 1; + } else { + reader->buffer = 0; + if(start + 0u < size) reader->buffer |= reader->data[start + 0]; + if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u); + if(start + 2u < size) reader->buffer |= ((unsigned)reader->data[start + 2] << 16u); + reader->buffer >>= (reader->bp & 7u); + return reader->bp + nbits <= reader->bitsize; + } +} + +/*See ensureBits documentation above. This one ensures up to 32 bits */ +static LODEPNG_INLINE unsigned ensureBits32(LodePNGBitReader* reader, size_t nbits) { + size_t start = reader->bp >> 3u; + size_t size = reader->size; + if(start + 4u < size) { + reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) | + ((unsigned)reader->data[start + 2] << 16u) | ((unsigned)reader->data[start + 3] << 24u); + reader->buffer >>= (reader->bp & 7u); + reader->buffer |= (((unsigned)reader->data[start + 4] << 24u) << (8u - (reader->bp & 7u))); + return 1; + } else { + reader->buffer = 0; + if(start + 0u < size) reader->buffer |= reader->data[start + 0]; + if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u); + if(start + 2u < size) reader->buffer |= ((unsigned)reader->data[start + 2] << 16u); + if(start + 3u < size) reader->buffer |= ((unsigned)reader->data[start + 3] << 24u); + reader->buffer >>= (reader->bp & 7u); + return reader->bp + nbits <= reader->bitsize; + } +} + +/* Get bits without advancing the bit pointer. Must have enough bits available with ensureBits. Max nbits is 31. */ +static unsigned peekBits(LodePNGBitReader* reader, size_t nbits) { + /* The shift allows nbits to be only up to 31. */ + return reader->buffer & ((1u << nbits) - 1u); +} + +/* Must have enough bits available with ensureBits */ +static void advanceBits(LodePNGBitReader* reader, size_t nbits) { + reader->buffer >>= nbits; + reader->bp += nbits; +} + +/* Must have enough bits available with ensureBits */ +static unsigned readBits(LodePNGBitReader* reader, size_t nbits) { + unsigned result = peekBits(reader, nbits); + advanceBits(reader, nbits); + return result; +} + +#if 0 /*Disable because tests fail due to unused declaration*/ +/* Public for testing only. steps and result must have numsteps values. */ +static unsigned lode_png_test_bitreader(const unsigned char* data, size_t size, + size_t numsteps, const size_t* steps, unsigned* result) { + size_t i; + LodePNGBitReader reader; + unsigned error = LodePNGBitReader_init(&reader, data, size); + if(error) return 0; + for(i = 0; i < numsteps; i++) { + size_t step = steps[i]; + unsigned ok; + if(step > 25) ok = ensureBits32(&reader, step); + else if(step > 17) ok = ensureBits25(&reader, step); + else if(step > 9) ok = ensureBits17(&reader, step); + else ok = ensureBits9(&reader, step); + if(!ok) return 0; + result[i] = readBits(&reader, step); + } + return 1; +} +#endif + +#endif /*LODEPNG_COMPILE_DECODER*/ + +static unsigned reverseBits(unsigned bits, unsigned num) { + /*TODO: implement faster lookup table based version when needed*/ + unsigned i, result = 0; + for(i = 0; i < num; i++) result |= ((bits >> (num - i - 1u)) & 1u) << i; + return result; +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Deflate - Huffman / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#define FIRST_LENGTH_CODE_INDEX 257 +#define LAST_LENGTH_CODE_INDEX 285 +/*256 literals, the end code, some length codes, and 2 unused codes*/ +#define NUM_DEFLATE_CODE_SYMBOLS 288 +/*the distance codes have their own symbols, 30 used, 2 unused*/ +#define NUM_DISTANCE_SYMBOLS 32 +/*the code length codes. 0-15: code lengths, 16: copy previous 3-6 times, 17: 3-10 zeros, 18: 11-138 zeros*/ +#define NUM_CODE_LENGTH_CODES 19 + +/*the base lengths represented by codes 257-285*/ +static const unsigned LENGTHBASE[29] + = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, + 67, 83, 99, 115, 131, 163, 195, 227, 258}; + +/*the extra bits used by codes 257-285 (added to base length)*/ +static const unsigned LENGTHEXTRA[29] + = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, + 4, 4, 4, 4, 5, 5, 5, 5, 0}; + +/*the base backwards distances (the bits of distance codes appear after length codes and use their own huffman tree)*/ +static const unsigned DISTANCEBASE[30] + = {1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, + 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577}; + +/*the extra bits of backwards distances (added to base)*/ +static const unsigned DISTANCEEXTRA[30] + = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, + 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; + +/*the order in which "code length alphabet code lengths" are stored as specified by deflate, out of this the huffman +tree of the dynamic huffman tree lengths is generated*/ +static const unsigned CLCL_ORDER[NUM_CODE_LENGTH_CODES] + = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + +/* ////////////////////////////////////////////////////////////////////////// */ + +/* +Huffman tree struct, containing multiple representations of the tree +*/ +typedef struct HuffmanTree { + unsigned* codes; /*the huffman codes (bit patterns representing the symbols)*/ + unsigned* lengths; /*the lengths of the huffman codes*/ + unsigned maxbitlen; /*maximum number of bits a single code can get*/ + unsigned numcodes; /*number of symbols in the alphabet = number of codes*/ + /* for reading only */ + unsigned char* table_len; /*length of symbol from lookup table, or max length if secondary lookup needed*/ + unsigned short* table_value; /*value of symbol from lookup table, or pointer to secondary table if needed*/ +} HuffmanTree; + +static void HuffmanTree_init(HuffmanTree* tree) { + tree->codes = 0; + tree->lengths = 0; + tree->table_len = 0; + tree->table_value = 0; +} + +static void HuffmanTree_cleanup(HuffmanTree* tree) { + lodepng_free(tree->codes); + lodepng_free(tree->lengths); + lodepng_free(tree->table_len); + lodepng_free(tree->table_value); +} + +/* amount of bits for first huffman table lookup (aka root bits), see HuffmanTree_makeTable and huffmanDecodeSymbol.*/ +/* values 8u and 9u work the fastest */ +#define FIRSTBITS 9u + +/* a symbol value too big to represent any valid symbol, to indicate reading disallowed huffman bits combination, +which is possible in case of only 0 or 1 present symbols. */ +#define INVALIDSYMBOL 65535u + +/* make table for huffman decoding */ +static unsigned HuffmanTree_makeTable(HuffmanTree* tree) { + static const unsigned headsize = 1u << FIRSTBITS; /*size of the first table*/ + static const unsigned mask = (1u << FIRSTBITS) /*headsize*/ - 1u; + size_t i, numpresent, pointer, size; /*total table size*/ + unsigned* maxlens = (unsigned*)lodepng_malloc(headsize * sizeof(unsigned)); + if(!maxlens) return 83; /*alloc fail*/ + + /* compute maxlens: max total bit length of symbols sharing prefix in the first table*/ + lodepng_memset(maxlens, 0, headsize * sizeof(*maxlens)); + for(i = 0; i < tree->numcodes; i++) { + unsigned symbol = tree->codes[i]; + unsigned l = tree->lengths[i]; + unsigned index; + if(l <= FIRSTBITS) continue; /*symbols that fit in first table don't increase secondary table size*/ + /*get the FIRSTBITS MSBs, the MSBs of the symbol are encoded first. See later comment about the reversing*/ + index = reverseBits(symbol >> (l - FIRSTBITS), FIRSTBITS); + maxlens[index] = LODEPNG_MAX(maxlens[index], l); + } + /* compute total table size: size of first table plus all secondary tables for symbols longer than FIRSTBITS */ + size = headsize; + for(i = 0; i < headsize; ++i) { + unsigned l = maxlens[i]; + if(l > FIRSTBITS) size += (1u << (l - FIRSTBITS)); + } + tree->table_len = (unsigned char*)lodepng_malloc(size * sizeof(*tree->table_len)); + tree->table_value = (unsigned short*)lodepng_malloc(size * sizeof(*tree->table_value)); + if(!tree->table_len || !tree->table_value) { + lodepng_free(maxlens); + /* freeing tree->table values is done at a higher scope */ + return 83; /*alloc fail*/ + } + /*initialize with an invalid length to indicate unused entries*/ + for(i = 0; i < size; ++i) tree->table_len[i] = 16; + + /*fill in the first table for long symbols: max prefix size and pointer to secondary tables*/ + pointer = headsize; + for(i = 0; i < headsize; ++i) { + unsigned l = maxlens[i]; + if(l <= FIRSTBITS) continue; + tree->table_len[i] = l; + tree->table_value[i] = pointer; + pointer += (1u << (l - FIRSTBITS)); + } + lodepng_free(maxlens); + + /*fill in the first table for short symbols, or secondary table for long symbols*/ + numpresent = 0; + for(i = 0; i < tree->numcodes; ++i) { + unsigned l = tree->lengths[i]; + unsigned symbol = tree->codes[i]; /*the huffman bit pattern. i itself is the value.*/ + /*reverse bits, because the huffman bits are given in MSB first order but the bit reader reads LSB first*/ + unsigned reverse = reverseBits(symbol, l); + if(l == 0) continue; + numpresent++; + + if(l <= FIRSTBITS) { + /*short symbol, fully in first table, replicated num times if l < FIRSTBITS*/ + unsigned num = 1u << (FIRSTBITS - l); + unsigned j; + for(j = 0; j < num; ++j) { + /*bit reader will read the l bits of symbol first, the remaining FIRSTBITS - l bits go to the MSB's*/ + unsigned index = reverse | (j << l); + if(tree->table_len[index] != 16) return 55; /*invalid tree: long symbol shares prefix with short symbol*/ + tree->table_len[index] = l; + tree->table_value[index] = i; + } + } else { + /*long symbol, shares prefix with other long symbols in first lookup table, needs second lookup*/ + /*the FIRSTBITS MSBs of the symbol are the first table index*/ + unsigned index = reverse & mask; + unsigned maxlen = tree->table_len[index]; + /*log2 of secondary table length, should be >= l - FIRSTBITS*/ + unsigned tablelen = maxlen - FIRSTBITS; + unsigned start = tree->table_value[index]; /*starting index in secondary table*/ + unsigned num = 1u << (tablelen - (l - FIRSTBITS)); /*amount of entries of this symbol in secondary table*/ + unsigned j; + if(maxlen < l) return 55; /*invalid tree: long symbol shares prefix with short symbol*/ + for(j = 0; j < num; ++j) { + unsigned reverse2 = reverse >> FIRSTBITS; /* l - FIRSTBITS bits */ + unsigned index2 = start + (reverse2 | (j << (l - FIRSTBITS))); + tree->table_len[index2] = l; + tree->table_value[index2] = i; + } + } + } + + if(numpresent < 2) { + /* In case of exactly 1 symbol, in theory the huffman symbol needs 0 bits, + but deflate uses 1 bit instead. In case of 0 symbols, no symbols can + appear at all, but such huffman tree could still exist (e.g. if distance + codes are never used). In both cases, not all symbols of the table will be + filled in. Fill them in with an invalid symbol value so returning them from + huffmanDecodeSymbol will cause error. */ + for(i = 0; i < size; ++i) { + if(tree->table_len[i] == 16) { + /* As length, use a value smaller than FIRSTBITS for the head table, + and a value larger than FIRSTBITS for the secondary table, to ensure + valid behavior for advanceBits when reading this symbol. */ + tree->table_len[i] = (i < headsize) ? 1 : (FIRSTBITS + 1); + tree->table_value[i] = INVALIDSYMBOL; + } + } + } else { + /* A good huffman tree has N * 2 - 1 nodes, of which N - 1 are internal nodes. + If that is not the case (due to too long length codes), the table will not + have been fully used, and this is an error (not all bit combinations can be + decoded): an oversubscribed huffman tree, indicated by error 55. */ + for(i = 0; i < size; ++i) { + if(tree->table_len[i] == 16) return 55; + } + } + + return 0; +} + +/* +Second step for the ...makeFromLengths and ...makeFromFrequencies functions. +numcodes, lengths and maxbitlen must already be filled in correctly. return +value is error. +*/ +static unsigned HuffmanTree_makeFromLengths2(HuffmanTree* tree) { + unsigned* blcount; + unsigned* nextcode; + unsigned error = 0; + unsigned bits, n; + + tree->codes = (unsigned*)lodepng_malloc(tree->numcodes * sizeof(unsigned)); + blcount = (unsigned*)lodepng_malloc((tree->maxbitlen + 1) * sizeof(unsigned)); + nextcode = (unsigned*)lodepng_malloc((tree->maxbitlen + 1) * sizeof(unsigned)); + if(!tree->codes || !blcount || !nextcode) error = 83; /*alloc fail*/ + + if(!error) { + for(n = 0; n != tree->maxbitlen + 1; n++) blcount[n] = nextcode[n] = 0; + /*step 1: count number of instances of each code length*/ + for(bits = 0; bits != tree->numcodes; ++bits) ++blcount[tree->lengths[bits]]; + /*step 2: generate the nextcode values*/ + for(bits = 1; bits <= tree->maxbitlen; ++bits) { + nextcode[bits] = (nextcode[bits - 1] + blcount[bits - 1]) << 1u; + } + /*step 3: generate all the codes*/ + for(n = 0; n != tree->numcodes; ++n) { + if(tree->lengths[n] != 0) { + tree->codes[n] = nextcode[tree->lengths[n]]++; + /*remove superfluous bits from the code*/ + tree->codes[n] &= ((1u << tree->lengths[n]) - 1u); + } + } + } + + lodepng_free(blcount); + lodepng_free(nextcode); + + if(!error) error = HuffmanTree_makeTable(tree); + return error; +} + +/* +given the code lengths (as stored in the PNG file), generate the tree as defined +by Deflate. maxbitlen is the maximum bits that a code in the tree can have. +return value is error. +*/ +static unsigned HuffmanTree_makeFromLengths(HuffmanTree* tree, const unsigned* bitlen, + size_t numcodes, unsigned maxbitlen) { + unsigned i; + tree->lengths = (unsigned*)lodepng_malloc(numcodes * sizeof(unsigned)); + if(!tree->lengths) return 83; /*alloc fail*/ + for(i = 0; i != numcodes; ++i) tree->lengths[i] = bitlen[i]; + tree->numcodes = (unsigned)numcodes; /*number of symbols*/ + tree->maxbitlen = maxbitlen; + return HuffmanTree_makeFromLengths2(tree); +} + +#ifdef LODEPNG_COMPILE_ENCODER + +/*BPM: Boundary Package Merge, see "A Fast and Space-Economical Algorithm for Length-Limited Coding", +Jyrki Katajainen, Alistair Moffat, Andrew Turpin, 1995.*/ + +/*chain node for boundary package merge*/ +typedef struct BPMNode { + int weight; /*the sum of all weights in this chain*/ + unsigned index; /*index of this leaf node (called "count" in the paper)*/ + struct BPMNode* tail; /*the next nodes in this chain (null if last)*/ + int in_use; +} BPMNode; + +/*lists of chains*/ +typedef struct BPMLists { + /*memory pool*/ + unsigned memsize; + BPMNode* memory; + unsigned numfree; + unsigned nextfree; + BPMNode** freelist; + /*two heads of lookahead chains per list*/ + unsigned listsize; + BPMNode** chains0; + BPMNode** chains1; +} BPMLists; + +/*creates a new chain node with the given parameters, from the memory in the lists */ +static BPMNode* bpmnode_create(BPMLists* lists, int weight, unsigned index, BPMNode* tail) { + unsigned i; + BPMNode* result; + + /*memory full, so garbage collect*/ + if(lists->nextfree >= lists->numfree) { + /*mark only those that are in use*/ + for(i = 0; i != lists->memsize; ++i) lists->memory[i].in_use = 0; + for(i = 0; i != lists->listsize; ++i) { + BPMNode* node; + for(node = lists->chains0[i]; node != 0; node = node->tail) node->in_use = 1; + for(node = lists->chains1[i]; node != 0; node = node->tail) node->in_use = 1; + } + /*collect those that are free*/ + lists->numfree = 0; + for(i = 0; i != lists->memsize; ++i) { + if(!lists->memory[i].in_use) lists->freelist[lists->numfree++] = &lists->memory[i]; + } + lists->nextfree = 0; + } + + result = lists->freelist[lists->nextfree++]; + result->weight = weight; + result->index = index; + result->tail = tail; + return result; +} + +/*sort the leaves with stable mergesort*/ +static void bpmnode_sort(BPMNode* leaves, size_t num) { + BPMNode* mem = (BPMNode*)lodepng_malloc(sizeof(*leaves) * num); + size_t width, counter = 0; + for(width = 1; width < num; width *= 2) { + BPMNode* a = (counter & 1) ? mem : leaves; + BPMNode* b = (counter & 1) ? leaves : mem; + size_t p; + for(p = 0; p < num; p += 2 * width) { + size_t q = (p + width > num) ? num : (p + width); + size_t r = (p + 2 * width > num) ? num : (p + 2 * width); + size_t i = p, j = q, k; + for(k = p; k < r; k++) { + if(i < q && (j >= r || a[i].weight <= a[j].weight)) b[k] = a[i++]; + else b[k] = a[j++]; + } + } + counter++; + } + if(counter & 1) lodepng_memcpy(leaves, mem, sizeof(*leaves) * num); + lodepng_free(mem); +} + +/*Boundary Package Merge step, numpresent is the amount of leaves, and c is the current chain.*/ +static void boundaryPM(BPMLists* lists, BPMNode* leaves, size_t numpresent, int c, int num) { + unsigned lastindex = lists->chains1[c]->index; + + if(c == 0) { + if(lastindex >= numpresent) return; + lists->chains0[c] = lists->chains1[c]; + lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, 0); + } else { + /*sum of the weights of the head nodes of the previous lookahead chains.*/ + int sum = lists->chains0[c - 1]->weight + lists->chains1[c - 1]->weight; + lists->chains0[c] = lists->chains1[c]; + if(lastindex < numpresent && sum > leaves[lastindex].weight) { + lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, lists->chains1[c]->tail); + return; + } + lists->chains1[c] = bpmnode_create(lists, sum, lastindex, lists->chains1[c - 1]); + /*in the end we are only interested in the chain of the last list, so no + need to recurse if we're at the last one (this gives measurable speedup)*/ + if(num + 1 < (int)(2 * numpresent - 2)) { + boundaryPM(lists, leaves, numpresent, c - 1, num); + boundaryPM(lists, leaves, numpresent, c - 1, num); + } + } +} + +unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies, + size_t numcodes, unsigned maxbitlen) { + unsigned error = 0; + unsigned i; + size_t numpresent = 0; /*number of symbols with non-zero frequency*/ + BPMNode* leaves; /*the symbols, only those with > 0 frequency*/ + + if(numcodes == 0) return 80; /*error: a tree of 0 symbols is not supposed to be made*/ + if((1u << maxbitlen) < (unsigned)numcodes) return 80; /*error: represent all symbols*/ + + leaves = (BPMNode*)lodepng_malloc(numcodes * sizeof(*leaves)); + if(!leaves) return 83; /*alloc fail*/ + + for(i = 0; i != numcodes; ++i) { + if(frequencies[i] > 0) { + leaves[numpresent].weight = (int)frequencies[i]; + leaves[numpresent].index = i; + ++numpresent; + } + } + + lodepng_memset(lengths, 0, numcodes * sizeof(*lengths)); + + /*ensure at least two present symbols. There should be at least one symbol + according to RFC 1951 section 3.2.7. Some decoders incorrectly require two. To + make these work as well ensure there are at least two symbols. The + Package-Merge code below also doesn't work correctly if there's only one + symbol, it'd give it the theoretical 0 bits but in practice zlib wants 1 bit*/ + if(numpresent == 0) { + lengths[0] = lengths[1] = 1; /*note that for RFC 1951 section 3.2.7, only lengths[0] = 1 is needed*/ + } else if(numpresent == 1) { + lengths[leaves[0].index] = 1; + lengths[leaves[0].index == 0 ? 1 : 0] = 1; + } else { + BPMLists lists; + BPMNode* node; + + bpmnode_sort(leaves, numpresent); + + lists.listsize = maxbitlen; + lists.memsize = 2 * maxbitlen * (maxbitlen + 1); + lists.nextfree = 0; + lists.numfree = lists.memsize; + lists.memory = (BPMNode*)lodepng_malloc(lists.memsize * sizeof(*lists.memory)); + lists.freelist = (BPMNode**)lodepng_malloc(lists.memsize * sizeof(BPMNode*)); + lists.chains0 = (BPMNode**)lodepng_malloc(lists.listsize * sizeof(BPMNode*)); + lists.chains1 = (BPMNode**)lodepng_malloc(lists.listsize * sizeof(BPMNode*)); + if(!lists.memory || !lists.freelist || !lists.chains0 || !lists.chains1) error = 83; /*alloc fail*/ + + if(!error) { + for(i = 0; i != lists.memsize; ++i) lists.freelist[i] = &lists.memory[i]; + + bpmnode_create(&lists, leaves[0].weight, 1, 0); + bpmnode_create(&lists, leaves[1].weight, 2, 0); + + for(i = 0; i != lists.listsize; ++i) { + lists.chains0[i] = &lists.memory[0]; + lists.chains1[i] = &lists.memory[1]; + } + + /*each boundaryPM call adds one chain to the last list, and we need 2 * numpresent - 2 chains.*/ + for(i = 2; i != 2 * numpresent - 2; ++i) boundaryPM(&lists, leaves, numpresent, (int)maxbitlen - 1, (int)i); + + for(node = lists.chains1[maxbitlen - 1]; node; node = node->tail) { + for(i = 0; i != node->index; ++i) ++lengths[leaves[i].index]; + } + } + + lodepng_free(lists.memory); + lodepng_free(lists.freelist); + lodepng_free(lists.chains0); + lodepng_free(lists.chains1); + } + + lodepng_free(leaves); + return error; +} + +/*Create the Huffman tree given the symbol frequencies*/ +static unsigned HuffmanTree_makeFromFrequencies(HuffmanTree* tree, const unsigned* frequencies, + size_t mincodes, size_t numcodes, unsigned maxbitlen) { + unsigned error = 0; + while(!frequencies[numcodes - 1] && numcodes > mincodes) --numcodes; /*trim zeroes*/ + tree->lengths = (unsigned*)lodepng_malloc(numcodes * sizeof(unsigned)); + if(!tree->lengths) return 83; /*alloc fail*/ + tree->maxbitlen = maxbitlen; + tree->numcodes = (unsigned)numcodes; /*number of symbols*/ + + error = lodepng_huffman_code_lengths(tree->lengths, frequencies, numcodes, maxbitlen); + if(!error) error = HuffmanTree_makeFromLengths2(tree); + return error; +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/*get the literal and length code tree of a deflated block with fixed tree, as per the deflate specification*/ +static unsigned generateFixedLitLenTree(HuffmanTree* tree) { + unsigned i, error = 0; + unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); + if(!bitlen) return 83; /*alloc fail*/ + + /*288 possible codes: 0-255=literals, 256=endcode, 257-285=lengthcodes, 286-287=unused*/ + for(i = 0; i <= 143; ++i) bitlen[i] = 8; + for(i = 144; i <= 255; ++i) bitlen[i] = 9; + for(i = 256; i <= 279; ++i) bitlen[i] = 7; + for(i = 280; i <= 287; ++i) bitlen[i] = 8; + + error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DEFLATE_CODE_SYMBOLS, 15); + + lodepng_free(bitlen); + return error; +} + +/*get the distance code tree of a deflated block with fixed tree, as specified in the deflate specification*/ +static unsigned generateFixedDistanceTree(HuffmanTree* tree) { + unsigned i, error = 0; + unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); + if(!bitlen) return 83; /*alloc fail*/ + + /*there are 32 distance codes, but 30-31 are unused*/ + for(i = 0; i != NUM_DISTANCE_SYMBOLS; ++i) bitlen[i] = 5; + error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DISTANCE_SYMBOLS, 15); + + lodepng_free(bitlen); + return error; +} + +#ifdef LODEPNG_COMPILE_DECODER + +/* +returns the code. The bit reader must already have been ensured at least 15 bits +*/ +static unsigned huffmanDecodeSymbol(LodePNGBitReader* reader, const HuffmanTree* codetree) { + unsigned short code = peekBits(reader, FIRSTBITS); + unsigned short l = codetree->table_len[code]; + unsigned short value = codetree->table_value[code]; + if(l <= FIRSTBITS) { + advanceBits(reader, l); + return value; + } else { + unsigned index2; + advanceBits(reader, FIRSTBITS); + index2 = value + peekBits(reader, l - FIRSTBITS); + advanceBits(reader, codetree->table_len[index2] - FIRSTBITS); + return codetree->table_value[index2]; + } +} +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_DECODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Inflator (Decompressor) / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*get the tree of a deflated block with fixed tree, as specified in the deflate specification +Returns error code.*/ +static unsigned getTreeInflateFixed(HuffmanTree* tree_ll, HuffmanTree* tree_d) { + unsigned error = generateFixedLitLenTree(tree_ll); + if(error) return error; + return generateFixedDistanceTree(tree_d); +} + +/*get the tree of a deflated block with dynamic tree, the tree itself is also Huffman compressed with a known tree*/ +static unsigned getTreeInflateDynamic(HuffmanTree* tree_ll, HuffmanTree* tree_d, + LodePNGBitReader* reader) { + /*make sure that length values that aren't filled in will be 0, or a wrong tree will be generated*/ + unsigned error = 0; + unsigned n, HLIT, HDIST, HCLEN, i; + + /*see comments in deflateDynamic for explanation of the context and these variables, it is analogous*/ + unsigned* bitlen_ll = 0; /*lit,len code lengths*/ + unsigned* bitlen_d = 0; /*dist code lengths*/ + /*code length code lengths ("clcl"), the bit lengths of the huffman tree used to compress bitlen_ll and bitlen_d*/ + unsigned* bitlen_cl = 0; + HuffmanTree tree_cl; /*the code tree for code length codes (the huffman tree for compressed huffman trees)*/ + + if(!ensureBits17(reader, 14)) return 49; /*error: the bit pointer is or will go past the memory*/ + + /*number of literal/length codes + 257. Unlike the spec, the value 257 is added to it here already*/ + HLIT = readBits(reader, 5) + 257; + /*number of distance codes. Unlike the spec, the value 1 is added to it here already*/ + HDIST = readBits(reader, 5) + 1; + /*number of code length codes. Unlike the spec, the value 4 is added to it here already*/ + HCLEN = readBits(reader, 4) + 4; + + bitlen_cl = (unsigned*)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(unsigned)); + if(!bitlen_cl) return 83 /*alloc fail*/; + + HuffmanTree_init(&tree_cl); + + while(!error) { + /*read the code length codes out of 3 * (amount of code length codes) bits*/ + if(lodepng_gtofl(reader->bp, HCLEN * 3, reader->bitsize)) { + ERROR_BREAK(50); /*error: the bit pointer is or will go past the memory*/ + } + for(i = 0; i != HCLEN; ++i) { + ensureBits9(reader, 3); /*out of bounds already checked above */ + bitlen_cl[CLCL_ORDER[i]] = readBits(reader, 3); + } + for(i = HCLEN; i != NUM_CODE_LENGTH_CODES; ++i) { + bitlen_cl[CLCL_ORDER[i]] = 0; + } + + error = HuffmanTree_makeFromLengths(&tree_cl, bitlen_cl, NUM_CODE_LENGTH_CODES, 7); + if(error) break; + + /*now we can use this tree to read the lengths for the tree that this function will return*/ + bitlen_ll = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); + bitlen_d = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); + if(!bitlen_ll || !bitlen_d) ERROR_BREAK(83 /*alloc fail*/); + lodepng_memset(bitlen_ll, 0, NUM_DEFLATE_CODE_SYMBOLS * sizeof(*bitlen_ll)); + lodepng_memset(bitlen_d, 0, NUM_DISTANCE_SYMBOLS * sizeof(*bitlen_d)); + + /*i is the current symbol we're reading in the part that contains the code lengths of lit/len and dist codes*/ + i = 0; + while(i < HLIT + HDIST) { + unsigned code; + ensureBits25(reader, 22); /* up to 15 bits for huffman code, up to 7 extra bits below*/ + code = huffmanDecodeSymbol(reader, &tree_cl); + if(code <= 15) /*a length code*/ { + if(i < HLIT) bitlen_ll[i] = code; + else bitlen_d[i - HLIT] = code; + ++i; + } else if(code == 16) /*repeat previous*/ { + unsigned replength = 3; /*read in the 2 bits that indicate repeat length (3-6)*/ + unsigned value; /*set value to the previous code*/ + + if(i == 0) ERROR_BREAK(54); /*can't repeat previous if i is 0*/ + + replength += readBits(reader, 2); + + if(i < HLIT + 1) value = bitlen_ll[i - 1]; + else value = bitlen_d[i - HLIT - 1]; + /*repeat this value in the next lengths*/ + for(n = 0; n < replength; ++n) { + if(i >= HLIT + HDIST) ERROR_BREAK(13); /*error: i is larger than the amount of codes*/ + if(i < HLIT) bitlen_ll[i] = value; + else bitlen_d[i - HLIT] = value; + ++i; + } + } else if(code == 17) /*repeat "0" 3-10 times*/ { + unsigned replength = 3; /*read in the bits that indicate repeat length*/ + replength += readBits(reader, 3); + + /*repeat this value in the next lengths*/ + for(n = 0; n < replength; ++n) { + if(i >= HLIT + HDIST) ERROR_BREAK(14); /*error: i is larger than the amount of codes*/ + + if(i < HLIT) bitlen_ll[i] = 0; + else bitlen_d[i - HLIT] = 0; + ++i; + } + } else if(code == 18) /*repeat "0" 11-138 times*/ { + unsigned replength = 11; /*read in the bits that indicate repeat length*/ + replength += readBits(reader, 7); + + /*repeat this value in the next lengths*/ + for(n = 0; n < replength; ++n) { + if(i >= HLIT + HDIST) ERROR_BREAK(15); /*error: i is larger than the amount of codes*/ + + if(i < HLIT) bitlen_ll[i] = 0; + else bitlen_d[i - HLIT] = 0; + ++i; + } + } else /*if(code == INVALIDSYMBOL)*/ { + ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/ + } + /*check if any of the ensureBits above went out of bounds*/ + if(reader->bp > reader->bitsize) { + /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol + (10=no endcode, 11=wrong jump outside of tree)*/ + /* TODO: revise error codes 10,11,50: the above comment is no longer valid */ + ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ + } + } + if(error) break; + + if(bitlen_ll[256] == 0) ERROR_BREAK(64); /*the length of the end code 256 must be larger than 0*/ + + /*now we've finally got HLIT and HDIST, so generate the code trees, and the function is done*/ + error = HuffmanTree_makeFromLengths(tree_ll, bitlen_ll, NUM_DEFLATE_CODE_SYMBOLS, 15); + if(error) break; + error = HuffmanTree_makeFromLengths(tree_d, bitlen_d, NUM_DISTANCE_SYMBOLS, 15); + + break; /*end of error-while*/ + } + + lodepng_free(bitlen_cl); + lodepng_free(bitlen_ll); + lodepng_free(bitlen_d); + HuffmanTree_cleanup(&tree_cl); + + return error; +} + +/*inflate a block with dynamic of fixed Huffman tree. btype must be 1 or 2.*/ +static unsigned inflateHuffmanBlock(ucvector* out, LodePNGBitReader* reader, + unsigned btype, size_t max_output_size) { + unsigned error = 0; + HuffmanTree tree_ll; /*the huffman tree for literal and length codes*/ + HuffmanTree tree_d; /*the huffman tree for distance codes*/ + + HuffmanTree_init(&tree_ll); + HuffmanTree_init(&tree_d); + + if(btype == 1) error = getTreeInflateFixed(&tree_ll, &tree_d); + else /*if(btype == 2)*/ error = getTreeInflateDynamic(&tree_ll, &tree_d, reader); + + while(!error) /*decode all symbols until end reached, breaks at end code*/ { + /*code_ll is literal, length or end code*/ + unsigned code_ll; + ensureBits25(reader, 20); /* up to 15 for the huffman symbol, up to 5 for the length extra bits */ + code_ll = huffmanDecodeSymbol(reader, &tree_ll); + if(code_ll <= 255) /*literal symbol*/ { + if(!ucvector_resize(out, out->size + 1)) ERROR_BREAK(83 /*alloc fail*/); + out->data[out->size - 1] = (unsigned char)code_ll; + } else if(code_ll >= FIRST_LENGTH_CODE_INDEX && code_ll <= LAST_LENGTH_CODE_INDEX) /*length code*/ { + unsigned code_d, distance; + unsigned numextrabits_l, numextrabits_d; /*extra bits for length and distance*/ + size_t start, backward, length; + + /*part 1: get length base*/ + length = LENGTHBASE[code_ll - FIRST_LENGTH_CODE_INDEX]; + + /*part 2: get extra bits and add the value of that to length*/ + numextrabits_l = LENGTHEXTRA[code_ll - FIRST_LENGTH_CODE_INDEX]; + if(numextrabits_l != 0) { + /* bits already ensured above */ + length += readBits(reader, numextrabits_l); + } + + /*part 3: get distance code*/ + ensureBits32(reader, 28); /* up to 15 for the huffman symbol, up to 13 for the extra bits */ + code_d = huffmanDecodeSymbol(reader, &tree_d); + if(code_d > 29) { + if(code_d <= 31) { + ERROR_BREAK(18); /*error: invalid distance code (30-31 are never used)*/ + } else /* if(code_d == INVALIDSYMBOL) */{ + ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/ + } + } + distance = DISTANCEBASE[code_d]; + + /*part 4: get extra bits from distance*/ + numextrabits_d = DISTANCEEXTRA[code_d]; + if(numextrabits_d != 0) { + /* bits already ensured above */ + distance += readBits(reader, numextrabits_d); + } + + /*part 5: fill in all the out[n] values based on the length and dist*/ + start = out->size; + if(distance > start) ERROR_BREAK(52); /*too long backward distance*/ + backward = start - distance; + + if(!ucvector_resize(out, out->size + length)) ERROR_BREAK(83 /*alloc fail*/); + if(distance < length) { + size_t forward; + lodepng_memcpy(out->data + start, out->data + backward, distance); + start += distance; + for(forward = distance; forward < length; ++forward) { + out->data[start++] = out->data[backward++]; + } + } else { + lodepng_memcpy(out->data + start, out->data + backward, length); + } + } else if(code_ll == 256) { + break; /*end code, break the loop*/ + } else /*if(code_ll == INVALIDSYMBOL)*/ { + ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/ + } + /*check if any of the ensureBits above went out of bounds*/ + if(reader->bp > reader->bitsize) { + /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol + (10=no endcode, 11=wrong jump outside of tree)*/ + /* TODO: revise error codes 10,11,50: the above comment is no longer valid */ + ERROR_BREAK(51); /*error, bit pointer jumps past memory*/ + } + if(max_output_size && out->size > max_output_size) { + ERROR_BREAK(109); /*error, larger than max size*/ + } + } + + HuffmanTree_cleanup(&tree_ll); + HuffmanTree_cleanup(&tree_d); + + return error; +} + +static unsigned inflateNoCompression(ucvector* out, LodePNGBitReader* reader, + const LodePNGDecompressSettings* settings) { + size_t bytepos; + size_t size = reader->size; + unsigned LEN, NLEN, error = 0; + + /*go to first boundary of byte*/ + bytepos = (reader->bp + 7u) >> 3u; + + /*read LEN (2 bytes) and NLEN (2 bytes)*/ + if(bytepos + 4 >= size) return 52; /*error, bit pointer will jump past memory*/ + LEN = (unsigned)reader->data[bytepos] + ((unsigned)reader->data[bytepos + 1] << 8u); bytepos += 2; + NLEN = (unsigned)reader->data[bytepos] + ((unsigned)reader->data[bytepos + 1] << 8u); bytepos += 2; + + /*check if 16-bit NLEN is really the one's complement of LEN*/ + if(!settings->ignore_nlen && LEN + NLEN != 65535) { + return 21; /*error: NLEN is not one's complement of LEN*/ + } + + if(!ucvector_resize(out, out->size + LEN)) return 83; /*alloc fail*/ + + /*read the literal data: LEN bytes are now stored in the out buffer*/ + if(bytepos + LEN > size) return 23; /*error: reading outside of in buffer*/ + + lodepng_memcpy(out->data + out->size - LEN, reader->data + bytepos, LEN); + bytepos += LEN; + + reader->bp = bytepos << 3u; + + return error; +} + +static unsigned lodepng_inflatev(ucvector* out, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings) { + unsigned BFINAL = 0; + LodePNGBitReader reader; + unsigned error = LodePNGBitReader_init(&reader, in, insize); + + if(error) return error; + + while(!BFINAL) { + unsigned BTYPE; + if(!ensureBits9(&reader, 3)) return 52; /*error, bit pointer will jump past memory*/ + BFINAL = readBits(&reader, 1); + BTYPE = readBits(&reader, 2); + + if(BTYPE == 3) return 20; /*error: invalid BTYPE*/ + else if(BTYPE == 0) error = inflateNoCompression(out, &reader, settings); /*no compression*/ + else error = inflateHuffmanBlock(out, &reader, BTYPE, settings->max_output_size); /*compression, BTYPE 01 or 10*/ + if(!error && settings->max_output_size && out->size > settings->max_output_size) error = 109; + if(error) break; + } + + return error; +} + +unsigned lodepng_inflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings) { + ucvector v = ucvector_init(*out, *outsize); + unsigned error = lodepng_inflatev(&v, in, insize, settings); + *out = v.data; + *outsize = v.size; + return error; +} + +static unsigned inflatev(ucvector* out, const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings) { + if(settings->custom_inflate) { + unsigned error = settings->custom_inflate(&out->data, &out->size, in, insize, settings); + out->allocsize = out->size; + if(error) { + /*the custom inflate is allowed to have its own error codes, however, we translate it to code 110*/ + error = 110; + /*if there's a max output size, and the custom zlib returned error, then indicate that error instead*/ + if(settings->max_output_size && out->size > settings->max_output_size) error = 109; + } + return error; + } else { + return lodepng_inflatev(out, in, insize, settings); + } +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Deflator (Compressor) / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +static const size_t MAX_SUPPORTED_DEFLATE_LENGTH = 258; + +/*search the index in the array, that has the largest value smaller than or equal to the given value, +given array must be sorted (if no value is smaller, it returns the size of the given array)*/ +static size_t searchCodeIndex(const unsigned* array, size_t array_size, size_t value) { + /*binary search (only small gain over linear). TODO: use CPU log2 instruction for getting symbols instead*/ + size_t left = 1; + size_t right = array_size - 1; + + while(left <= right) { + size_t mid = (left + right) >> 1; + if(array[mid] >= value) right = mid - 1; + else left = mid + 1; + } + if(left >= array_size || array[left] > value) left--; + return left; +} + +static void addLengthDistance(uivector* values, size_t length, size_t distance) { + /*values in encoded vector are those used by deflate: + 0-255: literal bytes + 256: end + 257-285: length/distance pair (length code, followed by extra length bits, distance code, extra distance bits) + 286-287: invalid*/ + + unsigned length_code = (unsigned)searchCodeIndex(LENGTHBASE, 29, length); + unsigned extra_length = (unsigned)(length - LENGTHBASE[length_code]); + unsigned dist_code = (unsigned)searchCodeIndex(DISTANCEBASE, 30, distance); + unsigned extra_distance = (unsigned)(distance - DISTANCEBASE[dist_code]); + + size_t pos = values->size; + /*TODO: return error when this fails (out of memory)*/ + unsigned ok = uivector_resize(values, values->size + 4); + if(ok) { + values->data[pos + 0] = length_code + FIRST_LENGTH_CODE_INDEX; + values->data[pos + 1] = extra_length; + values->data[pos + 2] = dist_code; + values->data[pos + 3] = extra_distance; + } +} + +/*3 bytes of data get encoded into two bytes. The hash cannot use more than 3 +bytes as input because 3 is the minimum match length for deflate*/ +static const unsigned HASH_NUM_VALUES = 65536; +static const unsigned HASH_BIT_MASK = 65535; /*HASH_NUM_VALUES - 1, but C90 does not like that as initializer*/ + +typedef struct Hash { + int* head; /*hash value to head circular pos - can be outdated if went around window*/ + /*circular pos to prev circular pos*/ + unsigned short* chain; + int* val; /*circular pos to hash value*/ + + /*TODO: do this not only for zeros but for any repeated byte. However for PNG + it's always going to be the zeros that dominate, so not important for PNG*/ + int* headz; /*similar to head, but for chainz*/ + unsigned short* chainz; /*those with same amount of zeros*/ + unsigned short* zeros; /*length of zeros streak, used as a second hash chain*/ +} Hash; + +static unsigned hash_init(Hash* hash, unsigned windowsize) { + unsigned i; + hash->head = (int*)lodepng_malloc(sizeof(int) * HASH_NUM_VALUES); + hash->val = (int*)lodepng_malloc(sizeof(int) * windowsize); + hash->chain = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); + + hash->zeros = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); + hash->headz = (int*)lodepng_malloc(sizeof(int) * (MAX_SUPPORTED_DEFLATE_LENGTH + 1)); + hash->chainz = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); + + if(!hash->head || !hash->chain || !hash->val || !hash->headz|| !hash->chainz || !hash->zeros) { + return 83; /*alloc fail*/ + } + + /*initialize hash table*/ + for(i = 0; i != HASH_NUM_VALUES; ++i) hash->head[i] = -1; + for(i = 0; i != windowsize; ++i) hash->val[i] = -1; + for(i = 0; i != windowsize; ++i) hash->chain[i] = i; /*same value as index indicates uninitialized*/ + + for(i = 0; i <= MAX_SUPPORTED_DEFLATE_LENGTH; ++i) hash->headz[i] = -1; + for(i = 0; i != windowsize; ++i) hash->chainz[i] = i; /*same value as index indicates uninitialized*/ + + return 0; +} + +static void hash_cleanup(Hash* hash) { + lodepng_free(hash->head); + lodepng_free(hash->val); + lodepng_free(hash->chain); + + lodepng_free(hash->zeros); + lodepng_free(hash->headz); + lodepng_free(hash->chainz); +} + + + +static unsigned getHash(const unsigned char* data, size_t size, size_t pos) { + unsigned result = 0; + if(pos + 2 < size) { + /*A simple shift and xor hash is used. Since the data of PNGs is dominated + by zeroes due to the filters, a better hash does not have a significant + effect on speed in traversing the chain, and causes more time spend on + calculating the hash.*/ + result ^= ((unsigned)data[pos + 0] << 0u); + result ^= ((unsigned)data[pos + 1] << 4u); + result ^= ((unsigned)data[pos + 2] << 8u); + } else { + size_t amount, i; + if(pos >= size) return 0; + amount = size - pos; + for(i = 0; i != amount; ++i) result ^= ((unsigned)data[pos + i] << (i * 8u)); + } + return result & HASH_BIT_MASK; +} + +static unsigned countZeros(const unsigned char* data, size_t size, size_t pos) { + const unsigned char* start = data + pos; + const unsigned char* end = start + MAX_SUPPORTED_DEFLATE_LENGTH; + if(end > data + size) end = data + size; + data = start; + while(data != end && *data == 0) ++data; + /*subtracting two addresses returned as 32-bit number (max value is MAX_SUPPORTED_DEFLATE_LENGTH)*/ + return (unsigned)(data - start); +} + +/*wpos = pos & (windowsize - 1)*/ +static void updateHashChain(Hash* hash, size_t wpos, unsigned hashval, unsigned short numzeros) { + hash->val[wpos] = (int)hashval; + if(hash->head[hashval] != -1) hash->chain[wpos] = hash->head[hashval]; + hash->head[hashval] = (int)wpos; + + hash->zeros[wpos] = numzeros; + if(hash->headz[numzeros] != -1) hash->chainz[wpos] = hash->headz[numzeros]; + hash->headz[numzeros] = (int)wpos; +} + +/* +LZ77-encode the data. Return value is error code. The input are raw bytes, the output +is in the form of unsigned integers with codes representing for example literal bytes, or +length/distance pairs. +It uses a hash table technique to let it encode faster. When doing LZ77 encoding, a +sliding window (of windowsize) is used, and all past bytes in that window can be used as +the "dictionary". A brute force search through all possible distances would be slow, and +this hash technique is one out of several ways to speed this up. +*/ +static unsigned encodeLZ77(uivector* out, Hash* hash, + const unsigned char* in, size_t inpos, size_t insize, unsigned windowsize, + unsigned minmatch, unsigned nicematch, unsigned lazymatching) { + size_t pos; + unsigned i, error = 0; + /*for large window lengths, assume the user wants no compression loss. Otherwise, max hash chain length speedup.*/ + unsigned maxchainlength = windowsize >= 8192 ? windowsize : windowsize / 8u; + unsigned maxlazymatch = windowsize >= 8192 ? MAX_SUPPORTED_DEFLATE_LENGTH : 64; + + unsigned usezeros = 1; /*not sure if setting it to false for windowsize < 8192 is better or worse*/ + unsigned numzeros = 0; + + unsigned offset; /*the offset represents the distance in LZ77 terminology*/ + unsigned length; + unsigned lazy = 0; + unsigned lazylength = 0, lazyoffset = 0; + unsigned hashval; + unsigned current_offset, current_length; + unsigned prev_offset; + const unsigned char *lastptr, *foreptr, *backptr; + unsigned hashpos; + + if(windowsize == 0 || windowsize > 32768) return 60; /*error: windowsize smaller/larger than allowed*/ + if((windowsize & (windowsize - 1)) != 0) return 90; /*error: must be power of two*/ + + if(nicematch > MAX_SUPPORTED_DEFLATE_LENGTH) nicematch = MAX_SUPPORTED_DEFLATE_LENGTH; + + for(pos = inpos; pos < insize; ++pos) { + size_t wpos = pos & (windowsize - 1); /*position for in 'circular' hash buffers*/ + unsigned chainlength = 0; + + hashval = getHash(in, insize, pos); + + if(usezeros && hashval == 0) { + if(numzeros == 0) numzeros = countZeros(in, insize, pos); + else if(pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros; + } else { + numzeros = 0; + } + + updateHashChain(hash, wpos, hashval, numzeros); + + /*the length and offset found for the current position*/ + length = 0; + offset = 0; + + hashpos = hash->chain[wpos]; + + lastptr = &in[insize < pos + MAX_SUPPORTED_DEFLATE_LENGTH ? insize : pos + MAX_SUPPORTED_DEFLATE_LENGTH]; + + /*search for the longest string*/ + prev_offset = 0; + for(;;) { + if(chainlength++ >= maxchainlength) break; + current_offset = (unsigned)(hashpos <= wpos ? wpos - hashpos : wpos - hashpos + windowsize); + + if(current_offset < prev_offset) break; /*stop when went completely around the circular buffer*/ + prev_offset = current_offset; + if(current_offset > 0) { + /*test the next characters*/ + foreptr = &in[pos]; + backptr = &in[pos - current_offset]; + + /*common case in PNGs is lots of zeros. Quickly skip over them as a speedup*/ + if(numzeros >= 3) { + unsigned skip = hash->zeros[hashpos]; + if(skip > numzeros) skip = numzeros; + backptr += skip; + foreptr += skip; + } + + while(foreptr != lastptr && *backptr == *foreptr) /*maximum supported length by deflate is max length*/ { + ++backptr; + ++foreptr; + } + current_length = (unsigned)(foreptr - &in[pos]); + + if(current_length > length) { + length = current_length; /*the longest length*/ + offset = current_offset; /*the offset that is related to this longest length*/ + /*jump out once a length of max length is found (speed gain). This also jumps + out if length is MAX_SUPPORTED_DEFLATE_LENGTH*/ + if(current_length >= nicematch) break; + } + } + + if(hashpos == hash->chain[hashpos]) break; + + if(numzeros >= 3 && length > numzeros) { + hashpos = hash->chainz[hashpos]; + if(hash->zeros[hashpos] != numzeros) break; + } else { + hashpos = hash->chain[hashpos]; + /*outdated hash value, happens if particular value was not encountered in whole last window*/ + if(hash->val[hashpos] != (int)hashval) break; + } + } + + if(lazymatching) { + if(!lazy && length >= 3 && length <= maxlazymatch && length < MAX_SUPPORTED_DEFLATE_LENGTH) { + lazy = 1; + lazylength = length; + lazyoffset = offset; + continue; /*try the next byte*/ + } + if(lazy) { + lazy = 0; + if(pos == 0) ERROR_BREAK(81); + if(length > lazylength + 1) { + /*push the previous character as literal*/ + if(!uivector_push_back(out, in[pos - 1])) ERROR_BREAK(83 /*alloc fail*/); + } else { + length = lazylength; + offset = lazyoffset; + hash->head[hashval] = -1; /*the same hashchain update will be done, this ensures no wrong alteration*/ + hash->headz[numzeros] = -1; /*idem*/ + --pos; + } + } + } + if(length >= 3 && offset > windowsize) ERROR_BREAK(86 /*too big (or overflown negative) offset*/); + + /*encode it as length/distance pair or literal value*/ + if(length < 3) /*only lengths of 3 or higher are supported as length/distance pair*/ { + if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); + } else if(length < minmatch || (length == 3 && offset > 4096)) { + /*compensate for the fact that longer offsets have more extra bits, a + length of only 3 may be not worth it then*/ + if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); + } else { + addLengthDistance(out, length, offset); + for(i = 1; i < length; ++i) { + ++pos; + wpos = pos & (windowsize - 1); + hashval = getHash(in, insize, pos); + if(usezeros && hashval == 0) { + if(numzeros == 0) numzeros = countZeros(in, insize, pos); + else if(pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros; + } else { + numzeros = 0; + } + updateHashChain(hash, wpos, hashval, numzeros); + } + } + } /*end of the loop through each character of input*/ + + return error; +} + +/* /////////////////////////////////////////////////////////////////////////// */ + +static unsigned deflateNoCompression(ucvector* out, const unsigned char* data, size_t datasize) { + /*non compressed deflate block data: 1 bit BFINAL,2 bits BTYPE,(5 bits): it jumps to start of next byte, + 2 bytes LEN, 2 bytes NLEN, LEN bytes literal DATA*/ + + size_t i, numdeflateblocks = (datasize + 65534u) / 65535u; + unsigned datapos = 0; + for(i = 0; i != numdeflateblocks; ++i) { + unsigned BFINAL, BTYPE, LEN, NLEN; + unsigned char firstbyte; + size_t pos = out->size; + + BFINAL = (i == numdeflateblocks - 1); + BTYPE = 0; + + LEN = 65535; + if(datasize - datapos < 65535u) LEN = (unsigned)datasize - datapos; + NLEN = 65535 - LEN; + + if(!ucvector_resize(out, out->size + LEN + 5)) return 83; /*alloc fail*/ + + firstbyte = (unsigned char)(BFINAL + ((BTYPE & 1u) << 1u) + ((BTYPE & 2u) << 1u)); + out->data[pos + 0] = firstbyte; + out->data[pos + 1] = (unsigned char)(LEN & 255); + out->data[pos + 2] = (unsigned char)(LEN >> 8u); + out->data[pos + 3] = (unsigned char)(NLEN & 255); + out->data[pos + 4] = (unsigned char)(NLEN >> 8u); + lodepng_memcpy(out->data + pos + 5, data + datapos, LEN); + datapos += LEN; + } + + return 0; +} + +/* +write the lz77-encoded data, which has lit, len and dist codes, to compressed stream using huffman trees. +tree_ll: the tree for lit and len codes. +tree_d: the tree for distance codes. +*/ +static void writeLZ77data(LodePNGBitWriter* writer, const uivector* lz77_encoded, + const HuffmanTree* tree_ll, const HuffmanTree* tree_d) { + size_t i = 0; + for(i = 0; i != lz77_encoded->size; ++i) { + unsigned val = lz77_encoded->data[i]; + writeBitsReversed(writer, tree_ll->codes[val], tree_ll->lengths[val]); + if(val > 256) /*for a length code, 3 more things have to be added*/ { + unsigned length_index = val - FIRST_LENGTH_CODE_INDEX; + unsigned n_length_extra_bits = LENGTHEXTRA[length_index]; + unsigned length_extra_bits = lz77_encoded->data[++i]; + + unsigned distance_code = lz77_encoded->data[++i]; + + unsigned distance_index = distance_code; + unsigned n_distance_extra_bits = DISTANCEEXTRA[distance_index]; + unsigned distance_extra_bits = lz77_encoded->data[++i]; + + writeBits(writer, length_extra_bits, n_length_extra_bits); + writeBitsReversed(writer, tree_d->codes[distance_code], tree_d->lengths[distance_code]); + writeBits(writer, distance_extra_bits, n_distance_extra_bits); + } + } +} + +/*Deflate for a block of type "dynamic", that is, with freely, optimally, created huffman trees*/ +static unsigned deflateDynamic(LodePNGBitWriter* writer, Hash* hash, + const unsigned char* data, size_t datapos, size_t dataend, + const LodePNGCompressSettings* settings, unsigned final) { + unsigned error = 0; + + /* + A block is compressed as follows: The PNG data is lz77 encoded, resulting in + literal bytes and length/distance pairs. This is then huffman compressed with + two huffman trees. One huffman tree is used for the lit and len values ("ll"), + another huffman tree is used for the dist values ("d"). These two trees are + stored using their code lengths, and to compress even more these code lengths + are also run-length encoded and huffman compressed. This gives a huffman tree + of code lengths "cl". The code lengths used to describe this third tree are + the code length code lengths ("clcl"). + */ + + /*The lz77 encoded data, represented with integers since there will also be length and distance codes in it*/ + uivector lz77_encoded; + HuffmanTree tree_ll; /*tree for lit,len values*/ + HuffmanTree tree_d; /*tree for distance codes*/ + HuffmanTree tree_cl; /*tree for encoding the code lengths representing tree_ll and tree_d*/ + unsigned* frequencies_ll = 0; /*frequency of lit,len codes*/ + unsigned* frequencies_d = 0; /*frequency of dist codes*/ + unsigned* frequencies_cl = 0; /*frequency of code length codes*/ + unsigned* bitlen_lld = 0; /*lit,len,dist code lengths (int bits), literally (without repeat codes).*/ + unsigned* bitlen_lld_e = 0; /*bitlen_lld encoded with repeat codes (this is a rudimentary run length compression)*/ + size_t datasize = dataend - datapos; + + /* + If we could call "bitlen_cl" the the code length code lengths ("clcl"), that is the bit lengths of codes to represent + tree_cl in CLCL_ORDER, then due to the huffman compression of huffman tree representations ("two levels"), there are + some analogies: + bitlen_lld is to tree_cl what data is to tree_ll and tree_d. + bitlen_lld_e is to bitlen_lld what lz77_encoded is to data. + bitlen_cl is to bitlen_lld_e what bitlen_lld is to lz77_encoded. + */ + + unsigned BFINAL = final; + size_t i; + size_t numcodes_ll, numcodes_d, numcodes_lld, numcodes_lld_e, numcodes_cl; + unsigned HLIT, HDIST, HCLEN; + + uivector_init(&lz77_encoded); + HuffmanTree_init(&tree_ll); + HuffmanTree_init(&tree_d); + HuffmanTree_init(&tree_cl); + /* could fit on stack, but >1KB is on the larger side so allocate instead */ + frequencies_ll = (unsigned*)lodepng_malloc(286 * sizeof(*frequencies_ll)); + frequencies_d = (unsigned*)lodepng_malloc(30 * sizeof(*frequencies_d)); + frequencies_cl = (unsigned*)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(*frequencies_cl)); + + if(!frequencies_ll || !frequencies_d || !frequencies_cl) error = 83; /*alloc fail*/ + + /*This while loop never loops due to a break at the end, it is here to + allow breaking out of it to the cleanup phase on error conditions.*/ + while(!error) { + lodepng_memset(frequencies_ll, 0, 286 * sizeof(*frequencies_ll)); + lodepng_memset(frequencies_d, 0, 30 * sizeof(*frequencies_d)); + lodepng_memset(frequencies_cl, 0, NUM_CODE_LENGTH_CODES * sizeof(*frequencies_cl)); + + if(settings->use_lz77) { + error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, + settings->minmatch, settings->nicematch, settings->lazymatching); + if(error) break; + } else { + if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83 /*alloc fail*/); + for(i = datapos; i < dataend; ++i) lz77_encoded.data[i - datapos] = data[i]; /*no LZ77, but still will be Huffman compressed*/ + } + + /*Count the frequencies of lit, len and dist codes*/ + for(i = 0; i != lz77_encoded.size; ++i) { + unsigned symbol = lz77_encoded.data[i]; + ++frequencies_ll[symbol]; + if(symbol > 256) { + unsigned dist = lz77_encoded.data[i + 2]; + ++frequencies_d[dist]; + i += 3; + } + } + frequencies_ll[256] = 1; /*there will be exactly 1 end code, at the end of the block*/ + + /*Make both huffman trees, one for the lit and len codes, one for the dist codes*/ + error = HuffmanTree_makeFromFrequencies(&tree_ll, frequencies_ll, 257, 286, 15); + if(error) break; + /*2, not 1, is chosen for mincodes: some buggy PNG decoders require at least 2 symbols in the dist tree*/ + error = HuffmanTree_makeFromFrequencies(&tree_d, frequencies_d, 2, 30, 15); + if(error) break; + + numcodes_ll = LODEPNG_MIN(tree_ll.numcodes, 286); + numcodes_d = LODEPNG_MIN(tree_d.numcodes, 30); + /*store the code lengths of both generated trees in bitlen_lld*/ + numcodes_lld = numcodes_ll + numcodes_d; + bitlen_lld = (unsigned*)lodepng_malloc(numcodes_lld * sizeof(*bitlen_lld)); + /*numcodes_lld_e never needs more size than bitlen_lld*/ + bitlen_lld_e = (unsigned*)lodepng_malloc(numcodes_lld * sizeof(*bitlen_lld_e)); + if(!bitlen_lld || !bitlen_lld_e) ERROR_BREAK(83); /*alloc fail*/ + numcodes_lld_e = 0; + + for(i = 0; i != numcodes_ll; ++i) bitlen_lld[i] = tree_ll.lengths[i]; + for(i = 0; i != numcodes_d; ++i) bitlen_lld[numcodes_ll + i] = tree_d.lengths[i]; + + /*run-length compress bitlen_ldd into bitlen_lld_e by using repeat codes 16 (copy length 3-6 times), + 17 (3-10 zeroes), 18 (11-138 zeroes)*/ + for(i = 0; i != numcodes_lld; ++i) { + unsigned j = 0; /*amount of repetitions*/ + while(i + j + 1 < numcodes_lld && bitlen_lld[i + j + 1] == bitlen_lld[i]) ++j; + + if(bitlen_lld[i] == 0 && j >= 2) /*repeat code for zeroes*/ { + ++j; /*include the first zero*/ + if(j <= 10) /*repeat code 17 supports max 10 zeroes*/ { + bitlen_lld_e[numcodes_lld_e++] = 17; + bitlen_lld_e[numcodes_lld_e++] = j - 3; + } else /*repeat code 18 supports max 138 zeroes*/ { + if(j > 138) j = 138; + bitlen_lld_e[numcodes_lld_e++] = 18; + bitlen_lld_e[numcodes_lld_e++] = j - 11; + } + i += (j - 1); + } else if(j >= 3) /*repeat code for value other than zero*/ { + size_t k; + unsigned num = j / 6u, rest = j % 6u; + bitlen_lld_e[numcodes_lld_e++] = bitlen_lld[i]; + for(k = 0; k < num; ++k) { + bitlen_lld_e[numcodes_lld_e++] = 16; + bitlen_lld_e[numcodes_lld_e++] = 6 - 3; + } + if(rest >= 3) { + bitlen_lld_e[numcodes_lld_e++] = 16; + bitlen_lld_e[numcodes_lld_e++] = rest - 3; + } + else j -= rest; + i += j; + } else /*too short to benefit from repeat code*/ { + bitlen_lld_e[numcodes_lld_e++] = bitlen_lld[i]; + } + } + + /*generate tree_cl, the huffmantree of huffmantrees*/ + for(i = 0; i != numcodes_lld_e; ++i) { + ++frequencies_cl[bitlen_lld_e[i]]; + /*after a repeat code come the bits that specify the number of repetitions, + those don't need to be in the frequencies_cl calculation*/ + if(bitlen_lld_e[i] >= 16) ++i; + } + + error = HuffmanTree_makeFromFrequencies(&tree_cl, frequencies_cl, + NUM_CODE_LENGTH_CODES, NUM_CODE_LENGTH_CODES, 7); + if(error) break; + + /*compute amount of code-length-code-lengths to output*/ + numcodes_cl = NUM_CODE_LENGTH_CODES; + /*trim zeros at the end (using CLCL_ORDER), but minimum size must be 4 (see HCLEN below)*/ + while(numcodes_cl > 4u && tree_cl.lengths[CLCL_ORDER[numcodes_cl - 1u]] == 0) { + numcodes_cl--; + } + + /* + Write everything into the output + + After the BFINAL and BTYPE, the dynamic block consists out of the following: + - 5 bits HLIT, 5 bits HDIST, 4 bits HCLEN + - (HCLEN+4)*3 bits code lengths of code length alphabet + - HLIT + 257 code lengths of lit/length alphabet (encoded using the code length + alphabet, + possible repetition codes 16, 17, 18) + - HDIST + 1 code lengths of distance alphabet (encoded using the code length + alphabet, + possible repetition codes 16, 17, 18) + - compressed data + - 256 (end code) + */ + + /*Write block type*/ + writeBits(writer, BFINAL, 1); + writeBits(writer, 0, 1); /*first bit of BTYPE "dynamic"*/ + writeBits(writer, 1, 1); /*second bit of BTYPE "dynamic"*/ + + /*write the HLIT, HDIST and HCLEN values*/ + /*all three sizes take trimmed ending zeroes into account, done either by HuffmanTree_makeFromFrequencies + or in the loop for numcodes_cl above, which saves space. */ + HLIT = (unsigned)(numcodes_ll - 257); + HDIST = (unsigned)(numcodes_d - 1); + HCLEN = (unsigned)(numcodes_cl - 4); + writeBits(writer, HLIT, 5); + writeBits(writer, HDIST, 5); + writeBits(writer, HCLEN, 4); + + /*write the code lengths of the code length alphabet ("bitlen_cl")*/ + for(i = 0; i != numcodes_cl; ++i) writeBits(writer, tree_cl.lengths[CLCL_ORDER[i]], 3); + + /*write the lengths of the lit/len AND the dist alphabet*/ + for(i = 0; i != numcodes_lld_e; ++i) { + writeBitsReversed(writer, tree_cl.codes[bitlen_lld_e[i]], tree_cl.lengths[bitlen_lld_e[i]]); + /*extra bits of repeat codes*/ + if(bitlen_lld_e[i] == 16) writeBits(writer, bitlen_lld_e[++i], 2); + else if(bitlen_lld_e[i] == 17) writeBits(writer, bitlen_lld_e[++i], 3); + else if(bitlen_lld_e[i] == 18) writeBits(writer, bitlen_lld_e[++i], 7); + } + + /*write the compressed data symbols*/ + writeLZ77data(writer, &lz77_encoded, &tree_ll, &tree_d); + /*error: the length of the end code 256 must be larger than 0*/ + if(tree_ll.lengths[256] == 0) ERROR_BREAK(64); + + /*write the end code*/ + writeBitsReversed(writer, tree_ll.codes[256], tree_ll.lengths[256]); + + break; /*end of error-while*/ + } + + /*cleanup*/ + uivector_cleanup(&lz77_encoded); + HuffmanTree_cleanup(&tree_ll); + HuffmanTree_cleanup(&tree_d); + HuffmanTree_cleanup(&tree_cl); + lodepng_free(frequencies_ll); + lodepng_free(frequencies_d); + lodepng_free(frequencies_cl); + lodepng_free(bitlen_lld); + lodepng_free(bitlen_lld_e); + + return error; +} + +static unsigned deflateFixed(LodePNGBitWriter* writer, Hash* hash, + const unsigned char* data, + size_t datapos, size_t dataend, + const LodePNGCompressSettings* settings, unsigned final) { + HuffmanTree tree_ll; /*tree for literal values and length codes*/ + HuffmanTree tree_d; /*tree for distance codes*/ + + unsigned BFINAL = final; + unsigned error = 0; + size_t i; + + HuffmanTree_init(&tree_ll); + HuffmanTree_init(&tree_d); + + error = generateFixedLitLenTree(&tree_ll); + if(!error) error = generateFixedDistanceTree(&tree_d); + + if(!error) { + writeBits(writer, BFINAL, 1); + writeBits(writer, 1, 1); /*first bit of BTYPE*/ + writeBits(writer, 0, 1); /*second bit of BTYPE*/ + + if(settings->use_lz77) /*LZ77 encoded*/ { + uivector lz77_encoded; + uivector_init(&lz77_encoded); + error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, + settings->minmatch, settings->nicematch, settings->lazymatching); + if(!error) writeLZ77data(writer, &lz77_encoded, &tree_ll, &tree_d); + uivector_cleanup(&lz77_encoded); + } else /*no LZ77, but still will be Huffman compressed*/ { + for(i = datapos; i < dataend; ++i) { + writeBitsReversed(writer, tree_ll.codes[data[i]], tree_ll.lengths[data[i]]); + } + } + /*add END code*/ + if(!error) writeBitsReversed(writer,tree_ll.codes[256], tree_ll.lengths[256]); + } + + /*cleanup*/ + HuffmanTree_cleanup(&tree_ll); + HuffmanTree_cleanup(&tree_d); + + return error; +} + +static unsigned lodepng_deflatev(ucvector* out, const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings) { + unsigned error = 0; + size_t i, blocksize, numdeflateblocks; + Hash hash; + LodePNGBitWriter writer; + + LodePNGBitWriter_init(&writer, out); + + if(settings->btype > 2) return 61; + else if(settings->btype == 0) return deflateNoCompression(out, in, insize); + else if(settings->btype == 1) blocksize = insize; + else /*if(settings->btype == 2)*/ { + /*on PNGs, deflate blocks of 65-262k seem to give most dense encoding*/ + blocksize = insize / 8u + 8; + if(blocksize < 65536) blocksize = 65536; + if(blocksize > 262144) blocksize = 262144; + } + + numdeflateblocks = (insize + blocksize - 1) / blocksize; + if(numdeflateblocks == 0) numdeflateblocks = 1; + + error = hash_init(&hash, settings->windowsize); + + if(!error) { + for(i = 0; i != numdeflateblocks && !error; ++i) { + unsigned final = (i == numdeflateblocks - 1); + size_t start = i * blocksize; + size_t end = start + blocksize; + if(end > insize) end = insize; + + if(settings->btype == 1) error = deflateFixed(&writer, &hash, in, start, end, settings, final); + else if(settings->btype == 2) error = deflateDynamic(&writer, &hash, in, start, end, settings, final); + } + } + + hash_cleanup(&hash); + + return error; +} + +unsigned lodepng_deflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings) { + ucvector v = ucvector_init(*out, *outsize); + unsigned error = lodepng_deflatev(&v, in, insize, settings); + *out = v.data; + *outsize = v.size; + return error; +} + +static unsigned deflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings) { + if(settings->custom_deflate) { + unsigned error = settings->custom_deflate(out, outsize, in, insize, settings); + /*the custom deflate is allowed to have its own error codes, however, we translate it to code 111*/ + return error ? 111 : 0; + } else { + return lodepng_deflate(out, outsize, in, insize, settings); + } +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Adler32 / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +static unsigned update_adler32(unsigned adler, const unsigned char* data, unsigned len) { + unsigned s1 = adler & 0xffffu; + unsigned s2 = (adler >> 16u) & 0xffffu; + + while(len != 0u) { + unsigned i; + /*at least 5552 sums can be done before the sums overflow, saving a lot of module divisions*/ + unsigned amount = len > 5552u ? 5552u : len; + len -= amount; + for(i = 0; i != amount; ++i) { + s1 += (*data++); + s2 += s1; + } + s1 %= 65521u; + s2 %= 65521u; + } + + return (s2 << 16u) | s1; +} + +/*Return the adler32 of the bytes data[0..len-1]*/ +static unsigned adler32(const unsigned char* data, unsigned len) { + return update_adler32(1u, data, len); +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Zlib / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_DECODER + +static unsigned lodepng_zlib_decompressv(ucvector* out, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings) { + unsigned error = 0; + unsigned CM, CINFO, FDICT; + + if(insize < 2) return 53; /*error, size of zlib data too small*/ + /*read information from zlib header*/ + if((in[0] * 256 + in[1]) % 31 != 0) { + /*error: 256 * in[0] + in[1] must be a multiple of 31, the FCHECK value is supposed to be made that way*/ + return 24; + } + + CM = in[0] & 15; + CINFO = (in[0] >> 4) & 15; + /*FCHECK = in[1] & 31;*/ /*FCHECK is already tested above*/ + FDICT = (in[1] >> 5) & 1; + /*FLEVEL = (in[1] >> 6) & 3;*/ /*FLEVEL is not used here*/ + + if(CM != 8 || CINFO > 7) { + /*error: only compression method 8: inflate with sliding window of 32k is supported by the PNG spec*/ + return 25; + } + if(FDICT != 0) { + /*error: the specification of PNG says about the zlib stream: + "The additional flags shall not specify a preset dictionary."*/ + return 26; + } + + error = inflatev(out, in + 2, insize - 2, settings); + if(error) return error; + + if(!settings->ignore_adler32) { + unsigned ADLER32 = lodepng_read32bitInt(&in[insize - 4]); + unsigned checksum = adler32(out->data, (unsigned)(out->size)); + if(checksum != ADLER32) return 58; /*error, adler checksum not correct, data must be corrupted*/ + } + + return 0; /*no error*/ +} + + +unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGDecompressSettings* settings) { + ucvector v = ucvector_init(*out, *outsize); + unsigned error = lodepng_zlib_decompressv(&v, in, insize, settings); + *out = v.data; + *outsize = v.size; + return error; +} + +/*expected_size is expected output size, to avoid intermediate allocations. Set to 0 if not known. */ +static unsigned zlib_decompress(unsigned char** out, size_t* outsize, size_t expected_size, + const unsigned char* in, size_t insize, const LodePNGDecompressSettings* settings) { + unsigned error; + if(settings->custom_zlib) { + error = settings->custom_zlib(out, outsize, in, insize, settings); + if(error) { + /*the custom zlib is allowed to have its own error codes, however, we translate it to code 110*/ + error = 110; + /*if there's a max output size, and the custom zlib returned error, then indicate that error instead*/ + if(settings->max_output_size && *outsize > settings->max_output_size) error = 109; + } + } else { + ucvector v = ucvector_init(*out, *outsize); + if(expected_size) { + /*reserve the memory to avoid intermediate reallocations*/ + ucvector_resize(&v, *outsize + expected_size); + v.size = *outsize; + } + error = lodepng_zlib_decompressv(&v, in, insize, settings); + *out = v.data; + *outsize = v.size; + } + return error; +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER + +unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGCompressSettings* settings) { + size_t i; + unsigned error; + unsigned char* deflatedata = 0; + size_t deflatesize = 0; + + error = deflate(&deflatedata, &deflatesize, in, insize, settings); + + *out = NULL; + *outsize = 0; + if(!error) { + *outsize = deflatesize + 6; + *out = (unsigned char*)lodepng_malloc(*outsize); + if(!*out) error = 83; /*alloc fail*/ + } + + if(!error) { + unsigned ADLER32 = adler32(in, (unsigned)insize); + /*zlib data: 1 byte CMF (CM+CINFO), 1 byte FLG, deflate data, 4 byte ADLER32 checksum of the Decompressed data*/ + unsigned CMF = 120; /*0b01111000: CM 8, CINFO 7. With CINFO 7, any window size up to 32768 can be used.*/ + unsigned FLEVEL = 0; + unsigned FDICT = 0; + unsigned CMFFLG = 256 * CMF + FDICT * 32 + FLEVEL * 64; + unsigned FCHECK = 31 - CMFFLG % 31; + CMFFLG += FCHECK; + + (*out)[0] = (unsigned char)(CMFFLG >> 8); + (*out)[1] = (unsigned char)(CMFFLG & 255); + for(i = 0; i != deflatesize; ++i) (*out)[i + 2] = deflatedata[i]; + lodepng_set32bitInt(&(*out)[*outsize - 4], ADLER32); + } + + lodepng_free(deflatedata); + return error; +} + +/* compress using the default or custom zlib function */ +static unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGCompressSettings* settings) { + if(settings->custom_zlib) { + unsigned error = settings->custom_zlib(out, outsize, in, insize, settings); + /*the custom zlib is allowed to have its own error codes, however, we translate it to code 111*/ + return error ? 111 : 0; + } else { + return lodepng_zlib_compress(out, outsize, in, insize, settings); + } +} + +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#else /*no LODEPNG_COMPILE_ZLIB*/ + +#ifdef LODEPNG_COMPILE_DECODER +static unsigned zlib_decompress(unsigned char** out, size_t* outsize, size_t expected_size, + const unsigned char* in, size_t insize, const LodePNGDecompressSettings* settings) { + if(!settings->custom_zlib) return 87; /*no custom zlib function provided */ + LV_UNUSED(expected_size); + return settings->custom_zlib(out, outsize, in, insize, settings); +} +#endif /*LODEPNG_COMPILE_DECODER*/ +#ifdef LODEPNG_COMPILE_ENCODER +static unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGCompressSettings* settings) { + if(!settings->custom_zlib) return 87; /*no custom zlib function provided */ + return settings->custom_zlib(out, outsize, in, insize, settings); +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#endif /*LODEPNG_COMPILE_ZLIB*/ + +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_ENCODER + +/*this is a good tradeoff between speed and compression ratio*/ +#define DEFAULT_WINDOWSIZE 2048 + +void lodepng_compress_settings_init(LodePNGCompressSettings* settings) { + /*compress with dynamic huffman tree (not in the mathematical sense, just not the predefined one)*/ + settings->btype = 2; + settings->use_lz77 = 1; + settings->windowsize = DEFAULT_WINDOWSIZE; + settings->minmatch = 3; + settings->nicematch = 128; + settings->lazymatching = 1; + + settings->custom_zlib = 0; + settings->custom_deflate = 0; + settings->custom_context = 0; +} + +const LodePNGCompressSettings lodepng_default_compress_settings = {2, 1, DEFAULT_WINDOWSIZE, 3, 128, 1, 0, 0, 0}; + + +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_DECODER + +void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings) { + settings->ignore_adler32 = 0; + settings->ignore_nlen = 0; + settings->max_output_size = 0; + + settings->custom_zlib = 0; + settings->custom_inflate = 0; + settings->custom_context = 0; +} + +const LodePNGDecompressSettings lodepng_default_decompress_settings = {0, 0, 0, 0, 0, 0}; + +#endif /*LODEPNG_COMPILE_DECODER*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // End of Zlib related code. Begin of PNG related code. // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_PNG + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / CRC32 / */ +/* ////////////////////////////////////////////////////////////////////////// */ + + +#ifndef LODEPNG_NO_COMPILE_CRC +/* CRC polynomial: 0xedb88320 */ +static unsigned lodepng_crc32_table[256] = { + 0u, 1996959894u, 3993919788u, 2567524794u, 124634137u, 1886057615u, 3915621685u, 2657392035u, + 249268274u, 2044508324u, 3772115230u, 2547177864u, 162941995u, 2125561021u, 3887607047u, 2428444049u, + 498536548u, 1789927666u, 4089016648u, 2227061214u, 450548861u, 1843258603u, 4107580753u, 2211677639u, + 325883990u, 1684777152u, 4251122042u, 2321926636u, 335633487u, 1661365465u, 4195302755u, 2366115317u, + 997073096u, 1281953886u, 3579855332u, 2724688242u, 1006888145u, 1258607687u, 3524101629u, 2768942443u, + 901097722u, 1119000684u, 3686517206u, 2898065728u, 853044451u, 1172266101u, 3705015759u, 2882616665u, + 651767980u, 1373503546u, 3369554304u, 3218104598u, 565507253u, 1454621731u, 3485111705u, 3099436303u, + 671266974u, 1594198024u, 3322730930u, 2970347812u, 795835527u, 1483230225u, 3244367275u, 3060149565u, + 1994146192u, 31158534u, 2563907772u, 4023717930u, 1907459465u, 112637215u, 2680153253u, 3904427059u, + 2013776290u, 251722036u, 2517215374u, 3775830040u, 2137656763u, 141376813u, 2439277719u, 3865271297u, + 1802195444u, 476864866u, 2238001368u, 4066508878u, 1812370925u, 453092731u, 2181625025u, 4111451223u, + 1706088902u, 314042704u, 2344532202u, 4240017532u, 1658658271u, 366619977u, 2362670323u, 4224994405u, + 1303535960u, 984961486u, 2747007092u, 3569037538u, 1256170817u, 1037604311u, 2765210733u, 3554079995u, + 1131014506u, 879679996u, 2909243462u, 3663771856u, 1141124467u, 855842277u, 2852801631u, 3708648649u, + 1342533948u, 654459306u, 3188396048u, 3373015174u, 1466479909u, 544179635u, 3110523913u, 3462522015u, + 1591671054u, 702138776u, 2966460450u, 3352799412u, 1504918807u, 783551873u, 3082640443u, 3233442989u, + 3988292384u, 2596254646u, 62317068u, 1957810842u, 3939845945u, 2647816111u, 81470997u, 1943803523u, + 3814918930u, 2489596804u, 225274430u, 2053790376u, 3826175755u, 2466906013u, 167816743u, 2097651377u, + 4027552580u, 2265490386u, 503444072u, 1762050814u, 4150417245u, 2154129355u, 426522225u, 1852507879u, + 4275313526u, 2312317920u, 282753626u, 1742555852u, 4189708143u, 2394877945u, 397917763u, 1622183637u, + 3604390888u, 2714866558u, 953729732u, 1340076626u, 3518719985u, 2797360999u, 1068828381u, 1219638859u, + 3624741850u, 2936675148u, 906185462u, 1090812512u, 3747672003u, 2825379669u, 829329135u, 1181335161u, + 3412177804u, 3160834842u, 628085408u, 1382605366u, 3423369109u, 3138078467u, 570562233u, 1426400815u, + 3317316542u, 2998733608u, 733239954u, 1555261956u, 3268935591u, 3050360625u, 752459403u, 1541320221u, + 2607071920u, 3965973030u, 1969922972u, 40735498u, 2617837225u, 3943577151u, 1913087877u, 83908371u, + 2512341634u, 3803740692u, 2075208622u, 213261112u, 2463272603u, 3855990285u, 2094854071u, 198958881u, + 2262029012u, 4057260610u, 1759359992u, 534414190u, 2176718541u, 4139329115u, 1873836001u, 414664567u, + 2282248934u, 4279200368u, 1711684554u, 285281116u, 2405801727u, 4167216745u, 1634467795u, 376229701u, + 2685067896u, 3608007406u, 1308918612u, 956543938u, 2808555105u, 3495958263u, 1231636301u, 1047427035u, + 2932959818u, 3654703836u, 1088359270u, 936918000u, 2847714899u, 3736837829u, 1202900863u, 817233897u, + 3183342108u, 3401237130u, 1404277552u, 615818150u, 3134207493u, 3453421203u, 1423857449u, 601450431u, + 3009837614u, 3294710456u, 1567103746u, 711928724u, 3020668471u, 3272380065u, 1510334235u, 755167117u +}; + +/*Return the CRC of the bytes buf[0..len-1].*/ +unsigned lodepng_crc32(const unsigned char* data, size_t length) { + unsigned r = 0xffffffffu; + size_t i; + for(i = 0; i < length; ++i) { + r = lodepng_crc32_table[(r ^ data[i]) & 0xffu] ^ (r >> 8u); + } + return r ^ 0xffffffffu; +} +#else /* !LODEPNG_NO_COMPILE_CRC */ +unsigned lodepng_crc32(const unsigned char* data, size_t length); +#endif /* !LODEPNG_NO_COMPILE_CRC */ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Reading and writing PNG color channel bits / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/* The color channel bits of less-than-8-bit pixels are read with the MSB of bytes first, +so LodePNGBitWriter and LodePNGBitReader can't be used for those. */ + +static unsigned char readBitFromReversedStream(size_t* bitpointer, const unsigned char* bitstream) { + unsigned char result = (unsigned char)((bitstream[(*bitpointer) >> 3] >> (7 - ((*bitpointer) & 0x7))) & 1); + ++(*bitpointer); + return result; +} + +/* TODO: make this faster */ +static unsigned readBitsFromReversedStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits) { + unsigned result = 0; + size_t i; + for(i = 0 ; i < nbits; ++i) { + result <<= 1u; + result |= (unsigned)readBitFromReversedStream(bitpointer, bitstream); + } + return result; +} + +static void setBitOfReversedStream(size_t* bitpointer, unsigned char* bitstream, unsigned char bit) { + /*the current bit in bitstream may be 0 or 1 for this to work*/ + if(bit == 0) bitstream[(*bitpointer) >> 3u] &= (unsigned char)(~(1u << (7u - ((*bitpointer) & 7u)))); + else bitstream[(*bitpointer) >> 3u] |= (1u << (7u - ((*bitpointer) & 7u))); + ++(*bitpointer); +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / PNG chunks / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +unsigned lodepng_chunk_length(const unsigned char* chunk) { + return lodepng_read32bitInt(&chunk[0]); +} + +void lodepng_chunk_type(char type[5], const unsigned char* chunk) { + unsigned i; + for(i = 0; i != 4; ++i) type[i] = (char)chunk[4 + i]; + type[4] = 0; /*null termination char*/ +} + +unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type) { + if(lodepng_strlen(type) != 4) return 0; + return (chunk[4] == type[0] && chunk[5] == type[1] && chunk[6] == type[2] && chunk[7] == type[3]); +} + +unsigned char lodepng_chunk_ancillary(const unsigned char* chunk) { + return((chunk[4] & 32) != 0); +} + +unsigned char lodepng_chunk_private(const unsigned char* chunk) { + return((chunk[6] & 32) != 0); +} + +unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk) { + return((chunk[7] & 32) != 0); +} + +unsigned char* lodepng_chunk_data(unsigned char* chunk) { + return &chunk[8]; +} + +const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk) { + return &chunk[8]; +} + +unsigned lodepng_chunk_check_crc(const unsigned char* chunk) { + unsigned length = lodepng_chunk_length(chunk); + unsigned CRC = lodepng_read32bitInt(&chunk[length + 8]); + /*the CRC is taken of the data and the 4 chunk type letters, not the length*/ + unsigned checksum = lodepng_crc32(&chunk[4], length + 4); + if(CRC != checksum) return 1; + else return 0; +} + +void lodepng_chunk_generate_crc(unsigned char* chunk) { + unsigned length = lodepng_chunk_length(chunk); + unsigned CRC = lodepng_crc32(&chunk[4], length + 4); + lodepng_set32bitInt(chunk + 8 + length, CRC); +} + +unsigned char* lodepng_chunk_next(unsigned char* chunk, unsigned char* end) { + if(chunk >= end || end - chunk < 12) return end; /*too small to contain a chunk*/ + if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47 + && chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) { + /* Is PNG magic header at start of PNG file. Jump to first actual chunk. */ + return chunk + 8; + } else { + size_t total_chunk_length; + unsigned char* result; + if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return end; + result = chunk + total_chunk_length; + if(result < chunk) return end; /*pointer overflow*/ + return result; + } +} + +const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk, const unsigned char* end) { + if(chunk >= end || end - chunk < 12) return end; /*too small to contain a chunk*/ + if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47 + && chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) { + /* Is PNG magic header at start of PNG file. Jump to first actual chunk. */ + return chunk + 8; + } else { + size_t total_chunk_length; + const unsigned char* result; + if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return end; + result = chunk + total_chunk_length; + if(result < chunk) return end; /*pointer overflow*/ + return result; + } +} + +unsigned char* lodepng_chunk_find(unsigned char* chunk, unsigned char* end, const char type[5]) { + for(;;) { + if(chunk >= end || end - chunk < 12) return 0; /* past file end: chunk + 12 > end */ + if(lodepng_chunk_type_equals(chunk, type)) return chunk; + chunk = lodepng_chunk_next(chunk, end); + } + + return 0; /*Shouldn't reach this*/ +} + +const unsigned char* lodepng_chunk_find_const(const unsigned char* chunk, const unsigned char* end, const char type[5]) { + for(;;) { + if(chunk >= end || end - chunk < 12) return 0; /* past file end: chunk + 12 > end */ + if(lodepng_chunk_type_equals(chunk, type)) return chunk; + chunk = lodepng_chunk_next_const(chunk, end); + } + + return 0; /*Shouldn't reach this*/ +} + +unsigned lodepng_chunk_append(unsigned char** out, size_t* outsize, const unsigned char* chunk) { + unsigned i; + size_t total_chunk_length, new_length; + unsigned char *chunk_start, *new_buffer; + + if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return 77; + if(lodepng_addofl(*outsize, total_chunk_length, &new_length)) return 77; + + new_buffer = (unsigned char*)lodepng_realloc(*out, new_length); + if(!new_buffer) return 83; /*alloc fail*/ + (*out) = new_buffer; + (*outsize) = new_length; + chunk_start = &(*out)[new_length - total_chunk_length]; + + for(i = 0; i != total_chunk_length; ++i) chunk_start[i] = chunk[i]; + + return 0; +} + +/*Sets length and name and allocates the space for data and crc but does not +set data or crc yet. Returns the start of the chunk in chunk. The start of +the data is at chunk + 8. To finalize chunk, add the data, then use +lodepng_chunk_generate_crc */ +static unsigned lodepng_chunk_init(unsigned char** chunk, + ucvector* out, + unsigned length, const char* type) { + size_t new_length = out->size; + if(lodepng_addofl(new_length, length, &new_length)) return 77; + if(lodepng_addofl(new_length, 12, &new_length)) return 77; + if(!ucvector_resize(out, new_length)) return 83; /*alloc fail*/ + *chunk = out->data + new_length - length - 12u; + + /*1: length*/ + lodepng_set32bitInt(*chunk, length); + + /*2: chunk name (4 letters)*/ + lodepng_memcpy(*chunk + 4, type, 4); + + return 0; +} + +/* like lodepng_chunk_create but with custom allocsize */ +static unsigned lodepng_chunk_createv(ucvector* out, + unsigned length, const char* type, const unsigned char* data) { + unsigned char* chunk; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, length, type)); + + /*3: the data*/ + lodepng_memcpy(chunk + 8, data, length); + + /*4: CRC (of the chunkname characters and the data)*/ + lodepng_chunk_generate_crc(chunk); + + return 0; +} + +unsigned lodepng_chunk_create(unsigned char** out, size_t* outsize, + unsigned length, const char* type, const unsigned char* data) { + ucvector v = ucvector_init(*out, *outsize); + unsigned error = lodepng_chunk_createv(&v, length, type, data); + *out = v.data; + *outsize = v.size; + return error; +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Color types, channels, bits / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*checks if the colortype is valid and the bitdepth bd is allowed for this colortype. +Return value is a LodePNG error code.*/ +static unsigned checkColorValidity(LodePNGColorType colortype, unsigned bd) { + switch(colortype) { + case LCT_GREY: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 || bd == 16)) return 37; break; + case LCT_RGB: if(!( bd == 8 || bd == 16)) return 37; break; + case LCT_PALETTE: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 )) return 37; break; + case LCT_GREY_ALPHA: if(!( bd == 8 || bd == 16)) return 37; break; + case LCT_RGBA: if(!( bd == 8 || bd == 16)) return 37; break; + case LCT_MAX_OCTET_VALUE: return 31; /* invalid color type */ + default: return 31; /* invalid color type */ + } + return 0; /*allowed color type / bits combination*/ +} + +static unsigned getNumColorChannels(LodePNGColorType colortype) { + switch(colortype) { + case LCT_GREY: return 1; + case LCT_RGB: return 3; + case LCT_PALETTE: return 1; + case LCT_GREY_ALPHA: return 2; + case LCT_RGBA: return 4; + case LCT_MAX_OCTET_VALUE: return 0; /* invalid color type */ + default: return 0; /*invalid color type*/ + } +} + +static unsigned lodepng_get_bpp_lct(LodePNGColorType colortype, unsigned bitdepth) { + /*bits per pixel is amount of channels * bits per channel*/ + return getNumColorChannels(colortype) * bitdepth; +} + +/* ////////////////////////////////////////////////////////////////////////// */ + +void lodepng_color_mode_init(LodePNGColorMode* info) { + info->key_defined = 0; + info->key_r = info->key_g = info->key_b = 0; + info->colortype = LCT_RGBA; + info->bitdepth = 8; + info->palette = 0; + info->palettesize = 0; +} + +/*allocates palette memory if needed, and initializes all colors to black*/ +static void lodepng_color_mode_alloc_palette(LodePNGColorMode* info) { + size_t i; + /*if the palette is already allocated, it will have size 1024 so no reallocation needed in that case*/ + /*the palette must have room for up to 256 colors with 4 bytes each.*/ + if(!info->palette) info->palette = (unsigned char*)lodepng_malloc(1024); + if(!info->palette) return; /*alloc fail*/ + for(i = 0; i != 256; ++i) { + /*Initialize all unused colors with black, the value used for invalid palette indices. + This is an error according to the PNG spec, but common PNG decoders make it black instead. + That makes color conversion slightly faster due to no error handling needed.*/ + info->palette[i * 4 + 0] = 0; + info->palette[i * 4 + 1] = 0; + info->palette[i * 4 + 2] = 0; + info->palette[i * 4 + 3] = 255; + } +} + +void lodepng_color_mode_cleanup(LodePNGColorMode* info) { + lodepng_palette_clear(info); +} + +unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source) { + lodepng_color_mode_cleanup(dest); + lodepng_memcpy(dest, source, sizeof(LodePNGColorMode)); + if(source->palette) { + dest->palette = (unsigned char*)lodepng_malloc(1024); + if(!dest->palette && source->palettesize) return 83; /*alloc fail*/ + lodepng_memcpy(dest->palette, source->palette, source->palettesize * 4); + } + return 0; +} + +LodePNGColorMode lodepng_color_mode_make(LodePNGColorType colortype, unsigned bitdepth) { + LodePNGColorMode result; + lodepng_color_mode_init(&result); + result.colortype = colortype; + result.bitdepth = bitdepth; + return result; +} + +static int lodepng_color_mode_equal(const LodePNGColorMode* a, const LodePNGColorMode* b) { + size_t i; + if(a->colortype != b->colortype) return 0; + if(a->bitdepth != b->bitdepth) return 0; + if(a->key_defined != b->key_defined) return 0; + if(a->key_defined) { + if(a->key_r != b->key_r) return 0; + if(a->key_g != b->key_g) return 0; + if(a->key_b != b->key_b) return 0; + } + if(a->palettesize != b->palettesize) return 0; + for(i = 0; i != a->palettesize * 4; ++i) { + if(a->palette[i] != b->palette[i]) return 0; + } + return 1; +} + +void lodepng_palette_clear(LodePNGColorMode* info) { + if(info->palette) lodepng_free(info->palette); + info->palette = 0; + info->palettesize = 0; +} + +unsigned lodepng_palette_add(LodePNGColorMode* info, + unsigned char r, unsigned char g, unsigned char b, unsigned char a) { + if(!info->palette) /*allocate palette if empty*/ { + lodepng_color_mode_alloc_palette(info); + if(!info->palette) return 83; /*alloc fail*/ + } + if(info->palettesize >= 256) { + return 108; /*too many palette values*/ + } + info->palette[4 * info->palettesize + 0] = r; + info->palette[4 * info->palettesize + 1] = g; + info->palette[4 * info->palettesize + 2] = b; + info->palette[4 * info->palettesize + 3] = a; + ++info->palettesize; + return 0; +} + +/*calculate bits per pixel out of colortype and bitdepth*/ +unsigned lodepng_get_bpp(const LodePNGColorMode* info) { + return lodepng_get_bpp_lct(info->colortype, info->bitdepth); +} + +unsigned lodepng_get_channels(const LodePNGColorMode* info) { + return getNumColorChannels(info->colortype); +} + +unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info) { + return info->colortype == LCT_GREY || info->colortype == LCT_GREY_ALPHA; +} + +unsigned lodepng_is_alpha_type(const LodePNGColorMode* info) { + return (info->colortype & 4) != 0; /*4 or 6*/ +} + +unsigned lodepng_is_palette_type(const LodePNGColorMode* info) { + return info->colortype == LCT_PALETTE; +} + +unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info) { + size_t i; + for(i = 0; i != info->palettesize; ++i) { + if(info->palette[i * 4 + 3] < 255) return 1; + } + return 0; +} + +unsigned lodepng_can_have_alpha(const LodePNGColorMode* info) { + return info->key_defined + || lodepng_is_alpha_type(info) + || lodepng_has_palette_alpha(info); +} + +static size_t lodepng_get_raw_size_lct(unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) { + size_t bpp = lodepng_get_bpp_lct(colortype, bitdepth); + size_t n = (size_t)w * (size_t)h; + return ((n / 8u) * bpp) + ((n & 7u) * bpp + 7u) / 8u; +} + +size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color) { + return lodepng_get_raw_size_lct(w, h, color->colortype, color->bitdepth); +} + + +#ifdef LODEPNG_COMPILE_PNG + +/*in an idat chunk, each scanline is a multiple of 8 bits, unlike the lodepng output buffer, +and in addition has one extra byte per line: the filter byte. So this gives a larger +result than lodepng_get_raw_size. Set h to 1 to get the size of 1 row including filter byte. */ +static size_t lodepng_get_raw_size_idat(unsigned w, unsigned h, unsigned bpp) { + /* + 1 for the filter byte, and possibly plus padding bits per line. */ + /* Ignoring casts, the expression is equal to (w * bpp + 7) / 8 + 1, but avoids overflow of w * bpp */ + size_t line = ((size_t)(w / 8u) * bpp) + 1u + ((w & 7u) * bpp + 7u) / 8u; + return (size_t)h * line; +} + +#ifdef LODEPNG_COMPILE_DECODER +/*Safely checks whether size_t overflow can be caused due to amount of pixels. +This check is overcautious rather than precise. If this check indicates no overflow, +you can safely compute in a size_t (but not an unsigned): +-(size_t)w * (size_t)h * 8 +-amount of bytes in IDAT (including filter, padding and Adam7 bytes) +-amount of bytes in raw color model +Returns 1 if overflow possible, 0 if not. +*/ +static int lodepng_pixel_overflow(unsigned w, unsigned h, + const LodePNGColorMode* pngcolor, const LodePNGColorMode* rawcolor) { + size_t bpp = LODEPNG_MAX(lodepng_get_bpp(pngcolor), lodepng_get_bpp(rawcolor)); + size_t numpixels, total; + size_t line; /* bytes per line in worst case */ + + if(lodepng_mulofl((size_t)w, (size_t)h, &numpixels)) return 1; + if(lodepng_mulofl(numpixels, 8, &total)) return 1; /* bit pointer with 8-bit color, or 8 bytes per channel color */ + + /* Bytes per scanline with the expression "(w / 8u) * bpp) + ((w & 7u) * bpp + 7u) / 8u" */ + if(lodepng_mulofl((size_t)(w / 8u), bpp, &line)) return 1; + if(lodepng_addofl(line, ((w & 7u) * bpp + 7u) / 8u, &line)) return 1; + + if(lodepng_addofl(line, 5, &line)) return 1; /* 5 bytes overhead per line: 1 filterbyte, 4 for Adam7 worst case */ + if(lodepng_mulofl(line, h, &total)) return 1; /* Total bytes in worst case */ + + return 0; /* no overflow */ +} +#endif /*LODEPNG_COMPILE_DECODER*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + +static void LodePNGUnknownChunks_init(LodePNGInfo* info) { + unsigned i; + for(i = 0; i != 3; ++i) info->unknown_chunks_data[i] = 0; + for(i = 0; i != 3; ++i) info->unknown_chunks_size[i] = 0; +} + +static void LodePNGUnknownChunks_cleanup(LodePNGInfo* info) { + unsigned i; + for(i = 0; i != 3; ++i) lodepng_free(info->unknown_chunks_data[i]); +} + +static unsigned LodePNGUnknownChunks_copy(LodePNGInfo* dest, const LodePNGInfo* src) { + unsigned i; + + LodePNGUnknownChunks_cleanup(dest); + + for(i = 0; i != 3; ++i) { + size_t j; + dest->unknown_chunks_size[i] = src->unknown_chunks_size[i]; + dest->unknown_chunks_data[i] = (unsigned char*)lodepng_malloc(src->unknown_chunks_size[i]); + if(!dest->unknown_chunks_data[i] && dest->unknown_chunks_size[i]) return 83; /*alloc fail*/ + for(j = 0; j < src->unknown_chunks_size[i]; ++j) { + dest->unknown_chunks_data[i][j] = src->unknown_chunks_data[i][j]; + } + } + + return 0; +} + +/******************************************************************************/ + +static void LodePNGText_init(LodePNGInfo* info) { + info->text_num = 0; + info->text_keys = NULL; + info->text_strings = NULL; +} + +static void LodePNGText_cleanup(LodePNGInfo* info) { + size_t i; + for(i = 0; i != info->text_num; ++i) { + string_cleanup(&info->text_keys[i]); + string_cleanup(&info->text_strings[i]); + } + lodepng_free(info->text_keys); + lodepng_free(info->text_strings); +} + +static unsigned LodePNGText_copy(LodePNGInfo* dest, const LodePNGInfo* source) { + size_t i = 0; + dest->text_keys = NULL; + dest->text_strings = NULL; + dest->text_num = 0; + for(i = 0; i != source->text_num; ++i) { + CERROR_TRY_RETURN(lodepng_add_text(dest, source->text_keys[i], source->text_strings[i])); + } + return 0; +} + +static unsigned lodepng_add_text_sized(LodePNGInfo* info, const char* key, const char* str, size_t size) { + char** new_keys = (char**)(lodepng_realloc(info->text_keys, sizeof(char*) * (info->text_num + 1))); + char** new_strings = (char**)(lodepng_realloc(info->text_strings, sizeof(char*) * (info->text_num + 1))); + + if(new_keys) info->text_keys = new_keys; + if(new_strings) info->text_strings = new_strings; + + if(!new_keys || !new_strings) return 83; /*alloc fail*/ + + ++info->text_num; + info->text_keys[info->text_num - 1] = alloc_string(key); + info->text_strings[info->text_num - 1] = alloc_string_sized(str, size); + if(!info->text_keys[info->text_num - 1] || !info->text_strings[info->text_num - 1]) return 83; /*alloc fail*/ + + return 0; +} + +unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str) { + return lodepng_add_text_sized(info, key, str, lodepng_strlen(str)); +} + +void lodepng_clear_text(LodePNGInfo* info) { + LodePNGText_cleanup(info); +} + +/******************************************************************************/ + +static void LodePNGIText_init(LodePNGInfo* info) { + info->itext_num = 0; + info->itext_keys = NULL; + info->itext_langtags = NULL; + info->itext_transkeys = NULL; + info->itext_strings = NULL; +} + +static void LodePNGIText_cleanup(LodePNGInfo* info) { + size_t i; + for(i = 0; i != info->itext_num; ++i) { + string_cleanup(&info->itext_keys[i]); + string_cleanup(&info->itext_langtags[i]); + string_cleanup(&info->itext_transkeys[i]); + string_cleanup(&info->itext_strings[i]); + } + lodepng_free(info->itext_keys); + lodepng_free(info->itext_langtags); + lodepng_free(info->itext_transkeys); + lodepng_free(info->itext_strings); +} + +static unsigned LodePNGIText_copy(LodePNGInfo* dest, const LodePNGInfo* source) { + size_t i = 0; + dest->itext_keys = NULL; + dest->itext_langtags = NULL; + dest->itext_transkeys = NULL; + dest->itext_strings = NULL; + dest->itext_num = 0; + for(i = 0; i != source->itext_num; ++i) { + CERROR_TRY_RETURN(lodepng_add_itext(dest, source->itext_keys[i], source->itext_langtags[i], + source->itext_transkeys[i], source->itext_strings[i])); + } + return 0; +} + +void lodepng_clear_itext(LodePNGInfo* info) { + LodePNGIText_cleanup(info); +} + +static unsigned lodepng_add_itext_sized(LodePNGInfo* info, const char* key, const char* langtag, + const char* transkey, const char* str, size_t size) { + char** new_keys = (char**)(lodepng_realloc(info->itext_keys, sizeof(char*) * (info->itext_num + 1))); + char** new_langtags = (char**)(lodepng_realloc(info->itext_langtags, sizeof(char*) * (info->itext_num + 1))); + char** new_transkeys = (char**)(lodepng_realloc(info->itext_transkeys, sizeof(char*) * (info->itext_num + 1))); + char** new_strings = (char**)(lodepng_realloc(info->itext_strings, sizeof(char*) * (info->itext_num + 1))); + + if(new_keys) info->itext_keys = new_keys; + if(new_langtags) info->itext_langtags = new_langtags; + if(new_transkeys) info->itext_transkeys = new_transkeys; + if(new_strings) info->itext_strings = new_strings; + + if(!new_keys || !new_langtags || !new_transkeys || !new_strings) return 83; /*alloc fail*/ + + ++info->itext_num; + + info->itext_keys[info->itext_num - 1] = alloc_string(key); + info->itext_langtags[info->itext_num - 1] = alloc_string(langtag); + info->itext_transkeys[info->itext_num - 1] = alloc_string(transkey); + info->itext_strings[info->itext_num - 1] = alloc_string_sized(str, size); + + return 0; +} + +unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag, + const char* transkey, const char* str) { + return lodepng_add_itext_sized(info, key, langtag, transkey, str, lodepng_strlen(str)); +} + +/* same as set but does not delete */ +static unsigned lodepng_assign_icc(LodePNGInfo* info, const char* name, const unsigned char* profile, unsigned profile_size) { + if(profile_size == 0) return 100; /*invalid ICC profile size*/ + + info->iccp_name = alloc_string(name); + info->iccp_profile = (unsigned char*)lodepng_malloc(profile_size); + + if(!info->iccp_name || !info->iccp_profile) return 83; /*alloc fail*/ + + lodepng_memcpy(info->iccp_profile, profile, profile_size); + info->iccp_profile_size = profile_size; + + return 0; /*ok*/ +} + +unsigned lodepng_set_icc(LodePNGInfo* info, const char* name, const unsigned char* profile, unsigned profile_size) { + if(info->iccp_name) lodepng_clear_icc(info); + info->iccp_defined = 1; + + return lodepng_assign_icc(info, name, profile, profile_size); +} + +void lodepng_clear_icc(LodePNGInfo* info) { + string_cleanup(&info->iccp_name); + lodepng_free(info->iccp_profile); + info->iccp_profile = NULL; + info->iccp_profile_size = 0; + info->iccp_defined = 0; +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +void lodepng_info_init(LodePNGInfo* info) { + lodepng_color_mode_init(&info->color); + info->interlace_method = 0; + info->compression_method = 0; + info->filter_method = 0; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + info->background_defined = 0; + info->background_r = info->background_g = info->background_b = 0; + + LodePNGText_init(info); + LodePNGIText_init(info); + + info->time_defined = 0; + info->phys_defined = 0; + + info->gama_defined = 0; + info->chrm_defined = 0; + info->srgb_defined = 0; + info->iccp_defined = 0; + info->iccp_name = NULL; + info->iccp_profile = NULL; + + LodePNGUnknownChunks_init(info); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} + +void lodepng_info_cleanup(LodePNGInfo* info) { + lodepng_color_mode_cleanup(&info->color); +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + LodePNGText_cleanup(info); + LodePNGIText_cleanup(info); + + lodepng_clear_icc(info); + + LodePNGUnknownChunks_cleanup(info); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} + +unsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source) { + lodepng_info_cleanup(dest); + lodepng_memcpy(dest, source, sizeof(LodePNGInfo)); + lodepng_color_mode_init(&dest->color); + CERROR_TRY_RETURN(lodepng_color_mode_copy(&dest->color, &source->color)); + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + CERROR_TRY_RETURN(LodePNGText_copy(dest, source)); + CERROR_TRY_RETURN(LodePNGIText_copy(dest, source)); + if(source->iccp_defined) { + CERROR_TRY_RETURN(lodepng_assign_icc(dest, source->iccp_name, source->iccp_profile, source->iccp_profile_size)); + } + + LodePNGUnknownChunks_init(dest); + CERROR_TRY_RETURN(LodePNGUnknownChunks_copy(dest, source)); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + return 0; +} + +/* ////////////////////////////////////////////////////////////////////////// */ + +/*index: bitgroup index, bits: bitgroup size(1, 2 or 4), in: bitgroup value, out: octet array to add bits to*/ +static void addColorBits(unsigned char* out, size_t index, unsigned bits, unsigned in) { + unsigned m = bits == 1 ? 7 : bits == 2 ? 3 : 1; /*8 / bits - 1*/ + /*p = the partial index in the byte, e.g. with 4 palettebits it is 0 for first half or 1 for second half*/ + unsigned p = index & m; + in &= (1u << bits) - 1u; /*filter out any other bits of the input value*/ + in = in << (bits * (m - p)); + if(p == 0) out[index * bits / 8u] = in; + else out[index * bits / 8u] |= in; +} + +typedef struct ColorTree ColorTree; + +/* +One node of a color tree +This is the data structure used to count the number of unique colors and to get a palette +index for a color. It's like an octree, but because the alpha channel is used too, each +node has 16 instead of 8 children. +*/ +struct ColorTree { + ColorTree* children[16]; /*up to 16 pointers to ColorTree of next level*/ + int index; /*the payload. Only has a meaningful value if this is in the last level*/ +}; + +static void color_tree_init(ColorTree* tree) { + lodepng_memset(tree->children, 0, 16 * sizeof(*tree->children)); + tree->index = -1; +} + +static void color_tree_cleanup(ColorTree* tree) { + int i; + for(i = 0; i != 16; ++i) { + if(tree->children[i]) { + color_tree_cleanup(tree->children[i]); + lodepng_free(tree->children[i]); + } + } +} + +/*returns -1 if color not present, its index otherwise*/ +static int color_tree_get(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) { + int bit = 0; + for(bit = 0; bit < 8; ++bit) { + int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); + if(!tree->children[i]) return -1; + else tree = tree->children[i]; + } + return tree ? tree->index : -1; +} + +#ifdef LODEPNG_COMPILE_ENCODER +static int color_tree_has(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) { + return color_tree_get(tree, r, g, b, a) >= 0; +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/*color is not allowed to already exist. +Index should be >= 0 (it's signed to be compatible with using -1 for "doesn't exist") +Returns error code, or 0 if ok*/ +static unsigned color_tree_add(ColorTree* tree, + unsigned char r, unsigned char g, unsigned char b, unsigned char a, unsigned index) { + int bit; + for(bit = 0; bit < 8; ++bit) { + int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); + if(!tree->children[i]) { + tree->children[i] = (ColorTree*)lodepng_malloc(sizeof(ColorTree)); + if(!tree->children[i]) return 83; /*alloc fail*/ + color_tree_init(tree->children[i]); + } + tree = tree->children[i]; + } + tree->index = (int)index; + return 0; +} + +/*put a pixel, given its RGBA color, into image of any color type*/ +static unsigned rgba8ToPixel(unsigned char* out, size_t i, + const LodePNGColorMode* mode, ColorTree* tree /*for palette*/, + unsigned char r, unsigned char g, unsigned char b, unsigned char a) { + if(mode->colortype == LCT_GREY) { + unsigned char gray = r; /*((unsigned short)r + g + b) / 3u;*/ + if(mode->bitdepth == 8) out[i] = gray; + else if(mode->bitdepth == 16) out[i * 2 + 0] = out[i * 2 + 1] = gray; + else { + /*take the most significant bits of gray*/ + gray = ((unsigned)gray >> (8u - mode->bitdepth)) & ((1u << mode->bitdepth) - 1u); + addColorBits(out, i, mode->bitdepth, gray); + } + } else if(mode->colortype == LCT_RGB) { + if(mode->bitdepth == 8) { + out[i * 3 + 0] = r; + out[i * 3 + 1] = g; + out[i * 3 + 2] = b; + } else { + out[i * 6 + 0] = out[i * 6 + 1] = r; + out[i * 6 + 2] = out[i * 6 + 3] = g; + out[i * 6 + 4] = out[i * 6 + 5] = b; + } + } else if(mode->colortype == LCT_PALETTE) { + int index = color_tree_get(tree, r, g, b, a); + if(index < 0) return 82; /*color not in palette*/ + if(mode->bitdepth == 8) out[i] = index; + else addColorBits(out, i, mode->bitdepth, (unsigned)index); + } else if(mode->colortype == LCT_GREY_ALPHA) { + unsigned char gray = r; /*((unsigned short)r + g + b) / 3u;*/ + if(mode->bitdepth == 8) { + out[i * 2 + 0] = gray; + out[i * 2 + 1] = a; + } else if(mode->bitdepth == 16) { + out[i * 4 + 0] = out[i * 4 + 1] = gray; + out[i * 4 + 2] = out[i * 4 + 3] = a; + } + } else if(mode->colortype == LCT_RGBA) { + if(mode->bitdepth == 8) { + out[i * 4 + 0] = r; + out[i * 4 + 1] = g; + out[i * 4 + 2] = b; + out[i * 4 + 3] = a; + } else { + out[i * 8 + 0] = out[i * 8 + 1] = r; + out[i * 8 + 2] = out[i * 8 + 3] = g; + out[i * 8 + 4] = out[i * 8 + 5] = b; + out[i * 8 + 6] = out[i * 8 + 7] = a; + } + } + + return 0; /*no error*/ +} + +/*put a pixel, given its RGBA16 color, into image of any color 16-bitdepth type*/ +static void rgba16ToPixel(unsigned char* out, size_t i, + const LodePNGColorMode* mode, + unsigned short r, unsigned short g, unsigned short b, unsigned short a) { + if(mode->colortype == LCT_GREY) { + unsigned short gray = r; /*((unsigned)r + g + b) / 3u;*/ + out[i * 2 + 0] = (gray >> 8) & 255; + out[i * 2 + 1] = gray & 255; + } else if(mode->colortype == LCT_RGB) { + out[i * 6 + 0] = (r >> 8) & 255; + out[i * 6 + 1] = r & 255; + out[i * 6 + 2] = (g >> 8) & 255; + out[i * 6 + 3] = g & 255; + out[i * 6 + 4] = (b >> 8) & 255; + out[i * 6 + 5] = b & 255; + } else if(mode->colortype == LCT_GREY_ALPHA) { + unsigned short gray = r; /*((unsigned)r + g + b) / 3u;*/ + out[i * 4 + 0] = (gray >> 8) & 255; + out[i * 4 + 1] = gray & 255; + out[i * 4 + 2] = (a >> 8) & 255; + out[i * 4 + 3] = a & 255; + } else if(mode->colortype == LCT_RGBA) { + out[i * 8 + 0] = (r >> 8) & 255; + out[i * 8 + 1] = r & 255; + out[i * 8 + 2] = (g >> 8) & 255; + out[i * 8 + 3] = g & 255; + out[i * 8 + 4] = (b >> 8) & 255; + out[i * 8 + 5] = b & 255; + out[i * 8 + 6] = (a >> 8) & 255; + out[i * 8 + 7] = a & 255; + } +} + +/*Get RGBA8 color of pixel with index i (y * width + x) from the raw image with given color type.*/ +static void getPixelColorRGBA8(unsigned char* r, unsigned char* g, + unsigned char* b, unsigned char* a, + const unsigned char* in, size_t i, + const LodePNGColorMode* mode) { + if(mode->colortype == LCT_GREY) { + if(mode->bitdepth == 8) { + *r = *g = *b = in[i]; + if(mode->key_defined && *r == mode->key_r) *a = 0; + else *a = 255; + } else if(mode->bitdepth == 16) { + *r = *g = *b = in[i * 2 + 0]; + if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; + else *a = 255; + } else { + unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ + size_t j = i * mode->bitdepth; + unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); + *r = *g = *b = (value * 255) / highest; + if(mode->key_defined && value == mode->key_r) *a = 0; + else *a = 255; + } + } else if(mode->colortype == LCT_RGB) { + if(mode->bitdepth == 8) { + *r = in[i * 3 + 0]; *g = in[i * 3 + 1]; *b = in[i * 3 + 2]; + if(mode->key_defined && *r == mode->key_r && *g == mode->key_g && *b == mode->key_b) *a = 0; + else *a = 255; + } else { + *r = in[i * 6 + 0]; + *g = in[i * 6 + 2]; + *b = in[i * 6 + 4]; + if(mode->key_defined && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r + && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g + && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; + else *a = 255; + } + } else if(mode->colortype == LCT_PALETTE) { + unsigned index; + if(mode->bitdepth == 8) index = in[i]; + else { + size_t j = i * mode->bitdepth; + index = readBitsFromReversedStream(&j, in, mode->bitdepth); + } + /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ + *r = mode->palette[index * 4 + 0]; + *g = mode->palette[index * 4 + 1]; + *b = mode->palette[index * 4 + 2]; + *a = mode->palette[index * 4 + 3]; + } else if(mode->colortype == LCT_GREY_ALPHA) { + if(mode->bitdepth == 8) { + *r = *g = *b = in[i * 2 + 0]; + *a = in[i * 2 + 1]; + } else { + *r = *g = *b = in[i * 4 + 0]; + *a = in[i * 4 + 2]; + } + } else if(mode->colortype == LCT_RGBA) { + if(mode->bitdepth == 8) { + *r = in[i * 4 + 0]; + *g = in[i * 4 + 1]; + *b = in[i * 4 + 2]; + *a = in[i * 4 + 3]; + } else { + *r = in[i * 8 + 0]; + *g = in[i * 8 + 2]; + *b = in[i * 8 + 4]; + *a = in[i * 8 + 6]; + } + } +} + +/*Similar to getPixelColorRGBA8, but with all the for loops inside of the color +mode test cases, optimized to convert the colors much faster, when converting +to the common case of RGBA with 8 bit per channel. buffer must be RGBA with +enough memory.*/ +static void getPixelColorsRGBA8(unsigned char* LODEPNG_RESTRICT buffer, size_t numpixels, + const unsigned char* LODEPNG_RESTRICT in, + const LodePNGColorMode* mode) { + unsigned num_channels = 4; + size_t i; + if(mode->colortype == LCT_GREY) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i]; + buffer[3] = 255; + } + if(mode->key_defined) { + buffer -= numpixels * num_channels; + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + if(buffer[0] == mode->key_r) buffer[3] = 0; + } + } + } else if(mode->bitdepth == 16) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i * 2]; + buffer[3] = mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r ? 0 : 255; + } + } else { + unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ + size_t j = 0; + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); + buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest; + buffer[3] = mode->key_defined && value == mode->key_r ? 0 : 255; + } + } + } else if(mode->colortype == LCT_RGB) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + lodepng_memcpy(buffer, &in[i * 3], 3); + buffer[3] = 255; + } + if(mode->key_defined) { + buffer -= numpixels * num_channels; + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + if(buffer[0] == mode->key_r && buffer[1]== mode->key_g && buffer[2] == mode->key_b) buffer[3] = 0; + } + } + } else { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = in[i * 6 + 0]; + buffer[1] = in[i * 6 + 2]; + buffer[2] = in[i * 6 + 4]; + buffer[3] = mode->key_defined + && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r + && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g + && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b ? 0 : 255; + } + } + } else if(mode->colortype == LCT_PALETTE) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + unsigned index = in[i]; + /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ + lodepng_memcpy(buffer, &mode->palette[index * 4], 4); + } + } else { + size_t j = 0; + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + unsigned index = readBitsFromReversedStream(&j, in, mode->bitdepth); + /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ + lodepng_memcpy(buffer, &mode->palette[index * 4], 4); + } + } + } else if(mode->colortype == LCT_GREY_ALPHA) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0]; + buffer[3] = in[i * 2 + 1]; + } + } else { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0]; + buffer[3] = in[i * 4 + 2]; + } + } + } else if(mode->colortype == LCT_RGBA) { + if(mode->bitdepth == 8) { + lodepng_memcpy(buffer, in, numpixels * 4); + } else { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = in[i * 8 + 0]; + buffer[1] = in[i * 8 + 2]; + buffer[2] = in[i * 8 + 4]; + buffer[3] = in[i * 8 + 6]; + } + } + } +} + +/*Similar to getPixelColorsRGBA8, but with 3-channel RGB output.*/ +static void getPixelColorsRGB8(unsigned char* LODEPNG_RESTRICT buffer, size_t numpixels, + const unsigned char* LODEPNG_RESTRICT in, + const LodePNGColorMode* mode) { + const unsigned num_channels = 3; + size_t i; + if(mode->colortype == LCT_GREY) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i]; + } + } else if(mode->bitdepth == 16) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i * 2]; + } + } else { + unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ + size_t j = 0; + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); + buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest; + } + } + } else if(mode->colortype == LCT_RGB) { + if(mode->bitdepth == 8) { + lodepng_memcpy(buffer, in, numpixels * 3); + } else { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = in[i * 6 + 0]; + buffer[1] = in[i * 6 + 2]; + buffer[2] = in[i * 6 + 4]; + } + } + } else if(mode->colortype == LCT_PALETTE) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + unsigned index = in[i]; + /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ + lodepng_memcpy(buffer, &mode->palette[index * 4], 3); + } + } else { + size_t j = 0; + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + unsigned index = readBitsFromReversedStream(&j, in, mode->bitdepth); + /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ + lodepng_memcpy(buffer, &mode->palette[index * 4], 3); + } + } + } else if(mode->colortype == LCT_GREY_ALPHA) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0]; + } + } else { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0]; + } + } + } else if(mode->colortype == LCT_RGBA) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + lodepng_memcpy(buffer, &in[i * 4], 3); + } + } else { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = in[i * 8 + 0]; + buffer[1] = in[i * 8 + 2]; + buffer[2] = in[i * 8 + 4]; + } + } + } +} + +/*Get RGBA16 color of pixel with index i (y * width + x) from the raw image with +given color type, but the given color type must be 16-bit itself.*/ +static void getPixelColorRGBA16(unsigned short* r, unsigned short* g, unsigned short* b, unsigned short* a, + const unsigned char* in, size_t i, const LodePNGColorMode* mode) { + if(mode->colortype == LCT_GREY) { + *r = *g = *b = 256 * in[i * 2 + 0] + in[i * 2 + 1]; + if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; + else *a = 65535; + } else if(mode->colortype == LCT_RGB) { + *r = 256u * in[i * 6 + 0] + in[i * 6 + 1]; + *g = 256u * in[i * 6 + 2] + in[i * 6 + 3]; + *b = 256u * in[i * 6 + 4] + in[i * 6 + 5]; + if(mode->key_defined + && 256u * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r + && 256u * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g + && 256u * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; + else *a = 65535; + } else if(mode->colortype == LCT_GREY_ALPHA) { + *r = *g = *b = 256u * in[i * 4 + 0] + in[i * 4 + 1]; + *a = 256u * in[i * 4 + 2] + in[i * 4 + 3]; + } else if(mode->colortype == LCT_RGBA) { + *r = 256u * in[i * 8 + 0] + in[i * 8 + 1]; + *g = 256u * in[i * 8 + 2] + in[i * 8 + 3]; + *b = 256u * in[i * 8 + 4] + in[i * 8 + 5]; + *a = 256u * in[i * 8 + 6] + in[i * 8 + 7]; + } +} + +unsigned lodepng_convert(unsigned char* out, const unsigned char* in, + const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in, + unsigned w, unsigned h) { + size_t i; + ColorTree tree; + size_t numpixels = (size_t)w * (size_t)h; + unsigned error = 0; + + if(mode_in->colortype == LCT_PALETTE && !mode_in->palette) { + return 107; /* error: must provide palette if input mode is palette */ + } + + if(lodepng_color_mode_equal(mode_out, mode_in)) { + size_t numbytes = lodepng_get_raw_size(w, h, mode_in); + lodepng_memcpy(out, in, numbytes); + return 0; + } + + if(mode_out->colortype == LCT_PALETTE) { + size_t palettesize = mode_out->palettesize; + const unsigned char* palette = mode_out->palette; + size_t palsize = (size_t)1u << mode_out->bitdepth; + /*if the user specified output palette but did not give the values, assume + they want the values of the input color type (assuming that one is palette). + Note that we never create a new palette ourselves.*/ + if(palettesize == 0) { + palettesize = mode_in->palettesize; + palette = mode_in->palette; + /*if the input was also palette with same bitdepth, then the color types are also + equal, so copy literally. This to preserve the exact indices that were in the PNG + even in case there are duplicate colors in the palette.*/ + if(mode_in->colortype == LCT_PALETTE && mode_in->bitdepth == mode_out->bitdepth) { + size_t numbytes = lodepng_get_raw_size(w, h, mode_in); + lodepng_memcpy(out, in, numbytes); + return 0; + } + } + if(palettesize < palsize) palsize = palettesize; + color_tree_init(&tree); + for(i = 0; i != palsize; ++i) { + const unsigned char* p = &palette[i * 4]; + error = color_tree_add(&tree, p[0], p[1], p[2], p[3], (unsigned)i); + if(error) break; + } + } + + if(!error) { + if(mode_in->bitdepth == 16 && mode_out->bitdepth == 16) { + for(i = 0; i != numpixels; ++i) { + unsigned short r = 0, g = 0, b = 0, a = 0; + getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); + rgba16ToPixel(out, i, mode_out, r, g, b, a); + } + } else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGBA) { + getPixelColorsRGBA8(out, numpixels, in, mode_in); + } else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGB) { + getPixelColorsRGB8(out, numpixels, in, mode_in); + } else { + unsigned char r = 0, g = 0, b = 0, a = 0; + for(i = 0; i != numpixels; ++i) { + getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); + error = rgba8ToPixel(out, i, mode_out, &tree, r, g, b, a); + if(error) break; + } + } + } + + if(mode_out->colortype == LCT_PALETTE) { + color_tree_cleanup(&tree); + } + + return error; +} + + +/* Converts a single rgb color without alpha from one type to another, color bits truncated to +their bitdepth. In case of single channel (gray or palette), only the r channel is used. Slow +function, do not use to process all pixels of an image. Alpha channel not supported on purpose: +this is for bKGD, supporting alpha may prevent it from finding a color in the palette, from the +specification it looks like bKGD should ignore the alpha values of the palette since it can use +any palette index but doesn't have an alpha channel. Idem with ignoring color key. */ +static unsigned lodepng_convert_rgb( + unsigned* r_out, unsigned* g_out, unsigned* b_out, + unsigned r_in, unsigned g_in, unsigned b_in, + const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in) { + unsigned r = 0, g = 0, b = 0; + unsigned mul = 65535 / ((1u << mode_in->bitdepth) - 1u); /*65535, 21845, 4369, 257, 1*/ + unsigned shift = 16 - mode_out->bitdepth; + + if(mode_in->colortype == LCT_GREY || mode_in->colortype == LCT_GREY_ALPHA) { + r = g = b = r_in * mul; + } else if(mode_in->colortype == LCT_RGB || mode_in->colortype == LCT_RGBA) { + r = r_in * mul; + g = g_in * mul; + b = b_in * mul; + } else if(mode_in->colortype == LCT_PALETTE) { + if(r_in >= mode_in->palettesize) return 82; + r = mode_in->palette[r_in * 4 + 0] * 257u; + g = mode_in->palette[r_in * 4 + 1] * 257u; + b = mode_in->palette[r_in * 4 + 2] * 257u; + } else { + return 31; + } + + /* now convert to output format */ + if(mode_out->colortype == LCT_GREY || mode_out->colortype == LCT_GREY_ALPHA) { + *r_out = r >> shift ; + } else if(mode_out->colortype == LCT_RGB || mode_out->colortype == LCT_RGBA) { + *r_out = r >> shift ; + *g_out = g >> shift ; + *b_out = b >> shift ; + } else if(mode_out->colortype == LCT_PALETTE) { + unsigned i; + /* a 16-bit color cannot be in the palette */ + if((r >> 8) != (r & 255) || (g >> 8) != (g & 255) || (b >> 8) != (b & 255)) return 82; + for(i = 0; i < mode_out->palettesize; i++) { + unsigned j = i * 4; + if((r >> 8) == mode_out->palette[j + 0] && (g >> 8) == mode_out->palette[j + 1] && + (b >> 8) == mode_out->palette[j + 2]) { + *r_out = i; + return 0; + } + } + return 82; + } else { + return 31; + } + + return 0; +} + +#ifdef LODEPNG_COMPILE_ENCODER + +void lodepng_color_stats_init(LodePNGColorStats* stats) { + /*stats*/ + stats->colored = 0; + stats->key = 0; + stats->key_r = stats->key_g = stats->key_b = 0; + stats->alpha = 0; + stats->numcolors = 0; + stats->bits = 1; + stats->numpixels = 0; + /*settings*/ + stats->allow_palette = 1; + stats->allow_greyscale = 1; +} + +/*function used for debug purposes with C++*/ +/*void printColorStats(LodePNGColorStats* p) { + std::cout << "colored: " << (int)p->colored << ", "; + std::cout << "key: " << (int)p->key << ", "; + std::cout << "key_r: " << (int)p->key_r << ", "; + std::cout << "key_g: " << (int)p->key_g << ", "; + std::cout << "key_b: " << (int)p->key_b << ", "; + std::cout << "alpha: " << (int)p->alpha << ", "; + std::cout << "numcolors: " << (int)p->numcolors << ", "; + std::cout << "bits: " << (int)p->bits << std::endl; +}*/ + +/*Returns how many bits needed to represent given value (max 8 bit)*/ +static unsigned getValueRequiredBits(unsigned char value) { + if(value == 0 || value == 255) return 1; + /*The scaling of 2-bit and 4-bit values uses multiples of 85 and 17*/ + if(value % 17 == 0) return value % 85 == 0 ? 2 : 4; + return 8; +} + +/*stats must already have been inited. */ +unsigned lodepng_compute_color_stats(LodePNGColorStats* stats, + const unsigned char* in, unsigned w, unsigned h, + const LodePNGColorMode* mode_in) { + size_t i; + ColorTree tree; + size_t numpixels = (size_t)w * (size_t)h; + unsigned error = 0; + + /* mark things as done already if it would be impossible to have a more expensive case */ + unsigned colored_done = lodepng_is_greyscale_type(mode_in) ? 1 : 0; + unsigned alpha_done = lodepng_can_have_alpha(mode_in) ? 0 : 1; + unsigned numcolors_done = 0; + unsigned bpp = lodepng_get_bpp(mode_in); + unsigned bits_done = (stats->bits == 1 && bpp == 1) ? 1 : 0; + unsigned sixteen = 0; /* whether the input image is 16 bit */ + unsigned maxnumcolors = 257; + if(bpp <= 8) maxnumcolors = LODEPNG_MIN(257, stats->numcolors + (1u << bpp)); + + stats->numpixels += numpixels; + + /*if palette not allowed, no need to compute numcolors*/ + if(!stats->allow_palette) numcolors_done = 1; + + color_tree_init(&tree); + + /*If the stats was already filled in from previous data, fill its palette in tree + and mark things as done already if we know they are the most expensive case already*/ + if(stats->alpha) alpha_done = 1; + if(stats->colored) colored_done = 1; + if(stats->bits == 16) numcolors_done = 1; + if(stats->bits >= bpp) bits_done = 1; + if(stats->numcolors >= maxnumcolors) numcolors_done = 1; + + if(!numcolors_done) { + for(i = 0; i < stats->numcolors; i++) { + const unsigned char* color = &stats->palette[i * 4]; + error = color_tree_add(&tree, color[0], color[1], color[2], color[3], i); + if(error) goto cleanup; + } + } + + /*Check if the 16-bit input is truly 16-bit*/ + if(mode_in->bitdepth == 16 && !sixteen) { + unsigned short r = 0, g = 0, b = 0, a = 0; + for(i = 0; i != numpixels; ++i) { + getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); + if((r & 255) != ((r >> 8) & 255) || (g & 255) != ((g >> 8) & 255) || + (b & 255) != ((b >> 8) & 255) || (a & 255) != ((a >> 8) & 255)) /*first and second byte differ*/ { + stats->bits = 16; + sixteen = 1; + bits_done = 1; + numcolors_done = 1; /*counting colors no longer useful, palette doesn't support 16-bit*/ + break; + } + } + } + + if(sixteen) { + unsigned short r = 0, g = 0, b = 0, a = 0; + + for(i = 0; i != numpixels; ++i) { + getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); + + if(!colored_done && (r != g || r != b)) { + stats->colored = 1; + colored_done = 1; + } + + if(!alpha_done) { + unsigned matchkey = (r == stats->key_r && g == stats->key_g && b == stats->key_b); + if(a != 65535 && (a != 0 || (stats->key && !matchkey))) { + stats->alpha = 1; + stats->key = 0; + alpha_done = 1; + } else if(a == 0 && !stats->alpha && !stats->key) { + stats->key = 1; + stats->key_r = r; + stats->key_g = g; + stats->key_b = b; + } else if(a == 65535 && stats->key && matchkey) { + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + stats->alpha = 1; + stats->key = 0; + alpha_done = 1; + } + } + if(alpha_done && numcolors_done && colored_done && bits_done) break; + } + + if(stats->key && !stats->alpha) { + for(i = 0; i != numpixels; ++i) { + getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); + if(a != 0 && r == stats->key_r && g == stats->key_g && b == stats->key_b) { + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + stats->alpha = 1; + stats->key = 0; + alpha_done = 1; + } + } + } + } else /* < 16-bit */ { + unsigned char r = 0, g = 0, b = 0, a = 0; + for(i = 0; i != numpixels; ++i) { + getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); + + if(!bits_done && stats->bits < 8) { + /*only r is checked, < 8 bits is only relevant for grayscale*/ + unsigned bits = getValueRequiredBits(r); + if(bits > stats->bits) stats->bits = bits; + } + bits_done = (stats->bits >= bpp); + + if(!colored_done && (r != g || r != b)) { + stats->colored = 1; + colored_done = 1; + if(stats->bits < 8) stats->bits = 8; /*PNG has no colored modes with less than 8-bit per channel*/ + } + + if(!alpha_done) { + unsigned matchkey = (r == stats->key_r && g == stats->key_g && b == stats->key_b); + if(a != 255 && (a != 0 || (stats->key && !matchkey))) { + stats->alpha = 1; + stats->key = 0; + alpha_done = 1; + if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ + } else if(a == 0 && !stats->alpha && !stats->key) { + stats->key = 1; + stats->key_r = r; + stats->key_g = g; + stats->key_b = b; + } else if(a == 255 && stats->key && matchkey) { + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + stats->alpha = 1; + stats->key = 0; + alpha_done = 1; + if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ + } + } + + if(!numcolors_done) { + if(!color_tree_has(&tree, r, g, b, a)) { + error = color_tree_add(&tree, r, g, b, a, stats->numcolors); + if(error) goto cleanup; + if(stats->numcolors < 256) { + unsigned char* p = stats->palette; + unsigned n = stats->numcolors; + p[n * 4 + 0] = r; + p[n * 4 + 1] = g; + p[n * 4 + 2] = b; + p[n * 4 + 3] = a; + } + ++stats->numcolors; + numcolors_done = stats->numcolors >= maxnumcolors; + } + } + + if(alpha_done && numcolors_done && colored_done && bits_done) break; + } + + if(stats->key && !stats->alpha) { + for(i = 0; i != numpixels; ++i) { + getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); + if(a != 0 && r == stats->key_r && g == stats->key_g && b == stats->key_b) { + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + stats->alpha = 1; + stats->key = 0; + alpha_done = 1; + if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ + } + } + } + + /*make the stats's key always 16-bit for consistency - repeat each byte twice*/ + stats->key_r += (stats->key_r << 8); + stats->key_g += (stats->key_g << 8); + stats->key_b += (stats->key_b << 8); + } + +cleanup: + color_tree_cleanup(&tree); + return error; +} + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +/*Adds a single color to the color stats. The stats must already have been inited. The color must be given as 16-bit +(with 2 bytes repeating for 8-bit and 65535 for opaque alpha channel). This function is expensive, do not call it for +all pixels of an image but only for a few additional values. */ +static unsigned lodepng_color_stats_add(LodePNGColorStats* stats, + unsigned r, unsigned g, unsigned b, unsigned a) { + unsigned error = 0; + unsigned char image[8]; + LodePNGColorMode mode; + lodepng_color_mode_init(&mode); + image[0] = r >> 8; image[1] = r; image[2] = g >> 8; image[3] = g; + image[4] = b >> 8; image[5] = b; image[6] = a >> 8; image[7] = a; + mode.bitdepth = 16; + mode.colortype = LCT_RGBA; + error = lodepng_compute_color_stats(stats, image, 1, 1, &mode); + lodepng_color_mode_cleanup(&mode); + return error; +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +/*Computes a minimal PNG color model that can contain all colors as indicated by the stats. +The stats should be computed with lodepng_compute_color_stats. +mode_in is raw color profile of the image the stats were computed on, to copy palette order from when relevant. +Minimal PNG color model means the color type and bit depth that gives smallest amount of bits in the output image, +e.g. gray if only grayscale pixels, palette if less than 256 colors, color key if only single transparent color, ... +This is used if auto_convert is enabled (it is by default). +*/ +static unsigned auto_choose_color(LodePNGColorMode* mode_out, + const LodePNGColorMode* mode_in, + const LodePNGColorStats* stats) { + unsigned error = 0; + unsigned palettebits; + size_t i, n; + size_t numpixels = stats->numpixels; + unsigned palette_ok, gray_ok; + + unsigned alpha = stats->alpha; + unsigned key = stats->key; + unsigned bits = stats->bits; + + mode_out->key_defined = 0; + + if(key && numpixels <= 16) { + alpha = 1; /*too few pixels to justify tRNS chunk overhead*/ + key = 0; + if(bits < 8) bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ + } + + gray_ok = !stats->colored; + if(!stats->allow_greyscale) gray_ok = 0; + if(!gray_ok && bits < 8) bits = 8; + + n = stats->numcolors; + palettebits = n <= 2 ? 1 : (n <= 4 ? 2 : (n <= 16 ? 4 : 8)); + palette_ok = n <= 256 && bits <= 8 && n != 0; /*n==0 means likely numcolors wasn't computed*/ + if(numpixels < n * 2) palette_ok = 0; /*don't add palette overhead if image has only a few pixels*/ + if(gray_ok && !alpha && bits <= palettebits) palette_ok = 0; /*gray is less overhead*/ + if(!stats->allow_palette) palette_ok = 0; + + if(palette_ok) { + const unsigned char* p = stats->palette; + lodepng_palette_clear(mode_out); /*remove potential earlier palette*/ + for(i = 0; i != stats->numcolors; ++i) { + error = lodepng_palette_add(mode_out, p[i * 4 + 0], p[i * 4 + 1], p[i * 4 + 2], p[i * 4 + 3]); + if(error) break; + } + + mode_out->colortype = LCT_PALETTE; + mode_out->bitdepth = palettebits; + + if(mode_in->colortype == LCT_PALETTE && mode_in->palettesize >= mode_out->palettesize + && mode_in->bitdepth == mode_out->bitdepth) { + /*If input should have same palette colors, keep original to preserve its order and prevent conversion*/ + lodepng_color_mode_cleanup(mode_out); + lodepng_color_mode_copy(mode_out, mode_in); + } + } else /*8-bit or 16-bit per channel*/ { + mode_out->bitdepth = bits; + mode_out->colortype = alpha ? (gray_ok ? LCT_GREY_ALPHA : LCT_RGBA) + : (gray_ok ? LCT_GREY : LCT_RGB); + if(key) { + unsigned mask = (1u << mode_out->bitdepth) - 1u; /*stats always uses 16-bit, mask converts it*/ + mode_out->key_r = stats->key_r & mask; + mode_out->key_g = stats->key_g & mask; + mode_out->key_b = stats->key_b & mask; + mode_out->key_defined = 1; + } + } + + return error; +} + +#endif /* #ifdef LODEPNG_COMPILE_ENCODER */ + +/* +Paeth predictor, used by PNG filter type 4 +The parameters are of type short, but should come from unsigned chars, the shorts +are only needed to make the paeth calculation correct. +*/ +static unsigned char paethPredictor(short a, short b, short c) { + short pa = LODEPNG_ABS(b - c); + short pb = LODEPNG_ABS(a - c); + short pc = LODEPNG_ABS(a + b - c - c); + /* return input value associated with smallest of pa, pb, pc (with certain priority if equal) */ + if(pb < pa) { a = b; pa = pb; } + return (pc < pa) ? c : a; +} + +/*shared values used by multiple Adam7 related functions*/ + +static const unsigned ADAM7_IX[7] = { 0, 4, 0, 2, 0, 1, 0 }; /*x start values*/ +static const unsigned ADAM7_IY[7] = { 0, 0, 4, 0, 2, 0, 1 }; /*y start values*/ +static const unsigned ADAM7_DX[7] = { 8, 8, 4, 4, 2, 2, 1 }; /*x delta values*/ +static const unsigned ADAM7_DY[7] = { 8, 8, 8, 4, 4, 2, 2 }; /*y delta values*/ + +/* +Outputs various dimensions and positions in the image related to the Adam7 reduced images. +passw: output containing the width of the 7 passes +passh: output containing the height of the 7 passes +filter_passstart: output containing the index of the start and end of each + reduced image with filter bytes +padded_passstart output containing the index of the start and end of each + reduced image when without filter bytes but with padded scanlines +passstart: output containing the index of the start and end of each reduced + image without padding between scanlines, but still padding between the images +w, h: width and height of non-interlaced image +bpp: bits per pixel +"padded" is only relevant if bpp is less than 8 and a scanline or image does not + end at a full byte +*/ +static void Adam7_getpassvalues(unsigned passw[7], unsigned passh[7], size_t filter_passstart[8], + size_t padded_passstart[8], size_t passstart[8], unsigned w, unsigned h, unsigned bpp) { + /*the passstart values have 8 values: the 8th one indicates the byte after the end of the 7th (= last) pass*/ + unsigned i; + + /*calculate width and height in pixels of each pass*/ + for(i = 0; i != 7; ++i) { + passw[i] = (w + ADAM7_DX[i] - ADAM7_IX[i] - 1) / ADAM7_DX[i]; + passh[i] = (h + ADAM7_DY[i] - ADAM7_IY[i] - 1) / ADAM7_DY[i]; + if(passw[i] == 0) passh[i] = 0; + if(passh[i] == 0) passw[i] = 0; + } + + filter_passstart[0] = padded_passstart[0] = passstart[0] = 0; + for(i = 0; i != 7; ++i) { + /*if passw[i] is 0, it's 0 bytes, not 1 (no filtertype-byte)*/ + filter_passstart[i + 1] = filter_passstart[i] + + ((passw[i] && passh[i]) ? passh[i] * (1u + (passw[i] * bpp + 7u) / 8u) : 0); + /*bits padded if needed to fill full byte at end of each scanline*/ + padded_passstart[i + 1] = padded_passstart[i] + passh[i] * ((passw[i] * bpp + 7u) / 8u); + /*only padded at end of reduced image*/ + passstart[i + 1] = passstart[i] + (passh[i] * passw[i] * bpp + 7u) / 8u; + } +} + +#ifdef LODEPNG_COMPILE_DECODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / PNG Decoder / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*read the information from the header and store it in the LodePNGInfo. return value is error*/ +unsigned lodepng_inspect(unsigned* w, unsigned* h, LodePNGState* state, + const unsigned char* in, size_t insize) { + unsigned width, height; + LodePNGInfo* info = &state->info_png; + if(insize == 0 || in == 0) { + CERROR_RETURN_ERROR(state->error, 48); /*error: the given data is empty*/ + } + if(insize < 33) { + CERROR_RETURN_ERROR(state->error, 27); /*error: the data length is smaller than the length of a PNG header*/ + } + + /*when decoding a new PNG image, make sure all parameters created after previous decoding are reset*/ + /* TODO: remove this. One should use a new LodePNGState for new sessions */ + lodepng_info_cleanup(info); + lodepng_info_init(info); + + if(in[0] != 137 || in[1] != 80 || in[2] != 78 || in[3] != 71 + || in[4] != 13 || in[5] != 10 || in[6] != 26 || in[7] != 10) { + CERROR_RETURN_ERROR(state->error, 28); /*error: the first 8 bytes are not the correct PNG signature*/ + } + if(lodepng_chunk_length(in + 8) != 13) { + CERROR_RETURN_ERROR(state->error, 94); /*error: header size must be 13 bytes*/ + } + if(!lodepng_chunk_type_equals(in + 8, "IHDR")) { + CERROR_RETURN_ERROR(state->error, 29); /*error: it doesn't start with a IHDR chunk!*/ + } + + /*read the values given in the header*/ + width = lodepng_read32bitInt(&in[16]); + height = lodepng_read32bitInt(&in[20]); + /*TODO: remove the undocumented feature that allows to give null pointers to width or height*/ + if(w) *w = width; + if(h) *h = height; + info->color.bitdepth = in[24]; + info->color.colortype = (LodePNGColorType)in[25]; + info->compression_method = in[26]; + info->filter_method = in[27]; + info->interlace_method = in[28]; + + /*errors returned only after the parsing so other values are still output*/ + + /*error: invalid image size*/ + if(width == 0 || height == 0) CERROR_RETURN_ERROR(state->error, 93); + /*error: invalid colortype or bitdepth combination*/ + state->error = checkColorValidity(info->color.colortype, info->color.bitdepth); + if(state->error) return state->error; + /*error: only compression method 0 is allowed in the specification*/ + if(info->compression_method != 0) CERROR_RETURN_ERROR(state->error, 32); + /*error: only filter method 0 is allowed in the specification*/ + if(info->filter_method != 0) CERROR_RETURN_ERROR(state->error, 33); + /*error: only interlace methods 0 and 1 exist in the specification*/ + if(info->interlace_method > 1) CERROR_RETURN_ERROR(state->error, 34); + + if(!state->decoder.ignore_crc) { + unsigned CRC = lodepng_read32bitInt(&in[29]); + unsigned checksum = lodepng_crc32(&in[12], 17); + if(CRC != checksum) { + CERROR_RETURN_ERROR(state->error, 57); /*invalid CRC*/ + } + } + + return state->error; +} + +static unsigned unfilterScanline(unsigned char* recon, const unsigned char* scanline, const unsigned char* precon, + size_t bytewidth, unsigned char filterType, size_t length) { + /* + For PNG filter method 0 + unfilter a PNG image scanline by scanline. when the pixels are smaller than 1 byte, + the filter works byte per byte (bytewidth = 1) + precon is the previous unfiltered scanline, recon the result, scanline the current one + the incoming scanlines do NOT include the filtertype byte, that one is given in the parameter filterType instead + recon and scanline MAY be the same memory address! precon must be disjoint. + */ + + size_t i; + switch(filterType) { + case 0: + for(i = 0; i != length; ++i) recon[i] = scanline[i]; + break; + case 1: + for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i]; + for(i = bytewidth; i < length; ++i) recon[i] = scanline[i] + recon[i - bytewidth]; + break; + case 2: + if(precon) { + for(i = 0; i != length; ++i) recon[i] = scanline[i] + precon[i]; + } else { + for(i = 0; i != length; ++i) recon[i] = scanline[i]; + } + break; + case 3: + if(precon) { + for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i] + (precon[i] >> 1u); + for(i = bytewidth; i < length; ++i) recon[i] = scanline[i] + ((recon[i - bytewidth] + precon[i]) >> 1u); + } else { + for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i]; + for(i = bytewidth; i < length; ++i) recon[i] = scanline[i] + (recon[i - bytewidth] >> 1u); + } + break; + case 4: + if(precon) { + for(i = 0; i != bytewidth; ++i) { + recon[i] = (scanline[i] + precon[i]); /*paethPredictor(0, precon[i], 0) is always precon[i]*/ + } + + /* Unroll independent paths of the paeth predictor. A 6x and 8x version would also be possible but that + adds too much code. Whether this actually speeds anything up at all depends on compiler and settings. */ + if(bytewidth >= 4) { + for(; i + 3 < length; i += 4) { + size_t j = i - bytewidth; + unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1], s2 = scanline[i + 2], s3 = scanline[i + 3]; + unsigned char r0 = recon[j + 0], r1 = recon[j + 1], r2 = recon[j + 2], r3 = recon[j + 3]; + unsigned char p0 = precon[i + 0], p1 = precon[i + 1], p2 = precon[i + 2], p3 = precon[i + 3]; + unsigned char q0 = precon[j + 0], q1 = precon[j + 1], q2 = precon[j + 2], q3 = precon[j + 3]; + recon[i + 0] = s0 + paethPredictor(r0, p0, q0); + recon[i + 1] = s1 + paethPredictor(r1, p1, q1); + recon[i + 2] = s2 + paethPredictor(r2, p2, q2); + recon[i + 3] = s3 + paethPredictor(r3, p3, q3); + } + } else if(bytewidth >= 3) { + for(; i + 2 < length; i += 3) { + size_t j = i - bytewidth; + unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1], s2 = scanline[i + 2]; + unsigned char r0 = recon[j + 0], r1 = recon[j + 1], r2 = recon[j + 2]; + unsigned char p0 = precon[i + 0], p1 = precon[i + 1], p2 = precon[i + 2]; + unsigned char q0 = precon[j + 0], q1 = precon[j + 1], q2 = precon[j + 2]; + recon[i + 0] = s0 + paethPredictor(r0, p0, q0); + recon[i + 1] = s1 + paethPredictor(r1, p1, q1); + recon[i + 2] = s2 + paethPredictor(r2, p2, q2); + } + } else if(bytewidth >= 2) { + for(; i + 1 < length; i += 2) { + size_t j = i - bytewidth; + unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1]; + unsigned char r0 = recon[j + 0], r1 = recon[j + 1]; + unsigned char p0 = precon[i + 0], p1 = precon[i + 1]; + unsigned char q0 = precon[j + 0], q1 = precon[j + 1]; + recon[i + 0] = s0 + paethPredictor(r0, p0, q0); + recon[i + 1] = s1 + paethPredictor(r1, p1, q1); + } + } + + for(; i != length; ++i) { + recon[i] = (scanline[i] + paethPredictor(recon[i - bytewidth], precon[i], precon[i - bytewidth])); + } + } else { + for(i = 0; i != bytewidth; ++i) { + recon[i] = scanline[i]; + } + for(i = bytewidth; i < length; ++i) { + /*paethPredictor(recon[i - bytewidth], 0, 0) is always recon[i - bytewidth]*/ + recon[i] = (scanline[i] + recon[i - bytewidth]); + } + } + break; + default: return 36; /*error: invalid filter type given*/ + } + return 0; +} + +static unsigned unfilter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) { + /* + For PNG filter method 0 + this function unfilters a single image (e.g. without interlacing this is called once, with Adam7 seven times) + out must have enough bytes allocated already, in must have the scanlines + 1 filtertype byte per scanline + w and h are image dimensions or dimensions of reduced image, bpp is bits per pixel + in and out are allowed to be the same memory address (but aren't the same size since in has the extra filter bytes) + */ + + unsigned y; + unsigned char* prevline = 0; + + /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ + size_t bytewidth = (bpp + 7u) / 8u; + /*the width of a scanline in bytes, not including the filter type*/ + size_t linebytes = lodepng_get_raw_size_idat(w, 1, bpp) - 1u; + + for(y = 0; y < h; ++y) { + size_t outindex = linebytes * y; + size_t inindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ + unsigned char filterType = in[inindex]; + + CERROR_TRY_RETURN(unfilterScanline(&out[outindex], &in[inindex + 1], prevline, bytewidth, filterType, linebytes)); + + prevline = &out[outindex]; + } + + return 0; +} + +/* +in: Adam7 interlaced image, with no padding bits between scanlines, but between + reduced images so that each reduced image starts at a byte. +out: the same pixels, but re-ordered so that they're now a non-interlaced image with size w*h +bpp: bits per pixel +out has the following size in bits: w * h * bpp. +in is possibly bigger due to padding bits between reduced images. +out must be big enough AND must be 0 everywhere if bpp < 8 in the current implementation +(because that's likely a little bit faster) +NOTE: comments about padding bits are only relevant if bpp < 8 +*/ +static void Adam7_deinterlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) { + unsigned passw[7], passh[7]; + size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned i; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + if(bpp >= 8) { + for(i = 0; i != 7; ++i) { + unsigned x, y, b; + size_t bytewidth = bpp / 8u; + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) { + size_t pixelinstart = passstart[i] + (y * passw[i] + x) * bytewidth; + size_t pixeloutstart = ((ADAM7_IY[i] + (size_t)y * ADAM7_DY[i]) * (size_t)w + + ADAM7_IX[i] + (size_t)x * ADAM7_DX[i]) * bytewidth; + for(b = 0; b < bytewidth; ++b) { + out[pixeloutstart + b] = in[pixelinstart + b]; + } + } + } + } else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ { + for(i = 0; i != 7; ++i) { + unsigned x, y, b; + unsigned ilinebits = bpp * passw[i]; + unsigned olinebits = bpp * w; + size_t obp, ibp; /*bit pointers (for out and in buffer)*/ + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) { + ibp = (8 * passstart[i]) + (y * ilinebits + x * bpp); + obp = (ADAM7_IY[i] + (size_t)y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + (size_t)x * ADAM7_DX[i]) * bpp; + for(b = 0; b < bpp; ++b) { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + } + } + } +} + +static void removePaddingBits(unsigned char* out, const unsigned char* in, + size_t olinebits, size_t ilinebits, unsigned h) { + /* + After filtering there are still padding bits if scanlines have non multiple of 8 bit amounts. They need + to be removed (except at last scanline of (Adam7-reduced) image) before working with pure image buffers + for the Adam7 code, the color convert code and the output to the user. + in and out are allowed to be the same buffer, in may also be higher but still overlapping; in must + have >= ilinebits*h bits, out must have >= olinebits*h bits, olinebits must be <= ilinebits + also used to move bits after earlier such operations happened, e.g. in a sequence of reduced images from Adam7 + only useful if (ilinebits - olinebits) is a value in the range 1..7 + */ + unsigned y; + size_t diff = ilinebits - olinebits; + size_t ibp = 0, obp = 0; /*input and output bit pointers*/ + for(y = 0; y < h; ++y) { + size_t x; + for(x = 0; x < olinebits; ++x) { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + ibp += diff; + } +} + +/*out must be buffer big enough to contain full image, and in must contain the full decompressed data from +the IDAT chunks (with filter index bytes and possible padding bits) +return value is error*/ +static unsigned postProcessScanlines(unsigned char* out, unsigned char* in, + unsigned w, unsigned h, const LodePNGInfo* info_png) { + /* + This function converts the filtered-padded-interlaced data into pure 2D image buffer with the PNG's colortype. + Steps: + *) if no Adam7: 1) unfilter 2) remove padding bits (= possible extra bits per scanline if bpp < 8) + *) if adam7: 1) 7x unfilter 2) 7x remove padding bits 3) Adam7_deinterlace + NOTE: the in buffer will be overwritten with intermediate data! + */ + unsigned bpp = lodepng_get_bpp(&info_png->color); + if(bpp == 0) return 31; /*error: invalid colortype*/ + + if(info_png->interlace_method == 0) { + if(bpp < 8 && w * bpp != ((w * bpp + 7u) / 8u) * 8u) { + CERROR_TRY_RETURN(unfilter(in, in, w, h, bpp)); + removePaddingBits(out, in, w * bpp, ((w * bpp + 7u) / 8u) * 8u, h); + } + /*we can immediately filter into the out buffer, no other steps needed*/ + else CERROR_TRY_RETURN(unfilter(out, in, w, h, bpp)); + } else /*interlace_method is 1 (Adam7)*/ { + unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned i; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + for(i = 0; i != 7; ++i) { + CERROR_TRY_RETURN(unfilter(&in[padded_passstart[i]], &in[filter_passstart[i]], passw[i], passh[i], bpp)); + /*TODO: possible efficiency improvement: if in this reduced image the bits fit nicely in 1 scanline, + move bytes instead of bits or move not at all*/ + if(bpp < 8) { + /*remove padding bits in scanlines; after this there still may be padding + bits between the different reduced images: each reduced image still starts nicely at a byte*/ + removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]], passw[i] * bpp, + ((passw[i] * bpp + 7u) / 8u) * 8u, passh[i]); + } + } + + Adam7_deinterlace(out, in, w, h, bpp); + } + + return 0; +} + +static unsigned readChunk_PLTE(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) { + unsigned pos = 0, i; + color->palettesize = chunkLength / 3u; + if(color->palettesize == 0 || color->palettesize > 256) return 38; /*error: palette too small or big*/ + lodepng_color_mode_alloc_palette(color); + if(!color->palette && color->palettesize) { + color->palettesize = 0; + return 83; /*alloc fail*/ + } + + for(i = 0; i != color->palettesize; ++i) { + color->palette[4 * i + 0] = data[pos++]; /*R*/ + color->palette[4 * i + 1] = data[pos++]; /*G*/ + color->palette[4 * i + 2] = data[pos++]; /*B*/ + color->palette[4 * i + 3] = 255; /*alpha*/ + } + + return 0; /* OK */ +} + +static unsigned readChunk_tRNS(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) { + unsigned i; + if(color->colortype == LCT_PALETTE) { + /*error: more alpha values given than there are palette entries*/ + if(chunkLength > color->palettesize) return 39; + + for(i = 0; i != chunkLength; ++i) color->palette[4 * i + 3] = data[i]; + } else if(color->colortype == LCT_GREY) { + /*error: this chunk must be 2 bytes for grayscale image*/ + if(chunkLength != 2) return 30; + + color->key_defined = 1; + color->key_r = color->key_g = color->key_b = 256u * data[0] + data[1]; + } else if(color->colortype == LCT_RGB) { + /*error: this chunk must be 6 bytes for RGB image*/ + if(chunkLength != 6) return 41; + + color->key_defined = 1; + color->key_r = 256u * data[0] + data[1]; + color->key_g = 256u * data[2] + data[3]; + color->key_b = 256u * data[4] + data[5]; + } + else return 42; /*error: tRNS chunk not allowed for other color models*/ + + return 0; /* OK */ +} + + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +/*background color chunk (bKGD)*/ +static unsigned readChunk_bKGD(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { + if(info->color.colortype == LCT_PALETTE) { + /*error: this chunk must be 1 byte for indexed color image*/ + if(chunkLength != 1) return 43; + + /*error: invalid palette index, or maybe this chunk appeared before PLTE*/ + if(data[0] >= info->color.palettesize) return 103; + + info->background_defined = 1; + info->background_r = info->background_g = info->background_b = data[0]; + } else if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) { + /*error: this chunk must be 2 bytes for grayscale image*/ + if(chunkLength != 2) return 44; + + /*the values are truncated to bitdepth in the PNG file*/ + info->background_defined = 1; + info->background_r = info->background_g = info->background_b = 256u * data[0] + data[1]; + } else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) { + /*error: this chunk must be 6 bytes for grayscale image*/ + if(chunkLength != 6) return 45; + + /*the values are truncated to bitdepth in the PNG file*/ + info->background_defined = 1; + info->background_r = 256u * data[0] + data[1]; + info->background_g = 256u * data[2] + data[3]; + info->background_b = 256u * data[4] + data[5]; + } + + return 0; /* OK */ +} + +/*text chunk (tEXt)*/ +static unsigned readChunk_tEXt(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { + unsigned error = 0; + char *key = 0, *str = 0; + + while(!error) /*not really a while loop, only used to break on error*/ { + unsigned length, string2_begin; + + length = 0; + while(length < chunkLength && data[length] != 0) ++length; + /*even though it's not allowed by the standard, no error is thrown if + there's no null termination char, if the text is empty*/ + if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ + + key = (char*)lodepng_malloc(length + 1); + if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ + + lodepng_memcpy(key, data, length); + key[length] = 0; + + string2_begin = length + 1; /*skip keyword null terminator*/ + + length = (unsigned)(chunkLength < string2_begin ? 0 : chunkLength - string2_begin); + str = (char*)lodepng_malloc(length + 1); + if(!str) CERROR_BREAK(error, 83); /*alloc fail*/ + + lodepng_memcpy(str, data + string2_begin, length); + str[length] = 0; + + error = lodepng_add_text(info, key, str); + + break; + } + + lodepng_free(key); + lodepng_free(str); + + return error; +} + +/*compressed text chunk (zTXt)*/ +static unsigned readChunk_zTXt(LodePNGInfo* info, const LodePNGDecoderSettings* decoder, + const unsigned char* data, size_t chunkLength) { + unsigned error = 0; + + /*copy the object to change parameters in it*/ + LodePNGDecompressSettings zlibsettings = decoder->zlibsettings; + + unsigned length, string2_begin; + char *key = 0; + unsigned char* str = 0; + size_t size = 0; + + while(!error) /*not really a while loop, only used to break on error*/ { + for(length = 0; length < chunkLength && data[length] != 0; ++length) ; + if(length + 2 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ + if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ + + key = (char*)lodepng_malloc(length + 1); + if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ + + lodepng_memcpy(key, data, length); + key[length] = 0; + + if(data[length + 1] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ + + string2_begin = length + 2; + if(string2_begin > chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ + + length = (unsigned)chunkLength - string2_begin; + zlibsettings.max_output_size = decoder->max_text_size; + /*will fail if zlib error, e.g. if length is too small*/ + error = zlib_decompress(&str, &size, 0, &data[string2_begin], + length, &zlibsettings); + /*error: compressed text larger than decoder->max_text_size*/ + if(error && size > zlibsettings.max_output_size) error = 112; + if(error) break; + error = lodepng_add_text_sized(info, key, (char*)str, size); + break; + } + + lodepng_free(key); + lodepng_free(str); + + return error; +} + +/*international text chunk (iTXt)*/ +static unsigned readChunk_iTXt(LodePNGInfo* info, const LodePNGDecoderSettings* decoder, + const unsigned char* data, size_t chunkLength) { + unsigned error = 0; + unsigned i; + + /*copy the object to change parameters in it*/ + LodePNGDecompressSettings zlibsettings = decoder->zlibsettings; + + unsigned length, begin, compressed; + char *key = 0, *langtag = 0, *transkey = 0; + + while(!error) /*not really a while loop, only used to break on error*/ { + /*Quick check if the chunk length isn't too small. Even without check + it'd still fail with other error checks below if it's too short. This just gives a different error code.*/ + if(chunkLength < 5) CERROR_BREAK(error, 30); /*iTXt chunk too short*/ + + /*read the key*/ + for(length = 0; length < chunkLength && data[length] != 0; ++length) ; + if(length + 3 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination char, corrupt?*/ + if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ + + key = (char*)lodepng_malloc(length + 1); + if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ + + lodepng_memcpy(key, data, length); + key[length] = 0; + + /*read the compression method*/ + compressed = data[length + 1]; + if(data[length + 2] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ + + /*even though it's not allowed by the standard, no error is thrown if + there's no null termination char, if the text is empty for the next 3 texts*/ + + /*read the langtag*/ + begin = length + 3; + length = 0; + for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length; + + langtag = (char*)lodepng_malloc(length + 1); + if(!langtag) CERROR_BREAK(error, 83); /*alloc fail*/ + + lodepng_memcpy(langtag, data + begin, length); + langtag[length] = 0; + + /*read the transkey*/ + begin += length + 1; + length = 0; + for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length; + + transkey = (char*)lodepng_malloc(length + 1); + if(!transkey) CERROR_BREAK(error, 83); /*alloc fail*/ + + lodepng_memcpy(transkey, data + begin, length); + transkey[length] = 0; + + /*read the actual text*/ + begin += length + 1; + + length = (unsigned)chunkLength < begin ? 0 : (unsigned)chunkLength - begin; + + if(compressed) { + unsigned char* str = 0; + size_t size = 0; + zlibsettings.max_output_size = decoder->max_text_size; + /*will fail if zlib error, e.g. if length is too small*/ + error = zlib_decompress(&str, &size, 0, &data[begin], + length, &zlibsettings); + /*error: compressed text larger than decoder->max_text_size*/ + if(error && size > zlibsettings.max_output_size) error = 112; + if(!error) error = lodepng_add_itext_sized(info, key, langtag, transkey, (char*)str, size); + lodepng_free(str); + } else { + error = lodepng_add_itext_sized(info, key, langtag, transkey, (char*)(data + begin), length); + } + + break; + } + + lodepng_free(key); + lodepng_free(langtag); + lodepng_free(transkey); + + return error; +} + +static unsigned readChunk_tIME(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { + if(chunkLength != 7) return 73; /*invalid tIME chunk size*/ + + info->time_defined = 1; + info->time.year = 256u * data[0] + data[1]; + info->time.month = data[2]; + info->time.day = data[3]; + info->time.hour = data[4]; + info->time.minute = data[5]; + info->time.second = data[6]; + + return 0; /* OK */ +} + +static unsigned readChunk_pHYs(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { + if(chunkLength != 9) return 74; /*invalid pHYs chunk size*/ + + info->phys_defined = 1; + info->phys_x = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3]; + info->phys_y = 16777216u * data[4] + 65536u * data[5] + 256u * data[6] + data[7]; + info->phys_unit = data[8]; + + return 0; /* OK */ +} + +static unsigned readChunk_gAMA(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { + if(chunkLength != 4) return 96; /*invalid gAMA chunk size*/ + + info->gama_defined = 1; + info->gama_gamma = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3]; + + return 0; /* OK */ +} + +static unsigned readChunk_cHRM(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { + if(chunkLength != 32) return 97; /*invalid cHRM chunk size*/ + + info->chrm_defined = 1; + info->chrm_white_x = 16777216u * data[ 0] + 65536u * data[ 1] + 256u * data[ 2] + data[ 3]; + info->chrm_white_y = 16777216u * data[ 4] + 65536u * data[ 5] + 256u * data[ 6] + data[ 7]; + info->chrm_red_x = 16777216u * data[ 8] + 65536u * data[ 9] + 256u * data[10] + data[11]; + info->chrm_red_y = 16777216u * data[12] + 65536u * data[13] + 256u * data[14] + data[15]; + info->chrm_green_x = 16777216u * data[16] + 65536u * data[17] + 256u * data[18] + data[19]; + info->chrm_green_y = 16777216u * data[20] + 65536u * data[21] + 256u * data[22] + data[23]; + info->chrm_blue_x = 16777216u * data[24] + 65536u * data[25] + 256u * data[26] + data[27]; + info->chrm_blue_y = 16777216u * data[28] + 65536u * data[29] + 256u * data[30] + data[31]; + + return 0; /* OK */ +} + +static unsigned readChunk_sRGB(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { + if(chunkLength != 1) return 98; /*invalid sRGB chunk size (this one is never ignored)*/ + + info->srgb_defined = 1; + info->srgb_intent = data[0]; + + return 0; /* OK */ +} + +static unsigned readChunk_iCCP(LodePNGInfo* info, const LodePNGDecoderSettings* decoder, + const unsigned char* data, size_t chunkLength) { + unsigned error = 0; + unsigned i; + size_t size = 0; + /*copy the object to change parameters in it*/ + LodePNGDecompressSettings zlibsettings = decoder->zlibsettings; + + unsigned length, string2_begin; + + info->iccp_defined = 1; + if(info->iccp_name) lodepng_clear_icc(info); + + for(length = 0; length < chunkLength && data[length] != 0; ++length) ; + if(length + 2 >= chunkLength) return 75; /*no null termination, corrupt?*/ + if(length < 1 || length > 79) return 89; /*keyword too short or long*/ + + info->iccp_name = (char*)lodepng_malloc(length + 1); + if(!info->iccp_name) return 83; /*alloc fail*/ + + info->iccp_name[length] = 0; + for(i = 0; i != length; ++i) info->iccp_name[i] = (char)data[i]; + + if(data[length + 1] != 0) return 72; /*the 0 byte indicating compression must be 0*/ + + string2_begin = length + 2; + if(string2_begin > chunkLength) return 75; /*no null termination, corrupt?*/ + + length = (unsigned)chunkLength - string2_begin; + zlibsettings.max_output_size = decoder->max_icc_size; + error = zlib_decompress(&info->iccp_profile, &size, 0, + &data[string2_begin], + length, &zlibsettings); + /*error: ICC profile larger than decoder->max_icc_size*/ + if(error && size > zlibsettings.max_output_size) error = 113; + info->iccp_profile_size = size; + if(!error && !info->iccp_profile_size) error = 100; /*invalid ICC profile size*/ + return error; +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +unsigned lodepng_inspect_chunk(LodePNGState* state, size_t pos, + const unsigned char* in, size_t insize) { + const unsigned char* chunk = in + pos; + unsigned chunkLength; + const unsigned char* data; + unsigned unhandled = 0; + unsigned error = 0; + + if(pos + 4 > insize) return 30; + chunkLength = lodepng_chunk_length(chunk); + if(chunkLength > 2147483647) return 63; + data = lodepng_chunk_data_const(chunk); + if(data + chunkLength + 4 > in + insize) return 30; + + if(lodepng_chunk_type_equals(chunk, "PLTE")) { + error = readChunk_PLTE(&state->info_png.color, data, chunkLength); + } else if(lodepng_chunk_type_equals(chunk, "tRNS")) { + error = readChunk_tRNS(&state->info_png.color, data, chunkLength); +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + } else if(lodepng_chunk_type_equals(chunk, "bKGD")) { + error = readChunk_bKGD(&state->info_png, data, chunkLength); + } else if(lodepng_chunk_type_equals(chunk, "tEXt")) { + error = readChunk_tEXt(&state->info_png, data, chunkLength); + } else if(lodepng_chunk_type_equals(chunk, "zTXt")) { + error = readChunk_zTXt(&state->info_png, &state->decoder, data, chunkLength); + } else if(lodepng_chunk_type_equals(chunk, "iTXt")) { + error = readChunk_iTXt(&state->info_png, &state->decoder, data, chunkLength); + } else if(lodepng_chunk_type_equals(chunk, "tIME")) { + error = readChunk_tIME(&state->info_png, data, chunkLength); + } else if(lodepng_chunk_type_equals(chunk, "pHYs")) { + error = readChunk_pHYs(&state->info_png, data, chunkLength); + } else if(lodepng_chunk_type_equals(chunk, "gAMA")) { + error = readChunk_gAMA(&state->info_png, data, chunkLength); + } else if(lodepng_chunk_type_equals(chunk, "cHRM")) { + error = readChunk_cHRM(&state->info_png, data, chunkLength); + } else if(lodepng_chunk_type_equals(chunk, "sRGB")) { + error = readChunk_sRGB(&state->info_png, data, chunkLength); + } else if(lodepng_chunk_type_equals(chunk, "iCCP")) { + error = readChunk_iCCP(&state->info_png, &state->decoder, data, chunkLength); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } else { + /* unhandled chunk is ok (is not an error) */ + unhandled = 1; + } + + if(!error && !unhandled && !state->decoder.ignore_crc) { + if(lodepng_chunk_check_crc(chunk)) return 57; /*invalid CRC*/ + } + + return error; +} + +/*read a PNG, the result will be in the same color type as the PNG (hence "generic")*/ +static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h, + LodePNGState* state, + const unsigned char* in, size_t insize) { + unsigned char IEND = 0; + const unsigned char* chunk; + unsigned char* idat; /*the data from idat chunks, zlib compressed*/ + size_t idatsize = 0; + unsigned char* scanlines = 0; + size_t scanlines_size = 0, expected_size = 0; + size_t outsize = 0; + + /*for unknown chunk order*/ + unsigned unknown = 0; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + unsigned critical_pos = 1; /*1 = after IHDR, 2 = after PLTE, 3 = after IDAT*/ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + + + /* safe output values in case error happens */ + *out = 0; + *w = *h = 0; + + state->error = lodepng_inspect(w, h, state, in, insize); /*reads header and resets other parameters in state->info_png*/ + if(state->error) return; + + if(lodepng_pixel_overflow(*w, *h, &state->info_png.color, &state->info_raw)) { + CERROR_RETURN(state->error, 92); /*overflow possible due to amount of pixels*/ + } + + /*the input filesize is a safe upper bound for the sum of idat chunks size*/ + idat = (unsigned char*)lodepng_malloc(insize); + if(!idat) CERROR_RETURN(state->error, 83); /*alloc fail*/ + + chunk = &in[33]; /*first byte of the first chunk after the header*/ + + /*loop through the chunks, ignoring unknown chunks and stopping at IEND chunk. + IDAT data is put at the start of the in buffer*/ + while(!IEND && !state->error) { + unsigned chunkLength; + const unsigned char* data; /*the data in the chunk*/ + + /*error: size of the in buffer too small to contain next chunk*/ + if((size_t)((chunk - in) + 12) > insize || chunk < in) { + if(state->decoder.ignore_end) break; /*other errors may still happen though*/ + CERROR_BREAK(state->error, 30); + } + + /*length of the data of the chunk, excluding the length bytes, chunk type and CRC bytes*/ + chunkLength = lodepng_chunk_length(chunk); + /*error: chunk length larger than the max PNG chunk size*/ + if(chunkLength > 2147483647) { + if(state->decoder.ignore_end) break; /*other errors may still happen though*/ + CERROR_BREAK(state->error, 63); + } + + if((size_t)((chunk - in) + chunkLength + 12) > insize || (chunk + chunkLength + 12) < in) { + CERROR_BREAK(state->error, 64); /*error: size of the in buffer too small to contain next chunk*/ + } + + data = lodepng_chunk_data_const(chunk); + + unknown = 0; + + /*IDAT chunk, containing compressed image data*/ + if(lodepng_chunk_type_equals(chunk, "IDAT")) { + size_t newsize; + if(lodepng_addofl(idatsize, chunkLength, &newsize)) CERROR_BREAK(state->error, 95); + if(newsize > insize) CERROR_BREAK(state->error, 95); + lodepng_memcpy(idat + idatsize, data, chunkLength); + idatsize += chunkLength; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + critical_pos = 3; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } else if(lodepng_chunk_type_equals(chunk, "IEND")) { + /*IEND chunk*/ + IEND = 1; + } else if(lodepng_chunk_type_equals(chunk, "PLTE")) { + /*palette chunk (PLTE)*/ + state->error = readChunk_PLTE(&state->info_png.color, data, chunkLength); + if(state->error) break; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + critical_pos = 2; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } else if(lodepng_chunk_type_equals(chunk, "tRNS")) { + /*palette transparency chunk (tRNS). Even though this one is an ancillary chunk , it is still compiled + in without 'LODEPNG_COMPILE_ANCILLARY_CHUNKS' because it contains essential color information that + affects the alpha channel of pixels. */ + state->error = readChunk_tRNS(&state->info_png.color, data, chunkLength); + if(state->error) break; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*background color chunk (bKGD)*/ + } else if(lodepng_chunk_type_equals(chunk, "bKGD")) { + state->error = readChunk_bKGD(&state->info_png, data, chunkLength); + if(state->error) break; + } else if(lodepng_chunk_type_equals(chunk, "tEXt")) { + /*text chunk (tEXt)*/ + if(state->decoder.read_text_chunks) { + state->error = readChunk_tEXt(&state->info_png, data, chunkLength); + if(state->error) break; + } + } else if(lodepng_chunk_type_equals(chunk, "zTXt")) { + /*compressed text chunk (zTXt)*/ + if(state->decoder.read_text_chunks) { + state->error = readChunk_zTXt(&state->info_png, &state->decoder, data, chunkLength); + if(state->error) break; + } + } else if(lodepng_chunk_type_equals(chunk, "iTXt")) { + /*international text chunk (iTXt)*/ + if(state->decoder.read_text_chunks) { + state->error = readChunk_iTXt(&state->info_png, &state->decoder, data, chunkLength); + if(state->error) break; + } + } else if(lodepng_chunk_type_equals(chunk, "tIME")) { + state->error = readChunk_tIME(&state->info_png, data, chunkLength); + if(state->error) break; + } else if(lodepng_chunk_type_equals(chunk, "pHYs")) { + state->error = readChunk_pHYs(&state->info_png, data, chunkLength); + if(state->error) break; + } else if(lodepng_chunk_type_equals(chunk, "gAMA")) { + state->error = readChunk_gAMA(&state->info_png, data, chunkLength); + if(state->error) break; + } else if(lodepng_chunk_type_equals(chunk, "cHRM")) { + state->error = readChunk_cHRM(&state->info_png, data, chunkLength); + if(state->error) break; + } else if(lodepng_chunk_type_equals(chunk, "sRGB")) { + state->error = readChunk_sRGB(&state->info_png, data, chunkLength); + if(state->error) break; + } else if(lodepng_chunk_type_equals(chunk, "iCCP")) { + state->error = readChunk_iCCP(&state->info_png, &state->decoder, data, chunkLength); + if(state->error) break; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } else /*it's not an implemented chunk type, so ignore it: skip over the data*/ { + /*error: unknown critical chunk (5th bit of first byte of chunk type is 0)*/ + if(!state->decoder.ignore_critical && !lodepng_chunk_ancillary(chunk)) { + CERROR_BREAK(state->error, 69); + } + + unknown = 1; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + if(state->decoder.remember_unknown_chunks) { + state->error = lodepng_chunk_append(&state->info_png.unknown_chunks_data[critical_pos - 1], + &state->info_png.unknown_chunks_size[critical_pos - 1], chunk); + if(state->error) break; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } + + if(!state->decoder.ignore_crc && !unknown) /*check CRC if wanted, only on known chunk types*/ { + if(lodepng_chunk_check_crc(chunk)) CERROR_BREAK(state->error, 57); /*invalid CRC*/ + } + + if(!IEND) chunk = lodepng_chunk_next_const(chunk, in + insize); + } + + if(!state->error && state->info_png.color.colortype == LCT_PALETTE && !state->info_png.color.palette) { + state->error = 106; /* error: PNG file must have PLTE chunk if color type is palette */ + } + + if(!state->error) { + /*predict output size, to allocate exact size for output buffer to avoid more dynamic allocation. + If the decompressed size does not match the prediction, the image must be corrupt.*/ + if(state->info_png.interlace_method == 0) { + size_t bpp = lodepng_get_bpp(&state->info_png.color); + expected_size = lodepng_get_raw_size_idat(*w, *h, bpp); + } else { + size_t bpp = lodepng_get_bpp(&state->info_png.color); + /*Adam-7 interlaced: expected size is the sum of the 7 sub-images sizes*/ + expected_size = 0; + expected_size += lodepng_get_raw_size_idat((*w + 7) >> 3, (*h + 7) >> 3, bpp); + if(*w > 4) expected_size += lodepng_get_raw_size_idat((*w + 3) >> 3, (*h + 7) >> 3, bpp); + expected_size += lodepng_get_raw_size_idat((*w + 3) >> 2, (*h + 3) >> 3, bpp); + if(*w > 2) expected_size += lodepng_get_raw_size_idat((*w + 1) >> 2, (*h + 3) >> 2, bpp); + expected_size += lodepng_get_raw_size_idat((*w + 1) >> 1, (*h + 1) >> 2, bpp); + if(*w > 1) expected_size += lodepng_get_raw_size_idat((*w + 0) >> 1, (*h + 1) >> 1, bpp); + expected_size += lodepng_get_raw_size_idat((*w + 0), (*h + 0) >> 1, bpp); + } + + state->error = zlib_decompress(&scanlines, &scanlines_size, expected_size, idat, idatsize, &state->decoder.zlibsettings); + } + if(!state->error && scanlines_size != expected_size) state->error = 91; /*decompressed size doesn't match prediction*/ + lodepng_free(idat); + + if(!state->error) { + outsize = lodepng_get_raw_size(*w, *h, &state->info_png.color); + *out = (unsigned char*)lodepng_malloc(outsize); + if(!*out) state->error = 83; /*alloc fail*/ + } + if(!state->error) { + lodepng_memset(*out, 0, outsize); + state->error = postProcessScanlines(*out, scanlines, *w, *h, &state->info_png); + } + lodepng_free(scanlines); +} + +unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h, + LodePNGState* state, + const unsigned char* in, size_t insize) { + *out = 0; + decodeGeneric(out, w, h, state, in, insize); + if(state->error) return state->error; + if(!state->decoder.color_convert || lodepng_color_mode_equal(&state->info_raw, &state->info_png.color)) { + /*same color type, no copying or converting of data needed*/ + /*store the info_png color settings on the info_raw so that the info_raw still reflects what colortype + the raw image has to the end user*/ + if(!state->decoder.color_convert) { + state->error = lodepng_color_mode_copy(&state->info_raw, &state->info_png.color); + if(state->error) return state->error; + } + } else { /*color conversion needed*/ + unsigned char* data = *out; + size_t outsize; + + /*TODO: check if this works according to the statement in the documentation: "The converter can convert + from grayscale input color type, to 8-bit grayscale or grayscale with alpha"*/ + if(!(state->info_raw.colortype == LCT_RGB || state->info_raw.colortype == LCT_RGBA) + && !(state->info_raw.bitdepth == 8)) { + return 56; /*unsupported color mode conversion*/ + } + + outsize = lodepng_get_raw_size(*w, *h, &state->info_raw); + *out = (unsigned char*)lodepng_malloc(outsize); + if(!(*out)) { + state->error = 83; /*alloc fail*/ + } + else state->error = lodepng_convert(*out, data, &state->info_raw, + &state->info_png.color, *w, *h); + lodepng_free(data); + } + return state->error; +} + +unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, + size_t insize, LodePNGColorType colortype, unsigned bitdepth) { + unsigned error; + LodePNGState state; + lodepng_state_init(&state); + state.info_raw.colortype = colortype; + state.info_raw.bitdepth = bitdepth; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*disable reading things that this function doesn't output*/ + state.decoder.read_text_chunks = 0; + state.decoder.remember_unknown_chunks = 0; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + error = lodepng_decode(out, w, h, &state, in, insize); + lodepng_state_cleanup(&state); + return error; +} + +unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) { + return lodepng_decode_memory(out, w, h, in, insize, LCT_RGBA, 8); +} + +unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) { + return lodepng_decode_memory(out, w, h, in, insize, LCT_RGB, 8); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename, + LodePNGColorType colortype, unsigned bitdepth) { + unsigned char* buffer = 0; + size_t buffersize; + unsigned error; + /* safe output values in case error happens */ + *out = 0; + *w = *h = 0; + error = lodepng_load_file(&buffer, &buffersize, filename); + if(!error) error = lodepng_decode_memory(out, w, h, buffer, buffersize, colortype, bitdepth); + lodepng_free(buffer); + return error; +} + +unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) { + return lodepng_decode_file(out, w, h, filename, LCT_RGBA, 8); +} + +unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) { + return lodepng_decode_file(out, w, h, filename, LCT_RGB, 8); +} +#endif /*LODEPNG_COMPILE_DISK*/ + +void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings) { + settings->color_convert = 1; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + settings->read_text_chunks = 1; + settings->remember_unknown_chunks = 0; + settings->max_text_size = 16777216; + settings->max_icc_size = 16777216; /* 16MB is much more than enough for any reasonable ICC profile */ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + settings->ignore_crc = 0; + settings->ignore_critical = 0; + settings->ignore_end = 0; + lodepng_decompress_settings_init(&settings->zlibsettings); +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) + +void lodepng_state_init(LodePNGState* state) { +#ifdef LODEPNG_COMPILE_DECODER + lodepng_decoder_settings_init(&state->decoder); +#endif /*LODEPNG_COMPILE_DECODER*/ +#ifdef LODEPNG_COMPILE_ENCODER + lodepng_encoder_settings_init(&state->encoder); +#endif /*LODEPNG_COMPILE_ENCODER*/ + lodepng_color_mode_init(&state->info_raw); + lodepng_info_init(&state->info_png); + state->error = 1; +} + +void lodepng_state_cleanup(LodePNGState* state) { + lodepng_color_mode_cleanup(&state->info_raw); + lodepng_info_cleanup(&state->info_png); +} + +void lodepng_state_copy(LodePNGState* dest, const LodePNGState* source) { + lodepng_state_cleanup(dest); + *dest = *source; + lodepng_color_mode_init(&dest->info_raw); + lodepng_info_init(&dest->info_png); + dest->error = lodepng_color_mode_copy(&dest->info_raw, &source->info_raw); if(dest->error) return; + dest->error = lodepng_info_copy(&dest->info_png, &source->info_png); if(dest->error) return; +} + +#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ + +#ifdef LODEPNG_COMPILE_ENCODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / PNG Encoder / */ +/* ////////////////////////////////////////////////////////////////////////// */ + + +static unsigned writeSignature(ucvector* out) { + size_t pos = out->size; + const unsigned char signature[] = {137, 80, 78, 71, 13, 10, 26, 10}; + /*8 bytes PNG signature, aka the magic bytes*/ + if(!ucvector_resize(out, out->size + 8)) return 83; /*alloc fail*/ + lodepng_memcpy(out->data + pos, signature, 8); + return 0; +} + +static unsigned addChunk_IHDR(ucvector* out, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth, unsigned interlace_method) { + unsigned char *chunk, *data; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 13, "IHDR")); + data = chunk + 8; + + lodepng_set32bitInt(data + 0, w); /*width*/ + lodepng_set32bitInt(data + 4, h); /*height*/ + data[8] = (unsigned char)bitdepth; /*bit depth*/ + data[9] = (unsigned char)colortype; /*color type*/ + data[10] = 0; /*compression method*/ + data[11] = 0; /*filter method*/ + data[12] = interlace_method; /*interlace method*/ + + lodepng_chunk_generate_crc(chunk); + return 0; +} + +/* only adds the chunk if needed (there is a key or palette with alpha) */ +static unsigned addChunk_PLTE(ucvector* out, const LodePNGColorMode* info) { + unsigned char* chunk; + size_t i, j = 8; + + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, info->palettesize * 3, "PLTE")); + + for(i = 0; i != info->palettesize; ++i) { + /*add all channels except alpha channel*/ + chunk[j++] = info->palette[i * 4 + 0]; + chunk[j++] = info->palette[i * 4 + 1]; + chunk[j++] = info->palette[i * 4 + 2]; + } + + lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_tRNS(ucvector* out, const LodePNGColorMode* info) { + unsigned char* chunk = 0; + + if(info->colortype == LCT_PALETTE) { + size_t i, amount = info->palettesize; + /*the tail of palette values that all have 255 as alpha, does not have to be encoded*/ + for(i = info->palettesize; i != 0; --i) { + if(info->palette[4 * (i - 1) + 3] != 255) break; + --amount; + } + if(amount) { + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, amount, "tRNS")); + /*add the alpha channel values from the palette*/ + for(i = 0; i != amount; ++i) chunk[8 + i] = info->palette[4 * i + 3]; + } + } else if(info->colortype == LCT_GREY) { + if(info->key_defined) { + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 2, "tRNS")); + chunk[8] = (unsigned char)(info->key_r >> 8); + chunk[9] = (unsigned char)(info->key_r & 255); + } + } else if(info->colortype == LCT_RGB) { + if(info->key_defined) { + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 6, "tRNS")); + chunk[8] = (unsigned char)(info->key_r >> 8); + chunk[9] = (unsigned char)(info->key_r & 255); + chunk[10] = (unsigned char)(info->key_g >> 8); + chunk[11] = (unsigned char)(info->key_g & 255); + chunk[12] = (unsigned char)(info->key_b >> 8); + chunk[13] = (unsigned char)(info->key_b & 255); + } + } + + if(chunk) lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_IDAT(ucvector* out, const unsigned char* data, size_t datasize, + LodePNGCompressSettings* zlibsettings) { + unsigned error = 0; + unsigned char* zlib = 0; + size_t zlibsize = 0; + + error = zlib_compress(&zlib, &zlibsize, data, datasize, zlibsettings); + if(!error) { + error = lodepng_chunk_createv(out, zlibsize, "IDAT", zlib); + } + lodepng_free(zlib); + return error; +} + +static unsigned addChunk_IEND(ucvector* out) { + return lodepng_chunk_createv(out, 0, "IEND", 0); +} + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + +static unsigned addChunk_tEXt(ucvector* out, const char* keyword, const char* textstring) { + unsigned char* chunk = 0; + size_t keysize = lodepng_strlen(keyword), textsize = lodepng_strlen(textstring); + size_t size = keysize + 1 + textsize; + if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, size, "tEXt")); + lodepng_memcpy(chunk + 8, keyword, keysize); + chunk[8 + keysize] = 0; /*null termination char*/ + lodepng_memcpy(chunk + 9 + keysize, textstring, textsize); + lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_zTXt(ucvector* out, const char* keyword, const char* textstring, + LodePNGCompressSettings* zlibsettings) { + unsigned error = 0; + unsigned char* chunk = 0; + unsigned char* compressed = 0; + size_t compressedsize = 0; + size_t textsize = lodepng_strlen(textstring); + size_t keysize = lodepng_strlen(keyword); + if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ + + error = zlib_compress(&compressed, &compressedsize, + (const unsigned char*)textstring, textsize, zlibsettings); + if(!error) { + size_t size = keysize + 2 + compressedsize; + error = lodepng_chunk_init(&chunk, out, size, "zTXt"); + } + if(!error) { + lodepng_memcpy(chunk + 8, keyword, keysize); + chunk[8 + keysize] = 0; /*null termination char*/ + chunk[9 + keysize] = 0; /*compression method: 0*/ + lodepng_memcpy(chunk + 10 + keysize, compressed, compressedsize); + lodepng_chunk_generate_crc(chunk); + } + + lodepng_free(compressed); + return error; +} + +static unsigned addChunk_iTXt(ucvector* out, unsigned compress, const char* keyword, const char* langtag, + const char* transkey, const char* textstring, LodePNGCompressSettings* zlibsettings) { + unsigned error = 0; + unsigned char* chunk = 0; + unsigned char* compressed = 0; + size_t compressedsize = 0; + size_t textsize = lodepng_strlen(textstring); + size_t keysize = lodepng_strlen(keyword), langsize = lodepng_strlen(langtag), transsize = lodepng_strlen(transkey); + + if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ + + if(compress) { + error = zlib_compress(&compressed, &compressedsize, + (const unsigned char*)textstring, textsize, zlibsettings); + } + if(!error) { + size_t size = keysize + 3 + langsize + 1 + transsize + 1 + (compress ? compressedsize : textsize); + error = lodepng_chunk_init(&chunk, out, size, "iTXt"); + } + if(!error) { + size_t pos = 8; + lodepng_memcpy(chunk + pos, keyword, keysize); + pos += keysize; + chunk[pos++] = 0; /*null termination char*/ + chunk[pos++] = (compress ? 1 : 0); /*compression flag*/ + chunk[pos++] = 0; /*compression method: 0*/ + lodepng_memcpy(chunk + pos, langtag, langsize); + pos += langsize; + chunk[pos++] = 0; /*null termination char*/ + lodepng_memcpy(chunk + pos, transkey, transsize); + pos += transsize; + chunk[pos++] = 0; /*null termination char*/ + if(compress) { + lodepng_memcpy(chunk + pos, compressed, compressedsize); + } else { + lodepng_memcpy(chunk + pos, textstring, textsize); + } + lodepng_chunk_generate_crc(chunk); + } + + lodepng_free(compressed); + return error; +} + +static unsigned addChunk_bKGD(ucvector* out, const LodePNGInfo* info) { + unsigned char* chunk = 0; + if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) { + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 2, "bKGD")); + chunk[8] = (unsigned char)(info->background_r >> 8); + chunk[9] = (unsigned char)(info->background_r & 255); + } else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) { + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 6, "bKGD")); + chunk[8] = (unsigned char)(info->background_r >> 8); + chunk[9] = (unsigned char)(info->background_r & 255); + chunk[10] = (unsigned char)(info->background_g >> 8); + chunk[11] = (unsigned char)(info->background_g & 255); + chunk[12] = (unsigned char)(info->background_b >> 8); + chunk[13] = (unsigned char)(info->background_b & 255); + } else if(info->color.colortype == LCT_PALETTE) { + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 1, "bKGD")); + chunk[8] = (unsigned char)(info->background_r & 255); /*palette index*/ + } + if(chunk) lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_tIME(ucvector* out, const LodePNGTime* time) { + unsigned char* chunk; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 7, "tIME")); + chunk[8] = (unsigned char)(time->year >> 8); + chunk[9] = (unsigned char)(time->year & 255); + chunk[10] = (unsigned char)time->month; + chunk[11] = (unsigned char)time->day; + chunk[12] = (unsigned char)time->hour; + chunk[13] = (unsigned char)time->minute; + chunk[14] = (unsigned char)time->second; + lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_pHYs(ucvector* out, const LodePNGInfo* info) { + unsigned char* chunk; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 9, "pHYs")); + lodepng_set32bitInt(chunk + 8, info->phys_x); + lodepng_set32bitInt(chunk + 12, info->phys_y); + chunk[16] = info->phys_unit; + lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_gAMA(ucvector* out, const LodePNGInfo* info) { + unsigned char* chunk; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 4, "gAMA")); + lodepng_set32bitInt(chunk + 8, info->gama_gamma); + lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_cHRM(ucvector* out, const LodePNGInfo* info) { + unsigned char* chunk; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 32, "cHRM")); + lodepng_set32bitInt(chunk + 8, info->chrm_white_x); + lodepng_set32bitInt(chunk + 12, info->chrm_white_y); + lodepng_set32bitInt(chunk + 16, info->chrm_red_x); + lodepng_set32bitInt(chunk + 20, info->chrm_red_y); + lodepng_set32bitInt(chunk + 24, info->chrm_green_x); + lodepng_set32bitInt(chunk + 28, info->chrm_green_y); + lodepng_set32bitInt(chunk + 32, info->chrm_blue_x); + lodepng_set32bitInt(chunk + 36, info->chrm_blue_y); + lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_sRGB(ucvector* out, const LodePNGInfo* info) { + unsigned char data = info->srgb_intent; + return lodepng_chunk_createv(out, 1, "sRGB", &data); +} + +static unsigned addChunk_iCCP(ucvector* out, const LodePNGInfo* info, LodePNGCompressSettings* zlibsettings) { + unsigned error = 0; + unsigned char* chunk = 0; + unsigned char* compressed = 0; + size_t compressedsize = 0; + size_t keysize = lodepng_strlen(info->iccp_name); + + if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ + error = zlib_compress(&compressed, &compressedsize, + info->iccp_profile, info->iccp_profile_size, zlibsettings); + if(!error) { + size_t size = keysize + 2 + compressedsize; + error = lodepng_chunk_init(&chunk, out, size, "iCCP"); + } + if(!error) { + lodepng_memcpy(chunk + 8, info->iccp_name, keysize); + chunk[8 + keysize] = 0; /*null termination char*/ + chunk[9 + keysize] = 0; /*compression method: 0*/ + lodepng_memcpy(chunk + 10 + keysize, compressed, compressedsize); + lodepng_chunk_generate_crc(chunk); + } + + lodepng_free(compressed); + return error; +} + +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +static void filterScanline(unsigned char* out, const unsigned char* scanline, const unsigned char* prevline, + size_t length, size_t bytewidth, unsigned char filterType) { + size_t i; + switch(filterType) { + case 0: /*None*/ + for(i = 0; i != length; ++i) out[i] = scanline[i]; + break; + case 1: /*Sub*/ + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; + for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - scanline[i - bytewidth]; + break; + case 2: /*Up*/ + if(prevline) { + for(i = 0; i != length; ++i) out[i] = scanline[i] - prevline[i]; + } else { + for(i = 0; i != length; ++i) out[i] = scanline[i]; + } + break; + case 3: /*Average*/ + if(prevline) { + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i] - (prevline[i] >> 1); + for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - ((scanline[i - bytewidth] + prevline[i]) >> 1); + } else { + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; + for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - (scanline[i - bytewidth] >> 1); + } + break; + case 4: /*Paeth*/ + if(prevline) { + /*paethPredictor(0, prevline[i], 0) is always prevline[i]*/ + for(i = 0; i != bytewidth; ++i) out[i] = (scanline[i] - prevline[i]); + for(i = bytewidth; i < length; ++i) { + out[i] = (scanline[i] - paethPredictor(scanline[i - bytewidth], prevline[i], prevline[i - bytewidth])); + } + } else { + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; + /*paethPredictor(scanline[i - bytewidth], 0, 0) is always scanline[i - bytewidth]*/ + for(i = bytewidth; i < length; ++i) out[i] = (scanline[i] - scanline[i - bytewidth]); + } + break; + default: return; /*invalid filter type given*/ + } +} + +/* integer binary logarithm, max return value is 31 */ +static size_t ilog2(size_t i) { + size_t result = 0; + if(i >= 65536) { result += 16; i >>= 16; } + if(i >= 256) { result += 8; i >>= 8; } + if(i >= 16) { result += 4; i >>= 4; } + if(i >= 4) { result += 2; i >>= 2; } + if(i >= 2) { result += 1; /*i >>= 1;*/ } + return result; +} + +/* integer approximation for i * log2(i), helper function for LFS_ENTROPY */ +static size_t ilog2i(size_t i) { + size_t l; + if(i == 0) return 0; + l = ilog2(i); + /* approximate i*log2(i): l is integer logarithm, ((i - (1u << l)) << 1u) + linearly approximates the missing fractional part multiplied by i */ + return i * l + ((i - (1u << l)) << 1u); +} + +static unsigned filter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, + const LodePNGColorMode* color, const LodePNGEncoderSettings* settings) { + /* + For PNG filter method 0 + out must be a buffer with as size: h + (w * h * bpp + 7u) / 8u, because there are + the scanlines with 1 extra byte per scanline + */ + + unsigned bpp = lodepng_get_bpp(color); + /*the width of a scanline in bytes, not including the filter type*/ + size_t linebytes = lodepng_get_raw_size_idat(w, 1, bpp) - 1u; + + /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ + size_t bytewidth = (bpp + 7u) / 8u; + const unsigned char* prevline = 0; + unsigned x, y; + unsigned error = 0; + LodePNGFilterStrategy strategy = settings->filter_strategy; + + /* + There is a heuristic called the minimum sum of absolute differences heuristic, suggested by the PNG standard: + * If the image type is Palette, or the bit depth is smaller than 8, then do not filter the image (i.e. + use fixed filtering, with the filter None). + * (The other case) If the image type is Grayscale or RGB (with or without Alpha), and the bit depth is + not smaller than 8, then use adaptive filtering heuristic as follows: independently for each row, apply + all five filters and select the filter that produces the smallest sum of absolute values per row. + This heuristic is used if filter strategy is LFS_MINSUM and filter_palette_zero is true. + + If filter_palette_zero is true and filter_strategy is not LFS_MINSUM, the above heuristic is followed, + but for "the other case", whatever strategy filter_strategy is set to instead of the minimum sum + heuristic is used. + */ + if(settings->filter_palette_zero && + (color->colortype == LCT_PALETTE || color->bitdepth < 8)) strategy = LFS_ZERO; + + if(bpp == 0) return 31; /*error: invalid color type*/ + + if(strategy >= LFS_ZERO && strategy <= LFS_FOUR) { + unsigned char type = (unsigned char)strategy; + for(y = 0; y != h; ++y) { + size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ + size_t inindex = linebytes * y; + out[outindex] = type; /*filter type byte*/ + filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type); + prevline = &in[inindex]; + } + } else if(strategy == LFS_MINSUM) { + /*adaptive filtering*/ + unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/ + size_t smallest = 0; + unsigned char type, bestType = 0; + + for(type = 0; type != 5; ++type) { + attempt[type] = (unsigned char*)lodepng_malloc(linebytes); + if(!attempt[type]) error = 83; /*alloc fail*/ + } + + if(!error) { + for(y = 0; y != h; ++y) { + /*try the 5 filter types*/ + for(type = 0; type != 5; ++type) { + size_t sum = 0; + filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); + + /*calculate the sum of the result*/ + if(type == 0) { + for(x = 0; x != linebytes; ++x) sum += (unsigned char)(attempt[type][x]); + } else { + for(x = 0; x != linebytes; ++x) { + /*For differences, each byte should be treated as signed, values above 127 are negative + (converted to signed char). Filtertype 0 isn't a difference though, so use unsigned there. + This means filtertype 0 is almost never chosen, but that is justified.*/ + unsigned char s = attempt[type][x]; + sum += s < 128 ? s : (255U - s); + } + } + + /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ + if(type == 0 || sum < smallest) { + bestType = type; + smallest = sum; + } + } + + prevline = &in[y * linebytes]; + + /*now fill the out values*/ + out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ + for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; + } + } + + for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); + } else if(strategy == LFS_ENTROPY) { + unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/ + size_t bestSum = 0; + unsigned type, bestType = 0; + unsigned count[256]; + + for(type = 0; type != 5; ++type) { + attempt[type] = (unsigned char*)lodepng_malloc(linebytes); + if(!attempt[type]) error = 83; /*alloc fail*/ + } + + if(!error) { + for(y = 0; y != h; ++y) { + /*try the 5 filter types*/ + for(type = 0; type != 5; ++type) { + size_t sum = 0; + filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); + lodepng_memset(count, 0, 256 * sizeof(*count)); + for(x = 0; x != linebytes; ++x) ++count[attempt[type][x]]; + ++count[type]; /*the filter type itself is part of the scanline*/ + for(x = 0; x != 256; ++x) { + sum += ilog2i(count[x]); + } + /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ + if(type == 0 || sum > bestSum) { + bestType = type; + bestSum = sum; + } + } + + prevline = &in[y * linebytes]; + + /*now fill the out values*/ + out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ + for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; + } + } + + for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); + } else if(strategy == LFS_PREDEFINED) { + for(y = 0; y != h; ++y) { + size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ + size_t inindex = linebytes * y; + unsigned char type = settings->predefined_filters[y]; + out[outindex] = type; /*filter type byte*/ + filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type); + prevline = &in[inindex]; + } + } else if(strategy == LFS_BRUTE_FORCE) { + /*brute force filter chooser. + deflate the scanline after every filter attempt to see which one deflates best. + This is very slow and gives only slightly smaller, sometimes even larger, result*/ + size_t size[5]; + unsigned char* attempt[5]; /*five filtering attempts, one for each filter type*/ + size_t smallest = 0; + unsigned type = 0, bestType = 0; + unsigned char* dummy; + LodePNGCompressSettings zlibsettings; + lodepng_memcpy(&zlibsettings, &settings->zlibsettings, sizeof(LodePNGCompressSettings)); + /*use fixed tree on the attempts so that the tree is not adapted to the filtertype on purpose, + to simulate the true case where the tree is the same for the whole image. Sometimes it gives + better result with dynamic tree anyway. Using the fixed tree sometimes gives worse, but in rare + cases better compression. It does make this a bit less slow, so it's worth doing this.*/ + zlibsettings.btype = 1; + /*a custom encoder likely doesn't read the btype setting and is optimized for complete PNG + images only, so disable it*/ + zlibsettings.custom_zlib = 0; + zlibsettings.custom_deflate = 0; + for(type = 0; type != 5; ++type) { + attempt[type] = (unsigned char*)lodepng_malloc(linebytes); + if(!attempt[type]) error = 83; /*alloc fail*/ + } + if(!error) { + for(y = 0; y != h; ++y) /*try the 5 filter types*/ { + for(type = 0; type != 5; ++type) { + unsigned testsize = (unsigned)linebytes; + /*if(testsize > 8) testsize /= 8;*/ /*it already works good enough by testing a part of the row*/ + + filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); + size[type] = 0; + dummy = 0; + zlib_compress(&dummy, &size[type], attempt[type], testsize, &zlibsettings); + lodepng_free(dummy); + /*check if this is smallest size (or if type == 0 it's the first case so always store the values)*/ + if(type == 0 || size[type] < smallest) { + bestType = type; + smallest = size[type]; + } + } + prevline = &in[y * linebytes]; + out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ + for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; + } + } + for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); + } + else return 88; /* unknown filter strategy */ + + return error; +} + +static void addPaddingBits(unsigned char* out, const unsigned char* in, + size_t olinebits, size_t ilinebits, unsigned h) { + /*The opposite of the removePaddingBits function + olinebits must be >= ilinebits*/ + unsigned y; + size_t diff = olinebits - ilinebits; + size_t obp = 0, ibp = 0; /*bit pointers*/ + for(y = 0; y != h; ++y) { + size_t x; + for(x = 0; x < ilinebits; ++x) { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + /*obp += diff; --> no, fill in some value in the padding bits too, to avoid + "Use of uninitialised value of size ###" warning from valgrind*/ + for(x = 0; x != diff; ++x) setBitOfReversedStream(&obp, out, 0); + } +} + +/* +in: non-interlaced image with size w*h +out: the same pixels, but re-ordered according to PNG's Adam7 interlacing, with + no padding bits between scanlines, but between reduced images so that each + reduced image starts at a byte. +bpp: bits per pixel +there are no padding bits, not between scanlines, not between reduced images +in has the following size in bits: w * h * bpp. +out is possibly bigger due to padding bits between reduced images +NOTE: comments about padding bits are only relevant if bpp < 8 +*/ +static void Adam7_interlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) { + unsigned passw[7], passh[7]; + size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned i; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + if(bpp >= 8) { + for(i = 0; i != 7; ++i) { + unsigned x, y, b; + size_t bytewidth = bpp / 8u; + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) { + size_t pixelinstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth; + size_t pixeloutstart = passstart[i] + (y * passw[i] + x) * bytewidth; + for(b = 0; b < bytewidth; ++b) { + out[pixeloutstart + b] = in[pixelinstart + b]; + } + } + } + } else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ { + for(i = 0; i != 7; ++i) { + unsigned x, y, b; + unsigned ilinebits = bpp * passw[i]; + unsigned olinebits = bpp * w; + size_t obp, ibp; /*bit pointers (for out and in buffer)*/ + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) { + ibp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp; + obp = (8 * passstart[i]) + (y * ilinebits + x * bpp); + for(b = 0; b < bpp; ++b) { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + } + } + } +} + +/*out must be buffer big enough to contain uncompressed IDAT chunk data, and in must contain the full image. +return value is error**/ +static unsigned preProcessScanlines(unsigned char** out, size_t* outsize, const unsigned char* in, + unsigned w, unsigned h, + const LodePNGInfo* info_png, const LodePNGEncoderSettings* settings) { + /* + This function converts the pure 2D image with the PNG's colortype, into filtered-padded-interlaced data. Steps: + *) if no Adam7: 1) add padding bits (= possible extra bits per scanline if bpp < 8) 2) filter + *) if adam7: 1) Adam7_interlace 2) 7x add padding bits 3) 7x filter + */ + unsigned bpp = lodepng_get_bpp(&info_png->color); + unsigned error = 0; + + if(info_png->interlace_method == 0) { + *outsize = h + (h * ((w * bpp + 7u) / 8u)); /*image size plus an extra byte per scanline + possible padding bits*/ + *out = (unsigned char*)lodepng_malloc(*outsize); + if(!(*out) && (*outsize)) error = 83; /*alloc fail*/ + + if(!error) { + /*non multiple of 8 bits per scanline, padding bits needed per scanline*/ + if(bpp < 8 && w * bpp != ((w * bpp + 7u) / 8u) * 8u) { + unsigned char* padded = (unsigned char*)lodepng_malloc(h * ((w * bpp + 7u) / 8u)); + if(!padded) error = 83; /*alloc fail*/ + if(!error) { + addPaddingBits(padded, in, ((w * bpp + 7u) / 8u) * 8u, w * bpp, h); + error = filter(*out, padded, w, h, &info_png->color, settings); + } + lodepng_free(padded); + } else { + /*we can immediately filter into the out buffer, no other steps needed*/ + error = filter(*out, in, w, h, &info_png->color, settings); + } + } + } else /*interlace_method is 1 (Adam7)*/ { + unsigned passw[7], passh[7]; + size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned char* adam7; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + *outsize = filter_passstart[7]; /*image size plus an extra byte per scanline + possible padding bits*/ + *out = (unsigned char*)lodepng_malloc(*outsize); + if(!(*out)) error = 83; /*alloc fail*/ + + adam7 = (unsigned char*)lodepng_malloc(passstart[7]); + if(!adam7 && passstart[7]) error = 83; /*alloc fail*/ + + if(!error && adam7) { + unsigned i; + + Adam7_interlace(adam7, in, w, h, bpp); + for(i = 0; i != 7; ++i) { + if(bpp < 8) { + unsigned char* padded = (unsigned char*)lodepng_malloc(padded_passstart[i + 1] - padded_passstart[i]); + if(!padded) ERROR_BREAK(83); /*alloc fail*/ + addPaddingBits(padded, &adam7[passstart[i]], + ((passw[i] * bpp + 7u) / 8u) * 8u, passw[i] * bpp, passh[i]); + error = filter(&(*out)[filter_passstart[i]], padded, + passw[i], passh[i], &info_png->color, settings); + lodepng_free(padded); + } else { + error = filter(&(*out)[filter_passstart[i]], &adam7[padded_passstart[i]], + passw[i], passh[i], &info_png->color, settings); + } + + if(error) break; + } + } + + lodepng_free(adam7); + } + + return error; +} + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +static unsigned addUnknownChunks(ucvector* out, unsigned char* data, size_t datasize) { + unsigned char* inchunk = data; + while((size_t)(inchunk - data) < datasize) { + CERROR_TRY_RETURN(lodepng_chunk_append(&out->data, &out->size, inchunk)); + out->allocsize = out->size; /*fix the allocsize again*/ + inchunk = lodepng_chunk_next(inchunk, data + datasize); + } + return 0; +} + +static unsigned isGrayICCProfile(const unsigned char* profile, unsigned size) { + /* + It is a gray profile if bytes 16-19 are "GRAY", rgb profile if bytes 16-19 + are "RGB ". We do not perform any full parsing of the ICC profile here, other + than check those 4 bytes to grayscale profile. Other than that, validity of + the profile is not checked. This is needed only because the PNG specification + requires using a non-gray color model if there is an ICC profile with "RGB " + (sadly limiting compression opportunities if the input data is grayscale RGB + data), and requires using a gray color model if it is "GRAY". + */ + if(size < 20) return 0; + return profile[16] == 'G' && profile[17] == 'R' && profile[18] == 'A' && profile[19] == 'Y'; +} + +static unsigned isRGBICCProfile(const unsigned char* profile, unsigned size) { + /* See comment in isGrayICCProfile*/ + if(size < 20) return 0; + return profile[16] == 'R' && profile[17] == 'G' && profile[18] == 'B' && profile[19] == ' '; +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +unsigned lodepng_encode(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h, + LodePNGState* state) { + unsigned char* data = 0; /*uncompressed version of the IDAT chunk data*/ + size_t datasize = 0; + ucvector outv = ucvector_init(NULL, 0); + LodePNGInfo info; + const LodePNGInfo* info_png = &state->info_png; + + lodepng_info_init(&info); + + /*provide some proper output values if error will happen*/ + *out = 0; + *outsize = 0; + state->error = 0; + + /*check input values validity*/ + if((info_png->color.colortype == LCT_PALETTE || state->encoder.force_palette) + && (info_png->color.palettesize == 0 || info_png->color.palettesize > 256)) { + state->error = 68; /*invalid palette size, it is only allowed to be 1-256*/ + goto cleanup; + } + if(state->encoder.zlibsettings.btype > 2) { + state->error = 61; /*error: invalid btype*/ + goto cleanup; + } + if(info_png->interlace_method > 1) { + state->error = 71; /*error: invalid interlace mode*/ + goto cleanup; + } + state->error = checkColorValidity(info_png->color.colortype, info_png->color.bitdepth); + if(state->error) goto cleanup; /*error: invalid color type given*/ + state->error = checkColorValidity(state->info_raw.colortype, state->info_raw.bitdepth); + if(state->error) goto cleanup; /*error: invalid color type given*/ + + /* color convert and compute scanline filter types */ + lodepng_info_copy(&info, &state->info_png); + if(state->encoder.auto_convert) { + LodePNGColorStats stats; + lodepng_color_stats_init(&stats); +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + if(info_png->iccp_defined && + isGrayICCProfile(info_png->iccp_profile, info_png->iccp_profile_size)) { + /*the PNG specification does not allow to use palette with a GRAY ICC profile, even + if the palette has only gray colors, so disallow it.*/ + stats.allow_palette = 0; + } + if(info_png->iccp_defined && + isRGBICCProfile(info_png->iccp_profile, info_png->iccp_profile_size)) { + /*the PNG specification does not allow to use grayscale color with RGB ICC profile, so disallow gray.*/ + stats.allow_greyscale = 0; + } +#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */ + state->error = lodepng_compute_color_stats(&stats, image, w, h, &state->info_raw); + if(state->error) goto cleanup; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + if(info_png->background_defined) { + /*the background chunk's color must be taken into account as well*/ + unsigned r = 0, g = 0, b = 0; + LodePNGColorMode mode16 = lodepng_color_mode_make(LCT_RGB, 16); + lodepng_convert_rgb(&r, &g, &b, info_png->background_r, info_png->background_g, info_png->background_b, &mode16, &info_png->color); + state->error = lodepng_color_stats_add(&stats, r, g, b, 65535); + if(state->error) goto cleanup; + } +#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */ + state->error = auto_choose_color(&info.color, &state->info_raw, &stats); + if(state->error) goto cleanup; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*also convert the background chunk*/ + if(info_png->background_defined) { + if(lodepng_convert_rgb(&info.background_r, &info.background_g, &info.background_b, + info_png->background_r, info_png->background_g, info_png->background_b, &info.color, &info_png->color)) { + state->error = 104; + goto cleanup; + } + } +#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */ + } +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + if(info_png->iccp_defined) { + unsigned gray_icc = isGrayICCProfile(info_png->iccp_profile, info_png->iccp_profile_size); + unsigned rgb_icc = isRGBICCProfile(info_png->iccp_profile, info_png->iccp_profile_size); + unsigned gray_png = info.color.colortype == LCT_GREY || info.color.colortype == LCT_GREY_ALPHA; + if(!gray_icc && !rgb_icc) { + state->error = 100; /* Disallowed profile color type for PNG */ + goto cleanup; + } + if(gray_icc != gray_png) { + /*Not allowed to use RGB/RGBA/palette with GRAY ICC profile or vice versa, + or in case of auto_convert, it wasn't possible to find appropriate model*/ + state->error = state->encoder.auto_convert ? 102 : 101; + goto cleanup; + } + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + if(!lodepng_color_mode_equal(&state->info_raw, &info.color)) { + unsigned char* converted; + size_t size = ((size_t)w * (size_t)h * (size_t)lodepng_get_bpp(&info.color) + 7u) / 8u; + + converted = (unsigned char*)lodepng_malloc(size); + if(!converted && size) state->error = 83; /*alloc fail*/ + if(!state->error) { + state->error = lodepng_convert(converted, image, &info.color, &state->info_raw, w, h); + } + if(!state->error) { + state->error = preProcessScanlines(&data, &datasize, converted, w, h, &info, &state->encoder); + } + lodepng_free(converted); + if(state->error) goto cleanup; + } else { + state->error = preProcessScanlines(&data, &datasize, image, w, h, &info, &state->encoder); + if(state->error) goto cleanup; + } + + /* output all PNG chunks */ { +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + size_t i; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + /*write signature and chunks*/ + state->error = writeSignature(&outv); + if(state->error) goto cleanup; + /*IHDR*/ + state->error = addChunk_IHDR(&outv, w, h, info.color.colortype, info.color.bitdepth, info.interlace_method); + if(state->error) goto cleanup; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*unknown chunks between IHDR and PLTE*/ + if(info.unknown_chunks_data[0]) { + state->error = addUnknownChunks(&outv, info.unknown_chunks_data[0], info.unknown_chunks_size[0]); + if(state->error) goto cleanup; + } + /*color profile chunks must come before PLTE */ + if(info.iccp_defined) { + state->error = addChunk_iCCP(&outv, &info, &state->encoder.zlibsettings); + if(state->error) goto cleanup; + } + if(info.srgb_defined) { + state->error = addChunk_sRGB(&outv, &info); + if(state->error) goto cleanup; + } + if(info.gama_defined) { + state->error = addChunk_gAMA(&outv, &info); + if(state->error) goto cleanup; + } + if(info.chrm_defined) { + state->error = addChunk_cHRM(&outv, &info); + if(state->error) goto cleanup; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + /*PLTE*/ + if(info.color.colortype == LCT_PALETTE) { + state->error = addChunk_PLTE(&outv, &info.color); + if(state->error) goto cleanup; + } + if(state->encoder.force_palette && (info.color.colortype == LCT_RGB || info.color.colortype == LCT_RGBA)) { + /*force_palette means: write suggested palette for truecolor in PLTE chunk*/ + state->error = addChunk_PLTE(&outv, &info.color); + if(state->error) goto cleanup; + } + /*tRNS (this will only add if when necessary) */ + state->error = addChunk_tRNS(&outv, &info.color); + if(state->error) goto cleanup; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*bKGD (must come between PLTE and the IDAt chunks*/ + if(info.background_defined) { + state->error = addChunk_bKGD(&outv, &info); + if(state->error) goto cleanup; + } + /*pHYs (must come before the IDAT chunks)*/ + if(info.phys_defined) { + state->error = addChunk_pHYs(&outv, &info); + if(state->error) goto cleanup; + } + + /*unknown chunks between PLTE and IDAT*/ + if(info.unknown_chunks_data[1]) { + state->error = addUnknownChunks(&outv, info.unknown_chunks_data[1], info.unknown_chunks_size[1]); + if(state->error) goto cleanup; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + /*IDAT (multiple IDAT chunks must be consecutive)*/ + state->error = addChunk_IDAT(&outv, data, datasize, &state->encoder.zlibsettings); + if(state->error) goto cleanup; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*tIME*/ + if(info.time_defined) { + state->error = addChunk_tIME(&outv, &info.time); + if(state->error) goto cleanup; + } + /*tEXt and/or zTXt*/ + for(i = 0; i != info.text_num; ++i) { + if(lodepng_strlen(info.text_keys[i]) > 79) { + state->error = 66; /*text chunk too large*/ + goto cleanup; + } + if(lodepng_strlen(info.text_keys[i]) < 1) { + state->error = 67; /*text chunk too small*/ + goto cleanup; + } + if(state->encoder.text_compression) { + state->error = addChunk_zTXt(&outv, info.text_keys[i], info.text_strings[i], &state->encoder.zlibsettings); + if(state->error) goto cleanup; + } else { + state->error = addChunk_tEXt(&outv, info.text_keys[i], info.text_strings[i]); + if(state->error) goto cleanup; + } + } + /*LodePNG version id in text chunk*/ + if(state->encoder.add_id) { + unsigned already_added_id_text = 0; + for(i = 0; i != info.text_num; ++i) { + const char* k = info.text_keys[i]; + /* Could use strcmp, but we're not calling or reimplementing this C library function for this use only */ + if(k[0] == 'L' && k[1] == 'o' && k[2] == 'd' && k[3] == 'e' && + k[4] == 'P' && k[5] == 'N' && k[6] == 'G' && k[7] == '\0') { + already_added_id_text = 1; + break; + } + } + if(already_added_id_text == 0) { + state->error = addChunk_tEXt(&outv, "LodePNG", LODEPNG_VERSION_STRING); /*it's shorter as tEXt than as zTXt chunk*/ + if(state->error) goto cleanup; + } + } + /*iTXt*/ + for(i = 0; i != info.itext_num; ++i) { + if(lodepng_strlen(info.itext_keys[i]) > 79) { + state->error = 66; /*text chunk too large*/ + goto cleanup; + } + if(lodepng_strlen(info.itext_keys[i]) < 1) { + state->error = 67; /*text chunk too small*/ + goto cleanup; + } + state->error = addChunk_iTXt( + &outv, state->encoder.text_compression, + info.itext_keys[i], info.itext_langtags[i], info.itext_transkeys[i], info.itext_strings[i], + &state->encoder.zlibsettings); + if(state->error) goto cleanup; + } + + /*unknown chunks between IDAT and IEND*/ + if(info.unknown_chunks_data[2]) { + state->error = addUnknownChunks(&outv, info.unknown_chunks_data[2], info.unknown_chunks_size[2]); + if(state->error) goto cleanup; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + state->error = addChunk_IEND(&outv); + if(state->error) goto cleanup; + } + +cleanup: + lodepng_info_cleanup(&info); + lodepng_free(data); + + /*instead of cleaning the vector up, give it to the output*/ + *out = outv.data; + *outsize = outv.size; + + return state->error; +} + +unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, const unsigned char* image, + unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) { + unsigned error; + LodePNGState state; + lodepng_state_init(&state); + state.info_raw.colortype = colortype; + state.info_raw.bitdepth = bitdepth; + state.info_png.color.colortype = colortype; + state.info_png.color.bitdepth = bitdepth; + lodepng_encode(out, outsize, image, w, h, &state); + error = state.error; + lodepng_state_cleanup(&state); + return error; +} + +unsigned lodepng_encode32(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) { + return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGBA, 8); +} + +unsigned lodepng_encode24(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) { + return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGB, 8); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned lodepng_encode_file(const char* filename, const unsigned char* image, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) { + unsigned char* buffer; + size_t buffersize; + unsigned error = lodepng_encode_memory(&buffer, &buffersize, image, w, h, colortype, bitdepth); + if(!error) error = lodepng_save_file(buffer, buffersize, filename); + lodepng_free(buffer); + return error; +} + +unsigned lodepng_encode32_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) { + return lodepng_encode_file(filename, image, w, h, LCT_RGBA, 8); +} + +unsigned lodepng_encode24_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) { + return lodepng_encode_file(filename, image, w, h, LCT_RGB, 8); +} +#endif /*LODEPNG_COMPILE_DISK*/ + +void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings) { + lodepng_compress_settings_init(&settings->zlibsettings); + settings->filter_palette_zero = 1; + settings->filter_strategy = LFS_MINSUM; + settings->auto_convert = 1; + settings->force_palette = 0; + settings->predefined_filters = 0; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + settings->add_id = 0; + settings->text_compression = 1; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} + +#endif /*LODEPNG_COMPILE_ENCODER*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +#ifdef LODEPNG_COMPILE_ERROR_TEXT +/* +This returns the description of a numerical error code in English. This is also +the documentation of all the error codes. +*/ +const char* lodepng_error_text(unsigned code) { + switch(code) { + case 0: return "no error, everything went ok"; + case 1: return "nothing done yet"; /*the Encoder/Decoder has done nothing yet, error checking makes no sense yet*/ + case 10: return "end of input memory reached without huffman end code"; /*while huffman decoding*/ + case 11: return "error in code tree made it jump outside of huffman tree"; /*while huffman decoding*/ + case 13: return "problem while processing dynamic deflate block"; + case 14: return "problem while processing dynamic deflate block"; + case 15: return "problem while processing dynamic deflate block"; + /*this error could happen if there are only 0 or 1 symbols present in the huffman code:*/ + case 16: return "invalid code while processing dynamic deflate block"; + case 17: return "end of out buffer memory reached while inflating"; + case 18: return "invalid distance code while inflating"; + case 19: return "end of out buffer memory reached while inflating"; + case 20: return "invalid deflate block BTYPE encountered while decoding"; + case 21: return "NLEN is not ones complement of LEN in a deflate block"; + + /*end of out buffer memory reached while inflating: + This can happen if the inflated deflate data is longer than the amount of bytes required to fill up + all the pixels of the image, given the color depth and image dimensions. Something that doesn't + happen in a normal, well encoded, PNG image.*/ + case 22: return "end of out buffer memory reached while inflating"; + case 23: return "end of in buffer memory reached while inflating"; + case 24: return "invalid FCHECK in zlib header"; + case 25: return "invalid compression method in zlib header"; + case 26: return "FDICT encountered in zlib header while it's not used for PNG"; + case 27: return "PNG file is smaller than a PNG header"; + /*Checks the magic file header, the first 8 bytes of the PNG file*/ + case 28: return "incorrect PNG signature, it's no PNG or corrupted"; + case 29: return "first chunk is not the header chunk"; + case 30: return "chunk length too large, chunk broken off at end of file"; + case 31: return "illegal PNG color type or bpp"; + case 32: return "illegal PNG compression method"; + case 33: return "illegal PNG filter method"; + case 34: return "illegal PNG interlace method"; + case 35: return "chunk length of a chunk is too large or the chunk too small"; + case 36: return "illegal PNG filter type encountered"; + case 37: return "illegal bit depth for this color type given"; + case 38: return "the palette is too small or too big"; /*0, or more than 256 colors*/ + case 39: return "tRNS chunk before PLTE or has more entries than palette size"; + case 40: return "tRNS chunk has wrong size for grayscale image"; + case 41: return "tRNS chunk has wrong size for RGB image"; + case 42: return "tRNS chunk appeared while it was not allowed for this color type"; + case 43: return "bKGD chunk has wrong size for palette image"; + case 44: return "bKGD chunk has wrong size for grayscale image"; + case 45: return "bKGD chunk has wrong size for RGB image"; + case 48: return "empty input buffer given to decoder. Maybe caused by non-existing file?"; + case 49: return "jumped past memory while generating dynamic huffman tree"; + case 50: return "jumped past memory while generating dynamic huffman tree"; + case 51: return "jumped past memory while inflating huffman block"; + case 52: return "jumped past memory while inflating"; + case 53: return "size of zlib data too small"; + case 54: return "repeat symbol in tree while there was no value symbol yet"; + /*jumped past tree while generating huffman tree, this could be when the + tree will have more leaves than symbols after generating it out of the + given lengths. They call this an oversubscribed dynamic bit lengths tree in zlib.*/ + case 55: return "jumped past tree while generating huffman tree"; + case 56: return "given output image colortype or bitdepth not supported for color conversion"; + case 57: return "invalid CRC encountered (checking CRC can be disabled)"; + case 58: return "invalid ADLER32 encountered (checking ADLER32 can be disabled)"; + case 59: return "requested color conversion not supported"; + case 60: return "invalid window size given in the settings of the encoder (must be 0-32768)"; + case 61: return "invalid BTYPE given in the settings of the encoder (only 0, 1 and 2 are allowed)"; + /*LodePNG leaves the choice of RGB to grayscale conversion formula to the user.*/ + case 62: return "conversion from color to grayscale not supported"; + /*(2^31-1)*/ + case 63: return "length of a chunk too long, max allowed for PNG is 2147483647 bytes per chunk"; + /*this would result in the inability of a deflated block to ever contain an end code. It must be at least 1.*/ + case 64: return "the length of the END symbol 256 in the Huffman tree is 0"; + case 66: return "the length of a text chunk keyword given to the encoder is longer than the maximum of 79 bytes"; + case 67: return "the length of a text chunk keyword given to the encoder is smaller than the minimum of 1 byte"; + case 68: return "tried to encode a PLTE chunk with a palette that has less than 1 or more than 256 colors"; + case 69: return "unknown chunk type with 'critical' flag encountered by the decoder"; + case 71: return "invalid interlace mode given to encoder (must be 0 or 1)"; + case 72: return "while decoding, invalid compression method encountering in zTXt or iTXt chunk (it must be 0)"; + case 73: return "invalid tIME chunk size"; + case 74: return "invalid pHYs chunk size"; + /*length could be wrong, or data chopped off*/ + case 75: return "no null termination char found while decoding text chunk"; + case 76: return "iTXt chunk too short to contain required bytes"; + case 77: return "integer overflow in buffer size"; + case 78: return "failed to open file for reading"; /*file doesn't exist or couldn't be opened for reading*/ + case 79: return "failed to open file for writing"; + case 80: return "tried creating a tree of 0 symbols"; + case 81: return "lazy matching at pos 0 is impossible"; + case 82: return "color conversion to palette requested while a color isn't in palette, or index out of bounds"; + case 83: return "memory allocation failed"; + case 84: return "given image too small to contain all pixels to be encoded"; + case 86: return "impossible offset in lz77 encoding (internal bug)"; + case 87: return "must provide custom zlib function pointer if LODEPNG_COMPILE_ZLIB is not defined"; + case 88: return "invalid filter strategy given for LodePNGEncoderSettings.filter_strategy"; + case 89: return "text chunk keyword too short or long: must have size 1-79"; + /*the windowsize in the LodePNGCompressSettings. Requiring POT(==> & instead of %) makes encoding 12% faster.*/ + case 90: return "windowsize must be a power of two"; + case 91: return "invalid decompressed idat size"; + case 92: return "integer overflow due to too many pixels"; + case 93: return "zero width or height is invalid"; + case 94: return "header chunk must have a size of 13 bytes"; + case 95: return "integer overflow with combined idat chunk size"; + case 96: return "invalid gAMA chunk size"; + case 97: return "invalid cHRM chunk size"; + case 98: return "invalid sRGB chunk size"; + case 99: return "invalid sRGB rendering intent"; + case 100: return "invalid ICC profile color type, the PNG specification only allows RGB or GRAY"; + case 101: return "PNG specification does not allow RGB ICC profile on gray color types and vice versa"; + case 102: return "not allowed to set grayscale ICC profile with colored pixels by PNG specification"; + case 103: return "invalid palette index in bKGD chunk. Maybe it came before PLTE chunk?"; + case 104: return "invalid bKGD color while encoding (e.g. palette index out of range)"; + case 105: return "integer overflow of bitsize"; + case 106: return "PNG file must have PLTE chunk if color type is palette"; + case 107: return "color convert from palette mode requested without setting the palette data in it"; + case 108: return "tried to add more than 256 values to a palette"; + /*this limit can be configured in LodePNGDecompressSettings*/ + case 109: return "tried to decompress zlib or deflate data larger than desired max_output_size"; + case 110: return "custom zlib or inflate decompression failed"; + case 111: return "custom zlib or deflate compression failed"; + /*max text size limit can be configured in LodePNGDecoderSettings. This error prevents + unreasonable memory consumption when decoding due to impossibly large text sizes.*/ + case 112: return "compressed text unreasonably large"; + /*max ICC size limit can be configured in LodePNGDecoderSettings. This error prevents + unreasonable memory consumption when decoding due to impossibly large ICC profile*/ + case 113: return "ICC profile unreasonably large"; + } + return "unknown error code"; +} +#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // C++ Wrapper // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_CPP +namespace lodepng { + +#ifdef LODEPNG_COMPILE_DISK +unsigned load_file(std::vector& buffer, const std::string& filename) { + long size = lodepng_filesize(filename.c_str()); + if(size < 0) return 78; + buffer.resize((size_t)size); + return size == 0 ? 0 : lodepng_buffer_file(&buffer[0], (size_t)size, filename.c_str()); +} + +/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ +unsigned save_file(const std::vector& buffer, const std::string& filename) { + return lodepng_save_file(buffer.empty() ? 0 : &buffer[0], buffer.size(), filename.c_str()); +} +#endif /* LODEPNG_COMPILE_DISK */ + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_DECODER +unsigned decompress(std::vector& out, const unsigned char* in, size_t insize, + const LodePNGDecompressSettings& settings) { + unsigned char* buffer = 0; + size_t buffersize = 0; + unsigned error = zlib_decompress(&buffer, &buffersize, 0, in, insize, &settings); + if(buffer) { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned decompress(std::vector& out, const std::vector& in, + const LodePNGDecompressSettings& settings) { + return decompress(out, in.empty() ? 0 : &in[0], in.size(), settings); +} +#endif /* LODEPNG_COMPILE_DECODER */ + +#ifdef LODEPNG_COMPILE_ENCODER +unsigned compress(std::vector& out, const unsigned char* in, size_t insize, + const LodePNGCompressSettings& settings) { + unsigned char* buffer = 0; + size_t buffersize = 0; + unsigned error = zlib_compress(&buffer, &buffersize, in, insize, &settings); + if(buffer) { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned compress(std::vector& out, const std::vector& in, + const LodePNGCompressSettings& settings) { + return compress(out, in.empty() ? 0 : &in[0], in.size(), settings); +} +#endif /* LODEPNG_COMPILE_ENCODER */ +#endif /* LODEPNG_COMPILE_ZLIB */ + + +#ifdef LODEPNG_COMPILE_PNG + +State::State() { + lodepng_state_init(this); +} + +State::State(const State& other) { + lodepng_state_init(this); + lodepng_state_copy(this, &other); +} + +State::~State() { + lodepng_state_cleanup(this); +} + +State& State::operator=(const State& other) { + lodepng_state_copy(this, &other); + return *this; +} + +#ifdef LODEPNG_COMPILE_DECODER + +unsigned decode(std::vector& out, unsigned& w, unsigned& h, const unsigned char* in, + size_t insize, LodePNGColorType colortype, unsigned bitdepth) { + unsigned char* buffer = 0; + unsigned error = lodepng_decode_memory(&buffer, &w, &h, in, insize, colortype, bitdepth); + if(buffer && !error) { + State state; + state.info_raw.colortype = colortype; + state.info_raw.bitdepth = bitdepth; + size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + } + lodepng_free(buffer); + return error; +} + +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + const std::vector& in, LodePNGColorType colortype, unsigned bitdepth) { + return decode(out, w, h, in.empty() ? 0 : &in[0], (unsigned)in.size(), colortype, bitdepth); +} + +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + State& state, + const unsigned char* in, size_t insize) { + unsigned char* buffer = NULL; + unsigned error = lodepng_decode(&buffer, &w, &h, &state, in, insize); + if(buffer && !error) { + size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + } + lodepng_free(buffer); + return error; +} + +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + State& state, + const std::vector& in) { + return decode(out, w, h, state, in.empty() ? 0 : &in[0], in.size()); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned decode(std::vector& out, unsigned& w, unsigned& h, const std::string& filename, + LodePNGColorType colortype, unsigned bitdepth) { + std::vector buffer; + /* safe output values in case error happens */ + w = h = 0; + unsigned error = load_file(buffer, filename); + if(error) return error; + return decode(out, w, h, buffer, colortype, bitdepth); +} +#endif /* LODEPNG_COMPILE_DECODER */ +#endif /* LODEPNG_COMPILE_DISK */ + +#ifdef LODEPNG_COMPILE_ENCODER +unsigned encode(std::vector& out, const unsigned char* in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) { + unsigned char* buffer; + size_t buffersize; + unsigned error = lodepng_encode_memory(&buffer, &buffersize, in, w, h, colortype, bitdepth); + if(buffer) { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned encode(std::vector& out, + const std::vector& in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) { + if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; + return encode(out, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); +} + +unsigned encode(std::vector& out, + const unsigned char* in, unsigned w, unsigned h, + State& state) { + unsigned char* buffer; + size_t buffersize; + unsigned error = lodepng_encode(&buffer, &buffersize, in, w, h, &state); + if(buffer) { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned encode(std::vector& out, + const std::vector& in, unsigned w, unsigned h, + State& state) { + if(lodepng_get_raw_size(w, h, &state.info_raw) > in.size()) return 84; + return encode(out, in.empty() ? 0 : &in[0], w, h, state); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned encode(const std::string& filename, + const unsigned char* in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) { + std::vector buffer; + unsigned error = encode(buffer, in, w, h, colortype, bitdepth); + if(!error) error = save_file(buffer, filename); + return error; +} + +unsigned encode(const std::string& filename, + const std::vector& in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) { + if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; + return encode(filename, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); +} +#endif /* LODEPNG_COMPILE_DISK */ +#endif /* LODEPNG_COMPILE_ENCODER */ +#endif /* LODEPNG_COMPILE_PNG */ +} /* namespace lodepng */ +#endif /*LODEPNG_COMPILE_CPP*/ + +#endif /*LV_USE_PNG*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/png/lodepng.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/png/lodepng.h new file mode 100644 index 0000000..dbfed72 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/png/lodepng.h @@ -0,0 +1,1981 @@ +/* +LodePNG version 20201017 + +Copyright (c) 2005-2020 Lode Vandevenne + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ + +#ifndef LODEPNG_H +#define LODEPNG_H + +#include /*for size_t*/ + +#include "../../../lvgl.h" +#if LV_USE_PNG +extern const char* LODEPNG_VERSION_STRING; + +/* +The following #defines are used to create code sections. They can be disabled +to disable code sections, which can give faster compile time and smaller binary. +The "NO_COMPILE" defines are designed to be used to pass as defines to the +compiler command to disable them without modifying this header, e.g. +-DLODEPNG_NO_COMPILE_ZLIB for gcc. +In addition to those below, you can also define LODEPNG_NO_COMPILE_CRC to +allow implementing a custom lodepng_crc32. +*/ +/*deflate & zlib. If disabled, you must specify alternative zlib functions in +the custom_zlib field of the compress and decompress settings*/ +#ifndef LODEPNG_NO_COMPILE_ZLIB +#define LODEPNG_COMPILE_ZLIB +#endif + +/*png encoder and png decoder*/ +#ifndef LODEPNG_NO_COMPILE_PNG +#define LODEPNG_COMPILE_PNG +#endif + +/*deflate&zlib decoder and png decoder*/ +#ifndef LODEPNG_NO_COMPILE_DECODER +#define LODEPNG_COMPILE_DECODER +#endif + +/*deflate&zlib encoder and png encoder*/ +#ifndef LODEPNG_NO_COMPILE_ENCODER +#define LODEPNG_COMPILE_ENCODER +#endif + +/*the optional built in harddisk file loading and saving functions*/ +#ifndef LODEPNG_NO_COMPILE_DISK +#define LODEPNG_COMPILE_DISK +#endif + +/*support for chunks other than IHDR, IDAT, PLTE, tRNS, IEND: ancillary and unknown chunks*/ +#ifndef LODEPNG_NO_COMPILE_ANCILLARY_CHUNKS +#define LODEPNG_COMPILE_ANCILLARY_CHUNKS +#endif + +/*ability to convert error numerical codes to English text string*/ +#ifndef LODEPNG_NO_COMPILE_ERROR_TEXT +#define LODEPNG_COMPILE_ERROR_TEXT +#endif + +/*Compile the default allocators (C's free, malloc and realloc). If you disable this, +you can define the functions lodepng_free, lodepng_malloc and lodepng_realloc in your +source files with custom allocators.*/ +#ifndef LODEPNG_NO_COMPILE_ALLOCATORS +#define LODEPNG_COMPILE_ALLOCATORS +#endif + +/*compile the C++ version (you can disable the C++ wrapper here even when compiling for C++)*/ +#ifdef __cplusplus +#ifndef LODEPNG_NO_COMPILE_CPP +#define LODEPNG_COMPILE_CPP +#endif +#endif + +#ifdef LODEPNG_COMPILE_CPP +#include +#include +#endif /*LODEPNG_COMPILE_CPP*/ + +#ifdef LODEPNG_COMPILE_PNG +/*The PNG color types (also used for raw image).*/ +typedef enum LodePNGColorType { + LCT_GREY = 0, /*grayscale: 1,2,4,8,16 bit*/ + LCT_RGB = 2, /*RGB: 8,16 bit*/ + LCT_PALETTE = 3, /*palette: 1,2,4,8 bit*/ + LCT_GREY_ALPHA = 4, /*grayscale with alpha: 8,16 bit*/ + LCT_RGBA = 6, /*RGB with alpha: 8,16 bit*/ + /*LCT_MAX_OCTET_VALUE lets the compiler allow this enum to represent any invalid + byte value from 0 to 255 that could be present in an invalid PNG file header. Do + not use, compare with or set the name LCT_MAX_OCTET_VALUE, instead either use + the valid color type names above, or numeric values like 1 or 7 when checking for + particular disallowed color type byte values, or cast to integer to print it.*/ + LCT_MAX_OCTET_VALUE = 255 +} LodePNGColorType; + +#ifdef LODEPNG_COMPILE_DECODER +/* +Converts PNG data in memory to raw pixel data. +out: Output parameter. Pointer to buffer that will contain the raw pixel data. + After decoding, its size is w * h * (bytes per pixel) bytes larger than + initially. Bytes per pixel depends on colortype and bitdepth. + Must be freed after usage with free(*out). + Note: for 16-bit per channel colors, uses big endian format like PNG does. +w: Output parameter. Pointer to width of pixel data. +h: Output parameter. Pointer to height of pixel data. +in: Memory buffer with the PNG file. +insize: size of the in buffer. +colortype: the desired color type for the raw output image. See explanation on PNG color types. +bitdepth: the desired bit depth for the raw output image. See explanation on PNG color types. +Return value: LodePNG error code (0 means no error). +*/ +unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, + const unsigned char* in, size_t insize, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_decode_memory, but always decodes to 32-bit RGBA raw image*/ +unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, + const unsigned char* in, size_t insize); + +/*Same as lodepng_decode_memory, but always decodes to 24-bit RGB raw image*/ +unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, + const unsigned char* in, size_t insize); + +#ifdef LODEPNG_COMPILE_DISK +/* +Load PNG from disk, from file with given name. +Same as the other decode functions, but instead takes a filename as input. +*/ +unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, + const char* filename, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_decode_file, but always decodes to 32-bit RGBA raw image.*/ +unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, + const char* filename); + +/*Same as lodepng_decode_file, but always decodes to 24-bit RGB raw image.*/ +unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, + const char* filename); +#endif /*LODEPNG_COMPILE_DISK*/ +#endif /*LODEPNG_COMPILE_DECODER*/ + + +#ifdef LODEPNG_COMPILE_ENCODER +/* +Converts raw pixel data into a PNG image in memory. The colortype and bitdepth + of the output PNG image cannot be chosen, they are automatically determined + by the colortype, bitdepth and content of the input pixel data. + Note: for 16-bit per channel colors, needs big endian format like PNG does. +out: Output parameter. Pointer to buffer that will contain the PNG image data. + Must be freed after usage with free(*out). +outsize: Output parameter. Pointer to the size in bytes of the out buffer. +image: The raw pixel data to encode. The size of this buffer should be + w * h * (bytes per pixel), bytes per pixel depends on colortype and bitdepth. +w: width of the raw pixel data in pixels. +h: height of the raw pixel data in pixels. +colortype: the color type of the raw input image. See explanation on PNG color types. +bitdepth: the bit depth of the raw input image. See explanation on PNG color types. +Return value: LodePNG error code (0 means no error). +*/ +unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_encode_memory, but always encodes from 32-bit RGBA raw image.*/ +unsigned lodepng_encode32(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h); + +/*Same as lodepng_encode_memory, but always encodes from 24-bit RGB raw image.*/ +unsigned lodepng_encode24(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h); + +#ifdef LODEPNG_COMPILE_DISK +/* +Converts raw pixel data into a PNG file on disk. +Same as the other encode functions, but instead takes a filename as output. +NOTE: This overwrites existing files without warning! +*/ +unsigned lodepng_encode_file(const char* filename, + const unsigned char* image, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_encode_file, but always encodes from 32-bit RGBA raw image.*/ +unsigned lodepng_encode32_file(const char* filename, + const unsigned char* image, unsigned w, unsigned h); + +/*Same as lodepng_encode_file, but always encodes from 24-bit RGB raw image.*/ +unsigned lodepng_encode24_file(const char* filename, + const unsigned char* image, unsigned w, unsigned h); +#endif /*LODEPNG_COMPILE_DISK*/ +#endif /*LODEPNG_COMPILE_ENCODER*/ + + +#ifdef LODEPNG_COMPILE_CPP +namespace lodepng { +#ifdef LODEPNG_COMPILE_DECODER +/*Same as lodepng_decode_memory, but decodes to an std::vector. The colortype +is the format to output the pixels to. Default is RGBA 8-bit per channel.*/ +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + const unsigned char* in, size_t insize, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + const std::vector& in, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#ifdef LODEPNG_COMPILE_DISK +/* +Converts PNG file from disk to raw pixel data in memory. +Same as the other decode functions, but instead takes a filename as input. +*/ +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + const std::string& filename, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#endif /* LODEPNG_COMPILE_DISK */ +#endif /* LODEPNG_COMPILE_DECODER */ + +#ifdef LODEPNG_COMPILE_ENCODER +/*Same as lodepng_encode_memory, but encodes to an std::vector. colortype +is that of the raw input data. The output PNG color type will be auto chosen.*/ +unsigned encode(std::vector& out, + const unsigned char* in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +unsigned encode(std::vector& out, + const std::vector& in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#ifdef LODEPNG_COMPILE_DISK +/* +Converts 32-bit RGBA raw pixel data into a PNG file on disk. +Same as the other encode functions, but instead takes a filename as output. +NOTE: This overwrites existing files without warning! +*/ +unsigned encode(const std::string& filename, + const unsigned char* in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +unsigned encode(const std::string& filename, + const std::vector& in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#endif /* LODEPNG_COMPILE_DISK */ +#endif /* LODEPNG_COMPILE_ENCODER */ +} /* namespace lodepng */ +#endif /*LODEPNG_COMPILE_CPP*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +#ifdef LODEPNG_COMPILE_ERROR_TEXT +/*Returns an English description of the numerical error code.*/ +const char* lodepng_error_text(unsigned code); +#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ + +#ifdef LODEPNG_COMPILE_DECODER +/*Settings for zlib decompression*/ +typedef struct LodePNGDecompressSettings LodePNGDecompressSettings; +struct LodePNGDecompressSettings { + /* Check LodePNGDecoderSettings for more ignorable errors such as ignore_crc */ + unsigned ignore_adler32; /*if 1, continue and don't give an error message if the Adler32 checksum is corrupted*/ + unsigned ignore_nlen; /*ignore complement of len checksum in uncompressed blocks*/ + + /*Maximum decompressed size, beyond this the decoder may (and is encouraged to) stop decoding, + return an error, output a data size > max_output_size and all the data up to that point. This is + not hard limit nor a guarantee, but can prevent excessive memory usage. This setting is + ignored by the PNG decoder, but is used by the deflate/zlib decoder and can be used by custom ones. + Set to 0 to impose no limit (the default).*/ + size_t max_output_size; + + /*use custom zlib decoder instead of built in one (default: null). + Should return 0 if success, any non-0 if error (numeric value not exposed).*/ + unsigned (*custom_zlib)(unsigned char**, size_t*, + const unsigned char*, size_t, + const LodePNGDecompressSettings*); + /*use custom deflate decoder instead of built in one (default: null) + if custom_zlib is not null, custom_inflate is ignored (the zlib format uses deflate). + Should return 0 if success, any non-0 if error (numeric value not exposed).*/ + unsigned (*custom_inflate)(unsigned char**, size_t*, + const unsigned char*, size_t, + const LodePNGDecompressSettings*); + + const void* custom_context; /*optional custom settings for custom functions*/ +}; + +extern const LodePNGDecompressSettings lodepng_default_decompress_settings; +void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/* +Settings for zlib compression. Tweaking these settings tweaks the balance +between speed and compression ratio. +*/ +typedef struct LodePNGCompressSettings LodePNGCompressSettings; +struct LodePNGCompressSettings /*deflate = compress*/ { + /*LZ77 related settings*/ + unsigned btype; /*the block type for LZ (0, 1, 2 or 3, see zlib standard). Should be 2 for proper compression.*/ + unsigned use_lz77; /*whether or not to use LZ77. Should be 1 for proper compression.*/ + unsigned windowsize; /*must be a power of two <= 32768. higher compresses more but is slower. Default value: 2048.*/ + unsigned minmatch; /*minimum lz77 length. 3 is normally best, 6 can be better for some PNGs. Default: 0*/ + unsigned nicematch; /*stop searching if >= this length found. Set to 258 for best compression. Default: 128*/ + unsigned lazymatching; /*use lazy matching: better compression but a bit slower. Default: true*/ + + /*use custom zlib encoder instead of built in one (default: null)*/ + unsigned (*custom_zlib)(unsigned char**, size_t*, + const unsigned char*, size_t, + const LodePNGCompressSettings*); + /*use custom deflate encoder instead of built in one (default: null) + if custom_zlib is used, custom_deflate is ignored since only the built in + zlib function will call custom_deflate*/ + unsigned (*custom_deflate)(unsigned char**, size_t*, + const unsigned char*, size_t, + const LodePNGCompressSettings*); + + const void* custom_context; /*optional custom settings for custom functions*/ +}; + +extern const LodePNGCompressSettings lodepng_default_compress_settings; +void lodepng_compress_settings_init(LodePNGCompressSettings* settings); +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_PNG +/* +Color mode of an image. Contains all information required to decode the pixel +bits to RGBA colors. This information is the same as used in the PNG file +format, and is used both for PNG and raw image data in LodePNG. +*/ +typedef struct LodePNGColorMode { + /*header (IHDR)*/ + LodePNGColorType colortype; /*color type, see PNG standard or documentation further in this header file*/ + unsigned bitdepth; /*bits per sample, see PNG standard or documentation further in this header file*/ + + /* + palette (PLTE and tRNS) + + Dynamically allocated with the colors of the palette, including alpha. + This field may not be allocated directly, use lodepng_color_mode_init first, + then lodepng_palette_add per color to correctly initialize it (to ensure size + of exactly 1024 bytes). + + The alpha channels must be set as well, set them to 255 for opaque images. + + When decoding, by default you can ignore this palette, since LodePNG already + fills the palette colors in the pixels of the raw RGBA output. + + The palette is only supported for color type 3. + */ + unsigned char* palette; /*palette in RGBARGBA... order. Must be either 0, or when allocated must have 1024 bytes*/ + size_t palettesize; /*palette size in number of colors (amount of used bytes is 4 * palettesize)*/ + + /* + transparent color key (tRNS) + + This color uses the same bit depth as the bitdepth value in this struct, which can be 1-bit to 16-bit. + For grayscale PNGs, r, g and b will all 3 be set to the same. + + When decoding, by default you can ignore this information, since LodePNG sets + pixels with this key to transparent already in the raw RGBA output. + + The color key is only supported for color types 0 and 2. + */ + unsigned key_defined; /*is a transparent color key given? 0 = false, 1 = true*/ + unsigned key_r; /*red/grayscale component of color key*/ + unsigned key_g; /*green component of color key*/ + unsigned key_b; /*blue component of color key*/ +} LodePNGColorMode; + +/*init, cleanup and copy functions to use with this struct*/ +void lodepng_color_mode_init(LodePNGColorMode* info); +void lodepng_color_mode_cleanup(LodePNGColorMode* info); +/*return value is error code (0 means no error)*/ +unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source); +/* Makes a temporary LodePNGColorMode that does not need cleanup (no palette) */ +LodePNGColorMode lodepng_color_mode_make(LodePNGColorType colortype, unsigned bitdepth); + +void lodepng_palette_clear(LodePNGColorMode* info); +/*add 1 color to the palette*/ +unsigned lodepng_palette_add(LodePNGColorMode* info, + unsigned char r, unsigned char g, unsigned char b, unsigned char a); + +/*get the total amount of bits per pixel, based on colortype and bitdepth in the struct*/ +unsigned lodepng_get_bpp(const LodePNGColorMode* info); +/*get the amount of color channels used, based on colortype in the struct. +If a palette is used, it counts as 1 channel.*/ +unsigned lodepng_get_channels(const LodePNGColorMode* info); +/*is it a grayscale type? (only colortype 0 or 4)*/ +unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info); +/*has it got an alpha channel? (only colortype 2 or 6)*/ +unsigned lodepng_is_alpha_type(const LodePNGColorMode* info); +/*has it got a palette? (only colortype 3)*/ +unsigned lodepng_is_palette_type(const LodePNGColorMode* info); +/*only returns true if there is a palette and there is a value in the palette with alpha < 255. +Loops through the palette to check this.*/ +unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info); +/* +Check if the given color info indicates the possibility of having non-opaque pixels in the PNG image. +Returns true if the image can have translucent or invisible pixels (it still be opaque if it doesn't use such pixels). +Returns false if the image can only have opaque pixels. +In detail, it returns true only if it's a color type with alpha, or has a palette with non-opaque values, +or if "key_defined" is true. +*/ +unsigned lodepng_can_have_alpha(const LodePNGColorMode* info); +/*Returns the byte size of a raw image buffer with given width, height and color mode*/ +size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color); + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +/*The information of a Time chunk in PNG.*/ +typedef struct LodePNGTime { + unsigned year; /*2 bytes used (0-65535)*/ + unsigned month; /*1-12*/ + unsigned day; /*1-31*/ + unsigned hour; /*0-23*/ + unsigned minute; /*0-59*/ + unsigned second; /*0-60 (to allow for leap seconds)*/ +} LodePNGTime; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +/*Information about the PNG image, except pixels, width and height.*/ +typedef struct LodePNGInfo { + /*header (IHDR), palette (PLTE) and transparency (tRNS) chunks*/ + unsigned compression_method;/*compression method of the original file. Always 0.*/ + unsigned filter_method; /*filter method of the original file*/ + unsigned interlace_method; /*interlace method of the original file: 0=none, 1=Adam7*/ + LodePNGColorMode color; /*color type and bits, palette and transparency of the PNG file*/ + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /* + Suggested background color chunk (bKGD) + + This uses the same color mode and bit depth as the PNG (except no alpha channel), + with values truncated to the bit depth in the unsigned integer. + + For grayscale and palette PNGs, the value is stored in background_r. The values + in background_g and background_b are then unused. + + So when decoding, you may get these in a different color mode than the one you requested + for the raw pixels. + + When encoding with auto_convert, you must use the color model defined in info_png.color for + these values. The encoder normally ignores info_png.color when auto_convert is on, but will + use it to interpret these values (and convert copies of them to its chosen color model). + + When encoding, avoid setting this to an expensive color, such as a non-gray value + when the image is gray, or the compression will be worse since it will be forced to + write the PNG with a more expensive color mode (when auto_convert is on). + + The decoder does not use this background color to edit the color of pixels. This is a + completely optional metadata feature. + */ + unsigned background_defined; /*is a suggested background color given?*/ + unsigned background_r; /*red/gray/palette component of suggested background color*/ + unsigned background_g; /*green component of suggested background color*/ + unsigned background_b; /*blue component of suggested background color*/ + + /* + Non-international text chunks (tEXt and zTXt) + + The char** arrays each contain num strings. The actual messages are in + text_strings, while text_keys are keywords that give a short description what + the actual text represents, e.g. Title, Author, Description, or anything else. + + All the string fields below including strings, keys, names and language tags are null terminated. + The PNG specification uses null characters for the keys, names and tags, and forbids null + characters to appear in the main text which is why we can use null termination everywhere here. + + A keyword is minimum 1 character and maximum 79 characters long (plus the + additional null terminator). It's discouraged to use a single line length + longer than 79 characters for texts. + + Don't allocate these text buffers yourself. Use the init/cleanup functions + correctly and use lodepng_add_text and lodepng_clear_text. + + Standard text chunk keywords and strings are encoded using Latin-1. + */ + size_t text_num; /*the amount of texts in these char** buffers (there may be more texts in itext)*/ + char** text_keys; /*the keyword of a text chunk (e.g. "Comment")*/ + char** text_strings; /*the actual text*/ + + /* + International text chunks (iTXt) + Similar to the non-international text chunks, but with additional strings + "langtags" and "transkeys", and the following text encodings are used: + keys: Latin-1, langtags: ASCII, transkeys and strings: UTF-8. + keys must be 1-79 characters (plus the additional null terminator), the other + strings are any length. + */ + size_t itext_num; /*the amount of international texts in this PNG*/ + char** itext_keys; /*the English keyword of the text chunk (e.g. "Comment")*/ + char** itext_langtags; /*language tag for this text's language, ISO/IEC 646 string, e.g. ISO 639 language tag*/ + char** itext_transkeys; /*keyword translated to the international language - UTF-8 string*/ + char** itext_strings; /*the actual international text - UTF-8 string*/ + + /*time chunk (tIME)*/ + unsigned time_defined; /*set to 1 to make the encoder generate a tIME chunk*/ + LodePNGTime time; + + /*phys chunk (pHYs)*/ + unsigned phys_defined; /*if 0, there is no pHYs chunk and the values below are undefined, if 1 else there is one*/ + unsigned phys_x; /*pixels per unit in x direction*/ + unsigned phys_y; /*pixels per unit in y direction*/ + unsigned phys_unit; /*may be 0 (unknown unit) or 1 (metre)*/ + + /* + Color profile related chunks: gAMA, cHRM, sRGB, iCPP + + LodePNG does not apply any color conversions on pixels in the encoder or decoder and does not interpret these color + profile values. It merely passes on the information. If you wish to use color profiles and convert colors, please + use these values with a color management library. + + See the PNG, ICC and sRGB specifications for more information about the meaning of these values. + */ + + /* gAMA chunk: optional, overridden by sRGB or iCCP if those are present. */ + unsigned gama_defined; /* Whether a gAMA chunk is present (0 = not present, 1 = present). */ + unsigned gama_gamma; /* Gamma exponent times 100000 */ + + /* cHRM chunk: optional, overridden by sRGB or iCCP if those are present. */ + unsigned chrm_defined; /* Whether a cHRM chunk is present (0 = not present, 1 = present). */ + unsigned chrm_white_x; /* White Point x times 100000 */ + unsigned chrm_white_y; /* White Point y times 100000 */ + unsigned chrm_red_x; /* Red x times 100000 */ + unsigned chrm_red_y; /* Red y times 100000 */ + unsigned chrm_green_x; /* Green x times 100000 */ + unsigned chrm_green_y; /* Green y times 100000 */ + unsigned chrm_blue_x; /* Blue x times 100000 */ + unsigned chrm_blue_y; /* Blue y times 100000 */ + + /* + sRGB chunk: optional. May not appear at the same time as iCCP. + If gAMA is also present gAMA must contain value 45455. + If cHRM is also present cHRM must contain respectively 31270,32900,64000,33000,30000,60000,15000,6000. + */ + unsigned srgb_defined; /* Whether an sRGB chunk is present (0 = not present, 1 = present). */ + unsigned srgb_intent; /* Rendering intent: 0=perceptual, 1=rel. colorimetric, 2=saturation, 3=abs. colorimetric */ + + /* + iCCP chunk: optional. May not appear at the same time as sRGB. + + LodePNG does not parse or use the ICC profile (except its color space header field for an edge case), a + separate library to handle the ICC data (not included in LodePNG) format is needed to use it for color + management and conversions. + + For encoding, if iCCP is present, gAMA and cHRM are recommended to be added as well with values that match the ICC + profile as closely as possible, if you wish to do this you should provide the correct values for gAMA and cHRM and + enable their '_defined' flags since LodePNG will not automatically compute them from the ICC profile. + + For encoding, the ICC profile is required by the PNG specification to be an "RGB" profile for non-gray + PNG color types and a "GRAY" profile for gray PNG color types. If you disable auto_convert, you must ensure + the ICC profile type matches your requested color type, else the encoder gives an error. If auto_convert is + enabled (the default), and the ICC profile is not a good match for the pixel data, this will result in an encoder + error if the pixel data has non-gray pixels for a GRAY profile, or a silent less-optimal compression of the pixel + data if the pixels could be encoded as grayscale but the ICC profile is RGB. + + To avoid this do not set an ICC profile in the image unless there is a good reason for it, and when doing so + make sure you compute it carefully to avoid the above problems. + */ + unsigned iccp_defined; /* Whether an iCCP chunk is present (0 = not present, 1 = present). */ + char* iccp_name; /* Null terminated string with profile name, 1-79 bytes */ + /* + The ICC profile in iccp_profile_size bytes. + Don't allocate this buffer yourself. Use the init/cleanup functions + correctly and use lodepng_set_icc and lodepng_clear_icc. + */ + unsigned char* iccp_profile; + unsigned iccp_profile_size; /* The size of iccp_profile in bytes */ + + /* End of color profile related chunks */ + + + /* + unknown chunks: chunks not known by LodePNG, passed on byte for byte. + + There are 3 buffers, one for each position in the PNG where unknown chunks can appear. + Each buffer contains all unknown chunks for that position consecutively. + The 3 positions are: + 0: between IHDR and PLTE, 1: between PLTE and IDAT, 2: between IDAT and IEND. + + For encoding, do not store critical chunks or known chunks that are enabled with a "_defined" flag + above in here, since the encoder will blindly follow this and could then encode an invalid PNG file + (such as one with two IHDR chunks or the disallowed combination of sRGB with iCCP). But do use + this if you wish to store an ancillary chunk that is not supported by LodePNG (such as sPLT or hIST), + or any non-standard PNG chunk. + + Do not allocate or traverse this data yourself. Use the chunk traversing functions declared + later, such as lodepng_chunk_next and lodepng_chunk_append, to read/write this struct. + */ + unsigned char* unknown_chunks_data[3]; + size_t unknown_chunks_size[3]; /*size in bytes of the unknown chunks, given for protection*/ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} LodePNGInfo; + +/*init, cleanup and copy functions to use with this struct*/ +void lodepng_info_init(LodePNGInfo* info); +void lodepng_info_cleanup(LodePNGInfo* info); +/*return value is error code (0 means no error)*/ +unsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source); + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str); /*push back both texts at once*/ +void lodepng_clear_text(LodePNGInfo* info); /*use this to clear the texts again after you filled them in*/ + +unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag, + const char* transkey, const char* str); /*push back the 4 texts of 1 chunk at once*/ +void lodepng_clear_itext(LodePNGInfo* info); /*use this to clear the itexts again after you filled them in*/ + +/*replaces if exists*/ +unsigned lodepng_set_icc(LodePNGInfo* info, const char* name, const unsigned char* profile, unsigned profile_size); +void lodepng_clear_icc(LodePNGInfo* info); /*use this to clear the texts again after you filled them in*/ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +/* +Converts raw buffer from one color type to another color type, based on +LodePNGColorMode structs to describe the input and output color type. +See the reference manual at the end of this header file to see which color conversions are supported. +return value = LodePNG error code (0 if all went ok, an error if the conversion isn't supported) +The out buffer must have size (w * h * bpp + 7) / 8, where bpp is the bits per pixel +of the output color type (lodepng_get_bpp). +For < 8 bpp images, there should not be padding bits at the end of scanlines. +For 16-bit per channel colors, uses big endian format like PNG does. +Return value is LodePNG error code +*/ +unsigned lodepng_convert(unsigned char* out, const unsigned char* in, + const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in, + unsigned w, unsigned h); + +#ifdef LODEPNG_COMPILE_DECODER +/* +Settings for the decoder. This contains settings for the PNG and the Zlib +decoder, but not the Info settings from the Info structs. +*/ +typedef struct LodePNGDecoderSettings { + LodePNGDecompressSettings zlibsettings; /*in here is the setting to ignore Adler32 checksums*/ + + /* Check LodePNGDecompressSettings for more ignorable errors such as ignore_adler32 */ + unsigned ignore_crc; /*ignore CRC checksums*/ + unsigned ignore_critical; /*ignore unknown critical chunks*/ + unsigned ignore_end; /*ignore issues at end of file if possible (missing IEND chunk, too large chunk, ...)*/ + /* TODO: make a system involving warnings with levels and a strict mode instead. Other potentially recoverable + errors: srgb rendering intent value, size of content of ancillary chunks, more than 79 characters for some + strings, placement/combination rules for ancillary chunks, crc of unknown chunks, allowed characters + in string keys, etc... */ + + unsigned color_convert; /*whether to convert the PNG to the color type you want. Default: yes*/ + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + unsigned read_text_chunks; /*if false but remember_unknown_chunks is true, they're stored in the unknown chunks*/ + + /*store all bytes from unknown chunks in the LodePNGInfo (off by default, useful for a png editor)*/ + unsigned remember_unknown_chunks; + + /* maximum size for decompressed text chunks. If a text chunk's text is larger than this, an error is returned, + unless reading text chunks is disabled or this limit is set higher or disabled. Set to 0 to allow any size. + By default it is a value that prevents unreasonably large strings from hogging memory. */ + size_t max_text_size; + + /* maximum size for compressed ICC chunks. If the ICC profile is larger than this, an error will be returned. Set to + 0 to allow any size. By default this is a value that prevents ICC profiles that would be much larger than any + legitimate profile could be to hog memory. */ + size_t max_icc_size; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} LodePNGDecoderSettings; + +void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/*automatically use color type with less bits per pixel if losslessly possible. Default: AUTO*/ +typedef enum LodePNGFilterStrategy { + /*every filter at zero*/ + LFS_ZERO = 0, + /*every filter at 1, 2, 3 or 4 (paeth), unlike LFS_ZERO not a good choice, but for testing*/ + LFS_ONE = 1, + LFS_TWO = 2, + LFS_THREE = 3, + LFS_FOUR = 4, + /*Use filter that gives minimum sum, as described in the official PNG filter heuristic.*/ + LFS_MINSUM, + /*Use the filter type that gives smallest Shannon entropy for this scanline. Depending + on the image, this is better or worse than minsum.*/ + LFS_ENTROPY, + /* + Brute-force-search PNG filters by compressing each filter for each scanline. + Experimental, very slow, and only rarely gives better compression than MINSUM. + */ + LFS_BRUTE_FORCE, + /*use predefined_filters buffer: you specify the filter type for each scanline*/ + LFS_PREDEFINED +} LodePNGFilterStrategy; + +/*Gives characteristics about the integer RGBA colors of the image (count, alpha channel usage, bit depth, ...), +which helps decide which color model to use for encoding. +Used internally by default if "auto_convert" is enabled. Public because it's useful for custom algorithms.*/ +typedef struct LodePNGColorStats { + unsigned colored; /*not grayscale*/ + unsigned key; /*image is not opaque and color key is possible instead of full alpha*/ + unsigned short key_r; /*key values, always as 16-bit, in 8-bit case the byte is duplicated, e.g. 65535 means 255*/ + unsigned short key_g; + unsigned short key_b; + unsigned alpha; /*image is not opaque and alpha channel or alpha palette required*/ + unsigned numcolors; /*amount of colors, up to 257. Not valid if bits == 16 or allow_palette is disabled.*/ + unsigned char palette[1024]; /*Remembers up to the first 256 RGBA colors, in no particular order, only valid when numcolors is valid*/ + unsigned bits; /*bits per channel (not for palette). 1,2 or 4 for grayscale only. 16 if 16-bit per channel required.*/ + size_t numpixels; + + /*user settings for computing/using the stats*/ + unsigned allow_palette; /*default 1. if 0, disallow choosing palette colortype in auto_choose_color, and don't count numcolors*/ + unsigned allow_greyscale; /*default 1. if 0, choose RGB or RGBA even if the image only has gray colors*/ +} LodePNGColorStats; + +void lodepng_color_stats_init(LodePNGColorStats* stats); + +/*Get a LodePNGColorStats of the image. The stats must already have been inited. +Returns error code (e.g. alloc fail) or 0 if ok.*/ +unsigned lodepng_compute_color_stats(LodePNGColorStats* stats, + const unsigned char* image, unsigned w, unsigned h, + const LodePNGColorMode* mode_in); + +/*Settings for the encoder.*/ +typedef struct LodePNGEncoderSettings { + LodePNGCompressSettings zlibsettings; /*settings for the zlib encoder, such as window size, ...*/ + + unsigned auto_convert; /*automatically choose output PNG color type. Default: true*/ + + /*If true, follows the official PNG heuristic: if the PNG uses a palette or lower than + 8 bit depth, set all filters to zero. Otherwise use the filter_strategy. Note that to + completely follow the official PNG heuristic, filter_palette_zero must be true and + filter_strategy must be LFS_MINSUM*/ + unsigned filter_palette_zero; + /*Which filter strategy to use when not using zeroes due to filter_palette_zero. + Set filter_palette_zero to 0 to ensure always using your chosen strategy. Default: LFS_MINSUM*/ + LodePNGFilterStrategy filter_strategy; + /*used if filter_strategy is LFS_PREDEFINED. In that case, this must point to a buffer with + the same length as the amount of scanlines in the image, and each value must <= 5. You + have to cleanup this buffer, LodePNG will never free it. Don't forget that filter_palette_zero + must be set to 0 to ensure this is also used on palette or low bitdepth images.*/ + const unsigned char* predefined_filters; + + /*force creating a PLTE chunk if colortype is 2 or 6 (= a suggested palette). + If colortype is 3, PLTE is _always_ created.*/ + unsigned force_palette; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*add LodePNG identifier and version as a text chunk, for debugging*/ + unsigned add_id; + /*encode text chunks as zTXt chunks instead of tEXt chunks, and use compression in iTXt chunks*/ + unsigned text_compression; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} LodePNGEncoderSettings; + +void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings); +#endif /*LODEPNG_COMPILE_ENCODER*/ + + +#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) +/*The settings, state and information for extended encoding and decoding.*/ +typedef struct LodePNGState { +#ifdef LODEPNG_COMPILE_DECODER + LodePNGDecoderSettings decoder; /*the decoding settings*/ +#endif /*LODEPNG_COMPILE_DECODER*/ +#ifdef LODEPNG_COMPILE_ENCODER + LodePNGEncoderSettings encoder; /*the encoding settings*/ +#endif /*LODEPNG_COMPILE_ENCODER*/ + LodePNGColorMode info_raw; /*specifies the format in which you would like to get the raw pixel buffer*/ + LodePNGInfo info_png; /*info of the PNG image obtained after decoding*/ + unsigned error; +} LodePNGState; + +/*init, cleanup and copy functions to use with this struct*/ +void lodepng_state_init(LodePNGState* state); +void lodepng_state_cleanup(LodePNGState* state); +void lodepng_state_copy(LodePNGState* dest, const LodePNGState* source); +#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ + +#ifdef LODEPNG_COMPILE_DECODER +/* +Same as lodepng_decode_memory, but uses a LodePNGState to allow custom settings and +getting much more information about the PNG image and color mode. +*/ +unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h, + LodePNGState* state, + const unsigned char* in, size_t insize); + +/* +Read the PNG header, but not the actual data. This returns only the information +that is in the IHDR chunk of the PNG, such as width, height and color type. The +information is placed in the info_png field of the LodePNGState. +*/ +unsigned lodepng_inspect(unsigned* w, unsigned* h, + LodePNGState* state, + const unsigned char* in, size_t insize); +#endif /*LODEPNG_COMPILE_DECODER*/ + +/* +Reads one metadata chunk (other than IHDR) of the PNG file and outputs what it +read in the state. Returns error code on failure. +Use lodepng_inspect first with a new state, then e.g. lodepng_chunk_find_const +to find the desired chunk type, and if non null use lodepng_inspect_chunk (with +chunk_pointer - start_of_file as pos). +Supports most metadata chunks from the PNG standard (gAMA, bKGD, tEXt, ...). +Ignores unsupported, unknown, non-metadata or IHDR chunks (without error). +Requirements: &in[pos] must point to start of a chunk, must use regular +lodepng_inspect first since format of most other chunks depends on IHDR, and if +there is a PLTE chunk, that one must be inspected before tRNS or bKGD. +*/ +unsigned lodepng_inspect_chunk(LodePNGState* state, size_t pos, + const unsigned char* in, size_t insize); + +#ifdef LODEPNG_COMPILE_ENCODER +/*This function allocates the out buffer with standard malloc and stores the size in *outsize.*/ +unsigned lodepng_encode(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h, + LodePNGState* state); +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/* +The lodepng_chunk functions are normally not needed, except to traverse the +unknown chunks stored in the LodePNGInfo struct, or add new ones to it. +It also allows traversing the chunks of an encoded PNG file yourself. + +The chunk pointer always points to the beginning of the chunk itself, that is +the first byte of the 4 length bytes. + +In the PNG file format, chunks have the following format: +-4 bytes length: length of the data of the chunk in bytes (chunk itself is 12 bytes longer) +-4 bytes chunk type (ASCII a-z,A-Z only, see below) +-length bytes of data (may be 0 bytes if length was 0) +-4 bytes of CRC, computed on chunk name + data + +The first chunk starts at the 8th byte of the PNG file, the entire rest of the file +exists out of concatenated chunks with the above format. + +PNG standard chunk ASCII naming conventions: +-First byte: uppercase = critical, lowercase = ancillary +-Second byte: uppercase = public, lowercase = private +-Third byte: must be uppercase +-Fourth byte: uppercase = unsafe to copy, lowercase = safe to copy +*/ + +/* +Gets the length of the data of the chunk. Total chunk length has 12 bytes more. +There must be at least 4 bytes to read from. If the result value is too large, +it may be corrupt data. +*/ +unsigned lodepng_chunk_length(const unsigned char* chunk); + +/*puts the 4-byte type in null terminated string*/ +void lodepng_chunk_type(char type[5], const unsigned char* chunk); + +/*check if the type is the given type*/ +unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type); + +/*0: it's one of the critical chunk types, 1: it's an ancillary chunk (see PNG standard)*/ +unsigned char lodepng_chunk_ancillary(const unsigned char* chunk); + +/*0: public, 1: private (see PNG standard)*/ +unsigned char lodepng_chunk_private(const unsigned char* chunk); + +/*0: the chunk is unsafe to copy, 1: the chunk is safe to copy (see PNG standard)*/ +unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk); + +/*get pointer to the data of the chunk, where the input points to the header of the chunk*/ +unsigned char* lodepng_chunk_data(unsigned char* chunk); +const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk); + +/*returns 0 if the crc is correct, 1 if it's incorrect (0 for OK as usual!)*/ +unsigned lodepng_chunk_check_crc(const unsigned char* chunk); + +/*generates the correct CRC from the data and puts it in the last 4 bytes of the chunk*/ +void lodepng_chunk_generate_crc(unsigned char* chunk); + +/* +Iterate to next chunks, allows iterating through all chunks of the PNG file. +Input must be at the beginning of a chunk (result of a previous lodepng_chunk_next call, +or the 8th byte of a PNG file which always has the first chunk), or alternatively may +point to the first byte of the PNG file (which is not a chunk but the magic header, the +function will then skip over it and return the first real chunk). +Will output pointer to the start of the next chunk, or at or beyond end of the file if there +is no more chunk after this or possibly if the chunk is corrupt. +Start this process at the 8th byte of the PNG file. +In a non-corrupt PNG file, the last chunk should have name "IEND". +*/ +unsigned char* lodepng_chunk_next(unsigned char* chunk, unsigned char* end); +const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk, const unsigned char* end); + +/*Finds the first chunk with the given type in the range [chunk, end), or returns NULL if not found.*/ +unsigned char* lodepng_chunk_find(unsigned char* chunk, unsigned char* end, const char type[5]); +const unsigned char* lodepng_chunk_find_const(const unsigned char* chunk, const unsigned char* end, const char type[5]); + +/* +Appends chunk to the data in out. The given chunk should already have its chunk header. +The out variable and outsize are updated to reflect the new reallocated buffer. +Returns error code (0 if it went ok) +*/ +unsigned lodepng_chunk_append(unsigned char** out, size_t* outsize, const unsigned char* chunk); + +/* +Appends new chunk to out. The chunk to append is given by giving its length, type +and data separately. The type is a 4-letter string. +The out variable and outsize are updated to reflect the new reallocated buffer. +Returne error code (0 if it went ok) +*/ +unsigned lodepng_chunk_create(unsigned char** out, size_t* outsize, unsigned length, + const char* type, const unsigned char* data); + + +/*Calculate CRC32 of buffer*/ +unsigned lodepng_crc32(const unsigned char* buf, size_t len); +#endif /*LODEPNG_COMPILE_PNG*/ + + +#ifdef LODEPNG_COMPILE_ZLIB +/* +This zlib part can be used independently to zlib compress and decompress a +buffer. It cannot be used to create gzip files however, and it only supports the +part of zlib that is required for PNG, it does not support dictionaries. +*/ + +#ifdef LODEPNG_COMPILE_DECODER +/*Inflate a buffer. Inflate is the decompression step of deflate. Out buffer must be freed after use.*/ +unsigned lodepng_inflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings); + +/* +Decompresses Zlib data. Reallocates the out buffer and appends the data. The +data must be according to the zlib specification. +Either, *out must be NULL and *outsize must be 0, or, *out must be a valid +buffer and *outsize its size in bytes. out must be freed by user after usage. +*/ +unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/* +Compresses data with Zlib. Reallocates the out buffer and appends the data. +Zlib adds a small header and trailer around the deflate data. +The data is output in the format of the zlib specification. +Either, *out must be NULL and *outsize must be 0, or, *out must be a valid +buffer and *outsize its size in bytes. out must be freed by user after usage. +*/ +unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings); + +/* +Find length-limited Huffman code for given frequencies. This function is in the +public interface only for tests, it's used internally by lodepng_deflate. +*/ +unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies, + size_t numcodes, unsigned maxbitlen); + +/*Compress a buffer with deflate. See RFC 1951. Out buffer must be freed after use.*/ +unsigned lodepng_deflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings); + +#endif /*LODEPNG_COMPILE_ENCODER*/ +#endif /*LODEPNG_COMPILE_ZLIB*/ + +#ifdef LODEPNG_COMPILE_DISK +/* +Load a file from disk into buffer. The function allocates the out buffer, and +after usage you should free it. +out: output parameter, contains pointer to loaded buffer. +outsize: output parameter, size of the allocated out buffer +filename: the path to the file to load +return value: error code (0 means ok) +*/ +unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename); + +/* +Save a file from buffer to disk. Warning, if it exists, this function overwrites +the file without warning! +buffer: the buffer to write +buffersize: size of the buffer to write +filename: the path to the file to save to +return value: error code (0 means ok) +*/ +unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename); +#endif /*LODEPNG_COMPILE_DISK*/ + +#ifdef LODEPNG_COMPILE_CPP +/* The LodePNG C++ wrapper uses std::vectors instead of manually allocated memory buffers. */ +namespace lodepng { +#ifdef LODEPNG_COMPILE_PNG +class State : public LodePNGState { + public: + State(); + State(const State& other); + ~State(); + State& operator=(const State& other); +}; + +#ifdef LODEPNG_COMPILE_DECODER +/* Same as other lodepng::decode, but using a State for more settings and information. */ +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + State& state, + const unsigned char* in, size_t insize); +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + State& state, + const std::vector& in); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/* Same as other lodepng::encode, but using a State for more settings and information. */ +unsigned encode(std::vector& out, + const unsigned char* in, unsigned w, unsigned h, + State& state); +unsigned encode(std::vector& out, + const std::vector& in, unsigned w, unsigned h, + State& state); +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_DISK +/* +Load a file from disk into an std::vector. +return value: error code (0 means ok) +*/ +unsigned load_file(std::vector& buffer, const std::string& filename); + +/* +Save the binary data in an std::vector to a file on disk. The file is overwritten +without warning. +*/ +unsigned save_file(const std::vector& buffer, const std::string& filename); +#endif /* LODEPNG_COMPILE_DISK */ +#endif /* LODEPNG_COMPILE_PNG */ + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_DECODER +/* Zlib-decompress an unsigned char buffer */ +unsigned decompress(std::vector& out, const unsigned char* in, size_t insize, + const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings); + +/* Zlib-decompress an std::vector */ +unsigned decompress(std::vector& out, const std::vector& in, + const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings); +#endif /* LODEPNG_COMPILE_DECODER */ + +#ifdef LODEPNG_COMPILE_ENCODER +/* Zlib-compress an unsigned char buffer */ +unsigned compress(std::vector& out, const unsigned char* in, size_t insize, + const LodePNGCompressSettings& settings = lodepng_default_compress_settings); + +/* Zlib-compress an std::vector */ +unsigned compress(std::vector& out, const std::vector& in, + const LodePNGCompressSettings& settings = lodepng_default_compress_settings); +#endif /* LODEPNG_COMPILE_ENCODER */ +#endif /* LODEPNG_COMPILE_ZLIB */ +} /* namespace lodepng */ +#endif /*LODEPNG_COMPILE_CPP*/ + +/* +TODO: +[.] test if there are no memory leaks or security exploits - done a lot but needs to be checked often +[.] check compatibility with various compilers - done but needs to be redone for every newer version +[X] converting color to 16-bit per channel types +[X] support color profile chunk types (but never let them touch RGB values by default) +[ ] support all public PNG chunk types (almost done except sBIT, sPLT and hIST) +[ ] make sure encoder generates no chunks with size > (2^31)-1 +[ ] partial decoding (stream processing) +[X] let the "isFullyOpaque" function check color keys and transparent palettes too +[X] better name for the variables "codes", "codesD", "codelengthcodes", "clcl" and "lldl" +[ ] allow treating some errors like warnings, when image is recoverable (e.g. 69, 57, 58) +[ ] make warnings like: oob palette, checksum fail, data after iend, wrong/unknown crit chunk, no null terminator in text, ... +[ ] error messages with line numbers (and version) +[ ] errors in state instead of as return code? +[ ] new errors/warnings like suspiciously big decompressed ztxt or iccp chunk +[ ] let the C++ wrapper catch exceptions coming from the standard library and return LodePNG error codes +[ ] allow user to provide custom color conversion functions, e.g. for premultiplied alpha, padding bits or not, ... +[ ] allow user to give data (void*) to custom allocator +[X] provide alternatives for C library functions not present on some platforms (memcpy, ...) +*/ + +#endif /*LV_USE_PNG*/ + +#endif /*LODEPNG_H inclusion guard*/ + +/* +LodePNG Documentation +--------------------- + +0. table of contents +-------------------- + + 1. about + 1.1. supported features + 1.2. features not supported + 2. C and C++ version + 3. security + 4. decoding + 5. encoding + 6. color conversions + 6.1. PNG color types + 6.2. color conversions + 6.3. padding bits + 6.4. A note about 16-bits per channel and endianness + 7. error values + 8. chunks and PNG editing + 9. compiler support + 10. examples + 10.1. decoder C++ example + 10.2. decoder C example + 11. state settings reference + 12. changes + 13. contact information + + +1. about +-------- + +PNG is a file format to store raster images losslessly with good compression, +supporting different color types and alpha channel. + +LodePNG is a PNG codec according to the Portable Network Graphics (PNG) +Specification (Second Edition) - W3C Recommendation 10 November 2003. + +The specifications used are: + +*) Portable Network Graphics (PNG) Specification (Second Edition): + http://www.w3.org/TR/2003/REC-PNG-20031110 +*) RFC 1950 ZLIB Compressed Data Format version 3.3: + http://www.gzip.org/zlib/rfc-zlib.html +*) RFC 1951 DEFLATE Compressed Data Format Specification ver 1.3: + http://www.gzip.org/zlib/rfc-deflate.html + +The most recent version of LodePNG can currently be found at +http://lodev.org/lodepng/ + +LodePNG works both in C (ISO C90) and C++, with a C++ wrapper that adds +extra functionality. + +LodePNG exists out of two files: +-lodepng.h: the header file for both C and C++ +-lodepng.c(pp): give it the name lodepng.c or lodepng.cpp (or .cc) depending on your usage + +If you want to start using LodePNG right away without reading this doc, get the +examples from the LodePNG website to see how to use it in code, or check the +smaller examples in chapter 13 here. + +LodePNG is simple but only supports the basic requirements. To achieve +simplicity, the following design choices were made: There are no dependencies +on any external library. There are functions to decode and encode a PNG with +a single function call, and extended versions of these functions taking a +LodePNGState struct allowing to specify or get more information. By default +the colors of the raw image are always RGB or RGBA, no matter what color type +the PNG file uses. To read and write files, there are simple functions to +convert the files to/from buffers in memory. + +This all makes LodePNG suitable for loading textures in games, demos and small +programs, ... It's less suitable for full fledged image editors, loading PNGs +over network (it requires all the image data to be available before decoding can +begin), life-critical systems, ... + +1.1. supported features +----------------------- + +The following features are supported by the decoder: + +*) decoding of PNGs with any color type, bit depth and interlace mode, to a 24- or 32-bit color raw image, + or the same color type as the PNG +*) encoding of PNGs, from any raw image to 24- or 32-bit color, or the same color type as the raw image +*) Adam7 interlace and deinterlace for any color type +*) loading the image from harddisk or decoding it from a buffer from other sources than harddisk +*) support for alpha channels, including RGBA color model, translucent palettes and color keying +*) zlib decompression (inflate) +*) zlib compression (deflate) +*) CRC32 and ADLER32 checksums +*) colorimetric color profile conversions: currently experimentally available in lodepng_util.cpp only, + plus alternatively ability to pass on chroma/gamma/ICC profile information to other color management system. +*) handling of unknown chunks, allowing making a PNG editor that stores custom and unknown chunks. +*) the following chunks are supported by both encoder and decoder: + IHDR: header information + PLTE: color palette + IDAT: pixel data + IEND: the final chunk + tRNS: transparency for palettized images + tEXt: textual information + zTXt: compressed textual information + iTXt: international textual information + bKGD: suggested background color + pHYs: physical dimensions + tIME: modification time + cHRM: RGB chromaticities + gAMA: RGB gamma correction + iCCP: ICC color profile + sRGB: rendering intent + +1.2. features not supported +--------------------------- + +The following features are _not_ supported: + +*) some features needed to make a conformant PNG-Editor might be still missing. +*) partial loading/stream processing. All data must be available and is processed in one call. +*) The following public chunks are not (yet) supported but treated as unknown chunks by LodePNG: + sBIT + hIST + sPLT + + +2. C and C++ version +-------------------- + +The C version uses buffers allocated with alloc that you need to free() +yourself. You need to use init and cleanup functions for each struct whenever +using a struct from the C version to avoid exploits and memory leaks. + +The C++ version has extra functions with std::vectors in the interface and the +lodepng::State class which is a LodePNGState with constructor and destructor. + +These files work without modification for both C and C++ compilers because all +the additional C++ code is in "#ifdef __cplusplus" blocks that make C-compilers +ignore it, and the C code is made to compile both with strict ISO C90 and C++. + +To use the C++ version, you need to rename the source file to lodepng.cpp +(instead of lodepng.c), and compile it with a C++ compiler. + +To use the C version, you need to rename the source file to lodepng.c (instead +of lodepng.cpp), and compile it with a C compiler. + + +3. Security +----------- + +Even if carefully designed, it's always possible that LodePNG contains possible +exploits. If you discover one, please let me know, and it will be fixed. + +When using LodePNG, care has to be taken with the C version of LodePNG, as well +as the C-style structs when working with C++. The following conventions are used +for all C-style structs: + +-if a struct has a corresponding init function, always call the init function when making a new one +-if a struct has a corresponding cleanup function, call it before the struct disappears to avoid memory leaks +-if a struct has a corresponding copy function, use the copy function instead of "=". + The destination must also be inited already. + + +4. Decoding +----------- + +Decoding converts a PNG compressed image to a raw pixel buffer. + +Most documentation on using the decoder is at its declarations in the header +above. For C, simple decoding can be done with functions such as +lodepng_decode32, and more advanced decoding can be done with the struct +LodePNGState and lodepng_decode. For C++, all decoding can be done with the +various lodepng::decode functions, and lodepng::State can be used for advanced +features. + +When using the LodePNGState, it uses the following fields for decoding: +*) LodePNGInfo info_png: it stores extra information about the PNG (the input) in here +*) LodePNGColorMode info_raw: here you can say what color mode of the raw image (the output) you want to get +*) LodePNGDecoderSettings decoder: you can specify a few extra settings for the decoder to use + +LodePNGInfo info_png +-------------------- + +After decoding, this contains extra information of the PNG image, except the actual +pixels, width and height because these are already gotten directly from the decoder +functions. + +It contains for example the original color type of the PNG image, text comments, +suggested background color, etc... More details about the LodePNGInfo struct are +at its declaration documentation. + +LodePNGColorMode info_raw +------------------------- + +When decoding, here you can specify which color type you want +the resulting raw image to be. If this is different from the colortype of the +PNG, then the decoder will automatically convert the result. This conversion +always works, except if you want it to convert a color PNG to grayscale or to +a palette with missing colors. + +By default, 32-bit color is used for the result. + +LodePNGDecoderSettings decoder +------------------------------ + +The settings can be used to ignore the errors created by invalid CRC and Adler32 +chunks, and to disable the decoding of tEXt chunks. + +There's also a setting color_convert, true by default. If false, no conversion +is done, the resulting data will be as it was in the PNG (after decompression) +and you'll have to puzzle the colors of the pixels together yourself using the +color type information in the LodePNGInfo. + + +5. Encoding +----------- + +Encoding converts a raw pixel buffer to a PNG compressed image. + +Most documentation on using the encoder is at its declarations in the header +above. For C, simple encoding can be done with functions such as +lodepng_encode32, and more advanced decoding can be done with the struct +LodePNGState and lodepng_encode. For C++, all encoding can be done with the +various lodepng::encode functions, and lodepng::State can be used for advanced +features. + +Like the decoder, the encoder can also give errors. However it gives less errors +since the encoder input is trusted, the decoder input (a PNG image that could +be forged by anyone) is not trusted. + +When using the LodePNGState, it uses the following fields for encoding: +*) LodePNGInfo info_png: here you specify how you want the PNG (the output) to be. +*) LodePNGColorMode info_raw: here you say what color type of the raw image (the input) has +*) LodePNGEncoderSettings encoder: you can specify a few settings for the encoder to use + +LodePNGInfo info_png +-------------------- + +When encoding, you use this the opposite way as when decoding: for encoding, +you fill in the values you want the PNG to have before encoding. By default it's +not needed to specify a color type for the PNG since it's automatically chosen, +but it's possible to choose it yourself given the right settings. + +The encoder will not always exactly match the LodePNGInfo struct you give, +it tries as close as possible. Some things are ignored by the encoder. The +encoder uses, for example, the following settings from it when applicable: +colortype and bitdepth, text chunks, time chunk, the color key, the palette, the +background color, the interlace method, unknown chunks, ... + +When encoding to a PNG with colortype 3, the encoder will generate a PLTE chunk. +If the palette contains any colors for which the alpha channel is not 255 (so +there are translucent colors in the palette), it'll add a tRNS chunk. + +LodePNGColorMode info_raw +------------------------- + +You specify the color type of the raw image that you give to the input here, +including a possible transparent color key and palette you happen to be using in +your raw image data. + +By default, 32-bit color is assumed, meaning your input has to be in RGBA +format with 4 bytes (unsigned chars) per pixel. + +LodePNGEncoderSettings encoder +------------------------------ + +The following settings are supported (some are in sub-structs): +*) auto_convert: when this option is enabled, the encoder will +automatically choose the smallest possible color mode (including color key) that +can encode the colors of all pixels without information loss. +*) btype: the block type for LZ77. 0 = uncompressed, 1 = fixed huffman tree, + 2 = dynamic huffman tree (best compression). Should be 2 for proper + compression. +*) use_lz77: whether or not to use LZ77 for compressed block types. Should be + true for proper compression. +*) windowsize: the window size used by the LZ77 encoder (1 - 32768). Has value + 2048 by default, but can be set to 32768 for better, but slow, compression. +*) force_palette: if colortype is 2 or 6, you can make the encoder write a PLTE + chunk if force_palette is true. This can used as suggested palette to convert + to by viewers that don't support more than 256 colors (if those still exist) +*) add_id: add text chunk "Encoder: LodePNG " to the image. +*) text_compression: default 1. If 1, it'll store texts as zTXt instead of tEXt chunks. + zTXt chunks use zlib compression on the text. This gives a smaller result on + large texts but a larger result on small texts (such as a single program name). + It's all tEXt or all zTXt though, there's no separate setting per text yet. + + +6. color conversions +-------------------- + +An important thing to note about LodePNG, is that the color type of the PNG, and +the color type of the raw image, are completely independent. By default, when +you decode a PNG, you get the result as a raw image in the color type you want, +no matter whether the PNG was encoded with a palette, grayscale or RGBA color. +And if you encode an image, by default LodePNG will automatically choose the PNG +color type that gives good compression based on the values of colors and amount +of colors in the image. It can be configured to let you control it instead as +well, though. + +To be able to do this, LodePNG does conversions from one color mode to another. +It can convert from almost any color type to any other color type, except the +following conversions: RGB to grayscale is not supported, and converting to a +palette when the palette doesn't have a required color is not supported. This is +not supported on purpose: this is information loss which requires a color +reduction algorithm that is beyond the scope of a PNG encoder (yes, RGB to gray +is easy, but there are multiple ways if you want to give some channels more +weight). + +By default, when decoding, you get the raw image in 32-bit RGBA or 24-bit RGB +color, no matter what color type the PNG has. And by default when encoding, +LodePNG automatically picks the best color model for the output PNG, and expects +the input image to be 32-bit RGBA or 24-bit RGB. So, unless you want to control +the color format of the images yourself, you can skip this chapter. + +6.1. PNG color types +-------------------- + +A PNG image can have many color types, ranging from 1-bit color to 64-bit color, +as well as palettized color modes. After the zlib decompression and unfiltering +in the PNG image is done, the raw pixel data will have that color type and thus +a certain amount of bits per pixel. If you want the output raw image after +decoding to have another color type, a conversion is done by LodePNG. + +The PNG specification gives the following color types: + +0: grayscale, bit depths 1, 2, 4, 8, 16 +2: RGB, bit depths 8 and 16 +3: palette, bit depths 1, 2, 4 and 8 +4: grayscale with alpha, bit depths 8 and 16 +6: RGBA, bit depths 8 and 16 + +Bit depth is the amount of bits per pixel per color channel. So the total amount +of bits per pixel is: amount of channels * bitdepth. + +6.2. color conversions +---------------------- + +As explained in the sections about the encoder and decoder, you can specify +color types and bit depths in info_png and info_raw to change the default +behaviour. + +If, when decoding, you want the raw image to be something else than the default, +you need to set the color type and bit depth you want in the LodePNGColorMode, +or the parameters colortype and bitdepth of the simple decoding function. + +If, when encoding, you use another color type than the default in the raw input +image, you need to specify its color type and bit depth in the LodePNGColorMode +of the raw image, or use the parameters colortype and bitdepth of the simple +encoding function. + +If, when encoding, you don't want LodePNG to choose the output PNG color type +but control it yourself, you need to set auto_convert in the encoder settings +to false, and specify the color type you want in the LodePNGInfo of the +encoder (including palette: it can generate a palette if auto_convert is true, +otherwise not). + +If the input and output color type differ (whether user chosen or auto chosen), +LodePNG will do a color conversion, which follows the rules below, and may +sometimes result in an error. + +To avoid some confusion: +-the decoder converts from PNG to raw image +-the encoder converts from raw image to PNG +-the colortype and bitdepth in LodePNGColorMode info_raw, are those of the raw image +-the colortype and bitdepth in the color field of LodePNGInfo info_png, are those of the PNG +-when encoding, the color type in LodePNGInfo is ignored if auto_convert + is enabled, it is automatically generated instead +-when decoding, the color type in LodePNGInfo is set by the decoder to that of the original + PNG image, but it can be ignored since the raw image has the color type you requested instead +-if the color type of the LodePNGColorMode and PNG image aren't the same, a conversion + between the color types is done if the color types are supported. If it is not + supported, an error is returned. If the types are the same, no conversion is done. +-even though some conversions aren't supported, LodePNG supports loading PNGs from any + colortype and saving PNGs to any colortype, sometimes it just requires preparing + the raw image correctly before encoding. +-both encoder and decoder use the same color converter. + +The function lodepng_convert does the color conversion. It is available in the +interface but normally isn't needed since the encoder and decoder already call +it. + +Non supported color conversions: +-color to grayscale when non-gray pixels are present: no error is thrown, but +the result will look ugly because only the red channel is taken (it assumes all +three channels are the same in this case so ignores green and blue). The reason +no error is given is to allow converting from three-channel grayscale images to +one-channel even if there are numerical imprecisions. +-anything to palette when the palette does not have an exact match for a from-color +in it: in this case an error is thrown + +Supported color conversions: +-anything to 8-bit RGB, 8-bit RGBA, 16-bit RGB, 16-bit RGBA +-any gray or gray+alpha, to gray or gray+alpha +-anything to a palette, as long as the palette has the requested colors in it +-removing alpha channel +-higher to smaller bitdepth, and vice versa + +If you want no color conversion to be done (e.g. for speed or control): +-In the encoder, you can make it save a PNG with any color type by giving the +raw color mode and LodePNGInfo the same color mode, and setting auto_convert to +false. +-In the decoder, you can make it store the pixel data in the same color type +as the PNG has, by setting the color_convert setting to false. Settings in +info_raw are then ignored. + +6.3. padding bits +----------------- + +In the PNG file format, if a less than 8-bit per pixel color type is used and the scanlines +have a bit amount that isn't a multiple of 8, then padding bits are used so that each +scanline starts at a fresh byte. But that is NOT true for the LodePNG raw input and output. +The raw input image you give to the encoder, and the raw output image you get from the decoder +will NOT have these padding bits, e.g. in the case of a 1-bit image with a width +of 7 pixels, the first pixel of the second scanline will the 8th bit of the first byte, +not the first bit of a new byte. + +6.4. A note about 16-bits per channel and endianness +---------------------------------------------------- + +LodePNG uses unsigned char arrays for 16-bit per channel colors too, just like +for any other color format. The 16-bit values are stored in big endian (most +significant byte first) in these arrays. This is the opposite order of the +little endian used by x86 CPU's. + +LodePNG always uses big endian because the PNG file format does so internally. +Conversions to other formats than PNG uses internally are not supported by +LodePNG on purpose, there are myriads of formats, including endianness of 16-bit +colors, the order in which you store R, G, B and A, and so on. Supporting and +converting to/from all that is outside the scope of LodePNG. + +This may mean that, depending on your use case, you may want to convert the big +endian output of LodePNG to little endian with a for loop. This is certainly not +always needed, many applications and libraries support big endian 16-bit colors +anyway, but it means you cannot simply cast the unsigned char* buffer to an +unsigned short* buffer on x86 CPUs. + + +7. error values +--------------- + +All functions in LodePNG that return an error code, return 0 if everything went +OK, or a non-zero code if there was an error. + +The meaning of the LodePNG error values can be retrieved with the function +lodepng_error_text: given the numerical error code, it returns a description +of the error in English as a string. + +Check the implementation of lodepng_error_text to see the meaning of each code. + +It is not recommended to use the numerical values to programmatically make +different decisions based on error types as the numbers are not guaranteed to +stay backwards compatible. They are for human consumption only. Programmatically +only 0 or non-0 matter. + + +8. chunks and PNG editing +------------------------- + +If you want to add extra chunks to a PNG you encode, or use LodePNG for a PNG +editor that should follow the rules about handling of unknown chunks, or if your +program is able to read other types of chunks than the ones handled by LodePNG, +then that's possible with the chunk functions of LodePNG. + +A PNG chunk has the following layout: + +4 bytes length +4 bytes type name +length bytes data +4 bytes CRC + +8.1. iterating through chunks +----------------------------- + +If you have a buffer containing the PNG image data, then the first chunk (the +IHDR chunk) starts at byte number 8 of that buffer. The first 8 bytes are the +signature of the PNG and are not part of a chunk. But if you start at byte 8 +then you have a chunk, and can check the following things of it. + +NOTE: none of these functions check for memory buffer boundaries. To avoid +exploits, always make sure the buffer contains all the data of the chunks. +When using lodepng_chunk_next, make sure the returned value is within the +allocated memory. + +unsigned lodepng_chunk_length(const unsigned char* chunk): + +Get the length of the chunk's data. The total chunk length is this length + 12. + +void lodepng_chunk_type(char type[5], const unsigned char* chunk): +unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type): + +Get the type of the chunk or compare if it's a certain type + +unsigned char lodepng_chunk_critical(const unsigned char* chunk): +unsigned char lodepng_chunk_private(const unsigned char* chunk): +unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk): + +Check if the chunk is critical in the PNG standard (only IHDR, PLTE, IDAT and IEND are). +Check if the chunk is private (public chunks are part of the standard, private ones not). +Check if the chunk is safe to copy. If it's not, then, when modifying data in a critical +chunk, unsafe to copy chunks of the old image may NOT be saved in the new one if your +program doesn't handle that type of unknown chunk. + +unsigned char* lodepng_chunk_data(unsigned char* chunk): +const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk): + +Get a pointer to the start of the data of the chunk. + +unsigned lodepng_chunk_check_crc(const unsigned char* chunk): +void lodepng_chunk_generate_crc(unsigned char* chunk): + +Check if the crc is correct or generate a correct one. + +unsigned char* lodepng_chunk_next(unsigned char* chunk): +const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk): + +Iterate to the next chunk. This works if you have a buffer with consecutive chunks. Note that these +functions do no boundary checking of the allocated data whatsoever, so make sure there is enough +data available in the buffer to be able to go to the next chunk. + +unsigned lodepng_chunk_append(unsigned char** out, size_t* outsize, const unsigned char* chunk): +unsigned lodepng_chunk_create(unsigned char** out, size_t* outsize, unsigned length, + const char* type, const unsigned char* data): + +These functions are used to create new chunks that are appended to the data in *out that has +length *outsize. The append function appends an existing chunk to the new data. The create +function creates a new chunk with the given parameters and appends it. Type is the 4-letter +name of the chunk. + +8.2. chunks in info_png +----------------------- + +The LodePNGInfo struct contains fields with the unknown chunk in it. It has 3 +buffers (each with size) to contain 3 types of unknown chunks: +the ones that come before the PLTE chunk, the ones that come between the PLTE +and the IDAT chunks, and the ones that come after the IDAT chunks. +It's necessary to make the distinction between these 3 cases because the PNG +standard forces to keep the ordering of unknown chunks compared to the critical +chunks, but does not force any other ordering rules. + +info_png.unknown_chunks_data[0] is the chunks before PLTE +info_png.unknown_chunks_data[1] is the chunks after PLTE, before IDAT +info_png.unknown_chunks_data[2] is the chunks after IDAT + +The chunks in these 3 buffers can be iterated through and read by using the same +way described in the previous subchapter. + +When using the decoder to decode a PNG, you can make it store all unknown chunks +if you set the option settings.remember_unknown_chunks to 1. By default, this +option is off (0). + +The encoder will always encode unknown chunks that are stored in the info_png. +If you need it to add a particular chunk that isn't known by LodePNG, you can +use lodepng_chunk_append or lodepng_chunk_create to the chunk data in +info_png.unknown_chunks_data[x]. + +Chunks that are known by LodePNG should not be added in that way. E.g. to make +LodePNG add a bKGD chunk, set background_defined to true and add the correct +parameters there instead. + + +9. compiler support +------------------- + +No libraries other than the current standard C library are needed to compile +LodePNG. For the C++ version, only the standard C++ library is needed on top. +Add the files lodepng.c(pp) and lodepng.h to your project, include +lodepng.h where needed, and your program can read/write PNG files. + +It is compatible with C90 and up, and C++03 and up. + +If performance is important, use optimization when compiling! For both the +encoder and decoder, this makes a large difference. + +Make sure that LodePNG is compiled with the same compiler of the same version +and with the same settings as the rest of the program, or the interfaces with +std::vectors and std::strings in C++ can be incompatible. + +CHAR_BITS must be 8 or higher, because LodePNG uses unsigned chars for octets. + +*) gcc and g++ + +LodePNG is developed in gcc so this compiler is natively supported. It gives no +warnings with compiler options "-Wall -Wextra -pedantic -ansi", with gcc and g++ +version 4.7.1 on Linux, 32-bit and 64-bit. + +*) Clang + +Fully supported and warning-free. + +*) Mingw + +The Mingw compiler (a port of gcc for Windows) should be fully supported by +LodePNG. + +*) Visual Studio and Visual C++ Express Edition + +LodePNG should be warning-free with warning level W4. Two warnings were disabled +with pragmas though: warning 4244 about implicit conversions, and warning 4996 +where it wants to use a non-standard function fopen_s instead of the standard C +fopen. + +Visual Studio may want "stdafx.h" files to be included in each source file and +give an error "unexpected end of file while looking for precompiled header". +This is not standard C++ and will not be added to the stock LodePNG. You can +disable it for lodepng.cpp only by right clicking it, Properties, C/C++, +Precompiled Headers, and set it to Not Using Precompiled Headers there. + +NOTE: Modern versions of VS should be fully supported, but old versions, e.g. +VS6, are not guaranteed to work. + +*) Compilers on Macintosh + +LodePNG has been reported to work both with gcc and LLVM for Macintosh, both for +C and C++. + +*) Other Compilers + +If you encounter problems on any compilers, feel free to let me know and I may +try to fix it if the compiler is modern and standards compliant. + + +10. examples +------------ + +This decoder example shows the most basic usage of LodePNG. More complex +examples can be found on the LodePNG website. + +10.1. decoder C++ example +------------------------- + +#include "lodepng.h" +#include + +int main(int argc, char *argv[]) { + const char* filename = argc > 1 ? argv[1] : "test.png"; + + //load and decode + std::vector image; + unsigned width, height; + unsigned error = lodepng::decode(image, width, height, filename); + + //if there's an error, display it + if(error) std::cout << "decoder error " << error << ": " << lodepng_error_text(error) << std::endl; + + //the pixels are now in the vector "image", 4 bytes per pixel, ordered RGBARGBA..., use it as texture, draw it, ... +} + +10.2. decoder C example +----------------------- + +#include "lodepng.h" + +int main(int argc, char *argv[]) { + unsigned error; + unsigned char* image; + size_t width, height; + const char* filename = argc > 1 ? argv[1] : "test.png"; + + error = lodepng_decode32_file(&image, &width, &height, filename); + + if(error) printf("decoder error %u: %s\n", error, lodepng_error_text(error)); + + / * use image here * / + + free(image); + return 0; +} + +11. state settings reference +---------------------------- + +A quick reference of some settings to set on the LodePNGState + +For decoding: + +state.decoder.zlibsettings.ignore_adler32: ignore ADLER32 checksums +state.decoder.zlibsettings.custom_...: use custom inflate function +state.decoder.ignore_crc: ignore CRC checksums +state.decoder.ignore_critical: ignore unknown critical chunks +state.decoder.ignore_end: ignore missing IEND chunk. May fail if this corruption causes other errors +state.decoder.color_convert: convert internal PNG color to chosen one +state.decoder.read_text_chunks: whether to read in text metadata chunks +state.decoder.remember_unknown_chunks: whether to read in unknown chunks +state.info_raw.colortype: desired color type for decoded image +state.info_raw.bitdepth: desired bit depth for decoded image +state.info_raw....: more color settings, see struct LodePNGColorMode +state.info_png....: no settings for decoder but ouput, see struct LodePNGInfo + +For encoding: + +state.encoder.zlibsettings.btype: disable compression by setting it to 0 +state.encoder.zlibsettings.use_lz77: use LZ77 in compression +state.encoder.zlibsettings.windowsize: tweak LZ77 windowsize +state.encoder.zlibsettings.minmatch: tweak min LZ77 length to match +state.encoder.zlibsettings.nicematch: tweak LZ77 match where to stop searching +state.encoder.zlibsettings.lazymatching: try one more LZ77 matching +state.encoder.zlibsettings.custom_...: use custom deflate function +state.encoder.auto_convert: choose optimal PNG color type, if 0 uses info_png +state.encoder.filter_palette_zero: PNG filter strategy for palette +state.encoder.filter_strategy: PNG filter strategy to encode with +state.encoder.force_palette: add palette even if not encoding to one +state.encoder.add_id: add LodePNG identifier and version as a text chunk +state.encoder.text_compression: use compressed text chunks for metadata +state.info_raw.colortype: color type of raw input image you provide +state.info_raw.bitdepth: bit depth of raw input image you provide +state.info_raw: more color settings, see struct LodePNGColorMode +state.info_png.color.colortype: desired color type if auto_convert is false +state.info_png.color.bitdepth: desired bit depth if auto_convert is false +state.info_png.color....: more color settings, see struct LodePNGColorMode +state.info_png....: more PNG related settings, see struct LodePNGInfo + + +12. changes +----------- + +The version number of LodePNG is the date of the change given in the format +yyyymmdd. + +Some changes aren't backwards compatible. Those are indicated with a (!) +symbol. + +Not all changes are listed here, the commit history in github lists more: +https://github.com/lvandeve/lodepng + +*) 17 okt 2020: prevent decoding too large text/icc chunks by default. +*) 06 mar 2020: simplified some of the dynamic memory allocations. +*) 12 jan 2020: (!) added 'end' argument to lodepng_chunk_next to allow correct + overflow checks. +*) 14 aug 2019: around 25% faster decoding thanks to huffman lookup tables. +*) 15 jun 2019: (!) auto_choose_color API changed (for bugfix: don't use palette + if gray ICC profile) and non-ICC LodePNGColorProfile renamed to + LodePNGColorStats. +*) 30 dec 2018: code style changes only: removed newlines before opening braces. +*) 10 sep 2018: added way to inspect metadata chunks without full decoding. +*) 19 aug 2018: (!) fixed color mode bKGD is encoded with and made it use + palette index in case of palette. +*) 10 aug 2018: (!) added support for gAMA, cHRM, sRGB and iCCP chunks. This + change is backwards compatible unless you relied on unknown_chunks for those. +*) 11 jun 2018: less restrictive check for pixel size integer overflow +*) 14 jan 2018: allow optionally ignoring a few more recoverable errors +*) 17 sep 2017: fix memory leak for some encoder input error cases +*) 27 nov 2016: grey+alpha auto color model detection bugfix +*) 18 apr 2016: Changed qsort to custom stable sort (for platforms w/o qsort). +*) 09 apr 2016: Fixed colorkey usage detection, and better file loading (within + the limits of pure C90). +*) 08 dec 2015: Made load_file function return error if file can't be opened. +*) 24 okt 2015: Bugfix with decoding to palette output. +*) 18 apr 2015: Boundary PM instead of just package-merge for faster encoding. +*) 24 aug 2014: Moved to github +*) 23 aug 2014: Reduced needless memory usage of decoder. +*) 28 jun 2014: Removed fix_png setting, always support palette OOB for + simplicity. Made ColorProfile public. +*) 09 jun 2014: Faster encoder by fixing hash bug and more zeros optimization. +*) 22 dec 2013: Power of two windowsize required for optimization. +*) 15 apr 2013: Fixed bug with LAC_ALPHA and color key. +*) 25 mar 2013: Added an optional feature to ignore some PNG errors (fix_png). +*) 11 mar 2013: (!) Bugfix with custom free. Changed from "my" to "lodepng_" + prefix for the custom allocators and made it possible with a new #define to + use custom ones in your project without needing to change lodepng's code. +*) 28 jan 2013: Bugfix with color key. +*) 27 okt 2012: Tweaks in text chunk keyword length error handling. +*) 8 okt 2012: (!) Added new filter strategy (entropy) and new auto color mode. + (no palette). Better deflate tree encoding. New compression tweak settings. + Faster color conversions while decoding. Some internal cleanups. +*) 23 sep 2012: Reduced warnings in Visual Studio a little bit. +*) 1 sep 2012: (!) Removed #define's for giving custom (de)compression functions + and made it work with function pointers instead. +*) 23 jun 2012: Added more filter strategies. Made it easier to use custom alloc + and free functions and toggle #defines from compiler flags. Small fixes. +*) 6 may 2012: (!) Made plugging in custom zlib/deflate functions more flexible. +*) 22 apr 2012: (!) Made interface more consistent, renaming a lot. Removed + redundant C++ codec classes. Reduced amount of structs. Everything changed, + but it is cleaner now imho and functionality remains the same. Also fixed + several bugs and shrunk the implementation code. Made new samples. +*) 6 nov 2011: (!) By default, the encoder now automatically chooses the best + PNG color model and bit depth, based on the amount and type of colors of the + raw image. For this, autoLeaveOutAlphaChannel replaced by auto_choose_color. +*) 9 okt 2011: simpler hash chain implementation for the encoder. +*) 8 sep 2011: lz77 encoder lazy matching instead of greedy matching. +*) 23 aug 2011: tweaked the zlib compression parameters after benchmarking. + A bug with the PNG filtertype heuristic was fixed, so that it chooses much + better ones (it's quite significant). A setting to do an experimental, slow, + brute force search for PNG filter types is added. +*) 17 aug 2011: (!) changed some C zlib related function names. +*) 16 aug 2011: made the code less wide (max 120 characters per line). +*) 17 apr 2011: code cleanup. Bugfixes. Convert low to 16-bit per sample colors. +*) 21 feb 2011: fixed compiling for C90. Fixed compiling with sections disabled. +*) 11 dec 2010: encoding is made faster, based on suggestion by Peter Eastman + to optimize long sequences of zeros. +*) 13 nov 2010: added LodePNG_InfoColor_hasPaletteAlpha and + LodePNG_InfoColor_canHaveAlpha functions for convenience. +*) 7 nov 2010: added LodePNG_error_text function to get error code description. +*) 30 okt 2010: made decoding slightly faster +*) 26 okt 2010: (!) changed some C function and struct names (more consistent). + Reorganized the documentation and the declaration order in the header. +*) 08 aug 2010: only changed some comments and external samples. +*) 05 jul 2010: fixed bug thanks to warnings in the new gcc version. +*) 14 mar 2010: fixed bug where too much memory was allocated for char buffers. +*) 02 sep 2008: fixed bug where it could create empty tree that linux apps could + read by ignoring the problem but windows apps couldn't. +*) 06 jun 2008: added more error checks for out of memory cases. +*) 26 apr 2008: added a few more checks here and there to ensure more safety. +*) 06 mar 2008: crash with encoding of strings fixed +*) 02 feb 2008: support for international text chunks added (iTXt) +*) 23 jan 2008: small cleanups, and #defines to divide code in sections +*) 20 jan 2008: support for unknown chunks allowing using LodePNG for an editor. +*) 18 jan 2008: support for tIME and pHYs chunks added to encoder and decoder. +*) 17 jan 2008: ability to encode and decode compressed zTXt chunks added + Also various fixes, such as in the deflate and the padding bits code. +*) 13 jan 2008: Added ability to encode Adam7-interlaced images. Improved + filtering code of encoder. +*) 07 jan 2008: (!) changed LodePNG to use ISO C90 instead of C++. A + C++ wrapper around this provides an interface almost identical to before. + Having LodePNG be pure ISO C90 makes it more portable. The C and C++ code + are together in these files but it works both for C and C++ compilers. +*) 29 dec 2007: (!) changed most integer types to unsigned int + other tweaks +*) 30 aug 2007: bug fixed which makes this Borland C++ compatible +*) 09 aug 2007: some VS2005 warnings removed again +*) 21 jul 2007: deflate code placed in new namespace separate from zlib code +*) 08 jun 2007: fixed bug with 2- and 4-bit color, and small interlaced images +*) 04 jun 2007: improved support for Visual Studio 2005: crash with accessing + invalid std::vector element [0] fixed, and level 3 and 4 warnings removed +*) 02 jun 2007: made the encoder add a tag with version by default +*) 27 may 2007: zlib and png code separated (but still in the same file), + simple encoder/decoder functions added for more simple usage cases +*) 19 may 2007: minor fixes, some code cleaning, new error added (error 69), + moved some examples from here to lodepng_examples.cpp +*) 12 may 2007: palette decoding bug fixed +*) 24 apr 2007: changed the license from BSD to the zlib license +*) 11 mar 2007: very simple addition: ability to encode bKGD chunks. +*) 04 mar 2007: (!) tEXt chunk related fixes, and support for encoding + palettized PNG images. Plus little interface change with palette and texts. +*) 03 mar 2007: Made it encode dynamic Huffman shorter with repeat codes. + Fixed a bug where the end code of a block had length 0 in the Huffman tree. +*) 26 feb 2007: Huffman compression with dynamic trees (BTYPE 2) now implemented + and supported by the encoder, resulting in smaller PNGs at the output. +*) 27 jan 2007: Made the Adler-32 test faster so that a timewaste is gone. +*) 24 jan 2007: gave encoder an error interface. Added color conversion from any + greyscale type to 8-bit greyscale with or without alpha. +*) 21 jan 2007: (!) Totally changed the interface. It allows more color types + to convert to and is more uniform. See the manual for how it works now. +*) 07 jan 2007: Some cleanup & fixes, and a few changes over the last days: + encode/decode custom tEXt chunks, separate classes for zlib & deflate, and + at last made the decoder give errors for incorrect Adler32 or Crc. +*) 01 jan 2007: Fixed bug with encoding PNGs with less than 8 bits per channel. +*) 29 dec 2006: Added support for encoding images without alpha channel, and + cleaned out code as well as making certain parts faster. +*) 28 dec 2006: Added "Settings" to the encoder. +*) 26 dec 2006: The encoder now does LZ77 encoding and produces much smaller files now. + Removed some code duplication in the decoder. Fixed little bug in an example. +*) 09 dec 2006: (!) Placed output parameters of public functions as first parameter. + Fixed a bug of the decoder with 16-bit per color. +*) 15 okt 2006: Changed documentation structure +*) 09 okt 2006: Encoder class added. It encodes a valid PNG image from the + given image buffer, however for now it's not compressed. +*) 08 sep 2006: (!) Changed to interface with a Decoder class +*) 30 jul 2006: (!) LodePNG_InfoPng , width and height are now retrieved in different + way. Renamed decodePNG to decodePNGGeneric. +*) 29 jul 2006: (!) Changed the interface: image info is now returned as a + struct of type LodePNG::LodePNG_Info, instead of a vector, which was a bit clumsy. +*) 28 jul 2006: Cleaned the code and added new error checks. + Corrected terminology "deflate" into "inflate". +*) 23 jun 2006: Added SDL example in the documentation in the header, this + example allows easy debugging by displaying the PNG and its transparency. +*) 22 jun 2006: (!) Changed way to obtain error value. Added + loadFile function for convenience. Made decodePNG32 faster. +*) 21 jun 2006: (!) Changed type of info vector to unsigned. + Changed position of palette in info vector. Fixed an important bug that + happened on PNGs with an uncompressed block. +*) 16 jun 2006: Internally changed unsigned into unsigned where + needed, and performed some optimizations. +*) 07 jun 2006: (!) Renamed functions to decodePNG and placed them + in LodePNG namespace. Changed the order of the parameters. Rewrote the + documentation in the header. Renamed files to lodepng.cpp and lodepng.h +*) 22 apr 2006: Optimized and improved some code +*) 07 sep 2005: (!) Changed to std::vector interface +*) 12 aug 2005: Initial release (C++, decoder only) + + +13. contact information +----------------------- + +Feel free to contact me with suggestions, problems, comments, ... concerning +LodePNG. If you encounter a PNG image that doesn't work properly with this +decoder, feel free to send it and I'll use it to find and fix the problem. + +My email address is (puzzle the account and domain together with an @ symbol): +Domain: gmail dot com. +Account: lode dot vandevenne. + + +Copyright (c) 2005-2020 Lode Vandevenne +*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/png/lv_png.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/png/lv_png.c new file mode 100644 index 0000000..d067ef5 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/png/lv_png.c @@ -0,0 +1,258 @@ +/** + * @file lv_png.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" +#if LV_USE_PNG + +#include "lv_png.h" +#include "lodepng.h" +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_res_t decoder_info(struct _lv_img_decoder_t * decoder, const void * src, lv_img_header_t * header); +static lv_res_t decoder_open(lv_img_decoder_t * dec, lv_img_decoder_dsc_t * dsc); +static void decoder_close(lv_img_decoder_t * dec, lv_img_decoder_dsc_t * dsc); +static void convert_color_depth(uint8_t * img, uint32_t px_cnt); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Register the PNG decoder functions in LVGL + */ +void lv_png_init(void) +{ + lv_img_decoder_t * dec = lv_img_decoder_create(); + lv_img_decoder_set_info_cb(dec, decoder_info); + lv_img_decoder_set_open_cb(dec, decoder_open); + lv_img_decoder_set_close_cb(dec, decoder_close); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Get info about a PNG image + * @param src can be file name or pointer to a C array + * @param header store the info here + * @return LV_RES_OK: no error; LV_RES_INV: can't get the info + */ +static lv_res_t decoder_info(struct _lv_img_decoder_t * decoder, const void * src, lv_img_header_t * header) +{ + (void) decoder; /*Unused*/ + lv_img_src_t src_type = lv_img_src_get_type(src); /*Get the source type*/ + + /*If it's a PNG file...*/ + if(src_type == LV_IMG_SRC_FILE) { + const char * fn = src; + if(strcmp(lv_fs_get_ext(fn), "png") == 0) { /*Check the extension*/ + + /* Read the width and height from the file. They have a constant location: + * [16..23]: width + * [24..27]: height + */ + uint32_t size[2]; + lv_fs_file_t f; + lv_fs_res_t res = lv_fs_open(&f, fn, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) return LV_RES_INV; + + lv_fs_seek(&f, 16, LV_FS_SEEK_SET); + + uint32_t rn; + lv_fs_read(&f, &size, 8, &rn); + lv_fs_close(&f); + + if(rn != 8) return LV_RES_INV; + + /*Save the data in the header*/ + header->always_zero = 0; + header->cf = LV_IMG_CF_TRUE_COLOR_ALPHA; + /*The width and height are stored in Big endian format so convert them to little endian*/ + header->w = (lv_coord_t)((size[0] & 0xff000000) >> 24) + ((size[0] & 0x00ff0000) >> 8); + header->h = (lv_coord_t)((size[1] & 0xff000000) >> 24) + ((size[1] & 0x00ff0000) >> 8); + + return LV_RES_OK; + } + } + /*If it's a PNG file in a C array...*/ + else if(src_type == LV_IMG_SRC_VARIABLE) { + const lv_img_dsc_t * img_dsc = src; + const uint32_t data_size = img_dsc->data_size; + const uint8_t magic[] = {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a}; + if(data_size < sizeof(magic)) return LV_RES_INV; + if(memcmp(magic, img_dsc->data, sizeof(magic))) return LV_RES_INV; + header->always_zero = 0; + header->cf = img_dsc->header.cf; /*Save the color format*/ + header->w = img_dsc->header.w; /*Save the color width*/ + header->h = img_dsc->header.h; /*Save the color height*/ + return LV_RES_OK; + } + + return LV_RES_INV; /*If didn't succeeded earlier then it's an error*/ +} + + +/** + * Open a PNG image and return the decided image + * @param src can be file name or pointer to a C array + * @param style style of the image object (unused now but certain formats might use it) + * @return pointer to the decoded image or `LV_IMG_DECODER_OPEN_FAIL` if failed + */ +static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc) +{ + + (void) decoder; /*Unused*/ + uint32_t error; /*For the return values of PNG decoder functions*/ + + uint8_t * img_data = NULL; + + /*If it's a PNG file...*/ + if(dsc->src_type == LV_IMG_SRC_FILE) { + const char * fn = dsc->src; + if(strcmp(lv_fs_get_ext(fn), "png") == 0) { /*Check the extension*/ + + /*Load the PNG file into buffer. It's still compressed (not decoded)*/ + unsigned char * png_data; /*Pointer to the loaded data. Same as the original file just loaded into the RAM*/ + size_t png_data_size; /*Size of `png_data` in bytes*/ + + error = lodepng_load_file(&png_data, &png_data_size, fn); /*Load the file*/ + if(error) { + LV_LOG_WARN("error %u: %s\n", error, lodepng_error_text(error)); + return LV_RES_INV; + } + + /*Decode the PNG image*/ + uint32_t png_width; /*Will be the width of the decoded image*/ + uint32_t png_height; /*Will be the width of the decoded image*/ + + /*Decode the loaded image in ARGB8888 */ + error = lodepng_decode32(&img_data, &png_width, &png_height, png_data, png_data_size); + lv_mem_free(png_data); /*Free the loaded file*/ + if(error) { + if(img_data != NULL) { + lv_mem_free(img_data); + } + LV_LOG_WARN("error %u: %s\n", error, lodepng_error_text(error)); + return LV_RES_INV; + } + + /*Convert the image to the system's color depth*/ + convert_color_depth(img_data, png_width * png_height); + dsc->img_data = img_data; + return LV_RES_OK; /*The image is fully decoded. Return with its pointer*/ + } + } + /*If it's a PNG file in a C array...*/ + else if(dsc->src_type == LV_IMG_SRC_VARIABLE) { + const lv_img_dsc_t * img_dsc = dsc->src; + uint32_t png_width; /*No used, just required by he decoder*/ + uint32_t png_height; /*No used, just required by he decoder*/ + + /*Decode the image in ARGB8888 */ + error = lodepng_decode32(&img_data, &png_width, &png_height, img_dsc->data, img_dsc->data_size); + + if(error) { + if(img_data != NULL) { + lv_mem_free(img_data); + } + return LV_RES_INV; + } + + /*Convert the image to the system's color depth*/ + convert_color_depth(img_data, png_width * png_height); + + dsc->img_data = img_data; + return LV_RES_OK; /*Return with its pointer*/ + } + + return LV_RES_INV; /*If not returned earlier then it failed*/ +} + +/** + * Free the allocated resources + */ +static void decoder_close(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); /*Unused*/ + if(dsc->img_data) { + lv_mem_free((uint8_t *)dsc->img_data); + dsc->img_data = NULL; + } +} + +/** + * If the display is not in 32 bit format (ARGB888) then covert the image to the current color depth + * @param img the ARGB888 image + * @param px_cnt number of pixels in `img` + */ +static void convert_color_depth(uint8_t * img, uint32_t px_cnt) +{ +#if LV_COLOR_DEPTH == 32 + lv_color32_t * img_argb = (lv_color32_t *)img; + lv_color_t c; + lv_color_t * img_c = (lv_color_t *) img; + uint32_t i; + for(i = 0; i < px_cnt; i++) { + c = lv_color_make(img_argb[i].ch.red, img_argb[i].ch.green, img_argb[i].ch.blue); + img_c[i].ch.red = c.ch.blue; + img_c[i].ch.blue = c.ch.red; + } +#elif LV_COLOR_DEPTH == 16 + lv_color32_t * img_argb = (lv_color32_t *)img; + lv_color_t c; + uint32_t i; + for(i = 0; i < px_cnt; i++) { + c = lv_color_make(img_argb[i].ch.blue, img_argb[i].ch.green, img_argb[i].ch.red); + img[i * 3 + 2] = img_argb[i].ch.alpha; + img[i * 3 + 1] = c.full >> 8; + img[i * 3 + 0] = c.full & 0xFF; + } +#elif LV_COLOR_DEPTH == 8 + lv_color32_t * img_argb = (lv_color32_t *)img; + lv_color_t c; + uint32_t i; + for(i = 0; i < px_cnt; i++) { + c = lv_color_make(img_argb[i].ch.red, img_argb[i].ch.green, img_argb[i].ch.blue); + img[i * 2 + 1] = img_argb[i].ch.alpha; + img[i * 2 + 0] = c.full; + } +#elif LV_COLOR_DEPTH == 1 + lv_color32_t * img_argb = (lv_color32_t *)img; + uint8_t b; + uint32_t i; + for(i = 0; i < px_cnt; i++) { + b = img_argb[i].ch.red | img_argb[i].ch.green | img_argb[i].ch.blue; + img[i * 2 + 1] = img_argb[i].ch.alpha; + img[i * 2 + 0] = b > 128 ? 1 : 0; + } +#endif +} + +#endif /*LV_USE_PNG*/ + + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/png/lv_png.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/png/lv_png.h new file mode 100644 index 0000000..4380472 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/png/lv_png.h @@ -0,0 +1,46 @@ +/** + * @file lv_png.h + * + */ + +#ifndef LV_PNG_H +#define LV_PNG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" +#if LV_USE_PNG + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Register the PNG decoder functions in LVGL + */ +void lv_png_init(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_PNG*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_PNG_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/qrcode/lv_qrcode.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/qrcode/lv_qrcode.c new file mode 100644 index 0000000..079873e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/qrcode/lv_qrcode.c @@ -0,0 +1,215 @@ +/** + * @file lv_qrcode.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_qrcode.h" +#if LV_USE_QRCODE + +#include "qrcodegen.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_qrcode_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_qrcode_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_qrcode_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_qrcode_class = { + .constructor_cb = lv_qrcode_constructor, + .destructor_cb = lv_qrcode_destructor, + .base_class = &lv_canvas_class +}; + +static lv_coord_t size_param; +static lv_color_t dark_color_param; +static lv_color_t light_color_param; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Create an empty QR code (an `lv_canvas`) object. + * @param parent point to an object where to create the QR code + * @param size width and height of the QR code + * @param dark_color dark color of the QR code + * @param light_color light color of the QR code + * @return pointer to the created QR code object + */ +lv_obj_t * lv_qrcode_create(lv_obj_t * parent, lv_coord_t size, lv_color_t dark_color, lv_color_t light_color) +{ + LV_LOG_INFO("begin"); + size_param = size; + light_color_param = light_color; + dark_color_param = dark_color; + + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; + +} + +/** + * Set the data of a QR code object + * @param qrcode pointer to aQ code object + * @param data data to display + * @param data_len length of data in bytes + * @return LV_RES_OK: if no error; LV_RES_INV: on error + */ +lv_res_t lv_qrcode_update(lv_obj_t * qrcode, const void * data, uint32_t data_len) +{ + lv_color_t c; + c.full = 1; + lv_canvas_fill_bg(qrcode, c, LV_OPA_COVER); + + if(data_len > qrcodegen_BUFFER_LEN_MAX) return LV_RES_INV; + + lv_img_dsc_t * imgdsc = lv_canvas_get_img(qrcode); + + int32_t qr_version = qrcodegen_getMinFitVersion(qrcodegen_Ecc_MEDIUM, data_len); + if(qr_version <= 0) return LV_RES_INV; + int32_t qr_size = qrcodegen_version2size(qr_version); + if(qr_size <= 0) return LV_RES_INV; + int32_t scale = imgdsc->header.w / qr_size; + if(scale <= 0) return LV_RES_INV; + int32_t remain = imgdsc->header.w % qr_size; + + /* The qr version is incremented by four point */ + uint32_t version_extend = remain / (scale << 2); + if(version_extend && qr_version < qrcodegen_VERSION_MAX) { + qr_version = qr_version + version_extend > qrcodegen_VERSION_MAX ? + qrcodegen_VERSION_MAX : qr_version + version_extend; + } + + uint8_t * qr0 = lv_mem_alloc(qrcodegen_BUFFER_LEN_FOR_VERSION(qr_version)); + LV_ASSERT_MALLOC(qr0); + uint8_t * data_tmp = lv_mem_alloc(qrcodegen_BUFFER_LEN_FOR_VERSION(qr_version)); + LV_ASSERT_MALLOC(data_tmp); + lv_memcpy(data_tmp, data, data_len); + + bool ok = qrcodegen_encodeBinary(data_tmp, data_len, + qr0, qrcodegen_Ecc_MEDIUM, + qr_version, qr_version, + qrcodegen_Mask_AUTO, true); + + if(!ok) { + lv_mem_free(qr0); + lv_mem_free(data_tmp); + return LV_RES_INV; + } + + lv_coord_t obj_w = imgdsc->header.w; + qr_size = qrcodegen_getSize(qr0); + scale = obj_w / qr_size; + int scaled = qr_size * scale; + int margin = (obj_w - scaled) / 2; + uint8_t * buf_u8 = (uint8_t *)imgdsc->data + 8; /*+8 skip the palette*/ + + /* Copy the qr code canvas: + * A simple `lv_canvas_set_px` would work but it's slow for so many pixels. + * So buffer 1 byte (8 px) from the qr code and set it in the canvas image */ + uint32_t row_byte_cnt = (imgdsc->header.w + 7) >> 3; + int y; + for(y = margin; y < scaled + margin; y += scale) { + uint8_t b = 0; + uint8_t p = 0; + bool aligned = false; + int x; + for(x = margin; x < scaled + margin; x++) { + bool a = qrcodegen_getModule(qr0, (x - margin) / scale, (y - margin) / scale); + + if(aligned == false && (x & 0x7) == 0) aligned = true; + + if(aligned == false) { + c.full = a ? 0 : 1; + lv_canvas_set_px_color(qrcode, x, y, c); + } + else { + if(!a) b |= (1 << (7 - p)); + p++; + if(p == 8) { + uint32_t px = row_byte_cnt * y + (x >> 3); + buf_u8[px] = b; + b = 0; + p = 0; + } + } + } + + /*Process the last byte of the row*/ + if(p) { + /*Make the rest of the bits white*/ + b |= (1 << (8 - p)) - 1; + + uint32_t px = row_byte_cnt * y + (x >> 3); + buf_u8[px] = b; + } + + /*The Qr is probably scaled so simply to the repeated rows*/ + int s; + const uint8_t * row_ori = buf_u8 + row_byte_cnt * y; + for(s = 1; s < scale; s++) { + lv_memcpy((uint8_t *)buf_u8 + row_byte_cnt * (y + s), row_ori, row_byte_cnt); + } + } + + lv_mem_free(qr0); + lv_mem_free(data_tmp); + return LV_RES_OK; +} + + +void lv_qrcode_delete(lv_obj_t * qrcode) +{ + lv_obj_del(qrcode); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_qrcode_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + uint32_t buf_size = LV_CANVAS_BUF_SIZE_INDEXED_1BIT(size_param, size_param); + uint8_t * buf = lv_mem_alloc(buf_size); + LV_ASSERT_MALLOC(buf); + if(buf == NULL) return; + + lv_canvas_set_buffer(obj, buf, size_param, size_param, LV_IMG_CF_INDEXED_1BIT); + lv_canvas_set_palette(obj, 0, dark_color_param); + lv_canvas_set_palette(obj, 1, light_color_param); +} + +static void lv_qrcode_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + lv_img_dsc_t * img = lv_canvas_get_img(obj); + lv_img_cache_invalidate_src(img); + lv_mem_free((void *)img->data); + img->data = NULL; +} + +#endif /*LV_USE_QRCODE*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/qrcode/lv_qrcode.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/qrcode/lv_qrcode.h new file mode 100644 index 0000000..b0752ac --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/qrcode/lv_qrcode.h @@ -0,0 +1,69 @@ +/** + * @file lv_qrcode + * + */ + +#ifndef LV_QRCODE_H +#define LV_QRCODE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" +#if LV_USE_QRCODE + +/********************* + * DEFINES + *********************/ + +extern const lv_obj_class_t lv_qrcode_class; + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an empty QR code (an `lv_canvas`) object. + * @param parent point to an object where to create the QR code + * @param size width and height of the QR code + * @param dark_color dark color of the QR code + * @param light_color light color of the QR code + * @return pointer to the created QR code object + */ +lv_obj_t * lv_qrcode_create(lv_obj_t * parent, lv_coord_t size, lv_color_t dark_color, lv_color_t light_color); + +/** + * Set the data of a QR code object + * @param qrcode pointer to aQ code object + * @param data data to display + * @param data_len length of data in bytes + * @return LV_RES_OK: if no error; LV_RES_INV: on error + */ +lv_res_t lv_qrcode_update(lv_obj_t * qrcode, const void * data, uint32_t data_len); + +/** + * DEPRECATED: Use normal lv_obj_del instead + * Delete a QR code object + * @param qrcode pointer to a QR code object + */ +void lv_qrcode_delete(lv_obj_t * qrcode); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_QRCODE*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_QRCODE_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/qrcode/qrcodegen.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/qrcode/qrcodegen.c new file mode 100644 index 0000000..37ee742 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/qrcode/qrcodegen.c @@ -0,0 +1,1035 @@ +/* + * QR Code generator library (C) + * + * Copyright (c) Project Nayuki. (MIT License) + * https://www.nayuki.io/page/qr-code-generator-library + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * - The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * - The Software is provided "as is", without warranty of any kind, express or + * implied, including but not limited to the warranties of merchantability, + * fitness for a particular purpose and noninfringement. In no event shall the + * authors or copyright holders be liable for any claim, damages or other + * liability, whether in an action of contract, tort or otherwise, arising from, + * out of or in connection with the Software or the use or other dealings in the + * Software. + */ + +#include +#include +#include +#include +#include "qrcodegen.h" + +#ifndef QRCODEGEN_TEST + #define testable static // Keep functions private +#else + #define testable // Expose private functions +#endif + + +/*---- Forward declarations for private functions ----*/ + +// Regarding all public and private functions defined in this source file: +// - They require all pointer/array arguments to be not null unless the array length is zero. +// - They only read input scalar/array arguments, write to output pointer/array +// arguments, and return scalar values; they are "pure" functions. +// - They don't read mutable global variables or write to any global variables. +// - They don't perform I/O, read the clock, print to console, etc. +// - They allocate a small and constant amount of stack memory. +// - They don't allocate or free any memory on the heap. +// - They don't recurse or mutually recurse. All the code +// could be inlined into the top-level public functions. +// - They run in at most quadratic time with respect to input arguments. +// Most functions run in linear time, and some in constant time. +// There are no unbounded loops or non-obvious termination conditions. +// - They are completely thread-safe if the caller does not give the +// same writable buffer to concurrent calls to these functions. + +testable void appendBitsToBuffer(unsigned int val, int numBits, uint8_t buffer[], int *bitLen); + +testable void addEccAndInterleave(uint8_t data[], int version, enum qrcodegen_Ecc ecl, uint8_t result[]); +testable int getNumDataCodewords(int version, enum qrcodegen_Ecc ecl); +testable int getNumRawDataModules(int ver); + +testable void calcReedSolomonGenerator(int degree, uint8_t result[]); +testable void calcReedSolomonRemainder(const uint8_t data[], int dataLen, + const uint8_t generator[], int degree, uint8_t result[]); +testable uint8_t finiteFieldMultiply(uint8_t x, uint8_t y); + +testable void initializeFunctionModules(int version, uint8_t qrcode[]); +static void drawWhiteFunctionModules(uint8_t qrcode[], int version); +static void drawFormatBits(enum qrcodegen_Ecc ecl, enum qrcodegen_Mask mask, uint8_t qrcode[]); +testable int getAlignmentPatternPositions(int version, uint8_t result[7]); +static void fillRectangle(int left, int top, int width, int height, uint8_t qrcode[]); + +static void drawCodewords(const uint8_t data[], int dataLen, uint8_t qrcode[]); +static void applyMask(const uint8_t functionModules[], uint8_t qrcode[], enum qrcodegen_Mask mask); +static long getPenaltyScore(const uint8_t qrcode[]); +static void addRunToHistory(unsigned char run, unsigned char history[7]); +static bool hasFinderLikePattern(const unsigned char runHistory[7]); + +testable bool getModule(const uint8_t qrcode[], int x, int y); +testable void setModule(uint8_t qrcode[], int x, int y, bool isBlack); +testable void setModuleBounded(uint8_t qrcode[], int x, int y, bool isBlack); +static bool getBit(int x, int i); + +testable int calcSegmentBitLength(enum qrcodegen_Mode mode, size_t numChars); +testable int getTotalBits(const struct qrcodegen_Segment segs[], size_t len, int version); +static int numCharCountBits(enum qrcodegen_Mode mode, int version); + + + +/*---- Private tables of constants ----*/ + +// The set of all legal characters in alphanumeric mode, where each character +// value maps to the index in the string. For checking text and encoding segments. +static const char *ALPHANUMERIC_CHARSET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:"; + +// For generating error correction codes. +testable const int8_t ECC_CODEWORDS_PER_BLOCK[4][41] = { + // Version: (note that index 0 is for padding, and is set to an illegal value) + //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level + {-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // Low + {-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, // Medium + {-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // Quartile + {-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // High +}; + +#define qrcodegen_REED_SOLOMON_DEGREE_MAX 30 // Based on the table above + +// For generating error correction codes. +testable const int8_t NUM_ERROR_CORRECTION_BLOCKS[4][41] = { + // Version: (note that index 0 is for padding, and is set to an illegal value) + //0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level + {-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25}, // Low + {-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49}, // Medium + {-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68}, // Quartile + {-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81}, // High +}; + +// For automatic mask pattern selection. +static const int PENALTY_N1 = 3; +static const int PENALTY_N2 = 3; +static const int PENALTY_N3 = 40; +static const int PENALTY_N4 = 10; + + + +/*---- High-level QR Code encoding functions ----*/ + +// Public function - see documentation comment in header file. +bool qrcodegen_encodeText(const char *text, uint8_t tempBuffer[], uint8_t qrcode[], + enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl) { + + size_t textLen = strlen(text); + if (textLen == 0) + return qrcodegen_encodeSegmentsAdvanced(NULL, 0, ecl, minVersion, maxVersion, mask, boostEcl, tempBuffer, qrcode); + size_t bufLen = qrcodegen_BUFFER_LEN_FOR_VERSION(maxVersion); + + struct qrcodegen_Segment seg; + if (qrcodegen_isNumeric(text)) { + if (qrcodegen_calcSegmentBufferSize(qrcodegen_Mode_NUMERIC, textLen) > bufLen) + goto fail; + seg = qrcodegen_makeNumeric(text, tempBuffer); + } else if (qrcodegen_isAlphanumeric(text)) { + if (qrcodegen_calcSegmentBufferSize(qrcodegen_Mode_ALPHANUMERIC, textLen) > bufLen) + goto fail; + seg = qrcodegen_makeAlphanumeric(text, tempBuffer); + } else { + if (textLen > bufLen) + goto fail; + for (size_t i = 0; i < textLen; i++) + tempBuffer[i] = (uint8_t)text[i]; + seg.mode = qrcodegen_Mode_BYTE; + seg.bitLength = calcSegmentBitLength(seg.mode, textLen); + if (seg.bitLength == -1) + goto fail; + seg.numChars = (int)textLen; + seg.data = tempBuffer; + } + return qrcodegen_encodeSegmentsAdvanced(&seg, 1, ecl, minVersion, maxVersion, mask, boostEcl, tempBuffer, qrcode); + +fail: + qrcode[0] = 0; // Set size to invalid value for safety + return false; +} + + +// Public function - see documentation comment in header file. +bool qrcodegen_encodeBinary(uint8_t dataAndTemp[], size_t dataLen, uint8_t qrcode[], + enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl) { + + struct qrcodegen_Segment seg; + seg.mode = qrcodegen_Mode_BYTE; + seg.bitLength = calcSegmentBitLength(seg.mode, dataLen); + if (seg.bitLength == -1) { + qrcode[0] = 0; // Set size to invalid value for safety + return false; + } + seg.numChars = (int)dataLen; + seg.data = dataAndTemp; + return qrcodegen_encodeSegmentsAdvanced(&seg, 1, ecl, minVersion, maxVersion, mask, boostEcl, dataAndTemp, qrcode); +} + + +// Appends the given number of low-order bits of the given value to the given byte-based +// bit buffer, increasing the bit length. Requires 0 <= numBits <= 16 and val < 2^numBits. +testable void appendBitsToBuffer(unsigned int val, int numBits, uint8_t buffer[], int *bitLen) { + assert(0 <= numBits && numBits <= 16 && (unsigned long)val >> numBits == 0); + for (int i = numBits - 1; i >= 0; i--, (*bitLen)++) + buffer[*bitLen >> 3] |= ((val >> i) & 1) << (7 - (*bitLen & 7)); +} + + + +/*---- Low-level QR Code encoding functions ----*/ + +// Public function - see documentation comment in header file. +bool qrcodegen_encodeSegments(const struct qrcodegen_Segment segs[], size_t len, + enum qrcodegen_Ecc ecl, uint8_t tempBuffer[], uint8_t qrcode[]) { + return qrcodegen_encodeSegmentsAdvanced(segs, len, ecl, + qrcodegen_VERSION_MIN, qrcodegen_VERSION_MAX, -1, true, tempBuffer, qrcode); +} + + +// Public function - see documentation comment in header file. +bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], size_t len, enum qrcodegen_Ecc ecl, + int minVersion, int maxVersion, int mask, bool boostEcl, uint8_t tempBuffer[], uint8_t qrcode[]) { + assert(segs != NULL || len == 0); + assert(qrcodegen_VERSION_MIN <= minVersion && minVersion <= maxVersion && maxVersion <= qrcodegen_VERSION_MAX); + assert(0 <= (int)ecl && (int)ecl <= 3 && -1 <= (int)mask && (int)mask <= 7); + + // Find the minimal version number to use + int version, dataUsedBits; + for (version = minVersion; ; version++) { + int dataCapacityBits = getNumDataCodewords(version, ecl) * 8; // Number of data bits available + dataUsedBits = getTotalBits(segs, len, version); + if (dataUsedBits != -1 && dataUsedBits <= dataCapacityBits) + break; // This version number is found to be suitable + if (version >= maxVersion) { // All versions in the range could not fit the given data + qrcode[0] = 0; // Set size to invalid value for safety + return false; + } + } + assert(dataUsedBits != -1); + + // Increase the error correction level while the data still fits in the current version number + for (int i = (int)qrcodegen_Ecc_MEDIUM; i <= (int)qrcodegen_Ecc_HIGH; i++) { // From low to high + if (boostEcl && dataUsedBits <= getNumDataCodewords(version, (enum qrcodegen_Ecc)i) * 8) + ecl = (enum qrcodegen_Ecc)i; + } + + // Concatenate all segments to create the data bit string + memset(qrcode, 0, qrcodegen_BUFFER_LEN_FOR_VERSION(version) * sizeof(qrcode[0])); + int bitLen = 0; + for (size_t i = 0; i < len; i++) { + const struct qrcodegen_Segment *seg = &segs[i]; + appendBitsToBuffer((int)seg->mode, 4, qrcode, &bitLen); + appendBitsToBuffer(seg->numChars, numCharCountBits(seg->mode, version), qrcode, &bitLen); + for (int j = 0; j < seg->bitLength; j++) + appendBitsToBuffer((seg->data[j >> 3] >> (7 - (j & 7))) & 1, 1, qrcode, &bitLen); + } + assert(bitLen == dataUsedBits); + + // Add terminator and pad up to a byte if applicable + int dataCapacityBits = getNumDataCodewords(version, ecl) * 8; + assert(bitLen <= dataCapacityBits); + int terminatorBits = dataCapacityBits - bitLen; + if (terminatorBits > 4) + terminatorBits = 4; + appendBitsToBuffer(0, terminatorBits, qrcode, &bitLen); + appendBitsToBuffer(0, (8 - bitLen % 8) % 8, qrcode, &bitLen); + assert(bitLen % 8 == 0); + + // Pad with alternating bytes until data capacity is reached + for (uint8_t padByte = 0xEC; bitLen < dataCapacityBits; padByte ^= 0xEC ^ 0x11) + appendBitsToBuffer(padByte, 8, qrcode, &bitLen); + + // Draw function and data codeword modules + addEccAndInterleave(qrcode, version, ecl, tempBuffer); + initializeFunctionModules(version, qrcode); + drawCodewords(tempBuffer, getNumRawDataModules(version) / 8, qrcode); + drawWhiteFunctionModules(qrcode, version); + initializeFunctionModules(version, tempBuffer); + + // Handle masking + if (mask == qrcodegen_Mask_AUTO) { // Automatically choose best mask + long minPenalty = LONG_MAX; + for (int i = 0; i < 8; i++) { + enum qrcodegen_Mask msk = (enum qrcodegen_Mask)i; + applyMask(tempBuffer, qrcode, msk); + drawFormatBits(ecl, msk, qrcode); + long penalty = getPenaltyScore(qrcode); + if (penalty < minPenalty) { + mask = msk; + minPenalty = penalty; + } + applyMask(tempBuffer, qrcode, msk); // Undoes the mask due to XOR + } + } + assert(0 <= (int)mask && (int)mask <= 7); + applyMask(tempBuffer, qrcode, mask); + drawFormatBits(ecl, mask, qrcode); + return true; +} + + + +/*---- Error correction code generation functions ----*/ + +// Appends error correction bytes to each block of the given data array, then interleaves +// bytes from the blocks and stores them in the result array. data[0 : dataLen] contains +// the input data. data[dataLen : rawCodewords] is used as a temporary work area and will +// be clobbered by this function. The final answer is stored in result[0 : rawCodewords]. +testable void addEccAndInterleave(uint8_t data[], int version, enum qrcodegen_Ecc ecl, uint8_t result[]) { + // Calculate parameter numbers + assert(0 <= (int)ecl && (int)ecl < 4 && qrcodegen_VERSION_MIN <= version && version <= qrcodegen_VERSION_MAX); + int numBlocks = NUM_ERROR_CORRECTION_BLOCKS[(int)ecl][version]; + int blockEccLen = ECC_CODEWORDS_PER_BLOCK [(int)ecl][version]; + int rawCodewords = getNumRawDataModules(version) / 8; + int dataLen = getNumDataCodewords(version, ecl); + int numShortBlocks = numBlocks - rawCodewords % numBlocks; + int shortBlockDataLen = rawCodewords / numBlocks - blockEccLen; + + // Split data into blocks, calculate ECC, and interleave + // (not concatenate) the bytes into a single sequence + uint8_t generator[qrcodegen_REED_SOLOMON_DEGREE_MAX]; + calcReedSolomonGenerator(blockEccLen, generator); + const uint8_t *dat = data; + for (int i = 0; i < numBlocks; i++) { + int datLen = shortBlockDataLen + (i < numShortBlocks ? 0 : 1); + uint8_t *ecc = &data[dataLen]; // Temporary storage + calcReedSolomonRemainder(dat, datLen, generator, blockEccLen, ecc); + for (int j = 0, k = i; j < datLen; j++, k += numBlocks) { // Copy data + if (j == shortBlockDataLen) + k -= numShortBlocks; + result[k] = dat[j]; + } + for (int j = 0, k = dataLen + i; j < blockEccLen; j++, k += numBlocks) // Copy ECC + result[k] = ecc[j]; + dat += datLen; + } +} + + +// Returns the number of 8-bit codewords that can be used for storing data (not ECC), +// for the given version number and error correction level. The result is in the range [9, 2956]. +testable int getNumDataCodewords(int version, enum qrcodegen_Ecc ecl) { + int v = version, e = (int)ecl; + assert(0 <= e && e < 4); + return getNumRawDataModules(v) / 8 + - ECC_CODEWORDS_PER_BLOCK [e][v] + * NUM_ERROR_CORRECTION_BLOCKS[e][v]; +} + + +// Returns the number of data bits that can be stored in a QR Code of the given version number, after +// all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8. +// The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table. +testable int getNumRawDataModules(int ver) { + assert(qrcodegen_VERSION_MIN <= ver && ver <= qrcodegen_VERSION_MAX); + int result = (16 * ver + 128) * ver + 64; + if (ver >= 2) { + int numAlign = ver / 7 + 2; + result -= (25 * numAlign - 10) * numAlign - 55; + if (ver >= 7) + result -= 36; + } + return result; +} + + + +/*---- Reed-Solomon ECC generator functions ----*/ + +// Calculates the Reed-Solomon generator polynomial of the given degree, storing in result[0 : degree]. +testable void calcReedSolomonGenerator(int degree, uint8_t result[]) { + // Start with the monomial x^0 + assert(1 <= degree && degree <= qrcodegen_REED_SOLOMON_DEGREE_MAX); + memset(result, 0, degree * sizeof(result[0])); + result[degree - 1] = 1; + + // Compute the product polynomial (x - r^0) * (x - r^1) * (x - r^2) * ... * (x - r^{degree-1}), + // drop the highest term, and store the rest of the coefficients in order of descending powers. + // Note that r = 0x02, which is a generator element of this field GF(2^8/0x11D). + uint8_t root = 1; + for (int i = 0; i < degree; i++) { + // Multiply the current product by (x - r^i) + for (int j = 0; j < degree; j++) { + result[j] = finiteFieldMultiply(result[j], root); + if (j + 1 < degree) + result[j] ^= result[j + 1]; + } + root = finiteFieldMultiply(root, 0x02); + } +} + + +// Calculates the remainder of the polynomial data[0 : dataLen] when divided by the generator[0 : degree], where all +// polynomials are in big endian and the generator has an implicit leading 1 term, storing the result in result[0 : degree]. +testable void calcReedSolomonRemainder(const uint8_t data[], int dataLen, + const uint8_t generator[], int degree, uint8_t result[]) { + + // Perform polynomial division + assert(1 <= degree && degree <= qrcodegen_REED_SOLOMON_DEGREE_MAX); + memset(result, 0, degree * sizeof(result[0])); + for (int i = 0; i < dataLen; i++) { + uint8_t factor = data[i] ^ result[0]; + memmove(&result[0], &result[1], (degree - 1) * sizeof(result[0])); + result[degree - 1] = 0; + for (int j = 0; j < degree; j++) + result[j] ^= finiteFieldMultiply(generator[j], factor); + } +} + +#undef qrcodegen_REED_SOLOMON_DEGREE_MAX + + +// Returns the product of the two given field elements modulo GF(2^8/0x11D). +// All inputs are valid. This could be implemented as a 256*256 lookup table. +testable uint8_t finiteFieldMultiply(uint8_t x, uint8_t y) { + // Russian peasant multiplication + uint8_t z = 0; + for (int i = 7; i >= 0; i--) { + z = (z << 1) ^ ((z >> 7) * 0x11D); + z ^= ((y >> i) & 1) * x; + } + return z; +} + + + +/*---- Drawing function modules ----*/ + +// Clears the given QR Code grid with white modules for the given +// version's size, then marks every function module as black. +testable void initializeFunctionModules(int version, uint8_t qrcode[]) { + // Initialize QR Code + int qrsize = version * 4 + 17; + memset(qrcode, 0, ((qrsize * qrsize + 7) / 8 + 1) * sizeof(qrcode[0])); + qrcode[0] = (uint8_t)qrsize; + + // Fill horizontal and vertical timing patterns + fillRectangle(6, 0, 1, qrsize, qrcode); + fillRectangle(0, 6, qrsize, 1, qrcode); + + // Fill 3 finder patterns (all corners except bottom right) and format bits + fillRectangle(0, 0, 9, 9, qrcode); + fillRectangle(qrsize - 8, 0, 8, 9, qrcode); + fillRectangle(0, qrsize - 8, 9, 8, qrcode); + + // Fill numerous alignment patterns + uint8_t alignPatPos[7]; + int numAlign = getAlignmentPatternPositions(version, alignPatPos); + for (int i = 0; i < numAlign; i++) { + for (int j = 0; j < numAlign; j++) { + // Don't draw on the three finder corners + if (!((i == 0 && j == 0) || (i == 0 && j == numAlign - 1) || (i == numAlign - 1 && j == 0))) + fillRectangle(alignPatPos[i] - 2, alignPatPos[j] - 2, 5, 5, qrcode); + } + } + + // Fill version blocks + if (version >= 7) { + fillRectangle(qrsize - 11, 0, 3, 6, qrcode); + fillRectangle(0, qrsize - 11, 6, 3, qrcode); + } +} + + +// Draws white function modules and possibly some black modules onto the given QR Code, without changing +// non-function modules. This does not draw the format bits. This requires all function modules to be previously +// marked black (namely by initializeFunctionModules()), because this may skip redrawing black function modules. +static void drawWhiteFunctionModules(uint8_t qrcode[], int version) { + // Draw horizontal and vertical timing patterns + int qrsize = qrcodegen_getSize(qrcode); + for (int i = 7; i < qrsize - 7; i += 2) { + setModule(qrcode, 6, i, false); + setModule(qrcode, i, 6, false); + } + + // Draw 3 finder patterns (all corners except bottom right; overwrites some timing modules) + for (int dy = -4; dy <= 4; dy++) { + for (int dx = -4; dx <= 4; dx++) { + int dist = abs(dx); + if (abs(dy) > dist) + dist = abs(dy); + if (dist == 2 || dist == 4) { + setModuleBounded(qrcode, 3 + dx, 3 + dy, false); + setModuleBounded(qrcode, qrsize - 4 + dx, 3 + dy, false); + setModuleBounded(qrcode, 3 + dx, qrsize - 4 + dy, false); + } + } + } + + // Draw numerous alignment patterns + uint8_t alignPatPos[7]; + int numAlign = getAlignmentPatternPositions(version, alignPatPos); + for (int i = 0; i < numAlign; i++) { + for (int j = 0; j < numAlign; j++) { + if ((i == 0 && j == 0) || (i == 0 && j == numAlign - 1) || (i == numAlign - 1 && j == 0)) + continue; // Don't draw on the three finder corners + for (int dy = -1; dy <= 1; dy++) { + for (int dx = -1; dx <= 1; dx++) + setModule(qrcode, alignPatPos[i] + dx, alignPatPos[j] + dy, dx == 0 && dy == 0); + } + } + } + + // Draw version blocks + if (version >= 7) { + // Calculate error correction code and pack bits + int rem = version; // version is uint6, in the range [7, 40] + for (int i = 0; i < 12; i++) + rem = (rem << 1) ^ ((rem >> 11) * 0x1F25); + long bits = (long)version << 12 | rem; // uint18 + assert(bits >> 18 == 0); + + // Draw two copies + for (int i = 0; i < 6; i++) { + for (int j = 0; j < 3; j++) { + int k = qrsize - 11 + j; + setModule(qrcode, k, i, (bits & 1) != 0); + setModule(qrcode, i, k, (bits & 1) != 0); + bits >>= 1; + } + } + } +} + + +// Draws two copies of the format bits (with its own error correction code) based +// on the given mask and error correction level. This always draws all modules of +// the format bits, unlike drawWhiteFunctionModules() which might skip black modules. +static void drawFormatBits(enum qrcodegen_Ecc ecl, enum qrcodegen_Mask mask, uint8_t qrcode[]) { + // Calculate error correction code and pack bits + assert(0 <= (int)mask && (int)mask <= 7); + static const int table[] = {1, 0, 3, 2}; + int data = table[(int)ecl] << 3 | (int)mask; // errCorrLvl is uint2, mask is uint3 + int rem = data; + for (int i = 0; i < 10; i++) + rem = (rem << 1) ^ ((rem >> 9) * 0x537); + int bits = (data << 10 | rem) ^ 0x5412; // uint15 + assert(bits >> 15 == 0); + + // Draw first copy + for (int i = 0; i <= 5; i++) + setModule(qrcode, 8, i, getBit(bits, i)); + setModule(qrcode, 8, 7, getBit(bits, 6)); + setModule(qrcode, 8, 8, getBit(bits, 7)); + setModule(qrcode, 7, 8, getBit(bits, 8)); + for (int i = 9; i < 15; i++) + setModule(qrcode, 14 - i, 8, getBit(bits, i)); + + // Draw second copy + int qrsize = qrcodegen_getSize(qrcode); + for (int i = 0; i < 8; i++) + setModule(qrcode, qrsize - 1 - i, 8, getBit(bits, i)); + for (int i = 8; i < 15; i++) + setModule(qrcode, 8, qrsize - 15 + i, getBit(bits, i)); + setModule(qrcode, 8, qrsize - 8, true); // Always black +} + + +// Calculates and stores an ascending list of positions of alignment patterns +// for this version number, returning the length of the list (in the range [0,7]). +// Each position is in the range [0,177), and are used on both the x and y axes. +// This could be implemented as lookup table of 40 variable-length lists of unsigned bytes. +testable int getAlignmentPatternPositions(int version, uint8_t result[7]) { + if (version == 1) + return 0; + int numAlign = version / 7 + 2; + int step = (version == 32) ? 26 : + (version*4 + numAlign*2 + 1) / (numAlign*2 - 2) * 2; + for (int i = numAlign - 1, pos = version * 4 + 10; i >= 1; i--, pos -= step) + result[i] = pos; + result[0] = 6; + return numAlign; +} + + +// Sets every pixel in the range [left : left + width] * [top : top + height] to black. +static void fillRectangle(int left, int top, int width, int height, uint8_t qrcode[]) { + for (int dy = 0; dy < height; dy++) { + for (int dx = 0; dx < width; dx++) + setModule(qrcode, left + dx, top + dy, true); + } +} + + + +/*---- Drawing data modules and masking ----*/ + +// Draws the raw codewords (including data and ECC) onto the given QR Code. This requires the initial state of +// the QR Code to be black at function modules and white at codeword modules (including unused remainder bits). +static void drawCodewords(const uint8_t data[], int dataLen, uint8_t qrcode[]) { + int qrsize = qrcodegen_getSize(qrcode); + int i = 0; // Bit index into the data + // Do the funny zigzag scan + for (int right = qrsize - 1; right >= 1; right -= 2) { // Index of right column in each column pair + if (right == 6) + right = 5; + for (int vert = 0; vert < qrsize; vert++) { // Vertical counter + for (int j = 0; j < 2; j++) { + int x = right - j; // Actual x coordinate + bool upward = ((right + 1) & 2) == 0; + int y = upward ? qrsize - 1 - vert : vert; // Actual y coordinate + if (!getModule(qrcode, x, y) && i < dataLen * 8) { + bool black = getBit(data[i >> 3], 7 - (i & 7)); + setModule(qrcode, x, y, black); + i++; + } + // If this QR Code has any remainder bits (0 to 7), they were assigned as + // 0/false/white by the constructor and are left unchanged by this method + } + } + } + assert(i == dataLen * 8); +} + + +// XORs the codeword modules in this QR Code with the given mask pattern. +// The function modules must be marked and the codeword bits must be drawn +// before masking. Due to the arithmetic of XOR, calling applyMask() with +// the same mask value a second time will undo the mask. A final well-formed +// QR Code needs exactly one (not zero, two, etc.) mask applied. +static void applyMask(const uint8_t functionModules[], uint8_t qrcode[], enum qrcodegen_Mask mask) { + assert(0 <= (int)mask && (int)mask <= 7); // Disallows qrcodegen_Mask_AUTO + int qrsize = qrcodegen_getSize(qrcode); + for (int y = 0; y < qrsize; y++) { + for (int x = 0; x < qrsize; x++) { + if (getModule(functionModules, x, y)) + continue; + bool invert; + switch ((int)mask) { + case 0: invert = (x + y) % 2 == 0; break; + case 1: invert = y % 2 == 0; break; + case 2: invert = x % 3 == 0; break; + case 3: invert = (x + y) % 3 == 0; break; + case 4: invert = (x / 3 + y / 2) % 2 == 0; break; + case 5: invert = x * y % 2 + x * y % 3 == 0; break; + case 6: invert = (x * y % 2 + x * y % 3) % 2 == 0; break; + case 7: invert = ((x + y) % 2 + x * y % 3) % 2 == 0; break; + default: assert(false); return; + } + bool val = getModule(qrcode, x, y); + setModule(qrcode, x, y, val ^ invert); + } + } +} + + +// Calculates and returns the penalty score based on state of the given QR Code's current modules. +// This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score. +static long getPenaltyScore(const uint8_t qrcode[]) { + int qrsize = qrcodegen_getSize(qrcode); + long result = 0; + + // Adjacent modules in row having same color, and finder-like patterns + for (int y = 0; y < qrsize; y++) { + unsigned char runHistory[7] = {0}; + bool color = false; + unsigned char runX = 0; + for (int x = 0; x < qrsize; x++) { + if (getModule(qrcode, x, y) == color) { + runX++; + if (runX == 5) + result += PENALTY_N1; + else if (runX > 5) + result++; + } else { + addRunToHistory(runX, runHistory); + if (!color && hasFinderLikePattern(runHistory)) + result += PENALTY_N3; + color = getModule(qrcode, x, y); + runX = 1; + } + } + addRunToHistory(runX, runHistory); + if (color) + addRunToHistory(0, runHistory); // Dummy run of white + if (hasFinderLikePattern(runHistory)) + result += PENALTY_N3; + } + // Adjacent modules in column having same color, and finder-like patterns + for (int x = 0; x < qrsize; x++) { + unsigned char runHistory[7] = {0}; + bool color = false; + unsigned char runY = 0; + for (int y = 0; y < qrsize; y++) { + if (getModule(qrcode, x, y) == color) { + runY++; + if (runY == 5) + result += PENALTY_N1; + else if (runY > 5) + result++; + } else { + addRunToHistory(runY, runHistory); + if (!color && hasFinderLikePattern(runHistory)) + result += PENALTY_N3; + color = getModule(qrcode, x, y); + runY = 1; + } + } + addRunToHistory(runY, runHistory); + if (color) + addRunToHistory(0, runHistory); // Dummy run of white + if (hasFinderLikePattern(runHistory)) + result += PENALTY_N3; + } + + // 2*2 blocks of modules having same color + for (int y = 0; y < qrsize - 1; y++) { + for (int x = 0; x < qrsize - 1; x++) { + bool color = getModule(qrcode, x, y); + if ( color == getModule(qrcode, x + 1, y) && + color == getModule(qrcode, x, y + 1) && + color == getModule(qrcode, x + 1, y + 1)) + result += PENALTY_N2; + } + } + + // Balance of black and white modules + int black = 0; + for (int y = 0; y < qrsize; y++) { + for (int x = 0; x < qrsize; x++) { + if (getModule(qrcode, x, y)) + black++; + } + } + int total = qrsize * qrsize; // Note that size is odd, so black/total != 1/2 + // Compute the smallest integer k >= 0 such that (45-5k)% <= black/total <= (55+5k)% + int k = (int)((labs(black * 20L - total * 10L) + total - 1) / total) - 1; + result += k * PENALTY_N4; + return result; +} + + +// Inserts the given value to the front of the given array, which shifts over the +// existing values and deletes the last value. A helper function for getPenaltyScore(). +static void addRunToHistory(unsigned char run, unsigned char history[7]) { + memmove(&history[1], &history[0], 6 * sizeof(history[0])); + history[0] = run; +} + + +// Tests whether the given run history has the pattern of ratio 1:1:3:1:1 in the middle, and +// surrounded by at least 4 on either or both ends. A helper function for getPenaltyScore(). +// Must only be called immediately after a run of white modules has ended. +static bool hasFinderLikePattern(const unsigned char runHistory[7]) { + unsigned char n = runHistory[1]; + // The maximum QR Code size is 177, hence the run length n <= 177. + // Arithmetic is promoted to int, so n*4 will not overflow. + return n > 0 && runHistory[2] == n && runHistory[4] == n && runHistory[5] == n + && runHistory[3] == n * 3 && (runHistory[0] >= n * 4 || runHistory[6] >= n * 4); +} + + + +/*---- Basic QR Code information ----*/ + +// Public function - see documentation comment in header file. +int qrcodegen_getSize(const uint8_t qrcode[]) { + assert(qrcode != NULL); + int result = qrcode[0]; + assert((qrcodegen_VERSION_MIN * 4 + 17) <= result + && result <= (qrcodegen_VERSION_MAX * 4 + 17)); + return result; +} + + +// Public function - see documentation comment in header file. +bool qrcodegen_getModule(const uint8_t qrcode[], int x, int y) { + assert(qrcode != NULL); + int qrsize = qrcode[0]; + return (0 <= x && x < qrsize && 0 <= y && y < qrsize) && getModule(qrcode, x, y); +} + + +// Gets the module at the given coordinates, which must be in bounds. +testable bool getModule(const uint8_t qrcode[], int x, int y) { + int qrsize = qrcode[0]; + assert(21 <= qrsize && qrsize <= 177 && 0 <= x && x < qrsize && 0 <= y && y < qrsize); + int index = y * qrsize + x; + return getBit(qrcode[(index >> 3) + 1], index & 7); +} + + +// Sets the module at the given coordinates, which must be in bounds. +testable void setModule(uint8_t qrcode[], int x, int y, bool isBlack) { + int qrsize = qrcode[0]; + assert(21 <= qrsize && qrsize <= 177 && 0 <= x && x < qrsize && 0 <= y && y < qrsize); + int index = y * qrsize + x; + int bitIndex = index & 7; + int byteIndex = (index >> 3) + 1; + if (isBlack) + qrcode[byteIndex] |= 1 << bitIndex; + else + qrcode[byteIndex] &= (1 << bitIndex) ^ 0xFF; +} + + +// Sets the module at the given coordinates, doing nothing if out of bounds. +testable void setModuleBounded(uint8_t qrcode[], int x, int y, bool isBlack) { + int qrsize = qrcode[0]; + if (0 <= x && x < qrsize && 0 <= y && y < qrsize) + setModule(qrcode, x, y, isBlack); +} + + +// Returns true iff the i'th bit of x is set to 1. Requires x >= 0 and 0 <= i <= 14. +static bool getBit(int x, int i) { + return ((x >> i) & 1) != 0; +} + + + +/*---- Segment handling ----*/ + +// Public function - see documentation comment in header file. +bool qrcodegen_isAlphanumeric(const char *text) { + assert(text != NULL); + for (; *text != '\0'; text++) { + if (strchr(ALPHANUMERIC_CHARSET, *text) == NULL) + return false; + } + return true; +} + + +// Public function - see documentation comment in header file. +bool qrcodegen_isNumeric(const char *text) { + assert(text != NULL); + for (; *text != '\0'; text++) { + if (*text < '0' || *text > '9') + return false; + } + return true; +} + + +// Public function - see documentation comment in header file. +size_t qrcodegen_calcSegmentBufferSize(enum qrcodegen_Mode mode, size_t numChars) { + int temp = calcSegmentBitLength(mode, numChars); + if (temp == -1) + return SIZE_MAX; + assert(0 <= temp && temp <= INT16_MAX); + return ((size_t)temp + 7) / 8; +} + + +// Returns the number of data bits needed to represent a segment +// containing the given number of characters using the given mode. Notes: +// - Returns -1 on failure, i.e. numChars > INT16_MAX or +// the number of needed bits exceeds INT16_MAX (i.e. 32767). +// - Otherwise, all valid results are in the range [0, INT16_MAX]. +// - For byte mode, numChars measures the number of bytes, not Unicode code points. +// - For ECI mode, numChars must be 0, and the worst-case number of bits is returned. +// An actual ECI segment can have shorter data. For non-ECI modes, the result is exact. +testable int calcSegmentBitLength(enum qrcodegen_Mode mode, size_t numChars) { + // All calculations are designed to avoid overflow on all platforms + if (numChars > (unsigned int)INT16_MAX) + return -1; + long result = (long)numChars; + if (mode == qrcodegen_Mode_NUMERIC) + result = (result * 10 + 2) / 3; // ceil(10/3 * n) + else if (mode == qrcodegen_Mode_ALPHANUMERIC) + result = (result * 11 + 1) / 2; // ceil(11/2 * n) + else if (mode == qrcodegen_Mode_BYTE) + result *= 8; + else if (mode == qrcodegen_Mode_KANJI) + result *= 13; + else if (mode == qrcodegen_Mode_ECI && numChars == 0) + result = 3 * 8; + else { // Invalid argument + assert(false); + return -1; + } + assert(result >= 0); + if ((unsigned int)result > (unsigned int)INT16_MAX) + return -1; + return (int)result; +} + + +// Public function - see documentation comment in header file. +struct qrcodegen_Segment qrcodegen_makeBytes(const uint8_t data[], size_t len, uint8_t buf[]) { + assert(data != NULL || len == 0); + struct qrcodegen_Segment result; + result.mode = qrcodegen_Mode_BYTE; + result.bitLength = calcSegmentBitLength(result.mode, len); + assert(result.bitLength != -1); + result.numChars = (int)len; + if (len > 0) + memcpy(buf, data, len * sizeof(buf[0])); + result.data = buf; + return result; +} + + +// Public function - see documentation comment in header file. +struct qrcodegen_Segment qrcodegen_makeNumeric(const char *digits, uint8_t buf[]) { + assert(digits != NULL); + struct qrcodegen_Segment result; + size_t len = strlen(digits); + result.mode = qrcodegen_Mode_NUMERIC; + int bitLen = calcSegmentBitLength(result.mode, len); + assert(bitLen != -1); + result.numChars = (int)len; + if (bitLen > 0) + memset(buf, 0, ((size_t)bitLen + 7) / 8 * sizeof(buf[0])); + result.bitLength = 0; + + unsigned int accumData = 0; + int accumCount = 0; + for (; *digits != '\0'; digits++) { + char c = *digits; + assert('0' <= c && c <= '9'); + accumData = accumData * 10 + (unsigned int)(c - '0'); + accumCount++; + if (accumCount == 3) { + appendBitsToBuffer(accumData, 10, buf, &result.bitLength); + accumData = 0; + accumCount = 0; + } + } + if (accumCount > 0) // 1 or 2 digits remaining + appendBitsToBuffer(accumData, accumCount * 3 + 1, buf, &result.bitLength); + assert(result.bitLength == bitLen); + result.data = buf; + return result; +} + + +// Public function - see documentation comment in header file. +struct qrcodegen_Segment qrcodegen_makeAlphanumeric(const char *text, uint8_t buf[]) { + assert(text != NULL); + struct qrcodegen_Segment result; + size_t len = strlen(text); + result.mode = qrcodegen_Mode_ALPHANUMERIC; + int bitLen = calcSegmentBitLength(result.mode, len); + assert(bitLen != -1); + result.numChars = (int)len; + if (bitLen > 0) + memset(buf, 0, ((size_t)bitLen + 7) / 8 * sizeof(buf[0])); + result.bitLength = 0; + + unsigned int accumData = 0; + int accumCount = 0; + for (; *text != '\0'; text++) { + const char *temp = strchr(ALPHANUMERIC_CHARSET, *text); + assert(temp != NULL); + accumData = accumData * 45 + (unsigned int)(temp - ALPHANUMERIC_CHARSET); + accumCount++; + if (accumCount == 2) { + appendBitsToBuffer(accumData, 11, buf, &result.bitLength); + accumData = 0; + accumCount = 0; + } + } + if (accumCount > 0) // 1 character remaining + appendBitsToBuffer(accumData, 6, buf, &result.bitLength); + assert(result.bitLength == bitLen); + result.data = buf; + return result; +} + + +// Public function - see documentation comment in header file. +struct qrcodegen_Segment qrcodegen_makeEci(long assignVal, uint8_t buf[]) { + struct qrcodegen_Segment result; + result.mode = qrcodegen_Mode_ECI; + result.numChars = 0; + result.bitLength = 0; + if (assignVal < 0) { + assert(false); + } else if (assignVal < (1 << 7)) { + memset(buf, 0, 1 * sizeof(buf[0])); + appendBitsToBuffer(assignVal, 8, buf, &result.bitLength); + } else if (assignVal < (1 << 14)) { + memset(buf, 0, 2 * sizeof(buf[0])); + appendBitsToBuffer(2, 2, buf, &result.bitLength); + appendBitsToBuffer(assignVal, 14, buf, &result.bitLength); + } else if (assignVal < 1000000L) { + memset(buf, 0, 3 * sizeof(buf[0])); + appendBitsToBuffer(6, 3, buf, &result.bitLength); + appendBitsToBuffer(assignVal >> 10, 11, buf, &result.bitLength); + appendBitsToBuffer(assignVal & 0x3FF, 10, buf, &result.bitLength); + } else { + assert(false); + } + result.data = buf; + return result; +} + + +// Calculates the number of bits needed to encode the given segments at the given version. +// Returns a non-negative number if successful. Otherwise returns -1 if a segment has too +// many characters to fit its length field, or the total bits exceeds INT16_MAX. +testable int getTotalBits(const struct qrcodegen_Segment segs[], size_t len, int version) { + assert(segs != NULL || len == 0); + long result = 0; + for (size_t i = 0; i < len; i++) { + int numChars = segs[i].numChars; + int bitLength = segs[i].bitLength; + assert(0 <= numChars && numChars <= INT16_MAX); + assert(0 <= bitLength && bitLength <= INT16_MAX); + int ccbits = numCharCountBits(segs[i].mode, version); + assert(0 <= ccbits && ccbits <= 16); + if (numChars >= (1L << ccbits)) + return -1; // The segment's length doesn't fit the field's bit width + result += 4L + ccbits + bitLength; + if (result > INT16_MAX) + return -1; // The sum might overflow an int type + } + assert(0 <= result && result <= INT16_MAX); + return (int)result; +} + + +// Returns the bit width of the character count field for a segment in the given mode +// in a QR Code at the given version number. The result is in the range [0, 16]. +static int numCharCountBits(enum qrcodegen_Mode mode, int version) { + assert(qrcodegen_VERSION_MIN <= version && version <= qrcodegen_VERSION_MAX); + int i = (version + 7) / 17; + switch (mode) { + case qrcodegen_Mode_NUMERIC : { static const int temp[] = {10, 12, 14}; return temp[i]; } + case qrcodegen_Mode_ALPHANUMERIC: { static const int temp[] = { 9, 11, 13}; return temp[i]; } + case qrcodegen_Mode_BYTE : { static const int temp[] = { 8, 16, 16}; return temp[i]; } + case qrcodegen_Mode_KANJI : { static const int temp[] = { 8, 10, 12}; return temp[i]; } + case qrcodegen_Mode_ECI : return 0; + default: assert(false); return -1; // Dummy value + } +} + +int qrcodegen_getMinFitVersion(enum qrcodegen_Ecc ecl, size_t dataLen) +{ + struct qrcodegen_Segment seg; + seg.mode = qrcodegen_Mode_BYTE; + seg.bitLength = calcSegmentBitLength(seg.mode, dataLen); + seg.numChars = (int)dataLen; + + for (int version = qrcodegen_VERSION_MIN; version <= qrcodegen_VERSION_MAX; version++) { + int dataCapacityBits = getNumDataCodewords(version, ecl) * 8; // Number of data bits available + int dataUsedBits = getTotalBits(&seg, 1, version); + if (dataUsedBits != -1 && dataUsedBits <= dataCapacityBits) + return version; + } + return -1; +} + +int qrcodegen_version2size(int version) +{ + if (version < qrcodegen_VERSION_MIN || version > qrcodegen_VERSION_MAX) { + return -1; + } + + return ((version - 1)*4 + 21); +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/qrcode/qrcodegen.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/qrcode/qrcodegen.h new file mode 100644 index 0000000..b484e91 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/qrcode/qrcodegen.h @@ -0,0 +1,319 @@ +/* + * QR Code generator library (C) + * + * Copyright (c) Project Nayuki. (MIT License) + * https://www.nayuki.io/page/qr-code-generator-library + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * - The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * - The Software is provided "as is", without warranty of any kind, express or + * implied, including but not limited to the warranties of merchantability, + * fitness for a particular purpose and noninfringement. In no event shall the + * authors or copyright holders be liable for any claim, damages or other + * liability, whether in an action of contract, tort or otherwise, arising from, + * out of or in connection with the Software or the use or other dealings in the + * Software. + */ + +#pragma once + +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* + * This library creates QR Code symbols, which is a type of two-dimension barcode. + * Invented by Denso Wave and described in the ISO/IEC 18004 standard. + * A QR Code structure is an immutable square grid of black and white cells. + * The library provides functions to create a QR Code from text or binary data. + * The library covers the QR Code Model 2 specification, supporting all versions (sizes) + * from 1 to 40, all 4 error correction levels, and 4 character encoding modes. + * + * Ways to create a QR Code object: + * - High level: Take the payload data and call qrcodegen_encodeText() or qrcodegen_encodeBinary(). + * - Low level: Custom-make the list of segments and call + * qrcodegen_encodeSegments() or qrcodegen_encodeSegmentsAdvanced(). + * (Note that all ways require supplying the desired error correction level and various byte buffers.) + */ + + +/*---- Enum and struct types----*/ + +/* + * The error correction level in a QR Code symbol. + */ +enum qrcodegen_Ecc { + // Must be declared in ascending order of error protection + // so that an internal qrcodegen function works properly + qrcodegen_Ecc_LOW = 0 , // The QR Code can tolerate about 7% erroneous codewords + qrcodegen_Ecc_MEDIUM , // The QR Code can tolerate about 15% erroneous codewords + qrcodegen_Ecc_QUARTILE, // The QR Code can tolerate about 25% erroneous codewords + qrcodegen_Ecc_HIGH , // The QR Code can tolerate about 30% erroneous codewords +}; + + +/* + * The mask pattern used in a QR Code symbol. + */ +enum qrcodegen_Mask { + // A special value to tell the QR Code encoder to + // automatically select an appropriate mask pattern + qrcodegen_Mask_AUTO = -1, + // The eight actual mask patterns + qrcodegen_Mask_0 = 0, + qrcodegen_Mask_1, + qrcodegen_Mask_2, + qrcodegen_Mask_3, + qrcodegen_Mask_4, + qrcodegen_Mask_5, + qrcodegen_Mask_6, + qrcodegen_Mask_7, +}; + + +/* + * Describes how a segment's data bits are interpreted. + */ +enum qrcodegen_Mode { + qrcodegen_Mode_NUMERIC = 0x1, + qrcodegen_Mode_ALPHANUMERIC = 0x2, + qrcodegen_Mode_BYTE = 0x4, + qrcodegen_Mode_KANJI = 0x8, + qrcodegen_Mode_ECI = 0x7, +}; + + +/* + * A segment of character/binary/control data in a QR Code symbol. + * The mid-level way to create a segment is to take the payload data + * and call a factory function such as qrcodegen_makeNumeric(). + * The low-level way to create a segment is to custom-make the bit buffer + * and initialize a qrcodegen_Segment struct with appropriate values. + * Even in the most favorable conditions, a QR Code can only hold 7089 characters of data. + * Any segment longer than this is meaningless for the purpose of generating QR Codes. + * Moreover, the maximum allowed bit length is 32767 because + * the largest QR Code (version 40) has 31329 modules. + */ +struct qrcodegen_Segment { + // The mode indicator of this segment. + enum qrcodegen_Mode mode; + + // The length of this segment's unencoded data. Measured in characters for + // numeric/alphanumeric/kanji mode, bytes for byte mode, and 0 for ECI mode. + // Always zero or positive. Not the same as the data's bit length. + int numChars; + + // The data bits of this segment, packed in bitwise big endian. + // Can be null if the bit length is zero. + uint8_t *data; + + // The number of valid data bits used in the buffer. Requires + // 0 <= bitLength <= 32767, and bitLength <= (capacity of data array) * 8. + // The character count (numChars) must agree with the mode and the bit buffer length. + int bitLength; +}; + + + +/*---- Macro constants and functions ----*/ + +#define qrcodegen_VERSION_MIN 1 // The minimum version number supported in the QR Code Model 2 standard +#define qrcodegen_VERSION_MAX 40 // The maximum version number supported in the QR Code Model 2 standard + +// Calculates the number of bytes needed to store any QR Code up to and including the given version number, +// as a compile-time constant. For example, 'uint8_t buffer[qrcodegen_BUFFER_LEN_FOR_VERSION(25)];' +// can store any single QR Code from version 1 to 25 (inclusive). The result fits in an int (or int16). +// Requires qrcodegen_VERSION_MIN <= n <= qrcodegen_VERSION_MAX. +#define qrcodegen_BUFFER_LEN_FOR_VERSION(n) ((((n) * 4 + 17) * ((n) * 4 + 17) + 7) / 8 + 1) + +// The worst-case number of bytes needed to store one QR Code, up to and including +// version 40. This value equals 3918, which is just under 4 kilobytes. +// Use this more convenient value to avoid calculating tighter memory bounds for buffers. +#define qrcodegen_BUFFER_LEN_MAX qrcodegen_BUFFER_LEN_FOR_VERSION(qrcodegen_VERSION_MAX) + + + +/*---- Functions (high level) to generate QR Codes ----*/ + +/* + * Encodes the given text string to a QR Code, returning true if encoding succeeded. + * If the data is too long to fit in any version in the given range + * at the given ECC level, then false is returned. + * - The input text must be encoded in UTF-8 and contain no NULs. + * - The variables ecl and mask must correspond to enum constant values. + * - Requires 1 <= minVersion <= maxVersion <= 40. + * - The arrays tempBuffer and qrcode must each have a length + * of at least qrcodegen_BUFFER_LEN_FOR_VERSION(maxVersion). + * - After the function returns, tempBuffer contains no useful data. + * - If successful, the resulting QR Code may use numeric, + * alphanumeric, or byte mode to encode the text. + * - In the most optimistic case, a QR Code at version 40 with low ECC + * can hold any UTF-8 string up to 2953 bytes, or any alphanumeric string + * up to 4296 characters, or any digit string up to 7089 characters. + * These numbers represent the hard upper limit of the QR Code standard. + * - Please consult the QR Code specification for information on + * data capacities per version, ECC level, and text encoding mode. + */ +bool qrcodegen_encodeText(const char *text, uint8_t tempBuffer[], uint8_t qrcode[], + enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl); + + +/* + * Encodes the given binary data to a QR Code, returning true if encoding succeeded. + * If the data is too long to fit in any version in the given range + * at the given ECC level, then false is returned. + * - The input array range dataAndTemp[0 : dataLen] should normally be + * valid UTF-8 text, but is not required by the QR Code standard. + * - The variables ecl and mask must correspond to enum constant values. + * - Requires 1 <= minVersion <= maxVersion <= 40. + * - The arrays dataAndTemp and qrcode must each have a length + * of at least qrcodegen_BUFFER_LEN_FOR_VERSION(maxVersion). + * - After the function returns, the contents of dataAndTemp may have changed, + * and does not represent useful data anymore. + * - If successful, the resulting QR Code will use byte mode to encode the data. + * - In the most optimistic case, a QR Code at version 40 with low ECC can hold any byte + * sequence up to length 2953. This is the hard upper limit of the QR Code standard. + * - Please consult the QR Code specification for information on + * data capacities per version, ECC level, and text encoding mode. + */ +bool qrcodegen_encodeBinary(uint8_t dataAndTemp[], size_t dataLen, uint8_t qrcode[], + enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl); + + +/*---- Functions (low level) to generate QR Codes ----*/ + +/* + * Renders a QR Code representing the given segments at the given error correction level. + * The smallest possible QR Code version is automatically chosen for the output. Returns true if + * QR Code creation succeeded, or false if the data is too long to fit in any version. The ECC level + * of the result may be higher than the ecl argument if it can be done without increasing the version. + * This function allows the user to create a custom sequence of segments that switches + * between modes (such as alphanumeric and byte) to encode text in less space. + * This is a low-level API; the high-level API is qrcodegen_encodeText() and qrcodegen_encodeBinary(). + * To save memory, the segments' data buffers can alias/overlap tempBuffer, and will + * result in them being clobbered, but the QR Code output will still be correct. + * But the qrcode array must not overlap tempBuffer or any segment's data buffer. + */ +bool qrcodegen_encodeSegments(const struct qrcodegen_Segment segs[], size_t len, + enum qrcodegen_Ecc ecl, uint8_t tempBuffer[], uint8_t qrcode[]); + + +/* + * Renders a QR Code representing the given segments with the given encoding parameters. + * Returns true if QR Code creation succeeded, or false if the data is too long to fit in the range of versions. + * The smallest possible QR Code version within the given range is automatically + * chosen for the output. Iff boostEcl is true, then the ECC level of the result + * may be higher than the ecl argument if it can be done without increasing the + * version. The mask number is either between 0 to 7 (inclusive) to force that + * mask, or -1 to automatically choose an appropriate mask (which may be slow). + * This function allows the user to create a custom sequence of segments that switches + * between modes (such as alphanumeric and byte) to encode text in less space. + * This is a low-level API; the high-level API is qrcodegen_encodeText() and qrcodegen_encodeBinary(). + * To save memory, the segments' data buffers can alias/overlap tempBuffer, and will + * result in them being clobbered, but the QR Code output will still be correct. + * But the qrcode array must not overlap tempBuffer or any segment's data buffer. + */ +bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], size_t len, enum qrcodegen_Ecc ecl, + int minVersion, int maxVersion, int mask, bool boostEcl, uint8_t tempBuffer[], uint8_t qrcode[]); + + +/* + * Tests whether the given string can be encoded as a segment in alphanumeric mode. + * A string is encodable iff each character is in the following set: 0 to 9, A to Z + * (uppercase only), space, dollar, percent, asterisk, plus, hyphen, period, slash, colon. + */ +bool qrcodegen_isAlphanumeric(const char *text); + + +/* + * Tests whether the given string can be encoded as a segment in numeric mode. + * A string is encodable iff each character is in the range 0 to 9. + */ +bool qrcodegen_isNumeric(const char *text); + + +/* + * Returns the number of bytes (uint8_t) needed for the data buffer of a segment + * containing the given number of characters using the given mode. Notes: + * - Returns SIZE_MAX on failure, i.e. numChars > INT16_MAX or + * the number of needed bits exceeds INT16_MAX (i.e. 32767). + * - Otherwise, all valid results are in the range [0, ceil(INT16_MAX / 8)], i.e. at most 4096. + * - It is okay for the user to allocate more bytes for the buffer than needed. + * - For byte mode, numChars measures the number of bytes, not Unicode code points. + * - For ECI mode, numChars must be 0, and the worst-case number of bytes is returned. + * An actual ECI segment can have shorter data. For non-ECI modes, the result is exact. + */ +size_t qrcodegen_calcSegmentBufferSize(enum qrcodegen_Mode mode, size_t numChars); + + +/* + * Returns a segment representing the given binary data encoded in + * byte mode. All input byte arrays are acceptable. Any text string + * can be converted to UTF-8 bytes and encoded as a byte mode segment. + */ +struct qrcodegen_Segment qrcodegen_makeBytes(const uint8_t data[], size_t len, uint8_t buf[]); + + +/* + * Returns a segment representing the given string of decimal digits encoded in numeric mode. + */ +struct qrcodegen_Segment qrcodegen_makeNumeric(const char *digits, uint8_t buf[]); + + +/* + * Returns a segment representing the given text string encoded in alphanumeric mode. + * The characters allowed are: 0 to 9, A to Z (uppercase only), space, + * dollar, percent, asterisk, plus, hyphen, period, slash, colon. + */ +struct qrcodegen_Segment qrcodegen_makeAlphanumeric(const char *text, uint8_t buf[]); + + +/* + * Returns a segment representing an Extended Channel Interpretation + * (ECI) designator with the given assignment value. + */ +struct qrcodegen_Segment qrcodegen_makeEci(long assignVal, uint8_t buf[]); + + +/*---- Functions to extract raw data from QR Codes ----*/ + +/* + * Returns the side length of the given QR Code, assuming that encoding succeeded. + * The result is in the range [21, 177]. Note that the length of the array buffer + * is related to the side length - every 'uint8_t qrcode[]' must have length at least + * qrcodegen_BUFFER_LEN_FOR_VERSION(version), which equals ceil(size^2 / 8 + 1). + */ +int qrcodegen_getSize(const uint8_t qrcode[]); + + +/* + * Returns the color of the module (pixel) at the given coordinates, which is false + * for white or true for black. The top left corner has the coordinates (x=0, y=0). + * If the given coordinates are out of bounds, then false (white) is returned. + */ +bool qrcodegen_getModule(const uint8_t qrcode[], int x, int y); + +/* + * Returns the qrcode size of the specified version. Returns -1 on failure + */ +int qrcodegen_version2size(int version); +/* + * Returns the min version of the data that can be stored. Returns -1 on failure + */ +int qrcodegen_getMinFitVersion(enum qrcodegen_Ecc ecl, size_t dataLen); + +#ifdef __cplusplus +} +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/rlottie/lv_rlottie.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/rlottie/lv_rlottie.c new file mode 100644 index 0000000..a264948 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/rlottie/lv_rlottie.c @@ -0,0 +1,284 @@ +/** + * @file lv_rlottie.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_rlottie.h" +#if LV_USE_RLOTTIE + +#include + +/********************* +* DEFINES +*********************/ +#define MY_CLASS &lv_rlottie_class +#define LV_ARGB32 32 + +/********************** +* TYPEDEFS +**********************/ +#define LV_ARGB32 32 + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_rlottie_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_rlottie_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void next_frame_task_cb(lv_timer_t * t); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_rlottie_class = { + .constructor_cb = lv_rlottie_constructor, + .destructor_cb = lv_rlottie_destructor, + .instance_size = sizeof(lv_rlottie_t), + .base_class = &lv_img_class +}; + +static lv_coord_t create_width; +static lv_coord_t create_height; +static const char * rlottie_desc_create; +static const char * path_create; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_rlottie_create_from_file(lv_obj_t * parent, lv_coord_t width, lv_coord_t height, const char * path) +{ + + create_width = width; + create_height = height; + path_create = path; + rlottie_desc_create = NULL; + + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + + return obj; + +} + +lv_obj_t * lv_rlottie_create_from_raw(lv_obj_t * parent, lv_coord_t width, lv_coord_t height, const char * rlottie_desc) +{ + + create_width = width; + create_height = height; + rlottie_desc_create = rlottie_desc; + path_create = NULL; + + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + + return obj; +} + +void lv_rlottie_set_play_mode(lv_obj_t * obj, const lv_rlottie_ctrl_t ctrl) +{ + lv_rlottie_t * rlottie = (lv_rlottie_t *) obj; + rlottie->play_ctrl = ctrl; + + if(rlottie->task && (rlottie->dest_frame != rlottie->current_frame || + (rlottie->play_ctrl & LV_RLOTTIE_CTRL_PAUSE) == LV_RLOTTIE_CTRL_PLAY)) { + lv_timer_resume(rlottie->task); + } +} + +void lv_rlottie_set_current_frame(lv_obj_t * obj, const size_t goto_frame) +{ + lv_rlottie_t * rlottie = (lv_rlottie_t *) obj; + rlottie->current_frame = goto_frame < rlottie->total_frames ? goto_frame : rlottie->total_frames - 1; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_rlottie_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_rlottie_t * rlottie = (lv_rlottie_t *) obj; + + if(rlottie_desc_create) { + rlottie->animation = lottie_animation_from_data(rlottie_desc_create, rlottie_desc_create, ""); + } + else if(path_create) { + rlottie->animation = lottie_animation_from_file(path_create); + } + if(rlottie->animation == NULL) { + LV_LOG_WARN("The aniamtion can't be opened"); + return; + } + + rlottie->total_frames = lottie_animation_get_totalframe(rlottie->animation); + rlottie->framerate = (size_t)lottie_animation_get_framerate(rlottie->animation); + rlottie->current_frame = 0; + + rlottie->scanline_width = create_width * LV_ARGB32 / 8; + + size_t allocaled_buf_size = (create_width * create_height * LV_ARGB32 / 8); + rlottie->allocated_buf = lv_mem_alloc(allocaled_buf_size); + if(rlottie->allocated_buf != NULL) { + rlottie->allocated_buffer_size = allocaled_buf_size; + memset(rlottie->allocated_buf, 0, allocaled_buf_size); + } + + rlottie->imgdsc.header.always_zero = 0; + rlottie->imgdsc.header.cf = LV_IMG_CF_TRUE_COLOR_ALPHA; + rlottie->imgdsc.header.h = create_height; + rlottie->imgdsc.header.w = create_width; + rlottie->imgdsc.data = (void *)rlottie->allocated_buf; + rlottie->imgdsc.data_size = allocaled_buf_size; + + lv_img_set_src(obj, &rlottie->imgdsc); + + rlottie->play_ctrl = LV_RLOTTIE_CTRL_FORWARD | LV_RLOTTIE_CTRL_PLAY | LV_RLOTTIE_CTRL_LOOP; + rlottie->dest_frame = rlottie->total_frames; /* invalid destination frame so it's possible to pause on frame 0 */ + + rlottie->task = lv_timer_create(next_frame_task_cb, 1000 / rlottie->framerate, obj); + + lv_obj_update_layout(obj); +} + + +static void lv_rlottie_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_rlottie_t * rlottie = (lv_rlottie_t *) obj; + + if(rlottie->animation) { + lottie_animation_destroy(rlottie->animation); + rlottie->animation = 0; + rlottie->current_frame = 0; + rlottie->framerate = 0; + rlottie->scanline_width = 0; + rlottie->total_frames = 0; + } + + if(rlottie->task) { + lv_timer_del(rlottie->task); + rlottie->task = NULL; + rlottie->play_ctrl = LV_RLOTTIE_CTRL_FORWARD; + rlottie->dest_frame = 0; + } + + lv_img_cache_invalidate_src(&rlottie->imgdsc); + if(rlottie->allocated_buf) { + lv_mem_free(rlottie->allocated_buf); + rlottie->allocated_buf = NULL; + rlottie->allocated_buffer_size = 0; + } + +} + +#if LV_COLOR_DEPTH == 16 +static void convert_to_rgba5658(uint32_t * pix, const size_t width, const size_t height) +{ + /* rlottie draws in ARGB32 format, but LVGL only deal with RGB565 format with (optional 8 bit alpha channel) + so convert in place here the received buffer to LVGL format. */ + uint8_t * dest = (uint8_t *)pix; + uint32_t * src = pix; + for(size_t y = 0; y < height; y++) { + /* Convert a 4 bytes per pixel in format ARGB to R5G6B5A8 format + naive way: + r = ((c & 0xFF0000) >> 19) + g = ((c & 0xFF00) >> 10) + b = ((c & 0xFF) >> 3) + rgb565 = (r << 11) | (g << 5) | b + a = c >> 24; + That's 3 mask, 6 bitshift and 2 or operations + + A bit better: + r = ((c & 0xF80000) >> 8) + g = ((c & 0xFC00) >> 5) + b = ((c & 0xFF) >> 3) + rgb565 = r | g | b + a = c >> 24; + That's 3 mask, 3 bitshifts and 2 or operations */ + for(size_t x = 0; x < width; x++) { + uint32_t in = src[x]; +#if LV_COLOR_16_SWAP == 0 + uint16_t r = (uint16_t)(((in & 0xF80000) >> 8) | ((in & 0xFC00) >> 5) | ((in & 0xFF) >> 3)); +#else + /* We want: rrrr rrrr GGGg gggg bbbb bbbb => gggb bbbb rrrr rGGG */ + uint16_t r = (uint16_t)(((in & 0xF80000) >> 16) | ((in & 0xFC00) >> 13) | ((in & 0x1C00) << 3) | ((in & 0xF8) << 5)); +#endif + + lv_memcpy(dest, &r, sizeof(r)); + dest[sizeof(r)] = (uint8_t)(in >> 24); + dest += LV_IMG_PX_SIZE_ALPHA_BYTE; + } + src += width; + } +} +#endif + +static void next_frame_task_cb(lv_timer_t * t) +{ + lv_obj_t * obj = t->user_data; + lv_rlottie_t * rlottie = (lv_rlottie_t *) obj; + + if((rlottie->play_ctrl & LV_RLOTTIE_CTRL_PAUSE) == LV_RLOTTIE_CTRL_PAUSE) { + if(rlottie->current_frame == rlottie->dest_frame) { + /* Pause the timer too when it has run once to avoid CPU consumption */ + lv_timer_pause(t); + return; + } + rlottie->dest_frame = rlottie->current_frame; + } + else { + if((rlottie->play_ctrl & LV_RLOTTIE_CTRL_BACKWARD) == LV_RLOTTIE_CTRL_BACKWARD) { + if(rlottie->current_frame > 0) + --rlottie->current_frame; + else { /* Looping ? */ + if((rlottie->play_ctrl & LV_RLOTTIE_CTRL_LOOP) == LV_RLOTTIE_CTRL_LOOP) + rlottie->current_frame = rlottie->total_frames - 1; + else { + lv_event_send(obj, LV_EVENT_READY, NULL); + lv_timer_pause(t); + return; + } + } + } + else { + if(rlottie->current_frame < rlottie->total_frames) + ++rlottie->current_frame; + else { /* Looping ? */ + if((rlottie->play_ctrl & LV_RLOTTIE_CTRL_LOOP) == LV_RLOTTIE_CTRL_LOOP) + rlottie->current_frame = 0; + else { + lv_event_send(obj, LV_EVENT_READY, NULL); + lv_timer_pause(t); + return; + } + } + } + } + + lottie_animation_render( + rlottie->animation, + rlottie->current_frame, + rlottie->allocated_buf, + rlottie->imgdsc.header.w, + rlottie->imgdsc.header.h, + rlottie->scanline_width + ); + +#if LV_COLOR_DEPTH == 16 + convert_to_rgba5658(rlottie->allocated_buf, rlottie->imgdsc.header.w, rlottie->imgdsc.header.h); +#endif + + lv_obj_invalidate(obj); +} + +#endif /*LV_USE_RLOTTIE*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/rlottie/lv_rlottie.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/rlottie/lv_rlottie.h new file mode 100644 index 0000000..d66dc22 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/rlottie/lv_rlottie.h @@ -0,0 +1,75 @@ +/** + * @file lv_rlottie.h + * + */ + +#ifndef LV_RLOTTIE_H +#define LV_RLOTTIE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" +#if LV_USE_RLOTTIE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef enum { + LV_RLOTTIE_CTRL_FORWARD = 0, + LV_RLOTTIE_CTRL_BACKWARD = 1, + LV_RLOTTIE_CTRL_PAUSE = 2, + LV_RLOTTIE_CTRL_PLAY = 0, /* Yes, play = 0 is the default mode */ + LV_RLOTTIE_CTRL_LOOP = 8, +} lv_rlottie_ctrl_t; + +/** definition in lottieanimation_capi.c */ +struct Lottie_Animation_S; +typedef struct { + lv_img_t img_ext; + struct Lottie_Animation_S * animation; + lv_timer_t * task; + lv_img_dsc_t imgdsc; + size_t total_frames; + size_t current_frame; + size_t framerate; + uint32_t * allocated_buf; + size_t allocated_buffer_size; + size_t scanline_width; + lv_rlottie_ctrl_t play_ctrl; + size_t dest_frame; +} lv_rlottie_t; + +extern const lv_obj_class_t lv_rlottie_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_obj_t * lv_rlottie_create_from_file(lv_obj_t * parent, lv_coord_t width, lv_coord_t height, const char * path); + +lv_obj_t * lv_rlottie_create_from_raw(lv_obj_t * parent, lv_coord_t width, lv_coord_t height, + const char * rlottie_desc); + +void lv_rlottie_set_play_mode(lv_obj_t * rlottie, const lv_rlottie_ctrl_t ctrl); +void lv_rlottie_set_current_frame(lv_obj_t * rlottie, const size_t goto_frame); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_RLOTTIE*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_RLOTTIE_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/sjpg/lv_sjpg.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/sjpg/lv_sjpg.c new file mode 100644 index 0000000..5a12ea2 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/sjpg/lv_sjpg.c @@ -0,0 +1,917 @@ +/** + * @file lv_sjpg.c + * + */ + +/*---------------------------------------------------------------------------------------------------------------------------------- +/ Added normal JPG support [7/10/2020] +/ ---------- +/ SJPEG is a custom created modified JPEG file format for small embedded platforms. +/ It will contain multiple JPEG fragments all embedded into a single file with a custom header. +/ This makes JPEG decoding easier using any JPEG library. Overall file size will be almost +/ similar to the parent jpeg file. We can generate sjpeg from any jpeg using a python script +/ provided along with this project. +/ (by vinodstanur | 2020 ) +/ SJPEG FILE STRUCTURE +/ -------------------------------------------------------------------------------------------------------------------------------- +/ Bytes | Value | +/ -------------------------------------------------------------------------------------------------------------------------------- +/ +/ 0 - 7 | "_SJPG__" followed by '\0' +/ +/ 8 - 13 | "V1.00" followed by '\0' [VERSION OF SJPG FILE for future compatibiliby] +/ +/ 14 - 15 | X_RESOLUTION (width) [little endian] +/ +/ 16 - 17 | Y_RESOLUTION (height) [little endian] +/ +/ 18 - 19 | TOTAL_FRAMES inside sjpeg [little endian] +/ +/ 20 - 21 | JPEG BLOCK WIDTH (16 normally) [little endian] +/ +/ 22 - [(TOTAL_FRAMES*2 )] | SIZE OF EACH JPEG SPLIT FRAGMENTS (FRAME_INFO_ARRAY) +/ +/ SJPEG data | Each JPEG frame can be extracted from SJPEG data by parsing the FRAME_INFO_ARRAY one time. +/ +/---------------------------------------------------------------------------------------------------------------------------------- +/ JPEG DECODER +/ ------------ +/ We are using TJpgDec - Tiny JPEG Decompressor library from ELM-CHAN for decoding each split-jpeg fragments. +/ The tjpgd.c and tjpgd.h is not modified and those are used as it is. So if any update comes for the tiny-jpeg, +/ just replace those files with updated files. +/---------------------------------------------------------------------------------------------------------------------------------*/ + +/********************* + * INCLUDES + *********************/ + +#include "../../../lvgl.h" +#if LV_USE_SJPG + +#include "tjpgd.h" +#include "lv_sjpg.h" +#include "../../../misc/lv_fs.h" + +/********************* + * DEFINES + *********************/ +#define TJPGD_WORKBUFF_SIZE 4096 //Recommended by TJPGD libray + +//NEVER EDIT THESE OFFSET VALUES +#define SJPEG_VERSION_OFFSET 8 +#define SJPEG_X_RES_OFFSET 14 +#define SJPEG_y_RES_OFFSET 16 +#define SJPEG_TOTAL_FRAMES_OFFSET 18 +#define SJPEG_BLOCK_WIDTH_OFFSET 20 +#define SJPEG_FRAME_INFO_ARRAY_OFFSET 22 + +/********************** + * TYPEDEFS + **********************/ + +enum io_source_type { + SJPEG_IO_SOURCE_C_ARRAY, + SJPEG_IO_SOURCE_DISK, +}; + +typedef struct { + enum io_source_type type; + lv_fs_file_t lv_file; + uint8_t * img_cache_buff; + int img_cache_x_res; + int img_cache_y_res; + uint8_t * raw_sjpg_data; //Used when type==SJPEG_IO_SOURCE_C_ARRAY. + uint32_t raw_sjpg_data_size; //Num bytes pointed to by raw_sjpg_data. + uint32_t raw_sjpg_data_next_read_pos; //Used for all types. +} io_source_t; + + +typedef struct { + uint8_t * sjpeg_data; + uint32_t sjpeg_data_size; + int sjpeg_x_res; + int sjpeg_y_res; + int sjpeg_total_frames; + int sjpeg_single_frame_height; + int sjpeg_cache_frame_index; + uint8_t ** frame_base_array; //to save base address of each split frames upto sjpeg_total_frames. + int * frame_base_offset; //to save base offset for fseek + uint8_t * frame_cache; + uint8_t * workb; //JPG work buffer for jpeg library + JDEC * tjpeg_jd; + io_source_t io; +} SJPEG; + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_res_t decoder_info(lv_img_decoder_t * decoder, const void * src, lv_img_header_t * header); +static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc); +static lv_res_t decoder_read_line(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc, lv_coord_t x, lv_coord_t y, + lv_coord_t len, uint8_t * buf); +static void decoder_close(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc); +static size_t input_func(JDEC * jd, uint8_t * buff, size_t ndata); +static int is_jpg(const uint8_t * raw_data, size_t len); +static void lv_sjpg_cleanup(SJPEG * sjpeg); +static void lv_sjpg_free(SJPEG * sjpeg); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_split_jpeg_init(void) +{ + lv_img_decoder_t * dec = lv_img_decoder_create(); + lv_img_decoder_set_info_cb(dec, decoder_info); + lv_img_decoder_set_open_cb(dec, decoder_open); + lv_img_decoder_set_close_cb(dec, decoder_close); + lv_img_decoder_set_read_line_cb(dec, decoder_read_line); +} + +/********************** + * STATIC FUNCTIONS + **********************/ +/** + * Get info about an SJPG / JPG image + * @param decoder pointer to the decoder where this function belongs + * @param src can be file name or pointer to a C array + * @param header store the info here + * @return LV_RES_OK: no error; LV_RES_INV: can't get the info + */ +static lv_res_t decoder_info(lv_img_decoder_t * decoder, const void * src, lv_img_header_t * header) +{ + LV_UNUSED(decoder); + + /*Check whether the type `src` is known by the decoder*/ + /* Read the SJPG/JPG header and find `width` and `height` */ + + lv_img_src_t src_type = lv_img_src_get_type(src); /*Get the source type*/ + + lv_res_t ret = LV_RES_OK; + + if(src_type == LV_IMG_SRC_VARIABLE) { + const lv_img_dsc_t * img_dsc = src; + uint8_t * raw_sjpeg_data = (uint8_t *)img_dsc->data; + const uint32_t raw_sjpeg_data_size = img_dsc->data_size; + + if(!strncmp((char *)raw_sjpeg_data, "_SJPG__", strlen("_SJPG__"))) { + + raw_sjpeg_data += 14; //seek to res info ... refer sjpeg format + header->always_zero = 0; + header->cf = LV_IMG_CF_RAW; + + header->w = *raw_sjpeg_data++; + header->w |= *raw_sjpeg_data++ << 8; + + header->h = *raw_sjpeg_data++; + header->h |= *raw_sjpeg_data++ << 8; + + return ret; + + } + else if(is_jpg(raw_sjpeg_data, raw_sjpeg_data_size) == true) { + header->always_zero = 0; + header->cf = LV_IMG_CF_RAW; + + uint8_t * workb_temp = lv_mem_alloc(TJPGD_WORKBUFF_SIZE); + if(!workb_temp) return LV_RES_INV; + + io_source_t io_source_temp; + io_source_temp.type = SJPEG_IO_SOURCE_C_ARRAY; + io_source_temp.raw_sjpg_data = raw_sjpeg_data; + io_source_temp.raw_sjpg_data_size = raw_sjpeg_data_size; + io_source_temp.raw_sjpg_data_next_read_pos = 0; + + JDEC jd_tmp; + + JRESULT rc = jd_prepare(&jd_tmp, input_func, workb_temp, (size_t)TJPGD_WORKBUFF_SIZE, &io_source_temp); + if(rc == JDR_OK) { + header->w = jd_tmp.width; + header->h = jd_tmp.height; + + } + else { + ret = LV_RES_INV; + goto end; + } + +end: + lv_mem_free(workb_temp); + + return ret; + + } + } + else if(src_type == LV_IMG_SRC_FILE) { + const char * fn = src; + if(strcmp(lv_fs_get_ext(fn), "sjpg") == 0) { + + uint8_t buff[22]; + memset(buff, 0, sizeof(buff)); + + lv_fs_file_t file; + lv_fs_res_t res = lv_fs_open(&file, fn, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) return 78; + + uint32_t rn; + res = lv_fs_read(&file, buff, 8, &rn); + if(res != LV_FS_RES_OK || rn != 8) { + lv_fs_close(&file); + return LV_RES_INV; + } + + if(strcmp((char *)buff, "_SJPG__") == 0) { + lv_fs_seek(&file, 14, LV_FS_SEEK_SET); + res = lv_fs_read(&file, buff, 4, &rn); + if(res != LV_FS_RES_OK || rn != 4) { + lv_fs_close(&file); + return LV_RES_INV; + } + header->always_zero = 0; + header->cf = LV_IMG_CF_RAW; + uint8_t * raw_sjpeg_data = buff; + header->w = *raw_sjpeg_data++; + header->w |= *raw_sjpeg_data++ << 8; + header->h = *raw_sjpeg_data++; + header->h |= *raw_sjpeg_data++ << 8; + lv_fs_close(&file); + return LV_RES_OK; + + } + } + else if(strcmp(lv_fs_get_ext(fn), "jpg") == 0) { + lv_fs_file_t file; + lv_fs_res_t res = lv_fs_open(&file, fn, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) return 78; + + uint8_t * workb_temp = lv_mem_alloc(TJPGD_WORKBUFF_SIZE); + if(!workb_temp) { + lv_fs_close(&file); + return LV_RES_INV; + } + + io_source_t io_source_temp; + io_source_temp.type = SJPEG_IO_SOURCE_DISK; + io_source_temp.raw_sjpg_data_next_read_pos = 0; + io_source_temp.img_cache_buff = NULL; + io_source_temp.lv_file = file; + JDEC jd_tmp; + + JRESULT rc = jd_prepare(&jd_tmp, input_func, workb_temp, (size_t)TJPGD_WORKBUFF_SIZE, &io_source_temp); + lv_mem_free(workb_temp); + lv_fs_close(&file); + + if(rc == JDR_OK) { + header->always_zero = 0; + header->cf = LV_IMG_CF_RAW; + header->w = jd_tmp.width; + header->h = jd_tmp.height; + return LV_RES_OK; + } + } + } + return LV_RES_INV; +} + +static int img_data_cb(JDEC * jd, void * data, JRECT * rect) +{ + io_source_t * io = jd->device; + uint8_t * cache = io->img_cache_buff; + const int xres = io->img_cache_x_res; + uint8_t * buf = data; + const int INPUT_PIXEL_SIZE = 3; + const int row_width = rect->right - rect->left + 1; // Row width in pixels. + const int row_size = row_width * INPUT_PIXEL_SIZE; // Row size (bytes). + + for(int y = rect->top; y <= rect->bottom; y++) { + int row_offset = y * xres * INPUT_PIXEL_SIZE + rect->left * INPUT_PIXEL_SIZE; + memcpy(cache + row_offset, buf, row_size); + buf += row_size; + } + + return 1; +} + +static size_t input_func(JDEC * jd, uint8_t * buff, size_t ndata) +{ + io_source_t * io = jd->device; + + if(!io) return 0; + + if(io->type == SJPEG_IO_SOURCE_C_ARRAY) { + const uint32_t bytes_left = io->raw_sjpg_data_size - io->raw_sjpg_data_next_read_pos; + const uint32_t to_read = ndata <= bytes_left ? (uint32_t)ndata : bytes_left; + if(to_read == 0) + return 0; + if(buff) { + memcpy(buff, io->raw_sjpg_data + io->raw_sjpg_data_next_read_pos, to_read); + } + io->raw_sjpg_data_next_read_pos += to_read; + return to_read; + } + else if(io->type == SJPEG_IO_SOURCE_DISK) { + + lv_fs_file_t * lv_file_p = &(io->lv_file); + + if(buff) { + uint32_t rn = 0; + lv_fs_read(lv_file_p, buff, (uint32_t)ndata, &rn); + return rn; + } + else { + uint32_t pos; + lv_fs_tell(lv_file_p, &pos); + lv_fs_seek(lv_file_p, (uint32_t)(ndata + pos), LV_FS_SEEK_SET); + return ndata; + } + } + return 0; +} + +/** + * Open SJPG image and return the decided image + * @param decoder pointer to the decoder where this function belongs + * @param dsc pointer to a descriptor which describes this decoding session + * @return LV_RES_OK: no error; LV_RES_INV: can't get the info + */ +static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + lv_res_t lv_ret = LV_RES_OK; + + if(dsc->src_type == LV_IMG_SRC_VARIABLE) { + uint8_t * data; + SJPEG * sjpeg = (SJPEG *) dsc->user_data; + const uint32_t raw_sjpeg_data_size = ((lv_img_dsc_t *)dsc->src)->data_size; + if(sjpeg == NULL) { + sjpeg = lv_mem_alloc(sizeof(SJPEG)); + if(!sjpeg) return LV_RES_INV; + + memset(sjpeg, 0, sizeof(SJPEG)); + + dsc->user_data = sjpeg; + sjpeg->sjpeg_data = (uint8_t *)((lv_img_dsc_t *)(dsc->src))->data; + sjpeg->sjpeg_data_size = ((lv_img_dsc_t *)(dsc->src))->data_size; + } + + if(!strncmp((char *) sjpeg->sjpeg_data, "_SJPG__", strlen("_SJPG__"))) { + + data = sjpeg->sjpeg_data; + data += 14; + + sjpeg->sjpeg_x_res = *data++; + sjpeg->sjpeg_x_res |= *data++ << 8; + + sjpeg->sjpeg_y_res = *data++; + sjpeg->sjpeg_y_res |= *data++ << 8; + + sjpeg->sjpeg_total_frames = *data++; + sjpeg->sjpeg_total_frames |= *data++ << 8; + + sjpeg->sjpeg_single_frame_height = *data++; + sjpeg->sjpeg_single_frame_height |= *data++ << 8; + + sjpeg->frame_base_array = lv_mem_alloc(sizeof(uint8_t *) * sjpeg->sjpeg_total_frames); + if(! sjpeg->frame_base_array) { + lv_sjpg_cleanup(sjpeg); + sjpeg = NULL; + return LV_RES_INV; + } + + sjpeg->frame_base_offset = NULL; + + uint8_t * img_frame_base = data + sjpeg->sjpeg_total_frames * 2; + sjpeg->frame_base_array[0] = img_frame_base; + + for(int i = 1; i < sjpeg->sjpeg_total_frames; i++) { + int offset = *data++; + offset |= *data++ << 8; + sjpeg->frame_base_array[i] = sjpeg->frame_base_array[i - 1] + offset; + } + sjpeg->sjpeg_cache_frame_index = -1; + sjpeg->frame_cache = (void *)lv_mem_alloc(sjpeg->sjpeg_x_res * sjpeg->sjpeg_single_frame_height * 3/*2*/); + if(! sjpeg->frame_cache) { + lv_sjpg_cleanup(sjpeg); + sjpeg = NULL; + return LV_RES_INV; + } + sjpeg->io.img_cache_buff = sjpeg->frame_cache; + sjpeg->io.img_cache_x_res = sjpeg->sjpeg_x_res; + sjpeg->workb = lv_mem_alloc(TJPGD_WORKBUFF_SIZE); + if(! sjpeg->workb) { + lv_sjpg_cleanup(sjpeg); + sjpeg = NULL; + return LV_RES_INV; + } + + sjpeg->tjpeg_jd = lv_mem_alloc(sizeof(JDEC)); + if(! sjpeg->tjpeg_jd) { + lv_sjpg_cleanup(sjpeg); + sjpeg = NULL; + return LV_RES_INV; + } + sjpeg->io.type = SJPEG_IO_SOURCE_C_ARRAY; + sjpeg->io.lv_file.file_d = NULL; + dsc->img_data = NULL; + return lv_ret; + } + else if(is_jpg(sjpeg->sjpeg_data, raw_sjpeg_data_size) == true) { + + uint8_t * workb_temp = lv_mem_alloc(TJPGD_WORKBUFF_SIZE); + if(! workb_temp) { + lv_sjpg_cleanup(sjpeg); + sjpeg = NULL; + return LV_RES_INV; + } + io_source_t io_source_temp; + io_source_temp.type = SJPEG_IO_SOURCE_C_ARRAY; + io_source_temp.raw_sjpg_data = sjpeg->sjpeg_data; + io_source_temp.raw_sjpg_data_size = sjpeg->sjpeg_data_size; + io_source_temp.raw_sjpg_data_next_read_pos = 0; + + JDEC jd_tmp; + JRESULT rc = jd_prepare(&jd_tmp, input_func, workb_temp, (size_t)TJPGD_WORKBUFF_SIZE, &io_source_temp); + lv_mem_free(workb_temp); + + + if(rc == JDR_OK) { + sjpeg->sjpeg_x_res = jd_tmp.width; + sjpeg->sjpeg_y_res = jd_tmp.height; + sjpeg->sjpeg_total_frames = 1; + sjpeg->sjpeg_single_frame_height = jd_tmp.height; + + sjpeg->frame_base_array = lv_mem_alloc(sizeof(uint8_t *) * sjpeg->sjpeg_total_frames); + if(! sjpeg->frame_base_array) { + lv_sjpg_cleanup(sjpeg); + sjpeg = NULL; + return LV_RES_INV; + } + sjpeg->frame_base_offset = NULL; + + uint8_t * img_frame_base = sjpeg->sjpeg_data; + sjpeg->frame_base_array[0] = img_frame_base; + + sjpeg->sjpeg_cache_frame_index = -1; + sjpeg->frame_cache = (void *)lv_mem_alloc(sjpeg->sjpeg_x_res * sjpeg->sjpeg_single_frame_height * 3); + if(! sjpeg->frame_cache) { + lv_sjpg_cleanup(sjpeg); + sjpeg = NULL; + return LV_RES_INV; + } + + sjpeg->io.img_cache_buff = sjpeg->frame_cache; + sjpeg->io.img_cache_x_res = sjpeg->sjpeg_x_res; + sjpeg->workb = lv_mem_alloc(TJPGD_WORKBUFF_SIZE); + if(! sjpeg->workb) { + lv_sjpg_cleanup(sjpeg); + sjpeg = NULL; + return LV_RES_INV; + } + + sjpeg->tjpeg_jd = lv_mem_alloc(sizeof(JDEC)); + if(! sjpeg->tjpeg_jd) { + lv_sjpg_cleanup(sjpeg); + sjpeg = NULL; + return LV_RES_INV; + } + + sjpeg->io.type = SJPEG_IO_SOURCE_C_ARRAY; + sjpeg->io.lv_file.file_d = NULL; + dsc->img_data = NULL; + return lv_ret; + } + else { + lv_ret = LV_RES_INV; + goto end; + } + +end: + lv_mem_free(workb_temp); + + return lv_ret; + } + } + else if(dsc->src_type == LV_IMG_SRC_FILE) { + /* If all fine, then the file will be kept open */ + const char * fn = dsc->src; + uint8_t * data; + + if(strcmp(lv_fs_get_ext(fn), "sjpg") == 0) { + + uint8_t buff[22]; + memset(buff, 0, sizeof(buff)); + + + lv_fs_file_t lv_file; + lv_fs_res_t res = lv_fs_open(&lv_file, fn, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) { + return 78; + } + + + uint32_t rn; + res = lv_fs_read(&lv_file, buff, 22, &rn); + if(res != LV_FS_RES_OK || rn != 22) { + lv_fs_close(&lv_file); + return LV_RES_INV; + } + + if(strcmp((char *)buff, "_SJPG__") == 0) { + + SJPEG * sjpeg = (SJPEG *) dsc->user_data; + if(sjpeg == NULL) { + sjpeg = lv_mem_alloc(sizeof(SJPEG)); + + if(! sjpeg) { + lv_fs_close(&lv_file); + return LV_RES_INV; + } + memset(sjpeg, 0, sizeof(SJPEG)); + + dsc->user_data = sjpeg; + sjpeg->sjpeg_data = (uint8_t *)((lv_img_dsc_t *)(dsc->src))->data; + sjpeg->sjpeg_data_size = ((lv_img_dsc_t *)(dsc->src))->data_size; + } + data = buff; + data += 14; + + sjpeg->sjpeg_x_res = *data++; + sjpeg->sjpeg_x_res |= *data++ << 8; + + sjpeg->sjpeg_y_res = *data++; + sjpeg->sjpeg_y_res |= *data++ << 8; + + sjpeg->sjpeg_total_frames = *data++; + sjpeg->sjpeg_total_frames |= *data++ << 8; + + sjpeg->sjpeg_single_frame_height = *data++; + sjpeg->sjpeg_single_frame_height |= *data++ << 8; + + sjpeg->frame_base_array = NULL;//lv_mem_alloc( sizeof(uint8_t *) * sjpeg->sjpeg_total_frames ); + sjpeg->frame_base_offset = lv_mem_alloc(sizeof(int) * sjpeg->sjpeg_total_frames); + if(! sjpeg->frame_base_offset) { + lv_fs_close(&lv_file); + lv_sjpg_cleanup(sjpeg); + return LV_RES_INV; + } + int img_frame_start_offset = (SJPEG_FRAME_INFO_ARRAY_OFFSET + sjpeg->sjpeg_total_frames * 2); + sjpeg->frame_base_offset[0] = img_frame_start_offset; //pointer used to save integer for now... + + for(int i = 1; i < sjpeg->sjpeg_total_frames; i++) { + res = lv_fs_read(&lv_file, buff, 2, &rn); + if(res != LV_FS_RES_OK || rn != 2) { + lv_fs_close(&lv_file); + return LV_RES_INV; + } + + data = buff; + int offset = *data++; + offset |= *data++ << 8; + sjpeg->frame_base_offset[i] = sjpeg->frame_base_offset[i - 1] + offset; + } + + sjpeg->sjpeg_cache_frame_index = -1; //INVALID AT BEGINNING for a forced compare mismatch at first time. + sjpeg->frame_cache = (void *)lv_mem_alloc(sjpeg->sjpeg_x_res * sjpeg->sjpeg_single_frame_height * 3); + if(! sjpeg->frame_cache) { + lv_fs_close(&lv_file); + lv_sjpg_cleanup(sjpeg); + return LV_RES_INV; + } + sjpeg->io.img_cache_buff = sjpeg->frame_cache; + sjpeg->io.img_cache_x_res = sjpeg->sjpeg_x_res; + sjpeg->workb = lv_mem_alloc(TJPGD_WORKBUFF_SIZE); + if(! sjpeg->workb) { + lv_fs_close(&lv_file); + lv_sjpg_cleanup(sjpeg); + return LV_RES_INV; + } + + sjpeg->tjpeg_jd = lv_mem_alloc(sizeof(JDEC)); + if(! sjpeg->tjpeg_jd) { + lv_fs_close(&lv_file); + lv_sjpg_cleanup(sjpeg); + return LV_RES_INV; + } + + sjpeg->io.type = SJPEG_IO_SOURCE_DISK; + sjpeg->io.lv_file = lv_file; + dsc->img_data = NULL; + return LV_RES_OK; + } + } + else if(strcmp(lv_fs_get_ext(fn), "jpg") == 0) { + + lv_fs_file_t lv_file; + lv_fs_res_t res = lv_fs_open(&lv_file, fn, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) { + return LV_RES_INV; + } + + SJPEG * sjpeg = (SJPEG *) dsc->user_data; + if(sjpeg == NULL) { + sjpeg = lv_mem_alloc(sizeof(SJPEG)); + if(! sjpeg) { + lv_fs_close(&lv_file); + return LV_RES_INV; + } + + memset(sjpeg, 0, sizeof(SJPEG)); + dsc->user_data = sjpeg; + sjpeg->sjpeg_data = (uint8_t *)((lv_img_dsc_t *)(dsc->src))->data; + sjpeg->sjpeg_data_size = ((lv_img_dsc_t *)(dsc->src))->data_size; + } + + uint8_t * workb_temp = lv_mem_alloc(TJPGD_WORKBUFF_SIZE); + if(! workb_temp) { + lv_fs_close(&lv_file); + lv_sjpg_cleanup(sjpeg); + return LV_RES_INV; + } + + io_source_t io_source_temp; + io_source_temp.type = SJPEG_IO_SOURCE_DISK; + io_source_temp.raw_sjpg_data_next_read_pos = 0; + io_source_temp.img_cache_buff = NULL; + io_source_temp.lv_file = lv_file; + + JDEC jd_tmp; + + JRESULT rc = jd_prepare(&jd_tmp, input_func, workb_temp, (size_t)TJPGD_WORKBUFF_SIZE, &io_source_temp); + + lv_mem_free(workb_temp); + + + if(rc == JDR_OK) { + sjpeg->sjpeg_x_res = jd_tmp.width; + sjpeg->sjpeg_y_res = jd_tmp.height; + sjpeg->sjpeg_total_frames = 1; + sjpeg->sjpeg_single_frame_height = jd_tmp.height; + + sjpeg->frame_base_array = NULL; + sjpeg->frame_base_offset = lv_mem_alloc(sizeof(uint8_t *) * sjpeg->sjpeg_total_frames); + if(! sjpeg->frame_base_offset) { + lv_fs_close(&lv_file); + lv_sjpg_cleanup(sjpeg); + return LV_RES_INV; + } + + int img_frame_start_offset = 0; + sjpeg->frame_base_offset[0] = img_frame_start_offset; + + sjpeg->sjpeg_cache_frame_index = -1; + sjpeg->frame_cache = (void *)lv_mem_alloc(sjpeg->sjpeg_x_res * sjpeg->sjpeg_single_frame_height * 3); + if(! sjpeg->frame_cache) { + lv_fs_close(&lv_file); + lv_sjpg_cleanup(sjpeg); + return LV_RES_INV; + } + + sjpeg->io.img_cache_buff = sjpeg->frame_cache; + sjpeg->io.img_cache_x_res = sjpeg->sjpeg_x_res; + sjpeg->workb = lv_mem_alloc(TJPGD_WORKBUFF_SIZE); + if(! sjpeg->workb) { + lv_fs_close(&lv_file); + lv_sjpg_cleanup(sjpeg); + return LV_RES_INV; + } + + sjpeg->tjpeg_jd = lv_mem_alloc(sizeof(JDEC)); + if(! sjpeg->tjpeg_jd) { + lv_fs_close(&lv_file); + lv_sjpg_cleanup(sjpeg); + return LV_RES_INV; + } + + sjpeg->io.type = SJPEG_IO_SOURCE_DISK; + sjpeg->io.lv_file = lv_file; + dsc->img_data = NULL; + return LV_RES_OK; + + } + else { + if(dsc->user_data) lv_mem_free(dsc->user_data); + lv_fs_close(&lv_file); + return LV_RES_INV; + } + } + } + + return LV_RES_INV; +} + +/** + * Decode `len` pixels starting from the given `x`, `y` coordinates and store them in `buf`. + * Required only if the "open" function can't open the whole decoded pixel array. (dsc->img_data == NULL) + * @param decoder pointer to the decoder the function associated with + * @param dsc pointer to decoder descriptor + * @param x start x coordinate + * @param y start y coordinate + * @param len number of pixels to decode + * @param buf a buffer to store the decoded pixels + * @return LV_RES_OK: ok; LV_RES_INV: failed + */ + +static lv_res_t decoder_read_line(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc, lv_coord_t x, lv_coord_t y, + lv_coord_t len, uint8_t * buf) +{ + LV_UNUSED(decoder); + if(dsc->src_type == LV_IMG_SRC_VARIABLE) { + SJPEG * sjpeg = (SJPEG *) dsc->user_data; + JRESULT rc; + + int sjpeg_req_frame_index = y / sjpeg->sjpeg_single_frame_height; + + /*If line not from cache, refresh cache */ + if(sjpeg_req_frame_index != sjpeg->sjpeg_cache_frame_index) { + sjpeg->io.raw_sjpg_data = sjpeg->frame_base_array[ sjpeg_req_frame_index ]; + if(sjpeg_req_frame_index == (sjpeg->sjpeg_total_frames - 1)) { + /*This is the last frame. */ + const uint32_t frame_offset = (uint32_t)(sjpeg->io.raw_sjpg_data - sjpeg->sjpeg_data); + sjpeg->io.raw_sjpg_data_size = sjpeg->sjpeg_data_size - frame_offset; + } + else { + sjpeg->io.raw_sjpg_data_size = + (uint32_t)(sjpeg->frame_base_array[sjpeg_req_frame_index + 1] - sjpeg->io.raw_sjpg_data); + } + sjpeg->io.raw_sjpg_data_next_read_pos = 0; + rc = jd_prepare(sjpeg->tjpeg_jd, input_func, sjpeg->workb, (size_t)TJPGD_WORKBUFF_SIZE, &(sjpeg->io)); + if(rc != JDR_OK) return LV_RES_INV; + rc = jd_decomp(sjpeg->tjpeg_jd, img_data_cb, 0); + if(rc != JDR_OK) return LV_RES_INV; + sjpeg->sjpeg_cache_frame_index = sjpeg_req_frame_index; + } + + int offset = 0; + uint8_t * cache = (uint8_t *)sjpeg->frame_cache + x * 3 + (y % sjpeg->sjpeg_single_frame_height) * sjpeg->sjpeg_x_res * + 3; + +#if LV_COLOR_DEPTH == 32 + for(int i = 0; i < len; i++) { + buf[offset + 3] = 0xff; + buf[offset + 2] = *cache++; + buf[offset + 1] = *cache++; + buf[offset + 0] = *cache++; + offset += 4; + } + +#elif LV_COLOR_DEPTH == 16 + + for(int i = 0; i < len; i++) { + uint16_t col_16bit = (*cache++ & 0xf8) << 8; + col_16bit |= (*cache++ & 0xFC) << 3; + col_16bit |= (*cache++ >> 3); +#if LV_BIG_ENDIAN_SYSTEM == 1 || LV_COLOR_16_SWAP == 1 + buf[offset++] = col_16bit >> 8; + buf[offset++] = col_16bit & 0xff; +#else + buf[offset++] = col_16bit & 0xff; + buf[offset++] = col_16bit >> 8; +#endif // LV_BIG_ENDIAN_SYSTEM + } + +#elif LV_COLOR_DEPTH == 8 + + for(int i = 0; i < len; i++) { + uint8_t col_8bit = (*cache++ & 0xC0); + col_8bit |= (*cache++ & 0xe0) >> 2; + col_8bit |= (*cache++ & 0xe0) >> 5; + buf[offset++] = col_8bit; + } +#else +#error Unsupported LV_COLOR_DEPTH + + +#endif // LV_COLOR_DEPTH + return LV_RES_OK; + } + else if(dsc->src_type == LV_IMG_SRC_FILE) { + SJPEG * sjpeg = (SJPEG *) dsc->user_data; + JRESULT rc; + int sjpeg_req_frame_index = y / sjpeg->sjpeg_single_frame_height; + + lv_fs_file_t * lv_file_p = &(sjpeg->io.lv_file); + if(!lv_file_p) goto end; + + /*If line not from cache, refresh cache */ + if(sjpeg_req_frame_index != sjpeg->sjpeg_cache_frame_index) { + sjpeg->io.raw_sjpg_data_next_read_pos = (int)(sjpeg->frame_base_offset [ sjpeg_req_frame_index ]); + lv_fs_seek(&(sjpeg->io.lv_file), sjpeg->io.raw_sjpg_data_next_read_pos, LV_FS_SEEK_SET); + + rc = jd_prepare(sjpeg->tjpeg_jd, input_func, sjpeg->workb, (size_t)TJPGD_WORKBUFF_SIZE, &(sjpeg->io)); + if(rc != JDR_OK) return LV_RES_INV; + + rc = jd_decomp(sjpeg->tjpeg_jd, img_data_cb, 0); + if(rc != JDR_OK) return LV_RES_INV; + + sjpeg->sjpeg_cache_frame_index = sjpeg_req_frame_index; + } + + int offset = 0; + uint8_t * cache = (uint8_t *)sjpeg->frame_cache + x * 3 + (y % sjpeg->sjpeg_single_frame_height) * sjpeg->sjpeg_x_res * + 3; + +#if LV_COLOR_DEPTH == 32 + for(int i = 0; i < len; i++) { + buf[offset + 3] = 0xff; + buf[offset + 2] = *cache++; + buf[offset + 1] = *cache++; + buf[offset + 0] = *cache++; + offset += 4; + } +#elif LV_COLOR_DEPTH == 16 + + for(int i = 0; i < len; i++) { + uint16_t col_8bit = (*cache++ & 0xf8) << 8; + col_8bit |= (*cache++ & 0xFC) << 3; + col_8bit |= (*cache++ >> 3); +#if LV_BIG_ENDIAN_SYSTEM == 1 || LV_COLOR_16_SWAP == 1 + buf[offset++] = col_8bit >> 8; + buf[offset++] = col_8bit & 0xff; +#else + buf[offset++] = col_8bit & 0xff; + buf[offset++] = col_8bit >> 8; +#endif // LV_BIG_ENDIAN_SYSTEM + } + +#elif LV_COLOR_DEPTH == 8 + + for(int i = 0; i < len; i++) { + uint8_t col_8bit = (*cache++ & 0xC0); + col_8bit |= (*cache++ & 0xe0) >> 2; + col_8bit |= (*cache++ & 0xe0) >> 5; + buf[offset++] = col_8bit; + } + +#else +#error Unsupported LV_COLOR_DEPTH + + +#endif // LV_COLOR_DEPTH + + return LV_RES_OK; + } +end: + return LV_RES_INV; +} + +/** + * Free the allocated resources + * @param decoder pointer to the decoder where this function belongs + * @param dsc pointer to a descriptor which describes this decoding session + */ +static void decoder_close(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + /*Free all allocated data*/ + SJPEG * sjpeg = (SJPEG *) dsc->user_data; + if(!sjpeg) return; + + switch(dsc->src_type) { + case LV_IMG_SRC_FILE: + if(sjpeg->io.lv_file.file_d) { + lv_fs_close(&(sjpeg->io.lv_file)); + } + lv_sjpg_cleanup(sjpeg); + break; + + case LV_IMG_SRC_VARIABLE: + lv_sjpg_cleanup(sjpeg); + break; + + default: + ; + } +} + +static int is_jpg(const uint8_t * raw_data, size_t len) +{ + const uint8_t jpg_signature[] = {0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46}; + if(len < sizeof(jpg_signature)) return false; + return memcmp(jpg_signature, raw_data, sizeof(jpg_signature)) == 0; +} + +static void lv_sjpg_free(SJPEG * sjpeg) +{ + if(sjpeg->frame_cache) lv_mem_free(sjpeg->frame_cache); + if(sjpeg->frame_base_array) lv_mem_free(sjpeg->frame_base_array); + if(sjpeg->frame_base_offset) lv_mem_free(sjpeg->frame_base_offset); + if(sjpeg->tjpeg_jd) lv_mem_free(sjpeg->tjpeg_jd); + if(sjpeg->workb) lv_mem_free(sjpeg->workb); +} + +static void lv_sjpg_cleanup(SJPEG * sjpeg) +{ + if(! sjpeg) return; + + lv_sjpg_free(sjpeg); + lv_mem_free(sjpeg); +} + +#endif /*LV_USE_SJPG*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/sjpg/lv_sjpg.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/sjpg/lv_sjpg.h new file mode 100644 index 0000000..d06e80d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/sjpg/lv_sjpg.h @@ -0,0 +1,43 @@ +/** + * @file lv_sjpg.h + * + */ + +#ifndef LV_SJPEG_H +#define LV_SJPEG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#if LV_USE_SJPG + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_split_jpeg_init(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SJPG*/ + +#ifdef __cplusplus +} +#endif + +#endif /* LV_SJPEG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/sjpg/tjpgd.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/sjpg/tjpgd.c new file mode 100644 index 0000000..47ddefb --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/sjpg/tjpgd.c @@ -0,0 +1,1155 @@ +/*----------------------------------------------------------------------------/ +/ TJpgDec - Tiny JPEG Decompressor R0.03 (C)ChaN, 2021 +/-----------------------------------------------------------------------------/ +/ The TJpgDec is a generic JPEG decompressor module for tiny embedded systems. +/ This is a free software that opened for education, research and commercial +/ developments under license policy of following terms. +/ +/ Copyright (C) 2021, ChaN, all right reserved. +/ +/ * The TJpgDec module is a free software and there is NO WARRANTY. +/ * No restriction on use. You can use, modify and redistribute it for +/ personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. +/ * Redistributions of source code must retain the above copyright notice. +/ +/-----------------------------------------------------------------------------/ +/ Oct 04, 2011 R0.01 First release. +/ Feb 19, 2012 R0.01a Fixed decompression fails when scan starts with an escape seq. +/ Sep 03, 2012 R0.01b Added JD_TBLCLIP option. +/ Mar 16, 2019 R0.01c Supprted stdint.h. +/ Jul 01, 2020 R0.01d Fixed wrong integer type usage. +/ May 08, 2021 R0.02 Supprted grayscale image. Separated configuration options. +/ Jun 11, 2021 R0.02a Some performance improvement. +/ Jul 01, 2021 R0.03 Added JD_FASTDECODE option. +/ Some performance improvement. +/----------------------------------------------------------------------------*/ + +#include "tjpgd.h" +#if LV_USE_SJPG + +#if JD_FASTDECODE == 2 +#define HUFF_BIT 10 /* Bit length to apply fast huffman decode */ +#define HUFF_LEN (1 << HUFF_BIT) +#define HUFF_MASK (HUFF_LEN - 1) +#endif + + +/*-----------------------------------------------*/ +/* Zigzag-order to raster-order conversion table */ +/*-----------------------------------------------*/ + +static const uint8_t Zig[64] = { /* Zigzag-order to raster-order conversion table */ + 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63 +}; + + + +/*-------------------------------------------------*/ +/* Input scale factor of Arai algorithm */ +/* (scaled up 16 bits for fixed point operations) */ +/*-------------------------------------------------*/ + +static const uint16_t Ipsf[64] = { /* See also aa_idct.png */ + (uint16_t)(1.00000*8192), (uint16_t)(1.38704*8192), (uint16_t)(1.30656*8192), (uint16_t)(1.17588*8192), (uint16_t)(1.00000*8192), (uint16_t)(0.78570*8192), (uint16_t)(0.54120*8192), (uint16_t)(0.27590*8192), + (uint16_t)(1.38704*8192), (uint16_t)(1.92388*8192), (uint16_t)(1.81226*8192), (uint16_t)(1.63099*8192), (uint16_t)(1.38704*8192), (uint16_t)(1.08979*8192), (uint16_t)(0.75066*8192), (uint16_t)(0.38268*8192), + (uint16_t)(1.30656*8192), (uint16_t)(1.81226*8192), (uint16_t)(1.70711*8192), (uint16_t)(1.53636*8192), (uint16_t)(1.30656*8192), (uint16_t)(1.02656*8192), (uint16_t)(0.70711*8192), (uint16_t)(0.36048*8192), + (uint16_t)(1.17588*8192), (uint16_t)(1.63099*8192), (uint16_t)(1.53636*8192), (uint16_t)(1.38268*8192), (uint16_t)(1.17588*8192), (uint16_t)(0.92388*8192), (uint16_t)(0.63638*8192), (uint16_t)(0.32442*8192), + (uint16_t)(1.00000*8192), (uint16_t)(1.38704*8192), (uint16_t)(1.30656*8192), (uint16_t)(1.17588*8192), (uint16_t)(1.00000*8192), (uint16_t)(0.78570*8192), (uint16_t)(0.54120*8192), (uint16_t)(0.27590*8192), + (uint16_t)(0.78570*8192), (uint16_t)(1.08979*8192), (uint16_t)(1.02656*8192), (uint16_t)(0.92388*8192), (uint16_t)(0.78570*8192), (uint16_t)(0.61732*8192), (uint16_t)(0.42522*8192), (uint16_t)(0.21677*8192), + (uint16_t)(0.54120*8192), (uint16_t)(0.75066*8192), (uint16_t)(0.70711*8192), (uint16_t)(0.63638*8192), (uint16_t)(0.54120*8192), (uint16_t)(0.42522*8192), (uint16_t)(0.29290*8192), (uint16_t)(0.14932*8192), + (uint16_t)(0.27590*8192), (uint16_t)(0.38268*8192), (uint16_t)(0.36048*8192), (uint16_t)(0.32442*8192), (uint16_t)(0.27590*8192), (uint16_t)(0.21678*8192), (uint16_t)(0.14932*8192), (uint16_t)(0.07612*8192) +}; + + + +/*---------------------------------------------*/ +/* Conversion table for fast clipping process */ +/*---------------------------------------------*/ + +#if JD_TBLCLIP + +#define BYTECLIP(v) Clip8[(unsigned int)(v) & 0x3FF] + +static const uint8_t Clip8[1024] = { + /* 0..255 */ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + /* 256..511 */ + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + /* -512..-257 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* -256..-1 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +#else /* JD_TBLCLIP */ + +static uint8_t BYTECLIP (int val) +{ + if (val < 0) return 0; + if (val > 255) return 255; + return (uint8_t)val; +} + +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Allocate a memory block from memory pool */ +/*-----------------------------------------------------------------------*/ + +static void* alloc_pool ( /* Pointer to allocated memory block (NULL:no memory available) */ + JDEC* jd, /* Pointer to the decompressor object */ + size_t ndata /* Number of bytes to allocate */ +) +{ + char *rp = 0; + + + ndata = (ndata + 3) & ~3; /* Align block size to the word boundary */ + + if (jd->sz_pool >= ndata) { + jd->sz_pool -= ndata; + rp = (char*)jd->pool; /* Get start of available memory pool */ + jd->pool = (void*)(rp + ndata); /* Allocate requierd bytes */ + } + + return (void*)rp; /* Return allocated memory block (NULL:no memory to allocate) */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Create de-quantization and prescaling tables with a DQT segment */ +/*-----------------------------------------------------------------------*/ + +static JRESULT create_qt_tbl ( /* 0:OK, !0:Failed */ + JDEC* jd, /* Pointer to the decompressor object */ + const uint8_t* data, /* Pointer to the quantizer tables */ + size_t ndata /* Size of input data */ +) +{ + unsigned int i, zi; + uint8_t d; + int32_t *pb; + + + while (ndata) { /* Process all tables in the segment */ + if (ndata < 65) return JDR_FMT1; /* Err: table size is unaligned */ + ndata -= 65; + d = *data++; /* Get table property */ + if (d & 0xF0) return JDR_FMT1; /* Err: not 8-bit resolution */ + i = d & 3; /* Get table ID */ + pb = alloc_pool(jd, 64 * sizeof (int32_t));/* Allocate a memory block for the table */ + if (!pb) return JDR_MEM1; /* Err: not enough memory */ + jd->qttbl[i] = pb; /* Register the table */ + for (i = 0; i < 64; i++) { /* Load the table */ + zi = Zig[i]; /* Zigzag-order to raster-order conversion */ + pb[zi] = (int32_t)((uint32_t)*data++ * Ipsf[zi]); /* Apply scale factor of Arai algorithm to the de-quantizers */ + } + } + + return JDR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Create huffman code tables with a DHT segment */ +/*-----------------------------------------------------------------------*/ + +static JRESULT create_huffman_tbl ( /* 0:OK, !0:Failed */ + JDEC* jd, /* Pointer to the decompressor object */ + const uint8_t* data, /* Pointer to the packed huffman tables */ + size_t ndata /* Size of input data */ +) +{ + unsigned int i, j, b, cls, num; + size_t np; + uint8_t d, *pb, *pd; + uint16_t hc, *ph; + + + while (ndata) { /* Process all tables in the segment */ + if (ndata < 17) return JDR_FMT1; /* Err: wrong data size */ + ndata -= 17; + d = *data++; /* Get table number and class */ + if (d & 0xEE) return JDR_FMT1; /* Err: invalid class/number */ + cls = d >> 4; num = d & 0x0F; /* class = dc(0)/ac(1), table number = 0/1 */ + pb = alloc_pool(jd, 16); /* Allocate a memory block for the bit distribution table */ + if (!pb) return JDR_MEM1; /* Err: not enough memory */ + jd->huffbits[num][cls] = pb; + for (np = i = 0; i < 16; i++) { /* Load number of patterns for 1 to 16-bit code */ + np += (pb[i] = *data++); /* Get sum of code words for each code */ + } + ph = alloc_pool(jd, np * sizeof (uint16_t));/* Allocate a memory block for the code word table */ + if (!ph) return JDR_MEM1; /* Err: not enough memory */ + jd->huffcode[num][cls] = ph; + hc = 0; + for (j = i = 0; i < 16; i++) { /* Re-build huffman code word table */ + b = pb[i]; + while (b--) ph[j++] = hc++; + hc <<= 1; + } + + if (ndata < np) return JDR_FMT1; /* Err: wrong data size */ + ndata -= np; + pd = alloc_pool(jd, np); /* Allocate a memory block for the decoded data */ + if (!pd) return JDR_MEM1; /* Err: not enough memory */ + jd->huffdata[num][cls] = pd; + for (i = 0; i < np; i++) { /* Load decoded data corresponds to each code word */ + d = *data++; + if (!cls && d > 11) return JDR_FMT1; + pd[i] = d; + } +#if JD_FASTDECODE == 2 + { /* Create fast huffman decode table */ + unsigned int span, td, ti; + uint16_t *tbl_ac = 0; + uint8_t *tbl_dc = 0; + + if (cls) { + tbl_ac = alloc_pool(jd, HUFF_LEN * sizeof (uint16_t)); /* LUT for AC elements */ + if (!tbl_ac) return JDR_MEM1; /* Err: not enough memory */ + jd->hufflut_ac[num] = tbl_ac; + memset(tbl_ac, 0xFF, HUFF_LEN * sizeof (uint16_t)); /* Default value (0xFFFF: may be long code) */ + } else { + tbl_dc = alloc_pool(jd, HUFF_LEN * sizeof (uint8_t)); /* LUT for AC elements */ + if (!tbl_dc) return JDR_MEM1; /* Err: not enough memory */ + jd->hufflut_dc[num] = tbl_dc; + memset(tbl_dc, 0xFF, HUFF_LEN * sizeof (uint8_t)); /* Default value (0xFF: may be long code) */ + } + for (i = b = 0; b < HUFF_BIT; b++) { /* Create LUT */ + for (j = pb[b]; j; j--) { + ti = ph[i] << (HUFF_BIT - 1 - b) & HUFF_MASK; /* Index of input pattern for the code */ + if (cls) { + td = pd[i++] | ((b + 1) << 8); /* b15..b8: code length, b7..b0: zero run and data length */ + for (span = 1 << (HUFF_BIT - 1 - b); span; span--, tbl_ac[ti++] = (uint16_t)td) ; + } else { + td = pd[i++] | ((b + 1) << 4); /* b7..b4: code length, b3..b0: data length */ + for (span = 1 << (HUFF_BIT - 1 - b); span; span--, tbl_dc[ti++] = (uint8_t)td) ; + } + } + } + jd->longofs[num][cls] = i; /* Code table offset for long code */ + } +#endif + } + + return JDR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Extract a huffman decoded data from input stream */ +/*-----------------------------------------------------------------------*/ + +static int huffext ( /* >=0: decoded data, <0: error code */ + JDEC* jd, /* Pointer to the decompressor object */ + unsigned int id, /* Table ID (0:Y, 1:C) */ + unsigned int cls /* Table class (0:DC, 1:AC) */ +) +{ + size_t dc = jd->dctr; + uint8_t *dp = jd->dptr; + unsigned int d, flg = 0; + +#if JD_FASTDECODE == 0 + uint8_t bm, nd, bl; + const uint8_t *hb = jd->huffbits[id][cls]; /* Bit distribution table */ + const uint16_t *hc = jd->huffcode[id][cls]; /* Code word table */ + const uint8_t *hd = jd->huffdata[id][cls]; /* Data table */ + + + bm = jd->dbit; /* Bit mask to extract */ + d = 0; bl = 16; /* Max code length */ + do { + if (!bm) { /* Next byte? */ + if (!dc) { /* No input data is available, re-fill input buffer */ + dp = jd->inbuf; /* Top of input buffer */ + dc = jd->infunc(jd, dp, JD_SZBUF); + if (!dc) return 0 - (int)JDR_INP; /* Err: read error or wrong stream termination */ + } else { + dp++; /* Next data ptr */ + } + dc--; /* Decrement number of available bytes */ + if (flg) { /* In flag sequence? */ + flg = 0; /* Exit flag sequence */ + if (*dp != 0) return 0 - (int)JDR_FMT1; /* Err: unexpected flag is detected (may be collapted data) */ + *dp = 0xFF; /* The flag is a data 0xFF */ + } else { + if (*dp == 0xFF) { /* Is start of flag sequence? */ + flg = 1; continue; /* Enter flag sequence, get trailing byte */ + } + } + bm = 0x80; /* Read from MSB */ + } + d <<= 1; /* Get a bit */ + if (*dp & bm) d++; + bm >>= 1; + + for (nd = *hb++; nd; nd--) { /* Search the code word in this bit length */ + if (d == *hc++) { /* Matched? */ + jd->dbit = bm; jd->dctr = dc; jd->dptr = dp; + return *hd; /* Return the decoded data */ + } + hd++; + } + bl--; + } while (bl); + +#else + const uint8_t *hb, *hd; + const uint16_t *hc; + unsigned int nc, bl, wbit = jd->dbit % 32; + uint32_t w = jd->wreg & ((1UL << wbit) - 1); + + + while (wbit < 16) { /* Prepare 16 bits into the working register */ + if (jd->marker) { + d = 0xFF; /* Input stream has stalled for a marker. Generate stuff bits */ + } else { + if (!dc) { /* Buffer empty, re-fill input buffer */ + dp = jd->inbuf; /* Top of input buffer */ + dc = jd->infunc(jd, dp, JD_SZBUF); + if (!dc) return 0 - (int)JDR_INP; /* Err: read error or wrong stream termination */ + } + d = *dp++; dc--; + if (flg) { /* In flag sequence? */ + flg = 0; /* Exit flag sequence */ + if (d != 0) jd->marker = d; /* Not an escape of 0xFF but a marker */ + d = 0xFF; + } else { + if (d == 0xFF) { /* Is start of flag sequence? */ + flg = 1; continue; /* Enter flag sequence, get trailing byte */ + } + } + } + w = w << 8 | d; /* Shift 8 bits in the working register */ + wbit += 8; + } + jd->dctr = dc; jd->dptr = dp; + jd->wreg = w; + +#if JD_FASTDECODE == 2 + /* Table serch for the short codes */ + d = (unsigned int)(w >> (wbit - HUFF_BIT)); /* Short code as table index */ + if (cls) { /* AC element */ + d = jd->hufflut_ac[id][d]; /* Table decode */ + if (d != 0xFFFF) { /* It is done if hit in short code */ + jd->dbit = wbit - (d >> 8); /* Snip the code length */ + return d & 0xFF; /* b7..0: zero run and following data bits */ + } + } else { /* DC element */ + d = jd->hufflut_dc[id][d]; /* Table decode */ + if (d != 0xFF) { /* It is done if hit in short code */ + jd->dbit = wbit - (d >> 4); /* Snip the code length */ + return d & 0xF; /* b3..0: following data bits */ + } + } + + /* Incremental serch for the codes longer than HUFF_BIT */ + hb = jd->huffbits[id][cls] + HUFF_BIT; /* Bit distribution table */ + hc = jd->huffcode[id][cls] + jd->longofs[id][cls]; /* Code word table */ + hd = jd->huffdata[id][cls] + jd->longofs[id][cls]; /* Data table */ + bl = HUFF_BIT + 1; +#else + /* Incremental serch for all codes */ + hb = jd->huffbits[id][cls]; /* Bit distribution table */ + hc = jd->huffcode[id][cls]; /* Code word table */ + hd = jd->huffdata[id][cls]; /* Data table */ + bl = 1; +#endif + for ( ; bl <= 16; bl++) { /* Incremental search */ + nc = *hb++; + if (nc) { + d = w >> (wbit - bl); + do { /* Search the code word in this bit length */ + if (d == *hc++) { /* Matched? */ + jd->dbit = wbit - bl; /* Snip the huffman code */ + return *hd; /* Return the decoded data */ + } + hd++; + } while (--nc); + } + } +#endif + + return 0 - (int)JDR_FMT1; /* Err: code not found (may be collapted data) */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Extract N bits from input stream */ +/*-----------------------------------------------------------------------*/ + +static int bitext ( /* >=0: extracted data, <0: error code */ + JDEC* jd, /* Pointer to the decompressor object */ + unsigned int nbit /* Number of bits to extract (1 to 16) */ +) +{ + size_t dc = jd->dctr; + uint8_t *dp = jd->dptr; + unsigned int d, flg = 0; + +#if JD_FASTDECODE == 0 + uint8_t mbit = jd->dbit; + + d = 0; + do { + if (!mbit) { /* Next byte? */ + if (!dc) { /* No input data is available, re-fill input buffer */ + dp = jd->inbuf; /* Top of input buffer */ + dc = jd->infunc(jd, dp, JD_SZBUF); + if (!dc) return 0 - (int)JDR_INP; /* Err: read error or wrong stream termination */ + } else { + dp++; /* Next data ptr */ + } + dc--; /* Decrement number of available bytes */ + if (flg) { /* In flag sequence? */ + flg = 0; /* Exit flag sequence */ + if (*dp != 0) return 0 - (int)JDR_FMT1; /* Err: unexpected flag is detected (may be collapted data) */ + *dp = 0xFF; /* The flag is a data 0xFF */ + } else { + if (*dp == 0xFF) { /* Is start of flag sequence? */ + flg = 1; continue; /* Enter flag sequence */ + } + } + mbit = 0x80; /* Read from MSB */ + } + d <<= 1; /* Get a bit */ + if (*dp & mbit) d |= 1; + mbit >>= 1; + nbit--; + } while (nbit); + + jd->dbit = mbit; jd->dctr = dc; jd->dptr = dp; + return (int)d; + +#else + unsigned int wbit = jd->dbit % 32; + uint32_t w = jd->wreg & ((1UL << wbit) - 1); + + + while (wbit < nbit) { /* Prepare nbit bits into the working register */ + if (jd->marker) { + d = 0xFF; /* Input stream stalled, generate stuff bits */ + } else { + if (!dc) { /* Buffer empty, re-fill input buffer */ + dp = jd->inbuf; /* Top of input buffer */ + dc = jd->infunc(jd, dp, JD_SZBUF); + if (!dc) return 0 - (int)JDR_INP; /* Err: read error or wrong stream termination */ + } + d = *dp++; dc--; + if (flg) { /* In flag sequence? */ + flg = 0; /* Exit flag sequence */ + if (d != 0) jd->marker = d; /* Not an escape of 0xFF but a marker */ + d = 0xFF; + } else { + if (d == 0xFF) { /* Is start of flag sequence? */ + flg = 1; continue; /* Enter flag sequence, get trailing byte */ + } + } + } + w = w << 8 | d; /* Get 8 bits into the working register */ + wbit += 8; + } + jd->wreg = w; jd->dbit = wbit - nbit; + jd->dctr = dc; jd->dptr = dp; + + return (int)(w >> ((wbit - nbit) % 32)); +#endif +} + + + + +/*-----------------------------------------------------------------------*/ +/* Process restart interval */ +/*-----------------------------------------------------------------------*/ + +static JRESULT restart ( + JDEC* jd, /* Pointer to the decompressor object */ + uint16_t rstn /* Expected restert sequense number */ +) +{ + unsigned int i; + uint8_t *dp = jd->dptr; + size_t dc = jd->dctr; + +#if JD_FASTDECODE == 0 + uint16_t d = 0; + + /* Get two bytes from the input stream */ + for (i = 0; i < 2; i++) { + if (!dc) { /* No input data is available, re-fill input buffer */ + dp = jd->inbuf; + dc = jd->infunc(jd, dp, JD_SZBUF); + if (!dc) return JDR_INP; + } else { + dp++; + } + dc--; + d = d << 8 | *dp; /* Get a byte */ + } + jd->dptr = dp; jd->dctr = dc; jd->dbit = 0; + + /* Check the marker */ + if ((d & 0xFFD8) != 0xFFD0 || (d & 7) != (rstn & 7)) { + return JDR_FMT1; /* Err: expected RSTn marker is not detected (may be collapted data) */ + } + +#else + uint16_t marker; + + + if (jd->marker) { /* Generate a maker if it has been detected */ + marker = 0xFF00 | jd->marker; + jd->marker = 0; + } else { + marker = 0; + for (i = 0; i < 2; i++) { /* Get a restart marker */ + if (!dc) { /* No input data is available, re-fill input buffer */ + dp = jd->inbuf; + dc = jd->infunc(jd, dp, JD_SZBUF); + if (!dc) return JDR_INP; + } + marker = (marker << 8) | *dp++; /* Get a byte */ + dc--; + } + jd->dptr = dp; jd->dctr = dc; + } + + /* Check the marker */ + if ((marker & 0xFFD8) != 0xFFD0 || (marker & 7) != (rstn & 7)) { + return JDR_FMT1; /* Err: expected RSTn marker was not detected (may be collapted data) */ + } + + jd->dbit = 0; /* Discard stuff bits */ +#endif + + jd->dcv[2] = jd->dcv[1] = jd->dcv[0] = 0; /* Reset DC offset */ + return JDR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Apply Inverse-DCT in Arai Algorithm (see also aa_idct.png) */ +/*-----------------------------------------------------------------------*/ + +static void block_idct ( + int32_t* src, /* Input block data (de-quantized and pre-scaled for Arai Algorithm) */ + jd_yuv_t* dst /* Pointer to the destination to store the block as byte array */ +) +{ + const int32_t M13 = (int32_t)(1.41421*4096), M2 = (int32_t)(1.08239*4096), M4 = (int32_t)(2.61313*4096), M5 = (int32_t)(1.84776*4096); + int32_t v0, v1, v2, v3, v4, v5, v6, v7; + int32_t t10, t11, t12, t13; + int i; + + /* Process columns */ + for (i = 0; i < 8; i++) { + v0 = src[8 * 0]; /* Get even elements */ + v1 = src[8 * 2]; + v2 = src[8 * 4]; + v3 = src[8 * 6]; + + t10 = v0 + v2; /* Process the even elements */ + t12 = v0 - v2; + t11 = (v1 - v3) * M13 >> 12; + v3 += v1; + t11 -= v3; + v0 = t10 + v3; + v3 = t10 - v3; + v1 = t11 + t12; + v2 = t12 - t11; + + v4 = src[8 * 7]; /* Get odd elements */ + v5 = src[8 * 1]; + v6 = src[8 * 5]; + v7 = src[8 * 3]; + + t10 = v5 - v4; /* Process the odd elements */ + t11 = v5 + v4; + t12 = v6 - v7; + v7 += v6; + v5 = (t11 - v7) * M13 >> 12; + v7 += t11; + t13 = (t10 + t12) * M5 >> 12; + v4 = t13 - (t10 * M2 >> 12); + v6 = t13 - (t12 * M4 >> 12) - v7; + v5 -= v6; + v4 -= v5; + + src[8 * 0] = v0 + v7; /* Write-back transformed values */ + src[8 * 7] = v0 - v7; + src[8 * 1] = v1 + v6; + src[8 * 6] = v1 - v6; + src[8 * 2] = v2 + v5; + src[8 * 5] = v2 - v5; + src[8 * 3] = v3 + v4; + src[8 * 4] = v3 - v4; + + src++; /* Next column */ + } + + /* Process rows */ + src -= 8; + for (i = 0; i < 8; i++) { + v0 = src[0] + (128L << 8); /* Get even elements (remove DC offset (-128) here) */ + v1 = src[2]; + v2 = src[4]; + v3 = src[6]; + + t10 = v0 + v2; /* Process the even elements */ + t12 = v0 - v2; + t11 = (v1 - v3) * M13 >> 12; + v3 += v1; + t11 -= v3; + v0 = t10 + v3; + v3 = t10 - v3; + v1 = t11 + t12; + v2 = t12 - t11; + + v4 = src[7]; /* Get odd elements */ + v5 = src[1]; + v6 = src[5]; + v7 = src[3]; + + t10 = v5 - v4; /* Process the odd elements */ + t11 = v5 + v4; + t12 = v6 - v7; + v7 += v6; + v5 = (t11 - v7) * M13 >> 12; + v7 += t11; + t13 = (t10 + t12) * M5 >> 12; + v4 = t13 - (t10 * M2 >> 12); + v6 = t13 - (t12 * M4 >> 12) - v7; + v5 -= v6; + v4 -= v5; + + /* Descale the transformed values 8 bits and output a row */ +#if JD_FASTDECODE >= 1 + dst[0] = (int16_t)((v0 + v7) >> 8); + dst[7] = (int16_t)((v0 - v7) >> 8); + dst[1] = (int16_t)((v1 + v6) >> 8); + dst[6] = (int16_t)((v1 - v6) >> 8); + dst[2] = (int16_t)((v2 + v5) >> 8); + dst[5] = (int16_t)((v2 - v5) >> 8); + dst[3] = (int16_t)((v3 + v4) >> 8); + dst[4] = (int16_t)((v3 - v4) >> 8); +#else + dst[0] = BYTECLIP((v0 + v7) >> 8); + dst[7] = BYTECLIP((v0 - v7) >> 8); + dst[1] = BYTECLIP((v1 + v6) >> 8); + dst[6] = BYTECLIP((v1 - v6) >> 8); + dst[2] = BYTECLIP((v2 + v5) >> 8); + dst[5] = BYTECLIP((v2 - v5) >> 8); + dst[3] = BYTECLIP((v3 + v4) >> 8); + dst[4] = BYTECLIP((v3 - v4) >> 8); +#endif + + dst += 8; src += 8; /* Next row */ + } +} + + + + +/*-----------------------------------------------------------------------*/ +/* Load all blocks in an MCU into working buffer */ +/*-----------------------------------------------------------------------*/ + +static JRESULT mcu_load ( + JDEC* jd /* Pointer to the decompressor object */ +) +{ + int32_t *tmp = (int32_t*)jd->workbuf; /* Block working buffer for de-quantize and IDCT */ + int d, e; + unsigned int blk, nby, i, bc, z, id, cmp; + jd_yuv_t *bp; + const int32_t *dqf; + + + nby = jd->msx * jd->msy; /* Number of Y blocks (1, 2 or 4) */ + bp = jd->mcubuf; /* Pointer to the first block of MCU */ + + for (blk = 0; blk < nby + 2; blk++) { /* Get nby Y blocks and two C blocks */ + cmp = (blk < nby) ? 0 : blk - nby + 1; /* Component number 0:Y, 1:Cb, 2:Cr */ + + if (cmp && jd->ncomp != 3) { /* Clear C blocks if not exist (monochrome image) */ + for (i = 0; i < 64; bp[i++] = 128) ; + + } else { /* Load Y/C blocks from input stream */ + id = cmp ? 1 : 0; /* Huffman table ID of this component */ + + /* Extract a DC element from input stream */ + d = huffext(jd, id, 0); /* Extract a huffman coded data (bit length) */ + if (d < 0) return (JRESULT)(0 - d); /* Err: invalid code or input */ + bc = (unsigned int)d; + d = jd->dcv[cmp]; /* DC value of previous block */ + if (bc) { /* If there is any difference from previous block */ + e = bitext(jd, bc); /* Extract data bits */ + if (e < 0) return (JRESULT)(0 - e); /* Err: input */ + bc = 1 << (bc - 1); /* MSB position */ + if (!(e & bc)) e -= (bc << 1) - 1; /* Restore negative value if needed */ + d += e; /* Get current value */ + jd->dcv[cmp] = (int16_t)d; /* Save current DC value for next block */ + } + dqf = jd->qttbl[jd->qtid[cmp]]; /* De-quantizer table ID for this component */ + tmp[0] = d * dqf[0] >> 8; /* De-quantize, apply scale factor of Arai algorithm and descale 8 bits */ + + /* Extract following 63 AC elements from input stream */ + memset(&tmp[1], 0, 63 * sizeof (int32_t)); /* Initialize all AC elements */ + z = 1; /* Top of the AC elements (in zigzag-order) */ + do { + d = huffext(jd, id, 1); /* Extract a huffman coded value (zero runs and bit length) */ + if (d == 0) break; /* EOB? */ + if (d < 0) return (JRESULT)(0 - d); /* Err: invalid code or input error */ + bc = (unsigned int)d; + z += bc >> 4; /* Skip leading zero run */ + if (z >= 64) return JDR_FMT1; /* Too long zero run */ + if (bc &= 0x0F) { /* Bit length? */ + d = bitext(jd, bc); /* Extract data bits */ + if (d < 0) return (JRESULT)(0 - d); /* Err: input device */ + bc = 1 << (bc - 1); /* MSB position */ + if (!(d & bc)) d -= (bc << 1) - 1; /* Restore negative value if needed */ + i = Zig[z]; /* Get raster-order index */ + tmp[i] = d * dqf[i] >> 8; /* De-quantize, apply scale factor of Arai algorithm and descale 8 bits */ + } + } while (++z < 64); /* Next AC element */ + + if (JD_FORMAT != 2 || !cmp) { /* C components may not be processed if in grayscale output */ + if (z == 1 || (JD_USE_SCALE && jd->scale == 3)) { /* If no AC element or scale ratio is 1/8, IDCT can be ommited and the block is filled with DC value */ + d = (jd_yuv_t)((*tmp / 256) + 128); + if (JD_FASTDECODE >= 1) { + for (i = 0; i < 64; bp[i++] = d) ; + } else { + memset(bp, d, 64); + } + } else { + block_idct(tmp, bp); /* Apply IDCT and store the block to the MCU buffer */ + } + } + } + + bp += 64; /* Next block */ + } + + return JDR_OK; /* All blocks have been loaded successfully */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Output an MCU: Convert YCrCb to RGB and output it in RGB form */ +/*-----------------------------------------------------------------------*/ + +static JRESULT mcu_output ( + JDEC* jd, /* Pointer to the decompressor object */ + int (*outfunc)(JDEC*, void*, JRECT*), /* RGB output function */ + unsigned int img_x, /* MCU location in the image */ + unsigned int img_y /* MCU location in the image */ +) +{ + const int CVACC = (sizeof (int) > 2) ? 1024 : 128; /* Adaptive accuracy for both 16-/32-bit systems */ + unsigned int ix, iy, mx, my, rx, ry; + int yy, cb, cr; + jd_yuv_t *py, *pc; + uint8_t *pix; + JRECT rect; + + + mx = jd->msx * 8; my = jd->msy * 8; /* MCU size (pixel) */ + rx = (img_x + mx <= jd->width) ? mx : jd->width - img_x; /* Output rectangular size (it may be clipped at right/bottom end of image) */ + ry = (img_y + my <= jd->height) ? my : jd->height - img_y; + if (JD_USE_SCALE) { + rx >>= jd->scale; ry >>= jd->scale; + if (!rx || !ry) return JDR_OK; /* Skip this MCU if all pixel is to be rounded off */ + img_x >>= jd->scale; img_y >>= jd->scale; + } + rect.left = img_x; rect.right = img_x + rx - 1; /* Rectangular area in the frame buffer */ + rect.top = img_y; rect.bottom = img_y + ry - 1; + + + if (!JD_USE_SCALE || jd->scale != 3) { /* Not for 1/8 scaling */ + pix = (uint8_t*)jd->workbuf; + + if (JD_FORMAT != 2) { /* RGB output (build an RGB MCU from Y/C component) */ + for (iy = 0; iy < my; iy++) { + pc = py = jd->mcubuf; + if (my == 16) { /* Double block height? */ + pc += 64 * 4 + (iy >> 1) * 8; + if (iy >= 8) py += 64; + } else { /* Single block height */ + pc += mx * 8 + iy * 8; + } + py += iy * 8; + for (ix = 0; ix < mx; ix++) { + cb = pc[0] - 128; /* Get Cb/Cr component and remove offset */ + cr = pc[64] - 128; + if (mx == 16) { /* Double block width? */ + if (ix == 8) py += 64 - 8; /* Jump to next block if double block heigt */ + pc += ix & 1; /* Step forward chroma pointer every two pixels */ + } else { /* Single block width */ + pc++; /* Step forward chroma pointer every pixel */ + } + yy = *py++; /* Get Y component */ + *pix++ = /*R*/ BYTECLIP(yy + ((int)(1.402 * CVACC) * cr) / CVACC); + *pix++ = /*G*/ BYTECLIP(yy - ((int)(0.344 * CVACC) * cb + (int)(0.714 * CVACC) * cr) / CVACC); + *pix++ = /*B*/ BYTECLIP(yy + ((int)(1.772 * CVACC) * cb) / CVACC); + } + } + } else { /* Monochrome output (build a grayscale MCU from Y comopnent) */ + for (iy = 0; iy < my; iy++) { + py = jd->mcubuf + iy * 8; + if (my == 16) { /* Double block height? */ + if (iy >= 8) py += 64; + } + for (ix = 0; ix < mx; ix++) { + if (mx == 16) { /* Double block width? */ + if (ix == 8) py += 64 - 8; /* Jump to next block if double block height */ + } + *pix++ = (uint8_t)*py++; /* Get and store a Y value as grayscale */ + } + } + } + + /* Descale the MCU rectangular if needed */ + if (JD_USE_SCALE && jd->scale) { + unsigned int x, y, r, g, b, s, w, a; + uint8_t *op; + + /* Get averaged RGB value of each square correcponds to a pixel */ + s = jd->scale * 2; /* Number of shifts for averaging */ + w = 1 << jd->scale; /* Width of square */ + a = (mx - w) * (JD_FORMAT != 2 ? 3 : 1); /* Bytes to skip for next line in the square */ + op = (uint8_t*)jd->workbuf; + for (iy = 0; iy < my; iy += w) { + for (ix = 0; ix < mx; ix += w) { + pix = (uint8_t*)jd->workbuf + (iy * mx + ix) * (JD_FORMAT != 2 ? 3 : 1); + r = g = b = 0; + for (y = 0; y < w; y++) { /* Accumulate RGB value in the square */ + for (x = 0; x < w; x++) { + r += *pix++; /* Accumulate R or Y (monochrome output) */ + if (JD_FORMAT != 2) { /* RGB output? */ + g += *pix++; /* Accumulate G */ + b += *pix++; /* Accumulate B */ + } + } + pix += a; + } /* Put the averaged pixel value */ + *op++ = (uint8_t)(r >> s); /* Put R or Y (monochrome output) */ + if (JD_FORMAT != 2) { /* RGB output? */ + *op++ = (uint8_t)(g >> s); /* Put G */ + *op++ = (uint8_t)(b >> s); /* Put B */ + } + } + } + } + + } else { /* For only 1/8 scaling (left-top pixel in each block are the DC value of the block) */ + + /* Build a 1/8 descaled RGB MCU from discrete comopnents */ + pix = (uint8_t*)jd->workbuf; + pc = jd->mcubuf + mx * my; + cb = pc[0] - 128; /* Get Cb/Cr component and restore right level */ + cr = pc[64] - 128; + for (iy = 0; iy < my; iy += 8) { + py = jd->mcubuf; + if (iy == 8) py += 64 * 2; + for (ix = 0; ix < mx; ix += 8) { + yy = *py; /* Get Y component */ + py += 64; + if (JD_FORMAT != 2) { + *pix++ = /*R*/ BYTECLIP(yy + ((int)(1.402 * CVACC) * cr / CVACC)); + *pix++ = /*G*/ BYTECLIP(yy - ((int)(0.344 * CVACC) * cb + (int)(0.714 * CVACC) * cr) / CVACC); + *pix++ = /*B*/ BYTECLIP(yy + ((int)(1.772 * CVACC) * cb / CVACC)); + } else { + *pix++ = yy; + } + } + } + } + + /* Squeeze up pixel table if a part of MCU is to be truncated */ + mx >>= jd->scale; + if (rx < mx) { /* Is the MCU spans rigit edge? */ + uint8_t *s, *d; + unsigned int x, y; + + s = d = (uint8_t*)jd->workbuf; + for (y = 0; y < ry; y++) { + for (x = 0; x < rx; x++) { /* Copy effective pixels */ + *d++ = *s++; + if (JD_FORMAT != 2) { + *d++ = *s++; + *d++ = *s++; + } + } + s += (mx - rx) * (JD_FORMAT != 2 ? 3 : 1); /* Skip truncated pixels */ + } + } + + /* Convert RGB888 to RGB565 if needed */ + if (JD_FORMAT == 1) { + uint8_t *s = (uint8_t*)jd->workbuf; + uint16_t w, *d = (uint16_t*)s; + unsigned int n = rx * ry; + + do { + w = (*s++ & 0xF8) << 8; /* RRRRR----------- */ + w |= (*s++ & 0xFC) << 3; /* -----GGGGGG----- */ + w |= *s++ >> 3; /* -----------BBBBB */ + *d++ = w; + } while (--n); + } + + /* Output the rectangular */ + return outfunc(jd, jd->workbuf, &rect) ? JDR_OK : JDR_INTR; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Analyze the JPEG image and Initialize decompressor object */ +/*-----------------------------------------------------------------------*/ + +#define LDB_WORD(ptr) (uint16_t)(((uint16_t)*((uint8_t*)(ptr))<<8)|(uint16_t)*(uint8_t*)((ptr)+1)) + + +JRESULT jd_prepare ( + JDEC* jd, /* Blank decompressor object */ + size_t (*infunc)(JDEC*, uint8_t*, size_t), /* JPEG strem input function */ + void* pool, /* Working buffer for the decompression session */ + size_t sz_pool, /* Size of working buffer */ + void* dev /* I/O device identifier for the session */ +) +{ + uint8_t *seg, b; + uint16_t marker; + unsigned int n, i, ofs; + size_t len; + JRESULT rc; + + + memset(jd, 0, sizeof (JDEC)); /* Clear decompression object (this might be a problem if machine's null pointer is not all bits zero) */ + jd->pool = pool; /* Work memroy */ + jd->sz_pool = sz_pool; /* Size of given work memory */ + jd->infunc = infunc; /* Stream input function */ + jd->device = dev; /* I/O device identifier */ + + jd->inbuf = seg = alloc_pool(jd, JD_SZBUF); /* Allocate stream input buffer */ + if (!seg) return JDR_MEM1; + + ofs = marker = 0; /* Find SOI marker */ + do { + if (jd->infunc(jd, seg, 1) != 1) return JDR_INP; /* Err: SOI was not detected */ + ofs++; + marker = marker << 8 | seg[0]; + } while (marker != 0xFFD8); + + for (;;) { /* Parse JPEG segments */ + /* Get a JPEG marker */ + if (jd->infunc(jd, seg, 4) != 4) return JDR_INP; + marker = LDB_WORD(seg); /* Marker */ + len = LDB_WORD(seg + 2); /* Length field */ + if (len <= 2 || (marker >> 8) != 0xFF) return JDR_FMT1; + len -= 2; /* Segent content size */ + ofs += 4 + len; /* Number of bytes loaded */ + + switch (marker & 0xFF) { + case 0xC0: /* SOF0 (baseline JPEG) */ + if (len > JD_SZBUF) return JDR_MEM2; + if (jd->infunc(jd, seg, len) != len) return JDR_INP; /* Load segment data */ + + jd->width = LDB_WORD(&seg[3]); /* Image width in unit of pixel */ + jd->height = LDB_WORD(&seg[1]); /* Image height in unit of pixel */ + jd->ncomp = seg[5]; /* Number of color components */ + if (jd->ncomp != 3 && jd->ncomp != 1) return JDR_FMT3; /* Err: Supports only Grayscale and Y/Cb/Cr */ + + /* Check each image component */ + for (i = 0; i < jd->ncomp; i++) { + b = seg[7 + 3 * i]; /* Get sampling factor */ + if (i == 0) { /* Y component */ + if (b != 0x11 && b != 0x22 && b != 0x21) { /* Check sampling factor */ + return JDR_FMT3; /* Err: Supports only 4:4:4, 4:2:0 or 4:2:2 */ + } + jd->msx = b >> 4; jd->msy = b & 15; /* Size of MCU [blocks] */ + } else { /* Cb/Cr component */ + if (b != 0x11) return JDR_FMT3; /* Err: Sampling factor of Cb/Cr must be 1 */ + } + jd->qtid[i] = seg[8 + 3 * i]; /* Get dequantizer table ID for this component */ + if (jd->qtid[i] > 3) return JDR_FMT3; /* Err: Invalid ID */ + } + break; + + case 0xDD: /* DRI - Define Restart Interval */ + if (len > JD_SZBUF) return JDR_MEM2; + if (jd->infunc(jd, seg, len) != len) return JDR_INP; /* Load segment data */ + + jd->nrst = LDB_WORD(seg); /* Get restart interval (MCUs) */ + break; + + case 0xC4: /* DHT - Define Huffman Tables */ + if (len > JD_SZBUF) return JDR_MEM2; + if (jd->infunc(jd, seg, len) != len) return JDR_INP; /* Load segment data */ + + rc = create_huffman_tbl(jd, seg, len); /* Create huffman tables */ + if (rc) return rc; + break; + + case 0xDB: /* DQT - Define Quaitizer Tables */ + if (len > JD_SZBUF) return JDR_MEM2; + if (jd->infunc(jd, seg, len) != len) return JDR_INP; /* Load segment data */ + + rc = create_qt_tbl(jd, seg, len); /* Create de-quantizer tables */ + if (rc) return rc; + break; + + case 0xDA: /* SOS - Start of Scan */ + if (len > JD_SZBUF) return JDR_MEM2; + if (jd->infunc(jd, seg, len) != len) return JDR_INP; /* Load segment data */ + + if (!jd->width || !jd->height) return JDR_FMT1; /* Err: Invalid image size */ + if (seg[0] != jd->ncomp) return JDR_FMT3; /* Err: Wrong color components */ + + /* Check if all tables corresponding to each components have been loaded */ + for (i = 0; i < jd->ncomp; i++) { + b = seg[2 + 2 * i]; /* Get huffman table ID */ + if (b != 0x00 && b != 0x11) return JDR_FMT3; /* Err: Different table number for DC/AC element */ + n = i ? 1 : 0; /* Component class */ + if (!jd->huffbits[n][0] || !jd->huffbits[n][1]) { /* Check huffman table for this component */ + return JDR_FMT1; /* Err: Nnot loaded */ + } + if (!jd->qttbl[jd->qtid[i]]) { /* Check dequantizer table for this component */ + return JDR_FMT1; /* Err: Not loaded */ + } + } + + /* Allocate working buffer for MCU and pixel output */ + n = jd->msy * jd->msx; /* Number of Y blocks in the MCU */ + if (!n) return JDR_FMT1; /* Err: SOF0 has not been loaded */ + len = n * 64 * 2 + 64; /* Allocate buffer for IDCT and RGB output */ + if (len < 256) len = 256; /* but at least 256 byte is required for IDCT */ + jd->workbuf = alloc_pool(jd, len); /* and it may occupy a part of following MCU working buffer for RGB output */ + if (!jd->workbuf) return JDR_MEM1; /* Err: not enough memory */ + jd->mcubuf = alloc_pool(jd, (n + 2) * 64 * sizeof (jd_yuv_t)); /* Allocate MCU working buffer */ + if (!jd->mcubuf) return JDR_MEM1; /* Err: not enough memory */ + + /* Align stream read offset to JD_SZBUF */ + if (ofs %= JD_SZBUF) { + jd->dctr = jd->infunc(jd, seg + ofs, (size_t)(JD_SZBUF - ofs)); + } + jd->dptr = seg + ofs - (JD_FASTDECODE ? 0 : 1); + + return JDR_OK; /* Initialization succeeded. Ready to decompress the JPEG image. */ + + case 0xC1: /* SOF1 */ + case 0xC2: /* SOF2 */ + case 0xC3: /* SOF3 */ + case 0xC5: /* SOF5 */ + case 0xC6: /* SOF6 */ + case 0xC7: /* SOF7 */ + case 0xC9: /* SOF9 */ + case 0xCA: /* SOF10 */ + case 0xCB: /* SOF11 */ + case 0xCD: /* SOF13 */ + case 0xCE: /* SOF14 */ + case 0xCF: /* SOF15 */ + case 0xD9: /* EOI */ + return JDR_FMT3; /* Unsuppoted JPEG standard (may be progressive JPEG) */ + + default: /* Unknown segment (comment, exif or etc..) */ + /* Skip segment data (null pointer specifies to remove data from the stream) */ + if (jd->infunc(jd, 0, len) != len) return JDR_INP; + } + } +} + + + + +/*-----------------------------------------------------------------------*/ +/* Start to decompress the JPEG picture */ +/*-----------------------------------------------------------------------*/ + +JRESULT jd_decomp ( + JDEC* jd, /* Initialized decompression object */ + int (*outfunc)(JDEC*, void*, JRECT*), /* RGB output function */ + uint8_t scale /* Output de-scaling factor (0 to 3) */ +) +{ + unsigned int x, y, mx, my; + uint16_t rst, rsc; + JRESULT rc; + + + if (scale > (JD_USE_SCALE ? 3 : 0)) return JDR_PAR; + jd->scale = scale; + + mx = jd->msx * 8; my = jd->msy * 8; /* Size of the MCU (pixel) */ + + jd->dcv[2] = jd->dcv[1] = jd->dcv[0] = 0; /* Initialize DC values */ + rst = rsc = 0; + + rc = JDR_OK; + for (y = 0; y < jd->height; y += my) { /* Vertical loop of MCUs */ + for (x = 0; x < jd->width; x += mx) { /* Horizontal loop of MCUs */ + if (jd->nrst && rst++ == jd->nrst) { /* Process restart interval if enabled */ + rc = restart(jd, rsc++); + if (rc != JDR_OK) return rc; + rst = 1; + } + rc = mcu_load(jd); /* Load an MCU (decompress huffman coded stream, dequantize and apply IDCT) */ + if (rc != JDR_OK) return rc; + rc = mcu_output(jd, outfunc, x, y); /* Output the MCU (YCbCr to RGB, scaling and output) */ + if (rc != JDR_OK) return rc; + } + } + + return rc; +} + +#endif /*LV_USE_SJPG*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/sjpg/tjpgd.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/sjpg/tjpgd.h new file mode 100644 index 0000000..b255ccf --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/sjpg/tjpgd.h @@ -0,0 +1,93 @@ +/*----------------------------------------------------------------------------/ +/ TJpgDec - Tiny JPEG Decompressor R0.03 include file (C)ChaN, 2021 +/----------------------------------------------------------------------------*/ +#ifndef DEF_TJPGDEC +#define DEF_TJPGDEC + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../../../lv_conf_internal.h" +#if LV_USE_SJPG + +#include "tjpgdcnf.h" +#include +#include + +#if JD_FASTDECODE >= 1 +typedef int16_t jd_yuv_t; +#else +typedef uint8_t jd_yuv_t; +#endif + + +/* Error code */ +typedef enum { + JDR_OK = 0, /* 0: Succeeded */ + JDR_INTR, /* 1: Interrupted by output function */ + JDR_INP, /* 2: Device error or wrong termination of input stream */ + JDR_MEM1, /* 3: Insufficient memory pool for the image */ + JDR_MEM2, /* 4: Insufficient stream input buffer */ + JDR_PAR, /* 5: Parameter error */ + JDR_FMT1, /* 6: Data format error (may be broken data) */ + JDR_FMT2, /* 7: Right format but not supported */ + JDR_FMT3 /* 8: Not supported JPEG standard */ +} JRESULT; + +/* Rectangular region in the output image */ +typedef struct { + uint16_t left; /* Left end */ + uint16_t right; /* Right end */ + uint16_t top; /* Top end */ + uint16_t bottom; /* Bottom end */ +} JRECT; + +/* Decompressor object structure */ +typedef struct JDEC JDEC; +struct JDEC { + size_t dctr; /* Number of bytes available in the input buffer */ + uint8_t* dptr; /* Current data read ptr */ + uint8_t* inbuf; /* Bit stream input buffer */ + uint8_t dbit; /* Number of bits availavble in wreg or reading bit mask */ + uint8_t scale; /* Output scaling ratio */ + uint8_t msx, msy; /* MCU size in unit of block (width, height) */ + uint8_t qtid[3]; /* Quantization table ID of each component, Y, Cb, Cr */ + uint8_t ncomp; /* Number of color components 1:grayscale, 3:color */ + int16_t dcv[3]; /* Previous DC element of each component */ + uint16_t nrst; /* Restart inverval */ + uint16_t width, height; /* Size of the input image (pixel) */ + uint8_t* huffbits[2][2]; /* Huffman bit distribution tables [id][dcac] */ + uint16_t* huffcode[2][2]; /* Huffman code word tables [id][dcac] */ + uint8_t* huffdata[2][2]; /* Huffman decoded data tables [id][dcac] */ + int32_t* qttbl[4]; /* Dequantizer tables [id] */ +#if JD_FASTDECODE >= 1 + uint32_t wreg; /* Working shift register */ + uint8_t marker; /* Detected marker (0:None) */ +#if JD_FASTDECODE == 2 + uint8_t longofs[2][2]; /* Table offset of long code [id][dcac] */ + uint16_t* hufflut_ac[2]; /* Fast huffman decode tables for AC short code [id] */ + uint8_t* hufflut_dc[2]; /* Fast huffman decode tables for DC short code [id] */ +#endif +#endif + void* workbuf; /* Working buffer for IDCT and RGB output */ + jd_yuv_t* mcubuf; /* Working buffer for the MCU */ + void* pool; /* Pointer to available memory pool */ + size_t sz_pool; /* Size of momory pool (bytes available) */ + size_t (*infunc)(JDEC*, uint8_t*, size_t); /* Pointer to jpeg stream input function */ + void* device; /* Pointer to I/O device identifiler for the session */ +}; + + + +/* TJpgDec API functions */ +JRESULT jd_prepare (JDEC* jd, size_t (*infunc)(JDEC*,uint8_t*,size_t), void* pool, size_t sz_pool, void* dev); +JRESULT jd_decomp (JDEC* jd, int (*outfunc)(JDEC*,void*,JRECT*), uint8_t scale); + +#endif /*LV_USE_SJPG*/ + +#ifdef __cplusplus +} +#endif + +#endif /* _TJPGDEC */ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/sjpg/tjpgdcnf.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/sjpg/tjpgdcnf.h new file mode 100644 index 0000000..6d425e6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/libs/sjpg/tjpgdcnf.h @@ -0,0 +1,33 @@ +/*----------------------------------------------*/ +/* TJpgDec System Configurations R0.03 */ +/*----------------------------------------------*/ + +#define JD_SZBUF 512 +/* Specifies size of stream input buffer */ + +#define JD_FORMAT 0 +/* Specifies output pixel format. +/ 0: RGB888 (24-bit/pix) +/ 1: RGB565 (16-bit/pix) +/ 2: Grayscale (8-bit/pix) +*/ + +#define JD_USE_SCALE 1 +/* Switches output descaling feature. +/ 0: Disable +/ 1: Enable +*/ + +#define JD_TBLCLIP 1 +/* Use table conversion for saturation arithmetic. A bit faster, but increases 1 KB of code size. +/ 0: Disable +/ 1: Enable +*/ + +#define JD_FASTDECODE 0 +/* Optimization level +/ 0: Basic optimization. Suitable for 8/16-bit MCUs. +/ 1: + 32-bit barrel shifter. Suitable for 32-bit MCUs. +/ 2: + Table conversion for huffman decoding (wants 6 << HUFF_BIT bytes of RAM) +*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/lv_extra.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/lv_extra.c new file mode 100644 index 0000000..0b50002 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/lv_extra.c @@ -0,0 +1,93 @@ +/** + * @file lv_extra.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../lvgl.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_extra_init(void) +{ +#if LV_USE_FLEX + lv_flex_init(); +#endif + +#if LV_USE_GRID + lv_grid_init(); +#endif + +#if LV_USE_MSG + lv_msg_init(); +#endif + +#if LV_USE_FS_FATFS != '\0' + lv_fs_fatfs_init(); +#endif + +#if LV_USE_FS_STDIO != '\0' + lv_fs_stdio_init(); +#endif + +#if LV_USE_FS_POSIX != '\0' + lv_fs_posix_init(); +#endif + +#if LV_USE_FS_WIN32 != '\0' + lv_fs_win32_init(); +#endif + +#if LV_USE_FFMPEG + lv_ffmpeg_init(); +#endif + +#if LV_USE_PNG + lv_png_init(); +#endif + +#if LV_USE_SJPG + lv_split_jpeg_init(); +#endif + +#if LV_USE_BMP + lv_bmp_init(); +#endif + +#if LV_USE_FREETYPE + /*Init freetype library*/ +# if LV_FREETYPE_CACHE_SIZE >= 0 + lv_freetype_init(LV_FREETYPE_CACHE_FT_FACES, LV_FREETYPE_CACHE_FT_SIZES, LV_FREETYPE_CACHE_SIZE); +# else + lv_freetype_init(0, 0, 0); +# endif +#endif +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/lv_extra.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/lv_extra.h new file mode 100644 index 0000000..c0306a9 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/lv_extra.h @@ -0,0 +1,48 @@ +/** + * @file lv_extra.h + * + */ + +#ifndef LV_EXTRA_H +#define LV_EXTRA_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "layouts/lv_layouts.h" +#include "libs/lv_libs.h" +#include "others/lv_others.h" +#include "themes/lv_themes.h" +#include "widgets/lv_widgets.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the extra components + */ +void lv_extra_init(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_EXTRA_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/lv_extra.mk b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/lv_extra.mk new file mode 100644 index 0000000..1afcc7b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/lv_extra.mk @@ -0,0 +1 @@ +CSRCS += $(shell find -L $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/extra -name \*.c) diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/fragment/README.md b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/fragment/README.md new file mode 100644 index 0000000..e69de29 diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/fragment/lv_fragment.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/fragment/lv_fragment.c new file mode 100644 index 0000000..a2cdfad --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/fragment/lv_fragment.c @@ -0,0 +1,144 @@ +/** + * @file lv_fragment.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_fragment.h" + +#if LV_USE_FRAGMENT + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void cb_delete_assertion(lv_event_t * event); + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_fragment_t * lv_fragment_create(const lv_fragment_class_t * cls, void * args) +{ + LV_ASSERT_NULL(cls); + LV_ASSERT_NULL(cls->create_obj_cb); + LV_ASSERT(cls->instance_size > 0); + lv_fragment_t * instance = lv_mem_alloc(cls->instance_size); + lv_memset_00(instance, cls->instance_size); + instance->cls = cls; + instance->child_manager = lv_fragment_manager_create(instance); + if(cls->constructor_cb) { + cls->constructor_cb(instance, args); + } + return instance; +} + +void lv_fragment_del(lv_fragment_t * fragment) +{ + LV_ASSERT_NULL(fragment); + if(fragment->managed) { + lv_fragment_manager_remove(fragment->managed->manager, fragment); + return; + } + if(fragment->obj) { + lv_fragment_del_obj(fragment); + } + /* Objects will leak if this function called before objects deleted */ + const lv_fragment_class_t * cls = fragment->cls; + if(cls->destructor_cb) { + cls->destructor_cb(fragment); + } + lv_fragment_manager_del(fragment->child_manager); + lv_mem_free(fragment); +} + +lv_fragment_manager_t * lv_fragment_get_manager(lv_fragment_t * fragment) +{ + LV_ASSERT_NULL(fragment); + LV_ASSERT_NULL(fragment->managed); + return fragment->managed->manager; +} + +lv_obj_t * const * lv_fragment_get_container(lv_fragment_t * fragment) +{ + LV_ASSERT_NULL(fragment); + LV_ASSERT_NULL(fragment->managed); + return fragment->managed->container; +} + +lv_fragment_t * lv_fragment_get_parent(lv_fragment_t * fragment) +{ + LV_ASSERT_NULL(fragment); + LV_ASSERT_NULL(fragment->managed); + return lv_fragment_manager_get_parent_fragment(fragment->managed->manager); +} + +lv_obj_t * lv_fragment_create_obj(lv_fragment_t * fragment, lv_obj_t * container) +{ + lv_fragment_managed_states_t * states = fragment->managed; + if(states) { + states->destroying_obj = false; + } + const lv_fragment_class_t * cls = fragment->cls; + lv_obj_t * obj = cls->create_obj_cb(fragment, container); + LV_ASSERT_NULL(obj); + fragment->obj = obj; + lv_fragment_manager_create_obj(fragment->child_manager); + if(states) { + states->obj_created = true; + lv_obj_add_event_cb(obj, cb_delete_assertion, LV_EVENT_DELETE, NULL); + } + if(cls->obj_created_cb) { + cls->obj_created_cb(fragment, obj); + } + return obj; +} + +void lv_fragment_del_obj(lv_fragment_t * fragment) +{ + LV_ASSERT_NULL(fragment); + lv_fragment_manager_del_obj(fragment->child_manager); + lv_fragment_managed_states_t * states = fragment->managed; + if(states) { + if(!states->obj_created) return; + states->destroying_obj = true; + bool cb_removed = lv_obj_remove_event_cb(fragment->obj, cb_delete_assertion); + LV_ASSERT(cb_removed); + } + LV_ASSERT_NULL(fragment->obj); + const lv_fragment_class_t * cls = fragment->cls; + if(cls->obj_will_delete_cb) { + cls->obj_will_delete_cb(fragment, fragment->obj); + } + lv_obj_del(fragment->obj); + if(cls->obj_deleted_cb) { + cls->obj_deleted_cb(fragment, fragment->obj); + } + if(states) { + states->obj_created = false; + } + fragment->obj = NULL; +} + +void lv_fragment_recreate_obj(lv_fragment_t * fragment) +{ + LV_ASSERT_NULL(fragment); + LV_ASSERT_NULL(fragment->managed); + lv_fragment_del_obj(fragment); + lv_fragment_create_obj(fragment, *fragment->managed->container); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void cb_delete_assertion(lv_event_t * event) +{ + LV_UNUSED(event); + LV_ASSERT_MSG(0, "Please delete objects with lv_fragment_destroy_obj"); +} + +#endif /*LV_USE_FRAGMENT*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/fragment/lv_fragment.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/fragment/lv_fragment.h new file mode 100644 index 0000000..da30b39 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/fragment/lv_fragment.h @@ -0,0 +1,339 @@ +/** + * Public header for Fragment + * @file lv_fragment.h + */ + +#ifndef LV_FRAGMENT_H +#define LV_FRAGMENT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" + +#if LV_USE_FRAGMENT + +#include "../../../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_fragment_manager_t lv_fragment_manager_t; + +typedef struct _lv_fragment_t lv_fragment_t; +typedef struct _lv_fragment_class_t lv_fragment_class_t; +typedef struct _lv_fragment_managed_states_t lv_fragment_managed_states_t; + +struct _lv_fragment_t { + /** + * Class of this fragment + */ + const lv_fragment_class_t * cls; + /** + * Managed fragment states. If not null, then this fragment is managed. + * + * @warning Don't modify values inside this struct! + */ + lv_fragment_managed_states_t * managed; + /** + * Child fragment manager + */ + lv_fragment_manager_t * child_manager; + /** + * lv_obj returned by create_obj_cb + */ + lv_obj_t * obj; + +}; + +struct _lv_fragment_class_t { + /** + * Constructor function for fragment class + * @param self Fragment instance + * @param args Arguments assigned by fragment manager + */ + void (*constructor_cb)(lv_fragment_t * self, void * args); + + /** + * Destructor function for fragment class + * @param self Fragment instance, will be freed after this call + */ + void (*destructor_cb)(lv_fragment_t * self); + + /** + * Fragment attached to manager + * @param self Fragment instance + */ + void (*attached_cb)(lv_fragment_t * self); + + /** + * Fragment detached from manager + * @param self Fragment instance + */ + void (*detached_cb)(lv_fragment_t * self); + + /** + * Create objects + * @param self Fragment instance + * @param container Container of the objects should be created upon + * @return Created object, NULL if multiple objects has been created + */ + lv_obj_t * (*create_obj_cb)(lv_fragment_t * self, lv_obj_t * container); + + /** + * + * @param self Fragment instance + * @param obj lv_obj returned by create_obj_cb + */ + void (*obj_created_cb)(lv_fragment_t * self, lv_obj_t * obj); + + /** + * Called before objects in the fragment will be deleted. + * + * @param self Fragment instance + * @param obj object with this fragment + */ + void (*obj_will_delete_cb)(lv_fragment_t * self, lv_obj_t * obj); + + /** + * Called when the object created by fragment received `LV_EVENT_DELETE` event + * @param self Fragment instance + * @param obj object with this fragment + */ + void (*obj_deleted_cb)(lv_fragment_t * self, lv_obj_t * obj); + + /** + * Handle event + * @param self Fragment instance + * @param which User-defined ID of event + * @param data1 User-defined data + * @param data2 User-defined data + */ + bool (*event_cb)(lv_fragment_t * self, int code, void * userdata); + + /** + * *REQUIRED*: Allocation size of fragment + */ + size_t instance_size; +}; + +/** + * Fragment states + */ +typedef struct _lv_fragment_managed_states_t { + /** + * Class of the fragment + */ + const lv_fragment_class_t * cls; + /** + * Manager the fragment attached to + */ + lv_fragment_manager_t * manager; + /** + * Container object the fragment adding view to + */ + lv_obj_t * const * container; + /** + * Fragment instance + */ + lv_fragment_t * instance; + /** + * true between `create_obj_cb` and `obj_deleted_cb` + */ + bool obj_created; + /** + * true before `lv_fragment_del_obj` is called. Don't touch any object if this is true + */ + bool destroying_obj; + /** + * true if this fragment is in navigation stack that can be popped + */ + bool in_stack; +} lv_fragment_managed_states_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create fragment manager instance + * @param parent Parent fragment if this manager is placed inside another fragment, can be null. + * @return Fragment manager instance + */ +lv_fragment_manager_t * lv_fragment_manager_create(lv_fragment_t * parent); + +/** + * Destroy fragment manager instance + * @param manager Fragment manager instance + */ +void lv_fragment_manager_del(lv_fragment_manager_t * manager); + +/** + * Create object of all fragments managed by this manager. + * @param manager Fragment manager instance + */ +void lv_fragment_manager_create_obj(lv_fragment_manager_t * manager); + +/** + * Delete object created by all fragments managed by this manager. Instance of fragments will not be deleted. + * @param manager Fragment manager instance + */ +void lv_fragment_manager_del_obj(lv_fragment_manager_t * manager); + +/** + * Attach fragment to manager, and add to container. + * @param manager Fragment manager instance + * @param fragment Fragment instance + * @param container Pointer to container object for manager to add objects to + */ +void lv_fragment_manager_add(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container); + +/** + * Detach and destroy fragment. If fragment is in navigation stack, remove from it. + * @param manager Fragment manager instance + * @param fragment Fragment instance + */ +void lv_fragment_manager_remove(lv_fragment_manager_t * manager, lv_fragment_t * fragment); + +/** + * Attach fragment to manager and add to navigation stack. + * @param manager Fragment manager instance + * @param fragment Fragment instance + * @param container Pointer to container object for manager to add objects to + */ +void lv_fragment_manager_push(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container); + +/** + * Remove the top-most fragment for stack + * @param manager Fragment manager instance + * @return true if there is fragment to pop + */ +bool lv_fragment_manager_pop(lv_fragment_manager_t * manager); + +/** + * Replace fragment. Old item in the stack will be removed. + * @param manager Fragment manager instance + * @param fragment Fragment instance + * @param container Pointer to container object for manager to add objects to + */ +void lv_fragment_manager_replace(lv_fragment_manager_t * manager, lv_fragment_t * fragment, + lv_obj_t * const * container); + +/** + * Send event to top-most fragment + * @param manager Fragment manager instance + * @param code User-defined ID of event + * @param userdata User-defined data + * @return true if fragment returned true + */ +bool lv_fragment_manager_send_event(lv_fragment_manager_t * manager, int code, void * userdata); + +/** + * Get stack size of this fragment manager + * @param manager Fragment manager instance + * @return Stack size of this fragment manager + */ +size_t lv_fragment_manager_get_stack_size(lv_fragment_manager_t * manager); + +/** + * Get top most fragment instance + * @param manager Fragment manager instance + * @return Top most fragment instance + */ +lv_fragment_t * lv_fragment_manager_get_top(lv_fragment_manager_t * manager); + +/** + * Find first fragment instance in the container + * @param manager Fragment manager instance + * @param container Container which target fragment added to + * @return First fragment instance in the container + */ +lv_fragment_t * lv_fragment_manager_find_by_container(lv_fragment_manager_t * manager, const lv_obj_t * container); + +/** + * Get parent fragment + * @param manager Fragment manager instance + * @return Parent fragment instance + */ +lv_fragment_t * lv_fragment_manager_get_parent_fragment(lv_fragment_manager_t * manager); + + +/** + * Create a fragment instance. + * + * @param cls Fragment class. This fragment must return non null object. + * @param args Arguments assigned by fragment manager + * @return Fragment instance + */ +lv_fragment_t * lv_fragment_create(const lv_fragment_class_t * cls, void * args); + +/** + * Destroy a fragment. + * @param fragment Fragment instance. + */ +void lv_fragment_del(lv_fragment_t * fragment); + +/** + * Get associated manager of this fragment + * @param fragment Fragment instance + * @return Fragment manager instance + */ +lv_fragment_manager_t * lv_fragment_get_manager(lv_fragment_t * fragment); + +/** + * Get container object of this fragment + * @param fragment Fragment instance + * @return Reference to container object + */ +lv_obj_t * const * lv_fragment_get_container(lv_fragment_t * fragment); + +/** + * Get parent fragment of this fragment + * @param fragment Fragment instance + * @return Parent fragment + */ +lv_fragment_t * lv_fragment_get_parent(lv_fragment_t * fragment); + +/** + * Create object by fragment. + * + * @param fragment Fragment instance. + * @param container Container of the objects should be created upon. + * @return Created object + */ +lv_obj_t * lv_fragment_create_obj(lv_fragment_t * fragment, lv_obj_t * container); + +/** + * Delete created object of a fragment + * + * @param fragment Fragment instance. + */ +void lv_fragment_del_obj(lv_fragment_t * fragment); + +/** + * Destroy obj in fragment, and recreate them. + * @param fragment Fragment instance + */ +void lv_fragment_recreate_obj(lv_fragment_t * fragment); + + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_FRAGMENT*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FRAGMENT_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/fragment/lv_fragment_manager.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/fragment/lv_fragment_manager.c new file mode 100644 index 0000000..ade7215 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/fragment/lv_fragment_manager.c @@ -0,0 +1,281 @@ +/** + * @file lv_fragment_manager.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_fragment.h" + +#if LV_USE_FRAGMENT + +#include "../../../misc/lv_ll.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct _lv_fragment_stack_item_t { + lv_fragment_managed_states_t * states; +} lv_fragment_stack_item_t; + +struct _lv_fragment_manager_t { + lv_fragment_t * parent; + /** + * Linked list to store attached fragments + */ + lv_ll_t attached; + /** + * Linked list to store fragments in stack + */ + lv_ll_t stack; +}; + + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void item_create_obj(lv_fragment_managed_states_t * item); + +static void item_del_obj(lv_fragment_managed_states_t * item); + +static void item_del_fragment(lv_fragment_managed_states_t * item); + +static lv_fragment_managed_states_t * fragment_attach(lv_fragment_manager_t * manager, lv_fragment_t * fragment, + lv_obj_t * const * container); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_fragment_manager_t * lv_fragment_manager_create(lv_fragment_t * parent) +{ + lv_fragment_manager_t * instance = lv_mem_alloc(sizeof(lv_fragment_manager_t)); + lv_memset_00(instance, sizeof(lv_fragment_manager_t)); + instance->parent = parent; + _lv_ll_init(&instance->attached, sizeof(lv_fragment_managed_states_t)); + _lv_ll_init(&instance->stack, sizeof(lv_fragment_stack_item_t)); + return instance; +} + +void lv_fragment_manager_del(lv_fragment_manager_t * manager) +{ + LV_ASSERT_NULL(manager); + lv_fragment_managed_states_t * states; + _LV_LL_READ_BACK(&manager->attached, states) { + item_del_obj(states); + item_del_fragment(states); + } + _lv_ll_clear(&manager->attached); + _lv_ll_clear(&manager->stack); + lv_mem_free(manager); +} + +void lv_fragment_manager_create_obj(lv_fragment_manager_t * manager) +{ + LV_ASSERT_NULL(manager); + lv_fragment_stack_item_t * top = _lv_ll_get_tail(&manager->stack); + lv_fragment_managed_states_t * states = NULL; + _LV_LL_READ(&manager->attached, states) { + if(states->in_stack && top->states != states) { + /*Only create obj for top item in stack*/ + continue; + } + item_create_obj(states); + } +} + +void lv_fragment_manager_del_obj(lv_fragment_manager_t * manager) +{ + LV_ASSERT_NULL(manager); + lv_fragment_managed_states_t * states = NULL; + _LV_LL_READ_BACK(&manager->attached, states) { + item_del_obj(states); + } +} + +void lv_fragment_manager_add(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container) +{ + lv_fragment_managed_states_t * states = fragment_attach(manager, fragment, container); + if(!manager->parent || manager->parent->managed->obj_created) { + item_create_obj(states); + } +} + +void lv_fragment_manager_remove(lv_fragment_manager_t * manager, lv_fragment_t * fragment) +{ + LV_ASSERT_NULL(manager); + LV_ASSERT_NULL(fragment); + LV_ASSERT_NULL(fragment->managed); + LV_ASSERT(fragment->managed->manager == manager); + lv_fragment_managed_states_t * states = fragment->managed; + lv_fragment_managed_states_t * prev = NULL; + bool was_top = false; + if(states->in_stack) { + void * stack_top = _lv_ll_get_tail(&manager->stack); + lv_fragment_stack_item_t * item = NULL; + _LV_LL_READ_BACK(&manager->stack, item) { + if(item->states == states) { + was_top = stack_top == item; + void * stack_prev = _lv_ll_get_prev(&manager->stack, item); + if(!stack_prev) break; + prev = ((lv_fragment_stack_item_t *) stack_prev)->states; + break; + } + } + if(item) { + _lv_ll_remove(&manager->stack, item); + lv_mem_free(item); + } + } + item_del_obj(states); + item_del_fragment(states); + _lv_ll_remove(&manager->attached, states); + lv_mem_free(states); + if(prev && was_top) { + item_create_obj(prev); + } +} + +void lv_fragment_manager_push(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container) +{ + lv_fragment_stack_item_t * top = _lv_ll_get_tail(&manager->stack); + if(top != NULL) { + item_del_obj(top->states); + } + lv_fragment_managed_states_t * states = fragment_attach(manager, fragment, container); + states->in_stack = true; + /*Add fragment to the top of the stack*/ + lv_fragment_stack_item_t * item = _lv_ll_ins_tail(&manager->stack); + lv_memset_00(item, sizeof(lv_fragment_stack_item_t)); + item->states = states; + item_create_obj(states); +} + +bool lv_fragment_manager_pop(lv_fragment_manager_t * manager) +{ + lv_fragment_t * top = lv_fragment_manager_get_top(manager); + if(top == NULL) return false; + lv_fragment_manager_remove(manager, top); + return true; +} + +void lv_fragment_manager_replace(lv_fragment_manager_t * manager, lv_fragment_t * fragment, + lv_obj_t * const * container) +{ + lv_fragment_t * top = lv_fragment_manager_find_by_container(manager, *container); + if(top != NULL) { + lv_fragment_manager_remove(manager, top); + } + lv_fragment_manager_add(manager, fragment, container); +} + +bool lv_fragment_manager_send_event(lv_fragment_manager_t * manager, int code, void * userdata) +{ + LV_ASSERT_NULL(manager); + lv_fragment_managed_states_t * p = NULL; + _LV_LL_READ_BACK(&manager->attached, p) { + if(!p->obj_created || p->destroying_obj) continue; + lv_fragment_t * instance = p->instance; + if(!instance) continue; + if(lv_fragment_manager_send_event(instance->child_manager, code, userdata)) return true; + if(p->cls->event_cb && p->cls->event_cb(instance, code, userdata)) return true; + } + return false; +} + +size_t lv_fragment_manager_get_stack_size(lv_fragment_manager_t * manager) +{ + LV_ASSERT_NULL(manager); + return _lv_ll_get_len(&manager->stack); +} + +lv_fragment_t * lv_fragment_manager_get_top(lv_fragment_manager_t * manager) +{ + LV_ASSERT(manager); + lv_fragment_stack_item_t * top = _lv_ll_get_tail(&manager->stack); + if(!top)return NULL; + return top->states->instance; +} + +lv_fragment_t * lv_fragment_manager_find_by_container(lv_fragment_manager_t * manager, const lv_obj_t * container) +{ + LV_ASSERT(manager); + lv_fragment_managed_states_t * states; + _LV_LL_READ(&manager->attached, states) { + if(*states->container == container) return states->instance; + } + return NULL; +} + +lv_fragment_t * lv_fragment_manager_get_parent_fragment(lv_fragment_manager_t * manager) +{ + LV_ASSERT_NULL(manager); + return manager->parent; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void item_create_obj(lv_fragment_managed_states_t * item) +{ + LV_ASSERT(item->instance); + lv_fragment_create_obj(item->instance, item->container ? *item->container : NULL); +} + +static void item_del_obj(lv_fragment_managed_states_t * item) +{ + lv_fragment_del_obj(item->instance); +} + +/** + * Detach, then destroy fragment + * @param item fragment states + */ +static void item_del_fragment(lv_fragment_managed_states_t * item) +{ + lv_fragment_t * instance = item->instance; + if(instance->cls->detached_cb) { + instance->cls->detached_cb(instance); + } + instance->managed = NULL; + lv_fragment_del(instance); + item->instance = NULL; +} + + +static lv_fragment_managed_states_t * fragment_attach(lv_fragment_manager_t * manager, lv_fragment_t * fragment, + lv_obj_t * const * container) +{ + LV_ASSERT(manager); + LV_ASSERT(fragment); + LV_ASSERT(fragment->managed == NULL); + lv_fragment_managed_states_t * states = _lv_ll_ins_tail(&manager->attached); + lv_memset_00(states, sizeof(lv_fragment_managed_states_t)); + states->cls = fragment->cls; + states->manager = manager; + states->container = container; + states->instance = fragment; + fragment->managed = states; + if(fragment->cls->attached_cb) { + fragment->cls->attached_cb(fragment); + } + return states; +} + +#endif /*LV_USE_FRAGMENT*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/gridnav/lv_gridnav.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/gridnav/lv_gridnav.c new file mode 100644 index 0000000..4eec637 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/gridnav/lv_gridnav.c @@ -0,0 +1,375 @@ +/** + * @file lv_gridnav.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_gridnav.h" +#if LV_USE_GRIDNAV + +#include "../../../misc/lv_assert.h" +#include "../../../misc/lv_math.h" +#include "../../../core/lv_indev.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_gridnav_ctrl_t ctrl; + lv_obj_t * focused_obj; +} lv_gridnav_dsc_t; + +typedef enum { + FIND_LEFT, + FIND_RIGHT, + FIND_TOP, + FIND_BOTTOM, + FIND_NEXT_ROW_FIRST_ITEM, + FIND_PREV_ROW_LAST_ITEM, + FIND_FIRST_ROW, + FIND_LAST_ROW, +} find_mode_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void gridnav_event_cb(lv_event_t * e); +static lv_obj_t * find_chid(lv_obj_t * obj, lv_obj_t * start_child, find_mode_t mode); +static lv_obj_t * find_first_focusable(lv_obj_t * obj); +static lv_obj_t * find_last_focusable(lv_obj_t * obj); +static bool obj_is_focuable(lv_obj_t * obj); +static lv_coord_t get_x_center(lv_obj_t * obj); +static lv_coord_t get_y_center(lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_gridnav_add(lv_obj_t * obj, lv_gridnav_ctrl_t ctrl) +{ + lv_gridnav_remove(obj); /*Be sure to not add gridnav twice*/ + + lv_gridnav_dsc_t * dsc = lv_mem_alloc(sizeof(lv_gridnav_dsc_t)); + LV_ASSERT_MALLOC(dsc); + dsc->ctrl = ctrl; + dsc->focused_obj = NULL; + lv_obj_add_event_cb(obj, gridnav_event_cb, LV_EVENT_ALL, dsc); + + lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLL_WITH_ARROW); +} + +void lv_gridnav_remove(lv_obj_t * obj) +{ + lv_gridnav_dsc_t * dsc = lv_obj_get_event_user_data(obj, gridnav_event_cb); + if(dsc == NULL) return; /* no gridnav on this object */ + + lv_mem_free(dsc); + lv_obj_remove_event_cb(obj, gridnav_event_cb); +} + +void lv_gridnav_set_focused(lv_obj_t * cont, lv_obj_t * to_focus, lv_anim_enable_t anim_en) +{ + LV_ASSERT_NULL(to_focus); + lv_gridnav_dsc_t * dsc = lv_obj_get_event_user_data(cont, gridnav_event_cb); + if(dsc == NULL) { + LV_LOG_WARN("`cont` is not a gridnav container"); + return; + } + + if(obj_is_focuable(to_focus) == false) { + LV_LOG_WARN("The object to focus is not focusable"); + return; + } + + lv_obj_clear_state(dsc->focused_obj, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); + lv_obj_add_state(to_focus, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); + lv_obj_scroll_to_view(to_focus, anim_en); + dsc->focused_obj = to_focus; + +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void gridnav_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_gridnav_dsc_t * dsc = lv_event_get_user_data(e); + lv_event_code_t code = lv_event_get_code(e); + + if(code == LV_EVENT_KEY) { + uint32_t child_cnt = lv_obj_get_child_cnt(obj); + if(child_cnt == 0) return; + + if(dsc->focused_obj == NULL) dsc->focused_obj = find_first_focusable(obj); + if(dsc->focused_obj == NULL) return; + + uint32_t key = lv_event_get_key(e); + lv_obj_t * guess = NULL; + + if(key == LV_KEY_RIGHT) { + if((dsc->ctrl & LV_GRIDNAV_CTRL_SCROLL_FIRST) && lv_obj_has_flag(dsc->focused_obj, LV_OBJ_FLAG_SCROLLABLE) && + lv_obj_get_scroll_right(dsc->focused_obj) > 0) { + lv_coord_t d = lv_obj_get_width(dsc->focused_obj) / 4; + if(d <= 0) d = 1; + lv_obj_scroll_by_bounded(dsc->focused_obj, -d, 0, LV_ANIM_ON); + } + else { + guess = find_chid(obj, dsc->focused_obj, FIND_RIGHT); + if(guess == NULL) { + if(dsc->ctrl & LV_GRIDNAV_CTRL_ROLLOVER) { + guess = find_chid(obj, dsc->focused_obj, FIND_NEXT_ROW_FIRST_ITEM); + if(guess == NULL) guess = find_first_focusable(obj); + } + else { + lv_group_focus_next(lv_obj_get_group(obj)); + } + } + } + } + else if(key == LV_KEY_LEFT) { + if((dsc->ctrl & LV_GRIDNAV_CTRL_SCROLL_FIRST) && lv_obj_has_flag(dsc->focused_obj, LV_OBJ_FLAG_SCROLLABLE) && + lv_obj_get_scroll_left(dsc->focused_obj) > 0) { + lv_coord_t d = lv_obj_get_width(dsc->focused_obj) / 4; + if(d <= 0) d = 1; + lv_obj_scroll_by_bounded(dsc->focused_obj, d, 0, LV_ANIM_ON); + } + else { + guess = find_chid(obj, dsc->focused_obj, FIND_LEFT); + if(guess == NULL) { + if(dsc->ctrl & LV_GRIDNAV_CTRL_ROLLOVER) { + guess = find_chid(obj, dsc->focused_obj, FIND_PREV_ROW_LAST_ITEM); + if(guess == NULL) guess = find_last_focusable(obj); + } + else { + lv_group_focus_prev(lv_obj_get_group(obj)); + } + } + } + } + else if(key == LV_KEY_DOWN) { + if((dsc->ctrl & LV_GRIDNAV_CTRL_SCROLL_FIRST) && lv_obj_has_flag(dsc->focused_obj, LV_OBJ_FLAG_SCROLLABLE) && + lv_obj_get_scroll_bottom(dsc->focused_obj) > 0) { + lv_coord_t d = lv_obj_get_height(dsc->focused_obj) / 4; + if(d <= 0) d = 1; + lv_obj_scroll_by_bounded(dsc->focused_obj, 0, -d, LV_ANIM_ON); + } + else { + guess = find_chid(obj, dsc->focused_obj, FIND_BOTTOM); + if(guess == NULL) { + if(dsc->ctrl & LV_GRIDNAV_CTRL_ROLLOVER) { + guess = find_chid(obj, dsc->focused_obj, FIND_FIRST_ROW); + } + else { + lv_group_focus_next(lv_obj_get_group(obj)); + } + } + } + } + else if(key == LV_KEY_UP) { + if((dsc->ctrl & LV_GRIDNAV_CTRL_SCROLL_FIRST) && lv_obj_has_flag(dsc->focused_obj, LV_OBJ_FLAG_SCROLLABLE) && + lv_obj_get_scroll_top(dsc->focused_obj) > 0) { + lv_coord_t d = lv_obj_get_height(dsc->focused_obj) / 4; + if(d <= 0) d = 1; + lv_obj_scroll_by_bounded(dsc->focused_obj, 0, d, LV_ANIM_ON); + } + else { + guess = find_chid(obj, dsc->focused_obj, FIND_TOP); + if(guess == NULL) { + if(dsc->ctrl & LV_GRIDNAV_CTRL_ROLLOVER) { + guess = find_chid(obj, dsc->focused_obj, FIND_LAST_ROW); + } + else { + lv_group_focus_prev(lv_obj_get_group(obj)); + } + } + } + } + else { + if(lv_group_get_focused(lv_obj_get_group(obj)) == obj) { + lv_event_send(dsc->focused_obj, LV_EVENT_KEY, &key); + } + } + + if(guess && guess != dsc->focused_obj) { + lv_obj_clear_state(dsc->focused_obj, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); + lv_obj_add_state(guess, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); + lv_obj_scroll_to_view(guess, LV_ANIM_ON); + dsc->focused_obj = guess; + } + } + else if(code == LV_EVENT_FOCUSED) { + if(dsc->focused_obj == NULL) dsc->focused_obj = find_first_focusable(obj); + if(dsc->focused_obj) { + lv_obj_add_state(dsc->focused_obj, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); + lv_obj_scroll_to_view(dsc->focused_obj, LV_ANIM_OFF); + } + } + else if(code == LV_EVENT_DEFOCUSED) { + if(dsc->focused_obj) { + lv_obj_clear_state(dsc->focused_obj, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); + } + } + else if(code == LV_EVENT_CHILD_CREATED) { + lv_obj_t * child = lv_event_get_target(e); + if(lv_obj_get_parent(child) == obj) { + if(dsc->focused_obj == NULL) { + dsc->focused_obj = child; + if(lv_obj_has_state(obj, LV_STATE_FOCUSED)) { + lv_obj_add_state(child, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); + lv_obj_scroll_to_view(child, LV_ANIM_OFF); + } + } + } + } + else if(code == LV_EVENT_CHILD_DELETED) { + /*This event bubble, so be sure this object's child was deleted. + *As we don't know which object was deleted we can't make the next focused. + *So make the first object focused*/ + lv_obj_t * target = lv_event_get_target(e); + if(target == obj) { + dsc->focused_obj = find_first_focusable(obj); + } + } + else if(code == LV_EVENT_DELETE) { + lv_gridnav_remove(obj); + } + else if(code == LV_EVENT_PRESSED || code == LV_EVENT_PRESSING || code == LV_EVENT_PRESS_LOST || + code == LV_EVENT_LONG_PRESSED || code == LV_EVENT_LONG_PRESSED_REPEAT || + code == LV_EVENT_CLICKED || code == LV_EVENT_RELEASED) { + if(lv_group_get_focused(lv_obj_get_group(obj)) == obj) { + /*Forward press/release related event too*/ + lv_indev_type_t t = lv_indev_get_type(lv_indev_get_act()); + if(t == LV_INDEV_TYPE_ENCODER || t == LV_INDEV_TYPE_KEYPAD) { + lv_event_send(dsc->focused_obj, code, lv_indev_get_act()); + } + } + } +} + +static lv_obj_t * find_chid(lv_obj_t * obj, lv_obj_t * start_child, find_mode_t mode) +{ + lv_coord_t x_start = get_x_center(start_child); + lv_coord_t y_start = get_y_center(start_child); + uint32_t child_cnt = lv_obj_get_child_cnt(obj); + lv_obj_t * guess = NULL; + lv_coord_t x_err_guess = LV_COORD_MAX; + lv_coord_t y_err_guess = LV_COORD_MAX; + lv_coord_t h_half = lv_obj_get_height(start_child) / 2; + lv_coord_t h_max = lv_obj_get_height(obj) + lv_obj_get_scroll_top(obj) + lv_obj_get_scroll_bottom(obj); + uint32_t i; + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = lv_obj_get_child(obj, i); + if(child == start_child) continue; + if(obj_is_focuable(child) == false) continue; + + lv_coord_t x_err = 0; + lv_coord_t y_err = 0; + switch(mode) { + case FIND_LEFT: + x_err = get_x_center(child) - x_start; + y_err = get_y_center(child) - y_start; + if(x_err >= 0) continue; /*It's on the right*/ + if(LV_ABS(y_err) > h_half) continue; /*Too far*/ + break; + case FIND_RIGHT: + x_err = get_x_center(child) - x_start; + y_err = get_y_center(child) - y_start; + if(x_err <= 0) continue; /*It's on the left*/ + if(LV_ABS(y_err) > h_half) continue; /*Too far*/ + break; + case FIND_TOP: + x_err = get_x_center(child) - x_start; + y_err = get_y_center(child) - y_start; + if(y_err >= 0) continue; /*It's on the bottom*/ + break; + case FIND_BOTTOM: + x_err = get_x_center(child) - x_start; + y_err = get_y_center(child) - y_start; + if(y_err <= 0) continue; /*It's on the top*/ + break; + case FIND_NEXT_ROW_FIRST_ITEM: + y_err = get_y_center(child) - y_start; + if(y_err <= 0) continue; /*It's on the top*/ + x_err = lv_obj_get_x(child); + break; + case FIND_PREV_ROW_LAST_ITEM: + y_err = get_y_center(child) - y_start; + if(y_err >= 0) continue; /*It's on the bottom*/ + x_err = obj->coords.x2 - child->coords.x2; + break; + case FIND_FIRST_ROW: + x_err = get_x_center(child) - x_start; + y_err = lv_obj_get_y(child); + break; + case FIND_LAST_ROW: + x_err = get_x_center(child) - x_start; + y_err = h_max - lv_obj_get_y(child); + } + + if(guess == NULL || + (y_err * y_err + x_err * x_err < y_err_guess * y_err_guess + x_err_guess * x_err_guess)) { + guess = child; + x_err_guess = x_err; + y_err_guess = y_err; + } + } + return guess; +} + +static lv_obj_t * find_first_focusable(lv_obj_t * obj) +{ + uint32_t child_cnt = lv_obj_get_child_cnt(obj); + uint32_t i; + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = lv_obj_get_child(obj, i); + if(obj_is_focuable(child)) return child; + + } + return NULL; +} + +static lv_obj_t * find_last_focusable(lv_obj_t * obj) +{ + uint32_t child_cnt = lv_obj_get_child_cnt(obj); + int32_t i; + for(i = child_cnt - 1; i >= 0; i--) { + lv_obj_t * child = lv_obj_get_child(obj, i); + if(obj_is_focuable(child)) return child; + } + return NULL; +} + +static bool obj_is_focuable(lv_obj_t * obj) +{ + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return false; + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_CLICKABLE | LV_OBJ_FLAG_CLICK_FOCUSABLE)) return true; + else return false; +} + +static lv_coord_t get_x_center(lv_obj_t * obj) +{ + return obj->coords.x1 + lv_area_get_width(&obj->coords) / 2; +} + +static lv_coord_t get_y_center(lv_obj_t * obj) +{ + return obj->coords.y1 + lv_area_get_height(&obj->coords) / 2; +} + +#endif /*LV_USE_GRIDNAV*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/gridnav/lv_gridnav.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/gridnav/lv_gridnav.h new file mode 100644 index 0000000..f480ded --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/gridnav/lv_gridnav.h @@ -0,0 +1,123 @@ +/** + * @file lv_templ.c + * + */ + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*This typedef exists purely to keep -Wpedantic happy when the file is empty.*/ +/*It can be removed.*/ +typedef int _keep_pedantic_happy; + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ +/** + * @file lv_gridnav.h + * + */ + +#ifndef LV_GRIDFOCUS_H +#define LV_GRIDFOCUS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../core/lv_obj.h" + +#if LV_USE_GRIDNAV + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef enum { + LV_GRIDNAV_CTRL_NONE = 0x0, + + /** + * If there is no next/previous object in a direction, + * the focus goes to the object in the next/previous row (on left/right keys) + * or first/last row (on up/down keys) + */ + LV_GRIDNAV_CTRL_ROLLOVER = 0x1, + + /** + * If an arrow is pressed and the focused object can be scrolled in that direction + * then it will be scrolled instead of going to the next/previous object. + * If there is no more room for scrolling the next/previous object will be focused normally */ + LV_GRIDNAV_CTRL_SCROLL_FIRST = 0x2, + +} lv_gridnav_ctrl_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Add grid navigation feature to an object. It expects the children to be arranged + * into a grid-like layout. Although it's not required to have pixel perfect alignment. + * This feature makes possible to use keys to navigate among the children and focus them. + * The keys other than arrows and press/release related events + * are forwarded to the focused child. + * @param obj pointer to an object on which navigation should be applied. + * @param ctrl control flags from `lv_gridnav_ctrl_t`. + */ +void lv_gridnav_add(lv_obj_t * obj, lv_gridnav_ctrl_t ctrl); + +/** + * Remove the grid navigation support from an object + * @param obj pointer to an object + */ +void lv_gridnav_remove(lv_obj_t * obj); + +/** + * Manually focus an object on gridnav container + * @param cont pointer to a gridnav container + * @param to_focus pointer to an object to focus + * @param anim_en LV_ANIM_ON/OFF + */ +void lv_gridnav_set_focused(lv_obj_t * cont, lv_obj_t * to_focus, lv_anim_enable_t anim_en); + +/********************** + * MACROS + **********************/ +#endif /*LV_USE_GRIDNAV*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GRIDFOCUS_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/ime/lv_ime_pinyin.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/ime/lv_ime_pinyin.c new file mode 100644 index 0000000..b1661e4 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/ime/lv_ime_pinyin.c @@ -0,0 +1,1198 @@ +/** + * @file lv_ime_pinyin.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_ime_pinyin.h" +#if LV_USE_IME_PINYIN != 0 + +#include + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_ime_pinyin_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_ime_pinyin_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_ime_pinyin_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_ime_pinyin_style_change_event(lv_event_t * e); +static void lv_ime_pinyin_kb_event(lv_event_t * e); +static void lv_ime_pinyin_cand_panel_event(lv_event_t * e); + +static void init_pinyin_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict); +static void pinyin_input_proc(lv_obj_t * obj); +static void pinyin_page_proc(lv_obj_t * obj, uint16_t btn); +static char * pinyin_search_matching(lv_obj_t * obj, char * py_str, uint16_t * cand_num); +static void pinyin_ime_clear_data(lv_obj_t * obj); + +#if LV_IME_PINYIN_USE_K9_MODE + static void pinyin_k9_init_data(lv_obj_t * obj); + static void pinyin_k9_get_legal_py(lv_obj_t * obj, char * k9_input, const char * py9_map[]); + static bool pinyin_k9_is_valid_py(lv_obj_t * obj, char * py_str); + static void pinyin_k9_fill_cand(lv_obj_t * obj); + static void pinyin_k9_cand_page_proc(lv_obj_t * obj, uint16_t dir); +#endif + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_ime_pinyin_class = { + .constructor_cb = lv_ime_pinyin_constructor, + .destructor_cb = lv_ime_pinyin_destructor, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .instance_size = sizeof(lv_ime_pinyin_t), + .base_class = &lv_obj_class +}; + +#if LV_IME_PINYIN_USE_K9_MODE +static char * lv_btnm_def_pinyin_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 20] = {\ + ",\0", "1#\0", "abc \0", "def\0", LV_SYMBOL_BACKSPACE"\0", "\n\0", + ".\0", "ghi\0", "jkl\0", "mno\0", LV_SYMBOL_KEYBOARD"\0", "\n\0", + "?\0", "pqrs\0", "tuv\0", "wxyz\0", LV_SYMBOL_NEW_LINE"\0", "\n\0", + LV_SYMBOL_LEFT"\0", "\0" + }; + +static lv_btnmatrix_ctrl_t default_kb_ctrl_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 16] = { 1 }; +static char lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 2][LV_IME_PINYIN_K9_MAX_INPUT] = {0}; +#endif + +static char lv_pinyin_cand_str[LV_IME_PINYIN_CAND_TEXT_NUM][4]; +static char * lv_btnm_def_pinyin_sel_map[LV_IME_PINYIN_CAND_TEXT_NUM + 3]; + +#if LV_IME_PINYIN_USE_DEFAULT_DICT +lv_pinyin_dict_t lv_ime_pinyin_def_dict[] = { + { "a", "啊" }, + { "ai", "æ„›" }, + { "an", "安暗案" }, + { "ba", "å§æŠŠçˆ¸å…«" }, + { "bai", "百白敗" }, + { "ban", "åŠèˆ¬è¾¦" }, + { "bang", "æ—" }, + { "bao", "ä¿è–„包報" }, + { "bei", "被背悲北æ¯å‚™" }, + { "ben", "本" }, + { "bi", "必比é¿é¼»å½¼ç­†ç§˜é–‰" }, + { "bian", "便邊變変辺" }, + { "biao", "表標" }, + { "bie", "別" }, + { "bing", "病並氷" }, + { "bo", "波薄泊" }, + { "bu", "ä¸å¸ƒæ­¥éƒ¨æ•補歩" }, + { "ca", "察" }, + { "cai", "æ‰æèœè²¡æŽ¡" }, + { "can", "傿®‹åƒ" }, + { "ce", "ç­–å´" }, + { "ceng", "曾" }, + { "cha", "差查茶" }, + { "chai", "å·®" }, + { "chan", "產産單" }, + { "chang", "å ´å» " }, + { "chao", "è¶…æœ" }, + { "che", "車" }, + { "cheng", "æˆç¨‹ä¹—" }, + { "chi", "å°ºåƒæŒèµ¤æ± é…æ­¯" }, + { "chong", "å……ç§é‡ç¨®" }, + { "chu", "å‡ºåˆæ¥šè§¦è™•処" }, + { "chuan", "å·èˆ¹å‚³" }, + { "chuang", "創窓" }, + { "chun", "春" }, + { "ci", "此次辞差" }, + { "cong", "從従" }, + { "cu", "å’" }, + { "cun", "å­˜æ‘" }, + { "cuo", "錯" }, + { "da", "大打答é”" }, + { "dai", "代待帯帶貸" }, + { "dan", "但担擔誕單å˜" }, + { "dang", "当党當黨" }, + { "dao", "到é“盗導島辺" }, + { "de", "的得" }, + { "dei", "" }, + { "deng", "ç­‰" }, + { "di", "地得低底弟第締" }, + { "dian", "点电店點電" }, + { "diao", "調" }, + { "ding", "定町" }, + { "dong", "冬æ±å‹•åƒå‡" }, + { "du", "独度都渡読" }, + { "duan", "段断短斷" }, + { "dui", "å°å¯¾" }, + { "duo", "多駄" }, + { "e", "嗯悪" }, + { "en", "å—¯" }, + { "er", "而耳二兒" }, + { "fa", "乿³•發発髪" }, + { "fan", "å返犯番仮販飯範払" }, + { "fang", "方放房åŠè¨ª" }, + { "fei", "éžé£›è²»" }, + { "fen", "分份" }, + { "feng", "風è±" }, + { "fou", "å¦ä¸" }, + { "fu", "父夫富æœç¬¦ä»˜é™„府幅婦復複負払" }, + { "gai", "改概該" }, + { "gan", "甘感敢" }, + { "gang", "港剛" }, + { "gao", "告高" }, + { "ge", "儿 ¼æ­Œé©å‰²å€‹" }, + { "gei", "給" }, + { "gen", "è·Ÿæ ¹" }, + { "geng", "æ›´" }, + { "gong", "工共供功公" }, + { "gou", "夠構æº" }, + { "gu", "夿•…鼓" }, + { "guai", "掛" }, + { "guan", "官管慣館觀関關" }, + { "guang", "光広" }, + { "gui", "è¦å¸°" }, + { "guo", "果国è£è“國éŽ" }, + { "hai", "孩海害還" }, + { "han", "寒漢" }, + { "hang", "航行" }, + { "hao", "好å·" }, + { "he", "åˆå’Œå–何è·" }, + { "hei", "é»’" }, + { "hen", "很" }, + { "heng", "行横" }, + { "hou", "厚喉候後" }, + { "hu", "乎呼湖護" }, + { "hua", "化画花話畫劃" }, + { "huai", "壊劃" }, + { "huan", "ç·©ç’°æ­¡é‚„æ›" }, + { "huang", "黄" }, + { "hui", "å›žä¼šæ…§çµµæ®æœƒ" }, + { "hun", "混婚" }, + { "huo", "活或ç«ç²" }, + { "i", "" }, + { "ji", "å·±è®¡åŠæœºæ—¢æ€¥å­£å¯„技å³é›†åŸºç¥­ç³»å¥‡ç´€ç©è¨ˆè¨˜æ¸ˆå¹¾é𛿥µç¹¼ç¸¾æ©Ÿæ¿Ÿ" }, + { "jia", "家加價" }, + { "jian", "件建å¥è‚©è¦‹æ¸›é–“検簡漸" }, + { "jiang", "é™å¼·è¬›å°‡æ¸¯" }, + { "jiao", "嫿•™äº¤è§’覚覺較學" }, + { "jie", "介借接å§çš†å±Šç•Œè§£çµéšŽç¯€åƒ¹" }, + { "jin", "今近ç¦é‡‘僅進" }, + { "jing", "京境景é™ç²¾ç¶“経" }, + { "jiu", "就久ä¹é…’ç©¶" }, + { "ju", "å¥å…·å±€å±…決挙據舉" }, + { "jue", "角覚覺" }, + { "jun", "å‡" }, + { "kai", "é–‹" }, + { "kan", "看刊" }, + { "kang", "康" }, + { "kao", "考" }, + { "ke", "å¯åˆ»ç§‘克客渇課" }, + { "ken", "肯" }, + { "kong", "空控" }, + { "kou", "å£" }, + { "ku", "苦庫" }, + { "kuai", "快塊会會" }, + { "kuang", "æ³" }, + { "kun", "å›°" }, + { "kuo", "括拡é©" }, + { "la", "拉啦è½" }, + { "lai", "æ¥ä¾†é ¼" }, + { "lao", "è€çµ¡è½" }, + { "le", "了楽樂" }, + { "lei", "類" }, + { "leng", "冷" }, + { "li", "力立利ç†ä¾‹ç¤¼é›¢éº—裡勵歷" }, + { "lian", "連練臉è¯" }, + { "liang", "è‰¯é‡æ¶¼å…©ä¸¡" }, + { "liao", "æ–™" }, + { "lie", "列" }, + { "lin", "林隣賃" }, + { "ling", "å¦ä»¤é ˜" }, + { "liu", "å…­ç•™æµ" }, + { "lu", "律路録緑陸履慮" }, + { "lv", "æ—…" }, + { "lun", "輪論" }, + { "luo", "è½çµ¡" }, + { "ma", "媽嗎嘛" }, + { "mai", "買売" }, + { "man", "滿" }, + { "mang", "å¿™" }, + { "mao", "毛猫貿" }, + { "me", "麼" }, + { "mei", "ç¾Žå¦¹æ¯æ²’毎媒" }, + { "men", "們" }, + { "mi", "米密秘" }, + { "mian", "å…é¢å‹‰çœ " }, + { "miao", "æ" }, + { "min", "æ°‘çš¿" }, + { "ming", "命明å" }, + { "mo", "末模麼" }, + { "mou", "æŸ" }, + { "mu", "æ¯æœ¨ç›®æ¨¡" }, + { "na", "那哪拿內å—" }, + { "nan", "ç”·å—難" }, + { "nao", "è…¦" }, + { "ne", "那哪呢" }, + { "nei", "内那哪內" }, + { "neng", "能" }, + { "ni", "你妳呢" }, + { "nian", "年念" }, + { "niang", "娘" }, + { "nin", "您" }, + { "ning", "å‡" }, + { "niu", "牛" }, + { "nong", "農濃" }, + { "nu", "女努" }, + { "nuan", "æš–" }, + { "o", "" }, + { "ou", "æ­" }, + { "pa", "怕" }, + { "pian", "片便" }, + { "pai", "迫派排" }, + { "pan", "判番" }, + { "pang", "æ—" }, + { "pei", "é…" }, + { "peng", "朋" }, + { "pi", "ç–²å¦" }, + { "pin", "å“è²§" }, + { "ping", "平評" }, + { "po", "迫破泊頗" }, + { "pu", "普僕" }, + { "qi", "起其奇七气期泣ä¼å¦»å¥‘æ°—" }, + { "qian", "嵌浅åƒå‰é‰›éŒ¢é‡" }, + { "qiang", "å¼·å°‡" }, + { "qiao", "æ©‹ç¹°" }, + { "qie", "且切契" }, + { "qin", "å¯å‹¤è¦ª" }, + { "qing", "é’æ¸…情晴輕頃請軽" }, + { "qiu", "求秋çƒ" }, + { "qu", "去å–趣曲å€" }, + { "quan", "全犬券" }, + { "que", "缺確å»" }, + { "ran", "ç„¶" }, + { "rang", "讓" }, + { "re", "熱" }, + { "ren", "人任èª" }, + { "reng", "ä»" }, + { "ri", "æ—¥" }, + { "rong", "容" }, + { "rou", "弱若肉" }, + { "ru", "如入" }, + { "ruan", "軟" }, + { "sai", "è³½" }, + { "san", "三" }, + { "sao", "騒繰" }, + { "se", "色" }, + { "sen", "森" }, + { "sha", "ç ‚" }, + { "shan", "善山單" }, + { "shang", "上尚商" }, + { "shao", "å°‘ç´¹" }, + { "shaung", "é›™" }, + { "she", "ç¤¾å°„è¨­æ¨æ¸‰" }, + { "shei", "誰" }, + { "shen", "什申深甚身伸沈神" }, + { "sheng", "生声昇å‹ä¹—è²" }, + { "shi", "是失示食时事å¼å石施使世实å²å®¤å¸‚始柿æ°å£«ä»•拭時視師試é©å®Ÿå¯¦è­˜" }, + { "shou", "æ‰‹é¦–å®ˆå—æŽˆ" }, + { "shu", "æŸæ•°æš‘殊樹書屬輸術" }, + { "shui", "水説說誰" }, + { "shuo", "数説說" }, + { "si", "æ€å¯ºå¸å››ç§ä¼¼æ­»ä¾¡" }, + { "song", "é€" }, + { "su", "速宿素蘇訴" }, + { "suan", "ç®—é…¸" }, + { "sui", "隨雖歲歳" }, + { "sun", "å­«" }, + { "suo", "所" }, + { "ta", "她他它牠" }, + { "tai", "å¤ªå°æ…‹è‡º" }, + { "tan", "探談曇" }, + { "tang", "ç³–" }, + { "tao", "桃逃套討" }, + { "te", "特" }, + { "ti", "ä½“ææ›¿é¡Œé«”戻" }, + { "tian", "天田" }, + { "tiao", "æ¡æ¢èª¿" }, + { "tie", "鉄" }, + { "ting", "åœåº­è½ç”º" }, + { "tong", "åŒç«¥é€šç—›ç»Ÿçµ±" }, + { "tou", "投é€é ­" }, + { "tu", "土徒茶図" }, + { "tuan", "團" }, + { "tui", "推退" }, + { "tuo", "脱駄" }, + { "u", "" }, + { "v", "" }, + { "wai", "外" }, + { "wan", "完万玩晩腕ç£" }, + { "wang", "忘望亡往網" }, + { "wei", "å±ä½æœªå‘³å§”為謂維é•åœ" }, + { "wen", "文温å•èž" }, + { "wo", "我" }, + { "wu", "åˆç‰©äº”無屋亡鳥務汚" }, + { "xi", "夕æ¯è¥¿æ´—喜系昔席希æžå¬‰è†ç´°ç¿’ä¿‚" }, + { "xia", "下å¤ç‹­æš‡" }, + { "xian", "å…ˆé™å«Œæ´—ç¾è¦‹ç·šé¡¯" }, + { "xiang", "å‘ç›¸é¦™åƒæƒ³è±¡é™é …詳響" }, + { "xiao", "å°ç¬‘消效校削咲" }, + { "xie", "写æºäº›è§£é‚ªæ¢°å”è¬å¯«å¥‘" }, + { "xin", "心信新辛" }, + { "xing", "行形性幸型星興" }, + { "xiong", "兄胸" }, + { "xiu", "休秀修" }, + { "xu", "須需許續緒続" }, + { "xuan", "鏿‡¸" }, + { "xue", "学雪削é´å­¸" }, + { "xun", "訓訊" }, + { "ya", "呀押壓" }, + { "yan", "言顔研煙嚴厳験驗塩" }, + { "yang", "央洋陽樣様" }, + { "yao", "è¦æºè…°è–¬æ›œ" }, + { "ye", "也野夜邪業葉" }, + { "yi", "一已亦ä¾ä»¥ç§»æ„医易伊役異億義議è—醫訳" }, + { "yin", "因引音飲銀" }, + { "ying", "英迎影映應營営" }, + { "yong", "永用泳æ“" }, + { "you", "åˆæœ‰å³å‹ç”±å°¤æ²¹éŠéƒµèª˜å„ª" }, + { "yu", "予育余雨浴欲愈御宇域語於魚與込" }, + { "yuan", "元原æºé™¢å“¡å††åœ’é çŒ¿é¡˜" }, + { "yue", "月越約楽" }, + { "yun", "雲ä¼é‹" }, + { "za", "雑" }, + { "zai", "在å†è¼‰ç½" }, + { "zang", "蔵" }, + { "zao", "早造" }, + { "ze", "則擇責" }, + { "zen", "怎" }, + { "zeng", "曾增増" }, + { "zha", "札" }, + { "zhai", "宅擇" }, + { "zhan", "站展戰戦" }, + { "zhang", "丈長障帳張" }, + { "zhao", "æ‰¾ç€æœæ‹›" }, + { "zhe", "者這" }, + { "zhen", "真震é‡" }, + { "zheng", "正整争政爭" }, + { "zhi", "之åªçŸ¥æ”¯æ­¢åˆ¶è‡³æ²»ç›´æŒ‡å€¼ç½®æ™ºå€¤ç´™è£½è³ªèªŒç¹”隻識è·åŸ·" }, + { "zhong", "中ç§çµ‚é‡ç¨®çœ¾" }, + { "zhou", "周州昼宙洲週" }, + { "zhu", "åŠ©ä¸»ä½æŸ±æ ªç¥é€æ³¨è‘—諸屬術" }, + { "zhuan", "专專転" }, + { "zhuang", "状狀" }, + { "zhui", "追" }, + { "zhun", "準" }, + { "zhuo", "ç€" }, + { "zi", "å­è‡ªå­—姉資" }, + { "zong", "總" }, + { "zuo", "å·¦åšæ˜¨å座作" }, + { "zu", "足祖æ—å’組" }, + { "zui", "最酔" }, + { "zou", "èµ°" }, + {NULL, NULL} +}; +#endif + + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +lv_obj_t * lv_ime_pinyin_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the keyboard of Pinyin input method. + * @param obj pointer to a Pinyin input method object + * @param dict pointer to a Pinyin input method keyboard + */ +void lv_ime_pinyin_set_keyboard(lv_obj_t * obj, lv_obj_t * kb) +{ + if(kb) { + LV_ASSERT_OBJ(kb, &lv_keyboard_class); + } + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + pinyin_ime->kb = kb; + lv_obj_add_event_cb(pinyin_ime->kb, lv_ime_pinyin_kb_event, LV_EVENT_VALUE_CHANGED, obj); + lv_obj_align_to(pinyin_ime->cand_panel, pinyin_ime->kb, LV_ALIGN_OUT_TOP_MID, 0, 0); +} + +/** + * Set the dictionary of Pinyin input method. + * @param obj pointer to a Pinyin input method object + * @param dict pointer to a Pinyin input method dictionary + */ +void lv_ime_pinyin_set_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + init_pinyin_dict(obj, dict); +} + +/** + * Set mode, 26-key input(k26) or 9-key input(k9). + * @param obj pointer to a Pinyin input method object + * @param mode the mode from 'lv_keyboard_mode_t' + */ +void lv_ime_pinyin_set_mode(lv_obj_t * obj, lv_ime_pinyin_mode_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + LV_ASSERT_OBJ(pinyin_ime->kb, &lv_keyboard_class); + + pinyin_ime->mode = mode; + +#if LV_IME_PINYIN_USE_K9_MODE + if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) { + pinyin_k9_init_data(obj); + lv_keyboard_set_map(pinyin_ime->kb, LV_KEYBOARD_MODE_USER_1, (const char *)lv_btnm_def_pinyin_k9_map, + (const)default_kb_ctrl_k9_map); + lv_keyboard_set_mode(pinyin_ime->kb, LV_KEYBOARD_MODE_USER_1); + } +#endif +} + +/*===================== + * Getter functions + *====================*/ + +/** + * Set the dictionary of Pinyin input method. + * @param obj pointer to a Pinyin IME object + * @return pointer to the Pinyin IME keyboard + */ +lv_obj_t * lv_ime_pinyin_get_kb(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + return pinyin_ime->kb; +} + +/** + * Set the dictionary of Pinyin input method. + * @param obj pointer to a Pinyin input method object + * @return pointer to the Pinyin input method candidate panel + */ +lv_obj_t * lv_ime_pinyin_get_cand_panel(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + return pinyin_ime->cand_panel; +} + +/** + * Set the dictionary of Pinyin input method. + * @param obj pointer to a Pinyin input method object + * @return pointer to the Pinyin input method dictionary + */ +lv_pinyin_dict_t * lv_ime_pinyin_get_dict(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + return pinyin_ime->dict; +} + +/*===================== + * Other functions + *====================*/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_ime_pinyin_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + uint16_t py_str_i = 0; + uint16_t btnm_i = 0; + for(btnm_i = 0; btnm_i < (LV_IME_PINYIN_CAND_TEXT_NUM + 3); btnm_i++) { + if(btnm_i == 0) { + lv_btnm_def_pinyin_sel_map[btnm_i] = "<"; + } + else if(btnm_i == (LV_IME_PINYIN_CAND_TEXT_NUM + 1)) { + lv_btnm_def_pinyin_sel_map[btnm_i] = ">"; + } + else if(btnm_i == (LV_IME_PINYIN_CAND_TEXT_NUM + 2)) { + lv_btnm_def_pinyin_sel_map[btnm_i] = ""; + } + else { + lv_pinyin_cand_str[py_str_i][0] = ' '; + lv_btnm_def_pinyin_sel_map[btnm_i] = lv_pinyin_cand_str[py_str_i]; + py_str_i++; + } + } + + pinyin_ime->mode = LV_IME_PINYIN_MODE_K26; + pinyin_ime->py_page = 0; + pinyin_ime->ta_count = 0; + pinyin_ime->cand_num = 0; + lv_memset_00(pinyin_ime->input_char, sizeof(pinyin_ime->input_char)); + lv_memset_00(pinyin_ime->py_num, sizeof(pinyin_ime->py_num)); + lv_memset_00(pinyin_ime->py_pos, sizeof(pinyin_ime->py_pos)); + + lv_obj_set_size(obj, LV_PCT(100), LV_PCT(55)); + lv_obj_align(obj, LV_ALIGN_BOTTOM_MID, 0, 0); + +#if LV_IME_PINYIN_USE_DEFAULT_DICT + init_pinyin_dict(obj, lv_ime_pinyin_def_dict); +#endif + + /* Init pinyin_ime->cand_panel */ + pinyin_ime->cand_panel = lv_btnmatrix_create(lv_scr_act()); + lv_btnmatrix_set_map(pinyin_ime->cand_panel, (const char **)lv_btnm_def_pinyin_sel_map); + lv_obj_set_size(pinyin_ime->cand_panel, LV_PCT(100), LV_PCT(5)); + lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); + + lv_btnmatrix_set_one_checked(pinyin_ime->cand_panel, true); + + /* Set cand_panel style*/ + // Default style + lv_obj_set_style_bg_opa(pinyin_ime->cand_panel, LV_OPA_0, 0); + lv_obj_set_style_border_width(pinyin_ime->cand_panel, 0, 0); + lv_obj_set_style_pad_all(pinyin_ime->cand_panel, 8, 0); + lv_obj_set_style_pad_gap(pinyin_ime->cand_panel, 0, 0); + lv_obj_set_style_radius(pinyin_ime->cand_panel, 0, 0); + lv_obj_set_style_pad_gap(pinyin_ime->cand_panel, 0, 0); + lv_obj_set_style_base_dir(pinyin_ime->cand_panel, LV_BASE_DIR_LTR, 0); + + // LV_PART_ITEMS style + lv_obj_set_style_radius(pinyin_ime->cand_panel, 12, LV_PART_ITEMS); + lv_obj_set_style_bg_color(pinyin_ime->cand_panel, lv_color_white(), LV_PART_ITEMS); + lv_obj_set_style_bg_opa(pinyin_ime->cand_panel, LV_OPA_0, LV_PART_ITEMS); + lv_obj_set_style_shadow_opa(pinyin_ime->cand_panel, LV_OPA_0, LV_PART_ITEMS); + + // LV_PART_ITEMS | LV_STATE_PRESSED style + lv_obj_set_style_bg_opa(pinyin_ime->cand_panel, LV_OPA_COVER, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_set_style_bg_color(pinyin_ime->cand_panel, lv_color_white(), LV_PART_ITEMS | LV_STATE_PRESSED); + + /* event handler */ + lv_obj_add_event_cb(pinyin_ime->cand_panel, lv_ime_pinyin_cand_panel_event, LV_EVENT_VALUE_CHANGED, obj); + lv_obj_add_event_cb(obj, lv_ime_pinyin_style_change_event, LV_EVENT_STYLE_CHANGED, NULL); + +#if LV_IME_PINYIN_USE_K9_MODE + pinyin_ime->k9_input_str_len = 0; + pinyin_ime->k9_py_ll_pos = 0; + pinyin_ime->k9_legal_py_count = 0; + lv_memset_00(pinyin_ime->k9_input_str, LV_IME_PINYIN_K9_MAX_INPUT); + + pinyin_k9_init_data(obj); + + _lv_ll_init(&(pinyin_ime->k9_legal_py_ll), sizeof(ime_pinyin_k9_py_str_t)); +#endif +} + + +static void lv_ime_pinyin_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + if(lv_obj_is_valid(pinyin_ime->kb)) + lv_obj_del(pinyin_ime->kb); + + if(lv_obj_is_valid(pinyin_ime->cand_panel)) + lv_obj_del(pinyin_ime->cand_panel); +} + + +static void lv_ime_pinyin_kb_event(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * kb = lv_event_get_target(e); + lv_obj_t * obj = lv_event_get_user_data(e); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + +#if LV_IME_PINYIN_USE_K9_MODE + static const char * k9_py_map[8] = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; +#endif + + if(code == LV_EVENT_VALUE_CHANGED) { + uint16_t btn_id = lv_btnmatrix_get_selected_btn(kb); + if(btn_id == LV_BTNMATRIX_BTN_NONE) return; + + const char * txt = lv_btnmatrix_get_btn_text(kb, lv_btnmatrix_get_selected_btn(kb)); + if(txt == NULL) return; + +#if LV_IME_PINYIN_USE_K9_MODE + if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) { + lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb); + uint16_t tmp_btn_str_len = strlen(pinyin_ime->input_char); + if((btn_id >= 16) && (tmp_btn_str_len > 0) && (btn_id < (16 + LV_IME_PINYIN_K9_CAND_TEXT_NUM))) { + tmp_btn_str_len = strlen(pinyin_ime->input_char); + lv_memset_00(pinyin_ime->input_char, sizeof(pinyin_ime->input_char)); + strcat(pinyin_ime->input_char, txt); + pinyin_input_proc(obj); + + for(int index = 0; index < (pinyin_ime->ta_count + tmp_btn_str_len); index++) { + lv_textarea_del_char(ta); + } + + pinyin_ime->ta_count = tmp_btn_str_len; + pinyin_ime->k9_input_str_len = tmp_btn_str_len; + lv_textarea_add_text(ta, pinyin_ime->input_char); + + return; + } + } +#endif + + if(strcmp(txt, "Enter") == 0 || strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) { + pinyin_ime_clear_data(obj); + lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); + } + else if(strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) { + // del input char + if(pinyin_ime->ta_count > 0) { + if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) + pinyin_ime->input_char[pinyin_ime->ta_count - 1] = '\0'; +#if LV_IME_PINYIN_USE_K9_MODE + else + pinyin_ime->k9_input_str[pinyin_ime->ta_count - 1] = '\0'; +#endif + + pinyin_ime->ta_count = pinyin_ime->ta_count - 1; + if(pinyin_ime->ta_count <= 0) { + lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); +#if LV_IME_PINYIN_USE_K9_MODE + lv_memset_00(lv_pinyin_k9_cand_str, sizeof(lv_pinyin_k9_cand_str)); + strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM], LV_SYMBOL_RIGHT"\0"); + strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1], "\0"); +#endif + } + else if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) { + pinyin_input_proc(obj); + } +#if LV_IME_PINYIN_USE_K9_MODE + else if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) { + pinyin_ime->k9_input_str_len = strlen(pinyin_ime->input_char) - 1; + pinyin_k9_get_legal_py(obj, pinyin_ime->k9_input_str, k9_py_map); + pinyin_k9_fill_cand(obj); + pinyin_input_proc(obj); + } +#endif + } + } + else if((strcmp(txt, "ABC") == 0) || (strcmp(txt, "abc") == 0) || (strcmp(txt, "1#") == 0)) { + pinyin_ime->ta_count = 0; + lv_memset_00(pinyin_ime->input_char, sizeof(pinyin_ime->input_char)); + return; + } + else if(strcmp(txt, LV_SYMBOL_KEYBOARD) == 0) { + if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) { + lv_ime_pinyin_set_mode(pinyin_ime, LV_IME_PINYIN_MODE_K9); + } + else { + lv_ime_pinyin_set_mode(pinyin_ime, LV_IME_PINYIN_MODE_K26); + lv_keyboard_set_mode(pinyin_ime->kb, LV_KEYBOARD_MODE_TEXT_LOWER); + } + pinyin_ime_clear_data(obj); + } + else if(strcmp(txt, LV_SYMBOL_OK) == 0) { + pinyin_ime_clear_data(obj); + } + else if((pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) && ((txt[0] >= 'a' && txt[0] <= 'z') || (txt[0] >= 'A' && + txt[0] <= 'Z'))) { + strcat(pinyin_ime->input_char, txt); + pinyin_input_proc(obj); + pinyin_ime->ta_count++; + } +#if LV_IME_PINYIN_USE_K9_MODE + else if((pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) && (txt[0] >= 'a' && txt[0] <= 'z')) { + for(uint16_t i = 0; i < 8; i++) { + if((strcmp(txt, k9_py_map[i]) == 0) || (strcmp(txt, "abc ") == 0)) { + if(strcmp(txt, "abc ") == 0) pinyin_ime->k9_input_str_len += strlen(k9_py_map[i]) + 1; + else pinyin_ime->k9_input_str_len += strlen(k9_py_map[i]); + pinyin_ime->k9_input_str[pinyin_ime->ta_count] = 50 + i; + + break; + } + } + pinyin_k9_get_legal_py(obj, pinyin_ime->k9_input_str, k9_py_map); + pinyin_k9_fill_cand(obj); + pinyin_input_proc(obj); + } + else if(strcmp(txt, LV_SYMBOL_LEFT) == 0) { + pinyin_k9_cand_page_proc(obj, 0); + } + else if(strcmp(txt, LV_SYMBOL_RIGHT) == 0) { + pinyin_k9_cand_page_proc(obj, 1); + } +#endif + } +} + + +static void lv_ime_pinyin_cand_panel_event(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * cand_panel = lv_event_get_target(e); + lv_obj_t * obj = (lv_obj_t *)lv_event_get_user_data(e); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + if(code == LV_EVENT_VALUE_CHANGED) { + uint32_t id = lv_btnmatrix_get_selected_btn(cand_panel); + if(id == 0) { + pinyin_page_proc(obj, 0); + return; + } + if(id == (LV_IME_PINYIN_CAND_TEXT_NUM + 1)) { + pinyin_page_proc(obj, 1); + return; + } + + const char * txt = lv_btnmatrix_get_btn_text(cand_panel, id); + lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb); + uint16_t index = 0; + for(index = 0; index < pinyin_ime->ta_count; index++) + lv_textarea_del_char(ta); + + lv_textarea_add_text(ta, txt); + + pinyin_ime_clear_data(obj); + } +} + + +static void pinyin_input_proc(lv_obj_t * obj) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + pinyin_ime->cand_str = pinyin_search_matching(obj, pinyin_ime->input_char, &pinyin_ime->cand_num); + if(pinyin_ime->cand_str == NULL) { + return; + } + + pinyin_ime->py_page = 0; + + for(uint8_t i = 0; i < LV_IME_PINYIN_CAND_TEXT_NUM; i++) { + memset(lv_pinyin_cand_str[i], 0x00, sizeof(lv_pinyin_cand_str[i])); + lv_pinyin_cand_str[i][0] = ' '; + } + + // fill buf + for(uint8_t i = 0; (i < pinyin_ime->cand_num && i < LV_IME_PINYIN_CAND_TEXT_NUM); i++) { + for(uint8_t j = 0; j < 3; j++) { + lv_pinyin_cand_str[i][j] = pinyin_ime->cand_str[i * 3 + j]; + } + } + + lv_obj_clear_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); +} + +static void pinyin_page_proc(lv_obj_t * obj, uint16_t dir) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + uint16_t page_num = pinyin_ime->cand_num / LV_IME_PINYIN_CAND_TEXT_NUM; + uint16_t sur = pinyin_ime->cand_num % LV_IME_PINYIN_CAND_TEXT_NUM; + + if(dir == 0) { + if(pinyin_ime->py_page) { + pinyin_ime->py_page--; + } + } + else { + if(sur == 0) { + page_num -= 1; + } + if(pinyin_ime->py_page < page_num) { + pinyin_ime->py_page++; + } + else return; + } + + for(uint8_t i = 0; i < LV_IME_PINYIN_CAND_TEXT_NUM; i++) { + memset(lv_pinyin_cand_str[i], 0x00, sizeof(lv_pinyin_cand_str[i])); + lv_pinyin_cand_str[i][0] = ' '; + } + + // fill buf + uint16_t offset = pinyin_ime->py_page * (3 * LV_IME_PINYIN_CAND_TEXT_NUM); + for(uint8_t i = 0; (i < pinyin_ime->cand_num && i < LV_IME_PINYIN_CAND_TEXT_NUM); i++) { + if((sur > 0) && (pinyin_ime->py_page == page_num)) { + if(i > sur) + break; + } + for(uint8_t j = 0; j < 3; j++) { + lv_pinyin_cand_str[i][j] = pinyin_ime->cand_str[offset + (i * 3) + j]; + } + } +} + + +static void lv_ime_pinyin_style_change_event(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + if(code == LV_EVENT_STYLE_CHANGED) { + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_obj_set_style_text_font(pinyin_ime->cand_panel, font, 0); + } +} + + +static void init_pinyin_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + char headletter = 'a'; + uint16_t offset_sum = 0; + uint16_t offset_count = 0; + uint16_t letter_calc = 0; + + pinyin_ime->dict = dict; + + for(uint16_t i = 0; ; i++) { + if((NULL == (dict[i].py)) || (NULL == (dict[i].py_mb))) { + headletter = dict[i - 1].py[0]; + letter_calc = headletter - 'a'; + pinyin_ime->py_num[letter_calc] = offset_count; + break; + } + + if(headletter == (dict[i].py[0])) { + offset_count++; + } + else { + headletter = dict[i].py[0]; + letter_calc = headletter - 'a'; + pinyin_ime->py_num[letter_calc - 1] = offset_count; + offset_sum += offset_count; + pinyin_ime->py_pos[letter_calc] = offset_sum; + + offset_count = 1; + } + } +} + + +static char * pinyin_search_matching(lv_obj_t * obj, char * py_str, uint16_t * cand_num) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + lv_pinyin_dict_t * cpHZ; + uint8_t index, len = 0, offset; + volatile uint8_t count = 0; + + if(*py_str == '\0') return NULL; + if(*py_str == 'i') return NULL; + if(*py_str == 'u') return NULL; + if(*py_str == 'v') return NULL; + + offset = py_str[0] - 'a'; + len = strlen(py_str); + + cpHZ = &pinyin_ime->dict[pinyin_ime->py_pos[offset]]; + count = pinyin_ime->py_num[offset]; + + while(count--) { + for(index = 0; index < len; index++) { + if(*(py_str + index) != *((cpHZ->py) + index)) { + break; + } + } + + // perfect match + if(len == 1 || index == len) { + // The Chinese character in UTF-8 encoding format is 3 bytes + * cand_num = strlen((const char *)(cpHZ->py_mb)) / 3; + return (char *)(cpHZ->py_mb); + } + cpHZ++; + } + return NULL; +} + +static void pinyin_ime_clear_data(lv_obj_t * obj) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + +#if LV_IME_PINYIN_USE_K9_MODE + if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) { + pinyin_ime->k9_input_str_len = 0; + pinyin_ime->k9_py_ll_pos = 0; + pinyin_ime->k9_legal_py_count = 0; + lv_memset_00(pinyin_ime->k9_input_str, LV_IME_PINYIN_K9_MAX_INPUT); + lv_memset_00(lv_pinyin_k9_cand_str, sizeof(lv_pinyin_k9_cand_str)); + strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM], LV_SYMBOL_RIGHT"\0"); + strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1], "\0"); + } +#endif + + pinyin_ime->ta_count = 0; + lv_memset_00(lv_pinyin_cand_str, (sizeof(lv_pinyin_cand_str))); + lv_memset_00(pinyin_ime->input_char, sizeof(pinyin_ime->input_char)); + + lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); +} + + +#if LV_IME_PINYIN_USE_K9_MODE +static void pinyin_k9_init_data(lv_obj_t * obj) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + uint16_t py_str_i = 0; + uint16_t btnm_i = 0; + for(btnm_i = 19; btnm_i < (LV_IME_PINYIN_K9_CAND_TEXT_NUM + 21); btnm_i++) { + if(py_str_i == LV_IME_PINYIN_K9_CAND_TEXT_NUM) { + strcpy(lv_pinyin_k9_cand_str[py_str_i], LV_SYMBOL_RIGHT"\0"); + } + else if(py_str_i == LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1) { + strcpy(lv_pinyin_k9_cand_str[py_str_i], "\0"); + } + else { + strcpy(lv_pinyin_k9_cand_str[py_str_i], " \0"); + } + + lv_btnm_def_pinyin_k9_map[btnm_i] = lv_pinyin_k9_cand_str[py_str_i]; + py_str_i++; + } + + default_kb_ctrl_k9_map[0] = LV_KEYBOARD_CTRL_BTN_FLAGS | 1; + default_kb_ctrl_k9_map[4] = LV_KEYBOARD_CTRL_BTN_FLAGS | 1; + default_kb_ctrl_k9_map[5] = LV_KEYBOARD_CTRL_BTN_FLAGS | 1; + default_kb_ctrl_k9_map[9] = LV_KEYBOARD_CTRL_BTN_FLAGS | 1; + default_kb_ctrl_k9_map[10] = LV_KEYBOARD_CTRL_BTN_FLAGS | 1; + default_kb_ctrl_k9_map[14] = LV_KEYBOARD_CTRL_BTN_FLAGS | 1; + default_kb_ctrl_k9_map[15] = LV_KEYBOARD_CTRL_BTN_FLAGS | 1; + default_kb_ctrl_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 16] = LV_KEYBOARD_CTRL_BTN_FLAGS | 1; +} + +static void pinyin_k9_get_legal_py(lv_obj_t * obj, char * k9_input, const char * py9_map[]) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + uint16_t len = strlen(k9_input); + + if((len == 0) || (len >= LV_IME_PINYIN_K9_MAX_INPUT)) { + return; + } + + char py_comp[LV_IME_PINYIN_K9_MAX_INPUT] = {0}; + int mark[LV_IME_PINYIN_K9_MAX_INPUT] = {0}; + int index = 0; + int flag = 0; + int count = 0; + + uint32_t ll_len = 0; + ime_pinyin_k9_py_str_t * ll_index = NULL; + + ll_len = _lv_ll_get_len(&pinyin_ime->k9_legal_py_ll); + ll_index = _lv_ll_get_head(&pinyin_ime->k9_legal_py_ll); + + while(index != -1) { + if(index == len) { + if(pinyin_k9_is_valid_py(obj, py_comp)) { + if((count >= ll_len) || (ll_len == 0)) { + ll_index = _lv_ll_ins_tail(&pinyin_ime->k9_legal_py_ll); + strcpy(ll_index->py_str, py_comp); + } + else if((count < ll_len)) { + strcpy(ll_index->py_str, py_comp); + ll_index = _lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); + } + count++; + } + index--; + } + else { + flag = mark[index]; + if(flag < strlen(py9_map[k9_input[index] - '2'])) { + py_comp[index] = py9_map[k9_input[index] - '2'][flag]; + mark[index] = mark[index] + 1; + index++; + } + else { + mark[index] = 0; + index--; + } + } + } + + if(count > 0) { + pinyin_ime->ta_count++; + pinyin_ime->k9_legal_py_count = count; + } +} + + +/*true: visible; false: not visible*/ +static bool pinyin_k9_is_valid_py(lv_obj_t * obj, char * py_str) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + lv_pinyin_dict_t * cpHZ = NULL; + uint8_t index = 0, len = 0, offset = 0; + uint16_t ret = 1; + volatile uint8_t count = 0; + + if(*py_str == '\0') return false; + if(*py_str == 'i') return false; + if(*py_str == 'u') return false; + if(*py_str == 'v') return false; + + offset = py_str[0] - 'a'; + len = strlen(py_str); + + cpHZ = &pinyin_ime->dict[pinyin_ime->py_pos[offset]]; + count = pinyin_ime->py_num[offset]; + + while(count--) { + for(index = 0; index < len; index++) { + if(*(py_str + index) != *((cpHZ->py) + index)) { + break; + } + } + + // perfect match + if(len == 1 || index == len) { + return true; + } + cpHZ++; + } + return false; +} + + +static void pinyin_k9_fill_cand(lv_obj_t * obj) +{ + static uint16_t len = 0; + uint16_t index = 0, tmp_len = 0; + ime_pinyin_k9_py_str_t * ll_index = NULL; + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + tmp_len = pinyin_ime->k9_legal_py_count; + + if(tmp_len != len) { + lv_memset_00(lv_pinyin_k9_cand_str, sizeof(lv_pinyin_k9_cand_str)); + strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM], LV_SYMBOL_RIGHT"\0"); + strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1], "\0"); + len = tmp_len; + } + + ll_index = _lv_ll_get_head(&pinyin_ime->k9_legal_py_ll); + strcpy(pinyin_ime->input_char, ll_index->py_str); + while(ll_index) { + if((index >= LV_IME_PINYIN_K9_CAND_TEXT_NUM) || \ + (index >= pinyin_ime->k9_legal_py_count)) + break; + + strcpy(lv_pinyin_k9_cand_str[index], ll_index->py_str); + ll_index = _lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/ + index++; + } + pinyin_ime->k9_py_ll_pos = index; + + lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb); + for(index = 0; index < pinyin_ime->k9_input_str_len; index++) { + lv_textarea_del_char(ta); + } + pinyin_ime->k9_input_str_len = strlen(pinyin_ime->input_char); + lv_textarea_add_text(ta, pinyin_ime->input_char); +} + + +static void pinyin_k9_cand_page_proc(lv_obj_t * obj, uint16_t dir) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb); + uint16_t ll_len = _lv_ll_get_len(&pinyin_ime->k9_legal_py_ll); + + if((ll_len > LV_IME_PINYIN_K9_CAND_TEXT_NUM) && (pinyin_ime->k9_legal_py_count > LV_IME_PINYIN_K9_CAND_TEXT_NUM)) { + ime_pinyin_k9_py_str_t * ll_index = NULL; + uint16_t tmp_btn_str_len = 0; + int count = 0; + + ll_index = _lv_ll_get_head(&pinyin_ime->k9_legal_py_ll); + while(ll_index) { + if(count >= pinyin_ime->k9_py_ll_pos) break; + + ll_index = _lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/ + count++; + } + + if((NULL == ll_index) && (dir == 1)) return; + + lv_memset_00(lv_pinyin_k9_cand_str, sizeof(lv_pinyin_k9_cand_str)); + strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM], LV_SYMBOL_RIGHT"\0"); + strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1], "\0"); + + // next page + if(dir == 1) { + count = 0; + while(ll_index) { + if(count >= (LV_IME_PINYIN_K9_CAND_TEXT_NUM - 1)) + break; + + strcpy(lv_pinyin_k9_cand_str[count], ll_index->py_str); + ll_index = _lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/ + count++; + } + pinyin_ime->k9_py_ll_pos += count - 1; + + } + // previous page + else { + count = LV_IME_PINYIN_K9_CAND_TEXT_NUM - 1; + ll_index = _lv_ll_get_prev(&pinyin_ime->k9_legal_py_ll, ll_index); + while(ll_index) { + if(count < 0) break; + + strcpy(lv_pinyin_k9_cand_str[count], ll_index->py_str); + ll_index = _lv_ll_get_prev(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the previous list*/ + count--; + } + + if(pinyin_ime->k9_py_ll_pos > LV_IME_PINYIN_K9_CAND_TEXT_NUM) + pinyin_ime->k9_py_ll_pos -= 1; + } + + lv_textarea_set_cursor_pos(ta, LV_TEXTAREA_CURSOR_LAST); + } +} + +#endif /*LV_IME_PINYIN_USE_K9_MODE*/ + +#endif /*LV_USE_IME_PINYIN*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/ime/lv_ime_pinyin.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/ime/lv_ime_pinyin.h new file mode 100644 index 0000000..3ff7bb9 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/ime/lv_ime_pinyin.h @@ -0,0 +1,145 @@ +/** + * @file lv_ime_pinyin.h + * + */ +#ifndef LV_IME_PINYIN_H +#define LV_IME_PINYIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_IME_PINYIN != 0 + +/********************* + * DEFINES + *********************/ +#define LV_IME_PINYIN_K9_MAX_INPUT 7 + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_IME_PINYIN_MODE_K26, + LV_IME_PINYIN_MODE_K9, +} lv_ime_pinyin_mode_t; + +/*Data of pinyin_dict*/ +typedef struct { + const char * const py; + const char * const py_mb; +} lv_pinyin_dict_t; + +/*Data of 9-key input(k9) mode*/ +typedef struct { + char py_str[7]; +} ime_pinyin_k9_py_str_t; + +/*Data of lv_ime_pinyin*/ +typedef struct { + lv_obj_t obj; + lv_obj_t * kb; + lv_obj_t * cand_panel; + lv_pinyin_dict_t * dict; + lv_ll_t k9_legal_py_ll; + char * cand_str; /* Candidate string */ + char input_char[16]; /* Input box character */ +#if LV_IME_PINYIN_USE_K9_MODE + char k9_input_str[LV_IME_PINYIN_K9_MAX_INPUT]; /* 9-key input(k9) mode input string */ + uint16_t k9_py_ll_pos; /* Current pinyin map pages(k9) */ + uint16_t k9_legal_py_count; /* Count of legal Pinyin numbers(k9) */ + uint16_t k9_input_str_len; /* 9-key input(k9) mode input string max len */ +#endif + uint16_t ta_count; /* The number of characters entered in the text box this time */ + uint16_t cand_num; /* Number of candidates */ + uint16_t py_page; /* Current pinyin map pages(k26) */ + uint16_t py_num[26]; /* Number and length of Pinyin */ + uint16_t py_pos[26]; /* Pinyin position */ + uint8_t mode : 1; /* Set mode, 1: 26-key input(k26), 0: 9-key input(k9). Default: 1. */ +} lv_ime_pinyin_t; + +/*********************** + * GLOBAL VARIABLES + ***********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +lv_obj_t * lv_ime_pinyin_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the keyboard of Pinyin input method. + * @param obj pointer to a Pinyin input method object + * @param dict pointer to a Pinyin input method keyboard + */ +void lv_ime_pinyin_set_keyboard(lv_obj_t * obj, lv_obj_t * kb); + +/** + * Set the dictionary of Pinyin input method. + * @param obj pointer to a Pinyin input method object + * @param dict pointer to a Pinyin input method dictionary + */ +void lv_ime_pinyin_set_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict); + +/** + * Set mode, 26-key input(k26) or 9-key input(k9). + * @param obj pointer to a Pinyin input method object + * @param mode the mode from 'lv_ime_pinyin_mode_t' + */ +void lv_ime_pinyin_set_mode(lv_obj_t * obj, lv_ime_pinyin_mode_t mode); + + +/*===================== + * Getter functions + *====================*/ + +/** + * Set the dictionary of Pinyin input method. + * @param obj pointer to a Pinyin IME object + * @return pointer to the Pinyin IME keyboard + */ +lv_obj_t * lv_ime_pinyin_get_kb(lv_obj_t * obj); + + +/** + * Set the dictionary of Pinyin input method. + * @param obj pointer to a Pinyin input method object + * @return pointer to the Pinyin input method candidate panel + */ +lv_obj_t * lv_ime_pinyin_get_cand_panel(lv_obj_t * obj); + + +/** + * Set the dictionary of Pinyin input method. + * @param obj pointer to a Pinyin input method object + * @return pointer to the Pinyin input method dictionary + */ +lv_pinyin_dict_t * lv_ime_pinyin_get_dict(lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_IME_PINYIN*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_USE_IME_PINYIN*/ + + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/imgfont/lv_imgfont.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/imgfont/lv_imgfont.c new file mode 100644 index 0000000..ad4ab60 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/imgfont/lv_imgfont.c @@ -0,0 +1,126 @@ +/** + * @file lv_imgfont.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_imgfont.h" + +#if LV_USE_IMGFONT + +/********************* + * DEFINES + *********************/ +#define LV_IMGFONT_PATH_MAX_LEN 64 + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_font_t * font; + lv_get_imgfont_path_cb_t path_cb; + char path[LV_IMGFONT_PATH_MAX_LEN]; +} imgfont_dsc_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static const uint8_t * imgfont_get_glyph_bitmap(const lv_font_t * font, uint32_t unicode); +static bool imgfont_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, + uint32_t unicode, uint32_t unicode_next); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +lv_font_t * lv_imgfont_create(uint16_t height, lv_get_imgfont_path_cb_t path_cb) +{ + LV_ASSERT_MSG(LV_IMGFONT_PATH_MAX_LEN > sizeof(lv_img_dsc_t), + "LV_IMGFONT_PATH_MAX_LEN must be greater than sizeof(lv_img_dsc_t)"); + + size_t size = sizeof(imgfont_dsc_t) + sizeof(lv_font_t); + imgfont_dsc_t * dsc = (imgfont_dsc_t *)lv_mem_alloc(size); + if(dsc == NULL) return NULL; + lv_memset_00(dsc, size); + + dsc->font = (lv_font_t *)(((char *)dsc) + sizeof(imgfont_dsc_t)); + dsc->path_cb = path_cb; + + lv_font_t * font = dsc->font; + font->dsc = dsc; + font->get_glyph_dsc = imgfont_get_glyph_dsc; + font->get_glyph_bitmap = imgfont_get_glyph_bitmap; + font->subpx = LV_FONT_SUBPX_NONE; + font->line_height = height; + font->base_line = 0; + font->underline_position = 0; + font->underline_thickness = 0; + + return dsc->font; +} + +void lv_imgfont_destroy(lv_font_t * font) +{ + if(font == NULL) { + return; + } + + imgfont_dsc_t * dsc = (imgfont_dsc_t *)font->dsc; + lv_mem_free(dsc); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static const uint8_t * imgfont_get_glyph_bitmap(const lv_font_t * font, uint32_t unicode) +{ + LV_UNUSED(unicode); + LV_ASSERT_NULL(font); + imgfont_dsc_t * dsc = (imgfont_dsc_t *)font->dsc; + return (uint8_t *)dsc->path; +} + +static bool imgfont_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, + uint32_t unicode, uint32_t unicode_next) +{ + LV_ASSERT_NULL(font); + + imgfont_dsc_t * dsc = (imgfont_dsc_t *)font->dsc; + LV_ASSERT_NULL(dsc); + if(dsc->path_cb == NULL) return false; + + if(!dsc->path_cb(dsc->font, dsc->path, LV_IMGFONT_PATH_MAX_LEN, unicode, unicode_next)) { + return false; + } + + lv_img_header_t header; + if(lv_img_decoder_get_info(dsc->path, &header) != LV_RES_OK) { + return false; + } + + dsc_out->is_placeholder = 0; + dsc_out->adv_w = header.w; + dsc_out->box_w = header.w; + dsc_out->box_h = header.h; + dsc_out->bpp = LV_IMGFONT_BPP; /* is image identifier */ + dsc_out->ofs_x = 0; + dsc_out->ofs_y = 0; + + return true; +} + +#endif /*LV_USE_IMGFONT*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/imgfont/lv_imgfont.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/imgfont/lv_imgfont.h new file mode 100644 index 0000000..5069b62 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/imgfont/lv_imgfont.h @@ -0,0 +1,60 @@ +/** + * @file lv_imgfont.h + * + */ + +#ifndef LV_IMGFONT_H +#define LV_IMGFONT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_IMGFONT + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/* gets the image path name of this character */ +typedef bool (*lv_get_imgfont_path_cb_t)(const lv_font_t * font, void * img_src, + uint16_t len, uint32_t unicode, uint32_t unicode_next); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Creates a image font with info parameter specified. + * @param height font size + * @param path_cb a function to get the image path name of character. + * @return pointer to the new imgfont or NULL if create error. + */ +lv_font_t * lv_imgfont_create(uint16_t height, lv_get_imgfont_path_cb_t path_cb); + +/** + * Destroy a image font that has been created. + * @param font pointer to image font handle. + */ +void lv_imgfont_destroy(lv_font_t * font); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_IMGFONT*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_IMGFONT_H */ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/lv_others.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/lv_others.h new file mode 100644 index 0000000..106d85e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/lv_others.h @@ -0,0 +1,44 @@ +/** + * @file lv_others.h + * + */ + +#ifndef LV_OTHERS_H +#define LV_OTHERS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "snapshot/lv_snapshot.h" +#include "monkey/lv_monkey.h" +#include "gridnav/lv_gridnav.h" +#include "fragment/lv_fragment.h" +#include "imgfont/lv_imgfont.h" +#include "msg/lv_msg.h" +#include "ime/lv_ime_pinyin.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OTHERS_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/monkey/lv_monkey.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/monkey/lv_monkey.c new file mode 100644 index 0000000..6ec45e2 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/monkey/lv_monkey.c @@ -0,0 +1,187 @@ +/** + * @file lv_monkey.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_monkey.h" + +#if LV_USE_MONKEY != 0 + +/********************* + * DEFINES + *********************/ +#define MONKEY_PERIOD_RANGE_MIN_DEF 100 +#define MONKEY_PERIOD_RANGE_MAX_DEF 1000 + +/********************** + * TYPEDEFS + **********************/ +typedef struct _lv_monkey { + lv_monkey_config_t config; + lv_indev_drv_t indev_drv; + lv_indev_data_t indev_data; + lv_indev_t * indev; + lv_timer_t * timer; +#if LV_USE_USER_DATA + void * user_data; +#endif +} lv_monkey_t; + +static const lv_key_t lv_key_map[] = { + LV_KEY_UP, + LV_KEY_DOWN, + LV_KEY_RIGHT, + LV_KEY_LEFT, + LV_KEY_ESC, + LV_KEY_DEL, + LV_KEY_BACKSPACE, + LV_KEY_ENTER, + LV_KEY_NEXT, + LV_KEY_PREV, + LV_KEY_HOME, + LV_KEY_END, +}; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_monkey_read_cb(lv_indev_drv_t * indev_drv, lv_indev_data_t * data); +static int32_t lv_monkey_random(int32_t howsmall, int32_t howbig); +static void lv_monkey_timer_cb(lv_timer_t * timer); + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_monkey_config_init(lv_monkey_config_t * config) +{ + lv_memset_00(config, sizeof(lv_monkey_config_t)); + config->type = LV_INDEV_TYPE_POINTER; + config->period_range.min = MONKEY_PERIOD_RANGE_MIN_DEF; + config->period_range.max = MONKEY_PERIOD_RANGE_MAX_DEF; +} + +lv_monkey_t * lv_monkey_create(const lv_monkey_config_t * config) +{ + lv_monkey_t * monkey = lv_mem_alloc(sizeof(lv_monkey_t)); + LV_ASSERT_MALLOC(monkey); + + lv_memset_00(monkey, sizeof(lv_monkey_t)); + + monkey->config = *config; + + lv_indev_drv_t * drv = &monkey->indev_drv; + lv_indev_drv_init(drv); + drv->type = config->type; + drv->read_cb = lv_monkey_read_cb; + drv->user_data = monkey; + + monkey->timer = lv_timer_create(lv_monkey_timer_cb, monkey->config.period_range.min, monkey); + lv_timer_pause(monkey->timer); + + monkey->indev = lv_indev_drv_register(drv); + + return monkey; +} + +lv_indev_t * lv_monkey_get_indev(lv_monkey_t * monkey) +{ + LV_ASSERT_NULL(monkey); + return monkey->indev; +} + +void lv_monkey_set_enable(lv_monkey_t * monkey, bool en) +{ + LV_ASSERT_NULL(monkey); + en ? lv_timer_resume(monkey->timer) : lv_timer_pause(monkey->timer); +} + +bool lv_monkey_get_enable(lv_monkey_t * monkey) +{ + LV_ASSERT_NULL(monkey); + return !monkey->timer->paused; +} + +#if LV_USE_USER_DATA + +void lv_monkey_set_user_data(lv_monkey_t * monkey, void * user_data) +{ + LV_ASSERT_NULL(monkey); + monkey->user_data = user_data; +} + +void * lv_monkey_get_user_data(lv_monkey_t * monkey) +{ + LV_ASSERT_NULL(monkey); + return monkey->user_data; +} + +#endif + +void lv_monkey_del(lv_monkey_t * monkey) +{ + LV_ASSERT_NULL(monkey); + + lv_timer_del(monkey->timer); + lv_indev_delete(monkey->indev); + lv_mem_free(monkey); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_monkey_read_cb(lv_indev_drv_t * indev_drv, lv_indev_data_t * data) +{ + lv_monkey_t * monkey = indev_drv->user_data; + + data->btn_id = monkey->indev_data.btn_id; + data->point = monkey->indev_data.point; + data->enc_diff = monkey->indev_data.enc_diff; + data->state = monkey->indev_data.state; +} + +static int32_t lv_monkey_random(int32_t howsmall, int32_t howbig) +{ + if(howsmall >= howbig) { + return howsmall; + } + int32_t diff = howbig - howsmall; + return (int32_t)lv_rand(0, diff) + howsmall; +} + +static void lv_monkey_timer_cb(lv_timer_t * timer) +{ + lv_monkey_t * monkey = timer->user_data; + lv_indev_data_t * data = &monkey->indev_data; + + switch(monkey->indev_drv.type) { + case LV_INDEV_TYPE_POINTER: + data->point.x = (lv_coord_t)lv_monkey_random(0, LV_HOR_RES - 1); + data->point.y = (lv_coord_t)lv_monkey_random(0, LV_VER_RES - 1); + break; + case LV_INDEV_TYPE_ENCODER: + data->enc_diff = (int16_t)lv_monkey_random(monkey->config.input_range.min, monkey->config.input_range.max); + break; + case LV_INDEV_TYPE_BUTTON: + data->btn_id = (uint32_t)lv_monkey_random(monkey->config.input_range.min, monkey->config.input_range.max); + break; + case LV_INDEV_TYPE_KEYPAD: { + int32_t index = lv_monkey_random(0, sizeof(lv_key_map) / sizeof(lv_key_map[0]) - 1); + data->key = lv_key_map[index]; + break; + } + default: + break; + } + + data->state = lv_monkey_random(0, 100) < 50 ? LV_INDEV_STATE_RELEASED : LV_INDEV_STATE_PRESSED; + + lv_timer_set_period(monkey->timer, lv_monkey_random(monkey->config.period_range.min, monkey->config.period_range.max)); +} + +#endif /*LV_USE_MONKEY*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/monkey/lv_monkey.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/monkey/lv_monkey.h new file mode 100644 index 0000000..bf5e13c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/monkey/lv_monkey.h @@ -0,0 +1,118 @@ +/** + * @file lv_monkey.h + * + */ +#ifndef LV_MONKEY_H +#define LV_MONKEY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_MONKEY != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +struct _lv_monkey; +typedef struct _lv_monkey lv_monkey_t; + +typedef struct { + /**< Input device type*/ + lv_indev_type_t type; + + /**< Monkey execution period*/ + struct { + uint32_t min; + uint32_t max; + } period_range; + + /**< The range of input value*/ + struct { + int32_t min; + int32_t max; + } input_range; +} lv_monkey_config_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize a monkey config with default values + * @param config pointer to 'lv_monkey_config_t' variable to initialize + */ +void lv_monkey_config_init(lv_monkey_config_t * config); + +/** + * Create monkey for test + * @param config pointer to 'lv_monkey_config_t' variable + * @return pointer to the created monkey + */ +lv_monkey_t * lv_monkey_create(const lv_monkey_config_t * config); + +/** + * Get monkey input device + * @param monkey pointer to a monkey + * @return pointer to the input device + */ +lv_indev_t * lv_monkey_get_indev(lv_monkey_t * monkey); + +/** + * Enable monkey + * @param monkey pointer to a monkey + * @param en set to true to enable + */ +void lv_monkey_set_enable(lv_monkey_t * monkey, bool en); + +/** + * Get whether monkey is enabled + * @param monkey pointer to a monkey + * @return return true if monkey enabled + */ +bool lv_monkey_get_enable(lv_monkey_t * monkey); + +#if LV_USE_USER_DATA + +/** + * Set the user_data field of the monkey + * @param monkey pointer to a monkey + * @param user_data pointer to the new user_data. + */ +void lv_monkey_set_user_data(lv_monkey_t * monkey, void * user_data); + +/** + * Get the user_data field of the monkey + * @param monkey pointer to a monkey + * @return the pointer to the user_data of the monkey + */ +void * lv_monkey_get_user_data(lv_monkey_t * monkey); + +#endif/*LV_USE_USER_DATA*/ + +/** + * Delete monkey + * @param monkey pointer to monkey + */ +void lv_monkey_del(lv_monkey_t * monkey); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_MONKEY*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_MONKEY_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/msg/lv_msg.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/msg/lv_msg.c new file mode 100644 index 0000000..8fd434d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/msg/lv_msg.c @@ -0,0 +1,172 @@ +/** + * @file lv_msg.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_msg.h" +#if LV_USE_MSG + +#include "../../../misc/lv_assert.h" +#include "../../../misc/lv_ll.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + uint32_t msg_id; + lv_msg_subscribe_cb_t callback; + void * user_data; + void * _priv_data; /*Internal: used only store 'obj' in lv_obj_subscribe*/ +} sub_dsc_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void notify(lv_msg_t * m); +static void obj_notify_cb(void * s, lv_msg_t * m); +static void obj_delete_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ +static lv_ll_t subs_ll; + +/********************** + * GLOBAL VARIABLES + **********************/ +lv_event_code_t LV_EVENT_MSG_RECEIVED; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_msg_init(void) +{ + LV_EVENT_MSG_RECEIVED = lv_event_register_id(); + _lv_ll_init(&subs_ll, sizeof(sub_dsc_t)); +} + +void * lv_msg_subsribe(uint32_t msg_id, lv_msg_subscribe_cb_t cb, void * user_data) +{ + sub_dsc_t * s = _lv_ll_ins_tail(&subs_ll); + LV_ASSERT_MALLOC(s); + if(s == NULL) return NULL; + + lv_memset_00(s, sizeof(*s)); + + s->msg_id = msg_id; + s->callback = cb; + s->user_data = user_data; + return s; +} + +void * lv_msg_subsribe_obj(uint32_t msg_id, lv_obj_t * obj, void * user_data) +{ + sub_dsc_t * s = lv_msg_subsribe(msg_id, obj_notify_cb, user_data); + if(s == NULL) return NULL; + s->_priv_data = obj; + + /*If not added yet, add a delete event cb which automatically unsubcribes the object*/ + sub_dsc_t * s_first = lv_obj_get_event_user_data(obj, obj_delete_event_cb); + if(s_first == NULL) { + lv_obj_add_event_cb(obj, obj_delete_event_cb, LV_EVENT_DELETE, s); + } + return s; +} + +void lv_msg_unsubscribe(void * s) +{ + LV_ASSERT_NULL(s); + _lv_ll_remove(&subs_ll, s); + lv_mem_free(s); +} + +void lv_msg_send(uint32_t msg_id, const void * payload) +{ + lv_msg_t m; + lv_memset_00(&m, sizeof(m)); + m.id = msg_id; + m.payload = payload; + notify(&m); +} + +uint32_t lv_msg_get_id(lv_msg_t * m) +{ + return m->id; +} + +const void * lv_msg_get_payload(lv_msg_t * m) +{ + return m->payload; +} + +void * lv_msg_get_user_data(lv_msg_t * m) +{ + return m->user_data; +} + +lv_msg_t * lv_event_get_msg(lv_event_t * e) +{ + if(e->code == LV_EVENT_MSG_RECEIVED) { + return lv_event_get_param(e); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return NULL; + } +} + + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void notify(lv_msg_t * m) +{ + sub_dsc_t * s; + _LV_LL_READ(&subs_ll, s) { + if(s->msg_id == m->id && s->callback) { + m->user_data = s->user_data; + m->_priv_data = s->_priv_data; + s->callback(s, m); + } + } +} + +static void obj_notify_cb(void * s, lv_msg_t * m) +{ + LV_UNUSED(s); + lv_event_send(m->_priv_data, LV_EVENT_MSG_RECEIVED, m); +} + +static void obj_delete_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + + sub_dsc_t * s = _lv_ll_get_head(&subs_ll); + sub_dsc_t * s_next; + while(s) { + /*On unsubscribe the list changes s becomes invalid so get next item while it's surely valid*/ + s_next = _lv_ll_get_next(&subs_ll, s); + if(s->_priv_data == obj) { + lv_msg_unsubscribe(s); + } + s = s_next; + } +} + +#endif /*LV_USE_MSG*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/msg/lv_msg.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/msg/lv_msg.h new file mode 100644 index 0000000..11a55b5 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/msg/lv_msg.h @@ -0,0 +1,124 @@ +/** + * @file lv_msg.h + * + */ + +#ifndef LV_MSG_H +#define LV_MSG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../core/lv_obj.h" +#if LV_USE_MSG + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + uint32_t id; /*Identifier of the message*/ + void * user_data; /*Set the the user_data set in `lv_msg_subscribe`*/ + void * _priv_data; /*Used internally*/ + const void * payload; /*Pointer to the data of the message*/ +} lv_msg_t; + +typedef void (*lv_msg_subscribe_cb_t)(void * s, lv_msg_t * msg); + +typedef void (*lv_msg_request_cb_t)(void * r, uint32_t msg_id); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Called internally to initialize the message module + */ +void lv_msg_init(void); + +/** + * Subscribe to an `msg_id` + * @param msg_id the message ID to listen to + * @param cb callback to call if a message with `msg_id` was sent + * @param user_data arbitrary data which will be available in `cb` too + * @return pointer to a "subscribe object". It can be used the unsubscribe. + */ +void * lv_msg_subsribe(uint32_t msg_id, lv_msg_subscribe_cb_t cb, void * user_data); + +/** + * Subscribe an `lv_obj` to a message. + * `LV_EVENT_MSG_RECEIVED` will be triggered if a message with matching ID was sent + * @param msg_id the message ID to listen to + * @param obj pointer to an `lv_obj` + * @param user_data arbitrary data which will be available in `cb` too + * @return pointer to a "subscribe object". It can be used the unsubscribe. + */ +void * lv_msg_subsribe_obj(uint32_t msg_id, lv_obj_t * obj, void * user_data); + +/** + * Cancel a previous subscription + * @param s pointer to a "subscibe object". + * Return value of `lv_msg_subsribe` or `lv_msg_subsribe_obj` + */ +void lv_msg_unsubscribe(void * s); + +/** + * Send a message with a given ID and payload + * @param msg_id ID of the message to send + * @param data pointer to the data to send + */ +void lv_msg_send(uint32_t msg_id, const void * payload); + +/** + * Get the ID of a message object. Typically used in the subscriber callback. + * @param m pointer to a message object + * @return the ID of the message + */ +uint32_t lv_msg_get_id(lv_msg_t * m); + +/** + * Get the payload of a message object. Typically used in the subscriber callback. + * @param m pointer to a message object + * @return the payload of the message + */ +const void * lv_msg_get_payload(lv_msg_t * m); + +/** + * Get the user data of a message object. Typically used in the subscriber callback. + * @param m pointer to a message object + * @return the user data of the message + */ +void * lv_msg_get_user_data(lv_msg_t * m); + +/** + * Get the message object from an event object. Can be used in `LV_EVENT_MSG_RECEIVED` events. + * @param e pointer to an event object + * @return the message object or NULL if called with unrelated event code. + */ +lv_msg_t * lv_event_get_msg(lv_event_t * e); + +/********************** + * GLOBAL VARIABLES + **********************/ + +extern lv_event_code_t LV_EVENT_MSG_RECEIVED; + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_MSG*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_MSG_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/snapshot/lv_snapshot.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/snapshot/lv_snapshot.c new file mode 100644 index 0000000..1b22751 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/snapshot/lv_snapshot.c @@ -0,0 +1,213 @@ +/** + * @file lv_snapshot.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_snapshot.h" +#if LV_USE_SNAPSHOT + +#include +#include "../../../core/lv_disp.h" +#include "../../../core/lv_refr.h" +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** Get the buffer needed for object snapshot image. + * + * @param obj The object to generate snapshot. + * @param cf color format for generated image. + * + * @return the buffer size needed in bytes + */ +uint32_t lv_snapshot_buf_size_needed(lv_obj_t * obj, lv_img_cf_t cf) +{ + LV_ASSERT_NULL(obj); + switch(cf) { + case LV_IMG_CF_TRUE_COLOR: + case LV_IMG_CF_TRUE_COLOR_ALPHA: + case LV_IMG_CF_ALPHA_1BIT: + case LV_IMG_CF_ALPHA_2BIT: + case LV_IMG_CF_ALPHA_4BIT: + case LV_IMG_CF_ALPHA_8BIT: + break; + default: + return 0; + } + + lv_obj_update_layout(obj); + + /*Width and height determine snapshot image size.*/ + lv_coord_t w = lv_obj_get_width(obj); + lv_coord_t h = lv_obj_get_height(obj); + lv_coord_t ext_size = _lv_obj_get_ext_draw_size(obj); + w += ext_size * 2; + h += ext_size * 2; + + uint8_t px_size = lv_img_cf_get_px_size(cf); + return w * h * ((px_size + 7) >> 3); +} + +/** Take snapshot for object with its children, save image info to provided buffer. + * + * @param obj The object to generate snapshot. + * @param cf color format for generated image. + * @param dsc image descriptor to store the image result. + * @param buf the buffer to store image data. + * @param buff_size provided buffer size in bytes. + * + * @return LV_RES_OK on success, LV_RES_INV on error. + */ +lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t * dsc, void * buf, uint32_t buff_size) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_NULL(dsc); + LV_ASSERT_NULL(buf); + + switch(cf) { + case LV_IMG_CF_TRUE_COLOR: + case LV_IMG_CF_TRUE_COLOR_ALPHA: + case LV_IMG_CF_ALPHA_1BIT: + case LV_IMG_CF_ALPHA_2BIT: + case LV_IMG_CF_ALPHA_4BIT: + case LV_IMG_CF_ALPHA_8BIT: + break; + default: + return LV_RES_INV; + } + + if(lv_snapshot_buf_size_needed(obj, cf) > buff_size) + return LV_RES_INV; + + /*Width and height determine snapshot image size.*/ + lv_coord_t w = lv_obj_get_width(obj); + lv_coord_t h = lv_obj_get_height(obj); + lv_coord_t ext_size = _lv_obj_get_ext_draw_size(obj); + w += ext_size * 2; + h += ext_size * 2; + + lv_area_t snapshot_area; + lv_obj_get_coords(obj, &snapshot_area); + lv_area_increase(&snapshot_area, ext_size, ext_size); + + lv_memset(buf, 0x00, buff_size); + lv_memset_00(dsc, sizeof(lv_img_dsc_t)); + + lv_disp_t * obj_disp = lv_obj_get_disp(obj); + lv_disp_drv_t driver; + lv_disp_drv_init(&driver); + /*In lack of a better idea use the resolution of the object's display*/ + driver.hor_res = lv_disp_get_hor_res(obj_disp); + driver.ver_res = lv_disp_get_hor_res(obj_disp); + lv_disp_drv_use_generic_set_px_cb(&driver, cf); + + lv_disp_t fake_disp; + lv_memset_00(&fake_disp, sizeof(lv_disp_t)); + fake_disp.driver = &driver; + + lv_draw_ctx_t * draw_ctx = lv_mem_alloc(obj_disp->driver->draw_ctx_size); + LV_ASSERT_MALLOC(draw_ctx); + if(draw_ctx == NULL) return LV_RES_INV; + obj_disp->driver->draw_ctx_init(fake_disp.driver, draw_ctx); + fake_disp.driver->draw_ctx = draw_ctx; + draw_ctx->clip_area = &snapshot_area; + draw_ctx->buf_area = &snapshot_area; + draw_ctx->buf = (void *)buf; + driver.draw_ctx = draw_ctx; + + lv_disp_t * refr_ori = _lv_refr_get_disp_refreshing(); + _lv_refr_set_disp_refreshing(&fake_disp); + + lv_obj_redraw(draw_ctx, obj); + + _lv_refr_set_disp_refreshing(refr_ori); + obj_disp->driver->draw_ctx_deinit(fake_disp.driver, draw_ctx); + lv_mem_free(draw_ctx); + + dsc->data = buf; + dsc->header.w = w; + dsc->header.h = h; + dsc->header.cf = cf; + return LV_RES_OK; +} + +/** Take snapshot for object with its children, alloc the memory needed. + * + * @param obj The object to generate snapshot. + * @param cf color format for generated image. + * + * @return a pointer to an image descriptor, or NULL if failed. + */ +lv_img_dsc_t * lv_snapshot_take(lv_obj_t * obj, lv_img_cf_t cf) +{ + LV_ASSERT_NULL(obj); + uint32_t buff_size = lv_snapshot_buf_size_needed(obj, cf); + + void * buf = lv_mem_alloc(buff_size); + LV_ASSERT_MALLOC(buf); + if(buf == NULL) { + return NULL; + } + + lv_img_dsc_t * dsc = lv_mem_alloc(sizeof(lv_img_dsc_t)); + LV_ASSERT_MALLOC(buf); + if(dsc == NULL) { + lv_mem_free(buf); + return NULL; + } + + if(lv_snapshot_take_to_buf(obj, cf, dsc, buf, buff_size) == LV_RES_INV) { + lv_mem_free(buf); + lv_mem_free(dsc); + return NULL; + } + + return dsc; +} + +/** Free the snapshot image returned by @ref lv_snapshot_take + * + * It will firstly free the data image takes, then the image descriptor. + * + * @param dsc The image descriptor generated by lv_snapshot_take. + * + */ +void lv_snapshot_free(lv_img_dsc_t * dsc) +{ + if(!dsc) + return; + + if(dsc->data) + lv_mem_free((void *)dsc->data); + + lv_mem_free(dsc); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_SNAPSHOT*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/snapshot/lv_snapshot.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/snapshot/lv_snapshot.h new file mode 100644 index 0000000..6451926 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/others/snapshot/lv_snapshot.h @@ -0,0 +1,84 @@ +/** + * @file lv_snapshot.h + * + */ + +#ifndef LV_SNAPSHOT_H +#define LV_SNAPSHOT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include + +#include "../../../lv_conf_internal.h" +#include "../../../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ + +#if LV_USE_SNAPSHOT +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** Take snapshot for object with its children. + * + * @param obj The object to generate snapshot. + * @param cf color format for generated image. + * + * @return a pointer to an image descriptor, or NULL if failed. + */ +lv_img_dsc_t * lv_snapshot_take(lv_obj_t * obj, lv_img_cf_t cf); + +/** Free the snapshot image returned by @ref lv_snapshot_take + * + * It will firstly free the data image takes, then the image descriptor. + * + * @param dsc The image descriptor generated by lv_snapshot_take. + * + */ +void lv_snapshot_free(lv_img_dsc_t * dsc); + +/** Get the buffer needed for object snapshot image. + * + * @param obj The object to generate snapshot. + * @param cf color format for generated image. + * + * @return the buffer size needed in bytes + */ +uint32_t lv_snapshot_buf_size_needed(lv_obj_t * obj, lv_img_cf_t cf); + +/** Take snapshot for object with its children, save image info to provided buffer. + * + * @param obj The object to generate snapshot. + * @param cf color format for generated image. + * @param dsc image descriptor to store the image result. + * @param buff the buffer to store image data. + * @param buff_size provided buffer size in bytes. + * + * @return LV_RES_OK on success, LV_RES_INV on error. + */ +lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t * dsc, void * buf, uint32_t buff_size); + + +/********************** + * MACROS + **********************/ +#endif /*LV_USE_SNAPSHOT*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/themes/basic/lv_theme_basic.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/themes/basic/lv_theme_basic.c new file mode 100644 index 0000000..d342455 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/themes/basic/lv_theme_basic.c @@ -0,0 +1,428 @@ +/** + * @file lv_theme_basic.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" /*To see all the widgets*/ + +#if LV_USE_THEME_BASIC + +#include "lv_theme_basic.h" +#include "../../../misc/lv_gc.h" + +/********************* + * DEFINES + *********************/ +#define COLOR_SCR lv_palette_lighten(LV_PALETTE_GREY, 4) +#define COLOR_WHITE lv_color_white() +#define COLOR_LIGHT lv_palette_lighten(LV_PALETTE_GREY, 2) +#define COLOR_DARK lv_palette_main(LV_PALETTE_GREY) +#define COLOR_DIM lv_palette_darken(LV_PALETTE_GREY, 2) +#define SCROLLBAR_WIDTH 2 + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_style_t scr; + lv_style_t transp; + lv_style_t white; + lv_style_t light; + lv_style_t dark; + lv_style_t dim; + lv_style_t scrollbar; +#if LV_USE_ARC || LV_USE_COLORWHEEL + lv_style_t arc_line; + lv_style_t arc_knob; +#endif +#if LV_USE_TEXTAREA + lv_style_t ta_cursor; +#endif +} my_theme_styles_t; + + +/********************** + * STATIC PROTOTYPES + **********************/ +static void style_init_reset(lv_style_t * style); +static void theme_apply(lv_theme_t * th, lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ +static my_theme_styles_t * styles; +static lv_theme_t theme; +static bool inited; + +/********************** + * MACROS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void style_init(void) +{ + style_init_reset(&styles->scrollbar); + lv_style_set_bg_opa(&styles->scrollbar, LV_OPA_COVER); + lv_style_set_bg_color(&styles->scrollbar, COLOR_DARK); + lv_style_set_width(&styles->scrollbar, SCROLLBAR_WIDTH); + + style_init_reset(&styles->scr); + lv_style_set_bg_opa(&styles->scr, LV_OPA_COVER); + lv_style_set_bg_color(&styles->scr, COLOR_SCR); + lv_style_set_text_color(&styles->scr, COLOR_DIM); + + + style_init_reset(&styles->transp); + lv_style_set_bg_opa(&styles->transp, LV_OPA_TRANSP); + + style_init_reset(&styles->white); + lv_style_set_bg_opa(&styles->white, LV_OPA_COVER); + lv_style_set_bg_color(&styles->white, COLOR_WHITE); + lv_style_set_line_width(&styles->white, 1); + lv_style_set_line_color(&styles->white, COLOR_WHITE); + lv_style_set_arc_width(&styles->white, 2); + lv_style_set_arc_color(&styles->white, COLOR_WHITE); + + style_init_reset(&styles->light); + lv_style_set_bg_opa(&styles->light, LV_OPA_COVER); + lv_style_set_bg_color(&styles->light, COLOR_LIGHT); + lv_style_set_line_width(&styles->light, 1); + lv_style_set_line_color(&styles->light, COLOR_LIGHT); + lv_style_set_arc_width(&styles->light, 2); + lv_style_set_arc_color(&styles->light, COLOR_LIGHT); + + style_init_reset(&styles->dark); + lv_style_set_bg_opa(&styles->dark, LV_OPA_COVER); + lv_style_set_bg_color(&styles->dark, COLOR_DARK); + lv_style_set_line_width(&styles->dark, 1); + lv_style_set_line_color(&styles->dark, COLOR_DARK); + lv_style_set_arc_width(&styles->dark, 2); + lv_style_set_arc_color(&styles->dark, COLOR_DARK); + + style_init_reset(&styles->dim); + lv_style_set_bg_opa(&styles->dim, LV_OPA_COVER); + lv_style_set_bg_color(&styles->dim, COLOR_DIM); + lv_style_set_line_width(&styles->dim, 1); + lv_style_set_line_color(&styles->dim, COLOR_DIM); + lv_style_set_arc_width(&styles->dim, 2); + lv_style_set_arc_color(&styles->dim, COLOR_DIM); + +#if LV_USE_ARC || LV_USE_COLORWHEEL + style_init_reset(&styles->arc_line); + lv_style_set_arc_width(&styles->arc_line, 6); + style_init_reset(&styles->arc_knob); + lv_style_set_pad_all(&styles->arc_knob, 5); +#endif + +#if LV_USE_TEXTAREA + style_init_reset(&styles->ta_cursor); + lv_style_set_border_side(&styles->ta_cursor, LV_BORDER_SIDE_LEFT); + lv_style_set_border_color(&styles->ta_cursor, COLOR_DIM); + lv_style_set_border_width(&styles->ta_cursor, 2); + lv_style_set_bg_opa(&styles->ta_cursor, LV_OPA_TRANSP); + lv_style_set_anim_time(&styles->ta_cursor, 500); +#endif +} + + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +bool lv_theme_basic_is_inited(void) +{ + return LV_GC_ROOT(_lv_theme_basic_styles) == NULL ? false : true; +} + +lv_theme_t * lv_theme_basic_init(lv_disp_t * disp) +{ + + /*This trick is required only to avoid the garbage collection of + *styles' data if LVGL is used in a binding (e.g. Micropython) + *In a general case styles could be in simple `static lv_style_t my_style...` variables*/ + if(!lv_theme_basic_is_inited()) { + inited = false; + LV_GC_ROOT(_lv_theme_basic_styles) = lv_mem_alloc(sizeof(my_theme_styles_t)); + styles = (my_theme_styles_t *)LV_GC_ROOT(_lv_theme_basic_styles); + } + + theme.disp = disp; + theme.font_small = LV_FONT_DEFAULT; + theme.font_normal = LV_FONT_DEFAULT; + theme.font_large = LV_FONT_DEFAULT; + theme.apply_cb = theme_apply; + + style_init(); + + if(disp == NULL || lv_disp_get_theme(disp) == &theme) { + lv_obj_report_style_change(NULL); + } + + inited = true; + + return (lv_theme_t *)&theme; +} + + +static void theme_apply(lv_theme_t * th, lv_obj_t * obj) +{ + LV_UNUSED(th); + + if(lv_obj_get_parent(obj) == NULL) { + lv_obj_add_style(obj, &styles->scr, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + return; + } + + if(lv_obj_check_type(obj, &lv_obj_class)) { +#if LV_USE_TABVIEW + lv_obj_t * parent = lv_obj_get_parent(obj); + /*Tabview content area*/ + if(lv_obj_check_type(parent, &lv_tabview_class)) { + lv_obj_add_style(obj, &styles->scr, 0); + return; + } + /*Tabview pages*/ + else if(lv_obj_check_type(lv_obj_get_parent(parent), &lv_tabview_class)) { + lv_obj_add_style(obj, &styles->scr, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + return; + } +#endif + +#if LV_USE_WIN + /*Header*/ + if(lv_obj_get_index(obj) == 0 && lv_obj_check_type(lv_obj_get_parent(obj), &lv_win_class)) { + lv_obj_add_style(obj, &styles->light, 0); + return; + } + /*Content*/ + else if(lv_obj_get_index(obj) == 1 && lv_obj_check_type(lv_obj_get_parent(obj), &lv_win_class)) { + lv_obj_add_style(obj, &styles->light, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + return; + } +#endif + lv_obj_add_style(obj, &styles->white, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + } +#if LV_USE_BTN + else if(lv_obj_check_type(obj, &lv_btn_class)) { + lv_obj_add_style(obj, &styles->dark, 0); + } +#endif + +#if LV_USE_BTNMATRIX + else if(lv_obj_check_type(obj, &lv_btnmatrix_class)) { +#if LV_USE_MSGBOX + if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_msgbox_class)) { + lv_obj_add_style(obj, &styles->light, LV_PART_ITEMS); + return; + } +#endif +#if LV_USE_TABVIEW + if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_tabview_class)) { + lv_obj_add_style(obj, &styles->light, LV_PART_ITEMS); + return; + } +#endif + lv_obj_add_style(obj, &styles->white, 0); + lv_obj_add_style(obj, &styles->light, LV_PART_ITEMS); + } +#endif + +#if LV_USE_BAR + else if(lv_obj_check_type(obj, &lv_bar_class)) { + lv_obj_add_style(obj, &styles->light, 0); + lv_obj_add_style(obj, &styles->dark, LV_PART_INDICATOR); + } +#endif + +#if LV_USE_SLIDER + else if(lv_obj_check_type(obj, &lv_slider_class)) { + lv_obj_add_style(obj, &styles->light, 0); + lv_obj_add_style(obj, &styles->dark, LV_PART_INDICATOR); + lv_obj_add_style(obj, &styles->dim, LV_PART_KNOB); + } +#endif + +#if LV_USE_TABLE + else if(lv_obj_check_type(obj, &lv_table_class)) { + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &styles->light, LV_PART_ITEMS); + } +#endif + +#if LV_USE_CHECKBOX + else if(lv_obj_check_type(obj, &lv_checkbox_class)) { + lv_obj_add_style(obj, &styles->light, LV_PART_INDICATOR); + lv_obj_add_style(obj, &styles->dark, LV_PART_INDICATOR | LV_STATE_CHECKED); + } +#endif + +#if LV_USE_SWITCH + else if(lv_obj_check_type(obj, &lv_switch_class)) { + lv_obj_add_style(obj, &styles->light, 0); + lv_obj_add_style(obj, &styles->dim, LV_PART_KNOB); + } +#endif + +#if LV_USE_CHART + else if(lv_obj_check_type(obj, &lv_chart_class)) { + lv_obj_add_style(obj, &styles->white, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &styles->light, LV_PART_ITEMS); + lv_obj_add_style(obj, &styles->dark, LV_PART_TICKS); + lv_obj_add_style(obj, &styles->dark, LV_PART_CURSOR); + } +#endif + +#if LV_USE_ROLLER + else if(lv_obj_check_type(obj, &lv_roller_class)) { + lv_obj_add_style(obj, &styles->light, 0); + lv_obj_add_style(obj, &styles->dark, LV_PART_SELECTED); + } +#endif + +#if LV_USE_DROPDOWN + else if(lv_obj_check_type(obj, &lv_dropdown_class)) { + lv_obj_add_style(obj, &styles->white, 0); + } + else if(lv_obj_check_type(obj, &lv_dropdownlist_class)) { + lv_obj_add_style(obj, &styles->white, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &styles->light, LV_PART_SELECTED); + lv_obj_add_style(obj, &styles->dark, LV_PART_SELECTED | LV_STATE_CHECKED); + } +#endif + +#if LV_USE_ARC + else if(lv_obj_check_type(obj, &lv_arc_class)) { + lv_obj_add_style(obj, &styles->light, 0); + lv_obj_add_style(obj, &styles->transp, 0); + lv_obj_add_style(obj, &styles->arc_line, 0); + lv_obj_add_style(obj, &styles->dark, LV_PART_INDICATOR); + lv_obj_add_style(obj, &styles->arc_line, LV_PART_INDICATOR); + lv_obj_add_style(obj, &styles->dim, LV_PART_KNOB); + lv_obj_add_style(obj, &styles->arc_knob, LV_PART_KNOB); + } +#endif + +#if LV_USE_SPINNER + else if(lv_obj_check_type(obj, &lv_spinner_class)) { + lv_obj_add_style(obj, &styles->light, 0); + lv_obj_add_style(obj, &styles->transp, 0); + lv_obj_add_style(obj, &styles->arc_line, 0); + lv_obj_add_style(obj, &styles->dark, LV_PART_INDICATOR); + lv_obj_add_style(obj, &styles->arc_line, LV_PART_INDICATOR); + } +#endif + +#if LV_USE_COLORWHEEL + else if(lv_obj_check_type(obj, &lv_colorwheel_class)) { + lv_obj_add_style(obj, &styles->light, 0); + lv_obj_add_style(obj, &styles->transp, 0); + lv_obj_add_style(obj, &styles->arc_line, 0); + lv_obj_add_style(obj, &styles->dim, LV_PART_KNOB); + lv_obj_add_style(obj, &styles->arc_knob, LV_PART_KNOB); + } +#endif + +#if LV_USE_METER + else if(lv_obj_check_type(obj, &lv_meter_class)) { + lv_obj_add_style(obj, &styles->light, 0); + } +#endif + +#if LV_USE_TEXTAREA + else if(lv_obj_check_type(obj, &lv_textarea_class)) { + lv_obj_add_style(obj, &styles->white, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &styles->ta_cursor, LV_PART_CURSOR | LV_STATE_FOCUSED); + } +#endif + +#if LV_USE_CALENDAR + else if(lv_obj_check_type(obj, &lv_calendar_class)) { + lv_obj_add_style(obj, &styles->light, 0); + } +#endif + +#if LV_USE_KEYBOARD + else if(lv_obj_check_type(obj, &lv_keyboard_class)) { + lv_obj_add_style(obj, &styles->scr, 0); + lv_obj_add_style(obj, &styles->white, LV_PART_ITEMS); + lv_obj_add_style(obj, &styles->light, LV_PART_ITEMS | LV_STATE_CHECKED); + } +#endif +#if LV_USE_LIST + else if(lv_obj_check_type(obj, &lv_list_class)) { + lv_obj_add_style(obj, &styles->light, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + return; + } + else if(lv_obj_check_type(obj, &lv_list_text_class)) { + + } + else if(lv_obj_check_type(obj, &lv_list_btn_class)) { + lv_obj_add_style(obj, &styles->dark, 0); + + } +#endif +#if LV_USE_MSGBOX + else if(lv_obj_check_type(obj, &lv_msgbox_class)) { + lv_obj_add_style(obj, &styles->light, 0); + return; + } +#endif +#if LV_USE_SPINBOX + else if(lv_obj_check_type(obj, &lv_spinbox_class)) { + lv_obj_add_style(obj, &styles->light, 0); + lv_obj_add_style(obj, &styles->dark, LV_PART_CURSOR); + } +#endif +#if LV_USE_TILEVIEW + else if(lv_obj_check_type(obj, &lv_tileview_class)) { + lv_obj_add_style(obj, &styles->scr, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + } + else if(lv_obj_check_type(obj, &lv_tileview_tile_class)) { + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + } +#endif + +#if LV_USE_COLORWHEEL + else if(lv_obj_check_type(obj, &lv_colorwheel_class)) { + lv_obj_add_style(obj, &styles->light, 0); + lv_obj_add_style(obj, &styles->light, LV_PART_KNOB); + } +#endif + +#if LV_USE_LED + else if(lv_obj_check_type(obj, &lv_led_class)) { + lv_obj_add_style(obj, &styles->light, 0); + } +#endif +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void style_init_reset(lv_style_t * style) +{ + if(inited) { + lv_style_reset(style); + } + else { + lv_style_init(style); + } +} + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/themes/basic/lv_theme_basic.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/themes/basic/lv_theme_basic.h new file mode 100644 index 0000000..93a8fa8 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/themes/basic/lv_theme_basic.h @@ -0,0 +1,55 @@ +/** + * @file lv_theme_basic.h + * + */ + +#ifndef LV_THEME_BASIC_H +#define LV_THEME_BASIC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../core/lv_obj.h" + +#if LV_USE_THEME_BASIC + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the theme + * @param disp pointer to display to attach the theme + * @return a pointer to reference this theme later + */ +lv_theme_t * lv_theme_basic_init(lv_disp_t * disp); + +/** +* Check if the theme is initialized +* @return true if default theme is initialized, false otherwise +*/ +bool lv_theme_basic_is_inited(void); + +/********************** + * MACROS + **********************/ + +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_THEME_BASIC_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/themes/default/lv_theme_default.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/themes/default/lv_theme_default.c new file mode 100644 index 0000000..47392b0 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/themes/default/lv_theme_default.c @@ -0,0 +1,1181 @@ +/** + * @file lv_theme_default.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" /*To see all the widgets*/ + +#if LV_USE_THEME_DEFAULT + +#include "lv_theme_default.h" +#include "../../../misc/lv_gc.h" + +/********************* + * DEFINES + *********************/ +#define MODE_DARK 1 +#define RADIUS_DEFAULT (disp_size == DISP_LARGE ? lv_disp_dpx(theme.disp, 12) : lv_disp_dpx(theme.disp, 8)) + +/*SCREEN*/ +#define LIGHT_COLOR_SCR lv_palette_lighten(LV_PALETTE_GREY, 4) +#define LIGHT_COLOR_CARD lv_color_white() +#define LIGHT_COLOR_TEXT lv_palette_darken(LV_PALETTE_GREY, 4) +#define LIGHT_COLOR_GREY lv_palette_lighten(LV_PALETTE_GREY, 2) +#define DARK_COLOR_SCR lv_color_hex(0x15171A) +#define DARK_COLOR_CARD lv_color_hex(0x282b30) +#define DARK_COLOR_TEXT lv_palette_lighten(LV_PALETTE_GREY, 5) +#define DARK_COLOR_GREY lv_color_hex(0x2f3237) + +#define TRANSITION_TIME LV_THEME_DEFAULT_TRANSITION_TIME +#define BORDER_WIDTH lv_disp_dpx(theme.disp, 2) +#define OUTLINE_WIDTH lv_disp_dpx(theme.disp, 3) + +#define PAD_DEF (disp_size == DISP_LARGE ? lv_disp_dpx(theme.disp, 24) : disp_size == DISP_MEDIUM ? lv_disp_dpx(theme.disp, 20) : lv_disp_dpx(theme.disp, 16)) +#define PAD_SMALL (disp_size == DISP_LARGE ? lv_disp_dpx(theme.disp, 14) : disp_size == DISP_MEDIUM ? lv_disp_dpx(theme.disp, 12) : lv_disp_dpx(theme.disp, 10)) +#define PAD_TINY (disp_size == DISP_LARGE ? lv_disp_dpx(theme.disp, 8) : disp_size == DISP_MEDIUM ? lv_disp_dpx(theme.disp, 6) : lv_disp_dpx(theme.disp, 2)) + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_style_t scr; + lv_style_t scrollbar; + lv_style_t scrollbar_scrolled; + lv_style_t card; + lv_style_t btn; + + /*Utility*/ + lv_style_t bg_color_primary; + lv_style_t bg_color_primary_muted; + lv_style_t bg_color_secondary; + lv_style_t bg_color_secondary_muted; + lv_style_t bg_color_grey; + lv_style_t bg_color_white; + lv_style_t pressed; + lv_style_t disabled; + lv_style_t pad_zero; + lv_style_t pad_tiny; + lv_style_t pad_small; + lv_style_t pad_normal; + lv_style_t pad_gap; + lv_style_t line_space_large; + lv_style_t text_align_center; + lv_style_t outline_primary; + lv_style_t outline_secondary; + lv_style_t circle; + lv_style_t no_radius; + lv_style_t clip_corner; +#if LV_THEME_DEFAULT_GROW + lv_style_t grow; +#endif + lv_style_t transition_delayed; + lv_style_t transition_normal; + lv_style_t anim; + lv_style_t anim_fast; + + /*Parts*/ + lv_style_t knob; + lv_style_t indic; + +#if LV_USE_ARC + lv_style_t arc_indic; + lv_style_t arc_indic_primary; +#endif + +#if LV_USE_CHART + lv_style_t chart_series, chart_indic, chart_ticks, chart_bg; +#endif + +#if LV_USE_DROPDOWN + lv_style_t dropdown_list; +#endif + +#if LV_USE_CHECKBOX + lv_style_t cb_marker, cb_marker_checked; +#endif + +#if LV_USE_SWITCH + lv_style_t switch_knob; +#endif + +#if LV_USE_LINE + lv_style_t line; +#endif + +#if LV_USE_TABLE + lv_style_t table_cell; +#endif + +#if LV_USE_METER + lv_style_t meter_marker, meter_indic; +#endif + +#if LV_USE_TEXTAREA + lv_style_t ta_cursor, ta_placeholder; +#endif + +#if LV_USE_CALENDAR + lv_style_t calendar_btnm_bg, calendar_btnm_day, calendar_header; +#endif + +#if LV_USE_COLORWHEEL + lv_style_t colorwheel_main; +#endif + +#if LV_USE_MENU + lv_style_t menu_bg, menu_cont, menu_sidebar_cont, menu_main_cont, menu_page, menu_header_cont, menu_header_btn, + menu_section, menu_pressed, menu_separator; +#endif + +#if LV_USE_MSGBOX + lv_style_t msgbox_bg, msgbox_btn_bg, msgbox_backdrop_bg; +#endif + +#if LV_USE_KEYBOARD + lv_style_t keyboard_btn_bg; +#endif + +#if LV_USE_LIST + lv_style_t list_bg, list_btn, list_item_grow, list_label; +#endif + +#if LV_USE_TABVIEW + lv_style_t tab_bg_focus, tab_btn; +#endif +#if LV_USE_LED + lv_style_t led; +#endif +} my_theme_styles_t; + +typedef struct { + lv_theme_t base; + uint8_t light : 1; +} my_theme_t; + +typedef enum { + DISP_SMALL = 3, + DISP_MEDIUM = 2, + DISP_LARGE = 1, +} disp_size_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void theme_apply(lv_theme_t * th, lv_obj_t * obj); +static void style_init_reset(lv_style_t * style); + +/********************** + * STATIC VARIABLES + **********************/ +static my_theme_styles_t * styles; +static lv_theme_t theme; +static disp_size_t disp_size; +static lv_color_t color_scr; +static lv_color_t color_text; +static lv_color_t color_card; +static lv_color_t color_grey; +static bool inited = false; + + +/********************** + * MACROS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + + +static lv_color_t dark_color_filter_cb(const lv_color_filter_dsc_t * f, lv_color_t c, lv_opa_t opa) +{ + LV_UNUSED(f); + return lv_color_darken(c, opa); +} + +static lv_color_t grey_filter_cb(const lv_color_filter_dsc_t * f, lv_color_t color, lv_opa_t opa) +{ + LV_UNUSED(f); + if(theme.flags & MODE_DARK) return lv_color_mix(lv_palette_darken(LV_PALETTE_GREY, 2), color, opa); + else return lv_color_mix(lv_palette_lighten(LV_PALETTE_GREY, 2), color, opa); +} + +static void style_init(void) +{ + static const lv_style_prop_t trans_props[] = { + LV_STYLE_BG_OPA, LV_STYLE_BG_COLOR, + LV_STYLE_TRANSFORM_WIDTH, LV_STYLE_TRANSFORM_HEIGHT, + LV_STYLE_TRANSLATE_Y, LV_STYLE_TRANSLATE_X, + LV_STYLE_TRANSFORM_ZOOM, LV_STYLE_TRANSFORM_ANGLE, + LV_STYLE_COLOR_FILTER_OPA, LV_STYLE_COLOR_FILTER_DSC, + 0 + }; + + color_scr = theme.flags & MODE_DARK ? DARK_COLOR_SCR : LIGHT_COLOR_SCR; + color_text = theme.flags & MODE_DARK ? DARK_COLOR_TEXT : LIGHT_COLOR_TEXT; + color_card = theme.flags & MODE_DARK ? DARK_COLOR_CARD : LIGHT_COLOR_CARD; + color_grey = theme.flags & MODE_DARK ? DARK_COLOR_GREY : LIGHT_COLOR_GREY; + + style_init_reset(&styles->transition_delayed); + style_init_reset(&styles->transition_normal); +#if TRANSITION_TIME + static lv_style_transition_dsc_t trans_delayed; + lv_style_transition_dsc_init(&trans_delayed, trans_props, lv_anim_path_linear, TRANSITION_TIME, 70, NULL); + + static lv_style_transition_dsc_t trans_normal; + lv_style_transition_dsc_init(&trans_normal, trans_props, lv_anim_path_linear, TRANSITION_TIME, 0, NULL); + + lv_style_set_transition(&styles->transition_delayed, &trans_delayed); /*Go back to default state with delay*/ + + lv_style_set_transition(&styles->transition_normal, &trans_normal); /*Go back to default state with delay*/ +#endif + + style_init_reset(&styles->scrollbar); + lv_color_t sb_color = (theme.flags & MODE_DARK) ? lv_palette_darken(LV_PALETTE_GREY, + 2) : lv_palette_main(LV_PALETTE_GREY); + lv_style_set_bg_color(&styles->scrollbar, sb_color); + + lv_style_set_radius(&styles->scrollbar, LV_RADIUS_CIRCLE); + lv_style_set_pad_all(&styles->scrollbar, lv_disp_dpx(theme.disp, 7)); + lv_style_set_width(&styles->scrollbar, lv_disp_dpx(theme.disp, 5)); + lv_style_set_bg_opa(&styles->scrollbar, LV_OPA_40); +#if TRANSITION_TIME + lv_style_set_transition(&styles->scrollbar, &trans_normal); +#endif + + style_init_reset(&styles->scrollbar_scrolled); + lv_style_set_bg_opa(&styles->scrollbar_scrolled, LV_OPA_COVER); + + style_init_reset(&styles->scr); + lv_style_set_bg_opa(&styles->scr, LV_OPA_COVER); + lv_style_set_bg_color(&styles->scr, color_scr); + lv_style_set_text_color(&styles->scr, color_text); + lv_style_set_pad_row(&styles->scr, PAD_SMALL); + lv_style_set_pad_column(&styles->scr, PAD_SMALL); + + style_init_reset(&styles->card); + lv_style_set_radius(&styles->card, RADIUS_DEFAULT); + lv_style_set_bg_opa(&styles->card, LV_OPA_COVER); + lv_style_set_bg_color(&styles->card, color_card); + lv_style_set_border_color(&styles->card, color_grey); + lv_style_set_border_width(&styles->card, BORDER_WIDTH); + lv_style_set_border_post(&styles->card, true); + lv_style_set_text_color(&styles->card, color_text); + lv_style_set_pad_all(&styles->card, PAD_DEF); + lv_style_set_pad_row(&styles->card, PAD_SMALL); + lv_style_set_pad_column(&styles->card, PAD_SMALL); + lv_style_set_line_color(&styles->card, lv_palette_main(LV_PALETTE_GREY)); + lv_style_set_line_width(&styles->card, lv_disp_dpx(theme.disp, 1)); + + style_init_reset(&styles->outline_primary); + lv_style_set_outline_color(&styles->outline_primary, theme.color_primary); + lv_style_set_outline_width(&styles->outline_primary, OUTLINE_WIDTH); + lv_style_set_outline_pad(&styles->outline_primary, OUTLINE_WIDTH); + lv_style_set_outline_opa(&styles->outline_primary, LV_OPA_50); + + style_init_reset(&styles->outline_secondary); + lv_style_set_outline_color(&styles->outline_secondary, theme.color_secondary); + lv_style_set_outline_width(&styles->outline_secondary, OUTLINE_WIDTH); + lv_style_set_outline_opa(&styles->outline_secondary, LV_OPA_50); + + style_init_reset(&styles->btn); + lv_style_set_radius(&styles->btn, (disp_size == DISP_LARGE ? lv_disp_dpx(theme.disp, + 16) : disp_size == DISP_MEDIUM ? lv_disp_dpx(theme.disp, 12) : lv_disp_dpx(theme.disp, 8))); + lv_style_set_bg_opa(&styles->btn, LV_OPA_COVER); + lv_style_set_bg_color(&styles->btn, color_grey); + if(!(theme.flags & MODE_DARK)) { + lv_style_set_shadow_color(&styles->btn, lv_palette_main(LV_PALETTE_GREY)); + lv_style_set_shadow_width(&styles->btn, LV_DPX(3)); + lv_style_set_shadow_opa(&styles->btn, LV_OPA_50); + lv_style_set_shadow_ofs_y(&styles->btn, lv_disp_dpx(theme.disp, LV_DPX(4))); + } + lv_style_set_text_color(&styles->btn, color_text); + lv_style_set_pad_hor(&styles->btn, PAD_DEF); + lv_style_set_pad_ver(&styles->btn, PAD_SMALL); + lv_style_set_pad_column(&styles->btn, lv_disp_dpx(theme.disp, 5)); + lv_style_set_pad_row(&styles->btn, lv_disp_dpx(theme.disp, 5)); + + static lv_color_filter_dsc_t dark_filter; + lv_color_filter_dsc_init(&dark_filter, dark_color_filter_cb); + + static lv_color_filter_dsc_t grey_filter; + lv_color_filter_dsc_init(&grey_filter, grey_filter_cb); + + style_init_reset(&styles->pressed); + lv_style_set_color_filter_dsc(&styles->pressed, &dark_filter); + lv_style_set_color_filter_opa(&styles->pressed, 35); + + style_init_reset(&styles->disabled); + lv_style_set_color_filter_dsc(&styles->disabled, &grey_filter); + lv_style_set_color_filter_opa(&styles->disabled, LV_OPA_50); + + style_init_reset(&styles->clip_corner); + lv_style_set_clip_corner(&styles->clip_corner, true); + lv_style_set_border_post(&styles->clip_corner, true); + + style_init_reset(&styles->pad_normal); + lv_style_set_pad_all(&styles->pad_normal, PAD_DEF); + lv_style_set_pad_row(&styles->pad_normal, PAD_DEF); + lv_style_set_pad_column(&styles->pad_normal, PAD_DEF); + + style_init_reset(&styles->pad_small); + lv_style_set_pad_all(&styles->pad_small, PAD_SMALL); + lv_style_set_pad_gap(&styles->pad_small, PAD_SMALL); + + style_init_reset(&styles->pad_gap); + lv_style_set_pad_row(&styles->pad_gap, lv_disp_dpx(theme.disp, 10)); + lv_style_set_pad_column(&styles->pad_gap, lv_disp_dpx(theme.disp, 10)); + + style_init_reset(&styles->line_space_large); + lv_style_set_text_line_space(&styles->line_space_large, lv_disp_dpx(theme.disp, 20)); + + style_init_reset(&styles->text_align_center); + lv_style_set_text_align(&styles->text_align_center, LV_TEXT_ALIGN_CENTER); + + style_init_reset(&styles->pad_zero); + lv_style_set_pad_all(&styles->pad_zero, 0); + lv_style_set_pad_row(&styles->pad_zero, 0); + lv_style_set_pad_column(&styles->pad_zero, 0); + + style_init_reset(&styles->pad_tiny); + lv_style_set_pad_all(&styles->pad_tiny, PAD_TINY); + lv_style_set_pad_row(&styles->pad_tiny, PAD_TINY); + lv_style_set_pad_column(&styles->pad_tiny, PAD_TINY); + + style_init_reset(&styles->bg_color_primary); + lv_style_set_bg_color(&styles->bg_color_primary, theme.color_primary); + lv_style_set_text_color(&styles->bg_color_primary, lv_color_white()); + lv_style_set_bg_opa(&styles->bg_color_primary, LV_OPA_COVER); + + style_init_reset(&styles->bg_color_primary_muted); + lv_style_set_bg_color(&styles->bg_color_primary_muted, theme.color_primary); + lv_style_set_text_color(&styles->bg_color_primary_muted, theme.color_primary); + lv_style_set_bg_opa(&styles->bg_color_primary_muted, LV_OPA_20); + + style_init_reset(&styles->bg_color_secondary); + lv_style_set_bg_color(&styles->bg_color_secondary, theme.color_secondary); + lv_style_set_text_color(&styles->bg_color_secondary, lv_color_white()); + lv_style_set_bg_opa(&styles->bg_color_secondary, LV_OPA_COVER); + + style_init_reset(&styles->bg_color_secondary_muted); + lv_style_set_bg_color(&styles->bg_color_secondary_muted, theme.color_secondary); + lv_style_set_text_color(&styles->bg_color_secondary_muted, theme.color_secondary); + lv_style_set_bg_opa(&styles->bg_color_secondary_muted, LV_OPA_20); + + style_init_reset(&styles->bg_color_grey); + lv_style_set_bg_color(&styles->bg_color_grey, color_grey); + lv_style_set_bg_opa(&styles->bg_color_grey, LV_OPA_COVER); + lv_style_set_text_color(&styles->bg_color_grey, color_text); + + style_init_reset(&styles->bg_color_white); + lv_style_set_bg_color(&styles->bg_color_white, color_card); + lv_style_set_bg_opa(&styles->bg_color_white, LV_OPA_COVER); + lv_style_set_text_color(&styles->bg_color_white, color_text); + + style_init_reset(&styles->circle); + lv_style_set_radius(&styles->circle, LV_RADIUS_CIRCLE); + + style_init_reset(&styles->no_radius); + lv_style_set_radius(&styles->no_radius, 0); + +#if LV_THEME_DEFAULT_GROW + style_init_reset(&styles->grow); + lv_style_set_transform_width(&styles->grow, lv_disp_dpx(theme.disp, 3)); + lv_style_set_transform_height(&styles->grow, lv_disp_dpx(theme.disp, 3)); +#endif + + style_init_reset(&styles->knob); + lv_style_set_bg_color(&styles->knob, theme.color_primary); + lv_style_set_bg_opa(&styles->knob, LV_OPA_COVER); + lv_style_set_pad_all(&styles->knob, lv_disp_dpx(theme.disp, 6)); + lv_style_set_radius(&styles->knob, LV_RADIUS_CIRCLE); + + style_init_reset(&styles->anim); + lv_style_set_anim_time(&styles->anim, 200); + + style_init_reset(&styles->anim_fast); + lv_style_set_anim_time(&styles->anim_fast, 120); + +#if LV_USE_ARC + style_init_reset(&styles->arc_indic); + lv_style_set_arc_color(&styles->arc_indic, color_grey); + lv_style_set_arc_width(&styles->arc_indic, lv_disp_dpx(theme.disp, 15)); + lv_style_set_arc_rounded(&styles->arc_indic, true); + + style_init_reset(&styles->arc_indic_primary); + lv_style_set_arc_color(&styles->arc_indic_primary, theme.color_primary); +#endif + +#if LV_USE_DROPDOWN + style_init_reset(&styles->dropdown_list); + lv_style_set_max_height(&styles->dropdown_list, LV_DPI_DEF * 2); +#endif +#if LV_USE_CHECKBOX + style_init_reset(&styles->cb_marker); + lv_style_set_pad_all(&styles->cb_marker, lv_disp_dpx(theme.disp, 3)); + lv_style_set_border_width(&styles->cb_marker, BORDER_WIDTH); + lv_style_set_border_color(&styles->cb_marker, theme.color_primary); + lv_style_set_bg_color(&styles->cb_marker, color_card); + lv_style_set_bg_opa(&styles->cb_marker, LV_OPA_COVER); + lv_style_set_radius(&styles->cb_marker, RADIUS_DEFAULT / 2); + + style_init_reset(&styles->cb_marker_checked); + lv_style_set_bg_img_src(&styles->cb_marker_checked, LV_SYMBOL_OK); + lv_style_set_text_color(&styles->cb_marker_checked, lv_color_white()); + lv_style_set_text_font(&styles->cb_marker_checked, theme.font_small); +#endif + +#if LV_USE_SWITCH + style_init_reset(&styles->switch_knob); + lv_style_set_pad_all(&styles->switch_knob, - lv_disp_dpx(theme.disp, 4)); + lv_style_set_bg_color(&styles->switch_knob, lv_color_white()); +#endif + +#if LV_USE_LINE + style_init_reset(&styles->line); + lv_style_set_line_width(&styles->line, 1); + lv_style_set_line_color(&styles->line, color_text); +#endif + +#if LV_USE_CHART + style_init_reset(&styles->chart_bg); + lv_style_set_border_post(&styles->chart_bg, false); + lv_style_set_pad_column(&styles->chart_bg, lv_disp_dpx(theme.disp, 10)); + lv_style_set_line_color(&styles->chart_bg, color_grey); + + style_init_reset(&styles->chart_series); + lv_style_set_line_width(&styles->chart_series, lv_disp_dpx(theme.disp, 3)); + lv_style_set_radius(&styles->chart_series, lv_disp_dpx(theme.disp, 3)); + lv_style_set_size(&styles->chart_series, lv_disp_dpx(theme.disp, 8)); + lv_style_set_pad_column(&styles->chart_series, lv_disp_dpx(theme.disp, 2)); + + style_init_reset(&styles->chart_indic); + lv_style_set_radius(&styles->chart_indic, LV_RADIUS_CIRCLE); + lv_style_set_size(&styles->chart_indic, lv_disp_dpx(theme.disp, 8)); + lv_style_set_bg_color(&styles->chart_indic, theme.color_primary); + lv_style_set_bg_opa(&styles->chart_indic, LV_OPA_COVER); + + style_init_reset(&styles->chart_ticks); + lv_style_set_line_width(&styles->chart_ticks, lv_disp_dpx(theme.disp, 1)); + lv_style_set_line_color(&styles->chart_ticks, color_text); + lv_style_set_pad_all(&styles->chart_ticks, lv_disp_dpx(theme.disp, 2)); + lv_style_set_text_color(&styles->chart_ticks, lv_palette_main(LV_PALETTE_GREY)); +#endif + +#if LV_USE_MENU + style_init_reset(&styles->menu_bg); + lv_style_set_pad_all(&styles->menu_bg, 0); + lv_style_set_pad_gap(&styles->menu_bg, 0); + lv_style_set_radius(&styles->menu_bg, 0); + lv_style_set_clip_corner(&styles->menu_bg, true); + lv_style_set_border_side(&styles->menu_bg, LV_BORDER_SIDE_NONE); + + style_init_reset(&styles->menu_section); + lv_style_set_radius(&styles->menu_section, RADIUS_DEFAULT); + lv_style_set_clip_corner(&styles->menu_section, true); + lv_style_set_bg_opa(&styles->menu_section, LV_OPA_COVER); + lv_style_set_bg_color(&styles->menu_section, color_card); + lv_style_set_text_color(&styles->menu_section, color_text); + + style_init_reset(&styles->menu_cont); + lv_style_set_pad_hor(&styles->menu_cont, PAD_SMALL); + lv_style_set_pad_ver(&styles->menu_cont, PAD_SMALL); + lv_style_set_pad_gap(&styles->menu_cont, PAD_SMALL); + lv_style_set_border_width(&styles->menu_cont, lv_disp_dpx(theme.disp, 1)); + lv_style_set_border_opa(&styles->menu_cont, LV_OPA_10); + lv_style_set_border_color(&styles->menu_cont, color_text); + lv_style_set_border_side(&styles->menu_cont, LV_BORDER_SIDE_NONE); + + style_init_reset(&styles->menu_sidebar_cont); + lv_style_set_pad_all(&styles->menu_sidebar_cont, 0); + lv_style_set_pad_gap(&styles->menu_sidebar_cont, 0); + lv_style_set_border_width(&styles->menu_sidebar_cont, lv_disp_dpx(theme.disp, 1)); + lv_style_set_border_opa(&styles->menu_sidebar_cont, LV_OPA_10); + lv_style_set_border_color(&styles->menu_sidebar_cont, color_text); + lv_style_set_border_side(&styles->menu_sidebar_cont, LV_BORDER_SIDE_RIGHT); + + style_init_reset(&styles->menu_main_cont); + lv_style_set_pad_all(&styles->menu_main_cont, 0); + lv_style_set_pad_gap(&styles->menu_main_cont, 0); + + style_init_reset(&styles->menu_header_cont); + lv_style_set_pad_hor(&styles->menu_header_cont, PAD_SMALL); + lv_style_set_pad_ver(&styles->menu_header_cont, PAD_TINY); + lv_style_set_pad_gap(&styles->menu_header_cont, PAD_SMALL); + + style_init_reset(&styles->menu_header_btn); + lv_style_set_pad_hor(&styles->menu_header_btn, PAD_TINY); + lv_style_set_pad_ver(&styles->menu_header_btn, PAD_TINY); + lv_style_set_shadow_opa(&styles->menu_header_btn, LV_OPA_TRANSP); + lv_style_set_bg_opa(&styles->menu_header_btn, LV_OPA_TRANSP); + lv_style_set_text_color(&styles->menu_header_btn, color_text); + + style_init_reset(&styles->menu_page); + lv_style_set_pad_hor(&styles->menu_page, 0); + lv_style_set_pad_gap(&styles->menu_page, 0); + + style_init_reset(&styles->menu_pressed); + lv_style_set_bg_opa(&styles->menu_pressed, LV_OPA_20); + lv_style_set_bg_color(&styles->menu_pressed, lv_palette_main(LV_PALETTE_GREY)); + + style_init_reset(&styles->menu_separator); + lv_style_set_bg_opa(&styles->menu_separator, LV_OPA_TRANSP); + lv_style_set_pad_ver(&styles->menu_separator, PAD_TINY); +#endif + +#if LV_USE_METER + style_init_reset(&styles->meter_marker); + lv_style_set_line_width(&styles->meter_marker, lv_disp_dpx(theme.disp, 5)); + lv_style_set_line_color(&styles->meter_marker, color_text); + lv_style_set_size(&styles->meter_marker, lv_disp_dpx(theme.disp, 20)); + lv_style_set_pad_left(&styles->meter_marker, lv_disp_dpx(theme.disp, 15)); + + style_init_reset(&styles->meter_indic); + lv_style_set_radius(&styles->meter_indic, LV_RADIUS_CIRCLE); + lv_style_set_bg_color(&styles->meter_indic, color_text); + lv_style_set_bg_opa(&styles->meter_indic, LV_OPA_COVER); + lv_style_set_size(&styles->meter_indic, lv_disp_dpx(theme.disp, 15)); +#endif + +#if LV_USE_TABLE + style_init_reset(&styles->table_cell); + lv_style_set_border_width(&styles->table_cell, lv_disp_dpx(theme.disp, 1)); + lv_style_set_border_color(&styles->table_cell, color_grey); + lv_style_set_border_side(&styles->table_cell, LV_BORDER_SIDE_TOP | LV_BORDER_SIDE_BOTTOM); +#endif + +#if LV_USE_TEXTAREA + style_init_reset(&styles->ta_cursor); + lv_style_set_border_color(&styles->ta_cursor, color_text); + lv_style_set_border_width(&styles->ta_cursor, lv_disp_dpx(theme.disp, 2)); + lv_style_set_pad_left(&styles->ta_cursor, - lv_disp_dpx(theme.disp, 1)); + lv_style_set_border_side(&styles->ta_cursor, LV_BORDER_SIDE_LEFT); + lv_style_set_anim_time(&styles->ta_cursor, 400); + + style_init_reset(&styles->ta_placeholder); + lv_style_set_text_color(&styles->ta_placeholder, (theme.flags & MODE_DARK) ? lv_palette_darken(LV_PALETTE_GREY, + 2) : lv_palette_lighten(LV_PALETTE_GREY, 1)); +#endif + +#if LV_USE_CALENDAR + style_init_reset(&styles->calendar_btnm_bg); + lv_style_set_pad_all(&styles->calendar_btnm_bg, PAD_SMALL); + lv_style_set_pad_gap(&styles->calendar_btnm_bg, PAD_SMALL / 2); + + style_init_reset(&styles->calendar_btnm_day); + lv_style_set_border_width(&styles->calendar_btnm_day, lv_disp_dpx(theme.disp, 1)); + lv_style_set_border_color(&styles->calendar_btnm_day, color_grey); + lv_style_set_bg_color(&styles->calendar_btnm_day, color_card); + lv_style_set_bg_opa(&styles->calendar_btnm_day, LV_OPA_20); + + style_init_reset(&styles->calendar_header); + lv_style_set_pad_hor(&styles->calendar_header, PAD_SMALL); + lv_style_set_pad_top(&styles->calendar_header, PAD_SMALL); + lv_style_set_pad_bottom(&styles->calendar_header, PAD_TINY); + lv_style_set_pad_gap(&styles->calendar_header, PAD_SMALL); +#endif + +#if LV_USE_COLORWHEEL + style_init_reset(&styles->colorwheel_main); + lv_style_set_arc_width(&styles->colorwheel_main, lv_disp_dpx(theme.disp, 10)); +#endif + +#if LV_USE_MSGBOX + /*To add space for for the button shadow*/ + style_init_reset(&styles->msgbox_btn_bg); + lv_style_set_pad_all(&styles->msgbox_btn_bg, lv_disp_dpx(theme.disp, 4)); + + style_init_reset(&styles->msgbox_bg); + lv_style_set_max_width(&styles->msgbox_bg, lv_pct(100)); + + style_init_reset(&styles->msgbox_backdrop_bg); + lv_style_set_bg_color(&styles->msgbox_backdrop_bg, lv_palette_main(LV_PALETTE_GREY)); + lv_style_set_bg_opa(&styles->msgbox_backdrop_bg, LV_OPA_50); +#endif +#if LV_USE_KEYBOARD + style_init_reset(&styles->keyboard_btn_bg); + lv_style_set_shadow_width(&styles->keyboard_btn_bg, 0); + lv_style_set_radius(&styles->keyboard_btn_bg, disp_size == DISP_SMALL ? RADIUS_DEFAULT / 2 : RADIUS_DEFAULT); +#endif + +#if LV_USE_TABVIEW + style_init_reset(&styles->tab_btn); + lv_style_set_border_color(&styles->tab_btn, theme.color_primary); + lv_style_set_border_width(&styles->tab_btn, BORDER_WIDTH * 2); + lv_style_set_border_side(&styles->tab_btn, LV_BORDER_SIDE_BOTTOM); + + style_init_reset(&styles->tab_bg_focus); + lv_style_set_outline_pad(&styles->tab_bg_focus, -BORDER_WIDTH); +#endif + +#if LV_USE_LIST + style_init_reset(&styles->list_bg); + lv_style_set_pad_hor(&styles->list_bg, PAD_DEF); + lv_style_set_pad_ver(&styles->list_bg, 0); + lv_style_set_pad_gap(&styles->list_bg, 0); + lv_style_set_clip_corner(&styles->list_bg, true); + + style_init_reset(&styles->list_btn); + lv_style_set_border_width(&styles->list_btn, lv_disp_dpx(theme.disp, 1)); + lv_style_set_border_color(&styles->list_btn, color_grey); + lv_style_set_border_side(&styles->list_btn, LV_BORDER_SIDE_BOTTOM); + lv_style_set_pad_all(&styles->list_btn, PAD_SMALL); + lv_style_set_pad_column(&styles->list_btn, PAD_SMALL); + + style_init_reset(&styles->list_item_grow); + lv_style_set_transform_width(&styles->list_item_grow, PAD_DEF); +#endif + + +#if LV_USE_LED + style_init_reset(&styles->led); + lv_style_set_bg_opa(&styles->led, LV_OPA_COVER); + lv_style_set_bg_color(&styles->led, lv_color_white()); + lv_style_set_bg_grad_color(&styles->led, lv_palette_main(LV_PALETTE_GREY)); + lv_style_set_radius(&styles->led, LV_RADIUS_CIRCLE); + lv_style_set_shadow_width(&styles->led, lv_disp_dpx(theme.disp, 15)); + lv_style_set_shadow_color(&styles->led, lv_color_white()); + lv_style_set_shadow_spread(&styles->led, lv_disp_dpx(theme.disp, 5)); +#endif +} + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_theme_t * lv_theme_default_init(lv_disp_t * disp, lv_color_t color_primary, lv_color_t color_secondary, bool dark, + const lv_font_t * font) +{ + + /*This trick is required only to avoid the garbage collection of + *styles' data if LVGL is used in a binding (e.g. Micropython) + *In a general case styles could be in simple `static lv_style_t my_style...` variables*/ + if(!lv_theme_default_is_inited()) { + inited = false; + LV_GC_ROOT(_lv_theme_default_styles) = lv_mem_alloc(sizeof(my_theme_styles_t)); + styles = (my_theme_styles_t *)LV_GC_ROOT(_lv_theme_default_styles); + } + + if(LV_HOR_RES <= 320) disp_size = DISP_SMALL; + else if(LV_HOR_RES < 720) disp_size = DISP_MEDIUM; + else disp_size = DISP_LARGE; + + theme.disp = disp; + theme.color_primary = color_primary; + theme.color_secondary = color_secondary; + theme.font_small = font; + theme.font_normal = font; + theme.font_large = font; + theme.apply_cb = theme_apply; + theme.flags = dark ? MODE_DARK : 0; + + style_init(); + + if(disp == NULL || lv_disp_get_theme(disp) == &theme) lv_obj_report_style_change(NULL); + + inited = true; + + return (lv_theme_t *)&theme; +} + +lv_theme_t * lv_theme_default_get(void) +{ + if(!lv_theme_default_is_inited()) { + return NULL; + } + + return (lv_theme_t *)&theme; +} + +bool lv_theme_default_is_inited(void) +{ + return LV_GC_ROOT(_lv_theme_default_styles) == NULL ? false : true; +} + + +static void theme_apply(lv_theme_t * th, lv_obj_t * obj) +{ + LV_UNUSED(th); + + if(lv_obj_get_parent(obj) == NULL) { + lv_obj_add_style(obj, &styles->scr, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &styles->scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + return; + } + + if(lv_obj_check_type(obj, &lv_obj_class)) { +#if LV_USE_TABVIEW + lv_obj_t * parent = lv_obj_get_parent(obj); + /*Tabview content area*/ + if(lv_obj_check_type(parent, &lv_tabview_class)) { + return; + } + /*Tabview pages*/ + else if(lv_obj_check_type(lv_obj_get_parent(parent), &lv_tabview_class)) { + lv_obj_add_style(obj, &styles->pad_normal, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &styles->scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + return; + } +#endif + +#if LV_USE_WIN + /*Header*/ + if(lv_obj_get_index(obj) == 0 && lv_obj_check_type(lv_obj_get_parent(obj), &lv_win_class)) { + lv_obj_add_style(obj, &styles->bg_color_grey, 0); + lv_obj_add_style(obj, &styles->pad_tiny, 0); + return; + } + /*Content*/ + else if(lv_obj_get_index(obj) == 1 && lv_obj_check_type(lv_obj_get_parent(obj), &lv_win_class)) { + lv_obj_add_style(obj, &styles->scr, 0); + lv_obj_add_style(obj, &styles->pad_normal, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &styles->scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + return; + } +#endif + + +#if LV_USE_CALENDAR + if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_calendar_class)) { + /*No style*/ + return; + } +#endif + + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &styles->scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + } +#if LV_USE_BTN + else if(lv_obj_check_type(obj, &lv_btn_class)) { + lv_obj_add_style(obj, &styles->btn, 0); + lv_obj_add_style(obj, &styles->bg_color_primary, 0); + lv_obj_add_style(obj, &styles->transition_delayed, 0); + lv_obj_add_style(obj, &styles->pressed, LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->transition_normal, LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->outline_primary, LV_STATE_FOCUS_KEY); +#if LV_THEME_DEFAULT_GROW + lv_obj_add_style(obj, &styles->grow, LV_STATE_PRESSED); +#endif + lv_obj_add_style(obj, &styles->bg_color_secondary, LV_STATE_CHECKED); + lv_obj_add_style(obj, &styles->disabled, LV_STATE_DISABLED); + +#if LV_USE_MENU + if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_menu_sidebar_header_cont_class) || + lv_obj_check_type(lv_obj_get_parent(obj), &lv_menu_main_header_cont_class)) { + lv_obj_add_style(obj, &styles->menu_header_btn, 0); + lv_obj_add_style(obj, &styles->menu_pressed, LV_STATE_PRESSED); + } +#endif + } +#endif + +#if LV_USE_LINE + else if(lv_obj_check_type(obj, &lv_line_class)) { + lv_obj_add_style(obj, &styles->line, 0); + } +#endif + +#if LV_USE_BTNMATRIX + else if(lv_obj_check_type(obj, &lv_btnmatrix_class)) { +#if LV_USE_MSGBOX + if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_msgbox_class)) { + lv_obj_add_style(obj, &styles->msgbox_btn_bg, 0); + lv_obj_add_style(obj, &styles->pad_gap, 0); + lv_obj_add_style(obj, &styles->btn, LV_PART_ITEMS); + lv_obj_add_style(obj, &styles->pressed, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->disabled, LV_PART_ITEMS | LV_STATE_DISABLED); + lv_obj_add_style(obj, &styles->bg_color_primary, LV_PART_ITEMS | LV_STATE_CHECKED); + lv_obj_add_style(obj, &styles->bg_color_primary_muted, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->bg_color_secondary_muted, LV_PART_ITEMS | LV_STATE_EDITED); + return; + } +#endif +#if LV_USE_TABVIEW + if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_tabview_class)) { + lv_obj_add_style(obj, &styles->bg_color_white, 0); + lv_obj_add_style(obj, &styles->outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->tab_bg_focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->pressed, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->bg_color_primary_muted, LV_PART_ITEMS | LV_STATE_CHECKED); + lv_obj_add_style(obj, &styles->tab_btn, LV_PART_ITEMS | LV_STATE_CHECKED); + lv_obj_add_style(obj, &styles->outline_primary, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->outline_secondary, LV_PART_ITEMS | LV_STATE_EDITED); + lv_obj_add_style(obj, &styles->tab_bg_focus, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + return; + } +#endif + +#if LV_USE_CALENDAR + if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_calendar_class)) { + lv_obj_add_style(obj, &styles->calendar_btnm_bg, 0); + lv_obj_add_style(obj, &styles->outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &styles->calendar_btnm_day, LV_PART_ITEMS); + lv_obj_add_style(obj, &styles->pressed, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->disabled, LV_PART_ITEMS | LV_STATE_DISABLED); + lv_obj_add_style(obj, &styles->outline_primary, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->outline_secondary, LV_PART_ITEMS | LV_STATE_EDITED); + return; + } +#endif + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &styles->btn, LV_PART_ITEMS); + lv_obj_add_style(obj, &styles->disabled, LV_PART_ITEMS | LV_STATE_DISABLED); + lv_obj_add_style(obj, &styles->pressed, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->bg_color_primary, LV_PART_ITEMS | LV_STATE_CHECKED); + lv_obj_add_style(obj, &styles->outline_primary, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->outline_secondary, LV_PART_ITEMS | LV_STATE_EDITED); + } +#endif + +#if LV_USE_BAR + else if(lv_obj_check_type(obj, &lv_bar_class)) { + lv_obj_add_style(obj, &styles->bg_color_primary_muted, 0); + lv_obj_add_style(obj, &styles->circle, 0); + lv_obj_add_style(obj, &styles->outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &styles->bg_color_primary, LV_PART_INDICATOR); + lv_obj_add_style(obj, &styles->circle, LV_PART_INDICATOR); + } +#endif + +#if LV_USE_SLIDER + else if(lv_obj_check_type(obj, &lv_slider_class)) { + lv_obj_add_style(obj, &styles->bg_color_primary_muted, 0); + lv_obj_add_style(obj, &styles->circle, 0); + lv_obj_add_style(obj, &styles->outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &styles->bg_color_primary, LV_PART_INDICATOR); + lv_obj_add_style(obj, &styles->circle, LV_PART_INDICATOR); + lv_obj_add_style(obj, &styles->knob, LV_PART_KNOB); +#if LV_THEME_DEFAULT_GROW + lv_obj_add_style(obj, &styles->grow, LV_PART_KNOB | LV_STATE_PRESSED); +#endif + lv_obj_add_style(obj, &styles->transition_delayed, LV_PART_KNOB); + lv_obj_add_style(obj, &styles->transition_normal, LV_PART_KNOB | LV_STATE_PRESSED); + } +#endif + +#if LV_USE_TABLE + else if(lv_obj_check_type(obj, &lv_table_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->pad_zero, 0); + lv_obj_add_style(obj, &styles->no_radius, 0); + lv_obj_add_style(obj, &styles->outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &styles->scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + lv_obj_add_style(obj, &styles->bg_color_white, LV_PART_ITEMS); + lv_obj_add_style(obj, &styles->table_cell, LV_PART_ITEMS); + lv_obj_add_style(obj, &styles->pad_normal, LV_PART_ITEMS); + lv_obj_add_style(obj, &styles->pressed, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->bg_color_primary, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->bg_color_secondary, LV_PART_ITEMS | LV_STATE_EDITED); + } +#endif + +#if LV_USE_CHECKBOX + else if(lv_obj_check_type(obj, &lv_checkbox_class)) { + lv_obj_add_style(obj, &styles->pad_gap, 0); + lv_obj_add_style(obj, &styles->outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->disabled, LV_PART_INDICATOR | LV_STATE_DISABLED); + lv_obj_add_style(obj, &styles->cb_marker, LV_PART_INDICATOR); + lv_obj_add_style(obj, &styles->bg_color_primary, LV_PART_INDICATOR | LV_STATE_CHECKED); + lv_obj_add_style(obj, &styles->cb_marker_checked, LV_PART_INDICATOR | LV_STATE_CHECKED); + lv_obj_add_style(obj, &styles->pressed, LV_PART_INDICATOR | LV_STATE_PRESSED); +#if LV_THEME_DEFAULT_GROW + lv_obj_add_style(obj, &styles->grow, LV_PART_INDICATOR | LV_STATE_PRESSED); +#endif + lv_obj_add_style(obj, &styles->transition_normal, LV_PART_INDICATOR | LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->transition_delayed, LV_PART_INDICATOR); + } +#endif + +#if LV_USE_SWITCH + else if(lv_obj_check_type(obj, &lv_switch_class)) { + lv_obj_add_style(obj, &styles->bg_color_grey, 0); + lv_obj_add_style(obj, &styles->circle, 0); + lv_obj_add_style(obj, &styles->anim_fast, 0); + lv_obj_add_style(obj, &styles->disabled, LV_STATE_DISABLED); + lv_obj_add_style(obj, &styles->outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->bg_color_primary, LV_PART_INDICATOR | LV_STATE_CHECKED); + lv_obj_add_style(obj, &styles->circle, LV_PART_INDICATOR); + lv_obj_add_style(obj, &styles->disabled, LV_PART_INDICATOR | LV_STATE_DISABLED); + lv_obj_add_style(obj, &styles->knob, LV_PART_KNOB); + lv_obj_add_style(obj, &styles->bg_color_white, LV_PART_KNOB); + lv_obj_add_style(obj, &styles->switch_knob, LV_PART_KNOB); + lv_obj_add_style(obj, &styles->disabled, LV_PART_KNOB | LV_STATE_DISABLED); + + lv_obj_add_style(obj, &styles->transition_normal, LV_PART_INDICATOR | LV_STATE_CHECKED); + lv_obj_add_style(obj, &styles->transition_normal, LV_PART_INDICATOR); + } +#endif + +#if LV_USE_CHART + else if(lv_obj_check_type(obj, &lv_chart_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->pad_small, 0); + lv_obj_add_style(obj, &styles->chart_bg, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &styles->scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + lv_obj_add_style(obj, &styles->chart_series, LV_PART_ITEMS); + lv_obj_add_style(obj, &styles->chart_indic, LV_PART_INDICATOR); + lv_obj_add_style(obj, &styles->chart_ticks, LV_PART_TICKS); + lv_obj_add_style(obj, &styles->chart_series, LV_PART_CURSOR); + } +#endif + +#if LV_USE_ROLLER + else if(lv_obj_check_type(obj, &lv_roller_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->anim, 0); + lv_obj_add_style(obj, &styles->line_space_large, 0); + lv_obj_add_style(obj, &styles->text_align_center, 0); + lv_obj_add_style(obj, &styles->outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &styles->bg_color_primary, LV_PART_SELECTED); + } +#endif + +#if LV_USE_DROPDOWN + else if(lv_obj_check_type(obj, &lv_dropdown_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->pad_small, 0); + lv_obj_add_style(obj, &styles->transition_delayed, 0); + lv_obj_add_style(obj, &styles->transition_normal, LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->pressed, LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &styles->transition_normal, LV_PART_INDICATOR); + } + else if(lv_obj_check_type(obj, &lv_dropdownlist_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->clip_corner, 0); + lv_obj_add_style(obj, &styles->line_space_large, 0); + lv_obj_add_style(obj, &styles->dropdown_list, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &styles->scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + lv_obj_add_style(obj, &styles->bg_color_white, LV_PART_SELECTED); + lv_obj_add_style(obj, &styles->bg_color_primary, LV_PART_SELECTED | LV_STATE_CHECKED); + lv_obj_add_style(obj, &styles->pressed, LV_PART_SELECTED | LV_STATE_PRESSED); + } +#endif + +#if LV_USE_ARC + else if(lv_obj_check_type(obj, &lv_arc_class)) { + lv_obj_add_style(obj, &styles->arc_indic, 0); + lv_obj_add_style(obj, &styles->arc_indic, LV_PART_INDICATOR); + lv_obj_add_style(obj, &styles->arc_indic_primary, LV_PART_INDICATOR); + lv_obj_add_style(obj, &styles->knob, LV_PART_KNOB); + } +#endif + + +#if LV_USE_SPINNER + else if(lv_obj_check_type(obj, &lv_spinner_class)) { + lv_obj_add_style(obj, &styles->arc_indic, 0); + lv_obj_add_style(obj, &styles->arc_indic, LV_PART_INDICATOR); + lv_obj_add_style(obj, &styles->arc_indic_primary, LV_PART_INDICATOR); + } +#endif + +#if LV_USE_METER + else if(lv_obj_check_type(obj, &lv_meter_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->circle, 0); + lv_obj_add_style(obj, &styles->meter_indic, LV_PART_INDICATOR); + } +#endif + +#if LV_USE_TEXTAREA + else if(lv_obj_check_type(obj, &lv_textarea_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->pad_small, 0); + lv_obj_add_style(obj, &styles->disabled, LV_STATE_DISABLED); + lv_obj_add_style(obj, &styles->outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &styles->scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + lv_obj_add_style(obj, &styles->ta_cursor, LV_PART_CURSOR | LV_STATE_FOCUSED); + lv_obj_add_style(obj, &styles->ta_placeholder, LV_PART_TEXTAREA_PLACEHOLDER); + } +#endif + +#if LV_USE_CALENDAR + else if(lv_obj_check_type(obj, &lv_calendar_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->pad_zero, 0); + } +#endif + +#if LV_USE_CALENDAR_HEADER_ARROW + else if(lv_obj_check_type(obj, &lv_calendar_header_arrow_class)) { + lv_obj_add_style(obj, &styles->calendar_header, 0); + } +#endif + +#if LV_USE_CALENDAR_HEADER_DROPDOWN + else if(lv_obj_check_type(obj, &lv_calendar_header_dropdown_class)) { + lv_obj_add_style(obj, &styles->calendar_header, 0); + } +#endif + +#if LV_USE_KEYBOARD + else if(lv_obj_check_type(obj, &lv_keyboard_class)) { + lv_obj_add_style(obj, &styles->scr, 0); + lv_obj_add_style(obj, disp_size == DISP_LARGE ? &styles->pad_small : &styles->pad_tiny, 0); + lv_obj_add_style(obj, &styles->outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &styles->btn, LV_PART_ITEMS); + lv_obj_add_style(obj, &styles->disabled, LV_PART_ITEMS | LV_STATE_DISABLED); + lv_obj_add_style(obj, &styles->bg_color_white, LV_PART_ITEMS); + lv_obj_add_style(obj, &styles->keyboard_btn_bg, LV_PART_ITEMS); + lv_obj_add_style(obj, &styles->pressed, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->bg_color_grey, LV_PART_ITEMS | LV_STATE_CHECKED); + lv_obj_add_style(obj, &styles->bg_color_primary_muted, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->bg_color_secondary_muted, LV_PART_ITEMS | LV_STATE_EDITED); + } +#endif +#if LV_USE_LIST + else if(lv_obj_check_type(obj, &lv_list_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->list_bg, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &styles->scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + return; + } + else if(lv_obj_check_type(obj, &lv_list_text_class)) { + lv_obj_add_style(obj, &styles->bg_color_grey, 0); + lv_obj_add_style(obj, &styles->list_item_grow, 0); + } + else if(lv_obj_check_type(obj, &lv_list_btn_class)) { + lv_obj_add_style(obj, &styles->bg_color_white, 0); + lv_obj_add_style(obj, &styles->list_btn, 0); + lv_obj_add_style(obj, &styles->bg_color_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->list_item_grow, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->list_item_grow, LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->pressed, LV_STATE_PRESSED); + + } +#endif +#if LV_USE_MENU + else if(lv_obj_check_type(obj, &lv_menu_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->menu_bg, 0); + } + else if(lv_obj_check_type(obj, &lv_menu_sidebar_cont_class)) { + lv_obj_add_style(obj, &styles->menu_sidebar_cont, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &styles->scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + } + else if(lv_obj_check_type(obj, &lv_menu_main_cont_class)) { + lv_obj_add_style(obj, &styles->menu_main_cont, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &styles->scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + } + else if(lv_obj_check_type(obj, &lv_menu_cont_class)) { + lv_obj_add_style(obj, &styles->menu_cont, 0); + lv_obj_add_style(obj, &styles->menu_pressed, LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->bg_color_primary_muted, LV_STATE_PRESSED | LV_STATE_CHECKED); + lv_obj_add_style(obj, &styles->bg_color_primary_muted, LV_STATE_CHECKED); + lv_obj_add_style(obj, &styles->bg_color_primary, LV_STATE_FOCUS_KEY); + } + else if(lv_obj_check_type(obj, &lv_menu_sidebar_header_cont_class) || + lv_obj_check_type(obj, &lv_menu_main_header_cont_class)) { + lv_obj_add_style(obj, &styles->menu_header_cont, 0); + } + else if(lv_obj_check_type(obj, &lv_menu_page_class)) { + lv_obj_add_style(obj, &styles->menu_page, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &styles->scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + } + else if(lv_obj_check_type(obj, &lv_menu_section_class)) { + lv_obj_add_style(obj, &styles->menu_section, 0); + } + else if(lv_obj_check_type(obj, &lv_menu_separator_class)) { + lv_obj_add_style(obj, &styles->menu_separator, 0); + } +#endif +#if LV_USE_MSGBOX + else if(lv_obj_check_type(obj, &lv_msgbox_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->msgbox_bg, 0); + return; + } + else if(lv_obj_check_type(obj, &lv_msgbox_backdrop_class)) { + lv_obj_add_style(obj, &styles->msgbox_backdrop_bg, 0); + } +#endif +#if LV_USE_SPINBOX + else if(lv_obj_check_type(obj, &lv_spinbox_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->pad_small, 0); + lv_obj_add_style(obj, &styles->outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &styles->bg_color_primary, LV_PART_CURSOR); + } +#endif +#if LV_USE_TILEVIEW + else if(lv_obj_check_type(obj, &lv_tileview_class)) { + lv_obj_add_style(obj, &styles->scr, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &styles->scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + } + else if(lv_obj_check_type(obj, &lv_tileview_tile_class)) { + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &styles->scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + } +#endif + +#if LV_USE_TABVIEW + else if(lv_obj_check_type(obj, &lv_tabview_class)) { + lv_obj_add_style(obj, &styles->scr, 0); + lv_obj_add_style(obj, &styles->pad_zero, 0); + } +#endif + +#if LV_USE_WIN + else if(lv_obj_check_type(obj, &lv_win_class)) { + lv_obj_add_style(obj, &styles->clip_corner, 0); + } +#endif + +#if LV_USE_COLORWHEEL + else if(lv_obj_check_type(obj, &lv_colorwheel_class)) { + lv_obj_add_style(obj, &styles->colorwheel_main, 0); + lv_obj_add_style(obj, &styles->pad_normal, 0); + lv_obj_add_style(obj, &styles->bg_color_white, LV_PART_KNOB); + lv_obj_add_style(obj, &styles->pad_normal, LV_PART_KNOB); + } +#endif + +#if LV_USE_LED + else if(lv_obj_check_type(obj, &lv_led_class)) { + lv_obj_add_style(obj, &styles->led, 0); + } +#endif +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void style_init_reset(lv_style_t * style) +{ + if(inited) { + lv_style_reset(style); + } + else { + lv_style_init(style); + } +} + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/themes/default/lv_theme_default.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/themes/default/lv_theme_default.h new file mode 100644 index 0000000..5b1fd91 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/themes/default/lv_theme_default.h @@ -0,0 +1,64 @@ +/** + * @file lv_theme_default.h + * + */ + +#ifndef LV_THEME_DEFAULT_H +#define LV_THEME_DEFAULT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../core/lv_obj.h" + +#if LV_USE_THEME_DEFAULT + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the theme + * @param color_primary the primary color of the theme + * @param color_secondary the secondary color for the theme + * @param font pointer to a font to use. + * @return a pointer to reference this theme later + */ +lv_theme_t * lv_theme_default_init(lv_disp_t * disp, lv_color_t color_primary, lv_color_t color_secondary, bool dark, + const lv_font_t * font); + +/** + * Get default theme + * @return a pointer to default theme, or NULL if this is not initialized + */ +lv_theme_t * lv_theme_default_get(void); + +/** + * Check if default theme is initialized + * @return true if default theme is initialized, false otherwise + */ +bool lv_theme_default_is_inited(void); + +/********************** + * MACROS + **********************/ + +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_THEME_DEFAULT_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/themes/lv_themes.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/themes/lv_themes.h new file mode 100644 index 0000000..372f626 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/themes/lv_themes.h @@ -0,0 +1,40 @@ +/** + * @file lv_themes.h + * + */ + +#ifndef LV_THEMES_H +#define LV_THEMES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "default/lv_theme_default.h" +#include "mono/lv_theme_mono.h" +#include "basic/lv_theme_basic.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_THEMES_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/themes/mono/lv_theme_mono.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/themes/mono/lv_theme_mono.c new file mode 100644 index 0000000..b249e76 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/themes/mono/lv_theme_mono.c @@ -0,0 +1,504 @@ +/** + * @file lv_theme_mono.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_THEME_MONO + +#include "lv_theme_mono.h" +#include "../../../misc/lv_gc.h" + +/********************* + * DEFINES + *********************/ + +#define COLOR_FG dark_bg ? lv_color_white() : lv_color_black() +#define COLOR_BG dark_bg ? lv_color_black() : lv_color_white() + +#define BORDER_W_NORMAL 1 +#define BORDER_W_PR 3 +#define BORDER_W_DIS 0 +#define BORDER_W_FOCUS 1 +#define BORDER_W_EDIT 2 +#define PAD_DEF 4 + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_style_t scr; + lv_style_t card; + lv_style_t scrollbar; + lv_style_t btn; + lv_style_t pr; + lv_style_t inv; + lv_style_t disabled; + lv_style_t focus; + lv_style_t edit; + lv_style_t pad_gap; + lv_style_t pad_zero; + lv_style_t no_radius; + lv_style_t radius_circle; + lv_style_t large_border; + lv_style_t large_line_space; + lv_style_t underline; +#if LV_USE_TEXTAREA + lv_style_t ta_cursor; +#endif +} my_theme_styles_t; + + +/********************** + * STATIC PROTOTYPES + **********************/ +static void style_init_reset(lv_style_t * style); +static void theme_apply(lv_theme_t * th, lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ +static my_theme_styles_t * styles; +static lv_theme_t theme; +static bool inited; + +/********************** + * MACROS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void style_init(bool dark_bg, const lv_font_t * font) +{ + style_init_reset(&styles->scrollbar); + lv_style_set_bg_opa(&styles->scrollbar, LV_OPA_COVER); + lv_style_set_bg_color(&styles->scrollbar, COLOR_FG); + lv_style_set_width(&styles->scrollbar, PAD_DEF); + + style_init_reset(&styles->scr); + lv_style_set_bg_opa(&styles->scr, LV_OPA_COVER); + lv_style_set_bg_color(&styles->scr, COLOR_BG); + lv_style_set_text_color(&styles->scr, COLOR_FG); + lv_style_set_pad_row(&styles->scr, PAD_DEF); + lv_style_set_pad_column(&styles->scr, PAD_DEF); + lv_style_set_text_font(&styles->scr, font); + + style_init_reset(&styles->card); + lv_style_set_bg_opa(&styles->card, LV_OPA_COVER); + lv_style_set_bg_color(&styles->card, COLOR_BG); + lv_style_set_border_color(&styles->card, COLOR_FG); + lv_style_set_radius(&styles->card, 2); + lv_style_set_border_width(&styles->card, BORDER_W_NORMAL); + lv_style_set_pad_all(&styles->card, PAD_DEF); + lv_style_set_pad_gap(&styles->card, PAD_DEF); + lv_style_set_text_color(&styles->card, COLOR_FG); + lv_style_set_line_width(&styles->card, 2); + lv_style_set_line_color(&styles->card, COLOR_FG); + lv_style_set_arc_width(&styles->card, 2); + lv_style_set_arc_color(&styles->card, COLOR_FG); + lv_style_set_outline_color(&styles->card, COLOR_FG); + lv_style_set_anim_time(&styles->card, 300); + + style_init_reset(&styles->pr); + lv_style_set_border_width(&styles->pr, BORDER_W_PR); + + style_init_reset(&styles->inv); + lv_style_set_bg_opa(&styles->inv, LV_OPA_COVER); + lv_style_set_bg_color(&styles->inv, COLOR_FG); + lv_style_set_border_color(&styles->inv, COLOR_BG); + lv_style_set_line_color(&styles->inv, COLOR_BG); + lv_style_set_arc_color(&styles->inv, COLOR_BG); + lv_style_set_text_color(&styles->inv, COLOR_BG); + lv_style_set_outline_color(&styles->inv, COLOR_BG); + + style_init_reset(&styles->disabled); + lv_style_set_border_width(&styles->disabled, BORDER_W_DIS); + + style_init_reset(&styles->focus); + lv_style_set_outline_width(&styles->focus, 1); + lv_style_set_outline_pad(&styles->focus, BORDER_W_FOCUS); + + style_init_reset(&styles->edit); + lv_style_set_outline_width(&styles->edit, BORDER_W_EDIT); + + style_init_reset(&styles->large_border); + lv_style_set_border_width(&styles->large_border, BORDER_W_EDIT); + + style_init_reset(&styles->pad_gap); + lv_style_set_pad_gap(&styles->pad_gap, PAD_DEF); + + style_init_reset(&styles->pad_zero); + lv_style_set_pad_all(&styles->pad_zero, 0); + lv_style_set_pad_gap(&styles->pad_zero, 0); + + style_init_reset(&styles->no_radius); + lv_style_set_radius(&styles->no_radius, 0); + + style_init_reset(&styles->radius_circle); + lv_style_set_radius(&styles->radius_circle, LV_RADIUS_CIRCLE); + + style_init_reset(&styles->large_line_space); + lv_style_set_text_line_space(&styles->large_line_space, 6); + + style_init_reset(&styles->underline); + lv_style_set_text_decor(&styles->underline, LV_TEXT_DECOR_UNDERLINE); + +#if LV_USE_TEXTAREA + style_init_reset(&styles->ta_cursor); + lv_style_set_border_side(&styles->ta_cursor, LV_BORDER_SIDE_LEFT); + lv_style_set_border_color(&styles->ta_cursor, COLOR_FG); + lv_style_set_border_width(&styles->ta_cursor, 2); + lv_style_set_bg_opa(&styles->ta_cursor, LV_OPA_TRANSP); + lv_style_set_anim_time(&styles->ta_cursor, 500); +#endif +} + + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +bool lv_theme_mono_is_inited(void) +{ + return LV_GC_ROOT(_lv_theme_default_styles) == NULL ? false : true; +} + +lv_theme_t * lv_theme_mono_init(lv_disp_t * disp, bool dark_bg, const lv_font_t * font) +{ + + /*This trick is required only to avoid the garbage collection of + *styles' data if LVGL is used in a binding (e.g. Micropython) + *In a general case styles could be in simple `static lv_style_t my_style...` variables*/ + if(!inited) { + inited = false; + LV_GC_ROOT(_lv_theme_default_styles) = lv_mem_alloc(sizeof(my_theme_styles_t)); + styles = (my_theme_styles_t *)LV_GC_ROOT(_lv_theme_default_styles); + } + + theme.disp = disp; + theme.font_small = LV_FONT_DEFAULT; + theme.font_normal = LV_FONT_DEFAULT; + theme.font_large = LV_FONT_DEFAULT; + theme.apply_cb = theme_apply; + + style_init(dark_bg, font); + + if(disp == NULL || lv_disp_get_theme(disp) == &theme) lv_obj_report_style_change(NULL); + + inited = true; + + return (lv_theme_t *)&theme; +} + + +static void theme_apply(lv_theme_t * th, lv_obj_t * obj) +{ + LV_UNUSED(th); + + if(lv_obj_get_parent(obj) == NULL) { + lv_obj_add_style(obj, &styles->scr, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + return; + } + + if(lv_obj_check_type(obj, &lv_obj_class)) { +#if LV_USE_TABVIEW + lv_obj_t * parent = lv_obj_get_parent(obj); + /*Tabview content area*/ + if(lv_obj_check_type(parent, &lv_tabview_class)) { + return; + } + /*Tabview pages*/ + else if(lv_obj_check_type(lv_obj_get_parent(parent), &lv_tabview_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->no_radius, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + return; + } +#endif + +#if LV_USE_WIN + /*Header*/ + if(lv_obj_get_index(obj) == 0 && lv_obj_check_type(lv_obj_get_parent(obj), &lv_win_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->no_radius, 0); + return; + } + /*Content*/ + else if(lv_obj_get_index(obj) == 1 && lv_obj_check_type(lv_obj_get_parent(obj), &lv_win_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->no_radius, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + return; + } +#endif + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + } +#if LV_USE_BTN + else if(lv_obj_check_type(obj, &lv_btn_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->pr, LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->inv, LV_STATE_CHECKED); + lv_obj_add_style(obj, &styles->disabled, LV_STATE_DISABLED); + lv_obj_add_style(obj, &styles->focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_BTNMATRIX + else if(lv_obj_check_type(obj, &lv_btnmatrix_class)) { +#if LV_USE_MSGBOX + if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_msgbox_class)) { + lv_obj_add_style(obj, &styles->pad_gap, 0); + lv_obj_add_style(obj, &styles->card, LV_PART_ITEMS); + lv_obj_add_style(obj, &styles->pr, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->disabled, LV_PART_ITEMS | LV_STATE_DISABLED); + lv_obj_add_style(obj, &styles->underline, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->large_border, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + return; + } +#endif +#if LV_USE_TABVIEW + if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_tabview_class)) { + lv_obj_add_style(obj, &styles->pad_gap, 0); + lv_obj_add_style(obj, &styles->card, LV_PART_ITEMS); + lv_obj_add_style(obj, &styles->pr, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->inv, LV_PART_ITEMS | LV_STATE_CHECKED); + lv_obj_add_style(obj, &styles->disabled, LV_PART_ITEMS | LV_STATE_DISABLED); + lv_obj_add_style(obj, &styles->focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->underline, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->large_border, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + return; + } +#endif + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->card, LV_PART_ITEMS); + lv_obj_add_style(obj, &styles->pr, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->inv, LV_PART_ITEMS | LV_STATE_CHECKED); + lv_obj_add_style(obj, &styles->disabled, LV_PART_ITEMS | LV_STATE_DISABLED); + lv_obj_add_style(obj, &styles->underline, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->large_border, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + } +#endif + +#if LV_USE_BAR + else if(lv_obj_check_type(obj, &lv_bar_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->pad_zero, 0); + lv_obj_add_style(obj, &styles->inv, LV_PART_INDICATOR); + lv_obj_add_style(obj, &styles->focus, LV_STATE_FOCUS_KEY); + } +#endif + +#if LV_USE_SLIDER + else if(lv_obj_check_type(obj, &lv_slider_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->pad_zero, 0); + lv_obj_add_style(obj, &styles->inv, LV_PART_INDICATOR); + lv_obj_add_style(obj, &styles->card, LV_PART_KNOB); + lv_obj_add_style(obj, &styles->radius_circle, LV_PART_KNOB); + lv_obj_add_style(obj, &styles->focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_TABLE + else if(lv_obj_check_type(obj, &lv_table_class)) { + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &styles->card, LV_PART_ITEMS); + lv_obj_add_style(obj, &styles->no_radius, LV_PART_ITEMS); + lv_obj_add_style(obj, &styles->pr, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->inv, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_CHECKBOX + else if(lv_obj_check_type(obj, &lv_checkbox_class)) { + lv_obj_add_style(obj, &styles->pad_gap, LV_PART_MAIN); + lv_obj_add_style(obj, &styles->card, LV_PART_INDICATOR); + lv_obj_add_style(obj, &styles->disabled, LV_PART_INDICATOR | LV_STATE_DISABLED); + lv_obj_add_style(obj, &styles->inv, LV_PART_INDICATOR | LV_STATE_CHECKED); + lv_obj_add_style(obj, &styles->pr, LV_PART_INDICATOR | LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_SWITCH + else if(lv_obj_check_type(obj, &lv_switch_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->radius_circle, 0); + lv_obj_add_style(obj, &styles->pad_zero, 0); + lv_obj_add_style(obj, &styles->inv, LV_PART_INDICATOR); + lv_obj_add_style(obj, &styles->radius_circle, LV_PART_INDICATOR); + lv_obj_add_style(obj, &styles->card, LV_PART_KNOB); + lv_obj_add_style(obj, &styles->radius_circle, LV_PART_KNOB); + lv_obj_add_style(obj, &styles->pad_zero, LV_PART_KNOB); + lv_obj_add_style(obj, &styles->focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_CHART + else if(lv_obj_check_type(obj, &lv_chart_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &styles->card, LV_PART_ITEMS); + lv_obj_add_style(obj, &styles->card, LV_PART_TICKS); + lv_obj_add_style(obj, &styles->card, LV_PART_CURSOR); + lv_obj_add_style(obj, &styles->focus, LV_STATE_FOCUS_KEY); + } +#endif + +#if LV_USE_ROLLER + else if(lv_obj_check_type(obj, &lv_roller_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->large_line_space, 0); + lv_obj_add_style(obj, &styles->inv, LV_PART_SELECTED); + lv_obj_add_style(obj, &styles->focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_DROPDOWN + else if(lv_obj_check_type(obj, &lv_dropdown_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->pr, LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->edit, LV_STATE_EDITED); + } + else if(lv_obj_check_type(obj, &lv_dropdownlist_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->large_line_space, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &styles->inv, LV_PART_SELECTED | LV_STATE_CHECKED); + lv_obj_add_style(obj, &styles->pr, LV_PART_SELECTED | LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_ARC + else if(lv_obj_check_type(obj, &lv_arc_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->inv, LV_PART_INDICATOR); + lv_obj_add_style(obj, &styles->pad_zero, LV_PART_INDICATOR); + lv_obj_add_style(obj, &styles->card, LV_PART_KNOB); + lv_obj_add_style(obj, &styles->radius_circle, LV_PART_KNOB); + lv_obj_add_style(obj, &styles->focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_METER + else if(lv_obj_check_type(obj, &lv_meter_class)) { + lv_obj_add_style(obj, &styles->card, 0); + } +#endif + +#if LV_USE_TEXTAREA + else if(lv_obj_check_type(obj, &lv_textarea_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &styles->ta_cursor, LV_PART_CURSOR | LV_STATE_FOCUSED); + lv_obj_add_style(obj, &styles->focus, LV_STATE_FOCUSED); + lv_obj_add_style(obj, &styles->edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_CALENDAR + else if(lv_obj_check_type(obj, &lv_calendar_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->no_radius, 0); + lv_obj_add_style(obj, &styles->pr, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->disabled, LV_PART_ITEMS | LV_STATE_DISABLED); + lv_obj_add_style(obj, &styles->focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->edit, LV_STATE_EDITED); + lv_obj_add_style(obj, &styles->large_border, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + } +#endif + +#if LV_USE_KEYBOARD + else if(lv_obj_check_type(obj, &lv_keyboard_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->card, LV_PART_ITEMS); + lv_obj_add_style(obj, &styles->pr, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->inv, LV_PART_ITEMS | LV_STATE_CHECKED); + lv_obj_add_style(obj, &styles->focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->edit, LV_STATE_EDITED); + lv_obj_add_style(obj, &styles->large_border, LV_PART_ITEMS | LV_STATE_EDITED); + } +#endif +#if LV_USE_LIST + else if(lv_obj_check_type(obj, &lv_list_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + return; + } + else if(lv_obj_check_type(obj, &lv_list_text_class)) { + + } + else if(lv_obj_check_type(obj, &lv_list_btn_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->pr, LV_STATE_PRESSED); + lv_obj_add_style(obj, &styles->focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->large_border, LV_STATE_EDITED); + + } +#endif +#if LV_USE_MSGBOX + else if(lv_obj_check_type(obj, &lv_msgbox_class)) { + lv_obj_add_style(obj, &styles->card, 0); + return; + } +#endif +#if LV_USE_SPINBOX + else if(lv_obj_check_type(obj, &lv_spinbox_class)) { + lv_obj_add_style(obj, &styles->card, 0); + lv_obj_add_style(obj, &styles->inv, LV_PART_CURSOR); + lv_obj_add_style(obj, &styles->focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &styles->edit, LV_STATE_EDITED); + } +#endif +#if LV_USE_TILEVIEW + else if(lv_obj_check_type(obj, &lv_tileview_class)) { + lv_obj_add_style(obj, &styles->scr, 0); + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + } + else if(lv_obj_check_type(obj, &lv_tileview_tile_class)) { + lv_obj_add_style(obj, &styles->scrollbar, LV_PART_SCROLLBAR); + } +#endif + +#if LV_USE_LED + else if(lv_obj_check_type(obj, &lv_led_class)) { + lv_obj_add_style(obj, &styles->card, 0); + } +#endif +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void style_init_reset(lv_style_t * style) +{ + if(inited) { + lv_style_reset(style); + } + else { + lv_style_init(style); + } +} + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/themes/mono/lv_theme_mono.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/themes/mono/lv_theme_mono.h new file mode 100644 index 0000000..10b8f18 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/themes/mono/lv_theme_mono.h @@ -0,0 +1,57 @@ +/** + * @file lv_theme_mono.h + * + */ + +#ifndef LV_USE_THEME_MONO_H +#define LV_USE_THEME_MONO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../core/lv_obj.h" + +#if LV_USE_THEME_MONO + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the theme + * @param color_primary the primary color of the theme + * @param color_secondary the secondary color for the theme + * @param font pointer to a font to use. + * @return a pointer to reference this theme later + */ +lv_theme_t * lv_theme_mono_init(lv_disp_t * disp, bool dark_bg, const lv_font_t * font); + +/** +* Check if the theme is initialized +* @return true if default theme is initialized, false otherwise +*/ +bool lv_theme_mono_is_inited(void); + +/********************** + * MACROS + **********************/ + +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_USE_THEME_MONO_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/animimg/lv_animimg.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/animimg/lv_animimg.c new file mode 100644 index 0000000..135a8a4 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/animimg/lv_animimg.c @@ -0,0 +1,138 @@ +/** + * @file lv_animimg.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_animimg.h" +#if LV_USE_ANIMIMG != 0 + +/*Testing of dependencies*/ +#if LV_USE_IMG == 0 + #error "lv_animimg: lv_img is required. Enable it in lv_conf.h (LV_USE_IMG 1) " +#endif + +#include "../../../misc/lv_assert.h" +#include "../../../draw/lv_img_decoder.h" +#include "../../../misc/lv_fs.h" +#include "../../../misc/lv_txt.h" +#include "../../../misc/lv_math.h" +#include "../../../misc/lv_log.h" +#include "../../../misc/lv_anim.h" + +/********************* + * DEFINES + *********************/ +#define LV_OBJX_NAME "lv_animimg" + +#define MY_CLASS &lv_animimg_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void index_change(lv_obj_t * obj, int32_t index); +static void lv_animimg_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_animimg_class = { + .constructor_cb = lv_animimg_constructor, + .instance_size = sizeof(lv_animimg_t), + .base_class = &lv_img_class +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_animimg_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_animimg_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +void lv_animimg_set_src(lv_obj_t * obj, lv_img_dsc_t * dsc[], uint8_t num) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + animimg->dsc = dsc; + animimg->pic_count = num; + lv_anim_set_values(&animimg->anim, 0, num); +} + +void lv_animimg_start(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + lv_anim_start(&animimg->anim); +} + +/*===================== + * Setter functions + *====================*/ + +void lv_animimg_set_duration(lv_obj_t * obj, uint32_t duration) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + lv_anim_set_time(&animimg->anim, duration); + lv_anim_set_playback_delay(&animimg->anim, duration); +} + +void lv_animimg_set_repeat_count(lv_obj_t * obj, uint16_t count) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + lv_anim_set_repeat_count(&animimg->anim, count); +} + +/*===================== + * Getter functions + *====================*/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_animimg_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_TRACE_OBJ_CREATE("begin"); + + LV_UNUSED(class_p); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + + animimg->dsc = NULL; + animimg->pic_count = -1; + //initial animation + lv_anim_init(&animimg->anim); + lv_anim_set_var(&animimg->anim, obj); + lv_anim_set_time(&animimg->anim, 30); + lv_anim_set_exec_cb(&animimg->anim, (lv_anim_exec_xcb_t)index_change); + lv_anim_set_values(&animimg->anim, 0, 1); + lv_anim_set_repeat_count(&animimg->anim, LV_ANIM_REPEAT_INFINITE); +} + +static void index_change(lv_obj_t * obj, int32_t index) +{ + lv_coord_t idx; + lv_animimg_t * animimg = (lv_animimg_t *)obj; + + idx = index % animimg->pic_count; + + lv_img_set_src(obj, animimg->dsc[idx]); +} + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/animimg/lv_animimg.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/animimg/lv_animimg.h new file mode 100644 index 0000000..6329494 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/animimg/lv_animimg.h @@ -0,0 +1,103 @@ +/** + * @file lv_animimg.h + * + */ + +#ifndef LV_ANIM_IMG_H +#define LV_ANIM_IMG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_ANIMIMG != 0 + +/*Testing of dependencies*/ +#if LV_USE_IMG == 0 +#error "lv_animimg: lv_img is required. Enable it in lv_conf.h (LV_USE_IMG 1)" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +extern const lv_obj_class_t lv_animimg_class; + +/*Data of image*/ +typedef struct { + lv_img_t img; + lv_anim_t anim; + /*picture sequence */ + lv_img_dsc_t ** dsc; + int8_t pic_count; +} lv_animimg_t; + + +/*Image parts*/ +enum { + LV_ANIM_IMG_PART_MAIN, +}; +typedef uint8_t lv_animimg_part_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an animation image objects + * @param parent pointer to an object, it will be the parent of the new button + * @return pointer to the created animation image object + */ +lv_obj_t * lv_animimg_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the image animation images source. + * @param img pointer to an animation image object + * @param dsc pointer to a series images + * @param num images' number + */ +void lv_animimg_set_src(lv_obj_t * img, lv_img_dsc_t * dsc[], uint8_t num); + +/** + * Startup the image animation. + * @param obj pointer to an animation image object + */ +void lv_animimg_start(lv_obj_t * obj); + +/** + * Set the image animation duration time. unit:ms + * @param img pointer to an animation image object + */ +void lv_animimg_set_duration(lv_obj_t * img, uint32_t duration); + +/** + * Set the image animation reapeatly play times. + * @param img pointer to an animation image object + * @param count the number of times to repeat the animation + */ +void lv_animimg_set_repeat_count(lv_obj_t * img, uint16_t count); + +/*===================== + * Getter functions + *====================*/ + +#endif /*LV_USE_ANIMIMG*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_ANIM_IMG_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/calendar/lv_calendar.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/calendar/lv_calendar.c new file mode 100644 index 0000000..b806d25 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/calendar/lv_calendar.c @@ -0,0 +1,402 @@ +/** + * @file lv_calendar.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_calendar.h" +#include "../../../lvgl.h" +#if LV_USE_CALENDAR + +#include "../../../misc/lv_assert.h" + +/********************* + * DEFINES + *********************/ +#define LV_CALENDAR_CTRL_TODAY LV_BTNMATRIX_CTRL_CUSTOM_1 +#define LV_CALENDAR_CTRL_HIGHLIGHT LV_BTNMATRIX_CTRL_CUSTOM_2 + +#define MY_CLASS &lv_calendar_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_calendar_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void draw_part_begin_event_cb(lv_event_t * e); + +static uint8_t get_day_of_week(uint32_t year, uint32_t month, uint32_t day); +static uint8_t get_month_length(int32_t year, int32_t month); +static uint8_t is_leap_year(uint32_t year); +static void highlight_update(lv_obj_t * calendar); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_calendar_class = { + .constructor_cb = lv_calendar_constructor, + .width_def = (LV_DPI_DEF * 3) / 2, + .height_def = (LV_DPI_DEF * 3) / 2, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .instance_size = sizeof(lv_calendar_t), + .base_class = &lv_obj_class +}; + +static const char * day_names_def[7] = LV_CALENDAR_DEFAULT_DAY_NAMES; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_calendar_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_calendar_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_calendar_set_day_names(lv_obj_t * obj, const char * day_names[]) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + uint32_t i; + for(i = 0; i < 7; i++) { + calendar->map[i] = day_names[i]; + } + lv_obj_invalidate(obj); +} + +void lv_calendar_set_today_date(lv_obj_t * obj, uint32_t year, uint32_t month, uint32_t day) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + calendar->today.year = year; + calendar->today.month = month; + calendar->today.day = day; + + highlight_update(obj); +} + +void lv_calendar_set_highlighted_dates(lv_obj_t * obj, lv_calendar_date_t highlighted[], uint16_t date_num) +{ + LV_ASSERT_NULL(highlighted); + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + calendar->highlighted_dates = highlighted; + calendar->highlighted_dates_num = date_num; + + highlight_update(obj); +} + +void lv_calendar_set_showed_date(lv_obj_t * obj, uint32_t year, uint32_t month) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + calendar->showed_date.year = year; + calendar->showed_date.month = month; + calendar->showed_date.day = 1; + + lv_calendar_date_t d; + d.year = calendar->showed_date.year; + d.month = calendar->showed_date.month; + d.day = calendar->showed_date.day; + + uint32_t i; + + /*Remove the disabled state but revert it for day names*/ + lv_btnmatrix_clear_btn_ctrl_all(calendar->btnm, LV_BTNMATRIX_CTRL_DISABLED); + for(i = 0; i < 7; i++) { + lv_btnmatrix_set_btn_ctrl(calendar->btnm, i, LV_BTNMATRIX_CTRL_DISABLED); + } + + uint8_t act_mo_len = get_month_length(d.year, d.month); + uint8_t day_first = get_day_of_week(d.year, d.month, 1); + uint8_t c; + for(i = day_first, c = 1; i < act_mo_len + day_first; i++, c++) { + lv_snprintf(calendar->nums[i], sizeof(calendar->nums[0]), "%d", c); + } + + uint8_t prev_mo_len = get_month_length(d.year, d.month - 1); + for(i = 0, c = prev_mo_len - day_first + 1; i < day_first; i++, c++) { + lv_snprintf(calendar->nums[i], sizeof(calendar->nums[0]), "%d", c); + lv_btnmatrix_set_btn_ctrl(calendar->btnm, i + 7, LV_BTNMATRIX_CTRL_DISABLED); + } + + for(i = day_first + act_mo_len, c = 1; i < 6 * 7; i++, c++) { + lv_snprintf(calendar->nums[i], sizeof(calendar->nums[0]), "%d", c); + lv_btnmatrix_set_btn_ctrl(calendar->btnm, i + 7, LV_BTNMATRIX_CTRL_DISABLED); + } + + highlight_update(obj); + + /*Reset the focused button if the days changes*/ + if(lv_btnmatrix_get_selected_btn(calendar->btnm) != LV_BTNMATRIX_BTN_NONE) { + lv_btnmatrix_set_selected_btn(calendar->btnm, day_first + 7); + } + + lv_obj_invalidate(obj); + + /* The children of the calendar are probably headers. + * Notify them to let the headers updated to the new date*/ + uint32_t child_cnt = lv_obj_get_child_cnt(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = lv_obj_get_child(obj, i); + if(child == calendar->btnm) continue; + lv_event_send(child, LV_EVENT_VALUE_CHANGED, obj); + } +} + +/*===================== + * Getter functions + *====================*/ + +lv_obj_t * lv_calendar_get_btnmatrix(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + const lv_calendar_t * calendar = (lv_calendar_t *)obj; + return calendar->btnm; +} + +const lv_calendar_date_t * lv_calendar_get_today_date(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + const lv_calendar_t * calendar = (lv_calendar_t *)obj; + + return &calendar->today; +} + +const lv_calendar_date_t * lv_calendar_get_showed_date(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + const lv_calendar_t * calendar = (lv_calendar_t *)obj; + + return &calendar->showed_date; +} + +lv_calendar_date_t * lv_calendar_get_highlighted_dates(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + return calendar->highlighted_dates; +} + +uint16_t lv_calendar_get_highlighted_dates_num(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + return calendar->highlighted_dates_num; +} + +lv_res_t lv_calendar_get_pressed_date(const lv_obj_t * obj, lv_calendar_date_t * date) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + uint16_t d = lv_btnmatrix_get_selected_btn(calendar->btnm); + if(d == LV_BTNMATRIX_BTN_NONE) { + date->year = 0; + date->month = 0; + date->day = 0; + return LV_RES_INV; + } + + const char * txt = lv_btnmatrix_get_btn_text(calendar->btnm, lv_btnmatrix_get_selected_btn(calendar->btnm)); + + if(txt[1] == 0) date->day = txt[0] - '0'; + else date->day = (txt[0] - '0') * 10 + (txt[1] - '0'); + + date->year = calendar->showed_date.year; + date->month = calendar->showed_date.month; + + return LV_RES_OK; +} + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_calendar_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + /*Initialize the allocated 'ext'*/ + calendar->today.year = 2020; + calendar->today.month = 1; + calendar->today.day = 1; + + calendar->showed_date.year = 2020; + calendar->showed_date.month = 1; + calendar->showed_date.day = 1; + + calendar->highlighted_dates = NULL; + calendar->highlighted_dates_num = 0; + + lv_memset_00(calendar->nums, sizeof(calendar->nums)); + uint8_t i; + uint8_t j = 0; + for(i = 0; i < 8 * 7; i++) { + /*Every 8th string is "\n"*/ + if(i != 0 && (i + 1) % 8 == 0) { + calendar->map[i] = "\n"; + } + else if(i < 7) { + calendar->map[i] = day_names_def[i]; + } + else { + calendar->nums[j][0] = 'x'; + calendar->map[i] = calendar->nums[j]; + j++; + } + } + calendar->map[8 * 7 - 1] = ""; + + calendar->btnm = lv_btnmatrix_create(obj); + lv_btnmatrix_set_map(calendar->btnm, calendar->map); + lv_btnmatrix_set_btn_ctrl_all(calendar->btnm, LV_BTNMATRIX_CTRL_CLICK_TRIG | LV_BTNMATRIX_CTRL_NO_REPEAT); + lv_obj_add_event_cb(calendar->btnm, draw_part_begin_event_cb, LV_EVENT_DRAW_PART_BEGIN, NULL); + lv_obj_set_width(calendar->btnm, lv_pct(100)); + + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_grow(calendar->btnm, 1); + + lv_calendar_set_showed_date(obj, calendar->showed_date.year, calendar->showed_date.month); + lv_calendar_set_today_date(obj, calendar->today.year, calendar->today.month, calendar->today.day); + + lv_obj_add_flag(calendar->btnm, LV_OBJ_FLAG_EVENT_BUBBLE); +} + +static void draw_part_begin_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + lv_obj_draw_part_dsc_t * dsc = lv_event_get_param(e); + if(dsc->part == LV_PART_ITEMS) { + /*Day name styles*/ + if(dsc->id < 7) { + dsc->rect_dsc->bg_opa = LV_OPA_TRANSP; + dsc->rect_dsc->border_opa = LV_OPA_TRANSP; + } + else if(lv_btnmatrix_has_btn_ctrl(obj, dsc->id, LV_BTNMATRIX_CTRL_DISABLED)) { + dsc->rect_dsc->bg_opa = LV_OPA_TRANSP; + dsc->rect_dsc->border_opa = LV_OPA_TRANSP; + dsc->label_dsc->color = lv_palette_main(LV_PALETTE_GREY); + } + + if(lv_btnmatrix_has_btn_ctrl(obj, dsc->id, LV_CALENDAR_CTRL_HIGHLIGHT)) { + dsc->rect_dsc->bg_opa = LV_OPA_40; + dsc->rect_dsc->bg_color = lv_theme_get_color_primary(obj); + if(lv_btnmatrix_get_selected_btn(obj) == dsc->id) { + dsc->rect_dsc->bg_opa = LV_OPA_70; + } + } + + if(lv_btnmatrix_has_btn_ctrl(obj, dsc->id, LV_CALENDAR_CTRL_TODAY)) { + dsc->rect_dsc->border_opa = LV_OPA_COVER; + dsc->rect_dsc->border_color = lv_theme_get_color_primary(obj); + dsc->rect_dsc->border_width += 1; + } + + } +} + +/** + * Get the number of days in a month + * @param year a year + * @param month a month. The range is basically [1..12] but [-11..0] or [13..24] is also + * supported to handle next/prev. year + * @return [28..31] + */ +static uint8_t get_month_length(int32_t year, int32_t month) +{ + month--; + if(month < 0) { + year--; /*Already in the previous year (won't be less then -12 to skip a whole year)*/ + month = 12 + month; /*`month` is negative, the result will be < 12*/ + } + if(month >= 12) { + year++; + month -= 12; + } + + /*month == 1 is february*/ + return (month == 1) ? (28 + is_leap_year(year)) : 31 - month % 7 % 2; +} + +/** + * Tells whether a year is leap year or not + * @param year a year + * @return 0: not leap year; 1: leap year + */ +static uint8_t is_leap_year(uint32_t year) +{ + return (year % 4) || ((year % 100 == 0) && (year % 400)) ? 0 : 1; +} + +/** + * Get the day of the week + * @param year a year + * @param month a month [1..12] + * @param day a day [1..32] + * @return [0..6] which means [Sun..Sat] or [Mon..Sun] depending on LV_CALENDAR_WEEK_STARTS_MONDAY + */ +static uint8_t get_day_of_week(uint32_t year, uint32_t month, uint32_t day) +{ + uint32_t a = month < 3 ? 1 : 0; + uint32_t b = year - a; + +#if LV_CALENDAR_WEEK_STARTS_MONDAY + uint32_t day_of_week = (day + (31 * (month - 2 + 12 * a) / 12) + b + (b / 4) - (b / 100) + (b / 400) - 1) % 7; +#else + uint32_t day_of_week = (day + (31 * (month - 2 + 12 * a) / 12) + b + (b / 4) - (b / 100) + (b / 400)) % 7; +#endif + + return day_of_week ; +} + +static void highlight_update(lv_obj_t * obj) +{ + lv_calendar_t * calendar = (lv_calendar_t *)obj; + uint16_t i; + + /*Clear all kind of selection*/ + lv_btnmatrix_clear_btn_ctrl_all(calendar->btnm, LV_CALENDAR_CTRL_TODAY | LV_CALENDAR_CTRL_HIGHLIGHT); + + uint8_t day_first = get_day_of_week(calendar->showed_date.year, calendar->showed_date.month, 1); + if(calendar->highlighted_dates) { + for(i = 0; i < calendar->highlighted_dates_num; i++) { + if(calendar->highlighted_dates[i].year == calendar->showed_date.year && + calendar->highlighted_dates[i].month == calendar->showed_date.month) { + lv_btnmatrix_set_btn_ctrl(calendar->btnm, calendar->highlighted_dates[i].day - 1 + day_first + 7, + LV_CALENDAR_CTRL_HIGHLIGHT); + } + } + } + + if(calendar->showed_date.year == calendar->today.year && calendar->showed_date.month == calendar->today.month) { + lv_btnmatrix_set_btn_ctrl(calendar->btnm, calendar->today.day - 1 + day_first + 7, LV_CALENDAR_CTRL_TODAY); + } +} + +#endif /*LV_USE_CALENDAR*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/calendar/lv_calendar.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/calendar/lv_calendar.h new file mode 100644 index 0000000..2511b2f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/calendar/lv_calendar.h @@ -0,0 +1,164 @@ +/** + * @file lv_calendar.h + * + */ + +#ifndef LV_CALENDAR_H +#define LV_CALENDAR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../widgets/lv_btnmatrix.h" + +#if LV_USE_CALENDAR + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Represents a date on the calendar object (platform-agnostic). + */ +typedef struct { + uint16_t year; + int8_t month; /** 1..12*/ + int8_t day; /** 1..31*/ +} lv_calendar_date_t; + +/*Data of calendar*/ +typedef struct { + lv_obj_t obj; + lv_obj_t * btnm; + /*New data for this type*/ + lv_calendar_date_t today; /*Date of today*/ + lv_calendar_date_t showed_date; /*Currently visible month (day is ignored)*/ + lv_calendar_date_t * + highlighted_dates; /*Apply different style on these days (pointer to an array defined by the user)*/ + uint16_t highlighted_dates_num; /*Number of elements in `highlighted_days`*/ + const char * map[8 * 7]; + char nums [7 * 6][4]; +} lv_calendar_t; + +extern const lv_obj_class_t lv_calendar_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_obj_t * lv_calendar_create(lv_obj_t * parent); + +/*====================== + * Add/remove functions + *=====================*/ + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the today's date + * @param obj pointer to a calendar object + * @param year today's year + * @param month today's month [1..12] + * @param day today's day [1..31] + */ +void lv_calendar_set_today_date(lv_obj_t * obj, uint32_t year, uint32_t month, uint32_t day); + +/** + * Set the currently showed + * @param obj pointer to a calendar object + * @param year today's year + * @param month today's month [1..12] + */ +void lv_calendar_set_showed_date(lv_obj_t * obj, uint32_t year, uint32_t month); + +/** + * Set the highlighted dates + * @param obj pointer to a calendar object + * @param highlighted pointer to an `lv_calendar_date_t` array containing the dates. + * Only the pointer will be saved so this variable can't be local which will be destroyed later. + * @param date_num number of dates in the array + */ +void lv_calendar_set_highlighted_dates(lv_obj_t * obj, lv_calendar_date_t highlighted[], uint16_t date_num); + +/** + * Set the name of the days + * @param obj pointer to a calendar object + * @param day_names pointer to an array with the names. + * E.g. `const char * days[7] = {"Sun", "Mon", ...}` + * Only the pointer will be saved so this variable can't be local which will be destroyed later. + */ +void lv_calendar_set_day_names(lv_obj_t * obj, const char ** day_names); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the button matrix object of the calendar. + * It shows the dates and day names. + * @param obj pointer to a calendar object + * @return pointer to a the button matrix + */ +lv_obj_t * lv_calendar_get_btnmatrix(const lv_obj_t * obj); + +/** + * Get the today's date + * @param calendar pointer to a calendar object + * @return return pointer to an `lv_calendar_date_t` variable containing the date of today. + */ +const lv_calendar_date_t * lv_calendar_get_today_date(const lv_obj_t * calendar); + +/** + * Get the currently showed + * @param calendar pointer to a calendar object + * @return pointer to an `lv_calendar_date_t` variable containing the date is being shown. + */ +const lv_calendar_date_t * lv_calendar_get_showed_date(const lv_obj_t * calendar); + +/** + * Get the highlighted dates + * @param calendar pointer to a calendar object + * @return pointer to an `lv_calendar_date_t` array containing the dates. + */ +lv_calendar_date_t * lv_calendar_get_highlighted_dates(const lv_obj_t * calendar); + +/** + * Get the number of the highlighted dates + * @param calendar pointer to a calendar object + * @return number of highlighted days + */ +uint16_t lv_calendar_get_highlighted_dates_num(const lv_obj_t * calendar); + +/** + * Get the currently pressed day + * @param calendar pointer to a calendar object + * @param date store the pressed date here + * @return LV_RES_OK: there is a valid pressed date; LV_RES_INV: there is no pressed data + */ +lv_res_t lv_calendar_get_pressed_date(const lv_obj_t * calendar, lv_calendar_date_t * date); + +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_CALENDAR*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CALENDAR_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/calendar/lv_calendar_header_arrow.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/calendar/lv_calendar_header_arrow.c new file mode 100644 index 0000000..fecb139 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/calendar/lv_calendar_header_arrow.c @@ -0,0 +1,149 @@ +/** + * @file lv_calendar_header_arrow.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_calendar_header_arrow.h" +#if LV_USE_CALENDAR_HEADER_ARROW + +#include "lv_calendar.h" +#include "../../../widgets/lv_btn.h" +#include "../../../widgets/lv_label.h" +#include "../../layouts/flex/lv_flex.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void my_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void month_event_cb(lv_event_t * e); +static void value_changed_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_calendar_header_arrow_class = { + .base_class = &lv_obj_class, + .constructor_cb = my_constructor, + .width_def = LV_PCT(100), + .height_def = LV_DPI_DEF / 3 +}; + +static const char * month_names_def[12] = LV_CALENDAR_DEFAULT_MONTH_NAMES; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_calendar_header_arrow_create(lv_obj_t * parent) +{ + lv_obj_t * obj = lv_obj_class_create_obj(&lv_calendar_header_arrow_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void my_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_TRACE_OBJ_CREATE("begin"); + + LV_UNUSED(class_p); + + lv_obj_move_to_index(obj, 0); + + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(obj, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START); + + lv_obj_t * mo_prev = lv_btn_create(obj); + lv_obj_set_style_bg_img_src(mo_prev, LV_SYMBOL_LEFT, 0); + lv_obj_set_height(mo_prev, lv_pct(100)); + lv_obj_update_layout(mo_prev); + lv_coord_t btn_size = lv_obj_get_height(mo_prev); + lv_obj_set_width(mo_prev, btn_size); + + lv_obj_add_event_cb(mo_prev, month_event_cb, LV_EVENT_CLICKED, NULL); + lv_obj_clear_flag(mo_prev, LV_OBJ_FLAG_CLICK_FOCUSABLE); + + lv_obj_t * label = lv_label_create(obj); + lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR); + lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, 0); + lv_obj_set_flex_grow(label, 1); + + lv_obj_t * mo_next = lv_btn_create(obj); + lv_obj_set_style_bg_img_src(mo_next, LV_SYMBOL_RIGHT, 0); + lv_obj_set_size(mo_next, btn_size, btn_size); + + lv_obj_add_event_cb(mo_next, month_event_cb, LV_EVENT_CLICKED, NULL); + lv_obj_clear_flag(mo_next, LV_OBJ_FLAG_CLICK_FOCUSABLE); + + lv_obj_add_event_cb(obj, value_changed_event_cb, LV_EVENT_VALUE_CHANGED, NULL); + /*Refresh the drop downs*/ + lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL); +} + +static void month_event_cb(lv_event_t * e) +{ + lv_obj_t * btn = lv_event_get_target(e); + + lv_obj_t * header = lv_obj_get_parent(btn); + lv_obj_t * calendar = lv_obj_get_parent(header); + + const lv_calendar_date_t * d; + d = lv_calendar_get_showed_date(calendar); + lv_calendar_date_t newd = *d; + + /*The last child is the right button*/ + if(lv_obj_get_child(header, 0) == btn) { + if(newd.month == 1) { + newd.month = 12; + newd.year --; + } + else { + newd.month --; + } + } + else { + if(newd.month == 12) { + newd.month = 1; + newd.year ++; + } + else { + newd.month ++; + } + } + + lv_calendar_set_showed_date(calendar, newd.year, newd.month); + + lv_obj_t * label = lv_obj_get_child(header, 1); + lv_label_set_text_fmt(label, "%d %s", newd.year, month_names_def[newd.month - 1]); +} + +static void value_changed_event_cb(lv_event_t * e) +{ + lv_obj_t * header = lv_event_get_target(e); + lv_obj_t * calendar = lv_obj_get_parent(header); + + const lv_calendar_date_t * cur_date = lv_calendar_get_showed_date(calendar); + lv_obj_t * label = lv_obj_get_child(header, 1); + lv_label_set_text_fmt(label, "%d %s", cur_date->year, month_names_def[cur_date->month - 1]); +} + +#endif /*LV_USE_CALENDAR_HEADER_ARROW*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/calendar/lv_calendar_header_arrow.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/calendar/lv_calendar_header_arrow.h new file mode 100644 index 0000000..609ccb0 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/calendar/lv_calendar_header_arrow.h @@ -0,0 +1,49 @@ +/** + * @file lv_calendar_header_arrow.h + * + */ + +#ifndef LV_CALENDAR_HEADER_ARROW_H +#define LV_CALENDAR_HEADER_ARROW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../core/lv_obj.h" +#if LV_USE_CALENDAR_HEADER_ARROW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +extern const lv_obj_class_t lv_calendar_header_arrow_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a calendar header with drop-drowns to select the year and month + * @param parent pointer to a calendar object. + * @return the created header + */ +lv_obj_t * lv_calendar_header_arrow_create(lv_obj_t * parent); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_CALENDAR_HEADER_ARROW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CALENDAR_HEADER_ARROW_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/calendar/lv_calendar_header_dropdown.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/calendar/lv_calendar_header_dropdown.c new file mode 100644 index 0000000..5e8f90d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/calendar/lv_calendar_header_dropdown.c @@ -0,0 +1,142 @@ +/** + * @file lv_calendar_obj_dropdown.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_calendar_header_dropdown.h" +#if LV_USE_CALENDAR_HEADER_DROPDOWN + +#include "lv_calendar.h" +#include "../../../widgets/lv_dropdown.h" +#include "../../layouts/flex/lv_flex.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void my_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void year_event_cb(lv_event_t * e); +static void month_event_cb(lv_event_t * e); +static void value_changed_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_calendar_header_dropdown_class = { + .base_class = &lv_obj_class, + .width_def = LV_PCT(100), + .height_def = LV_SIZE_CONTENT, + .constructor_cb = my_constructor +}; + +static const char * month_list = "01\n02\n03\n04\n05\n06\n07\n08\n09\n10\n11\n12"; +static const char * year_list = { + "2023\n2022\n2021\n" + "2020\n2019\n2018\n2017\n2016\n2015\n2014\n2013\n2012\n2011\n2010\n2009\n2008\n2007\n2006\n2005\n2004\n2003\n2002\n2001\n" + "2000\n1999\n1998\n1997\n1996\n1995\n1994\n1993\n1992\n1991\n1990\n1989\n1988\n1987\n1986\n1985\n1984\n1983\n1982\n1981\n" + "1980\n1979\n1978\n1977\n1976\n1975\n1974\n1973\n1972\n1971\n1970\n1969\n1968\n1967\n1966\n1965\n1964\n1963\n1962\n1961\n" + "1960\n1959\n1958\n1957\n1956\n1955\n1954\n1953\n1952\n1951\n1950\n1949\n1948\n1947\n1946\n1945\n1944\n1943\n1942\n1941\n" + "1940\n1939\n1938\n1937\n1936\n1935\n1934\n1933\n1932\n1931\n1930\n1929\n1928\n1927\n1926\n1925\n1924\n1923\n1922\n1921\n" + "1920\n1919\n1918\n1917\n1916\n1915\n1914\n1913\n1912\n1911\n1910\n1909\n1908\n1907\n1906\n1905\n1904\n1903\n1902\n1901" +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_calendar_header_dropdown_create(lv_obj_t * parent) +{ + lv_obj_t * obj = lv_obj_class_create_obj(&lv_calendar_header_dropdown_class, parent); + lv_obj_class_init_obj(obj); + + return obj; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void my_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_TRACE_OBJ_CREATE("begin"); + + LV_UNUSED(class_p); + + lv_obj_t * calendar = lv_obj_get_parent(obj); + lv_obj_move_to_index(obj, 0); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); + + lv_obj_t * year_dd = lv_dropdown_create(obj); + lv_dropdown_set_options(year_dd, year_list); + lv_obj_add_event_cb(year_dd, year_event_cb, LV_EVENT_VALUE_CHANGED, calendar); + lv_obj_set_flex_grow(year_dd, 1); + + lv_obj_t * month_dd = lv_dropdown_create(obj); + lv_dropdown_set_options(month_dd, month_list); + lv_obj_add_event_cb(month_dd, month_event_cb, LV_EVENT_VALUE_CHANGED, calendar); + lv_obj_set_flex_grow(month_dd, 1); + + lv_obj_add_event_cb(obj, value_changed_event_cb, LV_EVENT_VALUE_CHANGED, NULL); + /*Refresh the drop downs*/ + lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL); +} + +static void month_event_cb(lv_event_t * e) +{ + lv_obj_t * dropdown = lv_event_get_target(e); + lv_obj_t * calendar = lv_event_get_user_data(e); + + uint16_t sel = lv_dropdown_get_selected(dropdown); + + const lv_calendar_date_t * d; + d = lv_calendar_get_showed_date(calendar); + lv_calendar_date_t newd = *d; + newd.month = sel + 1; + + lv_calendar_set_showed_date(calendar, newd.year, newd.month); +} + +static void year_event_cb(lv_event_t * e) +{ + lv_obj_t * dropdown = lv_event_get_target(e); + lv_obj_t * calendar = lv_event_get_user_data(e); + + uint16_t sel = lv_dropdown_get_selected(dropdown); + + const lv_calendar_date_t * d; + d = lv_calendar_get_showed_date(calendar); + lv_calendar_date_t newd = *d; + newd.year = 2023 - sel; + + lv_calendar_set_showed_date(calendar, newd.year, newd.month); +} + +static void value_changed_event_cb(lv_event_t * e) +{ + lv_obj_t * header = lv_event_get_target(e); + lv_obj_t * calendar = lv_obj_get_parent(header); + const lv_calendar_date_t * cur_date = lv_calendar_get_showed_date(calendar); + + lv_obj_t * year_dd = lv_obj_get_child(header, 0); + lv_dropdown_set_selected(year_dd, 2023 - cur_date->year); + + lv_obj_t * month_dd = lv_obj_get_child(header, 1); + lv_dropdown_set_selected(month_dd, cur_date->month - 1); +} + +#endif /*LV_USE_CALENDAR_HEADER_ARROW*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/calendar/lv_calendar_header_dropdown.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/calendar/lv_calendar_header_dropdown.h new file mode 100644 index 0000000..fca2197 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/calendar/lv_calendar_header_dropdown.h @@ -0,0 +1,49 @@ +/** + * @file lv_calendar_header_dropdown.h + * + */ + +#ifndef LV_CALENDAR_HEADER_DROPDOWN_H +#define LV_CALENDAR_HEADER_DROPDOWN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../core/lv_obj.h" +#if LV_USE_CALENDAR_HEADER_DROPDOWN + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +extern const lv_obj_class_t lv_calendar_header_dropdown_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a calendar header with drop-drowns to select the year and month + * @param parent pointer to a calendar object. + * @return the created header + */ +lv_obj_t * lv_calendar_header_dropdown_create(lv_obj_t * parent); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_CALENDAR_HEADER_ARROW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CALENDAR_HEADER_DROPDOWN_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/chart/lv_chart.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/chart/lv_chart.c new file mode 100644 index 0000000..da6c18c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/chart/lv_chart.c @@ -0,0 +1,1802 @@ +/** + * @file lv_chart.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_chart.h" +#if LV_USE_CHART != 0 + +#include "../../../misc/lv_assert.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_chart_class + +#define LV_CHART_HDIV_DEF 3 +#define LV_CHART_VDIV_DEF 5 +#define LV_CHART_POINT_CNT_DEF 10 +#define LV_CHART_LABEL_MAX_TEXT_LENGTH 16 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_chart_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_chart_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_chart_event(const lv_obj_class_t * class_p, lv_event_t * e); + +static void draw_div_lines(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx); +static void draw_series_line(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx); +static void draw_series_bar(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx); +static void draw_series_scatter(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx); +static void draw_cursors(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx); +static void draw_axes(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx); +static uint32_t get_index_from_x(lv_obj_t * obj, lv_coord_t x); +static void invalidate_point(lv_obj_t * obj, uint16_t i); +static void new_points_alloc(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t cnt, lv_coord_t ** a); +lv_chart_tick_dsc_t * get_tick_gsc(lv_obj_t * obj, lv_chart_axis_t axis); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_chart_class = { + .constructor_cb = lv_chart_constructor, + .destructor_cb = lv_chart_destructor, + .event_cb = lv_chart_event, + .width_def = LV_PCT(100), + .height_def = LV_DPI_DEF * 2, + .instance_size = sizeof(lv_chart_t), + .base_class = &lv_obj_class +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_chart_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +void lv_chart_set_type(lv_obj_t * obj, lv_chart_type_t type) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(chart->type == type) return; + + if(chart->type == LV_CHART_TYPE_SCATTER) { + lv_chart_series_t * ser; + _LV_LL_READ_BACK(&chart->series_ll, ser) { + lv_mem_free(ser->x_points); + ser->x_points = NULL; + } + } + + if(type == LV_CHART_TYPE_SCATTER) { + lv_chart_series_t * ser; + _LV_LL_READ_BACK(&chart->series_ll, ser) { + ser->x_points = lv_mem_alloc(sizeof(lv_point_t) * chart->point_cnt); + LV_ASSERT_MALLOC(ser->x_points); + if(ser->x_points == NULL) return; + } + } + + chart->type = type; + + lv_chart_refresh(obj); +} + +void lv_chart_set_point_count(lv_obj_t * obj, uint16_t cnt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(chart->point_cnt == cnt) return; + + lv_chart_series_t * ser; + + if(cnt < 1) cnt = 1; + + _LV_LL_READ_BACK(&chart->series_ll, ser) { + if(chart->type == LV_CHART_TYPE_SCATTER) { + if(!ser->x_ext_buf_assigned) new_points_alloc(obj, ser, cnt, &ser->x_points); + } + if(!ser->y_ext_buf_assigned) new_points_alloc(obj, ser, cnt, &ser->y_points); + ser->start_point = 0; + } + + chart->point_cnt = cnt; + + lv_chart_refresh(obj); +} + +void lv_chart_set_range(lv_obj_t * obj, lv_chart_axis_t axis, lv_coord_t min, lv_coord_t max) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + max = max == min ? max + 1 : max; + + lv_chart_t * chart = (lv_chart_t *)obj; + switch(axis) { + case LV_CHART_AXIS_PRIMARY_Y: + chart->ymin[0] = min; + chart->ymax[0] = max; + break; + case LV_CHART_AXIS_SECONDARY_Y: + chart->ymin[1] = min; + chart->ymax[1] = max; + break; + case LV_CHART_AXIS_PRIMARY_X: + chart->xmin[0] = min; + chart->xmax[0] = max; + break; + case LV_CHART_AXIS_SECONDARY_X: + chart->xmin[1] = min; + chart->xmax[1] = max; + break; + default: + LV_LOG_WARN("Invalid axis: %d", axis); + return; + } + + lv_chart_refresh(obj); +} + +void lv_chart_set_update_mode(lv_obj_t * obj, lv_chart_update_mode_t update_mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(chart->update_mode == update_mode) return; + + chart->update_mode = update_mode; + lv_obj_invalidate(obj); +} + +void lv_chart_set_div_line_count(lv_obj_t * obj, uint8_t hdiv, uint8_t vdiv) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(chart->hdiv_cnt == hdiv && chart->vdiv_cnt == vdiv) return; + + chart->hdiv_cnt = hdiv; + chart->vdiv_cnt = vdiv; + + lv_obj_invalidate(obj); +} + + +void lv_chart_set_zoom_x(lv_obj_t * obj, uint16_t zoom_x) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(chart->zoom_x == zoom_x) return; + + chart->zoom_x = zoom_x; + lv_obj_refresh_self_size(obj); + /*Be the chart doesn't remain scrolled out*/ + lv_obj_readjust_scroll(obj, LV_ANIM_OFF); + lv_obj_invalidate(obj); +} + +void lv_chart_set_zoom_y(lv_obj_t * obj, uint16_t zoom_y) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(chart->zoom_y == zoom_y) return; + + chart->zoom_y = zoom_y; + lv_obj_refresh_self_size(obj); + /*Be the chart doesn't remain scrolled out*/ + lv_obj_readjust_scroll(obj, LV_ANIM_OFF); + lv_obj_invalidate(obj); +} + +uint16_t lv_chart_get_zoom_x(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + return chart->zoom_x; +} + +uint16_t lv_chart_get_zoom_y(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + return chart->zoom_y; +} + +void lv_chart_set_axis_tick(lv_obj_t * obj, lv_chart_axis_t axis, lv_coord_t major_len, lv_coord_t minor_len, + lv_coord_t major_cnt, lv_coord_t minor_cnt, bool label_en, lv_coord_t draw_size) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_tick_dsc_t * t = get_tick_gsc(obj, axis); + t->major_len = major_len; + t->minor_len = minor_len; + t->minor_cnt = minor_cnt; + t->major_cnt = major_cnt; + t->label_en = label_en; + t->draw_size = draw_size; + + lv_obj_refresh_ext_draw_size(obj); + lv_obj_invalidate(obj); +} + +lv_chart_type_t lv_chart_get_type(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + return chart->type; +} + +uint16_t lv_chart_get_point_count(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + return chart->point_cnt; +} + +uint16_t lv_chart_get_x_start_point(const lv_obj_t * obj, lv_chart_series_t * ser) +{ + LV_UNUSED(obj); + LV_ASSERT_NULL(ser); + + return ser->start_point; +} + +void lv_chart_get_point_pos_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint16_t id, lv_point_t * p_out) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_NULL(ser); + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(id >= chart->point_cnt) { + LV_LOG_WARN("Invalid index: %d", id); + p_out->x = 0; + p_out->y = 0; + return; + } + + lv_coord_t w = ((int32_t)lv_obj_get_content_width(obj) * chart->zoom_x) >> 8; + lv_coord_t h = ((int32_t)lv_obj_get_content_height(obj) * chart->zoom_y) >> 8; + + if(chart->type == LV_CHART_TYPE_LINE) { + p_out->x = (w * id) / (chart->point_cnt - 1); + } + else if(chart->type == LV_CHART_TYPE_SCATTER) { + p_out->x = lv_map(ser->x_points[id], chart->xmin[ser->x_axis_sec], chart->xmax[ser->x_axis_sec], 0, w); + } + else if(chart->type == LV_CHART_TYPE_BAR) { + uint32_t ser_cnt = _lv_ll_get_len(&chart->series_ll); + int32_t ser_gap = ((int32_t)lv_obj_get_style_pad_column(obj, + LV_PART_ITEMS) * chart->zoom_x) >> 8; /*Gap between the column on the ~same X*/ + int32_t block_gap = ((int32_t)lv_obj_get_style_pad_column(obj, + LV_PART_MAIN) * chart->zoom_x) >> 8; /*Gap between the column on ~adjacent X*/ + lv_coord_t block_w = (w - ((chart->point_cnt - 1) * block_gap)) / chart->point_cnt; + lv_coord_t col_w = block_w / ser_cnt; + + p_out->x = (int32_t)((int32_t)w * id) / chart->point_cnt; + + lv_chart_series_t * ser_i = NULL; + _LV_LL_READ_BACK(&chart->series_ll, ser_i) { + if(ser_i == ser) break; + p_out->x += col_w; + } + + p_out->x += (col_w - ser_gap) / 2; + } + + lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + p_out->x += lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; + p_out->x -= lv_obj_get_scroll_left(obj); + + int32_t temp_y = 0; + temp_y = (int32_t)((int32_t)ser->y_points[id] - chart->ymin[ser->y_axis_sec]) * h; + temp_y = temp_y / (chart->ymax[ser->y_axis_sec] - chart->ymin[ser->y_axis_sec]); + p_out->y = h - temp_y; + p_out->y += lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width; + p_out->y -= lv_obj_get_scroll_top(obj); +} + +void lv_chart_refresh(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_invalidate(obj); +} + +/*====================== + * Series + *=====================*/ + +lv_chart_series_t * lv_chart_add_series(lv_obj_t * obj, lv_color_t color, lv_chart_axis_t axis) +{ + LV_LOG_INFO("begin"); + + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + lv_chart_series_t * ser = _lv_ll_ins_head(&chart->series_ll); + LV_ASSERT_MALLOC(ser); + if(ser == NULL) return NULL; + + lv_coord_t def = LV_CHART_POINT_NONE; + + ser->color = color; + ser->y_points = lv_mem_alloc(sizeof(lv_coord_t) * chart->point_cnt); + LV_ASSERT_MALLOC(ser->y_points); + + if(chart->type == LV_CHART_TYPE_SCATTER) { + ser->x_points = lv_mem_alloc(sizeof(lv_coord_t) * chart->point_cnt); + LV_ASSERT_MALLOC(ser->x_points); + } + if(ser->y_points == NULL) { + _lv_ll_remove(&chart->series_ll, ser); + lv_mem_free(ser); + return NULL; + } + + ser->start_point = 0; + ser->y_ext_buf_assigned = false; + ser->hidden = 0; + ser->x_axis_sec = axis & LV_CHART_AXIS_SECONDARY_X ? 1 : 0; + ser->y_axis_sec = axis & LV_CHART_AXIS_SECONDARY_Y ? 1 : 0; + + uint16_t i; + lv_coord_t * p_tmp = ser->y_points; + for(i = 0; i < chart->point_cnt; i++) { + *p_tmp = def; + p_tmp++; + } + + return ser; +} + +void lv_chart_remove_series(lv_obj_t * obj, lv_chart_series_t * series) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(series); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(!series->y_ext_buf_assigned && series->y_points) lv_mem_free(series->y_points); + + _lv_ll_remove(&chart->series_ll, series); + lv_mem_free(series); + + return; +} + +void lv_chart_hide_series(lv_obj_t * chart, lv_chart_series_t * series, bool hide) +{ + LV_ASSERT_OBJ(chart, MY_CLASS); + LV_ASSERT_NULL(series); + + series->hidden = hide ? 1 : 0; + lv_chart_refresh(chart); +} + + +void lv_chart_set_series_color(lv_obj_t * chart, lv_chart_series_t * series, lv_color_t color) +{ + LV_ASSERT_OBJ(chart, MY_CLASS); + LV_ASSERT_NULL(series); + + series->color = color; + lv_chart_refresh(chart); +} + +void lv_chart_set_x_start_point(lv_obj_t * obj, lv_chart_series_t * ser, uint16_t id) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(id >= chart->point_cnt) return; + ser->start_point = id; +} + +lv_chart_series_t * lv_chart_get_series_next(const lv_obj_t * obj, const lv_chart_series_t * ser) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(ser == NULL) return _lv_ll_get_head(&chart->series_ll); + else return _lv_ll_get_next(&chart->series_ll, ser); +} + +/*===================== + * Cursor + *====================*/ + +/** + * Add a cursor with a given color + * @param chart pointer to chart object + * @param color color of the cursor + * @param dir direction of the cursor. `LV_DIR_RIGHT/LEFT/TOP/DOWN/HOR/VER/ALL`. OR-ed values are possible + * @return pointer to the created cursor + */ +lv_chart_cursor_t * lv_chart_add_cursor(lv_obj_t * obj, lv_color_t color, lv_dir_t dir) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + lv_chart_cursor_t * cursor = _lv_ll_ins_head(&chart->cursor_ll); + LV_ASSERT_MALLOC(cursor); + if(cursor == NULL) return NULL; + + cursor->pos.x = LV_CHART_POINT_NONE; + cursor->pos.y = LV_CHART_POINT_NONE; + cursor->point_id = LV_CHART_POINT_NONE; + cursor->pos_set = 0; + cursor->color = color; + cursor->dir = dir; + + return cursor; +} + +/** + * Set the coordinate of the cursor with respect + * to the origin of series area of the chart. + * @param chart pointer to a chart object. + * @param cursor pointer to the cursor. + * @param pos the new coordinate of cursor relative to the series area + */ +void lv_chart_set_cursor_pos(lv_obj_t * chart, lv_chart_cursor_t * cursor, lv_point_t * pos) +{ + LV_ASSERT_NULL(cursor); + LV_UNUSED(chart); + + cursor->pos.x = pos->x; + cursor->pos.y = pos->y; + cursor->pos_set = 1; + lv_chart_refresh(chart); +} + + +/** + * Set the coordinate of the cursor with respect + * to the origin of series area of the chart. + * @param chart pointer to a chart object. + * @param cursor pointer to the cursor. + * @param pos the new coordinate of cursor relative to the series area + */ +void lv_chart_set_cursor_point(lv_obj_t * chart, lv_chart_cursor_t * cursor, lv_chart_series_t * ser, uint16_t point_id) +{ + LV_ASSERT_NULL(cursor); + LV_UNUSED(chart); + + cursor->point_id = point_id; + cursor->pos_set = 0; + if(ser == NULL) ser = lv_chart_get_series_next(chart, NULL); + cursor->ser = ser; + lv_chart_refresh(chart); +} +/** + * Get the coordinate of the cursor with respect + * to the origin of series area of the chart. + * @param chart pointer to a chart object + * @param cursor pointer to cursor + * @return coordinate of the cursor as lv_point_t + */ +lv_point_t lv_chart_get_cursor_point(lv_obj_t * chart, lv_chart_cursor_t * cursor) +{ + LV_ASSERT_NULL(cursor); + LV_UNUSED(chart); + + return cursor->pos; +} + +/*===================== + * Set/Get value(s) + *====================*/ + + +void lv_chart_set_all_value(lv_obj_t * obj, lv_chart_series_t * ser, lv_coord_t value) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + + lv_chart_t * chart = (lv_chart_t *)obj; + uint16_t i; + for(i = 0; i < chart->point_cnt; i++) { + ser->y_points[i] = value; + } + ser->start_point = 0; + lv_chart_refresh(obj); +} + +void lv_chart_set_next_value(lv_obj_t * obj, lv_chart_series_t * ser, lv_coord_t value) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + + lv_chart_t * chart = (lv_chart_t *)obj; + ser->y_points[ser->start_point] = value; + invalidate_point(obj, ser->start_point); + ser->start_point = (ser->start_point + 1) % chart->point_cnt; + invalidate_point(obj, ser->start_point); +} + +void lv_chart_set_next_value2(lv_obj_t * obj, lv_chart_series_t * ser, lv_coord_t x_value, lv_coord_t y_value) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + + lv_chart_t * chart = (lv_chart_t *)obj; + + if(chart->type != LV_CHART_TYPE_SCATTER) { + LV_LOG_WARN("Type must be LV_CHART_TYPE_SCATTER"); + return; + } + + ser->x_points[ser->start_point] = x_value; + ser->y_points[ser->start_point] = y_value; + ser->start_point = (ser->start_point + 1) % chart->point_cnt; + invalidate_point(obj, ser->start_point); +} + +void lv_chart_set_value_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint16_t id, lv_coord_t value) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + lv_chart_t * chart = (lv_chart_t *)obj; + + if(id >= chart->point_cnt) return; + ser->y_points[id] = value; + invalidate_point(obj, id); +} + +void lv_chart_set_value_by_id2(lv_obj_t * obj, lv_chart_series_t * ser, uint16_t id, lv_coord_t x_value, + lv_coord_t y_value) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + lv_chart_t * chart = (lv_chart_t *)obj; + + if(chart->type != LV_CHART_TYPE_SCATTER) { + LV_LOG_WARN("Type must be LV_CHART_TYPE_SCATTER"); + return; + } + + if(id >= chart->point_cnt) return; + ser->x_points[id] = x_value; + ser->y_points[id] = y_value; + invalidate_point(obj, id); +} + +void lv_chart_set_ext_y_array(lv_obj_t * obj, lv_chart_series_t * ser, lv_coord_t array[]) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + + if(!ser->y_ext_buf_assigned && ser->y_points) lv_mem_free(ser->y_points); + ser->y_ext_buf_assigned = true; + ser->y_points = array; + lv_obj_invalidate(obj); +} + +void lv_chart_set_ext_x_array(lv_obj_t * obj, lv_chart_series_t * ser, lv_coord_t array[]) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + + if(!ser->x_ext_buf_assigned && ser->x_points) lv_mem_free(ser->x_points); + ser->x_ext_buf_assigned = true; + ser->x_points = array; + lv_obj_invalidate(obj); +} + +lv_coord_t * lv_chart_get_y_array(const lv_obj_t * obj, lv_chart_series_t * ser) +{ + LV_UNUSED(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + return ser->y_points; +} + +lv_coord_t * lv_chart_get_x_array(const lv_obj_t * obj, lv_chart_series_t * ser) +{ + LV_UNUSED(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + return ser->x_points; +} + +uint32_t lv_chart_get_pressed_point(const lv_obj_t * obj) +{ + lv_chart_t * chart = (lv_chart_t *)obj; + return chart->pressed_point_id; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_chart_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_chart_t * chart = (lv_chart_t *)obj; + + _lv_ll_init(&chart->series_ll, sizeof(lv_chart_series_t)); + _lv_ll_init(&chart->cursor_ll, sizeof(lv_chart_cursor_t)); + + chart->ymin[0] = 0; + chart->xmin[0] = 0; + chart->ymin[1] = 0; + chart->xmin[1] = 0; + chart->ymax[0] = 100; + chart->xmax[0] = 100; + chart->ymax[1] = 100; + chart->xmax[1] = 100; + + chart->hdiv_cnt = LV_CHART_HDIV_DEF; + chart->vdiv_cnt = LV_CHART_VDIV_DEF; + chart->point_cnt = LV_CHART_POINT_CNT_DEF; + chart->pressed_point_id = LV_CHART_POINT_NONE; + chart->type = LV_CHART_TYPE_LINE; + chart->update_mode = LV_CHART_UPDATE_MODE_SHIFT; + chart->zoom_x = LV_IMG_ZOOM_NONE; + chart->zoom_y = LV_IMG_ZOOM_NONE; + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_chart_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_chart_t * chart = (lv_chart_t *)obj; + lv_chart_series_t * ser; + while(chart->series_ll.head) { + ser = _lv_ll_get_head(&chart->series_ll); + + if(!ser->y_ext_buf_assigned) lv_mem_free(ser->y_points); + + _lv_ll_remove(&chart->series_ll, ser); + lv_mem_free(ser); + } + _lv_ll_clear(&chart->series_ll); + + lv_chart_cursor_t * cur; + while(chart->cursor_ll.head) { + cur = _lv_ll_get_head(&chart->cursor_ll); + _lv_ll_remove(&chart->cursor_ll, cur); + lv_mem_free(cur); + } + _lv_ll_clear(&chart->cursor_ll); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_chart_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + /*Call the ancestor's event handler*/ + lv_res_t res; + + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RES_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(code == LV_EVENT_PRESSED) { + lv_indev_t * indev = lv_indev_get_act(); + lv_point_t p; + lv_indev_get_point(indev, &p); + + p.x -= obj->coords.x1; + uint32_t id = get_index_from_x(obj, p.x + lv_obj_get_scroll_left(obj)); + if(id != (uint32_t)chart->pressed_point_id) { + invalidate_point(obj, id); + invalidate_point(obj, chart->pressed_point_id); + chart->pressed_point_id = id; + lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL); + } + } + else if(code == LV_EVENT_RELEASED) { + invalidate_point(obj, chart->pressed_point_id); + chart->pressed_point_id = LV_CHART_POINT_NONE; + } + else if(code == LV_EVENT_SIZE_CHANGED) { + lv_obj_refresh_self_size(obj); + } + else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + lv_event_set_ext_draw_size(e, LV_MAX4(chart->tick[0].draw_size, chart->tick[1].draw_size, chart->tick[2].draw_size, + chart->tick[3].draw_size)); + } + else if(code == LV_EVENT_GET_SELF_SIZE) { + lv_point_t * p = lv_event_get_param(e); + p->x = ((int32_t)lv_obj_get_content_width(obj) * chart->zoom_x) >> 8; + p->y = ((int32_t)lv_obj_get_content_height(obj) * chart->zoom_y) >> 8; + } + else if(code == LV_EVENT_DRAW_MAIN) { + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + draw_div_lines(obj, draw_ctx); + draw_axes(obj, draw_ctx); + + if(_lv_ll_is_empty(&chart->series_ll) == false) { + if(chart->type == LV_CHART_TYPE_LINE) draw_series_line(obj, draw_ctx); + else if(chart->type == LV_CHART_TYPE_BAR) draw_series_bar(obj, draw_ctx); + else if(chart->type == LV_CHART_TYPE_SCATTER) draw_series_scatter(obj, draw_ctx); + } + + draw_cursors(obj, draw_ctx); + } +} + +static void draw_div_lines(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx) +{ + lv_chart_t * chart = (lv_chart_t *)obj; + + lv_area_t series_clip_area; + bool mask_ret = _lv_area_intersect(&series_clip_area, &obj->coords, draw_ctx->clip_area); + if(mask_ret == false) return; + + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + draw_ctx->clip_area = &series_clip_area; + + int16_t i; + int16_t i_start; + int16_t i_end; + lv_point_t p1; + lv_point_t p2; + lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_coord_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; + lv_coord_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width; + lv_coord_t w = ((int32_t)lv_obj_get_content_width(obj) * chart->zoom_x) >> 8; + lv_coord_t h = ((int32_t)lv_obj_get_content_height(obj) * chart->zoom_y) >> 8; + + lv_draw_line_dsc_t line_dsc; + lv_draw_line_dsc_init(&line_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_MAIN, &line_dsc); + + lv_obj_draw_part_dsc_t part_draw_dsc; + lv_obj_draw_dsc_init(&part_draw_dsc, draw_ctx); + part_draw_dsc.part = LV_PART_MAIN; + part_draw_dsc.class_p = MY_CLASS; + part_draw_dsc.type = LV_CHART_DRAW_PART_DIV_LINE_INIT; + part_draw_dsc.line_dsc = &line_dsc; + part_draw_dsc.id = 0xFFFFFFFF; + part_draw_dsc.p1 = NULL; + part_draw_dsc.p2 = NULL; + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + + lv_opa_t border_opa = lv_obj_get_style_border_opa(obj, LV_PART_MAIN); + lv_coord_t border_w = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_border_side_t border_side = lv_obj_get_style_border_side(obj, LV_PART_MAIN); + + lv_coord_t scroll_left = lv_obj_get_scroll_left(obj); + lv_coord_t scroll_top = lv_obj_get_scroll_top(obj); + if(chart->hdiv_cnt != 0) { + lv_coord_t y_ofs = obj->coords.y1 + pad_top - scroll_top; + p1.x = obj->coords.x1; + p2.x = obj->coords.x2; + + i_start = 0; + i_end = chart->hdiv_cnt; + if(border_opa > LV_OPA_MIN && border_w > 0) { + if((border_side & LV_BORDER_SIDE_TOP) && (lv_obj_get_style_pad_top(obj, LV_PART_MAIN) == 0)) i_start++; + if((border_side & LV_BORDER_SIDE_BOTTOM) && (lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN) == 0)) i_end--; + } + + for(i = i_start; i < i_end; i++) { + p1.y = (int32_t)((int32_t)h * i) / (chart->hdiv_cnt - 1); + p1.y += y_ofs; + p2.y = p1.y; + + part_draw_dsc.class_p = MY_CLASS; + part_draw_dsc.type = LV_CHART_DRAW_PART_DIV_LINE_HOR; + part_draw_dsc.p1 = &p1; + part_draw_dsc.p2 = &p2; + part_draw_dsc.id = i; + + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + lv_draw_line(draw_ctx, &line_dsc, &p1, &p2); + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + } + } + + if(chart->vdiv_cnt != 0) { + lv_coord_t x_ofs = obj->coords.x1 + pad_left - scroll_left; + p1.y = obj->coords.y1; + p2.y = obj->coords.y2; + i_start = 0; + i_end = chart->vdiv_cnt; + if(border_opa > LV_OPA_MIN && border_w > 0) { + if((border_side & LV_BORDER_SIDE_LEFT) && (lv_obj_get_style_pad_left(obj, LV_PART_MAIN) == 0)) i_start++; + if((border_side & LV_BORDER_SIDE_RIGHT) && (lv_obj_get_style_pad_right(obj, LV_PART_MAIN) == 0)) i_end--; + } + + for(i = i_start; i < i_end; i++) { + p1.x = (int32_t)((int32_t)w * i) / (chart->vdiv_cnt - 1); + p1.x += x_ofs; + p2.x = p1.x; + + part_draw_dsc.class_p = MY_CLASS; + part_draw_dsc.type = LV_CHART_DRAW_PART_DIV_LINE_VER; + part_draw_dsc.p1 = &p1; + part_draw_dsc.p2 = &p2; + part_draw_dsc.id = i; + + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + lv_draw_line(draw_ctx, &line_dsc, &p1, &p2); + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + } + } + + part_draw_dsc.id = 0xFFFFFFFF; + part_draw_dsc.p1 = NULL; + part_draw_dsc.p2 = NULL; + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + + draw_ctx->clip_area = clip_area_ori; +} + +static void draw_series_line(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx) +{ + lv_area_t clip_area; + if(_lv_area_intersect(&clip_area, &obj->coords, draw_ctx->clip_area) == false) return; + + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + draw_ctx->clip_area = &clip_area; + + lv_chart_t * chart = (lv_chart_t *)obj; + if(chart->point_cnt < 2) return; + + uint16_t i; + lv_point_t p1; + lv_point_t p2; + lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_coord_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; + lv_coord_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width; + lv_coord_t w = ((int32_t)lv_obj_get_content_width(obj) * chart->zoom_x) >> 8; + lv_coord_t h = ((int32_t)lv_obj_get_content_height(obj) * chart->zoom_y) >> 8; + lv_coord_t x_ofs = obj->coords.x1 + pad_left - lv_obj_get_scroll_left(obj); + lv_coord_t y_ofs = obj->coords.y1 + pad_top - lv_obj_get_scroll_top(obj); + lv_chart_series_t * ser; + + lv_area_t series_clip_area; + bool mask_ret = _lv_area_intersect(&series_clip_area, &obj->coords, draw_ctx->clip_area); + if(mask_ret == false) return; + + lv_draw_line_dsc_t line_dsc_default; + lv_draw_line_dsc_init(&line_dsc_default); + lv_obj_init_draw_line_dsc(obj, LV_PART_ITEMS, &line_dsc_default); + + lv_draw_rect_dsc_t point_dsc_default; + lv_draw_rect_dsc_init(&point_dsc_default); + lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &point_dsc_default); + + lv_coord_t point_w = lv_obj_get_style_width(obj, LV_PART_INDICATOR) / 2; + lv_coord_t point_h = lv_obj_get_style_height(obj, LV_PART_INDICATOR) / 2; + + /*Do not bother with line ending is the point will over it*/ + if(LV_MIN(point_w, point_h) > line_dsc_default.width / 2) line_dsc_default.raw_end = 1; + if(line_dsc_default.width == 1) line_dsc_default.raw_end = 1; + + /*If there are at least as much points as pixels then draw only vertical lines*/ + bool crowded_mode = chart->point_cnt >= w ? true : false; + + /*Go through all data lines*/ + _LV_LL_READ_BACK(&chart->series_ll, ser) { + if(ser->hidden) continue; + line_dsc_default.color = ser->color; + point_dsc_default.bg_color = ser->color; + + lv_coord_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; + + p1.x = x_ofs; + p2.x = x_ofs; + + lv_coord_t p_act = start_point; + lv_coord_t p_prev = start_point; + int32_t y_tmp = (int32_t)((int32_t)ser->y_points[p_prev] - chart->ymin[ser->y_axis_sec]) * h; + y_tmp = y_tmp / (chart->ymax[ser->y_axis_sec] - chart->ymin[ser->y_axis_sec]); + p2.y = h - y_tmp + y_ofs; + + lv_obj_draw_part_dsc_t part_draw_dsc; + lv_obj_draw_dsc_init(&part_draw_dsc, draw_ctx); + part_draw_dsc.class_p = MY_CLASS; + part_draw_dsc.type = LV_CHART_DRAW_PART_LINE_AND_POINT; + part_draw_dsc.part = LV_PART_ITEMS; + part_draw_dsc.line_dsc = &line_dsc_default; + part_draw_dsc.rect_dsc = &point_dsc_default; + part_draw_dsc.sub_part_ptr = ser; + + lv_coord_t y_min = p2.y; + lv_coord_t y_max = p2.y; + + for(i = 0; i < chart->point_cnt; i++) { + p1.x = p2.x; + p1.y = p2.y; + + if(p1.x > clip_area_ori->x2 + point_w + 1) break; + p2.x = ((w * i) / (chart->point_cnt - 1)) + x_ofs; + + p_act = (start_point + i) % chart->point_cnt; + + y_tmp = (int32_t)((int32_t)ser->y_points[p_act] - chart->ymin[ser->y_axis_sec]) * h; + y_tmp = y_tmp / (chart->ymax[ser->y_axis_sec] - chart->ymin[ser->y_axis_sec]); + p2.y = h - y_tmp + y_ofs; + + if(p2.x < clip_area_ori->x1 - point_w - 1) { + p_prev = p_act; + continue; + } + + /*Don't draw the first point. A second point is also required to draw the line*/ + if(i != 0) { + if(crowded_mode) { + if(ser->y_points[p_prev] != LV_CHART_POINT_NONE && ser->y_points[p_act] != LV_CHART_POINT_NONE) { + /*Draw only one vertical line between the min and max y-values on the same x-value*/ + y_max = LV_MAX(y_max, p2.y); + y_min = LV_MIN(y_min, p2.y); + if(p1.x != p2.x) { + lv_coord_t y_cur = p2.y; + p2.x--; /*It's already on the next x value*/ + p1.x = p2.x; + p1.y = y_min; + p2.y = y_max; + if(p1.y == p2.y) p2.y++; /*If they are the same no line will be drawn*/ + lv_draw_line(draw_ctx, &line_dsc_default, &p1, &p2); + p2.x++; /*Compensate the previous x--*/ + y_min = y_cur; /*Start the line of the next x from the current last y*/ + y_max = y_cur; + } + } + } + else { + lv_area_t point_area; + point_area.x1 = p1.x - point_w; + point_area.x2 = p1.x + point_w; + point_area.y1 = p1.y - point_h; + point_area.y2 = p1.y + point_h; + + part_draw_dsc.id = i - 1; + part_draw_dsc.p1 = ser->y_points[p_prev] != LV_CHART_POINT_NONE ? &p1 : NULL; + part_draw_dsc.p2 = ser->y_points[p_act] != LV_CHART_POINT_NONE ? &p2 : NULL; + part_draw_dsc.draw_area = &point_area; + part_draw_dsc.value = ser->y_points[p_prev]; + + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + + if(ser->y_points[p_prev] != LV_CHART_POINT_NONE && ser->y_points[p_act] != LV_CHART_POINT_NONE) { + lv_draw_line(draw_ctx, &line_dsc_default, &p1, &p2); + } + + if(point_w && point_h && ser->y_points[p_prev] != LV_CHART_POINT_NONE) { + lv_draw_rect(draw_ctx, &point_dsc_default, &point_area); + } + + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + } + + } + p_prev = p_act; + } + + /*Draw the last point*/ + if(!crowded_mode && i == chart->point_cnt) { + + if(ser->y_points[p_act] != LV_CHART_POINT_NONE) { + lv_area_t point_area; + point_area.x1 = p2.x - point_w; + point_area.x2 = p2.x + point_w; + point_area.y1 = p2.y - point_h; + point_area.y2 = p2.y + point_h; + + part_draw_dsc.id = i - 1; + part_draw_dsc.p1 = NULL; + part_draw_dsc.p2 = NULL; + part_draw_dsc.draw_area = &point_area; + part_draw_dsc.value = ser->y_points[p_act]; + + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + lv_draw_rect(draw_ctx, &point_dsc_default, &point_area); + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + } + } + } + + draw_ctx->clip_area = clip_area_ori; +} + +static void draw_series_scatter(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx) +{ + + lv_area_t clip_area; + if(_lv_area_intersect(&clip_area, &obj->coords, draw_ctx->clip_area) == false) return; + + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + draw_ctx->clip_area = &clip_area; + + lv_chart_t * chart = (lv_chart_t *)obj; + + uint16_t i; + lv_point_t p1; + lv_point_t p2; + lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_coord_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + lv_coord_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + lv_coord_t w = ((int32_t)lv_obj_get_content_width(obj) * chart->zoom_x) >> 8; + lv_coord_t h = ((int32_t)lv_obj_get_content_height(obj) * chart->zoom_y) >> 8; + lv_coord_t x_ofs = obj->coords.x1 + pad_left + border_width - lv_obj_get_scroll_left(obj); + lv_coord_t y_ofs = obj->coords.y1 + pad_top + border_width - lv_obj_get_scroll_top(obj); + lv_chart_series_t * ser; + + lv_draw_line_dsc_t line_dsc_default; + lv_draw_line_dsc_init(&line_dsc_default); + lv_obj_init_draw_line_dsc(obj, LV_PART_ITEMS, &line_dsc_default); + + lv_draw_rect_dsc_t point_dsc_default; + lv_draw_rect_dsc_init(&point_dsc_default); + lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &point_dsc_default); + + lv_coord_t point_w = lv_obj_get_style_width(obj, LV_PART_INDICATOR) / 2; + lv_coord_t point_h = lv_obj_get_style_height(obj, LV_PART_INDICATOR) / 2; + + /*Do not bother with line ending is the point will over it*/ + if(LV_MIN(point_w, point_h) > line_dsc_default.width / 2) line_dsc_default.raw_end = 1; + if(line_dsc_default.width == 1) line_dsc_default.raw_end = 1; + + /*Go through all data lines*/ + _LV_LL_READ_BACK(&chart->series_ll, ser) { + if(ser->hidden) continue; + line_dsc_default.color = ser->color; + point_dsc_default.bg_color = ser->color; + + lv_coord_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; + + p1.x = x_ofs; + p2.x = x_ofs; + + lv_coord_t p_act = start_point; + lv_coord_t p_prev = start_point; + if(ser->y_points[p_act] != LV_CHART_POINT_CNT_DEF) { + p2.x = lv_map(ser->x_points[p_act], chart->xmin[ser->x_axis_sec], chart->xmax[ser->x_axis_sec], 0, w); + p2.x += x_ofs; + + p2.y = lv_map(ser->y_points[p_act], chart->ymin[ser->y_axis_sec], chart->ymax[ser->y_axis_sec], 0, h); + p2.y = h - p2.y; + p2.y += y_ofs; + } + else { + p2.x = LV_COORD_MIN; + p2.y = LV_COORD_MIN; + } + + lv_obj_draw_part_dsc_t part_draw_dsc; + lv_obj_draw_dsc_init(&part_draw_dsc, draw_ctx); + part_draw_dsc.part = LV_PART_ITEMS; + part_draw_dsc.class_p = MY_CLASS; + part_draw_dsc.type = LV_CHART_DRAW_PART_LINE_AND_POINT; + part_draw_dsc.line_dsc = &line_dsc_default; + part_draw_dsc.rect_dsc = &point_dsc_default; + part_draw_dsc.sub_part_ptr = ser; + + for(i = 0; i < chart->point_cnt; i++) { + p1.x = p2.x; + p1.y = p2.y; + + p_act = (start_point + i) % chart->point_cnt; + if(ser->y_points[p_act] != LV_CHART_POINT_NONE) { + p2.y = lv_map(ser->y_points[p_act], chart->ymin[ser->y_axis_sec], chart->ymax[ser->y_axis_sec], 0, h); + p2.y = h - p2.y; + p2.y += y_ofs; + + p2.x = lv_map(ser->x_points[p_act], chart->xmin[ser->x_axis_sec], chart->xmax[ser->x_axis_sec], 0, w); + p2.x += x_ofs; + } + else { + p_prev = p_act; + continue; + } + + /*Don't draw the first point. A second point is also required to draw the line*/ + if(i != 0) { + lv_area_t point_area; + point_area.x1 = p1.x - point_w; + point_area.x2 = p1.x + point_w; + point_area.y1 = p1.y - point_h; + point_area.y2 = p1.y + point_h; + + part_draw_dsc.id = i - 1; + part_draw_dsc.p1 = ser->y_points[p_prev] != LV_CHART_POINT_NONE ? &p1 : NULL; + part_draw_dsc.p2 = ser->y_points[p_act] != LV_CHART_POINT_NONE ? &p2 : NULL; + part_draw_dsc.draw_area = &point_area; + part_draw_dsc.value = ser->y_points[p_prev]; + + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + + if(ser->y_points[p_prev] != LV_CHART_POINT_NONE && ser->y_points[p_act] != LV_CHART_POINT_NONE) { + lv_draw_line(draw_ctx, &line_dsc_default, &p1, &p2); + if(point_w && point_h) { + lv_draw_rect(draw_ctx, &point_dsc_default, &point_area); + } + } + + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + } + p_prev = p_act; + } + + /*Draw the last point*/ + if(i == chart->point_cnt) { + + if(ser->y_points[p_act] != LV_CHART_POINT_NONE) { + lv_area_t point_area; + point_area.x1 = p2.x - point_w; + point_area.x2 = p2.x + point_w; + point_area.y1 = p2.y - point_h; + point_area.y2 = p2.y + point_h; + + part_draw_dsc.id = i - 1; + part_draw_dsc.p1 = NULL; + part_draw_dsc.p2 = NULL; + part_draw_dsc.draw_area = &point_area; + part_draw_dsc.value = ser->y_points[p_act]; + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + lv_draw_rect(draw_ctx, &point_dsc_default, &point_area); + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + } + } + } + draw_ctx->clip_area = clip_area_ori; +} + +static void draw_series_bar(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx) +{ + lv_area_t clip_area; + if(_lv_area_intersect(&clip_area, &obj->coords, draw_ctx->clip_area) == false) return; + + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + draw_ctx->clip_area = &clip_area; + + + lv_chart_t * chart = (lv_chart_t *)obj; + + uint16_t i; + lv_area_t col_a; + lv_coord_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + lv_coord_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + lv_coord_t w = ((int32_t)lv_obj_get_content_width(obj) * chart->zoom_x) >> 8; + lv_coord_t h = ((int32_t)lv_obj_get_content_height(obj) * chart->zoom_y) >> 8; + int32_t y_tmp; + lv_chart_series_t * ser; + uint32_t ser_cnt = _lv_ll_get_len(&chart->series_ll); + int32_t block_gap = ((int32_t)lv_obj_get_style_pad_column(obj, + LV_PART_MAIN) * chart->zoom_x) >> 8; /*Gap between the column on ~adjacent X*/ + lv_coord_t block_w = (w - ((chart->point_cnt - 1) * block_gap)) / chart->point_cnt; + int32_t ser_gap = ((int32_t)lv_obj_get_style_pad_column(obj, + LV_PART_ITEMS) * chart->zoom_x) >> 8; /*Gap between the columns on the ~same X*/ + lv_coord_t col_w = (block_w - (ser_cnt - 1) * ser_gap) / ser_cnt; + + lv_coord_t border_w = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_coord_t x_ofs = pad_left - lv_obj_get_scroll_left(obj) + border_w; + lv_coord_t y_ofs = pad_top - lv_obj_get_scroll_top(obj) + border_w; + + lv_draw_rect_dsc_t col_dsc; + lv_draw_rect_dsc_init(&col_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_ITEMS, &col_dsc); + col_dsc.bg_grad.dir = LV_GRAD_DIR_NONE; + col_dsc.bg_opa = LV_OPA_COVER; + + /*Make the cols longer with `radius` to clip the rounding from the bottom*/ + col_a.y2 = obj->coords.y2 + col_dsc.radius; + + lv_obj_draw_part_dsc_t part_draw_dsc; + lv_obj_draw_dsc_init(&part_draw_dsc, draw_ctx); + part_draw_dsc.part = LV_PART_ITEMS; + part_draw_dsc.class_p = MY_CLASS; + part_draw_dsc.type = LV_CHART_DRAW_PART_BAR; + + /*Go through all points*/ + for(i = 0; i < chart->point_cnt; i++) { + lv_coord_t x_act = (int32_t)((int32_t)(w - block_w) * i) / (chart->point_cnt - 1) + obj->coords.x1 + x_ofs; + + part_draw_dsc.id = i; + + /*Draw the current point of all data line*/ + _LV_LL_READ_BACK(&chart->series_ll, ser) { + if(ser->hidden) continue; + lv_coord_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; + + col_a.x1 = x_act; + col_a.x2 = col_a.x1 + col_w - 1; + x_act += col_w + ser_gap; + + if(col_a.x2 < clip_area.x1) continue; + if(col_a.x1 > clip_area.x2) break; + + col_dsc.bg_color = ser->color; + + lv_coord_t p_act = (start_point + i) % chart->point_cnt; + y_tmp = (int32_t)((int32_t)ser->y_points[p_act] - chart->ymin[ser->y_axis_sec]) * h; + y_tmp = y_tmp / (chart->ymax[ser->y_axis_sec] - chart->ymin[ser->y_axis_sec]); + col_a.y1 = h - y_tmp + obj->coords.y1 + y_ofs; + + if(ser->y_points[p_act] != LV_CHART_POINT_NONE) { + part_draw_dsc.draw_area = &col_a; + part_draw_dsc.rect_dsc = &col_dsc; + part_draw_dsc.sub_part_ptr = ser; + part_draw_dsc.value = ser->y_points[p_act]; + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + lv_draw_rect(draw_ctx, &col_dsc, &col_a); + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + } + } + } + draw_ctx->clip_area = clip_area_ori; +} + +static void draw_cursors(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(_lv_ll_is_empty(&chart->cursor_ll)) return; + + lv_area_t clip_area; + if(!_lv_area_intersect(&clip_area, draw_ctx->clip_area, &obj->coords)) return; + + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + draw_ctx->clip_area = &clip_area; + + lv_point_t p1; + lv_point_t p2; + lv_chart_cursor_t * cursor; + + lv_draw_line_dsc_t line_dsc_ori; + lv_draw_line_dsc_init(&line_dsc_ori); + lv_obj_init_draw_line_dsc(obj, LV_PART_CURSOR, &line_dsc_ori); + + lv_draw_rect_dsc_t point_dsc_ori; + lv_draw_rect_dsc_init(&point_dsc_ori); + point_dsc_ori.bg_opa = line_dsc_ori.opa; + point_dsc_ori.radius = LV_RADIUS_CIRCLE; + + lv_draw_line_dsc_t line_dsc_tmp; + lv_draw_rect_dsc_t point_dsc_tmp; + + lv_coord_t point_w = lv_obj_get_style_width(obj, LV_PART_CURSOR) / 2; + lv_coord_t point_h = lv_obj_get_style_width(obj, LV_PART_CURSOR) / 2; + + lv_obj_draw_part_dsc_t part_draw_dsc; + lv_obj_draw_dsc_init(&part_draw_dsc, draw_ctx); + part_draw_dsc.line_dsc = &line_dsc_tmp; + part_draw_dsc.rect_dsc = &point_dsc_tmp; + part_draw_dsc.part = LV_PART_CURSOR; + part_draw_dsc.class_p = MY_CLASS; + part_draw_dsc.type = LV_CHART_DRAW_PART_CURSOR; + + /*Go through all cursor lines*/ + _LV_LL_READ_BACK(&chart->cursor_ll, cursor) { + lv_memcpy(&line_dsc_tmp, &line_dsc_ori, sizeof(lv_draw_line_dsc_t)); + lv_memcpy(&point_dsc_tmp, &point_dsc_ori, sizeof(lv_draw_rect_dsc_t)); + line_dsc_tmp.color = cursor->color; + point_dsc_tmp.bg_color = cursor->color; + + part_draw_dsc.p1 = &p1; + part_draw_dsc.p2 = &p2; + + lv_coord_t cx; + lv_coord_t cy; + if(cursor->pos_set) { + cx = cursor->pos.x; + cy = cursor->pos.y; + } + else { + if(cursor->point_id == LV_CHART_POINT_NONE) continue; + lv_point_t p; + lv_chart_get_point_pos_by_id(obj, cursor->ser, cursor->point_id, &p); + cx = p.x; + cy = p.y; + } + + cx += obj->coords.x1; + cy += obj->coords.y1; + + lv_area_t point_area; + bool draw_point = point_w && point_h; + if(draw_point) { + point_area.x1 = cx - point_w; + point_area.x2 = cx + point_w; + point_area.y1 = cy - point_h; + point_area.y2 = cy + point_h; + + part_draw_dsc.draw_area = &point_area; + } + else { + part_draw_dsc.draw_area = NULL; + } + + if(cursor->dir & LV_DIR_HOR) { + p1.x = cursor->dir & LV_DIR_LEFT ? obj->coords.x1 : cx; + p1.y = cy; + p2.x = cursor->dir & LV_DIR_RIGHT ? obj->coords.x2 : cx; + p2.y = p1.y; + + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + lv_draw_line(draw_ctx, &line_dsc_tmp, &p1, &p2); + + if(draw_point) { + lv_draw_rect(draw_ctx, &point_dsc_tmp, &point_area); + } + + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + } + + if(cursor->dir & LV_DIR_VER) { + p1.x = cx; + p1.y = cursor->dir & LV_DIR_TOP ? obj->coords.y1 : cy; + p2.x = p1.x; + p2.y = cursor->dir & LV_DIR_BOTTOM ? obj->coords.y2 : cy; + + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + lv_draw_line(draw_ctx, &line_dsc_tmp, &p1, &p2); + + if(draw_point) { + lv_draw_rect(draw_ctx, &point_dsc_tmp, &point_area); + } + + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + } + } + + draw_ctx->clip_area = clip_area_ori; +} + +static void draw_y_ticks(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, lv_chart_axis_t axis) +{ + lv_chart_t * chart = (lv_chart_t *)obj; + + lv_chart_tick_dsc_t * t = get_tick_gsc(obj, axis); + + if(t->major_cnt <= 1) return; + if(!t->label_en && !t->major_len && !t->minor_len) return; + + uint8_t sec_axis = axis == LV_CHART_AXIS_PRIMARY_Y ? 0 : 1; + + uint32_t i; + + lv_point_t p1; + lv_point_t p2; + + lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_coord_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + lv_coord_t h = ((int32_t)lv_obj_get_content_height(obj) * chart->zoom_y) >> 8; + lv_coord_t y_ofs = obj->coords.y1 + pad_top + border_width - lv_obj_get_scroll_top(obj); + + lv_coord_t label_gap; + lv_coord_t x_ofs; + if(axis == LV_CHART_AXIS_PRIMARY_Y) { + label_gap = lv_obj_get_style_pad_left(obj, LV_PART_TICKS); + x_ofs = obj->coords.x1; + } + else { + label_gap = lv_obj_get_style_pad_right(obj, LV_PART_TICKS); + x_ofs = obj->coords.x2; + } + + lv_coord_t major_len = t->major_len; + lv_coord_t minor_len = t->minor_len; + /*tick lines on secondary y axis are drawn in other direction*/ + if(axis == LV_CHART_AXIS_SECONDARY_Y) { + major_len *= -1; + minor_len *= -1; + } + + lv_draw_line_dsc_t line_dsc; + lv_draw_line_dsc_init(&line_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_TICKS, &line_dsc); + + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + lv_obj_init_draw_label_dsc(obj, LV_PART_TICKS, &label_dsc); + + lv_obj_draw_part_dsc_t part_draw_dsc; + lv_obj_draw_dsc_init(&part_draw_dsc, draw_ctx); + part_draw_dsc.class_p = MY_CLASS; + part_draw_dsc.type = LV_CHART_DRAW_PART_TICK_LABEL; + part_draw_dsc.id = axis; + part_draw_dsc.part = LV_PART_TICKS; + part_draw_dsc.line_dsc = &line_dsc; + part_draw_dsc.label_dsc = &label_dsc; + + uint32_t total_tick_num = (t->major_cnt - 1) * (t->minor_cnt); + for(i = 0; i <= total_tick_num; i++) { + /*draw a line at moving y position*/ + p2.y = p1.y = y_ofs + (int32_t)((int32_t)(h - line_dsc.width) * i) / total_tick_num; + + /*first point of the tick*/ + p1.x = x_ofs; + + /*move extra pixel out of chart boundary*/ + if(axis == LV_CHART_AXIS_PRIMARY_Y) p1.x--; + else p1.x++; + + /*second point of the tick*/ + bool major = false; + if(i % t->minor_cnt == 0) major = true; + + if(major) p2.x = p1.x - major_len; /*major tick*/ + else p2.x = p1.x - minor_len; /*minor tick*/ + + part_draw_dsc.p1 = &p1; + part_draw_dsc.p2 = &p2; + + int32_t tick_value = lv_map(total_tick_num - i, 0, total_tick_num, chart->ymin[sec_axis], chart->ymax[sec_axis]); + part_draw_dsc.value = tick_value; + + /*add text only to major tick*/ + if(major && t->label_en) { + char buf[LV_CHART_LABEL_MAX_TEXT_LENGTH]; + lv_snprintf(buf, sizeof(buf), "%" LV_PRId32, tick_value); + part_draw_dsc.label_dsc = &label_dsc; + part_draw_dsc.text = buf; + part_draw_dsc.text_length = LV_CHART_LABEL_MAX_TEXT_LENGTH; + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + + /*reserve appropriate area*/ + lv_point_t size; + lv_txt_get_size(&size, part_draw_dsc.text, label_dsc.font, label_dsc.letter_space, label_dsc.line_space, LV_COORD_MAX, + LV_TEXT_FLAG_NONE); + + /*set the area at some distance of the major tick len left of the tick*/ + lv_area_t a; + a.y1 = p2.y - size.y / 2; + a.y2 = p2.y + size.y / 2; + + if(!sec_axis) { + a.x1 = p2.x - size.x - label_gap; + a.x2 = p2.x - label_gap; + } + else { + a.x1 = p2.x + label_gap; + a.x2 = p2.x + size.x + label_gap; + } + + if(a.y2 >= obj->coords.y1 && + a.y1 <= obj->coords.y2) { + lv_draw_label(draw_ctx, &label_dsc, &a, part_draw_dsc.text, NULL); + } + } + else { + part_draw_dsc.label_dsc = NULL; + part_draw_dsc.text = NULL; + part_draw_dsc.text_length = 0; + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + } + + if(p1.y + line_dsc.width / 2 >= obj->coords.y1 && + p2.y - line_dsc.width / 2 <= obj->coords.y2) { + lv_draw_line(draw_ctx, &line_dsc, &p1, &p2); + } + + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + } +} + +static void draw_x_ticks(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, lv_chart_axis_t axis) +{ + lv_chart_t * chart = (lv_chart_t *)obj; + + lv_chart_tick_dsc_t * t = get_tick_gsc(obj, axis); + if(t->major_cnt <= 1) return; + if(!t->label_en && !t->major_len && !t->minor_len) return; + + uint32_t i; + lv_point_t p1; + lv_point_t p2; + + lv_coord_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_coord_t w = ((int32_t)lv_obj_get_content_width(obj) * chart->zoom_x) >> 8; + + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + lv_obj_init_draw_label_dsc(obj, LV_PART_TICKS, &label_dsc); + + lv_coord_t x_ofs = obj->coords.x1 + pad_left - lv_obj_get_scroll_left(obj); + lv_coord_t y_ofs; + lv_coord_t label_gap; + if(axis == LV_CHART_AXIS_PRIMARY_X) { + label_gap = t->label_en ? lv_obj_get_style_pad_bottom(obj, LV_PART_TICKS) : 0; + y_ofs = obj->coords.y2; + } + else { + label_gap = t->label_en ? lv_obj_get_style_pad_top(obj, LV_PART_TICKS) : 0; + y_ofs = obj->coords.y1; + } + + if(axis == LV_CHART_AXIS_PRIMARY_X) { + if(y_ofs > draw_ctx->clip_area->y2) return; + if(y_ofs + label_gap + label_dsc.font->line_height + t->major_len < draw_ctx->clip_area->y1) return; + } + + lv_draw_line_dsc_t line_dsc; + lv_draw_line_dsc_init(&line_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_TICKS, &line_dsc); + line_dsc.dash_gap = 0; + line_dsc.dash_width = 0; + + lv_obj_draw_part_dsc_t part_draw_dsc; + lv_obj_draw_dsc_init(&part_draw_dsc, draw_ctx); + part_draw_dsc.class_p = MY_CLASS; + part_draw_dsc.type = LV_CHART_DRAW_PART_TICK_LABEL; + part_draw_dsc.id = LV_CHART_AXIS_PRIMARY_X; + part_draw_dsc.part = LV_PART_TICKS; + part_draw_dsc.label_dsc = &label_dsc; + part_draw_dsc.line_dsc = &line_dsc; + + uint8_t sec_axis = axis == LV_CHART_AXIS_PRIMARY_X ? 0 : 1; + + /*The columns ticks should be aligned to the center of blocks*/ + if(chart->type == LV_CHART_TYPE_BAR) { + int32_t block_gap = ((int32_t)lv_obj_get_style_pad_column(obj, + LV_PART_MAIN) * chart->zoom_x) >> 8; /*Gap between the columns on ~adjacent X*/ + lv_coord_t block_w = (w + block_gap) / (chart->point_cnt); + + x_ofs += (block_w - block_gap) / 2; + w -= block_w - block_gap; + } + + p1.y = y_ofs; + uint32_t total_tick_num = (t->major_cnt - 1) * t->minor_cnt; + for(i = 0; i <= total_tick_num; i++) { /*one extra loop - it may not exist in the list, empty label*/ + bool major = false; + if(i % t->minor_cnt == 0) major = true; + + /*draw a line at moving x position*/ + p2.x = p1.x = x_ofs + (int32_t)((int32_t)(w - line_dsc.width) * i) / total_tick_num; + + if(sec_axis) p2.y = p1.y - (major ? t->major_len : t->minor_len); + else p2.y = p1.y + (major ? t->major_len : t->minor_len); + + part_draw_dsc.p1 = &p1; + part_draw_dsc.p2 = &p2; + + /*add text only to major tick*/ + int32_t tick_value; + if(chart->type == LV_CHART_TYPE_SCATTER) { + tick_value = lv_map(i, 0, total_tick_num, chart->xmin[sec_axis], chart->xmax[sec_axis]); + } + else { + tick_value = i / t->minor_cnt; + } + part_draw_dsc.value = tick_value; + + if(major && t->label_en) { + char buf[LV_CHART_LABEL_MAX_TEXT_LENGTH]; + lv_snprintf(buf, sizeof(buf), "%" LV_PRId32, tick_value); + part_draw_dsc.label_dsc = &label_dsc; + part_draw_dsc.text = buf; + part_draw_dsc.text_length = LV_CHART_LABEL_MAX_TEXT_LENGTH; + + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + + /*reserve appropriate area*/ + lv_point_t size; + lv_txt_get_size(&size, part_draw_dsc.text, label_dsc.font, label_dsc.letter_space, label_dsc.line_space, LV_COORD_MAX, + LV_TEXT_FLAG_NONE); + + /*set the area at some distance of the major tick len under of the tick*/ + lv_area_t a; + a.x1 = (p2.x - size.x / 2); + a.x2 = (p2.x + size.x / 2); + if(sec_axis) { + a.y2 = p2.y - label_gap; + a.y1 = a.y2 - size.y; + } + else { + a.y1 = p2.y + label_gap; + a.y2 = a.y1 + size.y; + } + + if(a.x2 >= obj->coords.x1 && + a.x1 <= obj->coords.x2) { + lv_draw_label(draw_ctx, &label_dsc, &a, part_draw_dsc.text, NULL); + } + } + else { + part_draw_dsc.label_dsc = NULL; + part_draw_dsc.text = NULL; + part_draw_dsc.text_length = 0; + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + } + + + if(p1.x + line_dsc.width / 2 >= obj->coords.x1 && + p2.x - line_dsc.width / 2 <= obj->coords.x2) { + lv_draw_line(draw_ctx, &line_dsc, &p1, &p2); + } + + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + } +} + +static void draw_axes(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx) +{ + draw_y_ticks(obj, draw_ctx, LV_CHART_AXIS_PRIMARY_Y); + draw_y_ticks(obj, draw_ctx, LV_CHART_AXIS_SECONDARY_Y); + draw_x_ticks(obj, draw_ctx, LV_CHART_AXIS_PRIMARY_X); + draw_x_ticks(obj, draw_ctx, LV_CHART_AXIS_SECONDARY_X); +} + +/** + * Get the nearest index to an X coordinate + * @param chart pointer to a chart object + * @param coord the coordination of the point relative to the series area. + * @return the found index + */ +static uint32_t get_index_from_x(lv_obj_t * obj, lv_coord_t x) +{ + lv_chart_t * chart = (lv_chart_t *)obj; + lv_coord_t w = ((int32_t)lv_obj_get_content_width(obj) * chart->zoom_x) >> 8; + lv_coord_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + x -= pad_left; + + if(x < 0) return 0; + if(x > w) return chart->point_cnt - 1; + if(chart->type == LV_CHART_TYPE_LINE) return (x * (chart->point_cnt - 1) + w / 2) / w; + if(chart->type == LV_CHART_TYPE_BAR) return (x * chart->point_cnt) / w; + + return 0; +} + +static void invalidate_point(lv_obj_t * obj, uint16_t i) +{ + lv_chart_t * chart = (lv_chart_t *)obj; + if(i >= chart->point_cnt) return; + + lv_coord_t w = ((int32_t)lv_obj_get_content_width(obj) * chart->zoom_x) >> 8; + lv_coord_t scroll_left = lv_obj_get_scroll_left(obj); + + /*In shift mode the whole chart changes so the whole object*/ + if(chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT) { + lv_obj_invalidate(obj); + return; + } + + if(chart->type == LV_CHART_TYPE_LINE) { + lv_coord_t bwidth = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_coord_t pleft = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + lv_coord_t x_ofs = obj->coords.x1 + pleft + bwidth - scroll_left; + lv_coord_t line_width = lv_obj_get_style_line_width(obj, LV_PART_ITEMS); + lv_coord_t point_w = lv_obj_get_style_width(obj, LV_PART_INDICATOR); + + lv_area_t coords; + lv_area_copy(&coords, &obj->coords); + coords.y1 -= line_width + point_w; + coords.y2 += line_width + point_w; + + if(i < chart->point_cnt - 1) { + coords.x1 = ((w * i) / (chart->point_cnt - 1)) + x_ofs - line_width - point_w; + coords.x2 = ((w * (i + 1)) / (chart->point_cnt - 1)) + x_ofs + line_width + point_w; + lv_obj_invalidate_area(obj, &coords); + } + + if(i > 0) { + coords.x1 = ((w * (i - 1)) / (chart->point_cnt - 1)) + x_ofs - line_width - point_w; + coords.x2 = ((w * i) / (chart->point_cnt - 1)) + x_ofs + line_width + point_w; + lv_obj_invalidate_area(obj, &coords); + } + } + else if(chart->type == LV_CHART_TYPE_BAR) { + lv_area_t col_a; + int32_t block_gap = ((int32_t)lv_obj_get_style_pad_column(obj, + LV_PART_MAIN) * chart->zoom_x) >> 8; /*Gap between the column on ~adjacent X*/ + + lv_coord_t block_w = (w + block_gap) / chart->point_cnt; + + lv_coord_t bwidth = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_coord_t x_act; + x_act = (int32_t)((int32_t)(block_w) * i) ; + x_act += obj->coords.x1 + bwidth + lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + + lv_obj_get_coords(obj, &col_a); + col_a.x1 = x_act - scroll_left; + col_a.x2 = col_a.x1 + block_w; + col_a.x1 -= block_gap; + + lv_obj_invalidate_area(obj, &col_a); + } + else { + lv_obj_invalidate(obj); + } +} + +static void new_points_alloc(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t cnt, lv_coord_t ** a) +{ + if((*a) == NULL) return; + + lv_chart_t * chart = (lv_chart_t *) obj; + uint32_t point_cnt_old = chart->point_cnt; + uint32_t i; + + if(ser->start_point != 0) { + lv_coord_t * new_points = lv_mem_alloc(sizeof(lv_coord_t) * cnt); + LV_ASSERT_MALLOC(new_points); + if(new_points == NULL) return; + + if(cnt >= point_cnt_old) { + for(i = 0; i < point_cnt_old; i++) { + new_points[i] = + (*a)[(i + ser->start_point) % point_cnt_old]; /*Copy old contents to new array*/ + } + for(i = point_cnt_old; i < cnt; i++) { + new_points[i] = LV_CHART_POINT_NONE; /*Fill up the rest with default value*/ + } + } + else { + for(i = 0; i < cnt; i++) { + new_points[i] = + (*a)[(i + ser->start_point) % point_cnt_old]; /*Copy old contents to new array*/ + } + } + + /*Switch over pointer from old to new*/ + lv_mem_free((*a)); + (*a) = new_points; + } + else { + (*a) = lv_mem_realloc((*a), sizeof(lv_coord_t) * cnt); + LV_ASSERT_MALLOC((*a)); + if((*a) == NULL) return; + /*Initialize the new points*/ + if(cnt > point_cnt_old) { + for(i = point_cnt_old - 1; i < cnt; i++) { + (*a)[i] = LV_CHART_POINT_NONE; + } + } + } +} + +lv_chart_tick_dsc_t * get_tick_gsc(lv_obj_t * obj, lv_chart_axis_t axis) +{ + lv_chart_t * chart = (lv_chart_t *) obj; + switch(axis) { + case LV_CHART_AXIS_PRIMARY_Y: + return &chart->tick[0]; + case LV_CHART_AXIS_PRIMARY_X: + return &chart->tick[1]; + case LV_CHART_AXIS_SECONDARY_Y: + return &chart->tick[2]; + case LV_CHART_AXIS_SECONDARY_X: + return &chart->tick[3]; + default: + return NULL; + } +} + + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/chart/lv_chart.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/chart/lv_chart.h new file mode 100644 index 0000000..394c0e7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/chart/lv_chart.h @@ -0,0 +1,460 @@ +/** + * @file lv_chart.h + * + */ + +#ifndef LV_CHART_H +#define LV_CHART_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_CHART != 0 + +/********************* + * DEFINES + *********************/ + +/**Default value of points. Can be used to not draw a point*/ +#if LV_USE_LARGE_COORD +#define LV_CHART_POINT_NONE (INT32_MAX) +#else +#define LV_CHART_POINT_NONE (INT16_MAX) +#endif +LV_EXPORT_CONST_INT(LV_CHART_POINT_NONE); + +/********************** + * TYPEDEFS + **********************/ + +/** + * Chart types + */ +enum { + LV_CHART_TYPE_NONE, /**< Don't draw the series*/ + LV_CHART_TYPE_LINE, /**< Connect the points with lines*/ + LV_CHART_TYPE_BAR, /**< Draw columns*/ + LV_CHART_TYPE_SCATTER, /**< Draw points and lines in 2D (x,y coordinates)*/ +}; +typedef uint8_t lv_chart_type_t; + +/** + * Chart update mode for `lv_chart_set_next` + */ +enum { + LV_CHART_UPDATE_MODE_SHIFT, /**< Shift old data to the left and add the new one the right*/ + LV_CHART_UPDATE_MODE_CIRCULAR, /**< Add the new data in a circular way*/ +}; +typedef uint8_t lv_chart_update_mode_t; + +/** + * Enumeration of the axis' + */ +enum { + LV_CHART_AXIS_PRIMARY_Y = 0x00, + LV_CHART_AXIS_SECONDARY_Y = 0x01, + LV_CHART_AXIS_PRIMARY_X = 0x02, + LV_CHART_AXIS_SECONDARY_X = 0x04, + _LV_CHART_AXIS_LAST +}; +typedef uint8_t lv_chart_axis_t; + +/** + * Descriptor a chart series + */ +typedef struct { + lv_coord_t * x_points; + lv_coord_t * y_points; + lv_color_t color; + uint16_t start_point; + uint8_t hidden : 1; + uint8_t x_ext_buf_assigned : 1; + uint8_t y_ext_buf_assigned : 1; + uint8_t x_axis_sec : 1; + uint8_t y_axis_sec : 1; +} lv_chart_series_t; + +typedef struct { + lv_point_t pos; + lv_coord_t point_id; + lv_color_t color; + lv_chart_series_t * ser; + lv_dir_t dir; + uint8_t pos_set: 1; /*1: pos is set; 0: point_id is set*/ +} lv_chart_cursor_t; + +typedef struct { + lv_coord_t major_len; + lv_coord_t minor_len; + lv_coord_t draw_size; + uint32_t minor_cnt : 15; + uint32_t major_cnt : 15; + uint32_t label_en : 1; +} lv_chart_tick_dsc_t; + + +typedef struct { + lv_obj_t obj; + lv_ll_t series_ll; /**< Linked list for the series (stores lv_chart_series_t)*/ + lv_ll_t cursor_ll; /**< Linked list for the cursors (stores lv_chart_cursor_t)*/ + lv_chart_tick_dsc_t tick[4]; + lv_coord_t ymin[2]; + lv_coord_t ymax[2]; + lv_coord_t xmin[2]; + lv_coord_t xmax[2]; + lv_coord_t pressed_point_id; + uint16_t hdiv_cnt; /**< Number of horizontal division lines*/ + uint16_t vdiv_cnt; /**< Number of vertical division lines*/ + uint16_t point_cnt; /**< Point number in a data line*/ + uint16_t zoom_x; + uint16_t zoom_y; + lv_chart_type_t type : 3; /**< Line or column chart*/ + lv_chart_update_mode_t update_mode : 1; +} lv_chart_t; + +extern const lv_obj_class_t lv_chart_class; + +/** + * `type` field in `lv_obj_draw_part_dsc_t` if `class_p = lv_chart_class` + * Used in `LV_EVENT_DRAW_PART_BEGIN` and `LV_EVENT_DRAW_PART_END` + */ +typedef enum { + LV_CHART_DRAW_PART_DIV_LINE_INIT, /**< Used before/after drawn the div lines*/ + LV_CHART_DRAW_PART_DIV_LINE_HOR, /**< Used for each horizontal division lines*/ + LV_CHART_DRAW_PART_DIV_LINE_VER, /**< Used for each vertical division lines*/ + LV_CHART_DRAW_PART_LINE_AND_POINT, /**< Used on line and scatter charts for lines and points*/ + LV_CHART_DRAW_PART_BAR, /**< Used on bar charts for the rectangles*/ + LV_CHART_DRAW_PART_CURSOR, /**< Used on cursor lines and points*/ + LV_CHART_DRAW_PART_TICK_LABEL, /**< Used on tick lines and labels*/ +} lv_chart_draw_part_type_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a chart object + * @param parent pointer to an object, it will be the parent of the new chart + * @return pointer to the created chart + */ +lv_obj_t * lv_chart_create(lv_obj_t * parent); + +/** + * Set a new type for a chart + * @param obj pointer to a chart object + * @param type new type of the chart (from 'lv_chart_type_t' enum) + */ +void lv_chart_set_type(lv_obj_t * obj, lv_chart_type_t type); +/** + * Set the number of points on a data line on a chart + * @param obj pointer to a chart object + * @param cnt new number of points on the data lines + */ +void lv_chart_set_point_count(lv_obj_t * obj, uint16_t cnt); + +/** + * Set the minimal and maximal y values on an axis + * @param obj pointer to a chart object + * @param axis `LV_CHART_AXIS_PRIMARY_Y` or `LV_CHART_AXIS_SECONDARY_Y` + * @param min minimum value of the y axis + * @param max maximum value of the y axis + */ +void lv_chart_set_range(lv_obj_t * obj, lv_chart_axis_t axis, lv_coord_t min, lv_coord_t max); + +/** + * Set update mode of the chart object. Affects + * @param obj pointer to a chart object + * @param mode the update mode + */ +void lv_chart_set_update_mode(lv_obj_t * obj, lv_chart_update_mode_t update_mode); + +/** + * Set the number of horizontal and vertical division lines + * @param obj pointer to a chart object + * @param hdiv number of horizontal division lines + * @param vdiv number of vertical division lines + */ +void lv_chart_set_div_line_count(lv_obj_t * obj, uint8_t hdiv, uint8_t vdiv); + +/** + * Zoom into the chart in X direction + * @param obj pointer to a chart object + * @param zoom_x zoom in x direction. LV_ZOOM_NONE or 256 for no zoom, 512 double zoom + */ +void lv_chart_set_zoom_x(lv_obj_t * obj, uint16_t zoom_x); + +/** + * Zoom into the chart in Y direction + * @param obj pointer to a chart object + * @param zoom_y zoom in y direction. LV_ZOOM_NONE or 256 for no zoom, 512 double zoom + */ +void lv_chart_set_zoom_y(lv_obj_t * obj, uint16_t zoom_y); + +/** + * Get X zoom of a chart + * @param obj pointer to a chart object + * @return the X zoom value + */ +uint16_t lv_chart_get_zoom_x(const lv_obj_t * obj); + +/** + * Get Y zoom of a chart + * @param obj pointer to a chart object + * @return the Y zoom value + */ +uint16_t lv_chart_get_zoom_y(const lv_obj_t * obj); + +/** + * Set the number of tick lines on an axis + * @param obj pointer to a chart object + * @param axis an axis which ticks count should be set + * @param major_len length of major ticks + * @param minor_len length of minor ticks + * @param major_cnt number of major ticks on the axis + * @param minor_cnt number of minor ticks between two major ticks + * @param label_en true: enable label drawing on major ticks + * @param draw_size extra size required to draw the tick and labels + * (start with 20 px and increase if the ticks/labels are clipped) + */ +void lv_chart_set_axis_tick(lv_obj_t * obj, lv_chart_axis_t axis, lv_coord_t major_len, lv_coord_t minor_len, + lv_coord_t major_cnt, lv_coord_t minor_cnt, bool label_en, lv_coord_t draw_size); + +/** + * Get the type of a chart + * @param obj pointer to chart object + * @return type of the chart (from 'lv_chart_t' enum) + */ +lv_chart_type_t lv_chart_get_type(const lv_obj_t * obj); + +/** + * Get the data point number per data line on chart + * @param chart pointer to chart object + * @return point number on each data line + */ +uint16_t lv_chart_get_point_count(const lv_obj_t * obj); + +/** + * Get the current index of the x-axis start point in the data array + * @param chart pointer to a chart object + * @param ser pointer to a data series on 'chart' + * @return the index of the current x start point in the data array + */ +uint16_t lv_chart_get_x_start_point(const lv_obj_t * obj, lv_chart_series_t * ser); + +/** + * Get the position of a point to the chart. + * @param chart pointer to a chart object + * @param ser pointer to series + * @param id the index. + * @param p_out store the result position here + */ +void lv_chart_get_point_pos_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint16_t id, lv_point_t * p_out); + +/** + * Refresh a chart if its data line has changed + * @param chart pointer to chart object + */ +void lv_chart_refresh(lv_obj_t * obj); + +/*====================== + * Series + *=====================*/ + +/** + * Allocate and add a data series to the chart + * @param obj pointer to a chart object + * @param color color of the data series + * @param axis the y axis to which the series should be attached (::LV_CHART_AXIS_PRIMARY_Y or ::LV_CHART_AXIS_SECONDARY_Y) + * @return pointer to the allocated data series + */ +lv_chart_series_t * lv_chart_add_series(lv_obj_t * obj, lv_color_t color, lv_chart_axis_t axis); + +/** + * Deallocate and remove a data series from a chart + * @param chart pointer to a chart object + * @param series pointer to a data series on 'chart' + */ +void lv_chart_remove_series(lv_obj_t * obj, lv_chart_series_t * series); + +/** + * Hide/Unhide a single series of a chart. + * @param obj pointer to a chart object. + * @param series pointer to a series object + * @param hide true: hide the series + */ +void lv_chart_hide_series(lv_obj_t * chart, lv_chart_series_t * series, bool hide); + +/** + * Change the color of a series + * @param obj pointer to a chart object. + * @param series pointer to a series object + * @param color the new color of the series + */ +void lv_chart_set_series_color(lv_obj_t * chart, lv_chart_series_t * series, lv_color_t color); + +/** + * Set the index of the x-axis start point in the data array. + * This point will be considers the first (left) point and the other points will be drawn after it. + * @param obj pointer to a chart object + * @param ser pointer to a data series on 'chart' + * @param id the index of the x point in the data array + */ +void lv_chart_set_x_start_point(lv_obj_t * obj, lv_chart_series_t * ser, uint16_t id); + +/** + * Get the next series. + * @param chart pointer to a chart + * @param ser the previous series or NULL to get the first + * @return the next series or NULL if there is no more. + */ +lv_chart_series_t * lv_chart_get_series_next(const lv_obj_t * chart, const lv_chart_series_t * ser); + + + +/*===================== + * Cursor + *====================*/ + +/** + * Add a cursor with a given color + * @param obj pointer to chart object + * @param color color of the cursor + * @param dir direction of the cursor. `LV_DIR_RIGHT/LEFT/TOP/DOWN/HOR/VER/ALL`. OR-ed values are possible + * @return pointer to the created cursor + */ +lv_chart_cursor_t * lv_chart_add_cursor(lv_obj_t * obj, lv_color_t color, lv_dir_t dir); + +/** + * Set the coordinate of the cursor with respect to the paddings + * @param obj pointer to a chart object + * @param cursor pointer to the cursor + * @param pos the new coordinate of cursor relative to the chart + */ +void lv_chart_set_cursor_pos(lv_obj_t * chart, lv_chart_cursor_t * cursor, lv_point_t * pos); + +/** + * Stick the cursor to a point + * @param obj pointer to a chart object + * @param cursor pointer to the cursor + * @param ser pointer to a series + * @param point_id the point's index or `LV_CHART_POINT_NONE` to not assign to any points. + */ +void lv_chart_set_cursor_point(lv_obj_t * chart, lv_chart_cursor_t * cursor, lv_chart_series_t * ser, + uint16_t point_id); + +/** + * Get the coordinate of the cursor with respect to the paddings + * @param obj pointer to a chart object + * @param cursor pointer to cursor + * @return coordinate of the cursor as lv_point_t + */ +lv_point_t lv_chart_get_cursor_point(lv_obj_t * chart, lv_chart_cursor_t * cursor); + +/*===================== + * Set/Get value(s) + *====================*/ + +/** + * Initialize all data points of a series with a value + * @param obj pointer to chart object + * @param ser pointer to a data series on 'chart' + * @param value the new value for all points. `LV_CHART_POINT_NONE` can be used to hide the points. + */ +void lv_chart_set_all_value(lv_obj_t * obj, lv_chart_series_t * ser, lv_coord_t value); + +/** + * Set the next point's Y value according to the update mode policy. + * @param obj pointer to chart object + * @param ser pointer to a data series on 'chart' + * @param value the new value of the next data + */ +void lv_chart_set_next_value(lv_obj_t * obj, lv_chart_series_t * ser, lv_coord_t value); + +/** + * Set the next point's X and Y value according to the update mode policy. + * @param obj pointer to chart object + * @param ser pointer to a data series on 'chart' + * @param x_value the new X value of the next data + * @param y_value the new Y value of the next data + */ +void lv_chart_set_next_value2(lv_obj_t * obj, lv_chart_series_t * ser, lv_coord_t x_value, lv_coord_t y_value); + +/** + * Set an individual point's y value of a chart's series directly based on its index + * @param obj pointer to a chart object + * @param ser pointer to a data series on 'chart' + * @param id the index of the x point in the array + * @param value value to assign to array point + */ +void lv_chart_set_value_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint16_t id, lv_coord_t value); + +/** + * Set an individual point's x and y value of a chart's series directly based on its index + * Can be used only with `LV_CHART_TYPE_SCATTER`. + * @param obj pointer to chart object + * @param ser pointer to a data series on 'chart' + * @param id the index of the x point in the array + * @param x_value the new X value of the next data + * @param y_value the new Y value of the next data + */ +void lv_chart_set_value_by_id2(lv_obj_t * obj, lv_chart_series_t * ser, uint16_t id, lv_coord_t x_value, + lv_coord_t y_value); + +/** + * Set an external array for the y data points to use for the chart + * NOTE: It is the users responsibility to make sure the `point_cnt` matches the external array size. + * @param obj pointer to a chart object + * @param ser pointer to a data series on 'chart' + * @param array external array of points for chart + */ +void lv_chart_set_ext_y_array(lv_obj_t * obj, lv_chart_series_t * ser, lv_coord_t array[]); + +/** + * Set an external array for the x data points to use for the chart + * NOTE: It is the users responsibility to make sure the `point_cnt` matches the external array size. + * @param obj pointer to a chart object + * @param ser pointer to a data series on 'chart' + * @param array external array of points for chart + */ +void lv_chart_set_ext_x_array(lv_obj_t * obj, lv_chart_series_t * ser, lv_coord_t array[]); + +/** + * Get the array of y values of a series + * @param obj pointer to a chart object + * @param ser pointer to a data series on 'chart' + * @return the array of values with 'point_count' elements + */ +lv_coord_t * lv_chart_get_y_array(const lv_obj_t * obj, lv_chart_series_t * ser); + +/** + * Get the array of x values of a series + * @param obj pointer to a chart object + * @param ser pointer to a data series on 'chart' + * @return the array of values with 'point_count' elements + */ +lv_coord_t * lv_chart_get_x_array(const lv_obj_t * obj, lv_chart_series_t * ser); + +/** + * Get the index of the currently pressed point. It's the same for every series. + * @param obj pointer to a chart object + * @return the index of the point [0 .. point count] or LV_CHART_POINT_ID_NONE if no point is being pressed + */ +uint32_t lv_chart_get_pressed_point(const lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_CHART*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CHART_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/colorwheel/lv_colorwheel.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/colorwheel/lv_colorwheel.c new file mode 100644 index 0000000..daf112e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/colorwheel/lv_colorwheel.c @@ -0,0 +1,713 @@ +/** + * @file lv_colorwheel.c + * + * Based on the work of @AloyseTech and @paulpv. + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_colorwheel.h" +#if LV_USE_COLORWHEEL + +#include "../../../misc/lv_assert.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_colorwheel_class + +#define LV_CPICKER_DEF_QF 3 + +/** + * The OUTER_MASK_WIDTH define is required to assist with the placing of a mask over the outer ring of the widget as when the + * multicoloured radial lines are calculated for the outer ring of the widget their lengths are jittering because of the + * integer based arithmetic. From tests the maximum delta was found to be 2 so the current value is set to 3 to achieve + * appropriate masking. + */ +#define OUTER_MASK_WIDTH 3 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_colorwheel_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_colorwheel_event(const lv_obj_class_t * class_p, lv_event_t * e); + +static void draw_disc_grad(lv_event_t * e); +static void draw_knob(lv_event_t * e); +static void invalidate_knob(lv_obj_t * obj); +static lv_area_t get_knob_area(lv_obj_t * obj); + +static void next_color_mode(lv_obj_t * obj); +static lv_res_t double_click_reset(lv_obj_t * obj); +static void refr_knob_pos(lv_obj_t * obj); +static lv_color_t angle_to_mode_color_fast(lv_obj_t * obj, uint16_t angle); +static uint16_t get_angle(lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_colorwheel_class = {.instance_size = sizeof(lv_colorwheel_t), .base_class = &lv_obj_class, + .constructor_cb = lv_colorwheel_constructor, + .event_cb = lv_colorwheel_event, + .width_def = LV_DPI_DEF * 2, + .height_def = LV_DPI_DEF * 2, + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + }; + +static bool create_knob_recolor; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Create a color_picker object + * @param parent pointer to an object, it will be the parent of the new color_picker + * @return pointer to the created color_picker + */ +lv_obj_t * lv_colorwheel_create(lv_obj_t * parent, bool knob_recolor) +{ + LV_LOG_INFO("begin"); + create_knob_recolor = knob_recolor; + + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the current hsv of a color wheel. + * @param colorwheel pointer to color wheel object + * @param color current selected hsv + * @return true if changed, otherwise false + */ +bool lv_colorwheel_set_hsv(lv_obj_t * obj, lv_color_hsv_t hsv) +{ + if(hsv.h > 360) hsv.h %= 360; + if(hsv.s > 100) hsv.s = 100; + if(hsv.v > 100) hsv.v = 100; + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_colorwheel_t * colorwheel = (lv_colorwheel_t *)obj; + + if(colorwheel->hsv.h == hsv.h && colorwheel->hsv.s == hsv.s && colorwheel->hsv.v == hsv.v) return false; + + colorwheel->hsv = hsv; + + refr_knob_pos(obj); + + lv_obj_invalidate(obj); + + return true; +} + +/** + * Set the current color of a color wheel. + * @param colorwheel pointer to color wheel object + * @param color current selected color + * @return true if changed, otherwise false + */ +bool lv_colorwheel_set_rgb(lv_obj_t * obj, lv_color_t color) +{ + lv_color32_t c32; + c32.full = lv_color_to32(color); + + return lv_colorwheel_set_hsv(obj, lv_color_rgb_to_hsv(c32.ch.red, c32.ch.green, c32.ch.blue)); +} + +/** + * Set the current color mode. + * @param colorwheel pointer to color wheel object + * @param mode color mode (hue/sat/val) + */ +void lv_colorwheel_set_mode(lv_obj_t * obj, lv_colorwheel_mode_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_colorwheel_t * colorwheel = (lv_colorwheel_t *)obj; + + colorwheel->mode = mode; + refr_knob_pos(obj); + lv_obj_invalidate(obj); +} + +/** + * Set if the color mode is changed on long press on center + * @param colorwheel pointer to color wheel object + * @param fixed color mode cannot be changed on long press + */ +void lv_colorwheel_set_mode_fixed(lv_obj_t * obj, bool fixed) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_colorwheel_t * colorwheel = (lv_colorwheel_t *)obj; + + colorwheel->mode_fixed = fixed; +} + +/*===================== + * Getter functions + *====================*/ + + +/** + * Get the current selected hsv of a color wheel. + * @param colorwheel pointer to color wheel object + * @return current selected hsv + */ +lv_color_hsv_t lv_colorwheel_get_hsv(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_colorwheel_t * colorwheel = (lv_colorwheel_t *)obj; + + return colorwheel->hsv; +} + +/** + * Get the current selected color of a color wheel. + * @param colorwheel pointer to color wheel object + * @return color current selected color + */ +lv_color_t lv_colorwheel_get_rgb(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_colorwheel_t * colorwheel = (lv_colorwheel_t *)obj; + + return lv_color_hsv_to_rgb(colorwheel->hsv.h, colorwheel->hsv.s, colorwheel->hsv.v); +} + +/** + * Get the current color mode. + * @param colorwheel pointer to color wheel object + * @return color mode (hue/sat/val) + */ +lv_colorwheel_mode_t lv_colorwheel_get_color_mode(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_colorwheel_t * colorwheel = (lv_colorwheel_t *)obj; + + return colorwheel->mode; +} + +/** + * Get if the color mode is changed on long press on center + * @param colorwheel pointer to color wheel object + * @return mode cannot be changed on long press + */ +bool lv_colorwheel_get_color_mode_fixed(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_colorwheel_t * colorwheel = (lv_colorwheel_t *)obj; + + return colorwheel->mode_fixed; +} + +/*===================== + * Other functions + *====================*/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_colorwheel_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_colorwheel_t * colorwheel = (lv_colorwheel_t *)obj; + colorwheel->hsv.h = 0; + colorwheel->hsv.s = 100; + colorwheel->hsv.v = 100; + colorwheel->mode = LV_COLORWHEEL_MODE_HUE; + colorwheel->mode_fixed = 0; + colorwheel->last_click_time = 0; + colorwheel->last_change_time = 0; + colorwheel->knob.recolor = create_knob_recolor; + + lv_obj_add_flag(obj, LV_OBJ_FLAG_ADV_HITTEST); + lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN); + refr_knob_pos(obj); +} + +static void draw_disc_grad(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + lv_coord_t w = lv_obj_get_width(obj); + lv_coord_t h = lv_obj_get_height(obj); + lv_coord_t cx = obj->coords.x1 + w / 2; + lv_coord_t cy = obj->coords.y1 + h / 2; + lv_coord_t r = w / 2; + + lv_draw_line_dsc_t line_dsc; + lv_draw_line_dsc_init(&line_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_MAIN, &line_dsc); + + line_dsc.width = (r * 628 / (256 / LV_CPICKER_DEF_QF)) / 100; + line_dsc.width += 2; + uint16_t i; + uint32_t a = 0; + lv_coord_t cir_w = lv_obj_get_style_arc_width(obj, LV_PART_MAIN); + +#if LV_DRAW_COMPLEX + /*Mask outer and inner ring of widget to tidy up ragged edges of lines while drawing outer ring*/ + lv_draw_mask_radius_param_t mask_out_param; + lv_draw_mask_radius_init(&mask_out_param, &obj->coords, LV_RADIUS_CIRCLE, false); + int16_t mask_out_id = lv_draw_mask_add(&mask_out_param, 0); + + lv_area_t mask_area; + lv_area_copy(&mask_area, &obj->coords); + mask_area.x1 += cir_w; + mask_area.x2 -= cir_w; + mask_area.y1 += cir_w; + mask_area.y2 -= cir_w; + lv_draw_mask_radius_param_t mask_in_param; + lv_draw_mask_radius_init(&mask_in_param, &mask_area, LV_RADIUS_CIRCLE, true); + int16_t mask_in_id = lv_draw_mask_add(&mask_in_param, 0); + + /*The inner and outer line ends will be masked out. + *So make lines a little bit longer because the masking makes a more even result*/ + lv_coord_t cir_w_extra = line_dsc.width; +#else + lv_coord_t cir_w_extra = 0; +#endif + + for(i = 0; i <= 256; i += LV_CPICKER_DEF_QF, a += 360 * LV_CPICKER_DEF_QF) { + line_dsc.color = angle_to_mode_color_fast(obj, i); + uint16_t angle_trigo = (uint16_t)(a >> 8); /*i * 360 / 256 is the scale to apply, but we can skip multiplication here*/ + + lv_point_t p[2]; + p[0].x = cx + ((r + cir_w_extra) * lv_trigo_sin(angle_trigo) >> LV_TRIGO_SHIFT); + p[0].y = cy + ((r + cir_w_extra) * lv_trigo_cos(angle_trigo) >> LV_TRIGO_SHIFT); + p[1].x = cx + ((r - cir_w - cir_w_extra) * lv_trigo_sin(angle_trigo) >> LV_TRIGO_SHIFT); + p[1].y = cy + ((r - cir_w - cir_w_extra) * lv_trigo_cos(angle_trigo) >> LV_TRIGO_SHIFT); + + lv_draw_line(draw_ctx, &line_dsc, &p[0], &p[1]); + } + +#if LV_DRAW_COMPLEX + lv_draw_mask_free_param(&mask_out_param); + lv_draw_mask_free_param(&mask_in_param); + lv_draw_mask_remove_id(mask_out_id); + lv_draw_mask_remove_id(mask_in_id); +#endif +} + +static void draw_knob(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + lv_colorwheel_t * colorwheel = (lv_colorwheel_t *)obj; + + lv_draw_rect_dsc_t cir_dsc; + lv_draw_rect_dsc_init(&cir_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_KNOB, &cir_dsc); + + cir_dsc.radius = LV_RADIUS_CIRCLE; + + if(colorwheel->knob.recolor) { + cir_dsc.bg_color = lv_colorwheel_get_rgb(obj); + } + + lv_area_t knob_area = get_knob_area(obj); + + lv_draw_rect(draw_ctx, &cir_dsc, &knob_area); +} + +static void invalidate_knob(lv_obj_t * obj) +{ + lv_area_t knob_area = get_knob_area(obj); + + lv_obj_invalidate_area(obj, &knob_area); +} + +static lv_area_t get_knob_area(lv_obj_t * obj) +{ + lv_colorwheel_t * colorwheel = (lv_colorwheel_t *)obj; + + /*Get knob's radius*/ + uint16_t r = 0; + r = lv_obj_get_style_arc_width(obj, LV_PART_MAIN) / 2; + + lv_coord_t left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); + lv_coord_t right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); + lv_coord_t top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); + lv_coord_t bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); + + lv_area_t knob_area; + knob_area.x1 = obj->coords.x1 + colorwheel->knob.pos.x - r - left; + knob_area.y1 = obj->coords.y1 + colorwheel->knob.pos.y - r - right; + knob_area.x2 = obj->coords.x1 + colorwheel->knob.pos.x + r + top; + knob_area.y2 = obj->coords.y1 + colorwheel->knob.pos.y + r + bottom; + + return knob_area; +} + +static void lv_colorwheel_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + /*Call the ancestor's event handler*/ + lv_res_t res = lv_obj_event_base(MY_CLASS, e); + + if(res != LV_RES_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + lv_colorwheel_t * colorwheel = (lv_colorwheel_t *)obj; + + if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + lv_coord_t left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); + lv_coord_t right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); + lv_coord_t top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); + lv_coord_t bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); + + lv_coord_t knob_pad = LV_MAX4(left, right, top, bottom) + 2; + lv_coord_t * s = lv_event_get_param(e); + *s = LV_MAX(*s, knob_pad); + } + else if(code == LV_EVENT_SIZE_CHANGED) { + void * param = lv_event_get_param(e); + /*Refresh extended draw area to make knob visible*/ + if(lv_obj_get_width(obj) != lv_area_get_width(param) || + lv_obj_get_height(obj) != lv_area_get_height(param)) { + refr_knob_pos(obj); + } + } + else if(code == LV_EVENT_STYLE_CHANGED) { + /*Refresh extended draw area to make knob visible*/ + refr_knob_pos(obj); + } + else if(code == LV_EVENT_KEY) { + uint32_t c = *((uint32_t *)lv_event_get_param(e)); /*uint32_t because can be UTF-8*/ + + if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { + lv_color_hsv_t hsv_cur; + hsv_cur = colorwheel->hsv; + + switch(colorwheel->mode) { + case LV_COLORWHEEL_MODE_HUE: + hsv_cur.h = (colorwheel->hsv.h + 1) % 360; + break; + case LV_COLORWHEEL_MODE_SATURATION: + hsv_cur.s = (colorwheel->hsv.s + 1) % 100; + break; + case LV_COLORWHEEL_MODE_VALUE: + hsv_cur.v = (colorwheel->hsv.v + 1) % 100; + break; + } + + if(lv_colorwheel_set_hsv(obj, hsv_cur)) { + res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RES_OK) return; + } + } + else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { + lv_color_hsv_t hsv_cur; + hsv_cur = colorwheel->hsv; + + switch(colorwheel->mode) { + case LV_COLORWHEEL_MODE_HUE: + hsv_cur.h = colorwheel->hsv.h > 0 ? (colorwheel->hsv.h - 1) : 360; + break; + case LV_COLORWHEEL_MODE_SATURATION: + hsv_cur.s = colorwheel->hsv.s > 0 ? (colorwheel->hsv.s - 1) : 100; + break; + case LV_COLORWHEEL_MODE_VALUE: + hsv_cur.v = colorwheel->hsv.v > 0 ? (colorwheel->hsv.v - 1) : 100; + break; + } + + if(lv_colorwheel_set_hsv(obj, hsv_cur)) { + res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RES_OK) return; + } + } + } + else if(code == LV_EVENT_PRESSED) { + colorwheel->last_change_time = lv_tick_get(); + lv_indev_get_point(lv_indev_get_act(), &colorwheel->last_press_point); + res = double_click_reset(obj); + if(res != LV_RES_OK) return; + } + else if(code == LV_EVENT_PRESSING) { + lv_indev_t * indev = lv_indev_get_act(); + if(indev == NULL) return; + + lv_indev_type_t indev_type = lv_indev_get_type(indev); + lv_point_t p; + if(indev_type == LV_INDEV_TYPE_ENCODER || indev_type == LV_INDEV_TYPE_KEYPAD) { + p.x = obj->coords.x1 + lv_obj_get_width(obj) / 2; + p.y = obj->coords.y1 + lv_obj_get_height(obj) / 2; + } + else { + lv_indev_get_point(indev, &p); + } + + lv_coord_t drag_limit = indev->driver->scroll_limit; + if((LV_ABS(p.x - colorwheel->last_press_point.x) > drag_limit) || + (LV_ABS(p.y - colorwheel->last_press_point.y) > drag_limit)) { + colorwheel->last_change_time = lv_tick_get(); + colorwheel->last_press_point.x = p.x; + colorwheel->last_press_point.y = p.y; + } + + p.x -= obj->coords.x1; + p.y -= obj->coords.y1; + + /*Ignore pressing in the inner area*/ + uint16_t w = lv_obj_get_width(obj); + + int16_t angle = 0; + lv_coord_t cir_w = lv_obj_get_style_arc_width(obj, LV_PART_MAIN); + + lv_coord_t r_in = w / 2; + p.x -= r_in; + p.y -= r_in; + bool on_ring = true; + r_in -= cir_w; + if(r_in > LV_DPI_DEF / 2) { + lv_coord_t inner = cir_w / 2; + r_in -= inner; + + if(r_in < LV_DPI_DEF / 2) r_in = LV_DPI_DEF / 2; + } + + if(p.x * p.x + p.y * p.y < r_in * r_in) { + on_ring = false; + } + + /*If the inner area is being pressed, go to the next color mode on long press*/ + uint32_t diff = lv_tick_elaps(colorwheel->last_change_time); + if(!on_ring && diff > indev->driver->long_press_time && !colorwheel->mode_fixed) { + next_color_mode(obj); + lv_indev_wait_release(lv_indev_get_act()); + return; + } + + /*Set the angle only if pressed on the ring*/ + if(!on_ring) return; + + angle = lv_atan2(p.x, p.y) % 360; + + lv_color_hsv_t hsv_cur; + hsv_cur = colorwheel->hsv; + + switch(colorwheel->mode) { + case LV_COLORWHEEL_MODE_HUE: + hsv_cur.h = angle; + break; + case LV_COLORWHEEL_MODE_SATURATION: + hsv_cur.s = (angle * 100) / 360; + break; + case LV_COLORWHEEL_MODE_VALUE: + hsv_cur.v = (angle * 100) / 360; + break; + } + + if(lv_colorwheel_set_hsv(obj, hsv_cur)) { + res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RES_OK) return; + } + } + else if(code == LV_EVENT_HIT_TEST) { + lv_hit_test_info_t * info = lv_event_get_param(e);; + + /*Valid clicks can be only in the circle*/ + info->res = _lv_area_is_point_on(&obj->coords, info->point, LV_RADIUS_CIRCLE); + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_disc_grad(e); + draw_knob(e); + } + else if(code == LV_EVENT_COVER_CHECK) { + lv_cover_check_info_t * info = lv_event_get_param(e); + if(info->res != LV_COVER_RES_MASKED) info->res = LV_COVER_RES_NOT_COVER; + } +} + + + +static void next_color_mode(lv_obj_t * obj) +{ + lv_colorwheel_t * colorwheel = (lv_colorwheel_t *)obj; + colorwheel->mode = (colorwheel->mode + 1) % 3; + refr_knob_pos(obj); + lv_obj_invalidate(obj); +} + +static void refr_knob_pos(lv_obj_t * obj) +{ + invalidate_knob(obj); + + lv_colorwheel_t * colorwheel = (lv_colorwheel_t *)obj; + lv_coord_t w = lv_obj_get_width(obj); + + lv_coord_t scale_w = lv_obj_get_style_arc_width(obj, LV_PART_MAIN); + lv_coord_t r = (w - scale_w) / 2; + uint16_t angle = get_angle(obj); + colorwheel->knob.pos.x = (((int32_t)r * lv_trigo_sin(angle)) >> LV_TRIGO_SHIFT); + colorwheel->knob.pos.y = (((int32_t)r * lv_trigo_cos(angle)) >> LV_TRIGO_SHIFT); + colorwheel->knob.pos.x = colorwheel->knob.pos.x + w / 2; + colorwheel->knob.pos.y = colorwheel->knob.pos.y + w / 2; + + invalidate_knob(obj); +} + +static lv_res_t double_click_reset(lv_obj_t * obj) +{ + lv_colorwheel_t * colorwheel = (lv_colorwheel_t *)obj; + lv_indev_t * indev = lv_indev_get_act(); + /*Double clicked? Use long press time as double click time out*/ + if(lv_tick_elaps(colorwheel->last_click_time) < indev->driver->long_press_time) { + lv_color_hsv_t hsv_cur; + hsv_cur = colorwheel->hsv; + + switch(colorwheel->mode) { + case LV_COLORWHEEL_MODE_HUE: + hsv_cur.h = 0; + break; + case LV_COLORWHEEL_MODE_SATURATION: + hsv_cur.s = 100; + break; + case LV_COLORWHEEL_MODE_VALUE: + hsv_cur.v = 100; + break; + } + + lv_indev_wait_release(indev); + + if(lv_colorwheel_set_hsv(obj, hsv_cur)) { + lv_res_t res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RES_OK) return res; + } + } + colorwheel->last_click_time = lv_tick_get(); + + return LV_RES_OK; +} + +#define SWAPPTR(A, B) do { uint8_t * t = A; A = B; B = t; } while(0) +#define HSV_PTR_SWAP(sextant,r,g,b) if((sextant) & 2) { SWAPPTR((r), (b)); } if((sextant) & 4) { SWAPPTR((g), (b)); } if(!((sextant) & 6)) { \ + if(!((sextant) & 1)) { SWAPPTR((r), (g)); } } else { if((sextant) & 1) { SWAPPTR((r), (g)); } } + +/** + * Based on the idea from https://www.vagrearg.org/content/hsvrgb + * Here we want to compute an approximate RGB value from a HSV input color space. We don't want to be accurate + * (for that, there's lv_color_hsv_to_rgb), but we want to be fast. + * + * Few tricks are used here: Hue is in range [0; 6 * 256] (so that the sextant is in the high byte and the fractional part is in the low byte) + * both s and v are in [0; 255] range (very convenient to avoid divisions). + * + * We fold all symmetry by swapping the R, G, B pointers so that the code is the same for all sextants. + * We replace division by 255 by a division by 256, a.k.a a shift right by 8 bits. + * This is wrong, but since this is only used to compute the pixels on the screen and not the final color, it's ok. + */ +static void fast_hsv2rgb(uint16_t h, uint8_t s, uint8_t v, uint8_t * r, uint8_t * g, uint8_t * b) +{ + if(!s) { + *r = *g = *b = v; + return; + } + + uint8_t sextant = h >> 8; + HSV_PTR_SWAP(sextant, r, g, b); /*Swap pointers so the conversion code is the same*/ + + *g = v; + + uint8_t bb = ~s; + uint16_t ww = v * bb; /*Don't try to be precise, but instead, be fast*/ + *b = ww >> 8; + + uint8_t h_frac = h & 0xff; + + if(!(sextant & 1)) { + /*Up slope*/ + ww = !h_frac ? ((uint16_t)s << 8) : (s * (uint8_t)(-h_frac)); /*Skip multiply if not required*/ + } + else { + /*Down slope*/ + ww = s * h_frac; + } + bb = ww >> 8; + bb = ~bb; + ww = v * bb; + *r = ww >> 8; +} + +static lv_color_t angle_to_mode_color_fast(lv_obj_t * obj, uint16_t angle) +{ + lv_colorwheel_t * ext = (lv_colorwheel_t *)obj; + uint8_t r = 0, g = 0, b = 0; + static uint16_t h = 0; + static uint8_t s = 0, v = 0, m = 255; + static uint16_t angle_saved = 0xffff; + + /*If the angle is different recalculate scaling*/ + if(angle_saved != angle) m = 255; + angle_saved = angle; + + switch(ext->mode) { + default: + case LV_COLORWHEEL_MODE_HUE: + /*Don't recompute costly scaling if it does not change*/ + if(m != ext->mode) { + s = (uint8_t)(((uint16_t)ext->hsv.s * 51) / 20); + v = (uint8_t)(((uint16_t)ext->hsv.v * 51) / 20); + m = ext->mode; + } + fast_hsv2rgb(angle * 6, s, v, &r, &g, + &b); /*A smart compiler will replace x * 6 by (x << 2) + (x << 1) if it's more efficient*/ + break; + case LV_COLORWHEEL_MODE_SATURATION: + /*Don't recompute costly scaling if it does not change*/ + if(m != ext->mode) { + h = (uint16_t)(((uint32_t)ext->hsv.h * 6 * 256) / 360); + v = (uint8_t)(((uint16_t)ext->hsv.v * 51) / 20); + m = ext->mode; + } + fast_hsv2rgb(h, angle, v, &r, &g, &b); + break; + case LV_COLORWHEEL_MODE_VALUE: + /*Don't recompute costly scaling if it does not change*/ + if(m != ext->mode) { + h = (uint16_t)(((uint32_t)ext->hsv.h * 6 * 256) / 360); + s = (uint8_t)(((uint16_t)ext->hsv.s * 51) / 20); + m = ext->mode; + } + fast_hsv2rgb(h, s, angle, &r, &g, &b); + break; + } + return lv_color_make(r, g, b); +} + +static uint16_t get_angle(lv_obj_t * obj) +{ + lv_colorwheel_t * colorwheel = (lv_colorwheel_t *)obj; + uint16_t angle; + switch(colorwheel->mode) { + default: + case LV_COLORWHEEL_MODE_HUE: + angle = colorwheel->hsv.h; + break; + case LV_COLORWHEEL_MODE_SATURATION: + angle = (colorwheel->hsv.s * 360) / 100; + break; + case LV_COLORWHEEL_MODE_VALUE: + angle = (colorwheel->hsv.v * 360) / 100 ; + break; + } + return angle; +} + +#endif /*LV_USE_COLORWHEEL*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/colorwheel/lv_colorwheel.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/colorwheel/lv_colorwheel.h new file mode 100644 index 0000000..e9c9d92 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/colorwheel/lv_colorwheel.h @@ -0,0 +1,142 @@ +/** + * @file lv_colorwheel.h + * + */ + +#ifndef LV_COLORWHEEL_H +#define LV_COLORWHEEL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_COLORWHEEL + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +enum { + LV_COLORWHEEL_MODE_HUE, + LV_COLORWHEEL_MODE_SATURATION, + LV_COLORWHEEL_MODE_VALUE +}; +typedef uint8_t lv_colorwheel_mode_t; + + +/*Data of color picker*/ +typedef struct { + lv_obj_t obj; + lv_color_hsv_t hsv; + struct { + lv_point_t pos; + uint8_t recolor : 1; + } knob; + uint32_t last_click_time; + uint32_t last_change_time; + lv_point_t last_press_point; + lv_colorwheel_mode_t mode : 2; + uint8_t mode_fixed : 1; +} lv_colorwheel_t; + +extern const lv_obj_class_t lv_colorwheel_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a color picker object with disc shape + * @param parent pointer to an object, it will be the parent of the new color picker + * @param knob_recolor true: set the knob's color to the current color + * @return pointer to the created color picker + */ +lv_obj_t * lv_colorwheel_create(lv_obj_t * parent, bool knob_recolor); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the current hsv of a color wheel. + * @param colorwheel pointer to color wheel object + * @param color current selected hsv + * @return true if changed, otherwise false + */ +bool lv_colorwheel_set_hsv(lv_obj_t * obj, lv_color_hsv_t hsv); + +/** + * Set the current color of a color wheel. + * @param colorwheel pointer to color wheel object + * @param color current selected color + * @return true if changed, otherwise false + */ +bool lv_colorwheel_set_rgb(lv_obj_t * obj, lv_color_t color); + +/** + * Set the current color mode. + * @param colorwheel pointer to color wheel object + * @param mode color mode (hue/sat/val) + */ +void lv_colorwheel_set_mode(lv_obj_t * obj, lv_colorwheel_mode_t mode); + +/** + * Set if the color mode is changed on long press on center + * @param colorwheel pointer to color wheel object + * @param fixed color mode cannot be changed on long press + */ +void lv_colorwheel_set_mode_fixed(lv_obj_t * obj, bool fixed); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the current selected hsv of a color wheel. + * @param colorwheel pointer to color wheel object + * @return current selected hsv + */ +lv_color_hsv_t lv_colorwheel_get_hsv(lv_obj_t * obj); + +/** + * Get the current selected color of a color wheel. + * @param colorwheel pointer to color wheel object + * @return color current selected color + */ +lv_color_t lv_colorwheel_get_rgb(lv_obj_t * obj); + +/** + * Get the current color mode. + * @param colorwheel pointer to color wheel object + * @return color mode (hue/sat/val) + */ +lv_colorwheel_mode_t lv_colorwheel_get_color_mode(lv_obj_t * obj); + +/** + * Get if the color mode is changed on long press on center + * @param colorwheel pointer to color wheel object + * @return mode cannot be changed on long press + */ +bool lv_colorwheel_get_color_mode_fixed(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_COLORWHEEL*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_COLORWHEEL_H*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/imgbtn/lv_imgbtn.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/imgbtn/lv_imgbtn.c new file mode 100644 index 0000000..00c3011 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/imgbtn/lv_imgbtn.c @@ -0,0 +1,377 @@ +/** + * @file lv_imgbtn.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_imgbtn.h" + +#if LV_USE_IMGBTN != 0 + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_imgbtn_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_imgbtn_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void draw_main(lv_event_t * e); +static void lv_imgbtn_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void refr_img(lv_obj_t * imgbtn); +static lv_imgbtn_state_t suggest_state(lv_obj_t * imgbtn, lv_imgbtn_state_t state); +lv_imgbtn_state_t get_state(const lv_obj_t * imgbtn); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_imgbtn_class = { + .base_class = &lv_obj_class, + .instance_size = sizeof(lv_imgbtn_t), + .constructor_cb = lv_imgbtn_constructor, + .event_cb = lv_imgbtn_event, +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Create an image button object + * @param parent pointer to an object, it will be the parent of the new image button + * @return pointer to the created image button + */ +lv_obj_t * lv_imgbtn_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +/** + * Set images for a state of the image button + * @param obj pointer to an image button object + * @param state for which state set the new image + * @param src_left pointer to an image source for the left side of the button (a C array or path to + * a file) + * @param src_mid pointer to an image source for the middle of the button (ideally 1px wide) (a C + * array or path to a file) + * @param src_right pointer to an image source for the right side of the button (a C array or path + * to a file) + */ +void lv_imgbtn_set_src(lv_obj_t * obj, lv_imgbtn_state_t state, const void * src_left, const void * src_mid, + const void * src_right) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_imgbtn_t * imgbtn = (lv_imgbtn_t *)obj; + + imgbtn->img_src_left[state] = src_left; + imgbtn->img_src_mid[state] = src_mid; + imgbtn->img_src_right[state] = src_right; + + refr_img(obj); +} + +void lv_imgbtn_set_state(lv_obj_t * obj, lv_imgbtn_state_t state) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_state_t obj_state = LV_STATE_DEFAULT; + if(state == LV_IMGBTN_STATE_PRESSED || state == LV_IMGBTN_STATE_CHECKED_PRESSED) obj_state |= LV_STATE_PRESSED; + if(state == LV_IMGBTN_STATE_DISABLED || state == LV_IMGBTN_STATE_CHECKED_DISABLED) obj_state |= LV_STATE_DISABLED; + if(state == LV_IMGBTN_STATE_CHECKED_DISABLED || state == LV_IMGBTN_STATE_CHECKED_PRESSED || + state == LV_IMGBTN_STATE_CHECKED_RELEASED) { + obj_state |= LV_STATE_CHECKED; + } + + lv_obj_clear_state(obj, LV_STATE_CHECKED | LV_STATE_PRESSED | LV_STATE_DISABLED); + lv_obj_add_state(obj, obj_state); + + refr_img(obj); +} + +/*===================== + * Getter functions + *====================*/ + + +/** + * Get the left image in a given state + * @param obj pointer to an image button object + * @param state the state where to get the image (from `lv_btn_state_t`) ` + * @return pointer to the left image source (a C array or path to a file) + */ +const void * lv_imgbtn_get_src_left(lv_obj_t * obj, lv_imgbtn_state_t state) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_imgbtn_t * imgbtn = (lv_imgbtn_t *)obj; + + return imgbtn->img_src_left[state]; +} + +/** + * Get the middle image in a given state + * @param obj pointer to an image button object + * @param state the state where to get the image (from `lv_btn_state_t`) ` + * @return pointer to the middle image source (a C array or path to a file) + */ +const void * lv_imgbtn_get_src_middle(lv_obj_t * obj, lv_imgbtn_state_t state) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_imgbtn_t * imgbtn = (lv_imgbtn_t *)obj; + + return imgbtn->img_src_mid[state]; +} + +/** + * Get the right image in a given state + * @param obj pointer to an image button object + * @param state the state where to get the image (from `lv_btn_state_t`) ` + * @return pointer to the left image source (a C array or path to a file) + */ +const void * lv_imgbtn_get_src_right(lv_obj_t * obj, lv_imgbtn_state_t state) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_imgbtn_t * imgbtn = (lv_imgbtn_t *)obj; + + return imgbtn->img_src_right[state]; +} + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_imgbtn_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_imgbtn_t * imgbtn = (lv_imgbtn_t *)obj; + /*Initialize the allocated 'ext'*/ + lv_memset_00((void *)imgbtn->img_src_mid, sizeof(imgbtn->img_src_mid)); + lv_memset_00(imgbtn->img_src_left, sizeof(imgbtn->img_src_left)); + lv_memset_00(imgbtn->img_src_right, sizeof(imgbtn->img_src_right)); + + imgbtn->act_cf = LV_IMG_CF_UNKNOWN; +} + + +static void lv_imgbtn_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_res_t res = lv_obj_event_base(&lv_imgbtn_class, e); + if(res != LV_RES_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + if(code == LV_EVENT_PRESSED || code == LV_EVENT_RELEASED || code == LV_EVENT_PRESS_LOST) { + refr_img(obj); + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_main(e); + } + else if(code == LV_EVENT_COVER_CHECK) { + lv_cover_check_info_t * info = lv_event_get_param(e); + if(info->res != LV_COVER_RES_MASKED) info->res = LV_COVER_RES_NOT_COVER; + } + else if(code == LV_EVENT_GET_SELF_SIZE) { + lv_point_t * p = lv_event_get_self_size_info(e); + lv_imgbtn_t * imgbtn = (lv_imgbtn_t *)obj; + lv_imgbtn_state_t state = suggest_state(obj, get_state(obj)); + if(imgbtn->img_src_left[state] == NULL && + imgbtn->img_src_mid[state] != NULL && + imgbtn->img_src_right[state] == NULL) { + lv_img_header_t header; + lv_img_decoder_get_info(imgbtn->img_src_mid[state], &header); + p->x = LV_MAX(p->x, header.w); + } + } +} + +static void draw_main(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + lv_imgbtn_t * imgbtn = (lv_imgbtn_t *)obj; + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + + /*Just draw_main an image*/ + lv_imgbtn_state_t state = suggest_state(obj, get_state(obj)); + + /*Simply draw the middle src if no tiled*/ + const void * src = imgbtn->img_src_left[state]; + + lv_coord_t tw = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); + lv_coord_t th = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); + lv_area_t coords; + lv_area_copy(&coords, &obj->coords); + coords.x1 -= tw; + coords.x2 += tw; + coords.y1 -= th; + coords.y2 += th; + + lv_draw_img_dsc_t img_dsc; + lv_draw_img_dsc_init(&img_dsc); + lv_obj_init_draw_img_dsc(obj, LV_PART_MAIN, &img_dsc); + + lv_img_header_t header; + lv_area_t coords_part; + lv_coord_t left_w = 0; + lv_coord_t right_w = 0; + + if(src) { + lv_img_decoder_get_info(src, &header); + left_w = header.w; + coords_part.x1 = coords.x1; + coords_part.y1 = coords.y1; + coords_part.x2 = coords.x1 + header.w - 1; + coords_part.y2 = coords.y1 + header.h - 1; + lv_draw_img(draw_ctx, &img_dsc, &coords_part, src); + } + + src = imgbtn->img_src_right[state]; + if(src) { + lv_img_decoder_get_info(src, &header); + right_w = header.w; + coords_part.x1 = coords.x2 - header.w + 1; + coords_part.y1 = coords.y1; + coords_part.x2 = coords.x2; + coords_part.y2 = coords.y1 + header.h - 1; + lv_draw_img(draw_ctx, &img_dsc, &coords_part, src); + } + + src = imgbtn->img_src_mid[state]; + if(src) { + lv_area_t clip_area_center; + clip_area_center.x1 = coords.x1 + left_w; + clip_area_center.x2 = coords.x2 - right_w; + clip_area_center.y1 = coords.y1; + clip_area_center.y2 = coords.y2; + + + bool comm_res; + comm_res = _lv_area_intersect(&clip_area_center, &clip_area_center, draw_ctx->clip_area); + if(comm_res) { + lv_coord_t i; + lv_img_decoder_get_info(src, &header); + + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + draw_ctx->clip_area = &clip_area_center; + + coords_part.x1 = coords.x1 + left_w; + coords_part.y1 = coords.y1; + coords_part.x2 = coords_part.x1 + header.w - 1; + coords_part.y2 = coords_part.y1 + header.h - 1; + + for(i = coords_part.x1; i < (lv_coord_t)(clip_area_center.x2 + header.w - 1); i += header.w) { + lv_draw_img(draw_ctx, &img_dsc, &coords_part, src); + coords_part.x1 = coords_part.x2 + 1; + coords_part.x2 += header.w; + } + draw_ctx->clip_area = clip_area_ori; + } + } +} + +static void refr_img(lv_obj_t * obj) +{ + lv_imgbtn_t * imgbtn = (lv_imgbtn_t *)obj; + lv_imgbtn_state_t state = suggest_state(obj, get_state(obj)); + lv_img_header_t header; + + const void * src = imgbtn->img_src_mid[state]; + if(src == NULL) return; + + lv_res_t info_res = LV_RES_OK; + info_res = lv_img_decoder_get_info(src, &header); + + if(info_res == LV_RES_OK) { + imgbtn->act_cf = header.cf; + lv_obj_refresh_self_size(obj); + lv_obj_set_height(obj, header.h); /*Keep the user defined width*/ + } + else { + imgbtn->act_cf = LV_IMG_CF_UNKNOWN; + } + + lv_obj_invalidate(obj); +} + +/** + * If `src` is not defined for the current state try to get a state which is related to the current but has `src`. + * E.g. if the PRESSED src is not set but the RELEASED does, use the RELEASED. + * @param imgbtn pointer to an image button + * @param state the state to convert + * @return the suggested state + */ +static lv_imgbtn_state_t suggest_state(lv_obj_t * obj, lv_imgbtn_state_t state) +{ + lv_imgbtn_t * imgbtn = (lv_imgbtn_t *)obj; + if(imgbtn->img_src_mid[state] == NULL) { + switch(state) { + case LV_IMGBTN_STATE_PRESSED: + if(imgbtn->img_src_mid[LV_IMGBTN_STATE_RELEASED]) return LV_IMGBTN_STATE_RELEASED; + break; + case LV_IMGBTN_STATE_CHECKED_RELEASED: + if(imgbtn->img_src_mid[LV_IMGBTN_STATE_RELEASED]) return LV_IMGBTN_STATE_RELEASED; + break; + case LV_IMGBTN_STATE_CHECKED_PRESSED: + if(imgbtn->img_src_mid[LV_IMGBTN_STATE_CHECKED_RELEASED]) return LV_IMGBTN_STATE_CHECKED_RELEASED; + if(imgbtn->img_src_mid[LV_IMGBTN_STATE_PRESSED]) return LV_IMGBTN_STATE_PRESSED; + if(imgbtn->img_src_mid[LV_IMGBTN_STATE_RELEASED]) return LV_IMGBTN_STATE_RELEASED; + break; + case LV_IMGBTN_STATE_DISABLED: + if(imgbtn->img_src_mid[LV_IMGBTN_STATE_RELEASED]) return LV_IMGBTN_STATE_RELEASED; + break; + case LV_IMGBTN_STATE_CHECKED_DISABLED: + if(imgbtn->img_src_mid[LV_IMGBTN_STATE_CHECKED_RELEASED]) return LV_IMGBTN_STATE_CHECKED_RELEASED; + if(imgbtn->img_src_mid[LV_IMGBTN_STATE_RELEASED]) return LV_IMGBTN_STATE_RELEASED; + break; + default: + break; + } + } + + return state; +} + +lv_imgbtn_state_t get_state(const lv_obj_t * imgbtn) +{ + LV_ASSERT_OBJ(imgbtn, MY_CLASS); + + lv_state_t obj_state = lv_obj_get_state(imgbtn); + + if(obj_state & LV_STATE_DISABLED) { + if(obj_state & LV_STATE_CHECKED) return LV_IMGBTN_STATE_CHECKED_DISABLED; + else return LV_IMGBTN_STATE_DISABLED; + } + + if(obj_state & LV_STATE_CHECKED) { + if(obj_state & LV_STATE_PRESSED) return LV_IMGBTN_STATE_CHECKED_PRESSED; + else return LV_IMGBTN_STATE_CHECKED_RELEASED; + } + else { + if(obj_state & LV_STATE_PRESSED) return LV_IMGBTN_STATE_PRESSED; + else return LV_IMGBTN_STATE_RELEASED; + } +} + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/imgbtn/lv_imgbtn.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/imgbtn/lv_imgbtn.h new file mode 100644 index 0000000..597faea --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/imgbtn/lv_imgbtn.h @@ -0,0 +1,131 @@ +/** + * @file lv_imgbtn.h + * + */ + +#ifndef LV_IMGBTN_H +#define LV_IMGBTN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_IMGBTN != 0 + +/********************* + * DEFINES + *********************/ +typedef enum { + LV_IMGBTN_STATE_RELEASED, + LV_IMGBTN_STATE_PRESSED, + LV_IMGBTN_STATE_DISABLED, + LV_IMGBTN_STATE_CHECKED_RELEASED, + LV_IMGBTN_STATE_CHECKED_PRESSED, + LV_IMGBTN_STATE_CHECKED_DISABLED, + _LV_IMGBTN_STATE_NUM, +} lv_imgbtn_state_t; + +/********************** + * TYPEDEFS + **********************/ +/*Data of image button*/ +typedef struct { + lv_obj_t obj; + const void * img_src_mid[_LV_IMGBTN_STATE_NUM]; /*Store center images to each state*/ + const void * img_src_left[_LV_IMGBTN_STATE_NUM]; /*Store left side images to each state*/ + const void * img_src_right[_LV_IMGBTN_STATE_NUM]; /*Store right side images to each state*/ + lv_img_cf_t act_cf; /*Color format of the currently active image*/ +} lv_imgbtn_t; + +extern const lv_obj_class_t lv_imgbtn_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an image button object + * @param parent pointer to an object, it will be the parent of the new image button + * @return pointer to the created image button + */ +lv_obj_t * lv_imgbtn_create(lv_obj_t * parent); + +/*====================== + * Add/remove functions + *=====================*/ + +/*===================== + * Setter functions + *====================*/ + +/** + * Set images for a state of the image button + * @param imgbtn pointer to an image button object + * @param state for which state set the new image + * @param src_left pointer to an image source for the left side of the button (a C array or path to + * a file) + * @param src_mid pointer to an image source for the middle of the button (ideally 1px wide) (a C + * array or path to a file) + * @param src_right pointer to an image source for the right side of the button (a C array or path + * to a file) + */ +void lv_imgbtn_set_src(lv_obj_t * imgbtn, lv_imgbtn_state_t state, const void * src_left, const void * src_mid, + const void * src_right); + + +/** + * Use this function instead of `lv_obj_add/clear_state` to set a state manually + * @param imgbtn pointer to an image button object + * @param state the new state + */ +void lv_imgbtn_set_state(lv_obj_t * imgbtn, lv_imgbtn_state_t state); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the left image in a given state + * @param imgbtn pointer to an image button object + * @param state the state where to get the image (from `lv_btn_state_t`) ` + * @return pointer to the left image source (a C array or path to a file) + */ +const void * lv_imgbtn_get_src_left(lv_obj_t * imgbtn, lv_imgbtn_state_t state); + +/** + * Get the middle image in a given state + * @param imgbtn pointer to an image button object + * @param state the state where to get the image (from `lv_btn_state_t`) ` + * @return pointer to the middle image source (a C array or path to a file) + */ +const void * lv_imgbtn_get_src_middle(lv_obj_t * imgbtn, lv_imgbtn_state_t state); + +/** + * Get the right image in a given state + * @param imgbtn pointer to an image button object + * @param state the state where to get the image (from `lv_btn_state_t`) ` + * @return pointer to the left image source (a C array or path to a file) + */ +const void * lv_imgbtn_get_src_right(lv_obj_t * imgbtn, lv_imgbtn_state_t state); + + +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_IMGBTN*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IMGBTN_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/keyboard/lv_keyboard.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/keyboard/lv_keyboard.c new file mode 100644 index 0000000..8e052e3 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/keyboard/lv_keyboard.c @@ -0,0 +1,430 @@ + +/** + * @file lv_keyboard.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_keyboard.h" +#if LV_USE_KEYBOARD + +#include "../../../widgets/lv_textarea.h" +#include "../../../misc/lv_assert.h" + +#include + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_keyboard_class +#define LV_KB_BTN(width) LV_BTNMATRIX_CTRL_POPOVER | width + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_keyboard_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); + +static void lv_keyboard_update_map(lv_obj_t * obj); + +static void lv_keyboard_update_ctrl_map(lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_keyboard_class = { + .constructor_cb = lv_keyboard_constructor, + .width_def = LV_PCT(100), + .height_def = LV_PCT(50), + .instance_size = sizeof(lv_keyboard_t), + .editable = 1, + .base_class = &lv_btnmatrix_class +}; + +static const char * const default_kb_map_lc[] = {"1#", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", LV_SYMBOL_BACKSPACE, "\n", + "ABC", "a", "s", "d", "f", "g", "h", "j", "k", "l", LV_SYMBOL_NEW_LINE, "\n", + "_", "-", "z", "x", "c", "v", "b", "n", "m", ".", ",", ":", "\n", + LV_SYMBOL_KEYBOARD, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, "" + }; + +static const lv_btnmatrix_ctrl_t default_kb_ctrl_lc_map[] = { + LV_KEYBOARD_CTRL_BTN_FLAGS | 5, LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_BTNMATRIX_CTRL_CHECKED | 7, + LV_KEYBOARD_CTRL_BTN_FLAGS | 6, LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_BTNMATRIX_CTRL_CHECKED | 7, + LV_BTNMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BTNMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_BTNMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BTNMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BTNMATRIX_CTRL_CHECKED | LV_KB_BTN(1), + LV_KEYBOARD_CTRL_BTN_FLAGS | 2, LV_BTNMATRIX_CTRL_CHECKED | 2, 6, LV_BTNMATRIX_CTRL_CHECKED | 2, LV_KEYBOARD_CTRL_BTN_FLAGS | 2 +}; + +static const char * const default_kb_map_uc[] = {"1#", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", LV_SYMBOL_BACKSPACE, "\n", + "abc", "A", "S", "D", "F", "G", "H", "J", "K", "L", LV_SYMBOL_NEW_LINE, "\n", + "_", "-", "Z", "X", "C", "V", "B", "N", "M", ".", ",", ":", "\n", + LV_SYMBOL_KEYBOARD, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, "" + }; + +static const lv_btnmatrix_ctrl_t default_kb_ctrl_uc_map[] = { + LV_KEYBOARD_CTRL_BTN_FLAGS | 5, LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_BTNMATRIX_CTRL_CHECKED | 7, + LV_KEYBOARD_CTRL_BTN_FLAGS | 6, LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_BTNMATRIX_CTRL_CHECKED | 7, + LV_BTNMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BTNMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_BTNMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BTNMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BTNMATRIX_CTRL_CHECKED | LV_KB_BTN(1), + LV_KEYBOARD_CTRL_BTN_FLAGS | 2, LV_BTNMATRIX_CTRL_CHECKED | 2, 6, LV_BTNMATRIX_CTRL_CHECKED | 2, LV_KEYBOARD_CTRL_BTN_FLAGS | 2 +}; + +static const char * const default_kb_map_spec[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", LV_SYMBOL_BACKSPACE, "\n", + "abc", "+", "-", "/", "*", "=", "%", "!", "?", "#", "<", ">", "\n", + "\\", "@", "$", "(", ")", "{", "}", "[", "]", ";", "\"", "'", "\n", + LV_SYMBOL_KEYBOARD, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, "" + }; + +static const lv_btnmatrix_ctrl_t default_kb_ctrl_spec_map[] = { + LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_BTNMATRIX_CTRL_CHECKED | 2, + LV_KEYBOARD_CTRL_BTN_FLAGS | 2, LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), + LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), + LV_KEYBOARD_CTRL_BTN_FLAGS | 2, LV_BTNMATRIX_CTRL_CHECKED | 2, 6, LV_BTNMATRIX_CTRL_CHECKED | 2, LV_KEYBOARD_CTRL_BTN_FLAGS | 2 +}; + +static const char * const default_kb_map_num[] = {"1", "2", "3", LV_SYMBOL_KEYBOARD, "\n", + "4", "5", "6", LV_SYMBOL_OK, "\n", + "7", "8", "9", LV_SYMBOL_BACKSPACE, "\n", + "+/-", "0", ".", LV_SYMBOL_LEFT, LV_SYMBOL_RIGHT, "" + }; + +static const lv_btnmatrix_ctrl_t default_kb_ctrl_num_map[] = { + 1, 1, 1, LV_KEYBOARD_CTRL_BTN_FLAGS | 2, + 1, 1, 1, LV_KEYBOARD_CTRL_BTN_FLAGS | 2, + 1, 1, 1, 2, + 1, 1, 1, 1, 1 +}; + +static const char * * kb_map[9] = { + (const char * *)default_kb_map_lc, + (const char * *)default_kb_map_uc, + (const char * *)default_kb_map_spec, + (const char * *)default_kb_map_num, + (const char * *)default_kb_map_lc, + (const char * *)default_kb_map_lc, + (const char * *)default_kb_map_lc, + (const char * *)default_kb_map_lc, + (const char * *)NULL, +}; +static const lv_btnmatrix_ctrl_t * kb_ctrl[9] = { + default_kb_ctrl_lc_map, + default_kb_ctrl_uc_map, + default_kb_ctrl_spec_map, + default_kb_ctrl_num_map, + default_kb_ctrl_lc_map, + default_kb_ctrl_lc_map, + default_kb_ctrl_lc_map, + default_kb_ctrl_lc_map, + NULL, +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Create a Keyboard object + * @param parent pointer to an object, it will be the parent of the new keyboard + * @return pointer to the created keyboard + */ +lv_obj_t * lv_keyboard_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_keyboard_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +/** + * Assign a Text Area to the Keyboard. The pressed characters will be put there. + * @param kb pointer to a Keyboard object + * @param ta pointer to a Text Area object to write there + */ +void lv_keyboard_set_textarea(lv_obj_t * obj, lv_obj_t * ta) +{ + if(ta) { + LV_ASSERT_OBJ(ta, &lv_textarea_class); + } + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + + /*Hide the cursor of the old Text area if cursor management is enabled*/ + if(keyboard->ta) { + lv_obj_clear_state(obj, LV_STATE_FOCUSED); + } + + keyboard->ta = ta; + + /*Show the cursor of the new Text area if cursor management is enabled*/ + if(keyboard->ta) { + lv_obj_add_flag(obj, LV_STATE_FOCUSED); + } +} + +/** + * Set a new a mode (text or number map) + * @param kb pointer to a Keyboard object + * @param mode the mode from 'lv_keyboard_mode_t' + */ +void lv_keyboard_set_mode(lv_obj_t * obj, lv_keyboard_mode_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + if(keyboard->mode == mode) return; + + keyboard->mode = mode; + lv_keyboard_update_map(obj); +} + +/** + * Show the button title in a popover when pressed. + * @param kb pointer to a Keyboard object + * @param en whether "popovers" mode is enabled + */ +void lv_keyboard_set_popovers(lv_obj_t * obj, bool en) +{ + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + + if(keyboard->popovers == en) { + return; + } + + keyboard->popovers = en; + lv_keyboard_update_ctrl_map(obj); +} + +/** + * Set a new map for the keyboard + * @param kb pointer to a Keyboard object + * @param mode keyboard map to alter 'lv_keyboard_mode_t' + * @param map pointer to a string array to describe the map. + * See 'lv_btnmatrix_set_map()' for more info. + */ +void lv_keyboard_set_map(lv_obj_t * obj, lv_keyboard_mode_t mode, const char * map[], + const lv_btnmatrix_ctrl_t ctrl_map[]) +{ + kb_map[mode] = map; + kb_ctrl[mode] = ctrl_map; + lv_keyboard_update_map(obj); +} + +/*===================== + * Getter functions + *====================*/ + +/** + * Assign a Text Area to the Keyboard. The pressed characters will be put there. + * @param kb pointer to a Keyboard object + * @return pointer to the assigned Text Area object + */ +lv_obj_t * lv_keyboard_get_textarea(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + return keyboard->ta; +} + +/** + * Set a new a mode (text or number map) + * @param kb pointer to a Keyboard object + * @return the current mode from 'lv_keyboard_mode_t' + */ +lv_keyboard_mode_t lv_keyboard_get_mode(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + return keyboard->mode; +} + +/** + * Tell whether "popovers" mode is enabled or not. + * @param kb pointer to a Keyboard object + * @return true: "popovers" mode is enabled; false: disabled + */ +bool lv_btnmatrix_get_popovers(const lv_obj_t * obj) +{ + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + return keyboard->popovers; +} + +/*===================== + * Other functions + *====================*/ + +/** + * Default keyboard event to add characters to the Text area and change the map. + * If a custom `event_cb` is added to the keyboard this function can be called from it to handle the + * button clicks + * @param kb pointer to a keyboard + * @param event the triggering event + */ +void lv_keyboard_def_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + uint16_t btn_id = lv_btnmatrix_get_selected_btn(obj); + if(btn_id == LV_BTNMATRIX_BTN_NONE) return; + + const char * txt = lv_btnmatrix_get_btn_text(obj, lv_btnmatrix_get_selected_btn(obj)); + if(txt == NULL) return; + + if(strcmp(txt, "abc") == 0) { + keyboard->mode = LV_KEYBOARD_MODE_TEXT_LOWER; + lv_btnmatrix_set_map(obj, kb_map[LV_KEYBOARD_MODE_TEXT_LOWER]); + lv_keyboard_update_ctrl_map(obj); + return; + } + else if(strcmp(txt, "ABC") == 0) { + keyboard->mode = LV_KEYBOARD_MODE_TEXT_UPPER; + lv_btnmatrix_set_map(obj, kb_map[LV_KEYBOARD_MODE_TEXT_UPPER]); + lv_keyboard_update_ctrl_map(obj); + return; + } + else if(strcmp(txt, "1#") == 0) { + keyboard->mode = LV_KEYBOARD_MODE_SPECIAL; + lv_btnmatrix_set_map(obj, kb_map[LV_KEYBOARD_MODE_SPECIAL]); + lv_keyboard_update_ctrl_map(obj); + return; + } + else if(strcmp(txt, LV_SYMBOL_CLOSE) == 0 || strcmp(txt, LV_SYMBOL_KEYBOARD) == 0) { + lv_res_t res = lv_event_send(obj, LV_EVENT_CANCEL, NULL); + if(res != LV_RES_OK) return; + + if(keyboard->ta) { + res = lv_event_send(keyboard->ta, LV_EVENT_CANCEL, NULL); + if(res != LV_RES_OK) return; + } + return; + } + else if(strcmp(txt, LV_SYMBOL_OK) == 0) { + lv_res_t res = lv_event_send(obj, LV_EVENT_READY, NULL); + if(res != LV_RES_OK) return; + + if(keyboard->ta) { + res = lv_event_send(keyboard->ta, LV_EVENT_READY, NULL); + if(res != LV_RES_OK) return; + } + return; + } + + /*Add the characters to the text area if set*/ + if(keyboard->ta == NULL) return; + + if(strcmp(txt, "Enter") == 0 || strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) { + lv_textarea_add_char(keyboard->ta, '\n'); + if(lv_textarea_get_one_line(keyboard->ta)) { + lv_res_t res = lv_event_send(keyboard->ta, LV_EVENT_READY, NULL); + if(res != LV_RES_OK) return; + } + } + else if(strcmp(txt, LV_SYMBOL_LEFT) == 0) { + lv_textarea_cursor_left(keyboard->ta); + } + else if(strcmp(txt, LV_SYMBOL_RIGHT) == 0) { + lv_textarea_cursor_right(keyboard->ta); + } + else if(strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) { + lv_textarea_del_char(keyboard->ta); + } + else if(strcmp(txt, "+/-") == 0) { + uint16_t cur = lv_textarea_get_cursor_pos(keyboard->ta); + const char * ta_txt = lv_textarea_get_text(keyboard->ta); + if(ta_txt[0] == '-') { + lv_textarea_set_cursor_pos(keyboard->ta, 1); + lv_textarea_del_char(keyboard->ta); + lv_textarea_add_char(keyboard->ta, '+'); + lv_textarea_set_cursor_pos(keyboard->ta, cur); + } + else if(ta_txt[0] == '+') { + lv_textarea_set_cursor_pos(keyboard->ta, 1); + lv_textarea_del_char(keyboard->ta); + lv_textarea_add_char(keyboard->ta, '-'); + lv_textarea_set_cursor_pos(keyboard->ta, cur); + } + else { + lv_textarea_set_cursor_pos(keyboard->ta, 0); + lv_textarea_add_char(keyboard->ta, '-'); + lv_textarea_set_cursor_pos(keyboard->ta, cur + 1); + } + } + else { + lv_textarea_add_text(keyboard->ta, txt); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_keyboard_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_obj_clear_flag(obj, LV_OBJ_FLAG_CLICK_FOCUSABLE); + + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + keyboard->ta = NULL; + keyboard->mode = LV_KEYBOARD_MODE_TEXT_LOWER; + keyboard->popovers = 0; + + lv_obj_align(obj, LV_ALIGN_BOTTOM_MID, 0, 0); + lv_obj_add_event_cb(obj, lv_keyboard_def_event_cb, LV_EVENT_VALUE_CHANGED, NULL); + lv_obj_set_style_base_dir(obj, LV_BASE_DIR_LTR, 0); + + lv_keyboard_update_map(obj); +} + +/** + * Update the key and control map for the current mode + * @param obj pointer to a keyboard object + */ +static void lv_keyboard_update_map(lv_obj_t * obj) +{ + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + lv_btnmatrix_set_map(obj, kb_map[keyboard->mode]); + lv_keyboard_update_ctrl_map(obj); +} + +/** + * Update the control map for the current mode + * @param obj pointer to a keyboard object + */ +static void lv_keyboard_update_ctrl_map(lv_obj_t * obj) +{ + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + + if(keyboard->popovers) { + /*Apply the current control map (already includes LV_BTNMATRIX_CTRL_POPOVER flags)*/ + lv_btnmatrix_set_ctrl_map(obj, kb_ctrl[keyboard->mode]); + } + else { + /*Make a copy of the current control map*/ + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj; + lv_btnmatrix_ctrl_t * ctrl_map = lv_mem_alloc(btnm->btn_cnt * sizeof(lv_btnmatrix_ctrl_t)); + lv_memcpy(ctrl_map, kb_ctrl[keyboard->mode], sizeof(lv_btnmatrix_ctrl_t) * btnm->btn_cnt); + + /*Remove all LV_BTNMATRIX_CTRL_POPOVER flags*/ + for(uint16_t i = 0; i < btnm->btn_cnt; i++) { + ctrl_map[i] &= (~LV_BTNMATRIX_CTRL_POPOVER); + } + + /*Apply new control map and clean up*/ + lv_btnmatrix_set_ctrl_map(obj, ctrl_map); + lv_mem_free(ctrl_map); + } +} + +#endif /*LV_USE_KEYBOARD*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/keyboard/lv_keyboard.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/keyboard/lv_keyboard.h new file mode 100644 index 0000000..7f65cd7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/keyboard/lv_keyboard.h @@ -0,0 +1,187 @@ +/** + * @file lv_keyboard.h + * + */ + +#ifndef LV_KEYBOARD_H +#define LV_KEYBOARD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../widgets/lv_btnmatrix.h" + +#if LV_USE_KEYBOARD + +/*Testing of dependencies*/ +#if LV_USE_BTNMATRIX == 0 +#error "lv_kb: lv_btnm is required. Enable it in lv_conf.h (LV_USE_BTNMATRIX 1) " +#endif + +#if LV_USE_TEXTAREA == 0 +#error "lv_kb: lv_ta is required. Enable it in lv_conf.h (LV_USE_TEXTAREA 1) " +#endif + +/********************* + * DEFINES + *********************/ +#define LV_KEYBOARD_CTRL_BTN_FLAGS (LV_BTNMATRIX_CTRL_NO_REPEAT | LV_BTNMATRIX_CTRL_CLICK_TRIG | LV_BTNMATRIX_CTRL_CHECKED) + +/********************** + * TYPEDEFS + **********************/ + +/** Current keyboard mode.*/ +enum { + LV_KEYBOARD_MODE_TEXT_LOWER, + LV_KEYBOARD_MODE_TEXT_UPPER, + LV_KEYBOARD_MODE_SPECIAL, + LV_KEYBOARD_MODE_NUMBER, + LV_KEYBOARD_MODE_USER_1, + LV_KEYBOARD_MODE_USER_2, + LV_KEYBOARD_MODE_USER_3, + LV_KEYBOARD_MODE_USER_4, +}; +typedef uint8_t lv_keyboard_mode_t; + +/*Data of keyboard*/ +typedef struct { + lv_btnmatrix_t btnm; + lv_obj_t * ta; /*Pointer to the assigned text area*/ + lv_keyboard_mode_t mode; /*Key map type*/ + uint8_t popovers : 1; /*Show button titles in popovers on press*/ +} lv_keyboard_t; + +extern const lv_obj_class_t lv_keyboard_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a Keyboard object + * @param parent pointer to an object, it will be the parent of the new keyboard + * @return pointer to the created keyboard + */ +lv_obj_t * lv_keyboard_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Assign a Text Area to the Keyboard. The pressed characters will be put there. + * @param kb pointer to a Keyboard object + * @param ta pointer to a Text Area object to write there + */ +void lv_keyboard_set_textarea(lv_obj_t * kb, lv_obj_t * ta); + +/** + * Set a new a mode (text or number map) + * @param kb pointer to a Keyboard object + * @param mode the mode from 'lv_keyboard_mode_t' + */ +void lv_keyboard_set_mode(lv_obj_t * kb, lv_keyboard_mode_t mode); + +/** + * Show the button title in a popover when pressed. + * @param kb pointer to a Keyboard object + * @param en whether "popovers" mode is enabled + */ +void lv_keyboard_set_popovers(lv_obj_t * kb, bool en); + +/** + * Set a new map for the keyboard + * @param kb pointer to a Keyboard object + * @param mode keyboard map to alter 'lv_keyboard_mode_t' + * @param map pointer to a string array to describe the map. + * See 'lv_btnmatrix_set_map()' for more info. + */ +void lv_keyboard_set_map(lv_obj_t * kb, lv_keyboard_mode_t mode, const char * map[], + const lv_btnmatrix_ctrl_t ctrl_map[]); + +/*===================== + * Getter functions + *====================*/ + +/** + * Assign a Text Area to the Keyboard. The pressed characters will be put there. + * @param kb pointer to a Keyboard object + * @return pointer to the assigned Text Area object + */ +lv_obj_t * lv_keyboard_get_textarea(const lv_obj_t * kb); + +/** + * Set a new a mode (text or number map) + * @param kb pointer to a Keyboard object + * @return the current mode from 'lv_keyboard_mode_t' + */ +lv_keyboard_mode_t lv_keyboard_get_mode(const lv_obj_t * kb); + +/** + * Tell whether "popovers" mode is enabled or not. + * @param kb pointer to a Keyboard object + * @return true: "popovers" mode is enabled; false: disabled + */ +bool lv_btnmatrix_get_popovers(const lv_obj_t * obj); + +/** + * Get the current map of a keyboard + * @param kb pointer to a keyboard object + * @return the current map + */ +static inline const char ** lv_keyboard_get_map_array(const lv_obj_t * kb) +{ + return lv_btnmatrix_get_map(kb); +} + +/** + * Get the index of the lastly "activated" button by the user (pressed, released, focused etc) + * Useful in the `event_cb` to get the text of the button, check if hidden etc. + * @param obj pointer to button matrix object + * @return index of the last released button (LV_BTNMATRIX_BTN_NONE: if unset) + */ +static inline uint16_t lv_keyboard_get_selected_btn(const lv_obj_t * obj) +{ + return lv_btnmatrix_get_selected_btn(obj); +} + +/** + * Get the button's text + * @param obj pointer to button matrix object + * @param btn_id the index a button not counting new line characters. + * @return text of btn_index` button + */ +static inline const char * lv_keyboard_get_btn_text(const lv_obj_t * obj, uint16_t btn_id) +{ + return lv_btnmatrix_get_btn_text(obj, btn_id); +} + +/*===================== + * Other functions + *====================*/ + +/** + * Default keyboard event to add characters to the Text area and change the map. + * If a custom `event_cb` is added to the keyboard this function can be called from it to handle the + * button clicks + * @param kb pointer to a keyboard + * @param event the triggering event + */ +void lv_keyboard_def_event_cb(lv_event_t * e); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_KEYBOARD*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_KEYBOARD_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/led/lv_led.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/led/lv_led.c new file mode 100644 index 0000000..88b7b87 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/led/lv_led.c @@ -0,0 +1,221 @@ +/** + * @file lv_led.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_led.h" +#if LV_USE_LED + +#include "../../../misc/lv_assert.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_led_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_led_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_led_event(const lv_obj_class_t * class_p, lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_led_class = { + .base_class = &lv_obj_class, + .constructor_cb = lv_led_constructor, + .width_def = LV_DPI_DEF / 5, + .height_def = LV_DPI_DEF / 5, + .event_cb = lv_led_event, + .instance_size = sizeof(lv_led_t), +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Create a led object + * @param parent pointer to an object, it will be the parent of the new led + * @return pointer to the created led + */ +lv_obj_t * lv_led_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the color of the LED + * @param led pointer to a LED object + * @param color the color of the LED + */ +void lv_led_set_color(lv_obj_t * obj, lv_color_t color) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_led_t * led = (lv_led_t *)obj; + led->color = color; + lv_obj_invalidate(obj); +} + +/** + * Set the brightness of a LED object + * @param led pointer to a LED object + * @param bright LV_LED_BRIGHT_MIN (max. dark) ... LV_LED_BRIGHT_MAX (max. light) + */ +void lv_led_set_brightness(lv_obj_t * obj, uint8_t bright) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_led_t * led = (lv_led_t *)obj; + if(led->bright == bright) return; + + led->bright = LV_CLAMP(LV_LED_BRIGHT_MIN, bright, LV_LED_BRIGHT_MAX); + + /*Invalidate the object there fore it will be redrawn*/ + lv_obj_invalidate(obj); +} + +/** + * Light on a LED + * @param led pointer to a LED object + */ +void lv_led_on(lv_obj_t * led) +{ + lv_led_set_brightness(led, LV_LED_BRIGHT_MAX); +} + +/** + * Light off a LED + * @param led pointer to a LED object + */ +void lv_led_off(lv_obj_t * led) +{ + lv_led_set_brightness(led, LV_LED_BRIGHT_MIN); +} + +/** + * Toggle the state of a LED + * @param led pointer to a LED object + */ +void lv_led_toggle(lv_obj_t * obj) +{ + uint8_t bright = lv_led_get_brightness(obj); + if(bright > (LV_LED_BRIGHT_MIN + LV_LED_BRIGHT_MAX) >> 1) + lv_led_off(obj); + else + lv_led_on(obj); +} + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the brightness of a LEd object + * @param led pointer to LED object + * @return bright 0 (max. dark) ... 255 (max. light) + */ +uint8_t lv_led_get_brightness(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_led_t * led = (lv_led_t *)obj; + return led->bright; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_led_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_led_t * led = (lv_led_t *)obj; + led->color = lv_theme_get_color_primary(obj); + led->bright = LV_LED_BRIGHT_MAX; +} + +static void lv_led_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_res_t res; + + /* Call the ancestor's event handler */ + lv_event_code_t code = lv_event_get_code(e); + if(code != LV_EVENT_DRAW_MAIN && code != LV_EVENT_DRAW_MAIN_END) { + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RES_OK) return; + } + + lv_obj_t * obj = lv_event_get_target(e); + if(code == LV_EVENT_DRAW_MAIN) { + /*Make darker colors in a temporary style according to the brightness*/ + lv_led_t * led = (lv_led_t *)obj; + + lv_draw_rect_dsc_t rect_dsc; + lv_draw_rect_dsc_init(&rect_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_MAIN, &rect_dsc); + + /*Use the original colors brightness to modify color->led*/ + rect_dsc.bg_color = lv_color_mix(led->color, lv_color_black(), lv_color_brightness(rect_dsc.bg_color)); + rect_dsc.bg_grad.stops[0].color = lv_color_mix(led->color, lv_color_black(), + lv_color_brightness(rect_dsc.bg_grad.stops[0].color)); + rect_dsc.bg_grad.stops[1].color = lv_color_mix(led->color, lv_color_black(), + lv_color_brightness(rect_dsc.bg_grad.stops[1].color)); + rect_dsc.shadow_color = lv_color_mix(led->color, lv_color_black(), lv_color_brightness(rect_dsc.shadow_color)); + rect_dsc.border_color = lv_color_mix(led->color, lv_color_black(), lv_color_brightness(rect_dsc.border_color)); + rect_dsc.outline_color = lv_color_mix(led->color, lv_color_black(), lv_color_brightness(rect_dsc.outline_color)); + + /*Mix. the color with black proportionally with brightness*/ + rect_dsc.bg_color = lv_color_mix(rect_dsc.bg_color, lv_color_black(), led->bright); + rect_dsc.bg_grad.stops[0].color = lv_color_mix(rect_dsc.bg_grad.stops[0].color, lv_color_black(), led->bright); + rect_dsc.bg_grad.stops[1].color = lv_color_mix(rect_dsc.bg_grad.stops[1].color, lv_color_black(), led->bright); + rect_dsc.border_color = lv_color_mix(rect_dsc.border_color, lv_color_black(), led->bright); + rect_dsc.shadow_color = lv_color_mix(rect_dsc.shadow_color, lv_color_black(), led->bright); + rect_dsc.outline_color = lv_color_mix(rect_dsc.outline_color, lv_color_black(), led->bright); + + /*Set the current shadow width according to brightness proportionally between LV_LED_BRIGHT_OFF + * and LV_LED_BRIGHT_ON*/ + rect_dsc.shadow_width = ((led->bright - LV_LED_BRIGHT_MIN) * rect_dsc.shadow_width) / + (LV_LED_BRIGHT_MAX - LV_LED_BRIGHT_MIN); + rect_dsc.shadow_spread = ((led->bright - LV_LED_BRIGHT_MIN) * rect_dsc.shadow_spread) / + (LV_LED_BRIGHT_MAX - LV_LED_BRIGHT_MIN); + + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + + lv_obj_draw_part_dsc_t part_draw_dsc; + lv_obj_draw_dsc_init(&part_draw_dsc, draw_ctx); + part_draw_dsc.draw_area = &obj->coords; + part_draw_dsc.class_p = MY_CLASS; + part_draw_dsc.type = LV_LED_DRAW_PART_RECTANGLE; + part_draw_dsc.rect_dsc = &rect_dsc; + part_draw_dsc.part = LV_PART_MAIN; + + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + lv_draw_rect(draw_ctx, &rect_dsc, &obj->coords); + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + } +} + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/led/lv_led.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/led/lv_led.h new file mode 100644 index 0000000..368bcd2 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/led/lv_led.h @@ -0,0 +1,116 @@ +/** + * @file lv_led.h + * + */ + +#ifndef LV_LED_H +#define LV_LED_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_LED + + +/********************* + * DEFINES + *********************/ +/** Brightness when the LED if OFF */ +#ifndef LV_LED_BRIGHT_MIN +# define LV_LED_BRIGHT_MIN 80 +#endif + +/** Brightness when the LED if ON */ +#ifndef LV_LED_BRIGHT_MAX +# define LV_LED_BRIGHT_MAX 255 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/*Data of led*/ +typedef struct { + lv_obj_t obj; + lv_color_t color; + uint8_t bright; /**< Current brightness of the LED (0..255)*/ +} lv_led_t; + +extern const lv_obj_class_t lv_led_class; + +/** + * `type` field in `lv_obj_draw_part_dsc_t` if `class_p = lv_led_class` + * Used in `LV_EVENT_DRAW_PART_BEGIN` and `LV_EVENT_DRAW_PART_END` + */ +typedef enum { + LV_LED_DRAW_PART_RECTANGLE, /**< The main rectangle*/ +} lv_led_draw_part_type_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a led object + * @param parent pointer to an object, it will be the parent of the new led + * @return pointer to the created led + */ +lv_obj_t * lv_led_create(lv_obj_t * parent); + +/** + * Set the color of the LED + * @param led pointer to a LED object + * @param color the color of the LED + */ +void lv_led_set_color(lv_obj_t * led, lv_color_t color); + +/** + * Set the brightness of a LED object + * @param led pointer to a LED object + * @param bright LV_LED_BRIGHT_MIN (max. dark) ... LV_LED_BRIGHT_MAX (max. light) + */ +void lv_led_set_brightness(lv_obj_t * led, uint8_t bright); + +/** + * Light on a LED + * @param led pointer to a LED object + */ +void lv_led_on(lv_obj_t * led); + +/** + * Light off a LED + * @param led pointer to a LED object + */ +void lv_led_off(lv_obj_t * led); + +/** + * Toggle the state of a LED + * @param led pointer to a LED object + */ +void lv_led_toggle(lv_obj_t * led); + +/** + * Get the brightness of a LEd object + * @param led pointer to LED object + * @return bright 0 (max. dark) ... 255 (max. light) + */ +uint8_t lv_led_get_brightness(const lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_LED*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + + +#endif /*LV_LED_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/list/lv_list.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/list/lv_list.c new file mode 100644 index 0000000..29355fd --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/list/lv_list.c @@ -0,0 +1,120 @@ +/** + * @file lv_list.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_list.h" +#include "../../../core/lv_disp.h" +#include "../../../widgets/lv_label.h" +#include "../../../widgets/lv_img.h" +#include "../../../widgets/lv_btn.h" + +#if LV_USE_LIST + +/********************* + * DEFINES + *********************/ +#define MV_CLASS &lv_list + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +const lv_obj_class_t lv_list_class = { + .base_class = &lv_obj_class, + .width_def = (LV_DPI_DEF * 3) / 2, + .height_def = LV_DPI_DEF * 2 +}; + +const lv_obj_class_t lv_list_btn_class = { + .base_class = &lv_btn_class, +}; + +const lv_obj_class_t lv_list_text_class = { + .base_class = &lv_label_class, +}; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_list_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_list_class, parent); + lv_obj_class_init_obj(obj); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); + return obj; +} + +lv_obj_t * lv_list_add_text(lv_obj_t * list, const char * txt) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_list_text_class, list); + lv_obj_class_init_obj(obj); + lv_label_set_text(obj, txt); + lv_label_set_long_mode(obj, LV_LABEL_LONG_SCROLL_CIRCULAR); + lv_obj_set_width(obj, LV_PCT(100)); + return obj; +} + +lv_obj_t * lv_list_add_btn(lv_obj_t * list, const void * icon, const char * txt) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_list_btn_class, list); + lv_obj_class_init_obj(obj); + lv_obj_set_size(obj, LV_PCT(100), LV_SIZE_CONTENT); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); + +#if LV_USE_IMG == 1 + if(icon) { + lv_obj_t * img = lv_img_create(obj); + lv_img_set_src(img, icon); + } +#endif + + if(txt) { + lv_obj_t * label = lv_label_create(obj); + lv_label_set_text(label, txt); + lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR); + lv_obj_set_flex_grow(label, 1); + } + + return obj; +} + +const char * lv_list_get_btn_text(lv_obj_t * list, lv_obj_t * btn) +{ + LV_UNUSED(list); + uint32_t i; + for(i = 0; i < lv_obj_get_child_cnt(btn); i++) { + lv_obj_t * child = lv_obj_get_child(btn, i); + if(lv_obj_check_type(child, &lv_label_class)) { + return lv_label_get_text(child); + } + + } + + return ""; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_LIST*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/list/lv_list.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/list/lv_list.h new file mode 100644 index 0000000..0da5595 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/list/lv_list.h @@ -0,0 +1,54 @@ +/** + * @file lv_win.h + * + */ + +#ifndef LV_LIST_H +#define LV_LIST_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../core/lv_obj.h" +#include "../../layouts/flex/lv_flex.h" + +#if LV_USE_LIST + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +extern const lv_obj_class_t lv_list_class; +extern const lv_obj_class_t lv_list_text_class; +extern const lv_obj_class_t lv_list_btn_class; +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_obj_t * lv_list_create(lv_obj_t * parent); + +lv_obj_t * lv_list_add_text(lv_obj_t * list, const char * txt); + +lv_obj_t * lv_list_add_btn(lv_obj_t * list, const void * icon, const char * txt); + +const char * lv_list_get_btn_text(lv_obj_t * list, lv_obj_t * btn); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_LIST*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LIST_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/lv_widgets.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/lv_widgets.h new file mode 100644 index 0000000..1141810 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/lv_widgets.h @@ -0,0 +1,56 @@ +/** + * @file lv_widgets.h + * + */ + +#ifndef LV_WIDGETS_H +#define LV_WIDGETS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "animimg/lv_animimg.h" +#include "calendar/lv_calendar.h" +#include "calendar/lv_calendar_header_arrow.h" +#include "calendar/lv_calendar_header_dropdown.h" +#include "chart/lv_chart.h" +#include "keyboard/lv_keyboard.h" +#include "list/lv_list.h" +#include "menu/lv_menu.h" +#include "msgbox/lv_msgbox.h" +#include "meter/lv_meter.h" +#include "spinbox/lv_spinbox.h" +#include "spinner/lv_spinner.h" +#include "tabview/lv_tabview.h" +#include "tileview/lv_tileview.h" +#include "win/lv_win.h" +#include "colorwheel/lv_colorwheel.h" +#include "led/lv_led.h" +#include "imgbtn/lv_imgbtn.h" +#include "span/lv_span.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_WIDGETS_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/menu/lv_menu.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/menu/lv_menu.c new file mode 100644 index 0000000..78577e7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/menu/lv_menu.c @@ -0,0 +1,767 @@ +/** + * @file lv_menu.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_menu.h" + +#if LV_USE_MENU + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_menu_class + +#include "../../../core/lv_obj.h" +#include "../../layouts/flex/lv_flex.h" +#include "../../../widgets/lv_label.h" +#include "../../../widgets/lv_btn.h" +#include "../../../widgets/lv_img.h" + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_menu_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_menu_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_menu_page_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_menu_page_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_menu_cont_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_menu_section_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); + +const lv_obj_class_t lv_menu_class = { + .constructor_cb = lv_menu_constructor, + .destructor_cb = lv_menu_destructor, + .base_class = &lv_obj_class, + .width_def = (LV_DPI_DEF * 3) / 2, + .height_def = LV_DPI_DEF * 2, + .instance_size = sizeof(lv_menu_t) +}; +const lv_obj_class_t lv_menu_page_class = { + .constructor_cb = lv_menu_page_constructor, + .destructor_cb = lv_menu_page_destructor, + .base_class = &lv_obj_class, + .width_def = LV_PCT(100), + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_menu_page_t) +}; + +const lv_obj_class_t lv_menu_cont_class = { + .constructor_cb = lv_menu_cont_constructor, + .base_class = &lv_obj_class, + .width_def = LV_PCT(100), + .height_def = LV_SIZE_CONTENT +}; + +const lv_obj_class_t lv_menu_section_class = { + .constructor_cb = lv_menu_section_constructor, + .base_class = &lv_obj_class, + .width_def = LV_PCT(100), + .height_def = LV_SIZE_CONTENT +}; + +const lv_obj_class_t lv_menu_separator_class = { + .base_class = &lv_obj_class, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT +}; + +const lv_obj_class_t lv_menu_sidebar_cont_class = { + .base_class = &lv_obj_class +}; + +const lv_obj_class_t lv_menu_main_cont_class = { + .base_class = &lv_obj_class +}; + +const lv_obj_class_t lv_menu_main_header_cont_class = { + .base_class = &lv_obj_class +}; + +const lv_obj_class_t lv_menu_sidebar_header_cont_class = { + .base_class = &lv_obj_class +}; + +static void lv_menu_refr(lv_obj_t * obj); +static void lv_menu_refr_sidebar_header_mode(lv_obj_t * obj); +static void lv_menu_refr_main_header_mode(lv_obj_t * obj); +static void lv_menu_load_page_event_cb(lv_event_t * e); +static void lv_menu_obj_del_event_cb(lv_event_t * e); +static void lv_menu_back_event_cb(lv_event_t * e); +static void lv_menu_value_changed_event_cb(lv_event_t * e); +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +bool lv_menu_item_back_btn_is_root(lv_obj_t * menu, lv_obj_t * obj); +void lv_menu_clear_history(lv_obj_t * obj); + +lv_obj_t * lv_menu_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +lv_obj_t * lv_menu_page_create(lv_obj_t * parent, char * title) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_menu_page_class, parent); + lv_obj_class_init_obj(obj); + + lv_menu_page_t * page = (lv_menu_page_t *)obj; + if(title) { + page->title = lv_mem_alloc(strlen(title) + 1); + LV_ASSERT_MALLOC(page->title); + if(page->title == NULL) return NULL; + strcpy(page->title, title); + } + else { + page->title = NULL; + } + + return obj; +} + +lv_obj_t * lv_menu_cont_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_menu_cont_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +lv_obj_t * lv_menu_section_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_menu_section_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +lv_obj_t * lv_menu_separator_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_menu_separator_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +void lv_menu_refr(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + lv_ll_t * history_ll = &(menu->history_ll); + + /* The current menu */ + lv_menu_history_t * act_hist = _lv_ll_get_head(history_ll); + + lv_obj_t * page = NULL; + + if(act_hist != NULL) { + page = act_hist->page; + /* Delete the current item from the history */ + _lv_ll_remove(history_ll, act_hist); + lv_mem_free(act_hist); + menu->cur_depth--; + } + + /* Set it */ + lv_menu_set_page(obj, page); +} + +/*===================== + * Setter functions + *====================*/ + +void lv_menu_set_page(lv_obj_t * obj, lv_obj_t * page) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + + /* Hide previous page */ + if(menu->main_page != NULL) { + lv_obj_set_parent(menu->main_page, menu->storage); + } + + if(page != NULL) { + /* Add a new node */ + lv_ll_t * history_ll = &(menu->history_ll); + lv_menu_history_t * new_node = _lv_ll_ins_head(history_ll); + LV_ASSERT_MALLOC(new_node); + new_node->page = page; + menu->cur_depth++; + + /* Place page in main */ + lv_obj_set_parent(page, menu->main); + } + else { + /* Empty page, clear history */ + lv_menu_clear_history(obj); + } + + menu->main_page = page; + + /* If there is a selected tab, update checked state */ + if(menu->selected_tab != NULL) { + if(menu->sidebar_page != NULL) { + lv_obj_add_state(menu->selected_tab, LV_STATE_CHECKED); + } + else { + lv_obj_clear_state(menu->selected_tab, LV_STATE_CHECKED); + } + } + + /* Back btn management */ + if(menu->sidebar_page != NULL) { + /* With sidebar enabled */ + if(menu->sidebar_generated) { + if(menu->mode_root_back_btn == LV_MENU_ROOT_BACK_BTN_ENABLED) { + /* Root back btn is always shown if enabled*/ + lv_obj_clear_flag(menu->sidebar_header_back_btn, LV_OBJ_FLAG_HIDDEN); + lv_obj_add_flag(menu->sidebar_header_back_btn, LV_OBJ_FLAG_CLICKABLE); + } + else { + lv_obj_add_flag(menu->sidebar_header_back_btn, LV_OBJ_FLAG_HIDDEN); + lv_obj_clear_flag(menu->sidebar_header_back_btn, LV_OBJ_FLAG_CLICKABLE); + } + } + + if(menu->cur_depth >= 2) { + lv_obj_clear_flag(menu->main_header_back_btn, LV_OBJ_FLAG_HIDDEN); + lv_obj_add_flag(menu->main_header_back_btn, LV_OBJ_FLAG_CLICKABLE); + } + else { + lv_obj_add_flag(menu->main_header_back_btn, LV_OBJ_FLAG_HIDDEN); + lv_obj_clear_flag(menu->main_header_back_btn, LV_OBJ_FLAG_CLICKABLE); + } + } + else { + /* With sidebar disabled */ + if(menu->cur_depth >= 2 || menu->mode_root_back_btn == LV_MENU_ROOT_BACK_BTN_ENABLED) { + lv_obj_clear_flag(menu->main_header_back_btn, LV_OBJ_FLAG_HIDDEN); + lv_obj_add_flag(menu->main_header_back_btn, LV_OBJ_FLAG_CLICKABLE); + } + else { + lv_obj_add_flag(menu->main_header_back_btn, LV_OBJ_FLAG_HIDDEN); + lv_obj_clear_flag(menu->main_header_back_btn, LV_OBJ_FLAG_CLICKABLE); + } + } + + lv_event_send((lv_obj_t *)menu, LV_EVENT_VALUE_CHANGED, NULL); + + lv_menu_refr_main_header_mode(obj); +} + +void lv_menu_set_sidebar_page(lv_obj_t * obj, lv_obj_t * page) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + + /* Sidebar management*/ + if(page != NULL) { + /* Sidebar should be enabled */ + if(!menu->sidebar_generated) { + /* Create sidebar */ + lv_obj_t * sidebar_cont = lv_obj_class_create_obj(&lv_menu_sidebar_cont_class, obj); + lv_obj_class_init_obj(sidebar_cont); + lv_obj_move_to_index(sidebar_cont, 1); + lv_obj_set_size(sidebar_cont, LV_PCT(30), LV_PCT(100)); + lv_obj_set_flex_flow(sidebar_cont, LV_FLEX_FLOW_COLUMN); + lv_obj_add_flag(sidebar_cont, LV_OBJ_FLAG_EVENT_BUBBLE); + lv_obj_clear_flag(sidebar_cont, LV_OBJ_FLAG_CLICKABLE); + menu->sidebar = sidebar_cont; + + lv_obj_t * sidebar_header = lv_obj_class_create_obj(&lv_menu_sidebar_header_cont_class, sidebar_cont); + lv_obj_class_init_obj(sidebar_header); + lv_obj_set_size(sidebar_header, LV_PCT(100), LV_SIZE_CONTENT); + lv_obj_set_flex_flow(sidebar_header, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(sidebar_header, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_clear_flag(sidebar_header, LV_OBJ_FLAG_CLICKABLE); + lv_obj_add_flag(sidebar_header, LV_OBJ_FLAG_EVENT_BUBBLE); + menu->sidebar_header = sidebar_header; + + lv_obj_t * sidebar_header_back_btn = lv_btn_create(menu->sidebar_header); + lv_obj_add_event_cb(sidebar_header_back_btn, lv_menu_back_event_cb, LV_EVENT_CLICKED, menu); + lv_obj_add_flag(sidebar_header_back_btn, LV_OBJ_FLAG_EVENT_BUBBLE); + lv_obj_set_flex_flow(sidebar_header_back_btn, LV_FLEX_FLOW_ROW); + menu->sidebar_header_back_btn = sidebar_header_back_btn; + + lv_obj_t * sidebar_header_back_icon = lv_img_create(menu->sidebar_header_back_btn); + lv_img_set_src(sidebar_header_back_icon, LV_SYMBOL_LEFT); + + lv_obj_t * sidebar_header_title = lv_label_create(menu->sidebar_header); + lv_obj_add_flag(sidebar_header_title, LV_OBJ_FLAG_HIDDEN); + menu->sidebar_header_title = sidebar_header_title; + + menu->sidebar_generated = true; + } + + lv_obj_set_parent(page, menu->sidebar); + + lv_menu_refr_sidebar_header_mode(obj); + } + else { + /* Sidebar should be disabled */ + if(menu->sidebar_generated) { + lv_obj_set_parent(menu->sidebar_page, menu->storage); + lv_obj_del(menu->sidebar); + + menu->sidebar_generated = false; + } + } + + menu->sidebar_page = page; + lv_menu_refr(obj); +} + +void lv_menu_set_mode_header(lv_obj_t * obj, lv_menu_mode_header_t mode_header) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + + if(menu->mode_header != mode_header) { + menu->mode_header = mode_header; + lv_menu_refr_main_header_mode(obj); + if(menu->sidebar_generated) lv_menu_refr_sidebar_header_mode(obj); + } +} + +void lv_menu_set_mode_root_back_btn(lv_obj_t * obj, lv_menu_mode_root_back_btn_t mode_root_back_btn) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + + if(menu->mode_root_back_btn != mode_root_back_btn) { + menu->mode_root_back_btn = mode_root_back_btn; + lv_menu_refr(obj); + } +} + +void lv_menu_set_load_page_event(lv_obj_t * menu, lv_obj_t * obj, lv_obj_t * page) +{ + LV_ASSERT_OBJ(menu, MY_CLASS); + + lv_obj_add_flag(obj, LV_OBJ_FLAG_CLICKABLE); + lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + + /* Remove old event */ + if(lv_obj_remove_event_cb(obj, lv_menu_load_page_event_cb)) { + lv_event_send(obj, LV_EVENT_DELETE, NULL); + lv_obj_remove_event_cb(obj, lv_menu_obj_del_event_cb); + } + + lv_menu_load_page_event_data_t * event_data = lv_mem_alloc(sizeof(lv_menu_load_page_event_data_t)); + event_data->menu = menu; + event_data->page = page; + + lv_obj_add_event_cb(obj, lv_menu_load_page_event_cb, LV_EVENT_CLICKED, event_data); + lv_obj_add_event_cb(obj, lv_menu_obj_del_event_cb, LV_EVENT_DELETE, event_data); +} + +/*===================== + * Getter functions + *====================*/ +lv_obj_t * lv_menu_get_cur_main_page(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + return menu->main_page; +} + +lv_obj_t * lv_menu_get_cur_sidebar_page(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + return menu->sidebar_page; +} + +lv_obj_t * lv_menu_get_main_header(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + return menu->main_header; +} + +lv_obj_t * lv_menu_get_main_header_back_btn(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + return menu->main_header_back_btn; +} + +lv_obj_t * lv_menu_get_sidebar_header(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + return menu->sidebar_header; +} + +lv_obj_t * lv_menu_get_sidebar_header_back_btn(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + return menu->sidebar_header_back_btn; +} + +bool lv_menu_back_btn_is_root(lv_obj_t * menu, lv_obj_t * obj) +{ + LV_ASSERT_OBJ(menu, MY_CLASS); + + if(obj == ((lv_menu_t *)menu)->sidebar_header_back_btn) { + return true; + } + + if(obj == ((lv_menu_t *)menu)->main_header_back_btn && ((lv_menu_t *)menu)->prev_depth <= 1) { + return true; + } + + return false; +} + +void lv_menu_clear_history(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + lv_ll_t * history_ll = &(menu->history_ll); + + _lv_ll_clear(history_ll); + + menu->cur_depth = 0; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_menu_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_obj_set_layout(obj, LV_LAYOUT_FLEX); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); + + lv_menu_t * menu = (lv_menu_t *)obj; + + menu->mode_header = LV_MENU_HEADER_TOP_FIXED; + menu->mode_root_back_btn = LV_MENU_ROOT_BACK_BTN_DISABLED; + menu->cur_depth = 0; + menu->prev_depth = 0; + menu->sidebar_generated = false; + + _lv_ll_init(&(menu->history_ll), sizeof(lv_menu_history_t)); + + menu->storage = lv_obj_create(obj); + lv_obj_add_flag(menu->storage, LV_OBJ_FLAG_HIDDEN); + + menu->sidebar = NULL; + menu->sidebar_header = NULL; + menu->sidebar_header_back_btn = NULL; + menu->sidebar_header_title = NULL; + menu->sidebar_page = NULL; + + lv_obj_t * main_cont = lv_obj_class_create_obj(&lv_menu_main_cont_class, obj); + lv_obj_class_init_obj(main_cont); + lv_obj_set_height(main_cont, LV_PCT(100)); + lv_obj_set_flex_grow(main_cont, 1); + lv_obj_set_flex_flow(main_cont, LV_FLEX_FLOW_COLUMN); + lv_obj_add_flag(main_cont, LV_OBJ_FLAG_EVENT_BUBBLE); + lv_obj_clear_flag(main_cont, LV_OBJ_FLAG_CLICKABLE); + menu->main = main_cont; + + lv_obj_t * main_header = lv_obj_class_create_obj(&lv_menu_main_header_cont_class, main_cont); + lv_obj_class_init_obj(main_header); + lv_obj_set_size(main_header, LV_PCT(100), LV_SIZE_CONTENT); + lv_obj_set_flex_flow(main_header, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(main_header, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_clear_flag(main_header, LV_OBJ_FLAG_CLICKABLE); + lv_obj_add_flag(main_header, LV_OBJ_FLAG_EVENT_BUBBLE); + menu->main_header = main_header; + + /* Create the default simple back btn and title */ + lv_obj_t * main_header_back_btn = lv_btn_create(menu->main_header); + lv_obj_add_event_cb(main_header_back_btn, lv_menu_back_event_cb, LV_EVENT_CLICKED, menu); + lv_obj_add_flag(main_header_back_btn, LV_OBJ_FLAG_EVENT_BUBBLE); + lv_obj_set_flex_flow(main_header_back_btn, LV_FLEX_FLOW_ROW); + menu->main_header_back_btn = main_header_back_btn; + + lv_obj_t * main_header_back_icon = lv_img_create(menu->main_header_back_btn); + lv_img_set_src(main_header_back_icon, LV_SYMBOL_LEFT); + + lv_obj_t * main_header_title = lv_label_create(menu->main_header); + lv_obj_add_flag(main_header_title, LV_OBJ_FLAG_HIDDEN); + menu->main_header_title = main_header_title; + + menu->main_page = NULL; + menu->selected_tab = NULL; + + lv_obj_add_event_cb(obj, lv_menu_value_changed_event_cb, LV_EVENT_VALUE_CHANGED, menu); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_menu_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_menu_t * menu = (lv_menu_t *)obj; + lv_ll_t * history_ll = &(menu->history_ll); + + _lv_ll_clear(history_ll); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_menu_page_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + lv_menu_t * menu = (lv_menu_t *)lv_obj_get_parent(obj); + + lv_obj_set_parent(obj, ((lv_menu_t *)menu)->storage); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_align(obj, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_add_flag(obj, LV_OBJ_FLAG_EVENT_BUBBLE); +} + +static void lv_menu_page_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + lv_menu_page_t * page = (lv_menu_page_t *)obj; + + if(page->title != NULL) { + lv_mem_free(page->title); + page->title = NULL; + } +} + +static void lv_menu_cont_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(obj, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_clear_flag(obj, LV_OBJ_FLAG_CLICKABLE); +} + +static void lv_menu_section_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); + lv_obj_clear_flag(obj, LV_OBJ_FLAG_CLICKABLE); +} + +static void lv_menu_refr_sidebar_header_mode(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + + if(menu->sidebar_header == NULL || menu->sidebar_page == NULL) return; + + switch(menu->mode_header) { + case LV_MENU_HEADER_TOP_FIXED: + /* Content should fill the remaining space */ + lv_obj_move_to_index(menu->sidebar_header, 0); + lv_obj_set_flex_grow(menu->sidebar_page, 1); + break; + case LV_MENU_HEADER_TOP_UNFIXED: + lv_obj_move_to_index(menu->sidebar_header, 0); + lv_obj_set_flex_grow(menu->sidebar_page, 0); + break; + case LV_MENU_HEADER_BOTTOM_FIXED: + lv_obj_move_to_index(menu->sidebar_header, 1); + lv_obj_set_flex_grow(menu->sidebar_page, 1); + break; + } + + lv_obj_refr_size(menu->sidebar_header); + lv_obj_refr_size(menu->sidebar_page); + + if(lv_obj_get_content_height(menu->sidebar_header) == 0) { + lv_obj_add_flag(menu->sidebar_header, LV_OBJ_FLAG_HIDDEN); + } + else { + lv_obj_clear_flag(menu->sidebar_header, LV_OBJ_FLAG_HIDDEN); + } +} + +static void lv_menu_refr_main_header_mode(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + + if(menu->main_header == NULL || menu->main_page == NULL) return; + + switch(menu->mode_header) { + case LV_MENU_HEADER_TOP_FIXED: + /* Content should fill the remaining space */ + lv_obj_move_to_index(menu->main_header, 0); + lv_obj_set_flex_grow(menu->main_page, 1); + break; + case LV_MENU_HEADER_TOP_UNFIXED: + lv_obj_move_to_index(menu->main_header, 0); + lv_obj_set_flex_grow(menu->main_page, 0); + break; + case LV_MENU_HEADER_BOTTOM_FIXED: + lv_obj_move_to_index(menu->main_header, 1); + lv_obj_set_flex_grow(menu->main_page, 1); + break; + } + + lv_obj_refr_size(menu->main_header); + lv_obj_refr_size(menu->main_page); + lv_obj_update_layout(menu->main_header); + + if(lv_obj_get_content_height(menu->main_header) == 0) { + lv_obj_add_flag(menu->main_header, LV_OBJ_FLAG_HIDDEN); + } + else { + lv_obj_clear_flag(menu->main_header, LV_OBJ_FLAG_HIDDEN); + } +} + +static void lv_menu_load_page_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + lv_menu_load_page_event_data_t * event_data = lv_event_get_user_data(e); + lv_menu_t * menu = (lv_menu_t *)(event_data->menu); + lv_obj_t * page = event_data->page; + + if(menu->sidebar_page != NULL) { + /* Check if clicked obj is in the sidebar */ + bool sidebar = false; + lv_obj_t * parent = obj; + + while(parent) { + if(parent == (lv_obj_t *)menu) break; + if(parent == menu->sidebar) { + sidebar = true; + break; + } + parent = lv_obj_get_parent(parent); + } + + if(sidebar) { + /* Clear checked state of previous obj */ + if(menu->selected_tab != obj && menu->selected_tab != NULL) { + lv_obj_clear_state(menu->selected_tab, LV_STATE_CHECKED); + } + + lv_menu_clear_history((lv_obj_t *)menu); + + menu->selected_tab = obj; + } + } + + lv_menu_set_page((lv_obj_t *)menu, page); + + if(lv_group_get_default() != NULL && menu->sidebar_page == NULL) { + /* Sidebar is not supported for now*/ + lv_group_focus_next(lv_group_get_default()); + } +} + +static void lv_menu_obj_del_event_cb(lv_event_t * e) +{ + lv_menu_load_page_event_data_t * event_data = lv_event_get_user_data(e); + lv_mem_free(event_data); +} + +static void lv_menu_back_event_cb(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + /* LV_EVENT_CLICKED */ + if(code == LV_EVENT_CLICKED) { + lv_obj_t * obj = lv_event_get_target(e); + lv_menu_t * menu = (lv_menu_t *)lv_event_get_user_data(e); + + if(!(obj == menu->main_header_back_btn || obj == menu->sidebar_header_back_btn)) return; + + menu->prev_depth = menu->cur_depth; /* Save the previous value for user event handler */ + + if(lv_menu_back_btn_is_root((lv_obj_t *)menu, obj)) return; + + lv_ll_t * history_ll = &(menu->history_ll); + + /* The current menu */ + lv_menu_history_t * act_hist = _lv_ll_get_head(history_ll); + + /* The previous menu */ + lv_menu_history_t * prev_hist = _lv_ll_get_next(history_ll, act_hist); + + if(prev_hist != NULL) { + /* Previous menu exists */ + /* Delete the current item from the history */ + _lv_ll_remove(history_ll, act_hist); + lv_mem_free(act_hist); + menu->cur_depth--; + /* Create the previous menu. + * Remove it from the history because `lv_menu_set_page` will add it again */ + _lv_ll_remove(history_ll, prev_hist); + menu->cur_depth--; + lv_menu_set_page(&(menu->obj), prev_hist->page); + + lv_mem_free(prev_hist); + } + } +} + +static void lv_menu_value_changed_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_user_data(e); + lv_menu_t * menu = (lv_menu_t *)obj; + + lv_menu_page_t * main_page = (lv_menu_page_t *)lv_menu_get_cur_main_page(obj); + if(main_page != NULL && menu->main_header_title != NULL) { + if(main_page->title != NULL) { + lv_label_set_text(menu->main_header_title, main_page->title); + lv_obj_clear_flag(menu->main_header_title, LV_OBJ_FLAG_HIDDEN); + } + else { + lv_obj_add_flag(menu->main_header_title, LV_OBJ_FLAG_HIDDEN); + } + } + + lv_menu_page_t * sidebar_page = (lv_menu_page_t *)lv_menu_get_cur_sidebar_page(obj); + if(sidebar_page != NULL && menu->sidebar_header_title != NULL) { + if(sidebar_page->title != NULL) { + lv_label_set_text(menu->sidebar_header_title, sidebar_page->title); + lv_obj_clear_flag(menu->sidebar_header_title, LV_OBJ_FLAG_HIDDEN); + } + else { + lv_obj_add_flag(menu->sidebar_header_title, LV_OBJ_FLAG_HIDDEN); + } + } +} +#endif /*LV_USE_MENU*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/menu/lv_menu.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/menu/lv_menu.h new file mode 100644 index 0000000..0449059 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/menu/lv_menu.h @@ -0,0 +1,233 @@ +/** + * @file lv_menu.h + * + */ + +#ifndef LV_MENU_H +#define LV_MENU_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../core/lv_obj.h" + +#if LV_USE_MENU + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +enum { + LV_MENU_HEADER_TOP_FIXED, /* Header is positioned at the top */ + LV_MENU_HEADER_TOP_UNFIXED, /* Header is positioned at the top and can be scrolled out of view*/ + LV_MENU_HEADER_BOTTOM_FIXED /* Header is positioned at the bottom */ +}; +typedef uint8_t lv_menu_mode_header_t; + +enum { + LV_MENU_ROOT_BACK_BTN_DISABLED, + LV_MENU_ROOT_BACK_BTN_ENABLED +}; +typedef uint8_t lv_menu_mode_root_back_btn_t; + +typedef struct lv_menu_load_page_event_data_t { + lv_obj_t * menu; + lv_obj_t * page; +} lv_menu_load_page_event_data_t; + +typedef struct { + lv_obj_t * page; +} lv_menu_history_t; + +typedef struct { + lv_obj_t obj; + lv_obj_t * storage; /* a pointer to obj that is the parent of all pages not displayed */ + lv_obj_t * main; + lv_obj_t * main_page; + lv_obj_t * main_header; + lv_obj_t * + main_header_back_btn; /* a pointer to obj that on click triggers back btn event handler, can be same as 'main_header' */ + lv_obj_t * main_header_title; + lv_obj_t * sidebar; + lv_obj_t * sidebar_page; + lv_obj_t * sidebar_header; + lv_obj_t * + sidebar_header_back_btn; /* a pointer to obj that on click triggers back btn event handler, can be same as 'sidebar_header' */ + lv_obj_t * sidebar_header_title; + lv_obj_t * selected_tab; + lv_ll_t history_ll; + uint8_t cur_depth; + uint8_t prev_depth; + uint8_t sidebar_generated : 1; + lv_menu_mode_header_t mode_header : 2; + lv_menu_mode_root_back_btn_t mode_root_back_btn : 1; +} lv_menu_t; + +typedef struct { + lv_obj_t obj; + char * title; +} lv_menu_page_t; + +extern const lv_obj_class_t lv_menu_class; +extern const lv_obj_class_t lv_menu_page_class; +extern const lv_obj_class_t lv_menu_cont_class; +extern const lv_obj_class_t lv_menu_section_class; +extern const lv_obj_class_t lv_menu_separator_class; +extern const lv_obj_class_t lv_menu_sidebar_cont_class; +extern const lv_obj_class_t lv_menu_main_cont_class; +extern const lv_obj_class_t lv_menu_sidebar_header_cont_class; +extern const lv_obj_class_t lv_menu_main_header_cont_class; +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a menu object + * @param parent pointer to an object, it will be the parent of the new menu + * @return pointer to the created menu + */ +lv_obj_t * lv_menu_create(lv_obj_t * parent); + +/** + * Create a menu page object + * @param parent pointer to menu object + * @param title pointer to text for title in header (NULL to not display title) + * @return pointer to the created menu page + */ +lv_obj_t * lv_menu_page_create(lv_obj_t * parent, char * title); + +/** + * Create a menu cont object + * @param parent pointer to an object, it will be the parent of the new menu cont object + * @return pointer to the created menu cont + */ +lv_obj_t * lv_menu_cont_create(lv_obj_t * parent); + +/** + * Create a menu section object + * @param parent pointer to an object, it will be the parent of the new menu section object + * @return pointer to the created menu section + */ +lv_obj_t * lv_menu_section_create(lv_obj_t * parent); + +/** + * Create a menu separator object + * @param parent pointer to an object, it will be the parent of the new menu separator object + * @return pointer to the created menu separator + */ +lv_obj_t * lv_menu_separator_create(lv_obj_t * parent); +/*===================== + * Setter functions + *====================*/ +/** + * Set menu page to display in main + * @param obj pointer to the menu + * @param page pointer to the menu page to set (NULL to clear main and clear menu history) + */ +void lv_menu_set_page(lv_obj_t * obj, lv_obj_t * page); + +/** + * Set menu page to display in sidebar + * @param obj pointer to the menu + * @param page pointer to the menu page to set (NULL to clear sidebar) + */ +void lv_menu_set_sidebar_page(lv_obj_t * obj, lv_obj_t * page); + +/** + * Set the how the header should behave and its position + * @param obj pointer to a menu + * @param mode_header + */ +void lv_menu_set_mode_header(lv_obj_t * obj, lv_menu_mode_header_t mode_header); + +/** + * Set whether back button should appear at root + * @param obj pointer to a menu + * @param mode_root_back_btn + */ +void lv_menu_set_mode_root_back_btn(lv_obj_t * obj, lv_menu_mode_root_back_btn_t mode_root_back_btn); + +/** + * Add menu to the menu item + * @param menu pointer to the menu + * @param obj pointer to the obj + * @param page pointer to the page to load when obj is clicked + */ +void lv_menu_set_load_page_event(lv_obj_t * menu, lv_obj_t * obj, lv_obj_t * page); + +/*===================== + * Getter functions + *====================*/ +/** +* Get a pointer to menu page that is currently displayed in main +* @param obj pointer to the menu +* @return pointer to current page +*/ +lv_obj_t * lv_menu_get_cur_main_page(lv_obj_t * obj); + +/** +* Get a pointer to menu page that is currently displayed in sidebar +* @param obj pointer to the menu +* @return pointer to current page +*/ +lv_obj_t * lv_menu_get_cur_sidebar_page(lv_obj_t * obj); + +/** +* Get a pointer to main header obj +* @param obj pointer to the menu +* @return pointer to main header obj +*/ +lv_obj_t * lv_menu_get_main_header(lv_obj_t * obj); + +/** +* Get a pointer to main header back btn obj +* @param obj pointer to the menu +* @return pointer to main header back btn obj +*/ +lv_obj_t * lv_menu_get_main_header_back_btn(lv_obj_t * obj); + +/** +* Get a pointer to sidebar header obj +* @param obj pointer to the menu +* @return pointer to sidebar header obj +*/ +lv_obj_t * lv_menu_get_sidebar_header(lv_obj_t * obj); + +/** +* Get a pointer to sidebar header obj +* @param obj pointer to the menu +* @return pointer to sidebar header back btn obj +*/ +lv_obj_t * lv_menu_get_sidebar_header_back_btn(lv_obj_t * obj); + +/** + * Check if an obj is a root back btn + * @param menu pointer to the menu + * @return true if it is a root back btn + */ +bool lv_menu_back_btn_is_root(lv_obj_t * menu, lv_obj_t * obj); + +/** + * Clear menu history + * @param obj pointer to the menu + */ +void lv_menu_clear_history(lv_obj_t * obj); +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_MENU*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_MENU_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/meter/lv_meter.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/meter/lv_meter.c new file mode 100644 index 0000000..668ab97 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/meter/lv_meter.c @@ -0,0 +1,697 @@ +/** + * @file lv_meter.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_meter.h" +#if LV_USE_METER != 0 + +#include "../../../misc/lv_assert.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_meter_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_meter_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_meter_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_meter_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_arcs(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, const lv_area_t * scale_area); +static void draw_ticks_and_labels(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, const lv_area_t * scale_area); +static void draw_needles(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, const lv_area_t * scale_area); +static void inv_arc(lv_obj_t * obj, lv_meter_indicator_t * indic, int32_t old_value, int32_t new_value); +static void inv_line(lv_obj_t * obj, lv_meter_indicator_t * indic, int32_t value); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_meter_class = { + .constructor_cb = lv_meter_constructor, + .destructor_cb = lv_meter_destructor, + .event_cb = lv_meter_event, + .instance_size = sizeof(lv_meter_t), + .base_class = &lv_obj_class +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_meter_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Add scale + *====================*/ + +lv_meter_scale_t * lv_meter_add_scale(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_meter_t * meter = (lv_meter_t *)obj; + + lv_meter_scale_t * scale = _lv_ll_ins_head(&meter->scale_ll); + LV_ASSERT_MALLOC(scale); + lv_memset_00(scale, sizeof(lv_meter_scale_t)); + + scale->angle_range = 270; + scale->rotation = 90 + (360 - scale->angle_range) / 2; + scale->min = 0; + scale->max = 100; + scale->tick_cnt = 6; + scale->tick_length = 8; + scale->tick_width = 2; + scale->label_gap = 2; + + return scale; +} + +void lv_meter_set_scale_ticks(lv_obj_t * obj, lv_meter_scale_t * scale, uint16_t cnt, uint16_t width, uint16_t len, + lv_color_t color) +{ + scale->tick_cnt = cnt; + scale->tick_width = width; + scale->tick_length = len; + scale->tick_color = color; + lv_obj_invalidate(obj); +} + +void lv_meter_set_scale_major_ticks(lv_obj_t * obj, lv_meter_scale_t * scale, uint16_t nth, uint16_t width, + uint16_t len, lv_color_t color, int16_t label_gap) +{ + scale->tick_major_nth = nth; + scale->tick_major_width = width; + scale->tick_major_length = len; + scale->tick_major_color = color; + scale->label_gap = label_gap; + lv_obj_invalidate(obj); +} + +void lv_meter_set_scale_range(lv_obj_t * obj, lv_meter_scale_t * scale, int32_t min, int32_t max, uint32_t angle_range, + uint32_t rotation) +{ + scale->min = min; + scale->max = max; + scale->angle_range = angle_range; + scale->rotation = rotation; + lv_obj_invalidate(obj); +} + +/*===================== + * Add indicator + *====================*/ + +lv_meter_indicator_t * lv_meter_add_needle_line(lv_obj_t * obj, lv_meter_scale_t * scale, uint16_t width, + lv_color_t color, int16_t r_mod) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_meter_t * meter = (lv_meter_t *)obj; + lv_meter_indicator_t * indic = _lv_ll_ins_head(&meter->indicator_ll); + LV_ASSERT_MALLOC(indic); + lv_memset_00(indic, sizeof(lv_meter_indicator_t)); + indic->scale = scale; + indic->opa = LV_OPA_COVER; + + indic->type = LV_METER_INDICATOR_TYPE_NEEDLE_LINE; + indic->type_data.needle_line.width = width; + indic->type_data.needle_line.color = color; + indic->type_data.needle_line.r_mod = r_mod; + lv_obj_invalidate(obj); + + return indic; +} + +lv_meter_indicator_t * lv_meter_add_needle_img(lv_obj_t * obj, lv_meter_scale_t * scale, const void * src, + lv_coord_t pivot_x, lv_coord_t pivot_y) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_meter_t * meter = (lv_meter_t *)obj; + lv_meter_indicator_t * indic = _lv_ll_ins_head(&meter->indicator_ll); + LV_ASSERT_MALLOC(indic); + lv_memset_00(indic, sizeof(lv_meter_indicator_t)); + indic->scale = scale; + indic->opa = LV_OPA_COVER; + + indic->type = LV_METER_INDICATOR_TYPE_NEEDLE_IMG; + indic->type_data.needle_img.src = src; + indic->type_data.needle_img.pivot.x = pivot_x; + indic->type_data.needle_img.pivot.y = pivot_y; + lv_obj_invalidate(obj); + + return indic; +} + +lv_meter_indicator_t * lv_meter_add_arc(lv_obj_t * obj, lv_meter_scale_t * scale, uint16_t width, lv_color_t color, + int16_t r_mod) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_meter_t * meter = (lv_meter_t *)obj; + lv_meter_indicator_t * indic = _lv_ll_ins_head(&meter->indicator_ll); + LV_ASSERT_MALLOC(indic); + lv_memset_00(indic, sizeof(lv_meter_indicator_t)); + indic->scale = scale; + indic->opa = LV_OPA_COVER; + + indic->type = LV_METER_INDICATOR_TYPE_ARC; + indic->type_data.arc.width = width; + indic->type_data.arc.color = color; + indic->type_data.arc.r_mod = r_mod; + + lv_obj_invalidate(obj); + return indic; +} + +lv_meter_indicator_t * lv_meter_add_scale_lines(lv_obj_t * obj, lv_meter_scale_t * scale, lv_color_t color_start, + lv_color_t color_end, bool local, int16_t width_mod) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_meter_t * meter = (lv_meter_t *)obj; + lv_meter_indicator_t * indic = _lv_ll_ins_head(&meter->indicator_ll); + LV_ASSERT_MALLOC(indic); + lv_memset_00(indic, sizeof(lv_meter_indicator_t)); + indic->scale = scale; + indic->opa = LV_OPA_COVER; + + indic->type = LV_METER_INDICATOR_TYPE_SCALE_LINES; + indic->type_data.scale_lines.color_start = color_start; + indic->type_data.scale_lines.color_end = color_end; + indic->type_data.scale_lines.local_grad = local; + indic->type_data.scale_lines.width_mod = width_mod; + + lv_obj_invalidate(obj); + return indic; +} + +/*===================== + * Set indicator value + *====================*/ + +void lv_meter_set_indicator_value(lv_obj_t * obj, lv_meter_indicator_t * indic, int32_t value) +{ + int32_t old_start = indic->start_value; + int32_t old_end = indic->end_value; + indic->start_value = value; + indic->end_value = value; + + if(indic->type == LV_METER_INDICATOR_TYPE_ARC) { + inv_arc(obj, indic, old_start, value); + inv_arc(obj, indic, old_end, value); + } + else if(indic->type == LV_METER_INDICATOR_TYPE_NEEDLE_IMG || indic->type == LV_METER_INDICATOR_TYPE_NEEDLE_LINE) { + inv_line(obj, indic, old_start); + inv_line(obj, indic, old_end); + inv_line(obj, indic, value); + } + else { + lv_obj_invalidate(obj); + } +} + +void lv_meter_set_indicator_start_value(lv_obj_t * obj, lv_meter_indicator_t * indic, int32_t value) +{ + int32_t old_value = indic->start_value; + indic->start_value = value; + + if(indic->type == LV_METER_INDICATOR_TYPE_ARC) { + inv_arc(obj, indic, old_value, value); + } + else if(indic->type == LV_METER_INDICATOR_TYPE_NEEDLE_IMG || indic->type == LV_METER_INDICATOR_TYPE_NEEDLE_LINE) { + inv_line(obj, indic, old_value); + inv_line(obj, indic, value); + } + else { + lv_obj_invalidate(obj); + } +} + +void lv_meter_set_indicator_end_value(lv_obj_t * obj, lv_meter_indicator_t * indic, int32_t value) +{ + int32_t old_value = indic->end_value; + indic->end_value = value; + + if(indic->type == LV_METER_INDICATOR_TYPE_ARC) { + inv_arc(obj, indic, old_value, value); + } + else if(indic->type == LV_METER_INDICATOR_TYPE_NEEDLE_IMG || indic->type == LV_METER_INDICATOR_TYPE_NEEDLE_LINE) { + inv_line(obj, indic, old_value); + inv_line(obj, indic, value); + } + else { + lv_obj_invalidate(obj); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_meter_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_meter_t * meter = (lv_meter_t *)obj; + + _lv_ll_init(&meter->scale_ll, sizeof(lv_meter_scale_t)); + _lv_ll_init(&meter->indicator_ll, sizeof(lv_meter_indicator_t)); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_meter_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_meter_t * meter = (lv_meter_t *)obj; + _lv_ll_clear(&meter->indicator_ll); + _lv_ll_clear(&meter->scale_ll); + +} + +static void lv_meter_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_res_t res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RES_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + if(code == LV_EVENT_DRAW_MAIN) { + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + lv_area_t scale_area; + lv_obj_get_content_coords(obj, &scale_area); + + draw_arcs(obj, draw_ctx, &scale_area); + draw_ticks_and_labels(obj, draw_ctx, &scale_area); + draw_needles(obj, draw_ctx, &scale_area); + + lv_coord_t r_edge = lv_area_get_width(&scale_area) / 2; + lv_point_t scale_center; + scale_center.x = scale_area.x1 + r_edge; + scale_center.y = scale_area.y1 + r_edge; + + lv_draw_rect_dsc_t mid_dsc; + lv_draw_rect_dsc_init(&mid_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &mid_dsc); + lv_coord_t w = lv_obj_get_style_width(obj, LV_PART_INDICATOR) / 2; + lv_coord_t h = lv_obj_get_style_height(obj, LV_PART_INDICATOR) / 2; + lv_area_t nm_cord; + nm_cord.x1 = scale_center.x - w; + nm_cord.y1 = scale_center.y - h; + nm_cord.x2 = scale_center.x + w; + nm_cord.y2 = scale_center.y + h; + lv_draw_rect(draw_ctx, &mid_dsc, &nm_cord); + } +} + +static void draw_arcs(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, const lv_area_t * scale_area) +{ + lv_meter_t * meter = (lv_meter_t *)obj; + + lv_draw_arc_dsc_t arc_dsc; + lv_draw_arc_dsc_init(&arc_dsc); + arc_dsc.rounded = lv_obj_get_style_arc_rounded(obj, LV_PART_ITEMS); + + lv_coord_t r_out = lv_area_get_width(scale_area) / 2 ; + lv_point_t scale_center; + scale_center.x = scale_area->x1 + r_out; + scale_center.y = scale_area->y1 + r_out; + + lv_opa_t opa_main = lv_obj_get_style_opa(obj, LV_PART_MAIN); + lv_meter_indicator_t * indic; + + lv_obj_draw_part_dsc_t part_draw_dsc; + lv_obj_draw_dsc_init(&part_draw_dsc, draw_ctx); + part_draw_dsc.arc_dsc = &arc_dsc; + part_draw_dsc.part = LV_PART_INDICATOR; + part_draw_dsc.class_p = MY_CLASS; + part_draw_dsc.type = LV_METER_DRAW_PART_ARC; + + _LV_LL_READ_BACK(&meter->indicator_ll, indic) { + if(indic->type != LV_METER_INDICATOR_TYPE_ARC) continue; + + arc_dsc.color = indic->type_data.arc.color; + arc_dsc.width = indic->type_data.arc.width; + arc_dsc.opa = indic->opa > LV_OPA_MAX ? opa_main : (opa_main * indic->opa) >> 8; + + lv_meter_scale_t * scale = indic->scale; + + int32_t start_angle = lv_map(indic->start_value, scale->min, scale->max, scale->rotation, + scale->rotation + scale->angle_range); + int32_t end_angle = lv_map(indic->end_value, scale->min, scale->max, scale->rotation, + scale->rotation + scale->angle_range); + + part_draw_dsc.radius = r_out + indic->type_data.arc.r_mod; + part_draw_dsc.sub_part_ptr = indic; + part_draw_dsc.p1 = &scale_center; + + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + lv_draw_arc(draw_ctx, &arc_dsc, &scale_center, part_draw_dsc.radius, start_angle, end_angle); + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + } +} + +static void draw_ticks_and_labels(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, const lv_area_t * scale_area) +{ + lv_meter_t * meter = (lv_meter_t *)obj; + + lv_point_t p_center; + lv_coord_t r_edge = LV_MIN(lv_area_get_width(scale_area) / 2, lv_area_get_height(scale_area) / 2); + p_center.x = scale_area->x1 + r_edge; + p_center.y = scale_area->y1 + r_edge; + + lv_draw_line_dsc_t line_dsc; + lv_draw_line_dsc_init(&line_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_TICKS, &line_dsc); + line_dsc.raw_end = 1; + + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + lv_obj_init_draw_label_dsc(obj, LV_PART_TICKS, &label_dsc); + + lv_meter_scale_t * scale; + + lv_draw_mask_radius_param_t inner_minor_mask; + lv_draw_mask_radius_param_t inner_major_mask; + lv_draw_mask_radius_param_t outer_mask; + + lv_obj_draw_part_dsc_t part_draw_dsc; + lv_obj_draw_dsc_init(&part_draw_dsc, draw_ctx); + part_draw_dsc.class_p = MY_CLASS; + part_draw_dsc.part = LV_PART_TICKS; + part_draw_dsc.type = LV_METER_DRAW_PART_TICK; + part_draw_dsc.line_dsc = &line_dsc; + + _LV_LL_READ_BACK(&meter->scale_ll, scale) { + part_draw_dsc.sub_part_ptr = scale; + + lv_coord_t r_out = r_edge; + lv_coord_t r_in_minor = r_out - scale->tick_length; + lv_coord_t r_in_major = r_out - scale->tick_major_length; + + lv_area_t area_inner_minor; + area_inner_minor.x1 = p_center.x - r_in_minor; + area_inner_minor.y1 = p_center.y - r_in_minor; + area_inner_minor.x2 = p_center.x + r_in_minor; + area_inner_minor.y2 = p_center.y + r_in_minor; + lv_draw_mask_radius_init(&inner_minor_mask, &area_inner_minor, LV_RADIUS_CIRCLE, true); + + lv_area_t area_inner_major; + area_inner_major.x1 = p_center.x - r_in_major; + area_inner_major.y1 = p_center.y - r_in_major; + area_inner_major.x2 = p_center.x + r_in_major - 1; + area_inner_major.y2 = p_center.y + r_in_major - 1; + lv_draw_mask_radius_init(&inner_major_mask, &area_inner_major, LV_RADIUS_CIRCLE, true); + + lv_area_t area_outer; + area_outer.x1 = p_center.x - r_out; + area_outer.y1 = p_center.y - r_out; + area_outer.x2 = p_center.x + r_out - 1; + area_outer.y2 = p_center.y + r_out - 1; + lv_draw_mask_radius_init(&outer_mask, &area_outer, LV_RADIUS_CIRCLE, false); + int16_t outer_mask_id = lv_draw_mask_add(&outer_mask, NULL); + + int16_t inner_act_mask_id = LV_MASK_ID_INV; /*Will be added later*/ + + uint32_t minor_cnt = scale->tick_major_nth ? scale->tick_major_nth - 1 : 0xFFFF; + uint16_t i; + for(i = 0; i < scale->tick_cnt; i++) { + minor_cnt++; + bool major = false; + if(minor_cnt == scale->tick_major_nth) { + minor_cnt = 0; + major = true; + } + + int32_t value_of_line = lv_map(i, 0, scale->tick_cnt - 1, scale->min, scale->max); + part_draw_dsc.value = value_of_line; + + lv_color_t line_color = major ? scale->tick_major_color : scale->tick_color; + lv_color_t line_color_ori = line_color; + + lv_coord_t line_width_ori = major ? scale->tick_major_width : scale->tick_width; + lv_coord_t line_width = line_width_ori; + + lv_meter_indicator_t * indic; + _LV_LL_READ_BACK(&meter->indicator_ll, indic) { + if(indic->type != LV_METER_INDICATOR_TYPE_SCALE_LINES) continue; + if(value_of_line >= indic->start_value && value_of_line <= indic->end_value) { + line_width += indic->type_data.scale_lines.width_mod; + + if(indic->type_data.scale_lines.color_start.full == indic->type_data.scale_lines.color_end.full) { + line_color = indic->type_data.scale_lines.color_start; + } + else { + lv_opa_t ratio; + if(indic->type_data.scale_lines.local_grad) { + ratio = lv_map(value_of_line, indic->start_value, indic->end_value, LV_OPA_TRANSP, LV_OPA_COVER); + } + else { + ratio = lv_map(value_of_line, scale->min, scale->max, LV_OPA_TRANSP, LV_OPA_COVER); + } + line_color = lv_color_mix(indic->type_data.scale_lines.color_end, indic->type_data.scale_lines.color_start, ratio); + } + } + } + + int32_t angle_upscale = ((i * scale->angle_range) * 10) / (scale->tick_cnt - 1) + + scale->rotation * 10; + + line_dsc.color = line_color; + line_dsc.width = line_width; + + /*Draw a little bit longer lines to be sure the mask will clip them correctly + *and to get a better precision*/ + lv_point_t p_outer; + p_outer.x = p_center.x + r_out + LV_MAX(LV_DPI_DEF, r_out); + p_outer.y = p_center.y; + lv_point_transform(&p_outer, angle_upscale, 256, &p_center); + + part_draw_dsc.p1 = &p_center; + part_draw_dsc.p2 = &p_outer; + part_draw_dsc.id = i; + part_draw_dsc.label_dsc = &label_dsc; + + /*Draw the text*/ + if(major) { + lv_draw_mask_remove_id(outer_mask_id); + uint32_t r_text = r_in_major - scale->label_gap; + lv_point_t p; + p.x = p_center.x + r_text; + p.y = p_center.y; + lv_point_transform(&p, angle_upscale, 256, &p_center); + + lv_draw_label_dsc_t label_dsc_tmp; + lv_memcpy(&label_dsc_tmp, &label_dsc, sizeof(label_dsc_tmp)); + + part_draw_dsc.label_dsc = &label_dsc_tmp; + char buf[16]; + + lv_snprintf(buf, sizeof(buf), "%" LV_PRId32, value_of_line); + part_draw_dsc.text = buf; + + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + + lv_point_t label_size; + lv_txt_get_size(&label_size, part_draw_dsc.text, label_dsc.font, label_dsc.letter_space, label_dsc.line_space, + LV_COORD_MAX, LV_TEXT_FLAG_NONE); + + lv_area_t label_cord; + label_cord.x1 = p.x - label_size.x / 2; + label_cord.y1 = p.y - label_size.y / 2; + label_cord.x2 = label_cord.x1 + label_size.x; + label_cord.y2 = label_cord.y1 + label_size.y; + + lv_draw_label(draw_ctx, part_draw_dsc.label_dsc, &label_cord, part_draw_dsc.text, NULL); + + outer_mask_id = lv_draw_mask_add(&outer_mask, NULL); + } + else { + part_draw_dsc.label_dsc = NULL; + part_draw_dsc.text = NULL; + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + } + + inner_act_mask_id = lv_draw_mask_add(major ? &inner_major_mask : &inner_minor_mask, NULL); + lv_draw_line(draw_ctx, &line_dsc, &p_outer, &p_center); + lv_draw_mask_remove_id(inner_act_mask_id); + lv_event_send(obj, LV_EVENT_DRAW_MAIN_END, &part_draw_dsc); + + line_dsc.color = line_color_ori; + line_dsc.width = line_width_ori; + + } + lv_draw_mask_free_param(&inner_minor_mask); + lv_draw_mask_free_param(&inner_major_mask); + lv_draw_mask_free_param(&outer_mask); + lv_draw_mask_remove_id(outer_mask_id); + } +} + + +static void draw_needles(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, const lv_area_t * scale_area) +{ + lv_meter_t * meter = (lv_meter_t *)obj; + + lv_coord_t r_edge = lv_area_get_width(scale_area) / 2; + lv_point_t scale_center; + scale_center.x = scale_area->x1 + r_edge; + scale_center.y = scale_area->y1 + r_edge; + + lv_draw_line_dsc_t line_dsc; + lv_draw_line_dsc_init(&line_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_ITEMS, &line_dsc); + + lv_draw_img_dsc_t img_dsc; + lv_draw_img_dsc_init(&img_dsc); + lv_obj_init_draw_img_dsc(obj, LV_PART_ITEMS, &img_dsc); + lv_opa_t opa_main = lv_obj_get_style_opa(obj, LV_PART_MAIN); + + lv_obj_draw_part_dsc_t part_draw_dsc; + lv_obj_draw_dsc_init(&part_draw_dsc, draw_ctx); + part_draw_dsc.class_p = MY_CLASS; + part_draw_dsc.p1 = &scale_center; + + lv_meter_indicator_t * indic; + _LV_LL_READ_BACK(&meter->indicator_ll, indic) { + lv_meter_scale_t * scale = indic->scale; + part_draw_dsc.sub_part_ptr = indic; + + if(indic->type == LV_METER_INDICATOR_TYPE_NEEDLE_LINE) { + int32_t angle = lv_map(indic->end_value, scale->min, scale->max, scale->rotation, scale->rotation + scale->angle_range); + lv_coord_t r_out = r_edge + scale->r_mod + indic->type_data.needle_line.r_mod; + lv_point_t p_end; + p_end.y = (lv_trigo_sin(angle) * (r_out)) / LV_TRIGO_SIN_MAX + scale_center.y; + p_end.x = (lv_trigo_cos(angle) * (r_out)) / LV_TRIGO_SIN_MAX + scale_center.x; + line_dsc.color = indic->type_data.needle_line.color; + line_dsc.width = indic->type_data.needle_line.width; + line_dsc.opa = indic->opa > LV_OPA_MAX ? opa_main : (opa_main * indic->opa) >> 8; + + part_draw_dsc.id = LV_METER_DRAW_PART_NEEDLE_LINE; + part_draw_dsc.line_dsc = &line_dsc; + part_draw_dsc.p2 = &p_end; + + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + lv_draw_line(draw_ctx, &line_dsc, &scale_center, &p_end); + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + } + else if(indic->type == LV_METER_INDICATOR_TYPE_NEEDLE_IMG) { + if(indic->type_data.needle_img.src == NULL) continue; + + int32_t angle = lv_map(indic->end_value, scale->min, scale->max, scale->rotation, scale->rotation + scale->angle_range); + lv_img_header_t info; + lv_img_decoder_get_info(indic->type_data.needle_img.src, &info); + lv_area_t a; + a.x1 = scale_center.x - indic->type_data.needle_img.pivot.x; + a.y1 = scale_center.y - indic->type_data.needle_img.pivot.y; + a.x2 = a.x1 + info.w - 1; + a.y2 = a.y1 + info.h - 1; + + img_dsc.opa = indic->opa > LV_OPA_MAX ? opa_main : (opa_main * indic->opa) >> 8; + img_dsc.pivot.x = indic->type_data.needle_img.pivot.x; + img_dsc.pivot.y = indic->type_data.needle_img.pivot.y; + angle = angle * 10; + if(angle > 3600) angle -= 3600; + img_dsc.angle = angle; + + part_draw_dsc.img_dsc = &img_dsc; + + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + lv_draw_img(draw_ctx, &img_dsc, &a, indic->type_data.needle_img.src); + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + } + } +} + +static void inv_arc(lv_obj_t * obj, lv_meter_indicator_t * indic, int32_t old_value, int32_t new_value) +{ + bool rounded = lv_obj_get_style_arc_rounded(obj, LV_PART_ITEMS); + + lv_area_t scale_area; + lv_obj_get_content_coords(obj, &scale_area); + + lv_coord_t r_out = lv_area_get_width(&scale_area) / 2; + lv_point_t scale_center; + scale_center.x = scale_area.x1 + r_out; + scale_center.y = scale_area.y1 + r_out; + + r_out += indic->type_data.arc.r_mod; + + lv_meter_scale_t * scale = indic->scale; + + int32_t start_angle = lv_map(old_value, scale->min, scale->max, scale->rotation, scale->angle_range + scale->rotation); + int32_t end_angle = lv_map(new_value, scale->min, scale->max, scale->rotation, scale->angle_range + scale->rotation); + + lv_area_t a; + lv_draw_arc_get_area(scale_center.x, scale_center.y, r_out, LV_MIN(start_angle, end_angle), LV_MAX(start_angle, + end_angle), indic->type_data.arc.width, rounded, &a); + lv_obj_invalidate_area(obj, &a); +} + + +static void inv_line(lv_obj_t * obj, lv_meter_indicator_t * indic, int32_t value) +{ + lv_area_t scale_area; + lv_obj_get_content_coords(obj, &scale_area); + + lv_coord_t r_out = lv_area_get_width(&scale_area) / 2; + lv_point_t scale_center; + scale_center.x = scale_area.x1 + r_out; + scale_center.y = scale_area.y1 + r_out; + + lv_meter_scale_t * scale = indic->scale; + + if(indic->type == LV_METER_INDICATOR_TYPE_NEEDLE_LINE) { + int32_t angle = lv_map(value, scale->min, scale->max, scale->rotation, scale->rotation + scale->angle_range); + r_out += scale->r_mod + indic->type_data.needle_line.r_mod; + lv_point_t p_end; + p_end.y = (lv_trigo_sin(angle) * (r_out)) / LV_TRIGO_SIN_MAX + scale_center.y; + p_end.x = (lv_trigo_cos(angle) * (r_out)) / LV_TRIGO_SIN_MAX + scale_center.x; + + lv_area_t a; + a.x1 = LV_MIN(scale_center.x, p_end.x) - indic->type_data.needle_line.width - 2; + a.y1 = LV_MIN(scale_center.y, p_end.y) - indic->type_data.needle_line.width - 2; + a.x2 = LV_MAX(scale_center.x, p_end.x) + indic->type_data.needle_line.width + 2; + a.y2 = LV_MAX(scale_center.y, p_end.y) + indic->type_data.needle_line.width + 2; + + lv_obj_invalidate_area(obj, &a); + } + else if(indic->type == LV_METER_INDICATOR_TYPE_NEEDLE_IMG) { + int32_t angle = lv_map(value, scale->min, scale->max, scale->rotation, scale->rotation + scale->angle_range); + lv_img_header_t info; + lv_img_decoder_get_info(indic->type_data.needle_img.src, &info); + + angle = angle * 10; + if(angle > 3600) angle -= 3600; + + scale_center.x -= indic->type_data.needle_img.pivot.x; + scale_center.y -= indic->type_data.needle_img.pivot.y; + lv_area_t a; + _lv_img_buf_get_transformed_area(&a, info.w, info.h, angle, LV_IMG_ZOOM_NONE, &indic->type_data.needle_img.pivot); + a.x1 += scale_center.x - 2; + a.y1 += scale_center.y - 2; + a.x2 += scale_center.x + 2; + a.y2 += scale_center.y + 2; + + lv_obj_invalidate_area(obj, &a); + } +} +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/meter/lv_meter.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/meter/lv_meter.h new file mode 100644 index 0000000..24c1dae --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/meter/lv_meter.h @@ -0,0 +1,267 @@ +/** + * @file lv_meter.h + * + */ + +#ifndef LV_METER_H +#define LV_METER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_METER != 0 + +/*Testing of dependencies*/ +#if LV_DRAW_COMPLEX == 0 +#error "lv_meter: Complex drawing is required. Enable it in lv_conf.h (LV_DRAW_COMPLEX 1)" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_color_t tick_color; + uint16_t tick_cnt; + uint16_t tick_length; + uint16_t tick_width; + + lv_color_t tick_major_color; + uint16_t tick_major_nth; + uint16_t tick_major_length; + uint16_t tick_major_width; + + int16_t label_gap; + int16_t label_color; + + int32_t min; + int32_t max; + int16_t r_mod; + uint16_t angle_range; + int16_t rotation; +} lv_meter_scale_t; + +enum { + LV_METER_INDICATOR_TYPE_NEEDLE_IMG, + LV_METER_INDICATOR_TYPE_NEEDLE_LINE, + LV_METER_INDICATOR_TYPE_SCALE_LINES, + LV_METER_INDICATOR_TYPE_ARC, +}; +typedef uint8_t lv_meter_indicator_type_t; + +typedef struct { + lv_meter_scale_t * scale; + lv_meter_indicator_type_t type; + lv_opa_t opa; + int32_t start_value; + int32_t end_value; + union { + struct { + const void * src; + lv_point_t pivot; + } needle_img; + struct { + uint16_t width; + int16_t r_mod; + lv_color_t color; + } needle_line; + struct { + uint16_t width; + const void * src; + lv_color_t color; + int16_t r_mod; + } arc; + struct { + int16_t width_mod; + lv_color_t color_start; + lv_color_t color_end; + uint8_t local_grad : 1; + } scale_lines; + } type_data; +} lv_meter_indicator_t; + +/*Data of line meter*/ +typedef struct { + lv_obj_t obj; + lv_ll_t scale_ll; + lv_ll_t indicator_ll; +} lv_meter_t; + +extern const lv_obj_class_t lv_meter_class; + +/** + * `type` field in `lv_obj_draw_part_dsc_t` if `class_p = lv_meter_class` + * Used in `LV_EVENT_DRAW_PART_BEGIN` and `LV_EVENT_DRAW_PART_END` + */ +typedef enum { + LV_METER_DRAW_PART_ARC, /**< The arc indicator*/ + LV_METER_DRAW_PART_NEEDLE_LINE, /**< The needle lines*/ + LV_METER_DRAW_PART_NEEDLE_IMG, /**< The needle images*/ + LV_METER_DRAW_PART_TICK, /**< The tick lines and labels*/ +} lv_meter_draw_part_type_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a Meter object + * @param parent pointer to an object, it will be the parent of the new bar. + * @return pointer to the created meter + */ +lv_obj_t * lv_meter_create(lv_obj_t * parent); + +/*===================== + * Add scale + *====================*/ + +/** + * Add a new scale to the meter. + * @param obj pointer to a meter object + * @return the new scale + * @note Indicators can be attached to scales. + */ +lv_meter_scale_t * lv_meter_add_scale(lv_obj_t * obj); + +/** + * Set the properties of the ticks of a scale + * @param obj pointer to a meter object + * @param scale pointer to scale (added to `meter`) + * @param cnt number of tick lines + * @param width width of tick lines + * @param len length of tick lines + * @param color color of tick lines + */ +void lv_meter_set_scale_ticks(lv_obj_t * obj, lv_meter_scale_t * scale, uint16_t cnt, uint16_t width, uint16_t len, + lv_color_t color); + +/** + * Make some "normal" ticks major ticks and set their attributes. + * Texts with the current value are also added to the major ticks. + * @param obj pointer to a meter object + * @param scale pointer to scale (added to `meter`) + * @param nth make every Nth normal tick major tick. (start from the first on the left) + * @param width width of the major ticks + * @param len length of the major ticks + * @param color color of the major ticks + * @param label_gap gap between the major ticks and the labels + */ +void lv_meter_set_scale_major_ticks(lv_obj_t * obj, lv_meter_scale_t * scale, uint16_t nth, uint16_t width, + uint16_t len, lv_color_t color, int16_t label_gap); + +/** + * Set the value and angular range of a scale. + * @param obj pointer to a meter object + * @param scale pointer to scale (added to `meter`) + * @param min the minimum value + * @param max the maximal value + * @param angle_range the angular range of the scale + * @param rotation the angular offset from the 3 o'clock position (clock-wise) + */ +void lv_meter_set_scale_range(lv_obj_t * obj, lv_meter_scale_t * scale, int32_t min, int32_t max, uint32_t angle_range, + uint32_t rotation); + +/*===================== + * Add indicator + *====================*/ + +/** + * Add a needle line indicator the scale + * @param obj pointer to a meter object + * @param scale pointer to scale (added to `meter`) + * @param width width of the line + * @param color color of the line + * @param r_mod the radius modifier (added to the scale's radius) to get the lines length + * @return the new indicator + */ +lv_meter_indicator_t * lv_meter_add_needle_line(lv_obj_t * obj, lv_meter_scale_t * scale, uint16_t width, + lv_color_t color, int16_t r_mod); + +/** + * Add a needle image indicator the scale + * @param obj pointer to a meter object + * @param scale pointer to scale (added to `meter`) + * @param src the image source of the indicator. path or pointer to ::lv_img_dsc_t + * @param pivot_x the X pivot point of the needle + * @param pivot_y the Y pivot point of the needle + * @return the new indicator + * @note the needle image should point to the right, like -O-----> + */ +lv_meter_indicator_t * lv_meter_add_needle_img(lv_obj_t * obj, lv_meter_scale_t * scale, const void * src, + lv_coord_t pivot_x, lv_coord_t pivot_y); + +/** + * Add an arc indicator the scale + * @param obj pointer to a meter object + * @param scale pointer to scale (added to `meter`) + * @param width width of the arc + * @param color color of the arc + * @param r_mod the radius modifier (added to the scale's radius) to get the outer radius of the arc + * @return the new indicator + */ +lv_meter_indicator_t * lv_meter_add_arc(lv_obj_t * obj, lv_meter_scale_t * scale, uint16_t width, lv_color_t color, + int16_t r_mod); + + +/** + * Add a scale line indicator the scale. It will modify the ticks. + * @param obj pointer to a meter object + * @param scale pointer to scale (added to `meter`) + * @param color_start the start color + * @param color_end the end color + * @param local tell how to map start and end color. true: the indicator's start and end_value; false: the scale's min max value + * @param width_mod add this the affected tick's width + * @return the new indicator + */ +lv_meter_indicator_t * lv_meter_add_scale_lines(lv_obj_t * obj, lv_meter_scale_t * scale, lv_color_t color_start, + lv_color_t color_end, bool local, int16_t width_mod); + +/*===================== + * Set indicator value + *====================*/ + +/** + * Set the value of the indicator. It will set start and and value to the same value + * @param obj pointer to a meter object + * @param indic pointer to an indicator + * @param value the new value + */ +void lv_meter_set_indicator_value(lv_obj_t * obj, lv_meter_indicator_t * indic, int32_t value); + +/** + * Set the start value of the indicator. + * @param obj pointer to a meter object + * @param indic pointer to an indicator + * @param value the new value + */ +void lv_meter_set_indicator_start_value(lv_obj_t * obj, lv_meter_indicator_t * indic, int32_t value); + +/** + * Set the start value of the indicator. + * @param obj pointer to a meter object + * @param indic pointer to an indicator + * @param value the new value + */ +void lv_meter_set_indicator_end_value(lv_obj_t * obj, lv_meter_indicator_t * indic, int32_t value); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_METER*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_METER_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/msgbox/lv_msgbox.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/msgbox/lv_msgbox.c new file mode 100644 index 0000000..8db5df7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/msgbox/lv_msgbox.c @@ -0,0 +1,209 @@ +/** + * @file lv_msgbox.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_msgbox.h" +#if LV_USE_MSGBOX + +#include "../../../misc/lv_assert.h" + +/********************* + * DEFINES + *********************/ +#define LV_MSGBOX_FLAG_AUTO_PARENT LV_OBJ_FLAG_WIDGET_1 /*Mark that the parent was automatically created*/ +#define MY_CLASS &lv_msgbox_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void msgbox_close_click_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_msgbox_class = { + .base_class = &lv_obj_class, + .width_def = LV_DPI_DEF * 2, + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_msgbox_t) +}; + +const lv_obj_class_t lv_msgbox_content_class = { + .base_class = &lv_obj_class, + .width_def = LV_PCT(100), + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_obj_t) +}; + +const lv_obj_class_t lv_msgbox_backdrop_class = { + .base_class = &lv_obj_class, + .width_def = LV_PCT(100), + .height_def = LV_PCT(100), + .instance_size = sizeof(lv_obj_t) +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_msgbox_create(lv_obj_t * parent, const char * title, const char * txt, const char * btn_txts[], + bool add_close_btn) +{ + LV_LOG_INFO("begin"); + bool auto_parent = false; + if(parent == NULL) { + auto_parent = true; + parent = lv_obj_class_create_obj(&lv_msgbox_backdrop_class, lv_layer_top()); + LV_ASSERT_MALLOC(parent); + lv_obj_class_init_obj(parent); + lv_obj_clear_flag(parent, LV_OBJ_FLAG_IGNORE_LAYOUT); + lv_obj_set_size(parent, LV_PCT(100), LV_PCT(100)); + } + + lv_obj_t * obj = lv_obj_class_create_obj(&lv_msgbox_class, parent); + LV_ASSERT_MALLOC(obj); + if(obj == NULL) return NULL; + lv_obj_class_init_obj(obj); + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + + if(auto_parent) lv_obj_add_flag(obj, LV_MSGBOX_FLAG_AUTO_PARENT); + + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW_WRAP); + + bool has_title = title && strlen(title) > 0; + + /*When a close button is required, we need the empty label as spacer to push the button to the right*/ + if(add_close_btn || has_title) { + mbox->title = lv_label_create(obj); + lv_label_set_text(mbox->title, has_title ? title : ""); + lv_label_set_long_mode(mbox->title, LV_LABEL_LONG_SCROLL_CIRCULAR); + if(add_close_btn) lv_obj_set_flex_grow(mbox->title, 1); + else lv_obj_set_width(mbox->title, LV_PCT(100)); + } + + if(add_close_btn) { + mbox->close_btn = lv_btn_create(obj); + lv_obj_set_ext_click_area(mbox->close_btn, LV_DPX(10)); + lv_obj_add_event_cb(mbox->close_btn, msgbox_close_click_event_cb, LV_EVENT_CLICKED, NULL); + lv_obj_t * label = lv_label_create(mbox->close_btn); + lv_label_set_text(label, LV_SYMBOL_CLOSE); + const lv_font_t * font = lv_obj_get_style_text_font(mbox->close_btn, LV_PART_MAIN); + lv_coord_t close_btn_size = lv_font_get_line_height(font) + LV_DPX(10); + lv_obj_set_size(mbox->close_btn, close_btn_size, close_btn_size); + lv_obj_align(label, LV_ALIGN_CENTER, 0, 0); + } + + mbox->content = lv_obj_class_create_obj(&lv_msgbox_content_class, obj); + + bool has_txt = txt && strlen(txt) > 0; + if(has_txt) { + mbox->text = lv_label_create(mbox->content); + lv_label_set_text(mbox->text, txt); + lv_label_set_long_mode(mbox->text, LV_LABEL_LONG_WRAP); + lv_obj_set_width(mbox->text, lv_pct(100)); + } + + if(btn_txts) { + mbox->btns = lv_btnmatrix_create(obj); + lv_btnmatrix_set_map(mbox->btns, btn_txts); + lv_btnmatrix_set_btn_ctrl_all(mbox->btns, LV_BTNMATRIX_CTRL_CLICK_TRIG | LV_BTNMATRIX_CTRL_NO_REPEAT); + + uint32_t btn_cnt = 0; + while(btn_txts[btn_cnt] && btn_txts[btn_cnt][0] != '\0') { + btn_cnt++; + } + + const lv_font_t * font = lv_obj_get_style_text_font(mbox->btns, LV_PART_ITEMS); + lv_coord_t btn_h = lv_font_get_line_height(font) + LV_DPI_DEF / 10; + lv_obj_set_size(mbox->btns, btn_cnt * (2 * LV_DPI_DEF / 3), btn_h); + lv_obj_set_style_max_width(mbox->btns, lv_pct(100), 0); + lv_obj_add_flag(mbox->btns, LV_OBJ_FLAG_EVENT_BUBBLE); /*To see the event directly on the message box*/ + } + + return obj; +} + + +lv_obj_t * lv_msgbox_get_title(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + return mbox->title; +} + +lv_obj_t * lv_msgbox_get_close_btn(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + return mbox->close_btn; +} + +lv_obj_t * lv_msgbox_get_text(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + return mbox->text; +} + +lv_obj_t * lv_msgbox_get_content(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + return mbox->content; +} + +lv_obj_t * lv_msgbox_get_btns(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + return mbox->btns; +} + +uint16_t lv_msgbox_get_active_btn(lv_obj_t * mbox) +{ + lv_obj_t * btnm = lv_msgbox_get_btns(mbox); + return lv_btnmatrix_get_selected_btn(btnm); +} + +const char * lv_msgbox_get_active_btn_text(lv_obj_t * mbox) +{ + lv_obj_t * btnm = lv_msgbox_get_btns(mbox); + return lv_btnmatrix_get_btn_text(btnm, lv_btnmatrix_get_selected_btn(btnm)); +} + +void lv_msgbox_close(lv_obj_t * mbox) +{ + if(lv_obj_has_flag(mbox, LV_MSGBOX_FLAG_AUTO_PARENT)) lv_obj_del(lv_obj_get_parent(mbox)); + else lv_obj_del(mbox); +} + +void lv_msgbox_close_async(lv_obj_t * dialog) +{ + if(lv_obj_has_flag(dialog, LV_MSGBOX_FLAG_AUTO_PARENT)) lv_obj_del_async(lv_obj_get_parent(dialog)); + else lv_obj_del_async(dialog); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void msgbox_close_click_event_cb(lv_event_t * e) +{ + lv_obj_t * btn = lv_event_get_target(e); + lv_obj_t * mbox = lv_obj_get_parent(btn); + lv_msgbox_close(mbox); +} + +#endif /*LV_USE_MSGBOX*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/msgbox/lv_msgbox.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/msgbox/lv_msgbox.h new file mode 100644 index 0000000..2eaf0d3 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/msgbox/lv_msgbox.h @@ -0,0 +1,99 @@ +/** + * @file lv_mbox.h + * + */ + +#ifndef LV_MSGBOX_H +#define LV_MSGBOX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_MSGBOX + +/*Testing of dependencies*/ +#if LV_USE_BTNMATRIX == 0 +#error "lv_mbox: lv_btnm is required. Enable it in lv_conf.h (LV_USE_BTNMATRIX 1) " +#endif + +#if LV_USE_LABEL == 0 +#error "lv_mbox: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1) " +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_obj_t obj; + lv_obj_t * title; + lv_obj_t * close_btn; + lv_obj_t * content; + lv_obj_t * text; + lv_obj_t * btns; +} lv_msgbox_t; + +extern const lv_obj_class_t lv_msgbox_class; +extern const lv_obj_class_t lv_msgbox_content_class; +extern const lv_obj_class_t lv_msgbox_backdrop_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a message box object + * @param parent pointer to parent or NULL to create a full screen modal message box + * @param title the title of the message box + * @param txt the text of the message box + * @param btn_txts the buttons as an array of texts terminated by an "" element. E.g. {"btn1", "btn2", ""} + * @param add_close_btn true: add a close button + * @return pointer to the message box object + */ +lv_obj_t * lv_msgbox_create(lv_obj_t * parent, const char * title, const char * txt, const char * btn_txts[], + bool add_close_btn); + +lv_obj_t * lv_msgbox_get_title(lv_obj_t * obj); + +lv_obj_t * lv_msgbox_get_close_btn(lv_obj_t * obj); + +lv_obj_t * lv_msgbox_get_text(lv_obj_t * obj); + +lv_obj_t * lv_msgbox_get_content(lv_obj_t * obj); + +lv_obj_t * lv_msgbox_get_btns(lv_obj_t * obj); + +/** + * Get the index of the selected button + * @param mbox message box object + * @return index of the button (LV_BTNMATRIX_BTN_NONE: if unset) + */ +uint16_t lv_msgbox_get_active_btn(lv_obj_t * mbox); + +const char * lv_msgbox_get_active_btn_text(lv_obj_t * mbox); + +void lv_msgbox_close(lv_obj_t * mbox); + +void lv_msgbox_close_async(lv_obj_t * mbox); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_MSGBOX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_MSGBOX_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/span/lv_span.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/span/lv_span.c new file mode 100644 index 0000000..96f0447 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/span/lv_span.c @@ -0,0 +1,1041 @@ +/** + * @file lv_span.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_span.h" + +#if LV_USE_SPAN != 0 + +#include "../../../misc/lv_assert.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_spangroup_class + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_span_t * span; + const char * txt; + const lv_font_t * font; + uint16_t bytes; + lv_coord_t txt_w; + lv_coord_t line_h; + lv_coord_t letter_space; +} lv_snippet_t; + +struct _snippet_stack { + lv_snippet_t stack[LV_SPAN_SNIPPET_STACK_SIZE]; + uint16_t index; +}; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_spangroup_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_spangroup_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_spangroup_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_main(lv_event_t * e); +static void refresh_self_size(lv_obj_t * obj); + +static const lv_font_t * lv_span_get_style_text_font(lv_obj_t * par, lv_span_t * span); +static lv_coord_t lv_span_get_style_text_letter_space(lv_obj_t * par, lv_span_t * span); +static lv_color_t lv_span_get_style_text_color(lv_obj_t * par, lv_span_t * span); +static lv_opa_t lv_span_get_style_text_opa(lv_obj_t * par, lv_span_t * span); +static lv_opa_t lv_span_get_style_text_blend_mode(lv_obj_t * par, lv_span_t * span); +static int32_t lv_span_get_style_text_decor(lv_obj_t * par, lv_span_t * span); + +static inline void span_text_check(const char ** text); +static void lv_draw_span(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx); +static bool lv_txt_get_snippet(const char * txt, const lv_font_t * font, lv_coord_t letter_space, + lv_coord_t max_width, lv_text_flag_t flag, lv_coord_t * use_width, + uint32_t * end_ofs); + +static void lv_snippet_clear(void); +static uint16_t lv_get_snippet_cnt(void); +static void lv_snippet_push(lv_snippet_t * item); +static lv_snippet_t * lv_get_snippet(uint16_t index); +static lv_coord_t convert_indent_pct(lv_obj_t * spans, lv_coord_t width); + +/********************** + * STATIC VARIABLES + **********************/ +static struct _snippet_stack snippet_stack; + +const lv_obj_class_t lv_spangroup_class = { + .base_class = &lv_obj_class, + .constructor_cb = lv_spangroup_constructor, + .destructor_cb = lv_spangroup_destructor, + .event_cb = lv_spangroup_event, + .instance_size = sizeof(lv_spangroup_t), + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_spangroup_create(lv_obj_t * par) +{ + lv_obj_t * obj = lv_obj_class_create_obj(&lv_spangroup_class, par); + lv_obj_class_init_obj(obj); + return obj; +} + +lv_span_t * lv_spangroup_new_span(lv_obj_t * obj) +{ + if(obj == NULL) { + return NULL; + } + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + lv_span_t * span = _lv_ll_ins_tail(&spans->child_ll); + LV_ASSERT_MALLOC(span); + + lv_style_init(&span->style); + span->txt = (char *)""; + span->static_flag = 1; + span->spangroup = obj; + + refresh_self_size(obj); + + return span; +} + +void lv_spangroup_del_span(lv_obj_t * obj, lv_span_t * span) +{ + if(obj == NULL || span == NULL) { + return; + } + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + lv_span_t * cur_span; + _LV_LL_READ(&spans->child_ll, cur_span) { + if(cur_span == span) { + _lv_ll_remove(&spans->child_ll, cur_span); + if(cur_span->txt && cur_span->static_flag == 0) { + lv_mem_free(cur_span->txt); + } + lv_style_reset(&cur_span->style); + lv_mem_free(cur_span); + break; + } + } + + refresh_self_size(obj); +} + +/*===================== + * Setter functions + *====================*/ + +void lv_span_set_text(lv_span_t * span, const char * text) +{ + if(span == NULL || text == NULL) { + return; + } + + if(span->txt == NULL || span->static_flag == 1) { + span->txt = lv_mem_alloc(strlen(text) + 1); + } + else { + span->txt = lv_mem_realloc(span->txt, strlen(text) + 1); + } + span->static_flag = 0; + strcpy(span->txt, text); + + refresh_self_size(span->spangroup); +} + +void lv_span_set_text_static(lv_span_t * span, const char * text) +{ + if(span == NULL || text == NULL) { + return; + } + + if(span->txt && span->static_flag == 0) { + lv_mem_free(span->txt); + } + span->static_flag = 1; + span->txt = (char *)text; + + refresh_self_size(span->spangroup); +} + +void lv_spangroup_set_align(lv_obj_t * obj, lv_text_align_t align) +{ + lv_obj_set_style_text_align(obj, align, LV_PART_MAIN); +} + +void lv_spangroup_set_overflow(lv_obj_t * obj, lv_span_overflow_t overflow) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + if(spans->overflow == overflow) return; + + spans->overflow = overflow; + lv_obj_invalidate(obj); +} + +void lv_spangroup_set_indent(lv_obj_t * obj, lv_coord_t indent) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + if(spans->indent == indent) return; + + spans->indent = indent; + + refresh_self_size(obj); +} + +void lv_spangroup_set_mode(lv_obj_t * obj, lv_span_mode_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + spans->mode = mode; + lv_spangroup_refr_mode(obj); +} + +void lv_spangroup_set_lines(lv_obj_t * obj, int32_t lines) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + spans->lines = lines; + lv_spangroup_refr_mode(obj); +} + +/*===================== + * Getter functions + *====================*/ + +lv_span_t * lv_spangroup_get_child(const lv_obj_t * obj, int32_t id) +{ + if(obj == NULL) { + return NULL; + } + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + lv_ll_t * linked_list = &spans->child_ll; + + bool traverse_forwards = (id >= 0); + int32_t cur_idx = 0; + lv_ll_node_t * cur_node = linked_list->head; + + /*If using a negative index, start from the tail and use cur -1 to indicate the end*/ + if(!traverse_forwards) { + cur_idx = -1; + cur_node = linked_list->tail; + } + + while(cur_node != NULL) { + if(cur_idx == id) { + return (lv_span_t *) cur_node; + } + if(traverse_forwards) { + cur_node = (lv_ll_node_t *) _lv_ll_get_next(linked_list, cur_node); + cur_idx++; + } + else { + cur_node = (lv_ll_node_t *) _lv_ll_get_prev(linked_list, cur_node); + cur_idx--; + } + } + + return NULL; +} + +uint32_t lv_spangroup_get_child_cnt(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(obj == NULL) { + return 0; + } + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + return _lv_ll_get_len(&(spans->child_ll)); +} + +lv_text_align_t lv_spangroup_get_align(lv_obj_t * obj) +{ + return lv_obj_get_style_text_align(obj, LV_PART_MAIN); +} + +lv_span_overflow_t lv_spangroup_get_overflow(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + return spans->overflow; +} + +lv_coord_t lv_spangroup_get_indent(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + return spans->indent; +} + +lv_span_mode_t lv_spangroup_get_mode(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + return spans->mode; +} + +int32_t lv_spangroup_get_lines(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + return spans->lines; +} + +void lv_spangroup_refr_mode(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + + if(spans->mode == LV_SPAN_MODE_EXPAND) { + lv_obj_set_width(obj, LV_SIZE_CONTENT); + lv_obj_set_height(obj, LV_SIZE_CONTENT); + } + else if(spans->mode == LV_SPAN_MODE_BREAK) { + if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT) { + lv_obj_set_width(obj, 100); + } + lv_obj_set_height(obj, LV_SIZE_CONTENT); + } + else if(spans->mode == LV_SPAN_MODE_FIXED) { + /* use this mode, The user needs to set the size. */ + /* This is just to prevent an infinite loop. */ + if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT) { + lv_obj_set_width(obj, 100); + } + if(lv_obj_get_style_height(obj, LV_PART_MAIN) == LV_SIZE_CONTENT) { + lv_coord_t width = lv_obj_get_style_width(obj, LV_PART_MAIN); + if(LV_COORD_IS_PCT(width)) { + width = 100; + } + lv_coord_t height = lv_spangroup_get_expand_height(obj, width); + lv_obj_set_content_height(obj, height); + } + } + + refresh_self_size(obj); +} + +lv_coord_t lv_spangroup_get_max_line_h(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + + lv_coord_t max_line_h = 0; + lv_span_t * cur_span; + _LV_LL_READ(&spans->child_ll, cur_span) { + const lv_font_t * font = lv_span_get_style_text_font(obj, cur_span); + lv_coord_t line_h = lv_font_get_line_height(font); + if(line_h > max_line_h) { + max_line_h = line_h; + } + } + + return max_line_h; +} + +uint32_t lv_spangroup_get_expand_width(lv_obj_t * obj, uint32_t max_width) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + + if(_lv_ll_get_head(&spans->child_ll) == NULL) { + return 0; + } + + uint32_t width = LV_COORD_IS_PCT(spans->indent) ? 0 : spans->indent; + lv_span_t * cur_span; + lv_coord_t letter_space = 0; + _LV_LL_READ(&spans->child_ll, cur_span) { + const lv_font_t * font = lv_span_get_style_text_font(obj, cur_span); + letter_space = lv_span_get_style_text_letter_space(obj, cur_span); + uint32_t j = 0; + const char * cur_txt = cur_span->txt; + span_text_check(&cur_txt); + while(cur_txt[j] != '\0') { + if(max_width > 0 && width >= max_width) { + return max_width; + } + uint32_t letter = _lv_txt_encoded_next(cur_txt, &j); + uint32_t letter_next = _lv_txt_encoded_next(&cur_txt[j], NULL); + uint16_t letter_w = lv_font_get_glyph_width(font, letter, letter_next); + width = width + letter_w + letter_space; + } + } + + return width - letter_space; +} + +lv_coord_t lv_spangroup_get_expand_height(lv_obj_t * obj, lv_coord_t width) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + if(_lv_ll_get_head(&spans->child_ll) == NULL || width <= 0) { + return 0; + } + + /* init draw variable */ + lv_text_flag_t txt_flag = LV_TEXT_FLAG_NONE; + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_coord_t max_width = width; + lv_coord_t indent = convert_indent_pct(obj, max_width); + lv_coord_t max_w = max_width - indent; /* first line need minus indent */ + + /* coords of draw span-txt */ + lv_point_t txt_pos; + txt_pos.y = 0; + txt_pos.x = 0 + indent; /* first line need add indent */ + + lv_span_t * cur_span = _lv_ll_get_head(&spans->child_ll); + const char * cur_txt = cur_span->txt; + span_text_check(&cur_txt); + uint32_t cur_txt_ofs = 0; + lv_snippet_t snippet; /* use to save cur_span info and push it to stack */ + memset(&snippet, 0, sizeof(snippet)); + + int32_t line_cnt = 0; + int32_t lines = spans->lines < 0 ? INT32_MAX : spans->lines; + /* the loop control how many lines need to draw */ + while(cur_span) { + int snippet_cnt = 0; + lv_coord_t max_line_h = 0; /* the max height of span-font when a line have a lot of span */ + + /* the loop control to find a line and push the relevant span info into stack */ + while(1) { + /* switch to the next span when current is end */ + if(cur_txt[cur_txt_ofs] == '\0') { + cur_span = _lv_ll_get_next(&spans->child_ll, cur_span); + if(cur_span == NULL) break; + cur_txt = cur_span->txt; + span_text_check(&cur_txt); + cur_txt_ofs = 0; + /* maybe also cur_txt[cur_txt_ofs] == '\0' */ + continue; + } + + /* init span info to snippet. */ + if(cur_txt_ofs == 0) { + snippet.span = cur_span; + snippet.font = lv_span_get_style_text_font(obj, cur_span); + snippet.letter_space = lv_span_get_style_text_letter_space(obj, cur_span); + snippet.line_h = lv_font_get_line_height(snippet.font) + line_space; + } + + /* get current span text line info */ + uint32_t next_ofs = 0; + lv_coord_t use_width = 0; + bool isfill = lv_txt_get_snippet(&cur_txt[cur_txt_ofs], snippet.font, snippet.letter_space, + max_w, txt_flag, &use_width, &next_ofs); + + /* break word deal width */ + if(isfill && next_ofs > 0 && snippet_cnt > 0) { + if(max_w < use_width) { + break; + } + + uint32_t tmp_ofs = next_ofs; + uint32_t letter = _lv_txt_encoded_prev(&cur_txt[cur_txt_ofs], &tmp_ofs); + if(!(letter == '\0' || letter == '\n' || letter == '\r' || _lv_txt_is_break_char(letter))) { + tmp_ofs = 0; + letter = _lv_txt_encoded_next(&cur_txt[cur_txt_ofs + next_ofs], &tmp_ofs); + if(!(letter == '\0' || letter == '\n' || letter == '\r' || _lv_txt_is_break_char(letter))) { + break; + } + } + } + + snippet.txt = &cur_txt[cur_txt_ofs]; + snippet.bytes = next_ofs; + snippet.txt_w = use_width; + cur_txt_ofs += next_ofs; + if(max_line_h < snippet.line_h) { + max_line_h = snippet.line_h; + } + snippet_cnt ++; + max_w = max_w - use_width - snippet.letter_space; + if(isfill || max_w <= 0) { + break; + } + } + + /* next line init */ + txt_pos.x = 0; + txt_pos.y += max_line_h; + max_w = max_width; + line_cnt += 1; + if(line_cnt >= lines) { + break; + } + } + txt_pos.y -= line_space; + + return txt_pos.y; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_spangroup_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + _lv_ll_init(&spans->child_ll, sizeof(lv_span_t)); + spans->indent = 0; + spans->lines = -1; + spans->mode = LV_SPAN_MODE_EXPAND; + spans->overflow = LV_SPAN_OVERFLOW_CLIP; + spans->cache_w = 0; + spans->cache_h = 0; + spans->refresh = 1; +} + +static void lv_spangroup_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + lv_span_t * cur_span = _lv_ll_get_head(&spans->child_ll); + while(cur_span) { + _lv_ll_remove(&spans->child_ll, cur_span); + if(cur_span->txt && cur_span->static_flag == 0) { + lv_mem_free(cur_span->txt); + } + lv_style_reset(&cur_span->style); + lv_mem_free(cur_span); + cur_span = _lv_ll_get_head(&spans->child_ll); + } +} + +static void lv_spangroup_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + /* Call the ancestor's event handler */ + if(lv_obj_event_base(MY_CLASS, e) != LV_RES_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + + if(code == LV_EVENT_DRAW_MAIN) { + draw_main(e); + } + else if(code == LV_EVENT_STYLE_CHANGED) { + refresh_self_size(obj); + } + else if(code == LV_EVENT_SIZE_CHANGED) { + refresh_self_size(obj); + } + else if(code == LV_EVENT_GET_SELF_SIZE) { + lv_coord_t width = 0; + lv_coord_t height = 0; + lv_point_t * self_size = lv_event_get_param(e); + + if(spans->mode == LV_SPAN_MODE_EXPAND) { + if(spans->refresh) { + spans->cache_w = (lv_coord_t)lv_spangroup_get_expand_width(obj, 0); + spans->cache_h = lv_spangroup_get_max_line_h(obj); + spans->refresh = 0; + } + width = spans->cache_w; + height = spans->cache_h; + } + else if(spans->mode == LV_SPAN_MODE_BREAK) { + width = lv_obj_get_content_width(obj); + if(self_size->y >= 0) { + if(width != spans->cache_w || spans->refresh) { + height = lv_spangroup_get_expand_height(obj, width); + spans->cache_w = width; + spans->cache_h = height; + spans->refresh = 0; + } + else { + height = spans->cache_h; + } + } + } + else if(spans->mode == LV_SPAN_MODE_FIXED) { + width = self_size->x >= 0 ? lv_obj_get_content_width(obj) : 0; + height = self_size->y >= 0 ? lv_obj_get_content_height(obj) : 0; + } + self_size->x = LV_MAX(self_size->x, width); + self_size->y = LV_MAX(self_size->y, height); + } +} + +static void draw_main(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + + lv_draw_span(obj, draw_ctx); +} + +/** + * @return true for txt fill the max_width. + */ +static bool lv_txt_get_snippet(const char * txt, const lv_font_t * font, + lv_coord_t letter_space, lv_coord_t max_width, lv_text_flag_t flag, + lv_coord_t * use_width, uint32_t * end_ofs) +{ + if(txt == NULL || txt[0] == '\0') { + *end_ofs = 0; + *use_width = 0; + return false; + } + + uint32_t ofs = _lv_txt_get_next_line(txt, font, letter_space, max_width, use_width, flag); + *end_ofs = ofs; + + if(txt[ofs] == '\0' && *use_width < max_width) { + return false; + } + else { + return true; + } +} + +static void lv_snippet_push(lv_snippet_t * item) +{ + if(snippet_stack.index < LV_SPAN_SNIPPET_STACK_SIZE) { + memcpy(&snippet_stack.stack[snippet_stack.index], item, sizeof(lv_snippet_t)); + snippet_stack.index++; + } + else { + LV_LOG_ERROR("span draw stack overflow, please set LV_SPAN_SNIPPET_STACK_SIZE too larger"); + } +} + +static uint16_t lv_get_snippet_cnt(void) +{ + return snippet_stack.index; +} + +static lv_snippet_t * lv_get_snippet(uint16_t index) +{ + return &snippet_stack.stack[index]; +} + +static void lv_snippet_clear(void) +{ + snippet_stack.index = 0; +} + +static const lv_font_t * lv_span_get_style_text_font(lv_obj_t * par, lv_span_t * span) +{ + const lv_font_t * font; + lv_style_value_t value; + lv_res_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_FONT, &value); + if(res != LV_RES_OK) { + font = lv_obj_get_style_text_font(par, LV_PART_MAIN); + } + else { + font = (const lv_font_t *)value.ptr; + } + return font; +} + +static lv_coord_t lv_span_get_style_text_letter_space(lv_obj_t * par, lv_span_t * span) +{ + lv_coord_t letter_space; + lv_style_value_t value; + lv_res_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_LETTER_SPACE, &value); + if(res != LV_RES_OK) { + letter_space = lv_obj_get_style_text_letter_space(par, LV_PART_MAIN); + } + else { + letter_space = (lv_coord_t)value.num; + } + return letter_space; +} + +static lv_color_t lv_span_get_style_text_color(lv_obj_t * par, lv_span_t * span) +{ + lv_style_value_t value; + lv_res_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_COLOR, &value); + if(res != LV_RES_OK) { + value.color = lv_obj_get_style_text_color(par, LV_PART_MAIN); + } + return value.color; +} + +static lv_opa_t lv_span_get_style_text_opa(lv_obj_t * par, lv_span_t * span) +{ + lv_opa_t opa; + lv_style_value_t value; + lv_res_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_OPA, &value); + if(res != LV_RES_OK) { + opa = (lv_opa_t)lv_obj_get_style_text_opa(par, LV_PART_MAIN); + } + else { + opa = (lv_opa_t)value.num; + } + return opa; +} + +static lv_blend_mode_t lv_span_get_style_text_blend_mode(lv_obj_t * par, lv_span_t * span) +{ + lv_blend_mode_t mode; + lv_style_value_t value; + lv_res_t res = lv_style_get_prop(&span->style, LV_STYLE_BLEND_MODE, &value); + if(res != LV_RES_OK) { + mode = (lv_blend_mode_t)lv_obj_get_style_blend_mode(par, LV_PART_MAIN); + } + else { + mode = (lv_blend_mode_t)value.num; + } + return mode; +} + +static int32_t lv_span_get_style_text_decor(lv_obj_t * par, lv_span_t * span) +{ + int32_t decor; + lv_style_value_t value; + lv_res_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_DECOR, &value); + if(res != LV_RES_OK) { + decor = (lv_text_decor_t)lv_obj_get_style_text_decor(par, LV_PART_MAIN);; + } + else { + decor = (int32_t)value.num; + } + return decor; +} + +static inline void span_text_check(const char ** text) +{ + if(*text == NULL) { + *text = ""; + LV_LOG_ERROR("occur an error that span text == NULL"); + } +} + +static lv_coord_t convert_indent_pct(lv_obj_t * obj, lv_coord_t width) +{ + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + + lv_coord_t indent = spans->indent; + if(LV_COORD_IS_PCT(spans->indent)) { + if(spans->mode == LV_SPAN_MODE_EXPAND) { + indent = 0; + } + else { + indent = (width * LV_COORD_GET_PCT(spans->indent)) / 100; + } + } + + return indent; +} + +/** + * draw span group + * @param spans obj handle + * @param coords coordinates of the label + * @param mask the label will be drawn only in this area + */ +static void lv_draw_span(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx) +{ + + lv_area_t coords; + lv_obj_get_content_coords(obj, &coords); + + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + + /* return if not span */ + if(_lv_ll_get_head(&spans->child_ll) == NULL) { + return; + } + + /* return if no draw area */ + lv_area_t clip_area; + if(!_lv_area_intersect(&clip_area, &coords, draw_ctx->clip_area)) return; + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + draw_ctx->clip_area = &clip_area; + + /* init draw variable */ + lv_text_flag_t txt_flag = LV_TEXT_FLAG_NONE; + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN);; + lv_coord_t max_width = lv_area_get_width(&coords); + lv_coord_t indent = convert_indent_pct(obj, max_width); + lv_coord_t max_w = max_width - indent; /* first line need minus indent */ + lv_opa_t obj_opa = lv_obj_get_style_opa(obj, LV_PART_MAIN); + + /* coords of draw span-txt */ + lv_point_t txt_pos; + txt_pos.y = coords.y1; + txt_pos.x = coords.x1 + indent; /* first line need add indent */ + + lv_span_t * cur_span = _lv_ll_get_head(&spans->child_ll); + const char * cur_txt = cur_span->txt; + span_text_check(&cur_txt); + uint32_t cur_txt_ofs = 0; + lv_snippet_t snippet; /* use to save cur_span info and push it to stack */ + lv_memset_00(&snippet, sizeof(snippet)); + + lv_draw_label_dsc_t label_draw_dsc; + lv_draw_label_dsc_init(&label_draw_dsc); + + bool is_first_line = true; + /* the loop control how many lines need to draw */ + while(cur_span) { + bool is_end_line = false; + bool ellipsis_valid = false; + lv_coord_t max_line_h = 0; /* the max height of span-font when a line have a lot of span */ + lv_coord_t max_baseline = 0; /*baseline of the highest span*/ + lv_snippet_clear(); + + /* the loop control to find a line and push the relevant span info into stack */ + while(1) { + /* switch to the next span when current is end */ + if(cur_txt[cur_txt_ofs] == '\0') { + cur_span = _lv_ll_get_next(&spans->child_ll, cur_span); + if(cur_span == NULL) break; + cur_txt = cur_span->txt; + span_text_check(&cur_txt); + cur_txt_ofs = 0; + /* maybe also cur_txt[cur_txt_ofs] == '\0' */ + continue; + } + + /* init span info to snippet. */ + if(cur_txt_ofs == 0) { + snippet.span = cur_span; + snippet.font = lv_span_get_style_text_font(obj, cur_span); + snippet.letter_space = lv_span_get_style_text_letter_space(obj, cur_span); + snippet.line_h = lv_font_get_line_height(snippet.font) + line_space; + } + + /* get current span text line info */ + uint32_t next_ofs = 0; + lv_coord_t use_width = 0; + bool isfill = lv_txt_get_snippet(&cur_txt[cur_txt_ofs], snippet.font, snippet.letter_space, + max_w, txt_flag, &use_width, &next_ofs); + + if(isfill) { + if(next_ofs > 0 && lv_get_snippet_cnt() > 0) { + /* To prevent infinite loops, the _lv_txt_get_next_line() may return incomplete words, */ + /* This phenomenon should be avoided when lv_get_snippet_cnt() > 0 */ + if(max_w < use_width) { + break; + } + uint32_t tmp_ofs = next_ofs; + uint32_t letter = _lv_txt_encoded_prev(&cur_txt[cur_txt_ofs], &tmp_ofs); + if(!(letter == '\0' || letter == '\n' || letter == '\r' || _lv_txt_is_break_char(letter))) { + tmp_ofs = 0; + letter = _lv_txt_encoded_next(&cur_txt[cur_txt_ofs + next_ofs], &tmp_ofs); + if(!(letter == '\0' || letter == '\n' || letter == '\r' || _lv_txt_is_break_char(letter))) { + break; + } + } + } + } + + snippet.txt = &cur_txt[cur_txt_ofs]; + snippet.bytes = next_ofs; + snippet.txt_w = use_width; + cur_txt_ofs += next_ofs; + if(max_line_h < snippet.line_h) { + max_line_h = snippet.line_h; + max_baseline = snippet.font->base_line; + } + + lv_snippet_push(&snippet); + max_w = max_w - use_width - snippet.letter_space; + if(isfill || max_w <= 0) { + break; + } + } + + /* start current line deal with */ + + uint16_t item_cnt = lv_get_snippet_cnt(); + if(item_cnt == 0) { /* break if stack is empty */ + break; + } + + /* Whether the current line is the end line and does overflow processing */ + { + lv_snippet_t * last_snippet = lv_get_snippet(item_cnt - 1); + lv_coord_t next_line_h = last_snippet->line_h; + if(last_snippet->txt[last_snippet->bytes] == '\0') { + next_line_h = 0; + lv_span_t * next_span = _lv_ll_get_next(&spans->child_ll, last_snippet->span); + if(next_span) { /* have the next line */ + next_line_h = lv_font_get_line_height(lv_span_get_style_text_font(obj, next_span)) + line_space; + } + } + if(txt_pos.y + max_line_h + next_line_h - line_space > coords.y2 + 1) { /* for overflow if is end line. */ + if(last_snippet->txt[last_snippet->bytes] != '\0') { + last_snippet->bytes = strlen(last_snippet->txt); + last_snippet->txt_w = lv_txt_get_width(last_snippet->txt, last_snippet->bytes, last_snippet->font, + last_snippet->letter_space, txt_flag); + } + ellipsis_valid = spans->overflow == LV_SPAN_OVERFLOW_ELLIPSIS ? true : false; + is_end_line = true; + } + } + + /*Go the first visible line*/ + if(txt_pos.y + max_line_h < clip_area.y1) { + goto Next_line_init; + } + + /* align deal with */ + lv_text_align_t align = lv_obj_get_style_text_align(obj, LV_PART_MAIN); + if(align == LV_TEXT_ALIGN_CENTER || align == LV_TEXT_ALIGN_RIGHT) { + lv_coord_t align_ofs = 0; + lv_coord_t txts_w = is_first_line ? indent : 0; + for(int i = 0; i < item_cnt; i++) { + lv_snippet_t * pinfo = lv_get_snippet(i); + txts_w = txts_w + pinfo->txt_w + pinfo->letter_space; + } + txts_w -= lv_get_snippet(item_cnt - 1)->letter_space; + align_ofs = max_width > txts_w ? max_width - txts_w : 0; + if(align == LV_TEXT_ALIGN_CENTER) { + align_ofs = align_ofs >> 1; + } + txt_pos.x += align_ofs; + } + + /* draw line letters */ + int i; + for(i = 0; i < item_cnt; i++) { + lv_snippet_t * pinfo = lv_get_snippet(i); + + /* bidi deal with:todo */ + const char * bidi_txt = pinfo->txt; + + lv_point_t pos; + pos.x = txt_pos.x; + pos.y = txt_pos.y + max_line_h - pinfo->line_h - (max_baseline - pinfo->font->base_line); + label_draw_dsc.color = lv_span_get_style_text_color(obj, pinfo->span); + label_draw_dsc.opa = lv_span_get_style_text_opa(obj, pinfo->span); + label_draw_dsc.font = lv_span_get_style_text_font(obj, pinfo->span); + label_draw_dsc.blend_mode = lv_span_get_style_text_blend_mode(obj, pinfo->span); + if(obj_opa < LV_OPA_MAX) { + label_draw_dsc.opa = (uint16_t)((uint16_t)label_draw_dsc.opa * obj_opa) >> 8; + } + uint32_t txt_bytes = pinfo->bytes; + + /* overflow */ + uint16_t dot_letter_w = 0; + uint16_t dot_width = 0; + if(ellipsis_valid) { + dot_letter_w = lv_font_get_glyph_width(pinfo->font, '.', '.'); + dot_width = dot_letter_w * 3; + } + lv_coord_t ellipsis_width = coords.x1 + max_width - dot_width; + + uint32_t j = 0; + while(j < txt_bytes) { + /* skip invalid fields */ + if(pos.x > clip_area.x2) { + break; + } + uint32_t letter = _lv_txt_encoded_next(bidi_txt, &j); + uint32_t letter_next = _lv_txt_encoded_next(&bidi_txt[j], NULL); + int32_t letter_w = lv_font_get_glyph_width(pinfo->font, letter, letter_next); + + /* skip invalid fields */ + if(pos.x + letter_w + pinfo->letter_space < clip_area.x1) { + if(letter_w > 0) { + pos.x = pos.x + letter_w + pinfo->letter_space; + } + continue; + } + + if(ellipsis_valid && pos.x + letter_w + pinfo->letter_space > ellipsis_width) { + for(int ell = 0; ell < 3; ell++) { + lv_draw_letter(draw_ctx, &label_draw_dsc, &pos, '.'); + pos.x = pos.x + dot_letter_w + pinfo->letter_space; + } + if(pos.x <= ellipsis_width) { + pos.x = ellipsis_width + 1; + } + break; + } + else { + lv_draw_letter(draw_ctx, &label_draw_dsc, &pos, letter); + if(letter_w > 0) { + pos.x = pos.x + letter_w + pinfo->letter_space; + } + } + } + + /* draw decor */ + lv_text_decor_t decor = lv_span_get_style_text_decor(obj, pinfo->span); + if(decor != LV_TEXT_DECOR_NONE) { + lv_draw_line_dsc_t line_dsc; + lv_draw_line_dsc_init(&line_dsc); + line_dsc.color = label_draw_dsc.color; + line_dsc.width = label_draw_dsc.font->underline_thickness ? pinfo->font->underline_thickness : 1; + line_dsc.opa = label_draw_dsc.opa; + line_dsc.blend_mode = label_draw_dsc.blend_mode; + + if(decor & LV_TEXT_DECOR_STRIKETHROUGH) { + lv_point_t p1; + lv_point_t p2; + p1.x = txt_pos.x; + p1.y = pos.y + ((pinfo->line_h - line_space) >> 1) + (line_dsc.width >> 1); + p2.x = pos.x; + p2.y = p1.y; + lv_draw_line(draw_ctx, &line_dsc, &p1, &p2); + } + + if(decor & LV_TEXT_DECOR_UNDERLINE) { + lv_point_t p1; + lv_point_t p2; + p1.x = txt_pos.x; + p1.y = pos.y + pinfo->line_h - line_space - pinfo->font->base_line - pinfo->font->underline_position; + p2.x = pos.x; + p2.y = p1.y; + lv_draw_line(draw_ctx, &line_dsc, &p1, &p2); + } + } + txt_pos.x = pos.x; + } + +Next_line_init: + /* next line init */ + is_first_line = false; + txt_pos.x = coords.x1; + txt_pos.y += max_line_h; + if(is_end_line || txt_pos.y > clip_area.y2 + 1) { + draw_ctx->clip_area = clip_area_ori; + return; + } + max_w = max_width; + } + draw_ctx->clip_area = clip_area_ori; +} + +static void refresh_self_size(lv_obj_t * obj) +{ + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + spans->refresh = 1; + lv_obj_invalidate(obj); + lv_obj_refresh_self_size(obj); +} + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/span/lv_span.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/span/lv_span.h new file mode 100644 index 0000000..f00d04d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/span/lv_span.h @@ -0,0 +1,245 @@ +/** + * @file lv_span.h + * + */ + +#ifndef LV_SPAN_H +#define LV_SPAN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_SPAN != 0 + +/********************* + * DEFINES + *********************/ +#ifndef LV_SPAN_SNIPPET_STACK_SIZE +#define LV_SPAN_SNIPPET_STACK_SIZE 64 +#endif + +/********************** + * TYPEDEFS + **********************/ +enum { + LV_SPAN_OVERFLOW_CLIP, + LV_SPAN_OVERFLOW_ELLIPSIS, +}; +typedef uint8_t lv_span_overflow_t; + +enum { + LV_SPAN_MODE_FIXED, /**< fixed the obj size*/ + LV_SPAN_MODE_EXPAND, /**< Expand the object size to the text size*/ + LV_SPAN_MODE_BREAK, /**< Keep width, break the too long lines and expand height*/ +}; +typedef uint8_t lv_span_mode_t; + +typedef struct { + char * txt; /* a pointer to display text */ + lv_obj_t * spangroup; /* a pointer to spangroup */ + lv_style_t style; /* display text style */ + uint8_t static_flag : 1;/* the text is static flag */ +} lv_span_t; + +/** Data of label*/ +typedef struct { + lv_obj_t obj; + int32_t lines; + lv_coord_t indent; /* first line indent */ + lv_coord_t cache_w; /* the cache automatically calculates the width */ + lv_coord_t cache_h; /* similar cache_w */ + lv_ll_t child_ll; + uint8_t mode : 2; /* details see lv_span_mode_t */ + uint8_t overflow : 1; /* details see lv_span_overflow_t */ + uint8_t refresh : 1; /* the spangroup need refresh cache_w and cache_h */ +} lv_spangroup_t; + +extern const lv_obj_class_t lv_spangroup_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a spangroup object + * @param par pointer to an object, it will be the parent of the new spangroup + * @return pointer to the created spangroup + */ +lv_obj_t * lv_spangroup_create(lv_obj_t * par); + +/** + * Create a span string descriptor and add to spangroup. + * @param obj pointer to a spangroup object. + * @return pointer to the created span. + */ +lv_span_t * lv_spangroup_new_span(lv_obj_t * obj); + +/** + * Remove the span from the spangroup and free memory. + * @param obj pointer to a spangroup object. + * @param span pointer to a span. + */ +void lv_spangroup_del_span(lv_obj_t * obj, lv_span_t * span); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set a new text for a span. Memory will be allocated to store the text by the span. + * @param span pointer to a span. + * @param text pointer to a text. + */ +void lv_span_set_text(lv_span_t * span, const char * text); + +/** + * Set a static text. It will not be saved by the span so the 'text' variable + * has to be 'alive' while the span exist. + * @param span pointer to a span. + * @param text pointer to a text. + */ +void lv_span_set_text_static(lv_span_t * span, const char * text); + +/** + * Set the align of the spangroup. + * @param obj pointer to a spangroup object. + * @param align see lv_text_align_t for details. + */ +void lv_spangroup_set_align(lv_obj_t * obj, lv_text_align_t align); + +/** + * Set the overflow of the spangroup. + * @param obj pointer to a spangroup object. + * @param overflow see lv_span_overflow_t for details. + */ +void lv_spangroup_set_overflow(lv_obj_t * obj, lv_span_overflow_t overflow); + +/** + * Set the indent of the spangroup. + * @param obj pointer to a spangroup object. + * @param indent The first line indentation + */ +void lv_spangroup_set_indent(lv_obj_t * obj, lv_coord_t indent); + +/** + * Set the mode of the spangroup. + * @param obj pointer to a spangroup object. + * @param mode see lv_span_mode_t for details. + */ +void lv_spangroup_set_mode(lv_obj_t * obj, lv_span_mode_t mode); + +/** + * Set lines of the spangroup. + * @param obj pointer to a spangroup object. + * @param lines max lines that can be displayed in LV_SPAN_MODE_BREAK mode. < 0 means no limit. + */ +void lv_spangroup_set_lines(lv_obj_t * obj, int32_t lines); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get a spangroup child by its index. + * + * @param obj The spangroup object + * @param id the index of the child. + * 0: the oldest (firstly created) child + * 1: the second oldest + * child count-1: the youngest + * -1: the youngest + * -2: the second youngest + * @return The child span at index `id`, or NULL if the ID does not exist + */ +lv_span_t * lv_spangroup_get_child(const lv_obj_t * obj, int32_t id); + +/** + * + * @param obj The spangroup object to get the child count of. + * @return The span count of the spangroup. + */ +uint32_t lv_spangroup_get_child_cnt(const lv_obj_t * obj); + +/** + * get the align of the spangroup. + * @param obj pointer to a spangroup object. + * @return the align value. + */ +lv_text_align_t lv_spangroup_get_align(lv_obj_t * obj); + +/** + * get the overflow of the spangroup. + * @param obj pointer to a spangroup object. + * @return the overflow value. + */ +lv_span_overflow_t lv_spangroup_get_overflow(lv_obj_t * obj); + +/** + * get the indent of the spangroup. + * @param obj pointer to a spangroup object. + * @return the indent value. + */ +lv_coord_t lv_spangroup_get_indent(lv_obj_t * obj); + +/** + * get the mode of the spangroup. + * @param obj pointer to a spangroup object. + */ +lv_span_mode_t lv_spangroup_get_mode(lv_obj_t * obj); + +/** + * get lines of the spangroup. + * @param obj pointer to a spangroup object. + * @return the lines value. + */ +int32_t lv_spangroup_get_lines(lv_obj_t * obj); + +/** + * get max line height of all span in the spangroup. + * @param obj pointer to a spangroup object. + */ +lv_coord_t lv_spangroup_get_max_line_h(lv_obj_t * obj); + +/** + * get the text content width when all span of spangroup on a line. + * @param obj pointer to a spangroup object. + * @param max_width if text content width >= max_width, return max_width + * to reduce computation, if max_width == 0, returns the text content width. + * @return text content width or max_width. + */ +uint32_t lv_spangroup_get_expand_width(lv_obj_t * obj, uint32_t max_width); + +/** + * get the text content height with width fixed. + * @param obj pointer to a spangroup object. + */ +lv_coord_t lv_spangroup_get_expand_height(lv_obj_t * obj, lv_coord_t width); + + +/*===================== + * Other functions + *====================*/ + +/** + * update the mode of the spangroup. + * @param obj pointer to a spangroup object. + */ +void lv_spangroup_refr_mode(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SPAN*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_SPAN_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/spinbox/lv_spinbox.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/spinbox/lv_spinbox.c new file mode 100644 index 0000000..3469105 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/spinbox/lv_spinbox.c @@ -0,0 +1,516 @@ +/** + * @file lv_spinbox.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_spinbox.h" +#if LV_USE_SPINBOX + +#include "../../../misc/lv_assert.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_spinbox_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_spinbox_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_spinbox_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void lv_spinbox_updatevalue(lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_spinbox_class = { + .constructor_cb = lv_spinbox_constructor, + .event_cb = lv_spinbox_event, + .width_def = LV_DPI_DEF, + .instance_size = sizeof(lv_spinbox_t), + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .base_class = &lv_textarea_class +}; +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_spinbox_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +/** + * Set spinbox value + * @param obj pointer to spinbox + * @param i value to be set + */ +void lv_spinbox_set_value(lv_obj_t * obj, int32_t i) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + if(i > spinbox->range_max) i = spinbox->range_max; + if(i < spinbox->range_min) i = spinbox->range_min; + + spinbox->value = i; + + lv_spinbox_updatevalue(obj); +} + +/** + * Set spinbox rollover function + * @param spinbox pointer to spinbox + * @param b true or false to enable or disable (default) + */ +void lv_spinbox_set_rollover(lv_obj_t * obj, bool b) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + spinbox->rollover = b; +} + +/** + * Set spinbox digit format (digit count and decimal format) + * @param spinbox pointer to spinbox + * @param digit_count number of digit excluding the decimal separator and the sign + * @param separator_position number of digit before the decimal point. If 0, decimal point is not + * shown + */ +void lv_spinbox_set_digit_format(lv_obj_t * obj, uint8_t digit_count, uint8_t separator_position) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + if(digit_count > LV_SPINBOX_MAX_DIGIT_COUNT) digit_count = LV_SPINBOX_MAX_DIGIT_COUNT; + + if(separator_position >= digit_count) separator_position = 0; + + if(digit_count < LV_SPINBOX_MAX_DIGIT_COUNT) { + int64_t max_val = lv_pow(10, digit_count); + if(spinbox->range_max > max_val - 1) spinbox->range_max = max_val - 1; + if(spinbox->range_min < - max_val + 1) spinbox->range_min = - max_val + 1; + } + + spinbox->digit_count = digit_count; + spinbox->dec_point_pos = separator_position; + + lv_spinbox_updatevalue(obj); +} + +/** + * Set spinbox step + * @param spinbox pointer to spinbox + * @param step steps on increment/decrement + */ +void lv_spinbox_set_step(lv_obj_t * obj, uint32_t step) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + spinbox->step = step; + lv_spinbox_updatevalue(obj); +} + +/** + * Set spinbox value range + * @param spinbox pointer to spinbox + * @param range_min maximum value, inclusive + * @param range_max minimum value, inclusive + */ +void lv_spinbox_set_range(lv_obj_t * obj, int32_t range_min, int32_t range_max) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + spinbox->range_max = range_max; + spinbox->range_min = range_min; + + if(spinbox->value > spinbox->range_max) spinbox->value = spinbox->range_max; + if(spinbox->value < spinbox->range_min) spinbox->value = spinbox->range_min; + + lv_spinbox_updatevalue(obj); +} + +/** + * Set cursor position to a specific digit for edition + * @param spinbox pointer to spinbox + * @param pos selected position in spinbox + */ +void lv_spinbox_set_cursor_pos(lv_obj_t * obj, uint8_t pos) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + int32_t step_limit; + step_limit = LV_MAX(spinbox->range_max, (spinbox->range_min < 0 ? (-spinbox->range_min) : spinbox->range_min)); + int32_t new_step = spinbox->step * lv_pow(10, pos); + if(pos <= 0) spinbox->step = 1; + else if(new_step <= step_limit) spinbox->step = new_step; + + lv_spinbox_updatevalue(obj); +} + +/** + * Set direction of digit step when clicking an encoder button while in editing mode + * @param spinbox pointer to spinbox + * @param direction the direction (LV_DIR_RIGHT or LV_DIR_LEFT) + */ +void lv_spinbox_set_digit_step_direction(lv_obj_t * obj, lv_dir_t direction) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + spinbox->digit_step_dir = direction; + + lv_spinbox_updatevalue(obj); +} +/*===================== + * Getter functions + *====================*/ + +/** + * Get the spinbox numeral value (user has to convert to float according to its digit format) + * @param obj pointer to spinbox + * @return value integer value of the spinbox + */ +int32_t lv_spinbox_get_value(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + return spinbox->value; +} +/** + * Get the spinbox step value (user has to convert to float according to its digit format) + * @param obj pointer to spinbox + * @return value integer step value of the spinbox + */ +int32_t lv_spinbox_get_step(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + return spinbox->step; +} + +/*===================== + * Other functions + *====================*/ + +/** + * Select next lower digit for edition + * @param obj pointer to spinbox + */ +void lv_spinbox_step_next(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + int32_t new_step = spinbox->step / 10; + if((new_step) > 0) + spinbox->step = new_step; + else + spinbox->step = 1; + + lv_spinbox_updatevalue(obj); +} + +/** + * Select next higher digit for edition + * @param obj pointer to spinbox + */ +void lv_spinbox_step_prev(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + int32_t step_limit; + step_limit = LV_MAX(spinbox->range_max, (spinbox->range_min < 0 ? (-spinbox->range_min) : spinbox->range_min)); + int32_t new_step = spinbox->step * 10; + if(new_step <= step_limit) spinbox->step = new_step; + + lv_spinbox_updatevalue(obj); +} + +/** + * Get spinbox rollover function status + * @param obj pointer to spinbox + */ +bool lv_spinbox_get_rollover(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + return spinbox->rollover; +} + +/** + * Increment spinbox value by one step + * @param obj pointer to spinbox + */ +void lv_spinbox_increment(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + if(spinbox->value + spinbox->step <= spinbox->range_max) { + /*Special mode when zero crossing*/ + if((spinbox->value + spinbox->step) > 0 && spinbox->value < 0) spinbox->value = -spinbox->value; + spinbox->value += spinbox->step; + + } + else { + // Rollover? + if((spinbox->rollover) && (spinbox->value == spinbox->range_max)) + spinbox->value = spinbox->range_min; + else + spinbox->value = spinbox->range_max; + } + + lv_spinbox_updatevalue(obj); +} + +/** + * Decrement spinbox value by one step + * @param obj pointer to spinbox + */ +void lv_spinbox_decrement(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + if(spinbox->value - spinbox->step >= spinbox->range_min) { + /*Special mode when zero crossing*/ + if((spinbox->value - spinbox->step) < 0 && spinbox->value > 0) spinbox->value = -spinbox->value; + spinbox->value -= spinbox->step; + } + else { + /*Rollover?*/ + if((spinbox->rollover) && (spinbox->value == spinbox->range_min)) + spinbox->value = spinbox->range_max; + else + spinbox->value = spinbox->range_min; + } + + lv_spinbox_updatevalue(obj); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_spinbox_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_LOG_TRACE("begin"); + + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + /*Initialize the allocated 'ext'*/ + spinbox->value = 0; + spinbox->dec_point_pos = 0; + spinbox->digit_count = 5; + spinbox->step = 1; + spinbox->range_max = 99999; + spinbox->range_min = -99999; + spinbox->rollover = false; + spinbox->digit_step_dir = LV_DIR_RIGHT; + + lv_textarea_set_one_line(obj, true); + lv_textarea_set_cursor_click_pos(obj, true); + + lv_spinbox_updatevalue(obj); + + LV_LOG_TRACE("Spinbox constructor finished"); +} + +static void lv_spinbox_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + /*Call the ancestor's event handler*/ + lv_res_t res = LV_RES_OK; + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RES_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + if(code == LV_EVENT_RELEASED) { + /*If released with an ENCODER then move to the next digit*/ + lv_indev_t * indev = lv_indev_get_act(); + if(lv_indev_get_type(indev) == LV_INDEV_TYPE_ENCODER) { + if(lv_group_get_editing(lv_obj_get_group(obj))) { + if(spinbox->digit_count > 1) { + if(spinbox->digit_step_dir == LV_DIR_RIGHT) { + if(spinbox->step > 1) { + lv_spinbox_step_next(obj); + } + else { + /*Restart from the MSB*/ + spinbox->step = lv_pow(10, spinbox->digit_count - 2); + lv_spinbox_step_prev(obj); + } + } + else { + if(spinbox->step < lv_pow(10, spinbox->digit_count - 1)) { + lv_spinbox_step_prev(obj); + } + else { + /*Restart from the LSB*/ + spinbox->step = 10; + lv_spinbox_step_next(obj); + } + } + } + } + } + /*The cursor has been positioned to a digit. + * Set `step` accordingly*/ + else { + const char * txt = lv_textarea_get_text(obj); + size_t txt_len = strlen(txt); + + if(txt[spinbox->ta.cursor.pos] == '.') { + lv_textarea_cursor_left(obj); + } + else if(spinbox->ta.cursor.pos == (uint32_t)txt_len) { + lv_textarea_set_cursor_pos(obj, txt_len - 1); + } + else if(spinbox->ta.cursor.pos == 0 && spinbox->range_min < 0) { + lv_textarea_set_cursor_pos(obj, 1); + } + + size_t len = spinbox->digit_count - 1; + uint16_t cp = spinbox->ta.cursor.pos; + + if(spinbox->ta.cursor.pos > spinbox->dec_point_pos && spinbox->dec_point_pos != 0) cp--; + uint32_t pos = len - cp; + + if(spinbox->range_min < 0) pos++; + + spinbox->step = 1; + uint16_t i; + for(i = 0; i < pos; i++) spinbox->step *= 10; + } + } + else if(code == LV_EVENT_KEY) { + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_get_act()); + + uint32_t c = *((uint32_t *)lv_event_get_param(e)); /*uint32_t because can be UTF-8*/ + if(c == LV_KEY_RIGHT) { + if(indev_type == LV_INDEV_TYPE_ENCODER) + lv_spinbox_increment(obj); + else + lv_spinbox_step_next(obj); + } + else if(c == LV_KEY_LEFT) { + if(indev_type == LV_INDEV_TYPE_ENCODER) + lv_spinbox_decrement(obj); + else + lv_spinbox_step_prev(obj); + } + else if(c == LV_KEY_UP) { + lv_spinbox_increment(obj); + } + else if(c == LV_KEY_DOWN) { + lv_spinbox_decrement(obj); + } + else { + lv_textarea_add_char(obj, c); + } + } +} + +static void lv_spinbox_updatevalue(lv_obj_t * obj) +{ + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + char buf[LV_SPINBOX_MAX_DIGIT_COUNT + 8]; + lv_memset_00(buf, sizeof(buf)); + char * buf_p = buf; + uint8_t cur_shift_left = 0; + + if(spinbox->range_min < 0) { // hide sign if there are only positive values + /*Add the sign*/ + (*buf_p) = spinbox->value >= 0 ? '+' : '-'; + buf_p++; + } + else { + /*Cursor need shift to left*/ + cur_shift_left++; + } + + int32_t i; + char digits[LV_SPINBOX_MAX_DIGIT_COUNT + 4]; + /*Convert the numbers to string (the sign is already handled so always covert positive number)*/ + lv_snprintf(digits, sizeof(digits), "%" LV_PRId32, LV_ABS(spinbox->value)); + + /*Add leading zeros*/ + int lz_cnt = spinbox->digit_count - (int)strlen(digits); + if(lz_cnt > 0) { + for(i = (uint16_t)strlen(digits); i >= 0; i--) { + digits[i + lz_cnt] = digits[i]; + } + for(i = 0; i < lz_cnt; i++) { + digits[i] = '0'; + } + } + + int32_t intDigits; + intDigits = (spinbox->dec_point_pos == 0) ? spinbox->digit_count : spinbox->dec_point_pos; + + /*Add the decimal part*/ + for(i = 0; i < intDigits && digits[i] != '\0'; i++) { + (*buf_p) = digits[i]; + buf_p++; + } + + if(spinbox->dec_point_pos != 0) { + /*Insert the decimal point*/ + (*buf_p) = '.'; + buf_p++; + + for(/*Leave i*/; i < spinbox->digit_count && digits[i] != '\0'; i++) { + (*buf_p) = digits[i]; + buf_p++; + } + } + + /*Refresh the text*/ + lv_textarea_set_text(obj, (char *)buf); + + /*Set the cursor position*/ + int32_t step = spinbox->step; + uint8_t cur_pos = (uint8_t)spinbox->digit_count; + while(step >= 10) { + step /= 10; + cur_pos--; + } + + if(cur_pos > intDigits) cur_pos++; /*Skip the decimal point*/ + + cur_pos -= cur_shift_left; + + lv_textarea_set_cursor_pos(obj, cur_pos); +} + +#endif /*LV_USE_SPINBOX*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/spinbox/lv_spinbox.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/spinbox/lv_spinbox.h new file mode 100644 index 0000000..1a4bc32 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/spinbox/lv_spinbox.h @@ -0,0 +1,182 @@ +/** + * @file lv_spinbox.h + * + */ + +#ifndef LV_SPINBOX_H +#define LV_SPINBOX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_SPINBOX + +/*Testing of dependencies*/ +#if LV_USE_TEXTAREA == 0 +#error "lv_spinbox: lv_ta is required. Enable it in lv_conf.h (LV_USE_TEXTAREA 1) " +#endif + +/********************* + * DEFINES + *********************/ +#define LV_SPINBOX_MAX_DIGIT_COUNT 10 + +/********************** + * TYPEDEFS + **********************/ + +/*Data of spinbox*/ +typedef struct { + lv_textarea_t ta; /*Ext. of ancestor*/ + /*New data for this type*/ + int32_t value; + int32_t range_max; + int32_t range_min; + int32_t step; + uint16_t digit_count : 4; + uint16_t dec_point_pos : 4; /*if 0, there is no separator and the number is an integer*/ + uint16_t rollover : 1; // Set to true for rollover functionality + uint16_t digit_step_dir : 2; // the direction the digit will step on encoder button press when editing +} lv_spinbox_t; + +extern const lv_obj_class_t lv_spinbox_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a Spinbox object + * @param parent pointer to an object, it will be the parent of the new spinbox + * @return pointer to the created spinbox + */ +lv_obj_t * lv_spinbox_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set spinbox value + * @param obj pointer to spinbox + * @param i value to be set + */ +void lv_spinbox_set_value(lv_obj_t * obj, int32_t i); + +/** + * Set spinbox rollover function + * @param obj pointer to spinbox + * @param b true or false to enable or disable (default) + */ +void lv_spinbox_set_rollover(lv_obj_t * obj, bool b); + +/** + * Set spinbox digit format (digit count and decimal format) + * @param obj pointer to spinbox + * @param digit_count number of digit excluding the decimal separator and the sign + * @param separator_position number of digit before the decimal point. If 0, decimal point is not + * shown + */ +void lv_spinbox_set_digit_format(lv_obj_t * obj, uint8_t digit_count, uint8_t separator_position); + +/** + * Set spinbox step + * @param obj pointer to spinbox + * @param step steps on increment/decrement. Can be 1, 10, 100, 1000, etc the digit that will change. + */ +void lv_spinbox_set_step(lv_obj_t * obj, uint32_t step); + +/** + * Set spinbox value range + * @param obj pointer to spinbox + * @param range_min maximum value, inclusive + * @param range_max minimum value, inclusive + */ +void lv_spinbox_set_range(lv_obj_t * obj, int32_t range_min, int32_t range_max); + +/** + * Set cursor position to a specific digit for edition + * @param obj pointer to spinbox + * @param pos selected position in spinbox + */ +void lv_spinbox_set_cursor_pos(lv_obj_t * obj, uint8_t pos); + +/** + * Set direction of digit step when clicking an encoder button while in editing mode + * @param obj pointer to spinbox + * @param direction the direction (LV_DIR_RIGHT or LV_DIR_LEFT) + */ +void lv_spinbox_set_digit_step_direction(lv_obj_t * obj, lv_dir_t direction); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get spinbox rollover function status + * @param obj pointer to spinbox + */ +bool lv_spinbox_get_rollover(lv_obj_t * obj); + +/** + * Get the spinbox numeral value (user has to convert to float according to its digit format) + * @param obj pointer to spinbox + * @return value integer value of the spinbox + */ +int32_t lv_spinbox_get_value(lv_obj_t * obj); + +/** + * Get the spinbox step value (user has to convert to float according to its digit format) + * @param obj pointer to spinbox + * @return value integer step value of the spinbox + */ +int32_t lv_spinbox_get_step(lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +/** + * Select next lower digit for edition by dividing the step by 10 + * @param obj pointer to spinbox + */ +void lv_spinbox_step_next(lv_obj_t * obj); + +/** + * Select next higher digit for edition by multiplying the step by 10 + * @param obj pointer to spinbox + */ +void lv_spinbox_step_prev(lv_obj_t * obj); + +/** + * Increment spinbox value by one step + * @param obj pointer to spinbox + */ +void lv_spinbox_increment(lv_obj_t * obj); + +/** + * Decrement spinbox value by one step + * @param obj pointer to spinbox + */ +void lv_spinbox_decrement(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +/* It was ambiguous in MicroPython. See https://github.com/lvgl/lvgl/issues/3301 + * TODO remove in v9*/ +#define lv_spinbox_set_pos lv_spinbox_set_cursor_pos + +#endif /*LV_USE_SPINBOX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif +#endif /*LV_SPINBOX_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/spinner/lv_spinner.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/spinner/lv_spinner.c new file mode 100644 index 0000000..6fc6d74 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/spinner/lv_spinner.c @@ -0,0 +1,104 @@ +/** + * @file lv_spinner.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_spinner.h" +#if LV_USE_SPINNER + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_spinner_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void arc_anim_start_angle(void * obj, int32_t v); +static void arc_anim_end_angle(void * obj, int32_t v); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_spinner_class = { + .base_class = &lv_arc_class, + .constructor_cb = lv_spinner_constructor +}; + +static uint32_t time_param; +static uint32_t arc_length_param; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Create a spinner object + * @param parent pointer to an object, it will be the parent of the new spinner + * @return pointer to the created spinner + */ +lv_obj_t * lv_spinner_create(lv_obj_t * parent, uint32_t time, uint32_t arc_length) +{ + time_param = time; + arc_length_param = arc_length; + + lv_obj_t * obj = lv_obj_class_create_obj(&lv_spinner_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_spinner_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_TRACE_OBJ_CREATE("begin"); + + LV_UNUSED(class_p); + + lv_obj_clear_flag(obj, LV_OBJ_FLAG_CLICKABLE); + + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, obj); + lv_anim_set_exec_cb(&a, arc_anim_end_angle); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + lv_anim_set_time(&a, time_param); + lv_anim_set_values(&a, arc_length_param, 360 + arc_length_param); + lv_anim_start(&a); + + lv_anim_set_path_cb(&a, lv_anim_path_ease_in_out); + lv_anim_set_values(&a, 0, 360); + lv_anim_set_exec_cb(&a, arc_anim_start_angle); + lv_anim_start(&a); + + lv_arc_set_bg_angles(obj, 0, 360); + lv_arc_set_rotation(obj, 270); +} + + +static void arc_anim_start_angle(void * obj, int32_t v) +{ + lv_arc_set_start_angle(obj, (uint16_t) v); +} + + +static void arc_anim_end_angle(void * obj, int32_t v) +{ + lv_arc_set_end_angle(obj, (uint16_t) v); +} + +#endif /*LV_USE_SPINNER*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/spinner/lv_spinner.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/spinner/lv_spinner.h new file mode 100644 index 0000000..2ab36f6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/spinner/lv_spinner.h @@ -0,0 +1,50 @@ +/** + * @file lv_spinner.h + * + */ + +#ifndef LV_SPINNER_H +#define LV_SPINNER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_SPINNER + +/*Testing of dependencies*/ +#if LV_USE_ARC == 0 +#error "lv_spinner: lv_arc is required. Enable it in lv_conf.h (LV_USE_ARC 1) " +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +extern const lv_obj_class_t lv_spinner_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_obj_t * lv_spinner_create(lv_obj_t * parent, uint32_t time, uint32_t arc_length); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SPINNER*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SPINNER_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/tabview/lv_tabview.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/tabview/lv_tabview.c new file mode 100644 index 0000000..81addc6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/tabview/lv_tabview.c @@ -0,0 +1,352 @@ +/** + * @file lv_tabview.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_tabview.h" +#if LV_USE_TABVIEW + +#include "../../../misc/lv_assert.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_tabview_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_tabview_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_tabview_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_tabview_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void btns_value_changed_event_cb(lv_event_t * e); +static void cont_scroll_end_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_tabview_class = { + .constructor_cb = lv_tabview_constructor, + .destructor_cb = lv_tabview_destructor, + .event_cb = lv_tabview_event, + .width_def = LV_PCT(100), + .height_def = LV_PCT(100), + .base_class = &lv_obj_class, + .instance_size = sizeof(lv_tabview_t) +}; + +static lv_dir_t tabpos_create; +static lv_coord_t tabsize_create; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_tabview_create(lv_obj_t * parent, lv_dir_t tab_pos, lv_coord_t tab_size) +{ + LV_LOG_INFO("begin"); + tabpos_create = tab_pos; + tabsize_create = tab_size; + + lv_obj_t * obj = lv_obj_class_create_obj(&lv_tabview_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +lv_obj_t * lv_tabview_add_tab(lv_obj_t * obj, const char * name) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_tabview_t * tabview = (lv_tabview_t *)obj; + lv_obj_t * cont = lv_tabview_get_content(obj); + + lv_obj_t * page = lv_obj_create(cont); + lv_obj_set_size(page, LV_PCT(100), LV_PCT(100)); + lv_obj_clear_flag(page, LV_OBJ_FLAG_CLICK_FOCUSABLE); + uint32_t tab_id = lv_obj_get_child_cnt(cont); + + lv_obj_t * btns = lv_tabview_get_tab_btns(obj); + + char ** old_map = tabview->map; + char ** new_map; + + /*top or bottom dir*/ + if(tabview->tab_pos & LV_DIR_VER) { + new_map = lv_mem_alloc((tab_id + 1) * sizeof(const char *)); + lv_memcpy_small(new_map, old_map, sizeof(const char *) * (tab_id - 1)); + new_map[tab_id - 1] = lv_mem_alloc(strlen(name) + 1); + strcpy((char *)new_map[tab_id - 1], name); + new_map[tab_id] = ""; + } + /*left or right dir*/ + else { + new_map = lv_mem_alloc((tab_id * 2) * sizeof(const char *)); + lv_memcpy_small(new_map, old_map, sizeof(const char *) * (tab_id - 1) * 2); + if(tabview->tab_cnt == 0) { + new_map[0] = lv_mem_alloc(strlen(name) + 1); + strcpy((char *)new_map[0], name); + new_map[1] = ""; + } + else { + new_map[tab_id * 2 - 3] = "\n"; + new_map[tab_id * 2 - 2] = lv_mem_alloc(strlen(name) + 1); + new_map[tab_id * 2 - 1] = ""; + strcpy((char *)new_map[(tab_id * 2) - 2], name); + } + } + tabview->map = new_map; + lv_btnmatrix_set_map(btns, (const char **)new_map); + lv_mem_free(old_map); + + lv_btnmatrix_set_btn_ctrl_all(btns, LV_BTNMATRIX_CTRL_CHECKABLE | LV_BTNMATRIX_CTRL_CLICK_TRIG | + LV_BTNMATRIX_CTRL_NO_REPEAT); + + tabview->tab_cnt++; + if(tabview->tab_cnt == 1) { + lv_tabview_set_act(obj, 0, LV_ANIM_OFF); + } + + lv_btnmatrix_set_btn_ctrl(btns, tabview->tab_cur, LV_BTNMATRIX_CTRL_CHECKED); + + return page; +} + +void lv_tabview_rename_tab(lv_obj_t * obj, uint32_t id, const char * new_name) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_tabview_t * tabview = (lv_tabview_t *)obj; + + if(id >= tabview->tab_cnt) return; + if(tabview->tab_pos & LV_DIR_HOR) id *= 2; + + lv_mem_free(tabview->map[id]); + tabview->map[id] = lv_mem_alloc(strlen(new_name) + 1); + strcpy(tabview->map[id], new_name); + lv_obj_invalidate(obj); +} + +void lv_tabview_set_act(lv_obj_t * obj, uint32_t id, lv_anim_enable_t anim_en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_tabview_t * tabview = (lv_tabview_t *)obj; + + if(id >= tabview->tab_cnt) { + id = tabview->tab_cnt - 1; + } + + /*To be sure lv_obj_get_content_width will return valid value*/ + lv_obj_update_layout(obj); + + lv_obj_t * cont = lv_tabview_get_content(obj); + if(cont == NULL) return; + + if((tabview->tab_pos & LV_DIR_VER) != 0) { + lv_coord_t gap = lv_obj_get_style_pad_column(cont, LV_PART_MAIN); + lv_coord_t w = lv_obj_get_content_width(cont); + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) != LV_BASE_DIR_RTL) { + lv_obj_scroll_to_x(cont, id * (gap + w), anim_en); + } + else { + int32_t id_rtl = -(int32_t)id; + lv_obj_scroll_to_x(cont, (gap + w) * id_rtl, anim_en); + } + } + else { + lv_coord_t gap = lv_obj_get_style_pad_row(cont, LV_PART_MAIN); + lv_coord_t h = lv_obj_get_content_height(cont); + lv_obj_scroll_to_y(cont, id * (gap + h), anim_en); + } + + lv_obj_t * btns = lv_tabview_get_tab_btns(obj); + lv_btnmatrix_set_btn_ctrl(btns, id, LV_BTNMATRIX_CTRL_CHECKED); + tabview->tab_cur = id; +} + +uint16_t lv_tabview_get_tab_act(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_tabview_t * tabview = (lv_tabview_t *)obj; + return tabview->tab_cur; +} + +lv_obj_t * lv_tabview_get_content(lv_obj_t * tv) +{ + return lv_obj_get_child(tv, 1); +} + +lv_obj_t * lv_tabview_get_tab_btns(lv_obj_t * tv) +{ + return lv_obj_get_child(tv, 0); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_tabview_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_tabview_t * tabview = (lv_tabview_t *)obj; + + tabview->tab_pos = tabpos_create; + + switch(tabview->tab_pos) { + case LV_DIR_TOP: + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); + break; + case LV_DIR_BOTTOM: + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN_REVERSE); + break; + case LV_DIR_LEFT: + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); + break; + case LV_DIR_RIGHT: + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW_REVERSE); + break; + } + + lv_obj_set_size(obj, LV_PCT(100), LV_PCT(100)); + + lv_obj_t * btnm; + lv_obj_t * cont; + + btnm = lv_btnmatrix_create(obj); + cont = lv_obj_create(obj); + + lv_btnmatrix_set_one_checked(btnm, true); + tabview->map = lv_mem_alloc(sizeof(const char *)); + tabview->map[0] = ""; + lv_btnmatrix_set_map(btnm, (const char **)tabview->map); + lv_obj_add_event_cb(btnm, btns_value_changed_event_cb, LV_EVENT_VALUE_CHANGED, NULL); + lv_obj_add_flag(btnm, LV_OBJ_FLAG_EVENT_BUBBLE); + + lv_obj_add_event_cb(cont, cont_scroll_end_event_cb, LV_EVENT_ALL, NULL); + lv_obj_set_scrollbar_mode(cont, LV_SCROLLBAR_MODE_OFF); + + switch(tabview->tab_pos) { + case LV_DIR_TOP: + case LV_DIR_BOTTOM: + lv_obj_set_size(btnm, LV_PCT(100), tabsize_create); + lv_obj_set_width(cont, LV_PCT(100)); + lv_obj_set_flex_grow(cont, 1); + break; + case LV_DIR_LEFT: + case LV_DIR_RIGHT: + lv_obj_set_size(btnm, tabsize_create, LV_PCT(100)); + lv_obj_set_height(cont, LV_PCT(100)); + lv_obj_set_flex_grow(cont, 1); + break; + } + + lv_group_t * g = lv_group_get_default(); + if(g) lv_group_add_obj(g, btnm); + + if((tabview->tab_pos & LV_DIR_VER) != 0) { + lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_ROW); + lv_obj_set_scroll_snap_x(cont, LV_SCROLL_SNAP_CENTER); + } + else { + lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_COLUMN); + lv_obj_set_scroll_snap_y(cont, LV_SCROLL_SNAP_CENTER); + } + lv_obj_add_flag(cont, LV_OBJ_FLAG_SCROLL_ONE); + lv_obj_clear_flag(cont, LV_OBJ_FLAG_SCROLL_ON_FOCUS); +} + +static void lv_tabview_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_tabview_t * tabview = (lv_tabview_t *)obj; + + uint32_t i; + if(tabview->tab_pos & LV_DIR_VER) { + for(i = 0; i < tabview->tab_cnt; i++) { + lv_mem_free(tabview->map[i]); + tabview->map[i] = NULL; + } + } + if(tabview->tab_pos & LV_DIR_HOR) { + for(i = 0; i < tabview->tab_cnt; i++) { + lv_mem_free(tabview->map[i * 2]); + tabview->map[i * 2] = NULL; + } + } + + + lv_mem_free(tabview->map); + tabview->map = NULL; +} + +static void lv_tabview_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + lv_res_t res = lv_obj_event_base(&lv_tabview_class, e); + if(res != LV_RES_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * target = lv_event_get_target(e); + + if(code == LV_EVENT_SIZE_CHANGED) { + lv_tabview_set_act(target, lv_tabview_get_tab_act(target), LV_ANIM_OFF); + } +} + + +static void btns_value_changed_event_cb(lv_event_t * e) +{ + lv_obj_t * btns = lv_event_get_target(e); + + lv_obj_t * tv = lv_obj_get_parent(btns); + uint32_t id = lv_btnmatrix_get_selected_btn(btns); + lv_tabview_set_act(tv, id, LV_ANIM_ON); +} + +static void cont_scroll_end_event_cb(lv_event_t * e) +{ + lv_obj_t * cont = lv_event_get_target(e); + lv_event_code_t code = lv_event_get_code(e); + + lv_obj_t * tv = lv_obj_get_parent(cont); + lv_tabview_t * tv_obj = (lv_tabview_t *)tv; + if(code == LV_EVENT_LAYOUT_CHANGED) { + lv_tabview_set_act(tv, lv_tabview_get_tab_act(tv), LV_ANIM_OFF); + } + else if(code == LV_EVENT_SCROLL_END) { + lv_indev_t * indev = lv_indev_get_act(); + if(indev && indev->proc.state == LV_INDEV_STATE_PRESSED) { + return; + } + + lv_point_t p; + lv_obj_get_scroll_end(cont, &p); + + lv_coord_t t; + if((tv_obj->tab_pos & LV_DIR_VER) != 0) { + lv_coord_t w = lv_obj_get_content_width(cont); + if(lv_obj_get_style_base_dir(tv, LV_PART_MAIN) == LV_BASE_DIR_RTL) t = -(p.x - w / 2) / w; + else t = (p.x + w / 2) / w; + } + else { + lv_coord_t h = lv_obj_get_content_height(cont); + t = (p.y + h / 2) / h; + } + + if(t < 0) t = 0; + bool new_tab = false; + if(t != lv_tabview_get_tab_act(tv)) new_tab = true; + lv_tabview_set_act(tv, t, LV_ANIM_ON); + + if(new_tab) lv_event_send(tv, LV_EVENT_VALUE_CHANGED, NULL); + } +} +#endif /*LV_USE_TABVIEW*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/tabview/lv_tabview.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/tabview/lv_tabview.h new file mode 100644 index 0000000..388c654 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/tabview/lv_tabview.h @@ -0,0 +1,65 @@ +/** + * @file lv_templ.h + * + */ + +#ifndef LV_TABVIEW_H +#define LV_TABVIEW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_TABVIEW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_obj_t obj; + char ** map; + uint16_t tab_cnt; + uint16_t tab_cur; + lv_dir_t tab_pos; +} lv_tabview_t; + +extern const lv_obj_class_t lv_tabview_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ +lv_obj_t * lv_tabview_create(lv_obj_t * parent, lv_dir_t tab_pos, lv_coord_t tab_size); + +lv_obj_t * lv_tabview_add_tab(lv_obj_t * tv, const char * name); + +void lv_tabview_rename_tab(lv_obj_t * obj, uint32_t tab_id, const char * new_name); + +lv_obj_t * lv_tabview_get_content(lv_obj_t * tv); + +lv_obj_t * lv_tabview_get_tab_btns(lv_obj_t * tv); + +void lv_tabview_set_act(lv_obj_t * obj, uint32_t id, lv_anim_enable_t anim_en); + +uint16_t lv_tabview_get_tab_act(lv_obj_t * tv); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TABVIEW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TABVIEW_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/tileview/lv_tileview.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/tileview/lv_tileview.c new file mode 100644 index 0000000..17fdb51 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/tileview/lv_tileview.c @@ -0,0 +1,194 @@ +/** + * @file lv_tileview.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_tileview.h" +#include "../../../core/lv_indev.h" +#if LV_USE_TILEVIEW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_tileview_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_tileview_tile_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void tileview_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_tileview_class = {.constructor_cb = lv_tileview_constructor, + .base_class = &lv_obj_class, + .instance_size = sizeof(lv_tileview_t) + }; + +const lv_obj_class_t lv_tileview_tile_class = {.constructor_cb = lv_tileview_tile_constructor, + .base_class = &lv_obj_class, + .instance_size = sizeof(lv_tileview_tile_t) + }; + +static lv_dir_t create_dir; +static uint32_t create_col_id; +static uint32_t create_row_id; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_tileview_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_tileview_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*====================== + * Add/remove functions + *=====================*/ + +lv_obj_t * lv_tileview_add_tile(lv_obj_t * tv, uint8_t col_id, uint8_t row_id, lv_dir_t dir) +{ + LV_LOG_INFO("begin"); + create_dir = dir; + create_col_id = col_id; + create_row_id = row_id; + + lv_obj_t * obj = lv_obj_class_create_obj(&lv_tileview_tile_class, tv); + lv_obj_class_init_obj(obj); + return obj; +} + +void lv_obj_set_tile(lv_obj_t * obj, lv_obj_t * tile_obj, lv_anim_enable_t anim_en) +{ + lv_coord_t tx = lv_obj_get_x(tile_obj); + lv_coord_t ty = lv_obj_get_y(tile_obj); + + lv_tileview_tile_t * tile = (lv_tileview_tile_t *)tile_obj; + lv_tileview_t * tv = (lv_tileview_t *) obj; + tv->tile_act = (lv_obj_t *)tile; + + lv_obj_set_scroll_dir(obj, tile->dir); + lv_obj_scroll_to(obj, tx, ty, anim_en); +} + +void lv_obj_set_tile_id(lv_obj_t * tv, uint32_t col_id, uint32_t row_id, lv_anim_enable_t anim_en) +{ + lv_obj_update_layout(tv); + + lv_coord_t w = lv_obj_get_content_width(tv); + lv_coord_t h = lv_obj_get_content_height(tv); + + lv_coord_t tx = col_id * w; + lv_coord_t ty = row_id * h; + + uint32_t i; + for(i = 0; i < lv_obj_get_child_cnt(tv); i++) { + lv_obj_t * tile_obj = lv_obj_get_child(tv, i); + lv_coord_t x = lv_obj_get_x(tile_obj); + lv_coord_t y = lv_obj_get_y(tile_obj); + if(x == tx && y == ty) { + lv_obj_set_tile(tv, tile_obj, anim_en); + return; + } + } + + LV_LOG_WARN("No tile found with at (%d,%d) index", (int)col_id, (int)row_id); +} + +lv_obj_t * lv_tileview_get_tile_act(lv_obj_t * obj) +{ + lv_tileview_t * tv = (lv_tileview_t *) obj; + return tv->tile_act; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_tileview_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_obj_set_size(obj, LV_PCT(100), LV_PCT(100)); + lv_obj_add_event_cb(obj, tileview_event_cb, LV_EVENT_ALL, NULL); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ONE); + lv_obj_set_scroll_snap_x(obj, LV_SCROLL_SNAP_CENTER); + lv_obj_set_scroll_snap_y(obj, LV_SCROLL_SNAP_CENTER); + +} + +static void lv_tileview_tile_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + + LV_UNUSED(class_p); + lv_obj_t * parent = lv_obj_get_parent(obj); + lv_obj_set_size(obj, LV_PCT(100), LV_PCT(100)); + lv_obj_update_layout(obj); /*Be sure the size is correct*/ + lv_obj_set_pos(obj, create_col_id * lv_obj_get_content_width(parent), + create_row_id * lv_obj_get_content_height(parent)); + + lv_tileview_tile_t * tile = (lv_tileview_tile_t *)obj; + tile->dir = create_dir; + + if(create_col_id == 0 && create_row_id == 0) { + lv_obj_set_scroll_dir(parent, create_dir); + } +} + +static void tileview_event_cb(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + lv_tileview_t * tv = (lv_tileview_t *) obj; + + if(code == LV_EVENT_SCROLL_END) { + lv_indev_t * indev = lv_indev_get_act(); + if(indev && indev->proc.state == LV_INDEV_STATE_PRESSED) { + return; + } + + lv_coord_t w = lv_obj_get_content_width(obj); + lv_coord_t h = lv_obj_get_content_height(obj); + + lv_point_t scroll_end; + lv_obj_get_scroll_end(obj, &scroll_end); + lv_coord_t left = scroll_end.x; + lv_coord_t top = scroll_end.y; + + lv_coord_t tx = ((left + (w / 2)) / w) * w; + lv_coord_t ty = ((top + (h / 2)) / h) * h; + + lv_dir_t dir = LV_DIR_ALL; + uint32_t i; + for(i = 0; i < lv_obj_get_child_cnt(obj); i++) { + lv_obj_t * tile_obj = lv_obj_get_child(obj, i); + lv_coord_t x = lv_obj_get_x(tile_obj); + lv_coord_t y = lv_obj_get_y(tile_obj); + if(x == tx && y == ty) { + lv_tileview_tile_t * tile = (lv_tileview_tile_t *)tile_obj; + tv->tile_act = (lv_obj_t *)tile; + dir = tile->dir; + lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL); + break; + } + } + lv_obj_set_scroll_dir(obj, dir); + } +} +#endif /*LV_USE_TILEVIEW*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/tileview/lv_tileview.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/tileview/lv_tileview.h new file mode 100644 index 0000000..7adeec3 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/tileview/lv_tileview.h @@ -0,0 +1,72 @@ +/** + * @file lv_tileview.h + * + */ + +#ifndef LV_TILEVIEW_H +#define LV_TILEVIEW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../core/lv_obj.h" + +#if LV_USE_TILEVIEW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_obj_t obj; + lv_obj_t * tile_act; +} lv_tileview_t; + +typedef struct { + lv_obj_t obj; + lv_dir_t dir; +} lv_tileview_tile_t; + +extern const lv_obj_class_t lv_tileview_class; +extern const lv_obj_class_t lv_tileview_tile_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a Tileview object + * @param parent pointer to an object, it will be the parent of the new tileview + * @return pointer to the created tileview + */ +lv_obj_t * lv_tileview_create(lv_obj_t * parent); + +lv_obj_t * lv_tileview_add_tile(lv_obj_t * tv, uint8_t col_id, uint8_t row_id, lv_dir_t dir); + +void lv_obj_set_tile(lv_obj_t * tv, lv_obj_t * tile_obj, lv_anim_enable_t anim_en); +void lv_obj_set_tile_id(lv_obj_t * tv, uint32_t col_id, uint32_t row_id, lv_anim_enable_t anim_en); + +lv_obj_t * lv_tileview_get_tile_act(lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TILEVIEW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TILEVIEW_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/win/lv_win.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/win/lv_win.c new file mode 100644 index 0000000..92c3b8b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/win/lv_win.c @@ -0,0 +1,110 @@ +/** + * @file lv_win.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_win.h" +#if LV_USE_WIN + + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_win_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_win_class = { + .constructor_cb = lv_win_constructor, + .width_def = LV_PCT(100), + .height_def = LV_PCT(100), + .base_class = &lv_obj_class, + .instance_size = sizeof(lv_win_t) +}; +static lv_coord_t create_header_height; +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_win_create(lv_obj_t * parent, lv_coord_t header_height) +{ + LV_LOG_INFO("begin"); + create_header_height = header_height; + + lv_obj_t * obj = lv_obj_class_create_obj(&lv_win_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +lv_obj_t * lv_win_add_title(lv_obj_t * win, const char * txt) +{ + lv_obj_t * header = lv_win_get_header(win); + lv_obj_t * title = lv_label_create(header); + lv_label_set_long_mode(title, LV_LABEL_LONG_DOT); + lv_label_set_text(title, txt); + lv_obj_set_flex_grow(title, 1); + return title; +} + +lv_obj_t * lv_win_add_btn(lv_obj_t * win, const void * icon, lv_coord_t btn_w) +{ + lv_obj_t * header = lv_win_get_header(win); + lv_obj_t * btn = lv_btn_create(header); + lv_obj_set_size(btn, btn_w, LV_PCT(100)); + + lv_obj_t * img = lv_img_create(btn); + lv_img_set_src(img, icon); + lv_obj_align(img, LV_ALIGN_CENTER, 0, 0); + + return btn; +} + +lv_obj_t * lv_win_get_header(lv_obj_t * win) +{ + return lv_obj_get_child(win, 0); +} + +lv_obj_t * lv_win_get_content(lv_obj_t * win) +{ + return lv_obj_get_child(win, 1); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_win_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_obj_t * parent = lv_obj_get_parent(obj); + lv_obj_set_size(obj, lv_obj_get_width(parent), lv_obj_get_height(parent)); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); + + lv_obj_t * header = lv_obj_create(obj); + lv_obj_set_size(header, LV_PCT(100), create_header_height); + lv_obj_set_flex_flow(header, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(header, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + + lv_obj_t * cont = lv_obj_create(obj); + lv_obj_set_flex_grow(cont, 1); + lv_obj_set_width(cont, LV_PCT(100)); +} + +#endif + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/win/lv_win.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/win/lv_win.h new file mode 100644 index 0000000..4342b31 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/extra/widgets/win/lv_win.h @@ -0,0 +1,51 @@ +/** + * @file lv_win.h + * + */ + +#ifndef LV_WIN_H +#define LV_WIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_obj_t obj; +} lv_win_t; + +extern const lv_obj_class_t lv_win_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_obj_t * lv_win_create(lv_obj_t * parent, lv_coord_t header_height); + + +lv_obj_t * lv_win_add_title(lv_obj_t * win, const char * txt); +lv_obj_t * lv_win_add_btn(lv_obj_t * win, const void * icon, lv_coord_t btn_w); + +lv_obj_t * lv_win_get_header(lv_obj_t * win); +lv_obj_t * lv_win_get_content(lv_obj_t * win); +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_WIN_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/korean.ttf b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/korean.ttf new file mode 100644 index 0000000..e0ec117 Binary files /dev/null and b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/korean.ttf differ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font.c new file mode 100644 index 0000000..d4cc27e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font.c @@ -0,0 +1,146 @@ +/** + * @file lv_font.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_font.h" +#include "../misc/lv_utils.h" +#include "../misc/lv_log.h" +#include "../misc/lv_assert.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Return with the bitmap of a font. + * @param font_p pointer to a font + * @param letter a UNICODE character code + * @return pointer to the bitmap of the letter + */ +const uint8_t * lv_font_get_glyph_bitmap(const lv_font_t * font_p, uint32_t letter) +{ + LV_ASSERT_NULL(font_p); + return font_p->get_glyph_bitmap(font_p, letter); +} + +/** + * Get the descriptor of a glyph + * @param font_p pointer to font + * @param dsc_out store the result descriptor here + * @param letter a UNICODE letter code + * @param letter_next the next letter after `letter`. Used for kerning + * @return true: descriptor is successfully loaded into `dsc_out`. + * false: the letter was not found, no data is loaded to `dsc_out` + */ +bool lv_font_get_glyph_dsc(const lv_font_t * font_p, lv_font_glyph_dsc_t * dsc_out, uint32_t letter, + uint32_t letter_next) +{ + + LV_ASSERT_NULL(font_p); + LV_ASSERT_NULL(dsc_out); + +#if LV_USE_FONT_PLACEHOLDER + const lv_font_t * placeholder_font = NULL; +#endif + + const lv_font_t * f = font_p; + + dsc_out->resolved_font = NULL; + + while(f) { + bool found = f->get_glyph_dsc(f, dsc_out, letter, letter_next); + if(found) { + if(!dsc_out->is_placeholder) { + dsc_out->resolved_font = f; + return true; + } +#if LV_USE_FONT_PLACEHOLDER + else if(placeholder_font == NULL) { + placeholder_font = f; + } +#endif + } + f = f->fallback; + } + +#if LV_USE_FONT_PLACEHOLDER + if(placeholder_font != NULL) { + placeholder_font->get_glyph_dsc(placeholder_font, dsc_out, letter, letter_next); + dsc_out->resolved_font = placeholder_font; + return true; + } +#endif + + if(letter < 0x20 || + letter == 0xf8ff || /*LV_SYMBOL_DUMMY*/ + letter == 0x200c) { /*ZERO WIDTH NON-JOINER*/ + dsc_out->box_w = 0; + dsc_out->adv_w = 0; + } + else { +#if LV_USE_FONT_PLACEHOLDER + dsc_out->box_w = font_p->line_height / 2; + dsc_out->adv_w = dsc_out->box_w + 2; +#else + dsc_out->box_w = 0; + dsc_out->adv_w = 0; +#endif + } + + dsc_out->resolved_font = NULL; + dsc_out->box_h = font_p->line_height; + dsc_out->ofs_x = 0; + dsc_out->ofs_y = 0; + dsc_out->bpp = 1; + dsc_out->is_placeholder = true; + + return false; +} + +/** + * Get the width of a glyph with kerning + * @param font pointer to a font + * @param letter a UNICODE letter + * @param letter_next the next letter after `letter`. Used for kerning + * @return the width of the glyph + */ +uint16_t lv_font_get_glyph_width(const lv_font_t * font, uint32_t letter, uint32_t letter_next) +{ + LV_ASSERT_NULL(font); + lv_font_glyph_dsc_t g; + lv_font_get_glyph_dsc(font, &g, letter, letter_next); + return g.adv_w; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font.h new file mode 100644 index 0000000..e3b670c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font.h @@ -0,0 +1,261 @@ +/** + * @file lv_font.h + * + */ + +#ifndef LV_FONT_H +#define LV_FONT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include +#include +#include + +#include "lv_symbol_def.h" +#include "../misc/lv_area.h" + +/********************* + * DEFINES + *********************/ + +/* imgfont identifier */ +#define LV_IMGFONT_BPP 9 + +/********************** + * TYPEDEFS + **********************/ + +/*------------------ + * General types + *-----------------*/ + +struct _lv_font_t; +/** Describes the properties of a glyph.*/ +typedef struct { + const struct _lv_font_t * + resolved_font; /**< Pointer to a font where the glyph was actually found after handling fallbacks*/ + uint16_t adv_w; /**< The glyph needs this space. Draw the next glyph after this width.*/ + uint16_t box_w; /**< Width of the glyph's bounding box*/ + uint16_t box_h; /**< Height of the glyph's bounding box*/ + int16_t ofs_x; /**< x offset of the bounding box*/ + int16_t ofs_y; /**< y offset of the bounding box*/ + uint8_t bpp: 4; /**< Bit-per-pixel: 1, 2, 4, 8*/ + uint8_t is_placeholder: 1; /** Glyph is missing. But placeholder will still be displayed */ +} lv_font_glyph_dsc_t; + +/** The bitmaps might be upscaled by 3 to achieve subpixel rendering.*/ +enum { + LV_FONT_SUBPX_NONE, + LV_FONT_SUBPX_HOR, + LV_FONT_SUBPX_VER, + LV_FONT_SUBPX_BOTH, +}; + +typedef uint8_t lv_font_subpx_t; + +/** Describe the properties of a font*/ +typedef struct _lv_font_t { + /** Get a glyph's descriptor from a font*/ + bool (*get_glyph_dsc)(const struct _lv_font_t *, lv_font_glyph_dsc_t *, uint32_t letter, uint32_t letter_next); + + /** Get a glyph's bitmap from a font*/ + const uint8_t * (*get_glyph_bitmap)(const struct _lv_font_t *, uint32_t); + + /*Pointer to the font in a font pack (must have the same line height)*/ + lv_coord_t line_height; /**< The real line height where any text fits*/ + lv_coord_t base_line; /**< Base line measured from the top of the line_height*/ + uint8_t subpx : 2; /**< An element of `lv_font_subpx_t`*/ + + int8_t underline_position; /**< Distance between the top of the underline and base line (< 0 means below the base line)*/ + int8_t underline_thickness; /**< Thickness of the underline*/ + + const void * dsc; /**< Store implementation specific or run_time data or caching here*/ + const struct _lv_font_t * fallback; /**< Fallback font for missing glyph. Resolved recursively */ +#if LV_USE_USER_DATA + void * user_data; /**< Custom user data for font.*/ +#endif +} lv_font_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Return with the bitmap of a font. + * @param font_p pointer to a font + * @param letter a UNICODE character code + * @return pointer to the bitmap of the letter + */ +const uint8_t * lv_font_get_glyph_bitmap(const lv_font_t * font_p, uint32_t letter); + +/** + * Get the descriptor of a glyph + * @param font_p pointer to font + * @param dsc_out store the result descriptor here + * @param letter a UNICODE letter code + * @param letter_next the next letter after `letter`. Used for kerning + * @return true: descriptor is successfully loaded into `dsc_out`. + * false: the letter was not found, no data is loaded to `dsc_out` + */ +bool lv_font_get_glyph_dsc(const lv_font_t * font_p, lv_font_glyph_dsc_t * dsc_out, uint32_t letter, + uint32_t letter_next); + +/** + * Get the width of a glyph with kerning + * @param font pointer to a font + * @param letter a UNICODE letter + * @param letter_next the next letter after `letter`. Used for kerning + * @return the width of the glyph + */ +uint16_t lv_font_get_glyph_width(const lv_font_t * font, uint32_t letter, uint32_t letter_next); + +/** + * Get the line height of a font. All characters fit into this height + * @param font_p pointer to a font + * @return the height of a font + */ +static inline lv_coord_t lv_font_get_line_height(const lv_font_t * font_p) +{ + return font_p->line_height; +} + +/********************** + * MACROS + **********************/ + +#define LV_FONT_DECLARE(font_name) extern const lv_font_t font_name; + +#if LV_FONT_MONTSERRAT_8 +LV_FONT_DECLARE(lv_font_montserrat_8) +#endif + +#if LV_FONT_MONTSERRAT_10 +LV_FONT_DECLARE(lv_font_montserrat_10) +#endif + +#if LV_FONT_MONTSERRAT_12 +LV_FONT_DECLARE(lv_font_montserrat_12) +#endif + +#if LV_FONT_MONTSERRAT_14 +LV_FONT_DECLARE(lv_font_montserrat_14) +#endif + +#if LV_FONT_MONTSERRAT_16 +LV_FONT_DECLARE(lv_font_montserrat_16) +#endif + +#if LV_FONT_MONTSERRAT_18 +LV_FONT_DECLARE(lv_font_montserrat_18) +#endif + +#if LV_FONT_MONTSERRAT_20 +LV_FONT_DECLARE(lv_font_montserrat_20) +#endif + +#if LV_FONT_MONTSERRAT_22 +LV_FONT_DECLARE(lv_font_montserrat_22) +#endif + +#if LV_FONT_MONTSERRAT_24 +LV_FONT_DECLARE(lv_font_montserrat_24) +#endif + +#if LV_FONT_MONTSERRAT_26 +LV_FONT_DECLARE(lv_font_montserrat_26) +#endif + +#if LV_FONT_MONTSERRAT_28 +LV_FONT_DECLARE(lv_font_montserrat_28) +#endif + +#if LV_FONT_MONTSERRAT_30 +LV_FONT_DECLARE(lv_font_montserrat_30) +#endif + +#if LV_FONT_MONTSERRAT_32 +LV_FONT_DECLARE(lv_font_montserrat_32) +#endif + +#if LV_FONT_MONTSERRAT_34 +LV_FONT_DECLARE(lv_font_montserrat_34) +#endif + +#if LV_FONT_MONTSERRAT_36 +LV_FONT_DECLARE(lv_font_montserrat_36) +#endif + +#if LV_FONT_MONTSERRAT_38 +LV_FONT_DECLARE(lv_font_montserrat_38) +#endif + +#if LV_FONT_MONTSERRAT_40 +LV_FONT_DECLARE(lv_font_montserrat_40) +#endif + +#if LV_FONT_MONTSERRAT_42 +LV_FONT_DECLARE(lv_font_montserrat_42) +#endif + +#if LV_FONT_MONTSERRAT_44 +LV_FONT_DECLARE(lv_font_montserrat_44) +#endif + +#if LV_FONT_MONTSERRAT_46 +LV_FONT_DECLARE(lv_font_montserrat_46) +#endif + +#if LV_FONT_MONTSERRAT_48 +LV_FONT_DECLARE(lv_font_montserrat_48) +#endif + +#if LV_FONT_MONTSERRAT_12_SUBPX +LV_FONT_DECLARE(lv_font_montserrat_12_subpx) +#endif + +#if LV_FONT_MONTSERRAT_28_COMPRESSED +LV_FONT_DECLARE(lv_font_montserrat_28_compressed) +#endif + +#if LV_FONT_DEJAVU_16_PERSIAN_HEBREW +LV_FONT_DECLARE(lv_font_dejavu_16_persian_hebrew) +#endif + +#if LV_FONT_SIMSUN_16_CJK +LV_FONT_DECLARE(lv_font_simsun_16_cjk) +#endif + +#if LV_FONT_UNSCII_8 +LV_FONT_DECLARE(lv_font_unscii_8) +#endif + +#if LV_FONT_UNSCII_16 +LV_FONT_DECLARE(lv_font_unscii_16) +#endif + +/*Declare the custom (user defined) fonts*/ +#ifdef LV_FONT_CUSTOM_DECLARE +LV_FONT_CUSTOM_DECLARE +#endif + +/** + * Just a wrapper around LV_FONT_DEFAULT because it might be more convenient to use a function in some cases + * @return pointer to LV_FONT_DEFAULT + */ +static inline const lv_font_t * lv_font_default(void) +{ + return LV_FONT_DEFAULT; +} + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*USE_FONT*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font.mk b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font.mk new file mode 100644 index 0000000..2201b73 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font.mk @@ -0,0 +1,36 @@ +CSRCS += lv_font.c +CSRCS += lv_font_fmt_txt.c +CSRCS += lv_font_loader.c + +CSRCS += lv_font_dejavu_16_persian_hebrew.c +CSRCS += lv_font_montserrat_8.c +CSRCS += lv_font_montserrat_10.c +CSRCS += lv_font_montserrat_12.c +CSRCS += lv_font_montserrat_12_subpx.c +CSRCS += lv_font_montserrat_14.c +CSRCS += lv_font_montserrat_16.c +CSRCS += lv_font_montserrat_18.c +CSRCS += lv_font_montserrat_20.c +CSRCS += lv_font_montserrat_22.c +CSRCS += lv_font_montserrat_24.c +CSRCS += lv_font_montserrat_26.c +CSRCS += lv_font_montserrat_28.c +CSRCS += lv_font_montserrat_28_compressed.c +CSRCS += lv_font_montserrat_30.c +CSRCS += lv_font_montserrat_32.c +CSRCS += lv_font_montserrat_34.c +CSRCS += lv_font_montserrat_36.c +CSRCS += lv_font_montserrat_38.c +CSRCS += lv_font_montserrat_40.c +CSRCS += lv_font_montserrat_42.c +CSRCS += lv_font_montserrat_44.c +CSRCS += lv_font_montserrat_46.c +CSRCS += lv_font_montserrat_48.c +CSRCS += lv_font_simsun_16_cjk.c +CSRCS += lv_font_unscii_8.c +CSRCS += lv_font_unscii_16.c + +DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/font +VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/font + +CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/font" diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_dejavu_16_persian_hebrew.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_dejavu_16_persian_hebrew.c new file mode 100644 index 0000000..fce6b0c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_dejavu_16_persian_hebrew.c @@ -0,0 +1,6614 @@ +/******************************************************************************* + * Size: 16 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 16 --font DejaVuSans.ttf -r 0x20-0x7f,0x5d0-0x5ea,0x600-0x6FF,0xFB50-0xFDFF,0xFE70-0xFEFF --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_dejavu_16_persian_hebrew.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_DEJAVU_16_PERSIAN_HEBREW + #define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 1 +#endif + +#if LV_FONT_DEJAVU_16_PERSIAN_HEBREW + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x8f, 0x8e, 0x6d, + 0x0, 0x0, 0x9f, 0x9f, + + /* U+0022 "\"" */ + 0x7e, 0x8, 0xd7, 0xe0, 0x8d, 0x7e, 0x8, 0xd7, + 0xe0, 0x8d, 0x24, 0x2, 0x40, + + /* U+0023 "#" */ + 0x0, 0x0, 0x5e, 0x0, 0xc7, 0x0, 0x0, 0x0, + 0x8b, 0x0, 0xf3, 0x0, 0x0, 0x0, 0xb8, 0x3, + 0xf0, 0x0, 0x0, 0x0, 0xf4, 0x6, 0xd0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x2, 0x38, + 0xd3, 0x3e, 0x73, 0x30, 0x0, 0xa, 0x90, 0x1f, + 0x20, 0x0, 0x0, 0xe, 0x50, 0x5e, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0x40, 0x23, 0x8d, + 0x33, 0xe7, 0x33, 0x0, 0x0, 0xa9, 0x2, 0xf1, + 0x0, 0x0, 0x0, 0xf4, 0x6, 0xd0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x6, 0x60, 0x0, 0x0, 0x6, 0x60, 0x0, + 0x5, 0xce, 0xfd, 0xa1, 0x5f, 0x77, 0x84, 0x91, + 0x9d, 0x6, 0x60, 0x0, 0x8f, 0x36, 0x60, 0x0, + 0x1c, 0xfe, 0xc6, 0x10, 0x0, 0x3a, 0xde, 0xe3, + 0x0, 0x6, 0x60, 0xdb, 0x0, 0x6, 0x60, 0xac, + 0x98, 0x47, 0x87, 0xf7, 0x4a, 0xef, 0xfd, 0x70, + 0x0, 0x6, 0x60, 0x0, 0x0, 0x6, 0x60, 0x0, + 0x0, 0x3, 0x30, 0x0, + + /* U+0025 "%" */ + 0x2, 0xbf, 0xc3, 0x0, 0x0, 0xa9, 0x0, 0x0, + 0xca, 0x7, 0xe0, 0x0, 0x4e, 0x0, 0x0, 0xf, + 0x30, 0xf, 0x30, 0xd, 0x50, 0x0, 0x0, 0xf2, + 0x0, 0xf3, 0x8, 0xb0, 0x0, 0x0, 0xc, 0x90, + 0x7e, 0x2, 0xf2, 0x0, 0x0, 0x0, 0x2b, 0xfc, + 0x30, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0x1, 0xbe, 0xc3, 0x0, 0x0, 0x0, 0xe, + 0x50, 0xba, 0x6, 0xe0, 0x0, 0x0, 0x8, 0xb0, + 0xf, 0x30, 0xf, 0x40, 0x0, 0x2, 0xf2, 0x0, + 0xf3, 0x0, 0xf4, 0x0, 0x0, 0xc7, 0x0, 0xb, + 0xa0, 0x7e, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x1b, + 0xfd, 0x40, + + /* U+0026 "&" */ + 0x0, 0x5d, 0xfe, 0xa0, 0x0, 0x0, 0x4f, 0xa4, + 0x6c, 0x10, 0x0, 0x9, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0x10, 0x0, 0x0, 0x0, 0x2, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xae, 0xfa, 0x0, 0x0, + 0x41, 0x7f, 0x35, 0xfa, 0x0, 0x2f, 0x4d, 0xa0, + 0x5, 0xf9, 0x6, 0xf0, 0xf9, 0x0, 0x6, 0xf9, + 0xd9, 0xc, 0xd0, 0x0, 0x6, 0xff, 0x10, 0x3f, + 0xb3, 0x13, 0xaf, 0xf8, 0x0, 0x3b, 0xef, 0xd9, + 0x27, 0xf7, + + /* U+0027 "'" */ + 0x7e, 0x7e, 0x7e, 0x7e, 0x24, + + /* U+0028 "(" */ + 0x0, 0x8b, 0x2, 0xf3, 0x9, 0xc0, 0xe, 0x70, + 0x3f, 0x30, 0x7f, 0x0, 0x9f, 0x0, 0x9e, 0x0, + 0x8f, 0x0, 0x5f, 0x10, 0x2f, 0x50, 0xc, 0xa0, + 0x5, 0xf0, 0x0, 0xd7, 0x0, 0x36, + + /* U+0029 ")" */ + 0x7c, 0x0, 0xe, 0x50, 0x9, 0xc0, 0x3, 0xf3, + 0x0, 0xf7, 0x0, 0xcb, 0x0, 0xbc, 0x0, 0xad, + 0x0, 0xbc, 0x0, 0xe9, 0x1, 0xf5, 0x6, 0xf0, + 0xb, 0x90, 0x3f, 0x10, 0x45, 0x0, + + /* U+002A "*" */ + 0x0, 0x7, 0x70, 0x0, 0x24, 0x7, 0x70, 0x42, + 0x2b, 0xb8, 0x9a, 0xb2, 0x0, 0x4f, 0xf4, 0x0, + 0x5, 0xcb, 0xcc, 0x50, 0x4a, 0x17, 0x71, 0x94, + 0x0, 0x7, 0x70, 0x0, 0x0, 0x2, 0x20, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0xf, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xf5, 0x0, 0x0, 0x1, 0x11, + 0x1f, 0x61, 0x11, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x14, 0x44, 0x4f, 0x84, 0x44, 0x30, 0x0, + 0x0, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xf, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x50, 0x0, 0x0, + + /* U+002C "," */ + 0x1d, 0x72, 0xf7, 0x6f, 0x1a, 0x80, + + /* U+002D "-" */ + 0x1, 0x11, 0x13, 0xff, 0xff, 0x3, 0x33, 0x30, + + /* U+002E "." */ + 0x4f, 0x54, 0xf5, + + /* U+002F "/" */ + 0x0, 0x1, 0xf3, 0x0, 0x6, 0xe0, 0x0, 0xb, + 0x90, 0x0, 0xf, 0x40, 0x0, 0x5f, 0x0, 0x0, + 0xaa, 0x0, 0x0, 0xf5, 0x0, 0x4, 0xf1, 0x0, + 0x9, 0xb0, 0x0, 0xe, 0x60, 0x0, 0x3f, 0x10, + 0x0, 0x8c, 0x0, 0x0, 0xd7, 0x0, 0x0, + + /* U+0030 "0" */ + 0x1, 0xae, 0xfb, 0x20, 0x0, 0xde, 0x65, 0xde, + 0x10, 0x5f, 0x40, 0x1, 0xf8, 0xa, 0xe0, 0x0, + 0xb, 0xd0, 0xdb, 0x0, 0x0, 0x8f, 0xe, 0xa0, + 0x0, 0x7, 0xf1, 0xea, 0x0, 0x0, 0x7f, 0x1d, + 0xb0, 0x0, 0x8, 0xf0, 0xae, 0x0, 0x0, 0xbd, + 0x6, 0xf3, 0x0, 0x1f, 0x80, 0xd, 0xe6, 0x5d, + 0xe1, 0x0, 0x1a, 0xef, 0xb2, 0x0, + + /* U+0031 "1" */ + 0x19, 0xcf, 0xf2, 0x0, 0x3e, 0xbb, 0xf2, 0x0, + 0x0, 0x7, 0xf2, 0x0, 0x0, 0x7, 0xf2, 0x0, + 0x0, 0x7, 0xf2, 0x0, 0x0, 0x7, 0xf2, 0x0, + 0x0, 0x7, 0xf2, 0x0, 0x0, 0x7, 0xf2, 0x0, + 0x0, 0x7, 0xf2, 0x0, 0x0, 0x7, 0xf2, 0x0, + 0x5, 0x59, 0xf6, 0x53, 0xf, 0xff, 0xff, 0xfb, + + /* U+0032 "2" */ + 0x49, 0xdf, 0xd9, 0x10, 0xcc, 0x75, 0x8f, 0xd0, + 0x20, 0x0, 0x5, 0xf6, 0x0, 0x0, 0x1, 0xf7, + 0x0, 0x0, 0x5, 0xf5, 0x0, 0x0, 0x1e, 0xc0, + 0x0, 0x0, 0xce, 0x20, 0x0, 0xb, 0xf3, 0x0, + 0x0, 0xbf, 0x30, 0x0, 0xa, 0xf3, 0x0, 0x0, + 0x9f, 0x95, 0x55, 0x53, 0xdf, 0xff, 0xff, 0xf9, + + /* U+0033 "3" */ + 0x3b, 0xef, 0xeb, 0x30, 0x5a, 0x75, 0x7d, 0xf3, + 0x0, 0x0, 0x1, 0xf8, 0x0, 0x0, 0x0, 0xf8, + 0x0, 0x0, 0x2a, 0xf2, 0x0, 0xcf, 0xfe, 0x30, + 0x0, 0x23, 0x5c, 0xe3, 0x0, 0x0, 0x0, 0xeb, + 0x0, 0x0, 0x0, 0xbe, 0x0, 0x0, 0x1, 0xeb, + 0xb9, 0x65, 0x8e, 0xf3, 0x6c, 0xef, 0xda, 0x20, + + /* U+0034 "4" */ + 0x0, 0x0, 0xa, 0xfa, 0x0, 0x0, 0x0, 0x4e, + 0xfa, 0x0, 0x0, 0x0, 0xe6, 0xfa, 0x0, 0x0, + 0x9, 0xc0, 0xfa, 0x0, 0x0, 0x3f, 0x20, 0xfa, + 0x0, 0x0, 0xc8, 0x0, 0xfa, 0x0, 0x7, 0xe0, + 0x0, 0xfa, 0x0, 0x1f, 0x61, 0x11, 0xfa, 0x10, + 0x3f, 0xff, 0xff, 0xff, 0xf4, 0x4, 0x44, 0x44, + 0xfb, 0x41, 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xfa, 0x0, + + /* U+0035 "5" */ + 0x4f, 0xff, 0xff, 0xe0, 0x4f, 0x75, 0x55, 0x40, + 0x4f, 0x20, 0x0, 0x0, 0x4f, 0x20, 0x0, 0x0, + 0x4f, 0xff, 0xfa, 0x20, 0x39, 0x54, 0x7f, 0xe1, + 0x0, 0x0, 0x3, 0xf8, 0x0, 0x0, 0x0, 0xeb, + 0x0, 0x0, 0x0, 0xeb, 0x0, 0x0, 0x4, 0xf8, + 0xb9, 0x66, 0x9f, 0xe1, 0x7c, 0xef, 0xe9, 0x10, + + /* U+0036 "6" */ + 0x0, 0x4c, 0xff, 0xc3, 0x0, 0x6f, 0xb7, 0x69, + 0x50, 0x2f, 0x90, 0x0, 0x0, 0x8, 0xf1, 0x0, + 0x0, 0x0, 0xbc, 0x6e, 0xfe, 0x70, 0xd, 0xfe, + 0x64, 0x9f, 0x70, 0xdf, 0x50, 0x0, 0xbe, 0xc, + 0xf0, 0x0, 0x7, 0xf2, 0x9f, 0x0, 0x0, 0x7f, + 0x24, 0xf5, 0x0, 0xc, 0xe0, 0xb, 0xf7, 0x5a, + 0xf6, 0x0, 0x9, 0xef, 0xd5, 0x0, + + /* U+0037 "7" */ + 0xbf, 0xff, 0xff, 0xfc, 0x35, 0x55, 0x57, 0xf8, + 0x0, 0x0, 0x8, 0xf2, 0x0, 0x0, 0xe, 0xc0, + 0x0, 0x0, 0x4f, 0x60, 0x0, 0x0, 0xaf, 0x0, + 0x0, 0x0, 0xfa, 0x0, 0x0, 0x6, 0xf4, 0x0, + 0x0, 0xc, 0xe0, 0x0, 0x0, 0x2f, 0x80, 0x0, + 0x0, 0x8f, 0x20, 0x0, 0x0, 0xdc, 0x0, 0x0, + + /* U+0038 "8" */ + 0x3, 0xbe, 0xfc, 0x50, 0x3, 0xfc, 0x55, 0xbf, + 0x50, 0x8f, 0x10, 0x0, 0xeb, 0x9, 0xf0, 0x0, + 0xd, 0xb0, 0x2f, 0x91, 0x17, 0xf4, 0x0, 0x3e, + 0xff, 0xf5, 0x0, 0x2e, 0xb4, 0x49, 0xf5, 0xb, + 0xe0, 0x0, 0xb, 0xe0, 0xeb, 0x0, 0x0, 0x8f, + 0x1c, 0xe0, 0x0, 0xb, 0xf0, 0x5f, 0xc5, 0x5a, + 0xf8, 0x0, 0x4c, 0xef, 0xc6, 0x0, + + /* U+0039 "9" */ + 0x3, 0xcf, 0xea, 0x10, 0x3, 0xfc, 0x56, 0xed, + 0x0, 0xbe, 0x0, 0x2, 0xf7, 0xe, 0xa0, 0x0, + 0xe, 0xc0, 0xfa, 0x0, 0x0, 0xdf, 0xc, 0xd0, + 0x0, 0x1f, 0xf0, 0x6f, 0x91, 0x2b, 0xff, 0x0, + 0x7f, 0xff, 0xbb, 0xe0, 0x0, 0x2, 0x10, 0xdb, + 0x0, 0x0, 0x0, 0x6f, 0x40, 0x39, 0x66, 0xaf, + 0x90, 0x2, 0xbe, 0xfd, 0x60, 0x0, + + /* U+003A ":" */ + 0x2f, 0x81, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0x82, 0xf8, + + /* U+003B ";" */ + 0x2f, 0x81, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0x72, 0xf7, 0x6f, 0x1a, 0x80, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x28, 0xeb, 0x0, 0x0, 0x16, 0xcf, 0xe8, + 0x20, 0x5, 0xbf, 0xe9, 0x30, 0x0, 0x3f, 0xfa, + 0x50, 0x0, 0x0, 0x3, 0xef, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x4a, 0xff, 0xa4, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xfe, 0x93, 0x0, 0x0, 0x0, 0x1, + 0x7d, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, + + /* U+003D "=" */ + 0x1, 0x11, 0x11, 0x11, 0x11, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x14, 0x44, 0x44, 0x44, 0x44, + 0x20, 0x11, 0x11, 0x11, 0x11, 0x10, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x44, 0x44, 0x44, 0x44, + 0x42, + + /* U+003E ">" */ + 0x11, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfa, 0x40, + 0x0, 0x0, 0x0, 0x6, 0xbf, 0xe9, 0x30, 0x0, + 0x0, 0x0, 0x17, 0xcf, 0xd7, 0x20, 0x0, 0x0, + 0x0, 0x28, 0xef, 0x90, 0x0, 0x0, 0x3, 0x9e, + 0xf8, 0x0, 0x2, 0x8d, 0xfc, 0x61, 0x0, 0x7c, + 0xfe, 0x82, 0x0, 0x0, 0x4f, 0x94, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x4b, 0xef, 0xb3, 0xd, 0xa5, 0x6e, 0xe1, 0x20, + 0x0, 0x4f, 0x40, 0x0, 0x6, 0xf3, 0x0, 0x3, + 0xfa, 0x0, 0x2, 0xeb, 0x0, 0x0, 0xbd, 0x0, + 0x0, 0xe, 0x90, 0x0, 0x0, 0xc8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0xf, + 0xa0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x7b, 0xee, 0xd8, 0x20, 0x0, 0x0, + 0x3e, 0xd6, 0x43, 0x5a, 0xf6, 0x0, 0x3, 0xf6, + 0x0, 0x0, 0x0, 0x3e, 0x60, 0xe, 0x60, 0x0, + 0x0, 0x0, 0x3, 0xf2, 0x6c, 0x0, 0x1a, 0xed, + 0x6c, 0x50, 0xa8, 0xb6, 0x0, 0xbc, 0x44, 0xcf, + 0x50, 0x6c, 0xe3, 0x2, 0xf2, 0x0, 0x2f, 0x50, + 0x4d, 0xe3, 0x4, 0xf0, 0x0, 0xf, 0x50, 0x5c, + 0xc5, 0x2, 0xf1, 0x0, 0x1f, 0x50, 0xb8, 0x8a, + 0x0, 0xda, 0x11, 0xaf, 0x68, 0xe1, 0x1f, 0x30, + 0x2d, 0xff, 0x9c, 0xfa, 0x10, 0x6, 0xe3, 0x0, + 0x11, 0x1, 0x0, 0x0, 0x0, 0x7f, 0x83, 0x0, + 0x16, 0xd4, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xfb, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, + 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x9f, 0x80, 0x0, 0x0, 0x0, 0xf, + 0xfe, 0x0, 0x0, 0x0, 0x5, 0xfb, 0xf4, 0x0, + 0x0, 0x0, 0xbe, 0x1f, 0xa0, 0x0, 0x0, 0x1f, + 0x90, 0xaf, 0x10, 0x0, 0x7, 0xf3, 0x4, 0xf6, + 0x0, 0x0, 0xdd, 0x0, 0xe, 0xc0, 0x0, 0x3f, + 0x81, 0x11, 0x9f, 0x20, 0x9, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xec, 0x44, 0x44, 0x4c, 0xe0, 0x5f, + 0x50, 0x0, 0x0, 0x6f, 0x4b, 0xf0, 0x0, 0x0, + 0x0, 0xfa, + + /* U+0042 "B" */ + 0x6f, 0xff, 0xfe, 0xa2, 0x6, 0xf6, 0x44, 0x7e, + 0xe0, 0x6f, 0x20, 0x0, 0x5f, 0x46, 0xf2, 0x0, + 0x4, 0xf4, 0x6f, 0x30, 0x3, 0xce, 0x6, 0xff, + 0xff, 0xfd, 0x20, 0x6f, 0x53, 0x35, 0xce, 0x26, + 0xf2, 0x0, 0x1, 0xfa, 0x6f, 0x20, 0x0, 0xd, + 0xc6, 0xf2, 0x0, 0x1, 0xfb, 0x6f, 0x64, 0x46, + 0xdf, 0x46, 0xff, 0xff, 0xeb, 0x40, + + /* U+0043 "C" */ + 0x0, 0x3, 0xae, 0xfe, 0xb5, 0x0, 0x6, 0xfd, + 0x75, 0x6a, 0xf4, 0x3, 0xfa, 0x0, 0x0, 0x2, + 0x30, 0xaf, 0x10, 0x0, 0x0, 0x0, 0xf, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x90, 0x0, 0x0, 0x0, 0x0, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xa0, 0x0, 0x0, 0x23, 0x0, + 0x6f, 0xd7, 0x56, 0xaf, 0x40, 0x0, 0x3a, 0xef, + 0xeb, 0x40, + + /* U+0044 "D" */ + 0x6f, 0xff, 0xfd, 0xa5, 0x0, 0x6, 0xf6, 0x45, + 0x7b, 0xfb, 0x0, 0x6f, 0x20, 0x0, 0x6, 0xf9, + 0x6, 0xf2, 0x0, 0x0, 0xb, 0xf0, 0x6f, 0x20, + 0x0, 0x0, 0x6f, 0x36, 0xf2, 0x0, 0x0, 0x4, + 0xf5, 0x6f, 0x20, 0x0, 0x0, 0x5f, 0x56, 0xf2, + 0x0, 0x0, 0x6, 0xf3, 0x6f, 0x20, 0x0, 0x0, + 0xbf, 0x6, 0xf2, 0x0, 0x0, 0x6f, 0x80, 0x6f, + 0x64, 0x57, 0xbf, 0xb0, 0x6, 0xff, 0xff, 0xea, + 0x50, 0x0, + + /* U+0045 "E" */ + 0x6f, 0xff, 0xff, 0xff, 0x6, 0xf6, 0x55, 0x55, + 0x50, 0x6f, 0x20, 0x0, 0x0, 0x6, 0xf2, 0x0, + 0x0, 0x0, 0x6f, 0x31, 0x11, 0x10, 0x6, 0xff, + 0xff, 0xff, 0xb0, 0x6f, 0x54, 0x44, 0x42, 0x6, + 0xf2, 0x0, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0x65, 0x55, + 0x55, 0x6, 0xff, 0xff, 0xff, 0xf1, + + /* U+0046 "F" */ + 0x6f, 0xff, 0xff, 0xf4, 0x6f, 0x65, 0x55, 0x51, + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x31, 0x11, 0x0, 0x6f, 0xff, 0xff, 0xc0, + 0x6f, 0x54, 0x44, 0x30, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x3, 0xae, 0xff, 0xc8, 0x10, 0x0, 0x6f, + 0xd7, 0x55, 0x9e, 0xc0, 0x3, 0xfa, 0x0, 0x0, + 0x1, 0x70, 0xb, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x90, + 0x0, 0x0, 0x0, 0x0, 0xf, 0x90, 0x0, 0xf, + 0xff, 0xf1, 0xf, 0xb0, 0x0, 0x3, 0x39, 0xf1, + 0xb, 0xf1, 0x0, 0x0, 0x7, 0xf1, 0x3, 0xfa, + 0x0, 0x0, 0x7, 0xf1, 0x0, 0x6f, 0xd7, 0x55, + 0x8d, 0xf1, 0x0, 0x3, 0xae, 0xff, 0xc7, 0x10, + + /* U+0048 "H" */ + 0x6f, 0x20, 0x0, 0x1, 0xf7, 0x6f, 0x20, 0x0, + 0x1, 0xf7, 0x6f, 0x20, 0x0, 0x1, 0xf7, 0x6f, + 0x20, 0x0, 0x1, 0xf7, 0x6f, 0x31, 0x11, 0x12, + 0xf7, 0x6f, 0xff, 0xff, 0xff, 0xf7, 0x6f, 0x54, + 0x44, 0x45, 0xf7, 0x6f, 0x20, 0x0, 0x1, 0xf7, + 0x6f, 0x20, 0x0, 0x1, 0xf7, 0x6f, 0x20, 0x0, + 0x1, 0xf7, 0x6f, 0x20, 0x0, 0x1, 0xf7, 0x6f, + 0x20, 0x0, 0x1, 0xf7, + + /* U+0049 "I" */ + 0x6f, 0x26, 0xf2, 0x6f, 0x26, 0xf2, 0x6f, 0x26, + 0xf2, 0x6f, 0x26, 0xf2, 0x6f, 0x26, 0xf2, 0x6f, + 0x26, 0xf2, + + /* U+004A "J" */ + 0x0, 0x6f, 0x20, 0x6, 0xf2, 0x0, 0x6f, 0x20, + 0x6, 0xf2, 0x0, 0x6f, 0x20, 0x6, 0xf2, 0x0, + 0x6f, 0x20, 0x6, 0xf2, 0x0, 0x6f, 0x20, 0x6, + 0xf2, 0x0, 0x6f, 0x20, 0x7, 0xf2, 0x0, 0xaf, + 0x4, 0x8f, 0xa0, 0xde, 0x90, 0x0, + + /* U+004B "K" */ + 0x6f, 0x20, 0x0, 0x3e, 0xd1, 0x6f, 0x20, 0x3, + 0xec, 0x10, 0x6f, 0x20, 0x3f, 0xc0, 0x0, 0x6f, + 0x24, 0xfb, 0x0, 0x0, 0x6f, 0x7f, 0xb0, 0x0, + 0x0, 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x6f, 0xbf, + 0x80, 0x0, 0x0, 0x6f, 0x29, 0xf7, 0x0, 0x0, + 0x6f, 0x20, 0xaf, 0x70, 0x0, 0x6f, 0x20, 0xa, + 0xf6, 0x0, 0x6f, 0x20, 0x0, 0xaf, 0x60, 0x6f, + 0x20, 0x0, 0xb, 0xf5, + + /* U+004C "L" */ + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x65, 0x55, 0x54, 0x6f, 0xff, 0xff, 0xfd, + + /* U+004D "M" */ + 0x6f, 0xf1, 0x0, 0x0, 0x4f, 0xf4, 0x6f, 0xf7, + 0x0, 0x0, 0xaf, 0xf4, 0x6f, 0xad, 0x0, 0x0, + 0xf9, 0xf4, 0x6f, 0x4f, 0x30, 0x6, 0xe5, 0xf4, + 0x6f, 0x1c, 0x90, 0xc, 0x94, 0xf4, 0x6f, 0x16, + 0xe0, 0x2f, 0x34, 0xf4, 0x6f, 0x11, 0xf4, 0x7d, + 0x4, 0xf4, 0x6f, 0x10, 0xba, 0xd8, 0x4, 0xf4, + 0x6f, 0x10, 0x5f, 0xf2, 0x4, 0xf4, 0x6f, 0x10, + 0xa, 0x90, 0x4, 0xf4, 0x6f, 0x10, 0x0, 0x0, + 0x4, 0xf4, 0x6f, 0x10, 0x0, 0x0, 0x4, 0xf4, + + /* U+004E "N" */ + 0x6f, 0xe0, 0x0, 0x2, 0xf6, 0x6f, 0xf7, 0x0, + 0x2, 0xf6, 0x6f, 0xbe, 0x0, 0x2, 0xf6, 0x6f, + 0x3f, 0x80, 0x2, 0xf6, 0x6f, 0x19, 0xf1, 0x2, + 0xf6, 0x6f, 0x11, 0xf8, 0x2, 0xf6, 0x6f, 0x10, + 0x8f, 0x12, 0xf6, 0x6f, 0x10, 0x1f, 0x92, 0xf6, + 0x6f, 0x10, 0x8, 0xf3, 0xf6, 0x6f, 0x10, 0x1, + 0xfb, 0xf6, 0x6f, 0x10, 0x0, 0x7f, 0xf6, 0x6f, + 0x10, 0x0, 0xe, 0xf6, + + /* U+004F "O" */ + 0x0, 0x4, 0xbe, 0xfd, 0x91, 0x0, 0x0, 0x7f, + 0xc6, 0x58, 0xee, 0x20, 0x3, 0xfa, 0x0, 0x0, + 0x2f, 0xd0, 0xa, 0xf1, 0x0, 0x0, 0x7, 0xf4, + 0xf, 0xb0, 0x0, 0x0, 0x2, 0xf8, 0xf, 0x90, + 0x0, 0x0, 0x0, 0xfa, 0xf, 0x90, 0x0, 0x0, + 0x0, 0xfa, 0xf, 0xb0, 0x0, 0x0, 0x2, 0xf8, + 0xb, 0xf1, 0x0, 0x0, 0x7, 0xf4, 0x3, 0xfa, + 0x0, 0x0, 0x2e, 0xd0, 0x0, 0x7f, 0xc6, 0x58, + 0xee, 0x20, 0x0, 0x4, 0xbe, 0xfd, 0x91, 0x0, + + /* U+0050 "P" */ + 0x6f, 0xff, 0xfc, 0x60, 0x6, 0xf6, 0x45, 0xbf, + 0x80, 0x6f, 0x20, 0x0, 0xdf, 0x6, 0xf2, 0x0, + 0x9, 0xf1, 0x6f, 0x20, 0x0, 0xbf, 0x6, 0xf3, + 0x1, 0x7f, 0xa0, 0x6f, 0xff, 0xff, 0xa1, 0x6, + 0xf5, 0x32, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0x20, 0x0, + 0x0, 0x6, 0xf2, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x4, 0xbe, 0xfd, 0x81, 0x0, 0x0, 0x7f, + 0xc6, 0x58, 0xee, 0x20, 0x3, 0xfa, 0x0, 0x0, + 0x2f, 0xc0, 0xa, 0xf1, 0x0, 0x0, 0x8, 0xf4, + 0xf, 0xb0, 0x0, 0x0, 0x2, 0xf8, 0xf, 0x90, + 0x0, 0x0, 0x0, 0xfa, 0xf, 0x90, 0x0, 0x0, + 0x0, 0xfa, 0xf, 0xb0, 0x0, 0x0, 0x2, 0xf8, + 0xb, 0xf1, 0x0, 0x0, 0x7, 0xf4, 0x3, 0xfa, + 0x0, 0x0, 0x2e, 0xd0, 0x0, 0x7f, 0xc6, 0x47, + 0xef, 0x30, 0x0, 0x4, 0xbe, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x30, + + /* U+0052 "R" */ + 0x6f, 0xff, 0xfd, 0x80, 0x0, 0x6f, 0x64, 0x5a, + 0xf8, 0x0, 0x6f, 0x20, 0x0, 0xcf, 0x0, 0x6f, + 0x20, 0x0, 0x9f, 0x10, 0x6f, 0x20, 0x0, 0xbe, + 0x0, 0x6f, 0x30, 0x16, 0xf6, 0x0, 0x6f, 0xff, + 0xff, 0x90, 0x0, 0x6f, 0x53, 0x5c, 0xf5, 0x0, + 0x6f, 0x20, 0x0, 0xde, 0x0, 0x6f, 0x20, 0x0, + 0x5f, 0x70, 0x6f, 0x20, 0x0, 0xc, 0xe0, 0x6f, + 0x20, 0x0, 0x4, 0xf6, + + /* U+0053 "S" */ + 0x4, 0xbe, 0xfd, 0xa4, 0x6, 0xfc, 0x65, 0x7b, + 0x80, 0xdd, 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, + 0x0, 0x0, 0xaf, 0x71, 0x0, 0x0, 0x1, 0xcf, + 0xfe, 0xa4, 0x0, 0x0, 0x27, 0xbf, 0xf7, 0x0, + 0x0, 0x0, 0x1c, 0xf1, 0x0, 0x0, 0x0, 0x6f, + 0x32, 0x0, 0x0, 0x9, 0xf2, 0xec, 0x75, 0x5a, + 0xfb, 0x5, 0xad, 0xff, 0xd7, 0x0, + + /* U+0054 "T" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x55, 0x55, + 0xec, 0x55, 0x54, 0x0, 0x0, 0xe, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xeb, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xeb, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xeb, 0x0, 0x0, 0x0, 0x0, 0xe, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xeb, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xeb, + 0x0, 0x0, + + /* U+0055 "U" */ + 0x9f, 0x0, 0x0, 0x4, 0xf5, 0x9f, 0x0, 0x0, + 0x4, 0xf5, 0x9f, 0x0, 0x0, 0x4, 0xf5, 0x9f, + 0x0, 0x0, 0x4, 0xf5, 0x9f, 0x0, 0x0, 0x4, + 0xf5, 0x9f, 0x0, 0x0, 0x4, 0xf5, 0x9f, 0x0, + 0x0, 0x4, 0xf5, 0x9f, 0x0, 0x0, 0x4, 0xf5, + 0x8f, 0x10, 0x0, 0x6, 0xf3, 0x4f, 0x70, 0x0, + 0xb, 0xe0, 0xb, 0xf9, 0x56, 0xbf, 0x60, 0x0, + 0x8d, 0xff, 0xc5, 0x0, + + /* U+0056 "V" */ + 0xbe, 0x0, 0x0, 0x0, 0xf, 0xa5, 0xf5, 0x0, + 0x0, 0x6, 0xf4, 0xe, 0xb0, 0x0, 0x0, 0xbe, + 0x0, 0x9f, 0x10, 0x0, 0x1f, 0x80, 0x3, 0xf6, + 0x0, 0x7, 0xf2, 0x0, 0xd, 0xc0, 0x0, 0xdc, + 0x0, 0x0, 0x7f, 0x20, 0x3f, 0x60, 0x0, 0x1, + 0xf8, 0x9, 0xf1, 0x0, 0x0, 0xb, 0xe0, 0xea, + 0x0, 0x0, 0x0, 0x5f, 0x8f, 0x40, 0x0, 0x0, + 0x0, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x9, 0xf8, + 0x0, 0x0, + + /* U+0057 "W" */ + 0x5f, 0x30, 0x0, 0x1f, 0xe0, 0x0, 0x6, 0xf2, + 0x1f, 0x70, 0x0, 0x5f, 0xf2, 0x0, 0xa, 0xe0, + 0xd, 0xb0, 0x0, 0x9b, 0xd6, 0x0, 0xe, 0xb0, + 0x9, 0xf0, 0x0, 0xd7, 0xaa, 0x0, 0x2f, 0x70, + 0x6, 0xf3, 0x1, 0xf3, 0x6e, 0x0, 0x6f, 0x30, + 0x2, 0xf7, 0x4, 0xf0, 0x2f, 0x20, 0xaf, 0x0, + 0x0, 0xeb, 0x8, 0xb0, 0xe, 0x50, 0xdb, 0x0, + 0x0, 0xae, 0xc, 0x80, 0xa, 0x91, 0xf7, 0x0, + 0x0, 0x6f, 0x3f, 0x40, 0x7, 0xd5, 0xf3, 0x0, + 0x0, 0x2f, 0xbf, 0x0, 0x3, 0xfb, 0xf0, 0x0, + 0x0, 0xe, 0xfc, 0x0, 0x0, 0xff, 0xb0, 0x0, + 0x0, 0xa, 0xf8, 0x0, 0x0, 0xbf, 0x70, 0x0, + + /* U+0058 "X" */ + 0xa, 0xe1, 0x0, 0x0, 0xcd, 0x0, 0x1e, 0xa0, + 0x0, 0x7f, 0x30, 0x0, 0x5f, 0x50, 0x2f, 0x90, + 0x0, 0x0, 0xbe, 0x1c, 0xe0, 0x0, 0x0, 0x1, + 0xfd, 0xf4, 0x0, 0x0, 0x0, 0x8, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xe0, 0x0, 0x0, 0x0, + 0x9f, 0x4f, 0x90, 0x0, 0x0, 0x4f, 0x70, 0x7f, + 0x30, 0x0, 0xd, 0xc0, 0x0, 0xdd, 0x0, 0x8, + 0xf2, 0x0, 0x3, 0xf8, 0x3, 0xf8, 0x0, 0x0, + 0x8, 0xf2, + + /* U+0059 "Y" */ + 0xb, 0xe1, 0x0, 0x0, 0x3f, 0x70, 0x1f, 0xa0, + 0x0, 0xd, 0xc0, 0x0, 0x6f, 0x40, 0x8, 0xf3, + 0x0, 0x0, 0xbe, 0x12, 0xf8, 0x0, 0x0, 0x2, + 0xfa, 0xcd, 0x0, 0x0, 0x0, 0x6, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xeb, 0x0, 0x0, 0x0, 0x0, 0xe, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xeb, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xeb, + 0x0, 0x0, + + /* U+005A "Z" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0x10, 0x55, 0x55, + 0x55, 0x7f, 0xc0, 0x0, 0x0, 0x0, 0xc, 0xe2, + 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0x6, 0xf7, 0x0, 0x0, 0x0, 0x3, 0xfb, 0x0, + 0x0, 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, + 0xbf, 0x30, 0x0, 0x0, 0x0, 0x7f, 0x60, 0x0, + 0x0, 0x0, 0x4f, 0x90, 0x0, 0x0, 0x0, 0x1e, + 0xe5, 0x55, 0x55, 0x55, 0x14, 0xff, 0xff, 0xff, + 0xff, 0xf4, + + /* U+005B "[" */ + 0xaf, 0xfb, 0xad, 0x21, 0xad, 0x0, 0xad, 0x0, + 0xad, 0x0, 0xad, 0x0, 0xad, 0x0, 0xad, 0x0, + 0xad, 0x0, 0xad, 0x0, 0xad, 0x0, 0xad, 0x0, + 0xad, 0x0, 0xaf, 0xfa, 0x12, 0x21, + + /* U+005C "\\" */ + 0xd7, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x3f, 0x10, + 0x0, 0xe, 0x60, 0x0, 0x9, 0xb0, 0x0, 0x4, + 0xf1, 0x0, 0x0, 0xf5, 0x0, 0x0, 0xaa, 0x0, + 0x0, 0x5f, 0x0, 0x0, 0xf, 0x40, 0x0, 0xb, + 0x90, 0x0, 0x6, 0xe0, 0x0, 0x1, 0xf3, + + /* U+005D "]" */ + 0x7f, 0xfe, 0x2, 0xae, 0x0, 0x9e, 0x0, 0x9e, + 0x0, 0x9e, 0x0, 0x9e, 0x0, 0x9e, 0x0, 0x9e, + 0x0, 0x9e, 0x0, 0x9e, 0x0, 0x9e, 0x0, 0x9e, + 0x0, 0x9e, 0x6f, 0xfe, 0x2, 0x21, + + /* U+005E "^" */ + 0x0, 0x0, 0x28, 0x50, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0x60, 0x0, 0x0, 0x1d, 0xd1, 0x8f, 0x50, + 0x0, 0x1d, 0xc1, 0x0, 0x7f, 0x50, 0xc, 0xc0, + 0x0, 0x0, 0x6f, 0x40, + + /* U+005F "_" */ + 0x2f, 0xff, 0xff, 0xff, 0xf2, 0x2, 0x22, 0x22, + 0x22, 0x20, + + /* U+0060 "`" */ + 0x4f, 0x40, 0x0, 0x6e, 0x10, 0x0, 0x8b, 0x0, + + /* U+0061 "a" */ + 0x2, 0xae, 0xfd, 0x90, 0x0, 0x48, 0x53, 0x6d, + 0xc0, 0x0, 0x0, 0x0, 0x3f, 0x20, 0x7, 0xce, + 0xff, 0xf5, 0x8, 0xf6, 0x32, 0x3f, 0x50, 0xe8, + 0x0, 0x3, 0xf5, 0xf, 0x70, 0x0, 0x8f, 0x50, + 0xbd, 0x20, 0x6e, 0xf5, 0x1, 0xae, 0xfb, 0x3f, + 0x50, + + /* U+0062 "b" */ + 0x8e, 0x0, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, + 0x0, 0x8e, 0x0, 0x0, 0x0, 0x8, 0xe3, 0xcf, + 0xe7, 0x0, 0x8f, 0xe6, 0x49, 0xf6, 0x8, 0xf5, + 0x0, 0xa, 0xe0, 0x8f, 0x0, 0x0, 0x5f, 0x28, + 0xe0, 0x0, 0x3, 0xf3, 0x8f, 0x0, 0x0, 0x5f, + 0x28, 0xf5, 0x0, 0xa, 0xe0, 0x8f, 0xe6, 0x49, + 0xf6, 0x8, 0xe3, 0xcf, 0xe7, 0x0, + + /* U+0063 "c" */ + 0x0, 0x2a, 0xef, 0xd7, 0x3, 0xfd, 0x54, 0x69, + 0xb, 0xe0, 0x0, 0x0, 0xf, 0x80, 0x0, 0x0, + 0x1f, 0x70, 0x0, 0x0, 0xf, 0x80, 0x0, 0x0, + 0xb, 0xe0, 0x0, 0x0, 0x3, 0xfd, 0x64, 0x69, + 0x0, 0x3b, 0xff, 0xd7, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, + 0xbb, 0x0, 0x0, 0x0, 0xb, 0xb0, 0x5, 0xdf, + 0xd5, 0xbb, 0x4, 0xfb, 0x45, 0xee, 0xb0, 0xcd, + 0x0, 0x3, 0xfb, 0xf, 0x80, 0x0, 0xd, 0xb1, + 0xf6, 0x0, 0x0, 0xcb, 0xf, 0x70, 0x0, 0xd, + 0xb0, 0xcb, 0x0, 0x2, 0xfb, 0x4, 0xf7, 0x2, + 0xcf, 0xb0, 0x5, 0xdf, 0xd6, 0xbb, + + /* U+0065 "e" */ + 0x0, 0x2b, 0xff, 0xc3, 0x0, 0x2f, 0xc5, 0x4a, + 0xf3, 0xb, 0xe0, 0x0, 0xd, 0xa0, 0xf8, 0x0, + 0x0, 0x8e, 0x1f, 0xff, 0xff, 0xff, 0xf0, 0xf9, + 0x22, 0x22, 0x22, 0xb, 0xd0, 0x0, 0x0, 0x0, + 0x2f, 0xc6, 0x45, 0x88, 0x0, 0x2a, 0xef, 0xeb, + 0x40, + + /* U+0066 "f" */ + 0x0, 0x5d, 0xff, 0x1, 0xf9, 0x33, 0x3, 0xf3, + 0x0, 0xaf, 0xff, 0xf9, 0x15, 0xf4, 0x21, 0x4, + 0xf3, 0x0, 0x4, 0xf3, 0x0, 0x4, 0xf3, 0x0, + 0x4, 0xf3, 0x0, 0x4, 0xf3, 0x0, 0x4, 0xf3, + 0x0, 0x4, 0xf3, 0x0, + + /* U+0067 "g" */ + 0x0, 0x5d, 0xfd, 0x5b, 0xb0, 0x4f, 0xa4, 0x5d, + 0xeb, 0xc, 0xc0, 0x0, 0x2f, 0xb0, 0xf7, 0x0, + 0x0, 0xdb, 0x1f, 0x60, 0x0, 0xc, 0xb0, 0xf7, + 0x0, 0x0, 0xdb, 0xc, 0xc0, 0x0, 0x2f, 0xb0, + 0x4f, 0xa4, 0x5d, 0xeb, 0x0, 0x5d, 0xfd, 0x5c, + 0xa0, 0x0, 0x0, 0x1, 0xf7, 0x0, 0x94, 0x35, + 0xde, 0x10, 0xb, 0xef, 0xea, 0x20, + + /* U+0068 "h" */ + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x2b, 0xfd, 0x60, + 0x8f, 0xd7, 0x49, 0xf4, 0x8f, 0x40, 0x0, 0xda, + 0x8f, 0x0, 0x0, 0xac, 0x8e, 0x0, 0x0, 0xac, + 0x8e, 0x0, 0x0, 0xac, 0x8e, 0x0, 0x0, 0xac, + 0x8e, 0x0, 0x0, 0xac, 0x8e, 0x0, 0x0, 0xac, + + /* U+0069 "i" */ + 0x7f, 0x6c, 0x0, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, + + /* U+006A "j" */ + 0x0, 0x7f, 0x0, 0x6c, 0x0, 0x0, 0x0, 0x7f, + 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, + 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, + 0x0, 0x8e, 0x14, 0xda, 0x4f, 0xb2, + + /* U+006B "k" */ + 0x8e, 0x0, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, + 0x0, 0x8e, 0x0, 0x0, 0x0, 0x8, 0xe0, 0x0, + 0x6f, 0x70, 0x8e, 0x0, 0x7f, 0x60, 0x8, 0xe0, + 0x9f, 0x40, 0x0, 0x8e, 0xae, 0x30, 0x0, 0x8, + 0xff, 0xb0, 0x0, 0x0, 0x8e, 0x3f, 0xa0, 0x0, + 0x8, 0xe0, 0x3f, 0xa0, 0x0, 0x8e, 0x0, 0x3f, + 0xa0, 0x8, 0xe0, 0x0, 0x3f, 0xb0, + + /* U+006C "l" */ + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, + + /* U+006D "m" */ + 0x8e, 0x3c, 0xfd, 0x50, 0x6d, 0xfb, 0x10, 0x8f, + 0xd6, 0x4b, 0xf8, 0xc5, 0x5e, 0xb0, 0x8f, 0x40, + 0x1, 0xfe, 0x0, 0x6, 0xf1, 0x8f, 0x0, 0x0, + 0xea, 0x0, 0x3, 0xf3, 0x8e, 0x0, 0x0, 0xe9, + 0x0, 0x3, 0xf3, 0x8e, 0x0, 0x0, 0xe9, 0x0, + 0x3, 0xf3, 0x8e, 0x0, 0x0, 0xe9, 0x0, 0x3, + 0xf3, 0x8e, 0x0, 0x0, 0xe9, 0x0, 0x3, 0xf3, + 0x8e, 0x0, 0x0, 0xe9, 0x0, 0x3, 0xf3, + + /* U+006E "n" */ + 0x8e, 0x3c, 0xfd, 0x60, 0x8f, 0xc4, 0x16, 0xf4, + 0x8f, 0x30, 0x0, 0xda, 0x8f, 0x0, 0x0, 0xac, + 0x8e, 0x0, 0x0, 0xac, 0x8e, 0x0, 0x0, 0xac, + 0x8e, 0x0, 0x0, 0xac, 0x8e, 0x0, 0x0, 0xac, + 0x8e, 0x0, 0x0, 0xac, + + /* U+006F "o" */ + 0x0, 0x4c, 0xff, 0xb2, 0x0, 0x4f, 0xb4, 0x5d, + 0xe1, 0xc, 0xd0, 0x0, 0x1f, 0x90, 0xf8, 0x0, + 0x0, 0xbd, 0x1f, 0x60, 0x0, 0xa, 0xe0, 0xf8, + 0x0, 0x0, 0xbd, 0xc, 0xd0, 0x0, 0x1f, 0x90, + 0x4f, 0xb5, 0x5d, 0xe1, 0x0, 0x4c, 0xff, 0xb2, + 0x0, + + /* U+0070 "p" */ + 0x8e, 0x4d, 0xfe, 0x70, 0x8, 0xfd, 0x30, 0x6f, + 0x60, 0x8f, 0x40, 0x0, 0x9e, 0x8, 0xf0, 0x0, + 0x4, 0xf2, 0x8e, 0x0, 0x0, 0x3f, 0x38, 0xf0, + 0x0, 0x5, 0xf2, 0x8f, 0x60, 0x0, 0xbe, 0x8, + 0xfe, 0x74, 0x9f, 0x60, 0x8e, 0x3c, 0xfe, 0x70, + 0x8, 0xe0, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, + 0x0, 0x8, 0xe0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x5d, 0xfd, 0x5b, 0xb0, 0x4f, 0xa4, 0x5e, + 0xeb, 0xc, 0xd0, 0x0, 0x3f, 0xb0, 0xf7, 0x0, + 0x0, 0xdb, 0x1f, 0x60, 0x0, 0xc, 0xb0, 0xf7, + 0x0, 0x0, 0xdb, 0xc, 0xd0, 0x0, 0x3f, 0xb0, + 0x4f, 0xb4, 0x5e, 0xeb, 0x0, 0x5d, 0xfd, 0x5b, + 0xb0, 0x0, 0x0, 0x0, 0xbb, 0x0, 0x0, 0x0, + 0xb, 0xb0, 0x0, 0x0, 0x0, 0xbb, + + /* U+0072 "r" */ + 0x0, 0x0, 0x0, 0x8e, 0x4c, 0xf9, 0x8f, 0xd4, + 0x12, 0x8f, 0x40, 0x0, 0x8f, 0x0, 0x0, 0x8e, + 0x0, 0x0, 0x8e, 0x0, 0x0, 0x8e, 0x0, 0x0, + 0x8e, 0x0, 0x0, 0x8e, 0x0, 0x0, + + /* U+0073 "s" */ + 0x1, 0xae, 0xfe, 0xb0, 0xc, 0xd5, 0x35, 0x91, + 0xf, 0x60, 0x0, 0x0, 0xc, 0xe6, 0x20, 0x0, + 0x1, 0x9e, 0xfe, 0x70, 0x0, 0x0, 0x28, 0xf5, + 0x0, 0x0, 0x0, 0xf8, 0x1c, 0x64, 0x49, 0xf3, + 0x9, 0xdf, 0xfc, 0x40, + + /* U+0074 "t" */ + 0x4, 0x70, 0x0, 0x8, 0xf0, 0x0, 0x8, 0xf0, + 0x0, 0x9f, 0xff, 0xfe, 0x19, 0xf2, 0x21, 0x8, + 0xf0, 0x0, 0x8, 0xf0, 0x0, 0x8, 0xf0, 0x0, + 0x8, 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x5, 0xf6, + 0x32, 0x0, 0x9e, 0xfe, + + /* U+0075 "u" */ + 0xac, 0x0, 0x0, 0xcb, 0xac, 0x0, 0x0, 0xcb, + 0xac, 0x0, 0x0, 0xcb, 0xac, 0x0, 0x0, 0xcb, + 0xac, 0x0, 0x0, 0xcb, 0x9d, 0x0, 0x0, 0xcb, + 0x7e, 0x0, 0x1, 0xfb, 0x2f, 0x81, 0x2b, 0xfb, + 0x5, 0xdf, 0xd5, 0xcb, + + /* U+0076 "v" */ + 0x5f, 0x20, 0x0, 0xb, 0xd0, 0xf8, 0x0, 0x1, + 0xf7, 0x9, 0xe0, 0x0, 0x7f, 0x10, 0x3f, 0x40, + 0xc, 0xb0, 0x0, 0xda, 0x2, 0xf5, 0x0, 0x8, + 0xf0, 0x8f, 0x0, 0x0, 0x2f, 0x5e, 0xa0, 0x0, + 0x0, 0xce, 0xf4, 0x0, 0x0, 0x6, 0xfe, 0x0, + 0x0, + + /* U+0077 "w" */ + 0x3f, 0x30, 0x6, 0xf8, 0x0, 0x2f, 0x40, 0xe7, + 0x0, 0xaf, 0xc0, 0x6, 0xf0, 0xb, 0xb0, 0xe, + 0x8f, 0x0, 0xac, 0x0, 0x6f, 0x3, 0xf1, 0xf4, + 0xe, 0x80, 0x2, 0xf4, 0x7c, 0xb, 0x82, 0xf4, + 0x0, 0xe, 0x8b, 0x80, 0x7c, 0x6f, 0x0, 0x0, + 0xac, 0xf4, 0x3, 0xfb, 0xc0, 0x0, 0x6, 0xff, + 0x0, 0xf, 0xf8, 0x0, 0x0, 0x2f, 0xc0, 0x0, + 0xbf, 0x40, 0x0, + + /* U+0078 "x" */ + 0xd, 0xc0, 0x0, 0x4f, 0x60, 0x3f, 0x80, 0x1e, + 0xb0, 0x0, 0x7f, 0x4b, 0xe1, 0x0, 0x0, 0xbf, + 0xf4, 0x0, 0x0, 0x5, 0xfc, 0x0, 0x0, 0x1, + 0xec, 0xf6, 0x0, 0x0, 0xbe, 0x18, 0xf2, 0x0, + 0x7f, 0x30, 0xc, 0xd0, 0x3f, 0x80, 0x0, 0x2f, + 0x90, + + /* U+0079 "y" */ + 0x4f, 0x30, 0x0, 0xb, 0xc0, 0xe9, 0x0, 0x2, + 0xf6, 0x7, 0xf0, 0x0, 0x8f, 0x0, 0x1f, 0x60, + 0xe, 0x90, 0x0, 0xac, 0x5, 0xf2, 0x0, 0x3, + 0xf3, 0xcc, 0x0, 0x0, 0xd, 0xcf, 0x50, 0x0, + 0x0, 0x6f, 0xe0, 0x0, 0x0, 0x1, 0xf8, 0x0, + 0x0, 0x0, 0x6f, 0x20, 0x0, 0x2, 0x4e, 0xb0, + 0x0, 0x0, 0xbf, 0xc1, 0x0, 0x0, + + /* U+007A "z" */ + 0x1f, 0xff, 0xff, 0xfb, 0x2, 0x22, 0x26, 0xf8, + 0x0, 0x0, 0x1e, 0xb0, 0x0, 0x0, 0xcd, 0x10, + 0x0, 0xa, 0xe2, 0x0, 0x0, 0x8f, 0x40, 0x0, + 0x5, 0xf6, 0x0, 0x0, 0x2f, 0xb2, 0x22, 0x21, + 0x5f, 0xff, 0xff, 0xfb, + + /* U+007B "{" */ + 0x0, 0x9, 0xef, 0x30, 0x6, 0xf6, 0x20, 0x0, + 0x8e, 0x0, 0x0, 0x9, 0xe0, 0x0, 0x0, 0x9d, + 0x0, 0x0, 0xa, 0xd0, 0x0, 0x2, 0xe9, 0x0, + 0xf, 0xfc, 0x10, 0x0, 0x25, 0xf8, 0x0, 0x0, + 0xa, 0xd0, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x9, + 0xe0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x6, 0xf3, + 0x0, 0x0, 0x1c, 0xff, 0x20, 0x0, 0x1, 0x20, + + /* U+007C "|" */ + 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, + 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, + + /* U+007D "}" */ + 0xfe, 0xb1, 0x0, 0x2, 0x4f, 0x80, 0x0, 0x0, + 0xbb, 0x0, 0x0, 0xb, 0xc0, 0x0, 0x0, 0xbc, + 0x0, 0x0, 0xa, 0xd0, 0x0, 0x0, 0x7f, 0x40, + 0x0, 0x0, 0xaf, 0xf2, 0x0, 0x5f, 0x73, 0x0, + 0xa, 0xd0, 0x0, 0x0, 0xac, 0x0, 0x0, 0xb, + 0xc0, 0x0, 0x0, 0xbb, 0x0, 0x0, 0x1e, 0x90, + 0x0, 0xff, 0xd2, 0x0, 0x2, 0x10, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xfe, + 0xa5, 0x12, 0x7a, 0x4d, 0x64, 0x6b, 0xff, 0xfd, + 0x31, 0x0, 0x0, 0x0, 0x31, 0x0, + + /* U+05D0 "×" */ + 0x3f, 0x80, 0x0, 0x3f, 0x40, 0x8f, 0x30, 0x3, + 0xf3, 0x0, 0xdd, 0x0, 0x3f, 0x20, 0x1b, 0xf8, + 0x6, 0xf0, 0xc, 0xb8, 0xf6, 0xe8, 0x4, 0xf1, + 0xc, 0xf7, 0x0, 0x7e, 0x0, 0x2f, 0x80, 0x8, + 0xe0, 0x0, 0x7f, 0x30, 0x8e, 0x0, 0x0, 0xcd, + 0x0, + + /* U+05D1 "ב" */ + 0x5f, 0xff, 0xe8, 0x0, 0x0, 0x11, 0x25, 0xea, + 0x0, 0x0, 0x0, 0x6, 0xf1, 0x0, 0x0, 0x0, + 0x3f, 0x30, 0x0, 0x0, 0x3, 0xf4, 0x0, 0x0, + 0x0, 0x3f, 0x40, 0x0, 0x0, 0x3, 0xf4, 0x0, + 0x22, 0x22, 0x4f, 0x51, 0x5f, 0xff, 0xff, 0xff, + 0x90, + + /* U+05D2 "×’" */ + 0x1f, 0xd8, 0x0, 0x0, 0x14, 0xf7, 0x0, 0x0, + 0x9, 0xd0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, + 0xf0, 0x0, 0x0, 0x9f, 0x10, 0x0, 0xd, 0xf4, + 0x1, 0x4a, 0xbe, 0x80, 0x4f, 0xc1, 0x9e, 0x0, + + /* U+05D3 "ד" */ + 0x5f, 0xff, 0xff, 0xff, 0x30, 0x11, 0x11, 0xda, + 0x10, 0x0, 0x0, 0xd, 0xa0, 0x0, 0x0, 0x0, + 0xda, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x0, 0x0, + 0x0, 0xda, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x0, + 0x0, 0x0, 0xda, 0x0, 0x0, 0x0, 0xd, 0xa0, + 0x0, + + /* U+05D4 "×”" */ + 0x8f, 0xff, 0xfd, 0x70, 0x1, 0x11, 0x26, 0xf6, + 0x0, 0x0, 0x0, 0x9c, 0x4, 0x0, 0x0, 0x7f, + 0x5f, 0x10, 0x0, 0x7f, 0x6f, 0x10, 0x0, 0x7f, + 0x6f, 0x10, 0x0, 0x7f, 0x6f, 0x10, 0x0, 0x7f, + 0x6f, 0x10, 0x0, 0x7f, + + /* U+05D5 "ו" */ + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, + + /* U+05D6 "×–" */ + 0x5f, 0xff, 0xd0, 0x1c, 0x81, 0x3, 0xf2, 0x0, + 0x6f, 0x10, 0x6, 0xf0, 0x0, 0x6f, 0x0, 0x6, + 0xf0, 0x0, 0x6f, 0x0, 0x6, 0xf0, 0x0, + + /* U+05D7 "×—" */ + 0x8f, 0xff, 0xfd, 0x70, 0x8e, 0x11, 0x26, 0xf7, + 0x8e, 0x0, 0x0, 0x9d, 0x8e, 0x0, 0x0, 0x7f, + 0x8e, 0x0, 0x0, 0x7f, 0x8e, 0x0, 0x0, 0x7f, + 0x8e, 0x0, 0x0, 0x7f, 0x8e, 0x0, 0x0, 0x7f, + 0x8e, 0x0, 0x0, 0x7f, + + /* U+05D8 "ט" */ + 0x8e, 0x0, 0xcf, 0xd4, 0x8, 0xe0, 0x4, 0x3b, + 0xe0, 0x8e, 0x0, 0x0, 0x3f, 0x48, 0xe0, 0x0, + 0x0, 0xf7, 0x8e, 0x0, 0x0, 0xf, 0x77, 0xf0, + 0x0, 0x0, 0xf6, 0x4f, 0x30, 0x0, 0x4f, 0x40, + 0xde, 0x63, 0x6e, 0xc0, 0x1, 0xae, 0xfe, 0x91, + 0x0, + + /* U+05D9 "×™" */ + 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0x40, + + /* U+05DA "ך" */ + 0x5f, 0xff, 0xd7, 0x0, 0x1, 0x13, 0x8f, 0x70, + 0x0, 0x0, 0xa, 0xe0, 0x0, 0x0, 0x6, 0xf1, + 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x5, 0xf2, + 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x5, 0xf2, + 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x5, 0xf2, + 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x5, 0xf2, + + /* U+05DB "×›" */ + 0x5f, 0xff, 0xd8, 0x0, 0x1, 0x12, 0x5d, 0xa0, + 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0xf7, + 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, 0xf7, + 0x0, 0x0, 0x4, 0xf3, 0x1, 0x12, 0x5d, 0xa0, + 0x5f, 0xff, 0xd8, 0x0, + + /* U+05DC "ל" */ + 0x28, 0x10, 0x0, 0x0, 0x5f, 0x20, 0x0, 0x0, + 0x5f, 0x20, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfd, + 0x1, 0x11, 0x12, 0xf9, 0x0, 0x0, 0x6, 0xf2, + 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, 0x2f, 0x50, + 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0xf8, 0x0, + 0x0, 0x6, 0xf2, 0x0, 0x0, 0xc, 0xb0, 0x0, + + /* U+05DD "×" */ + 0x8f, 0xff, 0xfe, 0x90, 0x8, 0xe1, 0x12, 0x5e, + 0x90, 0x8e, 0x0, 0x0, 0x7f, 0x8, 0xe0, 0x0, + 0x4, 0xf2, 0x8e, 0x0, 0x0, 0x4f, 0x28, 0xe0, + 0x0, 0x4, 0xf2, 0x8e, 0x0, 0x0, 0x4f, 0x28, + 0xe2, 0x22, 0x25, 0xf2, 0x8f, 0xff, 0xff, 0xff, + 0x20, + + /* U+05DE "מ" */ + 0x1f, 0x90, 0xae, 0xfc, 0x20, 0x9, 0xea, 0xc2, + 0x1c, 0xd0, 0x3, 0xff, 0x20, 0x4, 0xf3, 0x0, + 0xfc, 0x0, 0x1, 0xf6, 0x0, 0xf8, 0x0, 0x0, + 0xf6, 0x2, 0xf5, 0x0, 0x0, 0xf6, 0x5, 0xf2, + 0x0, 0x0, 0xf6, 0x8, 0xf0, 0x1, 0x12, 0xf6, + 0xb, 0xc0, 0xf, 0xff, 0xf6, + + /* U+05DF "ן" */ + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, + + /* U+05E0 "× " */ + 0x1f, 0xea, 0x10, 0x14, 0xea, 0x0, 0x9, 0xe0, + 0x0, 0x8e, 0x0, 0x8, 0xf0, 0x0, 0x8f, 0x0, + 0x8, 0xf0, 0x22, 0x9f, 0x5f, 0xff, 0xf0, + + /* U+05E1 "ס" */ + 0x8f, 0xff, 0xfe, 0x91, 0x8, 0xe3, 0x33, 0x6e, + 0xd0, 0x8e, 0x0, 0x0, 0x3f, 0x48, 0xe0, 0x0, + 0x0, 0xf7, 0x8e, 0x0, 0x0, 0xf, 0x77, 0xf0, + 0x0, 0x1, 0xf6, 0x3f, 0x50, 0x0, 0x6f, 0x30, + 0xcf, 0x64, 0x7f, 0xb0, 0x1, 0x9e, 0xfe, 0x90, + 0x0, + + /* U+05E2 "×¢" */ + 0x2f, 0x50, 0x0, 0xf, 0x90, 0xea, 0x0, 0x0, + 0xf9, 0x9, 0xe0, 0x0, 0xf, 0x80, 0x4f, 0x30, + 0x0, 0xf7, 0x0, 0xf7, 0x0, 0x2f, 0x50, 0xb, + 0xc0, 0x6, 0xf1, 0x0, 0x6f, 0x2, 0xe9, 0x0, + 0x2, 0xfa, 0xea, 0x0, 0x5, 0xbf, 0xd5, 0x0, + 0x4, 0xe9, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+05E3 "×£" */ + 0x8f, 0xff, 0xfc, 0x50, 0x8e, 0x11, 0x39, 0xf3, + 0x8e, 0x0, 0x0, 0xe9, 0x7f, 0x20, 0x0, 0xbc, + 0x1d, 0xfe, 0x0, 0xac, 0x0, 0x21, 0x0, 0xac, + 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, 0xac, + 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, 0xac, + 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, 0xac, + + /* U+05E4 "פ" */ + 0x8f, 0xff, 0xeb, 0x30, 0x8, 0xe1, 0x24, 0xbf, + 0x30, 0x8e, 0x0, 0x0, 0xbc, 0x6, 0xf2, 0x0, + 0x6, 0xf0, 0x1d, 0xfe, 0x0, 0x5f, 0x10, 0x2, + 0x10, 0x6, 0xf0, 0x0, 0x0, 0x0, 0xcc, 0x0, + 0x11, 0x24, 0xaf, 0x30, 0x8f, 0xff, 0xfb, 0x30, + 0x0, + + /* U+05E5 "×¥" */ + 0x1e, 0xa0, 0x0, 0x7f, 0x4, 0xf5, 0x0, 0x8e, + 0x0, 0x9e, 0x10, 0xbb, 0x0, 0x1e, 0x86, 0xf3, + 0x0, 0x9, 0xfe, 0x50, 0x0, 0x6, 0xf1, 0x0, + 0x0, 0x5, 0xf1, 0x0, 0x0, 0x5, 0xf1, 0x0, + 0x0, 0x5, 0xf1, 0x0, 0x0, 0x5, 0xf1, 0x0, + 0x0, 0x5, 0xf1, 0x0, 0x0, 0x5, 0xf1, 0x0, + + /* U+05E6 "צ" */ + 0x1e, 0xb0, 0x0, 0x6f, 0x0, 0x5f, 0x60, 0x6, + 0xf0, 0x0, 0xaf, 0x10, 0x7e, 0x0, 0x1, 0xeb, + 0xa, 0xb0, 0x0, 0x5, 0xfb, 0xf3, 0x0, 0x0, + 0xa, 0xf4, 0x0, 0x0, 0x0, 0x1e, 0xb0, 0x0, + 0x11, 0x11, 0x7f, 0x60, 0x5f, 0xff, 0xff, 0xff, + 0x0, + + /* U+05E7 "×§" */ + 0x8f, 0xff, 0xff, 0xff, 0xf2, 0x1, 0x11, 0x11, + 0x1c, 0xd0, 0x0, 0x0, 0x0, 0x1f, 0x70, 0x4, + 0x0, 0x0, 0x8f, 0x10, 0x5f, 0x10, 0x0, 0xea, + 0x0, 0x5f, 0x10, 0x4, 0xf3, 0x0, 0x5f, 0x10, + 0xb, 0xd0, 0x0, 0x5f, 0x10, 0x1f, 0x60, 0x0, + 0x5f, 0x10, 0x8f, 0x0, 0x0, 0x5f, 0x10, 0x0, + 0x0, 0x0, 0x5f, 0x10, 0x0, 0x0, 0x0, 0x5f, + 0x10, 0x0, 0x0, 0x0, 0x27, 0x0, 0x0, 0x0, + 0x0, + + /* U+05E8 "ר" */ + 0x5f, 0xff, 0xd9, 0x10, 0x1, 0x12, 0x5e, 0xc0, + 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x0, 0xf7, + 0x0, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0xe9, + 0x0, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0xe9, + 0x0, 0x0, 0x0, 0xe9, + + /* U+05E9 "ש" */ + 0x3f, 0x30, 0xf, 0x50, 0xd, 0x91, 0xf5, 0x1, + 0xf4, 0x0, 0xf7, 0xf, 0x70, 0x4f, 0x10, 0x1f, + 0x40, 0xda, 0x1b, 0xc0, 0x4, 0xf1, 0xb, 0xff, + 0xd2, 0x0, 0x8d, 0x0, 0x9e, 0x10, 0x0, 0xd, + 0x80, 0x7, 0xf0, 0x0, 0x9, 0xf1, 0x0, 0x5f, + 0x42, 0x5c, 0xf4, 0x0, 0x2, 0xff, 0xfd, 0x82, + 0x0, 0x0, + + /* U+05EA "ת" */ + 0x7f, 0xff, 0xff, 0xd8, 0x0, 0x3, 0xf6, 0x12, + 0x6f, 0x70, 0x2, 0xf5, 0x0, 0x9, 0xe0, 0x2, + 0xf5, 0x0, 0x6, 0xf0, 0x2, 0xf5, 0x0, 0x6, + 0xf0, 0x2, 0xf5, 0x0, 0x6, 0xf1, 0x2, 0xf4, + 0x0, 0x6, 0xf1, 0x17, 0xf1, 0x0, 0x6, 0xf1, + 0xde, 0x70, 0x0, 0x6, 0xf1, + + /* U+0606 "؆" */ + 0x0, 0x1, 0x51, 0x53, 0x30, 0x0, 0x0, 0xe7, + 0xb8, 0x50, 0xd9, 0x0, 0x9f, 0xcc, 0x10, 0xd, + 0x0, 0x58, 0x0, 0x0, 0x7, 0x60, 0x3a, 0x0, + 0x0, 0x1, 0xc0, 0x2b, 0x0, 0x0, 0x0, 0xb2, + 0x14, 0x0, 0x0, 0x0, 0x58, 0x0, 0x5, 0x50, + 0x0, 0xd, 0x0, 0xe, 0xa5, 0x0, 0x9, 0x40, + 0x4f, 0x10, 0x0, 0x2, 0xa0, 0xab, 0x0, 0x0, + 0x0, 0xc2, 0xf5, 0x0, 0x0, 0x0, 0x6d, 0xf0, + 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, 0x0, 0x0, + 0xa, 0x30, 0x0, + + /* U+0607 "؇" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0xa, + 0xb2, 0x0, 0xc9, 0x0, 0x3c, 0x10, 0x0, 0xc, + 0x0, 0x3d, 0x90, 0x0, 0x7, 0x60, 0xb4, 0x1, + 0x0, 0x1, 0xc0, 0x3c, 0xca, 0x0, 0x0, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x59, 0x0, 0xb, 0xd5, + 0x0, 0xd, 0x0, 0x1f, 0x51, 0x0, 0x8, 0x50, + 0x6f, 0x0, 0x0, 0x2, 0xb0, 0xca, 0x0, 0x0, + 0x0, 0xc4, 0xf4, 0x0, 0x0, 0x0, 0x6e, 0xe0, + 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, 0x0, 0x0, + 0xa, 0x30, 0x0, + + /* U+0609 "؉" */ + 0xd9, 0x0, 0xe, 0x40, 0x0, 0xc8, 0x0, 0x7c, + 0x0, 0x0, 0x0, 0x1, 0xe3, 0x0, 0x0, 0x0, + 0x8, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0x30, 0x0, + 0x0, 0x0, 0x9a, 0x0, 0x0, 0x0, 0x2, 0xf2, + 0x0, 0x0, 0x0, 0xa, 0x90, 0x0, 0x0, 0x0, + 0x2f, 0x10, 0xe, 0x60, 0x6e, 0xb8, 0x0, 0xf, + 0x70, 0x7f, + + /* U+060A "ØŠ" */ + 0xd9, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0xc8, + 0x0, 0x7c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0x10, 0xe, 0x60, 0x6e, 0x0, 0xe7, 0xb8, + 0x0, 0xf, 0x70, 0x7f, 0x0, 0xf7, + + /* U+060C "ØŒ" */ + 0x2, 0xc0, 0xba, 0x2f, 0x64, 0xf5, + + /* U+0615 "Ø•" */ + 0x0, 0x0, 0x0, 0x6, 0x60, 0x0, 0x6, 0x65, + 0x50, 0x6, 0xd6, 0xe0, 0xd, 0xdc, 0x70, + + /* U+061B "Ø›" */ + 0x4, 0xd0, 0xc9, 0x3f, 0x63, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0x54, 0xf5, + + /* U+061F "ØŸ" */ + 0x8, 0xef, 0xd8, 0x17, 0xf9, 0x57, 0xd6, 0xcd, + 0x0, 0x0, 0x1b, 0xe0, 0x0, 0x0, 0x3f, 0xa0, + 0x0, 0x0, 0x4f, 0x90, 0x0, 0x0, 0x5f, 0x30, + 0x0, 0x1, 0xf6, 0x0, 0x0, 0xd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0x70, 0x0, 0x1, + 0xf7, 0x0, + + /* U+0621 "Ø¡" */ + 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x6f, 0x95, + 0x40, 0xad, 0x0, 0x0, 0x8f, 0x40, 0x11, 0x1a, + 0xff, 0xf3, 0x5c, 0xfe, 0x70, 0x9a, 0x40, 0x0, + + /* U+0622 "Ø¢" */ + 0x19, 0x40, 0x19, 0x8, 0x5a, 0xdb, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, + 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, + 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, + 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, 0xf0, + 0x0, 0x0, 0x7f, 0x0, 0x0, + + /* U+0623 "Ø£" */ + 0x9, 0xc3, 0x1b, 0x0, 0xd, 0xb6, 0x17, 0x30, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + + /* U+0624 "ؤ" */ + 0x0, 0x5, 0xc7, 0x0, 0x0, 0xc, 0x0, 0x0, + 0x0, 0x9, 0xa7, 0x0, 0x0, 0xb, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xed, 0x40, + 0x0, 0x6f, 0xac, 0xf1, 0x0, 0x9e, 0x1, 0xf6, + 0x0, 0x6f, 0xa6, 0xf7, 0x0, 0x8, 0xdf, 0xf7, + 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x2e, 0xe0, + 0x12, 0x48, 0xef, 0x30, 0xaf, 0xff, 0xa2, 0x0, + 0x34, 0x20, 0x0, 0x0, + + /* U+0625 "Ø¥" */ + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x9, 0xc3, 0x1b, 0x0, 0xd, 0xb6, 0x16, 0x20, + + /* U+0626 "ئ" */ + 0x1, 0xbb, 0x0, 0x0, 0x0, 0x0, 0x66, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xeb, 0x20, 0x0, 0x0, + 0x0, 0x35, 0x20, 0x6d, 0xfe, 0x70, 0x0, 0x0, + 0x4f, 0x94, 0x7f, 0x40, 0x0, 0x5, 0xf7, 0x0, + 0x10, 0x12, 0x0, 0x9, 0xfe, 0x80, 0xc, 0xa0, + 0x0, 0x2, 0x7e, 0xb0, 0xf7, 0x0, 0x0, 0x0, + 0xaf, 0xd, 0xc0, 0x0, 0x2, 0x9f, 0x90, 0x4f, + 0xfc, 0xcf, 0xff, 0x90, 0x0, 0x28, 0xba, 0x85, + 0x10, 0x0, + + /* U+0627 "ا" */ + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, + + /* U+0628 "ب" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, + + /* U+0629 "Ø©" */ + 0xf, 0x3f, 0x10, 0x0, 0x20, 0x20, 0x0, 0x0, + 0x10, 0x0, 0x2, 0xef, 0xd5, 0x0, 0xae, 0x5a, + 0xf7, 0xd, 0x90, 0x7, 0xf1, 0xe8, 0x0, 0x3f, + 0x3b, 0xe6, 0x6d, 0xe0, 0x2b, 0xfe, 0x91, 0x0, + + /* U+062A "ت" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x5, 0x70, + 0x1, 0x11, 0x10, 0x0, 0x9c, 0xe8, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xce, 0xa0, 0x0, 0x0, 0x0, + 0x7, 0xf7, 0x7f, 0xd8, 0x66, 0x79, 0xcf, 0xf8, + 0x0, 0x4a, 0xef, 0xfe, 0xc9, 0x61, 0x0, + + /* U+062B "Ø«" */ + 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x99, 0x0, 0x0, 0x5, 0x70, 0x1, 0x11, 0x10, + 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, + 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, + 0xfe, 0xc9, 0x61, 0x0, + + /* U+062C "ج" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x98, 0x5b, 0xfe, 0xb6, 0x0, 0x0, + 0xbf, 0x70, 0x0, 0x0, 0x7, 0xf4, 0x0, 0x0, + 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x4f, 0x20, + 0x2, 0x0, 0x0, 0x6f, 0x0, 0xf, 0x30, 0x0, + 0x5f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, + 0x0, 0x0, 0x7, 0xfa, 0x41, 0x14, 0xa4, 0x0, + 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, + 0x0, + + /* U+062D "Ø­" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0x0, 0x0, 0x0, 0x6f, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0x10, 0x0, 0x0, 0x0, + 0x1f, 0x80, 0x0, 0x0, 0x0, 0x8, 0xf9, 0x31, + 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+062E "Ø®" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, + 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, + 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, + 0x0, 0x0, 0x0, 0x3f, 0x30, 0x0, 0x0, 0x0, + 0x6f, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x10, 0x0, + 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, 0x0, 0x8, + 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+062F "د" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, + 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, + 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xfe, 0x90, + 0x0, + + /* U+0630 "ذ" */ + 0x0, 0x7b, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + 0x13, 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, + 0xf8, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, + 0x20, 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, + 0xdf, 0xe8, 0x0, + + /* U+0631 "ر" */ + 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0xba, + 0x0, 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, 0xca, + 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x4e, 0xd0, + 0x14, 0x6c, 0xfd, 0x20, 0xaf, 0xfc, 0x60, 0x0, + 0x33, 0x10, 0x0, 0x0, + + /* U+0632 "ز" */ + 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc7, + 0x0, 0x0, 0x0, 0xbb, 0x0, 0x0, 0x0, 0xab, + 0x0, 0x0, 0x0, 0xda, 0x0, 0x0, 0x4, 0xf5, + 0x0, 0x0, 0x4f, 0xd0, 0x14, 0x6c, 0xfd, 0x20, + 0xaf, 0xfc, 0x60, 0x0, 0x33, 0x10, 0x0, 0x0, + + /* U+0633 "س" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xf3, 0x0, 0x0, 0x0, 0xd, 0x90, 0x4, 0xf2, + 0x3, 0xf3, 0x0, 0x0, 0x0, 0x9, 0xd0, 0x6, + 0xf3, 0x4, 0xf3, 0x5f, 0x10, 0x0, 0x6, 0xf3, + 0xa, 0xf8, 0x6, 0xf1, 0xcb, 0x0, 0x0, 0x6, + 0xfe, 0xbf, 0xcf, 0xbf, 0xc0, 0xe8, 0x0, 0x0, + 0x9, 0xfc, 0xfa, 0x1a, 0xfb, 0x10, 0xf8, 0x0, + 0x0, 0x3f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xbe, + 0x52, 0x27, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x24, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0634 "Ø´" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x2, 0x0, 0x1, 0x61, 0x0, 0x0, 0x0, 0x2, + 0x10, 0x0, 0x20, 0x3, 0xf3, 0x0, 0x0, 0x0, + 0xc, 0x90, 0x5, 0xf2, 0x3, 0xf3, 0x1, 0x0, + 0x0, 0x8, 0xd0, 0x6, 0xf3, 0x4, 0xf2, 0x6f, + 0x10, 0x0, 0x6, 0xf3, 0xa, 0xf9, 0x7, 0xf1, + 0xca, 0x0, 0x0, 0x6, 0xff, 0xbf, 0xcf, 0xbf, + 0xb0, 0xe8, 0x0, 0x0, 0xa, 0xfc, 0xfa, 0x1a, + 0xfb, 0x10, 0xe8, 0x0, 0x0, 0x4f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xbe, 0x52, 0x27, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0635 "ص" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0xa, 0x43, + 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, 0x0, 0xc, + 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, 0x0, 0x0, + 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, 0xd9, 0x0, + 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, 0x0, 0xf7, + 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0636 "ض" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0xa, 0x43, + 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, 0x0, 0xc, + 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, 0x0, 0x0, + 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, 0xd9, 0x0, + 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, 0x0, 0xf7, + 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0637 "Ø·" */ + 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0x70, 0x6, 0xdf, 0xf9, 0x0, 0x0, 0xf7, + 0xb, 0xfa, 0x46, 0xf7, 0x0, 0xf, 0x7b, 0xf6, + 0x0, 0xc, 0xa0, 0x0, 0xfd, 0xf5, 0x0, 0x6, + 0xf8, 0x67, 0x7f, 0xfd, 0x77, 0x9d, 0xfc, 0x1e, + 0xff, 0xff, 0xff, 0xfe, 0xb5, 0x0, + + /* U+0638 "ظ" */ + 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x70, 0x5c, 0x0, 0x0, + 0x0, 0x0, 0xf7, 0x1, 0x20, 0x0, 0x0, 0x0, + 0xf, 0x70, 0x6, 0xdf, 0xf9, 0x0, 0x0, 0xf7, + 0xb, 0xfa, 0x46, 0xf7, 0x0, 0xf, 0x7b, 0xf6, + 0x0, 0xc, 0xa0, 0x0, 0xfd, 0xf5, 0x0, 0x6, + 0xf8, 0x67, 0x7f, 0xfd, 0x77, 0x9d, 0xfc, 0x1e, + 0xff, 0xff, 0xff, 0xfe, 0xb5, 0x0, + + /* U+0639 "ع" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, + 0x20, 0x0, 0x0, 0xce, 0x75, 0x0, 0x0, 0x4, + 0xf2, 0x0, 0x0, 0x0, 0x4, 0xf4, 0x26, 0xbd, + 0x0, 0x0, 0xaf, 0xff, 0xd9, 0x0, 0x0, 0xbf, + 0x92, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0xf, 0x80, 0x0, 0x0, 0x0, 0xf, 0x50, 0x0, + 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, 0x0, 0x6, + 0xf9, 0x31, 0x13, 0x95, 0x0, 0x6d, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+063A "غ" */ + 0x0, 0xf, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xef, 0x20, 0x0, 0x0, + 0xce, 0x75, 0x0, 0x0, 0x4, 0xf2, 0x0, 0x0, + 0x0, 0x4, 0xf4, 0x26, 0xbd, 0x0, 0x0, 0xaf, + 0xff, 0xd9, 0x0, 0x0, 0xbf, 0x92, 0x0, 0x0, + 0x9, 0xf4, 0x0, 0x0, 0x0, 0xf, 0x80, 0x0, + 0x0, 0x0, 0xf, 0x50, 0x0, 0x0, 0x0, 0xe, + 0x90, 0x0, 0x0, 0x0, 0x6, 0xf9, 0x31, 0x13, + 0x95, 0x0, 0x6d, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x13, 0x31, 0x0, + + /* U+0640 "Ù€" */ + 0x17, 0x77, 0x75, 0x2f, 0xff, 0xfd, + + /* U+0641 "Ù" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xf9, 0xee, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xda, 0x5, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xd1, 0x8f, 0x3b, 0xa0, 0x0, 0x0, + 0x0, 0x4f, 0xfe, 0xf1, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xbc, 0xb, 0xf8, 0x32, 0x12, 0x24, + 0x6a, 0xfe, 0x20, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xc7, 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, + 0x0, 0x0, + + /* U+0642 "Ù‚" */ + 0x0, 0x0, 0x0, 0x5c, 0x6c, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x12, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0xaf, 0x9e, 0xa0, + 0x0, 0x0, 0x0, 0xf9, 0x7, 0xf0, 0x0, 0x0, + 0x0, 0xdc, 0x19, 0xf2, 0x3, 0x50, 0x0, 0x5f, + 0xfe, 0xf3, 0xc, 0x90, 0x0, 0x1, 0x24, 0xf1, + 0xf, 0x50, 0x0, 0x0, 0x9, 0xd0, 0x2f, 0x40, + 0x0, 0x0, 0x3f, 0x60, 0xf, 0x70, 0x0, 0x4, + 0xeb, 0x0, 0xb, 0xe5, 0x35, 0xaf, 0xb0, 0x0, + 0x1, 0xdf, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x3, + 0x43, 0x0, 0x0, 0x0, + + /* U+0643 "Ùƒ" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x90, 0x0, 0x2, 0x96, 0x0, 0xe9, 0x0, 0x0, + 0x76, 0x0, 0xe, 0x90, 0x0, 0x0, 0x58, 0x0, + 0xe9, 0x0, 0x2, 0xab, 0x20, 0xe, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xe8, 0x54, 0x0, 0x0, 0x0, + 0xf, 0x7d, 0xa0, 0x0, 0x0, 0x9, 0xf3, 0x8f, + 0xb7, 0x55, 0x8e, 0xf8, 0x0, 0x5c, 0xef, 0xfe, + 0xb4, 0x0, + + /* U+0644 "Ù„" */ + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, + 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, + 0x0, 0x0, 0x0, 0x4, 0xf2, 0x36, 0x0, 0x0, + 0x5, 0xf2, 0xcb, 0x0, 0x0, 0x8, 0xf0, 0xd9, + 0x0, 0x0, 0x2e, 0xb0, 0x9f, 0x61, 0x37, 0xef, + 0x20, 0xa, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x13, + 0x30, 0x0, 0x0, + + /* U+0645 "Ù…" */ + 0x0, 0x2, 0x87, 0x10, 0x0, 0x2f, 0xff, 0xf3, + 0x0, 0xae, 0x11, 0xea, 0x3, 0xdd, 0x32, 0xea, + 0x5f, 0xbe, 0xff, 0xe3, 0xcb, 0x0, 0x23, 0x0, + 0xea, 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0x0, + 0xea, 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0x0, + + /* U+0646 "Ù†" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x4, 0x50, 0x0, 0x0, 0x0, 0x5, 0xf2, 0x23, + 0x0, 0x0, 0x1, 0xf6, 0xbc, 0x0, 0x0, 0x0, + 0xf8, 0xda, 0x0, 0x0, 0x0, 0xf8, 0xc9, 0x0, + 0x0, 0x3, 0xf5, 0xad, 0x0, 0x0, 0xa, 0xe0, + 0x3f, 0xa4, 0x24, 0xaf, 0x60, 0x5, 0xef, 0xff, + 0xe5, 0x0, 0x0, 0x3, 0x42, 0x0, 0x0, + + /* U+0647 "Ù‡" */ + 0x0, 0x10, 0x0, 0x2, 0xef, 0xd5, 0x0, 0xae, + 0x5a, 0xf7, 0xd, 0x90, 0x7, 0xf1, 0xe8, 0x0, + 0x3f, 0x3b, 0xe6, 0x6d, 0xe0, 0x2b, 0xfe, 0x91, + 0x0, + + /* U+0648 "Ùˆ" */ + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+0649 "Ù‰" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, + 0x40, 0x0, 0x5, 0xf7, 0x0, 0x10, 0x12, 0x0, + 0x9, 0xfe, 0x80, 0xc, 0xa0, 0x0, 0x2, 0x7e, + 0xb0, 0xf7, 0x0, 0x0, 0x0, 0xaf, 0xd, 0xc0, + 0x0, 0x2, 0x9f, 0x90, 0x4f, 0xfc, 0xcf, 0xff, + 0x90, 0x0, 0x28, 0xba, 0x85, 0x10, 0x0, + + /* U+064A "ÙŠ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, + 0x40, 0x0, 0x4, 0xf8, 0x10, 0x10, 0x24, 0x0, + 0x8, 0xff, 0xa1, 0xc, 0xa0, 0x0, 0x0, 0x5e, + 0xc0, 0xf7, 0x0, 0x0, 0x0, 0xbf, 0xb, 0xd1, + 0x0, 0x4, 0xaf, 0x70, 0x1c, 0xfd, 0xef, 0xfb, + 0x40, 0x0, 0x3, 0x55, 0x30, 0x0, 0x0, 0x0, + 0x1f, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, + 0x0, 0x0, + + /* U+064B "Ù‹" */ + 0x0, 0x0, 0x0, 0x5, 0x9c, 0xd3, 0x27, 0x41, + 0x21, 0x17, 0xbd, 0xb2, 0x25, 0x20, 0x0, + + /* U+064C "ÙŒ" */ + 0x0, 0x5d, 0x60, 0x0, 0xa7, 0xc0, 0x36, 0x1c, + 0xe3, 0x2a, 0x1c, 0x10, 0x9, 0xc3, 0x0, + + /* U+064D "Ù" */ + 0x1, 0x48, 0xb3, 0x3c, 0x85, 0x10, 0x3, 0x6a, + 0xd3, 0x3a, 0x63, 0x0, + + /* U+064E "ÙŽ" */ + 0x0, 0x0, 0x21, 0x17, 0xbd, 0xb2, 0x25, 0x20, + 0x0, + + /* U+064F "Ù" */ + 0x0, 0x5d, 0x60, 0x0, 0xa7, 0xc0, 0x0, 0x3e, + 0xe3, 0x1, 0x8b, 0x0, 0x3c, 0x60, 0x0, + + /* U+0650 "Ù" */ + 0x0, 0x14, 0x82, 0x3d, 0xc9, 0x50, 0x0, 0x0, + 0x0, + + /* U+0651 "Ù‘" */ + 0x0, 0x0, 0x32, 0x12, 0x66, 0x56, 0x66, 0x67, + 0x66, 0x66, 0x9c, 0xd3, 0x2e, 0x92, 0x30, + + /* U+0652 "Ù’" */ + 0x5, 0xdd, 0x50, 0xe, 0x12, 0xe0, 0xe, 0x22, + 0xe0, 0x5, 0xed, 0x50, + + /* U+0653 "Ù“" */ + 0x2a, 0x20, 0x28, 0x94, 0xbd, 0xa3, 0x0, 0x0, + 0x0, + + /* U+0654 "Ù”" */ + 0x1b, 0xb1, 0x57, 0x0, 0x2e, 0xb3, 0x35, 0x20, + + /* U+0655 "Ù•" */ + 0x1b, 0xb1, 0x57, 0x0, 0x2e, 0xb3, 0x35, 0x20, + + /* U+0657 "Ù—" */ + 0x0, 0x5, 0xc3, 0x0, 0xa8, 0x10, 0x3e, 0xe3, + 0x0, 0xc, 0x7a, 0x0, 0x6, 0xe5, 0x0, + + /* U+065A "Ùš" */ + 0x7, 0x11, 0x70, 0x7, 0xaa, 0x70, 0x0, 0xdd, + 0x0, + + /* U+0660 "Ù " */ + 0x8f, 0x29, 0xf2, + + /* U+0661 "Ù¡" */ + 0xae, 0x0, 0x4f, 0x30, 0xe, 0x90, 0x9, 0xd0, + 0x5, 0xf1, 0x2, 0xf4, 0x0, 0xf6, 0x0, 0xf6, + 0x0, 0xf7, 0x0, 0xf7, + + /* U+0662 "Ù¢" */ + 0x2f, 0x70, 0x0, 0xac, 0xc, 0xf7, 0x26, 0xf7, + 0x6, 0xff, 0xff, 0xc0, 0x2, 0xf7, 0x33, 0x0, + 0x0, 0xea, 0x0, 0x0, 0x0, 0xbc, 0x0, 0x0, + 0x0, 0x9d, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, + 0x0, 0x7e, 0x0, 0x0, 0x0, 0x7e, 0x0, 0x0, + + /* U+0663 "Ù£" */ + 0x3f, 0x40, 0xf6, 0x4f, 0x20, 0xda, 0xf, 0x97, + 0xf1, 0x7, 0xfd, 0xff, 0xfc, 0x0, 0x2f, 0x91, + 0x33, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0xb, + 0xb0, 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, + 0x9, 0xd0, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x0, 0x8, 0xe0, 0x0, 0x0, + + /* U+0664 "Ù¤" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x9e, 0x40, 0x4, + 0xfd, 0x71, 0x0, 0xda, 0x0, 0x0, 0xa, 0xe4, + 0x0, 0x0, 0x2e, 0xf6, 0x0, 0x1e, 0xd6, 0x10, + 0x8, 0xe0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x3, + 0xfb, 0x79, 0xd5, 0x5, 0xdf, 0xd9, 0x10, + + /* U+0665 "Ù¥" */ + 0x0, 0x1, 0x0, 0x0, 0x1d, 0xf9, 0x0, 0xb, + 0xd8, 0xf5, 0x3, 0xf4, 0xb, 0xc0, 0x8e, 0x0, + 0x4f, 0x2c, 0xa0, 0x0, 0xf6, 0xe8, 0x0, 0xe, + 0x8e, 0x80, 0x0, 0xe8, 0xcc, 0x0, 0x2f, 0x67, + 0xfa, 0x8d, 0xf1, 0x8, 0xef, 0xd4, 0x0, + + /* U+0666 "Ù¦" */ + 0x25, 0x21, 0x24, 0x40, 0x4f, 0xff, 0xff, 0xa0, + 0x1, 0x34, 0x3c, 0xa0, 0x0, 0x0, 0xb, 0xb0, + 0x0, 0x0, 0xa, 0xc0, 0x0, 0x0, 0x8, 0xe0, + 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x4, 0xf2, + 0x0, 0x0, 0x2, 0xf5, 0x0, 0x0, 0x0, 0xf8, + 0x0, 0x0, 0x0, 0xbc, + + /* U+0667 "Ù§" */ + 0x4f, 0x30, 0x0, 0xad, 0x0, 0xda, 0x0, 0x1f, + 0x60, 0x6, 0xf1, 0x7, 0xe0, 0x0, 0x1f, 0x70, + 0xd9, 0x0, 0x0, 0xbc, 0x2f, 0x40, 0x0, 0x5, + 0xf9, 0xf0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0xdf, 0x70, 0x0, 0x0, 0x9, 0xf4, 0x0, + 0x0, 0x0, 0x7f, 0x10, 0x0, + + /* U+0668 "Ù¨" */ + 0x0, 0x7, 0xf1, 0x0, 0x0, 0x0, 0x9f, 0x40, + 0x0, 0x0, 0xd, 0xf7, 0x0, 0x0, 0x1, 0xff, + 0xb0, 0x0, 0x0, 0x5f, 0x9f, 0x0, 0x0, 0xb, + 0xc2, 0xf4, 0x0, 0x1, 0xf6, 0xd, 0x90, 0x0, + 0x6f, 0x10, 0x7e, 0x0, 0xd, 0xa0, 0x1, 0xf6, + 0x4, 0xf3, 0x0, 0xa, 0xd0, + + /* U+0669 "Ù©" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xf7, 0x0, + 0xd, 0xc5, 0xaf, 0x40, 0x2f, 0x40, 0xd, 0x90, + 0xe, 0xb4, 0x2b, 0xc0, 0x3, 0xdf, 0xff, 0xd0, + 0x0, 0x2, 0x49, 0xf0, 0x0, 0x0, 0x5, 0xf2, + 0x0, 0x0, 0x2, 0xf5, 0x0, 0x0, 0x0, 0xf8, + 0x0, 0x0, 0x0, 0xbc, + + /* U+066A "Ùª" */ + 0xd9, 0x0, 0xe, 0x4c, 0x80, 0x7, 0xc0, 0x0, + 0x1, 0xe3, 0x0, 0x0, 0x8b, 0x0, 0x0, 0x1f, + 0x30, 0x0, 0x9, 0xa0, 0x0, 0x2, 0xf2, 0x0, + 0x0, 0xa9, 0x0, 0x0, 0x2f, 0x10, 0xe, 0x6b, + 0x80, 0x0, 0xf7, + + /* U+066B "Ù«" */ + 0x0, 0x6, 0x80, 0x0, 0x6c, 0x0, 0x8, 0xb0, + 0x0, 0xc7, 0x0, 0x6f, 0x21, 0x7f, 0x60, 0xfe, + 0x60, 0x2, 0x0, 0x0, + + /* U+066C "Ù¬" */ + 0xa, 0x70, 0xf9, 0x3f, 0x27, 0xa0, + + /* U+066D "Ù­" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0xb, 0x0, + 0x0, 0x0, 0x5, 0xf1, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0x60, 0x0, 0x5f, 0xfe, 0x20, 0x0, 0x5, + 0xfd, 0xf1, 0x0, 0x0, 0x94, 0x8, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+066E "Ù®" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, + + /* U+066F "Ù¯" */ + 0x0, 0x0, 0x0, 0x1b, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0xaf, 0x9e, 0xa0, 0x0, 0x0, 0x0, 0xf9, + 0x7, 0xf0, 0x0, 0x0, 0x0, 0xdc, 0x19, 0xf2, + 0x3, 0x50, 0x0, 0x5f, 0xfe, 0xf3, 0xc, 0x90, + 0x0, 0x1, 0x24, 0xf1, 0xf, 0x50, 0x0, 0x0, + 0x9, 0xd0, 0x2f, 0x40, 0x0, 0x0, 0x3f, 0x60, + 0xf, 0x70, 0x0, 0x4, 0xeb, 0x0, 0xb, 0xe5, + 0x35, 0xaf, 0xb0, 0x0, 0x1, 0xdf, 0xff, 0xe7, + 0x0, 0x0, 0x0, 0x3, 0x43, 0x0, 0x0, 0x0, + + /* U+0670 "Ù°" */ + 0x33, 0x67, 0x67, 0x67, 0x67, + + /* U+0674 "Ù´" */ + 0x8, 0xc5, 0xc, 0x0, 0xc, 0xc7, 0x6, 0x30, + + /* U+0679 "Ù¹" */ + 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, + 0x66, 0x0, 0x0, 0x0, 0x0, 0x5, 0xe7, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xbb, 0xa6, 0x0, 0x1, + 0x18, 0x90, 0x0, 0x0, 0x0, 0x0, 0x9c, 0xe7, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xce, 0xa0, 0x0, + 0x0, 0x0, 0x18, 0xf6, 0x6f, 0xd8, 0x66, 0x7a, + 0xcf, 0xf7, 0x0, 0x4a, 0xef, 0xfe, 0xc9, 0x61, + 0x0, + + /* U+067A "Ùº" */ + 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0x90, 0x0, 0x0, 0x5, 0x70, 0x0, 0x11, 0x0, + 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, + 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, + 0xfe, 0xc9, 0x61, 0x0, + + /* U+067B "Ù»" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + + /* U+067C "Ù¼" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x5, 0x70, + 0x1, 0x11, 0x10, 0x0, 0x9c, 0xe8, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xce, 0xa0, 0x0, 0x0, 0x0, + 0x7, 0xf7, 0x7f, 0xd8, 0x66, 0x79, 0xcf, 0xf8, + 0x0, 0x4a, 0xef, 0xff, 0xd9, 0x61, 0x0, 0x0, + 0x0, 0x87, 0x69, 0x0, 0x0, 0x0, 0x0, 0x9, + 0x76, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xd3, + 0x0, 0x0, 0x0, + + /* U+067D "Ù½" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, 0x89, 0x0, + 0x0, 0x9b, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, + 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, + 0xfe, 0xc9, 0x61, 0x0, + + /* U+067E "Ù¾" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xa9, 0x90, 0x0, 0x0, 0x0, 0x0, 0x11, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + + /* U+067F "Ù¿" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x99, 0x0, 0x0, 0x5, 0x70, 0x1, 0x11, 0x10, + 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, + 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, + 0xfe, 0xc9, 0x61, 0x0, + + /* U+0680 "Ú€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xa9, 0x90, 0x0, 0x0, 0x0, 0x0, 0x11, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xa9, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x11, 0x11, 0x0, 0x0, 0x0, + + /* U+0681 "Ú" */ + 0x0, 0xa, 0xc2, 0x0, 0x0, 0x0, 0x38, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xa4, 0x0, 0x0, 0x0, + 0x38, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9e, 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, + 0xe8, 0x41, 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, + 0xc, 0xc0, 0x0, 0x0, 0x0, 0x3f, 0x30, 0x0, + 0x0, 0x0, 0x6f, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x10, 0x0, 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, + 0x0, 0x8, 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+0682 "Ú‚" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, + 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9e, 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, + 0xe8, 0x41, 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, + 0xc, 0xc0, 0x0, 0x0, 0x0, 0x3f, 0x30, 0x0, + 0x0, 0x0, 0x6f, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x10, 0x0, 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, + 0x0, 0x8, 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+0683 "Úƒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x98, 0x5b, 0xfe, 0xb6, 0x0, 0x0, + 0xbf, 0x70, 0x0, 0x0, 0x7, 0xf4, 0x0, 0x0, + 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x4f, 0x20, + 0x20, 0x20, 0x0, 0x6f, 0x0, 0xe4, 0xf3, 0x0, + 0x5f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, + 0x0, 0x0, 0x7, 0xfa, 0x41, 0x14, 0xa4, 0x0, + 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, + 0x0, + + /* U+0684 "Ú„" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0xe, 0x30, 0x0, 0x6f, 0x0, + 0x2, 0x0, 0x0, 0x5f, 0x10, 0xf, 0x30, 0x0, + 0x1f, 0x80, 0x2, 0x0, 0x0, 0x8, 0xf9, 0x31, + 0x13, 0x83, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+0685 "Ú…" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x7a, 0x8a, 0x0, 0x0, 0x0, + 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9e, 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, + 0xe8, 0x41, 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, + 0xc, 0xc0, 0x0, 0x0, 0x0, 0x3f, 0x30, 0x0, + 0x0, 0x0, 0x6f, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x10, 0x0, 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, + 0x0, 0x8, 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+0686 "Ú†" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0xd5, 0xd4, 0x0, 0x6f, 0x0, + 0x20, 0x20, 0x0, 0x5f, 0x10, 0xd, 0x50, 0x0, + 0x1f, 0x80, 0x2, 0x0, 0x0, 0x8, 0xf9, 0x31, + 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+0687 "Ú‡" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0xd5, 0xd4, 0x0, 0x6f, 0x0, + 0x20, 0x20, 0x0, 0x5f, 0x10, 0xd5, 0xe4, 0x0, + 0x1f, 0x80, 0x21, 0x20, 0x0, 0x8, 0xf9, 0x31, + 0x13, 0x83, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+0688 "Úˆ" */ + 0x0, 0xc0, 0x0, 0x0, 0xc, 0x26, 0x10, 0x0, + 0xda, 0x98, 0x0, 0x6e, 0xcc, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xb7, 0x0, 0x0, 0x5, 0xf5, + 0x0, 0x0, 0xa, 0xd0, 0x0, 0x0, 0x5f, 0x20, + 0x0, 0x7, 0xf1, 0x9, 0x6a, 0xfc, 0x0, 0xdf, + 0xe9, 0x10, + + /* U+0689 "Ú‰" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, + 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, + 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xff, 0xf1, + 0x0, 0xa, 0x58, 0x80, 0x0, 0xb5, 0x88, 0x0, + 0x3, 0xdc, 0x10, + + /* U+068A "ÚŠ" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, + 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, + 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xfe, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x70, 0x0, + 0x0, 0x11, 0x0, + + /* U+068B "Ú‹" */ + 0x0, 0xc0, 0x0, 0x0, 0xc, 0x26, 0x10, 0x0, + 0xda, 0x98, 0x0, 0x6e, 0xcc, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xb7, 0x0, 0x0, 0x5, 0xf5, + 0x0, 0x0, 0xa, 0xd0, 0x0, 0x0, 0x5f, 0x20, + 0x0, 0x7, 0xf1, 0x9, 0x6a, 0xfc, 0x0, 0xdf, + 0xe9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa7, + 0x0, 0x0, 0x1, 0x10, 0x0, + + /* U+068C "ÚŒ" */ + 0x0, 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, + 0x13, 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, + 0xf8, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, + 0x20, 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, + 0xdf, 0xe8, 0x0, + + /* U+068D "Ú" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, + 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, + 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xfe, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa8, 0xb7, 0x0, + 0x1, 0x11, 0x10, + + /* U+068E "ÚŽ" */ + 0x0, 0xf, 0x10, 0x0, 0x0, 0x20, 0x0, 0x0, + 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, 0x13, + 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, 0xf8, + 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, 0x20, + 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, 0xdf, + 0xe8, 0x0, + + /* U+068F "Ú" */ + 0x0, 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, + 0xf, 0x10, 0x0, 0x0, 0x20, 0x0, 0x0, 0x2b, + 0x60, 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0xad, + 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x7f, 0x10, + 0x96, 0xaf, 0xc0, 0xd, 0xfe, 0x91, 0x0, + + /* U+0690 "Ú" */ + 0x0, 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, + 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, 0x13, + 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, 0xf8, + 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, 0x20, + 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, 0xdf, + 0xe8, 0x0, + + /* U+0691 "Ú‘" */ + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0xc0, + 0x0, 0x0, 0x0, 0xc, 0x27, 0x10, 0x0, 0x0, + 0xda, 0x97, 0x0, 0x0, 0x7e, 0xcb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x70, 0x0, 0x0, 0x0, 0xbb, + 0x0, 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, + 0xd9, 0x0, 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, + 0x4f, 0xd0, 0x1, 0x46, 0xcf, 0xd1, 0x0, 0xaf, + 0xfc, 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, + + /* U+0692 "Ú’" */ + 0x0, 0x0, 0x47, 0x8, 0x40, 0x0, 0x0, 0xd8, + 0xd0, 0x0, 0x0, 0x4, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, 0xba, 0x0, + 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, 0xca, + 0x0, 0x0, 0x0, 0x3f, 0x60, 0x0, 0x0, 0x4e, + 0xd0, 0x1, 0x46, 0xcf, 0xd2, 0x0, 0xaf, 0xfc, + 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, + + /* U+0693 "Ú“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe8, 0x0, 0x0, 0x0, 0x0, 0xbb, 0x0, 0x0, + 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, 0x0, 0xe9, + 0x0, 0x0, 0x0, 0x7, 0xf4, 0x0, 0x0, 0x1, + 0x9f, 0xfe, 0x90, 0x59, 0xbf, 0xfc, 0xd1, 0xf0, + 0xae, 0xb7, 0x10, 0xbe, 0x90, + + /* U+0694 "Ú”" */ + 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0xb, + 0xa0, 0x0, 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, + 0xc, 0xa0, 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, + 0x2, 0xed, 0x0, 0x1, 0x4a, 0xfd, 0x20, 0xa, + 0xff, 0xc6, 0x0, 0x98, 0x33, 0x10, 0x0, 0x0, + 0x0, + + /* U+0695 "Ú•" */ + 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xba, 0x0, 0x0, 0x0, 0x0, 0x0, 0xab, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xca, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xd3, 0x0, 0x20, 0x14, 0x6c, 0xfd, 0x2a, + 0x86, 0xb0, 0xaf, 0xfc, 0x60, 0x1, 0xee, 0x20, + 0x33, 0x10, 0x0, 0x0, 0x33, 0x0, + + /* U+0696 "Ú–" */ + 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, 0xb, + 0xb0, 0x0, 0x11, 0x0, 0xbb, 0x0, 0x9, 0x90, + 0xe, 0x90, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, + 0x4b, 0xfa, 0x0, 0x7c, 0xef, 0xf9, 0x6, 0x5a, + 0xec, 0x72, 0x0, 0x54, + + /* U+0697 "Ú—" */ + 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, 0x20, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x70, 0x0, 0x0, 0x0, 0xbb, 0x0, 0x0, + 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, 0xda, 0x0, + 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, 0x4f, 0xd0, + 0x1, 0x46, 0xcf, 0xd2, 0x0, 0xaf, 0xfc, 0x60, + 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, + + /* U+0698 "Ú˜" */ + 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, + 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x70, 0x0, 0x0, 0x0, 0xbb, 0x0, + 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, 0xda, + 0x0, 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, 0x4f, + 0xd0, 0x1, 0x46, 0xcf, 0xd2, 0x0, 0xaf, 0xfc, + 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, + + /* U+0699 "Ú™" */ + 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, 0x20, + 0x20, 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, + 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x70, 0x0, 0x0, 0x0, 0xbb, 0x0, + 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, 0xda, + 0x0, 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, 0x4f, + 0xd0, 0x1, 0x46, 0xcf, 0xd2, 0x0, 0xaf, 0xfc, + 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, + + /* U+069A "Úš" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x1, 0x61, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, + 0x20, 0x3, 0xf3, 0x0, 0x0, 0x0, 0xc, 0x90, + 0x5, 0xf2, 0x3, 0xf3, 0x1, 0x0, 0x0, 0x8, + 0xd0, 0x6, 0xf3, 0x4, 0xf2, 0x6f, 0x10, 0x0, + 0x6, 0xf3, 0xa, 0xf9, 0x7, 0xf1, 0xca, 0x0, + 0x0, 0x6, 0xff, 0xbf, 0xcf, 0xbf, 0xb0, 0xe8, + 0x0, 0x0, 0xa, 0xfc, 0xfa, 0x1a, 0xfb, 0x10, + 0xe8, 0x0, 0x0, 0x4f, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xbe, 0x52, 0x27, 0xfe, 0x20, 0x1f, 0x10, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xb2, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x0, 0x24, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+069B "Ú›" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xf3, 0x0, 0x0, 0x0, 0xd, 0x90, 0x4, 0xf2, + 0x3, 0xf3, 0x0, 0x0, 0x0, 0x8, 0xd0, 0x6, + 0xf3, 0x4, 0xf3, 0x6f, 0x10, 0x0, 0x6, 0xf3, + 0xa, 0xf8, 0x6, 0xf1, 0xca, 0x0, 0x0, 0x6, + 0xfe, 0xbf, 0xcf, 0xbf, 0xc0, 0xe8, 0x0, 0x0, + 0xa, 0xfc, 0xfa, 0x1a, 0xfb, 0x10, 0xe8, 0x0, + 0x0, 0x5f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x85, 0x59, 0xfe, 0x20, 0xb2, 0xb0, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0x91, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, + + /* U+069C "Úœ" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x2, 0x0, 0x1, 0x61, 0x0, 0x0, 0x0, 0x2, + 0x10, 0x0, 0x20, 0x3, 0xf3, 0x0, 0x0, 0x0, + 0xc, 0x90, 0x5, 0xf2, 0x3, 0xf3, 0x1, 0x0, + 0x0, 0x8, 0xd0, 0x6, 0xf3, 0x4, 0xf2, 0x6f, + 0x10, 0x0, 0x5, 0xf3, 0xa, 0xf9, 0x7, 0xf1, + 0xca, 0x0, 0x0, 0x6, 0xff, 0xbf, 0xcf, 0xbf, + 0xb0, 0xe8, 0x0, 0x0, 0xa, 0xfc, 0xfa, 0x1a, + 0xfb, 0x10, 0xe8, 0x0, 0x0, 0x5f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0x85, 0x59, 0xfe, 0x20, + 0xb2, 0xb0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0x91, + 0x0, 0x1f, 0x10, 0x0, 0x0, 0x0, 0x1, 0x20, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+069D "Ú" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0xa, 0x43, + 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, 0x0, 0xc, + 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, 0x0, 0x0, + 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, 0xd9, 0x0, + 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, 0x0, 0xf7, + 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, 0xf3, 0xf0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, 0x0, 0x20, + 0x20, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+069E "Úž" */ + 0x0, 0x0, 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe3, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xaf, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, + 0xa, 0x43, 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, + 0x0, 0xc, 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, + 0x0, 0x0, 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, + 0xd9, 0x0, 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, + 0x0, 0xf7, 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+069F "ÚŸ" */ + 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, + 0xf, 0x20, 0x0, 0x0, 0x0, 0xf7, 0x0, 0x20, + 0x0, 0x0, 0x0, 0xf, 0x70, 0xf3, 0xf2, 0x0, + 0x0, 0x0, 0xf7, 0x2, 0x2, 0x10, 0x0, 0x0, + 0xf, 0x70, 0x6, 0xdf, 0xf9, 0x0, 0x0, 0xf7, + 0xb, 0xfa, 0x46, 0xf7, 0x0, 0xf, 0x7b, 0xf6, + 0x0, 0xc, 0xa0, 0x0, 0xfd, 0xf5, 0x0, 0x6, + 0xf8, 0x67, 0x7f, 0xfd, 0x77, 0x9d, 0xfc, 0x1e, + 0xff, 0xff, 0xff, 0xfe, 0xb5, 0x0, + + /* U+06A0 "Ú " */ + 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0xa8, 0xb7, 0x0, 0x0, 0x0, + 0x11, 0x11, 0x0, 0x0, 0x0, 0x8, 0xef, 0x20, + 0x0, 0x0, 0xce, 0x75, 0x0, 0x0, 0x4, 0xf2, + 0x0, 0x0, 0x0, 0x4, 0xf4, 0x26, 0xbd, 0x0, + 0x0, 0xaf, 0xff, 0xd9, 0x0, 0x0, 0xbf, 0x92, + 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, 0xf, + 0x80, 0x0, 0x0, 0x0, 0xf, 0x50, 0x0, 0x0, + 0x0, 0xe, 0x90, 0x0, 0x0, 0x0, 0x6, 0xf9, + 0x31, 0x13, 0x95, 0x0, 0x6d, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+06A1 "Ú¡" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0x9e, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xa0, 0x5f, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xcd, 0x18, 0xf3, 0xba, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xef, 0x1f, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0xc0, 0xbf, 0x83, 0x21, + 0x22, 0x46, 0xaf, 0xe2, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xfc, 0x70, 0x0, 0x0, 0x2, 0x44, 0x43, + 0x10, 0x0, 0x0, 0x0, + + /* U+06A2 "Ú¢" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, + 0x35, 0x8d, 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, + 0xff, 0xb6, 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, + + /* U+06A3 "Ú£" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, 0x35, + 0x8d, 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xb6, 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, + + /* U+06A4 "Ú¤" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, 0x35, 0x8d, + 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, 0xff, 0xb6, + 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, 0x0, + 0x0, + + /* U+06A5 "Ú¥" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x9d, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xc1, 0x6f, 0x3b, 0xb0, + 0x0, 0x0, 0x0, 0x5f, 0xfe, 0xf3, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x6f, 0x1e, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xc0, 0x7f, 0xa4, 0x21, + 0x23, 0x58, 0xdf, 0xe2, 0x0, 0x6e, 0xff, 0xff, + 0xff, 0xfc, 0x70, 0x0, 0x0, 0x2, 0x44, 0x43, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xf3, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, + + /* U+06A6 "Ú¦" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xf3, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, 0x35, 0x8d, + 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, 0xff, 0xb6, + 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, 0x0, + 0x0, + + /* U+06A7 "Ú§" */ + 0x0, 0x0, 0x0, 0x5, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0xaf, 0x9e, 0xa0, + 0x0, 0x0, 0x0, 0xf9, 0x7, 0xf0, 0x0, 0x0, + 0x0, 0xdc, 0x19, 0xf2, 0x3, 0x50, 0x0, 0x5f, + 0xfe, 0xf3, 0xc, 0x90, 0x0, 0x1, 0x24, 0xf1, + 0xf, 0x50, 0x0, 0x0, 0x9, 0xd0, 0x2f, 0x40, + 0x0, 0x0, 0x3f, 0x60, 0xf, 0x70, 0x0, 0x4, + 0xeb, 0x0, 0xb, 0xe5, 0x35, 0xaf, 0xb0, 0x0, + 0x1, 0xdf, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x3, + 0x43, 0x0, 0x0, 0x0, + + /* U+06A8 "Ú¨" */ + 0x0, 0x0, 0x0, 0x6, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5c, + 0x6c, 0x0, 0x0, 0x0, 0x0, 0x2, 0x12, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x74, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x60, 0x0, 0x0, 0x0, 0xeb, + 0x19, 0xe0, 0x0, 0x0, 0x0, 0xeb, 0x18, 0xf2, + 0x3, 0x50, 0x0, 0x5f, 0xfe, 0xf3, 0xc, 0x90, + 0x0, 0x1, 0x24, 0xf2, 0xf, 0x50, 0x0, 0x0, + 0x9, 0xe0, 0x2f, 0x40, 0x0, 0x0, 0x3f, 0x80, + 0xf, 0x70, 0x0, 0x3, 0xec, 0x0, 0xb, 0xe4, + 0x35, 0xaf, 0xc1, 0x0, 0x1, 0xdf, 0xff, 0xe7, + 0x0, 0x0, 0x0, 0x3, 0x43, 0x0, 0x0, 0x0, + + /* U+06A9 "Ú©" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x7d, 0xf4, 0x0, 0x0, + 0x0, 0x2, 0x9f, 0xf9, 0x20, 0x0, 0x0, 0x0, + 0x3f, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x20, 0x0, + 0x79, 0x0, 0x0, 0x0, 0x1e, 0xb0, 0x0, 0xe8, + 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, + 0x0, 0x0, 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, + 0x49, 0xef, 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, + 0x92, 0x0, 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, + 0x0, 0x0, + + /* U+06AA "Úª" */ + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xcf, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xfe, + 0xc9, 0x74, 0x10, 0x0, 0x0, 0x0, 0x5, 0x8b, + 0xdf, 0xff, 0xfc, 0x91, 0x89, 0x0, 0x0, 0x0, + 0x2, 0x57, 0xaf, 0xce, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xe9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xd8, 0xf9, 0x42, 0x11, 0x11, 0x24, + 0x9f, 0xf5, 0x7, 0xef, 0xff, 0xff, 0xff, 0xfd, + 0x81, 0x0, 0x0, 0x24, 0x44, 0x44, 0x31, 0x0, + 0x0, + + /* U+06AB "Ú«" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x43, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x7e, 0xf4, 0x0, 0x0, + 0x0, 0x3, 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe2, 0xd0, 0x0, 0x0, 0x0, 0x9f, + 0x45, 0xa2, 0xe0, 0x0, 0x0, 0x0, 0x5f, 0x20, + 0xbe, 0x50, 0x0, 0x0, 0x0, 0x9, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, + 0x35, 0x0, 0x0, 0x0, 0x1e, 0x90, 0x0, 0xd9, + 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0xe8, 0x0, + 0x0, 0x0, 0xb, 0xf0, 0x0, 0x9f, 0x94, 0x22, + 0x49, 0xff, 0x70, 0x0, 0x8, 0xef, 0xff, 0xfe, + 0x93, 0x0, 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, + 0x0, 0x0, + + /* U+06AC "Ú¬" */ + 0x0, 0x0, 0x2f, 0x0, 0xe, 0x90, 0x0, 0x0, + 0x20, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x90, 0x0, 0x2, 0x96, 0x0, 0xe9, 0x0, 0x0, + 0x76, 0x0, 0xe, 0x90, 0x0, 0x0, 0x58, 0x0, + 0xe9, 0x0, 0x2, 0xab, 0x20, 0xe, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xe8, 0x54, 0x0, 0x0, 0x0, + 0xf, 0x7d, 0xa0, 0x0, 0x0, 0x9, 0xf3, 0x8f, + 0xb7, 0x55, 0x8e, 0xf8, 0x0, 0x5c, 0xef, 0xfe, + 0xb4, 0x0, + + /* U+06AD "Ú­" */ + 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x1, 0xf3, 0xf0, 0xe, + 0x90, 0x0, 0x2, 0x2, 0x0, 0xe9, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x90, 0x0, 0x2, 0x96, 0x0, + 0xe9, 0x0, 0x0, 0x76, 0x0, 0xe, 0x90, 0x0, + 0x0, 0x58, 0x0, 0xe9, 0x0, 0x2, 0xab, 0x20, + 0xe, 0x90, 0x0, 0x0, 0x0, 0x0, 0xe8, 0x54, + 0x0, 0x0, 0x0, 0xf, 0x7d, 0xa0, 0x0, 0x0, + 0x9, 0xf3, 0x8f, 0xb7, 0x55, 0x8e, 0xf8, 0x0, + 0x5c, 0xef, 0xfe, 0xb4, 0x0, + + /* U+06AE "Ú®" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x90, 0x0, 0x2, 0x96, 0x0, 0xe9, 0x0, 0x0, + 0x76, 0x0, 0xe, 0x90, 0x0, 0x0, 0x58, 0x0, + 0xe9, 0x0, 0x2, 0xab, 0x20, 0xe, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xe8, 0x54, 0x0, 0x0, 0x0, + 0xf, 0x7d, 0xa0, 0x0, 0x0, 0x9, 0xf3, 0x8f, + 0xb7, 0x55, 0x8e, 0xf8, 0x0, 0x5c, 0xef, 0xfe, + 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4d, 0x5c, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x20, 0x0, 0x0, 0x0, 0x5, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+06AF "Ú¯" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x73, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xb2, 0x0, 0x0, + 0x0, 0x6, 0xde, 0x81, 0x42, 0x0, 0x0, 0x0, + 0x6b, 0x51, 0x7d, 0xf4, 0x0, 0x0, 0x0, 0x2, + 0x9f, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x3f, 0xd6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0x20, 0x0, 0x79, 0x0, + 0x0, 0x0, 0x1e, 0xb0, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, + 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xef, + 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x92, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + + /* U+06B0 "Ú°" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x84, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xaf, 0xa2, 0x0, 0x0, + 0x0, 0x17, 0xde, 0x71, 0x43, 0x0, 0x0, 0x0, + 0x6b, 0x41, 0x7e, 0xf4, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xe2, 0xd0, 0x0, 0x0, 0x0, 0x9f, 0x45, 0xa2, + 0xe0, 0x0, 0x0, 0x0, 0x5f, 0x20, 0xbe, 0x50, + 0x0, 0x0, 0x0, 0x9, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x35, 0x0, + 0x0, 0x0, 0x1e, 0x90, 0x0, 0xd9, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe8, 0x0, 0x0, 0x0, + 0xb, 0xf0, 0x0, 0x9f, 0x94, 0x22, 0x49, 0xff, + 0x70, 0x0, 0x8, 0xef, 0xff, 0xfe, 0x93, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + + /* U+06B1 "Ú±" */ + 0x0, 0x0, 0x0, 0xf3, 0xf2, 0x2, 0x84, 0x0, + 0x0, 0x0, 0x20, 0x25, 0xbf, 0xa1, 0x0, 0x0, + 0x0, 0x17, 0xdd, 0x71, 0x53, 0x0, 0x0, 0x0, + 0x6b, 0x41, 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0xe8, 0x20, 0x0, 0x0, 0x0, 0x4f, 0xd6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x20, 0x0, 0x78, 0x0, + 0x0, 0x0, 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, + 0x1b, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xff, + 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x92, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + + /* U+06B2 "Ú²" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xcf, 0x91, 0x0, 0x0, + 0x0, 0x18, 0xed, 0x61, 0x63, 0x0, 0x0, 0x0, + 0x6a, 0x32, 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, + 0xbf, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x20, 0x0, 0x8a, 0x0, + 0x0, 0x0, 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, + 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xef, + 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x82, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xd5, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x20, 0x0, 0x0, 0x0, + + /* U+06B3 "Ú³" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xcf, 0x91, 0x0, 0x0, + 0x0, 0x18, 0xed, 0x61, 0x63, 0x0, 0x0, 0x0, + 0x6a, 0x32, 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, + 0xbf, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x20, 0x0, 0x8a, 0x0, + 0x0, 0x0, 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, + 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xef, + 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x82, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x0, + + /* U+06B4 "Ú´" */ + 0x0, 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf3, 0xf2, 0x2, 0x84, 0x0, 0x0, 0x0, + 0x20, 0x25, 0xbf, 0xa1, 0x0, 0x0, 0x0, 0x17, + 0xdd, 0x71, 0x53, 0x0, 0x0, 0x0, 0x6b, 0x41, + 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, 0xaf, 0xe8, + 0x20, 0x0, 0x0, 0x0, 0x4f, 0xd6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0x20, 0x0, 0x78, 0x0, 0x0, 0x0, + 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, 0x0, 0x7, + 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x1b, 0xe0, + 0x0, 0x8f, 0x94, 0x22, 0x49, 0xff, 0x60, 0x0, + 0x7, 0xef, 0xff, 0xfd, 0x92, 0x0, 0x0, 0x0, + 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + + /* U+06B5 "Úµ" */ + 0x0, 0x0, 0x0, 0x34, 0x5, 0x30, 0x0, 0x0, + 0x1, 0xe5, 0xe0, 0x0, 0x0, 0x0, 0x6, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0x30, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0x30, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4f, 0x30, 0x0, + 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0x30, 0x0, 0x0, 0x0, 0x4, 0xf2, 0x3, + 0x60, 0x0, 0x0, 0x5f, 0x20, 0xcb, 0x0, 0x0, + 0x8, 0xf0, 0xd, 0x90, 0x0, 0x2, 0xeb, 0x0, + 0x9f, 0x61, 0x37, 0xef, 0x20, 0x0, 0xaf, 0xff, + 0xfa, 0x20, 0x0, 0x0, 0x13, 0x30, 0x0, 0x0, + 0x0, + + /* U+06B6 "Ú¶" */ + 0x0, 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, + 0x0, 0x0, 0x4, 0xf2, 0x36, 0x0, 0x0, 0x5, + 0xf2, 0xcb, 0x0, 0x0, 0x8, 0xf0, 0xd9, 0x0, + 0x0, 0x2e, 0xb0, 0x9f, 0x61, 0x37, 0xef, 0x20, + 0xa, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x13, 0x30, + 0x0, 0x0, + + /* U+06B7 "Ú·" */ + 0x0, 0x0, 0x0, 0x3, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x2f, 0x3e, 0x0, + 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, + 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, + 0xf2, 0x36, 0x0, 0x0, 0x5, 0xf2, 0xcb, 0x0, + 0x0, 0x8, 0xf0, 0xd9, 0x0, 0x0, 0x2e, 0xb0, + 0x9f, 0x61, 0x37, 0xef, 0x20, 0xa, 0xff, 0xff, + 0xa2, 0x0, 0x0, 0x13, 0x30, 0x0, 0x0, + + /* U+06B8 "Ú¸" */ + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, + 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, + 0x0, 0x0, 0x0, 0x4, 0xf2, 0x36, 0x0, 0x0, + 0x5, 0xf2, 0xcb, 0x0, 0x0, 0x8, 0xf0, 0xd9, + 0x0, 0x0, 0x2e, 0xb0, 0x9f, 0x61, 0x37, 0xef, + 0x20, 0xa, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x13, + 0x30, 0x0, 0x0, 0x0, 0xb, 0x7b, 0x60, 0x0, + 0x0, 0x1, 0x12, 0x10, 0x0, 0x0, 0x0, 0xb7, + 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, + + /* U+06B9 "Ú¹" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x4, 0x60, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x58, + 0x0, 0x0, 0x0, 0xf6, 0xcb, 0x0, 0x0, 0x0, + 0xe8, 0xd9, 0x0, 0x0, 0x1, 0xf6, 0xbc, 0x0, + 0x0, 0x9, 0xf1, 0x5f, 0x94, 0x23, 0x9f, 0x80, + 0x6, 0xef, 0xff, 0xe7, 0x0, 0x0, 0x3, 0x42, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, + + /* U+06BA "Úº" */ + 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, + 0x7, 0xf1, 0x12, 0x0, 0x0, 0x1, 0xf5, 0xbc, + 0x0, 0x0, 0x0, 0xf7, 0xda, 0x0, 0x0, 0x0, + 0xf8, 0xd9, 0x0, 0x0, 0x2, 0xf5, 0xac, 0x0, + 0x0, 0xa, 0xf0, 0x4f, 0xa4, 0x24, 0xaf, 0x60, + 0x5, 0xef, 0xff, 0xe6, 0x0, 0x0, 0x3, 0x42, + 0x0, 0x0, + + /* U+06BB "Ú»" */ + 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x38, 0x20, 0x0, 0x0, + 0xd, 0xb8, 0x80, 0x0, 0x0, 0x5d, 0xcc, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x0, 0x3, 0xf4, 0x7a, 0x0, 0x0, 0x0, 0xf7, + 0xca, 0x0, 0x0, 0x0, 0xe8, 0xd9, 0x0, 0x0, + 0x1, 0xf6, 0xbc, 0x0, 0x0, 0x9, 0xf1, 0x5f, + 0xa4, 0x24, 0xaf, 0x80, 0x6, 0xef, 0xff, 0xe6, + 0x0, 0x0, 0x3, 0x42, 0x0, 0x0, + + /* U+06BC "Ú¼" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x4, 0x50, 0x0, 0x0, 0x0, 0x5, 0xf2, 0x23, + 0x0, 0x0, 0x1, 0xf6, 0xbc, 0x0, 0x0, 0x0, + 0xf8, 0xda, 0x0, 0x0, 0x0, 0xf8, 0xd9, 0x0, + 0x0, 0x3, 0xf5, 0xac, 0x0, 0x0, 0xa, 0xe0, + 0x4f, 0xa4, 0x24, 0xaf, 0x60, 0x5, 0xef, 0xff, + 0xe5, 0x0, 0x0, 0xa, 0xfd, 0x70, 0x0, 0x0, + 0xa, 0x66, 0xa0, 0x0, 0x0, 0x3, 0xdd, 0x30, + 0x0, + + /* U+06BD "Ú½" */ + 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x0, 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, + 0x2, 0x2, 0x4, 0x50, 0x0, 0x0, 0x0, 0x5, + 0xf2, 0x23, 0x0, 0x0, 0x1, 0xf6, 0xbc, 0x0, + 0x0, 0x0, 0xf8, 0xda, 0x0, 0x0, 0x0, 0xf8, + 0xc9, 0x0, 0x0, 0x3, 0xf5, 0xad, 0x0, 0x0, + 0xa, 0xe0, 0x3f, 0xa4, 0x24, 0xaf, 0x60, 0x5, + 0xef, 0xff, 0xe5, 0x0, 0x0, 0x3, 0x42, 0x0, + 0x0, + + /* U+06BE "Ú¾" */ + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0xd, 0xc3, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x70, 0x0, 0x0, + 0xe, 0xbc, 0xf9, 0x0, 0x0, 0x2f, 0x34, 0xff, + 0x60, 0x0, 0xf, 0x57, 0xe7, 0xe0, 0xda, 0xb, + 0xde, 0x92, 0xf2, 0xce, 0x8b, 0xff, 0x99, 0xf1, + 0x2a, 0xfe, 0x8a, 0xee, 0x70, + + /* U+06BF "Ú¿" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, + 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, + 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, + 0x0, 0x0, 0x0, 0x3f, 0x30, 0xd5, 0xd4, 0x0, + 0x6f, 0x0, 0x20, 0x20, 0x0, 0x5f, 0x10, 0xd, + 0x50, 0x0, 0x1f, 0x80, 0x2, 0x0, 0x0, 0x8, + 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+06C6 "Û†" */ + 0x0, 0xd, 0x36, 0xb0, 0x0, 0x4, 0xde, 0x20, + 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+06C7 "Û‡" */ + 0x0, 0x2, 0xda, 0x0, 0x0, 0x6, 0x9d, 0x10, + 0x0, 0x1, 0xcf, 0x70, 0x0, 0x5, 0xc2, 0x0, + 0x0, 0xd8, 0x10, 0x0, 0x0, 0x8, 0xed, 0x40, + 0x0, 0x6f, 0xac, 0xf1, 0x0, 0x9e, 0x1, 0xf6, + 0x0, 0x6f, 0xa6, 0xf7, 0x0, 0x8, 0xdf, 0xf7, + 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x2e, 0xe0, + 0x12, 0x48, 0xef, 0x30, 0xaf, 0xff, 0xa2, 0x0, + 0x34, 0x20, 0x0, 0x0, + + /* U+06C8 "Ûˆ" */ + 0x0, 0x0, 0x52, 0x0, 0x0, 0x0, 0x94, 0x0, + 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x94, 0x0, + 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+06CB "Û‹" */ + 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+06CC "ÛŒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, + 0x40, 0x0, 0x5, 0xf7, 0x0, 0x10, 0x12, 0x0, + 0x9, 0xfe, 0x80, 0xc, 0xa0, 0x0, 0x2, 0x7e, + 0xb0, 0xf7, 0x0, 0x0, 0x0, 0xaf, 0xd, 0xc0, + 0x0, 0x2, 0x9f, 0x90, 0x4f, 0xfc, 0xcf, 0xff, + 0x90, 0x0, 0x28, 0xba, 0x85, 0x10, 0x0, + + /* U+06CE "ÛŽ" */ + 0xc, 0x47, 0xa0, 0x0, 0x0, 0x0, 0x2e, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x21, 0x6, 0xdf, 0xe7, + 0x0, 0x0, 0x4, 0xf9, 0x48, 0xf4, 0x0, 0x0, + 0x5f, 0x60, 0x2, 0x10, 0x10, 0x0, 0xbf, 0xe7, + 0x0, 0xbb, 0x0, 0x0, 0x39, 0xfa, 0xf, 0x70, + 0x0, 0x0, 0xa, 0xf0, 0xeb, 0x0, 0x0, 0x17, + 0xfb, 0x6, 0xfd, 0xab, 0xdf, 0xfc, 0x10, 0x5, + 0xdf, 0xfd, 0x94, 0x0, 0x0, + + /* U+06D0 "Û" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x84, 0x7f, + 0x40, 0x0, 0x4, 0xf8, 0x10, 0x10, 0x24, 0x0, + 0x7, 0xff, 0xa2, 0xd, 0xa0, 0x0, 0x0, 0x5d, + 0xc0, 0xf7, 0x0, 0x0, 0x0, 0xbe, 0xb, 0xd2, + 0x0, 0x14, 0xbf, 0x60, 0x1b, 0xfe, 0xff, 0xea, + 0x30, 0x0, 0x1, 0x43, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+06D5 "Û•" */ + 0x0, 0x10, 0x0, 0x2, 0xef, 0xd5, 0x0, 0xae, + 0x5a, 0xf7, 0xd, 0x90, 0x7, 0xf1, 0xe8, 0x0, + 0x3f, 0x3b, 0xe6, 0x6d, 0xe0, 0x2b, 0xfe, 0x91, + 0x0, + + /* U+06F0 "Û°" */ + 0x8f, 0x29, 0xf2, + + /* U+06F1 "Û±" */ + 0xae, 0x0, 0x4f, 0x30, 0xe, 0x90, 0x9, 0xd0, + 0x5, 0xf1, 0x2, 0xf4, 0x0, 0xf6, 0x0, 0xf6, + 0x0, 0xf7, 0x0, 0xf7, + + /* U+06F2 "Û²" */ + 0x2f, 0x70, 0x0, 0xac, 0xc, 0xf7, 0x26, 0xf7, + 0x6, 0xff, 0xff, 0xc0, 0x2, 0xf7, 0x33, 0x0, + 0x0, 0xea, 0x0, 0x0, 0x0, 0xbc, 0x0, 0x0, + 0x0, 0x9d, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, + 0x0, 0x7e, 0x0, 0x0, 0x0, 0x7e, 0x0, 0x0, + + /* U+06F3 "Û³" */ + 0x3f, 0x40, 0xf6, 0x4f, 0x20, 0xda, 0xf, 0x97, + 0xf1, 0x7, 0xfd, 0xff, 0xfc, 0x0, 0x2f, 0x91, + 0x33, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0xb, + 0xb0, 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, + 0x9, 0xd0, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x0, 0x8, 0xe0, 0x0, 0x0, + + /* U+06F4 "Û´" */ + 0x2f, 0x60, 0x9e, 0xd1, 0xc, 0xc6, 0xf5, 0x40, + 0x6, 0xff, 0xf4, 0x22, 0x2, 0xfe, 0xff, 0xf8, + 0x0, 0xe7, 0x24, 0x41, 0x0, 0xbb, 0x0, 0x0, + 0x0, 0x9d, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, + 0x0, 0x7e, 0x0, 0x0, 0x0, 0x7e, 0x0, 0x0, + + /* U+06F5 "Ûµ" */ + 0x0, 0x4, 0x81, 0x0, 0x0, 0x5f, 0xfd, 0x0, + 0x0, 0xe9, 0x2e, 0x80, 0x7, 0xf1, 0x7, 0xf1, + 0xc, 0xb0, 0x1, 0xf6, 0xf, 0x60, 0x0, 0xd9, + 0x1f, 0x40, 0x0, 0xbb, 0x2f, 0x40, 0x0, 0xab, + 0xf, 0x67, 0xd1, 0xca, 0xc, 0xde, 0xfc, 0xf6, + 0x4, 0xed, 0x6f, 0xc0, + + /* U+06F6 "Û¶" */ + 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0x80, 0x5, + 0xf7, 0x45, 0x0, 0xac, 0x0, 0x0, 0x9, 0xe1, + 0x0, 0x0, 0x2e, 0xfe, 0xf2, 0x0, 0x2f, 0xe7, + 0x0, 0xc, 0xd1, 0x0, 0x6, 0xf2, 0x0, 0x0, + 0xd9, 0x0, 0x0, 0x3f, 0x30, 0x0, 0x0, + + /* U+06F7 "Û·" */ + 0x4f, 0x30, 0x0, 0xad, 0x0, 0xda, 0x0, 0x1f, + 0x60, 0x6, 0xf1, 0x7, 0xe0, 0x0, 0x1f, 0x70, + 0xd9, 0x0, 0x0, 0xbc, 0x2f, 0x40, 0x0, 0x5, + 0xf9, 0xf0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0xdf, 0x70, 0x0, 0x0, 0x9, 0xf4, 0x0, + 0x0, 0x0, 0x7f, 0x10, 0x0, + + /* U+06F8 "Û¸" */ + 0x0, 0x7, 0xf1, 0x0, 0x0, 0x0, 0x9f, 0x40, + 0x0, 0x0, 0xd, 0xf7, 0x0, 0x0, 0x1, 0xff, + 0xb0, 0x0, 0x0, 0x5f, 0x9f, 0x0, 0x0, 0xb, + 0xc2, 0xf4, 0x0, 0x1, 0xf6, 0xd, 0x90, 0x0, + 0x6f, 0x10, 0x7e, 0x0, 0xd, 0xa0, 0x1, 0xf6, + 0x4, 0xf3, 0x0, 0xa, 0xd0, + + /* U+06F9 "Û¹" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xf7, 0x0, + 0xd, 0xc5, 0xaf, 0x40, 0x2f, 0x40, 0xd, 0x90, + 0xe, 0xb4, 0x2b, 0xc0, 0x3, 0xdf, 0xff, 0xd0, + 0x0, 0x2, 0x49, 0xf0, 0x0, 0x0, 0x5, 0xf2, + 0x0, 0x0, 0x2, 0xf5, 0x0, 0x0, 0x0, 0xf8, + 0x0, 0x0, 0x0, 0xbc, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdc, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, + 0x0, 0x0, 0x3, 0x8d, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xea, 0x51, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x83, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x2b, 0xff, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xfd, + 0xdf, 0xff, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xb2, + 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, + 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, + 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + + /* U+F00B "" */ + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xc0, + 0x1b, 0xa0, 0x0, 0x0, 0xb, 0xff, 0xfc, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xc0, 0x0, + 0xbf, 0xff, 0xb0, 0xb, 0xff, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0xfb, 0xbf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "ï€" */ + 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xfc, 0x10, + 0x0, 0x1c, 0xf8, 0xff, 0xfc, 0x10, 0x1c, 0xff, + 0xf5, 0xff, 0xfc, 0x2c, 0xff, 0xf5, 0x5, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x1d, 0xff, 0xfd, 0x10, 0x0, 0x1c, + 0xff, 0xff, 0xfc, 0x10, 0x1c, 0xff, 0xf9, 0xff, + 0xfc, 0x1c, 0xff, 0xf5, 0x5, 0xff, 0xfc, 0xdf, + 0xf5, 0x0, 0x5, 0xff, 0xd1, 0xa4, 0x0, 0x0, + 0x4, 0xa1, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x4f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x10, 0x6f, 0xf1, 0x3, 0x10, 0x0, + 0x0, 0x5f, 0xd0, 0x6f, 0xf1, 0x3f, 0xd1, 0x0, + 0x3, 0xff, 0xf1, 0x6f, 0xf1, 0x5f, 0xfd, 0x0, + 0xd, 0xff, 0x40, 0x6f, 0xf1, 0x9, 0xff, 0x70, + 0x4f, 0xf7, 0x0, 0x6f, 0xf1, 0x0, 0xcf, 0xe0, + 0x9f, 0xf0, 0x0, 0x6f, 0xf1, 0x0, 0x5f, 0xf3, + 0xbf, 0xc0, 0x0, 0x6f, 0xf1, 0x0, 0x2f, 0xf5, + 0xbf, 0xc0, 0x0, 0x4f, 0xe0, 0x0, 0x1f, 0xf6, + 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0x6f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf0, + 0xf, 0xfe, 0x10, 0x0, 0x0, 0x5, 0xff, 0xa0, + 0x6, 0xff, 0xd3, 0x0, 0x0, 0x7f, 0xff, 0x20, + 0x0, 0x9f, 0xff, 0xda, 0xbe, 0xff, 0xf4, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0x0, 0x17, 0xbd, 0xca, 0x50, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, + 0x4, 0xfd, 0xdf, 0xff, 0xff, 0xfd, 0xef, 0x40, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, + 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, + 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, + 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, + 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, + 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x4, 0xfe, 0xdf, 0xff, 0xff, 0xfd, 0xdf, 0x40, + 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x3, 0xdd, 0x30, 0x3f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x4f, + 0xf4, 0x0, 0x0, 0x0, 0x9, 0xff, 0x99, 0xff, + 0xbf, 0xf4, 0x0, 0x0, 0x1, 0xbf, 0xf6, 0x22, + 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x2d, 0xfe, 0x35, + 0xff, 0x53, 0xef, 0xf4, 0x0, 0x4, 0xff, 0xc1, + 0x8f, 0xff, 0xf8, 0x2d, 0xfe, 0x40, 0x7f, 0xfa, + 0x1a, 0xff, 0xff, 0xff, 0xa1, 0xaf, 0xf7, 0xcf, + 0x82, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x28, 0xfc, + 0x14, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x41, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf9, 0x0, 0x8f, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xe, 0xff, + 0xf6, 0x0, 0x6f, 0xff, 0xe0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xfc, 0x1b, 0xb1, 0xcf, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xc2, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F01C "" */ + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0xaf, 0xb0, 0x0, 0x0, 0x0, + 0xb, 0xfa, 0x0, 0x5, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x50, 0x1e, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xe1, 0xaf, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, + + /* U+F021 "" */ + 0x0, 0x0, 0x6, 0xbd, 0xda, 0x50, 0x2, 0xff, + 0x0, 0x5, 0xef, 0xff, 0xff, 0xfe, 0x42, 0xff, + 0x0, 0x7f, 0xff, 0xa7, 0x7b, 0xff, 0xf9, 0xff, + 0x5, 0xff, 0xc1, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xe, 0xfc, 0x0, 0x0, 0x2, 0x22, 0xdf, 0xff, + 0x5f, 0xf2, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x8f, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xb, 0xf8, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2f, 0xf4, + 0xff, 0xfd, 0x22, 0x20, 0x0, 0x0, 0xcf, 0xe0, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x2c, 0xff, 0x40, + 0xff, 0x9f, 0xff, 0xb7, 0x6a, 0xff, 0xf7, 0x0, + 0xff, 0x24, 0xdf, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0xff, 0x20, 0x5, 0xac, 0xdb, 0x60, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d, + 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x8f, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0x1, 0x50, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xbe, 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, + 0xff, 0xff, 0xff, 0xff, 0x5, 0xf8, 0xdf, 0xff, + 0xff, 0xff, 0x2, 0x60, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x3, 0xee, 0x10, 0x0, 0x0, 0x8, 0xff, 0x0, + 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x5, 0xfc, 0x7, 0xf4, 0xdf, 0xff, 0xff, + 0xff, 0x2, 0x50, 0x5f, 0x60, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xf7, 0xd, 0xc0, 0xbd, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x6, 0xf7, 0xd, + 0xc0, 0xad, 0xdf, 0xff, 0xff, 0xff, 0x2, 0x50, + 0x5f, 0x60, 0xe9, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0x5, 0xfc, 0x6, 0xf4, 0x0, 0x0, 0x8, 0xff, + 0x0, 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x0, + 0x8d, 0x0, 0x0, 0x2, 0xee, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, + + /* U+F03E "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xc, 0xff, 0xff, 0xee, 0xff, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xfe, 0x22, 0xef, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xe2, 0x0, 0x2e, 0xff, + 0xff, 0xfe, 0x4e, 0xfe, 0x20, 0x0, 0x2, 0xff, + 0xff, 0xe2, 0x2, 0xc2, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F043 "ïƒ" */ + 0x0, 0x0, 0x4e, 0x40, 0x0, 0x0, 0x0, 0xb, + 0xfb, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x30, 0x0, 0xc, 0xff, 0xff, 0xfc, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xf8, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0x2f, 0xff, 0xff, 0xff, 0xfe, 0xf2, 0xbf, 0xff, + 0xff, 0xfe, 0x9f, 0xa1, 0xbf, 0xff, 0xff, 0x92, + 0xff, 0xa2, 0x2f, 0xff, 0xf2, 0x4, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x2, 0x9e, 0xfe, 0x92, 0x0, + + /* U+F048 "ïˆ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x30, 0x0, + 0x1, 0xcc, 0xff, 0x40, 0x0, 0x2d, 0xff, 0xff, + 0x40, 0x3, 0xef, 0xff, 0xff, 0x40, 0x3f, 0xff, + 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x45, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x3, 0xef, + 0xff, 0xff, 0x40, 0x0, 0x2e, 0xff, 0xff, 0x30, + 0x0, 0x1, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "ï‹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x8e, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "ïŒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xf7, 0x0, 0x7f, 0xff, + 0xf7, + + /* U+F04D "ï" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, + + /* U+F051 "ï‘" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0x10, 0x0, + 0x3, 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xff, + 0xfe, 0x30, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x54, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, + 0xff, 0xf3, 0x4, 0xff, 0xff, 0xfe, 0x30, 0x4, + 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xcc, 0x10, + 0x0, 0x3, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + + /* U+F053 "ï“" */ + 0x0, 0x0, 0x0, 0x1a, 0x40, 0x0, 0x0, 0x1, + 0xdf, 0xf0, 0x0, 0x0, 0x1d, 0xff, 0xa0, 0x0, + 0x1, 0xdf, 0xfa, 0x0, 0x0, 0x1d, 0xff, 0xa0, + 0x0, 0x1, 0xdf, 0xfa, 0x0, 0x0, 0xc, 0xff, + 0xa0, 0x0, 0x0, 0xd, 0xff, 0x80, 0x0, 0x0, + 0x1, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0x80, 0x0, 0x0, 0x1, 0xdf, 0xf8, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0x80, 0x0, 0x0, 0x1, 0xdf, + 0xf0, 0x0, 0x0, 0x0, 0x1b, 0x50, + + /* U+F054 "ï”" */ + 0x4, 0xa1, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x10, + 0x0, 0x0, 0xa, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0xaf, 0xfd, 0x10, 0x0, 0x0, 0xa, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x10, 0x0, 0x0, + 0xa, 0xff, 0xc0, 0x0, 0x0, 0x8, 0xff, 0xd0, + 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, 0xff, + 0xd1, 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, + 0xff, 0xd1, 0x0, 0x0, 0xf, 0xfd, 0x10, 0x0, + 0x0, 0x5, 0xb1, 0x0, 0x0, 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x48, 0x88, 0x8c, 0xff, 0xc8, + 0x88, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x48, 0x88, 0x8c, 0xff, 0xc8, 0x88, 0x84, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, + 0x0, 0x0, + + /* U+F068 "ï¨" */ + 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb7, + + /* U+F06E "ï®" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, 0xfd, + 0x40, 0x0, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, + 0xef, 0xf7, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x9e, + 0x80, 0x4f, 0xff, 0x70, 0x4f, 0xff, 0xc0, 0x0, + 0xaf, 0xf8, 0xc, 0xff, 0xf4, 0xdf, 0xff, 0x80, + 0x9a, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0xdf, 0xff, + 0x80, 0xef, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0x4f, + 0xff, 0xc0, 0x8f, 0xff, 0xf8, 0xc, 0xff, 0xf4, + 0x7, 0xff, 0xf4, 0x8, 0xee, 0x80, 0x4f, 0xff, + 0x70, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, 0xef, + 0xf8, 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, + 0xda, 0x50, 0x0, 0x0, + + /* U+F070 "ï°" */ + 0x8c, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0x80, 0x49, + 0xdf, 0xfd, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xd8, 0x8c, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xf8, 0x0, 0x0, 0x4e, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x1c, 0xff, 0x69, 0xe8, + 0x4, 0xff, 0xf7, 0x0, 0x4, 0xe3, 0x0, 0x9f, + 0xfe, 0xff, 0x80, 0xcf, 0xff, 0x40, 0xd, 0xff, + 0x70, 0x5, 0xff, 0xff, 0xe0, 0x8f, 0xff, 0xd0, + 0xd, 0xff, 0xf7, 0x0, 0x2d, 0xff, 0xe0, 0x8f, + 0xff, 0xd0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0xaf, + 0xf8, 0xcf, 0xff, 0x30, 0x0, 0x7f, 0xff, 0x40, + 0x0, 0x6, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x8, + 0xff, 0xf4, 0x0, 0x0, 0x3e, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x4d, 0xff, 0xc8, 0x82, 0x1, 0xbf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfc, + 0x10, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc8, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd8, 0x8d, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xa0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xb0, 0xb, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xc0, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xd0, 0xd, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xf9, 0x9f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xe2, 0x2e, 0xff, 0xff, 0xf8, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x90, 0x9, 0xff, 0xff, + 0xff, 0x10, 0xa, 0xff, 0xff, 0xff, 0xe3, 0x3e, + 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0x78, 0x8e, 0xff, 0x15, 0xff, 0xe8, 0xff, 0xe2, + 0x0, 0x2, 0xe5, 0x4f, 0xfe, 0x20, 0xfe, 0x20, + 0x0, 0x0, 0x13, 0xff, 0xf3, 0x0, 0x52, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x31, 0x0, 0x52, 0x0, + 0x0, 0x2, 0xef, 0xf4, 0x5e, 0x20, 0xfe, 0x20, + 0x78, 0x8e, 0xff, 0x51, 0xff, 0xe8, 0xff, 0xe2, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1d, 0xff, 0x99, + 0xff, 0xd1, 0x0, 0x1, 0xdf, 0xf9, 0x0, 0x9f, + 0xfd, 0x10, 0x1d, 0xff, 0x90, 0x0, 0x9, 0xff, + 0xd1, 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x9f, 0xfb, + 0x5f, 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F078 "ï¸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0xbf, 0xf9, + 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x1d, 0xff, 0x90, + 0x0, 0x9, 0xff, 0xd1, 0x1, 0xdf, 0xf9, 0x0, + 0x9f, 0xfd, 0x10, 0x0, 0x1d, 0xff, 0x99, 0xff, + 0xd1, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x10, + 0xef, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x1d, 0xff, + 0xff, 0xd1, 0xaf, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x6b, 0x1f, 0xf1, 0xb6, 0x0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x6b, 0x1f, + 0xf1, 0xb6, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, + 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xfe, 0x1, 0xdf, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "ï»" */ + 0x8f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F093 "ï‚“" */ + 0x0, 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf0, 0xdf, 0xfd, 0xf, 0xff, 0xfd, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xea, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x4f, 0xff, 0x90, 0x0, 0x2, 0x8f, + 0xf3, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0xa, 0xff, + 0xff, 0xe4, 0xbf, 0xff, 0xd1, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x8, 0xee, 0x80, 0x0, 0x0, 0x6, 0x61, 0x8, + 0xff, 0xff, 0x80, 0x0, 0x2d, 0xff, 0xd0, 0xef, + 0x33, 0xfe, 0x0, 0x2e, 0xff, 0xf3, 0xe, 0xf3, + 0x3f, 0xe0, 0x2e, 0xff, 0xf3, 0x0, 0x8f, 0xff, + 0xff, 0x6e, 0xff, 0xf3, 0x0, 0x0, 0x8e, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x8, 0xff, 0xff, 0xf6, 0xef, + 0xff, 0x30, 0x0, 0xef, 0x33, 0xfe, 0x2, 0xef, + 0xff, 0x30, 0xe, 0xf3, 0x3f, 0xe0, 0x2, 0xef, + 0xff, 0x30, 0x8f, 0xff, 0xf8, 0x0, 0x2, 0xdf, + 0xfd, 0x0, 0x8e, 0xe8, 0x0, 0x0, 0x0, 0x66, + 0x10, + + /* U+F0C5 "" */ + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xd, 0x20, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xf, 0xe2, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf, 0xfd, 0xdf, 0xf0, 0xff, + 0xff, 0xff, 0x20, 0x0, 0xff, 0xf0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xdf, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xe2, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfc, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x11, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x11, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, + + /* U+F0C9 "" */ + 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, + + /* U+F0E0 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xd2, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2d, + 0xff, 0x62, 0xcf, 0xff, 0xff, 0xfc, 0x26, 0xff, + 0xff, 0xfa, 0x18, 0xff, 0xff, 0x81, 0xaf, 0xff, + 0xff, 0xff, 0xe3, 0x4d, 0xd4, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x81, 0x18, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F0E7 "" */ + 0x0, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x20, + 0xd, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xd7, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x99, 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, + 0x99, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xd, 0xff, 0xff, + 0xd, 0x20, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, + 0xe2, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, 0xfd, + 0xff, 0xff, 0xf, 0xff, 0xff, 0x20, 0x0, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xf, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfd, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1, + 0xbf, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, + + /* U+F11C "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0xf, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, + 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, 0xf8, + 0x8, 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, 0x0, + 0xff, 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x17, + 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "ï…›" */ + 0xdf, 0xff, 0xff, 0xf0, 0xd2, 0x0, 0xff, 0xff, + 0xff, 0xf0, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xe2, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xc9, 0x40, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x4, 0xdf, + 0xff, 0xfc, 0xa8, 0x8a, 0xcf, 0xff, 0xfd, 0x40, + 0x6f, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xf6, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfc, 0x1a, 0x30, 0x0, 0x5a, + 0xdf, 0xfd, 0xa5, 0x0, 0x3, 0xa1, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0xa8, 0x8a, 0xef, 0xff, + 0x50, 0x0, 0x0, 0x1, 0xdf, 0x70, 0x0, 0x0, + 0x7, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x12, 0x0, + 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F241 "ï‰" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F242 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F243 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F244 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb9, 0x29, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x10, 0x2, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0x80, 0xa, + 0x90, 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, 0xdf, + 0xff, 0x77, 0xf7, 0x55, 0x55, 0x55, 0x55, 0x8f, + 0xd3, 0xf, 0xff, 0xfd, 0xcc, 0xdf, 0xdc, 0xcc, + 0xcc, 0xcd, 0xff, 0xb0, 0x8f, 0xfe, 0x10, 0x0, + 0xaa, 0x0, 0x0, 0x0, 0x4d, 0x40, 0x0, 0x46, + 0x10, 0x0, 0x1, 0xf2, 0x2, 0x33, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xb1, 0xcf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, + 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x18, 0xdf, 0xfd, 0x92, 0x0, 0x2, 0xef, + 0xfb, 0xef, 0xff, 0x30, 0xd, 0xff, 0xfa, 0x2e, + 0xff, 0xe0, 0x4f, 0xff, 0xfa, 0x3, 0xff, 0xf5, + 0x9f, 0xfa, 0xfa, 0x35, 0x4f, 0xfa, 0xcf, 0xc0, + 0x8a, 0x3d, 0xb, 0xfd, 0xef, 0xfb, 0x3, 0x12, + 0x8f, 0xfe, 0xff, 0xff, 0xb0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x8, 0xff, 0xff, 0xef, 0xfd, + 0x11, 0x10, 0x9f, 0xff, 0xdf, 0xd1, 0x59, 0x3b, + 0xb, 0xfd, 0xaf, 0xd7, 0xfa, 0x38, 0x1d, 0xfb, + 0x5f, 0xff, 0xfa, 0x1, 0xdf, 0xf7, 0xd, 0xff, + 0xfa, 0x1d, 0xff, 0xf1, 0x3, 0xef, 0xfc, 0xdf, + 0xff, 0x50, 0x0, 0x18, 0xdf, 0xfe, 0xa3, 0x0, + + /* U+F2ED "ï‹­" */ + 0x0, 0x0, 0x7f, 0xff, 0xf7, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, 0x9f, + 0xf0, 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, + 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, + 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, + 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, + 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, 0x88, + 0xf8, 0x8f, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, + 0x9f, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x1d, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, + 0x1d, 0xff, 0x70, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xfa, 0x1d, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xde, 0xdb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1d, 0xff, 0xff, + 0xfa, 0xef, 0xfe, 0xaf, 0xff, 0xff, 0x1, 0xdf, + 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, 0xff, 0xff, + 0x1d, 0xff, 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x2, 0xef, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x2, 0xef, 0xff, 0xff, 0x1d, 0xff, + 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, 0xff, 0xff, + 0x1, 0xdf, 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, + 0xff, 0xff, 0x0, 0x1d, 0xff, 0xff, 0xfa, 0xef, + 0xfe, 0xaf, 0xff, 0xff, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + + /* U+F7C2 "" */ + 0x0, 0x8, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xfe, 0x8, 0xf8, 0xf, 0xb, + 0x40, 0xff, 0x8f, 0xf8, 0xf, 0xb, 0x40, 0xff, + 0xff, 0xf8, 0xf, 0xb, 0x40, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xe4, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xe0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, + 0xef, 0x10, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf1, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x11, 0xcf, 0xff, 0x77, 0x77, 0x77, + 0x77, 0xbf, 0xf1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x17, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x7, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+FB52 "ï­’" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + + /* U+FB53 "ï­“" */ + 0xbb, 0x0, 0x0, 0x0, 0x0, 0x9, 0xc0, 0xf, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xae, 0x0, 0xdb, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xf1, 0x5, 0xfe, + 0x97, 0x78, 0xad, 0xfe, 0x7f, 0xc6, 0x3, 0xae, + 0xff, 0xec, 0x95, 0x0, 0x4e, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x0, + + /* U+FB54 "ï­”" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x0, 0x0, 0x20, 0x0, 0x3e, 0x0, 0x0, + 0x20, + + /* U+FB55 "ï­•" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, + + /* U+FB56 "ï­–" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xa9, 0x90, 0x0, 0x0, 0x0, 0x0, 0x11, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + + /* U+FB57 "ï­—" */ + 0xbb, 0x0, 0x0, 0x0, 0x0, 0x9, 0xc0, 0xf, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xae, 0x0, 0xdb, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xf1, 0x5, 0xfe, + 0x97, 0x78, 0xad, 0xfe, 0x7f, 0xc6, 0x3, 0xae, + 0xff, 0xec, 0x95, 0x0, 0x4e, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x99, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x0, + + /* U+FB58 "ï­˜" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x3, + 0xf4, 0xe0, 0x2, 0x2, 0x0, 0x3e, 0x0, 0x0, + 0x20, + + /* U+FB59 "ï­™" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, + 0x0, 0x0, 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, + 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, + + /* U+FB5A "ï­š" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xa9, 0x90, 0x0, 0x0, 0x0, 0x0, 0x11, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xa9, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x11, 0x11, 0x0, 0x0, 0x0, + + /* U+FB5B "ï­›" */ + 0xbb, 0x0, 0x0, 0x0, 0x0, 0x9, 0xc0, 0xf, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xae, 0x0, 0xdb, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xf1, 0x5, 0xfe, + 0x97, 0x78, 0xad, 0xfe, 0x7f, 0xc6, 0x3, 0xae, + 0xff, 0xec, 0x95, 0x0, 0x4e, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x99, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x99, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x10, + 0x0, 0x0, 0x0, + + /* U+FB5C "ï­œ" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x3, + 0xf4, 0xe0, 0x2, 0x2, 0x3, 0xf4, 0xe0, 0x2, + 0x2, + + /* U+FB5D "ï­" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, + 0x0, 0x0, 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, + 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, + + /* U+FB5E "ï­ž" */ + 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0x90, 0x0, 0x0, 0x5, 0x70, 0x0, 0x11, 0x0, + 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, + 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, + 0xfe, 0xc9, 0x61, 0x0, + + /* U+FB5F "ï­Ÿ" */ + 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x5, 0x70, + 0x0, 0x11, 0x0, 0x0, 0x9c, 0x0, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xe0, 0xe, 0xa0, 0x0, + 0x0, 0x0, 0x2a, 0xff, 0x10, 0x7f, 0xd9, 0x77, + 0x8a, 0xdf, 0xf8, 0xfc, 0x60, 0x4a, 0xef, 0xfe, + 0xca, 0x51, 0x4, 0xed, + + /* U+FB60 "ï­ " */ + 0x0, 0x3e, 0x0, 0x0, 0x20, 0x0, 0x3e, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, + 0x6f, 0x0, 0x7, 0xf0, 0x18, 0xec, 0x2, 0xfc, + 0x20, + + /* U+FB61 "ï­¡" */ + 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, 0x0, 0x3e, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, 0x20, + 0x18, 0xef, 0xc7, 0x2f, 0xc8, 0xef, + + /* U+FB62 "ï­¢" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x99, 0x0, 0x0, 0x5, 0x70, 0x1, 0x11, 0x10, + 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, + 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, + 0xfe, 0xc9, 0x61, 0x0, + + /* U+FB63 "ï­£" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x5, 0x70, + 0x1, 0x11, 0x10, 0x0, 0x9c, 0x0, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xe0, 0xe, 0xa0, 0x0, + 0x0, 0x0, 0x2a, 0xff, 0x10, 0x7f, 0xd9, 0x77, + 0x8a, 0xdf, 0xf8, 0xfc, 0x60, 0x4a, 0xef, 0xfe, + 0xca, 0x51, 0x4, 0xed, + + /* U+FB64 "ï­¤" */ + 0x3, 0xf4, 0xe0, 0x2, 0x2, 0x3, 0xf4, 0xe0, + 0x2, 0x2, 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, + 0x6f, 0x0, 0x7, 0xf0, 0x18, 0xec, 0x2, 0xfc, + 0x20, + + /* U+FB65 "ï­¥" */ + 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, 0x3, 0xf4, + 0xe0, 0x0, 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, 0x20, + 0x18, 0xef, 0xc7, 0x2f, 0xc8, 0xef, + + /* U+FB66 "ï­¦" */ + 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, + 0x66, 0x0, 0x0, 0x0, 0x0, 0x5, 0xe7, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xbb, 0xa6, 0x0, 0x1, + 0x18, 0x90, 0x0, 0x0, 0x0, 0x0, 0x9c, 0xe7, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xce, 0xa0, 0x0, + 0x0, 0x0, 0x18, 0xf6, 0x6f, 0xd8, 0x66, 0x7a, + 0xcf, 0xf7, 0x0, 0x4a, 0xef, 0xfe, 0xc9, 0x61, + 0x0, + + /* U+FB67 "ï­§" */ + 0x0, 0x0, 0x57, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x75, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5d, 0x7e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xba, 0x60, 0x0, 0x12, 0x0, 0x89, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xc0, 0xe, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xbe, 0x0, 0xeb, 0x0, 0x0, + 0x0, 0x2, 0xbf, 0xf1, 0x6, 0xfe, 0x97, 0x78, + 0xad, 0xff, 0x7f, 0xc6, 0x3, 0xae, 0xff, 0xec, + 0x95, 0x0, 0x4e, 0xd0, + + /* U+FB68 "ï­¨" */ + 0x1, 0xb0, 0x0, 0x1, 0xb3, 0x60, 0x1, 0xe9, + 0xa5, 0x8, 0xec, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x6f, 0x0, + 0x0, 0x7f, 0x0, 0x18, 0xeb, 0x0, 0x2f, 0xc2, + 0x0, + + /* U+FB69 "ï­©" */ + 0x1, 0xb0, 0x0, 0x1, 0xb3, 0x60, 0x1, 0xe9, + 0xa5, 0x8, 0xec, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x6f, 0x10, + 0x0, 0x7f, 0x20, 0x18, 0xef, 0xc7, 0x2f, 0xc8, + 0xef, + + /* U+FB6A "ï­ª" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, 0x35, 0x8d, + 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, 0xff, 0xb6, + 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, 0x0, + 0x0, + + /* U+FB6B "ï­«" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xc2, 0x0, + 0x11, 0x0, 0x0, 0x0, 0xb, 0xf9, 0xee, 0x0, + 0xca, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x5f, 0x20, + 0xf8, 0x0, 0x0, 0x0, 0x9, 0xe1, 0x6f, 0x0, + 0xaf, 0x83, 0x22, 0x22, 0x35, 0xfd, 0xfd, 0x75, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xfb, + 0x0, 0x3, 0x44, 0x43, 0x32, 0x0, 0x0, 0x0, + + /* U+FB6C "ï­¬" */ + 0x0, 0x0, 0xa8, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, + 0x0, 0x1, 0x76, 0x0, 0x0, 0x2e, 0xff, 0xc0, + 0x0, 0x8f, 0x24, 0xf6, 0x0, 0x8f, 0x23, 0xf7, + 0x0, 0x1d, 0xff, 0xf6, 0x0, 0x0, 0x27, 0xf3, + 0x17, 0x77, 0xaf, 0xb0, 0x2f, 0xff, 0xe9, 0x10, + + /* U+FB6D "ï­­" */ + 0x0, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, 0x0, 0x8, 0xa8, 0x90, 0x0, 0x0, + 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x90, 0x0, 0x0, 0x3f, + 0xb9, 0xf4, 0x0, 0x0, 0x5f, 0x20, 0xf7, 0x0, + 0x0, 0x2f, 0x86, 0xf4, 0x0, 0x17, 0x7e, 0xff, + 0xf7, 0x71, 0x2f, 0xfe, 0xba, 0xef, 0xf4, + + /* U+FB6E "ï­®" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xf3, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, 0x35, 0x8d, + 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, 0xff, 0xb6, + 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, 0x0, + 0x0, + + /* U+FB6F "ï­¯" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xc2, 0x0, + 0x11, 0x0, 0x0, 0x0, 0xb, 0xf9, 0xee, 0x0, + 0xca, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x5f, 0x20, + 0xf8, 0x0, 0x0, 0x0, 0x9, 0xe1, 0x6f, 0x0, + 0xaf, 0x83, 0x22, 0x22, 0x35, 0xfd, 0xfd, 0x75, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xfb, + 0x0, 0x3, 0x44, 0x43, 0x32, 0x0, 0x0, 0x0, + + /* U+FB70 "ï­°" */ + 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, + 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, + 0x0, 0x1, 0x76, 0x0, 0x0, 0x2e, 0xff, 0xc0, + 0x0, 0x8f, 0x24, 0xf6, 0x0, 0x8f, 0x23, 0xf7, + 0x0, 0x1d, 0xff, 0xf6, 0x0, 0x0, 0x27, 0xf3, + 0x17, 0x77, 0xaf, 0xb0, 0x2f, 0xff, 0xe9, 0x10, + + /* U+FB71 "ï­±" */ + 0x0, 0x8, 0xa8, 0x90, 0x0, 0x0, 0x1, 0x11, + 0x10, 0x0, 0x0, 0x8, 0xa8, 0x90, 0x0, 0x0, + 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x90, 0x0, 0x0, 0x3f, + 0xb9, 0xf4, 0x0, 0x0, 0x5f, 0x20, 0xf7, 0x0, + 0x0, 0x2f, 0x86, 0xf4, 0x0, 0x17, 0x7e, 0xff, + 0xf7, 0x71, 0x2f, 0xfe, 0xba, 0xef, 0xf4, + + /* U+FB72 "ï­²" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0xe, 0x30, 0x0, 0x6f, 0x0, + 0x2, 0x0, 0x0, 0x5f, 0x10, 0xf, 0x30, 0x0, + 0x1f, 0x80, 0x2, 0x0, 0x0, 0x8, 0xf9, 0x31, + 0x13, 0x83, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FB73 "ï­³" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x98, 0x5b, 0xff, 0xe7, 0x0, 0x0, + 0xbf, 0x88, 0xd0, 0x0, 0x7, 0xf4, 0x1, 0xf3, + 0x0, 0xf, 0x90, 0x0, 0xac, 0x0, 0x4f, 0x20, + 0xb7, 0x1e, 0xc3, 0x6f, 0x0, 0x11, 0x3, 0xd7, + 0x5f, 0x20, 0xb7, 0x0, 0x0, 0x1f, 0x90, 0x21, + 0x0, 0x0, 0x7, 0xfa, 0x31, 0x14, 0xa4, 0x0, + 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, + 0x0, + + /* U+FB74 "ï­´" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0xb7, 0x20, 0x0, 0x45, 0x79, 0xdf, 0xf9, 0x0, + 0x0, 0x0, 0x2c, 0xfa, 0x0, 0x0, 0x2, 0xef, + 0x60, 0x0, 0x0, 0x3e, 0xd2, 0x0, 0x17, 0x8b, + 0xfc, 0x10, 0x0, 0x2f, 0xeb, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, + + /* U+FB75 "ï­µ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x79, 0xcf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xd0, 0x0, 0x0, 0x0, + 0x3e, 0xe9, 0xf5, 0x0, 0x17, 0x8b, 0xfd, 0x20, + 0xcf, 0x83, 0x2f, 0xeb, 0x60, 0x0, 0x1a, 0xf7, + 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+FB76 "ï­¶" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x98, 0x5b, 0xfe, 0xb6, 0x0, 0x0, + 0xbf, 0x70, 0x0, 0x0, 0x7, 0xf4, 0x0, 0x0, + 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x4f, 0x20, + 0x20, 0x20, 0x0, 0x6f, 0x0, 0xe4, 0xf3, 0x0, + 0x5f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, + 0x0, 0x0, 0x7, 0xfa, 0x41, 0x14, 0xa4, 0x0, + 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, + 0x0, + + /* U+FB77 "ï­·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x97, 0x5b, 0xff, 0xe6, 0x0, 0x0, + 0xce, 0x67, 0xe0, 0x0, 0xa, 0xe2, 0x1, 0xf4, + 0x0, 0x2f, 0x60, 0x0, 0x9d, 0x10, 0x5f, 0x12, + 0x12, 0x2e, 0xe5, 0x6f, 0x1b, 0x7c, 0x63, 0xd7, + 0x2f, 0x70, 0x0, 0x0, 0x0, 0x9, 0xf9, 0x31, + 0x13, 0x83, 0x0, 0x7d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FB78 "ï­¸" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0xb7, 0x20, 0x0, 0x45, 0x79, 0xdf, 0xf9, 0x0, + 0x0, 0x0, 0x2c, 0xfa, 0x0, 0x0, 0x2, 0xef, + 0x60, 0x0, 0x0, 0x3e, 0xd2, 0x0, 0x17, 0x8b, + 0xfc, 0x10, 0x0, 0x2f, 0xeb, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x20, + 0x20, 0x0, + + /* U+FB79 "ï­¹" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x79, 0xcf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xd0, 0x0, 0x0, 0x0, + 0x3e, 0xe9, 0xf5, 0x0, 0x17, 0x8b, 0xfd, 0x20, + 0xcf, 0x83, 0x2f, 0xeb, 0x60, 0x0, 0x1a, 0xf7, + 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x20, 0x0, 0x0, + + /* U+FB7A "ï­º" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0xd5, 0xd4, 0x0, 0x6f, 0x0, + 0x20, 0x20, 0x0, 0x5f, 0x10, 0xd, 0x50, 0x0, + 0x1f, 0x80, 0x2, 0x0, 0x0, 0x8, 0xf9, 0x31, + 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FB7B "ï­»" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0xa8, 0x6b, 0xff, 0xe7, 0x0, 0x0, + 0xcf, 0x89, 0xd0, 0x0, 0xa, 0xf3, 0x1, 0xf3, + 0x0, 0x2f, 0x60, 0x0, 0xaa, 0x0, 0x5f, 0x12, + 0x12, 0x2f, 0x71, 0x6f, 0x1c, 0x6d, 0x53, 0xd7, + 0x2f, 0x70, 0xd5, 0x0, 0x0, 0x9, 0xf9, 0x52, + 0x13, 0x73, 0x0, 0x7d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FB7C "ï­¼" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0xb7, 0x20, 0x0, 0x45, 0x79, 0xdf, 0xf9, 0x0, + 0x0, 0x0, 0x2c, 0xfa, 0x0, 0x0, 0x2, 0xef, + 0x60, 0x0, 0x0, 0x3e, 0xd2, 0x0, 0x17, 0x8b, + 0xfc, 0x10, 0x0, 0x2f, 0xeb, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x20, + 0x20, 0x0, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, + + /* U+FB7D "ï­½" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x79, 0xcf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xd0, 0x0, 0x0, 0x0, + 0x3e, 0xe9, 0xf5, 0x0, 0x17, 0x8b, 0xfd, 0x20, + 0xcf, 0x83, 0x2f, 0xeb, 0x60, 0x0, 0x1a, 0xf7, + 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0xe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+FB7E "ï­¾" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0xd5, 0xd4, 0x0, 0x6f, 0x0, + 0x20, 0x20, 0x0, 0x5f, 0x10, 0xd5, 0xe4, 0x0, + 0x1f, 0x80, 0x21, 0x20, 0x0, 0x8, 0xf9, 0x31, + 0x13, 0x83, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FB7F "ï­¿" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0xa8, 0x6b, 0xff, 0xe7, 0x0, 0x0, + 0xcf, 0x89, 0xd0, 0x0, 0xa, 0xf3, 0x1, 0xf3, + 0x0, 0x2f, 0x60, 0x0, 0xaa, 0x0, 0x5f, 0x12, + 0x12, 0x2f, 0x71, 0x6f, 0x1c, 0x6d, 0x53, 0xd7, + 0x2f, 0x7c, 0x6d, 0x50, 0x0, 0x9, 0xfb, 0x43, + 0x23, 0x73, 0x0, 0x7d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FB80 "ﮀ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0xb7, 0x20, 0x0, 0x45, 0x79, 0xdf, 0xf9, 0x0, + 0x0, 0x0, 0x2c, 0xfa, 0x0, 0x0, 0x2, 0xef, + 0x60, 0x0, 0x0, 0x3e, 0xd2, 0x0, 0x17, 0x8b, + 0xfc, 0x10, 0x0, 0x2f, 0xeb, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x20, + 0x20, 0x0, 0x0, 0x0, 0xd4, 0xe3, 0x0, 0x0, + 0x0, 0x20, 0x20, 0x0, + + /* U+FB81 "ï®" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x79, 0xcf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xd0, 0x0, 0x0, 0x0, + 0x3e, 0xe9, 0xf5, 0x0, 0x17, 0x8b, 0xfd, 0x20, + 0xcf, 0x83, 0x2f, 0xeb, 0x60, 0x0, 0x1a, 0xf7, + 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0xd4, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, 0x0, 0x0, + + /* U+FB82 "ﮂ" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, + 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, + 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xfe, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa8, 0xb7, 0x0, + 0x1, 0x11, 0x10, + + /* U+FB83 "ﮃ" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0x60, + 0x0, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x0, 0x5, + 0xf2, 0x0, 0x0, 0x0, 0x7f, 0x60, 0x0, 0x66, + 0xaf, 0xef, 0x83, 0xf, 0xfe, 0x80, 0xaf, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa8, 0xb7, 0x0, + 0x0, 0x1, 0x11, 0x10, 0x0, + + /* U+FB84 "ﮄ" */ + 0x0, 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, + 0x13, 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, + 0xf8, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, + 0x20, 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, + 0xdf, 0xe8, 0x0, + + /* U+FB85 "ï®…" */ + 0x0, 0xf3, 0xf1, 0x0, 0x0, 0x2, 0x2, 0x0, + 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x1, 0xdb, + 0x0, 0x0, 0x0, 0x2, 0xf6, 0x0, 0x0, 0x0, + 0x9, 0xe0, 0x0, 0x0, 0x0, 0x4f, 0x20, 0x0, + 0x0, 0x8, 0xf6, 0x0, 0x6, 0x6a, 0xfe, 0xf8, + 0x30, 0xff, 0xe8, 0xa, 0xf9, + + /* U+FB86 "ﮆ" */ + 0x0, 0xf, 0x10, 0x0, 0x0, 0x20, 0x0, 0x0, + 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, 0x13, + 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, 0xf8, + 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, 0x20, + 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, 0xdf, + 0xe8, 0x0, + + /* U+FB87 "ﮇ" */ + 0x0, 0xf, 0x10, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x0, 0xf3, 0xf1, 0x0, 0x0, 0x2, 0x2, + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x1, + 0xdb, 0x0, 0x0, 0x0, 0x2, 0xf6, 0x0, 0x0, + 0x0, 0x9, 0xe0, 0x0, 0x0, 0x0, 0x4f, 0x20, + 0x0, 0x0, 0x8, 0xf6, 0x0, 0x6, 0x6a, 0xfe, + 0xf8, 0x30, 0xff, 0xe8, 0xa, 0xf9, + + /* U+FB88 "ﮈ" */ + 0x0, 0xc0, 0x0, 0x0, 0xc, 0x26, 0x10, 0x0, + 0xda, 0x98, 0x0, 0x6e, 0xcc, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xb7, 0x0, 0x0, 0x5, 0xf5, + 0x0, 0x0, 0xa, 0xd0, 0x0, 0x0, 0x5f, 0x20, + 0x0, 0x7, 0xf1, 0x9, 0x6a, 0xfc, 0x0, 0xdf, + 0xe9, 0x10, + + /* U+FB89 "ﮉ" */ + 0x0, 0xc0, 0x0, 0x0, 0x0, 0xc, 0x26, 0x10, + 0x0, 0x0, 0xda, 0x98, 0x0, 0x0, 0x6e, 0xcc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xb5, 0x0, 0x0, 0x0, 0x5, 0xf3, 0x0, 0x0, + 0x0, 0xa, 0xc0, 0x0, 0x0, 0x0, 0x5f, 0x10, + 0x0, 0x0, 0x7, 0xf6, 0x0, 0x6, 0x6a, 0xfe, + 0xf8, 0x30, 0xff, 0xe8, 0xa, 0xf9, + + /* U+FB8A "ﮊ" */ + 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, + 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x70, 0x0, 0x0, 0x0, 0xbb, 0x0, + 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, 0xda, + 0x0, 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, 0x4f, + 0xd0, 0x1, 0x46, 0xcf, 0xd2, 0x0, 0xaf, 0xfc, + 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, + + /* U+FB8B "ﮋ" */ + 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, + 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, + 0x0, 0xbd, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xa7, + 0x0, 0x0, 0x0, 0xdd, 0xef, 0x0, 0x0, 0x5, + 0xf3, 0x0, 0x0, 0x0, 0x4f, 0xb0, 0x0, 0x13, + 0x6b, 0xfb, 0x0, 0x0, 0xaf, 0xfb, 0x50, 0x0, + 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, + + /* U+FB8C "ﮌ" */ + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0xc0, + 0x0, 0x0, 0x0, 0xc, 0x27, 0x10, 0x0, 0x0, + 0xda, 0x97, 0x0, 0x0, 0x7e, 0xcb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x70, 0x0, 0x0, 0x0, 0xbb, + 0x0, 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, + 0xd9, 0x0, 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, + 0x4f, 0xd0, 0x1, 0x46, 0xcf, 0xd1, 0x0, 0xaf, + 0xfc, 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, + + /* U+FB8D "ï®" */ + 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x38, 0x10, 0x0, + 0x0, 0xe, 0xa9, 0x70, 0x0, 0x0, 0x7e, 0xcb, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0xbd, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xa7, 0x0, 0x0, 0x0, 0xdd, 0xef, 0x0, + 0x0, 0x5, 0xf3, 0x0, 0x0, 0x0, 0x5f, 0xb0, + 0x0, 0x13, 0x6b, 0xfb, 0x0, 0x0, 0xaf, 0xfb, + 0x50, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, + + /* U+FB8E "ﮎ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x7d, 0xf4, 0x0, 0x0, + 0x0, 0x2, 0x9f, 0xf9, 0x20, 0x0, 0x0, 0x0, + 0x3f, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x20, 0x0, + 0x79, 0x0, 0x0, 0x0, 0x1e, 0xb0, 0x0, 0xe8, + 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, + 0x0, 0x0, 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, + 0x49, 0xef, 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, + 0x92, 0x0, 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, + 0x0, 0x0, + + /* U+FB8F "ï®" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0xfd, 0x60, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xa3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xc0, 0x0, 0x0, 0x46, 0x0, 0x0, 0x0, + 0x1e, 0xa0, 0x0, 0xe, 0x80, 0x0, 0x0, 0x0, + 0x7f, 0x60, 0x0, 0xe8, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x30, 0x9, 0xf9, 0x31, 0x24, 0x8e, 0xfa, + 0xde, 0x84, 0x8, 0xef, 0xff, 0xfe, 0xa4, 0x1, + 0xbf, 0xb0, 0x0, 0x24, 0x32, 0x0, 0x0, 0x0, + 0x0, + + /* U+FB90 "ï®" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xb9, 0x0, 0x1, 0x7d, 0xfc, 0x40, 0x8, 0xff, + 0x93, 0x0, 0x3, 0xf9, 0x10, 0x0, 0x0, 0x3f, + 0x60, 0x0, 0x0, 0x0, 0xaf, 0x30, 0x0, 0x0, + 0x0, 0xce, 0x10, 0x0, 0x0, 0x1, 0xec, 0x0, + 0x0, 0x0, 0x5, 0xf4, 0x0, 0x0, 0x0, 0x3f, + 0x50, 0x1, 0x77, 0x7d, 0xf1, 0x0, 0x2f, 0xff, + 0xd4, 0x0, 0x0, + + /* U+FB91 "ﮑ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0x90, 0x0, 0x1, 0x7d, 0xfc, 0x40, 0x0, + 0x8f, 0xf9, 0x30, 0x0, 0x3, 0xf9, 0x10, 0x0, + 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x30, 0x0, 0x0, 0x0, 0xc, 0xe1, 0x0, 0x0, + 0x0, 0x1, 0xec, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x17, + 0x77, 0xdf, 0xaf, 0x97, 0x2f, 0xff, 0xd4, 0x8, + 0xef, + + /* U+FB92 "ï®’" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x73, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xb2, 0x0, 0x0, + 0x0, 0x6, 0xde, 0x81, 0x42, 0x0, 0x0, 0x0, + 0x6b, 0x51, 0x7d, 0xf4, 0x0, 0x0, 0x0, 0x2, + 0x9f, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x3f, 0xd6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0x20, 0x0, 0x79, 0x0, + 0x0, 0x0, 0x1e, 0xb0, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, + 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xef, + 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x92, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + + /* U+FB93 "ﮓ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xde, 0x30, 0x0, + 0x0, 0x0, 0x3, 0x9f, 0xb5, 0x11, 0x0, 0x0, + 0x0, 0x6, 0xe8, 0x23, 0xaf, 0x50, 0x0, 0x0, + 0x0, 0x11, 0x6d, 0xfd, 0x60, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xc0, 0x0, 0x0, 0x46, 0x0, 0x0, 0x0, 0x1e, + 0xa0, 0x0, 0xe, 0x80, 0x0, 0x0, 0x0, 0x7f, + 0x60, 0x0, 0xe8, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x30, 0x9, 0xf9, 0x31, 0x24, 0x8e, 0xfa, 0xde, + 0x84, 0x8, 0xef, 0xff, 0xfe, 0xa4, 0x1, 0xbf, + 0xb0, 0x0, 0x24, 0x32, 0x0, 0x0, 0x0, 0x0, + + /* U+FB94 "ï®”" */ + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x17, + 0xd9, 0x0, 0x3, 0xaf, 0xb4, 0x0, 0x1d, 0xe8, + 0x14, 0xb9, 0x1, 0x51, 0x7d, 0xfc, 0x40, 0x8, + 0xff, 0x93, 0x0, 0x3, 0xf9, 0x10, 0x0, 0x0, + 0x3f, 0x60, 0x0, 0x0, 0x0, 0xaf, 0x30, 0x0, + 0x0, 0x0, 0xce, 0x10, 0x0, 0x0, 0x1, 0xec, + 0x0, 0x0, 0x0, 0x5, 0xf4, 0x0, 0x0, 0x0, + 0x3f, 0x50, 0x1, 0x77, 0x7d, 0xf1, 0x0, 0x2f, + 0xff, 0xd4, 0x0, 0x0, + + /* U+FB95 "ﮕ" */ + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x1, + 0x7d, 0x90, 0x0, 0x3, 0xaf, 0xb4, 0x0, 0x1, + 0xde, 0x81, 0x4b, 0x90, 0x1, 0x51, 0x7d, 0xfc, + 0x40, 0x0, 0x8f, 0xf9, 0x30, 0x0, 0x3, 0xf9, + 0x10, 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0x30, 0x0, 0x0, 0x0, 0xc, 0xe1, + 0x0, 0x0, 0x0, 0x1, 0xec, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xf7, + 0x0, 0x17, 0x77, 0xdf, 0xaf, 0x97, 0x2f, 0xff, + 0xd4, 0x8, 0xef, + + /* U+FB96 "ï®–" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xcf, 0x91, 0x0, 0x0, + 0x0, 0x18, 0xed, 0x61, 0x63, 0x0, 0x0, 0x0, + 0x6a, 0x32, 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, + 0xbf, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x20, 0x0, 0x8a, 0x0, + 0x0, 0x0, 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, + 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xef, + 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x82, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x0, + + /* U+FB97 "ï®—" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xde, 0x30, 0x0, + 0x0, 0x0, 0x3, 0x9f, 0xb5, 0x11, 0x0, 0x0, + 0x0, 0x6, 0xe8, 0x23, 0xaf, 0x50, 0x0, 0x0, + 0x0, 0x11, 0x6d, 0xfd, 0x60, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xc0, 0x0, 0x0, 0x46, 0x0, 0x0, 0x0, 0x1e, + 0xa0, 0x0, 0xe, 0x80, 0x0, 0x0, 0x0, 0x7f, + 0x60, 0x0, 0xe8, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x30, 0x9, 0xf9, 0x31, 0x24, 0x8e, 0xfa, 0xde, + 0x84, 0x8, 0xef, 0xff, 0xfe, 0xa4, 0x1, 0xbf, + 0xb0, 0x0, 0x24, 0x32, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+FB98 "ﮘ" */ + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x17, + 0xd9, 0x0, 0x3, 0xaf, 0xb4, 0x0, 0x1d, 0xe8, + 0x14, 0xb9, 0x1, 0x51, 0x7d, 0xfc, 0x40, 0x8, + 0xff, 0x93, 0x0, 0x3, 0xf9, 0x10, 0x0, 0x0, + 0x3f, 0x60, 0x0, 0x0, 0x0, 0xaf, 0x30, 0x0, + 0x0, 0x0, 0xce, 0x10, 0x0, 0x0, 0x1, 0xec, + 0x0, 0x0, 0x0, 0x5, 0xf4, 0x0, 0x0, 0x0, + 0x3f, 0x50, 0x1, 0x77, 0x7d, 0xf1, 0x0, 0x2f, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, + + /* U+FB99 "ï®™" */ + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x1, + 0x7d, 0x90, 0x0, 0x3, 0xaf, 0xb4, 0x0, 0x1, + 0xde, 0x81, 0x4b, 0x90, 0x1, 0x51, 0x7d, 0xfc, + 0x40, 0x0, 0x8f, 0xf9, 0x30, 0x0, 0x3, 0xf9, + 0x10, 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0x30, 0x0, 0x0, 0x0, 0xc, 0xe1, + 0x0, 0x0, 0x0, 0x1, 0xec, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xf7, + 0x0, 0x17, 0x77, 0xdf, 0xaf, 0x97, 0x2f, 0xff, + 0xd4, 0x8, 0xef, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, + 0x1, 0x10, 0x0, 0x0, + + /* U+FB9A "ﮚ" */ + 0x0, 0x0, 0x0, 0xf3, 0xf2, 0x2, 0x84, 0x0, + 0x0, 0x0, 0x20, 0x25, 0xbf, 0xa1, 0x0, 0x0, + 0x0, 0x17, 0xdd, 0x71, 0x53, 0x0, 0x0, 0x0, + 0x6b, 0x41, 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0xe8, 0x20, 0x0, 0x0, 0x0, 0x4f, 0xd6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x20, 0x0, 0x78, 0x0, + 0x0, 0x0, 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, + 0x1b, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xff, + 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x92, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + + /* U+FB9B "ï®›" */ + 0x0, 0x0, 0x0, 0xf3, 0xf2, 0x2, 0x84, 0x0, + 0x0, 0x0, 0x2, 0x3, 0x6b, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x18, 0xec, 0x61, 0x63, 0x0, 0x0, + 0x0, 0x5, 0x93, 0x4a, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xc6, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xe9, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x3, + 0xf6, 0x0, 0x0, 0xca, 0x0, 0x0, 0x0, 0x8, + 0xf4, 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0xaf, + 0xf3, 0x0, 0xaf, 0x83, 0x12, 0x48, 0xef, 0xad, + 0xe8, 0x40, 0x9f, 0xff, 0xff, 0xfa, 0x40, 0x1b, + 0xfb, 0x0, 0x2, 0x43, 0x20, 0x0, 0x0, 0x0, + 0x0, + + /* U+FB9C "ﮜ" */ + 0x6, 0xc7, 0xb0, 0x16, 0x70, 0x12, 0x15, 0xaf, + 0xb4, 0x0, 0x6d, 0xe8, 0x24, 0x60, 0x1b, 0x42, + 0x8e, 0xf7, 0x0, 0x3b, 0xfe, 0x81, 0x0, 0x1f, + 0xc5, 0x0, 0x0, 0x4, 0xf5, 0x0, 0x0, 0x0, + 0xc, 0xe1, 0x0, 0x0, 0x0, 0x1e, 0xd0, 0x0, + 0x0, 0x0, 0x2f, 0xa0, 0x0, 0x0, 0x0, 0x5f, + 0x30, 0x0, 0x0, 0x2, 0xf5, 0x0, 0x17, 0x77, + 0xdf, 0x10, 0x2, 0xff, 0xfd, 0x40, 0x0, + + /* U+FB9D "ï®" */ + 0x6, 0xc7, 0xb0, 0x16, 0x70, 0x1, 0x21, 0x5a, + 0xfb, 0x40, 0x0, 0x6d, 0xe8, 0x24, 0x60, 0x1, + 0xb4, 0x28, 0xef, 0x70, 0x0, 0x3b, 0xfe, 0x81, + 0x0, 0x1, 0xfc, 0x50, 0x0, 0x0, 0x4, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0xce, 0x10, 0x0, 0x0, + 0x0, 0x1e, 0xd0, 0x0, 0x0, 0x0, 0x2, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0x90, 0x0, 0x0, + 0x0, 0x2f, 0xf7, 0x0, 0x17, 0x77, 0xdf, 0xaf, + 0x97, 0x2f, 0xff, 0xd4, 0x8, 0xef, + + /* U+FB9E "ﮞ" */ + 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, + 0x7, 0xf1, 0x12, 0x0, 0x0, 0x1, 0xf5, 0xbc, + 0x0, 0x0, 0x0, 0xf7, 0xda, 0x0, 0x0, 0x0, + 0xf8, 0xd9, 0x0, 0x0, 0x2, 0xf5, 0xac, 0x0, + 0x0, 0xa, 0xf0, 0x4f, 0xa4, 0x24, 0xaf, 0x60, + 0x5, 0xef, 0xff, 0xe6, 0x0, 0x0, 0x3, 0x42, + 0x0, 0x0, + + /* U+FB9F "ﮟ" */ + 0x0, 0x0, 0x0, 0x4, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xf2, 0x0, 0x47, 0x0, 0x0, 0x0, + 0xf9, 0x0, 0xbb, 0x0, 0x0, 0x0, 0xef, 0x82, + 0xc9, 0x0, 0x0, 0x0, 0xfe, 0xf5, 0xc9, 0x0, + 0x0, 0x3, 0xf5, 0x0, 0xad, 0x0, 0x0, 0xa, + 0xe0, 0x0, 0x3f, 0xa4, 0x24, 0xaf, 0x40, 0x0, + 0x4, 0xef, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x3, + 0x42, 0x0, 0x0, 0x0, + + /* U+FBA0 "ï® " */ + 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x38, 0x20, 0x0, 0x0, + 0xd, 0xb8, 0x80, 0x0, 0x0, 0x5d, 0xcc, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x0, 0x3, 0xf4, 0x7a, 0x0, 0x0, 0x0, 0xf7, + 0xca, 0x0, 0x0, 0x0, 0xe8, 0xd9, 0x0, 0x0, + 0x1, 0xf6, 0xbc, 0x0, 0x0, 0x9, 0xf1, 0x5f, + 0xa4, 0x24, 0xaf, 0x80, 0x6, 0xef, 0xff, 0xe6, + 0x0, 0x0, 0x3, 0x42, 0x0, 0x0, + + /* U+FBA1 "ﮡ" */ + 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x16, 0x10, 0x0, 0x0, 0x0, 0xd, 0xa8, 0x80, + 0x0, 0x0, 0x0, 0x5d, 0xcc, 0x33, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xf1, 0x0, 0x35, 0x0, + 0x0, 0x1, 0xf8, 0x0, 0xac, 0x0, 0x0, 0x0, + 0xef, 0x82, 0xca, 0x0, 0x0, 0x0, 0xfe, 0xf5, + 0xc9, 0x0, 0x0, 0x2, 0xf5, 0x0, 0xad, 0x0, + 0x0, 0xa, 0xe0, 0x0, 0x3f, 0xa4, 0x24, 0xaf, + 0x40, 0x0, 0x5, 0xef, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x3, 0x42, 0x0, 0x0, 0x0, + + /* U+FBA2 "ﮢ" */ + 0x1, 0xb0, 0x0, 0x1, 0xb3, 0x60, 0x1, 0xe9, + 0xa5, 0x8, 0xec, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x6f, 0x0, + 0x0, 0x7f, 0x0, 0x18, 0xeb, 0x0, 0x2f, 0xc2, + 0x0, + + /* U+FBA3 "ﮣ" */ + 0x1, 0xb0, 0x0, 0x1, 0xb3, 0x60, 0x1, 0xe9, + 0xa5, 0x8, 0xec, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x6f, 0x10, + 0x0, 0x7f, 0x20, 0x18, 0xef, 0xc7, 0x2f, 0xc8, + 0xef, + + /* U+FBAA "ﮪ" */ + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0xd, 0xc3, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x70, 0x0, 0x0, + 0xe, 0xbc, 0xf9, 0x0, 0x0, 0x2f, 0x34, 0xff, + 0x60, 0x0, 0xf, 0x57, 0xe7, 0xe0, 0xda, 0xb, + 0xde, 0x92, 0xf2, 0xce, 0x8b, 0xff, 0x99, 0xf1, + 0x2a, 0xfe, 0x8a, 0xee, 0x70, + + /* U+FBAB "ﮫ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xe3, 0x0, 0x0, 0x6, 0xf7, 0xbb, 0x0, 0x0, + 0xd, 0xb0, 0x9c, 0x0, 0xc9, 0xf, 0x75, 0xf8, + 0x0, 0xce, 0x8f, 0xcf, 0xf8, 0x71, 0x2b, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0xf, 0x74, 0xd4, 0x0, + 0x0, 0xb, 0xe3, 0xad, 0x0, 0x0, 0x1, 0xcf, + 0xf7, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, + + /* U+FBAC "ﮬ" */ + 0x0, 0x20, 0x0, 0x0, 0x0, 0x9, 0xe6, 0x0, + 0x0, 0x0, 0x2e, 0xfb, 0x0, 0x0, 0xa, 0xda, + 0xfc, 0x0, 0x0, 0xe7, 0xf, 0xfa, 0x0, 0xd, + 0xa4, 0xf7, 0xf3, 0x0, 0x9f, 0xee, 0xe, 0x71, + 0x7a, 0xff, 0xa5, 0xe6, 0x2f, 0xea, 0xae, 0xfa, + 0x0, + + /* U+FBAD "ï®­" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xf8, + 0x0, 0x0, 0x3f, 0x98, 0xf1, 0x0, 0x9, 0xd0, + 0x9e, 0x0, 0x17, 0xdd, 0xbf, 0x97, 0x32, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xbb, 0x6f, 0x60, 0x0, + 0x9, 0xe0, 0x7f, 0x0, 0x0, 0x3f, 0x77, 0xf0, + 0x0, 0x0, 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x12, + 0x0, 0x0, + + /* U+FBD3 "ﯓ" */ + 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x1, 0xf3, 0xf0, 0xe, + 0x90, 0x0, 0x2, 0x2, 0x0, 0xe9, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x90, 0x0, 0x2, 0x96, 0x0, + 0xe9, 0x0, 0x0, 0x76, 0x0, 0xe, 0x90, 0x0, + 0x0, 0x58, 0x0, 0xe9, 0x0, 0x2, 0xab, 0x20, + 0xe, 0x90, 0x0, 0x0, 0x0, 0x0, 0xe8, 0x54, + 0x0, 0x0, 0x0, 0xf, 0x7d, 0xa0, 0x0, 0x0, + 0x9, 0xf3, 0x8f, 0xb7, 0x55, 0x8e, 0xf8, 0x0, + 0x5c, 0xef, 0xfe, 0xb4, 0x0, + + /* U+FBD4 "ﯔ" */ + 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, 0xf3, + 0xf0, 0xe, 0x90, 0x0, 0x0, 0x2, 0x2, 0x0, + 0xe9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x90, + 0x0, 0x0, 0x2, 0x96, 0x0, 0xe9, 0x0, 0x0, + 0x0, 0x76, 0x0, 0xe, 0x90, 0x0, 0x0, 0x0, + 0x58, 0x0, 0xe9, 0x0, 0x0, 0x2, 0xab, 0x20, + 0xe, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe9, + 0x0, 0x22, 0x0, 0x0, 0x0, 0xf, 0x90, 0xd, + 0xa0, 0x0, 0x0, 0x9, 0xfa, 0x0, 0x9f, 0xb7, + 0x55, 0x8e, 0xfd, 0xf8, 0x40, 0x6c, 0xff, 0xfe, + 0xa4, 0x9, 0xfa, + + /* U+FBD5 "ﯕ" */ + 0x0, 0x6b, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, + 0x0, 0x6, 0xc7, 0xb0, 0x0, 0x10, 0x12, 0x11, + 0x5, 0xca, 0x0, 0x1, 0x8e, 0xfa, 0x30, 0x9, + 0xfe, 0x81, 0x0, 0x3, 0xf8, 0x0, 0x0, 0x0, + 0x3f, 0x70, 0x0, 0x0, 0x0, 0x9f, 0x40, 0x0, + 0x0, 0x0, 0xce, 0x20, 0x0, 0x0, 0x1, 0xec, + 0x0, 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x0, + 0x3f, 0x50, 0x1, 0x77, 0x7d, 0xf1, 0x0, 0x2f, + 0xff, 0xd4, 0x0, 0x0, + + /* U+FBD6 "ﯖ" */ + 0x0, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, + 0x0, 0x0, 0x6, 0xc7, 0xb0, 0x0, 0x10, 0x1, + 0x21, 0x10, 0x5c, 0xa0, 0x0, 0x1, 0x8e, 0xfa, + 0x30, 0x0, 0x9f, 0xe8, 0x10, 0x0, 0x3, 0xf8, + 0x0, 0x0, 0x0, 0x3, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x30, 0x0, 0x0, 0x0, 0xc, 0xe1, + 0x0, 0x0, 0x0, 0x1, 0xed, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xf7, + 0x0, 0x17, 0x77, 0xdf, 0xaf, 0x97, 0x2f, 0xff, + 0xd4, 0x8, 0xef, + + /* U+FBD7 "ﯗ" */ + 0x0, 0x2, 0xda, 0x0, 0x0, 0x6, 0x9d, 0x10, + 0x0, 0x1, 0xcf, 0x70, 0x0, 0x5, 0xc2, 0x0, + 0x0, 0xd8, 0x10, 0x0, 0x0, 0x8, 0xed, 0x40, + 0x0, 0x6f, 0xac, 0xf1, 0x0, 0x9e, 0x1, 0xf6, + 0x0, 0x6f, 0xa6, 0xf7, 0x0, 0x8, 0xdf, 0xf7, + 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x2e, 0xe0, + 0x12, 0x48, 0xef, 0x30, 0xaf, 0xff, 0xa2, 0x0, + 0x34, 0x20, 0x0, 0x0, + + /* U+FBD8 "ﯘ" */ + 0x0, 0x2, 0xda, 0x0, 0x0, 0x0, 0x6, 0x9d, + 0x10, 0x0, 0x0, 0x1, 0xcf, 0x70, 0x0, 0x0, + 0x5, 0xc2, 0x0, 0x0, 0x0, 0xd8, 0x10, 0x0, + 0x0, 0x0, 0x8, 0xed, 0x40, 0x0, 0x0, 0x6f, + 0xac, 0xf1, 0x0, 0x0, 0xae, 0x1, 0xf6, 0x0, + 0x0, 0x6f, 0xa7, 0xfb, 0x73, 0x0, 0x8, 0xef, + 0xff, 0xf6, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x2e, 0xc0, 0x0, 0x12, 0x48, 0xee, 0x20, + 0x0, 0xaf, 0xff, 0xa1, 0x0, 0x0, 0x34, 0x20, + 0x0, 0x0, 0x0, + + /* U+FBD9 "ﯙ" */ + 0x0, 0xd, 0x36, 0xb0, 0x0, 0x4, 0xde, 0x20, + 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+FBDA "ﯚ" */ + 0x0, 0xd, 0x36, 0xb0, 0x0, 0x0, 0x4, 0xde, + 0x20, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xee, 0x40, + 0x0, 0x0, 0x6f, 0xac, 0xf1, 0x0, 0x0, 0xae, + 0x1, 0xf6, 0x0, 0x0, 0x6f, 0xa7, 0xfb, 0x73, + 0x0, 0x8, 0xef, 0xff, 0xf6, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x2e, 0xc0, 0x0, 0x12, + 0x48, 0xee, 0x20, 0x0, 0xaf, 0xff, 0xa1, 0x0, + 0x0, 0x34, 0x20, 0x0, 0x0, 0x0, + + /* U+FBDB "ﯛ" */ + 0x0, 0x0, 0x52, 0x0, 0x0, 0x0, 0x94, 0x0, + 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x94, 0x0, + 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+FBDC "ﯜ" */ + 0x0, 0x0, 0x52, 0x0, 0x0, 0x0, 0x0, 0x94, + 0x0, 0x0, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x60, 0x0, 0x0, 0x7f, 0xac, 0xf2, 0x0, + 0x0, 0xae, 0x1, 0xf6, 0x0, 0x0, 0x6f, 0xa7, + 0xfb, 0x73, 0x0, 0x8, 0xef, 0xff, 0xf6, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x2e, 0xc0, + 0x0, 0x12, 0x48, 0xee, 0x20, 0x0, 0xaf, 0xff, + 0xa1, 0x0, 0x0, 0x34, 0x20, 0x0, 0x0, 0x0, + + /* U+FBDE "ﯞ" */ + 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+FBDF "ﯟ" */ + 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, 0x0, 0xa, 0x8b, 0x70, 0x0, 0x0, + 0x1, 0x11, 0x10, 0x0, 0x0, 0x4, 0xaa, 0x20, + 0x0, 0x0, 0x5f, 0xac, 0xe1, 0x0, 0x0, 0xae, + 0x1, 0xf6, 0x0, 0x0, 0x6f, 0xa7, 0xfb, 0x73, + 0x0, 0x8, 0xef, 0xff, 0xf6, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x2e, 0xc0, 0x0, 0x12, + 0x48, 0xee, 0x20, 0x0, 0xaf, 0xff, 0xa1, 0x0, + 0x0, 0x34, 0x20, 0x0, 0x0, 0x0, + + /* U+FBE4 "ﯤ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x84, 0x7f, + 0x40, 0x0, 0x4, 0xf8, 0x10, 0x10, 0x24, 0x0, + 0x7, 0xff, 0xa2, 0xd, 0xa0, 0x0, 0x0, 0x5d, + 0xc0, 0xf7, 0x0, 0x0, 0x0, 0xbe, 0xb, 0xd2, + 0x0, 0x14, 0xbf, 0x60, 0x1b, 0xfe, 0xff, 0xea, + 0x30, 0x0, 0x1, 0x43, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+FBE5 "ﯥ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xf8, 0x0, 0xbb, 0x0, 0x0, + 0xc, 0xd7, 0xf4, 0xe, 0x70, 0x0, 0x0, 0xbf, + 0x49, 0xe3, 0xe9, 0x0, 0x0, 0x1, 0xdb, 0xb, + 0x78, 0xf8, 0x31, 0x24, 0x9f, 0x60, 0x0, 0x8, + 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x34, + 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + + /* U+FBE6 "ﯦ" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x0, 0x0, 0x20, 0x0, 0x3e, 0x0, 0x0, + 0x20, + + /* U+FBE7 "ﯧ" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, + + /* U+FBE8 "ﯨ" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, + + /* U+FBE9 "ﯩ" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, + + /* U+FBFC "ﯼ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, + 0x40, 0x0, 0x5, 0xf7, 0x0, 0x10, 0x12, 0x0, + 0x9, 0xfe, 0x80, 0xc, 0xa0, 0x0, 0x2, 0x7e, + 0xb0, 0xf7, 0x0, 0x0, 0x0, 0xaf, 0xd, 0xc0, + 0x0, 0x2, 0x9f, 0x90, 0x4f, 0xfc, 0xcf, 0xff, + 0x90, 0x0, 0x28, 0xba, 0x85, 0x10, 0x0, + + /* U+FBFD "ﯽ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xf8, 0x0, 0xbb, 0x0, 0x0, + 0xc, 0xd7, 0xf4, 0xe, 0x70, 0x0, 0x0, 0xbf, + 0x49, 0xe3, 0xe9, 0x0, 0x0, 0x1, 0xdb, 0xb, + 0x78, 0xf8, 0x31, 0x24, 0x9f, 0x60, 0x0, 0x8, + 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x34, + 0x42, 0x0, 0x0, 0x0, + + /* U+FBFE "ﯾ" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x3, + 0xf4, 0xe0, 0x2, 0x2, + + /* U+FBFF "ﯿ" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, + 0x0, 0x0, 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, + + /* U+FE70 "ï¹°" */ + 0x0, 0x0, 0x14, 0x8b, 0xd7, 0x85, 0x21, 0x26, + 0xad, 0xc6, 0x63, 0x0, 0x0, + + /* U+FE71 "ï¹±" */ + 0x0, 0x0, 0x1, 0x4, 0x8b, 0xd7, 0x8, 0x52, + 0x12, 0x6, 0xad, 0xc6, 0x6, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0x77, 0x75, 0x2f, + 0xff, 0xfd, + + /* U+FE72 "ï¹²" */ + 0x1, 0xdb, 0x0, 0x4a, 0xc2, 0xa0, 0x9f, 0x8b, + 0x1a, 0x50, 0x4d, 0x70, 0x0, + + /* U+FE73 "ï¹³" */ + 0x2f, 0x50, 0x0, 0xee, 0x72, 0x3, 0xdf, 0x50, + + /* U+FE74 "ï¹´" */ + 0x3, 0x7a, 0x8c, 0xa6, 0x30, 0x25, 0x9c, 0x8a, + 0x84, 0x10, + + /* U+FE76 "ï¹¶" */ + 0x0, 0x1, 0x26, 0xad, 0xc6, 0x63, 0x0, 0x0, + + /* U+FE77 "ï¹·" */ + 0x0, 0x0, 0x12, 0x6, 0xad, 0xc6, 0x6, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0x77, + 0x75, 0x2f, 0xff, 0xfd, + + /* U+FE78 "ﹸ" */ + 0x1, 0xdb, 0x0, 0x5a, 0xc2, 0x0, 0xbf, 0x80, + 0x5d, 0x20, 0xc8, 0x10, 0x0, + + /* U+FE79 "ï¹¹" */ + 0x0, 0x1d, 0xb0, 0x0, 0x5a, 0xc1, 0x0, 0xc, + 0xe8, 0x0, 0x5c, 0x20, 0xc, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0x77, 0x75, 0x2f, + 0xff, 0xfd, + + /* U+FE7A "ﹺ" */ + 0x0, 0x36, 0x6b, 0xda, 0x62, 0x10, 0x0, 0x0, + + /* U+FE7B "ï¹»" */ + 0x17, 0x77, 0x75, 0x2f, 0xff, 0xfd, 0x0, 0x3, + 0x66, 0xb, 0xda, 0x62, 0x1, 0x0, 0x0, + + /* U+FE7C "ï¹¼" */ + 0x0, 0x0, 0x5, 0x4, 0xb, 0xc, 0xb, 0xc, + 0x1c, 0x1c, 0x3e, 0xc8, 0xb, 0xd2, 0x50, + + /* U+FE7D "ï¹½" */ + 0x0, 0x5, 0xb, 0xb, 0xc, 0xc, 0x1b, 0x1f, + 0x6a, 0xe, 0xb7, 0xb2, 0x2, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0x77, 0x75, 0x2f, + 0xff, 0xfd, + + /* U+FE7E "ï¹¾" */ + 0x2c, 0xe9, 0xb, 0x60, 0xb5, 0xb6, 0xb, 0x52, + 0xce, 0x90, + + /* U+FE7F "ﹿ" */ + 0x2, 0xce, 0x90, 0xb, 0x60, 0xb5, 0xb, 0x60, + 0xb5, 0x2, 0xce, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0x77, 0x75, 0x2f, + 0xff, 0xfd, + + /* U+FE80 "ﺀ" */ + 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x6f, 0x95, + 0x40, 0xad, 0x0, 0x0, 0x8f, 0x40, 0x11, 0x1a, + 0xff, 0xf3, 0x5c, 0xfe, 0x70, 0x9a, 0x40, 0x0, + + /* U+FE81 "ïº" */ + 0x19, 0x40, 0x19, 0x8, 0x5a, 0xdb, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, + 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, + 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, + 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, 0xf0, + 0x0, 0x0, 0x7f, 0x0, 0x0, + + /* U+FE82 "ﺂ" */ + 0x19, 0x40, 0x19, 0x8, 0x5a, 0xdb, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, + 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, + 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, + 0xf0, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x3, 0xfb, + 0x70, 0x0, 0x7, 0xef, 0x0, + + /* U+FE83 "ﺃ" */ + 0x8, 0xc3, 0x1b, 0x0, 0xd, 0x85, 0x2d, 0x93, + 0x0, 0x0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, + + /* U+FE84 "ﺄ" */ + 0x8, 0xc3, 0x0, 0x1b, 0x0, 0x0, 0xd, 0x85, + 0x0, 0x2d, 0x93, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, + 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, + 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, + 0xf0, 0x0, 0x6, 0xf0, 0x0, 0x3, 0xfb, 0x70, + 0x0, 0x7e, 0xf0, + + /* U+FE85 "ﺅ" */ + 0x0, 0x5, 0xc7, 0x0, 0x0, 0xc, 0x0, 0x0, + 0x0, 0x9, 0xa7, 0x0, 0x0, 0xb, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xed, 0x40, + 0x0, 0x6f, 0xac, 0xf1, 0x0, 0x9e, 0x1, 0xf6, + 0x0, 0x6f, 0xa6, 0xf7, 0x0, 0x8, 0xdf, 0xf7, + 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x2e, 0xe0, + 0x12, 0x48, 0xef, 0x30, 0xaf, 0xff, 0xa2, 0x0, + 0x34, 0x20, 0x0, 0x0, + + /* U+FE86 "ﺆ" */ + 0x0, 0x5, 0xc7, 0x0, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xb8, 0x0, 0x0, 0x0, + 0x8, 0x62, 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0x80, 0x0, 0x0, 0x8f, + 0xac, 0xf2, 0x0, 0x0, 0xae, 0x1, 0xf6, 0x0, + 0x0, 0x6f, 0xa7, 0xfb, 0x73, 0x0, 0x8, 0xef, + 0xff, 0xf6, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x2e, 0xc0, 0x0, 0x12, 0x48, 0xee, 0x20, + 0x0, 0xaf, 0xff, 0xa1, 0x0, 0x0, 0x34, 0x20, + 0x0, 0x0, 0x0, + + /* U+FE87 "ﺇ" */ + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x9, 0xc3, 0x1b, 0x0, 0xd, 0xb6, 0x16, 0x20, + + /* U+FE88 "ﺈ" */ + 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, + 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, + 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, + 0x7, 0xf0, 0x0, 0x6, 0xf0, 0x0, 0x3, 0xfb, + 0x70, 0x0, 0x7e, 0xf0, 0x9, 0xc3, 0x0, 0x1b, + 0x0, 0x0, 0xd, 0xb6, 0x0, 0x16, 0x20, 0x0, + + /* U+FE89 "ﺉ" */ + 0x1, 0xbb, 0x0, 0x0, 0x0, 0x0, 0x66, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xeb, 0x20, 0x0, 0x0, + 0x0, 0x35, 0x20, 0x6d, 0xfe, 0x70, 0x0, 0x0, + 0x4f, 0x94, 0x7f, 0x40, 0x0, 0x5, 0xf7, 0x0, + 0x10, 0x12, 0x0, 0x9, 0xfe, 0x80, 0xc, 0xa0, + 0x0, 0x2, 0x7e, 0xb0, 0xf7, 0x0, 0x0, 0x0, + 0xaf, 0xd, 0xc0, 0x0, 0x2, 0x9f, 0x90, 0x4f, + 0xfc, 0xcf, 0xff, 0x90, 0x0, 0x28, 0xba, 0x85, + 0x10, 0x0, + + /* U+FE8A "ﺊ" */ + 0x0, 0x3c, 0x90, 0x0, 0x0, 0x0, 0x0, 0xa, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x8, 0x95, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0x80, + 0xb, 0xb0, 0x0, 0x0, 0xcd, 0x7f, 0x40, 0xe7, + 0x0, 0x0, 0xb, 0xf4, 0x9e, 0x3e, 0x90, 0x0, + 0x0, 0x1d, 0xb0, 0xb7, 0x8f, 0x83, 0x12, 0x49, + 0xf6, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xd6, 0x0, + 0x0, 0x0, 0x3, 0x44, 0x20, 0x0, 0x0, 0x0, + + /* U+FE8B "ﺋ" */ + 0x0, 0x8c, 0x50, 0xc, 0x0, 0x0, 0xcb, 0x70, + 0x7, 0x30, 0x0, 0x0, 0x0, 0x4, 0xb0, 0x0, + 0x6f, 0x0, 0x7, 0xf0, 0x17, 0xec, 0x2, 0xfc, + 0x20, + + /* U+FE8C "ﺌ" */ + 0x0, 0x8c, 0x50, 0x0, 0xc0, 0x0, 0x0, 0xcb, + 0x70, 0x0, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, 0x20, + 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, + + /* U+FE8D "ïº" */ + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, + + /* U+FE8E "ﺎ" */ + 0x7f, 0x0, 0x7, 0xf0, 0x0, 0x7f, 0x0, 0x7, + 0xf0, 0x0, 0x7f, 0x0, 0x7, 0xf0, 0x0, 0x7f, + 0x0, 0x7, 0xf0, 0x0, 0x7f, 0x0, 0x6, 0xf0, + 0x0, 0x3f, 0xb7, 0x0, 0x7e, 0xf0, + + /* U+FE8F "ïº" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, + + /* U+FE90 "ïº" */ + 0xbb, 0x0, 0x0, 0x0, 0x0, 0x9, 0xc0, 0xf, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xae, 0x0, 0xdb, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xf1, 0x5, 0xfe, + 0x97, 0x78, 0xad, 0xfe, 0x7f, 0xc6, 0x3, 0xae, + 0xff, 0xec, 0x95, 0x0, 0x4e, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x0, + + /* U+FE91 "ﺑ" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x0, 0x0, 0x20, + + /* U+FE92 "ﺒ" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, + + /* U+FE93 "ﺓ" */ + 0xf, 0x3f, 0x10, 0x0, 0x20, 0x20, 0x0, 0x0, + 0x10, 0x0, 0x2, 0xef, 0xd5, 0x0, 0xae, 0x5a, + 0xf7, 0xd, 0x90, 0x7, 0xf1, 0xe8, 0x0, 0x3f, + 0x3b, 0xe6, 0x6d, 0xe0, 0x2b, 0xfe, 0x91, 0x0, + + /* U+FE94 "ﺔ" */ + 0x4, 0xe4, 0xd0, 0x0, 0x0, 0x20, 0x20, 0x0, + 0x0, 0x3, 0xb1, 0x0, 0x4, 0xcf, 0xf3, 0x0, + 0x5f, 0x82, 0xf6, 0x0, 0xc9, 0x0, 0xda, 0x0, + 0xae, 0xbd, 0xff, 0x85, 0x4, 0x75, 0x8, 0xfb, + + /* U+FE95 "ﺕ" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x5, 0x70, + 0x1, 0x11, 0x10, 0x0, 0x9c, 0xe8, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xce, 0xa0, 0x0, 0x0, 0x0, + 0x7, 0xf7, 0x7f, 0xd8, 0x66, 0x79, 0xcf, 0xf8, + 0x0, 0x4a, 0xef, 0xfe, 0xc9, 0x61, 0x0, + + /* U+FE96 "ﺖ" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x5, + 0x70, 0x1, 0x11, 0x10, 0x0, 0x9c, 0x0, 0xe8, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xe0, 0xe, 0xa0, + 0x0, 0x0, 0x0, 0x2a, 0xff, 0x10, 0x7f, 0xd9, + 0x77, 0x8a, 0xdf, 0xf8, 0xfc, 0x60, 0x4a, 0xef, + 0xfe, 0xca, 0x51, 0x4, 0xed, + + /* U+FE97 "ﺗ" */ + 0x3, 0xf4, 0xe0, 0x2, 0x2, 0x0, 0x0, 0x0, + 0x4, 0xc0, 0x0, 0x6f, 0x0, 0x7, 0xf0, 0x18, + 0xec, 0x2, 0xfc, 0x20, + + /* U+FE98 "ﺘ" */ + 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x6f, 0x10, 0x0, + 0x7f, 0x20, 0x18, 0xef, 0xc7, 0x2f, 0xc8, 0xef, + + /* U+FE99 "ﺙ" */ + 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x99, 0x0, 0x0, 0x5, 0x70, 0x1, 0x11, 0x10, + 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, + 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, + 0xfe, 0xc9, 0x61, 0x0, + + /* U+FE9A "ﺚ" */ + 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x5, 0x70, + 0x1, 0x11, 0x10, 0x0, 0x9c, 0x0, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xe0, 0xe, 0xa0, 0x0, + 0x0, 0x0, 0x2a, 0xff, 0x10, 0x7f, 0xd9, 0x77, + 0x8a, 0xdf, 0xf8, 0xfc, 0x60, 0x4a, 0xef, 0xfe, + 0xca, 0x51, 0x4, 0xed, + + /* U+FE9B "ﺛ" */ + 0x0, 0x3e, 0x0, 0x0, 0x20, 0x3, 0xf4, 0xe0, + 0x2, 0x2, 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, + 0x6f, 0x0, 0x7, 0xf0, 0x18, 0xec, 0x2, 0xfc, + 0x20, + + /* U+FE9C "ﺜ" */ + 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, 0x3, 0xf4, + 0xe0, 0x0, 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, 0x20, + 0x18, 0xef, 0xc7, 0x2f, 0xc8, 0xef, + + /* U+FE9D "ïº" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x98, 0x5b, 0xfe, 0xb6, 0x0, 0x0, + 0xbf, 0x70, 0x0, 0x0, 0x7, 0xf4, 0x0, 0x0, + 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x4f, 0x20, + 0x2, 0x0, 0x0, 0x6f, 0x0, 0xf, 0x30, 0x0, + 0x5f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, + 0x0, 0x0, 0x7, 0xfa, 0x41, 0x14, 0xa4, 0x0, + 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, + 0x0, + + /* U+FE9E "ﺞ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x98, 0x6b, 0xff, 0xe6, 0x0, 0x0, + 0xcf, 0x78, 0xe0, 0x0, 0xa, 0xe2, 0x1, 0xf4, + 0x0, 0x2f, 0x60, 0x0, 0x9c, 0x0, 0x5f, 0x10, + 0x11, 0x1e, 0xc3, 0x6f, 0x10, 0x8a, 0x3, 0xd7, + 0x2f, 0x70, 0x0, 0x0, 0x0, 0x9, 0xf9, 0x31, + 0x13, 0x83, 0x0, 0x7d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FE9F "ﺟ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0xb7, 0x20, 0x0, 0x45, 0x68, 0xbe, 0xf9, 0x0, + 0x0, 0x0, 0x6e, 0xe6, 0x0, 0x0, 0x1a, 0xf9, + 0x0, 0x17, 0x8a, 0xfe, 0x40, 0x0, 0x2f, 0xec, + 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, + + /* U+FEA0 "ﺠ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x68, 0xbe, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xe6, 0x0, + 0x0, 0x0, 0x1a, 0xfd, 0xf2, 0x0, 0x17, 0x8a, + 0xfe, 0x41, 0xef, 0x83, 0x2f, 0xec, 0x71, 0x0, + 0x2b, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, + + /* U+FEA1 "ﺡ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0x0, 0x0, 0x0, 0x6f, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0x10, 0x0, 0x0, 0x0, + 0x1f, 0x80, 0x0, 0x0, 0x0, 0x8, 0xf9, 0x31, + 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FEA2 "ﺢ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x98, 0x5b, 0xff, 0xe6, 0x0, 0x0, + 0xbf, 0x78, 0xe0, 0x0, 0x7, 0xf4, 0x1, 0xf4, + 0x0, 0xf, 0x80, 0x0, 0x9c, 0x0, 0x4f, 0x20, + 0x0, 0x1e, 0xc3, 0x6f, 0x0, 0x0, 0x3, 0xd7, + 0x5f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, + 0x0, 0x0, 0x7, 0xfa, 0x41, 0x14, 0xa4, 0x0, + 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, + 0x0, + + /* U+FEA3 "ﺣ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0xb7, 0x20, 0x0, 0x45, 0x68, 0xbe, 0xf9, 0x0, + 0x0, 0x0, 0x6e, 0xe6, 0x0, 0x0, 0x1a, 0xf9, + 0x0, 0x17, 0x8a, 0xfe, 0x40, 0x0, 0x2f, 0xec, + 0x71, 0x0, 0x0, + + /* U+FEA4 "ﺤ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x68, 0xbe, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xe6, 0x0, + 0x0, 0x0, 0x1a, 0xfd, 0xf2, 0x0, 0x17, 0x8a, + 0xfe, 0x41, 0xef, 0x83, 0x2f, 0xec, 0x71, 0x0, + 0x2b, 0xf7, + + /* U+FEA5 "ﺥ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, + 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, + 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, + 0x0, 0x0, 0x0, 0x3f, 0x30, 0x0, 0x0, 0x0, + 0x6f, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x10, 0x0, + 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, 0x0, 0x8, + 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+FEA6 "ﺦ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x20, + 0x0, 0x0, 0x7c, 0xff, 0xff, 0xd8, 0x0, 0x98, + 0x5b, 0xff, 0xe6, 0x0, 0x0, 0xbf, 0x78, 0xe0, + 0x0, 0x7, 0xf4, 0x1, 0xf4, 0x0, 0xf, 0x80, + 0x0, 0x9c, 0x0, 0x4f, 0x20, 0x0, 0x1e, 0xc3, + 0x6f, 0x0, 0x0, 0x3, 0xd7, 0x5f, 0x20, 0x0, + 0x0, 0x0, 0x1f, 0x90, 0x0, 0x0, 0x0, 0x7, + 0xfa, 0x41, 0x14, 0xa4, 0x0, 0x5d, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+FEA7 "ﺧ" */ + 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, + 0xcf, 0xfe, 0xb7, 0x20, 0x0, 0x45, 0x68, 0xbe, + 0xf9, 0x0, 0x0, 0x0, 0x6e, 0xe6, 0x0, 0x0, + 0x1a, 0xf9, 0x0, 0x17, 0x8a, 0xfe, 0x40, 0x0, + 0x2f, 0xec, 0x71, 0x0, 0x0, + + /* U+FEA8 "ﺨ" */ + 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x12, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfe, 0xb7, 0x20, 0x0, + 0x0, 0x45, 0x68, 0xbe, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x6e, 0xe6, 0x0, 0x0, 0x0, 0x1a, 0xfd, + 0xf2, 0x0, 0x17, 0x8a, 0xfe, 0x41, 0xef, 0x83, + 0x2f, 0xec, 0x71, 0x0, 0x2b, 0xf7, + + /* U+FEA9 "ﺩ" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, + 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, + 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xfe, 0x90, + 0x0, + + /* U+FEAA "ﺪ" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0x60, + 0x0, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x0, 0x5, + 0xf2, 0x0, 0x0, 0x0, 0x7f, 0x60, 0x0, 0x66, + 0xaf, 0xef, 0x83, 0xf, 0xfe, 0x80, 0xaf, 0x90, + + /* U+FEAB "ﺫ" */ + 0x0, 0x7b, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + 0x13, 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, + 0xf8, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, + 0x20, 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, + 0xdf, 0xe8, 0x0, + + /* U+FEAC "ﺬ" */ + 0x0, 0x7b, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, + 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x1, 0xdb, + 0x0, 0x0, 0x0, 0x2, 0xf6, 0x0, 0x0, 0x0, + 0x9, 0xe0, 0x0, 0x0, 0x0, 0x4f, 0x20, 0x0, + 0x0, 0x8, 0xf6, 0x0, 0x6, 0x6a, 0xfe, 0xf8, + 0x30, 0xff, 0xe8, 0xa, 0xf9, + + /* U+FEAD "ﺭ" */ + 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0xba, + 0x0, 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, 0xca, + 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x4e, 0xd0, + 0x14, 0x6c, 0xfd, 0x20, 0xaf, 0xfc, 0x60, 0x0, + 0x33, 0x10, 0x0, 0x0, + + /* U+FEAE "ﺮ" */ + 0x0, 0x0, 0x0, 0x73, 0x0, 0x0, 0x0, 0x0, + 0xc9, 0x0, 0x0, 0x0, 0x0, 0xad, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xb7, 0x0, 0x0, 0x0, 0xed, + 0xef, 0x0, 0x0, 0x6, 0xf3, 0x0, 0x0, 0x0, + 0x6f, 0xb0, 0x0, 0x13, 0x6c, 0xfb, 0x0, 0x0, + 0xaf, 0xfb, 0x50, 0x0, 0x0, 0x33, 0x0, 0x0, + 0x0, 0x0, + + /* U+FEAF "ﺯ" */ + 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc7, + 0x0, 0x0, 0x0, 0xbb, 0x0, 0x0, 0x0, 0xab, + 0x0, 0x0, 0x0, 0xda, 0x0, 0x0, 0x4, 0xf5, + 0x0, 0x0, 0x4f, 0xd0, 0x14, 0x6c, 0xfd, 0x20, + 0xaf, 0xfc, 0x60, 0x0, 0x33, 0x10, 0x0, 0x0, + + /* U+FEB0 "ﺰ" */ + 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xbd, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xa7, 0x0, 0x0, + 0x0, 0xdd, 0xef, 0x0, 0x0, 0x5, 0xf3, 0x0, + 0x0, 0x0, 0x4f, 0xb0, 0x0, 0x13, 0x6b, 0xfb, + 0x0, 0x0, 0xaf, 0xfb, 0x50, 0x0, 0x0, 0x33, + 0x0, 0x0, 0x0, 0x0, + + /* U+FEB1 "ﺱ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xf3, 0x0, 0x0, 0x0, 0xd, 0x90, 0x4, 0xf2, + 0x3, 0xf3, 0x0, 0x0, 0x0, 0x9, 0xd0, 0x6, + 0xf3, 0x4, 0xf3, 0x5f, 0x10, 0x0, 0x6, 0xf3, + 0xa, 0xf8, 0x6, 0xf1, 0xcb, 0x0, 0x0, 0x6, + 0xfe, 0xbf, 0xcf, 0xbf, 0xc0, 0xe8, 0x0, 0x0, + 0x9, 0xfc, 0xfa, 0x1a, 0xfb, 0x10, 0xf8, 0x0, + 0x0, 0x3f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xbe, + 0x52, 0x27, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x24, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+FEB2 "ﺲ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x7, 0x40, 0x2, + 0x81, 0x3, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xb0, 0x5, 0xf2, 0x4, 0xf3, 0x0, 0x5f, 0x10, + 0x0, 0x7, 0xf1, 0x8, 0xf6, 0x5, 0xf6, 0x0, + 0xbc, 0x0, 0x0, 0x5, 0xfc, 0x8f, 0xde, 0x7d, + 0xff, 0x83, 0xd9, 0x0, 0x0, 0x6, 0xfd, 0xfa, + 0x1b, 0xfc, 0x6c, 0xf9, 0xf7, 0x0, 0x0, 0xa, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, + 0x0, 0x4f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0x63, 0x27, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+FEB3 "ﺳ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf1, 0x0, + 0x6, 0x40, 0x3, 0x80, 0x5, 0xf1, 0x0, 0xd, + 0x90, 0x7, 0xf0, 0x6, 0xf1, 0x0, 0xf, 0xd0, + 0xa, 0xf4, 0x7, 0xf0, 0x17, 0xcf, 0xfa, 0x9f, + 0xee, 0x7e, 0xa0, 0x2f, 0xe6, 0x7e, 0xe9, 0x2c, + 0xfa, 0x10, + + /* U+FEB4 "ﺴ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf1, 0x0, + 0x0, 0xd, 0x90, 0x6, 0xf0, 0x5, 0xf1, 0x0, + 0x0, 0xd, 0xa0, 0x8, 0xf1, 0x6, 0xf1, 0x0, + 0x0, 0x2f, 0xe0, 0xc, 0xf6, 0x8, 0xf6, 0x0, + 0x1b, 0xef, 0xfd, 0xdf, 0xcf, 0xbf, 0xff, 0xb4, + 0x2f, 0xe4, 0x4e, 0xe8, 0x1b, 0xfa, 0x3c, 0xf7, + + /* U+FEB5 "ﺵ" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x2, 0x0, 0x1, 0x61, 0x0, 0x0, 0x0, 0x2, + 0x10, 0x0, 0x20, 0x3, 0xf3, 0x0, 0x0, 0x0, + 0xc, 0x90, 0x5, 0xf2, 0x3, 0xf3, 0x1, 0x0, + 0x0, 0x8, 0xd0, 0x6, 0xf3, 0x4, 0xf2, 0x6f, + 0x10, 0x0, 0x6, 0xf3, 0xa, 0xf9, 0x7, 0xf1, + 0xca, 0x0, 0x0, 0x6, 0xff, 0xbf, 0xcf, 0xbf, + 0xb0, 0xe8, 0x0, 0x0, 0xa, 0xfc, 0xfa, 0x1a, + 0xfb, 0x10, 0xe8, 0x0, 0x0, 0x4f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xbe, 0x52, 0x27, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+FEB6 "ﺶ" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x2, 0x0, 0x1, 0x81, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x30, 0x1, 0x61, 0x3, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0xb, 0xb0, 0x5, + 0xf2, 0x3, 0xf3, 0x0, 0x2a, 0x10, 0x0, 0x7, + 0xf1, 0x8, 0xf6, 0x5, 0xf5, 0x0, 0x9d, 0x0, + 0x0, 0x5, 0xfc, 0x8f, 0xee, 0x7d, 0xfe, 0x73, + 0xd9, 0x0, 0x0, 0x6, 0xfd, 0xfb, 0x1b, 0xfc, + 0x6c, 0xf9, 0xf7, 0x0, 0x0, 0xa, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x4f, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x63, + 0x27, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+FEB7 "ﺷ" */ + 0x0, 0x0, 0x0, 0xe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe3, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x20, 0x2, 0x80, 0x0, 0x5, 0x40, 0x2, + 0x60, 0x5, 0xf1, 0x0, 0xd, 0x90, 0x7, 0xf0, + 0x5, 0xf1, 0x0, 0xf, 0xd0, 0xa, 0xf4, 0x7, + 0xf0, 0x17, 0xcf, 0xfa, 0x9f, 0xee, 0x7e, 0xb0, + 0x2f, 0xe6, 0x7e, 0xe9, 0x2c, 0xfb, 0x10, + + /* U+FEB8 "ﺸ" */ + 0x0, 0x0, 0x0, 0xe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe3, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x20, 0x20, 0x2, 0x60, 0x0, + 0x0, 0x2, 0x10, 0x1, 0x20, 0x5, 0xf1, 0x0, + 0x0, 0xd, 0x90, 0x7, 0xf0, 0x5, 0xf1, 0x0, + 0x0, 0xd, 0xa0, 0x8, 0xf1, 0x6, 0xf1, 0x0, + 0x0, 0x2f, 0xe1, 0xc, 0xf7, 0x9, 0xf7, 0x0, + 0x1b, 0xef, 0xfd, 0xcf, 0xcf, 0xbf, 0xff, 0xb4, + 0x2f, 0xe4, 0x4e, 0xe8, 0x1b, 0xfa, 0x3c, 0xf7, + + /* U+FEB9 "ﺹ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0xa, 0x43, + 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, 0x0, 0xc, + 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, 0x0, 0x0, + 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, 0xd9, 0x0, + 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, 0x0, 0xf7, + 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+FEBA "ﺺ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xa4, 0x3f, 0xb0, 0x0, 0x5f, 0x10, 0x4e, 0x10, + 0x0, 0xc, 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xa, + 0xc0, 0x0, 0x0, 0xaf, 0xf8, 0x78, 0xbf, 0xff, + 0x95, 0xd9, 0x0, 0x0, 0xb, 0xde, 0xff, 0xed, + 0x83, 0xaf, 0xcf, 0x70, 0x0, 0x0, 0xd9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x5f, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf6, 0x32, + 0x8f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x34, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+FEBB "ﺻ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x50, 0x0, 0x4, + 0x30, 0x1d, 0xf7, 0x4a, 0xf2, 0x0, 0xd, 0xa1, + 0xdd, 0x20, 0x1, 0xf5, 0x0, 0x1f, 0xec, 0xe1, + 0x0, 0x1a, 0xf3, 0x17, 0xcf, 0xff, 0xa7, 0x8a, + 0xff, 0x80, 0x2f, 0xe6, 0x6e, 0xff, 0xfd, 0xa3, + 0x0, + + /* U+FEBC "ﺼ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x60, 0x0, + 0x0, 0x4, 0x30, 0x1d, 0xf7, 0x4a, 0xf2, 0x0, + 0x0, 0xd, 0xa1, 0xdd, 0x20, 0x1, 0xf6, 0x0, + 0x0, 0x1f, 0xec, 0xe1, 0x0, 0x1a, 0xf4, 0x0, + 0x17, 0xcf, 0xff, 0xa7, 0x8a, 0xff, 0xfb, 0x70, + 0x2f, 0xe6, 0x6e, 0xff, 0xfd, 0xa4, 0x7e, 0xf0, + + /* U+FEBD "ﺽ" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0xa, 0x43, + 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, 0x0, 0xc, + 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, 0x0, 0x0, + 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, 0xd9, 0x0, + 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, 0x0, 0xf7, + 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+FEBE "ﺾ" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xa4, 0x3f, 0xb0, 0x0, 0x5f, 0x10, 0x4e, 0x10, + 0x0, 0xc, 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xa, + 0xc0, 0x0, 0x0, 0xaf, 0xf8, 0x78, 0xbf, 0xff, + 0x95, 0xd9, 0x0, 0x0, 0xb, 0xde, 0xff, 0xed, + 0x83, 0xaf, 0xcf, 0x70, 0x0, 0x0, 0xd9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x5f, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf6, 0x32, + 0x8f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x34, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+FEBF "ﺿ" */ + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x50, 0x0, 0x4, + 0x30, 0x1d, 0xf7, 0x4a, 0xf2, 0x0, 0xd, 0xa1, + 0xdd, 0x20, 0x1, 0xf5, 0x0, 0x1f, 0xec, 0xe1, + 0x0, 0x1a, 0xf3, 0x17, 0xcf, 0xff, 0xa7, 0x8a, + 0xff, 0x80, 0x2f, 0xe6, 0x6e, 0xff, 0xfd, 0xa3, + 0x0, + + /* U+FEC0 "ﻀ" */ + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x60, 0x0, + 0x0, 0x4, 0x30, 0x1d, 0xf7, 0x4a, 0xf2, 0x0, + 0x0, 0xd, 0xa1, 0xdd, 0x20, 0x1, 0xf6, 0x0, + 0x0, 0x1f, 0xec, 0xe1, 0x0, 0x1a, 0xf4, 0x0, + 0x17, 0xcf, 0xff, 0xa7, 0x8a, 0xff, 0xfb, 0x70, + 0x2f, 0xe6, 0x6e, 0xff, 0xfd, 0xa4, 0x7e, 0xf0, + + /* U+FEC1 "ï»" */ + 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0x70, 0x6, 0xdf, 0xf9, 0x0, 0x0, 0xf7, + 0xb, 0xfa, 0x46, 0xf7, 0x0, 0xf, 0x7b, 0xf6, + 0x0, 0xc, 0xa0, 0x0, 0xfd, 0xf5, 0x0, 0x6, + 0xf8, 0x67, 0x7f, 0xfd, 0x77, 0x9d, 0xfc, 0x1e, + 0xff, 0xff, 0xff, 0xfe, 0xb5, 0x0, + + /* U+FEC2 "ﻂ" */ + 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, + 0x6, 0xdf, 0xf9, 0x0, 0x0, 0x0, 0xf7, 0xb, + 0xfa, 0x46, 0xf7, 0x0, 0x0, 0xf, 0x7b, 0xf6, + 0x0, 0xc, 0xb0, 0x0, 0x0, 0xfd, 0xf5, 0x0, + 0x6, 0xf9, 0x0, 0x67, 0x7f, 0xfd, 0x77, 0x9d, + 0xff, 0xe7, 0x2e, 0xff, 0xff, 0xff, 0xfe, 0xb6, + 0x4d, 0xf5, + + /* U+FEC3 "ﻃ" */ + 0x0, 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0x60, 0x6, 0xef, 0xf9, 0x0, 0x1, 0xf6, + 0xc, 0xf9, 0x47, 0xf6, 0x0, 0x1f, 0x6b, 0xf5, + 0x0, 0xd, 0x90, 0x1, 0xfd, 0xf4, 0x0, 0x7, + 0xf7, 0x17, 0x7f, 0xfd, 0x77, 0x9e, 0xfc, 0x2, + 0xff, 0xff, 0xff, 0xfd, 0xb5, 0x0, + + /* U+FEC4 "ﻄ" */ + 0x0, 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x60, + 0x6, 0xef, 0xf9, 0x0, 0x0, 0x1, 0xf6, 0xc, + 0xf9, 0x47, 0xf6, 0x0, 0x0, 0x1f, 0x6b, 0xf5, + 0x0, 0xd, 0xa0, 0x0, 0x1, 0xfd, 0xf4, 0x0, + 0x7, 0xf8, 0x0, 0x17, 0x7f, 0xfd, 0x77, 0x9e, + 0xff, 0xd7, 0x12, 0xff, 0xff, 0xff, 0xfe, 0xb5, + 0x5d, 0xf4, + + /* U+FEC5 "ï»…" */ + 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x70, 0x5c, 0x0, 0x0, + 0x0, 0x0, 0xf7, 0x1, 0x20, 0x0, 0x0, 0x0, + 0xf, 0x70, 0x6, 0xdf, 0xf9, 0x0, 0x0, 0xf7, + 0xb, 0xfa, 0x46, 0xf7, 0x0, 0xf, 0x7b, 0xf6, + 0x0, 0xc, 0xa0, 0x0, 0xfd, 0xf5, 0x0, 0x6, + 0xf8, 0x67, 0x7f, 0xfd, 0x77, 0x9d, 0xfc, 0x1e, + 0xff, 0xff, 0xff, 0xfe, 0xb5, 0x0, + + /* U+FEC6 "ﻆ" */ + 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0x70, 0x5c, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, + 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, + 0x6, 0xdf, 0xf9, 0x0, 0x0, 0x0, 0xf7, 0xb, + 0xfa, 0x46, 0xf7, 0x0, 0x0, 0xf, 0x7b, 0xf6, + 0x0, 0xc, 0xb0, 0x0, 0x0, 0xfd, 0xf5, 0x0, + 0x6, 0xf9, 0x0, 0x67, 0x7f, 0xfd, 0x77, 0x9d, + 0xff, 0xe7, 0x2e, 0xff, 0xff, 0xff, 0xfe, 0xb6, + 0x4d, 0xf5, + + /* U+FEC7 "ﻇ" */ + 0x0, 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x60, 0x6b, 0x0, 0x0, + 0x0, 0x1, 0xf6, 0x1, 0x20, 0x0, 0x0, 0x0, + 0x1f, 0x60, 0x6, 0xef, 0xf9, 0x0, 0x1, 0xf6, + 0xc, 0xf9, 0x47, 0xf6, 0x0, 0x1f, 0x6b, 0xf5, + 0x0, 0xd, 0x90, 0x1, 0xfd, 0xf4, 0x0, 0x7, + 0xf7, 0x17, 0x7f, 0xfd, 0x77, 0x9e, 0xfc, 0x2, + 0xff, 0xff, 0xff, 0xfd, 0xb5, 0x0, + + /* U+FEC8 "ﻈ" */ + 0x0, 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0x60, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x1, 0xf6, + 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x60, + 0x6, 0xef, 0xf9, 0x0, 0x0, 0x1, 0xf6, 0xc, + 0xf9, 0x47, 0xf6, 0x0, 0x0, 0x1f, 0x6b, 0xf5, + 0x0, 0xd, 0xa0, 0x0, 0x1, 0xfd, 0xf4, 0x0, + 0x7, 0xf8, 0x0, 0x17, 0x7f, 0xfd, 0x77, 0x9e, + 0xff, 0xd7, 0x12, 0xff, 0xff, 0xff, 0xfe, 0xb5, + 0x5d, 0xf4, + + /* U+FEC9 "ﻉ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, + 0x20, 0x0, 0x0, 0xce, 0x75, 0x0, 0x0, 0x4, + 0xf2, 0x0, 0x0, 0x0, 0x4, 0xf4, 0x26, 0xbd, + 0x0, 0x0, 0xaf, 0xff, 0xd9, 0x0, 0x0, 0xbf, + 0x92, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0xf, 0x80, 0x0, 0x0, 0x0, 0xf, 0x50, 0x0, + 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, 0x0, 0x6, + 0xf9, 0x31, 0x13, 0x95, 0x0, 0x6d, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+FECA "ﻊ" */ + 0x0, 0x1, 0x10, 0x0, 0x0, 0x1, 0xcf, 0xfc, + 0x20, 0x0, 0x8, 0xf9, 0x8f, 0x90, 0x0, 0x4, + 0xfc, 0xdf, 0x50, 0x0, 0x1, 0xdf, 0xf4, 0x0, + 0x0, 0xa, 0xf7, 0xef, 0x97, 0x40, 0xf, 0x80, + 0x18, 0xdf, 0xa0, 0xf, 0x50, 0x0, 0x0, 0x0, + 0xd, 0xa0, 0x0, 0x0, 0x0, 0x6, 0xfa, 0x31, + 0x13, 0x96, 0x0, 0x5d, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FECB "ﻋ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xef, + 0x20, 0x0, 0xc, 0xe7, 0x40, 0x0, 0x3, 0xf3, + 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x0, 0x2, + 0xf8, 0x1, 0x8d, 0x0, 0x5, 0xff, 0xfe, 0x61, + 0x79, 0xdf, 0xd5, 0x0, 0x2f, 0xd9, 0x30, 0x0, + 0x0, + + /* U+FECC "ﻌ" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x3, 0xdf, 0xfb, + 0x10, 0x0, 0xbf, 0x7a, 0xf7, 0x0, 0x5, 0xfa, + 0xde, 0x20, 0x0, 0x8, 0xff, 0x40, 0x1, 0x79, + 0xfd, 0xee, 0x86, 0x2f, 0xe8, 0x2, 0xaf, 0xe0, + + /* U+FECD "ï»" */ + 0x0, 0xf, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xef, 0x20, 0x0, 0x0, + 0xce, 0x75, 0x0, 0x0, 0x4, 0xf2, 0x0, 0x0, + 0x0, 0x4, 0xf4, 0x26, 0xbd, 0x0, 0x0, 0xaf, + 0xff, 0xd9, 0x0, 0x0, 0xbf, 0x92, 0x0, 0x0, + 0x9, 0xf4, 0x0, 0x0, 0x0, 0xf, 0x80, 0x0, + 0x0, 0x0, 0xf, 0x50, 0x0, 0x0, 0x0, 0xe, + 0x90, 0x0, 0x0, 0x0, 0x6, 0xf9, 0x31, 0x13, + 0x95, 0x0, 0x6d, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x13, 0x31, 0x0, + + /* U+FECE "ﻎ" */ + 0x0, 0xa, 0x70, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x1, + 0xcf, 0xfc, 0x20, 0x0, 0x8, 0xf9, 0x8f, 0x90, + 0x0, 0x4, 0xfc, 0xdf, 0x50, 0x0, 0x1, 0xdf, + 0xf4, 0x0, 0x0, 0xa, 0xf7, 0xef, 0x97, 0x40, + 0xf, 0x80, 0x18, 0xdf, 0xa0, 0xf, 0x50, 0x0, + 0x0, 0x0, 0xd, 0xa0, 0x0, 0x0, 0x0, 0x6, + 0xfa, 0x31, 0x13, 0x96, 0x0, 0x5d, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+FECF "ï»" */ + 0x0, 0x0, 0xf1, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, + 0xef, 0x20, 0x0, 0xc, 0xe7, 0x40, 0x0, 0x3, + 0xf3, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x0, + 0x2, 0xf8, 0x1, 0x8d, 0x0, 0x5, 0xff, 0xfe, + 0x61, 0x79, 0xdf, 0xd5, 0x0, 0x2f, 0xd9, 0x30, + 0x0, 0x0, + + /* U+FED0 "ï»" */ + 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x3, 0xdf, + 0xfb, 0x10, 0x0, 0xbf, 0x7a, 0xf7, 0x0, 0x5, + 0xfa, 0xde, 0x20, 0x0, 0x8, 0xff, 0x40, 0x1, + 0x79, 0xfd, 0xee, 0x86, 0x2f, 0xe8, 0x2, 0xaf, + 0xe0, + + /* U+FED1 "ﻑ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xf9, 0xee, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xda, 0x5, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xd1, 0x8f, 0x3b, 0xa0, 0x0, 0x0, + 0x0, 0x4f, 0xfe, 0xf1, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xbc, 0xb, 0xf8, 0x32, 0x12, 0x24, + 0x6a, 0xfe, 0x20, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xc7, 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, + 0x0, 0x0, + + /* U+FED2 "ï»’" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xc2, 0x0, + 0x11, 0x0, 0x0, 0x0, 0xb, 0xf9, 0xee, 0x0, + 0xca, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x5f, 0x20, + 0xf8, 0x0, 0x0, 0x0, 0x9, 0xe1, 0x6f, 0x0, + 0xaf, 0x83, 0x22, 0x22, 0x35, 0xfd, 0xfd, 0x75, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xfb, + 0x0, 0x3, 0x44, 0x43, 0x32, 0x0, 0x0, 0x0, + + /* U+FED3 "ﻓ" */ + 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x1, 0x76, 0x0, 0x0, 0x2e, 0xff, 0xc0, + 0x0, 0x8f, 0x24, 0xf6, 0x0, 0x8f, 0x23, 0xf7, + 0x0, 0x1d, 0xff, 0xf6, 0x0, 0x0, 0x27, 0xf3, + 0x17, 0x77, 0xaf, 0xb0, 0x2f, 0xff, 0xe9, 0x10, + + /* U+FED4 "ï»”" */ + 0x0, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x90, 0x0, 0x0, 0x3f, 0xb9, 0xf4, + 0x0, 0x0, 0x5f, 0x20, 0xf7, 0x0, 0x0, 0x2f, + 0x86, 0xf4, 0x0, 0x17, 0x7e, 0xff, 0xf7, 0x71, + 0x2f, 0xfe, 0xba, 0xef, 0xf4, + + /* U+FED5 "ﻕ" */ + 0x0, 0x0, 0x0, 0x5c, 0x6c, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x12, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0xaf, 0x9e, 0xa0, + 0x0, 0x0, 0x0, 0xf9, 0x7, 0xf0, 0x0, 0x0, + 0x0, 0xdc, 0x19, 0xf2, 0x3, 0x50, 0x0, 0x5f, + 0xfe, 0xf3, 0xc, 0x90, 0x0, 0x1, 0x24, 0xf1, + 0xf, 0x50, 0x0, 0x0, 0x9, 0xd0, 0x2f, 0x40, + 0x0, 0x0, 0x3f, 0x60, 0xf, 0x70, 0x0, 0x4, + 0xeb, 0x0, 0xb, 0xe5, 0x35, 0xaf, 0xb0, 0x0, + 0x1, 0xdf, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x3, + 0x43, 0x0, 0x0, 0x0, + + /* U+FED6 "ï»–" */ + 0x0, 0x0, 0x0, 0xf, 0x3f, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0x9e, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xf8, + 0x6, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xed, 0x33, + 0xf2, 0x0, 0x9, 0x70, 0x0, 0x8f, 0xfe, 0xf8, + 0x73, 0xf, 0x60, 0x0, 0x8, 0xff, 0xff, 0xf8, + 0x2f, 0x40, 0x0, 0x0, 0xc, 0xd0, 0x0, 0xf, + 0x70, 0x0, 0x0, 0x9f, 0x40, 0x0, 0xb, 0xe6, + 0x23, 0x6d, 0xf6, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x2, 0x44, 0x10, + 0x0, 0x0, 0x0, + + /* U+FED7 "ï»—" */ + 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, + 0x0, 0x1, 0x76, 0x0, 0x0, 0x2e, 0xff, 0xc0, + 0x0, 0x8f, 0x24, 0xf6, 0x0, 0x8f, 0x23, 0xf7, + 0x0, 0x1d, 0xff, 0xf6, 0x0, 0x0, 0x27, 0xf3, + 0x17, 0x77, 0xaf, 0xb0, 0x2f, 0xff, 0xe9, 0x10, + + /* U+FED8 "ﻘ" */ + 0x0, 0x8, 0x99, 0x80, 0x0, 0x0, 0x1, 0x11, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x90, 0x0, 0x0, 0x3f, 0xb9, 0xf4, + 0x0, 0x0, 0x5f, 0x20, 0xf7, 0x0, 0x0, 0x2f, + 0x86, 0xf4, 0x0, 0x17, 0x7e, 0xff, 0xf7, 0x71, + 0x2f, 0xfe, 0xba, 0xef, 0xf4, + + /* U+FED9 "ï»™" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x90, 0x0, 0x2, 0x96, 0x0, 0xe9, 0x0, 0x0, + 0x76, 0x0, 0xe, 0x90, 0x0, 0x0, 0x58, 0x0, + 0xe9, 0x0, 0x2, 0xab, 0x20, 0xe, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xe8, 0x54, 0x0, 0x0, 0x0, + 0xf, 0x7d, 0xa0, 0x0, 0x0, 0x9, 0xf3, 0x8f, + 0xb7, 0x55, 0x8e, 0xf8, 0x0, 0x5c, 0xef, 0xfe, + 0xb4, 0x0, + + /* U+FEDA "ﻚ" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x90, 0x0, 0x0, 0x2, 0x96, 0x0, + 0xe9, 0x0, 0x0, 0x0, 0x76, 0x0, 0xe, 0x90, + 0x0, 0x0, 0x0, 0x58, 0x0, 0xe9, 0x0, 0x0, + 0x2, 0xab, 0x20, 0xe, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe9, 0x0, 0x22, 0x0, 0x0, 0x0, + 0xf, 0x90, 0xd, 0xa0, 0x0, 0x0, 0x9, 0xfa, + 0x0, 0x9f, 0xb7, 0x55, 0x8e, 0xfd, 0xf8, 0x40, + 0x6c, 0xff, 0xfe, 0xa4, 0x9, 0xfa, + + /* U+FEDB "ï»›" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xb9, 0x0, 0x1, 0x7d, 0xfc, 0x40, 0x8, 0xff, + 0x93, 0x0, 0x3, 0xf9, 0x10, 0x0, 0x0, 0x3f, + 0x60, 0x0, 0x0, 0x0, 0xaf, 0x30, 0x0, 0x0, + 0x0, 0xce, 0x10, 0x0, 0x0, 0x1, 0xec, 0x0, + 0x0, 0x0, 0x5, 0xf4, 0x0, 0x0, 0x0, 0x3f, + 0x50, 0x1, 0x77, 0x7d, 0xf1, 0x0, 0x2f, 0xff, + 0xd4, 0x0, 0x0, + + /* U+FEDC "ﻜ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0x90, 0x0, 0x1, 0x7d, 0xfc, 0x40, 0x0, + 0x8f, 0xf9, 0x30, 0x0, 0x3, 0xf9, 0x10, 0x0, + 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x30, 0x0, 0x0, 0x0, 0xc, 0xe1, 0x0, 0x0, + 0x0, 0x1, 0xec, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x17, + 0x77, 0xdf, 0xaf, 0x97, 0x2f, 0xff, 0xd4, 0x8, + 0xef, + + /* U+FEDD "ï»" */ + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, + 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, + 0x0, 0x0, 0x0, 0x4, 0xf2, 0x36, 0x0, 0x0, + 0x5, 0xf2, 0xcb, 0x0, 0x0, 0x8, 0xf0, 0xd9, + 0x0, 0x0, 0x2e, 0xb0, 0x9f, 0x61, 0x37, 0xef, + 0x20, 0xa, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x13, + 0x30, 0x0, 0x0, + + /* U+FEDE "ﻞ" */ + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x25, 0x0, + 0x0, 0x5, 0xf4, 0x0, 0xbb, 0x0, 0x0, 0x8, + 0xfd, 0x71, 0xd9, 0x0, 0x0, 0x2e, 0xed, 0xf4, + 0x9f, 0x61, 0x37, 0xef, 0x30, 0x0, 0x1a, 0xff, + 0xff, 0xa2, 0x0, 0x0, 0x0, 0x13, 0x30, 0x0, + 0x0, 0x0, + + /* U+FEDF "ﻟ" */ + 0x0, 0x1f, 0x60, 0x1, 0xf6, 0x0, 0x1f, 0x60, + 0x1, 0xf6, 0x0, 0x1f, 0x60, 0x1, 0xf6, 0x0, + 0x1f, 0x60, 0x1, 0xf6, 0x0, 0x1f, 0x60, 0x2, + 0xf5, 0x17, 0xcf, 0x12, 0xfe, 0x60, + + /* U+FEE0 "ï» " */ + 0x0, 0x1f, 0x60, 0x0, 0x1, 0xf6, 0x0, 0x0, + 0x1f, 0x60, 0x0, 0x1, 0xf6, 0x0, 0x0, 0x1f, + 0x60, 0x0, 0x1, 0xf6, 0x0, 0x0, 0x1f, 0x60, + 0x0, 0x1, 0xf6, 0x0, 0x0, 0x1f, 0x60, 0x0, + 0x2, 0xf7, 0x0, 0x17, 0xcf, 0xe7, 0x32, 0xfe, + 0x8c, 0xf7, + + /* U+FEE1 "ﻡ" */ + 0x0, 0x2, 0x87, 0x10, 0x0, 0x2f, 0xff, 0xf3, + 0x0, 0xae, 0x11, 0xea, 0x3, 0xdd, 0x32, 0xea, + 0x5f, 0xbe, 0xff, 0xe3, 0xcb, 0x0, 0x23, 0x0, + 0xea, 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0x0, + 0xea, 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0x0, + + /* U+FEE2 "ﻢ" */ + 0x0, 0x7, 0xee, 0x60, 0x0, 0x0, 0x5f, 0xbb, + 0xf5, 0x0, 0x0, 0xbc, 0x0, 0xdc, 0x0, 0x5, + 0xee, 0x77, 0xff, 0xb7, 0x6f, 0x7a, 0xef, 0xdd, + 0xfd, 0xca, 0x0, 0x0, 0x0, 0x0, 0xea, 0x0, + 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0x0, 0x0, + 0xc9, 0x0, 0x0, 0x0, 0x0, + + /* U+FEE3 "ﻣ" */ + 0x0, 0x1, 0xbf, 0xd5, 0x0, 0x0, 0xce, 0x9d, + 0xf1, 0x0, 0x1f, 0x50, 0x3f, 0x41, 0x7c, 0xfb, + 0x7b, 0xf2, 0x2f, 0xe9, 0xdf, 0xe6, 0x0, + + /* U+FEE4 "ﻤ" */ + 0x0, 0x1, 0xbf, 0xc3, 0x0, 0x0, 0x0, 0xce, + 0x9d, 0xe1, 0x0, 0x0, 0x1f, 0x50, 0x4f, 0x50, + 0x1, 0x7c, 0xfb, 0x7a, 0xfe, 0x72, 0x2f, 0xe9, + 0xdf, 0xfb, 0xef, 0x60, + + /* U+FEE5 "ﻥ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x4, 0x50, 0x0, 0x0, 0x0, 0x5, 0xf2, 0x23, + 0x0, 0x0, 0x1, 0xf6, 0xbc, 0x0, 0x0, 0x0, + 0xf8, 0xda, 0x0, 0x0, 0x0, 0xf8, 0xc9, 0x0, + 0x0, 0x3, 0xf5, 0xad, 0x0, 0x0, 0xa, 0xe0, + 0x3f, 0xa4, 0x24, 0xaf, 0x60, 0x5, 0xef, 0xff, + 0xe5, 0x0, 0x0, 0x3, 0x42, 0x0, 0x0, + + /* U+FEE6 "ﻦ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x10, 0x7, 0xf0, 0x0, 0x24, 0x0, 0x0, 0x1, + 0xf7, 0x0, 0xac, 0x0, 0x0, 0x0, 0xff, 0x82, + 0xca, 0x0, 0x0, 0x0, 0xfe, 0xf5, 0xc9, 0x0, + 0x0, 0x2, 0xf5, 0x0, 0xad, 0x0, 0x0, 0x9, + 0xe0, 0x0, 0x3f, 0xa4, 0x24, 0xaf, 0x40, 0x0, + 0x5, 0xef, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x3, + 0x42, 0x0, 0x0, 0x0, + + /* U+FEE7 "ï»§" */ + 0x0, 0x3e, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x4, 0xc0, 0x0, 0x6f, 0x0, 0x7, 0xf0, 0x18, + 0xec, 0x2, 0xfc, 0x20, + + /* U+FEE8 "ﻨ" */ + 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x6f, 0x10, 0x0, + 0x7f, 0x20, 0x18, 0xef, 0xc7, 0x2f, 0xc8, 0xef, + + /* U+FEE9 "ﻩ" */ + 0x0, 0x10, 0x0, 0x2, 0xef, 0xd5, 0x0, 0xae, + 0x5a, 0xf7, 0xd, 0x90, 0x7, 0xf1, 0xe8, 0x0, + 0x3f, 0x3b, 0xe6, 0x6d, 0xe0, 0x2b, 0xfe, 0x91, + 0x0, + + /* U+FEEA "ﻪ" */ + 0x0, 0x17, 0xf2, 0x0, 0x7, 0xfe, 0xf3, 0x0, + 0x7f, 0x50, 0xf6, 0x0, 0xd9, 0x0, 0xda, 0x0, + 0x9f, 0xdf, 0xff, 0x95, 0x4, 0x75, 0x8, 0xfb, + + /* U+FEEB "ﻫ" */ + 0x0, 0x20, 0x0, 0x0, 0x0, 0x9, 0xe6, 0x0, + 0x0, 0x0, 0x2e, 0xfb, 0x0, 0x0, 0xa, 0xda, + 0xfc, 0x0, 0x0, 0xe7, 0xf, 0xfa, 0x0, 0xd, + 0xa4, 0xf7, 0xf3, 0x0, 0x9f, 0xee, 0xe, 0x71, + 0x7a, 0xff, 0xa5, 0xe6, 0x2f, 0xea, 0xae, 0xfa, + 0x0, + + /* U+FEEC "ﻬ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xf8, + 0x0, 0x0, 0x3f, 0x98, 0xf1, 0x0, 0x9, 0xd0, + 0x9e, 0x0, 0x17, 0xdd, 0xbf, 0x97, 0x32, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xbb, 0x6f, 0x60, 0x0, + 0x9, 0xe0, 0x7f, 0x0, 0x0, 0x3f, 0x77, 0xf0, + 0x0, 0x0, 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x12, + 0x0, 0x0, + + /* U+FEED "ï»­" */ + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+FEEE "ï»®" */ + 0x0, 0x8, 0xee, 0x40, 0x0, 0x0, 0x6f, 0xac, + 0xf1, 0x0, 0x0, 0xae, 0x1, 0xf6, 0x0, 0x0, + 0x6f, 0xa7, 0xfb, 0x73, 0x0, 0x8, 0xef, 0xff, + 0xf6, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x2e, 0xc0, 0x0, 0x12, 0x48, 0xee, 0x20, 0x0, + 0xaf, 0xff, 0xa1, 0x0, 0x0, 0x34, 0x20, 0x0, + 0x0, 0x0, + + /* U+FEEF "ﻯ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, + 0x40, 0x0, 0x5, 0xf7, 0x0, 0x10, 0x12, 0x0, + 0x9, 0xfe, 0x80, 0xc, 0xa0, 0x0, 0x2, 0x7e, + 0xb0, 0xf7, 0x0, 0x0, 0x0, 0xaf, 0xd, 0xc0, + 0x0, 0x2, 0x9f, 0x90, 0x4f, 0xfc, 0xcf, 0xff, + 0x90, 0x0, 0x28, 0xba, 0x85, 0x10, 0x0, + + /* U+FEF0 "ï»°" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xf8, 0x0, 0xbb, 0x0, 0x0, + 0xc, 0xd7, 0xf4, 0xe, 0x70, 0x0, 0x0, 0xbf, + 0x49, 0xe3, 0xe9, 0x0, 0x0, 0x1, 0xdb, 0xb, + 0x78, 0xf8, 0x31, 0x24, 0x9f, 0x60, 0x0, 0x8, + 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x34, + 0x42, 0x0, 0x0, 0x0, + + /* U+FEF1 "ï»±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, + 0x40, 0x0, 0x4, 0xf8, 0x10, 0x10, 0x24, 0x0, + 0x8, 0xff, 0xa1, 0xc, 0xa0, 0x0, 0x0, 0x5e, + 0xc0, 0xf7, 0x0, 0x0, 0x0, 0xbf, 0xb, 0xd1, + 0x0, 0x4, 0xaf, 0x70, 0x1c, 0xfd, 0xef, 0xfb, + 0x40, 0x0, 0x3, 0x55, 0x30, 0x0, 0x0, 0x0, + 0x1f, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, + 0x0, 0x0, + + /* U+FEF2 "ﻲ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xf8, 0x0, 0xbb, 0x0, 0x0, + 0xc, 0xd7, 0xf4, 0xe, 0x70, 0x0, 0x0, 0xbf, + 0x49, 0xe3, 0xe9, 0x0, 0x0, 0x1, 0xdb, 0xb, + 0x78, 0xf8, 0x31, 0x24, 0x9f, 0x60, 0x0, 0x8, + 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x34, + 0x42, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x3f, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, 0x0, 0x0, + 0x0, + + /* U+FEF3 "ﻳ" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x3, + 0xf4, 0xe0, 0x2, 0x2, + + /* U+FEF4 "ï»´" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, + 0x0, 0x0, 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, + + /* U+FEF5 "ﻵ" */ + 0x1a, 0x30, 0x19, 0x0, 0x0, 0x85, 0xad, 0xb4, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0xf8, 0x0, + 0x1f, 0x50, 0x0, 0xf8, 0x0, 0x9, 0xc0, 0x0, + 0xf8, 0x0, 0x2, 0xf3, 0x0, 0xf8, 0x0, 0x0, + 0xba, 0x0, 0xf8, 0x0, 0x0, 0x4f, 0x20, 0xf7, + 0x0, 0x0, 0xc, 0x90, 0xf6, 0x0, 0x0, 0x5, + 0xf4, 0xf3, 0x0, 0x0, 0x0, 0xef, 0xe0, 0x0, + 0x0, 0x0, 0xbf, 0x50, 0x0, 0x8, 0x7c, 0xf7, + 0x0, 0x0, 0xb, 0xfc, 0x40, 0x0, + + /* U+FEF6 "ï»¶" */ + 0x1a, 0x30, 0x19, 0x0, 0x0, 0x0, 0x85, 0xad, + 0xb4, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0xf8, 0x0, 0x0, 0x1f, 0x50, 0x0, 0xf8, 0x0, + 0x0, 0x9, 0xc0, 0x0, 0xf8, 0x0, 0x0, 0x2, + 0xf3, 0x0, 0xf8, 0x0, 0x0, 0x0, 0xba, 0x0, + 0xf8, 0x0, 0x0, 0x0, 0x4f, 0x20, 0xf8, 0x0, + 0x0, 0x0, 0xc, 0x90, 0xf8, 0x0, 0x0, 0x0, + 0x5, 0xf4, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xcd, 0x0, + 0x0, 0x8, 0x7c, 0xf6, 0x3f, 0xa4, 0x0, 0xb, + 0xfc, 0x40, 0x7, 0xfb, + + /* U+FEF7 "ï»·" */ + 0x9, 0xc3, 0x0, 0x0, 0x2, 0xa0, 0x0, 0x0, + 0x0, 0x1d, 0x52, 0x0, 0x0, 0x2, 0xed, 0x50, + 0x0, 0x0, 0x2, 0x0, 0x0, 0xf, 0x80, 0x2e, + 0x30, 0x0, 0xf8, 0x0, 0xbb, 0x0, 0xf, 0x80, + 0x3, 0xf2, 0x0, 0xf8, 0x0, 0xc, 0x90, 0xf, + 0x80, 0x0, 0x5f, 0x10, 0xf7, 0x0, 0x0, 0xd8, + 0xf, 0x60, 0x0, 0x6, 0xe4, 0xf3, 0x0, 0x0, + 0xe, 0xee, 0x0, 0x0, 0x0, 0xbf, 0x50, 0x0, + 0x87, 0xcf, 0x70, 0x0, 0xb, 0xfc, 0x40, 0x0, + + /* U+FEF8 "ﻸ" */ + 0x9, 0xc3, 0x0, 0x0, 0x0, 0x2, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0x52, 0x0, 0x0, 0x0, + 0x2, 0xed, 0x50, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0xf, 0x80, 0x0, 0x2e, 0x30, 0x0, 0xf8, + 0x0, 0x0, 0xbb, 0x0, 0xf, 0x80, 0x0, 0x3, + 0xf2, 0x0, 0xf8, 0x0, 0x0, 0xc, 0x90, 0xf, + 0x80, 0x0, 0x0, 0x5f, 0x10, 0xf8, 0x0, 0x0, + 0x0, 0xd8, 0xf, 0x80, 0x0, 0x0, 0x6, 0xe4, + 0xf8, 0x0, 0x0, 0x0, 0xe, 0xef, 0x90, 0x0, + 0x0, 0x0, 0xbf, 0xdd, 0x0, 0x0, 0x87, 0xcf, + 0x73, 0xfa, 0x40, 0xb, 0xfc, 0x40, 0x7, 0xfb, + + /* U+FEF9 "ﻹ" */ + 0x0, 0x0, 0x0, 0xf8, 0x2e, 0x30, 0x0, 0xf8, + 0xb, 0xb0, 0x0, 0xf8, 0x3, 0xf2, 0x0, 0xf8, + 0x0, 0xc9, 0x0, 0xf8, 0x0, 0x5f, 0x10, 0xf7, + 0x0, 0xd, 0x80, 0xf6, 0x0, 0x6, 0xe4, 0xf3, + 0x0, 0x0, 0xee, 0xe0, 0x0, 0x0, 0xbf, 0x50, + 0x8, 0x7c, 0xf7, 0x0, 0xb, 0xfc, 0x40, 0x0, + 0x5c, 0x70, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, + 0x9d, 0xa0, 0x0, 0x0, 0x54, 0x0, 0x0, 0x0, + + /* U+FEFA "ﻺ" */ + 0x0, 0x0, 0x0, 0xf8, 0x0, 0x2e, 0x30, 0x0, + 0xf8, 0x0, 0xb, 0xb0, 0x0, 0xf8, 0x0, 0x3, + 0xf2, 0x0, 0xf8, 0x0, 0x0, 0xc9, 0x0, 0xf8, + 0x0, 0x0, 0x5f, 0x10, 0xf8, 0x0, 0x0, 0xd, + 0x80, 0xf8, 0x0, 0x0, 0x6, 0xe4, 0xf8, 0x0, + 0x0, 0x0, 0xee, 0xf9, 0x0, 0x0, 0x0, 0xbf, + 0xdd, 0x0, 0x8, 0x7c, 0xf7, 0x3f, 0xa4, 0xb, + 0xfc, 0x40, 0x7, 0xfb, 0x5c, 0x70, 0x0, 0x0, + 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x9d, 0xa0, + 0x0, 0x0, 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, + + /* U+FEFB "ï»»" */ + 0x0, 0x0, 0x0, 0xf8, 0x2e, 0x30, 0x0, 0xf8, + 0xb, 0xb0, 0x0, 0xf8, 0x3, 0xf2, 0x0, 0xf8, + 0x0, 0xc9, 0x0, 0xf8, 0x0, 0x5f, 0x10, 0xf7, + 0x0, 0xd, 0x80, 0xf6, 0x0, 0x6, 0xe4, 0xf3, + 0x0, 0x0, 0xee, 0xe0, 0x0, 0x0, 0xbf, 0x50, + 0x8, 0x7c, 0xf7, 0x0, 0xb, 0xfc, 0x40, 0x0, + + /* U+FEFC "ﻼ" */ + 0x0, 0x0, 0x0, 0xf8, 0x0, 0x2e, 0x30, 0x0, + 0xf8, 0x0, 0xb, 0xb0, 0x0, 0xf8, 0x0, 0x3, + 0xf2, 0x0, 0xf8, 0x0, 0x0, 0xc9, 0x0, 0xf8, + 0x0, 0x0, 0x5f, 0x10, 0xf8, 0x0, 0x0, 0xd, + 0x80, 0xf8, 0x0, 0x0, 0x6, 0xe4, 0xf8, 0x0, + 0x0, 0x0, 0xee, 0xf9, 0x0, 0x0, 0x0, 0xbf, + 0xdd, 0x0, 0x8, 0x7c, 0xf7, 0x3f, 0xa4, 0xb, + 0xfc, 0x40, 0x7, 0xfb, + + /* U+FEFF "" */ + +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 81, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 103, .box_w = 2, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12, .adv_w = 118, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 25, .adv_w = 215, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 97, .adv_w = 163, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 157, .adv_w = 243, .box_w = 15, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 247, .adv_w = 200, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 313, .adv_w = 70, .box_w = 2, .box_h = 5, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 318, .adv_w = 100, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 348, .adv_w = 100, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 378, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 410, .adv_w = 215, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 471, .adv_w = 81, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 477, .adv_w = 92, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 485, .adv_w = 81, .box_w = 3, .box_h = 2, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 488, .adv_w = 86, .box_w = 6, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 527, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 581, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 629, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 677, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 725, .adv_w = 163, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 785, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 833, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 887, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 935, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 989, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1043, .adv_w = 86, .box_w = 3, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1055, .adv_w = 86, .box_w = 3, .box_h = 10, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1070, .adv_w = 215, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1125, .adv_w = 215, .box_w = 11, .box_h = 6, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1158, .adv_w = 215, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1213, .adv_w = 136, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1255, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1360, .adv_w = 175, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1426, .adv_w = 176, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1480, .adv_w = 179, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1546, .adv_w = 197, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1612, .adv_w = 162, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1666, .adv_w = 147, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1714, .adv_w = 198, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1786, .adv_w = 193, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1846, .adv_w = 76, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1864, .adv_w = 76, .box_w = 5, .box_h = 15, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 1902, .adv_w = 168, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1962, .adv_w = 143, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2010, .adv_w = 221, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2082, .adv_w = 192, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2142, .adv_w = 202, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2214, .adv_w = 154, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2268, .adv_w = 202, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2352, .adv_w = 178, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2412, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2466, .adv_w = 156, .box_w = 11, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2532, .adv_w = 187, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2592, .adv_w = 175, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2658, .adv_w = 253, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2754, .adv_w = 175, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2820, .adv_w = 156, .box_w = 11, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2886, .adv_w = 175, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2952, .adv_w = 100, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 2982, .adv_w = 86, .box_w = 6, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3021, .adv_w = 100, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3051, .adv_w = 215, .box_w = 11, .box_h = 5, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 3079, .adv_w = 128, .box_w = 10, .box_h = 2, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 3089, .adv_w = 128, .box_w = 5, .box_h = 3, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 3097, .adv_w = 157, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3138, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3192, .adv_w = 141, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3228, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3282, .adv_w = 158, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3323, .adv_w = 90, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3359, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3413, .adv_w = 162, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3461, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3473, .adv_w = 71, .box_w = 4, .box_h = 15, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 3503, .adv_w = 148, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3557, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3569, .adv_w = 249, .box_w = 14, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3632, .adv_w = 162, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3668, .adv_w = 157, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3709, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3763, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3817, .adv_w = 105, .box_w = 6, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3847, .adv_w = 133, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3883, .adv_w = 100, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3919, .adv_w = 162, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3955, .adv_w = 152, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3996, .adv_w = 209, .box_w = 13, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4055, .adv_w = 152, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4096, .adv_w = 152, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4150, .adv_w = 134, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4186, .adv_w = 163, .box_w = 7, .box_h = 16, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 4242, .adv_w = 86, .box_w = 2, .box_h = 16, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 4258, .adv_w = 163, .box_w = 7, .box_h = 16, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 4314, .adv_w = 215, .box_w = 11, .box_h = 4, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 4336, .adv_w = 171, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4377, .adv_w = 148, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4418, .adv_w = 106, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4450, .adv_w = 140, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4491, .adv_w = 167, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4527, .adv_w = 70, .box_w = 2, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4536, .adv_w = 89, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4559, .adv_w = 167, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4595, .adv_w = 166, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4636, .adv_w = 57, .box_w = 2, .box_h = 6, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 4642, .adv_w = 138, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4690, .adv_w = 135, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4726, .adv_w = 146, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4774, .adv_w = 170, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4815, .adv_w = 174, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4860, .adv_w = 70, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 4872, .adv_w = 103, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4895, .adv_w = 166, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4936, .adv_w = 160, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4986, .adv_w = 164, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 5034, .adv_w = 160, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5075, .adv_w = 138, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 5123, .adv_w = 152, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5164, .adv_w = 182, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 5229, .adv_w = 145, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5265, .adv_w = 181, .box_w = 11, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5315, .adv_w = 168, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5360, .adv_w = 163, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5435, .adv_w = 163, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5510, .adv_w = 194, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5560, .adv_w = 250, .box_w = 14, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5630, .adv_w = 83, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5636, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 5651, .adv_w = 81, .box_w = 3, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5666, .adv_w = 136, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5708, .adv_w = 120, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 5732, .adv_w = 71, .box_w = 7, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5785, .adv_w = 71, .box_w = 4, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5817, .adv_w = 124, .box_w = 8, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 5877, .adv_w = 71, .box_w = 4, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 5909, .adv_w = 200, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 5975, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5987, .adv_w = 241, .box_w = 13, .box_h = 9, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 6046, .adv_w = 134, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6078, .adv_w = 241, .box_w = 13, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6117, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6169, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 6234, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 6294, .adv_w = 165, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 6364, .adv_w = 114, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6389, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6424, .adv_w = 124, .box_w = 8, .box_h = 9, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 6460, .adv_w = 124, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 6508, .adv_w = 313, .box_w = 18, .box_h = 10, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 6598, .adv_w = 313, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 6724, .adv_w = 310, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 6832, .adv_w = 310, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 6940, .adv_w = 237, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7018, .adv_w = 237, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7096, .adv_w = 153, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 7166, .adv_w = 153, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 7241, .adv_w = 75, .box_w = 6, .box_h = 2, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7247, .adv_w = 265, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7337, .adv_w = 199, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 7421, .adv_w = 211, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7487, .adv_w = 186, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 7562, .adv_w = 159, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 7602, .adv_w = 188, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 7657, .adv_w = 134, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7682, .adv_w = 124, .box_w = 8, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 7722, .adv_w = 200, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 7777, .adv_w = 200, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 7843, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 7858, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 7873, .adv_w = 0, .box_w = 6, .box_h = 4, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 7885, .adv_w = 0, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 7894, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 7909, .adv_w = 0, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 7918, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 7933, .adv_w = 0, .box_w = 6, .box_h = 4, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 7945, .adv_w = 0, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 7954, .adv_w = 0, .box_w = 4, .box_h = 4, .ofs_x = 2, .ofs_y = 9}, + {.bitmap_index = 7962, .adv_w = 0, .box_w = 4, .box_h = 4, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 7970, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 7985, .adv_w = 128, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 7994, .adv_w = 138, .box_w = 3, .box_h = 2, .ofs_x = 3, .ofs_y = 4}, + {.bitmap_index = 7997, .adv_w = 138, .box_w = 4, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8017, .adv_w = 138, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8057, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8102, .adv_w = 138, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8141, .adv_w = 138, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8180, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8224, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8269, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8314, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8358, .adv_w = 138, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8393, .adv_w = 83, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 8413, .adv_w = 81, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 8419, .adv_w = 140, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 8455, .adv_w = 241, .box_w = 13, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8494, .adv_w = 199, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 8566, .adv_w = 0, .box_w = 2, .box_h = 5, .ofs_x = 3, .ofs_y = 10}, + {.bitmap_index = 8571, .adv_w = 75, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 8579, .adv_w = 241, .box_w = 13, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8644, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8696, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 8768, .adv_w = 241, .box_w = 13, .box_h = 9, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 8827, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8879, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 8951, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9003, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9075, .adv_w = 165, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9155, .adv_w = 165, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9235, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9300, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9360, .adv_w = 165, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9440, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9500, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9560, .adv_w = 114, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9602, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9637, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9672, .adv_w = 114, .box_w = 7, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9725, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9760, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9795, .adv_w = 114, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9837, .adv_w = 114, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9876, .adv_w = 114, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9918, .adv_w = 124, .box_w = 9, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 9990, .adv_w = 124, .box_w = 9, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 10053, .adv_w = 128, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 10098, .adv_w = 136, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 10139, .adv_w = 156, .box_w = 12, .box_h = 9, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 10193, .adv_w = 136, .box_w = 9, .box_h = 8, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 10229, .adv_w = 124, .box_w = 9, .box_h = 12, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 10283, .adv_w = 124, .box_w = 9, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 10346, .adv_w = 124, .box_w = 9, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 10409, .adv_w = 313, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 10517, .adv_w = 313, .box_w = 18, .box_h = 10, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 10607, .adv_w = 313, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 10733, .adv_w = 310, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 10841, .adv_w = 310, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 10967, .adv_w = 237, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11045, .adv_w = 153, .box_w = 10, .box_h = 17, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 11130, .adv_w = 265, .box_w = 15, .box_h = 9, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11198, .adv_w = 265, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 11288, .adv_w = 265, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 11393, .adv_w = 265, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 11498, .adv_w = 265, .box_w = 15, .box_h = 13, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 11596, .adv_w = 265, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 11701, .adv_w = 199, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 11785, .adv_w = 199, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 11881, .adv_w = 229, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11979, .adv_w = 270, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 12084, .adv_w = 229, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12182, .adv_w = 211, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12248, .adv_w = 211, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12325, .adv_w = 211, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 12419, .adv_w = 229, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12531, .adv_w = 229, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12643, .adv_w = 229, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12755, .adv_w = 229, .box_w = 14, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 12881, .adv_w = 229, .box_w = 14, .box_h = 20, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 13021, .adv_w = 229, .box_w = 14, .box_h = 18, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 13147, .adv_w = 186, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 13252, .adv_w = 186, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 13342, .adv_w = 186, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 13437, .adv_w = 186, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 13532, .adv_w = 188, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 13597, .adv_w = 188, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 13647, .adv_w = 188, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 13717, .adv_w = 188, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 13782, .adv_w = 188, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 13847, .adv_w = 179, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13892, .adv_w = 165, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 13962, .adv_w = 124, .box_w = 8, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 14018, .adv_w = 124, .box_w = 8, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 14078, .adv_w = 124, .box_w = 8, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 14142, .adv_w = 124, .box_w = 8, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 14198, .adv_w = 200, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 14253, .adv_w = 200, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 14314, .adv_w = 200, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 14391, .adv_w = 134, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 14416, .adv_w = 138, .box_w = 3, .box_h = 2, .ofs_x = 3, .ofs_y = 4}, + {.bitmap_index = 14419, .adv_w = 138, .box_w = 4, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14439, .adv_w = 138, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14479, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14524, .adv_w = 138, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14564, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14608, .adv_w = 138, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 14647, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14692, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14737, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14781, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14917, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15013, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15125, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15221, .adv_w = 176, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15287, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15415, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15543, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15669, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15797, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15905, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16033, .adv_w = 128, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16089, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16173, .adv_w = 288, .box_w = 18, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16317, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16413, .adv_w = 176, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16501, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 16581, .adv_w = 224, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 16707, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16812, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16910, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 16990, .adv_w = 224, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 17102, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17172, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17242, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17340, .adv_w = 224, .box_w = 14, .box_h = 4, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 17368, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17476, .adv_w = 320, .box_w = 20, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17636, .adv_w = 288, .box_w = 20, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 17796, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17924, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 17994, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 18064, .adv_w = 320, .box_w = 20, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18204, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 18300, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18428, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 18573, .adv_w = 224, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18678, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18790, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18888, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18986, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19082, .adv_w = 160, .box_w = 12, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 19178, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19290, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19402, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19510, .adv_w = 256, .box_w = 18, .box_h = 18, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 19672, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19768, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19918, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 20018, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 20118, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 20218, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 20318, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 20418, .adv_w = 320, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 20565, .adv_w = 224, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 20661, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20773, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 20918, .adv_w = 320, .box_w = 20, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21038, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21134, .adv_w = 258, .box_w = 17, .box_h = 11, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 21228, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 21300, .adv_w = 251, .box_w = 15, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 21375, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 21400, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 21430, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 21502, .adv_w = 251, .box_w = 15, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 21577, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 21602, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 21632, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 21704, .adv_w = 251, .box_w = 15, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 21779, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 21804, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 21834, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 21886, .adv_w = 251, .box_w = 15, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 21946, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 21971, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22001, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22053, .adv_w = 251, .box_w = 15, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22113, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22138, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22168, .adv_w = 241, .box_w = 13, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22233, .adv_w = 251, .box_w = 15, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22301, .adv_w = 71, .box_w = 6, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22334, .adv_w = 77, .box_w = 6, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22367, .adv_w = 265, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 22472, .adv_w = 265, .box_w = 16, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 22568, .adv_w = 122, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22616, .adv_w = 130, .box_w = 10, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22671, .adv_w = 265, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 22776, .adv_w = 265, .box_w = 16, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 22872, .adv_w = 122, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22920, .adv_w = 130, .box_w = 10, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22975, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 23035, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 23100, .adv_w = 158, .box_w = 10, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23160, .adv_w = 165, .box_w = 12, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23232, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 23297, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 23357, .adv_w = 158, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 23407, .adv_w = 165, .box_w = 12, .box_h = 10, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 23467, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 23527, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 23587, .adv_w = 158, .box_w = 10, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23647, .adv_w = 165, .box_w = 12, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23719, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 23779, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 23839, .adv_w = 158, .box_w = 10, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23899, .adv_w = 165, .box_w = 12, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23971, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 24006, .adv_w = 134, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 24051, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24086, .adv_w = 134, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24131, .adv_w = 114, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24173, .adv_w = 134, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24227, .adv_w = 114, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24269, .adv_w = 134, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24323, .adv_w = 124, .box_w = 9, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 24386, .adv_w = 141, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 24456, .adv_w = 124, .box_w = 9, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 24528, .adv_w = 141, .box_w = 10, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 24608, .adv_w = 229, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 24706, .adv_w = 229, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 24811, .adv_w = 122, .box_w = 9, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 24870, .adv_w = 141, .box_w = 10, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 24935, .adv_w = 229, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 25047, .adv_w = 229, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 25167, .adv_w = 122, .box_w = 9, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 25235, .adv_w = 141, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 25310, .adv_w = 229, .box_w = 14, .box_h = 20, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 25450, .adv_w = 229, .box_w = 15, .box_h = 21, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 25608, .adv_w = 122, .box_w = 9, .box_h = 20, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 25698, .adv_w = 141, .box_w = 10, .box_h = 20, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 25798, .adv_w = 229, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 25910, .adv_w = 229, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 26023, .adv_w = 122, .box_w = 9, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26086, .adv_w = 141, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26156, .adv_w = 188, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 26206, .adv_w = 195, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 26266, .adv_w = 188, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 26336, .adv_w = 195, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 26414, .adv_w = 71, .box_w = 6, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26447, .adv_w = 77, .box_w = 6, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26480, .adv_w = 179, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 26525, .adv_w = 162, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 26580, .adv_w = 135, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26621, .adv_w = 118, .box_w = 9, .box_h = 11, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 26671, .adv_w = 211, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 26748, .adv_w = 216, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 26839, .adv_w = 122, .box_w = 9, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26907, .adv_w = 141, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26982, .adv_w = 124, .box_w = 8, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27042, .adv_w = 132, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27117, .adv_w = 124, .box_w = 8, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27173, .adv_w = 132, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27243, .adv_w = 124, .box_w = 8, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27307, .adv_w = 132, .box_w = 10, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27387, .adv_w = 124, .box_w = 8, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27443, .adv_w = 132, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27513, .adv_w = 200, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 27590, .adv_w = 213, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 27668, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27693, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27723, .adv_w = 71, .box_w = 5, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 27736, .adv_w = 77, .box_w = 6, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 27751, .adv_w = 200, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 27806, .adv_w = 213, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 27858, .adv_w = 71, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 27878, .adv_w = 77, .box_w = 6, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 27902, .adv_w = 75, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 27915, .adv_w = 75, .box_w = 6, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 27957, .adv_w = 75, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 27970, .adv_w = 67, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 27978, .adv_w = 75, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 27988, .adv_w = 75, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 27996, .adv_w = 75, .box_w = 6, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28032, .adv_w = 75, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 28045, .adv_w = 75, .box_w = 6, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28087, .adv_w = 75, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 28095, .adv_w = 75, .box_w = 6, .box_h = 5, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 28110, .adv_w = 75, .box_w = 6, .box_h = 5, .ofs_x = -1, .ofs_y = 10}, + {.bitmap_index = 28125, .adv_w = 75, .box_w = 6, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28167, .adv_w = 75, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 28177, .adv_w = 75, .box_w = 6, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28219, .adv_w = 120, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 28243, .adv_w = 71, .box_w = 7, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28296, .adv_w = 78, .box_w = 7, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28349, .adv_w = 71, .box_w = 4, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 28383, .adv_w = 78, .box_w = 6, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 28434, .adv_w = 124, .box_w = 8, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 28494, .adv_w = 132, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 28569, .adv_w = 71, .box_w = 4, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 28601, .adv_w = 78, .box_w = 6, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 28649, .adv_w = 200, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 28715, .adv_w = 213, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 28787, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28812, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28842, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 28854, .adv_w = 78, .box_w = 5, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 28884, .adv_w = 241, .box_w = 13, .box_h = 9, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 28943, .adv_w = 251, .box_w = 15, .box_h = 9, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 29011, .adv_w = 71, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 29031, .adv_w = 77, .box_w = 6, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 29055, .adv_w = 134, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29087, .adv_w = 137, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29119, .adv_w = 241, .box_w = 13, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29158, .adv_w = 251, .box_w = 15, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29203, .adv_w = 71, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 29223, .adv_w = 77, .box_w = 6, .box_h = 8, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 29247, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29299, .adv_w = 251, .box_w = 15, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29359, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 29384, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 29414, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 29479, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 29539, .adv_w = 158, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 29589, .adv_w = 165, .box_w = 12, .box_h = 10, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 29649, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 29709, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 29774, .adv_w = 158, .box_w = 10, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 29809, .adv_w = 165, .box_w = 12, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 29851, .adv_w = 165, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 29921, .adv_w = 165, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 29991, .adv_w = 158, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 30036, .adv_w = 165, .box_w = 12, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 30090, .adv_w = 114, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 30115, .adv_w = 134, .box_w = 9, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 30147, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 30182, .adv_w = 134, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 30227, .adv_w = 124, .box_w = 8, .box_h = 9, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 30263, .adv_w = 141, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 30313, .adv_w = 124, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 30361, .adv_w = 141, .box_w = 10, .box_h = 12, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 30421, .adv_w = 313, .box_w = 18, .box_h = 10, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 30511, .adv_w = 326, .box_w = 20, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 30621, .adv_w = 215, .box_w = 14, .box_h = 6, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 30663, .adv_w = 228, .box_w = 16, .box_h = 6, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 30711, .adv_w = 313, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 30837, .adv_w = 326, .box_w = 20, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 30977, .adv_w = 215, .box_w = 14, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 31040, .adv_w = 228, .box_w = 16, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 31120, .adv_w = 310, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 31228, .adv_w = 314, .box_w = 19, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 31342, .adv_w = 217, .box_w = 14, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 31391, .adv_w = 222, .box_w = 16, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 31447, .adv_w = 310, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 31555, .adv_w = 314, .box_w = 19, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 31669, .adv_w = 217, .box_w = 14, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 31718, .adv_w = 222, .box_w = 16, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 31774, .adv_w = 237, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 31852, .adv_w = 243, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 31942, .adv_w = 204, .box_w = 13, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32020, .adv_w = 210, .box_w = 15, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32110, .adv_w = 237, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 32188, .adv_w = 243, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 32278, .adv_w = 204, .box_w = 13, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32356, .adv_w = 210, .box_w = 15, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32446, .adv_w = 153, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 32516, .adv_w = 136, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 32576, .adv_w = 153, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32617, .adv_w = 124, .box_w = 9, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32649, .adv_w = 153, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 32724, .adv_w = 136, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 32794, .adv_w = 134, .box_w = 9, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32844, .adv_w = 124, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32885, .adv_w = 265, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 32975, .adv_w = 265, .box_w = 16, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 33055, .adv_w = 122, .box_w = 8, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33095, .adv_w = 130, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33140, .adv_w = 199, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 33224, .adv_w = 214, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 33315, .adv_w = 122, .box_w = 8, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33355, .adv_w = 130, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33400, .adv_w = 211, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 33466, .adv_w = 216, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 33544, .adv_w = 122, .box_w = 9, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33603, .adv_w = 141, .box_w = 10, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33668, .adv_w = 186, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 33743, .adv_w = 194, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 33833, .adv_w = 78, .box_w = 5, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33863, .adv_w = 85, .box_w = 7, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33905, .adv_w = 159, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 33945, .adv_w = 170, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 33990, .adv_w = 137, .box_w = 9, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 34013, .adv_w = 148, .box_w = 11, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 34041, .adv_w = 188, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 34096, .adv_w = 195, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 34156, .adv_w = 71, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 34176, .adv_w = 77, .box_w = 6, .box_h = 8, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 34200, .adv_w = 134, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 34225, .adv_w = 137, .box_w = 8, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 34249, .adv_w = 135, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 34290, .adv_w = 118, .box_w = 9, .box_h = 11, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 34340, .adv_w = 124, .box_w = 8, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 34380, .adv_w = 132, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 34430, .adv_w = 200, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 34485, .adv_w = 213, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 34537, .adv_w = 200, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 34603, .adv_w = 213, .box_w = 13, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 34668, .adv_w = 71, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 34688, .adv_w = 77, .box_w = 6, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 34712, .adv_w = 146, .box_w = 10, .box_h = 14, .ofs_x = -2, .ofs_y = 0}, + {.bitmap_index = 34782, .adv_w = 153, .box_w = 12, .box_h = 14, .ofs_x = -2, .ofs_y = 0}, + {.bitmap_index = 34866, .adv_w = 146, .box_w = 9, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 34938, .adv_w = 153, .box_w = 11, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 35026, .adv_w = 146, .box_w = 8, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 35090, .adv_w = 153, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 35170, .adv_w = 146, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 35218, .adv_w = 153, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 35278, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_2[] = { + 0x0, 0x1, 0x3, 0x4, 0x6, 0xf, 0x15, 0x19 +}; + +static const uint8_t glyph_id_ofs_list_5[] = { + 0, 0, 0, 1, 0, 0, 0, 0, + 0, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 0, 0, 0, 19 +}; + +static const uint16_t unicode_list_7[] = { + 0x0, 0x1, 0x2, 0x5, 0x6, 0x8, 0xa, 0xf, + 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, + 0x32, 0x33, 0xe93b, 0xe942, 0xe945, 0xe946, 0xe947, 0xe94b, + 0xe94d, 0xe94f, 0xe953, 0xe956, 0xe95b, 0xe960, 0xe961, 0xe962, + 0xe978, 0xe97d, 0xe982, 0xe985, 0xe986, 0xe987, 0xe98b, 0xe98c, + 0xe98d, 0xe98e, 0xe9a1, 0xe9a2, 0xe9a8, 0xe9aa, 0xe9ab, 0xe9ae, + 0xe9b1, 0xe9b2, 0xe9b3, 0xe9b5, 0xe9cd, 0xe9cf, 0xe9fe, 0xe9ff, + 0xea01, 0xea03, 0xea1a, 0xea21, 0xea24, 0xea2d, 0xea56, 0xea5e, + 0xea95, 0xeb25, 0xeb7a, 0xeb7b, 0xeb7c, 0xeb7d, 0xeb7e, 0xebc1, + 0xebcd, 0xec27, 0xec3e, 0xee94, 0xf0fc, 0xf1dc +}; + +static const uint16_t unicode_list_9[] = { + 0x0, 0x1, 0x2, 0x3, 0x29, 0x2a, 0x2b, 0x2c, + 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x34, 0x35, + 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x52, 0x53, + 0x54, 0x55, 0x2c6, 0x2c7, 0x2c8, 0x2c9, 0x2ca +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 1488, .range_length = 27, .glyph_id_start = 96, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 1542, .range_length = 26, .glyph_id_start = 123, + .unicode_list = unicode_list_2, .glyph_id_ofs_list = NULL, .list_length = 8, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + }, + { + .range_start = 1569, .range_length = 26, .glyph_id_start = 131, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 1600, .range_length = 22, .glyph_id_start = 157, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 1623, .range_length = 30, .glyph_id_start = 179, + .unicode_list = NULL, .glyph_id_ofs_list = glyph_id_ofs_list_5, .list_length = 30, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL + }, + { + .range_start = 1657, .range_length = 71, .glyph_id_start = 199, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 1734, .range_length = 61917, .glyph_id_start = 270, + .unicode_list = unicode_list_7, .glyph_id_ofs_list = NULL, .list_length = 78, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + }, + { + .range_start = 64338, .range_length = 82, .glyph_id_start = 348, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 64426, .range_length = 715, .glyph_id_start = 430, + .unicode_list = unicode_list_9, .glyph_id_ofs_list = NULL, .list_length = 31, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + }, + { + .range_start = 65142, .range_length = 135, .glyph_id_start = 461, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 65279, .range_length = 1, .glyph_id_start = 596, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + } +}; + + + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = NULL, + .kern_scale = 0, + .cmap_num = 12, + .bpp = 4, + .kern_classes = 0, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_dejavu_16_persian_hebrew = { +#else +lv_font_t lv_font_dejavu_16_persian_hebrew = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 24, /*The maximum line height required by the font*/ + .base_line = 7, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_DEJAVU_16_PERSIAN_HEBREW*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_fmt_txt.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_fmt_txt.c new file mode 100644 index 0000000..7a36f01 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_fmt_txt.c @@ -0,0 +1,594 @@ +/** + * @file lv_font_fmt_txt.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_font.h" +#include "lv_font_fmt_txt.h" +#include "../misc/lv_assert.h" +#include "../misc/lv_types.h" +#include "../misc/lv_gc.h" +#include "../misc/lv_log.h" +#include "../misc/lv_utils.h" +#include "../misc/lv_mem.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef enum { + RLE_STATE_SINGLE = 0, + RLE_STATE_REPEATE, + RLE_STATE_COUNTER, +} rle_state_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static uint32_t get_glyph_dsc_id(const lv_font_t * font, uint32_t letter); +static int8_t get_kern_value(const lv_font_t * font, uint32_t gid_left, uint32_t gid_right); +static int32_t unicode_list_compare(const void * ref, const void * element); +static int32_t kern_pair_8_compare(const void * ref, const void * element); +static int32_t kern_pair_16_compare(const void * ref, const void * element); + +#if LV_USE_FONT_COMPRESSED + static void decompress(const uint8_t * in, uint8_t * out, lv_coord_t w, lv_coord_t h, uint8_t bpp, bool prefilter); + static inline void decompress_line(uint8_t * out, lv_coord_t w); + static inline uint8_t get_bits(const uint8_t * in, uint32_t bit_pos, uint8_t len); + static inline void bits_write(uint8_t * out, uint32_t bit_pos, uint8_t val, uint8_t len); + static inline void rle_init(const uint8_t * in, uint8_t bpp); + static inline uint8_t rle_next(void); +#endif /*LV_USE_FONT_COMPRESSED*/ + +/********************** + * STATIC VARIABLES + **********************/ +#if LV_USE_FONT_COMPRESSED + static uint32_t rle_rdp; + static const uint8_t * rle_in; + static uint8_t rle_bpp; + static uint8_t rle_prev_v; + static uint8_t rle_cnt; + static rle_state_t rle_state; +#endif /*LV_USE_FONT_COMPRESSED*/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Used as `get_glyph_bitmap` callback in LittelvGL's native font format if the font is uncompressed. + * @param font pointer to font + * @param unicode_letter a unicode letter which bitmap should be get + * @return pointer to the bitmap or NULL if not found + */ +const uint8_t * lv_font_get_bitmap_fmt_txt(const lv_font_t * font, uint32_t unicode_letter) +{ + if(unicode_letter == '\t') unicode_letter = ' '; + + lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc; + uint32_t gid = get_glyph_dsc_id(font, unicode_letter); + if(!gid) return NULL; + + const lv_font_fmt_txt_glyph_dsc_t * gdsc = &fdsc->glyph_dsc[gid]; + + if(fdsc->bitmap_format == LV_FONT_FMT_TXT_PLAIN) { + return &fdsc->glyph_bitmap[gdsc->bitmap_index]; + } + /*Handle compressed bitmap*/ + else { +#if LV_USE_FONT_COMPRESSED + static size_t last_buf_size = 0; + if(LV_GC_ROOT(_lv_font_decompr_buf) == NULL) last_buf_size = 0; + + uint32_t gsize = gdsc->box_w * gdsc->box_h; + if(gsize == 0) return NULL; + + uint32_t buf_size = gsize; + /*Compute memory size needed to hold decompressed glyph, rounding up*/ + switch(fdsc->bpp) { + case 1: + buf_size = (gsize + 7) >> 3; + break; + case 2: + buf_size = (gsize + 3) >> 2; + break; + case 3: + buf_size = (gsize + 1) >> 1; + break; + case 4: + buf_size = (gsize + 1) >> 1; + break; + } + + if(last_buf_size < buf_size) { + uint8_t * tmp = lv_mem_realloc(LV_GC_ROOT(_lv_font_decompr_buf), buf_size); + LV_ASSERT_MALLOC(tmp); + if(tmp == NULL) return NULL; + LV_GC_ROOT(_lv_font_decompr_buf) = tmp; + last_buf_size = buf_size; + } + + bool prefilter = fdsc->bitmap_format == LV_FONT_FMT_TXT_COMPRESSED ? true : false; + decompress(&fdsc->glyph_bitmap[gdsc->bitmap_index], LV_GC_ROOT(_lv_font_decompr_buf), gdsc->box_w, gdsc->box_h, + (uint8_t)fdsc->bpp, prefilter); + return LV_GC_ROOT(_lv_font_decompr_buf); +#else /*!LV_USE_FONT_COMPRESSED*/ + LV_LOG_WARN("Compressed fonts is used but LV_USE_FONT_COMPRESSED is not enabled in lv_conf.h"); + return NULL; +#endif + } + + /*If not returned earlier then the letter is not found in this font*/ + return NULL; +} + +/** + * Used as `get_glyph_dsc` callback in LittelvGL's native font format if the font is uncompressed. + * @param font_p pointer to font + * @param dsc_out store the result descriptor here + * @param letter a UNICODE letter code + * @return true: descriptor is successfully loaded into `dsc_out`. + * false: the letter was not found, no data is loaded to `dsc_out` + */ +bool lv_font_get_glyph_dsc_fmt_txt(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, + uint32_t unicode_letter_next) +{ + bool is_tab = false; + if(unicode_letter == '\t') { + unicode_letter = ' '; + is_tab = true; + } + lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc; + uint32_t gid = get_glyph_dsc_id(font, unicode_letter); + if(!gid) return false; + + int8_t kvalue = 0; + if(fdsc->kern_dsc) { + uint32_t gid_next = get_glyph_dsc_id(font, unicode_letter_next); + if(gid_next) { + kvalue = get_kern_value(font, gid, gid_next); + } + } + + /*Put together a glyph dsc*/ + const lv_font_fmt_txt_glyph_dsc_t * gdsc = &fdsc->glyph_dsc[gid]; + + int32_t kv = ((int32_t)((int32_t)kvalue * fdsc->kern_scale) >> 4); + + uint32_t adv_w = gdsc->adv_w; + if(is_tab) adv_w *= 2; + + adv_w += kv; + adv_w = (adv_w + (1 << 3)) >> 4; + + dsc_out->adv_w = adv_w; + dsc_out->box_h = gdsc->box_h; + dsc_out->box_w = gdsc->box_w; + dsc_out->ofs_x = gdsc->ofs_x; + dsc_out->ofs_y = gdsc->ofs_y; + dsc_out->bpp = (uint8_t)fdsc->bpp; + dsc_out->is_placeholder = false; + + if(is_tab) dsc_out->box_w = dsc_out->box_w * 2; + + return true; +} + +/** + * Free the allocated memories. + */ +void _lv_font_clean_up_fmt_txt(void) +{ +#if LV_USE_FONT_COMPRESSED + if(LV_GC_ROOT(_lv_font_decompr_buf)) { + lv_mem_free(LV_GC_ROOT(_lv_font_decompr_buf)); + LV_GC_ROOT(_lv_font_decompr_buf) = NULL; + } +#endif +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static uint32_t get_glyph_dsc_id(const lv_font_t * font, uint32_t letter) +{ + if(letter == '\0') return 0; + + lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc; + + /*Check the cache first*/ + if(fdsc->cache && letter == fdsc->cache->last_letter) return fdsc->cache->last_glyph_id; + + uint16_t i; + for(i = 0; i < fdsc->cmap_num; i++) { + + /*Relative code point*/ + uint32_t rcp = letter - fdsc->cmaps[i].range_start; + if(rcp > fdsc->cmaps[i].range_length) continue; + uint32_t glyph_id = 0; + if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY) { + glyph_id = fdsc->cmaps[i].glyph_id_start + rcp; + } + else if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL) { + const uint8_t * gid_ofs_8 = fdsc->cmaps[i].glyph_id_ofs_list; + glyph_id = fdsc->cmaps[i].glyph_id_start + gid_ofs_8[rcp]; + } + else if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_SPARSE_TINY) { + uint16_t key = rcp; + uint16_t * p = _lv_utils_bsearch(&key, fdsc->cmaps[i].unicode_list, fdsc->cmaps[i].list_length, + sizeof(fdsc->cmaps[i].unicode_list[0]), unicode_list_compare); + + if(p) { + lv_uintptr_t ofs = p - fdsc->cmaps[i].unicode_list; + glyph_id = fdsc->cmaps[i].glyph_id_start + ofs; + } + } + else if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_SPARSE_FULL) { + uint16_t key = rcp; + uint16_t * p = _lv_utils_bsearch(&key, fdsc->cmaps[i].unicode_list, fdsc->cmaps[i].list_length, + sizeof(fdsc->cmaps[i].unicode_list[0]), unicode_list_compare); + + if(p) { + lv_uintptr_t ofs = p - fdsc->cmaps[i].unicode_list; + const uint16_t * gid_ofs_16 = fdsc->cmaps[i].glyph_id_ofs_list; + glyph_id = fdsc->cmaps[i].glyph_id_start + gid_ofs_16[ofs]; + } + } + + /*Update the cache*/ + if(fdsc->cache) { + fdsc->cache->last_letter = letter; + fdsc->cache->last_glyph_id = glyph_id; + } + return glyph_id; + } + + if(fdsc->cache) { + fdsc->cache->last_letter = letter; + fdsc->cache->last_glyph_id = 0; + } + return 0; + +} + +static int8_t get_kern_value(const lv_font_t * font, uint32_t gid_left, uint32_t gid_right) +{ + lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc; + + int8_t value = 0; + + if(fdsc->kern_classes == 0) { + /*Kern pairs*/ + const lv_font_fmt_txt_kern_pair_t * kdsc = fdsc->kern_dsc; + if(kdsc->glyph_ids_size == 0) { + /*Use binary search to find the kern value. + *The pairs are ordered left_id first, then right_id secondly.*/ + const uint16_t * g_ids = kdsc->glyph_ids; + uint16_t g_id_both = (gid_right << 8) + gid_left; /*Create one number from the ids*/ + uint16_t * kid_p = _lv_utils_bsearch(&g_id_both, g_ids, kdsc->pair_cnt, 2, kern_pair_8_compare); + + /*If the `g_id_both` were found get its index from the pointer*/ + if(kid_p) { + lv_uintptr_t ofs = kid_p - g_ids; + value = kdsc->values[ofs]; + } + } + else if(kdsc->glyph_ids_size == 1) { + /*Use binary search to find the kern value. + *The pairs are ordered left_id first, then right_id secondly.*/ + const uint32_t * g_ids = kdsc->glyph_ids; + uint32_t g_id_both = (gid_right << 16) + gid_left; /*Create one number from the ids*/ + uint32_t * kid_p = _lv_utils_bsearch(&g_id_both, g_ids, kdsc->pair_cnt, 4, kern_pair_16_compare); + + /*If the `g_id_both` were found get its index from the pointer*/ + if(kid_p) { + lv_uintptr_t ofs = kid_p - g_ids; + value = kdsc->values[ofs]; + } + + } + else { + /*Invalid value*/ + } + } + else { + /*Kern classes*/ + const lv_font_fmt_txt_kern_classes_t * kdsc = fdsc->kern_dsc; + uint8_t left_class = kdsc->left_class_mapping[gid_left]; + uint8_t right_class = kdsc->right_class_mapping[gid_right]; + + /*If class = 0, kerning not exist for that glyph + *else got the value form `class_pair_values` 2D array*/ + if(left_class > 0 && right_class > 0) { + value = kdsc->class_pair_values[(left_class - 1) * kdsc->right_class_cnt + (right_class - 1)]; + } + + } + return value; +} + +static int32_t kern_pair_8_compare(const void * ref, const void * element) +{ + const uint8_t * ref8_p = ref; + const uint8_t * element8_p = element; + + /*If the MSB is different it will matter. If not return the diff. of the LSB*/ + if(ref8_p[0] != element8_p[0]) return (int32_t)ref8_p[0] - element8_p[0]; + else return (int32_t) ref8_p[1] - element8_p[1]; + +} + +static int32_t kern_pair_16_compare(const void * ref, const void * element) +{ + const uint16_t * ref16_p = ref; + const uint16_t * element16_p = element; + + /*If the MSB is different it will matter. If not return the diff. of the LSB*/ + if(ref16_p[0] != element16_p[0]) return (int32_t)ref16_p[0] - element16_p[0]; + else return (int32_t) ref16_p[1] - element16_p[1]; +} + +#if LV_USE_FONT_COMPRESSED +/** + * The compress a glyph's bitmap + * @param in the compressed bitmap + * @param out buffer to store the result + * @param px_num number of pixels in the glyph (width * height) + * @param bpp bit per pixel (bpp = 3 will be converted to bpp = 4) + * @param prefilter true: the lines are XORed + */ +static void decompress(const uint8_t * in, uint8_t * out, lv_coord_t w, lv_coord_t h, uint8_t bpp, bool prefilter) +{ + uint32_t wrp = 0; + uint8_t wr_size = bpp; + if(bpp == 3) wr_size = 4; + + rle_init(in, bpp); + + uint8_t * line_buf1 = lv_mem_buf_get(w); + + uint8_t * line_buf2 = NULL; + + if(prefilter) { + line_buf2 = lv_mem_buf_get(w); + } + + decompress_line(line_buf1, w); + + lv_coord_t y; + lv_coord_t x; + + for(x = 0; x < w; x++) { + bits_write(out, wrp, line_buf1[x], bpp); + wrp += wr_size; + } + + for(y = 1; y < h; y++) { + if(prefilter) { + decompress_line(line_buf2, w); + + for(x = 0; x < w; x++) { + line_buf1[x] = line_buf2[x] ^ line_buf1[x]; + bits_write(out, wrp, line_buf1[x], bpp); + wrp += wr_size; + } + } + else { + decompress_line(line_buf1, w); + + for(x = 0; x < w; x++) { + bits_write(out, wrp, line_buf1[x], bpp); + wrp += wr_size; + } + } + } + + lv_mem_buf_release(line_buf1); + lv_mem_buf_release(line_buf2); +} + +/** + * Decompress one line. Store one pixel per byte + * @param out output buffer + * @param w width of the line in pixel count + */ +static inline void decompress_line(uint8_t * out, lv_coord_t w) +{ + lv_coord_t i; + for(i = 0; i < w; i++) { + out[i] = rle_next(); + } +} + +/** + * Read bits from an input buffer. The read can cross byte boundary. + * @param in the input buffer to read from. + * @param bit_pos index of the first bit to read. + * @param len number of bits to read (must be <= 8). + * @return the read bits + */ +static inline uint8_t get_bits(const uint8_t * in, uint32_t bit_pos, uint8_t len) +{ + uint8_t bit_mask; + switch(len) { + case 1: + bit_mask = 0x1; + break; + case 2: + bit_mask = 0x3; + break; + case 3: + bit_mask = 0x7; + break; + case 4: + bit_mask = 0xF; + break; + case 8: + bit_mask = 0xFF; + break; + default: + bit_mask = (uint16_t)((uint16_t) 1 << len) - 1; + } + + uint32_t byte_pos = bit_pos >> 3; + bit_pos = bit_pos & 0x7; + + if(bit_pos + len >= 8) { + uint16_t in16 = (in[byte_pos] << 8) + in[byte_pos + 1]; + return (in16 >> (16 - bit_pos - len)) & bit_mask; + } + else { + return (in[byte_pos] >> (8 - bit_pos - len)) & bit_mask; + } +} + +/** + * Write `val` data to `bit_pos` position of `out`. The write can NOT cross byte boundary. + * @param out buffer where to write + * @param bit_pos bit index to write + * @param val value to write + * @param len length of bits to write from `val`. (Counted from the LSB). + * @note `len == 3` will be converted to `len = 4` and `val` will be upscaled too + */ +static inline void bits_write(uint8_t * out, uint32_t bit_pos, uint8_t val, uint8_t len) +{ + if(len == 3) { + len = 4; + switch(val) { + case 0: + val = 0; + break; + case 1: + val = 2; + break; + case 2: + val = 4; + break; + case 3: + val = 6; + break; + case 4: + val = 9; + break; + case 5: + val = 11; + break; + case 6: + val = 13; + break; + case 7: + val = 15; + break; + } + } + + uint16_t byte_pos = bit_pos >> 3; + bit_pos = bit_pos & 0x7; + bit_pos = 8 - bit_pos - len; + + uint8_t bit_mask = (uint16_t)((uint16_t) 1 << len) - 1; + out[byte_pos] &= ((~bit_mask) << bit_pos); + out[byte_pos] |= (val << bit_pos); +} + +static inline void rle_init(const uint8_t * in, uint8_t bpp) +{ + rle_in = in; + rle_bpp = bpp; + rle_state = RLE_STATE_SINGLE; + rle_rdp = 0; + rle_prev_v = 0; + rle_cnt = 0; +} + +static inline uint8_t rle_next(void) +{ + uint8_t v = 0; + uint8_t ret = 0; + + if(rle_state == RLE_STATE_SINGLE) { + ret = get_bits(rle_in, rle_rdp, rle_bpp); + if(rle_rdp != 0 && rle_prev_v == ret) { + rle_cnt = 0; + rle_state = RLE_STATE_REPEATE; + } + + rle_prev_v = ret; + rle_rdp += rle_bpp; + } + else if(rle_state == RLE_STATE_REPEATE) { + v = get_bits(rle_in, rle_rdp, 1); + rle_cnt++; + rle_rdp += 1; + if(v == 1) { + ret = rle_prev_v; + if(rle_cnt == 11) { + rle_cnt = get_bits(rle_in, rle_rdp, 6); + rle_rdp += 6; + if(rle_cnt != 0) { + rle_state = RLE_STATE_COUNTER; + } + else { + ret = get_bits(rle_in, rle_rdp, rle_bpp); + rle_prev_v = ret; + rle_rdp += rle_bpp; + rle_state = RLE_STATE_SINGLE; + } + } + } + else { + ret = get_bits(rle_in, rle_rdp, rle_bpp); + rle_prev_v = ret; + rle_rdp += rle_bpp; + rle_state = RLE_STATE_SINGLE; + } + + } + else if(rle_state == RLE_STATE_COUNTER) { + ret = rle_prev_v; + rle_cnt--; + if(rle_cnt == 0) { + ret = get_bits(rle_in, rle_rdp, rle_bpp); + rle_prev_v = ret; + rle_rdp += rle_bpp; + rle_state = RLE_STATE_SINGLE; + } + } + + return ret; +} +#endif /*LV_USE_FONT_COMPRESSED*/ + +/** Code Comparator. + * + * Compares the value of both input arguments. + * + * @param[in] pRef Pointer to the reference. + * @param[in] pElement Pointer to the element to compare. + * + * @return Result of comparison. + * @retval < 0 Reference is less than element. + * @retval = 0 Reference is equal to element. + * @retval > 0 Reference is greater than element. + * + */ +static int32_t unicode_list_compare(const void * ref, const void * element) +{ + return ((int32_t)(*(uint16_t *)ref)) - ((int32_t)(*(uint16_t *)element)); +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_fmt_txt.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_fmt_txt.h new file mode 100644 index 0000000..86546a3 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_fmt_txt.h @@ -0,0 +1,240 @@ +/** + * @file lv_font_fmt_txt.h + * + */ + +#ifndef LV_FONT_FMT_TXT_H +#define LV_FONT_FMT_TXT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include +#include +#include "lv_font.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** This describes a glyph.*/ +typedef struct { +#if LV_FONT_FMT_TXT_LARGE == 0 + uint32_t bitmap_index : 20; /**< Start index of the bitmap. A font can be max 1 MB.*/ + uint32_t adv_w : 12; /**< Draw the next glyph after this width. 8.4 format (real_value * 16 is stored).*/ + uint8_t box_w; /**< Width of the glyph's bounding box*/ + uint8_t box_h; /**< Height of the glyph's bounding box*/ + int8_t ofs_x; /**< x offset of the bounding box*/ + int8_t ofs_y; /**< y offset of the bounding box. Measured from the top of the line*/ +#else + uint32_t bitmap_index; /**< Start index of the bitmap. A font can be max 4 GB.*/ + uint32_t adv_w; /**< Draw the next glyph after this width. 28.4 format (real_value * 16 is stored).*/ + uint16_t box_w; /**< Width of the glyph's bounding box*/ + uint16_t box_h; /**< Height of the glyph's bounding box*/ + int16_t ofs_x; /**< x offset of the bounding box*/ + int16_t ofs_y; /**< y offset of the bounding box. Measured from the top of the line*/ +#endif +} lv_font_fmt_txt_glyph_dsc_t; + +/** Format of font character map.*/ +enum { + LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL, + LV_FONT_FMT_TXT_CMAP_SPARSE_FULL, + LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY, + LV_FONT_FMT_TXT_CMAP_SPARSE_TINY, +}; + +typedef uint8_t lv_font_fmt_txt_cmap_type_t; + +/** + * Map codepoints to a `glyph_dsc`s + * Several formats are supported to optimize memory usage + * See https://github.com/lvgl/lv_font_conv/blob/master/doc/font_spec.md + */ +typedef struct { + /** First Unicode character for this range*/ + uint32_t range_start; + + /** Number of Unicode characters related to this range. + * Last Unicode character = range_start + range_length - 1*/ + uint16_t range_length; + + /** First glyph ID (array index of `glyph_dsc`) for this range*/ + uint16_t glyph_id_start; + + /* + According the specification there are 4 formats: + https://github.com/lvgl/lv_font_conv/blob/master/doc/font_spec.md + + For simplicity introduce "relative code point": + rcp = codepoint - range_start + + and a search function: + search a "value" in an "array" and returns the index of "value". + + Format 0 tiny + unicode_list == NULL && glyph_id_ofs_list == NULL + glyph_id = glyph_id_start + rcp + + Format 0 full + unicode_list == NULL && glyph_id_ofs_list != NULL + glyph_id = glyph_id_start + glyph_id_ofs_list[rcp] + + Sparse tiny + unicode_list != NULL && glyph_id_ofs_list == NULL + glyph_id = glyph_id_start + search(unicode_list, rcp) + + Sparse full + unicode_list != NULL && glyph_id_ofs_list != NULL + glyph_id = glyph_id_start + glyph_id_ofs_list[search(unicode_list, rcp)] + */ + + const uint16_t * unicode_list; + + /** if(type == LV_FONT_FMT_TXT_CMAP_FORMAT0_...) it's `uint8_t *` + * if(type == LV_FONT_FMT_TXT_CMAP_SPARSE_...) it's `uint16_t *` + */ + const void * glyph_id_ofs_list; + + /** Length of `unicode_list` and/or `glyph_id_ofs_list`*/ + uint16_t list_length; + + /** Type of this character map*/ + lv_font_fmt_txt_cmap_type_t type; +} lv_font_fmt_txt_cmap_t; + +/** A simple mapping of kern values from pairs*/ +typedef struct { + /*To get a kern value of two code points: + 1. Get the `glyph_id_left` and `glyph_id_right` from `lv_font_fmt_txt_cmap_t + 2. for(i = 0; i < pair_cnt * 2; i += 2) + if(gylph_ids[i] == glyph_id_left && + gylph_ids[i+1] == glyph_id_right) + return values[i / 2]; + */ + const void * glyph_ids; + const int8_t * values; + uint32_t pair_cnt : 30; + uint32_t glyph_ids_size : 2; /*0: `glyph_ids` is stored as `uint8_t`; 1: as `uint16_t`*/ +} lv_font_fmt_txt_kern_pair_t; + +/** More complex but more optimal class based kern value storage*/ +typedef struct { + /*To get a kern value of two code points: + 1. Get the `glyph_id_left` and `glyph_id_right` from `lv_font_fmt_txt_cmap_t + 2. Get the class of the left and right glyphs as `left_class` and `right_class` + left_class = left_class_mapping[glyph_id_left]; + right_class = right_class_mapping[glyph_id_right]; + 3. value = class_pair_values[(left_class-1)*right_class_cnt + (right_class-1)] + */ + + const int8_t * class_pair_values; /*left_class_cnt * right_class_cnt value*/ + const uint8_t * left_class_mapping; /*Map the glyph_ids to classes: index -> glyph_id -> class_id*/ + const uint8_t * right_class_mapping; /*Map the glyph_ids to classes: index -> glyph_id -> class_id*/ + uint8_t left_class_cnt; + uint8_t right_class_cnt; +} lv_font_fmt_txt_kern_classes_t; + +/** Bitmap formats*/ +typedef enum { + LV_FONT_FMT_TXT_PLAIN = 0, + LV_FONT_FMT_TXT_COMPRESSED = 1, + LV_FONT_FMT_TXT_COMPRESSED_NO_PREFILTER = 1, +} lv_font_fmt_txt_bitmap_format_t; + +typedef struct { + uint32_t last_letter; + uint32_t last_glyph_id; +} lv_font_fmt_txt_glyph_cache_t; + +/*Describe store additional data for fonts*/ +typedef struct { + /*The bitmaps of all glyphs*/ + const uint8_t * glyph_bitmap; + + /*Describe the glyphs*/ + const lv_font_fmt_txt_glyph_dsc_t * glyph_dsc; + + /*Map the glyphs to Unicode characters. + *Array of `lv_font_cmap_fmt_txt_t` variables*/ + const lv_font_fmt_txt_cmap_t * cmaps; + + /** + * Store kerning values. + * Can be `lv_font_fmt_txt_kern_pair_t * or `lv_font_kern_classes_fmt_txt_t *` + * depending on `kern_classes` + */ + const void * kern_dsc; + + /*Scale kern values in 12.4 format*/ + uint16_t kern_scale; + + /*Number of cmap tables*/ + uint16_t cmap_num : 9; + + /*Bit per pixel: 1, 2, 3, 4, 8*/ + uint16_t bpp : 4; + + /*Type of `kern_dsc`*/ + uint16_t kern_classes : 1; + + /* + * storage format of the bitmap + * from `lv_font_fmt_txt_bitmap_format_t` + */ + uint16_t bitmap_format : 2; + + /*Cache the last letter and is glyph id*/ + lv_font_fmt_txt_glyph_cache_t * cache; +} lv_font_fmt_txt_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Used as `get_glyph_bitmap` callback in LittelvGL's native font format if the font is uncompressed. + * @param font pointer to font + * @param unicode_letter a unicode letter which bitmap should be get + * @return pointer to the bitmap or NULL if not found + */ +const uint8_t * lv_font_get_bitmap_fmt_txt(const lv_font_t * font, uint32_t letter); + +/** + * Used as `get_glyph_dsc` callback in LittelvGL's native font format if the font is uncompressed. + * @param font_p pointer to font + * @param dsc_out store the result descriptor here + * @param letter a UNICODE letter code + * @return true: descriptor is successfully loaded into `dsc_out`. + * false: the letter was not found, no data is loaded to `dsc_out` + */ +bool lv_font_get_glyph_dsc_fmt_txt(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, + uint32_t unicode_letter_next); + +/** + * Free the allocated memories. + */ +void _lv_font_clean_up_fmt_txt(void); + +/********************** + * MACROS + **********************/ + +/********************** + * ADD BUILT IN FONTS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FONT_FMT_TXT_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_loader.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_loader.c new file mode 100644 index 0000000..f7c061b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_loader.c @@ -0,0 +1,681 @@ +/** + * @file lv_font_loader.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include +#include + +#include "../lvgl.h" +#include "../misc/lv_fs.h" +#include "lv_font_loader.h" + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_fs_file_t * fp; + int8_t bit_pos; + uint8_t byte_value; +} bit_iterator_t; + +typedef struct font_header_bin { + uint32_t version; + uint16_t tables_count; + uint16_t font_size; + uint16_t ascent; + int16_t descent; + uint16_t typo_ascent; + int16_t typo_descent; + uint16_t typo_line_gap; + int16_t min_y; + int16_t max_y; + uint16_t default_advance_width; + uint16_t kerning_scale; + uint8_t index_to_loc_format; + uint8_t glyph_id_format; + uint8_t advance_width_format; + uint8_t bits_per_pixel; + uint8_t xy_bits; + uint8_t wh_bits; + uint8_t advance_width_bits; + uint8_t compression_id; + uint8_t subpixels_mode; + uint8_t padding; + int16_t underline_position; + uint16_t underline_thickness; +} font_header_bin_t; + +typedef struct cmap_table_bin { + uint32_t data_offset; + uint32_t range_start; + uint16_t range_length; + uint16_t glyph_id_start; + uint16_t data_entries_count; + uint8_t format_type; + uint8_t padding; +} cmap_table_bin_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static bit_iterator_t init_bit_iterator(lv_fs_file_t * fp); +static bool lvgl_load_font(lv_fs_file_t * fp, lv_font_t * font); +int32_t load_kern(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, uint8_t format, uint32_t start); + +static int read_bits_signed(bit_iterator_t * it, int n_bits, lv_fs_res_t * res); +static unsigned int read_bits(bit_iterator_t * it, int n_bits, lv_fs_res_t * res); + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Loads a `lv_font_t` object from a binary font file + * @param font_name filename where the font file is located + * @return a pointer to the font or NULL in case of error + */ +lv_font_t * lv_font_load(const char * font_name) +{ + lv_fs_file_t file; + lv_fs_res_t res = lv_fs_open(&file, font_name, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) + return NULL; + + lv_font_t * font = lv_mem_alloc(sizeof(lv_font_t)); + if(font) { + memset(font, 0, sizeof(lv_font_t)); + if(!lvgl_load_font(&file, font)) { + LV_LOG_WARN("Error loading font file: %s\n", font_name); + /* + * When `lvgl_load_font` fails it can leak some pointers. + * All non-null pointers can be assumed as allocated and + * `lv_font_free` should free them correctly. + */ + lv_font_free(font); + font = NULL; + } + } + + lv_fs_close(&file); + + return font; +} + +/** + * Frees the memory allocated by the `lv_font_load()` function + * @param font lv_font_t object created by the lv_font_load function + */ +void lv_font_free(lv_font_t * font) +{ + if(NULL != font) { + lv_font_fmt_txt_dsc_t * dsc = (lv_font_fmt_txt_dsc_t *)font->dsc; + + if(NULL != dsc) { + + if(dsc->kern_classes == 0) { + lv_font_fmt_txt_kern_pair_t * kern_dsc = + (lv_font_fmt_txt_kern_pair_t *)dsc->kern_dsc; + + if(NULL != kern_dsc) { + if(kern_dsc->glyph_ids) + lv_mem_free((void *)kern_dsc->glyph_ids); + + if(kern_dsc->values) + lv_mem_free((void *)kern_dsc->values); + + lv_mem_free((void *)kern_dsc); + } + } + else { + lv_font_fmt_txt_kern_classes_t * kern_dsc = + (lv_font_fmt_txt_kern_classes_t *)dsc->kern_dsc; + + if(NULL != kern_dsc) { + if(kern_dsc->class_pair_values) + lv_mem_free((void *)kern_dsc->class_pair_values); + + if(kern_dsc->left_class_mapping) + lv_mem_free((void *)kern_dsc->left_class_mapping); + + if(kern_dsc->right_class_mapping) + lv_mem_free((void *)kern_dsc->right_class_mapping); + + lv_mem_free((void *)kern_dsc); + } + } + + lv_font_fmt_txt_cmap_t * cmaps = + (lv_font_fmt_txt_cmap_t *)dsc->cmaps; + + if(NULL != cmaps) { + for(int i = 0; i < dsc->cmap_num; ++i) { + if(NULL != cmaps[i].glyph_id_ofs_list) + lv_mem_free((void *)cmaps[i].glyph_id_ofs_list); + if(NULL != cmaps[i].unicode_list) + lv_mem_free((void *)cmaps[i].unicode_list); + } + lv_mem_free(cmaps); + } + + if(NULL != dsc->glyph_bitmap) { + lv_mem_free((void *)dsc->glyph_bitmap); + } + if(NULL != dsc->glyph_dsc) { + lv_mem_free((void *)dsc->glyph_dsc); + } + lv_mem_free(dsc); + } + lv_mem_free(font); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bit_iterator_t init_bit_iterator(lv_fs_file_t * fp) +{ + bit_iterator_t it; + it.fp = fp; + it.bit_pos = -1; + it.byte_value = 0; + return it; +} + +static unsigned int read_bits(bit_iterator_t * it, int n_bits, lv_fs_res_t * res) +{ + unsigned int value = 0; + while(n_bits--) { + it->byte_value = it->byte_value << 1; + it->bit_pos--; + + if(it->bit_pos < 0) { + it->bit_pos = 7; + *res = lv_fs_read(it->fp, &(it->byte_value), 1, NULL); + if(*res != LV_FS_RES_OK) { + return 0; + } + } + int8_t bit = (it->byte_value & 0x80) ? 1 : 0; + + value |= (bit << n_bits); + } + *res = LV_FS_RES_OK; + return value; +} + +static int read_bits_signed(bit_iterator_t * it, int n_bits, lv_fs_res_t * res) +{ + unsigned int value = read_bits(it, n_bits, res); + if(value & (1 << (n_bits - 1))) { + value |= ~0u << n_bits; + } + return value; +} + +static int read_label(lv_fs_file_t * fp, int start, const char * label) +{ + lv_fs_seek(fp, start, LV_FS_SEEK_SET); + + uint32_t length; + char buf[4]; + + if(lv_fs_read(fp, &length, 4, NULL) != LV_FS_RES_OK + || lv_fs_read(fp, buf, 4, NULL) != LV_FS_RES_OK + || memcmp(label, buf, 4) != 0) { + LV_LOG_WARN("Error reading '%s' label.", label); + return -1; + } + + return length; +} + +static bool load_cmaps_tables(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, + uint32_t cmaps_start, cmap_table_bin_t * cmap_table) +{ + if(lv_fs_read(fp, cmap_table, font_dsc->cmap_num * sizeof(cmap_table_bin_t), NULL) != LV_FS_RES_OK) { + return false; + } + + for(unsigned int i = 0; i < font_dsc->cmap_num; ++i) { + lv_fs_res_t res = lv_fs_seek(fp, cmaps_start + cmap_table[i].data_offset, LV_FS_SEEK_SET); + if(res != LV_FS_RES_OK) { + return false; + } + + lv_font_fmt_txt_cmap_t * cmap = (lv_font_fmt_txt_cmap_t *) & (font_dsc->cmaps[i]); + + cmap->range_start = cmap_table[i].range_start; + cmap->range_length = cmap_table[i].range_length; + cmap->glyph_id_start = cmap_table[i].glyph_id_start; + cmap->type = cmap_table[i].format_type; + + switch(cmap_table[i].format_type) { + case LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL: { + uint8_t ids_size = sizeof(uint8_t) * cmap_table[i].data_entries_count; + uint8_t * glyph_id_ofs_list = lv_mem_alloc(ids_size); + + cmap->glyph_id_ofs_list = glyph_id_ofs_list; + + if(lv_fs_read(fp, glyph_id_ofs_list, ids_size, NULL) != LV_FS_RES_OK) { + return false; + } + + cmap->list_length = cmap->range_length; + break; + } + case LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY: + break; + case LV_FONT_FMT_TXT_CMAP_SPARSE_FULL: + case LV_FONT_FMT_TXT_CMAP_SPARSE_TINY: { + uint32_t list_size = sizeof(uint16_t) * cmap_table[i].data_entries_count; + uint16_t * unicode_list = (uint16_t *)lv_mem_alloc(list_size); + + cmap->unicode_list = unicode_list; + cmap->list_length = cmap_table[i].data_entries_count; + + if(lv_fs_read(fp, unicode_list, list_size, NULL) != LV_FS_RES_OK) { + return false; + } + + if(cmap_table[i].format_type == LV_FONT_FMT_TXT_CMAP_SPARSE_FULL) { + uint16_t * buf = lv_mem_alloc(sizeof(uint16_t) * cmap->list_length); + + cmap->glyph_id_ofs_list = buf; + + if(lv_fs_read(fp, buf, sizeof(uint16_t) * cmap->list_length, NULL) != LV_FS_RES_OK) { + return false; + } + } + break; + } + default: + LV_LOG_WARN("Unknown cmaps format type %d.", cmap_table[i].format_type); + return false; + } + } + return true; +} + +static int32_t load_cmaps(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, uint32_t cmaps_start) +{ + int32_t cmaps_length = read_label(fp, cmaps_start, "cmap"); + if(cmaps_length < 0) { + return -1; + } + + uint32_t cmaps_subtables_count; + if(lv_fs_read(fp, &cmaps_subtables_count, sizeof(uint32_t), NULL) != LV_FS_RES_OK) { + return -1; + } + + lv_font_fmt_txt_cmap_t * cmaps = + lv_mem_alloc(cmaps_subtables_count * sizeof(lv_font_fmt_txt_cmap_t)); + + memset(cmaps, 0, cmaps_subtables_count * sizeof(lv_font_fmt_txt_cmap_t)); + + font_dsc->cmaps = cmaps; + font_dsc->cmap_num = cmaps_subtables_count; + + cmap_table_bin_t * cmaps_tables = lv_mem_alloc(sizeof(cmap_table_bin_t) * font_dsc->cmap_num); + + bool success = load_cmaps_tables(fp, font_dsc, cmaps_start, cmaps_tables); + + lv_mem_free(cmaps_tables); + + return success ? cmaps_length : -1; +} + +static int32_t load_glyph(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, + uint32_t start, uint32_t * glyph_offset, uint32_t loca_count, font_header_bin_t * header) +{ + int32_t glyph_length = read_label(fp, start, "glyf"); + if(glyph_length < 0) { + return -1; + } + + lv_font_fmt_txt_glyph_dsc_t * glyph_dsc = (lv_font_fmt_txt_glyph_dsc_t *) + lv_mem_alloc(loca_count * sizeof(lv_font_fmt_txt_glyph_dsc_t)); + + memset(glyph_dsc, 0, loca_count * sizeof(lv_font_fmt_txt_glyph_dsc_t)); + + font_dsc->glyph_dsc = glyph_dsc; + + int cur_bmp_size = 0; + + for(unsigned int i = 0; i < loca_count; ++i) { + lv_font_fmt_txt_glyph_dsc_t * gdsc = &glyph_dsc[i]; + + lv_fs_res_t res = lv_fs_seek(fp, start + glyph_offset[i], LV_FS_SEEK_SET); + if(res != LV_FS_RES_OK) { + return -1; + } + + bit_iterator_t bit_it = init_bit_iterator(fp); + + if(header->advance_width_bits == 0) { + gdsc->adv_w = header->default_advance_width; + } + else { + gdsc->adv_w = read_bits(&bit_it, header->advance_width_bits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + } + + if(header->advance_width_format == 0) { + gdsc->adv_w *= 16; + } + + gdsc->ofs_x = read_bits_signed(&bit_it, header->xy_bits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + + gdsc->ofs_y = read_bits_signed(&bit_it, header->xy_bits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + + gdsc->box_w = read_bits(&bit_it, header->wh_bits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + + gdsc->box_h = read_bits(&bit_it, header->wh_bits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + + int nbits = header->advance_width_bits + 2 * header->xy_bits + 2 * header->wh_bits; + int next_offset = (i < loca_count - 1) ? glyph_offset[i + 1] : (uint32_t)glyph_length; + int bmp_size = next_offset - glyph_offset[i] - nbits / 8; + + if(i == 0) { + gdsc->adv_w = 0; + gdsc->box_w = 0; + gdsc->box_h = 0; + gdsc->ofs_x = 0; + gdsc->ofs_y = 0; + } + + gdsc->bitmap_index = cur_bmp_size; + if(gdsc->box_w * gdsc->box_h != 0) { + cur_bmp_size += bmp_size; + } + } + + uint8_t * glyph_bmp = (uint8_t *)lv_mem_alloc(sizeof(uint8_t) * cur_bmp_size); + + font_dsc->glyph_bitmap = glyph_bmp; + + cur_bmp_size = 0; + + for(unsigned int i = 1; i < loca_count; ++i) { + lv_fs_res_t res = lv_fs_seek(fp, start + glyph_offset[i], LV_FS_SEEK_SET); + if(res != LV_FS_RES_OK) { + return -1; + } + bit_iterator_t bit_it = init_bit_iterator(fp); + + int nbits = header->advance_width_bits + 2 * header->xy_bits + 2 * header->wh_bits; + + read_bits(&bit_it, nbits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + + if(glyph_dsc[i].box_w * glyph_dsc[i].box_h == 0) { + continue; + } + + int next_offset = (i < loca_count - 1) ? glyph_offset[i + 1] : (uint32_t)glyph_length; + int bmp_size = next_offset - glyph_offset[i] - nbits / 8; + + if(nbits % 8 == 0) { /*Fast path*/ + if(lv_fs_read(fp, &glyph_bmp[cur_bmp_size], bmp_size, NULL) != LV_FS_RES_OK) { + return -1; + } + } + else { + for(int k = 0; k < bmp_size - 1; ++k) { + glyph_bmp[cur_bmp_size + k] = read_bits(&bit_it, 8, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + } + glyph_bmp[cur_bmp_size + bmp_size - 1] = read_bits(&bit_it, 8 - nbits % 8, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + + /*The last fragment should be on the MSB but read_bits() will place it to the LSB*/ + glyph_bmp[cur_bmp_size + bmp_size - 1] = glyph_bmp[cur_bmp_size + bmp_size - 1] << (nbits % 8); + + } + + cur_bmp_size += bmp_size; + } + return glyph_length; +} + +/* + * Loads a `lv_font_t` from a binary file, given a `lv_fs_file_t`. + * + * Memory allocations on `lvgl_load_font` should be immediately zeroed and + * the pointer should be set on the `lv_font_t` data before any possible return. + * + * When something fails, it returns `false` and the memory on the `lv_font_t` + * still needs to be freed using `lv_font_free`. + * + * `lv_font_free` will assume that all non-null pointers are allocated and + * should be freed. + */ +static bool lvgl_load_font(lv_fs_file_t * fp, lv_font_t * font) +{ + lv_font_fmt_txt_dsc_t * font_dsc = (lv_font_fmt_txt_dsc_t *) + lv_mem_alloc(sizeof(lv_font_fmt_txt_dsc_t)); + + memset(font_dsc, 0, sizeof(lv_font_fmt_txt_dsc_t)); + + font->dsc = font_dsc; + + /*header*/ + int32_t header_length = read_label(fp, 0, "head"); + if(header_length < 0) { + return false; + } + + font_header_bin_t font_header; + if(lv_fs_read(fp, &font_header, sizeof(font_header_bin_t), NULL) != LV_FS_RES_OK) { + return false; + } + + font->base_line = -font_header.descent; + font->line_height = font_header.ascent - font_header.descent; + font->get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt; + font->get_glyph_bitmap = lv_font_get_bitmap_fmt_txt; + font->subpx = font_header.subpixels_mode; + font->underline_position = font_header.underline_position; + font->underline_thickness = font_header.underline_thickness; + + font_dsc->bpp = font_header.bits_per_pixel; + font_dsc->kern_scale = font_header.kerning_scale; + font_dsc->bitmap_format = font_header.compression_id; + + /*cmaps*/ + uint32_t cmaps_start = header_length; + int32_t cmaps_length = load_cmaps(fp, font_dsc, cmaps_start); + if(cmaps_length < 0) { + return false; + } + + /*loca*/ + uint32_t loca_start = cmaps_start + cmaps_length; + int32_t loca_length = read_label(fp, loca_start, "loca"); + if(loca_length < 0) { + return false; + } + + uint32_t loca_count; + if(lv_fs_read(fp, &loca_count, sizeof(uint32_t), NULL) != LV_FS_RES_OK) { + return false; + } + + bool failed = false; + uint32_t * glyph_offset = lv_mem_alloc(sizeof(uint32_t) * (loca_count + 1)); + + if(font_header.index_to_loc_format == 0) { + for(unsigned int i = 0; i < loca_count; ++i) { + uint16_t offset; + if(lv_fs_read(fp, &offset, sizeof(uint16_t), NULL) != LV_FS_RES_OK) { + failed = true; + break; + } + glyph_offset[i] = offset; + } + } + else if(font_header.index_to_loc_format == 1) { + if(lv_fs_read(fp, glyph_offset, loca_count * sizeof(uint32_t), NULL) != LV_FS_RES_OK) { + failed = true; + } + } + else { + LV_LOG_WARN("Unknown index_to_loc_format: %d.", font_header.index_to_loc_format); + failed = true; + } + + if(failed) { + lv_mem_free(glyph_offset); + return false; + } + + /*glyph*/ + uint32_t glyph_start = loca_start + loca_length; + int32_t glyph_length = load_glyph( + fp, font_dsc, glyph_start, glyph_offset, loca_count, &font_header); + + lv_mem_free(glyph_offset); + + if(glyph_length < 0) { + return false; + } + + if(font_header.tables_count < 4) { + font_dsc->kern_dsc = NULL; + font_dsc->kern_classes = 0; + font_dsc->kern_scale = 0; + return true; + } + + uint32_t kern_start = glyph_start + glyph_length; + + int32_t kern_length = load_kern(fp, font_dsc, font_header.glyph_id_format, kern_start); + + return kern_length >= 0; +} + +int32_t load_kern(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, uint8_t format, uint32_t start) +{ + int32_t kern_length = read_label(fp, start, "kern"); + if(kern_length < 0) { + return -1; + } + + uint8_t kern_format_type; + int32_t padding; + if(lv_fs_read(fp, &kern_format_type, sizeof(uint8_t), NULL) != LV_FS_RES_OK || + lv_fs_read(fp, &padding, 3 * sizeof(uint8_t), NULL) != LV_FS_RES_OK) { + return -1; + } + + if(0 == kern_format_type) { /*sorted pairs*/ + lv_font_fmt_txt_kern_pair_t * kern_pair = lv_mem_alloc(sizeof(lv_font_fmt_txt_kern_pair_t)); + + memset(kern_pair, 0, sizeof(lv_font_fmt_txt_kern_pair_t)); + + font_dsc->kern_dsc = kern_pair; + font_dsc->kern_classes = 0; + + uint32_t glyph_entries; + if(lv_fs_read(fp, &glyph_entries, sizeof(uint32_t), NULL) != LV_FS_RES_OK) { + return -1; + } + + int ids_size; + if(format == 0) { + ids_size = sizeof(int8_t) * 2 * glyph_entries; + } + else { + ids_size = sizeof(int16_t) * 2 * glyph_entries; + } + + uint8_t * glyph_ids = lv_mem_alloc(ids_size); + int8_t * values = lv_mem_alloc(glyph_entries); + + kern_pair->glyph_ids_size = format; + kern_pair->pair_cnt = glyph_entries; + kern_pair->glyph_ids = glyph_ids; + kern_pair->values = values; + + if(lv_fs_read(fp, glyph_ids, ids_size, NULL) != LV_FS_RES_OK) { + return -1; + } + + if(lv_fs_read(fp, values, glyph_entries, NULL) != LV_FS_RES_OK) { + return -1; + } + } + else if(3 == kern_format_type) { /*array M*N of classes*/ + + lv_font_fmt_txt_kern_classes_t * kern_classes = lv_mem_alloc(sizeof(lv_font_fmt_txt_kern_classes_t)); + + memset(kern_classes, 0, sizeof(lv_font_fmt_txt_kern_classes_t)); + + font_dsc->kern_dsc = kern_classes; + font_dsc->kern_classes = 1; + + uint16_t kern_class_mapping_length; + uint8_t kern_table_rows; + uint8_t kern_table_cols; + + if(lv_fs_read(fp, &kern_class_mapping_length, sizeof(uint16_t), NULL) != LV_FS_RES_OK || + lv_fs_read(fp, &kern_table_rows, sizeof(uint8_t), NULL) != LV_FS_RES_OK || + lv_fs_read(fp, &kern_table_cols, sizeof(uint8_t), NULL) != LV_FS_RES_OK) { + return -1; + } + + int kern_values_length = sizeof(int8_t) * kern_table_rows * kern_table_cols; + + uint8_t * kern_left = lv_mem_alloc(kern_class_mapping_length); + uint8_t * kern_right = lv_mem_alloc(kern_class_mapping_length); + int8_t * kern_values = lv_mem_alloc(kern_values_length); + + kern_classes->left_class_mapping = kern_left; + kern_classes->right_class_mapping = kern_right; + kern_classes->left_class_cnt = kern_table_rows; + kern_classes->right_class_cnt = kern_table_cols; + kern_classes->class_pair_values = kern_values; + + if(lv_fs_read(fp, kern_left, kern_class_mapping_length, NULL) != LV_FS_RES_OK || + lv_fs_read(fp, kern_right, kern_class_mapping_length, NULL) != LV_FS_RES_OK || + lv_fs_read(fp, kern_values, kern_values_length, NULL) != LV_FS_RES_OK) { + return -1; + } + } + else { + LV_LOG_WARN("Unknown kern_format_type: %d", kern_format_type); + return -1; + } + + return kern_length; +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_loader.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_loader.h new file mode 100644 index 0000000..783cb2e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_loader.h @@ -0,0 +1,40 @@ +/** + * @file lv_font_loader.h + * + */ + +#ifndef LV_FONT_LOADER_H +#define LV_FONT_LOADER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_font_t * lv_font_load(const char * fontName); +void lv_font_free(lv_font_t * font); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FONT_LOADER_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_10.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_10.c new file mode 100644 index 0000000..485d9f6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_10.c @@ -0,0 +1,1663 @@ +/******************************************************************************* + * Size: 10 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 10 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_10.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_10 + #define LV_FONT_MONTSERRAT_10 1 +#endif + +#if LV_FONT_MONTSERRAT_10 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x3e, 0x2d, 0x2c, 0x1c, 0x5, 0x1, 0x2d, + + /* U+0022 "\"" */ + 0x57, 0x84, 0x56, 0x83, 0x23, 0x41, + + /* U+0023 "#" */ + 0x0, 0xb0, 0x28, 0x0, 0xb, 0x4, 0x60, 0x4a, + 0xea, 0xdc, 0x80, 0x28, 0x8, 0x20, 0x8c, 0xdb, + 0xeb, 0x40, 0x64, 0xb, 0x0, 0x8, 0x30, 0xb0, + 0x0, + + /* U+0024 "$" */ + 0x0, 0x13, 0x0, 0x8, 0xde, 0xc3, 0x5b, 0x27, + 0x11, 0x4d, 0x57, 0x0, 0x6, 0xce, 0x80, 0x0, + 0x29, 0x9a, 0x32, 0x27, 0x5b, 0x3c, 0xde, 0xb2, + 0x0, 0x27, 0x0, + + /* U+0025 "%" */ + 0x29, 0x92, 0x2, 0x90, 0x9, 0x11, 0x90, 0xa1, + 0x0, 0x82, 0x28, 0x74, 0x0, 0x1, 0x88, 0x49, + 0x68, 0x40, 0x0, 0xb, 0x29, 0xa, 0x0, 0x8, + 0x32, 0x80, 0xa0, 0x3, 0x80, 0x8, 0x87, 0x0, + + /* U+0026 "&" */ + 0x3, 0xcb, 0x70, 0x0, 0xa4, 0xd, 0x0, 0x5, + 0xba, 0x60, 0x0, 0x7c, 0xc0, 0x10, 0x5a, 0x7, + 0xbb, 0x37, 0x80, 0xa, 0xe0, 0xa, 0xcc, 0x97, + 0x70, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x57, 0x56, 0x23, + + /* U+0028 "(" */ + 0x2, 0xc0, 0x9, 0x60, 0xd, 0x10, 0xe, 0x0, + 0xe, 0x0, 0xe, 0x0, 0xd, 0x10, 0x9, 0x60, + 0x2, 0xc0, + + /* U+0029 ")" */ + 0x68, 0x0, 0xe0, 0xb, 0x30, 0x95, 0x8, 0x60, + 0x95, 0xb, 0x30, 0xe0, 0x68, 0x0, + + /* U+002A "*" */ + 0x24, 0x42, 0x4d, 0xd4, 0x79, 0x97, 0x2, 0x20, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0x85, 0x0, 0x3b, 0xdc, + 0xb1, 0x0, 0x85, 0x0, 0x0, 0x85, 0x0, + + /* U+002C "," */ + 0x35, 0x4a, 0x55, + + /* U+002D "-" */ + 0x5c, 0xc3, + + /* U+002E "." */ + 0x2, 0x6a, + + /* U+002F "/" */ + 0x0, 0x2, 0xb0, 0x0, 0x85, 0x0, 0xd, 0x0, + 0x4, 0x90, 0x0, 0xa3, 0x0, 0xd, 0x0, 0x5, + 0x80, 0x0, 0xb2, 0x0, 0x1c, 0x0, 0x0, + + /* U+0030 "0" */ + 0x4, 0xdd, 0xb1, 0x1, 0xe2, 0x6, 0xb0, 0x69, + 0x0, 0xe, 0x17, 0x80, 0x0, 0xd2, 0x69, 0x0, + 0xe, 0x11, 0xe2, 0x6, 0xb0, 0x4, 0xdd, 0xb1, + 0x0, + + /* U+0031 "1" */ + 0xbe, 0xa0, 0x5a, 0x5, 0xa0, 0x5a, 0x5, 0xa0, + 0x5a, 0x5, 0xa0, + + /* U+0032 "2" */ + 0x4c, 0xdd, 0x50, 0x42, 0x1, 0xf0, 0x0, 0x0, + 0xf0, 0x0, 0xa, 0x80, 0x0, 0xa9, 0x0, 0xb, + 0x80, 0x0, 0x8f, 0xdd, 0xd5, + + /* U+0033 "3" */ + 0x8d, 0xde, 0xe0, 0x0, 0xc, 0x40, 0x0, 0x98, + 0x0, 0x0, 0xbd, 0x90, 0x0, 0x0, 0xd3, 0x51, + 0x1, 0xe2, 0x6d, 0xdd, 0x60, + + /* U+0034 "4" */ + 0x0, 0x7, 0xa0, 0x0, 0x5, 0xc0, 0x0, 0x3, + 0xd1, 0x31, 0x1, 0xd2, 0xb, 0x30, 0x8d, 0xcc, + 0xfd, 0x70, 0x0, 0xb, 0x30, 0x0, 0x0, 0xb3, + 0x0, + + /* U+0035 "5" */ + 0xf, 0xdd, 0xd0, 0x1d, 0x0, 0x0, 0x2c, 0x0, + 0x0, 0x3e, 0xdc, 0x60, 0x0, 0x1, 0xd4, 0x31, + 0x0, 0xc4, 0x5c, 0xdd, 0x80, + + /* U+0036 "6" */ + 0x2, 0xbd, 0xd4, 0x1e, 0x40, 0x0, 0x6a, 0x0, + 0x0, 0x7a, 0xab, 0xa1, 0x6e, 0x10, 0x5c, 0x1d, + 0x0, 0x3c, 0x4, 0xcc, 0xb2, + + /* U+0037 "7" */ + 0xbd, 0xdd, 0xe8, 0xb4, 0x0, 0xd3, 0x0, 0x4, + 0xc0, 0x0, 0xc, 0x40, 0x0, 0x3d, 0x0, 0x0, + 0xa6, 0x0, 0x1, 0xe0, 0x0, + + /* U+0038 "8" */ + 0x7, 0xcc, 0xb2, 0x3d, 0x0, 0x6a, 0x2d, 0x0, + 0x79, 0xb, 0xec, 0xf2, 0x6a, 0x0, 0x4d, 0x79, + 0x0, 0x3e, 0x9, 0xcb, 0xc4, + + /* U+0039 "9" */ + 0x1a, 0xcc, 0x60, 0x96, 0x0, 0xb3, 0x97, 0x0, + 0xc9, 0x9, 0xbb, 0x8a, 0x0, 0x0, 0x88, 0x0, + 0x2, 0xe2, 0x2d, 0xdc, 0x40, + + /* U+003A ":" */ + 0x6a, 0x1, 0x0, 0x2, 0x6a, + + /* U+003B ";" */ + 0x6a, 0x1, 0x0, 0x0, 0x6a, 0x38, 0x32, + + /* U+003C "<" */ + 0x0, 0x0, 0x10, 0x0, 0x5a, 0xa1, 0x3e, 0x61, + 0x0, 0x6, 0xb9, 0x30, 0x0, 0x2, 0x81, + + /* U+003D "=" */ + 0x3b, 0xbb, 0xb1, 0x0, 0x0, 0x0, 0x3b, 0xbb, + 0xb1, + + /* U+003E ">" */ + 0x10, 0x0, 0x0, 0x2b, 0xa4, 0x0, 0x0, 0x18, + 0xe1, 0x4, 0xab, 0x50, 0x37, 0x10, 0x0, + + /* U+003F "?" */ + 0x3c, 0xdd, 0x50, 0x52, 0x1, 0xf0, 0x0, 0x3, + 0xd0, 0x0, 0x3d, 0x20, 0x0, 0x85, 0x0, 0x0, + 0x10, 0x0, 0x0, 0xb4, 0x0, + + /* U+0040 "@" */ + 0x0, 0x4a, 0x99, 0xa7, 0x0, 0x6, 0x90, 0x0, + 0x3, 0xa0, 0x1b, 0x7, 0xcb, 0x9b, 0x47, 0x65, + 0x4b, 0x0, 0x8b, 0xa, 0x73, 0x77, 0x0, 0x3b, + 0xa, 0x65, 0x3b, 0x0, 0x8b, 0xa, 0x1b, 0x6, + 0xcb, 0x6c, 0xb3, 0x6, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0x9a, 0xa2, 0x0, + + /* U+0041 "A" */ + 0x0, 0x1, 0xf6, 0x0, 0x0, 0x0, 0x88, 0xc0, + 0x0, 0x0, 0xd, 0x9, 0x40, 0x0, 0x6, 0x70, + 0x2b, 0x0, 0x0, 0xdc, 0xcc, 0xe3, 0x0, 0x59, + 0x0, 0x4, 0xa0, 0xc, 0x30, 0x0, 0xd, 0x10, + + /* U+0042 "B" */ + 0xfc, 0xcc, 0xb2, 0xf, 0x0, 0x7, 0xa0, 0xf0, + 0x0, 0x88, 0xf, 0xcc, 0xdf, 0x30, 0xf0, 0x0, + 0x2e, 0xf, 0x0, 0x1, 0xf0, 0xfc, 0xcc, 0xc5, + 0x0, + + /* U+0043 "C" */ + 0x1, 0x9d, 0xdc, 0x30, 0xd6, 0x0, 0x35, 0x5b, + 0x0, 0x0, 0x7, 0x80, 0x0, 0x0, 0x5b, 0x0, + 0x0, 0x0, 0xd6, 0x0, 0x35, 0x1, 0x9d, 0xdc, + 0x30, + + /* U+0044 "D" */ + 0xfd, 0xdd, 0xb3, 0xf, 0x0, 0x3, 0xe2, 0xf0, + 0x0, 0x6, 0x9f, 0x0, 0x0, 0x4b, 0xf0, 0x0, + 0x6, 0x9f, 0x0, 0x3, 0xe2, 0xfd, 0xdd, 0xb3, + 0x0, + + /* U+0045 "E" */ + 0xfd, 0xdd, 0xc0, 0xf0, 0x0, 0x0, 0xf0, 0x0, + 0x0, 0xfc, 0xcc, 0x70, 0xf0, 0x0, 0x0, 0xf0, + 0x0, 0x0, 0xfd, 0xdd, 0xd1, + + /* U+0046 "F" */ + 0xfd, 0xdd, 0xcf, 0x0, 0x0, 0xf0, 0x0, 0xf, + 0xdd, 0xd7, 0xf0, 0x0, 0xf, 0x0, 0x0, 0xf0, + 0x0, 0x0, + + /* U+0047 "G" */ + 0x1, 0x9d, 0xdc, 0x40, 0xd7, 0x0, 0x25, 0x5b, + 0x0, 0x0, 0x7, 0x80, 0x0, 0x7, 0x5b, 0x0, + 0x1, 0xd0, 0xd6, 0x0, 0x3d, 0x1, 0x9d, 0xdc, + 0x50, + + /* U+0048 "H" */ + 0xf0, 0x0, 0xf, 0x1f, 0x0, 0x0, 0xf1, 0xf0, + 0x0, 0xf, 0x1f, 0xdd, 0xdd, 0xf1, 0xf0, 0x0, + 0xf, 0x1f, 0x0, 0x0, 0xf1, 0xf0, 0x0, 0xf, + 0x10, + + /* U+0049 "I" */ + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + + /* U+004A "J" */ + 0x4, 0xdd, 0xf2, 0x0, 0x0, 0xd2, 0x0, 0x0, + 0xd2, 0x0, 0x0, 0xd2, 0x0, 0x0, 0xd2, 0x6, + 0x1, 0xe0, 0x8, 0xdd, 0x60, + + /* U+004B "K" */ + 0xf0, 0x0, 0xa8, 0xf, 0x0, 0x99, 0x0, 0xf0, + 0x99, 0x0, 0xf, 0x9f, 0x40, 0x0, 0xfb, 0x4e, + 0x20, 0xf, 0x10, 0x5d, 0x10, 0xf0, 0x0, 0x6b, + 0x0, + + /* U+004C "L" */ + 0xf0, 0x0, 0xf, 0x0, 0x0, 0xf0, 0x0, 0xf, + 0x0, 0x0, 0xf0, 0x0, 0xf, 0x0, 0x0, 0xfd, + 0xdd, 0xa0, + + /* U+004D "M" */ + 0xf2, 0x0, 0x0, 0x97, 0xfc, 0x0, 0x3, 0xf7, + 0xfa, 0x50, 0xc, 0xa7, 0xf1, 0xd0, 0x69, 0x77, + 0xf0, 0x79, 0xd1, 0x77, 0xf0, 0xd, 0x60, 0x77, + 0xf0, 0x1, 0x0, 0x77, + + /* U+004E "N" */ + 0xf4, 0x0, 0xf, 0x1f, 0xe2, 0x0, 0xf1, 0xf6, + 0xd0, 0xf, 0x1f, 0x9, 0xa0, 0xf1, 0xf0, 0xb, + 0x7f, 0x1f, 0x0, 0x1d, 0xf1, 0xf0, 0x0, 0x3f, + 0x10, + + /* U+004F "O" */ + 0x1, 0x9d, 0xdc, 0x40, 0xd, 0x60, 0x2, 0xd4, + 0x5b, 0x0, 0x0, 0x4b, 0x78, 0x0, 0x0, 0x1e, + 0x5b, 0x0, 0x0, 0x4b, 0xd, 0x60, 0x2, 0xd4, + 0x1, 0x9d, 0xdc, 0x40, + + /* U+0050 "P" */ + 0xfd, 0xdd, 0x90, 0xf0, 0x0, 0xa7, 0xf0, 0x0, + 0x5a, 0xf0, 0x0, 0xb6, 0xfd, 0xdc, 0x70, 0xf0, + 0x0, 0x0, 0xf0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x1, 0x9d, 0xdc, 0x40, 0x0, 0xc7, 0x0, 0x3d, + 0x40, 0x5b, 0x0, 0x0, 0x4b, 0x7, 0x80, 0x0, + 0x1, 0xe0, 0x5a, 0x0, 0x0, 0x4c, 0x0, 0xd6, + 0x0, 0x2d, 0x40, 0x1, 0xad, 0xdd, 0x40, 0x0, + 0x0, 0x4, 0xab, 0xa0, + + /* U+0052 "R" */ + 0xfd, 0xdd, 0x90, 0xf0, 0x0, 0xa7, 0xf0, 0x0, + 0x5a, 0xf0, 0x0, 0xb7, 0xfc, 0xcf, 0x90, 0xf0, + 0x5, 0xb0, 0xf0, 0x0, 0x97, + + /* U+0053 "S" */ + 0x8, 0xdc, 0xc3, 0x5b, 0x0, 0x11, 0x4d, 0x20, + 0x0, 0x6, 0xde, 0x90, 0x0, 0x1, 0x9a, 0x33, + 0x0, 0x5b, 0x3b, 0xcc, 0xb2, + + /* U+0054 "T" */ + 0xcd, 0xee, 0xda, 0x0, 0x97, 0x0, 0x0, 0x97, + 0x0, 0x0, 0x97, 0x0, 0x0, 0x97, 0x0, 0x0, + 0x97, 0x0, 0x0, 0x97, 0x0, + + /* U+0055 "U" */ + 0xf, 0x0, 0x1, 0xe0, 0xf0, 0x0, 0x1e, 0xf, + 0x0, 0x1, 0xe0, 0xf0, 0x0, 0x1e, 0xe, 0x0, + 0x2, 0xd0, 0xa7, 0x0, 0x98, 0x1, 0xad, 0xd9, + 0x0, + + /* U+0056 "V" */ + 0xc, 0x40, 0x0, 0x1d, 0x0, 0x5b, 0x0, 0x8, + 0x70, 0x0, 0xe2, 0x0, 0xe1, 0x0, 0x7, 0x90, + 0x69, 0x0, 0x0, 0x1e, 0x1d, 0x20, 0x0, 0x0, + 0x9c, 0xb0, 0x0, 0x0, 0x2, 0xf4, 0x0, 0x0, + + /* U+0057 "W" */ + 0x88, 0x0, 0xf, 0x40, 0x2, 0xc3, 0xd0, 0x5, + 0xea, 0x0, 0x86, 0xd, 0x20, 0xa4, 0xe0, 0xd, + 0x10, 0x88, 0xd, 0xa, 0x43, 0xc0, 0x2, 0xd5, + 0x90, 0x4a, 0x86, 0x0, 0xd, 0xd3, 0x0, 0xed, + 0x10, 0x0, 0x8e, 0x0, 0xa, 0xc0, 0x0, + + /* U+0058 "X" */ + 0x5c, 0x0, 0x1d, 0x10, 0x98, 0xb, 0x50, 0x0, + 0xda, 0x90, 0x0, 0x6, 0xf2, 0x0, 0x1, 0xd7, + 0xc0, 0x0, 0xc5, 0xa, 0x80, 0x8a, 0x0, 0xd, + 0x30, + + /* U+0059 "Y" */ + 0xb, 0x50, 0x0, 0xc3, 0x2, 0xd0, 0x6, 0x90, + 0x0, 0x88, 0x1d, 0x10, 0x0, 0xd, 0xb6, 0x0, + 0x0, 0x5, 0xd0, 0x0, 0x0, 0x4, 0xb0, 0x0, + 0x0, 0x4, 0xb0, 0x0, + + /* U+005A "Z" */ + 0x6d, 0xdd, 0xdf, 0x10, 0x0, 0xb, 0x70, 0x0, + 0x8, 0xa0, 0x0, 0x4, 0xd0, 0x0, 0x2, 0xe2, + 0x0, 0x0, 0xd4, 0x0, 0x0, 0x8f, 0xdd, 0xdd, + 0x30, + + /* U+005B "[" */ + 0xfb, 0x1f, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0xf, 0x0, 0xfb, 0x10, + + /* U+005C "\\" */ + 0x3a, 0x0, 0x0, 0xc1, 0x0, 0x7, 0x60, 0x0, + 0x1c, 0x0, 0x0, 0xb2, 0x0, 0x5, 0x80, 0x0, + 0xd, 0x0, 0x0, 0xa3, 0x0, 0x4, 0x90, + + /* U+005D "]" */ + 0x9e, 0x40, 0xb4, 0xb, 0x40, 0xb4, 0xb, 0x40, + 0xb4, 0xb, 0x40, 0xb4, 0x9e, 0x40, + + /* U+005E "^" */ + 0x0, 0xa8, 0x0, 0x2, 0x9b, 0x0, 0x9, 0x25, + 0x60, 0x1b, 0x0, 0xb0, + + /* U+005F "_" */ + 0x99, 0x99, 0x90, + + /* U+0060 "`" */ + 0x3a, 0x30, + + /* U+0061 "a" */ + 0x1b, 0xcd, 0x60, 0x1, 0x0, 0xe0, 0x1a, 0xaa, + 0xf1, 0x78, 0x0, 0xe1, 0x2c, 0xaa, 0xe1, + + /* U+0062 "b" */ + 0x1e, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x1e, + 0xac, 0xd6, 0x1, 0xf3, 0x1, 0xe2, 0x1e, 0x0, + 0xa, 0x51, 0xf4, 0x1, 0xe2, 0x1d, 0x9c, 0xd5, + 0x0, + + /* U+0063 "c" */ + 0x7, 0xdd, 0xa0, 0x5c, 0x0, 0x40, 0x87, 0x0, + 0x0, 0x5c, 0x0, 0x41, 0x7, 0xdd, 0xa0, + + /* U+0064 "d" */ + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe, 0x8, 0xdc, + 0x9e, 0x5c, 0x0, 0x7e, 0x87, 0x0, 0x1e, 0x5b, + 0x0, 0x6e, 0x8, 0xdb, 0x8e, + + /* U+0065 "e" */ + 0x8, 0xcc, 0x90, 0x5a, 0x0, 0x87, 0x8c, 0xaa, + 0xa8, 0x5b, 0x0, 0x20, 0x7, 0xdc, 0xb1, + + /* U+0066 "f" */ + 0x7, 0xc9, 0xe, 0x0, 0x9f, 0xb6, 0xf, 0x0, + 0xf, 0x0, 0xf, 0x0, 0xf, 0x0, + + /* U+0067 "g" */ + 0x8, 0xdc, 0x9e, 0x5b, 0x0, 0x5f, 0x87, 0x0, + 0xf, 0x5c, 0x0, 0x6f, 0x7, 0xdc, 0x9f, 0x3, + 0x0, 0x4c, 0x1a, 0xcc, 0xb2, + + /* U+0068 "h" */ + 0x1e, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x1e, 0xac, + 0xd4, 0x1f, 0x30, 0x3d, 0x1e, 0x0, 0xe, 0x1e, + 0x0, 0xf, 0x1e, 0x0, 0xf, + + /* U+0069 "i" */ + 0x2d, 0x0, 0x10, 0x1e, 0x1, 0xe0, 0x1e, 0x1, + 0xe0, 0x1e, 0x0, + + /* U+006A "j" */ + 0x1, 0xe0, 0x0, 0x10, 0x0, 0xe0, 0x0, 0xe0, + 0x0, 0xe0, 0x0, 0xe0, 0x0, 0xe0, 0x1, 0xe0, + 0xad, 0x60, + + /* U+006B "k" */ + 0x1e, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x1e, + 0x1, 0xb6, 0x1, 0xe2, 0xd5, 0x0, 0x1f, 0xde, + 0x20, 0x1, 0xf2, 0x5d, 0x0, 0x1e, 0x0, 0x7b, + 0x0, + + /* U+006C "l" */ + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + + /* U+006D "m" */ + 0x1e, 0xab, 0xc5, 0xbb, 0xc2, 0x1f, 0x20, 0x5f, + 0x10, 0x69, 0x1e, 0x0, 0x2c, 0x0, 0x4b, 0x1e, + 0x0, 0x2c, 0x0, 0x4b, 0x1e, 0x0, 0x2c, 0x0, + 0x4b, + + /* U+006E "n" */ + 0x1e, 0xab, 0xc4, 0x1f, 0x20, 0x3d, 0x1e, 0x0, + 0xe, 0x1e, 0x0, 0xf, 0x1e, 0x0, 0xf, + + /* U+006F "o" */ + 0x7, 0xdd, 0xb1, 0x5c, 0x0, 0x7b, 0x87, 0x0, + 0x1e, 0x5c, 0x0, 0x7b, 0x7, 0xdd, 0xb1, + + /* U+0070 "p" */ + 0x1e, 0xab, 0xd6, 0x1, 0xf3, 0x1, 0xd2, 0x1e, + 0x0, 0xa, 0x51, 0xf4, 0x1, 0xe2, 0x1e, 0xac, + 0xd5, 0x1, 0xe0, 0x0, 0x0, 0x1e, 0x0, 0x0, + 0x0, + + /* U+0071 "q" */ + 0x8, 0xdc, 0x8e, 0x5c, 0x0, 0x7e, 0x87, 0x0, + 0x1e, 0x5c, 0x0, 0x7e, 0x8, 0xdc, 0x8e, 0x0, + 0x0, 0xe, 0x0, 0x0, 0xe, + + /* U+0072 "r" */ + 0x1d, 0xaa, 0x1f, 0x30, 0x1e, 0x0, 0x1e, 0x0, + 0x1e, 0x0, + + /* U+0073 "s" */ + 0x2c, 0xcc, 0x48, 0x80, 0x0, 0x2a, 0xca, 0x21, + 0x0, 0x6a, 0x6c, 0xcc, 0x30, + + /* U+0074 "t" */ + 0xf, 0x0, 0x9f, 0xb6, 0xf, 0x0, 0xf, 0x0, + 0xe, 0x10, 0x7, 0xd9, + + /* U+0075 "u" */ + 0x2d, 0x0, 0x1d, 0x2d, 0x0, 0x1d, 0x2d, 0x0, + 0x1d, 0xe, 0x10, 0x6d, 0x6, 0xdb, 0x9d, + + /* U+0076 "v" */ + 0xc, 0x30, 0x9, 0x50, 0x5a, 0x1, 0xd0, 0x0, + 0xd2, 0x86, 0x0, 0x6, 0x9d, 0x0, 0x0, 0xe, + 0x80, 0x0, + + /* U+0077 "w" */ + 0xb2, 0x1, 0xf1, 0x2, 0xb5, 0x80, 0x7b, 0x80, + 0x85, 0xd, 0xd, 0x1d, 0xd, 0x0, 0x89, 0x90, + 0x99, 0x80, 0x2, 0xf2, 0x2, 0xf2, 0x0, + + /* U+0078 "x" */ + 0x5b, 0x3, 0xc0, 0x8, 0x9c, 0x10, 0x0, 0xe7, + 0x0, 0xa, 0x7c, 0x20, 0x79, 0x2, 0xd1, + + /* U+0079 "y" */ + 0xc, 0x30, 0x9, 0x50, 0x5a, 0x1, 0xd0, 0x0, + 0xd2, 0x77, 0x0, 0x6, 0x9d, 0x0, 0x0, 0xe, + 0x80, 0x0, 0x0, 0xd1, 0x0, 0xc, 0xd6, 0x0, + 0x0, + + /* U+007A "z" */ + 0x6b, 0xbe, 0xb0, 0x2, 0xd1, 0x1, 0xd2, 0x0, + 0xc4, 0x0, 0x8e, 0xbb, 0x90, + + /* U+007B "{" */ + 0x4, 0xd3, 0x9, 0x50, 0xa, 0x50, 0xa, 0x40, + 0x5f, 0x10, 0xa, 0x40, 0xa, 0x50, 0x9, 0x50, + 0x4, 0xd3, + + /* U+007C "|" */ + 0xee, 0xee, 0xee, 0xee, 0xe0, + + /* U+007D "}" */ + 0xab, 0x0, 0xd2, 0xd, 0x20, 0xc2, 0x9, 0xc0, + 0xc2, 0xd, 0x20, 0xd2, 0xab, 0x0, + + /* U+007E "~" */ + 0x1a, 0x91, 0x62, 0x44, 0x29, 0x90, + + /* U+00B0 "°" */ + 0x7, 0x81, 0x62, 0x8, 0x62, 0x8, 0x7, 0x81, + + /* U+2022 "•" */ + 0x19, 0x23, 0xe4, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x4, 0x9c, 0x10, 0x0, 0x16, + 0xbf, 0xff, 0xf2, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0x20, 0x5, 0xff, 0xd9, 0x41, 0xf2, 0x0, 0x5f, + 0x20, 0x0, 0x1f, 0x20, 0x5, 0xe0, 0x0, 0x1, + 0xf2, 0x0, 0x5e, 0x0, 0x7, 0x9f, 0x20, 0x48, + 0xe0, 0x7, 0xff, 0xf2, 0xaf, 0xfe, 0x0, 0x2b, + 0xd8, 0x7, 0xff, 0x90, 0x0, 0x0, 0x0, 0x1, + 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x41, 0x88, 0x88, 0x88, 0x14, 0xeb, 0xe7, 0x77, + 0x7e, 0xbe, 0xa2, 0xd0, 0x0, 0xd, 0x2a, 0xeb, + 0xe3, 0x33, 0x3e, 0xbe, 0xb4, 0xfb, 0xbb, 0xbf, + 0x4b, 0xd9, 0xd0, 0x0, 0xd, 0x9d, 0xb5, 0xd0, + 0x0, 0xd, 0x5b, 0xb7, 0xff, 0xff, 0xff, 0x7b, + + /* U+F00B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xd6, 0xff, + 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0x67, + 0x52, 0x77, 0x77, 0x76, 0xef, 0xc6, 0xff, 0xff, + 0xfe, 0xff, 0xe7, 0xff, 0xff, 0xff, 0x67, 0x52, + 0x77, 0x77, 0x76, 0xef, 0xc6, 0xff, 0xff, 0xfe, + 0xff, 0xe7, 0xff, 0xff, 0xff, 0x78, 0x63, 0x88, + 0x88, 0x87, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, + 0x6, 0xfd, 0x0, 0x0, 0x0, 0x6f, 0xf7, 0x7c, + 0x10, 0x6, 0xff, 0x70, 0xdf, 0xd1, 0x6f, 0xf7, + 0x0, 0x1d, 0xfe, 0xff, 0x70, 0x0, 0x1, 0xdf, + 0xf7, 0x0, 0x0, 0x0, 0x1c, 0x60, 0x0, 0x0, + + /* U+F00D "ï€" */ + 0x0, 0x0, 0x0, 0xc, 0xd1, 0x2, 0xea, 0xaf, + 0xd4, 0xef, 0x80, 0xaf, 0xff, 0x80, 0x2, 0xff, + 0xf1, 0x2, 0xef, 0xdf, 0xd1, 0xdf, 0x80, 0xaf, + 0xb6, 0x70, 0x0, 0x85, + + /* U+F011 "" */ + 0x0, 0x0, 0xa6, 0x0, 0x0, 0x2, 0xa0, 0xea, + 0x29, 0x0, 0xe, 0xe1, 0xea, 0x5f, 0xa0, 0x7f, + 0x40, 0xea, 0x8, 0xf3, 0xbd, 0x0, 0xea, 0x1, + 0xf7, 0xcc, 0x0, 0xb7, 0x0, 0xf8, 0xaf, 0x0, + 0x0, 0x4, 0xf6, 0x4f, 0xa0, 0x0, 0x1d, 0xf1, + 0x9, 0xfd, 0x89, 0xef, 0x50, 0x0, 0x6d, 0xff, + 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x1, 0x88, 0x10, 0x0, 0x0, 0x5, 0xff, + 0x40, 0x0, 0x1e, 0xcf, 0xff, 0xfc, 0xd0, 0x7f, + 0xff, 0xdd, 0xff, 0xf7, 0x2d, 0xfa, 0x0, 0xbf, + 0xd1, 0xb, 0xf7, 0x0, 0x8f, 0xa0, 0x6f, 0xfe, + 0x55, 0xef, 0xf6, 0x4f, 0xff, 0xff, 0xff, 0xf3, + 0x6, 0x3a, 0xff, 0xa3, 0x60, 0x0, 0x3, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0x90, 0xf8, 0x0, 0x0, 0x9, 0xf8, 0xec, + 0xf8, 0x0, 0x1, 0xbe, 0x5a, 0x5c, 0xf8, 0x0, + 0x2d, 0xd5, 0xef, 0xf6, 0xaf, 0x50, 0xda, 0x6f, + 0xff, 0xff, 0x87, 0xf1, 0x11, 0xff, 0xff, 0xff, + 0xf5, 0x10, 0x2, 0xff, 0xc3, 0x9f, 0xf6, 0x0, + 0x2, 0xff, 0xb0, 0x7f, 0xf6, 0x0, 0x1, 0xbb, + 0x70, 0x4b, 0xb3, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x88, 0x20, 0x0, 0x0, 0x1, 0xff, + 0x60, 0x0, 0x0, 0x1, 0xff, 0x60, 0x0, 0x0, + 0x1, 0xff, 0x60, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x5f, 0xff, 0xfa, 0x0, 0x0, 0x5, + 0xff, 0xb0, 0x0, 0x8b, 0xb9, 0x8b, 0x8b, 0xb9, + 0xdf, 0xff, 0xff, 0xfe, 0xdf, 0xcf, 0xff, 0xff, + 0xfc, 0xbe, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F01C "" */ + 0x0, 0x24, 0x44, 0x44, 0x30, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xf4, 0x0, 0xb, 0xc0, 0x0, 0x0, + 0x8e, 0x10, 0x6e, 0x10, 0x0, 0x0, 0xc, 0xa0, + 0xee, 0xcb, 0x10, 0xa, 0xcd, 0xf2, 0xff, 0xff, + 0xb8, 0x9f, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe1, + + /* U+F021 "" */ + 0x0, 0x4, 0x87, 0x30, 0x5f, 0x2, 0xdf, 0xfe, + 0xfc, 0x7f, 0x1e, 0xd3, 0x0, 0x3c, 0xff, 0x9f, + 0x10, 0x5, 0xfe, 0xff, 0x44, 0x0, 0x2, 0x66, + 0x66, 0x12, 0x22, 0x0, 0x0, 0x11, 0xff, 0xff, + 0x50, 0x0, 0xda, 0xff, 0xa3, 0x10, 0x8, 0xf4, + 0xfc, 0xfb, 0x66, 0xbf, 0x80, 0xf5, 0x5c, 0xff, + 0xd5, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x70, 0x0, 0xbf, 0xab, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x3e, 0xf0, 0x0, 0x2c, + + /* U+F027 "" */ + 0x0, 0x0, 0x70, 0x0, 0x0, 0xb, 0xf0, 0x0, + 0xab, 0xdf, 0xf0, 0x20, 0xff, 0xff, 0xf0, 0xa6, + 0xff, 0xff, 0xf0, 0x59, 0xff, 0xff, 0xf0, 0x92, + 0x0, 0x3e, 0xf0, 0x0, 0x0, 0x2, 0xc0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, + 0x70, 0x0, 0xaa, 0x0, 0x0, 0xb, 0xf0, 0xa, + 0x4a, 0x70, 0xab, 0xdf, 0xf0, 0x23, 0xe2, 0xe0, + 0xff, 0xff, 0xf0, 0xa6, 0x95, 0xc2, 0xff, 0xff, + 0xf0, 0x59, 0x76, 0xc3, 0xff, 0xff, 0xf0, 0x92, + 0xc3, 0xe1, 0x0, 0x3e, 0xf0, 0x9, 0xa6, 0xb0, + 0x0, 0x2, 0xc0, 0x3, 0x3e, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xc3, 0x0, + + /* U+F03E "" */ + 0x24, 0x44, 0x44, 0x44, 0x42, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xf3, 0xd, 0xff, 0xef, 0xff, 0xf8, + 0x4e, 0xfe, 0x25, 0xff, 0xff, 0x9d, 0xe2, 0x0, + 0x6f, 0xf9, 0x1, 0x20, 0x0, 0x4f, 0xf7, 0x44, + 0x44, 0x44, 0x7f, 0xcf, 0xff, 0xff, 0xff, 0xfc, + + /* U+F043 "ïƒ" */ + 0x0, 0x1a, 0x0, 0x0, 0x7, 0xf5, 0x0, 0x0, + 0xef, 0xc0, 0x0, 0x8f, 0xff, 0x60, 0x3f, 0xff, + 0xff, 0x1b, 0xff, 0xff, 0xf9, 0xfb, 0xff, 0xff, + 0xdd, 0x6e, 0xff, 0xfc, 0x7e, 0x59, 0xff, 0x60, + 0x9f, 0xff, 0x80, 0x0, 0x13, 0x10, 0x0, + + /* U+F048 "ïˆ" */ + 0x0, 0x0, 0x0, 0xe, 0x70, 0x3, 0xe4, 0xe7, + 0x4, 0xff, 0x5e, 0x75, 0xff, 0xf5, 0xec, 0xff, + 0xff, 0x5e, 0xff, 0xff, 0xf5, 0xea, 0xef, 0xff, + 0x5e, 0x71, 0xdf, 0xf5, 0xe7, 0x1, 0xcf, 0x59, + 0x50, 0x0, 0x92, + + /* U+F04B "ï‹" */ + 0x88, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x50, 0x0, + 0x0, 0xff, 0xff, 0xc3, 0x0, 0xf, 0xff, 0xff, + 0xf9, 0x10, 0xff, 0xff, 0xff, 0xfe, 0x5f, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xf8, 0xf, + 0xff, 0xff, 0xb2, 0x0, 0xff, 0xfd, 0x40, 0x0, + 0xe, 0xf7, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, + 0x0, 0x0, + + /* U+F04C "ïŒ" */ + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x90, 0xdf, + 0xf9, 0xff, 0xfc, 0xf, 0xff, 0xcf, 0xff, 0xc0, + 0xff, 0xfc, 0xff, 0xfc, 0xf, 0xff, 0xcf, 0xff, + 0xc0, 0xff, 0xfc, 0xff, 0xfc, 0xf, 0xff, 0xcf, + 0xff, 0xc0, 0xff, 0xfc, 0xff, 0xfb, 0xf, 0xff, + 0xb8, 0xbb, 0x50, 0x8b, 0xb5, + + /* U+F04D "ï" */ + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xb8, 0xbb, 0xbb, 0xbb, 0xb5, + + /* U+F051 "ï‘" */ + 0x0, 0x0, 0x0, 0xb, 0xa0, 0x0, 0xe7, 0xcf, + 0xb0, 0xe, 0x7c, 0xff, 0xc1, 0xe7, 0xcf, 0xff, + 0xdf, 0x7c, 0xff, 0xff, 0xf7, 0xcf, 0xff, 0x9e, + 0x7c, 0xff, 0x70, 0xe7, 0xcf, 0x60, 0xe, 0x77, + 0x50, 0x0, 0x95, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x60, 0x0, 0x0, 0x9, 0xff, 0xf5, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x40, 0x6, 0xff, 0xff, 0xff, + 0xf3, 0xe, 0xff, 0xff, 0xff, 0xfa, 0x3, 0x66, + 0x66, 0x66, 0x62, 0xd, 0xff, 0xff, 0xff, 0xf9, + 0xf, 0xff, 0xff, 0xff, 0xfb, 0x6, 0x88, 0x88, + 0x88, 0x84, + + /* U+F053 "ï“" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xc7, 0x0, 0x1d, + 0xf5, 0x1, 0xdf, 0x50, 0x1d, 0xf5, 0x0, 0x4f, + 0xd0, 0x0, 0x6, 0xfc, 0x0, 0x0, 0x6f, 0xc0, + 0x0, 0x6, 0xf9, 0x0, 0x0, 0x51, + + /* U+F054 "ï”" */ + 0x0, 0x0, 0x0, 0x3e, 0x30, 0x0, 0x2e, 0xf3, + 0x0, 0x2, 0xef, 0x30, 0x0, 0x2e, 0xe3, 0x0, + 0x9, 0xf8, 0x0, 0x8f, 0xa0, 0x8, 0xfa, 0x0, + 0x5f, 0xa0, 0x0, 0x6, 0x0, 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x8f, 0x40, + 0x0, 0x0, 0x9, 0xf5, 0x0, 0x0, 0x0, 0x9f, + 0x50, 0x0, 0x9b, 0xbd, 0xfc, 0xbb, 0x6f, 0xff, + 0xff, 0xff, 0xfb, 0x13, 0x3a, 0xf7, 0x33, 0x10, + 0x0, 0x9f, 0x50, 0x0, 0x0, 0x9, 0xf5, 0x0, + 0x0, 0x0, 0x39, 0x10, 0x0, + + /* U+F068 "ï¨" */ + 0xbd, 0xdd, 0xdd, 0xdd, 0x8e, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F06E "ï®" */ + 0x0, 0x4, 0x8a, 0x95, 0x0, 0x0, 0x1, 0xcf, + 0x84, 0x6e, 0xe3, 0x0, 0x1e, 0xf5, 0x8, 0x72, + 0xff, 0x40, 0xbf, 0xe0, 0x2d, 0xf5, 0xbf, 0xe0, + 0xdf, 0xe3, 0xff, 0xf6, 0xaf, 0xf1, 0x4f, 0xf3, + 0xaf, 0xd1, 0xef, 0x70, 0x5, 0xfd, 0x31, 0x2b, + 0xf7, 0x0, 0x0, 0x19, 0xdf, 0xea, 0x30, 0x0, + + /* U+F070 "ï°" */ + 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfa, + 0x16, 0xaa, 0x83, 0x0, 0x0, 0x3, 0xef, 0xe6, + 0x49, 0xfb, 0x0, 0x0, 0x1, 0xbe, 0x49, 0x28, + 0xfd, 0x0, 0x1d, 0x40, 0x8f, 0xfe, 0x1f, 0xf9, + 0x4, 0xff, 0x50, 0x5f, 0xf1, 0xff, 0xb0, 0xa, + 0xfc, 0x0, 0x2d, 0xdf, 0xf2, 0x0, 0xa, 0xfa, + 0x10, 0x1b, 0xf7, 0x0, 0x0, 0x4, 0xbe, 0xe4, + 0x8, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x2, 0xe6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0xd, 0xe7, 0xcf, + 0x20, 0x0, 0x0, 0x7, 0xfc, 0x8, 0xfb, 0x0, + 0x0, 0x1, 0xef, 0xd0, 0x9f, 0xf4, 0x0, 0x0, + 0x9f, 0xff, 0x5c, 0xff, 0xd0, 0x0, 0x2f, 0xff, + 0xe1, 0xaf, 0xff, 0x60, 0xb, 0xff, 0xfe, 0x2b, + 0xff, 0xfe, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x1, 0x33, 0x33, 0x33, 0x33, 0x32, 0x0, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xc1, 0xef, 0xd1, 0x3, 0xef, 0xfc, 0x99, + 0xfb, 0x2e, 0xec, 0xf8, 0x0, 0x54, 0xde, 0x25, + 0x70, 0x0, 0xc, 0xf4, 0x1, 0x10, 0x0, 0xbf, + 0x5c, 0x78, 0xd1, 0xff, 0xf6, 0xa, 0xff, 0xfd, + 0x78, 0x60, 0x0, 0x7c, 0xf6, 0x0, 0x0, 0x0, + 0x5, 0x60, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0xaf, 0x60, + 0x0, 0x0, 0xaf, 0xef, 0x60, 0x0, 0xaf, 0x90, + 0xcf, 0x60, 0x9f, 0x80, 0x0, 0xcf, 0x57, 0x80, + 0x0, 0x0, 0xa4, + + /* U+F078 "ï¸" */ + 0x11, 0x0, 0x0, 0x2, 0xc, 0xe2, 0x0, 0x5, + 0xf8, 0x3f, 0xe2, 0x5, 0xfd, 0x10, 0x3f, 0xe7, + 0xfd, 0x10, 0x0, 0x3f, 0xfd, 0x10, 0x0, 0x0, + 0x3b, 0x10, 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xc3, 0xff, 0xff, 0xf5, 0x0, 0xbe, 0xfe, 0xb3, + 0x44, 0x4e, 0x60, 0x4, 0x3f, 0x34, 0x0, 0x0, + 0xd6, 0x0, 0x2, 0xf2, 0x0, 0x0, 0xd, 0x60, + 0x0, 0x2f, 0x20, 0x0, 0x8c, 0xea, 0xf1, 0x1, + 0xff, 0xff, 0xf7, 0xdf, 0xf7, 0x0, 0x4, 0x44, + 0x44, 0x11, 0xc7, 0x0, + + /* U+F07B "ï»" */ + 0x58, 0x88, 0x20, 0x0, 0x0, 0xff, 0xff, 0xe4, + 0x44, 0x41, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfc, + + /* U+F093 "ï‚“" */ + 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x40, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0x0, 0x2, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x36, 0xff, 0x63, + 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, 0x0, 0x4, + 0xff, 0x40, 0x0, 0x9a, 0xa5, 0xff, 0x5a, 0xa9, + 0xff, 0xff, 0xdd, 0xfe, 0xdf, 0xff, 0xff, 0xff, + 0xfc, 0xbe, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0xa8, 0x40, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x6f, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0x50, 0x0, 0x0, 0x0, 0x5f, + 0xd0, 0x0, 0x39, 0x10, 0x4f, 0xf4, 0x0, 0xbf, + 0xfc, 0x9f, 0xf6, 0x0, 0xd, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x9f, 0xfd, 0x81, 0x0, 0x0, 0x1, + 0x31, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0xfe, 0x30, 0x5, + 0xc6, 0xe7, 0xbb, 0x5, 0xff, 0x4d, 0xbd, 0xb4, + 0xff, 0x40, 0x3c, 0xff, 0xff, 0x40, 0x0, 0x8, + 0xff, 0xb0, 0x0, 0x6f, 0xff, 0xdf, 0x80, 0xe, + 0x7b, 0xb2, 0xef, 0x80, 0xdb, 0xd9, 0x2, 0xef, + 0x73, 0xca, 0x10, 0x2, 0x72, + + /* U+F0C5 "" */ + 0x0, 0x5d, 0xdd, 0x48, 0x0, 0x8, 0xff, 0xf6, + 0xf8, 0xcc, 0x8f, 0xff, 0x84, 0x3f, 0xe8, 0xff, + 0xff, 0xfc, 0xfe, 0x8f, 0xff, 0xff, 0xcf, 0xe8, + 0xff, 0xff, 0xfc, 0xfe, 0x8f, 0xff, 0xff, 0xcf, + 0xe7, 0xff, 0xff, 0xfc, 0xff, 0x46, 0x66, 0x66, + 0x3f, 0xff, 0xff, 0xf4, 0x0, 0x34, 0x44, 0x43, + 0x0, 0x0, + + /* U+F0C7 "" */ + 0x2, 0x22, 0x22, 0x0, 0xe, 0xff, 0xff, 0xfe, + 0x20, 0xf5, 0x22, 0x22, 0xfe, 0x1f, 0x40, 0x0, + 0xe, 0xf8, 0xf7, 0x44, 0x44, 0xff, 0x9f, 0xff, + 0xff, 0xff, 0xf9, 0xff, 0xf6, 0xc, 0xff, 0x9f, + 0xff, 0x20, 0x9f, 0xf9, 0xff, 0xfc, 0x7f, 0xff, + 0x9a, 0xdd, 0xdd, 0xdd, 0xd4, + + /* U+F0C9 "" */ + 0x67, 0x77, 0x77, 0x77, 0x4e, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0x77, + 0x77, 0x74, 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x45, 0x55, 0x55, 0x55, 0x3f, + 0xff, 0xff, 0xff, 0xfb, 0x11, 0x11, 0x11, 0x11, + 0x0, + + /* U+F0E0 "" */ + 0x58, 0x88, 0x88, 0x88, 0x84, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xf6, 0xc5, + 0xdf, 0xff, 0xfd, 0x5c, 0xfe, 0x6a, 0xff, 0xa5, + 0xef, 0xff, 0xf9, 0x55, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfc, + + /* U+F0E7 "" */ + 0x3, 0xaa, 0xa2, 0x0, 0x7, 0xff, 0xf2, 0x0, + 0x9, 0xff, 0xd0, 0x0, 0xb, 0xff, 0xd8, 0x81, + 0xe, 0xff, 0xff, 0xe1, 0xe, 0xff, 0xff, 0x60, + 0x0, 0x5, 0xfd, 0x0, 0x0, 0x9, 0xf4, 0x0, + 0x0, 0xd, 0xa0, 0x0, 0x0, 0xf, 0x20, 0x0, + 0x0, 0x2, 0x0, 0x0, + + /* U+F0EA "" */ + 0x1, 0x79, 0x11, 0x0, 0xf, 0xfc, 0x9f, 0xf4, + 0x0, 0xff, 0xfd, 0xcc, 0x30, 0xf, 0xfa, 0x79, + 0x93, 0x40, 0xff, 0x8e, 0xff, 0x6f, 0x5f, 0xf8, + 0xef, 0xf7, 0x64, 0xff, 0x8e, 0xff, 0xff, 0xcf, + 0xf8, 0xef, 0xff, 0xfc, 0x46, 0x3e, 0xff, 0xff, + 0xc0, 0x0, 0xdf, 0xff, 0xfc, 0x0, 0x2, 0x44, + 0x44, 0x20, + + /* U+F0F3 "" */ + 0x0, 0x1, 0x90, 0x0, 0x0, 0x2, 0xaf, 0x81, + 0x0, 0x2, 0xff, 0xff, 0xd0, 0x0, 0x9f, 0xff, + 0xff, 0x50, 0xc, 0xff, 0xff, 0xf8, 0x0, 0xef, + 0xff, 0xff, 0xa0, 0x3f, 0xff, 0xff, 0xfe, 0xd, + 0xff, 0xff, 0xff, 0xf9, 0x46, 0x66, 0x66, 0x66, + 0x20, 0x0, 0xbf, 0x70, 0x0, 0x0, 0x0, 0x30, + 0x0, 0x0, + + /* U+F11C "" */ + 0x24, 0x44, 0x44, 0x44, 0x44, 0x30, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xf4, 0xa0, 0xa0, 0xb0, + 0xb0, 0xf4, 0xff, 0xbe, 0xae, 0xae, 0xaf, 0xf4, + 0xff, 0x3a, 0xa, 0xa, 0xf, 0xf4, 0xfb, 0xea, + 0xaa, 0xaa, 0xea, 0xf4, 0xf7, 0xb4, 0x44, 0x44, + 0xc4, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe1, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x29, 0x70, 0x0, 0x0, + 0x0, 0x3a, 0xff, 0xe0, 0x0, 0x0, 0x4b, 0xff, + 0xff, 0x70, 0x0, 0x5d, 0xff, 0xff, 0xff, 0x10, + 0xc, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xa, 0xee, + 0xef, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, 0x0, + 0x0, 0x0, 0xa, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x0, 0x0, + + /* U+F15B "ï…›" */ + 0xef, 0xff, 0x5b, 0x0, 0xff, 0xff, 0x6f, 0xb0, + 0xff, 0xff, 0x68, 0x83, 0xff, 0xff, 0xfd, 0xd6, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, + + /* U+F1EB "" */ + 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x5, + 0xbf, 0xff, 0xfd, 0x81, 0x0, 0x2c, 0xfe, 0xa8, + 0x78, 0xcf, 0xf7, 0xd, 0xf7, 0x0, 0x0, 0x0, + 0x3c, 0xf5, 0x22, 0x5, 0xbe, 0xfd, 0x81, 0x5, + 0x0, 0x9, 0xfe, 0xa9, 0xcf, 0xe2, 0x0, 0x0, + 0x37, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, + 0x8c, 0x20, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0x10, 0x0, + 0x0, + + /* U+F240 "" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf, 0x75, + 0x55, 0x55, 0x55, 0x5a, 0xf2, 0xf6, 0xff, 0xff, + 0xff, 0xfd, 0x4f, 0x5f, 0x6f, 0xff, 0xff, 0xff, + 0xd1, 0xf5, 0xf5, 0x77, 0x77, 0x77, 0x76, 0x8f, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x24, + 0x44, 0x44, 0x44, 0x44, 0x41, 0x0, + + /* U+F241 "ï‰" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf, 0x75, + 0x55, 0x55, 0x54, 0x4a, 0xf2, 0xf6, 0xff, 0xff, + 0xff, 0x0, 0x4f, 0x5f, 0x6f, 0xff, 0xff, 0xf0, + 0x1, 0xf5, 0xf5, 0x77, 0x77, 0x77, 0x0, 0x8f, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x24, + 0x44, 0x44, 0x44, 0x44, 0x41, 0x0, + + /* U+F242 "" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf, 0x75, + 0x55, 0x54, 0x44, 0x4a, 0xf2, 0xf6, 0xff, 0xff, + 0x20, 0x0, 0x4f, 0x5f, 0x6f, 0xff, 0xf2, 0x0, + 0x1, 0xf5, 0xf5, 0x77, 0x77, 0x10, 0x0, 0x8f, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x24, + 0x44, 0x44, 0x44, 0x44, 0x41, 0x0, + + /* U+F243 "" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf, 0x75, + 0x54, 0x44, 0x44, 0x4a, 0xf2, 0xf6, 0xff, 0x50, + 0x0, 0x0, 0x4f, 0x5f, 0x6f, 0xf5, 0x0, 0x0, + 0x1, 0xf5, 0xf5, 0x77, 0x20, 0x0, 0x0, 0x8f, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x24, + 0x44, 0x44, 0x44, 0x44, 0x41, 0x0, + + /* U+F244 "" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xf, 0x74, + 0x44, 0x44, 0x44, 0x4a, 0xf2, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0x5f, 0x40, 0x0, 0x0, 0x0, + 0x1, 0xf5, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x24, + 0x44, 0x44, 0x44, 0x44, 0x41, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x5b, 0x10, 0x0, 0x0, 0x0, + 0x3, 0xbd, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xa1, + 0x3, 0x0, 0x0, 0xa, 0xf7, 0x39, 0x0, 0x0, + 0x7, 0x60, 0xff, 0xea, 0xbf, 0xaa, 0xaa, 0xdf, + 0x45, 0xa3, 0x0, 0x93, 0x0, 0x4, 0x10, 0x0, + 0x0, 0x1, 0xb8, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x9f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x6b, 0xca, 0x40, 0x0, 0x9f, 0xf6, 0xff, + 0x40, 0x1f, 0xff, 0x26, 0xfb, 0x4, 0xf6, 0xb4, + 0x6b, 0xf0, 0x6f, 0xf4, 0x6, 0xff, 0x6, 0xff, + 0x90, 0xbf, 0xf0, 0x5f, 0x95, 0x34, 0xcf, 0x2, + 0xfb, 0xf3, 0x4d, 0xc0, 0xc, 0xff, 0x3d, 0xf7, + 0x0, 0x1b, 0xfe, 0xf9, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, + + /* U+F2ED "ï‹­" */ + 0x12, 0x3b, 0xca, 0x22, 0x1f, 0xff, 0xff, 0xff, + 0xfb, 0x36, 0x66, 0x66, 0x66, 0x16, 0xff, 0xff, + 0xff, 0xf2, 0x6f, 0x6f, 0x6f, 0x7f, 0x26, 0xf6, + 0xf6, 0xf7, 0xf2, 0x6f, 0x6f, 0x6f, 0x7f, 0x26, + 0xf6, 0xf6, 0xf7, 0xf2, 0x6f, 0x6f, 0x6f, 0x7f, + 0x24, 0xff, 0xff, 0xff, 0xf1, 0x3, 0x44, 0x44, + 0x42, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x97, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf8, 0x0, 0x0, 0x0, 0xa5, 0xef, + 0xe0, 0x0, 0x0, 0xbf, 0xe5, 0xd4, 0x0, 0x0, + 0xbf, 0xff, 0xe0, 0x0, 0x0, 0xbf, 0xff, 0xf4, + 0x0, 0x0, 0xbf, 0xff, 0xf4, 0x0, 0x0, 0xaf, + 0xff, 0xf4, 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x2, + 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x5, 0x88, 0x88, 0x88, 0x86, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x8, 0xff, 0xf9, + 0x6f, 0x69, 0xff, 0x88, 0xff, 0xff, 0xc1, 0x21, + 0xcf, 0xf8, 0xdf, 0xff, 0xff, 0x50, 0x5f, 0xff, + 0x82, 0xef, 0xff, 0x71, 0x91, 0x7f, 0xf8, 0x2, + 0xef, 0xfe, 0xdf, 0xde, 0xff, 0x70, 0x2, 0xdf, + 0xff, 0xff, 0xff, 0xe3, + + /* U+F7C2 "" */ + 0x1, 0xdf, 0xff, 0xe5, 0x1d, 0x6c, 0x5a, 0xab, + 0xdf, 0x3b, 0x18, 0x8b, 0xff, 0xdf, 0xde, 0xeb, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xfb, 0xbf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x8, 0x10, + 0x0, 0x7, 0xf0, 0xb, 0xf2, 0x0, 0x0, 0x8f, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xfa, + 0x99, 0x99, 0x99, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 43, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 43, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7, .adv_w = 63, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 13, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 38, .adv_w = 99, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 65, .adv_w = 135, .box_w = 9, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 97, .adv_w = 110, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 125, .adv_w = 34, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 128, .adv_w = 54, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 146, .adv_w = 54, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 160, .adv_w = 64, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 168, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 183, .adv_w = 36, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 186, .adv_w = 61, .box_w = 4, .box_h = 1, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 188, .adv_w = 36, .box_w = 2, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 190, .adv_w = 56, .box_w = 5, .box_h = 9, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 213, .adv_w = 107, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 238, .adv_w = 59, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 249, .adv_w = 92, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 270, .adv_w = 92, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 291, .adv_w = 107, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 316, .adv_w = 92, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 337, .adv_w = 99, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 358, .adv_w = 96, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 379, .adv_w = 103, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 400, .adv_w = 99, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 421, .adv_w = 36, .box_w = 2, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 426, .adv_w = 36, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 433, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 448, .adv_w = 93, .box_w = 6, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 457, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 472, .adv_w = 92, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 493, .adv_w = 165, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 538, .adv_w = 117, .box_w = 9, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 570, .adv_w = 121, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 595, .adv_w = 116, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 620, .adv_w = 132, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 645, .adv_w = 107, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 666, .adv_w = 102, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 684, .adv_w = 124, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 709, .adv_w = 130, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 734, .adv_w = 50, .box_w = 2, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 741, .adv_w = 82, .box_w = 6, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 762, .adv_w = 115, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 787, .adv_w = 95, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 805, .adv_w = 153, .box_w = 8, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 833, .adv_w = 130, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 858, .adv_w = 134, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 886, .adv_w = 116, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 907, .adv_w = 134, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 943, .adv_w = 116, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 964, .adv_w = 99, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 985, .adv_w = 94, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1006, .adv_w = 127, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1031, .adv_w = 114, .box_w = 9, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1063, .adv_w = 180, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1102, .adv_w = 108, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1127, .adv_w = 104, .box_w = 8, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1155, .adv_w = 105, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1180, .adv_w = 53, .box_w = 3, .box_h = 9, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1194, .adv_w = 56, .box_w = 5, .box_h = 9, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1217, .adv_w = 53, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1231, .adv_w = 93, .box_w = 6, .box_h = 4, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 1243, .adv_w = 80, .box_w = 5, .box_h = 1, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1246, .adv_w = 96, .box_w = 3, .box_h = 1, .ofs_x = 1, .ofs_y = 6}, + {.bitmap_index = 1248, .adv_w = 96, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1263, .adv_w = 109, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1288, .adv_w = 91, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1303, .adv_w = 109, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1324, .adv_w = 98, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1339, .adv_w = 56, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1353, .adv_w = 110, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1374, .adv_w = 109, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1395, .adv_w = 45, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1406, .adv_w = 45, .box_w = 4, .box_h = 9, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 1424, .adv_w = 99, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1449, .adv_w = 45, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1456, .adv_w = 169, .box_w = 10, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1481, .adv_w = 109, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1496, .adv_w = 102, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1511, .adv_w = 109, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1536, .adv_w = 109, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1557, .adv_w = 66, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1567, .adv_w = 80, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1580, .adv_w = 66, .box_w = 4, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1592, .adv_w = 108, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1607, .adv_w = 89, .box_w = 7, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1625, .adv_w = 144, .box_w = 9, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1648, .adv_w = 88, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1663, .adv_w = 89, .box_w = 7, .box_h = 7, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 1688, .adv_w = 83, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1701, .adv_w = 56, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1719, .adv_w = 48, .box_w = 1, .box_h = 9, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1724, .adv_w = 56, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1738, .adv_w = 93, .box_w = 6, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1744, .adv_w = 67, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 1752, .adv_w = 50, .box_w = 3, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1755, .adv_w = 160, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1816, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1856, .adv_w = 160, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1906, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1946, .adv_w = 110, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1974, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2029, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2084, .adv_w = 180, .box_w = 12, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2144, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2199, .adv_w = 180, .box_w = 12, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2247, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2302, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2322, .adv_w = 120, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2354, .adv_w = 180, .box_w = 12, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2414, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2454, .adv_w = 110, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2493, .adv_w = 140, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 2528, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2578, .adv_w = 140, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2623, .adv_w = 140, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2668, .adv_w = 140, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 2703, .adv_w = 140, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 2753, .adv_w = 100, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2783, .adv_w = 100, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2813, .adv_w = 140, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2858, .adv_w = 140, .box_w = 9, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 2872, .adv_w = 180, .box_w = 12, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2920, .adv_w = 200, .box_w = 13, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2992, .adv_w = 180, .box_w = 13, .box_h = 11, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 3064, .adv_w = 160, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3114, .adv_w = 140, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3141, .adv_w = 140, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3168, .adv_w = 200, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3220, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3260, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3315, .adv_w = 160, .box_w = 11, .box_h = 11, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 3376, .adv_w = 140, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3421, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3471, .adv_w = 140, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3516, .adv_w = 140, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3557, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3597, .adv_w = 100, .box_w = 8, .box_h = 11, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 3641, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3691, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3741, .adv_w = 180, .box_w = 12, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3789, .adv_w = 160, .box_w = 12, .box_h = 11, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 3855, .adv_w = 120, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3899, .adv_w = 200, .box_w = 13, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3964, .adv_w = 200, .box_w = 13, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4010, .adv_w = 200, .box_w = 13, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4056, .adv_w = 200, .box_w = 13, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4102, .adv_w = 200, .box_w = 13, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4148, .adv_w = 200, .box_w = 13, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4194, .adv_w = 200, .box_w = 13, .box_h = 9, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4253, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4303, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4353, .adv_w = 160, .box_w = 11, .box_h = 11, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 4414, .adv_w = 200, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4466, .adv_w = 120, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4510, .adv_w = 161, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 0, 4, -4, 0, 0, + 0, 0, -9, -10, 1, 8, 4, 3, + -6, 1, 8, 0, 7, 2, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 1, -1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, -5, 0, 0, 0, 0, + 0, -3, 3, 3, 0, 0, -2, 0, + -1, 2, 0, -2, 0, -2, -1, -3, + 0, 0, 0, 0, -2, 0, 0, -2, + -2, 0, 0, -2, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + -2, 0, -2, 0, -4, 0, -19, 0, + 0, -3, 0, 3, 5, 0, 0, -3, + 2, 2, 5, 3, -3, 3, 0, 0, + -9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, -2, -8, 0, -6, + -1, 0, 0, 0, 0, 0, 6, 0, + -5, -1, 0, 0, 0, -3, 0, 0, + -1, -12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -13, -1, 6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, + 0, 2, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, + 3, 2, 5, -2, 0, 0, 3, -2, + -5, -22, 1, 4, 3, 0, -2, 0, + 6, 0, 5, 0, 5, 0, -15, 0, + -2, 5, 0, 5, -2, 3, 2, 0, + 0, 0, -2, 0, 0, -3, 13, 0, + 13, 0, 5, 0, 7, 2, 3, 5, + 0, 0, 0, -6, 0, 0, 0, 0, + 0, -1, 0, 1, -3, -2, -3, 1, + 0, -2, 0, 0, 0, -6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -9, 0, -10, 0, 0, 0, + 0, -1, 0, 16, -2, -2, 2, 2, + -1, 0, -2, 2, 0, 0, -8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -16, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -10, 0, 10, 0, 0, -6, 0, + 5, 0, -11, -16, -11, -3, 5, 0, + 0, -11, 0, 2, -4, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 5, -20, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 1, 0, 0, 0, + 0, 0, 1, 1, -2, -3, 0, 0, + 0, -2, 0, 0, -1, 0, 0, 0, + -3, 0, -1, 0, -4, -3, 0, -4, + -5, -5, -3, 0, -3, 0, -3, 0, + 0, 0, 0, -1, 0, 0, 2, 0, + 1, -2, 0, 0, 0, 0, 0, 2, + -1, 0, 0, 0, -1, 2, 2, 0, + 0, 0, 0, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, -1, 0, + -2, 0, -3, 0, 0, -1, 0, 5, + 0, 0, -2, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, 0, -2, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, -2, -2, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, -2, -2, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, -1, -2, 0, -2, 0, -5, + -1, -5, 3, 0, 0, -3, 2, 3, + 4, 0, -4, 0, -2, 0, 0, -8, + 2, -1, 1, -8, 2, 0, 0, 0, + -8, 0, -8, -1, -14, -1, 0, -8, + 0, 3, 4, 0, 2, 0, 0, 0, + 0, 0, 0, -3, -2, 0, -5, 0, + 0, 0, -2, 0, 0, 0, -2, 0, + 0, 0, 0, 0, -1, -1, 0, -1, + -2, 0, 0, 0, 0, 0, 0, 0, + -2, -2, 0, -1, -2, -1, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, -1, 0, -2, + 0, -1, 0, -3, 2, 0, 0, -2, + 1, 2, 2, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 1, + 0, 0, -2, 0, -2, -1, -2, 0, + 0, 0, 0, 0, 0, 0, 1, 0, + -1, 0, 0, 0, 0, -2, -2, 0, + -3, 0, 5, -1, 0, -5, 0, 0, + 4, -8, -8, -7, -3, 2, 0, -1, + -10, -3, 0, -3, 0, -3, 2, -3, + -10, 0, -4, 0, 0, 1, 0, 1, + -1, 0, 2, 0, -5, -6, 0, -8, + -4, -3, -4, -5, -2, -4, 0, -3, + -4, 1, 0, 0, 0, -2, 0, 0, + 0, 1, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, -1, 0, 0, -2, 0, -3, -4, + -4, 0, 0, -5, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 1, + -1, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 8, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, 0, 0, + -3, 0, 0, 0, 0, -8, -5, 0, + 0, 0, -2, -8, 0, 0, -2, 2, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, -3, 0, + 0, 0, 0, 2, 0, 1, -3, -3, + 0, -2, -2, -2, 0, 0, 0, 0, + 0, 0, -5, 0, -2, 0, -2, -2, + 0, -4, -4, -5, -1, 0, -3, 0, + -5, 0, 0, 0, 0, 13, 0, 0, + 1, 0, 0, -2, 0, 2, 0, -7, + 0, 0, 0, 0, 0, -15, -3, 5, + 5, -1, -7, 0, 2, -2, 0, -8, + -1, -2, 2, -11, -2, 2, 0, 2, + -6, -2, -6, -5, -7, 0, 0, -10, + 0, 9, 0, 0, -1, 0, 0, 0, + -1, -1, -2, -4, -5, 0, -15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, -1, -2, -2, 0, 0, + -3, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 3, + 0, 2, 0, -4, 2, -1, 0, -4, + -2, 0, -2, -2, -1, 0, -2, -3, + 0, 0, -1, 0, -1, -3, -2, 0, + 0, -2, 0, 2, -1, 0, -4, 0, + 0, 0, -3, 0, -3, 0, -3, -3, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 2, 0, -2, 0, -1, -2, + -5, -1, -1, -1, 0, -1, -2, 0, + 0, 0, 0, 0, 0, -2, -1, -1, + 0, 0, 0, 0, 2, -1, 0, -1, + 0, 0, 0, -1, -2, -1, -1, -2, + -1, 0, 1, 6, 0, 0, -4, 0, + -1, 3, 0, -2, -7, -2, 2, 0, + 0, -8, -3, 2, -3, 1, 0, -1, + -1, -5, 0, -2, 1, 0, 0, -3, + 0, 0, 0, 2, 2, -3, -3, 0, + -3, -2, -2, -2, -2, 0, -3, 1, + -3, -3, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, -2, + 0, 0, -2, -2, 0, 0, 0, 0, + -2, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, -1, 0, 0, 0, 0, + -2, 0, -3, 0, 0, 0, -5, 0, + 1, -4, 3, 0, -1, -8, 0, 0, + -4, -2, 0, -6, -4, -4, 0, 0, + -7, -2, -6, -6, -8, 0, -4, 0, + 1, 11, -2, 0, -4, -2, 0, -2, + -3, -4, -3, -6, -7, -4, -2, 0, + 0, -1, 0, 0, 0, 0, -11, -1, + 5, 4, -4, -6, 0, 0, -5, 0, + -8, -1, -2, 3, -15, -2, 0, 0, + 0, -10, -2, -8, -2, -12, 0, 0, + -11, 0, 9, 0, 0, -1, 0, 0, + 0, 0, -1, -1, -6, -1, 0, -10, + 0, 0, 0, 0, -5, 0, -1, 0, + 0, -4, -8, 0, 0, -1, -2, -5, + -2, 0, -1, 0, 0, 0, 0, -7, + -2, -5, -5, -1, -3, -4, -2, -3, + 0, -3, -1, -5, -2, 0, -2, -3, + -2, -3, 0, 1, 0, -1, -5, 0, + 3, 0, -3, 0, 0, 0, 0, 2, + 0, 1, -3, 7, 0, -2, -2, -2, + 0, 0, 0, 0, 0, 0, -5, 0, + -2, 0, -2, -2, 0, -4, -4, -5, + -1, 0, -3, 1, 6, 0, 0, 0, + 0, 13, 0, 0, 1, 0, 0, -2, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, -3, 0, 0, 0, 0, 0, -1, + 0, 0, 0, -2, -2, 0, 0, -3, + -2, 0, 0, -3, 0, 3, -1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 2, 3, 1, -1, 0, -5, + -3, 0, 5, -5, -5, -3, -3, 6, + 3, 2, -14, -1, 3, -2, 0, -2, + 2, -2, -6, 0, -2, 2, -2, -1, + -5, -1, 0, 0, 5, 3, 0, -4, + 0, -9, -2, 5, -2, -6, 0, -2, + -5, -5, -2, 6, 2, 0, -2, 0, + -4, 0, 1, 5, -4, -6, -6, -4, + 5, 0, 0, -12, -1, 2, -3, -1, + -4, 0, -4, -6, -2, -2, -1, 0, + 0, -4, -3, -2, 0, 5, 4, -2, + -9, 0, -9, -2, 0, -6, -9, 0, + -5, -3, -5, -4, 4, 0, 0, -2, + 0, -3, -1, 0, -2, -3, 0, 3, + -5, 2, 0, 0, -8, 0, -2, -4, + -3, -1, -5, -4, -5, -4, 0, -5, + -2, -4, -3, -5, -2, 0, 0, 0, + 8, -3, 0, -5, -2, 0, -2, -3, + -4, -4, -4, -6, -2, -3, 3, 0, + -2, 0, -8, -2, 1, 3, -5, -6, + -3, -5, 5, -2, 1, -15, -3, 3, + -4, -3, -6, 0, -5, -7, -2, -2, + -1, -2, -3, -5, 0, 0, 0, 5, + 4, -1, -10, 0, -10, -4, 4, -6, + -11, -3, -6, -7, -8, -5, 3, 0, + 0, 0, 0, -2, 0, 0, 2, -2, + 3, 1, -3, 3, 0, 0, -5, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, 1, 5, 0, 0, -2, 0, 0, + 0, 0, -1, -1, -2, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, + -1, 0, 6, 0, 3, 0, 0, -2, + 0, 3, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -10, 0, -2, 3, 0, 5, + 0, 0, 16, 2, -3, -3, 2, 2, + -1, 0, -8, 0, 0, 8, -10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -11, 6, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, -3, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, -4, 0, + 0, 0, 0, 0, 2, 21, -3, -1, + 5, 4, -4, 2, 0, 0, 2, 2, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -21, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, -4, 0, 0, 0, 0, + -4, -1, 0, 0, 0, -4, 0, -2, + 0, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, -3, 0, -2, 0, + -4, 0, 0, 0, -3, 2, -2, 0, + 0, -4, -2, -4, 0, 0, -4, 0, + -2, 0, -8, 0, -2, 0, 0, -13, + -3, -6, -2, -6, 0, 0, -11, 0, + -4, -1, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -3, -1, -3, 0, 0, + 0, 0, -4, 0, -4, 2, -2, 3, + 0, -1, -4, -1, -3, -3, 0, -2, + -1, -1, 1, -4, 0, 0, 0, 0, + -14, -1, -2, 0, -4, 0, -1, -8, + -1, 0, 0, -1, -1, 0, 0, 0, + 0, 1, 0, -1, -3, -1, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -4, 0, -1, 0, 0, 0, -3, + 2, 0, 0, 0, -4, -2, -3, 0, + 0, -4, 0, -2, 0, -8, 0, 0, + 0, 0, -16, 0, -3, -6, -8, 0, + 0, -11, 0, -1, -2, 0, 0, 0, + 0, 0, 0, 0, 0, -2, -2, -1, + -2, 0, 0, 0, 3, -2, 0, 5, + 8, -2, -2, -5, 2, 8, 3, 4, + -4, 2, 7, 2, 5, 4, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 8, -3, -2, 0, -1, + 13, 7, 13, 0, 0, 0, 2, 0, + 0, 6, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, -13, -2, -1, -7, + -8, 0, 0, -11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, -13, -2, -1, + -7, -8, 0, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, 0, 0, 0, -4, 2, 0, -2, + 1, 3, 2, -5, 0, 0, -1, 2, + 0, 1, 0, 0, 0, 0, -4, 0, + -1, -1, -3, 0, -1, -6, 0, 10, + -2, 0, -4, -1, 0, -1, -3, 0, + -2, -4, -3, -2, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, -13, + -2, -1, -7, -8, 0, 0, -11, 0, + 0, 0, 0, 0, 0, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, -5, -2, -1, 5, -1, -2, + -6, 0, -1, 0, -1, -4, 0, 4, + 0, 1, 0, 1, -4, -6, -2, 0, + -6, -3, -4, -7, -6, 0, -3, -3, + -2, -2, -1, -1, -2, -1, 0, -1, + 0, 2, 0, 2, -1, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -1, -2, -2, 0, 0, + -4, 0, -1, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + 0, 0, 0, 0, -1, 0, 0, -3, + -2, 2, 0, -3, -3, -1, 0, -5, + -1, -4, -1, -2, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -11, 0, 5, 0, 0, -3, 0, + 0, 0, 0, -2, 0, -2, 0, 0, + -1, 0, 0, -1, 0, -4, 0, 0, + 7, -2, -5, -5, 1, 2, 2, 0, + -4, 1, 2, 1, 5, 1, 5, -1, + -4, 0, 0, -6, 0, 0, -5, -4, + 0, 0, -3, 0, -2, -3, 0, -2, + 0, -2, 0, -1, 2, 0, -1, -5, + -2, 6, 0, 0, -1, 0, -3, 0, + 0, 2, -4, 0, 2, -2, 1, 0, + 0, -5, 0, -1, 0, 0, -2, 2, + -1, 0, 0, 0, -7, -2, -4, 0, + -5, 0, 0, -8, 0, 6, -2, 0, + -3, 0, 1, 0, -2, 0, -2, -5, + 0, -2, 2, 0, 0, 0, 0, -1, + 0, 0, 2, -2, 0, 0, 0, -2, + -1, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 4, 0, + 0, -1, 0, 0, 0, 0, 0, 0, + -2, -2, 0, 0, 0, 3, 0, 4, + 0, 0, 0, 0, 0, -10, -9, 0, + 7, 5, 3, -6, 1, 7, 0, 6, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserrat_10 = { +#else +lv_font_t lv_font_montserrat_10 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 11, /*The maximum line height required by the font*/ + .base_line = 2, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_10*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_12.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_12.c new file mode 100644 index 0000000..e84d00c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_12.c @@ -0,0 +1,1924 @@ +/******************************************************************************* + * Size: 12 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 12 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_12.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_12 + #define LV_FONT_MONTSERRAT_12 1 +#endif + +#if LV_FONT_MONTSERRAT_12 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xf, 0x40, 0xf3, 0xf, 0x30, 0xf2, 0xe, 0x20, + 0xd1, 0x3, 0x0, 0x81, 0x1e, 0x30, + + /* U+0022 "\"" */ + 0x3c, 0x1e, 0x3b, 0xe, 0x3b, 0xe, 0x15, 0x7, + + /* U+0023 "#" */ + 0x0, 0x48, 0x3, 0xa0, 0x0, 0x6, 0x60, 0x58, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0x10, 0xa, 0x20, + 0x84, 0x0, 0x0, 0xc1, 0xa, 0x30, 0x0, 0xd, + 0x0, 0xb1, 0x0, 0xaf, 0xff, 0xff, 0xfb, 0x0, + 0x1c, 0x0, 0xd0, 0x0, 0x3, 0xa0, 0x1c, 0x0, + 0x0, + + /* U+0024 "$" */ + 0x0, 0x9, 0x20, 0x0, 0x0, 0x92, 0x0, 0x3, + 0xcf, 0xfb, 0x31, 0xf7, 0xa5, 0x74, 0x4e, 0x9, + 0x20, 0x1, 0xf9, 0xb2, 0x0, 0x2, 0xbf, 0xe8, + 0x0, 0x0, 0x97, 0xda, 0x0, 0x9, 0x24, 0xe5, + 0xb4, 0xa5, 0xba, 0x8, 0xef, 0xfa, 0x10, 0x0, + 0x92, 0x0, 0x0, 0x4, 0x10, 0x0, + + /* U+0025 "%" */ + 0xa, 0xc8, 0x0, 0xc, 0x10, 0x66, 0xa, 0x20, + 0x76, 0x0, 0x83, 0x7, 0x42, 0xc0, 0x0, 0x57, + 0xa, 0x2b, 0x20, 0x0, 0x9, 0xc6, 0x68, 0x5c, + 0x90, 0x0, 0x1, 0xc1, 0xc0, 0x67, 0x0, 0xa, + 0x43, 0x90, 0x2a, 0x0, 0x49, 0x1, 0xb0, 0x47, + 0x0, 0xc1, 0x0, 0x7b, 0xb1, + + /* U+0026 "&" */ + 0x0, 0x9e, 0xd4, 0x0, 0x0, 0x5c, 0x3, 0xd0, + 0x0, 0x4, 0xc0, 0x5c, 0x0, 0x0, 0xc, 0xbd, + 0x20, 0x0, 0x3, 0xde, 0x80, 0x10, 0x1, 0xe3, + 0x1d, 0x78, 0x80, 0x6b, 0x0, 0x1d, 0xf2, 0x4, + 0xf4, 0x13, 0xcf, 0x60, 0x6, 0xdf, 0xd6, 0x2b, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x3c, 0x3b, 0x3b, 0x15, + + /* U+0028 "(" */ + 0xa, 0x71, 0xf1, 0x5c, 0x9, 0x80, 0xb6, 0xc, + 0x40, 0xd4, 0xc, 0x40, 0xb6, 0x9, 0x80, 0x5b, + 0x1, 0xf1, 0xa, 0x70, + + /* U+0029 ")" */ + 0x6b, 0x0, 0xf2, 0xb, 0x60, 0x7a, 0x5, 0xc0, + 0x4d, 0x3, 0xe0, 0x4d, 0x5, 0xc0, 0x7a, 0xb, + 0x60, 0xf1, 0x6b, 0x0, + + /* U+002A "*" */ + 0x0, 0xb0, 0x8, 0x9c, 0xb5, 0xb, 0xf8, 0x8, + 0x7c, 0x95, 0x0, 0xa0, 0x0, + + /* U+002B "+" */ + 0x0, 0xb, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0xf, 0x0, 0x2, 0xee, 0xfe, 0xe2, 0x1, 0x1f, + 0x11, 0x0, 0x0, 0xf0, 0x0, + + /* U+002C "," */ + 0x18, 0x4, 0xf1, 0xd, 0x3, 0x80, + + /* U+002D "-" */ + 0x4f, 0xfd, 0x2, 0x22, + + /* U+002E "." */ + 0x2a, 0x4, 0xd0, + + /* U+002F "/" */ + 0x0, 0x0, 0x34, 0x0, 0x0, 0xb5, 0x0, 0x0, + 0xf0, 0x0, 0x5, 0xb0, 0x0, 0xa, 0x60, 0x0, + 0xe, 0x10, 0x0, 0x4c, 0x0, 0x0, 0x97, 0x0, + 0x0, 0xe2, 0x0, 0x3, 0xd0, 0x0, 0x8, 0x70, + 0x0, 0xd, 0x20, 0x0, 0x2d, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x9e, 0xe9, 0x0, 0xa, 0xd4, 0x4d, 0xa0, + 0x1f, 0x20, 0x2, 0xf1, 0x5e, 0x0, 0x0, 0xd5, + 0x6c, 0x0, 0x0, 0xc6, 0x5e, 0x0, 0x0, 0xd5, + 0x1f, 0x20, 0x2, 0xf1, 0xa, 0xd4, 0x4d, 0xa0, + 0x0, 0x9e, 0xe9, 0x0, + + /* U+0031 "1" */ + 0xef, 0xf3, 0x22, 0xf3, 0x0, 0xf3, 0x0, 0xf3, + 0x0, 0xf3, 0x0, 0xf3, 0x0, 0xf3, 0x0, 0xf3, + 0x0, 0xf3, + + /* U+0032 "2" */ + 0x19, 0xef, 0xc2, 0x8, 0xb4, 0x3a, 0xe0, 0x0, + 0x0, 0x2f, 0x10, 0x0, 0x5, 0xe0, 0x0, 0x2, + 0xe5, 0x0, 0x1, 0xd7, 0x0, 0x1, 0xd8, 0x0, + 0x1, 0xda, 0x22, 0x21, 0x8f, 0xff, 0xff, 0x70, + + /* U+0033 "3" */ + 0x9f, 0xff, 0xff, 0x1, 0x22, 0x2d, 0x80, 0x0, + 0x9, 0xb0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x7c, + 0xf8, 0x0, 0x0, 0x2, 0xf2, 0x0, 0x0, 0xe, + 0x4b, 0x94, 0x39, 0xf1, 0x3b, 0xff, 0xc3, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x9b, 0x0, 0x0, 0x4, 0xe1, 0x0, + 0x0, 0x1e, 0x50, 0x0, 0x0, 0xaa, 0x0, 0x0, + 0x5, 0xe1, 0xd, 0x40, 0x1e, 0x40, 0xd, 0x40, + 0x8f, 0xff, 0xff, 0xfd, 0x12, 0x22, 0x2e, 0x62, + 0x0, 0x0, 0xe, 0x40, + + /* U+0035 "5" */ + 0xc, 0xff, 0xff, 0x0, 0xe5, 0x22, 0x20, 0xf, + 0x10, 0x0, 0x1, 0xff, 0xeb, 0x30, 0x2, 0x23, + 0x9f, 0x10, 0x0, 0x0, 0xd6, 0x0, 0x0, 0xd, + 0x69, 0xb4, 0x38, 0xf1, 0x2a, 0xef, 0xc4, 0x0, + + /* U+0036 "6" */ + 0x0, 0x6d, 0xfd, 0x50, 0x8, 0xd5, 0x23, 0x20, + 0x1f, 0x20, 0x0, 0x0, 0x4d, 0x6d, 0xea, 0x10, + 0x6f, 0xc4, 0x3c, 0xa0, 0x5f, 0x30, 0x2, 0xf0, + 0x2f, 0x20, 0x2, 0xf0, 0xa, 0xc3, 0x2b, 0xa0, + 0x1, 0xaf, 0xfa, 0x10, + + /* U+0037 "7" */ + 0xaf, 0xff, 0xff, 0xba, 0x92, 0x22, 0xd7, 0x76, + 0x0, 0x3f, 0x10, 0x0, 0xa, 0x90, 0x0, 0x1, + 0xf2, 0x0, 0x0, 0x7c, 0x0, 0x0, 0xe, 0x50, + 0x0, 0x5, 0xe0, 0x0, 0x0, 0xc8, 0x0, 0x0, + + /* U+0038 "8" */ + 0x3, 0xcf, 0xea, 0x10, 0xe, 0x81, 0x2c, 0xa0, + 0x2f, 0x10, 0x5, 0xd0, 0xe, 0x70, 0x1b, 0x90, + 0x6, 0xff, 0xff, 0x20, 0x3f, 0x50, 0x18, 0xe0, + 0x6c, 0x0, 0x0, 0xf2, 0x3f, 0x61, 0x29, 0xe0, + 0x5, 0xcf, 0xfb, 0x20, + + /* U+0039 "9" */ + 0x7, 0xef, 0xc3, 0x6, 0xe3, 0x15, 0xe1, 0x98, + 0x0, 0xb, 0x87, 0xd2, 0x3, 0xfb, 0xa, 0xff, + 0xd9, 0xc0, 0x0, 0x10, 0x8b, 0x0, 0x0, 0xd, + 0x70, 0x62, 0x4b, 0xd0, 0x1c, 0xfe, 0xa1, 0x0, + + /* U+003A ":" */ + 0x4e, 0x2, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xa0, 0x4d, 0x0, + + /* U+003B ";" */ + 0x4e, 0x2, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x80, 0x4f, 0x10, 0xd0, 0x38, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x2, 0x10, 0x0, 0x4b, 0xe1, 0x7, + 0xdc, 0x50, 0x3, 0xf8, 0x0, 0x0, 0x4, 0xbe, + 0x71, 0x0, 0x0, 0x29, 0xe2, 0x0, 0x0, 0x0, + 0x0, + + /* U+003D "=" */ + 0x3f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xee, 0xee, 0xe2, 0x1, 0x11, + 0x11, 0x0, + + /* U+003E ">" */ + 0x12, 0x0, 0x0, 0x2, 0xeb, 0x40, 0x0, 0x0, + 0x5c, 0xd6, 0x0, 0x0, 0x8, 0xf2, 0x1, 0x7e, + 0xb4, 0x2, 0xe9, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+003F "?" */ + 0x1a, 0xef, 0xc3, 0x9, 0xa3, 0x2a, 0xe0, 0x0, + 0x0, 0x3f, 0x0, 0x0, 0xa, 0xa0, 0x0, 0x9, + 0xc0, 0x0, 0x2, 0xf1, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x2, 0x80, 0x0, 0x0, 0x4d, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x4, 0xbd, 0xdd, 0x81, 0x0, 0x0, 0x9b, + 0x30, 0x0, 0x6d, 0x30, 0x7, 0xa0, 0x8e, 0xe8, + 0xd5, 0xd1, 0xd, 0x7, 0xd2, 0x19, 0xf3, 0x77, + 0x4a, 0xd, 0x40, 0x0, 0xf3, 0x1b, 0x58, 0xf, + 0x20, 0x0, 0xd3, 0xc, 0x58, 0xd, 0x40, 0x0, + 0xf3, 0x1b, 0x3a, 0x7, 0xd2, 0x1a, 0xf5, 0x77, + 0xd, 0x0, 0x8e, 0xe8, 0x5f, 0xb0, 0x6, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9b, 0x30, 0x2, + 0x40, 0x0, 0x0, 0x5, 0xbd, 0xed, 0x60, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x6f, 0x30, 0x0, 0x0, 0x0, 0xdd, + 0x90, 0x0, 0x0, 0x4, 0xe3, 0xf1, 0x0, 0x0, + 0xb, 0x80, 0xc7, 0x0, 0x0, 0x1f, 0x20, 0x6e, + 0x0, 0x0, 0x8c, 0x0, 0x1f, 0x50, 0x0, 0xef, + 0xee, 0xef, 0xb0, 0x6, 0xe2, 0x11, 0x14, 0xf2, + 0xc, 0x70, 0x0, 0x0, 0xb9, + + /* U+0042 "B" */ + 0xbf, 0xff, 0xfb, 0x20, 0xb7, 0x11, 0x2a, 0xd0, + 0xb7, 0x0, 0x3, 0xf0, 0xb7, 0x0, 0x8, 0xc0, + 0xbf, 0xff, 0xff, 0x50, 0xb8, 0x22, 0x26, 0xf2, + 0xb7, 0x0, 0x0, 0xc7, 0xb7, 0x11, 0x15, 0xf4, + 0xbf, 0xff, 0xfd, 0x60, + + /* U+0043 "C" */ + 0x0, 0x3b, 0xef, 0xb3, 0x0, 0x5f, 0x93, 0x38, + 0xe0, 0xe, 0x60, 0x0, 0x0, 0x4, 0xe0, 0x0, + 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, 0x4, 0xe0, + 0x0, 0x0, 0x0, 0xe, 0x60, 0x0, 0x0, 0x0, + 0x5f, 0x93, 0x38, 0xe0, 0x0, 0x3b, 0xff, 0xb3, + 0x0, + + /* U+0044 "D" */ + 0xbf, 0xff, 0xea, 0x30, 0xb, 0x82, 0x23, 0x9f, + 0x40, 0xb7, 0x0, 0x0, 0x7e, 0xb, 0x70, 0x0, + 0x0, 0xf3, 0xb7, 0x0, 0x0, 0xe, 0x5b, 0x70, + 0x0, 0x0, 0xf3, 0xb7, 0x0, 0x0, 0x7e, 0xb, + 0x82, 0x23, 0x9f, 0x40, 0xbf, 0xff, 0xeb, 0x30, + 0x0, + + /* U+0045 "E" */ + 0xbf, 0xff, 0xff, 0x3b, 0x82, 0x22, 0x20, 0xb7, + 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xbf, 0xff, + 0xfa, 0xb, 0x82, 0x22, 0x10, 0xb7, 0x0, 0x0, + 0xb, 0x82, 0x22, 0x20, 0xbf, 0xff, 0xff, 0x50, + + /* U+0046 "F" */ + 0xbf, 0xff, 0xff, 0x3b, 0x82, 0x22, 0x20, 0xb7, + 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xbf, 0xff, + 0xfa, 0xb, 0x82, 0x22, 0x10, 0xb7, 0x0, 0x0, + 0xb, 0x70, 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x3b, 0xef, 0xc4, 0x0, 0x5f, 0x94, 0x38, + 0xe1, 0xe, 0x70, 0x0, 0x0, 0x4, 0xe0, 0x0, + 0x0, 0x0, 0x6c, 0x0, 0x0, 0x8, 0x24, 0xe0, + 0x0, 0x0, 0xe3, 0xe, 0x60, 0x0, 0xe, 0x30, + 0x5f, 0x93, 0x37, 0xf3, 0x0, 0x3b, 0xef, 0xc4, + 0x0, + + /* U+0048 "H" */ + 0xb7, 0x0, 0x0, 0xb7, 0xb7, 0x0, 0x0, 0xb7, + 0xb7, 0x0, 0x0, 0xb7, 0xb7, 0x0, 0x0, 0xb7, + 0xbf, 0xff, 0xff, 0xf7, 0xb8, 0x22, 0x22, 0xc7, + 0xb7, 0x0, 0x0, 0xb7, 0xb7, 0x0, 0x0, 0xb7, + 0xb7, 0x0, 0x0, 0xb7, + + /* U+0049 "I" */ + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb7, + + /* U+004A "J" */ + 0x4, 0xff, 0xff, 0x0, 0x22, 0x5f, 0x0, 0x0, + 0x3f, 0x0, 0x0, 0x3f, 0x0, 0x0, 0x3f, 0x0, + 0x0, 0x3f, 0x0, 0x0, 0x4e, 0xd, 0x52, 0xba, + 0x5, 0xdf, 0xb2, + + /* U+004B "K" */ + 0xb7, 0x0, 0x7, 0xd1, 0xb7, 0x0, 0x5e, 0x20, + 0xb7, 0x4, 0xe3, 0x0, 0xb7, 0x3e, 0x40, 0x0, + 0xb9, 0xef, 0x20, 0x0, 0xbf, 0x89, 0xd0, 0x0, + 0xba, 0x0, 0xca, 0x0, 0xb7, 0x0, 0x1e, 0x70, + 0xb7, 0x0, 0x3, 0xf3, + + /* U+004C "L" */ + 0xb7, 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xb7, + 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xb7, 0x0, + 0x0, 0xb, 0x70, 0x0, 0x0, 0xb7, 0x0, 0x0, + 0xb, 0x82, 0x22, 0x20, 0xbf, 0xff, 0xff, 0x0, + + /* U+004D "M" */ + 0xb8, 0x0, 0x0, 0x1, 0xf3, 0xbf, 0x10, 0x0, + 0x9, 0xf3, 0xbe, 0xa0, 0x0, 0x2e, 0xf3, 0xb7, + 0xe3, 0x0, 0xb7, 0xf3, 0xb6, 0x7b, 0x4, 0xd0, + 0xf3, 0xb6, 0xd, 0x4c, 0x50, 0xf3, 0xb6, 0x5, + 0xfc, 0x0, 0xf3, 0xb6, 0x0, 0xb3, 0x0, 0xf3, + 0xb6, 0x0, 0x0, 0x0, 0xf3, + + /* U+004E "N" */ + 0xb9, 0x0, 0x0, 0xb7, 0xbf, 0x50, 0x0, 0xb7, + 0xbc, 0xf2, 0x0, 0xb7, 0xb7, 0xad, 0x0, 0xb7, + 0xb7, 0xd, 0x90, 0xb7, 0xb7, 0x2, 0xf5, 0xb7, + 0xb7, 0x0, 0x6f, 0xd7, 0xb7, 0x0, 0xa, 0xf7, + 0xb7, 0x0, 0x0, 0xd7, + + /* U+004F "O" */ + 0x0, 0x3b, 0xef, 0xb4, 0x0, 0x5, 0xf9, 0x33, + 0x8f, 0x60, 0xe, 0x60, 0x0, 0x5, 0xf1, 0x4e, + 0x0, 0x0, 0x0, 0xd5, 0x6c, 0x0, 0x0, 0x0, + 0xb7, 0x4e, 0x0, 0x0, 0x0, 0xd5, 0xe, 0x60, + 0x0, 0x5, 0xf1, 0x5, 0xf9, 0x33, 0x8f, 0x60, + 0x0, 0x3b, 0xef, 0xb4, 0x0, + + /* U+0050 "P" */ + 0xbf, 0xff, 0xd8, 0x0, 0xb8, 0x22, 0x5d, 0x90, + 0xb7, 0x0, 0x4, 0xe0, 0xb7, 0x0, 0x3, 0xf0, + 0xb7, 0x0, 0x2c, 0xa0, 0xbf, 0xff, 0xfa, 0x10, + 0xb8, 0x22, 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, + 0xb7, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x3b, 0xef, 0xb4, 0x0, 0x4, 0xf9, 0x33, + 0x8f, 0x60, 0xe, 0x60, 0x0, 0x5, 0xf1, 0x4e, + 0x0, 0x0, 0x0, 0xd5, 0x6c, 0x0, 0x0, 0x0, + 0xb7, 0x4e, 0x0, 0x0, 0x0, 0xd6, 0xf, 0x60, + 0x0, 0x5, 0xf1, 0x5, 0xf8, 0x32, 0x7f, 0x60, + 0x0, 0x4c, 0xff, 0xc5, 0x0, 0x0, 0x0, 0xc, + 0xb0, 0x28, 0x0, 0x0, 0x1, 0xbf, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0052 "R" */ + 0xbf, 0xff, 0xd8, 0x0, 0xb8, 0x22, 0x5d, 0x90, + 0xb7, 0x0, 0x4, 0xe0, 0xb7, 0x0, 0x3, 0xf0, + 0xb7, 0x0, 0x1b, 0xb0, 0xbf, 0xff, 0xfb, 0x10, + 0xb8, 0x22, 0xb9, 0x0, 0xb7, 0x0, 0x1f, 0x30, + 0xb7, 0x0, 0x7, 0xd0, + + /* U+0053 "S" */ + 0x3, 0xcf, 0xeb, 0x31, 0xf7, 0x23, 0x74, 0x4e, + 0x0, 0x0, 0x1, 0xf9, 0x20, 0x0, 0x2, 0xbf, + 0xd7, 0x0, 0x0, 0x4, 0xca, 0x0, 0x0, 0x4, + 0xe5, 0xb4, 0x23, 0xbb, 0x8, 0xdf, 0xea, 0x10, + + /* U+0054 "T" */ + 0xff, 0xff, 0xff, 0xf2, 0x23, 0xf3, 0x22, 0x0, + 0x1f, 0x10, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1f, + 0x10, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1f, 0x10, + 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1f, 0x10, 0x0, + + /* U+0055 "U" */ + 0xd6, 0x0, 0x0, 0xe4, 0xd6, 0x0, 0x0, 0xe4, + 0xd6, 0x0, 0x0, 0xe4, 0xd6, 0x0, 0x0, 0xe4, + 0xd6, 0x0, 0x0, 0xe4, 0xc7, 0x0, 0x0, 0xf3, + 0x9a, 0x0, 0x2, 0xf1, 0x2f, 0x83, 0x5d, 0xa0, + 0x4, 0xcf, 0xd8, 0x0, + + /* U+0056 "V" */ + 0xc, 0x70, 0x0, 0x0, 0xd5, 0x6, 0xe0, 0x0, + 0x4, 0xe0, 0x0, 0xf4, 0x0, 0xa, 0x80, 0x0, + 0x9b, 0x0, 0x1f, 0x20, 0x0, 0x2f, 0x20, 0x7b, + 0x0, 0x0, 0xc, 0x80, 0xe4, 0x0, 0x0, 0x5, + 0xe5, 0xe0, 0x0, 0x0, 0x0, 0xee, 0x70, 0x0, + 0x0, 0x0, 0x8f, 0x10, 0x0, + + /* U+0057 "W" */ + 0x7c, 0x0, 0x0, 0xe8, 0x0, 0x2, 0xf0, 0x2f, + 0x10, 0x3, 0xfd, 0x0, 0x7, 0xa0, 0xd, 0x60, + 0x8, 0x9f, 0x20, 0xc, 0x50, 0x8, 0xb0, 0xe, + 0x3b, 0x70, 0x1f, 0x0, 0x3, 0xf0, 0x3e, 0x6, + 0xc0, 0x6b, 0x0, 0x0, 0xe5, 0x89, 0x1, 0xf1, + 0xb6, 0x0, 0x0, 0x9a, 0xd4, 0x0, 0xb7, 0xf1, + 0x0, 0x0, 0x4f, 0xe0, 0x0, 0x6f, 0xc0, 0x0, + 0x0, 0xf, 0xa0, 0x0, 0x1f, 0x70, 0x0, + + /* U+0058 "X" */ + 0x5f, 0x10, 0x0, 0xe5, 0xa, 0xb0, 0x9, 0xa0, + 0x1, 0xe6, 0x4e, 0x10, 0x0, 0x4f, 0xe4, 0x0, + 0x0, 0xd, 0xe0, 0x0, 0x0, 0x7d, 0xd8, 0x0, + 0x2, 0xf3, 0x2f, 0x30, 0xc, 0x80, 0x7, 0xd0, + 0x8d, 0x0, 0x0, 0xc9, + + /* U+0059 "Y" */ + 0xc, 0x80, 0x0, 0xa, 0x80, 0x3f, 0x10, 0x3, + 0xe0, 0x0, 0xaa, 0x0, 0xc6, 0x0, 0x1, 0xf3, + 0x5d, 0x0, 0x0, 0x7, 0xce, 0x40, 0x0, 0x0, + 0xe, 0xb0, 0x0, 0x0, 0x0, 0xb7, 0x0, 0x0, + 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, 0xb7, 0x0, + 0x0, + + /* U+005A "Z" */ + 0x6f, 0xff, 0xff, 0xf5, 0x2, 0x22, 0x29, 0xd0, + 0x0, 0x0, 0x3f, 0x30, 0x0, 0x1, 0xe6, 0x0, + 0x0, 0xb, 0xa0, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x4, 0xf2, 0x0, 0x0, 0x1e, 0x82, 0x22, 0x21, + 0x7f, 0xff, 0xff, 0xf8, + + /* U+005B "[" */ + 0xbf, 0xcb, 0x60, 0xb6, 0xb, 0x60, 0xb6, 0xb, + 0x60, 0xb6, 0xb, 0x60, 0xb6, 0xb, 0x60, 0xb6, + 0xb, 0x60, 0xbf, 0xc0, + + /* U+005C "\\" */ + 0x35, 0x0, 0x0, 0x2e, 0x0, 0x0, 0xd, 0x30, + 0x0, 0x8, 0x80, 0x0, 0x3, 0xd0, 0x0, 0x0, + 0xd2, 0x0, 0x0, 0x87, 0x0, 0x0, 0x3c, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x9, 0x70, 0x0, 0x4, + 0xc0, 0x0, 0x0, 0xe1, 0x0, 0x0, 0xa6, + + /* U+005D "]" */ + 0xcf, 0xb0, 0x7b, 0x6, 0xb0, 0x6b, 0x6, 0xb0, + 0x6b, 0x6, 0xb0, 0x6b, 0x6, 0xb0, 0x6b, 0x6, + 0xb0, 0x7b, 0xcf, 0xb0, + + /* U+005E "^" */ + 0x0, 0x7, 0x0, 0x0, 0x5, 0xe5, 0x0, 0x0, + 0xb4, 0xb0, 0x0, 0x2c, 0xc, 0x20, 0x8, 0x60, + 0x68, 0x0, 0xd0, 0x0, 0xd0, + + /* U+005F "_" */ + 0xdd, 0xdd, 0xdd, + + /* U+0060 "`" */ + 0x27, 0x10, 0x5, 0xc1, + + /* U+0061 "a" */ + 0x8, 0xdf, 0xc3, 0x0, 0xa4, 0x29, 0xd0, 0x0, + 0x0, 0x1f, 0x10, 0x8d, 0xee, 0xf2, 0x4e, 0x10, + 0xf, 0x24, 0xe0, 0x7, 0xf2, 0x9, 0xed, 0x8f, + 0x20, + + /* U+0062 "b" */ + 0xe4, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0xe4, + 0x0, 0x0, 0xe, 0x7c, 0xfc, 0x40, 0xef, 0x52, + 0x8f, 0x2e, 0x60, 0x0, 0xb8, 0xe4, 0x0, 0x8, + 0xae, 0x60, 0x0, 0xb8, 0xef, 0x52, 0x8f, 0x2e, + 0x6d, 0xfc, 0x40, + + /* U+0063 "c" */ + 0x2, 0xbf, 0xe8, 0x0, 0xda, 0x24, 0xc3, 0x5d, + 0x0, 0x0, 0x7, 0xb0, 0x0, 0x0, 0x5d, 0x0, + 0x0, 0x0, 0xda, 0x24, 0xd3, 0x2, 0xbf, 0xe8, + 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1, 0xf1, + 0x0, 0x0, 0x1, 0xf1, 0x2, 0xbf, 0xd6, 0xf1, + 0xe, 0x92, 0x3d, 0xf1, 0x5d, 0x0, 0x4, 0xf1, + 0x7b, 0x0, 0x1, 0xf1, 0x5d, 0x0, 0x3, 0xf1, + 0xe, 0x91, 0x2d, 0xf1, 0x2, 0xbf, 0xe6, 0xf1, + + /* U+0065 "e" */ + 0x2, 0xbf, 0xd5, 0x0, 0xe8, 0x14, 0xe4, 0x5c, + 0x0, 0x6, 0xb7, 0xfe, 0xee, 0xec, 0x5d, 0x0, + 0x0, 0x0, 0xe9, 0x23, 0xa2, 0x2, 0xbf, 0xe9, + 0x0, + + /* U+0066 "f" */ + 0x1, 0xcf, 0x60, 0x9a, 0x11, 0xb, 0x60, 0xd, + 0xff, 0xf3, 0xb, 0x60, 0x0, 0xb6, 0x0, 0xb, + 0x60, 0x0, 0xb6, 0x0, 0xb, 0x60, 0x0, 0xb6, + 0x0, + + /* U+0067 "g" */ + 0x2, 0xbf, 0xe6, 0xe2, 0xe, 0xa2, 0x3c, 0xf2, + 0x5d, 0x0, 0x2, 0xf2, 0x7b, 0x0, 0x0, 0xf2, + 0x5d, 0x0, 0x2, 0xf2, 0xe, 0xa2, 0x3d, 0xf2, + 0x2, 0xbf, 0xe5, 0xf2, 0x0, 0x0, 0x2, 0xf0, + 0xc, 0x62, 0x3b, 0xa0, 0x6, 0xdf, 0xea, 0x10, + + /* U+0068 "h" */ + 0xe4, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0xe4, + 0x0, 0x0, 0xe, 0x7d, 0xfc, 0x20, 0xee, 0x42, + 0xac, 0xe, 0x60, 0x2, 0xf0, 0xe4, 0x0, 0xf, + 0x1e, 0x40, 0x0, 0xf2, 0xe4, 0x0, 0xf, 0x2e, + 0x40, 0x0, 0xf2, + + /* U+0069 "i" */ + 0xd, 0x40, 0x82, 0x0, 0x0, 0xe4, 0xe, 0x40, + 0xe4, 0xe, 0x40, 0xe4, 0xe, 0x40, 0xe4, + + /* U+006A "j" */ + 0x0, 0xd, 0x50, 0x0, 0x72, 0x0, 0x0, 0x0, + 0x0, 0xd4, 0x0, 0xd, 0x40, 0x0, 0xd4, 0x0, + 0xd, 0x40, 0x0, 0xd4, 0x0, 0xd, 0x40, 0x0, + 0xd4, 0x0, 0xd, 0x40, 0x22, 0xf2, 0xd, 0xf8, + 0x0, + + /* U+006B "k" */ + 0xe4, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0xe4, + 0x0, 0x0, 0xe, 0x40, 0xb, 0xa0, 0xe4, 0xb, + 0xb0, 0xe, 0x4b, 0xc0, 0x0, 0xee, 0xfd, 0x0, + 0xe, 0xc1, 0xd9, 0x0, 0xe4, 0x2, 0xf4, 0xe, + 0x40, 0x6, 0xe1, + + /* U+006C "l" */ + 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, + 0xe4, 0xe4, + + /* U+006D "m" */ + 0xe7, 0xdf, 0xb2, 0x9e, 0xe8, 0xe, 0xd3, 0x2c, + 0xfb, 0x23, 0xe5, 0xe6, 0x0, 0x4f, 0x10, 0x9, + 0x9e, 0x40, 0x3, 0xf0, 0x0, 0x8a, 0xe4, 0x0, + 0x3f, 0x0, 0x8, 0xae, 0x40, 0x3, 0xf0, 0x0, + 0x8a, 0xe4, 0x0, 0x3f, 0x0, 0x8, 0xa0, + + /* U+006E "n" */ + 0xe6, 0xdf, 0xc2, 0xe, 0xe4, 0x1a, 0xc0, 0xe6, + 0x0, 0x1f, 0xe, 0x40, 0x0, 0xf1, 0xe4, 0x0, + 0xf, 0x2e, 0x40, 0x0, 0xf2, 0xe4, 0x0, 0xf, + 0x20, + + /* U+006F "o" */ + 0x2, 0xbf, 0xe8, 0x0, 0xe, 0xa2, 0x3e, 0x80, + 0x5d, 0x0, 0x4, 0xf0, 0x7b, 0x0, 0x1, 0xf1, + 0x5d, 0x0, 0x4, 0xf0, 0xd, 0xa2, 0x3e, 0x80, + 0x2, 0xbf, 0xe8, 0x0, + + /* U+0070 "p" */ + 0xe7, 0xdf, 0xc4, 0xe, 0xf4, 0x16, 0xf2, 0xe6, + 0x0, 0xa, 0x8e, 0x40, 0x0, 0x8a, 0xe7, 0x0, + 0xb, 0x8e, 0xf5, 0x28, 0xf2, 0xe6, 0xcf, 0xc4, + 0xe, 0x40, 0x0, 0x0, 0xe4, 0x0, 0x0, 0xe, + 0x40, 0x0, 0x0, + + /* U+0071 "q" */ + 0x2, 0xbf, 0xd5, 0xf1, 0xe, 0xa2, 0x3e, 0xf1, + 0x5d, 0x0, 0x4, 0xf1, 0x7b, 0x0, 0x1, 0xf1, + 0x5d, 0x0, 0x4, 0xf1, 0xe, 0xa2, 0x3e, 0xf1, + 0x2, 0xbf, 0xd5, 0xf1, 0x0, 0x0, 0x1, 0xf1, + 0x0, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1, 0xf1, + + /* U+0072 "r" */ + 0xe6, 0xd8, 0xee, 0x61, 0xe7, 0x0, 0xe4, 0x0, + 0xe4, 0x0, 0xe4, 0x0, 0xe4, 0x0, + + /* U+0073 "s" */ + 0x9, 0xef, 0xc2, 0x6d, 0x22, 0x61, 0x7d, 0x20, + 0x0, 0x9, 0xfe, 0x91, 0x0, 0x2, 0xc9, 0x56, + 0x22, 0xb8, 0x4c, 0xfe, 0xa0, + + /* U+0074 "t" */ + 0x5, 0x30, 0x0, 0xb6, 0x0, 0xdf, 0xff, 0x30, + 0xb6, 0x0, 0xb, 0x60, 0x0, 0xb6, 0x0, 0xb, + 0x60, 0x0, 0xaa, 0x11, 0x2, 0xdf, 0x60, + + /* U+0075 "u" */ + 0xf3, 0x0, 0x2f, 0xf, 0x30, 0x2, 0xf0, 0xf3, + 0x0, 0x2f, 0xf, 0x30, 0x2, 0xf0, 0xe4, 0x0, + 0x4f, 0xa, 0xb2, 0x2c, 0xf0, 0x1b, 0xfe, 0x6f, + 0x0, + + /* U+0076 "v" */ + 0xd, 0x50, 0x0, 0x98, 0x6, 0xc0, 0x0, 0xf2, + 0x1, 0xf2, 0x6, 0xb0, 0x0, 0xa8, 0xc, 0x50, + 0x0, 0x3e, 0x3e, 0x0, 0x0, 0xd, 0xd8, 0x0, + 0x0, 0x6, 0xf2, 0x0, + + /* U+0077 "w" */ + 0xc5, 0x0, 0x3f, 0x10, 0x7, 0x86, 0xa0, 0x9, + 0xf6, 0x0, 0xd3, 0x1f, 0x0, 0xe7, 0xb0, 0x2d, + 0x0, 0xb5, 0x4c, 0xe, 0x18, 0x80, 0x6, 0xa9, + 0x60, 0xa6, 0xd3, 0x0, 0x1f, 0xe1, 0x4, 0xed, + 0x0, 0x0, 0xbb, 0x0, 0xe, 0x80, 0x0, + + /* U+0078 "x" */ + 0x5d, 0x0, 0x4e, 0x10, 0xa9, 0x1e, 0x40, 0x1, + 0xed, 0x90, 0x0, 0x8, 0xf1, 0x0, 0x2, 0xeb, + 0xa0, 0x0, 0xc7, 0xd, 0x60, 0x7c, 0x0, 0x3f, + 0x20, + + /* U+0079 "y" */ + 0xd, 0x50, 0x0, 0x98, 0x7, 0xb0, 0x0, 0xe2, + 0x1, 0xf2, 0x5, 0xc0, 0x0, 0xa7, 0xb, 0x50, + 0x0, 0x4d, 0x1e, 0x0, 0x0, 0xe, 0xb9, 0x0, + 0x0, 0x8, 0xf3, 0x0, 0x0, 0x5, 0xd0, 0x0, + 0x5, 0x2c, 0x60, 0x0, 0x1c, 0xf9, 0x0, 0x0, + + /* U+007A "z" */ + 0x7f, 0xff, 0xfb, 0x0, 0x2, 0xf3, 0x0, 0xc, + 0x70, 0x0, 0x9b, 0x0, 0x4, 0xe1, 0x0, 0x1e, + 0x50, 0x0, 0x8f, 0xff, 0xfd, + + /* U+007B "{" */ + 0x0, 0xbf, 0x4, 0xe1, 0x5, 0xc0, 0x5, 0xc0, + 0x5, 0xc0, 0x6, 0xc0, 0x4f, 0x60, 0x8, 0xc0, + 0x5, 0xc0, 0x5, 0xc0, 0x5, 0xc0, 0x4, 0xe1, + 0x0, 0xbf, + + /* U+007C "|" */ + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + + /* U+007D "}" */ + 0xcd, 0x10, 0xc, 0x70, 0x9, 0x90, 0x9, 0x90, + 0x9, 0x90, 0x8, 0xa0, 0x3, 0xf7, 0x8, 0xb0, + 0x9, 0x90, 0x9, 0x90, 0x9, 0x90, 0xc, 0x80, + 0xcd, 0x20, + + /* U+007E "~" */ + 0xb, 0xe8, 0xa, 0x33, 0x91, 0x8d, 0xa0, + + /* U+00B0 "°" */ + 0x6, 0xb7, 0x3, 0x80, 0x84, 0x64, 0x3, 0x73, + 0x80, 0x84, 0x6, 0xb7, 0x0, + + /* U+2022 "•" */ + 0x4, 0x22, 0xfe, 0xd, 0xa0, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, + 0x0, 0x3, 0x7c, 0xff, 0x0, 0x0, 0x59, 0xef, + 0xff, 0xff, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xfd, 0x84, 0x8f, 0x0, 0xf, + 0xd7, 0x20, 0x0, 0x8f, 0x0, 0xf, 0x80, 0x0, + 0x0, 0x8f, 0x0, 0xf, 0x80, 0x0, 0x0, 0x8f, + 0x0, 0xf, 0x80, 0x0, 0x7b, 0xdf, 0x2, 0x3f, + 0x80, 0x6, 0xff, 0xff, 0xaf, 0xff, 0x80, 0x2, + 0xef, 0xf9, 0xef, 0xff, 0x60, 0x0, 0x2, 0x10, + 0x29, 0xa7, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0xb4, 0xdf, 0xff, 0xff, 0xfd, 0x4b, 0xe8, 0xe7, + 0x22, 0x22, 0x7e, 0x8e, 0xc0, 0xc5, 0x0, 0x0, + 0x6c, 0xc, 0xfc, 0xf6, 0x11, 0x11, 0x7f, 0xcf, + 0xc0, 0xcf, 0xff, 0xff, 0xfb, 0xc, 0xfc, 0xf6, + 0x11, 0x11, 0x7f, 0xcf, 0xc0, 0xc5, 0x0, 0x0, + 0x6c, 0xc, 0xe8, 0xe7, 0x22, 0x22, 0x7e, 0x8e, + 0xb4, 0xdf, 0xff, 0xff, 0xfd, 0x4b, + + /* U+F00B "" */ + 0xdf, 0xf6, 0x9f, 0xff, 0xff, 0xfd, 0xff, 0xf8, + 0xcf, 0xff, 0xff, 0xff, 0xef, 0xf6, 0xaf, 0xff, + 0xff, 0xfe, 0x13, 0x20, 0x3, 0x33, 0x33, 0x31, + 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbf, 0xff, + 0xff, 0xff, 0x13, 0x20, 0x3, 0x33, 0x33, 0x31, + 0xef, 0xf6, 0xaf, 0xff, 0xff, 0xfe, 0xff, 0xf8, + 0xcf, 0xff, 0xff, 0xff, 0xdf, 0xf6, 0xaf, 0xff, + 0xff, 0xfd, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf4, 0x4d, 0x30, 0x0, 0x3f, 0xff, 0x40, + 0xef, 0xf3, 0x3, 0xff, 0xf4, 0x0, 0x4f, 0xff, + 0x6f, 0xff, 0x40, 0x0, 0x4, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x3, 0xd3, 0x0, 0x0, 0x0, + + /* U+F00D "ï€" */ + 0x14, 0x0, 0x0, 0x22, 0xd, 0xf7, 0x0, 0x4f, + 0xf1, 0x9f, 0xf7, 0x4f, 0xfd, 0x0, 0xaf, 0xff, + 0xfd, 0x10, 0x0, 0xbf, 0xfe, 0x10, 0x0, 0x4f, + 0xff, 0xf7, 0x0, 0x4f, 0xfd, 0xaf, 0xf7, 0xe, + 0xfd, 0x10, 0xaf, 0xf2, 0x5b, 0x10, 0x0, 0x99, + 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x7, 0x70, 0x0, 0x0, 0x0, 0x32, + 0xf, 0xf0, 0x24, 0x0, 0x5, 0xfc, 0xf, 0xf0, + 0xcf, 0x50, 0x1f, 0xf4, 0xf, 0xf0, 0x5f, 0xf1, + 0x7f, 0x80, 0xf, 0xf0, 0x8, 0xf7, 0xbf, 0x20, + 0xf, 0xf0, 0x2, 0xfb, 0xcf, 0x10, 0xe, 0xe0, + 0x1, 0xfc, 0xaf, 0x40, 0x1, 0x10, 0x4, 0xfa, + 0x5f, 0xb0, 0x0, 0x0, 0xb, 0xf6, 0xd, 0xfa, + 0x10, 0x1, 0xaf, 0xd0, 0x2, 0xdf, 0xfc, 0xcf, + 0xfd, 0x20, 0x0, 0x8, 0xef, 0xfe, 0x91, 0x0, + 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x14, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf7, 0x0, 0x0, 0x3, 0x43, 0xdf, 0xfd, + 0x34, 0x30, 0xe, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x6f, 0xff, 0xfb, 0xbf, 0xff, 0xf6, 0x1b, 0xff, + 0x70, 0x7, 0xff, 0xb1, 0x7, 0xff, 0x20, 0x2, + 0xff, 0x70, 0x1b, 0xff, 0x70, 0x7, 0xff, 0xb1, + 0x6f, 0xff, 0xfb, 0xbf, 0xff, 0xf6, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x3, 0x42, 0xcf, 0xfc, + 0x23, 0x30, 0x0, 0x0, 0x7f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x41, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x73, 0x3, 0x83, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0x67, 0xf7, 0x0, 0x0, 0x3, + 0xee, 0x5a, 0xfe, 0xf7, 0x0, 0x0, 0x6f, 0xd3, + 0xb5, 0x7f, 0xf7, 0x0, 0x9, 0xfb, 0x3d, 0xff, + 0x85, 0xfe, 0x30, 0xbf, 0x95, 0xff, 0xff, 0xfb, + 0x3e, 0xf4, 0x76, 0x6f, 0xff, 0xff, 0xff, 0xd2, + 0xa1, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xfa, 0x2, 0xff, 0xf4, 0x0, 0x0, + 0xcf, 0xfa, 0x2, 0xff, 0xf4, 0x0, 0x0, 0xaf, + 0xf8, 0x1, 0xff, 0xf3, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x27, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, + 0x23, 0x33, 0x5f, 0xf5, 0x33, 0x32, 0xff, 0xff, + 0xa4, 0x4a, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x8f, + 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, + + /* U+F01C "" */ + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1, + 0xed, 0x88, 0x88, 0x89, 0xf8, 0x0, 0xa, 0xf2, + 0x0, 0x0, 0x0, 0xaf, 0x30, 0x5f, 0x70, 0x0, + 0x0, 0x0, 0x1e, 0xc0, 0xef, 0x88, 0x60, 0x0, + 0x28, 0x8b, 0xf6, 0xff, 0xff, 0xf3, 0x0, 0xbf, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + + /* U+F021 "" */ + 0x0, 0x0, 0x1, 0x10, 0x0, 0x59, 0x0, 0x19, + 0xef, 0xfd, 0x70, 0x9f, 0x3, 0xef, 0xda, 0x9d, + 0xfe, 0xbf, 0xe, 0xf6, 0x0, 0x0, 0x5f, 0xff, + 0x7f, 0x70, 0x0, 0x3f, 0xff, 0xff, 0x69, 0x0, + 0x0, 0x2a, 0xaa, 0xa9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaa, 0xaa, 0xa2, 0x0, 0x0, 0xa6, + 0xff, 0xfe, 0xf3, 0x0, 0x7, 0xf7, 0xff, 0xf5, + 0x0, 0x0, 0x7f, 0xe0, 0xfb, 0xef, 0xd9, 0xad, + 0xfe, 0x30, 0xfa, 0x8, 0xef, 0xfe, 0x91, 0x0, + 0x95, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x2a, 0x0, 0x2, 0xef, 0x78, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0x0, 0x7, 0xff, + 0x0, 0x0, 0x7f, 0x0, 0x0, 0x1, + + /* U+F027 "" */ + 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x2e, 0xf0, + 0x0, 0x78, 0x8e, 0xff, 0x3, 0xf, 0xff, 0xff, + 0xf0, 0xba, 0xff, 0xff, 0xff, 0x3, 0xff, 0xff, + 0xff, 0xf0, 0xaa, 0xdf, 0xff, 0xff, 0x4, 0x0, + 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x0, 0x8f, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xd2, 0x0, 0x0, 0x0, + 0x2a, 0x0, 0x11, 0x8e, 0x10, 0x0, 0x2, 0xef, + 0x0, 0x7d, 0x2b, 0x90, 0x78, 0x8e, 0xff, 0x3, + 0xa, 0xb3, 0xf0, 0xff, 0xff, 0xff, 0xb, 0xa1, + 0xf1, 0xe3, 0xff, 0xff, 0xff, 0x3, 0xf0, 0xe3, + 0xc5, 0xff, 0xff, 0xff, 0xb, 0xa1, 0xf1, 0xe3, + 0xdf, 0xff, 0xff, 0x3, 0xa, 0xb3, 0xf0, 0x0, + 0x7, 0xff, 0x0, 0x7d, 0x2b, 0x90, 0x0, 0x0, + 0x7f, 0x0, 0x11, 0x9e, 0x10, 0x0, 0x0, 0x1, + 0x0, 0x6, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfd, 0x5b, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x1, 0xff, 0xff, + 0xef, 0xff, 0xfb, 0x18, 0xff, 0xf6, 0x1c, 0xff, + 0xff, 0xfc, 0xff, 0x60, 0x1, 0xdf, 0xff, 0x60, + 0x96, 0x0, 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfc, 0x88, 0x88, 0x88, 0x88, 0xcf, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F043 "ïƒ" */ + 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, 0xcf, 0x10, + 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, 0xa, 0xff, + 0xe0, 0x0, 0x4, 0xff, 0xff, 0x80, 0x0, 0xef, + 0xff, 0xff, 0x30, 0x8f, 0xff, 0xff, 0xfc, 0xe, + 0xff, 0xff, 0xff, 0xf2, 0xf9, 0xcf, 0xff, 0xff, + 0x3d, 0xc5, 0xff, 0xff, 0xf1, 0x6f, 0xa3, 0xbf, + 0xfa, 0x0, 0x8f, 0xff, 0xfb, 0x0, 0x0, 0x26, + 0x74, 0x0, 0x0, + + /* U+F048 "ïˆ" */ + 0x58, 0x0, 0x0, 0x35, 0x9f, 0x10, 0x5, 0xfe, + 0x9f, 0x10, 0x6f, 0xfe, 0x9f, 0x17, 0xff, 0xfe, + 0x9f, 0x9f, 0xff, 0xfe, 0x9f, 0xff, 0xff, 0xfe, + 0x9f, 0xef, 0xff, 0xfe, 0x9f, 0x2d, 0xff, 0xfe, + 0x9f, 0x10, 0xcf, 0xfe, 0x9f, 0x10, 0xb, 0xfe, + 0x8f, 0x0, 0x0, 0x9b, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "ï‹" */ + 0x46, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xfd, 0x50, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0xf, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x36, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "ïŒ" */ + 0xaf, 0xfe, 0x30, 0xaf, 0xfe, 0x3f, 0xff, 0xf7, + 0xf, 0xff, 0xf7, 0xff, 0xff, 0x80, 0xff, 0xff, + 0x8f, 0xff, 0xf8, 0xf, 0xff, 0xf8, 0xff, 0xff, + 0x80, 0xff, 0xff, 0x8f, 0xff, 0xf8, 0xf, 0xff, + 0xf8, 0xff, 0xff, 0x80, 0xff, 0xff, 0x8f, 0xff, + 0xf8, 0xf, 0xff, 0xf8, 0xff, 0xff, 0x80, 0xff, + 0xff, 0x8f, 0xff, 0xf7, 0xf, 0xff, 0xf7, 0x48, + 0x98, 0x10, 0x48, 0x98, 0x10, + + /* U+F04D "ï" */ + 0x48, 0x88, 0x88, 0x88, 0x88, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xaf, + 0xff, 0xff, 0xff, 0xfe, 0x30, + + /* U+F051 "ï‘" */ + 0x26, 0x0, 0x0, 0x58, 0x7f, 0xa0, 0x0, 0xbf, + 0x8f, 0xfb, 0x0, 0xbf, 0x8f, 0xff, 0xc1, 0xbf, + 0x8f, 0xff, 0xfd, 0xcf, 0x8f, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xef, 0x8f, 0xff, 0xf4, 0xbf, + 0x8f, 0xff, 0x40, 0xbf, 0x8f, 0xe3, 0x0, 0xbf, + 0x5d, 0x20, 0x0, 0xae, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x3, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfa, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0x90, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xf8, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0x70, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1, 0x34, 0x44, 0x44, 0x44, 0x30, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xf5, + + /* U+F053 "ï“" */ + 0x0, 0x0, 0x3, 0x10, 0x0, 0x5, 0xfb, 0x0, + 0x5, 0xff, 0x40, 0x5, 0xff, 0x40, 0x5, 0xff, + 0x50, 0x3, 0xff, 0x50, 0x0, 0xb, 0xfc, 0x10, + 0x0, 0xb, 0xfc, 0x10, 0x0, 0xc, 0xfc, 0x10, + 0x0, 0xc, 0xfb, 0x0, 0x0, 0xa, 0x50, + + /* U+F054 "ï”" */ + 0x3, 0x10, 0x0, 0x3, 0xfc, 0x10, 0x0, 0xb, + 0xfc, 0x10, 0x0, 0xb, 0xfc, 0x10, 0x0, 0xb, + 0xfc, 0x10, 0x0, 0xd, 0xfb, 0x0, 0x5, 0xff, + 0x50, 0x5, 0xff, 0x50, 0x5, 0xff, 0x50, 0x3, + 0xff, 0x50, 0x0, 0xa, 0x50, 0x0, 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x0, 0x69, 0x10, 0x0, 0x0, 0x0, 0xd, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0xef, 0x60, 0x0, + 0x0, 0x0, 0xe, 0xf6, 0x0, 0x0, 0x58, 0x88, + 0xff, 0xb8, 0x88, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x9b, 0xbb, 0xff, 0xdb, 0xbb, 0x30, 0x0, + 0xe, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xef, 0x60, + 0x0, 0x0, 0x0, 0xe, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x9d, 0x20, 0x0, 0x0, + + /* U+F068 "ï¨" */ + 0x46, 0x66, 0x66, 0x66, 0x66, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, + 0x40, + + /* U+F06E "ï®" */ + 0x0, 0x3, 0xad, 0xff, 0xc7, 0x0, 0x0, 0x0, + 0x9f, 0xe6, 0x24, 0xaf, 0xe3, 0x0, 0xb, 0xff, + 0x20, 0x77, 0x9, 0xff, 0x40, 0x7f, 0xf9, 0x0, + 0xcf, 0xa1, 0xff, 0xe1, 0xef, 0xf6, 0x7f, 0xff, + 0xf0, 0xef, 0xf7, 0x8f, 0xf9, 0x3f, 0xff, 0xc1, + 0xff, 0xe1, 0xb, 0xff, 0x26, 0xca, 0x19, 0xff, + 0x40, 0x0, 0x9f, 0xe6, 0x24, 0xaf, 0xe3, 0x0, + 0x0, 0x3, 0x9d, 0xff, 0xc7, 0x0, 0x0, + + /* U+F070 "ï°" */ + 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xf8, 0x4a, 0xef, 0xeb, 0x50, 0x0, 0x0, + 0x0, 0x9f, 0xfd, 0x52, 0x5d, 0xfc, 0x10, 0x0, + 0x0, 0x5, 0xfe, 0x4a, 0x70, 0xcf, 0xe1, 0x0, + 0xb, 0x80, 0x2d, 0xff, 0xf7, 0x4f, 0xfb, 0x0, + 0x2f, 0xfb, 0x0, 0xaf, 0xfb, 0x2f, 0xff, 0x30, + 0xb, 0xff, 0x50, 0x7, 0xfe, 0x7f, 0xfb, 0x0, + 0x1, 0xdf, 0xc0, 0x0, 0x3e, 0xff, 0xe1, 0x0, + 0x0, 0x1b, 0xfc, 0x42, 0x1, 0xbf, 0xa0, 0x0, + 0x0, 0x0, 0x5b, 0xef, 0xb0, 0x8, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfd, 0xef, 0xa0, 0x0, 0x0, 0x0, 0xb, + 0xfb, 0x3, 0xff, 0x30, 0x0, 0x0, 0x4, 0xff, + 0xc0, 0x4f, 0xfc, 0x0, 0x0, 0x0, 0xdf, 0xfd, + 0x5, 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, 0xf8, + 0xcf, 0xff, 0xe1, 0x0, 0x1f, 0xff, 0xfc, 0x4, + 0xff, 0xff, 0x90, 0xa, 0xff, 0xff, 0xd2, 0x7f, + 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x4, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x87, 0x0, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xc1, 0xff, 0xf8, 0x0, 0x2e, + 0xff, 0xfc, 0xcd, 0xff, 0x62, 0xef, 0xdf, 0xf9, + 0x0, 0x2c, 0x4e, 0xf9, 0xf, 0x90, 0x0, 0x2, + 0xef, 0x90, 0x7, 0x0, 0x0, 0x2e, 0xf8, 0x88, + 0xf, 0xa0, 0xcd, 0xff, 0x80, 0xdf, 0xdf, 0xf9, + 0xff, 0xf8, 0x0, 0x1e, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x10, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x27, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xf9, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf9, 0x0, + 0x0, 0x2e, 0xf9, 0x2e, 0xf9, 0x0, 0x2e, 0xf9, + 0x0, 0x2e, 0xf9, 0xb, 0xf9, 0x0, 0x0, 0x2e, + 0xf4, 0x27, 0x0, 0x0, 0x0, 0x27, 0x0, + + /* U+F078 "ï¸" */ + 0x27, 0x0, 0x0, 0x0, 0x27, 0xb, 0xf9, 0x0, + 0x0, 0x2e, 0xf4, 0x2e, 0xf9, 0x0, 0x2e, 0xf9, + 0x0, 0x2e, 0xf9, 0x2e, 0xf9, 0x0, 0x0, 0x2e, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x2e, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x26, 0x0, 0x0, 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xc0, 0x7, 0x77, 0x77, 0x72, 0x0, + 0x3, 0xff, 0xfc, 0x2e, 0xff, 0xff, 0xf9, 0x0, + 0xf, 0xcf, 0xcf, 0xa0, 0x0, 0x0, 0xe9, 0x0, + 0x4, 0x1e, 0x93, 0x20, 0x0, 0x0, 0xe9, 0x0, + 0x0, 0xe, 0x90, 0x0, 0x0, 0x0, 0xe9, 0x0, + 0x0, 0xe, 0x90, 0x0, 0x0, 0xb5, 0xe9, 0x97, + 0x0, 0xe, 0xc7, 0x77, 0x73, 0xbf, 0xff, 0xf6, + 0x0, 0xd, 0xff, 0xff, 0xfd, 0xb, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa6, 0x0, + + /* U+F07B "ï»" */ + 0xbf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x98, 0x88, 0x74, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F093 "ï‚“" */ + 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xe3, 0x0, 0x0, 0x0, 0x3, 0xef, 0xfe, + 0x30, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, + 0x23, 0x32, 0x8f, 0xf8, 0x23, 0x32, 0xff, 0xfe, + 0x39, 0x93, 0xef, 0xff, 0xff, 0xff, 0xc9, 0x9c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x8f, + 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x62, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xfd, 0x0, 0x0, 0x1, + 0x0, 0x9, 0xff, 0x40, 0x1, 0x8e, 0xe1, 0x1a, + 0xff, 0x70, 0x0, 0xef, 0xff, 0xde, 0xff, 0x90, + 0x0, 0xc, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x8f, 0xff, 0xe9, 0x10, 0x0, 0x0, 0x2, 0x76, + 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x7, 0x93, 0x0, 0x0, 0x22, 0xa, 0xff, 0xf2, + 0x0, 0x8f, 0xf5, 0xf9, 0x1f, 0x70, 0x8f, 0xf9, + 0xc, 0xfc, 0xf8, 0x8f, 0xf9, 0x0, 0x1a, 0xef, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0xef, 0xfc, 0x0, + 0x0, 0x7, 0xbf, 0xff, 0xf6, 0x0, 0xa, 0xff, + 0xfa, 0xbf, 0xf6, 0x0, 0xf9, 0x1f, 0x70, 0xbf, + 0xf6, 0xc, 0xfc, 0xf4, 0x0, 0xbf, 0xf4, 0x1a, + 0xc6, 0x0, 0x0, 0x56, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x3, 0x44, 0x41, 0x20, 0x0, 0x0, 0xff, + 0xff, 0x5e, 0x40, 0x24, 0x1f, 0xff, 0xf5, 0xee, + 0x2f, 0xf4, 0xff, 0xff, 0xc8, 0x82, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0x5f, 0xf4, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0x4f, 0xff, 0xff, 0xff, 0x5f, 0xf4, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0x5f, 0xf4, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0x93, 0x44, 0x44, 0x43, 0xf, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x68, 0x88, 0x88, 0x71, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x48, 0x88, 0x88, 0x87, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xf8, 0x0, 0x0, 0xb, 0xfb, + 0xf, 0x80, 0x0, 0x0, 0xbf, 0xf3, 0xfb, 0x77, + 0x77, 0x7d, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0x42, 0xdf, 0xff, 0x4f, 0xff, + 0xc0, 0x8, 0xff, 0xf4, 0xff, 0xfe, 0x0, 0xaf, + 0xff, 0x4f, 0xff, 0xfc, 0xaf, 0xff, 0xf4, 0xaf, + 0xff, 0xff, 0xff, 0xfd, 0x10, + + /* U+F0C9 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, 0x99, + 0x99, 0x99, 0x99, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x12, 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9a, 0xaa, 0xaa, 0xaa, + 0xaa, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0E0 "" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0xc3, 0xbf, 0xff, 0xff, 0xfb, 0x3c, + 0xff, 0x57, 0xff, 0xff, 0x75, 0xff, 0xff, 0xf9, + 0x3d, 0xd3, 0x9f, 0xff, 0xff, 0xff, 0xd5, 0x5d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F0E7 "" */ + 0x1, 0xbb, 0xba, 0x10, 0x0, 0x5f, 0xff, 0xf1, + 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x9f, 0xff, + 0x60, 0x0, 0xb, 0xff, 0xff, 0xff, 0x60, 0xef, + 0xff, 0xff, 0xf1, 0xe, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xc, 0xfe, 0x0, 0x0, 0x0, 0xff, 0x50, + 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x7, 0xf3, + 0x0, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x2a, 0x50, 0x0, 0x0, 0xe, 0xff, 0x8f, + 0xff, 0x20, 0x0, 0xff, 0xf8, 0xff, 0xf4, 0x0, + 0xf, 0xff, 0xeb, 0xbb, 0x30, 0x0, 0xff, 0xf4, + 0x99, 0x92, 0x60, 0xf, 0xff, 0x5f, 0xff, 0x4f, + 0xa0, 0xff, 0xf5, 0xff, 0xf5, 0x56, 0x1f, 0xff, + 0x5f, 0xff, 0xff, 0xf4, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0x4e, 0xff, 0x5f, 0xff, 0xff, 0xf4, 0x0, + 0x5, 0xff, 0xff, 0xff, 0x40, 0x0, 0x5f, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x44, 0x44, 0x44, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x15, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xf1, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xf9, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xf7, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0x50, 0x6f, 0xff, 0xff, 0xff, + 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x24, + 0x44, 0x44, 0x44, 0x43, 0x0, 0x0, 0x2f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x46, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xfc, + 0x8e, 0x8e, 0x8e, 0x88, 0xe8, 0xf7, 0xf8, 0xc, + 0xc, 0xb, 0x0, 0xb0, 0xf8, 0xff, 0xec, 0xfc, + 0xec, 0xee, 0xcf, 0xf8, 0xff, 0xa0, 0xc0, 0xa0, + 0x77, 0x2f, 0xf8, 0xff, 0xec, 0xfc, 0xec, 0xee, + 0xcf, 0xf8, 0xf8, 0xc, 0x0, 0x0, 0x0, 0xb0, + 0xf8, 0xfc, 0x8e, 0x88, 0x88, 0x88, 0xe8, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x18, 0xef, 0xe0, 0x0, 0x0, + 0x0, 0x29, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x3a, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x4c, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x1, 0x34, 0x44, 0xdf, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0x0, 0x0, 0x0, + + /* U+F15B "ï…›" */ + 0x9b, 0xbb, 0xb2, 0x70, 0xf, 0xff, 0xff, 0x4f, + 0x90, 0xff, 0xff, 0xf4, 0xff, 0x9f, 0xff, 0xff, + 0x54, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, 0x44, + 0x44, 0x44, 0x30, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x9b, 0xcb, 0x95, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3, 0xef, + 0xfa, 0x53, 0x23, 0x5a, 0xff, 0xe3, 0xdf, 0xa1, + 0x0, 0x0, 0x0, 0x1, 0xaf, 0xd2, 0x60, 0x5, + 0xbe, 0xfe, 0xb5, 0x0, 0x52, 0x0, 0x1c, 0xff, + 0xfe, 0xff, 0xfc, 0x10, 0x0, 0x2, 0xec, 0x40, + 0x0, 0x4c, 0xe2, 0x0, 0x0, 0x1, 0x0, 0x1, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xd6, 0x0, + 0x0, 0x0, + + /* U+F240 "" */ + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x34, 0x44, 0x44, 0x44, 0x44, 0x4f, 0xdf, 0x8c, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0xcf, 0xf8, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0x8, 0xff, 0x89, 0xcc, + 0xcc, 0xcc, 0xcc, 0xc3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F241 "ï‰" */ + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x34, 0x44, 0x44, 0x43, 0x0, 0x4f, 0xdf, 0x8c, + 0xff, 0xff, 0xff, 0xc0, 0x2, 0xcf, 0xf8, 0xcf, + 0xff, 0xff, 0xfc, 0x0, 0x8, 0xff, 0x89, 0xcc, + 0xcc, 0xcc, 0x90, 0x3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F242 "" */ + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x34, 0x44, 0x42, 0x0, 0x0, 0x4f, 0xdf, 0x8c, + 0xff, 0xff, 0x80, 0x0, 0x2, 0xcf, 0xf8, 0xcf, + 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, 0x89, 0xcc, + 0xcc, 0x60, 0x0, 0x3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F243 "" */ + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x34, 0x41, 0x0, 0x0, 0x0, 0x4f, 0xdf, 0x8c, + 0xff, 0x40, 0x0, 0x0, 0x2, 0xcf, 0xf8, 0xcf, + 0xf4, 0x0, 0x0, 0x0, 0x8, 0xff, 0x89, 0xcc, + 0x30, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F244 "" */ + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xdf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x25, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xcb, 0xfe, 0x0, 0x0, 0x0, + 0x1, 0x0, 0xd, 0x10, 0x42, 0x0, 0x0, 0x0, + 0x9f, 0xd1, 0x68, 0x0, 0x0, 0x0, 0x68, 0x0, + 0xff, 0xfe, 0xee, 0xed, 0xdd, 0xdd, 0xef, 0xc0, + 0x9f, 0xd1, 0x0, 0xb3, 0x0, 0x0, 0x68, 0x0, + 0x1, 0x0, 0x0, 0x3b, 0x5, 0x74, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xbe, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x34, 0x20, 0x0, 0x0, 0x6e, 0xfe, + 0xfd, 0x20, 0x4, 0xff, 0xf3, 0xff, 0xd0, 0xc, + 0xff, 0xf0, 0x4f, 0xf5, 0xf, 0xd5, 0xf2, 0x95, + 0xf8, 0x2f, 0xf7, 0x41, 0x3c, 0xfa, 0x3f, 0xff, + 0x60, 0xaf, 0xfb, 0x3f, 0xfe, 0x20, 0x4f, 0xfb, + 0x2f, 0xe2, 0x92, 0x75, 0xfa, 0xf, 0xeb, 0xf1, + 0x49, 0xf8, 0x9, 0xff, 0xf0, 0x9f, 0xf2, 0x1, + 0xdf, 0xf9, 0xff, 0x90, 0x0, 0x6, 0xab, 0x95, + 0x0, + + /* U+F2ED "ï‹­" */ + 0x0, 0x4, 0x88, 0x70, 0x0, 0xb, 0xcc, 0xff, + 0xff, 0xdc, 0xc5, 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, + 0x52, 0x88, 0x88, 0x88, 0x88, 0x60, 0x4f, 0xff, + 0xff, 0xff, 0xfc, 0x4, 0xfa, 0xae, 0x6f, 0x5f, + 0xc0, 0x4f, 0xaa, 0xe6, 0xf4, 0xfc, 0x4, 0xfa, + 0xae, 0x6f, 0x4f, 0xc0, 0x4f, 0xaa, 0xe6, 0xf4, + 0xfc, 0x4, 0xfa, 0xae, 0x6f, 0x4f, 0xc0, 0x4f, + 0xaa, 0xe6, 0xf5, 0xfc, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x6, 0x88, 0x88, 0x88, 0x72, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x71, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xd1, 0x0, 0x0, 0x0, + 0x1, 0x5f, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xea, + 0x5f, 0xfd, 0x0, 0x0, 0x2, 0xef, 0xfa, 0x5d, + 0x20, 0x0, 0x2, 0xef, 0xff, 0xf8, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xfe, 0x20, 0x0, 0x2, 0xef, + 0xff, 0xfe, 0x20, 0x0, 0x2, 0xef, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0xd, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x6, 0x64, + 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5, + 0xff, 0xff, 0x91, 0xdd, 0x19, 0xff, 0xf5, 0xff, + 0xff, 0xfd, 0x11, 0x11, 0xdf, 0xff, 0xef, 0xff, + 0xff, 0xfb, 0x0, 0xbf, 0xff, 0xf5, 0xff, 0xff, + 0xfd, 0x11, 0x11, 0xdf, 0xff, 0x5, 0xff, 0xff, + 0x91, 0xdd, 0x19, 0xff, 0xf0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F7C2 "" */ + 0x0, 0x17, 0x88, 0x87, 0x20, 0x2d, 0xff, 0xff, + 0xfd, 0x2e, 0xa0, 0xb3, 0x78, 0xfe, 0xfa, 0xb, + 0x37, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0x4, 0x44, + 0x44, 0x44, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xf0, 0x0, 0x69, 0x0, + 0x0, 0x0, 0xdf, 0x0, 0x7f, 0xc0, 0x0, 0x0, + 0xd, 0xf0, 0x8f, 0xff, 0xdd, 0xdd, 0xdd, 0xff, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 52, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 51, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14, .adv_w = 75, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 22, .adv_w = 135, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 63, .adv_w = 119, .box_w = 7, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109, .adv_w = 162, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 154, .adv_w = 132, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 199, .adv_w = 40, .box_w = 2, .box_h = 4, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 203, .adv_w = 65, .box_w = 3, .box_h = 13, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 223, .adv_w = 65, .box_w = 3, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 243, .adv_w = 77, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 256, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 277, .adv_w = 44, .box_w = 3, .box_h = 4, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 283, .adv_w = 74, .box_w = 4, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 287, .adv_w = 44, .box_w = 3, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 290, .adv_w = 68, .box_w = 6, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 329, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 365, .adv_w = 71, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 383, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 415, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 447, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 483, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 515, .adv_w = 118, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 551, .adv_w = 115, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 583, .adv_w = 124, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 619, .adv_w = 118, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 651, .adv_w = 44, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 662, .adv_w = 44, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 676, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 701, .adv_w = 112, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 719, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 744, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 776, .adv_w = 199, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 848, .adv_w = 141, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 893, .adv_w = 145, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 929, .adv_w = 139, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 970, .adv_w = 159, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1011, .adv_w = 129, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1043, .adv_w = 122, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1075, .adv_w = 148, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1116, .adv_w = 156, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1152, .adv_w = 60, .box_w = 2, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1161, .adv_w = 98, .box_w = 6, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1188, .adv_w = 138, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1224, .adv_w = 114, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1256, .adv_w = 183, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1301, .adv_w = 156, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1337, .adv_w = 161, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1382, .adv_w = 139, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1418, .adv_w = 161, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1478, .adv_w = 140, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1514, .adv_w = 119, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1546, .adv_w = 113, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1578, .adv_w = 152, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1614, .adv_w = 137, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1659, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1722, .adv_w = 129, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1758, .adv_w = 124, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1799, .adv_w = 126, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1835, .adv_w = 64, .box_w = 3, .box_h = 13, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 1855, .adv_w = 68, .box_w = 6, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1894, .adv_w = 64, .box_w = 3, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1914, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1935, .adv_w = 96, .box_w = 6, .box_h = 1, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1938, .adv_w = 115, .box_w = 4, .box_h = 2, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 1942, .adv_w = 115, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1967, .adv_w = 131, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2002, .adv_w = 110, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2027, .adv_w = 131, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2067, .adv_w = 118, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2092, .adv_w = 68, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2117, .adv_w = 132, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2157, .adv_w = 131, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2192, .adv_w = 54, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2207, .adv_w = 55, .box_w = 5, .box_h = 13, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 2240, .adv_w = 118, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2275, .adv_w = 54, .box_w = 2, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2285, .adv_w = 203, .box_w = 11, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2324, .adv_w = 131, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2349, .adv_w = 122, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2377, .adv_w = 131, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 2412, .adv_w = 131, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2452, .adv_w = 79, .box_w = 4, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2466, .adv_w = 96, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2487, .adv_w = 79, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2510, .adv_w = 130, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2535, .adv_w = 107, .box_w = 8, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2563, .adv_w = 173, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2602, .adv_w = 106, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2627, .adv_w = 107, .box_w = 8, .box_h = 10, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 2667, .adv_w = 100, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2688, .adv_w = 67, .box_w = 4, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2714, .adv_w = 57, .box_w = 2, .box_h = 13, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 2727, .adv_w = 67, .box_w = 4, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2753, .adv_w = 112, .box_w = 7, .box_h = 2, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 2760, .adv_w = 80, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 2773, .adv_w = 60, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 2778, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2856, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2910, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2976, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3030, .adv_w = 132, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3071, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3149, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3227, .adv_w = 216, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3304, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3382, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3445, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3523, .adv_w = 96, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3553, .adv_w = 144, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3598, .adv_w = 216, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3689, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3743, .adv_w = 132, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3802, .adv_w = 168, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 3850, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3922, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3983, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4044, .adv_w = 168, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 4092, .adv_w = 168, .box_w = 12, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 4158, .adv_w = 120, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4197, .adv_w = 120, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4236, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4297, .adv_w = 168, .box_w = 11, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 4314, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4377, .adv_w = 240, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4481, .adv_w = 216, .box_w = 15, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 4579, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4645, .adv_w = 168, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 4684, .adv_w = 168, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 4723, .adv_w = 240, .box_w = 16, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4803, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4857, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4935, .adv_w = 192, .box_w = 13, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 5020, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5081, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5153, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5214, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5275, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5329, .adv_w = 120, .box_w = 9, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 5388, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5460, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5532, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5595, .adv_w = 192, .box_w = 14, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 5686, .adv_w = 144, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5745, .adv_w = 240, .box_w = 15, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5835, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5903, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5971, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6039, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6107, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6175, .adv_w = 240, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6263, .adv_w = 168, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6328, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6400, .adv_w = 192, .box_w = 13, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 6485, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6553, .adv_w = 144, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6612, .adv_w = 193, .box_w = 13, .box_h = 9, .ofs_x = 0, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 2, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 9, 0, 5, -4, 0, 0, + 0, 0, -11, -12, 1, 9, 4, 3, + -8, 1, 9, 1, 8, 2, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 2, -1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, -6, 0, 0, 0, 0, + 0, -4, 3, 4, 0, 0, -2, 0, + -1, 2, 0, -2, 0, -2, -1, -4, + 0, 0, 0, 0, -2, 0, 0, -2, + -3, 0, 0, -2, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + -2, 0, -3, 0, -5, 0, -23, 0, + 0, -4, 0, 4, 6, 0, 0, -4, + 2, 2, 6, 4, -3, 4, 0, 0, + -11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, -2, -9, 0, -8, + -1, 0, 0, 0, 0, 0, 7, 0, + -6, -2, -1, 1, 0, -3, 0, 0, + -1, -14, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -15, -2, 7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 6, + 0, 2, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 2, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, + 4, 2, 6, -2, 0, 0, 4, -2, + -6, -26, 1, 5, 4, 0, -2, 0, + 7, 0, 6, 0, 6, 0, -18, 0, + -2, 6, 0, 6, -2, 4, 2, 0, + 0, 1, -2, 0, 0, -3, 15, 0, + 15, 0, 6, 0, 8, 2, 3, 6, + 0, 0, 0, -7, 0, 0, 0, 0, + 1, -1, 0, 1, -3, -2, -4, 1, + 0, -2, 0, 0, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -11, 0, -12, 0, 0, 0, + 0, -1, 0, 19, -2, -2, 2, 2, + -2, 0, -2, 2, 0, 0, -10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -19, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -12, 0, 12, 0, 0, -7, 0, + 6, 0, -13, -19, -13, -4, 6, 0, + 0, -13, 0, 2, -4, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 6, -23, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 1, 0, 0, 0, + 0, 0, 1, 1, -2, -4, 0, -1, + -1, -2, 0, 0, -1, 0, 0, 0, + -4, 0, -2, 0, -4, -4, 0, -5, + -6, -6, -4, 0, -4, 0, -4, 0, + 0, 0, 0, -2, 0, 0, 2, 0, + 1, -2, 0, 1, 0, 0, 0, 2, + -1, 0, 0, 0, -1, 2, 2, -1, + 0, 0, 0, -4, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 2, -1, 0, + -2, 0, -3, 0, 0, -1, 0, 6, + 0, 0, -2, 0, 0, 0, 0, 0, + -1, 1, -1, -1, 0, 0, -2, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, -2, -2, 0, + 0, 0, 0, 0, 1, 0, 0, -1, + 0, -2, -2, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, -1, -2, 0, -3, 0, -6, + -1, -6, 4, 0, 0, -4, 2, 4, + 5, 0, -5, -1, -2, 0, -1, -9, + 2, -1, 1, -10, 2, 0, 0, 1, + -10, 0, -10, -2, -17, -1, 0, -10, + 0, 4, 5, 0, 2, 0, 0, 0, + 0, 0, 0, -3, -2, 0, -6, 0, + 0, 0, -2, 0, 0, 0, -2, 0, + 0, 0, 0, 0, -1, -1, 0, -1, + -2, 0, 0, 0, 0, 0, 0, 0, + -2, -2, 0, -1, -2, -2, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + 0, -1, 0, -4, 2, 0, 0, -2, + 1, 2, 2, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 1, + 0, 0, -2, 0, -2, -1, -2, 0, + 0, 0, 0, 0, 0, 0, 2, 0, + -2, 0, 0, 0, 0, -2, -3, 0, + -4, 0, 6, -1, 1, -6, 0, 0, + 5, -10, -10, -8, -4, 2, 0, -2, + -12, -3, 0, -3, 0, -4, 3, -3, + -12, 0, -5, 0, 0, 1, -1, 2, + -1, 0, 2, 0, -6, -7, 0, -10, + -5, -4, -5, -6, -2, -5, 0, -4, + -5, 1, 0, 1, 0, -2, 0, 0, + 0, 1, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, -1, 0, -1, -2, 0, -3, -4, + -4, -1, 0, -6, 0, 0, 0, 0, + 0, 0, -2, 0, 0, 0, 0, 1, + -1, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, 0, 0, + -4, 0, 0, 0, 0, -10, -6, 0, + 0, 0, -3, -10, 0, 0, -2, 2, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, -3, 0, + 0, 0, 0, 2, 0, 1, -4, -4, + 0, -2, -2, -2, 0, 0, 0, 0, + 0, 0, -6, 0, -2, 0, -3, -2, + 0, -4, -5, -6, -2, 0, -4, 0, + -6, 0, 0, 0, 0, 15, 0, 0, + 1, 0, 0, -2, 0, 2, 0, -8, + 0, 0, 0, 0, 0, -18, -3, 6, + 6, -2, -8, 0, 2, -3, 0, -10, + -1, -2, 2, -13, -2, 2, 0, 3, + -7, -3, -7, -6, -8, 0, 0, -12, + 0, 11, 0, 0, -1, 0, 0, 0, + -1, -1, -2, -5, -6, 0, -18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, -1, -2, -3, 0, 0, + -4, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -4, 0, 0, 4, + -1, 2, 0, -4, 2, -1, -1, -5, + -2, 0, -2, -2, -1, 0, -3, -3, + 0, 0, -2, -1, -1, -3, -2, 0, + 0, -2, 0, 2, -1, 0, -4, 0, + 0, 0, -4, 0, -3, 0, -3, -3, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 2, 0, -3, 0, -1, -2, + -6, -1, -1, -1, -1, -1, -2, -1, + 0, 0, 0, 0, 0, -2, -2, -2, + 0, 0, 0, 0, 2, -1, 0, -1, + 0, 0, 0, -1, -2, -1, -2, -2, + -2, 0, 2, 8, -1, 0, -5, 0, + -1, 4, 0, -2, -8, -2, 3, 0, + 0, -9, -3, 2, -3, 1, 0, -1, + -2, -6, 0, -3, 1, 0, 0, -3, + 0, 0, 0, 2, 2, -4, -4, 0, + -3, -2, -3, -2, -2, 0, -3, 1, + -4, -3, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, -2, + 0, 0, -2, -2, 0, 0, 0, 0, + -2, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, -1, 0, 0, 0, 0, + -3, 0, -4, 0, 0, 0, -6, 0, + 1, -4, 4, 0, -1, -9, 0, 0, + -4, -2, 0, -8, -5, -5, 0, 0, + -8, -2, -8, -7, -9, 0, -5, 0, + 2, 13, -2, 0, -4, -2, -1, -2, + -3, -5, -3, -7, -8, -4, -2, 0, + 0, -1, 0, 1, 0, 0, -13, -2, + 6, 4, -4, -7, 0, 1, -6, 0, + -10, -1, -2, 4, -18, -2, 1, 0, + 0, -12, -2, -10, -2, -14, 0, 0, + -13, 0, 11, 1, 0, -1, 0, 0, + 0, 0, -1, -1, -7, -1, 0, -12, + 0, 0, 0, 0, -6, 0, -2, 0, + -1, -5, -9, 0, 0, -1, -3, -6, + -2, 0, -1, 0, 0, 0, 0, -9, + -2, -6, -6, -2, -3, -5, -2, -3, + 0, -4, -2, -6, -3, 0, -2, -4, + -2, -4, 0, 1, 0, -1, -6, 0, + 4, 0, -3, 0, 0, 0, 0, 2, + 0, 1, -4, 8, 0, -2, -2, -2, + 0, 0, 0, 0, 0, 0, -6, 0, + -2, 0, -3, -2, 0, -4, -5, -6, + -2, 0, -4, 2, 8, 0, 0, 0, + 0, 15, 0, 0, 1, 0, 0, -2, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, -4, 0, 0, 0, 0, 0, -1, + 0, 0, 0, -2, -2, 0, 0, -4, + -2, 0, 0, -4, 0, 3, -1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 3, 4, 2, -2, 0, -6, + -3, 0, 6, -6, -6, -4, -4, 8, + 3, 2, -17, -1, 4, -2, 0, -2, + 2, -2, -7, 0, -2, 2, -2, -2, + -6, -2, 0, 0, 6, 4, 0, -5, + 0, -11, -2, 6, -2, -7, 1, -2, + -6, -6, -2, 8, 2, 0, -3, 0, + -5, 0, 2, 6, -4, -7, -8, -5, + 6, 0, 1, -14, -2, 2, -3, -1, + -4, 0, -4, -7, -3, -3, -2, 0, + 0, -4, -4, -2, 0, 6, 4, -2, + -11, 0, -11, -3, 0, -7, -11, -1, + -6, -3, -6, -5, 5, 0, 0, -2, + 0, -4, -2, 0, -2, -3, 0, 3, + -6, 2, 0, 0, -10, 0, -2, -4, + -3, -1, -6, -5, -6, -4, 0, -6, + -2, -4, -4, -6, -2, 0, 0, 1, + 9, -3, 0, -6, -2, 0, -2, -4, + -4, -5, -5, -7, -2, -4, 4, 0, + -3, 0, -10, -2, 1, 4, -6, -7, + -4, -6, 6, -2, 1, -18, -3, 4, + -4, -3, -7, 0, -6, -8, -2, -2, + -2, -2, -4, -6, -1, 0, 0, 6, + 5, -1, -12, 0, -12, -4, 5, -7, + -13, -4, -7, -8, -10, -6, 4, 0, + 0, 0, 0, -2, 0, 0, 2, -2, + 4, 1, -4, 4, 0, 0, -6, -1, + 0, -1, 0, 1, 1, -2, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, 2, 6, 0, 0, -2, 0, 0, + 0, 0, -1, -1, -2, 0, 0, 0, + 1, 2, 0, 0, 0, 0, 2, 0, + -2, 0, 7, 0, 3, 1, 1, -2, + 0, 4, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -12, 0, -2, 3, 0, 6, + 0, 0, 19, 2, -4, -4, 2, 2, + -1, 1, -10, 0, 0, 9, -12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -13, 7, 27, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, -4, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, -5, 0, + 0, 1, 0, 0, 2, 25, -4, -2, + 6, 5, -5, 2, 0, 0, 2, 2, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -25, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, -5, 0, 0, 0, 0, + -4, -1, 0, 0, 0, -4, 0, -2, + 0, -9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -13, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -2, 0, 0, -4, 0, -3, 0, + -5, 0, 0, 0, -3, 2, -2, 0, + 0, -5, -2, -4, 0, 0, -5, 0, + -2, 0, -9, 0, -2, 0, 0, -16, + -4, -8, -2, -7, 0, 0, -13, 0, + -5, -1, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, -2, -3, 0, 0, + 0, 0, -4, 0, -4, 2, -2, 4, + 0, -1, -4, -1, -3, -4, 0, -2, + -1, -1, 1, -5, -1, 0, 0, 0, + -17, -2, -3, 0, -4, 0, -1, -9, + -2, 0, 0, -1, -2, 0, 0, 0, + 0, 1, 0, -1, -3, -1, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -4, 0, -1, 0, 0, 0, -4, + 2, 0, 0, 0, -5, -2, -4, 0, + 0, -5, 0, -2, 0, -9, 0, 0, + 0, 0, -19, 0, -4, -7, -10, 0, + 0, -13, 0, -1, -3, 0, 0, 0, + 0, 0, 0, 0, 0, -2, -3, -1, + -3, 1, 0, 0, 3, -2, 0, 6, + 9, -2, -2, -6, 2, 9, 3, 4, + -5, 2, 8, 2, 6, 4, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 9, -3, -2, 0, -2, + 15, 8, 15, 0, 0, 0, 2, 0, + 0, 7, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, -16, -2, -2, -8, + -9, 0, 0, -13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, -16, -2, -2, + -8, -9, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, -4, 2, 0, -2, + 2, 3, 2, -6, 0, 0, -2, 2, + 0, 2, 0, 0, 0, 0, -5, 0, + -2, -1, -4, 0, -2, -8, 0, 12, + -2, 0, -4, -1, 0, -1, -3, 0, + -2, -5, -4, -2, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, -16, + -2, -2, -8, -9, 0, 0, -13, 0, + 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, -6, -2, -2, 6, -2, -2, + -8, 1, -1, 1, -1, -5, 0, 4, + 0, 2, 1, 2, -5, -8, -2, 0, + -7, -4, -5, -8, -7, 0, -3, -4, + -2, -2, -2, -1, -2, -1, 0, -1, + -1, 3, 0, 3, -1, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -1, -2, -2, 0, 0, + -5, 0, -1, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -12, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + 0, 0, 0, 0, -2, 0, 0, -3, + -2, 2, 0, -3, -4, -1, 0, -6, + -1, -4, -1, -2, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 6, 0, 0, -3, 0, + 0, 0, 0, -2, 0, -2, 0, 0, + -1, 0, 0, -1, 0, -4, 0, 0, + 8, -2, -6, -6, 1, 2, 2, 0, + -5, 1, 3, 1, 6, 1, 6, -1, + -5, 0, 0, -8, 0, 0, -6, -5, + 0, 0, -4, 0, -2, -3, 0, -3, + 0, -3, 0, -1, 3, 0, -2, -6, + -2, 7, 0, 0, -2, 0, -4, 0, + 0, 2, -4, 0, 2, -2, 2, 0, + 0, -6, 0, -1, -1, 0, -2, 2, + -2, 0, 0, 0, -8, -2, -4, 0, + -6, 0, 0, -9, 0, 7, -2, 0, + -3, 0, 1, 0, -2, 0, -2, -6, + 0, -2, 2, 0, 0, 0, 0, -1, + 0, 0, 2, -2, 1, 0, 0, -2, + -1, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 4, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + -2, -2, 0, 0, 0, 4, 0, 4, + 0, 0, 0, 0, 0, -12, -11, 1, + 8, 6, 3, -8, 1, 8, 0, 7, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserrat_12 = { +#else +lv_font_t lv_font_montserrat_12 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 15, /*The maximum line height required by the font*/ + .base_line = 3, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_12*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_12_subpx.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_12_subpx.c new file mode 100644 index 0000000..1ffd7ed --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_12_subpx.c @@ -0,0 +1,3865 @@ +/******************************************************************************* + * Size: 12 px + * Bpp: 4 + * Opts: --lcd --no-compress --no-prefilter --bpp 4 --size 12 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_12_subpx.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_12_SUBPX + #define LV_FONT_MONTSERRAT_12_SUBPX 1 +#endif + +#if LV_FONT_MONTSERRAT_12_SUBPX + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x0, 0x6b, 0xff, 0x94, 0x0, 0x5, 0xaf, 0xe9, + 0x30, 0x0, 0x4a, 0xfd, 0x83, 0x0, 0x4, 0x9f, + 0xd7, 0x20, 0x0, 0x39, 0xec, 0x72, 0x0, 0x3, + 0x8d, 0xc6, 0x10, 0x0, 0x2, 0x33, 0x10, 0x0, + 0x2, 0x68, 0x84, 0x10, 0x1, 0x5a, 0xed, 0x83, + 0x0, + + /* U+0022 "\"" */ + 0x3, 0x9e, 0xc6, 0x11, 0x6b, 0xe9, 0x40, 0x0, + 0x38, 0xeb, 0x60, 0x6, 0xbe, 0x93, 0x0, 0x3, + 0x8d, 0xb6, 0x0, 0x5b, 0xe8, 0x30, 0x0, 0x14, + 0x75, 0x30, 0x2, 0x57, 0x41, 0x0, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x4, 0xad, 0x83, 0x0, 0x0, + 0x38, 0xda, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x6c, 0xb6, 0x10, 0x0, 0x5, 0xad, 0x83, + 0x0, 0x0, 0x0, 0x4, 0x9e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x61, + 0x0, 0x0, 0x0, 0x5, 0xad, 0x82, 0x0, 0x0, + 0x38, 0xd9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x6c, 0xc6, 0x10, 0x0, 0x5, 0xad, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xda, + 0x50, 0x0, 0x1, 0x6b, 0xc7, 0x10, 0x0, 0x0, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb6, 0x0, 0x0, 0x0, + 0x1, 0x6c, 0xc6, 0x10, 0x0, 0x4, 0xad, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xda, + 0x40, 0x0, 0x1, 0x6c, 0xc6, 0x10, 0x0, 0x0, + 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x9c, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x37, 0xac, 0xde, 0xff, 0xff, 0xed, + 0xb9, 0x63, 0x10, 0x0, 0x1, 0x5b, 0xfe, 0xb7, + 0x46, 0xac, 0x95, 0x35, 0x79, 0x74, 0x0, 0x0, + 0x4, 0x9e, 0xe9, 0x40, 0x4, 0x9c, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5b, 0xfe, 0xc9, + 0x67, 0xbc, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0x9b, 0xde, 0xff, 0xfe, 0xca, + 0x85, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x9c, 0xa7, 0x7a, 0xdf, 0xea, 0x51, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0x82, 0x0, + 0x49, 0xfe, 0x93, 0x0, 0x5, 0xad, 0xb8, 0x54, + 0x25, 0xac, 0x95, 0x47, 0xbe, 0xfa, 0x51, 0x0, + 0x0, 0x26, 0x8b, 0xce, 0xff, 0xff, 0xff, 0xec, + 0xa7, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x9c, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x46, 0x41, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x26, 0xac, 0xcc, 0xcb, 0x84, 0x10, 0x0, + 0x0, 0x0, 0x38, 0xcb, 0x61, 0x0, 0x0, 0x16, + 0xbb, 0x61, 0x0, 0x4, 0xac, 0x82, 0x0, 0x0, + 0x27, 0xcb, 0x62, 0x0, 0x0, 0x0, 0x38, 0xc9, + 0x30, 0x0, 0x1, 0x7c, 0xa4, 0x0, 0x27, 0xcc, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x5, 0xac, 0x72, + 0x0, 0x15, 0xab, 0x72, 0x26, 0xbc, 0x72, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x9b, 0xcc, + 0xba, 0x63, 0x26, 0xbc, 0x83, 0x25, 0x9b, 0xcc, + 0xb9, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x15, 0xbc, 0x83, 0x15, 0xbc, 0x72, 0x0, 0x16, + 0xbb, 0x72, 0x0, 0x0, 0x0, 0x0, 0x15, 0xac, + 0x94, 0x0, 0x38, 0xc9, 0x30, 0x0, 0x2, 0x7c, + 0xa4, 0x0, 0x0, 0x0, 0x14, 0xac, 0x94, 0x0, + 0x0, 0x16, 0xbb, 0x61, 0x0, 0x4, 0x9c, 0x72, + 0x0, 0x0, 0x4, 0x9c, 0xa4, 0x10, 0x0, 0x0, + 0x0, 0x37, 0xab, 0xba, 0xbb, 0x84, 0x10, + + /* U+0026 "&" */ + 0x0, 0x0, 0x2, 0x59, 0xce, 0xee, 0xed, 0xc9, + 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xaf, 0xc8, 0x20, 0x0, 0x38, 0xdd, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xfc, 0x72, + 0x0, 0x15, 0xae, 0xc6, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0xce, 0xdb, 0xcd, 0xda, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x37, 0xbd, 0xdd, 0xef, 0xc8, 0x30, 0x0, 0x1, + 0x12, 0x0, 0x0, 0x0, 0x16, 0xce, 0xc7, 0x30, + 0x1, 0x5a, 0xde, 0xb7, 0x23, 0x8d, 0xd8, 0x30, + 0x0, 0x16, 0xbf, 0xb6, 0x0, 0x0, 0x0, 0x1, + 0x5a, 0xde, 0xff, 0xd7, 0x20, 0x0, 0x0, 0x49, + 0xef, 0xc8, 0x42, 0x11, 0x12, 0x36, 0x9c, 0xef, + 0xfe, 0xb6, 0x20, 0x0, 0x0, 0x3, 0x69, 0xcd, + 0xef, 0xff, 0xed, 0xc9, 0x63, 0x12, 0x6b, 0xb7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x3, 0x9e, 0xc6, 0x10, 0x0, 0x38, 0xeb, 0x60, + 0x0, 0x3, 0x8d, 0xb6, 0x0, 0x0, 0x14, 0x75, + 0x30, 0x0, + + /* U+0028 "(" */ + 0x0, 0x0, 0x0, 0x5a, 0xec, 0x72, 0x0, 0x0, + 0x16, 0xbf, 0xb6, 0x10, 0x0, 0x0, 0x5b, 0xfc, + 0x61, 0x0, 0x0, 0x4, 0x9e, 0xd8, 0x30, 0x0, + 0x0, 0x16, 0xbf, 0xb6, 0x0, 0x0, 0x0, 0x27, + 0xcf, 0xa4, 0x0, 0x0, 0x0, 0x28, 0xdf, 0x94, + 0x0, 0x0, 0x0, 0x27, 0xcf, 0xa4, 0x0, 0x0, + 0x0, 0x16, 0xbf, 0xb6, 0x0, 0x0, 0x0, 0x4, + 0x9e, 0xd8, 0x30, 0x0, 0x0, 0x0, 0x5a, 0xfb, + 0x61, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xb5, 0x10, + 0x0, 0x0, 0x0, 0x5a, 0xec, 0x72, + + /* U+0029 ")" */ + 0x16, 0xbe, 0xb5, 0x10, 0x0, 0x0, 0x0, 0x5a, + 0xfc, 0x72, 0x0, 0x0, 0x0, 0x6, 0xbf, 0xc6, + 0x10, 0x0, 0x0, 0x2, 0x7d, 0xfa, 0x40, 0x0, + 0x0, 0x0, 0x5a, 0xfc, 0x71, 0x0, 0x0, 0x0, + 0x49, 0xfd, 0x83, 0x0, 0x0, 0x0, 0x38, 0xee, + 0x93, 0x0, 0x0, 0x0, 0x49, 0xfd, 0x83, 0x0, + 0x0, 0x0, 0x5a, 0xfc, 0x71, 0x0, 0x0, 0x2, + 0x7d, 0xfa, 0x40, 0x0, 0x0, 0x6, 0xbf, 0xb6, + 0x10, 0x0, 0x0, 0x5a, 0xfc, 0x71, 0x0, 0x0, + 0x16, 0xbe, 0xb5, 0x10, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x0, 0x0, 0x4a, 0xb6, 0x10, 0x0, + 0x0, 0x0, 0x3, 0x8c, 0xc9, 0x9c, 0xca, 0x9b, + 0xca, 0x51, 0x0, 0x0, 0x2, 0x6b, 0xef, 0xff, + 0xd8, 0x30, 0x0, 0x0, 0x3, 0x8b, 0xa7, 0x8b, + 0xc9, 0x79, 0xba, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x38, 0xa6, 0x10, 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0x37, 0xb7, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xfa, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xce, 0xee, 0xef, 0xff, 0xff, 0xee, 0xee, + 0xc7, 0x20, 0x0, 0x1, 0x11, 0x11, 0x6b, 0xfb, + 0x61, 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xa5, 0x0, 0x0, 0x0, 0x0, + + /* U+002C "," */ + 0x1, 0x48, 0x85, 0x20, 0x0, 0x4a, 0xff, 0xc6, + 0x10, 0x0, 0x5b, 0xd8, 0x20, 0x0, 0x39, 0xc8, + 0x30, 0x0, + + /* U+002D "-" */ + 0x4, 0x9f, 0xff, 0xff, 0xff, 0xd8, 0x30, 0x0, + 0x1, 0x22, 0x22, 0x22, 0x22, 0x10, 0x0, + + /* U+002E "." */ + 0x2, 0x6a, 0xa7, 0x30, 0x0, 0x49, 0xdd, 0x94, + 0x0, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x67, + 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, + 0xfa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xaf, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xfb, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xae, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0xec, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x9e, 0xc6, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xec, 0x71, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x9e, 0xc7, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x39, 0xed, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x8e, 0xd7, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x38, 0xdd, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x8d, 0xd8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x2, 0x59, 0xbd, 0xef, 0xfe, 0xdb, + 0x95, 0x20, 0x0, 0x0, 0x0, 0x4, 0xae, 0xfd, + 0xa6, 0x43, 0x34, 0x6a, 0xdf, 0xea, 0x40, 0x0, + 0x1, 0x6c, 0xfd, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xdf, 0xc6, 0x10, 0x5, 0xaf, 0xe8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, 0xfa, 0x50, + 0x16, 0xbf, 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x7c, 0xfb, 0x61, 0x5, 0xaf, 0xe8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, 0xfa, 0x50, + 0x1, 0x6c, 0xfd, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xdf, 0xc6, 0x10, 0x0, 0x4, 0xae, 0xfd, + 0xa6, 0x43, 0x34, 0x6a, 0xdf, 0xea, 0x40, 0x0, + 0x0, 0x0, 0x2, 0x59, 0xbd, 0xef, 0xfe, 0xdb, + 0x95, 0x20, 0x0, 0x0, + + /* U+0031 "1" */ + 0x0, 0x39, 0xef, 0xff, 0xff, 0xfd, 0x83, 0x0, + 0x0, 0x12, 0x22, 0x26, 0xbf, 0xd8, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x5b, 0xfd, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xbf, 0xd8, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0xfd, 0x83, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xbf, 0xd8, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xfd, 0x83, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x5b, 0xfd, 0x83, 0x0, + + /* U+0032 "2" */ + 0x0, 0x0, 0x13, 0x79, 0xbd, 0xef, 0xff, 0xed, + 0xc9, 0x62, 0x0, 0x0, 0x0, 0x3, 0x8d, 0xeb, + 0x85, 0x43, 0x33, 0x47, 0xad, 0xfe, 0x83, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xcf, 0xc6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5a, 0xfe, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x5a, + 0xee, 0xb5, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x15, 0xad, 0xec, 0x73, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x5a, 0xde, 0xc8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0xad, + 0xfd, 0xa6, 0x32, 0x22, 0x22, 0x22, 0x21, 0x10, + 0x0, 0x3, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x72, + + /* U+0033 "3" */ + 0x0, 0x3, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x12, 0x22, + 0x22, 0x22, 0x22, 0x49, 0xdf, 0xc8, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xde, + 0xb6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x5a, 0xef, 0xc7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, 0xcc, 0xde, + 0xfe, 0xc8, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xcf, 0xd7, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x9e, 0xf9, 0x40, 0x0, 0x16, 0xbd, 0xc9, + 0x65, 0x43, 0x33, 0x46, 0x9c, 0xff, 0xa5, 0x10, + 0x0, 0x1, 0x36, 0x9b, 0xce, 0xff, 0xff, 0xed, + 0xca, 0x63, 0x10, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xde, + 0xb6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x14, 0x9e, 0xeb, 0x51, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4a, + 0xee, 0xa5, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0xae, 0xea, 0x51, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x5a, 0xee, 0xa4, 0x10, 0x0, 0x28, 0xdf, 0x94, + 0x0, 0x0, 0x0, 0x0, 0x15, 0xbe, 0xea, 0x41, + 0x0, 0x0, 0x2, 0x8d, 0xf9, 0x40, 0x0, 0x0, + 0x0, 0x38, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd8, 0x30, 0x0, 0x12, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x25, 0x9e, 0xfa, + 0x62, 0x22, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x38, 0xef, 0x94, 0x0, 0x0, + 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x0, 0x1, 0x7c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x0, 0x3, 0x9e, + 0xe9, 0x52, 0x22, 0x22, 0x22, 0x22, 0x10, 0x0, + 0x0, 0x0, 0x5, 0xaf, 0xc6, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xcf, + 0xff, 0xff, 0xee, 0xdd, 0xb9, 0x63, 0x10, 0x0, + 0x0, 0x0, 0x1, 0x22, 0x22, 0x22, 0x33, 0x46, + 0x9c, 0xff, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x8d, 0xfb, 0x60, + 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8d, 0xfb, 0x61, 0x0, 0x4, 0x9e, 0xeb, + 0x86, 0x43, 0x33, 0x45, 0x8c, 0xef, 0xb6, 0x10, + 0x0, 0x0, 0x24, 0x8a, 0xcd, 0xef, 0xff, 0xfe, + 0xca, 0x74, 0x10, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x1, 0x36, 0x9b, 0xde, 0xff, 0xfe, + 0xdc, 0x95, 0x10, 0x0, 0x0, 0x3, 0x8d, 0xfd, + 0xa7, 0x53, 0x32, 0x22, 0x34, 0x32, 0x0, 0x0, + 0x1, 0x6b, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xd9, 0x66, + 0x9b, 0xde, 0xee, 0xdc, 0xa7, 0x31, 0x0, 0x0, + 0x16, 0xbf, 0xff, 0xec, 0x95, 0x43, 0x23, 0x58, + 0xce, 0xfa, 0x51, 0x0, 0x5, 0xaf, 0xfd, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x28, 0xdf, 0xb5, 0x0, + 0x2, 0x7d, 0xfd, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xdf, 0xa5, 0x0, 0x0, 0x15, 0xaf, 0xec, + 0x84, 0x32, 0x12, 0x47, 0xbe, 0xea, 0x51, 0x0, + 0x0, 0x0, 0x13, 0x7a, 0xce, 0xff, 0xff, 0xec, + 0xa7, 0x31, 0x0, 0x0, + + /* U+0037 "7" */ + 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x50, 0x0, 0x5a, 0xfd, 0x94, 0x22, + 0x22, 0x22, 0x22, 0x49, 0xdf, 0xc7, 0x20, 0x0, + 0x37, 0xb9, 0x62, 0x0, 0x0, 0x0, 0x3, 0x8e, + 0xfb, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5a, 0xee, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xd8, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x7d, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x39, 0xef, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xaf, 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6c, 0xfd, 0x82, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x36, 0x9c, 0xde, 0xff, 0xfe, 0xdc, + 0xa7, 0x31, 0x0, 0x0, 0x0, 0x49, 0xef, 0xc8, + 0x53, 0x11, 0x12, 0x48, 0xcf, 0xea, 0x50, 0x0, + 0x2, 0x7d, 0xfb, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xfd, 0x83, 0x0, 0x0, 0x39, 0xef, 0xb7, + 0x31, 0x0, 0x1, 0x37, 0xbe, 0xe9, 0x40, 0x0, + 0x0, 0x2, 0x6b, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x62, 0x0, 0x0, 0x3, 0x8d, 0xfd, 0x95, + 0x21, 0x0, 0x1, 0x24, 0x8c, 0xfe, 0x94, 0x0, + 0x16, 0xcf, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xbf, 0xd7, 0x20, 0x3, 0x8d, 0xfd, 0xa6, + 0x32, 0x11, 0x12, 0x35, 0x9c, 0xfe, 0x94, 0x0, + 0x0, 0x2, 0x58, 0xbc, 0xef, 0xff, 0xff, 0xed, + 0xb9, 0x52, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x13, 0x7a, 0xce, 0xff, 0xff, 0xec, 0xa7, + 0x31, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xeb, 0x63, + 0x21, 0x12, 0x35, 0x9d, 0xeb, 0x61, 0x0, 0x0, + 0x49, 0xfe, 0x83, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xbf, 0xd8, 0x30, 0x0, 0x27, 0xcf, 0xd9, 0x42, + 0x0, 0x0, 0x13, 0x7c, 0xff, 0xfb, 0x60, 0x0, + 0x0, 0x26, 0xad, 0xff, 0xff, 0xff, 0xfd, 0xa7, + 0x9c, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x10, 0x0, 0x3, 0x8d, 0xfb, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, + 0xdf, 0xc7, 0x20, 0x0, 0x0, 0x24, 0x65, 0x32, + 0x23, 0x45, 0x8b, 0xef, 0xd9, 0x40, 0x0, 0x0, + 0x1, 0x48, 0xcd, 0xef, 0xff, 0xed, 0xca, 0x74, + 0x10, 0x0, 0x0, 0x0, + + /* U+003A ":" */ + 0x4, 0x9e, 0xe9, 0x40, 0x0, 0x26, 0xaa, 0x73, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0xaa, 0x73, 0x0, 0x4, 0x9d, 0xd9, 0x40, 0x0, + + /* U+003B ";" */ + 0x4, 0x9e, 0xe9, 0x40, 0x0, 0x26, 0xaa, 0x73, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, + 0x88, 0x52, 0x0, 0x4, 0xaf, 0xfc, 0x61, 0x0, + 0x5, 0xbd, 0x82, 0x0, 0x3, 0x9c, 0x83, 0x0, + 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x23, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, + 0x79, 0xbd, 0xee, 0xb6, 0x10, 0x0, 0x24, 0x79, + 0xbd, 0xee, 0xc9, 0x75, 0x31, 0x0, 0x0, 0x0, + 0x38, 0xdf, 0xec, 0x84, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x46, 0x9b, 0xde, 0xec, + 0xa7, 0x53, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x46, 0x9b, 0xde, 0xc7, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x10, 0x0, + + /* U+003D "=" */ + 0x3, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xce, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xc7, 0x20, 0x0, 0x1, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x0, 0x0, + + /* U+003E ">" */ + 0x1, 0x23, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x26, 0xbe, 0xed, 0xb9, 0x64, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x35, 0x7a, 0xce, 0xed, 0xb9, 0x64, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x8c, 0xef, + 0xd8, 0x20, 0x0, 0x0, 0x13, 0x57, 0xac, 0xee, + 0xdb, 0x96, 0x42, 0x0, 0x0, 0x27, 0xce, 0xdb, + 0x96, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x14, 0x7a, 0xcd, 0xef, 0xff, 0xed, + 0xca, 0x63, 0x0, 0x0, 0x0, 0x4, 0x9d, 0xda, + 0x75, 0x32, 0x22, 0x36, 0xad, 0xfe, 0x83, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x38, 0xef, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0xae, 0xea, 0x51, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x49, 0xde, + 0xc8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0xdf, 0xc7, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x25, 0x88, 0x52, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdd, 0x94, + 0x0, 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x47, 0x9b, 0xcd, + 0xdd, 0xdd, 0xdd, 0xdc, 0xa8, 0x63, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x9c, + 0xdb, 0x85, 0x31, 0x0, 0x0, 0x0, 0x0, 0x13, + 0x68, 0xcd, 0xc7, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x7c, 0xda, 0x51, 0x1, 0x48, 0xbd, 0xef, + 0xfe, 0xdb, 0x86, 0x9d, 0xe9, 0x56, 0xbd, 0xa4, + 0x10, 0x0, 0x0, 0x4, 0x9d, 0xa5, 0x0, 0x27, + 0xcf, 0xd9, 0x52, 0x10, 0x12, 0x59, 0xdf, 0xfe, + 0x83, 0x1, 0x7c, 0xc7, 0x10, 0x0, 0x4, 0x9d, + 0xa5, 0x0, 0x28, 0xde, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xaf, 0xe8, 0x30, 0x1, 0x7c, 0xb6, + 0x0, 0x0, 0x5b, 0xd8, 0x20, 0x4, 0x9f, 0xd7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x27, 0xde, 0x83, + 0x0, 0x5, 0xac, 0x72, 0x0, 0x5, 0xbd, 0x82, + 0x0, 0x28, 0xde, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xaf, 0xe8, 0x30, 0x1, 0x6b, 0xb6, 0x0, + 0x0, 0x39, 0xda, 0x50, 0x0, 0x27, 0xcf, 0xd9, + 0x52, 0x10, 0x12, 0x6a, 0xdf, 0xff, 0xa5, 0x12, + 0x7b, 0xc7, 0x20, 0x0, 0x0, 0x49, 0xda, 0x50, + 0x0, 0x1, 0x48, 0xbd, 0xef, 0xfe, 0xdb, 0x84, + 0x35, 0xad, 0xff, 0xeb, 0x73, 0x0, 0x0, 0x0, + 0x0, 0x26, 0xbd, 0xa5, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x59, 0xcd, + 0xb8, 0x53, 0x10, 0x0, 0x0, 0x0, 0x24, 0x54, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x25, 0x79, 0xbd, 0xdd, 0xee, + 0xee, 0xdd, 0xb9, 0x62, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, + 0xfd, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xdf, + 0xdd, 0xee, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xee, + 0x94, 0x38, 0xdf, 0xb5, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xfe, + 0x83, 0x0, 0x27, 0xcf, 0xc7, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7c, 0xfd, + 0x72, 0x0, 0x0, 0x16, 0xcf, 0xe8, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, 0xfc, + 0x71, 0x0, 0x0, 0x0, 0x15, 0xbf, 0xfa, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xae, 0xff, + 0xff, 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xfb, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xea, + 0x52, 0x11, 0x11, 0x11, 0x11, 0x11, 0x14, 0x8d, + 0xfd, 0x72, 0x0, 0x0, 0x0, 0x27, 0xcf, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6b, 0xfe, 0x94, 0x0, 0x0, + + /* U+0042 "B" */ + 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xdb, 0x95, 0x20, 0x0, 0x0, 0x1, 0x6b, + 0xfc, 0x72, 0x11, 0x11, 0x11, 0x12, 0x36, 0xad, + 0xfd, 0x72, 0x0, 0x0, 0x16, 0xbf, 0xc7, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8e, 0xfa, 0x50, + 0x0, 0x1, 0x6b, 0xfc, 0x72, 0x0, 0x0, 0x0, + 0x0, 0x14, 0x8d, 0xfc, 0x72, 0x0, 0x0, 0x16, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xea, 0x51, 0x0, 0x0, 0x1, 0x6b, 0xfc, 0x83, + 0x22, 0x22, 0x22, 0x22, 0x34, 0x69, 0xdf, 0xd7, + 0x20, 0x0, 0x16, 0xbf, 0xc7, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0xcf, 0xc7, 0x10, 0x1, + 0x6b, 0xfc, 0x72, 0x11, 0x11, 0x11, 0x11, 0x13, + 0x58, 0xcf, 0xe9, 0x40, 0x0, 0x16, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xc9, 0x63, + 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x13, 0x69, 0xbd, 0xee, 0xff, + 0xfe, 0xdb, 0x96, 0x31, 0x0, 0x0, 0x0, 0x15, + 0x9e, 0xfe, 0xc9, 0x65, 0x33, 0x33, 0x46, 0x8b, + 0xee, 0xa4, 0x0, 0x0, 0x4a, 0xef, 0xb6, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xfe, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, + 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x49, 0xfe, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4a, 0xef, 0xb6, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x15, 0xae, 0xfe, 0xc9, 0x65, 0x33, 0x33, 0x46, + 0x8b, 0xee, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x13, + 0x69, 0xbd, 0xef, 0xff, 0xfe, 0xdb, 0x96, 0x31, + 0x0, 0x0, + + /* U+0044 "D" */ + 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xca, 0x85, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xbf, 0xc8, 0x32, 0x22, 0x22, 0x23, 0x35, + 0x69, 0xce, 0xfd, 0x94, 0x10, 0x0, 0x0, 0x16, + 0xbf, 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x7c, 0xfe, 0x93, 0x0, 0x0, 0x16, 0xbf, + 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xe8, 0x30, 0x0, 0x16, 0xbf, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x8e, 0xfa, 0x50, 0x0, 0x16, 0xbf, 0xc7, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xaf, + 0xe8, 0x30, 0x0, 0x16, 0xbf, 0xc7, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, 0xfe, 0x93, + 0x0, 0x0, 0x16, 0xbf, 0xc8, 0x32, 0x22, 0x22, + 0x23, 0x35, 0x69, 0xce, 0xfd, 0x94, 0x10, 0x0, + 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xcb, 0x86, 0x31, 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd8, 0x30, 0x0, 0x16, 0xbf, 0xc8, + 0x32, 0x22, 0x22, 0x22, 0x22, 0x22, 0x11, 0x0, + 0x0, 0x16, 0xbf, 0xc7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x50, 0x0, 0x0, 0x16, 0xbf, 0xc8, + 0x32, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, + 0x0, 0x16, 0xbf, 0xc7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xc8, + 0x32, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, + 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x50, + + /* U+0046 "F" */ + 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd8, 0x30, 0x0, 0x16, 0xbf, 0xc8, + 0x32, 0x22, 0x22, 0x22, 0x22, 0x22, 0x11, 0x0, + 0x0, 0x16, 0xbf, 0xc7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x50, 0x0, 0x0, 0x16, 0xbf, 0xd8, + 0x42, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, + 0x0, 0x16, 0xbf, 0xc7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0xbf, 0xc7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x13, 0x69, 0xbc, 0xee, 0xff, + 0xfe, 0xdc, 0xa7, 0x41, 0x0, 0x0, 0x0, 0x15, + 0xae, 0xfe, 0xc9, 0x65, 0x43, 0x33, 0x46, 0x8a, + 0xde, 0xb5, 0x10, 0x0, 0x4a, 0xef, 0xc7, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xfe, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, + 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x25, 0x87, 0x42, 0x0, 0x49, 0xfe, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9e, 0xe9, + 0x30, 0x0, 0x4a, 0xef, 0xb6, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x49, 0xee, 0x93, 0x0, 0x0, + 0x15, 0xae, 0xfe, 0xc9, 0x65, 0x33, 0x33, 0x45, + 0x7a, 0xdf, 0xe8, 0x30, 0x0, 0x0, 0x0, 0x13, + 0x69, 0xbd, 0xee, 0xff, 0xfe, 0xdc, 0xa7, 0x41, + 0x0, 0x0, + + /* U+0048 "H" */ + 0x0, 0x16, 0xbf, 0xc7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xbf, 0xd7, 0x20, 0x1, 0x6b, + 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6b, 0xfd, 0x72, 0x0, 0x16, 0xbf, 0xc7, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xbf, 0xd7, + 0x20, 0x1, 0x6b, 0xfc, 0x72, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6b, 0xfd, 0x72, 0x0, 0x16, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd7, 0x20, 0x1, 0x6b, 0xfd, 0x84, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x23, 0x7c, 0xfd, + 0x72, 0x0, 0x16, 0xbf, 0xc7, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xbf, 0xd7, 0x20, 0x1, + 0x6b, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6b, 0xfd, 0x72, 0x0, 0x16, 0xbf, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xbf, + 0xd7, 0x20, + + /* U+0049 "I" */ + 0x0, 0x16, 0xbf, 0xc7, 0x20, 0x1, 0x6b, 0xfc, + 0x72, 0x0, 0x16, 0xbf, 0xc7, 0x20, 0x1, 0x6b, + 0xfc, 0x72, 0x0, 0x16, 0xbf, 0xc7, 0x20, 0x1, + 0x6b, 0xfc, 0x72, 0x0, 0x16, 0xbf, 0xc7, 0x20, + 0x1, 0x6b, 0xfc, 0x72, 0x0, 0x16, 0xbf, 0xc7, + 0x20, + + /* U+004A "J" */ + 0x0, 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x40, 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, + 0x22, 0x59, 0xef, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x8e, 0xfa, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xef, + 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x8e, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x38, 0xef, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9f, 0xe9, + 0x30, 0x0, 0x3, 0x8d, 0xc9, 0x53, 0x22, 0x47, + 0xbe, 0xfa, 0x51, 0x0, 0x0, 0x2, 0x58, 0xbd, + 0xef, 0xfe, 0xdb, 0x95, 0x20, 0x0, 0x0, + + /* U+004B "K" */ + 0x0, 0x16, 0xbf, 0xc7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x27, 0xbe, 0xd9, 0x41, 0x0, 0x1, 0x6b, + 0xfc, 0x72, 0x0, 0x0, 0x0, 0x15, 0xae, 0xeb, + 0x62, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xc7, 0x20, + 0x0, 0x14, 0x9d, 0xec, 0x73, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x6b, 0xfc, 0x72, 0x3, 0x7c, 0xed, + 0x94, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xbf, 0xc9, 0x8b, 0xef, 0xff, 0xc7, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6b, 0xff, 0xff, + 0xc8, 0x45, 0x9d, 0xfd, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xbf, 0xea, 0x51, 0x0, 0x0, + 0x27, 0xcf, 0xea, 0x51, 0x0, 0x0, 0x0, 0x1, + 0x6b, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x1, 0x5a, + 0xef, 0xc7, 0x20, 0x0, 0x0, 0x16, 0xbf, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, 0xfd, + 0x83, 0x0, + + /* U+004C "L" */ + 0x0, 0x16, 0xbf, 0xc7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0xbf, 0xc7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0xbf, 0xc7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0xbf, 0xc7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xc8, + 0x32, 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, 0x0, + 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb5, 0x0, + + /* U+004D "M" */ + 0x0, 0x16, 0xbf, 0xd8, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6b, 0xfd, 0x83, + 0x0, 0x1, 0x6b, 0xff, 0xfb, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9e, 0xff, 0xd8, + 0x30, 0x0, 0x16, 0xbf, 0xee, 0xee, 0xa4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xde, 0xee, 0xfd, + 0x83, 0x0, 0x1, 0x6b, 0xfb, 0x76, 0xbe, 0xd8, + 0x30, 0x0, 0x0, 0x1, 0x6b, 0xec, 0x76, 0xaf, + 0xd8, 0x30, 0x0, 0x16, 0xbf, 0xb6, 0x12, 0x7c, + 0xfb, 0x61, 0x0, 0x4, 0x9e, 0xd8, 0x30, 0x4a, + 0xfd, 0x83, 0x0, 0x1, 0x6b, 0xfb, 0x61, 0x0, + 0x39, 0xde, 0x94, 0x37, 0xce, 0xa5, 0x10, 0x4, + 0xaf, 0xd8, 0x30, 0x0, 0x16, 0xbf, 0xb6, 0x10, + 0x0, 0x15, 0xae, 0xff, 0xec, 0x72, 0x0, 0x0, + 0x4a, 0xfd, 0x83, 0x0, 0x1, 0x6b, 0xfb, 0x61, + 0x0, 0x0, 0x2, 0x6b, 0xc8, 0x30, 0x0, 0x0, + 0x4, 0xaf, 0xd8, 0x30, 0x0, 0x16, 0xbf, 0xb6, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0xfd, 0x83, 0x0, + + /* U+004E "N" */ + 0x0, 0x16, 0xbf, 0xe9, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xbf, 0xd7, 0x20, 0x1, 0x6b, + 0xff, 0xfe, 0xb5, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x6b, 0xfd, 0x72, 0x0, 0x16, 0xbf, 0xdc, 0xce, + 0xfc, 0x72, 0x0, 0x0, 0x0, 0x6, 0xbf, 0xd7, + 0x20, 0x1, 0x6b, 0xfc, 0x73, 0x4a, 0xef, 0xd8, + 0x30, 0x0, 0x0, 0x6b, 0xfd, 0x72, 0x0, 0x16, + 0xbf, 0xc7, 0x20, 0x3, 0x8d, 0xfe, 0x94, 0x10, + 0x6, 0xbf, 0xd7, 0x20, 0x1, 0x6b, 0xfc, 0x72, + 0x0, 0x0, 0x27, 0xcf, 0xeb, 0x52, 0x6b, 0xfd, + 0x72, 0x0, 0x16, 0xbf, 0xc7, 0x20, 0x0, 0x0, + 0x1, 0x6b, 0xef, 0xcc, 0xdf, 0xd7, 0x20, 0x1, + 0x6b, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0x14, + 0xae, 0xff, 0xfd, 0x72, 0x0, 0x16, 0xbf, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xdf, + 0xd7, 0x20, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x13, 0x69, 0xbc, 0xee, 0xff, + 0xfe, 0xdb, 0x97, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x59, 0xef, 0xec, 0x96, 0x53, 0x33, 0x34, + 0x68, 0xbe, 0xfe, 0xb6, 0x20, 0x0, 0x0, 0x4a, + 0xef, 0xb6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x5a, 0xef, 0xb5, 0x10, 0x4, 0x9f, 0xe9, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x8d, 0xfb, 0x50, 0x16, 0xbf, 0xc7, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6b, 0xfc, 0x72, 0x4, 0x9f, 0xe9, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, + 0xfb, 0x50, 0x0, 0x4a, 0xef, 0xb6, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xef, 0xb5, + 0x10, 0x0, 0x1, 0x5a, 0xef, 0xec, 0x96, 0x43, + 0x33, 0x34, 0x68, 0xbe, 0xfe, 0xb6, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x13, 0x69, 0xbd, 0xee, 0xff, + 0xfe, 0xdb, 0x97, 0x41, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xdc, 0xa8, 0x52, 0x0, 0x0, 0x0, 0x1, 0x6b, + 0xfc, 0x83, 0x22, 0x22, 0x22, 0x35, 0x7a, 0xdf, + 0xd9, 0x40, 0x0, 0x0, 0x16, 0xbf, 0xc7, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9e, 0xe9, 0x40, + 0x0, 0x1, 0x6b, 0xfc, 0x72, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x39, 0xef, 0xa4, 0x0, 0x0, 0x16, + 0xbf, 0xc7, 0x20, 0x0, 0x0, 0x0, 0x24, 0x8c, + 0xfe, 0xa5, 0x10, 0x0, 0x1, 0x6b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xa7, 0x31, 0x0, + 0x0, 0x0, 0x16, 0xbf, 0xd8, 0x42, 0x22, 0x22, + 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6b, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x13, 0x69, 0xbc, 0xee, 0xff, + 0xfe, 0xdb, 0x97, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x14, 0x9d, 0xfe, 0xc9, 0x65, 0x33, + 0x33, 0x46, 0x8b, 0xef, 0xeb, 0x62, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xef, 0xb6, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x5a, 0xef, 0xb5, 0x10, + 0x0, 0x0, 0x49, 0xfe, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xdf, 0xb5, + 0x0, 0x0, 0x16, 0xbf, 0xc7, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0xfc, + 0x72, 0x0, 0x0, 0x4a, 0xfe, 0x94, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xdf, + 0xb6, 0x0, 0x0, 0x0, 0x5a, 0xff, 0xb6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xef, + 0xb6, 0x10, 0x0, 0x0, 0x0, 0x15, 0xae, 0xfe, + 0xb8, 0x54, 0x32, 0x22, 0x35, 0x7a, 0xdf, 0xeb, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, + 0x7a, 0xcd, 0xef, 0xff, 0xff, 0xec, 0xa8, 0x52, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x8c, 0xfe, 0xb6, 0x20, + 0x0, 0x26, 0x98, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x7b, 0xdf, + 0xff, 0xfe, 0xd9, 0x52, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+0052 "R" */ + 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xdc, 0xa8, 0x52, 0x0, 0x0, 0x0, 0x1, 0x6b, + 0xfc, 0x83, 0x22, 0x22, 0x22, 0x35, 0x7a, 0xdf, + 0xd9, 0x40, 0x0, 0x0, 0x16, 0xbf, 0xc7, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9e, 0xe9, 0x40, + 0x0, 0x1, 0x6b, 0xfc, 0x72, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x39, 0xef, 0xa5, 0x0, 0x0, 0x16, + 0xbf, 0xc7, 0x20, 0x0, 0x0, 0x0, 0x14, 0x8b, + 0xef, 0xb5, 0x10, 0x0, 0x1, 0x6b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xb7, 0x41, 0x0, + 0x0, 0x0, 0x16, 0xbf, 0xc8, 0x32, 0x22, 0x22, + 0x26, 0xbe, 0xd9, 0x40, 0x0, 0x0, 0x0, 0x1, + 0x6b, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x1, 0x6b, + 0xfd, 0x83, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x27, 0xcf, 0xd8, + 0x30, 0x0, + + /* U+0053 "S" */ + 0x0, 0x1, 0x37, 0xac, 0xde, 0xff, 0xfe, 0xdc, + 0xb8, 0x63, 0x10, 0x0, 0x1, 0x5b, 0xfe, 0xb7, + 0x43, 0x22, 0x23, 0x45, 0x79, 0x84, 0x0, 0x0, + 0x4, 0x9e, 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5b, 0xfe, 0xc9, + 0x63, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x25, 0x8b, 0xce, 0xff, 0xfd, 0xca, + 0x74, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x34, 0x69, 0xcf, 0xea, 0x51, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xfe, 0x93, 0x0, 0x5, 0xad, 0xb8, 0x64, + 0x32, 0x22, 0x23, 0x48, 0xbe, 0xfb, 0x51, 0x0, + 0x0, 0x25, 0x8a, 0xcd, 0xef, 0xff, 0xfe, 0xdc, + 0xa7, 0x31, 0x0, 0x0, + + /* U+0054 "T" */ + 0x0, 0x4a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x50, 0x0, 0x0, 0x12, + 0x22, 0x22, 0x23, 0x7c, 0xfc, 0x83, 0x22, 0x22, + 0x22, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xcf, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6c, 0xfc, + 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xcf, 0xc7, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x6c, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xcf, + 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x6c, 0xfc, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0xcf, 0xc7, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0055 "U" */ + 0x0, 0x27, 0xdf, 0xb6, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x38, 0xef, 0xa4, 0x0, 0x2, 0x7d, + 0xfb, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x8e, 0xfa, 0x40, 0x0, 0x27, 0xdf, 0xb6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xef, 0xa4, + 0x0, 0x2, 0x7d, 0xfb, 0x61, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x8e, 0xfa, 0x40, 0x0, 0x27, + 0xdf, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x38, 0xef, 0xa4, 0x0, 0x1, 0x6c, 0xfc, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9f, 0xe8, + 0x30, 0x0, 0x4, 0x9e, 0xfa, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x8d, 0xfc, 0x61, 0x0, 0x0, + 0x2, 0x7c, 0xfe, 0xb8, 0x54, 0x33, 0x35, 0x7a, + 0xdf, 0xea, 0x50, 0x0, 0x0, 0x0, 0x0, 0x14, + 0x8a, 0xce, 0xff, 0xfe, 0xdd, 0xb8, 0x52, 0x0, + 0x0, 0x0, + + /* U+0056 "V" */ + 0x0, 0x27, 0xcf, 0xc7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x8d, 0xfa, 0x51, 0x0, + 0x1, 0x6b, 0xfe, 0x93, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xee, 0x94, 0x0, 0x0, 0x0, + 0x5, 0xaf, 0xea, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xaf, 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x39, 0xef, 0xb6, 0x10, 0x0, 0x0, 0x1, 0x6c, + 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x7d, 0xfc, 0x72, 0x0, 0x0, 0x27, 0xdf, 0xb6, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xcf, 0xd8, 0x30, 0x3, 0x9e, 0xfa, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, + 0xfe, 0x95, 0x5a, 0xfe, 0x93, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9e, + 0xfe, 0xef, 0xd7, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xdf, + 0xfc, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0x27, 0xcf, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x9e, 0xfd, 0x83, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xdf, 0xa4, 0x0, 0x2, 0x7d, 0xfc, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x39, 0xef, 0xff, + 0xd8, 0x20, 0x0, 0x0, 0x0, 0x2, 0x7d, 0xfa, + 0x50, 0x0, 0x0, 0x28, 0xdf, 0xb6, 0x10, 0x0, + 0x0, 0x3, 0x8e, 0xd9, 0x8b, 0xfd, 0x72, 0x0, + 0x0, 0x0, 0x27, 0xcf, 0xa5, 0x0, 0x0, 0x0, + 0x3, 0x8d, 0xfb, 0x60, 0x0, 0x0, 0x38, 0xee, + 0x83, 0x5, 0xbf, 0xc7, 0x20, 0x0, 0x1, 0x7c, + 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x38, 0xef, + 0xb5, 0x0, 0x3, 0x8d, 0xe9, 0x30, 0x1, 0x6b, + 0xfc, 0x71, 0x0, 0x16, 0xcf, 0xb6, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x9e, 0xfa, 0x50, 0x38, + 0xde, 0x94, 0x0, 0x0, 0x16, 0xbf, 0xc6, 0x11, + 0x6b, 0xfb, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xef, 0xa7, 0x8d, 0xe9, 0x40, 0x0, + 0x0, 0x1, 0x6b, 0xfb, 0x77, 0xbf, 0xc6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9e, + 0xff, 0xfe, 0x94, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xbf, 0xff, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, 0xea, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6c, 0xff, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0x0, 0x1, 0x5a, 0xef, 0xb6, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xee, 0xb5, 0x10, 0x0, 0x0, + 0x0, 0x1, 0x5a, 0xef, 0xb6, 0x10, 0x0, 0x0, + 0x49, 0xee, 0xa5, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x4a, 0xef, 0xb6, 0x21, 0x4a, 0xee, + 0xa5, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x49, 0xef, 0xdd, 0xee, 0xa4, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x8d, 0xff, 0xe9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x7c, 0xfd, 0xaa, 0xdf, 0xd8, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, 0xfd, + 0x83, 0x0, 0x27, 0xcf, 0xd8, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x7c, 0xfd, 0x83, 0x0, + 0x0, 0x0, 0x27, 0xcf, 0xd9, 0x30, 0x0, 0x0, + 0x0, 0x3, 0x8c, 0xfd, 0x83, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x27, 0xcf, 0xd9, 0x40, 0x0, + + /* U+0059 "Y" */ + 0x0, 0x16, 0xcf, 0xd8, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x15, 0xae, 0xd8, 0x30, 0x0, 0x0, + 0x0, 0x38, 0xdf, 0xb6, 0x10, 0x0, 0x0, 0x0, + 0x3, 0x8d, 0xea, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0xee, 0xa5, 0x0, 0x0, 0x2, 0x7c, + 0xeb, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x6b, 0xfd, 0x83, 0x1, 0x5b, 0xed, 0x72, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x7c, 0xfc, 0xab, 0xee, 0x94, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x9e, 0xff, 0xb5, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6b, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, + 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0xfc, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x50, 0x0, 0x12, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x25, 0x9d, 0xfd, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9d, + 0xfc, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x15, 0xae, 0xfb, 0x62, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x26, 0xbf, 0xea, 0x51, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, + 0xcf, 0xd9, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x49, 0xdf, 0xc7, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5b, 0xef, 0xc8, + 0x42, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x10, + 0x27, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x83, + + /* U+005B "[" */ + 0x0, 0x16, 0xbf, 0xff, 0xff, 0xc7, 0x10, 0x0, + 0x1, 0x6b, 0xfb, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xbf, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x1, + 0x6b, 0xfb, 0x61, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xbf, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x1, 0x6b, + 0xfb, 0x61, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, + 0xb6, 0x10, 0x0, 0x0, 0x0, 0x1, 0x6b, 0xfb, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xb6, + 0x10, 0x0, 0x0, 0x0, 0x1, 0x6b, 0xfb, 0x61, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xb6, 0x10, + 0x0, 0x0, 0x0, 0x1, 0x6b, 0xfb, 0x61, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, 0xc7, + 0x10, 0x0, + + /* U+005C "\\" */ + 0x3, 0x57, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7c, 0xe9, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x27, 0xde, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x8d, 0xd8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xdd, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x8d, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x38, 0xed, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x9e, 0xc7, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x49, 0xec, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9e, 0xc7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, + 0xec, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xae, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5a, 0xfb, 0x61, + + /* U+005D "]" */ + 0x0, 0x17, 0xcf, 0xff, 0xff, 0xb6, 0x10, 0x0, + 0x0, 0x0, 0x1, 0x7c, 0xfb, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xcf, 0xb6, 0x10, 0x0, 0x0, + 0x0, 0x1, 0x6c, 0xfb, 0x61, 0x0, 0x0, 0x0, + 0x0, 0x16, 0xcf, 0xb6, 0x10, 0x0, 0x0, 0x0, + 0x1, 0x6c, 0xfb, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xcf, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x1, + 0x6c, 0xfb, 0x61, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xcf, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x1, 0x6c, + 0xfb, 0x61, 0x0, 0x0, 0x0, 0x0, 0x16, 0xcf, + 0xb6, 0x10, 0x0, 0x0, 0x0, 0x1, 0x7c, 0xfb, + 0x61, 0x0, 0x0, 0x17, 0xcf, 0xff, 0xff, 0xb6, + 0x10, 0x0, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0x0, 0x35, 0x76, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xee, + 0xeb, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6b, 0xc7, 0x47, 0xcb, 0x61, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7c, 0xc7, 0x10, 0x17, 0xcc, 0x72, + 0x0, 0x0, 0x0, 0x3, 0x8d, 0xb6, 0x10, 0x0, + 0x16, 0xbd, 0x82, 0x0, 0x0, 0x3, 0x9d, 0xb5, + 0x0, 0x0, 0x0, 0x5, 0xbd, 0x93, 0x0, + + /* U+005F "_" */ + 0x0, 0x48, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0x84, 0x0, + + /* U+0060 "`" */ + 0x2, 0x47, 0x76, 0x31, 0x0, 0x0, 0x0, 0x2, + 0x58, 0xcc, 0x95, 0x10, + + /* U+0061 "a" */ + 0x0, 0x25, 0x8a, 0xcd, 0xef, 0xfe, 0xec, 0xa6, + 0x30, 0x0, 0x0, 0x3, 0x7a, 0x85, 0x42, 0x22, + 0x35, 0x9d, 0xfd, 0x83, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x6b, 0xfb, 0x61, 0x0, + 0x1, 0x48, 0xbc, 0xdd, 0xee, 0xee, 0xee, 0xff, + 0xc7, 0x20, 0x4, 0x9f, 0xe9, 0x41, 0x0, 0x0, + 0x0, 0x5b, 0xfc, 0x72, 0x0, 0x4a, 0xfe, 0x94, + 0x0, 0x0, 0x3, 0x7b, 0xff, 0xc7, 0x20, 0x0, + 0x15, 0x9c, 0xde, 0xed, 0xdc, 0xb8, 0x8b, 0xfc, + 0x72, 0x0, + + /* U+0062 "b" */ + 0x0, 0x39, 0xee, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9e, + 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x39, 0xee, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x9e, 0xea, 0x77, 0xac, 0xef, 0xff, + 0xec, 0xa7, 0x41, 0x0, 0x0, 0x0, 0x0, 0x39, + 0xef, 0xff, 0xc8, 0x53, 0x22, 0x24, 0x8b, 0xef, + 0xc7, 0x20, 0x0, 0x0, 0x3, 0x9e, 0xfc, 0x61, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, 0xd8, 0x30, + 0x0, 0x0, 0x39, 0xee, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xdf, 0xa5, 0x0, 0x0, 0x3, + 0x9e, 0xfc, 0x61, 0x0, 0x0, 0x0, 0x0, 0x15, + 0xbf, 0xd8, 0x30, 0x0, 0x0, 0x39, 0xef, 0xff, + 0xc8, 0x53, 0x22, 0x24, 0x8b, 0xef, 0xc7, 0x20, + 0x0, 0x0, 0x3, 0x9e, 0xe9, 0x67, 0xad, 0xef, + 0xff, 0xec, 0xa7, 0x41, 0x0, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x24, 0x8b, 0xde, 0xff, 0xfe, 0xdb, + 0x84, 0x10, 0x0, 0x3, 0x9d, 0xfd, 0xa6, 0x32, + 0x22, 0x46, 0xac, 0xc7, 0x30, 0x5, 0xaf, 0xd8, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x7c, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xaf, 0xd8, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9d, 0xfd, + 0xa6, 0x32, 0x22, 0x46, 0xad, 0xd8, 0x30, 0x0, + 0x0, 0x24, 0x8b, 0xde, 0xff, 0xfe, 0xdb, 0x84, + 0x10, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xbf, 0xc6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xc6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xbf, 0xc6, 0x10, 0x0, 0x0, 0x25, 0x9b, + 0xde, 0xff, 0xfd, 0xc9, 0x68, 0xcf, 0xc6, 0x10, + 0x0, 0x4a, 0xef, 0xd9, 0x63, 0x22, 0x23, 0x6a, + 0xdf, 0xff, 0xc6, 0x10, 0x5, 0xbf, 0xd8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x49, 0xef, 0xc6, 0x10, + 0x27, 0xcf, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xbf, 0xc6, 0x10, 0x5, 0xbf, 0xd8, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x38, 0xef, 0xc6, 0x10, + 0x0, 0x4a, 0xef, 0xd9, 0x52, 0x10, 0x12, 0x5a, + 0xdf, 0xff, 0xc6, 0x10, 0x0, 0x0, 0x25, 0x9b, + 0xde, 0xff, 0xfe, 0xc9, 0x68, 0xbf, 0xc6, 0x10, + + /* U+0065 "e" */ + 0x0, 0x0, 0x25, 0x9b, 0xde, 0xff, 0xed, 0xc9, + 0x52, 0x0, 0x0, 0x0, 0x0, 0x49, 0xee, 0xc8, + 0x42, 0x11, 0x24, 0x7b, 0xee, 0x94, 0x0, 0x0, + 0x5, 0xaf, 0xc7, 0x20, 0x0, 0x0, 0x0, 0x1, + 0x6c, 0xfb, 0x50, 0x0, 0x27, 0xcf, 0xff, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xfc, 0x72, 0x0, + 0x5, 0xaf, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xef, 0xd9, + 0x64, 0x22, 0x23, 0x47, 0xaa, 0x62, 0x0, 0x0, + 0x0, 0x0, 0x25, 0x8b, 0xde, 0xff, 0xfe, 0xdc, + 0x95, 0x20, 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x1, 0x59, 0xce, 0xff, 0xeb, + 0x62, 0x0, 0x0, 0x0, 0x49, 0xee, 0xa5, 0x11, + 0x22, 0x10, 0x0, 0x0, 0x0, 0x6b, 0xfb, 0x61, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xe9, 0x30, 0x0, 0x0, 0x1, 0x6b, + 0xfb, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6b, 0xfb, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x6b, 0xfb, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x6b, 0xfb, 0x61, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6b, 0xfb, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x6b, 0xfb, 0x61, 0x0, + 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x25, 0x9b, 0xde, 0xff, 0xfe, 0xc9, + 0x67, 0xae, 0xd8, 0x20, 0x0, 0x49, 0xef, 0xda, + 0x64, 0x22, 0x23, 0x59, 0xcf, 0xff, 0xd8, 0x20, + 0x5, 0xaf, 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xdf, 0xd8, 0x20, 0x27, 0xcf, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xaf, 0xd8, 0x20, + 0x5, 0xaf, 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x28, 0xdf, 0xd8, 0x20, 0x0, 0x49, 0xef, 0xda, + 0x63, 0x22, 0x23, 0x6a, 0xdf, 0xff, 0xd8, 0x20, + 0x0, 0x0, 0x25, 0x9b, 0xde, 0xff, 0xfe, 0xc9, + 0x57, 0xaf, 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xcf, 0xb5, 0x0, + 0x0, 0x38, 0xcc, 0x86, 0x43, 0x22, 0x23, 0x58, + 0xbe, 0xea, 0x50, 0x0, 0x0, 0x13, 0x69, 0xbd, + 0xef, 0xff, 0xfe, 0xdc, 0xa6, 0x31, 0x0, 0x0, + + /* U+0068 "h" */ + 0x0, 0x39, 0xee, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xee, 0x94, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x39, 0xee, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xee, 0xa7, + 0x6a, 0xde, 0xff, 0xee, 0xc9, 0x52, 0x0, 0x0, + 0x0, 0x39, 0xef, 0xfe, 0xb7, 0x43, 0x22, 0x46, + 0xae, 0xfc, 0x72, 0x0, 0x0, 0x39, 0xef, 0xb6, + 0x10, 0x0, 0x0, 0x0, 0x27, 0xcf, 0xb6, 0x0, + 0x0, 0x39, 0xee, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xc7, 0x10, 0x0, 0x39, 0xee, 0x94, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, 0xc7, 0x20, + 0x0, 0x39, 0xee, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xc7, 0x20, 0x0, 0x39, 0xee, 0x94, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, 0xc7, 0x20, + + /* U+0069 "i" */ + 0x0, 0x49, 0xdd, 0x94, 0x0, 0x2, 0x58, 0x85, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9e, + 0xe9, 0x40, 0x0, 0x39, 0xee, 0x94, 0x0, 0x3, + 0x9e, 0xe9, 0x40, 0x0, 0x39, 0xee, 0x94, 0x0, + 0x3, 0x9e, 0xe9, 0x40, 0x0, 0x39, 0xee, 0x94, + 0x0, 0x3, 0x9e, 0xe9, 0x40, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x0, 0x38, 0xde, 0xa5, 0x10, + 0x0, 0x0, 0x0, 0x1, 0x47, 0x85, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x8d, 0xfa, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xdf, 0xa4, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x8d, 0xfa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xdf, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8d, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x28, 0xdf, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x8d, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x28, + 0xdf, 0x94, 0x0, 0x0, 0x22, 0x21, 0x27, 0xbf, + 0xd7, 0x20, 0x0, 0x38, 0xdf, 0xff, 0xec, 0x84, + 0x10, 0x0, + + /* U+006B "k" */ + 0x0, 0x39, 0xee, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xee, 0x94, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x39, 0xee, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xee, 0x94, + 0x0, 0x0, 0x0, 0x27, 0xbe, 0xda, 0x51, 0x0, + 0x0, 0x39, 0xee, 0x94, 0x0, 0x2, 0x7b, 0xee, + 0xb6, 0x20, 0x0, 0x0, 0x0, 0x39, 0xee, 0x94, + 0x27, 0xbe, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x39, 0xef, 0xee, 0xef, 0xff, 0xfd, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xef, 0xfc, + 0x73, 0x13, 0x8d, 0xfd, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x39, 0xee, 0x94, 0x0, 0x0, 0x2, 0x7c, + 0xfe, 0xa4, 0x10, 0x0, 0x0, 0x39, 0xee, 0x94, + 0x0, 0x0, 0x0, 0x2, 0x6b, 0xfe, 0xa5, 0x10, + + /* U+006C "l" */ + 0x0, 0x39, 0xee, 0x94, 0x0, 0x3, 0x9e, 0xe9, + 0x40, 0x0, 0x39, 0xee, 0x94, 0x0, 0x3, 0x9e, + 0xe9, 0x40, 0x0, 0x39, 0xee, 0x94, 0x0, 0x3, + 0x9e, 0xe9, 0x40, 0x0, 0x39, 0xee, 0x94, 0x0, + 0x3, 0x9e, 0xe9, 0x40, 0x0, 0x39, 0xee, 0x94, + 0x0, 0x3, 0x9e, 0xe9, 0x40, + + /* U+006D "m" */ + 0x0, 0x39, 0xee, 0x97, 0x7b, 0xde, 0xff, 0xfd, + 0xb9, 0x42, 0x25, 0x9b, 0xde, 0xff, 0xed, 0xb8, + 0x41, 0x0, 0x0, 0x39, 0xef, 0xfd, 0xa6, 0x32, + 0x12, 0x47, 0xcf, 0xff, 0xfe, 0xb6, 0x32, 0x12, + 0x37, 0xbe, 0xfa, 0x51, 0x0, 0x39, 0xef, 0xb6, + 0x10, 0x0, 0x0, 0x0, 0x49, 0xff, 0xc6, 0x10, + 0x0, 0x0, 0x0, 0x49, 0xee, 0x94, 0x0, 0x39, + 0xee, 0x94, 0x0, 0x0, 0x0, 0x0, 0x38, 0xef, + 0xa4, 0x0, 0x0, 0x0, 0x0, 0x28, 0xdf, 0xa5, + 0x0, 0x39, 0xee, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x38, 0xef, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x28, + 0xdf, 0xa5, 0x0, 0x39, 0xee, 0x94, 0x0, 0x0, + 0x0, 0x0, 0x38, 0xef, 0xa4, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xdf, 0xa5, 0x0, 0x39, 0xee, 0x94, + 0x0, 0x0, 0x0, 0x0, 0x38, 0xef, 0xa4, 0x0, + 0x0, 0x0, 0x0, 0x28, 0xdf, 0xa5, + + /* U+006E "n" */ + 0x0, 0x39, 0xee, 0x96, 0x7a, 0xde, 0xff, 0xee, + 0xc9, 0x52, 0x0, 0x0, 0x0, 0x39, 0xef, 0xfe, + 0xa6, 0x42, 0x11, 0x35, 0xad, 0xfc, 0x72, 0x0, + 0x0, 0x39, 0xef, 0xb6, 0x10, 0x0, 0x0, 0x0, + 0x17, 0xcf, 0xb6, 0x0, 0x0, 0x39, 0xee, 0x94, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, 0xc7, 0x10, + 0x0, 0x39, 0xee, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xc7, 0x20, 0x0, 0x39, 0xee, 0x94, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, 0xc7, 0x20, + 0x0, 0x39, 0xee, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xc7, 0x20, + + /* U+006F "o" */ + 0x0, 0x0, 0x25, 0x8b, 0xde, 0xff, 0xfe, 0xdb, + 0x84, 0x10, 0x0, 0x0, 0x0, 0x49, 0xef, 0xda, + 0x63, 0x22, 0x23, 0x6a, 0xef, 0xd8, 0x30, 0x0, + 0x5, 0xaf, 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xef, 0xa4, 0x0, 0x27, 0xcf, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xc6, 0x10, + 0x5, 0xaf, 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xef, 0xa4, 0x0, 0x0, 0x49, 0xdf, 0xda, + 0x63, 0x21, 0x23, 0x6a, 0xef, 0xd8, 0x30, 0x0, + 0x0, 0x0, 0x25, 0x8b, 0xde, 0xff, 0xfe, 0xdb, + 0x84, 0x10, 0x0, 0x0, + + /* U+0070 "p" */ + 0x0, 0x39, 0xee, 0x97, 0x7b, 0xde, 0xff, 0xfe, + 0xca, 0x74, 0x10, 0x0, 0x0, 0x0, 0x3, 0x9e, + 0xff, 0xfc, 0x84, 0x21, 0x11, 0x36, 0xae, 0xfc, + 0x72, 0x0, 0x0, 0x0, 0x39, 0xef, 0xc6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x5a, 0xfd, 0x83, 0x0, + 0x0, 0x3, 0x9e, 0xe9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x8d, 0xfa, 0x50, 0x0, 0x0, 0x39, + 0xef, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x1, 0x6b, + 0xfd, 0x83, 0x0, 0x0, 0x3, 0x9e, 0xff, 0xfc, + 0x95, 0x32, 0x22, 0x48, 0xcf, 0xfc, 0x72, 0x0, + 0x0, 0x0, 0x39, 0xee, 0x96, 0x6a, 0xce, 0xff, + 0xfe, 0xca, 0x74, 0x10, 0x0, 0x0, 0x0, 0x3, + 0x9e, 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xee, 0x94, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x9e, 0xe9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x25, 0x9b, 0xde, 0xff, 0xfd, 0xc9, + 0x57, 0xbf, 0xc6, 0x10, 0x0, 0x4a, 0xef, 0xda, + 0x63, 0x22, 0x23, 0x6b, 0xef, 0xff, 0xc6, 0x10, + 0x5, 0xbf, 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xef, 0xc6, 0x10, 0x27, 0xcf, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xc6, 0x10, + 0x5, 0xbf, 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xef, 0xc6, 0x10, 0x0, 0x4a, 0xef, 0xda, + 0x63, 0x21, 0x23, 0x6a, 0xef, 0xff, 0xc6, 0x10, + 0x0, 0x0, 0x25, 0x9b, 0xde, 0xff, 0xfd, 0xb8, + 0x57, 0xbf, 0xc6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xc6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xbf, 0xc6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xc6, 0x10, + + /* U+0072 "r" */ + 0x0, 0x39, 0xee, 0x96, 0x7a, 0xde, 0xc8, 0x20, + 0x3, 0x9e, 0xff, 0xec, 0x86, 0x43, 0x10, 0x0, + 0x39, 0xef, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x3, + 0x9e, 0xf9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x39, + 0xee, 0x94, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9e, + 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x39, 0xee, + 0x94, 0x0, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x2, 0x59, 0xbd, 0xef, 0xff, 0xed, + 0xca, 0x62, 0x0, 0x0, 0x16, 0xbf, 0xd9, 0x52, + 0x11, 0x22, 0x46, 0x64, 0x10, 0x0, 0x1, 0x7c, + 0xfd, 0x95, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0x9c, 0xef, 0xff, 0xed, 0xc9, + 0x63, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x12, 0x48, 0xcf, 0xe9, 0x30, 0x0, 0x15, 0x89, + 0x64, 0x32, 0x11, 0x23, 0x7b, 0xfd, 0x83, 0x0, + 0x1, 0x48, 0xac, 0xde, 0xff, 0xfe, 0xec, 0xa7, + 0x30, 0x0, + + /* U+0074 "t" */ + 0x0, 0x0, 0x0, 0x35, 0x85, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x6b, 0xfb, 0x61, 0x0, + 0x0, 0x0, 0x0, 0x27, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xe9, 0x30, 0x0, 0x0, 0x1, 0x6b, 0xfb, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6b, + 0xfb, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6b, 0xfb, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6b, 0xfb, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4a, 0xfe, 0xa5, 0x21, 0x22, 0x10, + 0x0, 0x0, 0x0, 0x2, 0x6a, 0xde, 0xff, 0xeb, + 0x62, + + /* U+0075 "u" */ + 0x0, 0x4a, 0xfd, 0x83, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xcf, 0xb5, 0x0, 0x0, 0x4a, 0xfd, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xcf, 0xb5, 0x0, + 0x0, 0x4a, 0xfd, 0x83, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xcf, 0xb5, 0x0, 0x0, 0x4a, 0xfd, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xcf, 0xb5, 0x0, + 0x0, 0x39, 0xee, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xef, 0xb5, 0x0, 0x0, 0x5, 0xae, 0xeb, + 0x73, 0x21, 0x12, 0x59, 0xcf, 0xff, 0xb5, 0x0, + 0x0, 0x0, 0x14, 0x7b, 0xde, 0xff, 0xfe, 0xc8, + 0x68, 0xcf, 0xb5, 0x0, + + /* U+0076 "v" */ + 0x0, 0x28, 0xdf, 0xb5, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xed, 0x83, 0x0, 0x0, 0x0, 0x16, + 0xcf, 0xc6, 0x10, 0x0, 0x0, 0x0, 0x5a, 0xfc, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x15, 0xbf, 0xd7, + 0x20, 0x0, 0x1, 0x6b, 0xfb, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xae, 0xd8, 0x30, 0x2, + 0x7c, 0xfa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x9e, 0xe9, 0x43, 0x8d, 0xe9, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x8d, 0xfd, 0xde, 0xd8, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6c, 0xff, + 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0x0, 0x16, 0xcf, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x39, 0xef, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x27, + 0xdd, 0x83, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xa5, + 0x0, 0x0, 0x0, 0x49, 0xef, 0xff, 0xb6, 0x10, + 0x0, 0x0, 0x27, 0xde, 0x83, 0x0, 0x0, 0x0, + 0x0, 0x16, 0xcf, 0xa5, 0x0, 0x0, 0x49, 0xec, + 0x77, 0xae, 0xb6, 0x10, 0x0, 0x27, 0xdd, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xa5, + 0x0, 0x49, 0xec, 0x71, 0x4, 0xae, 0xc6, 0x10, + 0x28, 0xdd, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0xbe, 0xa5, 0x59, 0xeb, 0x61, 0x0, + 0x4, 0xae, 0xb6, 0x48, 0xdd, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xee, + 0xeb, 0x61, 0x0, 0x0, 0x4, 0x9e, 0xee, 0xed, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0xbf, 0xfb, 0x61, 0x0, 0x0, 0x0, + 0x4, 0x9e, 0xfd, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0078 "x" */ + 0x0, 0x1, 0x5b, 0xed, 0x94, 0x0, 0x0, 0x1, + 0x49, 0xee, 0xa4, 0x10, 0x0, 0x0, 0x1, 0x5a, + 0xee, 0x94, 0x11, 0x4a, 0xee, 0x94, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x4a, 0xee, 0xdd, 0xed, + 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8d, 0xff, 0xc6, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x6b, 0xed, 0xab, 0xde, + 0xa5, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, + 0xec, 0x72, 0x0, 0x38, 0xde, 0xb6, 0x10, 0x0, + 0x0, 0x2, 0x7c, 0xfc, 0x72, 0x0, 0x0, 0x0, + 0x38, 0xdf, 0xc6, 0x20, + + /* U+0079 "y" */ + 0x0, 0x28, 0xdf, 0xb5, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xed, 0x83, 0x0, 0x0, 0x0, 0x27, + 0xcf, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x4a, 0xec, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xc7, + 0x20, 0x0, 0x0, 0x5a, 0xfc, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xaf, 0xd7, 0x20, 0x1, + 0x6b, 0xfb, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xae, 0xd8, 0x31, 0x6c, 0xea, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x9e, 0xeb, 0xbd, 0xe9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, 0xff, + 0xe8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xaf, 0xd7, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x53, 0x22, + 0x48, 0xcf, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x14, 0x9c, 0xef, 0xfe, 0xc9, 0x52, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x27, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x7c, 0xfd, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x38, 0xcf, 0xc7, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x9d, 0xeb, 0x62, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x49, 0xee, 0xb5, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0xae, 0xea, + 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, + 0x20, 0x0, + + /* U+007B "{" */ + 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xfa, 0x50, 0x0, + 0x0, 0x4, 0x9f, 0xea, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x5b, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xbf, 0xc7, 0x10, 0x0, 0x0, 0x4, 0x9f, 0xff, + 0xc6, 0x20, 0x0, 0x0, 0x0, 0x1, 0x38, 0xcf, + 0xc6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xfc, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xfc, 0x72, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9f, 0xea, 0x51, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, 0xdf, 0xfa, + 0x50, 0x0, + + /* U+007C "|" */ + 0x0, 0x16, 0xbf, 0xa5, 0x0, 0x1, 0x6b, 0xfa, + 0x50, 0x0, 0x16, 0xbf, 0xa5, 0x0, 0x1, 0x6b, + 0xfa, 0x50, 0x0, 0x16, 0xbf, 0xa5, 0x0, 0x1, + 0x6b, 0xfa, 0x50, 0x0, 0x16, 0xbf, 0xa5, 0x0, + 0x1, 0x6b, 0xfa, 0x50, 0x0, 0x16, 0xbf, 0xa5, + 0x0, 0x1, 0x6b, 0xfa, 0x50, 0x0, 0x16, 0xbf, + 0xa5, 0x0, 0x1, 0x6b, 0xfa, 0x50, 0x0, 0x16, + 0xbf, 0xa5, 0x0, + + /* U+007D "}" */ + 0x0, 0x17, 0xcf, 0xed, 0xa5, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x27, 0xcf, 0xd7, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xee, 0x93, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x9e, 0xe9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xee, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x8e, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x8d, 0xff, 0xc7, 0x20, 0x0, 0x0, 0x3, + 0x8d, 0xfb, 0x62, 0x0, 0x0, 0x0, 0x0, 0x49, + 0xee, 0x94, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9e, + 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x49, 0xee, + 0x93, 0x0, 0x0, 0x0, 0x0, 0x27, 0xcf, 0xd8, + 0x20, 0x0, 0x0, 0x17, 0xcf, 0xed, 0xa5, 0x20, + 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x26, 0xbd, 0xee, 0xdb, 0x84, 0x20, 0x5, + 0xac, 0x83, 0x0, 0x38, 0xc9, 0x51, 0x12, 0x58, + 0xbd, 0xdd, 0xca, 0x62, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x3, 0x6a, 0xbb, 0xba, 0x73, 0x0, 0x0, + 0x38, 0xb8, 0x30, 0x0, 0x38, 0xb9, 0x40, 0x16, + 0xa9, 0x40, 0x0, 0x0, 0x39, 0xb7, 0x20, 0x38, + 0xb8, 0x30, 0x0, 0x38, 0xb9, 0x40, 0x0, 0x3, + 0x6a, 0xbb, 0xba, 0x73, 0x0, 0x0, + + /* U+2022 "•" */ + 0x0, 0x2, 0x45, 0x42, 0x0, 0x0, 0x2, 0x7c, + 0xff, 0xfe, 0x83, 0x0, 0x0, 0x49, 0xdf, 0xea, + 0x51, 0x0, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x12, 0x32, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x46, 0x79, 0xbc, 0xef, 0xff, 0xff, + 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x56, 0x89, 0xbc, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x9e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xca, 0x87, 0x54, 0x23, 0x8d, 0xff, 0xa5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xaf, + 0xff, 0xda, 0x87, 0x53, 0x21, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x8d, 0xff, 0xa5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xaf, 0xfd, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8d, + 0xff, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xaf, 0xfd, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x8d, 0xff, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xaf, 0xfd, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x24, 0x79, 0xbb, + 0xbc, 0xdf, 0xff, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x12, 0x33, 0x37, 0xbf, 0xfd, 0x82, 0x0, 0x0, + 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa5, 0x0, 0x0, 0x15, 0xad, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x82, 0x0, 0x0, 0x0, 0x2, 0x6b, + 0xef, 0xff, 0xff, 0xff, 0xd9, 0x41, 0x0, 0x0, + 0x39, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x61, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, 0x32, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x89, + 0xab, 0xaa, 0x87, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F008 "" */ + 0x0, 0x39, 0xb9, 0x54, 0x59, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x95, 0x45, 0x9b, 0x93, 0x0, 0x0, 0x5a, 0xeb, + 0x88, 0x9b, 0xef, 0xb7, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x7c, 0xfe, 0xb8, 0x88, 0xbe, + 0xa5, 0x0, 0x0, 0x5a, 0xc7, 0x10, 0x17, 0xcf, + 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6b, 0xfc, 0x61, 0x1, 0x7c, 0xa5, 0x0, 0x0, + 0x5a, 0xfd, 0xcc, 0xce, 0xff, 0xb6, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x12, 0x7c, 0xff, 0xdc, + 0xcc, 0xef, 0xa5, 0x0, 0x0, 0x5a, 0xc6, 0x10, + 0x17, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x61, 0x1, 0x6c, 0xa5, + 0x0, 0x0, 0x5a, 0xfd, 0xcc, 0xce, 0xff, 0xb6, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x7c, + 0xff, 0xdc, 0xcc, 0xef, 0xa5, 0x0, 0x0, 0x5a, + 0xc7, 0x10, 0x17, 0xcf, 0xb5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x6b, 0xfc, 0x61, 0x1, + 0x7c, 0xa5, 0x0, 0x0, 0x5a, 0xeb, 0x88, 0x9b, + 0xef, 0xb7, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x23, 0x7c, 0xfe, 0xb8, 0x88, 0xbe, 0xa5, 0x0, + 0x0, 0x49, 0xb9, 0x54, 0x59, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x95, 0x45, 0x9b, 0x93, 0x0, + + /* U+F00B "" */ + 0x0, 0x38, 0xdf, 0xff, 0xff, 0xfe, 0xb6, 0x25, + 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x83, 0x0, 0x0, 0x5a, 0xff, + 0xff, 0xff, 0xff, 0xd8, 0x46, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa5, 0x0, 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, + 0xc6, 0x25, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x94, 0x0, 0x0, + 0x0, 0x12, 0x33, 0x33, 0x22, 0x10, 0x0, 0x1, + 0x23, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x21, 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, + 0xff, 0xff, 0xc7, 0x26, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, + 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xd8, + 0x46, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, 0x4a, + 0xff, 0xff, 0xff, 0xff, 0xc7, 0x26, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa4, 0x0, 0x0, 0x0, 0x12, 0x33, 0x33, + 0x22, 0x10, 0x0, 0x1, 0x23, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x0, 0x0, + 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xc6, 0x25, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x94, 0x0, 0x0, 0x5a, 0xff, + 0xff, 0xff, 0xff, 0xd8, 0x46, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa5, 0x0, 0x0, 0x38, 0xdf, 0xff, 0xff, 0xfe, + 0xb6, 0x25, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x83, 0x0, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x7c, 0xdc, 0x94, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x38, 0xcf, 0xff, 0xff, 0xfe, + 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, + 0xff, 0xff, 0xff, 0xfd, 0x84, 0x10, 0x0, 0x0, + 0x1, 0x49, 0xcd, 0xc7, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x38, 0xcf, 0xff, 0xff, 0xff, 0xd8, + 0x41, 0x0, 0x0, 0x0, 0x0, 0x39, 0xef, 0xff, + 0xff, 0xfc, 0x83, 0x0, 0x0, 0x3, 0x8c, 0xff, + 0xff, 0xff, 0xfd, 0x84, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x48, 0xdf, 0xff, 0xff, 0xff, + 0xc8, 0x68, 0xcf, 0xff, 0xff, 0xff, 0xd8, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x14, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x84, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x48, 0xcf, 0xff, 0xff, 0xff, 0xc8, 0x41, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x8c, + 0xdc, 0x83, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "ï€" */ + 0x0, 0x0, 0x13, 0x44, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x24, 0x42, 0x10, 0x0, 0x0, + 0x27, 0xdf, 0xff, 0xfc, 0x73, 0x0, 0x0, 0x0, + 0x14, 0x8d, 0xff, 0xff, 0xb6, 0x10, 0x0, 0x14, + 0x9d, 0xff, 0xff, 0xff, 0xc7, 0x32, 0x48, 0xdf, + 0xff, 0xff, 0xfd, 0x83, 0x0, 0x0, 0x0, 0x1, + 0x5a, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd9, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x8d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x73, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x48, 0xdf, 0xff, 0xff, + 0xfd, 0x98, 0xad, 0xff, 0xff, 0xff, 0xc7, 0x30, + 0x0, 0x0, 0x39, 0xef, 0xff, 0xff, 0xd9, 0x41, + 0x0, 0x1, 0x5a, 0xdf, 0xff, 0xff, 0xd7, 0x20, + 0x0, 0x2, 0x59, 0xbb, 0x84, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x15, 0x9b, 0xb9, 0x51, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x47, 0x99, 0x74, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x36, 0x52, 0x0, 0x4, 0x9f, 0xff, + 0xf9, 0x40, 0x0, 0x25, 0x64, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x9d, 0xff, + 0xfc, 0x71, 0x4, 0x9f, 0xff, 0xf9, 0x40, 0x17, + 0xcf, 0xff, 0xea, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x15, 0xaf, 0xff, 0xfd, 0x94, 0x10, 0x4, + 0x9f, 0xff, 0xf9, 0x40, 0x1, 0x59, 0xdf, 0xff, + 0xfb, 0x51, 0x0, 0x0, 0x0, 0x2, 0x7d, 0xff, + 0xfd, 0x83, 0x0, 0x0, 0x4, 0x9f, 0xff, 0xf9, + 0x40, 0x0, 0x0, 0x38, 0xdf, 0xff, 0xc7, 0x20, + 0x0, 0x0, 0x16, 0xbf, 0xff, 0xd8, 0x20, 0x0, + 0x0, 0x4, 0x9f, 0xff, 0xf9, 0x40, 0x0, 0x0, + 0x2, 0x8d, 0xff, 0xfb, 0x60, 0x0, 0x0, 0x17, + 0xcf, 0xff, 0xc6, 0x10, 0x0, 0x0, 0x3, 0x9e, + 0xff, 0xe9, 0x30, 0x0, 0x0, 0x1, 0x6c, 0xff, + 0xfc, 0x71, 0x0, 0x0, 0x5, 0xaf, 0xff, 0xe9, + 0x40, 0x0, 0x0, 0x0, 0x1, 0x11, 0x10, 0x0, + 0x0, 0x0, 0x4, 0x9e, 0xff, 0xfa, 0x50, 0x0, + 0x0, 0x1, 0x5a, 0xff, 0xff, 0xb6, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6b, + 0xff, 0xff, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x3, + 0x8d, 0xff, 0xff, 0xda, 0x63, 0x10, 0x0, 0x0, + 0x0, 0x1, 0x36, 0xad, 0xff, 0xff, 0xd8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x5a, 0xdf, + 0xff, 0xff, 0xfe, 0xdc, 0xcc, 0xcd, 0xef, 0xff, + 0xff, 0xfd, 0xa5, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x68, 0xad, 0xef, + 0xff, 0xff, 0xff, 0xfe, 0xdb, 0x96, 0x31, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x23, + 0x44, 0x44, 0x32, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xdf, 0xff, 0xff, 0xfd, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, 0x64, + 0x11, 0x36, 0xad, 0xff, 0xff, 0xff, 0xff, 0xda, + 0x63, 0x11, 0x46, 0x53, 0x0, 0x0, 0x0, 0x49, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x94, 0x0, + 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xba, 0xab, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x61, 0x1, 0x37, 0xbe, 0xff, 0xff, 0xff, + 0xc7, 0x20, 0x0, 0x0, 0x2, 0x7c, 0xff, 0xff, + 0xff, 0xeb, 0x73, 0x10, 0x0, 0x2, 0x7c, 0xff, + 0xff, 0xfd, 0x82, 0x0, 0x0, 0x0, 0x0, 0x28, + 0xdf, 0xff, 0xff, 0xd7, 0x20, 0x0, 0x1, 0x37, + 0xbe, 0xff, 0xff, 0xff, 0xc7, 0x20, 0x0, 0x0, + 0x2, 0x7c, 0xff, 0xff, 0xff, 0xeb, 0x73, 0x10, + 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xba, 0xab, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x61, 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x94, 0x0, 0x0, 0x0, 0x35, 0x64, + 0x11, 0x25, 0x9c, 0xff, 0xff, 0xff, 0xff, 0xc9, + 0x52, 0x11, 0x36, 0x53, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xdf, 0xff, 0xff, + 0xfd, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, + 0x44, 0x44, 0x32, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x25, 0x77, 0x63, 0x10, 0x0, 0x3, + 0x68, 0x88, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x59, + 0xdf, 0xff, 0xff, 0xfe, 0xb6, 0x32, 0x7c, 0xff, + 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x13, 0x7c, 0xef, 0xfe, 0xc8, + 0x54, 0x6a, 0xdf, 0xff, 0xee, 0xef, 0xff, 0xc7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0xad, 0xff, 0xfd, 0xa5, 0x34, 0x8b, 0xc9, + 0x53, 0x47, 0xbe, 0xff, 0xff, 0xfc, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x59, 0xcf, 0xff, + 0xeb, 0x74, 0x36, 0xad, 0xff, 0xff, 0xff, 0xec, + 0x84, 0x35, 0x9d, 0xff, 0xfe, 0xb6, 0x30, 0x0, + 0x0, 0x2, 0x6b, 0xef, 0xff, 0xc9, 0x53, 0x59, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xb7, 0x33, 0x6b, 0xef, 0xff, 0xd8, 0x40, 0x0, + 0x3, 0x7a, 0x96, 0x33, 0x6b, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd9, 0x42, 0x48, 0xa9, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xcf, 0xff, 0xff, 0xff, 0xfa, 0x50, 0x0, + 0x2, 0x7d, 0xff, 0xff, 0xff, 0xfe, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6c, + 0xff, 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x27, + 0xcf, 0xff, 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xae, 0xff, + 0xff, 0xff, 0xd8, 0x30, 0x0, 0x1, 0x6b, 0xff, + 0xff, 0xff, 0xfd, 0x83, 0x0, 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x24, 0x67, 0x77, 0x76, 0x42, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x7d, 0xff, 0xff, + 0xff, 0xd7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x8d, 0xff, 0xff, 0xff, 0xd8, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8d, + 0xff, 0xff, 0xff, 0xd8, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x8d, 0xff, 0xff, 0xff, + 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x49, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x94, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x14, 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd9, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x23, 0x33, 0x33, 0x33, 0x33, 0x22, + 0x59, 0xdf, 0xff, 0xfd, 0x95, 0x22, 0x33, 0x33, + 0x33, 0x33, 0x32, 0x10, 0x0, 0x0, 0x4a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x34, 0x77, + 0x43, 0x5a, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa4, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xec, 0xaa, 0xce, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, + 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe9, 0x56, 0xbc, 0x75, + 0x8d, 0xff, 0xa5, 0x0, 0x0, 0x25, 0x9a, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, 0x52, + 0x0, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x49, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x15, 0xae, 0xff, 0xda, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x9b, 0xef, + 0xfc, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x5a, 0xef, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0xae, 0xff, + 0xd7, 0x30, 0x0, 0x0, 0x0, 0x15, 0xae, 0xff, + 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x4a, 0xef, 0xfc, + 0x82, 0x0, 0x0, 0x38, 0xef, 0xff, 0xda, 0x88, + 0x88, 0x88, 0x63, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x25, 0x78, 0x88, 0x88, 0x9b, 0xef, 0xff, 0xb6, + 0x10, 0x5, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd8, 0x30, 0x0, 0x0, 0x1, 0x5b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, + 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd8, 0x20, 0x5, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x72, 0x0, 0x26, 0xbe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x84, 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x58, 0x99, 0x62, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0x69, 0xbd, 0xef, 0xff, 0xff, + 0xff, 0xfd, 0xb9, 0x74, 0x20, 0x4, 0x9f, 0xff, + 0xa5, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, 0xef, + 0xff, 0xff, 0xdc, 0xaa, 0x99, 0x9a, 0xcd, 0xff, + 0xff, 0xfd, 0xaa, 0xbf, 0xff, 0xa5, 0x0, 0x0, + 0x0, 0x4, 0x9e, 0xff, 0xfe, 0xa6, 0x31, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x59, 0xcf, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x2, 0x7c, 0xff, + 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, + 0xef, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xa5, + 0x0, 0x0, 0x3, 0x6a, 0xa9, 0x73, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x25, 0x9a, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xa9, 0x63, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x36, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xa9, 0x52, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0xaa, 0xa6, 0x30, 0x0, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xfe, 0xee, 0xff, + 0xfe, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xcf, 0xff, 0xc7, 0x20, 0x0, 0x0, 0x5a, 0xff, + 0xff, 0xff, 0xfc, 0x95, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0x7b, 0xef, 0xff, 0xe9, 0x40, + 0x0, 0x0, 0x0, 0x5a, 0xff, 0xfb, 0xaa, 0xdf, + 0xff, 0xff, 0xdb, 0xa9, 0x99, 0xaa, 0xcd, 0xff, + 0xff, 0xfe, 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xff, 0xfa, 0x40, 0x2, 0x47, 0x9c, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xdb, 0x96, 0x31, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0x99, 0x85, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0xaa, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x6b, 0xef, 0xff, 0xa5, 0x0, + 0x0, 0x14, 0x78, 0x88, 0x88, 0x89, 0xce, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, + 0x0, 0x38, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x37, 0xcf, 0xff, 0xff, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x7c, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x10, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0xaa, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0xbe, 0xff, 0xfa, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x14, 0x78, 0x88, 0x88, 0x89, 0xce, + 0xff, 0xff, 0xff, 0xa5, 0x0, 0x13, 0x31, 0x0, + 0x0, 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x50, 0x16, 0xbe, 0xea, + 0x51, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x3, 0x8d, + 0xfa, 0x40, 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x50, 0x15, 0xae, + 0xea, 0x51, 0x0, 0x0, 0x38, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x24, + 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x8c, 0xff, 0xff, 0xfa, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x8c, 0xff, 0xa4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6b, 0xfd, + 0xa5, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xaa, 0x72, + 0x0, 0x0, 0x0, 0x12, 0x11, 0x14, 0x8c, 0xfe, + 0x94, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0xbe, 0xff, 0xfa, 0x50, 0x0, + 0x0, 0x27, 0xcf, 0xda, 0x52, 0x16, 0xbe, 0xe9, + 0x40, 0x0, 0x0, 0x14, 0x78, 0x88, 0x88, 0x89, + 0xce, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x23, 0x32, + 0x1, 0x4a, 0xdf, 0xb6, 0x13, 0x8d, 0xfa, 0x50, + 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x50, 0x15, 0xbe, 0xea, 0x51, + 0x16, 0xbf, 0xc6, 0x13, 0x9e, 0xe9, 0x30, 0x0, + 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa5, 0x0, 0x3, 0x8d, 0xfa, 0x40, 0x39, + 0xee, 0x83, 0x17, 0xcf, 0xa5, 0x0, 0x5, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x50, 0x15, 0xbe, 0xea, 0x51, 0x16, 0xcf, 0xc6, + 0x13, 0x8e, 0xe9, 0x30, 0x0, 0x38, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, + 0x23, 0x31, 0x1, 0x5a, 0xef, 0xb6, 0x13, 0x8d, + 0xfa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x7c, 0xff, 0xff, 0xfa, 0x50, 0x0, 0x0, + 0x27, 0xcf, 0xda, 0x52, 0x16, 0xbf, 0xe9, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x7c, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x12, + 0x11, 0x15, 0x9d, 0xfe, 0x94, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6b, + 0xfd, 0xa5, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x0, 0x26, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xeb, 0x62, 0x0, 0x0, 0x5a, 0xff, + 0xfd, 0xa7, 0x56, 0x7b, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xb5, 0x0, 0x0, + 0x1, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, + 0x5a, 0xff, 0xeb, 0x63, 0x12, 0x38, 0xcf, 0xff, + 0xff, 0xff, 0xfe, 0xa6, 0x20, 0x13, 0x8c, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xfe, 0xcc, 0xdf, 0xff, 0xff, 0xea, 0x62, + 0x0, 0x0, 0x0, 0x1, 0x38, 0xdf, 0xff, 0xa5, + 0x0, 0x0, 0x5a, 0xff, 0xff, 0xea, 0x62, 0x0, + 0x15, 0x9b, 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x8d, 0xff, 0xa5, 0x0, 0x0, 0x5a, + 0xff, 0xe9, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8d, + 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xec, 0x98, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x89, 0xce, 0xff, 0xa5, 0x0, + 0x0, 0x26, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xeb, 0x62, 0x0, + + /* U+F043 "ïƒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x56, + 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6c, 0xff, 0xfb, + 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x38, 0xdf, 0xff, 0xff, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xae, 0xff, 0xff, 0xff, 0xfe, 0x93, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, + 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x83, + 0x0, 0x0, 0x0, 0x3, 0x8d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x72, + 0x0, 0x0, 0x38, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x20, + 0x0, 0x4a, 0xff, 0xe9, 0x56, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x30, 0x0, + 0x27, 0xdf, 0xfc, 0x73, 0x5a, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb6, 0x10, 0x0, 0x1, + 0x6b, 0xff, 0xfd, 0xa6, 0x43, 0x47, 0xbe, 0xff, + 0xff, 0xff, 0xea, 0x40, 0x0, 0x0, 0x0, 0x1, + 0x48, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x24, 0x56, 0x77, 0x76, 0x54, 0x20, 0x0, + 0x0, 0x0, 0x0, + + /* U+F048 "ïˆ" */ + 0x25, 0x78, 0x86, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x67, 0x52, 0x0, 0x4, 0x9f, 0xff, + 0xc6, 0x10, 0x0, 0x0, 0x0, 0x15, 0x9d, 0xff, + 0xfe, 0x83, 0x0, 0x49, 0xff, 0xfc, 0x61, 0x0, + 0x0, 0x26, 0xae, 0xff, 0xff, 0xff, 0xe9, 0x30, + 0x4, 0x9f, 0xff, 0xc6, 0x10, 0x37, 0xbe, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x93, 0x0, 0x49, 0xff, + 0xfd, 0xa9, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe9, 0x30, 0x4, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x93, + 0x0, 0x49, 0xff, 0xfe, 0xee, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe9, 0x30, 0x4, 0x9f, + 0xff, 0xc6, 0x24, 0x9d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x93, 0x0, 0x49, 0xff, 0xfc, 0x61, + 0x0, 0x3, 0x7c, 0xef, 0xff, 0xff, 0xff, 0xe9, + 0x30, 0x4, 0x9f, 0xff, 0xc6, 0x10, 0x0, 0x0, + 0x2, 0x6b, 0xef, 0xff, 0xfe, 0x93, 0x0, 0x38, + 0xdf, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x59, 0xde, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F04B "ï‹" */ + 0x0, 0x1, 0x46, 0x76, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x49, 0xff, 0xff, 0xff, 0xda, + 0x74, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xa7, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdb, 0x74, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb8, 0x52, 0x0, + 0x0, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xeb, 0x84, 0x10, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x61, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x73, 0x10, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb8, 0x42, 0x0, + 0x0, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdb, 0x74, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xa7, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, + 0xff, 0xff, 0xff, 0xda, 0x74, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x36, 0x76, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F04C "ïŒ" */ + 0x0, 0x15, 0xad, 0xef, 0xff, 0xff, 0xfe, 0xc8, + 0x30, 0x0, 0x15, 0xad, 0xef, 0xff, 0xff, 0xfe, + 0xc8, 0x30, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x72, 0x0, 0x5a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x72, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, 0x5a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, + 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x82, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x82, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x82, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x82, 0x0, 0x5a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x82, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, 0x5a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, + 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x82, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x82, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x82, 0x0, 0x4a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x72, 0x0, 0x4a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x72, 0x0, 0x2, 0x47, 0x88, + 0x99, 0x99, 0x88, 0x63, 0x10, 0x0, 0x2, 0x47, + 0x88, 0x99, 0x99, 0x88, 0x63, 0x10, + + /* U+F04D "ï" */ + 0x0, 0x2, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x63, 0x10, 0x0, 0x4a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x72, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x82, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x82, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x82, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x82, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x82, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x72, 0x0, 0x15, 0xad, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xc8, 0x30, + + /* U+F051 "ï‘" */ + 0x2, 0x57, 0x64, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x25, 0x88, 0x85, 0x20, 0x2, 0x7d, 0xff, + 0xfd, 0xa5, 0x20, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xa5, 0x0, 0x28, 0xdf, 0xff, 0xff, 0xfe, + 0xb7, 0x30, 0x0, 0x0, 0x5b, 0xff, 0xfa, 0x50, + 0x2, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, + 0x31, 0x5, 0xbf, 0xff, 0xa5, 0x0, 0x28, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0xac, + 0xff, 0xfa, 0x50, 0x2, 0x8d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, + 0x0, 0x28, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xee, 0xff, 0xfa, 0x50, 0x2, 0x8d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x94, 0x25, + 0xbf, 0xff, 0xa5, 0x0, 0x28, 0xdf, 0xff, 0xff, + 0xff, 0xfc, 0x84, 0x10, 0x0, 0x5b, 0xff, 0xfa, + 0x50, 0x2, 0x8d, 0xff, 0xff, 0xeb, 0x73, 0x0, + 0x0, 0x0, 0x5, 0xbf, 0xff, 0xa5, 0x0, 0x15, + 0xae, 0xda, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xef, 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x36, 0x77, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x38, 0xcf, 0xff, 0xff, 0xea, 0x51, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x26, 0xbe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd9, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0xae, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xb7, 0x20, 0x0, + 0x0, 0x0, 0x2, 0x6c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x94, 0x0, 0x0, 0x0, 0x27, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x50, 0x0, + 0x0, 0x0, 0x1, 0x23, 0x34, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, + 0x31, 0x0, 0x0, 0x0, 0x0, 0x38, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x51, 0x0, 0x0, + 0x5, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x20, 0x0, 0x0, 0x27, 0xce, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xea, 0x51, 0x0, 0x0, + + /* U+F053 "ï“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x34, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x25, 0xae, 0xff, 0xfb, 0x61, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x5a, 0xef, 0xff, + 0xfd, 0x94, 0x10, 0x0, 0x0, 0x0, 0x0, 0x25, + 0xae, 0xff, 0xff, 0xd9, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x5a, 0xef, 0xff, 0xfd, 0x94, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, 0xff, 0xff, + 0xeb, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0xbe, 0xff, 0xff, 0xc8, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, + 0xef, 0xff, 0xfc, 0x83, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0xce, 0xff, 0xff, + 0xc8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x7c, 0xef, 0xff, 0xfa, 0x51, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, + 0xab, 0x95, 0x10, 0x0, + + /* U+F054 "ï”" */ + 0x0, 0x2, 0x34, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8e, 0xff, 0xfc, + 0x83, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0xbe, 0xff, 0xff, 0xc8, 0x31, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, + 0xef, 0xff, 0xfc, 0x83, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xff, + 0xc8, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x8d, 0xff, 0xff, 0xfb, 0x61, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x5a, 0xef, 0xff, + 0xfd, 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x25, + 0xae, 0xff, 0xff, 0xd9, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x5a, 0xef, 0xff, 0xfd, 0x95, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, 0xff, 0xff, + 0xd9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x37, 0xab, 0x85, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x69, 0xa9, 0x84, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x38, 0xdf, 0xff, 0xfb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x38, 0xef, 0xff, 0xfb, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xef, 0xff, + 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x9c, + 0xff, 0xff, 0xfd, 0xb8, 0x88, 0x88, 0x88, 0x88, + 0x74, 0x10, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x72, 0x0, 0x15, 0x9b, 0xbb, + 0xbb, 0xbb, 0xbb, 0xce, 0xff, 0xff, 0xfe, 0xdb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xa7, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xef, 0xff, + 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, + 0xef, 0xff, 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x38, 0xef, 0xff, 0xfb, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0x9c, 0xdd, 0xb7, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "ï¨" */ + 0x0, 0x2, 0x45, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x53, 0x10, 0x0, 0x4a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x72, 0x0, 0x26, 0xac, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xc8, 0x40, + + /* U+F06E "ï®" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x58, + 0xab, 0xcd, 0xef, 0xff, 0xff, 0xed, 0xca, 0x97, + 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x49, 0xcf, 0xff, 0xfe, 0xc9, + 0x64, 0x32, 0x23, 0x45, 0x7a, 0xdf, 0xff, 0xfe, + 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x6b, 0xef, 0xff, 0xff, 0xc6, 0x20, 0x0, 0x3, + 0x79, 0x87, 0x52, 0x0, 0x49, 0xdf, 0xff, 0xff, + 0xd9, 0x41, 0x0, 0x0, 0x0, 0x27, 0xcf, 0xff, + 0xff, 0xfe, 0x93, 0x0, 0x0, 0x2, 0x7c, 0xff, + 0xff, 0xea, 0x51, 0x16, 0xbf, 0xff, 0xff, 0xfe, + 0xa5, 0x10, 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, + 0xc6, 0x12, 0x7c, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x40, 0x49, 0xef, 0xff, 0xff, 0xff, 0xc7, + 0x10, 0x0, 0x38, 0xdf, 0xff, 0xff, 0xfe, 0x93, + 0x3, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x61, + 0x16, 0xbf, 0xff, 0xff, 0xfe, 0xa4, 0x10, 0x0, + 0x0, 0x2, 0x6b, 0xef, 0xff, 0xff, 0xc6, 0x20, + 0x26, 0x9b, 0xcc, 0xca, 0x84, 0x11, 0x49, 0xdf, + 0xff, 0xff, 0xd8, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x59, 0xcf, 0xff, 0xfe, 0xc9, 0x64, + 0x32, 0x23, 0x45, 0x7a, 0xdf, 0xff, 0xfe, 0xb7, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0x57, 0x9b, 0xcd, 0xef, 0xff, + 0xff, 0xed, 0xca, 0x97, 0x42, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F070 "ï°" */ + 0x0, 0x1, 0x35, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x8d, 0xff, 0xfd, 0x95, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x8c, 0xef, + 0xff, 0xc8, 0x53, 0x46, 0x8a, 0xbd, 0xee, 0xff, + 0xff, 0xed, 0xcb, 0x97, 0x53, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x59, 0xcf, 0xff, 0xff, 0xff, 0xda, 0x75, + 0x43, 0x23, 0x45, 0x79, 0xdf, 0xff, 0xfe, 0xc8, + 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x25, 0x9d, 0xff, 0xfe, + 0xb7, 0x44, 0x7a, 0xa9, 0x74, 0x10, 0x28, 0xcf, + 0xff, 0xff, 0xea, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xbd, 0xc8, 0x41, 0x0, 0x2, + 0x6a, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x72, + 0x4, 0xaf, 0xff, 0xff, 0xff, 0xb6, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x27, 0xdf, 0xff, 0xff, 0xeb, + 0x73, 0x0, 0x0, 0x26, 0xad, 0xff, 0xff, 0xff, + 0xfb, 0x60, 0x27, 0xdf, 0xff, 0xff, 0xff, 0xe8, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x15, 0xbe, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x0, 0x3, 0x7b, + 0xef, 0xff, 0xeb, 0x67, 0xaf, 0xff, 0xff, 0xff, + 0xb6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x49, 0xdf, 0xff, 0xff, 0xc8, 0x30, 0x0, 0x0, + 0x0, 0x1, 0x37, 0xbe, 0xff, 0xff, 0xff, 0xff, + 0xea, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x37, 0xbe, 0xff, 0xff, 0xc9, + 0x64, 0x32, 0x22, 0x10, 0x0, 0x14, 0x8b, 0xef, + 0xff, 0xea, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x57, + 0x9b, 0xcd, 0xef, 0xff, 0xfe, 0xb7, 0x30, 0x0, + 0x1, 0x48, 0xce, 0xff, 0xfc, 0x94, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x14, 0x8c, 0xff, 0xfe, + 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x45, 0x41, 0x0, 0x0, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x33, 0x21, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x5a, 0xef, 0xff, 0xd8, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xae, 0xff, + 0xff, 0xff, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x38, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb5, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x7c, 0xff, 0xff, 0xee, 0xdd, 0xde, 0xff, + 0xff, 0xea, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, + 0xff, 0xff, 0xd7, 0x20, 0x0, 0x5a, 0xff, 0xff, + 0xfd, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x4a, 0xef, 0xff, 0xff, + 0xfd, 0x72, 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, + 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x9d, 0xff, 0xff, 0xff, 0xff, 0xd7, + 0x20, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x87, + 0x8b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa4, + 0x10, 0x0, 0x0, 0x0, 0x1, 0x6b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc7, 0x20, 0x0, 0x4a, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x30, + 0x0, 0x0, 0x15, 0xae, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x95, 0x21, 0x37, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x72, 0x0, + 0x4, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x61, 0x0, 0x1, + 0x46, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x75, 0x20, 0x0, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x46, + 0x63, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xaf, 0xff, 0xc8, 0x31, + 0x0, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xc8, 0x30, 0x0, 0x0, 0x0, 0x26, 0xbe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x72, 0x0, 0x0, + 0x48, 0xcd, 0xdd, 0xde, 0xff, 0xff, 0xeb, 0x62, + 0x2, 0x6b, 0xef, 0xff, 0xfe, 0xde, 0xff, 0xff, + 0xff, 0xd9, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x26, 0xac, 0xa6, 0x46, 0xbe, 0xff, 0xff, + 0xd9, 0x41, 0x5, 0xaf, 0xfd, 0x95, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x6b, 0xef, 0xff, 0xfd, 0x94, 0x10, 0x0, 0x1, + 0x47, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x26, 0xbe, 0xff, 0xff, 0xd8, + 0x55, 0x8b, 0xc8, 0x41, 0x5, 0xaf, 0xfd, 0xa5, + 0x10, 0x0, 0x0, 0x0, 0x48, 0xcd, 0xdd, 0xde, + 0xff, 0xff, 0xfc, 0x84, 0x10, 0x49, 0xdf, 0xff, + 0xfe, 0xde, 0xff, 0xff, 0xff, 0xd9, 0x41, 0x0, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x41, + 0x0, 0x0, 0x0, 0x15, 0xae, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x62, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xaf, 0xff, 0xc8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x46, 0x63, 0x10, 0x0, 0x0, 0x0, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x25, 0x77, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x6b, 0xef, 0xff, 0xfd, 0x94, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x26, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd9, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x6b, 0xef, 0xff, 0xfd, 0x94, 0x12, + 0x6b, 0xef, 0xff, 0xfd, 0x94, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x26, 0xbe, 0xff, 0xff, 0xd9, 0x41, + 0x0, 0x0, 0x0, 0x26, 0xbe, 0xff, 0xff, 0xd9, + 0x41, 0x0, 0x0, 0x16, 0xbf, 0xff, 0xfd, 0x94, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x6b, + 0xef, 0xff, 0xe9, 0x40, 0x0, 0x0, 0x25, 0x77, + 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x25, 0x77, 0x41, 0x0, + + /* U+F078 "ï¸" */ + 0x0, 0x0, 0x25, 0x77, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x77, + 0x41, 0x0, 0x0, 0x16, 0xbf, 0xff, 0xfd, 0x94, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x6b, + 0xef, 0xff, 0xe9, 0x40, 0x0, 0x0, 0x26, 0xbe, + 0xff, 0xff, 0xd9, 0x41, 0x0, 0x0, 0x0, 0x26, + 0xbe, 0xff, 0xff, 0xd9, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x6b, 0xef, 0xff, 0xfd, 0x94, 0x12, + 0x6b, 0xef, 0xff, 0xfd, 0x94, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xbe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd9, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x6b, 0xef, 0xff, 0xfd, 0x94, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x25, 0x76, 0x41, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x38, 0xcf, 0xff, + 0xc8, 0x30, 0x0, 0x3, 0x57, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x76, 0x52, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x38, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xc8, 0x32, 0x5a, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x93, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xcc, 0xcf, 0xfe, 0xcc, 0xdf, 0xff, 0xa4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xef, + 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x45, 0x31, 0x49, 0xef, 0xe9, 0x41, 0x35, 0x42, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x9e, 0xfe, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x9e, 0xfe, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xef, 0xe9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xef, 0xe9, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x7b, 0xb9, 0x55, 0x9e, 0xfe, 0x95, 0x59, 0xbb, + 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9e, + 0xff, 0xc9, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, + 0x53, 0x36, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xb6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x38, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd7, 0x20, 0x37, 0xbe, 0xff, 0xff, + 0xfe, 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0xac, 0xa6, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "ï»" */ + 0x0, 0x26, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, + 0x98, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x64, + 0x10, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, + 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, + 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, + 0x0, 0x26, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xeb, 0x62, 0x0, + + /* U+F093 "ï‚“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x44, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xce, 0xff, + 0xec, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x7c, 0xef, 0xff, 0xff, 0xff, 0xfe, 0xc7, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0xce, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0x73, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x39, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x93, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x8d, 0xff, 0xff, 0xff, 0xd8, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8d, 0xff, + 0xff, 0xff, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x8d, 0xff, 0xff, 0xff, 0xd8, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x23, 0x33, 0x33, 0x33, 0x32, 0x13, + 0x8d, 0xff, 0xff, 0xff, 0xd8, 0x31, 0x23, 0x33, + 0x33, 0x33, 0x32, 0x10, 0x0, 0x0, 0x4a, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x94, 0x36, 0x99, 0x99, + 0x99, 0x63, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xa4, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xca, 0x99, 0x99, 0x99, 0xac, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, + 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe9, 0x56, 0xbc, 0x75, + 0x8d, 0xff, 0xa5, 0x0, 0x0, 0x25, 0x9a, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, 0x52, + 0x0, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, 0x76, + 0x53, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x27, 0xcf, 0xff, 0xff, 0xff, 0xfe, + 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9e, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x93, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x5a, 0xdf, 0xff, 0xff, 0xff, 0xe9, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, + 0xef, 0xff, 0xfe, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x27, 0xcf, 0xff, 0xff, 0xd7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x0, 0x0, 0x0, 0x0, 0x1, 0x49, + 0xdf, 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0x58, 0xac, 0xef, 0xfe, 0xb5, + 0x10, 0x1, 0x36, 0xad, 0xff, 0xff, 0xff, 0xc7, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xce, 0xff, + 0xff, 0xff, 0xfc, 0x94, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xa6, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xb9, 0x63, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x77, + 0x76, 0x65, 0x43, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x2, 0x57, 0x89, 0x98, 0x63, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x23, 0x32, + 0x10, 0x0, 0x0, 0x15, 0xae, 0xff, 0xff, 0xff, + 0xff, 0xd7, 0x20, 0x0, 0x0, 0x1, 0x48, 0xcf, + 0xff, 0xff, 0xea, 0x50, 0x0, 0x49, 0xff, 0xe9, + 0x40, 0x17, 0xcf, 0xfc, 0x71, 0x0, 0x14, 0x8c, + 0xff, 0xff, 0xff, 0xd9, 0x51, 0x0, 0x0, 0x17, + 0xcf, 0xff, 0xdb, 0xce, 0xff, 0xfd, 0x84, 0x48, + 0xcf, 0xff, 0xff, 0xfd, 0x95, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x14, 0x8a, 0xcd, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd9, 0x51, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x9e, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x57, + 0x89, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xb6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, + 0xae, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa7, 0x8b, + 0xef, 0xff, 0xff, 0xeb, 0x62, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xff, 0xe9, 0x40, 0x17, 0xcf, 0xfc, + 0x71, 0x0, 0x27, 0xbe, 0xff, 0xff, 0xfe, 0xb6, + 0x20, 0x0, 0x0, 0x17, 0xcf, 0xff, 0xdb, 0xce, + 0xff, 0xe9, 0x40, 0x0, 0x0, 0x2, 0x6b, 0xef, + 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, 0x14, 0x8a, + 0xcc, 0xcb, 0x96, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x56, 0x66, 0x41, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x31, 0x12, 0x21, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x49, + 0xed, 0x94, 0x10, 0x0, 0x0, 0x1, 0x23, 0x44, + 0x32, 0x15, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa5, 0x49, 0xef, 0xfe, 0xc7, 0x20, 0x0, 0x4a, + 0xff, 0xff, 0xe9, 0x45, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xec, 0x98, 0x88, 0x88, 0x85, 0x20, + 0x0, 0x5a, 0xff, 0xff, 0xe9, 0x45, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x50, 0x0, 0x5a, 0xff, 0xff, 0xe9, 0x45, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x50, 0x0, 0x5a, 0xff, 0xff, + 0xe9, 0x45, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x50, 0x0, 0x5a, + 0xff, 0xff, 0xe9, 0x45, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x50, + 0x0, 0x5a, 0xff, 0xff, 0xe9, 0x45, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x50, 0x0, 0x5a, 0xff, 0xff, 0xe9, 0x45, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x40, 0x0, 0x5a, 0xff, 0xff, + 0xfd, 0x95, 0x33, 0x34, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x43, 0x21, 0x0, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x14, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x76, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x2, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x52, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xb6, 0x20, 0x0, 0x0, 0x0, 0x5a, 0xff, 0xd8, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6b, 0xff, 0xff, 0xeb, 0x62, 0x0, 0x0, 0x5a, + 0xff, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6b, 0xff, 0xff, 0xff, 0xe9, 0x30, + 0x0, 0x5a, 0xff, 0xeb, 0x97, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0xad, 0xff, 0xff, 0xff, + 0xf9, 0x40, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x40, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd9, 0x42, 0x12, 0x5a, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x40, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x72, 0x0, 0x0, + 0x3, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x40, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x94, + 0x0, 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x40, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xca, 0x9a, 0xce, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x40, 0x0, 0x16, 0xad, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xed, 0x95, 0x10, + + /* U+F0C9 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x72, 0x0, 0x26, 0x9a, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xa7, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x25, 0x88, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x86, 0x31, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x72, 0x0, 0x0, 0x11, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x11, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x26, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa7, 0x41, 0x0, 0x4a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0E0 "" */ + 0x0, 0x26, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xeb, 0x62, 0x0, 0x0, 0x49, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa4, 0x0, 0x0, 0x1, 0x47, 0xbe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xeb, 0x74, 0x10, 0x0, 0x0, + 0x59, 0xc9, 0x53, 0x47, 0xbe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x74, + 0x35, 0x9c, 0x95, 0x0, 0x0, 0x5a, 0xff, 0xff, + 0xd9, 0x53, 0x47, 0xbe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xeb, 0x74, 0x35, 0x9c, 0xff, 0xff, 0xa5, + 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xd9, + 0x63, 0x36, 0xad, 0xee, 0xda, 0x63, 0x36, 0x9d, + 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x75, + 0x44, 0x57, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, + 0x0, 0x26, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xeb, 0x62, 0x0, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x15, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, + 0xa8, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb6, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xb6, 0x10, 0x3, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, + 0x10, 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xcf, 0xff, 0xff, + 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xaf, 0xff, 0xfe, 0xa5, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8e, + 0xff, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x7c, 0xff, 0xd8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xfe, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x8a, 0xa8, + 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x38, 0xef, 0xff, 0xff, 0xff, + 0xb8, 0x8c, 0xff, 0xff, 0xff, 0xfc, 0x72, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xb8, 0x8c, 0xff, 0xff, 0xff, 0xff, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdc, 0xbb, 0xbb, + 0xbb, 0xba, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xfc, 0x74, 0x58, + 0x99, 0x99, 0x99, 0x99, 0x52, 0x25, 0x64, 0x10, + 0x0, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xfa, + 0x55, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x94, 0x4a, + 0xff, 0xda, 0x52, 0x0, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xfa, 0x55, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xa5, 0x23, 0x56, 0x66, 0x53, 0x10, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xfa, 0x55, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x40, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xfa, 0x55, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x40, 0x0, 0x49, 0xef, 0xff, 0xff, 0xfa, + 0x55, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x31, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0x65, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x9d, 0xff, 0xb6, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x26, 0xad, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x72, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, + 0x0, 0x2, 0x6b, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x93, 0x0, 0x0, 0x39, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x61, 0x0, 0x1, 0x23, 0x34, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x43, 0x21, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, 0xff, 0xff, + 0xfe, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x46, 0x76, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F11C "" */ + 0x0, 0x26, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x84, 0x0, 0x5, + 0xaf, 0xfe, 0xc9, 0x88, 0xad, 0xeb, 0x88, 0x8b, + 0xed, 0xa8, 0x8b, 0xee, 0xb8, 0x88, 0x8b, 0xee, + 0xb8, 0x8a, 0xdf, 0xfd, 0x72, 0x0, 0x5a, 0xff, + 0xd8, 0x30, 0x5, 0xbc, 0x71, 0x1, 0x7c, 0xb5, + 0x1, 0x6b, 0xb6, 0x0, 0x0, 0x6b, 0xb6, 0x10, + 0x5b, 0xff, 0xd8, 0x20, 0x5, 0xaf, 0xff, 0xff, + 0xfe, 0xdc, 0xcd, 0xef, 0xed, 0xcc, 0xde, 0xed, + 0xcc, 0xce, 0xff, 0xec, 0xcc, 0xef, 0xff, 0xff, + 0xfd, 0x82, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xa4, + 0x0, 0x38, 0xc8, 0x30, 0x5, 0xaa, 0x40, 0x2, + 0x7d, 0xd7, 0x20, 0x27, 0xcf, 0xff, 0xff, 0xd8, + 0x20, 0x5, 0xaf, 0xff, 0xff, 0xfe, 0xdc, 0xcd, + 0xef, 0xed, 0xcc, 0xde, 0xed, 0xcc, 0xce, 0xff, + 0xec, 0xcc, 0xef, 0xff, 0xff, 0xfd, 0x82, 0x0, + 0x5a, 0xff, 0xd8, 0x30, 0x5, 0xbc, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, + 0xb6, 0x10, 0x5b, 0xff, 0xd8, 0x20, 0x5, 0xaf, + 0xfe, 0xc9, 0x88, 0xad, 0xeb, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x8b, 0xde, 0xb8, + 0x8a, 0xdf, 0xfd, 0x72, 0x0, 0x26, 0xbe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x84, 0x0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x24, 0x66, 0x53, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x35, 0x8a, 0xde, 0xff, 0xff, 0xfe, + 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x47, 0x9c, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x68, 0xad, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, + 0x79, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x20, 0x0, + 0x0, 0x0, 0x26, 0xbe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x38, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x83, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x33, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x9d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xea, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6c, 0xff, + 0xff, 0xff, 0xfd, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6c, 0xff, 0xff, 0xff, 0xb5, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6b, 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x46, 0x64, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F15B "ï…›" */ + 0x0, 0x26, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xba, 0x62, 0x36, 0x74, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe9, 0x45, 0xaf, 0xfd, 0x94, 0x10, 0x0, + 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x94, 0x5a, 0xff, 0xff, 0xfd, 0x94, + 0x10, 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x52, 0x34, 0x44, 0x44, 0x44, + 0x31, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x50, 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x50, 0x0, 0x5, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x50, 0x0, 0x5, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x50, 0x0, 0x5, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, 0x2, + 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x31, 0x0, 0x0, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x35, 0x67, 0x99, 0xab, 0xbb, 0xcb, 0xbb, + 0xa9, 0x97, 0x65, 0x31, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, + 0x8b, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x85, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x7b, + 0xef, 0xff, 0xff, 0xfe, 0xca, 0x87, 0x54, 0x33, + 0x22, 0x22, 0x23, 0x34, 0x57, 0x8a, 0xce, 0xff, + 0xff, 0xff, 0xeb, 0x73, 0x10, 0x0, 0x0, 0x28, + 0xdf, 0xff, 0xfd, 0xa7, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x37, 0xad, 0xff, 0xff, 0xd8, 0x30, 0x0, + 0x0, 0x2, 0x57, 0x63, 0x0, 0x0, 0x1, 0x25, + 0x79, 0xbc, 0xde, 0xff, 0xff, 0xfe, 0xdc, 0xb9, + 0x75, 0x21, 0x0, 0x0, 0x3, 0x57, 0x52, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x8c, + 0xef, 0xff, 0xff, 0xff, 0xfe, 0xee, 0xee, 0xff, + 0xff, 0xff, 0xff, 0xec, 0x84, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x6b, 0xef, 0xfc, 0x96, 0x42, 0x10, 0x0, 0x0, + 0x0, 0x12, 0x46, 0x9c, 0xef, 0xeb, 0x62, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x10, 0x0, 0x0, 0x0, 0x1, 0x21, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x5a, 0xef, 0xff, 0xea, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xff, 0xff, 0xff, 0xf9, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x26, 0xac, 0xdc, 0xa6, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x1, 0x35, 0x67, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x65, 0x20, 0x0, + 0x0, 0x0, 0x4, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x83, 0x0, 0x0, 0x0, 0x5a, 0xff, 0xd8, 0x32, + 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x21, 0x49, + 0xef, 0xff, 0xd8, 0x30, 0x0, 0x5, 0xaf, 0xfd, + 0x84, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x52, 0x59, 0xce, 0xff, 0xa5, 0x0, 0x0, 0x5a, + 0xff, 0xd8, 0x46, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa5, 0x0, 0x28, 0xdf, 0xfa, 0x50, 0x0, + 0x5, 0xaf, 0xfd, 0x83, 0x59, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xc8, 0x43, 0x8e, 0xff, 0xff, 0xa5, + 0x0, 0x0, 0x5a, 0xff, 0xeb, 0x87, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x9c, 0xff, 0xfc, + 0x94, 0x10, 0x0, 0x2, 0x6c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xea, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F241 "ï‰" */ + 0x0, 0x1, 0x35, 0x67, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x65, 0x20, 0x0, + 0x0, 0x0, 0x4, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x83, 0x0, 0x0, 0x0, 0x5a, 0xff, 0xd8, 0x32, + 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x21, 0x0, 0x0, 0x0, 0x49, + 0xef, 0xff, 0xd8, 0x30, 0x0, 0x5, 0xaf, 0xfd, + 0x84, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc6, 0x10, 0x0, 0x0, + 0x2, 0x59, 0xce, 0xff, 0xa5, 0x0, 0x0, 0x5a, + 0xff, 0xd8, 0x46, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x61, 0x0, + 0x0, 0x0, 0x0, 0x28, 0xdf, 0xfa, 0x50, 0x0, + 0x5, 0xaf, 0xfd, 0x83, 0x59, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x95, + 0x0, 0x0, 0x0, 0x3, 0x8e, 0xff, 0xff, 0xa5, + 0x0, 0x0, 0x5a, 0xff, 0xeb, 0x87, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x9c, 0xff, 0xfc, + 0x94, 0x10, 0x0, 0x2, 0x6c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xea, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F242 "" */ + 0x0, 0x1, 0x35, 0x67, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x65, 0x20, 0x0, + 0x0, 0x0, 0x4, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x83, 0x0, 0x0, 0x0, 0x5a, 0xff, 0xd8, 0x32, + 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x32, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, + 0xef, 0xff, 0xd8, 0x30, 0x0, 0x5, 0xaf, 0xfd, + 0x84, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x59, 0xce, 0xff, 0xa5, 0x0, 0x0, 0x5a, + 0xff, 0xd8, 0x46, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x28, 0xdf, 0xfa, 0x50, 0x0, + 0x5, 0xaf, 0xfd, 0x83, 0x59, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xca, 0x62, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x8e, 0xff, 0xff, 0xa5, + 0x0, 0x0, 0x5a, 0xff, 0xeb, 0x87, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x9c, 0xff, 0xfc, + 0x94, 0x10, 0x0, 0x2, 0x6c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xea, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F243 "" */ + 0x0, 0x1, 0x35, 0x67, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x65, 0x20, 0x0, + 0x0, 0x0, 0x4, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x83, 0x0, 0x0, 0x0, 0x5a, 0xff, 0xd8, 0x32, + 0x34, 0x44, 0x44, 0x43, 0x21, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, + 0xef, 0xff, 0xd8, 0x30, 0x0, 0x5, 0xaf, 0xfd, + 0x84, 0x6c, 0xff, 0xff, 0xff, 0xe9, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x59, 0xce, 0xff, 0xa5, 0x0, 0x0, 0x5a, + 0xff, 0xd8, 0x46, 0xcf, 0xff, 0xff, 0xfe, 0x94, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x28, 0xdf, 0xfa, 0x50, 0x0, + 0x5, 0xaf, 0xfd, 0x83, 0x59, 0xcc, 0xcc, 0xcc, + 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x8e, 0xff, 0xff, 0xa5, + 0x0, 0x0, 0x5a, 0xff, 0xeb, 0x87, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x9c, 0xff, 0xfc, + 0x94, 0x10, 0x0, 0x2, 0x6c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xea, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F244 "" */ + 0x0, 0x1, 0x35, 0x67, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x65, 0x20, 0x0, + 0x0, 0x0, 0x4, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x83, 0x0, 0x0, 0x0, 0x5a, 0xff, 0xd8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, + 0xef, 0xff, 0xd8, 0x30, 0x0, 0x5, 0xaf, 0xfd, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x59, 0xce, 0xff, 0xa5, 0x0, 0x0, 0x5a, + 0xff, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x28, 0xdf, 0xfa, 0x50, 0x0, + 0x5, 0xaf, 0xfd, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x8e, 0xff, 0xff, 0xa5, + 0x0, 0x0, 0x5a, 0xff, 0xeb, 0x87, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x9c, 0xff, 0xfc, + 0x94, 0x10, 0x0, 0x2, 0x6c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xea, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x33, 0x59, 0xdf, + 0xfe, 0xb6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x15, 0xad, 0xca, 0x9b, + 0xdf, 0xff, 0xfe, 0x93, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x11, 0x10, 0x0, 0x0, 0x0, 0x38, 0xdb, 0x51, + 0x0, 0x1, 0x24, 0x54, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x9d, 0xff, 0xff, 0xd9, 0x41, 0x1, 0x6b, 0xd8, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x6a, 0xb8, 0x52, 0x0, 0x0, 0x0, + 0x4, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0xed, 0xee, + 0xee, 0xee, 0xee, 0xed, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xde, 0xff, 0xff, 0xfc, 0x72, + 0x0, 0x0, 0x4, 0x9d, 0xff, 0xff, 0xd9, 0x41, + 0x0, 0x0, 0x0, 0x16, 0xbd, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x6a, 0xb8, 0x52, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, 0xb6, + 0x10, 0x3, 0x57, 0x77, 0x77, 0x42, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xcc, 0xba, 0xce, 0xff, 0xff, 0xfb, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x49, 0xdf, 0xff, 0xff, + 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x23, 0x34, + 0x43, 0x32, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x6a, 0xde, 0xff, 0xfe, + 0xee, 0xff, 0xff, 0xed, 0xa5, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x4a, 0xef, 0xff, 0xff, 0xff, + 0xa5, 0x37, 0xcf, 0xff, 0xff, 0xfd, 0x93, 0x0, + 0x0, 0x0, 0x1, 0x7c, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x40, 0x1, 0x48, 0xdf, 0xff, 0xff, 0xa5, + 0x0, 0x0, 0x0, 0x5b, 0xff, 0xfd, 0x84, 0x59, + 0xdf, 0xa4, 0x27, 0xa8, 0x42, 0x5b, 0xff, 0xfe, + 0x83, 0x0, 0x0, 0x28, 0xdf, 0xff, 0xff, 0xc7, + 0x32, 0x44, 0x21, 0x34, 0x33, 0x7c, 0xff, 0xff, + 0xfa, 0x50, 0x0, 0x3, 0x8e, 0xff, 0xff, 0xff, + 0xff, 0xc6, 0x20, 0x1, 0x5a, 0xef, 0xff, 0xff, + 0xff, 0xb6, 0x0, 0x0, 0x38, 0xef, 0xff, 0xff, + 0xfe, 0xb6, 0x20, 0x0, 0x1, 0x49, 0xdf, 0xff, + 0xff, 0xfb, 0x60, 0x0, 0x2, 0x7c, 0xff, 0xfe, + 0xb6, 0x22, 0x59, 0x84, 0x26, 0x97, 0x32, 0x5a, + 0xef, 0xff, 0xa5, 0x0, 0x0, 0x4, 0x9f, 0xff, + 0xec, 0xab, 0xdf, 0xfa, 0x41, 0x46, 0x42, 0x59, + 0xdf, 0xff, 0xd8, 0x20, 0x0, 0x0, 0x4, 0x9e, + 0xff, 0xff, 0xff, 0xff, 0xa4, 0x1, 0x5a, 0xdf, + 0xff, 0xff, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x1, + 0x49, 0xdf, 0xff, 0xff, 0xfb, 0xaa, 0xdf, 0xff, + 0xff, 0xfd, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x24, 0x68, 0x9a, 0xab, 0xbb, 0xa9, + 0x87, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "ï‹­" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x67, + 0x88, 0x88, 0x87, 0x75, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0xbb, 0xcc, 0xcc, 0xcc, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xcc, + 0xcc, 0xcc, 0xb9, 0x51, 0x0, 0x37, 0xbb, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xb9, 0x51, 0x0, 0x0, + 0x24, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x30, 0x0, + 0x0, 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x61, 0x0, 0x0, 0x0, 0x49, 0xef, 0xff, 0xa5, + 0x5a, 0xff, 0xe9, 0x56, 0xbf, 0xfd, 0x85, 0x8d, + 0xff, 0xfc, 0x61, 0x0, 0x0, 0x0, 0x49, 0xef, + 0xff, 0xa4, 0x4a, 0xff, 0xe8, 0x46, 0xbf, 0xfc, + 0x74, 0x7c, 0xff, 0xfc, 0x61, 0x0, 0x0, 0x0, + 0x49, 0xef, 0xff, 0xa4, 0x4a, 0xff, 0xe8, 0x46, + 0xbf, 0xfc, 0x74, 0x7c, 0xff, 0xfc, 0x61, 0x0, + 0x0, 0x0, 0x49, 0xef, 0xff, 0xa4, 0x4a, 0xff, + 0xe8, 0x46, 0xbf, 0xfc, 0x74, 0x7c, 0xff, 0xfc, + 0x61, 0x0, 0x0, 0x0, 0x49, 0xef, 0xff, 0xa4, + 0x4a, 0xff, 0xe8, 0x46, 0xbf, 0xfc, 0x74, 0x7c, + 0xff, 0xfc, 0x61, 0x0, 0x0, 0x0, 0x49, 0xef, + 0xff, 0xa5, 0x5a, 0xff, 0xe9, 0x56, 0xbf, 0xfd, + 0x85, 0x8d, 0xff, 0xfc, 0x61, 0x0, 0x0, 0x0, + 0x38, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x60, 0x0, + 0x0, 0x0, 0x1, 0x36, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x76, 0x42, + 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x67, + 0x63, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x5a, 0xef, 0xff, 0xff, 0xd9, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x25, 0x9d, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x5a, 0xef, 0xda, 0x53, 0x5a, 0xdf, 0xff, + 0xff, 0xfd, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x25, 0xae, 0xff, 0xff, + 0xff, 0xfd, 0xa5, 0x35, 0xad, 0xda, 0x52, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x5a, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x25, 0xae, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xea, 0x52, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x5a, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xa5, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x25, 0xae, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xea, 0x52, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa5, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x28, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xea, 0x52, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4a, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x67, 0x76, + 0x55, 0x44, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x9c, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0x84, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0xad, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x15, 0xad, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x94, 0x1, + 0x49, 0xdf, 0xfd, 0x94, 0x10, 0x39, 0xdf, 0xff, + 0xff, 0xff, 0xfa, 0x50, 0x0, 0x0, 0x15, 0xad, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x94, 0x10, 0x1, 0x22, 0x10, 0x1, 0x49, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, 0x39, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x61, 0x0, 0x0, 0x15, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x50, 0x0, + 0x0, 0x15, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x94, 0x10, 0x1, 0x33, 0x10, + 0x1, 0x49, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xa5, + 0x0, 0x0, 0x0, 0x0, 0x15, 0xad, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x94, 0x11, 0x49, 0xdf, + 0xfd, 0x94, 0x10, 0x49, 0xdf, 0xff, 0xff, 0xff, + 0xfa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, + 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x14, 0x9c, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xec, 0x84, 0x0, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x67, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x64, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x25, 0xad, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x83, + 0x0, 0x0, 0x0, 0x26, 0xbe, 0xff, 0xa4, 0x0, + 0x5b, 0xb6, 0x3, 0x9b, 0x72, 0x28, 0xdf, 0xfa, + 0x50, 0x0, 0x4, 0x9e, 0xff, 0xff, 0xfa, 0x40, + 0x5, 0xbb, 0x60, 0x39, 0xb7, 0x22, 0x8d, 0xff, + 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x50, 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x50, 0x0, 0x5, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x50, 0x0, 0x5, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x50, 0x0, 0x2, 0x6c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x62, 0x0, 0x0, 0x0, + 0x1, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x31, 0x0, 0x0, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x12, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x48, 0xdf, + 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x6a, + 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x27, 0xdf, 0xff, 0xb6, 0x0, 0x0, + 0x0, 0x0, 0x37, 0xce, 0xff, 0xfc, 0x72, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, + 0xdf, 0xff, 0xb6, 0x0, 0x0, 0x3, 0x8c, 0xff, + 0xff, 0xff, 0xff, 0xed, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xde, 0xff, 0xff, 0xb6, + 0x0, 0x0, 0x16, 0xbe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, + 0x2, 0x6b, 0xef, 0xff, 0xfc, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, + 0xad, 0xfc, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 52, .box_w = 6, .box_h = 0, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 51, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 41, .adv_w = 75, .box_w = 15, .box_h = 4, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 71, .adv_w = 135, .box_w = 27, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 193, .adv_w = 119, .box_w = 24, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 349, .adv_w = 162, .box_w = 30, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 484, .adv_w = 132, .box_w = 27, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 619, .adv_w = 40, .box_w = 9, .box_h = 4, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 637, .adv_w = 65, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 715, .adv_w = 65, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 793, .adv_w = 77, .box_w = 18, .box_h = 5, .ofs_x = -1, .ofs_y = 5}, + {.bitmap_index = 838, .adv_w = 112, .box_w = 21, .box_h = 6, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 901, .adv_w = 44, .box_w = 9, .box_h = 4, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 919, .adv_w = 74, .box_w = 15, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 934, .adv_w = 44, .box_w = 9, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 943, .adv_w = 68, .box_w = 18, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1060, .adv_w = 128, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1168, .adv_w = 71, .box_w = 15, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1236, .adv_w = 110, .box_w = 24, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1344, .adv_w = 110, .box_w = 24, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1452, .adv_w = 128, .box_w = 27, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1574, .adv_w = 110, .box_w = 24, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1682, .adv_w = 118, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1790, .adv_w = 115, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1898, .adv_w = 124, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2006, .adv_w = 118, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2114, .adv_w = 44, .box_w = 9, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2146, .adv_w = 44, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2187, .adv_w = 112, .box_w = 21, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 2261, .adv_w = 112, .box_w = 21, .box_h = 5, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 2314, .adv_w = 112, .box_w = 21, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 2388, .adv_w = 110, .box_w = 24, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2496, .adv_w = 199, .box_w = 39, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2730, .adv_w = 141, .box_w = 33, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2879, .adv_w = 145, .box_w = 27, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3001, .adv_w = 139, .box_w = 27, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3123, .adv_w = 159, .box_w = 30, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3258, .adv_w = 129, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3366, .adv_w = 122, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3474, .adv_w = 148, .box_w = 27, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3596, .adv_w = 156, .box_w = 27, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3718, .adv_w = 60, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3759, .adv_w = 98, .box_w = 21, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3854, .adv_w = 138, .box_w = 27, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3976, .adv_w = 114, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4084, .adv_w = 183, .box_w = 33, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4233, .adv_w = 156, .box_w = 27, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4355, .adv_w = 161, .box_w = 30, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4490, .adv_w = 139, .box_w = 27, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4612, .adv_w = 161, .box_w = 33, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4810, .adv_w = 140, .box_w = 27, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4932, .adv_w = 119, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5040, .adv_w = 113, .box_w = 27, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5162, .adv_w = 152, .box_w = 27, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5284, .adv_w = 137, .box_w = 30, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5419, .adv_w = 216, .box_w = 42, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5608, .adv_w = 129, .box_w = 30, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5743, .adv_w = 124, .box_w = 30, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5878, .adv_w = 126, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5986, .adv_w = 64, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 6084, .adv_w = 68, .box_w = 18, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 6201, .adv_w = 64, .box_w = 15, .box_h = 13, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 6299, .adv_w = 112, .box_w = 21, .box_h = 6, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 6362, .adv_w = 96, .box_w = 24, .box_h = 1, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 6374, .adv_w = 115, .box_w = 12, .box_h = 2, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 6386, .adv_w = 115, .box_w = 21, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6460, .adv_w = 131, .box_w = 27, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6595, .adv_w = 110, .box_w = 21, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6669, .adv_w = 131, .box_w = 24, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6789, .adv_w = 118, .box_w = 24, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6873, .adv_w = 68, .box_w = 18, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 6963, .adv_w = 132, .box_w = 24, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 7083, .adv_w = 131, .box_w = 24, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7203, .adv_w = 54, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7248, .adv_w = 55, .box_w = 15, .box_h = 13, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 7346, .adv_w = 118, .box_w = 24, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7466, .adv_w = 54, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7511, .adv_w = 203, .box_w = 36, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7637, .adv_w = 131, .box_w = 24, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7721, .adv_w = 122, .box_w = 24, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7805, .adv_w = 131, .box_w = 27, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 7940, .adv_w = 131, .box_w = 24, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 8060, .adv_w = 79, .box_w = 15, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8113, .adv_w = 96, .box_w = 21, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8187, .adv_w = 79, .box_w = 18, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8268, .adv_w = 130, .box_w = 24, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8352, .adv_w = 107, .box_w = 27, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8447, .adv_w = 173, .box_w = 39, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8584, .adv_w = 106, .box_w = 24, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8668, .adv_w = 107, .box_w = 27, .box_h = 10, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 8803, .adv_w = 100, .box_w = 21, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8877, .adv_w = 67, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 8975, .adv_w = 57, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9034, .adv_w = 67, .box_w = 15, .box_h = 13, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 9132, .adv_w = 112, .box_w = 21, .box_h = 2, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 9153, .adv_w = 80, .box_w = 15, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 9191, .adv_w = 60, .box_w = 12, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 9209, .adv_w = 192, .box_w = 42, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 9482, .adv_w = 192, .box_w = 42, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 9671, .adv_w = 192, .box_w = 42, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 9902, .adv_w = 192, .box_w = 42, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 10091, .adv_w = 132, .box_w = 30, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 10226, .adv_w = 192, .box_w = 42, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 10499, .adv_w = 192, .box_w = 36, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10733, .adv_w = 216, .box_w = 45, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 10981, .adv_w = 192, .box_w = 42, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 11254, .adv_w = 216, .box_w = 45, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 11457, .adv_w = 192, .box_w = 42, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 11730, .adv_w = 96, .box_w = 24, .box_h = 10, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 11850, .adv_w = 144, .box_w = 33, .box_h = 10, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 12015, .adv_w = 216, .box_w = 45, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 12308, .adv_w = 192, .box_w = 42, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 12497, .adv_w = 132, .box_w = 30, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 12692, .adv_w = 168, .box_w = 27, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 12854, .adv_w = 168, .box_w = 36, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 13088, .adv_w = 168, .box_w = 36, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 13286, .adv_w = 168, .box_w = 36, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 13484, .adv_w = 168, .box_w = 27, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 13646, .adv_w = 168, .box_w = 39, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 13861, .adv_w = 120, .box_w = 24, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 13993, .adv_w = 120, .box_w = 24, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14125, .adv_w = 168, .box_w = 36, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 14323, .adv_w = 168, .box_w = 36, .box_h = 3, .ofs_x = -1, .ofs_y = 3}, + {.bitmap_index = 14377, .adv_w = 216, .box_w = 45, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 14580, .adv_w = 240, .box_w = 51, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 14912, .adv_w = 216, .box_w = 45, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 15205, .adv_w = 192, .box_w = 42, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 15436, .adv_w = 168, .box_w = 36, .box_h = 7, .ofs_x = -1, .ofs_y = 1}, + {.bitmap_index = 15562, .adv_w = 168, .box_w = 36, .box_h = 7, .ofs_x = -1, .ofs_y = 1}, + {.bitmap_index = 15688, .adv_w = 240, .box_w = 51, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 15943, .adv_w = 192, .box_w = 42, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 16132, .adv_w = 192, .box_w = 42, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 16405, .adv_w = 192, .box_w = 42, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 16678, .adv_w = 168, .box_w = 36, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 16876, .adv_w = 168, .box_w = 36, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 17110, .adv_w = 168, .box_w = 36, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 17308, .adv_w = 168, .box_w = 36, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 17506, .adv_w = 192, .box_w = 42, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 17695, .adv_w = 120, .box_w = 27, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 17871, .adv_w = 168, .box_w = 36, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 18105, .adv_w = 168, .box_w = 36, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 18339, .adv_w = 216, .box_w = 45, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 18542, .adv_w = 192, .box_w = 42, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 18815, .adv_w = 144, .box_w = 33, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 19030, .adv_w = 240, .box_w = 51, .box_h = 12, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 19336, .adv_w = 240, .box_w = 51, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 19566, .adv_w = 240, .box_w = 51, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 19796, .adv_w = 240, .box_w = 51, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 20026, .adv_w = 240, .box_w = 51, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 20256, .adv_w = 240, .box_w = 51, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 20486, .adv_w = 240, .box_w = 51, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 20767, .adv_w = 168, .box_w = 33, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20982, .adv_w = 168, .box_w = 36, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 21216, .adv_w = 192, .box_w = 42, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 21489, .adv_w = 240, .box_w = 51, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 21719, .adv_w = 144, .box_w = 33, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 21934, .adv_w = 193, .box_w = 42, .box_h = 9, .ofs_x = -1, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 2, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 9, 0, 5, -4, 0, 0, + 0, 0, -11, -12, 1, 9, 4, 3, + -8, 1, 9, 1, 8, 2, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 2, -1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, -6, 0, 0, 0, 0, + 0, -4, 3, 4, 0, 0, -2, 0, + -1, 2, 0, -2, 0, -2, -1, -4, + 0, 0, 0, 0, -2, 0, 0, -2, + -3, 0, 0, -2, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + -2, 0, -3, 0, -5, 0, -23, 0, + 0, -4, 0, 4, 6, 0, 0, -4, + 2, 2, 6, 4, -3, 4, 0, 0, + -11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, -2, -9, 0, -8, + -1, 0, 0, 0, 0, 0, 7, 0, + -6, -2, -1, 1, 0, -3, 0, 0, + -1, -14, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -15, -2, 7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 6, + 0, 2, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 2, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, + 4, 2, 6, -2, 0, 0, 4, -2, + -6, -26, 1, 5, 4, 0, -2, 0, + 7, 0, 6, 0, 6, 0, -18, 0, + -2, 6, 0, 6, -2, 4, 2, 0, + 0, 1, -2, 0, 0, -3, 15, 0, + 15, 0, 6, 0, 8, 2, 3, 6, + 0, 0, 0, -7, 0, 0, 0, 0, + 1, -1, 0, 1, -3, -2, -4, 1, + 0, -2, 0, 0, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -11, 0, -12, 0, 0, 0, + 0, -1, 0, 19, -2, -2, 2, 2, + -2, 0, -2, 2, 0, 0, -10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -19, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -12, 0, 12, 0, 0, -7, 0, + 6, 0, -13, -19, -13, -4, 6, 0, + 0, -13, 0, 2, -4, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 6, -23, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 1, 0, 0, 0, + 0, 0, 1, 1, -2, -4, 0, -1, + -1, -2, 0, 0, -1, 0, 0, 0, + -4, 0, -2, 0, -4, -4, 0, -5, + -6, -6, -4, 0, -4, 0, -4, 0, + 0, 0, 0, -2, 0, 0, 2, 0, + 1, -2, 0, 1, 0, 0, 0, 2, + -1, 0, 0, 0, -1, 2, 2, -1, + 0, 0, 0, -4, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 2, -1, 0, + -2, 0, -3, 0, 0, -1, 0, 6, + 0, 0, -2, 0, 0, 0, 0, 0, + -1, 1, -1, -1, 0, 0, -2, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, -2, -2, 0, + 0, 0, 0, 0, 1, 0, 0, -1, + 0, -2, -2, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, -1, -2, 0, -3, 0, -6, + -1, -6, 4, 0, 0, -4, 2, 4, + 5, 0, -5, -1, -2, 0, -1, -9, + 2, -1, 1, -10, 2, 0, 0, 1, + -10, 0, -10, -2, -17, -1, 0, -10, + 0, 4, 5, 0, 2, 0, 0, 0, + 0, 0, 0, -3, -2, 0, -6, 0, + 0, 0, -2, 0, 0, 0, -2, 0, + 0, 0, 0, 0, -1, -1, 0, -1, + -2, 0, 0, 0, 0, 0, 0, 0, + -2, -2, 0, -1, -2, -2, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + 0, -1, 0, -4, 2, 0, 0, -2, + 1, 2, 2, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 1, + 0, 0, -2, 0, -2, -1, -2, 0, + 0, 0, 0, 0, 0, 0, 2, 0, + -2, 0, 0, 0, 0, -2, -3, 0, + -4, 0, 6, -1, 1, -6, 0, 0, + 5, -10, -10, -8, -4, 2, 0, -2, + -12, -3, 0, -3, 0, -4, 3, -3, + -12, 0, -5, 0, 0, 1, -1, 2, + -1, 0, 2, 0, -6, -7, 0, -10, + -5, -4, -5, -6, -2, -5, 0, -4, + -5, 1, 0, 1, 0, -2, 0, 0, + 0, 1, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, -1, 0, -1, -2, 0, -3, -4, + -4, -1, 0, -6, 0, 0, 0, 0, + 0, 0, -2, 0, 0, 0, 0, 1, + -1, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, 0, 0, + -4, 0, 0, 0, 0, -10, -6, 0, + 0, 0, -3, -10, 0, 0, -2, 2, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, -3, 0, + 0, 0, 0, 2, 0, 1, -4, -4, + 0, -2, -2, -2, 0, 0, 0, 0, + 0, 0, -6, 0, -2, 0, -3, -2, + 0, -4, -5, -6, -2, 0, -4, 0, + -6, 0, 0, 0, 0, 15, 0, 0, + 1, 0, 0, -2, 0, 2, 0, -8, + 0, 0, 0, 0, 0, -18, -3, 6, + 6, -2, -8, 0, 2, -3, 0, -10, + -1, -2, 2, -13, -2, 2, 0, 3, + -7, -3, -7, -6, -8, 0, 0, -12, + 0, 11, 0, 0, -1, 0, 0, 0, + -1, -1, -2, -5, -6, 0, -18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, -1, -2, -3, 0, 0, + -4, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -4, 0, 0, 4, + -1, 2, 0, -4, 2, -1, -1, -5, + -2, 0, -2, -2, -1, 0, -3, -3, + 0, 0, -2, -1, -1, -3, -2, 0, + 0, -2, 0, 2, -1, 0, -4, 0, + 0, 0, -4, 0, -3, 0, -3, -3, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 2, 0, -3, 0, -1, -2, + -6, -1, -1, -1, -1, -1, -2, -1, + 0, 0, 0, 0, 0, -2, -2, -2, + 0, 0, 0, 0, 2, -1, 0, -1, + 0, 0, 0, -1, -2, -1, -2, -2, + -2, 0, 2, 8, -1, 0, -5, 0, + -1, 4, 0, -2, -8, -2, 3, 0, + 0, -9, -3, 2, -3, 1, 0, -1, + -2, -6, 0, -3, 1, 0, 0, -3, + 0, 0, 0, 2, 2, -4, -4, 0, + -3, -2, -3, -2, -2, 0, -3, 1, + -4, -3, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, -2, + 0, 0, -2, -2, 0, 0, 0, 0, + -2, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, -1, 0, 0, 0, 0, + -3, 0, -4, 0, 0, 0, -6, 0, + 1, -4, 4, 0, -1, -9, 0, 0, + -4, -2, 0, -8, -5, -5, 0, 0, + -8, -2, -8, -7, -9, 0, -5, 0, + 2, 13, -2, 0, -4, -2, -1, -2, + -3, -5, -3, -7, -8, -4, -2, 0, + 0, -1, 0, 1, 0, 0, -13, -2, + 6, 4, -4, -7, 0, 1, -6, 0, + -10, -1, -2, 4, -18, -2, 1, 0, + 0, -12, -2, -10, -2, -14, 0, 0, + -13, 0, 11, 1, 0, -1, 0, 0, + 0, 0, -1, -1, -7, -1, 0, -12, + 0, 0, 0, 0, -6, 0, -2, 0, + -1, -5, -9, 0, 0, -1, -3, -6, + -2, 0, -1, 0, 0, 0, 0, -9, + -2, -6, -6, -2, -3, -5, -2, -3, + 0, -4, -2, -6, -3, 0, -2, -4, + -2, -4, 0, 1, 0, -1, -6, 0, + 4, 0, -3, 0, 0, 0, 0, 2, + 0, 1, -4, 8, 0, -2, -2, -2, + 0, 0, 0, 0, 0, 0, -6, 0, + -2, 0, -3, -2, 0, -4, -5, -6, + -2, 0, -4, 2, 8, 0, 0, 0, + 0, 15, 0, 0, 1, 0, 0, -2, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, -4, 0, 0, 0, 0, 0, -1, + 0, 0, 0, -2, -2, 0, 0, -4, + -2, 0, 0, -4, 0, 3, -1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 3, 4, 2, -2, 0, -6, + -3, 0, 6, -6, -6, -4, -4, 8, + 3, 2, -17, -1, 4, -2, 0, -2, + 2, -2, -7, 0, -2, 2, -2, -2, + -6, -2, 0, 0, 6, 4, 0, -5, + 0, -11, -2, 6, -2, -7, 1, -2, + -6, -6, -2, 8, 2, 0, -3, 0, + -5, 0, 2, 6, -4, -7, -8, -5, + 6, 0, 1, -14, -2, 2, -3, -1, + -4, 0, -4, -7, -3, -3, -2, 0, + 0, -4, -4, -2, 0, 6, 4, -2, + -11, 0, -11, -3, 0, -7, -11, -1, + -6, -3, -6, -5, 5, 0, 0, -2, + 0, -4, -2, 0, -2, -3, 0, 3, + -6, 2, 0, 0, -10, 0, -2, -4, + -3, -1, -6, -5, -6, -4, 0, -6, + -2, -4, -4, -6, -2, 0, 0, 1, + 9, -3, 0, -6, -2, 0, -2, -4, + -4, -5, -5, -7, -2, -4, 4, 0, + -3, 0, -10, -2, 1, 4, -6, -7, + -4, -6, 6, -2, 1, -18, -3, 4, + -4, -3, -7, 0, -6, -8, -2, -2, + -2, -2, -4, -6, -1, 0, 0, 6, + 5, -1, -12, 0, -12, -4, 5, -7, + -13, -4, -7, -8, -10, -6, 4, 0, + 0, 0, 0, -2, 0, 0, 2, -2, + 4, 1, -4, 4, 0, 0, -6, -1, + 0, -1, 0, 1, 1, -2, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, 2, 6, 0, 0, -2, 0, 0, + 0, 0, -1, -1, -2, 0, 0, 0, + 1, 2, 0, 0, 0, 0, 2, 0, + -2, 0, 7, 0, 3, 1, 1, -2, + 0, 4, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -12, 0, -2, 3, 0, 6, + 0, 0, 19, 2, -4, -4, 2, 2, + -1, 1, -10, 0, 0, 9, -12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -13, 7, 27, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, -4, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, -5, 0, + 0, 1, 0, 0, 2, 25, -4, -2, + 6, 5, -5, 2, 0, 0, 2, 2, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -25, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, -5, 0, 0, 0, 0, + -4, -1, 0, 0, 0, -4, 0, -2, + 0, -9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -13, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -2, 0, 0, -4, 0, -3, 0, + -5, 0, 0, 0, -3, 2, -2, 0, + 0, -5, -2, -4, 0, 0, -5, 0, + -2, 0, -9, 0, -2, 0, 0, -16, + -4, -8, -2, -7, 0, 0, -13, 0, + -5, -1, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, -2, -3, 0, 0, + 0, 0, -4, 0, -4, 2, -2, 4, + 0, -1, -4, -1, -3, -4, 0, -2, + -1, -1, 1, -5, -1, 0, 0, 0, + -17, -2, -3, 0, -4, 0, -1, -9, + -2, 0, 0, -1, -2, 0, 0, 0, + 0, 1, 0, -1, -3, -1, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -4, 0, -1, 0, 0, 0, -4, + 2, 0, 0, 0, -5, -2, -4, 0, + 0, -5, 0, -2, 0, -9, 0, 0, + 0, 0, -19, 0, -4, -7, -10, 0, + 0, -13, 0, -1, -3, 0, 0, 0, + 0, 0, 0, 0, 0, -2, -3, -1, + -3, 1, 0, 0, 3, -2, 0, 6, + 9, -2, -2, -6, 2, 9, 3, 4, + -5, 2, 8, 2, 6, 4, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 9, -3, -2, 0, -2, + 15, 8, 15, 0, 0, 0, 2, 0, + 0, 7, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, -16, -2, -2, -8, + -9, 0, 0, -13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, -16, -2, -2, + -8, -9, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, -4, 2, 0, -2, + 2, 3, 2, -6, 0, 0, -2, 2, + 0, 2, 0, 0, 0, 0, -5, 0, + -2, -1, -4, 0, -2, -8, 0, 12, + -2, 0, -4, -1, 0, -1, -3, 0, + -2, -5, -4, -2, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, -16, + -2, -2, -8, -9, 0, 0, -13, 0, + 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, -6, -2, -2, 6, -2, -2, + -8, 1, -1, 1, -1, -5, 0, 4, + 0, 2, 1, 2, -5, -8, -2, 0, + -7, -4, -5, -8, -7, 0, -3, -4, + -2, -2, -2, -1, -2, -1, 0, -1, + -1, 3, 0, 3, -1, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -1, -2, -2, 0, 0, + -5, 0, -1, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -12, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + 0, 0, 0, 0, -2, 0, 0, -3, + -2, 2, 0, -3, -4, -1, 0, -6, + -1, -4, -1, -2, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 6, 0, 0, -3, 0, + 0, 0, 0, -2, 0, -2, 0, 0, + -1, 0, 0, -1, 0, -4, 0, 0, + 8, -2, -6, -6, 1, 2, 2, 0, + -5, 1, 3, 1, 6, 1, 6, -1, + -5, 0, 0, -8, 0, 0, -6, -5, + 0, 0, -4, 0, -2, -3, 0, -3, + 0, -3, 0, -1, 3, 0, -2, -6, + -2, 7, 0, 0, -2, 0, -4, 0, + 0, 2, -4, 0, 2, -2, 2, 0, + 0, -6, 0, -1, -1, 0, -2, 2, + -2, 0, 0, 0, -8, -2, -4, 0, + -6, 0, 0, -9, 0, 7, -2, 0, + -3, 0, 1, 0, -2, 0, -2, -6, + 0, -2, 2, 0, 0, 0, 0, -1, + 0, 0, 2, -2, 1, 0, 0, -2, + -1, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 4, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + -2, -2, 0, 0, 0, 4, 0, 4, + 0, 0, 0, 0, 0, -12, -11, 1, + 8, 6, 3, -8, 1, 8, 0, 7, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserrat_12_subpx = { +#else +lv_font_t lv_font_montserrat_12_subpx = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 15, /*The maximum line height required by the font*/ + .base_line = 3, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_HOR, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_12_SUBPX*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_14.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_14.c new file mode 100644 index 0000000..cc4da95 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_14.c @@ -0,0 +1,2200 @@ +/******************************************************************************* + * Size: 14 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 14 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_14.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_14 + #define LV_FONT_MONTSERRAT_14 1 +#endif + +#if LV_FONT_MONTSERRAT_14 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xe, 0xa0, 0xd9, 0xd, 0x90, 0xc8, 0xc, 0x80, + 0xb7, 0xa, 0x60, 0x11, 0xb, 0x80, 0xd9, + + /* U+0022 "\"" */ + 0x1f, 0x9, 0x91, 0xf0, 0x88, 0x1f, 0x8, 0x80, + 0xf0, 0x88, 0x0, 0x0, 0x0, + + /* U+0023 "#" */ + 0x0, 0xd, 0x20, 0x3c, 0x0, 0x0, 0xf, 0x0, + 0x69, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf7, 0x1, + 0x5c, 0x11, 0xa6, 0x10, 0x0, 0x69, 0x0, 0xc3, + 0x0, 0x0, 0x88, 0x0, 0xd2, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xf0, 0x12, 0xc5, 0x23, 0xe2, 0x20, + 0x0, 0xd2, 0x3, 0xc0, 0x0, 0x0, 0xf0, 0x4, + 0xb0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x19, 0xef, + 0xea, 0x30, 0xc, 0xd6, 0xe6, 0xa7, 0x2, 0xf4, + 0xe, 0x0, 0x0, 0x1f, 0x80, 0xe0, 0x0, 0x0, + 0x6f, 0xef, 0x50, 0x0, 0x0, 0x16, 0xff, 0xe5, + 0x0, 0x0, 0xe, 0xa, 0xf0, 0x1, 0x0, 0xe0, + 0x5f, 0x13, 0xf8, 0x5e, 0x6e, 0xb0, 0x5, 0xcf, + 0xfe, 0x91, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0x70, 0x0, 0x0, + + /* U+0025 "%" */ + 0x8, 0xdd, 0x30, 0x0, 0xa7, 0x0, 0x4b, 0x2, + 0xd0, 0x4, 0xc0, 0x0, 0x77, 0x0, 0xd0, 0x1d, + 0x20, 0x0, 0x4b, 0x3, 0xd0, 0xa7, 0x0, 0x0, + 0x7, 0xdc, 0x34, 0xc4, 0xcc, 0x30, 0x0, 0x0, + 0x1d, 0x2d, 0x22, 0xd0, 0x0, 0x0, 0xa6, 0x3b, + 0x0, 0xb3, 0x0, 0x5, 0xc0, 0x3a, 0x0, 0xa3, + 0x0, 0x1d, 0x20, 0xd, 0x0, 0xd0, 0x0, 0xa6, + 0x0, 0x4, 0xcc, 0x40, + + /* U+0026 "&" */ + 0x0, 0x4d, 0xfc, 0x30, 0x0, 0x0, 0xf7, 0x18, + 0xc0, 0x0, 0x1, 0xf2, 0x5, 0xd0, 0x0, 0x0, + 0xbb, 0x6e, 0x40, 0x0, 0x0, 0x5f, 0xf3, 0x0, + 0x0, 0x7, 0xe6, 0xdb, 0x3, 0x80, 0x2f, 0x30, + 0x1d, 0xba, 0xa0, 0x5f, 0x0, 0x1, 0xdf, 0x40, + 0x1f, 0xb4, 0x48, 0xfe, 0xc0, 0x3, 0xbf, 0xfc, + 0x40, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x1f, 0x1, 0xf0, 0x1f, 0x0, 0xf0, 0x0, 0x0, + + /* U+0028 "(" */ + 0x3, 0xf1, 0xb, 0x90, 0xf, 0x40, 0x4f, 0x0, + 0x7d, 0x0, 0x9b, 0x0, 0xaa, 0x0, 0xaa, 0x0, + 0x9b, 0x0, 0x7d, 0x0, 0x4f, 0x0, 0xf, 0x40, + 0xb, 0x90, 0x3, 0xf1, + + /* U+0029 ")" */ + 0x5e, 0x0, 0xe, 0x60, 0x8, 0xc0, 0x4, 0xf0, + 0x1, 0xf3, 0x0, 0xf5, 0x0, 0xe6, 0x0, 0xe6, + 0x0, 0xf5, 0x1, 0xf3, 0x4, 0xf0, 0x8, 0xc0, + 0xe, 0x60, 0x5e, 0x0, + + /* U+002A "*" */ + 0x0, 0x93, 0x0, 0x88, 0xa6, 0xc2, 0x9, 0xfe, + 0x40, 0x4d, 0xdd, 0xb1, 0x42, 0x93, 0x50, 0x0, + 0x52, 0x0, + + /* U+002B "+" */ + 0x0, 0x4, 0x50, 0x0, 0x0, 0x8, 0xa0, 0x0, + 0x0, 0x8, 0xa0, 0x0, 0x1f, 0xff, 0xff, 0xf3, + 0x3, 0x39, 0xb3, 0x30, 0x0, 0x8, 0xa0, 0x0, + 0x0, 0x8, 0xa0, 0x0, + + /* U+002C "," */ + 0x1, 0x3, 0xf6, 0x1e, 0x60, 0xe1, 0x2c, 0x0, + + /* U+002D "-" */ + 0x0, 0x0, 0x3, 0xff, 0xf9, 0x3, 0x33, 0x10, + + /* U+002E "." */ + 0x0, 0x3, 0xf5, 0x2e, 0x40, + + /* U+002F "/" */ + 0x0, 0x0, 0xe, 0x40, 0x0, 0x4, 0xe0, 0x0, + 0x0, 0x9a, 0x0, 0x0, 0xe, 0x40, 0x0, 0x4, + 0xf0, 0x0, 0x0, 0x9a, 0x0, 0x0, 0xe, 0x40, + 0x0, 0x3, 0xf0, 0x0, 0x0, 0x9a, 0x0, 0x0, + 0xe, 0x50, 0x0, 0x3, 0xf0, 0x0, 0x0, 0x9a, + 0x0, 0x0, 0xe, 0x50, 0x0, 0x3, 0xf0, 0x0, + 0x0, + + /* U+0030 "0" */ + 0x0, 0x4c, 0xfe, 0x70, 0x0, 0x4f, 0xb6, 0x8f, + 0x90, 0xd, 0xb0, 0x0, 0x5f, 0x32, 0xf4, 0x0, + 0x0, 0xe7, 0x4f, 0x20, 0x0, 0xc, 0xa4, 0xf2, + 0x0, 0x0, 0xca, 0x2f, 0x40, 0x0, 0xe, 0x70, + 0xdb, 0x0, 0x5, 0xf2, 0x4, 0xfb, 0x68, 0xf9, + 0x0, 0x4, 0xcf, 0xe7, 0x0, + + /* U+0031 "1" */ + 0xef, 0xfb, 0x44, 0xcb, 0x0, 0xab, 0x0, 0xab, + 0x0, 0xab, 0x0, 0xab, 0x0, 0xab, 0x0, 0xab, + 0x0, 0xab, 0x0, 0xab, + + /* U+0032 "2" */ + 0x7, 0xdf, 0xea, 0x10, 0x8e, 0x85, 0x7e, 0xc0, + 0x1, 0x0, 0x6, 0xf1, 0x0, 0x0, 0x6, 0xf0, + 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0xcc, 0x0, + 0x0, 0x1c, 0xc0, 0x0, 0x1, 0xdb, 0x0, 0x0, + 0x1d, 0xe5, 0x44, 0x42, 0x7f, 0xff, 0xff, 0xf9, + + /* U+0033 "3" */ + 0x7f, 0xff, 0xff, 0xf0, 0x24, 0x44, 0x5f, 0x90, + 0x0, 0x0, 0xbc, 0x0, 0x0, 0x9, 0xe1, 0x0, + 0x0, 0x3f, 0xd8, 0x10, 0x0, 0x4, 0x6d, 0xd0, + 0x0, 0x0, 0x2, 0xf4, 0x10, 0x0, 0x2, 0xf4, + 0xbd, 0x75, 0x7d, 0xd0, 0x19, 0xdf, 0xea, 0x10, + + /* U+0034 "4" */ + 0x0, 0x0, 0xd, 0xa0, 0x0, 0x0, 0x0, 0xac, + 0x0, 0x0, 0x0, 0x7, 0xe1, 0x0, 0x0, 0x0, + 0x4f, 0x40, 0x10, 0x0, 0x2, 0xf6, 0x0, 0xf5, + 0x0, 0x1d, 0xa0, 0x0, 0xf5, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xf3, 0x13, 0x33, 0x33, 0xf7, 0x30, + 0x0, 0x0, 0x0, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xf5, 0x0, + + /* U+0035 "5" */ + 0x9, 0xff, 0xff, 0xf0, 0xa, 0xb4, 0x44, 0x40, + 0xc, 0x80, 0x0, 0x0, 0xe, 0x70, 0x0, 0x0, + 0xf, 0xff, 0xfc, 0x40, 0x3, 0x34, 0x5c, 0xf2, + 0x0, 0x0, 0x0, 0xf7, 0x10, 0x0, 0x0, 0xf7, + 0x8e, 0x85, 0x6c, 0xf1, 0x8, 0xdf, 0xfb, 0x30, + + /* U+0036 "6" */ + 0x0, 0x2a, 0xef, 0xd5, 0x0, 0x3f, 0xd6, 0x57, + 0x40, 0xc, 0xc0, 0x0, 0x0, 0x2, 0xf4, 0x0, + 0x0, 0x0, 0x4f, 0x5b, 0xff, 0xa1, 0x4, 0xfe, + 0x84, 0x5d, 0xd0, 0x3f, 0x80, 0x0, 0x3f, 0x30, + 0xe8, 0x0, 0x3, 0xf2, 0x6, 0xf8, 0x45, 0xdc, + 0x0, 0x5, 0xdf, 0xe9, 0x10, + + /* U+0037 "7" */ + 0x9f, 0xff, 0xff, 0xfd, 0x9d, 0x44, 0x44, 0xe9, + 0x9c, 0x0, 0x4, 0xf2, 0x0, 0x0, 0xb, 0xb0, + 0x0, 0x0, 0x2f, 0x40, 0x0, 0x0, 0xad, 0x0, + 0x0, 0x1, 0xf6, 0x0, 0x0, 0x8, 0xe0, 0x0, + 0x0, 0xe, 0x80, 0x0, 0x0, 0x6f, 0x10, 0x0, + + /* U+0038 "8" */ + 0x1, 0x9e, 0xfe, 0x91, 0x0, 0xbe, 0x63, 0x6e, + 0xc0, 0xf, 0x60, 0x0, 0x6f, 0x0, 0xcc, 0x20, + 0x2b, 0xc0, 0x2, 0xef, 0xff, 0xe2, 0x0, 0xdc, + 0x42, 0x4c, 0xd0, 0x5f, 0x20, 0x0, 0x1f, 0x55, + 0xf2, 0x0, 0x2, 0xf5, 0xe, 0xd5, 0x35, 0xde, + 0x0, 0x1a, 0xef, 0xea, 0x10, + + /* U+0039 "9" */ + 0x3, 0xbf, 0xea, 0x20, 0x2f, 0xa4, 0x4b, 0xe1, + 0x8e, 0x0, 0x0, 0xe9, 0x9d, 0x0, 0x0, 0xdd, + 0x4f, 0x71, 0x29, 0xff, 0x7, 0xff, 0xfc, 0x9e, + 0x0, 0x2, 0x10, 0xac, 0x0, 0x0, 0x2, 0xf6, + 0x7, 0x65, 0x8f, 0xb0, 0xa, 0xef, 0xd7, 0x0, + + /* U+003A ":" */ + 0x2e, 0x53, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0x52, 0xe4, + + /* U+003B ";" */ + 0x2e, 0x53, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0x52, 0xf6, 0xd, 0x21, 0xd0, 0x1, + 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x6c, 0xf2, + 0x1, 0x8e, 0xd6, 0x0, 0xf, 0xc3, 0x0, 0x0, + 0xa, 0xfb, 0x40, 0x0, 0x0, 0x17, 0xee, 0x70, + 0x0, 0x0, 0x5, 0xc3, 0x0, 0x0, 0x0, 0x0, + + /* U+003D "=" */ + 0x1f, 0xff, 0xff, 0xf3, 0x3, 0x33, 0x33, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xf3, 0x3, 0x33, 0x33, 0x30, + + /* U+003E ">" */ + 0x4, 0x0, 0x0, 0x0, 0xe, 0xd7, 0x10, 0x0, + 0x0, 0x5c, 0xf9, 0x20, 0x0, 0x0, 0x2a, 0xf2, + 0x0, 0x3, 0xaf, 0xb1, 0x6, 0xde, 0x82, 0x0, + 0x1c, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x7, 0xdf, 0xea, 0x10, 0x9e, 0x74, 0x6e, 0xc0, + 0x1, 0x0, 0x6, 0xf0, 0x0, 0x0, 0x9, 0xc0, + 0x0, 0x0, 0x8e, 0x20, 0x0, 0x6, 0xf2, 0x0, + 0x0, 0x8, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x80, 0x0, 0x0, 0xc, 0x90, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x6c, 0xef, 0xda, 0x40, 0x0, 0x0, + 0x3d, 0xa4, 0x10, 0x16, 0xd9, 0x0, 0x1, 0xe5, + 0x9, 0xee, 0x98, 0xca, 0x90, 0xa, 0x80, 0xbd, + 0x43, 0xaf, 0xc0, 0xd3, 0xf, 0x13, 0xf2, 0x0, + 0xc, 0xc0, 0x69, 0x3c, 0x6, 0xd0, 0x0, 0x7, + 0xc0, 0x3b, 0x4b, 0x6, 0xd0, 0x0, 0x7, 0xc0, + 0x2c, 0x3c, 0x3, 0xf2, 0x0, 0xc, 0xc0, 0x4a, + 0xf, 0x10, 0xbd, 0x43, 0x9e, 0xe3, 0xc5, 0xa, + 0x80, 0x9, 0xee, 0x91, 0xcf, 0x90, 0x1, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xa4, + 0x10, 0x28, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xef, + 0xd9, 0x10, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0xc, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xd7, 0x0, 0x0, 0x0, 0x0, 0xb9, 0x6e, + 0x0, 0x0, 0x0, 0x2, 0xf2, 0xe, 0x50, 0x0, + 0x0, 0x9, 0xa0, 0x7, 0xd0, 0x0, 0x0, 0x1f, + 0x30, 0x0, 0xf4, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0xe7, 0x33, 0x33, 0x4f, 0x20, + 0x5, 0xf0, 0x0, 0x0, 0xc, 0x90, 0xc, 0x90, + 0x0, 0x0, 0x6, 0xf1, + + /* U+0042 "B" */ + 0x8f, 0xff, 0xfe, 0xc4, 0x8, 0xe3, 0x33, 0x4b, + 0xf2, 0x8e, 0x0, 0x0, 0x1f, 0x58, 0xe0, 0x0, + 0x18, 0xf1, 0x8f, 0xff, 0xff, 0xf8, 0x8, 0xe3, + 0x33, 0x37, 0xf6, 0x8e, 0x0, 0x0, 0x9, 0xc8, + 0xe0, 0x0, 0x0, 0x9d, 0x8e, 0x33, 0x34, 0x7f, + 0x78, 0xff, 0xff, 0xfd, 0x70, + + /* U+0043 "C" */ + 0x0, 0x7, 0xcf, 0xfb, 0x40, 0x0, 0xcf, 0x96, + 0x6a, 0xf5, 0xa, 0xe2, 0x0, 0x0, 0x30, 0x1f, + 0x60, 0x0, 0x0, 0x0, 0x4f, 0x20, 0x0, 0x0, + 0x0, 0x4f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x60, + 0x0, 0x0, 0x0, 0xa, 0xe2, 0x0, 0x0, 0x30, + 0x1, 0xcf, 0x96, 0x6a, 0xf5, 0x0, 0x7, 0xdf, + 0xfb, 0x40, + + /* U+0044 "D" */ + 0x8f, 0xff, 0xfe, 0xa4, 0x0, 0x8e, 0x44, 0x46, + 0xcf, 0x70, 0x8e, 0x0, 0x0, 0x7, 0xf3, 0x8e, + 0x0, 0x0, 0x0, 0xda, 0x8e, 0x0, 0x0, 0x0, + 0x9d, 0x8e, 0x0, 0x0, 0x0, 0x9d, 0x8e, 0x0, + 0x0, 0x0, 0xda, 0x8e, 0x0, 0x0, 0x7, 0xf3, + 0x8e, 0x44, 0x46, 0xbf, 0x70, 0x8f, 0xff, 0xfe, + 0xa4, 0x0, + + /* U+0045 "E" */ + 0x8f, 0xff, 0xff, 0xf6, 0x8e, 0x44, 0x44, 0x41, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xc0, 0x8e, 0x33, 0x33, 0x20, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x44, 0x44, 0x42, 0x8f, 0xff, 0xff, 0xf9, + + /* U+0046 "F" */ + 0x8f, 0xff, 0xff, 0xf6, 0x8e, 0x44, 0x44, 0x41, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc0, + 0x8e, 0x33, 0x33, 0x20, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x7, 0xcf, 0xfc, 0x50, 0x0, 0xcf, 0x96, + 0x6a, 0xf6, 0xa, 0xe2, 0x0, 0x0, 0x20, 0x1f, + 0x60, 0x0, 0x0, 0x0, 0x4f, 0x20, 0x0, 0x0, + 0x0, 0x4f, 0x20, 0x0, 0x0, 0xb9, 0x1f, 0x60, + 0x0, 0x0, 0xb9, 0xa, 0xe3, 0x0, 0x0, 0xb9, + 0x0, 0xcf, 0x96, 0x6a, 0xf8, 0x0, 0x7, 0xdf, + 0xfc, 0x60, + + /* U+0048 "H" */ + 0x8e, 0x0, 0x0, 0x8, 0xe8, 0xe0, 0x0, 0x0, + 0x8e, 0x8e, 0x0, 0x0, 0x8, 0xe8, 0xe0, 0x0, + 0x0, 0x8e, 0x8f, 0xff, 0xff, 0xff, 0xe8, 0xe3, + 0x33, 0x33, 0x9e, 0x8e, 0x0, 0x0, 0x8, 0xe8, + 0xe0, 0x0, 0x0, 0x8e, 0x8e, 0x0, 0x0, 0x8, + 0xe8, 0xe0, 0x0, 0x0, 0x8e, + + /* U+0049 "I" */ + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, + + /* U+004A "J" */ + 0x2, 0xff, 0xff, 0xc0, 0x4, 0x44, 0xbc, 0x0, + 0x0, 0x9, 0xc0, 0x0, 0x0, 0x9c, 0x0, 0x0, + 0x9, 0xc0, 0x0, 0x0, 0x9c, 0x0, 0x0, 0x9, + 0xc0, 0x20, 0x0, 0xba, 0xe, 0xb5, 0x8f, 0x60, + 0x3c, 0xfe, 0x80, + + /* U+004B "K" */ + 0x8e, 0x0, 0x0, 0x4f, 0x50, 0x8e, 0x0, 0x4, + 0xf6, 0x0, 0x8e, 0x0, 0x3f, 0x70, 0x0, 0x8e, + 0x3, 0xf8, 0x0, 0x0, 0x8e, 0x2e, 0xc0, 0x0, + 0x0, 0x8e, 0xec, 0xf6, 0x0, 0x0, 0x8f, 0xb0, + 0x7f, 0x30, 0x0, 0x8e, 0x0, 0xa, 0xe1, 0x0, + 0x8e, 0x0, 0x0, 0xcc, 0x0, 0x8e, 0x0, 0x0, + 0x1e, 0xa0, + + /* U+004C "L" */ + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x44, 0x44, 0x40, 0x8f, 0xff, 0xff, 0xf2, + + /* U+004D "M" */ + 0x8e, 0x0, 0x0, 0x0, 0x8, 0xe8, 0xf7, 0x0, + 0x0, 0x2, 0xfe, 0x8f, 0xf1, 0x0, 0x0, 0xbf, + 0xe8, 0xdc, 0xa0, 0x0, 0x4f, 0x9e, 0x8d, 0x2f, + 0x30, 0xd, 0x87, 0xe8, 0xd0, 0x9c, 0x6, 0xe0, + 0x7e, 0x8d, 0x1, 0xe7, 0xe5, 0x7, 0xe8, 0xd0, + 0x6, 0xfc, 0x0, 0x7e, 0x8d, 0x0, 0xa, 0x20, + 0x7, 0xe8, 0xd0, 0x0, 0x0, 0x0, 0x7e, + + /* U+004E "N" */ + 0x8e, 0x10, 0x0, 0x8, 0xe8, 0xfc, 0x0, 0x0, + 0x8e, 0x8f, 0xf9, 0x0, 0x8, 0xe8, 0xe6, 0xf6, + 0x0, 0x8e, 0x8e, 0x9, 0xf3, 0x8, 0xe8, 0xe0, + 0xc, 0xe1, 0x8e, 0x8e, 0x0, 0x1e, 0xb8, 0xe8, + 0xe0, 0x0, 0x3f, 0xee, 0x8e, 0x0, 0x0, 0x6f, + 0xe8, 0xe0, 0x0, 0x0, 0xae, + + /* U+004F "O" */ + 0x0, 0x7, 0xcf, 0xeb, 0x50, 0x0, 0x0, 0xcf, + 0x96, 0x6b, 0xf9, 0x0, 0xa, 0xe2, 0x0, 0x0, + 0x5f, 0x60, 0x1f, 0x60, 0x0, 0x0, 0xa, 0xd0, + 0x4f, 0x20, 0x0, 0x0, 0x6, 0xf0, 0x4f, 0x20, + 0x0, 0x0, 0x6, 0xf0, 0x1f, 0x60, 0x0, 0x0, + 0xa, 0xd0, 0xa, 0xe2, 0x0, 0x0, 0x5f, 0x60, + 0x0, 0xcf, 0x96, 0x6b, 0xfa, 0x0, 0x0, 0x7, + 0xdf, 0xeb, 0x50, 0x0, + + /* U+0050 "P" */ + 0x8f, 0xff, 0xfd, 0x70, 0x8, 0xe4, 0x45, 0x8f, + 0xb0, 0x8e, 0x0, 0x0, 0x5f, 0x38, 0xe0, 0x0, + 0x1, 0xf5, 0x8e, 0x0, 0x0, 0x3f, 0x48, 0xe0, + 0x1, 0x4d, 0xd0, 0x8f, 0xff, 0xff, 0xb2, 0x8, + 0xe3, 0x33, 0x10, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8, 0xe0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x7, 0xcf, 0xeb, 0x50, 0x0, 0x0, 0xcf, + 0x96, 0x6b, 0xf9, 0x0, 0xa, 0xe2, 0x0, 0x0, + 0x5f, 0x60, 0x1f, 0x60, 0x0, 0x0, 0xa, 0xd0, + 0x4f, 0x20, 0x0, 0x0, 0x6, 0xf0, 0x4f, 0x20, + 0x0, 0x0, 0x5, 0xf0, 0x1f, 0x60, 0x0, 0x0, + 0xa, 0xd0, 0xa, 0xe2, 0x0, 0x0, 0x5f, 0x60, + 0x1, 0xdf, 0x85, 0x5a, 0xfa, 0x0, 0x0, 0x8, + 0xdf, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x1, 0xec, + 0x21, 0x94, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, + + /* U+0052 "R" */ + 0x8f, 0xff, 0xfd, 0x70, 0x8, 0xe4, 0x45, 0x8f, + 0xb0, 0x8e, 0x0, 0x0, 0x5f, 0x38, 0xe0, 0x0, + 0x1, 0xf5, 0x8e, 0x0, 0x0, 0x3f, 0x38, 0xe0, + 0x1, 0x4d, 0xd0, 0x8f, 0xff, 0xff, 0xc2, 0x8, + 0xe3, 0x33, 0xda, 0x0, 0x8e, 0x0, 0x2, 0xf6, + 0x8, 0xe0, 0x0, 0x5, 0xf3, + + /* U+0053 "S" */ + 0x1, 0x9e, 0xfd, 0xa2, 0x0, 0xce, 0x64, 0x6b, + 0x70, 0x2f, 0x40, 0x0, 0x0, 0x1, 0xf8, 0x0, + 0x0, 0x0, 0x6, 0xfd, 0x95, 0x0, 0x0, 0x1, + 0x6a, 0xee, 0x50, 0x0, 0x0, 0x0, 0x9f, 0x0, + 0x20, 0x0, 0x5, 0xf1, 0x3f, 0xa5, 0x47, 0xeb, + 0x0, 0x4b, 0xef, 0xe9, 0x10, + + /* U+0054 "T" */ + 0xff, 0xff, 0xff, 0xff, 0x24, 0x44, 0xbd, 0x44, + 0x40, 0x0, 0x9, 0xc0, 0x0, 0x0, 0x0, 0x9c, + 0x0, 0x0, 0x0, 0x9, 0xc0, 0x0, 0x0, 0x0, + 0x9c, 0x0, 0x0, 0x0, 0x9, 0xc0, 0x0, 0x0, + 0x0, 0x9c, 0x0, 0x0, 0x0, 0x9, 0xc0, 0x0, + 0x0, 0x0, 0x9c, 0x0, 0x0, + + /* U+0055 "U" */ + 0x9c, 0x0, 0x0, 0xb, 0xa9, 0xc0, 0x0, 0x0, + 0xba, 0x9c, 0x0, 0x0, 0xb, 0xa9, 0xc0, 0x0, + 0x0, 0xba, 0x9c, 0x0, 0x0, 0xb, 0xa9, 0xc0, + 0x0, 0x0, 0xba, 0x8e, 0x0, 0x0, 0xd, 0x94, + 0xf4, 0x0, 0x3, 0xf5, 0xc, 0xf8, 0x68, 0xfd, + 0x0, 0x9, 0xef, 0xe9, 0x10, + + /* U+0056 "V" */ + 0xc, 0xb0, 0x0, 0x0, 0xa, 0xc0, 0x5f, 0x20, + 0x0, 0x1, 0xf5, 0x0, 0xe9, 0x0, 0x0, 0x8e, + 0x0, 0x8, 0xf0, 0x0, 0xe, 0x70, 0x0, 0x1f, + 0x60, 0x5, 0xf1, 0x0, 0x0, 0xad, 0x0, 0xc9, + 0x0, 0x0, 0x3, 0xf4, 0x3f, 0x30, 0x0, 0x0, + 0xc, 0xba, 0xc0, 0x0, 0x0, 0x0, 0x5f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0xee, 0x0, 0x0, + + /* U+0057 "W" */ + 0x6f, 0x10, 0x0, 0xd, 0xb0, 0x0, 0x2, 0xf2, + 0x1f, 0x60, 0x0, 0x3f, 0xf1, 0x0, 0x8, 0xd0, + 0xb, 0xb0, 0x0, 0x8b, 0xe6, 0x0, 0xd, 0x70, + 0x6, 0xf0, 0x0, 0xe6, 0x9b, 0x0, 0x2f, 0x20, + 0x1, 0xf5, 0x3, 0xf1, 0x4f, 0x10, 0x8d, 0x0, + 0x0, 0xca, 0x9, 0xb0, 0xe, 0x60, 0xd8, 0x0, + 0x0, 0x6f, 0xe, 0x60, 0x9, 0xb2, 0xf3, 0x0, + 0x0, 0x1f, 0x9f, 0x10, 0x4, 0xf9, 0xd0, 0x0, + 0x0, 0xc, 0xfb, 0x0, 0x0, 0xef, 0x80, 0x0, + 0x0, 0x7, 0xf6, 0x0, 0x0, 0x9f, 0x30, 0x0, + + /* U+0058 "X" */ + 0x3f, 0x50, 0x0, 0xd, 0xa0, 0x8, 0xf2, 0x0, + 0x9d, 0x0, 0x0, 0xcc, 0x4, 0xf3, 0x0, 0x0, + 0x2f, 0x9e, 0x70, 0x0, 0x0, 0x6, 0xfc, 0x0, + 0x0, 0x0, 0x9, 0xfe, 0x10, 0x0, 0x0, 0x4f, + 0x4d, 0xb0, 0x0, 0x1, 0xe8, 0x2, 0xf7, 0x0, + 0xb, 0xd0, 0x0, 0x7f, 0x20, 0x7f, 0x20, 0x0, + 0xb, 0xd0, + + /* U+0059 "Y" */ + 0xc, 0xb0, 0x0, 0x0, 0x9c, 0x0, 0x2f, 0x50, + 0x0, 0x2f, 0x30, 0x0, 0x9e, 0x0, 0xc, 0x90, + 0x0, 0x0, 0xe8, 0x5, 0xf1, 0x0, 0x0, 0x5, + 0xf3, 0xe6, 0x0, 0x0, 0x0, 0xc, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0x40, 0x0, 0x0, 0x0, + 0x2, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x30, + 0x0, 0x0, 0x0, 0x2, 0xf3, 0x0, 0x0, + + /* U+005A "Z" */ + 0x4f, 0xff, 0xff, 0xff, 0x91, 0x44, 0x44, 0x4a, + 0xf3, 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x1, + 0xea, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, + 0x9e, 0x10, 0x0, 0x0, 0x6f, 0x40, 0x0, 0x0, + 0x3f, 0x70, 0x0, 0x0, 0x1e, 0xd4, 0x44, 0x44, + 0x36, 0xff, 0xff, 0xff, 0xfc, + + /* U+005B "[" */ + 0x8f, 0xf6, 0x8d, 0x31, 0x8d, 0x0, 0x8d, 0x0, + 0x8d, 0x0, 0x8d, 0x0, 0x8d, 0x0, 0x8d, 0x0, + 0x8d, 0x0, 0x8d, 0x0, 0x8d, 0x0, 0x8d, 0x0, + 0x8d, 0x31, 0x8f, 0xf6, + + /* U+005C "\\" */ + 0x5d, 0x0, 0x0, 0x0, 0xf2, 0x0, 0x0, 0xb, + 0x80, 0x0, 0x0, 0x6d, 0x0, 0x0, 0x1, 0xf2, + 0x0, 0x0, 0xb, 0x80, 0x0, 0x0, 0x6d, 0x0, + 0x0, 0x1, 0xf2, 0x0, 0x0, 0xb, 0x70, 0x0, + 0x0, 0x6d, 0x0, 0x0, 0x1, 0xf2, 0x0, 0x0, + 0xb, 0x70, 0x0, 0x0, 0x6d, 0x0, 0x0, 0x1, + 0xf2, + + /* U+005D "]" */ + 0xbf, 0xf3, 0x25, 0xf3, 0x2, 0xf3, 0x2, 0xf3, + 0x2, 0xf3, 0x2, 0xf3, 0x2, 0xf3, 0x2, 0xf3, + 0x2, 0xf3, 0x2, 0xf3, 0x2, 0xf3, 0x2, 0xf3, + 0x25, 0xf3, 0xbf, 0xf3, + + /* U+005E "^" */ + 0x0, 0xad, 0x0, 0x0, 0x1e, 0xc4, 0x0, 0x8, + 0x85, 0xa0, 0x0, 0xe2, 0xe, 0x10, 0x5b, 0x0, + 0x97, 0xb, 0x50, 0x2, 0xe0, + + /* U+005F "_" */ + 0xee, 0xee, 0xee, 0xe0, + + /* U+0060 "`" */ + 0xb, 0xc0, 0x0, 0x9, 0xb0, + + /* U+0061 "a" */ + 0x4, 0xcf, 0xea, 0x10, 0xb, 0x74, 0x5d, 0xb0, + 0x0, 0x0, 0x4, 0xf0, 0x4, 0xce, 0xee, 0xf2, + 0x1f, 0x82, 0x14, 0xf2, 0x4f, 0x10, 0x4, 0xf2, + 0x1f, 0x70, 0x3d, 0xf2, 0x4, 0xdf, 0xd7, 0xf2, + + /* U+0062 "b" */ + 0xba, 0x0, 0x0, 0x0, 0xba, 0x0, 0x0, 0x0, + 0xba, 0x0, 0x0, 0x0, 0xba, 0x8e, 0xfc, 0x30, + 0xbf, 0xd5, 0x4b, 0xf3, 0xbe, 0x10, 0x0, 0xca, + 0xba, 0x0, 0x0, 0x7e, 0xba, 0x0, 0x0, 0x7e, + 0xbe, 0x10, 0x0, 0xca, 0xbf, 0xd5, 0x5b, 0xf3, + 0xb9, 0x8e, 0xfc, 0x30, + + /* U+0063 "c" */ + 0x0, 0x7d, 0xfd, 0x60, 0x9, 0xf7, 0x48, 0xf4, + 0x2f, 0x50, 0x0, 0x20, 0x5f, 0x0, 0x0, 0x0, + 0x5f, 0x0, 0x0, 0x0, 0x2f, 0x50, 0x0, 0x20, + 0x9, 0xf7, 0x48, 0xf4, 0x0, 0x7d, 0xfd, 0x60, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x1f, 0x40, 0x0, 0x0, 0x1, + 0xf4, 0x0, 0x0, 0x0, 0x1f, 0x40, 0x8, 0xef, + 0xc4, 0xf4, 0xa, 0xf7, 0x48, 0xff, 0x42, 0xf5, + 0x0, 0x7, 0xf4, 0x5f, 0x0, 0x0, 0x2f, 0x45, + 0xf0, 0x0, 0x1, 0xf4, 0x2f, 0x50, 0x0, 0x6f, + 0x40, 0xae, 0x63, 0x7e, 0xf4, 0x0, 0x8e, 0xfc, + 0x4f, 0x40, + + /* U+0065 "e" */ + 0x0, 0x8e, 0xfc, 0x40, 0xa, 0xd5, 0x38, 0xf4, + 0x2f, 0x20, 0x0, 0x8c, 0x5f, 0xee, 0xee, 0xff, + 0x5f, 0x21, 0x11, 0x11, 0x2f, 0x70, 0x0, 0x10, + 0x9, 0xf8, 0x46, 0xe4, 0x0, 0x7d, 0xfe, 0x80, + + /* U+0066 "f" */ + 0x0, 0x9e, 0xe3, 0x5, 0xf4, 0x41, 0x8, 0xc0, + 0x0, 0xcf, 0xff, 0xf0, 0x29, 0xd3, 0x20, 0x8, + 0xd0, 0x0, 0x8, 0xd0, 0x0, 0x8, 0xd0, 0x0, + 0x8, 0xd0, 0x0, 0x8, 0xd0, 0x0, 0x8, 0xd0, + 0x0, + + /* U+0067 "g" */ + 0x0, 0x7e, 0xfc, 0x4e, 0x60, 0xaf, 0x74, 0x7f, + 0xf6, 0x2f, 0x50, 0x0, 0x5f, 0x65, 0xf0, 0x0, + 0x0, 0xf6, 0x5f, 0x0, 0x0, 0xf, 0x62, 0xf6, + 0x0, 0x6, 0xf6, 0x9, 0xf7, 0x47, 0xff, 0x50, + 0x7, 0xef, 0xc4, 0xf5, 0x0, 0x0, 0x0, 0x3f, + 0x20, 0xcb, 0x64, 0x6e, 0xb0, 0x3, 0xae, 0xfd, + 0x80, 0x0, + + /* U+0068 "h" */ + 0xba, 0x0, 0x0, 0x0, 0xba, 0x0, 0x0, 0x0, + 0xba, 0x0, 0x0, 0x0, 0xba, 0x8e, 0xfb, 0x20, + 0xbf, 0xc5, 0x6d, 0xd0, 0xbe, 0x0, 0x3, 0xf2, + 0xba, 0x0, 0x0, 0xf4, 0xba, 0x0, 0x0, 0xf5, + 0xba, 0x0, 0x0, 0xf5, 0xba, 0x0, 0x0, 0xf5, + 0xba, 0x0, 0x0, 0xf5, + + /* U+0069 "i" */ + 0xba, 0xa8, 0x0, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, + + /* U+006A "j" */ + 0x0, 0xa, 0xb0, 0x0, 0x99, 0x0, 0x0, 0x0, + 0x0, 0xab, 0x0, 0xa, 0xb0, 0x0, 0xab, 0x0, + 0xa, 0xb0, 0x0, 0xab, 0x0, 0xa, 0xb0, 0x0, + 0xab, 0x0, 0xa, 0xb0, 0x0, 0xaa, 0x6, 0x4e, + 0x71, 0xdf, 0xa0, + + /* U+006B "k" */ + 0xba, 0x0, 0x0, 0x0, 0xba, 0x0, 0x0, 0x0, + 0xba, 0x0, 0x0, 0x0, 0xba, 0x0, 0x1c, 0xc0, + 0xba, 0x1, 0xcc, 0x0, 0xba, 0x1c, 0xd1, 0x0, + 0xbb, 0xcf, 0x60, 0x0, 0xbf, 0xdb, 0xe1, 0x0, + 0xbd, 0x11, 0xdc, 0x0, 0xba, 0x0, 0x3f, 0x70, + 0xba, 0x0, 0x7, 0xf3, + + /* U+006C "l" */ + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, + + /* U+006D "m" */ + 0xb9, 0x9e, 0xfa, 0x15, 0xdf, 0xd4, 0xb, 0xfb, + 0x45, 0xed, 0xe6, 0x4a, 0xf2, 0xbe, 0x0, 0x6, + 0xf6, 0x0, 0xe, 0x7b, 0xa0, 0x0, 0x4f, 0x20, + 0x0, 0xc9, 0xba, 0x0, 0x3, 0xf1, 0x0, 0xc, + 0x9b, 0xa0, 0x0, 0x3f, 0x10, 0x0, 0xc9, 0xba, + 0x0, 0x3, 0xf1, 0x0, 0xc, 0x9b, 0xa0, 0x0, + 0x3f, 0x10, 0x0, 0xc9, + + /* U+006E "n" */ + 0xb9, 0x9e, 0xfb, 0x20, 0xbf, 0xb4, 0x5d, 0xd0, + 0xbe, 0x0, 0x3, 0xf2, 0xba, 0x0, 0x0, 0xf4, + 0xba, 0x0, 0x0, 0xf5, 0xba, 0x0, 0x0, 0xf5, + 0xba, 0x0, 0x0, 0xf5, 0xba, 0x0, 0x0, 0xf5, + + /* U+006F "o" */ + 0x0, 0x7d, 0xfd, 0x60, 0x0, 0x9f, 0x74, 0x8f, + 0x70, 0x2f, 0x50, 0x0, 0x7f, 0x5, 0xf0, 0x0, + 0x1, 0xf3, 0x5f, 0x0, 0x0, 0x2f, 0x32, 0xf5, + 0x0, 0x7, 0xf0, 0x9, 0xf7, 0x48, 0xf7, 0x0, + 0x7, 0xdf, 0xd6, 0x0, + + /* U+0070 "p" */ + 0xb9, 0x8e, 0xfc, 0x30, 0xbf, 0xc4, 0x3a, 0xf3, + 0xbe, 0x10, 0x0, 0xca, 0xba, 0x0, 0x0, 0x7e, + 0xba, 0x0, 0x0, 0x7e, 0xbe, 0x10, 0x0, 0xca, + 0xbf, 0xd5, 0x5b, 0xf3, 0xba, 0x7e, 0xfc, 0x30, + 0xba, 0x0, 0x0, 0x0, 0xba, 0x0, 0x0, 0x0, + 0xba, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x8e, 0xfc, 0x3f, 0x40, 0xaf, 0x74, 0x8e, + 0xf4, 0x2f, 0x50, 0x0, 0x7f, 0x45, 0xf0, 0x0, + 0x1, 0xf4, 0x5f, 0x0, 0x0, 0x2f, 0x42, 0xf5, + 0x0, 0x7, 0xf4, 0xa, 0xf7, 0x48, 0xff, 0x40, + 0x8, 0xef, 0xc4, 0xf4, 0x0, 0x0, 0x0, 0x1f, + 0x40, 0x0, 0x0, 0x1, 0xf4, 0x0, 0x0, 0x0, + 0x1f, 0x40, + + /* U+0072 "r" */ + 0xb9, 0x8e, 0x4b, 0xfd, 0x71, 0xbe, 0x10, 0xb, + 0xb0, 0x0, 0xba, 0x0, 0xb, 0xa0, 0x0, 0xba, + 0x0, 0xb, 0xa0, 0x0, + + /* U+0073 "s" */ + 0x5, 0xdf, 0xea, 0x13, 0xf7, 0x35, 0xa0, 0x6f, + 0x0, 0x0, 0x1, 0xee, 0x96, 0x10, 0x1, 0x6a, + 0xef, 0x30, 0x0, 0x0, 0xd9, 0x6c, 0x64, 0x6f, + 0x62, 0xae, 0xfd, 0x70, + + /* U+0074 "t" */ + 0x8, 0xd0, 0x0, 0x8, 0xd0, 0x0, 0xcf, 0xff, + 0xf0, 0x29, 0xd3, 0x20, 0x8, 0xd0, 0x0, 0x8, + 0xd0, 0x0, 0x8, 0xd0, 0x0, 0x8, 0xd0, 0x0, + 0x5, 0xf5, 0x51, 0x0, 0x9f, 0xe3, + + /* U+0075 "u" */ + 0xc8, 0x0, 0x2, 0xf3, 0xc8, 0x0, 0x2, 0xf3, + 0xc8, 0x0, 0x2, 0xf3, 0xc8, 0x0, 0x2, 0xf3, + 0xc9, 0x0, 0x3, 0xf3, 0xab, 0x0, 0x7, 0xf3, + 0x5f, 0x83, 0x7e, 0xf3, 0x6, 0xdf, 0xc5, 0xf3, + + /* U+0076 "v" */ + 0xd, 0x90, 0x0, 0xa, 0xa0, 0x6e, 0x0, 0x1, + 0xf3, 0x0, 0xf5, 0x0, 0x7d, 0x0, 0x9, 0xc0, + 0xe, 0x60, 0x0, 0x3f, 0x24, 0xf0, 0x0, 0x0, + 0xc8, 0xb9, 0x0, 0x0, 0x6, 0xff, 0x30, 0x0, + 0x0, 0xf, 0xc0, 0x0, + + /* U+0077 "w" */ + 0xc8, 0x0, 0x6, 0xf1, 0x0, 0xd, 0x56, 0xd0, + 0x0, 0xcf, 0x60, 0x3, 0xf0, 0x1f, 0x30, 0x2f, + 0x9c, 0x0, 0x9a, 0x0, 0xb8, 0x7, 0xb2, 0xf1, + 0xe, 0x40, 0x5, 0xe0, 0xd6, 0xc, 0x74, 0xe0, + 0x0, 0xf, 0x6f, 0x0, 0x7c, 0x99, 0x0, 0x0, + 0xaf, 0xa0, 0x1, 0xff, 0x40, 0x0, 0x5, 0xf4, + 0x0, 0xb, 0xe0, 0x0, + + /* U+0078 "x" */ + 0x4f, 0x30, 0x7, 0xe1, 0x9, 0xd0, 0x2f, 0x40, + 0x0, 0xd9, 0xd9, 0x0, 0x0, 0x3f, 0xd0, 0x0, + 0x0, 0x4f, 0xe1, 0x0, 0x1, 0xe7, 0xbb, 0x0, + 0xb, 0xb0, 0x1e, 0x70, 0x7e, 0x10, 0x5, 0xf3, + + /* U+0079 "y" */ + 0xd, 0x90, 0x0, 0xa, 0xa0, 0x6f, 0x0, 0x1, + 0xf3, 0x0, 0xf6, 0x0, 0x7d, 0x0, 0x9, 0xc0, + 0xd, 0x60, 0x0, 0x2f, 0x34, 0xf0, 0x0, 0x0, + 0xc9, 0xa9, 0x0, 0x0, 0x5, 0xff, 0x20, 0x0, + 0x0, 0xe, 0xc0, 0x0, 0x0, 0x0, 0xe5, 0x0, + 0x0, 0x94, 0xad, 0x0, 0x0, 0x1b, 0xfc, 0x20, + 0x0, 0x0, + + /* U+007A "z" */ + 0x5f, 0xff, 0xff, 0xa1, 0x33, 0x37, 0xf4, 0x0, + 0x1, 0xe7, 0x0, 0x0, 0xcb, 0x0, 0x0, 0x8e, + 0x10, 0x0, 0x4f, 0x40, 0x0, 0x1e, 0xa3, 0x33, + 0x26, 0xff, 0xff, 0xfc, + + /* U+007B "{" */ + 0x0, 0x6e, 0xa0, 0xf, 0x92, 0x1, 0xf4, 0x0, + 0x1f, 0x40, 0x1, 0xf4, 0x0, 0x3f, 0x30, 0x3f, + 0xc0, 0x0, 0x6f, 0x30, 0x1, 0xf4, 0x0, 0x1f, + 0x40, 0x1, 0xf4, 0x0, 0x1f, 0x40, 0x0, 0xfa, + 0x20, 0x5, 0xea, + + /* U+007C "|" */ + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + + /* U+007D "}" */ + 0xbe, 0x50, 0x2, 0xae, 0x0, 0x5, 0xf0, 0x0, + 0x5f, 0x0, 0x5, 0xf0, 0x0, 0x4f, 0x10, 0x0, + 0xdf, 0x10, 0x4f, 0x50, 0x5, 0xf0, 0x0, 0x5f, + 0x0, 0x5, 0xf0, 0x0, 0x5f, 0x0, 0x2a, 0xe0, + 0xb, 0xe4, 0x0, + + /* U+007E "~" */ + 0x7, 0xec, 0x40, 0xb4, 0x1e, 0x25, 0xdf, 0xc0, + 0x1, 0x0, 0x0, 0x0, + + /* U+00B0 "°" */ + 0x4, 0xcc, 0x30, 0x2b, 0x1, 0xc0, 0x57, 0x0, + 0x93, 0x2b, 0x1, 0xc0, 0x5, 0xcc, 0x30, + + /* U+2022 "•" */ + 0x6, 0xa1, 0xf, 0xf6, 0xb, 0xe2, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xfb, 0x0, + 0x0, 0x0, 0x4, 0x9d, 0xff, 0xff, 0xd0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xdf, 0xd0, 0x0, 0xa, + 0xff, 0xff, 0xb6, 0x10, 0xed, 0x0, 0x0, 0xaf, + 0x94, 0x0, 0x0, 0xe, 0xd0, 0x0, 0xa, 0xf1, + 0x0, 0x0, 0x0, 0xed, 0x0, 0x0, 0xaf, 0x10, + 0x0, 0x0, 0xe, 0xd0, 0x0, 0xa, 0xf1, 0x0, + 0x0, 0x45, 0xfd, 0x0, 0x0, 0xaf, 0x10, 0x1, + 0xef, 0xff, 0xd0, 0x17, 0x9d, 0xf1, 0x0, 0x5f, + 0xff, 0xfc, 0xe, 0xff, 0xff, 0x10, 0x0, 0xaf, + 0xfd, 0x31, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x1, + 0x0, 0x3, 0xbd, 0xa3, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F008 "" */ + 0x50, 0x18, 0x88, 0x88, 0x88, 0x84, 0x5, 0xfa, + 0xbf, 0xdd, 0xdd, 0xdd, 0xfd, 0xaf, 0xe4, 0x7f, + 0x10, 0x0, 0x0, 0xca, 0x4e, 0xe0, 0x4f, 0x10, + 0x0, 0x0, 0xc8, 0xe, 0xfe, 0xef, 0x10, 0x0, + 0x0, 0xcf, 0xef, 0xe0, 0x3f, 0xee, 0xee, 0xee, + 0xf8, 0xe, 0xf6, 0x8f, 0x76, 0x66, 0x66, 0xeb, + 0x6f, 0xf8, 0xaf, 0x10, 0x0, 0x0, 0xcc, 0x8f, + 0xe0, 0x3f, 0x10, 0x0, 0x0, 0xc8, 0xe, 0xfc, + 0xdf, 0x65, 0x55, 0x55, 0xee, 0xcf, 0xc2, 0x5f, + 0xff, 0xff, 0xff, 0xf9, 0x2c, + + /* U+F00B "" */ + 0x57, 0x75, 0x5, 0x77, 0x77, 0x77, 0x75, 0xff, + 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xe, + 0xff, 0xff, 0xff, 0xfe, 0x1, 0x10, 0x0, 0x11, + 0x11, 0x11, 0x10, 0xef, 0xfe, 0xe, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0x68, 0x87, 0x7, 0x88, 0x88, 0x88, 0x86, 0x68, + 0x87, 0x7, 0x88, 0x88, 0x88, 0x86, 0xff, 0xff, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0xd, 0xff, + 0xff, 0xff, 0xfd, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xe2, 0x2d, 0x60, 0x0, 0x1, + 0xdf, 0xfe, 0x20, 0xdf, 0xf7, 0x0, 0x1d, 0xff, + 0xe2, 0x0, 0x8f, 0xff, 0x71, 0xdf, 0xfe, 0x20, + 0x0, 0x8, 0xff, 0xfe, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7d, 0x20, 0x0, 0x0, 0x0, + + /* U+F00D "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x60, 0x0, + 0xb, 0xe2, 0xef, 0xf6, 0x0, 0xbf, 0xf8, 0x4f, + 0xff, 0x6b, 0xff, 0xd1, 0x4, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x5f, 0xff, 0xe1, 0x0, 0x0, 0xbf, + 0xff, 0xf6, 0x0, 0xb, 0xff, 0xdf, 0xff, 0x60, + 0xbf, 0xfd, 0x14, 0xff, 0xf5, 0xcf, 0xd1, 0x0, + 0x4f, 0xf6, 0x17, 0x10, 0x0, 0x3, 0x60, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0x21, 0xff, 0x12, 0xf7, 0x0, 0x6, 0xff, 0x61, + 0xff, 0x16, 0xff, 0x60, 0x1f, 0xf9, 0x1, 0xff, + 0x10, 0x9f, 0xf1, 0x6f, 0xe0, 0x1, 0xff, 0x10, + 0xe, 0xf6, 0xaf, 0x80, 0x1, 0xff, 0x10, 0x8, + 0xfa, 0xcf, 0x60, 0x1, 0xff, 0x10, 0x6, 0xfc, + 0xaf, 0x80, 0x0, 0xaa, 0x0, 0x8, 0xfb, 0x7f, + 0xd0, 0x0, 0x0, 0x0, 0xd, 0xf7, 0x1f, 0xf8, + 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x7, 0xff, 0x91, + 0x0, 0x2a, 0xff, 0x70, 0x0, 0x9f, 0xff, 0xee, + 0xff, 0xf9, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xfd, + 0x50, 0x0, 0x0, 0x0, 0x2, 0x44, 0x20, 0x0, + 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xc0, 0x0, 0x0, 0x3, 0xd6, 0xdf, + 0xff, 0xfd, 0x6d, 0x30, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x5f, 0xff, 0xff, 0xaa, 0xff, + 0xff, 0xf5, 0x1a, 0xff, 0xf4, 0x0, 0x4f, 0xff, + 0xa1, 0x3, 0xff, 0xd0, 0x0, 0xd, 0xff, 0x30, + 0x4, 0xff, 0xf0, 0x0, 0xf, 0xff, 0x40, 0x4f, + 0xff, 0xfb, 0x22, 0xbf, 0xff, 0xf4, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x9, 0xfe, 0xff, + 0xff, 0xff, 0xef, 0x90, 0x0, 0x50, 0x5e, 0xff, + 0xe5, 0x5, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x77, 0x40, 0x0, + 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x3, 0x10, 0x3, 0x41, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf5, 0xd, 0xf5, 0x0, + 0x0, 0x0, 0x1b, 0xfd, 0xff, 0x8d, 0xf5, 0x0, + 0x0, 0x2, 0xdf, 0xb1, 0x2d, 0xff, 0xf5, 0x0, + 0x0, 0x4f, 0xf8, 0x3e, 0xc2, 0xbf, 0xf5, 0x0, + 0x7, 0xff, 0x55, 0xff, 0xfe, 0x39, 0xfe, 0x40, + 0x9f, 0xe3, 0x8f, 0xff, 0xff, 0xf5, 0x6f, 0xf6, + 0xac, 0x2a, 0xff, 0xff, 0xff, 0xff, 0x73, 0xe6, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x6f, 0xff, 0xd7, 0x7f, 0xff, 0xf2, 0x0, + 0x0, 0x6f, 0xff, 0x90, 0xd, 0xff, 0xf2, 0x0, + 0x0, 0x6f, 0xff, 0x90, 0xd, 0xff, 0xf2, 0x0, + 0x0, 0x4f, 0xff, 0x70, 0xb, 0xff, 0xe1, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x0, 0x79, 0x99, + 0x82, 0xde, 0x28, 0x99, 0x97, 0xff, 0xff, 0xfb, + 0x22, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xb3, 0xcf, 0xac, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xca, + + /* U+F01C "" */ + 0x0, 0x6, 0xbb, 0xbb, 0xbb, 0xba, 0x30, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0xef, 0x30, 0x0, 0x0, 0x6, 0xfb, 0x0, + 0x9, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x50, + 0x4f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xe1, + 0xdf, 0x84, 0x42, 0x0, 0x0, 0x34, 0x4b, 0xf9, + 0xff, 0xff, 0xfd, 0x0, 0x1, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0x98, 0x8b, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, + 0x1, 0x8d, 0xff, 0xc6, 0x0, 0xef, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xe4, 0xdf, 0x4, 0xff, 0xb3, + 0x0, 0x4c, 0xff, 0xff, 0xe, 0xf9, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x6f, 0xc0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0x8e, 0x50, 0x0, 0x1, 0xde, 0xee, + 0xed, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, 0x21, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x8, 0xf8, 0xff, 0xfb, + 0xbc, 0x10, 0x0, 0x1e, 0xf4, 0xff, 0xfc, 0x10, + 0x0, 0x1, 0xdf, 0xc0, 0xfe, 0xef, 0xe8, 0x44, + 0x8e, 0xfe, 0x10, 0xfe, 0x1a, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0xfd, 0x0, 0x28, 0xbb, 0x94, 0x0, + 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x2, 0x70, 0x0, 0x2, 0xef, 0x0, + 0x2, 0xef, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x34, 0x47, 0xff, 0xf0, + 0x0, 0x5, 0xff, 0x0, 0x0, 0x5, 0xc0, 0x0, + 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x2, 0x70, 0x0, 0x0, 0x0, 0x2, + 0xef, 0x0, 0x0, 0x0, 0x2, 0xef, 0xf0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0x2, 0x20, 0xff, 0xff, + 0xff, 0xf0, 0x8e, 0x1f, 0xff, 0xff, 0xff, 0x0, + 0xe7, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0x5f, 0xff, + 0xff, 0xff, 0x8, 0x90, 0x34, 0x47, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x70, 0x0, + 0x0, 0x0, 0x2, 0x70, 0x0, 0x5, 0xfa, 0x0, + 0x0, 0x0, 0x2e, 0xf0, 0x0, 0x81, 0x4f, 0x60, + 0x0, 0x2, 0xef, 0xf0, 0x1, 0xdd, 0x7, 0xf0, + 0xdf, 0xff, 0xff, 0xf0, 0x32, 0x1e, 0x80, 0xf6, + 0xff, 0xff, 0xff, 0xf0, 0x8e, 0x27, 0xe0, 0xb9, + 0xff, 0xff, 0xff, 0xf0, 0xe, 0x73, 0xf1, 0x9b, + 0xff, 0xff, 0xff, 0xf0, 0x3f, 0x54, 0xf0, 0x9a, + 0xff, 0xff, 0xff, 0xf0, 0x89, 0xa, 0xc0, 0xd8, + 0x34, 0x47, 0xff, 0xf0, 0x0, 0x7f, 0x43, 0xf3, + 0x0, 0x0, 0x5f, 0xf0, 0x2, 0xf6, 0xc, 0xb0, + 0x0, 0x0, 0x5, 0xc0, 0x0, 0x0, 0xbf, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, + + /* U+F03E "" */ + 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0x32, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x7f, + 0xff, 0xfd, 0xff, 0xff, 0xfd, 0x10, 0xcf, 0xff, + 0xa0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x7, 0xff, 0xff, 0xf3, 0x5f, 0xa0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x3, 0x0, 0x0, 0x0, 0xcf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, + + /* U+F043 "ïƒ" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x1, 0xfa, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, 0x0, 0x0, + 0xd, 0xff, 0x70, 0x0, 0x0, 0x6f, 0xff, 0xf1, + 0x0, 0x1, 0xef, 0xff, 0xfa, 0x0, 0xb, 0xff, + 0xff, 0xff, 0x60, 0x5f, 0xff, 0xff, 0xff, 0xe0, + 0xcf, 0xff, 0xff, 0xff, 0xf6, 0xfe, 0xbf, 0xff, + 0xff, 0xf9, 0xfd, 0x4f, 0xff, 0xff, 0xf9, 0xbf, + 0x49, 0xff, 0xff, 0xf5, 0x3f, 0xe5, 0x2e, 0xff, + 0xd0, 0x6, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x28, + 0xba, 0x60, 0x0, + + /* U+F048 "ïˆ" */ + 0x4, 0x30, 0x0, 0x0, 0x31, 0x1f, 0xe0, 0x0, + 0x6, 0xf9, 0x1f, 0xe0, 0x0, 0x7f, 0xfa, 0x1f, + 0xe0, 0x9, 0xff, 0xfa, 0x1f, 0xe0, 0xaf, 0xff, + 0xfa, 0x1f, 0xeb, 0xff, 0xff, 0xfa, 0x1f, 0xff, + 0xff, 0xff, 0xfa, 0x1f, 0xff, 0xff, 0xff, 0xfa, + 0x1f, 0xe6, 0xff, 0xff, 0xfa, 0x1f, 0xe0, 0x5f, + 0xff, 0xfa, 0x1f, 0xe0, 0x4, 0xff, 0xfa, 0x1f, + 0xe0, 0x0, 0x3e, 0xfa, 0xf, 0xd0, 0x0, 0x2, + 0xd7, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "ï‹" */ + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xe6, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0xf, + 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x6a, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F04C "ïŒ" */ + 0x14, 0x44, 0x20, 0x1, 0x44, 0x42, 0xd, 0xff, + 0xff, 0x10, 0xdf, 0xff, 0xf1, 0xff, 0xff, 0xf3, + 0xf, 0xff, 0xff, 0x3f, 0xff, 0xff, 0x40, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0x40, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xf4, 0xf, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0x40, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xf4, 0xf, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0x40, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0x30, 0xff, 0xff, 0xf3, 0x9f, 0xff, + 0xc0, 0x9, 0xff, 0xfc, 0x0, + + /* U+F04D "ï" */ + 0x14, 0x44, 0x44, 0x44, 0x44, 0x42, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, + + /* U+F051 "ï‘" */ + 0x2, 0x10, 0x0, 0x0, 0x42, 0xf, 0xe2, 0x0, + 0x3, 0xfb, 0xf, 0xfe, 0x30, 0x4, 0xfb, 0xf, + 0xff, 0xf4, 0x4, 0xfb, 0xf, 0xff, 0xff, 0x54, + 0xfb, 0xf, 0xff, 0xff, 0xfa, 0xfb, 0xf, 0xff, + 0xff, 0xff, 0xfb, 0xf, 0xff, 0xff, 0xff, 0xfb, + 0xf, 0xff, 0xff, 0xd6, 0xfb, 0xf, 0xff, 0xfd, + 0x14, 0xfb, 0xf, 0xff, 0xc1, 0x4, 0xfb, 0xf, + 0xfb, 0x0, 0x4, 0xfb, 0xc, 0xa0, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x3, 0x99, 0x99, 0x99, 0x99, 0x99, 0x50, 0x5, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, + + /* U+F053 "ï“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0x90, 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x3f, + 0xfd, 0x10, 0x0, 0x3f, 0xfd, 0x10, 0x0, 0x3f, + 0xfd, 0x10, 0x0, 0x1f, 0xfd, 0x10, 0x0, 0x0, + 0xcf, 0xf4, 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x0, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0x0, 0xcf, + 0xf4, 0x0, 0x0, 0x0, 0xcf, 0xe0, 0x0, 0x0, + 0x0, 0xa4, 0x0, + + /* U+F054 "ï”" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0x10, 0x0, + 0x0, 0x1f, 0xfd, 0x10, 0x0, 0x0, 0x3f, 0xfd, + 0x10, 0x0, 0x0, 0x3f, 0xfd, 0x10, 0x0, 0x0, + 0x3f, 0xfd, 0x10, 0x0, 0x0, 0x3f, 0xfd, 0x0, + 0x0, 0x8, 0xff, 0x90, 0x0, 0x8, 0xff, 0x90, + 0x0, 0x8, 0xff, 0x90, 0x0, 0x8, 0xff, 0x90, + 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, 0x7, 0x80, + 0x0, 0x0, 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x0, 0x4, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, + 0x6, 0x99, 0x9a, 0xff, 0xc9, 0x99, 0x80, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x1, 0x11, 0x3f, 0xf7, + 0x11, 0x10, 0x0, 0x0, 0x3, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xd3, 0x0, 0x0, 0x0, + + /* U+F068 "ï¨" */ + 0x69, 0x99, 0x99, 0x99, 0x99, 0x98, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F06E "ï®" */ + 0x0, 0x0, 0x1, 0x56, 0x64, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xbf, 0xfe, 0xef, 0xf9, 0x10, 0x0, + 0x0, 0x7f, 0xfa, 0x10, 0x3, 0xdf, 0xe4, 0x0, + 0x8, 0xff, 0xa0, 0x9, 0xb4, 0x1e, 0xff, 0x50, + 0x4f, 0xff, 0x20, 0xb, 0xff, 0x26, 0xff, 0xe1, + 0xef, 0xff, 0x9, 0xcf, 0xff, 0x63, 0xff, 0xfa, + 0xbf, 0xff, 0x9, 0xff, 0xff, 0x54, 0xff, 0xf6, + 0x1e, 0xff, 0x51, 0xdf, 0xfb, 0x9, 0xff, 0xb0, + 0x3, 0xef, 0xe2, 0x4, 0x30, 0x5f, 0xfc, 0x10, + 0x0, 0x2c, 0xff, 0x95, 0x6a, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x49, 0xdf, 0xfd, 0x92, 0x0, 0x0, + + /* U+F070 "ï°" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x14, 0x66, 0x40, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xac, 0xff, 0xef, + 0xff, 0x91, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xa1, + 0x0, 0x4d, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x9f, + 0xf5, 0xab, 0x31, 0xef, 0xf4, 0x0, 0x7, 0xb1, + 0x5, 0xff, 0xff, 0xe1, 0x7f, 0xfe, 0x10, 0xf, + 0xfe, 0x30, 0x2d, 0xff, 0xf5, 0x4f, 0xff, 0x90, + 0xc, 0xff, 0xe0, 0x0, 0xaf, 0xf6, 0x5f, 0xff, + 0x60, 0x2, 0xff, 0xf4, 0x0, 0x6, 0xff, 0xef, + 0xfb, 0x0, 0x0, 0x4f, 0xfd, 0x10, 0x0, 0x3e, + 0xff, 0xc0, 0x0, 0x0, 0x2, 0xdf, 0xe8, 0x54, + 0x1, 0xbf, 0xe3, 0x0, 0x0, 0x0, 0x5, 0xae, + 0xff, 0x60, 0x7, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xa1, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfc, 0xcf, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfb, 0x0, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, + 0xf, 0xff, 0x70, 0x0, 0x0, 0x4, 0xff, 0xfd, + 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, 0xdf, 0xff, + 0xe0, 0x2f, 0xff, 0xfa, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0x9b, 0xff, 0xff, 0xf3, 0x0, 0x1f, 0xff, + 0xff, 0xb0, 0xe, 0xff, 0xff, 0xc0, 0xa, 0xff, + 0xff, 0xfe, 0x24, 0xff, 0xff, 0xff, 0x60, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x6, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0x30, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0x80, 0xdd, 0xdb, + 0x0, 0x0, 0x8d, 0xef, 0xf8, 0xff, 0xff, 0xb0, + 0x7, 0xff, 0xff, 0xfd, 0x55, 0x6f, 0xf4, 0x6f, + 0xf8, 0xaf, 0xe2, 0x0, 0x5, 0x74, 0xff, 0x90, + 0x7e, 0x20, 0x0, 0x0, 0x3f, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xb2, 0x50, 0x4a, 0x0, + 0x1, 0x2e, 0xfd, 0x1d, 0xf4, 0x8f, 0xb0, 0xff, + 0xff, 0xd1, 0xb, 0xff, 0xff, 0xfb, 0xff, 0xfe, + 0x20, 0x0, 0xcf, 0xff, 0xfb, 0x12, 0x21, 0x0, + 0x0, 0x2, 0x9f, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0x0, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x8, 0xff, 0x95, 0xff, + 0xb0, 0x0, 0x8, 0xff, 0x90, 0x5, 0xff, 0xb0, + 0x7, 0xff, 0x90, 0x0, 0x5, 0xff, 0xb0, 0x9f, + 0x90, 0x0, 0x0, 0x5, 0xfd, 0x0, 0x40, 0x0, + 0x0, 0x0, 0x3, 0x10, + + /* U+F078 "ï¸" */ + 0x4c, 0x20, 0x0, 0x0, 0x0, 0xb6, 0xb, 0xfe, + 0x20, 0x0, 0x0, 0xcf, 0xf0, 0x2e, 0xfe, 0x20, + 0x0, 0xcf, 0xf4, 0x0, 0x2e, 0xfe, 0x20, 0xcf, + 0xf4, 0x0, 0x0, 0x2e, 0xfe, 0xcf, 0xf4, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x13, 0x0, 0x0, 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf3, 0x8, 0xbb, 0xbb, 0xbb, + 0x90, 0x0, 0xb, 0xff, 0xff, 0x39, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x8f, 0xcf, 0xcf, 0xf0, 0x0, + 0x0, 0xa, 0xf1, 0x0, 0x38, 0x2f, 0x94, 0x80, + 0x0, 0x0, 0xa, 0xf1, 0x0, 0x0, 0x2f, 0x90, + 0x0, 0x0, 0x0, 0xa, 0xf1, 0x0, 0x0, 0x2f, + 0x90, 0x0, 0x0, 0x3, 0xa, 0xf1, 0x30, 0x0, + 0x2f, 0x90, 0x0, 0x0, 0x1f, 0xcb, 0xf8, 0xf8, + 0x0, 0x2f, 0xeb, 0xbb, 0xbb, 0x39, 0xff, 0xff, + 0xe2, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xb0, 0x9f, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xd1, 0x0, + + /* U+F07B "ï»" */ + 0x37, 0x88, 0x87, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xfd, 0xcc, 0xcc, 0xb6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, + + /* U+F093 "ï‚“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x1, 0x1c, 0xff, 0xc1, 0x10, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0x79, 0x99, + 0x3b, 0xff, 0xb3, 0x99, 0x97, 0xff, 0xff, 0xb2, + 0x44, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdd, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xb3, 0xcf, 0xac, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xca, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xc7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xf3, 0x0, 0x0, 0x4a, 0x30, 0x2, + 0xdf, 0xf8, 0x0, 0x5, 0xdf, 0xfe, 0x15, 0xef, + 0xfb, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xa2, 0x0, 0x0, + 0x0, 0x2, 0xba, 0x85, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x4, 0x86, 0x0, 0x0, 0x0, 0x10, 0x6, 0xff, + 0xfa, 0x0, 0x2, 0xdf, 0xd1, 0xef, 0x3c, 0xf1, + 0x1, 0xdf, 0xfa, 0xe, 0xe0, 0xaf, 0x21, 0xdf, + 0xfa, 0x0, 0x9f, 0xef, 0xf6, 0xdf, 0xfa, 0x0, + 0x0, 0x8d, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x48, 0xef, + 0xff, 0xf6, 0x0, 0x0, 0x6f, 0xff, 0xfb, 0xff, + 0xf6, 0x0, 0xe, 0xf3, 0xcf, 0x23, 0xff, 0xf6, + 0x0, 0xee, 0xa, 0xf2, 0x4, 0xff, 0xf6, 0x9, + 0xfe, 0xfc, 0x0, 0x4, 0xff, 0xf1, 0x8, 0xda, + 0x10, 0x0, 0x2, 0x62, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf9, 0x87, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x98, 0xf7, 0x8, 0xa6, 0x8f, 0xff, 0xf9, + 0x59, 0x90, 0xff, 0xa8, 0xff, 0xff, 0xfc, 0xcc, + 0xf, 0xfa, 0x8f, 0xff, 0xff, 0xff, 0xf1, 0xff, + 0xa8, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfa, 0x8f, + 0xff, 0xff, 0xff, 0xf1, 0xff, 0xa8, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0xfa, 0x8f, 0xff, 0xff, 0xff, + 0xf1, 0xff, 0xa8, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0xfa, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xe3, + 0x12, 0x22, 0x22, 0x21, 0xf, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0xac, 0xcc, 0xcc, 0xcb, 0x50, + 0x0, 0x0, + + /* U+F0C7 "" */ + 0x49, 0x99, 0x99, 0x99, 0x95, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0xfd, 0x22, 0x22, + 0x22, 0x4f, 0xf6, 0xf, 0xc0, 0x0, 0x0, 0x1, + 0xff, 0xf3, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x6f, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xdc, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xb0, 0x5, + 0xff, 0xff, 0x6f, 0xff, 0xf6, 0x0, 0xf, 0xff, + 0xf6, 0xff, 0xff, 0xc0, 0x6, 0xff, 0xff, 0x6f, + 0xff, 0xff, 0xed, 0xff, 0xff, 0xf6, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, + + /* U+F0C9 "" */ + 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x12, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xde, + 0xee, 0xee, 0xee, 0xee, 0xee, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xe2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0E0 "" */ + 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0xd2, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x2d, 0xff, 0x64, 0xef, 0xff, 0xfe, + 0x45, 0xff, 0xff, 0xfa, 0x2b, 0xff, 0xb2, 0xaf, + 0xff, 0xff, 0xff, 0xd3, 0x55, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xf0, 0x0, 0x4, 0xff, 0xff, 0xd0, 0x0, 0x6, + 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0x30, + 0x0, 0xa, 0xff, 0xff, 0xaa, 0xa6, 0xc, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xe1, + 0xb, 0xdd, 0xdf, 0xff, 0x60, 0x0, 0x0, 0x4f, + 0xfd, 0x0, 0x0, 0x0, 0x7f, 0xf3, 0x0, 0x0, + 0x0, 0xbf, 0xa0, 0x0, 0x0, 0x0, 0xff, 0x10, + 0x0, 0x0, 0x3, 0xf8, 0x0, 0x0, 0x0, 0x3, + 0xc0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x4, 0x55, + 0xef, 0xb5, 0x52, 0x0, 0x0, 0xff, 0xfd, 0x1f, + 0xff, 0xb0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0xff, 0xff, 0x53, 0x33, 0x20, 0x0, + 0xf, 0xff, 0x97, 0xff, 0xfb, 0x57, 0x0, 0xff, + 0xf8, 0xaf, 0xff, 0xc6, 0xf8, 0xf, 0xff, 0x8a, + 0xff, 0xfc, 0x4a, 0xa1, 0xff, 0xf8, 0xaf, 0xff, + 0xe3, 0x22, 0xf, 0xff, 0x8a, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xf8, 0xaf, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0x8a, 0xff, 0xff, 0xff, 0xf4, 0x35, 0x52, + 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xfe, 0x20, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, + 0xfa, 0x30, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0x50, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x2, 0x22, + 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, 0x8, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xa2, 0x0, + 0x0, 0x0, + + /* U+F11C "" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xfc, 0xc, 0x30, 0xe1, 0x1d, 0xd, 0x11, 0xfc, + 0xfc, 0xb, 0x30, 0xe0, 0x1d, 0xd, 0x10, 0xfc, + 0xff, 0xfe, 0xff, 0xef, 0xfe, 0xfe, 0xef, 0xfc, + 0xff, 0xf1, 0x5a, 0x8, 0x70, 0xa0, 0x5f, 0xfc, + 0xff, 0xf3, 0x7b, 0x29, 0x92, 0xc2, 0x7f, 0xfc, + 0xff, 0xbf, 0xcb, 0xbb, 0xbb, 0xbf, 0xcb, 0xfc, + 0xfc, 0xb, 0x20, 0x0, 0x0, 0xd, 0x0, 0xfc, + 0xff, 0xcf, 0xcc, 0xcc, 0xcc, 0xcf, 0xcc, 0xfb, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xdf, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x4, 0x9a, 0xaa, 0xaf, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xb3, 0x0, 0x0, 0x0, + + /* U+F15B "ï…›" */ + 0x35, 0x55, 0x55, 0x2, 0x0, 0xf, 0xff, 0xff, + 0xf2, 0xf4, 0x0, 0xff, 0xff, 0xff, 0x2f, 0xf4, + 0xf, 0xff, 0xff, 0xf2, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0x32, 0x22, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8a, 0xaa, 0xaa, + 0xaa, 0xaa, 0x30, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x24, 0x55, 0x31, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xc7, + 0x0, 0x0, 0x2, 0xbf, 0xff, 0xfe, 0xde, 0xff, + 0xff, 0xf6, 0x0, 0x5f, 0xff, 0xb5, 0x10, 0x0, + 0x3, 0x8e, 0xff, 0xb0, 0xdf, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x18, 0x0, 0x5, + 0xae, 0xfe, 0xc8, 0x10, 0x4, 0x60, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x95, 0x34, 0x7d, 0xff, 0x40, 0x0, + 0x0, 0x2, 0xa2, 0x0, 0x0, 0x0, 0x77, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x96, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xda, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xfc, 0x12, 0x22, 0x22, 0x22, 0x22, + 0x22, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x2c, 0xfa, 0xfc, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x21, 0xfa, 0xfc, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x27, 0xfa, 0xfc, 0x26, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x1f, 0xfa, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F241 "ï‰" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xfc, 0x12, 0x22, 0x22, 0x22, 0x21, + 0x0, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xc, 0xfa, 0xfc, 0x5f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x1, 0xfa, 0xfc, 0x5f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x7, 0xfa, 0xfc, 0x26, + 0x66, 0x66, 0x66, 0x63, 0x0, 0xf, 0xfa, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F242 "" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xfc, 0x12, 0x22, 0x22, 0x10, 0x0, + 0x0, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0xc, 0xfa, 0xfc, 0x5f, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x1, 0xfa, 0xfc, 0x5f, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x7, 0xfa, 0xfc, 0x26, + 0x66, 0x66, 0x50, 0x0, 0x0, 0xf, 0xfa, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F243 "" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xfc, 0x12, 0x22, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0xc, 0xfa, 0xfc, 0x5f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x1, 0xfa, 0xfc, 0x5f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x7, 0xfa, 0xfc, 0x26, + 0x66, 0x10, 0x0, 0x0, 0x0, 0xf, 0xfa, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F244 "" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf7, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xfa, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xfa, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xfa, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x7, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xdf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa9, 0x3d, 0xf5, + 0x0, 0x0, 0x0, 0x4, 0x40, 0x2, 0xe0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0xaf, 0xf8, 0xb, 0x60, + 0x0, 0x0, 0x0, 0x6c, 0x30, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xaf, 0xf9, + 0x0, 0xc, 0x50, 0x0, 0x0, 0x6d, 0x40, 0x5, + 0x50, 0x0, 0x4, 0xc0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc4, 0x3e, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xef, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x7, + 0xef, 0xff, 0xb3, 0x0, 0x0, 0xaf, 0xfd, 0x8f, + 0xff, 0x20, 0x4, 0xff, 0xfd, 0x9, 0xff, 0xb0, + 0xa, 0xfe, 0xfd, 0x12, 0xaf, 0xf0, 0xe, 0xf5, + 0x5d, 0x2c, 0xe, 0xf3, 0xf, 0xff, 0x33, 0x12, + 0x9f, 0xf5, 0xf, 0xff, 0xf3, 0x7, 0xff, 0xf6, + 0xf, 0xff, 0xe2, 0x6, 0xff, 0xf6, 0xf, 0xfe, + 0x24, 0x13, 0x7f, 0xf5, 0xd, 0xf5, 0x7d, 0x2c, + 0xd, 0xf3, 0xa, 0xff, 0xfd, 0x11, 0xbf, 0xf0, + 0x3, 0xff, 0xfe, 0xb, 0xff, 0xa0, 0x0, 0x7f, + 0xfe, 0xbf, 0xfe, 0x10, 0x0, 0x3, 0xac, 0xdc, + 0x81, 0x0, + + /* U+F2ED "ï‹­" */ + 0x0, 0x0, 0x34, 0x43, 0x0, 0x0, 0x5, 0x66, + 0x7f, 0xff, 0xf9, 0x66, 0x50, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x35, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x50, 0x1c, 0xcc, 0xcc, 0xcc, 0xcc, 0xc4, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x2f, + 0xf3, 0xfb, 0x7f, 0x6d, 0xf6, 0x2, 0xff, 0x2f, + 0xb7, 0xf5, 0xdf, 0x60, 0x2f, 0xf2, 0xfb, 0x7f, + 0x5d, 0xf6, 0x2, 0xff, 0x2f, 0xb7, 0xf5, 0xdf, + 0x60, 0x2f, 0xf2, 0xfb, 0x7f, 0x5d, 0xf6, 0x2, + 0xff, 0x2f, 0xb7, 0xf5, 0xdf, 0x60, 0x2f, 0xf3, + 0xfb, 0x7f, 0x6d, 0xf6, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x7, 0xbc, 0xcc, 0xcc, 0xcc, + 0x90, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x4, 0x39, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x39, 0xff, 0xa0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x39, 0xb0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xa8, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x17, 0x88, 0x88, 0x88, 0x88, 0x87, + 0x40, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x3e, 0xff, 0xff, 0xcf, 0xff, + 0xcf, 0xff, 0xf7, 0x3, 0xef, 0xff, 0xf9, 0x8, + 0xf8, 0x9, 0xff, 0xf8, 0x3e, 0xff, 0xff, 0xfe, + 0x20, 0x40, 0x2e, 0xff, 0xf8, 0xdf, 0xff, 0xff, + 0xff, 0xe1, 0x1, 0xef, 0xff, 0xf8, 0x9f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x8f, 0xff, 0xf8, 0x9, + 0xff, 0xff, 0xf9, 0x2, 0xc2, 0x9, 0xff, 0xf8, + 0x0, 0x9f, 0xff, 0xfe, 0x4e, 0xfe, 0x4e, 0xff, + 0xf8, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc1, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xe2, 0x3, 0xfb, 0xfb, 0xce, 0xbf, + 0xa4, 0xff, 0x1d, 0x3, 0xa1, 0xfa, 0xff, 0xf1, + 0xd0, 0x3a, 0x1f, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xad, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x29, 0xaa, 0xaa, + 0xaa, 0xa8, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf1, 0x0, + 0x8, 0x20, 0x0, 0x0, 0x1, 0xff, 0x10, 0xb, + 0xf7, 0x0, 0x0, 0x0, 0x2f, 0xf1, 0xc, 0xff, + 0x94, 0x44, 0x44, 0x45, 0xff, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x7f, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 60, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 60, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15, .adv_w = 88, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 28, .adv_w = 157, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 78, .adv_w = 139, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 146, .adv_w = 189, .box_w = 12, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 206, .adv_w = 154, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 261, .adv_w = 47, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 269, .adv_w = 75, .box_w = 4, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 297, .adv_w = 76, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 325, .adv_w = 90, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 343, .adv_w = 130, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 371, .adv_w = 51, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 379, .adv_w = 86, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 387, .adv_w = 51, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 392, .adv_w = 79, .box_w = 7, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 441, .adv_w = 149, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 486, .adv_w = 83, .box_w = 4, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 506, .adv_w = 129, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 546, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 586, .adv_w = 150, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 636, .adv_w = 129, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 676, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 721, .adv_w = 134, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 761, .adv_w = 144, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 806, .adv_w = 138, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 846, .adv_w = 51, .box_w = 3, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 858, .adv_w = 51, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 875, .adv_w = 130, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 907, .adv_w = 130, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 931, .adv_w = 130, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 963, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1003, .adv_w = 232, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1094, .adv_w = 164, .box_w = 12, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1154, .adv_w = 170, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1199, .adv_w = 162, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1249, .adv_w = 185, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1299, .adv_w = 150, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1339, .adv_w = 142, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1379, .adv_w = 173, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1429, .adv_w = 182, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1474, .adv_w = 69, .box_w = 2, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1484, .adv_w = 115, .box_w = 7, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1519, .adv_w = 161, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1569, .adv_w = 133, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1609, .adv_w = 214, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1664, .adv_w = 182, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1709, .adv_w = 188, .box_w = 12, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1769, .adv_w = 162, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1814, .adv_w = 188, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1892, .adv_w = 163, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1937, .adv_w = 139, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1982, .adv_w = 131, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2027, .adv_w = 177, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2072, .adv_w = 159, .box_w = 11, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2127, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2207, .adv_w = 151, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2257, .adv_w = 145, .box_w = 11, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2312, .adv_w = 147, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2357, .adv_w = 75, .box_w = 4, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 2385, .adv_w = 79, .box_w = 7, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 2434, .adv_w = 75, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2462, .adv_w = 131, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 2483, .adv_w = 112, .box_w = 7, .box_h = 1, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2487, .adv_w = 134, .box_w = 5, .box_h = 2, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 2492, .adv_w = 134, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2524, .adv_w = 153, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2568, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2600, .adv_w = 153, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2650, .adv_w = 137, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2682, .adv_w = 79, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2715, .adv_w = 155, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2765, .adv_w = 153, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2809, .adv_w = 62, .box_w = 2, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2820, .adv_w = 64, .box_w = 5, .box_h = 14, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 2855, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2899, .adv_w = 62, .box_w = 2, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2910, .adv_w = 237, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2962, .adv_w = 153, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2994, .adv_w = 142, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3030, .adv_w = 153, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3074, .adv_w = 153, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3124, .adv_w = 92, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3144, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3172, .adv_w = 93, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3202, .adv_w = 152, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3234, .adv_w = 125, .box_w = 9, .box_h = 8, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3270, .adv_w = 201, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3322, .adv_w = 124, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3354, .adv_w = 125, .box_w = 9, .box_h = 11, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 3404, .adv_w = 117, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3432, .adv_w = 79, .box_w = 5, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3467, .adv_w = 67, .box_w = 2, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3481, .adv_w = 79, .box_w = 5, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3516, .adv_w = 130, .box_w = 8, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 3528, .adv_w = 94, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 3543, .adv_w = 70, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 3549, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 3662, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3739, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3830, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3907, .adv_w = 154, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3962, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4067, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4172, .adv_w = 252, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4276, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4381, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4469, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4574, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4616, .adv_w = 168, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4682, .adv_w = 252, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4794, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4871, .adv_w = 154, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4946, .adv_w = 196, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 5016, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5114, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5199, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5284, .adv_w = 196, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 5354, .adv_w = 196, .box_w = 14, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 5445, .adv_w = 140, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5504, .adv_w = 140, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5563, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5648, .adv_w = 196, .box_w = 13, .box_h = 4, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 5674, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5762, .adv_w = 280, .box_w = 18, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5897, .adv_w = 252, .box_w = 17, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 6025, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6116, .adv_w = 196, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 6168, .adv_w = 196, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 6220, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6319, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6396, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6501, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 6614, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6699, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6797, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6882, .adv_w = 196, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6960, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7037, .adv_w = 140, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 7112, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7210, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7308, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7396, .adv_w = 224, .box_w = 16, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 7516, .adv_w = 168, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7599, .adv_w = 280, .box_w = 18, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7716, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7806, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7896, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7986, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8076, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8166, .adv_w = 280, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8274, .adv_w = 196, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8364, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8462, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 8575, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8674, .adv_w = 168, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8757, .adv_w = 225, .box_w = 15, .box_h = 10, .ofs_x = 0, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 2, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 10, 0, 6, -5, 0, 0, + 0, 0, -12, -13, 2, 11, 5, 4, + -9, 2, 11, 1, 9, 2, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 2, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, -7, 0, 0, 0, 0, + 0, -4, 4, 4, 0, 0, -2, 0, + -2, 2, 0, -2, 0, -2, -1, -4, + 0, 0, 0, 0, -2, 0, 0, -3, + -3, 0, 0, -2, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + -2, 0, -3, 0, -6, 0, -27, 0, + 0, -4, 0, 4, 7, 0, 0, -4, + 2, 2, 7, 4, -4, 4, 0, 0, + -13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -6, -3, -11, 0, -9, + -2, 0, 0, 0, 0, 0, 9, 0, + -7, -2, -1, 1, 0, -4, 0, 0, + -2, -17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -18, -2, 9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, + 0, 2, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 2, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 4, 2, 7, -2, 0, 0, 4, -2, + -7, -31, 2, 6, 4, 0, -3, 0, + 8, 0, 7, 0, 7, 0, -21, 0, + -3, 7, 0, 7, -2, 4, 2, 0, + 0, 1, -2, 0, 0, -4, 18, 0, + 18, 0, 7, 0, 9, 3, 4, 7, + 0, 0, 0, -8, 0, 0, 0, 0, + 1, -2, 0, 2, -4, -3, -4, 2, + 0, -2, 0, 0, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -12, 0, -14, 0, 0, 0, + 0, -2, 0, 22, -3, -3, 2, 2, + -2, 0, -3, 2, 0, 0, -12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -22, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -14, 0, 13, 0, 0, -8, 0, + 7, 0, -15, -22, -15, -4, 7, 0, + 0, -15, 0, 3, -5, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 7, -27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 11, 0, 2, 0, 0, 0, + 0, 0, 2, 2, -3, -4, 0, -1, + -1, -2, 0, 0, -2, 0, 0, 0, + -4, 0, -2, 0, -5, -4, 0, -6, + -7, -7, -4, 0, -4, 0, -4, 0, + 0, 0, 0, -2, 0, 0, 2, 0, + 2, -2, 0, 1, 0, 0, 0, 2, + -2, 0, 0, 0, -2, 2, 2, -1, + 0, 0, 0, -4, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 3, -2, 0, + -3, 0, -4, 0, 0, -2, 0, 7, + 0, 0, -2, 0, 0, 0, 0, 0, + -1, 1, -2, -2, 0, 0, -2, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, -2, -3, 0, + 0, 0, 0, 0, 1, 0, 0, -2, + 0, -2, -2, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, -2, -3, 0, -3, 0, -7, + -2, -7, 4, 0, 0, -4, 2, 4, + 6, 0, -6, -1, -3, 0, -1, -11, + 2, -2, 2, -12, 2, 0, 0, 1, + -12, 0, -12, -2, -19, -2, 0, -11, + 0, 4, 6, 0, 3, 0, 0, 0, + 0, 0, 0, -4, -3, 0, -7, 0, + 0, 0, -2, 0, 0, 0, -2, 0, + 0, 0, 0, 0, -1, -1, 0, -1, + -3, 0, 0, 0, 0, 0, 0, 0, + -2, -2, 0, -2, -3, -2, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -3, + 0, -2, 0, -4, 2, 0, 0, -3, + 1, 2, 2, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 2, + 0, 0, -2, 0, -2, -2, -3, 0, + 0, 0, 0, 0, 0, 0, 2, 0, + -2, 0, 0, 0, 0, -2, -3, 0, + -4, 0, 7, -2, 1, -7, 0, 0, + 6, -11, -12, -9, -4, 2, 0, -2, + -15, -4, 0, -4, 0, -4, 3, -4, + -14, 0, -6, 0, 0, 1, -1, 2, + -2, 0, 2, 0, -7, -9, 0, -11, + -5, -5, -5, -7, -3, -6, 0, -4, + -6, 1, 0, 1, 0, -2, 0, 0, + 0, 2, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, -1, 0, -1, -2, 0, -4, -5, + -5, -1, 0, -7, 0, 0, 0, 0, + 0, 0, -2, 0, 0, 0, 0, 1, + -1, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 11, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + -4, 0, 0, 0, 0, -11, -7, 0, + 0, 0, -3, -11, 0, 0, -2, 2, + 0, -6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, -4, 0, + 0, 0, 0, 3, 0, 2, -4, -4, + 0, -2, -2, -3, 0, 0, 0, 0, + 0, 0, -7, 0, -2, 0, -3, -2, + 0, -5, -6, -7, -2, 0, -4, 0, + -7, 0, 0, 0, 0, 18, 0, 0, + 1, 0, 0, -3, 0, 2, 0, -10, + 0, 0, 0, 0, 0, -21, -4, 7, + 7, -2, -9, 0, 2, -3, 0, -11, + -1, -3, 2, -16, -2, 3, 0, 3, + -8, -3, -8, -7, -9, 0, 0, -13, + 0, 13, 0, 0, -1, 0, 0, 0, + -1, -1, -2, -6, -7, 0, -21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, -1, -2, -3, 0, 0, + -4, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -4, 0, 0, 4, + -1, 3, 0, -5, 2, -2, -1, -6, + -2, 0, -3, -2, -2, 0, -3, -4, + 0, 0, -2, -1, -2, -4, -3, 0, + 0, -2, 0, 2, -2, 0, -5, 0, + 0, 0, -4, 0, -4, 0, -4, -4, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 2, 0, -3, 0, -2, -3, + -7, -2, -2, -2, -1, -2, -3, -1, + 0, 0, 0, 0, 0, -2, -2, -2, + 0, 0, 0, 0, 3, -2, 0, -2, + 0, 0, 0, -2, -3, -2, -2, -3, + -2, 0, 2, 9, -1, 0, -6, 0, + -2, 4, 0, -2, -9, -3, 3, 0, + 0, -11, -4, 2, -4, 2, 0, -2, + -2, -7, 0, -3, 1, 0, 0, -4, + 0, 0, 0, 2, 2, -4, -4, 0, + -4, -2, -3, -2, -2, 0, -4, 1, + -4, -4, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, -3, + 0, 0, -2, -2, 0, 0, 0, 0, + -2, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + -3, 0, -4, 0, 0, 0, -7, 0, + 2, -5, 4, 0, -2, -11, 0, 0, + -5, -2, 0, -9, -6, -6, 0, 0, + -10, -2, -9, -9, -11, 0, -6, 0, + 2, 15, -3, 0, -5, -2, -1, -2, + -4, -6, -4, -8, -9, -5, -2, 0, + 0, -2, 0, 1, 0, 0, -16, -2, + 7, 5, -5, -8, 0, 1, -7, 0, + -11, -2, -2, 4, -21, -3, 1, 0, + 0, -15, -3, -12, -2, -16, 0, 0, + -16, 0, 13, 1, 0, -2, 0, 0, + 0, 0, -1, -2, -9, -2, 0, -15, + 0, 0, 0, 0, -7, 0, -2, 0, + -1, -6, -11, 0, 0, -1, -3, -7, + -2, 0, -2, 0, 0, 0, 0, -10, + -2, -7, -7, -2, -4, -6, -2, -4, + 0, -4, -2, -7, -3, 0, -3, -4, + -2, -4, 0, 1, 0, -2, -7, 0, + 4, 0, -4, 0, 0, 0, 0, 3, + 0, 2, -4, 9, 0, -2, -2, -3, + 0, 0, 0, 0, 0, 0, -7, 0, + -2, 0, -3, -2, 0, -5, -6, -7, + -2, 0, -4, 2, 9, 0, 0, 0, + 0, 18, 0, 0, 1, 0, 0, -3, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, -4, 0, 0, 0, 0, 0, -1, + 0, 0, 0, -2, -2, 0, 0, -4, + -2, 0, 0, -4, 0, 4, -1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 3, 4, 2, -2, 0, -7, + -4, 0, 7, -7, -7, -4, -4, 9, + 4, 2, -19, -2, 4, -2, 0, -2, + 2, -2, -8, 0, -2, 2, -3, -2, + -7, -2, 0, 0, 7, 4, 0, -6, + 0, -12, -3, 6, -3, -9, 1, -3, + -7, -7, -2, 9, 2, 0, -3, 0, + -6, 0, 2, 7, -5, -8, -9, -6, + 7, 0, 1, -16, -2, 2, -4, -2, + -5, 0, -5, -8, -3, -3, -2, 0, + 0, -5, -5, -2, 0, 7, 5, -2, + -12, 0, -12, -3, 0, -8, -13, -1, + -7, -4, -7, -6, 6, 0, 0, -3, + 0, -4, -2, 0, -2, -4, 0, 4, + -7, 2, 0, 0, -12, 0, -2, -5, + -4, -2, -7, -6, -7, -5, 0, -7, + -2, -5, -4, -7, -2, 0, 0, 1, + 11, -4, 0, -7, -2, 0, -2, -4, + -5, -6, -6, -9, -3, -4, 4, 0, + -3, 0, -11, -3, 1, 4, -7, -8, + -4, -7, 7, -2, 1, -21, -4, 4, + -5, -4, -8, 0, -7, -9, -3, -2, + -2, -2, -5, -7, -1, 0, 0, 7, + 6, -2, -15, 0, -13, -5, 5, -9, + -15, -4, -8, -9, -11, -7, 4, 0, + 0, 0, 0, -3, 0, 0, 2, -3, + 4, 2, -4, 4, 0, 0, -7, -1, + 0, -1, 0, 1, 1, -2, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, 2, 7, 0, 0, -3, 0, 0, + 0, 0, -2, -2, -3, 0, 0, 0, + 1, 2, 0, 0, 0, 0, 2, 0, + -2, 0, 9, 0, 4, 1, 1, -3, + 0, 4, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -13, 0, -2, 4, 0, 7, + 0, 0, 22, 3, -4, -4, 2, 2, + -2, 1, -11, 0, 0, 11, -13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -15, 9, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, -4, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, -6, 0, + 0, 1, 0, 0, 2, 29, -4, -2, + 7, 6, -6, 2, 0, 0, 2, 2, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -29, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + 0, 0, 0, -6, 0, 0, 0, 0, + -5, -1, 0, 0, 0, -5, 0, -3, + 0, -11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -15, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -2, 0, 0, -4, 0, -3, 0, + -6, 0, 0, 0, -4, 2, -3, 0, + 0, -6, -2, -5, 0, 0, -6, 0, + -2, 0, -11, 0, -2, 0, 0, -18, + -4, -9, -2, -8, 0, 0, -15, 0, + -6, -1, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -4, -2, -4, 0, 0, + 0, 0, -5, 0, -5, 3, -2, 4, + 0, -2, -5, -2, -4, -4, 0, -3, + -1, -2, 2, -6, -1, 0, 0, 0, + -20, -2, -3, 0, -5, 0, -2, -11, + -2, 0, 0, -2, -2, 0, 0, 0, + 0, 2, 0, -2, -4, -2, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, + 0, -5, 0, -2, 0, 0, 0, -4, + 2, 0, 0, 0, -6, -2, -4, 0, + 0, -6, 0, -2, 0, -11, 0, 0, + 0, 0, -22, 0, -4, -8, -11, 0, + 0, -15, 0, -2, -3, 0, 0, 0, + 0, 0, 0, 0, 0, -2, -3, -1, + -3, 1, 0, 0, 4, -3, 0, 7, + 11, -2, -2, -7, 3, 11, 4, 5, + -6, 3, 9, 3, 6, 5, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 11, -4, -2, 0, -2, + 18, 10, 18, 0, 0, 0, 2, 0, + 0, 8, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, -19, -3, -2, -9, + -11, 0, 0, -15, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, -19, -3, -2, + -9, -11, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, -5, 2, 0, -2, + 2, 4, 2, -7, 0, 0, -2, 2, + 0, 2, 0, 0, 0, 0, -6, 0, + -2, -2, -4, 0, -2, -9, 0, 14, + -2, 0, -5, -2, 0, -2, -4, 0, + -2, -6, -4, -3, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, -19, + -3, -2, -9, -11, 0, 0, -15, 0, + 0, 0, 0, 0, 0, 11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, -7, -3, -2, 7, -2, -2, + -9, 1, -1, 1, -2, -6, 0, 5, + 0, 2, 1, 2, -5, -9, -3, 0, + -9, -4, -6, -9, -9, 0, -4, -4, + -3, -3, -2, -2, -3, -2, 0, -2, + -1, 3, 0, 3, -2, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2, -2, -2, 0, 0, + -6, 0, -1, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -3, + 0, 0, 0, 0, -2, 0, 0, -4, + -2, 2, 0, -4, -4, -2, 0, -6, + -2, -5, -2, -3, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -15, 0, 7, 0, 0, -4, 0, + 0, 0, 0, -3, 0, -2, 0, 0, + -1, 0, 0, -2, 0, -5, 0, 0, + 9, -3, -7, -7, 2, 2, 2, 0, + -6, 2, 3, 2, 7, 2, 7, -2, + -6, 0, 0, -9, 0, 0, -7, -6, + 0, 0, -4, 0, -3, -4, 0, -3, + 0, -3, 0, -2, 3, 0, -2, -7, + -2, 8, 0, 0, -2, 0, -4, 0, + 0, 3, -5, 0, 2, -2, 2, 0, + 0, -7, 0, -2, -1, 0, -2, 2, + -2, 0, 0, 0, -9, -3, -5, 0, + -7, 0, 0, -11, 0, 8, -2, 0, + -4, 0, 1, 0, -2, 0, -2, -7, + 0, -2, 2, 0, 0, 0, 0, -2, + 0, 0, 2, -3, 1, 0, 0, -3, + -2, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -14, 0, 5, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + -2, -2, 0, 0, 0, 4, 0, 5, + 0, 0, 0, 0, 0, -14, -13, 1, + 10, 7, 4, -9, 2, 9, 0, 8, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserrat_14 = { +#else +lv_font_t lv_font_montserrat_14 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 16, /*The maximum line height required by the font*/ + .base_line = 3, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_14*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_16.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_16.c new file mode 100644 index 0000000..2b0dccf --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_16.c @@ -0,0 +1,2469 @@ +/******************************************************************************* + * Size: 16 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 16 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_16.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_16 + #define LV_FONT_MONTSERRAT_16 1 +#endif + +#if LV_FONT_MONTSERRAT_16 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xbf, 0xb, 0xf0, 0xaf, 0xa, 0xe0, 0x9e, 0x8, + 0xd0, 0x8c, 0x7, 0xc0, 0x0, 0x0, 0x10, 0xbf, + 0x1a, 0xe0, + + /* U+0022 "\"" */ + 0xf5, 0x1f, 0x3f, 0x51, 0xf3, 0xe4, 0xf, 0x3e, + 0x40, 0xf2, 0x72, 0x8, 0x10, + + /* U+0023 "#" */ + 0x0, 0x5, 0xc0, 0x3, 0xe0, 0x0, 0x0, 0x7a, + 0x0, 0x5c, 0x0, 0x0, 0x9, 0x80, 0x7, 0xa0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x3, 0x3e, + 0x73, 0x3c, 0x83, 0x30, 0x0, 0xf2, 0x0, 0xc5, + 0x0, 0x0, 0xf, 0x10, 0xe, 0x30, 0x0, 0x2, + 0xf0, 0x0, 0xf2, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x41, 0x38, 0xc3, 0x36, 0xe3, 0x30, 0x0, + 0x89, 0x0, 0x5c, 0x0, 0x0, 0xa, 0x70, 0x7, + 0xa0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x79, 0x0, 0x0, 0x0, 0x0, 0x79, + 0x0, 0x0, 0x0, 0x5c, 0xff, 0xe9, 0x20, 0x6, + 0xfc, 0xbc, 0x9e, 0x90, 0xe, 0xb0, 0x79, 0x0, + 0x10, 0xf, 0x80, 0x79, 0x0, 0x0, 0xd, 0xf5, + 0x79, 0x0, 0x0, 0x3, 0xef, 0xfd, 0x50, 0x0, + 0x0, 0x6, 0xcf, 0xfe, 0x40, 0x0, 0x0, 0x79, + 0x5e, 0xf1, 0x0, 0x0, 0x79, 0x5, 0xf3, 0x7, + 0x0, 0x79, 0x7, 0xf1, 0x2f, 0xe9, 0xbc, 0xaf, + 0xa0, 0x3, 0xae, 0xff, 0xd7, 0x0, 0x0, 0x0, + 0x79, 0x0, 0x0, 0x0, 0x0, 0x79, 0x0, 0x0, + + /* U+0025 "%" */ + 0x3, 0xde, 0x80, 0x0, 0x5, 0xd0, 0x0, 0xe4, + 0xc, 0x50, 0x1, 0xe3, 0x0, 0x4c, 0x0, 0x5a, + 0x0, 0xa9, 0x0, 0x6, 0xa0, 0x4, 0xc0, 0x4e, + 0x0, 0x0, 0x4c, 0x0, 0x5a, 0xd, 0x50, 0x0, + 0x0, 0xe4, 0x1c, 0x58, 0xa0, 0x0, 0x0, 0x3, + 0xce, 0x73, 0xe1, 0x3c, 0xe9, 0x0, 0x0, 0x0, + 0xd6, 0xe, 0x40, 0xa8, 0x0, 0x0, 0x7c, 0x3, + 0xc0, 0x3, 0xd0, 0x0, 0x2e, 0x20, 0x3c, 0x0, + 0x3d, 0x0, 0xb, 0x70, 0x0, 0xe2, 0x9, 0x80, + 0x6, 0xd0, 0x0, 0x4, 0xdd, 0xa0, + + /* U+0026 "&" */ + 0x0, 0x9, 0xef, 0xb1, 0x0, 0x0, 0x9, 0xe4, + 0x3c, 0xa0, 0x0, 0x0, 0xd9, 0x0, 0x7d, 0x0, + 0x0, 0xc, 0xc0, 0x1c, 0xa0, 0x0, 0x0, 0x3f, + 0xae, 0xc1, 0x0, 0x0, 0x1, 0xdf, 0xc0, 0x0, + 0x0, 0x3, 0xeb, 0x8f, 0x70, 0x18, 0x0, 0xdb, + 0x0, 0x7f, 0x65, 0xf0, 0x3f, 0x40, 0x0, 0x8f, + 0xea, 0x3, 0xf7, 0x0, 0x0, 0xcf, 0x70, 0xb, + 0xf9, 0x66, 0xcf, 0xbf, 0x40, 0x8, 0xdf, 0xea, + 0x30, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0xf5, 0xf5, 0xe4, 0xe4, 0x72, + + /* U+0028 "(" */ + 0x0, 0xda, 0x5, 0xf2, 0xb, 0xc0, 0xf, 0x70, + 0x3f, 0x40, 0x5f, 0x20, 0x6f, 0x10, 0x7f, 0x0, + 0x6f, 0x10, 0x5f, 0x20, 0x3f, 0x40, 0xf, 0x70, + 0xb, 0xc0, 0x5, 0xf2, 0x0, 0xda, + + /* U+0029 ")" */ + 0x3f, 0x30, 0xc, 0xb0, 0x6, 0xf1, 0x1, 0xf6, + 0x0, 0xe9, 0x0, 0xbc, 0x0, 0xad, 0x0, 0xae, + 0x0, 0xad, 0x0, 0xbc, 0x0, 0xe9, 0x1, 0xf6, + 0x6, 0xf1, 0xc, 0xb0, 0x3f, 0x30, + + /* U+002A "*" */ + 0x0, 0x4a, 0x0, 0x6, 0x74, 0xa4, 0xa0, 0x2b, + 0xff, 0xe5, 0x0, 0x7f, 0xfb, 0x20, 0x7b, 0x6b, + 0x8d, 0x0, 0x4, 0xa0, 0x0, 0x0, 0x13, 0x0, + 0x0, + + /* U+002B "+" */ + 0x0, 0x5, 0x10, 0x0, 0x0, 0xf, 0x50, 0x0, + 0x0, 0xf, 0x50, 0x0, 0x1, 0x1f, 0x51, 0x10, + 0xef, 0xff, 0xff, 0xf3, 0x34, 0x4f, 0x74, 0x40, + 0x0, 0xf, 0x50, 0x0, 0x0, 0xf, 0x50, 0x0, + + /* U+002C "," */ + 0x9, 0x52, 0xfd, 0xb, 0xa0, 0xc5, 0xf, 0x0, + + /* U+002D "-" */ + 0x1, 0x11, 0x10, 0x1f, 0xff, 0xf3, 0x4, 0x44, + 0x40, + + /* U+002E "." */ + 0x3, 0x12, 0xfc, 0x1e, 0x90, + + /* U+002F "/" */ + 0x0, 0x0, 0x5, 0xf1, 0x0, 0x0, 0xa, 0xb0, + 0x0, 0x0, 0xf, 0x60, 0x0, 0x0, 0x5f, 0x10, + 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, 0xf6, 0x0, + 0x0, 0x5, 0xf1, 0x0, 0x0, 0xa, 0xb0, 0x0, + 0x0, 0xf, 0x60, 0x0, 0x0, 0x4f, 0x10, 0x0, + 0x0, 0xac, 0x0, 0x0, 0x0, 0xf6, 0x0, 0x0, + 0x4, 0xf1, 0x0, 0x0, 0xa, 0xc0, 0x0, 0x0, + 0xe, 0x60, 0x0, 0x0, 0x4f, 0x10, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x8, 0xef, 0xc5, 0x0, 0x0, 0xcf, 0xa8, + 0xcf, 0x70, 0x7, 0xf5, 0x0, 0xa, 0xf2, 0xd, + 0xc0, 0x0, 0x1, 0xf8, 0x1f, 0x80, 0x0, 0x0, + 0xdc, 0x3f, 0x60, 0x0, 0x0, 0xbd, 0x3f, 0x60, + 0x0, 0x0, 0xbd, 0x1f, 0x80, 0x0, 0x0, 0xdc, + 0xd, 0xc0, 0x0, 0x1, 0xf8, 0x7, 0xf5, 0x0, + 0xa, 0xf2, 0x0, 0xcf, 0xa8, 0xcf, 0x70, 0x0, + 0x8, 0xef, 0xc5, 0x0, + + /* U+0031 "1" */ + 0xef, 0xff, 0x36, 0x7a, 0xf3, 0x0, 0x5f, 0x30, + 0x5, 0xf3, 0x0, 0x5f, 0x30, 0x5, 0xf3, 0x0, + 0x5f, 0x30, 0x5, 0xf3, 0x0, 0x5f, 0x30, 0x5, + 0xf3, 0x0, 0x5f, 0x30, 0x5, 0xf3, + + /* U+0032 "2" */ + 0x4, 0xbe, 0xfd, 0x70, 0x7, 0xfd, 0x98, 0xcf, + 0x90, 0x28, 0x0, 0x0, 0xbf, 0x0, 0x0, 0x0, + 0x7, 0xf2, 0x0, 0x0, 0x0, 0xaf, 0x0, 0x0, + 0x0, 0x4f, 0x80, 0x0, 0x0, 0x3f, 0xc0, 0x0, + 0x0, 0x3e, 0xc1, 0x0, 0x0, 0x2e, 0xc1, 0x0, + 0x0, 0x2e, 0xd1, 0x0, 0x0, 0x2e, 0xf8, 0x77, + 0x77, 0x46, 0xff, 0xff, 0xff, 0xfa, + + /* U+0033 "3" */ + 0x6f, 0xff, 0xff, 0xff, 0x2, 0x77, 0x77, 0x9f, + 0xb0, 0x0, 0x0, 0xc, 0xe1, 0x0, 0x0, 0x9, + 0xf3, 0x0, 0x0, 0x5, 0xf6, 0x0, 0x0, 0x0, + 0xdf, 0xe9, 0x10, 0x0, 0x4, 0x59, 0xfd, 0x0, + 0x0, 0x0, 0x6, 0xf4, 0x0, 0x0, 0x0, 0x3f, + 0x64, 0x40, 0x0, 0x8, 0xf3, 0xbf, 0xc9, 0x8c, + 0xfb, 0x0, 0x7c, 0xff, 0xd7, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x1, 0xeb, 0x0, 0x0, 0x0, 0x0, + 0xbe, 0x10, 0x0, 0x0, 0x0, 0x6f, 0x50, 0x0, + 0x0, 0x0, 0x2f, 0x90, 0x0, 0x0, 0x0, 0xc, + 0xd0, 0x0, 0x0, 0x0, 0x8, 0xf3, 0x1, 0xd5, + 0x0, 0x3, 0xf8, 0x0, 0x2f, 0x60, 0x0, 0xed, + 0x22, 0x23, 0xf7, 0x21, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0x81, 0x55, 0x55, 0x56, 0xf9, 0x52, 0x0, + 0x0, 0x0, 0x2f, 0x60, 0x0, 0x0, 0x0, 0x2, + 0xf6, 0x0, + + /* U+0035 "5" */ + 0x5, 0xff, 0xff, 0xff, 0x0, 0x7f, 0x77, 0x77, + 0x70, 0x8, 0xe0, 0x0, 0x0, 0x0, 0xad, 0x0, + 0x0, 0x0, 0xb, 0xc2, 0x10, 0x0, 0x0, 0xdf, + 0xff, 0xfb, 0x30, 0x4, 0x55, 0x68, 0xff, 0x20, + 0x0, 0x0, 0x4, 0xf8, 0x0, 0x0, 0x0, 0xf, + 0x92, 0x50, 0x0, 0x5, 0xf6, 0x8f, 0xd9, 0x8a, + 0xfd, 0x10, 0x5b, 0xef, 0xe9, 0x10, + + /* U+0036 "6" */ + 0x0, 0x5, 0xce, 0xfc, 0x60, 0x0, 0x9f, 0xc8, + 0x8b, 0x70, 0x5, 0xf8, 0x0, 0x0, 0x0, 0xc, + 0xd0, 0x0, 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, + 0x0, 0x2f, 0x68, 0xef, 0xfa, 0x10, 0x3f, 0xee, + 0x64, 0x8f, 0xd0, 0x2f, 0xf1, 0x0, 0x6, 0xf4, + 0xe, 0xc0, 0x0, 0x2, 0xf6, 0x9, 0xf1, 0x0, + 0x6, 0xf3, 0x1, 0xde, 0x86, 0x9f, 0xb0, 0x0, + 0x19, 0xef, 0xd8, 0x0, + + /* U+0037 "7" */ + 0x8f, 0xff, 0xff, 0xff, 0xe8, 0xf7, 0x77, 0x77, + 0xfc, 0x8f, 0x0, 0x0, 0x4f, 0x55, 0x90, 0x0, + 0xb, 0xe0, 0x0, 0x0, 0x2, 0xf8, 0x0, 0x0, + 0x0, 0x9f, 0x10, 0x0, 0x0, 0xf, 0xb0, 0x0, + 0x0, 0x6, 0xf4, 0x0, 0x0, 0x0, 0xdd, 0x0, + 0x0, 0x0, 0x3f, 0x70, 0x0, 0x0, 0xa, 0xf1, + 0x0, 0x0, 0x1, 0xf9, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x5c, 0xff, 0xd7, 0x0, 0x6, 0xfc, 0x76, + 0xaf, 0xa0, 0xc, 0xd0, 0x0, 0x9, 0xf1, 0xd, + 0xc0, 0x0, 0x7, 0xf2, 0x7, 0xf7, 0x11, 0x5e, + 0xc0, 0x0, 0xbf, 0xff, 0xfe, 0x10, 0x9, 0xf9, + 0x54, 0x7e, 0xd0, 0x2f, 0x80, 0x0, 0x4, 0xf6, + 0x4f, 0x50, 0x0, 0x0, 0xf8, 0x1f, 0xa0, 0x0, + 0x5, 0xf6, 0x9, 0xfb, 0x76, 0xaf, 0xd0, 0x0, + 0x6c, 0xff, 0xd8, 0x10, + + /* U+0039 "9" */ + 0x0, 0x8e, 0xfd, 0x80, 0x0, 0xc, 0xf8, 0x68, + 0xfc, 0x0, 0x5f, 0x50, 0x0, 0x3f, 0x70, 0x8f, + 0x0, 0x0, 0xe, 0xc0, 0x7f, 0x30, 0x0, 0x1f, + 0xf0, 0x1f, 0xd4, 0x13, 0xcf, 0xf1, 0x4, 0xef, + 0xff, 0xa9, 0xf0, 0x0, 0x2, 0x31, 0xa, 0xf0, + 0x0, 0x0, 0x0, 0xe, 0xa0, 0x0, 0x0, 0x0, + 0x9f, 0x30, 0x9, 0xa7, 0x8d, 0xf7, 0x0, 0x7, + 0xdf, 0xeb, 0x40, 0x0, + + /* U+003A ":" */ + 0x1e, 0x92, 0xfc, 0x3, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x12, 0xfc, 0x1e, 0x90, + + /* U+003B ";" */ + 0x1e, 0x92, 0xfc, 0x3, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xe9, 0x1f, 0xd0, 0xa8, 0xe, + 0x30, 0xa0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x42, 0x0, 0x1, 0x7d, 0xf3, + 0x3, 0x9f, 0xe8, 0x10, 0xbf, 0xb5, 0x0, 0x0, + 0xee, 0x81, 0x0, 0x0, 0x17, 0xdf, 0xb4, 0x0, + 0x0, 0x4, 0xaf, 0xd2, 0x0, 0x0, 0x1, 0x82, + + /* U+003D "=" */ + 0xef, 0xff, 0xff, 0xf3, 0x45, 0x55, 0x55, 0x51, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, 0x10, + 0xef, 0xff, 0xff, 0xf3, 0x34, 0x44, 0x44, 0x40, + + /* U+003E ">" */ + 0x50, 0x0, 0x0, 0x0, 0xef, 0x92, 0x0, 0x0, + 0x6, 0xcf, 0xb5, 0x0, 0x0, 0x3, 0x9f, 0xe2, + 0x0, 0x0, 0x6c, 0xf3, 0x2, 0x9e, 0xe9, 0x20, + 0xbf, 0xc6, 0x0, 0x0, 0x93, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x4, 0xbe, 0xfd, 0x70, 0x7, 0xfc, 0x77, 0xbf, + 0xa0, 0x27, 0x0, 0x0, 0xcf, 0x0, 0x0, 0x0, + 0x9, 0xf0, 0x0, 0x0, 0x1, 0xea, 0x0, 0x0, + 0x1, 0xdd, 0x10, 0x0, 0x0, 0xce, 0x10, 0x0, + 0x0, 0x3f, 0x60, 0x0, 0x0, 0x1, 0x30, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x6, 0xf5, + 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x17, 0xce, 0xfd, 0xb5, 0x0, 0x0, + 0x0, 0x5, 0xfb, 0x53, 0x23, 0x7d, 0xc2, 0x0, + 0x0, 0x6e, 0x40, 0x0, 0x0, 0x0, 0x8e, 0x10, + 0x2, 0xf4, 0x1, 0xae, 0xfa, 0x3f, 0x49, 0xb0, + 0xa, 0x90, 0x1e, 0xe6, 0x5b, 0xef, 0x40, 0xe3, + 0xf, 0x30, 0x8f, 0x10, 0x0, 0xaf, 0x40, 0x98, + 0x1f, 0x0, 0xd9, 0x0, 0x0, 0x3f, 0x40, 0x6a, + 0x3f, 0x0, 0xe8, 0x0, 0x0, 0x1f, 0x40, 0x5c, + 0x1f, 0x0, 0xd9, 0x0, 0x0, 0x3f, 0x40, 0x6a, + 0xf, 0x30, 0x8f, 0x10, 0x0, 0xaf, 0x40, 0x98, + 0xa, 0x90, 0x1e, 0xd6, 0x5a, 0xde, 0xa6, 0xf2, + 0x3, 0xf3, 0x1, 0xaf, 0xfa, 0x16, 0xee, 0x50, + 0x0, 0x6e, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xfb, 0x53, 0x23, 0x75, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xce, 0xfd, 0xa3, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x2, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xf, + 0x9e, 0xb0, 0x0, 0x0, 0x0, 0x6, 0xf2, 0x7f, + 0x20, 0x0, 0x0, 0x0, 0xdc, 0x1, 0xf8, 0x0, + 0x0, 0x0, 0x4f, 0x60, 0xb, 0xe0, 0x0, 0x0, + 0xb, 0xf0, 0x0, 0x4f, 0x60, 0x0, 0x1, 0xfa, + 0x11, 0x11, 0xed, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0xe, 0xc4, 0x44, 0x44, 0x4f, + 0xa0, 0x6, 0xf4, 0x0, 0x0, 0x0, 0xaf, 0x10, + 0xcd, 0x0, 0x0, 0x0, 0x2, 0xf8, + + /* U+0042 "B" */ + 0x5f, 0xff, 0xff, 0xeb, 0x40, 0x5, 0xf8, 0x55, + 0x57, 0xdf, 0x40, 0x5f, 0x40, 0x0, 0x1, 0xfa, + 0x5, 0xf4, 0x0, 0x0, 0xf, 0xa0, 0x5f, 0x51, + 0x11, 0x3a, 0xf4, 0x5, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x5f, 0x74, 0x44, 0x59, 0xfa, 0x5, 0xf4, + 0x0, 0x0, 0x8, 0xf2, 0x5f, 0x40, 0x0, 0x0, + 0x5f, 0x45, 0xf4, 0x0, 0x0, 0x9, 0xf2, 0x5f, + 0x85, 0x55, 0x6a, 0xfb, 0x5, 0xff, 0xff, 0xff, + 0xd7, 0x0, + + /* U+0043 "C" */ + 0x0, 0x2, 0x8d, 0xfe, 0xb4, 0x0, 0x4, 0xff, + 0xb8, 0x9d, 0xf9, 0x2, 0xfd, 0x20, 0x0, 0x8, + 0x50, 0xbf, 0x20, 0x0, 0x0, 0x0, 0xf, 0xa0, + 0x0, 0x0, 0x0, 0x2, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0x60, 0x0, 0x0, 0x0, 0x0, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xd2, 0x0, 0x0, 0x85, 0x0, + 0x5f, 0xfb, 0x89, 0xdf, 0x80, 0x0, 0x29, 0xdf, + 0xeb, 0x40, + + /* U+0044 "D" */ + 0x5f, 0xff, 0xff, 0xea, 0x30, 0x0, 0x5f, 0x97, + 0x77, 0x9e, 0xf8, 0x0, 0x5f, 0x40, 0x0, 0x0, + 0xaf, 0x60, 0x5f, 0x40, 0x0, 0x0, 0xd, 0xe0, + 0x5f, 0x40, 0x0, 0x0, 0x6, 0xf4, 0x5f, 0x40, + 0x0, 0x0, 0x3, 0xf6, 0x5f, 0x40, 0x0, 0x0, + 0x3, 0xf6, 0x5f, 0x40, 0x0, 0x0, 0x6, 0xf4, + 0x5f, 0x40, 0x0, 0x0, 0xd, 0xe0, 0x5f, 0x40, + 0x0, 0x0, 0xaf, 0x60, 0x5f, 0x97, 0x77, 0x9e, + 0xf8, 0x0, 0x5f, 0xff, 0xff, 0xea, 0x30, 0x0, + + /* U+0045 "E" */ + 0x5f, 0xff, 0xff, 0xff, 0x95, 0xf9, 0x77, 0x77, + 0x74, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, 0x0, + 0x0, 0x0, 0x5f, 0x51, 0x11, 0x11, 0x5, 0xff, + 0xff, 0xff, 0xe0, 0x5f, 0x74, 0x44, 0x44, 0x5, + 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, + 0x5, 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x97, 0x77, + 0x77, 0x65, 0xff, 0xff, 0xff, 0xfd, + + /* U+0046 "F" */ + 0x5f, 0xff, 0xff, 0xff, 0x95, 0xf9, 0x77, 0x77, + 0x74, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, 0x0, + 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf5, + 0x22, 0x22, 0x10, 0x5f, 0xff, 0xff, 0xfe, 0x5, + 0xf8, 0x55, 0x55, 0x40, 0x5f, 0x40, 0x0, 0x0, + 0x5, 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, + 0x0, 0x5, 0xf4, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x1, 0x8d, 0xfe, 0xb5, 0x0, 0x0, 0x4f, + 0xfb, 0x89, 0xdf, 0xb0, 0x2, 0xfd, 0x20, 0x0, + 0x6, 0x60, 0xb, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0x60, 0x0, 0x0, + 0x9, 0xf0, 0xf, 0xa0, 0x0, 0x0, 0x9, 0xf0, + 0xb, 0xf2, 0x0, 0x0, 0x9, 0xf0, 0x2, 0xfd, + 0x20, 0x0, 0xa, 0xf0, 0x0, 0x4f, 0xfb, 0x89, + 0xdf, 0xc0, 0x0, 0x2, 0x8d, 0xfe, 0xc6, 0x0, + + /* U+0048 "H" */ + 0x5f, 0x40, 0x0, 0x0, 0x4f, 0x55, 0xf4, 0x0, + 0x0, 0x4, 0xf5, 0x5f, 0x40, 0x0, 0x0, 0x4f, + 0x55, 0xf4, 0x0, 0x0, 0x4, 0xf5, 0x5f, 0x52, + 0x22, 0x22, 0x5f, 0x55, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x5f, 0x85, 0x55, 0x55, 0x8f, 0x55, 0xf4, + 0x0, 0x0, 0x4, 0xf5, 0x5f, 0x40, 0x0, 0x0, + 0x4f, 0x55, 0xf4, 0x0, 0x0, 0x4, 0xf5, 0x5f, + 0x40, 0x0, 0x0, 0x4f, 0x55, 0xf4, 0x0, 0x0, + 0x4, 0xf5, + + /* U+0049 "I" */ + 0x5f, 0x45, 0xf4, 0x5f, 0x45, 0xf4, 0x5f, 0x45, + 0xf4, 0x5f, 0x45, 0xf4, 0x5f, 0x45, 0xf4, 0x5f, + 0x45, 0xf4, + + /* U+004A "J" */ + 0x0, 0xff, 0xff, 0xfa, 0x0, 0x77, 0x77, 0xfa, + 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0xfa, + 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0xfa, + 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0xfa, + 0x0, 0x0, 0x0, 0xf9, 0x7, 0x20, 0x3, 0xf6, + 0xd, 0xe9, 0x8e, 0xf1, 0x1, 0xae, 0xfb, 0x30, + + /* U+004B "K" */ + 0x5f, 0x40, 0x0, 0x2, 0xeb, 0x5, 0xf4, 0x0, + 0x1, 0xec, 0x0, 0x5f, 0x40, 0x1, 0xde, 0x10, + 0x5, 0xf4, 0x0, 0xce, 0x20, 0x0, 0x5f, 0x40, + 0xbf, 0x30, 0x0, 0x5, 0xf4, 0x9f, 0x90, 0x0, + 0x0, 0x5f, 0xcf, 0xef, 0x40, 0x0, 0x5, 0xff, + 0x91, 0xee, 0x10, 0x0, 0x5f, 0xa0, 0x3, 0xfc, + 0x0, 0x5, 0xf4, 0x0, 0x6, 0xf8, 0x0, 0x5f, + 0x40, 0x0, 0x9, 0xf5, 0x5, 0xf4, 0x0, 0x0, + 0xc, 0xf2, + + /* U+004C "L" */ + 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, 0x0, 0x0, + 0x0, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, 0x0, + 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, + 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0x5, + 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, + 0x5, 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x97, 0x77, + 0x77, 0x25, 0xff, 0xff, 0xff, 0xf5, + + /* U+004D "M" */ + 0x5f, 0x40, 0x0, 0x0, 0x0, 0x1e, 0x95, 0xfc, + 0x0, 0x0, 0x0, 0x8, 0xf9, 0x5f, 0xf5, 0x0, + 0x0, 0x2, 0xff, 0x95, 0xfd, 0xe0, 0x0, 0x0, + 0xae, 0xf9, 0x5f, 0x5f, 0x70, 0x0, 0x3f, 0x5f, + 0x95, 0xf3, 0x8f, 0x10, 0xb, 0xc0, 0xf9, 0x5f, + 0x31, 0xe9, 0x4, 0xf3, 0xf, 0x95, 0xf3, 0x7, + 0xf2, 0xdb, 0x0, 0xf9, 0x5f, 0x30, 0xd, 0xef, + 0x20, 0xf, 0x95, 0xf3, 0x0, 0x5f, 0x90, 0x0, + 0xf9, 0x5f, 0x30, 0x0, 0x71, 0x0, 0xf, 0x95, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0xf9, + + /* U+004E "N" */ + 0x5f, 0x50, 0x0, 0x0, 0x4f, 0x55, 0xff, 0x20, + 0x0, 0x4, 0xf5, 0x5f, 0xfd, 0x0, 0x0, 0x4f, + 0x55, 0xfa, 0xf9, 0x0, 0x4, 0xf5, 0x5f, 0x4a, + 0xf5, 0x0, 0x4f, 0x55, 0xf4, 0xd, 0xf2, 0x4, + 0xf5, 0x5f, 0x40, 0x2f, 0xd0, 0x4f, 0x55, 0xf4, + 0x0, 0x6f, 0x94, 0xf5, 0x5f, 0x40, 0x0, 0xaf, + 0xaf, 0x55, 0xf4, 0x0, 0x0, 0xdf, 0xf5, 0x5f, + 0x40, 0x0, 0x2, 0xff, 0x55, 0xf4, 0x0, 0x0, + 0x6, 0xf5, + + /* U+004F "O" */ + 0x0, 0x1, 0x8d, 0xfe, 0xb5, 0x0, 0x0, 0x4, + 0xff, 0xb8, 0x9e, 0xfa, 0x0, 0x2, 0xfd, 0x20, + 0x0, 0x8, 0xf9, 0x0, 0xbf, 0x20, 0x0, 0x0, + 0xa, 0xf2, 0xf, 0xa0, 0x0, 0x0, 0x0, 0x3f, + 0x72, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xf9, 0x2f, + 0x60, 0x0, 0x0, 0x0, 0xf, 0x90, 0xfa, 0x0, + 0x0, 0x0, 0x3, 0xf7, 0xb, 0xf2, 0x0, 0x0, + 0x0, 0xaf, 0x20, 0x2f, 0xd2, 0x0, 0x0, 0x8f, + 0x90, 0x0, 0x4f, 0xfb, 0x89, 0xef, 0xa0, 0x0, + 0x0, 0x28, 0xdf, 0xeb, 0x50, 0x0, + + /* U+0050 "P" */ + 0x5f, 0xff, 0xff, 0xd7, 0x0, 0x5f, 0x97, 0x78, + 0xbf, 0xc0, 0x5f, 0x40, 0x0, 0x7, 0xf6, 0x5f, + 0x40, 0x0, 0x0, 0xfa, 0x5f, 0x40, 0x0, 0x0, + 0xfa, 0x5f, 0x40, 0x0, 0x3, 0xf8, 0x5f, 0x62, + 0x23, 0x6e, 0xf1, 0x5f, 0xff, 0xff, 0xfd, 0x30, + 0x5f, 0x85, 0x54, 0x20, 0x0, 0x5f, 0x40, 0x0, + 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0x0, 0x5f, + 0x40, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x1, 0x8d, 0xfe, 0xb5, 0x0, 0x0, 0x0, + 0x4e, 0xfb, 0x89, 0xef, 0xa0, 0x0, 0x2, 0xfd, + 0x20, 0x0, 0x8, 0xf9, 0x0, 0xa, 0xf2, 0x0, + 0x0, 0x0, 0xaf, 0x20, 0xf, 0xa0, 0x0, 0x0, + 0x0, 0x3f, 0x70, 0x2f, 0x60, 0x0, 0x0, 0x0, + 0xf, 0x90, 0x2f, 0x60, 0x0, 0x0, 0x0, 0xf, + 0x90, 0x1f, 0x90, 0x0, 0x0, 0x0, 0x2f, 0x70, + 0xb, 0xf1, 0x0, 0x0, 0x0, 0xaf, 0x20, 0x3, + 0xfc, 0x10, 0x0, 0x7, 0xf9, 0x0, 0x0, 0x6f, + 0xfa, 0x78, 0xdf, 0xb0, 0x0, 0x0, 0x3, 0xae, + 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xd4, 0x15, 0xb0, 0x0, 0x0, 0x0, 0x2, 0xbf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, 0x31, + 0x0, + + /* U+0052 "R" */ + 0x5f, 0xff, 0xff, 0xd7, 0x0, 0x5f, 0x97, 0x78, + 0xbf, 0xc0, 0x5f, 0x40, 0x0, 0x7, 0xf6, 0x5f, + 0x40, 0x0, 0x0, 0xfa, 0x5f, 0x40, 0x0, 0x0, + 0xfa, 0x5f, 0x40, 0x0, 0x3, 0xf8, 0x5f, 0x52, + 0x23, 0x6e, 0xe1, 0x5f, 0xff, 0xff, 0xfc, 0x30, + 0x5f, 0x85, 0x55, 0xf9, 0x0, 0x5f, 0x40, 0x0, + 0x7f, 0x40, 0x5f, 0x40, 0x0, 0xc, 0xe0, 0x5f, + 0x40, 0x0, 0x2, 0xf9, + + /* U+0053 "S" */ + 0x0, 0x5c, 0xef, 0xd9, 0x20, 0x7, 0xfc, 0x87, + 0xaf, 0x90, 0xe, 0xc0, 0x0, 0x1, 0x10, 0xf, + 0x80, 0x0, 0x0, 0x0, 0xd, 0xf5, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xea, 0x50, 0x0, 0x0, 0x5, + 0xae, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x4e, 0xf1, + 0x0, 0x0, 0x0, 0x5, 0xf3, 0x8, 0x0, 0x0, + 0x8, 0xf2, 0x2f, 0xfa, 0x77, 0xbf, 0xa0, 0x2, + 0x9d, 0xff, 0xc7, 0x0, + + /* U+0054 "T" */ + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x67, 0x78, 0xfb, + 0x77, 0x72, 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, + 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, + 0x0, 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, + 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, 0x0, + 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, + 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, + 0x1, 0xf7, 0x0, 0x0, + + /* U+0055 "U" */ + 0x6f, 0x30, 0x0, 0x0, 0x8f, 0x16, 0xf3, 0x0, + 0x0, 0x8, 0xf1, 0x6f, 0x30, 0x0, 0x0, 0x8f, + 0x16, 0xf3, 0x0, 0x0, 0x8, 0xf1, 0x6f, 0x30, + 0x0, 0x0, 0x8f, 0x16, 0xf3, 0x0, 0x0, 0x8, + 0xf1, 0x6f, 0x30, 0x0, 0x0, 0x8f, 0x5, 0xf4, + 0x0, 0x0, 0x9, 0xf0, 0x3f, 0x70, 0x0, 0x0, + 0xcd, 0x0, 0xde, 0x20, 0x0, 0x5f, 0x80, 0x4, + 0xff, 0xa8, 0xbf, 0xd0, 0x0, 0x3, 0xbe, 0xfd, + 0x81, 0x0, + + /* U+0056 "V" */ + 0xc, 0xe0, 0x0, 0x0, 0x0, 0x6f, 0x30, 0x6f, + 0x50, 0x0, 0x0, 0xc, 0xc0, 0x0, 0xfb, 0x0, + 0x0, 0x3, 0xf6, 0x0, 0x9, 0xf2, 0x0, 0x0, + 0xae, 0x0, 0x0, 0x2f, 0x80, 0x0, 0x1f, 0x90, + 0x0, 0x0, 0xce, 0x0, 0x7, 0xf2, 0x0, 0x0, + 0x5, 0xf6, 0x0, 0xdb, 0x0, 0x0, 0x0, 0xe, + 0xc0, 0x4f, 0x50, 0x0, 0x0, 0x0, 0x8f, 0x3b, + 0xe0, 0x0, 0x0, 0x0, 0x2, 0xfb, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xb0, 0x0, 0x0, + + /* U+0057 "W" */ + 0x5f, 0x40, 0x0, 0x0, 0xdf, 0x0, 0x0, 0x2, + 0xf5, 0xf, 0x90, 0x0, 0x2, 0xff, 0x40, 0x0, + 0x7, 0xf0, 0xb, 0xe0, 0x0, 0x7, 0xfe, 0x90, + 0x0, 0xc, 0xb0, 0x6, 0xf3, 0x0, 0xc, 0xaa, + 0xe0, 0x0, 0x1f, 0x60, 0x1, 0xf8, 0x0, 0x1f, + 0x54, 0xf3, 0x0, 0x6f, 0x10, 0x0, 0xcd, 0x0, + 0x7f, 0x10, 0xf8, 0x0, 0xcc, 0x0, 0x0, 0x7f, + 0x20, 0xcb, 0x0, 0xad, 0x1, 0xf7, 0x0, 0x0, + 0x2f, 0x71, 0xf6, 0x0, 0x5f, 0x26, 0xf2, 0x0, + 0x0, 0xd, 0xc6, 0xf1, 0x0, 0xf, 0x7b, 0xd0, + 0x0, 0x0, 0x8, 0xfd, 0xc0, 0x0, 0xb, 0xdf, + 0x80, 0x0, 0x0, 0x3, 0xff, 0x70, 0x0, 0x6, + 0xff, 0x30, 0x0, 0x0, 0x0, 0xef, 0x20, 0x0, + 0x1, 0xfe, 0x0, 0x0, + + /* U+0058 "X" */ + 0x3f, 0x90, 0x0, 0x0, 0xcd, 0x0, 0x8f, 0x40, + 0x0, 0x7f, 0x30, 0x0, 0xde, 0x10, 0x2f, 0x80, + 0x0, 0x3, 0xfa, 0xc, 0xd0, 0x0, 0x0, 0x7, + 0xfb, 0xf3, 0x0, 0x0, 0x0, 0xc, 0xf8, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xc0, 0x0, 0x0, 0x0, + 0xbf, 0x7f, 0x70, 0x0, 0x0, 0x6f, 0x60, 0xaf, + 0x20, 0x0, 0x2f, 0xb0, 0x1, 0xed, 0x0, 0xc, + 0xf1, 0x0, 0x4, 0xf8, 0x7, 0xf6, 0x0, 0x0, + 0x9, 0xf3, + + /* U+0059 "Y" */ + 0xc, 0xe0, 0x0, 0x0, 0x7, 0xf2, 0x3, 0xf7, + 0x0, 0x0, 0x1f, 0x90, 0x0, 0xaf, 0x10, 0x0, + 0x9e, 0x10, 0x0, 0x1f, 0xa0, 0x2, 0xf6, 0x0, + 0x0, 0x8, 0xf3, 0xb, 0xd0, 0x0, 0x0, 0x0, + 0xec, 0x4f, 0x40, 0x0, 0x0, 0x0, 0x5f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xf0, 0x0, 0x0, + + /* U+005A "Z" */ + 0x3f, 0xff, 0xff, 0xff, 0xfd, 0x1, 0x77, 0x77, + 0x77, 0xbf, 0x90, 0x0, 0x0, 0x0, 0x1e, 0xc0, + 0x0, 0x0, 0x0, 0xc, 0xf2, 0x0, 0x0, 0x0, + 0x8, 0xf5, 0x0, 0x0, 0x0, 0x4, 0xf9, 0x0, + 0x0, 0x0, 0x1, 0xec, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0x20, 0x0, 0x0, 0x0, 0x8f, 0x50, 0x0, + 0x0, 0x0, 0x4f, 0x90, 0x0, 0x0, 0x0, 0x1e, + 0xf8, 0x77, 0x77, 0x77, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xf0, + + /* U+005B "[" */ + 0x5f, 0xff, 0x5, 0xf7, 0x50, 0x5f, 0x30, 0x5, + 0xf3, 0x0, 0x5f, 0x30, 0x5, 0xf3, 0x0, 0x5f, + 0x30, 0x5, 0xf3, 0x0, 0x5f, 0x30, 0x5, 0xf3, + 0x0, 0x5f, 0x30, 0x5, 0xf3, 0x0, 0x5f, 0x30, + 0x5, 0xf7, 0x50, 0x5f, 0xff, 0x0, + + /* U+005C "\\" */ + 0x7e, 0x0, 0x0, 0x0, 0x1f, 0x40, 0x0, 0x0, + 0xc, 0x90, 0x0, 0x0, 0x7, 0xe0, 0x0, 0x0, + 0x2, 0xf4, 0x0, 0x0, 0x0, 0xc9, 0x0, 0x0, + 0x0, 0x7e, 0x0, 0x0, 0x0, 0x2f, 0x40, 0x0, + 0x0, 0xc, 0x90, 0x0, 0x0, 0x7, 0xe0, 0x0, + 0x0, 0x2, 0xf3, 0x0, 0x0, 0x0, 0xd9, 0x0, + 0x0, 0x0, 0x7e, 0x0, 0x0, 0x0, 0x2f, 0x30, + 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x7, 0xe0, + + /* U+005D "]" */ + 0xbf, 0xfa, 0x35, 0xea, 0x0, 0xea, 0x0, 0xea, + 0x0, 0xea, 0x0, 0xea, 0x0, 0xea, 0x0, 0xea, + 0x0, 0xea, 0x0, 0xea, 0x0, 0xea, 0x0, 0xea, + 0x0, 0xea, 0x35, 0xea, 0xbf, 0xfa, + + /* U+005E "^" */ + 0x0, 0x2f, 0x80, 0x0, 0x0, 0x9d, 0xe0, 0x0, + 0x0, 0xf3, 0xd5, 0x0, 0x6, 0xd0, 0x7b, 0x0, + 0xc, 0x60, 0x1f, 0x20, 0x3f, 0x10, 0xb, 0x80, + 0x9a, 0x0, 0x4, 0xe0, + + /* U+005F "_" */ + 0xff, 0xff, 0xff, 0xff, 0x11, 0x11, 0x11, 0x11, + + /* U+0060 "`" */ + 0x7, 0xf6, 0x0, 0x3, 0xe7, + + /* U+0061 "a" */ + 0x1, 0x9e, 0xfd, 0x80, 0x0, 0xce, 0x87, 0xaf, + 0x90, 0x2, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x0, + 0x6, 0xf2, 0x2, 0xbe, 0xff, 0xff, 0x20, 0xec, + 0x42, 0x27, 0xf2, 0x2f, 0x50, 0x0, 0x7f, 0x20, + 0xec, 0x42, 0x7f, 0xf2, 0x2, 0xbf, 0xfb, 0x6f, + 0x20, + + /* U+0062 "b" */ + 0x8f, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x2b, 0xfe, 0xb3, 0x0, 0x8f, 0xec, 0x78, 0xef, + 0x30, 0x8f, 0xa0, 0x0, 0x1e, 0xc0, 0x8f, 0x20, + 0x0, 0x7, 0xf1, 0x8f, 0x0, 0x0, 0x5, 0xf3, + 0x8f, 0x20, 0x0, 0x7, 0xf1, 0x8f, 0xa0, 0x0, + 0x1e, 0xd0, 0x8f, 0xec, 0x78, 0xef, 0x30, 0x8e, + 0x2b, 0xfe, 0xb3, 0x0, + + /* U+0063 "c" */ + 0x0, 0x3a, 0xef, 0xc4, 0x0, 0x4f, 0xd8, 0x7c, + 0xf4, 0xd, 0xd0, 0x0, 0x7, 0x13, 0xf6, 0x0, + 0x0, 0x0, 0x4f, 0x30, 0x0, 0x0, 0x3, 0xf6, + 0x0, 0x0, 0x0, 0xd, 0xd0, 0x0, 0x6, 0x10, + 0x4f, 0xd7, 0x7c, 0xf4, 0x0, 0x3a, 0xef, 0xc4, + 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, + 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, + 0x3b, 0xff, 0xa3, 0xf7, 0x4, 0xfd, 0x87, 0xce, + 0xf7, 0xe, 0xd0, 0x0, 0xb, 0xf7, 0x3f, 0x60, + 0x0, 0x3, 0xf7, 0x4f, 0x30, 0x0, 0x1, 0xf7, + 0x3f, 0x50, 0x0, 0x3, 0xf7, 0xe, 0xc0, 0x0, + 0xa, 0xf7, 0x4, 0xfc, 0x65, 0xbe, 0xf7, 0x0, + 0x3b, 0xff, 0xb2, 0xf7, + + /* U+0065 "e" */ + 0x0, 0x3b, 0xfe, 0xa2, 0x0, 0x4, 0xfc, 0x67, + 0xee, 0x20, 0xe, 0xc0, 0x0, 0x1e, 0xa0, 0x3f, + 0x50, 0x0, 0x7, 0xf0, 0x4f, 0xff, 0xff, 0xff, + 0xf1, 0x3f, 0x72, 0x22, 0x22, 0x20, 0xe, 0xc0, + 0x0, 0x2, 0x0, 0x4, 0xfd, 0x87, 0xaf, 0x50, + 0x0, 0x3a, 0xef, 0xd6, 0x0, + + /* U+0066 "f" */ + 0x0, 0x5d, 0xfc, 0x0, 0x2f, 0xb5, 0x70, 0x4, + 0xf3, 0x0, 0xc, 0xff, 0xff, 0xa0, 0x48, 0xf7, + 0x53, 0x0, 0x5f, 0x30, 0x0, 0x5, 0xf3, 0x0, + 0x0, 0x5f, 0x30, 0x0, 0x5, 0xf3, 0x0, 0x0, + 0x5f, 0x30, 0x0, 0x5, 0xf3, 0x0, 0x0, 0x5f, + 0x30, 0x0, + + /* U+0067 "g" */ + 0x0, 0x3b, 0xff, 0xb2, 0xe9, 0x4, 0xfe, 0x87, + 0xcf, 0xf9, 0xe, 0xd1, 0x0, 0xa, 0xf9, 0x3f, + 0x60, 0x0, 0x1, 0xf9, 0x4f, 0x40, 0x0, 0x0, + 0xf9, 0x3f, 0x60, 0x0, 0x1, 0xf9, 0xe, 0xd0, + 0x0, 0x9, 0xf9, 0x4, 0xfd, 0x87, 0xcf, 0xf8, + 0x0, 0x3b, 0xff, 0xb3, 0xf7, 0x0, 0x0, 0x0, + 0x5, 0xf4, 0x9, 0xe9, 0x77, 0xaf, 0xb0, 0x1, + 0x7c, 0xff, 0xd8, 0x0, + + /* U+0068 "h" */ + 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf0, 0x0, 0x0, + 0x0, 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf2, 0xbf, + 0xea, 0x10, 0x8f, 0xfb, 0x89, 0xfd, 0x8, 0xf8, + 0x0, 0x6, 0xf4, 0x8f, 0x10, 0x0, 0x1f, 0x78, + 0xf0, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, 0xf, + 0x88, 0xf0, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, + 0xf, 0x88, 0xf0, 0x0, 0x0, 0xf8, + + /* U+0069 "i" */ + 0x9e, 0x1a, 0xf2, 0x0, 0x8, 0xf0, 0x8f, 0x8, + 0xf0, 0x8f, 0x8, 0xf0, 0x8f, 0x8, 0xf0, 0x8f, + 0x8, 0xf0, + + /* U+006A "j" */ + 0x0, 0x7, 0xe2, 0x0, 0x9, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xf1, 0x0, 0x7, 0xf1, 0x0, + 0x7, 0xf1, 0x0, 0x7, 0xf1, 0x0, 0x7, 0xf1, + 0x0, 0x7, 0xf1, 0x0, 0x7, 0xf1, 0x0, 0x7, + 0xf1, 0x0, 0x7, 0xf1, 0x0, 0x8, 0xf0, 0x18, + 0x6e, 0xc0, 0x3e, 0xfc, 0x20, + + /* U+006B "k" */ + 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf0, 0x0, 0x0, + 0x0, 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf0, 0x0, + 0x1d, 0xd1, 0x8f, 0x0, 0x1d, 0xe2, 0x8, 0xf0, + 0x1d, 0xe2, 0x0, 0x8f, 0x2d, 0xf3, 0x0, 0x8, + 0xfe, 0xff, 0x70, 0x0, 0x8f, 0xe2, 0xbf, 0x30, + 0x8, 0xf2, 0x1, 0xee, 0x10, 0x8f, 0x0, 0x3, + 0xfb, 0x8, 0xf0, 0x0, 0x7, 0xf7, + + /* U+006C "l" */ + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, + + /* U+006D "m" */ + 0x8e, 0x3c, 0xfe, 0x91, 0x3b, 0xfe, 0xa2, 0x8, + 0xff, 0x96, 0x9f, 0xcf, 0xc6, 0x8f, 0xd0, 0x8f, + 0x70, 0x0, 0x9f, 0xc0, 0x0, 0x5f, 0x58, 0xf1, + 0x0, 0x5, 0xf6, 0x0, 0x1, 0xf7, 0x8f, 0x0, + 0x0, 0x4f, 0x40, 0x0, 0xf, 0x88, 0xf0, 0x0, + 0x4, 0xf4, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, + 0x4f, 0x40, 0x0, 0xf, 0x88, 0xf0, 0x0, 0x4, + 0xf4, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, 0x4f, + 0x40, 0x0, 0xf, 0x80, + + /* U+006E "n" */ + 0x8e, 0x3b, 0xfe, 0xa1, 0x8, 0xff, 0xa6, 0x8f, + 0xd0, 0x8f, 0x80, 0x0, 0x6f, 0x48, 0xf1, 0x0, + 0x1, 0xf7, 0x8f, 0x0, 0x0, 0xf, 0x88, 0xf0, + 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, 0xf, 0x88, + 0xf0, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, 0xf, + 0x80, + + /* U+006F "o" */ + 0x0, 0x3b, 0xef, 0xc4, 0x0, 0x4, 0xfd, 0x87, + 0xcf, 0x60, 0xe, 0xd0, 0x0, 0xb, 0xf1, 0x3f, + 0x60, 0x0, 0x3, 0xf5, 0x4f, 0x30, 0x0, 0x1, + 0xf7, 0x3f, 0x60, 0x0, 0x3, 0xf5, 0xe, 0xd0, + 0x0, 0xb, 0xf1, 0x4, 0xfd, 0x77, 0xcf, 0x60, + 0x0, 0x3b, 0xef, 0xc4, 0x0, + + /* U+0070 "p" */ + 0x8e, 0x3b, 0xfe, 0xb3, 0x0, 0x8f, 0xfb, 0x57, + 0xdf, 0x30, 0x8f, 0x90, 0x0, 0xd, 0xc0, 0x8f, + 0x10, 0x0, 0x7, 0xf1, 0x8f, 0x0, 0x0, 0x5, + 0xf3, 0x8f, 0x20, 0x0, 0x7, 0xf1, 0x8f, 0xa0, + 0x0, 0x1e, 0xd0, 0x8f, 0xec, 0x78, 0xef, 0x30, + 0x8f, 0x2b, 0xfe, 0xb3, 0x0, 0x8f, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x3b, 0xff, 0xa2, 0xf7, 0x4, 0xfd, 0x87, + 0xde, 0xf7, 0xe, 0xd0, 0x0, 0xb, 0xf7, 0x3f, + 0x60, 0x0, 0x3, 0xf7, 0x4f, 0x30, 0x0, 0x1, + 0xf7, 0x3f, 0x60, 0x0, 0x3, 0xf7, 0xe, 0xd0, + 0x0, 0xb, 0xf7, 0x4, 0xfd, 0x77, 0xce, 0xf7, + 0x0, 0x3b, 0xff, 0xa3, 0xf7, 0x0, 0x0, 0x0, + 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, + 0x0, 0x0, 0x1, 0xf7, + + /* U+0072 "r" */ + 0x8e, 0x2b, 0xf0, 0x8f, 0xed, 0x90, 0x8f, 0xa0, + 0x0, 0x8f, 0x20, 0x0, 0x8f, 0x0, 0x0, 0x8f, + 0x0, 0x0, 0x8f, 0x0, 0x0, 0x8f, 0x0, 0x0, + 0x8f, 0x0, 0x0, + + /* U+0073 "s" */ + 0x2, 0xae, 0xfd, 0x91, 0x1e, 0xd7, 0x69, 0xd0, + 0x4f, 0x30, 0x0, 0x0, 0x2f, 0xb4, 0x10, 0x0, + 0x6, 0xef, 0xfd, 0x60, 0x0, 0x1, 0x5b, 0xf5, + 0x1, 0x0, 0x0, 0xf7, 0x5f, 0xa7, 0x6b, 0xf3, + 0x19, 0xdf, 0xec, 0x40, + + /* U+0074 "t" */ + 0x5, 0xf3, 0x0, 0x0, 0x5f, 0x30, 0x0, 0xcf, + 0xff, 0xfa, 0x4, 0x8f, 0x75, 0x30, 0x5, 0xf3, + 0x0, 0x0, 0x5f, 0x30, 0x0, 0x5, 0xf3, 0x0, + 0x0, 0x5f, 0x30, 0x0, 0x4, 0xf4, 0x0, 0x0, + 0x1f, 0xc6, 0x80, 0x0, 0x5d, 0xfc, 0x10, + + /* U+0075 "u" */ + 0xae, 0x0, 0x0, 0x2f, 0x5a, 0xe0, 0x0, 0x2, + 0xf5, 0xae, 0x0, 0x0, 0x2f, 0x5a, 0xe0, 0x0, + 0x2, 0xf5, 0xae, 0x0, 0x0, 0x2f, 0x59, 0xf0, + 0x0, 0x4, 0xf5, 0x6f, 0x30, 0x0, 0xaf, 0x51, + 0xee, 0x76, 0xbf, 0xf5, 0x2, 0xbe, 0xfb, 0x3f, + 0x50, + + /* U+0076 "v" */ + 0xd, 0xc0, 0x0, 0x0, 0xcb, 0x6, 0xf2, 0x0, + 0x2, 0xf5, 0x0, 0xf9, 0x0, 0x9, 0xe0, 0x0, + 0x9e, 0x0, 0xf, 0x80, 0x0, 0x2f, 0x60, 0x6f, + 0x10, 0x0, 0xc, 0xc0, 0xcb, 0x0, 0x0, 0x5, + 0xf6, 0xf4, 0x0, 0x0, 0x0, 0xef, 0xd0, 0x0, + 0x0, 0x0, 0x8f, 0x70, 0x0, + + /* U+0077 "w" */ + 0xbb, 0x0, 0x0, 0x9f, 0x10, 0x0, 0x4f, 0x16, + 0xf1, 0x0, 0xe, 0xf6, 0x0, 0x9, 0xc0, 0xf, + 0x60, 0x5, 0xfc, 0xb0, 0x0, 0xf6, 0x0, 0xac, + 0x0, 0xab, 0x5f, 0x10, 0x5f, 0x10, 0x5, 0xf1, + 0xf, 0x50, 0xf7, 0xa, 0xb0, 0x0, 0xf, 0x76, + 0xf0, 0x9, 0xc0, 0xf5, 0x0, 0x0, 0xac, 0xba, + 0x0, 0x4f, 0x8f, 0x0, 0x0, 0x4, 0xff, 0x40, + 0x0, 0xef, 0xa0, 0x0, 0x0, 0xe, 0xe0, 0x0, + 0x8, 0xf4, 0x0, 0x0, + + /* U+0078 "x" */ + 0x4f, 0x70, 0x0, 0x9f, 0x20, 0x8f, 0x30, 0x5f, + 0x50, 0x0, 0xcd, 0x2e, 0x90, 0x0, 0x2, 0xff, + 0xd0, 0x0, 0x0, 0xa, 0xf6, 0x0, 0x0, 0x4, + 0xfd, 0xe1, 0x0, 0x1, 0xeb, 0xd, 0xc0, 0x0, + 0xbe, 0x10, 0x3f, 0x80, 0x6f, 0x40, 0x0, 0x7f, + 0x40, + + /* U+0079 "y" */ + 0xd, 0xc0, 0x0, 0x0, 0xcb, 0x6, 0xf3, 0x0, + 0x2, 0xf4, 0x0, 0xea, 0x0, 0x9, 0xd0, 0x0, + 0x8f, 0x10, 0x1f, 0x70, 0x0, 0x1f, 0x70, 0x7f, + 0x10, 0x0, 0xa, 0xe0, 0xd9, 0x0, 0x0, 0x3, + 0xf9, 0xf2, 0x0, 0x0, 0x0, 0xcf, 0xb0, 0x0, + 0x0, 0x0, 0x6f, 0x40, 0x0, 0x0, 0x0, 0xad, + 0x0, 0x0, 0x1c, 0x79, 0xf5, 0x0, 0x0, 0x1a, + 0xee, 0x70, 0x0, 0x0, + + /* U+007A "z" */ + 0x4f, 0xff, 0xff, 0xf9, 0x15, 0x55, 0x5b, 0xf4, + 0x0, 0x0, 0x4f, 0x80, 0x0, 0x1, 0xec, 0x0, + 0x0, 0xb, 0xe1, 0x0, 0x0, 0x8f, 0x40, 0x0, + 0x4, 0xf7, 0x0, 0x0, 0x1e, 0xe5, 0x55, 0x53, + 0x5f, 0xff, 0xff, 0xfc, + + /* U+007B "{" */ + 0x0, 0x2c, 0xf5, 0x0, 0xaf, 0x61, 0x0, 0xcc, + 0x0, 0x0, 0xdb, 0x0, 0x0, 0xdb, 0x0, 0x0, + 0xdb, 0x0, 0x2, 0xea, 0x0, 0x1f, 0xf4, 0x0, + 0x5, 0xfa, 0x0, 0x0, 0xdb, 0x0, 0x0, 0xdb, + 0x0, 0x0, 0xdb, 0x0, 0x0, 0xcc, 0x0, 0x0, + 0xaf, 0x61, 0x0, 0x2c, 0xf5, + + /* U+007C "|" */ + 0x5f, 0x15, 0xf1, 0x5f, 0x15, 0xf1, 0x5f, 0x15, + 0xf1, 0x5f, 0x15, 0xf1, 0x5f, 0x15, 0xf1, 0x5f, + 0x15, 0xf1, 0x5f, 0x15, 0xf1, 0x5f, 0x10, + + /* U+007D "}" */ + 0xbe, 0x80, 0x3, 0xaf, 0x40, 0x1, 0xf6, 0x0, + 0x1f, 0x70, 0x1, 0xf7, 0x0, 0x1f, 0x70, 0x0, + 0xf9, 0x0, 0xa, 0xfb, 0x0, 0xfb, 0x20, 0x1f, + 0x70, 0x1, 0xf7, 0x0, 0x1f, 0x70, 0x1, 0xf6, + 0x3, 0xaf, 0x40, 0xbe, 0x90, 0x0, + + /* U+007E "~" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xe4, 0x0, + 0xb5, 0xc, 0x86, 0xf5, 0x1e, 0x20, 0xf0, 0x3, + 0xef, 0x90, 0x2, 0x0, 0x0, 0x10, 0x0, + + /* U+00B0 "°" */ + 0x2, 0xce, 0x90, 0xd, 0x40, 0x89, 0x3b, 0x0, + 0xe, 0x3b, 0x0, 0xe, 0xd, 0x40, 0x89, 0x2, + 0xce, 0x90, + + /* U+2022 "•" */ + 0x0, 0x8, 0xf8, 0xef, 0xe7, 0xf7, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdc, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, + 0x0, 0x0, 0x3, 0x8d, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xea, 0x51, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x83, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x2b, 0xff, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xfd, + 0xdf, 0xff, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xb2, + 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, + 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, + 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + + /* U+F00B "" */ + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xc0, + 0x1b, 0xa0, 0x0, 0x0, 0xb, 0xff, 0xfc, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xc0, 0x0, + 0xbf, 0xff, 0xb0, 0xb, 0xff, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0xfb, 0xbf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "ï€" */ + 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xfc, 0x10, + 0x0, 0x1c, 0xf8, 0xff, 0xfc, 0x10, 0x1c, 0xff, + 0xf5, 0xff, 0xfc, 0x2c, 0xff, 0xf5, 0x5, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x1d, 0xff, 0xfd, 0x10, 0x0, 0x1c, + 0xff, 0xff, 0xfc, 0x10, 0x1c, 0xff, 0xf9, 0xff, + 0xfc, 0x1c, 0xff, 0xf5, 0x5, 0xff, 0xfc, 0xdf, + 0xf5, 0x0, 0x5, 0xff, 0xd1, 0xa4, 0x0, 0x0, + 0x4, 0xa1, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x4f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x10, 0x6f, 0xf1, 0x3, 0x10, 0x0, + 0x0, 0x5f, 0xd0, 0x6f, 0xf1, 0x3f, 0xd1, 0x0, + 0x3, 0xff, 0xf1, 0x6f, 0xf1, 0x5f, 0xfd, 0x0, + 0xd, 0xff, 0x40, 0x6f, 0xf1, 0x9, 0xff, 0x70, + 0x4f, 0xf7, 0x0, 0x6f, 0xf1, 0x0, 0xcf, 0xe0, + 0x9f, 0xf0, 0x0, 0x6f, 0xf1, 0x0, 0x5f, 0xf3, + 0xbf, 0xc0, 0x0, 0x6f, 0xf1, 0x0, 0x2f, 0xf5, + 0xbf, 0xc0, 0x0, 0x4f, 0xe0, 0x0, 0x1f, 0xf6, + 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0x6f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf0, + 0xf, 0xfe, 0x10, 0x0, 0x0, 0x5, 0xff, 0xa0, + 0x6, 0xff, 0xd3, 0x0, 0x0, 0x7f, 0xff, 0x20, + 0x0, 0x9f, 0xff, 0xda, 0xbe, 0xff, 0xf4, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0x0, 0x17, 0xbd, 0xca, 0x50, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, + 0x4, 0xfd, 0xdf, 0xff, 0xff, 0xfd, 0xef, 0x40, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, + 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, + 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, + 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, + 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, + 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x4, 0xfe, 0xdf, 0xff, 0xff, 0xfd, 0xdf, 0x40, + 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x3, 0xdd, 0x30, 0x3f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x4f, + 0xf4, 0x0, 0x0, 0x0, 0x9, 0xff, 0x99, 0xff, + 0xbf, 0xf4, 0x0, 0x0, 0x1, 0xbf, 0xf6, 0x22, + 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x2d, 0xfe, 0x35, + 0xff, 0x53, 0xef, 0xf4, 0x0, 0x4, 0xff, 0xc1, + 0x8f, 0xff, 0xf8, 0x2d, 0xfe, 0x40, 0x7f, 0xfa, + 0x1a, 0xff, 0xff, 0xff, 0xa1, 0xaf, 0xf7, 0xcf, + 0x82, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x28, 0xfc, + 0x14, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x41, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf9, 0x0, 0x8f, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xe, 0xff, + 0xf6, 0x0, 0x6f, 0xff, 0xe0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xfc, 0x1b, 0xb1, 0xcf, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xc2, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F01C "" */ + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0xaf, 0xb0, 0x0, 0x0, 0x0, + 0xb, 0xfa, 0x0, 0x5, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x50, 0x1e, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xe1, 0xaf, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, + + /* U+F021 "" */ + 0x0, 0x0, 0x6, 0xbd, 0xda, 0x50, 0x2, 0xff, + 0x0, 0x5, 0xef, 0xff, 0xff, 0xfe, 0x42, 0xff, + 0x0, 0x7f, 0xff, 0xa7, 0x7b, 0xff, 0xf9, 0xff, + 0x5, 0xff, 0xc1, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xe, 0xfc, 0x0, 0x0, 0x2, 0x22, 0xdf, 0xff, + 0x5f, 0xf2, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x8f, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xb, 0xf8, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2f, 0xf4, + 0xff, 0xfd, 0x22, 0x20, 0x0, 0x0, 0xcf, 0xe0, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x2c, 0xff, 0x40, + 0xff, 0x9f, 0xff, 0xb7, 0x6a, 0xff, 0xf7, 0x0, + 0xff, 0x24, 0xdf, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0xff, 0x20, 0x5, 0xac, 0xdb, 0x60, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d, + 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x8f, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0x1, 0x50, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xbe, 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, + 0xff, 0xff, 0xff, 0xff, 0x5, 0xf8, 0xdf, 0xff, + 0xff, 0xff, 0x2, 0x60, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x3, 0xee, 0x10, 0x0, 0x0, 0x8, 0xff, 0x0, + 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x5, 0xfc, 0x7, 0xf4, 0xdf, 0xff, 0xff, + 0xff, 0x2, 0x50, 0x5f, 0x60, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xf7, 0xd, 0xc0, 0xbd, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x6, 0xf7, 0xd, + 0xc0, 0xad, 0xdf, 0xff, 0xff, 0xff, 0x2, 0x50, + 0x5f, 0x60, 0xe9, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0x5, 0xfc, 0x6, 0xf4, 0x0, 0x0, 0x8, 0xff, + 0x0, 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x0, + 0x8d, 0x0, 0x0, 0x2, 0xee, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, + + /* U+F03E "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xc, 0xff, 0xff, 0xee, 0xff, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xfe, 0x22, 0xef, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xe2, 0x0, 0x2e, 0xff, + 0xff, 0xfe, 0x4e, 0xfe, 0x20, 0x0, 0x2, 0xff, + 0xff, 0xe2, 0x2, 0xc2, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F043 "ïƒ" */ + 0x0, 0x0, 0x4e, 0x40, 0x0, 0x0, 0x0, 0xb, + 0xfb, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x30, 0x0, 0xc, 0xff, 0xff, 0xfc, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xf8, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0x2f, 0xff, 0xff, 0xff, 0xfe, 0xf2, 0xbf, 0xff, + 0xff, 0xfe, 0x9f, 0xa1, 0xbf, 0xff, 0xff, 0x92, + 0xff, 0xa2, 0x2f, 0xff, 0xf2, 0x4, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x2, 0x9e, 0xfe, 0x92, 0x0, + + /* U+F048 "ïˆ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x30, 0x0, + 0x1, 0xcc, 0xff, 0x40, 0x0, 0x2d, 0xff, 0xff, + 0x40, 0x3, 0xef, 0xff, 0xff, 0x40, 0x3f, 0xff, + 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x45, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x3, 0xef, + 0xff, 0xff, 0x40, 0x0, 0x2e, 0xff, 0xff, 0x30, + 0x0, 0x1, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "ï‹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x8e, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "ïŒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xf7, 0x0, 0x7f, 0xff, + 0xf7, + + /* U+F04D "ï" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, + + /* U+F051 "ï‘" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0x10, 0x0, + 0x3, 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xff, + 0xfe, 0x30, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x54, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, + 0xff, 0xf3, 0x4, 0xff, 0xff, 0xfe, 0x30, 0x4, + 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xcc, 0x10, + 0x0, 0x3, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + + /* U+F053 "ï“" */ + 0x0, 0x0, 0x0, 0x1a, 0x40, 0x0, 0x0, 0x1, + 0xdf, 0xf0, 0x0, 0x0, 0x1d, 0xff, 0xa0, 0x0, + 0x1, 0xdf, 0xfa, 0x0, 0x0, 0x1d, 0xff, 0xa0, + 0x0, 0x1, 0xdf, 0xfa, 0x0, 0x0, 0xc, 0xff, + 0xa0, 0x0, 0x0, 0xd, 0xff, 0x80, 0x0, 0x0, + 0x1, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0x80, 0x0, 0x0, 0x1, 0xdf, 0xf8, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0x80, 0x0, 0x0, 0x1, 0xdf, + 0xf0, 0x0, 0x0, 0x0, 0x1b, 0x50, + + /* U+F054 "ï”" */ + 0x4, 0xa1, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x10, + 0x0, 0x0, 0xa, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0xaf, 0xfd, 0x10, 0x0, 0x0, 0xa, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x10, 0x0, 0x0, + 0xa, 0xff, 0xc0, 0x0, 0x0, 0x8, 0xff, 0xd0, + 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, 0xff, + 0xd1, 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, + 0xff, 0xd1, 0x0, 0x0, 0xf, 0xfd, 0x10, 0x0, + 0x0, 0x5, 0xb1, 0x0, 0x0, 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x48, 0x88, 0x8c, 0xff, 0xc8, + 0x88, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x48, 0x88, 0x8c, 0xff, 0xc8, 0x88, 0x84, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, + 0x0, 0x0, + + /* U+F068 "ï¨" */ + 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb7, + + /* U+F06E "ï®" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, 0xfd, + 0x40, 0x0, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, + 0xef, 0xf7, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x9e, + 0x80, 0x4f, 0xff, 0x70, 0x4f, 0xff, 0xc0, 0x0, + 0xaf, 0xf8, 0xc, 0xff, 0xf4, 0xdf, 0xff, 0x80, + 0x9a, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0xdf, 0xff, + 0x80, 0xef, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0x4f, + 0xff, 0xc0, 0x8f, 0xff, 0xf8, 0xc, 0xff, 0xf4, + 0x7, 0xff, 0xf4, 0x8, 0xee, 0x80, 0x4f, 0xff, + 0x70, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, 0xef, + 0xf8, 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, + 0xda, 0x50, 0x0, 0x0, + + /* U+F070 "ï°" */ + 0x8c, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0x80, 0x49, + 0xdf, 0xfd, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xd8, 0x8c, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xf8, 0x0, 0x0, 0x4e, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x1c, 0xff, 0x69, 0xe8, + 0x4, 0xff, 0xf7, 0x0, 0x4, 0xe3, 0x0, 0x9f, + 0xfe, 0xff, 0x80, 0xcf, 0xff, 0x40, 0xd, 0xff, + 0x70, 0x5, 0xff, 0xff, 0xe0, 0x8f, 0xff, 0xd0, + 0xd, 0xff, 0xf7, 0x0, 0x2d, 0xff, 0xe0, 0x8f, + 0xff, 0xd0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0xaf, + 0xf8, 0xcf, 0xff, 0x30, 0x0, 0x7f, 0xff, 0x40, + 0x0, 0x6, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x8, + 0xff, 0xf4, 0x0, 0x0, 0x3e, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x4d, 0xff, 0xc8, 0x82, 0x1, 0xbf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfc, + 0x10, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc8, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd8, 0x8d, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xa0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xb0, 0xb, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xc0, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xd0, 0xd, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xf9, 0x9f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xe2, 0x2e, 0xff, 0xff, 0xf8, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x90, 0x9, 0xff, 0xff, + 0xff, 0x10, 0xa, 0xff, 0xff, 0xff, 0xe3, 0x3e, + 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0x78, 0x8e, 0xff, 0x15, 0xff, 0xe8, 0xff, 0xe2, + 0x0, 0x2, 0xe5, 0x4f, 0xfe, 0x20, 0xfe, 0x20, + 0x0, 0x0, 0x13, 0xff, 0xf3, 0x0, 0x52, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x31, 0x0, 0x52, 0x0, + 0x0, 0x2, 0xef, 0xf4, 0x5e, 0x20, 0xfe, 0x20, + 0x78, 0x8e, 0xff, 0x51, 0xff, 0xe8, 0xff, 0xe2, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1d, 0xff, 0x99, + 0xff, 0xd1, 0x0, 0x1, 0xdf, 0xf9, 0x0, 0x9f, + 0xfd, 0x10, 0x1d, 0xff, 0x90, 0x0, 0x9, 0xff, + 0xd1, 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x9f, 0xfb, + 0x5f, 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F078 "ï¸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0xbf, 0xf9, + 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x1d, 0xff, 0x90, + 0x0, 0x9, 0xff, 0xd1, 0x1, 0xdf, 0xf9, 0x0, + 0x9f, 0xfd, 0x10, 0x0, 0x1d, 0xff, 0x99, 0xff, + 0xd1, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x10, + 0xef, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x1d, 0xff, + 0xff, 0xd1, 0xaf, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x6b, 0x1f, 0xf1, 0xb6, 0x0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x6b, 0x1f, + 0xf1, 0xb6, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, + 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xfe, 0x1, 0xdf, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "ï»" */ + 0x8f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F093 "ï‚“" */ + 0x0, 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf0, 0xdf, 0xfd, 0xf, 0xff, 0xfd, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xea, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x4f, 0xff, 0x90, 0x0, 0x2, 0x8f, + 0xf3, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0xa, 0xff, + 0xff, 0xe4, 0xbf, 0xff, 0xd1, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x8, 0xee, 0x80, 0x0, 0x0, 0x6, 0x61, 0x8, + 0xff, 0xff, 0x80, 0x0, 0x2d, 0xff, 0xd0, 0xef, + 0x33, 0xfe, 0x0, 0x2e, 0xff, 0xf3, 0xe, 0xf3, + 0x3f, 0xe0, 0x2e, 0xff, 0xf3, 0x0, 0x8f, 0xff, + 0xff, 0x6e, 0xff, 0xf3, 0x0, 0x0, 0x8e, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x8, 0xff, 0xff, 0xf6, 0xef, + 0xff, 0x30, 0x0, 0xef, 0x33, 0xfe, 0x2, 0xef, + 0xff, 0x30, 0xe, 0xf3, 0x3f, 0xe0, 0x2, 0xef, + 0xff, 0x30, 0x8f, 0xff, 0xf8, 0x0, 0x2, 0xdf, + 0xfd, 0x0, 0x8e, 0xe8, 0x0, 0x0, 0x0, 0x66, + 0x10, + + /* U+F0C5 "" */ + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xd, 0x20, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xf, 0xe2, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf, 0xfd, 0xdf, 0xf0, 0xff, + 0xff, 0xff, 0x20, 0x0, 0xff, 0xf0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xdf, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xe2, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfc, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x11, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x11, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, + + /* U+F0C9 "" */ + 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, + + /* U+F0E0 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xd2, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2d, + 0xff, 0x62, 0xcf, 0xff, 0xff, 0xfc, 0x26, 0xff, + 0xff, 0xfa, 0x18, 0xff, 0xff, 0x81, 0xaf, 0xff, + 0xff, 0xff, 0xe3, 0x4d, 0xd4, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x81, 0x18, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F0E7 "" */ + 0x0, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x20, + 0xd, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xd7, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x99, 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, + 0x99, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xd, 0xff, 0xff, + 0xd, 0x20, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, + 0xe2, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, 0xfd, + 0xff, 0xff, 0xf, 0xff, 0xff, 0x20, 0x0, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xf, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfd, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1, + 0xbf, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, + + /* U+F11C "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0xf, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, + 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, 0xf8, + 0x8, 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, 0x0, + 0xff, 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x17, + 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "ï…›" */ + 0xdf, 0xff, 0xff, 0xf0, 0xd2, 0x0, 0xff, 0xff, + 0xff, 0xf0, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xe2, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xc9, 0x40, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x4, 0xdf, + 0xff, 0xfc, 0xa8, 0x8a, 0xcf, 0xff, 0xfd, 0x40, + 0x6f, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xf6, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfc, 0x1a, 0x30, 0x0, 0x5a, + 0xdf, 0xfd, 0xa5, 0x0, 0x3, 0xa1, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0xa8, 0x8a, 0xef, 0xff, + 0x50, 0x0, 0x0, 0x1, 0xdf, 0x70, 0x0, 0x0, + 0x7, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x12, 0x0, + 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F241 "ï‰" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F242 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F243 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F244 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb9, 0x29, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x10, 0x2, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0x80, 0xa, + 0x90, 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, 0xdf, + 0xff, 0x77, 0xf7, 0x55, 0x55, 0x55, 0x55, 0x8f, + 0xd3, 0xf, 0xff, 0xfd, 0xcc, 0xdf, 0xdc, 0xcc, + 0xcc, 0xcd, 0xff, 0xb0, 0x8f, 0xfe, 0x10, 0x0, + 0xaa, 0x0, 0x0, 0x0, 0x4d, 0x40, 0x0, 0x46, + 0x10, 0x0, 0x1, 0xf2, 0x2, 0x33, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xb1, 0xcf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, + 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x18, 0xdf, 0xfd, 0x92, 0x0, 0x2, 0xef, + 0xfb, 0xef, 0xff, 0x30, 0xd, 0xff, 0xfa, 0x2e, + 0xff, 0xe0, 0x4f, 0xff, 0xfa, 0x3, 0xff, 0xf5, + 0x9f, 0xfa, 0xfa, 0x35, 0x4f, 0xfa, 0xcf, 0xc0, + 0x8a, 0x3d, 0xb, 0xfd, 0xef, 0xfb, 0x3, 0x12, + 0x8f, 0xfe, 0xff, 0xff, 0xb0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x8, 0xff, 0xff, 0xef, 0xfd, + 0x11, 0x10, 0x9f, 0xff, 0xdf, 0xd1, 0x59, 0x3b, + 0xb, 0xfd, 0xaf, 0xd7, 0xfa, 0x38, 0x1d, 0xfb, + 0x5f, 0xff, 0xfa, 0x1, 0xdf, 0xf7, 0xd, 0xff, + 0xfa, 0x1d, 0xff, 0xf1, 0x3, 0xef, 0xfc, 0xdf, + 0xff, 0x50, 0x0, 0x18, 0xdf, 0xfe, 0xa3, 0x0, + + /* U+F2ED "ï‹­" */ + 0x0, 0x0, 0x7f, 0xff, 0xf7, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, 0x9f, + 0xf0, 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, + 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, + 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, + 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, + 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, 0x88, + 0xf8, 0x8f, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, + 0x9f, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x1d, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, + 0x1d, 0xff, 0x70, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xfa, 0x1d, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xde, 0xdb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1d, 0xff, 0xff, + 0xfa, 0xef, 0xfe, 0xaf, 0xff, 0xff, 0x1, 0xdf, + 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, 0xff, 0xff, + 0x1d, 0xff, 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x2, 0xef, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x2, 0xef, 0xff, 0xff, 0x1d, 0xff, + 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, 0xff, 0xff, + 0x1, 0xdf, 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, + 0xff, 0xff, 0x0, 0x1d, 0xff, 0xff, 0xfa, 0xef, + 0xfe, 0xaf, 0xff, 0xff, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + + /* U+F7C2 "" */ + 0x0, 0x8, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xfe, 0x8, 0xf8, 0xf, 0xb, + 0x40, 0xff, 0x8f, 0xf8, 0xf, 0xb, 0x40, 0xff, + 0xff, 0xf8, 0xf, 0xb, 0x40, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xe4, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xe0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, + 0xef, 0x10, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf1, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x11, 0xcf, 0xff, 0x77, 0x77, 0x77, + 0x77, 0xbf, 0xf1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x17, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x7, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 69, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 69, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 18, .adv_w = 100, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 31, .adv_w = 180, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 97, .adv_w = 159, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 177, .adv_w = 216, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 255, .adv_w = 176, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 327, .adv_w = 54, .box_w = 2, .box_h = 5, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 332, .adv_w = 86, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 362, .adv_w = 87, .box_w = 4, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 392, .adv_w = 102, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 417, .adv_w = 149, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 449, .adv_w = 58, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 457, .adv_w = 98, .box_w = 6, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 466, .adv_w = 58, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 471, .adv_w = 90, .box_w = 8, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 535, .adv_w = 171, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 595, .adv_w = 95, .box_w = 5, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 625, .adv_w = 147, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 679, .adv_w = 146, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 733, .adv_w = 171, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 799, .adv_w = 147, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 853, .adv_w = 158, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 913, .adv_w = 153, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 967, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1027, .adv_w = 158, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1087, .adv_w = 58, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1101, .adv_w = 58, .box_w = 3, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1119, .adv_w = 149, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1151, .adv_w = 149, .box_w = 8, .box_h = 6, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 1175, .adv_w = 149, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1207, .adv_w = 147, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1261, .adv_w = 265, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1381, .adv_w = 187, .box_w = 13, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1459, .adv_w = 194, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1525, .adv_w = 185, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1591, .adv_w = 211, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1663, .adv_w = 172, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1717, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1771, .adv_w = 198, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1843, .adv_w = 208, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1909, .adv_w = 79, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1927, .adv_w = 131, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1975, .adv_w = 184, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2041, .adv_w = 152, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2095, .adv_w = 244, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2173, .adv_w = 208, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2239, .adv_w = 215, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2317, .adv_w = 185, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2377, .adv_w = 215, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2482, .adv_w = 186, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2542, .adv_w = 159, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2602, .adv_w = 150, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2662, .adv_w = 202, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2728, .adv_w = 182, .box_w = 13, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2806, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2914, .adv_w = 172, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2980, .adv_w = 166, .box_w = 12, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3052, .adv_w = 168, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3118, .adv_w = 85, .box_w = 5, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3156, .adv_w = 90, .box_w = 8, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 3220, .adv_w = 85, .box_w = 4, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3250, .adv_w = 149, .box_w = 8, .box_h = 7, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 3278, .adv_w = 128, .box_w = 8, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3286, .adv_w = 154, .box_w = 5, .box_h = 2, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 3291, .adv_w = 153, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3332, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3392, .adv_w = 146, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3433, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3493, .adv_w = 157, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3538, .adv_w = 90, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3580, .adv_w = 177, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3640, .adv_w = 174, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3694, .adv_w = 71, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3712, .adv_w = 73, .box_w = 6, .box_h = 15, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 3757, .adv_w = 158, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3811, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3823, .adv_w = 271, .box_w = 15, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3891, .adv_w = 174, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3932, .adv_w = 163, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3977, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 4037, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4097, .adv_w = 105, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4124, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4160, .adv_w = 106, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4199, .adv_w = 173, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4240, .adv_w = 143, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4285, .adv_w = 230, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4353, .adv_w = 141, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4394, .adv_w = 143, .box_w = 10, .box_h = 12, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 4454, .adv_w = 133, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4490, .adv_w = 90, .box_w = 6, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4535, .adv_w = 77, .box_w = 3, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 4558, .adv_w = 90, .box_w = 5, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4596, .adv_w = 149, .box_w = 9, .box_h = 5, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 4619, .adv_w = 107, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 4637, .adv_w = 80, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 4643, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4779, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4875, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4987, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5083, .adv_w = 176, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5149, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5277, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5405, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5531, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5659, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5767, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5895, .adv_w = 128, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5951, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6035, .adv_w = 288, .box_w = 18, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6179, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6275, .adv_w = 176, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6363, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 6443, .adv_w = 224, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 6569, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6674, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6772, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 6852, .adv_w = 224, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 6964, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7034, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7104, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7202, .adv_w = 224, .box_w = 14, .box_h = 4, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 7230, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7338, .adv_w = 320, .box_w = 20, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7498, .adv_w = 288, .box_w = 20, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 7658, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7786, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 7856, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 7926, .adv_w = 320, .box_w = 20, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8066, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8162, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8290, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 8435, .adv_w = 224, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8540, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8652, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8750, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8848, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8944, .adv_w = 160, .box_w = 12, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 9040, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9152, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9264, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9372, .adv_w = 256, .box_w = 18, .box_h = 18, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 9534, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9630, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 9780, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 9880, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 9980, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 10080, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 10180, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 10280, .adv_w = 320, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10427, .adv_w = 224, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 10523, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10635, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 10780, .adv_w = 320, .box_w = 20, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10900, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10996, .adv_w = 258, .box_w = 17, .box_h = 11, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 3, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 12, 0, 7, -6, 0, 0, + 0, 0, -14, -15, 2, 12, 6, 4, + -10, 2, 13, 1, 11, 3, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 15, 2, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 0, -8, 0, 0, 0, 0, + 0, -5, 4, 5, 0, 0, -3, 0, + -2, 3, 0, -3, 0, -3, -1, -5, + 0, 0, 0, 0, -3, 0, 0, -3, + -4, 0, 0, -3, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + -3, 0, -4, 0, -7, 0, -31, 0, + 0, -5, 0, 5, 8, 0, 0, -5, + 3, 3, 8, 5, -4, 5, 0, 0, + -15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -7, -3, -13, 0, -10, + -2, 0, 0, 0, 0, 1, 10, 0, + -8, -2, -1, 1, 0, -4, 0, 0, + -2, -19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -20, -2, 10, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 8, + 0, 3, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 2, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 5, 3, 8, -3, 0, 0, 5, -3, + -8, -35, 2, 7, 5, 1, -3, 0, + 9, 0, 8, 0, 8, 0, -24, 0, + -3, 8, 0, 8, -3, 5, 3, 0, + 0, 1, -3, 0, 0, -4, 20, 0, + 20, 0, 8, 0, 11, 3, 4, 8, + 0, 0, 0, -9, 0, 0, 0, 0, + 1, -2, 0, 2, -5, -3, -5, 2, + 0, -3, 0, 0, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -14, 0, -16, 0, 0, 0, + 0, -2, 0, 25, -3, -3, 3, 3, + -2, 0, -3, 3, 0, 0, -14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -25, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -16, 0, 15, 0, 0, -9, 0, + 8, 0, -17, -25, -17, -5, 8, 0, + 0, -17, 0, 3, -6, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 8, -31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 0, 2, 0, 0, 0, + 0, 0, 2, 2, -3, -5, 0, -1, + -1, -3, 0, 0, -2, 0, 0, 0, + -5, 0, -2, 0, -6, -5, 0, -6, + -8, -8, -5, 0, -5, 0, -5, 0, + 0, 0, 0, -2, 0, 0, 3, 0, + 2, -3, 0, 1, 0, 0, 0, 3, + -2, 0, 0, 0, -2, 3, 3, -1, + 0, 0, 0, -5, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 3, -2, 0, + -3, 0, -4, 0, 0, -2, 0, 8, + 0, 0, -3, 0, 0, 0, 0, 0, + -1, 1, -2, -2, 0, 0, -3, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, -3, -3, 0, + 0, 0, 0, 0, 1, 0, 0, -2, + 0, -3, -3, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, -2, -3, 0, -4, 0, -8, + -2, -8, 5, 0, 0, -5, 3, 5, + 7, 0, -6, -1, -3, 0, -1, -12, + 3, -2, 2, -14, 3, 0, 0, 1, + -13, 0, -14, -2, -22, -2, 0, -13, + 0, 5, 7, 0, 3, 0, 0, 0, + 0, 1, 0, -5, -3, 0, -8, 0, + 0, 0, -3, 0, 0, 0, -3, 0, + 0, 0, 0, 0, -1, -1, 0, -1, + -3, 0, 0, 0, 0, 0, 0, 0, + -3, -3, 0, -2, -3, -2, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -3, + 0, -2, 0, -5, 3, 0, 0, -3, + 1, 3, 3, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 2, + 0, 0, -3, 0, -3, -2, -3, 0, + 0, 0, 0, 0, 0, 0, 2, 0, + -2, 0, 0, 0, 0, -3, -4, 0, + -5, 0, 8, -2, 1, -8, 0, 0, + 7, -13, -13, -11, -5, 3, 0, -2, + -17, -5, 0, -5, 0, -5, 4, -5, + -16, 0, -7, 0, 0, 1, -1, 2, + -2, 0, 3, 0, -8, -10, 0, -13, + -6, -5, -6, -8, -3, -7, -1, -5, + -7, 2, 0, 1, 0, -3, 0, 0, + 0, 2, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, -1, 0, -1, -3, 0, -4, -6, + -6, -1, 0, -8, 0, 0, 0, 0, + 0, 0, -2, 0, 0, 0, 0, 1, + -2, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 12, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + -5, 0, 0, 0, 0, -13, -8, 0, + 0, 0, -4, -13, 0, 0, -3, 3, + 0, -7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, -5, 0, + 0, 0, 0, 3, 0, 2, -5, -5, + 0, -3, -3, -3, 0, 0, 0, 0, + 0, 0, -8, 0, -3, 0, -4, -3, + 0, -6, -6, -8, -2, 0, -5, 0, + -8, 0, 0, 0, 0, 20, 0, 0, + 1, 0, 0, -3, 0, 3, 0, -11, + 0, 0, 0, 0, 0, -24, -5, 8, + 8, -2, -11, 0, 3, -4, 0, -13, + -1, -3, 3, -18, -3, 3, 0, 4, + -9, -4, -9, -8, -11, 0, 0, -15, + 0, 15, 0, 0, -1, 0, 0, 0, + -1, -1, -3, -7, -8, -1, -24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, -1, -3, -4, 0, 0, + -5, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -5, 0, 0, 5, + -1, 3, 0, -6, 3, -2, -1, -7, + -3, 0, -3, -3, -2, 0, -4, -4, + 0, 0, -2, -1, -2, -4, -3, 0, + 0, -3, 0, 3, -2, 0, -6, 0, + 0, 0, -5, 0, -4, 0, -4, -4, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 3, 0, -4, 0, -2, -3, + -8, -2, -2, -2, -1, -2, -3, -1, + 0, 0, 0, 0, 0, -3, -2, -2, + 0, 0, 0, 0, 3, -2, 0, -2, + 0, 0, 0, -2, -3, -2, -2, -3, + -2, 0, 2, 10, -1, 0, -7, 0, + -2, 5, 0, -3, -11, -3, 4, 0, + 0, -12, -4, 3, -4, 2, 0, -2, + -2, -8, 0, -4, 1, 0, 0, -4, + 0, 0, 0, 3, 3, -5, -5, 0, + -4, -3, -4, -3, -3, 0, -4, 1, + -5, -4, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, -3, + 0, 0, -3, -3, 0, 0, 0, 0, + -3, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + -4, 0, -5, 0, 0, 0, -8, 0, + 2, -6, 5, 1, -2, -12, 0, 0, + -6, -3, 0, -10, -6, -7, 0, 0, + -11, -3, -10, -10, -12, 0, -7, 0, + 2, 17, -3, 0, -6, -3, -1, -3, + -4, -7, -5, -9, -10, -6, -3, 0, + 0, -2, 0, 1, 0, 0, -18, -2, + 8, 6, -6, -9, 0, 1, -8, 0, + -13, -2, -3, 5, -24, -3, 1, 0, + 0, -17, -3, -13, -3, -19, 0, 0, + -18, 0, 15, 1, 0, -2, 0, 0, + 0, 0, -1, -2, -10, -2, 0, -17, + 0, 0, 0, 0, -8, 0, -2, 0, + -1, -7, -12, 0, 0, -1, -4, -8, + -3, 0, -2, 0, 0, 0, 0, -12, + -3, -8, -8, -2, -4, -6, -3, -4, + 0, -5, -2, -8, -4, 0, -3, -5, + -3, -5, 0, 1, 0, -2, -8, 0, + 5, 0, -5, 0, 0, 0, 0, 3, + 0, 2, -5, 10, 0, -3, -3, -3, + 0, 0, 0, 0, 0, 0, -8, 0, + -3, 0, -4, -3, 0, -6, -6, -8, + -2, 0, -5, 2, 10, 0, 0, 0, + 0, 20, 0, 0, 1, 0, 0, -3, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -2, -5, 0, 0, 0, 0, 0, -1, + 0, 0, 0, -3, -3, 0, 0, -5, + -3, 0, 0, -5, 0, 4, -1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 4, 5, 2, -2, 0, -8, + -4, 0, 8, -8, -8, -5, -5, 10, + 5, 3, -22, -2, 5, -3, 0, -3, + 3, -3, -9, 0, -3, 3, -3, -2, + -8, -2, 0, 0, 8, 5, 0, -7, + 0, -14, -3, 7, -3, -10, 1, -3, + -8, -8, -3, 10, 3, 0, -4, 0, + -7, 0, 2, 8, -6, -9, -10, -6, + 8, 0, 1, -19, -2, 3, -4, -2, + -6, 0, -6, -9, -4, -4, -2, 0, + 0, -6, -5, -3, 0, 8, 6, -3, + -14, 0, -14, -4, 0, -9, -15, -1, + -8, -4, -8, -7, 7, 0, 0, -3, + 0, -5, -2, 0, -3, -5, 0, 4, + -8, 3, 0, 0, -14, 0, -3, -6, + -4, -2, -8, -6, -8, -6, 0, -8, + -3, -6, -5, -8, -3, 0, 0, 1, + 12, -4, 0, -8, -3, 0, -3, -5, + -6, -7, -7, -10, -3, -5, 5, 0, + -4, 0, -13, -3, 2, 5, -8, -9, + -5, -8, 8, -3, 1, -24, -5, 5, + -6, -4, -9, 0, -8, -11, -3, -3, + -2, -3, -5, -8, -1, 0, 0, 8, + 7, -2, -17, 0, -15, -6, 6, -10, + -17, -5, -9, -11, -13, -8, 5, 0, + 0, 0, 0, -3, 0, 0, 3, -3, + 5, 2, -5, 5, 0, 0, -8, -1, + 0, -1, 0, 1, 1, -2, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + 0, 2, 8, 1, 0, -3, 0, 0, + 0, 0, -2, -2, -3, 0, 0, 0, + 1, 2, 0, 0, 0, 0, 2, 0, + -2, 0, 10, 0, 5, 1, 1, -3, + 0, 5, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 8, 0, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -15, 0, -3, 4, 0, 8, + 0, 0, 25, 3, -5, -5, 3, 3, + -2, 1, -13, 0, 0, 12, -15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -17, 10, 36, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, -5, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, -7, 0, + 0, 1, 0, 0, 3, 33, -5, -2, + 8, 7, -7, 3, 0, 0, 3, 3, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -33, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + 0, 0, 0, -7, 0, 0, 0, 0, + -6, -1, 0, 0, 0, -6, 0, -3, + 0, -12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -17, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -3, 0, 0, -5, 0, -4, 0, + -7, 0, 0, 0, -4, 3, -3, 0, + 0, -7, -3, -6, 0, 0, -7, 0, + -3, 0, -12, 0, -3, 0, 0, -21, + -5, -10, -3, -9, 0, 0, -17, 0, + -7, -1, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -5, -2, -4, 0, 0, + 0, 0, -6, 0, -6, 3, -3, 5, + 0, -2, -6, -2, -4, -5, 0, -3, + -1, -2, 2, -7, -1, 0, 0, 0, + -23, -2, -4, 0, -6, 0, -2, -12, + -2, 0, 0, -2, -2, 0, 0, 0, + 0, 2, 0, -2, -4, -2, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, + 0, -6, 0, -2, 0, 0, 0, -5, + 3, 0, 0, 0, -7, -3, -5, 0, + 0, -7, 0, -3, 0, -12, 0, 0, + 0, 0, -25, 0, -5, -9, -13, 0, + 0, -17, 0, -2, -4, 0, 0, 0, + 0, 0, 0, 0, 0, -3, -4, -1, + -4, 1, 0, 0, 4, -3, 0, 8, + 13, -3, -3, -8, 3, 13, 4, 6, + -7, 3, 11, 3, 7, 6, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 16, 12, -5, -3, 0, -2, + 20, 11, 20, 0, 0, 0, 3, 0, + 0, 9, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 0, 0, -22, -3, -2, -10, + -13, 0, 0, -17, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, -22, -3, -2, + -10, -13, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, -6, 3, 0, -3, + 2, 5, 3, -8, 0, -1, -2, 3, + 0, 2, 0, 0, 0, 0, -6, 0, + -2, -2, -5, 0, -2, -10, 0, 16, + -3, 0, -6, -2, 0, -2, -4, 0, + -3, -7, -5, -3, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, -22, + -3, -2, -10, -13, 0, 0, -17, 0, + 0, 0, 0, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, -8, -3, -2, 8, -2, -3, + -10, 1, -2, 1, -2, -7, 1, 6, + 1, 2, 1, 2, -6, -10, -3, 0, + -10, -5, -7, -11, -10, 0, -4, -5, + -3, -3, -2, -2, -3, -2, 0, -2, + -1, 4, 0, 4, -2, 0, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2, -3, -3, 0, 0, + -7, 0, -1, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, -3, 0, -3, + 0, 0, 0, 0, -2, 0, 0, -4, + -3, 3, 0, -4, -5, -2, 0, -7, + -2, -6, -2, -3, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -17, 0, 8, 0, 0, -5, 0, + 0, 0, 0, -3, 0, -3, 0, 0, + -1, 0, 0, -2, 0, -6, 0, 0, + 11, -3, -8, -8, 2, 3, 3, -1, + -7, 2, 4, 2, 8, 2, 8, -2, + -7, 0, 0, -10, 0, 0, -8, -7, + 0, 0, -5, 0, -3, -4, 0, -4, + 0, -4, 0, -2, 4, 0, -2, -8, + -3, 9, 0, 0, -2, 0, -5, 0, + 0, 3, -6, 0, 3, -3, 2, 0, + 0, -8, 0, -2, -1, 0, -3, 3, + -2, 0, 0, 0, -10, -3, -6, 0, + -8, 0, 0, -12, 0, 9, -3, 0, + -5, 0, 2, 0, -3, 0, -3, -8, + 0, -3, 3, 0, 0, 0, 0, -2, + 0, 0, 3, -3, 1, 0, 0, -3, + -2, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -16, 0, 6, 0, + 0, -2, 0, 0, 0, 0, 1, 0, + -3, -3, 0, 0, 0, 5, 0, 6, + 0, 0, 0, 0, 0, -16, -15, 1, + 11, 8, 4, -10, 2, 11, 0, 9, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserrat_16 = { +#else +lv_font_t lv_font_montserrat_16 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 18, /*The maximum line height required by the font*/ + .base_line = 3, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_16*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_18.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_18.c new file mode 100644 index 0000000..c2e5d1d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_18.c @@ -0,0 +1,2869 @@ +/******************************************************************************* + * Size: 18 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 18 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_18.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_18 + #define LV_FONT_MONTSERRAT_18 1 +#endif + +#if LV_FONT_MONTSERRAT_18 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x9f, 0x68, 0xf6, 0x8f, 0x57, 0xf4, 0x6f, 0x46, + 0xf3, 0x5f, 0x35, 0xf2, 0x4f, 0x10, 0x0, 0x15, + 0xa, 0xf7, 0x7f, 0x40, + + /* U+0022 "\"" */ + 0xda, 0x9, 0xed, 0x90, 0x9d, 0xd9, 0x8, 0xdc, + 0x80, 0x8d, 0xc8, 0x8, 0xc0, 0x0, 0x0, + + /* U+0023 "#" */ + 0x0, 0x0, 0xe5, 0x0, 0x4f, 0x0, 0x0, 0x0, + 0xf, 0x30, 0x6, 0xe0, 0x0, 0x0, 0x2, 0xf1, + 0x0, 0x8c, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x5, 0x5a, 0xe5, 0x55, 0xda, 0x55, + 0x0, 0x0, 0x9b, 0x0, 0xe, 0x60, 0x0, 0x0, + 0xb, 0x90, 0x0, 0xf4, 0x0, 0x0, 0x11, 0xd8, + 0x11, 0x3f, 0x31, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x2, 0x45, 0xf6, 0x44, 0x8e, 0x44, + 0x20, 0x0, 0x2f, 0x10, 0x7, 0xc0, 0x0, 0x0, + 0x4, 0xf0, 0x0, 0x9a, 0x0, 0x0, 0x0, 0x5e, + 0x0, 0xb, 0x90, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x7, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0xe, 0x40, 0x0, + 0x0, 0x2, 0xad, 0xff, 0xd9, 0x20, 0x3, 0xff, + 0xbf, 0xcd, 0xfc, 0x0, 0xbf, 0x40, 0xe4, 0x3, + 0x30, 0xe, 0xd0, 0xe, 0x40, 0x0, 0x0, 0xdf, + 0x30, 0xe4, 0x0, 0x0, 0x5, 0xff, 0xaf, 0x50, + 0x0, 0x0, 0x4, 0xbf, 0xff, 0xd7, 0x0, 0x0, + 0x0, 0x1e, 0xbe, 0xfb, 0x0, 0x0, 0x0, 0xe4, + 0xb, 0xf4, 0x0, 0x0, 0xe, 0x40, 0x6f, 0x60, + 0xb4, 0x0, 0xe4, 0xb, 0xf3, 0x1e, 0xfd, 0xaf, + 0xbe, 0xfa, 0x0, 0x17, 0xcf, 0xff, 0xc6, 0x0, + 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xe4, 0x0, 0x0, + + /* U+0025 "%" */ + 0x1, 0xbf, 0xc3, 0x0, 0x0, 0x2f, 0x40, 0x0, + 0xc9, 0x16, 0xe0, 0x0, 0xc, 0x90, 0x0, 0x2f, + 0x0, 0xc, 0x50, 0x7, 0xe0, 0x0, 0x4, 0xd0, + 0x0, 0xa7, 0x2, 0xf4, 0x0, 0x0, 0x3f, 0x0, + 0xc, 0x60, 0xc9, 0x0, 0x0, 0x0, 0xd7, 0x4, + 0xf1, 0x7e, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xe4, + 0x2f, 0x41, 0xae, 0xb2, 0x0, 0x0, 0x10, 0xc, + 0x90, 0xc9, 0x28, 0xe0, 0x0, 0x0, 0x6, 0xe1, + 0x3f, 0x0, 0xd, 0x50, 0x0, 0x2, 0xf4, 0x4, + 0xd0, 0x0, 0xa7, 0x0, 0x0, 0xba, 0x0, 0x3e, + 0x0, 0xc, 0x50, 0x0, 0x6e, 0x10, 0x0, 0xd7, + 0x5, 0xe1, 0x0, 0x1f, 0x50, 0x0, 0x2, 0xbf, + 0xc3, 0x0, + + /* U+0026 "&" */ + 0x0, 0x4, 0xcf, 0xe9, 0x0, 0x0, 0x0, 0x3, + 0xfb, 0x57, 0xf9, 0x0, 0x0, 0x0, 0x9f, 0x0, + 0xa, 0xd0, 0x0, 0x0, 0x8, 0xf1, 0x0, 0xdb, + 0x0, 0x0, 0x0, 0x2f, 0xb3, 0xce, 0x20, 0x0, + 0x0, 0x0, 0x6f, 0xfc, 0x20, 0x0, 0x0, 0x0, + 0x4e, 0xef, 0xb0, 0x0, 0x10, 0x0, 0x5f, 0xa0, + 0x6f, 0xb0, 0x1f, 0x50, 0xe, 0xc0, 0x0, 0x6f, + 0xb7, 0xf2, 0x2, 0xf8, 0x0, 0x0, 0x6f, 0xfb, + 0x0, 0xf, 0xd0, 0x0, 0x1, 0xdf, 0xb0, 0x0, + 0x8f, 0xe9, 0x8a, 0xfe, 0x8f, 0xb0, 0x0, 0x5c, + 0xff, 0xd9, 0x10, 0x68, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0xda, 0xd9, 0xd9, 0xc8, 0xc8, 0x0, + + /* U+0028 "(" */ + 0x0, 0x6f, 0x40, 0xd, 0xc0, 0x4, 0xf6, 0x0, + 0x9f, 0x10, 0xd, 0xd0, 0x0, 0xfb, 0x0, 0x2f, + 0x80, 0x3, 0xf7, 0x0, 0x4f, 0x60, 0x4, 0xf6, + 0x0, 0x3f, 0x70, 0x2, 0xf8, 0x0, 0xf, 0xb0, + 0x0, 0xdd, 0x0, 0x8, 0xf1, 0x0, 0x3f, 0x60, + 0x0, 0xdc, 0x0, 0x6, 0xf4, + + /* U+0029 ")" */ + 0x3f, 0x70, 0x0, 0xbe, 0x0, 0x5, 0xf5, 0x0, + 0x1f, 0xa0, 0x0, 0xce, 0x0, 0x9, 0xf1, 0x0, + 0x7f, 0x30, 0x6, 0xf4, 0x0, 0x5f, 0x50, 0x5, + 0xf5, 0x0, 0x6f, 0x40, 0x7, 0xf3, 0x0, 0x9f, + 0x10, 0xc, 0xe0, 0x1, 0xfa, 0x0, 0x5f, 0x50, + 0xb, 0xe0, 0x3, 0xf7, 0x0, + + /* U+002A "*" */ + 0x0, 0xe, 0x20, 0x3, 0x60, 0xe2, 0x56, 0x4d, + 0xdf, 0xce, 0x60, 0x1d, 0xff, 0x30, 0x4e, 0xcf, + 0xbf, 0x63, 0x60, 0xe2, 0x45, 0x0, 0xe, 0x20, + 0x0, + + /* U+002B "+" */ + 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x8f, 0x0, + 0x0, 0x0, 0x8, 0xf0, 0x0, 0x1, 0x22, 0x9f, + 0x22, 0x20, 0xcf, 0xff, 0xff, 0xff, 0x44, 0x55, + 0xaf, 0x55, 0x51, 0x0, 0x8, 0xf0, 0x0, 0x0, + 0x0, 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf0, 0x0, + 0x0, + + /* U+002C "," */ + 0x1, 0x10, 0xe, 0xf1, 0xf, 0xf2, 0x7, 0xe0, + 0xb, 0x90, 0xe, 0x40, + + /* U+002D "-" */ + 0x88, 0x88, 0x7f, 0xff, 0xfe, + + /* U+002E "." */ + 0x5, 0x60, 0x1f, 0xf2, 0xc, 0xd0, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x57, 0x0, 0x0, 0x0, 0xea, + 0x0, 0x0, 0x3, 0xf5, 0x0, 0x0, 0x9, 0xf0, + 0x0, 0x0, 0xe, 0xa0, 0x0, 0x0, 0x4f, 0x40, + 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0xe9, 0x0, + 0x0, 0x4, 0xf4, 0x0, 0x0, 0x9, 0xe0, 0x0, + 0x0, 0xe, 0x90, 0x0, 0x0, 0x4f, 0x40, 0x0, + 0x0, 0xae, 0x0, 0x0, 0x0, 0xf9, 0x0, 0x0, + 0x5, 0xf3, 0x0, 0x0, 0xa, 0xe0, 0x0, 0x0, + 0xf, 0x90, 0x0, 0x0, 0x5f, 0x30, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x4, 0xbe, 0xeb, 0x40, 0x0, 0x0, 0x6f, + 0xfb, 0xbf, 0xf6, 0x0, 0x2, 0xfd, 0x10, 0x1, + 0xdf, 0x20, 0xa, 0xf3, 0x0, 0x0, 0x3f, 0xa0, + 0xe, 0xe0, 0x0, 0x0, 0xe, 0xe0, 0xf, 0xb0, + 0x0, 0x0, 0xb, 0xf0, 0x1f, 0xa0, 0x0, 0x0, + 0xa, 0xf1, 0xf, 0xb0, 0x0, 0x0, 0xb, 0xf0, + 0xe, 0xe0, 0x0, 0x0, 0xe, 0xe0, 0x9, 0xf3, + 0x0, 0x0, 0x3f, 0x90, 0x2, 0xfd, 0x10, 0x1, + 0xdf, 0x20, 0x0, 0x6f, 0xfb, 0xbf, 0xf6, 0x0, + 0x0, 0x4, 0xbe, 0xeb, 0x40, 0x0, + + /* U+0031 "1" */ + 0xdf, 0xff, 0xc8, 0xaa, 0xfc, 0x0, 0xf, 0xc0, + 0x0, 0xfc, 0x0, 0xf, 0xc0, 0x0, 0xfc, 0x0, + 0xf, 0xc0, 0x0, 0xfc, 0x0, 0xf, 0xc0, 0x0, + 0xfc, 0x0, 0xf, 0xc0, 0x0, 0xfc, 0x0, 0xf, + 0xc0, + + /* U+0032 "2" */ + 0x1, 0x8d, 0xfe, 0xc5, 0x0, 0x4f, 0xfd, 0xac, + 0xff, 0x70, 0x3c, 0x30, 0x0, 0x2f, 0xf0, 0x0, + 0x0, 0x0, 0xb, 0xf2, 0x0, 0x0, 0x0, 0xc, + 0xf1, 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, + 0x2, 0xee, 0x20, 0x0, 0x0, 0x2e, 0xf3, 0x0, + 0x0, 0x2, 0xef, 0x30, 0x0, 0x0, 0x2e, 0xf3, + 0x0, 0x0, 0x2, 0xef, 0x30, 0x0, 0x0, 0x2e, + 0xfc, 0xaa, 0xaa, 0xa7, 0x5f, 0xff, 0xff, 0xff, + 0xfb, + + /* U+0033 "3" */ + 0x5f, 0xff, 0xff, 0xff, 0xf0, 0x3a, 0xaa, 0xaa, + 0xcf, 0xc0, 0x0, 0x0, 0x1, 0xee, 0x10, 0x0, + 0x0, 0xc, 0xf3, 0x0, 0x0, 0x0, 0x9f, 0x60, + 0x0, 0x0, 0x4, 0xfe, 0x61, 0x0, 0x0, 0x5, + 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x3e, 0xf2, + 0x0, 0x0, 0x0, 0x7, 0xf6, 0x0, 0x0, 0x0, + 0x6, 0xf6, 0x69, 0x10, 0x0, 0x1d, 0xf2, 0x9f, + 0xfc, 0xbc, 0xff, 0x80, 0x4, 0xae, 0xfe, 0xb5, + 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x4f, 0xb0, 0x0, 0x0, 0x0, + 0x1, 0xed, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0x50, 0x0, 0x0, + 0x0, 0x5, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xc0, 0x3, 0xc5, 0x0, 0x0, 0xde, 0x10, 0x4, + 0xf7, 0x0, 0xb, 0xf4, 0x0, 0x4, 0xf7, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x39, 0x99, + 0x99, 0x9b, 0xfc, 0x98, 0x0, 0x0, 0x0, 0x5, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xf7, 0x0, + + /* U+0035 "5" */ + 0x2, 0xff, 0xff, 0xff, 0xf0, 0x4, 0xfc, 0xaa, + 0xaa, 0xa0, 0x5, 0xf5, 0x0, 0x0, 0x0, 0x7, + 0xf3, 0x0, 0x0, 0x0, 0x9, 0xf1, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xc7, 0x0, 0x7, 0xaa, + 0xab, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xb, 0xf6, + 0x0, 0x0, 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, + 0x3, 0xfa, 0x3c, 0x20, 0x0, 0xb, 0xf6, 0x6f, + 0xfd, 0xbb, 0xef, 0xb0, 0x3, 0x9d, 0xff, 0xc7, + 0x0, + + /* U+0036 "6" */ + 0x0, 0x1, 0x8d, 0xfe, 0xc6, 0x0, 0x4, 0xef, + 0xca, 0xad, 0x90, 0x1, 0xee, 0x40, 0x0, 0x0, + 0x0, 0x8f, 0x40, 0x0, 0x0, 0x0, 0xe, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xfb, 0x2a, 0xef, 0xd7, + 0x0, 0x1f, 0xdf, 0xd9, 0x9d, 0xfb, 0x1, 0xff, + 0xa0, 0x0, 0xa, 0xf5, 0xf, 0xf2, 0x0, 0x0, + 0x3f, 0x90, 0xbf, 0x20, 0x0, 0x3, 0xf8, 0x4, + 0xfa, 0x0, 0x0, 0xaf, 0x40, 0x9, 0xfd, 0x99, + 0xdf, 0xa0, 0x0, 0x5, 0xcf, 0xfc, 0x60, 0x0, + + /* U+0037 "7" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0x7, 0xfb, 0xaa, + 0xaa, 0xaf, 0xe0, 0x7f, 0x40, 0x0, 0x5, 0xf8, + 0x6, 0xf4, 0x0, 0x0, 0xcf, 0x10, 0x0, 0x0, + 0x0, 0x3f, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xf3, + 0x0, 0x0, 0x0, 0x1, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0x50, 0x0, 0x0, 0x0, 0xe, 0xe0, + 0x0, 0x0, 0x0, 0x6, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0x10, 0x0, 0x0, 0x0, 0x4f, 0x90, + 0x0, 0x0, 0x0, 0xb, 0xf2, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x2a, 0xef, 0xfc, 0x70, 0x0, 0x3f, 0xfb, + 0x89, 0xdf, 0xb0, 0xa, 0xf5, 0x0, 0x0, 0xbf, + 0x30, 0xbf, 0x10, 0x0, 0x8, 0xf4, 0x4, 0xfc, + 0x42, 0x26, 0xfd, 0x0, 0x6, 0xff, 0xff, 0xfe, + 0x10, 0x5, 0xfe, 0x85, 0x6a, 0xfd, 0x10, 0xee, + 0x10, 0x0, 0x7, 0xf8, 0x2f, 0xa0, 0x0, 0x0, + 0x1f, 0xb2, 0xfb, 0x0, 0x0, 0x2, 0xfb, 0xd, + 0xf4, 0x0, 0x0, 0xaf, 0x70, 0x3f, 0xfb, 0x89, + 0xdf, 0xc0, 0x0, 0x29, 0xdf, 0xfc, 0x60, 0x0, + + /* U+0039 "9" */ + 0x0, 0x6c, 0xff, 0xc6, 0x0, 0x0, 0xaf, 0xd9, + 0x8c, 0xfa, 0x0, 0x3f, 0xb0, 0x0, 0x7, 0xf6, + 0x7, 0xf5, 0x0, 0x0, 0xf, 0xd0, 0x6f, 0x60, + 0x0, 0x2, 0xff, 0x11, 0xff, 0x51, 0x4, 0xdf, + 0xf2, 0x4, 0xef, 0xff, 0xfb, 0x9f, 0x30, 0x0, + 0x57, 0x73, 0xa, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xa0, 0x0, + 0x0, 0x0, 0x3e, 0xf2, 0x0, 0x8e, 0xba, 0xcf, + 0xf5, 0x0, 0x5, 0xbe, 0xfd, 0x92, 0x0, 0x0, + + /* U+003A ":" */ + 0xc, 0xd0, 0x1f, 0xf2, 0x5, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x60, + 0x1f, 0xf2, 0xc, 0xd0, + + /* U+003B ";" */ + 0xc, 0xd0, 0x1f, 0xf2, 0x5, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0xe, 0xf1, 0xf, 0xf2, 0x7, 0xe0, 0xb, 0x90, + 0xe, 0x40, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x5, 0x20, 0x0, 0x1, 0x8e, + 0xf4, 0x0, 0x4b, 0xff, 0x93, 0x6, 0xdf, 0xc6, + 0x0, 0x0, 0xcf, 0x80, 0x0, 0x0, 0x5, 0xcf, + 0xe7, 0x10, 0x0, 0x0, 0x39, 0xff, 0xb4, 0x0, + 0x0, 0x1, 0x6d, 0xf4, 0x0, 0x0, 0x0, 0x4, + 0x20, + + /* U+003D "=" */ + 0xcf, 0xff, 0xff, 0xff, 0x46, 0x77, 0x77, 0x77, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0xc, 0xff, + 0xff, 0xff, 0xf4, 0x45, 0x55, 0x55, 0x55, 0x10, + + /* U+003E ">" */ + 0x62, 0x0, 0x0, 0x0, 0xc, 0xfb, 0x40, 0x0, + 0x0, 0x6, 0xcf, 0xe7, 0x10, 0x0, 0x0, 0x39, + 0xff, 0xa1, 0x0, 0x0, 0x2, 0xdf, 0x40, 0x0, + 0x4b, 0xff, 0x91, 0x18, 0xef, 0xc6, 0x0, 0xc, + 0xfa, 0x30, 0x0, 0x0, 0x51, 0x0, 0x0, 0x0, + 0x0, + + /* U+003F "?" */ + 0x2, 0x9d, 0xfe, 0xc5, 0x0, 0x4f, 0xfb, 0x9b, + 0xff, 0x80, 0x4c, 0x20, 0x0, 0x2f, 0xf0, 0x0, + 0x0, 0x0, 0xc, 0xf0, 0x0, 0x0, 0x0, 0x1f, + 0xc0, 0x0, 0x0, 0x1, 0xcf, 0x30, 0x0, 0x0, + 0x1d, 0xf4, 0x0, 0x0, 0x0, 0x9f, 0x50, 0x0, + 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, + 0x1, 0xff, 0x10, 0x0, 0x0, 0x0, 0xcd, 0x0, + 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x2, 0x9d, 0xff, 0xec, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xc7, 0x54, 0x58, 0xdf, + 0x60, 0x0, 0x0, 0xc, 0xe4, 0x0, 0x0, 0x0, + 0x6, 0xf9, 0x0, 0x0, 0xae, 0x10, 0x3b, 0xef, + 0xb2, 0xbd, 0x3f, 0x60, 0x4, 0xf4, 0x4, 0xfe, + 0x97, 0xcf, 0xed, 0x6, 0xe0, 0xa, 0xc0, 0xe, + 0xe1, 0x0, 0x8, 0xfd, 0x0, 0xe5, 0xe, 0x60, + 0x4f, 0x60, 0x0, 0x0, 0xfd, 0x0, 0xa9, 0x1f, + 0x40, 0x6f, 0x30, 0x0, 0x0, 0xcd, 0x0, 0x8b, + 0x2f, 0x30, 0x6f, 0x30, 0x0, 0x0, 0xcd, 0x0, + 0x8b, 0x1f, 0x40, 0x3f, 0x60, 0x0, 0x0, 0xfd, + 0x0, 0x99, 0xe, 0x60, 0xe, 0xe1, 0x0, 0x8, + 0xfe, 0x0, 0xe5, 0xa, 0xc0, 0x4, 0xfe, 0x87, + 0xbf, 0xaf, 0x9b, 0xe0, 0x4, 0xf4, 0x0, 0x3b, + 0xff, 0xb3, 0x1b, 0xfc, 0x30, 0x0, 0x9e, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xc7, 0x54, 0x6a, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x9d, 0xff, 0xdb, 0x50, 0x0, + 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xf6, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdd, 0xb, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0x60, 0x4f, 0x70, 0x0, 0x0, 0x0, 0xb, + 0xe0, 0x0, 0xdd, 0x0, 0x0, 0x0, 0x2, 0xf8, + 0x0, 0x6, 0xf5, 0x0, 0x0, 0x0, 0x9f, 0x10, + 0x0, 0xe, 0xc0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x7, 0xf8, 0x88, 0x88, + 0x88, 0xfa, 0x0, 0x0, 0xed, 0x0, 0x0, 0x0, + 0xb, 0xf1, 0x0, 0x5f, 0x60, 0x0, 0x0, 0x0, + 0x4f, 0x80, 0xc, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xee, 0x0, + + /* U+0042 "B" */ + 0x1f, 0xff, 0xff, 0xfe, 0xb4, 0x0, 0x1f, 0xd8, + 0x88, 0x8a, 0xff, 0x70, 0x1f, 0xb0, 0x0, 0x0, + 0x2f, 0xf0, 0x1f, 0xb0, 0x0, 0x0, 0xc, 0xf0, + 0x1f, 0xb0, 0x0, 0x0, 0x2f, 0xc0, 0x1f, 0xd8, + 0x88, 0x8a, 0xfe, 0x30, 0x1f, 0xff, 0xff, 0xff, + 0xfd, 0x40, 0x1f, 0xb0, 0x0, 0x1, 0x4d, 0xf3, + 0x1f, 0xb0, 0x0, 0x0, 0x4, 0xf9, 0x1f, 0xb0, + 0x0, 0x0, 0x2, 0xfb, 0x1f, 0xb0, 0x0, 0x0, + 0x8, 0xf8, 0x1f, 0xd8, 0x88, 0x89, 0xcf, 0xe1, + 0x1f, 0xff, 0xff, 0xff, 0xd9, 0x10, + + /* U+0043 "C" */ + 0x0, 0x0, 0x4a, 0xef, 0xeb, 0x50, 0x0, 0x1, + 0xbf, 0xfc, 0xac, 0xff, 0xb0, 0x0, 0xbf, 0xb2, + 0x0, 0x1, 0x9c, 0x0, 0x6f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xb2, 0x0, 0x1, 0xac, 0x10, + 0x1, 0xbf, 0xfc, 0xbc, 0xff, 0xb0, 0x0, 0x0, + 0x4b, 0xef, 0xeb, 0x50, 0x0, + + /* U+0044 "D" */ + 0x1f, 0xff, 0xff, 0xfd, 0xa4, 0x0, 0x1, 0xfe, + 0xaa, 0xaa, 0xcf, 0xfa, 0x0, 0x1f, 0xb0, 0x0, + 0x0, 0x2b, 0xfa, 0x1, 0xfb, 0x0, 0x0, 0x0, + 0xc, 0xf4, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x3f, + 0xb1, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xee, 0x1f, + 0xb0, 0x0, 0x0, 0x0, 0xd, 0xf1, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xee, 0x1f, 0xb0, 0x0, 0x0, + 0x0, 0x3f, 0xb1, 0xfb, 0x0, 0x0, 0x0, 0xc, + 0xf4, 0x1f, 0xb0, 0x0, 0x0, 0x2b, 0xfa, 0x1, + 0xfe, 0xaa, 0xaa, 0xcf, 0xfa, 0x0, 0x1f, 0xff, + 0xff, 0xfd, 0xa4, 0x0, 0x0, + + /* U+0045 "E" */ + 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x1, 0xfe, 0xaa, + 0xaa, 0xaa, 0x70, 0x1f, 0xb0, 0x0, 0x0, 0x0, + 0x1, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xb0, + 0x0, 0x0, 0x0, 0x1, 0xfd, 0x99, 0x99, 0x99, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x0, 0x1, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xb0, 0x0, 0x0, 0x0, 0x1, 0xfe, 0xaa, 0xaa, + 0xaa, 0xa0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x0, + + /* U+0046 "F" */ + 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xea, 0xaa, + 0xaa, 0xa7, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, + 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xf0, 0x1f, 0xe9, 0x99, 0x99, 0x90, + 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, + 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, + 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x4a, 0xdf, 0xeb, 0x60, 0x0, 0x1, + 0xbf, 0xfc, 0xbb, 0xff, 0xc1, 0x0, 0xbf, 0xb2, + 0x0, 0x0, 0x7d, 0x10, 0x6f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xa0, 0x0, 0x0, 0x0, 0x39, 0x30, 0xfc, 0x0, + 0x0, 0x0, 0x6, 0xf5, 0xc, 0xf1, 0x0, 0x0, + 0x0, 0x6f, 0x50, 0x6f, 0xb0, 0x0, 0x0, 0x6, + 0xf5, 0x0, 0xbf, 0xb2, 0x0, 0x0, 0x9f, 0x50, + 0x0, 0xaf, 0xfd, 0xbc, 0xff, 0xd2, 0x0, 0x0, + 0x4a, 0xef, 0xeb, 0x60, 0x0, + + /* U+0048 "H" */ + 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xb0, + 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xb0, 0x0, 0x0, + 0x1, 0xfb, 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, + 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xea, + 0xaa, 0xaa, 0xaa, 0xfb, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, + 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xb0, + 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xb0, 0x0, 0x0, + 0x1, 0xfb, 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, + 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, + + /* U+0049 "I" */ + 0x1f, 0xb1, 0xfb, 0x1f, 0xb1, 0xfb, 0x1f, 0xb1, + 0xfb, 0x1f, 0xb1, 0xfb, 0x1f, 0xb1, 0xfb, 0x1f, + 0xb1, 0xfb, 0x1f, 0xb0, + + /* U+004A "J" */ + 0x0, 0xef, 0xff, 0xff, 0x70, 0x8, 0xaa, 0xab, + 0xf7, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, + 0x5, 0xf7, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, + 0x0, 0x5, 0xf7, 0x0, 0x0, 0x0, 0x5f, 0x70, + 0x0, 0x0, 0x5, 0xf7, 0x0, 0x0, 0x0, 0x5f, + 0x70, 0x0, 0x0, 0x6, 0xf6, 0xa, 0x70, 0x0, + 0xcf, 0x30, 0xcf, 0xda, 0xdf, 0xc0, 0x0, 0x8d, + 0xfe, 0x90, 0x0, + + /* U+004B "K" */ + 0x1f, 0xb0, 0x0, 0x0, 0x1d, 0xe2, 0x1f, 0xb0, + 0x0, 0x1, 0xdf, 0x30, 0x1f, 0xb0, 0x0, 0xc, + 0xf4, 0x0, 0x1f, 0xb0, 0x0, 0xbf, 0x50, 0x0, + 0x1f, 0xb0, 0xb, 0xf7, 0x0, 0x0, 0x1f, 0xb0, + 0xaf, 0x80, 0x0, 0x0, 0x1f, 0xb9, 0xff, 0xb0, + 0x0, 0x0, 0x1f, 0xff, 0xbb, 0xf8, 0x0, 0x0, + 0x1f, 0xfb, 0x1, 0xdf, 0x50, 0x0, 0x1f, 0xd0, + 0x0, 0x2f, 0xf2, 0x0, 0x1f, 0xb0, 0x0, 0x4, + 0xfd, 0x10, 0x1f, 0xb0, 0x0, 0x0, 0x7f, 0xb0, + 0x1f, 0xb0, 0x0, 0x0, 0x9, 0xf8, + + /* U+004C "L" */ + 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, + 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, + 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, + 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, + 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, + 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, + 0xea, 0xaa, 0xaa, 0xa5, 0x1f, 0xff, 0xff, 0xff, + 0xf8, + + /* U+004D "M" */ + 0x1f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x41, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, 0xf4, 0x1f, + 0xfc, 0x0, 0x0, 0x0, 0x9, 0xff, 0x41, 0xff, + 0xf5, 0x0, 0x0, 0x2, 0xfe, 0xf4, 0x1f, 0xad, + 0xe0, 0x0, 0x0, 0xbe, 0x8f, 0x41, 0xfa, 0x4f, + 0x80, 0x0, 0x4f, 0x67, 0xf4, 0x1f, 0xa0, 0xaf, + 0x20, 0xd, 0xd0, 0x7f, 0x41, 0xfa, 0x2, 0xfa, + 0x7, 0xf4, 0x7, 0xf4, 0x1f, 0xa0, 0x8, 0xf5, + 0xea, 0x0, 0x7f, 0x41, 0xfa, 0x0, 0xe, 0xff, + 0x20, 0x6, 0xf4, 0x1f, 0xa0, 0x0, 0x5f, 0x80, + 0x0, 0x6f, 0x41, 0xfa, 0x0, 0x0, 0x60, 0x0, + 0x6, 0xf4, 0x1f, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0x40, + + /* U+004E "N" */ + 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xf8, + 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xff, 0x50, 0x0, + 0x1, 0xfb, 0x1f, 0xdf, 0xf2, 0x0, 0x1, 0xfb, + 0x1f, 0xb6, 0xfd, 0x0, 0x1, 0xfb, 0x1f, 0xb0, + 0x9f, 0xa0, 0x1, 0xfb, 0x1f, 0xb0, 0xc, 0xf6, + 0x1, 0xfb, 0x1f, 0xb0, 0x1, 0xef, 0x31, 0xfb, + 0x1f, 0xb0, 0x0, 0x4f, 0xe2, 0xfb, 0x1f, 0xb0, + 0x0, 0x7, 0xfd, 0xfb, 0x1f, 0xb0, 0x0, 0x0, + 0xbf, 0xfb, 0x1f, 0xb0, 0x0, 0x0, 0x1d, 0xfb, + 0x1f, 0xb0, 0x0, 0x0, 0x2, 0xfb, + + /* U+004F "O" */ + 0x0, 0x0, 0x4a, 0xdf, 0xeb, 0x50, 0x0, 0x0, + 0x0, 0xaf, 0xfc, 0xbc, 0xff, 0xc1, 0x0, 0x0, + 0xbf, 0xb2, 0x0, 0x1, 0xaf, 0xd0, 0x0, 0x6f, + 0xb0, 0x0, 0x0, 0x0, 0x9f, 0x80, 0xc, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xfe, 0x0, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xf2, 0x1f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x30, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xf2, 0xc, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xfe, 0x0, 0x6f, 0xb0, 0x0, 0x0, + 0x0, 0x9f, 0x80, 0x0, 0xbf, 0xb2, 0x0, 0x1, + 0xaf, 0xd0, 0x0, 0x0, 0xaf, 0xfc, 0xbc, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x4a, 0xef, 0xeb, 0x50, + 0x0, 0x0, + + /* U+0050 "P" */ + 0x1f, 0xff, 0xff, 0xfc, 0x70, 0x0, 0x1f, 0xea, + 0xaa, 0xbe, 0xfd, 0x10, 0x1f, 0xb0, 0x0, 0x0, + 0x9f, 0x90, 0x1f, 0xb0, 0x0, 0x0, 0xe, 0xf0, + 0x1f, 0xb0, 0x0, 0x0, 0xc, 0xf0, 0x1f, 0xb0, + 0x0, 0x0, 0xe, 0xf0, 0x1f, 0xb0, 0x0, 0x0, + 0x9f, 0x90, 0x1f, 0xea, 0xaa, 0xbe, 0xfd, 0x10, + 0x1f, 0xff, 0xff, 0xfc, 0x70, 0x0, 0x1f, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x4a, 0xdf, 0xeb, 0x50, 0x0, 0x0, + 0x0, 0xaf, 0xfc, 0xbc, 0xff, 0xc1, 0x0, 0x0, + 0xbf, 0xb2, 0x0, 0x1, 0xaf, 0xd0, 0x0, 0x6f, + 0xb0, 0x0, 0x0, 0x0, 0x9f, 0x80, 0xc, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xfe, 0x0, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xf1, 0x1f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x30, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xf2, 0xd, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xfe, 0x0, 0x7f, 0xa0, 0x0, 0x0, + 0x0, 0x8f, 0x80, 0x0, 0xcf, 0xa1, 0x0, 0x0, + 0x9f, 0xd0, 0x0, 0x1, 0xcf, 0xfb, 0xab, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x6c, 0xef, 0xfd, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xe6, 0x34, + 0xa7, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0xfe, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x2, 0x43, 0x0, + + /* U+0052 "R" */ + 0x1f, 0xff, 0xff, 0xfc, 0x70, 0x0, 0x1f, 0xea, + 0xaa, 0xbe, 0xfd, 0x10, 0x1f, 0xb0, 0x0, 0x0, + 0x9f, 0x90, 0x1f, 0xb0, 0x0, 0x0, 0xe, 0xf0, + 0x1f, 0xb0, 0x0, 0x0, 0xc, 0xf0, 0x1f, 0xb0, + 0x0, 0x0, 0xe, 0xe0, 0x1f, 0xb0, 0x0, 0x0, + 0x9f, 0x90, 0x1f, 0xd9, 0x99, 0xae, 0xfd, 0x10, + 0x1f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1f, 0xb0, + 0x0, 0x1f, 0xd0, 0x0, 0x1f, 0xb0, 0x0, 0x6, + 0xf9, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0xbf, 0x40, + 0x1f, 0xb0, 0x0, 0x0, 0x1e, 0xe0, + + /* U+0053 "S" */ + 0x0, 0x29, 0xdf, 0xfd, 0x81, 0x0, 0x3f, 0xfc, + 0x9a, 0xdf, 0xc0, 0xb, 0xf4, 0x0, 0x0, 0x23, + 0x0, 0xed, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfa, 0x61, 0x0, + 0x0, 0x0, 0x3b, 0xff, 0xfd, 0x70, 0x0, 0x0, + 0x0, 0x48, 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x40, 0x0, 0x0, 0x0, 0x6, 0xf6, 0xb, + 0x50, 0x0, 0x0, 0xcf, 0x31, 0xdf, 0xeb, 0x9a, + 0xef, 0x90, 0x0, 0x6b, 0xef, 0xeb, 0x50, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0x89, 0xaa, 0xad, + 0xfb, 0xaa, 0xa5, 0x0, 0x0, 0x9f, 0x20, 0x0, + 0x0, 0x0, 0x9, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0x20, 0x0, 0x0, 0x0, 0x9, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x20, 0x0, 0x0, 0x0, + 0x9, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x20, + 0x0, 0x0, 0x0, 0x9, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x20, 0x0, 0x0, 0x0, 0x9, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0x20, 0x0, 0x0, + + /* U+0055 "U" */ + 0x3f, 0x90, 0x0, 0x0, 0x5, 0xf7, 0x3f, 0x90, + 0x0, 0x0, 0x5, 0xf7, 0x3f, 0x90, 0x0, 0x0, + 0x5, 0xf7, 0x3f, 0x90, 0x0, 0x0, 0x5, 0xf7, + 0x3f, 0x90, 0x0, 0x0, 0x5, 0xf7, 0x3f, 0x90, + 0x0, 0x0, 0x5, 0xf7, 0x3f, 0x90, 0x0, 0x0, + 0x5, 0xf7, 0x3f, 0x90, 0x0, 0x0, 0x5, 0xf6, + 0x2f, 0xb0, 0x0, 0x0, 0x7, 0xf5, 0xe, 0xf0, + 0x0, 0x0, 0xb, 0xf2, 0x8, 0xfa, 0x0, 0x0, + 0x7f, 0xb0, 0x0, 0xcf, 0xfb, 0xbe, 0xfe, 0x20, + 0x0, 0x7, 0xcf, 0xfd, 0x81, 0x0, + + /* U+0056 "V" */ + 0xc, 0xf2, 0x0, 0x0, 0x0, 0x2, 0xf9, 0x6, + 0xf8, 0x0, 0x0, 0x0, 0x9, 0xf3, 0x0, 0xef, + 0x0, 0x0, 0x0, 0x1f, 0xc0, 0x0, 0x8f, 0x60, + 0x0, 0x0, 0x7f, 0x50, 0x0, 0x1f, 0xd0, 0x0, + 0x0, 0xee, 0x0, 0x0, 0xa, 0xf4, 0x0, 0x5, + 0xf7, 0x0, 0x0, 0x3, 0xfb, 0x0, 0xc, 0xf1, + 0x0, 0x0, 0x0, 0xdf, 0x20, 0x2f, 0xa0, 0x0, + 0x0, 0x0, 0x6f, 0x80, 0x9f, 0x30, 0x0, 0x0, + 0x0, 0xe, 0xe1, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xfc, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x80, 0x0, 0x0, + + /* U+0057 "W" */ + 0x4f, 0x90, 0x0, 0x0, 0xc, 0xf3, 0x0, 0x0, + 0x2, 0xf8, 0xe, 0xe0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x8, 0xf3, 0x9, 0xf3, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0xd, 0xd0, 0x4, 0xf8, + 0x0, 0x0, 0xcd, 0x8f, 0x20, 0x0, 0x2f, 0x80, + 0x0, 0xfe, 0x0, 0x2, 0xf8, 0x3f, 0x80, 0x0, + 0x7f, 0x30, 0x0, 0xaf, 0x30, 0x7, 0xf3, 0xe, + 0xd0, 0x0, 0xde, 0x0, 0x0, 0x5f, 0x80, 0xc, + 0xd0, 0x8, 0xf2, 0x2, 0xf9, 0x0, 0x0, 0xf, + 0xd0, 0x2f, 0x80, 0x3, 0xf7, 0x7, 0xf4, 0x0, + 0x0, 0xa, 0xf2, 0x7f, 0x30, 0x0, 0xed, 0xc, + 0xe0, 0x0, 0x0, 0x5, 0xf7, 0xdd, 0x0, 0x0, + 0x9f, 0x4f, 0x90, 0x0, 0x0, 0x0, 0xfe, 0xf8, + 0x0, 0x0, 0x3f, 0xdf, 0x40, 0x0, 0x0, 0x0, + 0xbf, 0xf3, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xe0, 0x0, 0x0, 0x9, 0xfa, + 0x0, 0x0, + + /* U+0058 "X" */ + 0x2f, 0xd0, 0x0, 0x0, 0xb, 0xf3, 0x6, 0xfa, + 0x0, 0x0, 0x7f, 0x70, 0x0, 0xbf, 0x50, 0x2, + 0xfc, 0x0, 0x0, 0x1e, 0xe1, 0xd, 0xf2, 0x0, + 0x0, 0x5, 0xfb, 0x8f, 0x50, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x10, 0x0, + 0x0, 0x9, 0xf6, 0x5f, 0xa0, 0x0, 0x0, 0x4f, + 0xb0, 0xa, 0xf6, 0x0, 0x1, 0xee, 0x10, 0x1, + 0xef, 0x20, 0xb, 0xf5, 0x0, 0x0, 0x4f, 0xc0, + 0x6f, 0xa0, 0x0, 0x0, 0x8, 0xf8, + + /* U+0059 "Y" */ + 0xc, 0xf2, 0x0, 0x0, 0x0, 0x5f, 0x60, 0x3f, + 0xb0, 0x0, 0x0, 0xe, 0xd0, 0x0, 0x9f, 0x50, + 0x0, 0x8, 0xf3, 0x0, 0x1, 0xee, 0x0, 0x2, + 0xfa, 0x0, 0x0, 0x6, 0xf8, 0x0, 0xbf, 0x10, + 0x0, 0x0, 0xc, 0xf1, 0x4f, 0x70, 0x0, 0x0, + 0x0, 0x3f, 0xbd, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x2, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xfb, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xa, 0xaa, + 0xaa, 0xaa, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0x20, 0x0, 0x0, 0x0, 0xc, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x80, 0x0, 0x0, 0x0, + 0x5, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0x30, 0x0, 0x0, + 0x0, 0xa, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xa0, 0x0, 0x0, 0x0, 0x4, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xfb, 0xaa, 0xaa, 0xaa, 0xa2, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf4, + + /* U+005B "[" */ + 0x1f, 0xff, 0xa1, 0xfc, 0x74, 0x1f, 0xa0, 0x1, + 0xfa, 0x0, 0x1f, 0xa0, 0x1, 0xfa, 0x0, 0x1f, + 0xa0, 0x1, 0xfa, 0x0, 0x1f, 0xa0, 0x1, 0xfa, + 0x0, 0x1f, 0xa0, 0x1, 0xfa, 0x0, 0x1f, 0xa0, + 0x1, 0xfa, 0x0, 0x1f, 0xa0, 0x1, 0xfa, 0x0, + 0x1f, 0xc7, 0x41, 0xff, 0xfa, + + /* U+005C "\\" */ + 0x47, 0x0, 0x0, 0x0, 0x5f, 0x30, 0x0, 0x0, + 0xf, 0x80, 0x0, 0x0, 0xa, 0xe0, 0x0, 0x0, + 0x5, 0xf3, 0x0, 0x0, 0x0, 0xf9, 0x0, 0x0, + 0x0, 0xae, 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, + 0x0, 0xf, 0x90, 0x0, 0x0, 0xa, 0xe0, 0x0, + 0x0, 0x4, 0xf4, 0x0, 0x0, 0x0, 0xe9, 0x0, + 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0x4f, 0x40, + 0x0, 0x0, 0xe, 0xa0, 0x0, 0x0, 0x9, 0xf0, + 0x0, 0x0, 0x4, 0xf5, 0x0, 0x0, 0x0, 0xea, + + /* U+005D "]" */ + 0xaf, 0xff, 0x14, 0x7c, 0xf1, 0x0, 0xaf, 0x10, + 0xa, 0xf1, 0x0, 0xaf, 0x10, 0xa, 0xf1, 0x0, + 0xaf, 0x10, 0xa, 0xf1, 0x0, 0xaf, 0x10, 0xa, + 0xf1, 0x0, 0xaf, 0x10, 0xa, 0xf1, 0x0, 0xaf, + 0x10, 0xa, 0xf1, 0x0, 0xaf, 0x10, 0xa, 0xf1, + 0x47, 0xcf, 0x1a, 0xff, 0xf1, + + /* U+005E "^" */ + 0x0, 0xa, 0xf2, 0x0, 0x0, 0x1, 0xfe, 0x90, + 0x0, 0x0, 0x7d, 0x5e, 0x0, 0x0, 0xd, 0x70, + 0xf5, 0x0, 0x4, 0xf1, 0x9, 0xc0, 0x0, 0xab, + 0x0, 0x3f, 0x20, 0x1f, 0x50, 0x0, 0xd8, 0x7, + 0xe0, 0x0, 0x6, 0xe0, + + /* U+005F "_" */ + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x22, 0x22, 0x22, + 0x22, + + /* U+0060 "`" */ + 0x48, 0x40, 0x0, 0xaf, 0x40, 0x0, 0x7f, 0x40, + + /* U+0061 "a" */ + 0x1, 0x7c, 0xff, 0xd6, 0x0, 0x9, 0xfc, 0x99, + 0xef, 0x80, 0x1, 0x30, 0x0, 0xd, 0xf0, 0x0, + 0x0, 0x0, 0x9, 0xf2, 0x1, 0x9e, 0xff, 0xff, + 0xf3, 0xa, 0xf8, 0x43, 0x3a, 0xf3, 0xf, 0xb0, + 0x0, 0x8, 0xf3, 0xf, 0xb0, 0x0, 0xe, 0xf3, + 0x9, 0xf9, 0x46, 0xdf, 0xf3, 0x0, 0x8d, 0xfe, + 0x87, 0xf3, + + /* U+0062 "b" */ + 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, + 0x5, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x56, + 0xdf, 0xea, 0x20, 0x5, 0xfd, 0xfc, 0x9b, 0xff, + 0x30, 0x5f, 0xf5, 0x0, 0x4, 0xfe, 0x5, 0xfa, + 0x0, 0x0, 0x8, 0xf4, 0x5f, 0x60, 0x0, 0x0, + 0x4f, 0x75, 0xf6, 0x0, 0x0, 0x4, 0xf7, 0x5f, + 0xa0, 0x0, 0x0, 0x8f, 0x45, 0xff, 0x50, 0x0, + 0x4f, 0xe0, 0x5f, 0xcf, 0xc9, 0xbf, 0xf3, 0x5, + 0xf4, 0x6d, 0xfe, 0xa2, 0x0, + + /* U+0063 "c" */ + 0x0, 0x7, 0xdf, 0xeb, 0x30, 0x0, 0xcf, 0xd9, + 0xaf, 0xf4, 0x9, 0xf7, 0x0, 0x2, 0xc3, 0xf, + 0xd0, 0x0, 0x0, 0x0, 0x3f, 0x80, 0x0, 0x0, + 0x0, 0x3f, 0x80, 0x0, 0x0, 0x0, 0xf, 0xc0, + 0x0, 0x0, 0x0, 0x9, 0xf7, 0x0, 0x2, 0xc3, + 0x0, 0xcf, 0xd9, 0xaf, 0xf3, 0x0, 0x7, 0xdf, + 0xeb, 0x30, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xa0, 0x0, 0x0, + 0x0, 0x1, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xa0, 0x0, 0x0, 0x0, 0x1, 0xfa, 0x0, 0x8, + 0xdf, 0xe8, 0x2f, 0xa0, 0x1d, 0xfd, 0x9b, 0xfd, + 0xfa, 0xa, 0xf8, 0x0, 0x2, 0xef, 0xa0, 0xfd, + 0x0, 0x0, 0x6, 0xfa, 0x3f, 0x80, 0x0, 0x0, + 0x2f, 0xa3, 0xf8, 0x0, 0x0, 0x2, 0xfa, 0xf, + 0xc0, 0x0, 0x0, 0x5f, 0xa0, 0xaf, 0x60, 0x0, + 0x1e, 0xfa, 0x1, 0xdf, 0xb7, 0x9e, 0xdf, 0xa0, + 0x0, 0x8d, 0xfe, 0x91, 0xfa, + + /* U+0065 "e" */ + 0x0, 0x8, 0xdf, 0xe9, 0x10, 0x0, 0x1d, 0xfb, + 0x8a, 0xfe, 0x20, 0xa, 0xf3, 0x0, 0x3, 0xfb, + 0x0, 0xfa, 0x0, 0x0, 0x9, 0xf1, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0x33, 0xfa, 0x33, 0x33, 0x33, + 0x30, 0xf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0x90, 0x0, 0x9, 0x10, 0x0, 0xdf, 0xda, 0xae, + 0xf6, 0x0, 0x0, 0x7d, 0xff, 0xc5, 0x0, + + /* U+0066 "f" */ + 0x0, 0x1a, 0xee, 0x90, 0xa, 0xf9, 0x88, 0x0, + 0xfb, 0x0, 0x0, 0x1f, 0x90, 0x0, 0xbf, 0xff, + 0xff, 0x55, 0x8f, 0xc7, 0x72, 0x1, 0xfa, 0x0, + 0x0, 0x1f, 0xa0, 0x0, 0x1, 0xfa, 0x0, 0x0, + 0x1f, 0xa0, 0x0, 0x1, 0xfa, 0x0, 0x0, 0x1f, + 0xa0, 0x0, 0x1, 0xfa, 0x0, 0x0, 0x1f, 0xa0, + 0x0, + + /* U+0067 "g" */ + 0x0, 0x8, 0xdf, 0xe9, 0x1e, 0xc0, 0x1d, 0xfd, + 0x9b, 0xfe, 0xec, 0xa, 0xf8, 0x0, 0x1, 0xdf, + 0xc0, 0xfd, 0x0, 0x0, 0x4, 0xfc, 0x3f, 0x90, + 0x0, 0x0, 0xf, 0xc3, 0xf8, 0x0, 0x0, 0x0, + 0xfc, 0xf, 0xd0, 0x0, 0x0, 0x4f, 0xc0, 0xaf, + 0x80, 0x0, 0x1d, 0xfc, 0x1, 0xdf, 0xd9, 0xaf, + 0xdf, 0xc0, 0x0, 0x8d, 0xfe, 0x91, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0x90, 0x27, 0x0, 0x0, + 0xb, 0xf4, 0x7, 0xff, 0xb9, 0xae, 0xfa, 0x0, + 0x4, 0xae, 0xff, 0xc6, 0x0, + + /* U+0068 "h" */ + 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5f, 0x50, 0x0, + 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5f, + 0x50, 0x0, 0x0, 0x0, 0x5f, 0x56, 0xdf, 0xea, + 0x10, 0x5f, 0xef, 0xca, 0xdf, 0xd0, 0x5f, 0xf4, + 0x0, 0xa, 0xf6, 0x5f, 0x90, 0x0, 0x2, 0xf9, + 0x5f, 0x60, 0x0, 0x0, 0xfa, 0x5f, 0x50, 0x0, + 0x0, 0xfb, 0x5f, 0x50, 0x0, 0x0, 0xfb, 0x5f, + 0x50, 0x0, 0x0, 0xfb, 0x5f, 0x50, 0x0, 0x0, + 0xfb, 0x5f, 0x50, 0x0, 0x0, 0xfb, + + /* U+0069 "i" */ + 0x6f, 0x69, 0xf9, 0x4, 0x0, 0x0, 0x5f, 0x55, + 0xf5, 0x5f, 0x55, 0xf5, 0x5f, 0x55, 0xf5, 0x5f, + 0x55, 0xf5, 0x5f, 0x55, 0xf5, + + /* U+006A "j" */ + 0x0, 0x4, 0xf7, 0x0, 0x7, 0xfa, 0x0, 0x0, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf7, 0x0, + 0x4, 0xf7, 0x0, 0x4, 0xf7, 0x0, 0x4, 0xf7, + 0x0, 0x4, 0xf7, 0x0, 0x4, 0xf7, 0x0, 0x4, + 0xf7, 0x0, 0x4, 0xf7, 0x0, 0x4, 0xf7, 0x0, + 0x4, 0xf7, 0x0, 0x4, 0xf7, 0x0, 0x6, 0xf5, + 0x4b, 0x9f, 0xe1, 0x5e, 0xfc, 0x30, + + /* U+006B "k" */ + 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, + 0x5, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x50, + 0x0, 0x1d, 0xf3, 0x5, 0xf5, 0x0, 0x2d, 0xf3, + 0x0, 0x5f, 0x50, 0x2e, 0xf4, 0x0, 0x5, 0xf5, + 0x2e, 0xf4, 0x0, 0x0, 0x5f, 0x9e, 0xfe, 0x0, + 0x0, 0x5, 0xff, 0xfa, 0xfa, 0x0, 0x0, 0x5f, + 0xe3, 0xc, 0xf6, 0x0, 0x5, 0xf6, 0x0, 0x1e, + 0xf3, 0x0, 0x5f, 0x50, 0x0, 0x4f, 0xd0, 0x5, + 0xf5, 0x0, 0x0, 0x7f, 0xa0, + + /* U+006C "l" */ + 0x5f, 0x55, 0xf5, 0x5f, 0x55, 0xf5, 0x5f, 0x55, + 0xf5, 0x5f, 0x55, 0xf5, 0x5f, 0x55, 0xf5, 0x5f, + 0x55, 0xf5, 0x5f, 0x55, 0xf5, + + /* U+006D "m" */ + 0x5f, 0x58, 0xdf, 0xe8, 0x0, 0x8d, 0xfe, 0x80, + 0x5, 0xfe, 0xfa, 0x9d, 0xfb, 0xdf, 0xa9, 0xdf, + 0xb0, 0x5f, 0xf2, 0x0, 0xd, 0xff, 0x30, 0x0, + 0xcf, 0x35, 0xf9, 0x0, 0x0, 0x7f, 0xa0, 0x0, + 0x6, 0xf6, 0x5f, 0x60, 0x0, 0x5, 0xf7, 0x0, + 0x0, 0x4f, 0x75, 0xf5, 0x0, 0x0, 0x5f, 0x60, + 0x0, 0x4, 0xf7, 0x5f, 0x50, 0x0, 0x5, 0xf6, + 0x0, 0x0, 0x4f, 0x75, 0xf5, 0x0, 0x0, 0x5f, + 0x60, 0x0, 0x4, 0xf7, 0x5f, 0x50, 0x0, 0x5, + 0xf6, 0x0, 0x0, 0x4f, 0x75, 0xf5, 0x0, 0x0, + 0x5f, 0x60, 0x0, 0x4, 0xf7, + + /* U+006E "n" */ + 0x5f, 0x57, 0xdf, 0xea, 0x10, 0x5f, 0xef, 0xa8, + 0xcf, 0xd0, 0x5f, 0xf3, 0x0, 0x9, 0xf6, 0x5f, + 0x90, 0x0, 0x2, 0xf9, 0x5f, 0x60, 0x0, 0x0, + 0xfa, 0x5f, 0x50, 0x0, 0x0, 0xfb, 0x5f, 0x50, + 0x0, 0x0, 0xfb, 0x5f, 0x50, 0x0, 0x0, 0xfb, + 0x5f, 0x50, 0x0, 0x0, 0xfb, 0x5f, 0x50, 0x0, + 0x0, 0xfb, + + /* U+006F "o" */ + 0x0, 0x7, 0xdf, 0xea, 0x30, 0x0, 0xd, 0xfd, + 0x9a, 0xff, 0x50, 0x9, 0xf7, 0x0, 0x2, 0xef, + 0x10, 0xfd, 0x0, 0x0, 0x6, 0xf7, 0x3f, 0x80, + 0x0, 0x0, 0x2f, 0x93, 0xf8, 0x0, 0x0, 0x2, + 0xf9, 0xf, 0xd0, 0x0, 0x0, 0x6f, 0x60, 0x9f, + 0x80, 0x0, 0x2e, 0xf1, 0x0, 0xcf, 0xd9, 0xaf, + 0xf4, 0x0, 0x0, 0x7d, 0xfe, 0xa3, 0x0, + + /* U+0070 "p" */ + 0x5f, 0x46, 0xdf, 0xea, 0x20, 0x5, 0xfd, 0xfa, + 0x8a, 0xff, 0x30, 0x5f, 0xf4, 0x0, 0x3, 0xfe, + 0x5, 0xfa, 0x0, 0x0, 0x8, 0xf4, 0x5f, 0x60, + 0x0, 0x0, 0x4f, 0x75, 0xf6, 0x0, 0x0, 0x4, + 0xf7, 0x5f, 0xa0, 0x0, 0x0, 0x9f, 0x45, 0xff, + 0x50, 0x0, 0x4f, 0xe0, 0x5f, 0xdf, 0xc9, 0xbf, + 0xf3, 0x5, 0xf5, 0x6d, 0xfe, 0xa2, 0x0, 0x5f, + 0x50, 0x0, 0x0, 0x0, 0x5, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5, + 0xf5, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x8, 0xdf, 0xe8, 0x1f, 0xa0, 0x1d, 0xfd, + 0x9b, 0xfc, 0xfa, 0xa, 0xf7, 0x0, 0x2, 0xef, + 0xa0, 0xfd, 0x0, 0x0, 0x6, 0xfa, 0x3f, 0x80, + 0x0, 0x0, 0x2f, 0xa3, 0xf8, 0x0, 0x0, 0x2, + 0xfa, 0xf, 0xd0, 0x0, 0x0, 0x6f, 0xa0, 0xaf, + 0x80, 0x0, 0x2e, 0xfa, 0x1, 0xdf, 0xd9, 0xaf, + 0xdf, 0xa0, 0x0, 0x8d, 0xfe, 0x82, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xa0, 0x0, 0x0, 0x0, + 0x1, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xa0, + 0x0, 0x0, 0x0, 0x1, 0xfa, + + /* U+0072 "r" */ + 0x5f, 0x46, 0xdb, 0x5f, 0xcf, 0xd9, 0x5f, 0xf5, + 0x0, 0x5f, 0xa0, 0x0, 0x5f, 0x70, 0x0, 0x5f, + 0x50, 0x0, 0x5f, 0x50, 0x0, 0x5f, 0x50, 0x0, + 0x5f, 0x50, 0x0, 0x5f, 0x50, 0x0, + + /* U+0073 "s" */ + 0x1, 0x8d, 0xfe, 0xc7, 0x0, 0xcf, 0xb8, 0xad, + 0xd0, 0x3f, 0x90, 0x0, 0x1, 0x2, 0xfb, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xb8, 0x40, 0x0, 0x5, + 0x9c, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x9f, 0x60, + 0x50, 0x0, 0x5, 0xf7, 0x5f, 0xea, 0x9a, 0xfe, + 0x10, 0x6c, 0xef, 0xd9, 0x20, + + /* U+0074 "t" */ + 0x1, 0xfa, 0x0, 0x0, 0x1f, 0xa0, 0x0, 0xbf, + 0xff, 0xff, 0x55, 0x8f, 0xc7, 0x72, 0x1, 0xfa, + 0x0, 0x0, 0x1f, 0xa0, 0x0, 0x1, 0xfa, 0x0, + 0x0, 0x1f, 0xa0, 0x0, 0x1, 0xfa, 0x0, 0x0, + 0xf, 0xc0, 0x0, 0x0, 0xbf, 0xa9, 0x90, 0x1, + 0xbe, 0xe9, + + /* U+0075 "u" */ + 0x7f, 0x40, 0x0, 0x3, 0xf8, 0x7f, 0x40, 0x0, + 0x3, 0xf8, 0x7f, 0x40, 0x0, 0x3, 0xf8, 0x7f, + 0x40, 0x0, 0x3, 0xf8, 0x7f, 0x40, 0x0, 0x3, + 0xf8, 0x7f, 0x40, 0x0, 0x4, 0xf8, 0x6f, 0x60, + 0x0, 0x6, 0xf8, 0x2f, 0xc0, 0x0, 0x1e, 0xf8, + 0xa, 0xfd, 0x89, 0xee, 0xf8, 0x0, 0x8d, 0xfe, + 0x92, 0xf8, + + /* U+0076 "v" */ + 0xd, 0xe0, 0x0, 0x0, 0xd, 0xd0, 0x6, 0xf6, + 0x0, 0x0, 0x3f, 0x70, 0x0, 0xfc, 0x0, 0x0, + 0xaf, 0x10, 0x0, 0x9f, 0x30, 0x1, 0xf9, 0x0, + 0x0, 0x2f, 0x90, 0x7, 0xf3, 0x0, 0x0, 0xb, + 0xf0, 0xe, 0xc0, 0x0, 0x0, 0x5, 0xf6, 0x5f, + 0x50, 0x0, 0x0, 0x0, 0xed, 0xbe, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf1, 0x0, 0x0, + + /* U+0077 "w" */ + 0xbe, 0x0, 0x0, 0xc, 0xf1, 0x0, 0x0, 0xae, + 0x5, 0xf4, 0x0, 0x2, 0xff, 0x60, 0x0, 0xf, + 0x80, 0xf, 0x90, 0x0, 0x8f, 0xeb, 0x0, 0x5, + 0xf2, 0x0, 0xae, 0x0, 0xd, 0xb8, 0xf1, 0x0, + 0xbd, 0x0, 0x4, 0xf4, 0x3, 0xf5, 0x2f, 0x70, + 0x1f, 0x70, 0x0, 0xe, 0xa0, 0x9e, 0x0, 0xcc, + 0x6, 0xf1, 0x0, 0x0, 0x9f, 0x1e, 0x90, 0x6, + 0xf2, 0xcc, 0x0, 0x0, 0x3, 0xfa, 0xf3, 0x0, + 0x1f, 0xaf, 0x60, 0x0, 0x0, 0xd, 0xfd, 0x0, + 0x0, 0xbf, 0xf1, 0x0, 0x0, 0x0, 0x8f, 0x70, + 0x0, 0x5, 0xfb, 0x0, 0x0, + + /* U+0078 "x" */ + 0x3f, 0xb0, 0x0, 0xc, 0xf2, 0x7, 0xf7, 0x0, + 0x7f, 0x60, 0x0, 0xbf, 0x33, 0xfa, 0x0, 0x0, + 0x1e, 0xde, 0xd0, 0x0, 0x0, 0x4, 0xff, 0x30, + 0x0, 0x0, 0x6, 0xff, 0x50, 0x0, 0x0, 0x3f, + 0xbc, 0xf2, 0x0, 0x0, 0xde, 0x12, 0xfc, 0x0, + 0xa, 0xf4, 0x0, 0x5f, 0x90, 0x6f, 0x80, 0x0, + 0xa, 0xf5, + + /* U+0079 "y" */ + 0xd, 0xe0, 0x0, 0x0, 0xc, 0xd0, 0x6, 0xf6, + 0x0, 0x0, 0x3f, 0x70, 0x0, 0xfc, 0x0, 0x0, + 0x9f, 0x10, 0x0, 0x9f, 0x30, 0x1, 0xfa, 0x0, + 0x0, 0x2f, 0x90, 0x6, 0xf3, 0x0, 0x0, 0xc, + 0xf0, 0xd, 0xc0, 0x0, 0x0, 0x5, 0xf6, 0x3f, + 0x60, 0x0, 0x0, 0x0, 0xed, 0xae, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xf, 0xb0, + 0x0, 0x0, 0x1, 0x0, 0x7f, 0x40, 0x0, 0x0, + 0x1f, 0xaa, 0xfb, 0x0, 0x0, 0x0, 0x19, 0xee, + 0xa1, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x2f, 0xff, 0xff, 0xff, 0x91, 0x77, 0x77, 0x7e, + 0xf4, 0x0, 0x0, 0x6, 0xf8, 0x0, 0x0, 0x3, + 0xfc, 0x0, 0x0, 0x1, 0xee, 0x10, 0x0, 0x0, + 0xbf, 0x40, 0x0, 0x0, 0x8f, 0x70, 0x0, 0x0, + 0x4f, 0xb0, 0x0, 0x0, 0x1e, 0xf8, 0x77, 0x77, + 0x54, 0xff, 0xff, 0xff, 0xfb, + + /* U+007B "{" */ + 0x0, 0x7e, 0xf0, 0x3f, 0xd7, 0x7, 0xf4, 0x0, + 0x8f, 0x30, 0x8, 0xf3, 0x0, 0x8f, 0x30, 0x8, + 0xf3, 0x0, 0x9f, 0x20, 0x8e, 0xe0, 0xf, 0xfa, + 0x0, 0xb, 0xf2, 0x0, 0x8f, 0x30, 0x8, 0xf3, + 0x0, 0x8f, 0x30, 0x8, 0xf3, 0x0, 0x7f, 0x40, + 0x4, 0xfd, 0x70, 0x8, 0xef, + + /* U+007C "|" */ + 0x1f, 0x71, 0xf7, 0x1f, 0x71, 0xf7, 0x1f, 0x71, + 0xf7, 0x1f, 0x71, 0xf7, 0x1f, 0x71, 0xf7, 0x1f, + 0x71, 0xf7, 0x1f, 0x71, 0xf7, 0x1f, 0x71, 0xf7, + 0x1f, 0x71, 0xf7, + + /* U+007D "}" */ + 0xaf, 0xa1, 0x0, 0x4b, 0xf9, 0x0, 0x0, 0xed, + 0x0, 0x0, 0xde, 0x0, 0x0, 0xde, 0x0, 0x0, + 0xde, 0x0, 0x0, 0xde, 0x0, 0x0, 0xde, 0x0, + 0x0, 0xaf, 0x92, 0x0, 0x5f, 0xf4, 0x0, 0xcf, + 0x10, 0x0, 0xde, 0x0, 0x0, 0xde, 0x0, 0x0, + 0xde, 0x0, 0x0, 0xde, 0x0, 0x0, 0xed, 0x0, + 0x4a, 0xf9, 0x0, 0xaf, 0xb1, 0x0, + + /* U+007E "~" */ + 0x0, 0x0, 0x0, 0x1, 0x1, 0xdf, 0xc1, 0x0, + 0xc5, 0xac, 0x5c, 0xe3, 0x4f, 0x2d, 0x40, 0x9, + 0xff, 0x90, 0x30, 0x0, 0x2, 0x10, 0x0, + + /* U+00B0 "°" */ + 0x1, 0xaf, 0xd5, 0x0, 0xb8, 0x3, 0xe4, 0x1e, + 0x0, 0x6, 0xa2, 0xe0, 0x0, 0x6a, 0xc, 0x70, + 0x1d, 0x50, 0x2c, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, + + /* U+2022 "•" */ + 0x5, 0x30, 0x9f, 0xf3, 0xcf, 0xf6, 0x4e, 0xc1, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xba, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, + 0xdf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1, 0x6a, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x7c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x3f, + 0xf2, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x95, 0x0, + 0x1, 0xff, 0x20, 0x0, 0x5, 0xff, 0x73, 0x0, + 0x0, 0x0, 0x1f, 0xf2, 0x0, 0x0, 0x5f, 0xe0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0x20, 0x0, 0x5, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf2, 0x0, + 0x0, 0x5f, 0xe0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0x20, 0x0, 0x5, 0xfe, 0x0, 0x0, 0x0, 0x69, + 0x8f, 0xf2, 0x0, 0x0, 0x5f, 0xe0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0x20, 0x3, 0x58, 0xfe, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf2, 0x2d, 0xff, 0xff, + 0xe0, 0x0, 0x4, 0xff, 0xff, 0xfd, 0xb, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x4, 0xbd, 0xc8, 0x10, + 0xaf, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xb1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x51, 0x6, 0x88, 0x88, 0x88, 0x88, 0x88, 0x30, + 0x15, 0xf7, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb6, 0x8f, 0xfd, 0xcf, 0xf3, 0x33, 0x33, 0x33, + 0x6f, 0xec, 0xdf, 0xf2, 0xc, 0xe0, 0x0, 0x0, + 0x0, 0x3f, 0x70, 0x2f, 0xf2, 0xc, 0xe0, 0x0, + 0x0, 0x0, 0x3f, 0x80, 0x2f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf4, 0x2d, + 0xf9, 0x99, 0x99, 0x99, 0xbf, 0x92, 0x4f, 0xf2, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x2f, + 0xfb, 0xaf, 0xf1, 0x11, 0x11, 0x11, 0x5f, 0xda, + 0xbf, 0xf9, 0x8e, 0xe0, 0x0, 0x0, 0x0, 0x3f, + 0xc8, 0x9f, 0xf2, 0xc, 0xe0, 0x0, 0x0, 0x0, + 0x3f, 0x70, 0x2f, 0xf6, 0x4d, 0xe0, 0x0, 0x0, + 0x0, 0x3f, 0xa4, 0x6f, 0xfe, 0xef, 0xfb, 0xbb, + 0xbb, 0xbb, 0xcf, 0xfe, 0xef, 0xc2, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x2c, + + /* U+F00B "" */ + 0x58, 0x88, 0x70, 0x28, 0x88, 0x88, 0x88, 0x88, + 0x85, 0xff, 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xd1, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xe1, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xf3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x58, 0x88, 0x60, 0x27, 0x88, 0x88, + 0x88, 0x88, 0x85, 0x47, 0x77, 0x50, 0x17, 0x77, + 0x77, 0x77, 0x77, 0x74, 0xff, 0xff, 0xf3, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xff, 0xf1, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x90, 0x9, 0xd2, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf9, 0x0, 0x9f, 0xfe, + 0x20, 0x0, 0x8, 0xff, 0xff, 0x90, 0x0, 0xdf, + 0xff, 0xe2, 0x0, 0x8f, 0xff, 0xf9, 0x0, 0x0, + 0x2e, 0xff, 0xfe, 0x28, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "ï€" */ + 0x2d, 0xb0, 0x0, 0x0, 0x6, 0xe6, 0xd, 0xff, + 0xc0, 0x0, 0x6, 0xff, 0xf3, 0xcf, 0xff, 0xc0, + 0x6, 0xff, 0xff, 0x31, 0xdf, 0xff, 0xc7, 0xff, + 0xff, 0x50, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x6, 0xff, 0xff, 0xdf, + 0xff, 0xc0, 0x6, 0xff, 0xff, 0x51, 0xdf, 0xff, + 0xc0, 0xff, 0xff, 0x50, 0x1, 0xdf, 0xff, 0x58, + 0xff, 0x50, 0x0, 0x1, 0xdf, 0xd0, 0x5, 0x30, + 0x0, 0x0, 0x1, 0x61, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0xcd, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xe3, 0x3, 0xff, + 0xa0, 0xb, 0xc1, 0x0, 0x0, 0x8, 0xff, 0xb0, + 0x3f, 0xfa, 0x4, 0xff, 0xd1, 0x0, 0x4, 0xff, + 0xf6, 0x3, 0xff, 0xa0, 0x1e, 0xff, 0xa0, 0x0, + 0xdf, 0xf7, 0x0, 0x3f, 0xfa, 0x0, 0x2e, 0xff, + 0x40, 0x3f, 0xfc, 0x0, 0x3, 0xff, 0xa0, 0x0, + 0x6f, 0xfa, 0x8, 0xff, 0x60, 0x0, 0x3f, 0xfa, + 0x0, 0x0, 0xef, 0xf0, 0xaf, 0xf2, 0x0, 0x3, + 0xff, 0xa0, 0x0, 0xb, 0xff, 0x1b, 0xff, 0x10, + 0x0, 0x1f, 0xf8, 0x0, 0x0, 0xbf, 0xf1, 0x9f, + 0xf3, 0x0, 0x0, 0x24, 0x0, 0x0, 0xd, 0xff, + 0x6, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xd0, 0x1f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf8, 0x0, 0x9f, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x9f, 0xfe, 0x10, 0x0, 0xcf, 0xfe, + 0x71, 0x0, 0x4, 0xcf, 0xff, 0x50, 0x0, 0x1, + 0xdf, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x28, 0xce, 0xfd, 0xa5, + 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x4, 0x66, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x78, 0x17, 0xff, 0xff, + 0xff, 0x71, 0x87, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x3f, 0xff, + 0xff, 0xfe, 0x88, 0xef, 0xff, 0xff, 0xf3, 0x8, + 0xff, 0xff, 0xd0, 0x0, 0xd, 0xff, 0xff, 0x80, + 0x0, 0xaf, 0xff, 0x50, 0x0, 0x5, 0xff, 0xfa, + 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x3, 0xff, + 0xfb, 0x0, 0x1, 0xcf, 0xff, 0x80, 0x0, 0x8, + 0xff, 0xfc, 0x10, 0x3e, 0xff, 0xff, 0xf6, 0x0, + 0x6f, 0xff, 0xff, 0xe3, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xdf, + 0x8e, 0xff, 0xff, 0xff, 0xe8, 0xfd, 0x0, 0x0, + 0x11, 0x1, 0x9f, 0xff, 0xf9, 0x10, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2c, 0xee, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x8, 0x92, 0x0, 0x6b, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xe4, 0xa, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xf6, 0xaf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfe, 0x31, 0xcf, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x25, 0x70, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x1, 0xbf, 0xfa, + 0x8, 0xff, 0xb0, 0x7f, 0xff, 0x40, 0x0, 0x2, + 0xdf, 0xf8, 0xa, 0xff, 0xff, 0xd2, 0x5f, 0xff, + 0x50, 0x4, 0xff, 0xf5, 0x1d, 0xff, 0xff, 0xff, + 0xe4, 0x2e, 0xff, 0x70, 0xdf, 0xe3, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x1c, 0xff, 0x13, 0xb1, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9, + 0x60, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfd, + 0x88, 0xbf, 0xff, 0xfe, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x70, 0x3, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf7, 0x0, 0x3f, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x70, + 0x3, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf5, 0x0, 0x2f, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x9, 0xaa, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xee, 0xef, 0xff, 0xfe, 0xee, 0xc0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x24, 0x44, 0x44, 0x7, + 0xff, 0x70, 0x44, 0x44, 0x42, 0xff, 0xff, 0xff, + 0xc1, 0x66, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x66, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x66, 0xc4, + 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F01C "" */ + 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x6, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xa0, 0x0, 0x1, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x50, 0x0, 0xbf, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x10, 0x6f, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xfa, 0xe, 0xff, 0xcc, 0xcc, 0x20, 0x0, 0x0, + 0xbc, 0xcc, 0xef, 0xf2, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xf8, 0x88, 0x8e, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x37, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x15, 0x66, 0x40, 0x0, 0x5, + 0xcb, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0x92, + 0x7, 0xff, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x66, 0xff, 0x0, 0x8f, 0xff, 0xa4, 0x12, + 0x5b, 0xff, 0xfd, 0xff, 0x4, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xd, 0xff, 0x30, + 0x0, 0x0, 0x45, 0x46, 0xff, 0xff, 0x4f, 0xf7, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0x8f, + 0xf1, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0x2, 0x10, 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, + 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x67, 0x77, 0x77, 0x75, 0x0, 0x0, + 0x0, 0x6, 0x73, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x3f, 0xf6, 0xff, 0xff, 0xee, 0xfd, + 0x0, 0x0, 0x0, 0xcf, 0xf1, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xa0, 0xff, 0xff, + 0xfb, 0x20, 0x0, 0x2, 0xbf, 0xfe, 0x10, 0xff, + 0x8d, 0xff, 0xfc, 0xa9, 0xcf, 0xff, 0xe2, 0x0, + 0xff, 0x61, 0x9f, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0xff, 0x70, 0x1, 0x7c, 0xee, 0xd9, 0x30, + 0x0, 0x0, 0x56, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x2, + 0xef, 0x0, 0x0, 0x2, 0xef, 0xf0, 0x0, 0x3, + 0xef, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xbb, 0xdf, + 0xff, 0xf0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, + 0x0, 0xbf, 0xf0, 0x0, 0x0, 0x0, 0xbe, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xf0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xf0, 0x7, 0x10, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x3f, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x4, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, 0xf3, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x3f, 0x70, 0x8b, 0xbb, + 0xdf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x40, 0x0, 0x0, 0x2d, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0x0, 0x0, 0x40, 0x1c, + 0xf4, 0x0, 0x0, 0x0, 0x2, 0xef, 0xf0, 0x0, + 0x5f, 0xb0, 0x1e, 0xe1, 0x0, 0x0, 0x3, 0xef, + 0xff, 0x0, 0x0, 0xaf, 0xa0, 0x6f, 0x70, 0xdf, + 0xff, 0xff, 0xff, 0xf0, 0x7, 0x10, 0xbf, 0x30, + 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, 0x3, 0xfd, + 0x3, 0xf9, 0xa, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x7, 0xf5, 0xe, 0xc0, 0x8f, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x4f, 0x70, 0xdd, 0x7, + 0xf3, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1d, 0xf3, + 0xf, 0xb0, 0x9f, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0x3, 0xf7, 0x7, 0xf6, 0xc, 0xf0, 0x7b, 0xbb, + 0xdf, 0xff, 0xf0, 0x0, 0x3, 0xfe, 0x12, 0xfa, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x3, 0xff, + 0x40, 0xaf, 0x30, 0x0, 0x0, 0x0, 0xbf, 0xf0, + 0x0, 0x3c, 0x30, 0x6f, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xbe, 0x0, 0x0, 0x0, 0x6f, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x90, 0x0, 0x0, + + /* U+F03E "" */ + 0x3a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xa3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xd5, 0x6e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0x50, 0x7, + 0xff, 0xff, 0xf5, 0x8, 0xff, 0xff, 0xff, 0xfb, + 0xbf, 0xff, 0xff, 0x50, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xcb, 0xff, 0xf5, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xfc, 0x0, 0xaf, 0x50, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xc0, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x74, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x47, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+F043 "ïƒ" */ + 0x0, 0x0, 0x6, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, + 0xfb, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xff, 0x4a, + 0xff, 0xff, 0xff, 0xff, 0x2c, 0xf8, 0x4f, 0xff, + 0xff, 0xff, 0xf0, 0x7f, 0xf2, 0x5c, 0xff, 0xff, + 0xfb, 0x0, 0xef, 0xe5, 0x8, 0xff, 0xff, 0x30, + 0x2, 0xef, 0xff, 0xff, 0xff, 0x50, 0x0, 0x1, + 0xaf, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x3, + 0x31, 0x0, 0x0, 0x0, + + /* U+F048 "ïˆ" */ + 0x6b, 0x90, 0x0, 0x0, 0x3, 0xa2, 0x9f, 0xe0, + 0x0, 0x0, 0x4f, 0xf9, 0x9f, 0xe0, 0x0, 0x5, + 0xff, 0xfa, 0x9f, 0xe0, 0x0, 0x6f, 0xff, 0xfa, + 0x9f, 0xe0, 0x7, 0xff, 0xff, 0xfa, 0x9f, 0xe0, + 0x8f, 0xff, 0xff, 0xfa, 0x9f, 0xe9, 0xff, 0xff, + 0xff, 0xfa, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xfe, + 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xe1, 0xdf, 0xff, + 0xff, 0xfa, 0x9f, 0xe0, 0x1c, 0xff, 0xff, 0xfa, + 0x9f, 0xe0, 0x0, 0xbf, 0xff, 0xfa, 0x9f, 0xe0, + 0x0, 0xa, 0xff, 0xfa, 0x9f, 0xe0, 0x0, 0x0, + 0x9f, 0xfa, 0x9f, 0xe0, 0x0, 0x0, 0x8, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "ï‹" */ + 0x3a, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "ïŒ" */ + 0x3a, 0xbb, 0xb9, 0x10, 0x3, 0xab, 0xbb, 0x91, + 0xef, 0xff, 0xff, 0xa0, 0xe, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xb0, 0xf, 0xff, 0xff, 0xfb, + 0x7f, 0xff, 0xfe, 0x40, 0x7, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04D "ï" */ + 0x3a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x91, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F051 "ï‘" */ + 0x4a, 0x20, 0x0, 0x0, 0xa, 0xb4, 0xbf, 0xe3, + 0x0, 0x0, 0xf, 0xf8, 0xcf, 0xff, 0x40, 0x0, + 0xf, 0xf8, 0xcf, 0xff, 0xf5, 0x0, 0xf, 0xf8, + 0xcf, 0xff, 0xff, 0x60, 0xf, 0xf8, 0xcf, 0xff, + 0xff, 0xf7, 0xf, 0xf8, 0xcf, 0xff, 0xff, 0xff, + 0x9f, 0xf8, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, + 0xff, 0xff, 0xdf, 0xf8, 0xcf, 0xff, 0xff, 0xfc, + 0x1f, 0xf8, 0xcf, 0xff, 0xff, 0xb0, 0xf, 0xf8, + 0xcf, 0xff, 0xfa, 0x0, 0xf, 0xf8, 0xcf, 0xff, + 0x80, 0x0, 0xf, 0xf8, 0xbf, 0xf7, 0x0, 0x0, + 0xf, 0xf8, 0x7f, 0x60, 0x0, 0x0, 0xf, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x0, 0x2, 0xca, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x34, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x42, 0x0, 0x3, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x10, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F053 "ï“" */ + 0x0, 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xd0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x20, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, + 0x9f, 0xff, 0x50, 0x0, 0x0, 0x9f, 0xff, 0x50, + 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, 0x9f, + 0xff, 0x50, 0x0, 0x0, 0xe, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0x20, 0x0, 0x0, 0x0, 0x3c, 0x60, + + /* U+F054 "ï”" */ + 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xc1, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x20, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, + 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, 0x9f, 0xff, + 0x50, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, + 0x9f, 0xff, 0x60, 0x0, 0x0, 0xe, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x3d, 0x50, 0x0, 0x0, 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x0, 0x0, 0x39, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x36, 0x77, 0x77, 0xef, 0xfc, 0x77, 0x77, 0x61, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + + /* U+F068 "ï¨" */ + 0x36, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+F06E "ï®" */ + 0x0, 0x0, 0x0, 0x3, 0x68, 0x87, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, + 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x4, 0xef, + 0xfd, 0x63, 0x25, 0xbf, 0xff, 0x70, 0x0, 0x0, + 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xa0, 0x0, 0x6, 0xff, 0xfd, 0x0, 0x8, 0xfc, + 0x20, 0x9f, 0xff, 0xa0, 0x2, 0xff, 0xff, 0x50, + 0x0, 0x8f, 0xfe, 0x12, 0xff, 0xff, 0x60, 0xcf, + 0xff, 0xf2, 0x16, 0x7f, 0xff, 0xf5, 0xe, 0xff, + 0xfe, 0x1e, 0xff, 0xff, 0x12, 0xff, 0xff, 0xff, + 0x70, 0xdf, 0xff, 0xf2, 0x6f, 0xff, 0xf3, 0xe, + 0xff, 0xff, 0xf3, 0xf, 0xff, 0xfb, 0x0, 0xbf, + 0xff, 0x90, 0x4f, 0xff, 0xf8, 0x5, 0xff, 0xfe, + 0x10, 0x1, 0xdf, 0xff, 0x40, 0x28, 0x84, 0x1, + 0xef, 0xff, 0x30, 0x0, 0x1, 0xbf, 0xff, 0x60, + 0x0, 0x4, 0xef, 0xfd, 0x30, 0x0, 0x0, 0x0, + 0x6e, 0xff, 0xfb, 0xbe, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x71, + 0x0, 0x0, 0x0, + + /* U+F070 "ï°" */ + 0x4a, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x60, 0x0, 0x15, 0x78, 0x74, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xa6, 0xdf, 0xff, + 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xe8, 0x32, 0x5b, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf6, 0x0, 0x10, + 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xf8, 0x7f, 0xd3, 0x9, 0xff, 0xfb, 0x0, + 0x0, 0x1e, 0x70, 0x1, 0xbf, 0xfe, 0xff, 0xf2, + 0x1f, 0xff, 0xf7, 0x0, 0x9, 0xff, 0xa0, 0x0, + 0x8f, 0xff, 0xff, 0x70, 0xdf, 0xff, 0xf1, 0x0, + 0xcf, 0xff, 0xd1, 0x0, 0x5f, 0xff, 0xf9, 0xc, + 0xff, 0xff, 0x30, 0x5, 0xff, 0xff, 0x60, 0x0, + 0x2d, 0xff, 0xb0, 0xef, 0xff, 0xb0, 0x0, 0xa, + 0xff, 0xfc, 0x0, 0x0, 0xa, 0xff, 0xef, 0xff, + 0xe1, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf8, 0x10, 0x0, 0x3, 0xef, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xcb, 0x80, + 0x1, 0xbf, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xdf, 0xfe, 0x70, 0x0, 0x8f, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0x33, + 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf9, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfa, 0x0, 0x6f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfb, + 0x0, 0x7f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xfc, 0x0, 0x8f, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfd, 0x0, 0x9f, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xcb, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfc, 0x0, 0x8f, 0xff, 0xff, + 0xfc, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x60, 0xa, 0xff, 0xff, + 0xff, 0xfe, 0x42, 0xcf, 0xff, 0xff, 0xff, 0xe0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x23, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x0, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xf9, 0x0, 0x12, 0x22, 0x10, 0x0, 0x0, 0x1, + 0x29, 0xff, 0x90, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xfe, 0x20, + 0x5, 0xff, 0xff, 0xff, 0xfd, 0x9a, 0xad, 0xff, + 0xd0, 0x5f, 0xff, 0xbd, 0xff, 0xe2, 0x0, 0x0, + 0xcf, 0x44, 0xff, 0xf9, 0x8, 0xfe, 0x20, 0x0, + 0x0, 0x4, 0x4f, 0xff, 0x90, 0x4, 0xd2, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa1, 0x91, 0x6, + 0xf6, 0x0, 0x0, 0x2, 0xef, 0xfb, 0xc, 0xfc, + 0x8, 0xff, 0x60, 0xef, 0xff, 0xff, 0xb0, 0x1d, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xfc, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xfe, 0xdd, 0xdd, 0xb0, + 0x0, 0x0, 0x2d, 0xde, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfa, 0xcf, 0xfe, 0x30, 0x0, + 0x0, 0x6f, 0xff, 0x90, 0xc, 0xff, 0xe3, 0x0, + 0x6, 0xff, 0xf9, 0x0, 0x0, 0xcf, 0xfe, 0x30, + 0x5f, 0xff, 0x90, 0x0, 0x0, 0xc, 0xff, 0xe2, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf6, + 0x1b, 0x80, 0x0, 0x0, 0x0, 0x0, 0xb, 0x90, + + /* U+F078 "ï¸" */ + 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, + 0x6f, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf2, + 0xaf, 0xfe, 0x20, 0x0, 0x0, 0x5, 0xff, 0xf6, + 0x1c, 0xff, 0xe3, 0x0, 0x0, 0x5f, 0xff, 0x90, + 0x1, 0xcf, 0xfe, 0x30, 0x5, 0xff, 0xf9, 0x0, + 0x0, 0x1c, 0xff, 0xe3, 0x5f, 0xff, 0x90, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0x90, 0x0, 0x0, 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x0, 0x26, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xa0, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xfa, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xa0, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0xe, 0xfd, 0xef, 0xcf, 0xf8, 0x0, 0x0, 0x0, + 0x5, 0xfe, 0x0, 0x0, 0xb, 0xe2, 0xdf, 0x67, + 0xf5, 0x0, 0x0, 0x0, 0x5, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x60, 0x0, 0x0, 0x0, 0x4, + 0x15, 0xfe, 0x3, 0x20, 0x0, 0x0, 0xdf, 0x60, + 0x0, 0x0, 0x0, 0x6f, 0xd6, 0xfe, 0x4f, 0xf1, + 0x0, 0x0, 0xdf, 0x94, 0x44, 0x44, 0x41, 0x3f, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x24, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, + + /* U+F07B "ï»" */ + 0x17, 0x88, 0x88, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x44, + 0x44, 0x44, 0x30, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+F093 "ï‚“" */ + 0x0, 0x0, 0x0, 0x0, 0x47, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x11, 0x2f, 0xff, 0xf7, 0x11, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x24, 0x44, 0x42, 0x1f, + 0xff, 0xf6, 0x24, 0x44, 0x42, 0xff, 0xff, 0xfc, + 0x8, 0xbb, 0xa2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa5, 0x55, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x66, 0xc4, + 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xb8, + 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, + 0x0, 0x0, 0x4, 0xa5, 0x0, 0x0, 0xaf, 0xff, + 0xd0, 0x0, 0x0, 0x7d, 0xff, 0xf4, 0x2, 0xcf, + 0xff, 0xe2, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xe9, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x23, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x35, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xfa, 0x0, 0x0, 0x1, 0x9c, 0xa1, + 0xaf, 0xfe, 0xff, 0x60, 0x0, 0x2e, 0xff, 0xf9, + 0xef, 0x60, 0xaf, 0xb0, 0x3, 0xef, 0xff, 0xb0, + 0xef, 0x92, 0xcf, 0x90, 0x3e, 0xff, 0xfa, 0x0, + 0x7f, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xa0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x36, 0xef, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0xaf, 0xfe, 0xff, 0xc2, 0xdf, 0xff, 0xd1, 0x0, + 0xef, 0x60, 0xaf, 0xa0, 0x1c, 0xff, 0xfd, 0x20, + 0xef, 0x92, 0xcf, 0xa0, 0x0, 0xcf, 0xff, 0xe2, + 0x7f, 0xff, 0xff, 0x40, 0x0, 0xb, 0xff, 0xf9, + 0x8, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x58, 0x50, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf1, 0x68, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf1, 0x7f, 0x80, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf1, 0x7f, 0xf8, + 0x36, 0x62, 0xaf, 0xff, 0xff, 0xf1, 0x36, 0x66, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xf6, 0x22, 0x22, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf7, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x14, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x5, 0x66, 0x66, 0x66, 0x66, 0x64, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0xff, 0xed, 0xdd, 0xdd, 0xdd, 0xef, 0xf9, 0x0, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, 0x90, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf6, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf9, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xc5, 0x7f, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xfe, 0x0, 0x5, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xfa, 0x0, 0x1, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xfd, 0x0, 0x4, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0x93, 0x4d, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x1, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, + + /* U+F0C9 "" */ + 0x79, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x95, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0E0 "" */ + 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0xa1, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x3d, 0xfe, 0x42, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x26, 0xff, 0xff, + 0xf9, 0x19, 0xff, 0xff, 0xff, 0x91, 0xbf, 0xff, + 0xff, 0xff, 0xd3, 0x5f, 0xff, 0xe5, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x71, 0x99, 0x17, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x77, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+F0E7 "" */ + 0x0, 0xaf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xa5, 0x55, 0x40, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0xef, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x1, 0x22, 0x23, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x8d, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x8b, 0xbc, 0xfa, 0xfd, 0xbb, 0x90, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0xcf, 0xff, 0xf1, 0x0, 0x0, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x95, 0xff, 0xff, 0xf1, 0x79, 0x0, + 0xff, 0xff, 0x88, 0xff, 0xff, 0xf1, 0x7f, 0xb0, + 0xff, 0xff, 0x88, 0xff, 0xff, 0xf1, 0x7f, 0xfa, + 0xff, 0xff, 0x88, 0xff, 0xff, 0xf2, 0x2, 0x21, + 0xff, 0xff, 0x88, 0xff, 0xff, 0xff, 0xdd, 0xdc, + 0xff, 0xff, 0x88, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0x88, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0x88, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x7a, 0xaa, 0x58, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xcf, 0xfa, 0x40, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x41, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0xf4, 0x4, 0xd0, 0x2f, 0x0, 0xf3, 0x3, 0xf0, + 0xf, 0xf4, 0xff, 0x40, 0x5d, 0x2, 0xf0, 0xf, + 0x40, 0x4f, 0x0, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0x22, 0xb7, 0x29, 0xa2, 0x4f, 0x42, 0xcf, + 0xff, 0x4f, 0xff, 0xf0, 0xa, 0x60, 0x79, 0x2, + 0xf2, 0xb, 0xff, 0xf4, 0xff, 0xff, 0xdd, 0xfe, + 0xdf, 0xfd, 0xef, 0xed, 0xff, 0xff, 0x4f, 0xf8, + 0x48, 0xe4, 0x44, 0x44, 0x44, 0x47, 0xf4, 0x5f, + 0xf4, 0xff, 0x40, 0x4d, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x0, 0xff, 0x4f, 0xf7, 0x48, 0xe4, 0x44, + 0x44, 0x44, 0x47, 0xf4, 0x4f, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x37, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8b, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x17, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x29, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x56, + 0x66, 0x66, 0x7f, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "ï…›" */ + 0x58, 0x88, 0x88, 0x87, 0x6, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xfe, 0xf, 0x90, 0x0, 0xff, 0xff, + 0xff, 0xfe, 0xf, 0xf9, 0x0, 0xff, 0xff, 0xff, + 0xfe, 0xf, 0xff, 0x90, 0xff, 0xff, 0xff, 0xfe, + 0xf, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0x32, + 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x14, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x30, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, + 0x89, 0xa9, 0x74, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xef, 0xff, 0xff, 0xff, 0xff, 0xc6, + 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x6, 0xff, + 0xff, 0xfc, 0x75, 0x43, 0x46, 0x9e, 0xff, 0xff, + 0xb1, 0x8, 0xff, 0xfe, 0x71, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xcf, 0xff, 0xe2, 0xcf, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0x40, 0xb6, 0x0, 0x0, 0x59, 0xde, 0xfe, 0xc7, + 0x20, 0x0, 0x1b, 0x50, 0x0, 0x0, 0x5, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xfe, 0xde, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfc, 0x40, + 0x0, 0x2, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x1, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0xff, 0x4a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, + 0xff, 0x5f, 0xf4, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x3f, 0xf5, 0xff, 0x4a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xef, + 0x5f, 0xf4, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xf5, 0xff, 0x45, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0xf, 0xff, 0x5f, + 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x45, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, + + /* U+F241 "ï‰" */ + 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0xff, 0x4d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0xf, + 0xff, 0x5f, 0xf4, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x3f, 0xf5, 0xff, 0x4d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xef, + 0x5f, 0xf4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x8f, 0xf5, 0xff, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x30, 0x0, 0xf, 0xff, 0x5f, + 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x45, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, + + /* U+F242 "" */ + 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0xff, 0x4c, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x5f, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x3f, 0xf5, 0xff, 0x4c, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x5f, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x8f, 0xf5, 0xff, 0x46, 0x88, 0x88, + 0x88, 0x80, 0x0, 0x0, 0x0, 0xf, 0xff, 0x5f, + 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x45, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, + + /* U+F243 "" */ + 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0xff, 0x49, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x5f, 0xf4, 0x9f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf5, 0xff, 0x49, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x5f, 0xf4, 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf5, 0xff, 0x44, 0x88, 0x87, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x5f, + 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x45, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, + + /* U+F244 "" */ + 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf5, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf5, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x5f, + 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x45, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0x9f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xef, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x80, + 0x2e, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x0, 0x6, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xe3, 0x0, 0xd7, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xa1, 0x0, 0xcf, 0xff, 0xd4, + 0x9f, 0x55, 0x55, 0x55, 0x55, 0x55, 0x7f, 0xf7, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xaf, 0xff, 0xa0, 0x0, + 0xb, 0xb0, 0x0, 0x0, 0x0, 0x3f, 0xb2, 0x0, + 0x9c, 0x90, 0x0, 0x0, 0x3f, 0x30, 0x0, 0x0, + 0x1, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbb, 0x2, 0xbb, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xf9, 0x9f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xbd, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x1, 0x7b, 0xdd, 0xb8, 0x20, 0x0, 0x0, + 0x5f, 0xff, 0xdf, 0xff, 0xf6, 0x0, 0x4, 0xff, + 0xff, 0x68, 0xff, 0xff, 0x40, 0xe, 0xff, 0xff, + 0x60, 0x9f, 0xff, 0xd0, 0x4f, 0xff, 0xff, 0x60, + 0x9, 0xff, 0xf3, 0x8f, 0xf6, 0xbf, 0x61, 0xc0, + 0x9f, 0xf7, 0xbf, 0xf6, 0xb, 0x60, 0xe2, 0x5f, + 0xf9, 0xdf, 0xff, 0x50, 0x20, 0x33, 0xff, 0xfb, + 0xef, 0xff, 0xf5, 0x0, 0x2e, 0xff, 0xfc, 0xef, + 0xff, 0xfc, 0x0, 0x7f, 0xff, 0xfc, 0xdf, 0xff, + 0xd1, 0x0, 0x9, 0xff, 0xfc, 0xcf, 0xfc, 0x14, + 0x50, 0x90, 0xaf, 0xfb, 0xaf, 0xf2, 0x4f, 0x60, + 0xf3, 0x2f, 0xf9, 0x6f, 0xfd, 0xff, 0x70, 0x52, + 0xef, 0xf6, 0x1f, 0xff, 0xff, 0x70, 0x2e, 0xff, + 0xf1, 0x9, 0xff, 0xff, 0x72, 0xef, 0xff, 0x90, + 0x0, 0xbf, 0xff, 0xae, 0xff, 0xfd, 0x10, 0x0, + 0x5, 0xcf, 0xff, 0xfd, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x0, + + /* U+F2ED "ï‹­" */ + 0x0, 0x0, 0x5, 0x88, 0x88, 0x30, 0x0, 0x0, + 0x56, 0x66, 0x7f, 0xff, 0xff, 0xe6, 0x66, 0x63, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd8, + 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xe, 0xff, 0x1f, 0xf6, 0xaf, 0xc4, 0xff, 0xa0, + 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, + 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, + 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, + 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, + 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, + 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, + 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, + 0xe, 0xff, 0x1f, 0xf6, 0xaf, 0xc4, 0xff, 0xa0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x31, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x34, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x44, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x44, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0x44, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0x41, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x57, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x72, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0xbf, 0xff, 0xff, 0xf8, + 0xaf, 0xff, 0xa8, 0xff, 0xff, 0xf8, 0x0, 0xbf, + 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xa0, 0xa, 0xff, + 0xff, 0x80, 0xbf, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x60, 0x3, 0xff, 0xff, 0xf8, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x9f, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x80, + 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x3, 0xe3, 0x0, + 0xbf, 0xff, 0xf8, 0x0, 0x4f, 0xff, 0xff, 0xfe, + 0x23, 0xff, 0xf3, 0x2e, 0xff, 0xff, 0x80, 0x0, + 0x4f, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, + + /* U+F7C2 "" */ + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xcf, + 0x47, 0xf4, 0xd8, 0x4f, 0xf5, 0xc, 0xff, 0x3, + 0xe0, 0xc5, 0xe, 0xf5, 0xcf, 0xff, 0x3, 0xe0, + 0xc5, 0xe, 0xf5, 0xff, 0xff, 0x24, 0xe2, 0xc6, + 0x2e, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x1, 0x34, + 0x44, 0x44, 0x44, 0x42, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x10, 0x0, 0x3e, 0x90, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf1, 0x0, 0x4f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x10, + 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf1, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x3e, 0xff, 0xfe, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xca, 0x0, 0x2e, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 77, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 77, .box_w = 3, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 20, .adv_w = 113, .box_w = 5, .box_h = 6, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 35, .adv_w = 202, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 120, .adv_w = 179, .box_w = 11, .box_h = 18, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 219, .adv_w = 243, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 317, .adv_w = 198, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 408, .adv_w = 60, .box_w = 2, .box_h = 6, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 414, .adv_w = 97, .box_w = 5, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 459, .adv_w = 97, .box_w = 5, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 504, .adv_w = 115, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 529, .adv_w = 168, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 570, .adv_w = 65, .box_w = 4, .box_h = 6, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 582, .adv_w = 110, .box_w = 5, .box_h = 2, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 587, .adv_w = 65, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 593, .adv_w = 101, .box_w = 8, .box_h = 18, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 665, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 743, .adv_w = 107, .box_w = 5, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 776, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 841, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 906, .adv_w = 193, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 984, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1049, .adv_w = 178, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1121, .adv_w = 172, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1193, .adv_w = 185, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1265, .adv_w = 178, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1337, .adv_w = 65, .box_w = 4, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1357, .adv_w = 65, .box_w = 4, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1383, .adv_w = 168, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1424, .adv_w = 168, .box_w = 9, .box_h = 7, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 1456, .adv_w = 168, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1497, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1562, .adv_w = 298, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 1715, .adv_w = 211, .box_w = 15, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1813, .adv_w = 218, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1891, .adv_w = 208, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1976, .adv_w = 238, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2061, .adv_w = 193, .box_w = 11, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2133, .adv_w = 183, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2198, .adv_w = 222, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2283, .adv_w = 234, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2361, .adv_w = 89, .box_w = 3, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2381, .adv_w = 148, .box_w = 9, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2440, .adv_w = 207, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2518, .adv_w = 171, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2583, .adv_w = 275, .box_w = 15, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2681, .adv_w = 234, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2759, .adv_w = 242, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2857, .adv_w = 208, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2935, .adv_w = 242, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3055, .adv_w = 209, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3133, .adv_w = 179, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3205, .adv_w = 169, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3277, .adv_w = 228, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3355, .adv_w = 205, .box_w = 14, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3446, .adv_w = 324, .box_w = 20, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3576, .adv_w = 194, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3654, .adv_w = 186, .box_w = 13, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3739, .adv_w = 189, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3817, .adv_w = 96, .box_w = 5, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 3862, .adv_w = 101, .box_w = 8, .box_h = 18, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 3934, .adv_w = 96, .box_w = 5, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 3979, .adv_w = 168, .box_w = 9, .box_h = 8, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 4015, .adv_w = 144, .box_w = 9, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4024, .adv_w = 173, .box_w = 5, .box_h = 3, .ofs_x = 2, .ofs_y = 11}, + {.bitmap_index = 4032, .adv_w = 172, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4082, .adv_w = 196, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4159, .adv_w = 164, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4209, .adv_w = 196, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4286, .adv_w = 176, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4341, .adv_w = 102, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4390, .adv_w = 199, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 4467, .adv_w = 196, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4537, .adv_w = 80, .box_w = 3, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4558, .adv_w = 82, .box_w = 6, .box_h = 18, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 4612, .adv_w = 177, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4689, .adv_w = 80, .box_w = 3, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4710, .adv_w = 304, .box_w = 17, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4795, .adv_w = 196, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4845, .adv_w = 183, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4900, .adv_w = 196, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 4977, .adv_w = 196, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 5054, .adv_w = 118, .box_w = 6, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5084, .adv_w = 144, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5129, .adv_w = 119, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5171, .adv_w = 195, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5221, .adv_w = 161, .box_w = 12, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5281, .adv_w = 259, .box_w = 17, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5366, .adv_w = 159, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5416, .adv_w = 161, .box_w = 12, .box_h = 14, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 5500, .adv_w = 150, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5545, .adv_w = 101, .box_w = 5, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 5590, .adv_w = 86, .box_w = 3, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 5617, .adv_w = 101, .box_w = 6, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 5671, .adv_w = 168, .box_w = 9, .box_h = 5, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 5694, .adv_w = 121, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 5719, .adv_w = 90, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 5727, .adv_w = 288, .box_w = 19, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 5908, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6034, .adv_w = 288, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6187, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6313, .adv_w = 198, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6398, .adv_w = 288, .box_w = 19, .box_h = 18, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6569, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 6740, .adv_w = 324, .box_w = 21, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6919, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 7090, .adv_w = 324, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7237, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 7408, .adv_w = 144, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7476, .adv_w = 216, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7581, .adv_w = 324, .box_w = 21, .box_h = 18, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7770, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7896, .adv_w = 198, .box_w = 13, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 8020, .adv_w = 252, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 8122, .adv_w = 252, .box_w = 16, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 8274, .adv_w = 252, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8410, .adv_w = 252, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8546, .adv_w = 252, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 8648, .adv_w = 252, .box_w = 18, .box_h = 17, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 8801, .adv_w = 180, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8889, .adv_w = 180, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8977, .adv_w = 252, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9113, .adv_w = 252, .box_w = 16, .box_h = 4, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 9145, .adv_w = 324, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9292, .adv_w = 360, .box_w = 23, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9511, .adv_w = 324, .box_w = 22, .box_h = 19, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 9720, .adv_w = 288, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9873, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 9953, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 10033, .adv_w = 360, .box_w = 24, .box_h = 15, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 10213, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10339, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10510, .adv_w = 288, .box_w = 19, .box_h = 19, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 10691, .adv_w = 252, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10827, .adv_w = 252, .box_w = 16, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10979, .adv_w = 252, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11115, .adv_w = 252, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 11235, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11361, .adv_w = 180, .box_w = 13, .box_h = 19, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 11485, .adv_w = 252, .box_w = 16, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11637, .adv_w = 252, .box_w = 16, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11789, .adv_w = 324, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11936, .adv_w = 288, .box_w = 20, .box_h = 20, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 12136, .adv_w = 216, .box_w = 14, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12269, .adv_w = 360, .box_w = 23, .box_h = 18, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 12476, .adv_w = 360, .box_w = 23, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 12614, .adv_w = 360, .box_w = 23, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 12752, .adv_w = 360, .box_w = 23, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 12890, .adv_w = 360, .box_w = 23, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 13028, .adv_w = 360, .box_w = 23, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 13166, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 13339, .adv_w = 252, .box_w = 14, .box_h = 19, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 13472, .adv_w = 252, .box_w = 16, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 13624, .adv_w = 288, .box_w = 19, .box_h = 19, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 13805, .adv_w = 360, .box_w = 23, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13966, .adv_w = 216, .box_w = 14, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 14099, .adv_w = 290, .box_w = 19, .box_h = 12, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 3, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 13, 0, 8, -6, 0, 0, + 0, 0, -16, -17, 2, 14, 6, 5, + -12, 2, 14, 1, 12, 3, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 17, 2, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, -9, 0, 0, 0, 0, + 0, -6, 5, 6, 0, 0, -3, 0, + -2, 3, 0, -3, 0, -3, -1, -6, + 0, 0, 0, 0, -3, 0, 0, -4, + -4, 0, 0, -3, 0, -6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + -3, 0, -4, 0, -8, 0, -35, 0, + 0, -6, 0, 6, 9, 0, 0, -6, + 3, 3, 10, 6, -5, 6, 0, 0, + -16, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -8, -3, -14, 0, -12, + -2, 0, 0, 0, 0, 1, 11, 0, + -9, -2, -1, 1, 0, -5, 0, 0, + -2, -21, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -23, -2, 11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 10, + 0, 3, 0, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 11, 2, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 6, 3, 9, -3, 0, 0, 6, -3, + -10, -39, 2, 8, 6, 1, -4, 0, + 10, 0, 9, 0, 9, 0, -27, 0, + -3, 9, 0, 10, -3, 6, 3, 0, + 0, 1, -3, 0, 0, -5, 23, 0, + 23, 0, 9, 0, 12, 4, 5, 9, + 0, 0, 0, -11, 0, 0, 0, 0, + 1, -2, 0, 2, -5, -4, -6, 2, + 0, -3, 0, 0, 0, -12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -16, 0, -18, 0, 0, 0, + 0, -2, 0, 29, -3, -4, 3, 3, + -3, 0, -4, 3, 0, 0, -15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -28, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -18, 0, 17, 0, 0, -11, 0, + 10, 0, -20, -28, -20, -6, 9, 0, + 0, -19, 0, 3, -7, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 9, -35, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 0, 2, 0, 0, 0, + 0, 0, 2, 2, -3, -6, 0, -1, + -1, -3, 0, 0, -2, 0, 0, 0, + -6, 0, -2, 0, -7, -6, 0, -7, + -10, -10, -5, 0, -6, 0, -6, 0, + 0, 0, 0, -2, 0, 0, 3, 0, + 2, -3, 0, 1, 0, 0, 0, 3, + -2, 0, 0, 0, -2, 3, 3, -1, + 0, 0, 0, -5, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 4, -2, 0, + -3, 0, -5, 0, 0, -2, 0, 9, + 0, 0, -3, 0, 0, 0, 0, 0, + -1, 1, -2, -2, 0, 0, -3, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, -3, -3, 0, + 0, 0, 0, 0, 1, 0, 0, -2, + 0, -3, -3, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, -2, -4, 0, -4, 0, -9, + -2, -9, 6, 0, 0, -6, 3, 6, + 8, 0, -7, -1, -3, 0, -1, -14, + 3, -2, 2, -15, 3, 0, 0, 1, + -15, 0, -15, -2, -25, -2, 0, -14, + 0, 6, 8, 0, 4, 0, 0, 0, + 0, 1, 0, -5, -4, 0, -9, 0, + 0, 0, -3, 0, 0, 0, -3, 0, + 0, 0, 0, 0, -1, -1, 0, -1, + -4, 0, 0, 0, 0, 0, 0, 0, + -3, -3, 0, -2, -3, -2, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -3, + 0, -2, 0, -6, 3, 0, 0, -3, + 1, 3, 3, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 2, + 0, 0, -3, 0, -3, -2, -3, 0, + 0, 0, 0, 0, 0, 0, 2, 0, + -2, 0, 0, 0, 0, -3, -4, 0, + -5, 0, 9, -2, 1, -9, 0, 0, + 8, -14, -15, -12, -6, 3, 0, -2, + -19, -5, 0, -5, 0, -6, 4, -5, + -18, 0, -8, 0, 0, 1, -1, 2, + -2, 0, 3, 0, -9, -11, 0, -14, + -7, -6, -7, -9, -3, -8, -1, -5, + -8, 2, 0, 1, 0, -3, 0, 0, + 0, 2, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, -1, 0, -1, -3, 0, -5, -6, + -6, -1, 0, -9, 0, 0, 0, 0, + 0, 0, -2, 0, 0, 0, 0, 1, + -2, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + -5, 0, 0, 0, 0, -14, -9, 0, + 0, 0, -4, -14, 0, 0, -3, 3, + 0, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, -5, 0, + 0, 0, 0, 3, 0, 2, -6, -6, + 0, -3, -3, -3, 0, 0, 0, 0, + 0, 0, -9, 0, -3, 0, -4, -3, + 0, -6, -7, -9, -2, 0, -6, 0, + -9, 0, 0, 0, 0, 23, 0, 0, + 1, 0, 0, -4, 0, 3, 0, -12, + 0, 0, 0, 0, 0, -27, -5, 10, + 9, -2, -12, 0, 3, -4, 0, -14, + -1, -4, 3, -20, -3, 4, 0, 4, + -10, -4, -11, -10, -12, 0, 0, -17, + 0, 16, 0, 0, -1, 0, 0, 0, + -1, -1, -3, -8, -10, -1, -27, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, -1, -3, -4, 0, 0, + -6, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -6, 0, 0, 6, + -1, 4, 0, -6, 3, -2, -1, -7, + -3, 0, -4, -3, -2, 0, -4, -5, + 0, 0, -2, -1, -2, -5, -3, 0, + 0, -3, 0, 3, -2, 0, -6, 0, + 0, 0, -6, 0, -5, 0, -5, -5, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, -6, 3, 0, -4, 0, -2, -3, + -9, -2, -2, -2, -1, -2, -3, -1, + 0, 0, 0, 0, 0, -3, -2, -2, + 0, 0, 0, 0, 3, -2, 0, -2, + 0, 0, 0, -2, -3, -2, -3, -3, + -3, 0, 2, 12, -1, 0, -8, 0, + -2, 6, 0, -3, -12, -4, 4, 0, + 0, -14, -5, 3, -5, 2, 0, -2, + -2, -9, 0, -4, 1, 0, 0, -5, + 0, 0, 0, 3, 3, -6, -5, 0, + -5, -3, -4, -3, -3, 0, -5, 1, + -5, -5, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, -4, + 0, 0, -3, -3, 0, 0, 0, 0, + -3, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + -4, 0, -6, 0, 0, 0, -10, 0, + 2, -6, 6, 1, -2, -14, 0, 0, + -6, -3, 0, -12, -7, -8, 0, 0, + -12, -3, -12, -11, -14, 0, -7, 0, + 2, 19, -4, 0, -7, -3, -1, -3, + -5, -8, -5, -11, -12, -7, -3, 0, + 0, -2, 0, 1, 0, 0, -20, -3, + 9, 6, -6, -11, 0, 1, -9, 0, + -14, -2, -3, 6, -26, -4, 1, 0, + 0, -19, -3, -15, -3, -21, 0, 0, + -20, 0, 17, 1, 0, -2, 0, 0, + 0, 0, -1, -2, -11, -2, 0, -19, + 0, 0, 0, 0, -9, 0, -3, 0, + -1, -8, -14, 0, 0, -1, -4, -9, + -3, 0, -2, 0, 0, 0, 0, -13, + -3, -10, -9, -2, -5, -7, -3, -5, + 0, -6, -3, -10, -4, 0, -3, -5, + -3, -5, 0, 1, 0, -2, -10, 0, + 6, 0, -5, 0, 0, 0, 0, 3, + 0, 2, -6, 12, 0, -3, -3, -3, + 0, 0, 0, 0, 0, 0, -9, 0, + -3, 0, -4, -3, 0, -6, -7, -9, + -2, 0, -6, 2, 12, 0, 0, 0, + 0, 23, 0, 0, 1, 0, 0, -4, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -2, -6, 0, 0, 0, 0, 0, -1, + 0, 0, 0, -3, -3, 0, 0, -6, + -3, 0, 0, -6, 0, 5, -1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 4, 6, 2, -3, 0, -9, + -5, 0, 9, -10, -9, -6, -6, 12, + 5, 3, -25, -2, 6, -3, 0, -3, + 3, -3, -10, 0, -3, 3, -4, -2, + -9, -2, 0, 0, 9, 6, 0, -8, + 0, -16, -4, 8, -4, -11, 1, -4, + -10, -10, -3, 12, 3, 0, -4, 0, + -8, 0, 2, 10, -7, -11, -12, -7, + 9, 0, 1, -21, -2, 3, -5, -2, + -7, 0, -6, -11, -4, -4, -2, 0, + 0, -7, -6, -3, 0, 9, 7, -3, + -16, 0, -16, -4, 0, -10, -17, -1, + -9, -5, -10, -8, 8, 0, 0, -4, + 0, -6, -3, 0, -3, -5, 0, 5, + -10, 3, 0, 0, -15, 0, -3, -6, + -5, -2, -9, -7, -10, -7, 0, -9, + -3, -7, -5, -9, -3, 0, 0, 1, + 14, -5, 0, -9, -3, 0, -3, -6, + -7, -8, -8, -11, -4, -6, 6, 0, + -4, 0, -14, -3, 2, 6, -9, -11, + -6, -10, 10, -3, 1, -27, -5, 6, + -6, -5, -11, 0, -9, -12, -3, -3, + -2, -3, -6, -9, -1, 0, 0, 9, + 8, -2, -19, 0, -17, -7, 7, -11, + -20, -6, -10, -12, -14, -10, 6, 0, + 0, 0, 0, -3, 0, 0, 3, -3, + 6, 2, -5, 6, 0, 0, -9, -1, + 0, -1, 0, 1, 1, -2, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + 0, 2, 9, 1, 0, -3, 0, 0, + 0, 0, -2, -2, -3, 0, 0, 0, + 1, 2, 0, 0, 0, 0, 2, 0, + -2, 0, 11, 0, 5, 1, 1, -4, + 0, 6, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 0, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -17, 0, -3, 5, 0, 9, + 0, 0, 29, 3, -6, -6, 3, 3, + -2, 1, -14, 0, 0, 14, -17, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -20, 11, 40, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, -5, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, -8, 0, + 0, 1, 0, 0, 3, 37, -6, -2, + 9, 8, -8, 3, 0, 0, 3, 3, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -37, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -8, + 0, 0, 0, -8, 0, 0, 0, 0, + -6, -1, 0, 0, 0, -6, 0, -3, + 0, -14, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -19, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -3, 0, 0, -5, 0, -4, 0, + -8, 0, 0, 0, -5, 3, -3, 0, + 0, -8, -3, -7, 0, 0, -8, 0, + -3, 0, -14, 0, -3, 0, 0, -23, + -5, -12, -3, -10, 0, 0, -19, 0, + -8, -1, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -5, -2, -5, 0, 0, + 0, 0, -6, 0, -6, 4, -3, 6, + 0, -2, -7, -2, -5, -5, 0, -3, + -1, -2, 2, -8, -1, 0, 0, 0, + -25, -2, -4, 0, -6, 0, -2, -14, + -3, 0, 0, -2, -2, 0, 0, 0, + 0, 2, 0, -2, -5, -2, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 0, + 0, -6, 0, -2, 0, 0, 0, -6, + 3, 0, 0, 0, -8, -3, -6, 0, + 0, -8, 0, -3, 0, -14, 0, 0, + 0, 0, -28, 0, -6, -11, -14, 0, + 0, -19, 0, -2, -4, 0, 0, 0, + 0, 0, 0, 0, 0, -3, -4, -1, + -4, 1, 0, 0, 5, -4, 0, 9, + 14, -3, -3, -9, 3, 14, 5, 6, + -8, 3, 12, 3, 8, 6, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 18, 14, -5, -3, 0, -2, + 23, 12, 23, 0, 0, 0, 3, 0, + 0, 11, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 0, 0, -24, -3, -2, -12, + -14, 0, 0, -19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, -24, -3, -2, + -12, -14, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, -7, 3, 0, -3, + 2, 5, 3, -9, 0, -1, -2, 3, + 0, 2, 0, 0, 0, 0, -7, 0, + -3, -2, -6, 0, -3, -12, 0, 18, + -3, 0, -6, -2, 0, -2, -5, 0, + -3, -8, -6, -3, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, -24, + -3, -2, -12, -14, 0, 0, -19, 0, + 0, 0, 0, 0, 0, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, -9, -3, -3, 9, -3, -3, + -12, 1, -2, 1, -2, -8, 1, 6, + 1, 2, 1, 2, -7, -12, -3, 0, + -11, -5, -8, -12, -11, 0, -5, -6, + -3, -4, -2, -2, -3, -2, 0, -2, + -1, 4, 0, 4, -2, 0, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2, -3, -3, 0, 0, + -8, 0, -1, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -17, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, -3, 0, -4, + 0, 0, 0, 0, -2, 0, 0, -5, + -3, 3, 0, -5, -5, -2, 0, -8, + -2, -6, -2, -3, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -19, 0, 9, 0, 0, -5, 0, + 0, 0, 0, -4, 0, -3, 0, 0, + -1, 0, 0, -2, 0, -7, 0, 0, + 12, -4, -10, -9, 2, 3, 3, -1, + -8, 2, 4, 2, 9, 2, 10, -2, + -8, 0, 0, -12, 0, 0, -9, -8, + 0, 0, -6, 0, -4, -5, 0, -4, + 0, -4, 0, -2, 4, 0, -2, -9, + -3, 11, 0, 0, -3, 0, -6, 0, + 0, 4, -7, 0, 3, -3, 2, 0, + 0, -10, 0, -2, -1, 0, -3, 3, + -2, 0, 0, 0, -12, -3, -6, 0, + -9, 0, 0, -14, 0, 11, -3, 0, + -5, 0, 2, 0, -3, 0, -3, -9, + 0, -3, 3, 0, 0, 0, 0, -2, + 0, 0, 3, -4, 1, 0, 0, -3, + -2, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -18, 0, 6, 0, + 0, -2, 0, 0, 0, 0, 1, 0, + -3, -3, 0, 0, 0, 6, 0, 7, + 0, 0, 0, 0, 0, -18, -16, 1, + 12, 9, 5, -12, 2, 12, 0, 11, + 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserrat_18 = { +#else +lv_font_t lv_font_montserrat_18 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 21, /*The maximum line height required by the font*/ + .base_line = 4, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_18*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_20.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_20.c new file mode 100644 index 0000000..bf11639 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_20.c @@ -0,0 +1,3226 @@ +/******************************************************************************* + * Size: 20 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 20 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_20.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_20 + #define LV_FONT_MONTSERRAT_20 1 +#endif + +#if LV_FONT_MONTSERRAT_20 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x6f, 0xc6, 0xfc, 0x5f, 0xb4, 0xfa, 0x4f, 0xa3, + 0xf9, 0x3f, 0x92, 0xf8, 0x2f, 0x71, 0xd6, 0x0, + 0x1, 0x94, 0x9f, 0xe4, 0xf9, + + /* U+0022 "\"" */ + 0xbe, 0x1, 0xf8, 0xbe, 0x1, 0xf8, 0xad, 0x1, + 0xf7, 0xad, 0x0, 0xf7, 0xad, 0x0, 0xf7, 0x57, + 0x0, 0x83, + + /* U+0023 "#" */ + 0x0, 0x0, 0x7f, 0x0, 0x4, 0xf2, 0x0, 0x0, + 0x0, 0xac, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x0, + 0xca, 0x0, 0x9, 0xd0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x6, 0x88, 0xfb, 0x88, + 0x8e, 0xc8, 0x84, 0x0, 0x2, 0xf4, 0x0, 0xf, + 0x70, 0x0, 0x0, 0x3, 0xf2, 0x0, 0xf, 0x50, + 0x0, 0x0, 0x5, 0xf1, 0x0, 0x2f, 0x40, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0x4f, 0x20, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x38, 0x8d, + 0xd8, 0x88, 0xcf, 0x88, 0x70, 0x0, 0xd, 0x90, + 0x0, 0xac, 0x0, 0x0, 0x0, 0xf, 0x70, 0x0, + 0xca, 0x0, 0x0, 0x0, 0x1f, 0x50, 0x0, 0xe8, + 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x5, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf0, + 0x0, 0x0, 0x0, 0x7, 0xcf, 0xff, 0xc8, 0x10, + 0x1, 0xdf, 0xfe, 0xfd, 0xff, 0xd0, 0x8, 0xfc, + 0x15, 0xf0, 0x6, 0x60, 0xc, 0xf3, 0x5, 0xf0, + 0x0, 0x0, 0xc, 0xf5, 0x5, 0xf0, 0x0, 0x0, + 0x6, 0xfe, 0x76, 0xf0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf9, 0x40, 0x0, 0x0, 0x2, 0x7c, 0xff, + 0xfe, 0x40, 0x0, 0x0, 0x5, 0xf4, 0xaf, 0xf2, + 0x0, 0x0, 0x5, 0xf0, 0x9, 0xf7, 0x1, 0x0, + 0x5, 0xf0, 0x6, 0xf8, 0xc, 0x92, 0x5, 0xf0, + 0x2d, 0xf4, 0xc, 0xff, 0xed, 0xfd, 0xff, 0xa0, + 0x0, 0x4a, 0xef, 0xff, 0xc6, 0x0, 0x0, 0x0, + 0x5, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x70, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x9e, 0xe9, 0x0, 0x0, 0x0, 0xda, 0x0, + 0x0, 0xad, 0x44, 0xda, 0x0, 0x0, 0x9e, 0x10, + 0x0, 0x1f, 0x40, 0x4, 0xf1, 0x0, 0x4f, 0x40, + 0x0, 0x3, 0xf1, 0x0, 0x1f, 0x30, 0x1e, 0x90, + 0x0, 0x0, 0x2f, 0x30, 0x3, 0xf1, 0xa, 0xd0, + 0x0, 0x0, 0x0, 0xcb, 0x11, 0xbb, 0x5, 0xf3, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xfc, 0x11, 0xe8, + 0x1a, 0xfe, 0x70, 0x0, 0x0, 0x11, 0x0, 0xad, + 0xa, 0xd4, 0x5f, 0x60, 0x0, 0x0, 0x0, 0x5f, + 0x32, 0xf3, 0x0, 0x7e, 0x0, 0x0, 0x0, 0x1f, + 0x70, 0x4f, 0x0, 0x4, 0xf0, 0x0, 0x0, 0xb, + 0xc0, 0x4, 0xf0, 0x0, 0x3f, 0x0, 0x0, 0x6, + 0xf2, 0x0, 0x2f, 0x20, 0x6, 0xe0, 0x0, 0x2, + 0xf7, 0x0, 0x0, 0xbb, 0x23, 0xe6, 0x0, 0x0, + 0xcc, 0x0, 0x0, 0x1, 0xaf, 0xe8, 0x0, + + /* U+0026 "&" */ + 0x0, 0x1, 0x9d, 0xfd, 0x70, 0x0, 0x0, 0x0, + 0xd, 0xf9, 0x7b, 0xf7, 0x0, 0x0, 0x0, 0x4f, + 0x90, 0x0, 0xdc, 0x0, 0x0, 0x0, 0x5f, 0x70, + 0x0, 0xec, 0x0, 0x0, 0x0, 0x1f, 0xe1, 0x1b, + 0xf4, 0x0, 0x0, 0x0, 0x5, 0xfd, 0xef, 0x50, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xc7, 0xfd, 0x20, 0x8, 0x30, + 0x7, 0xf9, 0x0, 0x5f, 0xe2, 0x1f, 0x80, 0xe, + 0xe0, 0x0, 0x5, 0xfe, 0xaf, 0x30, 0xf, 0xd0, + 0x0, 0x0, 0x4f, 0xfc, 0x0, 0xd, 0xf7, 0x0, + 0x0, 0x5e, 0xff, 0x30, 0x4, 0xff, 0xeb, 0xbe, + 0xfe, 0x6f, 0xf2, 0x0, 0x29, 0xdf, 0xfc, 0x70, + 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0027 "'" */ + 0xbe, 0xbe, 0xad, 0xad, 0xad, 0x57, + + /* U+0028 "(" */ + 0x0, 0xe, 0xd0, 0x0, 0x7f, 0x60, 0x0, 0xef, + 0x0, 0x3, 0xfa, 0x0, 0x8, 0xf5, 0x0, 0xb, + 0xf2, 0x0, 0xe, 0xf0, 0x0, 0xf, 0xe0, 0x0, + 0xf, 0xd0, 0x0, 0x1f, 0xc0, 0x0, 0xf, 0xd0, + 0x0, 0xf, 0xe0, 0x0, 0xe, 0xf0, 0x0, 0xb, + 0xf2, 0x0, 0x8, 0xf5, 0x0, 0x3, 0xfa, 0x0, + 0x0, 0xee, 0x0, 0x0, 0x7f, 0x60, 0x0, 0xe, + 0xd0, + + /* U+0029 ")" */ + 0x2f, 0xb0, 0x0, 0xaf, 0x30, 0x3, 0xfa, 0x0, + 0xe, 0xf0, 0x0, 0x9f, 0x40, 0x6, 0xf7, 0x0, + 0x3f, 0xa0, 0x2, 0xfb, 0x0, 0x1f, 0xc0, 0x0, + 0xfd, 0x0, 0x1f, 0xc0, 0x2, 0xfb, 0x0, 0x3f, + 0xa0, 0x6, 0xf7, 0x0, 0x9f, 0x40, 0xe, 0xf0, + 0x3, 0xfa, 0x0, 0xaf, 0x30, 0x2f, 0xb0, 0x0, + + /* U+002A "*" */ + 0x0, 0x9, 0x90, 0x0, 0x26, 0x9, 0x90, 0x62, + 0x5f, 0xcb, 0xbc, 0xf5, 0x2, 0xbf, 0xfb, 0x20, + 0x7, 0xef, 0xfe, 0x70, 0x6f, 0x69, 0x96, 0xf6, + 0x1, 0x9, 0x90, 0x10, 0x0, 0x6, 0x60, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xfa, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf4, 0x6a, 0xaa, + 0xfd, 0xaa, 0xa2, 0x0, 0x0, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xfa, + 0x0, 0x0, + + /* U+002C "," */ + 0x6, 0xa1, 0xf, 0xf8, 0xa, 0xf7, 0x5, 0xf2, + 0x9, 0xc0, 0xd, 0x70, + + /* U+002D "-" */ + 0x9b, 0xbb, 0xb5, 0xdf, 0xff, 0xf8, + + /* U+002E "." */ + 0x7, 0xb2, 0xf, 0xf8, 0xa, 0xe4, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x7, 0x50, 0x0, 0x0, 0x4, + 0xf7, 0x0, 0x0, 0x0, 0xaf, 0x10, 0x0, 0x0, + 0xf, 0xc0, 0x0, 0x0, 0x4, 0xf6, 0x0, 0x0, + 0x0, 0xaf, 0x10, 0x0, 0x0, 0xf, 0xc0, 0x0, + 0x0, 0x5, 0xf6, 0x0, 0x0, 0x0, 0xaf, 0x10, + 0x0, 0x0, 0xf, 0xb0, 0x0, 0x0, 0x5, 0xf6, + 0x0, 0x0, 0x0, 0xaf, 0x10, 0x0, 0x0, 0xf, + 0xb0, 0x0, 0x0, 0x5, 0xf6, 0x0, 0x0, 0x0, + 0xbf, 0x10, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x6, 0xf5, 0x0, 0x0, 0x0, 0xbf, 0x0, 0x0, + 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x6, 0xf5, 0x0, + 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x1, 0x8d, 0xfe, 0xa3, 0x0, 0x0, 0x2, + 0xef, 0xfd, 0xef, 0xf6, 0x0, 0x0, 0xdf, 0xa1, + 0x0, 0x6f, 0xf2, 0x0, 0x6f, 0xc0, 0x0, 0x0, + 0x7f, 0xb0, 0xb, 0xf4, 0x0, 0x0, 0x0, 0xff, + 0x0, 0xef, 0x10, 0x0, 0x0, 0xc, 0xf3, 0xf, + 0xf0, 0x0, 0x0, 0x0, 0xaf, 0x50, 0xff, 0x0, + 0x0, 0x0, 0xa, 0xf5, 0xe, 0xf1, 0x0, 0x0, + 0x0, 0xcf, 0x30, 0xbf, 0x40, 0x0, 0x0, 0xf, + 0xf0, 0x6, 0xfc, 0x0, 0x0, 0x7, 0xfb, 0x0, + 0xd, 0xfa, 0x10, 0x6, 0xff, 0x20, 0x0, 0x2e, + 0xff, 0xdf, 0xff, 0x60, 0x0, 0x0, 0x18, 0xdf, + 0xea, 0x30, 0x0, + + /* U+0031 "1" */ + 0xdf, 0xff, 0xf4, 0xac, 0xce, 0xf4, 0x0, 0xb, + 0xf4, 0x0, 0xb, 0xf4, 0x0, 0xb, 0xf4, 0x0, + 0xb, 0xf4, 0x0, 0xb, 0xf4, 0x0, 0xb, 0xf4, + 0x0, 0xb, 0xf4, 0x0, 0xb, 0xf4, 0x0, 0xb, + 0xf4, 0x0, 0xb, 0xf4, 0x0, 0xb, 0xf4, 0x0, + 0xb, 0xf4, + + /* U+0032 "2" */ + 0x0, 0x6c, 0xef, 0xea, 0x30, 0x2, 0xdf, 0xfe, + 0xdf, 0xff, 0x50, 0x5f, 0x91, 0x0, 0x9, 0xfe, + 0x0, 0x10, 0x0, 0x0, 0xe, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x20, 0x0, 0x0, 0x0, 0x2f, + 0xd0, 0x0, 0x0, 0x0, 0x1d, 0xf5, 0x0, 0x0, + 0x0, 0x1c, 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xf8, + 0x0, 0x0, 0x0, 0x1d, 0xf8, 0x0, 0x0, 0x0, + 0x2e, 0xf7, 0x0, 0x0, 0x0, 0x2e, 0xf6, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xcc, 0xcc, 0xcc, 0x94, + 0xff, 0xff, 0xff, 0xff, 0xfc, + + /* U+0033 "3" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0x3, 0xcc, 0xcc, + 0xcc, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x2f, 0xe2, + 0x0, 0x0, 0x0, 0x1d, 0xf4, 0x0, 0x0, 0x0, + 0xc, 0xf6, 0x0, 0x0, 0x0, 0x9, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfe, 0x80, 0x0, 0x0, + 0x6, 0x68, 0xef, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x50, 0x0, 0x0, 0x0, 0x8, 0xf8, 0x1, + 0x0, 0x0, 0x0, 0xaf, 0x77, 0xe6, 0x10, 0x0, + 0x6f, 0xf2, 0x7f, 0xff, 0xee, 0xff, 0xf6, 0x0, + 0x28, 0xcf, 0xfe, 0xa3, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x7, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0x30, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xfd, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x2e, 0xf2, 0x0, 0x6f, 0x70, + 0x0, 0x0, 0xcf, 0x50, 0x0, 0x6f, 0x70, 0x0, + 0x9, 0xf9, 0x0, 0x0, 0x6f, 0x70, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x2c, 0xcc, + 0xcc, 0xcc, 0xdf, 0xec, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0x70, 0x0, + + /* U+0035 "5" */ + 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xfc, + 0xcc, 0xcc, 0xc0, 0x2, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0x90, 0x0, 0x0, 0x0, 0x6, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xec, 0xca, 0x72, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x2, 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xa0, 0x0, 0x0, 0x0, 0x4, 0xfc, 0x2, + 0x0, 0x0, 0x0, 0x6f, 0xa3, 0xf8, 0x20, 0x0, + 0x5f, 0xf4, 0x4f, 0xff, 0xed, 0xff, 0xf9, 0x0, + 0x17, 0xce, 0xfe, 0xb5, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x5b, 0xef, 0xeb, 0x60, 0x0, 0xb, + 0xff, 0xec, 0xdf, 0xb0, 0x0, 0xaf, 0xb2, 0x0, + 0x1, 0x10, 0x4, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf0, + 0x6c, 0xff, 0xc6, 0x0, 0xf, 0xfa, 0xfd, 0xbc, + 0xff, 0xa0, 0xf, 0xff, 0x60, 0x0, 0x2e, 0xf5, + 0xf, 0xfa, 0x0, 0x0, 0x5, 0xfa, 0xc, 0xf7, + 0x0, 0x0, 0x3, 0xfc, 0x7, 0xfa, 0x0, 0x0, + 0x5, 0xfa, 0x1, 0xef, 0x60, 0x0, 0x2e, 0xf4, + 0x0, 0x4f, 0xfe, 0xbc, 0xff, 0x80, 0x0, 0x1, + 0x9d, 0xfe, 0xb4, 0x0, + + /* U+0037 "7" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x6f, 0xec, + 0xcc, 0xcc, 0xdf, 0xf1, 0x6f, 0x80, 0x0, 0x0, + 0x6f, 0xa0, 0x6f, 0x80, 0x0, 0x0, 0xdf, 0x30, + 0x14, 0x20, 0x0, 0x4, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x60, 0x0, + 0x0, 0x0, 0x2, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xef, 0x20, 0x0, 0x0, 0x0, 0x6, + 0xfb, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x6, 0xce, 0xfe, 0xb5, 0x0, 0x0, 0xcf, + 0xfc, 0xac, 0xff, 0xb0, 0x6, 0xfc, 0x10, 0x0, + 0x2d, 0xf4, 0x9, 0xf6, 0x0, 0x0, 0x8, 0xf7, + 0x6, 0xfb, 0x0, 0x0, 0x1d, 0xf4, 0x0, 0xaf, + 0xea, 0x9a, 0xff, 0x80, 0x0, 0x5e, 0xff, 0xff, + 0xfe, 0x40, 0x6, 0xfe, 0x61, 0x2, 0x7f, 0xf4, + 0xe, 0xf3, 0x0, 0x0, 0x5, 0xfc, 0x1f, 0xe0, + 0x0, 0x0, 0x0, 0xff, 0xf, 0xf1, 0x0, 0x0, + 0x3, 0xfe, 0xa, 0xfb, 0x10, 0x0, 0x2d, 0xf8, + 0x1, 0xdf, 0xfc, 0xbc, 0xff, 0xc0, 0x0, 0x7, + 0xce, 0xfe, 0xb6, 0x0, + + /* U+0039 "9" */ + 0x0, 0x3a, 0xef, 0xeb, 0x40, 0x0, 0x6, 0xff, + 0xda, 0xcf, 0xf8, 0x0, 0x1f, 0xf4, 0x0, 0x1, + 0xcf, 0x50, 0x5f, 0x90, 0x0, 0x0, 0x2f, 0xd0, + 0x6f, 0x90, 0x0, 0x0, 0x3f, 0xf1, 0x2f, 0xf4, + 0x0, 0x1, 0xcf, 0xf4, 0x8, 0xff, 0xda, 0xbf, + 0xec, 0xf5, 0x0, 0x4b, 0xef, 0xd9, 0x1a, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0x90, 0x0, 0x40, 0x0, 0x1a, 0xfe, 0x10, + 0x6, 0xfe, 0xdd, 0xff, 0xe3, 0x0, 0x3, 0xad, + 0xfe, 0xc7, 0x10, 0x0, + + /* U+003A ":" */ + 0xa, 0xe4, 0xf, 0xf8, 0x7, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xb2, 0xf, 0xf8, 0xa, 0xe4, + + /* U+003B ";" */ + 0xa, 0xe4, 0xf, 0xf8, 0x7, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xa1, 0xf, 0xf8, 0xa, 0xf7, 0x5, 0xf2, + 0x9, 0xc0, 0xd, 0x70, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x63, 0x0, 0x0, 0x2, + 0x9f, 0xf4, 0x0, 0x5, 0xcf, 0xfb, 0x40, 0x28, + 0xef, 0xe8, 0x10, 0x0, 0xaf, 0xc4, 0x0, 0x0, + 0x0, 0x8f, 0xfa, 0x40, 0x0, 0x0, 0x2, 0x9e, + 0xfd, 0x71, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x39, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x1, + + /* U+003D "=" */ + 0xaf, 0xff, 0xff, 0xff, 0xf4, 0x6a, 0xaa, 0xaa, + 0xaa, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf4, 0x6a, 0xaa, + 0xaa, 0xaa, 0xa2, + + /* U+003E ">" */ + 0x63, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd6, 0x10, + 0x0, 0x0, 0x17, 0xdf, 0xf9, 0x30, 0x0, 0x0, + 0x3, 0xaf, 0xfc, 0x60, 0x0, 0x0, 0x1, 0x6e, + 0xf4, 0x0, 0x0, 0x6, 0xcf, 0xf3, 0x0, 0x39, + 0xff, 0xd6, 0x0, 0x5d, 0xff, 0xa3, 0x0, 0x0, + 0xad, 0x71, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x7c, 0xef, 0xda, 0x30, 0x2, 0xef, 0xfc, + 0xce, 0xff, 0x60, 0x6f, 0x80, 0x0, 0x8, 0xfe, + 0x0, 0x10, 0x0, 0x0, 0xf, 0xf1, 0x0, 0x0, + 0x0, 0x1, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0x60, 0x0, 0x0, 0x1, 0xcf, 0x80, 0x0, 0x0, + 0x0, 0xcf, 0x80, 0x0, 0x0, 0x0, 0x4f, 0xc0, + 0x0, 0x0, 0x0, 0x3, 0x74, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x93, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xc0, 0x0, 0x0, + 0x0, 0x6, 0xf8, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x49, 0xdf, 0xfe, 0xc9, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfd, 0x97, 0x67, + 0x9e, 0xfb, 0x10, 0x0, 0x0, 0x5, 0xfd, 0x30, + 0x0, 0x0, 0x0, 0x4d, 0xe3, 0x0, 0x0, 0x3f, + 0xa0, 0x0, 0x58, 0x85, 0x3, 0x94, 0xbe, 0x10, + 0x0, 0xec, 0x0, 0x2d, 0xff, 0xff, 0xd7, 0xf5, + 0x1d, 0xb0, 0x6, 0xf3, 0x1, 0xef, 0x71, 0x4, + 0xdf, 0xf5, 0x5, 0xf2, 0xb, 0xd0, 0x8, 0xf7, + 0x0, 0x0, 0x1e, 0xf5, 0x0, 0xe7, 0xe, 0x90, + 0xc, 0xf0, 0x0, 0x0, 0x8, 0xf5, 0x0, 0xca, + 0xf, 0x70, 0xe, 0xe0, 0x0, 0x0, 0x6, 0xf5, + 0x0, 0xab, 0xf, 0x70, 0xd, 0xf0, 0x0, 0x0, + 0x6, 0xf5, 0x0, 0xba, 0xe, 0x90, 0xa, 0xf3, + 0x0, 0x0, 0xb, 0xf5, 0x0, 0xd8, 0xb, 0xd0, + 0x3, 0xfd, 0x10, 0x0, 0x7f, 0xf7, 0x3, 0xf4, + 0x6, 0xf3, 0x0, 0x7f, 0xfa, 0x9d, 0xf7, 0xfe, + 0xae, 0xc0, 0x0, 0xec, 0x0, 0x4, 0xcf, 0xfb, + 0x40, 0x5e, 0xfa, 0x10, 0x0, 0x3f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3d, 0xfd, 0x97, 0x68, 0xaf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfd, + 0xb7, 0x10, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0xe, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xaf, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xfa, 0x1f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xf3, 0xa, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xc0, 0x3, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0x50, 0x0, 0xcf, 0x30, 0x0, + 0x0, 0x1, 0xfe, 0x0, 0x0, 0x5f, 0xb0, 0x0, + 0x0, 0x8, 0xf7, 0x0, 0x0, 0xe, 0xf2, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x6f, 0xda, 0xaa, 0xaa, 0xaa, 0xff, 0x10, + 0x0, 0xdf, 0x30, 0x0, 0x0, 0x0, 0x9f, 0x80, + 0x5, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xe0, + 0xc, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf6, + + /* U+0042 "B" */ + 0xef, 0xff, 0xff, 0xfe, 0xb5, 0x0, 0xe, 0xfb, + 0xaa, 0xab, 0xdf, 0xfa, 0x0, 0xef, 0x10, 0x0, + 0x0, 0x4f, 0xf3, 0xe, 0xf1, 0x0, 0x0, 0x0, + 0xaf, 0x60, 0xef, 0x10, 0x0, 0x0, 0xc, 0xf4, + 0xe, 0xf1, 0x0, 0x0, 0x29, 0xfc, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0xe, 0xfb, 0xaa, + 0xaa, 0xce, 0xfd, 0x10, 0xef, 0x10, 0x0, 0x0, + 0x8, 0xfb, 0xe, 0xf1, 0x0, 0x0, 0x0, 0xf, + 0xf0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xff, 0x1e, + 0xf1, 0x0, 0x0, 0x0, 0x8f, 0xe0, 0xef, 0xba, + 0xaa, 0xab, 0xef, 0xf4, 0xe, 0xff, 0xff, 0xff, + 0xfd, 0x92, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x17, 0xce, 0xfe, 0xb5, 0x0, 0x0, + 0x5, 0xef, 0xff, 0xde, 0xff, 0xc1, 0x0, 0x5f, + 0xf9, 0x20, 0x0, 0x3b, 0xf5, 0x2, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x30, 0x8, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x30, 0x0, 0x5f, 0xfa, + 0x30, 0x0, 0x3b, 0xf5, 0x0, 0x5, 0xef, 0xff, + 0xdf, 0xff, 0xc1, 0x0, 0x0, 0x17, 0xce, 0xfe, + 0xb5, 0x0, + + /* U+0044 "D" */ + 0xef, 0xff, 0xff, 0xfd, 0xa4, 0x0, 0x0, 0xef, + 0xdc, 0xcc, 0xdf, 0xff, 0xb1, 0x0, 0xef, 0x10, + 0x0, 0x0, 0x5d, 0xfd, 0x0, 0xef, 0x10, 0x0, + 0x0, 0x0, 0xcf, 0xa0, 0xef, 0x10, 0x0, 0x0, + 0x0, 0x1f, 0xf1, 0xef, 0x10, 0x0, 0x0, 0x0, + 0xa, 0xf6, 0xef, 0x10, 0x0, 0x0, 0x0, 0x8, + 0xf8, 0xef, 0x10, 0x0, 0x0, 0x0, 0x7, 0xf8, + 0xef, 0x10, 0x0, 0x0, 0x0, 0xa, 0xf6, 0xef, + 0x10, 0x0, 0x0, 0x0, 0x1f, 0xf1, 0xef, 0x10, + 0x0, 0x0, 0x0, 0xbf, 0xa0, 0xef, 0x10, 0x0, + 0x0, 0x5d, 0xfd, 0x10, 0xef, 0xcc, 0xcc, 0xdf, + 0xff, 0xb1, 0x0, 0xef, 0xff, 0xff, 0xfd, 0xa4, + 0x0, 0x0, + + /* U+0045 "E" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xe, 0xfd, 0xcc, + 0xcc, 0xcc, 0xc0, 0xef, 0x10, 0x0, 0x0, 0x0, + 0xe, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xef, 0x10, + 0x0, 0x0, 0x0, 0xe, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xf2, 0xe, 0xfc, + 0xcc, 0xcc, 0xcc, 0x10, 0xef, 0x10, 0x0, 0x0, + 0x0, 0xe, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x10, 0x0, 0x0, 0x0, 0xe, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xcc, 0xcc, 0xcc, 0xcc, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xf4, + + /* U+0046 "F" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xef, 0xdc, 0xcc, + 0xcc, 0xcc, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, + 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, + 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, 0xcc, + 0xcc, 0xcc, 0xc1, 0xef, 0xff, 0xff, 0xff, 0xf2, + 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, + 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, + 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, + 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x16, 0xce, 0xfe, 0xb6, 0x0, 0x0, + 0x5, 0xef, 0xff, 0xde, 0xff, 0xd2, 0x0, 0x5f, + 0xf9, 0x20, 0x0, 0x29, 0xf7, 0x2, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x20, 0x8, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x11, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x3, 0xfb, + 0xd, 0xf3, 0x0, 0x0, 0x0, 0x3, 0xfb, 0x8, + 0xfa, 0x0, 0x0, 0x0, 0x3, 0xfb, 0x1, 0xff, + 0x60, 0x0, 0x0, 0x3, 0xfb, 0x0, 0x5f, 0xfa, + 0x30, 0x0, 0x2a, 0xfb, 0x0, 0x4, 0xef, 0xff, + 0xdf, 0xff, 0xe4, 0x0, 0x0, 0x17, 0xce, 0xfe, + 0xb6, 0x0, + + /* U+0048 "H" */ + 0xef, 0x10, 0x0, 0x0, 0x0, 0xdf, 0x2e, 0xf1, + 0x0, 0x0, 0x0, 0xd, 0xf2, 0xef, 0x10, 0x0, + 0x0, 0x0, 0xdf, 0x2e, 0xf1, 0x0, 0x0, 0x0, + 0xd, 0xf2, 0xef, 0x10, 0x0, 0x0, 0x0, 0xdf, + 0x2e, 0xf1, 0x0, 0x0, 0x0, 0xd, 0xf2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x2e, 0xfd, 0xcc, + 0xcc, 0xcc, 0xcf, 0xf2, 0xef, 0x10, 0x0, 0x0, + 0x0, 0xdf, 0x2e, 0xf1, 0x0, 0x0, 0x0, 0xd, + 0xf2, 0xef, 0x10, 0x0, 0x0, 0x0, 0xdf, 0x2e, + 0xf1, 0x0, 0x0, 0x0, 0xd, 0xf2, 0xef, 0x10, + 0x0, 0x0, 0x0, 0xdf, 0x2e, 0xf1, 0x0, 0x0, + 0x0, 0xd, 0xf2, + + /* U+0049 "I" */ + 0xef, 0x1e, 0xf1, 0xef, 0x1e, 0xf1, 0xef, 0x1e, + 0xf1, 0xef, 0x1e, 0xf1, 0xef, 0x1e, 0xf1, 0xef, + 0x1e, 0xf1, 0xef, 0x1e, 0xf1, + + /* U+004A "J" */ + 0x0, 0xcf, 0xff, 0xff, 0xf4, 0x0, 0x9c, 0xcc, + 0xcf, 0xf4, 0x0, 0x0, 0x0, 0xb, 0xf4, 0x0, + 0x0, 0x0, 0xb, 0xf4, 0x0, 0x0, 0x0, 0xb, + 0xf4, 0x0, 0x0, 0x0, 0xb, 0xf4, 0x0, 0x0, + 0x0, 0xb, 0xf4, 0x0, 0x0, 0x0, 0xb, 0xf4, + 0x0, 0x0, 0x0, 0xb, 0xf4, 0x0, 0x0, 0x0, + 0xb, 0xf4, 0x1, 0x0, 0x0, 0xd, 0xf2, 0xc, + 0xc2, 0x0, 0x6f, 0xe0, 0xa, 0xff, 0xde, 0xff, + 0x60, 0x0, 0x6c, 0xff, 0xc5, 0x0, + + /* U+004B "K" */ + 0xef, 0x10, 0x0, 0x0, 0xb, 0xf8, 0xe, 0xf1, + 0x0, 0x0, 0xb, 0xf8, 0x0, 0xef, 0x10, 0x0, + 0xb, 0xf9, 0x0, 0xe, 0xf1, 0x0, 0xb, 0xfa, + 0x0, 0x0, 0xef, 0x10, 0xa, 0xfb, 0x0, 0x0, + 0xe, 0xf1, 0xa, 0xfb, 0x0, 0x0, 0x0, 0xef, + 0x19, 0xff, 0x30, 0x0, 0x0, 0xe, 0xfa, 0xfe, + 0xfe, 0x10, 0x0, 0x0, 0xef, 0xfd, 0x1a, 0xfc, + 0x0, 0x0, 0xe, 0xfd, 0x10, 0xc, 0xfa, 0x0, + 0x0, 0xef, 0x20, 0x0, 0x1e, 0xf7, 0x0, 0xe, + 0xf1, 0x0, 0x0, 0x2f, 0xf4, 0x0, 0xef, 0x10, + 0x0, 0x0, 0x4f, 0xf2, 0xe, 0xf1, 0x0, 0x0, + 0x0, 0x6f, 0xd1, + + /* U+004C "L" */ + 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, + 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, + 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, + 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, + 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, + 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, + 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, + 0x10, 0x0, 0x0, 0x0, 0xef, 0xcc, 0xcc, 0xcc, + 0xc8, 0xef, 0xff, 0xff, 0xff, 0xfb, + + /* U+004D "M" */ + 0xef, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfe, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xef, + 0xf3, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xef, 0x9f, + 0x60, 0x0, 0x0, 0x4f, 0xaf, 0xfe, 0xf1, 0xee, + 0x10, 0x0, 0xd, 0xf1, 0xff, 0xef, 0x6, 0xf9, + 0x0, 0x7, 0xf7, 0xe, 0xfe, 0xf0, 0xc, 0xf3, + 0x1, 0xfd, 0x0, 0xef, 0xef, 0x0, 0x3f, 0xc0, + 0xaf, 0x40, 0xe, 0xfe, 0xf0, 0x0, 0x9f, 0x9f, + 0xa0, 0x0, 0xef, 0xef, 0x0, 0x1, 0xef, 0xf1, + 0x0, 0xe, 0xfe, 0xf0, 0x0, 0x6, 0xf7, 0x0, + 0x0, 0xef, 0xef, 0x0, 0x0, 0x4, 0x0, 0x0, + 0xe, 0xfe, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, + + /* U+004E "N" */ + 0xef, 0x20, 0x0, 0x0, 0x0, 0xdf, 0x2e, 0xfd, + 0x10, 0x0, 0x0, 0xd, 0xf2, 0xef, 0xfb, 0x0, + 0x0, 0x0, 0xdf, 0x2e, 0xfe, 0xf8, 0x0, 0x0, + 0xd, 0xf2, 0xef, 0x4f, 0xf5, 0x0, 0x0, 0xdf, + 0x2e, 0xf1, 0x5f, 0xf3, 0x0, 0xd, 0xf2, 0xef, + 0x10, 0x8f, 0xe1, 0x0, 0xdf, 0x2e, 0xf1, 0x0, + 0xbf, 0xc0, 0xd, 0xf2, 0xef, 0x10, 0x1, 0xdf, + 0x90, 0xdf, 0x2e, 0xf1, 0x0, 0x2, 0xff, 0x6d, + 0xf2, 0xef, 0x10, 0x0, 0x5, 0xff, 0xff, 0x2e, + 0xf1, 0x0, 0x0, 0x8, 0xff, 0xf2, 0xef, 0x10, + 0x0, 0x0, 0xb, 0xff, 0x2e, 0xf1, 0x0, 0x0, + 0x0, 0xd, 0xf2, + + /* U+004F "O" */ + 0x0, 0x0, 0x16, 0xce, 0xfe, 0xb5, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xfe, 0xdf, 0xff, 0xd3, 0x0, + 0x0, 0x5f, 0xf9, 0x20, 0x0, 0x3b, 0xff, 0x20, + 0x1, 0xff, 0x60, 0x0, 0x0, 0x0, 0x9f, 0xd0, + 0x8, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf5, + 0xd, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfa, + 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xfc, + 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xfc, + 0xd, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfa, + 0x8, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf5, + 0x1, 0xff, 0x60, 0x0, 0x0, 0x0, 0x9f, 0xd0, + 0x0, 0x5f, 0xfa, 0x20, 0x0, 0x3b, 0xff, 0x20, + 0x0, 0x4, 0xef, 0xff, 0xdf, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x17, 0xce, 0xfe, 0xb5, 0x0, 0x0, + + /* U+0050 "P" */ + 0xef, 0xff, 0xff, 0xec, 0x70, 0x0, 0xef, 0xdc, + 0xcd, 0xef, 0xfd, 0x20, 0xef, 0x10, 0x0, 0x2, + 0xbf, 0xc0, 0xef, 0x10, 0x0, 0x0, 0xe, 0xf3, + 0xef, 0x10, 0x0, 0x0, 0xa, 0xf5, 0xef, 0x10, + 0x0, 0x0, 0xb, 0xf5, 0xef, 0x10, 0x0, 0x0, + 0x2f, 0xf2, 0xef, 0x10, 0x0, 0x15, 0xdf, 0xa0, + 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xef, 0xcc, + 0xcc, 0xb9, 0x40, 0x0, 0xef, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xef, 0x10, 0x0, 0x0, 0x0, 0x0, 0xef, 0x10, + 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x16, 0xce, 0xfe, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xfd, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x5f, 0xfa, 0x20, 0x0, 0x4b, 0xff, + 0x20, 0x0, 0x1f, 0xf6, 0x0, 0x0, 0x0, 0x9, + 0xfd, 0x0, 0x8, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xf5, 0x0, 0xdf, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xa0, 0xf, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xfc, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xc0, 0xd, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xfa, 0x0, 0x9f, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0x50, 0x2, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x8f, 0xd0, 0x0, 0x6, 0xff, + 0x92, 0x0, 0x3, 0xbf, 0xf3, 0x0, 0x0, 0x6, + 0xff, 0xfe, 0xce, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x2, 0x8d, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xe2, 0x0, 0x1a, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0xbf, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xef, 0xb3, + 0x0, + + /* U+0052 "R" */ + 0xef, 0xff, 0xff, 0xec, 0x70, 0x0, 0xef, 0xdc, + 0xcd, 0xef, 0xfd, 0x20, 0xef, 0x10, 0x0, 0x2, + 0xbf, 0xc0, 0xef, 0x10, 0x0, 0x0, 0xe, 0xf3, + 0xef, 0x10, 0x0, 0x0, 0xa, 0xf5, 0xef, 0x10, + 0x0, 0x0, 0xb, 0xf5, 0xef, 0x10, 0x0, 0x0, + 0x2f, 0xf2, 0xef, 0x10, 0x0, 0x15, 0xdf, 0xa0, + 0xef, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xef, 0xcc, + 0xcb, 0xdf, 0x90, 0x0, 0xef, 0x10, 0x0, 0x1e, + 0xf2, 0x0, 0xef, 0x10, 0x0, 0x4, 0xfd, 0x0, + 0xef, 0x10, 0x0, 0x0, 0x9f, 0x90, 0xef, 0x10, + 0x0, 0x0, 0xd, 0xf4, + + /* U+0053 "S" */ + 0x0, 0x6, 0xce, 0xfe, 0xc7, 0x10, 0x0, 0xcf, + 0xfd, 0xcd, 0xff, 0xd0, 0x8, 0xfc, 0x20, 0x0, + 0x17, 0x60, 0xc, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x71, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd9, + 0x40, 0x0, 0x0, 0x1, 0x6a, 0xef, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xf7, 0x1, 0x0, 0x0, 0x0, + 0x7, 0xf8, 0xd, 0xb3, 0x0, 0x0, 0x3e, 0xf4, + 0xa, 0xff, 0xfc, 0xce, 0xff, 0x90, 0x0, 0x39, + 0xdf, 0xfe, 0xa4, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xbc, 0xcc, + 0xdf, 0xfc, 0xcc, 0xc8, 0x0, 0x0, 0x2f, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xd0, 0x0, 0x0, + + /* U+0055 "U" */ + 0xf, 0xf0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0xff, + 0x0, 0x0, 0x0, 0x2, 0xfd, 0xf, 0xf0, 0x0, + 0x0, 0x0, 0x2f, 0xd0, 0xff, 0x0, 0x0, 0x0, + 0x2, 0xfd, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x2f, + 0xd0, 0xff, 0x0, 0x0, 0x0, 0x2, 0xfd, 0xf, + 0xf0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0xff, 0x0, + 0x0, 0x0, 0x2, 0xfc, 0xf, 0xf0, 0x0, 0x0, + 0x0, 0x2f, 0xc0, 0xdf, 0x30, 0x0, 0x0, 0x5, + 0xfa, 0x9, 0xf9, 0x0, 0x0, 0x0, 0xcf, 0x60, + 0x2f, 0xf8, 0x0, 0x1, 0xaf, 0xe0, 0x0, 0x5f, + 0xff, 0xde, 0xff, 0xe3, 0x0, 0x0, 0x29, 0xdf, + 0xfd, 0x81, 0x0, + + /* U+0056 "V" */ + 0xc, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf1, + 0x5, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x6f, 0x90, + 0x0, 0xef, 0x30, 0x0, 0x0, 0x0, 0xdf, 0x20, + 0x0, 0x7f, 0xa0, 0x0, 0x0, 0x4, 0xfb, 0x0, + 0x0, 0x1f, 0xf2, 0x0, 0x0, 0xb, 0xf4, 0x0, + 0x0, 0x9, 0xf8, 0x0, 0x0, 0x2f, 0xd0, 0x0, + 0x0, 0x2, 0xff, 0x0, 0x0, 0x9f, 0x60, 0x0, + 0x0, 0x0, 0xbf, 0x60, 0x1, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xd0, 0x7, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf4, 0xe, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xfb, 0x5f, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xef, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf5, 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0x3f, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0x60, 0x0, + 0x0, 0x2, 0xfb, 0xd, 0xf3, 0x0, 0x0, 0x1, + 0xff, 0xc0, 0x0, 0x0, 0x8, 0xf5, 0x8, 0xf8, + 0x0, 0x0, 0x7, 0xff, 0xf1, 0x0, 0x0, 0xd, + 0xf1, 0x3, 0xfd, 0x0, 0x0, 0xc, 0xf8, 0xf7, + 0x0, 0x0, 0x3f, 0xb0, 0x0, 0xdf, 0x30, 0x0, + 0x2f, 0xb2, 0xfc, 0x0, 0x0, 0x8f, 0x50, 0x0, + 0x8f, 0x80, 0x0, 0x7f, 0x50, 0xcf, 0x10, 0x0, + 0xdf, 0x0, 0x0, 0x3f, 0xd0, 0x0, 0xdf, 0x0, + 0x7f, 0x70, 0x3, 0xfb, 0x0, 0x0, 0xd, 0xf3, + 0x2, 0xfa, 0x0, 0x2f, 0xc0, 0x8, 0xf5, 0x0, + 0x0, 0x8, 0xf8, 0x8, 0xf5, 0x0, 0xc, 0xf2, + 0xe, 0xf0, 0x0, 0x0, 0x3, 0xfd, 0xd, 0xf0, + 0x0, 0x7, 0xf7, 0x3f, 0xb0, 0x0, 0x0, 0x0, + 0xdf, 0x6f, 0xa0, 0x0, 0x1, 0xfc, 0x8f, 0x50, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, + 0xcf, 0xef, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xf9, 0x0, 0x0, 0x0, 0x1f, 0xf5, + 0x0, 0x0, + + /* U+0058 "X" */ + 0x1f, 0xf3, 0x0, 0x0, 0x0, 0xbf, 0x70, 0x5, + 0xfe, 0x10, 0x0, 0x6, 0xfb, 0x0, 0x0, 0x9f, + 0xa0, 0x0, 0x2f, 0xe1, 0x0, 0x0, 0xd, 0xf6, + 0x0, 0xdf, 0x40, 0x0, 0x0, 0x3, 0xff, 0x29, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xef, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x9f, 0xf3, 0x0, 0x0, 0x0, + 0x7, 0xfc, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x3f, + 0xf2, 0x0, 0xaf, 0xa0, 0x0, 0x0, 0xdf, 0x50, + 0x0, 0xd, 0xf5, 0x0, 0xa, 0xfa, 0x0, 0x0, + 0x3, 0xff, 0x20, 0x5f, 0xd0, 0x0, 0x0, 0x0, + 0x7f, 0xc0, + + /* U+0059 "Y" */ + 0xc, 0xf5, 0x0, 0x0, 0x0, 0x4, 0xfb, 0x0, + 0x2f, 0xe1, 0x0, 0x0, 0x0, 0xdf, 0x20, 0x0, + 0x8f, 0x90, 0x0, 0x0, 0x7f, 0x70, 0x0, 0x0, + 0xef, 0x30, 0x0, 0x2f, 0xd0, 0x0, 0x0, 0x5, + 0xfc, 0x0, 0xb, 0xf4, 0x0, 0x0, 0x0, 0xb, + 0xf6, 0x5, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xe1, 0xef, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xef, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xf7, 0x0, 0x0, + 0x0, + + /* U+005A "Z" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xcc, + 0xcc, 0xcc, 0xcc, 0xef, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1, + 0xef, 0x50, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xfe, + 0xcc, 0xcc, 0xcc, 0xcc, 0x72, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, + + /* U+005B "[" */ + 0xef, 0xff, 0x4e, 0xfa, 0xa2, 0xef, 0x0, 0xe, + 0xf0, 0x0, 0xef, 0x0, 0xe, 0xf0, 0x0, 0xef, + 0x0, 0xe, 0xf0, 0x0, 0xef, 0x0, 0xe, 0xf0, + 0x0, 0xef, 0x0, 0xe, 0xf0, 0x0, 0xef, 0x0, + 0xe, 0xf0, 0x0, 0xef, 0x0, 0xe, 0xf0, 0x0, + 0xef, 0x0, 0xe, 0xfa, 0xa2, 0xef, 0xff, 0x40, + + /* U+005C "\\" */ + 0x57, 0x0, 0x0, 0x0, 0x6, 0xf5, 0x0, 0x0, + 0x0, 0x1f, 0xa0, 0x0, 0x0, 0x0, 0xcf, 0x0, + 0x0, 0x0, 0x6, 0xf5, 0x0, 0x0, 0x0, 0x1f, + 0xa0, 0x0, 0x0, 0x0, 0xbf, 0x0, 0x0, 0x0, + 0x6, 0xf5, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x6, 0xf5, + 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, + 0xbf, 0x10, 0x0, 0x0, 0x5, 0xf6, 0x0, 0x0, + 0x0, 0xf, 0xb0, 0x0, 0x0, 0x0, 0xaf, 0x10, + 0x0, 0x0, 0x5, 0xf6, 0x0, 0x0, 0x0, 0xf, + 0xb0, 0x0, 0x0, 0x0, 0xaf, 0x10, 0x0, 0x0, + 0x5, 0xf6, + + /* U+005D "]" */ + 0xaf, 0xff, 0x96, 0xac, 0xf9, 0x0, 0x5f, 0x90, + 0x5, 0xf9, 0x0, 0x5f, 0x90, 0x5, 0xf9, 0x0, + 0x5f, 0x90, 0x5, 0xf9, 0x0, 0x5f, 0x90, 0x5, + 0xf9, 0x0, 0x5f, 0x90, 0x5, 0xf9, 0x0, 0x5f, + 0x90, 0x5, 0xf9, 0x0, 0x5f, 0x90, 0x5, 0xf9, + 0x0, 0x5f, 0x96, 0xac, 0xf9, 0xaf, 0xff, 0x90, + + /* U+005E "^" */ + 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x10, 0x0, 0x0, 0xc, 0xbf, 0x70, 0x0, 0x0, + 0x3f, 0x49, 0xd0, 0x0, 0x0, 0x9d, 0x3, 0xf4, + 0x0, 0x1, 0xf7, 0x0, 0xcb, 0x0, 0x7, 0xf1, + 0x0, 0x6f, 0x20, 0xd, 0xa0, 0x0, 0xf, 0x80, + 0x4f, 0x30, 0x0, 0x9, 0xe0, + + /* U+005F "_" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x33, 0x33, 0x33, 0x33, 0x33, + + /* U+0060 "`" */ + 0x27, 0x70, 0x0, 0x5, 0xfc, 0x10, 0x0, 0x2d, + 0xd1, + + /* U+0061 "a" */ + 0x5, 0xbe, 0xfe, 0xb4, 0x0, 0x7f, 0xfd, 0xbd, + 0xff, 0x50, 0x2a, 0x10, 0x0, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0xd, 0xf2, 0x0, 0x1, 0x11, 0x1c, + 0xf3, 0x8, 0xef, 0xff, 0xff, 0xf3, 0x9f, 0xc6, + 0x44, 0x4c, 0xf3, 0xff, 0x0, 0x0, 0xb, 0xf3, + 0xef, 0x10, 0x0, 0x3f, 0xf3, 0x8f, 0xd7, 0x69, + 0xfe, 0xf3, 0x6, 0xcf, 0xfc, 0x59, 0xf3, + + /* U+0062 "b" */ + 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xb1, 0x9e, 0xfd, 0x92, 0x0, 0x3f, 0xde, + 0xfd, 0xce, 0xfe, 0x40, 0x3f, 0xfe, 0x30, 0x0, + 0x8f, 0xe1, 0x3f, 0xf3, 0x0, 0x0, 0xa, 0xf7, + 0x3f, 0xd0, 0x0, 0x0, 0x4, 0xfa, 0x3f, 0xb0, + 0x0, 0x0, 0x2, 0xfc, 0x3f, 0xd0, 0x0, 0x0, + 0x4, 0xfa, 0x3f, 0xf3, 0x0, 0x0, 0xa, 0xf7, + 0x3f, 0xfe, 0x30, 0x0, 0x8f, 0xe1, 0x3f, 0xce, + 0xfd, 0xce, 0xff, 0x40, 0x3f, 0xa1, 0x9e, 0xfe, + 0x92, 0x0, + + /* U+0063 "c" */ + 0x0, 0x3, 0xae, 0xfe, 0x91, 0x0, 0x7, 0xff, + 0xdc, 0xef, 0xe2, 0x4, 0xfe, 0x40, 0x0, 0x7f, + 0x60, 0xcf, 0x40, 0x0, 0x0, 0x10, 0xf, 0xe0, + 0x0, 0x0, 0x0, 0x2, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0x40, 0x0, 0x0, 0x10, 0x4, 0xfe, 0x40, 0x0, + 0x7f, 0x60, 0x7, 0xff, 0xdc, 0xef, 0xe2, 0x0, + 0x3, 0xae, 0xfe, 0x91, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1, 0xfd, + 0x0, 0x4, 0xbe, 0xfc, 0x61, 0xfd, 0x0, 0x8f, + 0xfd, 0xce, 0xfb, 0xfd, 0x5, 0xfe, 0x40, 0x0, + 0x7f, 0xfd, 0xc, 0xf5, 0x0, 0x0, 0x9, 0xfd, + 0xf, 0xe0, 0x0, 0x0, 0x3, 0xfd, 0x2f, 0xc0, + 0x0, 0x0, 0x1, 0xfd, 0xf, 0xe0, 0x0, 0x0, + 0x3, 0xfd, 0xc, 0xf4, 0x0, 0x0, 0x8, 0xfd, + 0x5, 0xfe, 0x20, 0x0, 0x5f, 0xfd, 0x0, 0x8f, + 0xfb, 0xad, 0xfb, 0xfd, 0x0, 0x4, 0xbe, 0xfd, + 0x70, 0xfd, + + /* U+0065 "e" */ + 0x0, 0x4, 0xbe, 0xfc, 0x60, 0x0, 0x0, 0x8f, + 0xfc, 0xbe, 0xfc, 0x0, 0x5, 0xfd, 0x20, 0x0, + 0xaf, 0x80, 0xc, 0xf3, 0x0, 0x0, 0xd, 0xf0, + 0xf, 0xe1, 0x11, 0x11, 0x19, 0xf4, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xf, 0xe4, 0x44, 0x44, + 0x44, 0x41, 0xc, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xfe, 0x40, 0x0, 0x2b, 0x20, 0x0, 0x7f, + 0xfe, 0xcd, 0xff, 0x60, 0x0, 0x3, 0xae, 0xfe, + 0xa3, 0x0, + + /* U+0066 "f" */ + 0x0, 0x6, 0xdf, 0xd6, 0x0, 0x6f, 0xea, 0xc6, + 0x0, 0xcf, 0x20, 0x0, 0x0, 0xef, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf1, 0x7a, 0xff, 0xaa, 0xa0, + 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x4, 0xbe, 0xfd, 0x70, 0xdf, 0x0, 0x8f, + 0xfd, 0xce, 0xfc, 0xef, 0x5, 0xfe, 0x40, 0x0, + 0x5f, 0xff, 0xc, 0xf4, 0x0, 0x0, 0x6, 0xff, + 0xf, 0xe0, 0x0, 0x0, 0x0, 0xff, 0x2f, 0xc0, + 0x0, 0x0, 0x0, 0xff, 0xf, 0xe0, 0x0, 0x0, + 0x1, 0xff, 0xc, 0xf5, 0x0, 0x0, 0x7, 0xff, + 0x5, 0xfe, 0x40, 0x0, 0x5f, 0xff, 0x0, 0x8f, + 0xfd, 0xbe, 0xfc, 0xff, 0x0, 0x4, 0xbe, 0xfd, + 0x71, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3, 0xfb, + 0x1, 0xa4, 0x0, 0x0, 0x2d, 0xf5, 0x4, 0xff, + 0xfc, 0xbd, 0xff, 0xa0, 0x0, 0x28, 0xce, 0xfe, + 0xb5, 0x0, + + /* U+0068 "h" */ + 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x3, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, 0x0, + 0x3, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb1, + 0x9e, 0xfe, 0x91, 0x3, 0xfd, 0xef, 0xdd, 0xff, + 0xd0, 0x3f, 0xfd, 0x20, 0x2, 0xdf, 0x73, 0xff, + 0x20, 0x0, 0x4, 0xfc, 0x3f, 0xd0, 0x0, 0x0, + 0x1f, 0xd3, 0xfb, 0x0, 0x0, 0x0, 0xfe, 0x3f, + 0xb0, 0x0, 0x0, 0xf, 0xe3, 0xfb, 0x0, 0x0, + 0x0, 0xfe, 0x3f, 0xb0, 0x0, 0x0, 0xf, 0xe3, + 0xfb, 0x0, 0x0, 0x0, 0xfe, 0x3f, 0xb0, 0x0, + 0x0, 0xf, 0xe0, + + /* U+0069 "i" */ + 0x3e, 0xb0, 0x7f, 0xf0, 0x8, 0x40, 0x0, 0x0, + 0x3f, 0xb0, 0x3f, 0xb0, 0x3f, 0xb0, 0x3f, 0xb0, + 0x3f, 0xb0, 0x3f, 0xb0, 0x3f, 0xb0, 0x3f, 0xb0, + 0x3f, 0xb0, 0x3f, 0xb0, 0x3f, 0xb0, + + /* U+006A "j" */ + 0x0, 0x2, 0xec, 0x0, 0x0, 0x5f, 0xf1, 0x0, + 0x0, 0x75, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xfd, 0x0, 0x0, 0x1f, 0xd0, 0x0, 0x1, 0xfd, + 0x0, 0x0, 0x1f, 0xd0, 0x0, 0x1, 0xfd, 0x0, + 0x0, 0x1f, 0xd0, 0x0, 0x1, 0xfd, 0x0, 0x0, + 0x1f, 0xd0, 0x0, 0x1, 0xfd, 0x0, 0x0, 0x1f, + 0xd0, 0x0, 0x1, 0xfd, 0x0, 0x0, 0x1f, 0xd0, + 0x0, 0x5, 0xfa, 0x7, 0xdb, 0xff, 0x40, 0x7e, + 0xfd, 0x50, 0x0, + + /* U+006B "k" */ + 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xb0, 0x0, 0x2, 0xdf, 0x50, 0x3f, 0xb0, + 0x0, 0x2e, 0xf6, 0x0, 0x3f, 0xb0, 0x3, 0xef, + 0x60, 0x0, 0x3f, 0xb0, 0x3f, 0xf6, 0x0, 0x0, + 0x3f, 0xb4, 0xff, 0x90, 0x0, 0x0, 0x3f, 0xef, + 0xff, 0xf2, 0x0, 0x0, 0x3f, 0xff, 0x59, 0xfd, + 0x0, 0x0, 0x3f, 0xf4, 0x0, 0xcf, 0x90, 0x0, + 0x3f, 0xb0, 0x0, 0x1e, 0xf6, 0x0, 0x3f, 0xb0, + 0x0, 0x4, 0xff, 0x20, 0x3f, 0xb0, 0x0, 0x0, + 0x7f, 0xd0, + + /* U+006C "l" */ + 0x3f, 0xb3, 0xfb, 0x3f, 0xb3, 0xfb, 0x3f, 0xb3, + 0xfb, 0x3f, 0xb3, 0xfb, 0x3f, 0xb3, 0xfb, 0x3f, + 0xb3, 0xfb, 0x3f, 0xb3, 0xfb, 0x3f, 0xb0, + + /* U+006D "m" */ + 0x3f, 0xa3, 0xae, 0xfd, 0x70, 0x5, 0xcf, 0xfc, + 0x50, 0x3, 0xfd, 0xfe, 0xbc, 0xff, 0xaa, 0xfe, + 0xbc, 0xff, 0x70, 0x3f, 0xfb, 0x10, 0x3, 0xff, + 0xf9, 0x0, 0x4, 0xff, 0x13, 0xff, 0x10, 0x0, + 0x9, 0xfe, 0x0, 0x0, 0xb, 0xf4, 0x3f, 0xd0, + 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, 0x8f, 0x63, + 0xfb, 0x0, 0x0, 0x5, 0xf9, 0x0, 0x0, 0x8, + 0xf6, 0x3f, 0xb0, 0x0, 0x0, 0x5f, 0x90, 0x0, + 0x0, 0x8f, 0x63, 0xfb, 0x0, 0x0, 0x5, 0xf9, + 0x0, 0x0, 0x8, 0xf6, 0x3f, 0xb0, 0x0, 0x0, + 0x5f, 0x90, 0x0, 0x0, 0x8f, 0x63, 0xfb, 0x0, + 0x0, 0x5, 0xf9, 0x0, 0x0, 0x8, 0xf6, 0x3f, + 0xb0, 0x0, 0x0, 0x5f, 0x90, 0x0, 0x0, 0x8f, + 0x60, + + /* U+006E "n" */ + 0x3f, 0xa2, 0xae, 0xfe, 0x91, 0x3, 0xfd, 0xff, + 0xcb, 0xef, 0xd0, 0x3f, 0xfc, 0x10, 0x1, 0xcf, + 0x73, 0xff, 0x20, 0x0, 0x4, 0xfc, 0x3f, 0xd0, + 0x0, 0x0, 0x1f, 0xd3, 0xfb, 0x0, 0x0, 0x0, + 0xfe, 0x3f, 0xb0, 0x0, 0x0, 0xf, 0xe3, 0xfb, + 0x0, 0x0, 0x0, 0xfe, 0x3f, 0xb0, 0x0, 0x0, + 0xf, 0xe3, 0xfb, 0x0, 0x0, 0x0, 0xfe, 0x3f, + 0xb0, 0x0, 0x0, 0xf, 0xe0, + + /* U+006F "o" */ + 0x0, 0x3, 0xae, 0xfd, 0x91, 0x0, 0x0, 0x7f, + 0xfd, 0xce, 0xfe, 0x30, 0x5, 0xfe, 0x40, 0x0, + 0x7f, 0xe1, 0xc, 0xf4, 0x0, 0x0, 0x9, 0xf7, + 0xf, 0xe0, 0x0, 0x0, 0x3, 0xfb, 0x2f, 0xc0, + 0x0, 0x0, 0x1, 0xfd, 0xf, 0xe0, 0x0, 0x0, + 0x3, 0xfb, 0xc, 0xf4, 0x0, 0x0, 0x9, 0xf7, + 0x4, 0xfe, 0x40, 0x0, 0x7f, 0xe1, 0x0, 0x7f, + 0xfd, 0xce, 0xfe, 0x30, 0x0, 0x3, 0xae, 0xfd, + 0x91, 0x0, + + /* U+0070 "p" */ + 0x3f, 0xa2, 0x9e, 0xfd, 0x92, 0x0, 0x3f, 0xce, + 0xfb, 0xad, 0xfe, 0x40, 0x3f, 0xfd, 0x20, 0x0, + 0x6f, 0xe1, 0x3f, 0xf3, 0x0, 0x0, 0x9, 0xf7, + 0x3f, 0xd0, 0x0, 0x0, 0x4, 0xfa, 0x3f, 0xb0, + 0x0, 0x0, 0x2, 0xfc, 0x3f, 0xd0, 0x0, 0x0, + 0x4, 0xfa, 0x3f, 0xf3, 0x0, 0x0, 0xa, 0xf7, + 0x3f, 0xfe, 0x30, 0x0, 0x8f, 0xe1, 0x3f, 0xde, + 0xfd, 0xce, 0xff, 0x40, 0x3f, 0xb1, 0x9e, 0xfe, + 0x92, 0x0, 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x4, 0xbe, 0xfc, 0x60, 0xfd, 0x0, 0x8f, + 0xfd, 0xce, 0xfa, 0xfd, 0x5, 0xfe, 0x40, 0x0, + 0x7f, 0xfd, 0xc, 0xf4, 0x0, 0x0, 0x9, 0xfd, + 0xf, 0xe0, 0x0, 0x0, 0x3, 0xfd, 0x2f, 0xc0, + 0x0, 0x0, 0x1, 0xfd, 0xf, 0xe0, 0x0, 0x0, + 0x3, 0xfd, 0xc, 0xf4, 0x0, 0x0, 0x9, 0xfd, + 0x5, 0xfe, 0x40, 0x0, 0x7f, 0xfd, 0x0, 0x8f, + 0xfd, 0xce, 0xfb, 0xfd, 0x0, 0x4, 0xbe, 0xfc, + 0x61, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xfd, + + /* U+0072 "r" */ + 0x3f, 0xa1, 0x9e, 0x83, 0xfc, 0xef, 0xf7, 0x3f, + 0xfe, 0x40, 0x3, 0xff, 0x40, 0x0, 0x3f, 0xe0, + 0x0, 0x3, 0xfc, 0x0, 0x0, 0x3f, 0xb0, 0x0, + 0x3, 0xfb, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x3, + 0xfb, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x5c, 0xef, 0xea, 0x50, 0x9, 0xff, 0xcb, + 0xdf, 0xd0, 0x1f, 0xe1, 0x0, 0x2, 0x30, 0x2f, + 0xd0, 0x0, 0x0, 0x0, 0xd, 0xfc, 0x63, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xfb, 0x30, 0x0, 0x1, + 0x47, 0xbf, 0xf2, 0x0, 0x0, 0x0, 0x9, 0xf6, + 0x9, 0x30, 0x0, 0xb, 0xf5, 0x5f, 0xfe, 0xbb, + 0xef, 0xc0, 0x5, 0xae, 0xfe, 0xc7, 0x0, + + /* U+0074 "t" */ + 0x0, 0x78, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf1, + 0x7a, 0xff, 0xaa, 0xa0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, 0x0, 0xcf, 0x40, 0x0, + 0x0, 0x6f, 0xfb, 0xd7, 0x0, 0x7, 0xdf, 0xd5, + + /* U+0075 "u" */ + 0x4f, 0xa0, 0x0, 0x0, 0x3f, 0xb4, 0xfa, 0x0, + 0x0, 0x3, 0xfb, 0x4f, 0xa0, 0x0, 0x0, 0x3f, + 0xb4, 0xfa, 0x0, 0x0, 0x3, 0xfb, 0x4f, 0xa0, + 0x0, 0x0, 0x3f, 0xb4, 0xfa, 0x0, 0x0, 0x3, + 0xfb, 0x4f, 0xb0, 0x0, 0x0, 0x5f, 0xb2, 0xfd, + 0x0, 0x0, 0x9, 0xfb, 0xd, 0xf7, 0x0, 0x5, + 0xff, 0xb0, 0x4f, 0xfd, 0xad, 0xfc, 0xfb, 0x0, + 0x3b, 0xef, 0xd7, 0x2f, 0xb0, + + /* U+0076 "v" */ + 0xd, 0xf2, 0x0, 0x0, 0x0, 0xef, 0x0, 0x6f, + 0x90, 0x0, 0x0, 0x5f, 0x90, 0x0, 0xff, 0x0, + 0x0, 0xb, 0xf2, 0x0, 0x9, 0xf6, 0x0, 0x2, + 0xfb, 0x0, 0x0, 0x2f, 0xc0, 0x0, 0x9f, 0x40, + 0x0, 0x0, 0xbf, 0x30, 0xf, 0xd0, 0x0, 0x0, + 0x4, 0xfa, 0x6, 0xf7, 0x0, 0x0, 0x0, 0xd, + 0xf1, 0xdf, 0x10, 0x0, 0x0, 0x0, 0x7f, 0xbf, + 0x90, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0xbf, 0x10, 0x0, 0x0, 0xef, 0x0, 0x0, 0x1, + 0xfa, 0x5f, 0x70, 0x0, 0x5, 0xff, 0x60, 0x0, + 0x6, 0xf5, 0xf, 0xd0, 0x0, 0xb, 0xff, 0xb0, + 0x0, 0xc, 0xe0, 0xa, 0xf2, 0x0, 0x1f, 0xab, + 0xf1, 0x0, 0x1f, 0x90, 0x4, 0xf8, 0x0, 0x6f, + 0x55, 0xf7, 0x0, 0x7f, 0x30, 0x0, 0xed, 0x0, + 0xce, 0x0, 0xec, 0x0, 0xde, 0x0, 0x0, 0x8f, + 0x32, 0xf9, 0x0, 0x9f, 0x23, 0xf8, 0x0, 0x0, + 0x3f, 0x98, 0xf3, 0x0, 0x3f, 0x88, 0xf2, 0x0, + 0x0, 0xd, 0xee, 0xd0, 0x0, 0xd, 0xde, 0xc0, + 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, 0x7, 0xff, + 0x70, 0x0, 0x0, 0x1, 0xff, 0x10, 0x0, 0x2, + 0xff, 0x10, 0x0, + + /* U+0078 "x" */ + 0x2f, 0xe1, 0x0, 0x0, 0xdf, 0x30, 0x6f, 0xb0, + 0x0, 0xaf, 0x60, 0x0, 0xaf, 0x70, 0x6f, 0xa0, + 0x0, 0x0, 0xdf, 0x5f, 0xd1, 0x0, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0xb, 0xfb, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf6, 0x0, 0x0, 0x2, + 0xfe, 0x2e, 0xf2, 0x0, 0x0, 0xdf, 0x40, 0x3f, + 0xd0, 0x0, 0x9f, 0x80, 0x0, 0x8f, 0xa0, 0x5f, + 0xc0, 0x0, 0x0, 0xcf, 0x60, + + /* U+0079 "y" */ + 0xd, 0xf2, 0x0, 0x0, 0x0, 0xef, 0x0, 0x6f, + 0x90, 0x0, 0x0, 0x5f, 0x80, 0x0, 0xef, 0x0, + 0x0, 0xb, 0xf2, 0x0, 0x8, 0xf7, 0x0, 0x2, + 0xfb, 0x0, 0x0, 0x1f, 0xd0, 0x0, 0x9f, 0x40, + 0x0, 0x0, 0xaf, 0x40, 0xf, 0xd0, 0x0, 0x0, + 0x3, 0xfb, 0x6, 0xf6, 0x0, 0x0, 0x0, 0xd, + 0xf2, 0xdf, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xcf, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0x40, 0x0, 0x0, 0x3, 0x0, + 0x3f, 0xc0, 0x0, 0x0, 0x2, 0xfd, 0xbf, 0xf3, + 0x0, 0x0, 0x0, 0x8, 0xef, 0xc4, 0x0, 0x0, + 0x0, 0x0, + + /* U+007A "z" */ + 0x1f, 0xff, 0xff, 0xff, 0xf8, 0xa, 0xaa, 0xaa, + 0xaf, 0xf5, 0x0, 0x0, 0x0, 0x9f, 0x90, 0x0, + 0x0, 0x6, 0xfc, 0x0, 0x0, 0x0, 0x3f, 0xe1, + 0x0, 0x0, 0x1, 0xdf, 0x40, 0x0, 0x0, 0xb, + 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xb0, 0x0, 0x0, + 0x4, 0xfd, 0x10, 0x0, 0x0, 0x1e, 0xfc, 0xaa, + 0xaa, 0xa6, 0x3f, 0xff, 0xff, 0xff, 0xfb, + + /* U+007B "{" */ + 0x0, 0x3c, 0xfa, 0x0, 0xef, 0xc6, 0x3, 0xfc, + 0x0, 0x4, 0xfa, 0x0, 0x4, 0xfa, 0x0, 0x4, + 0xfa, 0x0, 0x4, 0xfa, 0x0, 0x5, 0xfa, 0x0, + 0x8e, 0xf6, 0x0, 0xdf, 0xe2, 0x0, 0x7, 0xf9, + 0x0, 0x4, 0xfa, 0x0, 0x4, 0xfa, 0x0, 0x4, + 0xfa, 0x0, 0x4, 0xfa, 0x0, 0x4, 0xfa, 0x0, + 0x2, 0xfd, 0x0, 0x0, 0xef, 0xc6, 0x0, 0x3c, + 0xfa, + + /* U+007C "|" */ + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, + + /* U+007D "}" */ + 0xaf, 0xc3, 0x0, 0x6c, 0xfe, 0x0, 0x0, 0xcf, + 0x30, 0x0, 0xaf, 0x40, 0x0, 0xaf, 0x40, 0x0, + 0xaf, 0x40, 0x0, 0xaf, 0x40, 0x0, 0x9f, 0x50, + 0x0, 0x5f, 0xe8, 0x0, 0x2e, 0xfd, 0x0, 0x9f, + 0x70, 0x0, 0x9f, 0x40, 0x0, 0xaf, 0x40, 0x0, + 0xaf, 0x40, 0x0, 0xaf, 0x40, 0x0, 0xaf, 0x40, + 0x0, 0xcf, 0x30, 0x6c, 0xfe, 0x0, 0xaf, 0xc3, + 0x0, + + /* U+007E "~" */ + 0x9, 0xee, 0x60, 0x0, 0xd6, 0x7f, 0xab, 0xfb, + 0x26, 0xf3, 0xb9, 0x0, 0x5e, 0xff, 0x90, 0x31, + 0x0, 0x0, 0x32, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x6d, 0xea, 0x10, 0x7, 0xe5, 0x3b, 0xc0, + 0xe, 0x40, 0x0, 0xe4, 0x1f, 0x0, 0x0, 0xb7, + 0xf, 0x30, 0x0, 0xd5, 0x8, 0xc2, 0x8, 0xe0, + 0x0, 0x9f, 0xfc, 0x20, 0x0, 0x0, 0x10, 0x0, + + /* U+2022 "•" */ + 0x9, 0xa2, 0x8f, 0xfc, 0x9f, 0xfd, 0x2d, 0xe5, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x15, 0xae, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x69, 0xff, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xfe, 0x95, 0x0, 0x8, 0xff, + 0x0, 0x0, 0xf, 0xff, 0xc7, 0x30, 0x0, 0x0, + 0x8, 0xff, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0xf, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, + 0xf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, + 0x1, 0x7b, 0xbd, 0xff, 0x0, 0x0, 0xf, 0xf8, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0x0, 0x13, + 0x3f, 0xf8, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0x2b, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfc, 0xdf, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xa1, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, 0x7f, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8a, 0xa6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F008 "" */ + 0xc4, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x4c, 0xfd, 0xcd, 0xff, 0xee, 0xee, 0xee, + 0xee, 0xff, 0xdc, 0xdf, 0xfa, 0x8a, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xb8, 0xaf, 0xf4, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x40, 0x4f, + 0xf4, 0x4, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0x50, 0x4f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf7, 0x47, 0xfd, 0x77, + 0x77, 0x77, 0x77, 0xdf, 0x84, 0x7f, 0xf4, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x4f, + 0xf7, 0x47, 0xfd, 0x77, 0x77, 0x77, 0x77, 0xdf, + 0x84, 0x7f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x4, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x50, 0x4f, 0xf4, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x40, 0x4f, + 0xfa, 0x8a, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xb8, 0xaf, 0xfd, 0xcd, 0xff, 0xee, 0xee, 0xee, + 0xee, 0xff, 0xdc, 0xdf, 0xc4, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x4c, + + /* U+F00B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xfa, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xfd, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xf9, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf9, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xfa, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xf9, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xfd, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xfa, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0x60, 0x6, 0xe4, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf6, 0x0, 0x7f, 0xff, 0x40, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0x60, 0x0, 0xff, 0xff, + 0xf4, 0x0, 0x4, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0x40, 0x4f, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "ï€" */ + 0x6, 0x70, 0x0, 0x0, 0x0, 0x18, 0x40, 0x8f, + 0xfb, 0x0, 0x0, 0x1, 0xdf, 0xf4, 0xff, 0xff, + 0xb0, 0x0, 0x1d, 0xff, 0xfb, 0x7f, 0xff, 0xfb, + 0x1, 0xdf, 0xff, 0xf4, 0x8, 0xff, 0xff, 0xbd, + 0xff, 0xff, 0x40, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x1d, 0xff, + 0xff, 0x48, 0xff, 0xff, 0xb0, 0xcf, 0xff, 0xf4, + 0x0, 0x8f, 0xff, 0xf9, 0xdf, 0xff, 0x40, 0x0, + 0x8, 0xff, 0xf9, 0x2e, 0xf4, 0x0, 0x0, 0x0, + 0x8f, 0xc0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x1, + 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x26, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x64, 0x0, + 0xdf, 0xf4, 0x0, 0x72, 0x0, 0x0, 0x0, 0xb, + 0xfe, 0x10, 0xdf, 0xf4, 0x9, 0xfe, 0x30, 0x0, + 0x0, 0xaf, 0xff, 0x50, 0xdf, 0xf4, 0xe, 0xff, + 0xe1, 0x0, 0x5, 0xff, 0xfb, 0x0, 0xdf, 0xf4, + 0x5, 0xff, 0xfb, 0x0, 0xd, 0xff, 0xb0, 0x0, + 0xdf, 0xf4, 0x0, 0x5f, 0xff, 0x40, 0x4f, 0xff, + 0x20, 0x0, 0xdf, 0xf4, 0x0, 0xb, 0xff, 0xa0, + 0x8f, 0xfb, 0x0, 0x0, 0xdf, 0xf4, 0x0, 0x4, + 0xff, 0xf0, 0xbf, 0xf7, 0x0, 0x0, 0xdf, 0xf4, + 0x0, 0x1, 0xff, 0xf1, 0xbf, 0xf6, 0x0, 0x0, + 0xdf, 0xf4, 0x0, 0x0, 0xff, 0xf2, 0xbf, 0xf7, + 0x0, 0x0, 0x8d, 0xc1, 0x0, 0x0, 0xff, 0xf1, + 0x8f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf0, 0x4f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xb0, 0xe, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x50, 0x6, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, + 0x0, 0xaf, 0xff, 0xd5, 0x10, 0x3, 0x9f, 0xff, + 0xf2, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x9e, 0xff, 0xff, 0xb6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x10, 0x0, 0x0, + 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x2b, 0xff, 0xff, 0xb2, 0x0, 0x10, 0x0, + 0x0, 0x8f, 0x87, 0xff, 0xff, 0xff, 0xff, 0x79, + 0xf8, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x2f, 0xff, + 0xff, 0xff, 0xc7, 0x7c, 0xff, 0xff, 0xff, 0xf2, + 0x7, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x70, 0x0, 0x6f, 0xff, 0xf1, 0x0, 0x0, + 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, 0xe0, + 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x6f, + 0xff, 0xf1, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, + 0x7, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x70, 0x2f, 0xff, 0xff, 0xff, 0xc7, 0x7c, + 0xff, 0xff, 0xff, 0xf2, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x8f, 0x97, 0xff, 0xff, 0xff, 0xff, 0x78, + 0xf8, 0x0, 0x0, 0x1, 0x0, 0x1b, 0xff, 0xff, + 0xb1, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, + 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x10, 0x0, + 0x67, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfe, 0x20, 0xf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0x51, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xfc, + 0x8f, 0xff, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfa, 0x0, 0x4e, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x8, 0xd3, + 0x2d, 0xff, 0xff, 0x10, 0x0, 0x0, 0xa, 0xff, + 0xf5, 0x1b, 0xff, 0xf5, 0xb, 0xff, 0xf4, 0x0, + 0x0, 0x1c, 0xff, 0xe2, 0x2d, 0xff, 0xff, 0xf7, + 0x8, 0xff, 0xf6, 0x0, 0x3e, 0xff, 0xc1, 0x4e, + 0xff, 0xff, 0xff, 0xfa, 0x5, 0xff, 0xf9, 0xe, + 0xff, 0x90, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x13, 0xef, 0xf6, 0x4f, 0x70, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x31, 0xcc, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x80, 0x1, 0xef, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xf6, 0x0, 0xe, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0x60, 0x0, 0xef, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xf6, 0x0, 0xe, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x40, 0x0, 0xcf, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x56, 0x65, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xee, 0xef, 0xff, 0xff, 0xfe, 0xee, + 0x70, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x7a, 0xaa, 0xaa, 0x91, + 0x4f, 0xf4, 0x19, 0xaa, 0xaa, 0xa7, 0xff, 0xff, + 0xff, 0xfd, 0x23, 0x32, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xf, 0x48, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xef, 0xff, + 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x41, + + /* U+F01C "" */ + 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x98, 0x88, 0x88, 0x88, 0x88, 0xdf, + 0xf3, 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xd0, 0x0, 0x1, 0xef, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x80, 0x0, 0xaf, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x20, 0x5f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfc, + 0xd, 0xff, 0x98, 0x88, 0x70, 0x0, 0x0, 0x3, + 0x88, 0x88, 0xdf, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x7f, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + 0x7, 0xba, 0x0, 0x0, 0x1, 0x7c, 0xff, 0xff, + 0xb5, 0x0, 0xb, 0xff, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0xb, 0xff, 0x0, 0xa, + 0xff, 0xff, 0xdb, 0xbe, 0xff, 0xff, 0x9a, 0xff, + 0x0, 0xaf, 0xff, 0xa2, 0x0, 0x0, 0x3b, 0xff, + 0xff, 0xff, 0x5, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xd, 0xff, 0x60, 0x0, + 0x0, 0x7, 0xba, 0x9c, 0xff, 0xff, 0x3f, 0xfc, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0xf6, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x6f, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0xcf, 0xf3, 0xff, 0xff, 0xc9, 0xaa, + 0x70, 0x0, 0x0, 0x7, 0xff, 0xd0, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, + 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x3b, 0xff, + 0xf9, 0x0, 0xff, 0xa9, 0xff, 0xff, 0xeb, 0xbd, + 0xff, 0xff, 0xa0, 0x0, 0xff, 0xb0, 0x5d, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, 0xb0, + 0x0, 0x5b, 0xff, 0xff, 0xc8, 0x10, 0x0, 0x0, + 0xab, 0x70, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x2, 0xee, 0x0, 0x0, 0x0, 0x2e, 0xff, 0x0, + 0x0, 0x2, 0xef, 0xff, 0x47, 0x77, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x0, 0x0, 0x0, 0x0, 0x89, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x73, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x1f, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x5f, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x4f, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x1f, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x85, 0x4, 0x77, 0x77, 0xef, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xee, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7b, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x9, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xee, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x2, 0xef, 0xf0, + 0x0, 0x8, 0x70, 0x8, 0xfd, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0x0, 0x0, 0xef, 0xb0, 0xc, + 0xf6, 0x4, 0x77, 0x77, 0xef, 0xff, 0xf0, 0x0, + 0x2, 0xdf, 0x80, 0x3f, 0xd0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x74, 0x1, 0xff, 0x10, 0xcf, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xf4, + 0x8, 0xf7, 0x7, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x5f, 0xc0, 0x3f, 0xa0, 0x4f, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0x2, + 0xfb, 0x4, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x5f, 0xc0, 0x3f, 0xa0, 0x5f, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xf4, 0x8, 0xf7, + 0x7, 0xf6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x74, 0x2, 0xff, 0x10, 0xcf, 0x30, 0x0, 0x0, + 0x9f, 0xff, 0xf0, 0x0, 0x2, 0xef, 0x80, 0x3f, + 0xd0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x0, 0x0, + 0xef, 0xb0, 0xc, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xf0, 0x0, 0x8, 0x70, 0x8, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, + 0x20, 0x0, 0x0, + + /* U+F03E "" */ + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xf6, 0x38, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x7f, 0xff, 0xff, 0xfb, 0xef, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xcf, 0xff, 0xff, + 0x90, 0x3e, 0xff, 0xff, 0xff, 0xfa, 0x7c, 0xff, + 0xff, 0xf9, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0x90, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0x90, 0x6f, 0xf9, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xf9, 0x0, 0x6, 0x90, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xc8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x8c, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F043 "ïƒ" */ + 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xa6, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xef, 0x91, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xbf, 0xe0, 0x9f, 0xff, 0xff, 0xff, 0xf7, + 0x5f, 0xf9, 0x7, 0xcf, 0xff, 0xff, 0xf2, 0xc, + 0xff, 0xb3, 0x9, 0xff, 0xff, 0x80, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x15, 0x77, + 0x40, 0x0, 0x0, + + /* U+F048 "ïˆ" */ + 0x47, 0x60, 0x0, 0x0, 0x0, 0x16, 0x1b, 0xff, + 0x10, 0x0, 0x0, 0x2d, 0xfb, 0xbf, 0xf1, 0x0, + 0x0, 0x2e, 0xff, 0xcb, 0xff, 0x10, 0x0, 0x3e, + 0xff, 0xfc, 0xbf, 0xf1, 0x0, 0x4f, 0xff, 0xff, + 0xcb, 0xff, 0x10, 0x5f, 0xff, 0xff, 0xfc, 0xbf, + 0xf1, 0x6f, 0xff, 0xff, 0xff, 0xcb, 0xff, 0x9f, + 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcb, + 0xff, 0x4e, 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xf1, + 0x2d, 0xff, 0xff, 0xff, 0xcb, 0xff, 0x10, 0x1c, + 0xff, 0xff, 0xfc, 0xbf, 0xf1, 0x0, 0xc, 0xff, + 0xff, 0xcb, 0xff, 0x10, 0x0, 0xb, 0xff, 0xfc, + 0xbf, 0xf1, 0x0, 0x0, 0xa, 0xff, 0xca, 0xff, + 0x10, 0x0, 0x0, 0x8, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "ï‹" */ + 0x6, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xd4, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x20, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "ïŒ" */ + 0x6, 0x77, 0x77, 0x30, 0x0, 0x6, 0x77, 0x77, + 0x30, 0xbf, 0xff, 0xff, 0xf3, 0x0, 0xbf, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, + 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, + 0xef, 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, + 0xf6, 0x6f, 0xff, 0xff, 0xc1, 0x0, 0x6f, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F04D "ï" */ + 0x5, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x30, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F051 "ï‘" */ + 0x5, 0x20, 0x0, 0x0, 0x0, 0x57, 0x66, 0xff, + 0x40, 0x0, 0x0, 0xc, 0xff, 0x8f, 0xff, 0x60, + 0x0, 0x0, 0xdf, 0xf8, 0xff, 0xff, 0x70, 0x0, + 0xd, 0xff, 0x8f, 0xff, 0xff, 0x80, 0x0, 0xdf, + 0xf8, 0xff, 0xff, 0xff, 0x90, 0xd, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xb0, 0xdf, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xcd, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0x5d, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0x40, 0xdf, 0xf8, 0xff, 0xff, 0xfe, + 0x30, 0xd, 0xff, 0x8f, 0xff, 0xfe, 0x20, 0x0, + 0xdf, 0xf8, 0xff, 0xfd, 0x20, 0x0, 0xd, 0xff, + 0x7f, 0xfd, 0x10, 0x0, 0x0, 0xdf, 0xf3, 0xfb, + 0x10, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F053 "ï“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0x80, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x40, 0x0, 0x0, 0x5f, 0xff, 0xe2, 0x0, 0x0, + 0x5f, 0xff, 0xe2, 0x0, 0x0, 0x5f, 0xff, 0xe3, + 0x0, 0x0, 0x5f, 0xff, 0xe3, 0x0, 0x0, 0x5f, + 0xff, 0xe3, 0x0, 0x0, 0x5f, 0xff, 0xe3, 0x0, + 0x0, 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x5f, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F054 "ï”" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdb, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfc, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x0, + 0x0, 0x9, 0xff, 0xfc, 0x0, 0x0, 0x9, 0xff, + 0xfc, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, 0x0, + 0x9, 0xff, 0xfc, 0x0, 0x0, 0x9, 0xff, 0xfc, + 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0xcf, 0xfc, 0x0, 0x0, 0x0, 0x2, 0xdb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x0, 0x0, 0x2, 0x55, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x37, + 0x77, 0x77, 0x8f, 0xff, 0xc7, 0x77, 0x77, 0x60, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x14, 0x44, 0x44, 0x5f, 0xff, + 0xb4, 0x44, 0x44, 0x30, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, + 0x0, 0x0, 0x0, + + /* U+F068 "ï¨" */ + 0x49, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x2, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x10, + + /* U+F06E "ï®" */ + 0x0, 0x0, 0x0, 0x6, 0xad, 0xff, 0xec, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xef, 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x92, 0x0, 0x5, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x2, + 0x52, 0x1, 0xcf, 0xff, 0xb0, 0x0, 0x4, 0xff, + 0xff, 0x80, 0x0, 0x7f, 0xf9, 0x1, 0xef, 0xff, + 0xb0, 0x1, 0xef, 0xff, 0xf0, 0x0, 0x8, 0xff, + 0xf7, 0x8, 0xff, 0xff, 0x80, 0xaf, 0xff, 0xfb, + 0x2, 0x25, 0xff, 0xff, 0xe0, 0x3f, 0xff, 0xff, + 0x2f, 0xff, 0xff, 0xa0, 0x7f, 0xff, 0xff, 0xff, + 0x2, 0xff, 0xff, 0xf7, 0x9f, 0xff, 0xfb, 0x5, + 0xff, 0xff, 0xff, 0xc0, 0x3f, 0xff, 0xff, 0x21, + 0xef, 0xff, 0xf0, 0xc, 0xff, 0xff, 0xf5, 0x7, + 0xff, 0xff, 0x80, 0x3, 0xff, 0xff, 0x80, 0x1a, + 0xff, 0xe5, 0x1, 0xef, 0xff, 0xb0, 0x0, 0x4, + 0xff, 0xff, 0x50, 0x0, 0x10, 0x1, 0xcf, 0xff, + 0xb0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0x92, 0x0, + 0x5, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xef, 0xff, 0xfc, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xad, 0xef, 0xec, + 0x83, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "ï°" */ + 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x70, 0x4, 0x8c, 0xef, 0xed, 0x94, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0xef, 0xff, 0xfe, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xc4, 0x0, + 0x4, 0xcf, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x60, 0x3, 0x10, 0x9, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x4f, 0xfa, 0x0, 0xcf, 0xff, 0xe1, 0x0, + 0x0, 0xb, 0xb0, 0x0, 0x4e, 0xff, 0xef, 0xff, + 0xa0, 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x6f, 0xfd, + 0x30, 0x1, 0xcf, 0xff, 0xff, 0xf1, 0xf, 0xff, + 0xff, 0x50, 0x0, 0xbf, 0xff, 0xf6, 0x0, 0x8, + 0xff, 0xff, 0xf3, 0xe, 0xff, 0xff, 0xa0, 0x0, + 0x6f, 0xff, 0xff, 0x0, 0x0, 0x5f, 0xff, 0xf2, + 0xf, 0xff, 0xff, 0x50, 0x0, 0xc, 0xff, 0xff, + 0x40, 0x0, 0x2, 0xdf, 0xfe, 0x8f, 0xff, 0xfa, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xc0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xc4, 0x0, 0x0, 0x3, 0xef, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xfe, 0xe3, + 0x0, 0x1b, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x9d, 0xef, 0xec, 0x20, 0x0, 0x8f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x60, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xa3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xa2, 0x24, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0x1, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xa0, 0x2, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xb0, 0x3, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xc0, 0x4, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xd0, 0x5, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xf9, 0x9c, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xf5, 0x2b, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x90, 0x1, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x1, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, + 0xff, 0xff, 0xff, 0x90, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x1, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x40, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, 0xef, 0xff, + 0xf6, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0x50, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xf7, 0x22, 0x23, 0xdf, 0xf8, + 0x9, 0xff, 0xf7, 0x2f, 0xff, 0x80, 0x0, 0x0, + 0x2e, 0xb0, 0x7f, 0xff, 0x90, 0xf, 0xf8, 0x0, + 0x0, 0x0, 0x3, 0x6, 0xff, 0xfa, 0x0, 0x7, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfd, 0x3, 0x0, 0x7, 0x60, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xe1, 0x3f, 0x90, 0xf, 0xf8, 0x0, + 0x22, 0x23, 0xdf, 0xfe, 0x22, 0xef, 0xf7, 0x2f, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0x50, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xf6, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x30, 0x0, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xae, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf9, 0x2, 0xef, 0xff, 0x50, 0x0, 0x0, 0xcf, + 0xff, 0x90, 0x0, 0x2e, 0xff, 0xf5, 0x0, 0xc, + 0xff, 0xf9, 0x0, 0x0, 0x2, 0xef, 0xff, 0x50, + 0xaf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xf2, 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xe1, 0x6, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x29, 0x20, + + /* U+F078 "ï¸" */ + 0x6, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0x20, 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xe1, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xf2, 0xb, 0xff, 0xf9, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x50, 0x0, 0xbf, 0xff, 0x90, + 0x0, 0x3e, 0xff, 0xf5, 0x0, 0x0, 0xb, 0xff, + 0xf9, 0x3, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xae, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x94, 0x0, + 0x0, 0x0, 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x0, 0x9c, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xd1, 0x0, 0x58, 0x88, 0x88, 0x88, 0x88, 0x81, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfd, 0x20, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xe2, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x8f, 0xfc, 0xff, 0xcf, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf6, 0x0, + 0x0, 0x7f, 0xc2, 0xff, 0x67, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf6, 0x0, 0x0, 0x3, 0x1, + 0xff, 0x60, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf6, 0x0, 0x0, 0x0, 0x1, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf6, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf6, 0x0, 0x0, 0x0, 0x1, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x3, 0xd7, 0x1f, 0xf6, + 0x3d, 0x70, 0x0, 0x1, 0xff, 0x60, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x7f, 0xf9, 0xef, 0xf0, 0x0, + 0x1, 0xff, 0xb8, 0x88, 0x88, 0x88, 0x32, 0xef, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x2e, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x2, 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, + + /* U+F07B "ï»" */ + 0x5e, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb8, 0x88, 0x88, 0x88, 0x60, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F093 "ï‚“" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x11, 0x1b, 0xff, 0xff, 0x51, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x7a, 0xaa, 0xaa, 0x2b, + 0xff, 0xff, 0x42, 0xaa, 0xaa, 0xa7, 0xff, 0xff, + 0xff, 0x82, 0x67, 0x76, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x77, 0x77, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xf, 0x48, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xef, 0xff, + 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x41, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xfe, 0xb5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x1, 0x30, 0x0, 0x0, 0x1d, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x29, 0xff, 0x70, 0x0, 0x3e, 0xff, + 0xff, 0x30, 0x0, 0x4, 0xbf, 0xff, 0xff, 0x40, + 0x7f, 0xff, 0xff, 0x50, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xfe, 0xef, 0xff, 0xff, 0x50, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xea, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x57, 0x64, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x25, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x4, + 0xaa, 0x50, 0x7f, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x8f, 0xff, 0xf5, 0xef, 0xd3, 0x7f, 0xf6, 0x0, + 0x8, 0xff, 0xff, 0xb0, 0xff, 0x80, 0xf, 0xf7, + 0x0, 0x8f, 0xff, 0xfb, 0x0, 0xdf, 0xe7, 0xaf, + 0xf5, 0x8, 0xff, 0xff, 0xb0, 0x0, 0x5f, 0xff, + 0xff, 0xfd, 0x9f, 0xff, 0xfb, 0x0, 0x0, 0x5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x1, 0x5f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x25, 0x9f, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfb, + 0x6f, 0xff, 0xfd, 0x10, 0x0, 0xef, 0xd3, 0x7f, + 0xf5, 0x5, 0xff, 0xff, 0xd1, 0x0, 0xff, 0x80, + 0xf, 0xf7, 0x0, 0x5f, 0xff, 0xfd, 0x10, 0xdf, + 0xe7, 0xaf, 0xf5, 0x0, 0x5, 0xff, 0xff, 0xd1, + 0x5f, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, 0xff, + 0xf4, 0x5, 0xef, 0xfb, 0x10, 0x0, 0x0, 0x1, + 0x66, 0x20, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x8, 0xbb, 0xbb, 0xbb, 0x50, 0x90, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x81, + 0xfb, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x81, 0xff, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x81, 0xff, 0xf8, 0x8c, 0xc9, 0xf, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xfc, 0xf, + 0xff, 0xff, 0xff, 0xd5, 0x44, 0x43, 0xff, 0xfc, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xfc, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfc, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xfe, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x58, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x10, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x6, 0x77, 0x77, 0x77, 0x77, 0x77, 0x60, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xfc, 0x10, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xc0, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf3, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf4, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf4, + 0xff, 0xd8, 0x88, 0x88, 0x88, 0x88, 0xef, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xe4, 0x2, + 0xcf, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x2f, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0x40, 0x0, 0xf, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x6f, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xfc, 0x8a, 0xff, 0xff, 0xff, 0xf4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F0C9 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xac, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xac, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0E0 "" */ + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0xe3, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0x3e, 0xff, 0x70, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x7, 0xff, 0xff, 0xfb, + 0x13, 0xdf, 0xff, 0xff, 0xfd, 0x31, 0xbf, 0xff, + 0xff, 0xff, 0xe4, 0xa, 0xff, 0xff, 0xa0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x5d, 0xd5, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F0E7 "" */ + 0x0, 0x14, 0x44, 0x44, 0x41, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x40, + 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x6, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x14, 0x44, 0xbf, 0xfe, 0x44, 0x43, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xf9, 0x4f, 0xff, 0xff, + 0x40, 0x0, 0x0, 0xff, 0xff, 0xf8, 0x3f, 0xff, + 0xff, 0x50, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xa8, 0x88, 0x88, 0x20, 0x0, 0x0, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xf0, 0xcf, 0xff, 0xff, 0x51, 0xe2, 0x0, + 0xff, 0xff, 0xf0, 0xef, 0xff, 0xff, 0x51, 0xfe, + 0x20, 0xff, 0xff, 0xf0, 0xef, 0xff, 0xff, 0x51, + 0xff, 0xe2, 0xff, 0xff, 0xf0, 0xef, 0xff, 0xff, + 0x50, 0xbb, 0xb7, 0xff, 0xff, 0xf0, 0xef, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xf0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xf0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xf0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xf0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xcf, 0xff, 0xf0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x7b, + 0xbb, 0xbb, 0xbb, 0xbb, 0xb4, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x75, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xc8, 0x8f, 0xa8, 0xaf, 0x88, 0xbf, 0x88, 0xfb, + 0x88, 0xff, 0x8f, 0xf8, 0x0, 0xf4, 0x4, 0xf0, + 0x5, 0xe0, 0xe, 0x50, 0xf, 0xf8, 0xff, 0x80, + 0xf, 0x40, 0x4f, 0x0, 0x6f, 0x0, 0xf6, 0x0, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x94, + 0x6f, 0x64, 0x8f, 0x44, 0xbb, 0x44, 0xff, 0xff, + 0x8f, 0xff, 0xf6, 0x2, 0xf2, 0x5, 0xf0, 0x8, + 0x80, 0xe, 0xff, 0xf8, 0xff, 0xff, 0x94, 0x6f, + 0x64, 0x8f, 0x44, 0xbb, 0x44, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0x80, 0xf, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xf6, 0x0, 0xff, 0x8f, 0xf8, + 0x0, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xe, 0x50, + 0xf, 0xf8, 0xff, 0xc8, 0x8f, 0xa8, 0x88, 0x88, + 0x88, 0x88, 0xfb, 0x88, 0xff, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x7e, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x18, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x2, 0xac, 0xcc, 0xcc, 0xcd, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "ï…›" */ + 0x24, 0x44, 0x44, 0x44, 0x30, 0x30, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfc, 0xf, 0x60, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0xff, 0x60, 0xf, 0xff, + 0xff, 0xff, 0xfc, 0xf, 0xff, 0x60, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xfc, 0xb, 0xbb, 0xbb, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8b, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x80, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x43, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x8c, 0xff, 0xff, 0xff, 0xfc, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x8, 0xff, 0xff, 0xfb, 0x72, 0x0, + 0x0, 0x2, 0x7b, 0xff, 0xff, 0xf8, 0xa, 0xff, + 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xfa, 0xbf, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xb0, + 0xba, 0x10, 0x0, 0x5, 0x9d, 0xef, 0xed, 0x95, + 0x0, 0x0, 0x1a, 0xb0, 0x0, 0x0, 0x0, 0x6d, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xfa, 0x53, 0x23, 0x5a, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xb1, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x9d, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x60, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0xff, 0x84, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x5b, 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8, 0xff, 0xff, 0x84, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc8, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8e, + 0xfd, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, + + /* U+F241 "ï‰" */ + 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x60, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0xc, 0xff, 0xff, 0xf8, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x5b, 0xff, 0xff, 0x81, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x8f, 0xff, + 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x81, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc8, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8e, + 0xfd, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, + + /* U+F242 "" */ + 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x60, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf8, + 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xff, 0xff, 0x81, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x81, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc8, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8e, + 0xfd, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, + + /* U+F243 "" */ + 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x60, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0xff, 0x81, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf8, + 0x1f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xff, 0xff, 0x81, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf8, 0x1f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x81, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc8, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8e, + 0xfd, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, + + /* U+F244 "" */ + 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x60, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc8, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8e, + 0xfd, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xfb, 0xbf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0x70, 0xa, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x32, 0x0, 0x0, 0x9e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0x90, 0x1, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0x30, 0x0, 0xcf, 0xff, 0xf6, 0x3c, 0xf3, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x5f, 0xf9, 0x10, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0xcf, 0xff, 0xf6, + 0x33, 0x34, 0xed, 0x33, 0x33, 0x33, 0x33, 0x5f, + 0xfa, 0x10, 0x2d, 0xff, 0x90, 0x0, 0x0, 0x5f, + 0x30, 0x0, 0x0, 0x0, 0x1c, 0x30, 0x0, 0x0, + 0x32, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xf3, 0xa, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xce, + 0xae, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xbe, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x22, 0x20, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x34, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xbf, 0xff, 0xff, 0xe7, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xfa, 0xff, 0xff, 0xb0, 0x0, + 0x4, 0xff, 0xff, 0xf1, 0x9f, 0xff, 0xf8, 0x0, + 0xd, 0xff, 0xff, 0xf1, 0xa, 0xff, 0xff, 0x10, + 0x3f, 0xff, 0xff, 0xf1, 0x0, 0xbf, 0xff, 0x60, + 0x7f, 0xfd, 0x8f, 0xf1, 0x66, 0xc, 0xff, 0xa0, + 0xaf, 0xf8, 0x7, 0xf1, 0x6f, 0x13, 0xff, 0xd0, + 0xcf, 0xff, 0x70, 0x71, 0x53, 0x1e, 0xff, 0xf0, + 0xdf, 0xff, 0xf7, 0x0, 0x1, 0xdf, 0xff, 0xf0, + 0xef, 0xff, 0xff, 0x60, 0xc, 0xff, 0xff, 0xf0, + 0xef, 0xff, 0xff, 0x30, 0x7, 0xff, 0xff, 0xf0, + 0xdf, 0xff, 0xf3, 0x0, 0x10, 0x8f, 0xff, 0xf0, + 0xcf, 0xff, 0x30, 0xb1, 0x67, 0x9, 0xff, 0xf0, + 0x9f, 0xf6, 0xb, 0xf2, 0x6e, 0x2, 0xff, 0xd0, + 0x6f, 0xff, 0xcf, 0xf2, 0x52, 0x2e, 0xff, 0xa0, + 0x1f, 0xff, 0xff, 0xf2, 0x2, 0xef, 0xff, 0x50, + 0x9, 0xff, 0xff, 0xf2, 0x2e, 0xff, 0xfe, 0x0, + 0x0, 0xdf, 0xff, 0xf4, 0xef, 0xff, 0xf5, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x27, 0xab, 0xb9, 0x50, 0x0, 0x0, + + /* U+F2ED "ï‹­" */ + 0x0, 0x0, 0x2, 0xab, 0xbb, 0xb7, 0x0, 0x0, + 0x0, 0x57, 0x77, 0x7c, 0xff, 0xff, 0xff, 0x77, + 0x77, 0x72, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x20, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0xc, 0xff, 0x77, 0xff, 0x3b, 0xfe, 0x1e, 0xff, + 0x40, 0xc, 0xff, 0x66, 0xff, 0x2a, 0xfe, 0xe, + 0xff, 0x40, 0xc, 0xff, 0x66, 0xff, 0x2a, 0xfe, + 0xe, 0xff, 0x40, 0xc, 0xff, 0x66, 0xff, 0x2a, + 0xfe, 0xe, 0xff, 0x40, 0xc, 0xff, 0x66, 0xff, + 0x2a, 0xfe, 0xe, 0xff, 0x40, 0xc, 0xff, 0x66, + 0xff, 0x2a, 0xfe, 0xe, 0xff, 0x40, 0xc, 0xff, + 0x66, 0xff, 0x2a, 0xfe, 0xe, 0xff, 0x40, 0xc, + 0xff, 0x66, 0xff, 0x2a, 0xfe, 0xe, 0xff, 0x40, + 0xc, 0xff, 0x66, 0xff, 0x2a, 0xfe, 0xe, 0xff, + 0x40, 0xc, 0xff, 0x77, 0xff, 0x3b, 0xfe, 0x1e, + 0xff, 0x40, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x57, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x72, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x90, 0x8f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xb0, 0x8f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xb0, 0x8f, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xb0, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xb0, 0x10, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x75, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0x85, 0xff, 0xff, 0x58, 0xff, + 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xb0, + 0x4, 0xff, 0x40, 0xb, 0xff, 0xff, 0xf0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x4, 0x40, 0x4, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0xef, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x4, + 0x40, 0x4, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xb0, 0x4, 0xff, 0x40, 0xb, 0xff, + 0xff, 0xf0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x85, + 0xff, 0xff, 0x58, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x28, 0x88, 0x88, 0x88, 0x73, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x1d, + 0xf6, 0xe, 0x50, 0xd6, 0x8, 0xff, 0x1d, 0xff, + 0x60, 0xe5, 0xd, 0x60, 0x8f, 0xfc, 0xff, 0xf6, + 0xe, 0x50, 0xd6, 0x8, 0xff, 0xff, 0xff, 0x60, + 0xe5, 0xd, 0x60, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x7, 0xab, + 0xbb, 0xbb, 0xbb, 0xbb, 0xa6, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xf1, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x10, + 0x0, 0xa, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf1, 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x10, 0xc, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0x1d, + 0xff, 0xff, 0xcb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, + 0xff, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x9f, + 0xff, 0xf9, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x40, 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5c, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 86, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 86, .box_w = 3, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 21, .adv_w = 125, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 39, .adv_w = 225, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 137, .adv_w = 199, .box_w = 12, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 257, .adv_w = 270, .box_w = 17, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 376, .adv_w = 220, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 481, .adv_w = 67, .box_w = 2, .box_h = 6, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 487, .adv_w = 108, .box_w = 6, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 544, .adv_w = 108, .box_w = 5, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 592, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 624, .adv_w = 186, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 674, .adv_w = 73, .box_w = 4, .box_h = 6, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 686, .adv_w = 123, .box_w = 6, .box_h = 2, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 692, .adv_w = 73, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 698, .adv_w = 113, .box_w = 9, .box_h = 20, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 788, .adv_w = 213, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 879, .adv_w = 118, .box_w = 6, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 921, .adv_w = 184, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 998, .adv_w = 183, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1075, .adv_w = 214, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1173, .adv_w = 184, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1250, .adv_w = 197, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1334, .adv_w = 191, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1418, .adv_w = 206, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1502, .adv_w = 197, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1586, .adv_w = 73, .box_w = 4, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1608, .adv_w = 73, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1636, .adv_w = 186, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1686, .adv_w = 186, .box_w = 10, .box_h = 7, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 1721, .adv_w = 186, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1771, .adv_w = 183, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1848, .adv_w = 331, .box_w = 20, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 2028, .adv_w = 234, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2140, .adv_w = 242, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2231, .adv_w = 231, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2329, .adv_w = 264, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2427, .adv_w = 214, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2504, .adv_w = 203, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2574, .adv_w = 247, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2672, .adv_w = 260, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2763, .adv_w = 99, .box_w = 3, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2784, .adv_w = 164, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2854, .adv_w = 230, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2945, .adv_w = 190, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3015, .adv_w = 306, .box_w = 15, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3120, .adv_w = 260, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3211, .adv_w = 269, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3323, .adv_w = 231, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3407, .adv_w = 269, .box_w = 17, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3552, .adv_w = 233, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3636, .adv_w = 199, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3720, .adv_w = 188, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3804, .adv_w = 253, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3895, .adv_w = 228, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4007, .adv_w = 360, .box_w = 22, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4161, .adv_w = 215, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4259, .adv_w = 207, .box_w = 15, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4364, .adv_w = 210, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4455, .adv_w = 107, .box_w = 5, .box_h = 19, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 4503, .adv_w = 113, .box_w = 9, .box_h = 20, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 4593, .adv_w = 107, .box_w = 5, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 4641, .adv_w = 187, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 4686, .adv_w = 160, .box_w = 10, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4701, .adv_w = 192, .box_w = 6, .box_h = 3, .ofs_x = 2, .ofs_y = 12}, + {.bitmap_index = 4710, .adv_w = 191, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4765, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4855, .adv_w = 183, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4916, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5006, .adv_w = 196, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5072, .adv_w = 113, .box_w = 8, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5132, .adv_w = 221, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 5222, .adv_w = 218, .box_w = 11, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5305, .adv_w = 89, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5335, .adv_w = 91, .box_w = 7, .box_h = 19, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 5402, .adv_w = 197, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5492, .adv_w = 89, .box_w = 3, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5515, .adv_w = 338, .box_w = 19, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5620, .adv_w = 218, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5681, .adv_w = 203, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5747, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 5837, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 5927, .adv_w = 131, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5966, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6021, .adv_w = 132, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6077, .adv_w = 217, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6138, .adv_w = 179, .box_w = 13, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 6210, .adv_w = 288, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6309, .adv_w = 177, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6370, .adv_w = 179, .box_w = 13, .box_h = 15, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 6468, .adv_w = 167, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6523, .adv_w = 112, .box_w = 6, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 6580, .adv_w = 96, .box_w = 2, .box_h = 19, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 6599, .adv_w = 112, .box_w = 6, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 6656, .adv_w = 186, .box_w = 10, .box_h = 4, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 6676, .adv_w = 134, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 6708, .adv_w = 100, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 6716, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 6926, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7076, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7266, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7416, .adv_w = 220, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7521, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 7731, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 7941, .adv_w = 360, .box_w = 23, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8160, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 8370, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8543, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 8753, .adv_w = 160, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8833, .adv_w = 240, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8953, .adv_w = 360, .box_w = 23, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9172, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9322, .adv_w = 220, .box_w = 14, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9469, .adv_w = 280, .box_w = 13, .box_h = 19, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 9593, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9782, .adv_w = 280, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9953, .adv_w = 280, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10124, .adv_w = 280, .box_w = 13, .box_h = 19, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 10248, .adv_w = 280, .box_w = 19, .box_h = 19, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 10429, .adv_w = 200, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 10534, .adv_w = 200, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 10639, .adv_w = 280, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10810, .adv_w = 280, .box_w = 18, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 10855, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11028, .adv_w = 400, .box_w = 26, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 11301, .adv_w = 360, .box_w = 24, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 11553, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11743, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 11842, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 11941, .adv_w = 400, .box_w = 26, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 12149, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12299, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12509, .adv_w = 320, .box_w = 21, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 12730, .adv_w = 280, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 12901, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 13090, .adv_w = 280, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13261, .adv_w = 280, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 13414, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13564, .adv_w = 200, .box_w = 14, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 13711, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 13900, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 14089, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14262, .adv_w = 320, .box_w = 22, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 14493, .adv_w = 240, .box_w = 15, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 14651, .adv_w = 400, .box_w = 25, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14889, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15052, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15215, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15378, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15541, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15704, .adv_w = 400, .box_w = 26, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15925, .adv_w = 280, .box_w = 16, .box_h = 21, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 16093, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 16282, .adv_w = 320, .box_w = 21, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 16503, .adv_w = 400, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16691, .adv_w = 240, .box_w = 15, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 16849, .adv_w = 322, .box_w = 21, .box_h = 13, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 3, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 14, 0, 9, -7, 0, 0, + 0, 0, -18, -19, 2, 15, 7, 5, + -13, 2, 16, 1, 13, 3, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 3, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, -10, 0, 0, 0, 0, + 0, -6, 5, 6, 0, 0, -3, 0, + -2, 3, 0, -3, 0, -3, -2, -6, + 0, 0, 0, 0, -3, 0, 0, -4, + -5, 0, 0, -3, 0, -6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + -3, 0, -5, 0, -9, 0, -39, 0, + 0, -6, 0, 6, 10, 0, 0, -6, + 3, 3, 11, 6, -5, 6, 0, 0, + -18, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -9, -4, -16, 0, -13, + -2, 0, 0, 0, 0, 1, 12, 0, + -10, -3, -1, 1, 0, -5, 0, 0, + -2, -24, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -26, -3, 12, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 11, + 0, 3, 0, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 3, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -12, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 6, 3, 10, -3, 0, 0, 6, -3, + -11, -44, 2, 9, 6, 1, -4, 0, + 12, 0, 10, 0, 10, 0, -30, 0, + -4, 10, 0, 11, -3, 6, 3, 0, + 0, 1, -3, 0, 0, -5, 26, 0, + 26, 0, 10, 0, 13, 4, 5, 10, + 0, 0, 0, -12, 0, 0, 0, 0, + 1, -2, 0, 2, -6, -4, -6, 2, + 0, -3, 0, 0, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -21, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -18, 0, -20, 0, 0, 0, + 0, -2, 0, 32, -4, -4, 3, 3, + -3, 0, -4, 3, 0, 0, -17, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -31, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -20, 0, 19, 0, 0, -12, 0, + 11, 0, -22, -31, -22, -6, 10, 0, + 0, -21, 0, 4, -7, 0, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 10, -39, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 2, 0, 0, 0, + 0, 0, 2, 2, -4, -6, 0, -1, + -1, -3, 0, 0, -2, 0, 0, 0, + -6, 0, -3, 0, -7, -6, 0, -8, + -11, -11, -6, 0, -6, 0, -6, 0, + 0, 0, 0, -3, 0, 0, 3, 0, + 2, -3, 0, 1, 0, 0, 0, 3, + -2, 0, 0, 0, -2, 3, 3, -1, + 0, 0, 0, -6, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 4, -2, 0, + -4, 0, -5, 0, 0, -2, 0, 10, + 0, 0, -3, 0, 0, 0, 0, 0, + -1, 1, -2, -2, 0, 0, -3, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, -3, -4, 0, + 0, 0, 0, 0, 1, 0, 0, -2, + 0, -3, -3, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, -2, -4, 0, -5, 0, -10, + -2, -10, 6, 0, 0, -6, 3, 6, + 9, 0, -8, -1, -4, 0, -1, -15, + 3, -2, 2, -17, 3, 0, 0, 1, + -17, 0, -17, -3, -28, -2, 0, -16, + 0, 6, 9, 0, 4, 0, 0, 0, + 0, 1, 0, -6, -4, 0, -10, 0, + 0, 0, -3, 0, 0, 0, -3, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + -4, 0, 0, 0, 0, 0, 0, 0, + -3, -3, 0, -2, -4, -3, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, -3, 0, -4, + 0, -2, 0, -6, 3, 0, 0, -4, + 2, 3, 3, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 2, + 0, 0, -3, 0, -3, -2, -4, 0, + 0, 0, 0, 0, 0, 0, 3, 0, + -3, 0, 0, 0, 0, -4, -5, 0, + -6, 0, 10, -2, 1, -10, 0, 0, + 9, -16, -17, -13, -6, 3, 0, -3, + -21, -6, 0, -6, 0, -6, 5, -6, + -20, 0, -9, 0, 0, 2, -1, 3, + -2, 0, 3, 0, -10, -12, 0, -16, + -8, -7, -8, -10, -4, -9, -1, -6, + -9, 2, 0, 1, 0, -3, 0, 0, + 0, 2, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, -2, 0, -1, -3, 0, -5, -7, + -7, -1, 0, -10, 0, 0, 0, 0, + 0, 0, -3, 0, 0, 0, 0, 1, + -2, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 15, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + -6, 0, 0, 0, 0, -16, -10, 0, + 0, 0, -5, -16, 0, 0, -3, 3, + 0, -9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, -6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, -6, 0, + 0, 0, 0, 4, 0, 2, -6, -6, + 0, -3, -3, -4, 0, 0, 0, 0, + 0, 0, -10, 0, -3, 0, -5, -3, + 0, -7, -8, -10, -3, 0, -6, 0, + -10, 0, 0, 0, 0, 26, 0, 0, + 2, 0, 0, -4, 0, 3, 0, -14, + 0, 0, 0, 0, 0, -30, -6, 11, + 10, -3, -13, 0, 3, -5, 0, -16, + -2, -4, 3, -22, -3, 4, 0, 5, + -11, -5, -12, -11, -13, 0, 0, -19, + 0, 18, 0, 0, -2, 0, 0, 0, + -2, -2, -3, -9, -11, -1, -30, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, -2, -3, -5, 0, 0, + -6, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -6, 0, 0, 6, + -1, 4, 0, -7, 3, -2, -1, -8, + -3, 0, -4, -3, -2, 0, -5, -5, + 0, 0, -3, -1, -2, -5, -4, 0, + 0, -3, 0, 3, -2, 0, -7, 0, + 0, 0, -6, 0, -5, 0, -5, -5, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, -6, 3, 0, -4, 0, -2, -4, + -10, -2, -2, -2, -1, -2, -4, -1, + 0, 0, 0, 0, 0, -3, -3, -3, + 0, 0, 0, 0, 4, -2, 0, -2, + 0, 0, 0, -2, -4, -2, -3, -4, + -3, 0, 3, 13, -1, 0, -9, 0, + -2, 6, 0, -3, -13, -4, 5, 0, + 0, -15, -5, 3, -5, 2, 0, -2, + -3, -10, 0, -5, 2, 0, 0, -5, + 0, 0, 0, 3, 3, -6, -6, 0, + -5, -3, -5, -3, -3, 0, -5, 2, + -6, -5, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, -4, + 0, 0, -3, -3, 0, 0, 0, 0, + -3, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + -5, 0, -6, 0, 0, 0, -11, 0, + 2, -7, 6, 1, -2, -15, 0, 0, + -7, -3, 0, -13, -8, -9, 0, 0, + -14, -3, -13, -12, -15, 0, -8, 0, + 3, 21, -4, 0, -7, -3, -1, -3, + -5, -9, -6, -12, -13, -7, -3, 0, + 0, -2, 0, 1, 0, 0, -22, -3, + 10, 7, -7, -12, 0, 1, -10, 0, + -16, -2, -3, 6, -29, -4, 1, 0, + 0, -21, -4, -17, -3, -23, 0, 0, + -22, 0, 19, 1, 0, -2, 0, 0, + 0, 0, -2, -2, -12, -2, 0, -21, + 0, 0, 0, 0, -10, 0, -3, 0, + -1, -9, -15, 0, 0, -2, -5, -10, + -3, 0, -2, 0, 0, 0, 0, -14, + -3, -11, -10, -3, -5, -8, -3, -5, + 0, -6, -3, -11, -5, 0, -4, -6, + -3, -6, 0, 2, 0, -2, -11, 0, + 6, 0, -6, 0, 0, 0, 0, 4, + 0, 2, -6, 13, 0, -3, -3, -4, + 0, 0, 0, 0, 0, 0, -10, 0, + -3, 0, -5, -3, 0, -7, -8, -10, + -3, 0, -6, 3, 13, 0, 0, 0, + 0, 26, 0, 0, 2, 0, 0, -4, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -2, -6, 0, 0, 0, 0, 0, -2, + 0, 0, 0, -3, -3, 0, 0, -6, + -3, 0, 0, -6, 0, 5, -2, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 5, 6, 3, -3, 0, -10, + -5, 0, 10, -11, -10, -6, -6, 13, + 6, 3, -28, -2, 6, -3, 0, -3, + 4, -3, -11, 0, -3, 3, -4, -3, + -10, -3, 0, 0, 10, 6, 0, -9, + 0, -18, -4, 9, -4, -12, 1, -4, + -11, -11, -3, 13, 3, 0, -5, 0, + -9, 0, 3, 11, -7, -12, -13, -8, + 10, 0, 1, -23, -3, 3, -5, -2, + -7, 0, -7, -12, -5, -5, -3, 0, + 0, -7, -7, -3, 0, 10, 7, -3, + -18, 0, -18, -4, 0, -11, -19, -1, + -10, -5, -11, -9, 9, 0, 0, -4, + 0, -6, -3, 0, -3, -6, 0, 5, + -11, 3, 0, 0, -17, 0, -3, -7, + -5, -2, -10, -8, -11, -7, 0, -10, + -3, -7, -6, -10, -3, 0, 0, 1, + 15, -5, 0, -10, -3, 0, -3, -6, + -7, -9, -9, -12, -4, -6, 6, 0, + -5, 0, -16, -4, 2, 6, -10, -12, + -6, -11, 11, -3, 2, -30, -6, 6, + -7, -5, -12, 0, -10, -13, -4, -3, + -3, -3, -7, -10, -1, 0, 0, 10, + 9, -2, -21, 0, -19, -7, 8, -12, + -22, -6, -11, -13, -16, -11, 6, 0, + 0, 0, 0, -4, 0, 0, 3, -4, + 6, 2, -6, 6, 0, 0, -10, -1, + 0, -1, 0, 1, 1, -3, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + 0, 3, 10, 1, 0, -4, 0, 0, + 0, 0, -2, -2, -4, 0, 0, 0, + 1, 3, 0, 0, 0, 0, 3, 0, + -3, 0, 12, 0, 6, 1, 1, -4, + 0, 6, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 0, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -19, 0, -3, 5, 0, 10, + 0, 0, 32, 4, -6, -6, 3, 3, + -2, 1, -16, 0, 0, 15, -19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -22, 12, 45, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, -6, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, -9, 0, + 0, 1, 0, 0, 3, 41, -6, -3, + 10, 9, -9, 3, 0, 0, 3, 3, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -42, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -9, + 0, 0, 0, -9, 0, 0, 0, 0, + -7, -2, 0, 0, 0, -7, 0, -4, + 0, -15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -21, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -3, 0, 0, -6, 0, -5, 0, + -9, 0, 0, 0, -5, 3, -4, 0, + 0, -9, -3, -7, 0, 0, -9, 0, + -3, 0, -15, 0, -4, 0, 0, -26, + -6, -13, -4, -12, 0, 0, -21, 0, + -9, -2, 0, 0, 0, 0, 0, 0, + 0, 0, -5, -6, -3, -5, 0, 0, + 0, 0, -7, 0, -7, 4, -4, 6, + 0, -2, -7, -2, -5, -6, 0, -4, + -2, -2, 2, -9, -1, 0, 0, 0, + -28, -3, -4, 0, -7, 0, -2, -15, + -3, 0, 0, -2, -3, 0, 0, 0, + 0, 2, 0, -2, -5, -2, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 0, + 0, -7, 0, -2, 0, 0, 0, -6, + 3, 0, 0, 0, -9, -3, -6, 0, + 0, -9, 0, -3, 0, -15, 0, 0, + 0, 0, -31, 0, -6, -12, -16, 0, + 0, -21, 0, -2, -5, 0, 0, 0, + 0, 0, 0, 0, 0, -3, -5, -2, + -5, 1, 0, 0, 5, -4, 0, 10, + 16, -3, -3, -10, 4, 16, 5, 7, + -9, 4, 13, 4, 9, 7, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 20, 15, -6, -3, 0, -3, + 26, 14, 26, 0, 0, 0, 3, 0, + 0, 12, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 0, 0, -27, -4, -3, -13, + -16, 0, 0, -21, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, -27, -4, -3, + -13, -16, 0, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, -7, 3, 0, -3, + 3, 6, 3, -10, 0, -1, -3, 3, + 0, 3, 0, 0, 0, 0, -8, 0, + -3, -2, -6, 0, -3, -13, 0, 20, + -3, 0, -7, -2, 0, -2, -5, 0, + -3, -9, -6, -4, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, -27, + -4, -3, -13, -16, 0, 0, -21, 0, + 0, 0, 0, 0, 0, 16, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, -10, -4, -3, 10, -3, -3, + -13, 1, -2, 1, -2, -9, 1, 7, + 1, 3, 1, 3, -8, -13, -4, 0, + -12, -6, -9, -13, -12, 0, -5, -6, + -4, -4, -3, -2, -4, -2, 0, -2, + -1, 5, 0, 5, -2, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2, -3, -3, 0, 0, + -9, 0, -2, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, -3, 0, -4, + 0, 0, 0, 0, -3, 0, 0, -5, + -3, 3, 0, -5, -6, -2, 0, -9, + -2, -7, -2, -4, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -21, 0, 10, 0, 0, -6, 0, + 0, 0, 0, -4, 0, -3, 0, 0, + -2, 0, 0, -2, 0, -7, 0, 0, + 13, -4, -11, -10, 2, 4, 4, -1, + -9, 2, 5, 2, 10, 2, 11, -2, + -9, 0, 0, -13, 0, 0, -10, -9, + 0, 0, -6, 0, -4, -5, 0, -5, + 0, -5, 0, -2, 5, 0, -3, -10, + -3, 12, 0, 0, -3, 0, -6, 0, + 0, 4, -7, 0, 3, -3, 3, 0, + 0, -11, 0, -2, -1, 0, -3, 4, + -3, 0, 0, 0, -13, -4, -7, 0, + -10, 0, 0, -15, 0, 12, -3, 0, + -6, 0, 2, 0, -3, 0, -3, -10, + 0, -3, 3, 0, 0, 0, 0, -2, + 0, 0, 3, -4, 1, 0, 0, -4, + -2, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -20, 0, 7, 0, + 0, -3, 0, 0, 0, 0, 1, 0, + -3, -3, 0, 0, 0, 6, 0, 7, + 0, 0, 0, 0, 0, -20, -18, 1, + 14, 10, 5, -13, 2, 13, 0, 12, + 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserrat_20 = { +#else +lv_font_t lv_font_montserrat_20 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 22, /*The maximum line height required by the font*/ + .base_line = 4, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_20*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_22.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_22.c new file mode 100644 index 0000000..d96a666 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_22.c @@ -0,0 +1,3655 @@ +/******************************************************************************* + * Size: 22 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 22 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_22.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_22 + #define LV_FONT_MONTSERRAT_22 1 +#endif + +#if LV_FONT_MONTSERRAT_22 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x4f, 0xf2, 0x3f, 0xf2, 0x3f, 0xf1, 0x2f, 0xf1, + 0x1f, 0xf0, 0x1f, 0xf0, 0xf, 0xf0, 0xf, 0xe0, + 0xf, 0xd0, 0xf, 0xd0, 0xa, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xb0, 0x6f, 0xf5, 0x2d, 0xd1, + + /* U+0022 "\"" */ + 0x9f, 0x30, 0x9f, 0x39, 0xf3, 0x9, 0xf2, 0x8f, + 0x20, 0x9f, 0x28, 0xf2, 0x8, 0xf2, 0x8f, 0x10, + 0x8f, 0x17, 0xf1, 0x8, 0xf1, 0x0, 0x0, 0x0, + 0x0, + + /* U+0023 "#" */ + 0x0, 0x0, 0xf, 0x90, 0x0, 0x4f, 0x40, 0x0, + 0x0, 0x1, 0xf7, 0x0, 0x6, 0xf2, 0x0, 0x0, + 0x0, 0x3f, 0x50, 0x0, 0x8f, 0x0, 0x0, 0x0, + 0x5, 0xf3, 0x0, 0xa, 0xe0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x7a, 0xad, + 0xfa, 0xaa, 0xaf, 0xda, 0xa8, 0x0, 0x0, 0xbd, + 0x0, 0x0, 0xf8, 0x0, 0x0, 0x0, 0xd, 0xb0, + 0x0, 0x2f, 0x60, 0x0, 0x0, 0x0, 0xf9, 0x0, + 0x3, 0xf5, 0x0, 0x0, 0x0, 0x1f, 0x70, 0x0, + 0x5f, 0x30, 0x0, 0x4a, 0xab, 0xfc, 0xaa, 0xac, + 0xfa, 0xaa, 0x16, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x6, 0xf2, 0x0, 0xb, 0xd0, + 0x0, 0x0, 0x0, 0x8f, 0x0, 0x0, 0xdb, 0x0, + 0x0, 0x0, 0xa, 0xe0, 0x0, 0xf, 0x90, 0x0, + 0x0, 0x0, 0xcc, 0x0, 0x1, 0xf7, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xca, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xef, 0xfe, + 0xc7, 0x10, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x3f, 0xf8, 0x1c, 0xa0, 0x4a, 0xa0, 0x9, + 0xfa, 0x0, 0xca, 0x0, 0x0, 0x0, 0xbf, 0x70, + 0xc, 0xa0, 0x0, 0x0, 0x9, 0xfd, 0x0, 0xca, + 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x7d, 0xa0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xfe, 0x94, 0x0, 0x0, + 0x0, 0x6, 0xbf, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0xcc, 0x9f, 0xff, 0x20, 0x0, 0x0, 0xc, + 0xa0, 0x1d, 0xf9, 0x0, 0x0, 0x0, 0xca, 0x0, + 0x7f, 0xb0, 0x42, 0x0, 0xc, 0xa0, 0x9, 0xfa, + 0xd, 0xf8, 0x20, 0xca, 0x17, 0xff, 0x40, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x28, 0xcf, + 0xff, 0xea, 0x40, 0x0, 0x0, 0x0, 0xc, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xca, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x50, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x6d, 0xfd, 0x40, 0x0, 0x0, 0xa, 0xf1, + 0x0, 0x6, 0xf8, 0x5a, 0xf3, 0x0, 0x0, 0x4f, + 0x60, 0x0, 0xe, 0x90, 0x0, 0xcb, 0x0, 0x0, + 0xeb, 0x0, 0x0, 0x1f, 0x50, 0x0, 0x8e, 0x0, + 0x9, 0xf1, 0x0, 0x0, 0x2f, 0x40, 0x0, 0x7e, + 0x0, 0x4f, 0x60, 0x0, 0x0, 0xf, 0x80, 0x0, + 0xbc, 0x0, 0xec, 0x0, 0x0, 0x0, 0x8, 0xf5, + 0x16, 0xf5, 0x9, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x80, 0x3f, 0x70, 0x9f, 0xfb, 0x20, + 0x0, 0x1, 0x31, 0x0, 0xdc, 0x9, 0xf6, 0x5d, + 0xd0, 0x0, 0x0, 0x0, 0x8, 0xf2, 0x1f, 0x60, + 0x2, 0xf6, 0x0, 0x0, 0x0, 0x3f, 0x70, 0x4f, + 0x10, 0x0, 0xd9, 0x0, 0x0, 0x0, 0xdc, 0x0, + 0x6f, 0x0, 0x0, 0xbb, 0x0, 0x0, 0x8, 0xf2, + 0x0, 0x4f, 0x10, 0x0, 0xc9, 0x0, 0x0, 0x3f, + 0x80, 0x0, 0x1f, 0x50, 0x1, 0xf5, 0x0, 0x0, + 0xdd, 0x0, 0x0, 0x8, 0xe5, 0x3c, 0xd0, 0x0, + 0x8, 0xf3, 0x0, 0x0, 0x0, 0x8e, 0xfb, 0x10, + + /* U+0026 "&" */ + 0x0, 0x0, 0x4c, 0xee, 0xc4, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfa, 0xaf, 0xf5, 0x0, 0x0, 0x0, + 0xf, 0xf2, 0x0, 0x2f, 0xc0, 0x0, 0x0, 0x1, + 0xfe, 0x0, 0x0, 0xfd, 0x0, 0x0, 0x0, 0xf, + 0xf2, 0x0, 0x6f, 0x90, 0x0, 0x0, 0x0, 0x8f, + 0xc1, 0x8f, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf8, 0xdf, + 0xa0, 0x0, 0x63, 0x0, 0x3f, 0xf4, 0x1, 0xdf, + 0xa0, 0xe, 0xe0, 0xb, 0xf6, 0x0, 0x1, 0xdf, + 0xa4, 0xf9, 0x0, 0xff, 0x10, 0x0, 0x1, 0xdf, + 0xff, 0x30, 0xe, 0xf4, 0x0, 0x0, 0x1, 0xef, + 0xd0, 0x0, 0x9f, 0xe3, 0x0, 0x2, 0xaf, 0xff, + 0xa0, 0x1, 0xcf, 0xfe, 0xce, 0xff, 0xc3, 0xdf, + 0x80, 0x0, 0x6b, 0xef, 0xeb, 0x50, 0x1, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x9f, 0x39, 0xf3, 0x8f, 0x28, 0xf2, 0x8f, 0x17, + 0xf1, 0x0, 0x0, + + /* U+0028 "(" */ + 0x0, 0x8f, 0x70, 0x1f, 0xf0, 0x8, 0xf8, 0x0, + 0xdf, 0x30, 0x2f, 0xe0, 0x6, 0xfa, 0x0, 0x8f, + 0x80, 0xb, 0xf5, 0x0, 0xcf, 0x40, 0xd, 0xf3, + 0x0, 0xef, 0x20, 0xd, 0xf3, 0x0, 0xcf, 0x40, + 0xb, 0xf5, 0x0, 0x8f, 0x70, 0x5, 0xfa, 0x0, + 0x2f, 0xe0, 0x0, 0xdf, 0x30, 0x7, 0xf8, 0x0, + 0x1f, 0xf0, 0x0, 0x8f, 0x70, + + /* U+0029 ")" */ + 0x1f, 0xe0, 0x0, 0x9, 0xf7, 0x0, 0x2, 0xfe, + 0x0, 0x0, 0xcf, 0x40, 0x0, 0x7f, 0x90, 0x0, + 0x4f, 0xc0, 0x0, 0x1f, 0xf0, 0x0, 0xe, 0xf2, + 0x0, 0xd, 0xf3, 0x0, 0xc, 0xf4, 0x0, 0xb, + 0xf5, 0x0, 0xc, 0xf4, 0x0, 0xd, 0xf3, 0x0, + 0xe, 0xf2, 0x0, 0x1f, 0xf0, 0x0, 0x3f, 0xc0, + 0x0, 0x7f, 0x90, 0x0, 0xcf, 0x40, 0x2, 0xfe, + 0x0, 0x9, 0xf7, 0x0, 0x1f, 0xe0, 0x0, + + /* U+002A "*" */ + 0x0, 0x4, 0xf0, 0x0, 0x0, 0x40, 0x4f, 0x0, + 0x50, 0x5f, 0xb6, 0xf4, 0xdf, 0x20, 0x4d, 0xff, + 0xfc, 0x30, 0x0, 0x8f, 0xff, 0x60, 0x4, 0xef, + 0xaf, 0xaf, 0xc2, 0x2a, 0x13, 0xf0, 0x3b, 0x0, + 0x0, 0x4f, 0x0, 0x0, 0x0, 0x1, 0x60, 0x0, + 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x6d, 0x40, 0x0, 0x0, 0x0, 0x8, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x50, 0x0, + 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x6c, 0xcc, + 0xef, 0xdc, 0xcc, 0x48, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x8f, 0x50, 0x0, 0x0, 0x0, + 0x8, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x50, + 0x0, 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, + + /* U+002C "," */ + 0x3, 0xb, 0xfb, 0xdf, 0xe4, 0xfb, 0x3f, 0x67, + 0xf1, 0xbb, 0x0, + + /* U+002D "-" */ + 0xad, 0xdd, 0xdd, 0x2c, 0xff, 0xff, 0xf2, + + /* U+002E "." */ + 0x0, 0x9, 0xf9, 0xff, 0xe8, 0xf7, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x8, 0xf6, 0x0, 0x0, 0x0, + 0xd, 0xf1, 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, + 0x0, 0x0, 0x9f, 0x50, 0x0, 0x0, 0x0, 0xef, + 0x0, 0x0, 0x0, 0x4, 0xfa, 0x0, 0x0, 0x0, + 0x9, 0xf5, 0x0, 0x0, 0x0, 0xe, 0xf0, 0x0, + 0x0, 0x0, 0x4f, 0x90, 0x0, 0x0, 0x0, 0xaf, + 0x40, 0x0, 0x0, 0x0, 0xfe, 0x0, 0x0, 0x0, + 0x5, 0xf9, 0x0, 0x0, 0x0, 0xa, 0xf3, 0x0, + 0x0, 0x0, 0xf, 0xe0, 0x0, 0x0, 0x0, 0x5f, + 0x80, 0x0, 0x0, 0x0, 0xbf, 0x30, 0x0, 0x0, + 0x1, 0xfd, 0x0, 0x0, 0x0, 0x6, 0xf8, 0x0, + 0x0, 0x0, 0xb, 0xf2, 0x0, 0x0, 0x0, 0x1f, + 0xd0, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x0, 0x0, + 0x0, + + /* U+0030 "0" */ + 0x0, 0x3, 0xae, 0xfd, 0x81, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x6, 0xff, 0x81, + 0x3, 0xbf, 0xf1, 0x0, 0xef, 0x60, 0x0, 0x0, + 0xbf, 0xa0, 0x5f, 0xd0, 0x0, 0x0, 0x3, 0xff, + 0x1a, 0xf8, 0x0, 0x0, 0x0, 0xd, 0xf5, 0xcf, + 0x50, 0x0, 0x0, 0x0, 0xaf, 0x7e, 0xf4, 0x0, + 0x0, 0x0, 0x9, 0xf9, 0xef, 0x40, 0x0, 0x0, + 0x0, 0x9f, 0x9c, 0xf5, 0x0, 0x0, 0x0, 0xa, + 0xf7, 0xaf, 0x80, 0x0, 0x0, 0x0, 0xdf, 0x55, + 0xfd, 0x0, 0x0, 0x0, 0x2f, 0xf1, 0x1e, 0xf6, + 0x0, 0x0, 0xb, 0xfa, 0x0, 0x6f, 0xf7, 0x10, + 0x2b, 0xff, 0x10, 0x0, 0x8f, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x3a, 0xef, 0xd8, 0x10, 0x0, + + /* U+0031 "1" */ + 0xdf, 0xff, 0xfd, 0xcf, 0xff, 0xfd, 0x0, 0x5, + 0xfd, 0x0, 0x5, 0xfd, 0x0, 0x5, 0xfd, 0x0, + 0x5, 0xfd, 0x0, 0x5, 0xfd, 0x0, 0x5, 0xfd, + 0x0, 0x5, 0xfd, 0x0, 0x5, 0xfd, 0x0, 0x5, + 0xfd, 0x0, 0x5, 0xfd, 0x0, 0x5, 0xfd, 0x0, + 0x5, 0xfd, 0x0, 0x5, 0xfd, 0x0, 0x5, 0xfd, + + /* U+0032 "2" */ + 0x0, 0x39, 0xdf, 0xfd, 0x81, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x6f, 0xe7, 0x20, 0x15, + 0xef, 0xc0, 0x6, 0x20, 0x0, 0x0, 0x4f, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xc0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, + + /* U+0033 "3" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x1e, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xa0, 0x0, 0x0, 0x0, + 0x9, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x46, 0x8b, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf8, + 0x6, 0x0, 0x0, 0x0, 0x1e, 0xf6, 0x8f, 0xc5, + 0x10, 0x14, 0xcf, 0xe0, 0x6f, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x1, 0x7b, 0xef, 0xed, 0x81, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x30, 0x3, 0x63, 0x0, 0x0, 0x1, 0xef, 0x70, + 0x0, 0x8f, 0x80, 0x0, 0x0, 0xbf, 0xb0, 0x0, + 0x8, 0xf8, 0x0, 0x0, 0x7f, 0xe1, 0x0, 0x0, + 0x8f, 0x80, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x62, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x80, 0x0, + + /* U+0035 "5" */ + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xec, + 0x82, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x14, 0xbf, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfc, + 0x7, 0x0, 0x0, 0x0, 0xc, 0xf9, 0x4f, 0xe7, + 0x20, 0x3, 0xbf, 0xf3, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x5a, 0xdf, 0xfd, 0x92, 0x0, + + /* U+0036 "6" */ + 0x0, 0x1, 0x7c, 0xef, 0xdb, 0x60, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xd0, 0x3, 0xff, 0xb3, 0x0, + 0x4, 0x40, 0xd, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0x50, 0x6a, 0xcb, + 0x82, 0x0, 0xef, 0x6d, 0xff, 0xff, 0xff, 0x60, + 0xef, 0xff, 0x71, 0x2, 0xaf, 0xf4, 0xdf, 0xf4, + 0x0, 0x0, 0xa, 0xfb, 0xbf, 0xe0, 0x0, 0x0, + 0x4, 0xfe, 0x8f, 0xd0, 0x0, 0x0, 0x3, 0xfe, + 0x2f, 0xf2, 0x0, 0x0, 0x8, 0xfb, 0x9, 0xfd, + 0x40, 0x0, 0x6f, 0xf4, 0x0, 0xaf, 0xfe, 0xdf, + 0xff, 0x70, 0x0, 0x5, 0xbe, 0xfe, 0xa3, 0x0, + + /* U+0037 "7" */ + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x45, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x5f, 0xc0, 0x0, + 0x0, 0x6, 0xfd, 0x5, 0xfc, 0x0, 0x0, 0x0, + 0xdf, 0x60, 0x4d, 0x90, 0x0, 0x0, 0x4f, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf4, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x2, 0x9d, 0xff, 0xd9, 0x30, 0x0, 0x0, + 0x4f, 0xff, 0xee, 0xff, 0xf7, 0x0, 0x1, 0xff, + 0xa1, 0x0, 0x19, 0xff, 0x20, 0x5, 0xfe, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x7, 0xfc, 0x0, 0x0, + 0x0, 0x8f, 0x90, 0x4, 0xfe, 0x10, 0x0, 0x0, + 0xcf, 0x70, 0x0, 0xcf, 0xc4, 0x10, 0x3b, 0xfe, + 0x10, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x8f, 0xfe, 0xcc, 0xef, 0xfa, 0x0, 0x7, + 0xfe, 0x50, 0x0, 0x3, 0xdf, 0x90, 0xe, 0xf5, + 0x0, 0x0, 0x0, 0x3f, 0xf0, 0xf, 0xf3, 0x0, + 0x0, 0x0, 0xf, 0xf2, 0xe, 0xf7, 0x0, 0x0, + 0x0, 0x4f, 0xf0, 0x7, 0xff, 0x60, 0x0, 0x5, + 0xef, 0xa0, 0x0, 0xaf, 0xff, 0xed, 0xff, 0xfc, + 0x10, 0x0, 0x4, 0xad, 0xff, 0xeb, 0x50, 0x0, + + /* U+0039 "9" */ + 0x0, 0x7, 0xcf, 0xfd, 0x91, 0x0, 0x0, 0x1c, + 0xff, 0xed, 0xff, 0xf4, 0x0, 0xb, 0xfd, 0x30, + 0x0, 0x8f, 0xf2, 0x2, 0xff, 0x20, 0x0, 0x0, + 0x9f, 0xb0, 0x5f, 0xd0, 0x0, 0x0, 0x3, 0xff, + 0x15, 0xfd, 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x2f, + 0xf3, 0x0, 0x0, 0xb, 0xff, 0x60, 0xbf, 0xe6, + 0x10, 0x3a, 0xff, 0xf7, 0x1, 0xcf, 0xff, 0xff, + 0xf9, 0xbf, 0x70, 0x0, 0x5a, 0xcc, 0x94, 0xc, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xf6, 0x0, 0x7, 0x20, 0x1, + 0x6e, 0xfb, 0x0, 0x5, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x18, 0xce, 0xfd, 0xa4, 0x0, 0x0, + + /* U+003A ":" */ + 0x8f, 0x8f, 0xfe, 0x9f, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf9, 0xff, + 0xe8, 0xf7, + + /* U+003B ";" */ + 0x8f, 0x8f, 0xfe, 0x9f, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf8, 0xef, + 0xe7, 0xfc, 0x2f, 0x76, 0xf2, 0xac, 0x3, 0x20, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x17, 0x30, 0x0, 0x0, + 0x3, 0xaf, 0xf5, 0x0, 0x1, 0x7d, 0xff, 0xc6, + 0x0, 0x3a, 0xff, 0xe9, 0x20, 0x0, 0x7f, 0xfc, + 0x50, 0x0, 0x0, 0x8, 0xfe, 0x71, 0x0, 0x0, + 0x0, 0x18, 0xef, 0xfa, 0x40, 0x0, 0x0, 0x0, + 0x5b, 0xff, 0xe7, 0x10, 0x0, 0x0, 0x2, 0x8e, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x5, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003D "=" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x56, 0xcc, 0xcc, + 0xcc, 0xcc, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xcc, 0xcc, 0xcc, 0xcc, + 0xc4, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x50, + + /* U+003E ">" */ + 0x56, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfe, 0x92, + 0x0, 0x0, 0x0, 0x17, 0xdf, 0xfc, 0x50, 0x0, + 0x0, 0x0, 0x4a, 0xff, 0xe8, 0x20, 0x0, 0x0, + 0x1, 0x6d, 0xff, 0x40, 0x0, 0x0, 0x2, 0x8f, + 0xf5, 0x0, 0x0, 0x5c, 0xff, 0xd7, 0x0, 0x29, + 0xef, 0xfa, 0x30, 0x0, 0x7f, 0xfd, 0x71, 0x0, + 0x0, 0x8, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x4a, 0xdf, 0xfd, 0x81, 0x0, 0xa, 0xff, + 0xfe, 0xff, 0xfe, 0x30, 0x8f, 0xe5, 0x0, 0x4, + 0xef, 0xc0, 0x6, 0x10, 0x0, 0x0, 0x5f, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x4f, 0xf6, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xb, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xd, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xe3, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xd9, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, 0xea, 0x87, + 0x8a, 0xef, 0xd4, 0x0, 0x0, 0x0, 0xa, 0xfc, + 0x40, 0x0, 0x0, 0x0, 0x4d, 0xf8, 0x0, 0x0, + 0xb, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xf7, 0x0, 0x6, 0xf9, 0x0, 0x5, 0xcf, 0xfc, + 0x50, 0xfe, 0xa, 0xf3, 0x0, 0xec, 0x0, 0xa, + 0xff, 0xdc, 0xef, 0x9f, 0xe0, 0xe, 0xc0, 0x6f, + 0x40, 0x7, 0xfd, 0x20, 0x0, 0x8f, 0xfe, 0x0, + 0x6f, 0x2a, 0xf0, 0x0, 0xef, 0x20, 0x0, 0x0, + 0xaf, 0xe0, 0x1, 0xf6, 0xdc, 0x0, 0x4f, 0xb0, + 0x0, 0x0, 0x3, 0xfe, 0x0, 0xe, 0x9e, 0xa0, + 0x6, 0xf9, 0x0, 0x0, 0x0, 0xf, 0xe0, 0x0, + 0xda, 0xea, 0x0, 0x6f, 0x90, 0x0, 0x0, 0x0, + 0xfe, 0x0, 0xd, 0xad, 0xc0, 0x4, 0xfb, 0x0, + 0x0, 0x0, 0x3f, 0xe0, 0x0, 0xe9, 0xaf, 0x0, + 0xe, 0xf2, 0x0, 0x0, 0xa, 0xfe, 0x0, 0x2f, + 0x65, 0xf5, 0x0, 0x7f, 0xd2, 0x0, 0x8, 0xff, + 0xf1, 0x9, 0xf1, 0xe, 0xd0, 0x0, 0xaf, 0xfc, + 0xce, 0xf9, 0x9f, 0xec, 0xf8, 0x0, 0x6f, 0x90, + 0x0, 0x5c, 0xff, 0xc5, 0x1, 0xbf, 0xe7, 0x0, + 0x0, 0xaf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xc4, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, + 0xfe, 0xa8, 0x89, 0xbf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xad, 0xff, 0xec, 0x83, 0x0, + 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x4, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xee, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x87, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x21, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfb, 0x0, 0xaf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xf4, 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xd0, 0x0, 0xc, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0x60, 0x0, 0x5, 0xfd, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x0, 0x0, 0x0, 0xef, + 0x40, 0x0, 0x0, 0x9, 0xff, 0xcc, 0xcc, 0xcc, + 0xef, 0xb0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x7f, 0xb0, 0x0, + 0x0, 0x0, 0xa, 0xf9, 0x0, 0x0, 0xef, 0x40, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x10, 0x5, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, 0xc, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xe0, + + /* U+0042 "B" */ + 0xbf, 0xff, 0xff, 0xff, 0xeb, 0x50, 0x0, 0xbf, + 0xed, 0xdd, 0xdd, 0xff, 0xfa, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x7, 0xff, 0x50, 0xbf, 0x80, 0x0, + 0x0, 0x0, 0xbf, 0xa0, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x8f, 0xb0, 0xbf, 0x80, 0x0, 0x0, 0x0, + 0xbf, 0x80, 0xbf, 0x80, 0x0, 0x0, 0x7, 0xff, + 0x20, 0xbf, 0xed, 0xdd, 0xdd, 0xff, 0xf4, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0xbf, + 0x80, 0x0, 0x0, 0x14, 0xcf, 0xd0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0xe, 0xf5, 0xbf, 0x80, 0x0, + 0x0, 0x0, 0xb, 0xf8, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0xd, 0xf7, 0xbf, 0x80, 0x0, 0x0, 0x1, + 0x9f, 0xf2, 0xbf, 0xed, 0xdd, 0xdd, 0xef, 0xff, + 0x70, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x93, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x29, 0xdf, 0xfe, 0xa5, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0xcf, 0xfa, 0x41, 0x2, 0x6e, 0xfc, 0x0, 0x9f, + 0xf5, 0x0, 0x0, 0x0, 0x9, 0x20, 0x2f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x92, 0x0, 0xc, 0xff, 0xa4, 0x10, 0x16, 0xef, + 0xc0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x0, 0x3, 0x9d, 0xff, 0xea, 0x50, 0x0, + + /* U+0044 "D" */ + 0xbf, 0xff, 0xff, 0xfe, 0xd9, 0x30, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x38, 0xff, 0xe1, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x2d, 0xfc, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x2, 0xff, 0x60, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xc0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf1, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf1, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xb0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x2, 0xff, 0x60, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x2d, 0xfc, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x38, 0xff, 0xe1, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0xbf, 0xff, 0xff, 0xfe, 0xd9, 0x30, 0x0, 0x0, + + /* U+0045 "E" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfe, 0xee, 0xee, 0xee, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0x30, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf7, + + /* U+0046 "F" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0x30, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0x30, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x29, 0xdf, 0xfe, 0xb6, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0xcf, 0xfa, 0x41, 0x1, 0x5c, 0xfe, 0x0, 0x9f, + 0xf5, 0x0, 0x0, 0x0, 0x8, 0x30, 0x2f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x10, 0xef, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x1c, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf1, 0x8f, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x12, 0xff, 0x50, 0x0, 0x0, 0x0, + 0xf, 0xf1, 0x9, 0xff, 0x50, 0x0, 0x0, 0x0, + 0xff, 0x10, 0xc, 0xff, 0xa4, 0x10, 0x25, 0xcf, + 0xf1, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x2, 0x9d, 0xff, 0xeb, 0x60, 0x0, + + /* U+0048 "H" */ + 0xbf, 0x80, 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, + 0x80, 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, + 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, + 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xa, + 0xf8, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, + 0x80, 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, + 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, + 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xa, + 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xa, 0xf8, + + /* U+0049 "I" */ + 0xbf, 0x8b, 0xf8, 0xbf, 0x8b, 0xf8, 0xbf, 0x8b, + 0xf8, 0xbf, 0x8b, 0xf8, 0xbf, 0x8b, 0xf8, 0xbf, + 0x8b, 0xf8, 0xbf, 0x8b, 0xf8, 0xbf, 0x8b, 0xf8, + + /* U+004A "J" */ + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x10, 0x9, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x1, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x1f, 0xf1, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x10, 0x0, 0x0, 0x0, 0x1f, + 0xf1, 0x0, 0x0, 0x0, 0x1, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x1f, 0xf1, 0x0, 0x0, 0x0, 0x1, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x1f, 0xf1, 0x0, + 0x0, 0x0, 0x1, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x2f, 0xf0, 0x3, 0x50, 0x0, 0x5, 0xfe, 0x0, + 0xef, 0x70, 0x3, 0xef, 0x90, 0x8, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x4, 0xae, 0xfe, 0x91, 0x0, + + /* U+004B "K" */ + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x9f, 0xd1, 0xbf, + 0x80, 0x0, 0x0, 0x8, 0xfe, 0x10, 0xbf, 0x80, + 0x0, 0x0, 0x7f, 0xe2, 0x0, 0xbf, 0x80, 0x0, + 0x6, 0xff, 0x30, 0x0, 0xbf, 0x80, 0x0, 0x5f, + 0xf4, 0x0, 0x0, 0xbf, 0x80, 0x4, 0xff, 0x50, + 0x0, 0x0, 0xbf, 0x80, 0x3f, 0xf7, 0x0, 0x0, + 0x0, 0xbf, 0x83, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0xbf, 0xae, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xb4, 0xff, 0x90, 0x0, 0x0, 0xbf, 0xfc, + 0x0, 0x5f, 0xf6, 0x0, 0x0, 0xbf, 0xc0, 0x0, + 0x8, 0xff, 0x30, 0x0, 0xbf, 0x80, 0x0, 0x0, + 0xbf, 0xe1, 0x0, 0xbf, 0x80, 0x0, 0x0, 0xd, + 0xfc, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x1, 0xef, + 0x90, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x3f, 0xf6, + + /* U+004C "L" */ + 0xbf, 0x80, 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, + 0xb, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xb, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0xb, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0x80, 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xb, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xcb, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+004D "M" */ + 0xbf, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xab, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xfa, 0xbf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xab, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfa, 0xbf, 0xef, 0xa0, 0x0, 0x0, 0x0, + 0xaf, 0xef, 0xab, 0xf7, 0xef, 0x30, 0x0, 0x0, + 0x3f, 0xd7, 0xfa, 0xbf, 0x65, 0xfc, 0x0, 0x0, + 0xc, 0xf5, 0x6f, 0xab, 0xf6, 0xc, 0xf6, 0x0, + 0x5, 0xfc, 0x6, 0xfa, 0xbf, 0x60, 0x3f, 0xe0, + 0x0, 0xef, 0x30, 0x6f, 0xbb, 0xf6, 0x0, 0xaf, + 0x80, 0x7f, 0x90, 0x6, 0xfb, 0xbf, 0x60, 0x1, + 0xff, 0x3f, 0xf1, 0x0, 0x6f, 0xbb, 0xf6, 0x0, + 0x7, 0xff, 0xf7, 0x0, 0x6, 0xfb, 0xbf, 0x60, + 0x0, 0xe, 0xfd, 0x0, 0x0, 0x6f, 0xbb, 0xf6, + 0x0, 0x0, 0x5f, 0x50, 0x0, 0x6, 0xfb, 0xbf, + 0x60, 0x0, 0x0, 0x10, 0x0, 0x0, 0x6f, 0xbb, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfb, + + /* U+004E "N" */ + 0xbf, 0x70, 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, + 0xf4, 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0xfe, + 0x10, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0xff, 0xc0, + 0x0, 0x0, 0xa, 0xf8, 0xbf, 0xbf, 0xf9, 0x0, + 0x0, 0xa, 0xf8, 0xbf, 0x86, 0xff, 0x50, 0x0, + 0xa, 0xf8, 0xbf, 0x80, 0x9f, 0xf2, 0x0, 0xa, + 0xf8, 0xbf, 0x80, 0xc, 0xfd, 0x0, 0xa, 0xf8, + 0xbf, 0x80, 0x2, 0xef, 0xb0, 0xa, 0xf8, 0xbf, + 0x80, 0x0, 0x4f, 0xf7, 0xa, 0xf8, 0xbf, 0x80, + 0x0, 0x8, 0xff, 0x4a, 0xf8, 0xbf, 0x80, 0x0, + 0x0, 0xbf, 0xeb, 0xf8, 0xbf, 0x80, 0x0, 0x0, + 0x1e, 0xff, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x3, + 0xff, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x6f, + 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xa, 0xf8, + + /* U+004F "O" */ + 0x0, 0x0, 0x28, 0xdf, 0xfe, 0xb6, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0xbf, 0xfa, 0x41, 0x2, 0x7e, 0xff, + 0x40, 0x0, 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x1b, + 0xfe, 0x10, 0x2f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfa, 0x8, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf1, 0xcf, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x4e, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf6, 0xef, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0x6c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf4, 0x8f, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x12, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xa0, 0x8, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xbf, 0xe2, 0x0, 0xc, + 0xff, 0xa4, 0x10, 0x26, 0xef, 0xf4, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x0, 0x2, 0x9d, 0xff, 0xeb, 0x60, 0x0, 0x0, + + /* U+0050 "P" */ + 0xbf, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0xbf, 0x80, 0x0, + 0x1, 0x6e, 0xfd, 0xb, 0xf8, 0x0, 0x0, 0x0, + 0x1e, 0xf6, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x9f, + 0xab, 0xf8, 0x0, 0x0, 0x0, 0x7, 0xfb, 0xbf, + 0x80, 0x0, 0x0, 0x0, 0x9f, 0xab, 0xf8, 0x0, + 0x0, 0x0, 0x1e, 0xf6, 0xbf, 0x80, 0x0, 0x1, + 0x6e, 0xfd, 0xb, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0xbf, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0xb, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x28, 0xdf, 0xfe, 0xb6, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x41, 0x2, 0x7e, + 0xff, 0x40, 0x0, 0x8, 0xff, 0x50, 0x0, 0x0, + 0x1, 0xbf, 0xe1, 0x0, 0x2f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xfa, 0x0, 0x8f, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x0, 0xcf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x40, 0xef, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x60, + 0xef, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0x50, 0xcf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x40, 0x8f, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0x0, 0x2f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xfa, 0x0, 0xa, 0xff, 0x30, 0x0, + 0x0, 0x0, 0xaf, 0xf2, 0x0, 0x0, 0xdf, 0xf9, + 0x30, 0x1, 0x6d, 0xff, 0x50, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0xef, 0xff, 0xd6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe5, 0x0, 0x7, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xec, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, + 0xef, 0xd7, 0x0, + + /* U+0052 "R" */ + 0xbf, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0xbf, 0x80, 0x0, + 0x1, 0x6e, 0xfd, 0xb, 0xf8, 0x0, 0x0, 0x0, + 0x1e, 0xf6, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x9f, + 0xab, 0xf8, 0x0, 0x0, 0x0, 0x7, 0xfb, 0xbf, + 0x80, 0x0, 0x0, 0x0, 0x9f, 0x9b, 0xf8, 0x0, + 0x0, 0x0, 0x1e, 0xf5, 0xbf, 0x80, 0x0, 0x1, + 0x5d, 0xfd, 0xb, 0xff, 0xee, 0xef, 0xff, 0xfd, + 0x20, 0xbf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xb, + 0xf8, 0x0, 0x0, 0x5f, 0xe1, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0xbf, 0xa0, 0xb, 0xf8, 0x0, 0x0, + 0x1, 0xef, 0x50, 0xbf, 0x80, 0x0, 0x0, 0x6, + 0xfe, 0x1b, 0xf8, 0x0, 0x0, 0x0, 0xb, 0xfa, + + /* U+0053 "S" */ + 0x0, 0x2, 0x9d, 0xff, 0xeb, 0x60, 0x0, 0x6, + 0xff, 0xff, 0xef, 0xff, 0xe0, 0x3, 0xff, 0x92, + 0x0, 0x4, 0xba, 0x0, 0x9f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xe7, 0x20, 0x0, 0x0, 0x0, 0x4, 0xef, + 0xff, 0xea, 0x50, 0x0, 0x0, 0x0, 0x6b, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x38, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xfb, 0x4, 0x20, + 0x0, 0x0, 0x0, 0xaf, 0x90, 0xdf, 0x94, 0x0, + 0x1, 0x8f, 0xf3, 0x7, 0xff, 0xff, 0xef, 0xff, + 0xf7, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0x92, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xa, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0x80, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0x80, 0x0, 0x0, + + /* U+0055 "U" */ + 0xdf, 0x60, 0x0, 0x0, 0x0, 0xf, 0xf3, 0xdf, + 0x60, 0x0, 0x0, 0x0, 0xf, 0xf3, 0xdf, 0x60, + 0x0, 0x0, 0x0, 0xf, 0xf3, 0xdf, 0x60, 0x0, + 0x0, 0x0, 0xf, 0xf3, 0xdf, 0x60, 0x0, 0x0, + 0x0, 0xf, 0xf3, 0xdf, 0x60, 0x0, 0x0, 0x0, + 0xf, 0xf3, 0xdf, 0x60, 0x0, 0x0, 0x0, 0xf, + 0xf3, 0xdf, 0x60, 0x0, 0x0, 0x0, 0xf, 0xf3, + 0xdf, 0x60, 0x0, 0x0, 0x0, 0xf, 0xf3, 0xcf, + 0x60, 0x0, 0x0, 0x0, 0xf, 0xf2, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x1f, 0xf1, 0x8f, 0xc0, 0x0, + 0x0, 0x0, 0x5f, 0xe0, 0x2f, 0xf5, 0x0, 0x0, + 0x0, 0xdf, 0x80, 0xa, 0xff, 0x71, 0x0, 0x4d, + 0xfe, 0x10, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x5, 0xbe, 0xff, 0xc7, 0x10, 0x0, + + /* U+0056 "V" */ + 0xc, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0x70, 0x6f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xf1, 0x0, 0xef, 0x60, 0x0, 0x0, 0x0, 0x9, + 0xfa, 0x0, 0x8, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x30, 0x0, 0x1f, 0xf4, 0x0, 0x0, 0x0, + 0x6f, 0xc0, 0x0, 0x0, 0xbf, 0xa0, 0x0, 0x0, + 0xd, 0xf5, 0x0, 0x0, 0x4, 0xff, 0x10, 0x0, + 0x4, 0xfe, 0x0, 0x0, 0x0, 0xd, 0xf8, 0x0, + 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x6f, 0xe0, + 0x0, 0x2f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x50, 0x8, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xfc, 0x0, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf3, 0x6f, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0x9d, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf2, 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0x2f, 0xf2, 0x0, 0x0, 0x0, 0xb, 0xfa, 0x0, + 0x0, 0x0, 0x2, 0xfe, 0x0, 0xdf, 0x70, 0x0, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x8f, + 0x90, 0x7, 0xfc, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x40, 0x0, 0x0, 0xd, 0xf4, 0x0, 0x2f, 0xf1, + 0x0, 0x0, 0xb, 0xfc, 0xf9, 0x0, 0x0, 0x2, + 0xfe, 0x0, 0x0, 0xdf, 0x60, 0x0, 0x0, 0xff, + 0x3f, 0xe0, 0x0, 0x0, 0x7f, 0x90, 0x0, 0x8, + 0xfb, 0x0, 0x0, 0x5f, 0xa0, 0xdf, 0x40, 0x0, + 0xc, 0xf4, 0x0, 0x0, 0x3f, 0xf1, 0x0, 0xb, + 0xf5, 0x8, 0xf9, 0x0, 0x2, 0xff, 0x0, 0x0, + 0x0, 0xef, 0x50, 0x1, 0xff, 0x0, 0x3f, 0xe0, + 0x0, 0x7f, 0xa0, 0x0, 0x0, 0x8, 0xfa, 0x0, + 0x5f, 0xa0, 0x0, 0xdf, 0x30, 0xc, 0xf5, 0x0, + 0x0, 0x0, 0x3f, 0xf0, 0xb, 0xf5, 0x0, 0x8, + 0xf9, 0x1, 0xff, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x51, 0xff, 0x0, 0x0, 0x3f, 0xe0, 0x6f, 0xb0, + 0x0, 0x0, 0x0, 0x9, 0xfa, 0x6f, 0xa0, 0x0, + 0x0, 0xdf, 0x3c, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xfb, 0xf5, 0x0, 0x0, 0x8, 0xfa, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xef, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x10, 0x0, 0x0, + + /* U+0058 "X" */ + 0x1e, 0xf7, 0x0, 0x0, 0x0, 0xa, 0xfc, 0x0, + 0x5f, 0xf3, 0x0, 0x0, 0x5, 0xff, 0x10, 0x0, + 0x9f, 0xd0, 0x0, 0x1, 0xef, 0x50, 0x0, 0x0, + 0xdf, 0x90, 0x0, 0xbf, 0xa0, 0x0, 0x0, 0x3, + 0xff, 0x40, 0x6f, 0xe1, 0x0, 0x0, 0x0, 0x8, + 0xfe, 0x3f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xbf, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x90, 0xdf, + 0xa0, 0x0, 0x0, 0x0, 0x8f, 0xd0, 0x2, 0xff, + 0x50, 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x7, 0xfe, + 0x10, 0x0, 0x1e, 0xf8, 0x0, 0x0, 0xc, 0xfb, + 0x0, 0xa, 0xfd, 0x0, 0x0, 0x0, 0x1f, 0xf7, + 0x5, 0xff, 0x20, 0x0, 0x0, 0x0, 0x5f, 0xf2, + + /* U+0059 "Y" */ + 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf1, + 0x3, 0xff, 0x20, 0x0, 0x0, 0x0, 0xbf, 0x70, + 0x0, 0xaf, 0xb0, 0x0, 0x0, 0x5, 0xfd, 0x0, + 0x0, 0x1f, 0xf4, 0x0, 0x0, 0xe, 0xf4, 0x0, + 0x0, 0x7, 0xfd, 0x0, 0x0, 0x8f, 0xb0, 0x0, + 0x0, 0x0, 0xdf, 0x70, 0x1, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x4f, 0xf1, 0xa, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xfa, 0x4f, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xef, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0x90, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+005B "[" */ + 0xbf, 0xff, 0xeb, 0xfd, 0xcb, 0xbf, 0x60, 0xb, + 0xf6, 0x0, 0xbf, 0x60, 0xb, 0xf6, 0x0, 0xbf, + 0x60, 0xb, 0xf6, 0x0, 0xbf, 0x60, 0xb, 0xf6, + 0x0, 0xbf, 0x60, 0xb, 0xf6, 0x0, 0xbf, 0x60, + 0xb, 0xf6, 0x0, 0xbf, 0x60, 0xb, 0xf6, 0x0, + 0xbf, 0x60, 0xb, 0xf6, 0x0, 0xbf, 0x60, 0xb, + 0xfd, 0xcb, 0xbf, 0xff, 0xe0, + + /* U+005C "\\" */ + 0xaf, 0x40, 0x0, 0x0, 0x0, 0x5f, 0x90, 0x0, + 0x0, 0x0, 0xf, 0xe0, 0x0, 0x0, 0x0, 0xa, + 0xf4, 0x0, 0x0, 0x0, 0x4, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xef, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0x50, 0x0, 0x0, 0x0, 0x4f, 0xa0, 0x0, 0x0, + 0x0, 0xe, 0xf0, 0x0, 0x0, 0x0, 0x8, 0xf5, + 0x0, 0x0, 0x0, 0x3, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0x10, 0x0, 0x0, 0x0, 0x8f, 0x60, + 0x0, 0x0, 0x0, 0x2f, 0xb0, 0x0, 0x0, 0x0, + 0xd, 0xf1, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x0, + 0x0, 0x0, 0x2, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0x20, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x0, + 0x0, 0x0, 0x1f, 0xd0, 0x0, 0x0, 0x0, 0xc, + 0xf2, + + /* U+005D "]" */ + 0x9f, 0xff, 0xf0, 0x7c, 0xcf, 0xf0, 0x0, 0x1f, + 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, + 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, + 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, + 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, + 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, + 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, + 0xf0, 0x7c, 0xcf, 0xf0, 0x9f, 0xff, 0xf0, + + /* U+005E "^" */ + 0x0, 0x0, 0x48, 0x30, 0x0, 0x0, 0x0, 0xd, + 0xfb, 0x0, 0x0, 0x0, 0x4, 0xfc, 0xf1, 0x0, + 0x0, 0x0, 0xae, 0x2f, 0x80, 0x0, 0x0, 0x1f, + 0x80, 0xbe, 0x0, 0x0, 0x8, 0xf2, 0x4, 0xf5, + 0x0, 0x0, 0xeb, 0x0, 0xe, 0xb0, 0x0, 0x5f, + 0x50, 0x0, 0x8f, 0x20, 0xb, 0xe0, 0x0, 0x1, + 0xf8, 0x2, 0xf8, 0x0, 0x0, 0xb, 0xe0, + + /* U+005F "_" */ + 0x11, 0x11, 0x11, 0x11, 0x11, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x40, + + /* U+0060 "`" */ + 0x1b, 0xfb, 0x0, 0x0, 0x9, 0xfb, 0x0, 0x0, + 0x6, 0xfb, 0x0, + + /* U+0061 "a" */ + 0x2, 0x8d, 0xff, 0xea, 0x20, 0x4, 0xff, 0xfe, + 0xef, 0xff, 0x30, 0x1d, 0x61, 0x0, 0x2c, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xef, 0x30, 0x3a, 0xef, 0xff, 0xff, + 0xf3, 0x4f, 0xfc, 0x98, 0x88, 0xff, 0x3c, 0xf8, + 0x0, 0x0, 0xe, 0xf3, 0xef, 0x30, 0x0, 0x1, + 0xff, 0x3b, 0xf8, 0x0, 0x0, 0xbf, 0xf3, 0x3f, + 0xfc, 0x99, 0xef, 0xef, 0x30, 0x2a, 0xef, 0xea, + 0x2c, 0xf3, + + /* U+0062 "b" */ + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf1, 0x4b, 0xef, 0xd8, 0x10, 0x0, 0xff, + 0x9f, 0xff, 0xef, 0xfe, 0x40, 0xf, 0xff, 0xc3, + 0x0, 0x2b, 0xfe, 0x10, 0xff, 0xd0, 0x0, 0x0, + 0xc, 0xf9, 0xf, 0xf5, 0x0, 0x0, 0x0, 0x5f, + 0xe0, 0xff, 0x20, 0x0, 0x0, 0x1, 0xff, 0xf, + 0xf2, 0x0, 0x0, 0x0, 0x1f, 0xf0, 0xff, 0x50, + 0x0, 0x0, 0x5, 0xfe, 0xf, 0xfd, 0x0, 0x0, + 0x0, 0xdf, 0x80, 0xff, 0xfc, 0x30, 0x3, 0xcf, + 0xe1, 0xf, 0xf8, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0xff, 0x4, 0xbe, 0xfd, 0x81, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x7c, 0xef, 0xd8, 0x0, 0x0, 0x3d, + 0xff, 0xfe, 0xff, 0xe2, 0x1, 0xef, 0xc3, 0x0, + 0x2b, 0xf8, 0x8, 0xfc, 0x0, 0x0, 0x0, 0x50, + 0xe, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xfc, 0x0, 0x0, 0x0, 0x50, 0x1, 0xef, + 0xc3, 0x0, 0x2c, 0xf9, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x7c, 0xef, 0xd7, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf0, 0x0, 0x18, 0xdf, 0xeb, 0x41, 0xff, 0x0, + 0x4e, 0xff, 0xef, 0xff, 0x9f, 0xf0, 0x1e, 0xfc, + 0x20, 0x3, 0xcf, 0xff, 0x9, 0xfd, 0x0, 0x0, + 0x0, 0xdf, 0xf0, 0xef, 0x50, 0x0, 0x0, 0x5, + 0xff, 0xf, 0xf1, 0x0, 0x0, 0x0, 0x2f, 0xf0, + 0xff, 0x10, 0x0, 0x0, 0x2, 0xff, 0xe, 0xf4, + 0x0, 0x0, 0x0, 0x5f, 0xf0, 0x9f, 0xc0, 0x0, + 0x0, 0xc, 0xff, 0x1, 0xef, 0xa1, 0x0, 0x1a, + 0xff, 0xf0, 0x4, 0xef, 0xfc, 0xdf, 0xf9, 0xff, + 0x0, 0x1, 0x8d, 0xff, 0xb5, 0xf, 0xf0, + + /* U+0065 "e" */ + 0x0, 0x1, 0x8d, 0xfe, 0xb5, 0x0, 0x0, 0x3, + 0xef, 0xfd, 0xef, 0xfa, 0x0, 0x1, 0xef, 0x90, + 0x0, 0x3d, 0xf8, 0x0, 0x8f, 0x90, 0x0, 0x0, + 0x2f, 0xf1, 0xe, 0xf2, 0x0, 0x0, 0x0, 0xaf, + 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xf, + 0xf9, 0x88, 0x88, 0x88, 0x88, 0x40, 0xef, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xfd, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x1e, 0xfc, 0x40, 0x1, 0x7f, + 0x50, 0x0, 0x3e, 0xff, 0xfe, 0xff, 0xf5, 0x0, + 0x0, 0x7, 0xce, 0xfd, 0x92, 0x0, + + /* U+0066 "f" */ + 0x0, 0x2, 0xbf, 0xfc, 0x30, 0x0, 0xef, 0xed, + 0xf3, 0x0, 0x7f, 0xc0, 0x2, 0x0, 0x9, 0xf6, + 0x0, 0x0, 0x0, 0xbf, 0x60, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xc0, 0x8c, 0xef, 0xdc, 0xc9, 0x0, + 0xb, 0xf6, 0x0, 0x0, 0x0, 0xbf, 0x60, 0x0, + 0x0, 0xb, 0xf6, 0x0, 0x0, 0x0, 0xbf, 0x60, + 0x0, 0x0, 0xb, 0xf6, 0x0, 0x0, 0x0, 0xbf, + 0x60, 0x0, 0x0, 0xb, 0xf6, 0x0, 0x0, 0x0, + 0xbf, 0x60, 0x0, 0x0, 0xb, 0xf6, 0x0, 0x0, + 0x0, 0xbf, 0x60, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x2, 0x8d, 0xfe, 0xc6, 0xd, 0xf2, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xbd, 0xf2, 0x3, 0xff, + 0xb2, 0x0, 0x19, 0xff, 0xf2, 0xa, 0xfa, 0x0, + 0x0, 0x0, 0x8f, 0xf2, 0xf, 0xf3, 0x0, 0x0, + 0x0, 0x1f, 0xf2, 0xf, 0xf1, 0x0, 0x0, 0x0, + 0xe, 0xf2, 0xf, 0xf3, 0x0, 0x0, 0x0, 0x1f, + 0xf2, 0xa, 0xfb, 0x0, 0x0, 0x0, 0x9f, 0xf2, + 0x3, 0xff, 0xa2, 0x0, 0x19, 0xff, 0xf2, 0x0, + 0x5f, 0xff, 0xee, 0xff, 0xaf, 0xf2, 0x0, 0x2, + 0x9d, 0xff, 0xc5, 0xf, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x8f, 0xc0, 0x1, 0xec, 0x51, 0x0, 0x7, + 0xff, 0x60, 0x2, 0xdf, 0xff, 0xee, 0xff, 0xf9, + 0x0, 0x0, 0x5, 0xad, 0xff, 0xea, 0x40, 0x0, + + /* U+0068 "h" */ + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0x15, + 0xbe, 0xfd, 0x80, 0x0, 0xff, 0xbf, 0xff, 0xff, + 0xfd, 0x0, 0xff, 0xfa, 0x20, 0x6, 0xff, 0x80, + 0xff, 0xc0, 0x0, 0x0, 0x7f, 0xd0, 0xff, 0x50, + 0x0, 0x0, 0x2f, 0xf0, 0xff, 0x20, 0x0, 0x0, + 0xf, 0xf0, 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, + 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, 0xff, 0x10, + 0x0, 0x0, 0xf, 0xf1, 0xff, 0x10, 0x0, 0x0, + 0xf, 0xf1, 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, + 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, + + /* U+0069 "i" */ + 0x1d, 0xe2, 0x5f, 0xf6, 0xa, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf1, 0xf, 0xf1, 0xf, 0xf1, + 0xf, 0xf1, 0xf, 0xf1, 0xf, 0xf1, 0xf, 0xf1, + 0xf, 0xf1, 0xf, 0xf1, 0xf, 0xf1, 0xf, 0xf1, + 0xf, 0xf1, + + /* U+006A "j" */ + 0x0, 0x0, 0xc, 0xe3, 0x0, 0x0, 0x3f, 0xf8, + 0x0, 0x0, 0x9, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf3, + 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xe, 0xf3, + 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xe, 0xf3, + 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xe, 0xf3, + 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xe, 0xf3, + 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xe, 0xf3, + 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xf, 0xf2, + 0x1, 0x0, 0x4f, 0xf0, 0xb, 0xfd, 0xff, 0x80, + 0x8, 0xef, 0xe8, 0x0, + + /* U+006B "k" */ + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, + 0x0, 0x2, 0xef, 0x80, 0xff, 0x10, 0x0, 0x3e, + 0xf8, 0x0, 0xff, 0x10, 0x3, 0xff, 0x80, 0x0, + 0xff, 0x10, 0x4f, 0xf8, 0x0, 0x0, 0xff, 0x15, + 0xff, 0x90, 0x0, 0x0, 0xff, 0x7f, 0xff, 0x80, + 0x0, 0x0, 0xff, 0xff, 0xbf, 0xf4, 0x0, 0x0, + 0xff, 0xf6, 0xa, 0xfe, 0x20, 0x0, 0xff, 0x60, + 0x0, 0xcf, 0xc0, 0x0, 0xff, 0x10, 0x0, 0x2e, + 0xf9, 0x0, 0xff, 0x10, 0x0, 0x4, 0xff, 0x50, + 0xff, 0x10, 0x0, 0x0, 0x7f, 0xf2, + + /* U+006C "l" */ + 0xff, 0x1f, 0xf1, 0xff, 0x1f, 0xf1, 0xff, 0x1f, + 0xf1, 0xff, 0x1f, 0xf1, 0xff, 0x1f, 0xf1, 0xff, + 0x1f, 0xf1, 0xff, 0x1f, 0xf1, 0xff, 0x1f, 0xf1, + 0xff, 0x10, + + /* U+006D "m" */ + 0xff, 0x6, 0xcf, 0xfc, 0x60, 0x3, 0xae, 0xfe, + 0xa2, 0x0, 0xff, 0xbf, 0xfd, 0xff, 0xfa, 0x6f, + 0xfe, 0xdf, 0xff, 0x30, 0xff, 0xf7, 0x0, 0x7, + 0xff, 0xfe, 0x30, 0x1, 0xcf, 0xd0, 0xff, 0xa0, + 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0x2f, 0xf2, + 0xff, 0x40, 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, + 0xd, 0xf5, 0xff, 0x20, 0x0, 0x0, 0x6f, 0xc0, + 0x0, 0x0, 0xc, 0xf5, 0xff, 0x10, 0x0, 0x0, + 0x6f, 0xb0, 0x0, 0x0, 0xc, 0xf5, 0xff, 0x10, + 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, 0xc, 0xf5, + 0xff, 0x10, 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, + 0xc, 0xf5, 0xff, 0x10, 0x0, 0x0, 0x6f, 0xb0, + 0x0, 0x0, 0xc, 0xf5, 0xff, 0x10, 0x0, 0x0, + 0x6f, 0xb0, 0x0, 0x0, 0xc, 0xf5, 0xff, 0x10, + 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, 0xc, 0xf5, + + /* U+006E "n" */ + 0xff, 0x6, 0xce, 0xfd, 0x80, 0x0, 0xff, 0xbf, + 0xfd, 0xef, 0xfd, 0x0, 0xff, 0xf8, 0x0, 0x4, + 0xef, 0x80, 0xff, 0xb0, 0x0, 0x0, 0x6f, 0xd0, + 0xff, 0x40, 0x0, 0x0, 0x2f, 0xf0, 0xff, 0x20, + 0x0, 0x0, 0xf, 0xf0, 0xff, 0x10, 0x0, 0x0, + 0xf, 0xf1, 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, + 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, 0xff, 0x10, + 0x0, 0x0, 0xf, 0xf1, 0xff, 0x10, 0x0, 0x0, + 0xf, 0xf1, 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, + + /* U+006F "o" */ + 0x0, 0x1, 0x7c, 0xff, 0xc7, 0x10, 0x0, 0x0, + 0x3e, 0xff, 0xef, 0xff, 0xd3, 0x0, 0x1, 0xef, + 0xb2, 0x0, 0x2b, 0xfe, 0x10, 0x8, 0xfc, 0x0, + 0x0, 0x0, 0xcf, 0x80, 0xe, 0xf5, 0x0, 0x0, + 0x0, 0x5f, 0xd0, 0xf, 0xf1, 0x0, 0x0, 0x0, + 0x2f, 0xf0, 0xf, 0xf1, 0x0, 0x0, 0x0, 0x2f, + 0xf0, 0xe, 0xf5, 0x0, 0x0, 0x0, 0x5f, 0xd0, + 0x8, 0xfd, 0x0, 0x0, 0x0, 0xdf, 0x70, 0x1, + 0xef, 0xc3, 0x0, 0x3c, 0xfd, 0x10, 0x0, 0x3d, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x1, 0x7c, + 0xff, 0xc7, 0x0, 0x0, + + /* U+0070 "p" */ + 0xff, 0x5, 0xbe, 0xfd, 0x81, 0x0, 0xf, 0xfa, + 0xff, 0xdd, 0xff, 0xe4, 0x0, 0xff, 0xfb, 0x10, + 0x1, 0xaf, 0xe1, 0xf, 0xfc, 0x0, 0x0, 0x0, + 0xcf, 0x90, 0xff, 0x50, 0x0, 0x0, 0x4, 0xfe, + 0xf, 0xf2, 0x0, 0x0, 0x0, 0x1f, 0xf0, 0xff, + 0x20, 0x0, 0x0, 0x1, 0xff, 0xf, 0xf5, 0x0, + 0x0, 0x0, 0x5f, 0xe0, 0xff, 0xd0, 0x0, 0x0, + 0xd, 0xf8, 0xf, 0xff, 0xc3, 0x0, 0x3c, 0xfe, + 0x10, 0xff, 0x9f, 0xff, 0xff, 0xfe, 0x30, 0xf, + 0xf1, 0x4b, 0xef, 0xd8, 0x10, 0x0, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x1, 0x8d, 0xfe, 0xb4, 0xf, 0xf0, 0x4, + 0xef, 0xfe, 0xff, 0xf8, 0xff, 0x1, 0xef, 0xb2, + 0x0, 0x3c, 0xff, 0xf0, 0x9f, 0xc0, 0x0, 0x0, + 0xd, 0xff, 0xe, 0xf5, 0x0, 0x0, 0x0, 0x5f, + 0xf0, 0xff, 0x10, 0x0, 0x0, 0x2, 0xff, 0xf, + 0xf1, 0x0, 0x0, 0x0, 0x2f, 0xf0, 0xef, 0x50, + 0x0, 0x0, 0x5, 0xff, 0x9, 0xfd, 0x0, 0x0, + 0x0, 0xdf, 0xf0, 0x1e, 0xfc, 0x30, 0x3, 0xcf, + 0xff, 0x0, 0x4e, 0xff, 0xff, 0xff, 0x9f, 0xf0, + 0x0, 0x18, 0xdf, 0xeb, 0x41, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + + /* U+0072 "r" */ + 0xff, 0x5, 0xbe, 0x4f, 0xf8, 0xff, 0xf4, 0xff, + 0xfc, 0x41, 0xf, 0xfd, 0x0, 0x0, 0xff, 0x50, + 0x0, 0xf, 0xf3, 0x0, 0x0, 0xff, 0x10, 0x0, + 0xf, 0xf1, 0x0, 0x0, 0xff, 0x10, 0x0, 0xf, + 0xf1, 0x0, 0x0, 0xff, 0x10, 0x0, 0xf, 0xf1, + 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x29, 0xdf, 0xfd, 0x93, 0x0, 0x5f, 0xff, + 0xde, 0xff, 0xc0, 0xe, 0xf8, 0x0, 0x1, 0x73, + 0x1, 0xff, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfa, + 0x20, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xeb, 0x72, + 0x0, 0x0, 0x28, 0xcf, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x2, 0x8f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0x50, 0xd8, 0x20, 0x0, 0x4f, 0xf3, 0x4f, + 0xff, 0xfe, 0xff, 0xf9, 0x0, 0x28, 0xcf, 0xfd, + 0xb4, 0x0, + + /* U+0074 "t" */ + 0x0, 0x58, 0x30, 0x0, 0x0, 0xb, 0xf6, 0x0, + 0x0, 0x0, 0xbf, 0x60, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xc0, 0x8c, 0xef, 0xdc, 0xc9, 0x0, 0xb, + 0xf6, 0x0, 0x0, 0x0, 0xbf, 0x60, 0x0, 0x0, + 0xb, 0xf6, 0x0, 0x0, 0x0, 0xbf, 0x60, 0x0, + 0x0, 0xb, 0xf6, 0x0, 0x0, 0x0, 0xbf, 0x60, + 0x0, 0x0, 0xa, 0xf7, 0x0, 0x0, 0x0, 0x7f, + 0xc0, 0x2, 0x0, 0x1, 0xff, 0xfe, 0xf4, 0x0, + 0x2, 0xbe, 0xeb, 0x20, + + /* U+0075 "u" */ + 0x1f, 0xf0, 0x0, 0x0, 0x3, 0xfe, 0x1f, 0xf0, + 0x0, 0x0, 0x3, 0xfe, 0x1f, 0xf0, 0x0, 0x0, + 0x3, 0xfe, 0x1f, 0xf0, 0x0, 0x0, 0x3, 0xfe, + 0x1f, 0xf0, 0x0, 0x0, 0x3, 0xfe, 0x1f, 0xf0, + 0x0, 0x0, 0x3, 0xfe, 0x1f, 0xf0, 0x0, 0x0, + 0x4, 0xfe, 0x1f, 0xf1, 0x0, 0x0, 0x6, 0xfe, + 0xe, 0xf5, 0x0, 0x0, 0xc, 0xfe, 0x9, 0xfe, + 0x30, 0x0, 0x9f, 0xfe, 0x1, 0xdf, 0xfe, 0xdf, + 0xfb, 0xfe, 0x0, 0x8, 0xdf, 0xfc, 0x52, 0xfe, + + /* U+0076 "v" */ + 0xd, 0xf5, 0x0, 0x0, 0x0, 0xe, 0xf1, 0x6, + 0xfc, 0x0, 0x0, 0x0, 0x6f, 0xa0, 0x0, 0xff, + 0x30, 0x0, 0x0, 0xdf, 0x40, 0x0, 0x8f, 0x90, + 0x0, 0x3, 0xfd, 0x0, 0x0, 0x2f, 0xf1, 0x0, + 0xa, 0xf6, 0x0, 0x0, 0xb, 0xf7, 0x0, 0x1f, + 0xe0, 0x0, 0x0, 0x4, 0xfd, 0x0, 0x8f, 0x80, + 0x0, 0x0, 0x0, 0xdf, 0x40, 0xef, 0x20, 0x0, + 0x0, 0x0, 0x6f, 0xb5, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfd, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x60, 0x0, 0x0, + + /* U+0077 "w" */ + 0xbf, 0x50, 0x0, 0x0, 0x2f, 0xf0, 0x0, 0x0, + 0x6, 0xf7, 0x5f, 0xa0, 0x0, 0x0, 0x8f, 0xf5, + 0x0, 0x0, 0xc, 0xf1, 0xf, 0xf0, 0x0, 0x0, + 0xdf, 0xfb, 0x0, 0x0, 0x2f, 0xb0, 0x9, 0xf6, + 0x0, 0x3, 0xfa, 0xdf, 0x10, 0x0, 0x8f, 0x50, + 0x3, 0xfb, 0x0, 0x9, 0xf4, 0x8f, 0x70, 0x0, + 0xdf, 0x0, 0x0, 0xef, 0x10, 0xf, 0xe0, 0x2f, + 0xc0, 0x3, 0xfa, 0x0, 0x0, 0x8f, 0x60, 0x5f, + 0x80, 0xc, 0xf2, 0x9, 0xf4, 0x0, 0x0, 0x2f, + 0xc0, 0xbf, 0x20, 0x6, 0xf8, 0xe, 0xe0, 0x0, + 0x0, 0xc, 0xf3, 0xfc, 0x0, 0x0, 0xfe, 0x5f, + 0x90, 0x0, 0x0, 0x7, 0xfe, 0xf6, 0x0, 0x0, + 0xaf, 0xdf, 0x30, 0x0, 0x0, 0x1, 0xff, 0xf1, + 0x0, 0x0, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xa0, 0x0, 0x0, 0xe, 0xf7, 0x0, 0x0, + + /* U+0078 "x" */ + 0x2f, 0xf4, 0x0, 0x0, 0x2f, 0xf3, 0x5, 0xfe, + 0x10, 0x0, 0xcf, 0x70, 0x0, 0x9f, 0xb0, 0x9, + 0xfb, 0x0, 0x0, 0xd, 0xf7, 0x4f, 0xe1, 0x0, + 0x0, 0x2, 0xff, 0xef, 0x30, 0x0, 0x0, 0x0, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, + 0x0, 0x0, 0x0, 0x5, 0xfe, 0xdf, 0x60, 0x0, + 0x0, 0x2f, 0xf4, 0x2f, 0xf3, 0x0, 0x0, 0xcf, + 0x80, 0x6, 0xfe, 0x10, 0x9, 0xfc, 0x0, 0x0, + 0xaf, 0xb0, 0x5f, 0xe1, 0x0, 0x0, 0xd, 0xf7, + + /* U+0079 "y" */ + 0xd, 0xf6, 0x0, 0x0, 0x0, 0xe, 0xf1, 0x6, + 0xfc, 0x0, 0x0, 0x0, 0x6f, 0xa0, 0x0, 0xef, + 0x40, 0x0, 0x0, 0xdf, 0x30, 0x0, 0x7f, 0xb0, + 0x0, 0x4, 0xfc, 0x0, 0x0, 0x1f, 0xf2, 0x0, + 0xb, 0xf5, 0x0, 0x0, 0x9, 0xf9, 0x0, 0x2f, + 0xd0, 0x0, 0x0, 0x2, 0xff, 0x0, 0x9f, 0x70, + 0x0, 0x0, 0x0, 0xbf, 0x71, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xd7, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x5, 0xfc, + 0x0, 0x0, 0x0, 0x6, 0x10, 0x2e, 0xf5, 0x0, + 0x0, 0x0, 0x4f, 0xfe, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x8, 0xef, 0xd7, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0x70, 0xcc, 0xcc, + 0xcc, 0xdf, 0xf5, 0x0, 0x0, 0x0, 0xc, 0xf9, + 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, 0x0, 0x0, + 0x5, 0xfe, 0x20, 0x0, 0x0, 0x2, 0xff, 0x40, + 0x0, 0x0, 0x1, 0xdf, 0x80, 0x0, 0x0, 0x0, + 0xbf, 0xb0, 0x0, 0x0, 0x0, 0x7f, 0xd1, 0x0, + 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, 0xe, + 0xfe, 0xcc, 0xcc, 0xcc, 0x72, 0xff, 0xff, 0xff, + 0xff, 0xfa, + + /* U+007B "{" */ + 0x0, 0x9, 0xef, 0x40, 0x9, 0xff, 0xd3, 0x0, + 0xef, 0x60, 0x0, 0xf, 0xf2, 0x0, 0x0, 0xff, + 0x20, 0x0, 0xf, 0xf2, 0x0, 0x0, 0xff, 0x20, + 0x0, 0xf, 0xf2, 0x0, 0x1, 0xff, 0x10, 0x9, + 0xef, 0xb0, 0x0, 0xcf, 0xf8, 0x0, 0x0, 0x3f, + 0xf0, 0x0, 0x0, 0xff, 0x10, 0x0, 0xf, 0xf2, + 0x0, 0x0, 0xff, 0x20, 0x0, 0xf, 0xf2, 0x0, + 0x0, 0xff, 0x20, 0x0, 0xf, 0xf2, 0x0, 0x0, + 0xdf, 0x60, 0x0, 0x8, 0xff, 0xd3, 0x0, 0x8, + 0xef, 0x40, + + /* U+007C "|" */ + 0xbf, 0x4b, 0xf4, 0xbf, 0x4b, 0xf4, 0xbf, 0x4b, + 0xf4, 0xbf, 0x4b, 0xf4, 0xbf, 0x4b, 0xf4, 0xbf, + 0x4b, 0xf4, 0xbf, 0x4b, 0xf4, 0xbf, 0x4b, 0xf4, + 0xbf, 0x4b, 0xf4, 0xbf, 0x4b, 0xf4, 0xbf, 0x40, + + /* U+007D "}" */ + 0x9f, 0xd6, 0x0, 0x7, 0xef, 0xf4, 0x0, 0x0, + 0xaf, 0xa0, 0x0, 0x6, 0xfb, 0x0, 0x0, 0x6f, + 0xb0, 0x0, 0x6, 0xfb, 0x0, 0x0, 0x6f, 0xb0, + 0x0, 0x6, 0xfb, 0x0, 0x0, 0x5f, 0xd0, 0x0, + 0x1, 0xef, 0xd5, 0x0, 0xb, 0xff, 0x70, 0x4, + 0xfe, 0x10, 0x0, 0x5f, 0xb0, 0x0, 0x6, 0xfb, + 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x6, 0xfb, 0x0, + 0x0, 0x6f, 0xb0, 0x0, 0x6, 0xfb, 0x0, 0x0, + 0xaf, 0x90, 0x7, 0xef, 0xf3, 0x0, 0x9f, 0xd5, + 0x0, 0x0, + + /* U+007E "~" */ + 0x1, 0x89, 0x50, 0x0, 0x9, 0x51, 0xef, 0xff, + 0xa0, 0x2, 0xf5, 0x7f, 0x41, 0x8f, 0xd8, 0xdf, + 0x1a, 0xb0, 0x0, 0x3c, 0xfd, 0x40, + + /* U+00B0 "°" */ + 0x0, 0x4c, 0xfd, 0x60, 0x0, 0x4f, 0x83, 0x6f, + 0x80, 0xc, 0x80, 0x0, 0x5f, 0x0, 0xf4, 0x0, + 0x1, 0xf3, 0xd, 0x60, 0x0, 0x4f, 0x10, 0x7e, + 0x50, 0x3d, 0xa0, 0x0, 0x8f, 0xff, 0xa0, 0x0, + 0x0, 0x2, 0x10, 0x0, + + /* U+2022 "•" */ + 0x0, 0x0, 0x1, 0xcf, 0xb0, 0x7f, 0xff, 0x56, + 0xff, 0xf5, 0xb, 0xfa, 0x0, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x9e, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xbf, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x48, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x1, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x94, 0xe, 0xfd, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xfc, 0x72, 0x0, 0x0, 0xef, 0xd0, + 0x0, 0x0, 0xa, 0xff, 0xea, 0x50, 0x0, 0x0, + 0x0, 0xe, 0xfd, 0x0, 0x0, 0x0, 0xaf, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, 0x0, + 0x0, 0xa, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xfd, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, + 0xa, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xfd, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, + 0x0, 0x3, 0x54, 0xff, 0xd0, 0x0, 0x0, 0xa, + 0xff, 0x10, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xd0, 0x1, 0x69, 0x9d, 0xff, + 0x10, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfc, 0x6, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0x61, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x2a, 0xff, 0xfc, 0x50, 0x1f, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xcc, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F008 "" */ + 0x42, 0x0, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x87, 0x0, 0x24, 0xf8, 0x22, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x22, 0x8f, 0xff, 0xff, + 0xff, 0xb9, 0x99, 0x99, 0x99, 0x9b, 0xff, 0xff, + 0xff, 0xf9, 0x44, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x44, 0x9f, 0xf6, 0x0, 0xef, 0x30, + 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x6f, 0xf7, + 0x0, 0xef, 0x30, 0x0, 0x0, 0x0, 0x3, 0xfe, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xfa, 0x66, 0xff, + 0x74, 0x44, 0x44, 0x44, 0x47, 0xff, 0x66, 0xaf, + 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x6f, 0xf6, 0x0, 0xef, 0xdc, 0xcc, + 0xcc, 0xcc, 0xcd, 0xfe, 0x0, 0x6f, 0xff, 0xee, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x3, 0xff, 0xee, + 0xff, 0xfc, 0x88, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x88, 0xcf, 0xf6, 0x0, 0xef, 0x30, + 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x6f, 0xf6, + 0x0, 0xef, 0x30, 0x0, 0x0, 0x0, 0x3, 0xfe, + 0x0, 0x6f, 0xfe, 0xcc, 0xff, 0x41, 0x11, 0x11, + 0x11, 0x14, 0xff, 0xcc, 0xef, 0xfd, 0xaa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xdf, + 0xc6, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x6c, + + /* U+F00B "" */ + 0xbf, 0xff, 0xfe, 0x31, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x63, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x63, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x63, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x58, + 0x88, 0x87, 0x0, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0x31, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x63, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x53, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x47, 0x88, 0x87, 0x0, + 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0x31, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x63, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x52, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x37, 0x77, 0x76, 0x0, 0x57, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x74, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0x30, 0x4, 0xe8, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xf3, 0x0, 0x4f, 0xff, 0x80, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0x30, 0x0, + 0xef, 0xff, 0xf8, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x80, 0x2, + 0xef, 0xff, 0xff, 0x30, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf8, 0x2e, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F00D "ï€" */ + 0x8, 0xc4, 0x0, 0x0, 0x0, 0x2, 0xc9, 0x0, + 0x9f, 0xff, 0x40, 0x0, 0x0, 0x2e, 0xff, 0xb0, + 0xff, 0xff, 0xf4, 0x0, 0x2, 0xef, 0xff, 0xf1, + 0x7f, 0xff, 0xff, 0x40, 0x2e, 0xff, 0xff, 0x90, + 0x8, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xfa, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x2, 0xef, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x0, + 0x2e, 0xff, 0xff, 0xa0, 0x8f, 0xff, 0xff, 0x40, + 0xdf, 0xff, 0xfa, 0x0, 0x8, 0xff, 0xff, 0xf0, + 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x8f, 0xff, 0xe0, + 0x2e, 0xfa, 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, + 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0x50, 0xe, 0xff, 0x80, + 0xb, 0xf4, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, + 0xe, 0xff, 0x80, 0x4f, 0xff, 0x50, 0x0, 0x0, + 0x9f, 0xff, 0xe0, 0xe, 0xff, 0x80, 0x5f, 0xff, + 0xf2, 0x0, 0x3, 0xff, 0xfe, 0x30, 0xe, 0xff, + 0x80, 0x8, 0xff, 0xfc, 0x0, 0xb, 0xff, 0xf3, + 0x0, 0xe, 0xff, 0x80, 0x0, 0xaf, 0xff, 0x50, + 0x1f, 0xff, 0x90, 0x0, 0xe, 0xff, 0x80, 0x0, + 0x1f, 0xff, 0xb0, 0x6f, 0xff, 0x30, 0x0, 0xe, + 0xff, 0x80, 0x0, 0x9, 0xff, 0xf0, 0x8f, 0xff, + 0x0, 0x0, 0xe, 0xff, 0x80, 0x0, 0x5, 0xff, + 0xf2, 0xaf, 0xfd, 0x0, 0x0, 0xe, 0xff, 0x80, + 0x0, 0x3, 0xff, 0xf3, 0x9f, 0xfd, 0x0, 0x0, + 0xc, 0xff, 0x50, 0x0, 0x4, 0xff, 0xf2, 0x8f, + 0xff, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x6, + 0xff, 0xf1, 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xe0, 0xf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, + 0x8, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0x20, 0x1, 0xef, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xf9, 0x0, 0x0, 0x4f, + 0xff, 0xfd, 0x62, 0x1, 0x49, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7d, 0xff, 0xff, 0xff, 0xb4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x65, + 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, + 0xee, 0xc7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x30, 0x2a, + 0xff, 0xff, 0xff, 0xb2, 0x3, 0x80, 0x0, 0x0, + 0x8f, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, + 0xf8, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x55, 0xaf, 0xff, + 0xff, 0xff, 0xf2, 0x6, 0xef, 0xff, 0xff, 0x70, + 0x0, 0x7, 0xff, 0xff, 0xff, 0x60, 0x0, 0x2f, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf3, + 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x2f, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x20, 0x0, 0x1, 0xff, 0xff, + 0xf9, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xe1, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x2f, + 0xb2, 0x9f, 0xff, 0xff, 0xff, 0xfa, 0x2a, 0xf3, + 0x0, 0x0, 0x1, 0x0, 0x2, 0xdf, 0xff, 0xfe, + 0x30, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x66, + 0x41, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xe9, 0x0, + 0x5, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xfc, 0x10, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfe, 0x37, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xb4, 0xdf, 0xff, 0xbf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0x80, + 0x1, 0xbf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0x50, 0x8f, 0x50, 0x9f, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfe, 0x30, + 0xbf, 0xff, 0x70, 0x6f, 0xff, 0xf1, 0x0, 0x0, + 0x7, 0xff, 0xfc, 0x12, 0xdf, 0xff, 0xff, 0xa0, + 0x3e, 0xff, 0xe3, 0x0, 0xa, 0xff, 0xfa, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xc1, 0x2d, 0xff, 0xf6, + 0xc, 0xff, 0xf7, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0xb, 0xff, 0xf8, 0x9f, 0xf5, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x8, + 0xff, 0x50, 0x93, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x5, 0x70, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xcc, 0xcf, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0x50, 0x0, 0x9f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xf5, 0x0, 0x9, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0x50, 0x0, 0x9f, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xf5, 0x0, 0x9, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x40, 0x0, + 0x8f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x2, + 0x44, 0x44, 0x40, 0x0, 0x1, 0x44, 0x44, 0x41, + 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xee, 0xee, 0xff, + 0xff, 0xff, 0xee, 0xee, 0x20, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xfc, 0x4, 0xff, 0x40, 0xcf, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x23, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x44, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x6e, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaf, + 0x5d, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F01C "" */ + 0x0, 0x0, 0x4, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x9f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0x50, 0x0, 0x0, 0x4f, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xfe, 0x10, 0x0, 0xd, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfa, 0x0, 0x9, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf5, 0x3, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xe1, 0xdf, 0xfa, 0x44, 0x44, + 0x20, 0x0, 0x0, 0x0, 0x34, 0x44, 0x4d, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x88, + 0x88, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x76, 0x0, 0x0, 0x0, 0x5, 0x9c, + 0xdd, 0xb8, 0x30, 0x0, 0xf, 0xff, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x40, 0xf, + 0xff, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xf, 0xff, 0x0, 0xc, 0xff, 0xff, + 0xa5, 0x34, 0x6b, 0xff, 0xff, 0xce, 0xff, 0x0, + 0xaf, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x2b, 0xff, + 0xff, 0xff, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xd, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x7d, 0xdc, 0xbf, 0xff, 0xff, + 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x6f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x2, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x22, 0x22, + 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xde, + 0xee, 0xee, 0xee, 0xe7, 0x0, 0x0, 0x0, 0x0, + 0x9e, 0xe5, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x9, 0xff, 0xe0, + 0xff, 0xff, 0xf4, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x70, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, 0xff, 0xff, + 0xff, 0xfd, 0x61, 0x0, 0x5, 0xcf, 0xff, 0xf2, + 0x0, 0xff, 0xe3, 0xef, 0xff, 0xff, 0xee, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0xff, 0xf0, 0x19, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x28, 0xdf, 0xff, 0xfe, 0xa3, 0x0, + 0x0, 0x0, 0xab, 0xa0, 0x0, 0x0, 0x1, 0x33, + 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, + 0x0, 0x6, 0xff, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x24, 0x44, + 0x47, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x24, 0x44, 0x47, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x75, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x2f, 0xf7, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x7f, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xdf, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xf3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xc, 0xfd, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1, 0xfe, 0x20, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, + 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0x0, 0x0, 0x1, 0x0, 0x7f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, + 0x0, 0x5, 0xf9, 0x0, 0x9f, 0xe1, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x4f, 0xfb, + 0x0, 0xdf, 0x80, 0x24, 0x44, 0x47, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x3f, 0xf7, 0x4, 0xff, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x86, 0x0, + 0x4f, 0xf1, 0xd, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x2f, 0xf7, 0x0, 0xcf, 0x60, 0x9f, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x6f, + 0xf1, 0x7, 0xf9, 0x6, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xdf, 0x40, 0x5f, 0xb0, + 0x5f, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1f, 0xf2, 0x5, 0xfa, 0x5, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xd, 0xfc, 0x0, 0x9f, + 0x80, 0x7f, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1, 0xfd, 0x20, 0x1e, 0xf3, 0xb, 0xf6, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0x0, 0xa, + 0xfc, 0x1, 0xff, 0x20, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x0, 0x0, 0xb, 0xff, 0x20, 0x8f, 0xc0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf0, 0x0, 0x7, + 0xff, 0x40, 0x2f, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0x0, 0x0, 0x19, 0x20, 0x1d, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xc0, 0x0, + 0x0, 0x0, 0x2d, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x5, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x50, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x1, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0xd, 0xff, 0xff, 0xff, 0xdb, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x2f, 0xff, 0xff, + 0xfd, 0x10, 0xaf, 0xff, 0xff, 0xff, 0xfb, 0x56, + 0xef, 0xff, 0xff, 0xd1, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf7, 0x2e, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0x70, 0x2, 0xed, 0x10, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x21, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcf, 0xff, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, + + /* U+F043 "ïƒ" */ + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0xef, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xc0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xdf, 0xe0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x9f, 0xf5, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x3f, 0xfe, 0x21, 0x8b, 0xff, 0xff, 0xff, 0x50, + 0xa, 0xff, 0xf7, 0x20, 0xdf, 0xff, 0xfb, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xab, 0xa7, 0x20, 0x0, 0x0, + + /* U+F048 "ïˆ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xc0, 0x0, 0x0, 0x0, 0xb, 0xd3, 0x2f, + 0xfe, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x82, 0xff, + 0xe0, 0x0, 0x0, 0x2d, 0xff, 0xf9, 0x2f, 0xfe, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0x92, 0xff, 0xe0, + 0x0, 0x3e, 0xff, 0xff, 0xf9, 0x2f, 0xfe, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x92, 0xff, 0xe0, 0x5f, + 0xff, 0xff, 0xff, 0xf9, 0x2f, 0xfe, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0x92, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x92, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x2f, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x92, 0xff, 0xe0, 0xbf, 0xff, 0xff, 0xff, + 0xf9, 0x2f, 0xfe, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0x92, 0xff, 0xe0, 0x0, 0x8f, 0xff, 0xff, 0xf9, + 0x2f, 0xfe, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x92, + 0xff, 0xe0, 0x0, 0x0, 0x6f, 0xff, 0xf9, 0x2f, + 0xfe, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x92, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x4, 0x43, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, + + /* U+F04B "ï‹" */ + 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xfb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2a, 0xa3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "ïŒ" */ + 0x3d, 0xff, 0xff, 0xe6, 0x0, 0x3, 0xdf, 0xff, + 0xfe, 0x60, 0xdf, 0xff, 0xff, 0xff, 0x10, 0xd, + 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xf, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x30, 0xf, + 0xff, 0xff, 0xff, 0xf3, 0x8f, 0xff, 0xff, 0xfb, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xb0, 0x2, 0x44, + 0x44, 0x30, 0x0, 0x0, 0x24, 0x44, 0x43, 0x0, + + /* U+F04D "ï" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x0, + + /* U+F051 "ï‘" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdc, 0x10, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x7f, + 0xfd, 0x20, 0x0, 0x0, 0xd, 0xff, 0x47, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0xdf, 0xf4, 0x7f, 0xff, + 0xff, 0x40, 0x0, 0xd, 0xff, 0x47, 0xff, 0xff, + 0xff, 0x50, 0x0, 0xdf, 0xf4, 0x7f, 0xff, 0xff, + 0xff, 0x60, 0xd, 0xff, 0x47, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xdf, 0xf4, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0x8d, 0xff, 0x47, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x47, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xcd, + 0xff, 0x47, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xdf, + 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xa0, 0xd, 0xff, + 0x47, 0xff, 0xff, 0xff, 0x90, 0x0, 0xdf, 0xf4, + 0x7f, 0xff, 0xff, 0x80, 0x0, 0xd, 0xff, 0x47, + 0xff, 0xff, 0x70, 0x0, 0x0, 0xdf, 0xf4, 0x7f, + 0xff, 0x60, 0x0, 0x0, 0xd, 0xff, 0x44, 0xff, + 0x50, 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x2, 0x20, + 0x0, 0x0, 0x0, 0x2, 0x44, 0x0, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x0, 0x0, 0x8, 0xea, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x56, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x27, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x30, + + /* U+F053 "ï“" */ + 0x0, 0x0, 0x0, 0x0, 0x19, 0x20, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xe2, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xf8, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xd1, + 0x0, 0x0, 0x1d, 0xff, 0xfc, 0x10, 0x0, 0x1, + 0xdf, 0xff, 0xc1, 0x0, 0x0, 0x1d, 0xff, 0xfc, + 0x10, 0x0, 0x1, 0xdf, 0xff, 0xc1, 0x0, 0x0, + 0x1d, 0xff, 0xfc, 0x10, 0x0, 0x0, 0xbf, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+F054 "ï”" */ + 0x5, 0x80, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf3, 0x0, 0x0, 0x9, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x9f, 0xff, 0xf4, 0x0, 0x0, 0x9, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x9f, 0xff, 0xf4, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x1c, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x0, 0x0, 0x1, 0xbe, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x14, 0x55, + 0x55, 0x59, 0xff, 0xfc, 0x55, 0x55, 0x54, 0x20, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x6c, 0xdd, + 0xdd, 0xde, 0xff, 0xff, 0xdd, 0xdd, 0xdc, 0x90, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x36, 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "ï¨" */ + 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, + + /* U+F06E "ï®" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x43, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5b, 0xff, 0xff, 0xff, 0xea, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xfd, 0xce, + 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0x71, 0x0, 0x2, 0x9f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xfe, 0x20, 0x2, + 0x53, 0x0, 0x5f, 0xff, 0xfb, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0x30, 0x0, 0x6f, 0xfc, 0x10, 0x7f, + 0xff, 0xfb, 0x0, 0xc, 0xff, 0xff, 0xa0, 0x0, + 0x6, 0xff, 0xfc, 0x0, 0xef, 0xff, 0xf8, 0x6, + 0xff, 0xff, 0xf5, 0x1, 0x3, 0xef, 0xff, 0xf4, + 0x9, 0xff, 0xff, 0xf3, 0xef, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0x70, 0x7f, 0xff, 0xff, + 0xad, 0xff, 0xff, 0xf3, 0xa, 0xff, 0xff, 0xff, + 0xf6, 0x7, 0xff, 0xff, 0xf9, 0x3f, 0xff, 0xff, + 0x60, 0x5f, 0xff, 0xff, 0xff, 0x10, 0xaf, 0xff, + 0xfe, 0x10, 0x8f, 0xff, 0xfc, 0x0, 0xaf, 0xff, + 0xff, 0x60, 0x1f, 0xff, 0xff, 0x50, 0x0, 0xaf, + 0xff, 0xf6, 0x0, 0x6c, 0xdb, 0x40, 0xa, 0xff, + 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xfc, 0x52, 0x12, 0x6d, 0xff, + 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x5a, 0xde, 0xfe, 0xd9, + 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "ï°" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x24, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x60, 0x28, 0xcf, 0xff, 0xff, + 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xfc, 0xff, 0xff, 0xec, 0xdf, 0xff, 0xfe, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xa3, 0x0, 0x0, 0x6e, 0xff, 0xfc, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0x70, + 0x15, 0x40, 0x1, 0xdf, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x1c, 0xff, 0xfb, 0x1f, 0xfe, + 0x50, 0x2f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x7e, + 0x30, 0x0, 0x9f, 0xff, 0xef, 0xff, 0xf3, 0x8, + 0xff, 0xff, 0xd0, 0x0, 0x2, 0xff, 0xf6, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xfa, 0x3, 0xff, 0xff, + 0xf8, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x0, 0x2d, + 0xff, 0xff, 0xfd, 0x1, 0xff, 0xff, 0xff, 0x0, + 0x6, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, + 0xfb, 0x2, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xdf, + 0xff, 0xfd, 0x0, 0x0, 0x6, 0xff, 0xff, 0x55, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x3d, 0xff, 0xfe, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x4, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xe8, 0x31, 0x20, 0x0, 0x3e, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xef, 0xff, 0xff, 0xfb, 0x0, 0x1, 0xbf, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, + 0xef, 0xfd, 0x80, 0x0, 0x8, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x60, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfd, 0x88, 0x8f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x80, + 0x0, 0xcf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf9, 0x0, 0xd, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xa0, 0x0, 0xef, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfb, + 0x0, 0xf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xfd, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xfd, 0xcd, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x6f, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x17, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x2, 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x90, 0x0, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf5, + 0x0, 0x12, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x22, 0x9f, 0xff, 0x50, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x45, 0x55, 0xbf, + 0xff, 0x60, 0xaf, 0xff, 0xd5, 0xaf, 0xff, 0x80, + 0x0, 0x0, 0xb, 0xf8, 0xa, 0xff, 0xfe, 0x10, + 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x70, 0x9f, + 0xff, 0xe2, 0x0, 0x4f, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf3, 0x10, + 0x0, 0x2a, 0x30, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x41, 0xda, 0x0, 0x7f, 0xf3, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf4, 0xd, 0xff, 0x90, 0x8f, + 0xff, 0x30, 0xef, 0xff, 0xff, 0xff, 0x50, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xfa, 0x67, 0x77, 0x75, 0x0, 0x0, + 0x0, 0x3, 0x77, 0xbf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x0, 0x0, 0x4e, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfc, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xfa, 0x5, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x4f, 0xff, 0xfa, 0x0, 0x5, 0xff, + 0xff, 0x70, 0x0, 0x4f, 0xff, 0xf9, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x70, 0x3f, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x7a, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x2e, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x50, 0x25, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x40, + + /* U+F078 "ï¸" */ + 0x9, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcb, 0x18, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xfc, 0x9f, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xd0, 0xbf, 0xff, 0xe3, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xd1, 0x0, 0xbf, + 0xff, 0xe3, 0x0, 0x1, 0xcf, 0xff, 0xd1, 0x0, + 0x0, 0xbf, 0xff, 0xe3, 0x1, 0xcf, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe4, 0xcf, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, + 0x0, 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x0, 0x27, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfd, + 0x10, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xd1, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xfd, 0x15, 0xbb, 0xbb, + 0xbb, 0xbb, 0xef, 0xf1, 0x0, 0x0, 0xdf, 0xfb, + 0xef, 0xdc, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf1, 0x0, 0x0, 0x9f, 0xc0, 0xef, 0xd1, + 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, + 0x0, 0x0, 0x3, 0x0, 0xef, 0xd0, 0x3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x50, 0xaf, 0xf1, + 0x19, 0x30, 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf6, 0xaf, 0xf3, 0xdf, 0xe0, + 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xef, 0xfe, 0xff, 0xd0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x17, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x6f, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x6b, 0xbb, 0xbb, 0xbb, + 0xbb, 0xba, 0x30, 0x6, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, + + /* U+F07B "ï»" */ + 0x5, 0x78, 0x88, 0x88, 0x71, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcc, + 0xcc, 0xcc, 0xcb, 0x91, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, + + /* U+F093 "ï‚“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x11, 0x11, 0xef, + 0xff, 0xf9, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xe0, 0xdf, 0xff, 0xf8, 0xe, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xf3, 0x26, + 0x66, 0x50, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x52, 0x22, 0x25, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x6e, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaf, + 0x5d, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xc8, 0x51, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x5, 0xb8, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x1, 0x8e, 0xff, + 0xf6, 0x0, 0x8, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xf4, 0x4d, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, 0xb9, + 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x1, 0x8c, 0xda, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x1d, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x80, 0xaf, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0xef, 0xe1, + 0xc, 0xff, 0x20, 0x0, 0xbf, 0xff, 0xfe, 0x30, + 0xff, 0xd0, 0xa, 0xff, 0x30, 0xb, 0xff, 0xff, + 0xe3, 0x0, 0xbf, 0xfc, 0xbf, 0xff, 0x10, 0xcf, + 0xff, 0xfe, 0x30, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xdc, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x1, 0x2d, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1, 0x8c, + 0xef, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x33, 0xef, + 0xff, 0xfc, 0x0, 0x0, 0xef, 0xe1, 0xc, 0xff, + 0x20, 0x2e, 0xff, 0xff, 0xc1, 0x0, 0xff, 0xd0, + 0xa, 0xff, 0x30, 0x2, 0xef, 0xff, 0xfc, 0x10, + 0xbf, 0xfc, 0xbf, 0xff, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xc0, 0x3f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xd1, 0x3, 0xdf, 0xfe, 0x60, + 0x0, 0x0, 0x0, 0x4, 0x75, 0x0, 0x0, 0x1, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xfe, 0xe, 0x70, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xfe, 0xe, 0xf7, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xfe, 0xe, 0xff, 0x70, + 0x1, 0x22, 0x5, 0xff, 0xff, 0xff, 0xfe, 0xe, + 0xff, 0xf2, 0xdf, 0xff, 0x25, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0xff, 0xff, 0x25, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0x25, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0x25, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0x24, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, 0x50, 0x56, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, 0xff, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x8b, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xb7, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x2a, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x91, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, 0x10, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xd0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xf5, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xf6, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf6, + 0xff, 0xfb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xfe, 0x51, 0x3b, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xda, 0xbf, 0xff, 0xff, + 0xff, 0xf6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, + + /* U+F0C9 "" */ + 0xce, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xd1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x13, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x12, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x10, + + /* U+F0E0 "" */ + 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x20, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0xb1, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x3e, 0xfe, 0x50, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x7, 0xff, + 0xff, 0xf9, 0x3, 0xef, 0xff, 0xff, 0xff, 0xfe, + 0x31, 0xbf, 0xff, 0xff, 0xff, 0xd3, 0x1b, 0xff, + 0xff, 0xff, 0xb1, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x6f, 0xff, 0xf6, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x12, 0x99, 0x22, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x33, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, + + /* U+F0E7 "" */ + 0x0, 0x3, 0x44, 0x44, 0x43, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfe, 0x66, 0x66, 0x51, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x1, 0x22, 0x22, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0x90, 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8c, 0xcc, 0xdf, 0xbc, + 0xfc, 0xcc, 0xc6, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xfe, 0x1, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xde, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x92, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xfc, 0x1, 0x22, 0x22, 0x22, 0x1, 0x0, 0x0, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xfc, 0xe, + 0x70, 0x0, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, + 0xfc, 0xe, 0xf7, 0x0, 0xff, 0xff, 0xf8, 0x1f, + 0xff, 0xff, 0xfc, 0xe, 0xff, 0x70, 0xff, 0xff, + 0xf8, 0x1f, 0xff, 0xff, 0xfc, 0xe, 0xff, 0xf2, + 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xf8, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x58, 0x88, 0x84, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x8, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x80, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xef, 0xf9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x6c, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7b, 0x81, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x19, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb7, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfd, 0x0, + 0x8f, 0x10, 0x7f, 0x10, 0x5f, 0x30, 0x3f, 0x50, + 0x1f, 0xfc, 0xff, 0xc0, 0x7, 0xe0, 0x6, 0xf0, + 0x4, 0xf2, 0x2, 0xf4, 0x0, 0xff, 0xcf, 0xfc, + 0x0, 0x8f, 0x0, 0x7f, 0x10, 0x5f, 0x30, 0x3f, + 0x50, 0x1f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xfe, 0x66, 0xbf, 0x66, 0xaf, 0x76, 0x8f, + 0x86, 0x7f, 0xff, 0xfc, 0xff, 0xff, 0xd0, 0x6, + 0xf0, 0x5, 0xf1, 0x3, 0xf3, 0x1, 0xff, 0xff, + 0xcf, 0xff, 0xfd, 0x0, 0x7f, 0x0, 0x5f, 0x10, + 0x3f, 0x30, 0x1f, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xfe, 0x66, 0xcf, 0x76, 0x66, 0x66, + 0x66, 0x66, 0x9f, 0xa6, 0x7f, 0xfc, 0xff, 0xc0, + 0x7, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xf4, + 0x0, 0xff, 0xcf, 0xfc, 0x0, 0x7e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0x40, 0xf, 0xfc, 0xff, + 0xfc, 0xce, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcd, + 0xfd, 0xcc, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, + 0x22, 0x7f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xb8, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "ï…›" */ + 0x37, 0x77, 0x77, 0x77, 0x74, 0x5, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xfa, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xf, 0xfa, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xff, + 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xf, + 0xff, 0xfa, 0xf, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x22, 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0x9c, 0xde, 0xdc, 0xb8, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xdb, 0x99, 0x9a, + 0xcf, 0xff, 0xff, 0xff, 0xb1, 0x0, 0xa, 0xff, + 0xff, 0xfc, 0x61, 0x0, 0x0, 0x0, 0x0, 0x39, + 0xef, 0xff, 0xfe, 0x40, 0xcf, 0xff, 0xfb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xf4, 0xaf, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xf2, + 0xa, 0xd2, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xed, + 0xb6, 0x20, 0x0, 0x0, 0x8e, 0x30, 0x0, 0x0, + 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfb, + 0x87, 0x89, 0xdf, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xba, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3, + 0x7f, 0xfa, 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xfa, + 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x1f, 0xfa, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7, + 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0x92, 0x0, + + /* U+F241 "ï‰" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x3, + 0x7f, 0xfa, 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x86, 0x0, 0x0, 0x7, + 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0x92, 0x0, + + /* U+F242 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0xef, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x7f, 0xfa, 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x78, 0x88, + 0x88, 0x88, 0x85, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0x92, 0x0, + + /* U+F243 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, + 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0xef, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x7f, 0xfa, 0xff, 0xc0, 0xef, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0xff, 0xc0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0xff, 0xc0, + 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x78, 0x88, + 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0x92, 0x0, + + /* U+F244 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x7f, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0x92, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x12, 0xdf, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0x76, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xf6, 0x0, 0x4c, + 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, + 0x0, 0x0, 0xd, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xd2, 0x0, + 0x4f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x40, 0x0, 0xaf, 0xff, 0xfc, 0x1, 0xde, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x10, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xdf, 0xff, + 0xff, 0x88, 0x88, 0x9f, 0xe8, 0x88, 0x88, 0x88, + 0x88, 0x8f, 0xff, 0x91, 0x5f, 0xff, 0xf8, 0x0, + 0x0, 0x7, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xc3, 0x0, 0x4, 0xbb, 0x60, 0x0, 0x0, 0x0, + 0xeb, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x30, + 0x8, 0x88, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xc1, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0x9f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x9e, 0xff, 0xff, 0xc7, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xdf, 0xff, 0xfd, + 0x20, 0x0, 0x8, 0xff, 0xff, 0xf2, 0xdf, 0xff, + 0xfe, 0x0, 0x3, 0xff, 0xff, 0xff, 0x11, 0xdf, + 0xff, 0xf9, 0x0, 0xaf, 0xff, 0xff, 0xf1, 0x1, + 0xef, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0x12, + 0x12, 0xef, 0xff, 0x53, 0xff, 0xf4, 0x7f, 0xf1, + 0x3d, 0x13, 0xff, 0xf8, 0x6f, 0xff, 0x40, 0x7f, + 0x13, 0xf5, 0xc, 0xff, 0xb8, 0xff, 0xff, 0x40, + 0x71, 0x35, 0xa, 0xff, 0xfd, 0x9f, 0xff, 0xff, + 0x40, 0x0, 0x8, 0xff, 0xff, 0xea, 0xff, 0xff, + 0xff, 0x30, 0x6, 0xff, 0xff, 0xfe, 0xaf, 0xff, + 0xff, 0xf4, 0x0, 0x6f, 0xff, 0xff, 0xe9, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0x8f, + 0xff, 0xf4, 0x6, 0x13, 0x50, 0x8f, 0xff, 0xd6, + 0xff, 0xf4, 0x7, 0xf1, 0x3f, 0x40, 0x9f, 0xfb, + 0x3f, 0xff, 0x47, 0xff, 0x13, 0xd1, 0x1d, 0xff, + 0x90, 0xff, 0xff, 0xff, 0xf1, 0x21, 0x1d, 0xff, + 0xf5, 0xa, 0xff, 0xff, 0xff, 0x20, 0x2e, 0xff, + 0xff, 0x0, 0x2f, 0xff, 0xff, 0xf2, 0x2e, 0xff, + 0xff, 0x80, 0x0, 0x6f, 0xff, 0xff, 0x4e, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xdd, + 0xc9, 0x40, 0x0, 0x0, + + /* U+F2ED "ï‹­" */ + 0x0, 0x0, 0x0, 0x2, 0x22, 0x22, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0xac, 0xcc, 0xcd, 0xff, + 0xff, 0xff, 0xfd, 0xcc, 0xcc, 0xc1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xca, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0xa, 0xff, 0xe1, 0xef, 0xf2, 0xcf, + 0xf3, 0xbf, 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, + 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, + 0xd0, 0xdf, 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, + 0xa, 0xff, 0xd0, 0xdf, 0xf0, 0xbf, 0xf1, 0x9f, + 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, 0xf0, 0xbf, + 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, + 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, + 0xd0, 0xdf, 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, + 0xa, 0xff, 0xd0, 0xdf, 0xf0, 0xbf, 0xf1, 0x9f, + 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, 0xf0, 0xbf, + 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, + 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, + 0xe1, 0xef, 0xf1, 0xcf, 0xf3, 0xaf, 0xfe, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x7b, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcb, 0x91, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xc, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xf4, 0xc, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf4, 0xc, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xf4, 0xc, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xf4, 0xc, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xb9, 0x75, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x2, 0x68, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x75, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x80, 0xcf, + 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xc, 0xfc, 0x0, + 0xc, 0xff, 0xff, 0xf8, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x90, 0x0, 0x5f, 0xff, + 0xff, 0xf8, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xf8, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x10, 0x0, 0xcf, 0xff, + 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x5, 0xf5, 0x0, 0xd, 0xff, 0xff, 0xf8, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x5f, + 0xff, 0x50, 0x2e, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xe8, 0xff, 0xff, 0xf8, + 0xef, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x9, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfe, + 0x70, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x2, 0xef, 0xbb, 0xfc, 0xbf, 0xdb, + 0xbf, 0xf9, 0x2, 0xef, 0xd0, 0x2f, 0x40, 0xe7, + 0x1, 0xff, 0xa2, 0xef, 0xfd, 0x2, 0xf4, 0xe, + 0x70, 0x1f, 0xfa, 0xef, 0xff, 0xd0, 0x2f, 0x40, + 0xe7, 0x1, 0xff, 0xaf, 0xff, 0xfd, 0x24, 0xf6, + 0x2e, 0x82, 0x3f, 0xfa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x99, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x9, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd5, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0x10, 0x0, 0x3, 0xed, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x4, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x10, 0x5, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf1, 0x6, 0xff, 0xff, + 0xf6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x9f, 0xff, + 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x13, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x2, 0xef, 0xff, 0xf1, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0, 0x2, + 0xdf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 95, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 94, .box_w = 4, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 32, .adv_w = 138, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 57, .adv_w = 247, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 177, .adv_w = 219, .box_w = 13, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 320, .adv_w = 297, .box_w = 18, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 464, .adv_w = 241, .box_w = 15, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 592, .adv_w = 74, .box_w = 3, .box_h = 7, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 603, .adv_w = 119, .box_w = 5, .box_h = 21, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 656, .adv_w = 119, .box_w = 6, .box_h = 21, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 719, .adv_w = 141, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 760, .adv_w = 205, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 815, .adv_w = 80, .box_w = 3, .box_h = 7, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 826, .adv_w = 135, .box_w = 7, .box_h = 2, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 833, .adv_w = 80, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 839, .adv_w = 124, .box_w = 10, .box_h = 21, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 944, .adv_w = 235, .box_w = 13, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1048, .adv_w = 130, .box_w = 6, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1096, .adv_w = 202, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1192, .adv_w = 201, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1288, .adv_w = 235, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1408, .adv_w = 202, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1504, .adv_w = 217, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1600, .adv_w = 210, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1704, .adv_w = 227, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1816, .adv_w = 217, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1920, .adv_w = 80, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1938, .adv_w = 80, .box_w = 3, .box_h = 16, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1962, .adv_w = 205, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 2023, .adv_w = 205, .box_w = 11, .box_h = 7, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 2062, .adv_w = 205, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 2123, .adv_w = 202, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2219, .adv_w = 364, .box_w = 21, .box_h = 20, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 2429, .adv_w = 258, .box_w = 18, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2573, .adv_w = 266, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2685, .adv_w = 254, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2805, .adv_w = 291, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2933, .adv_w = 236, .box_w = 12, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3029, .adv_w = 224, .box_w = 12, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3125, .adv_w = 272, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3245, .adv_w = 286, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3357, .adv_w = 109, .box_w = 3, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3381, .adv_w = 181, .box_w = 11, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3469, .adv_w = 253, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3581, .adv_w = 209, .box_w = 11, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3669, .adv_w = 336, .box_w = 17, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3805, .adv_w = 286, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3917, .adv_w = 296, .box_w = 17, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4053, .adv_w = 254, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4157, .adv_w = 296, .box_w = 18, .box_h = 19, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 4328, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4432, .adv_w = 219, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4536, .adv_w = 207, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4640, .adv_w = 278, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4752, .adv_w = 251, .box_w = 17, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4888, .adv_w = 396, .box_w = 25, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5088, .adv_w = 237, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5208, .adv_w = 228, .box_w = 16, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5336, .adv_w = 231, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5448, .adv_w = 117, .box_w = 5, .box_h = 21, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 5501, .adv_w = 124, .box_w = 10, .box_h = 21, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 5606, .adv_w = 117, .box_w = 6, .box_h = 21, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 5669, .adv_w = 205, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 5724, .adv_w = 176, .box_w = 11, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5741, .adv_w = 211, .box_w = 7, .box_h = 3, .ofs_x = 2, .ofs_y = 14}, + {.bitmap_index = 5752, .adv_w = 210, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5818, .adv_w = 240, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5929, .adv_w = 201, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6001, .adv_w = 240, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6112, .adv_w = 215, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6190, .adv_w = 124, .box_w = 9, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6267, .adv_w = 243, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 6379, .adv_w = 240, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6481, .adv_w = 98, .box_w = 4, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6515, .adv_w = 100, .box_w = 8, .box_h = 21, .ofs_x = -3, .ofs_y = -4}, + {.bitmap_index = 6599, .adv_w = 217, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6701, .adv_w = 98, .box_w = 3, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6727, .adv_w = 372, .box_w = 20, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6847, .adv_w = 240, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6919, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7003, .adv_w = 240, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 7107, .adv_w = 240, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 7211, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7253, .adv_w = 176, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7319, .adv_w = 146, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7387, .adv_w = 238, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7459, .adv_w = 197, .box_w = 14, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7543, .adv_w = 316, .box_w = 20, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7663, .adv_w = 194, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7735, .adv_w = 197, .box_w = 14, .box_h = 16, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 7847, .adv_w = 183, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7913, .adv_w = 124, .box_w = 7, .box_h = 21, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 7987, .adv_w = 105, .box_w = 3, .box_h = 21, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 8019, .adv_w = 124, .box_w = 7, .box_h = 21, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 8093, .adv_w = 205, .box_w = 11, .box_h = 4, .ofs_x = 1, .ofs_y = 6}, + {.bitmap_index = 8115, .adv_w = 147, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 8151, .adv_w = 111, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 8164, .adv_w = 352, .box_w = 23, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 8429, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8616, .adv_w = 352, .box_w = 22, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8836, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9023, .adv_w = 242, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9151, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9404, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9657, .adv_w = 396, .box_w = 25, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9907, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10160, .adv_w = 396, .box_w = 25, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10373, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10626, .adv_w = 176, .box_w = 11, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10725, .adv_w = 264, .box_w = 17, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10878, .adv_w = 396, .box_w = 25, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11153, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11340, .adv_w = 242, .box_w = 16, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11524, .adv_w = 308, .box_w = 15, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 11682, .adv_w = 308, .box_w = 20, .box_h = 24, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 11922, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 12122, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 12322, .adv_w = 308, .box_w = 15, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 12480, .adv_w = 308, .box_w = 21, .box_h = 20, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 12690, .adv_w = 220, .box_w = 12, .box_h = 20, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 12810, .adv_w = 220, .box_w = 12, .box_h = 20, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 12930, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13130, .adv_w = 308, .box_w = 20, .box_h = 5, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 13180, .adv_w = 396, .box_w = 25, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13393, .adv_w = 440, .box_w = 28, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 13715, .adv_w = 396, .box_w = 27, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 14026, .adv_w = 352, .box_w = 22, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14257, .adv_w = 308, .box_w = 19, .box_h = 12, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 14371, .adv_w = 308, .box_w = 19, .box_h = 12, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 14485, .adv_w = 440, .box_w = 28, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14737, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14924, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 15177, .adv_w = 352, .box_w = 23, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 15442, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15642, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 15872, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16072, .adv_w = 308, .box_w = 20, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16252, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16439, .adv_w = 220, .box_w = 15, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 16612, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 16842, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 17072, .adv_w = 396, .box_w = 25, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17285, .adv_w = 352, .box_w = 24, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 17561, .adv_w = 264, .box_w = 17, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 17757, .adv_w = 440, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18051, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 18261, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 18471, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 18681, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 18891, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 19101, .adv_w = 440, .box_w = 28, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19353, .adv_w = 308, .box_w = 17, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 19549, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 19779, .adv_w = 352, .box_w = 23, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 20044, .adv_w = 440, .box_w = 28, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20282, .adv_w = 264, .box_w = 17, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 20478, .adv_w = 354, .box_w = 23, .box_h = 14, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 4, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 16, 0, 10, -8, 0, 0, + 0, 0, -19, -21, 2, 17, 8, 6, + -14, 2, 17, 1, 15, 4, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 21, 3, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 0, -11, 0, 0, 0, 0, + 0, -7, 6, 7, 0, 0, -4, 0, + -2, 4, 0, -4, 0, -4, -2, -7, + 0, 0, 0, 0, -4, 0, 0, -5, + -5, 0, 0, -4, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + -4, 0, -5, 0, -10, 0, -43, 0, + 0, -7, 0, 7, 11, 0, 0, -7, + 4, 4, 12, 7, -6, 7, 0, 0, + -20, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -10, -4, -17, 0, -14, + -2, 0, 0, 0, 0, 1, 14, 0, + -11, -3, -1, 1, 0, -6, 0, 0, + -2, -26, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -28, -3, 13, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 12, + 0, 4, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 3, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 7, 4, 11, -4, 0, 0, 7, -4, + -12, -48, 2, 10, 7, 1, -5, 0, + 13, 0, 11, 0, 11, 0, -33, 0, + -4, 11, 0, 12, -4, 7, 4, 0, + 0, 1, -4, 0, 0, -6, 28, 0, + 28, 0, 11, 0, 15, 5, 6, 11, + 0, 0, 0, -13, 0, 0, 0, 0, + 1, -2, 0, 2, -6, -5, -7, 2, + 0, -4, 0, 0, 0, -14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -23, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -19, 0, -22, 0, 0, 0, + 0, -2, 0, 35, -4, -5, 4, 4, + -3, 0, -5, 4, 0, 0, -19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -34, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -22, 0, 21, 0, 0, -13, 0, + 12, 0, -24, -34, -24, -7, 11, 0, + 0, -24, 0, 4, -8, 0, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 11, -43, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 17, 0, 2, 0, 0, 0, + 0, 0, 2, 2, -4, -7, 0, -1, + -1, -4, 0, 0, -2, 0, 0, 0, + -7, 0, -3, 0, -8, -7, 0, -9, + -12, -12, -7, 0, -7, 0, -7, 0, + 0, 0, 0, -3, 0, 0, 4, 0, + 2, -4, 0, 1, 0, 0, 0, 4, + -2, 0, 0, 0, -2, 4, 4, -1, + 0, 0, 0, -7, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 5, -2, 0, + -4, 0, -6, 0, 0, -2, 0, 11, + 0, 0, -4, 0, 0, 0, 0, 0, + -1, 1, -2, -2, 0, 0, -4, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, -4, -4, 0, + 0, 0, 0, 0, 1, 0, 0, -2, + 0, -4, -4, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, -2, -5, 0, -5, 0, -11, + -2, -11, 7, 0, 0, -7, 4, 7, + 10, 0, -9, -1, -4, 0, -1, -17, + 4, -2, 2, -19, 4, 0, 0, 1, + -18, 0, -19, -3, -31, -2, 0, -18, + 0, 7, 10, 0, 5, 0, 0, 0, + 0, 1, 0, -6, -5, 0, -11, 0, + 0, 0, -4, 0, 0, 0, -4, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + -5, 0, 0, 0, 0, 0, 0, 0, + -4, -4, 0, -2, -4, -3, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, -3, 0, -4, + 0, -2, 0, -7, 4, 0, 0, -4, + 2, 4, 4, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 2, + 0, 0, -4, 0, -4, -2, -4, 0, + 0, 0, 0, 0, 0, 0, 3, 0, + -3, 0, 0, 0, 0, -4, -5, 0, + -7, 0, 11, -2, 1, -11, 0, 0, + 10, -18, -18, -15, -7, 4, 0, -3, + -23, -6, 0, -6, 0, -7, 5, -6, + -23, 0, -10, 0, 0, 2, -1, 3, + -2, 0, 4, 0, -11, -13, 0, -18, + -8, -7, -8, -11, -4, -10, -1, -7, + -10, 2, 0, 1, 0, -4, 0, 0, + 0, 2, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, -2, 0, -1, -4, 0, -6, -8, + -8, -1, 0, -11, 0, 0, 0, 0, + 0, 0, -3, 0, 0, 0, 0, 1, + -2, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 17, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + -7, 0, 0, 0, 0, -18, -11, 0, + 0, 0, -5, -18, 0, 0, -4, 4, + 0, -10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, -6, 0, + 0, 0, 0, 4, 0, 2, -7, -7, + 0, -4, -4, -4, 0, 0, 0, 0, + 0, 0, -11, 0, -4, 0, -5, -4, + 0, -8, -9, -11, -3, 0, -7, 0, + -11, 0, 0, 0, 0, 28, 0, 0, + 2, 0, 0, -5, 0, 4, 0, -15, + 0, 0, 0, 0, 0, -33, -6, 12, + 11, -3, -15, 0, 4, -5, 0, -18, + -2, -5, 4, -25, -4, 5, 0, 5, + -12, -5, -13, -12, -15, 0, 0, -21, + 0, 20, 0, 0, -2, 0, 0, 0, + -2, -2, -4, -10, -12, -1, -33, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, -2, -4, -5, 0, 0, + -7, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -7, 0, 0, 7, + -1, 5, 0, -8, 4, -2, -1, -9, + -4, 0, -5, -4, -2, 0, -5, -6, + 0, 0, -3, -1, -2, -6, -4, 0, + 0, -4, 0, 4, -2, 0, -8, 0, + 0, 0, -7, 0, -6, 0, -6, -6, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, -7, 4, 0, -5, 0, -2, -4, + -11, -2, -2, -2, -1, -2, -4, -1, + 0, 0, 0, 0, 0, -4, -3, -3, + 0, 0, 0, 0, 4, -2, 0, -2, + 0, 0, 0, -2, -4, -2, -3, -4, + -3, 0, 3, 14, -1, 0, -10, 0, + -2, 7, 0, -4, -15, -5, 5, 0, + 0, -17, -6, 4, -6, 2, 0, -2, + -3, -11, 0, -5, 2, 0, 0, -6, + 0, 0, 0, 4, 4, -7, -7, 0, + -6, -4, -5, -4, -4, 0, -6, 2, + -7, -6, 11, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, -5, + 0, 0, -4, -4, 0, 0, 0, 0, + -4, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + -5, 0, -7, 0, 0, 0, -12, 0, + 2, -8, 7, 1, -2, -17, 0, 0, + -8, -4, 0, -14, -9, -10, 0, 0, + -15, -4, -14, -13, -17, 0, -9, 0, + 3, 24, -5, 0, -8, -4, -1, -4, + -6, -10, -6, -13, -14, -8, -4, 0, + 0, -2, 0, 1, 0, 0, -25, -3, + 11, 8, -8, -13, 0, 1, -11, 0, + -18, -2, -4, 7, -32, -5, 1, 0, + 0, -23, -4, -18, -4, -26, 0, 0, + -25, 0, 21, 1, 0, -2, 0, 0, + 0, 0, -2, -2, -13, -2, 0, -23, + 0, 0, 0, 0, -11, 0, -3, 0, + -1, -10, -17, 0, 0, -2, -5, -11, + -4, 0, -2, 0, 0, 0, 0, -16, + -4, -12, -11, -3, -6, -9, -4, -6, + 0, -7, -3, -12, -5, 0, -4, -7, + -4, -7, 0, 2, 0, -2, -12, 0, + 7, 0, -6, 0, 0, 0, 0, 4, + 0, 2, -7, 14, 0, -4, -4, -4, + 0, 0, 0, 0, 0, 0, -11, 0, + -4, 0, -5, -4, 0, -8, -9, -11, + -3, 0, -7, 3, 14, 0, 0, 0, + 0, 28, 0, 0, 2, 0, 0, -5, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -2, -7, 0, 0, 0, 0, 0, -2, + 0, 0, 0, -4, -4, 0, 0, -7, + -4, 0, 0, -7, 0, 6, -2, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 5, 7, 3, -3, 0, -11, + -6, 0, 11, -12, -11, -7, -7, 14, + 6, 4, -31, -2, 7, -4, 0, -4, + 4, -4, -12, 0, -4, 4, -5, -3, + -11, -3, 0, 0, 11, 7, 0, -10, + 0, -19, -5, 10, -5, -13, 1, -5, + -12, -12, -4, 14, 4, 0, -5, 0, + -10, 0, 3, 12, -8, -13, -14, -9, + 11, 0, 1, -26, -3, 4, -6, -2, + -8, 0, -8, -13, -5, -5, -3, 0, + 0, -8, -7, -4, 0, 11, 8, -4, + -19, 0, -19, -5, 0, -12, -20, -1, + -11, -6, -12, -10, 10, 0, 0, -5, + 0, -7, -3, 0, -4, -6, 0, 6, + -12, 4, 0, 0, -19, 0, -4, -8, + -6, -2, -11, -9, -12, -8, 0, -11, + -4, -8, -7, -11, -4, 0, 0, 1, + 17, -6, 0, -11, -4, 0, -4, -7, + -8, -10, -10, -13, -5, -7, 7, 0, + -5, 0, -18, -4, 2, 7, -11, -13, + -7, -12, 12, -4, 2, -33, -6, 7, + -8, -6, -13, 0, -11, -15, -4, -4, + -3, -4, -7, -11, -1, 0, 0, 11, + 10, -2, -23, 0, -21, -8, 8, -13, + -24, -7, -12, -15, -18, -12, 7, 0, + 0, 0, 0, -4, 0, 0, 4, -4, + 7, 2, -7, 7, 0, 0, -11, -1, + 0, -1, 0, 1, 1, -3, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 3, 11, 1, 0, -4, 0, 0, + 0, 0, -2, -2, -4, 0, 0, 0, + 1, 3, 0, 0, 0, 0, 3, 0, + -3, 0, 13, 0, 6, 1, 1, -5, + 0, 7, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 11, 0, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -21, 0, -4, 6, 0, 11, + 0, 0, 35, 4, -7, -7, 4, 4, + -2, 1, -18, 0, 0, 17, -21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -24, 13, 49, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -21, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, -7, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, -10, 0, + 0, 1, 0, 0, 4, 45, -7, -3, + 11, 10, -10, 4, 0, 0, 4, 4, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -46, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -10, + 0, 0, 0, -10, 0, 0, 0, 0, + -8, -2, 0, 0, 0, -8, 0, -4, + 0, -17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -24, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -4, 0, 0, -7, 0, -5, 0, + -10, 0, 0, 0, -6, 4, -4, 0, + 0, -10, -4, -8, 0, 0, -10, 0, + -4, 0, -17, 0, -4, 0, 0, -29, + -7, -14, -4, -13, 0, 0, -24, 0, + -10, -2, 0, 0, 0, 0, 0, 0, + 0, 0, -5, -6, -3, -6, 0, 0, + 0, 0, -8, 0, -8, 5, -4, 7, + 0, -2, -8, -2, -6, -7, 0, -4, + -2, -2, 2, -10, -1, 0, 0, 0, + -31, -3, -5, 0, -8, 0, -2, -17, + -3, 0, 0, -2, -3, 0, 0, 0, + 0, 2, 0, -2, -6, -2, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 0, + 0, -8, 0, -2, 0, 0, 0, -7, + 4, 0, 0, 0, -10, -4, -7, 0, + 0, -10, 0, -4, 0, -17, 0, 0, + 0, 0, -34, 0, -7, -13, -18, 0, + 0, -24, 0, -2, -5, 0, 0, 0, + 0, 0, 0, 0, 0, -4, -5, -2, + -5, 1, 0, 0, 6, -5, 0, 11, + 17, -4, -4, -11, 4, 17, 6, 8, + -10, 4, 15, 4, 10, 8, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 22, 17, -6, -4, 0, -3, + 28, 15, 28, 0, 0, 0, 4, 0, + 0, 13, 0, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 5, + 0, 0, 0, 0, -30, -4, -3, -14, + -17, 0, 0, -24, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, -30, -4, -3, + -14, -17, 0, 0, -14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, -8, 4, 0, -4, + 3, 6, 4, -11, 0, -1, -3, 4, + 0, 3, 0, 0, 0, 0, -9, 0, + -3, -2, -7, 0, -3, -14, 0, 22, + -4, 0, -8, -2, 0, -2, -6, 0, + -4, -10, -7, -4, 0, 0, 0, -6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, -30, + -4, -3, -14, -17, 0, 0, -24, 0, + 0, 0, 0, 0, 0, 18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -6, 0, -11, -4, -3, 11, -3, -4, + -14, 1, -2, 1, -2, -10, 1, 8, + 1, 3, 1, 3, -8, -14, -4, 0, + -13, -7, -10, -15, -14, 0, -6, -7, + -4, -5, -3, -2, -4, -2, 0, -2, + -1, 5, 0, 5, -2, 0, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2, -4, -4, 0, 0, + -10, 0, -2, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -21, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -5, + 0, 0, 0, 0, -3, 0, 0, -6, + -4, 4, 0, -6, -7, -2, 0, -10, + -2, -8, -2, -4, 0, -6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -24, 0, 11, 0, 0, -6, 0, + 0, 0, 0, -5, 0, -4, 0, 0, + -2, 0, 0, -2, 0, -8, 0, 0, + 15, -5, -12, -11, 2, 4, 4, -1, + -10, 2, 5, 2, 11, 2, 12, -2, + -10, 0, 0, -14, 0, 0, -11, -10, + 0, 0, -7, 0, -5, -6, 0, -5, + 0, -5, 0, -2, 5, 0, -3, -11, + -4, 13, 0, 0, -3, 0, -7, 0, + 0, 5, -8, 0, 4, -4, 3, 0, + 0, -12, 0, -2, -1, 0, -4, 4, + -3, 0, 0, 0, -14, -4, -8, 0, + -11, 0, 0, -17, 0, 13, -4, 0, + -6, 0, 2, 0, -4, 0, -4, -11, + 0, -4, 4, 0, 0, 0, 0, -2, + 0, 0, 4, -5, 1, 0, 0, -4, + -2, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -22, 0, 8, 0, + 0, -3, 0, 0, 0, 0, 1, 0, + -4, -4, 0, 0, 0, 7, 0, 8, + 0, 0, 0, 0, 0, -22, -20, 1, + 15, 11, 6, -14, 2, 15, 0, 13, + 0, 7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserrat_22 = { +#else +lv_font_t lv_font_montserrat_22 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 24, /*The maximum line height required by the font*/ + .base_line = 4, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_22*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_24.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_24.c new file mode 100644 index 0000000..9795f70 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_24.c @@ -0,0 +1,4066 @@ +/******************************************************************************* + * Size: 24 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 24 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_24.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_24 + #define LV_FONT_MONTSERRAT_24 1 +#endif + +#if LV_FONT_MONTSERRAT_24 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x1f, 0xf8, 0x1f, 0xf8, 0xf, 0xf7, 0xf, 0xf7, + 0xf, 0xf6, 0xe, 0xf5, 0xe, 0xf5, 0xd, 0xf4, + 0xd, 0xf3, 0xc, 0xf3, 0xb, 0xf2, 0x7, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xf6, 0x4f, 0xfb, + 0xc, 0xe5, + + /* U+0022 "\"" */ + 0x7f, 0x80, 0x2f, 0xd7, 0xf7, 0x1, 0xfd, 0x6f, + 0x70, 0x1f, 0xc6, 0xf7, 0x1, 0xfc, 0x6f, 0x60, + 0xf, 0xc5, 0xf6, 0x0, 0xfb, 0x38, 0x30, 0x8, + 0x60, + + /* U+0023 "#" */ + 0x0, 0x0, 0x8, 0xf2, 0x0, 0x5, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x7f, 0x30, + 0x0, 0x0, 0x0, 0xd, 0xe0, 0x0, 0x9, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xfc, 0x0, 0x0, 0xbf, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x7c, 0xcd, 0xfe, 0xcc, 0xcc, + 0xfe, 0xcc, 0xc2, 0x0, 0x0, 0x4f, 0x60, 0x0, + 0x1f, 0x90, 0x0, 0x0, 0x0, 0x6, 0xf4, 0x0, + 0x3, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x20, + 0x0, 0x4f, 0x60, 0x0, 0x0, 0x0, 0xa, 0xf0, + 0x0, 0x6, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xce, + 0x0, 0x0, 0x8f, 0x20, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4c, 0xcc, + 0xfe, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0x0, 0x0, + 0x2f, 0x90, 0x0, 0xe, 0xd0, 0x0, 0x0, 0x0, + 0x4, 0xf7, 0x0, 0x0, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0x50, 0x0, 0x2f, 0x90, 0x0, 0x0, + 0x0, 0x8, 0xf3, 0x0, 0x4, 0xf7, 0x0, 0x0, + 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x3f, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0x50, 0x0, 0x0, 0x0, 0x1, 0x7c, + 0xff, 0xfe, 0xb6, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x1, 0xef, 0xe6, 0x5f, 0x73, + 0x7d, 0xc0, 0x6, 0xff, 0x20, 0x3f, 0x50, 0x0, + 0x20, 0x9, 0xfc, 0x0, 0x3f, 0x50, 0x0, 0x0, + 0x8, 0xfe, 0x0, 0x3f, 0x50, 0x0, 0x0, 0x3, + 0xff, 0xc3, 0x3f, 0x50, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xef, 0x91, 0x0, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xc5, 0x0, 0x0, 0x0, 0x1, 0x7f, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x3f, 0x53, + 0xbf, 0xf7, 0x0, 0x0, 0x0, 0x3f, 0x50, 0xb, + 0xfc, 0x0, 0x0, 0x0, 0x3f, 0x50, 0x7, 0xfe, + 0x5, 0x70, 0x0, 0x3f, 0x50, 0xc, 0xfb, 0xc, + 0xfd, 0x73, 0x4f, 0x64, 0xbf, 0xf4, 0x5, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x6, 0xbe, + 0xff, 0xfe, 0x93, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x50, 0x0, + 0x0, + + /* U+0025 "%" */ + 0x0, 0x3c, 0xfe, 0x90, 0x0, 0x0, 0x0, 0x6f, + 0x70, 0x0, 0x3, 0xfd, 0x78, 0xfb, 0x0, 0x0, + 0x2, 0xfc, 0x0, 0x0, 0xb, 0xe1, 0x0, 0x6f, + 0x40, 0x0, 0xc, 0xf2, 0x0, 0x0, 0xf, 0x90, + 0x0, 0xf, 0x90, 0x0, 0x7f, 0x60, 0x0, 0x0, + 0x1f, 0x70, 0x0, 0xe, 0xa0, 0x2, 0xfb, 0x0, + 0x0, 0x0, 0xf, 0x80, 0x0, 0xf, 0x90, 0xc, + 0xf1, 0x0, 0x0, 0x0, 0xd, 0xd0, 0x0, 0x3f, + 0x60, 0x7f, 0x60, 0x0, 0x0, 0x0, 0x5, 0xf9, + 0x24, 0xde, 0x2, 0xfb, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xd3, 0xc, 0xe1, 0x8, 0xff, + 0xe7, 0x0, 0x0, 0x1, 0x43, 0x0, 0x7f, 0x50, + 0x9f, 0x85, 0xaf, 0x70, 0x0, 0x0, 0x0, 0x2, + 0xfa, 0x2, 0xf8, 0x0, 0xb, 0xf0, 0x0, 0x0, + 0x0, 0xd, 0xe1, 0x5, 0xf3, 0x0, 0x5, 0xf4, + 0x0, 0x0, 0x0, 0x8f, 0x50, 0x6, 0xf1, 0x0, + 0x3, 0xf5, 0x0, 0x0, 0x3, 0xfa, 0x0, 0x5, + 0xf3, 0x0, 0x5, 0xf3, 0x0, 0x0, 0xd, 0xe1, + 0x0, 0x1, 0xf8, 0x0, 0xa, 0xe0, 0x0, 0x0, + 0x8f, 0x40, 0x0, 0x0, 0x8f, 0x84, 0x9f, 0x60, + 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, 0x7, 0xdf, + 0xd6, 0x0, + + /* U+0026 "&" */ + 0x0, 0x1, 0x9e, 0xfe, 0xa2, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xfe, 0xbd, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xaf, 0xb0, 0x0, 0x7f, 0xb0, 0x0, 0x0, + 0x0, 0xdf, 0x50, 0x0, 0x2f, 0xd0, 0x0, 0x0, + 0x0, 0xcf, 0x70, 0x0, 0x6f, 0xa0, 0x0, 0x0, + 0x0, 0x6f, 0xe1, 0x6, 0xff, 0x20, 0x0, 0x0, + 0x0, 0xb, 0xfd, 0xbf, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x51, 0xcf, 0xd1, 0x0, 0xac, 0x20, + 0x4f, 0xf2, 0x0, 0xc, 0xfd, 0x20, 0xff, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0xcf, 0xe8, 0xfb, 0x0, + 0xef, 0x60, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, + 0xcf, 0xa0, 0x0, 0x0, 0x1, 0xff, 0xf2, 0x0, + 0x6f, 0xfa, 0x20, 0x1, 0x6e, 0xff, 0xfe, 0x20, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xa1, 0xbf, 0xd0, + 0x0, 0x39, 0xdf, 0xfd, 0x93, 0x0, 0xb, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x7f, 0x87, 0xf7, 0x6f, 0x76, 0xf7, 0x6f, 0x65, + 0xf6, 0x38, 0x30, + + /* U+0028 "(" */ + 0x0, 0x2f, 0xf1, 0x0, 0x9f, 0x90, 0x1, 0xff, + 0x20, 0x6, 0xfc, 0x0, 0xc, 0xf7, 0x0, 0xf, + 0xf3, 0x0, 0x3f, 0xf0, 0x0, 0x6f, 0xd0, 0x0, + 0x8f, 0xb0, 0x0, 0x9f, 0xa0, 0x0, 0xaf, 0x90, + 0x0, 0xbf, 0x80, 0x0, 0xaf, 0x90, 0x0, 0x9f, + 0xa0, 0x0, 0x8f, 0xb0, 0x0, 0x6f, 0xd0, 0x0, + 0x3f, 0xf0, 0x0, 0xf, 0xf3, 0x0, 0xc, 0xf7, + 0x0, 0x6, 0xfc, 0x0, 0x1, 0xff, 0x20, 0x0, + 0x9f, 0x90, 0x0, 0x2f, 0xf1, + + /* U+0029 ")" */ + 0xf, 0xf3, 0x0, 0x8, 0xfb, 0x0, 0x1, 0xff, + 0x30, 0x0, 0xbf, 0x80, 0x0, 0x6f, 0xd0, 0x0, + 0x1f, 0xf2, 0x0, 0xe, 0xf5, 0x0, 0xb, 0xf8, + 0x0, 0x9, 0xfa, 0x0, 0x8, 0xfb, 0x0, 0x7, + 0xfc, 0x0, 0x6, 0xfd, 0x0, 0x7, 0xfc, 0x0, + 0x8, 0xfb, 0x0, 0x9, 0xfa, 0x0, 0xb, 0xf8, + 0x0, 0xe, 0xf5, 0x0, 0x1f, 0xf2, 0x0, 0x6f, + 0xd0, 0x0, 0xbf, 0x80, 0x1, 0xff, 0x30, 0x8, + 0xfb, 0x0, 0xf, 0xf3, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0xe8, 0x0, 0x0, 0x3, 0x0, 0xe8, + 0x0, 0x20, 0x4f, 0xa1, 0xe8, 0x4d, 0xe0, 0x8, + 0xff, 0xfe, 0xfd, 0x40, 0x0, 0x2e, 0xff, 0xb0, + 0x0, 0x7, 0xef, 0xff, 0xfc, 0x30, 0x5f, 0xb2, + 0xe8, 0x5e, 0xe0, 0x4, 0x0, 0xe8, 0x0, 0x30, + 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0xa, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5e, 0xee, 0xef, 0xfe, + 0xee, 0xe5, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, + 0x0, 0x0, + + /* U+002C "," */ + 0x3b, 0x80, 0xcf, 0xf3, 0xaf, 0xf3, 0xf, 0xe0, + 0x1f, 0x90, 0x5f, 0x40, 0x9e, 0x0, + + /* U+002D "-" */ + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0xaf, + 0xff, 0xff, 0xd0, + + /* U+002E "." */ + 0x4, 0x10, 0x9f, 0xf1, 0xdf, 0xf4, 0x6f, 0xb0, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, 0x0, 0x0, + 0x0, 0x4f, 0xd0, 0x0, 0x0, 0x0, 0x9, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, 0x0, 0x0, + 0x0, 0x4f, 0xc0, 0x0, 0x0, 0x0, 0xa, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x5f, 0xc0, 0x0, 0x0, 0x0, 0xa, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x5f, 0xb0, 0x0, 0x0, 0x0, 0xb, 0xf6, + 0x0, 0x0, 0x0, 0x1, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x6f, 0xb0, 0x0, 0x0, 0x0, 0xb, 0xf5, + 0x0, 0x0, 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xa0, 0x0, 0x0, 0x0, 0xc, 0xf5, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xa0, 0x0, 0x0, 0x0, 0xd, 0xf4, + 0x0, 0x0, 0x0, 0x2, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0x90, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x1, 0x8d, 0xff, 0xd8, 0x10, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x1, 0xff, + 0xe7, 0x33, 0x7e, 0xff, 0x10, 0xb, 0xfe, 0x20, + 0x0, 0x2, 0xef, 0xb0, 0x2f, 0xf5, 0x0, 0x0, + 0x0, 0x5f, 0xf2, 0x7f, 0xe0, 0x0, 0x0, 0x0, + 0xe, 0xf7, 0xaf, 0xb0, 0x0, 0x0, 0x0, 0xb, + 0xfa, 0xcf, 0x90, 0x0, 0x0, 0x0, 0x9, 0xfc, + 0xdf, 0x80, 0x0, 0x0, 0x0, 0x8, 0xfd, 0xcf, + 0x90, 0x0, 0x0, 0x0, 0x9, 0xfc, 0xaf, 0xb0, + 0x0, 0x0, 0x0, 0xb, 0xfa, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0xe, 0xf7, 0x2f, 0xf5, 0x0, 0x0, + 0x0, 0x5f, 0xf2, 0xb, 0xfe, 0x10, 0x0, 0x2, + 0xef, 0xb0, 0x1, 0xff, 0xe7, 0x33, 0x7e, 0xff, + 0x10, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x1, 0x7c, 0xee, 0xc7, 0x10, 0x0, + + /* U+0031 "1" */ + 0xdf, 0xff, 0xff, 0x5d, 0xff, 0xff, 0xf5, 0x11, + 0x11, 0xff, 0x50, 0x0, 0xf, 0xf5, 0x0, 0x0, + 0xff, 0x50, 0x0, 0xf, 0xf5, 0x0, 0x0, 0xff, + 0x50, 0x0, 0xf, 0xf5, 0x0, 0x0, 0xff, 0x50, + 0x0, 0xf, 0xf5, 0x0, 0x0, 0xff, 0x50, 0x0, + 0xf, 0xf5, 0x0, 0x0, 0xff, 0x50, 0x0, 0xf, + 0xf5, 0x0, 0x0, 0xff, 0x50, 0x0, 0xf, 0xf5, + 0x0, 0x0, 0xff, 0x50, + + /* U+0032 "2" */ + 0x0, 0x17, 0xce, 0xfe, 0xc6, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x6f, 0xfc, 0x63, + 0x35, 0xbf, 0xfa, 0x0, 0x97, 0x0, 0x0, 0x0, + 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x70, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xc0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xd1, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xd1, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xc1, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xc0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xc2, 0x11, 0x11, + 0x11, 0x11, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+0033 "3" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x1, 0x11, 0x11, + 0x11, 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x15, 0xef, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0x81, 0xa1, 0x0, 0x0, + 0x0, 0x4f, 0xf5, 0x9f, 0xfa, 0x53, 0x34, 0x9f, + 0xfd, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x49, 0xdf, 0xfe, 0xb6, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x60, 0x0, 0x9d, 0x70, 0x0, + 0x0, 0x1e, 0xfa, 0x0, 0x0, 0xbf, 0x90, 0x0, + 0x0, 0xbf, 0xd0, 0x0, 0x0, 0xbf, 0x90, 0x0, + 0x7, 0xff, 0x41, 0x11, 0x11, 0xbf, 0x91, 0x11, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x90, 0x0, + + /* U+0035 "5" */ + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xbf, 0x81, + 0x11, 0x11, 0x11, 0x0, 0xd, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x31, 0x10, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xfe, 0xa3, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x26, 0xdf, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xd0, 0x93, 0x0, 0x0, + 0x0, 0x1e, 0xfa, 0x5f, 0xfb, 0x63, 0x24, 0x7e, + 0xff, 0x31, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x28, 0xce, 0xfe, 0xc8, 0x10, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x4a, 0xdf, 0xfe, 0xb5, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0xcf, + 0xf9, 0x42, 0x23, 0x76, 0x0, 0x8, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xa0, 0x5b, 0xef, 0xd9, 0x30, + 0x0, 0xbf, 0x9a, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0xdf, 0xff, 0xc4, 0x1, 0x4c, 0xff, 0x40, 0xcf, + 0xfc, 0x0, 0x0, 0x0, 0xcf, 0xc0, 0xbf, 0xf5, + 0x0, 0x0, 0x0, 0x5f, 0xf0, 0x8f, 0xf2, 0x0, + 0x0, 0x0, 0x3f, 0xf1, 0x4f, 0xf4, 0x0, 0x0, + 0x0, 0x4f, 0xf0, 0xd, 0xfc, 0x0, 0x0, 0x0, + 0xbf, 0xb0, 0x4, 0xff, 0xc3, 0x0, 0x3b, 0xff, + 0x30, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x1, 0x8d, 0xff, 0xd9, 0x20, 0x0, + + /* U+0037 "7" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x4f, 0xf2, + 0x11, 0x11, 0x11, 0x8f, 0xf1, 0x4f, 0xf0, 0x0, + 0x0, 0x0, 0xef, 0x90, 0x4f, 0xf0, 0x0, 0x0, + 0x5, 0xff, 0x20, 0x2, 0x20, 0x0, 0x0, 0xc, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x6, 0xbe, 0xff, 0xd9, 0x20, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xd, 0xff, + 0x71, 0x0, 0x4b, 0xff, 0x40, 0x3f, 0xf5, 0x0, + 0x0, 0x0, 0xcf, 0xa0, 0x4f, 0xf1, 0x0, 0x0, + 0x0, 0x9f, 0xc0, 0x2f, 0xf5, 0x0, 0x0, 0x0, + 0xdf, 0x90, 0xa, 0xff, 0x72, 0x1, 0x4c, 0xff, + 0x20, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x4, 0xdf, 0xff, 0xef, 0xff, 0xf8, 0x0, 0x2f, + 0xfc, 0x40, 0x0, 0x18, 0xff, 0x90, 0xaf, 0xd0, + 0x0, 0x0, 0x0, 0x6f, 0xf2, 0xdf, 0x80, 0x0, + 0x0, 0x0, 0xf, 0xf5, 0xdf, 0x80, 0x0, 0x0, + 0x0, 0x1f, 0xf5, 0xaf, 0xe1, 0x0, 0x0, 0x0, + 0x8f, 0xf2, 0x3f, 0xfd, 0x51, 0x0, 0x3a, 0xff, + 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x17, 0xce, 0xff, 0xd9, 0x40, 0x0, + + /* U+0039 "9" */ + 0x0, 0x4, 0xae, 0xfe, 0xc7, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x8, 0xff, + 0x82, 0x0, 0x4c, 0xfe, 0x10, 0x1f, 0xf6, 0x0, + 0x0, 0x0, 0xcf, 0xa0, 0x3f, 0xf0, 0x0, 0x0, + 0x0, 0x6f, 0xf1, 0x4f, 0xf0, 0x0, 0x0, 0x0, + 0x6f, 0xf5, 0x1f, 0xf6, 0x0, 0x0, 0x0, 0xcf, + 0xf8, 0xa, 0xff, 0x82, 0x0, 0x4c, 0xff, 0xf9, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0x9c, 0xfa, 0x0, + 0x6, 0xbe, 0xfe, 0xa4, 0xd, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x50, 0x0, 0xa7, 0x31, 0x25, 0xcf, 0xf9, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x7b, 0xdf, 0xec, 0x82, 0x0, 0x0, + + /* U+003A ":" */ + 0x5f, 0xb0, 0xdf, 0xf4, 0x9f, 0xf1, 0x4, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x10, 0x9f, 0xf1, 0xdf, 0xf4, + 0x6f, 0xb0, + + /* U+003B ";" */ + 0x5f, 0xb0, 0xdf, 0xf4, 0x9f, 0xf1, 0x4, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5e, 0xb0, 0xcf, 0xf4, + 0x8f, 0xf2, 0xf, 0xd0, 0x2f, 0x80, 0x6f, 0x30, + 0x7b, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x84, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xf5, 0x0, 0x0, 0x18, 0xef, + 0xfe, 0x81, 0x0, 0x4b, 0xff, 0xfa, 0x40, 0x0, + 0x3e, 0xff, 0xd7, 0x10, 0x0, 0x0, 0x6f, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xd7, 0x10, + 0x0, 0x0, 0x0, 0x4b, 0xff, 0xfa, 0x40, 0x0, + 0x0, 0x0, 0x18, 0xef, 0xfe, 0x81, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x84, + + /* U+003D "=" */ + 0x5e, 0xee, 0xee, 0xee, 0xee, 0xe5, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5e, 0xee, 0xee, 0xee, + 0xee, 0xe5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf5, + + /* U+003E ">" */ + 0x47, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfa, + 0x40, 0x0, 0x0, 0x0, 0x18, 0xef, 0xfe, 0x71, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xb4, 0x0, + 0x0, 0x0, 0x1, 0x7d, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf5, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xe3, 0x0, 0x4, 0xaf, 0xff, 0xb4, 0x0, + 0x18, 0xef, 0xfe, 0x71, 0x0, 0x0, 0x6f, 0xfb, + 0x40, 0x0, 0x0, 0x0, 0x47, 0x10, 0x0, 0x0, + 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x28, 0xce, 0xfe, 0xc7, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x7f, 0xfb, 0x52, + 0x13, 0xaf, 0xfb, 0x0, 0x96, 0x0, 0x0, 0x0, + 0xaf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x48, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xfb, 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x16, 0xad, 0xff, 0xfd, 0xa6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xca, 0x9a, 0xcf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xc5, 0x0, 0x0, 0x0, 0x4, 0xcf, + 0xd2, 0x0, 0x0, 0x2, 0xef, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xe2, 0x0, 0x0, 0xdf, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xd0, 0x0, 0x8f, 0x80, 0x0, 0x7, 0xcf, 0xfc, + 0x60, 0xaf, 0x70, 0x7f, 0x70, 0xf, 0xe0, 0x0, + 0x2d, 0xff, 0xfe, 0xff, 0xcb, 0xf7, 0x0, 0xde, + 0x5, 0xf7, 0x0, 0xd, 0xfd, 0x30, 0x1, 0x7f, + 0xff, 0x70, 0x7, 0xf4, 0x9f, 0x30, 0x6, 0xfe, + 0x10, 0x0, 0x0, 0x6f, 0xf7, 0x0, 0x2f, 0x7c, + 0xf0, 0x0, 0xbf, 0x70, 0x0, 0x0, 0x0, 0xef, + 0x70, 0x0, 0xf9, 0xde, 0x0, 0xd, 0xf3, 0x0, + 0x0, 0x0, 0xa, 0xf7, 0x0, 0xf, 0xad, 0xe0, + 0x0, 0xdf, 0x30, 0x0, 0x0, 0x0, 0xaf, 0x70, + 0x0, 0xf9, 0xbf, 0x0, 0xb, 0xf7, 0x0, 0x0, + 0x0, 0xd, 0xf7, 0x0, 0x2f, 0x79, 0xf3, 0x0, + 0x6f, 0xe0, 0x0, 0x0, 0x6, 0xff, 0x70, 0x6, + 0xf4, 0x5f, 0x70, 0x0, 0xdf, 0xc3, 0x0, 0x7, + 0xff, 0xfb, 0x1, 0xde, 0x0, 0xee, 0x0, 0x2, + 0xdf, 0xfe, 0xdf, 0xfc, 0x3f, 0xfe, 0xff, 0x50, + 0x8, 0xf9, 0x0, 0x0, 0x7c, 0xff, 0xc7, 0x0, + 0x5d, 0xfd, 0x50, 0x0, 0xd, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfc, 0x50, 0x0, + 0x0, 0x2, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfc, 0xaa, 0xbd, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, + 0xd9, 0x40, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfe, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x5d, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xe0, 0x6f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf7, 0x0, 0xef, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x10, 0x8, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xa0, 0x0, + 0x1f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf3, + 0x0, 0x0, 0xaf, 0xc0, 0x0, 0x0, 0x0, 0xa, + 0xfc, 0x0, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, + 0x2, 0xff, 0x50, 0x0, 0x0, 0xd, 0xfa, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x7, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x10, 0x0, 0xef, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf7, 0x0, 0x5f, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xe0, + 0xc, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x50, + + /* U+0042 "B" */ + 0x7f, 0xff, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x7f, + 0xe0, 0x0, 0x0, 0x2, 0x9f, 0xfa, 0x7, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x7, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xd0, 0x7f, 0xe0, 0x0, + 0x0, 0x2, 0x9f, 0xf5, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x7, 0xfe, 0x0, 0x0, 0x0, + 0x14, 0xcf, 0xf3, 0x7f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xa7, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xfd, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xe7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xfc, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x3b, 0xff, + 0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x30, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x5f, 0xff, 0xb6, 0x43, 0x59, 0xff, 0xf2, + 0x3, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x1c, 0x80, + 0xd, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x1c, 0x80, + 0x0, 0x5f, 0xff, 0xb5, 0x33, 0x49, 0xff, 0xf2, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x5, 0xae, 0xff, 0xda, 0x50, 0x0, + + /* U+0044 "D" */ + 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, + 0x0, 0x7f, 0xe1, 0x11, 0x12, 0x36, 0xbf, 0xff, + 0x40, 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xfe, 0x20, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfb, 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf2, 0x7f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x77, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf9, 0x7f, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xa7, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xf9, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0x77, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf2, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfb, 0x7, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xfe, 0x20, 0x7f, + 0xe1, 0x11, 0x11, 0x35, 0xbf, 0xff, 0x40, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, + 0x0, + + /* U+0045 "E" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x67, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x7f, 0xe1, 0x11, + 0x11, 0x11, 0x11, 0x7, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x7, 0xfe, 0x11, 0x11, 0x11, 0x11, + 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xe1, 0x11, 0x11, 0x11, + 0x11, 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + + /* U+0046 "F" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x67, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x7f, 0xe1, 0x11, + 0x11, 0x11, 0x11, 0x7, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x7f, 0xe1, 0x11, 0x11, 0x11, 0x10, 0x7, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x60, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x5f, 0xff, 0xb6, 0x43, 0x48, 0xef, 0xf5, + 0x3, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x9, 0xb0, + 0xd, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x7, 0x94, + 0xcf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0x5f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0xd, 0xfe, 0x10, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0x3, 0xff, 0xd3, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0x0, 0x5f, 0xff, 0xb6, 0x32, 0x47, 0xdf, 0xf7, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x71, 0x0, + + /* U+0048 "H" */ + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf7, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x7f, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf7, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf7, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xfe, 0x11, 0x11, 0x11, + 0x11, 0x17, 0xff, 0x7f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf7, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xf7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf0, + + /* U+0049 "I" */ + 0x7f, 0xe7, 0xfe, 0x7f, 0xe7, 0xfe, 0x7f, 0xe7, + 0xfe, 0x7f, 0xe7, 0xfe, 0x7f, 0xe7, 0xfe, 0x7f, + 0xe7, 0xfe, 0x7f, 0xe7, 0xfe, 0x7f, 0xe7, 0xfe, + 0x7f, 0xe0, + + /* U+004A "J" */ + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x1, 0x11, 0x11, 0x7f, + 0xf0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, + 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xd0, + 0x5a, 0x0, 0x0, 0xd, 0xfa, 0xf, 0xfc, 0x41, + 0x3b, 0xff, 0x50, 0x5f, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x29, 0xdf, 0xfc, 0x60, 0x0, + + /* U+004B "K" */ + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x50, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x6f, 0xf6, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x0, + 0x7f, 0xe0, 0x0, 0x4, 0xff, 0x80, 0x0, 0x0, + 0x7f, 0xe0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, + 0x7f, 0xe0, 0x3, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x7f, 0xe0, 0x3f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xe3, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x7f, 0xfe, 0xfd, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xd1, 0x2f, 0xfd, 0x10, 0x0, 0x0, + 0x7f, 0xfe, 0x10, 0x4, 0xff, 0xb0, 0x0, 0x0, + 0x7f, 0xf2, 0x0, 0x0, 0x6f, 0xf8, 0x0, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0xc, 0xfe, 0x10, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xc0, + + /* U+004C "L" */ + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xe1, 0x11, 0x11, 0x11, + 0x11, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + + /* U+004D "M" */ + 0x7f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x67, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf6, 0x7f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x67, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x67, + 0xfd, 0xbf, 0xb0, 0x0, 0x0, 0x0, 0xcf, 0x8e, + 0xf6, 0x7f, 0xd2, 0xff, 0x40, 0x0, 0x0, 0x5f, + 0xe0, 0xef, 0x67, 0xfd, 0x8, 0xfd, 0x0, 0x0, + 0xe, 0xf6, 0xe, 0xf6, 0x7f, 0xd0, 0xe, 0xf7, + 0x0, 0x8, 0xfc, 0x0, 0xef, 0x67, 0xfd, 0x0, + 0x5f, 0xf1, 0x1, 0xff, 0x30, 0xe, 0xf6, 0x7f, + 0xd0, 0x0, 0xbf, 0xa0, 0xaf, 0x90, 0x0, 0xef, + 0x67, 0xfd, 0x0, 0x2, 0xff, 0x7f, 0xe1, 0x0, + 0xe, 0xf6, 0x7f, 0xd0, 0x0, 0x8, 0xff, 0xf6, + 0x0, 0x0, 0xef, 0x67, 0xfd, 0x0, 0x0, 0xe, + 0xfd, 0x0, 0x0, 0xe, 0xf6, 0x7f, 0xd0, 0x0, + 0x0, 0x5f, 0x40, 0x0, 0x0, 0xef, 0x67, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf6, + 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0x60, + + /* U+004E "N" */ + 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf7, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x7f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x7f, 0xf7, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x7, 0xff, 0x7f, 0xfd, + 0xfe, 0x20, 0x0, 0x0, 0x7f, 0xf7, 0xfe, 0x3f, + 0xfd, 0x0, 0x0, 0x7, 0xff, 0x7f, 0xe0, 0x5f, + 0xfa, 0x0, 0x0, 0x7f, 0xf7, 0xfe, 0x0, 0x8f, + 0xf7, 0x0, 0x7, 0xff, 0x7f, 0xe0, 0x0, 0xbf, + 0xf4, 0x0, 0x7f, 0xf7, 0xfe, 0x0, 0x1, 0xef, + 0xe1, 0x7, 0xff, 0x7f, 0xe0, 0x0, 0x3, 0xff, + 0xc0, 0x7f, 0xf7, 0xfe, 0x0, 0x0, 0x6, 0xff, + 0xa7, 0xff, 0x7f, 0xe0, 0x0, 0x0, 0x9, 0xff, + 0xdf, 0xf7, 0xfe, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xf7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf0, + + /* U+004F "O" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xb6, 0x33, + 0x5a, 0xff, 0xf7, 0x0, 0x0, 0x3f, 0xfd, 0x30, + 0x0, 0x0, 0x1, 0xcf, 0xf5, 0x0, 0xd, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf1, 0x4, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x70, 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xfc, 0xc, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf0, 0xdf, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xc, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf0, 0x9f, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfc, + 0x5, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x70, 0xd, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf1, 0x0, 0x3f, 0xfd, 0x30, 0x0, + 0x0, 0x1, 0xcf, 0xf5, 0x0, 0x0, 0x5f, 0xff, + 0xb5, 0x33, 0x59, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x60, 0x0, + 0x0, 0x0, + + /* U+0050 "P" */ + 0x7f, 0xff, 0xff, 0xff, 0xeb, 0x60, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x7f, + 0xe1, 0x11, 0x12, 0x49, 0xff, 0xe1, 0x7, 0xfe, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x90, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x9, 0xfe, 0x7, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf0, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x7, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xe0, 0x7f, 0xe0, 0x0, 0x0, + 0x0, 0x3f, 0xf9, 0x7, 0xfe, 0x11, 0x11, 0x24, + 0x8f, 0xfe, 0x10, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x7, 0xff, 0xff, 0xff, 0xfe, 0xb6, + 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xb6, 0x33, + 0x5a, 0xff, 0xf7, 0x0, 0x0, 0x2f, 0xfd, 0x30, + 0x0, 0x0, 0x2, 0xcf, 0xf5, 0x0, 0xd, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf1, 0x4, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x70, 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xfc, 0xc, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf0, 0xdf, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xc, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xe0, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfc, + 0x5, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x70, 0xe, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf1, 0x0, 0x4f, 0xfc, 0x20, 0x0, + 0x0, 0x1, 0xbf, 0xf6, 0x0, 0x0, 0x7f, 0xff, + 0xa4, 0x22, 0x48, 0xef, 0xf9, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xce, 0xff, 0xfd, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xf7, + 0x10, 0x4, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3a, 0xef, 0xea, 0x40, + + /* U+0052 "R" */ + 0x7f, 0xff, 0xff, 0xff, 0xeb, 0x60, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x7f, + 0xe1, 0x11, 0x12, 0x49, 0xff, 0xe1, 0x7, 0xfe, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x90, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x9, 0xfe, 0x7, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf0, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x7, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xe0, 0x7f, 0xe0, 0x0, 0x0, + 0x0, 0x3f, 0xf8, 0x7, 0xfe, 0x11, 0x11, 0x13, + 0x8f, 0xfe, 0x10, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x7, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x7f, 0xf2, + 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, 0xcf, 0xd0, + 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x1, 0xef, 0x90, + 0x7, 0xfe, 0x0, 0x0, 0x0, 0x5, 0xff, 0x40, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x9, 0xfe, 0x10, + + /* U+0053 "S" */ + 0x0, 0x0, 0x6b, 0xef, 0xfd, 0xa5, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xef, + 0xe7, 0x21, 0x14, 0x8e, 0xc0, 0x6, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x20, 0x9, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xd9, 0x51, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xff, 0xff, 0xc5, 0x0, 0x0, + 0x0, 0x1, 0x59, 0xdf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xaf, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xfe, 0x5, 0x80, 0x0, 0x0, 0x0, + 0xc, 0xfb, 0xd, 0xfe, 0x84, 0x21, 0x25, 0xcf, + 0xf4, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x4, 0x9d, 0xef, 0xec, 0x82, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0x11, + 0x13, 0xff, 0x51, 0x11, 0x11, 0x0, 0x0, 0x2, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, + + /* U+0055 "U" */ + 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x9a, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf9, 0xaf, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x9a, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xf9, 0xaf, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0x9a, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xf9, 0xaf, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0x9a, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xf9, 0xaf, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0x99, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xf9, 0x9f, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0x87, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf6, 0x3f, 0xf5, 0x0, 0x0, 0x0, 0x5, + 0xff, 0x20, 0xdf, 0xe1, 0x0, 0x0, 0x1, 0xef, + 0xc0, 0x3, 0xff, 0xe7, 0x32, 0x38, 0xef, 0xf3, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x1, 0x7c, 0xef, 0xec, 0x71, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xfe, 0x0, 0x6f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0x70, 0x0, 0xef, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xf1, 0x0, 0x8, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xc, 0xf9, 0x0, 0x0, 0x1f, + 0xf8, 0x0, 0x0, 0x0, 0x4, 0xff, 0x20, 0x0, + 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0xbf, 0xb0, + 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, 0x0, 0x2f, + 0xf4, 0x0, 0x0, 0x0, 0xc, 0xfc, 0x0, 0x0, + 0x9, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf3, + 0x0, 0x0, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xa0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x10, 0xd, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf8, 0x5, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xe0, 0xcf, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xe0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0057 "W" */ + 0x1f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x10, 0xbf, 0xb0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x8f, 0xc0, 0x6, 0xff, 0x10, 0x0, 0x0, + 0x5, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xd, 0xf6, + 0x0, 0x1f, 0xf6, 0x0, 0x0, 0x0, 0xbf, 0xef, + 0xe0, 0x0, 0x0, 0x3, 0xff, 0x10, 0x0, 0xbf, + 0xb0, 0x0, 0x0, 0x1f, 0xf4, 0xff, 0x30, 0x0, + 0x0, 0x8f, 0xc0, 0x0, 0x6, 0xff, 0x10, 0x0, + 0x6, 0xfd, 0xc, 0xf8, 0x0, 0x0, 0xd, 0xf6, + 0x0, 0x0, 0x1f, 0xf5, 0x0, 0x0, 0xbf, 0x70, + 0x6f, 0xe0, 0x0, 0x3, 0xff, 0x10, 0x0, 0x0, + 0xcf, 0xb0, 0x0, 0x1f, 0xf2, 0x1, 0xff, 0x30, + 0x0, 0x8f, 0xc0, 0x0, 0x0, 0x6, 0xff, 0x0, + 0x6, 0xfd, 0x0, 0xc, 0xf8, 0x0, 0xd, 0xf7, + 0x0, 0x0, 0x0, 0x1f, 0xf5, 0x0, 0xbf, 0x70, + 0x0, 0x6f, 0xe0, 0x3, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xcf, 0xb0, 0x1f, 0xf2, 0x0, 0x1, 0xff, + 0x30, 0x8f, 0xc0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x6, 0xfc, 0x0, 0x0, 0xb, 0xf8, 0xd, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf5, 0xcf, 0x70, + 0x0, 0x0, 0x6f, 0xe3, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xcf, 0xf2, 0x0, 0x0, 0x1, + 0xff, 0xbf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xc0, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0xe, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xe1, + 0x3, 0xff, 0x80, 0x0, 0x0, 0x4, 0xff, 0x50, + 0x0, 0x8f, 0xf3, 0x0, 0x0, 0x1e, 0xf9, 0x0, + 0x0, 0xc, 0xfe, 0x10, 0x0, 0xbf, 0xd0, 0x0, + 0x0, 0x2, 0xff, 0xa0, 0x6, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x5f, 0xf6, 0x2f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xdf, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xfa, 0x9f, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xe1, 0xd, 0xfd, 0x0, 0x0, + 0x0, 0x6, 0xff, 0x40, 0x2, 0xff, 0x90, 0x0, + 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x6f, 0xf4, 0x0, + 0x0, 0xdf, 0xd0, 0x0, 0x0, 0xb, 0xfe, 0x10, + 0x9, 0xff, 0x20, 0x0, 0x0, 0x1, 0xef, 0xb0, + 0x5f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf7, + + /* U+0059 "Y" */ + 0xc, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0x50, 0x3f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xb0, 0x0, 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x4f, + 0xf2, 0x0, 0x1, 0xef, 0x90, 0x0, 0x0, 0xd, + 0xf8, 0x0, 0x0, 0x6, 0xff, 0x20, 0x0, 0x7, + 0xfe, 0x0, 0x0, 0x0, 0xc, 0xfc, 0x0, 0x1, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x3f, 0xf5, 0x0, + 0xaf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xe0, + 0x4f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0x9d, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x0, 0x0, 0x0, + 0x0, + + /* U+005A "Z" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x11, + 0x11, 0x11, 0x11, 0x11, 0xcf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xfa, 0x11, 0x11, 0x11, 0x11, 0x11, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + + /* U+005B "[" */ + 0x7f, 0xff, 0xf8, 0x7f, 0xfe, 0xe7, 0x7f, 0xd0, + 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, + 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, + 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, + 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, + 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, + 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, + 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, + 0xfe, 0xe7, 0x7f, 0xff, 0xf8, + + /* U+005C "\\" */ + 0xbf, 0x50, 0x0, 0x0, 0x0, 0x6, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0x60, 0x0, 0x0, 0x0, 0x5, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0x60, 0x0, 0x0, 0x0, 0x5, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0x70, 0x0, 0x0, 0x0, + 0x4, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0x70, 0x0, 0x0, + 0x0, 0x4, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x80, 0x0, + 0x0, 0x0, 0x3, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x80, + 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x90, 0x0, 0x0, 0x0, 0x2, 0xfe, 0x0, + + /* U+005D "]" */ + 0x8f, 0xff, 0xf7, 0x8e, 0xef, 0xf7, 0x0, 0xd, + 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, + 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, + 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, + 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, + 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, + 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, + 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x8e, + 0xef, 0xf7, 0x8f, 0xff, 0xf7, + + /* U+005E "^" */ + 0x0, 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xbf, + 0x10, 0x0, 0x0, 0x7, 0xf5, 0x5f, 0x70, 0x0, + 0x0, 0xd, 0xe0, 0xe, 0xd0, 0x0, 0x0, 0x4f, + 0x80, 0x8, 0xf4, 0x0, 0x0, 0xbf, 0x10, 0x1, + 0xfb, 0x0, 0x2, 0xfa, 0x0, 0x0, 0xaf, 0x20, + 0x9, 0xf4, 0x0, 0x0, 0x4f, 0x80, 0xf, 0xd0, + 0x0, 0x0, 0xd, 0xe0, + + /* U+005F "_" */ + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x8, 0xff, 0x40, 0x0, 0x4, 0xef, 0x60, 0x0, + 0x1, 0xbf, 0x70, + + /* U+0061 "a" */ + 0x0, 0x6b, 0xef, 0xfd, 0x81, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0xe, 0xb5, 0x10, 0x27, + 0xff, 0xb0, 0x1, 0x0, 0x0, 0x0, 0x6f, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf3, 0x0, 0x37, + 0xaa, 0xaa, 0xaf, 0xf4, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x6f, 0xf6, 0x10, 0x0, 0xf, 0xf4, + 0xbf, 0x90, 0x0, 0x0, 0xf, 0xf4, 0xcf, 0x80, + 0x0, 0x0, 0x5f, 0xf4, 0x8f, 0xe2, 0x0, 0x4, + 0xff, 0xf4, 0x1d, 0xff, 0xcb, 0xdf, 0xdf, 0xf4, + 0x1, 0x8d, 0xff, 0xd8, 0xe, 0xf4, + + /* U+0062 "b" */ + 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0x70, 0x7c, 0xfe, 0xc7, + 0x10, 0x0, 0xdf, 0x9d, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0xdf, 0xff, 0xa3, 0x12, 0x6e, 0xfe, 0x20, + 0xdf, 0xf8, 0x0, 0x0, 0x1, 0xef, 0xa0, 0xdf, + 0xe0, 0x0, 0x0, 0x0, 0x6f, 0xf1, 0xdf, 0x90, + 0x0, 0x0, 0x0, 0x1f, 0xf3, 0xdf, 0x70, 0x0, + 0x0, 0x0, 0xf, 0xf5, 0xdf, 0x90, 0x0, 0x0, + 0x0, 0x1f, 0xf3, 0xdf, 0xe0, 0x0, 0x0, 0x0, + 0x6f, 0xf1, 0xdf, 0xf8, 0x0, 0x0, 0x2, 0xef, + 0xa0, 0xdf, 0xff, 0xa3, 0x12, 0x6e, 0xff, 0x20, + 0xdf, 0x8d, 0xff, 0xff, 0xff, 0xe3, 0x0, 0xdf, + 0x60, 0x7d, 0xfe, 0xc7, 0x10, 0x0, + + /* U+0063 "c" */ + 0x0, 0x3, 0xad, 0xfe, 0xc6, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xc1, 0x9, 0xff, 0x93, 0x12, + 0x7f, 0xfa, 0x4f, 0xf6, 0x0, 0x0, 0x3, 0x91, + 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf6, + 0x0, 0x0, 0x2, 0x91, 0x9, 0xff, 0x93, 0x12, + 0x7f, 0xfa, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x3, 0xad, 0xfe, 0xc6, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xf3, 0x0, 0x5, 0xbe, 0xfe, 0x92, + 0x2f, 0xf3, 0x1, 0xbf, 0xff, 0xff, 0xff, 0x7f, + 0xf3, 0xb, 0xff, 0x93, 0x12, 0x7f, 0xff, 0xf3, + 0x5f, 0xf6, 0x0, 0x0, 0x3, 0xff, 0xf3, 0xbf, + 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0xdf, 0x70, + 0x0, 0x0, 0x0, 0x3f, 0xf3, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x1f, 0xf3, 0xdf, 0x70, 0x0, 0x0, + 0x0, 0x3f, 0xf3, 0xbf, 0xb0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x5f, 0xf5, 0x0, 0x0, 0x2, 0xff, + 0xf3, 0xb, 0xff, 0x71, 0x0, 0x5e, 0xff, 0xf3, + 0x1, 0xbf, 0xff, 0xef, 0xff, 0x7f, 0xf3, 0x0, + 0x5, 0xbe, 0xfe, 0xa3, 0xf, 0xf3, + + /* U+0065 "e" */ + 0x0, 0x5, 0xbe, 0xfd, 0xa3, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xa, 0xfe, 0x61, + 0x2, 0x8f, 0xf7, 0x4, 0xff, 0x20, 0x0, 0x0, + 0x5f, 0xf1, 0xaf, 0x90, 0x0, 0x0, 0x0, 0xcf, + 0x6d, 0xfc, 0xbb, 0xbb, 0xbb, 0xbd, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xad, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0x60, 0x0, 0x0, 0x6, + 0x0, 0xa, 0xff, 0xa3, 0x11, 0x4b, 0xf8, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x3, + 0xad, 0xff, 0xd8, 0x10, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x8d, 0xfe, 0xa1, 0x0, 0xb, 0xff, + 0xff, 0xf0, 0x0, 0x4f, 0xf5, 0x0, 0x30, 0x0, + 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xc0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x70, 0x9e, 0xff, + 0xfe, 0xee, 0x60, 0x0, 0x7f, 0xd0, 0x0, 0x0, + 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, + 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, + 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, + 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, + 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, + 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, + 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x5, 0xbe, 0xfe, 0xa3, 0xd, 0xf5, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x8d, 0xf5, 0xb, 0xff, + 0x93, 0x12, 0x6e, 0xff, 0xf5, 0x4f, 0xf6, 0x0, + 0x0, 0x1, 0xef, 0xf5, 0xbf, 0xc0, 0x0, 0x0, + 0x0, 0x5f, 0xf5, 0xdf, 0x70, 0x0, 0x0, 0x0, + 0xf, 0xf5, 0xff, 0x50, 0x0, 0x0, 0x0, 0xe, + 0xf5, 0xdf, 0x70, 0x0, 0x0, 0x0, 0xf, 0xf5, + 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x5f, 0xf5, 0x4f, + 0xf6, 0x0, 0x0, 0x1, 0xef, 0xf5, 0xa, 0xff, + 0xa3, 0x12, 0x6e, 0xff, 0xf5, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0x8f, 0xf5, 0x0, 0x5, 0xbe, 0xfe, + 0xa3, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf1, 0x3, 0x10, 0x0, 0x0, 0x0, 0xaf, + 0xd0, 0xd, 0xf9, 0x52, 0x11, 0x4b, 0xff, 0x50, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x28, 0xce, 0xff, 0xd9, 0x30, 0x0, + + /* U+0068 "h" */ + 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xf7, 0x18, 0xdf, 0xfc, 0x70, 0x0, 0xdf, + 0xae, 0xff, 0xff, 0xff, 0xc0, 0xd, 0xff, 0xf8, + 0x31, 0x4a, 0xff, 0x90, 0xdf, 0xf5, 0x0, 0x0, + 0xa, 0xff, 0xd, 0xfc, 0x0, 0x0, 0x0, 0x3f, + 0xf2, 0xdf, 0x80, 0x0, 0x0, 0x1, 0xff, 0x3d, + 0xf7, 0x0, 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, + 0x0, 0x0, 0x0, 0xff, 0x4d, 0xf7, 0x0, 0x0, + 0x0, 0xf, 0xf4, 0xdf, 0x70, 0x0, 0x0, 0x0, + 0xff, 0x4d, 0xf7, 0x0, 0x0, 0x0, 0xf, 0xf4, + 0xdf, 0x70, 0x0, 0x0, 0x0, 0xff, 0x4d, 0xf7, + 0x0, 0x0, 0x0, 0xf, 0xf4, + + /* U+0069 "i" */ + 0xb, 0xf6, 0x2f, 0xfd, 0xb, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf7, 0xd, 0xf7, 0xd, 0xf7, + 0xd, 0xf7, 0xd, 0xf7, 0xd, 0xf7, 0xd, 0xf7, + 0xd, 0xf7, 0xd, 0xf7, 0xd, 0xf7, 0xd, 0xf7, + 0xd, 0xf7, 0xd, 0xf7, + + /* U+006A "j" */ + 0x0, 0x0, 0x9, 0xf8, 0x0, 0x0, 0x1, 0xff, + 0xf0, 0x0, 0x0, 0xa, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0x90, 0x0, 0x0, 0xb, 0xf9, 0x0, + 0x0, 0x0, 0xbf, 0x90, 0x0, 0x0, 0xb, 0xf9, + 0x0, 0x0, 0x0, 0xbf, 0x90, 0x0, 0x0, 0xb, + 0xf9, 0x0, 0x0, 0x0, 0xbf, 0x90, 0x0, 0x0, + 0xb, 0xf9, 0x0, 0x0, 0x0, 0xbf, 0x90, 0x0, + 0x0, 0xb, 0xf9, 0x0, 0x0, 0x0, 0xbf, 0x90, + 0x0, 0x0, 0xb, 0xf9, 0x0, 0x0, 0x0, 0xbf, + 0x90, 0x0, 0x0, 0xb, 0xf9, 0x0, 0x0, 0x0, + 0xdf, 0x80, 0x4, 0x20, 0x5f, 0xf4, 0x0, 0xef, + 0xff, 0xfc, 0x0, 0x9, 0xef, 0xe9, 0x0, 0x0, + + /* U+006B "k" */ + 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xf7, 0x0, 0x0, 0x3, 0xef, 0xa0, 0xdf, + 0x70, 0x0, 0x3, 0xff, 0xb0, 0xd, 0xf7, 0x0, + 0x4, 0xff, 0xb0, 0x0, 0xdf, 0x70, 0x5, 0xff, + 0xb0, 0x0, 0xd, 0xf7, 0x6, 0xff, 0xb0, 0x0, + 0x0, 0xdf, 0x77, 0xff, 0xf1, 0x0, 0x0, 0xd, + 0xfe, 0xff, 0xff, 0xb0, 0x0, 0x0, 0xdf, 0xff, + 0x87, 0xff, 0x70, 0x0, 0xd, 0xff, 0x70, 0xa, + 0xff, 0x40, 0x0, 0xdf, 0x90, 0x0, 0xd, 0xfe, + 0x10, 0xd, 0xf7, 0x0, 0x0, 0x2e, 0xfc, 0x0, + 0xdf, 0x70, 0x0, 0x0, 0x4f, 0xf9, 0xd, 0xf7, + 0x0, 0x0, 0x0, 0x7f, 0xf5, + + /* U+006C "l" */ + 0xdf, 0x7d, 0xf7, 0xdf, 0x7d, 0xf7, 0xdf, 0x7d, + 0xf7, 0xdf, 0x7d, 0xf7, 0xdf, 0x7d, 0xf7, 0xdf, + 0x7d, 0xf7, 0xdf, 0x7d, 0xf7, 0xdf, 0x7d, 0xf7, + 0xdf, 0x7d, 0xf7, + + /* U+006D "m" */ + 0xdf, 0x61, 0x9d, 0xfe, 0xb5, 0x0, 0x7, 0xcf, + 0xfd, 0x80, 0x0, 0xdf, 0xaf, 0xff, 0xff, 0xff, + 0x92, 0xef, 0xff, 0xff, 0xfd, 0x10, 0xdf, 0xfe, + 0x60, 0x3, 0xcf, 0xff, 0xfa, 0x20, 0x17, 0xff, + 0xa0, 0xdf, 0xf3, 0x0, 0x0, 0xe, 0xff, 0xa0, + 0x0, 0x0, 0x8f, 0xf0, 0xdf, 0xc0, 0x0, 0x0, + 0x9, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xf3, 0xdf, + 0x80, 0x0, 0x0, 0x7, 0xff, 0x0, 0x0, 0x0, + 0xf, 0xf4, 0xdf, 0x70, 0x0, 0x0, 0x6, 0xfe, + 0x0, 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, 0x0, + 0x0, 0x6, 0xfe, 0x0, 0x0, 0x0, 0xf, 0xf4, + 0xdf, 0x70, 0x0, 0x0, 0x6, 0xfe, 0x0, 0x0, + 0x0, 0xf, 0xf4, 0xdf, 0x70, 0x0, 0x0, 0x6, + 0xfe, 0x0, 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, + 0x0, 0x0, 0x6, 0xfe, 0x0, 0x0, 0x0, 0xf, + 0xf4, 0xdf, 0x70, 0x0, 0x0, 0x6, 0xfe, 0x0, + 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, 0x0, 0x0, + 0x6, 0xfe, 0x0, 0x0, 0x0, 0xf, 0xf4, + + /* U+006E "n" */ + 0xdf, 0x61, 0x8d, 0xff, 0xc7, 0x0, 0xd, 0xf9, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xdf, 0xff, 0x61, + 0x2, 0x8f, 0xf9, 0xd, 0xff, 0x40, 0x0, 0x0, + 0x9f, 0xf0, 0xdf, 0xc0, 0x0, 0x0, 0x3, 0xff, + 0x2d, 0xf8, 0x0, 0x0, 0x0, 0x1f, 0xf3, 0xdf, + 0x70, 0x0, 0x0, 0x0, 0xff, 0x4d, 0xf7, 0x0, + 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, 0x0, 0x0, + 0x0, 0xff, 0x4d, 0xf7, 0x0, 0x0, 0x0, 0xf, + 0xf4, 0xdf, 0x70, 0x0, 0x0, 0x0, 0xff, 0x4d, + 0xf7, 0x0, 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, + 0x0, 0x0, 0x0, 0xff, 0x40, + + /* U+006F "o" */ + 0x0, 0x4, 0xad, 0xfe, 0xb5, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0xa, 0xff, + 0x93, 0x12, 0x7f, 0xfd, 0x0, 0x4f, 0xf6, 0x0, + 0x0, 0x3, 0xff, 0x80, 0xaf, 0xc0, 0x0, 0x0, + 0x0, 0x8f, 0xe0, 0xdf, 0x70, 0x0, 0x0, 0x0, + 0x3f, 0xf1, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1f, + 0xf3, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x3f, 0xf1, + 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xe0, 0x4f, + 0xf6, 0x0, 0x0, 0x3, 0xff, 0x80, 0xa, 0xff, + 0x93, 0x12, 0x7f, 0xfd, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x4, 0xad, 0xfe, + 0xb5, 0x0, 0x0, + + /* U+0070 "p" */ + 0xdf, 0x61, 0x8d, 0xfe, 0xc7, 0x10, 0x0, 0xdf, + 0x8e, 0xff, 0xff, 0xff, 0xe3, 0x0, 0xdf, 0xff, + 0x92, 0x0, 0x5d, 0xfe, 0x20, 0xdf, 0xf7, 0x0, + 0x0, 0x1, 0xef, 0xa0, 0xdf, 0xd0, 0x0, 0x0, + 0x0, 0x5f, 0xf1, 0xdf, 0x90, 0x0, 0x0, 0x0, + 0x1f, 0xf3, 0xdf, 0x70, 0x0, 0x0, 0x0, 0xf, + 0xf5, 0xdf, 0x90, 0x0, 0x0, 0x0, 0x1f, 0xf3, + 0xdf, 0xe0, 0x0, 0x0, 0x0, 0x6f, 0xf1, 0xdf, + 0xf8, 0x0, 0x0, 0x2, 0xef, 0xa0, 0xdf, 0xff, + 0xa3, 0x12, 0x6e, 0xff, 0x20, 0xdf, 0x9d, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0xdf, 0x70, 0x7c, 0xfe, + 0xc7, 0x10, 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x5, 0xbe, 0xfe, 0xa2, 0xf, 0xf3, 0x1, + 0xbf, 0xff, 0xff, 0xff, 0x6f, 0xf3, 0xb, 0xff, + 0x93, 0x12, 0x7f, 0xff, 0xf3, 0x5f, 0xf6, 0x0, + 0x0, 0x3, 0xff, 0xf3, 0xbf, 0xc0, 0x0, 0x0, + 0x0, 0x8f, 0xf3, 0xdf, 0x70, 0x0, 0x0, 0x0, + 0x3f, 0xf3, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1f, + 0xf3, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x3f, 0xf3, + 0xbf, 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x5f, + 0xf6, 0x0, 0x0, 0x3, 0xff, 0xf3, 0xb, 0xff, + 0x93, 0x12, 0x7f, 0xff, 0xf3, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0x7f, 0xf3, 0x0, 0x5, 0xbe, 0xfe, + 0x92, 0x2f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf3, + + /* U+0072 "r" */ + 0xdf, 0x61, 0x8d, 0xf0, 0xdf, 0x7e, 0xff, 0xf0, + 0xdf, 0xff, 0xb5, 0x40, 0xdf, 0xf7, 0x0, 0x0, + 0xdf, 0xd0, 0x0, 0x0, 0xdf, 0x90, 0x0, 0x0, + 0xdf, 0x70, 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, + 0xdf, 0x70, 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, + 0xdf, 0x70, 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, + 0xdf, 0x70, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x18, 0xcf, 0xfe, 0xb7, 0x10, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xb0, 0xb, 0xfe, 0x41, 0x2, + 0x6c, 0x30, 0xf, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xd9, 0x52, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xe9, 0x10, 0x0, 0x0, 0x47, 0xad, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf3, 0x1, 0x0, + 0x0, 0x0, 0xf, 0xf4, 0xe, 0xc6, 0x20, 0x3, + 0xaf, 0xf1, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x1, 0x7b, 0xef, 0xfd, 0x92, 0x0, + + /* U+0074 "t" */ + 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, + 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0x70, 0x9e, 0xff, 0xfe, 0xee, + 0x60, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, + 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, + 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, + 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, + 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0x4f, 0xf7, 0x1, 0x50, 0x0, 0xc, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x9e, 0xfd, 0x81, + + /* U+0075 "u" */ + 0xff, 0x60, 0x0, 0x0, 0x4, 0xff, 0xf, 0xf6, + 0x0, 0x0, 0x0, 0x4f, 0xf0, 0xff, 0x60, 0x0, + 0x0, 0x4, 0xff, 0xf, 0xf6, 0x0, 0x0, 0x0, + 0x4f, 0xf0, 0xff, 0x60, 0x0, 0x0, 0x4, 0xff, + 0xf, 0xf6, 0x0, 0x0, 0x0, 0x4f, 0xf0, 0xff, + 0x60, 0x0, 0x0, 0x4, 0xff, 0xe, 0xf6, 0x0, + 0x0, 0x0, 0x5f, 0xf0, 0xdf, 0x80, 0x0, 0x0, + 0x8, 0xff, 0xa, 0xfe, 0x0, 0x0, 0x1, 0xef, + 0xf0, 0x3f, 0xfb, 0x20, 0x4, 0xdf, 0xff, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0x9f, 0xf0, 0x0, 0x4b, + 0xef, 0xea, 0x32, 0xff, 0x0, + + /* U+0076 "v" */ + 0xd, 0xf9, 0x0, 0x0, 0x0, 0x1, 0xff, 0x30, + 0x6f, 0xf0, 0x0, 0x0, 0x0, 0x7f, 0xc0, 0x0, + 0xef, 0x60, 0x0, 0x0, 0xd, 0xf5, 0x0, 0x8, + 0xfd, 0x0, 0x0, 0x5, 0xfe, 0x0, 0x0, 0x2f, + 0xf3, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0xbf, + 0xa0, 0x0, 0x2f, 0xf1, 0x0, 0x0, 0x4, 0xff, + 0x10, 0x9, 0xfa, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0x1, 0xff, 0x30, 0x0, 0x0, 0x0, 0x6f, 0xe0, + 0x7f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x5d, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfe, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf1, 0x0, + 0x0, 0x0, + + /* U+0077 "w" */ + 0xaf, 0x80, 0x0, 0x0, 0x5, 0xff, 0x0, 0x0, + 0x0, 0xc, 0xf4, 0x5f, 0xd0, 0x0, 0x0, 0xb, + 0xff, 0x50, 0x0, 0x0, 0x2f, 0xe0, 0xe, 0xf3, + 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x8f, + 0x80, 0x9, 0xf9, 0x0, 0x0, 0x7f, 0xbf, 0xf1, + 0x0, 0x0, 0xef, 0x20, 0x3, 0xfe, 0x0, 0x0, + 0xcf, 0x4b, 0xf7, 0x0, 0x4, 0xfc, 0x0, 0x0, + 0xdf, 0x40, 0x2, 0xfe, 0x5, 0xfc, 0x0, 0xa, + 0xf6, 0x0, 0x0, 0x7f, 0xa0, 0x8, 0xf8, 0x0, + 0xef, 0x20, 0xf, 0xf1, 0x0, 0x0, 0x2f, 0xf0, + 0xe, 0xf2, 0x0, 0x9f, 0x80, 0x5f, 0xb0, 0x0, + 0x0, 0xc, 0xf5, 0x4f, 0xc0, 0x0, 0x3f, 0xe0, + 0xbf, 0x50, 0x0, 0x0, 0x6, 0xfb, 0xaf, 0x60, + 0x0, 0xd, 0xf5, 0xfe, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfa, 0x0, 0x0, 0x1, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0x0, 0x0, 0x0, 0xbf, 0xd0, 0x0, 0x0, + + /* U+0078 "x" */ + 0x1e, 0xf8, 0x0, 0x0, 0x4, 0xff, 0x40, 0x4f, + 0xf4, 0x0, 0x1, 0xef, 0x80, 0x0, 0x8f, 0xe1, + 0x0, 0xbf, 0xb0, 0x0, 0x0, 0xcf, 0xb0, 0x7f, + 0xe1, 0x0, 0x0, 0x1, 0xef, 0xaf, 0xf4, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4, 0xff, 0x5e, + 0xf7, 0x0, 0x0, 0x1, 0xef, 0x80, 0x4f, 0xf3, + 0x0, 0x0, 0xcf, 0xc0, 0x0, 0x8f, 0xe1, 0x0, + 0x8f, 0xe1, 0x0, 0x0, 0xcf, 0xb0, 0x4f, 0xf4, + 0x0, 0x0, 0x2, 0xff, 0x80, + + /* U+0079 "y" */ + 0xd, 0xf9, 0x0, 0x0, 0x0, 0x1, 0xff, 0x30, + 0x6f, 0xf0, 0x0, 0x0, 0x0, 0x7f, 0xc0, 0x0, + 0xef, 0x60, 0x0, 0x0, 0xd, 0xf5, 0x0, 0x8, + 0xfd, 0x0, 0x0, 0x4, 0xfe, 0x0, 0x0, 0x2f, + 0xf4, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0xbf, + 0xb0, 0x0, 0x2f, 0xf1, 0x0, 0x0, 0x4, 0xff, + 0x10, 0x8, 0xfa, 0x0, 0x0, 0x0, 0xd, 0xf8, + 0x0, 0xef, 0x30, 0x0, 0x0, 0x0, 0x6f, 0xe0, + 0x6f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x6c, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfe, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xa4, 0x2, 0xcf, 0xb0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x8d, 0xfe, 0x91, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0xe, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xd, 0xee, + 0xee, 0xee, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xa0, 0x0, 0x0, 0x0, 0xc, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf2, 0x0, 0x0, 0x0, + 0x5, 0xff, 0x40, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xb0, 0x0, 0x0, + 0x0, 0xb, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x7f, + 0xf2, 0x0, 0x0, 0x0, 0x4, 0xff, 0x50, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xee, 0xee, 0xee, 0xe8, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xf9, + + /* U+007B "{" */ + 0x0, 0x3, 0xce, 0xf0, 0x2, 0xff, 0xfe, 0x0, + 0x8f, 0xe2, 0x0, 0xa, 0xfa, 0x0, 0x0, 0xbf, + 0x90, 0x0, 0xb, 0xf9, 0x0, 0x0, 0xbf, 0x90, + 0x0, 0xb, 0xf9, 0x0, 0x0, 0xbf, 0x90, 0x0, + 0xb, 0xf9, 0x0, 0x1, 0xef, 0x70, 0xa, 0xff, + 0xd1, 0x0, 0x9f, 0xfe, 0x20, 0x0, 0xd, 0xf8, + 0x0, 0x0, 0xbf, 0x90, 0x0, 0xb, 0xf9, 0x0, + 0x0, 0xbf, 0x90, 0x0, 0xb, 0xf9, 0x0, 0x0, + 0xbf, 0x90, 0x0, 0xb, 0xfa, 0x0, 0x0, 0x9f, + 0xe2, 0x0, 0x3, 0xff, 0xfe, 0x0, 0x4, 0xcf, + 0xf0, + + /* U+007C "|" */ + 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, + 0xfa, 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, 0xfa, 0x7f, + 0xa7, 0xfa, 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, 0xfa, + 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, + 0xfa, 0x7f, 0xa0, + + /* U+007D "}" */ + 0x8f, 0xd7, 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, + 0x0, 0xaf, 0xf0, 0x0, 0x0, 0x3f, 0xf1, 0x0, + 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, + 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, + 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, + 0x0, 0xf, 0xf6, 0x0, 0x0, 0x8, 0xff, 0xf0, + 0x0, 0x9, 0xff, 0xf0, 0x0, 0x1f, 0xf5, 0x0, + 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, + 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, + 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, + 0x0, 0x9f, 0xf0, 0x0, 0x8f, 0xff, 0xa0, 0x0, + 0x8f, 0xd8, 0x0, 0x0, + + /* U+007E "~" */ + 0x3, 0xcf, 0xd5, 0x0, 0x0, 0xf8, 0xe, 0xfd, + 0xff, 0x90, 0x5, 0xf5, 0x6f, 0x60, 0x1b, 0xfe, + 0xbf, 0xe0, 0x8f, 0x0, 0x0, 0x6d, 0xfc, 0x20, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xfb, 0x20, + 0x1e, 0xc5, 0x5c, 0xe2, 0x9d, 0x0, 0x0, 0xda, + 0xd8, 0x0, 0x0, 0x7e, 0xd7, 0x0, 0x0, 0x7e, + 0xac, 0x0, 0x0, 0xcb, 0x3f, 0xa2, 0x2a, 0xf3, + 0x4, 0xef, 0xfe, 0x40, 0x0, 0x2, 0x20, 0x0, + + /* U+2022 "•" */ + 0x1, 0x64, 0x1, 0xef, 0xf7, 0x5f, 0xff, 0xd4, + 0xff, 0xfc, 0x8, 0xfd, 0x20, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xe8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xdf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3a, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xaf, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x30, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xfb, 0x62, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xfe, 0x94, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x3a, 0xdf, 0xef, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0x3, 0xad, 0xfe, 0xff, + 0xf0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xfe, + 0x6f, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x3a, 0xef, 0xea, 0x30, + 0xef, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xae, 0xfe, 0xa3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0xb7, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x7b, 0xfd, 0x88, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x88, 0xdf, + 0xff, 0xff, 0xff, 0xb4, 0x44, 0x44, 0x44, 0x44, + 0x5f, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xcf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf5, 0x0, 0x9f, + 0xf8, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf4, 0x0, 0x8f, 0xf9, 0x0, 0xcf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf5, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfd, 0x88, 0xef, 0xa2, + 0x22, 0x22, 0x22, 0x22, 0x3f, 0xfb, 0x88, 0xdf, + 0xf8, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x8f, 0xf8, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8f, + 0xfd, 0x88, 0xef, 0xa2, 0x22, 0x22, 0x22, 0x22, + 0x3f, 0xfb, 0x88, 0xdf, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xcf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf5, 0x0, 0x9f, 0xf8, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf4, 0x0, 0x8f, + 0xf9, 0x0, 0xcf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf5, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xb4, + 0x44, 0x44, 0x44, 0x44, 0x5f, 0xff, 0xff, 0xff, + 0xfd, 0x88, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x88, 0xdf, 0xb7, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x7b, + + /* U+F00B "" */ + 0x14, 0x44, 0x44, 0x10, 0x3, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x41, 0xef, 0xff, 0xff, 0xe0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7b, 0xbb, 0xbb, 0x60, 0x2a, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xb0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xb0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x14, 0x44, 0x44, 0x10, + 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, + 0xef, 0xff, 0xff, 0xe0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7b, 0xbb, 0xbb, 0x60, + 0x2a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbd, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, 0x10, + 0x2, 0xdb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xd1, 0x0, 0x2e, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0xdf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xc0, + 0x0, 0xc, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xcc, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "ï€" */ + 0x1, 0x41, 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, + 0x1, 0xdf, 0xd2, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x70, 0xcf, 0xff, 0xe2, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x4e, 0xff, 0xff, 0xe2, 0x0, 0x8, 0xff, + 0xff, 0xf6, 0x4f, 0xff, 0xff, 0xe2, 0x8, 0xff, + 0xff, 0xfb, 0x0, 0x4f, 0xff, 0xff, 0xe9, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x8, 0xff, + 0xff, 0xfb, 0x5f, 0xff, 0xff, 0xe2, 0x7, 0xff, + 0xff, 0xfb, 0x0, 0x4f, 0xff, 0xff, 0xe1, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x7a, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, + 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x60, 0x0, 0xef, 0xfd, 0x0, + 0x7, 0x70, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xf3, + 0x0, 0xef, 0xfd, 0x0, 0x5f, 0xfb, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfb, 0x0, 0xef, 0xfd, 0x0, + 0xcf, 0xff, 0xb0, 0x0, 0x0, 0x9f, 0xff, 0xf6, + 0x0, 0xef, 0xfd, 0x0, 0x7f, 0xff, 0xf7, 0x0, + 0x3, 0xff, 0xff, 0x60, 0x0, 0xef, 0xfd, 0x0, + 0x8, 0xff, 0xff, 0x20, 0xa, 0xff, 0xf9, 0x0, + 0x0, 0xef, 0xfd, 0x0, 0x0, 0xbf, 0xff, 0x90, + 0x1f, 0xff, 0xe0, 0x0, 0x0, 0xef, 0xfd, 0x0, + 0x0, 0x1f, 0xff, 0xf0, 0x5f, 0xff, 0x90, 0x0, + 0x0, 0xef, 0xfd, 0x0, 0x0, 0xa, 0xff, 0xf3, + 0x8f, 0xff, 0x40, 0x0, 0x0, 0xef, 0xfd, 0x0, + 0x0, 0x6, 0xff, 0xf6, 0x9f, 0xff, 0x20, 0x0, + 0x0, 0xef, 0xfd, 0x0, 0x0, 0x4, 0xff, 0xf8, + 0x9f, 0xff, 0x20, 0x0, 0x0, 0xef, 0xfc, 0x0, + 0x0, 0x4, 0xff, 0xf7, 0x8f, 0xff, 0x40, 0x0, + 0x0, 0x37, 0x72, 0x0, 0x0, 0x6, 0xff, 0xf6, + 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf4, 0x1f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf0, + 0xb, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xa0, 0x3, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, + 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1, + 0x9f, 0xff, 0xf8, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xe8, 0x42, 0x24, 0x9e, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, + 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x15, 0x89, 0x97, 0x51, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x89, 0x98, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xc3, 0x2c, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x3c, 0xc0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0x94, 0x49, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x6, 0xef, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfe, 0x60, + 0x0, 0x1e, 0xff, 0xff, 0x90, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x9, 0xff, 0xff, 0xe1, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xfe, 0x60, 0xf, 0xff, 0xff, 0xff, + 0xff, 0x94, 0x49, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xc, 0xc3, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x3c, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x89, 0x98, 0x40, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x10, + 0x0, 0x2, 0x44, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x40, 0x0, 0xdf, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x70, 0xe, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xa0, 0xef, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xb3, 0xbf, 0xff, 0xce, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0x90, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x60, 0x5d, + 0x50, 0x6f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0x30, 0x8f, 0xff, 0x70, 0x4e, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xfd, + 0x20, 0xaf, 0xff, 0xff, 0xa0, 0x2d, 0xff, 0xfb, + 0x0, 0x0, 0x2d, 0xff, 0xfb, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xc1, 0xb, 0xff, 0xfd, 0x20, 0x4f, + 0xff, 0xf8, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x8, 0xff, 0xfe, 0x4e, 0xff, 0xf5, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x5, + 0xff, 0xfe, 0x4f, 0xe3, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3, 0xef, 0x40, + 0x41, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x1, 0x40, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xeb, 0xbb, 0xef, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf4, 0x0, 0x4, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf4, 0x0, 0x4, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x4f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xf3, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x3, 0xbb, 0xbb, + 0xba, 0x10, 0x0, 0x1a, 0xbb, 0xbb, 0xb3, 0x0, + 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x9, 0xdd, 0xdd, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xad, 0xdd, + 0xdf, 0xff, 0xff, 0xfd, 0xdd, 0xda, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x25, 0x55, 0x55, 0x55, 0x11, 0xdf, 0xfd, 0x11, + 0x55, 0x55, 0x55, 0x52, 0xef, 0xff, 0xff, 0xff, + 0xd1, 0x1d, 0xd1, 0x1d, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x71, 0xe7, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb6, 0xfb, 0x6f, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F01C "" */ + 0x0, 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x50, 0x0, 0x0, 0x1e, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfe, 0x10, 0x0, 0xa, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfa, + 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf5, 0x1, 0xef, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xe1, 0xaf, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd3, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x32, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x67, 0x75, 0x20, 0x0, 0x0, 0x4f, 0xff, + 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xfd, + 0x70, 0x0, 0x4f, 0xff, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x3f, 0xff, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xfb, 0x3f, 0xff, 0x0, 0xd, 0xff, 0xff, + 0xb4, 0x0, 0x0, 0x5b, 0xff, 0xff, 0xdf, 0xff, + 0x0, 0xaf, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0x4, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xc, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xee, 0xef, 0xff, 0xff, 0x1f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x5f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4, 0x43, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x44, 0x44, 0x44, 0x44, 0x43, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x34, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x34, 0x40, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf1, 0xff, 0xff, 0xfd, 0xee, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0x40, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xfa, 0x0, + 0xff, 0xfe, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x4b, + 0xff, 0xff, 0xd0, 0x0, 0xff, 0xf3, 0xbf, 0xff, + 0xff, 0xfe, 0xef, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0xff, 0xf3, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xff, 0xf4, 0x0, 0x17, + 0xdf, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, + 0xff, 0xf4, 0x0, 0x0, 0x2, 0x67, 0x76, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x23, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xa7, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0x14, 0x44, 0x44, 0xcf, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xbb, + 0xbb, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x96, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x13, 0x33, 0x33, 0xcf, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x4a, 0x20, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, 0xe1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x3e, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x6, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x5, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x2e, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xcf, 0xf2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x5b, 0x30, 0x7c, 0xcc, 0xcc, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, + 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x70, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0x0, 0x0, 0x6, 0x30, + 0x5, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xf0, 0x0, 0x3, 0xff, 0x70, 0x8, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0x0, + 0x0, 0xc, 0xff, 0x70, 0xc, 0xfc, 0x1, 0x44, + 0x44, 0x4c, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xa, + 0xff, 0x30, 0x4f, 0xf3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x5a, 0x20, 0xc, 0xfb, 0x0, + 0xdf, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xc, 0xfe, 0x20, 0x4f, 0xf1, 0x8, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x2e, 0xfa, + 0x0, 0xff, 0x50, 0x5f, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x6f, 0xe0, 0xc, 0xf7, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x6, 0xfe, 0x0, 0xcf, 0x70, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2, 0xef, + 0xa0, 0xf, 0xf5, 0x6, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xcf, 0xe2, 0x4, 0xff, + 0x10, 0x9f, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x4, 0xa2, 0x0, 0xcf, 0xb0, 0xd, 0xf8, + 0x7b, 0xbb, 0xbb, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xaf, 0xf3, 0x4, 0xff, 0x30, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xf7, + 0x0, 0xcf, 0xc0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x6f, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, + 0x0, 0x53, 0x0, 0x4f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd3, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xca, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x42, 0x8f, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6b, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0xbf, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x40, 0x0, + 0xb, 0x40, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F043 "ïƒ" */ + 0x0, 0x0, 0x0, 0xc, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, + 0xff, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xef, 0xf1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3c, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x8f, 0xfc, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x1, 0xff, 0xf9, 0x2, 0x7c, 0xff, 0xff, + 0xff, 0x50, 0x7, 0xff, 0xfb, 0x40, 0x6f, 0xff, + 0xff, 0xb0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, 0x8d, 0xff, + 0xda, 0x40, 0x0, 0x0, + + /* U+F048 "ïˆ" */ + 0x34, 0x40, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x1d, 0xfb, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xea, 0xbb, 0x30, + 0x0, 0x0, 0x0, 0x5, 0xb4, + + /* U+F04B "ï‹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa2, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb2, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe5, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F04C "ïŒ" */ + 0x19, 0xcc, 0xcc, 0xc9, 0x10, 0x0, 0x19, 0xcc, + 0xcc, 0xc9, 0x1b, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xfe, 0x5f, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0x50, 0x13, 0x33, 0x33, + 0x10, 0x0, 0x0, 0x13, 0x33, 0x33, 0x10, + + /* U+F04D "ï" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x41, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x8b, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x81, + + /* U+F051 "ï‘" */ + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x3b, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x86, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x16, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xef, 0xf6, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0xba, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x4b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0x40, + + /* U+F053 "ï“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+F054 "ï”" */ + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x43, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x77, 0x77, 0x77, 0x7d, 0xff, 0xfd, 0x77, + 0x77, 0x77, 0x71, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xab, 0xa2, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "ï¨" */ + 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x76, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F06E "ï®" */ + 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xed, + 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xe9, 0x54, 0x59, 0xef, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0x70, 0x0, 0x14, 0x20, 0x0, 0x7f, + 0xff, 0xfe, 0x20, 0x0, 0x1e, 0xff, 0xff, 0xb0, + 0x0, 0x6, 0xff, 0xc2, 0x0, 0xbf, 0xff, 0xfe, + 0x10, 0xb, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x5f, + 0xff, 0xe2, 0x3, 0xff, 0xff, 0xfb, 0x6, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa0, + 0xe, 0xff, 0xff, 0xf5, 0xef, 0xff, 0xff, 0xc0, + 0xd, 0xcf, 0xff, 0xff, 0xfe, 0x0, 0xcf, 0xff, + 0xff, 0xee, 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xc, 0xff, 0xff, 0xfe, 0x5f, + 0xff, 0xff, 0xe0, 0xc, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0xef, 0xff, 0xff, 0x50, 0xbf, 0xff, 0xff, + 0x30, 0x4f, 0xff, 0xff, 0xff, 0x50, 0x3f, 0xff, + 0xff, 0xb0, 0x1, 0xdf, 0xff, 0xfb, 0x0, 0x7f, + 0xff, 0xff, 0x80, 0xb, 0xff, 0xff, 0xe1, 0x0, + 0x2, 0xef, 0xff, 0xf7, 0x0, 0x39, 0xb9, 0x30, + 0x7, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, + 0x95, 0x45, 0x9e, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xda, 0x71, 0x0, + 0x0, 0x0, 0x0, + + /* U+F070 "ï°" */ + 0x5, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfe, 0x40, 0x0, 0x48, 0xce, 0xff, 0xeb, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x88, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xb6, 0x45, 0x7d, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xbf, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf6, 0x1, 0x76, 0x20, 0x4, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x4e, 0xff, 0xfa, 0x1f, 0xff, 0x90, 0x8, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x6e, 0x40, 0x0, + 0x2c, 0xff, 0xfd, 0xff, 0xff, 0x80, 0xf, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x2f, 0xff, 0x70, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x0, 0xbf, 0xff, + 0xff, 0x90, 0x0, 0x9, 0xff, 0xff, 0xb1, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xf3, 0x9, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x9f, 0xff, 0xff, 0xd1, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0x30, 0x9f, 0xff, 0xff, + 0xf1, 0x0, 0x2, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x1, 0xbf, 0xff, 0xf4, 0xb, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf7, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfb, 0x64, 0x51, + 0x0, 0x5, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x2, 0xdf, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x9d, 0xef, 0xfe, 0xa1, + 0x0, 0x0, 0xaf, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xc0, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xa4, 0x44, 0xaf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf7, 0x0, 0x7, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x80, + 0x0, 0x8f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf9, 0x0, 0x9, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xaf, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xfb, 0x0, 0xb, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x26, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x30, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x69, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfc, 0x0, 0x9b, 0xbb, 0xbb, 0x30, + 0x0, 0x0, 0x0, 0x3b, 0xbb, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x3e, 0xff, + 0xe2, 0xc, 0xff, 0xfe, 0x20, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x3, 0xff, 0x30, 0xaf, 0xff, 0xf3, + 0x0, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x54, + 0x9, 0xff, 0xff, 0x40, 0x0, 0xbe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf9, 0x4, 0x50, + 0x0, 0xbe, 0x30, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xa0, 0x3f, 0xf3, 0x0, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xfc, 0x2, 0xef, 0xfe, + 0x30, 0xff, 0xfe, 0x30, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x9b, 0xbb, 0xbb, 0x30, 0x0, 0x0, 0x0, 0x3b, + 0xbb, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x69, 0x0, 0x0, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfd, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf9, 0xa, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf9, 0x0, 0xa, + 0xff, 0xff, 0x90, 0x0, 0x0, 0xaf, 0xff, 0xf9, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x90, 0x0, 0xaf, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x90, 0x9f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x79, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, 0xb, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfa, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, + + /* U+F078 "ï¸" */ + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0xbf, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xa0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x89, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf7, 0xa, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf9, 0x0, 0xa, 0xff, 0xff, + 0x90, 0x0, 0x0, 0xaf, 0xff, 0xf9, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x90, 0x0, 0xaf, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x90, 0xaf, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xdf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x0, 0x3, 0xd9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xfa, 0x0, 0x0, 0x34, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x10, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xfa, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xfa, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x5, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbf, 0xff, 0x10, 0x0, 0x0, 0xef, 0xfe, + 0xdf, 0xfb, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf1, 0x0, 0x0, 0xd, 0xfe, 0x2b, + 0xff, 0x48, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x10, 0x0, 0x0, 0x17, 0x20, 0xbf, + 0xf4, 0x5, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0x70, 0xef, 0xf1, + 0x4f, 0xc0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x6e, 0xff, 0x5f, + 0xff, 0x60, 0x0, 0x0, 0xbf, 0xf7, 0x44, 0x44, + 0x44, 0x44, 0x20, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0xbf, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xbf, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x4, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0x60, 0x0, 0xbf, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, + + /* U+F07B "ï»" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F093 "ï‚“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, + 0x2f, 0xff, 0xff, 0xf2, 0x22, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x25, 0x55, 0x55, 0x52, 0xf, 0xff, 0xff, 0xf0, + 0x25, 0x55, 0x55, 0x52, 0xef, 0xff, 0xff, 0xf9, + 0xc, 0xff, 0xff, 0xc0, 0x9f, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x1, 0x10, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x71, 0xe7, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb6, 0xfb, 0x6f, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xea, 0x63, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x3a, 0xff, 0xa0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x5, 0xcf, 0xff, + 0xff, 0x70, 0x3, 0xdf, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x6a, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0xc9, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x0, 0x2, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x37, 0x73, 0x0, 0x2e, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x90, 0xaf, 0xff, 0xcf, 0xff, 0xa0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xb0, 0xef, 0xf4, 0x4, 0xff, + 0xe0, 0x0, 0x9, 0xff, 0xff, 0xfb, 0x0, 0xff, + 0xf1, 0x1, 0xff, 0xf0, 0x0, 0x9f, 0xff, 0xff, + 0xb0, 0x0, 0xcf, 0xfb, 0x5b, 0xff, 0xc0, 0x9, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xf5, 0x9f, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x39, 0xbe, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x49, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x2, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfb, 0xef, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xaf, 0xff, 0xcf, + 0xff, 0xd0, 0x2e, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0xef, 0xf4, 0x4, 0xff, 0xe0, 0x2, 0xef, 0xff, + 0xff, 0x50, 0x0, 0xff, 0xf1, 0x1, 0xff, 0xf0, + 0x0, 0x2e, 0xff, 0xff, 0xf5, 0x0, 0xcf, 0xfb, + 0x5b, 0xff, 0xc0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0x50, 0x5f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xd0, 0x8, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x1, 0xae, 0xea, 0x20, 0x0, + 0x39, 0xb9, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf0, + 0x7a, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0x8, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xfb, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0x8, + 0xff, 0xfa, 0x47, 0x88, 0x40, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x48, 0x88, 0x7f, 0xff, 0xf8, 0xf, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x4, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x74, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf, + 0xff, 0xcb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, + 0xf8, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf8, 0xf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0x54, 0x44, 0x44, 0x44, 0x44, 0x45, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xce, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x57, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x8b, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x81, + + /* U+F0C9 "" */ + 0x13, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x13, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x57, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xeb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x31, + + /* U+F0E0 "" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd3, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0xe4, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x4e, 0xff, 0x80, 0x2c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x8, 0xff, + 0xff, 0xfc, 0x20, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf5, 0x4, + 0xef, 0xff, 0xff, 0xfe, 0x40, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x1c, 0xff, 0xff, 0xb1, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x6d, 0xd6, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd9, 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F0E7 "" */ + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xc8, 0x88, 0x87, 0x30, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x37, + 0x88, 0x88, 0xaf, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0x70, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x3, 0xdf, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x78, 0x88, 0xff, 0xef, 0xf8, + 0x88, 0x74, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x90, 0x9f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf9, 0x9, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf4, 0x7, 0x88, 0x88, + 0x88, 0x3, 0x30, 0x0, 0xff, 0xff, 0xff, 0x7, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0x40, 0xf, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0x8, 0xff, + 0x40, 0xff, 0xff, 0xff, 0x8, 0xff, 0xff, 0xff, + 0xf0, 0x8f, 0xff, 0x4f, 0xff, 0xff, 0xf0, 0x8f, + 0xff, 0xff, 0xff, 0x8, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xb8, 0x88, 0x88, 0xff, 0xff, 0xff, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x78, 0x88, 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x8, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x6f, 0xff, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xc3, + 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x1f, 0x90, 0x9, 0xf1, 0x1, + 0xf9, 0x0, 0x9f, 0x10, 0x1f, 0xff, 0xff, 0xf0, + 0x0, 0xf8, 0x0, 0x8f, 0x0, 0xf, 0x80, 0x8, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0x10, 0x1f, 0x90, + 0x9, 0xf1, 0x1, 0xf9, 0x0, 0x9f, 0x10, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb8, 0x8f, 0xe8, 0x8b, 0xfb, 0x88, 0xfe, + 0x88, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xcc, 0x0, 0x4f, 0x40, 0xc, 0xc0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xc, 0xc0, 0x4, + 0xf4, 0x0, 0xcc, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x88, 0xfe, 0x88, 0xbf, 0xb8, 0x8f, + 0xe8, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x1, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf1, 0x1, 0xff, 0xff, + 0xff, 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0x0, 0xf, 0xff, 0xff, 0xf1, 0x1, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf1, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd3, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x6, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x57, + 0x88, 0x88, 0x88, 0x8c, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "ï…›" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe4, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, + 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x56, 0x77, 0x65, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x50, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xc9, 0x65, 0x44, 0x56, 0x9c, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x1c, 0xff, 0xff, 0xfd, 0x61, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xdf, 0xff, 0xff, + 0xc1, 0xdf, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xfd, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x9, + 0xf6, 0x0, 0x0, 0x0, 0x48, 0xcd, 0xff, 0xdc, + 0x84, 0x0, 0x0, 0x0, 0x6f, 0x90, 0x0, 0x10, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe6, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xfe, 0xcc, 0xef, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xc5, 0x10, 0x0, 0x1, 0x5c, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xaa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F240 "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xfb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbd, 0xff, 0xa1, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0xff, 0xf0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5, 0xbf, + 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x2, 0x4f, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x4a, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x18, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, 0x0, + + /* U+F241 "ï‰" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xfb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbd, 0xff, 0xa1, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0xff, 0xf0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x2, 0x4f, 0xff, 0xff, 0xf0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x4a, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x18, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, 0x0, + + /* U+F242 "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xfb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbd, 0xff, 0xa1, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0xff, 0xf0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x4f, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x4a, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x18, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, 0x0, + + /* U+F243 "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xfb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbd, 0xff, 0xa1, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0xff, 0xf0, 0xbf, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0xbf, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0xbf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x4f, 0xff, 0xff, 0xf0, + 0xbf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x4a, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x18, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, 0x0, + + /* U+F244 "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xfb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbd, 0xff, 0xa1, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x4f, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x4a, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x18, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0x7d, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xf5, 0x3a, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xf6, 0x0, 0x9, 0xda, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0xed, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x50, + 0x0, 0x6f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa4, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x30, + 0x1e, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xfa, 0x10, 0xe, 0xff, 0xff, 0xfd, 0xbe, + 0xfe, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xff, 0xff, 0x60, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xa, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x1c, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xd4, 0x0, 0x1c, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x2f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x70, + 0x0, 0x0, 0x4, 0x63, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xfb, 0x0, 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xf8, 0x4b, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x5c, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x2, 0x8c, 0xef, 0xfe, 0xa6, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xa, 0xff, 0xff, + 0xff, 0x5, 0xff, 0xff, 0xfe, 0x10, 0x2, 0xff, + 0xff, 0xff, 0xf0, 0x5, 0xff, 0xff, 0xf8, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x0, 0x6, 0xff, 0xff, + 0xe0, 0xe, 0xff, 0xfc, 0xff, 0xf0, 0x16, 0x7, + 0xff, 0xff, 0x21, 0xff, 0xf8, 0x9, 0xff, 0x1, + 0xf6, 0x7, 0xff, 0xf5, 0x4f, 0xff, 0xd1, 0x9, + 0xf0, 0x1f, 0x70, 0x6f, 0xff, 0x86, 0xff, 0xff, + 0xd1, 0x7, 0x1, 0x70, 0x5f, 0xff, 0xf9, 0x7f, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xa7, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x2e, 0xff, + 0xff, 0xfb, 0x7f, 0xff, 0xff, 0xff, 0x30, 0x5, + 0xff, 0xff, 0xff, 0xb7, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x6, 0xff, 0xff, 0xfa, 0x6f, 0xff, 0xff, + 0x40, 0x30, 0x3, 0x7, 0xff, 0xff, 0xa4, 0xff, + 0xff, 0x40, 0x4e, 0x1, 0xe2, 0x8, 0xff, 0xf8, + 0x2f, 0xff, 0x70, 0x4f, 0xf0, 0x1f, 0x90, 0x2f, + 0xff, 0x60, 0xef, 0xff, 0x7f, 0xff, 0x1, 0xb0, + 0x2e, 0xff, 0xf3, 0xa, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x2e, 0xff, 0xff, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0x0, 0x2e, 0xff, 0xff, 0x90, 0x0, 0xbf, + 0xff, 0xff, 0xf0, 0x2e, 0xff, 0xff, 0xf2, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0x3e, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x28, 0xce, 0xff, + 0xec, 0x82, 0x0, 0x0, + + /* U+F2ED "ï‹­" */ + 0x0, 0x0, 0x0, 0x1a, 0xcc, 0xcc, 0xca, 0x10, + 0x0, 0x0, 0x2, 0x44, 0x44, 0x49, 0xff, 0xff, + 0xff, 0xf9, 0x44, 0x44, 0x42, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8f, + 0xff, 0x66, 0xff, 0xd1, 0xdf, 0xf6, 0x6f, 0xff, + 0x80, 0x8, 0xff, 0xf4, 0x4f, 0xfc, 0xc, 0xff, + 0x44, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0x44, 0xff, + 0xc0, 0xcf, 0xf4, 0x4f, 0xff, 0x80, 0x8, 0xff, + 0xf4, 0x4f, 0xfc, 0xc, 0xff, 0x44, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0x44, 0xff, 0xc0, 0xcf, 0xf4, + 0x4f, 0xff, 0x80, 0x8, 0xff, 0xf4, 0x4f, 0xfc, + 0xc, 0xff, 0x44, 0xff, 0xf8, 0x0, 0x8f, 0xff, + 0x44, 0xff, 0xc0, 0xcf, 0xf4, 0x4f, 0xff, 0x80, + 0x8, 0xff, 0xf4, 0x4f, 0xfc, 0xc, 0xff, 0x44, + 0xff, 0xf8, 0x0, 0x8f, 0xff, 0x44, 0xff, 0xc0, + 0xcf, 0xf4, 0x4f, 0xff, 0x80, 0x8, 0xff, 0xf4, + 0x4f, 0xfc, 0xc, 0xff, 0x44, 0xff, 0xf8, 0x0, + 0x8f, 0xff, 0x44, 0xff, 0xc0, 0xcf, 0xf4, 0x4f, + 0xff, 0x80, 0x8, 0xff, 0xf6, 0x6f, 0xfd, 0x1d, + 0xff, 0x66, 0xff, 0xf8, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6e, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x50, 0x3f, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x3f, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xb0, 0x3f, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xb0, 0x3f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xb0, 0x3f, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xdb, 0xa8, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xf8, 0x6, 0xff, 0xff, 0x60, 0x8f, + 0xff, 0xff, 0xff, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x6f, 0xf6, 0x0, 0xc, 0xff, + 0xff, 0xff, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x6, 0x60, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x6, 0x60, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x6f, 0xf6, 0x0, 0xc, + 0xff, 0xff, 0xff, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xf8, 0x6, 0xff, 0xff, 0x60, 0x8f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x80, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xf4, 0x8, 0xf0, + 0xe, 0x90, 0xf, 0xff, 0x8, 0xff, 0xf4, 0x8, + 0xf0, 0xe, 0x90, 0xf, 0xff, 0x8f, 0xff, 0xf4, + 0x8, 0xf0, 0xe, 0x90, 0xf, 0xff, 0xff, 0xff, + 0xf4, 0x8, 0xf0, 0xe, 0x90, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0x8c, 0xf8, 0x8f, 0xc8, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x10, 0x0, 0x0, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf1, 0x0, 0x0, 0x1c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, + 0x1d, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf1, 0x0, 0x2d, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, + 0x2e, 0xff, 0xff, 0xa2, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x2b, 0xff, 0xf1, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xff, 0xd9, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x60, 0x0, 0x7f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 103, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 103, .box_w = 4, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 34, .adv_w = 150, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 59, .adv_w = 270, .box_w = 17, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 204, .adv_w = 238, .box_w = 14, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 365, .adv_w = 324, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 535, .adv_w = 263, .box_w = 16, .box_h = 18, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 679, .adv_w = 81, .box_w = 3, .box_h = 7, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 690, .adv_w = 129, .box_w = 6, .box_h = 23, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 759, .adv_w = 130, .box_w = 6, .box_h = 23, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 828, .adv_w = 154, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 878, .adv_w = 223, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 944, .adv_w = 87, .box_w = 4, .box_h = 7, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 958, .adv_w = 147, .box_w = 7, .box_h = 3, .ofs_x = 1, .ofs_y = 6}, + {.bitmap_index = 969, .adv_w = 87, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 977, .adv_w = 135, .box_w = 11, .box_h = 23, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 1104, .adv_w = 256, .box_w = 14, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1223, .adv_w = 142, .box_w = 7, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1283, .adv_w = 220, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1394, .adv_w = 220, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1505, .adv_w = 257, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1641, .adv_w = 220, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1752, .adv_w = 237, .box_w = 14, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1871, .adv_w = 230, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1990, .adv_w = 247, .box_w = 14, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2109, .adv_w = 237, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2228, .adv_w = 87, .box_w = 4, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2254, .adv_w = 87, .box_w = 4, .box_h = 17, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 2288, .adv_w = 223, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 2354, .adv_w = 223, .box_w = 12, .box_h = 8, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 2402, .adv_w = 223, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 2468, .adv_w = 220, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2579, .adv_w = 397, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 2832, .adv_w = 281, .box_w = 19, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2994, .adv_w = 291, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3122, .adv_w = 278, .box_w = 16, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3258, .adv_w = 317, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3403, .adv_w = 257, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3514, .adv_w = 244, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3625, .adv_w = 296, .box_w = 16, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3761, .adv_w = 312, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3889, .adv_w = 119, .box_w = 3, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3915, .adv_w = 197, .box_w = 11, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4009, .adv_w = 276, .box_w = 16, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4145, .adv_w = 228, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4256, .adv_w = 367, .box_w = 19, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4418, .adv_w = 312, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4546, .adv_w = 323, .box_w = 19, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4708, .adv_w = 277, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4836, .adv_w = 323, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 5026, .adv_w = 279, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5154, .adv_w = 238, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5273, .adv_w = 225, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5392, .adv_w = 304, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5520, .adv_w = 273, .box_w = 19, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5682, .adv_w = 432, .box_w = 27, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5912, .adv_w = 258, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6048, .adv_w = 248, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 6193, .adv_w = 252, .box_w = 15, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6321, .adv_w = 128, .box_w = 6, .box_h = 23, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 6390, .adv_w = 135, .box_w = 11, .box_h = 23, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 6517, .adv_w = 128, .box_w = 6, .box_h = 23, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 6586, .adv_w = 224, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 6646, .adv_w = 192, .box_w = 12, .box_h = 2, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6658, .adv_w = 230, .box_w = 7, .box_h = 3, .ofs_x = 2, .ofs_y = 15}, + {.bitmap_index = 6669, .adv_w = 230, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6747, .adv_w = 262, .box_w = 14, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6873, .adv_w = 219, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6951, .adv_w = 262, .box_w = 14, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7077, .adv_w = 235, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7162, .adv_w = 136, .box_w = 10, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7252, .adv_w = 265, .box_w = 14, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 7378, .adv_w = 262, .box_w = 13, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7495, .adv_w = 107, .box_w = 4, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7531, .adv_w = 109, .box_w = 9, .box_h = 23, .ofs_x = -3, .ofs_y = -5}, + {.bitmap_index = 7635, .adv_w = 237, .box_w = 13, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7752, .adv_w = 107, .box_w = 3, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7779, .adv_w = 406, .box_w = 22, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7922, .adv_w = 262, .box_w = 13, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8007, .adv_w = 244, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8098, .adv_w = 262, .box_w = 14, .box_h = 18, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 8224, .adv_w = 262, .box_w = 14, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 8350, .adv_w = 157, .box_w = 8, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8402, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8480, .adv_w = 159, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8560, .adv_w = 260, .box_w = 13, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8645, .adv_w = 215, .box_w = 15, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8743, .adv_w = 345, .box_w = 22, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8886, .adv_w = 212, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8971, .adv_w = 215, .box_w = 15, .box_h = 18, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 9106, .adv_w = 200, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9184, .adv_w = 135, .box_w = 7, .box_h = 23, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9265, .adv_w = 115, .box_w = 3, .box_h = 23, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 9300, .adv_w = 135, .box_w = 8, .box_h = 23, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 9392, .adv_w = 223, .box_w = 12, .box_h = 4, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 9416, .adv_w = 161, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 9456, .adv_w = 121, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 9469, .adv_w = 384, .box_w = 24, .box_h = 25, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9769, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9985, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10249, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10465, .adv_w = 264, .box_w = 17, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10618, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10906, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11194, .adv_w = 432, .box_w = 27, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11491, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11779, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12022, .adv_w = 384, .box_w = 24, .box_h = 26, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 12334, .adv_w = 192, .box_w = 12, .box_h = 19, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 12448, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 12619, .adv_w = 432, .box_w = 27, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12943, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13159, .adv_w = 264, .box_w = 17, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 13363, .adv_w = 336, .box_w = 15, .box_h = 22, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 13528, .adv_w = 336, .box_w = 21, .box_h = 26, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 13801, .adv_w = 336, .box_w = 21, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14032, .adv_w = 336, .box_w = 21, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14263, .adv_w = 336, .box_w = 15, .box_h = 22, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 14428, .adv_w = 336, .box_w = 23, .box_h = 22, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 14681, .adv_w = 240, .box_w = 13, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 14824, .adv_w = 240, .box_w = 13, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 14967, .adv_w = 336, .box_w = 21, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15198, .adv_w = 336, .box_w = 21, .box_h = 6, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 15261, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15504, .adv_w = 480, .box_w = 31, .box_h = 24, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 15876, .adv_w = 432, .box_w = 29, .box_h = 24, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 16224, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16488, .adv_w = 336, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 16635, .adv_w = 336, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 16782, .adv_w = 480, .box_w = 31, .box_h = 19, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 17077, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17293, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 17581, .adv_w = 384, .box_w = 25, .box_h = 25, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 17894, .adv_w = 336, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18136, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 18388, .adv_w = 336, .box_w = 21, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18619, .adv_w = 336, .box_w = 21, .box_h = 20, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18829, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19045, .adv_w = 240, .box_w = 17, .box_h = 24, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 19249, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 19501, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 19753, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19996, .adv_w = 384, .box_w = 26, .box_h = 26, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 20334, .adv_w = 288, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 20550, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20895, .adv_w = 480, .box_w = 30, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 21135, .adv_w = 480, .box_w = 30, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 21375, .adv_w = 480, .box_w = 30, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 21615, .adv_w = 480, .box_w = 30, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 21855, .adv_w = 480, .box_w = 30, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 22095, .adv_w = 480, .box_w = 31, .box_h = 20, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 22405, .adv_w = 336, .box_w = 19, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 22633, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 22885, .adv_w = 384, .box_w = 25, .box_h = 25, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23198, .adv_w = 480, .box_w = 30, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23468, .adv_w = 288, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 23684, .adv_w = 386, .box_w = 25, .box_h = 16, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 4, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 17, 0, 10, -8, 0, 0, + 0, 0, -21, -23, 3, 18, 8, 7, + -15, 3, 19, 1, 16, 4, 12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 23, 3, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 8, 0, -12, 0, 0, 0, 0, + 0, -8, 7, 8, 0, 0, -4, 0, + -3, 4, 0, -4, 0, -4, -2, -8, + 0, 0, 0, 0, -4, 0, 0, -5, + -6, 0, 0, -4, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + -4, 0, -6, 0, -10, 0, -46, 0, + 0, -8, 0, 8, 12, 0, 0, -8, + 4, 4, 13, 8, -7, 8, 0, 0, + -22, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -10, -5, -19, 0, -15, + -3, 0, 0, 0, 0, 1, 15, 0, + -12, -3, -1, 1, 0, -7, 0, 0, + -3, -28, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -31, -3, 15, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -16, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, + 0, 4, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 3, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -14, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 8, 4, 12, -4, 0, 0, 8, -4, + -13, -53, 3, 10, 8, 1, -5, 0, + 14, 0, 12, 0, 12, 0, -36, 0, + -5, 12, 0, 13, -4, 8, 4, 0, + 0, 1, -4, 0, 0, -7, 31, 0, + 31, 0, 12, 0, 16, 5, 7, 12, + 0, 0, 0, -14, 0, 0, 0, 0, + 1, -3, 0, 3, -7, -5, -8, 3, + 0, -4, 0, 0, 0, -15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -25, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -21, 0, -24, 0, 0, 0, + 0, -3, 0, 38, -5, -5, 4, 4, + -3, 0, -5, 4, 0, 0, -20, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -37, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -24, 0, 23, 0, 0, -14, 0, + 13, 0, -26, -37, -26, -8, 12, 0, + 0, -26, 0, 5, -9, 0, -6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 12, -47, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 3, 0, 0, 0, + 0, 0, 3, 3, -5, -8, 0, -1, + -1, -4, 0, 0, -3, 0, 0, 0, + -8, 0, -3, 0, -9, -8, 0, -10, + -13, -13, -7, 0, -8, 0, -8, 0, + 0, 0, 0, -3, 0, 0, 4, 0, + 3, -4, 0, 1, 0, 0, 0, 4, + -3, 0, 0, 0, -3, 4, 4, -1, + 0, 0, 0, -7, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 5, -3, 0, + -5, 0, -7, 0, 0, -3, 0, 12, + 0, 0, -4, 0, 0, 0, 0, 0, + -1, 1, -3, -3, 0, 0, -4, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, -4, -5, 0, + 0, 0, 0, 0, 1, 0, 0, -3, + 0, -4, -4, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, -3, -5, 0, -6, 0, -12, + -3, -12, 8, 0, 0, -8, 4, 8, + 10, 0, -10, -1, -5, 0, -1, -18, + 4, -3, 3, -20, 4, 0, 0, 1, + -20, 0, -20, -3, -33, -3, 0, -19, + 0, 8, 11, 0, 5, 0, 0, 0, + 0, 1, 0, -7, -5, 0, -12, 0, + 0, 0, -4, 0, 0, 0, -4, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + -5, 0, 0, 0, 0, 0, 0, 0, + -4, -4, 0, -3, -5, -3, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, -3, 0, -5, + 0, -3, 0, -8, 4, 0, 0, -5, + 2, 4, 4, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 3, + 0, 0, -4, 0, -4, -3, -5, 0, + 0, 0, 0, 0, 0, 0, 3, 0, + -3, 0, 0, 0, 0, -4, -6, 0, + -7, 0, 12, -3, 1, -12, 0, 0, + 10, -19, -20, -16, -8, 4, 0, -3, + -25, -7, 0, -7, 0, -8, 6, -7, + -25, 0, -10, 0, 0, 2, -1, 3, + -3, 0, 4, 0, -12, -15, 0, -19, + -9, -8, -9, -12, -5, -10, -1, -7, + -10, 2, 0, 1, 0, -4, 0, 0, + 0, 3, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, -2, 0, -1, -4, 0, -7, -8, + -8, -1, 0, -12, 0, 0, 0, 0, + 0, 0, -3, 0, 0, 0, 0, 2, + -2, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 18, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + -7, 0, 0, 0, 0, -19, -12, 0, + 0, 0, -6, -19, 0, 0, -4, 4, + 0, -10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, -7, 0, + 0, 0, 0, 5, 0, 3, -8, -8, + 0, -4, -4, -5, 0, 0, 0, 0, + 0, 0, -12, 0, -4, 0, -6, -4, + 0, -8, -10, -12, -3, 0, -8, 0, + -12, 0, 0, 0, 0, 31, 0, 0, + 2, 0, 0, -5, 0, 4, 0, -17, + 0, 0, 0, 0, 0, -36, -7, 13, + 12, -3, -16, 0, 4, -6, 0, -19, + -2, -5, 4, -27, -4, 5, 0, 6, + -13, -6, -14, -13, -16, 0, 0, -23, + 0, 22, 0, 0, -2, 0, 0, 0, + -2, -2, -4, -10, -13, -1, -36, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, -2, -4, -6, 0, 0, + -8, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -8, 0, 0, 8, + -1, 5, 0, -8, 4, -3, -1, -10, + -4, 0, -5, -4, -3, 0, -6, -7, + 0, 0, -3, -1, -3, -7, -5, 0, + 0, -4, 0, 4, -3, 0, -8, 0, + 0, 0, -8, 0, -7, 0, -7, -7, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 4, 0, -5, 0, -3, -5, + -12, -3, -3, -3, -1, -3, -5, -1, + 0, 0, 0, 0, 0, -4, -3, -3, + 0, 0, 0, 0, 5, -3, 0, -3, + 0, 0, 0, -3, -5, -3, -3, -5, + -3, 0, 3, 15, -1, 0, -10, 0, + -3, 8, 0, -4, -16, -5, 6, 0, + 0, -18, -7, 4, -7, 3, 0, -3, + -3, -12, 0, -6, 2, 0, 0, -7, + 0, 0, 0, 4, 4, -8, -7, 0, + -7, -4, -6, -4, -4, 0, -7, 2, + -7, -7, 12, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, -5, + 0, 0, -4, -4, 0, 0, 0, 0, + -4, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, -3, 0, 0, 0, 0, + -6, 0, -8, 0, 0, 0, -13, 0, + 3, -8, 8, 1, -3, -18, 0, 0, + -8, -4, 0, -15, -10, -11, 0, 0, + -17, -4, -15, -15, -18, 0, -10, 0, + 3, 26, -5, 0, -9, -4, -1, -4, + -7, -10, -7, -14, -16, -9, -4, 0, + 0, -3, 0, 1, 0, 0, -27, -3, + 12, 8, -8, -14, 0, 1, -12, 0, + -19, -3, -4, 8, -35, -5, 1, 0, + 0, -25, -5, -20, -4, -28, 0, 0, + -27, 0, 23, 1, 0, -3, 0, 0, + 0, 0, -2, -3, -15, -3, 0, -25, + 0, 0, 0, 0, -12, 0, -3, 0, + -1, -11, -18, 0, 0, -2, -6, -12, + -4, 0, -3, 0, 0, 0, 0, -17, + -4, -13, -12, -3, -7, -10, -4, -7, + 0, -8, -3, -13, -6, 0, -5, -7, + -4, -7, 0, 2, 0, -3, -13, 0, + 8, 0, -7, 0, 0, 0, 0, 5, + 0, 3, -8, 16, 0, -4, -4, -5, + 0, 0, 0, 0, 0, 0, -12, 0, + -4, 0, -6, -4, 0, -8, -10, -12, + -3, 0, -8, 3, 15, 0, 0, 0, + 0, 31, 0, 0, 2, 0, 0, -5, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -3, -8, 0, 0, 0, 0, 0, -2, + 0, 0, 0, -4, -4, 0, 0, -8, + -4, 0, 0, -8, 0, 7, -2, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 6, 8, 3, -3, 0, -12, + -6, 0, 12, -13, -12, -8, -8, 15, + 7, 4, -33, -3, 8, -4, 0, -4, + 4, -4, -13, 0, -4, 4, -5, -3, + -12, -3, 0, 0, 12, 8, 0, -11, + 0, -21, -5, 11, -5, -15, 1, -5, + -13, -13, -4, 15, 4, 0, -6, 0, + -10, 0, 3, 13, -9, -14, -15, -10, + 12, 0, 1, -28, -3, 4, -7, -3, + -9, 0, -8, -14, -6, -6, -3, 0, + 0, -9, -8, -4, 0, 12, 9, -4, + -21, 0, -21, -5, 0, -13, -22, -1, + -12, -7, -13, -11, 10, 0, 0, -5, + 0, -8, -3, 0, -4, -7, 0, 7, + -13, 4, 0, 0, -20, 0, -4, -8, + -7, -3, -12, -10, -13, -9, 0, -12, + -4, -9, -7, -12, -4, 0, 0, 1, + 18, -7, 0, -12, -4, 0, -4, -8, + -9, -10, -11, -15, -5, -8, 8, 0, + -6, 0, -19, -5, 2, 8, -12, -14, + -8, -13, 13, -4, 2, -36, -7, 8, + -8, -7, -14, 0, -12, -16, -5, -4, + -3, -4, -8, -12, -1, 0, 0, 12, + 11, -3, -25, 0, -23, -9, 9, -15, + -26, -8, -13, -16, -19, -13, 8, 0, + 0, 0, 0, -5, 0, 0, 4, -5, + 8, 3, -7, 8, 0, 0, -12, -1, + 0, -1, 0, 1, 1, -3, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 3, 12, 1, 0, -5, 0, 0, + 0, 0, -3, -3, -5, 0, 0, 0, + 1, 3, 0, 0, 0, 0, 3, 0, + -3, 0, 15, 0, 7, 1, 1, -5, + 0, 8, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 0, 11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -23, 0, -4, 7, 0, 12, + 0, 0, 38, 5, -8, -8, 4, 4, + -3, 1, -19, 0, 0, 18, -23, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -26, 15, 54, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -23, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, -7, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, -10, 0, + 0, 1, 0, 0, 4, 50, -8, -3, + 12, 10, -10, 4, 0, 0, 4, 4, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -50, 11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -11, + 0, 0, 0, -10, 0, 0, 0, 0, + -8, -2, 0, 0, 0, -8, 0, -5, + 0, -18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -26, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -4, 0, 0, -7, 0, -6, 0, + -10, 0, 0, 0, -7, 4, -5, 0, + 0, -10, -4, -9, 0, 0, -10, 0, + -4, 0, -18, 0, -4, 0, 0, -31, + -7, -15, -4, -14, 0, 0, -26, 0, + -10, -2, 0, 0, 0, 0, 0, 0, + 0, 0, -6, -7, -3, -7, 0, 0, + 0, 0, -8, 0, -8, 5, -4, 8, + 0, -3, -9, -3, -7, -7, 0, -5, + -2, -3, 3, -10, -1, 0, 0, 0, + -34, -3, -5, 0, -8, 0, -3, -18, + -3, 0, 0, -3, -3, 0, 0, 0, + 0, 3, 0, -3, -7, -3, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 0, + 0, -8, 0, -3, 0, 0, 0, -8, + 4, 0, 0, 0, -10, -4, -8, 0, + 0, -11, 0, -4, 0, -18, 0, 0, + 0, 0, -37, 0, -8, -14, -19, 0, + 0, -26, 0, -3, -6, 0, 0, 0, + 0, 0, 0, 0, 0, -4, -6, -2, + -6, 1, 0, 0, 7, -5, 0, 12, + 19, -4, -4, -12, 5, 19, 7, 8, + -10, 5, 16, 5, 11, 8, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 24, 18, -7, -4, 0, -3, + 31, 17, 31, 0, 0, 0, 4, 0, + 0, 14, 0, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 5, + 0, 0, 0, 0, -32, -5, -3, -16, + -19, 0, 0, -26, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, -32, -5, -3, + -16, -19, 0, 0, -15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, -9, 4, 0, -4, + 3, 7, 4, -12, 0, -1, -3, 4, + 0, 3, 0, 0, 0, 0, -10, 0, + -3, -3, -8, 0, -3, -15, 0, 24, + -4, 0, -8, -3, 0, -3, -7, 0, + -4, -11, -8, -5, 0, 0, 0, -6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, -32, + -5, -3, -16, -19, 0, 0, -26, 0, + 0, 0, 0, 0, 0, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -6, 0, -12, -5, -3, 12, -3, -4, + -15, 1, -2, 1, -3, -10, 1, 8, + 1, 3, 1, 3, -9, -15, -5, 0, + -15, -7, -10, -16, -15, 0, -6, -8, + -5, -5, -3, -3, -5, -3, 0, -3, + -1, 6, 0, 6, -3, 0, 12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, -4, -4, 0, 0, + -10, 0, -2, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -23, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -5, + 0, 0, 0, 0, -3, 0, 0, -7, + -4, 4, 0, -7, -7, -3, 0, -11, + -3, -8, -3, -5, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -26, 0, 12, 0, 0, -7, 0, + 0, 0, 0, -5, 0, -4, 0, 0, + -2, 0, 0, -3, 0, -9, 0, 0, + 16, -5, -13, -12, 3, 4, 4, -1, + -11, 3, 6, 3, 12, 3, 13, -3, + -10, 0, 0, -15, 0, 0, -12, -10, + 0, 0, -8, 0, -5, -7, 0, -6, + 0, -6, 0, -3, 6, 0, -3, -12, + -4, 14, 0, 0, -3, 0, -8, 0, + 0, 5, -9, 0, 4, -4, 3, 0, + 0, -13, 0, -3, -1, 0, -4, 4, + -3, 0, 0, 0, -16, -5, -8, 0, + -12, 0, 0, -18, 0, 14, -4, 0, + -7, 0, 2, 0, -4, 0, -4, -12, + 0, -4, 4, 0, 0, 0, 0, -3, + 0, 0, 4, -5, 1, 0, 0, -5, + -3, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -24, 0, 8, 0, + 0, -3, 0, 0, 0, 0, 1, 0, + -4, -4, 0, 0, 0, 8, 0, 9, + 0, 0, 0, 0, 0, -24, -22, 1, + 17, 12, 7, -15, 3, 16, 0, 14, + 0, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 20, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserrat_24 = { +#else +lv_font_t lv_font_montserrat_24 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 27, /*The maximum line height required by the font*/ + .base_line = 5, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_24*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_26.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_26.c new file mode 100644 index 0000000..416d840 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_26.c @@ -0,0 +1,4601 @@ +/******************************************************************************* + * Size: 26 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 26 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_26.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_26 + #define LV_FONT_MONTSERRAT_26 1 +#endif + +#if LV_FONT_MONTSERRAT_26 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xf, 0xff, 0x0, 0xef, 0xe0, 0xe, 0xfd, 0x0, + 0xdf, 0xd0, 0xc, 0xfc, 0x0, 0xcf, 0xb0, 0xb, + 0xfb, 0x0, 0xbf, 0xa0, 0xa, 0xfa, 0x0, 0x9f, + 0x90, 0x9, 0xf8, 0x0, 0x8f, 0x80, 0x4, 0x84, + 0x0, 0x0, 0x0, 0x1, 0x41, 0x0, 0xef, 0xe0, + 0x2f, 0xff, 0x10, 0x9f, 0x90, + + /* U+0022 "\"" */ + 0x5f, 0xd0, 0xa, 0xf8, 0x5f, 0xc0, 0xa, 0xf7, + 0x4f, 0xc0, 0x9, 0xf7, 0x4f, 0xb0, 0x9, 0xf6, + 0x4f, 0xb0, 0x8, 0xf6, 0x3f, 0xa0, 0x8, 0xf6, + 0x3f, 0xa0, 0x8, 0xf5, 0x1, 0x0, 0x0, 0x10, + + /* U+0023 "#" */ + 0x0, 0x0, 0x1, 0xfc, 0x0, 0x0, 0x5f, 0x70, + 0x0, 0x0, 0x0, 0x3, 0xf9, 0x0, 0x0, 0x7f, + 0x50, 0x0, 0x0, 0x0, 0x6, 0xf7, 0x0, 0x0, + 0xaf, 0x30, 0x0, 0x0, 0x0, 0x8, 0xf5, 0x0, + 0x0, 0xcf, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x6, 0xee, 0xef, + 0xfe, 0xee, 0xee, 0xff, 0xee, 0xe8, 0x0, 0x0, + 0xe, 0xf0, 0x0, 0x2, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xd0, 0x0, 0x4, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xb0, 0x0, 0x6, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0x90, 0x0, 0x8, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0x70, 0x0, 0xa, + 0xf3, 0x0, 0x0, 0x4e, 0xee, 0xff, 0xfe, 0xee, + 0xef, 0xfe, 0xee, 0xa0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xcf, + 0x10, 0x0, 0xf, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xfd, 0x0, 0x0, 0x3f, 0x90, 0x0, 0x0, + 0x0, 0x1, 0xfb, 0x0, 0x0, 0x5f, 0x70, 0x0, + 0x0, 0x0, 0x3, 0xf9, 0x0, 0x0, 0x7f, 0x60, + 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x48, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xae, 0xff, 0xfd, 0xa5, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0xb, 0xff, 0xc6, + 0xbf, 0x57, 0xbf, 0xe0, 0x3, 0xff, 0xa0, 0x9, + 0xf0, 0x0, 0x14, 0x0, 0x6f, 0xf2, 0x0, 0x9f, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, 0x9, 0xf0, + 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x10, 0x9f, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xac, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xd8, 0x30, + 0x0, 0x0, 0x0, 0x27, 0xcf, 0xff, 0xff, 0xc3, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0x9e, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x9, 0xf0, 0x7, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x9f, 0x0, 0xa, 0xff, 0x0, + 0x0, 0x0, 0x9, 0xf0, 0x0, 0x8f, 0xf0, 0x4c, + 0x30, 0x0, 0x9f, 0x0, 0x1e, 0xfd, 0xc, 0xff, + 0xb7, 0x4b, 0xf4, 0x7e, 0xff, 0x50, 0x2c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x3, 0x9d, + 0xef, 0xff, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x1a, 0xef, 0xc5, 0x0, 0x0, 0x0, 0x3, + 0xfc, 0x0, 0x0, 0x1e, 0xfa, 0x9d, 0xf6, 0x0, + 0x0, 0x0, 0xdf, 0x20, 0x0, 0x9, 0xf5, 0x0, + 0xd, 0xf0, 0x0, 0x0, 0x8f, 0x70, 0x0, 0x0, + 0xed, 0x0, 0x0, 0x6f, 0x40, 0x0, 0x4f, 0xb0, + 0x0, 0x0, 0xf, 0xb0, 0x0, 0x4, 0xf6, 0x0, + 0xe, 0xf1, 0x0, 0x0, 0x0, 0xfc, 0x0, 0x0, + 0x5f, 0x50, 0xa, 0xf6, 0x0, 0x0, 0x0, 0xb, + 0xf1, 0x0, 0xa, 0xf1, 0x5, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xd4, 0x38, 0xfa, 0x1, 0xee, + 0x10, 0x1, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfa, + 0x0, 0xbf, 0x40, 0x7e, 0xff, 0xb1, 0x0, 0x0, + 0x4, 0x42, 0x0, 0x6f, 0x90, 0x8f, 0xb6, 0x8f, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0x1f, + 0xc0, 0x0, 0x5f, 0x70, 0x0, 0x0, 0x0, 0xc, + 0xf3, 0x5, 0xf5, 0x0, 0x0, 0xec, 0x0, 0x0, + 0x0, 0x7, 0xf8, 0x0, 0x7f, 0x30, 0x0, 0xc, + 0xe0, 0x0, 0x0, 0x2, 0xfd, 0x0, 0x7, 0xf3, + 0x0, 0x0, 0xce, 0x0, 0x0, 0x0, 0xcf, 0x30, + 0x0, 0x5f, 0x50, 0x0, 0xe, 0xc0, 0x0, 0x0, + 0x8f, 0x70, 0x0, 0x0, 0xfc, 0x0, 0x5, 0xf6, + 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x6, 0xfb, + 0x68, 0xfc, 0x0, 0x0, 0xd, 0xf2, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xe9, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x5c, 0xff, 0xd9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xef, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x4f, 0xf6, 0x0, 0x1c, 0xfa, 0x0, + 0x0, 0x0, 0x8, 0xfc, 0x0, 0x0, 0x5f, 0xc0, + 0x0, 0x0, 0x0, 0x8f, 0xd0, 0x0, 0x7, 0xfb, + 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, 0x4, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xb, 0xff, 0x49, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x9c, + 0xff, 0x40, 0x0, 0x44, 0x0, 0xb, 0xfe, 0x30, + 0xc, 0xff, 0x40, 0xb, 0xf7, 0x6, 0xff, 0x20, + 0x0, 0xb, 0xff, 0x51, 0xff, 0x20, 0xbf, 0xb0, + 0x0, 0x0, 0xa, 0xff, 0xbf, 0xc0, 0xc, 0xfa, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0xaf, + 0xf2, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x70, 0x2, + 0xff, 0xe8, 0x31, 0x25, 0xaf, 0xfd, 0xff, 0x80, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, 0xff, + 0x30, 0x1, 0x7c, 0xef, 0xec, 0x82, 0x0, 0x8, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0027 "'" */ + 0x5f, 0xd5, 0xfc, 0x4f, 0xc4, 0xfb, 0x4f, 0xb3, + 0xfa, 0x3f, 0xa0, 0x10, + + /* U+0028 "(" */ + 0x0, 0xb, 0xfb, 0x0, 0x3f, 0xf3, 0x0, 0xbf, + 0xb0, 0x1, 0xff, 0x50, 0x6, 0xff, 0x0, 0xb, + 0xfb, 0x0, 0xf, 0xf7, 0x0, 0x2f, 0xf4, 0x0, + 0x4f, 0xf2, 0x0, 0x6f, 0xf0, 0x0, 0x7f, 0xf0, + 0x0, 0x8f, 0xe0, 0x0, 0x8f, 0xe0, 0x0, 0x7f, + 0xf0, 0x0, 0x6f, 0xf0, 0x0, 0x4f, 0xf2, 0x0, + 0x2f, 0xf4, 0x0, 0xe, 0xf7, 0x0, 0xb, 0xfb, + 0x0, 0x6, 0xff, 0x0, 0x1, 0xff, 0x50, 0x0, + 0xbf, 0xb0, 0x0, 0x3f, 0xf3, 0x0, 0xb, 0xfb, + + /* U+0029 ")" */ + 0xe, 0xf7, 0x0, 0x0, 0x6f, 0xe1, 0x0, 0x0, + 0xef, 0x80, 0x0, 0x9, 0xfd, 0x0, 0x0, 0x3f, + 0xf3, 0x0, 0x0, 0xef, 0x80, 0x0, 0xb, 0xfb, + 0x0, 0x0, 0x8f, 0xe0, 0x0, 0x5, 0xff, 0x10, + 0x0, 0x4f, 0xf2, 0x0, 0x3, 0xff, 0x30, 0x0, + 0x2f, 0xf4, 0x0, 0x2, 0xff, 0x40, 0x0, 0x3f, + 0xf3, 0x0, 0x4, 0xff, 0x20, 0x0, 0x5f, 0xf1, + 0x0, 0x8, 0xfe, 0x0, 0x0, 0xbf, 0xb0, 0x0, + 0xe, 0xf8, 0x0, 0x3, 0xff, 0x30, 0x0, 0x9f, + 0xd0, 0x0, 0xe, 0xf7, 0x0, 0x6, 0xfe, 0x0, + 0x0, 0xef, 0x70, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x9f, 0x0, 0x0, 0x1, 0x0, 0x9f, + 0x0, 0x0, 0x2f, 0x91, 0x8f, 0x6, 0xe8, 0x2b, + 0xff, 0xdf, 0xcf, 0xe5, 0x0, 0x4d, 0xff, 0xf7, + 0x0, 0x0, 0x8f, 0xff, 0xfb, 0x20, 0x3e, 0xfc, + 0xbf, 0x8f, 0xf8, 0x1d, 0x50, 0x8f, 0x2, 0xb6, + 0x0, 0x0, 0x9f, 0x0, 0x0, 0x0, 0x0, 0x7c, + 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x3, 0x74, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xfa, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x11, 0x11, + 0x9f, 0xa1, 0x11, 0x10, 0x0, 0x0, 0x8, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xa0, 0x0, 0x0, + + /* U+002C "," */ + 0x3, 0x20, 0x6f, 0xf5, 0xbf, 0xfa, 0x6f, 0xf8, + 0xc, 0xf2, 0xf, 0xd0, 0x4f, 0x80, 0x8f, 0x20, + + /* U+002D "-" */ + 0x12, 0x22, 0x22, 0x21, 0x8f, 0xff, 0xff, 0xf7, + 0x8f, 0xff, 0xff, 0xf7, + + /* U+002E "." */ + 0x7, 0x70, 0x9f, 0xf8, 0xbf, 0xf9, 0x4e, 0xd2, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x18, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x60, 0x0, 0x0, 0x0, 0x3, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x8, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0x40, 0x0, 0x0, 0x0, + 0x4, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x1, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x6, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0x70, 0x0, 0x0, 0x0, + 0x2, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xb0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x4a, 0xef, 0xfc, 0x60, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0xbf, 0xfd, 0x85, 0x6b, 0xff, 0xe1, 0x0, + 0x5, 0xff, 0xa0, 0x0, 0x0, 0x5f, 0xfb, 0x0, + 0xe, 0xfd, 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, + 0x3f, 0xf6, 0x0, 0x0, 0x0, 0x1, 0xff, 0x80, + 0x8f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xd0, + 0x9f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf0, + 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf0, + 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf0, + 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf0, + 0x8f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xd0, + 0x3f, 0xf6, 0x0, 0x0, 0x0, 0x1, 0xff, 0x80, + 0xe, 0xfd, 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, + 0x6, 0xff, 0xa0, 0x0, 0x0, 0x5f, 0xfb, 0x0, + 0x0, 0xbf, 0xfd, 0x75, 0x6b, 0xff, 0xe1, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x4a, 0xef, 0xfc, 0x60, 0x0, 0x0, + + /* U+0031 "1" */ + 0xcf, 0xff, 0xff, 0xec, 0xff, 0xff, 0xfe, 0x34, + 0x44, 0xcf, 0xe0, 0x0, 0xb, 0xfe, 0x0, 0x0, + 0xbf, 0xe0, 0x0, 0xb, 0xfe, 0x0, 0x0, 0xbf, + 0xe0, 0x0, 0xb, 0xfe, 0x0, 0x0, 0xbf, 0xe0, + 0x0, 0xb, 0xfe, 0x0, 0x0, 0xbf, 0xe0, 0x0, + 0xb, 0xfe, 0x0, 0x0, 0xbf, 0xe0, 0x0, 0xb, + 0xfe, 0x0, 0x0, 0xbf, 0xe0, 0x0, 0xb, 0xfe, + 0x0, 0x0, 0xbf, 0xe0, 0x0, 0xb, 0xfe, + + /* U+0032 "2" */ + 0x0, 0x5, 0xad, 0xff, 0xea, 0x40, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x5f, + 0xff, 0xb7, 0x56, 0x9f, 0xff, 0x90, 0x0, 0xbd, + 0x20, 0x0, 0x0, 0x1e, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x64, 0x44, 0x44, 0x44, 0x40, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+0033 "3" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x4, 0x44, + 0x44, 0x44, 0x4b, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x6, 0x78, 0xbf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf9, 0x2e, 0x60, 0x0, 0x0, 0x0, 0xaf, + 0xf4, 0xaf, 0xfe, 0xa6, 0x56, 0x8e, 0xff, 0xb0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x28, 0xce, 0xff, 0xda, 0x40, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xe1, 0x0, 0xa, 0xc7, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x30, 0x0, 0xd, 0xfa, 0x0, + 0x0, 0x0, 0x7f, 0xf6, 0x0, 0x0, 0xd, 0xfa, + 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0xd, + 0xfa, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x4, 0x44, 0x44, + 0x44, 0x44, 0x4e, 0xfb, 0x44, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfa, + 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x8f, 0xe4, 0x44, 0x44, 0x44, 0x40, 0x0, 0xa, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x94, + 0x43, 0x10, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xfa, 0x30, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x13, + 0x8f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xd0, 0xd, 0xa2, 0x0, 0x0, 0x0, 0x7f, 0xf8, + 0x5, 0xff, 0xfb, 0x76, 0x67, 0xdf, 0xfe, 0x10, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, + 0x1, 0x6a, 0xdf, 0xfe, 0xb6, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x6, 0xbe, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x7f, 0xff, 0xa6, 0x44, 0x6b, 0xa0, 0x0, 0x3f, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf1, 0x0, + 0x1, 0x10, 0x0, 0x0, 0xa, 0xfe, 0x3, 0xaf, + 0xff, 0xfb, 0x50, 0x0, 0xbf, 0xd6, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0xb, 0xff, 0xff, 0x72, 0x1, + 0x5d, 0xff, 0x80, 0xaf, 0xff, 0x30, 0x0, 0x0, + 0xc, 0xff, 0x9, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x5f, 0xf3, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x41, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5f, + 0xf3, 0x9, 0xff, 0x40, 0x0, 0x0, 0x1d, 0xfd, + 0x0, 0xd, 0xff, 0x94, 0x23, 0x6e, 0xff, 0x50, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x5, 0xae, 0xff, 0xd8, 0x20, 0x0, + + /* U+0037 "7" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3f, + 0xf7, 0x44, 0x44, 0x44, 0x4b, 0xff, 0x33, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xef, 0xb0, 0x3f, 0xf4, + 0x0, 0x0, 0x0, 0x6f, 0xf4, 0x1, 0x77, 0x20, + 0x0, 0x0, 0xd, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0x60, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x4, 0x9d, 0xff, 0xec, 0x82, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xa, + 0xff, 0xc6, 0x32, 0x37, 0xef, 0xf5, 0x0, 0xff, + 0xb0, 0x0, 0x0, 0x1, 0xef, 0xc0, 0x2f, 0xf6, + 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xdf, 0xb0, 0x8, 0xff, 0xa3, + 0x10, 0x15, 0xcf, 0xf3, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x1, 0x9f, 0xff, 0xff, + 0xff, 0xfe, 0x70, 0x0, 0xcf, 0xfa, 0x31, 0x2, + 0x5c, 0xff, 0x80, 0x6f, 0xf6, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x2b, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf7, 0xdf, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x8b, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf7, 0x6f, 0xf8, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x20, 0xdf, 0xfc, 0x53, 0x23, 0x7e, 0xff, 0x90, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x49, 0xde, 0xfe, 0xc8, 0x20, 0x0, + + /* U+0039 "9" */ + 0x0, 0x1, 0x8c, 0xef, 0xea, 0x50, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x4, + 0xff, 0xe7, 0x32, 0x49, 0xff, 0xd0, 0x0, 0xcf, + 0xd1, 0x0, 0x0, 0x3, 0xff, 0x90, 0x1f, 0xf6, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x13, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x7f, 0xf6, 0x2f, 0xf6, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x90, 0xef, 0xd1, 0x0, + 0x0, 0x3, 0xff, 0xfb, 0x6, 0xff, 0xe7, 0x32, + 0x39, 0xff, 0xff, 0xc0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x6d, 0xfc, 0x0, 0x3, 0x9d, 0xff, 0xd9, + 0x20, 0xef, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xf4, + 0x0, 0x9, 0xb6, 0x54, 0x5a, 0xff, 0xf8, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x5, 0xad, 0xff, 0xeb, 0x71, 0x0, 0x0, + + /* U+003A ":" */ + 0x3e, 0xd3, 0xbf, 0xfa, 0x9f, 0xf7, 0x7, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x70, 0x9f, 0xf8, + 0xbf, 0xf9, 0x4e, 0xd2, + + /* U+003B ";" */ + 0x3e, 0xd3, 0xbf, 0xfa, 0x9f, 0xf7, 0x7, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, 0x6f, 0xf5, + 0xbf, 0xfa, 0x6f, 0xf8, 0xc, 0xf2, 0xf, 0xd0, + 0x4f, 0x80, 0x8f, 0x20, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0x50, 0x0, + 0x0, 0x0, 0x5, 0xcf, 0xf6, 0x0, 0x0, 0x2, + 0x9e, 0xff, 0xf9, 0x20, 0x0, 0x6c, 0xff, 0xfc, + 0x60, 0x0, 0x19, 0xff, 0xfe, 0x82, 0x0, 0x0, + 0x4, 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, + 0xfd, 0x71, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xfb, 0x40, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, + + /* U+003D "=" */ + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, + + /* U+003E ">" */ + 0x39, 0x30, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xd6, 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xfd, + 0x61, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xfa, + 0x20, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xf6, 0x0, + 0x0, 0x0, 0x3, 0x9e, 0xff, 0x60, 0x0, 0x1, + 0x6c, 0xff, 0xfb, 0x50, 0x0, 0x4a, 0xff, 0xfe, + 0x81, 0x0, 0x2, 0xdf, 0xff, 0xb4, 0x0, 0x0, + 0x0, 0x4f, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x2, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x6, 0xbd, 0xff, 0xea, 0x50, 0x0, 0x5, + 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x5f, 0xff, + 0x95, 0x34, 0x7e, 0xff, 0x90, 0x2c, 0xc1, 0x0, + 0x0, 0x1, 0xef, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0x60, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xff, 0xdb, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xfe, 0xcb, 0xce, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x51, 0x0, 0x0, + 0x1, 0x5b, 0xff, 0x70, 0x0, 0x0, 0x0, 0x9f, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, + 0xa0, 0x0, 0x0, 0x7f, 0xd1, 0x0, 0x17, 0xcf, + 0xfc, 0x70, 0x4f, 0xf1, 0xcf, 0x70, 0x0, 0x2f, + 0xf2, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xd6, 0xff, + 0x1, 0xef, 0x20, 0xa, 0xf6, 0x0, 0x1e, 0xfe, + 0x61, 0x3, 0x9f, 0xff, 0xf0, 0x4, 0xfa, 0x1, + 0xfe, 0x0, 0xa, 0xfe, 0x20, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0xc, 0xf1, 0x6f, 0x80, 0x0, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xcf, 0xf0, 0x0, 0x7f, + 0x59, 0xf5, 0x0, 0x4f, 0xf1, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x0, 0x4, 0xf8, 0xbf, 0x30, 0x5, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf0, 0x0, + 0x2f, 0x9b, 0xf2, 0x0, 0x5f, 0xe0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x0, 0x2, 0xf9, 0xbf, 0x30, + 0x4, 0xff, 0x10, 0x0, 0x0, 0x0, 0x6f, 0xf0, + 0x0, 0x3f, 0x89, 0xf5, 0x0, 0xf, 0xf6, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x0, 0x5, 0xf6, 0x6f, + 0x90, 0x0, 0x9f, 0xe2, 0x0, 0x0, 0x6, 0xff, + 0xf0, 0x0, 0xaf, 0x21, 0xfe, 0x0, 0x1, 0xef, + 0xe6, 0x10, 0x29, 0xfd, 0xff, 0x70, 0x6f, 0xc0, + 0xa, 0xf6, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xfd, + 0x2b, 0xff, 0xff, 0xf2, 0x0, 0x2f, 0xf2, 0x0, + 0x0, 0x7c, 0xff, 0xc7, 0x0, 0x1a, 0xef, 0xb2, + 0x0, 0x0, 0x7f, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x61, 0x0, + 0x0, 0x2, 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2b, 0xff, 0xfe, 0xcc, 0xce, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, + 0xdf, 0xff, 0xda, 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xef, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf2, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf9, 0x9, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x10, 0x2f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xa0, 0x0, 0xaf, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf2, 0x0, 0x3, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfb, + 0x0, 0x0, 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0x40, 0x0, 0x0, 0x4f, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xc0, 0x0, 0x0, 0x0, + 0xcf, 0x90, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xef, 0x81, 0x11, 0x11, 0x11, 0x11, + 0x8f, 0xf0, 0x0, 0x0, 0x6f, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0x70, 0x0, 0xd, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfe, 0x0, + 0x5, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xd0, + + /* U+0042 "B" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x60, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x4f, 0xf6, 0x22, 0x22, 0x23, 0x5c, 0xff, + 0xd0, 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x30, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf6, 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x4, 0xff, 0x50, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf1, 0x4, 0xff, 0x62, 0x22, 0x22, + 0x35, 0xcf, 0xf7, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x14, 0xbf, 0xf8, 0x4, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x44, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf5, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x24, + 0xff, 0x62, 0x22, 0x22, 0x23, 0x6c, 0xff, 0xb0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x50, + 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0xa5, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x50, 0x0, 0x1c, 0xff, 0xfc, 0x76, 0x57, 0xcf, + 0xff, 0x60, 0xc, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x3d, 0xe2, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x1, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0xcf, 0xfc, 0x20, 0x0, 0x0, 0x3, 0xde, 0x30, + 0x1, 0xcf, 0xff, 0xc7, 0x65, 0x7c, 0xff, 0xf6, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xda, 0x50, + 0x0, + + /* U+0044 "D" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xc9, 0x40, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd4, 0x0, 0x0, 0x4f, 0xf8, 0x44, 0x44, 0x46, + 0x9e, 0xff, 0xf7, 0x0, 0x4, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf6, 0x0, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x4, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x90, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfe, 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf1, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x34, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf3, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x14, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xe0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf9, 0x4, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0x10, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0xff, 0x60, 0x4, 0xff, + 0x84, 0x44, 0x44, 0x68, 0xef, 0xff, 0x70, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x94, + 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x4f, 0xf8, + 0x44, 0x44, 0x44, 0x44, 0x42, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf7, 0x33, 0x33, 0x33, 0x33, 0x10, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf8, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+0046 "F" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x4f, 0xf8, + 0x44, 0x44, 0x44, 0x44, 0x42, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, 0xf7, + 0x44, 0x44, 0x44, 0x44, 0x10, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0xb6, 0x10, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x70, 0x0, 0x1c, 0xff, 0xfc, 0x86, 0x57, 0xbf, + 0xff, 0x90, 0xc, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x1a, 0xf4, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x1, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x1b, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xfd, 0x9f, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd6, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xfd, 0x1f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x8f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfd, 0x0, + 0xcf, 0xfc, 0x20, 0x0, 0x0, 0x1, 0xcf, 0xd0, + 0x1, 0xcf, 0xff, 0xc8, 0x65, 0x7a, 0xff, 0xfc, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xeb, 0x71, + 0x0, + + /* U+0048 "H" */ + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x64, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf6, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x64, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xf6, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x64, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xf6, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x64, 0xff, 0x84, 0x44, 0x44, + 0x44, 0x44, 0x6f, 0xf6, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x64, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x64, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x64, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x64, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x64, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf6, + + /* U+0049 "I" */ + 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, + 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, + 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, + 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, + 0x4f, 0xf5, 0x4f, 0xf5, + + /* U+004A "J" */ + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x14, 0x44, 0x44, + 0x4d, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x0, 0x10, + 0x0, 0x0, 0xf, 0xfa, 0x7, 0xe2, 0x0, 0x0, + 0x6f, 0xf6, 0xe, 0xff, 0x95, 0x59, 0xff, 0xf1, + 0x3, 0xef, 0xff, 0xff, 0xff, 0x40, 0x0, 0x17, + 0xcf, 0xfd, 0x92, 0x0, + + /* U+004B "K" */ + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfa, + 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, 0x4f, 0xfb, + 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x4f, 0xfb, + 0x0, 0x4, 0xff, 0x50, 0x0, 0x0, 0x4f, 0xfc, + 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x4f, 0xfc, + 0x0, 0x0, 0x4, 0xff, 0x50, 0x0, 0x3f, 0xfd, + 0x10, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x3f, 0xfd, + 0x10, 0x0, 0x0, 0x4, 0xff, 0x50, 0x3f, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x3f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x8e, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, + 0x3c, 0xff, 0x60, 0x0, 0x0, 0x4, 0xff, 0xfe, + 0x30, 0x1e, 0xff, 0x40, 0x0, 0x0, 0x4f, 0xff, + 0x30, 0x0, 0x2f, 0xfe, 0x20, 0x0, 0x4, 0xff, + 0x60, 0x0, 0x0, 0x4f, 0xfd, 0x10, 0x0, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x4, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x8f, 0xf9, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf6, + 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf4, + + /* U+004C "L" */ + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf8, 0x44, 0x44, 0x44, 0x44, 0x40, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + + /* U+004D "M" */ + 0x4f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0x14, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf1, 0x4f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x14, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf1, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x14, 0xff, 0xaf, 0xf2, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xaf, 0xf1, 0x4f, + 0xf3, 0xdf, 0xc0, 0x0, 0x0, 0x0, 0xdf, 0x96, + 0xff, 0x14, 0xff, 0x34, 0xff, 0x50, 0x0, 0x0, + 0x8f, 0xe1, 0x6f, 0xf1, 0x4f, 0xf3, 0xa, 0xfe, + 0x0, 0x0, 0x2f, 0xf6, 0x6, 0xff, 0x14, 0xff, + 0x30, 0x1f, 0xf8, 0x0, 0xa, 0xfc, 0x0, 0x6f, + 0xf1, 0x4f, 0xf3, 0x0, 0x6f, 0xf2, 0x4, 0xff, + 0x30, 0x6, 0xff, 0x14, 0xff, 0x30, 0x0, 0xdf, + 0xc0, 0xdf, 0x90, 0x0, 0x6f, 0xf1, 0x4f, 0xf3, + 0x0, 0x3, 0xff, 0xbf, 0xe1, 0x0, 0x6, 0xff, + 0x14, 0xff, 0x30, 0x0, 0x9, 0xff, 0xf6, 0x0, + 0x0, 0x6f, 0xf1, 0x4f, 0xf3, 0x0, 0x0, 0x1e, + 0xfc, 0x0, 0x0, 0x6, 0xff, 0x14, 0xff, 0x30, + 0x0, 0x0, 0x6d, 0x30, 0x0, 0x0, 0x6f, 0xf1, + 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0x14, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf1, + + /* U+004E "N" */ + 0x4f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x64, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf6, 0x4f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x64, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x3f, 0xf6, 0x4f, 0xfe, 0xff, 0x80, 0x0, 0x0, + 0x3, 0xff, 0x64, 0xff, 0x6d, 0xff, 0x50, 0x0, + 0x0, 0x3f, 0xf6, 0x4f, 0xf5, 0x2f, 0xff, 0x20, + 0x0, 0x3, 0xff, 0x64, 0xff, 0x50, 0x4f, 0xfe, + 0x10, 0x0, 0x3f, 0xf6, 0x4f, 0xf5, 0x0, 0x7f, + 0xfc, 0x0, 0x3, 0xff, 0x64, 0xff, 0x50, 0x0, + 0xaf, 0xf9, 0x0, 0x3f, 0xf6, 0x4f, 0xf5, 0x0, + 0x0, 0xdf, 0xf6, 0x3, 0xff, 0x64, 0xff, 0x50, + 0x0, 0x1, 0xef, 0xf3, 0x3f, 0xf6, 0x4f, 0xf5, + 0x0, 0x0, 0x3, 0xff, 0xe5, 0xff, 0x64, 0xff, + 0x50, 0x0, 0x0, 0x6, 0xff, 0xef, 0xf6, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x64, + 0xff, 0x50, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0x64, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf6, + + /* U+004F "O" */ + 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfe, 0xb6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xfc, + 0x76, 0x68, 0xcf, 0xff, 0xa0, 0x0, 0x0, 0xbf, + 0xfc, 0x20, 0x0, 0x0, 0x3, 0xdf, 0xf9, 0x0, + 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x60, 0x1f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xe0, 0x6f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x9f, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf7, + 0xbf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf8, 0xbf, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf9, 0x9f, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x6f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, + 0x1f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xe0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0x60, 0x0, 0xcf, 0xfc, 0x20, + 0x0, 0x0, 0x3, 0xdf, 0xfa, 0x0, 0x0, 0x1c, + 0xff, 0xfb, 0x76, 0x68, 0xcf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfe, + 0xb6, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0x4f, 0xff, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x4f, 0xf8, 0x44, 0x44, 0x57, 0xbf, 0xff, 0x30, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x5, 0xff, 0xd0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf4, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x1, 0xef, 0xe0, + 0x4f, 0xf5, 0x0, 0x0, 0x2, 0x7e, 0xff, 0x60, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, 0x0, + 0x4f, 0xf8, 0x44, 0x44, 0x32, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfe, 0xb6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xfc, 0x76, 0x68, 0xcf, 0xff, 0xa0, 0x0, 0x0, + 0xb, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0x90, 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0x50, 0x1, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, 0x0, 0x6f, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf3, 0x9, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x70, 0xbf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf8, 0xb, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0x80, 0xaf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xf6, 0x6, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, 0x1f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xd0, + 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf6, 0x0, 0x0, 0xdf, 0xfb, 0x10, 0x0, + 0x0, 0x2, 0xcf, 0xfb, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xa6, 0x45, 0x6b, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xdf, 0xff, + 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xe2, 0x0, 0x0, 0x38, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x22, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7c, 0xfe, 0xb5, 0x0, + + /* U+0052 "R" */ + 0x4f, 0xff, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x4f, 0xf8, 0x44, 0x44, 0x57, 0xbf, 0xff, 0x30, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x5, 0xff, 0xd0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf4, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x1, 0xef, 0xe0, + 0x4f, 0xf5, 0x0, 0x0, 0x2, 0x7e, 0xff, 0x60, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x4f, 0xf7, 0x33, 0x33, 0x3c, 0xfe, 0x10, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x2, 0xff, 0xa0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x7f, 0xf5, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0xc, 0xfe, 0x10, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x2, 0xff, 0xb0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf6, + + /* U+0053 "S" */ + 0x0, 0x3, 0x9d, 0xef, 0xec, 0x94, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0xa, + 0xff, 0xc7, 0x43, 0x47, 0xbf, 0xe0, 0x3, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x25, 0x0, 0x6f, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x94, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xc8, 0x30, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xff, + 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7c, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf0, 0x5d, 0x40, 0x0, 0x0, 0x0, 0x1e, 0xfc, + 0xc, 0xff, 0xd9, 0x54, 0x35, 0x8e, 0xff, 0x40, + 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x2, 0x7b, 0xef, 0xfe, 0xb7, 0x10, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x44, 0x44, 0x44, 0xcf, 0xf4, 0x44, 0x44, 0x40, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfd, + 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfb, + 0xe, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf6, + 0x7, 0xff, 0xb0, 0x0, 0x0, 0x3, 0xff, 0xe0, + 0x0, 0xcf, 0xfe, 0x96, 0x57, 0xbf, 0xff, 0x50, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x39, 0xdf, 0xfe, 0xc7, 0x10, 0x0, + + /* U+0056 "V" */ + 0xc, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf4, 0x5, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xd0, 0x0, 0xef, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x60, 0x0, 0x7f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, + 0x0, 0x1f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf8, 0x0, 0x0, 0x9, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x2, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xef, 0xa0, 0x0, 0x0, 0x0, + 0xbf, 0xf1, 0x0, 0x0, 0x6, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x3f, 0xf8, 0x0, 0x0, 0xd, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, + 0x5f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x60, 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xd0, 0x3, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf5, 0xa, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, 0x1f, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xbf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfc, + 0x0, 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x3, 0xff, 0x40, 0xaf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xe0, 0x5, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xe, 0xf9, 0x0, 0xf, 0xfb, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, 0x0, 0x3, + 0xff, 0x40, 0x0, 0xaf, 0xf0, 0x0, 0x0, 0x0, + 0xff, 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x9f, 0xe0, + 0x0, 0x4, 0xff, 0x50, 0x0, 0x0, 0x6f, 0xf0, + 0xbf, 0xc0, 0x0, 0x0, 0xe, 0xf9, 0x0, 0x0, + 0xf, 0xfb, 0x0, 0x0, 0xb, 0xfa, 0x5, 0xff, + 0x20, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, 0xaf, + 0xf0, 0x0, 0x1, 0xff, 0x50, 0xf, 0xf7, 0x0, + 0x0, 0x9f, 0xe0, 0x0, 0x0, 0x4, 0xff, 0x50, + 0x0, 0x6f, 0xf0, 0x0, 0xaf, 0xd0, 0x0, 0xe, + 0xf9, 0x0, 0x0, 0x0, 0xe, 0xfb, 0x0, 0xc, + 0xfa, 0x0, 0x5, 0xff, 0x20, 0x4, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x2, 0xff, 0x40, + 0x0, 0xf, 0xf8, 0x0, 0x9f, 0xe0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x50, 0x7f, 0xe0, 0x0, 0x0, + 0x9f, 0xd0, 0xe, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xfb, 0xd, 0xf9, 0x0, 0x0, 0x4, 0xff, + 0x34, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf4, 0xff, 0x40, 0x0, 0x0, 0xe, 0xf8, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xdf, + 0xe0, 0x0, 0x0, 0x0, 0x9f, 0xef, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf8, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x50, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x3f, + 0xf9, 0x0, 0x0, 0x6f, 0xf8, 0x0, 0x0, 0x1, + 0xef, 0xc0, 0x0, 0x0, 0xa, 0xff, 0x40, 0x0, + 0xb, 0xff, 0x20, 0x0, 0x0, 0x1, 0xef, 0xe1, + 0x0, 0x6f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfc, 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x8d, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xdf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, 0x19, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf4, + 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x90, 0x0, 0x2f, 0xfc, 0x0, 0x0, 0x0, 0x2f, + 0xfd, 0x0, 0x0, 0x6, 0xff, 0x90, 0x0, 0x0, + 0xcf, 0xf2, 0x0, 0x0, 0x0, 0xaf, 0xf4, 0x0, + 0x8, 0xff, 0x60, 0x0, 0x0, 0x0, 0xd, 0xfe, + 0x10, 0x4f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xc0, + + /* U+0059 "Y" */ + 0xc, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xf9, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xe1, 0x0, 0x9f, 0xf3, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x60, 0x0, 0xe, 0xfc, 0x0, 0x0, + 0x0, 0xc, 0xfc, 0x0, 0x0, 0x5, 0xff, 0x60, + 0x0, 0x0, 0x6f, 0xf2, 0x0, 0x0, 0x0, 0xbf, + 0xf1, 0x0, 0x1, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x2f, 0xfa, 0x0, 0xa, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x40, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xd1, 0xdf, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfd, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xb0, 0x0, + 0x0, 0x0, + + /* U+005A "Z" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x34, 0x44, 0x44, 0x44, 0x44, 0x4c, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xfe, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + + /* U+005B "[" */ + 0x4f, 0xff, 0xff, 0x24, 0xff, 0xff, 0xf2, 0x4f, + 0xf4, 0x11, 0x4, 0xff, 0x30, 0x0, 0x4f, 0xf3, + 0x0, 0x4, 0xff, 0x30, 0x0, 0x4f, 0xf3, 0x0, + 0x4, 0xff, 0x30, 0x0, 0x4f, 0xf3, 0x0, 0x4, + 0xff, 0x30, 0x0, 0x4f, 0xf3, 0x0, 0x4, 0xff, + 0x30, 0x0, 0x4f, 0xf3, 0x0, 0x4, 0xff, 0x30, + 0x0, 0x4f, 0xf3, 0x0, 0x4, 0xff, 0x30, 0x0, + 0x4f, 0xf3, 0x0, 0x4, 0xff, 0x30, 0x0, 0x4f, + 0xf3, 0x0, 0x4, 0xff, 0x30, 0x0, 0x4f, 0xf3, + 0x0, 0x4, 0xff, 0x41, 0x10, 0x4f, 0xff, 0xff, + 0x24, 0xff, 0xff, 0xf2, + + /* U+005C "\\" */ + 0x78, 0x20, 0x0, 0x0, 0x0, 0xa, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0x50, 0x0, 0x0, 0x0, 0x9, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0x60, 0x0, 0x0, 0x0, 0x8, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0x60, 0x0, 0x0, 0x0, + 0x7, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0x70, 0x0, 0x0, + 0x0, 0x6, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, + 0x0, 0x0, 0x6, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x90, + 0x0, 0x0, 0x0, 0x5, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xa0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xa0, + + /* U+005D "]" */ + 0x8f, 0xff, 0xfe, 0x8f, 0xff, 0xfe, 0x1, 0x19, + 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, + 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, + 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, + 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, + 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, + 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, + 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x1, + 0x19, 0xfe, 0x8f, 0xff, 0xfe, 0x8f, 0xff, 0xfe, + + /* U+005E "^" */ + 0x0, 0x0, 0xa, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xaf, 0xa0, 0x0, 0x0, 0x0, 0xe, 0xf0, 0xdf, + 0x10, 0x0, 0x0, 0x5, 0xf9, 0x6, 0xf7, 0x0, + 0x0, 0x0, 0xcf, 0x30, 0x1f, 0xe0, 0x0, 0x0, + 0x2f, 0xc0, 0x0, 0x9f, 0x50, 0x0, 0x9, 0xf6, + 0x0, 0x3, 0xfb, 0x0, 0x0, 0xfe, 0x0, 0x0, + 0xc, 0xf2, 0x0, 0x6f, 0x90, 0x0, 0x0, 0x6f, + 0x90, 0xd, 0xf2, 0x0, 0x0, 0x0, 0xff, 0x0, + + /* U+005F "_" */ + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x58, 0x83, 0x0, 0x0, 0xaf, 0xf4, 0x0, 0x0, + 0x7f, 0xf4, 0x0, 0x0, 0x4e, 0xf4, + + /* U+0061 "a" */ + 0x0, 0x39, 0xdf, 0xfe, 0xb6, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0xe, 0xfa, 0x63, + 0x36, 0xdf, 0xf8, 0x0, 0x42, 0x0, 0x0, 0x0, + 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf4, 0x0, + 0x6b, 0xef, 0xff, 0xff, 0xff, 0x40, 0xbf, 0xff, + 0xdd, 0xdd, 0xdf, 0xf4, 0x6f, 0xf7, 0x0, 0x0, + 0x3, 0xff, 0x4a, 0xfd, 0x0, 0x0, 0x0, 0x3f, + 0xf4, 0xaf, 0xe0, 0x0, 0x0, 0xa, 0xff, 0x45, + 0xff, 0x80, 0x0, 0x1a, 0xff, 0xf4, 0xa, 0xff, + 0xfd, 0xdf, 0xfa, 0xff, 0x40, 0x6, 0xcf, 0xfe, + 0xb5, 0x1f, 0xf4, + + /* U+0062 "b" */ + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfd, 0x2, + 0x9e, 0xfe, 0xc6, 0x0, 0x0, 0xaf, 0xd6, 0xff, + 0xff, 0xff, 0xfd, 0x30, 0xa, 0xff, 0xff, 0xa5, + 0x35, 0xaf, 0xff, 0x20, 0xaf, 0xff, 0x40, 0x0, + 0x0, 0x5f, 0xfc, 0xa, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x8f, 0xf3, 0xaf, 0xf1, 0x0, 0x0, 0x0, + 0x1, 0xff, 0x7a, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xf9, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x9a, 0xff, 0x10, 0x0, 0x0, 0x0, 0x1f, + 0xf7, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x3a, 0xff, 0xf4, 0x0, 0x0, 0x5, 0xff, 0xc0, + 0xaf, 0xff, 0xfa, 0x53, 0x5a, 0xff, 0xf2, 0xa, + 0xfc, 0x6f, 0xff, 0xff, 0xff, 0xd3, 0x0, 0xaf, + 0xc0, 0x39, 0xef, 0xec, 0x60, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x1, 0x7c, 0xef, 0xea, 0x50, 0x0, 0x4, + 0xef, 0xff, 0xff, 0xff, 0xb0, 0x4, 0xff, 0xf9, + 0x43, 0x5b, 0xff, 0xa1, 0xef, 0xe2, 0x0, 0x0, + 0x7, 0xd3, 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xfe, 0x20, 0x0, 0x0, 0x7d, 0x40, + 0x4f, 0xff, 0x94, 0x35, 0xbf, 0xfa, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x17, 0xce, + 0xfe, 0xa4, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, 0x0, 0x18, + 0xde, 0xfd, 0x81, 0x2f, 0xf5, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xe5, 0xff, 0x50, 0x5f, 0xff, 0x84, + 0x36, 0xcf, 0xff, 0xf5, 0x1f, 0xfe, 0x20, 0x0, + 0x0, 0x8f, 0xff, 0x57, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xcf, 0xf5, 0xbf, 0xd0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0x5d, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf5, 0xdf, 0xa0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x5b, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xf5, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x51, 0xff, 0xd1, 0x0, 0x0, 0x6, 0xff, 0xf5, + 0x5, 0xff, 0xe6, 0x21, 0x3a, 0xff, 0xff, 0x50, + 0x6, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xf5, 0x0, + 0x2, 0x8d, 0xff, 0xd8, 0x10, 0xff, 0x50, + + /* U+0065 "e" */ + 0x0, 0x2, 0x8d, 0xff, 0xd8, 0x10, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x5, 0xff, + 0xd5, 0x22, 0x5d, 0xff, 0x40, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0xbf, 0xe0, 0x7f, 0xf1, 0x0, 0x0, + 0x0, 0x1f, 0xf5, 0xbf, 0xb0, 0x0, 0x0, 0x0, + 0xa, 0xfa, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xdf, 0xed, 0xdd, 0xdd, 0xdd, 0xdd, 0xda, + 0xbf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xfd, + 0x20, 0x0, 0x0, 0x19, 0x0, 0x4, 0xff, 0xf9, + 0x43, 0x48, 0xef, 0xa0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x1, 0x6c, 0xef, 0xeb, + 0x60, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x5c, 0xff, 0xd7, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xc0, 0x0, 0xf, 0xfc, 0x31, 0x43, + 0x0, 0x3, 0xff, 0x40, 0x0, 0x0, 0x0, 0x4f, + 0xf2, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x9f, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x14, + 0xff, 0x41, 0x11, 0x0, 0x0, 0x4f, 0xf3, 0x0, + 0x0, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, + 0x4, 0xff, 0x30, 0x0, 0x0, 0x0, 0x4f, 0xf3, + 0x0, 0x0, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, + 0x0, + + /* U+0067 "g" */ + 0x0, 0x2, 0x8d, 0xef, 0xd9, 0x20, 0xdf, 0x80, + 0x7, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xf8, 0x7, + 0xff, 0xe8, 0x43, 0x49, 0xff, 0xff, 0x82, 0xff, + 0xc1, 0x0, 0x0, 0x3, 0xff, 0xf8, 0x8f, 0xf2, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x8c, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf8, 0xef, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0x8c, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf8, 0x9f, 0xf1, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x83, 0xff, 0xb0, 0x0, 0x0, + 0x2, 0xef, 0xf8, 0x9, 0xff, 0xd5, 0x10, 0x27, + 0xef, 0xff, 0x80, 0xa, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xf8, 0x0, 0x5, 0xbf, 0xff, 0xfc, 0x40, + 0xff, 0x80, 0x0, 0x0, 0x2, 0x20, 0x0, 0x1f, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x30, 0x4a, 0x10, 0x0, 0x0, 0x1, 0xef, 0xe0, + 0xe, 0xff, 0xa6, 0x43, 0x48, 0xef, 0xf5, 0x0, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x5, 0xad, 0xff, 0xec, 0x82, 0x0, 0x0, + + /* U+0068 "h" */ + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x3a, 0xef, 0xfc, + 0x60, 0x0, 0xaf, 0xd8, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0xaf, 0xff, 0xf8, 0x54, 0x6d, 0xff, 0x90, + 0xaf, 0xfe, 0x20, 0x0, 0x0, 0xdf, 0xf1, 0xaf, + 0xf5, 0x0, 0x0, 0x0, 0x5f, 0xf4, 0xaf, 0xf0, + 0x0, 0x0, 0x0, 0x2f, 0xf6, 0xaf, 0xe0, 0x0, + 0x0, 0x0, 0xf, 0xf6, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0xf, 0xf7, 0xaf, 0xd0, 0x0, 0x0, 0x0, + 0xf, 0xf7, 0xaf, 0xd0, 0x0, 0x0, 0x0, 0xf, + 0xf7, 0xaf, 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, 0xaf, 0xd0, + 0x0, 0x0, 0x0, 0xf, 0xf7, + + /* U+0069 "i" */ + 0x8, 0xfb, 0x0, 0xff, 0xf3, 0xc, 0xfe, 0x10, + 0x3, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0xa, + 0xfd, 0x0, 0xaf, 0xd0, 0xa, 0xfd, 0x0, 0xaf, + 0xd0, 0xa, 0xfd, 0x0, 0xaf, 0xd0, 0xa, 0xfd, + 0x0, 0xaf, 0xd0, 0xa, 0xfd, 0x0, 0xaf, 0xd0, + 0xa, 0xfd, 0x0, 0xaf, 0xd0, 0xa, 0xfd, 0x0, + + /* U+006A "j" */ + 0x0, 0x0, 0x6, 0xfc, 0x10, 0x0, 0x0, 0xef, + 0xf6, 0x0, 0x0, 0xa, 0xff, 0x20, 0x0, 0x0, + 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x8, 0xff, 0x0, + 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x8, + 0xff, 0x0, 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, + 0x8, 0xff, 0x0, 0x0, 0x0, 0x8f, 0xf0, 0x0, + 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, 0x8f, 0xf0, + 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, 0x8f, + 0xf0, 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, + 0x8f, 0xf0, 0x0, 0x0, 0xa, 0xfe, 0x0, 0x74, + 0x26, 0xff, 0x90, 0x2f, 0xff, 0xff, 0xe1, 0x1, + 0xad, 0xfe, 0xa2, 0x0, + + /* U+006B "k" */ + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, 0x3, + 0xef, 0xd1, 0xaf, 0xd0, 0x0, 0x0, 0x4f, 0xfc, + 0x10, 0xaf, 0xd0, 0x0, 0x5, 0xff, 0xc1, 0x0, + 0xaf, 0xd0, 0x0, 0x6f, 0xfc, 0x10, 0x0, 0xaf, + 0xd0, 0x7, 0xff, 0xc1, 0x0, 0x0, 0xaf, 0xd0, + 0x8f, 0xfd, 0x10, 0x0, 0x0, 0xaf, 0xd9, 0xff, + 0xff, 0x20, 0x0, 0x0, 0xaf, 0xff, 0xfc, 0xff, + 0xd1, 0x0, 0x0, 0xaf, 0xff, 0xa0, 0x7f, 0xfb, + 0x0, 0x0, 0xaf, 0xf9, 0x0, 0xa, 0xff, 0x70, + 0x0, 0xaf, 0xd0, 0x0, 0x0, 0xdf, 0xf4, 0x0, + 0xaf, 0xd0, 0x0, 0x0, 0x2f, 0xfe, 0x10, 0xaf, + 0xd0, 0x0, 0x0, 0x4, 0xff, 0xc0, 0xaf, 0xd0, + 0x0, 0x0, 0x0, 0x8f, 0xf9, + + /* U+006C "l" */ + 0xaf, 0xda, 0xfd, 0xaf, 0xda, 0xfd, 0xaf, 0xda, + 0xfd, 0xaf, 0xda, 0xfd, 0xaf, 0xda, 0xfd, 0xaf, + 0xda, 0xfd, 0xaf, 0xda, 0xfd, 0xaf, 0xda, 0xfd, + 0xaf, 0xda, 0xfd, 0xaf, 0xd0, + + /* U+006D "m" */ + 0xaf, 0xc0, 0x5b, 0xef, 0xea, 0x40, 0x0, 0x5a, + 0xef, 0xeb, 0x50, 0x0, 0xaf, 0xca, 0xff, 0xff, + 0xff, 0xf8, 0xb, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xaf, 0xff, 0xd6, 0x22, 0x6e, 0xff, 0xdf, 0xe7, + 0x32, 0x5d, 0xff, 0x60, 0xaf, 0xfd, 0x0, 0x0, + 0x2, 0xff, 0xfe, 0x20, 0x0, 0x0, 0xef, 0xd0, + 0xaf, 0xf4, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, + 0x0, 0x0, 0x7f, 0xf1, 0xaf, 0xf0, 0x0, 0x0, + 0x0, 0x7f, 0xf2, 0x0, 0x0, 0x0, 0x4f, 0xf3, + 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x7f, 0xf1, 0x0, + 0x0, 0x0, 0x4f, 0xf3, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, + 0x0, 0x0, 0x4f, 0xf4, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, + 0x0, 0x0, 0x4f, 0xf4, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, + 0x0, 0x0, 0x4f, 0xf4, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + + /* U+006E "n" */ + 0xaf, 0xc0, 0x4a, 0xef, 0xfc, 0x60, 0x0, 0xaf, + 0xc9, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xaf, 0xff, + 0xe6, 0x32, 0x4c, 0xff, 0x90, 0xaf, 0xfd, 0x10, + 0x0, 0x0, 0xcf, 0xf1, 0xaf, 0xf4, 0x0, 0x0, + 0x0, 0x4f, 0xf4, 0xaf, 0xf0, 0x0, 0x0, 0x0, + 0x1f, 0xf6, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0xf, + 0xf6, 0xaf, 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, 0xaf, 0xd0, + 0x0, 0x0, 0x0, 0xf, 0xf7, 0xaf, 0xd0, 0x0, + 0x0, 0x0, 0xf, 0xf7, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0xf, 0xf7, 0xaf, 0xd0, 0x0, 0x0, 0x0, + 0xf, 0xf7, + + /* U+006F "o" */ + 0x0, 0x1, 0x7c, 0xef, 0xda, 0x40, 0x0, 0x0, + 0x5, 0xef, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x4, + 0xff, 0xf8, 0x43, 0x5c, 0xff, 0xc0, 0x1, 0xff, + 0xe2, 0x0, 0x0, 0x8, 0xff, 0x80, 0x7f, 0xf4, + 0x0, 0x0, 0x0, 0xb, 0xfe, 0xb, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf3, 0xdf, 0xa0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x5d, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xf5, 0xbf, 0xd0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x37, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xbf, 0xe0, 0x1e, 0xfe, 0x20, 0x0, 0x0, + 0x8f, 0xf8, 0x0, 0x4f, 0xff, 0x84, 0x36, 0xcf, + 0xfc, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0x17, 0xce, 0xfd, 0xa4, 0x0, + 0x0, + + /* U+0070 "p" */ + 0xaf, 0xc0, 0x3a, 0xef, 0xec, 0x60, 0x0, 0xa, + 0xfc, 0x8f, 0xff, 0xff, 0xff, 0xd3, 0x0, 0xaf, + 0xff, 0xf8, 0x31, 0x38, 0xff, 0xf2, 0xa, 0xff, + 0xf3, 0x0, 0x0, 0x3, 0xff, 0xc0, 0xaf, 0xf6, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x3a, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf7, 0xaf, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0x9a, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf9, 0xaf, 0xf1, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x7a, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x8f, 0xf3, 0xaf, 0xff, 0x40, 0x0, 0x0, + 0x5f, 0xfc, 0xa, 0xff, 0xff, 0xa5, 0x35, 0xaf, + 0xff, 0x20, 0xaf, 0xd6, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0xa, 0xfd, 0x2, 0x9d, 0xfe, 0xc6, 0x0, + 0x0, 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x1, 0x8d, 0xef, 0xd8, 0x10, 0xff, 0x50, + 0x6, 0xff, 0xff, 0xff, 0xfe, 0x4f, 0xf5, 0x5, + 0xff, 0xf8, 0x43, 0x6c, 0xff, 0xff, 0x51, 0xff, + 0xe2, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x7f, 0xf4, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x5b, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf5, 0xdf, 0xa0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x5d, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xf5, 0xbf, 0xd0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x57, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xbf, 0xf5, 0x1f, 0xfe, 0x20, 0x0, 0x0, + 0x8f, 0xff, 0x50, 0x5f, 0xff, 0x84, 0x36, 0xcf, + 0xff, 0xf5, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xe5, + 0xff, 0x50, 0x0, 0x28, 0xdf, 0xfd, 0x81, 0x2f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, + + /* U+0072 "r" */ + 0xaf, 0xc0, 0x3a, 0xec, 0xaf, 0xc7, 0xff, 0xfc, + 0xaf, 0xef, 0xfb, 0x75, 0xaf, 0xff, 0x30, 0x0, + 0xaf, 0xf6, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, + 0xaf, 0xe0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, + 0xaf, 0xd0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, + 0xaf, 0xd0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, + 0xaf, 0xd0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x5, 0xbe, 0xff, 0xda, 0x50, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x8, 0xff, 0xa4, + 0x23, 0x59, 0xf2, 0x0, 0xdf, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xfd, 0xa6, 0x0, 0x0, 0x0, 0x6b, + 0xef, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x14, + 0x9f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf3, 0x4, 0x20, 0x0, 0x0, 0x5, 0xff, 0x30, + 0xef, 0xb6, 0x33, 0x47, 0xff, 0xd0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x5, 0xad, 0xff, + 0xec, 0x71, 0x0, + + /* U+0074 "t" */ + 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x20, 0x9f, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x14, 0xff, 0x41, 0x11, + 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, + 0x0, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x60, 0x0, 0x0, 0x0, 0xe, 0xfe, + 0x52, 0x55, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x5c, 0xff, 0xc6, 0x0, + + /* U+0075 "u" */ + 0xcf, 0xb0, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0xcf, + 0xb0, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0xcf, 0xb0, + 0x0, 0x0, 0x0, 0x4f, 0xf3, 0xcf, 0xb0, 0x0, + 0x0, 0x0, 0x4f, 0xf3, 0xcf, 0xb0, 0x0, 0x0, + 0x0, 0x4f, 0xf3, 0xcf, 0xb0, 0x0, 0x0, 0x0, + 0x4f, 0xf3, 0xcf, 0xb0, 0x0, 0x0, 0x0, 0x4f, + 0xf3, 0xcf, 0xb0, 0x0, 0x0, 0x0, 0x4f, 0xf3, + 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x6f, 0xf3, 0x9f, + 0xf0, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x5f, 0xf7, + 0x0, 0x0, 0x5, 0xff, 0xf3, 0xe, 0xff, 0x83, + 0x13, 0x8f, 0xff, 0xf3, 0x3, 0xef, 0xff, 0xff, + 0xff, 0x7f, 0xf3, 0x0, 0x18, 0xdf, 0xfd, 0x91, + 0x2f, 0xf3, + + /* U+0076 "v" */ + 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf5, + 0x6, 0xff, 0x20, 0x0, 0x0, 0x0, 0x8f, 0xe0, + 0x0, 0xef, 0x90, 0x0, 0x0, 0x0, 0xef, 0x70, + 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x6, 0xff, 0x10, + 0x0, 0x1f, 0xf7, 0x0, 0x0, 0xd, 0xf9, 0x0, + 0x0, 0xa, 0xfd, 0x0, 0x0, 0x4f, 0xf3, 0x0, + 0x0, 0x3, 0xff, 0x40, 0x0, 0xbf, 0xc0, 0x0, + 0x0, 0x0, 0xdf, 0xb0, 0x2, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x6f, 0xf2, 0x8, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xf8, 0xe, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xfe, 0x7f, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xfb, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0xaf, 0xb0, 0x0, 0x0, 0x0, 0x8f, 0xf0, 0x0, + 0x0, 0x0, 0x3f, 0xf1, 0x4f, 0xf1, 0x0, 0x0, + 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x0, 0x9f, 0xa0, + 0xe, 0xf6, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0xef, 0x40, 0x9, 0xfc, 0x0, 0x0, + 0x9, 0xfd, 0xff, 0x10, 0x0, 0x4, 0xfe, 0x0, + 0x3, 0xff, 0x20, 0x0, 0xf, 0xf4, 0xdf, 0x60, + 0x0, 0xa, 0xf8, 0x0, 0x0, 0xdf, 0x70, 0x0, + 0x5f, 0xe0, 0x8f, 0xc0, 0x0, 0x1f, 0xf3, 0x0, + 0x0, 0x7f, 0xd0, 0x0, 0xbf, 0x80, 0x2f, 0xf2, + 0x0, 0x6f, 0xd0, 0x0, 0x0, 0x1f, 0xf3, 0x1, + 0xff, 0x20, 0xc, 0xf8, 0x0, 0xcf, 0x70, 0x0, + 0x0, 0xb, 0xf9, 0x7, 0xfc, 0x0, 0x6, 0xfe, + 0x2, 0xff, 0x10, 0x0, 0x0, 0x5, 0xfe, 0xd, + 0xf6, 0x0, 0x0, 0xff, 0x48, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x8f, 0xf0, 0x0, 0x0, 0xaf, + 0x9d, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x90, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, 0x0, 0xe, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfd, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, 0x0, 0x0, + + /* U+0078 "x" */ + 0x1e, 0xfc, 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x4, + 0xff, 0x80, 0x0, 0x2, 0xff, 0x80, 0x0, 0x7f, + 0xf4, 0x0, 0xd, 0xfc, 0x0, 0x0, 0xb, 0xfe, + 0x10, 0xaf, 0xe1, 0x0, 0x0, 0x1, 0xef, 0xc6, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfe, 0xfc, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x83, 0xff, 0x80, 0x0, 0x0, 0x1e, + 0xfc, 0x0, 0x7f, 0xf4, 0x0, 0x0, 0xbf, 0xe1, + 0x0, 0xb, 0xfe, 0x20, 0x8, 0xff, 0x40, 0x0, + 0x1, 0xef, 0xc0, 0x4f, 0xf8, 0x0, 0x0, 0x0, + 0x3f, 0xf9, + + /* U+0079 "y" */ + 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf5, + 0x6, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xe0, + 0x0, 0xef, 0xa0, 0x0, 0x0, 0x0, 0xef, 0x70, + 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x6, 0xff, 0x10, + 0x0, 0x1f, 0xf8, 0x0, 0x0, 0xd, 0xf9, 0x0, + 0x0, 0x9, 0xfe, 0x0, 0x0, 0x4f, 0xf2, 0x0, + 0x0, 0x2, 0xff, 0x60, 0x0, 0xbf, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0xd0, 0x2, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x4f, 0xf4, 0x8, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xfb, 0xf, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0x8f, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xb0, 0x0, 0x0, 0x0, + 0xd, 0x73, 0x3a, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xcf, 0xeb, 0x40, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x1, 0x11, 0x11, 0x14, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1e, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf2, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x50, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0xd, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xaf, + 0xf3, 0x0, 0x0, 0x0, 0x7, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x4f, 0xfa, 0x11, 0x11, 0x11, 0x10, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, + + /* U+007B "{" */ + 0x0, 0x1, 0x9d, 0xfa, 0x0, 0xc, 0xff, 0xfa, + 0x0, 0x3f, 0xfa, 0x20, 0x0, 0x6f, 0xf2, 0x0, + 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x7f, 0xf1, 0x0, + 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x7f, 0xf1, 0x0, + 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x7f, 0xf0, 0x0, + 0x1, 0xbf, 0xf0, 0x0, 0x8f, 0xff, 0x60, 0x0, + 0x8f, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xf0, 0x0, + 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x7f, 0xf1, 0x0, + 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x7f, 0xf1, 0x0, + 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x7f, 0xf1, 0x0, + 0x0, 0x6f, 0xf2, 0x0, 0x0, 0x3f, 0xfa, 0x20, + 0x0, 0xc, 0xff, 0xfa, 0x0, 0x1, 0x9d, 0xfa, + + /* U+007C "|" */ + 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, + 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, + 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, + 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, + 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, + 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, + + /* U+007D "}" */ + 0x8f, 0xea, 0x10, 0x0, 0x8f, 0xff, 0xe0, 0x0, + 0x1, 0x9f, 0xf6, 0x0, 0x0, 0xf, 0xf8, 0x0, + 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, + 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, + 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, + 0x0, 0xc, 0xfd, 0x20, 0x0, 0x4, 0xef, 0xfa, + 0x0, 0x5, 0xff, 0xfa, 0x0, 0xd, 0xfc, 0x0, + 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, + 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, + 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, + 0x0, 0xf, 0xf8, 0x0, 0x1, 0x9f, 0xf6, 0x0, + 0x8f, 0xff, 0xe0, 0x0, 0x8f, 0xea, 0x10, 0x0, + + /* U+007E "~" */ + 0x1, 0xaf, 0xfa, 0x20, 0x0, 0x1f, 0x80, 0xcf, + 0xff, 0xff, 0x60, 0x8, 0xf6, 0x3f, 0xb1, 0x17, + 0xff, 0xed, 0xfe, 0x6, 0xf3, 0x0, 0x2, 0xae, + 0xfb, 0x20, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xe8, + 0x0, 0xd, 0xe7, 0x58, 0xfb, 0x7, 0xf2, 0x0, + 0x4, 0xf5, 0xcb, 0x0, 0x0, 0xe, 0xac, 0xb0, + 0x0, 0x0, 0xda, 0x8f, 0x10, 0x0, 0x3f, 0x71, + 0xed, 0x52, 0x5e, 0xd0, 0x2, 0xdf, 0xff, 0xc2, + 0x0, 0x0, 0x24, 0x20, 0x0, + + /* U+2022 "•" */ + 0x2, 0xab, 0x40, 0xe, 0xff, 0xf2, 0x3f, 0xff, + 0xf5, 0x1f, 0xff, 0xf3, 0x5, 0xee, 0x70, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x9c, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x26, 0xbf, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x48, 0xdf, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x5a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x3, + 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x6f, + 0xff, 0x20, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc7, 0x30, 0x1, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, 0xa5, 0x10, + 0x0, 0x0, 0x1f, 0xff, 0x20, 0x0, 0x0, 0x5, + 0xff, 0xfd, 0x83, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x20, + 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x5f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x20, 0x0, 0x0, 0x5, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x20, 0x0, 0x0, + 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x58, + 0x98, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x5f, 0xfe, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x2, + 0x44, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x5d, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x5f, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x4, + 0xac, 0xdb, 0x81, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x9f, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F008 "" */ + 0x34, 0x0, 0x18, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x81, 0x0, 0x43, 0xea, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0xae, 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, + 0xcc, 0xdf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfd, 0xcc, 0xff, 0xfa, 0x0, 0x2f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf2, 0x0, + 0xaf, 0xfa, 0x0, 0x2f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf2, 0x0, 0xaf, 0xfb, 0x0, + 0x3f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf3, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xfe, 0xaa, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xfc, 0xaa, 0xef, 0xfa, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0xaf, 0xfa, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xaf, 0xfc, + 0x22, 0x5f, 0xfb, 0x77, 0x77, 0x77, 0x77, 0x77, + 0xbf, 0xf5, 0x22, 0xcf, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xfe, 0x88, 0xaf, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xfa, 0x88, 0xef, 0xfa, 0x0, + 0x2f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf2, 0x0, 0xaf, 0xfa, 0x0, 0x2f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf2, 0x0, 0xaf, + 0xfc, 0x44, 0x6f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf6, 0x44, 0xcf, 0xff, 0xff, 0xff, + 0xfb, 0x77, 0x77, 0x77, 0x77, 0x77, 0xbf, 0xff, + 0xff, 0xff, 0xfd, 0x66, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x66, 0xdf, 0xa9, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x9a, + + /* U+F00B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xf4, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xf7, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x37, 0x77, 0x77, 0x60, 0x1, + 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x73, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xf4, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xf7, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x37, 0x88, 0x88, 0x70, 0x2, + 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xe3, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x48, 0x88, 0x88, 0x71, 0x2, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x53, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0xbd, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xc, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xfe, 0x20, 0x9, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xe3, 0x9f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "ï€" */ + 0x3, 0xa7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x20, 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xe2, 0xef, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfb, 0xdf, 0xff, 0xff, 0xa0, 0x0, + 0xb, 0xff, 0xff, 0xfb, 0x3f, 0xff, 0xff, 0xfa, + 0x0, 0xbf, 0xff, 0xff, 0xe2, 0x3, 0xff, 0xff, + 0xff, 0xab, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xfa, 0x0, 0xb, 0xff, 0xff, + 0xfe, 0x23, 0xff, 0xff, 0xff, 0xa0, 0xaf, 0xff, + 0xff, 0xe2, 0x0, 0x3f, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x3, 0xff, 0xff, 0xfd, + 0x8f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf6, 0x9, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x3, + 0xef, 0x70, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xbb, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x2f, + 0xff, 0xe0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xf5, 0x0, 0x2f, 0xff, 0xe0, 0x0, + 0x8f, 0xc1, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, + 0x0, 0x2f, 0xff, 0xe0, 0x2, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0x30, 0x2f, 0xff, + 0xe0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xbf, + 0xff, 0xfa, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0xcf, + 0xff, 0xf8, 0x0, 0x5, 0xff, 0xff, 0x90, 0x0, + 0x2f, 0xff, 0xe0, 0x0, 0xc, 0xff, 0xff, 0x20, + 0xc, 0xff, 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xe0, + 0x0, 0x1, 0xff, 0xff, 0x90, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x7f, + 0xff, 0xe0, 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x2f, + 0xff, 0xe0, 0x0, 0x0, 0x1f, 0xff, 0xf3, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0x2f, 0xff, 0xe0, 0x0, + 0x0, 0xb, 0xff, 0xf6, 0xbf, 0xff, 0x60, 0x0, + 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x9, 0xff, + 0xf7, 0xbf, 0xff, 0x50, 0x0, 0x0, 0x2f, 0xff, + 0xe0, 0x0, 0x0, 0x8, 0xff, 0xf8, 0xbf, 0xff, + 0x60, 0x0, 0x0, 0xa, 0xdd, 0x70, 0x0, 0x0, + 0xa, 0xff, 0xf6, 0x8f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, + 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf1, 0xf, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xc0, 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x60, 0x2, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xfd, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xfe, 0x85, 0x34, + 0x59, 0xef, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0x9c, 0xdc, 0xb9, 0x50, 0x0, 0x0, + 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x55, 0x31, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x50, 0x0, + 0x5d, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x6, 0x10, + 0x0, 0x0, 0xd, 0xfd, 0x5c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc5, 0xdf, 0xd0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x33, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x5, 0xef, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0xb, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xb0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf6, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x4f, 0xff, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xf4, + 0x0, 0x0, 0x7, 0xe5, 0x4, 0xdf, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x5d, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9b, 0xdd, 0xc9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xfd, 0x30, + 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf6, 0x0, + 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x80, 0x4f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xbf, 0xff, 0xfb, 0x5f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xf5, 0x3, 0xef, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xfe, + 0x30, 0x20, 0x1c, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xc1, 0x9, + 0xfb, 0x10, 0xaf, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x1, 0xbf, 0xff, + 0xd2, 0x7, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x70, 0x2d, 0xff, 0xff, 0xff, + 0x40, 0x4f, 0xff, 0xfc, 0x10, 0x0, 0x1, 0xcf, + 0xff, 0xf4, 0x4, 0xef, 0xff, 0xff, 0xff, 0xf7, + 0x2, 0xdf, 0xff, 0xe3, 0x0, 0x3e, 0xff, 0xfd, + 0x20, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x1b, 0xff, 0xff, 0x50, 0xef, 0xff, 0xc1, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x9f, 0xff, 0xf2, 0x6f, 0xf9, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x6, + 0xff, 0xa0, 0x7, 0x60, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x39, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0x83, 0x33, 0x5f, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0x30, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0x30, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0x20, 0x0, 0xe, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xbb, 0xbb, 0xb9, 0x0, + 0x0, 0x7, 0xbb, 0xbb, 0xba, 0x10, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xad, 0xdd, 0xda, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x11, 0x14, 0xff, 0xff, 0xff, 0x41, 0x11, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe3, 0x9, + 0xff, 0x90, 0x3e, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x77, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xfd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x6, 0xf0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x4a, 0xf5, 0x7f, 0xff, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x3, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, + 0x10, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, + 0x0, 0x2, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x10, 0x6f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0xef, 0xff, + 0xcc, 0xcc, 0xcc, 0x40, 0x0, 0x0, 0x0, 0x1b, + 0xcc, 0xcc, 0xce, 0xff, 0xf2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x88, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x2c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x40, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x77, 0x52, + 0x0, 0x0, 0x0, 0x6e, 0xec, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, + 0x9f, 0xff, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd2, 0x7f, 0xff, 0x0, 0x3, 0xef, 0xff, + 0xfe, 0x84, 0x22, 0x59, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0x0, 0x1e, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0x0, 0xbf, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0x3, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xb, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x17, + 0x87, 0x10, 0x0, 0x0, 0x0, 0x0, 0x17, 0x88, + 0x88, 0x88, 0x88, 0x86, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xd0, 0xff, 0xff, 0xfe, 0x56, 0x77, 0x81, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf4, + 0x0, 0xff, 0xfd, 0xff, 0xff, 0xfa, 0x30, 0x0, + 0x3, 0x9f, 0xff, 0xff, 0x80, 0x0, 0xff, 0xf7, + 0x8f, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xff, 0xf8, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0xff, 0xf8, 0x0, 0x7, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0x0, 0x0, 0xff, 0xf9, 0x0, + 0x0, 0x3, 0x8b, 0xdd, 0xb9, 0x51, 0x0, 0x0, + 0x0, 0x0, 0x35, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xf6, 0xbb, 0xbb, 0xbd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x6b, 0xbb, 0xbb, 0xdf, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x3, 0xb5, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x9, 0xff, 0x60, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2, + 0xdf, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x2f, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xf, 0xf7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x6f, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x6, + 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xfe, 0x20, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x40, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf0, 0x0, 0x0, 0x6d, 0x40, 0x2, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf0, 0x0, 0x0, 0xcf, 0xf7, 0x0, 0x5f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x3e, 0xff, 0x50, 0xb, 0xff, 0x0, + 0x6b, 0xbb, 0xbb, 0xdf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x1, 0xdf, 0xf2, 0x3, 0xff, 0x60, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3, 0xc6, + 0x0, 0x3f, 0xf9, 0x0, 0xdf, 0xb0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x9, 0xff, 0x70, + 0xa, 0xff, 0x0, 0x8f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x1, 0xdf, 0xf1, 0x5, + 0xff, 0x30, 0x5f, 0xf2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x1f, 0xf6, 0x2, 0xff, + 0x50, 0x3f, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xf, 0xf7, 0x1, 0xff, 0x50, + 0x3f, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x6f, 0xf4, 0x3, 0xff, 0x40, 0x4f, + 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x6, 0xff, 0xd0, 0x7, 0xff, 0x10, 0x6f, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, + 0xfd, 0x20, 0xd, 0xfc, 0x0, 0xbf, 0xd0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x40, + 0x0, 0x8f, 0xf5, 0x1, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x7, + 0xff, 0xb0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xf0, 0x0, 0x0, 0x9f, 0xfe, + 0x10, 0x1e, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xc1, 0x0, + 0xbf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xf0, 0x0, 0x0, 0x15, 0x0, 0x9, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x50, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x7, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0x70, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x72, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x1, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0x80, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x40, 0x2b, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x7f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x7, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc2, + + /* U+F043 "ïƒ" */ + 0x0, 0x0, 0x0, 0x2, 0xcb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xef, 0xfb, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xf4, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xef, 0xf6, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xbf, 0xfb, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x6f, 0xff, 0x40, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xe, 0xff, 0xf3, + 0x0, 0x3a, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xff, + 0xff, 0x93, 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xfd, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, 0x10, + 0x0, 0x0, 0x0, + + /* U+F048 "ïˆ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xd2, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x7b, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf8, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x8b, 0xff, 0xe0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xf8, 0xbf, 0xfe, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0x8b, 0xff, 0xe0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xfe, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x8b, 0xff, 0xe2, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8b, + 0xff, 0xe0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xbf, 0xfe, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0x8b, 0xff, 0xe0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xf8, 0xbf, 0xfe, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0x8b, 0xff, 0xe0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xf8, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x8b, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xf8, 0xbf, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0x66, 0xbb, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "ï‹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8b, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe5, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F04C "ïŒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xa0, 0xcf, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x7a, 0xbb, 0xbb, 0xa5, 0x0, 0x0, 0x7, + 0xab, 0xbb, 0xba, 0x50, + + /* U+F04D "ï" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x7a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xba, 0x50, + + /* U+F051 "ï‘" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xee, 0x30, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf8, 0xaf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x9a, 0xff, 0xff, 0x50, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0xaf, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x1f, 0xff, 0x9a, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x1, 0xff, 0xf9, 0xaf, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x1f, 0xff, 0x9a, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x1, 0xff, 0xf9, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x1f, 0xff, 0x9a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc2, 0xff, 0xf9, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xef, 0xff, 0x9a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0x9a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x71, 0xff, 0xf9, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x1f, 0xff, + 0x9a, 0xff, 0xff, 0xff, 0xff, 0x50, 0x1, 0xff, + 0xf9, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x1f, + 0xff, 0x9a, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x1, + 0xff, 0xf9, 0xaf, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x1f, 0xff, 0x9a, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x1, 0xff, 0xf9, 0x8f, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x91, 0x99, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xab, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x6, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x84, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x28, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x0, + + /* U+F053 "ï“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x0, + + /* U+F054 "ï”" */ + 0x2, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0xa, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xfe, 0x20, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x33, 0x33, 0x33, 0xff, 0xff, 0xd3, 0x33, + 0x33, 0x33, 0x10, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xce, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x3a, 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, + 0xbb, 0xbb, 0xbb, 0xb9, 0x10, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xa8, 0x10, + 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "ï¨" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa4, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xb2, + + /* U+F06E "ï®" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x56, 0x77, + 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x49, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xfa, 0x40, 0x0, 0x38, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xe2, + 0x0, 0x3, 0x98, 0x30, 0x0, 0xcf, 0xff, 0xff, + 0x30, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x50, 0x0, + 0x4, 0xff, 0xfa, 0x0, 0x2f, 0xff, 0xff, 0xe2, + 0x0, 0x9, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xa0, 0x9, 0xff, 0xff, 0xfd, 0x0, + 0x3f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf2, 0x4, 0xff, 0xff, 0xff, 0x70, 0xcf, + 0xff, 0xff, 0xf6, 0x1, 0xc9, 0xdf, 0xff, 0xff, + 0xf7, 0x2, 0xff, 0xff, 0xff, 0xf1, 0xef, 0xff, + 0xff, 0xf5, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x1, 0xff, 0xff, 0xff, 0xf2, 0x8f, 0xff, 0xff, + 0xf6, 0x1, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2, + 0xff, 0xff, 0xff, 0xc0, 0xd, 0xff, 0xff, 0xfa, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xe0, 0x6, 0xff, + 0xff, 0xff, 0x30, 0x3, 0xff, 0xff, 0xff, 0x10, + 0x1d, 0xff, 0xff, 0xff, 0x40, 0xd, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xa0, 0x1, + 0x9f, 0xff, 0xb3, 0x0, 0x7f, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x10, 0x0, 0x5, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x1, 0x8f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xff, 0xc8, 0x78, 0xbf, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7a, 0xdf, 0xff, 0xdb, 0x83, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "ï°" */ + 0x9, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x25, 0x77, 0x65, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf9, 0x0, 0x5a, + 0xef, 0xff, 0xff, 0xff, 0xe9, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfc, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xf8, 0x30, 0x1, 0x4b, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xb1, 0x7, 0x97, 0x10, 0x4, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x5, 0xff, 0xff, 0xd3, 0xaf, 0xff, 0x50, 0x7, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x1e, 0xa0, + 0x0, 0x2, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0x40, + 0xe, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x9, 0xff, + 0xd2, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0xaf, 0xff, 0xff, 0xf2, 0x0, 0x2, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x4f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0x10, 0x7f, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xf0, 0x9, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x5, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xb1, 0xdf, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xef, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf8, + 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xa8, 0x78, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0xa, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x8b, 0xef, 0xfe, 0xc8, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9d, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x80, 0x0, 0x4f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf6, 0x0, 0x3, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0x70, 0x0, 0x3f, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xf8, 0x0, 0x4, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x5f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xee, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x3d, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x72, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x13, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x10, 0x0, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfd, 0x10, 0xdf, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xd1, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x1, 0x11, 0x1b, 0xff, 0xfc, 0x1, 0xdf, 0xff, + 0xf8, 0x18, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0xcf, 0xd1, 0x1d, 0xff, 0xff, 0x80, 0x8, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0xa, 0x10, 0xcf, + 0xff, 0xf9, 0x0, 0x6, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xc0, + 0x26, 0x0, 0x4, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xfc, 0x1, 0xdf, 0x50, 0x7, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xd1, 0x1d, 0xff, 0xf5, 0x8, 0xff, 0xfc, 0x10, + 0xde, 0xee, 0xef, 0xff, 0xfd, 0x10, 0x3f, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x12, 0x22, 0x22, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x29, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x52, 0x0, 0x0, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x91, 0xdf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x90, 0x1, 0xdf, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0x90, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfb, 0x0, 0x3f, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0xb, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xf5, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x10, 0x6e, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcc, + 0x10, + + /* U+F078 "ï¸" */ + 0x1, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x40, 0x1, 0xdf, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x70, 0xaf, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x48, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf2, 0xa, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xf4, 0x0, 0xa, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xe2, 0x0, 0x7, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xe2, 0x7, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xe9, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x0, 0x3, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x4, 0x44, 0x44, 0x44, 0x44, 0x4e, 0xff, + 0x60, 0x0, 0x0, 0xcf, 0xff, 0x6f, 0xff, 0x6f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf6, 0x0, 0x0, 0x6, 0xff, 0x42, 0xff, 0xf2, + 0x4f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x60, 0x0, 0x0, 0x3, 0x20, 0x2f, 0xff, + 0x20, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbe, 0x40, 0xdf, 0xf6, 0xa, 0xf5, 0x0, 0x0, + 0x2, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x3d, 0xff, 0x69, 0xff, 0xf1, 0x0, + 0x0, 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfe, 0xef, 0xfd, 0xff, 0xfd, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x5, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x5, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x1, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x40, 0x0, 0x5, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F07B "ï»" */ + 0x4, 0x78, 0x88, 0x88, 0x88, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc2, + + /* U+F093 "ï‚“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8b, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xee, 0xee, 0xff, 0xff, 0xff, 0xfe, 0xee, 0xe8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x20, 0xff, + 0xff, 0xff, 0x62, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x7b, 0xbb, 0xb9, 0x15, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xba, 0xaa, + 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xfd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x6, 0xf0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x4a, 0xf5, 0x7f, 0xff, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x3, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xb8, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xfd, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x6c, 0xb0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x28, + 0xef, 0xff, 0xa0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, + 0x70, 0x1a, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xeb, 0x73, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xd5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x20, 0x0, + 0xb, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x1b, 0xff, 0xfd, 0x20, 0x6f, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xa0, + 0xcf, 0xfd, 0x35, 0xff, 0xf8, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xfd, 0x10, 0xff, 0xf5, 0x0, 0x9f, + 0xfb, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xd1, 0x0, + 0xff, 0xf6, 0x0, 0xaf, 0xfb, 0x0, 0xc, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0xbf, 0xff, 0x89, 0xff, + 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0x4c, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0xce, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0xdf, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xfc, 0x18, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0xcf, 0xfd, 0x35, 0xff, + 0xf8, 0x0, 0x8f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0xff, 0xf5, 0x0, 0x9f, 0xfb, 0x0, 0x9, 0xff, + 0xff, 0xff, 0x40, 0x0, 0xff, 0xf6, 0x0, 0xaf, + 0xfb, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf3, 0x0, + 0xbf, 0xff, 0x89, 0xff, 0xf7, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0x30, 0x4f, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x90, + 0x6, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x7, 0xef, 0xe8, 0x0, 0x0, 0x3a, 0xcc, 0x81, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x4c, 0xdd, 0xdd, 0xdd, 0xdd, + 0x11, 0xb2, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x1f, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x11, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x1f, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x11, 0xff, + 0xff, 0xb9, 0xff, 0xfd, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0xf, 0xff, 0xfe, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xe0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xfe, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xe0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xfe, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xe0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xfe, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xe0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xfe, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xe0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xfe, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xe0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xfe, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xf0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0x41, 0x89, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x82, 0xff, 0xff, 0xfe, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x13, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x31, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xf6, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x24, 0xff, 0xff, + 0x80, 0xf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0x70, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0x4f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xf8, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0x9f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xf9, 0xff, 0xf9, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x45, 0xff, 0xff, 0xff, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x4d, + 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x87, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x41, 0x9d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdc, 0x60, + + /* U+F0C9 "" */ + 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x69, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x69, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F0E0 "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x10, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xb2, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x4e, + 0xff, 0x60, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x8, 0xff, 0xff, 0xfa, 0x10, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x2, + 0xcf, 0xff, 0xff, 0xff, 0xe4, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x1c, 0xff, 0xff, 0xff, 0xc1, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x8f, 0xff, 0xf8, 0x3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2, 0x99, + 0x20, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb3, 0x0, 0x3b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc2, + + /* U+F0E7 "" */ + 0x0, 0x9, 0xaa, 0xaa, 0xaa, 0xa9, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xa8, 0x88, 0x88, + 0x60, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x6c, 0xc8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x33, 0x33, 0x8f, 0xff, + 0xfb, 0x33, 0x33, 0x10, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xf7, 0x5f, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x0, 0xbf, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xf5, 0x3f, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xd0, + 0x7d, 0xdd, 0xdd, 0xdd, 0x21, 0xb2, 0x0, 0xf, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xf3, + 0x1f, 0xe2, 0x0, 0xff, 0xff, 0xff, 0x80, 0xef, + 0xff, 0xff, 0xff, 0x31, 0xff, 0xe2, 0xf, 0xff, + 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xf3, 0x1f, + 0xff, 0xe2, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, + 0xff, 0xff, 0x31, 0xff, 0xff, 0xbf, 0xff, 0xff, + 0xf8, 0xe, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, + 0xff, 0xa2, 0x22, 0x22, 0x1f, 0xff, 0xff, 0xf8, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xf8, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xf8, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xef, 0xff, + 0xff, 0x80, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x56, 0x66, 0x63, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xf4, 0x0, 0x9f, + 0x20, 0xb, 0xf1, 0x0, 0xcf, 0x0, 0xf, 0xc0, + 0x1, 0xff, 0xf4, 0xff, 0xf4, 0x0, 0x8f, 0x10, + 0xa, 0xf0, 0x0, 0xbe, 0x0, 0xe, 0xb0, 0x0, + 0xff, 0xf4, 0xff, 0xf5, 0x0, 0xaf, 0x20, 0xb, + 0xf1, 0x0, 0xcf, 0x0, 0xf, 0xc0, 0x1, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xaa, 0xbf, 0xea, 0xac, 0xfe, + 0xaa, 0xdf, 0xda, 0xad, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xfb, 0x0, 0x1f, 0x80, 0x2, 0xf7, 0x0, + 0x4f, 0x40, 0x7, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xfb, 0x0, 0x1f, 0x80, 0x2, 0xf7, 0x0, 0x4f, + 0x40, 0x7, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xfc, + 0x0, 0x3f, 0xa0, 0x4, 0xf9, 0x0, 0x6f, 0x60, + 0x8, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xfc, 0x99, 0xef, 0xb9, + 0x99, 0x99, 0x99, 0x99, 0x99, 0xaf, 0xf9, 0x9a, + 0xff, 0xf4, 0xff, 0xf4, 0x0, 0x8f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0xff, + 0xf4, 0xff, 0xf4, 0x0, 0x8f, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0xff, 0xf4, + 0xff, 0xf8, 0x44, 0xbf, 0x64, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x4f, 0xd4, 0x45, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x2c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x40, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x17, 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x5, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x1, 0xad, 0xee, 0xee, 0xee, 0xee, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "ï…›" */ + 0x48, 0x88, 0x88, 0x88, 0x88, 0x83, 0x7, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xf, 0xc1, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xf, 0xfc, 0x10, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xf, 0xff, 0xc1, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xf, 0xff, + 0xfc, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xf, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xf, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xdd, + 0xdd, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xad, 0xff, + 0xff, 0xff, 0xeb, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xfc, + 0x84, 0x20, 0x0, 0x1, 0x36, 0xae, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x2d, 0xff, 0xff, 0xfe, 0x81, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, + 0xff, 0xff, 0xf7, 0xd, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0xff, 0xff, 0xf5, 0x8f, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0x10, 0x8f, 0xa0, 0x0, + 0x0, 0x0, 0x38, 0xcd, 0xef, 0xec, 0xa6, 0x10, + 0x0, 0x0, 0x4, 0xfe, 0x20, 0x0, 0x30, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xfb, 0x63, 0x21, 0x24, + 0x8d, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xdf, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9e, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xae, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xbd, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x79, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xf, 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xaf, + 0xfe, 0x90, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x4f, 0xff, 0x42, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xf5, 0xff, 0xf4, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4, 0x8f, 0xff, 0x5f, 0xff, 0x42, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xef, 0xf5, 0xff, 0xf4, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xe, 0xff, 0x5f, 0xff, 0x42, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x13, 0xff, 0xf5, 0xff, 0xf4, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8, 0xff, 0xff, 0x5f, 0xff, 0x41, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x80, 0x8f, 0xff, 0xf5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, + 0x0, + + /* U+F241 "ï‰" */ + 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xf, 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xaf, + 0xfe, 0x90, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x4f, 0xff, 0x42, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x8f, 0xff, 0xf5, 0xff, 0xf4, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x4, 0x8f, 0xff, 0x5f, 0xff, 0x42, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0xff, 0xf4, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x5f, 0xff, 0x42, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x13, 0xff, 0xf5, 0xff, 0xf4, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x5f, 0xff, 0x41, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x10, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, + 0x0, + + /* U+F242 "" */ + 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xf, 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xaf, + 0xfe, 0x90, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x4f, 0xff, 0x42, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf5, 0xff, 0xf4, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x8f, 0xff, 0x5f, 0xff, 0x42, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0xff, 0xf4, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x5f, 0xff, 0x42, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0xff, 0xf5, 0xff, 0xf4, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x5f, 0xff, 0x41, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x82, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, + 0x0, + + /* U+F243 "" */ + 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xf, 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xaf, + 0xfe, 0x90, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x4f, 0xff, 0x41, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf5, 0xff, 0xf4, 0x1f, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x8f, 0xff, 0x5f, 0xff, 0x41, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0xff, 0xf4, 0x1f, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x5f, 0xff, 0x41, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0xff, 0xf5, 0xff, 0xf4, 0x1f, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x5f, 0xff, 0x40, + 0x88, 0x88, 0x88, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, + 0x0, + + /* U+F244 "" */ + 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xf, 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xaf, + 0xfe, 0x90, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x4f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf5, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x8f, 0xff, 0x5f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x5f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0xff, 0xf5, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x5f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, + 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x77, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xbc, 0xdf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xfe, 0x31, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x50, 0x0, 0x5c, 0xc5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x46, 0x50, 0x0, 0x0, + 0x3f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xd2, 0x0, + 0xa, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc8, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xc0, + 0x4, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xfe, 0x50, 0xe, 0xff, 0xff, 0xff, + 0xcc, 0xff, 0xec, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xff, 0xff, 0xb2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x5b, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x2, 0xdf, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xfa, 0x10, 0x2e, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x3, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xd3, 0x0, 0x0, 0x18, + 0xb9, 0x20, 0x0, 0x0, 0x0, 0xb, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xa0, + 0x0, 0x33, 0x33, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0x30, 0x1f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xfe, 0x77, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x56, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x23, 0x33, 0x30, 0x0, + 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x26, 0xac, 0xdc, 0xb8, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xfe, 0x9f, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xe0, 0xaf, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x0, + 0xbf, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xcf, 0xff, 0xff, 0x30, 0x5, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1, 0xdf, 0xff, + 0xf8, 0x0, 0xaf, 0xff, 0xd9, 0xff, 0xe0, 0x3a, + 0x1, 0xdf, 0xff, 0xc0, 0xd, 0xff, 0xf1, 0x8, + 0xfe, 0x2, 0xfa, 0x2, 0xef, 0xff, 0x0, 0xff, + 0xff, 0xb0, 0x8, 0xe0, 0x2f, 0x50, 0x5f, 0xff, + 0xf1, 0x1f, 0xff, 0xff, 0xa0, 0x7, 0x2, 0x50, + 0x4f, 0xff, 0xff, 0x22, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf3, 0x3f, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0x43, 0xff, 0xff, 0xff, 0xff, 0x40, 0x7, 0xff, + 0xff, 0xff, 0xf4, 0x3f, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x9, 0xff, 0xff, 0xff, 0x32, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, + 0xf, 0xff, 0xff, 0x50, 0x1c, 0x2, 0xa0, 0xb, + 0xff, 0xff, 0x20, 0xef, 0xff, 0x50, 0x1d, 0xf0, + 0x2f, 0xa0, 0xd, 0xff, 0xf0, 0xc, 0xff, 0xf4, + 0x1d, 0xff, 0x2, 0xf5, 0x4, 0xff, 0xfe, 0x0, + 0x8f, 0xff, 0xfd, 0xff, 0xf0, 0x25, 0x3, 0xff, + 0xff, 0xa0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x3, 0xff, 0xff, 0xf6, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xf0, 0x3, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0x3, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xbf, 0xff, 0xff, 0xea, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "ï‹­" */ + 0x0, 0x0, 0x0, 0x4, 0xbc, 0xcc, 0xcc, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x22, 0x22, 0x22, 0xef, + 0xff, 0xff, 0xff, 0xa2, 0x22, 0x22, 0x10, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x10, 0x1, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x6, 0xff, 0xfd, 0x1d, 0xff, + 0xb1, 0xef, 0xf9, 0x2f, 0xff, 0xf2, 0x0, 0x6f, + 0xff, 0xb0, 0xbf, 0xf9, 0xd, 0xff, 0x70, 0xff, + 0xff, 0x20, 0x6, 0xff, 0xfb, 0xb, 0xff, 0x90, + 0xdf, 0xf7, 0xf, 0xff, 0xf2, 0x0, 0x6f, 0xff, + 0xb0, 0xbf, 0xf9, 0xd, 0xff, 0x70, 0xff, 0xff, + 0x20, 0x6, 0xff, 0xfb, 0xb, 0xff, 0x90, 0xdf, + 0xf7, 0xf, 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xb0, + 0xbf, 0xf9, 0xd, 0xff, 0x70, 0xff, 0xff, 0x20, + 0x6, 0xff, 0xfb, 0xb, 0xff, 0x90, 0xdf, 0xf7, + 0xf, 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xb0, 0xbf, + 0xf9, 0xd, 0xff, 0x70, 0xff, 0xff, 0x20, 0x6, + 0xff, 0xfb, 0xb, 0xff, 0x90, 0xdf, 0xf7, 0xf, + 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xb0, 0xbf, 0xf9, + 0xd, 0xff, 0x70, 0xff, 0xff, 0x20, 0x6, 0xff, + 0xfb, 0xb, 0xff, 0x90, 0xdf, 0xf7, 0xf, 0xff, + 0xf2, 0x0, 0x6f, 0xff, 0xb0, 0xbf, 0xf9, 0xd, + 0xff, 0x70, 0xff, 0xff, 0x20, 0x6, 0xff, 0xfd, + 0x1d, 0xff, 0xb1, 0xef, 0xf9, 0x2f, 0xff, 0xf2, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x2, 0x34, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x31, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7b, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb5, 0x7, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf5, 0x7, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, + 0x7, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf5, 0x7, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xf5, 0x7, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xec, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xdf, 0xff, 0xff, 0xda, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x1, 0xdf, 0xff, 0xd1, 0x8, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x1, 0xdf, 0xd1, 0x0, 0xd, + 0xff, 0xff, 0xff, 0x80, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x1, 0xb1, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xf8, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0x8c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x86, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x3, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x80, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x7, + 0xf7, 0x0, 0x1, 0xef, 0xff, 0xff, 0xf8, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x7, + 0xff, 0xf7, 0x0, 0x2e, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x27, + 0xff, 0xff, 0xf7, 0x2e, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x20, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xd9, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x1d, + 0xfc, 0x44, 0xfc, 0x44, 0xfc, 0x44, 0xff, 0xf5, + 0x1, 0xdf, 0xfb, 0x0, 0xeb, 0x0, 0xeb, 0x0, + 0xef, 0xf5, 0x1d, 0xff, 0xfb, 0x0, 0xeb, 0x0, + 0xeb, 0x0, 0xef, 0xf5, 0xdf, 0xff, 0xfb, 0x0, + 0xeb, 0x0, 0xeb, 0x0, 0xef, 0xf5, 0xff, 0xff, + 0xfb, 0x0, 0xeb, 0x0, 0xeb, 0x0, 0xef, 0xf5, + 0xff, 0xff, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xdd, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, + 0x1, 0xaa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x10, 0x0, 0x1, 0xdf, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf1, 0x0, 0x2, 0xdf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x2, + 0xef, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf1, 0x3, 0xef, 0xff, 0xff, + 0x86, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xff, + 0xff, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x17, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x7, 0xff, 0xff, 0xff, 0xcb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa7, 0x0, + 0x6, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xee, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 112, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 111, .box_w = 5, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 45, .adv_w = 163, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 77, .adv_w = 292, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 239, .adv_w = 258, .box_w = 15, .box_h = 25, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 427, .adv_w = 351, .box_w = 21, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 616, .adv_w = 285, .box_w = 17, .box_h = 19, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 778, .adv_w = 87, .box_w = 3, .box_h = 8, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 790, .adv_w = 140, .box_w = 6, .box_h = 24, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 862, .adv_w = 141, .box_w = 7, .box_h = 24, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 946, .adv_w = 166, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 996, .adv_w = 242, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 1074, .adv_w = 94, .box_w = 4, .box_h = 8, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1090, .adv_w = 159, .box_w = 8, .box_h = 3, .ofs_x = 1, .ofs_y = 6}, + {.bitmap_index = 1102, .adv_w = 94, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1110, .adv_w = 146, .box_w = 12, .box_h = 25, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 1260, .adv_w = 277, .box_w = 16, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1404, .adv_w = 154, .box_w = 7, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1467, .adv_w = 239, .box_w = 15, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1602, .adv_w = 238, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1728, .adv_w = 278, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1890, .adv_w = 239, .box_w = 15, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2025, .adv_w = 257, .box_w = 15, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2160, .adv_w = 249, .box_w = 15, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2295, .adv_w = 268, .box_w = 15, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2430, .adv_w = 257, .box_w = 15, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2565, .adv_w = 94, .box_w = 4, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2593, .adv_w = 94, .box_w = 4, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 2629, .adv_w = 242, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 2707, .adv_w = 242, .box_w = 13, .box_h = 9, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 2766, .adv_w = 242, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 2844, .adv_w = 238, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2970, .adv_w = 430, .box_w = 25, .box_h = 23, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 3258, .adv_w = 305, .box_w = 21, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3447, .adv_w = 315, .box_w = 17, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3600, .adv_w = 301, .box_w = 17, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3753, .adv_w = 344, .box_w = 19, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3924, .adv_w = 279, .box_w = 14, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4050, .adv_w = 264, .box_w = 14, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4176, .adv_w = 321, .box_w = 17, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4329, .adv_w = 338, .box_w = 17, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4482, .adv_w = 129, .box_w = 4, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4518, .adv_w = 213, .box_w = 12, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4626, .adv_w = 299, .box_w = 17, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4779, .adv_w = 247, .box_w = 14, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4905, .adv_w = 397, .box_w = 21, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5094, .adv_w = 338, .box_w = 17, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5247, .adv_w = 349, .box_w = 20, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5427, .adv_w = 300, .box_w = 16, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5571, .adv_w = 349, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 5802, .adv_w = 302, .box_w = 16, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5946, .adv_w = 258, .box_w = 15, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6081, .adv_w = 244, .box_w = 16, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6225, .adv_w = 329, .box_w = 16, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6369, .adv_w = 296, .box_w = 20, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 6549, .adv_w = 468, .box_w = 29, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6810, .adv_w = 280, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6972, .adv_w = 269, .box_w = 18, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7134, .adv_w = 273, .box_w = 16, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7278, .adv_w = 139, .box_w = 7, .box_h = 24, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 7362, .adv_w = 146, .box_w = 11, .box_h = 25, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 7500, .adv_w = 139, .box_w = 6, .box_h = 24, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 7572, .adv_w = 243, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 7644, .adv_w = 208, .box_w = 13, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7657, .adv_w = 250, .box_w = 7, .box_h = 4, .ofs_x = 3, .ofs_y = 16}, + {.bitmap_index = 7671, .adv_w = 249, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7762, .adv_w = 284, .box_w = 15, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7905, .adv_w = 238, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7996, .adv_w = 284, .box_w = 15, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8139, .adv_w = 255, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8237, .adv_w = 147, .box_w = 11, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8342, .adv_w = 287, .box_w = 15, .box_h = 19, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 8485, .adv_w = 283, .box_w = 14, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8618, .adv_w = 116, .box_w = 5, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8666, .adv_w = 118, .box_w = 9, .box_h = 24, .ofs_x = -3, .ofs_y = -5}, + {.bitmap_index = 8774, .adv_w = 256, .box_w = 14, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8907, .adv_w = 116, .box_w = 3, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8936, .adv_w = 440, .box_w = 24, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9104, .adv_w = 283, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9202, .adv_w = 264, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9307, .adv_w = 284, .box_w = 15, .box_h = 19, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 9450, .adv_w = 284, .box_w = 15, .box_h = 19, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9593, .adv_w = 171, .box_w = 8, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9649, .adv_w = 208, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9740, .adv_w = 172, .box_w = 11, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9834, .adv_w = 282, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9932, .adv_w = 233, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 10044, .adv_w = 374, .box_w = 24, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10212, .adv_w = 230, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10310, .adv_w = 233, .box_w = 16, .box_h = 19, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 10462, .adv_w = 217, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10546, .adv_w = 146, .box_w = 8, .box_h = 24, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 10642, .adv_w = 124, .box_w = 4, .box_h = 24, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 10690, .adv_w = 146, .box_w = 8, .box_h = 24, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 10786, .adv_w = 242, .box_w = 13, .box_h = 4, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 10812, .adv_w = 174, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 10857, .adv_w = 131, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 10872, .adv_w = 416, .box_w = 27, .box_h = 28, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 11250, .adv_w = 416, .box_w = 26, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11510, .adv_w = 416, .box_w = 26, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11822, .adv_w = 416, .box_w = 26, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12082, .adv_w = 286, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12253, .adv_w = 416, .box_w = 26, .box_h = 26, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12591, .adv_w = 416, .box_w = 26, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 12942, .adv_w = 468, .box_w = 30, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13302, .adv_w = 416, .box_w = 26, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 13653, .adv_w = 468, .box_w = 30, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13953, .adv_w = 416, .box_w = 26, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 14304, .adv_w = 208, .box_w = 13, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14441, .adv_w = 312, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14651, .adv_w = 468, .box_w = 30, .box_h = 26, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 15041, .adv_w = 416, .box_w = 26, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15301, .adv_w = 286, .box_w = 18, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 15544, .adv_w = 364, .box_w = 17, .box_h = 25, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 15757, .adv_w = 364, .box_w = 23, .box_h = 28, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 16079, .adv_w = 364, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16355, .adv_w = 364, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16631, .adv_w = 364, .box_w = 17, .box_h = 25, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 16844, .adv_w = 364, .box_w = 25, .box_h = 24, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 17144, .adv_w = 260, .box_w = 14, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 17305, .adv_w = 260, .box_w = 14, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 17466, .adv_w = 364, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17742, .adv_w = 364, .box_w = 23, .box_h = 6, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 17811, .adv_w = 468, .box_w = 30, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 18111, .adv_w = 520, .box_w = 33, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 18557, .adv_w = 468, .box_w = 31, .box_h = 27, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 18976, .adv_w = 416, .box_w = 26, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19288, .adv_w = 364, .box_w = 23, .box_h = 14, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 19449, .adv_w = 364, .box_w = 23, .box_h = 14, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 19610, .adv_w = 520, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19957, .adv_w = 416, .box_w = 26, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20217, .adv_w = 416, .box_w = 26, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 20568, .adv_w = 416, .box_w = 27, .box_h = 27, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 20933, .adv_w = 364, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21221, .adv_w = 364, .box_w = 23, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 21532, .adv_w = 364, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21808, .adv_w = 364, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 22050, .adv_w = 416, .box_w = 26, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 22310, .adv_w = 260, .box_w = 18, .box_h = 27, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 22553, .adv_w = 364, .box_w = 23, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 22864, .adv_w = 364, .box_w = 23, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 23175, .adv_w = 468, .box_w = 30, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23475, .adv_w = 416, .box_w = 28, .box_h = 28, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23867, .adv_w = 312, .box_w = 20, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 24137, .adv_w = 520, .box_w = 33, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24533, .adv_w = 520, .box_w = 33, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 24814, .adv_w = 520, .box_w = 33, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 25095, .adv_w = 520, .box_w = 33, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 25376, .adv_w = 520, .box_w = 33, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 25657, .adv_w = 520, .box_w = 33, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 25938, .adv_w = 520, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 26285, .adv_w = 364, .box_w = 21, .box_h = 27, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 26569, .adv_w = 364, .box_w = 23, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 26880, .adv_w = 416, .box_w = 27, .box_h = 27, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 27245, .adv_w = 520, .box_w = 33, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 27575, .adv_w = 312, .box_w = 20, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 27845, .adv_w = 418, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 4, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 19, 0, 11, -9, 0, 0, + 0, 0, -23, -25, 3, 20, 9, 7, + -17, 3, 20, 1, 17, 4, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 25, 3, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 8, 0, -12, 0, 0, 0, 0, + 0, -8, 7, 8, 0, 0, -4, 0, + -3, 4, 0, -4, 0, -4, -2, -8, + 0, 0, 0, 0, -4, 0, 0, -5, + -6, 0, 0, -4, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + -4, 0, -6, 0, -11, 0, -50, 0, + 0, -8, 0, 8, 12, 0, 0, -8, + 4, 4, 14, 8, -7, 8, 0, 0, + -24, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -11, -5, -20, 0, -17, + -3, 0, 0, 0, 0, 1, 16, 0, + -12, -3, -1, 1, 0, -7, 0, 0, + -3, -31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -33, -3, 16, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -17, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 14, + 0, 4, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 3, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 8, 4, 12, -4, 0, 0, 8, -4, + -14, -57, 3, 11, 8, 1, -5, 0, + 15, 0, 13, 0, 13, 0, -39, 0, + -5, 12, 0, 14, -4, 8, 4, 0, + 0, 1, -4, 0, 0, -7, 33, 0, + 33, 0, 12, 0, 17, 5, 7, 12, + 0, 0, 0, -15, 0, 0, 0, 0, + 1, -3, 0, 3, -7, -5, -8, 3, + 0, -4, 0, 0, 0, -17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -27, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -23, 0, -26, 0, 0, 0, + 0, -3, 0, 41, -5, -5, 4, 4, + -4, 0, -5, 4, 0, 0, -22, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -40, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -26, 0, 25, 0, 0, -15, 0, + 14, 0, -28, -40, -28, -8, 12, 0, + 0, -28, 0, 5, -10, 0, -6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 11, 12, -51, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 20, 0, 3, 0, 0, 0, + 0, 0, 3, 3, -5, -8, 0, -1, + -1, -4, 0, 0, -3, 0, 0, 0, + -8, 0, -3, 0, -10, -8, 0, -10, + -14, -14, -8, 0, -8, 0, -8, 0, + 0, 0, 0, -3, 0, 0, 4, 0, + 3, -4, 0, 1, 0, 0, 0, 4, + -3, 0, 0, 0, -3, 4, 4, -1, + 0, 0, 0, -8, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 5, -3, 0, + -5, 0, -7, 0, 0, -3, 0, 12, + 0, 0, -4, 0, 0, 0, 0, 0, + -1, 1, -3, -3, 0, 0, -4, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, -4, -5, 0, + 0, 0, 0, 0, 1, 0, 0, -3, + 0, -4, -4, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, -3, -5, 0, -6, 0, -12, + -3, -12, 8, 0, 0, -8, 4, 8, + 11, 0, -10, -1, -5, 0, -1, -20, + 4, -3, 3, -22, 4, 0, 0, 1, + -22, 0, -22, -3, -36, -3, 0, -21, + 0, 8, 12, 0, 5, 0, 0, 0, + 0, 1, 0, -7, -5, 0, -12, 0, + 0, 0, -4, 0, 0, 0, -4, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + -5, 0, 0, 0, 0, 0, 0, 0, + -4, -4, 0, -3, -5, -3, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, -3, 0, -5, + 0, -3, 0, -8, 4, 0, 0, -5, + 2, 4, 4, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 3, + 0, 0, -4, 0, -4, -3, -5, 0, + 0, 0, 0, 0, 0, 0, 3, 0, + -3, 0, 0, 0, 0, -5, -6, 0, + -8, 0, 12, -3, 1, -13, 0, 0, + 11, -21, -22, -17, -8, 4, 0, -3, + -27, -7, 0, -7, 0, -8, 6, -7, + -27, 0, -11, 0, 0, 2, -1, 3, + -3, 0, 4, 0, -12, -16, 0, -21, + -10, -9, -10, -12, -5, -11, -1, -8, + -11, 2, 0, 1, 0, -4, 0, 0, + 0, 3, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, -2, 0, -1, -4, 0, -7, -9, + -9, -1, 0, -12, 0, 0, 0, 0, + 0, 0, -3, 0, 0, 0, 0, 2, + -2, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 20, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + -8, 0, 0, 0, 0, -21, -12, 0, + 0, 0, -6, -21, 0, 0, -4, 4, + 0, -11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, -7, 0, + 0, 0, 0, 5, 0, 3, -8, -8, + 0, -4, -4, -5, 0, 0, 0, 0, + 0, 0, -12, 0, -4, 0, -6, -4, + 0, -9, -10, -12, -3, 0, -8, 0, + -12, 0, 0, 0, 0, 33, 0, 0, + 2, 0, 0, -5, 0, 4, 0, -18, + 0, 0, 0, 0, 0, -39, -7, 14, + 12, -3, -17, 0, 4, -6, 0, -21, + -2, -5, 4, -29, -4, 5, 0, 6, + -15, -6, -15, -14, -17, 0, 0, -25, + 0, 24, 0, 0, -2, 0, 0, 0, + -2, -2, -4, -11, -14, -1, -39, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, -2, -4, -6, 0, 0, + -8, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -8, 0, 0, 8, + -1, 5, 0, -9, 4, -3, -1, -11, + -4, 0, -5, -4, -3, 0, -6, -7, + 0, 0, -3, -1, -3, -7, -5, 0, + 0, -4, 0, 4, -3, 0, -9, 0, + 0, 0, -8, 0, -7, 0, -7, -7, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 4, 0, -6, 0, -3, -5, + -13, -3, -3, -3, -1, -3, -5, -1, + 0, 0, 0, 0, 0, -4, -3, -3, + 0, 0, 0, 0, 5, -3, 0, -3, + 0, 0, 0, -3, -5, -3, -4, -5, + -4, 0, 3, 17, -1, 0, -11, 0, + -3, 8, 0, -4, -17, -5, 6, 0, + 0, -20, -7, 4, -7, 3, 0, -3, + -3, -13, 0, -6, 2, 0, 0, -7, + 0, 0, 0, 4, 4, -8, -8, 0, + -7, -4, -6, -4, -4, 0, -7, 2, + -8, -7, 12, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, -5, + 0, 0, -4, -4, 0, 0, 0, 0, + -4, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, -3, 0, 0, 0, 0, + -6, 0, -8, 0, 0, 0, -14, 0, + 3, -9, 8, 1, -3, -20, 0, 0, + -9, -4, 0, -17, -10, -12, 0, 0, + -18, -4, -17, -16, -20, 0, -11, 0, + 3, 28, -5, 0, -10, -4, -1, -4, + -7, -11, -7, -15, -17, -10, -4, 0, + 0, -3, 0, 1, 0, 0, -29, -4, + 12, 9, -9, -15, 0, 1, -13, 0, + -21, -3, -4, 8, -38, -5, 1, 0, + 0, -27, -5, -22, -4, -30, 0, 0, + -29, 0, 25, 1, 0, -3, 0, 0, + 0, 0, -2, -3, -16, -3, 0, -27, + 0, 0, 0, 0, -13, 0, -4, 0, + -1, -12, -20, 0, 0, -2, -6, -12, + -4, 0, -3, 0, 0, 0, 0, -19, + -4, -14, -13, -3, -7, -10, -4, -7, + 0, -8, -4, -14, -6, 0, -5, -8, + -4, -8, 0, 2, 0, -3, -14, 0, + 8, 0, -7, 0, 0, 0, 0, 5, + 0, 3, -8, 17, 0, -4, -4, -5, + 0, 0, 0, 0, 0, 0, -12, 0, + -4, 0, -6, -4, 0, -9, -10, -12, + -3, 0, -8, 3, 17, 0, 0, 0, + 0, 33, 0, 0, 2, 0, 0, -5, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -3, -8, 0, 0, 0, 0, 0, -2, + 0, 0, 0, -4, -4, 0, 0, -8, + -4, 0, 0, -8, 0, 7, -2, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 6, 8, 3, -4, 0, -13, + -7, 0, 12, -14, -13, -8, -8, 17, + 7, 4, -36, -3, 8, -4, 0, -4, + 5, -4, -15, 0, -4, 4, -5, -3, + -12, -3, 0, 0, 12, 8, 0, -12, + 0, -23, -5, 12, -5, -16, 1, -5, + -14, -14, -4, 17, 4, 0, -6, 0, + -11, 0, 3, 14, -10, -15, -17, -10, + 12, 0, 1, -30, -3, 4, -7, -3, + -10, 0, -9, -15, -6, -6, -3, 0, + 0, -10, -9, -4, 0, 12, 10, -4, + -23, 0, -23, -6, 0, -15, -24, -1, + -13, -7, -14, -12, 11, 0, 0, -5, + 0, -8, -4, 0, -4, -7, 0, 7, + -14, 4, 0, 0, -22, 0, -4, -9, + -7, -3, -12, -10, -14, -10, 0, -12, + -4, -10, -8, -12, -4, 0, 0, 1, + 20, -7, 0, -12, -4, 0, -4, -8, + -10, -11, -12, -16, -5, -8, 8, 0, + -6, 0, -21, -5, 2, 8, -13, -15, + -8, -14, 14, -4, 2, -39, -7, 8, + -9, -7, -15, 0, -12, -17, -5, -4, + -3, -4, -9, -12, -1, 0, 0, 12, + 12, -3, -27, 0, -25, -10, 10, -16, + -28, -8, -15, -17, -21, -14, 8, 0, + 0, 0, 0, -5, 0, 0, 4, -5, + 8, 3, -8, 8, 0, 0, -13, -1, + 0, -1, 0, 1, 1, -3, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 3, 12, 1, 0, -5, 0, 0, + 0, 0, -3, -3, -5, 0, 0, 0, + 1, 3, 0, 0, 0, 0, 3, 0, + -3, 0, 16, 0, 7, 1, 1, -5, + 0, 8, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 0, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -25, 0, -4, 7, 0, 12, + 0, 0, 41, 5, -8, -8, 4, 4, + -3, 1, -21, 0, 0, 20, -25, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -28, 16, 58, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -25, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -8, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, -11, 0, + 0, 1, 0, 0, 4, 54, -8, -3, + 13, 11, -11, 4, 0, 0, 4, 4, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -54, 12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -12, + 0, 0, 0, -11, 0, 0, 0, 0, + -9, -2, 0, 0, 0, -9, 0, -5, + 0, -20, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -28, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -4, 0, 0, -8, 0, -6, 0, + -11, 0, 0, 0, -7, 4, -5, 0, + 0, -11, -4, -10, 0, 0, -11, 0, + -4, 0, -20, 0, -5, 0, 0, -34, + -8, -17, -5, -15, 0, 0, -28, 0, + -11, -2, 0, 0, 0, 0, 0, 0, + 0, 0, -6, -7, -3, -7, 0, 0, + 0, 0, -9, 0, -9, 5, -5, 8, + 0, -3, -10, -3, -7, -8, 0, -5, + -2, -3, 3, -11, -1, 0, 0, 0, + -37, -3, -6, 0, -9, 0, -3, -20, + -4, 0, 0, -3, -3, 0, 0, 0, + 0, 3, 0, -3, -7, -3, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 0, + 0, -9, 0, -3, 0, 0, 0, -8, + 4, 0, 0, 0, -11, -4, -8, 0, + 0, -12, 0, -4, 0, -20, 0, 0, + 0, 0, -40, 0, -8, -15, -21, 0, + 0, -28, 0, -3, -6, 0, 0, 0, + 0, 0, 0, 0, 0, -4, -6, -2, + -6, 1, 0, 0, 7, -5, 0, 13, + 20, -4, -4, -12, 5, 20, 7, 9, + -11, 5, 17, 5, 12, 9, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 26, 20, -7, -4, 0, -3, + 33, 18, 33, 0, 0, 0, 4, 0, + 0, 15, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 6, + 0, 0, 0, 0, -35, -5, -3, -17, + -20, 0, 0, -28, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, -35, -5, -3, + -17, -20, 0, 0, -17, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, -10, 4, 0, -4, + 3, 7, 4, -12, 0, -1, -3, 4, + 0, 3, 0, 0, 0, 0, -10, 0, + -4, -3, -8, 0, -4, -17, 0, 26, + -4, 0, -9, -3, 0, -3, -7, 0, + -4, -12, -8, -5, 0, 0, 0, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, -35, + -5, -3, -17, -20, 0, 0, -28, 0, + 0, 0, 0, 0, 0, 21, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7, 0, -13, -5, -4, 12, -4, -4, + -17, 1, -2, 1, -3, -11, 1, 9, + 1, 3, 1, 3, -10, -17, -5, 0, + -16, -8, -11, -17, -16, 0, -7, -8, + -5, -5, -3, -3, -5, -3, 0, -3, + -1, 6, 0, 6, -3, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, -4, -4, 0, 0, + -11, 0, -2, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -25, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -5, + 0, 0, 0, 0, -3, 0, 0, -7, + -4, 4, 0, -7, -8, -3, 0, -12, + -3, -9, -3, -5, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -28, 0, 13, 0, 0, -7, 0, + 0, 0, 0, -5, 0, -4, 0, 0, + -2, 0, 0, -3, 0, -10, 0, 0, + 17, -5, -14, -13, 3, 5, 5, -1, + -12, 3, 6, 3, 12, 3, 14, -3, + -11, 0, 0, -17, 0, 0, -12, -11, + 0, 0, -8, 0, -5, -7, 0, -6, + 0, -6, 0, -3, 6, 0, -3, -12, + -4, 15, 0, 0, -4, 0, -8, 0, + 0, 5, -10, 0, 4, -4, 3, 0, + 0, -14, 0, -3, -1, 0, -4, 5, + -3, 0, 0, 0, -17, -5, -9, 0, + -12, 0, 0, -20, 0, 15, -4, 0, + -7, 0, 2, 0, -4, 0, -4, -12, + 0, -4, 4, 0, 0, 0, 0, -3, + 0, 0, 4, -5, 1, 0, 0, -5, + -3, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -26, 0, 9, 0, + 0, -3, 0, 0, 0, 0, 1, 0, + -4, -4, 0, 0, 0, 8, 0, 10, + 0, 0, 0, 0, 0, -26, -24, 1, + 18, 12, 7, -17, 3, 17, 0, 15, + 0, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserrat_26 = { +#else +lv_font_t lv_font_montserrat_26 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 29, /*The maximum line height required by the font*/ + .base_line = 5, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_26*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_28.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_28.c new file mode 100644 index 0000000..0ae2d7e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_28.c @@ -0,0 +1,5150 @@ +/******************************************************************************* + * Size: 28 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 28 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_28.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_28 + #define LV_FONT_MONTSERRAT_28 1 +#endif + +#if LV_FONT_MONTSERRAT_28 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xc, 0xff, 0x50, 0xcf, 0xf4, 0xb, 0xff, 0x30, + 0xaf, 0xf3, 0xa, 0xff, 0x20, 0x9f, 0xf2, 0x9, + 0xff, 0x10, 0x8f, 0xf0, 0x7, 0xff, 0x0, 0x7f, + 0xf0, 0x6, 0xfe, 0x0, 0x6f, 0xe0, 0x5, 0xfd, + 0x0, 0x27, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x86, 0x0, 0xdf, 0xf6, 0xf, 0xff, 0x80, + 0x6f, 0xc1, + + /* U+0022 "\"" */ + 0x3f, 0xf1, 0x2, 0xff, 0x23, 0xff, 0x10, 0x2f, + 0xf2, 0x2f, 0xf0, 0x1, 0xff, 0x12, 0xff, 0x0, + 0x1f, 0xf1, 0x2f, 0xf0, 0x1, 0xff, 0x11, 0xff, + 0x0, 0xf, 0xf0, 0x1f, 0xf0, 0x0, 0xff, 0x0, + 0x98, 0x0, 0x9, 0x90, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0xaf, 0x50, 0x0, 0x6, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xf3, 0x0, 0x0, + 0x7f, 0x80, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, + 0x0, 0x9, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x0, 0xbf, 0x40, 0x0, 0x0, 0x0, + 0x1, 0xfd, 0x0, 0x0, 0xd, 0xf2, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8f, 0x80, 0x0, + 0x4, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf6, + 0x0, 0x0, 0x5f, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x40, 0x0, 0x7, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xf2, 0x0, 0x0, 0x9f, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0xa, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xe0, 0x0, 0x0, + 0xcf, 0x30, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x7, 0xf8, 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0x60, 0x0, 0x4, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xf4, 0x0, 0x0, 0x6f, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x20, 0x0, + 0x8, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, + 0x0, 0x0, 0xaf, 0x50, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8c, 0xef, 0xff, 0xd9, 0x40, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x5, 0xff, 0xfc, 0x8f, 0xd7, 0xae, 0xff, 0x10, + 0xe, 0xff, 0x50, 0xf, 0xc0, 0x0, 0x59, 0x0, + 0x4f, 0xf9, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x5f, 0xf6, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x4f, 0xfa, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x80, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xbf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xfe, 0x94, 0x0, 0x0, + 0x0, 0x1, 0x6b, 0xff, 0xff, 0xff, 0xc3, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xed, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x3c, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0xdf, 0xf1, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x8f, 0xf3, + 0x4, 0x0, 0x0, 0xf, 0xc0, 0x0, 0xbf, 0xf1, + 0x5f, 0xa2, 0x0, 0xf, 0xc0, 0x5, 0xff, 0xc0, + 0xaf, 0xff, 0xc8, 0x7f, 0xd8, 0xcf, 0xff, 0x30, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x17, 0xbe, 0xff, 0xff, 0xc7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x7d, 0xfe, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x30, 0x0, 0xa, 0xfd, 0x9c, 0xfc, 0x0, + 0x0, 0x0, 0x9, 0xf9, 0x0, 0x0, 0x4f, 0xb0, + 0x0, 0x8f, 0x70, 0x0, 0x0, 0x4f, 0xd0, 0x0, + 0x0, 0xbf, 0x30, 0x0, 0xf, 0xd0, 0x0, 0x0, + 0xdf, 0x30, 0x0, 0x0, 0xef, 0x0, 0x0, 0xc, + 0xf1, 0x0, 0x9, 0xf9, 0x0, 0x0, 0x0, 0xfe, + 0x0, 0x0, 0xa, 0xf1, 0x0, 0x4f, 0xd0, 0x0, + 0x0, 0x0, 0xef, 0x0, 0x0, 0xc, 0xf1, 0x0, + 0xef, 0x30, 0x0, 0x0, 0x0, 0xbf, 0x30, 0x0, + 0xf, 0xd0, 0x9, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xb0, 0x0, 0x8f, 0x70, 0x4f, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xfd, 0x9c, 0xfc, 0x0, + 0xef, 0x30, 0x5, 0x88, 0x50, 0x0, 0x0, 0x7d, + 0xfe, 0x80, 0x9, 0xf8, 0x1, 0xcf, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xd0, 0xb, + 0xf9, 0x11, 0x8f, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0x30, 0x2f, 0xc0, 0x0, 0xc, 0xf3, 0x0, + 0x0, 0x0, 0x9, 0xf8, 0x0, 0x6f, 0x60, 0x0, + 0x6, 0xf7, 0x0, 0x0, 0x0, 0x4f, 0xd0, 0x0, + 0x8f, 0x40, 0x0, 0x4, 0xf8, 0x0, 0x0, 0x1, + 0xef, 0x30, 0x0, 0x7f, 0x50, 0x0, 0x5, 0xf8, + 0x0, 0x0, 0xa, 0xf8, 0x0, 0x0, 0x4f, 0x80, + 0x0, 0x8, 0xf5, 0x0, 0x0, 0x4f, 0xd0, 0x0, + 0x0, 0xe, 0xe1, 0x0, 0x1e, 0xe0, 0x0, 0x1, + 0xef, 0x30, 0x0, 0x0, 0x4, 0xfe, 0x87, 0xef, + 0x40, 0x0, 0xa, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x3b, 0xff, 0xb3, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x19, 0xdf, 0xfd, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xfe, 0x40, 0x5, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x3f, 0xf5, 0x0, 0x0, + 0x9f, 0xc0, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, + 0x0, 0x8f, 0xc0, 0x0, 0x0, 0x0, 0x2f, 0xf7, + 0x0, 0x1, 0xef, 0x80, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x20, 0x2d, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xd8, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xcf, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x8f, 0xfd, 0x10, + 0x0, 0x24, 0x0, 0x6, 0xff, 0xa1, 0x5, 0xff, + 0xd1, 0x0, 0x9f, 0xb0, 0x2f, 0xfb, 0x0, 0x0, + 0x5f, 0xfd, 0x10, 0xdf, 0x70, 0x8f, 0xf2, 0x0, + 0x0, 0x5, 0xff, 0xd6, 0xff, 0x30, 0xbf, 0xe0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfb, 0x0, 0xaf, + 0xf1, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf5, 0x0, + 0x6f, 0xfa, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, + 0x10, 0xd, 0xff, 0xe7, 0x54, 0x59, 0xef, 0xfb, + 0xff, 0xd1, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x5f, 0xf8, 0x0, 0x4, 0x9d, 0xff, 0xeb, + 0x60, 0x0, 0x5, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x3f, 0xf1, 0x3f, 0xf1, 0x2f, 0xf0, 0x2f, 0xf0, + 0x2f, 0xf0, 0x1f, 0xf0, 0x1f, 0xf0, 0x9, 0x80, + + /* U+0028 "(" */ + 0x0, 0x4, 0xff, 0x40, 0x0, 0xcf, 0xc0, 0x0, + 0x4f, 0xf5, 0x0, 0xb, 0xfe, 0x0, 0x0, 0xff, + 0x90, 0x0, 0x5f, 0xf4, 0x0, 0x9, 0xff, 0x0, + 0x0, 0xcf, 0xd0, 0x0, 0xf, 0xfa, 0x0, 0x2, + 0xff, 0x70, 0x0, 0x3f, 0xf6, 0x0, 0x4, 0xff, + 0x60, 0x0, 0x5f, 0xf5, 0x0, 0x5, 0xff, 0x50, + 0x0, 0x4f, 0xf6, 0x0, 0x3, 0xff, 0x60, 0x0, + 0x2f, 0xf7, 0x0, 0x0, 0xff, 0xa0, 0x0, 0xc, + 0xfd, 0x0, 0x0, 0x9f, 0xf0, 0x0, 0x5, 0xff, + 0x40, 0x0, 0xf, 0xf9, 0x0, 0x0, 0xaf, 0xe0, + 0x0, 0x4, 0xff, 0x50, 0x0, 0xc, 0xfc, 0x0, + 0x0, 0x4f, 0xf4, + + /* U+0029 ")" */ + 0xd, 0xfb, 0x0, 0x0, 0x6f, 0xf3, 0x0, 0x0, + 0xdf, 0xb0, 0x0, 0x7, 0xff, 0x20, 0x0, 0x2f, + 0xf7, 0x0, 0x0, 0xdf, 0xc0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x6f, 0xf3, 0x0, 0x3, 0xff, 0x60, + 0x0, 0xf, 0xf9, 0x0, 0x0, 0xff, 0xa0, 0x0, + 0xe, 0xfb, 0x0, 0x0, 0xdf, 0xc0, 0x0, 0xd, + 0xfc, 0x0, 0x0, 0xef, 0xb0, 0x0, 0xf, 0xfa, + 0x0, 0x0, 0xff, 0x90, 0x0, 0x3f, 0xf6, 0x0, + 0x6, 0xff, 0x30, 0x0, 0x8f, 0xf0, 0x0, 0xd, + 0xfc, 0x0, 0x2, 0xff, 0x70, 0x0, 0x7f, 0xf2, + 0x0, 0xd, 0xfb, 0x0, 0x6, 0xff, 0x30, 0x0, + 0xdf, 0xb0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x3f, 0x60, 0x0, 0x0, 0x0, 0x3, + 0xf6, 0x0, 0x0, 0x1e, 0x80, 0x3f, 0x60, 0x7e, + 0x33, 0xdf, 0xe9, 0xfa, 0xdf, 0xe5, 0x0, 0x7e, + 0xff, 0xff, 0x91, 0x0, 0x1, 0xaf, 0xff, 0xc2, + 0x0, 0x7, 0xef, 0xef, 0xef, 0xf9, 0x13, 0xfe, + 0x63, 0xf6, 0x4d, 0xf6, 0x6, 0x10, 0x3f, 0x60, + 0x6, 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x17, 0x30, 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x44, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x50, 0x0, 0x0, 0x3, 0x33, 0x33, 0xff, 0x73, + 0x33, 0x31, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x50, 0x0, 0x0, + + /* U+002C "," */ + 0x1a, 0xb4, 0x8, 0xff, 0xe0, 0x9f, 0xff, 0x2, + 0xdf, 0xc0, 0xa, 0xf6, 0x0, 0xef, 0x10, 0x2f, + 0xc0, 0x6, 0xf6, 0x0, + + /* U+002D "-" */ + 0x25, 0x55, 0x55, 0x55, 0x6, 0xff, 0xff, 0xff, + 0xf2, 0x6f, 0xff, 0xff, 0xff, 0x20, + + /* U+002E "." */ + 0x1a, 0xc4, 0x9, 0xff, 0xe0, 0xaf, 0xff, 0x2, + 0xde, 0x60, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x5, 0x86, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0x70, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x20, 0x0, 0x0, 0x0, 0xa, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xa0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x50, 0x0, 0x0, 0x0, 0x7, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0x90, 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x9, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xd0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x7, 0xcf, 0xfe, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x4f, 0xff, 0xd9, 0x8a, 0xff, 0xfd, + 0x10, 0x0, 0x1e, 0xff, 0x70, 0x0, 0x1, 0xbf, + 0xfa, 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xdf, 0xf3, 0x0, 0xef, 0xe0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0x90, 0x3f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xfe, 0x7, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf1, 0x9f, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x3a, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf4, 0xaf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x49, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x7f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x13, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xef, 0xe0, 0xe, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, + 0x8f, 0xf8, 0x0, 0x0, 0x0, 0xd, 0xff, 0x30, + 0x1, 0xef, 0xf7, 0x0, 0x0, 0x1b, 0xff, 0xa0, + 0x0, 0x4, 0xff, 0xfd, 0x98, 0xaf, 0xff, 0xd1, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xeb, 0x50, + 0x0, 0x0, + + /* U+0031 "1" */ + 0xcf, 0xff, 0xff, 0xf6, 0xcf, 0xff, 0xff, 0xf6, + 0x57, 0x77, 0xaf, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + + /* U+0032 "2" */ + 0x0, 0x3, 0x8c, 0xef, 0xfc, 0x82, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x2e, 0xff, 0xfb, 0x98, 0xae, 0xff, 0xf5, 0x0, + 0x2d, 0xf9, 0x10, 0x0, 0x0, 0x8f, 0xfe, 0x0, + 0x1, 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xfa, 0x77, 0x77, 0x77, 0x77, 0x70, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + + /* U+0033 "3" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x6, + 0x77, 0x77, 0x77, 0x77, 0xdf, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf9, 0x61, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x3, 0x88, 0xad, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xa0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf8, + 0x3f, 0xc4, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x2a, + 0xff, 0xfe, 0xa8, 0x89, 0xdf, 0xff, 0x70, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x1, + 0x6a, 0xdf, 0xfe, 0xc7, 0x20, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xa0, 0x0, 0xa, 0xb7, 0x0, + 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x0, 0xf, 0xfa, + 0x0, 0x0, 0x1, 0xef, 0xf2, 0x0, 0x0, 0xf, + 0xfa, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, + 0xf, 0xfa, 0x0, 0x0, 0x8f, 0xfd, 0x66, 0x66, + 0x66, 0x6f, 0xfc, 0x66, 0x62, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xfa, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x4f, 0xf9, 0x77, 0x77, 0x77, 0x77, 0x0, + 0x0, 0x6f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xec, 0x94, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x77, 0x77, 0x77, 0x9c, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf0, + 0x3, 0x10, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd0, + 0xd, 0xe6, 0x0, 0x0, 0x0, 0x2c, 0xff, 0x70, + 0x5f, 0xff, 0xfb, 0x98, 0x9b, 0xff, 0xfd, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x0, 0x4, 0x9c, 0xef, 0xed, 0x94, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x2, 0x8c, 0xef, 0xfd, 0xa4, 0x0, + 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x1d, 0xff, 0xfb, 0x86, 0x89, 0xed, 0x0, + 0x0, 0xcf, 0xfb, 0x20, 0x0, 0x0, 0x2, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf3, 0x5, 0xae, 0xfe, 0xd8, 0x20, 0x0, + 0xaf, 0xf3, 0xbf, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0xaf, 0xfd, 0xff, 0x95, 0x46, 0xaf, 0xff, 0x60, + 0x9f, 0xff, 0xd1, 0x0, 0x0, 0x4, 0xff, 0xe0, + 0x7f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xf5, + 0x4f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf7, + 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf6, + 0xa, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xf4, + 0x2, 0xff, 0xd1, 0x0, 0x0, 0x4, 0xff, 0xd0, + 0x0, 0x7f, 0xff, 0x95, 0x45, 0xaf, 0xff, 0x40, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x17, 0xce, 0xfe, 0xc7, 0x10, 0x0, + + /* U+0037 "7" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x2f, 0xfb, 0x77, 0x77, 0x77, 0x77, 0xcf, 0xf5, + 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, + 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x6, 0xff, 0x70, + 0x2f, 0xf8, 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x5a, 0xdf, 0xfd, 0xa6, 0x0, 0x0, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x2, 0xef, 0xfd, 0x75, 0x57, 0xdf, 0xff, 0x20, + 0xa, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xa0, + 0xe, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, + 0xf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf0, + 0xf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf0, + 0xa, 0xff, 0x50, 0x0, 0x0, 0x5, 0xff, 0xa0, + 0x1, 0xef, 0xfa, 0x42, 0x25, 0xaf, 0xfe, 0x10, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xb, 0xff, 0xc5, 0x20, 0x2, 0x6d, 0xff, 0xb0, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf5, + 0xaf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfa, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, + 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfa, + 0x4f, 0xfd, 0x20, 0x0, 0x0, 0x2, 0xdf, 0xf5, + 0xa, 0xff, 0xfa, 0x64, 0x56, 0xaf, 0xff, 0xb0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x2, 0x7c, 0xef, 0xfe, 0xc7, 0x20, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x5b, 0xef, 0xed, 0x93, 0x0, 0x0, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x1, 0xdf, 0xfc, 0x64, 0x58, 0xdf, 0xfa, 0x0, + 0x9, 0xff, 0x80, 0x0, 0x0, 0xa, 0xff, 0x60, + 0xf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xef, 0xe0, + 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf5, + 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf9, + 0xf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfc, + 0xa, 0xff, 0x80, 0x0, 0x0, 0xa, 0xff, 0xfd, + 0x2, 0xff, 0xfd, 0x75, 0x58, 0xdf, 0xee, 0xfe, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xfe, 0x3e, 0xfe, + 0x0, 0x0, 0x7c, 0xef, 0xeb, 0x60, 0xf, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x10, + 0x0, 0x8f, 0xa8, 0x67, 0xae, 0xff, 0xf3, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x0, 0x39, 0xcf, 0xff, 0xd9, 0x40, 0x0, 0x0, + + /* U+003A ":" */ + 0x2d, 0xe6, 0xa, 0xff, 0xf0, 0x9f, 0xfe, 0x1, + 0xac, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xac, 0x40, 0x9f, 0xfe, + 0xa, 0xff, 0xf0, 0x2d, 0xe6, 0x0, + + /* U+003B ";" */ + 0x2d, 0xe6, 0xa, 0xff, 0xf0, 0x9f, 0xfe, 0x1, + 0xac, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xab, 0x40, 0x8f, 0xfe, + 0x9, 0xff, 0xf0, 0x2d, 0xfc, 0x0, 0xaf, 0x60, + 0xe, 0xf1, 0x2, 0xfc, 0x0, 0x6f, 0x60, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x96, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xdf, 0xf6, 0x0, 0x0, + 0x0, 0x3a, 0xff, 0xff, 0xb2, 0x0, 0x1, 0x7d, + 0xff, 0xfd, 0x71, 0x0, 0x4, 0xaf, 0xff, 0xfa, + 0x30, 0x0, 0x0, 0x2f, 0xff, 0xc6, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfe, 0x61, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, + 0x0, 0x16, 0xdf, 0xff, 0xd7, 0x10, 0x0, 0x0, + 0x0, 0x3, 0x9f, 0xff, 0xfb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x6c, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x39, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, + + /* U+003D "=" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x3, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x31, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+003E ">" */ + 0x1b, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, 0x9, 0xef, + 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xe9, 0x20, 0x0, 0x0, 0x0, 0x2, 0x8e, + 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x4a, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, + 0xf6, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, 0xc3, + 0x0, 0x0, 0x5c, 0xff, 0xfe, 0x82, 0x0, 0x3, + 0x9f, 0xff, 0xfb, 0x50, 0x0, 0x0, 0x1f, 0xff, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x2f, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x4, 0x9d, 0xef, 0xfc, 0x92, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x3e, + 0xff, 0xe9, 0x76, 0x8d, 0xff, 0xf6, 0x4, 0xef, + 0x70, 0x0, 0x0, 0x7, 0xff, 0xe0, 0x1, 0x50, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xaa, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x18, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xed, 0x10, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, 0xfe, + 0xb8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xcf, 0xff, 0xfe, 0xde, 0xff, 0xff, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xd7, + 0x20, 0x0, 0x0, 0x26, 0xcf, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x1d, 0xfe, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0xfd, 0x10, 0x0, 0x0, 0x1d, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xfd, 0x10, 0x0, 0xa, 0xfc, 0x0, 0x0, + 0x18, 0xdf, 0xfd, 0x81, 0xf, 0xf8, 0xb, 0xfa, + 0x0, 0x3, 0xff, 0x20, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xe4, 0xff, 0x80, 0x1e, 0xf3, 0x0, 0xbf, + 0x80, 0x0, 0x4f, 0xff, 0x83, 0x35, 0xbf, 0xff, + 0xf8, 0x0, 0x6f, 0xb0, 0x1f, 0xf1, 0x0, 0xe, + 0xfe, 0x20, 0x0, 0x0, 0x6f, 0xff, 0x80, 0x0, + 0xef, 0x15, 0xfc, 0x0, 0x5, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xaf, 0xf8, 0x0, 0xa, 0xf4, 0x8f, + 0x80, 0x0, 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x80, 0x0, 0x7f, 0x79, 0xf7, 0x0, 0xd, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf8, 0x0, + 0x5, 0xf8, 0xaf, 0x60, 0x0, 0xef, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xef, 0x80, 0x0, 0x4f, 0x99, + 0xf7, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf8, 0x0, 0x5, 0xf8, 0x7f, 0x90, 0x0, + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x80, + 0x0, 0x7f, 0x75, 0xfc, 0x0, 0x5, 0xff, 0x40, + 0x0, 0x0, 0x0, 0xaf, 0xf8, 0x0, 0xa, 0xf4, + 0x1f, 0xf1, 0x0, 0xe, 0xfe, 0x20, 0x0, 0x0, + 0x6f, 0xff, 0x90, 0x1, 0xff, 0x0, 0xbf, 0x80, + 0x0, 0x4f, 0xff, 0x83, 0x24, 0xaf, 0xfc, 0xff, + 0x53, 0xcf, 0x80, 0x3, 0xff, 0x20, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xe4, 0x4f, 0xff, 0xff, 0xc0, + 0x0, 0xa, 0xfc, 0x0, 0x0, 0x18, 0xcf, 0xfd, + 0x81, 0x0, 0x5d, 0xfe, 0x80, 0x0, 0x0, 0xd, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xd7, 0x30, 0x0, + 0x0, 0x37, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xcf, 0xff, 0xfe, 0xee, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x37, 0xbe, 0xff, 0xfd, 0xa6, 0x10, 0x0, 0x0, + 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe9, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x81, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x10, 0xaf, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, + 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0xc, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xd0, 0x0, 0x6, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x60, + 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfe, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf8, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x33, 0x33, 0x33, 0x3c, 0xff, 0x30, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, 0x0, + 0x0, 0x7f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xfe, 0x0, 0x0, 0xef, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x60, 0x5, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xd0, 0xc, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf4, + + /* U+0042 "B" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xa5, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x1f, 0xfc, 0x44, 0x44, 0x44, 0x69, + 0xff, 0xfd, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0x60, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xa0, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x40, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x14, 0xbf, 0xfb, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x1f, 0xfc, 0x44, 0x44, 0x44, + 0x45, 0x8e, 0xff, 0xa0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf7, 0x1f, 0xfc, 0x44, 0x44, 0x44, 0x45, 0x8e, + 0xff, 0xe1, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x20, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xda, 0x50, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x38, 0xce, 0xfe, 0xda, 0x50, + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x0, 0x5, 0xff, 0xff, 0xda, + 0x89, 0xbf, 0xff, 0xf8, 0x0, 0x5, 0xff, 0xfb, + 0x30, 0x0, 0x0, 0x6, 0xef, 0xb0, 0x1, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2, 0x80, 0x0, + 0xaf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x29, 0x0, + 0x0, 0x5f, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x6e, + 0xfb, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0xa8, 0x8a, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x3, + 0x8c, 0xef, 0xed, 0xa5, 0x0, 0x0, + + /* U+0044 "D" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xec, 0x94, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x1f, 0xfd, 0x77, 0x77, + 0x77, 0x9c, 0xff, 0xff, 0x80, 0x0, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xf8, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x40, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xc0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf3, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf7, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfa, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xfc, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfa, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf7, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf3, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xc0, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xf8, 0x0, 0x1f, 0xfd, 0x77, 0x77, 0x77, 0x9c, + 0xff, 0xff, 0x80, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xec, 0x94, 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x1f, 0xfd, 0x77, 0x77, 0x77, 0x77, 0x77, 0x50, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x1f, 0xfd, 0x66, 0x66, 0x66, 0x66, 0x63, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfd, 0x77, 0x77, 0x77, 0x77, 0x77, 0x71, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + + /* U+0046 "F" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1f, + 0xfd, 0x77, 0x77, 0x77, 0x77, 0x77, 0x51, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xd6, 0x66, 0x66, + 0x66, 0x66, 0x30, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xda, 0x61, + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x5, 0xff, 0xff, 0xda, + 0x88, 0xae, 0xff, 0xfb, 0x0, 0x4, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x4, 0xdf, 0xd1, 0x1, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x81, 0x0, + 0x9f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0xaf, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x38, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x5f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x31, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf3, 0x9, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x30, 0x1f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf3, + 0x0, 0x4f, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x3c, + 0xff, 0x30, 0x0, 0x5f, 0xff, 0xfd, 0xa8, 0x89, + 0xdf, 0xff, 0xe1, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x3, + 0x8c, 0xef, 0xfd, 0xa6, 0x10, 0x0, + + /* U+0048 "H" */ + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x1f, 0xfd, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x7f, 0xfc, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xfc, + + /* U+0049 "I" */ + 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, + 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, + 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, + 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, + 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, + + /* U+004A "J" */ + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x90, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x17, 0x77, + 0x77, 0x78, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x80, 0x6, 0x0, 0x0, 0x0, 0x8f, 0xf6, + 0xa, 0xf8, 0x0, 0x0, 0x1f, 0xff, 0x11, 0xdf, + 0xfd, 0x86, 0x8e, 0xff, 0xa0, 0x2, 0xcf, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x5b, 0xef, 0xeb, + 0x60, 0x0, + + /* U+004B "K" */ + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xe2, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xf3, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xf4, 0x0, 0x1, 0xff, 0xb0, 0x0, + 0x0, 0x1, 0xdf, 0xf5, 0x0, 0x0, 0x1f, 0xfb, + 0x0, 0x0, 0x1, 0xdf, 0xf6, 0x0, 0x0, 0x1, + 0xff, 0xb0, 0x0, 0x0, 0xcf, 0xf7, 0x0, 0x0, + 0x0, 0x1f, 0xfb, 0x0, 0x0, 0xcf, 0xf8, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0xbf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0xbf, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, + 0xaf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xfb, 0x9f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xfe, 0x8f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfe, 0x20, 0x8f, 0xfe, + 0x10, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x20, 0x0, + 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xfe, 0x20, + 0x0, 0x0, 0xcf, 0xfa, 0x0, 0x0, 0x1, 0xff, + 0xb0, 0x0, 0x0, 0x1, 0xef, 0xf7, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf4, + 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xe2, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xd0, 0x1, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xb0, + + /* U+004C "L" */ + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xd7, 0x77, 0x77, 0x77, 0x77, 0x72, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x51, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + + /* U+004D "M" */ + 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xfc, 0x1f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfc, 0x1f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xfc, 0x1f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfc, 0x1f, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfc, 0x1f, + 0xfe, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfc, 0x1f, 0xfa, 0xcf, 0xe1, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x7e, 0xfc, 0x1f, 0xfa, 0x3f, + 0xf9, 0x0, 0x0, 0x0, 0xd, 0xfd, 0xe, 0xfc, + 0x1f, 0xfa, 0x9, 0xff, 0x20, 0x0, 0x0, 0x6f, + 0xf4, 0xe, 0xfc, 0x1f, 0xfa, 0x1, 0xff, 0xb0, + 0x0, 0x0, 0xef, 0xb0, 0xe, 0xfc, 0x1f, 0xfa, + 0x0, 0x7f, 0xf5, 0x0, 0x8, 0xff, 0x20, 0xe, + 0xfc, 0x1f, 0xfa, 0x0, 0xd, 0xfe, 0x0, 0x2f, + 0xf8, 0x0, 0xe, 0xfc, 0x1f, 0xfa, 0x0, 0x4, + 0xff, 0x70, 0xbf, 0xe0, 0x0, 0xe, 0xfc, 0x1f, + 0xfa, 0x0, 0x0, 0xaf, 0xf6, 0xff, 0x60, 0x0, + 0xe, 0xfc, 0x1f, 0xfa, 0x0, 0x0, 0x2f, 0xff, + 0xfc, 0x0, 0x0, 0xe, 0xfc, 0x1f, 0xfa, 0x0, + 0x0, 0x8, 0xff, 0xf3, 0x0, 0x0, 0xe, 0xfc, + 0x1f, 0xfa, 0x0, 0x0, 0x0, 0xef, 0xa0, 0x0, + 0x0, 0xe, 0xfc, 0x1f, 0xfa, 0x0, 0x0, 0x0, + 0x49, 0x10, 0x0, 0x0, 0xe, 0xfc, 0x1f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xfc, 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xfc, + + /* U+004E "N" */ + 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xfc, 0x1f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xfc, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfc, 0x1f, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfc, 0xdf, + 0xf9, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, + 0x2f, 0xff, 0x50, 0x0, 0x0, 0xf, 0xfc, 0x1f, + 0xfb, 0x5, 0xff, 0xf2, 0x0, 0x0, 0xf, 0xfc, + 0x1f, 0xfb, 0x0, 0x9f, 0xfd, 0x10, 0x0, 0xf, + 0xfc, 0x1f, 0xfb, 0x0, 0xc, 0xff, 0xb0, 0x0, + 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x1, 0xef, 0xf8, + 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x3f, + 0xff, 0x40, 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, + 0x6, 0xff, 0xf2, 0xf, 0xfc, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0xaf, 0xfd, 0xf, 0xfc, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xaf, 0xfc, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xfc, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xfc, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xda, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xda, 0x89, 0xbf, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x4f, 0xff, 0xb3, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xc0, 0x0, 0x1, 0xef, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xf9, 0x0, 0x9, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x20, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x90, 0x5f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd0, + 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf0, 0xaf, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf2, 0xaf, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf2, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf0, 0x5f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x90, 0x9, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x20, 0x1, 0xef, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xf9, 0x0, + 0x0, 0x4f, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xc0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xda, + 0x89, 0xbf, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xda, + 0x60, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xda, 0x50, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x1f, 0xfd, 0x77, 0x77, 0x78, 0xaf, 0xff, + 0xf3, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xd0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x51, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf9, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xb1, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xfb, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0x91, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf5, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x1, 0xff, 0xd7, + 0x77, 0x77, 0x7a, 0xff, 0xff, 0x30, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xa5, 0x0, 0x0, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x28, 0xce, 0xff, 0xda, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xda, 0x89, 0xbf, 0xff, 0xfb, + 0x10, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x1, 0xef, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xf8, + 0x0, 0x0, 0x9f, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf2, 0x0, 0xf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, + 0x5, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfd, 0x0, 0x8f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x9, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x20, 0xaf, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x8, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xd0, 0x1, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, + 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x20, 0x0, 0x2f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x90, 0x0, + 0x0, 0x5f, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x5e, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfc, + 0x87, 0x79, 0xef, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, + 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, + 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xa5, 0x46, 0xdf, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xce, 0xfd, 0x81, 0x0, + + /* U+0052 "R" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0x1f, 0xfd, 0x77, 0x77, 0x78, 0xaf, + 0xff, 0xf3, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfd, 0x0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x50, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0x90, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x90, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x50, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfe, 0x0, 0x1f, 0xfd, 0x66, 0x66, 0x67, + 0x9e, 0xff, 0xf3, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x30, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0xcf, 0xf3, 0x0, 0x0, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x6, 0xff, 0xa0, + 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf5, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xfe, 0x10, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xb0, + + /* U+0053 "S" */ + 0x0, 0x0, 0x6b, 0xdf, 0xfe, 0xc8, 0x30, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, + 0x4, 0xff, 0xfc, 0x86, 0x67, 0xbf, 0xff, 0x10, + 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, 0x69, 0x0, + 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xa6, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, + 0x0, 0x0, 0x6b, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x8c, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, + 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, + 0x5f, 0xb4, 0x0, 0x0, 0x0, 0x6, 0xff, 0xb0, + 0xaf, 0xff, 0xe9, 0x76, 0x68, 0xdf, 0xff, 0x30, + 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x5, 0x9d, 0xef, 0xed, 0xa5, 0x0, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x67, 0x77, 0x77, 0x8f, 0xfc, 0x77, 0x77, + 0x77, 0x20, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, + 0x0, 0x0, + + /* U+0055 "U" */ + 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xf5, 0x3f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x3f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x3f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x3f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf5, + 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xf5, 0x2f, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf4, 0xf, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf2, 0xc, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xef, 0xe0, 0x7, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x90, + 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x4f, 0xff, 0xea, 0x88, 0xae, 0xff, + 0xf5, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0x0, 0x0, 0x0, 0x6, 0xae, 0xff, + 0xeb, 0x60, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xc0, 0x6f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf5, 0x0, 0xef, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfe, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0x70, 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0xaf, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x0, 0x0, + 0x3, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x20, 0x0, 0x0, 0xc, 0xff, 0x30, 0x0, 0x0, + 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x5f, 0xfa, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf1, 0x0, 0x0, 0xe, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, 0x6, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfe, + 0x0, 0x0, 0xdf, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf5, 0x0, 0x4f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0xa, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x32, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfa, 0x8f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, + 0x0, 0x0, + + /* U+0057 "W" */ + 0xe, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x70, + 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf2, 0x4, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, 0x0, 0xe, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x70, 0x0, 0xaf, + 0xf3, 0x0, 0x0, 0x0, 0xe, 0xfb, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x8f, 0xf2, 0x0, 0x4, 0xff, + 0x90, 0x0, 0x0, 0x4, 0xff, 0x4b, 0xff, 0x0, + 0x0, 0x0, 0xd, 0xfd, 0x0, 0x0, 0xf, 0xfe, + 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x6f, 0xf5, 0x0, + 0x0, 0x2, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xf3, + 0x0, 0x0, 0xe, 0xfa, 0x1, 0xff, 0xa0, 0x0, + 0x0, 0x8f, 0xf2, 0x0, 0x0, 0x5, 0xff, 0x80, + 0x0, 0x4, 0xff, 0x40, 0xb, 0xff, 0x0, 0x0, + 0xd, 0xfd, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x0, + 0x0, 0xaf, 0xe0, 0x0, 0x6f, 0xf4, 0x0, 0x2, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xaf, 0xf3, 0x0, + 0xf, 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x8f, + 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, 0x80, 0x4, + 0xff, 0x40, 0x0, 0xb, 0xff, 0x0, 0xd, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x0, 0xaf, + 0xe0, 0x0, 0x0, 0x5f, 0xf4, 0x2, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf2, 0xf, 0xf9, + 0x0, 0x0, 0x0, 0xff, 0x90, 0x7f, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x85, 0xff, 0x40, + 0x0, 0x0, 0xb, 0xfe, 0xd, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xfd, 0xaf, 0xe0, 0x0, + 0x0, 0x0, 0x5f, 0xf7, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf3, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xf9, 0x0, 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x2f, 0xfd, 0x0, 0x0, 0x6f, 0xfc, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x30, 0x0, 0x0, 0xbf, 0xf7, + 0x0, 0x0, 0x8, 0xff, 0x70, 0x0, 0x0, 0x1, + 0xef, 0xf3, 0x0, 0x4, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xd0, 0x1, 0xef, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xa0, 0xaf, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xd2, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf2, + 0x6, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf7, 0x0, 0xa, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x6f, 0xfb, 0x0, 0x0, 0x1e, 0xff, 0x40, 0x0, + 0x0, 0x2f, 0xfe, 0x10, 0x0, 0x0, 0x3f, 0xfe, + 0x10, 0x0, 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x8f, 0xfa, 0x0, 0x9, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf6, 0x4, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, + + /* U+0059 "Y" */ + 0xc, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xe0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x50, 0x0, 0x9f, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x1e, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf2, 0x0, + 0x0, 0x6, 0xff, 0x90, 0x0, 0x0, 0x3, 0xff, + 0x80, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, + 0xd, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, + 0x0, 0x0, 0x6f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x50, 0x1, 0xef, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xe0, 0x9, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x3f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xdf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x39, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0xdf, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x74, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x9c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, + + /* U+005B "[" */ + 0x1f, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xfc, 0x1f, + 0xfb, 0x33, 0x21, 0xff, 0xa0, 0x0, 0x1f, 0xfa, + 0x0, 0x1, 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, + 0x1, 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x1, + 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x1, 0xff, + 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x1, 0xff, 0xa0, + 0x0, 0x1f, 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, + 0x1f, 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x1f, + 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x1f, 0xfa, + 0x0, 0x1, 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, + 0x1, 0xff, 0xb3, 0x32, 0x1f, 0xff, 0xff, 0xc1, + 0xff, 0xff, 0xfc, + + /* U+005C "\\" */ + 0x7, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x60, + + /* U+005D "]" */ + 0x7f, 0xff, 0xff, 0x67, 0xff, 0xff, 0xf6, 0x13, + 0x37, 0xff, 0x60, 0x0, 0x4f, 0xf6, 0x0, 0x4, + 0xff, 0x60, 0x0, 0x4f, 0xf6, 0x0, 0x4, 0xff, + 0x60, 0x0, 0x4f, 0xf6, 0x0, 0x4, 0xff, 0x60, + 0x0, 0x4f, 0xf6, 0x0, 0x4, 0xff, 0x60, 0x0, + 0x4f, 0xf6, 0x0, 0x4, 0xff, 0x60, 0x0, 0x4f, + 0xf6, 0x0, 0x4, 0xff, 0x60, 0x0, 0x4f, 0xf6, + 0x0, 0x4, 0xff, 0x60, 0x0, 0x4f, 0xf6, 0x0, + 0x4, 0xff, 0x60, 0x0, 0x4f, 0xf6, 0x0, 0x4, + 0xff, 0x60, 0x0, 0x4f, 0xf6, 0x0, 0x4, 0xff, + 0x61, 0x33, 0x7f, 0xf6, 0x7f, 0xff, 0xff, 0x67, + 0xff, 0xff, 0xf6, + + /* U+005E "^" */ + 0x0, 0x0, 0x7, 0x83, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x3f, 0xd7, 0xf9, + 0x0, 0x0, 0x0, 0xa, 0xf6, 0x1f, 0xf0, 0x0, + 0x0, 0x1, 0xff, 0x0, 0xaf, 0x60, 0x0, 0x0, + 0x8f, 0x90, 0x3, 0xfd, 0x0, 0x0, 0xe, 0xf2, + 0x0, 0xd, 0xf4, 0x0, 0x6, 0xfb, 0x0, 0x0, + 0x6f, 0xb0, 0x0, 0xdf, 0x40, 0x0, 0x0, 0xff, + 0x20, 0x4f, 0xd0, 0x0, 0x0, 0x9, 0xf9, 0xb, + 0xf7, 0x0, 0x0, 0x0, 0x2f, 0xf0, + + /* U+005F "_" */ + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x38, 0x87, 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, + 0x0, 0x2d, 0xfc, 0x10, 0x0, 0x0, 0xaf, 0xd1, + + /* U+0061 "a" */ + 0x0, 0x17, 0xbe, 0xff, 0xda, 0x40, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xd, 0xfe, + 0xa6, 0x56, 0xaf, 0xff, 0x60, 0x3, 0x70, 0x0, + 0x0, 0x2, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf4, 0x0, 0x28, 0xce, 0xef, 0xff, 0xff, + 0xf4, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x2f, 0xfe, 0x51, 0x0, 0x0, 0x6f, 0xf5, 0x7f, + 0xf4, 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x9f, 0xf1, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x7f, 0xf5, 0x0, + 0x0, 0x2, 0xff, 0xf5, 0x2f, 0xfe, 0x50, 0x1, + 0x6e, 0xff, 0xf5, 0x5, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xf5, 0x0, 0x29, 0xef, 0xfd, 0x92, 0x3f, + 0xf5, + + /* U+0062 "b" */ + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x5, 0xbe, 0xfd, 0xb5, 0x0, 0x0, + 0x7f, 0xf5, 0xcf, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x7f, 0xfe, 0xff, 0xa7, 0x68, 0xef, 0xff, 0x20, + 0x7f, 0xff, 0xd2, 0x0, 0x0, 0x9, 0xff, 0xd0, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xaf, 0xf5, + 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfa, + 0x7f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, + 0x7f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, + 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfa, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x7f, 0xff, 0xd2, 0x0, 0x0, 0x9, 0xff, 0xd0, + 0x7f, 0xfd, 0xff, 0xa7, 0x68, 0xef, 0xff, 0x20, + 0x7f, 0xf3, 0xcf, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x7f, 0xf2, 0x5, 0xbe, 0xfe, 0xb5, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x39, 0xdf, 0xfd, 0x93, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, + 0xdf, 0xfe, 0x96, 0x69, 0xff, 0xf8, 0x0, 0xbf, + 0xfa, 0x0, 0x0, 0x1, 0xcf, 0x80, 0x3f, 0xfc, + 0x0, 0x0, 0x0, 0x1, 0x20, 0x8, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, 0x0, 0x0, + 0x1, 0x20, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x1, + 0xcf, 0x80, 0x1, 0xdf, 0xfe, 0x96, 0x69, 0xff, + 0xf8, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x39, 0xdf, 0xfd, 0x93, 0x0, + 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x5a, 0xdf, 0xec, 0x60, 0x2f, 0xf8, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xfd, 0x4f, 0xf8, + 0x1, 0xef, 0xfe, 0x96, 0x6a, 0xff, 0xef, 0xf8, + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x1c, 0xff, 0xf8, + 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf8, + 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0x9f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, + 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf8, + 0xc, 0xff, 0x80, 0x0, 0x0, 0xb, 0xff, 0xf8, + 0x1, 0xef, 0xfc, 0x63, 0x47, 0xef, 0xef, 0xf8, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xf8, + 0x0, 0x0, 0x5b, 0xdf, 0xec, 0x70, 0xf, 0xf8, + + /* U+0065 "e" */ + 0x0, 0x0, 0x4b, 0xdf, 0xec, 0x61, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x1, + 0xef, 0xfb, 0x64, 0x59, 0xff, 0xf4, 0x0, 0xbf, + 0xf4, 0x0, 0x0, 0x2, 0xdf, 0xe1, 0x3f, 0xf6, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x69, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xfb, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xbf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0xbf, 0xfb, 0x10, 0x0, 0x0, + 0x5e, 0x30, 0x1, 0xdf, 0xff, 0x96, 0x68, 0xcf, + 0xfc, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x39, 0xde, 0xfe, 0xa5, 0x0, + 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x18, 0xdf, 0xeb, 0x40, 0x0, 0x1d, + 0xff, 0xff, 0xf9, 0x0, 0x9, 0xff, 0xa4, 0x49, + 0x30, 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0xf, + 0xf9, 0x0, 0x0, 0x0, 0x1, 0xff, 0x90, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x23, 0x4f, 0xfb, 0x33, + 0x33, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1f, + 0xfa, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x5b, 0xdf, 0xec, 0x71, 0xc, 0xfc, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xfe, 0x4c, 0xfc, + 0x3, 0xff, 0xfd, 0x86, 0x68, 0xef, 0xfe, 0xfc, + 0xd, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xfc, + 0x5f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfc, + 0xaf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfc, + 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, + 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, + 0xaf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfc, + 0x5f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, + 0xd, 0xff, 0x90, 0x0, 0x0, 0x9, 0xff, 0xfc, + 0x2, 0xff, 0xfe, 0x96, 0x69, 0xef, 0xff, 0xfc, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xfe, 0x4f, 0xfb, + 0x0, 0x0, 0x5b, 0xdf, 0xec, 0x71, 0xf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, + 0x3, 0xe6, 0x0, 0x0, 0x0, 0x5, 0xff, 0xe0, + 0xc, 0xff, 0xea, 0x76, 0x68, 0xcf, 0xff, 0x50, + 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x3, 0x8b, 0xef, 0xfe, 0xb7, 0x10, 0x0, + + /* U+0068 "h" */ + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf3, 0x6, + 0xbe, 0xfe, 0xb5, 0x0, 0x7, 0xff, 0x5d, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x7f, 0xff, 0xfe, 0x97, + 0x7a, 0xff, 0xf9, 0x7, 0xff, 0xfb, 0x0, 0x0, + 0x3, 0xff, 0xf2, 0x7f, 0xfe, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x67, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x3f, 0xf8, 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x1, + 0xff, 0x97, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, + 0xfa, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xa7, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, 0xa7, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x7f, + 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, 0xa7, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x7f, 0xf3, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, + + /* U+0069 "i" */ + 0x5e, 0xd3, 0xdf, 0xfa, 0xbf, 0xf7, 0x6, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, + + /* U+006A "j" */ + 0x0, 0x0, 0x3, 0xee, 0x40, 0x0, 0x0, 0xbf, + 0xfc, 0x0, 0x0, 0x9, 0xff, 0x90, 0x0, 0x0, + 0x6, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x60, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5, 0xff, + 0x60, 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5, + 0xff, 0x60, 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, + 0x5, 0xff, 0x60, 0x0, 0x0, 0x5f, 0xf6, 0x0, + 0x0, 0x5, 0xff, 0x60, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, 0x0, 0x5f, + 0xf6, 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, 0x0, + 0x5f, 0xf6, 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, + 0x0, 0x5f, 0xf5, 0x0, 0x0, 0x9, 0xff, 0x30, + 0xb6, 0x58, 0xff, 0xe0, 0x5f, 0xff, 0xff, 0xf4, + 0x2, 0xad, 0xfe, 0xb3, 0x0, + + /* U+006B "k" */ + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x4f, 0xfe, 0x20, + 0x7f, 0xf3, 0x0, 0x0, 0x5, 0xff, 0xe2, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x6f, 0xfe, 0x20, 0x0, + 0x7f, 0xf3, 0x0, 0x7, 0xff, 0xe2, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x8f, 0xfe, 0x20, 0x0, 0x0, + 0x7f, 0xf3, 0x9, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x7f, 0xf4, 0xaf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x7f, 0xfe, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xfc, 0x5f, 0xff, 0x20, 0x0, 0x0, + 0x7f, 0xff, 0xb0, 0x8, 0xff, 0xd0, 0x0, 0x0, + 0x7f, 0xfa, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0xd, 0xff, 0x70, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x10, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x8, 0xff, 0xc0, + + /* U+006C "l" */ + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, + + /* U+006D "m" */ + 0x7f, 0xf2, 0x18, 0xce, 0xfd, 0x93, 0x0, 0x2, + 0x8d, 0xff, 0xd9, 0x20, 0x0, 0x7f, 0xf5, 0xef, + 0xff, 0xff, 0xff, 0x70, 0x7f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x7f, 0xff, 0xfc, 0x64, 0x5a, 0xff, + 0xfa, 0xff, 0xc6, 0x45, 0xaf, 0xff, 0x30, 0x7f, + 0xff, 0x80, 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x0, + 0x0, 0x7, 0xff, 0xb0, 0x7f, 0xfd, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xdf, + 0xf0, 0x7f, 0xf7, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x9f, 0xf1, 0x7f, 0xf4, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x8f, 0xf2, 0x7f, 0xf3, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xf3, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x7, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x7f, 0xf3, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x8f, 0xf3, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x7f, + 0xf3, 0x0, 0x0, 0x0, 0x7, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x8f, 0xf3, 0x7f, 0xf3, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, + 0xf3, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x7f, 0xf3, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x8f, 0xf3, + + /* U+006E "n" */ + 0x7f, 0xf2, 0x7, 0xce, 0xfe, 0xb5, 0x0, 0x7, + 0xff, 0x5e, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x7f, + 0xff, 0xfd, 0x75, 0x58, 0xef, 0xf9, 0x7, 0xff, + 0xf9, 0x0, 0x0, 0x2, 0xef, 0xf2, 0x7f, 0xfd, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x67, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x2f, 0xf8, 0x7f, 0xf4, 0x0, + 0x0, 0x0, 0x1, 0xff, 0x97, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x1f, 0xfa, 0x7f, 0xf3, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xa7, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x1f, 0xfa, 0x7f, 0xf3, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xa7, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x1f, 0xfa, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xa7, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, + 0xfa, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xa0, + + /* U+006F "o" */ + 0x0, 0x0, 0x4a, 0xdf, 0xed, 0x82, 0x0, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x1, 0xef, 0xfe, 0x96, 0x6a, 0xff, 0xfb, 0x0, + 0xb, 0xff, 0xa0, 0x0, 0x0, 0x1c, 0xff, 0x70, + 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xef, 0xe0, + 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf5, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf7, + 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf7, + 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, + 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xef, 0xe0, + 0xb, 0xff, 0xa0, 0x0, 0x0, 0x1c, 0xff, 0x70, + 0x1, 0xdf, 0xfe, 0x96, 0x6a, 0xff, 0xfb, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x4a, 0xdf, 0xed, 0x92, 0x0, 0x0, + + /* U+0070 "p" */ + 0x7f, 0xf2, 0x6, 0xbe, 0xfd, 0xb5, 0x0, 0x0, + 0x7f, 0xf4, 0xdf, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x7f, 0xfe, 0xfe, 0x84, 0x46, 0xcf, 0xff, 0x20, + 0x7f, 0xff, 0xc1, 0x0, 0x0, 0x7, 0xff, 0xd0, + 0x7f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x9f, 0xf5, + 0x7f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfa, + 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, + 0x7f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, + 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfa, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x7f, 0xff, 0xd2, 0x0, 0x0, 0x9, 0xff, 0xd0, + 0x7f, 0xfe, 0xff, 0xa7, 0x68, 0xef, 0xff, 0x20, + 0x7f, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x7f, 0xf3, 0x5, 0xbe, 0xfe, 0xb5, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x5a, 0xdf, 0xec, 0x60, 0xf, 0xf8, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xfd, 0x2f, 0xf8, + 0x1, 0xef, 0xfe, 0x96, 0x6a, 0xff, 0xef, 0xf8, + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x2c, 0xff, 0xf8, + 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf8, + 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, + 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf8, + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x1c, 0xff, 0xf8, + 0x1, 0xef, 0xfe, 0x96, 0x6a, 0xff, 0xef, 0xf8, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xf8, + 0x0, 0x0, 0x5b, 0xdf, 0xec, 0x60, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + + /* U+0072 "r" */ + 0x7f, 0xf2, 0x6, 0xce, 0x87, 0xff, 0x3d, 0xff, + 0xf8, 0x7f, 0xfd, 0xff, 0xc9, 0x57, 0xff, 0xfd, + 0x20, 0x0, 0x7f, 0xff, 0x10, 0x0, 0x7, 0xff, + 0x80, 0x0, 0x0, 0x7f, 0xf5, 0x0, 0x0, 0x7, + 0xff, 0x30, 0x0, 0x0, 0x7f, 0xf3, 0x0, 0x0, + 0x7, 0xff, 0x30, 0x0, 0x0, 0x7f, 0xf3, 0x0, + 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x7f, 0xf3, + 0x0, 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x7f, + 0xf3, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x2, 0x9d, 0xff, 0xec, 0x83, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x5, 0xff, + 0xe8, 0x65, 0x69, 0xef, 0x20, 0xb, 0xff, 0x20, + 0x0, 0x0, 0x3, 0x0, 0xd, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfe, 0xb8, 0x51, 0x0, + 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xd5, 0x0, + 0x0, 0x0, 0x36, 0x9c, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf2, 0x5, 0x70, 0x0, + 0x0, 0x0, 0xbf, 0xf1, 0xe, 0xff, 0xa7, 0x55, + 0x7c, 0xff, 0xb0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x38, 0xce, 0xff, 0xda, 0x50, + 0x0, + + /* U+0074 "t" */ + 0x0, 0x8, 0x85, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xfe, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x23, 0x4f, 0xfb, 0x33, 0x33, 0x0, 0x1, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xb5, 0x5a, 0x40, 0x0, 0x2e, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x19, 0xef, 0xea, + 0x30, + + /* U+0075 "u" */ + 0x9f, 0xf1, 0x0, 0x0, 0x0, 0x5, 0xff, 0x69, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x5f, 0xf6, 0x9f, + 0xf1, 0x0, 0x0, 0x0, 0x5, 0xff, 0x69, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x5f, 0xf6, 0x9f, 0xf1, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x69, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x5f, 0xf6, 0x9f, 0xf1, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x69, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x5f, 0xf6, 0x9f, 0xf1, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x68, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x8f, 0xf6, 0x5f, 0xf7, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x61, 0xff, 0xe2, 0x0, 0x0, 0xa, + 0xff, 0xf6, 0x8, 0xff, 0xe8, 0x44, 0x6d, 0xff, + 0xff, 0x60, 0xa, 0xff, 0xff, 0xff, 0xfe, 0x5f, + 0xf6, 0x0, 0x4, 0xae, 0xfe, 0xc7, 0x2, 0xff, + 0x60, + + /* U+0076 "v" */ + 0xd, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x70, 0x6f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf1, 0x0, 0xef, 0xc0, 0x0, 0x0, 0x0, 0x1f, + 0xf9, 0x0, 0x8, 0xff, 0x30, 0x0, 0x0, 0x7, + 0xff, 0x20, 0x0, 0x2f, 0xfa, 0x0, 0x0, 0x0, + 0xef, 0xb0, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, + 0x5f, 0xf4, 0x0, 0x0, 0x3, 0xff, 0x80, 0x0, + 0xc, 0xfd, 0x0, 0x0, 0x0, 0xd, 0xfe, 0x0, + 0x3, 0xff, 0x60, 0x0, 0x0, 0x0, 0x6f, 0xf5, + 0x0, 0xaf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xc0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x37, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfa, 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x60, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0xaf, 0xe0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xd4, 0xff, 0x40, 0x0, + 0x0, 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xe, + 0xf7, 0xe, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xb0, 0x0, 0x0, 0x5, 0xff, 0x10, 0x8f, 0xf0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0x10, 0x0, 0x0, + 0xbf, 0xb0, 0x2, 0xff, 0x50, 0x0, 0x2, 0xff, + 0x5f, 0xf6, 0x0, 0x0, 0x1f, 0xf5, 0x0, 0xc, + 0xfb, 0x0, 0x0, 0x8f, 0xd0, 0xbf, 0xc0, 0x0, + 0x6, 0xfe, 0x0, 0x0, 0x7f, 0xf1, 0x0, 0xe, + 0xf7, 0x5, 0xff, 0x20, 0x0, 0xcf, 0x90, 0x0, + 0x1, 0xff, 0x60, 0x4, 0xff, 0x10, 0xe, 0xf8, + 0x0, 0x2f, 0xf3, 0x0, 0x0, 0xb, 0xfc, 0x0, + 0xaf, 0xb0, 0x0, 0x9f, 0xe0, 0x8, 0xfd, 0x0, + 0x0, 0x0, 0x5f, 0xf2, 0x1f, 0xf5, 0x0, 0x3, + 0xff, 0x40, 0xef, 0x70, 0x0, 0x0, 0x0, 0xef, + 0x86, 0xff, 0x0, 0x0, 0xc, 0xf9, 0x4f, 0xf1, + 0x0, 0x0, 0x0, 0x9, 0xfd, 0xcf, 0x90, 0x0, + 0x0, 0x6f, 0xfa, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x70, 0x0, 0x0, 0x0, 0x4f, + 0xfa, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0x1e, 0xfe, 0x10, 0x0, 0x0, 0x9, 0xff, 0x50, + 0x3, 0xff, 0xc0, 0x0, 0x0, 0x5f, 0xf9, 0x0, + 0x0, 0x6f, 0xf8, 0x0, 0x2, 0xef, 0xc0, 0x0, + 0x0, 0xa, 0xff, 0x50, 0xc, 0xff, 0x20, 0x0, + 0x0, 0x0, 0xdf, 0xe2, 0x9f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfe, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfa, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xc0, 0x5f, 0xf9, 0x0, 0x0, + 0x0, 0x1d, 0xfe, 0x10, 0x9, 0xff, 0x50, 0x0, + 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xdf, 0xf2, 0x0, + 0x7, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xfd, 0x0, + 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x5, 0xff, 0xa0, + + /* U+0079 "y" */ + 0xd, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x70, 0x6f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf0, 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x1f, + 0xf8, 0x0, 0x7, 0xff, 0x50, 0x0, 0x0, 0x8, + 0xff, 0x10, 0x0, 0x1f, 0xfc, 0x0, 0x0, 0x0, + 0xef, 0xa0, 0x0, 0x0, 0x9f, 0xf3, 0x0, 0x0, + 0x6f, 0xf3, 0x0, 0x0, 0x2, 0xff, 0xa0, 0x0, + 0xd, 0xfc, 0x0, 0x0, 0x0, 0xa, 0xff, 0x10, + 0x4, 0xff, 0x40, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf0, 0x2f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x79, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfe, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x9f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xeb, 0x65, 0xaf, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x6c, 0xff, 0xd7, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+007A "z" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x23, 0x33, 0x33, + 0x33, 0x8f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfe, + 0x33, 0x33, 0x33, 0x33, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, + + /* U+007B "{" */ + 0x0, 0x0, 0x6c, 0xff, 0x40, 0x0, 0x7f, 0xff, + 0xf4, 0x0, 0xe, 0xff, 0x73, 0x10, 0x1, 0xff, + 0xb0, 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x2, + 0xff, 0x80, 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, + 0x2, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xf8, 0x0, + 0x0, 0x2, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x1, 0x3a, 0xff, 0x50, 0x0, 0x6f, 0xff, + 0x90, 0x0, 0x6, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x7f, 0xf6, 0x0, 0x0, 0x2, 0xff, 0x80, 0x0, + 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x2, 0xff, 0x80, + 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x2, 0xff, + 0x80, 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x2, + 0xff, 0x80, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0xef, 0xf8, 0x31, 0x0, 0x6, 0xff, 0xff, + 0x40, 0x0, 0x5, 0xcf, 0xf4, + + /* U+007C "|" */ + 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, + 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, + 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, + 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, + 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, + 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, + 0x1f, 0xf7, 0x1f, 0xf7, + + /* U+007D "}" */ + 0x7f, 0xfb, 0x40, 0x0, 0x7, 0xff, 0xff, 0x40, + 0x0, 0x14, 0x9f, 0xfc, 0x0, 0x0, 0x0, 0xdf, + 0xf0, 0x0, 0x0, 0xa, 0xff, 0x0, 0x0, 0x0, + 0xaf, 0xf0, 0x0, 0x0, 0xa, 0xff, 0x0, 0x0, + 0x0, 0xaf, 0xf0, 0x0, 0x0, 0xa, 0xff, 0x0, + 0x0, 0x0, 0xaf, 0xf0, 0x0, 0x0, 0xa, 0xff, + 0x0, 0x0, 0x0, 0x8f, 0xf8, 0x30, 0x0, 0x1, + 0xbf, 0xff, 0x30, 0x0, 0x2e, 0xff, 0xf3, 0x0, + 0x9, 0xff, 0x50, 0x0, 0x0, 0xaf, 0xf0, 0x0, + 0x0, 0xa, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xf0, + 0x0, 0x0, 0xa, 0xff, 0x0, 0x0, 0x0, 0xaf, + 0xf0, 0x0, 0x0, 0xa, 0xff, 0x0, 0x0, 0x0, + 0xaf, 0xf0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x1, + 0x49, 0xff, 0xc0, 0x0, 0x7f, 0xff, 0xf4, 0x0, + 0x7, 0xff, 0xb4, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x7e, 0xfc, 0x30, 0x0, 0x2, 0xfa, 0x7, + 0xff, 0xff, 0xf6, 0x0, 0x5, 0xf8, 0xe, 0xf6, + 0x27, 0xff, 0x80, 0x1d, 0xf4, 0x3f, 0xb0, 0x0, + 0x4e, 0xff, 0xff, 0xb0, 0x5f, 0x70, 0x0, 0x1, + 0xaf, 0xfa, 0x10, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xc4, 0x0, 0xa, 0xfa, 0x67, 0xdf, 0x50, 0x4f, + 0x80, 0x0, 0xc, 0xf0, 0x9f, 0x0, 0x0, 0x4, + 0xf5, 0xbd, 0x0, 0x0, 0x2, 0xf6, 0x9f, 0x10, + 0x0, 0x5, 0xf4, 0x3f, 0xa0, 0x0, 0x1e, 0xe0, + 0x8, 0xfd, 0x9a, 0xff, 0x40, 0x0, 0x5c, 0xfe, + 0xa2, 0x0, + + /* U+2022 "•" */ + 0x0, 0x1, 0x0, 0x4, 0xef, 0xc1, 0xe, 0xff, + 0xfb, 0x1f, 0xff, 0xfd, 0xe, 0xff, 0xfa, 0x3, + 0xcf, 0xb1, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x38, 0xdf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0xae, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe9, 0xbf, 0xff, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x73, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x10, 0x0, 0x0, + 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0x7a, 0xcb, + 0xcf, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, + 0x33, 0x2f, 0xff, 0x80, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3, 0xcf, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xfb, 0x20, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x32, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0xaa, 0x95, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x9b, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xb9, 0xfe, 0x44, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x44, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x88, 0x8f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf8, 0x88, 0xff, + 0xfc, 0x0, 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xb0, 0x0, 0xcf, 0xfc, 0x0, + 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xb0, 0x0, 0xcf, 0xfd, 0x0, 0xd, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xcc, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xfc, 0xcc, 0xff, 0xfc, 0x0, + 0xc, 0xff, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xff, 0xc0, 0x0, 0xcf, 0xfc, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0xcf, 0xfc, 0x0, 0xc, 0xff, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xff, 0xc0, 0x0, 0xcf, + 0xff, 0xcc, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xfc, 0xcc, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xd, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, + 0x0, 0xdf, 0xfc, 0x0, 0xc, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xb0, 0x0, 0xcf, + 0xfc, 0x0, 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xb0, 0x0, 0xcf, 0xff, 0x88, + 0x8f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf8, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x44, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x44, 0xef, + 0xab, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xb9, + + /* U+F00B "" */ + 0x9f, 0xff, 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xfc, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xfb, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xfc, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xfc, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xff, 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xe9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x8e, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xa, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf6, 0x6, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xe7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x6, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0xfa, 0x0, 0x6f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xa0, 0xef, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf2, + 0xcf, 0xff, 0xff, 0xf5, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf1, 0x2e, 0xff, 0xff, 0xff, 0x50, 0x2e, + 0xff, 0xff, 0xff, 0x50, 0x2, 0xef, 0xff, 0xff, + 0xf7, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xf6, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0x40, 0x2e, 0xff, 0xff, 0xff, 0x50, + 0xcf, 0xff, 0xff, 0xf4, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf1, 0xef, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xf2, 0x6f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xa0, 0x6, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x69, 0x96, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xa8, 0x0, 0x3, + 0xff, 0xff, 0x30, 0x0, 0x8a, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0x60, 0x3, 0xff, 0xff, + 0x30, 0x6, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xe0, 0x3, 0xff, 0xff, 0x30, 0xe, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xe0, 0x3, 0xff, 0xff, 0x30, 0xe, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x30, 0x3, + 0xff, 0xff, 0x30, 0x3, 0xef, 0xff, 0xf9, 0x0, + 0x2, 0xff, 0xff, 0xe2, 0x0, 0x3, 0xff, 0xff, + 0x30, 0x0, 0x2e, 0xff, 0xff, 0x20, 0x9, 0xff, + 0xff, 0x50, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, + 0x5, 0xff, 0xff, 0x90, 0xe, 0xff, 0xfc, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0xcf, + 0xff, 0xe0, 0x3f, 0xff, 0xf5, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x6f, 0xff, 0xf3, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x30, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x7f, 0xff, + 0xe0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, + 0x0, 0xe, 0xff, 0xf8, 0x8f, 0xff, 0xd0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, 0xd, + 0xff, 0xf8, 0x8f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0xef, 0xfe, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf7, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x2, 0x20, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x3f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf3, 0xe, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xe0, 0x9, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x90, + 0x2, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0x20, 0x0, 0x9f, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xf9, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfa, + 0x75, 0x57, 0xaf, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9d, + 0xff, 0xfe, 0xd9, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0xd6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xc8, 0x0, 0x5d, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x6d, 0x40, + 0x0, 0x0, 0xcf, 0xfe, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xcf, 0xfe, 0x20, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xe7, 0x32, 0x5d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x13, 0xcf, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x7f, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x4, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x4, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xfb, 0x10, 0x3, 0xcf, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xe7, 0x32, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0xcf, 0xfe, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xcf, 0xfe, 0x10, 0x0, 0x1, + 0xc8, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x5d, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2c, 0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, + 0x60, 0x0, 0x0, 0x48, 0x88, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xfd, 0x10, 0x0, 0xaf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xe3, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf8, + 0xcf, 0xff, 0xf9, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x30, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xd2, 0x3, + 0x10, 0x7f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xfa, 0x0, 0x8f, + 0xd2, 0x4, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0x80, 0xb, 0xff, + 0xff, 0x40, 0x2d, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xf5, 0x2, 0xdf, 0xff, + 0xff, 0xf7, 0x1, 0xbf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xfe, 0x30, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x9, 0xff, 0xff, 0xc1, 0x0, + 0xa, 0xff, 0xff, 0xc1, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x6f, 0xff, 0xfe, 0x30, + 0xbf, 0xff, 0xfa, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x4, 0xef, 0xff, 0xf4, + 0xbf, 0xff, 0x70, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x2d, 0xff, 0xf3, + 0xd, 0xf4, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xbf, 0x60, + 0x1, 0x20, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x3, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x55, 0x55, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdd, 0xdd, 0xef, + 0xff, 0xff, 0xfe, 0xdd, 0xdd, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x11, 0x11, 0x11, 0x10, 0x8, + 0xff, 0xff, 0x80, 0x1, 0x11, 0x11, 0x11, 0x10, + 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x8f, 0xf8, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x6, 0x60, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x1e, 0xb0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2e, 0xc1, + 0x8f, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xd8, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x9f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x30, 0x0, + 0x0, 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, 0x0, + 0x1, 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf8, 0x0, + 0xa, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x20, + 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, + 0xdf, 0xff, 0xb8, 0x88, 0x88, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x48, 0x88, 0x88, 0x8e, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x58, 0x86, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x9d, 0xef, 0xfe, 0xb7, 0x20, + 0x0, 0x0, 0xdf, 0xff, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, 0x0, + 0xdf, 0xff, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0xcf, 0xff, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfe, 0xef, + 0xff, 0xff, 0xff, 0xe3, 0xbf, 0xff, 0x0, 0x2, + 0xef, 0xff, 0xff, 0x94, 0x0, 0x0, 0x4b, 0xff, + 0xff, 0xfe, 0xdf, 0xff, 0x0, 0xd, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0x2, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x0, 0x8, 0xff, 0xff, 0xff, 0x9, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xee, 0xff, 0xff, 0xff, 0xe, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2b, 0xcc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, 0xca, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xac, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xbc, 0xb2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xe0, 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x11, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf9, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xd0, 0x0, 0xff, 0xfd, 0xef, 0xff, 0xff, 0xa4, + 0x0, 0x0, 0x4a, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0xff, 0xfb, 0x3e, 0xff, 0xff, 0xff, 0xfe, 0xef, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xff, 0xfc, + 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0xff, 0xfd, 0x0, 0x3, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0x0, 0x0, 0x2, 0x7c, + 0xff, 0xff, 0xd9, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x68, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xb6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x38, 0x88, 0x88, 0x8f, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3b, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x38, + 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x1, 0xb9, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x6f, 0xfc, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xcf, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xef, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xdf, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xbf, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x6f, 0xfd, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2, 0xdb, 0x10, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x18, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xb6, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, + 0x0, 0x0, 0x21, 0x0, 0x1c, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, + 0x0, 0x4, 0xfe, 0x50, 0x1, 0xef, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x0, + 0x0, 0x5, 0xff, 0xf6, 0x0, 0x4f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x40, 0xa, 0xff, 0x40, + 0x38, 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe0, 0x2, 0xff, 0xa0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1c, 0xa1, 0x0, 0x8f, 0xf6, 0x0, 0xcf, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x6f, 0xfd, 0x0, 0x1f, 0xfc, 0x0, 0x8f, 0xf2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1c, 0xff, 0x80, 0xa, 0xff, 0x0, 0x4f, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xdf, 0xd0, 0x7, 0xff, 0x20, 0x3f, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xaf, 0xf0, 0x6, 0xff, 0x30, 0x2f, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xdf, 0xd0, 0x7, 0xff, 0x20, 0x3f, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1c, 0xff, 0x80, 0xa, 0xff, 0x0, 0x4f, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x6f, 0xfd, 0x0, 0x1f, 0xfc, 0x0, 0x8f, 0xf2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1c, 0xa1, 0x0, 0x9f, 0xf6, 0x0, 0xdf, 0xe0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe0, 0x3, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x40, 0xa, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, + 0x0, 0x5, 0xff, 0xf6, 0x0, 0x4f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, + 0x0, 0x4, 0xfe, 0x50, 0x1, 0xef, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0x0, 0x0, 0x21, 0x0, 0x1d, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x18, 0x50, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x93, 0x27, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xd8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x3, 0xdf, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x3e, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x3, 0xef, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x3b, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfc, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + + /* U+F043 "ïƒ" */ + 0x0, 0x0, 0x0, 0x0, 0x39, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xff, 0xfa, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xef, 0xf8, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xdf, 0xfc, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x9f, 0xff, 0x20, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x4f, 0xff, 0xb0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xc, 0xff, + 0xfa, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xfe, 0x10, + 0x2, 0xff, 0xff, 0xd6, 0x10, 0xbf, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x18, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x67, 0x64, 0x0, 0x0, + 0x0, 0x0, + + /* U+F048 "ïˆ" */ + 0x48, 0x88, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0x70, 0xbf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf9, 0xbf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0x30, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xfc, 0xbf, 0xff, + 0x30, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xfc, 0xbf, + 0xff, 0x30, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xbf, 0xff, 0x30, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xbf, 0xff, 0x37, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xbf, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbf, + 0xff, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xbf, 0xff, 0x31, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xbf, 0xff, 0x30, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0x30, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfc, 0xbf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfc, 0xbf, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, + 0x9f, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3d, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F04B "ï‹" */ + 0x3, 0x75, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x74, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F04C "ïŒ" */ + 0x1a, 0xef, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x1a, + 0xef, 0xff, 0xff, 0xd5, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0x66, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x4, 0x89, 0x99, 0x98, + 0x71, 0x0, 0x0, 0x4, 0x89, 0x99, 0x98, 0x71, + 0x0, + + /* U+F04D "ï" */ + 0x3, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x60, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x1a, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, + + /* U+F051 "ï‘" */ + 0x5, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, + 0x87, 0x5f, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x7f, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x7f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x1c, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9a, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x1, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, + + /* U+F053 "ï“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x93, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+F054 "ï”" */ + 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xa8, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x23, 0x33, 0x33, 0x33, + 0x8f, 0xff, 0xfe, 0x33, 0x33, 0x33, 0x33, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8d, 0xdc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F068 "ï¨" */ + 0x1, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x10, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x1, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, 0x0, + + /* U+F06E "ï®" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xad, 0xef, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xba, + 0xbd, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x39, + 0x95, 0x0, 0x2, 0xef, 0xff, 0xff, 0x70, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x3f, + 0xff, 0xd2, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, + 0x7, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x3f, + 0xff, 0xfe, 0x10, 0xd, 0xff, 0xff, 0xff, 0x20, + 0x2f, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xc0, + 0xbf, 0xff, 0xff, 0xff, 0x0, 0x48, 0x6b, 0xff, + 0xff, 0xff, 0xd0, 0x5, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x4, 0xff, 0xff, 0xff, 0xf9, + 0xbf, 0xff, 0xff, 0xff, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x5, 0xff, 0xff, 0xff, 0xf5, + 0x1f, 0xff, 0xff, 0xff, 0x20, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x8, 0xff, 0xff, 0xff, 0xc0, + 0x6, 0xff, 0xff, 0xff, 0x70, 0x8, 0xff, 0xff, + 0xff, 0xff, 0x20, 0xd, 0xff, 0xff, 0xff, 0x20, + 0x0, 0xaf, 0xff, 0xff, 0xe0, 0x0, 0xaf, 0xff, + 0xff, 0xf4, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xfb, 0x0, 0x4, 0xad, + 0xc8, 0x10, 0x2, 0xef, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xba, + 0xac, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xad, 0xff, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "ï°" */ + 0x4, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x26, 0xad, 0xff, 0xed, + 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xfa, 0x16, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xba, 0xbe, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xc5, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xc1, 0x6, 0xba, 0x50, + 0x0, 0x7f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xe4, 0x7f, + 0xff, 0xc1, 0x0, 0xbf, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0xad, 0x20, 0x0, 0x4, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xc0, 0x3, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x50, 0xe, 0xff, + 0xff, 0xff, 0x50, 0x0, 0xe, 0xff, 0xff, 0x90, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xbf, 0xff, 0xff, 0xfe, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xb0, 0xa, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xfa, 0x0, 0xcf, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xd2, 0xe, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xc4, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, + 0xfe, 0xba, 0xb5, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x37, 0xbd, 0xef, 0xfd, 0xb4, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x44, 0x0, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x87, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x80, 0x0, 0x1e, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xef, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x70, 0x0, 0xf, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x13, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x48, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x98, 0x71, 0x0, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xe3, 0x0, 0x24, 0x44, 0x44, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x44, 0x4f, 0xff, 0xfe, 0x30, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x12, 0x22, 0x26, 0xff, 0xff, 0xa0, 0x1d, 0xff, + 0xff, 0xd2, 0x2f, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x7f, 0xfb, 0x1, 0xdf, 0xff, 0xfd, 0x10, + 0xf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xc0, 0xc, 0xff, 0xff, 0xe2, 0x0, 0xe, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xfe, 0x20, 0x0, 0x4, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x4, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xf5, 0x5, 0xe2, 0x0, 0xe, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x60, 0x4f, 0xfd, 0x10, 0xf, 0xff, 0xe2, 0x0, + 0x12, 0x22, 0x26, 0xff, 0xff, 0xf7, 0x3, 0xff, + 0xff, 0xd2, 0x2f, 0xff, 0xfe, 0x20, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x24, 0x44, + 0x44, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, 0x44, + 0x4f, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xa2, 0x0, 0x0, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xfa, 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xfa, 0x0, 0x3f, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x8, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xe2, 0x6, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe0, 0x9f, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x11, 0xdf, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x1, + 0xa8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0x50, 0x0, + + /* U+F078 "ï¸" */ + 0x1, 0xa8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0x60, 0x1, 0xdf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x9f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x16, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xd0, 0x8, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x8, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xfa, 0x0, 0x3f, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf4, + 0x0, 0x0, 0x57, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x60, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xf4, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xef, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf9, + 0x0, 0x0, 0xf, 0xff, 0xf4, 0xef, 0xf9, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x90, 0x0, 0x0, 0x7f, 0xf5, 0xe, 0xff, + 0x90, 0xaf, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x32, 0x0, + 0xef, 0xf9, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0x80, + 0xe, 0xff, 0x90, 0x2a, 0x70, 0x0, 0x0, 0xe, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xa0, 0xef, 0xf9, 0x2e, 0xff, 0x60, 0x0, + 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x9e, 0xff, 0xad, 0xff, 0xf9, + 0x0, 0x0, 0xe, 0xff, 0xc7, 0x77, 0x77, 0x77, + 0x77, 0x73, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x4, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x3, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xdb, 0x0, 0x0, + 0x0, + + /* U+F07B "ï»" */ + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd8, 0x88, 0x88, 0x88, 0x88, 0x87, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + + /* U+F093 "ï‚“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x22, 0xcf, + 0xff, 0xff, 0xf6, 0x22, 0x22, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x11, 0x11, 0x11, 0x0, 0xbf, + 0xff, 0xff, 0xf4, 0x0, 0x11, 0x11, 0x11, 0x10, + 0xbf, 0xff, 0xff, 0xff, 0xc0, 0xaf, 0xff, 0xff, + 0xf3, 0xc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x18, 0x99, 0x99, 0x60, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xcc, 0xcc, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x1e, 0xb0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2e, 0xc1, + 0x8f, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x62, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfe, 0xb7, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0x10, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x5, 0xef, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xe9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xd9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, + 0x76, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x5, 0x99, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7b, 0xb8, + 0x10, 0x1e, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xfe, 0x38, 0xff, 0xff, + 0xef, 0xff, 0xf1, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf4, 0xdf, 0xfe, 0x10, 0x7f, 0xff, 0x50, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xf5, 0xf, 0xff, + 0x80, 0x0, 0xff, 0xf7, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf5, 0x0, 0xef, 0xfc, 0x0, 0x4f, 0xff, + 0x60, 0x2, 0xef, 0xff, 0xff, 0xf5, 0x0, 0xa, + 0xff, 0xfd, 0xbf, 0xff, 0xf4, 0x3, 0xef, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x18, 0xcd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x99, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x8, 0xff, 0xff, 0xef, + 0xff, 0xf6, 0x5, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0xdf, 0xfe, 0x10, 0x7f, 0xff, 0x50, 0x5, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0xf, 0xff, 0x80, + 0x0, 0xff, 0xf7, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0xef, 0xfc, 0x0, 0x4f, 0xff, 0x60, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xe2, 0xa, 0xff, + 0xfd, 0xbf, 0xff, 0xf2, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xe2, 0x2f, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x40, + 0x4f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xbe, 0xfb, 0x30, 0x0, 0x18, 0xcd, 0xb5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x1, 0x44, 0x44, 0x44, 0x44, + 0x42, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x80, 0xeb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xe, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xef, 0xff, 0xf4, 0xaf, 0xff, 0xf4, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xbb, 0xbb, 0xb3, 0xff, 0xff, 0xf4, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x5f, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf5, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xa2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x37, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x60, 0x0, + 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x4, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x87, 0x20, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, 0xf, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0x30, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfe, 0xf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf3, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xf4, 0xff, 0xfd, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x7e, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x82, 0x15, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xa9, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x1a, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, + 0x0, + + /* U+F0C9 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xa2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x61, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0E0 "" */ + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0xe5, 0x1, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x5e, + 0xff, 0x90, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x9, 0xff, 0xff, 0xfd, + 0x20, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x6, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x2d, 0xff, 0xff, + 0xd2, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x7e, 0xe7, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x95, 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + + /* U+F0E7 "" */ + 0x0, 0x8, 0xbb, 0xbb, 0xbb, 0xbb, 0x80, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x1, 0x43, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0x99, 0x99, 0xff, 0xef, 0xfe, 0x99, + 0x99, 0x81, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xa0, 0x1e, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x1, 0xef, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfc, 0x64, 0x44, 0x44, 0x44, + 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x20, 0xaf, 0xff, 0xff, + 0xff, 0xa0, 0xd6, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0xe, 0xf6, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0xef, 0xf6, 0x0, 0xff, 0xff, + 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0xe, + 0xff, 0xf6, 0xf, 0xff, 0xff, 0xff, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0xef, 0xff, 0xf3, 0xff, + 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xfa, + 0x4, 0x44, 0x44, 0x1f, 0xff, 0xff, 0xff, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0xff, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0xff, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xaf, 0xff, 0xff, 0xf0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x42, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xa2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x8d, 0xff, 0xfa, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0x73, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xfd, 0x88, 0x9f, 0xf8, 0x88, 0xff, 0x98, + 0x8e, 0xfa, 0x88, 0xbf, 0xd8, 0x89, 0xff, 0xf8, + 0xff, 0xf8, 0x0, 0xf, 0xc0, 0x0, 0xcf, 0x0, + 0xa, 0xf1, 0x0, 0x4f, 0x70, 0x0, 0xff, 0xf8, + 0xff, 0xf8, 0x0, 0xf, 0xc0, 0x0, 0xcf, 0x0, + 0xa, 0xf1, 0x0, 0x4f, 0x70, 0x0, 0xff, 0xf8, + 0xff, 0xf9, 0x0, 0x1f, 0xd0, 0x0, 0xdf, 0x10, + 0xc, 0xf3, 0x0, 0x6f, 0x90, 0x1, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xdc, 0xce, 0xfe, 0xcc, 0xdf, + 0xfc, 0xcd, 0xff, 0xcc, 0xcf, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0x20, 0x6, 0xf6, 0x0, 0x3f, + 0x80, 0x0, 0xfd, 0x0, 0xa, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0x20, 0x6, 0xf6, 0x0, 0x2f, + 0x80, 0x0, 0xed, 0x0, 0xa, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0x20, 0x6, 0xf6, 0x0, 0x3f, + 0x80, 0x0, 0xfd, 0x0, 0xa, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xdc, 0xce, 0xfe, 0xcc, 0xdf, + 0xfc, 0xcd, 0xff, 0xcc, 0xcf, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xf9, 0x0, 0x1f, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0x90, 0x1, 0xff, 0xf8, + 0xff, 0xf8, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0x70, 0x0, 0xff, 0xf8, + 0xff, 0xf8, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0x70, 0x0, 0xff, 0xf8, + 0xff, 0xfd, 0x88, 0x9f, 0xf8, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0xbf, 0xd8, 0x89, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xef, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x18, 0xef, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x4, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x4d, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F15B "ï…›" */ + 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x30, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xf, 0xa0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0xff, 0xa0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xf, 0xff, + 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xa0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, + 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xb, 0xbb, 0xbb, 0xbb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x14, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x10, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x69, 0xab, 0xcb, 0xa9, 0x63, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xba, + 0xaa, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xc7, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x37, 0xcf, 0xff, 0xff, + 0xff, 0xd1, 0x3, 0xef, 0xff, 0xff, 0xf9, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0xff, 0xff, 0xff, 0xe3, 0xef, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xbf, 0xff, 0xff, 0xe7, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf7, 0x7, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x48, 0xbe, 0xff, + 0xfd, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x2d, 0xf7, + 0x0, 0x4, 0x10, 0x0, 0x0, 0x18, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, + 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xc8, 0x76, 0x78, 0xcf, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xdb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, + 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F241 "ï‰" */ + 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F242 "" */ + 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F243 "" */ + 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0xe, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0xef, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0xe, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F244 "" */ + 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x23, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xcd, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xe1, 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x50, 0x0, 0x7, 0xa7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x10, 0x0, 0x0, 0x4, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xfc, 0x20, 0x0, 0xc, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x40, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xe1, 0x0, 0x4f, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xfb, 0x20, 0x0, 0xcf, 0xff, 0xff, 0xfa, + 0x35, 0xef, 0x94, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x4d, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0xef, 0xff, 0xff, 0xfe, 0xbb, 0xbb, 0xbc, 0xff, + 0xcb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xff, + 0xfe, 0x50, 0x8f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x80, 0x0, 0xb, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xe, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xb2, 0x0, 0x0, 0x0, 0x58, + 0x73, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0x20, 0x6, 0xdd, 0xdd, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xc0, 0x9, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xde, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x34, 0x32, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xef, + 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xc7, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xc0, 0x9, 0xff, 0xff, + 0xff, 0x50, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xaf, 0xff, 0xff, 0xb0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xb, 0xff, 0xff, 0xf1, + 0x6, 0xff, 0xff, 0xaf, 0xff, 0xc0, 0x39, 0x0, + 0xcf, 0xff, 0xf5, 0xa, 0xff, 0xf9, 0x3, 0xef, + 0xc0, 0x3f, 0x90, 0x1d, 0xff, 0xf8, 0xc, 0xff, + 0xfd, 0x10, 0x3e, 0xc0, 0x2f, 0xb0, 0xc, 0xff, + 0xfa, 0xe, 0xff, 0xff, 0xd1, 0x3, 0xb0, 0x2b, + 0x0, 0xaf, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xfd, + 0x10, 0x10, 0x0, 0x9, 0xff, 0xff, 0xfd, 0xf, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x5, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfe, + 0xf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xfb, 0x0, + 0x20, 0x11, 0x4, 0xff, 0xff, 0xfd, 0xe, 0xff, + 0xff, 0xb0, 0x5, 0xc0, 0x2d, 0x10, 0x5f, 0xff, + 0xfc, 0xc, 0xff, 0xfb, 0x0, 0x5f, 0xc0, 0x2f, + 0xd0, 0x7, 0xff, 0xfa, 0x9, 0xff, 0xfb, 0x5, + 0xff, 0xc0, 0x3f, 0x60, 0x1d, 0xff, 0xf7, 0x5, + 0xff, 0xff, 0xdf, 0xff, 0xc0, 0x36, 0x1, 0xdf, + 0xff, 0xf4, 0x1, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x1d, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xd0, 0x1, 0xdf, 0xff, 0xff, 0xa0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xd0, 0x1d, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xd1, 0xcf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xec, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x58, 0xab, 0xba, 0x84, 0x0, 0x0, 0x0, + + /* U+F2ED "ï‹­" */ + 0x0, 0x0, 0x0, 0x0, 0x14, 0x44, 0x44, 0x43, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x58, 0x88, 0x88, 0x8c, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x88, 0x88, 0x88, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x28, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x86, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x4f, 0xff, 0xf5, 0x5f, 0xff, 0x92, + 0xff, 0xfc, 0x1c, 0xff, 0xfc, 0x0, 0x4, 0xff, + 0xff, 0x22, 0xff, 0xf6, 0xe, 0xff, 0xa0, 0xaf, + 0xff, 0xc0, 0x0, 0x4f, 0xff, 0xf2, 0x2f, 0xff, + 0x60, 0xef, 0xfa, 0xa, 0xff, 0xfc, 0x0, 0x4, + 0xff, 0xff, 0x22, 0xff, 0xf6, 0xe, 0xff, 0xa0, + 0xaf, 0xff, 0xc0, 0x0, 0x4f, 0xff, 0xf2, 0x2f, + 0xff, 0x60, 0xef, 0xfa, 0xa, 0xff, 0xfc, 0x0, + 0x4, 0xff, 0xff, 0x22, 0xff, 0xf6, 0xe, 0xff, + 0xa0, 0xaf, 0xff, 0xc0, 0x0, 0x4f, 0xff, 0xf2, + 0x2f, 0xff, 0x60, 0xef, 0xfa, 0xa, 0xff, 0xfc, + 0x0, 0x4, 0xff, 0xff, 0x22, 0xff, 0xf6, 0xe, + 0xff, 0xa0, 0xaf, 0xff, 0xc0, 0x0, 0x4f, 0xff, + 0xf2, 0x2f, 0xff, 0x60, 0xef, 0xfa, 0xa, 0xff, + 0xfc, 0x0, 0x4, 0xff, 0xff, 0x22, 0xff, 0xf6, + 0xe, 0xff, 0xa0, 0xaf, 0xff, 0xc0, 0x0, 0x4f, + 0xff, 0xf2, 0x2f, 0xff, 0x60, 0xef, 0xfa, 0xa, + 0xff, 0xfc, 0x0, 0x4, 0xff, 0xff, 0x22, 0xff, + 0xf6, 0xe, 0xff, 0xa0, 0xaf, 0xff, 0xc0, 0x0, + 0x4f, 0xff, 0xf2, 0x2f, 0xff, 0x60, 0xef, 0xfa, + 0xa, 0xff, 0xfc, 0x0, 0x4, 0xff, 0xff, 0x55, + 0xff, 0xf9, 0x2f, 0xff, 0xc1, 0xcf, 0xff, 0xc0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x4, + 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x61, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x66, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xec, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xfc, 0x0, + 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xfc, 0x0, 0xbf, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xfc, 0x0, 0xbf, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xbe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xec, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x76, + 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd5, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x99, 0xff, + 0xff, 0xff, 0x99, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x8, 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x8, 0xff, 0x80, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x8, 0x80, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x8, 0x80, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x99, 0xff, 0xff, 0xff, 0x99, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x17, 0x88, 0x88, 0x88, 0x88, + 0x87, 0x50, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x2e, 0xff, 0x20, 0x1f, 0xa0, + 0xe, 0xd0, 0x8, 0xff, 0xf0, 0x2e, 0xff, 0xf2, + 0x1, 0xfa, 0x0, 0xed, 0x0, 0x8f, 0xff, 0x3e, + 0xff, 0xff, 0x20, 0x1f, 0xa0, 0xe, 0xd0, 0x8, + 0xff, 0xfe, 0xff, 0xff, 0xf2, 0x1, 0xfa, 0x0, + 0xed, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x1f, 0xa0, 0xe, 0xd0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x24, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, + 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x5c, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, + 0x0, 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x10, 0x0, 0x9f, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x0, 0xaf, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x10, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1d, 0xff, 0xff, + 0xfe, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x10, 0x0, 0x1c, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 121, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 120, .box_w = 5, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 50, .adv_w = 175, .box_w = 9, .box_h = 8, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 86, .adv_w = 315, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 276, .adv_w = 278, .box_w = 16, .box_h = 26, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 484, .adv_w = 378, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 704, .adv_w = 307, .box_w = 18, .box_h = 21, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 893, .adv_w = 94, .box_w = 4, .box_h = 8, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 909, .adv_w = 151, .box_w = 7, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 1000, .adv_w = 151, .box_w = 7, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 1091, .adv_w = 179, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 1152, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 1243, .adv_w = 102, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1263, .adv_w = 172, .box_w = 9, .box_h = 3, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 1277, .adv_w = 102, .box_w = 5, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1287, .adv_w = 158, .box_w = 12, .box_h = 27, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 1449, .adv_w = 299, .box_w = 17, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1619, .adv_w = 166, .box_w = 8, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1699, .adv_w = 257, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1859, .adv_w = 256, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2009, .adv_w = 300, .box_w = 18, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2189, .adv_w = 257, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2349, .adv_w = 276, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2509, .adv_w = 268, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2669, .adv_w = 289, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2829, .adv_w = 276, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2989, .adv_w = 102, .box_w = 5, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3027, .adv_w = 102, .box_w = 5, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 3075, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 3166, .adv_w = 261, .box_w = 14, .box_h = 9, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 3229, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 3320, .adv_w = 257, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3470, .adv_w = 463, .box_w = 27, .box_h = 25, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 3808, .adv_w = 328, .box_w = 22, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4028, .adv_w = 339, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4208, .adv_w = 324, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4398, .adv_w = 370, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4598, .adv_w = 300, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4758, .adv_w = 284, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4908, .adv_w = 346, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5098, .adv_w = 364, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5278, .adv_w = 139, .box_w = 4, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5318, .adv_w = 230, .box_w = 13, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5448, .adv_w = 322, .box_w = 19, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5638, .adv_w = 266, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5788, .adv_w = 428, .box_w = 22, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6008, .adv_w = 364, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6188, .adv_w = 376, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6408, .adv_w = 323, .box_w = 17, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6578, .adv_w = 376, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 6854, .adv_w = 326, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7034, .adv_w = 278, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7194, .adv_w = 263, .box_w = 17, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7364, .adv_w = 354, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7544, .adv_w = 319, .box_w = 21, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7754, .adv_w = 504, .box_w = 31, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8064, .adv_w = 302, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8254, .adv_w = 290, .box_w = 20, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8454, .adv_w = 294, .box_w = 17, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8624, .adv_w = 149, .box_w = 7, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 8715, .adv_w = 158, .box_w = 13, .box_h = 27, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 8891, .adv_w = 149, .box_w = 7, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 8982, .adv_w = 261, .box_w = 13, .box_h = 12, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 9060, .adv_w = 224, .box_w = 14, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9074, .adv_w = 269, .box_w = 8, .box_h = 4, .ofs_x = 3, .ofs_y = 17}, + {.bitmap_index = 9090, .adv_w = 268, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9195, .adv_w = 306, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9363, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9476, .adv_w = 306, .box_w = 16, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9644, .adv_w = 274, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9757, .adv_w = 158, .box_w = 11, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9873, .adv_w = 309, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 10033, .adv_w = 305, .box_w = 15, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10191, .adv_w = 125, .box_w = 4, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10233, .adv_w = 127, .box_w = 9, .box_h = 26, .ofs_x = -3, .ofs_y = -5}, + {.bitmap_index = 10350, .adv_w = 276, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10518, .adv_w = 125, .box_w = 4, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10560, .adv_w = 474, .box_w = 26, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10755, .adv_w = 305, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10868, .adv_w = 284, .box_w = 16, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10988, .adv_w = 306, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 11148, .adv_w = 306, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 11308, .adv_w = 184, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11376, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11481, .adv_w = 185, .box_w = 11, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11586, .adv_w = 303, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11699, .adv_w = 250, .box_w = 17, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 11827, .adv_w = 403, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12015, .adv_w = 247, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12135, .adv_w = 250, .box_w = 17, .box_h = 20, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 12305, .adv_w = 233, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12403, .adv_w = 157, .box_w = 9, .box_h = 26, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 12520, .adv_w = 134, .box_w = 4, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 12572, .adv_w = 157, .box_w = 9, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 12689, .adv_w = 261, .box_w = 14, .box_h = 5, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 12724, .adv_w = 188, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 11}, + {.bitmap_index = 12774, .adv_w = 141, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 12792, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 13198, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13492, .adv_w = 448, .box_w = 28, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13842, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14136, .adv_w = 308, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14346, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 14752, .adv_w = 448, .box_w = 27, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 15144, .adv_w = 504, .box_w = 32, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15544, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 15950, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16286, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 16692, .adv_w = 224, .box_w = 14, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16853, .adv_w = 336, .box_w = 21, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17095, .adv_w = 504, .box_w = 32, .box_h = 27, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 17527, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17821, .adv_w = 308, .box_w = 20, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 18111, .adv_w = 392, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 18345, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 18708, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19021, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19334, .adv_w = 392, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 19568, .adv_w = 392, .box_w = 26, .box_h = 25, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 19893, .adv_w = 280, .box_w = 16, .box_h = 25, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 20093, .adv_w = 280, .box_w = 16, .box_h = 25, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 20293, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20606, .adv_w = 392, .box_w = 25, .box_h = 7, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 20694, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21030, .adv_w = 560, .box_w = 35, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 21538, .adv_w = 504, .box_w = 33, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 22017, .adv_w = 448, .box_w = 28, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22367, .adv_w = 392, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 22555, .adv_w = 392, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 22743, .adv_w = 560, .box_w = 35, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23128, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23422, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 23828, .adv_w = 448, .box_w = 29, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 24249, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24562, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 24925, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25238, .adv_w = 392, .box_w = 25, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 25526, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 25820, .adv_w = 280, .box_w = 19, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 26096, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 26459, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 26822, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 27158, .adv_w = 448, .box_w = 30, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 27593, .adv_w = 336, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 27898, .adv_w = 560, .box_w = 35, .box_h = 26, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28353, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 28686, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 29019, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 29352, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 29685, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 30018, .adv_w = 560, .box_w = 36, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 30432, .adv_w = 392, .box_w = 22, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 30751, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 31114, .adv_w = 448, .box_w = 29, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 31535, .adv_w = 560, .box_w = 35, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 31903, .adv_w = 336, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 32208, .adv_w = 451, .box_w = 29, .box_h = 19, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 4, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 20, 0, 12, -10, 0, 0, + 0, 0, -25, -27, 3, 21, 10, 8, + -18, 3, 22, 1, 19, 4, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 27, 4, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 0, -13, 0, 0, 0, 0, + 0, -9, 8, 9, 0, 0, -4, 0, + -3, 4, 0, -4, 0, -4, -2, -9, + 0, 0, 0, 0, -4, 0, 0, -6, + -7, 0, 0, -4, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + -4, 0, -7, 0, -12, 0, -54, 0, + 0, -9, 0, 9, 13, 0, 0, -9, + 4, 4, 15, 9, -8, 9, 0, 0, + -26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -17, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -12, -5, -22, 0, -18, + -3, 0, 0, 0, 0, 1, 17, 0, + -13, -4, -1, 1, 0, -8, 0, 0, + -3, -33, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -36, -4, 17, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 15, + 0, 4, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 17, 4, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -17, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 9, 4, 13, -4, 0, 0, 9, -4, + -15, -61, 3, 12, 9, 1, -6, 0, + 16, 0, 14, 0, 14, 0, -42, 0, + -5, 13, 0, 15, -4, 9, 4, 0, + 0, 1, -4, 0, 0, -8, 36, 0, + 36, 0, 13, 0, 19, 6, 8, 13, + 0, 0, 0, -17, 0, 0, 0, 0, + 1, -3, 0, 3, -8, -6, -9, 3, + 0, -4, 0, 0, 0, -18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -25, 0, -28, 0, 0, 0, + 0, -3, 0, 44, -5, -6, 4, 4, + -4, 0, -6, 4, 0, 0, -24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -43, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -28, 0, 27, 0, 0, -17, 0, + 15, 0, -30, -43, -30, -9, 13, 0, + 0, -30, 0, 5, -10, 0, -7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 12, 13, -55, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 21, 0, 3, 0, 0, 0, + 0, 0, 3, 3, -5, -9, 0, -1, + -1, -4, 0, 0, -3, 0, 0, 0, + -9, 0, -4, 0, -10, -9, 0, -11, + -15, -15, -9, 0, -9, 0, -9, 0, + 0, 0, 0, -4, 0, 0, 4, 0, + 3, -4, 0, 1, 0, 0, 0, 4, + -3, 0, 0, 0, -3, 4, 4, -1, + 0, 0, 0, -9, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 6, -3, 0, + -5, 0, -8, 0, 0, -3, 0, 13, + 0, 0, -4, 0, 0, 0, 0, 0, + -1, 1, -3, -3, 0, 0, -4, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, -4, -5, 0, + 0, 0, 0, 0, 1, 0, 0, -3, + 0, -4, -4, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, -3, -6, 0, -7, 0, -13, + -3, -13, 9, 0, 0, -9, 4, 9, + 12, 0, -11, -1, -5, 0, -1, -21, + 4, -3, 3, -24, 4, 0, 0, 1, + -23, 0, -24, -4, -39, -3, 0, -22, + 0, 9, 13, 0, 6, 0, 0, 0, + 0, 1, 0, -8, -6, 0, -13, 0, + 0, 0, -4, 0, 0, 0, -4, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + -6, 0, 0, 0, 0, 0, 0, 0, + -4, -4, 0, -3, -5, -4, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -5, + 0, -3, 0, -9, 4, 0, 0, -5, + 2, 4, 4, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 3, + 0, 0, -4, 0, -4, -3, -5, 0, + 0, 0, 0, 0, 0, 0, 4, 0, + -4, 0, 0, 0, 0, -5, -7, 0, + -9, 0, 13, -3, 1, -14, 0, 0, + 12, -22, -23, -19, -9, 4, 0, -4, + -29, -8, 0, -8, 0, -9, 7, -8, + -29, 0, -12, 0, 0, 2, -1, 4, + -3, 0, 4, 0, -13, -17, 0, -22, + -11, -9, -11, -13, -5, -12, -1, -9, + -12, 3, 0, 1, 0, -4, 0, 0, + 0, 3, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, -2, 0, -1, -4, 0, -8, -10, + -10, -1, 0, -13, 0, 0, 0, 0, + 0, 0, -4, 0, 0, 0, 0, 2, + -3, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + -9, 0, 0, 0, 0, -22, -13, 0, + 0, 0, -7, -22, 0, 0, -4, 4, + 0, -12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, -8, 0, + 0, 0, 0, 5, 0, 3, -9, -9, + 0, -4, -4, -5, 0, 0, 0, 0, + 0, 0, -13, 0, -4, 0, -7, -4, + 0, -10, -11, -13, -4, 0, -9, 0, + -13, 0, 0, 0, 0, 36, 0, 0, + 2, 0, 0, -6, 0, 4, 0, -19, + 0, 0, 0, 0, 0, -42, -8, 15, + 13, -4, -19, 0, 4, -7, 0, -22, + -2, -6, 4, -31, -4, 6, 0, 7, + -16, -7, -17, -15, -19, 0, 0, -27, + 0, 26, 0, 0, -2, 0, 0, 0, + -2, -2, -4, -12, -15, -1, -42, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, -2, -4, -7, 0, 0, + -9, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -9, 0, 0, 9, + -1, 6, 0, -10, 4, -3, -1, -12, + -4, 0, -6, -4, -3, 0, -7, -8, + 0, 0, -4, -1, -3, -8, -5, 0, + 0, -4, 0, 4, -3, 0, -10, 0, + 0, 0, -9, 0, -8, 0, -8, -8, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, -9, 4, 0, -6, 0, -3, -5, + -14, -3, -3, -3, -1, -3, -5, -1, + 0, 0, 0, 0, 0, -4, -4, -4, + 0, 0, 0, 0, 5, -3, 0, -3, + 0, 0, 0, -3, -5, -3, -4, -5, + -4, 0, 4, 18, -1, 0, -12, 0, + -3, 9, 0, -4, -19, -6, 7, 0, + 0, -21, -8, 4, -8, 3, 0, -3, + -4, -14, 0, -7, 2, 0, 0, -8, + 0, 0, 0, 4, 4, -9, -9, 0, + -8, -4, -7, -4, -4, 0, -8, 2, + -9, -8, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -6, + 0, 0, -4, -4, 0, 0, 0, 0, + -4, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, -3, 0, 0, 0, 0, + -7, 0, -9, 0, 0, 0, -15, 0, + 3, -10, 9, 1, -3, -21, 0, 0, + -10, -4, 0, -18, -11, -13, 0, 0, + -19, -4, -18, -17, -22, 0, -12, 0, + 4, 30, -6, 0, -10, -4, -1, -4, + -8, -12, -8, -17, -18, -10, -4, 0, + 0, -3, 0, 1, 0, 0, -31, -4, + 13, 10, -10, -17, 0, 1, -14, 0, + -22, -3, -4, 9, -41, -6, 1, 0, + 0, -29, -5, -23, -4, -33, 0, 0, + -31, 0, 26, 1, 0, -3, 0, 0, + 0, 0, -2, -3, -17, -3, 0, -29, + 0, 0, 0, 0, -14, 0, -4, 0, + -1, -13, -21, 0, 0, -2, -7, -13, + -4, 0, -3, 0, 0, 0, 0, -20, + -4, -15, -14, -4, -8, -11, -4, -8, + 0, -9, -4, -15, -7, 0, -5, -9, + -4, -9, 0, 2, 0, -3, -15, 0, + 9, 0, -8, 0, 0, 0, 0, 5, + 0, 3, -9, 18, 0, -4, -4, -5, + 0, 0, 0, 0, 0, 0, -13, 0, + -4, 0, -7, -4, 0, -10, -11, -13, + -4, 0, -9, 4, 18, 0, 0, 0, + 0, 36, 0, 0, 2, 0, 0, -6, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -3, -9, 0, 0, 0, 0, 0, -2, + 0, 0, 0, -4, -4, 0, 0, -9, + -4, 0, 0, -9, 0, 8, -2, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 7, 9, 4, -4, 0, -14, + -7, 0, 13, -15, -14, -9, -9, 18, + 8, 4, -39, -3, 9, -4, 0, -4, + 5, -4, -16, 0, -4, 4, -6, -4, + -13, -4, 0, 0, 13, 9, 0, -13, + 0, -25, -6, 13, -6, -17, 1, -6, + -15, -15, -4, 18, 4, 0, -7, 0, + -12, 0, 4, 15, -10, -17, -18, -11, + 13, 0, 1, -33, -4, 4, -8, -3, + -10, 0, -10, -17, -7, -7, -4, 0, + 0, -10, -9, -4, 0, 13, 10, -4, + -25, 0, -25, -6, 0, -16, -26, -1, + -14, -8, -15, -13, 12, 0, 0, -6, + 0, -9, -4, 0, -4, -8, 0, 8, + -15, 4, 0, 0, -24, 0, -4, -10, + -8, -3, -13, -11, -15, -10, 0, -13, + -4, -10, -9, -13, -4, 0, 0, 1, + 21, -8, 0, -13, -4, 0, -4, -9, + -10, -12, -13, -17, -6, -9, 9, 0, + -7, 0, -22, -5, 3, 9, -14, -17, + -9, -15, 15, -4, 2, -42, -8, 9, + -10, -8, -17, 0, -13, -19, -5, -4, + -4, -4, -9, -13, -1, 0, 0, 13, + 13, -3, -29, 0, -27, -10, 11, -17, + -30, -9, -16, -19, -22, -15, 9, 0, + 0, 0, 0, -5, 0, 0, 4, -5, + 9, 3, -9, 9, 0, 0, -14, -1, + 0, -1, 0, 1, 1, -4, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 4, 13, 1, 0, -5, 0, 0, + 0, 0, -3, -3, -5, 0, 0, 0, + 1, 4, 0, 0, 0, 0, 4, 0, + -4, 0, 17, 0, 8, 1, 1, -6, + 0, 9, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -27, 0, -4, 8, 0, 13, + 0, 0, 44, 5, -9, -9, 4, 4, + -3, 1, -22, 0, 0, 22, -27, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -30, 17, 63, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -27, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -9, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, -12, 0, + 0, 1, 0, 0, 4, 58, -9, -4, + 14, 12, -12, 4, 0, 0, 4, 4, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -58, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -13, + 0, 0, 0, -12, 0, 0, 0, 0, + -10, -2, 0, 0, 0, -10, 0, -5, + 0, -21, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -30, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -4, 0, 0, -9, 0, -7, 0, + -12, 0, 0, 0, -8, 4, -5, 0, + 0, -12, -4, -10, 0, 0, -12, 0, + -4, 0, -21, 0, -5, 0, 0, -36, + -9, -18, -5, -16, 0, 0, -30, 0, + -12, -2, 0, 0, 0, 0, 0, 0, + 0, 0, -7, -8, -4, -8, 0, 0, + 0, 0, -10, 0, -10, 6, -5, 9, + 0, -3, -10, -3, -8, -9, 0, -5, + -2, -3, 3, -12, -1, 0, 0, 0, + -39, -4, -6, 0, -10, 0, -3, -21, + -4, 0, 0, -3, -4, 0, 0, 0, + 0, 3, 0, -3, -8, -3, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, 0, + 0, -10, 0, -3, 0, 0, 0, -9, + 4, 0, 0, 0, -12, -4, -9, 0, + 0, -13, 0, -4, 0, -21, 0, 0, + 0, 0, -43, 0, -9, -17, -22, 0, + 0, -30, 0, -3, -7, 0, 0, 0, + 0, 0, 0, 0, 0, -4, -7, -2, + -7, 1, 0, 0, 8, -6, 0, 14, + 22, -4, -4, -13, 5, 22, 8, 10, + -12, 5, 19, 5, 13, 10, 12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 28, 21, -8, -4, 0, -4, + 36, 19, 36, 0, 0, 0, 4, 0, + 0, 17, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 6, + 0, 0, 0, 0, -38, -5, -4, -18, + -22, 0, 0, -30, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, -38, -5, -4, + -18, -22, 0, 0, -18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, -10, 4, 0, -4, + 4, 8, 4, -13, 0, -1, -4, 4, + 0, 4, 0, 0, 0, 0, -11, 0, + -4, -3, -9, 0, -4, -18, 0, 28, + -4, 0, -10, -3, 0, -3, -8, 0, + -4, -13, -9, -5, 0, 0, 0, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, -38, + -5, -4, -18, -22, 0, 0, -30, 0, + 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7, 0, -14, -5, -4, 13, -4, -4, + -18, 1, -3, 1, -3, -12, 1, 10, + 1, 4, 1, 4, -11, -18, -5, 0, + -17, -9, -12, -19, -17, 0, -7, -9, + -5, -6, -4, -3, -5, -3, 0, -3, + -1, 7, 0, 7, -3, 0, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, -4, -4, 0, 0, + -12, 0, -2, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -27, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -6, + 0, 0, 0, 0, -4, 0, 0, -8, + -4, 4, 0, -8, -9, -3, 0, -13, + -3, -10, -3, -5, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -30, 0, 14, 0, 0, -8, 0, + 0, 0, 0, -6, 0, -4, 0, 0, + -2, 0, 0, -3, 0, -10, 0, 0, + 19, -6, -15, -14, 3, 5, 5, -1, + -13, 3, 7, 3, 13, 3, 15, -3, + -12, 0, 0, -18, 0, 0, -13, -12, + 0, 0, -9, 0, -6, -8, 0, -7, + 0, -7, 0, -3, 7, 0, -4, -13, + -4, 17, 0, 0, -4, 0, -9, 0, + 0, 6, -10, 0, 4, -4, 4, 0, + 0, -15, 0, -3, -1, 0, -4, 5, + -4, 0, 0, 0, -18, -5, -10, 0, + -13, 0, 0, -21, 0, 17, -4, 0, + -8, 0, 3, 0, -4, 0, -4, -13, + 0, -4, 4, 0, 0, 0, 0, -3, + 0, 0, 4, -6, 1, 0, 0, -5, + -3, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -28, 0, 10, 0, + 0, -4, 0, 0, 0, 0, 1, 0, + -4, -4, 0, 0, 0, 9, 0, 10, + 0, 0, 0, 0, 0, -28, -26, 1, + 19, 13, 8, -18, 3, 19, 0, 17, + 0, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserrat_28 = { +#else +lv_font_t lv_font_montserrat_28 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 30, /*The maximum line height required by the font*/ + .base_line = 5, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_28*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_28_compressed.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_28_compressed.c new file mode 100644 index 0000000..4612584 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_28_compressed.c @@ -0,0 +1,3280 @@ +/******************************************************************************* + * Size: 28 px + * Bpp: 4 + * Opts: --bpp 4 --size 28 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_28_compressed.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_28_COMPRESSED + #define LV_FONT_MONTSERRAT_28_COMPRESSED 1 +#endif + +#if LV_FONT_MONTSERRAT_28_COMPRESSED + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xc, 0xff, 0x28, 0x6, 0x10, 0x70, 0x3, 0x80, + 0x80, 0x7c, 0x20, 0x60, 0x1f, 0x18, 0x8, 0x0, + 0x43, 0xc0, 0x3f, 0x84, 0x4, 0x3, 0xe3, 0x3, + 0x0, 0x3c, 0x40, 0x0, 0x4e, 0xa0, 0x1f, 0x14, + 0x30, 0x3, 0xde, 0x58, 0x8, 0x1, 0xc1, 0x20, + 0x72, + + /* U+0022 "\"" */ + 0x3f, 0xf0, 0x81, 0x7f, 0x88, 0x3, 0xf8, 0x40, + 0x2, 0x6, 0x0, 0x30, 0xf, 0xfe, 0x31, 0x80, + 0x61, 0x0, 0x8, 0x7, 0xf0, 0xb3, 0x80, 0x4c, + 0xc0, + + /* U+0023 "#" */ + 0x0, 0xf5, 0x7a, 0x80, 0x66, 0xfa, 0x0, 0xfe, + 0x10, 0x60, 0xc, 0x20, 0x40, 0x1f, 0xcc, 0x4, + 0x1, 0xb8, 0x38, 0x3, 0xf8, 0x80, 0x40, 0x31, + 0x1, 0x0, 0x7e, 0x10, 0x20, 0xe, 0x60, 0x60, + 0xc, 0xbf, 0xf7, 0x1, 0x7f, 0xf1, 0x6, 0xff, + 0xb8, 0x3, 0xff, 0x90, 0xbf, 0xf3, 0x83, 0xff, + 0xeb, 0x3, 0xff, 0xb8, 0x3, 0x84, 0x38, 0x3, + 0x8, 0x30, 0x7, 0xf1, 0x1, 0x0, 0x62, 0x2, + 0x0, 0xfe, 0x60, 0x60, 0xd, 0xc1, 0xc0, 0x1f, + 0xc4, 0x4, 0x1, 0x8c, 0x8, 0x3, 0xf0, 0x80, + 0x80, 0x73, 0x3, 0x80, 0x64, 0xff, 0xb8, 0x7, + 0xff, 0x8c, 0x33, 0xfe, 0x0, 0xff, 0xe4, 0x27, + 0xfd, 0x0, 0xff, 0xfb, 0x40, 0xbf, 0xf0, 0x7, + 0x70, 0x70, 0x6, 0x60, 0x60, 0xf, 0xe2, 0x2, + 0x0, 0xc4, 0x4, 0x1, 0xfc, 0xc0, 0xc0, 0x1b, + 0x83, 0x80, 0x3f, 0x88, 0x8, 0x3, 0x10, 0x10, + 0x7, 0x0, + + /* U+0024 "$" */ + 0x0, 0xfb, 0xf0, 0x3, 0xff, 0xbc, 0x31, 0x9c, + 0x7, 0xfb, 0x28, 0x1, 0xcd, 0xce, 0x62, 0x1, + 0x13, 0x5e, 0x90, 0x1, 0x64, 0x0, 0x6e, 0x5, + 0xa, 0x20, 0x46, 0x0, 0xb0, 0x5, 0x64, 0x0, + 0xbd, 0x75, 0x30, 0x82, 0x8, 0x32, 0x80, 0x7c, + 0xb2, 0x0, 0x10, 0x7, 0x80, 0x7f, 0xf0, 0x4, + 0x1, 0x80, 0x1f, 0xfc, 0x4, 0x10, 0x58, 0x0, + 0xff, 0xe0, 0x40, 0x1, 0xfe, 0xc0, 0x3f, 0xcd, + 0x42, 0x0, 0x40, 0x3e, 0x94, 0x0, 0xf2, 0xfc, + 0xa0, 0x4, 0x2d, 0x78, 0x60, 0x1c, 0x2d, 0x7c, + 0x2, 0x40, 0x3, 0xc3, 0x0, 0xf8, 0x40, 0xb7, + 0xc, 0x1, 0xe0, 0x1f, 0xf1, 0xe1, 0x1, 0x88, + 0x7, 0xff, 0x1, 0x40, 0x4, 0x8, 0x1, 0xfe, + 0x30, 0x1, 0x2d, 0xd1, 0x0, 0x7c, 0xa8, 0x6, + 0x3e, 0xb, 0xb9, 0xe, 0x3, 0x19, 0x40, 0xf, + 0xa, 0x60, 0x1, 0xbc, 0x1, 0x39, 0x80, 0xd9, + 0x80, 0x27, 0xa1, 0x4, 0x3, 0x1c, 0x72, 0x0, + 0x61, 0x7b, 0xef, 0x3, 0xfc, 0x70, 0xf, 0xfe, + 0xc0, + + /* U+0025 "%" */ + 0x0, 0x3e, 0xff, 0x40, 0x7, 0xf6, 0xf9, 0x80, + 0x6a, 0x80, 0x62, 0x7c, 0x0, 0xfa, 0x49, 0x8c, + 0x2, 0x45, 0x4d, 0x9c, 0x73, 0x70, 0xe, 0x46, + 0x29, 0x0, 0xde, 0x10, 0x1, 0x40, 0x50, 0x7, + 0x48, 0x70, 0x7, 0x28, 0x18, 0x6, 0x32, 0x10, + 0xa, 0x49, 0x8c, 0x3, 0x84, 0x40, 0x1c, 0xc0, + 0x19, 0x18, 0xa4, 0x3, 0xc2, 0x20, 0xe, 0x60, + 0xd, 0x41, 0xc0, 0x1f, 0x28, 0x18, 0x6, 0x32, + 0x10, 0x91, 0x73, 0x0, 0xfb, 0xc2, 0x0, 0x28, + 0xa, 0x4, 0x62, 0x80, 0xf, 0xc8, 0xa9, 0xb3, + 0x8e, 0x6e, 0x14, 0x1c, 0x0, 0x58, 0x82, 0x80, + 0x6a, 0x80, 0x62, 0x7c, 0x9, 0x17, 0x31, 0xca, + 0x77, 0x56, 0x8, 0x4, 0xfb, 0xfd, 0x0, 0x8c, + 0x50, 0x14, 0x6d, 0xdc, 0x73, 0xa0, 0xf, 0xea, + 0xe, 0x2, 0x43, 0x91, 0x14, 0x1a, 0x18, 0x7, + 0xd2, 0x2e, 0x60, 0x81, 0x40, 0x1a, 0x81, 0x0, + 0x3c, 0x8c, 0x50, 0x0, 0xe0, 0x20, 0xc, 0x41, + 0xe0, 0x1c, 0x34, 0x1c, 0x1, 0x78, 0x8, 0x6, + 0x10, 0xf, 0xac, 0x5c, 0xc0, 0x23, 0xd, 0x0, + 0xda, 0x1a, 0x1, 0x91, 0x4a, 0x0, 0x32, 0xb, + 0x8, 0x0, 0x58, 0x54, 0x2, 0x1a, 0xe, 0x0, + 0xf5, 0xf, 0xc3, 0xf8, 0xd0, 0x6, 0xb1, 0x73, + 0x0, 0xf2, 0x62, 0xbc, 0x2e, 0x20, 0x0, + + /* U+0026 "&" */ + 0x0, 0xc3, 0x3b, 0xfe, 0xd8, 0x0, 0xff, 0x1f, + 0x31, 0x0, 0x9, 0xf4, 0x3, 0xfb, 0x80, 0x6f, + 0xfd, 0x40, 0x50, 0x1, 0xf1, 0x90, 0x5a, 0x0, + 0x15, 0x81, 0x0, 0x3e, 0x70, 0x3, 0x0, 0x61, + 0x0, 0xfe, 0x60, 0x2, 0x0, 0x42, 0xc0, 0x80, + 0x1f, 0x11, 0x84, 0x10, 0x16, 0x8, 0xa4, 0x3, + 0xf7, 0x80, 0x3e, 0x34, 0x87, 0x44, 0x3, 0xf1, + 0xd0, 0x13, 0x82, 0x79, 0x80, 0x7f, 0x1c, 0x80, + 0x43, 0x42, 0x1, 0xfc, 0xd8, 0x62, 0xe0, 0x38, + 0x20, 0x11, 0x20, 0x4, 0xd2, 0xb, 0xf1, 0x40, + 0x58, 0x20, 0xb, 0xb8, 0xa, 0x41, 0x28, 0x41, + 0x68, 0xb, 0x4, 0x10, 0x30, 0x28, 0x1, 0x20, + 0x19, 0x68, 0xb, 0x18, 0x81, 0x0, 0xc0, 0x48, + 0x3, 0x96, 0x80, 0xa4, 0x10, 0xc0, 0x40, 0x44, + 0x1, 0xe5, 0xa0, 0xb, 0x80, 0x18, 0x0, 0xb0, + 0xf, 0xb0, 0x2, 0x81, 0x6, 0x20, 0x5e, 0x75, + 0x45, 0x9e, 0x60, 0x40, 0x2c, 0x10, 0xc4, 0x1, + 0x8a, 0xba, 0x61, 0x14, 0xdd, 0x1, 0x48, 0xd, + 0xd9, 0x88, 0x0, 0x29, 0x3c, 0xc0, 0xb4, 0x90, + 0x1, 0x24, 0xef, 0xfb, 0xad, 0x80, 0x32, 0xd8, + 0x0, + + /* U+0027 "'" */ + 0x3f, 0xf0, 0x80, 0x61, 0x0, 0x8, 0x7, 0xe3, + 0x0, 0xf8, 0x59, 0xc0, + + /* U+0028 "(" */ + 0x0, 0x93, 0xfc, 0x80, 0x14, 0x1, 0xa0, 0x1, + 0xc, 0x24, 0x2, 0xf0, 0x15, 0x0, 0x90, 0x1c, + 0x2, 0x50, 0x6, 0x80, 0x58, 0x0, 0x40, 0x9, + 0x40, 0x80, 0x31, 0x83, 0x80, 0x44, 0x0, 0xd0, + 0x8, 0x40, 0x2, 0x1, 0x38, 0x7, 0x84, 0x0, + 0x60, 0x1f, 0xe1, 0x0, 0x18, 0x4, 0xe0, 0x1e, + 0x10, 0x0, 0x80, 0x44, 0x0, 0xd0, 0xc, 0x60, + 0xe0, 0x19, 0x40, 0x80, 0x36, 0x0, 0x10, 0x2, + 0x50, 0x6, 0x80, 0x65, 0x7, 0x0, 0xdc, 0x2, + 0xa0, 0x12, 0x18, 0x48, 0x6, 0x80, 0x34, + + /* U+0029 ")" */ + 0xd, 0xfb, 0x0, 0xd6, 0x8, 0x60, 0x13, 0x10, + 0x40, 0x6, 0xa0, 0x42, 0x0, 0x94, 0x0, 0xa0, + 0x11, 0x10, 0x2c, 0x3, 0x28, 0x18, 0x6, 0xe0, + 0x1, 0x80, 0x4a, 0x0, 0x50, 0x8, 0xc0, 0x1e, + 0x1, 0xe3, 0x0, 0xc2, 0x2, 0x1, 0x8c, 0x1c, + 0x3, 0xfe, 0x30, 0x70, 0xc, 0x20, 0x20, 0x1e, + 0x30, 0x8, 0xc0, 0x1e, 0x1, 0x28, 0x1, 0x40, + 0x2e, 0x0, 0x18, 0x4, 0xa0, 0x60, 0x11, 0x10, + 0x2c, 0x2, 0x50, 0x2, 0x80, 0x54, 0x8, 0x40, + 0x6, 0x20, 0x80, 0xa, 0xc1, 0xc, 0x0, + + /* U+002A "*" */ + 0x0, 0xc7, 0xec, 0x1, 0xff, 0xc3, 0x1e, 0x80, + 0xe, 0x7e, 0x32, 0x37, 0xea, 0xc, 0xd8, 0x6, + 0x3d, 0x80, 0x60, 0x52, 0x6f, 0x50, 0x3, 0x20, + 0x4, 0x76, 0x20, 0x7, 0xf5, 0x10, 0x13, 0xd9, + 0x13, 0x80, 0x9d, 0x8, 0xb2, 0x67, 0x39, 0xf6, + 0x0, 0x93, 0x65, 0x81, 0x84, 0x3, 0xcc, 0x1, + 0xc5, 0xa, 0x1, 0x80, + + /* U+002B "+" */ + 0x0, 0xf2, 0x20, 0x40, 0x3f, 0xeb, 0xb2, 0x0, + 0x7f, 0xf9, 0xc, 0xf8, 0x0, 0x46, 0x78, 0x4b, + 0x33, 0x80, 0x11, 0x99, 0x9c, 0x3, 0xff, 0x84, + 0x5f, 0xfc, 0x0, 0xaf, 0xfc, 0xc0, 0x1f, 0xfe, + 0xc0, + + /* U+002C "," */ + 0x1a, 0xb4, 0x9, 0x54, 0xa0, 0x10, 0x0, 0x85, + 0x90, 0x18, 0x13, 0x85, 0x0, 0x10, 0x1c, 0x8, + 0x4c, 0x41, 0x2, 0x80, 0x0, + + /* U+002D "-" */ + 0x25, 0x5f, 0x81, 0x2a, 0xbe, 0x20, 0xf, 0xe0, + + /* U+002E "." */ + 0x1a, 0xc4, 0x8, 0x53, 0xa0, 0x30, 0x0, 0x84, + 0x10, 0xc8, 0x0, + + /* U+002F "/" */ + 0x0, 0xfe, 0x58, 0x60, 0xf, 0xeb, 0x7e, 0x0, + 0xfc, 0x62, 0x16, 0x1, 0xfa, 0x80, 0x8c, 0x3, + 0xf3, 0x85, 0x0, 0x7e, 0x41, 0x5, 0x0, 0xfd, + 0xc0, 0x64, 0x1, 0xf9, 0x42, 0xc0, 0x3f, 0x28, + 0x1, 0x80, 0x3f, 0x78, 0x18, 0x80, 0x7e, 0x50, + 0xa0, 0xf, 0xcc, 0x0, 0x70, 0xf, 0xda, 0x8, + 0x20, 0x1f, 0xa, 0x7, 0x0, 0x7e, 0x70, 0x2, + 0x80, 0x7e, 0xa0, 0x50, 0xf, 0xc4, 0x61, 0xe0, + 0x1f, 0x94, 0x5, 0x40, 0x3f, 0x50, 0x38, 0x7, + 0xe2, 0x20, 0x68, 0x7, 0xea, 0x1, 0x40, 0xf, + 0xca, 0xe, 0x1, 0xf8, 0xc8, 0x28, 0x3, 0xf5, + 0x1, 0x18, 0x7, 0xe7, 0x5, 0x0, 0xfc, 0x82, + 0x14, 0x1, 0xfb, 0x40, 0x88, 0x1, 0xf8, + + /* U+0030 "0" */ + 0x0, 0xe7, 0xcf, 0xf7, 0x5a, 0x80, 0x7e, 0x4e, + 0x83, 0x0, 0xa, 0x55, 0x88, 0x7, 0x25, 0x88, + 0x13, 0x3a, 0x80, 0x13, 0x4, 0x2, 0x1a, 0x0, + 0x46, 0xcc, 0x57, 0x20, 0x15, 0x80, 0x52, 0x20, + 0xee, 0x0, 0xc3, 0x64, 0xa, 0x60, 0x6, 0x1, + 0x80, 0xf, 0xa4, 0x1, 0x40, 0x62, 0xe, 0x1, + 0xf9, 0x4, 0x1c, 0x10, 0x1, 0x80, 0x1f, 0xca, + 0x2, 0x2e, 0x0, 0x30, 0x7, 0xf1, 0x80, 0x8, + 0xc0, 0x2, 0x1, 0xfd, 0xe0, 0x7, 0x0, 0xff, + 0xe2, 0x98, 0x0, 0x40, 0x3f, 0xbc, 0x0, 0xfc, + 0x0, 0x60, 0xf, 0xe3, 0x0, 0x12, 0x0, 0x30, + 0x3, 0xf9, 0x40, 0x44, 0x62, 0xe, 0x1, 0xf9, + 0x4, 0x1c, 0x0, 0xc0, 0x30, 0x1, 0xf4, 0x80, + 0x28, 0x1, 0x22, 0xe, 0xe0, 0xc, 0x36, 0x40, + 0xa6, 0x0, 0x1a, 0x0, 0x46, 0xcc, 0x57, 0x20, + 0x15, 0x80, 0x64, 0xb1, 0x2, 0x67, 0x50, 0x1, + 0xe0, 0x80, 0x72, 0x74, 0x18, 0x0, 0x52, 0xb0, + 0x40, 0x20, + + /* U+0031 "1" */ + 0xcf, 0xff, 0x30, 0x7, 0xe9, 0x88, 0x94, 0x2, + 0x57, 0x7b, 0xc0, 0x3f, 0xff, 0xe0, 0x1f, 0xfe, + 0xc0, + + /* U+0032 "2" */ + 0x0, 0x8e, 0x33, 0xbf, 0xd9, 0x4, 0x1, 0xc5, + 0x78, 0xe6, 0x20, 0x3, 0x7d, 0x60, 0x8, 0xb1, + 0x0, 0x8, 0xce, 0xa2, 0x0, 0x95, 0x0, 0x8c, + 0x1b, 0xae, 0x62, 0xb9, 0xc0, 0x16, 0x0, 0x2c, + 0x99, 0x8, 0x7, 0x41, 0x80, 0x90, 0x0, 0x58, + 0x3, 0xf2, 0x0, 0x18, 0x3, 0xff, 0x80, 0x20, + 0x6, 0x0, 0xff, 0xe0, 0x38, 0x9, 0x0, 0x7f, + 0xce, 0x20, 0xe0, 0x1f, 0xf2, 0x40, 0xc, 0x0, + 0x7f, 0x8e, 0xc0, 0x14, 0x20, 0x1f, 0xc9, 0x80, + 0xb, 0x40, 0xf, 0xe4, 0xb0, 0x5, 0xa0, 0x7, + 0xf2, 0x58, 0x2, 0xd0, 0x3, 0xf9, 0x2c, 0x1, + 0x68, 0x1, 0xfc, 0xb6, 0x0, 0xc4, 0x0, 0xfe, + 0x5a, 0x0, 0x61, 0x80, 0x7f, 0x2d, 0x0, 0x15, + 0x1d, 0xff, 0x0, 0x28, 0x2, 0x58, 0x8f, 0xe2, + 0x0, 0xff, 0xe2, 0x0, + + /* U+0033 "3" */ + 0xf, 0xff, 0xfe, 0x8, 0x7, 0xff, 0x16, 0x62, + 0x3f, 0x10, 0x2, 0x0, 0xc, 0xef, 0xf0, 0x90, + 0x2b, 0x80, 0x7f, 0x1c, 0x81, 0x50, 0x7, 0xf0, + 0xe8, 0x3, 0xc0, 0x3f, 0xda, 0x21, 0x64, 0x1, + 0xfd, 0x26, 0x10, 0x80, 0x1f, 0xca, 0xc0, 0xe, + 0x61, 0x0, 0xfc, 0x40, 0x13, 0x4f, 0x38, 0x7, + 0xc8, 0xee, 0x52, 0x0, 0x44, 0x80, 0x78, 0xe2, + 0x15, 0xb6, 0x0, 0x63, 0x0, 0xff, 0x24, 0x80, + 0x2c, 0x3, 0xfe, 0x70, 0x1, 0x80, 0x7f, 0xf0, + 0x84, 0x14, 0x3, 0xf9, 0xc0, 0x4, 0x75, 0x88, + 0x1, 0xe5, 0x90, 0x5, 0x48, 0x1d, 0xf5, 0x44, + 0x27, 0x68, 0x1, 0x5, 0x4c, 0x0, 0x15, 0x77, + 0x31, 0x0, 0x21, 0xc0, 0x13, 0xd2, 0xa4, 0x0, + 0x13, 0x8d, 0x70, 0x0, + + /* U+0034 "4" */ + 0x0, 0xfe, 0x4f, 0xf5, 0x80, 0x7f, 0xf0, 0x4a, + 0x80, 0x68, 0x3, 0xff, 0x83, 0xc2, 0x1a, 0x20, + 0x1f, 0xfc, 0x9, 0x30, 0x83, 0x0, 0xff, 0xe0, + 0x2b, 0x2, 0xb8, 0x7, 0xff, 0x0, 0xa8, 0xa, + 0x80, 0x3f, 0xf8, 0x3e, 0x0, 0xe0, 0xf, 0xfe, + 0xd, 0x10, 0x49, 0x80, 0x7f, 0xf0, 0x1d, 0x41, + 0x58, 0x2, 0xab, 0x70, 0xf, 0x1c, 0x1, 0x50, + 0x6, 0x54, 0xd0, 0xe, 0x1d, 0x0, 0x78, 0x7, + 0xff, 0x6, 0x84, 0x28, 0x80, 0x3f, 0xf8, 0x10, + 0x80, 0x46, 0xcd, 0xe0, 0x3, 0x36, 0x26, 0x0, + 0x14, 0xcf, 0xc0, 0x3, 0x99, 0x90, 0x40, 0x3f, + 0xf8, 0xbf, 0xff, 0xf0, 0x1, 0x7f, 0xe6, 0x0, + 0xff, 0xfe, 0x0, + + /* U+0035 "5" */ + 0x0, 0xf, 0xff, 0xfc, 0x1, 0x88, 0x3, 0xff, + 0x86, 0xe0, 0x6, 0x88, 0xfc, 0x1, 0x88, 0x1, + 0x4e, 0xff, 0x80, 0x37, 0x0, 0x8, 0x3, 0xff, + 0x80, 0x20, 0x1, 0x0, 0xff, 0xe0, 0x10, 0x8, + 0x7, 0xff, 0x5, 0xc0, 0xc0, 0x3f, 0xf8, 0x24, + 0x5, 0xff, 0x76, 0x4a, 0x0, 0x78, 0x40, 0x38, + 0x4d, 0xaf, 0x8, 0x3, 0x44, 0x79, 0x8c, 0x0, + 0x78, 0x20, 0x13, 0xbf, 0xa7, 0x34, 0xc0, 0x60, + 0x3, 0xfe, 0x2d, 0x0, 0x38, 0x7, 0xff, 0x0, + 0x4c, 0x4, 0x3, 0xff, 0x8c, 0x62, 0x1, 0xf8, + 0x4c, 0x8, 0x1, 0xde, 0xc0, 0x1e, 0x2d, 0x0, + 0x50, 0x29, 0xc, 0xfd, 0xcc, 0x4d, 0xe9, 0x81, + 0x38, 0x2d, 0x10, 0x1, 0x19, 0xd9, 0x0, 0x9, + 0x80, 0x12, 0xed, 0xb1, 0x88, 0x9, 0x35, 0xd8, + 0x40, 0x0, + + /* U+0036 "6" */ + 0x0, 0xe2, 0x8c, 0xef, 0xf6, 0xd2, 0x0, 0x70, + 0xd6, 0xb9, 0x88, 0x0, 0x96, 0xd0, 0x2, 0x1c, + 0x50, 0x2, 0x3c, 0xbb, 0x9, 0x20, 0x5, 0xa4, + 0x9, 0xb7, 0xd, 0x13, 0xde, 0x1, 0x31, 0x82, + 0x59, 0x0, 0x78, 0x80, 0x2b, 0x0, 0x50, 0x7, + 0xfc, 0x44, 0x5, 0x10, 0xf, 0xf9, 0x0, 0x18, + 0x1, 0xff, 0xc0, 0xe0, 0x2, 0x82, 0xd7, 0x7f, + 0x6c, 0x10, 0x4, 0x40, 0x15, 0xd2, 0x88, 0x9, + 0x3e, 0xb8, 0x7, 0x72, 0x3, 0x55, 0xca, 0x80, + 0x21, 0x80, 0xc0, 0x4, 0x4e, 0x95, 0x46, 0xab, + 0x0, 0x40, 0x70, 0x5, 0xc2, 0x1, 0xc8, 0xe0, + 0x2a, 0x60, 0x1, 0x30, 0xf, 0xb0, 0x0, 0x4a, + 0x1, 0xff, 0xc2, 0x11, 0x28, 0x9, 0x80, 0x7d, + 0x80, 0x2, 0x8, 0x0, 0x70, 0x80, 0x72, 0x38, + 0x12, 0x1, 0x40, 0x17, 0x4a, 0xa2, 0xd5, 0x80, + 0x24, 0x2, 0x79, 0x0, 0x35, 0x5d, 0x28, 0xd, + 0xa0, 0x6, 0x6e, 0x83, 0x10, 0x13, 0x8f, 0x40, + 0x0, + + /* U+0037 "7" */ + 0x2f, 0xff, 0xfe, 0x15, 0x0, 0x7f, 0xf0, 0xcc, + 0x2, 0x48, 0x8f, 0xc6, 0x0, 0xc0, 0x8, 0xdd, + 0xff, 0x18, 0xa, 0x80, 0x7f, 0xcc, 0x0, 0x90, + 0xf, 0xfe, 0x5, 0x80, 0x18, 0xb, 0xfd, 0x0, + 0x1e, 0x42, 0x6, 0x10, 0xf, 0xfa, 0x0, 0x16, + 0x1, 0xff, 0x19, 0x81, 0x8, 0x3, 0xfe, 0x90, + 0x7, 0x80, 0x7f, 0xc2, 0xa0, 0x48, 0x1, 0xff, + 0x48, 0x2, 0xc0, 0x3f, 0xf8, 0xc, 0x2, 0xc0, + 0x1f, 0xf3, 0x8, 0x30, 0x7, 0xff, 0x2, 0xc0, + 0x12, 0x1, 0xff, 0x21, 0x2, 0x88, 0x7, 0xfd, + 0xe0, 0x9, 0x0, 0xff, 0x89, 0x0, 0xcc, 0x1, + 0xff, 0x58, 0x2, 0x40, 0x3f, 0xe1, 0x60, 0x15, + 0x0, 0xf8, + + /* U+0038 "8" */ + 0x0, 0xcb, 0x5b, 0xfe, 0xda, 0x60, 0xf, 0x1e, + 0xd2, 0x90, 0x0, 0x96, 0x74, 0xc0, 0x22, 0xd2, + 0x2, 0x8a, 0xa4, 0x10, 0x16, 0x10, 0x2, 0x4, + 0x1f, 0x5d, 0x54, 0xfa, 0xe0, 0x8, 0x0, 0x20, + 0xc, 0x0, 0x7a, 0x8, 0x14, 0x0, 0x20, 0xa0, + 0x1f, 0x9c, 0x3, 0xcc, 0x1, 0xf9, 0x80, 0x32, + 0x81, 0x28, 0x7, 0x94, 0xc1, 0x40, 0x16, 0x21, + 0x54, 0x42, 0x22, 0xd5, 0x0, 0x6c, 0x0, 0x38, + 0x60, 0xb7, 0xba, 0xa5, 0x3, 0xc1, 0x0, 0xa8, + 0xc0, 0x3f, 0x1d, 0x0, 0x56, 0xe0, 0x75, 0xbf, + 0xed, 0x92, 0x7, 0xb0, 0x54, 0x4, 0xc5, 0x20, + 0x1, 0x36, 0xa8, 0x22, 0xf8, 0x2, 0x40, 0x3f, + 0x40, 0x3, 0xc4, 0x0, 0x40, 0x1f, 0x88, 0x0, + 0xc4, 0x0, 0x40, 0xf, 0xc8, 0x0, 0x6d, 0x0, + 0x49, 0x0, 0x78, 0xa4, 0x1, 0xe8, 0xa0, 0x5b, + 0x4c, 0x8a, 0xd5, 0xa4, 0x8, 0xa1, 0x4c, 0x0, + 0x59, 0xba, 0x95, 0x0, 0x35, 0x80, 0x53, 0xb0, + 0x62, 0x0, 0x13, 0x8d, 0x90, 0x0, + + /* U+0039 "9" */ + 0x0, 0xcb, 0x7d, 0xfd, 0xb2, 0x60, 0x1e, 0x2c, + 0xa4, 0x10, 0x12, 0x6c, 0x90, 0xc, 0x3e, 0x60, + 0x73, 0x74, 0xe4, 0xd, 0x40, 0x14, 0x10, 0x3e, + 0x32, 0x2c, 0x6a, 0x82, 0xb0, 0x1, 0x80, 0xa0, + 0x3, 0xd4, 0x21, 0x0, 0x40, 0x5, 0x0, 0xfc, + 0xe0, 0x2a, 0x1, 0xff, 0xc3, 0xc2, 0x0, 0x28, + 0x7, 0xe7, 0x0, 0x28, 0x28, 0x14, 0x0, 0x7a, + 0x84, 0x0, 0x21, 0x0, 0x7, 0xd7, 0x55, 0x46, + 0xa8, 0x88, 0xc, 0xb, 0x4, 0xa, 0x2a, 0x8e, + 0x43, 0xa0, 0x1c, 0x7d, 0x6, 0x20, 0x29, 0x3c, + 0x62, 0x6, 0x1, 0x9f, 0x3b, 0xfa, 0xd8, 0x8, + 0x0, 0xe0, 0x1f, 0xfc, 0x4, 0x0, 0x68, 0x7, + 0xff, 0x2, 0x80, 0xc, 0x1, 0xff, 0x39, 0x82, + 0x88, 0x0, 0x44, 0x1, 0xe8, 0x80, 0xd, 0x80, + 0x53, 0xd5, 0xc, 0xf5, 0xce, 0x0, 0xd1, 0x0, + 0x9c, 0x15, 0xe6, 0x14, 0x40, 0xf4, 0xc0, 0x36, + 0x31, 0x80, 0x44, 0xd7, 0x84, 0x1, 0x0, + + /* U+003A ":" */ + 0x2d, 0xe6, 0x8, 0x21, 0x90, 0x30, 0x0, 0x84, + 0x29, 0xd0, 0xd, 0x62, 0x0, 0x7f, 0xf4, 0xc6, + 0xb1, 0x2, 0x14, 0xe8, 0xc, 0x0, 0x21, 0x4, + 0x32, 0x0, + + /* U+003B ";" */ + 0x2d, 0xe6, 0x8, 0x21, 0x90, 0x30, 0x0, 0x84, + 0x29, 0xd0, 0xd, 0x62, 0x0, 0x7f, 0xf4, 0xc6, + 0xad, 0x2, 0x55, 0x28, 0x4, 0x0, 0x21, 0x64, + 0x6, 0x4, 0xe1, 0x40, 0x4, 0x7, 0x2, 0x13, + 0x10, 0x40, 0xa0, 0x0, + + /* U+003C "<" */ + 0x0, 0xff, 0x8e, 0x58, 0x3, 0xf0, 0xb6, 0xe3, + 0x0, 0x7c, 0x75, 0xd2, 0x40, 0x88, 0x0, 0x85, + 0xf7, 0x14, 0xa, 0x3a, 0xc8, 0x12, 0xba, 0x8, + 0x17, 0x35, 0xc4, 0x0, 0x56, 0xa0, 0x73, 0xf4, + 0x60, 0x1f, 0x86, 0x9c, 0x3, 0xf1, 0x28, 0xc, + 0xf5, 0x20, 0x7, 0xd5, 0xd2, 0x40, 0xb7, 0xae, + 0x20, 0x1c, 0x2d, 0xb8, 0xc0, 0x51, 0xd6, 0xa0, + 0x1e, 0x39, 0xf9, 0x30, 0x4a, 0x60, 0xf, 0xcd, + 0x98, 0x60, 0xf, 0xfe, 0x1, 0xcf, 0xb8, + + /* U+003D "=" */ + 0x2f, 0xff, 0xfe, 0x3, 0x0, 0x7f, 0xf0, 0x8b, + 0x33, 0xff, 0x80, 0xe0, 0x67, 0xff, 0xc0, 0x10, + 0xf, 0xfe, 0x89, 0x9f, 0xff, 0x0, 0x4b, 0x33, + 0xff, 0x80, 0xe0, 0x1f, 0xfc, 0x20, + + /* U+003E ">" */ + 0x1b, 0x50, 0xf, 0xf8, 0xd2, 0xba, 0x8, 0x3, + 0xf1, 0x30, 0x89, 0xf7, 0x14, 0x3, 0xe9, 0xea, + 0x40, 0x3a, 0xe9, 0x20, 0xf, 0x2d, 0xeb, 0x88, + 0x9b, 0x71, 0x80, 0x3c, 0x51, 0xd6, 0xa0, 0x72, + 0xc0, 0x1f, 0x93, 0x90, 0x3, 0xf8, 0xa3, 0xad, + 0x0, 0xd4, 0x3, 0x2e, 0x6b, 0x88, 0x9f, 0x70, + 0xc0, 0xe7, 0xe8, 0xc1, 0x2b, 0xa0, 0x80, 0x3, + 0x8c, 0x2, 0xfb, 0x6a, 0x1, 0xc6, 0x9, 0x5d, + 0x4, 0x1, 0xf1, 0x75, 0xa8, 0x7, 0xf8, + + /* U+003F "?" */ + 0x0, 0x92, 0x77, 0xbf, 0xd9, 0x24, 0x1, 0x8a, + 0xec, 0xc4, 0x20, 0x3, 0x6d, 0x80, 0x1, 0xe2, + 0x0, 0xb4, 0x4b, 0x90, 0x1, 0xd8, 0x1c, 0x1, + 0x1d, 0x2e, 0xd1, 0xb0, 0x0, 0x80, 0x4f, 0xa7, + 0x0, 0xf3, 0x90, 0x8, 0x80, 0x54, 0x3, 0xf3, + 0x0, 0x7f, 0xf0, 0x94, 0x4, 0x40, 0x1f, 0xe8, + 0x10, 0x60, 0xf, 0xf4, 0x38, 0x1c, 0x0, 0x7f, + 0x4b, 0x81, 0xe0, 0x7, 0xf4, 0x30, 0x26, 0x0, + 0x7f, 0x13, 0x81, 0x58, 0x7, 0xf9, 0x40, 0x16, + 0x1, 0xff, 0x12, 0xa9, 0x0, 0x3f, 0xe5, 0xaa, + 0x10, 0x7, 0xff, 0x38, 0x61, 0x80, 0x3f, 0xf8, + 0x18, 0xf2, 0xc0, 0x1f, 0xf1, 0x0, 0x38, 0x3, + 0xfe, 0x91, 0x29, 0x0, 0xe0, + + /* U+0040 "@" */ + 0x0, 0xfc, 0x4f, 0x7b, 0xff, 0x75, 0xc1, 0x80, + 0x7f, 0xf0, 0x93, 0x36, 0x10, 0x84, 0x84, 0x48, + 0xf9, 0x85, 0x0, 0xff, 0xaa, 0xcc, 0xa3, 0x7f, + 0xb7, 0xbf, 0x64, 0xcd, 0x56, 0x20, 0x1f, 0xe, + 0xa8, 0xd6, 0xb9, 0x0, 0x71, 0x36, 0x59, 0x26, + 0x8, 0x7, 0xe, 0x11, 0xfa, 0x80, 0x7f, 0xc9, + 0xaa, 0x58, 0x20, 0x1a, 0xc8, 0xf0, 0x40, 0x3, + 0x1b, 0xfe, 0xd8, 0x10, 0xff, 0x45, 0x21, 0x58, + 0x4, 0x6a, 0x1c, 0x1, 0x27, 0x39, 0x0, 0x9, + 0xfd, 0x0, 0x35, 0xa, 0x98, 0x2, 0x1, 0xc8, + 0x0, 0x96, 0x0, 0x7c, 0xc5, 0x20, 0xd8, 0x6, + 0x18, 0x8, 0x1, 0x40, 0x90, 0xa, 0x80, 0x76, + 0xc, 0xcb, 0x72, 0x1, 0xe6, 0x14, 0x14, 0x3, + 0x10, 0x2, 0x88, 0x51, 0x0, 0x73, 0x28, 0x7, + 0x90, 0x17, 0x41, 0x0, 0x2f, 0x2, 0x40, 0xf, + 0xa4, 0x3, 0xda, 0x6, 0x21, 0xe0, 0x13, 0x83, + 0x80, 0x7e, 0x30, 0xf, 0x10, 0x79, 0x80, 0x80, + 0x46, 0x6, 0x1, 0xfc, 0x20, 0x1c, 0x20, 0x26, + 0x2, 0x1, 0x18, 0x18, 0x7, 0xf0, 0x80, 0x70, + 0x80, 0xf0, 0x70, 0x4, 0xe0, 0xe0, 0x1f, 0x8c, + 0x3, 0xc4, 0x1e, 0x40, 0xa0, 0x17, 0x81, 0x20, + 0x7, 0xd2, 0x1, 0xed, 0x3, 0x40, 0x31, 0x0, + 0x28, 0x85, 0x10, 0x7, 0x32, 0x80, 0x4, 0x0, + 0x2a, 0x8, 0x28, 0x12, 0x1, 0x50, 0xe, 0xc1, + 0x92, 0x54, 0x81, 0x83, 0x29, 0xe8, 0x38, 0x2, + 0x1, 0xc8, 0x0, 0x96, 0x0, 0x7c, 0xdb, 0x51, + 0xb8, 0x0, 0x56, 0x19, 0xa0, 0x0, 0x6a, 0x1c, + 0x1, 0x27, 0x39, 0x80, 0x9, 0xfd, 0x11, 0x44, + 0x2, 0xf8, 0x1, 0xa8, 0x8f, 0x4, 0x0, 0x31, + 0x9f, 0xed, 0x81, 0x0, 0x2e, 0xff, 0x40, 0x7, + 0xb0, 0x8f, 0xd4, 0x3, 0xff, 0x94, 0x38, 0xa3, + 0x5a, 0xe6, 0x1, 0xc6, 0xf8, 0x1, 0xff, 0xc0, + 0x1a, 0xb3, 0x28, 0xcf, 0xee, 0xbf, 0x20, 0xd0, + 0x3, 0xff, 0x82, 0x99, 0x88, 0x41, 0x1c, 0x4b, + 0x3c, 0x80, 0x1f, 0x0, + + /* U+0041 "A" */ + 0x0, 0xfe, 0x6f, 0xf6, 0x80, 0x7f, 0xf1, 0xac, + 0x0, 0x48, 0x1, 0xff, 0xc4, 0x42, 0x0, 0xbc, + 0x3, 0xff, 0x89, 0xe0, 0x2c, 0x8, 0x40, 0x1f, + 0xfc, 0x22, 0x40, 0x68, 0x0, 0x40, 0x7, 0xff, + 0xa, 0xc0, 0x12, 0x2a, 0xa, 0x20, 0x1f, 0xfc, + 0x1, 0x60, 0x51, 0x9, 0x0, 0x48, 0x7, 0xff, + 0x1, 0x80, 0x12, 0x0, 0x33, 0x3, 0x0, 0x7f, + 0xf0, 0x24, 0x8, 0xc0, 0x2a, 0x1, 0x60, 0xf, + 0xf2, 0x88, 0x58, 0x6, 0x61, 0xb, 0x0, 0xff, + 0x40, 0xb, 0x0, 0x73, 0x1, 0x20, 0x7, 0xe4, + 0x20, 0x60, 0xf, 0x48, 0x3, 0xc0, 0x3f, 0x78, + 0x3, 0x4c, 0xfc, 0x46, 0x8, 0x60, 0x1e, 0x24, + 0x0, 0x56, 0x67, 0xc6, 0x0, 0x90, 0xf, 0x58, + 0x7, 0xff, 0x9, 0x44, 0x3, 0xb, 0x1, 0xff, + 0xff, 0xa8, 0x1, 0x20, 0x19, 0x80, 0x12, 0x1, + 0xfe, 0x51, 0x6, 0x0, 0xd2, 0x2, 0xa0, 0x1f, + 0xf3, 0x0, 0xb0, 0x1, 0x44, 0x18, 0x3, 0xff, + 0x81, 0x20, 0xb, 0x0, 0x48, 0x2, 0x40, 0x3f, + 0xf8, 0x2, 0xa0, 0x48, + + /* U+0042 "B" */ + 0x1f, 0xff, 0xf6, 0xd2, 0x80, 0x7f, 0xf0, 0xc9, + 0x6b, 0x48, 0x3, 0x8e, 0xef, 0xd2, 0xc0, 0x2, + 0xf0, 0xe, 0x74, 0x4f, 0x34, 0xf1, 0x81, 0x30, + 0x7, 0xff, 0x4, 0x7c, 0x1, 0x80, 0x1f, 0xfc, + 0x22, 0x0, 0x8, 0x7, 0xff, 0x8, 0xc0, 0x4, + 0x1, 0xff, 0xc2, 0xb0, 0x6, 0x80, 0x7f, 0xc2, + 0x96, 0xc0, 0x88, 0x0, 0xc9, 0xff, 0xee, 0xb4, + 0x5, 0xb0, 0xf, 0xfe, 0x22, 0x38, 0x7, 0x1d, + 0xdf, 0xd4, 0xe2, 0x28, 0xa0, 0xc, 0xe8, 0x9f, + 0x2c, 0x71, 0x82, 0xa0, 0x7, 0xff, 0xb, 0xc0, + 0x1a, 0x1, 0xff, 0xc2, 0x30, 0x2, 0x80, 0x7f, + 0xf0, 0x8c, 0x0, 0xe0, 0x1f, 0xfc, 0x28, 0x0, + 0x60, 0x4, 0xe8, 0x9f, 0x2c, 0x72, 0x0, 0xb0, + 0x4, 0x77, 0x7f, 0x53, 0x88, 0x16, 0x8, 0x7, + 0xff, 0x0, 0x96, 0xb4, 0x80, + + /* U+0043 "C" */ + 0x0, 0xf1, 0xc6, 0x77, 0xf6, 0xd2, 0x80, 0x7e, + 0x2b, 0xc7, 0x31, 0x1, 0x25, 0xae, 0x50, 0xe, + 0x5d, 0x40, 0x1, 0x2b, 0xb2, 0x0, 0x6, 0xa0, + 0x2, 0x5a, 0x0, 0x26, 0x6d, 0x44, 0xdf, 0xc8, + 0x81, 0x80, 0x6, 0x80, 0xf, 0x66, 0x1, 0xe6, + 0xc7, 0xb0, 0x5, 0x80, 0x16, 0x0, 0x3f, 0x8a, + 0x0, 0x2, 0xa0, 0xa, 0x0, 0xff, 0xe1, 0x20, + 0x1, 0x80, 0x3f, 0xf8, 0x7a, 0x0, 0xc0, 0xf, + 0xfe, 0x19, 0x0, 0x18, 0x3, 0xff, 0xac, 0x40, + 0x6, 0x0, 0xff, 0xe1, 0xe8, 0x3, 0x0, 0x3f, + 0xf8, 0x68, 0x0, 0x60, 0xf, 0xfe, 0x18, 0xa8, + 0x2, 0x80, 0x3f, 0xf8, 0x76, 0x0, 0x58, 0x0, + 0xfe, 0x29, 0x0, 0x86, 0x80, 0xf, 0x66, 0x1, + 0xe6, 0xc6, 0xb0, 0x9, 0x68, 0x0, 0x99, 0xb5, + 0x10, 0xaf, 0x91, 0x3, 0x0, 0xcb, 0xa6, 0x0, + 0x25, 0x77, 0x28, 0x0, 0x6a, 0x0, 0x38, 0xb3, + 0xe, 0x62, 0x2, 0x4b, 0x5c, 0xa0, 0x0, + + /* U+0044 "D" */ + 0x1f, 0xff, 0xee, 0xc9, 0x40, 0xf, 0xfe, 0x20, + 0x9b, 0x5e, 0xa0, 0x7, 0xc5, 0x11, 0xe6, 0x30, + 0x1, 0x5c, 0x0, 0x79, 0x9d, 0xfd, 0x39, 0xac, + 0x0, 0x78, 0x0, 0xff, 0xe1, 0x14, 0xd0, 0x1, + 0xd0, 0x3, 0xff, 0x86, 0xb2, 0x0, 0x80, 0xf, + 0xfe, 0x23, 0x10, 0x19, 0x80, 0x3f, 0xf8, 0x96, + 0x0, 0x40, 0xf, 0xfe, 0x22, 0x80, 0x34, 0x3, + 0xff, 0x88, 0x40, 0x6, 0x0, 0xff, 0xec, 0x10, + 0x1, 0x80, 0x3f, 0xf8, 0x8a, 0x0, 0xd0, 0xf, + 0xfe, 0x25, 0x80, 0x10, 0x3, 0xff, 0x86, 0xc4, + 0x6, 0x60, 0xf, 0xfe, 0x12, 0x48, 0x2, 0x0, + 0x3f, 0xf8, 0x23, 0x36, 0x0, 0x74, 0x0, 0xcc, + 0xef, 0xe9, 0xce, 0x60, 0x3, 0xc0, 0x7, 0x14, + 0x47, 0x98, 0xc0, 0x5, 0x70, 0x1, 0xff, 0xc1, + 0x13, 0x6b, 0xd4, 0x0, 0xc0, + + /* U+0045 "E" */ + 0x1f, 0xff, 0xfe, 0xe, 0x0, 0x7f, 0xf2, 0xa, + 0x23, 0xfd, 0x20, 0x19, 0x9d, 0xff, 0xca, 0x1, + 0xff, 0xff, 0x0, 0xfe, 0x4f, 0xff, 0xe9, 0x0, + 0xff, 0xe4, 0x94, 0xcf, 0xf5, 0x0, 0x73, 0x37, + 0xf8, 0xc0, 0x3f, 0xff, 0x2c, 0xef, 0xff, 0x8, + 0x4, 0x51, 0x1f, 0xf1, 0x80, 0x7f, 0xf1, 0x0, + + /* U+0046 "F" */ + 0x1f, 0xff, 0xfe, 0xe, 0x0, 0x7f, 0xf1, 0x8a, + 0x23, 0xfd, 0x20, 0x13, 0x3b, 0xff, 0x94, 0x3, + 0xff, 0xfe, 0x1, 0x33, 0x7f, 0x8c, 0x3, 0x14, + 0xcf, 0xf5, 0x0, 0x7f, 0xf1, 0xd3, 0xff, 0xfa, + 0x40, 0x3f, 0xff, 0xe0, 0x1f, 0xfd, 0x30, + + /* U+0047 "G" */ + 0x0, 0xf1, 0xc6, 0x77, 0xfb, 0x69, 0x84, 0x3, + 0xe2, 0xbc, 0x73, 0x10, 0x1, 0x2c, 0xf3, 0x80, + 0x72, 0xea, 0x0, 0x9, 0x5d, 0xca, 0x20, 0x8, + 0xb0, 0x9, 0x28, 0x0, 0x79, 0xb5, 0x10, 0xae, + 0xb2, 0x6, 0x10, 0x1b, 0x0, 0x3e, 0x18, 0x7, + 0x93, 0x5f, 0x4, 0x20, 0x0, 0xb0, 0x1, 0xfe, + 0x81, 0x1, 0x60, 0x5, 0x0, 0x7f, 0xf0, 0x90, + 0x0, 0xc0, 0x1f, 0xfc, 0x3d, 0x0, 0x60, 0x7, + 0xff, 0xc, 0x80, 0xc, 0x1, 0xff, 0xc0, 0x11, + 0x0, 0x7f, 0xf1, 0x1f, 0xb8, 0x64, 0x0, 0x60, + 0xf, 0xfe, 0x1e, 0x80, 0x30, 0x3, 0xff, 0x86, + 0x80, 0x6, 0x0, 0xff, 0xe1, 0x8b, 0x0, 0x28, + 0x3, 0xff, 0x87, 0x0, 0x5, 0x80, 0xf, 0xfe, + 0x10, 0xd8, 0x1, 0xf0, 0xc0, 0x3c, 0x76, 0x1, + 0xc9, 0x40, 0x3, 0xcd, 0xa8, 0x84, 0xee, 0x18, + 0x9, 0x0, 0x4b, 0xa8, 0x0, 0x25, 0x77, 0x31, + 0x0, 0x1b, 0xc4, 0x3, 0x15, 0xe3, 0x98, 0x80, + 0x9, 0x67, 0xa4, 0x40, + + /* U+0048 "H" */ + 0x1f, 0xf5, 0x80, 0x7f, 0xdf, 0xec, 0x0, 0xff, + 0xff, 0x80, 0x7f, 0xff, 0x13, 0xff, 0xfe, 0x0, + 0xff, 0xe6, 0x14, 0x47, 0xfc, 0x1, 0xe6, 0x77, + 0xff, 0x80, 0x3f, 0xff, 0xe0, 0x1f, 0xfe, 0xa0, + + /* U+0049 "I" */ + 0x1f, 0xf5, 0x80, 0x7f, 0xff, 0xc0, + + /* U+004A "J" */ + 0x0, 0x27, 0xff, 0xf4, 0x80, 0x7f, 0xf0, 0xd6, + 0x23, 0xce, 0x1, 0xc2, 0xef, 0xeb, 0x0, 0xff, + 0xff, 0x80, 0x7f, 0xfd, 0xdc, 0x0, 0x20, 0x6, + 0x0, 0xf6, 0x0, 0x38, 0x2a, 0x60, 0x3, 0xb, + 0x80, 0x1c, 0x5c, 0x1f, 0x61, 0xa3, 0xc0, 0xa, + 0x22, 0xf3, 0x2, 0x79, 0x71, 0x3, 0xa0, 0x1, + 0x65, 0x20, 0x80, 0xa4, 0xe0, 0x0, + + /* U+004B "K" */ + 0x1f, 0xf5, 0x80, 0x7f, 0x17, 0x7f, 0x10, 0x7, + 0xff, 0x4, 0xb0, 0x43, 0x48, 0x3, 0xff, 0x80, + 0x38, 0x21, 0x66, 0x1, 0xff, 0xc0, 0x1c, 0x10, + 0xa4, 0x0, 0xff, 0xe0, 0xe, 0x10, 0x4a, 0x80, + 0x7f, 0xf0, 0x74, 0x82, 0x18, 0x3, 0xff, 0x83, + 0x86, 0xe, 0xe0, 0xf, 0xfe, 0xd, 0x98, 0x34, + 0x0, 0x7f, 0xf0, 0x6d, 0x1, 0x64, 0x3, 0xff, + 0x83, 0x48, 0x0, 0x30, 0xf, 0xfe, 0xc, 0xa8, + 0x4, 0xcc, 0x0, 0xff, 0x91, 0x80, 0x5c, 0x1, + 0x26, 0x1, 0xff, 0xc0, 0x1c, 0x87, 0x0, 0x68, + 0x80, 0x7f, 0x87, 0x8, 0x21, 0x0, 0x74, 0x3, + 0xf8, 0x70, 0x80, 0x2b, 0x30, 0x3a, 0x0, 0xfc, + 0xa4, 0x1, 0xda, 0x20, 0xae, 0x1, 0xff, 0xc2, + 0x1d, 0x0, 0x42, 0x0, 0x7f, 0xf0, 0x8e, 0xc0, + 0x14, 0x40, 0x1f, 0xfc, 0x24, 0x80, 0x1f, 0x0, + 0xff, 0xe1, 0xbb, 0x1, 0x58, 0x0, + + /* U+004C "L" */ + 0x1f, 0xf5, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xff, + 0xe0, 0x1f, 0xff, 0xf0, 0xf, 0xfe, 0x8b, 0x3b, + 0xff, 0x88, 0x2, 0x28, 0x8f, 0xf3, 0x80, 0x7f, + 0xf0, 0xc0, + + /* U+004D "M" */ + 0x1f, 0xf4, 0x0, 0x7f, 0xf0, 0xf3, 0xf0, 0x2, + 0x72, 0x0, 0xff, 0xe0, 0xb1, 0x80, 0x7a, 0x0, + 0x3f, 0xf8, 0x30, 0x1, 0xf2, 0xa0, 0x7, 0xfd, + 0x2, 0x1, 0xfa, 0x40, 0x3f, 0xc4, 0xe0, 0x1f, + 0x8, 0x13, 0x0, 0x7f, 0x40, 0x7, 0xe4, 0x30, + 0x81, 0x0, 0xf9, 0x14, 0x20, 0x40, 0x3d, 0xe0, + 0x30, 0x1, 0xf4, 0x81, 0x38, 0x7, 0xc6, 0xc0, + 0xc4, 0x1, 0xcc, 0x41, 0x20, 0x1f, 0xd0, 0x0, + 0x90, 0xe, 0x80, 0x44, 0x0, 0x7f, 0xc, 0x2, + 0x28, 0x5, 0x2, 0x12, 0x1, 0xff, 0x39, 0x5, + 0x80, 0x9, 0xc1, 0xc8, 0x3, 0xff, 0x81, 0x20, + 0x2e, 0x12, 0x3, 0x0, 0x1f, 0xfc, 0x14, 0x50, + 0x86, 0x40, 0x80, 0xf, 0xfe, 0x1c, 0x0, 0x24, + 0xd, 0x80, 0x3f, 0xf8, 0x64, 0xe0, 0x17, 0x80, + 0x7f, 0xf1, 0x60, 0x41, 0x4c, 0x3, 0xff, 0x8d, + 0x4d, 0x60, 0x1f, 0xfc, 0x74, 0x91, 0x0, 0xff, + 0xe9, 0x80, + + /* U+004E "N" */ + 0x1f, 0xf5, 0x0, 0x7f, 0xdf, 0xec, 0x0, 0x95, + 0x80, 0x3f, 0xf8, 0xb2, 0x60, 0x1f, 0xfc, 0x5d, + 0x10, 0xf, 0xfe, 0x20, 0xe8, 0x7, 0xff, 0x8, + 0xc8, 0xe, 0x40, 0x3f, 0xf8, 0x2f, 0xe0, 0x6, + 0x50, 0xf, 0xfe, 0x9, 0x50, 0x2, 0x88, 0x3, + 0xff, 0x82, 0xac, 0x0, 0xf1, 0x0, 0xff, 0xe0, + 0xc9, 0x81, 0x50, 0x7, 0xff, 0xb, 0x44, 0x12, + 0x0, 0x3f, 0xf8, 0x23, 0xa0, 0x7, 0x40, 0xf, + 0xfe, 0x9, 0xc8, 0x2, 0xc8, 0x3, 0xff, 0x82, + 0xca, 0x0, 0xf0, 0xf, 0xfe, 0x15, 0x18, 0x15, + 0x0, 0x7f, 0xf0, 0xb8, 0x41, 0x40, 0x3f, 0xf8, + 0x45, 0x40, 0x1f, 0xfc, 0x54, 0x80, 0xf, 0xfe, + 0x2b, 0xa8, 0x7, 0xff, 0x16, 0x88, 0x0, + + /* U+004F "O" */ + 0x0, 0xf1, 0xc6, 0x77, 0xfb, 0x69, 0x80, 0x3f, + 0xe2, 0xbc, 0x73, 0x10, 0x1, 0x2c, 0xf3, 0x80, + 0x7e, 0x5d, 0x40, 0x1, 0x2b, 0xb2, 0x0, 0x6, + 0x2c, 0x40, 0x39, 0x28, 0x0, 0x99, 0xb5, 0x13, + 0x7f, 0x20, 0x4, 0xd0, 0xc, 0x34, 0x0, 0x7b, + 0x30, 0xf, 0x36, 0x90, 0x1c, 0x80, 0x50, 0x20, + 0xb0, 0x1, 0xfc, 0x5e, 0x0, 0x62, 0x1, 0x60, + 0x5, 0x0, 0x7f, 0xc5, 0x0, 0xb, 0x4, 0x0, + 0x30, 0x7, 0xff, 0x5, 0x80, 0x8, 0x1a, 0x0, + 0xc0, 0xf, 0xfe, 0x8, 0x90, 0x10, 0x10, 0x1, + 0x80, 0x3f, 0xf8, 0x4c, 0x0, 0x20, 0xf, 0xfe, + 0x51, 0x0, 0x18, 0x3, 0xff, 0x84, 0xc0, 0x2, + 0xd0, 0x6, 0x0, 0x7f, 0xf0, 0x44, 0x80, 0x81, + 0x0, 0xc, 0x1, 0xff, 0xc1, 0x60, 0x2, 0x0, + 0xb0, 0x2, 0x80, 0x3f, 0xe2, 0x80, 0x5, 0x80, + 0x20, 0x41, 0x60, 0x3, 0xf8, 0xbc, 0x0, 0xc4, + 0x0, 0x1a, 0x0, 0x3d, 0x98, 0x7, 0x9b, 0x48, + 0xe, 0x40, 0x32, 0x50, 0x1, 0x33, 0x6a, 0x26, + 0xfe, 0x40, 0x7, 0xa0, 0x1e, 0x5d, 0x40, 0x1, + 0x2b, 0xb2, 0x0, 0x51, 0x82, 0x1, 0xf1, 0x5e, + 0x39, 0x88, 0x0, 0x96, 0x7d, 0xc0, 0x38, + + /* U+0050 "P" */ + 0x1f, 0xff, 0xed, 0xa5, 0x0, 0xff, 0xe1, 0x12, + 0xd6, 0x98, 0x7, 0x14, 0x47, 0x3a, 0x80, 0xb, + 0xc, 0x3, 0x33, 0xbf, 0x45, 0x7a, 0x80, 0x38, + 0x3, 0xff, 0x83, 0x48, 0x4, 0xa0, 0x1f, 0xfc, + 0x1f, 0x0, 0x60, 0x7, 0xff, 0x5, 0x40, 0x4, + 0x1, 0xff, 0xd2, 0x50, 0x1, 0x0, 0x7f, 0xf0, + 0x7c, 0x1, 0x80, 0x1f, 0xfc, 0x9, 0x40, 0x25, + 0x0, 0x99, 0xdf, 0xd5, 0xec, 0x0, 0xe0, 0xc, + 0x51, 0x1e, 0x50, 0x1, 0x61, 0x80, 0x7f, 0xc4, + 0xb5, 0xa6, 0x1, 0xc9, 0xff, 0xed, 0xa5, 0x0, + 0xff, 0xff, 0x80, 0x7f, 0xf0, 0x80, + + /* U+0051 "Q" */ + 0x0, 0xf1, 0x46, 0x77, 0xfb, 0x69, 0x80, 0x3f, + 0xf8, 0x5, 0x7a, 0xe6, 0x20, 0x2, 0x59, 0xe7, + 0x0, 0xfe, 0x4d, 0x40, 0x1, 0x2b, 0xb2, 0x0, + 0x6, 0x2c, 0x40, 0x3c, 0x96, 0x0, 0x3c, 0xda, + 0x89, 0xbf, 0x80, 0x2, 0x68, 0x7, 0xd, 0x0, + 0x1f, 0xc, 0x3, 0xcf, 0xa4, 0x7, 0x0, 0x1a, + 0x4, 0x16, 0x0, 0x3f, 0x8b, 0xc0, 0xe, 0x40, + 0x13, 0x0, 0x28, 0x3, 0xfe, 0x27, 0x0, 0x50, + 0x1, 0x40, 0xc, 0x1, 0xff, 0xc1, 0x90, 0x2, + 0x80, 0x34, 0x1, 0x80, 0x1f, 0xfc, 0x11, 0x20, + 0x20, 0x0, 0x80, 0x18, 0x3, 0xff, 0x84, 0xc0, + 0x2, 0x3, 0x0, 0xff, 0xe2, 0x88, 0x0, 0xc0, + 0x80, 0xc, 0x1, 0xff, 0xc2, 0x60, 0x0, 0x86, + 0x80, 0x34, 0x3, 0xff, 0x82, 0x26, 0x4, 0x0, + 0x40, 0x3, 0x0, 0x7f, 0xf0, 0x58, 0x0, 0xa0, + 0x1, 0x50, 0x19, 0x0, 0xff, 0x8a, 0x0, 0x14, + 0x1, 0x40, 0x1, 0x9c, 0x3, 0xf8, 0x7c, 0x0, + 0xc4, 0x1, 0x15, 0x0, 0x22, 0x88, 0x3, 0xcb, + 0xe4, 0x7, 0x20, 0x1c, 0xb2, 0x0, 0x5d, 0xc8, + 0x77, 0x4f, 0x50, 0x81, 0xe8, 0x7, 0xcd, 0x84, + 0x0, 0x37, 0x88, 0x30, 0x80, 0x23, 0x4, 0x3, + 0xf1, 0xed, 0x29, 0x0, 0x62, 0x9e, 0x70, 0xf, + 0xfe, 0x2, 0xd6, 0xfc, 0x0, 0x8, 0x82, 0x1, + 0xa4, 0xc0, 0x3f, 0xe7, 0x90, 0x5, 0xd2, 0xa3, + 0x6b, 0x70, 0x7, 0xff, 0x1, 0xac, 0x41, 0x6a, + 0xe4, 0x82, 0x40, 0x3f, 0xf8, 0x29, 0xd2, 0x62, + 0x4, 0xfc, 0x80, + + /* U+0052 "R" */ + 0x1f, 0xff, 0xed, 0xa5, 0x0, 0xff, 0xe1, 0x92, + 0xd6, 0x98, 0x7, 0x8a, 0x23, 0x9d, 0x40, 0x5, + 0x86, 0x1, 0xcc, 0xef, 0xd1, 0x5e, 0xa0, 0xe, + 0x0, 0xff, 0xe1, 0x52, 0x1, 0x28, 0x7, 0xff, + 0xb, 0xc0, 0x18, 0x1, 0xff, 0xc2, 0x50, 0x1, + 0x0, 0x7f, 0xf5, 0x14, 0x0, 0x40, 0x1f, 0xfc, + 0x2f, 0x0, 0x60, 0x7, 0xff, 0x6, 0x50, 0x5, + 0x40, 0x33, 0x37, 0x9e, 0x79, 0x80, 0x1a, 0x1, + 0xc5, 0x33, 0xd0, 0xc2, 0x5, 0x86, 0x1, 0xff, + 0xc2, 0x4d, 0x30, 0xf, 0x27, 0xff, 0x8c, 0x10, + 0xc0, 0x3f, 0xf8, 0x5c, 0x0, 0xd0, 0xf, 0xfe, + 0x11, 0x48, 0xd, 0x0, 0x7f, 0xf0, 0x99, 0x1, + 0x54, 0x1, 0xff, 0xc2, 0xa1, 0xb, 0x10, 0xf, + 0xfe, 0x8, 0xd0, 0xd, 0x0, + + /* U+0053 "S" */ + 0x0, 0xcd, 0x7b, 0xfe, 0xec, 0x83, 0x0, 0xe5, + 0xe9, 0x42, 0x0, 0x9, 0xbe, 0x60, 0x80, 0x9, + 0x42, 0x6, 0xf3, 0x28, 0x40, 0x1, 0x98, 0x1, + 0x20, 0xa, 0xc8, 0x66, 0x3d, 0xfc, 0xb0, 0x81, + 0x90, 0x32, 0x80, 0x7c, 0xd2, 0x0, 0x60, 0x7, + 0x80, 0x7f, 0xf0, 0x18, 0x1, 0x80, 0x1f, 0xfc, + 0x3, 0x10, 0x58, 0x0, 0xff, 0xe0, 0x40, 0x1, + 0xfe, 0x98, 0x80, 0x3f, 0x35, 0x8, 0x1, 0x67, + 0x75, 0x28, 0x1, 0xe5, 0xe9, 0x40, 0x8, 0x9a, + 0xf4, 0xc0, 0x3c, 0xd7, 0xf6, 0xe6, 0x0, 0x2c, + 0x30, 0xf, 0xc9, 0x19, 0xa8, 0x0, 0xe0, 0xf, + 0xf8, 0xac, 0xc0, 0x84, 0x3, 0xff, 0x80, 0x80, + 0x2, 0x5, 0x0, 0xff, 0x10, 0x0, 0x96, 0xad, + 0x0, 0x3e, 0x65, 0x4, 0x1f, 0x4, 0xbe, 0x97, + 0x66, 0x46, 0xc8, 0x2, 0x2, 0xa0, 0x40, 0x5a, + 0x26, 0x4e, 0x40, 0x58, 0x60, 0x7, 0xea, 0x62, + 0x10, 0x12, 0x5a, 0xd3, 0x0, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xfe, 0x1a, 0x80, 0x7f, 0xf1, 0x62, + 0x3c, 0xe0, 0x3, 0x88, 0xf3, 0xb3, 0xbf, 0x50, + 0x1, 0x5d, 0xfc, 0x40, 0x1f, 0xff, 0xf0, 0xf, + 0xff, 0xf8, 0x7, 0xff, 0xfc, 0x3, 0xff, 0xc6, + + /* U+0055 "U" */ + 0x3f, 0xf4, 0x80, 0x7f, 0x9b, 0xfc, 0xa0, 0x1f, + 0xff, 0xf0, 0xf, 0xff, 0xf8, 0x7, 0xff, 0x90, + 0x40, 0x6, 0x1, 0xfe, 0x10, 0x0, 0x90, 0x1, + 0xc0, 0x3f, 0xda, 0x0, 0x60, 0x30, 0x22, 0x0, + 0x7f, 0x20, 0x9, 0x5, 0x80, 0x20, 0x3, 0xf3, + 0x88, 0x38, 0x1, 0xc4, 0x16, 0x40, 0x3c, 0xf0, + 0x0, 0xb0, 0xa, 0x80, 0xd, 0xd5, 0x10, 0xae, + 0x80, 0x5, 0x10, 0x4, 0x98, 0x20, 0x2a, 0xee, + 0x51, 0x1, 0xb5, 0x0, 0xe3, 0xe9, 0x51, 0x0, + 0xa, 0x4f, 0x20, 0x4, + + /* U+0056 "V" */ + 0xd, 0xff, 0x18, 0x7, 0xff, 0x0, 0x7f, 0xd8, + 0x16, 0x0, 0x90, 0xf, 0xfe, 0x3, 0x0, 0x24, + 0x18, 0x41, 0x44, 0x3, 0xfe, 0x90, 0x15, 0x0, + 0x30, 0x2, 0x40, 0x3f, 0xca, 0x21, 0x20, 0x14, + 0x80, 0x18, 0x3, 0xfd, 0x20, 0x6, 0x0, 0x85, + 0x40, 0x54, 0x3, 0xf1, 0x98, 0x18, 0x40, 0x34, + 0x80, 0x24, 0x3, 0xf4, 0x80, 0x2c, 0x3, 0x8c, + 0xc0, 0x66, 0x0, 0xf0, 0xa8, 0x21, 0x0, 0x7a, + 0x40, 0x12, 0x1, 0xe9, 0x0, 0x70, 0x7, 0xca, + 0x20, 0xa2, 0x1, 0xcc, 0x2, 0xa0, 0x1f, 0x98, + 0x1, 0x20, 0x19, 0x84, 0x24, 0x3, 0xfa, 0x40, + 0xc, 0x1, 0xac, 0x0, 0xc0, 0x1f, 0xc2, 0xa0, + 0x2a, 0x0, 0x42, 0x6, 0x10, 0xf, 0xf4, 0x80, + 0x24, 0x1, 0xc0, 0xb, 0x0, 0xff, 0x8c, 0xc0, + 0x66, 0x25, 0x4, 0x20, 0xf, 0xfe, 0x4, 0x80, + 0x26, 0x80, 0x1e, 0x1, 0xff, 0xc1, 0x51, 0x5, + 0x70, 0x24, 0x0, 0xff, 0xe1, 0x48, 0x6, 0xa0, + 0xf, 0xfe, 0x1b, 0x0, 0x66, 0x0, 0xff, 0xe1, + 0x8b, 0x0, 0x18, 0x40, 0x3e, + + /* U+0057 "W" */ + 0xe, 0xfe, 0x0, 0xff, 0x4f, 0xf9, 0x40, 0x3f, + 0x8f, 0xfc, 0xe0, 0xe0, 0x28, 0x1, 0xfc, 0xe0, + 0xf, 0x0, 0xfe, 0xb0, 0x2, 0x86, 0x80, 0x34, + 0x3, 0xf2, 0x8, 0x1, 0x40, 0x3f, 0x94, 0xc, + 0x81, 0x4, 0x1c, 0x3, 0xf6, 0x80, 0x65, 0x0, + 0xf8, 0xc8, 0x2c, 0x2, 0x40, 0x13, 0x0, 0xf9, + 0xc1, 0x0, 0x1e, 0x1, 0xf5, 0x80, 0x14, 0x2, + 0xe0, 0x5, 0x0, 0x79, 0x4, 0x3d, 0x1, 0x40, + 0x3e, 0x50, 0x22, 0x0, 0x48, 0x0, 0x70, 0xf, + 0x68, 0x1, 0x34, 0x0, 0xa0, 0x1c, 0x44, 0xa, + 0x0, 0xe5, 0x1, 0x30, 0xe, 0x70, 0x50, 0x70, + 0x7, 0x80, 0x75, 0x0, 0x14, 0x3, 0xbc, 0x1, + 0x60, 0x19, 0x4, 0x38, 0x5, 0x1, 0x40, 0x39, + 0x40, 0x88, 0x1, 0xca, 0x0, 0x50, 0xd, 0xc0, + 0x28, 0x0, 0xd0, 0x2, 0x0, 0x44, 0x40, 0x50, + 0xf, 0x94, 0x8, 0xc0, 0x25, 0x4, 0x0, 0x9c, + 0x1, 0xc0, 0x15, 0x0, 0x2c, 0x3, 0xef, 0x0, + 0x58, 0x1, 0x0, 0x1c, 0x1, 0xa, 0x2, 0x80, + 0x4a, 0x4, 0x60, 0x1f, 0x28, 0x1, 0x40, 0x1c, + 0x2, 0x80, 0x1b, 0x80, 0x8, 0x4, 0x40, 0x50, + 0xf, 0xe5, 0x2, 0x20, 0x28, 0x38, 0x7, 0x28, + 0x3, 0x41, 0x40, 0x16, 0x1, 0xfd, 0xe0, 0xa, + 0x50, 0x6, 0x80, 0x79, 0x1, 0xc2, 0x80, 0x8c, + 0x3, 0xf9, 0x40, 0xb, 0xe0, 0x28, 0x1, 0xee, + 0x1, 0x72, 0x5, 0x0, 0xff, 0x90, 0x9, 0x41, + 0xc0, 0x3e, 0x50, 0x4, 0x0, 0x2c, 0x3, 0xfe, + 0xe0, 0xd, 0xa0, 0x1f, 0x90, 0x2, 0x13, 0x0, + 0xff, 0x90, 0x2, 0x14, 0x0, 0xfd, 0xc0, 0x13, + 0x80, 0x7f, 0xf0, 0x5, 0x0, 0xe, 0x1, 0xfc, + 0xa0, 0x15, 0x0, 0x78, + + /* U+0058 "X" */ + 0xc, 0xff, 0x28, 0x7, 0xf3, 0x7f, 0xa4, 0x1, + 0xc0, 0xa, 0x20, 0xf, 0x8a, 0x40, 0xa4, 0x0, + 0x52, 0x0, 0xe0, 0xf, 0xbc, 0x1, 0xc0, 0x19, + 0x90, 0xd, 0xc0, 0x3a, 0x8, 0x20, 0xc0, 0x3a, + 0x84, 0x20, 0xc0, 0x24, 0x70, 0x47, 0x0, 0xf0, + 0xd0, 0x3, 0x80, 0x3, 0x40, 0x34, 0x1, 0xf9, + 0x18, 0xa, 0x82, 0xc4, 0x2c, 0x40, 0x3f, 0xa4, + 0x81, 0x69, 0x41, 0x94, 0x3, 0xfe, 0xf0, 0x2, + 0x81, 0x48, 0x7, 0xff, 0x0, 0xa0, 0x2, 0x90, + 0xf, 0xfe, 0x15, 0x80, 0x5c, 0x1, 0xff, 0xc1, + 0x83, 0x0, 0x95, 0x80, 0x3f, 0xe4, 0x70, 0x2d, + 0x0, 0x49, 0x0, 0x7f, 0xd, 0x0, 0x3c, 0xa4, + 0x1, 0xc0, 0x1f, 0xd6, 0x21, 0x4, 0xc, 0xa0, + 0x70, 0x1, 0xf3, 0x28, 0x23, 0x80, 0x56, 0x20, + 0xe8, 0x1, 0xc5, 0x20, 0x34, 0x1, 0x87, 0x40, + 0x14, 0x20, 0x1b, 0xc0, 0x16, 0x20, 0x1c, 0x6e, + 0x3, 0x60, 0x14, 0x90, 0x2a, 0x80, 0x3e, 0x83, + 0x5, 0x60, 0x46, 0x2, 0xa0, 0xf, 0xee, 0x0, + 0x49, 0x0, + + /* U+0059 "Y" */ + 0xc, 0xff, 0x18, 0x7, 0xfd, 0xbf, 0xc0, 0xf, + 0x0, 0x78, 0x7, 0xf9, 0xc8, 0x2c, 0x0, 0x6c, + 0x6, 0xc0, 0x1f, 0x86, 0x1, 0x14, 0x2, 0x81, + 0x8, 0x0, 0xfd, 0x60, 0x9, 0x0, 0xc3, 0x0, + 0x32, 0x1, 0xe3, 0x50, 0x72, 0x0, 0xe6, 0x20, + 0x62, 0x0, 0xee, 0x1, 0x80, 0xf, 0xb8, 0x1, + 0x20, 0x19, 0x88, 0x2c, 0x3, 0xf1, 0xa8, 0x22, + 0x80, 0x6, 0x0, 0xd4, 0x3, 0xfa, 0xc0, 0x16, + 0x0, 0x81, 0xe, 0x0, 0xff, 0xc, 0x0, 0xc1, + 0xb0, 0x31, 0x0, 0x7f, 0xce, 0x40, 0xfc, 0x3, + 0x20, 0x1f, 0xfc, 0x1e, 0x0, 0x10, 0x40, 0x7, + 0xff, 0x8, 0xd4, 0x0, 0x6c, 0x1, 0xff, 0xc3, + 0xf0, 0x5, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xfd, + 0x20, + + /* U+005A "Z" */ + 0x9f, 0xff, 0xfe, 0x19, 0x80, 0x7f, 0xf1, 0x76, + 0x23, 0xfe, 0x20, 0x2, 0x1a, 0x3b, 0xff, 0x8c, + 0x80, 0x68, 0x3, 0xfe, 0x2b, 0x0, 0x68, 0x80, + 0x7f, 0xde, 0x0, 0x93, 0x0, 0xff, 0xa8, 0x81, + 0x98, 0x1, 0xff, 0x3a, 0x81, 0xc8, 0x7, 0xfc, + 0x90, 0x3, 0xc0, 0x1f, 0xf0, 0xd0, 0x2, 0x88, + 0x3, 0xfe, 0xd1, 0x8, 0x40, 0xf, 0xfa, 0x4c, + 0x11, 0xc0, 0x3f, 0xe6, 0x60, 0x15, 0x80, 0x7f, + 0xc7, 0x20, 0xf, 0x0, 0xff, 0x87, 0x40, 0x14, + 0x40, 0x1f, 0xf5, 0x8, 0x32, 0x80, 0x7f, 0xd0, + 0x80, 0x72, 0x1, 0xff, 0x2b, 0x80, 0x11, 0xdf, + 0xfe, 0x49, 0x0, 0x9e, 0x23, 0xfe, 0xd0, 0xf, + 0xfe, 0x28, + + /* U+005B "[" */ + 0x1f, 0xfe, 0xc0, 0xf, 0xf2, 0x66, 0x38, 0x2, + 0x13, 0x31, 0x0, 0x7f, 0xff, 0xc0, 0x3f, 0xfe, + 0x22, 0x66, 0x20, 0x9, 0x33, 0x1c, 0x1, 0xf0, + + /* U+005C "\\" */ + 0x7, 0x83, 0x0, 0xff, 0x63, 0xc0, 0x7, 0xfb, + 0x81, 0x4, 0x3, 0xf9, 0x40, 0xe, 0x1, 0xfe, + 0x50, 0xa0, 0xf, 0xf7, 0x81, 0x88, 0x7, 0xf2, + 0x80, 0x18, 0x3, 0xfc, 0xa1, 0x40, 0x1f, 0xee, + 0x2, 0x20, 0x7, 0xf2, 0x8, 0x50, 0x7, 0xf9, + 0xc1, 0x40, 0x3f, 0xd4, 0x4, 0x60, 0x1f, 0xc6, + 0x21, 0x60, 0x1f, 0xe6, 0x6, 0x0, 0xff, 0x50, + 0xa, 0x0, 0x7f, 0x11, 0x3, 0x40, 0x3f, 0xd4, + 0xe, 0x1, 0xfe, 0x50, 0x14, 0x0, 0xfe, 0x23, + 0xe, 0x0, 0xff, 0x58, 0x28, 0x7, 0xf9, 0x80, + 0xa, 0x1, 0xfc, 0x28, 0x1c, 0x1, 0xfe, 0xd0, + 0x41, 0x0, 0xfe, 0x70, 0x3, 0x80, 0x7f, 0xa, + 0x6, 0x80, 0x7f, 0xb8, 0x10, 0x40, 0x3f, 0x94, + 0x0, 0xe0, + + /* U+005D "]" */ + 0x7f, 0xfe, 0x60, 0xf, 0x9b, 0x31, 0x0, 0x10, + 0x99, 0xc0, 0x1f, 0xff, 0xf0, 0xf, 0xff, 0x88, + 0x99, 0xc0, 0x13, 0x66, 0x20, 0x3, 0xfc, + + /* U+005E "^" */ + 0x0, 0xe7, 0x83, 0x0, 0xfe, 0x58, 0x78, 0x0, + 0xfe, 0x90, 0x2, 0x10, 0x7, 0xc6, 0x62, 0x80, + 0xb0, 0xf, 0xa4, 0x2d, 0x81, 0x80, 0x3c, 0x2a, + 0xc, 0x2a, 0xc, 0x1, 0xd2, 0xc, 0x0, 0x90, + 0xb0, 0xe, 0x60, 0xb0, 0x1, 0x91, 0x10, 0x2, + 0x61, 0x42, 0x0, 0xac, 0x3c, 0x2, 0xb0, 0xf0, + 0xc, 0xc0, 0x84, 0x8, 0x44, 0x40, 0xe, 0x60, + 0xb0, 0xf0, 0xa0, 0xf, 0x58, 0x30, 0x0, + + /* U+005F "_" */ + 0xbb, 0xff, 0xe1, 0x22, 0x7f, 0xf0, 0x80, + + /* U+0060 "`" */ + 0x38, 0x83, 0x80, 0x63, 0xe7, 0x8b, 0x0, 0xcd, + 0xa4, 0x98, 0x20, 0x11, 0x6a, 0x9e, 0x8, + + /* U+0061 "a" */ + 0x0, 0xb, 0xdf, 0x7f, 0xb6, 0x90, 0x3, 0x47, + 0x42, 0x8, 0x0, 0x96, 0xe4, 0x2, 0x50, 0x15, + 0x9a, 0x95, 0x0, 0x33, 0x0, 0x1d, 0x1d, 0x4c, + 0xad, 0x5a, 0x0, 0x80, 0x1, 0xb8, 0x7, 0x89, + 0xc0, 0x48, 0x3, 0xfd, 0xc0, 0x6, 0x0, 0x14, + 0x67, 0x73, 0xfe, 0x90, 0xc, 0xda, 0xe6, 0x22, + 0x0, 0xf0, 0x94, 0x80, 0xd7, 0x7f, 0xe9, 0x0, + 0x94, 0x1, 0x4a, 0x20, 0x1f, 0xb8, 0x0, 0xa0, + 0x1e, 0xe0, 0xb, 0x80, 0x8, 0x1, 0xc4, 0xe0, + 0x12, 0x80, 0x2d, 0x40, 0x2, 0xd8, 0x1, 0x8a, + 0x80, 0x6b, 0xfd, 0xd2, 0x2c, 0x1, 0x97, 0x58, + 0x40, 0x4, 0xdb, 0x40, 0x10, + + /* U+0062 "b" */ + 0x7f, 0xf1, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xf9, + 0x4b, 0x7d, 0xfb, 0x6a, 0x1, 0xf3, 0x65, 0x20, + 0x81, 0x25, 0x69, 0x0, 0x75, 0x98, 0x2c, 0x4b, + 0x88, 0x16, 0x90, 0x6, 0x12, 0xda, 0x76, 0x8e, + 0x60, 0x7, 0x80, 0x77, 0x90, 0x7, 0x4a, 0x81, + 0x28, 0x4, 0xc4, 0x1, 0xf4, 0x0, 0x3c, 0x2, + 0xc0, 0xf, 0xc4, 0x20, 0xc0, 0x13, 0x0, 0x7f, + 0x18, 0x10, 0x4, 0xc0, 0x1f, 0xc6, 0x4, 0x1, + 0x60, 0x7, 0xe3, 0x10, 0x60, 0x9, 0x88, 0x3, + 0xe8, 0x0, 0x78, 0x6, 0xf2, 0x0, 0xe9, 0x40, + 0x25, 0x0, 0x88, 0x9b, 0x4e, 0xd1, 0xcc, 0x0, + 0xf0, 0xd, 0xc6, 0xb, 0x12, 0xe2, 0x5, 0xa4, + 0x1, 0x87, 0x29, 0x4, 0x5, 0x2b, 0x48, 0x0, + + /* U+0063 "c" */ + 0x0, 0xc7, 0x3b, 0xfe, 0xd9, 0x30, 0xe, 0x1b, + 0xc6, 0x20, 0x1, 0x36, 0x48, 0x4, 0x38, 0x80, + 0x2d, 0x32, 0x60, 0x3, 0x40, 0x2, 0x88, 0x17, + 0xa5, 0x99, 0x3c, 0x60, 0x11, 0xa0, 0x1d, 0x0, + 0x70, 0xee, 0xa0, 0x2c, 0x1, 0x0, 0x1f, 0x9, + 0x0, 0xc, 0x0, 0x80, 0x1f, 0xf3, 0x80, 0x80, + 0x7f, 0xf0, 0x1c, 0x4, 0x3, 0xff, 0x80, 0x60, + 0x4, 0x0, 0xff, 0xa8, 0x1, 0x0, 0x1f, 0x9, + 0x0, 0x9, 0x0, 0xe8, 0x3, 0x87, 0x75, 0x0, + 0xa, 0x20, 0x5e, 0x96, 0x64, 0xf1, 0x80, 0x61, + 0xc4, 0x1, 0x69, 0x93, 0x0, 0x1e, 0x0, 0x21, + 0xbc, 0x62, 0x0, 0x13, 0x64, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0xff, 0xe0, 0x17, 0xfa, 0x0, 0x3f, 0xff, + 0xe0, 0x1f, 0xcb, 0x5b, 0xfd, 0x8c, 0x1, 0xf1, + 0x65, 0x29, 0x0, 0x9c, 0xeb, 0x0, 0x61, 0xc3, + 0x1, 0x69, 0x92, 0x81, 0x50, 0x6, 0xd1, 0x5, + 0xe9, 0x66, 0x57, 0x18, 0x80, 0x46, 0x60, 0x3a, + 0x0, 0xe1, 0xd1, 0x0, 0xa8, 0x1, 0x0, 0x1f, + 0xb, 0x0, 0x44, 0x0, 0x40, 0xf, 0xd6, 0x1, + 0x38, 0x8, 0x7, 0xf0, 0x80, 0x4e, 0x2, 0x1, + 0xfc, 0x20, 0x11, 0x0, 0xc, 0x3, 0xf2, 0x0, + 0x54, 0x0, 0x80, 0xf, 0xd4, 0x1, 0x19, 0x81, + 0x20, 0x3, 0xd6, 0x40, 0x1b, 0x44, 0x1f, 0x18, + 0xd1, 0xf9, 0x4, 0x3, 0xe, 0x18, 0x1c, 0xe5, + 0xc0, 0x8b, 0x40, 0x38, 0xb2, 0x90, 0x80, 0x4e, + 0x38, 0xc0, 0x20, + + /* U+0065 "e" */ + 0x0, 0xc9, 0x7b, 0xfd, 0x8c, 0x20, 0x1c, 0x39, + 0x68, 0x40, 0x27, 0x3e, 0x80, 0x10, 0xf9, 0x82, + 0x4d, 0xd3, 0x0, 0xda, 0x0, 0x28, 0x42, 0xec, + 0xc8, 0xb3, 0xa4, 0x14, 0x26, 0x81, 0x28, 0x1, + 0xc5, 0xe0, 0x2f, 0x40, 0x6, 0x0, 0xf8, 0x90, + 0x34, 0x80, 0x1f, 0xff, 0xc8, 0xc, 0xe0, 0x1f, + 0xfc, 0x13, 0x70, 0x7, 0xff, 0xfd, 0xc6, 0x0, + 0x40, 0xf, 0xfa, 0xc0, 0x10, 0x1, 0xf8, 0x40, + 0x6, 0x80, 0x76, 0x20, 0x1c, 0xbe, 0x60, 0xa, + 0x20, 0x4e, 0x96, 0x64, 0x65, 0xf, 0x80, 0x7, + 0x10, 0x0, 0xd3, 0x27, 0x30, 0x2e, 0x0, 0x86, + 0xf1, 0x88, 0x40, 0x56, 0xb4, 0x80, + + /* U+0066 "f" */ + 0x0, 0xc3, 0x1b, 0xfd, 0x68, 0x1, 0xe, 0x39, + 0x0, 0xa6, 0x80, 0x50, 0x40, 0xb7, 0x66, 0xa0, + 0x9, 0xc0, 0xa9, 0x11, 0x26, 0x1, 0x8, 0x20, + 0x7, 0xc2, 0x1, 0xfa, 0x7f, 0x80, 0xd, 0xff, + 0x70, 0x7, 0xff, 0x2, 0xf2, 0xc0, 0x9, 0x99, + 0x68, 0x11, 0xa8, 0x0, 0x4c, 0xf0, 0x7, 0xff, + 0xfc, 0x3, 0xff, 0xc6, + + /* U+0067 "g" */ + 0x0, 0xcb, 0x7b, 0xfd, 0x8e, 0x21, 0x9f, 0x80, + 0x3, 0xda, 0x42, 0x1, 0x38, 0xf4, 0x0, 0xc7, + 0x84, 0x4, 0xf3, 0x27, 0x11, 0x59, 0x0, 0x5c, + 0x0, 0x7d, 0x86, 0x64, 0x73, 0x80, 0x80, 0x14, + 0x81, 0xa0, 0x3, 0xd0, 0xc0, 0x17, 0x80, 0x2c, + 0x3, 0xf5, 0x80, 0x4c, 0x2, 0x40, 0x1f, 0x88, + 0x40, 0x30, 0x80, 0x7f, 0x84, 0x0, 0xc0, 0x2, + 0x0, 0xfc, 0x40, 0x17, 0x80, 0x20, 0x3, 0xf4, + 0x0, 0x4a, 0x40, 0xb2, 0x1, 0xe9, 0x50, 0xd, + 0xe0, 0x6, 0xe9, 0x66, 0x4f, 0x30, 0x7, 0x16, + 0x10, 0xb, 0x4c, 0x98, 0x45, 0x60, 0x7, 0x0, + 0x1e, 0xd2, 0x10, 0x9, 0xc7, 0xa0, 0x0, 0x40, + 0x32, 0xde, 0xff, 0x63, 0x89, 0x0, 0xc, 0x3, + 0xff, 0x81, 0x40, 0xc, 0x3, 0xe6, 0x0, 0xf9, + 0x5c, 0x5, 0x43, 0xc6, 0x7a, 0x9d, 0x99, 0x19, + 0x40, 0xb, 0x0, 0x71, 0x80, 0xac, 0x4c, 0x9c, + 0xc0, 0x12, 0xa0, 0x2, 0xcc, 0x3a, 0x8, 0x0, + 0x52, 0x39, 0x80, 0x0, + + /* U+0068 "h" */ + 0x7f, 0xf1, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xf8, + 0x8d, 0x7d, 0xfd, 0x6a, 0x1, 0xe6, 0xd9, 0x41, + 0x1, 0x4a, 0xb0, 0xe, 0xa2, 0x16, 0x88, 0x28, + 0x1, 0x24, 0x3, 0x93, 0xa5, 0xdd, 0x58, 0x0, + 0x62, 0x0, 0x86, 0xc0, 0x38, 0xe0, 0x0, 0x80, + 0x14, 0x80, 0x7c, 0x80, 0xe, 0x0, 0x8c, 0x3, + 0xe2, 0x0, 0x8, 0x4, 0xe0, 0x1f, 0xe3, 0x0, + 0xff, 0xff, 0x80, 0x7f, 0xf4, 0x80, + + /* U+0069 "i" */ + 0x5e, 0xd3, 0x81, 0x29, 0x60, 0x6, 0xdc, 0xd3, + 0x83, 0x28, 0x7, 0x3f, 0xf8, 0xc0, 0x3f, 0xfd, + 0x80, + + /* U+006A "j" */ + 0x0, 0xe3, 0xee, 0x20, 0x7, 0x40, 0x8a, 0x0, + 0x38, 0x80, 0xa, 0x1, 0xd3, 0x38, 0x3, 0xcc, + 0xc0, 0xf, 0xfe, 0x1a, 0xff, 0x98, 0x3, 0xff, + 0xfe, 0x1, 0xff, 0xef, 0x30, 0xe, 0xc0, 0x3, + 0x5, 0xb2, 0xc3, 0x0, 0x9a, 0xa4, 0xd3, 0x80, + 0x28, 0x1d, 0x48, 0x5, 0x31, 0x0, + + /* U+006B "k" */ + 0x7f, 0xf1, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xf9, + 0xe9, 0xfe, 0xe2, 0x0, 0xff, 0x2d, 0x80, 0xe1, + 0x0, 0x7f, 0x35, 0x0, 0xe1, 0x0, 0x7f, 0x3c, + 0x80, 0xe1, 0x0, 0x7f, 0x44, 0x0, 0x70, 0x80, + 0x3f, 0xa5, 0xc0, 0x70, 0x80, 0x3f, 0x3d, 0x30, + 0x1, 0xc8, 0x3, 0xfa, 0x94, 0x2, 0x65, 0x0, + 0xfe, 0x10, 0x3a, 0x0, 0x51, 0x0, 0x7f, 0x26, + 0x2b, 0x80, 0x3c, 0x3, 0xf2, 0xd8, 0x2, 0x10, + 0xa, 0x80, 0x3e, 0x90, 0xd, 0x64, 0xa, 0xe0, + 0x1f, 0xfc, 0xf, 0x0, 0x42, 0x0, 0x7f, 0xc5, + 0x40, 0xa, 0x10, 0xf, 0xf9, 0x5c, 0x7, 0x40, + + /* U+006C "l" */ + 0x7f, 0xf1, 0x80, 0x7f, 0xff, 0xc0, 0x38, + + /* U+006D "m" */ + 0x7f, 0xf1, 0xc, 0x67, 0x7e, 0xc9, 0x80, 0x45, + 0x1b, 0xfe, 0xd9, 0x20, 0xf, 0x3f, 0xb9, 0x88, + 0x13, 0x63, 0x83, 0xeb, 0x90, 0x0, 0x9b, 0x58, + 0x3, 0xa8, 0x4e, 0x6e, 0x94, 0x1, 0x15, 0x0, + 0x73, 0x74, 0xa0, 0x9, 0x30, 0xe, 0x7c, 0x64, + 0x5a, 0x90, 0x2, 0x83, 0xe3, 0x22, 0xd4, 0x0, + 0x20, 0x3, 0x14, 0x0, 0x73, 0x10, 0x0, 0xe0, + 0x3, 0x9c, 0x81, 0x0, 0x35, 0x0, 0x7c, 0x80, + 0xb, 0x0, 0xf9, 0x0, 0x2, 0x1, 0x18, 0x7, + 0xdc, 0x0, 0x30, 0xf, 0x84, 0x0, 0x60, 0x13, + 0x80, 0x7f, 0x9c, 0x3, 0xfc, 0x20, 0x1f, 0xff, + 0xf0, 0xf, 0xff, 0xf8, 0x7, 0xff, 0x50, + + /* U+006E "n" */ + 0x7f, 0xf1, 0x3, 0xe7, 0x7f, 0x5a, 0x80, 0x79, + 0xfa, 0xc, 0x40, 0x52, 0xac, 0x3, 0xa8, 0x4a, + 0x2a, 0x8e, 0x20, 0x92, 0x1, 0xcd, 0xae, 0xaa, + 0x8c, 0x10, 0x62, 0x0, 0x8a, 0x40, 0x38, 0xa4, + 0x0, 0x80, 0x15, 0x0, 0x7c, 0xa0, 0xe, 0x0, + 0x8c, 0x3, 0xe3, 0x0, 0x8, 0x4, 0xe0, 0x1f, + 0xe3, 0x0, 0xff, 0xff, 0x80, 0x7f, 0xf4, 0x80, + + /* U+006F "o" */ + 0x0, 0xc9, 0x5b, 0xfd, 0xb0, 0x40, 0x1e, 0x1b, + 0xb2, 0x90, 0x9, 0x3e, 0xc0, 0x6, 0x1f, 0x40, + 0x16, 0x99, 0x28, 0x1, 0xec, 0x2, 0xa1, 0x5, + 0xe9, 0x66, 0x57, 0x18, 0x23, 0x81, 0xa0, 0x1d, + 0x0, 0x70, 0xe8, 0x84, 0x85, 0x80, 0x20, 0x3, + 0xe1, 0x90, 0x15, 0x30, 0x2, 0x0, 0x7e, 0x40, + 0x1, 0x38, 0x8, 0x7, 0xf0, 0x80, 0x39, 0xc0, + 0x40, 0x3f, 0x84, 0x1, 0xc6, 0x0, 0x40, 0xf, + 0xd6, 0x0, 0x2b, 0x0, 0x40, 0x7, 0xc2, 0xc0, + 0x2a, 0x68, 0x7, 0x40, 0x1c, 0x3a, 0x21, 0x20, + 0xa, 0x20, 0x5e, 0x96, 0x65, 0x71, 0x82, 0x38, + 0x0, 0x71, 0x0, 0x5a, 0x64, 0xa0, 0x7, 0xb0, + 0xc, 0x37, 0x65, 0x20, 0x12, 0x6d, 0x80, 0x8, + + /* U+0070 "p" */ + 0x7f, 0xf1, 0x3, 0x5f, 0x7e, 0xda, 0x80, 0x7c, + 0xdb, 0x28, 0x20, 0x49, 0x5a, 0x40, 0x1d, 0x44, + 0x2f, 0x76, 0x93, 0x2, 0xd2, 0x0, 0xc2, 0x7f, + 0x8, 0x86, 0xc8, 0x0, 0x78, 0x6, 0x1d, 0x10, + 0xe, 0x76, 0x2, 0x50, 0x9, 0x84, 0x3, 0xeb, + 0x0, 0x78, 0x5, 0x80, 0x1f, 0x88, 0x41, 0x80, + 0x27, 0x0, 0xfe, 0x30, 0x20, 0x9, 0x80, 0x3f, + 0x8c, 0x8, 0x2, 0xc0, 0xf, 0xc6, 0x20, 0xc0, + 0x13, 0x10, 0x7, 0xd0, 0x0, 0xf0, 0xd, 0xe4, + 0x1, 0xd2, 0x80, 0x4a, 0x1, 0x9, 0x6d, 0x3b, + 0x47, 0x30, 0x3, 0xc0, 0x35, 0x18, 0x2c, 0x4b, + 0x88, 0x16, 0x90, 0x6, 0x7c, 0xa4, 0x10, 0x14, + 0xad, 0x20, 0xf, 0x96, 0xfb, 0xfa, 0xd4, 0x3, + 0xff, 0xf0, + + /* U+0071 "q" */ + 0x0, 0xcb, 0x5b, 0xfd, 0x8c, 0x0, 0xff, 0x40, + 0x0, 0xb2, 0x94, 0x80, 0x4e, 0x74, 0x80, 0x30, + 0xe1, 0x80, 0xb4, 0xc9, 0x40, 0xb0, 0x3, 0x68, + 0x82, 0xf4, 0xb3, 0x2b, 0x4c, 0x40, 0x23, 0x30, + 0x1d, 0x0, 0x71, 0x68, 0x80, 0x54, 0x0, 0x80, + 0xf, 0x86, 0x40, 0x22, 0x0, 0x20, 0x7, 0xe4, + 0x0, 0x9c, 0x4, 0x3, 0xf8, 0x40, 0x27, 0x1, + 0x0, 0xfe, 0x10, 0x8, 0x80, 0x8, 0x1, 0xfa, + 0xc0, 0x2a, 0x0, 0x40, 0x7, 0xc2, 0xc0, 0x11, + 0x98, 0xe, 0x80, 0x38, 0x74, 0x40, 0x36, 0x88, + 0x2f, 0x4b, 0x32, 0xb8, 0xc4, 0x3, 0xe, 0x18, + 0xb, 0x4c, 0x94, 0xf, 0x40, 0x38, 0xb2, 0x90, + 0x80, 0x4e, 0x70, 0x40, 0x3e, 0x5b, 0xdf, 0xec, + 0x60, 0xf, 0xff, 0xc8, + + /* U+0072 "r" */ + 0x7f, 0xf1, 0x3, 0x67, 0x40, 0x4, 0x3b, 0x26, + 0x20, 0x1b, 0x88, 0xd, 0xb4, 0x2, 0x22, 0x6e, + 0x4a, 0x80, 0x6c, 0x20, 0xf, 0x38, 0x80, 0x7d, + 0xa0, 0x1f, 0x98, 0x3, 0xff, 0xf0, + + /* U+0073 "s" */ + 0x0, 0x8a, 0x77, 0xfd, 0xd9, 0x6, 0x1, 0xa3, + 0x58, 0x80, 0x2, 0x6f, 0x90, 0x0, 0x57, 0x1, + 0x79, 0xa9, 0x61, 0xa, 0x0, 0x70, 0x3, 0x21, + 0x95, 0xa7, 0xb0, 0x80, 0xc, 0x4, 0x40, 0xf, + 0x18, 0x4, 0xc0, 0x4e, 0x1, 0xfe, 0x80, 0x4, + 0x75, 0xc2, 0x88, 0x7, 0x1d, 0x90, 0xa, 0x3d, + 0x76, 0xa8, 0x6, 0x4d, 0xc9, 0x63, 0x0, 0x15, + 0x38, 0x7, 0x1b, 0x4e, 0x7d, 0x8, 0x40, 0x7, + 0xf9, 0x58, 0x0, 0x40, 0xae, 0x1, 0xf1, 0x80, + 0xc, 0x2e, 0x3e, 0x9d, 0x54, 0xf8, 0x80, 0x82, + 0x22, 0x0, 0x2c, 0x55, 0x20, 0xc0, 0xe8, 0x7, + 0x30, 0xe6, 0x20, 0x2, 0x5a, 0xc1, 0x0, + + /* U+0074 "t" */ + 0x0, 0xa2, 0xa, 0x1, 0xf0, 0xbb, 0xbc, 0x3, + 0xff, 0x9f, 0x3f, 0xc0, 0x5, 0xff, 0xb8, 0x3, + 0xff, 0x81, 0x79, 0x60, 0x4, 0xcc, 0xb4, 0x8, + 0xd4, 0x0, 0x26, 0x78, 0x3, 0xff, 0xf2, 0x20, + 0x1f, 0xfc, 0x14, 0x0, 0xfc, 0xa0, 0x36, 0xaa, + 0xa4, 0x0, 0xa0, 0x41, 0x2a, 0x8b, 0xe0, 0x11, + 0x7b, 0x8, 0xa, 0xc0, + + /* U+0075 "u" */ + 0x9f, 0xf0, 0x80, 0x7c, 0xbf, 0xe6, 0x0, 0xff, + 0xff, 0x80, 0x7f, 0xf8, 0x44, 0x0, 0x40, 0x1f, + 0x68, 0x5, 0xa0, 0x4, 0x0, 0xf9, 0x80, 0x24, + 0x0, 0x49, 0x0, 0x75, 0x8, 0x4, 0x2e, 0x3, + 0x90, 0x88, 0x6d, 0x50, 0xe, 0x85, 0x1, 0x7b, + 0xb4, 0x90, 0xd0, 0x7, 0x55, 0xa8, 0x80, 0x9c, + 0x73, 0x80, 0x40, + + /* U+0076 "v" */ + 0xd, 0xfe, 0x0, 0xfe, 0x2f, 0xf3, 0x85, 0x80, + 0xb0, 0x7, 0xeb, 0x0, 0x30, 0x30, 0x85, 0x0, + 0x7c, 0x2c, 0xc, 0x20, 0x6, 0x3, 0x30, 0x7, + 0x98, 0x1, 0x60, 0x15, 0x0, 0x24, 0x3, 0xd2, + 0x8, 0x40, 0x11, 0x28, 0x28, 0x80, 0x65, 0x10, + 0xf0, 0xe, 0x90, 0x4, 0x80, 0x69, 0x2, 0x40, + 0xe, 0x32, 0x6, 0x0, 0x8c, 0xc1, 0x60, 0x1f, + 0x58, 0xa, 0x80, 0x24, 0x0, 0xc0, 0x1f, 0x30, + 0x84, 0x80, 0xa8, 0x30, 0x7, 0xf3, 0x1, 0x99, + 0x80, 0x16, 0x1, 0xfd, 0x20, 0x9, 0x90, 0x21, + 0x0, 0x7f, 0xa, 0x82, 0x88, 0x78, 0x7, 0xfd, + 0x20, 0x11, 0x20, 0x7, 0xfc, 0x66, 0x0, 0x58, + 0x7, 0x80, + + /* U+0077 "w" */ + 0xaf, 0xe0, 0xf, 0xd5, 0xfc, 0x1, 0xfa, 0x7f, + 0x78, 0x5, 0x0, 0x3c, 0x2a, 0x2, 0xa0, 0x1f, + 0x38, 0x52, 0x8, 0x68, 0x7, 0x9c, 0x2, 0xe0, + 0xf, 0x28, 0x83, 0x3, 0x3, 0x0, 0x7a, 0x80, + 0x24, 0x10, 0xe, 0xe0, 0x41, 0xa, 0x0, 0x28, + 0x6, 0x23, 0xa, 0x0, 0x38, 0x6, 0x14, 0xe, + 0x0, 0x11, 0x87, 0x0, 0x6a, 0x2, 0x54, 0xa, + 0x0, 0xce, 0x2, 0xa0, 0x15, 0x82, 0x8, 0x4, + 0xc1, 0x41, 0xc0, 0x64, 0x1, 0x50, 0x38, 0x6, + 0x60, 0x3, 0x80, 0x10, 0x41, 0x81, 0x44, 0x28, + 0x0, 0x46, 0x14, 0x1, 0x85, 0x2, 0x80, 0x1c, + 0x8, 0x20, 0x7, 0x6, 0x0, 0x50, 0x11, 0x80, + 0x77, 0x1, 0x90, 0xa8, 0x70, 0x5, 0x40, 0x28, + 0xc, 0x14, 0x1, 0xe5, 0x10, 0xa7, 0x0, 0x28, + 0x4, 0x66, 0xd, 0x41, 0x6, 0x0, 0xf9, 0xc1, + 0x68, 0x18, 0x3, 0xa8, 0x1b, 0x81, 0x4, 0x3, + 0xea, 0x2, 0x30, 0xa0, 0xe, 0x70, 0x2, 0x86, + 0x80, 0x7e, 0x32, 0x0, 0x11, 0x80, 0x70, 0xa8, + 0x4, 0xc0, 0x1f, 0xd4, 0x0, 0xa0, 0xf, 0xb8, + 0x0, 0xa0, 0x1c, + + /* U+0078 "x" */ + 0x1e, 0xfe, 0x10, 0xf, 0x4f, 0xf9, 0x40, 0x74, + 0x7, 0x40, 0x39, 0x58, 0x19, 0x40, 0x7, 0x20, + 0x70, 0x1, 0x15, 0x81, 0xc8, 0x6, 0x65, 0x7, + 0x50, 0x7, 0x8, 0x70, 0x7, 0xa8, 0x82, 0xca, + 0x4c, 0x28, 0x80, 0x3e, 0xf0, 0x1c, 0x60, 0x75, + 0x0, 0xfc, 0x52, 0x2, 0x7, 0x0, 0x1f, 0xe6, + 0x10, 0x4, 0x80, 0x7f, 0xd4, 0x20, 0xb, 0x20, + 0xf, 0xe6, 0x50, 0x50, 0x1e, 0x0, 0xfc, 0x72, + 0x7, 0x54, 0x3, 0x90, 0xf, 0xf, 0x0, 0xe8, + 0x2b, 0x3, 0x28, 0x7, 0x51, 0x5, 0x8, 0x2, + 0x48, 0x28, 0x80, 0x27, 0x40, 0x74, 0x0, 0xde, + 0x0, 0xf0, 0x1, 0xc0, 0x1c, 0x0, 0x71, 0x50, + 0x15, 0x0, + + /* U+0079 "y" */ + 0xd, 0xfe, 0x0, 0xfe, 0x2f, 0xf3, 0x85, 0x80, + 0xb0, 0x7, 0xeb, 0x0, 0x38, 0x30, 0x85, 0x80, + 0x7c, 0x2c, 0xe, 0x1, 0x48, 0x12, 0x80, 0x7a, + 0x40, 0x12, 0x1, 0x30, 0x2, 0x40, 0x3c, 0xc0, + 0xa2, 0x1, 0xb, 0x1, 0x98, 0x3, 0x30, 0x84, + 0x80, 0x75, 0x80, 0x24, 0x3, 0x58, 0x19, 0x80, + 0x38, 0x94, 0x14, 0x40, 0x8, 0x41, 0x0, 0x1f, + 0x48, 0x2, 0x40, 0x1e, 0x4, 0x80, 0x1f, 0x19, + 0x81, 0xc0, 0x90, 0x2c, 0x3, 0xfa, 0x0, 0xf, + 0x60, 0x2c, 0x1, 0xfc, 0x84, 0x12, 0xc1, 0x20, + 0x1f, 0xf5, 0x80, 0x80, 0x18, 0x3, 0xfe, 0x61, + 0x0, 0x30, 0x80, 0x7f, 0xf0, 0x1c, 0x1, 0x60, + 0x1f, 0xfc, 0x1, 0x60, 0x42, 0x0, 0xf8, 0x40, + 0x34, 0x0, 0x20, 0x3, 0xf7, 0xdb, 0x2d, 0x30, + 0x29, 0x80, 0x7c, 0xc2, 0x93, 0x4a, 0x5, 0x60, + 0x1f, 0x9a, 0x4c, 0x0, 0x51, 0xa2, 0x1, 0xf8, + + /* U+007A "z" */ + 0xbf, 0xff, 0xf9, 0x40, 0x3f, 0xf8, 0x3, 0x39, + 0x9f, 0x38, 0x1, 0x10, 0x46, 0x7e, 0x17, 0x2, + 0xa0, 0xf, 0x87, 0xc0, 0x1c, 0x20, 0x1f, 0x51, + 0x5, 0x18, 0x7, 0xd0, 0x80, 0xea, 0x1, 0xf2, + 0x38, 0x24, 0x0, 0x7c, 0x56, 0x3, 0x40, 0x1f, + 0xbc, 0x1, 0xa2, 0x1, 0xf5, 0x10, 0x49, 0x80, + 0x7c, 0xea, 0xc, 0xc0, 0xf, 0x92, 0x0, 0x68, + 0xcf, 0xe1, 0x90, 0x0, 0xe6, 0x7e, 0x93, 0x0, + 0xff, 0xe0, 0x0, + + /* U+007B "{" */ + 0x0, 0xcd, 0x9f, 0xe4, 0x0, 0x9e, 0x4c, 0x3, + 0xd2, 0x0, 0x8c, 0x50, 0x0, 0x88, 0x11, 0xcc, + 0x40, 0x6, 0x0, 0x30, 0xf, 0xff, 0x68, 0x9c, + 0x0, 0x34, 0x2, 0x7c, 0x50, 0x65, 0x0, 0xf9, + 0x4, 0x2, 0x6f, 0x80, 0x27, 0x0, 0xe5, 0x0, + 0x70, 0x7, 0xff, 0xbc, 0xc0, 0x6, 0x1, 0xc2, + 0x20, 0x48, 0x31, 0x0, 0xa0, 0x0, 0xf8, 0xa0, + 0x13, 0x51, 0x80, 0x40, + + /* U+007C "|" */ + 0x1f, 0xf3, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xf9, + 0xa0, + + /* U+007D "}" */ + 0x7f, 0xf5, 0xa0, 0x7, 0xc9, 0x68, 0x1, 0x35, + 0xb0, 0x2, 0x0, 0x21, 0x49, 0x20, 0x30, 0xf, + 0x38, 0x7, 0xff, 0xc8, 0x80, 0x10, 0x60, 0x1a, + 0x50, 0x1f, 0xc, 0x2, 0x35, 0x0, 0xfa, 0xc4, + 0x2b, 0xcc, 0x2, 0x30, 0x2, 0x80, 0x7f, 0xfb, + 0xdc, 0x3, 0x85, 0x24, 0x80, 0xc0, 0x26, 0xb6, + 0x0, 0x40, 0x7, 0x92, 0xd0, 0x2, + + /* U+007E "~" */ + 0x0, 0x3f, 0x7e, 0x18, 0x6, 0x2f, 0xa0, 0x78, + 0x10, 0x3c, 0x60, 0x9, 0xc0, 0x82, 0x42, 0x76, + 0x2, 0x60, 0x6, 0x3, 0xc, 0x51, 0x89, 0xec, + 0x5f, 0xf8, 0x91, 0xc, 0x18, 0x1, 0x27, 0xa8, + 0x1, 0x68, 0x0, + + /* U+00B0 "°" */ + 0x0, 0xc2, 0x1, 0xf3, 0xf7, 0x3f, 0x10, 0x2, + 0xa8, 0x49, 0x81, 0xb5, 0x4, 0x57, 0xa6, 0x7d, + 0x3a, 0xd, 0x8, 0x0, 0xd0, 0xa, 0x44, 0x0, + 0xe6, 0x3, 0x22, 0x8, 0x6, 0x70, 0x2a, 0xb, + 0x0, 0x86, 0xc5, 0xd, 0xd7, 0x66, 0xb8, 0x68, + 0x1, 0x14, 0x2c, 0x8b, 0xa8, 0x0, + + /* U+2022 "•" */ + 0x0, 0x84, 0x2, 0x4e, 0xe6, 0x8, 0x50, 0x81, + 0xd0, 0x88, 0x2, 0x61, 0x10, 0x4, 0xe1, 0xa6, + 0x9, 0x60, + + /* U+F001 "ï€" */ + 0x0, 0xff, 0xe6, 0x89, 0x80, 0x7f, 0xf2, 0xce, + 0x37, 0xb2, 0x40, 0x3f, 0xf8, 0xc2, 0xb5, 0xd8, + 0xe4, 0x0, 0x60, 0xf, 0xfe, 0x19, 0x3e, 0x75, + 0x28, 0x80, 0x7f, 0xf1, 0x92, 0x7b, 0x60, 0xc0, + 0x3f, 0xf8, 0xc2, 0xd7, 0xf6, 0xc2, 0x1, 0xff, + 0xc8, 0x8e, 0x94, 0x0, 0xff, 0xe6, 0x38, 0x7, + 0xff, 0x78, 0x59, 0x0, 0x3f, 0xf9, 0x47, 0x19, + 0xd2, 0x60, 0x1f, 0xfc, 0x61, 0x5a, 0xec, 0x73, + 0x0, 0xff, 0xe3, 0x13, 0xe7, 0x52, 0x88, 0x7, + 0xff, 0x1d, 0x77, 0x50, 0x60, 0x1f, 0xfc, 0xb2, + 0x20, 0x7, 0xff, 0xfc, 0x3, 0xff, 0xf8, 0x2f, + 0x59, 0x68, 0x1, 0xff, 0xc9, 0x5e, 0x85, 0x34, + 0x30, 0xf, 0xfe, 0x41, 0x50, 0x7, 0xff, 0x0, + 0x4c, 0xc4, 0x1, 0xfe, 0x50, 0xf, 0xf8, 0xf3, + 0xb3, 0x1a, 0x1, 0xfe, 0x20, 0xf, 0xe2, 0x5c, + 0x30, 0xf, 0xfe, 0x12, 0xa0, 0x7, 0xe9, 0x80, + 0xf, 0xfe, 0x2d, 0xc0, 0x80, 0x64, 0xd4, 0x20, + 0xf, 0xef, 0x0, 0xfc, 0xfd, 0xcc, 0xdf, 0xb2, + 0x5, 0x0, 0xfe, 0x50, 0xf, 0xf0, 0x99, 0x0, + 0x6a, 0x50, 0xf, 0xd, 0x90, 0x7, 0xff, 0x1a, + 0xb6, 0x15, 0x4d, 0x5c, 0x80, 0x1f, 0xfc, 0x60, + + /* U+F008 "" */ + 0x9b, 0x0, 0xb3, 0xff, 0xff, 0x89, 0x60, 0x15, + 0xcb, 0x2a, 0x24, 0x40, 0x1f, 0xfc, 0x45, 0x44, + 0x95, 0x80, 0x6e, 0xe1, 0x0, 0x2a, 0xff, 0xf0, + 0x0, 0x3, 0x77, 0x8, 0x4, 0xef, 0x0, 0xa, + 0xab, 0xff, 0x80, 0x20, 0x7, 0x78, 0x2, 0x38, + 0x88, 0xc0, 0x3f, 0xf8, 0x89, 0x11, 0x18, 0x7, + 0xff, 0x48, 0x40, 0x21, 0x0, 0xff, 0xe2, 0x30, + 0x4, 0x20, 0x2, 0xff, 0x88, 0x3, 0xff, 0x88, + 0x5f, 0xf1, 0x0, 0x46, 0x70, 0x0, 0xc0, 0x3f, + 0xf8, 0x66, 0x70, 0x4, 0x79, 0x91, 0x80, 0xee, + 0xff, 0xf0, 0x4, 0xf, 0x32, 0x30, 0xf, 0xe2, + 0x2f, 0xfe, 0x0, 0x1, 0xc0, 0x3f, 0xf8, 0x24, + 0x5f, 0xfc, 0x0, 0x3, 0x80, 0x78, 0xf3, 0x23, + 0x1, 0xdd, 0xff, 0xe0, 0x8, 0x1e, 0x64, 0x60, + 0x11, 0x9c, 0x0, 0x30, 0xf, 0xfe, 0x19, 0x9c, + 0x1, 0x17, 0xfc, 0x40, 0x1f, 0xfc, 0x42, 0xff, + 0x88, 0x0, 0x20, 0x10, 0x80, 0x7f, 0xf1, 0x18, + 0x2, 0x10, 0xf, 0xfe, 0x91, 0xc4, 0x46, 0x1, + 0xff, 0xc4, 0x48, 0x88, 0xc0, 0x27, 0x78, 0x0, + 0x55, 0x5f, 0xfc, 0x1, 0x0, 0x3b, 0xc0, 0x10, + 0xdd, 0xc2, 0x0, 0x55, 0xff, 0xe0, 0x0, 0x6, + 0xee, 0x10, 0x55, 0x22, 0x44, 0x1, 0xff, 0xc4, + 0x54, 0x49, 0x58, + + /* U+F00B "" */ + 0x9f, 0xff, 0x58, 0x2, 0xbf, 0xff, 0xf8, 0x92, + 0xc0, 0x1e, 0x42, 0x15, 0x0, 0xff, 0xe2, 0x30, + 0x7, 0xff, 0xfc, 0x3, 0xff, 0xb2, 0xa0, 0x1e, + 0x32, 0x13, 0x0, 0xff, 0xe2, 0x2d, 0x7f, 0xfb, + 0x0, 0x19, 0xff, 0xff, 0xc4, 0xa0, 0xf, 0xfe, + 0x84, 0xff, 0xfa, 0xc0, 0x17, 0xff, 0xff, 0xc4, + 0x96, 0x0, 0xf2, 0x10, 0xa0, 0x7, 0xff, 0x11, + 0x80, 0x3f, 0xff, 0xe0, 0x1f, 0xfd, 0x95, 0x0, + 0xf1, 0x90, 0xa0, 0x7, 0xff, 0x11, 0xab, 0xff, + 0xd8, 0x0, 0xbf, 0xff, 0xfe, 0x24, 0x80, 0x7f, + 0xf4, 0x2b, 0xff, 0xd8, 0x0, 0xcf, 0xff, 0xfe, + 0x25, 0x28, 0x7, 0x8c, 0x84, 0xc0, 0x3f, 0xf8, + 0x8a, 0x1, 0xff, 0xff, 0x0, 0xff, 0xec, 0xb0, + 0x7, 0x90, 0x85, 0x40, 0x3f, 0xf8, 0x8c, + + /* U+F00C "" */ + 0x0, 0xff, 0xe5, 0xaf, 0x48, 0x7, 0xff, 0x31, + 0xa8, 0x5a, 0x80, 0x3f, 0xf9, 0x4d, 0x20, 0x12, + 0xc8, 0x7, 0xff, 0x21, 0xa4, 0x3, 0x98, 0x3, + 0xff, 0x8e, 0xd2, 0x1, 0xe7, 0x0, 0xff, 0xe3, + 0x34, 0x80, 0x79, 0xe0, 0x3, 0xff, 0x8a, 0xd2, + 0x1, 0xe7, 0x80, 0xa, 0x39, 0x40, 0x3f, 0xe6, + 0x90, 0xf, 0x3c, 0x0, 0x54, 0xe3, 0x4c, 0x1, + 0xfc, 0xd2, 0x1, 0xe7, 0x80, 0xa, 0x54, 0x2, + 0x96, 0x0, 0xf9, 0xa4, 0x3, 0xcf, 0x0, 0x19, + 0x80, 0x3a, 0x58, 0x3, 0x9a, 0x40, 0x3c, 0xf0, + 0x1, 0xce, 0x1, 0xe9, 0x60, 0x9, 0xa4, 0x3, + 0xcf, 0x0, 0x1e, 0x87, 0x0, 0xf4, 0xb0, 0x34, + 0x80, 0x79, 0xe0, 0x3, 0xf4, 0x38, 0x7, 0xa6, + 0xa4, 0x3, 0xcf, 0x0, 0x1f, 0xe8, 0x70, 0xf, + 0x28, 0x7, 0x9e, 0x0, 0x3f, 0xf8, 0x10, 0xe0, + 0x1f, 0xf3, 0xc0, 0x7, 0xff, 0xa, 0x1c, 0x3, + 0xf9, 0xe0, 0x3, 0xff, 0x89, 0xe, 0x1, 0xf4, + 0x40, 0x3, 0xff, 0x8d, 0x10, 0x0, 0xe8, 0x70, + 0xf, 0xfe, 0x43, 0xc0, 0x5, 0xe, 0x1, 0xff, + 0xca, 0x78, 0x18, 0x70, 0xf, 0xfe, 0x18, + + /* U+F00D "ï€" */ + 0x0, 0xff, 0xe2, 0x8, 0x6, 0x6f, 0xf2, 0x80, + 0x7f, 0x16, 0xf5, 0x0, 0x1a, 0x40, 0x14, 0xa0, + 0x1f, 0x16, 0x10, 0x2d, 0x4, 0x0, 0x6a, 0x50, + 0xe, 0x2c, 0x10, 0x9, 0x48, 0x80, 0x1d, 0x4a, + 0x1, 0x16, 0x8, 0x7, 0x1f, 0x8, 0x7, 0x52, + 0x81, 0x60, 0x80, 0x75, 0x9, 0x60, 0x80, 0x75, + 0x3e, 0x8, 0x7, 0x52, 0x80, 0xb, 0x4, 0x3, + 0xa0, 0x40, 0x3a, 0x94, 0x3, 0x16, 0x8, 0x7, + 0xfa, 0x94, 0x3, 0xc5, 0x82, 0x1, 0xfa, 0x94, + 0x3, 0xf1, 0x50, 0x7, 0xce, 0xa0, 0x1f, 0xc5, + 0x40, 0x1f, 0x3a, 0x80, 0x7e, 0x2c, 0x10, 0xf, + 0xd4, 0xa0, 0x1e, 0x2c, 0x10, 0xf, 0xf5, 0x28, + 0x6, 0x2c, 0x10, 0xe, 0x91, 0x0, 0xea, 0x50, + 0x1, 0x60, 0x80, 0x75, 0xb6, 0x8, 0x7, 0x52, + 0x87, 0x8, 0x7, 0x5a, 0x1, 0x60, 0x80, 0x75, + 0x9, 0x0, 0x75, 0xa0, 0x4, 0x58, 0x20, 0x1c, + 0x70, 0x1, 0xad, 0x0, 0x38, 0xb0, 0x40, 0x25, + 0x26, 0x90, 0x5, 0xa0, 0x7, 0xc5, 0x84, 0xb, + 0x40, 0x6, 0xff, 0x20, 0x7, 0xf1, 0x6f, 0x50, + 0x0, + + /* U+F011 "" */ + 0x0, 0xff, 0xe0, 0x34, 0xc9, 0x80, 0x3f, 0xf9, + 0x65, 0x2c, 0xc9, 0x20, 0xf, 0xfe, 0x50, 0x80, + 0x61, 0x0, 0xff, 0xe2, 0xd, 0x40, 0x7, 0xff, + 0x2, 0x28, 0x40, 0x3f, 0x8f, 0xd5, 0xd8, 0x3, + 0xfc, 0xce, 0xbe, 0x60, 0x1f, 0x16, 0x88, 0x2, + 0x0, 0x3f, 0xd0, 0x0, 0x1c, 0x30, 0xf, 0x78, + 0x80, 0x7f, 0xf1, 0xf8, 0x40, 0x34, 0x90, 0x4, + 0x3a, 0x1, 0xfe, 0xd1, 0x0, 0x8a, 0x0, 0x22, + 0x60, 0x8, 0x70, 0xc0, 0x3f, 0xc7, 0x82, 0x1, + 0x31, 0x0, 0x2c, 0x3, 0x59, 0x0, 0x7f, 0xf0, + 0xa, 0xc0, 0x35, 0x80, 0x1c, 0x2, 0x35, 0x0, + 0xff, 0xe1, 0x29, 0x80, 0x4e, 0x6, 0x20, 0x14, + 0x80, 0x7f, 0xf1, 0x28, 0x2, 0x13, 0x50, 0xc, + 0xa0, 0x1f, 0xfc, 0x46, 0x0, 0xca, 0x20, 0x10, + 0x80, 0x7f, 0xf1, 0x84, 0x2, 0xef, 0x0, 0x8c, + 0x3, 0xc2, 0x1, 0x84, 0x3, 0xc6, 0x1, 0xf8, + 0xc0, 0x3c, 0x42, 0x0, 0x12, 0x0, 0xf1, 0x80, + 0x5f, 0xc0, 0x10, 0x80, 0x7d, 0xdb, 0xae, 0x0, + 0xf8, 0x40, 0x21, 0x50, 0xc, 0xa0, 0x1f, 0x11, + 0x0, 0x3e, 0x50, 0xc, 0xa6, 0x20, 0x17, 0x0, + 0x7f, 0xf1, 0x38, 0x2, 0x13, 0x7, 0x0, 0x91, + 0x0, 0x1f, 0xfc, 0x24, 0x40, 0x4, 0xe0, 0xb, + 0x0, 0xd4, 0x40, 0x1f, 0xfc, 0x2, 0xa0, 0xd, + 0x60, 0x2, 0x60, 0x8, 0x70, 0xc0, 0x3f, 0xc7, + 0x82, 0x1, 0x31, 0x0, 0x50, 0x20, 0x10, 0xe4, + 0x0, 0x7e, 0x8c, 0x10, 0x8, 0xa0, 0x3, 0xe, + 0x80, 0x73, 0xfd, 0x3a, 0xa9, 0xeb, 0xdc, 0x3, + 0xf, 0x88, 0x7, 0x1e, 0x8, 0x7, 0x2c, 0x55, + 0x21, 0x40, 0x38, 0x74, 0x80, 0x3e, 0x3c, 0x30, + 0xf, 0xfe, 0x11, 0xf9, 0x80, 0x7f, 0x16, 0x48, + 0x80, 0x7f, 0x86, 0x70, 0x40, 0x3f, 0xf8, 0xd, + 0xd6, 0xc4, 0x1, 0x9, 0x35, 0xf3, 0x0, 0x7f, + 0xf1, 0x12, 0x77, 0xfe, 0xed, 0x94, 0x0, 0xfe, + + /* U+F013 "" */ + 0x0, 0xff, 0xec, 0x16, 0x7f, 0xed, 0x60, 0xf, + 0xfe, 0x3b, 0x98, 0x6, 0x2c, 0x0, 0xff, 0xf1, + 0x68, 0x7, 0x98, 0x40, 0x3f, 0xe1, 0xc8, 0x0, + 0x2e, 0xb8, 0x7, 0x8f, 0xa0, 0x0, 0xda, 0x80, + 0x1d, 0xa6, 0xfd, 0x54, 0x20, 0xf, 0xe7, 0xcc, + 0x49, 0x51, 0x0, 0x4e, 0x60, 0x1, 0x50, 0xf, + 0xfe, 0x1, 0x98, 0x0, 0x32, 0x0, 0x18, 0x0, + 0xff, 0xe5, 0x22, 0x1, 0x80, 0x3f, 0xf9, 0x9e, + 0x16, 0x1, 0xfc, 0x31, 0x9b, 0x44, 0x1, 0xfc, + 0x83, 0xe6, 0x1, 0xf0, 0xfb, 0x99, 0x2e, 0xa0, + 0x7, 0xc3, 0x22, 0x79, 0x0, 0x1e, 0xa1, 0x0, + 0xeb, 0x10, 0xe, 0x4f, 0x60, 0x8, 0xc0, 0x38, + 0x50, 0x3, 0xe7, 0x0, 0xe2, 0x10, 0xc, 0x20, + 0x1c, 0x40, 0x1f, 0x84, 0x3, 0x8c, 0x3, 0x84, + 0x3, 0x88, 0x3, 0xf0, 0x80, 0x71, 0x0, 0x71, + 0x80, 0x70, 0xa0, 0x7, 0xce, 0x1, 0xc6, 0x20, + 0x3, 0xc8, 0x0, 0xf5, 0x8, 0x7, 0x58, 0x80, + 0x72, 0x7b, 0x7, 0x98, 0x7, 0xc3, 0xee, 0x64, + 0xba, 0x80, 0x1f, 0xc, 0x8d, 0x80, 0x7f, 0xc, + 0x66, 0xd1, 0x0, 0x7f, 0x20, 0xb0, 0x80, 0x7f, + 0xf2, 0xfc, 0x6, 0x40, 0x3f, 0xf9, 0x48, 0x80, + 0x3, 0x98, 0x0, 0x54, 0x3, 0xff, 0x80, 0x66, + 0x0, 0xd, 0x0, 0x6d, 0x37, 0xea, 0xa1, 0x0, + 0x7f, 0x3e, 0x62, 0x8a, 0x84, 0x3, 0xe, 0x40, + 0x1, 0x75, 0xc0, 0x3c, 0x7f, 0x0, 0x5, 0xd4, + 0x0, 0xff, 0xe0, 0x68, 0x7, 0x98, 0x3, 0xff, + 0xc4, 0xe6, 0x1, 0x8b, 0x0, 0x3f, 0xf8, 0xe5, + 0x9f, 0xfb, 0x58, 0x3, 0xfc, + + /* U+F015 "" */ + 0x0, 0xff, 0xe1, 0x1b, 0xb0, 0x7, 0x24, 0x44, + 0x80, 0x1f, 0xfc, 0x67, 0xc8, 0x9d, 0x10, 0xb, + 0x9d, 0xee, 0x0, 0xff, 0xe2, 0xd4, 0x0, 0x45, + 0xe6, 0x0, 0x10, 0x8, 0x40, 0x3f, 0xf8, 0x63, + 0x8a, 0x1, 0xc3, 0x8c, 0x1, 0xff, 0xc8, 0x3f, + 0x30, 0x9, 0xcc, 0x2, 0x99, 0x0, 0x7f, 0xf1, + 0x9b, 0x4, 0x0, 0x39, 0x18, 0xa0, 0x13, 0x20, + 0x7, 0xff, 0x12, 0x24, 0x2, 0x2c, 0x33, 0xd, + 0x40, 0x7, 0xff, 0x18, 0x6d, 0xc0, 0x25, 0xd2, + 0x8c, 0xc1, 0x3d, 0x80, 0x7f, 0xf1, 0xb, 0x10, + 0x2, 0x7a, 0xb, 0x70, 0x2d, 0x44, 0x69, 0x0, + 0x7f, 0xf0, 0x53, 0x48, 0x2, 0xa8, 0x2d, 0x40, + 0xd, 0x6e, 0x58, 0x80, 0x12, 0x50, 0x7, 0x9e, + 0xc0, 0x21, 0xc5, 0x3c, 0x20, 0xf, 0x45, 0xd, + 0xb0, 0x4, 0xb8, 0x20, 0x15, 0x40, 0x4, 0x7e, + 0x6d, 0x82, 0x1, 0xf9, 0x70, 0x66, 0x40, 0x11, + 0xf9, 0x85, 0xa8, 0x4, 0xb8, 0x33, 0x20, 0xf, + 0xf8, 0xfc, 0xda, 0xc4, 0x0, 0x38, 0x80, 0x1a, + 0x28, 0x6d, 0x80, 0x3f, 0xf8, 0x23, 0x8a, 0x98, + 0x40, 0x13, 0xd9, 0x5, 0xb9, 0x62, 0x0, 0x7f, + 0xf1, 0x2a, 0xb, 0x50, 0x24, 0xc3, 0x35, 0x2, + 0x48, 0x3, 0xff, 0x8c, 0xe6, 0x17, 0x8c, 0x0, + 0x12, 0x0, 0x38, 0x7, 0xff, 0x21, 0xc0, 0x6, + 0x1, 0xff, 0xe3, 0xbf, 0xfc, 0x60, 0x1f, 0xfc, + 0xe6, 0x0, 0xcc, 0x1, 0xff, 0xff, 0x0, 0xff, + 0xfd, 0xa0, 0x7, 0x88, 0x80, 0x1b, 0x0, 0x3c, + 0x2a, 0x1, 0xc0, + + /* U+F019 "" */ + 0x0, 0xff, 0x8d, 0x57, 0x18, 0x7, 0xff, 0x25, + 0x72, 0xab, 0x62, 0x80, 0x7f, 0xf2, 0x34, 0x3, + 0xda, 0x1, 0xff, 0xff, 0x0, 0xff, 0xff, 0x80, + 0x7f, 0xff, 0xc0, 0x3f, 0xf8, 0x23, 0x9b, 0xb9, + 0x80, 0x3c, 0xdb, 0xbb, 0x4, 0x3, 0xf2, 0x99, + 0x16, 0x10, 0xf, 0x9, 0x16, 0x35, 0x0, 0xfc, + 0x8c, 0x1, 0xff, 0xc4, 0x64, 0x0, 0xfe, 0x96, + 0x0, 0xff, 0xe1, 0x34, 0x80, 0x7f, 0xd2, 0xc0, + 0x1f, 0xfc, 0x6, 0x90, 0xf, 0xfe, 0xc, 0xb8, + 0x7, 0xf9, 0xe4, 0x3, 0xff, 0x87, 0xe, 0x1, + 0xf9, 0xe0, 0x3, 0xff, 0x8b, 0xe, 0x1, 0xe7, + 0x80, 0xf, 0xf0, 0x8f, 0xe0, 0x87, 0x0, 0xcf, + 0x0, 0x23, 0xf8, 0x2f, 0xbb, 0xf6, 0x8c, 0x38, + 0x1, 0xe0, 0x77, 0xbb, 0xf5, 0xa0, 0x7, 0xe2, + 0xf2, 0x89, 0x94, 0x16, 0x10, 0x7, 0xe4, 0x0, + 0xff, 0xe, 0x1b, 0x30, 0xf0, 0x80, 0x3f, 0xf9, + 0x23, 0x9b, 0xac, 0x10, 0xf, 0xfe, 0x61, 0x10, + 0x3, 0xff, 0xa9, 0x7c, 0x29, 0xee, 0x1, 0xff, + 0xca, 0x13, 0x7, 0x10, 0xc, 0x20, 0x1f, 0xfc, + 0x6a, 0xd1, 0x3e, 0x70, 0x0, 0xec, 0x3b, 0xff, + 0xf3, 0x23, 0x40, + + /* U+F01C "" */ + 0x0, 0xf1, 0x5f, 0xff, 0xff, 0xf, 0xa0, 0x3, + 0xff, 0x80, 0x38, 0x80, 0x1f, 0xfc, 0x31, 0x78, + 0x0, 0xff, 0xac, 0x40, 0x3f, 0xf8, 0xce, 0x60, + 0x1f, 0xca, 0xa0, 0x1, 0x3b, 0xff, 0xf0, 0x58, + 0x2, 0xe0, 0xf, 0xc3, 0x60, 0x17, 0x44, 0x7f, + 0xf0, 0x65, 0x0, 0x5, 0x0, 0x1f, 0x58, 0x80, + 0x1c, 0xc0, 0x3f, 0xf8, 0x54, 0x20, 0x7, 0x30, + 0xe, 0x55, 0x0, 0xa, 0x0, 0x3f, 0xf8, 0x63, + 0x60, 0x17, 0x0, 0x61, 0xb0, 0xb, 0x80, 0x3f, + 0xf8, 0xaa, 0x80, 0x2, 0x80, 0xa, 0xc4, 0x0, + 0xe6, 0x1, 0xff, 0xc6, 0xa1, 0x0, 0x39, 0x2, + 0xa8, 0x0, 0x50, 0x1, 0xff, 0xc7, 0x1b, 0x0, + 0xbc, 0x20, 0x2, 0x68, 0x8e, 0x70, 0xf, 0xe4, + 0x88, 0xed, 0x10, 0x1, 0x29, 0x0, 0x48, 0xef, + 0xd0, 0xe0, 0x1f, 0xa9, 0xdf, 0xc2, 0x1, 0x10, + 0x7, 0xfd, 0x20, 0x1f, 0x38, 0x80, 0x7f, 0xbc, + 0x3, 0xfe, 0x17, 0x0, 0xf4, 0x80, 0x7f, 0xf3, + 0x23, 0xff, 0xc2, 0x1, 0xff, 0xff, 0x0, 0xff, + 0xfa, 0x7a, 0x0, 0x7f, 0xf4, 0x92, 0x90, 0x3, + 0xff, 0x9e, 0x34, 0x60, + + /* U+F021 "" */ + 0x0, 0xff, 0xe6, 0x2c, 0x41, 0x80, 0x3f, 0x92, + 0x77, 0xbf, 0xdd, 0x6e, 0x40, 0x1d, 0xe, 0xe9, + 0x0, 0xf9, 0xb6, 0xd8, 0x84, 0x0, 0x29, 0x1b, + 0x66, 0x1, 0xff, 0xc0, 0x1b, 0x92, 0x0, 0xff, + 0x26, 0x50, 0x80, 0x80, 0x7c, 0x5e, 0x80, 0x1e, + 0x11, 0x0, 0x79, 0x7c, 0xdc, 0x3, 0xc5, 0x82, + 0x1, 0x9a, 0xff, 0xb9, 0xf6, 0x80, 0x18, 0x75, + 0x80, 0x3d, 0xe2, 0x1, 0x1e, 0xca, 0x0, 0x64, + 0xbc, 0x30, 0x8, 0x48, 0x3, 0xa4, 0x80, 0x26, + 0xc2, 0x0, 0xfc, 0x78, 0xe0, 0x1f, 0x89, 0x80, + 0x26, 0x90, 0xf, 0xc2, 0x20, 0x4, 0x38, 0x7, + 0xd6, 0x1, 0x14, 0x80, 0x7e, 0x3e, 0xe7, 0xfb, + 0x98, 0x3, 0xe7, 0x0, 0xa4, 0x3, 0xf9, 0xc0, + 0x30, 0x88, 0x3, 0xc6, 0x20, 0x1, 0x40, 0xf, + 0xfe, 0x50, 0xa1, 0x9a, 0x0, 0x3f, 0xca, 0x86, + 0x7f, 0xe5, 0x2b, 0xcc, 0x30, 0x7, 0xf8, 0x6f, + 0x33, 0xfd, 0x40, 0x1f, 0xfe, 0xca, 0xcc, 0xff, + 0x58, 0x80, 0x7f, 0x9a, 0xf2, 0xc9, 0x4c, 0xff, + 0xc8, 0xa0, 0x1f, 0xe8, 0x43, 0x40, 0xf, 0xfe, + 0x5a, 0x88, 0x0, 0x48, 0x3, 0xc2, 0x20, 0xc, + 0xe0, 0x1f, 0xd0, 0x1, 0x38, 0x7, 0xcd, 0xdf, + 0xee, 0xe1, 0x80, 0x7e, 0xa2, 0x0, 0xac, 0x3, + 0xe7, 0x80, 0x0, 0x88, 0x3, 0xf4, 0xa8, 0x4, + 0xc4, 0x1, 0xf9, 0xec, 0x80, 0x3f, 0x16, 0x30, + 0x4, 0x52, 0x1, 0xc4, 0x20, 0x12, 0x6d, 0x20, + 0x6, 0x4a, 0xd3, 0x0, 0x87, 0xc0, 0x3c, 0xda, + 0x20, 0x19, 0x6f, 0xfb, 0x9f, 0x6a, 0x1, 0x87, + 0x8, 0x3, 0xce, 0x7e, 0xa0, 0x1e, 0x11, 0x0, + 0x79, 0x3c, 0x80, 0x3e, 0x10, 0x1a, 0xc4, 0x0, + 0xff, 0x14, 0xd8, 0x80, 0x7f, 0xf0, 0xe, 0xf6, + 0xc, 0x3, 0x13, 0x5e, 0xb0, 0x7, 0xd2, 0xee, + 0x80, 0xe, 0x27, 0xcf, 0xfd, 0xb2, 0x80, 0x1f, + 0xc0, + + /* U+F026 "" */ + 0x0, 0xff, 0xe6, 0x9d, 0xb0, 0x7, 0xf8, 0xf1, + 0x24, 0x3, 0xf8, 0xf0, 0x3, 0xfe, 0x3c, 0x0, + 0xff, 0x8f, 0x0, 0x38, 0xe2, 0x3d, 0x80, 0x1e, + 0xd7, 0x7f, 0x0, 0x7c, 0x20, 0x1f, 0xff, 0xf0, + 0xf, 0xfe, 0xc3, 0x0, 0x7f, 0xf0, 0x67, 0xff, + 0xce, 0x1, 0xff, 0xc1, 0x87, 0x0, 0xff, 0xe0, + 0xc3, 0x80, 0x7f, 0xf0, 0x61, 0xc0, 0x3f, 0xf8, + 0x30, 0xe0, 0x60, 0x1f, 0xf4, 0x76, 0x0, + + /* U+F027 "" */ + 0x0, 0xff, 0xea, 0x1d, 0xb0, 0x7, 0xff, 0x14, + 0xf5, 0x24, 0x3, 0xff, 0x88, 0x78, 0x20, 0x1f, + 0xfc, 0x53, 0xc0, 0xf, 0xfe, 0x31, 0xe0, 0x7, + 0xff, 0x0, 0xe2, 0x3d, 0x80, 0x1f, 0xfc, 0x1d, + 0x77, 0xf0, 0x7, 0xf0, 0xdc, 0x80, 0x4, 0x3, + 0xff, 0x86, 0xe8, 0xd8, 0x1, 0xff, 0xc5, 0x73, + 0x3, 0x70, 0xf, 0xfe, 0x20, 0xe0, 0x85, 0x0, + 0x7f, 0xf1, 0x90, 0x8, 0x3, 0xff, 0x8c, 0xe0, + 0x40, 0x1f, 0xfc, 0x5b, 0x20, 0x50, 0xf, 0xfe, + 0x23, 0x20, 0x14, 0x0, 0x7f, 0xf1, 0x10, 0x93, + 0x1, 0x80, 0x3f, 0xf8, 0x65, 0xb6, 0x21, 0x3f, + 0xfe, 0x70, 0xf, 0xfe, 0x44, 0x38, 0x7, 0xff, + 0x22, 0x1c, 0x3, 0xff, 0x91, 0xe, 0x1, 0xff, + 0xc8, 0x87, 0x3, 0x0, 0xff, 0xe3, 0x46, 0xe0, + 0x7, 0xc0, + + /* U+F028 "" */ + 0x0, 0xff, 0xe5, 0xc, 0x28, 0x7, 0xff, 0x45, + 0x9e, 0xa8, 0x1, 0xff, 0xd0, 0x40, 0x2, 0xe0, + 0x80, 0x7f, 0xf0, 0xce, 0xd8, 0x3, 0xf1, 0xe9, + 0x1, 0xe8, 0x7, 0xff, 0x8, 0xf1, 0x24, 0x3, + 0xc4, 0x20, 0x58, 0x60, 0x72, 0x1, 0xff, 0xc0, + 0x3c, 0x0, 0xfc, 0x9b, 0xea, 0x3, 0xa2, 0xc, + 0x60, 0x1f, 0xe3, 0xc0, 0xf, 0xe1, 0x1, 0xa6, + 0x1, 0xa0, 0x7, 0x80, 0x7f, 0x1e, 0x0, 0x7f, + 0x96, 0x0, 0x12, 0x80, 0x8a, 0x6, 0x80, 0x71, + 0x1e, 0xc0, 0xf, 0xfe, 0x3, 0xd0, 0x2, 0x80, + 0x10, 0x0, 0xe0, 0xd7, 0x7f, 0x0, 0x7f, 0xe, + 0x50, 0x82, 0xb8, 0xb, 0x1, 0x18, 0x28, 0x8, + 0x7, 0xff, 0xd, 0xcd, 0x70, 0x1, 0x20, 0xa, + 0x0, 0x20, 0x0, 0x80, 0x3f, 0xf8, 0x8e, 0x60, + 0x50, 0x2, 0xa0, 0x60, 0xc, 0x0, 0x38, 0x7, + 0xff, 0x10, 0x70, 0x81, 0x40, 0x1a, 0x0, 0x20, + 0x70, 0x1, 0x0, 0x7f, 0xf1, 0x9c, 0x8, 0x0, + 0x20, 0x1, 0x1, 0x0, 0xff, 0xe4, 0xb8, 0x10, + 0x0, 0x40, 0x2, 0x2, 0x1, 0xff, 0xc7, 0x1c, + 0x20, 0x50, 0x6, 0x80, 0x8, 0x1c, 0x0, 0x40, + 0x1f, 0xfc, 0x47, 0x30, 0x28, 0x1, 0x50, 0x30, + 0x6, 0x0, 0x1c, 0x3, 0xff, 0x88, 0xe6, 0xb8, + 0x0, 0x80, 0x5, 0x0, 0x14, 0x4, 0x98, 0x3, + 0xff, 0x86, 0x39, 0x42, 0xa, 0xc0, 0x2c, 0x6, + 0x40, 0x81, 0x3f, 0xfe, 0x70, 0xf, 0xfe, 0x3, + 0xd0, 0x2, 0x80, 0x12, 0x0, 0xe0, 0xf, 0xd0, + 0xe0, 0x1f, 0xe5, 0x80, 0x4, 0xa0, 0x22, 0x81, + 0xa0, 0x7, 0xf4, 0x38, 0x7, 0xf0, 0x80, 0xd3, + 0x0, 0xd0, 0x3, 0xc0, 0x3f, 0xe8, 0x70, 0xf, + 0xc9, 0xbe, 0xa0, 0x38, 0x20, 0xc6, 0x1, 0xff, + 0xc0, 0x87, 0x3, 0x0, 0xf1, 0x8, 0x16, 0x10, + 0x1c, 0x80, 0x7f, 0xf0, 0xa3, 0xb0, 0x3, 0xf1, + 0xe9, 0x1, 0xe8, 0x7, 0xff, 0x10, 0x40, 0x3f, + 0x90, 0x0, 0xb8, 0x20, 0x1f, 0xfc, 0xe6, 0x7a, + 0xa0, 0x7, 0x80, + + /* U+F03E "" */ + 0x1b, 0xff, 0xff, 0xe6, 0x58, 0xd2, 0x0, 0x7f, + 0xf3, 0x12, 0x90, 0x3, 0xff, 0x9c, 0x80, 0x19, + 0xb3, 0x60, 0x3, 0xff, 0x96, 0xd2, 0x64, 0xf4, + 0x1, 0xff, 0xca, 0xb0, 0xc, 0xa2, 0x1, 0xff, + 0xd8, 0x27, 0x0, 0xff, 0x94, 0x3, 0x18, 0x80, + 0x7c, 0x79, 0x12, 0x1, 0xfe, 0x85, 0x0, 0x1f, + 0x0, 0x7c, 0x7a, 0x20, 0xd2, 0x1, 0xfe, 0xae, + 0xe6, 0x10, 0x7, 0x8f, 0x44, 0x2, 0x69, 0x0, + 0xff, 0x8, 0xc0, 0x1e, 0x3d, 0x10, 0xe, 0x69, + 0x0, 0xff, 0x1f, 0xe0, 0x80, 0x47, 0xa2, 0x1, + 0xf3, 0x30, 0x3, 0xf1, 0xe8, 0x9e, 0x88, 0x1e, + 0x88, 0x7, 0xf0, 0x80, 0x7c, 0x7a, 0x20, 0x3, + 0xd4, 0xd1, 0x0, 0xff, 0xe2, 0x96, 0x88, 0x6, + 0x3b, 0x10, 0xf, 0xfe, 0x32, 0x88, 0x7, 0xff, + 0xa9, 0x22, 0x3f, 0xf9, 0x8, 0x1, 0xe3, 0x77, + 0xff, 0xe4, 0x18, 0x4, 0x80, 0x1f, 0xfc, 0xe4, + 0xa4, 0x0, 0xff, 0xe6, 0x25, 0x0, + + /* U+F043 "ïƒ" */ + 0x0, 0xfc, 0x72, 0xa0, 0x1f, 0xfc, 0x5d, 0x6a, + 0x20, 0xf, 0xfe, 0x1a, 0x8, 0x2, 0x80, 0x3f, + 0xf8, 0x7c, 0x1, 0x30, 0x7, 0xff, 0x8, 0x54, + 0x2, 0x14, 0x0, 0xff, 0xe0, 0xc8, 0x7, 0x40, + 0x7, 0xff, 0x0, 0x5c, 0x3, 0x8d, 0x0, 0x3f, + 0xe9, 0x0, 0xfa, 0x0, 0x3f, 0xc4, 0xe0, 0x1f, + 0x1b, 0x0, 0x7f, 0x70, 0x7, 0xf4, 0x88, 0x7, + 0xce, 0x60, 0x1f, 0xea, 0x0, 0xf1, 0xc0, 0x7, + 0xfc, 0x8e, 0x1, 0xdc, 0x1, 0xff, 0xc1, 0x83, + 0x0, 0x9c, 0x80, 0x3f, 0xf8, 0x50, 0x1, 0x48, + 0x7, 0xff, 0xd, 0xc, 0x18, 0x40, 0x3f, 0xf8, + 0x94, 0x1a, 0x1, 0xff, 0xc5, 0x70, 0x60, 0xf, + 0xfe, 0x28, 0x88, 0x80, 0xb, 0xe4, 0x1, 0xff, + 0xc1, 0x21, 0x0, 0x10, 0x38, 0x7, 0xff, 0x4, + 0x4c, 0x0, 0x81, 0x80, 0x1f, 0xfc, 0x13, 0x40, + 0x1, 0x93, 0x18, 0x7, 0xfc, 0x43, 0xa0, 0x14, + 0x86, 0x30, 0x7, 0xfa, 0x81, 0xc, 0x0, 0x94, + 0x13, 0xfa, 0x60, 0x1e, 0x16, 0x0, 0x70, 0x4, + 0xba, 0xc2, 0x4e, 0x1, 0xeb, 0x10, 0x1, 0x50, + 0x4, 0x53, 0xde, 0x80, 0x1c, 0xea, 0x1, 0x96, + 0xc4, 0x3, 0xfd, 0x30, 0x1, 0xe4, 0xf7, 0x0, + 0xf9, 0x75, 0x80, 0x3f, 0xc, 0x7d, 0xcc, 0x4d, + 0xfd, 0x10, 0x7, 0x0, + + /* U+F048 "ïˆ" */ + 0x48, 0x88, 0x3, 0xfe, 0x77, 0x7, 0xbb, 0xc6, + 0x1, 0xfd, 0x71, 0x9, 0x0, 0xff, 0xe0, 0xe, + 0x20, 0x1, 0x40, 0x3f, 0xe1, 0xc3, 0x0, 0xff, + 0xe1, 0x17, 0x90, 0x7, 0xff, 0x8, 0xf0, 0x40, + 0x3f, 0xf8, 0x49, 0x82, 0x1, 0xff, 0xc2, 0x5b, + 0x0, 0xff, 0xe1, 0xb5, 0x0, 0x7f, 0xf0, 0xde, + 0x40, 0x3f, 0xf8, 0x71, 0x0, 0xf, 0xfe, 0x22, + 0x0, 0x7f, 0xfe, 0xe8, 0x80, 0x3f, 0xf8, 0x8d, + 0x86, 0x1, 0xff, 0xc4, 0x1c, 0x40, 0xf, 0xfe, + 0x2d, 0xa8, 0x7, 0xff, 0x16, 0x98, 0x3, 0xff, + 0x8b, 0x2e, 0x1, 0xff, 0xc5, 0x89, 0x0, 0xff, + 0xe2, 0xb5, 0x0, 0x7f, 0xf1, 0x56, 0xc0, 0x27, + 0x20, 0x0, 0x88, 0x3, 0xf2, 0x61, 0x12, 0x27, + 0xfd, 0xc4, 0x1, 0xfc, 0x7b, 0xa3, + + /* U+F04B "ï‹" */ + 0x3, 0x75, 0x0, 0xff, 0xe4, 0xbe, 0x45, 0x61, + 0x80, 0x7f, 0xf1, 0xe4, 0x2, 0x3c, 0x91, 0x0, + 0xff, 0xe2, 0x88, 0x7, 0x37, 0xb0, 0x7, 0xff, + 0x2c, 0x67, 0x4c, 0x3, 0xff, 0x96, 0x59, 0x42, + 0x1, 0xff, 0xcb, 0x5e, 0x70, 0xf, 0xfe, 0x64, + 0x6a, 0x0, 0x7f, 0xf2, 0xca, 0xec, 0x40, 0x1f, + 0xfc, 0xb4, 0xd8, 0x0, 0xff, 0xe6, 0x3f, 0x28, + 0x7, 0xff, 0x2c, 0x6a, 0xc8, 0x3, 0xff, 0x96, + 0x9a, 0xe0, 0x1f, 0xfc, 0xc8, 0x40, 0xf, 0xfe, + 0x61, 0x80, 0x7f, 0xf3, 0xc, 0x3, 0xff, 0x97, + 0x8, 0x1, 0xff, 0xc9, 0x4d, 0x70, 0xf, 0xfe, + 0x40, 0xd5, 0x90, 0x7, 0xff, 0x21, 0xf9, 0x40, + 0x3f, 0xf9, 0x9, 0xb0, 0x1, 0xff, 0xc8, 0x2b, + 0xb1, 0x0, 0x7f, 0xf2, 0x23, 0x50, 0x3, 0xff, + 0x90, 0xbc, 0xe0, 0x1f, 0xfc, 0x82, 0xca, 0x10, + 0xf, 0xfe, 0x38, 0xce, 0x98, 0x7, 0xff, 0x8, + 0x40, 0x39, 0xbd, 0x80, 0x3f, 0xf8, 0x90, 0x1, + 0x1e, 0x48, 0x80, 0x7f, 0xf1, 0x5b, 0x22, 0xf0, + 0xc0, 0x3f, 0xf8, 0xe0, + + /* U+F04C "ïŒ" */ + 0x1a, 0xef, 0xfe, 0xd5, 0x0, 0xc3, 0x5d, 0xff, + 0xda, 0xa1, 0x6a, 0x20, 0x1c, 0x54, 0x40, 0x15, + 0xa8, 0x80, 0x71, 0x51, 0x28, 0x7, 0xf2, 0x80, + 0x4a, 0x1, 0xfc, 0xa0, 0x1f, 0xef, 0x0, 0xff, + 0xe0, 0xf8, 0x7, 0xff, 0xfc, 0x3, 0xff, 0xfe, + 0x1, 0xff, 0xff, 0x0, 0xff, 0xff, 0x80, 0x7f, + 0xff, 0xc0, 0x3f, 0xfe, 0x1e, 0x1, 0xff, 0xc1, + 0xf1, 0x0, 0xfe, 0x10, 0x8, 0x40, 0x3f, 0x86, + 0x0, 0x3f, 0x13, 0x0, 0x50, 0x1, 0xf8, 0x99, + 0x96, 0xec, 0xd9, 0xe3, 0x0, 0x33, 0x5b, 0xb3, + 0x67, 0x8c, 0x0, + + /* U+F04D "ï" */ + 0x3, 0x88, 0xff, 0xe4, 0x30, 0x1, 0xb1, 0xdf, + 0xff, 0x91, 0x3a, 0x10, 0x1, 0xff, 0xca, 0x26, + 0x10, 0xf, 0xfe, 0x58, 0x80, 0x7f, 0xf3, 0x3c, + 0x3, 0xff, 0xfe, 0x1, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xff, 0xe0, + 0x1f, 0xff, 0xef, 0x50, 0xf, 0xfe, 0x5a, 0xda, + 0x88, 0x7, 0xff, 0x1c, 0xa8, 0x80, + + /* U+F051 "ï‘" */ + 0x5, 0x81, 0x0, 0xff, 0x34, 0x41, 0xd6, 0x9f, + 0xc8, 0x3, 0xfa, 0x1d, 0xd0, 0x40, 0x1, 0xc3, + 0x0, 0xfc, 0x20, 0x17, 0x80, 0x43, 0x88, 0x1, + 0xff, 0xc5, 0xb5, 0x0, 0xff, 0xe2, 0xd3, 0x0, + 0x7f, 0xf1, 0x66, 0x0, 0x3f, 0xf8, 0xaf, 0x20, + 0x1f, 0xfc, 0x56, 0xa0, 0xf, 0xfe, 0x2a, 0xd8, + 0x7, 0xff, 0x15, 0x30, 0x3, 0xff, 0x8a, 0x60, + 0x1f, 0xff, 0xa1, 0xc0, 0xf, 0xfe, 0x18, 0xe1, + 0x80, 0x7f, 0xf0, 0x8b, 0x8, 0x3, 0xff, 0x84, + 0x58, 0x40, 0x1f, 0xfc, 0x23, 0xc1, 0x0, 0xff, + 0xe1, 0x26, 0x8, 0x7, 0xff, 0x9, 0x6c, 0x3, + 0xff, 0x86, 0xd4, 0x1, 0xff, 0x78, 0x4, 0xf2, + 0x1, 0xff, 0xc0, 0x63, 0x9, 0x80, 0xf, 0xe3, + 0x0, 0x10, 0xe7, 0xb0, 0x7, 0xfb, 0x3f, 0xda, + + /* U+F052 "ï’" */ + 0x0, 0xff, 0x86, 0x69, 0x40, 0x3f, 0xf9, 0x23, + 0xec, 0xb5, 0x0, 0x1f, 0xfc, 0x71, 0xc1, 0x0, + 0x9d, 0x80, 0x3f, 0xf8, 0xda, 0x40, 0x1d, 0x2a, + 0x1, 0xff, 0xc4, 0xb3, 0x0, 0xfa, 0x90, 0x3, + 0xff, 0x85, 0x48, 0x1, 0xfd, 0x66, 0x1, 0xff, + 0xc0, 0x95, 0x0, 0xff, 0xb4, 0x80, 0x3f, 0xd0, + 0xc0, 0x1f, 0xfc, 0x1, 0xc1, 0x0, 0xfc, 0xce, + 0x1, 0xff, 0xc2, 0x1c, 0x10, 0xf, 0x2c, 0x80, + 0x7f, 0xf1, 0xb, 0x40, 0x39, 0x28, 0x3, 0xff, + 0x8c, 0x76, 0x1, 0x1d, 0x80, 0x7f, 0xf2, 0x12, + 0x80, 0x1e, 0x1, 0xff, 0xca, 0x55, 0x1, 0x80, + 0x7f, 0xf2, 0xc8, 0x14, 0x3, 0xff, 0x96, 0x81, + 0x68, 0x1, 0xff, 0xc8, 0x19, 0x30, 0x1b, 0xff, + 0xff, 0xe4, 0x73, 0x0, 0x7f, 0xf4, 0x1b, 0xff, + 0xff, 0x95, 0xa2, 0x12, 0x1, 0xff, 0xca, 0x26, + 0x0, 0xff, 0xe6, 0xf8, 0x7, 0xff, 0xa4, 0x40, + 0x3f, 0xf9, 0x7c, 0x16, 0x20, 0x1f, 0xfc, 0x94, + 0x60, + + /* U+F053 "ï“" */ + 0x0, 0xff, 0x8e, 0x4c, 0x3, 0xff, 0x80, 0x98, + 0xd8, 0x60, 0x1f, 0xe4, 0xb0, 0xb, 0x40, 0x3f, + 0x92, 0xc0, 0x31, 0x0, 0x7e, 0x4b, 0x0, 0xc5, + 0xa0, 0x1f, 0x25, 0x80, 0x62, 0xc1, 0x0, 0xf2, + 0x58, 0x6, 0x2c, 0x10, 0xf, 0x25, 0x80, 0x62, + 0xc1, 0x0, 0xf2, 0x58, 0x6, 0x2c, 0x10, 0xf, + 0x25, 0x80, 0x62, 0xc1, 0x0, 0xf2, 0x58, 0x6, + 0x2c, 0x10, 0xf, 0x1d, 0x80, 0x62, 0xc1, 0x0, + 0xf9, 0x0, 0x3a, 0x84, 0x3, 0xf3, 0xa0, 0x6, + 0x86, 0x0, 0xfe, 0xb4, 0x0, 0xd2, 0xc0, 0x1f, + 0xd6, 0x80, 0x1a, 0x58, 0x3, 0xfa, 0xd0, 0x3, + 0x4b, 0x0, 0x7f, 0x5a, 0x0, 0x69, 0x60, 0xf, + 0xeb, 0x30, 0xd, 0x2c, 0x1, 0xfd, 0x86, 0x1, + 0xa5, 0x80, 0x3f, 0xb0, 0xc0, 0x34, 0xb0, 0x7, + 0xf6, 0x18, 0x6, 0x90, 0xf, 0xf6, 0x18, 0x4, + 0xa0, 0x1f, 0xf6, 0x20, 0x2d, 0x0, 0x7f, 0xf0, + 0x2f, 0x68, 0x0, + + /* U+F054 "ï”" */ + 0x0, 0x3c, 0x0, 0x7f, 0xf0, 0x6a, 0x1e, 0xc0, + 0x3f, 0xe6, 0x50, 0x2, 0x58, 0x7, 0xf8, 0x80, + 0x32, 0x58, 0x7, 0xf2, 0x40, 0x6, 0x4b, 0x0, + 0xfe, 0x78, 0x0, 0xc9, 0x60, 0x1f, 0xcf, 0x0, + 0x19, 0x2c, 0x3, 0xf9, 0xe0, 0x3, 0x25, 0x80, + 0x7f, 0x3c, 0x0, 0x64, 0xb0, 0xf, 0xe7, 0x80, + 0xc, 0x96, 0x1, 0xfc, 0xf0, 0x1, 0x92, 0xc0, + 0x3f, 0x9e, 0x0, 0x32, 0x50, 0x7, 0xf3, 0x8, + 0x6, 0x50, 0xf, 0xc3, 0xa2, 0x1, 0xa8, 0x3, + 0xe1, 0xd3, 0x0, 0xd4, 0xa0, 0x1e, 0x1d, 0x30, + 0xd, 0x4a, 0x1, 0xe1, 0xd3, 0x0, 0xd4, 0xa0, + 0x1e, 0x1d, 0x30, 0xd, 0x4a, 0x1, 0xe1, 0xd3, + 0x0, 0xd4, 0xa0, 0x1e, 0x1c, 0x30, 0xd, 0x4a, + 0x1, 0xe1, 0xc2, 0x0, 0xd4, 0xa0, 0x1f, 0x31, + 0x0, 0x6a, 0x50, 0xf, 0xca, 0x1, 0xa9, 0x40, + 0x3f, 0x8b, 0x0, 0x14, 0xa0, 0x1f, 0xf1, 0xf7, + 0x14, 0x3, 0xfe, + + /* U+F067 "ï§" */ + 0x0, 0xff, 0x2d, 0x52, 0x4, 0x3, 0xff, 0x8e, + 0x74, 0xaa, 0x7a, 0x0, 0xff, 0xe3, 0xb0, 0x6, + 0x60, 0xf, 0xfe, 0x39, 0x80, 0x63, 0x0, 0xff, + 0xff, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xcd, 0xff, + 0xfa, 0x40, 0x30, 0xff, 0xfe, 0xc1, 0x90, 0xf, + 0xfe, 0x51, 0xb0, 0x7, 0xff, 0x33, 0xc0, 0x3f, + 0xf9, 0x9e, 0xc0, 0x1f, 0xfc, 0xa1, 0x59, 0xdc, + 0xcf, 0x9c, 0x3, 0xe, 0x67, 0xef, 0x20, 0x23, + 0x3f, 0xb8, 0x3, 0x8c, 0xff, 0x8, 0x7, 0xff, + 0xfc, 0x3, 0xff, 0xfe, 0x1, 0xfe, 0x20, 0xc, + 0x40, 0x1f, 0xfc, 0x74, 0x72, 0x21, 0xf8, 0x7, + 0xf8, + + /* U+F068 "ï¨" */ + 0x1, 0x22, 0xff, 0xe4, 0x8, 0x2, 0x3b, 0x77, + 0xff, 0x91, 0xdc, 0x17, 0x0, 0xff, 0xe5, 0xb, + 0x0, 0x7f, 0xf3, 0x3c, 0x3, 0xff, 0x99, 0xf0, + 0x1, 0xff, 0xca, 0x16, 0x7e, 0xdd, 0xff, 0xe4, + 0x77, 0x4, + + /* U+F06E "ï®" */ + 0x0, 0xff, 0x13, 0x56, 0xf7, 0xfb, 0xb2, 0x54, + 0x3, 0xff, 0x8e, 0xb9, 0xb2, 0xa4, 0x20, 0x1, + 0x36, 0xaf, 0xa2, 0x0, 0xff, 0xe1, 0x1e, 0x51, + 0x80, 0x64, 0x54, 0x20, 0xc, 0xbb, 0x22, 0x1, + 0xff, 0x46, 0x18, 0x4, 0x55, 0xf7, 0x57, 0xbc, + 0xe0, 0x19, 0xbd, 0x0, 0x3f, 0xad, 0xc0, 0x32, + 0xea, 0x80, 0x70, 0xc6, 0x8, 0x4, 0x36, 0xc0, + 0x1f, 0x62, 0x0, 0x64, 0xa0, 0x8, 0xe6, 0x4a, + 0x0, 0x3c, 0x10, 0xd, 0x2e, 0x1, 0xd4, 0x60, + 0x18, 0x6c, 0x3, 0x99, 0x95, 0xa4, 0x5, 0x60, + 0x1d, 0xa, 0x1, 0x3a, 0x80, 0x74, 0x80, 0x7f, + 0x16, 0x8, 0x29, 0x0, 0x75, 0x10, 0x14, 0x0, + 0x79, 0x40, 0x3a, 0x40, 0x30, 0xc8, 0x1, 0x40, + 0x3d, 0xc1, 0x20, 0x1f, 0x10, 0x24, 0x35, 0xa8, + 0x7, 0x28, 0x3, 0x40, 0x3c, 0x6a, 0x80, 0x1e, + 0x10, 0x1, 0xbc, 0xa0, 0x7, 0x88, 0x0, 0x20, + 0x1f, 0x62, 0x0, 0x78, 0x40, 0x2, 0x1, 0xfc, + 0x20, 0x1, 0x0, 0xfb, 0x28, 0x3, 0xe2, 0x7, + 0x0, 0xfe, 0x70, 0x6, 0x80, 0x78, 0xd4, 0x64, + 0x3, 0xca, 0x2, 0xe0, 0x1f, 0xac, 0x0, 0xa0, + 0x1e, 0xe0, 0x3, 0x28, 0x7, 0x48, 0x2, 0x14, + 0x3, 0xd6, 0x40, 0xa4, 0x1, 0xd4, 0x40, 0x15, + 0x20, 0x6, 0x1b, 0x0, 0x55, 0xa9, 0x1b, 0xf2, + 0x1, 0x58, 0x7, 0x42, 0x80, 0x75, 0xa0, 0x6, + 0x4a, 0x0, 0x25, 0x6e, 0x40, 0x81, 0xe0, 0x80, + 0x69, 0x70, 0xf, 0xae, 0x0, 0x32, 0xea, 0x80, + 0x70, 0xc6, 0x8, 0x4, 0x36, 0xc0, 0x1f, 0xcf, + 0x86, 0x1, 0x15, 0x7d, 0xd5, 0x33, 0x9c, 0x3, + 0x37, 0xa0, 0x7, 0xfc, 0x79, 0x66, 0x1, 0x91, + 0x54, 0x60, 0x19, 0x76, 0x44, 0x3, 0xff, 0x84, + 0x99, 0xb2, 0xa4, 0x1, 0x9, 0xb5, 0x7d, 0x10, + 0x7, 0xe0, + + /* U+F070 "ï°" */ + 0x4, 0x40, 0x7, 0xff, 0x51, 0x2e, 0xd0, 0x1, + 0xff, 0xd3, 0xa0, 0x3, 0xe0, 0x80, 0x7f, 0xf4, + 0x58, 0x2, 0x3f, 0x30, 0xf, 0xfe, 0x84, 0x50, + 0x4, 0x38, 0xe0, 0x18, 0x9a, 0xb7, 0xfd, 0xdb, + 0x6e, 0x60, 0x1f, 0xfc, 0x15, 0xd2, 0x0, 0xa2, + 0x85, 0xb7, 0x52, 0xa4, 0x0, 0x12, 0x48, 0xcd, + 0x70, 0xf, 0xfe, 0x1, 0x6a, 0x80, 0x4b, 0xd2, + 0x40, 0x19, 0x15, 0x4, 0x2, 0x28, 0xe6, 0x0, + 0xff, 0xe0, 0x54, 0x0, 0x7c, 0x75, 0xf7, 0x57, + 0xd8, 0x80, 0x10, 0xcd, 0x88, 0x7, 0xfc, 0xf8, + 0x20, 0x18, 0xb1, 0x40, 0x38, 0xee, 0x0, 0x32, + 0x79, 0x0, 0x7f, 0xc7, 0xe8, 0x1, 0x16, 0x8, + 0x35, 0xd2, 0x80, 0x1e, 0x0, 0x30, 0xe1, 0x0, + 0x7f, 0xc3, 0x6e, 0x1, 0x1f, 0xa0, 0xa2, 0xd6, + 0x8, 0x3a, 0x0, 0x61, 0xf1, 0x0, 0xf5, 0x69, + 0x0, 0x51, 0x60, 0x10, 0xdd, 0x80, 0x23, 0xd0, + 0x4, 0x0, 0x71, 0x50, 0x7, 0x2a, 0x8b, 0x54, + 0x2, 0x4d, 0x20, 0x8, 0xc0, 0x31, 0xa8, 0x18, + 0x80, 0x72, 0x28, 0x6, 0xb0, 0xa, 0xa4, 0x2, + 0x2d, 0x50, 0xf, 0xde, 0x0, 0x50, 0xf, 0x58, + 0x4, 0x42, 0x1, 0x9b, 0x8, 0x2, 0xa9, 0x0, + 0xf8, 0x40, 0x2, 0x1, 0xe1, 0x20, 0x1, 0x8, + 0x7, 0x1f, 0x0, 0x66, 0xc1, 0x0, 0xe1, 0x0, + 0x30, 0x7, 0x84, 0x80, 0x2b, 0x0, 0xf1, 0x80, + 0x71, 0xfa, 0x0, 0x67, 0x20, 0x20, 0xf, 0x58, + 0x6, 0x54, 0x0, 0xf2, 0x0, 0x70, 0xdc, 0x0, + 0x45, 0xb0, 0x20, 0x1c, 0xca, 0x1, 0xd6, 0x40, + 0x1d, 0x0, 0x1f, 0x3d, 0x88, 0x4, 0xe0, 0x1c, + 0x72, 0x1, 0xf7, 0x88, 0x6, 0x38, 0x0, 0xf9, + 0x3c, 0xc0, 0x3e, 0x1d, 0x0, 0xfc, 0x58, 0x40, + 0x19, 0xdc, 0x1, 0xf0, 0xe3, 0x0, 0x70, 0xe0, + 0x80, 0x7f, 0x16, 0x20, 0x6, 0x8c, 0x40, 0xf, + 0xa6, 0x80, 0x30, 0xa0, 0x7, 0xfc, 0x37, 0x22, + 0x1, 0x1d, 0xf5, 0xd5, 0xa8, 0x4, 0xba, 0x40, + 0x14, 0xd0, 0x7, 0xff, 0x1, 0xba, 0x8, 0x2, + 0x14, 0x54, 0xa8, 0x0, 0x8b, 0x54, 0x2, 0x5d, + 0x20, 0xf, 0xfe, 0x3, 0xee, 0x42, 0x10, 0x80, + 0x8, 0xd0, 0x3, 0x54, 0x0, 0x45, 0xaa, 0x1, + 0xff, 0xc1, 0x37, 0xbd, 0xef, 0xf6, 0xda, 0x0, + 0x73, 0xe0, 0x80, 0x55, 0x0, 0x1f, 0xfd, 0x3, + 0xf3, 0x0, 0x98, 0x3, 0xff, 0xa2, 0x38, 0xe0, + 0xa, 0x0, 0xff, 0xe9, 0xc5, 0xd9, 0x0, + + /* U+F071 "ï±" */ + 0x0, 0xff, 0xe1, 0xa4, 0x38, 0x80, 0x7f, 0xf4, + 0x16, 0xde, 0x30, 0x3, 0xff, 0x9e, 0x36, 0x1, + 0x13, 0x80, 0x7f, 0xf3, 0xa4, 0x40, 0x34, 0x8, + 0x7, 0xff, 0x30, 0x9c, 0x3, 0xd6, 0x1, 0xff, + 0xcc, 0x90, 0xf, 0x94, 0xc0, 0x3f, 0xf9, 0x48, + 0x80, 0xf, 0xde, 0x1, 0xff, 0xca, 0x90, 0xf, + 0xe3, 0x50, 0xf, 0xfe, 0x43, 0x10, 0x7, 0xfa, + 0xc0, 0x3f, 0xf8, 0xe3, 0x0, 0x1f, 0xf0, 0xc0, + 0x7, 0xff, 0x1a, 0x4, 0x2, 0x7f, 0xfb, 0x84, + 0x2, 0x71, 0x0, 0xff, 0xe2, 0x13, 0x0, 0x6e, + 0x0, 0x84, 0x3, 0xac, 0x3, 0xff, 0x89, 0x20, + 0x1c, 0x20, 0x18, 0x40, 0x32, 0x98, 0x7, 0xff, + 0x9, 0x10, 0x1, 0xde, 0x1, 0xfe, 0xf0, 0xf, + 0xfe, 0x14, 0x80, 0x7f, 0xf1, 0x4d, 0x40, 0x3f, + 0xf8, 0xe, 0x40, 0x1e, 0x10, 0x8, 0x40, 0x3e, + 0xb0, 0xf, 0xf8, 0x60, 0x3, 0xe3, 0x0, 0x8c, + 0x3, 0xe1, 0x80, 0xf, 0xf4, 0x0, 0x7e, 0x10, + 0x8, 0x40, 0x3f, 0x38, 0x80, 0x7e, 0x26, 0x0, + 0xfc, 0xc2, 0x0, 0x50, 0xf, 0xeb, 0x0, 0xfd, + 0x20, 0x1f, 0xc5, 0xdf, 0xe9, 0x0, 0xfe, 0x53, + 0x0, 0xf2, 0xa0, 0x7, 0xfa, 0xbf, 0x90, 0x3, + 0xfd, 0xe0, 0x1e, 0x80, 0xf, 0xf4, 0x28, 0xd, + 0x88, 0x7, 0xf1, 0xb0, 0x6, 0x72, 0x0, 0xff, + 0x18, 0x6, 0x20, 0xf, 0xf4, 0x0, 0x43, 0x0, + 0x1f, 0xf6, 0x0, 0x42, 0x60, 0x1f, 0xe1, 0x80, + 0x4, 0x0, 0x7f, 0xf0, 0x1d, 0x84, 0xf4, 0x3, + 0xff, 0x80, 0xe2, 0xc, 0x1, 0xff, 0xc1, 0x9e, + 0xc3, 0x0, 0xff, 0xe0, 0xb0, 0x8, 0x7, 0xff, + 0x48, 0x42, 0x40, 0x3f, 0xfa, 0x22, 0xc0, 0xf6, + 0xec, 0xdf, 0xfc, 0xd7, 0x8f, 0x0, + + /* U+F074 "ï´" */ + 0x0, 0xff, 0xe4, 0xb5, 0x10, 0x7, 0xff, 0x36, + 0x57, 0xc, 0x3, 0xff, 0x9c, 0x3a, 0x60, 0x2, + 0x44, 0xe3, 0x0, 0xff, 0x12, 0x24, 0x1, 0xe, + 0x98, 0x6d, 0xdf, 0x65, 0x80, 0x7e, 0x3d, 0xbb, + 0x80, 0x30, 0xe9, 0x80, 0x7c, 0x94, 0x1, 0xe3, + 0xc0, 0xf, 0xe1, 0xd0, 0xf, 0xcb, 0x20, 0x18, + 0xb4, 0x3, 0xfe, 0x30, 0xf, 0xe6, 0x80, 0x0, + 0xe0, 0x80, 0x7f, 0x8b, 0x3b, 0x77, 0x48, 0x6, + 0x20, 0x1c, 0x10, 0x8, 0xb7, 0x40, 0x18, 0xb0, + 0x44, 0x45, 0x9a, 0x0, 0x9, 0x43, 0x84, 0x1, + 0x16, 0x11, 0x0, 0x22, 0xc1, 0x0, 0xf9, 0xdc, + 0x76, 0x1a, 0x40, 0x10, 0xf8, 0x80, 0x4, 0xb, + 0x4, 0x3, 0xfa, 0x30, 0x2c, 0xc0, 0x21, 0xc2, + 0x0, 0xa9, 0xf0, 0x40, 0x3f, 0xf8, 0x14, 0x80, + 0x1b, 0x48, 0x3, 0x24, 0x8, 0x7, 0xff, 0x2, + 0x54, 0x3, 0x59, 0x80, 0x72, 0x40, 0x80, 0x7f, + 0xd0, 0xc0, 0x1a, 0x91, 0x78, 0x80, 0x2a, 0x7f, + 0x20, 0xf, 0xe7, 0x70, 0x6, 0x95, 0x4a, 0x1f, + 0x10, 0x0, 0x80, 0xe1, 0x0, 0x4, 0x8b, 0x34, + 0x0, 0x68, 0x63, 0xb0, 0x1, 0x61, 0x10, 0x2, + 0x1c, 0x20, 0xed, 0xdd, 0x20, 0x19, 0xdc, 0x4, + 0x20, 0x11, 0x6e, 0x80, 0x30, 0xe1, 0x0, 0x7f, + 0x34, 0x0, 0x7, 0x4, 0x3, 0xfc, 0x3e, 0x1, + 0xf9, 0x64, 0x3, 0x16, 0x80, 0x7f, 0xf1, 0xd2, + 0x80, 0x3c, 0x78, 0x1, 0xfc, 0x3f, 0xb7, 0x7d, + 0x96, 0x1, 0xf8, 0xf6, 0xee, 0x0, 0xc3, 0x84, + 0x44, 0x4e, 0x30, 0xf, 0xf1, 0x22, 0x40, 0x10, + 0xe9, 0x0, 0x7f, 0xf3, 0x7, 0x4c, 0x3, 0xff, + 0x97, 0x2b, 0x86, 0x1, 0x0, + + /* U+F077 "ï·" */ + 0x0, 0xff, 0x9e, 0xc8, 0x3, 0xff, 0x93, 0x10, + 0x4c, 0x20, 0xf, 0xfe, 0x3c, 0x38, 0x0, 0x70, + 0x80, 0x3f, 0xf8, 0xb0, 0xe0, 0x18, 0x70, 0x80, + 0x3f, 0xf8, 0x70, 0xe0, 0x1e, 0x1c, 0x20, 0xf, + 0xfe, 0xc, 0x38, 0x7, 0xe1, 0xc2, 0x0, 0xff, + 0xa1, 0xc0, 0x32, 0xe0, 0x6, 0x1c, 0x20, 0xf, + 0xe8, 0x70, 0xc, 0xb4, 0x78, 0x1, 0x87, 0x8, + 0x3, 0xe8, 0x70, 0xc, 0xb4, 0x0, 0x3c, 0x0, + 0xc3, 0x84, 0x1, 0xd0, 0xe0, 0x19, 0x68, 0x3, + 0x1e, 0x0, 0x61, 0xc2, 0x0, 0xa1, 0xc0, 0x32, + 0xd0, 0x7, 0x8f, 0x0, 0x30, 0xe1, 0x3, 0x38, + 0x6, 0x5a, 0x0, 0xfc, 0x78, 0x1, 0x87, 0x3, + 0xc0, 0x32, 0xd0, 0x7, 0xf8, 0xf0, 0x3, 0x8, + 0xa0, 0x80, 0xb, 0x40, 0x1f, 0xfc, 0x3, 0xc0, + 0xa, 0x44, 0x58, 0xaf, 0x40, 0x1f, 0xfc, 0x23, + 0xc4, 0xa6, 0x0, + + /* U+F078 "ï¸" */ + 0x1, 0xa8, 0x0, 0xff, 0xe2, 0x1d, 0xb0, 0x0, + 0x71, 0x5e, 0x80, 0x3f, 0xf8, 0x47, 0x89, 0x2c, + 0x10, 0x40, 0x5, 0xa0, 0xf, 0xfe, 0x1, 0xe0, + 0x5, 0x23, 0xe0, 0x19, 0x68, 0x3, 0xfc, 0x78, + 0x1, 0x88, 0x59, 0xc0, 0x32, 0xd0, 0x7, 0xe3, + 0xc0, 0xc, 0x3e, 0x0, 0x87, 0x0, 0xcb, 0x40, + 0x1e, 0x3c, 0x0, 0xc3, 0x84, 0x1, 0x43, 0x80, + 0x65, 0xa0, 0xc, 0x78, 0x1, 0x87, 0x8, 0x3, + 0xa1, 0xc0, 0x32, 0xd0, 0x0, 0xf0, 0x3, 0xe, + 0x10, 0x7, 0xd0, 0xe0, 0x19, 0x68, 0xf0, 0x3, + 0xe, 0x10, 0x7, 0xf4, 0x38, 0x6, 0x5c, 0x0, + 0xc3, 0x84, 0x1, 0xff, 0x43, 0x80, 0x7e, 0x1c, + 0x20, 0xf, 0xfe, 0xc, 0x38, 0x7, 0x87, 0x8, + 0x3, 0xff, 0x87, 0xe, 0x1, 0x87, 0x8, 0x3, + 0xff, 0x8b, 0xe, 0x0, 0x1c, 0x20, 0xf, 0xfe, + 0x3c, 0x4a, 0xe1, 0x0, 0x7f, 0x80, + + /* U+F079 "ï¹" */ + 0x0, 0xf2, 0x10, 0x7, 0xff, 0x52, 0x6f, 0x50, + 0x3, 0xff, 0xa5, 0x2c, 0x0, 0xb4, 0x0, 0xca, + 0xef, 0xff, 0xc1, 0x60, 0xf, 0xe9, 0x60, 0xd, + 0x68, 0x0, 0x4a, 0x88, 0xff, 0xe0, 0xcb, 0x80, + 0x7d, 0x2c, 0x1, 0xeb, 0x40, 0x60, 0xf, 0xfe, + 0x1f, 0x0, 0x7a, 0x58, 0x3, 0xf5, 0xa1, 0x58, + 0x7, 0xff, 0x22, 0x58, 0x3, 0xc2, 0x1, 0x5a, + 0x23, 0xff, 0xfe, 0x10, 0xf, 0xcc, 0x1, 0x58, + 0x80, 0x1d, 0x80, 0x2d, 0x0, 0xff, 0xe4, 0xc0, + 0x2, 0x90, 0x3, 0x4a, 0x80, 0xd8, 0x7, 0xff, + 0x25, 0xf3, 0x54, 0x3, 0xd5, 0x7e, 0x40, 0x1f, + 0xfc, 0xa3, 0x20, 0xf, 0xc8, 0x20, 0x1f, 0xff, + 0xf0, 0xf, 0xfe, 0xd0, 0xcc, 0x0, 0x7c, 0x54, + 0xe0, 0x1f, 0xfc, 0xad, 0x67, 0xa0, 0xe, 0x2c, + 0x58, 0x60, 0xf, 0xfe, 0x49, 0x0, 0x16, 0x40, + 0x23, 0xf1, 0x0, 0x78, 0x7, 0xe5, 0x77, 0xff, + 0x18, 0x50, 0x4, 0xc2, 0x0, 0x52, 0x0, 0x1c, + 0x0, 0x7e, 0x38, 0x8f, 0xf6, 0x2a, 0x58, 0x7, + 0xf1, 0xe8, 0x80, 0x7f, 0xf2, 0x28, 0x12, 0xc0, + 0x3e, 0x3d, 0x10, 0xf, 0x38, 0x7, 0xff, 0x9, + 0x40, 0x9, 0x80, 0x1c, 0x7a, 0x20, 0x1f, 0x4f, + 0xff, 0xff, 0xa, 0x80, 0x23, 0xc0, 0x8, 0xf4, + 0x40, 0x3f, 0xfa, 0x7, 0x84, 0x98, 0x20, 0x18, + + /* U+F07B "ï»" */ + 0x1b, 0xff, 0xfe, 0xc1, 0x0, 0xff, 0xe1, 0xd2, + 0x0, 0x7f, 0x1e, 0x88, 0x7, 0xff, 0x9, 0x0, + 0x3f, 0xe3, 0xd1, 0x0, 0xff, 0xe7, 0x1e, 0x44, + 0x7f, 0x9c, 0xc0, 0x3f, 0xf8, 0x64, 0xef, 0xfe, + 0x8c, 0x50, 0xf, 0xfe, 0x7d, 0x80, 0x7f, 0xf3, + 0xc4, 0x3, 0xff, 0xfe, 0x1, 0xff, 0xff, 0x0, + 0xff, 0xff, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xfb, + 0x8, 0x1, 0xff, 0xce, 0x4a, 0x40, 0xf, 0xfe, + 0x62, 0x50, + + /* U+F093 "ï‚“" */ + 0x0, 0xff, 0xe0, 0x98, 0x80, 0x7f, 0xf3, 0x5f, + 0x3c, 0x80, 0x3f, 0xf9, 0x6f, 0x0, 0x38, 0x40, + 0x1f, 0xfc, 0x97, 0x80, 0x8, 0x70, 0x80, 0x3f, + 0xf8, 0xef, 0x0, 0x1c, 0x38, 0x40, 0x1f, 0xfc, + 0x57, 0x80, 0xf, 0x87, 0x8, 0x3, 0xff, 0x86, + 0xf0, 0x1, 0xfc, 0x38, 0x40, 0x1f, 0xfc, 0x17, + 0x80, 0xf, 0xf8, 0x70, 0x80, 0x3f, 0xe7, 0x80, + 0xf, 0xfe, 0x8, 0xe1, 0x0, 0x7f, 0x2c, 0x0, + 0x7f, 0xf0, 0xc7, 0x0, 0x3f, 0x8c, 0x3, 0xff, + 0x8a, 0x20, 0x1f, 0xcd, 0xbb, 0xc6, 0x1, 0xe9, + 0xdd, 0xdc, 0x1, 0xfe, 0x22, 0xe7, 0x0, 0xf1, + 0x17, 0x8, 0x7, 0xff, 0xfc, 0x3, 0xff, 0xfe, + 0x1, 0xff, 0xcc, 0x11, 0xf8, 0x3, 0xff, 0x80, + 0x23, 0xf0, 0x5f, 0x77, 0xd8, 0x2, 0x1, 0xe7, + 0xc, 0xee, 0xfa, 0xd0, 0x3, 0xe3, 0x1b, 0x76, + 0x6d, 0x26, 0x26, 0x1, 0xf2, 0x0, 0x7f, 0x68, + 0x44, 0xce, 0x61, 0xd0, 0xf, 0xfe, 0x31, 0xf6, + 0x67, 0xb8, 0xc0, 0x3f, 0xf9, 0x6, 0x7e, 0x0, + 0xff, 0xe9, 0x5f, 0xa, 0x7b, 0x80, 0x7f, 0xf2, + 0x84, 0xc1, 0xc4, 0x3, 0x8, 0x7, 0xff, 0x1a, + 0xb4, 0x4f, 0x9c, 0x0, 0x3b, 0xe, 0xff, 0xfc, + 0xc8, 0xd0, + + /* U+F095 "ï‚•" */ + 0x0, 0xff, 0xe4, 0xb3, 0x8, 0x3, 0xff, 0x9a, + 0x93, 0x2d, 0xeb, 0x73, 0x0, 0xff, 0xe4, 0xf8, + 0x4, 0x29, 0x19, 0x80, 0xf, 0xfe, 0x39, 0x20, + 0x7, 0xc6, 0x1, 0xff, 0xc7, 0xb0, 0xf, 0xc2, + 0x1, 0xff, 0xc6, 0x16, 0x0, 0xff, 0xe7, 0xb0, + 0x7, 0xf1, 0x0, 0x7f, 0xf1, 0xa8, 0x3, 0xf9, + 0x80, 0x3f, 0xf8, 0xcc, 0x1, 0xfd, 0xa0, 0x1f, + 0xfc, 0x6b, 0x40, 0xf, 0xc8, 0x1, 0xff, 0xc7, + 0xb7, 0x0, 0xf8, 0xc0, 0x3f, 0xf9, 0x11, 0x0, + 0xe, 0x60, 0xf, 0xfe, 0x56, 0x80, 0x76, 0x80, + 0x7f, 0xf2, 0x4d, 0x40, 0x31, 0x20, 0x7, 0xff, + 0x27, 0xc0, 0x3a, 0x0, 0x3f, 0xf9, 0x32, 0x60, + 0x18, 0xd4, 0x3, 0xff, 0x90, 0xcc, 0x0, 0xef, + 0x0, 0xff, 0x13, 0x8, 0x7, 0xcb, 0x20, 0x1c, + 0xe6, 0x1, 0xf9, 0x2f, 0x67, 0x40, 0x3c, 0xd4, + 0x1, 0xc7, 0x0, 0x1f, 0x36, 0xda, 0x0, 0xe, + 0x80, 0x35, 0x48, 0x7, 0xe, 0x80, 0x79, 0xfe, + 0x48, 0x3, 0x95, 0xc1, 0x79, 0x40, 0x38, 0x70, + 0x40, 0x3d, 0x0, 0x1f, 0xd1, 0xb4, 0x20, 0x1c, + 0x38, 0x40, 0x1f, 0x18, 0x7, 0xf8, 0x80, 0x3c, + 0x58, 0x40, 0x1f, 0x90, 0x3, 0xff, 0x88, 0xba, + 0x40, 0x1f, 0xd8, 0x1, 0xff, 0xc2, 0x19, 0xa0, + 0xf, 0xf9, 0x40, 0x3f, 0xf8, 0x2d, 0xec, 0x1, + 0xff, 0xc0, 0x12, 0x0, 0xfe, 0x16, 0xe9, 0x10, + 0xf, 0xfe, 0x12, 0x0, 0x78, 0x9a, 0xfa, 0x44, + 0x3, 0xff, 0x89, 0x11, 0x4d, 0x67, 0xec, 0xa0, + 0x7, 0xff, 0x14, + + /* U+F0C4 "" */ + 0x0, 0x96, 0x64, 0xe4, 0x1, 0xff, 0xc6, 0x2d, + 0xa6, 0x64, 0x6b, 0x80, 0x7f, 0xb, 0xdd, 0xa0, + 0x40, 0x70, 0x80, 0x3a, 0x1c, 0x3, 0xe2, 0xf8, + 0x44, 0x3f, 0x9c, 0x88, 0x4, 0x20, 0x14, 0x8, + 0x7, 0x16, 0x8, 0x6, 0x17, 0x50, 0x0, 0xf7, + 0x20, 0x2, 0x40, 0xc, 0x58, 0x20, 0x1d, 0x48, + 0x40, 0x6, 0x10, 0x70, 0x8, 0x80, 0x22, 0xc1, + 0x0, 0xea, 0x50, 0x10, 0x2, 0x0, 0x10, 0x2, + 0x10, 0x1, 0x60, 0x80, 0x75, 0x28, 0x1, 0x0, + 0x7, 0xb7, 0x60, 0x8, 0x80, 0xf0, 0x40, 0x3a, + 0x94, 0x2, 0x80, 0x8, 0x90, 0x3, 0x52, 0xe8, + 0x80, 0x75, 0x28, 0x6, 0x2b, 0x0, 0xfc, 0x34, + 0x20, 0x1d, 0x4a, 0x1, 0xe4, 0xe7, 0x32, 0x0, + 0xff, 0xa9, 0x40, 0x3f, 0xc, 0x66, 0xd0, 0x7, + 0xf5, 0x28, 0x7, 0xff, 0x5, 0x60, 0x3, 0xe8, + 0x50, 0xf, 0xfe, 0x11, 0xc8, 0x7, 0xd2, 0x40, + 0x1f, 0xf2, 0xcc, 0xb4, 0x40, 0x3e, 0x1c, 0x20, + 0xf, 0xc5, 0xb4, 0xcc, 0x10, 0xf, 0xe1, 0xc2, + 0x0, 0xf0, 0xe1, 0x0, 0x7e, 0x60, 0xe, 0x1c, + 0x20, 0xe, 0x91, 0x0, 0x84, 0x3, 0x4c, 0xa8, + 0x3, 0x87, 0x8, 0x3, 0x28, 0x0, 0x7b, 0x90, + 0x1, 0x18, 0x2d, 0x0, 0x70, 0xe1, 0x0, 0x44, + 0x0, 0x61, 0x7, 0x0, 0x88, 0x0, 0xb4, 0x1, + 0xc3, 0x84, 0x0, 0x10, 0x2, 0x0, 0x10, 0x2, + 0x10, 0x9, 0x68, 0x3, 0x87, 0x8, 0x10, 0x0, + 0x7b, 0x76, 0x0, 0x90, 0x3, 0x2d, 0x0, 0x70, + 0xe1, 0x40, 0x4, 0x48, 0x1, 0x31, 0x0, 0x72, + 0xd8, 0x7, 0xb, 0x15, 0x80, 0x79, 0x24, 0x3, + 0xe4, 0xc4, 0x10, 0x4c, 0x40, 0x4e, 0x73, 0x24, + 0xab, 0x0, 0xfe, 0x3b, 0xef, 0xb3, 0x0, + + /* U+F0C5 "" */ + 0x0, 0xf8, 0x51, 0x3f, 0x88, 0xc, 0x3, 0xff, + 0x81, 0x97, 0x7f, 0xd4, 0x1b, 0x60, 0x1f, 0xf1, + 0x0, 0x7f, 0xf0, 0x12, 0xc0, 0x3f, 0xf9, 0x89, + 0x60, 0x1f, 0xfc, 0xc4, 0xb0, 0xf, 0xfe, 0x62, + 0x22, 0xbf, 0xf2, 0x0, 0x7f, 0xc4, 0x1d, 0xff, + 0x91, 0x40, 0x3f, 0xf8, 0x8b, 0x97, 0x7c, 0x60, + 0x1f, 0xfc, 0x63, 0x44, 0xe6, 0x0, 0xff, 0xff, + 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xff, 0xe0, 0x1f, + 0xff, 0xf0, 0xf, 0xfe, 0x90, 0x82, 0x80, 0x7f, + 0xf0, 0xc5, 0x0, 0x3b, 0x82, 0xbf, 0xff, 0xf8, + 0x7c, 0x20, 0x1c, 0x94, 0x40, 0x1f, 0xfc, 0xb5, + 0xdf, 0xff, 0xe8, 0x0, 0xff, 0xea, 0x8, 0x7, + 0xff, 0x13, 0x80, 0x3e, 0xd8, 0x77, 0xff, 0xe1, + 0x4b, 0x0, 0x7c, + + /* U+F0C7 "" */ + 0x4, 0x88, 0xff, 0xe1, 0xb9, 0x0, 0x79, 0xad, + 0xdf, 0xff, 0x87, 0x1a, 0x80, 0x1d, 0x0, 0x1f, + 0xfc, 0x6b, 0x40, 0xc, 0x20, 0x1f, 0xfc, 0x7b, + 0x40, 0xf, 0x37, 0xff, 0xff, 0x4, 0x80, 0x2b, + 0x40, 0xe, 0x10, 0xf, 0xfe, 0xb, 0x0, 0x6b, + 0x30, 0xf, 0xfe, 0x66, 0x80, 0x7f, 0xf3, 0x4, + 0xc0, 0x3f, 0xf9, 0x8e, 0x1, 0xff, 0xd0, 0x57, + 0x7f, 0xfe, 0xa, 0x80, 0x7f, 0x8a, 0x23, 0xff, + 0x82, 0x20, 0x1f, 0xff, 0x77, 0xde, 0xa1, 0x0, + 0xff, 0xe3, 0xc4, 0x8, 0x57, 0x40, 0x3f, 0xf8, + 0xee, 0x1, 0x8d, 0x0, 0x3f, 0xf8, 0xa6, 0x1, + 0xe3, 0x0, 0xff, 0xe2, 0x90, 0x7, 0x84, 0x3, + 0xff, 0x8a, 0x26, 0x1, 0xce, 0x1, 0xff, 0xc6, + 0xe1, 0x0, 0xa4, 0x40, 0x3f, 0xf8, 0xc5, 0xf5, + 0x3a, 0xc0, 0x1f, 0xfc, 0x81, 0x56, 0x20, 0xf, + 0xf3, 0xa8, 0x7, 0xff, 0x28, 0x4e, 0xd4, 0x40, + 0x3f, 0xf8, 0xe7, 0xa0, + + /* U+F0C9 "" */ + 0x0, 0xff, 0xe6, 0xef, 0xff, 0xff, 0x2d, 0x48, + 0x3, 0xff, 0x97, 0xa0, 0x1f, 0xfc, 0xd5, 0x11, + 0xff, 0xe5, 0x16, 0x57, 0x77, 0xff, 0x2b, 0x50, + 0x3, 0xff, 0xfe, 0xf7, 0x7f, 0xfc, 0xaa, 0x28, + 0x44, 0xff, 0xe5, 0x2a, 0x80, 0x3f, 0xf9, 0x9e, + 0x20, 0x1f, 0xfc, 0xbe, 0xfb, 0xbf, 0xfe, 0x56, + 0x30, 0xa2, 0x7f, 0xf2, 0x8c, 0x3, 0xff, 0xfe, + 0x15, 0xdd, 0xff, 0xca, 0xd4, 0x51, 0x1f, 0xfe, + 0x51, 0x60, 0x7, 0xff, 0x34, 0x80, 0x3f, 0xf9, + 0x7b, 0xaf, 0xff, 0xfe, 0x5a, 0x80, + + /* U+F0E0 "" */ + 0x1b, 0xff, 0xff, 0xe6, 0x58, 0xd2, 0x0, 0x7f, + 0xf3, 0x12, 0x90, 0x3, 0xff, 0x9c, 0x80, 0x1f, + 0xfd, 0x5, 0x0, 0xff, 0xe7, 0x2d, 0x40, 0x7, + 0xff, 0x32, 0x28, 0x1f, 0x4, 0x3, 0xff, 0x90, + 0x38, 0xe1, 0xca, 0x7e, 0x80, 0x1f, 0xfc, 0x64, + 0xf3, 0x5e, 0x1a, 0x91, 0xb8, 0x0, 0xff, 0xe2, + 0x45, 0x8c, 0xd0, 0x80, 0x1b, 0x49, 0xf0, 0x80, + 0x3f, 0xf8, 0x5, 0x8e, 0x5a, 0xc0, 0x1c, 0x5a, + 0xc7, 0xaa, 0x1, 0xfe, 0x5d, 0x36, 0xd2, 0x0, + 0xfd, 0x34, 0x35, 0x20, 0x1f, 0xa6, 0x82, 0xa4, + 0x3, 0xfe, 0x5f, 0x36, 0xd2, 0x0, 0xc5, 0xac, + 0x7a, 0xa0, 0x1f, 0xfc, 0x11, 0xc6, 0x2d, 0x81, + 0x14, 0x69, 0x3e, 0x10, 0x7, 0xff, 0x12, 0x6c, + 0x5f, 0xb8, 0xe3, 0x70, 0x1, 0xff, 0xc7, 0x4e, + 0x95, 0x54, 0xf2, 0x0, 0x7f, 0xf2, 0x9a, 0xa8, + 0xc0, 0x1f, 0xff, 0x84, 0x0, 0xff, 0xe7, 0x25, + 0x20, 0x7, 0xff, 0x31, 0x28, + + /* U+F0E7 "" */ + 0x0, 0xa2, 0xef, 0xf4, 0x0, 0x7e, 0x37, 0x44, + 0xfc, 0xe4, 0x1, 0xf2, 0x80, 0x7f, 0x88, 0x3, + 0xee, 0x0, 0xfe, 0x40, 0xf, 0xc4, 0x1, 0xfd, + 0xc0, 0x1f, 0x98, 0x3, 0xf9, 0x0, 0x3f, 0x10, + 0x7, 0xe4, 0x10, 0xf, 0xc2, 0x1, 0xfb, 0x40, + 0x3f, 0x18, 0x7, 0xf3, 0x80, 0x7e, 0x60, 0xf, + 0xee, 0xff, 0xed, 0x20, 0x20, 0xf, 0xfe, 0x19, + 0x28, 0x70, 0x7, 0xff, 0x11, 0x80, 0x80, 0x3f, + 0xf8, 0x70, 0x20, 0xc0, 0x1f, 0xfc, 0x22, 0x70, + 0x1, 0x0, 0x7f, 0xf0, 0xa0, 0x2, 0x50, 0xf, + 0xfe, 0xa, 0x28, 0x5, 0x5f, 0xfe, 0xa0, 0xf, + 0x48, 0x7, 0xfd, 0xa0, 0x1c, 0xc4, 0x1, 0xff, + 0x20, 0x6, 0x18, 0x0, 0xff, 0xe0, 0x18, 0x6, + 0x81, 0x0, 0xff, 0x8c, 0x3, 0x13, 0x0, 0x7f, + 0xf0, 0x10, 0x3, 0x48, 0x7, 0xff, 0x7, 0x0, + 0x24, 0x40, 0x7, 0xff, 0x5, 0x40, 0x29, 0x0, + 0xff, 0xe0, 0x90, 0x80, 0x1c, 0x80, 0x3f, 0xf8, + 0x28, 0x0, 0x18, 0x0, 0xff, 0xe1, 0x60, 0x2, + 0x0, 0x3f, 0xf8, 0x66, 0x6, 0xc0, 0x1f, 0xfc, + 0x39, 0xcc, 0x0, 0x7f, 0x80, + + /* U+F0EA "" */ + 0x0, 0xf8, 0x50, 0xc0, 0x3f, 0xf9, 0x2f, 0xd7, + 0x9c, 0x60, 0x1f, 0xfc, 0x14, 0x99, 0xe8, 0x1, + 0x1, 0xd9, 0x9d, 0x2, 0x1, 0xf5, 0xb3, 0x70, + 0x2f, 0x70, 0x44, 0xcd, 0x9e, 0x0, 0x3f, 0xf9, + 0x86, 0x1, 0xff, 0xc2, 0x5f, 0xe1, 0x0, 0xff, + 0xf1, 0x9c, 0xdd, 0xfd, 0x20, 0x1f, 0xfc, 0x24, + 0xc6, 0x44, 0xf8, 0xc0, 0x3f, 0xf8, 0x52, 0x15, + 0xff, 0xf5, 0x6, 0xb0, 0x7, 0xfc, 0x42, 0xa0, + 0x1f, 0xc7, 0x2c, 0x1, 0xff, 0xcc, 0x96, 0x0, + 0xff, 0xe6, 0x4b, 0x0, 0x7f, 0xf3, 0x24, 0xc0, + 0x3f, 0xf8, 0xf5, 0x77, 0x88, 0x3, 0xff, 0x8a, + 0x82, 0x89, 0xc2, 0x1, 0xff, 0xc5, 0x1e, 0xff, + 0xe5, 0x0, 0xff, 0xff, 0x80, 0x7f, 0xf9, 0x94, + 0x3, 0xff, 0x99, 0x5f, 0xfe, 0x0, 0xff, 0xff, + 0x80, 0x7f, 0xf3, 0x84, 0x40, 0x1f, 0xfc, 0x27, + 0x0, 0xfe, 0xfb, 0xbf, 0xfe, 0xe, 0x90, + + /* U+F0F3 "" */ + 0x0, 0xff, 0x9e, 0x88, 0x3, 0xff, 0x92, 0xb0, + 0xbe, 0x1, 0xff, 0xc9, 0x20, 0x1, 0x0, 0x7f, + 0xf1, 0xca, 0x28, 0x2, 0xa5, 0x0, 0xff, 0xe2, + 0x4e, 0xb9, 0x0, 0x4b, 0x5a, 0x80, 0x1f, 0xfc, + 0x1, 0xc6, 0x0, 0xfc, 0x56, 0xa0, 0x1f, 0xf6, + 0x98, 0x7, 0xfd, 0x48, 0x1, 0xfc, 0xc6, 0x1, + 0xff, 0xc1, 0x90, 0xf, 0xe8, 0x0, 0xff, 0xe1, + 0x12, 0x80, 0x7c, 0x62, 0x1, 0xff, 0xc3, 0xe0, + 0xf, 0x94, 0x3, 0xff, 0x88, 0xc0, 0x1f, 0x8, + 0x7, 0xff, 0x10, 0x80, 0x3e, 0xf0, 0xf, 0xfe, + 0x60, 0x80, 0x7f, 0xf1, 0x44, 0x3, 0xca, 0x1, + 0xff, 0xc5, 0x50, 0xf, 0x18, 0x7, 0xff, 0x14, + 0xc0, 0x38, 0xc0, 0x3f, 0xf8, 0xd8, 0x1, 0xd4, + 0x1, 0xff, 0xc6, 0x41, 0x0, 0x8d, 0x80, 0x3f, + 0xf8, 0xf6, 0x0, 0x1d, 0x0, 0xff, 0xe4, 0x2b, + 0x85, 0x8, 0x7, 0xff, 0x26, 0xd, 0x40, 0x3f, + 0xf9, 0x69, 0x0, 0x1f, 0xfc, 0xa2, 0x66, 0x7f, + 0xff, 0xf2, 0xb4, 0x40, 0x3f, 0xfa, 0xa7, 0xff, + 0xeb, 0x0, 0xff, 0xe2, 0x98, 0x80, 0x76, 0x80, + 0x7f, 0xf1, 0xb4, 0x40, 0x26, 0x60, 0x7, 0xff, + 0x18, 0xfe, 0xa3, 0x24, 0x3, 0xfc, + + /* U+F11C "" */ + 0x1b, 0xff, 0xff, 0xe7, 0xf2, 0x85, 0x20, 0x7, + 0xff, 0x3c, 0x68, 0xd0, 0x3, 0xff, 0xa4, 0x80, + 0x11, 0x3b, 0x98, 0x0, 0xef, 0x0, 0x19, 0xdc, + 0x20, 0xae, 0xe4, 0x2, 0x77, 0x30, 0x5, 0xe0, + 0x12, 0xc4, 0x24, 0xe, 0x22, 0x30, 0x98, 0x82, + 0x5, 0xc4, 0x3c, 0x2a, 0x21, 0x20, 0x1f, 0xfd, + 0xb1, 0x0, 0x8, 0x8, 0x4, 0x20, 0x20, 0x6, + 0x2, 0x0, 0x10, 0x70, 0x0, 0x40, 0x3e, 0x6f, + 0xf7, 0x1, 0x7f, 0xc4, 0x1d, 0xfe, 0x30, 0xcf, + 0xf4, 0x83, 0x7f, 0xb8, 0x3, 0xfc, 0x46, 0x61, + 0x1, 0x33, 0x10, 0x0, 0xcc, 0x40, 0x3, 0x38, + 0x3, 0xff, 0x83, 0xf9, 0x88, 0x8, 0xcc, 0x70, + 0x3e, 0x63, 0x40, 0xb3, 0x25, 0x0, 0xff, 0xe4, + 0x8, 0x7, 0x8, 0x7, 0xff, 0x34, 0x40, 0x38, + 0x40, 0x3f, 0xf8, 0xbf, 0x98, 0x80, 0x8c, 0xc7, + 0x3, 0xe6, 0x34, 0xb, 0x32, 0x50, 0xf, 0xfe, + 0x1, 0x19, 0x84, 0x4, 0xcc, 0x40, 0x3, 0x31, + 0x0, 0xc, 0xe0, 0xf, 0xf3, 0x7f, 0xb8, 0xb, + 0xff, 0xff, 0x83, 0x20, 0xdf, 0xee, 0x0, 0xf8, + 0x40, 0x2, 0x2, 0x1, 0xff, 0xc1, 0x20, 0xe0, + 0x0, 0x80, 0x7f, 0xf6, 0xd6, 0x21, 0x20, 0x71, + 0x1f, 0xfc, 0x1f, 0xa, 0x88, 0x48, 0x7, 0xc4, + 0xee, 0x60, 0x3, 0xbf, 0xff, 0x5, 0x0, 0x9d, + 0xcc, 0x1, 0x7a, 0x0, 0x7f, 0xf4, 0x92, 0x90, + 0x3, 0xff, 0x9e, 0x34, 0x60, + + /* U+F124 "" */ + 0x0, 0xff, 0xe6, 0xab, 0x90, 0x7, 0xff, 0x35, + 0xba, 0xa3, 0x50, 0x3, 0xff, 0x92, 0x31, 0xd2, + 0x20, 0x14, 0x80, 0x7f, 0xf1, 0xca, 0x79, 0xc4, + 0x3, 0x8c, 0x3, 0xff, 0x8a, 0x75, 0xac, 0x1, + 0xf9, 0xc0, 0x3f, 0xf8, 0x69, 0x98, 0x50, 0xf, + 0xf5, 0x80, 0x7f, 0xf0, 0x5b, 0x6c, 0xc0, 0x3f, + 0xe4, 0x20, 0xf, 0xf0, 0xbf, 0x49, 0x0, 0x7f, + 0xf0, 0x60, 0x3, 0xf8, 0x63, 0xa0, 0x40, 0x3f, + 0xf8, 0x46, 0x60, 0xf, 0x8a, 0xb9, 0xc0, 0x3f, + 0xf8, 0xb2, 0x1, 0xe4, 0xbd, 0x50, 0xf, 0xfe, + 0x31, 0x28, 0x6, 0x1b, 0xb2, 0x0, 0x7f, 0xf2, + 0x2c, 0x3, 0xa9, 0x0, 0x3f, 0xf9, 0x22, 0xc0, + 0x1c, 0x80, 0x1f, 0xfc, 0xa9, 0x0, 0xf1, 0x0, + 0x7f, 0xf2, 0x98, 0x3, 0xd2, 0x1, 0xff, 0xc9, + 0x61, 0x0, 0xf2, 0x7e, 0x5d, 0xff, 0x10, 0x7, + 0xf5, 0x80, 0x7f, 0x1a, 0x27, 0xf0, 0x80, 0x7e, + 0x52, 0x0, 0xff, 0xe8, 0x48, 0x7, 0xff, 0x41, + 0xc, 0x3, 0xff, 0xa1, 0xe0, 0x1f, 0xfd, 0x2, + 0x40, 0xf, 0xfe, 0x84, 0x0, 0x7f, 0xf4, 0x5, + 0x40, 0x3f, 0xfa, 0x12, 0x1, 0xff, 0xcb, 0x70, + 0xe, 0x70, 0xf, 0xfe, 0x58, 0x80, 0x67, 0x0, + 0xff, 0xe6, 0x40, 0x4, 0x50, 0x1, 0xff, 0xcc, + 0x2e, 0x89, 0xd0, 0xf, 0xfe, 0x0, + + /* U+F15B "ï…›" */ + 0x14, 0x4f, 0xf8, 0x40, 0xc0, 0x3d, 0x97, 0x7f, + 0xf2, 0x86, 0x50, 0x7, 0x10, 0x7, 0xff, 0x9, + 0x68, 0x3, 0xff, 0x90, 0xb4, 0x1, 0xff, 0xc8, + 0x5a, 0x0, 0xff, 0xe4, 0x2d, 0x0, 0x7f, 0xf2, + 0x16, 0x40, 0x3f, 0xf8, 0x48, 0x9e, 0x20, 0xf, + 0xfe, 0x6, 0x5, 0xdf, 0xc0, 0x1f, 0xfc, 0x7, + 0xff, 0xfc, 0x1, 0xff, 0xff, 0x0, 0xff, 0xff, + 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xff, 0xe0, 0x1f, + 0xfe, 0xd2, 0x0, 0xff, 0xe3, 0x96, 0x5d, 0xff, + 0xf1, 0xf0, + + /* U+F1EB "" */ + 0x0, 0xff, 0xf1, 0x9b, 0x4d, 0x5e, 0x5d, 0x4b, + 0x18, 0x7, 0xff, 0x20, 0x9f, 0x3f, 0x25, 0x95, + 0xd, 0x15, 0xa7, 0x3f, 0x1c, 0x80, 0x3f, 0xf8, + 0x47, 0x7b, 0x6, 0x1, 0xff, 0xc1, 0x38, 0xdb, + 0x30, 0xf, 0xf1, 0x66, 0x10, 0x3, 0xff, 0x8e, + 0x99, 0x82, 0x0, 0xfa, 0x34, 0xc0, 0x3f, 0x12, + 0x2a, 0xc8, 0x40, 0x1f, 0x8f, 0x60, 0x3, 0xe, + 0xb8, 0x7, 0x8e, 0x33, 0xf6, 0xea, 0xab, 0xdf, + 0xc8, 0x30, 0xf, 0x3e, 0x88, 0x1f, 0x90, 0x7, + 0x36, 0xe3, 0x98, 0x7, 0xf1, 0xbe, 0x6b, 0x0, + 0x71, 0x79, 0xe8, 0x80, 0x64, 0xd9, 0x20, 0xf, + 0xfe, 0x19, 0x4e, 0xa0, 0x6, 0x1d, 0x90, 0xd, + 0x36, 0x40, 0x1f, 0xfc, 0x72, 0xb9, 0x0, 0xd2, + 0xf0, 0x3, 0xac, 0x1, 0xe4, 0x8b, 0xef, 0xfb, + 0x6e, 0x10, 0x3, 0xcd, 0xa4, 0x10, 0xe0, 0xf7, + 0xe4, 0x1, 0x86, 0x3a, 0xdd, 0x4, 0x2, 0x24, + 0x7b, 0xe8, 0x10, 0xc, 0x59, 0x6e, 0x1, 0x20, + 0x80, 0x66, 0xf7, 0x10, 0xf, 0xf8, 0x5f, 0xd8, + 0x3, 0xa, 0x0, 0x7e, 0x1b, 0x91, 0x0, 0xff, + 0xe1, 0x8c, 0xd8, 0x80, 0x7f, 0xf0, 0x29, 0x0, + 0x3c, 0x6f, 0x13, 0xe, 0x60, 0x1e, 0x4d, 0x0, + 0xff, 0xe0, 0x18, 0x6, 0x18, 0xfc, 0x87, 0x67, + 0x8c, 0xf8, 0x10, 0xc, 0x80, 0x1f, 0xfc, 0x8, + 0x70, 0x3, 0x73, 0x80, 0x7f, 0x3f, 0x30, 0x1, + 0xa0, 0x3, 0xff, 0x83, 0x13, 0x72, 0x1, 0xff, + 0xc1, 0x9b, 0x89, 0x0, 0xff, 0xe1, 0xb2, 0x0, + 0x7c, 0x20, 0x1f, 0x23, 0x80, 0x7f, 0xf2, 0xdf, + 0xfb, 0xdc, 0x3, 0xff, 0xa2, 0xf0, 0x1, 0x43, + 0x80, 0x7f, 0xf4, 0x24, 0x3, 0xa4, 0x3, 0xff, + 0xa0, 0x20, 0x1c, 0x20, 0x1f, 0xfd, 0x3, 0x0, + 0xe3, 0x0, 0xff, 0xe8, 0x40, 0x7, 0x40, 0x7, + 0xff, 0x41, 0x31, 0x9, 0x31, 0x0, 0x3f, 0xf8, + 0x40, + + /* U+F240 "" */ + 0x2, 0x67, 0x7f, 0xfe, 0x82, 0x0, 0x4b, 0xb3, + 0x11, 0xff, 0xd0, 0xb9, 0x0, 0x40, 0x7, 0xff, + 0x4d, 0x84, 0x8, 0x3, 0xff, 0xa8, 0x40, 0x19, + 0xff, 0xff, 0xf9, 0xb6, 0x1, 0x64, 0x80, 0x7f, + 0xf5, 0x98, 0x3, 0xb3, 0xff, 0xff, 0x94, 0x1, + 0xff, 0xd8, 0x67, 0x30, 0xf, 0xfe, 0xa1, 0x42, + 0x0, 0x7f, 0xff, 0xc0, 0x3f, 0xf9, 0xe7, 0xee, + 0x1, 0xff, 0xd4, 0x70, 0xf, 0xf6, 0x7f, 0xff, + 0xf2, 0x80, 0x3c, 0x20, 0x11, 0xbb, 0xff, 0xf3, + 0x74, 0x2, 0x5d, 0x0, 0x92, 0x23, 0xff, 0x9a, + 0xc0, 0x14, 0x9a, 0x0, 0x7f, 0xf4, 0xc4, 0xc2, + 0x90, 0x3, 0xff, 0xa2, 0x5a, 0x0, 0x1b, 0xff, + 0xff, 0xe8, 0xe9, 0x80, 0x0, + + /* U+F241 "ï‰" */ + 0x2, 0x67, 0x7f, 0xfe, 0x82, 0x0, 0x4b, 0xb3, + 0x11, 0xff, 0xd0, 0xb9, 0x0, 0x40, 0x7, 0xff, + 0x4d, 0x84, 0x8, 0x3, 0xff, 0xa8, 0x40, 0x19, + 0xff, 0xff, 0xf9, 0xb6, 0x1, 0x64, 0x80, 0x7f, + 0xf5, 0x98, 0x3, 0xbb, 0xff, 0xff, 0x89, 0x20, + 0x1f, 0xfd, 0xd6, 0x73, 0x0, 0xff, 0xea, 0x14, + 0x20, 0x7, 0xff, 0xfc, 0x3, 0xff, 0x9e, 0x7e, + 0xe0, 0x1f, 0xfd, 0x47, 0x0, 0xff, 0x77, 0xff, + 0xff, 0x12, 0x40, 0x3f, 0xe1, 0x0, 0x8d, 0xdf, + 0xff, 0x9b, 0xa0, 0x12, 0xe8, 0x4, 0x91, 0x1f, + 0xfc, 0xd6, 0x0, 0xa4, 0xd0, 0x3, 0xff, 0xa6, + 0x26, 0x14, 0x80, 0x1f, 0xfd, 0x12, 0xd0, 0x0, + 0xdf, 0xff, 0xff, 0x47, 0x4c, 0x0, + + /* U+F242 "" */ + 0x2, 0x67, 0x7f, 0xfe, 0x82, 0x0, 0x4b, 0xb3, + 0x11, 0xff, 0xd0, 0xb9, 0x0, 0x40, 0x7, 0xff, + 0x4d, 0x84, 0x8, 0x3, 0xff, 0xa8, 0x40, 0x19, + 0xff, 0xff, 0xf9, 0xb6, 0x1, 0x64, 0x80, 0x7f, + 0xf5, 0x98, 0x3, 0xbb, 0xff, 0xfe, 0x50, 0xf, + 0xff, 0x13, 0x39, 0x80, 0x7f, 0xf5, 0xa, 0x10, + 0x3, 0xff, 0xfe, 0x1, 0xff, 0xcf, 0x3f, 0x70, + 0xf, 0xfe, 0xa3, 0x80, 0x7f, 0xbb, 0xff, 0xfe, + 0x50, 0xf, 0xfe, 0x20, 0x80, 0x46, 0xef, 0xff, + 0xcd, 0xd0, 0x9, 0x74, 0x2, 0x48, 0x8f, 0xfe, + 0x6b, 0x0, 0x52, 0x68, 0x1, 0xff, 0xd3, 0x13, + 0xa, 0x40, 0xf, 0xfe, 0x89, 0x68, 0x0, 0x6f, + 0xff, 0xff, 0xa3, 0xa6, 0x0, + + /* U+F243 "" */ + 0x2, 0x67, 0x7f, 0xfe, 0x82, 0x0, 0x4b, 0xb3, + 0x11, 0xff, 0xd0, 0xb9, 0x0, 0x40, 0x7, 0xff, + 0x4d, 0x84, 0x8, 0x3, 0xff, 0xa8, 0x40, 0x19, + 0xff, 0xff, 0xf9, 0xb6, 0x1, 0x64, 0x80, 0x7f, + 0xf5, 0x98, 0x3, 0xbb, 0xff, 0xc2, 0x1, 0xff, + 0xe7, 0x67, 0x30, 0xf, 0xfe, 0xa1, 0x42, 0x0, + 0x7f, 0xff, 0xc0, 0x3f, 0xf9, 0xe7, 0xee, 0x1, + 0xff, 0xd4, 0x70, 0xf, 0xf7, 0x7f, 0xf8, 0x40, + 0x3f, 0xf9, 0x22, 0x1, 0x1b, 0xbf, 0xff, 0x37, + 0x40, 0x25, 0xd0, 0x9, 0x22, 0x3f, 0xf9, 0xac, + 0x1, 0x49, 0xa0, 0x7, 0xff, 0x4c, 0x4c, 0x29, + 0x0, 0x3f, 0xfa, 0x25, 0xa0, 0x1, 0xbf, 0xff, + 0xfe, 0x8e, 0x98, 0x0, + + /* U+F244 "" */ + 0x2, 0x67, 0x7f, 0xfe, 0x82, 0x0, 0x4b, 0xb3, + 0x11, 0xff, 0xd0, 0xb9, 0x0, 0x40, 0x7, 0xff, + 0x4d, 0x84, 0x8, 0x3, 0xff, 0xa8, 0x40, 0x19, + 0xff, 0xff, 0xf9, 0xb6, 0x1, 0x64, 0x80, 0x7f, + 0xf5, 0x98, 0x3, 0xff, 0xe8, 0xce, 0x60, 0x1f, + 0xfd, 0x42, 0x84, 0x0, 0xff, 0xff, 0x80, 0x7f, + 0xf3, 0xcf, 0xdc, 0x3, 0xff, 0xa8, 0xe0, 0x1f, + 0xfd, 0xb1, 0x0, 0x8d, 0xdf, 0xff, 0x9b, 0xa0, + 0x12, 0xe8, 0x4, 0x91, 0x1f, 0xfc, 0xd6, 0x0, + 0xa4, 0xd0, 0x3, 0xff, 0xa6, 0x26, 0x14, 0x80, + 0x1f, 0xfd, 0x12, 0xd0, 0x0, 0xdf, 0xff, 0xff, + 0x47, 0x4c, 0x0, + + /* U+F287 "" */ + 0x0, 0xff, 0xe4, 0x8, 0x7, 0xff, 0x55, 0x7b, + 0xa4, 0x0, 0xff, 0xe8, 0x9, 0x1d, 0x8, 0xd, + 0x88, 0x7, 0xff, 0x34, 0x6f, 0xb7, 0x0, 0x39, + 0x0, 0x3f, 0xf9, 0xb4, 0x80, 0x64, 0x1, 0xc2, + 0x1, 0xff, 0xcc, 0x54, 0x1e, 0xcd, 0x30, 0x8, + 0xd0, 0x3, 0xff, 0x99, 0x1, 0x62, 0x0, 0xc8, + 0x58, 0xc0, 0xf, 0xfe, 0x21, 0x8, 0x7, 0x90, + 0x88, 0xa0, 0x19, 0xe9, 0xc0, 0x3f, 0xf8, 0x69, + 0xdb, 0xd8, 0x40, 0x1a, 0x2, 0x0, 0x3f, 0xf8, + 0x6e, 0x80, 0x1c, 0x96, 0x20, 0x3, 0xc1, 0x0, + 0x21, 0x8a, 0x80, 0x7f, 0xf0, 0xee, 0xe2, 0x0, + 0xa0, 0x3, 0x86, 0xcd, 0x68, 0x1d, 0x13, 0xff, + 0x88, 0x20, 0x9a, 0xe0, 0x3, 0x0, 0xf2, 0xe5, + 0x8, 0x35, 0xdf, 0xff, 0x10, 0x80, 0x28, 0xd0, + 0x10, 0xf, 0xa, 0x27, 0x18, 0x0, 0xd1, 0x3f, + 0xf8, 0x0, 0x18, 0x60, 0x18, 0x3, 0xd5, 0x77, + 0xd8, 0xc0, 0xd7, 0x7f, 0xfc, 0x3, 0x0, 0x3f, + 0x28, 0x42, 0x0, 0x67, 0x40, 0xf, 0x48, 0xa9, + 0x0, 0x7f, 0xf0, 0x13, 0x60, 0x3, 0x5d, 0x3c, + 0x64, 0x0, 0x7e, 0x90, 0x80, 0xf, 0xfb, 0x2c, + 0x80, 0x3c, 0xb0, 0xe6, 0x1, 0xfc, 0xc0, 0xa4, + 0x0, 0x6d, 0xdd, 0x84, 0x1, 0xff, 0xcb, 0x17, + 0xe, 0x0, 0x79, 0x16, 0x36, 0x0, 0xff, 0xe6, + 0x41, 0x9b, 0xf5, 0xc0, 0x3f, 0xfa, 0x7a, 0xa0, + 0x42, 0x1, 0xff, 0xd3, 0x1a, 0xfe, 0x60, 0xf, + 0xfe, 0xb0, 0x88, 0x3, 0xff, 0xaf, 0x1f, 0xfc, + 0x80, 0x1f, 0x80, + + /* U+F293 "" */ + 0x0, 0xfe, 0x13, 0x43, 0x20, 0xf, 0xfe, 0x11, + 0xd7, 0x73, 0x2f, 0x37, 0xed, 0x40, 0x3f, 0xd5, + 0x8a, 0x20, 0x1e, 0x4a, 0xc1, 0x0, 0xf0, 0xe2, + 0x80, 0x63, 0x80, 0xe, 0x3c, 0x10, 0xe, 0xa3, + 0x0, 0xf3, 0xb8, 0x3, 0x8b, 0x40, 0x32, 0xa0, + 0x7, 0xe8, 0x60, 0xe, 0x35, 0x0, 0xa4, 0x3, + 0xfd, 0x2a, 0x1, 0xdc, 0x0, 0x23, 0x0, 0xff, + 0xa9, 0x0, 0x32, 0x8, 0x20, 0x6, 0x50, 0xe, + 0x39, 0xb, 0x30, 0xc, 0x81, 0x80, 0x13, 0x56, + 0x8, 0x6, 0x69, 0xd, 0x20, 0xb, 0x41, 0x80, + 0x24, 0x13, 0xd1, 0x0, 0x8, 0x10, 0x8, 0x80, + 0x22, 0x2, 0x0, 0x8b, 0x4, 0xf5, 0xc0, 0x9, + 0x61, 0x46, 0x1, 0x30, 0x8, 0x6, 0x2c, 0x13, + 0xa0, 0x2b, 0x9, 0x50, 0xc, 0x20, 0x1f, 0x16, + 0x8, 0x80, 0x27, 0x60, 0xe, 0x31, 0x0, 0xf8, + 0xb0, 0x40, 0xb, 0x0, 0x1f, 0xfc, 0x46, 0x10, + 0x3, 0x0, 0x7e, 0x10, 0xf, 0x92, 0xc0, 0x23, + 0xc0, 0xf, 0x18, 0x7, 0xc9, 0x60, 0x40, 0x22, + 0x3b, 0x0, 0xf8, 0x40, 0x32, 0x58, 0x2f, 0x1, + 0xe0, 0xa5, 0x0, 0x61, 0x2, 0x0, 0x92, 0xc1, + 0x68, 0x2, 0x2c, 0x5, 0x80, 0x9, 0x81, 0x40, + 0x39, 0x68, 0x2, 0x10, 0xb0, 0x1a, 0x0, 0xb4, + 0x30, 0x2, 0x4d, 0xa0, 0xe, 0x96, 0x1c, 0x20, + 0x8, 0xc1, 0x0, 0x31, 0x0, 0x42, 0x6, 0xc3, + 0x84, 0x1, 0x90, 0x5, 0x40, 0x3f, 0xc3, 0x84, + 0x1, 0x94, 0x2, 0x80, 0xf, 0xe1, 0xc2, 0x0, + 0xe8, 0x0, 0x8a, 0x40, 0x3e, 0x1d, 0x20, 0xe, + 0x72, 0x0, 0xcd, 0x20, 0x1c, 0x7a, 0x60, 0x1c, + 0x90, 0x1, 0xe6, 0xd5, 0x0, 0x84, 0xc0, 0x30, + 0xc5, 0x80, 0x7e, 0x2a, 0xea, 0x75, 0x44, 0x2b, + 0xdf, 0x38, 0x6, + + /* U+F2ED "ï‹­" */ + 0x0, 0xfc, 0x28, 0x9e, 0x30, 0xf, 0xfe, 0x20, + 0xf5, 0xdf, 0xb2, 0x40, 0x3f, 0x2c, 0x47, 0xb4, + 0x3, 0xf3, 0x44, 0x7c, 0x34, 0xef, 0xe3, 0x0, + 0xfe, 0x77, 0xf9, 0x80, 0x3f, 0xf9, 0x9e, 0x80, + 0x1f, 0xfc, 0xa1, 0xcb, 0xff, 0xff, 0xe5, 0x72, + 0x1, 0x44, 0x7f, 0xf2, 0x18, 0x2, 0x67, 0x7f, + 0xfe, 0x45, 0x0, 0x7f, 0xfb, 0xaa, 0x80, 0x13, + 0x68, 0x4, 0x7c, 0x60, 0x1f, 0xfc, 0x7, 0x70, + 0x5, 0xe4, 0x20, 0x6, 0x16, 0x0, 0xff, 0xff, + 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xff, 0xe0, 0x1f, + 0xff, 0x27, 0x70, 0x5, 0xe4, 0x20, 0x6, 0x16, + 0x0, 0xf9, 0xc0, 0x35, 0x50, 0x2, 0x6d, 0x0, + 0x8f, 0x8c, 0x2, 0x70, 0x8, 0x40, 0x3f, 0xf9, + 0x2, 0x1, 0x13, 0x0, 0x7f, 0xf1, 0xe0, 0x3, + 0x4d, 0xc3, 0xbf, 0xff, 0xe, 0x78, 0x80, 0x0, + + /* U+F304 "" */ + 0x0, 0xff, 0xe5, 0x33, 0x4, 0x3, 0xff, 0x98, + 0x5b, 0x32, 0xf3, 0x0, 0xff, 0xe5, 0x16, 0x10, + 0x0, 0x70, 0xc0, 0x3f, 0xf9, 0x5, 0x82, 0x1, + 0xd8, 0x60, 0x1f, 0xfc, 0x7b, 0x10, 0xf, 0xb0, + 0xc0, 0x3f, 0xf8, 0x82, 0x12, 0x80, 0x1f, 0xbc, + 0x3, 0xff, 0x86, 0x5f, 0x81, 0x68, 0x1, 0xf1, + 0x80, 0x7f, 0xf0, 0x8b, 0x4, 0xf0, 0x2d, 0x0, + 0x3c, 0x80, 0x1f, 0xfc, 0x12, 0xc1, 0x0, 0x1e, + 0x5, 0xa0, 0x6, 0x1a, 0x0, 0xff, 0xe0, 0x16, + 0x8, 0x6, 0x3c, 0xb, 0x40, 0x0, 0xe0, 0x80, + 0x7f, 0xc5, 0x82, 0x1, 0xe3, 0xc0, 0xb4, 0x1c, + 0x20, 0xf, 0xf8, 0xb0, 0x40, 0x3f, 0x1e, 0x5, + 0xf9, 0x0, 0x7f, 0xc5, 0x82, 0x1, 0xfe, 0x3a, + 0x1, 0x0, 0xff, 0x8b, 0x4, 0x3, 0xfe, 0x18, + 0x0, 0xff, 0xe0, 0x16, 0x8, 0x7, 0xfc, 0x38, + 0x40, 0x1f, 0xf1, 0x60, 0x80, 0x7f, 0xc3, 0x84, + 0x1, 0xff, 0x16, 0x8, 0x7, 0xfc, 0x38, 0x40, + 0x1f, 0xf1, 0x60, 0x80, 0x7f, 0xc3, 0x84, 0x1, + 0xff, 0x16, 0x8, 0x7, 0xfc, 0x38, 0x40, 0x1f, + 0xf1, 0x60, 0x80, 0x7f, 0xc3, 0x84, 0x1, 0xff, + 0xe, 0x8, 0x7, 0xfc, 0x38, 0x40, 0x1f, 0xfc, + 0x4, 0x10, 0xf, 0xf8, 0x70, 0x80, 0x3f, 0xf8, + 0x24, 0x1, 0xff, 0xe, 0x10, 0x7, 0xff, 0xb, + 0x80, 0x3f, 0xc3, 0x84, 0x1, 0xff, 0xc3, 0x20, + 0xf, 0xe1, 0xc2, 0x0, 0xff, 0xe2, 0x30, 0x7, + 0xe1, 0xc2, 0x0, 0xff, 0xe2, 0x90, 0x7, 0xc3, + 0x84, 0x1, 0xff, 0xc6, 0x10, 0xe, 0x13, 0xc2, + 0x0, 0xff, 0xe3, 0xec, 0x4d, 0xef, 0xf6, 0x10, + 0x7, 0xff, 0x1c, + + /* U+F55A "" */ + 0x0, 0xfe, 0x8e, 0xff, 0xff, 0xe4, 0xea, 0x80, + 0x7f, 0x5b, 0x88, 0x7, 0xff, 0x24, 0xa9, 0x40, + 0x3e, 0xb4, 0x0, 0xff, 0xe6, 0xc0, 0x7, 0xad, + 0x0, 0x3f, 0xf9, 0xc4, 0x1, 0xd6, 0x80, 0x1f, + 0xcc, 0xc0, 0xf, 0x33, 0x0, 0x3f, 0xf8, 0x36, + 0x80, 0x1f, 0xcf, 0x32, 0x70, 0xc, 0xf3, 0x28, + 0x0, 0xff, 0xad, 0x0, 0x3f, 0x86, 0x0, 0x10, + 0xe0, 0x7, 0x80, 0x3, 0x88, 0x7, 0xf5, 0xa0, + 0x7, 0xf8, 0x60, 0x2, 0x87, 0x74, 0x0, 0x50, + 0x20, 0x1f, 0xad, 0x0, 0x3f, 0xf8, 0xf, 0x0, + 0x14, 0x40, 0x2, 0x87, 0x0, 0xfd, 0x48, 0x1, + 0xff, 0xc2, 0x78, 0x0, 0xf4, 0x38, 0x7, 0xf2, + 0x80, 0x7f, 0xf1, 0x1d, 0x0, 0x32, 0x38, 0x7, + 0xf9, 0x40, 0x3f, 0xf8, 0x8e, 0x80, 0x19, 0x1c, + 0x3, 0xfd, 0x48, 0x1, 0xff, 0xc2, 0x78, 0x0, + 0xf4, 0x38, 0x7, 0xfa, 0xd0, 0x3, 0xff, 0x80, + 0xf0, 0x1, 0x44, 0x0, 0x28, 0x70, 0xf, 0xf5, + 0xa0, 0x7, 0xf8, 0x60, 0x2, 0x87, 0x74, 0x0, + 0x50, 0x20, 0x1f, 0xeb, 0x40, 0xf, 0xe1, 0x80, + 0x4, 0x38, 0x1, 0xe0, 0x1, 0x2, 0x1, 0xff, + 0x5a, 0x0, 0x7f, 0x3c, 0xc9, 0xc0, 0x33, 0xcc, + 0x9c, 0x3, 0xff, 0x83, 0x68, 0x1, 0xfc, 0xcc, + 0x0, 0xf3, 0x30, 0x3, 0xff, 0x87, 0x68, 0x1, + 0xff, 0xce, 0x20, 0xf, 0xad, 0x40, 0x3f, 0xf9, + 0xb0, 0x1, 0xfa, 0x9c, 0x40, 0x3f, 0xf9, 0x25, + 0x4a, + + /* U+F7C2 "" */ + 0x0, 0xf0, 0xbc, 0x47, 0xf3, 0xa8, 0x7, 0xc3, + 0x90, 0xef, 0xfd, 0x15, 0x82, 0x1, 0x8b, 0x8, + 0x3, 0xff, 0x80, 0x76, 0x1, 0x16, 0x10, 0x7, + 0xff, 0x9, 0x40, 0x5, 0x82, 0x1b, 0xfc, 0xb, + 0xfe, 0x12, 0xff, 0x38, 0x6, 0x2c, 0x10, 0xf, + 0xfe, 0x29, 0xe0, 0x80, 0x7f, 0xf1, 0xb4, 0x40, + 0x3f, 0xf8, 0xe2, 0x1, 0xff, 0xce, 0xdf, 0xe0, + 0x5f, 0xf0, 0x97, 0xf9, 0xc0, 0x3f, 0xff, 0xe0, + 0x1f, 0xff, 0xf0, 0xf, 0xff, 0xf8, 0x7, 0xff, + 0xfc, 0x3, 0xff, 0x8c, 0x20, 0x1f, 0xfc, 0x71, + 0x60, 0xf, 0xfe, 0x3b, 0x42, 0x80, 0x7f, 0xf1, + 0x5a, 0x2, 0xb6, 0xef, 0xff, 0x87, 0xb2, 0x0, + + /* U+F8A2 "" */ + 0x0, 0xff, 0xe7, 0xa0, 0x7, 0xff, 0x3e, 0x6c, + 0x40, 0x3f, 0xf9, 0xb2, 0xc0, 0x1f, 0xfc, 0xe9, + 0x60, 0xf, 0xe5, 0xc5, 0x0, 0xff, 0xe1, 0x1b, + 0x0, 0x7f, 0x3d, 0x1c, 0x0, 0x7f, 0xf0, 0x9c, + 0x3, 0xfa, 0x20, 0x1, 0xff, 0xce, 0x97, 0x0, + 0xff, 0xe7, 0x53, 0x0, 0x7f, 0xf3, 0xad, 0x40, + 0x38, 0xbf, 0xff, 0xf8, 0x56, 0x1, 0xd4, 0x80, + 0x1f, 0xfc, 0xf6, 0x0, 0xff, 0xe8, 0x70, 0x80, + 0x7f, 0xf3, 0x44, 0x45, 0xe4, 0x1, 0xc3, 0x55, + 0xff, 0xc6, 0xf0, 0x0, 0xe1, 0x80, 0x63, 0x55, + 0xff, 0xe3, 0x8, 0x4, 0x38, 0x60, 0x1f, 0xfd, + 0xc, 0x40, 0xf, 0xfe, 0x85, 0xa8, 0x20, 0x7, + 0xff, 0x3a, 0xba, 0x40, 0x3f, 0xf9, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 121, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 120, .box_w = 5, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 41, .adv_w = 175, .box_w = 9, .box_h = 8, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 66, .adv_w = 315, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 196, .adv_w = 278, .box_w = 16, .box_h = 26, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 341, .adv_w = 378, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 524, .adv_w = 307, .box_w = 18, .box_h = 21, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 685, .adv_w = 94, .box_w = 4, .box_h = 8, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 697, .adv_w = 151, .box_w = 7, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 776, .adv_w = 151, .box_w = 7, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 855, .adv_w = 179, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 907, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 940, .adv_w = 102, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 961, .adv_w = 172, .box_w = 9, .box_h = 3, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 969, .adv_w = 102, .box_w = 5, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 980, .adv_w = 158, .box_w = 12, .box_h = 27, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 1083, .adv_w = 299, .box_w = 17, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1221, .adv_w = 166, .box_w = 8, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1238, .adv_w = 257, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1354, .adv_w = 256, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1462, .adv_w = 300, .box_w = 18, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1561, .adv_w = 257, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1675, .adv_w = 276, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1812, .adv_w = 268, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1910, .adv_w = 289, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2052, .adv_w = 276, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2187, .adv_w = 102, .box_w = 5, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2213, .adv_w = 102, .box_w = 5, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 2249, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 2320, .adv_w = 261, .box_w = 14, .box_h = 9, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 2350, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 2421, .adv_w = 257, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2522, .adv_w = 463, .box_w = 27, .box_h = 25, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 2798, .adv_w = 328, .box_w = 22, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2946, .adv_w = 339, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3063, .adv_w = 324, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3198, .adv_w = 370, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3315, .adv_w = 300, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3363, .adv_w = 284, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3402, .adv_w = 346, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3542, .adv_w = 364, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3574, .adv_w = 139, .box_w = 4, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3580, .adv_w = 230, .box_w = 13, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3634, .adv_w = 322, .box_w = 19, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3760, .adv_w = 266, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3786, .adv_w = 428, .box_w = 22, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3916, .adv_w = 364, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4019, .adv_w = 376, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4186, .adv_w = 323, .box_w = 17, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4272, .adv_w = 376, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 4483, .adv_w = 326, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4592, .adv_w = 278, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4726, .adv_w = 263, .box_w = 17, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4758, .adv_w = 354, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4834, .adv_w = 319, .box_w = 21, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4983, .adv_w = 504, .box_w = 31, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5219, .adv_w = 302, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5365, .adv_w = 290, .box_w = 20, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5470, .adv_w = 294, .box_w = 17, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5568, .adv_w = 149, .box_w = 7, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 5592, .adv_w = 158, .box_w = 13, .box_h = 27, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 5698, .adv_w = 149, .box_w = 7, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 5721, .adv_w = 261, .box_w = 13, .box_h = 12, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 5784, .adv_w = 224, .box_w = 14, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5791, .adv_w = 269, .box_w = 8, .box_h = 4, .ofs_x = 3, .ofs_y = 17}, + {.bitmap_index = 5806, .adv_w = 268, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5899, .adv_w = 306, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6003, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6098, .adv_w = 306, .box_w = 16, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6205, .adv_w = 274, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6299, .adv_w = 158, .box_w = 11, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6351, .adv_w = 309, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 6491, .adv_w = 305, .box_w = 15, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6553, .adv_w = 125, .box_w = 4, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6570, .adv_w = 127, .box_w = 9, .box_h = 26, .ofs_x = -3, .ofs_y = -5}, + {.bitmap_index = 6616, .adv_w = 276, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6704, .adv_w = 125, .box_w = 4, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6711, .adv_w = 474, .box_w = 26, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6806, .adv_w = 305, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6862, .adv_w = 284, .box_w = 16, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6966, .adv_w = 306, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 7072, .adv_w = 306, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 7180, .adv_w = 184, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7210, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7305, .adv_w = 185, .box_w = 11, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7357, .adv_w = 303, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7408, .adv_w = 250, .box_w = 17, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7506, .adv_w = 403, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7661, .adv_w = 247, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7759, .adv_w = 250, .box_w = 17, .box_h = 20, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 7887, .adv_w = 233, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7954, .adv_w = 157, .box_w = 9, .box_h = 26, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 8014, .adv_w = 134, .box_w = 4, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 8023, .adv_w = 157, .box_w = 9, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 8077, .adv_w = 261, .box_w = 14, .box_h = 5, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 8112, .adv_w = 188, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 11}, + {.bitmap_index = 8158, .adv_w = 141, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 8176, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 8344, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8523, .adv_w = 448, .box_w = 28, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8634, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8793, .adv_w = 308, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8946, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 9210, .adv_w = 448, .box_w = 27, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 9431, .adv_w = 504, .box_w = 32, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9642, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 9805, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9961, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 10218, .adv_w = 224, .box_w = 14, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10281, .adv_w = 336, .box_w = 21, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10395, .adv_w = 504, .box_w = 32, .box_h = 27, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10670, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10804, .adv_w = 308, .box_w = 20, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 10984, .adv_w = 392, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 11094, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 11242, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11325, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11379, .adv_w = 392, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 11491, .adv_w = 392, .box_w = 26, .box_h = 25, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 11628, .adv_w = 280, .box_w = 16, .box_h = 25, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 11759, .adv_w = 280, .box_w = 16, .box_h = 25, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 11890, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11979, .adv_w = 392, .box_w = 25, .box_h = 7, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 12013, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12263, .adv_w = 560, .box_w = 35, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 12598, .adv_w = 504, .box_w = 33, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 12836, .adv_w = 448, .box_w = 28, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13065, .adv_w = 392, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 13188, .adv_w = 392, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 13314, .adv_w = 560, .box_w = 35, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13498, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13564, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 13734, .adv_w = 448, .box_w = 29, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 13945, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14184, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 14291, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14423, .adv_w = 392, .box_w = 25, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14501, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14634, .adv_w = 280, .box_w = 19, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 14791, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 14918, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 15084, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15281, .adv_w = 448, .box_w = 30, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 15463, .adv_w = 336, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 15537, .adv_w = 560, .box_w = 35, .box_h = 26, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15794, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15895, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15997, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 16098, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 16198, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 16289, .adv_w = 560, .box_w = 36, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16500, .adv_w = 392, .box_w = 22, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 16743, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 16863, .adv_w = 448, .box_w = 29, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 17090, .adv_w = 560, .box_w = 35, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17291, .adv_w = 336, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 17387, .adv_w = 451, .box_w = 29, .box_h = 19, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 4, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 20, 0, 12, -10, 0, 0, + 0, 0, -25, -27, 3, 21, 10, 8, + -18, 3, 22, 1, 19, 4, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 27, 4, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 0, -13, 0, 0, 0, 0, + 0, -9, 8, 9, 0, 0, -4, 0, + -3, 4, 0, -4, 0, -4, -2, -9, + 0, 0, 0, 0, -4, 0, 0, -6, + -7, 0, 0, -4, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + -4, 0, -7, 0, -12, 0, -54, 0, + 0, -9, 0, 9, 13, 0, 0, -9, + 4, 4, 15, 9, -8, 9, 0, 0, + -26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -17, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -12, -5, -22, 0, -18, + -3, 0, 0, 0, 0, 1, 17, 0, + -13, -4, -1, 1, 0, -8, 0, 0, + -3, -33, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -36, -4, 17, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 15, + 0, 4, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 17, 4, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -17, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 9, 4, 13, -4, 0, 0, 9, -4, + -15, -61, 3, 12, 9, 1, -6, 0, + 16, 0, 14, 0, 14, 0, -42, 0, + -5, 13, 0, 15, -4, 9, 4, 0, + 0, 1, -4, 0, 0, -8, 36, 0, + 36, 0, 13, 0, 19, 6, 8, 13, + 0, 0, 0, -17, 0, 0, 0, 0, + 1, -3, 0, 3, -8, -6, -9, 3, + 0, -4, 0, 0, 0, -18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -25, 0, -28, 0, 0, 0, + 0, -3, 0, 44, -5, -6, 4, 4, + -4, 0, -6, 4, 0, 0, -24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -43, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -28, 0, 27, 0, 0, -17, 0, + 15, 0, -30, -43, -30, -9, 13, 0, + 0, -30, 0, 5, -10, 0, -7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 12, 13, -55, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 21, 0, 3, 0, 0, 0, + 0, 0, 3, 3, -5, -9, 0, -1, + -1, -4, 0, 0, -3, 0, 0, 0, + -9, 0, -4, 0, -10, -9, 0, -11, + -15, -15, -9, 0, -9, 0, -9, 0, + 0, 0, 0, -4, 0, 0, 4, 0, + 3, -4, 0, 1, 0, 0, 0, 4, + -3, 0, 0, 0, -3, 4, 4, -1, + 0, 0, 0, -9, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 6, -3, 0, + -5, 0, -8, 0, 0, -3, 0, 13, + 0, 0, -4, 0, 0, 0, 0, 0, + -1, 1, -3, -3, 0, 0, -4, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, -4, -5, 0, + 0, 0, 0, 0, 1, 0, 0, -3, + 0, -4, -4, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, -3, -6, 0, -7, 0, -13, + -3, -13, 9, 0, 0, -9, 4, 9, + 12, 0, -11, -1, -5, 0, -1, -21, + 4, -3, 3, -24, 4, 0, 0, 1, + -23, 0, -24, -4, -39, -3, 0, -22, + 0, 9, 13, 0, 6, 0, 0, 0, + 0, 1, 0, -8, -6, 0, -13, 0, + 0, 0, -4, 0, 0, 0, -4, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + -6, 0, 0, 0, 0, 0, 0, 0, + -4, -4, 0, -3, -5, -4, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -5, + 0, -3, 0, -9, 4, 0, 0, -5, + 2, 4, 4, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 3, + 0, 0, -4, 0, -4, -3, -5, 0, + 0, 0, 0, 0, 0, 0, 4, 0, + -4, 0, 0, 0, 0, -5, -7, 0, + -9, 0, 13, -3, 1, -14, 0, 0, + 12, -22, -23, -19, -9, 4, 0, -4, + -29, -8, 0, -8, 0, -9, 7, -8, + -29, 0, -12, 0, 0, 2, -1, 4, + -3, 0, 4, 0, -13, -17, 0, -22, + -11, -9, -11, -13, -5, -12, -1, -9, + -12, 3, 0, 1, 0, -4, 0, 0, + 0, 3, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, -2, 0, -1, -4, 0, -8, -10, + -10, -1, 0, -13, 0, 0, 0, 0, + 0, 0, -4, 0, 0, 0, 0, 2, + -3, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + -9, 0, 0, 0, 0, -22, -13, 0, + 0, 0, -7, -22, 0, 0, -4, 4, + 0, -12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, -8, 0, + 0, 0, 0, 5, 0, 3, -9, -9, + 0, -4, -4, -5, 0, 0, 0, 0, + 0, 0, -13, 0, -4, 0, -7, -4, + 0, -10, -11, -13, -4, 0, -9, 0, + -13, 0, 0, 0, 0, 36, 0, 0, + 2, 0, 0, -6, 0, 4, 0, -19, + 0, 0, 0, 0, 0, -42, -8, 15, + 13, -4, -19, 0, 4, -7, 0, -22, + -2, -6, 4, -31, -4, 6, 0, 7, + -16, -7, -17, -15, -19, 0, 0, -27, + 0, 26, 0, 0, -2, 0, 0, 0, + -2, -2, -4, -12, -15, -1, -42, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, -2, -4, -7, 0, 0, + -9, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -9, 0, 0, 9, + -1, 6, 0, -10, 4, -3, -1, -12, + -4, 0, -6, -4, -3, 0, -7, -8, + 0, 0, -4, -1, -3, -8, -5, 0, + 0, -4, 0, 4, -3, 0, -10, 0, + 0, 0, -9, 0, -8, 0, -8, -8, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, -9, 4, 0, -6, 0, -3, -5, + -14, -3, -3, -3, -1, -3, -5, -1, + 0, 0, 0, 0, 0, -4, -4, -4, + 0, 0, 0, 0, 5, -3, 0, -3, + 0, 0, 0, -3, -5, -3, -4, -5, + -4, 0, 4, 18, -1, 0, -12, 0, + -3, 9, 0, -4, -19, -6, 7, 0, + 0, -21, -8, 4, -8, 3, 0, -3, + -4, -14, 0, -7, 2, 0, 0, -8, + 0, 0, 0, 4, 4, -9, -9, 0, + -8, -4, -7, -4, -4, 0, -8, 2, + -9, -8, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -6, + 0, 0, -4, -4, 0, 0, 0, 0, + -4, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, -3, 0, 0, 0, 0, + -7, 0, -9, 0, 0, 0, -15, 0, + 3, -10, 9, 1, -3, -21, 0, 0, + -10, -4, 0, -18, -11, -13, 0, 0, + -19, -4, -18, -17, -22, 0, -12, 0, + 4, 30, -6, 0, -10, -4, -1, -4, + -8, -12, -8, -17, -18, -10, -4, 0, + 0, -3, 0, 1, 0, 0, -31, -4, + 13, 10, -10, -17, 0, 1, -14, 0, + -22, -3, -4, 9, -41, -6, 1, 0, + 0, -29, -5, -23, -4, -33, 0, 0, + -31, 0, 26, 1, 0, -3, 0, 0, + 0, 0, -2, -3, -17, -3, 0, -29, + 0, 0, 0, 0, -14, 0, -4, 0, + -1, -13, -21, 0, 0, -2, -7, -13, + -4, 0, -3, 0, 0, 0, 0, -20, + -4, -15, -14, -4, -8, -11, -4, -8, + 0, -9, -4, -15, -7, 0, -5, -9, + -4, -9, 0, 2, 0, -3, -15, 0, + 9, 0, -8, 0, 0, 0, 0, 5, + 0, 3, -9, 18, 0, -4, -4, -5, + 0, 0, 0, 0, 0, 0, -13, 0, + -4, 0, -7, -4, 0, -10, -11, -13, + -4, 0, -9, 4, 18, 0, 0, 0, + 0, 36, 0, 0, 2, 0, 0, -6, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -3, -9, 0, 0, 0, 0, 0, -2, + 0, 0, 0, -4, -4, 0, 0, -9, + -4, 0, 0, -9, 0, 8, -2, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 7, 9, 4, -4, 0, -14, + -7, 0, 13, -15, -14, -9, -9, 18, + 8, 4, -39, -3, 9, -4, 0, -4, + 5, -4, -16, 0, -4, 4, -6, -4, + -13, -4, 0, 0, 13, 9, 0, -13, + 0, -25, -6, 13, -6, -17, 1, -6, + -15, -15, -4, 18, 4, 0, -7, 0, + -12, 0, 4, 15, -10, -17, -18, -11, + 13, 0, 1, -33, -4, 4, -8, -3, + -10, 0, -10, -17, -7, -7, -4, 0, + 0, -10, -9, -4, 0, 13, 10, -4, + -25, 0, -25, -6, 0, -16, -26, -1, + -14, -8, -15, -13, 12, 0, 0, -6, + 0, -9, -4, 0, -4, -8, 0, 8, + -15, 4, 0, 0, -24, 0, -4, -10, + -8, -3, -13, -11, -15, -10, 0, -13, + -4, -10, -9, -13, -4, 0, 0, 1, + 21, -8, 0, -13, -4, 0, -4, -9, + -10, -12, -13, -17, -6, -9, 9, 0, + -7, 0, -22, -5, 3, 9, -14, -17, + -9, -15, 15, -4, 2, -42, -8, 9, + -10, -8, -17, 0, -13, -19, -5, -4, + -4, -4, -9, -13, -1, 0, 0, 13, + 13, -3, -29, 0, -27, -10, 11, -17, + -30, -9, -16, -19, -22, -15, 9, 0, + 0, 0, 0, -5, 0, 0, 4, -5, + 9, 3, -9, 9, 0, 0, -14, -1, + 0, -1, 0, 1, 1, -4, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 4, 13, 1, 0, -5, 0, 0, + 0, 0, -3, -3, -5, 0, 0, 0, + 1, 4, 0, 0, 0, 0, 4, 0, + -4, 0, 17, 0, 8, 1, 1, -6, + 0, 9, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -27, 0, -4, 8, 0, 13, + 0, 0, 44, 5, -9, -9, 4, 4, + -3, 1, -22, 0, 0, 22, -27, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -30, 17, 63, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -27, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -9, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, -12, 0, + 0, 1, 0, 0, 4, 58, -9, -4, + 14, 12, -12, 4, 0, 0, 4, 4, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -58, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -13, + 0, 0, 0, -12, 0, 0, 0, 0, + -10, -2, 0, 0, 0, -10, 0, -5, + 0, -21, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -30, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -4, 0, 0, -9, 0, -7, 0, + -12, 0, 0, 0, -8, 4, -5, 0, + 0, -12, -4, -10, 0, 0, -12, 0, + -4, 0, -21, 0, -5, 0, 0, -36, + -9, -18, -5, -16, 0, 0, -30, 0, + -12, -2, 0, 0, 0, 0, 0, 0, + 0, 0, -7, -8, -4, -8, 0, 0, + 0, 0, -10, 0, -10, 6, -5, 9, + 0, -3, -10, -3, -8, -9, 0, -5, + -2, -3, 3, -12, -1, 0, 0, 0, + -39, -4, -6, 0, -10, 0, -3, -21, + -4, 0, 0, -3, -4, 0, 0, 0, + 0, 3, 0, -3, -8, -3, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, 0, + 0, -10, 0, -3, 0, 0, 0, -9, + 4, 0, 0, 0, -12, -4, -9, 0, + 0, -13, 0, -4, 0, -21, 0, 0, + 0, 0, -43, 0, -9, -17, -22, 0, + 0, -30, 0, -3, -7, 0, 0, 0, + 0, 0, 0, 0, 0, -4, -7, -2, + -7, 1, 0, 0, 8, -6, 0, 14, + 22, -4, -4, -13, 5, 22, 8, 10, + -12, 5, 19, 5, 13, 10, 12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 28, 21, -8, -4, 0, -4, + 36, 19, 36, 0, 0, 0, 4, 0, + 0, 17, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 6, + 0, 0, 0, 0, -38, -5, -4, -18, + -22, 0, 0, -30, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, -38, -5, -4, + -18, -22, 0, 0, -18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, -10, 4, 0, -4, + 4, 8, 4, -13, 0, -1, -4, 4, + 0, 4, 0, 0, 0, 0, -11, 0, + -4, -3, -9, 0, -4, -18, 0, 28, + -4, 0, -10, -3, 0, -3, -8, 0, + -4, -13, -9, -5, 0, 0, 0, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, -38, + -5, -4, -18, -22, 0, 0, -30, 0, + 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7, 0, -14, -5, -4, 13, -4, -4, + -18, 1, -3, 1, -3, -12, 1, 10, + 1, 4, 1, 4, -11, -18, -5, 0, + -17, -9, -12, -19, -17, 0, -7, -9, + -5, -6, -4, -3, -5, -3, 0, -3, + -1, 7, 0, 7, -3, 0, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, -4, -4, 0, 0, + -12, 0, -2, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -27, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -6, + 0, 0, 0, 0, -4, 0, 0, -8, + -4, 4, 0, -8, -9, -3, 0, -13, + -3, -10, -3, -5, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -30, 0, 14, 0, 0, -8, 0, + 0, 0, 0, -6, 0, -4, 0, 0, + -2, 0, 0, -3, 0, -10, 0, 0, + 19, -6, -15, -14, 3, 5, 5, -1, + -13, 3, 7, 3, 13, 3, 15, -3, + -12, 0, 0, -18, 0, 0, -13, -12, + 0, 0, -9, 0, -6, -8, 0, -7, + 0, -7, 0, -3, 7, 0, -4, -13, + -4, 17, 0, 0, -4, 0, -9, 0, + 0, 6, -10, 0, 4, -4, 4, 0, + 0, -15, 0, -3, -1, 0, -4, 5, + -4, 0, 0, 0, -18, -5, -10, 0, + -13, 0, 0, -21, 0, 17, -4, 0, + -8, 0, 3, 0, -4, 0, -4, -13, + 0, -4, 4, 0, 0, 0, 0, -3, + 0, 0, 4, -6, 1, 0, 0, -5, + -3, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -28, 0, 10, 0, + 0, -4, 0, 0, 0, 0, 1, 0, + -4, -4, 0, 0, 0, 9, 0, 10, + 0, 0, 0, 0, 0, -28, -26, 1, + 19, 13, 8, -18, 3, 19, 0, 17, + 0, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 1, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserrat_28_compressed = { +#else +lv_font_t lv_font_montserrat_28_compressed = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 30, /*The maximum line height required by the font*/ + .base_line = 5, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_28_COMPRESSED*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_30.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_30.c new file mode 100644 index 0000000..f5532b3 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_30.c @@ -0,0 +1,5732 @@ +/******************************************************************************* + * Size: 30 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 30 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_30.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_30 + #define LV_FONT_MONTSERRAT_30 1 +#endif + +#if LV_FONT_MONTSERRAT_30 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xaf, 0xfb, 0x9f, 0xfa, 0x9f, 0xfa, 0x8f, 0xf9, + 0x7f, 0xf8, 0x7f, 0xf8, 0x6f, 0xf7, 0x6f, 0xf6, + 0x5f, 0xf6, 0x4f, 0xf5, 0x4f, 0xf4, 0x3f, 0xf4, + 0x3f, 0xf3, 0x2f, 0xf3, 0x5, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x2b, 0xb3, 0xcf, 0xfd, 0xdf, 0xfe, + 0x4e, 0xe4, + + /* U+0022 "\"" */ + 0x1f, 0xf6, 0x0, 0xaf, 0xd1, 0xff, 0x50, 0xa, + 0xfc, 0xf, 0xf5, 0x0, 0xaf, 0xc0, 0xff, 0x50, + 0x9, 0xfb, 0xf, 0xf4, 0x0, 0x9f, 0xb0, 0xff, + 0x40, 0x9, 0xfb, 0xf, 0xf3, 0x0, 0x8f, 0xa0, + 0xff, 0x30, 0x8, 0xfa, 0x1, 0x10, 0x0, 0x1, + 0x0, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x2f, 0xf0, 0x0, 0x0, 0x6f, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfd, 0x0, + 0x0, 0x8, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xb0, 0x0, 0x0, 0xaf, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xf9, 0x0, 0x0, 0xc, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x70, 0x0, + 0x0, 0xef, 0x30, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x2, 0x22, 0x3f, 0xf3, 0x22, 0x22, + 0x6f, 0xd2, 0x22, 0x20, 0x0, 0x0, 0x2, 0xff, + 0x0, 0x0, 0x6, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xd0, 0x0, 0x0, 0x8f, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xfb, 0x0, 0x0, 0xa, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x90, + 0x0, 0x0, 0xbf, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xf7, 0x0, 0x0, 0xd, 0xf4, 0x0, 0x0, + 0x0, 0x22, 0x22, 0xcf, 0x72, 0x22, 0x22, 0xff, + 0x52, 0x22, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x5f, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, + 0x7, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xb0, 0x0, 0x0, 0x9f, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xf9, 0x0, 0x0, 0xb, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0x70, 0x0, 0x0, + 0xdf, 0x40, 0x0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x3, 0x83, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xec, + 0x83, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x20, 0x2, 0xef, 0xff, 0xcc, 0xfc, + 0xbe, 0xff, 0xf3, 0x0, 0xbf, 0xfc, 0x20, 0x7f, + 0x70, 0x2, 0x9c, 0x0, 0x1f, 0xff, 0x10, 0x7, + 0xf7, 0x0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, + 0x7f, 0x70, 0x0, 0x0, 0x0, 0x2f, 0xfd, 0x0, + 0x7, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf7, + 0x0, 0x7f, 0x70, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfd, 0x69, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xcf, 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xcf, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xf9, 0x8e, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x7, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x0, 0xb, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x0, + 0x9f, 0xf5, 0x8, 0x10, 0x0, 0x7, 0xf7, 0x0, + 0xd, 0xff, 0x34, 0xfe, 0x71, 0x0, 0x7f, 0x70, + 0xa, 0xff, 0xd0, 0x8f, 0xff, 0xfc, 0xac, 0xfb, + 0xbf, 0xff, 0xf3, 0x0, 0x5d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x0, 0x4, 0x9d, 0xef, + 0xff, 0xeb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x83, 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x5c, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xfa, 0x0, 0x0, 0x7, 0xff, 0xcd, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x5f, 0xe0, 0x0, 0x0, + 0x3f, 0xe3, 0x0, 0x3e, 0xf2, 0x0, 0x0, 0x1, + 0xff, 0x40, 0x0, 0x0, 0x9f, 0x70, 0x0, 0x7, + 0xf9, 0x0, 0x0, 0xb, 0xf9, 0x0, 0x0, 0x0, + 0xdf, 0x30, 0x0, 0x3, 0xfc, 0x0, 0x0, 0x6f, + 0xd0, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, 0x1, + 0xfd, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xdf, 0x30, 0x0, 0x3, 0xfc, 0x0, 0xc, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0x70, 0x0, 0x7, + 0xf9, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xe2, 0x0, 0x3e, 0xf2, 0x2, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xcc, 0xff, + 0x70, 0xc, 0xf7, 0x0, 0x59, 0xa8, 0x20, 0x0, + 0x0, 0x5c, 0xff, 0xc5, 0x0, 0x8f, 0xc0, 0xc, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x20, 0xaf, 0xb2, 0x5, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xf6, 0x1, 0xfe, + 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xb0, 0x6, 0xf9, 0x0, 0x0, 0xf, 0xf0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0x10, 0x8, 0xf6, + 0x0, 0x0, 0xd, 0xf2, 0x0, 0x0, 0x0, 0xe, + 0xf6, 0x0, 0x8, 0xf6, 0x0, 0x0, 0xc, 0xf2, + 0x0, 0x0, 0x0, 0x9f, 0xb0, 0x0, 0x7, 0xf7, + 0x0, 0x0, 0xe, 0xf1, 0x0, 0x0, 0x4, 0xfe, + 0x10, 0x0, 0x3, 0xfc, 0x0, 0x0, 0x3f, 0xd0, + 0x0, 0x0, 0x1e, 0xf5, 0x0, 0x0, 0x0, 0xcf, + 0x40, 0x0, 0xbf, 0x60, 0x0, 0x0, 0xaf, 0xa0, + 0x0, 0x0, 0x0, 0x2e, 0xfa, 0x9d, 0xfa, 0x0, + 0x0, 0x5, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x2, + 0xae, 0xfd, 0x70, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x5, 0xbe, 0xfe, 0xc6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xb4, + 0x23, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xfd, 0x0, 0x0, 0xd, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfa, 0x0, 0x0, 0xa, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x1e, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x50, + 0x1, 0xcf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf3, 0x5e, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xfc, 0x35, 0xff, 0xf4, 0x0, 0x4, 0xc7, 0x0, + 0x9, 0xff, 0x90, 0x0, 0x4f, 0xff, 0x40, 0x9, + 0xfe, 0x0, 0x3f, 0xfb, 0x0, 0x0, 0x4, 0xff, + 0xf5, 0xe, 0xf9, 0x0, 0x8f, 0xf5, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xaf, 0xf4, 0x0, 0xaf, 0xf3, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xc0, 0x0, + 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x80, 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, 0x4, + 0xdf, 0xff, 0xf6, 0x0, 0x9, 0xff, 0xfd, 0x86, + 0x78, 0xdf, 0xff, 0x8e, 0xff, 0x70, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0x2, 0xef, 0xc0, + 0x0, 0x2, 0x7c, 0xef, 0xed, 0x95, 0x0, 0x0, + 0x2c, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x1f, 0xf6, 0x1f, 0xf5, 0xf, 0xf5, 0xf, 0xf5, + 0xf, 0xf4, 0xf, 0xf4, 0xf, 0xf3, 0xf, 0xf3, + 0x1, 0x10, + + /* U+0028 "(" */ + 0x0, 0x0, 0xdf, 0xe0, 0x0, 0x5, 0xff, 0x60, + 0x0, 0xd, 0xfe, 0x0, 0x0, 0x4f, 0xf7, 0x0, + 0x0, 0xaf, 0xf2, 0x0, 0x0, 0xff, 0xd0, 0x0, + 0x4, 0xff, 0x80, 0x0, 0x7, 0xff, 0x50, 0x0, + 0xa, 0xff, 0x20, 0x0, 0xd, 0xff, 0x0, 0x0, + 0xf, 0xfd, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, + 0x1f, 0xfc, 0x0, 0x0, 0x2f, 0xfb, 0x0, 0x0, + 0x2f, 0xfb, 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x0, + 0xf, 0xfc, 0x0, 0x0, 0xf, 0xfd, 0x0, 0x0, + 0xd, 0xff, 0x0, 0x0, 0xa, 0xff, 0x20, 0x0, + 0x7, 0xff, 0x50, 0x0, 0x4, 0xff, 0x80, 0x0, + 0x0, 0xef, 0xd0, 0x0, 0x0, 0xaf, 0xf2, 0x0, + 0x0, 0x4f, 0xf7, 0x0, 0x0, 0xd, 0xfe, 0x0, + 0x0, 0x5, 0xff, 0x60, 0x0, 0x0, 0xdf, 0xe0, + + /* U+0029 ")" */ + 0xc, 0xfe, 0x0, 0x0, 0x5, 0xff, 0x70, 0x0, + 0x0, 0xdf, 0xf1, 0x0, 0x0, 0x6f, 0xf6, 0x0, + 0x0, 0x1f, 0xfc, 0x0, 0x0, 0xb, 0xff, 0x10, + 0x0, 0x6, 0xff, 0x60, 0x0, 0x3, 0xff, 0x90, + 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, 0xdf, 0xf0, + 0x0, 0x0, 0xbf, 0xf1, 0x0, 0x0, 0xaf, 0xf2, + 0x0, 0x0, 0x9f, 0xf3, 0x0, 0x0, 0x8f, 0xf4, + 0x0, 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x9f, 0xf3, + 0x0, 0x0, 0xaf, 0xf2, 0x0, 0x0, 0xbf, 0xf1, + 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, 0xff, 0xc0, + 0x0, 0x3, 0xff, 0x90, 0x0, 0x6, 0xff, 0x60, + 0x0, 0xb, 0xff, 0x10, 0x0, 0x1f, 0xfc, 0x0, + 0x0, 0x6f, 0xf6, 0x0, 0x0, 0xdf, 0xe1, 0x0, + 0x5, 0xff, 0x70, 0x0, 0xc, 0xfe, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0xe, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xe0, 0x0, 0x0, 0xc, 0x70, 0xe, 0xe0, + 0x7, 0xc0, 0x3f, 0xfe, 0x5e, 0xe5, 0xef, 0xf3, + 0x2, 0xaf, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x4, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0x0, 0x3e, 0xff, 0x7e, 0xe7, 0xff, 0xe3, + 0xd, 0xa1, 0xe, 0xe0, 0x1a, 0xd0, 0x0, 0x0, + 0xe, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x56, 0x66, 0x6b, 0xff, 0x66, 0x66, 0x62, 0x0, + 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, + 0x0, 0x0, + + /* U+002C "," */ + 0x1, 0x41, 0x3, 0xff, 0xe1, 0x8f, 0xff, 0x55, + 0xff, 0xf4, 0x9, 0xff, 0x0, 0x8f, 0xa0, 0xc, + 0xf5, 0x0, 0xff, 0x0, 0x4f, 0xa0, 0x0, + + /* U+002D "-" */ + 0x27, 0x77, 0x77, 0x77, 0x64, 0xff, 0xff, 0xff, + 0xfc, 0x4f, 0xff, 0xff, 0xff, 0xc0, + + /* U+002E "." */ + 0x0, 0x0, 0x1, 0xdf, 0xb0, 0x8f, 0xff, 0x58, + 0xff, 0xf4, 0x1b, 0xf9, 0x0, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x3, 0x9d, 0xff, 0xd9, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, 0xbb, 0xef, + 0xff, 0xc0, 0x0, 0x0, 0xaf, 0xfe, 0x50, 0x0, + 0x5, 0xef, 0xfa, 0x0, 0x4, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x40, 0xb, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xb0, 0xf, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x4f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf4, + 0x6f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf6, 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf8, 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf8, 0x8f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf8, 0x6f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf6, 0x4f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf4, 0xf, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0xb, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x7, 0xff, 0xb0, + 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x40, 0x0, 0xaf, 0xfe, 0x50, 0x0, 0x4, 0xef, + 0xfa, 0x0, 0x0, 0xc, 0xff, 0xfe, 0xbb, 0xef, + 0xff, 0xc0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x3, 0x9d, + 0xff, 0xda, 0x30, 0x0, 0x0, + + /* U+0031 "1" */ + 0xcf, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0x79, 0x99, 0x9f, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, + + /* U+0032 "2" */ + 0x0, 0x1, 0x6b, 0xdf, 0xfe, 0xb6, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x1c, 0xff, 0xff, 0xcb, 0xbd, 0xff, 0xff, + 0x30, 0x3, 0xef, 0xe5, 0x0, 0x0, 0x4, 0xdf, + 0xfd, 0x0, 0x2, 0xa1, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfd, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x10, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, + + /* U+0033 "3" */ + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0x99, 0x99, 0x99, 0x99, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xfd, 0x80, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x11, 0x13, 0x8e, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, + 0x8, 0x30, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf7, + 0x4f, 0xfa, 0x30, 0x0, 0x0, 0x1a, 0xff, 0xf1, + 0x9f, 0xff, 0xfe, 0xca, 0xbd, 0xff, 0xff, 0x50, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x4, 0x8c, 0xef, 0xfd, 0xb6, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x33, 0x20, 0x0, 0x0, 0x0, 0x7f, + 0xfc, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x3f, 0xfe, 0x20, 0x0, 0x1, 0xff, 0xb0, 0x0, + 0x0, 0x1e, 0xff, 0x40, 0x0, 0x0, 0x1f, 0xfb, + 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, 0x0, 0x1, + 0xff, 0xb0, 0x0, 0x8, 0xff, 0xf9, 0x99, 0x99, + 0x99, 0x9f, 0xfe, 0x99, 0x96, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x1f, 0xfd, 0x99, 0x99, 0x99, 0x99, + 0x90, 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xfe, 0xb8, 0x20, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x89, 0x99, + 0x9a, 0xbd, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x8f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x5, 0x70, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfc, + 0x0, 0xef, 0xd5, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x60, 0x3f, 0xff, 0xff, 0xdb, 0xac, 0xff, 0xff, + 0xa0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xfe, 0xc8, + 0x20, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xc9, 0x40, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x8, 0xff, 0xff, 0xca, 0x99, 0xcf, + 0xe0, 0x0, 0x6, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x13, 0x0, 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf8, 0x1, 0x7c, + 0xef, 0xec, 0x71, 0x0, 0x8, 0xff, 0x75, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0x8f, 0xfb, 0xff, + 0xea, 0x77, 0x9e, 0xff, 0xf5, 0x8, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x9, 0xff, 0xe0, 0x7f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x65, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf9, 0x1f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x3, 0xff, 0xa0, + 0xdf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x50, 0xd, 0xff, 0xa0, 0x0, 0x0, 0x9, 0xff, + 0xd0, 0x0, 0x2e, 0xff, 0xea, 0x77, 0x9e, 0xff, + 0xf3, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x0, 0x4, 0x9d, 0xff, 0xeb, + 0x60, 0x0, 0x0, + + /* U+0037 "7" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x1f, 0xfe, 0x99, 0x99, 0x99, 0x99, 0x9e, + 0xff, 0x81, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf1, 0x1f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xfa, 0x1, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x20, 0x5, 0x54, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x39, 0xce, 0xfe, 0xda, 0x50, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0xdf, 0xff, 0xb8, 0x78, 0xaf, 0xff, + 0xf3, 0x0, 0x7f, 0xfe, 0x30, 0x0, 0x0, 0x1a, + 0xff, 0xc0, 0xc, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x10, 0xef, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf3, 0xc, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x10, 0x7f, 0xfc, 0x10, 0x0, + 0x0, 0x8, 0xff, 0xb0, 0x0, 0xbf, 0xff, 0x96, + 0x45, 0x8d, 0xff, 0xe2, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x7f, 0xff, + 0x93, 0x10, 0x3, 0x7e, 0xff, 0xb0, 0x2f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x67, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0xaf, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xc1, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x7, 0xff, + 0xf5, 0x5, 0xff, 0xff, 0xa7, 0x67, 0x9e, 0xff, + 0xf9, 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x59, 0xde, 0xfe, 0xdb, + 0x61, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x38, 0xde, 0xfe, 0xc7, 0x10, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb7, 0x78, 0xcf, + 0xff, 0x80, 0x0, 0x6, 0xff, 0xd2, 0x0, 0x0, + 0x3, 0xdf, 0xf5, 0x0, 0xd, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x2f, 0xfe, 0x0, 0xf, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, 0x1f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x90, 0xf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, + 0xb, 0xff, 0x90, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf0, 0x3, 0xff, 0xfb, 0x41, 0x1, 0x5c, 0xff, + 0xff, 0xf0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xf0, 0x0, 0x3, 0xbf, 0xff, 0xff, + 0xfb, 0x30, 0xff, 0xf0, 0x0, 0x0, 0x1, 0x46, + 0x64, 0x10, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xf9, + 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xd0, 0x0, 0x0, 0x7f, 0xeb, 0xa9, 0xae, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, + 0xec, 0x82, 0x0, 0x0, 0x0, + + /* U+003A ":" */ + 0x1b, 0xfa, 0x8, 0xff, 0xf4, 0x8f, 0xff, 0x51, + 0xdf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xfb, + 0x8, 0xff, 0xf5, 0x8f, 0xff, 0x41, 0xbf, 0x90, + + /* U+003B ";" */ + 0x1b, 0xfa, 0x8, 0xff, 0xf4, 0x8f, 0xff, 0x51, + 0xdf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, + 0x7, 0xff, 0xf4, 0x7f, 0xff, 0x51, 0xcf, 0xf1, + 0x7, 0xfc, 0x0, 0xbf, 0x70, 0xf, 0xf1, 0x3, + 0xfc, 0x0, 0x25, 0x20, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xa6, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xdf, 0xf7, 0x0, 0x0, 0x0, + 0x4b, 0xff, 0xff, 0xc3, 0x0, 0x2, 0x8e, 0xff, + 0xfe, 0x93, 0x0, 0x5, 0xbf, 0xff, 0xfb, 0x50, + 0x0, 0x0, 0xef, 0xff, 0xd7, 0x10, 0x0, 0x0, + 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x6, + 0xcf, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x3, + 0x9f, 0xff, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x5c, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x28, 0xef, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+003D "=" */ + 0x56, 0x66, 0x66, 0x66, 0x66, 0x66, 0x62, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x52, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + + /* U+003E ">" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfd, + 0x71, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, + 0xb4, 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xf7, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xf6, 0x0, + 0x0, 0x17, 0xdf, 0xff, 0xf9, 0x30, 0x0, 0x5b, + 0xff, 0xff, 0xc5, 0x0, 0x0, 0x8e, 0xff, 0xfe, + 0x82, 0x0, 0x0, 0x0, 0xff, 0xfb, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xe8, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+003F "?" */ + 0x0, 0x2, 0x7b, 0xdf, 0xfe, 0xb7, 0x10, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x1d, 0xff, 0xfe, 0xa9, 0x9c, 0xff, 0xff, 0x40, + 0x6f, 0xfd, 0x40, 0x0, 0x0, 0x2d, 0xff, 0xd0, + 0x3, 0xa0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x43, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xc6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xf9, 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xdf, 0xff, + 0xeb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xcf, 0xfe, 0x94, 0x20, 0x0, 0x14, 0x7c, 0xff, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xf8, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf8, 0x0, + 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, 0x2, 0x44, + 0x20, 0x0, 0x25, 0x50, 0x5f, 0xf4, 0x0, 0x0, + 0xcf, 0xc0, 0x0, 0x0, 0x7d, 0xff, 0xff, 0xd6, + 0x9, 0xff, 0x0, 0x7f, 0xe0, 0x0, 0x4f, 0xf2, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xfb, 0x9f, + 0xf0, 0x0, 0xcf, 0x70, 0xb, 0xfa, 0x0, 0x0, + 0xcf, 0xfc, 0x51, 0x2, 0x7e, 0xff, 0xff, 0x0, + 0x5, 0xfd, 0x0, 0xff, 0x40, 0x0, 0x7f, 0xfa, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf0, 0x0, 0xe, + 0xf2, 0x4f, 0xf0, 0x0, 0xe, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0xbf, 0x56, + 0xfc, 0x0, 0x3, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf0, 0x0, 0x8, 0xf7, 0x8f, 0xa0, + 0x0, 0x5f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x0, 0x0, 0x7f, 0x88, 0xfa, 0x0, 0x6, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf0, + 0x0, 0x7, 0xf8, 0x8f, 0xa0, 0x0, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x0, 0x0, + 0x8f, 0x76, 0xfc, 0x0, 0x1, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf0, 0x0, 0xa, 0xf5, + 0x3f, 0xf0, 0x0, 0xc, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x0, 0x0, 0xef, 0x20, 0xff, + 0x40, 0x0, 0x4f, 0xfd, 0x20, 0x0, 0x0, 0x5f, + 0xff, 0xf3, 0x0, 0x6f, 0xd0, 0xa, 0xfa, 0x0, + 0x0, 0x9f, 0xff, 0x95, 0x46, 0xbf, 0xf9, 0xff, + 0xc5, 0x7f, 0xf5, 0x0, 0x4f, 0xf2, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xf6, 0xc, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0xbf, 0xc0, 0x0, 0x0, 0x29, + 0xdf, 0xfd, 0x82, 0x0, 0x19, 0xef, 0xd6, 0x0, + 0x0, 0x2, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xfe, 0x95, 0x21, 0x1, 0x36, 0xaf, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, + 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xcd, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf5, 0x7f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x1, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x70, 0x9, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, 0x0, 0x2f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfa, 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x30, 0x0, 0x4, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xc0, + 0x0, 0x0, 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf5, 0x0, 0x0, 0x0, 0x6f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xb6, 0x66, 0x66, 0x66, 0x6c, 0xff, 0x90, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0xf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xe0, 0x0, 0x7, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x60, 0x0, + 0xef, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfd, 0x0, 0x5f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf4, 0xc, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xc0, + + /* U+0042 "B" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xa6, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0x0, 0xdf, 0xf8, 0x66, 0x66, 0x66, + 0x8b, 0xff, 0xff, 0x30, 0xd, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xfb, 0x0, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0xd, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf9, 0x0, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x14, 0xaf, 0xfe, 0x10, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, + 0xd, 0xff, 0x86, 0x66, 0x66, 0x67, 0x8b, 0xff, + 0xfb, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xf8, 0xd, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf0, 0xdf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x2d, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x1d, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xb0, 0xdf, 0xf8, 0x66, 0x66, 0x66, + 0x78, 0xbf, 0xff, 0xf2, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xda, 0x50, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x5, 0x9d, 0xff, 0xed, 0xa5, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xe6, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xfe, 0xba, 0xbd, 0xff, 0xff, 0xa0, 0x0, 0x1d, + 0xff, 0xfb, 0x30, 0x0, 0x0, 0x29, 0xff, 0xf3, + 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0x40, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0x40, 0x0, 0x1d, 0xff, 0xfa, 0x30, 0x0, + 0x0, 0x29, 0xff, 0xf3, 0x0, 0x1, 0xbf, 0xff, + 0xfe, 0xba, 0xbd, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xed, 0x95, + 0x0, 0x0, + + /* U+0044 "D" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xec, 0x94, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x50, 0x0, 0x0, 0xdf, 0xfa, 0x99, + 0x99, 0x9a, 0xce, 0xff, 0xff, 0xa0, 0x0, 0xd, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, + 0xb0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x80, 0xd, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x20, 0xdf, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf9, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xe0, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x2d, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf4, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x5d, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf4, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x2d, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xe0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf9, 0xd, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x20, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x80, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x4, 0xbf, 0xff, 0xb0, 0x0, 0xdf, 0xfa, 0x99, + 0x99, 0x9a, 0xce, 0xff, 0xff, 0xa0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xec, + 0x94, 0x0, 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xdf, 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x90, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xdf, 0xf9, 0x88, 0x88, 0x88, 0x88, 0x86, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x93, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+0046 "F" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9d, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0xdf, 0xfa, 0x99, 0x99, 0x99, 0x99, + 0x96, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xed, 0xa6, + 0x10, 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xfe, 0xca, 0xbd, 0xff, 0xff, 0xd1, 0x0, 0xc, + 0xff, 0xfb, 0x30, 0x0, 0x0, 0x17, 0xef, 0xf6, + 0x0, 0xaf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x1b, 0x70, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2a, 0xa5, 0x8f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x2f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf9, 0xc, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x4, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, + 0x0, 0xaf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0xc, 0xff, 0xfb, 0x30, 0x0, + 0x0, 0x5, 0xdf, 0xf9, 0x0, 0x1, 0xbf, 0xff, + 0xfe, 0xba, 0xbc, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x5, 0x9d, 0xff, 0xed, 0xa6, + 0x10, 0x0, + + /* U+0048 "H" */ + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x3d, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3d, 0xff, 0xa9, 0x99, 0x99, 0x99, 0x99, 0x99, + 0xef, 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x30, + + /* U+0049 "I" */ + 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, + 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, + 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, + 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, + 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, + 0xdf, 0xf2, + + /* U+004A "J" */ + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x19, + 0x99, 0x99, 0x99, 0xdf, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x1, 0xb1, 0x0, 0x0, 0x1, 0xff, 0xf2, 0xc, + 0xfd, 0x20, 0x0, 0xa, 0xff, 0xd0, 0xc, 0xff, + 0xfc, 0x99, 0xef, 0xff, 0x50, 0x1, 0xaf, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x4, 0xad, 0xff, + 0xd9, 0x20, 0x0, + + /* U+004B "K" */ + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xf7, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xf8, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xf9, 0x0, 0xd, 0xff, 0x20, 0x0, + 0x0, 0x0, 0xcf, 0xfa, 0x0, 0x0, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0xcf, 0xfa, 0x0, 0x0, 0xd, + 0xff, 0x20, 0x0, 0x0, 0xcf, 0xfb, 0x0, 0x0, + 0x0, 0xdf, 0xf2, 0x0, 0x0, 0xbf, 0xfc, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0xbf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0xaf, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, + 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf2, 0xaf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xbf, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0x35, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, 0x7, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x30, + 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0xd, 0xff, + 0x40, 0x0, 0x0, 0xb, 0xff, 0xe1, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, + 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xa0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x70, 0xd, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x20, + + /* U+004C "L" */ + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x5d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+004D "M" */ + 0xdf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x7d, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf7, 0xdf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x7d, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf7, 0xdf, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0x7d, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xf7, 0xdf, 0xf9, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, 0xff, + 0x7d, 0xff, 0x1e, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x6f, 0xf8, 0x6f, 0xf7, 0xdf, 0xf0, 0x5f, 0xfa, + 0x0, 0x0, 0x0, 0xe, 0xfe, 0x6, 0xff, 0x7d, + 0xff, 0x0, 0xbf, 0xf3, 0x0, 0x0, 0x8, 0xff, + 0x50, 0x6f, 0xf7, 0xdf, 0xf0, 0x2, 0xff, 0xd0, + 0x0, 0x2, 0xff, 0xb0, 0x6, 0xff, 0x7d, 0xff, + 0x0, 0x8, 0xff, 0x60, 0x0, 0xbf, 0xf2, 0x0, + 0x6f, 0xf7, 0xdf, 0xf0, 0x0, 0xe, 0xff, 0x10, + 0x4f, 0xf8, 0x0, 0x6, 0xff, 0x7d, 0xff, 0x0, + 0x0, 0x5f, 0xf9, 0xd, 0xfe, 0x0, 0x0, 0x6f, + 0xf7, 0xdf, 0xf0, 0x0, 0x0, 0xbf, 0xfa, 0xff, + 0x50, 0x0, 0x6, 0xff, 0x7d, 0xff, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x6f, 0xf7, + 0xdf, 0xf0, 0x0, 0x0, 0x8, 0xff, 0xf2, 0x0, + 0x0, 0x6, 0xff, 0x7d, 0xff, 0x0, 0x0, 0x0, + 0xe, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xf7, 0xdf, + 0xf0, 0x0, 0x0, 0x0, 0x37, 0x0, 0x0, 0x0, + 0x6, 0xff, 0x7d, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf7, 0xdf, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0x70, + + /* U+004E "N" */ + 0xdf, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x3d, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf3, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0xc, 0xff, 0x3d, + 0xff, 0xdf, 0xfe, 0x10, 0x0, 0x0, 0x0, 0xcf, + 0xf3, 0xdf, 0xf3, 0xdf, 0xfc, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x3d, 0xff, 0x22, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xf2, 0x5, 0xff, + 0xf7, 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, 0x20, + 0x8, 0xff, 0xf4, 0x0, 0x0, 0xcf, 0xf3, 0xdf, + 0xf2, 0x0, 0xb, 0xff, 0xe2, 0x0, 0xc, 0xff, + 0x3d, 0xff, 0x20, 0x0, 0xd, 0xff, 0xd0, 0x0, + 0xcf, 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x2f, 0xff, + 0xa0, 0xc, 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, + 0x4f, 0xff, 0x70, 0xcf, 0xf3, 0xdf, 0xf2, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x4c, 0xff, 0x3d, 0xff, + 0x20, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0xef, 0xf3, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x3d, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfd, 0xa6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfe, 0xba, 0xbd, 0xff, 0xff, + 0xd2, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa3, 0x0, + 0x0, 0x2, 0x8f, 0xff, 0xe2, 0x0, 0x0, 0xaf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xd0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x80, 0xc, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf5, 0x5f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x98, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xfb, 0x8f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb8, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfb, 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x92, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf5, 0xc, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x0, 0x4f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x80, + 0x0, 0xaf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xd0, 0x0, 0x0, 0xcf, 0xff, 0xa3, + 0x0, 0x0, 0x2, 0x8f, 0xff, 0xe2, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xfe, 0xba, 0xbd, 0xff, 0xff, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x9d, 0xff, 0xfd, 0xa6, 0x10, 0x0, + 0x0, 0x0, + + /* U+0050 "P" */ + 0xdf, 0xff, 0xff, 0xff, 0xfe, 0xd9, 0x40, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0xdf, 0xfa, 0x99, 0x99, 0x9a, 0xdf, + 0xff, 0xf4, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x3, 0xcf, 0xff, 0x10, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x90, 0xdf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0xdf, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xc0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0x60, 0xdf, 0xf2, 0x0, 0x0, 0x1, + 0x49, 0xff, 0xfc, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0xdf, 0xfa, + 0x99, 0x99, 0x98, 0x63, 0x0, 0x0, 0x0, 0xdf, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfd, 0xa6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xfe, 0xba, 0xbd, 0xff, + 0xff, 0xd2, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, + 0x30, 0x0, 0x0, 0x29, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0xaf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xd0, 0x0, 0x4, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, + 0xc, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfe, 0x0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x50, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x80, 0x7f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xb0, + 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xb0, 0x8f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, + 0x6f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x90, 0x2f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x50, + 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x0, 0x6, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf8, 0x0, + 0x0, 0xcf, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xd0, 0x0, 0x0, 0x1e, 0xff, 0xf9, + 0x20, 0x0, 0x0, 0x17, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xfd, 0xa9, 0xac, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xff, 0xe6, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, 0x2, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x92, 0x2, 0x7f, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x54, 0x0, 0x0, + + /* U+0052 "R" */ + 0xdf, 0xff, 0xff, 0xff, 0xfe, 0xd9, 0x40, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0xdf, 0xfa, 0x99, 0x99, 0x9a, 0xdf, + 0xff, 0xf4, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x3, 0xcf, 0xff, 0x10, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x90, 0xdf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0xdf, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xc0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x60, 0xdf, 0xf2, 0x0, 0x0, 0x1, + 0x49, 0xff, 0xfc, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0xdf, 0xf9, + 0x88, 0x88, 0x89, 0xff, 0xd0, 0x0, 0x0, 0xdf, + 0xf2, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, + 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xe1, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xfb, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x60, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf2, + + /* U+0053 "S" */ + 0x0, 0x0, 0x38, 0xce, 0xff, 0xeb, 0x72, 0x0, + 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x1, 0xef, 0xff, 0xc9, 0x89, 0xbe, 0xff, + 0xf4, 0x0, 0xaf, 0xfc, 0x20, 0x0, 0x0, 0x3, + 0xad, 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x61, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xfd, 0x95, 0x10, 0x0, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xae, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x7c, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf5, + 0x9, 0x20, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x35, 0xff, 0x92, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xc0, 0x7f, 0xff, 0xfe, 0xb9, 0x89, 0xcf, 0xff, + 0xf3, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc3, 0x0, 0x0, 0x3, 0x7b, 0xdf, 0xfe, 0xd9, + 0x40, 0x0, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x89, 0x99, 0x99, 0x9d, 0xff, 0xb9, + 0x99, 0x99, 0x94, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x40, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xb0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xfb, 0xf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xb0, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, 0xf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfb, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xb0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfb, 0xf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, 0xf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xb0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfb, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xa0, 0xef, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf9, 0xb, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x70, 0x7f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf3, + 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfc, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0x40, 0x0, 0xb, 0xff, 0xff, 0xca, + 0xbd, 0xff, 0xff, 0x70, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, + 0x2, 0x8c, 0xef, 0xfe, 0xa6, 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xc, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x20, 0x5f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, + 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf4, 0x0, 0x7, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xfd, 0x0, 0x0, 0x1f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x60, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x2, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xfe, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x0, 0xcf, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xc0, + 0x0, 0x0, 0x4f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x30, 0x0, 0xb, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, 0x0, + 0x2, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf2, 0x0, 0x9f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x80, 0x1f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x7, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf7, 0xef, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0057 "W" */ + 0xe, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xa0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf4, 0x3, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xa0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xdf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf4, 0x0, 0x3, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x4f, 0xf7, 0xaf, 0xf3, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x0, 0x0, 0xd, 0xff, 0x30, 0x0, + 0x0, 0xa, 0xff, 0x24, 0xff, 0x90, 0x0, 0x0, + 0x3, 0xff, 0xa0, 0x0, 0x0, 0x8f, 0xf8, 0x0, + 0x0, 0x0, 0xff, 0xc0, 0xe, 0xfe, 0x0, 0x0, + 0x0, 0x8f, 0xf4, 0x0, 0x0, 0x3, 0xff, 0xd0, + 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x9f, 0xf4, 0x0, + 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x30, 0x0, 0xa, 0xff, 0x10, 0x4, 0xff, 0x90, + 0x0, 0x3, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x8f, + 0xf8, 0x0, 0x0, 0xff, 0xc0, 0x0, 0xe, 0xfe, + 0x0, 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xd0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x9f, + 0xf4, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x30, 0xb, 0xff, 0x10, 0x0, 0x4, + 0xff, 0x90, 0x3, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xf8, 0x1, 0xff, 0xc0, 0x0, 0x0, + 0xe, 0xfe, 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xd0, 0x6f, 0xf6, 0x0, 0x0, + 0x0, 0x9f, 0xf4, 0xe, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x3b, 0xff, 0x10, 0x0, + 0x0, 0x3, 0xff, 0xa4, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xfa, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xe, 0xfe, 0x9f, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xd0, 0x1, 0xef, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x30, 0x0, 0x5f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0xcf, 0xf6, 0x0, 0x0, 0x9, + 0xff, 0xd0, 0x0, 0x0, 0x8, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x4f, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x40, 0x1, + 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xe1, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x6f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xfd, 0xcf, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf3, 0x2f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x70, 0x6, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfc, 0x0, 0x0, 0xaf, 0xfc, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, 0xd, 0xff, + 0x80, 0x0, 0x0, 0x1e, 0xff, 0x50, 0x0, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0xcf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x10, 0x8, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, + 0x4f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xf6, + + /* U+0059 "Y" */ + 0xc, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x30, 0x3f, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, 0x9f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xe1, 0x0, + 0x1, 0xef, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf6, 0x0, 0x0, 0x6, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x60, 0x0, 0x0, 0xc, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x10, 0x0, 0x6, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, 0x0, 0x1, + 0xef, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf4, 0x0, 0xaf, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xd0, 0x3f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x7d, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x49, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x9d, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xc9, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x98, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+005B "[" */ + 0xdf, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf6, 0xdf, + 0xf6, 0x55, 0x2d, 0xff, 0x0, 0x0, 0xdf, 0xf0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0xdf, 0xf0, 0x0, + 0xd, 0xff, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0xd, 0xff, + 0x0, 0x0, 0xdf, 0xf0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0xdf, 0xf0, 0x0, 0xd, 0xff, 0x0, 0x0, + 0xdf, 0xf0, 0x0, 0xd, 0xff, 0x0, 0x0, 0xdf, + 0xf0, 0x0, 0xd, 0xff, 0x0, 0x0, 0xdf, 0xf0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0xdf, 0xf0, 0x0, + 0xd, 0xff, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0xd, + 0xff, 0x65, 0x52, 0xdf, 0xff, 0xff, 0x6d, 0xff, + 0xff, 0xf6, + + /* U+005C "\\" */ + 0xe, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xf3, + + /* U+005D "]" */ + 0x7f, 0xff, 0xff, 0xd7, 0xff, 0xff, 0xfd, 0x25, + 0x56, 0xff, 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, + 0xff, 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, 0xff, + 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, 0xff, 0xd0, + 0x0, 0xf, 0xfd, 0x0, 0x0, 0xff, 0xd0, 0x0, + 0xf, 0xfd, 0x0, 0x0, 0xff, 0xd0, 0x0, 0xf, + 0xfd, 0x0, 0x0, 0xff, 0xd0, 0x0, 0xf, 0xfd, + 0x0, 0x0, 0xff, 0xd0, 0x0, 0xf, 0xfd, 0x0, + 0x0, 0xff, 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, + 0xff, 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, 0xff, + 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, 0xff, 0xd2, + 0x55, 0x6f, 0xfd, 0x7f, 0xff, 0xff, 0xd7, 0xff, + 0xff, 0xfd, + + /* U+005E "^" */ + 0x0, 0x0, 0x4, 0x87, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0x8f, 0xf3, 0x0, 0x0, 0x0, 0x2, 0xff, 0x19, + 0xfa, 0x0, 0x0, 0x0, 0x9, 0xfa, 0x2, 0xff, + 0x10, 0x0, 0x0, 0xf, 0xf4, 0x0, 0xbf, 0x70, + 0x0, 0x0, 0x6f, 0xd0, 0x0, 0x5f, 0xe0, 0x0, + 0x0, 0xdf, 0x60, 0x0, 0xe, 0xf5, 0x0, 0x4, + 0xff, 0x0, 0x0, 0x8, 0xfc, 0x0, 0xb, 0xf9, + 0x0, 0x0, 0x1, 0xff, 0x20, 0x2f, 0xf2, 0x0, + 0x0, 0x0, 0xaf, 0x90, 0x8f, 0xc0, 0x0, 0x0, + 0x0, 0x4f, 0xf1, + + /* U+005F "_" */ + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x1c, 0xff, 0xa0, 0x0, 0x0, 0x9, 0xff, 0xa0, + 0x0, 0x0, 0x5, 0xff, 0xb0, 0x0, 0x0, 0x3, + 0xef, 0xb0, + + /* U+0061 "a" */ + 0x0, 0x4, 0x9d, 0xef, 0xec, 0x82, 0x0, 0x0, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xc, + 0xff, 0xea, 0x88, 0x9e, 0xff, 0xf4, 0x0, 0x3e, + 0x50, 0x0, 0x0, 0xa, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf4, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x19, 0xff, 0x50, 0x2, 0x9d, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x51, 0xff, 0xf8, 0x20, 0x0, + 0x0, 0x8f, 0xf5, 0x6f, 0xf9, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x57, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xbf, 0xf5, 0x5f, 0xfa, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x50, 0xef, 0xf9, 0x31, 0x14, 0xaf, 0xff, + 0xf5, 0x3, 0xef, 0xff, 0xff, 0xff, 0xd8, 0xff, + 0x50, 0x1, 0x8c, 0xff, 0xec, 0x70, 0x6f, 0xf5, + + /* U+0062 "b" */ + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, + 0x1, 0x8c, 0xef, 0xea, 0x50, 0x0, 0x0, 0x4f, + 0xf9, 0x5f, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x4f, 0xfd, 0xff, 0xfb, 0x99, 0xcf, 0xff, 0xf2, + 0x0, 0x4f, 0xff, 0xfb, 0x10, 0x0, 0x2, 0xcf, + 0xfd, 0x0, 0x4f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x70, 0x4f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xd0, 0x4f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf1, 0x4f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x4f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x4f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, + 0x4f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xd0, 0x4f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x70, 0x4f, 0xff, 0xfb, 0x10, 0x0, 0x2, + 0xcf, 0xfd, 0x0, 0x4f, 0xfc, 0xff, 0xfb, 0x89, + 0xbf, 0xff, 0xf2, 0x0, 0x4f, 0xf7, 0x5f, 0xff, + 0xff, 0xff, 0xfd, 0x20, 0x0, 0x4f, 0xf7, 0x1, + 0x8c, 0xff, 0xda, 0x40, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x17, 0xce, 0xfe, 0xc7, 0x10, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x8f, 0xff, 0xea, 0x89, 0xdf, 0xff, 0x70, + 0x5, 0xff, 0xf7, 0x0, 0x0, 0x5, 0xff, 0xc0, + 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x46, 0x0, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x46, 0x0, + 0x5, 0xff, 0xf6, 0x0, 0x0, 0x5, 0xff, 0xc0, + 0x0, 0x8f, 0xff, 0xea, 0x89, 0xdf, 0xff, 0x70, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x17, 0xce, 0xfe, 0xc8, 0x20, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfb, 0x0, 0x0, 0x28, 0xdf, 0xfe, + 0xa4, 0x2, 0xff, 0xb0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xfb, 0x3f, 0xfb, 0x0, 0xaf, 0xff, 0xea, + 0x8a, 0xef, 0xfd, 0xff, 0xb0, 0x7f, 0xff, 0x70, + 0x0, 0x0, 0x6f, 0xff, 0xfb, 0x1f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb6, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x9f, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xbb, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, 0xbf, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xb9, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, + 0x6f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xb1, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfb, 0x7, 0xff, 0xe4, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xb0, 0xa, 0xff, 0xfb, 0x75, 0x7b, 0xff, + 0xdf, 0xfb, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0xff, 0xb0, 0x0, 0x2, 0x8c, 0xef, 0xea, + 0x50, 0xf, 0xfb, + + /* U+0065 "e" */ + 0x0, 0x0, 0x28, 0xdf, 0xfe, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0xaf, 0xff, 0xb7, 0x79, 0xef, 0xfe, + 0x20, 0x0, 0x6f, 0xfd, 0x20, 0x0, 0x0, 0x8f, + 0xfc, 0x0, 0xf, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x9f, 0xf5, 0x5, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xb0, 0x9f, 0xf4, 0x11, 0x11, 0x11, + 0x11, 0x1c, 0xfe, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x19, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x6, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x8f, 0x40, 0x0, 0x9, + 0xff, 0xfe, 0xa8, 0x8b, 0xff, 0xfd, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x1, 0x7b, 0xef, 0xfd, 0x94, 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x5, 0xbe, 0xfd, 0x92, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xf6, 0x0, 0x5, 0xff, 0xf8, + 0x68, 0xc0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x36, 0x6e, 0xff, 0x66, 0x66, 0x30, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x28, 0xce, 0xfe, 0xb5, 0x0, 0xcf, + 0xf0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x2c, + 0xff, 0x0, 0xbf, 0xff, 0xea, 0x89, 0xcf, 0xfe, + 0xef, 0xf0, 0x8f, 0xff, 0x60, 0x0, 0x0, 0x3d, + 0xff, 0xff, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xf6, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xaf, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfb, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xbf, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf8, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x4f, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, 0xdf, 0xfb, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x2, 0xff, + 0xfd, 0x62, 0x1, 0x4b, 0xff, 0xff, 0xf0, 0x4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xfe, 0x0, + 0x1, 0xaf, 0xff, 0xff, 0xfe, 0x50, 0xff, 0xe0, + 0x0, 0x0, 0x4, 0x67, 0x63, 0x0, 0xf, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xa0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf5, 0x2, 0xfd, 0x50, 0x0, 0x0, 0x1, 0xaf, + 0xfe, 0x0, 0xaf, 0xff, 0xfb, 0x98, 0x9b, 0xff, + 0xff, 0x40, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0x0, 0x0, 0x16, 0xad, 0xef, 0xfd, + 0xa6, 0x0, 0x0, + + /* U+0068 "h" */ + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x2, 0x8d, 0xef, 0xea, 0x40, 0x0, + 0x4f, 0xf9, 0x7f, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x4f, 0xfe, 0xff, 0xea, 0x9a, 0xef, 0xff, 0x90, + 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x7, 0xff, 0xf2, + 0x4f, 0xff, 0x80, 0x0, 0x0, 0x0, 0xaf, 0xf8, + 0x4f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, + 0x4f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, + 0x4f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + + /* U+0069 "i" */ + 0x2d, 0xe7, 0xb, 0xff, 0xf0, 0x9f, 0xfe, 0x1, + 0x9a, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xf9, 0x4, 0xff, 0x90, 0x4f, 0xf9, 0x4, 0xff, + 0x90, 0x4f, 0xf9, 0x4, 0xff, 0x90, 0x4f, 0xf9, + 0x4, 0xff, 0x90, 0x4f, 0xf9, 0x4, 0xff, 0x90, + 0x4f, 0xf9, 0x4, 0xff, 0x90, 0x4f, 0xf9, 0x4, + 0xff, 0x90, 0x4f, 0xf9, 0x4, 0xff, 0x90, + + /* U+006A "j" */ + 0x0, 0x0, 0x1, 0xcf, 0x90, 0x0, 0x0, 0x8, + 0xff, 0xf3, 0x0, 0x0, 0x7, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x8a, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, + 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, + 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, + 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, + 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, + 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, + 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, + 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, + 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, + 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, + 0x2, 0xff, 0xc0, 0x0, 0x0, 0x3, 0xff, 0xb0, + 0x0, 0x0, 0x8, 0xff, 0x80, 0x1e, 0x97, 0xaf, + 0xff, 0x20, 0x8f, 0xff, 0xff, 0xf7, 0x0, 0x3a, + 0xdf, 0xfb, 0x40, 0x0, + + /* U+006B "k" */ + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf4, 0x4, 0xff, 0x90, 0x0, 0x0, + 0x5, 0xff, 0xf4, 0x0, 0x4f, 0xf9, 0x0, 0x0, + 0x7, 0xff, 0xf4, 0x0, 0x4, 0xff, 0x90, 0x0, + 0x8, 0xff, 0xf4, 0x0, 0x0, 0x4f, 0xf9, 0x0, + 0x9, 0xff, 0xf3, 0x0, 0x0, 0x4, 0xff, 0x90, + 0xa, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x4f, 0xf9, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xbc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xdf, 0xff, 0x80, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xd1, 0x5f, 0xff, 0x50, 0x0, 0x0, + 0x4f, 0xff, 0xc0, 0x0, 0x8f, 0xff, 0x20, 0x0, + 0x4, 0xff, 0xc0, 0x0, 0x0, 0xbf, 0xfd, 0x0, + 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x1, 0xdf, 0xfa, + 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x2, 0xff, + 0xf7, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xe1, + + /* U+006C "l" */ + 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, + 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, + 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, + 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, + 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, + 0x4f, 0xf9, 0x4f, 0xf9, + + /* U+006D "m" */ + 0x4f, 0xf7, 0x3, 0x9d, 0xff, 0xd8, 0x20, 0x0, + 0x6, 0xbe, 0xfe, 0xc7, 0x0, 0x0, 0x4f, 0xf7, + 0x9f, 0xff, 0xff, 0xff, 0xf6, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x4f, 0xfe, 0xff, 0xc8, + 0x78, 0xef, 0xff, 0x8f, 0xff, 0xa7, 0x79, 0xff, + 0xfe, 0x10, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x1d, 0xff, 0x80, + 0x4f, 0xff, 0x60, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x4, 0xff, 0xd0, 0x4f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf0, 0x4f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf1, 0x4f, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x4f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf2, 0x4f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf2, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x4f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf2, 0x4f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf2, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, + + /* U+006E "n" */ + 0x4f, 0xf7, 0x3, 0x9d, 0xef, 0xea, 0x40, 0x0, + 0x4f, 0xf7, 0x9f, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x4f, 0xfe, 0xff, 0xd8, 0x77, 0xcf, 0xff, 0x90, + 0x4f, 0xff, 0xf6, 0x0, 0x0, 0x5, 0xff, 0xf2, + 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x9f, 0xf8, + 0x4f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, + 0x4f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, + 0x4f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + + /* U+006F "o" */ + 0x0, 0x0, 0x17, 0xce, 0xff, 0xc8, 0x10, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0xea, 0x8a, 0xef, 0xff, + 0xa0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, 0x6f, + 0xff, 0x60, 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x15, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf6, 0x9f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xab, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfc, 0xbf, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xc9, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfa, 0x5f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x60, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, 0x5, 0xff, + 0xf6, 0x0, 0x0, 0x5, 0xff, 0xf6, 0x0, 0x9, + 0xff, 0xfe, 0x98, 0x9d, 0xff, 0xf9, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x1, 0x7c, 0xef, 0xfc, 0x81, 0x0, 0x0, + + /* U+0070 "p" */ + 0x4f, 0xf7, 0x2, 0x8d, 0xef, 0xea, 0x50, 0x0, + 0x0, 0x4f, 0xf7, 0x7f, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0x4f, 0xfd, 0xff, 0xe9, 0x67, 0x9f, + 0xff, 0xf2, 0x0, 0x4f, 0xff, 0xf9, 0x0, 0x0, + 0x1, 0xbf, 0xfd, 0x0, 0x4f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x70, 0x4f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xd0, 0x4f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, 0x4f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, + 0x4f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf2, 0x4f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf1, 0x4f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xd0, 0x4f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x70, 0x4f, 0xff, 0xfb, 0x10, + 0x0, 0x2, 0xdf, 0xfd, 0x0, 0x4f, 0xfd, 0xff, + 0xfb, 0x89, 0xbf, 0xff, 0xf2, 0x0, 0x4f, 0xf9, + 0x5e, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x4f, + 0xf9, 0x1, 0x8c, 0xef, 0xda, 0x40, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x28, 0xdf, 0xfe, 0xa4, 0x0, 0xff, + 0xb0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfb, 0x1f, + 0xfb, 0x0, 0xaf, 0xff, 0xea, 0x8a, 0xef, 0xfc, + 0xff, 0xb0, 0x7f, 0xff, 0x60, 0x0, 0x0, 0x6f, + 0xff, 0xfb, 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xb6, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x9f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xbb, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfb, 0xbf, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xb9, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfb, 0x6f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xb1, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, 0x7, 0xff, + 0xf6, 0x0, 0x0, 0x6, 0xff, 0xff, 0xb0, 0xa, + 0xff, 0xfe, 0x98, 0x9d, 0xff, 0xdf, 0xfb, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xa3, 0xff, 0xb0, + 0x0, 0x2, 0x8c, 0xef, 0xea, 0x40, 0x2f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfb, + + /* U+0072 "r" */ + 0x4f, 0xf7, 0x2, 0x8d, 0xe4, 0x4f, 0xf7, 0x6f, + 0xff, 0xf4, 0x4f, 0xfc, 0xff, 0xfd, 0xc3, 0x4f, + 0xff, 0xfb, 0x20, 0x0, 0x4f, 0xff, 0xa0, 0x0, + 0x0, 0x4f, 0xff, 0x10, 0x0, 0x0, 0x4f, 0xfc, + 0x0, 0x0, 0x0, 0x4f, 0xfa, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, + 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x4f, + 0xf9, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, + 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x4f, 0xf9, + 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x1, 0x7b, 0xef, 0xfe, 0xb7, 0x20, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0x60, 0x2, + 0xff, 0xfd, 0x97, 0x79, 0xdf, 0xf1, 0x0, 0x9f, + 0xf9, 0x0, 0x0, 0x0, 0x35, 0x0, 0xb, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x63, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xc9, 0x40, 0x0, 0x0, 0x3, 0xae, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x1, 0x47, + 0xbf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf1, 0x6, 0xc4, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x0, 0xef, 0xfe, 0xa8, 0x78, 0xbf, 0xff, + 0x80, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x1, 0x7b, 0xdf, 0xfe, 0xc9, 0x30, 0x0, + + /* U+0074 "t" */ + 0x0, 0x6, 0x88, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x90, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x36, 0x6e, 0xff, 0x66, + 0x66, 0x30, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfa, 0x79, 0xe1, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x6, 0xcf, 0xfd, 0x81, + + /* U+0075 "u" */ + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, + 0x5f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf8, + 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf8, + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x2d, 0xff, 0xf8, + 0x3, 0xff, 0xfe, 0x86, 0x7a, 0xff, 0xef, 0xf8, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xfc, 0x4f, 0xf8, + 0x0, 0x1, 0x8c, 0xff, 0xeb, 0x50, 0x3f, 0xf8, + + /* U+0076 "v" */ + 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf9, 0x6, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf2, 0x0, 0xef, 0xf0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xb0, 0x0, 0x8f, 0xf6, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x40, 0x0, 0x1f, 0xfd, 0x0, + 0x0, 0x0, 0xe, 0xfd, 0x0, 0x0, 0xa, 0xff, + 0x40, 0x0, 0x0, 0x6f, 0xf6, 0x0, 0x0, 0x3, + 0xff, 0xb0, 0x0, 0x0, 0xdf, 0xe0, 0x0, 0x0, + 0x0, 0xcf, 0xf2, 0x0, 0x4, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x5f, 0xf8, 0x0, 0xb, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x2f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x60, 0x9f, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd1, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfb, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x94, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x5f, 0xf3, 0xe, 0xfc, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xfd, + 0x0, 0x8f, 0xf2, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x1, 0xff, 0x70, 0x2, 0xff, + 0x80, 0x0, 0x0, 0x5f, 0xf8, 0xff, 0x60, 0x0, + 0x0, 0x7f, 0xf2, 0x0, 0xc, 0xfe, 0x0, 0x0, + 0xb, 0xfd, 0xd, 0xfc, 0x0, 0x0, 0xd, 0xfb, + 0x0, 0x0, 0x6f, 0xf4, 0x0, 0x2, 0xff, 0x70, + 0x8f, 0xf2, 0x0, 0x3, 0xff, 0x60, 0x0, 0x1, + 0xff, 0xa0, 0x0, 0x8f, 0xf1, 0x2, 0xff, 0x80, + 0x0, 0x9f, 0xf0, 0x0, 0x0, 0xa, 0xff, 0x0, + 0xd, 0xfb, 0x0, 0xb, 0xfe, 0x0, 0xe, 0xfa, + 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x4, 0xff, 0x50, + 0x0, 0x5f, 0xf4, 0x5, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xef, 0xb0, 0xaf, 0xe0, 0x0, 0x0, 0xff, + 0x90, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x2f, 0xf9, 0x0, 0x0, 0x9, 0xff, 0x1f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0xff, 0x20, + 0x0, 0x0, 0x3f, 0xfc, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, + + /* U+0078 "x" */ + 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, 0xbf, 0xf6, + 0x0, 0x2f, 0xff, 0x20, 0x0, 0x0, 0x7f, 0xfa, + 0x0, 0x0, 0x5f, 0xfc, 0x0, 0x0, 0x3f, 0xfd, + 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x1e, 0xff, + 0x20, 0x0, 0x0, 0x0, 0xdf, 0xf5, 0xb, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf9, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfc, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfe, 0x10, 0x8f, 0xfa, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x40, 0x0, 0xbf, 0xf6, 0x0, 0x0, 0xa, + 0xff, 0x80, 0x0, 0x1, 0xef, 0xf3, 0x0, 0x6, + 0xff, 0xc0, 0x0, 0x0, 0x4, 0xff, 0xe1, 0x3, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x8, 0xff, 0xb0, + + /* U+0079 "y" */ + 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf9, 0x6, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf2, 0x0, 0xef, 0xf1, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xb0, 0x0, 0x8f, 0xf7, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x40, 0x0, 0x1f, 0xfd, 0x0, + 0x0, 0x0, 0xe, 0xfd, 0x0, 0x0, 0xa, 0xff, + 0x50, 0x0, 0x0, 0x6f, 0xf6, 0x0, 0x0, 0x3, + 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xe0, 0x0, 0x0, + 0x0, 0xcf, 0xf2, 0x0, 0x3, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x5f, 0xf9, 0x0, 0xa, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, 0x1f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x70, 0x8f, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, + 0xef, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfb, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x4, 0x0, 0x0, 0x6f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xe9, 0x7a, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbe, 0xfd, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x36, 0x66, + 0x66, 0x66, 0x6c, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x75, 0x55, 0x55, + 0x55, 0x52, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+007B "{" */ + 0x0, 0x0, 0x19, 0xef, 0xf0, 0x0, 0x1e, 0xff, + 0xff, 0x0, 0x9, 0xff, 0xe7, 0x50, 0x0, 0xcf, + 0xf4, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, + 0xef, 0xf0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, + 0x0, 0xef, 0xf0, 0x0, 0x0, 0xe, 0xff, 0x0, + 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, 0xe, 0xff, + 0x0, 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, 0x4f, + 0xfd, 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, 0x4f, + 0xff, 0xc2, 0x0, 0x1, 0x6a, 0xff, 0xc0, 0x0, + 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xef, 0xf0, + 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, 0xef, + 0xf0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, + 0xef, 0xf0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, + 0x0, 0xef, 0xf0, 0x0, 0x0, 0xd, 0xff, 0x30, + 0x0, 0x0, 0x9f, 0xfe, 0x75, 0x0, 0x2, 0xef, + 0xff, 0xf0, 0x0, 0x2, 0xae, 0xff, + + /* U+007C "|" */ + 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, + 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, + 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, + 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, + 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, + 0xdd, 0xfd, + + /* U+007D "}" */ + 0x7f, 0xfc, 0x60, 0x0, 0x7, 0xff, 0xff, 0x90, + 0x0, 0x26, 0xaf, 0xff, 0x20, 0x0, 0x0, 0xbf, + 0xf5, 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, 0x0, + 0x7f, 0xf7, 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, + 0x0, 0x7f, 0xf7, 0x0, 0x0, 0x7, 0xff, 0x70, + 0x0, 0x0, 0x7f, 0xf7, 0x0, 0x0, 0x7, 0xff, + 0x70, 0x0, 0x0, 0x6f, 0xf7, 0x0, 0x0, 0x4, + 0xff, 0xc0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, + 0x0, 0x7f, 0xff, 0xc0, 0x0, 0x3f, 0xfe, 0x74, + 0x0, 0x6, 0xff, 0x80, 0x0, 0x0, 0x7f, 0xf7, + 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, 0x0, 0x7f, + 0xf7, 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, 0x0, + 0x7f, 0xf7, 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, + 0x0, 0x7f, 0xf7, 0x0, 0x0, 0xb, 0xff, 0x60, + 0x2, 0x6a, 0xff, 0xf2, 0x0, 0x7f, 0xff, 0xf9, + 0x0, 0x7, 0xff, 0xc6, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x4c, 0xfe, 0x80, 0x0, 0x0, 0x3f, 0xa0, + 0x4f, 0xff, 0xff, 0xd2, 0x0, 0x7, 0xf8, 0xd, + 0xfc, 0x46, 0xef, 0xf6, 0x4, 0xef, 0x41, 0xff, + 0x0, 0x1, 0xaf, 0xff, 0xff, 0xb0, 0x3f, 0xb0, + 0x0, 0x0, 0x5c, 0xfe, 0x90, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x3, 0x78, 0x61, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xf6, 0x0, 0xb, 0xf8, 0x20, 0x4d, 0xf5, + 0x4, 0xf8, 0x0, 0x0, 0x1e, 0xd0, 0x9f, 0x20, + 0x0, 0x0, 0x9f, 0x29, 0xf1, 0x0, 0x0, 0x8, + 0xf2, 0x7f, 0x50, 0x0, 0x0, 0xcf, 0x1, 0xfe, + 0x20, 0x0, 0x8f, 0x90, 0x4, 0xff, 0xca, 0xef, + 0xc0, 0x0, 0x2, 0xae, 0xfd, 0x70, 0x0, + + /* U+2022 "•" */ + 0x0, 0x26, 0x40, 0x0, 0x5f, 0xff, 0xb0, 0xd, + 0xff, 0xff, 0x40, 0xff, 0xff, 0xf5, 0xa, 0xff, + 0xff, 0x10, 0x1a, 0xfd, 0x40, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xcf, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xef, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x6b, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0xae, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x72, 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x51, 0x0, + 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xc8, 0x30, 0x0, 0x0, 0x0, + 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x35, 0x53, 0xef, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x7, 0xef, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x16, 0x99, + 0x8c, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x3, 0xae, 0xff, + 0xfc, 0x60, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xac, 0xdc, 0x94, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F008 "" */ + 0x26, 0x0, 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x62, 0xee, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xee, 0xff, 0xba, + 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xea, 0xaa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x54, 0x48, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xb4, 0x44, 0xff, 0xfe, 0x0, 0x3, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x80, + 0x0, 0xef, 0xfe, 0x0, 0x3, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x80, 0x0, + 0xef, 0xff, 0x10, 0x5, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xa0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xee, 0xef, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0xee, 0xff, 0xfe, 0x0, + 0x4, 0xff, 0xfa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xad, 0xff, 0x90, 0x0, 0xef, 0xfe, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0xef, 0xfe, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xef, 0xff, 0x76, 0x6a, 0xff, 0xc2, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x28, 0xff, 0xc6, + 0x66, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x98, 0x8b, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xd8, 0x88, 0xff, + 0xfe, 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0x80, 0x0, 0xef, 0xfe, + 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x80, 0x0, 0xef, 0xfe, 0x0, + 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0x80, 0x0, 0xef, 0xff, 0xcc, 0xce, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfc, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x32, 0x27, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x22, 0xff, 0x9d, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xd9, + + /* U+F00B "" */ + 0x26, 0x77, 0x77, 0x76, 0x0, 0x4, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x62, 0xef, + 0xff, 0xff, 0xff, 0x90, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x9f, 0xff, 0xff, 0xff, 0x50, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0x50, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0x90, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x27, + 0x88, 0x88, 0x87, 0x10, 0x5, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0x88, 0x88, + 0x87, 0x10, 0x6, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x83, 0xef, 0xff, 0xff, 0xff, + 0xa0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xfe, 0x40, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x6e, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x6, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xa3, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xad, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F00D "ï€" */ + 0x0, 0x67, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x38, 0x30, 0x0, 0xbf, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x50, 0x9f, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x3f, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xf9, 0xbf, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0x51, 0xcf, 0xff, 0xff, + 0xfd, 0x10, 0x5f, 0xff, 0xff, 0xff, 0x70, 0x1, + 0xcf, 0xff, 0xff, 0xfd, 0x7f, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0x71, 0xcf, 0xff, 0xff, 0xfd, 0x10, + 0x5f, 0xff, 0xff, 0xff, 0x70, 0x1, 0xcf, 0xff, + 0xff, 0xfd, 0x1e, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xf8, 0xdf, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x73, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xc0, 0x4, 0xef, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0x10, 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, + 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xc0, 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x5, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, + 0x0, 0x2f, 0xff, 0xf9, 0x0, 0xd, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xfa, 0x0, + 0x2f, 0xff, 0xf9, 0x0, 0x3f, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xf4, 0x0, 0x2f, + 0xff, 0xf9, 0x0, 0xd, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x40, 0x0, 0x2f, 0xff, + 0xf9, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x10, 0x2, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2f, 0xff, 0xf9, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x90, 0x8, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x2f, 0xff, 0xf9, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xf1, 0xe, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf5, 0x2f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf9, 0x5f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfc, 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfe, 0x8f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, 0x6f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x6, 0xbb, 0xa1, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x3f, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfb, 0xf, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf7, 0xa, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xf2, 0x4, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xb0, 0x0, 0xcf, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x30, 0x0, 0x2f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, + 0x0, 0x17, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xeb, 0x99, 0xad, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xef, 0xff, 0xff, 0xc8, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xcc, 0xb8, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, 0x1, + 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, 0x12, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x70, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x7, 0xff, 0x30, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc5, 0x11, 0x5c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x3, 0xdf, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xfd, 0x30, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x99, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x8, 0xff, 0xe7, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x7e, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x99, 0x10, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x44, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x32, 0x0, 0x0, 0x0, 0x34, 0x44, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xb1, 0x0, 0x1, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xfd, 0x20, 0x1, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf4, 0x1, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x71, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xfc, 0x24, 0xef, 0xff, + 0xfb, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xa0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf7, 0x0, 0x75, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x50, 0x1b, + 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xe3, 0x2, + 0xdf, 0xff, 0xfb, 0x0, 0x5f, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xfc, 0x10, + 0x4f, 0xff, 0xff, 0xff, 0xd2, 0x3, 0xef, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xa0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x1c, + 0xff, 0xff, 0xd2, 0x0, 0x8, 0xff, 0xff, 0xf7, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0xaf, 0xff, 0xff, 0x40, 0xaf, 0xff, 0xff, + 0x40, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x7, 0xff, 0xff, 0xf6, 0xcf, 0xff, + 0xd2, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x5f, 0xff, 0xf8, 0x2e, + 0xfb, 0x10, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0x3, 0xef, 0xc0, + 0x3, 0x70, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x18, + 0x10, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xa7, 0x77, 0x7d, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xcd, + 0xdd, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0xdd, 0xdc, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x26, 0x77, 0x77, 0x77, 0x77, + 0x10, 0x4f, 0xff, 0xf5, 0x1, 0x77, 0x77, 0x77, + 0x77, 0x62, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x4, 0xff, 0x40, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x22, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x8f, 0x60, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x8f, + 0x60, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x5a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xa5, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x2, 0x9b, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xb8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe1, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfa, + 0x0, 0x9, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x50, 0x3f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xe1, 0xcf, 0xff, 0xd4, 0x44, 0x44, + 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x44, + 0x44, 0x4f, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x88, 0x88, + 0x88, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x31, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x26, 0xab, 0xdd, 0xb8, + 0x40, 0x0, 0x0, 0x1, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x92, 0x0, 0x1, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0xff, 0xff, 0x0, 0x0, 0x4, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0xff, 0xff, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xb8, 0x66, 0x8c, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0x0, 0x3, 0xff, 0xff, 0xff, 0x81, + 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xd, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x9f, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x1, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x22, 0x10, 0xd, 0xff, 0xff, 0xff, 0x8, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x2e, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x22, 0x10, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xb0, 0xff, 0xff, 0xff, 0xec, 0xcd, + 0xef, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x50, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, + 0x0, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf5, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x0, 0x1, 0xaf, 0xff, 0xff, 0x90, 0x0, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xfa, 0x51, 0x0, 0x14, + 0x9f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xff, 0xff, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0xff, 0xff, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x1, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, 0x1, + 0x6b, 0xff, 0xff, 0xff, 0xd9, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x2, 0x43, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x44, 0x44, 0x44, 0x7f, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x9, 0xc4, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x2, 0xff, 0xf4, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xb, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xa, 0xff, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x4f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x5, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x2, 0xef, + 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x1, 0xef, 0xfb, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xfd, 0x10, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x36, 0x0, 0x0, 0x44, 0x44, 0x44, 0x7f, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xf0, 0x0, 0x0, 0x4, + 0x92, 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0x50, 0x0, 0xdf, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xc, 0xff, 0xf5, 0x0, 0x3f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x20, 0x9, 0xff, + 0x70, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xc0, 0x2, + 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xad, 0x40, 0x0, 0xef, 0xf4, + 0x0, 0xcf, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x2, 0xff, 0xf5, 0x0, 0x6f, + 0xf9, 0x0, 0x7f, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0xff, 0x0, + 0xf, 0xfe, 0x0, 0x4f, 0xf9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xa, 0xff, + 0x60, 0xc, 0xff, 0x0, 0x2f, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x4, + 0xff, 0x80, 0xb, 0xff, 0x10, 0x1f, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x6, 0xff, 0x70, 0xc, 0xff, 0x10, 0x2f, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x3e, 0xff, 0x30, 0xe, 0xff, 0x0, 0x3f, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x1, 0xff, 0xfb, 0x0, 0x3f, 0xfc, 0x0, + 0x6f, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x1, 0xff, 0xc1, 0x0, 0xaf, 0xf7, + 0x0, 0xaf, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x35, 0x0, 0x4, 0xff, + 0xf1, 0x0, 0xef, 0xf0, 0x4, 0x44, 0x44, 0x47, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x70, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x6, + 0xff, 0xfc, 0x0, 0xd, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0xc1, 0x0, 0x8f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0xc, 0xf9, 0x0, 0x4, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x3f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5c, 0x60, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x0, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x54, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x1c, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xc, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, + + /* U+F043 "ïƒ" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, + 0xff, 0xf9, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbe, 0xff, 0xd0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xcf, + 0xff, 0x10, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x87, 0xff, 0xf8, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x2f, 0xff, 0xf4, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x9f, + 0xff, 0xf4, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0x50, 0x1, 0xef, 0xff, 0xfb, 0x41, 0xc, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9a, + 0xba, 0x83, 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "ïˆ" */ + 0x4, 0x44, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x10, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xf2, 0x4f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf7, 0x4f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf8, + 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xf0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xf0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xf0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xf0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf6, 0x2e, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "ï‹" */ + 0x0, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xfa, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xba, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "ïŒ" */ + 0x0, 0x34, 0x44, 0x44, 0x41, 0x0, 0x0, 0x0, + 0x3, 0x44, 0x44, 0x44, 0x10, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0x50, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x29, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x9, + 0xef, 0xff, 0xff, 0xeb, 0x20, 0x0, 0x0, 0x9e, + 0xff, 0xff, 0xfe, 0xb2, 0x0, + + /* U+F04D "ï" */ + 0x0, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x10, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x9, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb2, 0x0, + + /* U+F051 "ï‘" */ + 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x44, 0x40, 0x2e, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf4, 0x6f, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x7f, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, + 0x7f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0xe, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xe, 0xff, 0xf4, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xe, + 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0xe, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xe, 0xff, 0xf4, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xf4, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7e, + 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xe, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0xe, 0xff, 0xf4, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xe, 0xff, 0xf4, + 0x7f, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0xe, + 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0xe, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x7f, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, + 0x7f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf4, 0x6f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf4, 0xa, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x6a, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x20, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x4, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x70, + + /* U+F053 "ï“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x27, 0x10, 0x0, + + /* U+F054 "ï”" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x56, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x11, 0x11, 0x11, 0xbf, 0xff, 0xff, 0x11, + 0x11, 0x11, 0x11, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x17, 0x99, 0x99, 0x99, 0x99, 0xdf, 0xff, 0xff, + 0x99, 0x99, 0x99, 0x99, 0x82, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xde, 0xc3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "ï¨" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x17, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x82, 0x0, + + /* U+F06E "ï®" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x89, + 0xaa, 0x87, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xfd, 0x84, 0x23, 0x49, 0xef, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x5, 0xdd, 0x93, + 0x0, 0x6, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x80, 0x0, 0xcf, 0xff, 0xff, 0xf6, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xf6, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0x30, 0x1f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0x10, 0xf, 0xff, 0xff, + 0xff, 0xc0, 0xaf, 0xff, 0xff, 0xff, 0x80, 0x5, + 0x44, 0x9f, 0xff, 0xff, 0xff, 0x50, 0xc, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0x70, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xb, + 0xff, 0xff, 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, + 0x80, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0xc, 0xff, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, + 0xff, 0xa0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0xe, 0xff, 0xff, 0xff, 0xe1, 0x9, 0xff, + 0xff, 0xff, 0xe0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x60, 0x0, + 0xdf, 0xff, 0xff, 0xf5, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x9f, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xfd, 0x0, 0x3, 0xdf, + 0xff, 0xfb, 0x10, 0x3, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x2, 0x55, 0x10, 0x0, 0x1e, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf8, 0x20, 0x0, 0x3, 0xaf, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xdf, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x7a, 0xde, 0xff, 0xec, + 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "ï°" */ + 0x3, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x4, 0x79, 0xa9, 0x87, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xb1, 0x2, 0x8c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xfd, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x94, 0x23, 0x59, + 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xe3, 0x6, 0xdc, + 0x92, 0x0, 0x9, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x54, 0xff, 0xff, 0x60, 0x0, 0xef, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6, 0xf5, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xf5, + 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x2f, 0xff, 0x90, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0xbf, 0xff, 0xfc, 0x10, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x30, 0xe, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x40, 0xe, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0x40, + 0xf, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xcf, 0xff, 0xff, 0xe7, 0x10, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, + 0xfe, 0xde, 0xc1, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x17, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, 0xde, 0xff, + 0xec, 0x80, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0x20, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x11, 0x11, + 0xbf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdc, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb5, 0x6d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x81, 0x2a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x7c, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xc5, 0x0, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf6, 0x0, 0x8a, 0xaa, 0xaa, 0xa7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xaa, 0xdf, + 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xf5, 0x2, 0xef, 0xff, + 0xff, 0x40, 0x8f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0x70, 0x1e, 0xff, 0xff, 0xf4, + 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xe8, 0x1, 0xdf, 0xff, 0xff, 0x50, 0x0, + 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x1d, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x1a, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x90, 0x1a, 0x10, 0x0, 0x5f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfa, 0x0, + 0xcf, 0xd1, 0x0, 0x7f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xb0, 0xb, 0xff, + 0xfc, 0x0, 0x8f, 0xff, 0xf6, 0x0, 0x8a, 0xaa, + 0xab, 0xff, 0xff, 0xfb, 0x0, 0x5f, 0xff, 0xff, + 0xca, 0xdf, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xef, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xde, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xa6, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xfa, 0x0, 0x6f, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xa0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0x30, 0x1d, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xf3, 0x9f, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfd, 0x6f, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xfa, 0x8, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xb0, + 0x0, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x46, 0x0, + + /* U+F078 "ï¸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xde, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xce, 0x40, 0x1e, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf4, 0x9f, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xf9, 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x7f, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf3, 0x0, 0x1d, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0x31, 0xdf, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x0, 0x0, 0x2a, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0x90, 0x0, 0x5, 0xab, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xf9, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0x90, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x3f, 0xff, 0xfe, 0xff, 0xfe, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x10, 0x0, 0x0, 0x8f, 0xff, 0xe4, + 0xff, 0xf9, 0x9f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, + 0x3f, 0xfe, 0x22, 0xff, 0xf9, 0xa, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x10, 0x0, 0x0, 0x3, 0x82, 0x2, 0xff, 0xf9, + 0x0, 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x11, 0x0, 0xaf, 0xff, 0x10, + 0x2, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x40, + 0xaf, 0xff, 0x10, 0xcf, 0xb0, 0x0, 0x0, 0x2, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf3, 0xaf, 0xff, 0x1c, 0xff, 0xf7, + 0x0, 0x0, 0x2, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xdf, 0xff, + 0xcf, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb5, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x2e, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "ï»" */ + 0x2, 0x68, 0x88, 0x88, 0x88, 0x88, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xca, 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, + + /* U+F093 "ï‚“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xec, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, + 0x33, 0x3e, 0xff, 0xff, 0xff, 0xa3, 0x33, 0x32, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x26, 0x77, 0x77, 0x77, 0x72, + 0xe, 0xff, 0xff, 0xff, 0x90, 0x27, 0x77, 0x77, + 0x77, 0x62, 0xdf, 0xff, 0xff, 0xff, 0xf7, 0xb, + 0xff, 0xff, 0xff, 0x60, 0x7f, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x45, + 0x55, 0x53, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x8f, 0x60, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x8f, + 0x60, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x5a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xa5, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xc8, 0x51, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xfd, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x7d, 0xd1, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x29, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x73, 0xbf, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfe, 0xb6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0xba, 0x98, 0x52, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x0, 0x2, 0x79, 0x83, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x8a, 0x83, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xf9, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf2, 0xcf, 0xff, + 0xa3, 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xf5, 0xf, 0xff, 0xe0, 0x0, 0xaf, + 0xff, 0x20, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0xff, 0xfd, 0x0, 0x9, 0xff, 0xf3, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xd, 0xff, + 0xf5, 0x2, 0xff, 0xff, 0x10, 0x7, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0xff, + 0xff, 0xf2, 0x7, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xe8, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, 0xde, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0x9b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xb, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0xc, 0xff, 0xfa, 0x37, 0xff, 0xff, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xff, 0xfe, + 0x0, 0xa, 0xff, 0xf2, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0xf, 0xff, 0xd0, 0x0, 0x9f, + 0xff, 0x30, 0x0, 0xb, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0xdf, 0xff, 0x50, 0x2f, 0xff, 0xf1, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xe2, 0x7, 0xff, + 0xff, 0xef, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xe1, 0xd, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xfd, 0x10, 0x2d, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xce, 0xd8, 0x0, 0x0, + 0x7, 0xbd, 0xc8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x8, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x8f, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x8, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x8f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x8, 0xff, 0xff, + 0xd0, 0x16, 0x66, 0x64, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x59, 0x99, 0x99, 0xd, 0xff, + 0xff, 0xa0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfa, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xdd, + 0xdd, 0x1f, 0xff, 0xff, 0xa0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, + 0xff, 0xfa, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xa0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xff, 0xff, 0xfa, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0xff, 0xff, 0xa0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xfa, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0xff, 0xff, 0xa0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xfa, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xa0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xff, 0xff, 0xfa, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0xff, 0xff, 0xa0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, + 0xfa, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xa0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xff, 0xff, 0xfa, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, + 0xff, 0xa0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xfc, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xf, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xe6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0x40, 0x0, + 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x3, 0x89, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x96, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xff, 0xfe, + 0x32, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x7f, + 0xff, 0xfd, 0x10, 0xf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfd, + 0x10, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfc, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x9, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc3, 0x0, + + /* U+F0C9 "" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x24, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x21, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x20, + + /* U+F0E0 "" */ + 0x0, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0xc3, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x5f, 0xff, + 0x70, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x9, 0xff, 0xff, 0xfb, + 0x10, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xe4, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x10, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x1a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x2d, 0xff, 0xff, 0xff, 0xd2, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x9f, 0xff, 0xf9, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x3, + 0x99, 0x30, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbb, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xaa, 0xaa, 0xaa, 0x92, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x6, 0xcd, 0xdd, 0xdd, 0xdf, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x13, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0x66, 0x66, 0xcf, 0xff, + 0xff, 0xb6, 0x66, 0x65, 0x10, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xf8, 0x29, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, + 0x29, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x54, 0x44, 0x44, 0x44, 0x30, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xfb, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xe0, 0x8b, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x80, 0x6f, 0xff, 0xff, 0xff, 0xfe, 0x8, 0xfc, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xf8, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x8f, 0xfc, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, 0xff, + 0xfe, 0x8, 0xff, 0xfc, 0x0, 0xff, 0xff, 0xff, + 0xf8, 0x7, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x8f, + 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, 0x80, 0x7f, + 0xff, 0xff, 0xff, 0xfe, 0x5, 0xaa, 0xaa, 0xa0, + 0xff, 0xff, 0xff, 0xf8, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x82, + 0x22, 0x22, 0x20, 0xff, 0xff, 0xff, 0xf8, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, + 0xff, 0xf8, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0x80, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xff, 0xff, 0xff, 0xf8, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, + 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xdf, 0xff, 0xff, 0xf8, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x11, 0x55, 0x55, 0x55, 0x20, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x29, 0xef, 0xff, 0xff, 0xa3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xab, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, + 0x30, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfd, 0x10, 0x1d, + 0xf5, 0x0, 0x1f, 0xf2, 0x0, 0x4f, 0xe1, 0x1, + 0xef, 0x40, 0x2, 0xff, 0xfc, 0xff, 0xfc, 0x0, + 0xb, 0xf2, 0x0, 0xe, 0xf0, 0x0, 0x1f, 0xc0, + 0x0, 0xcf, 0x10, 0x0, 0xff, 0xfc, 0xff, 0xfc, + 0x0, 0xb, 0xf2, 0x0, 0xe, 0xf0, 0x0, 0x1f, + 0xc0, 0x0, 0xcf, 0x10, 0x0, 0xff, 0xfc, 0xff, + 0xfd, 0x0, 0xd, 0xf4, 0x0, 0x1f, 0xf2, 0x0, + 0x3f, 0xe0, 0x0, 0xef, 0x30, 0x2, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xfe, 0xee, 0xff, 0xfe, + 0xef, 0xff, 0xee, 0xef, 0xff, 0xee, 0xef, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xdf, + 0x20, 0x1, 0xff, 0x0, 0x6, 0xf6, 0x0, 0xd, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0x90, 0x0, + 0xcf, 0x10, 0x0, 0xff, 0x0, 0x5, 0xf5, 0x0, + 0xd, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0x90, + 0x0, 0xcf, 0x10, 0x0, 0xff, 0x0, 0x5, 0xf5, + 0x0, 0xd, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xb2, 0x23, 0xef, 0x52, 0x24, 0xff, 0x32, 0x29, + 0xf9, 0x22, 0x3e, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xbb, 0xbf, 0xfd, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbc, 0xff, 0xdb, 0xbd, 0xff, 0xfc, + 0xff, 0xfc, 0x0, 0xb, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, 0x0, 0xff, + 0xfc, 0xff, 0xfc, 0x0, 0xb, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x10, 0x0, + 0xff, 0xfc, 0xff, 0xfc, 0x0, 0xb, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, + 0x0, 0xff, 0xfc, 0xff, 0xff, 0xcc, 0xcf, 0xfd, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, + 0xdc, 0xcd, 0xff, 0xfc, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x59, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xaa, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "ï…›" */ + 0x26, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x6, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0xfd, 0x10, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xf, 0xfd, + 0x10, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0xff, 0xfd, 0x10, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0xf, 0xff, 0xfd, + 0x10, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0xff, 0xff, 0xfd, 0x10, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xf, 0xff, 0xff, 0xfd, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x4a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xa9, 0x0, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x45, 0x65, 0x43, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xad, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xc8, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x92, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xb8, 0x65, 0x55, 0x67, 0x9c, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xd7, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7f, 0xff, + 0xff, 0xff, 0xb1, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0xf7, 0x6f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xc1, 0x6, 0xff, 0x60, 0x0, 0x0, 0x0, 0x3, + 0x8b, 0xdf, 0xff, 0xec, 0x96, 0x10, 0x0, 0x0, + 0x0, 0x1c, 0xfc, 0x10, 0x0, 0x43, 0x0, 0x0, + 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x40, 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xec, 0xbc, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfc, 0x61, + 0x0, 0x0, 0x0, 0x48, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0x98, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2a, 0xdc, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb9, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe4, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xcd, 0xff, 0xfa, + 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1, 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x1, 0xff, 0xfa, 0xff, 0xfc, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, 0xff, + 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x67, 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xfa, 0xff, + 0xfc, 0x3, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xfd, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F241 "ï‰" */ + 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb9, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe4, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0xcd, 0xff, 0xfa, + 0xff, 0xfc, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfa, 0xff, 0xfc, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, 0xff, 0xfc, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfa, 0xff, 0xfc, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x67, 0xff, 0xfa, 0xff, 0xfc, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, + 0xfc, 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x40, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xfd, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F242 "" */ + 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb9, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe4, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0xff, 0xfa, + 0xff, 0xfc, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfa, 0xff, 0xfc, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, 0xff, 0xfc, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfa, 0xff, 0xfc, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x67, 0xff, 0xfa, 0xff, 0xfc, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, + 0xfc, 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xfd, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F243 "" */ + 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb9, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe4, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0x6, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0xff, 0xfa, + 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, 0xff, 0xfc, + 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x67, 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, + 0xfc, 0x3, 0x88, 0x88, 0x88, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xfd, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F244 "" */ + 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb9, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe4, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0xff, 0xfa, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x67, 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xfd, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7c, 0xc5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xac, 0xcf, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xa5, 0x5e, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, + 0x3, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf3, 0x0, 0x0, 0x15, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x30, + 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xdf, 0xff, 0x70, 0x0, 0x0, 0xef, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0x60, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf8, 0x0, + 0x7, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xfc, 0x30, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0x32, 0x5f, 0xf7, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x2b, 0xff, 0xf9, + 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xaf, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x1c, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf7, 0x0, 0x2e, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xfa, 0x10, 0x0, 0x2, 0xbf, 0xfc, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xfa, 0x0, 0xf, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x60, 0xf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xef, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x2f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x33, 0x33, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x9d, 0xff, 0xff, 0xfd, 0x93, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xf9, 0xef, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xf7, 0x2e, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xf7, 0x2, 0xef, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0x20, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x3, 0xff, 0xff, 0xff, 0x80, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x1, 0x20, + 0x4f, 0xff, 0xff, 0xd0, 0x6, 0xff, 0xff, 0xa7, + 0xff, 0xf7, 0x2, 0xe2, 0x5, 0xff, 0xff, 0xf0, + 0xa, 0xff, 0xfc, 0x0, 0x6f, 0xf7, 0x1, 0xfe, + 0x20, 0x5f, 0xff, 0xf3, 0xc, 0xff, 0xff, 0x70, + 0x6, 0xf7, 0x1, 0xfc, 0x0, 0x8f, 0xff, 0xf6, + 0xe, 0xff, 0xff, 0xf7, 0x0, 0x67, 0x1, 0xc0, + 0x7, 0xff, 0xff, 0xf7, 0xf, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf8, + 0xf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xf9, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xfa, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xfa, 0xf, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf9, + 0xf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xf9, 0xe, 0xff, 0xff, 0xf8, + 0x0, 0x47, 0x1, 0xa0, 0x6, 0xff, 0xff, 0xf7, + 0xc, 0xff, 0xff, 0x80, 0x4, 0xf7, 0x1, 0xfa, + 0x0, 0x7f, 0xff, 0xf6, 0xa, 0xff, 0xfc, 0x0, + 0x4f, 0xf8, 0x1, 0xfe, 0x20, 0x2e, 0xff, 0xf4, + 0x7, 0xff, 0xff, 0x95, 0xff, 0xf8, 0x2, 0xe3, + 0x2, 0xef, 0xff, 0xf1, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x1, 0x30, 0x2e, 0xff, 0xff, 0xd0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2, + 0xef, 0xff, 0xff, 0x80, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x2e, 0xff, 0xff, 0xff, 0x20, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xf9, 0x3, 0xef, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xf9, 0x3e, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xfc, 0xef, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x58, 0xbc, 0xdd, 0xca, + 0x61, 0x0, 0x0, 0x0, + + /* U+F2ED "ï‹­" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0x77, 0x77, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x69, 0x99, 0x99, 0x99, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa9, 0x99, 0x99, 0x98, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0x40, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x2, 0xff, 0xff, 0xb0, 0xbf, 0xff, + 0x62, 0xff, 0xfe, 0x18, 0xff, 0xff, 0x60, 0x0, + 0x2f, 0xff, 0xf9, 0x9, 0xff, 0xf3, 0xf, 0xff, + 0xd0, 0x5f, 0xff, 0xf6, 0x0, 0x2, 0xff, 0xff, + 0x90, 0x9f, 0xff, 0x30, 0xff, 0xfd, 0x5, 0xff, + 0xff, 0x60, 0x0, 0x2f, 0xff, 0xf9, 0x9, 0xff, + 0xf3, 0xf, 0xff, 0xd0, 0x5f, 0xff, 0xf6, 0x0, + 0x2, 0xff, 0xff, 0x90, 0x9f, 0xff, 0x30, 0xff, + 0xfd, 0x5, 0xff, 0xff, 0x60, 0x0, 0x2f, 0xff, + 0xf9, 0x9, 0xff, 0xf3, 0xf, 0xff, 0xd0, 0x5f, + 0xff, 0xf6, 0x0, 0x2, 0xff, 0xff, 0x90, 0x9f, + 0xff, 0x30, 0xff, 0xfd, 0x5, 0xff, 0xff, 0x60, + 0x0, 0x2f, 0xff, 0xf9, 0x9, 0xff, 0xf3, 0xf, + 0xff, 0xd0, 0x5f, 0xff, 0xf6, 0x0, 0x2, 0xff, + 0xff, 0x90, 0x9f, 0xff, 0x30, 0xff, 0xfd, 0x5, + 0xff, 0xff, 0x60, 0x0, 0x2f, 0xff, 0xf9, 0x9, + 0xff, 0xf3, 0xf, 0xff, 0xd0, 0x5f, 0xff, 0xf6, + 0x0, 0x2, 0xff, 0xff, 0x90, 0x9f, 0xff, 0x30, + 0xff, 0xfd, 0x5, 0xff, 0xff, 0x60, 0x0, 0x2f, + 0xff, 0xf9, 0x9, 0xff, 0xf3, 0xf, 0xff, 0xd0, + 0x5f, 0xff, 0xf6, 0x0, 0x2, 0xff, 0xff, 0x90, + 0x9f, 0xff, 0x30, 0xff, 0xfd, 0x5, 0xff, 0xff, + 0x60, 0x0, 0x2f, 0xff, 0xf9, 0x9, 0xff, 0xf3, + 0xf, 0xff, 0xd0, 0x5f, 0xff, 0xf6, 0x0, 0x2, + 0xff, 0xff, 0xb0, 0xbf, 0xff, 0x62, 0xff, 0xfe, + 0x18, 0xff, 0xff, 0x60, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x7, 0xbc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, + 0x81, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x50, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x50, 0x2e, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x2e, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x50, 0x2e, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x50, 0x2e, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x2e, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xba, 0x86, 0x43, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x87, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4e, 0xff, 0xff, 0xfe, 0x48, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x2, 0xef, 0xff, 0xe3, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x2e, + 0xfe, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x2, 0xd3, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xf8, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x50, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x9, + 0xf9, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x9, 0xff, 0xff, 0xf9, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcf, + 0xff, 0xff, 0xff, 0xce, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe9, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x3, + 0xff, 0xdb, 0xbf, 0xfb, 0xbb, 0xff, 0xbb, 0xbf, + 0xff, 0xa0, 0x3, 0xff, 0xf9, 0x0, 0xcf, 0x10, + 0xf, 0xf0, 0x1, 0xff, 0xfa, 0x4, 0xff, 0xff, + 0x90, 0xc, 0xf1, 0x0, 0xff, 0x0, 0x1f, 0xff, + 0xa4, 0xff, 0xff, 0xf9, 0x0, 0xcf, 0x10, 0xf, + 0xf0, 0x1, 0xff, 0xfa, 0xff, 0xff, 0xff, 0x90, + 0xc, 0xf1, 0x0, 0xff, 0x0, 0x1f, 0xff, 0xaf, + 0xff, 0xff, 0xf9, 0x0, 0xcf, 0x10, 0xf, 0xf0, + 0x1, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xae, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x41, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x6a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xa9, 0x40, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x1b, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x2d, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf1, 0x0, 0x0, 0x2e, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x10, 0x0, 0x3e, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf1, 0x0, 0x4f, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x10, 0x5f, 0xff, 0xff, 0xff, + 0xdb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xef, 0xff, 0xf1, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 129, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 129, .box_w = 4, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 42, .adv_w = 188, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 83, .adv_w = 337, .box_w = 21, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 304, .adv_w = 298, .box_w = 17, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 551, .adv_w = 405, .box_w = 24, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 803, .adv_w = 329, .box_w = 20, .box_h = 22, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1023, .adv_w = 101, .box_w = 4, .box_h = 9, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 1041, .adv_w = 162, .box_w = 8, .box_h = 28, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 1153, .adv_w = 162, .box_w = 8, .box_h = 28, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 1265, .adv_w = 192, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 1337, .adv_w = 279, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 1435, .adv_w = 109, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1458, .adv_w = 184, .box_w = 9, .box_h = 3, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 1472, .adv_w = 109, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1485, .adv_w = 169, .box_w = 13, .box_h = 28, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 1667, .adv_w = 320, .box_w = 18, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1856, .adv_w = 178, .box_w = 8, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1940, .adv_w = 276, .box_w = 17, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2119, .adv_w = 275, .box_w = 16, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2287, .adv_w = 321, .box_w = 19, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2487, .adv_w = 276, .box_w = 17, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2666, .adv_w = 296, .box_w = 17, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2845, .adv_w = 287, .box_w = 17, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3024, .adv_w = 309, .box_w = 17, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3203, .adv_w = 296, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3392, .adv_w = 109, .box_w = 5, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3432, .adv_w = 109, .box_w = 5, .box_h = 21, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 3485, .adv_w = 279, .box_w = 14, .box_h = 15, .ofs_x = 2, .ofs_y = 3}, + {.bitmap_index = 3590, .adv_w = 279, .box_w = 14, .box_h = 10, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 3660, .adv_w = 279, .box_w = 14, .box_h = 15, .ofs_x = 2, .ofs_y = 3}, + {.bitmap_index = 3765, .adv_w = 275, .box_w = 16, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3933, .adv_w = 496, .box_w = 29, .box_h = 27, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 4325, .adv_w = 351, .box_w = 23, .box_h = 21, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4567, .adv_w = 363, .box_w = 19, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 4767, .adv_w = 347, .box_w = 20, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4977, .adv_w = 396, .box_w = 21, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5198, .adv_w = 322, .box_w = 16, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5366, .adv_w = 305, .box_w = 15, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5524, .adv_w = 371, .box_w = 20, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5734, .adv_w = 390, .box_w = 19, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5934, .adv_w = 149, .box_w = 4, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5976, .adv_w = 246, .box_w = 14, .box_h = 21, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 6123, .adv_w = 345, .box_w = 19, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6323, .adv_w = 285, .box_w = 15, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6481, .adv_w = 458, .box_w = 23, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6723, .adv_w = 390, .box_w = 19, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6923, .adv_w = 403, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7165, .adv_w = 347, .box_w = 18, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7354, .adv_w = 403, .box_w = 24, .box_h = 26, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 7666, .adv_w = 349, .box_w = 18, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7855, .adv_w = 298, .box_w = 17, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8034, .adv_w = 282, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8223, .adv_w = 380, .box_w = 19, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8423, .adv_w = 342, .box_w = 23, .box_h = 21, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8665, .adv_w = 540, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9012, .adv_w = 323, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9222, .adv_w = 311, .box_w = 21, .box_h = 21, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 9443, .adv_w = 315, .box_w = 18, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9632, .adv_w = 160, .box_w = 7, .box_h = 28, .ofs_x = 3, .ofs_y = -6}, + {.bitmap_index = 9730, .adv_w = 169, .box_w = 14, .box_h = 28, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 9926, .adv_w = 160, .box_w = 7, .box_h = 28, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 10024, .adv_w = 280, .box_w = 14, .box_h = 13, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 10115, .adv_w = 240, .box_w = 15, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10130, .adv_w = 288, .box_w = 9, .box_h = 4, .ofs_x = 3, .ofs_y = 18}, + {.bitmap_index = 10148, .adv_w = 287, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10268, .adv_w = 327, .box_w = 18, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10466, .adv_w = 274, .box_w = 16, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10594, .adv_w = 327, .box_w = 17, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10781, .adv_w = 294, .box_w = 17, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10917, .adv_w = 169, .box_w = 12, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11049, .adv_w = 331, .box_w = 17, .box_h = 22, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 11236, .adv_w = 327, .box_w = 16, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11412, .adv_w = 134, .box_w = 5, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11467, .adv_w = 136, .box_w = 10, .box_h = 28, .ofs_x = -3, .ofs_y = -6}, + {.bitmap_index = 11607, .adv_w = 296, .box_w = 17, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11794, .adv_w = 134, .box_w = 4, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11838, .adv_w = 507, .box_w = 28, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12062, .adv_w = 327, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12190, .adv_w = 305, .box_w = 17, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12326, .adv_w = 327, .box_w = 18, .box_h = 22, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 12524, .adv_w = 327, .box_w = 17, .box_h = 22, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 12711, .adv_w = 197, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12791, .adv_w = 240, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12911, .adv_w = 199, .box_w = 12, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13031, .adv_w = 325, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13159, .adv_w = 268, .box_w = 18, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 13303, .adv_w = 432, .box_w = 27, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13519, .adv_w = 265, .box_w = 17, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13655, .adv_w = 268, .box_w = 18, .box_h = 22, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 13853, .adv_w = 250, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13965, .adv_w = 168, .box_w = 9, .box_h = 28, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 14091, .adv_w = 144, .box_w = 3, .box_h = 28, .ofs_x = 3, .ofs_y = -6}, + {.bitmap_index = 14133, .adv_w = 168, .box_w = 9, .box_h = 28, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 14259, .adv_w = 279, .box_w = 15, .box_h = 5, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 14297, .adv_w = 201, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 11}, + {.bitmap_index = 14352, .adv_w = 151, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 6}, + {.bitmap_index = 14373, .adv_w = 480, .box_w = 31, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 14854, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15199, .adv_w = 480, .box_w = 30, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15604, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15949, .adv_w = 330, .box_w = 21, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16180, .adv_w = 480, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 16645, .adv_w = 480, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 17110, .adv_w = 540, .box_w = 34, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17569, .adv_w = 480, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 18034, .adv_w = 540, .box_w = 34, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 18425, .adv_w = 480, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 18890, .adv_w = 240, .box_w = 15, .box_h = 24, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19070, .adv_w = 360, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19346, .adv_w = 540, .box_w = 34, .box_h = 29, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 19839, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20184, .adv_w = 330, .box_w = 21, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 20510, .adv_w = 420, .box_w = 20, .box_h = 28, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 20790, .adv_w = 420, .box_w = 27, .box_h = 32, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 21222, .adv_w = 420, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21587, .adv_w = 420, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21952, .adv_w = 420, .box_w = 20, .box_h = 28, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 22232, .adv_w = 420, .box_w = 28, .box_h = 27, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 22610, .adv_w = 300, .box_w = 17, .box_h = 27, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 22840, .adv_w = 300, .box_w = 17, .box_h = 27, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 23070, .adv_w = 420, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23435, .adv_w = 420, .box_w = 27, .box_h = 7, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 23530, .adv_w = 540, .box_w = 34, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23921, .adv_w = 600, .box_w = 38, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 24510, .adv_w = 540, .box_w = 36, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 25068, .adv_w = 480, .box_w = 30, .box_h = 28, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 25488, .adv_w = 420, .box_w = 26, .box_h = 17, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 25709, .adv_w = 420, .box_w = 26, .box_h = 17, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 25930, .adv_w = 600, .box_w = 38, .box_h = 24, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 26386, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 26731, .adv_w = 480, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 27196, .adv_w = 480, .box_w = 31, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 27677, .adv_w = 420, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28042, .adv_w = 420, .box_w = 27, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 28461, .adv_w = 420, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28826, .adv_w = 420, .box_w = 27, .box_h = 24, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 29150, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 29495, .adv_w = 300, .box_w = 20, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 29805, .adv_w = 420, .box_w = 27, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 30224, .adv_w = 420, .box_w = 27, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 30643, .adv_w = 540, .box_w = 34, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 31034, .adv_w = 480, .box_w = 32, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 31530, .adv_w = 360, .box_w = 23, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 31887, .adv_w = 600, .box_w = 38, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 32419, .adv_w = 600, .box_w = 38, .box_h = 20, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 32799, .adv_w = 600, .box_w = 38, .box_h = 20, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 33179, .adv_w = 600, .box_w = 38, .box_h = 20, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 33559, .adv_w = 600, .box_w = 38, .box_h = 20, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 33939, .adv_w = 600, .box_w = 38, .box_h = 20, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 34319, .adv_w = 600, .box_w = 38, .box_h = 24, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 34775, .adv_w = 420, .box_w = 24, .box_h = 31, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 35147, .adv_w = 420, .box_w = 27, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 35566, .adv_w = 480, .box_w = 31, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 36047, .adv_w = 600, .box_w = 38, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 36484, .adv_w = 360, .box_w = 23, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 36841, .adv_w = 483, .box_w = 31, .box_h = 20, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 5, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 22, 0, 13, -11, 0, 0, + 0, 0, -26, -29, 3, 23, 11, 8, + -19, 3, 24, 1, 20, 5, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 4, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 0, -14, 0, 0, 0, 0, + 0, -10, 8, 10, 0, 0, -5, 0, + -3, 5, 0, -5, 0, -5, -2, -10, + 0, 0, 0, 0, -5, 0, 0, -6, + -7, 0, 0, -5, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + -5, 0, -7, 0, -13, 0, -58, 0, + 0, -10, 0, 10, 14, 0, 0, -10, + 5, 5, 16, 10, -8, 10, 0, 0, + -27, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -13, -6, -24, 0, -19, + -3, 0, 0, 0, 0, 1, 19, 0, + -14, -4, -1, 1, 0, -8, 0, 0, + -3, -36, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -38, -4, 18, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -20, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 16, + 0, 5, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 18, 4, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -18, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 10, 5, 14, -5, 0, 0, 10, -5, + -16, -66, 3, 13, 10, 1, -6, 0, + 17, 0, 15, 0, 15, 0, -45, 0, + -6, 14, 0, 16, -5, 10, 5, 0, + 0, 1, -5, 0, 0, -8, 38, 0, + 38, 0, 14, 0, 20, 6, 8, 14, + 0, 0, 0, -18, 0, 0, 0, 0, + 1, -3, 0, 3, -9, -6, -10, 3, + 0, -5, 0, 0, 0, -19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -26, 0, -30, 0, 0, 0, + 0, -3, 0, 48, -6, -6, 5, 5, + -4, 0, -6, 5, 0, 0, -25, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -47, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -30, 0, 29, 0, 0, -18, 0, + 16, 0, -33, -47, -33, -10, 14, 0, + 0, -32, 0, 6, -11, 0, -7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 12, 14, -59, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 23, 0, 3, 0, 0, 0, + 0, 0, 3, 3, -6, -10, 0, -1, + -1, -5, 0, 0, -3, 0, 0, 0, + -10, 0, -4, 0, -11, -10, 0, -12, + -16, -16, -9, 0, -10, 0, -10, 0, + 0, 0, 0, -4, 0, 0, 5, 0, + 3, -5, 0, 1, 0, 0, 0, 5, + -3, 0, 0, 0, -3, 5, 5, -1, + 0, 0, 0, -9, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 6, -3, 0, + -6, 0, -8, 0, 0, -3, 0, 14, + 0, 0, -5, 0, 0, 0, 0, 0, + -1, 1, -3, -3, 0, 0, -5, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, -5, -6, 0, + 0, 0, 0, 0, 1, 0, 0, -3, + 0, -5, -5, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, -3, -6, 0, -7, 0, -14, + -3, -14, 10, 0, 0, -10, 5, 10, + 13, 0, -12, -1, -6, 0, -1, -23, + 5, -3, 3, -25, 5, 0, 0, 1, + -25, 0, -25, -4, -42, -3, 0, -24, + 0, 10, 13, 0, 6, 0, 0, 0, + 0, 1, 0, -9, -6, 0, -14, 0, + 0, 0, -5, 0, 0, 0, -5, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + -6, 0, 0, 0, 0, 0, 0, 0, + -5, -5, 0, -3, -6, -4, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -6, + 0, -3, 0, -10, 5, 0, 0, -6, + 2, 5, 5, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 3, + 0, 0, -5, 0, -5, -3, -6, 0, + 0, 0, 0, 0, 0, 0, 4, 0, + -4, 0, 0, 0, 0, -5, -7, 0, + -9, 0, 14, -3, 1, -15, 0, 0, + 13, -24, -25, -20, -10, 5, 0, -4, + -31, -9, 0, -9, 0, -10, 7, -9, + -31, 0, -13, 0, 0, 2, -1, 4, + -3, 0, 5, 0, -14, -18, 0, -24, + -12, -10, -12, -14, -6, -13, -1, -9, + -13, 3, 0, 1, 0, -5, 0, 0, + 0, 3, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, -2, 0, -1, -5, 0, -8, -11, + -11, -1, 0, -14, 0, 0, 0, 0, + 0, 0, -4, 0, 0, 0, 0, 2, + -3, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 23, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + -9, 0, 0, 0, 0, -24, -14, 0, + 0, 0, -7, -24, 0, 0, -5, 5, + 0, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, -9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, -9, 0, + 0, 0, 0, 6, 0, 3, -10, -10, + 0, -5, -5, -6, 0, 0, 0, 0, + 0, 0, -14, 0, -5, 0, -7, -5, + 0, -11, -12, -14, -4, 0, -10, 0, + -14, 0, 0, 0, 0, 38, 0, 0, + 2, 0, 0, -6, 0, 5, 0, -21, + 0, 0, 0, 0, 0, -45, -9, 16, + 14, -4, -20, 0, 5, -7, 0, -24, + -2, -6, 5, -34, -5, 6, 0, 7, + -17, -7, -18, -16, -20, 0, 0, -29, + 0, 27, 0, 0, -2, 0, 0, 0, + -2, -2, -5, -13, -16, -1, -45, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, -2, -5, -7, 0, 0, + -10, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -10, 0, 0, 10, + -1, 6, 0, -11, 5, -3, -1, -12, + -5, 0, -6, -5, -3, 0, -7, -8, + 0, 0, -4, -1, -3, -8, -6, 0, + 0, -5, 0, 5, -3, 0, -11, 0, + 0, 0, -10, 0, -8, 0, -8, -8, + 5, 0, 0, 0, 0, 0, 0, 0, + 0, -10, 5, 0, -7, 0, -3, -6, + -15, -3, -3, -3, -1, -3, -6, -1, + 0, 0, 0, 0, 0, -5, -4, -4, + 0, 0, 0, 0, 6, -3, 0, -3, + 0, 0, 0, -3, -6, -3, -4, -6, + -4, 0, 4, 19, -1, 0, -13, 0, + -3, 10, 0, -5, -20, -6, 7, 0, + 0, -23, -8, 5, -8, 3, 0, -3, + -4, -15, 0, -7, 2, 0, 0, -8, + 0, 0, 0, 5, 5, -10, -9, 0, + -8, -5, -7, -5, -5, 0, -8, 2, + -9, -8, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -6, + 0, 0, -5, -5, 0, 0, 0, 0, + -5, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, -3, 0, 0, 0, 0, + -7, 0, -10, 0, 0, 0, -16, 0, + 3, -11, 10, 1, -3, -23, 0, 0, + -11, -5, 0, -19, -12, -13, 0, 0, + -21, -5, -19, -18, -23, 0, -12, 0, + 4, 32, -6, 0, -11, -5, -1, -5, + -8, -13, -9, -18, -20, -11, -5, 0, + 0, -3, 0, 1, 0, 0, -34, -4, + 14, 11, -11, -18, 0, 1, -15, 0, + -24, -3, -5, 10, -44, -6, 1, 0, + 0, -31, -6, -25, -5, -35, 0, 0, + -34, 0, 28, 1, 0, -3, 0, 0, + 0, 0, -2, -3, -18, -3, 0, -31, + 0, 0, 0, 0, -15, 0, -4, 0, + -1, -13, -23, 0, 0, -2, -7, -14, + -5, 0, -3, 0, 0, 0, 0, -22, + -5, -16, -15, -4, -8, -12, -5, -8, + 0, -10, -4, -16, -7, 0, -6, -9, + -5, -9, 0, 2, 0, -3, -16, 0, + 10, 0, -9, 0, 0, 0, 0, 6, + 0, 3, -10, 20, 0, -5, -5, -6, + 0, 0, 0, 0, 0, 0, -14, 0, + -5, 0, -7, -5, 0, -11, -12, -14, + -4, 0, -10, 4, 19, 0, 0, 0, + 0, 38, 0, 0, 2, 0, 0, -6, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -3, -10, 0, 0, 0, 0, 0, -2, + 0, 0, 0, -5, -5, 0, 0, -10, + -5, 0, 0, -10, 0, 8, -2, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 7, 10, 4, -4, 0, -15, + -8, 0, 14, -16, -15, -10, -10, 19, + 9, 5, -42, -3, 10, -5, 0, -5, + 5, -5, -17, 0, -5, 5, -6, -4, + -14, -4, 0, 0, 14, 10, 0, -13, + 0, -26, -6, 14, -6, -18, 1, -6, + -16, -16, -5, 19, 5, 0, -7, 0, + -13, 0, 4, 16, -11, -18, -19, -12, + 14, 0, 1, -35, -4, 5, -8, -3, + -11, 0, -11, -18, -7, -7, -4, 0, + 0, -11, -10, -5, 0, 14, 11, -5, + -26, 0, -26, -7, 0, -17, -28, -1, + -15, -8, -16, -13, 13, 0, 0, -6, + 0, -10, -4, 0, -5, -9, 0, 8, + -16, 5, 0, 0, -25, 0, -5, -11, + -8, -3, -14, -12, -16, -11, 0, -14, + -5, -11, -9, -14, -5, 0, 0, 1, + 23, -8, 0, -14, -5, 0, -5, -10, + -11, -13, -13, -18, -6, -10, 10, 0, + -7, 0, -24, -6, 3, 10, -15, -18, + -10, -16, 16, -5, 2, -45, -9, 10, + -11, -8, -18, 0, -14, -20, -6, -5, + -4, -5, -10, -14, -1, 0, 0, 14, + 13, -3, -31, 0, -29, -11, 12, -18, + -33, -10, -17, -20, -24, -16, 10, 0, + 0, 0, 0, -6, 0, 0, 5, -6, + 10, 3, -9, 10, 0, 0, -15, -1, + 0, -1, 0, 1, 1, -4, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 4, 14, 1, 0, -6, 0, 0, + 0, 0, -3, -3, -6, 0, 0, 0, + 1, 4, 0, 0, 0, 0, 4, 0, + -4, 0, 18, 0, 9, 1, 1, -6, + 0, 10, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 14, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -29, 0, -5, 8, 0, 14, + 0, 0, 48, 6, -10, -10, 5, 5, + -3, 1, -24, 0, 0, 23, -29, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -33, 18, 67, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, -9, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, -13, 0, + 0, 1, 0, 0, 5, 62, -10, -4, + 15, 13, -13, 5, 0, 0, 5, 5, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -62, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -13, + 0, 0, 0, -13, 0, 0, 0, 0, + -11, -2, 0, 0, 0, -11, 0, -6, + 0, -23, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -32, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -5, 0, 0, -9, 0, -7, 0, + -13, 0, 0, 0, -8, 5, -6, 0, + 0, -13, -5, -11, 0, 0, -13, 0, + -5, 0, -23, 0, -5, 0, 0, -39, + -9, -19, -5, -17, 0, 0, -32, 0, + -13, -2, 0, 0, 0, 0, 0, 0, + 0, 0, -7, -9, -4, -8, 0, 0, + 0, 0, -11, 0, -11, 6, -5, 10, + 0, -3, -11, -3, -8, -9, 0, -6, + -2, -3, 3, -13, -1, 0, 0, 0, + -42, -4, -7, 0, -11, 0, -3, -23, + -4, 0, 0, -3, -4, 0, 0, 0, + 0, 3, 0, -3, -8, -3, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, 0, + 0, -11, 0, -3, 0, 0, 0, -10, + 5, 0, 0, 0, -13, -5, -10, 0, + 0, -13, 0, -5, 0, -23, 0, 0, + 0, 0, -47, 0, -10, -18, -24, 0, + 0, -32, 0, -3, -7, 0, 0, 0, + 0, 0, 0, 0, 0, -5, -7, -2, + -7, 1, 0, 0, 8, -6, 0, 15, + 24, -5, -5, -14, 6, 24, 8, 11, + -13, 6, 20, 6, 14, 11, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 30, 23, -9, -5, 0, -4, + 38, 21, 38, 0, 0, 0, 5, 0, + 0, 18, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 7, + 0, 0, 0, 0, -40, -6, -4, -20, + -24, 0, 0, -32, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 0, -40, -6, -4, + -20, -24, 0, 0, -19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, -11, 5, 0, -5, + 4, 9, 5, -14, 0, -1, -4, 5, + 0, 4, 0, 0, 0, 0, -12, 0, + -4, -3, -10, 0, -4, -19, 0, 30, + -5, 0, -11, -3, 0, -3, -8, 0, + -5, -13, -10, -6, 0, 0, 0, -8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 0, 0, 0, 0, -40, + -6, -4, -20, -24, 0, 0, -32, 0, + 0, 0, 0, 0, 0, 24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, 0, -15, -6, -4, 14, -4, -5, + -19, 1, -3, 1, -3, -13, 1, 11, + 1, 4, 1, 4, -12, -19, -6, 0, + -18, -9, -13, -20, -19, 0, -8, -10, + -6, -6, -4, -3, -6, -3, 0, -3, + -1, 7, 0, 7, -3, 0, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, -5, -5, 0, 0, + -13, 0, -2, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -29, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, -6, + 0, 0, 0, 0, -4, 0, 0, -8, + -5, 5, 0, -8, -9, -3, 0, -14, + -3, -11, -3, -6, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -32, 0, 15, 0, 0, -9, 0, + 0, 0, 0, -6, 0, -5, 0, 0, + -2, 0, 0, -3, 0, -11, 0, 0, + 20, -6, -16, -15, 3, 5, 5, -1, + -13, 3, 7, 3, 14, 3, 16, -3, + -13, 0, 0, -19, 0, 0, -14, -13, + 0, 0, -10, 0, -6, -8, 0, -7, + 0, -7, 0, -3, 7, 0, -4, -14, + -5, 18, 0, 0, -4, 0, -10, 0, + 0, 6, -11, 0, 5, -5, 4, 0, + 0, -16, 0, -3, -1, 0, -5, 5, + -4, 0, 0, 0, -20, -6, -11, 0, + -14, 0, 0, -23, 0, 18, -5, 0, + -9, 0, 3, 0, -5, 0, -5, -14, + 0, -5, 5, 0, 0, 0, 0, -3, + 0, 0, 5, -6, 1, 0, 0, -6, + -3, 0, -6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -30, 0, 11, 0, + 0, -4, 0, 0, 0, 0, 1, 0, + -5, -5, 0, 0, 0, 10, 0, 11, + 0, 0, 0, 0, 0, -30, -27, 1, + 21, 14, 8, -19, 3, 20, 0, 18, + 0, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 25, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserrat_30 = { +#else +lv_font_t lv_font_montserrat_30 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 33, /*The maximum line height required by the font*/ + .base_line = 6, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_30*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_32.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_32.c new file mode 100644 index 0000000..f4dad0c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_32.c @@ -0,0 +1,6221 @@ +/******************************************************************************* + * Size: 32 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 32 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_32.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_32 + #define LV_FONT_MONTSERRAT_32 1 +#endif + +#if LV_FONT_MONTSERRAT_32 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x7f, 0xff, 0x17, 0xff, 0xf0, 0x6f, 0xff, 0x5, + 0xff, 0xf0, 0x5f, 0xfe, 0x4, 0xff, 0xe0, 0x4f, + 0xfd, 0x3, 0xff, 0xc0, 0x2f, 0xfc, 0x2, 0xff, + 0xb0, 0x1f, 0xfb, 0x1, 0xff, 0xa0, 0xf, 0xf9, + 0x0, 0xff, 0x90, 0xf, 0xf8, 0x0, 0x33, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0xb, + 0xff, 0xf4, 0xaf, 0xff, 0x42, 0xcf, 0x90, + + /* U+0022 "\"" */ + 0xff, 0xb0, 0x2, 0xff, 0x7f, 0xfa, 0x0, 0x2f, + 0xf7, 0xef, 0xa0, 0x2, 0xff, 0x6e, 0xf9, 0x0, + 0x1f, 0xf6, 0xef, 0x90, 0x1, 0xff, 0x6d, 0xf8, + 0x0, 0x1f, 0xf5, 0xdf, 0x80, 0x0, 0xff, 0x5d, + 0xf8, 0x0, 0xf, 0xf4, 0x79, 0x40, 0x0, 0x99, + 0x20, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, 0x0, 0x6, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf6, + 0x0, 0x0, 0x9, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf4, 0x0, 0x0, 0xb, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf2, 0x0, 0x0, + 0xd, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xf0, 0x0, 0x0, 0xf, 0xf4, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x55, 0x55, + 0xcf, 0xb5, 0x55, 0x55, 0x9f, 0xe5, 0x55, 0x53, + 0x0, 0x0, 0x0, 0xcf, 0x70, 0x0, 0x0, 0x7f, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x60, + 0x0, 0x0, 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x40, 0x0, 0x0, 0xbf, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x20, 0x0, 0x0, + 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x0, 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xfe, 0x0, 0x0, 0x0, 0xff, 0x30, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x5, 0x55, 0x5d, 0xfa, 0x55, 0x55, 0x59, 0xfe, + 0x55, 0x55, 0x30, 0x0, 0x0, 0xd, 0xf6, 0x0, + 0x0, 0x8, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf4, 0x0, 0x0, 0xa, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf2, 0x0, 0x0, 0xc, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf0, + 0x0, 0x0, 0xe, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xe0, 0x0, 0x0, 0xf, 0xf3, 0x0, + 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xce, + 0xff, 0xfe, 0xb8, 0x20, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0xbf, + 0xff, 0xfc, 0xff, 0xde, 0xff, 0xff, 0x50, 0x7, + 0xff, 0xf8, 0x10, 0xef, 0x20, 0x16, 0xce, 0x0, + 0xe, 0xff, 0x70, 0x0, 0xef, 0x20, 0x0, 0x2, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0xef, 0x20, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0xef, 0x20, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x70, 0x0, 0xef, + 0x20, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x30, + 0xef, 0x20, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xfd, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xdf, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xef, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0xef, 0x22, 0x9f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, + 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x20, 0x0, 0xaf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xef, 0x20, 0x0, 0xaf, 0xf8, 0xb, 0x50, 0x0, + 0x0, 0xef, 0x20, 0x1, 0xef, 0xf4, 0x4f, 0xfc, + 0x51, 0x0, 0xef, 0x20, 0x3d, 0xff, 0xd0, 0x5f, + 0xff, 0xff, 0xdc, 0xff, 0xce, 0xff, 0xff, 0x30, + 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xff, 0xfe, 0xa5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x78, 0x10, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x2a, 0xef, 0xd8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xe1, 0x0, 0x0, 0x3f, 0xff, 0xdf, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x2f, 0xf5, 0x0, + 0x0, 0xe, 0xf8, 0x0, 0xa, 0xfb, 0x0, 0x0, + 0x0, 0xc, 0xfa, 0x0, 0x0, 0x6, 0xfd, 0x0, + 0x0, 0x1f, 0xf3, 0x0, 0x0, 0x8, 0xfe, 0x0, + 0x0, 0x0, 0xaf, 0x70, 0x0, 0x0, 0xaf, 0x70, + 0x0, 0x3, 0xff, 0x40, 0x0, 0x0, 0xc, 0xf5, + 0x0, 0x0, 0x8, 0xf8, 0x0, 0x0, 0xdf, 0x80, + 0x0, 0x0, 0x0, 0xcf, 0x50, 0x0, 0x0, 0x8f, + 0x80, 0x0, 0x9f, 0xd0, 0x0, 0x0, 0x0, 0xa, + 0xf7, 0x0, 0x0, 0xb, 0xf6, 0x0, 0x4f, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xe0, 0x0, 0x1, + 0xff, 0x20, 0x1e, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xb2, 0x3, 0xcf, 0xa0, 0xb, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xc0, 0x6, 0xff, 0x20, 0x19, 0xdf, 0xe9, + 0x20, 0x0, 0x0, 0x7b, 0xcb, 0x60, 0x2, 0xff, + 0x60, 0x1e, 0xff, 0xdf, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xa0, 0xc, 0xfb, 0x10, + 0x9, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xe1, 0x3, 0xff, 0x10, 0x0, 0xe, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf4, 0x0, 0x7f, 0xa0, + 0x0, 0x0, 0x7f, 0xa0, 0x0, 0x0, 0x0, 0xd, + 0xf9, 0x0, 0x9, 0xf8, 0x0, 0x0, 0x5, 0xfc, + 0x0, 0x0, 0x0, 0x9, 0xfd, 0x0, 0x0, 0x9f, + 0x70, 0x0, 0x0, 0x5f, 0xc0, 0x0, 0x0, 0x4, + 0xff, 0x30, 0x0, 0x7, 0xf9, 0x0, 0x0, 0x7, + 0xfa, 0x0, 0x0, 0x1, 0xef, 0x80, 0x0, 0x0, + 0x3f, 0xe0, 0x0, 0x0, 0xcf, 0x60, 0x0, 0x0, + 0xaf, 0xc0, 0x0, 0x0, 0x0, 0xcf, 0x80, 0x0, + 0x6f, 0xe0, 0x0, 0x0, 0x5f, 0xf2, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xda, 0xcf, 0xf3, 0x0, 0x0, + 0x1e, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9e, + 0xfe, 0xa2, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x2, 0x8d, 0xff, 0xea, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xf9, 0x54, 0x6e, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf7, 0x0, 0x0, 0x2f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, 0x0, + 0xdf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf2, + 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x90, 0x0, 0xb, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0x60, 0x3d, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xfe, 0x9f, + 0xff, 0x70, 0x0, 0x0, 0x50, 0x0, 0x1, 0xdf, + 0xfa, 0x10, 0x4f, 0xff, 0x80, 0x0, 0x5f, 0xf4, + 0x0, 0xbf, 0xf8, 0x0, 0x0, 0x4f, 0xff, 0x90, + 0x9, 0xff, 0x10, 0x3f, 0xfd, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x91, 0xff, 0xc0, 0x7, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xef, 0xf5, 0x0, + 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xfc, 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xc0, 0x0, 0x1e, 0xff, 0xb2, + 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xc1, 0x0, + 0x5f, 0xff, 0xfc, 0xa8, 0x9c, 0xff, 0xff, 0x6c, + 0xff, 0xc1, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x20, 0x1c, 0xfe, 0x20, 0x0, 0x5, 0xad, + 0xff, 0xec, 0x83, 0x0, 0x0, 0x1c, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0027 "'" */ + 0xff, 0xbf, 0xfa, 0xef, 0xae, 0xf9, 0xef, 0x9d, + 0xf8, 0xdf, 0x8d, 0xf8, 0x79, 0x40, + + /* U+0028 "(" */ + 0x0, 0x6, 0xff, 0x80, 0x0, 0xef, 0xe0, 0x0, + 0x7f, 0xf8, 0x0, 0xe, 0xff, 0x10, 0x3, 0xff, + 0xb0, 0x0, 0x8f, 0xf6, 0x0, 0xe, 0xff, 0x10, + 0x1, 0xff, 0xd0, 0x0, 0x4f, 0xfa, 0x0, 0x7, + 0xff, 0x80, 0x0, 0xaf, 0xf5, 0x0, 0xc, 0xff, + 0x30, 0x0, 0xcf, 0xf2, 0x0, 0xd, 0xff, 0x20, + 0x0, 0xef, 0xf1, 0x0, 0xe, 0xff, 0x10, 0x0, + 0xdf, 0xf2, 0x0, 0xc, 0xff, 0x20, 0x0, 0xcf, + 0xf3, 0x0, 0xa, 0xff, 0x50, 0x0, 0x7f, 0xf8, + 0x0, 0x4, 0xff, 0xa0, 0x0, 0x1f, 0xfd, 0x0, + 0x0, 0xdf, 0xf1, 0x0, 0x8, 0xff, 0x60, 0x0, + 0x3f, 0xfb, 0x0, 0x0, 0xdf, 0xf1, 0x0, 0x6, + 0xff, 0x80, 0x0, 0xe, 0xfe, 0x0, 0x0, 0x6f, + 0xf8, + + /* U+0029 ")" */ + 0xbf, 0xf3, 0x0, 0x4, 0xff, 0xb0, 0x0, 0xc, + 0xff, 0x30, 0x0, 0x5f, 0xfb, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0xa, 0xff, 0x50, 0x0, 0x5f, 0xfb, + 0x0, 0x1, 0xff, 0xe0, 0x0, 0xe, 0xff, 0x10, + 0x0, 0xbf, 0xf4, 0x0, 0x8, 0xff, 0x70, 0x0, + 0x6f, 0xf9, 0x0, 0x6, 0xff, 0xa0, 0x0, 0x5f, + 0xfb, 0x0, 0x4, 0xff, 0xb0, 0x0, 0x4f, 0xfc, + 0x0, 0x5, 0xff, 0xb0, 0x0, 0x6f, 0xfa, 0x0, + 0x6, 0xff, 0x90, 0x0, 0x8f, 0xf7, 0x0, 0xb, + 0xff, 0x40, 0x0, 0xef, 0xf1, 0x0, 0x1f, 0xfe, + 0x0, 0x5, 0xff, 0xb0, 0x0, 0xaf, 0xf5, 0x0, + 0xf, 0xff, 0x0, 0x4, 0xff, 0xb0, 0x0, 0xcf, + 0xf3, 0x0, 0x3f, 0xfb, 0x0, 0xb, 0xff, 0x30, + 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0x50, 0x0, 0x0, 0x9, 0x70, 0x8, + 0xf5, 0x0, 0x87, 0x2, 0xff, 0xd4, 0x8f, 0x56, + 0xef, 0xe0, 0x4, 0xdf, 0xfe, 0xfe, 0xff, 0xb3, + 0x0, 0x0, 0x6e, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x7e, 0xff, + 0xdf, 0xdf, 0xfd, 0x50, 0x2f, 0xfa, 0x28, 0xf5, + 0x3c, 0xfe, 0x0, 0x74, 0x0, 0x8f, 0x50, 0x6, + 0x50, 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7d, 0x40, 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0xee, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xfa, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x78, 0x88, 0x88, 0xff, + 0xd8, 0x88, 0x88, 0x30, 0x0, 0x0, 0xf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, 0x0, + 0x0, + + /* U+002C "," */ + 0x7, 0xca, 0x14, 0xff, 0xf9, 0x6f, 0xff, 0xb2, + 0xef, 0xf8, 0x4, 0xff, 0x30, 0x6f, 0xe0, 0xa, + 0xf9, 0x0, 0xef, 0x30, 0x2f, 0xe0, 0x0, + + /* U+002D "-" */ + 0x1a, 0xaa, 0xaa, 0xaa, 0xa4, 0x2f, 0xff, 0xff, + 0xff, 0xf7, 0x2f, 0xff, 0xff, 0xff, 0xf7, + + /* U+002E "." */ + 0x1, 0x42, 0x1, 0xef, 0xf4, 0x7f, 0xff, 0xb6, + 0xff, 0xf9, 0xa, 0xfc, 0x10, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x6b, 0xef, 0xfc, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xfd, + 0xef, 0xff, 0xfc, 0x0, 0x0, 0x5, 0xff, 0xfc, + 0x40, 0x0, 0x29, 0xff, 0xfa, 0x0, 0x0, 0xef, + 0xfb, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x0, + 0x7f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xc0, 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x21, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf6, 0x4f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x96, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfb, 0x7f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xc7, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfc, 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xb4, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x1f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x60, 0xdf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, + 0x7, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xfc, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x40, 0x0, 0x5f, 0xff, 0xc4, 0x0, + 0x2, 0x9f, 0xff, 0xa0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xde, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xbe, 0xff, 0xd8, 0x20, 0x0, + 0x0, + + /* U+0031 "1" */ + 0xcf, 0xff, 0xff, 0xff, 0x7c, 0xff, 0xff, 0xff, + 0xf7, 0x9c, 0xcc, 0xce, 0xff, 0x70, 0x0, 0x0, + 0xbf, 0xf7, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, + 0x0, 0xbf, 0xf7, 0x0, 0x0, 0xb, 0xff, 0x70, + 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x0, 0xb, 0xff, + 0x70, 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x0, 0xb, + 0xff, 0x70, 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x0, + 0xb, 0xff, 0x70, 0x0, 0x0, 0xbf, 0xf7, 0x0, + 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, 0xbf, 0xf7, + 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, 0xbf, + 0xf7, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, + 0xbf, 0xf7, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, + 0x0, 0xbf, 0xf7, + + /* U+0032 "2" */ + 0x0, 0x0, 0x49, 0xce, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x9, 0xff, 0xff, 0xfe, 0xde, 0xff, + 0xff, 0xe2, 0x0, 0x4f, 0xff, 0xb4, 0x0, 0x0, + 0x18, 0xff, 0xfb, 0x0, 0x4, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xc3, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + + /* U+0033 "3" */ + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x9, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfd, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, + 0x6, 0x99, 0xad, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xb0, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xf7, 0x5f, 0xfe, 0x83, 0x0, 0x0, 0x16, 0xef, + 0xfe, 0x7, 0xff, 0xff, 0xff, 0xed, 0xef, 0xff, + 0xff, 0x30, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x27, 0xbd, 0xef, 0xed, + 0x94, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xa0, 0x0, 0x3, 0xdd, 0x90, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xd0, 0x0, 0x0, 0x3f, + 0xfc, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf2, 0x0, + 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0x3, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, + 0x1, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xc0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, + 0xbb, 0xbb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xc0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xe, 0xff, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfd, 0xcc, 0xba, 0x96, 0x20, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x40, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x49, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf0, 0x6, 0xd3, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xc0, 0x1e, 0xff, 0xb5, 0x10, 0x0, 0x4, + 0xcf, 0xff, 0x40, 0x2e, 0xff, 0xff, 0xfe, 0xdd, + 0xff, 0xff, 0xf8, 0x0, 0x1, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x59, + 0xde, 0xff, 0xdb, 0x61, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, 0x94, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x3, 0xef, 0xff, 0xfe, 0xcb, + 0xcf, 0xff, 0x10, 0x0, 0x2e, 0xff, 0xf8, 0x10, + 0x0, 0x0, 0x36, 0x0, 0x0, 0xcf, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfe, 0x0, 0x2, 0x68, 0x87, 0x40, 0x0, + 0x0, 0x5f, 0xfc, 0x4, 0xdf, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x6f, 0xfb, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x7f, 0xff, 0xff, 0xd6, 0x10, + 0x3, 0x9f, 0xff, 0xc0, 0x6f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf4, 0x5f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0x2f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfc, 0xe, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfd, + 0x9, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfb, 0x2, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf6, 0x0, 0x8f, 0xff, 0x60, 0x0, 0x0, + 0x2c, 0xff, 0xe0, 0x0, 0xa, 0xff, 0xfe, 0xb9, + 0x9c, 0xff, 0xff, 0x20, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x1, + 0x7b, 0xef, 0xfd, 0xa4, 0x0, 0x0, + + /* U+0037 "7" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xf, 0xff, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xff, 0xfb, 0xf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf3, 0xf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xc0, 0xf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, 0xb, 0xbb, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x16, 0xbd, 0xff, 0xed, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x9f, 0xff, 0xfc, 0xa9, + 0xbd, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0x91, + 0x0, 0x0, 0x4, 0xdf, 0xfe, 0x0, 0x9, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, + 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x60, 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf4, 0x0, 0x6f, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x6f, 0xfe, 0x0, 0x0, 0xcf, 0xfe, 0x83, + 0x10, 0x14, 0xaf, 0xff, 0x50, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, + 0x0, 0x1c, 0xff, 0xfc, 0x97, 0x67, 0xaf, 0xff, + 0xf7, 0x0, 0xb, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf5, 0x3, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xd0, 0x7f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x19, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf2, + 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x14, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xd0, 0xc, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x2b, 0xff, 0xf6, 0x0, 0x1d, 0xff, 0xff, + 0xb9, 0x9a, 0xdf, 0xff, 0xf8, 0x0, 0x0, 0x1a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x2, 0x7b, 0xdf, 0xfe, 0xd9, 0x50, 0x0, + 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x16, 0xbd, 0xff, 0xda, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfb, 0x99, + 0xbf, 0xff, 0xf6, 0x0, 0x0, 0x4f, 0xff, 0x90, + 0x0, 0x0, 0x8, 0xff, 0xf3, 0x0, 0xb, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x40, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfa, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xd0, 0xc, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, 0x5f, 0xff, + 0x90, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf1, 0x0, + 0xaf, 0xff, 0xfb, 0x99, 0xbf, 0xff, 0xaf, 0xff, + 0x20, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xff, 0xf2, 0x0, 0x0, 0x28, 0xce, 0xfe, 0xc8, + 0x20, 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf7, 0x0, 0x0, 0x9, 0x30, 0x0, 0x0, + 0x3b, 0xff, 0xfb, 0x0, 0x0, 0x5, 0xff, 0xec, + 0xbc, 0xef, 0xff, 0xfc, 0x10, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xdf, 0xff, 0xda, 0x60, 0x0, 0x0, + 0x0, + + /* U+003A ":" */ + 0x9, 0xfc, 0x16, 0xff, 0xf9, 0x7f, 0xff, 0xb1, + 0xef, 0xf4, 0x1, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x42, + 0x1, 0xef, 0xf4, 0x7f, 0xff, 0xb6, 0xff, 0xf9, + 0xa, 0xfc, 0x10, + + /* U+003B ";" */ + 0x9, 0xfc, 0x16, 0xff, 0xf9, 0x7f, 0xff, 0xb1, + 0xef, 0xf4, 0x1, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xc1, 0x5f, 0xff, 0xa6, 0xff, 0xfb, + 0x1d, 0xff, 0x80, 0x3f, 0xf3, 0x7, 0xfd, 0x0, + 0xbf, 0x80, 0xf, 0xf2, 0x2, 0xdb, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xb7, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x5c, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x39, 0xff, 0xff, 0xfa, 0x40, 0x0, 0x6, 0xcf, + 0xff, 0xfd, 0x71, 0x0, 0x0, 0x8f, 0xff, 0xfe, + 0x93, 0x0, 0x0, 0x0, 0xd, 0xff, 0xc5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x93, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xfd, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xef, 0xff, 0xfa, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, + 0x60, + + /* U+003D "=" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x78, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x83, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, + + /* U+003E ">" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xf9, 0x30, 0x0, 0x0, 0x0, 0x1, 0x6d, + 0xff, 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x3, + 0x9e, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x17, 0xef, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xff, 0x70, 0x0, 0x0, 0x3, 0x9e, + 0xff, 0xff, 0xa2, 0x0, 0x1, 0x6d, 0xff, 0xff, + 0xc6, 0x10, 0x0, 0x4a, 0xff, 0xff, 0xf9, 0x30, + 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x60, 0x0, 0x0, + 0x0, 0xd, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x59, 0xde, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0xa, 0xff, 0xff, 0xec, 0xbd, 0xff, 0xff, + 0xf3, 0x6, 0xff, 0xf9, 0x20, 0x0, 0x1, 0x8f, + 0xff, 0xc0, 0x5, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xee, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xe4, + 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, 0xbd, 0xff, + 0xfe, 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xea, 0x63, 0x21, 0x23, + 0x58, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xe2, 0x0, 0x0, 0x0, 0xbf, + 0xf5, 0x0, 0x0, 0x1, 0x56, 0x64, 0x0, 0x1, + 0x77, 0x41, 0xdf, 0xd0, 0x0, 0x0, 0x6f, 0xf6, + 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0x91, 0x3f, + 0xf9, 0x1, 0xef, 0x90, 0x0, 0xe, 0xfa, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe5, 0xff, + 0x90, 0x4, 0xff, 0x20, 0x6, 0xff, 0x20, 0x0, + 0x3f, 0xff, 0xc4, 0x10, 0x26, 0xef, 0xff, 0xf9, + 0x0, 0xb, 0xf9, 0x0, 0xcf, 0xa0, 0x0, 0xd, + 0xff, 0x80, 0x0, 0x0, 0x1, 0xcf, 0xff, 0x90, + 0x0, 0x5f, 0xe0, 0x1f, 0xf5, 0x0, 0x4, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf9, 0x0, + 0x0, 0xff, 0x34, 0xff, 0x10, 0x0, 0x9f, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x0, + 0xc, 0xf6, 0x6f, 0xf0, 0x0, 0xc, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, + 0xbf, 0x77, 0xfe, 0x0, 0x0, 0xdf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0xa, + 0xf8, 0x7f, 0xe0, 0x0, 0xd, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x0, 0x0, 0xaf, + 0x76, 0xff, 0x0, 0x0, 0xbf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0x90, 0x0, 0xb, 0xf6, + 0x3f, 0xf2, 0x0, 0x7, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, 0xef, 0x40, + 0xff, 0x50, 0x0, 0x1f, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x90, 0x0, 0x3f, 0xf0, 0xc, + 0xfa, 0x0, 0x0, 0x8f, 0xfd, 0x30, 0x0, 0x0, + 0x6f, 0xff, 0xfd, 0x0, 0xb, 0xfa, 0x0, 0x6f, + 0xf2, 0x0, 0x0, 0xcf, 0xff, 0xb7, 0x68, 0xdf, + 0xf9, 0xcf, 0xfb, 0x7b, 0xff, 0x20, 0x0, 0xef, + 0xb0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf8, + 0x5, 0xff, 0xff, 0xff, 0x60, 0x0, 0x5, 0xff, + 0x60, 0x0, 0x0, 0x3a, 0xdf, 0xfd, 0x93, 0x0, + 0x4, 0xcf, 0xeb, 0x40, 0x0, 0x0, 0xa, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xa6, 0x43, 0x23, 0x47, 0xaf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x9b, 0xef, 0xff, 0xdb, 0x83, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xfb, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x1b, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xa0, 0x4f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf3, 0x0, 0xdf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfc, 0x0, 0x6, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x40, 0x0, 0xe, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xd0, 0x0, 0x0, + 0x7f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf6, 0x0, 0x0, 0x1, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x80, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x7, 0xff, 0xd8, 0x88, 0x88, 0x88, 0x88, + 0x88, 0xaf, 0xfe, 0x0, 0x0, 0x0, 0xef, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0xd, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x40, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0xcf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf3, + + /* U+0042 "B" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x60, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x50, 0x0, 0xaf, 0xfd, 0x99, 0x99, + 0x99, 0x9a, 0xdf, 0xff, 0xf6, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x40, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x60, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x50, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x10, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xf9, 0x0, 0xaf, 0xfd, 0x99, 0x99, 0x99, 0x9a, + 0xdf, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x14, 0xaf, + 0xff, 0x80, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf2, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf7, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf9, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf6, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xf1, 0xaf, 0xfd, + 0x99, 0x99, 0x99, 0x99, 0xad, 0xff, 0xff, 0x60, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe5, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xa5, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x1, 0x6b, 0xdf, 0xfe, 0xd9, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xfe, 0xde, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x7f, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x5b, + 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xeb, 0x0, 0x1e, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x5, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xb0, 0x0, 0x7, 0xff, + 0xff, 0xa4, 0x0, 0x0, 0x5, 0xbf, 0xff, 0xa0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xed, 0xef, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x17, 0xbd, 0xff, 0xed, 0x95, 0x0, 0x0, + + /* U+0044 "D" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc8, 0x40, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0xaf, 0xfe, + 0xcc, 0xcc, 0xcc, 0xde, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xdf, 0xff, 0xd1, 0x0, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x70, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xe0, 0xaf, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf5, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf9, 0xaf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfc, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfd, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xfd, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfc, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf5, 0xaf, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x70, 0xaf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xdf, 0xff, 0xd1, + 0x0, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xce, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc8, 0x40, 0x0, + 0x0, 0x0, + + /* U+0045 "E" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0x2a, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xdb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb8, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xec, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xc7, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x9a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, + + /* U+0046 "F" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0x2a, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0x90, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xa, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xda, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xfe, 0xde, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x7, 0xff, 0xff, 0xb4, 0x0, 0x0, + 0x4, 0x9f, 0xff, 0xd0, 0x0, 0x5f, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcd, 0x10, 0x1, + 0xef, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, + 0x10, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf0, 0x5f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x2f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf0, 0xe, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf0, 0x8, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, + 0x1, 0xef, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf0, 0x0, 0x4f, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x0, 0x6, + 0xff, 0xff, 0xb4, 0x0, 0x0, 0x3, 0x8f, 0xff, + 0xf0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, 0xde, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xda, 0x61, + 0x0, 0x0, + + /* U+0048 "H" */ + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xef, 0xfa, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfa, + + /* U+0049 "I" */ + 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, + 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, + 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, + 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, + 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, + 0xaf, 0xf9, 0xaf, 0xf9, + + /* U+004A "J" */ + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xc, 0xcc, 0xcc, 0xcc, 0xcf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, + 0x3e, 0x40, 0x0, 0x0, 0x7, 0xff, 0xe0, 0x1e, + 0xff, 0x81, 0x0, 0x5, 0xff, 0xf8, 0x0, 0xaf, + 0xff, 0xfd, 0xce, 0xff, 0xfe, 0x10, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x28, + 0xce, 0xfe, 0xb6, 0x0, 0x0, + + /* U+004B "K" */ + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xd1, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfd, 0x10, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xd1, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfd, 0x10, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe2, + 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0xbf, + 0xfe, 0x20, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, + 0xb, 0xff, 0xe2, 0x0, 0x0, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0xaf, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0xa, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf9, 0x0, 0xaf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0xa, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, + 0xaf, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xf7, 0xef, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x3f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf5, 0x0, + 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x60, 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf5, + 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x30, 0x0, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xe1, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xb0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf8, + + /* U+004C "L" */ + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc8, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+004D "M" */ + 0xaf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x2a, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf2, 0xaf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x2a, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf2, 0xaf, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x2a, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xf2, 0xaf, 0xfb, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xce, 0xff, 0x2a, + 0xff, 0x7b, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf2, 0xef, 0xf2, 0xaf, 0xf7, 0x1f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x8f, 0xf8, 0xe, 0xff, + 0x2a, 0xff, 0x70, 0x7f, 0xfb, 0x0, 0x0, 0x0, + 0x2f, 0xfe, 0x0, 0xef, 0xf2, 0xaf, 0xf7, 0x0, + 0xdf, 0xf5, 0x0, 0x0, 0xb, 0xff, 0x50, 0xe, + 0xff, 0x2a, 0xff, 0x70, 0x3, 0xff, 0xe0, 0x0, + 0x4, 0xff, 0xb0, 0x0, 0xef, 0xf3, 0xaf, 0xf7, + 0x0, 0xa, 0xff, 0x80, 0x0, 0xdf, 0xf2, 0x0, + 0xe, 0xff, 0x3a, 0xff, 0x70, 0x0, 0x1e, 0xff, + 0x20, 0x8f, 0xf8, 0x0, 0x0, 0xef, 0xf3, 0xaf, + 0xf7, 0x0, 0x0, 0x6f, 0xfb, 0x2f, 0xfe, 0x0, + 0x0, 0xe, 0xff, 0x3a, 0xff, 0x70, 0x0, 0x0, + 0xcf, 0xfd, 0xff, 0x50, 0x0, 0x0, 0xef, 0xf3, + 0xaf, 0xf7, 0x0, 0x0, 0x3, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0xe, 0xff, 0x3a, 0xff, 0x70, 0x0, + 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xef, + 0xf3, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x1e, 0xf7, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x3a, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x25, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf3, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x3a, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf3, + + /* U+004E "N" */ + 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, + 0xaf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xfe, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0xbf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, + 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x9f, 0xfa, + 0xaf, 0xf9, 0x2, 0xef, 0xfd, 0x10, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x4f, 0xff, 0xb0, + 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x6, + 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, + 0x0, 0x0, 0x9f, 0xff, 0x60, 0x0, 0x9f, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, + 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x1, 0xef, + 0xfe, 0x10, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xd0, 0x9f, 0xfa, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, 0x9f, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xef, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xfa, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xfa, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfa, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, 0xda, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, 0xde, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xfa, 0x40, 0x0, 0x0, 0x4b, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x4f, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xef, 0xff, 0x30, 0x0, 0xe, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xfd, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, 0x0, + 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xc0, 0x2f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf3, 0x7f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x47, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf4, 0x5f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x32, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, 0xe, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfc, 0x0, 0x8f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x60, + 0x0, 0xef, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xd0, 0x0, 0x4, 0xff, 0xfe, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xf3, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xa4, 0x0, 0x0, + 0x4, 0xbf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xed, 0xef, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xad, 0xff, 0xfd, 0xa6, 0x10, + 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xec, 0x94, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x40, 0x0, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, + 0xdf, 0xff, 0xff, 0x70, 0xa, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x5, 0xdf, 0xff, 0x40, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0xa, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf2, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x5a, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf6, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x5a, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf2, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, + 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5, 0xdf, + 0xff, 0x40, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xdf, + 0xff, 0xff, 0x70, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xec, 0x94, 0x0, 0x0, 0xa, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, 0xda, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, + 0xde, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, + 0x0, 0x0, 0xef, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xd0, 0x0, 0x7, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf5, 0x0, 0xd, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0x0, + 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x0, 0x5f, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x30, 0x6f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x40, 0x7f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x50, 0x5f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x30, 0x3f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, 0xe, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfc, 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, + 0x1, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0x30, 0x0, 0x0, 0x9, 0xff, 0xff, 0x93, 0x0, + 0x0, 0x3, 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xec, 0xbc, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xff, + 0xfe, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0x60, 0x0, + 0x0, 0x8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x30, 0x14, 0xcf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x67, 0x74, 0x0, 0x0, + + /* U+0052 "R" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xec, 0x94, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x40, 0x0, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, + 0xdf, 0xff, 0xff, 0x70, 0xa, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x5, 0xdf, 0xff, 0x40, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0xa, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf2, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x5a, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf6, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x5a, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, + 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5, 0xdf, + 0xff, 0x40, 0xaf, 0xfd, 0xbb, 0xbb, 0xbb, 0xcf, + 0xff, 0xff, 0x70, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x40, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xa, 0xff, + 0x90, 0x0, 0x0, 0x2, 0xff, 0xf5, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x6, 0xff, 0xe1, + 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xb0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x60, 0xa, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x20, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0xa, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xf7, + + /* U+0053 "S" */ + 0x0, 0x0, 0x16, 0xbd, 0xef, 0xed, 0xa6, 0x10, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x20, 0x0, 0xbf, 0xff, 0xfd, 0xbb, 0xce, + 0xff, 0xff, 0x60, 0x7, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x27, 0xde, 0x0, 0xd, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xfc, 0x84, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfc, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x17, 0xcf, 0xff, + 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x48, 0xcf, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x7f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf7, 0xc, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf4, 0x5f, 0xfe, 0x83, 0x0, 0x0, 0x0, + 0x5e, 0xff, 0xd0, 0x4e, 0xff, 0xff, 0xfd, 0xbb, + 0xcf, 0xff, 0xfe, 0x20, 0x1, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x1, 0x59, + 0xce, 0xff, 0xec, 0x83, 0x0, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xac, 0xcc, 0xcc, 0xcc, 0xff, + 0xfc, 0xcc, 0xcc, 0xcc, 0x80, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, + 0x0, + + /* U+0055 "U" */ + 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf1, 0xcf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x7f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xb0, + 0x2f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x70, 0xb, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x10, 0x2, 0xff, 0xff, 0x71, + 0x0, 0x0, 0x5d, 0xff, 0xf6, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xed, 0xef, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9d, 0xef, 0xfd, + 0xa6, 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xf9, 0x5, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf2, + 0x0, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xb0, 0x0, 0x7f, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x30, + 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xfc, 0x0, 0x0, 0x9, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, + 0x0, 0x2, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xaf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x10, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, 0x2, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf8, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x0, 0x0, 0xf, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x70, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, 0xef, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf5, 0x5, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0xc, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0xcf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfd, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x1f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf2, 0x0, 0xcf, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x7, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, + 0x1f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x4f, 0xfa, + 0x9f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, + 0x0, 0x0, 0xcf, 0xf8, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x53, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x4f, + 0xfc, 0x0, 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0xff, 0xf0, 0xe, 0xff, 0x30, 0x0, 0x0, + 0x9, 0xff, 0x70, 0x0, 0x0, 0x1f, 0xff, 0x30, + 0x0, 0x0, 0x5f, 0xfa, 0x0, 0x8f, 0xf8, 0x0, + 0x0, 0x0, 0xef, 0xf1, 0x0, 0x0, 0x0, 0xbf, + 0xf8, 0x0, 0x0, 0xa, 0xff, 0x40, 0x3, 0xff, + 0xd0, 0x0, 0x0, 0x4f, 0xfc, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xd0, 0x0, 0x0, 0xff, 0xe0, 0x0, + 0xd, 0xff, 0x30, 0x0, 0xa, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x30, 0x0, 0x6f, 0xf9, + 0x0, 0x0, 0x7f, 0xf9, 0x0, 0x0, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf8, 0x0, 0xb, + 0xff, 0x30, 0x0, 0x2, 0xff, 0xe0, 0x0, 0x5f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xe0, + 0x1, 0xff, 0xe0, 0x0, 0x0, 0xc, 0xff, 0x40, + 0xa, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x30, 0x6f, 0xf8, 0x0, 0x0, 0x0, 0x7f, + 0xf9, 0x0, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf9, 0xc, 0xff, 0x30, 0x0, 0x0, + 0x1, 0xff, 0xe0, 0x5f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe2, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x4b, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xbf, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, + + /* U+0058 "X" */ + 0xb, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x30, 0x1, 0xef, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xf6, 0x0, 0x0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, 0xa0, + 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x8f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0xbf, 0xfd, + 0x0, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xa0, 0x0, 0x1e, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, 0x0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x27, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xdf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x5d, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf9, 0x2, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xc0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0xa, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x80, + 0x0, 0x0, 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf4, 0x0, 0x7, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x10, 0x3f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xb0, + + /* U+0059 "Y" */ + 0xc, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf8, 0x3, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xd0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x40, 0x0, 0xe, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfa, 0x0, 0x0, 0x5, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x50, 0x0, + 0x0, 0x6f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xe0, 0x0, 0x1, 0xef, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x9, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x20, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xc0, 0xdf, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xfc, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, + + /* U+005A "Z" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x4c, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xef, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, + + /* U+005B "[" */ + 0xaf, 0xff, 0xff, 0xf0, 0xaf, 0xff, 0xff, 0xf0, + 0xaf, 0xfb, 0x88, 0x80, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xfb, 0x88, 0x80, + 0xaf, 0xff, 0xff, 0xf0, 0xaf, 0xff, 0xff, 0xf0, + + /* U+005C "\\" */ + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xe0, + + /* U+005D "]" */ + 0x6f, 0xff, 0xff, 0xf4, 0x6f, 0xff, 0xff, 0xf4, + 0x38, 0x88, 0xef, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x38, 0x88, 0xef, 0xf4, + 0x6f, 0xff, 0xff, 0xf4, 0x6f, 0xff, 0xff, 0xf4, + + /* U+005E "^" */ + 0x0, 0x0, 0x2, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfe, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xfe, 0x3f, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xef, 0x70, 0xcf, 0x90, 0x0, 0x0, 0x0, 0x5f, + 0xf1, 0x6, 0xff, 0x0, 0x0, 0x0, 0xc, 0xfa, + 0x0, 0xe, 0xf6, 0x0, 0x0, 0x3, 0xff, 0x30, + 0x0, 0x8f, 0xd0, 0x0, 0x0, 0xaf, 0xc0, 0x0, + 0x1, 0xff, 0x40, 0x0, 0x1f, 0xf5, 0x0, 0x0, + 0xa, 0xfb, 0x0, 0x8, 0xfe, 0x0, 0x0, 0x0, + 0x4f, 0xf2, 0x0, 0xef, 0x70, 0x0, 0x0, 0x0, + 0xdf, 0x90, 0x6f, 0xf1, 0x0, 0x0, 0x0, 0x6, + 0xff, 0x10, + + /* U+005F "_" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x8, 0xff, 0xf3, 0x0, 0x0, 0x4, 0xef, 0xf4, + 0x0, 0x0, 0x1, 0xcf, 0xf6, 0x0, 0x0, 0x0, + 0x8f, 0xf7, + + /* U+0061 "a" */ + 0x0, 0x2, 0x8b, 0xef, 0xfe, 0xb6, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0xb, 0xff, 0xfe, 0xba, 0xbd, 0xff, 0xff, 0x20, + 0x2, 0xfa, 0x30, 0x0, 0x0, 0x3e, 0xff, 0xb0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x0, 0x5, 0xad, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xb, 0xff, 0xe8, 0x43, 0x33, 0x33, 0xcf, 0xf5, + 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x5f, 0xfc, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, + 0x2f, 0xff, 0x30, 0x0, 0x0, 0x2d, 0xff, 0xf5, + 0xa, 0xff, 0xe8, 0x43, 0x49, 0xff, 0xff, 0xf5, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xf5, + 0x0, 0x5, 0xbe, 0xff, 0xda, 0x40, 0x9f, 0xf5, + + /* U+0062 "b" */ + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf0, 0x4, 0x9d, 0xff, + 0xda, 0x40, 0x0, 0x0, 0x1f, 0xff, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x1, 0xff, 0xfc, + 0xff, 0xfc, 0xbc, 0xff, 0xff, 0xe3, 0x0, 0x1f, + 0xff, 0xff, 0x91, 0x0, 0x0, 0x6f, 0xff, 0xd1, + 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x90, 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x1, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf4, 0x1f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x61, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, + 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x61, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf4, 0x1f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x1, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x90, 0x1f, 0xff, + 0xff, 0x91, 0x0, 0x0, 0x6f, 0xff, 0xd1, 0x1, + 0xff, 0xec, 0xff, 0xfc, 0xbc, 0xff, 0xff, 0xf3, + 0x0, 0x1f, 0xfd, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x0, 0x1, 0xff, 0xd0, 0x4, 0xad, 0xff, + 0xda, 0x40, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x4, 0x9d, 0xff, 0xdb, 0x61, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x3f, 0xff, 0xfe, 0xcb, 0xdf, 0xff, + 0xf6, 0x0, 0x1e, 0xff, 0xe5, 0x0, 0x0, 0x2a, + 0xff, 0xe0, 0xb, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x9, 0xa1, 0x2, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x9, 0xa1, 0x0, 0x1e, + 0xff, 0xe5, 0x0, 0x0, 0x2a, 0xff, 0xe0, 0x0, + 0x3f, 0xff, 0xfe, 0xcb, 0xdf, 0xff, 0xf5, 0x0, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x4, 0x9d, 0xff, 0xeb, 0x61, 0x0, + 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, + 0x0, 0x5, 0xbe, 0xff, 0xd9, 0x20, 0x2f, 0xfe, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x2f, + 0xfe, 0x0, 0x5f, 0xff, 0xfe, 0xcb, 0xdf, 0xff, + 0xcf, 0xfe, 0x2, 0xff, 0xfe, 0x50, 0x0, 0x2, + 0xbf, 0xff, 0xfe, 0xc, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfe, 0x2f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x7f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x9f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0xaf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, + 0x9f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfe, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfe, 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xfe, 0xc, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfe, 0x2, 0xff, 0xfc, 0x20, + 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x0, 0x5f, 0xff, + 0xfb, 0x98, 0xaf, 0xff, 0xcf, 0xfe, 0x0, 0x3, + 0xdf, 0xff, 0xff, 0xff, 0xfa, 0x1f, 0xfe, 0x0, + 0x0, 0x6, 0xbe, 0xff, 0xd9, 0x30, 0xf, 0xfe, + + /* U+0065 "e" */ + 0x0, 0x0, 0x5, 0xbe, 0xff, 0xd9, 0x40, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfb, + 0x10, 0x0, 0x0, 0x5f, 0xff, 0xfb, 0x9a, 0xcf, + 0xff, 0xe1, 0x0, 0x2, 0xff, 0xf9, 0x10, 0x0, + 0x2, 0xcf, 0xfc, 0x0, 0xb, 0xff, 0x80, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x60, 0x2f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0x7f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x9f, 0xf9, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x30, 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x1, 0x80, 0x0, 0x2, 0xef, 0xfe, + 0x50, 0x0, 0x0, 0x5d, 0xf8, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xcb, 0xce, 0xff, 0xfc, 0x0, 0x0, + 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x4, 0x9d, 0xff, 0xec, 0x83, 0x0, + 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x1, 0x9d, 0xff, 0xd7, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xef, + 0xfe, 0x99, 0xdd, 0x0, 0x0, 0x5f, 0xfe, 0x10, + 0x0, 0x10, 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x60, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x4, 0x88, 0xdf, 0xfb, 0x88, 0x88, + 0x20, 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf7, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xd9, 0x40, 0xc, + 0xff, 0x20, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0xcf, 0xf2, 0x0, 0x7f, 0xff, 0xfe, 0xbb, + 0xcf, 0xff, 0xdd, 0xff, 0x20, 0x4f, 0xff, 0xc3, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf2, 0xd, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x24, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf2, 0x8f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x2a, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf2, 0xaf, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x28, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf2, 0x4f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x20, 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf2, 0x4, 0xff, 0xfd, 0x40, 0x0, 0x1, + 0x7f, 0xff, 0xff, 0x20, 0x6, 0xff, 0xff, 0xec, + 0xbc, 0xff, 0xfd, 0xff, 0xf2, 0x0, 0x4, 0xef, + 0xff, 0xff, 0xff, 0xfb, 0x1f, 0xff, 0x20, 0x0, + 0x0, 0x6b, 0xef, 0xfd, 0x94, 0x0, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xc0, 0x0, 0x64, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xf7, 0x0, 0x2f, 0xfb, 0x50, + 0x0, 0x0, 0x5, 0xef, 0xfe, 0x0, 0x7, 0xff, + 0xff, 0xfd, 0xbb, 0xcf, 0xff, 0xff, 0x40, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x0, 0x38, 0xbd, 0xff, 0xed, 0xa5, + 0x0, 0x0, 0x0, + + /* U+0068 "h" */ + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x0, 0x4a, 0xdf, 0xfd, 0xa3, 0x0, 0x0, + 0x1f, 0xff, 0x1c, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x1f, 0xff, 0xdf, 0xff, 0xcc, 0xdf, 0xff, + 0xf9, 0x0, 0x1f, 0xff, 0xff, 0x60, 0x0, 0x2, + 0xcf, 0xff, 0x30, 0x1f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x90, 0x1f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xd0, 0x1f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, + + /* U+0069 "i" */ + 0x1b, 0xfb, 0x8, 0xff, 0xf6, 0x8f, 0xff, 0x61, + 0xbe, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x1, 0xff, + 0xf0, 0x1f, 0xff, 0x1, 0xff, 0xf0, 0x1f, 0xff, + 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x1, 0xff, 0xf0, + 0x1f, 0xff, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x1, + 0xff, 0xf0, 0x1f, 0xff, 0x1, 0xff, 0xf0, 0x1f, + 0xff, 0x1, 0xff, 0xf0, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0xaf, 0xc1, 0x0, 0x0, 0x5, + 0xff, 0xf9, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0xae, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, + 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, + 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, + 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, + 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, + 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, + 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, + 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, + 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, + 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, + 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, + 0x0, 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x1, + 0xff, 0xf0, 0x2, 0x0, 0x8, 0xff, 0xd0, 0x5f, + 0xb9, 0xcf, 0xff, 0x70, 0xbf, 0xff, 0xff, 0xfb, + 0x0, 0x4a, 0xdf, 0xfc, 0x60, 0x0, + + /* U+006B "k" */ + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x60, + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf6, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x60, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x9, 0xff, + 0xf6, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0xaf, + 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, 0x0, 0xb, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x1, + 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x1d, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xef, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xe6, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfd, 0x20, 0x6f, 0xff, 0x80, + 0x0, 0x0, 0x1f, 0xff, 0xc1, 0x0, 0x9, 0xff, + 0xf5, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x20, 0x0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xd0, 0x0, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf4, + + /* U+006C "l" */ + 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, + 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, + 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, + 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, + 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, + 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, + + /* U+006D "m" */ + 0x1f, 0xfd, 0x0, 0x6b, 0xef, 0xec, 0x71, 0x0, + 0x0, 0x49, 0xde, 0xfe, 0xa4, 0x0, 0x0, 0x1f, + 0xfd, 0x3d, 0xff, 0xff, 0xff, 0xff, 0x50, 0x1b, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1f, 0xfe, + 0xef, 0xfc, 0xa9, 0xcf, 0xff, 0xf5, 0xdf, 0xff, + 0xb9, 0xae, 0xff, 0xfb, 0x0, 0x1f, 0xff, 0xfd, + 0x30, 0x0, 0x3, 0xef, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x8f, 0xff, 0x50, 0x1f, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xb0, 0x1f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xe0, 0x1f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf1, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf1, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf1, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf1, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf1, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + + /* U+006E "n" */ + 0x1f, 0xfd, 0x0, 0x5a, 0xdf, 0xfd, 0xa3, 0x0, + 0x0, 0x1f, 0xfd, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x1f, 0xfe, 0xef, 0xfd, 0xa9, 0xbf, + 0xff, 0xf9, 0x0, 0x1f, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0xaf, 0xff, 0x30, 0x1f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x90, 0x1f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xd0, 0x1f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf0, + + /* U+006F "o" */ + 0x0, 0x0, 0x4, 0xad, 0xff, 0xeb, 0x60, 0x0, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xfe, + 0x50, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xcb, 0xdf, + 0xff, 0xf8, 0x0, 0x2, 0xef, 0xfe, 0x50, 0x0, + 0x2, 0xbf, 0xff, 0x50, 0xb, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf1, 0x2f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf7, 0x6f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfb, 0x9f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, + 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfe, 0x6f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfb, 0x2f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf7, 0xb, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf1, 0x1, 0xef, 0xfe, + 0x40, 0x0, 0x2, 0xbf, 0xff, 0x50, 0x0, 0x4f, + 0xff, 0xfe, 0xbb, 0xdf, 0xff, 0xf8, 0x0, 0x0, + 0x2, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0x0, 0x0, 0x4, 0xad, 0xff, 0xeb, 0x60, 0x0, + 0x0, + + /* U+0070 "p" */ + 0x1f, 0xfd, 0x0, 0x4a, 0xdf, 0xfd, 0xa4, 0x0, + 0x0, 0x1, 0xff, 0xd1, 0xcf, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x1f, 0xfe, 0xdf, 0xfe, 0xa8, + 0x9d, 0xff, 0xfe, 0x30, 0x1, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x4, 0xef, 0xfd, 0x10, 0x1f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf9, 0x1, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x41, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf6, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x71, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf6, 0x1f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x41, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf0, 0x1f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf9, 0x1, 0xff, 0xff, 0xf9, 0x10, + 0x0, 0x6, 0xff, 0xfd, 0x10, 0x1f, 0xff, 0xbf, + 0xff, 0xcb, 0xcf, 0xff, 0xff, 0x30, 0x1, 0xff, + 0xf0, 0xaf, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x1f, 0xff, 0x0, 0x39, 0xdf, 0xfd, 0xa4, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x5, 0xbe, 0xff, 0xd9, 0x30, 0xf, + 0xfe, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xf9, + 0xf, 0xfe, 0x0, 0x5f, 0xff, 0xfe, 0xcb, 0xdf, + 0xff, 0xaf, 0xfe, 0x2, 0xff, 0xfe, 0x50, 0x0, + 0x2, 0xbf, 0xff, 0xfe, 0xc, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfe, 0x2f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x7f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x9f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, + 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfe, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfe, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfe, 0x2f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xfe, 0xc, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfe, 0x2, 0xff, 0xfe, + 0x40, 0x0, 0x2, 0xbf, 0xff, 0xfe, 0x0, 0x5f, + 0xff, 0xfe, 0xbb, 0xdf, 0xff, 0xbf, 0xfe, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xfe, + 0x0, 0x0, 0x6, 0xbe, 0xff, 0xd8, 0x20, 0x2f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, + + /* U+0072 "r" */ + 0x1f, 0xfd, 0x0, 0x5a, 0xdf, 0x1, 0xff, 0xd1, + 0xbf, 0xff, 0xf0, 0x1f, 0xfd, 0xcf, 0xff, 0xfe, + 0x1, 0xff, 0xff, 0xf9, 0x30, 0x0, 0x1f, 0xff, + 0xf5, 0x0, 0x0, 0x1, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x1, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x4a, 0xdf, 0xfe, 0xd9, 0x50, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xdf, 0xff, 0xdb, 0xaa, 0xdf, 0xff, 0x10, + 0x6, 0xff, 0xe3, 0x0, 0x0, 0x1, 0x87, 0x0, + 0xa, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xfd, 0xa7, 0x40, 0x0, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, + 0x0, 0x0, 0x15, 0x9c, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x6e, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, + 0x6, 0xf9, 0x30, 0x0, 0x0, 0xa, 0xff, 0xd0, + 0xe, 0xff, 0xff, 0xca, 0xac, 0xff, 0xff, 0x50, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x5, 0x9c, 0xef, 0xfe, 0xb7, 0x10, 0x0, + + /* U+0074 "t" */ + 0x0, 0x5, 0x88, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x48, + 0x8d, 0xff, 0xb8, 0x88, 0x82, 0x0, 0x0, 0xaf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfe, 0x10, 0x0, 0x20, 0x0, 0x1, 0xff, + 0xff, 0xaa, 0xdd, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x3, 0xae, 0xff, 0xc6, + 0x0, + + /* U+0075 "u" */ + 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xb4, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfb, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xb4, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfb, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xb4, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfb, 0x4f, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xb4, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xfb, 0x4f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xb3, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x3f, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xb1, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, 0xd, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xb0, 0x7f, + 0xff, 0x60, 0x0, 0x0, 0x6f, 0xff, 0xfb, 0x0, + 0xcf, 0xff, 0xd9, 0x9a, 0xef, 0xfd, 0xff, 0xb0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xfa, 0x3f, 0xfb, + 0x0, 0x0, 0x4a, 0xef, 0xfd, 0x93, 0x3, 0xff, + 0xb0, + + /* U+0076 "v" */ + 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xb0, 0x6f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf4, 0x0, 0xef, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x8, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x60, 0x0, 0x1f, + 0xff, 0x10, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, + 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x8f, 0xf8, + 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0xe, + 0xff, 0x10, 0x0, 0x0, 0xc, 0xff, 0x50, 0x0, + 0x5, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5f, 0xfc, + 0x0, 0x0, 0xcf, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf3, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x90, 0xa, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x12, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf7, 0x8f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xef, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x0, 0x0, + 0x0, 0x0, + + /* U+0077 "w" */ + 0xaf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x64, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf0, 0xe, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x1f, 0xfa, 0x0, 0x8f, 0xf6, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x7, + 0xff, 0x40, 0x2, 0xff, 0xb0, 0x0, 0x0, 0x8, + 0xff, 0xbf, 0xf6, 0x0, 0x0, 0x0, 0xdf, 0xe0, + 0x0, 0xc, 0xff, 0x10, 0x0, 0x0, 0xef, 0xd1, + 0xff, 0xc0, 0x0, 0x0, 0x3f, 0xf8, 0x0, 0x0, + 0x6f, 0xf7, 0x0, 0x0, 0x4f, 0xf7, 0xb, 0xff, + 0x20, 0x0, 0x9, 0xff, 0x20, 0x0, 0x1, 0xff, + 0xd0, 0x0, 0xa, 0xff, 0x10, 0x4f, 0xf8, 0x0, + 0x0, 0xef, 0xc0, 0x0, 0x0, 0xa, 0xff, 0x30, + 0x1, 0xff, 0xb0, 0x0, 0xef, 0xe0, 0x0, 0x5f, + 0xf6, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x7f, + 0xf5, 0x0, 0x8, 0xff, 0x40, 0xb, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xef, 0xe0, 0xd, 0xfe, 0x0, + 0x0, 0x2f, 0xf9, 0x1, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x43, 0xff, 0x80, 0x0, 0x0, + 0xcf, 0xf0, 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfa, 0x9f, 0xf2, 0x0, 0x0, 0x6, 0xff, + 0x5d, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xfd, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x60, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0xd, 0xff, 0x90, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x70, 0x2, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xaf, + 0xfb, 0x0, 0x0, 0x5f, 0xff, 0x20, 0x0, 0x6, + 0xff, 0xd1, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, + 0x2f, 0xff, 0x30, 0x0, 0x0, 0x0, 0xcf, 0xf9, + 0x0, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0x6a, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xdf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x16, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf4, + 0x0, 0xaf, 0xfb, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x80, 0x0, 0xd, 0xff, 0x70, 0x0, 0x0, 0x9f, + 0xfc, 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, 0x6, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x20, + 0x3f, 0xff, 0x40, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xc0, + + /* U+0079 "y" */ + 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xb0, 0x6f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf3, 0x0, 0xef, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x7, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x50, 0x0, 0x1f, + 0xff, 0x20, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, + 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x8f, 0xf7, + 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0xe, + 0xff, 0x0, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, + 0x6, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xfe, + 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf5, 0x0, 0x4f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xc0, 0xb, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x32, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfa, 0x9f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x73, 0x0, 0x4, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfc, + 0xab, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xae, 0xfe, 0xb5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x38, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x48, + 0x88, 0x88, 0x88, 0x88, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xb8, 0x88, 0x88, 0x88, 0x88, + 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + + /* U+007B "{" */ + 0x0, 0x0, 0x6, 0xcf, 0xfa, 0x0, 0x0, 0x9f, + 0xff, 0xfa, 0x0, 0x3, 0xff, 0xfd, 0x95, 0x0, + 0x7, 0xff, 0xd0, 0x0, 0x0, 0x9, 0xff, 0x80, + 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, 0x9, + 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, + 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, + 0x70, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, + 0x9, 0xff, 0x70, 0x0, 0x0, 0xa, 0xff, 0x60, + 0x0, 0x0, 0x2e, 0xff, 0x40, 0x0, 0x2f, 0xff, + 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x18, 0xaf, 0xff, 0x20, 0x0, 0x0, 0xb, 0xff, + 0x60, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, + 0x9, 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, 0x70, + 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, 0x9, + 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, + 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, + 0x80, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, 0x0, + 0x3, 0xff, 0xfd, 0x85, 0x0, 0x0, 0xaf, 0xff, + 0xfa, 0x0, 0x0, 0x6, 0xcf, 0xfa, + + /* U+007C "|" */ + 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf3, 0xaf, 0xf3, + + /* U+007D "}" */ + 0x6f, 0xfd, 0x80, 0x0, 0x0, 0x6f, 0xff, 0xfc, + 0x0, 0x0, 0x38, 0xcf, 0xff, 0x70, 0x0, 0x0, + 0x9, 0xff, 0xb0, 0x0, 0x0, 0x4, 0xff, 0xd0, + 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, + 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, + 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, + 0xe0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, + 0x3, 0xff, 0xe0, 0x0, 0x0, 0x2, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf6, 0x0, 0x0, 0x2d, 0xff, 0xf6, + 0x0, 0x0, 0xef, 0xfc, 0x83, 0x0, 0x2, 0xff, + 0xf0, 0x0, 0x0, 0x2, 0xff, 0xe0, 0x0, 0x0, + 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, 0xe0, + 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, + 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, + 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x4, 0xff, + 0xd0, 0x0, 0x0, 0x9, 0xff, 0xc0, 0x0, 0x38, + 0xbf, 0xff, 0x70, 0x0, 0x6f, 0xff, 0xfd, 0x0, + 0x0, 0x6f, 0xfd, 0x81, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x1, 0x44, 0x10, 0x0, 0x0, 0x1, 0x54, + 0x0, 0x6f, 0xff, 0xf9, 0x0, 0x0, 0x5, 0xfb, + 0x4, 0xff, 0xff, 0xff, 0xd2, 0x0, 0xa, 0xf8, + 0xb, 0xfd, 0x20, 0x7f, 0xfe, 0x62, 0x7f, 0xf3, + 0xf, 0xf3, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xa0, + 0x1f, 0xf0, 0x0, 0x0, 0x7, 0xdf, 0xe8, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x18, 0xdf, 0xea, 0x30, 0x0, 0x2e, 0xfe, + 0xbd, 0xff, 0x60, 0xd, 0xf7, 0x0, 0x3, 0xef, + 0x34, 0xfa, 0x0, 0x0, 0x4, 0xfb, 0x7f, 0x50, + 0x0, 0x0, 0xf, 0xe7, 0xf5, 0x0, 0x0, 0x0, + 0xfe, 0x4f, 0xa0, 0x0, 0x0, 0x4f, 0xb0, 0xdf, + 0x70, 0x0, 0x3e, 0xf3, 0x2, 0xef, 0xec, 0xdf, + 0xf7, 0x0, 0x1, 0x8d, 0xfe, 0xa3, 0x0, + + /* U+2022 "•" */ + 0x5, 0xbb, 0x50, 0x5f, 0xff, 0xf5, 0xcf, 0xff, + 0xfc, 0xdf, 0xff, 0xfd, 0x7f, 0xff, 0xf7, 0x8, + 0xee, 0x80, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9d, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x7b, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x48, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb6, 0x20, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfe, 0xa5, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3a, 0xdf, 0xfd, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x3a, 0xdf, 0xfd, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3a, 0xdf, 0xfd, 0xa3, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0xdf, 0xfd, 0xa3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x8f, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf8, + 0xff, 0x20, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x2, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xff, + 0xff, 0x20, 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x2, 0xff, 0xfa, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0xaf, 0xff, 0x20, 0x2, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0x20, 0x2, 0xff, 0xfa, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0xaf, 0xff, 0x20, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x2, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xff, + 0xff, 0x20, 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x2, 0xff, + 0x8f, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf8, + + /* U+F00B "" */ + 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x3d, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x4, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xd1, 0x1d, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "ï€" */ + 0x1, 0xcf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xfc, 0x10, 0x1e, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe1, 0xcf, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf9, 0xa, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xaa, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xaa, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xa0, 0x9f, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xfc, 0x1e, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe1, 0x1, + 0xcf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xfc, 0x10, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x95, 0x0, 0x0, 0xef, 0xff, 0xf1, + 0x0, 0x3, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf3, 0x0, 0xe, 0xff, 0xff, 0x10, + 0x1, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xc0, 0x0, 0xef, 0xff, 0xf1, 0x0, + 0x9f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0x10, 0xe, 0xff, 0xff, 0x10, 0xe, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xb0, 0x0, 0xef, 0xff, 0xf1, 0x0, 0x9f, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xb0, 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, 0x9f, + 0xff, 0xff, 0xc0, 0x0, 0x2f, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0xef, 0xff, 0xf1, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x50, 0x9, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, 0xdf, + 0xff, 0xfc, 0x0, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf1, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xf1, 0x3f, 0xff, 0xff, 0x10, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x67, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf9, 0x9f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xca, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, + 0xbf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xda, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x8f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xb5, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x2f, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0x40, 0xcf, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xf0, 0x6, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xf9, 0x0, 0xe, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0x20, 0x0, 0x5f, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xfa, 0x20, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xc7, 0x64, 0x57, 0xbf, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0x9a, + 0xba, 0x97, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x46, 0x77, + 0x64, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x91, 0x0, 0x19, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x2a, + 0x50, 0x0, 0x0, 0x3f, 0xff, 0x85, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x58, 0xff, 0xf3, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb3, 0x0, 0x3b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x3c, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xc3, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xc3, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb3, 0x0, 0x3b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x3f, 0xff, 0x85, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x58, 0xff, 0xf3, 0x0, 0x0, 0x5, + 0xa2, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x2a, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x46, + 0x77, 0x64, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8e, 0xe8, 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xc1, 0x0, 0x8, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xfe, 0x30, + 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xfc, 0xcf, 0xff, 0xff, 0x88, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xfe, 0x30, 0x1a, 0xa1, + 0x3, 0xef, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc1, 0x2, + 0xdf, 0xfd, 0x20, 0x1c, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfa, + 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, 0xaf, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0x70, 0x7, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x7, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xf4, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x4f, 0xff, 0xff, 0xd2, 0x0, + 0x5, 0xff, 0xff, 0xfd, 0x20, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x2, 0xdf, 0xff, + 0xff, 0x50, 0x7f, 0xff, 0xff, 0xb1, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x1c, 0xff, 0xff, 0xf7, 0xdf, 0xff, 0xf9, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x9f, 0xff, 0xfd, 0x3f, 0xff, + 0x60, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x6, 0xff, 0xf3, + 0x6, 0xe4, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x4e, 0x60, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x2, 0xef, + 0xfe, 0x20, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2d, + 0xd2, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x61, + 0x16, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xee, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xee, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xee, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xee, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x50, 0x0, 0x0, 0x1e, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe1, 0x0, + 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xfa, 0x0, 0x5, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x50, 0x1e, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe1, 0x9f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x57, + 0x75, 0x30, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7c, 0xff, 0xff, + 0xff, 0xff, 0xa4, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd5, 0x0, 0x5, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x4, 0xff, 0xff, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x54, 0xff, 0xff, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xa5, 0x20, + 0x2, 0x6b, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xd, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x8f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0x1, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x46, 0x54, 0x43, 0x5f, 0xff, 0xff, 0xff, + 0x7, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xb0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, + 0xff, 0xff, 0xff, 0xf5, 0x34, 0x45, 0x64, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf8, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xd0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0x30, 0x0, + 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xb6, 0x20, + 0x2, 0x5a, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0xff, 0xff, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0xff, 0xff, 0x40, 0x2c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x50, 0x0, 0x5d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x4a, 0xff, 0xff, + 0xff, 0xff, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x3, 0x67, + 0x76, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xe7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x8, 0xe7, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0x90, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xa, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x8, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xb0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xa, 0xf9, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xce, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3e, + 0xc2, 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x40, 0x0, 0xcf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x2f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xfe, + 0x10, 0x9, 0xff, 0xb0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0x90, 0x1, 0xff, 0xf1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x9, + 0xf8, 0x0, 0x4, 0xff, 0xf1, 0x0, 0xcf, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0xcf, 0xf7, 0x0, + 0x7f, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x9, 0xff, 0xf5, 0x0, 0x6f, + 0xfb, 0x0, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x8f, 0xfb, + 0x0, 0x2f, 0xfe, 0x0, 0x1f, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x1f, 0xfe, 0x0, 0xf, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x1f, 0xfe, 0x0, 0xf, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x8f, 0xfb, 0x0, 0x2f, + 0xfe, 0x0, 0x2f, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x9, 0xff, 0xf5, + 0x0, 0x6f, 0xfb, 0x0, 0x3f, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0xcf, 0xf7, 0x0, 0x7f, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x9, 0xf8, 0x0, 0x4, 0xff, 0xf1, 0x0, + 0xcf, 0xf6, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0x90, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xfe, 0x10, 0x9, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x2f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x40, 0x0, 0xcf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x4e, 0xc2, 0x0, + 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xce, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xfd, 0x88, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x88, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x99, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x88, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F043 "ïƒ" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0xee, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x33, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0x20, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xaf, 0xff, 0x70, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x6f, 0xff, 0xe0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x1f, 0xff, 0xfb, 0x0, 0x4c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, + 0xff, 0xb0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0xcf, 0xff, 0xfe, 0x72, 0x3, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xbd, 0xff, 0xdb, 0x61, 0x0, 0x0, 0x0, + + /* U+F048 "ïˆ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0xe5, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x83, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, + 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "ï‹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xef, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb2, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xee, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "ïŒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x7, 0xdf, 0xff, 0xff, 0xfd, 0x70, 0x0, 0x0, + 0x7, 0xdf, 0xff, 0xff, 0xfd, 0x70, + + /* U+F04D "ï" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F051 "ï‘" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0xe5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfd, 0xef, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x48, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x38, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xef, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x5e, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xee, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x40, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, + + /* U+F053 "ï“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xc5, 0x0, + + /* U+F054 "ï”" */ + 0x0, 0x5, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xfe, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xef, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "ï¨" */ + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, + + /* U+F06E "ï®" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, + 0xef, 0xfe, 0xda, 0x73, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xb5, 0x20, 0x2, + 0x5b, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x4e, 0xfc, 0x70, 0x0, + 0xd, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x1f, 0xff, + 0xfd, 0x10, 0x3, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xd0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0x30, 0xd, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xd0, 0x7f, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x41, 0x17, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf7, 0xef, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfe, + 0xef, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xf7, 0xc, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xd0, 0x3, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0x30, 0x1, 0xcf, + 0xff, 0xff, 0xfc, 0x10, 0x3, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x6, 0xcf, 0xfc, 0x70, 0x0, 0xd, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xb5, + 0x20, 0x2, 0x5b, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, 0xef, 0xfe, + 0xda, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "ï°" */ + 0x9, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0x60, 0x0, 0x0, 0x15, + 0x9c, 0xef, 0xfe, 0xda, 0x73, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xfa, 0x0, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xde, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc7, 0x30, 0x2, 0x5b, + 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfe, + 0x30, 0x4e, 0xfc, 0x70, 0x0, 0xd, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xf7, 0x1f, 0xff, 0xfd, + 0x10, 0x3, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x2, 0xf9, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0xd0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xd, 0xff, 0xc2, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x7f, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0x70, 0x6f, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xfb, 0xdf, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xb5, 0x20, 0x1, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0xad, 0xef, 0xfe, 0xca, + 0x40, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x90, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0x60, 0x0, 0x6, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0x40, 0x0, 0x4, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x5, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x33, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x33, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf9, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x20, 0x3f, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf3, 0x2, 0xef, + 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0x40, 0x1e, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x1, 0xdf, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x8f, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfd, + 0x10, 0x40, 0x0, 0x0, 0x8f, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xe1, + 0x4, 0xfa, 0x0, 0x0, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xfe, 0x20, + 0x3f, 0xff, 0x90, 0x0, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf3, 0x2, + 0xef, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xf9, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xdf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf9, 0xcf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, 0xc, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf4, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0x40, 0x6f, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xf2, 0xbf, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf6, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xd1, + 0x4, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xfd, 0x10, 0x0, 0x13, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x0, + + /* U+F078 "ï¸" */ + 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x4, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xfd, 0x10, 0x4f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xd1, 0xbf, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf6, + 0x6f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf2, 0x8, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x80, 0xc, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xf9, 0xcf, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x50, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0xff, + 0xff, 0xef, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0xff, + 0xff, 0x4, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x6, 0xb4, 0x0, 0xff, 0xff, 0x0, 0x4b, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xb4, 0x0, 0xff, 0xff, 0x0, 0x4b, 0x60, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0xff, + 0xff, 0x4, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0xff, + 0xff, 0xef, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x5, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + + /* U+F07B "ï»" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F093 "ï‚“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x8f, 0xff, + 0xff, 0xf8, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xee, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xee, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xee, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xee, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xea, 0x63, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xb8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x20, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xfe, + 0x20, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xfe, 0xec, 0xa8, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x0, 0x7, 0xcf, 0xfc, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0xff, 0xc5, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xfa, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xc0, 0xcf, 0xff, 0xb1, 0x1b, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xc1, + 0xf, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xf0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xc1, 0x0, 0xff, + 0xff, 0x10, 0x1, 0xff, 0xff, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0xc, 0xff, 0xfb, + 0x11, 0xbf, 0xff, 0xc0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x9f, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xaf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xca, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x9, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0xcf, 0xff, 0xb1, 0x1b, 0xff, 0xfc, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0xf, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xf0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0xff, + 0xff, 0x10, 0x1, 0xff, 0xff, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0xc, 0xff, 0xfb, + 0x11, 0xbf, 0xff, 0xc0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xa0, 0x1, 0xdf, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0xfc, 0x50, 0x0, + 0x0, 0x7c, 0xff, 0xc7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x4, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F0C9 "" */ + 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x47, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x74, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0E0 "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0xf6, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x6f, + 0xff, 0xa0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0xa, 0xff, + 0xff, 0xfd, 0x30, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x3, 0xdf, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x7, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x3e, 0xff, + 0xff, 0xe3, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x8e, + 0xe8, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x41, + 0x14, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F0E7 "" */ + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xfa, 0xaf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf7, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0x80, 0x0, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xf8, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, + 0xff, 0xff, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xbf, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x2, 0xff, 0x20, 0x2, 0xff, + 0x20, 0x2, 0xff, 0x20, 0x2, 0xff, 0x20, 0x2, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0x0, + 0x0, 0xff, 0x0, 0x0, 0xff, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0x0, 0x0, 0xff, 0x0, 0x0, 0xff, 0x0, + 0x0, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x2, 0xff, 0x20, 0x2, 0xff, 0x20, 0x2, + 0xff, 0x20, 0x2, 0xff, 0x20, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x2f, 0xf2, 0x0, 0x2f, 0xf2, 0x0, 0x2f, + 0xf2, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xf, 0xf0, 0x0, 0xf, 0xf0, + 0x0, 0xf, 0xf0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xf, 0xf0, 0x0, + 0xf, 0xf0, 0x0, 0xf, 0xf0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x2f, + 0xf2, 0x0, 0x2f, 0xf2, 0x0, 0x2f, 0xf2, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x2, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x20, 0x2, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x2, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x20, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9e, + 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8e, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "ï…›" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0x80, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0x80, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x7a, 0xde, 0xff, 0xff, 0xed, + 0xa7, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x96, + 0x42, 0x10, 0x1, 0x24, 0x69, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x8e, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x7f, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfe, + 0x5f, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xf5, 0x5, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0xbd, 0xef, 0xfe, 0xdb, + 0x73, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x50, + 0x0, 0x46, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, + 0x0, 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfb, + 0x73, 0x20, 0x2, 0x37, 0xbf, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x9f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F241 "ï‰" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F242 "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F243 "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F244 "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xce, 0xef, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb5, + 0x5b, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xc0, 0x0, 0x1d, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf3, + 0x0, 0x0, 0x6, 0x85, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x64, 0x0, + 0x0, 0x0, 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xfd, 0x30, 0x0, 0x3, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7a, 0x10, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0xbf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xf9, 0x12, 0x8f, + 0xf5, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0xaf, 0xff, 0xd3, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xbf, + 0xff, 0xff, 0xff, 0x92, 0x22, 0x22, 0x24, 0xef, + 0xc2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x2a, + 0xff, 0xfd, 0x40, 0x3, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x56, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xa0, 0x0, 0x3a, 0xaa, 0xaa, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x40, 0x8, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x76, 0xbf, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xcc, 0xef, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x4, 0x8c, 0xdf, 0xfe, 0xda, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xf4, 0x9f, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x30, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xc, + 0xff, 0xff, 0xff, 0x90, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xe0, + 0x2f, 0xff, 0xff, 0xef, 0xff, 0xf4, 0x5, 0x20, + 0x1d, 0xff, 0xff, 0xf3, 0x6f, 0xff, 0xfc, 0x19, + 0xff, 0xf4, 0x6, 0xe2, 0x2, 0xef, 0xff, 0xf7, + 0x9f, 0xff, 0xf3, 0x0, 0x9f, 0xf4, 0x6, 0xfe, + 0x10, 0x3f, 0xff, 0xf9, 0xbf, 0xff, 0xfe, 0x20, + 0x9, 0xf4, 0x6, 0xf8, 0x0, 0xaf, 0xff, 0xfb, + 0xdf, 0xff, 0xff, 0xe2, 0x0, 0x94, 0x6, 0x80, + 0x9, 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x1, 0x0, 0x7f, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0xf7, + 0x0, 0x33, 0x4, 0x20, 0xc, 0xff, 0xff, 0xfe, + 0xcf, 0xff, 0xff, 0x70, 0x3, 0xe4, 0x6, 0xe2, + 0x0, 0xcf, 0xff, 0xfc, 0xaf, 0xff, 0xf7, 0x0, + 0x3f, 0xf4, 0x6, 0xfe, 0x10, 0x1e, 0xff, 0xfb, + 0x7f, 0xff, 0xf7, 0x3, 0xff, 0xf4, 0x6, 0xf8, + 0x0, 0x6f, 0xff, 0xf8, 0x3f, 0xff, 0xff, 0x9f, + 0xff, 0xf4, 0x6, 0x80, 0x6, 0xff, 0xff, 0xf5, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x1, 0x0, + 0x6f, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x6, 0xff, 0xff, 0xff, 0xb0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf5, 0x6, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x8c, 0xef, 0xff, 0xec, 0x83, 0x0, 0x0, 0x0, + + /* U+F2ED "ï‹­" */ + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xff, 0xff, 0xf3, 0x3f, 0xff, 0xf3, 0x3f, + 0xff, 0xf3, 0x3f, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, + 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, + 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, + 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, + 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, + 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, + 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xff, 0xf3, 0x3f, 0xff, + 0xf3, 0x3f, 0xff, 0xf3, 0x3f, 0xff, 0xff, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6d, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8c, 0x10, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfc, 0x10, 0x6f, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfc, 0x10, + 0x6f, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfc, + 0x10, 0x6f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x6f, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xec, 0xa9, 0x75, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xaf, 0xff, + 0xff, 0xfa, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xaf, + 0xfa, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0xa, 0xa0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xa, + 0xa0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xaf, 0xfa, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xa, 0xff, + 0xff, 0xa0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xaf, 0xff, 0xff, 0xfa, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x8, 0xff, 0xf0, 0x0, 0xff, 0x0, 0xf, + 0xf0, 0x0, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xf0, + 0x0, 0xff, 0x0, 0xf, 0xf0, 0x0, 0xff, 0xff, + 0x8, 0xff, 0xff, 0xf0, 0x0, 0xff, 0x0, 0xf, + 0xf0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf0, + 0x0, 0xff, 0x0, 0xf, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0x0, 0xf, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xff, 0x0, 0xf, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x2, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8f, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, 0xaf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf1, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0x10, 0x1, 0xcf, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xf1, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x8f, 0xff, 0xff, 0x12, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x20, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 138, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 137, .box_w = 5, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 55, .adv_w = 200, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 13}, + {.bitmap_index = 96, .adv_w = 360, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 338, .adv_w = 318, .box_w = 18, .box_h = 30, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 608, .adv_w = 432, .box_w = 25, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 883, .adv_w = 351, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1125, .adv_w = 108, .box_w = 3, .box_h = 9, .ofs_x = 2, .ofs_y = 13}, + {.bitmap_index = 1139, .adv_w = 173, .box_w = 7, .box_h = 30, .ofs_x = 3, .ofs_y = -6}, + {.bitmap_index = 1244, .adv_w = 173, .box_w = 7, .box_h = 30, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 1349, .adv_w = 205, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 12}, + {.bitmap_index = 1427, .adv_w = 298, .box_w = 15, .box_h = 14, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 1532, .adv_w = 116, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 1555, .adv_w = 196, .box_w = 10, .box_h = 3, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 1570, .adv_w = 116, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1583, .adv_w = 180, .box_w = 14, .box_h = 30, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 1793, .adv_w = 342, .box_w = 19, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2002, .adv_w = 189, .box_w = 9, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2101, .adv_w = 294, .box_w = 18, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2299, .adv_w = 293, .box_w = 17, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2486, .adv_w = 343, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2717, .adv_w = 294, .box_w = 18, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2915, .adv_w = 316, .box_w = 18, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3113, .adv_w = 306, .box_w = 18, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3311, .adv_w = 330, .box_w = 19, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3520, .adv_w = 316, .box_w = 19, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3729, .adv_w = 116, .box_w = 5, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3772, .adv_w = 116, .box_w = 5, .box_h = 22, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 3827, .adv_w = 298, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 3940, .adv_w = 298, .box_w = 15, .box_h = 10, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 4015, .adv_w = 298, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 4128, .adv_w = 293, .box_w = 17, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4315, .adv_w = 529, .box_w = 31, .box_h = 28, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 4749, .adv_w = 375, .box_w = 25, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5024, .adv_w = 388, .box_w = 20, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5244, .adv_w = 370, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5475, .adv_w = 423, .box_w = 22, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5717, .adv_w = 343, .box_w = 17, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5904, .adv_w = 325, .box_w = 17, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6091, .adv_w = 395, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6333, .adv_w = 416, .box_w = 20, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6553, .adv_w = 159, .box_w = 4, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6597, .adv_w = 263, .box_w = 15, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 6762, .adv_w = 368, .box_w = 20, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6982, .adv_w = 304, .box_w = 16, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7158, .adv_w = 489, .box_w = 25, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7433, .adv_w = 416, .box_w = 20, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7653, .adv_w = 430, .box_w = 25, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7928, .adv_w = 370, .box_w = 19, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8137, .adv_w = 430, .box_w = 26, .box_h = 27, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 8488, .adv_w = 372, .box_w = 19, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8697, .adv_w = 318, .box_w = 18, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8895, .adv_w = 301, .box_w = 19, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9104, .adv_w = 405, .box_w = 20, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9324, .adv_w = 365, .box_w = 24, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 9588, .adv_w = 577, .box_w = 35, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9973, .adv_w = 345, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10215, .adv_w = 331, .box_w = 22, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 10457, .adv_w = 336, .box_w = 20, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10677, .adv_w = 170, .box_w = 8, .box_h = 30, .ofs_x = 3, .ofs_y = -6}, + {.bitmap_index = 10797, .adv_w = 180, .box_w = 15, .box_h = 30, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 11022, .adv_w = 170, .box_w = 8, .box_h = 30, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 11142, .adv_w = 298, .box_w = 15, .box_h = 13, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 11240, .adv_w = 256, .box_w = 16, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11256, .adv_w = 307, .box_w = 9, .box_h = 4, .ofs_x = 3, .ofs_y = 19}, + {.bitmap_index = 11274, .adv_w = 306, .box_w = 16, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11410, .adv_w = 349, .box_w = 19, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11638, .adv_w = 292, .box_w = 17, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11783, .adv_w = 349, .box_w = 18, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11999, .adv_w = 313, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12152, .adv_w = 181, .box_w = 13, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12308, .adv_w = 353, .box_w = 19, .box_h = 23, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 12527, .adv_w = 349, .box_w = 18, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12743, .adv_w = 143, .box_w = 5, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12803, .adv_w = 145, .box_w = 10, .box_h = 30, .ofs_x = -3, .ofs_y = -6}, + {.bitmap_index = 12953, .adv_w = 315, .box_w = 18, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13169, .adv_w = 143, .box_w = 4, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13217, .adv_w = 541, .box_w = 30, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13472, .adv_w = 349, .box_w = 18, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13625, .adv_w = 325, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13778, .adv_w = 349, .box_w = 19, .box_h = 23, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 13997, .adv_w = 349, .box_w = 18, .box_h = 23, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 14204, .adv_w = 210, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14298, .adv_w = 257, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14434, .adv_w = 212, .box_w = 13, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14571, .adv_w = 347, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14716, .adv_w = 286, .box_w = 19, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 14878, .adv_w = 460, .box_w = 29, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15125, .adv_w = 283, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15278, .adv_w = 286, .box_w = 19, .box_h = 23, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 15497, .adv_w = 267, .box_w = 15, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 15625, .adv_w = 180, .box_w = 10, .box_h = 30, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 15775, .adv_w = 153, .box_w = 4, .box_h = 30, .ofs_x = 3, .ofs_y = -6}, + {.bitmap_index = 15835, .adv_w = 180, .box_w = 10, .box_h = 30, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 15985, .adv_w = 298, .box_w = 16, .box_h = 6, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 16033, .adv_w = 215, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 16088, .adv_w = 161, .box_w = 6, .box_h = 6, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 16106, .adv_w = 512, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 16634, .adv_w = 512, .box_w = 32, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17018, .adv_w = 512, .box_w = 32, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17466, .adv_w = 512, .box_w = 32, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17850, .adv_w = 352, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 18092, .adv_w = 512, .box_w = 31, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 18588, .adv_w = 512, .box_w = 30, .box_h = 32, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 19068, .adv_w = 576, .box_w = 36, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19572, .adv_w = 512, .box_w = 32, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 20084, .adv_w = 576, .box_w = 36, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20516, .adv_w = 512, .box_w = 32, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 21028, .adv_w = 256, .box_w = 16, .box_h = 26, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 21236, .adv_w = 384, .box_w = 24, .box_h = 26, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 21548, .adv_w = 576, .box_w = 36, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 22124, .adv_w = 512, .box_w = 32, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 22508, .adv_w = 352, .box_w = 22, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 22860, .adv_w = 448, .box_w = 20, .box_h = 30, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 23160, .adv_w = 448, .box_w = 28, .box_h = 34, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 23636, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24042, .adv_w = 448, .box_w = 28, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24434, .adv_w = 448, .box_w = 20, .box_h = 30, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 24734, .adv_w = 448, .box_w = 30, .box_h = 28, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 25154, .adv_w = 320, .box_w = 18, .box_h = 28, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 25406, .adv_w = 320, .box_w = 18, .box_h = 28, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 25658, .adv_w = 448, .box_w = 28, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26050, .adv_w = 448, .box_w = 28, .box_h = 6, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 26134, .adv_w = 576, .box_w = 36, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 26566, .adv_w = 640, .box_w = 40, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 27206, .adv_w = 576, .box_w = 38, .box_h = 32, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 27814, .adv_w = 512, .box_w = 32, .box_h = 30, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 28294, .adv_w = 448, .box_w = 28, .box_h = 18, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 28546, .adv_w = 448, .box_w = 28, .box_h = 18, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 28798, .adv_w = 640, .box_w = 40, .box_h = 26, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 29318, .adv_w = 512, .box_w = 32, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 29702, .adv_w = 512, .box_w = 32, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 30214, .adv_w = 512, .box_w = 33, .box_h = 33, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 30759, .adv_w = 448, .box_w = 29, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31165, .adv_w = 448, .box_w = 28, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 31613, .adv_w = 448, .box_w = 28, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 32005, .adv_w = 448, .box_w = 28, .box_h = 26, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 32369, .adv_w = 512, .box_w = 32, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 32753, .adv_w = 320, .box_w = 22, .box_h = 32, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 33105, .adv_w = 448, .box_w = 28, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 33553, .adv_w = 448, .box_w = 28, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 34001, .adv_w = 576, .box_w = 36, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 34433, .adv_w = 512, .box_w = 34, .box_h = 34, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 35011, .adv_w = 384, .box_w = 24, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 35395, .adv_w = 640, .box_w = 40, .box_h = 29, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35975, .adv_w = 640, .box_w = 40, .box_h = 20, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 36375, .adv_w = 640, .box_w = 40, .box_h = 20, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 36775, .adv_w = 640, .box_w = 40, .box_h = 20, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 37175, .adv_w = 640, .box_w = 40, .box_h = 20, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 37575, .adv_w = 640, .box_w = 40, .box_h = 20, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 37975, .adv_w = 640, .box_w = 41, .box_h = 26, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 38508, .adv_w = 448, .box_w = 24, .box_h = 32, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 38892, .adv_w = 448, .box_w = 28, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 39340, .adv_w = 512, .box_w = 33, .box_h = 33, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 39885, .adv_w = 640, .box_w = 40, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 40365, .adv_w = 384, .box_w = 24, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 40749, .adv_w = 515, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 5, 0, 0, 0, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 23, 0, 14, -11, 0, 0, + 0, 0, -28, -31, 4, 24, 11, 9, + -20, 4, 25, 2, 22, 5, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 31, 4, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 0, -15, 0, 0, 0, 0, + 0, -10, 9, 10, 0, 0, -5, 0, + -4, 5, 0, -5, 0, -5, -3, -10, + 0, 0, 0, 0, -5, 0, 0, -7, + -8, 0, 0, -5, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + -5, 0, -8, 0, -14, 0, -62, 0, + 0, -10, 0, 10, 15, 1, 0, -10, + 5, 5, 17, 10, -9, 10, 0, 0, + -29, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -14, -6, -25, 0, -20, + -4, 0, 0, 0, 0, 1, 20, 0, + -15, -4, -2, 2, 0, -9, 0, 0, + -4, -38, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -41, -4, 19, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -21, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 17, + 0, 5, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 4, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 10, 5, 15, -5, 0, 0, 10, -5, + -17, -70, 4, 14, 10, 1, -7, 0, + 18, 0, 16, 0, 16, 0, -48, 0, + -6, 15, 0, 17, -5, 10, 5, 0, + 0, 2, -5, 0, 0, -9, 41, 0, + 41, 0, 15, 0, 22, 7, 9, 15, + 0, 0, 0, -19, 0, 0, 0, 0, + 2, -4, 0, 4, -9, -7, -10, 4, + 0, -5, 0, 0, 0, -20, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -33, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -28, 0, -32, 0, 0, 0, + 0, -4, 0, 51, -6, -7, 5, 5, + -5, 0, -7, 5, 0, 0, -27, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -50, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -32, 0, 31, 0, 0, -19, 0, + 17, 0, -35, -50, -35, -10, 15, 0, + 0, -34, 0, 6, -12, 0, -8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 13, 15, -62, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 24, 0, 4, 0, 0, 0, + 0, 0, 4, 4, -6, -10, 0, -2, + -2, -5, 0, 0, -4, 0, 0, 0, + -10, 0, -4, 0, -12, -10, 0, -13, + -17, -17, -10, 0, -10, 0, -10, 0, + 0, 0, 0, -4, 0, 0, 5, 0, + 4, -5, 0, 2, 0, 0, 0, 5, + -4, 0, 0, 0, -4, 5, 5, -2, + 0, 0, 0, -10, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 7, -4, 0, + -6, 0, -9, 0, 0, -4, 0, 15, + 0, 0, -5, 0, 0, 0, 0, 0, + -2, 2, -4, -4, 0, 0, -5, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, 0, -5, -6, 0, + 0, 0, 0, 0, 2, 0, 0, -4, + 0, -5, -5, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, -4, -7, 0, -8, 0, -15, + -4, -15, 10, 0, 0, -10, 5, 10, + 14, 0, -13, -2, -6, 0, -2, -24, + 5, -4, 4, -27, 5, 0, 0, 2, + -27, 0, -27, -4, -45, -4, 0, -26, + 0, 10, 14, 0, 7, 0, 0, 0, + 0, 1, 0, -9, -7, 0, -15, 0, + 0, 0, -5, 0, 0, 0, -5, 0, + 0, 0, 0, 0, -3, -3, 0, -3, + -7, 0, 0, 0, 0, 0, 0, 0, + -5, -5, 0, -4, -6, -4, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -6, + 0, -4, 0, -10, 5, 0, 0, -6, + 3, 5, 5, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 4, + 0, 0, -5, 0, -5, -4, -6, 0, + 0, 0, 0, 0, 0, 0, 4, 0, + -4, 0, 0, 0, 0, -6, -8, 0, + -10, 0, 15, -4, 2, -16, 0, 0, + 14, -26, -27, -22, -10, 5, 0, -4, + -33, -9, 0, -9, 0, -10, 8, -9, + -33, 0, -14, 0, 0, 3, -2, 4, + -4, 0, 5, 1, -15, -19, 0, -26, + -12, -11, -12, -15, -6, -14, -1, -10, + -14, 3, 0, 2, 0, -5, 0, 0, + 0, 4, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, -3, 0, -2, -5, 0, -9, -11, + -11, -2, 0, -15, 0, 0, 0, 0, + 0, 0, -4, 0, 0, 0, 0, 2, + -3, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 25, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + -10, 0, 0, 0, 0, -26, -15, 0, + 0, 0, -8, -26, 0, 0, -5, 5, + 0, -14, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, -10, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, -9, 0, + 0, 0, 0, 6, 0, 4, -10, -10, + 0, -5, -5, -6, 0, 0, 0, 0, + 0, 0, -15, 0, -5, 0, -8, -5, + 0, -11, -13, -15, -4, 0, -10, 0, + -15, 0, 0, 0, 0, 41, 0, 0, + 3, 0, 0, -7, 0, 5, 0, -22, + 0, 0, 0, 0, 0, -48, -9, 17, + 15, -4, -22, 0, 5, -8, 0, -26, + -3, -7, 5, -36, -5, 7, 0, 8, + -18, -8, -19, -17, -22, 0, 0, -31, + 0, 29, 0, 0, -3, 0, 0, 0, + -3, -3, -5, -14, -17, -1, -48, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, -3, -5, -8, 0, 0, + -10, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -10, 0, 0, 10, + -2, 7, 0, -11, 5, -4, -2, -13, + -5, 0, -7, -5, -4, 0, -8, -9, + 0, 0, -4, -2, -4, -9, -6, 0, + 0, -5, 0, 5, -4, 0, -11, 0, + 0, 0, -10, 0, -9, 0, -9, -9, + 5, 0, 0, 0, 0, 0, 0, 0, + 0, -10, 5, 0, -7, 0, -4, -6, + -16, -4, -4, -4, -2, -4, -6, -2, + 0, 0, 0, 0, 0, -5, -4, -4, + 0, 0, 0, 0, 6, -4, 0, -4, + 0, 0, 0, -4, -6, -4, -5, -6, + -5, 0, 4, 20, -2, 0, -14, 0, + -4, 10, 0, -5, -22, -7, 8, 1, + 0, -24, -9, 5, -9, 4, 0, -4, + -4, -16, 0, -8, 3, 0, 0, -9, + 0, 0, 0, 5, 5, -10, -10, 0, + -9, -5, -8, -5, -5, 0, -9, 3, + -10, -9, 15, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, -7, + 0, 0, -5, -5, 0, 0, 0, 0, + -5, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + -8, 0, -10, 0, 0, 0, -17, 0, + 4, -11, 10, 1, -4, -24, 0, 0, + -11, -5, 0, -20, -13, -14, 0, 0, + -22, -5, -20, -19, -25, 0, -13, 0, + 4, 34, -7, 0, -12, -5, -2, -5, + -9, -14, -9, -19, -21, -12, -5, 0, + 0, -4, 0, 2, 0, 0, -36, -5, + 15, 11, -11, -19, 0, 2, -16, 0, + -26, -4, -5, 10, -47, -7, 2, 0, + 0, -33, -6, -27, -5, -37, 0, 0, + -36, 0, 30, 2, 0, -4, 0, 0, + 0, 0, -3, -4, -19, -4, 0, -33, + 0, 0, 0, 0, -16, 0, -5, 0, + -2, -14, -24, 0, 0, -3, -8, -15, + -5, 0, -4, 0, 0, 0, 0, -23, + -5, -17, -16, -4, -9, -13, -5, -9, + 0, -10, -5, -17, -8, 0, -6, -10, + -5, -10, 0, 3, 0, -4, -17, 0, + 10, 0, -9, 0, 0, 0, 0, 6, + 0, 4, -10, 21, 0, -5, -5, -6, + 0, 0, 0, 0, 0, 0, -15, 0, + -5, 0, -8, -5, 0, -11, -13, -15, + -4, 0, -10, 4, 20, 0, 0, 0, + 0, 41, 0, 0, 3, 0, 0, -7, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -4, -10, 0, 0, 0, 0, 0, -3, + 0, 0, 0, -5, -5, 0, 0, -10, + -5, 0, 0, -10, 0, 9, -3, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 8, 10, 4, -5, 0, -16, + -8, 0, 15, -17, -16, -10, -10, 20, + 9, 5, -45, -4, 10, -5, 0, -5, + 6, -5, -18, 0, -5, 5, -7, -4, + -15, -4, 0, 0, 15, 10, 0, -14, + 0, -28, -7, 15, -7, -19, 2, -7, + -17, -17, -5, 20, 5, 0, -8, 0, + -14, 0, 4, 17, -12, -19, -20, -13, + 15, 0, 2, -37, -4, 5, -9, -4, + -12, 0, -11, -19, -8, -8, -4, 0, + 0, -12, -11, -5, 0, 15, 12, -5, + -28, 0, -28, -7, 0, -18, -30, -2, + -16, -9, -17, -14, 14, 0, 0, -7, + 0, -10, -5, 0, -5, -9, 0, 9, + -17, 5, 0, 0, -27, 0, -5, -11, + -9, -4, -15, -13, -17, -12, 0, -15, + -5, -12, -10, -15, -5, 0, 0, 2, + 24, -9, 0, -15, -5, 0, -5, -10, + -12, -14, -14, -19, -7, -10, 10, 0, + -8, 0, -26, -6, 3, 10, -16, -19, + -10, -17, 17, -5, 3, -48, -9, 10, + -11, -9, -19, 0, -15, -22, -6, -5, + -4, -5, -11, -15, -2, 0, 0, 15, + 14, -4, -33, 0, -31, -12, 12, -19, + -35, -10, -18, -22, -26, -17, 10, 0, + 0, 0, 0, -6, 0, 0, 5, -6, + 10, 4, -10, 10, 0, 0, -16, -2, + 0, -2, 0, 2, 2, -4, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 4, 15, 1, 0, -6, 0, 0, + 0, 0, -4, -4, -6, 0, 0, 0, + 2, 4, 0, 0, 0, 0, 4, 0, + -4, 0, 19, 0, 9, 2, 2, -7, + 0, 10, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 0, 14, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -31, 0, -5, 9, 0, 15, + 0, 0, 51, 6, -10, -10, 5, 5, + -4, 2, -26, 0, 0, 25, -31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -35, 19, 72, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, -10, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, -14, 0, + 0, 2, 0, 0, 5, 66, -10, -4, + 16, 14, -14, 5, 0, 0, 5, 5, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -67, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -14, + 0, 0, 0, -14, 0, 0, 0, 0, + -11, -3, 0, 0, 0, -11, 0, -6, + 0, -24, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -34, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -5, 0, 0, -10, 0, -8, 0, + -14, 0, 0, 0, -9, 5, -6, 0, + 0, -14, -5, -12, 0, 0, -14, 0, + -5, 0, -24, 0, -6, 0, 0, -41, + -10, -20, -6, -18, 0, 0, -34, 0, + -14, -3, 0, 0, 0, 0, 0, 0, + 0, 0, -8, -9, -4, -9, 0, 0, + 0, 0, -11, 0, -11, 7, -6, 10, + 0, -4, -12, -4, -9, -10, 0, -6, + -3, -4, 4, -14, -2, 0, 0, 0, + -45, -4, -7, 0, -11, 0, -4, -24, + -5, 0, 0, -4, -4, 0, 0, 0, + 0, 4, 0, -4, -9, -4, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 0, 0, 0, 0, 0, + 0, -11, 0, -4, 0, 0, 0, -10, + 5, 0, 0, 0, -14, -5, -10, 0, + 0, -14, 0, -5, 0, -24, 0, 0, + 0, 0, -50, 0, -10, -19, -26, 0, + 0, -34, 0, -4, -8, 0, 0, 0, + 0, 0, 0, 0, 0, -5, -8, -3, + -8, 2, 0, 0, 9, -7, 0, 16, + 25, -5, -5, -15, 6, 25, 9, 11, + -14, 6, 22, 6, 15, 11, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 24, -9, -5, 0, -4, + 41, 22, 41, 0, 0, 0, 5, 0, + 0, 19, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 7, + 0, 0, 0, 0, -43, -6, -4, -21, + -25, 0, 0, -34, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 0, -43, -6, -4, + -21, -25, 0, 0, -20, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, -12, 5, 0, -5, + 4, 9, 5, -15, 0, -1, -4, 5, + 0, 4, 0, 0, 0, 0, -13, 0, + -5, -4, -10, 0, -5, -20, 0, 32, + -5, 0, -11, -4, 0, -4, -9, 0, + -5, -14, -10, -6, 0, 0, 0, -8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 0, 0, 0, 0, -43, + -6, -4, -21, -25, 0, 0, -34, 0, + 0, 0, 0, 0, 0, 26, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, 0, -16, -6, -5, 15, -5, -5, + -20, 2, -3, 2, -4, -14, 1, 11, + 1, 4, 2, 4, -12, -20, -6, 0, + -19, -10, -14, -22, -20, 0, -8, -10, + -6, -7, -4, -4, -6, -4, 0, -4, + -2, 8, 0, 8, -4, 0, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, -5, -5, 0, 0, + -14, 0, -3, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, -7, + 0, 0, 0, 0, -4, 0, 0, -9, + -5, 5, 0, -9, -10, -4, 0, -15, + -4, -11, -4, -6, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -34, 0, 16, 0, 0, -9, 0, + 0, 0, 0, -7, 0, -5, 0, 0, + -3, 0, 0, -4, 0, -12, 0, 0, + 22, -7, -17, -16, 4, 6, 6, -1, + -14, 4, 8, 4, 15, 4, 17, -4, + -14, 0, 0, -20, 0, 0, -15, -14, + 0, 0, -10, 0, -7, -9, 0, -8, + 0, -8, 0, -4, 8, 0, -4, -15, + -5, 19, 0, 0, -5, 0, -10, 0, + 0, 7, -12, 0, 5, -5, 4, 1, + 0, -17, 0, -4, -2, 0, -5, 6, + -4, 0, 0, 0, -21, -6, -11, 0, + -15, 0, 0, -24, 0, 19, -5, 0, + -9, 0, 3, 0, -5, 0, -5, -15, + 0, -5, 5, 0, 0, 0, 0, -4, + 0, 0, 5, -7, 2, 0, 0, -6, + -4, 0, -6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -32, 0, 11, 0, + 0, -4, 0, 0, 0, 0, 1, 0, + -5, -5, 0, 0, 0, 10, 0, 12, + 0, 0, 0, 0, 0, -32, -29, 2, + 22, 15, 9, -20, 4, 22, 0, 19, + 0, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserrat_32 = { +#else +lv_font_t lv_font_montserrat_32 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 35, /*The maximum line height required by the font*/ + .base_line = 6, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_32*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_34.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_34.c new file mode 100644 index 0000000..064bb0a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_34.c @@ -0,0 +1,7020 @@ +/******************************************************************************* + * Size: 34 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 34 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_34.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_34 + #define LV_FONT_MONTSERRAT_34 1 +#endif + +#if LV_FONT_MONTSERRAT_34 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x5f, 0xff, 0x74, 0xff, 0xf7, 0x4f, 0xff, 0x63, + 0xff, 0xf5, 0x2f, 0xff, 0x52, 0xff, 0xf4, 0x1f, + 0xff, 0x31, 0xff, 0xf3, 0xf, 0xff, 0x20, 0xff, + 0xf1, 0xf, 0xff, 0x10, 0xef, 0xf0, 0xd, 0xff, + 0x0, 0xdf, 0xf0, 0xc, 0xfe, 0x0, 0xcf, 0xd0, + 0x1, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0x10, 0x2e, 0xff, 0x49, 0xff, 0xfb, 0x8f, + 0xff, 0x90, 0xbf, 0xc1, + + /* U+0022 "\"" */ + 0xdf, 0xf0, 0x0, 0xbf, 0xf2, 0xdf, 0xf0, 0x0, + 0xaf, 0xf1, 0xcf, 0xe0, 0x0, 0xaf, 0xf1, 0xcf, + 0xe0, 0x0, 0xaf, 0xf0, 0xcf, 0xe0, 0x0, 0x9f, + 0xf0, 0xbf, 0xd0, 0x0, 0x9f, 0xf0, 0xbf, 0xd0, + 0x0, 0x8f, 0xf0, 0xbf, 0xc0, 0x0, 0x8f, 0xf0, + 0xaf, 0xc0, 0x0, 0x8f, 0xe0, 0x1, 0x0, 0x0, + 0x1, 0x10, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x4, 0xff, 0x20, 0x0, 0x0, + 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf0, 0x0, 0x0, 0x9, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, 0xbf, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xc0, + 0x0, 0x0, 0xd, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xfa, 0x0, 0x0, 0x0, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x80, 0x0, + 0x0, 0x1f, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x77, 0x77, 0x9f, + 0xf8, 0x77, 0x77, 0x7b, 0xff, 0x77, 0x77, 0x70, + 0x0, 0x0, 0x5, 0xff, 0x0, 0x0, 0x0, 0x8f, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf0, + 0x0, 0x0, 0xa, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xfd, 0x0, 0x0, 0x0, 0xcf, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xb0, 0x0, + 0x0, 0xe, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xf9, 0x0, 0x0, 0x0, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x70, 0x0, 0x0, + 0x2f, 0xf4, 0x0, 0x0, 0x0, 0x77, 0x77, 0x7f, + 0xfa, 0x77, 0x77, 0x79, 0xff, 0x97, 0x77, 0x60, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x7, 0xff, 0x0, 0x0, 0x0, 0x9f, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xd0, 0x0, + 0x0, 0xb, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xfb, 0x0, 0x0, 0x0, 0xdf, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0x90, 0x0, 0x0, + 0xf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xf7, 0x0, 0x0, 0x1, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0x50, 0x0, 0x0, 0x3f, + 0xf2, 0x0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xad, 0xff, 0xff, 0xdb, 0x71, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x2f, 0xff, 0xe6, 0x15, 0xfd, + 0x1, 0x4a, 0xff, 0x20, 0xa, 0xff, 0xe2, 0x0, + 0x5f, 0xd0, 0x0, 0x2, 0x70, 0x0, 0xef, 0xf7, + 0x0, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x50, 0x0, 0x5f, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf7, 0x0, 0x5, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xe3, 0x0, 0x5f, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf9, 0x35, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xcf, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xd1, 0x7e, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x5, 0xfd, 0x0, 0x9, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xd0, 0x0, 0xd, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, 0xaf, + 0xfb, 0x2, 0x0, 0x0, 0x0, 0x5f, 0xd0, 0x0, + 0xc, 0xff, 0x90, 0xdd, 0x30, 0x0, 0x5, 0xfd, + 0x0, 0x4, 0xff, 0xf5, 0x4f, 0xff, 0xb5, 0x10, + 0x5f, 0xd0, 0x28, 0xff, 0xfd, 0x3, 0xef, 0xff, + 0xff, 0xfe, 0xff, 0xef, 0xff, 0xfe, 0x20, 0x1, + 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x5, 0x9d, 0xef, 0xff, 0xfd, 0x93, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x7, 0xdf, 0xeb, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x60, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xb0, 0x0, 0x0, 0xa, 0xfd, 0x30, 0x7, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x0, 0x0, + 0x3, 0xff, 0x30, 0x0, 0x9, 0xfc, 0x0, 0x0, + 0x0, 0x3f, 0xf6, 0x0, 0x0, 0x0, 0x7f, 0xc0, + 0x0, 0x0, 0x2f, 0xf1, 0x0, 0x0, 0xd, 0xfb, + 0x0, 0x0, 0x0, 0xa, 0xf9, 0x0, 0x0, 0x0, + 0xff, 0x30, 0x0, 0x9, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0xbf, 0x70, 0x0, 0x0, 0xe, 0xf4, 0x0, + 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, 0xa, 0xf9, + 0x0, 0x0, 0x0, 0xff, 0x30, 0x0, 0xef, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xc0, 0x0, 0x0, + 0x2f, 0xf1, 0x0, 0x9f, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x30, 0x0, 0x9, 0xfc, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xfd, 0x30, 0x7, 0xff, 0x40, 0x1e, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0x70, 0xa, 0xfe, 0x10, 0x6, 0xbe, 0xda, + 0x30, 0x0, 0x0, 0x7, 0xdf, 0xeb, 0x40, 0x5, + 0xff, 0x40, 0xb, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0x90, 0x9, + 0xfe, 0x50, 0x18, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xe0, 0x1, 0xff, 0x40, 0x0, + 0x9, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf4, 0x0, 0x6f, 0xd0, 0x0, 0x0, 0x2f, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xf9, 0x0, 0x9, + 0xfa, 0x0, 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xb, 0xfd, 0x0, 0x0, 0x9f, 0x80, 0x0, + 0x0, 0xd, 0xf6, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x30, 0x0, 0x9, 0xfa, 0x0, 0x0, 0x0, 0xef, + 0x50, 0x0, 0x0, 0x1, 0xff, 0x80, 0x0, 0x0, + 0x6f, 0xc0, 0x0, 0x0, 0x1f, 0xf2, 0x0, 0x0, + 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x2, 0xff, 0x20, + 0x0, 0x7, 0xfd, 0x0, 0x0, 0x0, 0x6f, 0xf3, + 0x0, 0x0, 0x0, 0xa, 0xfc, 0x10, 0x3, 0xff, + 0x50, 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xcc, 0xff, 0x90, 0x0, 0x0, + 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xdf, 0xfb, 0x50, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x5a, 0xef, 0xfd, 0x92, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x96, 0x6b, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, 0x0, 0x7f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x90, + 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xc0, 0x0, 0x0, + 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf5, 0x0, 0x7, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x32, 0xbf, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x40, 0x0, 0x0, + 0x9f, 0xff, 0x60, 0xc, 0xff, 0xf4, 0x0, 0x2, + 0xff, 0x60, 0x6, 0xff, 0xe3, 0x0, 0x0, 0xcf, + 0xff, 0x40, 0x7, 0xff, 0x60, 0xe, 0xff, 0x50, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0xc, 0xff, 0x10, + 0x4f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x8f, 0xfc, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xf4, 0x0, 0x6f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xc0, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf5, 0x0, 0xc, 0xff, 0xf9, 0x10, + 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0x50, 0x1, + 0xdf, 0xff, 0xfd, 0xbb, 0xcf, 0xff, 0xfe, 0x3a, + 0xff, 0xf5, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0xaf, 0xf5, 0x0, 0x0, 0x27, + 0xce, 0xff, 0xdb, 0x72, 0x0, 0x0, 0x9, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0xdf, 0xfd, 0xff, 0xcf, 0xec, 0xfe, 0xcf, 0xeb, + 0xfd, 0xbf, 0xdb, 0xfc, 0xaf, 0xc0, 0x10, + + /* U+0028 "(" */ + 0x0, 0x1, 0xef, 0xf2, 0x0, 0x9, 0xff, 0x90, + 0x0, 0x1f, 0xff, 0x20, 0x0, 0x7f, 0xfa, 0x0, + 0x0, 0xdf, 0xf4, 0x0, 0x3, 0xff, 0xe0, 0x0, + 0x8, 0xff, 0xa0, 0x0, 0xc, 0xff, 0x60, 0x0, + 0xf, 0xff, 0x30, 0x0, 0x3f, 0xff, 0x0, 0x0, + 0x5f, 0xfd, 0x0, 0x0, 0x8f, 0xfa, 0x0, 0x0, + 0x9f, 0xf9, 0x0, 0x0, 0xaf, 0xf8, 0x0, 0x0, + 0xbf, 0xf8, 0x0, 0x0, 0xcf, 0xf7, 0x0, 0x0, + 0xcf, 0xf7, 0x0, 0x0, 0xbf, 0xf8, 0x0, 0x0, + 0xaf, 0xf8, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, + 0x8f, 0xfa, 0x0, 0x0, 0x5f, 0xfd, 0x0, 0x0, + 0x3f, 0xff, 0x0, 0x0, 0xf, 0xff, 0x30, 0x0, + 0xc, 0xff, 0x60, 0x0, 0x7, 0xff, 0xa0, 0x0, + 0x2, 0xff, 0xe0, 0x0, 0x0, 0xdf, 0xf4, 0x0, + 0x0, 0x7f, 0xfa, 0x0, 0x0, 0xe, 0xff, 0x20, + 0x0, 0x7, 0xff, 0x90, 0x0, 0x0, 0xef, 0xf2, + + /* U+0029 ")" */ + 0xaf, 0xf7, 0x0, 0x0, 0x2f, 0xff, 0x10, 0x0, + 0xa, 0xff, 0x80, 0x0, 0x3, 0xff, 0xf0, 0x0, + 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x7f, 0xfb, 0x0, + 0x0, 0x3f, 0xff, 0x0, 0x0, 0xe, 0xff, 0x40, + 0x0, 0xb, 0xff, 0x70, 0x0, 0x8, 0xff, 0xb0, + 0x0, 0x6, 0xff, 0xd0, 0x0, 0x3, 0xff, 0xf0, + 0x0, 0x2, 0xff, 0xf1, 0x0, 0x1, 0xff, 0xf2, + 0x0, 0x0, 0xff, 0xf3, 0x0, 0x0, 0xff, 0xf4, + 0x0, 0x0, 0xff, 0xf4, 0x0, 0x0, 0xff, 0xf3, + 0x0, 0x1, 0xff, 0xf2, 0x0, 0x2, 0xff, 0xf1, + 0x0, 0x3, 0xff, 0xf0, 0x0, 0x6, 0xff, 0xd0, + 0x0, 0x8, 0xff, 0xb0, 0x0, 0xb, 0xff, 0x70, + 0x0, 0xe, 0xff, 0x40, 0x0, 0x3f, 0xff, 0x0, + 0x0, 0x7f, 0xfa, 0x0, 0x0, 0xdf, 0xf4, 0x0, + 0x3, 0xff, 0xe0, 0x0, 0xa, 0xff, 0x70, 0x0, + 0x2f, 0xfe, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x3, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x6, 0x60, 0x3, + 0xfc, 0x0, 0x19, 0x21, 0xff, 0xc3, 0x3f, 0xc0, + 0x7f, 0xfa, 0x8, 0xff, 0xfb, 0xfe, 0xdf, 0xfd, + 0x40, 0x1, 0x9f, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xf7, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xfd, 0x40, 0x2e, 0xff, 0xb5, 0xfc, + 0x6e, 0xff, 0xa0, 0xcd, 0x50, 0x3f, 0xc0, 0x8, + 0xf6, 0x1, 0x0, 0x3, 0xfc, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x87, 0x0, 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x6b, 0xb3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x7a, 0xaa, 0xaa, 0xdf, 0xfc, 0xaa, 0xaa, 0xa5, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + + /* U+002C "," */ + 0x0, 0x54, 0x0, 0xd, 0xff, 0x90, 0x4f, 0xff, + 0xf0, 0x4f, 0xff, 0xf0, 0xa, 0xff, 0xc0, 0x1, + 0xff, 0x70, 0x5, 0xff, 0x20, 0x9, 0xfc, 0x0, + 0xd, 0xf7, 0x0, 0x1f, 0xf1, 0x0, + + /* U+002D "-" */ + 0xc, 0xcc, 0xcc, 0xcc, 0xcc, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0x10, + + /* U+002E "." */ + 0x2, 0x87, 0x0, 0x1f, 0xff, 0xc0, 0x6f, 0xff, + 0xf1, 0x3f, 0xff, 0xe0, 0x7, 0xed, 0x40, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x88, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x39, 0xcf, 0xfe, 0xb7, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xc5, 0x10, 0x26, 0xef, 0xff, + 0x80, 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0x30, 0x0, 0x1f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xfb, 0x0, 0x7, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf2, 0x0, 0xcf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x70, 0xf, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xd0, 0x4f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x5, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x5f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0x4, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf0, 0x3f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf7, 0x0, 0x7f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x20, 0x1, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0x0, + 0x8, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0xd, 0xff, 0xfb, 0x41, 0x1, + 0x6e, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x9d, 0xff, 0xeb, + 0x71, 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0xbf, 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, + 0xff, 0xf0, 0xae, 0xee, 0xef, 0xff, 0xf0, 0x0, + 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, + 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, + 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, + 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, + 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, + 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, + 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, + + /* U+0032 "2" */ + 0x0, 0x0, 0x27, 0xbd, 0xef, 0xec, 0x82, 0x0, + 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x4, 0xff, 0xff, 0xa5, + 0x10, 0x2, 0x6e, 0xff, 0xf8, 0x0, 0x7, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf0, 0x0, + 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xfe, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xe5, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, + + /* U+0033 "3" */ + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xa, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfe, + 0xb7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x2a, + 0xaa, 0xcf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfd, 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xfb, 0xd, 0xe5, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf5, 0x7f, 0xff, 0xd8, 0x31, + 0x0, 0x15, 0xcf, 0xff, 0xc0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x1, 0x59, 0xce, 0xff, 0xdb, 0x72, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xc0, + 0x0, 0x0, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfe, 0x10, 0x0, 0x6, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x0, 0x6, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x70, + 0x0, 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x1, + 0xef, 0xfb, 0x0, 0x0, 0x0, 0x6, 0xff, 0xd0, + 0x0, 0x0, 0xc, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xd0, 0x0, 0x0, 0x8f, 0xff, 0xfe, + 0xee, 0xee, 0xee, 0xef, 0xff, 0xfe, 0xee, 0xe4, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xa, 0xff, 0xfe, 0xee, + 0xee, 0xee, 0xee, 0xe0, 0x0, 0x0, 0xcf, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xec, 0x95, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x49, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf4, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x20, 0x6f, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xd0, 0x1e, 0xff, + 0xe9, 0x52, 0x0, 0x3, 0x9f, 0xff, 0xf4, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe5, 0x0, 0x0, 0x0, 0x3, 0x7b, 0xdf, 0xfe, + 0xda, 0x50, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, 0xc8, + 0x30, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xfe, 0xef, 0xff, 0xf3, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x83, 0x0, 0x0, 0x27, 0xa0, 0x0, + 0x0, 0x4f, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x30, 0x1, 0x69, 0xaa, + 0x85, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x12, 0xbf, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x5f, 0xff, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x5f, 0xff, 0xef, 0xfa, 0x41, 0x1, 0x5b, 0xff, + 0xfc, 0x0, 0x4f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x60, 0x3f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, 0x1f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, + 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf0, 0x3, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xc0, 0x0, 0xcf, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x60, + 0x0, 0x2f, 0xff, 0xe5, 0x0, 0x0, 0x7, 0xff, + 0xfd, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfc, 0xbc, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xce, 0xfe, 0xc9, 0x30, 0x0, 0x0, + + /* U+0037 "7" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xff, 0xfd, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf6, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xe0, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x10, 0x33, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x3, 0x8c, 0xef, 0xfe, 0xc8, 0x30, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x20, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xdc, 0xce, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xef, + 0xff, 0x81, 0x0, 0x0, 0x29, 0xff, 0xfd, 0x0, + 0x6, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x40, 0x9, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x70, 0x9, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x7, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, + 0x2, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfe, 0x0, 0x0, 0x8f, 0xff, 0xb5, 0x10, 0x2, + 0x5c, 0xff, 0xf5, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x3, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x7f, 0xff, 0xfd, 0xa9, 0x9a, 0xef, 0xff, + 0xf5, 0x0, 0x6, 0xff, 0xfb, 0x20, 0x0, 0x0, + 0x4, 0xdf, 0xff, 0x50, 0xf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xe0, 0x5f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, + 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf5, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf5, 0x5f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf3, 0xf, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xe0, + 0x7, 0xff, 0xfd, 0x50, 0x0, 0x0, 0x16, 0xef, + 0xff, 0x50, 0x0, 0x8f, 0xff, 0xff, 0xdb, 0xcd, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x5, 0x9c, 0xef, 0xfe, 0xc8, 0x40, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x3, 0x8c, 0xef, 0xec, 0x83, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xb2, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xdc, 0xdf, 0xff, 0xfe, 0x30, 0x0, 0x0, 0xdf, + 0xff, 0x70, 0x0, 0x0, 0x5e, 0xff, 0xe1, 0x0, + 0x6, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xfb, 0x0, 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x30, 0xf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x90, 0xf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, + 0xf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf1, 0xc, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf3, 0x6, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0xdf, + 0xff, 0xb5, 0x10, 0x14, 0xaf, 0xfe, 0xff, 0xf5, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xf4, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, + 0xfb, 0x21, 0xff, 0xf3, 0x0, 0x0, 0x1, 0x69, + 0xab, 0x97, 0x20, 0x3, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xf4, 0x0, + 0x0, 0xa, 0x72, 0x0, 0x0, 0x38, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x3, + 0x8c, 0xef, 0xfe, 0xc8, 0x30, 0x0, 0x0, 0x0, + + /* U+003A ":" */ + 0x7, 0xed, 0x40, 0x4f, 0xff, 0xe0, 0x6f, 0xff, + 0xf1, 0x1f, 0xff, 0xb0, 0x2, 0x87, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x87, 0x0, 0x1f, 0xff, 0xc0, 0x6f, 0xff, 0xf1, + 0x3f, 0xff, 0xe0, 0x7, 0xed, 0x40, + + /* U+003B ";" */ + 0x7, 0xed, 0x40, 0x4f, 0xff, 0xe0, 0x6f, 0xff, + 0xf1, 0x1f, 0xff, 0xb0, 0x2, 0x87, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x54, 0x0, 0xd, 0xff, 0x90, 0x4f, 0xff, 0xf0, + 0x4f, 0xff, 0xf0, 0xa, 0xff, 0xc0, 0x1, 0xff, + 0x70, 0x5, 0xff, 0x20, 0x9, 0xfc, 0x0, 0xd, + 0xf7, 0x0, 0x1f, 0xf1, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xc8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, 0xc6, 0x0, + 0x0, 0x17, 0xdf, 0xff, 0xfe, 0x82, 0x0, 0x0, + 0x4b, 0xff, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0x93, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8e, 0xff, 0xff, 0xd7, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0xff, 0xff, 0xfb, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, 0xfe, 0x82, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, + + /* U+003D "=" */ + 0x7a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa5, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa5, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+003E ">" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x7d, 0xff, 0xff, 0xe9, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x39, 0xff, 0xff, 0xfc, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xbf, 0xff, 0xff, 0x92, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x2, 0x8e, 0xff, 0xff, 0xd7, 0x10, + 0x0, 0x6, 0xcf, 0xff, 0xff, 0xa3, 0x0, 0x0, + 0x3a, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf9, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x27, 0xcd, 0xff, 0xec, 0x83, 0x0, + 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x6, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xfd, 0x0, 0x5f, 0xff, 0xf8, 0x20, 0x0, + 0x6, 0xef, 0xff, 0x90, 0x9, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf0, 0x0, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x55, 0x51, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xb0, 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x8b, 0xde, + 0xff, 0xec, 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xc8, + 0x64, 0x44, 0x57, 0xae, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xe7, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0x50, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x20, 0x0, 0x5, 0xff, 0x80, 0x0, + 0x0, 0x5, 0xae, 0xff, 0xd9, 0x30, 0xd, 0xff, + 0x10, 0x1e, 0xfb, 0x0, 0x0, 0xdf, 0xd0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xdf, + 0xf1, 0x0, 0x5f, 0xf3, 0x0, 0x4f, 0xf6, 0x0, + 0x0, 0x2e, 0xff, 0xfe, 0xa9, 0xbf, 0xff, 0xce, + 0xff, 0x10, 0x0, 0xdf, 0x90, 0xa, 0xfe, 0x0, + 0x0, 0xd, 0xff, 0xe4, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xf1, 0x0, 0x7, 0xfe, 0x0, 0xef, 0xa0, + 0x0, 0x8, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x10, 0x0, 0x2f, 0xf2, 0x1f, 0xf6, + 0x0, 0x0, 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf1, 0x0, 0x0, 0xff, 0x54, 0xff, + 0x30, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x10, 0x0, 0xd, 0xf7, 0x5f, + 0xf2, 0x0, 0x5, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf1, 0x0, 0x0, 0xcf, 0x85, + 0xff, 0x10, 0x0, 0x6f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, 0xc, 0xf7, + 0x5f, 0xf2, 0x0, 0x5, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf1, 0x0, 0x0, 0xdf, + 0x74, 0xff, 0x30, 0x0, 0x2f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, 0x0, 0xf, + 0xf5, 0x1f, 0xf6, 0x0, 0x0, 0xef, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x3, + 0xff, 0x20, 0xef, 0xa0, 0x0, 0x8, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x20, 0x0, + 0x8f, 0xd0, 0x9, 0xfe, 0x0, 0x0, 0xd, 0xff, + 0xe4, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf7, 0x0, + 0x3f, 0xf7, 0x0, 0x4f, 0xf6, 0x0, 0x0, 0x2e, + 0xff, 0xfd, 0xa9, 0xbe, 0xff, 0xc6, 0xff, 0xfa, + 0xaf, 0xfd, 0x0, 0x0, 0xdf, 0xd0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xa1, 0xc, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x5, 0xff, 0x80, 0x0, + 0x0, 0x5, 0xae, 0xff, 0xd9, 0x40, 0x0, 0x18, + 0xdf, 0xe9, 0x10, 0x0, 0x0, 0xb, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x29, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xc8, 0x64, 0x44, 0x69, + 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9b, 0xef, 0xff, + 0xeb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xe3, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, + 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x10, 0x4f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfa, 0x0, 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0x0, 0x6, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, + 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf8, 0x0, 0x0, 0x0, 0xa, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xcb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf7, 0x0, 0x0, + 0xf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfe, 0x0, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x50, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, 0x5, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf3, 0xc, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, + + /* U+0042 "B" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xa5, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x7f, 0xff, + 0xbb, 0xbb, 0xbb, 0xbc, 0xdf, 0xff, 0xff, 0x50, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x8f, 0xff, 0xf1, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xfa, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xfc, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf7, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x15, 0xcf, 0xff, 0x60, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x7f, + 0xff, 0xbb, 0xbb, 0xbb, 0xbb, 0xcd, 0xff, 0xff, + 0xe3, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xef, 0xff, 0x20, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0x90, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xe0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xc0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, 0x50, 0x7f, + 0xff, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0xff, + 0xfa, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xda, 0x61, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x28, 0xbe, 0xff, 0xec, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc6, + 0x20, 0x1, 0x38, 0xef, 0xff, 0xe1, 0x0, 0xc, + 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf6, 0x0, 0x8, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x46, 0x0, 0x1, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x60, 0x0, 0x0, 0xcf, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x70, 0x0, 0x1, + 0xcf, 0xff, 0xfb, 0x62, 0x0, 0x13, 0x8e, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, 0xfe, + 0xc9, 0x50, 0x0, 0x0, + + /* U+0044 "D" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x15, 0xaf, 0xff, 0xfe, 0x20, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xbf, 0xff, 0xe1, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x30, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xa0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf5, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf6, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf6, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf5, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf3, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xa0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x30, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfa, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xd1, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x15, 0xaf, + 0xff, 0xfe, 0x20, 0x0, 0x7f, 0xff, 0xee, 0xee, + 0xee, 0xef, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd5, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xeb, 0x83, 0x0, 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x7f, 0xff, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xe5, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7f, 0xff, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xec, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+0046 "F" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x7f, 0xff, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xe5, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7f, 0xff, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, 0xed, + 0xa5, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc6, + 0x30, 0x1, 0x37, 0xcf, 0xff, 0xf3, 0x0, 0xb, + 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0xfa, 0x0, 0x7, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0x0, 0x1, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x12, 0x20, 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x54, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf5, 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x50, 0xdf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, + 0x8, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x50, 0x1f, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, + 0x7f, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x50, 0x0, 0xbf, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, 0x0, 0x0, + 0xcf, 0xff, 0xfc, 0x62, 0x0, 0x2, 0x6b, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfe, + 0xda, 0x61, 0x0, 0x0, + + /* U+0048 "H" */ + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7f, + 0xff, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, + 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, + + /* U+0049 "I" */ + 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, + 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, + 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, + 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, + 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, + 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, + + /* U+004A "J" */ + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0xd, 0xee, 0xee, 0xee, 0xef, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, + 0x0, 0x60, 0x0, 0x0, 0x0, 0x9, 0xff, 0xd0, + 0x6, 0xfb, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, + 0x1f, 0xff, 0xd5, 0x0, 0x4, 0xdf, 0xff, 0x20, + 0x7, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x1, 0x6b, 0xef, 0xfd, 0x93, 0x0, 0x0, + + /* U+004B "K" */ + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x40, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x60, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf7, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x5f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x4, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x4f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x3, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x3f, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xef, 0xff, 0xbf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf4, 0xb, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x40, 0x0, 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf4, 0x0, 0x0, 0x1e, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, + 0x3, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xd0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfb, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x80, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf5, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xe1, + + /* U+004C "L" */ + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfe, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xec, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, + + /* U+004D "M" */ + 0x7f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xfd, 0x7f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, 0x7f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfd, 0x7f, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xfd, 0x7f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xfd, 0x7f, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xef, 0xfd, 0x7f, 0xfd, 0xaf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x7f, 0xfd, + 0x7f, 0xfd, 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf6, 0x6f, 0xfe, 0x7f, 0xfd, 0x7, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, + 0x6f, 0xfe, 0x7f, 0xfd, 0x0, 0xdf, 0xf8, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x40, 0x6f, 0xfe, 0x7f, + 0xfd, 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, 0x9f, + 0xfa, 0x0, 0x6f, 0xfe, 0x7f, 0xfd, 0x0, 0xa, + 0xff, 0xb0, 0x0, 0x3, 0xff, 0xf1, 0x0, 0x6f, + 0xfe, 0x7f, 0xfd, 0x0, 0x1, 0xff, 0xf4, 0x0, + 0xc, 0xff, 0x70, 0x0, 0x6f, 0xfe, 0x7f, 0xfd, + 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x5f, 0xfd, 0x0, + 0x0, 0x6f, 0xfe, 0x7f, 0xfd, 0x0, 0x0, 0xd, + 0xff, 0x70, 0xef, 0xf4, 0x0, 0x0, 0x6f, 0xfe, + 0x7f, 0xfd, 0x0, 0x0, 0x4, 0xff, 0xf9, 0xff, + 0xb0, 0x0, 0x0, 0x6f, 0xfe, 0x7f, 0xfd, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x5f, 0xfe, 0x7f, 0xfd, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x7f, + 0xfd, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x5f, 0xfe, 0x7f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x50, 0x0, 0x0, 0x0, 0x5f, + 0xfe, 0x7f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x7f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfe, 0x7f, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, + + /* U+004E "N" */ + 0x7f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x7f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf0, 0x7f, 0xff, 0xbf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x1d, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, + 0x7f, 0xff, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x5f, 0xff, + 0xd1, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, + 0x0, 0x8, 0xff, 0xfb, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x7f, 0xff, 0x0, 0x0, 0xbf, 0xff, 0x80, + 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, + 0x1d, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xf0, 0x7f, + 0xff, 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, 0x5, + 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xd1, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0x5, 0xff, 0xf0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x85, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xfa, 0xff, 0xf0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xf0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xed, + 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfb, 0x62, 0x0, 0x13, 0x8e, + 0xff, 0xff, 0x60, 0x0, 0x0, 0xb, 0xff, 0xfe, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, + 0x0, 0x0, 0x7f, 0xff, 0xb1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xfe, 0x10, 0x1, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x90, 0x8, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, + 0xd, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf6, 0x1f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xfa, 0x4f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x5f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xfe, 0x5f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xfe, 0x4f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x1f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xfa, 0xd, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, + 0x8, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf1, 0x1, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x90, 0x0, 0x7f, 0xff, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfe, 0x10, 0x0, + 0xb, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfb, 0x62, 0x0, 0x3, 0x7e, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xbe, 0xff, 0xfd, 0xa6, 0x10, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc8, 0x30, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, 0x0, 0x7f, 0xff, 0xee, 0xee, + 0xee, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x1, 0x4a, 0xff, 0xff, 0x40, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xd0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf9, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfc, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xc0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x2, + 0x5b, 0xff, 0xff, 0x30, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x7f, 0xff, 0xee, 0xee, 0xee, 0xed, 0xa7, 0x20, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xed, + 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfc, 0x62, + 0x0, 0x14, 0x8e, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfe, 0x10, 0x0, 0x1, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0x90, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, + 0xd, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, 0x1f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xfa, 0x0, 0x4f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x5f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x0, + 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x4f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfd, 0x0, 0x2f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfa, 0x0, 0xe, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, + 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0x2, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xa0, 0x0, 0x0, 0x9f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x10, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xfa, 0x40, 0x0, 0x2, + 0x6d, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, + 0xff, 0xff, 0xe6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xc4, + 0x10, 0x28, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x48, 0xa9, 0x84, 0x0, 0x0, + + /* U+0052 "R" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc8, 0x30, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc3, 0x0, 0x0, 0x7f, 0xff, 0xee, + 0xee, 0xee, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x7, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x14, 0xaf, 0xff, + 0xf4, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xd0, 0x7, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf9, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xb0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0x7, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xb0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf8, 0x7, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, + 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x25, 0xbf, + 0xff, 0xf3, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x7f, 0xff, 0xdd, 0xdd, 0xdd, 0xde, 0xff, 0xd0, + 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x80, 0x0, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x7, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, + 0x10, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xfa, 0x0, 0x7, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf2, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xc0, + + /* U+0053 "S" */ + 0x0, 0x0, 0x3, 0x8c, 0xdf, 0xfe, 0xc9, 0x50, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x10, 0x0, 0x5f, 0xff, 0xff, 0xfe, + 0xef, 0xff, 0xff, 0xf8, 0x0, 0x2f, 0xff, 0xf8, + 0x20, 0x0, 0x2, 0x6b, 0xff, 0x20, 0x9, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x2, 0x70, 0x0, + 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xd9, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xfd, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xcf, 0xff, 0xff, + 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x8c, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6d, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfb, 0x3, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x90, 0xde, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x5f, 0xff, + 0xe8, 0x40, 0x0, 0x0, 0x39, 0xff, 0xfc, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xde, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x3, 0x7b, 0xde, 0xfe, + 0xdb, 0x72, 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xce, 0xee, 0xee, 0xee, + 0xff, 0xff, 0xee, 0xee, 0xee, 0xec, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0xaf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x8a, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf8, 0xaf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x8a, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf8, 0xaf, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x8a, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, 0xaf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x8a, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf8, 0xaf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x8a, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf8, 0xaf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0x8a, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, 0xaf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x8a, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf7, 0x9f, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x68, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, + 0x5f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x31, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf0, 0xb, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf9, 0x0, + 0x4f, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0x20, 0x0, 0x9f, 0xff, 0xe8, 0x30, 0x0, + 0x38, 0xff, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xad, 0xef, 0xed, + 0xa5, 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf1, 0x6, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x90, 0x0, 0xef, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, + 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x1f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf4, + 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xd0, 0x0, 0x0, 0x3, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x10, 0x0, 0x0, 0xaf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x80, 0x0, + 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xe0, 0x0, 0x8, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf5, 0x0, 0xe, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfc, 0x0, 0x6f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x30, 0xdf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xa4, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xb0, 0x1f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x10, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xb0, 0x0, 0x1f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xe9, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf6, 0x0, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf9, + 0x4f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x10, 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x40, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xb0, 0x0, 0x0, 0x1f, 0xff, 0x60, + 0x0, 0x0, 0x3, 0xff, 0xe0, 0x9, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xef, 0xf6, 0x0, 0x0, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0x0, 0x8f, 0xf9, 0x0, + 0x3f, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, + 0x0, 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, 0xe, + 0xff, 0x40, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x8, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x60, + 0x0, 0x3, 0xff, 0xe0, 0x0, 0x9, 0xff, 0xb0, + 0x0, 0x0, 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, + 0x3f, 0xff, 0x0, 0x0, 0x3f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, 0xe, 0xff, + 0x30, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x8, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x50, + 0x4, 0xff, 0xe0, 0x0, 0x0, 0x8, 0xff, 0xb0, + 0x0, 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfb, 0x0, 0x9f, 0xf8, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x0, 0x3f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf0, 0xe, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x8, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x54, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xb0, + 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfa, 0xaf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x4f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfe, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0xa, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf7, 0x0, 0xe, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xfb, 0x0, 0x0, + 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xfe, 0x10, 0x0, 0x0, 0x8f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf8, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf4, 0x3, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xe2, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf7, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf6, 0x9, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfa, 0x0, 0xd, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0x10, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x40, 0x0, 0x0, 0x6f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x0, 0x1e, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xfd, + 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf9, 0x0, 0x7, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf2, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xd0, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x30, + 0x0, 0xaf, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x1f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, + 0x0, 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x60, 0x0, 0x0, 0x0, 0xcf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x2, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xe1, 0x0, 0x0, 0xc, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xf9, 0x0, 0x0, 0x5f, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x30, 0x0, 0xef, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, 0x9, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf6, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xcf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x4e, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe5, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x58, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, + + /* U+005B "[" */ + 0x7f, 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xfa, + 0x7f, 0xff, 0xaa, 0xa7, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xff, 0xaa, 0xa7, + 0x7f, 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xfa, + + /* U+005C "\\" */ + 0x18, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, + + /* U+005D "]" */ + 0x5f, 0xff, 0xff, 0xfc, 0x5f, 0xff, 0xff, 0xfc, + 0x3a, 0xaa, 0xdf, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x3a, 0xaa, 0xdf, 0xfc, + 0x5f, 0xff, 0xff, 0xfc, 0x5f, 0xff, 0xff, 0xfc, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xf9, 0xbf, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf2, 0x4f, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xb0, 0xe, 0xfa, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x40, 0x7, 0xff, 0x10, 0x0, + 0x0, 0xa, 0xfe, 0x0, 0x1, 0xff, 0x70, 0x0, + 0x0, 0x1f, 0xf7, 0x0, 0x0, 0xaf, 0xe0, 0x0, + 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x3f, 0xf5, 0x0, + 0x0, 0xef, 0xa0, 0x0, 0x0, 0xc, 0xfc, 0x0, + 0x6, 0xff, 0x30, 0x0, 0x0, 0x6, 0xff, 0x30, + 0xc, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xef, 0x90, + 0x3f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, + + /* U+005F "_" */ + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, + + /* U+0060 "`" */ + 0x5, 0x88, 0x83, 0x0, 0x0, 0x0, 0xbf, 0xfe, + 0x30, 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0x40, 0x0, 0x0, 0x2, 0xdf, + 0xf4, + + /* U+0061 "a" */ + 0x0, 0x0, 0x59, 0xde, 0xff, 0xda, 0x40, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0x9, 0xff, 0xff, 0xfd, 0xde, 0xff, 0xff, + 0xd1, 0x0, 0x2f, 0xf9, 0x30, 0x0, 0x2, 0xaf, + 0xff, 0x90, 0x0, 0x51, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x50, 0x0, 0x0, 0x14, 0x45, + 0x55, 0x55, 0xef, 0xf5, 0x0, 0x8, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xb, 0xff, 0xe7, + 0x20, 0x0, 0x0, 0xe, 0xff, 0x61, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf6, 0x4f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x63, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, 0xf, + 0xff, 0x90, 0x0, 0x0, 0x6, 0xff, 0xff, 0x60, + 0x7f, 0xff, 0xd7, 0x55, 0x7d, 0xff, 0xff, 0xf6, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x6b, 0xff, + 0x60, 0x0, 0x29, 0xdf, 0xfe, 0xc8, 0x20, 0xbf, + 0xf6, + + /* U+0062 "b" */ + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x50, 0x6, 0xbe, 0xff, + 0xd9, 0x40, 0x0, 0x0, 0xef, 0xf5, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x0, 0xe, 0xff, 0xaf, + 0xff, 0xfe, 0xdf, 0xff, 0xff, 0xe3, 0x0, 0xef, + 0xff, 0xff, 0x82, 0x0, 0x3, 0xaf, 0xff, 0xe1, + 0xe, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xa0, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x2e, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf7, 0xef, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xae, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfb, + 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xbe, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfa, 0xef, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x7e, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, 0xef, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, 0xe, + 0xff, 0xff, 0xf8, 0x20, 0x0, 0x3a, 0xff, 0xfe, + 0x10, 0xef, 0xf8, 0xff, 0xff, 0xed, 0xff, 0xff, + 0xfe, 0x30, 0xe, 0xff, 0x34, 0xef, 0xff, 0xff, + 0xff, 0xfb, 0x10, 0x0, 0xef, 0xf3, 0x0, 0x6b, + 0xef, 0xfd, 0x94, 0x0, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfe, 0xef, + 0xff, 0xff, 0x40, 0x0, 0xbf, 0xff, 0xc4, 0x0, + 0x1, 0x6e, 0xff, 0xe1, 0x6, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x1, 0xdd, 0x40, 0xe, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x4f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x6, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x1, 0xde, 0x40, 0x0, 0xaf, + 0xff, 0xc4, 0x0, 0x0, 0x6e, 0xff, 0xe1, 0x0, + 0xb, 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0xa4, + 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, + 0x2, 0x8c, 0xff, 0xec, 0x71, 0x2, 0xff, 0xf1, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x62, + 0xff, 0xf1, 0x0, 0x1d, 0xff, 0xff, 0xfd, 0xef, + 0xff, 0xfa, 0xff, 0xf1, 0x0, 0xcf, 0xff, 0xc4, + 0x0, 0x1, 0x7e, 0xff, 0xff, 0xf1, 0x8, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf1, + 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf1, 0x4f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf1, 0x7f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x8f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf1, + 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf1, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf1, 0x4f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0xe, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf1, + 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf1, 0x0, 0xcf, 0xff, 0x91, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xf1, 0x0, 0x1d, 0xff, 0xff, + 0xca, 0xbd, 0xff, 0xfa, 0xff, 0xf1, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, 0xf1, + 0x0, 0x0, 0x2, 0x8c, 0xff, 0xec, 0x82, 0x0, + 0xff, 0xf1, + + /* U+0065 "e" */ + 0x0, 0x0, 0x2, 0x8c, 0xff, 0xec, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xcb, + 0xdf, 0xff, 0xfc, 0x0, 0x0, 0xb, 0xff, 0xf7, + 0x0, 0x0, 0x18, 0xff, 0xf9, 0x0, 0x7, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, + 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xb0, 0x4f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x17, 0xff, 0xd5, 0x55, 0x55, 0x55, + 0x55, 0x55, 0xef, 0xf4, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x58, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x7f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, 0xaf, 0xff, + 0xc4, 0x0, 0x0, 0x29, 0xff, 0xa0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xed, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xeb, + 0x71, 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x6b, 0xef, 0xeb, 0x50, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xaf, 0xff, 0xdb, 0xcf, 0x90, 0x0, 0x1, 0xff, + 0xf7, 0x0, 0x1, 0x10, 0x0, 0x5, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x5a, + 0xac, 0xff, 0xfa, 0xaa, 0xaa, 0x0, 0x0, 0x7, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x2, 0x8c, 0xef, 0xec, 0x82, 0x0, + 0xcf, 0xf5, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xcf, 0xf5, 0x0, 0x1d, 0xff, 0xff, + 0xfd, 0xdf, 0xff, 0xfb, 0xcf, 0xf5, 0x0, 0xcf, + 0xff, 0xb4, 0x0, 0x0, 0x4c, 0xff, 0xff, 0xf5, + 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf5, 0xe, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf5, 0x4f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf5, 0x7f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, + 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf5, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0x7f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf5, 0x3f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, + 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xf5, 0x6, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x2, 0xcf, 0xff, 0xf5, 0x0, 0xaf, 0xff, 0xe7, + 0x20, 0x13, 0x8e, 0xff, 0xff, 0xf5, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xf5, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xfe, 0x60, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x59, 0xcc, 0xba, + 0x50, 0x0, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xc0, + 0x0, 0x6a, 0x10, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0x60, 0x1, 0xff, 0xfa, 0x41, 0x0, 0x0, + 0x28, 0xff, 0xfd, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xed, 0xdf, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x0, 0x0, 0x16, 0x9c, 0xef, 0xfe, 0xc8, 0x30, + 0x0, 0x0, + + /* U+0068 "h" */ + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf5, 0x1, 0x7b, 0xef, 0xfd, 0x92, 0x0, 0x0, + 0xef, 0xf5, 0x6e, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xef, 0xfc, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xf9, 0x0, 0xef, 0xff, 0xfe, 0x61, 0x0, 0x16, + 0xef, 0xff, 0x40, 0xef, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xb0, 0xef, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf0, 0xef, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf1, 0xef, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf2, 0xef, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf3, + + /* U+0069 "i" */ + 0x2, 0x75, 0x2, 0xff, 0xf9, 0x6f, 0xff, 0xe3, + 0xff, 0xfa, 0x5, 0xa8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, 0xef, + 0xf5, 0xe, 0xff, 0x50, 0xef, 0xf5, 0xe, 0xff, + 0x50, 0xef, 0xf5, 0xe, 0xff, 0x50, 0xef, 0xf5, + 0xe, 0xff, 0x50, 0xef, 0xf5, 0xe, 0xff, 0x50, + 0xef, 0xf5, 0xe, 0xff, 0x50, 0xef, 0xf5, 0xe, + 0xff, 0x50, 0xef, 0xf5, 0xe, 0xff, 0x50, 0xef, + 0xf5, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x1, 0x66, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x3, 0xa9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xc, 0xff, 0x70, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x60, 0x1, 0x40, + 0x0, 0x9f, 0xff, 0x20, 0x8, 0xfe, 0xce, 0xff, + 0xfa, 0x0, 0xe, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x4, 0xbe, 0xff, 0xc7, 0x0, 0x0, + + /* U+006B "k" */ + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x90, 0x0, 0xef, 0xf5, 0x0, 0x0, 0xa, 0xff, + 0xf8, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0xbf, + 0xff, 0x80, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x1c, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x1, + 0xdf, 0xff, 0x80, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x2e, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf9, 0xef, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xfe, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xfe, 0x33, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0xef, 0xff, 0xe2, 0x0, 0x6f, 0xff, + 0xb0, 0x0, 0x0, 0xef, 0xfd, 0x20, 0x0, 0x9, + 0xff, 0xf8, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x50, 0x0, 0xef, 0xf5, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf2, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, 0x0, 0xef, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf7, + + /* U+006C "l" */ + 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, + 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, + 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, + 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, + 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, + 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, + 0xef, 0xf5, + + /* U+006D "m" */ + 0xef, 0xf3, 0x2, 0x8c, 0xef, 0xec, 0x61, 0x0, + 0x0, 0x27, 0xce, 0xfe, 0xc8, 0x20, 0x0, 0xe, + 0xff, 0x38, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0xef, + 0xfc, 0xff, 0xfd, 0xbc, 0xff, 0xff, 0xf3, 0xbf, + 0xff, 0xec, 0xce, 0xff, 0xff, 0x70, 0xe, 0xff, + 0xff, 0xb2, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x4, 0xef, 0xff, 0x10, 0xef, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x2, 0xff, 0xf8, 0xe, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xc0, 0xef, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfe, 0xe, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf0, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xe, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, + + /* U+006E "n" */ + 0xef, 0xf3, 0x1, 0x7c, 0xef, 0xfd, 0x92, 0x0, + 0x0, 0xef, 0xf3, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xef, 0xfc, 0xff, 0xfe, 0xcc, 0xef, + 0xff, 0xf9, 0x0, 0xef, 0xff, 0xfc, 0x30, 0x0, + 0x3, 0xdf, 0xff, 0x40, 0xef, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xb0, 0xef, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, 0xef, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf1, 0xef, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf2, + 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf3, + + /* U+006F "o" */ + 0x0, 0x0, 0x1, 0x7c, 0xef, 0xfd, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xfd, 0xef, 0xff, 0xff, 0x70, 0x0, 0x0, 0xbf, + 0xff, 0xc4, 0x0, 0x1, 0x6e, 0xff, 0xf4, 0x0, + 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0x10, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x80, 0x4f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xd0, 0x7f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, + 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf2, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf1, 0x7f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x3f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xd0, + 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x70, 0x6, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xfe, 0x10, 0x0, 0xaf, 0xff, 0xc4, + 0x0, 0x1, 0x6e, 0xff, 0xf4, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, + 0xa5, 0x0, 0x0, 0x0, + + /* U+0070 "p" */ + 0xef, 0xf3, 0x1, 0x7b, 0xef, 0xfd, 0x94, 0x0, + 0x0, 0xe, 0xff, 0x36, 0xef, 0xff, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0xef, 0xfa, 0xff, 0xfe, 0xcb, + 0xcf, 0xff, 0xfe, 0x30, 0xe, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x17, 0xff, 0xfe, 0x10, 0xef, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0xe, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf2, 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x7e, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xbe, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfb, 0xef, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xae, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf7, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x2e, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xa0, 0xef, 0xff, 0xff, + 0x82, 0x0, 0x3, 0xaf, 0xff, 0xe1, 0xe, 0xff, + 0xaf, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0xe3, 0x0, + 0xef, 0xf5, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x0, 0xe, 0xff, 0x50, 0x6, 0xbe, 0xff, 0xd9, + 0x40, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x2, 0x8c, 0xff, 0xec, 0x71, 0x0, + 0xff, 0xf1, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xff, 0xf1, 0x0, 0x1d, 0xff, 0xff, + 0xfd, 0xef, 0xff, 0xf8, 0xff, 0xf1, 0x0, 0xcf, + 0xff, 0xc4, 0x0, 0x1, 0x7f, 0xff, 0xff, 0xf1, + 0x8, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xf1, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf1, 0x4f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x7f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, + 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf1, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf1, 0x7f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x4f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, + 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf1, 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xf1, 0x0, 0xcf, 0xff, 0xc4, + 0x0, 0x1, 0x6e, 0xff, 0xff, 0xf1, 0x0, 0x1d, + 0xff, 0xff, 0xfd, 0xef, 0xff, 0xf9, 0xff, 0xf1, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x52, + 0xff, 0xf1, 0x0, 0x0, 0x2, 0x8c, 0xff, 0xec, + 0x71, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf1, + + /* U+0072 "r" */ + 0xef, 0xf3, 0x1, 0x7b, 0xec, 0xef, 0xf3, 0x5e, + 0xff, 0xfc, 0xef, 0xf7, 0xff, 0xff, 0xfc, 0xef, + 0xff, 0xff, 0x94, 0x21, 0xef, 0xff, 0xe2, 0x0, + 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, 0xef, 0xfc, + 0x0, 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, 0x0, + 0xef, 0xf6, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0xef, + 0xf5, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, + 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x28, 0xce, 0xff, 0xeb, 0x84, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0xaf, 0xff, 0xfe, 0xcc, 0xef, 0xff, + 0xe0, 0x0, 0x3f, 0xff, 0x92, 0x0, 0x0, 0x16, + 0xd6, 0x0, 0x8, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x85, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x18, 0xdf, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x13, 0x69, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x0, 0x6, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x6, + 0xfd, 0x73, 0x0, 0x0, 0x5, 0xef, 0xfa, 0x0, + 0xef, 0xff, 0xff, 0xdc, 0xdf, 0xff, 0xff, 0x20, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x38, 0xbe, 0xff, 0xfd, 0xa4, 0x0, + 0x0, + + /* U+0074 "t" */ + 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x5a, 0xac, 0xff, 0xfa, 0xaa, 0xaa, + 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfa, 0x0, 0x3, 0x20, 0x0, 0x0, 0xbf, + 0xff, 0xec, 0xdf, 0xa0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x7c, 0xff, + 0xea, 0x30, + + /* U+0075 "u" */ + 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfe, 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfe, 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xfe, 0x1f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfe, 0x1f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x1f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x1f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x1f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfe, + 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfe, 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfe, 0xf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfe, 0xf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xfe, 0xd, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xfe, 0x9, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x2, 0xff, + 0xfe, 0x40, 0x0, 0x2, 0xbf, 0xff, 0xfe, 0x0, + 0x7f, 0xff, 0xfe, 0xbb, 0xdf, 0xff, 0xcf, 0xfe, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3f, + 0xfe, 0x0, 0x0, 0x17, 0xce, 0xfe, 0xc8, 0x20, + 0x3f, 0xfe, + + /* U+0076 "v" */ + 0xd, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfd, 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x60, 0x0, 0xef, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xe0, 0x0, + 0x8, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf8, 0x0, 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x10, 0x0, 0x0, 0xaf, 0xfa, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xa0, 0x0, 0x0, + 0x3, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, 0x0, + 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, + 0x0, 0x0, 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf6, 0x0, 0x5, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0xcf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x40, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfa, 0xa, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf3, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0x9f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x23, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0xd, + 0xff, 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf6, 0x0, 0x7f, + 0xf9, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, 0x2, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0xbf, 0xfd, 0xff, 0x60, + 0x0, 0x0, 0x3, 0xff, 0xa0, 0x0, 0xc, 0xff, + 0x40, 0x0, 0x0, 0x2f, 0xfd, 0x4f, 0xfc, 0x0, + 0x0, 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x6f, 0xfa, + 0x0, 0x0, 0x8, 0xff, 0x70, 0xef, 0xf2, 0x0, + 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0x0, 0x0, 0xdf, 0xf1, 0x8, 0xff, 0x80, 0x0, + 0x5, 0xff, 0x80, 0x0, 0x0, 0xa, 0xff, 0x60, + 0x0, 0x4f, 0xfb, 0x0, 0x2f, 0xfd, 0x0, 0x0, + 0xbf, 0xf2, 0x0, 0x0, 0x0, 0x4f, 0xfc, 0x0, + 0xa, 0xff, 0x40, 0x0, 0xbf, 0xf3, 0x0, 0x1f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, + 0xff, 0xe0, 0x0, 0x5, 0xff, 0x90, 0x7, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x8, 0xff, 0x70, 0x6f, + 0xf8, 0x0, 0x0, 0xf, 0xff, 0x0, 0xdf, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfd, 0xc, 0xff, + 0x20, 0x0, 0x0, 0x9f, 0xf5, 0x3f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf6, 0xff, 0xc0, + 0x0, 0x0, 0x3, 0xff, 0xb9, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xf8, 0x0, 0x1e, 0xff, 0x90, 0x0, 0x0, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0x4f, 0xff, 0x50, 0x0, + 0x0, 0x8f, 0xfe, 0x10, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xbf, 0xfd, 0x0, 0x2f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xfa, 0xc, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x7f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x50, 0x8f, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x2e, 0xff, 0x80, + 0x0, 0xcf, 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xc0, 0x0, 0x1, 0xef, 0xf9, 0x0, 0x0, 0x9, + 0xff, 0xe1, 0x0, 0x0, 0x4, 0xff, 0xf5, 0x0, + 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf2, 0x2, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xd0, + + /* U+0079 "y" */ + 0xd, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfd, 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x60, 0x0, 0xef, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, + 0x8, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf8, 0x0, 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, 0xaf, 0xfb, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, + 0x3, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf3, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x90, 0x0, 0x0, + 0x5f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x0, 0x0, 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf7, 0x0, 0x3, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0xaf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x40, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfb, 0x8, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf3, 0xef, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xdf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa7, 0x0, 0x3, + 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xcd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x9d, 0xff, 0xc7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4a, 0xaa, 0xaa, 0xaa, 0xaa, 0xbf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xa4, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + + /* U+007B "{" */ + 0x0, 0x0, 0x2, 0x9e, 0xff, 0x40, 0x0, 0x3, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0xdf, 0xff, 0xda, + 0x20, 0x0, 0x2f, 0xff, 0x80, 0x0, 0x0, 0x4, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x5f, 0xfe, 0x0, 0x0, 0x0, 0x5, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x5f, 0xfe, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xb0, 0x0, 0x1, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xbc, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x5f, 0xfe, 0x0, 0x0, 0x0, 0x5, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfd, 0xa2, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x2a, 0xef, 0xf4, + + /* U+007C "|" */ + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + + /* U+007D "}" */ + 0x5f, 0xfd, 0x91, 0x0, 0x0, 0x5f, 0xff, 0xfe, + 0x20, 0x0, 0x3a, 0xdf, 0xff, 0xc0, 0x0, 0x0, + 0x9, 0xff, 0xf1, 0x0, 0x0, 0x1, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x9f, + 0xff, 0xba, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x0, + 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, + 0x1, 0xff, 0xf4, 0x0, 0x0, 0x8, 0xff, 0xf2, + 0x0, 0x3a, 0xdf, 0xff, 0xd0, 0x0, 0x5f, 0xff, + 0xff, 0x30, 0x0, 0x5f, 0xfe, 0x92, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x8, 0xef, 0xd7, 0x0, 0x0, 0x0, 0x6f, + 0xc0, 0xb, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x9, + 0xfa, 0x5, 0xff, 0xd8, 0xbf, 0xfe, 0x30, 0x1, + 0xff, 0x70, 0xbf, 0xc0, 0x0, 0x6f, 0xff, 0xa8, + 0xef, 0xf2, 0xe, 0xf5, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xf7, 0x0, 0xcc, 0x20, 0x0, 0x0, 0x19, + 0xef, 0xd6, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x5, 0xbe, 0xfc, 0x60, 0x0, 0x0, 0xaf, + 0xfd, 0xdf, 0xfc, 0x10, 0x8, 0xfc, 0x20, 0x1, + 0xaf, 0xc0, 0x1f, 0xe1, 0x0, 0x0, 0xc, 0xf4, + 0x5f, 0x90, 0x0, 0x0, 0x5, 0xf9, 0x6f, 0x70, + 0x0, 0x0, 0x3, 0xfa, 0x5f, 0x90, 0x0, 0x0, + 0x5, 0xf9, 0x1f, 0xe1, 0x0, 0x0, 0xc, 0xf4, + 0x8, 0xfc, 0x20, 0x1, 0xbf, 0xc0, 0x0, 0xaf, + 0xfe, 0xdf, 0xfd, 0x10, 0x0, 0x5, 0xbe, 0xfc, + 0x70, 0x0, + + /* U+2022 "•" */ + 0x0, 0x1, 0x0, 0x0, 0x7f, 0xfd, 0x30, 0x5f, + 0xff, 0xfe, 0x1a, 0xff, 0xff, 0xf4, 0xaf, 0xff, + 0xff, 0x44, 0xff, 0xff, 0xd0, 0x5, 0xdf, 0xb2, + 0x0, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xbb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6b, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, + 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x29, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa6, 0x10, 0x1f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x84, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x62, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x89, 0x87, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x24, 0x54, 0x6f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x6, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xcd, 0xdb, 0x72, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3a, 0xef, 0xff, 0xea, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x17, 0x10, 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0x0, 0x1, + 0x71, 0xdf, 0x20, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x2, 0xfd, 0xff, 0x96, 0x66, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x66, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xcc, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xcc, 0xce, 0xff, 0xff, 0x20, 0x0, + 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf8, 0x0, 0x2, 0xff, 0xff, 0x20, + 0x0, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x2, 0xff, 0xff, + 0x20, 0x0, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x2, 0xff, + 0xff, 0x40, 0x0, 0xdf, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x62, 0x22, 0xef, 0xfc, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0xef, + 0xfb, 0x22, 0x26, 0xff, 0xff, 0x20, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x2, 0xff, 0xff, 0x20, + 0x0, 0xcf, 0xff, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xde, 0xff, 0xf8, 0x0, 0x2, 0xff, 0xff, + 0xca, 0xaa, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfe, 0xaa, 0xac, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb8, 0x88, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, 0x88, + 0x8b, 0xff, 0xff, 0x20, 0x0, 0xcf, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf7, + 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0xcf, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf7, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0xcf, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf7, 0x0, 0x2, 0xff, 0xff, 0x74, 0x44, + 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfc, 0x44, 0x48, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xef, 0xff, + 0xff, 0x30, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x3, + 0xff, 0x7f, 0x20, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x2, 0xf7, + + /* U+F00B "" */ + 0x28, 0x88, 0x88, 0x88, 0x71, 0x0, 0x28, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x82, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x6e, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x17, 0x88, 0x88, 0x88, 0x71, + 0x0, 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0x77, 0x77, + 0x77, 0x60, 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x61, 0xcf, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x1c, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x2, 0xef, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x4b, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xdb, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F00D "ï€" */ + 0x0, 0x26, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x15, 0x40, 0x0, 0x4, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xfa, 0x0, + 0x4f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xa0, 0xdf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf3, + 0xef, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xc0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x60, 0x2e, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xd1, 0x8f, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x8, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xcf, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf2, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf5, 0xaf, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xe1, + 0xb, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x30, 0x0, 0x9e, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xc3, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, + 0xdd, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, + 0x0, 0x0, 0xef, 0xff, 0xf7, 0x0, 0x0, 0x13, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xfb, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x0, 0x3, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x50, 0x0, 0xef, 0xff, 0xf7, 0x0, + 0xc, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xd0, 0x0, 0xef, 0xff, 0xf7, + 0x0, 0x4f, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xe0, 0x0, 0xef, 0xff, + 0xf7, 0x0, 0x5f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0x40, 0x0, 0xef, + 0xff, 0xf7, 0x0, 0xa, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0xef, 0xff, 0xf7, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0xef, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xef, 0xff, 0xf7, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf7, 0x0, 0x5, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xf7, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xfe, 0x0, 0xb, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0x80, 0x3f, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xc0, 0x5f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xe0, + 0x6f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xf0, 0x7f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xf0, 0x6f, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf0, 0x5f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x44, 0x10, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xe0, 0x2f, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0x80, 0xa, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x40, 0x5, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xfd, 0x50, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xb9, 0x78, 0x9d, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x9e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, + 0xbc, 0xdd, 0xca, 0x73, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, + 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x4c, 0xff, 0xff, + 0xff, 0xff, 0x92, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x6, 0xfb, 0x20, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x4, 0xdf, 0x40, 0x0, + 0x0, 0x4f, 0xff, 0xf9, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xaf, 0xff, 0xe2, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x20, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x5e, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x4, 0xdf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x20, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, + 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0xc, 0xff, 0xa1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x2b, 0xff, 0xa0, 0x0, + 0x0, 0x1, 0x93, 0x0, 0x3, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x20, 0x0, 0x59, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0xab, + 0xba, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x9a, 0x50, 0x0, 0x0, 0x7, 0xbb, 0xba, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xef, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0xe, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0xef, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xe, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xf6, 0x4e, 0xff, 0xff, 0xf8, 0xef, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xe3, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xa0, 0x2, 0xdf, 0x40, 0x7, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x70, 0x4, + 0xff, 0xff, 0x70, 0x4, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0x50, 0x7, 0xff, 0xff, 0xff, 0xa0, 0x2, + 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xfd, 0x20, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0x1, 0xbf, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xfc, 0x10, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x9f, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xf9, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x6f, 0xff, 0xff, 0xf5, + 0x0, 0x5f, 0xff, 0xff, 0xf6, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x3e, 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xe4, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x2d, 0xff, 0xff, 0xf2, + 0x5f, 0xff, 0xd2, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0xb, 0xff, 0xf9, 0x0, 0x9f, 0xb0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0x8, 0xfc, 0x0, 0x0, + 0x40, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x3, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x88, 0x88, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x88, + 0x88, 0x88, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xac, 0xcc, 0xcc, 0xdf, 0xff, 0xff, 0xff, 0xfd, + 0xcc, 0xcc, 0xca, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0xcf, 0xff, + 0xfc, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, 0x10, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xb, + 0xff, 0xc0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x99, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x66, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x8, 0xfa, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x6, 0xf8, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xa0, 0x0, 0x2, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x50, 0x0, 0xcf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfe, 0x10, 0x6f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfa, 0xd, 0xff, 0xff, + 0xcc, 0xcc, 0xcc, 0xcc, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, 0xff, + 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa8, 0x88, 0x88, 0x88, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe9, 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdd, + 0xda, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, + 0xef, 0xff, 0xfd, 0x95, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x20, 0x0, + 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x8, 0xff, 0xff, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xaa, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0x68, 0xff, 0xff, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, + 0x4b, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xe, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xa9, 0x87, 0x76, 0xbf, + 0xff, 0xff, 0xff, 0x7, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7a, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xaa, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xd0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0xff, + 0xff, 0xff, 0xfd, 0xdd, 0xef, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x30, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xfb, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xf3, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x20, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, 0x9e, 0xff, + 0xff, 0xff, 0xfb, 0x63, 0x11, 0x36, 0xaf, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0xff, 0xff, 0x81, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xff, 0xff, + 0x90, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xa0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x29, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x3, + 0x79, 0xba, 0x98, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x24, 0x43, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xab, 0xbb, 0xbb, 0xbd, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x7f, 0xa1, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xef, + 0xfd, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x9f, 0xff, 0xa0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x8, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xef, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x1, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x2d, 0xff, 0xe0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xdf, 0xff, 0x60, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xdf, + 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x29, 0x40, 0x0, 0x3a, + 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x98, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, 0x50, 0x0, + 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x1, 0xff, 0xd3, 0x0, 0x7, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0x0, + 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf2, 0x0, 0x1f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x8f, 0xfe, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x70, 0x1, 0xff, 0xf4, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x8, 0xfb, 0x10, 0x0, 0xaf, 0xfe, 0x0, 0xb, + 0xff, 0x90, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xfe, 0x10, 0x2, + 0xff, 0xf4, 0x0, 0x6f, 0xfd, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x9, + 0xff, 0xfa, 0x0, 0xc, 0xff, 0x80, 0x3, 0xff, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x7, 0xff, 0xf1, 0x0, 0x8f, + 0xfb, 0x0, 0xf, 0xff, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xe, + 0xff, 0x50, 0x6, 0xff, 0xd0, 0x0, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xcf, 0xf6, 0x0, 0x5f, 0xfd, + 0x0, 0xf, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x2f, 0xff, + 0x30, 0x6, 0xff, 0xc0, 0x0, 0xff, 0xf2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x2d, 0xff, 0xe0, 0x0, 0xaf, 0xfa, 0x0, + 0x2f, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xd, 0xff, 0xf5, 0x0, + 0xe, 0xff, 0x70, 0x5, 0xff, 0xe0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xdf, 0xf7, 0x0, 0x6, 0xff, 0xf2, 0x0, 0x9f, + 0xfb, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x2, 0x83, 0x0, 0x1, 0xef, + 0xfb, 0x0, 0xe, 0xff, 0x70, 0x3a, 0xbb, 0xbb, + 0xbb, 0xdf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x5, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0x80, + 0x0, 0xcf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xb0, 0x0, 0x6f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, 0x1e, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x9d, + 0x60, 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x2, 0x8a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, + 0x20, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x31, + 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x75, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x3f, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x3, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x3f, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x74, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x47, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x70, + + /* U+F043 "ïƒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xd9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xff, 0xff, 0x40, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xef, 0xff, 0x50, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xcf, 0xff, 0x80, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x9f, 0xff, 0xd0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x4f, 0xff, 0xf6, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xd, 0xff, 0xff, 0x30, + 0x7, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x5, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xb5, 0x10, 0x9f, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, + 0xcf, 0xff, 0xff, 0xd9, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x21, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "ïˆ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5b, 0xbb, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8b, 0x50, 0xbf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf4, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xf7, 0xcf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf8, 0xcf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xf8, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, + 0xf0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xcf, 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xcf, 0xff, 0xf2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, + 0xff, 0xf0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xf8, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf7, 0xcf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xf6, 0xaf, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "ï‹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xab, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe5, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "ïŒ" */ + 0x2, 0x9b, 0xbb, 0xbb, 0xba, 0x81, 0x0, 0x0, + 0x0, 0x29, 0xbb, 0xbb, 0xbb, 0xa8, 0x10, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x8, 0xef, 0xff, 0xff, 0xff, + 0xd5, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, 0xff, + 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F04D "ï" */ + 0x2, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa8, 0x10, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x8, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F051 "ï‘" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xb7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xbb, 0xb5, 0x5f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfb, 0x8f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x8f, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x1f, 0xff, 0xfb, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x1f, 0xff, + 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x1f, 0xff, 0xfb, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, + 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x2f, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x1f, 0xff, 0xfb, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x1f, + 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x1f, 0xff, 0xfb, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfb, 0x8f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x7f, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xfb, 0xb, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, + 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x73, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F053 "ï“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xc4, 0x0, + + /* U+F054 "ï”" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xba, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xa9, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3c, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xa1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x4, 0x67, + 0x77, 0x77, 0x77, 0x79, 0xff, 0xff, 0xff, 0x77, + 0x77, 0x77, 0x77, 0x76, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F068 "ï¨" */ + 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x4, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x20, + + /* U+F06E "ï®" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x44, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xd9, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xf8, 0x30, 0x0, + 0x2, 0x7e, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x4f, 0xff, 0xa2, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf6, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf4, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xd0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x20, 0x4, 0xef, + 0xff, 0xff, 0xff, 0x40, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x2f, 0xde, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xfe, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x9, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x6, 0xff, 0xff, 0xff, 0xff, 0x10, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x1, 0x69, 0x97, 0x20, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, + 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xfd, 0x95, 0x33, 0x47, + 0xcf, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, + 0xef, 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F070 "ï°" */ + 0x2, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x13, + 0x44, 0x32, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x1, 0x59, 0xdf, 0xff, 0xff, 0xff, + 0xda, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x90, 0x5b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x51, 0x0, 0x2, + 0x6d, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xfe, 0x30, 0x2e, 0xfd, + 0x92, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0x60, 0xef, 0xff, 0xf5, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xb1, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xae, 0xff, 0xff, 0xf4, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xe3, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x6, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x90, 0x7, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xb1, 0xdf, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xfe, + 0x95, 0x33, 0x51, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xd2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, + 0xac, 0xef, 0xfe, 0xdb, 0x81, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xef, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, + 0x0, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x43, 0x33, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x71, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x38, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x2, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x20, 0x0, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xc1, 0x0, 0x35, 0x55, 0x55, 0x55, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x55, + 0x5a, 0xff, 0xff, 0xfc, 0x10, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xc0, 0x3, 0xff, 0xff, 0xff, 0xc0, 0x8, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfd, 0x10, 0x3f, 0xff, 0xff, 0xfd, 0x10, 0x8, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xe2, 0x2, 0xef, 0xff, 0xff, 0xe1, 0x0, + 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x30, 0x1e, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x3, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0x50, 0xb, 0x70, 0x0, 0x5, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf7, 0x0, 0xaf, 0xf6, 0x0, 0x8, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0x80, 0x9, 0xff, 0xff, 0x50, 0x8, + 0xff, 0xff, 0xc1, 0x0, 0x35, 0x55, 0x55, 0x9f, + 0xff, 0xff, 0xf9, 0x0, 0x6f, 0xff, 0xff, 0xf6, + 0x5a, 0xff, 0xff, 0xfc, 0x10, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xcf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x84, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xae, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf9, 0x2, + 0xef, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0x90, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf6, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0x60, 0x9f, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xf2, 0x9f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf1, + 0x1c, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0x50, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F078 "ï¸" */ + 0x0, 0x38, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x70, 0x0, 0x5, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x4f, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xc0, 0xaf, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xf2, 0x5f, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x7f, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x9f, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x29, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x0, 0x0, 0x0, 0x59, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x14, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0x5d, 0xff, 0xf6, 0xbf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf6, 0xd, 0xff, 0xf6, 0xc, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0xae, 0x60, 0xd, + 0xff, 0xf6, 0x1, 0xbd, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x31, 0x0, 0x5f, 0xff, 0xe0, 0x0, 0x31, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x50, + 0x5f, 0xff, 0xe0, 0xa, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf4, 0x5f, 0xff, + 0xe0, 0xaf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0x8f, 0xff, 0xe9, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0xa, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, + 0x0, 0x0, + + /* U+F07B "ï»" */ + 0x1, 0x57, 0x88, 0x88, 0x88, 0x88, 0x87, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x31, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x70, + + /* U+F093 "ï‚“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x46, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x13, 0x33, 0x33, 0x4f, 0xff, 0xff, 0xff, 0xf8, + 0x33, 0x33, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x22, 0x22, 0x22, 0x22, 0x10, 0x1f, 0xff, 0xff, + 0xff, 0xf6, 0x1, 0x22, 0x22, 0x22, 0x22, 0x10, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, + 0xff, 0xff, 0xf5, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x5, + 0xbc, 0xcc, 0xcb, 0x80, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd7, 0x55, 0x55, 0x55, 0x7d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x8, 0xfa, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x6, 0xf8, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0x84, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xd9, 0x62, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x2, 0xcf, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xae, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfc, + 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x32, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x15, 0x64, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x53, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0x70, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0x90, 0x8f, 0xff, + 0xff, 0xef, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xf6, 0xd, 0xff, 0xfd, + 0x10, 0x3f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0xff, 0xff, 0x50, + 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xf, 0xff, 0xf6, 0x0, + 0xa, 0xff, 0xfb, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0xcf, 0xff, 0xe5, 0x27, + 0xff, 0xff, 0x70, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xbf, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x56, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x8f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xf8, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd1, + 0x3, 0xff, 0xff, 0x80, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xf5, 0x0, + 0x9, 0xff, 0xfb, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xff, 0xff, 0x60, 0x0, + 0xaf, 0xff, 0xb0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xc, 0xff, 0xfe, 0x52, 0x7f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0x60, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xfb, + 0x30, 0x0, 0x0, 0x7d, 0xff, 0xfc, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x6, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x7, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x7, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x7, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, + 0xff, 0xfc, 0x28, 0x99, 0x99, 0x30, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x3, 0x66, 0x66, + 0x66, 0xdf, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x32, 0x22, 0x22, 0x22, 0xff, + 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0x90, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x46, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x64, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0xff, 0xff, 0xfd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xe2, 0x0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xfe, + 0x20, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xe1, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x56, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x23, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0x0, 0x1, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, + 0x0, + + /* U+F0C9 "" */ + 0x8c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0E0 "" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x1, 0xc3, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x6f, 0xff, 0x80, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0xa, 0xff, 0xff, 0xfc, 0x20, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x30, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x1, 0xbf, + 0xff, 0xfa, 0x10, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x3, 0x99, 0x30, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x77, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x70, + + /* U+F0E7 "" */ + 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x55, 0x55, 0x55, 0x51, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x2, 0x22, 0x22, 0x22, 0x2a, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x39, 0xb9, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xaa, + 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xa9, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xf6, 0x5, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbb, 0xbb, + 0xbb, 0xbb, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x12, 0x22, 0x22, 0x22, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x7, 0xe4, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, + 0xff, 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, + 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, 0xff, + 0x40, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x7, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x1, 0x44, 0x44, 0x43, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xdd, 0xdd, 0xdc, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3a, 0xaa, 0xaa, + 0xaa, 0x50, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x98, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6c, 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x43, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xf6, 0x0, 0x6, 0xfe, 0x0, + 0x3, 0xff, 0x10, 0x1, 0xff, 0x50, 0x0, 0x5f, + 0xf1, 0x0, 0x1f, 0xff, 0xf4, 0xff, 0xff, 0x40, + 0x0, 0x4f, 0xd0, 0x0, 0x2f, 0xf0, 0x0, 0xe, + 0xf3, 0x0, 0x3, 0xfe, 0x0, 0x0, 0xff, 0xff, + 0x4f, 0xff, 0xf4, 0x0, 0x4, 0xfd, 0x0, 0x2, + 0xff, 0x0, 0x0, 0xef, 0x30, 0x0, 0x3f, 0xe0, + 0x0, 0xf, 0xff, 0xf4, 0xff, 0xff, 0x60, 0x0, + 0x7f, 0xe0, 0x0, 0x4f, 0xf2, 0x0, 0x1f, 0xf5, + 0x0, 0x5, 0xff, 0x10, 0x2, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xa2, 0x22, 0x6f, 0xf3, 0x22, 0x3f, + 0xf6, 0x22, 0x2e, 0xf9, 0x22, 0x27, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x2, + 0xfe, 0x0, 0x0, 0xff, 0x30, 0x0, 0xcf, 0x50, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x2f, 0xe0, 0x0, 0xf, 0xf3, + 0x0, 0xc, 0xf5, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x3, 0xfe, + 0x0, 0x0, 0xff, 0x30, 0x0, 0xdf, 0x60, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xfd, 0xdd, 0xff, 0xfe, 0xdd, 0xef, 0xff, 0xdd, + 0xef, 0xff, 0xdd, 0xdf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xfa, 0x44, 0x4a, + 0xff, 0x54, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x9f, 0xf6, 0x44, 0x7f, 0xff, 0xf4, 0xff, + 0xff, 0x40, 0x0, 0x4f, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, + 0xff, 0xff, 0x4f, 0xff, 0xf4, 0x0, 0x4, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xe0, 0x0, 0xf, 0xff, 0xf4, 0xff, 0xff, + 0x40, 0x0, 0x4f, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, 0xff, + 0xff, 0x4f, 0xff, 0xf9, 0x44, 0x4a, 0xff, 0x54, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x9f, + 0xf5, 0x44, 0x6f, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe9, 0x0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7b, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8f, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x56, 0x66, 0x66, 0x66, 0x66, 0x67, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "ï…›" */ + 0x28, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, + 0x8, 0x20, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0xf, 0xe2, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0xf, 0xfe, 0x20, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xf, + 0xff, 0xe2, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0xf, 0xff, 0xfe, 0x20, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0xf, 0xff, 0xff, 0xe2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xf, 0xff, + 0xff, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0xf, 0xff, 0xff, 0xff, 0xe2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0xf, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x10, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x68, 0x9a, + 0xa9, 0x87, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x5a, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdc, 0xbb, 0xbc, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x51, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x7b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x9, 0xff, 0xff, 0xff, 0xff, 0x81, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xe2, 0xef, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0xff, 0xff, 0xff, 0x64, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xb0, 0x4, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x7a, 0xce, 0xff, 0xfd, 0xb9, 0x51, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xb0, 0x0, + 0x3, 0x91, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, + 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x76, + 0x56, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x3b, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xfd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x45, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0xf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xc0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xf4, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xf5, 0xff, 0xff, 0x40, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0x5f, 0xff, 0xf4, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x3, 0x3f, 0xff, 0xf5, 0xff, + 0xff, 0x40, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xef, 0xff, 0x5f, 0xff, 0xf4, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xe, + 0xff, 0xf5, 0xff, 0xff, 0x40, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xef, 0xff, 0x5f, + 0xff, 0xf4, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0x8f, 0xff, 0xf5, 0xff, 0xff, 0x40, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x5, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x80, 0xf, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xf7, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, + 0xff, 0xfc, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0x0, + + /* U+F241 "ï‰" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0xf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xc0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xf4, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf5, 0xff, 0xff, 0x40, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x5f, 0xff, 0xf4, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x3, 0x3f, 0xff, 0xf5, 0xff, + 0xff, 0x40, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x5f, 0xff, 0xf4, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf5, 0xff, 0xff, 0x40, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x5f, + 0xff, 0xf4, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x8, 0x8f, 0xff, 0xf5, 0xff, 0xff, 0x40, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x6, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xf7, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, + 0xff, 0xfc, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0x0, + + /* U+F242 "" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0xf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xc0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xf4, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf5, 0xff, 0xff, 0x40, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x5f, 0xff, 0xf4, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x3f, 0xff, 0xf5, 0xff, + 0xff, 0x40, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x5f, 0xff, 0xf4, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf5, 0xff, 0xff, 0x40, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x5f, + 0xff, 0xf4, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x8f, 0xff, 0xf5, 0xff, 0xff, 0x40, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x6, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xf7, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, + 0xff, 0xfc, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0x0, + + /* U+F243 "" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0xf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xc0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xf4, 0x9, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf5, 0xff, 0xff, 0x40, 0x9f, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x5f, 0xff, 0xf4, 0x9, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x3f, 0xff, 0xf5, 0xff, + 0xff, 0x40, 0x9f, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x5f, 0xff, 0xf4, 0x9, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf5, 0xff, 0xff, 0x40, 0x9f, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x5f, + 0xff, 0xf4, 0x9, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x8f, 0xff, 0xf5, 0xff, 0xff, 0x40, + 0x9f, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x4, 0x88, 0x88, + 0x88, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xf7, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, + 0xff, 0xfc, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0x0, + + /* U+F244 "" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0xf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xc0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf5, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x3f, 0xff, 0xf5, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x5f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf5, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x5f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x8f, 0xff, 0xf5, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xf7, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, + 0xff, 0xfc, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xcc, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x57, 0x7a, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xef, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf6, 0x0, 0x2f, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfa, 0x0, 0x0, 0x4e, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x10, + 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x86, 0x20, + 0x0, 0x0, 0x0, 0xef, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6c, 0x30, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0x90, 0x0, 0xe, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x91, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x1b, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xe6, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xcf, 0xff, 0xff, + 0xff, 0xf7, 0x55, 0x55, 0x55, 0x8f, 0xfe, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5b, 0xff, + 0xff, 0xc3, 0x5, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x50, 0x0, + 0x9, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xf8, 0x0, 0x0, 0x0, 0x4, 0xbd, + 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf2, 0x0, 0xd, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xc0, 0x0, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc9, + 0x9f, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xac, 0xcf, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x26, 0xab, 0xcd, 0xcb, + 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0x12, 0xef, 0xff, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x2e, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x80, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xd0, 0xf, 0xff, 0xff, + 0xec, 0xff, 0xff, 0x10, 0x39, 0x0, 0x5f, 0xff, + 0xff, 0xf1, 0x4f, 0xff, 0xfe, 0x20, 0xbf, 0xff, + 0x10, 0x3f, 0xa0, 0x5, 0xff, 0xff, 0xf4, 0x7f, + 0xff, 0xfb, 0x0, 0xb, 0xff, 0x10, 0x3f, 0xf6, + 0x0, 0xaf, 0xff, 0xf7, 0x9f, 0xff, 0xff, 0xa0, + 0x0, 0xbf, 0x10, 0x3f, 0xa0, 0x5, 0xff, 0xff, + 0xf9, 0xbf, 0xff, 0xff, 0xfa, 0x0, 0xb, 0x10, + 0x2a, 0x0, 0x3f, 0xff, 0xff, 0xfa, 0xcf, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xfc, 0xdf, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xfc, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfc, 0xdf, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xfc, 0xcf, 0xff, 0xff, 0xff, + 0x60, 0x1, 0x0, 0x11, 0x0, 0xbf, 0xff, 0xff, + 0xfb, 0xaf, 0xff, 0xff, 0xf6, 0x0, 0x1d, 0x10, + 0x3d, 0x10, 0xb, 0xff, 0xff, 0xfa, 0x8f, 0xff, + 0xff, 0x60, 0x1, 0xdf, 0x10, 0x3f, 0xc1, 0x0, + 0xcf, 0xff, 0xf8, 0x6f, 0xff, 0xfa, 0x0, 0x2d, + 0xff, 0x10, 0x3f, 0xf4, 0x0, 0x7f, 0xff, 0xf6, + 0x3f, 0xff, 0xff, 0x52, 0xef, 0xff, 0x20, 0x3f, + 0x50, 0x6, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0x20, 0x35, 0x0, 0x6f, 0xff, + 0xff, 0xf0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x7, 0xff, 0xff, 0xff, 0xb0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0x60, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x7, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x7f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0x38, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8b, 0xef, 0xff, 0xff, 0xeb, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "ï‹­" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0x88, 0x88, + 0x88, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x36, 0x66, + 0x66, 0x66, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb6, 0x66, 0x66, 0x66, 0x61, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x9d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xfa, 0xa, + 0xff, 0xfe, 0x14, 0xff, 0xff, 0x61, 0xdf, 0xff, + 0xfa, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, + 0xfd, 0x1, 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, + 0x0, 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, + 0x1, 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, + 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, + 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, + 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, + 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, + 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, + 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, + 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xf7, + 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, 0x30, 0xbf, + 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x7, + 0xff, 0xfd, 0x1, 0xff, 0xff, 0x30, 0xbf, 0xff, + 0xfa, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, + 0xfd, 0x1, 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, + 0x0, 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, + 0x1, 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, + 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, + 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, + 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, + 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, + 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, + 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, + 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xf7, + 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, 0x30, 0xbf, + 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xfa, 0xa, + 0xff, 0xfe, 0x14, 0xff, 0xff, 0x61, 0xdf, 0xff, + 0xfa, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x13, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x30, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6a, 0x93, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x40, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x60, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x60, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0x60, 0xa, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0x60, 0xa, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0xa, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0xa, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xfd, 0xb9, 0x73, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x74, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x4, 0xff, 0xff, 0xff, 0xf4, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x4, + 0xff, 0xf4, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x4, 0xf4, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x1, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x8, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xb, 0xfb, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xb, 0xff, + 0xfb, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0xb, 0xff, 0xff, 0xfb, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x5b, 0xff, 0xff, 0xff, 0xfb, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xcf, 0xf9, + 0x44, 0x7f, 0xf4, 0x45, 0xff, 0x54, 0x4f, 0xff, + 0xf5, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x3f, 0xe0, + 0x1, 0xff, 0x10, 0xe, 0xff, 0xf5, 0x0, 0xcf, + 0xff, 0xf7, 0x0, 0x3f, 0xe0, 0x1, 0xff, 0x10, + 0xe, 0xff, 0xf5, 0xc, 0xff, 0xff, 0xf7, 0x0, + 0x3f, 0xe0, 0x1, 0xff, 0x10, 0xe, 0xff, 0xf5, + 0xcf, 0xff, 0xff, 0xf7, 0x0, 0x3f, 0xe0, 0x1, + 0xff, 0x10, 0xe, 0xff, 0xf5, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x3f, 0xe0, 0x1, 0xff, 0x10, 0xe, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf8, 0x22, 0x4f, + 0xe2, 0x22, 0xff, 0x22, 0x2e, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x2, 0x34, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x43, 0x0, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x3e, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x5f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0x20, 0x0, 0x7f, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf2, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xd4, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x6f, 0xff, 0xff, + 0x20, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x2c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1a, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 146, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 146, .box_w = 5, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 60, .adv_w = 213, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 14}, + {.bitmap_index = 110, .adv_w = 382, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 386, .adv_w = 338, .box_w = 19, .box_h = 32, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 690, .adv_w = 459, .box_w = 27, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1014, .adv_w = 373, .box_w = 22, .box_h = 25, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1289, .adv_w = 114, .box_w = 3, .box_h = 10, .ofs_x = 2, .ofs_y = 14}, + {.bitmap_index = 1304, .adv_w = 183, .box_w = 8, .box_h = 32, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 1432, .adv_w = 184, .box_w = 8, .box_h = 32, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 1560, .adv_w = 218, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 12}, + {.bitmap_index = 1645, .adv_w = 317, .box_w = 16, .box_h = 15, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 1765, .adv_w = 123, .box_w = 6, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 1795, .adv_w = 208, .box_w = 11, .box_h = 3, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 1812, .adv_w = 123, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1827, .adv_w = 191, .box_w = 15, .box_h = 32, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 2067, .adv_w = 363, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2319, .adv_w = 201, .box_w = 10, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2439, .adv_w = 312, .box_w = 19, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2667, .adv_w = 311, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2883, .adv_w = 364, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3147, .adv_w = 312, .box_w = 19, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3375, .adv_w = 336, .box_w = 20, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3615, .adv_w = 325, .box_w = 18, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3831, .adv_w = 350, .box_w = 20, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4071, .adv_w = 336, .box_w = 20, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4311, .adv_w = 123, .box_w = 6, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4365, .adv_w = 123, .box_w = 6, .box_h = 23, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 4434, .adv_w = 317, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 4562, .adv_w = 317, .box_w = 16, .box_h = 11, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 4650, .adv_w = 317, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 4778, .adv_w = 312, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4994, .adv_w = 562, .box_w = 33, .box_h = 31, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 5506, .adv_w = 398, .box_w = 26, .box_h = 24, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5818, .adv_w = 412, .box_w = 22, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6082, .adv_w = 393, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6358, .adv_w = 449, .box_w = 24, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6646, .adv_w = 364, .box_w = 18, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6862, .adv_w = 345, .box_w = 18, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7078, .adv_w = 420, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7354, .adv_w = 442, .box_w = 22, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7618, .adv_w = 169, .box_w = 4, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7666, .adv_w = 279, .box_w = 16, .box_h = 24, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7858, .adv_w = 391, .box_w = 22, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8122, .adv_w = 323, .box_w = 17, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8326, .adv_w = 520, .box_w = 26, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8638, .adv_w = 442, .box_w = 22, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8902, .adv_w = 457, .box_w = 26, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9214, .adv_w = 393, .box_w = 20, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9454, .adv_w = 457, .box_w = 28, .box_h = 29, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9860, .adv_w = 395, .box_w = 21, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10112, .adv_w = 338, .box_w = 19, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10340, .adv_w = 319, .box_w = 20, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10580, .adv_w = 430, .box_w = 21, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10832, .adv_w = 387, .box_w = 26, .box_h = 24, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 11144, .adv_w = 613, .box_w = 37, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11588, .adv_w = 366, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11864, .adv_w = 352, .box_w = 24, .box_h = 24, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 12152, .adv_w = 357, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12404, .adv_w = 181, .box_w = 8, .box_h = 32, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 12532, .adv_w = 191, .box_w = 15, .box_h = 32, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 12772, .adv_w = 181, .box_w = 8, .box_h = 32, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 12900, .adv_w = 317, .box_w = 16, .box_h = 14, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 13012, .adv_w = 272, .box_w = 17, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13038, .adv_w = 326, .box_w = 10, .box_h = 5, .ofs_x = 3, .ofs_y = 20}, + {.bitmap_index = 13063, .adv_w = 325, .box_w = 17, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13216, .adv_w = 371, .box_w = 19, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 13454, .adv_w = 311, .box_w = 18, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13616, .adv_w = 371, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13866, .adv_w = 333, .box_w = 19, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 14037, .adv_w = 192, .box_w = 14, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14212, .adv_w = 375, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 14462, .adv_w = 370, .box_w = 18, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 14687, .adv_w = 152, .box_w = 5, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14752, .adv_w = 154, .box_w = 12, .box_h = 33, .ofs_x = -4, .ofs_y = -7}, + {.bitmap_index = 14950, .adv_w = 335, .box_w = 18, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 15175, .adv_w = 152, .box_w = 4, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 15225, .adv_w = 575, .box_w = 31, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 15504, .adv_w = 370, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 15666, .adv_w = 345, .box_w = 20, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 15846, .adv_w = 371, .box_w = 19, .box_h = 25, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 16084, .adv_w = 371, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 16334, .adv_w = 223, .box_w = 10, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 16424, .adv_w = 273, .box_w = 17, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16577, .adv_w = 225, .box_w = 14, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16731, .adv_w = 368, .box_w = 18, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 16893, .adv_w = 304, .box_w = 21, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 17082, .adv_w = 489, .box_w = 31, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17361, .adv_w = 300, .box_w = 19, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17532, .adv_w = 304, .box_w = 21, .box_h = 25, .ofs_x = -1, .ofs_y = -7}, + {.bitmap_index = 17795, .adv_w = 283, .box_w = 16, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 17939, .adv_w = 191, .box_w = 11, .box_h = 32, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 18115, .adv_w = 163, .box_w = 4, .box_h = 32, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 18179, .adv_w = 191, .box_w = 10, .box_h = 32, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 18339, .adv_w = 317, .box_w = 17, .box_h = 6, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 18390, .adv_w = 228, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 13}, + {.bitmap_index = 18456, .adv_w = 171, .box_w = 7, .box_h = 7, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 18481, .adv_w = 544, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 19111, .adv_w = 544, .box_w = 34, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19553, .adv_w = 544, .box_w = 34, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 20080, .adv_w = 544, .box_w = 34, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20522, .adv_w = 374, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 20810, .adv_w = 544, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 21388, .adv_w = 544, .box_w = 32, .box_h = 35, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 21948, .adv_w = 612, .box_w = 39, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 22553, .adv_w = 544, .box_w = 34, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 23148, .adv_w = 612, .box_w = 39, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23655, .adv_w = 544, .box_w = 34, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 24250, .adv_w = 272, .box_w = 17, .box_h = 27, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 24480, .adv_w = 408, .box_w = 26, .box_h = 27, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 24831, .adv_w = 612, .box_w = 39, .box_h = 33, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 25475, .adv_w = 544, .box_w = 34, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 25917, .adv_w = 374, .box_w = 24, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 26337, .adv_w = 476, .box_w = 22, .box_h = 32, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 26689, .adv_w = 476, .box_w = 30, .box_h = 36, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 27229, .adv_w = 476, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 27694, .adv_w = 476, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 28159, .adv_w = 476, .box_w = 22, .box_h = 32, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 28511, .adv_w = 476, .box_w = 32, .box_h = 31, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 29007, .adv_w = 340, .box_w = 19, .box_h = 30, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 29292, .adv_w = 340, .box_w = 19, .box_h = 30, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 29577, .adv_w = 476, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 30042, .adv_w = 476, .box_w = 30, .box_h = 7, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 30147, .adv_w = 612, .box_w = 39, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 30654, .adv_w = 680, .box_w = 43, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 31407, .adv_w = 612, .box_w = 40, .box_h = 35, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 32107, .adv_w = 544, .box_w = 34, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 32634, .adv_w = 476, .box_w = 30, .box_h = 19, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 32919, .adv_w = 476, .box_w = 30, .box_h = 19, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 33204, .adv_w = 680, .box_w = 44, .box_h = 27, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 33798, .adv_w = 544, .box_w = 34, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 34240, .adv_w = 544, .box_w = 34, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 34835, .adv_w = 544, .box_w = 35, .box_h = 36, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 35465, .adv_w = 476, .box_w = 31, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 35946, .adv_w = 476, .box_w = 30, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 36471, .adv_w = 476, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 36936, .adv_w = 476, .box_w = 30, .box_h = 27, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37341, .adv_w = 544, .box_w = 34, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 37783, .adv_w = 340, .box_w = 23, .box_h = 35, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 38186, .adv_w = 476, .box_w = 30, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 38711, .adv_w = 476, .box_w = 30, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 39236, .adv_w = 612, .box_w = 39, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 39743, .adv_w = 544, .box_w = 36, .box_h = 36, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 40391, .adv_w = 408, .box_w = 26, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 40846, .adv_w = 680, .box_w = 43, .box_h = 32, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 41534, .adv_w = 680, .box_w = 43, .box_h = 22, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 42007, .adv_w = 680, .box_w = 43, .box_h = 22, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 42480, .adv_w = 680, .box_w = 43, .box_h = 22, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 42953, .adv_w = 680, .box_w = 43, .box_h = 22, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 43426, .adv_w = 680, .box_w = 43, .box_h = 22, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 43899, .adv_w = 680, .box_w = 43, .box_h = 27, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 44480, .adv_w = 476, .box_w = 26, .box_h = 35, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 44935, .adv_w = 476, .box_w = 30, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 45460, .adv_w = 544, .box_w = 35, .box_h = 35, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 46073, .adv_w = 680, .box_w = 43, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 46632, .adv_w = 408, .box_w = 26, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 47087, .adv_w = 547, .box_w = 35, .box_h = 22, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 5, 0, 0, 0, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 24, 0, 15, -12, 0, 0, + 0, 0, -30, -33, 4, 26, 12, 9, + -22, 4, 27, 2, 23, 5, 17, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 33, 4, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 11, 0, -16, 0, 0, 0, 0, + 0, -11, 9, 11, 0, 0, -5, 0, + -4, 5, 0, -5, 0, -5, -3, -11, + 0, 0, 0, 0, -5, 0, 0, -7, + -8, 0, 0, -5, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + -5, 0, -8, 0, -15, 0, -66, 0, + 0, -11, 0, 11, 16, 1, 0, -11, + 5, 5, 18, 11, -9, 11, 0, 0, + -31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -20, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -15, -7, -27, 0, -22, + -4, 0, 0, 0, 0, 1, 21, 0, + -16, -4, -2, 2, 0, -9, 0, 0, + -4, -40, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -44, -4, 21, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -22, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 18, + 0, 5, 0, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 21, 4, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -20, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 11, 5, 16, -5, 0, 0, 11, -5, + -18, -75, 4, 15, 11, 1, -7, 0, + 20, 0, 17, 0, 17, 0, -51, 0, + -7, 16, 0, 18, -5, 11, 5, 0, + 0, 2, -5, 0, 0, -9, 44, 0, + 44, 0, 16, 0, 23, 7, 9, 16, + 0, 0, 0, -20, 0, 0, 0, 0, + 2, -4, 0, 4, -10, -7, -11, 4, + 0, -5, 0, 0, 0, -22, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -35, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -30, 0, -34, 0, 0, 0, + 0, -4, 0, 54, -7, -7, 5, 5, + -5, 0, -7, 5, 0, 0, -29, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -53, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -34, 0, 33, 0, 0, -20, 0, + 18, 0, -37, -53, -37, -11, 16, 0, + 0, -36, 0, 7, -13, 0, -8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 14, 16, -66, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 26, 0, 4, 0, 0, 0, + 0, 0, 4, 4, -7, -11, 0, -2, + -2, -5, 0, 0, -4, 0, 0, 0, + -11, 0, -4, 0, -13, -11, 0, -14, + -18, -18, -10, 0, -11, 0, -11, 0, + 0, 0, 0, -4, 0, 0, 5, 0, + 4, -5, 0, 2, 0, 0, 0, 5, + -4, 0, 0, 0, -4, 5, 5, -2, + 0, 0, 0, -10, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 7, -4, 0, + -7, 0, -9, 0, 0, -4, 0, 16, + 0, 0, -5, 0, 0, 0, 0, 0, + -2, 2, -4, -4, 0, 0, -5, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, 0, -5, -7, 0, + 0, 0, 0, 0, 2, 0, 0, -4, + 0, -5, -5, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, -4, -7, 0, -8, 0, -16, + -4, -16, 11, 0, 0, -11, 5, 11, + 15, 0, -14, -2, -7, 0, -2, -26, + 5, -4, 4, -29, 5, 0, 0, 2, + -28, 0, -29, -4, -47, -4, 0, -27, + 0, 11, 15, 0, 7, 0, 0, 0, + 0, 1, 0, -10, -7, 0, -16, 0, + 0, 0, -5, 0, 0, 0, -5, 0, + 0, 0, 0, 0, -3, -3, 0, -3, + -7, 0, 0, 0, 0, 0, 0, 0, + -5, -5, 0, -4, -7, -4, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -7, + 0, -4, 0, -11, 5, 0, 0, -7, + 3, 5, 5, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 4, + 0, 0, -5, 0, -5, -4, -7, 0, + 0, 0, 0, 0, 0, 0, 4, 0, + -4, 0, 0, 0, 0, -6, -8, 0, + -10, 0, 16, -4, 2, -17, 0, 0, + 15, -27, -28, -23, -11, 5, 0, -4, + -35, -10, 0, -10, 0, -11, 8, -10, + -35, 0, -15, 0, 0, 3, -2, 4, + -4, 0, 5, 1, -16, -21, 0, -27, + -13, -11, -13, -16, -7, -15, -1, -10, + -15, 3, 0, 2, 0, -5, 0, 0, + 0, 4, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, -3, 0, -2, -5, 0, -9, -12, + -12, -2, 0, -16, 0, 0, 0, 0, + 0, 0, -4, 0, 0, 0, 0, 2, + -3, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 26, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + -10, 0, 0, 0, 0, -27, -16, 0, + 0, 0, -8, -27, 0, 0, -5, 5, + 0, -15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, -10, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, -10, 0, + 0, 0, 0, 7, 0, 4, -11, -11, + 0, -5, -5, -7, 0, 0, 0, 0, + 0, 0, -16, 0, -5, 0, -8, -5, + 0, -12, -14, -16, -4, 0, -11, 0, + -16, 0, 0, 0, 0, 44, 0, 0, + 3, 0, 0, -7, 0, 5, 0, -23, + 0, 0, 0, 0, 0, -51, -10, 18, + 16, -4, -23, 0, 5, -8, 0, -27, + -3, -7, 5, -38, -5, 7, 0, 8, + -19, -8, -20, -18, -23, 0, 0, -33, + 0, 31, 0, 0, -3, 0, 0, 0, + -3, -3, -5, -15, -18, -1, -51, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, -3, -5, -8, 0, 0, + -11, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -11, 0, 0, 11, + -2, 7, 0, -12, 5, -4, -2, -14, + -5, 0, -7, -5, -4, 0, -8, -9, + 0, 0, -4, -2, -4, -9, -7, 0, + 0, -5, 0, 5, -4, 0, -12, 0, + 0, 0, -11, 0, -9, 0, -9, -9, + 5, 0, 0, 0, 0, 0, 0, 0, + 0, -11, 5, 0, -8, 0, -4, -7, + -17, -4, -4, -4, -2, -4, -7, -2, + 0, 0, 0, 0, 0, -5, -4, -4, + 0, 0, 0, 0, 7, -4, 0, -4, + 0, 0, 0, -4, -7, -4, -5, -7, + -5, 0, 4, 22, -2, 0, -15, 0, + -4, 11, 0, -5, -23, -7, 8, 1, + 0, -26, -9, 5, -9, 4, 0, -4, + -4, -17, 0, -8, 3, 0, 0, -9, + 0, 0, 0, 5, 5, -11, -10, 0, + -9, -5, -8, -5, -5, 0, -9, 3, + -10, -9, 16, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, -7, + 0, 0, -5, -5, 0, 0, 0, 0, + -5, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + -8, 0, -11, 0, 0, 0, -18, 0, + 4, -12, 11, 1, -4, -26, 0, 0, + -12, -5, 0, -22, -14, -15, 0, 0, + -23, -5, -22, -21, -26, 0, -14, 0, + 4, 36, -7, 0, -13, -5, -2, -5, + -9, -15, -10, -20, -22, -13, -5, 0, + 0, -4, 0, 2, 0, 0, -38, -5, + 16, 12, -12, -20, 0, 2, -17, 0, + -27, -4, -5, 11, -50, -7, 2, 0, + 0, -35, -7, -28, -5, -40, 0, 0, + -38, 0, 32, 2, 0, -4, 0, 0, + 0, 0, -3, -4, -21, -4, 0, -35, + 0, 0, 0, 0, -17, 0, -5, 0, + -2, -15, -26, 0, 0, -3, -8, -16, + -5, 0, -4, 0, 0, 0, 0, -24, + -5, -18, -17, -4, -9, -14, -5, -9, + 0, -11, -5, -18, -8, 0, -7, -10, + -5, -10, 0, 3, 0, -4, -18, 0, + 11, 0, -10, 0, 0, 0, 0, 7, + 0, 4, -11, 22, 0, -5, -5, -7, + 0, 0, 0, 0, 0, 0, -16, 0, + -5, 0, -8, -5, 0, -12, -14, -16, + -4, 0, -11, 4, 22, 0, 0, 0, + 0, 44, 0, 0, 3, 0, 0, -7, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -4, -11, 0, 0, 0, 0, 0, -3, + 0, 0, 0, -5, -5, 0, 0, -11, + -5, 0, 0, -11, 0, 9, -3, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 8, 11, 4, -5, 0, -17, + -9, 0, 16, -18, -17, -11, -11, 22, + 10, 5, -47, -4, 11, -5, 0, -5, + 6, -5, -19, 0, -5, 5, -7, -4, + -16, -4, 0, 0, 16, 11, 0, -15, + 0, -30, -7, 16, -7, -21, 2, -7, + -18, -18, -5, 22, 5, 0, -8, 0, + -15, 0, 4, 18, -13, -20, -22, -14, + 16, 0, 2, -40, -4, 5, -9, -4, + -13, 0, -12, -20, -8, -8, -4, 0, + 0, -13, -11, -5, 0, 16, 13, -5, + -30, 0, -30, -8, 0, -19, -32, -2, + -17, -9, -18, -15, 15, 0, 0, -7, + 0, -11, -5, 0, -5, -10, 0, 9, + -18, 5, 0, 0, -29, 0, -5, -12, + -9, -4, -16, -14, -18, -13, 0, -16, + -5, -13, -10, -16, -5, 0, 0, 2, + 26, -9, 0, -16, -5, 0, -5, -11, + -13, -15, -15, -21, -7, -11, 11, 0, + -8, 0, -27, -7, 3, 11, -17, -20, + -11, -18, 18, -5, 3, -51, -10, 11, + -12, -9, -20, 0, -16, -23, -7, -5, + -4, -5, -11, -16, -2, 0, 0, 16, + 15, -4, -35, 0, -33, -13, 13, -21, + -37, -11, -19, -23, -27, -18, 11, 0, + 0, 0, 0, -7, 0, 0, 5, -7, + 11, 4, -10, 11, 0, 0, -17, -2, + 0, -2, 0, 2, 2, -4, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 4, 16, 1, 0, -7, 0, 0, + 0, 0, -4, -4, -7, 0, 0, 0, + 2, 4, 0, 0, 0, 0, 4, 0, + -4, 0, 21, 0, 10, 2, 2, -7, + 0, 11, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 16, 0, 15, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -33, 0, -5, 9, 0, 16, + 0, 0, 54, 7, -11, -11, 5, 5, + -4, 2, -27, 0, 0, 26, -33, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -37, 21, 76, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -33, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, -10, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, -15, 0, + 0, 2, 0, 0, 5, 70, -11, -4, + 17, 15, -15, 5, 0, 0, 5, 5, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -71, 15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -15, + 0, 0, 0, -15, 0, 0, 0, 0, + -12, -3, 0, 0, 0, -12, 0, -7, + 0, -26, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -36, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -5, 0, 0, -10, 0, -8, 0, + -15, 0, 0, 0, -9, 5, -7, 0, + 0, -15, -5, -13, 0, 0, -15, 0, + -5, 0, -26, 0, -6, 0, 0, -44, + -10, -22, -6, -20, 0, 0, -36, 0, + -15, -3, 0, 0, 0, 0, 0, 0, + 0, 0, -8, -10, -4, -9, 0, 0, + 0, 0, -12, 0, -12, 7, -6, 11, + 0, -4, -13, -4, -9, -10, 0, -7, + -3, -4, 4, -15, -2, 0, 0, 0, + -48, -4, -8, 0, -12, 0, -4, -26, + -5, 0, 0, -4, -4, 0, 0, 0, + 0, 4, 0, -4, -9, -4, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 0, 0, 0, 0, 0, + 0, -12, 0, -4, 0, 0, 0, -11, + 5, 0, 0, 0, -15, -5, -11, 0, + 0, -15, 0, -5, 0, -26, 0, 0, + 0, 0, -53, 0, -11, -20, -27, 0, + 0, -36, 0, -4, -8, 0, 0, 0, + 0, 0, 0, 0, 0, -5, -8, -3, + -8, 2, 0, 0, 9, -7, 0, 17, + 27, -5, -5, -16, 7, 27, 9, 12, + -15, 7, 23, 7, 16, 12, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 26, -10, -5, 0, -4, + 44, 23, 44, 0, 0, 0, 5, 0, + 0, 20, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 8, + 0, 0, 0, 0, -46, -7, -4, -22, + -27, 0, 0, -36, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, -46, -7, -4, + -22, -27, 0, 0, -22, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, -13, 5, 0, -5, + 4, 10, 5, -16, 0, -1, -4, 5, + 0, 4, 0, 0, 0, 0, -14, 0, + -5, -4, -11, 0, -5, -22, 0, 34, + -5, 0, -12, -4, 0, -4, -9, 0, + -5, -15, -11, -7, 0, 0, 0, -9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 0, 0, 0, -46, + -7, -4, -22, -27, 0, 0, -36, 0, + 0, 0, 0, 0, 0, 27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -9, 0, -17, -7, -5, 16, -5, -5, + -22, 2, -3, 2, -4, -15, 1, 12, + 1, 4, 2, 4, -13, -22, -7, 0, + -21, -10, -15, -23, -21, 0, -9, -11, + -7, -7, -4, -4, -7, -4, 0, -4, + -2, 8, 0, 8, -4, 0, 17, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, -5, -5, 0, 0, + -15, 0, -3, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -33, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, -7, + 0, 0, 0, 0, -4, 0, 0, -9, + -5, 5, 0, -9, -10, -4, 0, -16, + -4, -12, -4, -7, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -36, 0, 17, 0, 0, -10, 0, + 0, 0, 0, -7, 0, -5, 0, 0, + -3, 0, 0, -4, 0, -13, 0, 0, + 23, -7, -18, -17, 4, 6, 6, -1, + -15, 4, 8, 4, 16, 4, 18, -4, + -15, 0, 0, -22, 0, 0, -16, -15, + 0, 0, -11, 0, -7, -9, 0, -8, + 0, -8, 0, -4, 8, 0, -4, -16, + -5, 20, 0, 0, -5, 0, -11, 0, + 0, 7, -13, 0, 5, -5, 4, 1, + 0, -18, 0, -4, -2, 0, -5, 6, + -4, 0, 0, 0, -22, -7, -12, 0, + -16, 0, 0, -26, 0, 20, -5, 0, + -10, 0, 3, 0, -5, 0, -5, -16, + 0, -5, 5, 0, 0, 0, 0, -4, + 0, 0, 5, -7, 2, 0, 0, -7, + -4, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -34, 0, 12, 0, + 0, -4, 0, 0, 0, 0, 1, 0, + -5, -5, 0, 0, 0, 11, 0, 13, + 0, 0, 0, 0, 0, -34, -31, 2, + 23, 16, 9, -22, 4, 23, 0, 20, + 0, 11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserrat_34 = { +#else +lv_font_t lv_font_montserrat_34 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 38, /*The maximum line height required by the font*/ + .base_line = 7, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -3, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_34*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_36.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_36.c new file mode 100644 index 0000000..e5b2b68 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_36.c @@ -0,0 +1,7664 @@ +/******************************************************************************* + * Size: 36 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 36 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_36.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_36 + #define LV_FONT_MONTSERRAT_36 1 +#endif + +#if LV_FONT_MONTSERRAT_36 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x1f, 0xff, + 0xc0, 0xf, 0xff, 0xb0, 0xf, 0xff, 0xb0, 0xf, + 0xff, 0xa0, 0xf, 0xff, 0x90, 0xe, 0xff, 0x90, + 0xd, 0xff, 0x80, 0xd, 0xff, 0x70, 0xc, 0xff, + 0x70, 0xc, 0xff, 0x60, 0xb, 0xff, 0x50, 0xa, + 0xff, 0x50, 0xa, 0xff, 0x40, 0x9, 0xff, 0x30, + 0x9, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x76, 0x0, 0x2f, + 0xff, 0xc0, 0x7f, 0xff, 0xf1, 0x5f, 0xff, 0xf0, + 0x8, 0xed, 0x40, + + /* U+0022 "\"" */ + 0xbf, 0xf4, 0x0, 0x3f, 0xfc, 0xbf, 0xf4, 0x0, + 0x3f, 0xfc, 0xaf, 0xf3, 0x0, 0x2f, 0xfb, 0xaf, + 0xf3, 0x0, 0x2f, 0xfb, 0xaf, 0xf2, 0x0, 0x1f, + 0xfb, 0x9f, 0xf2, 0x0, 0x1f, 0xfa, 0x9f, 0xf2, + 0x0, 0x1f, 0xfa, 0x9f, 0xf1, 0x0, 0xf, 0xf9, + 0x8f, 0xf1, 0x0, 0xf, 0xf9, 0x49, 0x90, 0x0, + 0x9, 0x95, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xc0, 0x0, 0x0, + 0x7, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xfa, 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, 0x0, + 0x0, 0xb, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xf6, 0x0, 0x0, 0x0, 0xdf, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x30, + 0x0, 0x0, 0xf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x1, 0xff, + 0x70, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x89, 0x99, 0x9f, + 0xfe, 0x99, 0x99, 0x99, 0xdf, 0xf9, 0x99, 0x99, + 0x30, 0x0, 0x0, 0x0, 0xff, 0x90, 0x0, 0x0, + 0x9, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf7, 0x0, 0x0, 0x0, 0xbf, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, + 0x0, 0xd, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf3, 0x0, 0x0, 0x0, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, + 0x0, 0x0, 0x1f, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x3, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfd, + 0x0, 0x0, 0x0, 0x5f, 0xf3, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x9, 0x99, 0x9a, 0xff, 0xc9, 0x99, 0x99, + 0x9e, 0xfe, 0x99, 0x99, 0x91, 0x0, 0x0, 0x0, + 0x2f, 0xf6, 0x0, 0x0, 0x0, 0xdf, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, + 0x0, 0xf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xf2, 0x0, 0x0, 0x0, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, + 0x0, 0x0, 0x2f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x4, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfc, + 0x0, 0x0, 0x0, 0x6f, 0xf1, 0x0, 0x0, 0x0, + 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0x84, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x8c, 0xef, 0xff, + 0xed, 0xa6, 0x10, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0xdf, 0xff, 0xc6, 0x2c, 0xf9, 0x24, 0x8d, + 0xff, 0x40, 0x6, 0xff, 0xf9, 0x0, 0xc, 0xf8, + 0x0, 0x0, 0x4a, 0x0, 0xb, 0xff, 0xe0, 0x0, + 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xa0, 0x0, 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xb0, 0x0, 0xc, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0xc, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x60, + 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xfe, 0xae, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, 0x95, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xbf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xfc, 0xcf, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, 0x2, 0x9f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, + 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xf8, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, 0xaf, 0xfd, + 0x4, 0x30, 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, + 0xef, 0xfb, 0xc, 0xf9, 0x10, 0x0, 0xc, 0xf8, + 0x0, 0x9, 0xff, 0xf6, 0x4f, 0xff, 0xfa, 0x62, + 0x1c, 0xf8, 0x15, 0xcf, 0xff, 0xd0, 0x1b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0x0, 0x37, 0xbd, 0xff, 0xff, + 0xec, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, + 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x5, 0xbe, 0xfd, 0x81, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xfc, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x20, 0x0, 0x0, 0x8, 0xff, 0x71, + 0x4, 0xdf, 0xd0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x60, 0x0, 0x0, 0x1, 0xff, 0x80, 0x0, 0x1, + 0xff, 0x70, 0x0, 0x0, 0x1, 0xef, 0xb0, 0x0, + 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x0, 0x9, 0xfc, + 0x0, 0x0, 0x0, 0xbf, 0xf1, 0x0, 0x0, 0x0, + 0x9, 0xfc, 0x0, 0x0, 0x0, 0x6f, 0xf0, 0x0, + 0x0, 0x6f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xb0, 0x0, 0x0, 0x4, 0xff, 0x0, 0x0, 0x2f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, + 0x0, 0x0, 0x6f, 0xf0, 0x0, 0xc, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x0, + 0x9, 0xfc, 0x0, 0x7, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0x70, 0x0, 0x1, 0xff, + 0x70, 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x71, 0x4, 0xdf, 0xe0, 0x0, + 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x8f, 0xf4, + 0x0, 0x5c, 0xef, 0xd7, 0x0, 0x0, 0x0, 0x6, + 0xcf, 0xfe, 0x91, 0x0, 0x3f, 0xf8, 0x0, 0xaf, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xfd, 0x0, 0x7f, 0xf8, 0x11, + 0x5e, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x30, 0xf, 0xf7, 0x0, 0x0, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x70, 0x5, 0xff, 0x0, 0x0, 0x0, 0xcf, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xc0, 0x0, + 0x9f, 0xc0, 0x0, 0x0, 0x8, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf2, 0x0, 0xa, 0xfa, + 0x0, 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf6, 0x0, 0x0, 0xaf, 0xa0, 0x0, + 0x0, 0x5, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xfb, 0x0, 0x0, 0x9, 0xfb, 0x0, 0x0, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0xb, 0xfe, 0x10, + 0x0, 0x0, 0x5f, 0xe0, 0x0, 0x0, 0xb, 0xfa, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xff, 0x50, 0x0, 0x2, 0xff, 0x50, 0x0, + 0x0, 0x2, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x40, 0x2, 0xdf, 0xc0, 0x0, 0x0, 0x0, + 0xcf, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xed, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x7f, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xfd, + 0x70, 0x0, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x18, 0xce, 0xfe, 0xc7, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xea, 0x89, 0xef, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfb, + 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf2, 0x0, 0x0, 0x4, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, + 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x8, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, + 0x0, 0x0, 0x5f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x60, 0x9, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf8, 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf9, + 0x2b, 0xff, 0xf7, 0x0, 0x0, 0xb, 0x83, 0x0, + 0x0, 0xcf, 0xfe, 0x40, 0x0, 0xbf, 0xff, 0x80, + 0x0, 0x2f, 0xfc, 0x0, 0x8, 0xff, 0xf2, 0x0, + 0x0, 0xb, 0xff, 0xf8, 0x0, 0x7f, 0xf8, 0x0, + 0xf, 0xff, 0x60, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x90, 0xef, 0xf3, 0x0, 0x4f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfc, 0xff, 0xc0, 0x0, + 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, + 0x1f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xb0, 0x0, 0x8, 0xff, 0xfe, 0x61, + 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xed, 0xef, 0xff, 0xff, + 0xd2, 0x7f, 0xff, 0xc0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xe7, 0x0, 0x6, 0xff, 0x90, + 0x0, 0x0, 0x5, 0xad, 0xef, 0xed, 0xa5, 0x0, + 0x0, 0x0, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0xbf, 0xf4, 0xbf, 0xf4, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf2, 0x9f, 0xf2, 0x9f, 0xf2, 0x9f, 0xf1, + 0x8f, 0xf1, 0x49, 0x90, + + /* U+0028 "(" */ + 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x2, 0xff, 0xf2, + 0x0, 0xa, 0xff, 0xa0, 0x0, 0x2f, 0xff, 0x30, + 0x0, 0x8f, 0xfd, 0x0, 0x0, 0xef, 0xf7, 0x0, + 0x3, 0xff, 0xf2, 0x0, 0x7, 0xff, 0xe0, 0x0, + 0xb, 0xff, 0xa0, 0x0, 0xe, 0xff, 0x70, 0x0, + 0x1f, 0xff, 0x40, 0x0, 0x4f, 0xff, 0x20, 0x0, + 0x5f, 0xff, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x8f, 0xfe, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, + 0x9f, 0xfc, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, + 0x8f, 0xfe, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x5f, 0xff, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, + 0x1f, 0xff, 0x40, 0x0, 0xe, 0xff, 0x70, 0x0, + 0xb, 0xff, 0xa0, 0x0, 0x7, 0xff, 0xd0, 0x0, + 0x2, 0xff, 0xf2, 0x0, 0x0, 0xcf, 0xf7, 0x0, + 0x0, 0x7f, 0xfd, 0x0, 0x0, 0x1f, 0xff, 0x30, + 0x0, 0x9, 0xff, 0xa0, 0x0, 0x1, 0xff, 0xf2, + 0x0, 0x0, 0x8f, 0xfb, + + /* U+0029 ")" */ + 0x9f, 0xfb, 0x0, 0x0, 0x1f, 0xff, 0x40, 0x0, + 0x8, 0xff, 0xc0, 0x0, 0x1, 0xff, 0xf4, 0x0, + 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x5f, 0xff, 0x10, + 0x0, 0xf, 0xff, 0x50, 0x0, 0xc, 0xff, 0xa0, + 0x0, 0x8, 0xff, 0xd0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x1, 0xff, 0xf4, 0x0, 0x0, 0xff, 0xf6, + 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x0, 0xcf, 0xf9, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0xaf, 0xfb, + 0x0, 0x0, 0xaf, 0xfb, 0x0, 0x0, 0xaf, 0xfb, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0xcf, 0xf9, + 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x0, 0xff, 0xf6, + 0x0, 0x1, 0xff, 0xf4, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x8, 0xff, 0xd0, 0x0, 0xb, 0xff, 0xa0, + 0x0, 0xf, 0xff, 0x40, 0x0, 0x5f, 0xfe, 0x0, + 0x0, 0xbf, 0xf9, 0x0, 0x1, 0xff, 0xf4, 0x0, + 0x8, 0xff, 0xc0, 0x0, 0x1f, 0xff, 0x30, 0x0, + 0x9f, 0xfb, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x0, 0xdf, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x40, 0x0, 0x0, 0x4, 0x40, + 0x0, 0xdf, 0x40, 0x1, 0x70, 0xd, 0xfb, 0x20, + 0xdf, 0x40, 0x8f, 0xf4, 0x1b, 0xff, 0xf9, 0xef, + 0x9e, 0xff, 0xe4, 0x0, 0x4c, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, 0xc3, 0x0, + 0x7, 0xff, 0xfc, 0xef, 0xbf, 0xff, 0xb2, 0x1f, + 0xfe, 0x60, 0xdf, 0x42, 0xbf, 0xf6, 0x6, 0x80, + 0x0, 0xdf, 0x40, 0x4, 0xb0, 0x0, 0x0, 0x0, + 0xdf, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x10, + 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x8, 0x88, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x87, 0xdd, 0xdd, 0xdd, + 0xff, 0xfd, 0xdd, 0xdd, 0xd7, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + + /* U+002C "," */ + 0x4, 0xcd, 0x60, 0x1f, 0xff, 0xf3, 0x3f, 0xff, + 0xf7, 0x1f, 0xff, 0xf5, 0x3, 0xef, 0xf1, 0x0, + 0xff, 0xb0, 0x3, 0xff, 0x60, 0x7, 0xff, 0x0, + 0xb, 0xfb, 0x0, 0xf, 0xf5, 0x0, + + /* U+002D "-" */ + 0xef, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+002E "." */ + 0x3, 0xcc, 0x50, 0x1f, 0xff, 0xf3, 0x4f, 0xff, + 0xf7, 0x2f, 0xff, 0xf4, 0x5, 0xee, 0x70, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x87, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x6, 0xae, 0xff, 0xeb, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xb5, 0x33, 0x5a, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfc, 0x0, 0x3, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x30, 0x9, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x90, + 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xd0, 0xf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, 0x2f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf2, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf3, 0x4f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf3, 0x2f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf2, 0xf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, + 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xd0, 0x9, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x90, 0x3, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x30, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfc, 0x0, 0x0, 0x3f, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xf3, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xa5, 0x33, 0x5a, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xef, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xbe, 0xff, 0xeb, 0x60, + 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0xbf, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, 0xff, + 0xff, 0xf8, 0xbf, 0xff, 0xff, 0xff, 0xf8, 0x11, + 0x11, 0x11, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xff, 0xf8, + + /* U+0032 "2" */ + 0x0, 0x0, 0x5, 0xac, 0xef, 0xfe, 0xb7, 0x10, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x3f, 0xff, + 0xfe, 0x95, 0x32, 0x36, 0xbf, 0xff, 0xf6, 0x0, + 0x9, 0xff, 0x80, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xfe, 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe3, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x10, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, + + /* U+0033 "3" */ + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x12, 0xdf, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfc, 0x63, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x22, + 0x33, 0x6a, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xe0, 0x45, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, 0xe, 0xfa, + 0x20, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0x48, + 0xff, 0xff, 0xc8, 0x53, 0x23, 0x5a, 0xff, 0xff, + 0xb0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x48, 0xbd, + 0xef, 0xed, 0xa5, 0x10, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xe1, + 0x0, 0x0, 0x48, 0x87, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x8, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x8f, 0xfd, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, + 0x0, 0x2, 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xfd, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9, + 0xff, 0xc1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0, + 0x0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x31, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xc9, 0x40, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, + 0x7d, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf1, + 0x8, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xb0, 0x2f, 0xff, 0xfe, 0xa6, 0x42, 0x34, + 0x8e, 0xff, 0xff, 0x30, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x3b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x0, 0x16, 0xad, 0xef, 0xfd, 0xc8, 0x30, + 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, 0xeb, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x94, 0x21, 0x13, 0x6b, + 0xd0, 0x0, 0x0, 0xd, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x70, 0x3, 0x8c, 0xef, 0xed, + 0x94, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x4f, 0xff, + 0x6d, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0x40, + 0x3, 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, 0x4b, + 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfa, 0x1, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, + 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x20, 0xaf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf3, 0x5, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x20, + 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xe0, 0x0, 0x6f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, 0xbf, 0xff, + 0xc5, 0x0, 0x0, 0x3a, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xee, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xad, 0xef, 0xec, 0x82, 0x0, 0x0, 0x0, + + /* U+0037 "7" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xef, 0xf9, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x3f, 0xff, 0x90, + 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x20, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfb, 0x0, 0xef, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x89, 0x94, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x1, 0x6a, 0xde, 0xfe, 0xdb, 0x72, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xee, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0xb, 0xff, 0xfe, 0x61, 0x0, 0x1, 0x5d, 0xff, + 0xfd, 0x0, 0x2, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf5, 0x0, 0x6f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x7, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xfa, 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x80, 0x1, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x8, + 0xff, 0xfb, 0x20, 0x0, 0x0, 0x29, 0xff, 0xfb, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xeb, 0xbb, 0xdf, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, + 0x0, 0x1d, 0xff, 0xfd, 0x73, 0x0, 0x2, 0x6c, + 0xff, 0xfe, 0x20, 0xa, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfc, 0x1, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf3, + 0x5f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x76, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf9, 0x5f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x82, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf5, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0x0, 0x3f, 0xff, 0xfb, + 0x51, 0x0, 0x0, 0x4a, 0xff, 0xff, 0x60, 0x0, + 0x5f, 0xff, 0xff, 0xfe, 0xee, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x2, 0x7b, + 0xde, 0xfe, 0xdb, 0x73, 0x0, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x16, 0xbd, 0xff, 0xdb, 0x72, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xee, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xa, 0xff, + 0xfc, 0x50, 0x0, 0x4, 0xaf, 0xff, 0xd0, 0x0, + 0x4f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf9, 0x0, 0xaf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x20, 0xef, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xe0, + 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf1, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf4, 0x6f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xf6, 0xd, 0xff, + 0xfd, 0x50, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xf7, + 0x2, 0xef, 0xff, 0xff, 0xee, 0xff, 0xff, 0xf5, + 0xff, 0xf7, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x32, 0xff, 0xf6, 0x0, 0x0, 0x38, 0xce, + 0xfe, 0xd9, 0x40, 0x3, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0xbc, 0x73, 0x10, 0x13, 0x7d, + 0xff, 0xff, 0x50, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, + 0x0, 0x17, 0xbd, 0xff, 0xfd, 0xb7, 0x20, 0x0, + 0x0, 0x0, + + /* U+003A ":" */ + 0x5, 0xee, 0x70, 0x2f, 0xff, 0xf4, 0x4f, 0xff, + 0xf6, 0x1f, 0xff, 0xf3, 0x4, 0xcc, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xcc, 0x50, 0x1f, 0xff, 0xf3, + 0x4f, 0xff, 0xf7, 0x2f, 0xff, 0xf4, 0x5, 0xee, + 0x70, + + /* U+003B ";" */ + 0x5, 0xee, 0x70, 0x2f, 0xff, 0xf4, 0x4f, 0xff, + 0xf6, 0x1f, 0xff, 0xf3, 0x4, 0xcc, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xcd, 0x60, 0x1f, 0xff, 0xf3, + 0x3f, 0xff, 0xf7, 0x1f, 0xff, 0xf5, 0x3, 0xef, + 0xf1, 0x0, 0xff, 0xb0, 0x3, 0xff, 0x60, 0x7, + 0xff, 0x0, 0xb, 0xfb, 0x0, 0xf, 0xf5, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, + 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, + 0xfd, 0x71, 0x0, 0x0, 0x28, 0xef, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xc6, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xe8, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xc6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, + 0xff, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, + 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x7d, 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xdf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, + + /* U+003D "=" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x89, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x7c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7d, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0x79, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+003E ">" */ + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xc6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x8d, 0xff, 0xff, 0xfb, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, 0xcf, + 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x28, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xcf, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x1, + 0x7d, 0xff, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x5b, + 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xe9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x16, 0xad, 0xff, 0xfe, 0xb7, 0x10, + 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x4, 0xff, 0xff, 0xd7, + 0x31, 0x1, 0x4a, 0xff, 0xff, 0x80, 0x2c, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, 0x0, + 0x7, 0x40, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x17, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6e, 0xe6, 0x0, 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, 0xbe, + 0xef, 0xfe, 0xca, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, + 0xff, 0xfd, 0xa7, 0x65, 0x56, 0x8b, 0xff, 0xff, + 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfe, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xcf, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfd, 0x10, + 0x0, 0x0, 0x4, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfb, 0x0, 0x0, 0x1, 0xef, 0xf2, 0x0, 0x0, + 0x0, 0x5a, 0xef, 0xfd, 0x94, 0x0, 0x7f, 0xfa, + 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x8f, 0xf6, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x27, + 0xff, 0xa0, 0x0, 0xcf, 0xe0, 0x0, 0xf, 0xfd, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xfd, 0xcd, 0xff, + 0xfe, 0x9f, 0xfa, 0x0, 0x4, 0xff, 0x60, 0x5, + 0xff, 0x60, 0x0, 0x2, 0xff, 0xfe, 0x60, 0x0, + 0x1, 0x8f, 0xff, 0xff, 0xa0, 0x0, 0xd, 0xfb, + 0x0, 0xbf, 0xf0, 0x0, 0x0, 0xdf, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x0, 0x0, + 0x7f, 0xf0, 0xe, 0xfc, 0x0, 0x0, 0x4f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xa0, + 0x0, 0x4, 0xff, 0x31, 0xff, 0x90, 0x0, 0x9, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xfa, 0x0, 0x0, 0x1f, 0xf6, 0x2f, 0xf7, 0x0, + 0x0, 0xcf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xa0, 0x0, 0x0, 0xff, 0x73, 0xff, + 0x60, 0x0, 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfa, 0x0, 0x0, 0xf, 0xf7, + 0x3f, 0xf6, 0x0, 0x0, 0xdf, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, 0x0, + 0xff, 0x72, 0xff, 0x70, 0x0, 0xc, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0x0, + 0x0, 0x1f, 0xf6, 0x1f, 0xf9, 0x0, 0x0, 0x9f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xa0, 0x0, 0x3, 0xff, 0x30, 0xef, 0xc0, 0x0, + 0x4, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfa, 0x0, 0x0, 0x7f, 0xf0, 0xa, 0xff, + 0x10, 0x0, 0xc, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xb0, 0x0, 0xd, 0xfb, 0x0, + 0x5f, 0xf6, 0x0, 0x0, 0x2f, 0xff, 0xe6, 0x0, + 0x0, 0x17, 0xff, 0xef, 0xff, 0x30, 0x8, 0xff, + 0x40, 0x0, 0xff, 0xd0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xcb, 0xdf, 0xff, 0xe1, 0xef, 0xff, 0xcd, + 0xff, 0xb0, 0x0, 0x8, 0xff, 0x70, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x5, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x1e, 0xff, 0x20, + 0x0, 0x0, 0x5, 0xae, 0xff, 0xda, 0x40, 0x0, + 0x4, 0xbe, 0xfc, 0x70, 0x0, 0x0, 0x0, 0x4f, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xe7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x28, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xda, 0x76, 0x66, 0x8a, 0xdf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x15, 0x9c, 0xef, 0xff, + 0xec, 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf5, 0x1f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xe0, 0x9, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x70, 0x2, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x4f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf2, 0x0, 0x0, 0xd, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xa0, + 0x0, 0x0, 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdf, 0xff, + 0x60, 0x0, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xd0, 0x0, + 0x0, 0xe, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf5, 0x0, 0x0, 0x6f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfc, 0x0, 0x0, 0xef, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x30, 0x5, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, + 0xc, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, + + /* U+0042 "B" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xda, + 0x50, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x3f, + 0xff, 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, + 0xf9, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xaf, 0xff, 0xf5, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xc0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, + 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x3, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf6, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x2, 0x5c, 0xff, 0xfb, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x81, 0x0, 0x3, 0xff, 0xfe, + 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, 0xf4, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x8f, 0xff, 0xf4, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x33, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0x13, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0xef, 0xff, 0x90, 0x3f, 0xff, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xc0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xed, 0xa6, 0x10, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xc9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xc7, 0x43, 0x24, 0x6b, 0xff, 0xff, 0xf4, + 0x0, 0x5, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0xff, 0xd1, 0x0, 0x2f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0x10, + 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0x10, + 0x0, 0x6, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0x2a, 0xff, 0xd2, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xc7, 0x43, 0x24, 0x6b, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x8, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xfe, + 0xc9, 0x40, 0x0, 0x0, + + /* U+0044 "D" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb8, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x3f, + 0xff, 0x61, 0x11, 0x11, 0x11, 0x24, 0x8d, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0x30, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xe1, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf8, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x60, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xd0, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x60, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x10, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf9, 0x0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xe1, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0x30, + 0x0, 0x3f, 0xff, 0x61, 0x11, 0x11, 0x11, 0x24, + 0x8d, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb8, + 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x3f, 0xff, + 0x61, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x61, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x10, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, + + /* U+0046 "F" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x93, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x93, 0xff, 0xf6, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xca, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xc8, 0x53, 0x24, 0x5a, 0xef, 0xff, 0xf8, + 0x0, 0x5, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xf3, 0x0, 0x2f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x30, + 0x0, 0xbf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7a, 0xa7, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfb, + 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfb, 0xe, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfb, + 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfb, 0x4, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfb, + 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfb, 0x0, 0x2f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfb, + 0x0, 0x5, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xef, 0xfb, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xc8, 0x43, 0x23, 0x59, 0xef, 0xff, 0xfa, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x7, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xda, 0x61, 0x0, 0x0, + + /* U+0048 "H" */ + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x73, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x61, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x3f, 0xff, 0x73, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x73, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, + + /* U+0049 "I" */ + 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x3f, 0xff, 0x63, + 0xff, 0xf6, 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x3f, + 0xff, 0x63, 0xff, 0xf6, 0x3f, 0xff, 0x63, 0xff, + 0xf6, 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x3f, 0xff, + 0x63, 0xff, 0xf6, 0x3f, 0xff, 0x63, 0xff, 0xf6, + 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x3f, 0xff, 0x63, + 0xff, 0xf6, 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x3f, + 0xff, 0x63, 0xff, 0xf6, 0x3f, 0xff, 0x60, + + /* U+004A "J" */ + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x1, 0x11, 0x11, 0x11, 0x11, 0xbf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfc, + 0x0, 0x93, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x8, 0xfe, 0x30, 0x0, 0x0, 0xa, 0xff, 0xf5, + 0x1f, 0xff, 0xfa, 0x41, 0x14, 0xbf, 0xff, 0xe0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x4a, 0xdf, 0xfe, 0xb6, 0x0, 0x0, + + /* U+004B "K" */ + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfa, 0x3, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, 0x0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xfb, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, + 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x5, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x3, 0xff, 0xf6, 0x0, 0x0, 0x4, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x4, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf6, 0x0, 0x4, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x4, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf6, 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x63, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0x68, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x60, 0xa, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x60, 0x0, 0xb, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, + 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf6, + 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf4, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, + 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xd1, 0x0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, + 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x90, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, + + /* U+004C "L" */ + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf6, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x10, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + + /* U+004D "M" */ + 0x3f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x3f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf9, 0x3f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf9, 0x3f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf9, + 0x3f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xf9, 0x3f, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf9, 0x3f, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf9, 0x3f, 0xff, 0xaf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfa, 0xef, 0xf9, + 0x3f, 0xff, 0x3c, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf1, 0xef, 0xf9, 0x3f, 0xff, + 0x33, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0x70, 0xef, 0xf9, 0x3f, 0xff, 0x30, 0x9f, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x0, + 0xef, 0xf9, 0x3f, 0xff, 0x30, 0x1e, 0xff, 0x90, + 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, 0xef, 0xf9, + 0x3f, 0xff, 0x30, 0x6, 0xff, 0xf3, 0x0, 0x0, + 0xc, 0xff, 0xa0, 0x0, 0xef, 0xf9, 0x3f, 0xff, + 0x30, 0x0, 0xcf, 0xfc, 0x0, 0x0, 0x5f, 0xff, + 0x10, 0x0, 0xef, 0xf9, 0x3f, 0xff, 0x30, 0x0, + 0x2f, 0xff, 0x60, 0x0, 0xef, 0xf7, 0x0, 0x0, + 0xef, 0xf9, 0x3f, 0xff, 0x30, 0x0, 0x9, 0xff, + 0xe1, 0x8, 0xff, 0xd0, 0x0, 0x0, 0xef, 0xf9, + 0x3f, 0xff, 0x30, 0x0, 0x0, 0xef, 0xf9, 0x2f, + 0xff, 0x40, 0x0, 0x0, 0xef, 0xf9, 0x3f, 0xff, + 0x30, 0x0, 0x0, 0x5f, 0xff, 0xcf, 0xfa, 0x0, + 0x0, 0x0, 0xef, 0xf9, 0x3f, 0xff, 0x30, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0xdf, 0xf9, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0xdf, 0xf9, + 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x3f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0xd, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf9, 0x3f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf9, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, + 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, + + /* U+004E "N" */ + 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x73, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x73, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x73, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0xdf, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x73, 0xff, 0xf6, 0xbf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, 0xdf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x73, + 0xff, 0xf6, 0x2, 0xef, 0xff, 0x70, 0x0, 0x0, + 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, 0x4, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0x73, 0xff, + 0xf6, 0x0, 0x7, 0xff, 0xfe, 0x20, 0x0, 0x2, + 0xff, 0xf7, 0x3f, 0xff, 0x60, 0x0, 0xa, 0xff, + 0xfd, 0x0, 0x0, 0x2f, 0xff, 0x73, 0xff, 0xf6, + 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x2, 0xff, + 0xf7, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x1e, 0xff, + 0xf7, 0x0, 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x2, 0xff, 0xf7, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf2, 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xd3, 0xff, 0xf7, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0xf7, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xf7, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf7, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x70, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xca, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xc7, + 0x43, 0x23, 0x6b, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0x90, 0x0, 0x0, 0x2f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf5, 0x0, 0x0, 0xbf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfe, 0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, + 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0xe, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf2, 0x1f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf5, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, + 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf7, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf7, 0x1f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf5, 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, + 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x3, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x70, 0x0, 0xbf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfe, 0x10, 0x0, 0x2f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xc7, 0x43, 0x23, 0x6a, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xda, 0x61, 0x0, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x83, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x3f, 0xff, 0x61, 0x11, 0x11, 0x12, 0x47, + 0xdf, 0xff, 0xf7, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x90, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xe0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf1, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xe0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x90, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x30, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x25, 0xbf, 0xff, + 0xf8, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x94, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x61, 0x11, 0x11, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xca, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xfc, 0x74, 0x32, 0x46, 0xbf, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, 0x0, 0x0, + 0xbf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0x0, 0x0, 0x3f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf7, 0x0, 0x9, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xd0, 0x0, 0xef, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x20, 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf5, 0x3, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, 0x4f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf7, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x70, 0x1f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf5, 0x0, 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x20, + 0xa, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x4f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf8, 0x0, 0x0, 0xdf, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x10, 0x0, 0x3, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0x60, 0x0, 0x0, 0x7, 0xff, 0xff, 0xb1, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xfa, 0x52, 0x11, + 0x24, 0x9e, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xbe, 0xff, 0xff, 0xfe, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x6, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfb, 0x30, 0x0, 0x3a, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xed, 0xef, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8c, 0xff, + 0xeb, 0x60, 0x0, + + /* U+0052 "R" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x83, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x3f, 0xff, 0x61, 0x11, 0x11, 0x12, 0x47, + 0xdf, 0xff, 0xf7, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x90, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xe0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf1, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xe0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x90, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x20, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x25, 0xbf, 0xff, + 0xf8, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x70, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfc, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf2, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xfd, 0x0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x80, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf3, + + /* U+0053 "S" */ + 0x0, 0x0, 0x1, 0x7b, 0xdf, 0xff, 0xeb, 0x84, + 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe8, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xdf, + 0xff, 0xd7, 0x31, 0x1, 0x25, 0x9e, 0xff, 0x40, + 0x6, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6b, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfe, + 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xfd, 0x95, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x26, 0xbf, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x36, 0xbf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x5, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfb, + 0xd, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf5, 0x5f, 0xff, 0xfd, 0x84, 0x21, 0x1, + 0x37, 0xdf, 0xff, 0xc0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x3b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x15, 0x9c, 0xef, 0xff, 0xda, 0x61, + 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x11, 0x11, 0x11, 0x14, 0xff, 0xf6, 0x11, 0x11, + 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfe, 0x7f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfe, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfe, 0x7f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x7f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfe, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x7f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfe, 0x7f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfe, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfe, 0x7f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x7f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfe, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x5f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, + 0x4f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfb, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0xc, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf3, 0x6, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xd0, 0x0, 0xdf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0x50, 0x0, + 0x3f, 0xff, 0xfe, 0x85, 0x32, 0x36, 0xcf, 0xff, + 0xf9, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xed, 0x95, + 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xc, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, 0x5f, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf0, 0x0, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x0, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x1f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xa0, 0x0, 0x0, 0x9f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, + 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfc, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x50, + 0x0, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf4, 0x0, 0x0, 0x6f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xb0, 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, 0x4, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf9, 0x0, 0xbf, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf1, 0x2f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x79, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xfe, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0057 "W" */ + 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x35, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0xf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf8, 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x5, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xd0, 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xaf, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, 0xaf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xc3, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, + 0x0, 0x5, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf7, 0xd, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xd0, 0x0, 0x0, 0xf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, 0x8f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xc0, 0x2, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0x20, 0x0, 0x0, 0x4, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xef, 0xf6, 0x0, 0xd, 0xff, 0xa0, + 0x0, 0x0, 0x9, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xb0, 0x0, 0x0, 0x4f, 0xff, 0x10, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0xef, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x0, 0x0, + 0x9, 0xff, 0xb0, 0x0, 0x2, 0xff, 0xf5, 0x0, + 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf5, 0x0, 0x0, 0xef, 0xf6, 0x0, 0x0, + 0xc, 0xff, 0xa0, 0x0, 0xa, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x5f, + 0xff, 0x10, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x10, 0xa, 0xff, 0xb0, 0x0, 0x0, 0x1, + 0xff, 0xf5, 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf6, 0x0, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xa0, 0xa, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xb0, 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x1b, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf5, 0x5f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf7, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xba, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0x9, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xb0, 0x0, 0xdf, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x10, + 0x0, 0x2f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf4, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x70, 0x0, 0x0, 0x2, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xf3, 0x0, 0x0, 0xc, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x8f, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xa0, 0x4, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf6, 0x1e, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xcf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf7, 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, 0x9, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xfe, 0x10, 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x2f, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x90, 0x0, 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x70, 0x0, 0x0, 0x1e, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf3, 0x0, + 0x0, 0xaf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfd, 0x0, 0x6, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xa0, + 0x3f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf6, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x20, 0x3f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x80, 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xd0, 0x0, 0x1, 0xef, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf4, 0x0, 0x0, 0x6, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfa, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, 0xb, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xfd, 0x0, 0x0, 0x5, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf8, 0x0, 0x1, + 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x9f, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x5c, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+005A "Z" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x12, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfc, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x10, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, + + /* U+005B "[" */ + 0x3f, 0xff, 0xff, 0xff, 0x43, 0xff, 0xff, 0xff, + 0xf4, 0x3f, 0xff, 0xdd, 0xdd, 0x33, 0xff, 0xf3, + 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0x30, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, + 0xff, 0x30, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, + 0x3f, 0xff, 0x30, 0x0, 0x3, 0xff, 0xf3, 0x0, + 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, 0xff, 0xf3, + 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0x30, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, + 0xff, 0xdd, 0xdd, 0x33, 0xff, 0xff, 0xff, 0xf4, + 0x3f, 0xff, 0xff, 0xff, 0x40, + + /* U+005C "\\" */ + 0x28, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, + + /* U+005D "]" */ + 0x5f, 0xff, 0xff, 0xff, 0x35, 0xff, 0xff, 0xff, + 0xf3, 0x4d, 0xdd, 0xdf, 0xff, 0x30, 0x0, 0x4, + 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, + 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, 0x30, + 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, + 0x30, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, + 0xff, 0x30, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, + 0x4f, 0xff, 0x30, 0x0, 0x4, 0xff, 0xf3, 0x0, + 0x0, 0x4f, 0xff, 0x30, 0x0, 0x4, 0xff, 0xf3, + 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, 0x4, 0xff, + 0xf3, 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, 0x4, + 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, + 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, 0x30, + 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, + 0x30, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, + 0xff, 0x30, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, + 0x4f, 0xff, 0x30, 0x0, 0x4, 0xff, 0xf3, 0x4d, + 0xdd, 0xdf, 0xff, 0x35, 0xff, 0xff, 0xff, 0xf3, + 0x5f, 0xff, 0xff, 0xff, 0x30, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf7, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfd, 0xc, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x60, 0x6f, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf0, 0x0, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x9, 0xff, 0x20, 0x0, 0x0, 0x8, 0xff, 0x20, + 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x0, 0xef, 0xc0, + 0x0, 0x0, 0xbf, 0xe0, 0x0, 0x0, 0x6f, 0xf5, + 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, 0xc, 0xfe, + 0x0, 0x0, 0x0, 0xe, 0xfc, 0x0, 0x3, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x0, 0xaf, + 0xf1, 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, 0x1f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x10, + + /* U+005F "_" */ + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x38, 0x88, 0x60, 0x0, 0x0, 0x7, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xb0, 0x0, 0x0, + 0x1, 0xaf, 0xfc, 0x10, 0x0, 0x0, 0x6, 0xff, + 0xd1, + + /* U+0061 "a" */ + 0x0, 0x0, 0x38, 0xbe, 0xff, 0xec, 0x82, 0x0, + 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x1, 0xff, 0xe8, 0x30, 0x0, + 0x26, 0xef, 0xff, 0x70, 0x0, 0x67, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf5, + 0x0, 0x1, 0x7b, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x4, 0xff, 0xff, 0xb8, 0x77, 0x77, + 0x77, 0xff, 0xf6, 0xd, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf6, 0x1f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf6, 0x2f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, 0x1f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0xc, + 0xff, 0xe3, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf6, + 0x3, 0xff, 0xff, 0xb8, 0x78, 0xcf, 0xfe, 0xff, + 0xf6, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xef, 0xf6, 0x0, 0x1, 0x6b, 0xef, 0xfd, 0xa6, + 0x0, 0xef, 0xf6, + + /* U+0062 "b" */ + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xb0, 0x2, 0x8c, 0xef, 0xec, + 0x83, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0xb, 0xff, + 0xcb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0xbf, 0xff, 0xff, 0xe8, 0x30, 0x2, 0x7d, + 0xff, 0xfe, 0x10, 0xb, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfb, 0x0, 0xbf, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, + 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x90, 0xbf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfd, 0xb, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xb, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf0, 0xbf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0xb, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x90, 0xbf, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf4, 0xb, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, 0x0, 0xbf, + 0xff, 0xff, 0xe8, 0x30, 0x2, 0x7d, 0xff, 0xfe, + 0x10, 0xb, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0xbf, 0xf9, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0xb, 0xff, + 0x90, 0x2, 0x8c, 0xef, 0xec, 0x83, 0x0, 0x0, + 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xd9, 0x40, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x5, 0xff, 0xff, + 0xa4, 0x10, 0x14, 0xbf, 0xff, 0xe1, 0x2, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x5f, 0xf8, 0x0, + 0xaf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x52, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x52, 0x0, 0x2, 0xff, 0xfe, + 0x40, 0x0, 0x0, 0x0, 0x5f, 0xf9, 0x0, 0x4, + 0xff, 0xff, 0xa4, 0x10, 0x14, 0xaf, 0xff, 0xe1, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdf, + 0xff, 0xd9, 0x40, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x40, 0x0, 0x0, 0x5, 0xad, 0xff, 0xdb, + 0x50, 0x3, 0xff, 0xf4, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0x3f, 0xff, 0x40, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xf4, 0x0, 0x7f, 0xff, 0xfa, 0x41, 0x1, 0x5b, + 0xff, 0xff, 0xff, 0x40, 0x3f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xf4, 0xb, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x41, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf4, 0x4f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x46, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf4, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x46, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf4, 0x4f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x41, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf4, 0xb, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x40, 0x3f, 0xff, 0xd2, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf4, 0x0, + 0x7f, 0xff, 0xf7, 0x10, 0x0, 0x18, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x8f, 0xff, 0xff, 0xec, 0xef, + 0xff, 0xf8, 0xff, 0xf4, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0xf, 0xff, 0x40, 0x0, + 0x0, 0x6, 0xad, 0xff, 0xeb, 0x60, 0x0, 0xff, + 0xf4, + + /* U+0065 "e" */ + 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfe, 0xb6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xfe, 0xef, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x6f, + 0xff, 0xd5, 0x10, 0x0, 0x4c, 0xff, 0xf8, 0x0, + 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x40, 0xa, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xc0, 0x1f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf1, 0x4f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x6f, 0xff, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x73, 0x4f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x2, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x7, 0xe2, 0x0, 0x0, 0x6f, + 0xff, 0xfb, 0x51, 0x0, 0x26, 0xdf, 0xfd, 0x10, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x49, + 0xce, 0xff, 0xda, 0x60, 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x3a, 0xdf, 0xfd, 0x92, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x6f, 0xff, 0xfe, 0xdf, 0xf5, 0x0, 0x0, 0xef, + 0xfe, 0x30, 0x0, 0x50, 0x0, 0x2, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x5c, + 0xcd, 0xff, 0xfd, 0xcc, 0xcc, 0x80, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x0, 0x6a, 0xdf, 0xfe, 0xb6, 0x10, + 0xc, 0xff, 0x80, 0x0, 0x5, 0xef, 0xff, 0xff, + 0xff, 0xff, 0x70, 0xcf, 0xf8, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xac, 0xff, 0x80, + 0x9, 0xff, 0xff, 0x94, 0x10, 0x3, 0x8f, 0xff, + 0xff, 0xf8, 0x5, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0x80, 0xdf, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf8, 0x2f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x85, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf8, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x87, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf8, 0x5f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x82, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0x80, 0x4f, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xfa, 0x41, + 0x1, 0x39, 0xff, 0xff, 0xff, 0x80, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xef, 0xf8, + 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xe, 0xff, 0x80, 0x0, 0x0, 0x6, 0xad, 0xff, + 0xeb, 0x71, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf2, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xfe, 0x0, 0x7, 0xf9, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x1, + 0xff, 0xff, 0xa6, 0x20, 0x0, 0x26, 0xdf, 0xff, + 0xe1, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, + 0x0, 0x48, 0xbd, 0xef, 0xfe, 0xb8, 0x20, 0x0, + 0x0, + + /* U+0068 "h" */ + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xb0, 0x3, 0x8c, 0xef, + 0xec, 0x81, 0x0, 0x0, 0xbf, 0xfb, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xb, 0xff, 0xcd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xbf, + 0xff, 0xff, 0xd6, 0x21, 0x14, 0xaf, 0xff, 0xf4, + 0xb, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xc0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x1b, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf4, 0xbf, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x5b, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x6b, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf6, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x6b, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x6b, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf6, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x6b, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf6, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x6b, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, + + /* U+0069 "i" */ + 0x0, 0x66, 0x10, 0xd, 0xff, 0xd0, 0x4f, 0xff, + 0xf4, 0x2f, 0xff, 0xf2, 0x6, 0xdd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, + 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, + 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, + 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, + 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, + 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, + 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, + 0xb0, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x0, 0x57, 0x20, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x4, 0xce, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xb0, 0x4, 0x60, 0x0, 0x9f, + 0xff, 0x60, 0xb, 0xff, 0xef, 0xff, 0xfe, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x5, 0xbe, + 0xff, 0xd8, 0x10, 0x0, + + /* U+006B "k" */ + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xb0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfb, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xb0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xbf, 0xfb, 0x0, 0x1, 0xcf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x2d, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x3, 0xef, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x4f, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfe, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf7, 0xef, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0x40, + 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xe3, 0x0, 0x6, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0xbf, 0xfe, 0x20, 0x0, 0x0, 0x9f, 0xff, 0xb0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf8, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0x50, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfd, 0x10, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xb0, + + /* U+006C "l" */ + 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, + 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, + 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, + 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, + 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, + 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, + 0xbf, 0xfb, 0xbf, 0xfb, + + /* U+006D "m" */ + 0xbf, 0xf9, 0x0, 0x5a, 0xdf, 0xfd, 0xb5, 0x0, + 0x0, 0x0, 0x5a, 0xde, 0xfe, 0xb6, 0x0, 0x0, + 0xbf, 0xf9, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0xbf, 0xfc, 0xef, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0x27, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0x92, 0x0, 0x3, 0xcf, 0xff, + 0xef, 0xff, 0xa3, 0x0, 0x3, 0xbf, 0xff, 0xd0, + 0xbf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, + 0xbf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, + 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfd, + 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, + 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + + /* U+006E "n" */ + 0xbf, 0xf9, 0x0, 0x49, 0xde, 0xfe, 0xc8, 0x10, + 0x0, 0xb, 0xff, 0x92, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0xbf, 0xfb, 0xef, 0xff, 0xfe, + 0xef, 0xff, 0xff, 0x90, 0xb, 0xff, 0xff, 0xfa, + 0x30, 0x0, 0x17, 0xff, 0xff, 0x40, 0xbf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf1, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x4b, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf5, 0xbf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x6b, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, 0xbf, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x6b, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf6, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x6b, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf6, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x6b, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x6b, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf6, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x60, + + /* U+006F "o" */ + 0x0, 0x0, 0x0, 0x49, 0xdf, 0xff, 0xc9, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xa4, 0x10, 0x15, 0xbf, 0xff, + 0xf3, 0x0, 0x2, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xe1, 0x0, 0xaf, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x80, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf2, 0x6f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x47, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xf5, 0x6f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x44, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf2, 0xf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, + 0x0, 0xaf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x70, 0x2, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xe1, 0x0, 0x5, 0xff, + 0xff, 0xa4, 0x10, 0x15, 0xbf, 0xff, 0xf3, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xdf, 0xff, 0xc9, 0x40, 0x0, 0x0, 0x0, + + /* U+0070 "p" */ + 0xbf, 0xf9, 0x0, 0x38, 0xce, 0xfe, 0xc8, 0x30, + 0x0, 0x0, 0xb, 0xff, 0x91, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0xbf, 0xfb, 0xdf, + 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xe3, 0x0, 0xb, + 0xff, 0xff, 0xfd, 0x50, 0x0, 0x4, 0xbf, 0xff, + 0xe1, 0x0, 0xbf, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xb0, 0xb, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x40, 0xbf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf9, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xd0, 0xbf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf0, 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0xbf, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf9, + 0xb, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x40, 0xbf, 0xff, 0xfc, 0x20, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xb0, 0xb, 0xff, 0xff, + 0xff, 0x83, 0x0, 0x27, 0xdf, 0xff, 0xe1, 0x0, + 0xbf, 0xfc, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0xb, 0xff, 0xb0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x28, 0xce, 0xfe, 0xc8, 0x30, 0x0, 0x0, 0xb, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfd, 0xb6, 0x0, + 0xf, 0xff, 0x40, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xfe, 0x40, 0xff, 0xf4, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0x40, + 0x7, 0xff, 0xff, 0xa4, 0x10, 0x15, 0xbf, 0xff, + 0xff, 0xf4, 0x3, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0x40, 0xbf, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf4, 0x1f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x44, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf4, 0x6f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x47, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xf4, 0x6f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x44, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x1f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x40, 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf4, 0x3, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x40, 0x7, 0xff, + 0xff, 0xa4, 0x10, 0x15, 0xbf, 0xff, 0xff, 0xf4, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0xff, 0x40, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xfd, 0x33, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x6a, 0xdf, 0xfd, 0xb5, 0x0, 0x3f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf4, + + /* U+0072 "r" */ + 0xbf, 0xf9, 0x0, 0x38, 0xce, 0x8b, 0xff, 0x90, + 0xaf, 0xff, 0xf8, 0xbf, 0xf9, 0xbf, 0xff, 0xff, + 0x8b, 0xff, 0xff, 0xff, 0x96, 0x42, 0xbf, 0xff, + 0xfc, 0x10, 0x0, 0xb, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, 0xb, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0xbf, 0xfc, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xbf, + 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x6, 0xad, 0xff, 0xed, 0xa7, 0x20, + 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x1f, 0xff, 0xe6, 0x10, 0x0, 0x25, + 0xbf, 0x60, 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x8f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xfd, 0xa7, 0x30, 0x0, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xe8, 0x0, 0x0, 0x0, 0x4, + 0x8b, 0xef, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x14, 0x8e, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xd0, + 0x7f, 0xfc, 0x73, 0x0, 0x0, 0x3a, 0xff, 0xf8, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x1, 0x6a, 0xde, 0xff, 0xeb, 0x82, + 0x0, 0x0, + + /* U+0074 "t" */ + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x5c, 0xcd, 0xff, 0xfd, 0xcc, 0xcc, + 0x80, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x50, 0x1, 0x81, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xef, 0xf7, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x4a, 0xef, 0xfc, + 0x81, + + /* U+0075 "u" */ + 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x1e, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf1, 0xef, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x1e, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf1, 0xef, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x1e, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf1, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x1e, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf1, 0xef, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x1e, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf1, 0xef, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x1d, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf1, 0xcf, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x19, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x4f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x10, 0xcf, + 0xff, 0xb3, 0x0, 0x1, 0x6e, 0xff, 0xff, 0xf1, + 0x2, 0xef, 0xff, 0xff, 0xde, 0xff, 0xff, 0xaf, + 0xff, 0x10, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xfe, + 0x53, 0xff, 0xf1, 0x0, 0x0, 0x4a, 0xdf, 0xfe, + 0xb6, 0x0, 0x3f, 0xff, 0x10, + + /* U+0076 "v" */ + 0xd, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xe0, 0x6, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x70, 0x0, 0xef, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x10, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf9, 0x0, 0x0, 0x1f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, 0x0, + 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xb0, 0x0, 0x0, 0x3, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, 0xcf, + 0xfc, 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x20, 0x0, 0x0, 0xef, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, + 0x0, 0x6, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf1, 0x0, 0xd, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf7, 0x0, 0x4f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfe, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x52, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xc9, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, + + /* U+0077 "w" */ + 0x9f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, + 0x3, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x90, 0xd, 0xff, 0x60, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf3, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xfd, 0x0, 0x1, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xef, 0xf6, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x70, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x4, 0xff, 0xd7, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xff, 0xf1, 0x0, 0x0, 0x5f, 0xfd, 0x0, 0x0, + 0x0, 0xaf, 0xf7, 0x1f, 0xff, 0x20, 0x0, 0x0, + 0x6f, 0xfb, 0x0, 0x0, 0x0, 0xff, 0xf3, 0x0, + 0x0, 0x1f, 0xff, 0x10, 0xbf, 0xf7, 0x0, 0x0, + 0xc, 0xff, 0x50, 0x0, 0x0, 0x9, 0xff, 0x90, + 0x0, 0x7, 0xff, 0xb0, 0x4, 0xff, 0xd0, 0x0, + 0x2, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x3f, 0xfe, + 0x0, 0x0, 0xdf, 0xf4, 0x0, 0xe, 0xff, 0x30, + 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf5, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x8f, 0xf9, + 0x0, 0xe, 0xff, 0x30, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xb0, 0x9, 0xff, 0x80, 0x0, 0x2, 0xff, + 0xf0, 0x4, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x10, 0xef, 0xf2, 0x0, 0x0, 0xc, + 0xff, 0x50, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf6, 0x5f, 0xfc, 0x0, 0x0, 0x0, + 0x6f, 0xfb, 0xf, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xcb, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xff, 0xf7, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, + + /* U+0078 "x" */ + 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x90, 0x1, 0xef, 0xfd, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xfc, 0x0, 0x0, 0x3f, 0xff, 0xa0, + 0x0, 0x0, 0xb, 0xff, 0xe1, 0x0, 0x0, 0x7, + 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x30, 0x4, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xd1, 0x1e, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfb, 0xcf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf5, 0x7f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x90, 0xb, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x1, 0xef, 0xfc, + 0x0, 0x1, 0xef, 0xfc, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xe1, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, + 0x0, 0x9f, 0xff, 0x40, 0x0, 0x0, 0x7, 0xff, + 0xf6, 0x0, 0x5, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x30, 0x2f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xe1, + + /* U+0079 "y" */ + 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xe0, 0x6, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x70, 0x0, 0xef, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x10, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf9, 0x0, 0x0, 0x1f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, 0x0, 0x0, + 0x9, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xb0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, 0xbf, + 0xfd, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, 0xef, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xb0, + 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf2, 0x0, 0xc, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf9, 0x0, 0x3f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x10, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x72, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xe9, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x1, 0xef, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xa3, 0x0, 0x3d, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x9d, 0xff, 0xd9, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x4c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcd, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, + + /* U+007B "{" */ + 0x0, 0x0, 0x7, 0xcf, 0xff, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0x0, 0x8, 0xff, 0xff, 0xec, 0x0, + 0xd, 0xff, 0xf3, 0x0, 0x0, 0xf, 0xff, 0x80, + 0x0, 0x0, 0xf, 0xff, 0x60, 0x0, 0x0, 0x1f, + 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, + 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, + 0x60, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, + 0x1f, 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, 0x60, + 0x0, 0x0, 0x1f, 0xff, 0x50, 0x0, 0x0, 0x8f, + 0xff, 0x30, 0x0, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0xcd, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, + 0x1f, 0xff, 0x50, 0x0, 0x0, 0x1f, 0xff, 0x60, + 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, 0x1f, + 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, + 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, + 0x60, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, + 0xf, 0xff, 0x60, 0x0, 0x0, 0xf, 0xff, 0x90, + 0x0, 0x0, 0xd, 0xff, 0xf3, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xec, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0x0, 0x0, 0x7, 0xcf, 0xff, + + /* U+007C "|" */ + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, + + /* U+007D "}" */ + 0x5f, 0xfe, 0xb4, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xef, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x30, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x80, 0x0, 0x3, + 0xff, 0xff, 0xd7, 0x0, 0x0, 0x9f, 0xff, 0x10, + 0x0, 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xef, 0xfa, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x80, 0x0, 0x4d, 0xff, 0xff, + 0xf2, 0x0, 0x5, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x5f, 0xfe, 0xa4, 0x0, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x6c, 0xfe, 0xb3, 0x0, 0x0, 0x0, 0x7f, + 0xd0, 0x8f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0xb, + 0xfb, 0x3f, 0xff, 0xbb, 0xff, 0xfc, 0x20, 0x4, + 0xff, 0x79, 0xff, 0x30, 0x3, 0xdf, 0xff, 0xbb, + 0xff, 0xf2, 0xcf, 0x90, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf7, 0xa, 0xc5, 0x0, 0x0, 0x0, 0x4b, + 0xff, 0xc5, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x1, 0x7b, 0xdb, 0x71, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xff, 0xf5, 0x0, 0x2, 0xff, 0x92, + 0x2, 0x8f, 0xf3, 0x0, 0xcf, 0x70, 0x0, 0x0, + 0x7f, 0xd0, 0x2f, 0xe0, 0x0, 0x0, 0x0, 0xef, + 0x34, 0xfa, 0x0, 0x0, 0x0, 0xa, 0xf6, 0x5f, + 0xa0, 0x0, 0x0, 0x0, 0xaf, 0x62, 0xfe, 0x0, + 0x0, 0x0, 0xd, 0xf4, 0xd, 0xf6, 0x0, 0x0, + 0x6, 0xfe, 0x0, 0x4f, 0xf7, 0x10, 0x7, 0xff, + 0x50, 0x0, 0x6f, 0xff, 0xef, 0xff, 0x70, 0x0, + 0x0, 0x29, 0xdf, 0xea, 0x30, 0x0, + + /* U+2022 "•" */ + 0x0, 0x37, 0x50, 0x0, 0x9f, 0xff, 0xd1, 0x5f, + 0xff, 0xff, 0x99, 0xff, 0xff, 0xfd, 0x7f, 0xff, + 0xff, 0xb1, 0xff, 0xff, 0xf5, 0x3, 0xcf, 0xd5, + 0x0, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x6a, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x38, 0xcf, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcc, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xea, 0x51, 0x8, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x83, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb6, 0x20, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfd, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x69, 0xbc, 0xac, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x3, 0x43, 0x1f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xdf, 0xff, 0xff, 0xa3, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x23, 0x20, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7a, 0xba, 0x85, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F008 "" */ + 0x6f, 0x40, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x4, 0xf6, 0xff, 0x40, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x4, 0xff, 0xff, 0xec, 0xcc, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xcc, 0xce, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa6, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc8, 0x88, 0xcf, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x88, + 0x8c, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf4, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x3f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf4, 0x0, 0x4, 0xff, 0xff, 0x40, + 0x0, 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, 0x4, 0xff, + 0xff, 0x60, 0x0, 0x6f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf7, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, + 0x44, 0x9f, 0xff, 0x73, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x37, 0xff, 0xf9, 0x44, 0x49, 0xff, + 0xff, 0x40, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x4, 0xff, 0xff, 0x40, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x4, 0xff, 0xff, 0x94, + 0x44, 0x9f, 0xff, 0x73, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x37, 0xff, 0xf9, 0x44, 0x49, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x6f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf7, 0x0, 0x6, 0xff, 0xff, 0x40, + 0x0, 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, 0x4, 0xff, + 0xff, 0x40, 0x0, 0x3f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, + 0x4, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf4, 0x0, 0x4, 0xff, 0xff, 0xc8, 0x88, 0xcf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfc, 0x88, 0x8c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa6, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xec, 0xcc, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcc, + 0xce, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x4, 0xff, 0x7f, 0x40, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x4, 0xf6, + + /* U+F00B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6e, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x9, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xfc, 0x10, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x10, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x9, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0xa, 0xe7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8d, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "ï€" */ + 0x0, 0x6c, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xcc, 0x40, 0x0, 0x8f, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x50, 0x7f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xfa, 0xef, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xa4, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0xef, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xae, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x30, + 0x8f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x50, 0x0, 0x6c, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcc, 0x40, + 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x56, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xed, 0x10, 0x0, 0xe, + 0xff, 0xff, 0xb0, 0x0, 0x4, 0xed, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, + 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, 0xe, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xf4, 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, + 0x7f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xf9, 0x0, 0xe, 0xff, 0xff, + 0xb0, 0x0, 0xdf, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xe, + 0xff, 0xff, 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x70, + 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xef, + 0xff, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfb, 0x0, + 0x5, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0x20, 0xa, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x70, 0xe, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xb0, 0x2f, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xe0, + 0x4f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xf1, 0x5f, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf2, 0x6f, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xf3, 0x6f, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf2, + 0x5f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x4, + 0xcd, 0xdb, 0x20, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xf1, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xc0, 0xb, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x80, + 0x6, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0x30, 0x0, 0xef, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf8, 0x30, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xdb, 0xbd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x15, 0x9c, 0xde, 0xed, + 0xb9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4a, 0xce, 0xee, 0xda, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x30, 0x0, 0x7, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x20, 0x0, 0x18, + 0x30, 0x0, 0x0, 0x0, 0x9, 0xff, 0xa2, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x6e, 0xff, 0x20, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x60, 0x0, 0x2a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x2a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x9, 0xff, 0xb2, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x6e, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7, + 0x40, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x20, 0x0, 0x7, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0xce, 0xee, 0xda, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x62, 0x0, 0x0, 0x0, 0x6, 0x77, + 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xf8, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x5f, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xfd, 0x20, 0x5, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x5f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xec, 0xff, 0xff, 0xff, 0x75, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xc1, 0x6, 0xff, 0xff, + 0xff, 0xdf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x70, 0x2, 0x50, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0x40, 0x5, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xfd, 0x20, 0x7, 0xff, 0xff, + 0xd2, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfb, + 0x10, 0xa, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x5f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf9, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x3e, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf6, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x1c, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xe3, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0xa, 0xff, + 0xff, 0xff, 0x70, 0x4, 0xef, 0xff, 0xff, 0xd2, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x20, 0x7, 0xff, 0xff, 0xff, 0xa0, + 0xef, 0xff, 0xff, 0xb0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x4, 0xff, 0xff, 0xff, 0x67, 0xff, 0xff, 0x80, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x2, 0xdf, 0xff, + 0xe1, 0xa, 0xff, 0x50, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x1, 0xbf, 0xf3, 0x0, 0x9, 0x30, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x75, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, + 0xbb, 0xbb, 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x33, 0x33, + 0x39, 0xff, 0xff, 0xff, 0xff, 0x93, 0x33, 0x33, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x8, 0xff, 0xff, 0x80, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x8f, 0xf8, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x5, 0x50, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x61, 0x16, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xcf, 0xfd, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0xd, 0xf2, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xc, + 0xf0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x8f, 0xfa, 0x5d, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x3a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xa3, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x19, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xf9, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x8d, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xc0, 0x0, 0x1, 0xef, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0x70, 0x0, 0xaf, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, 0x5f, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xfc, 0xc, 0xff, 0xff, 0xc8, 0x88, 0x88, + 0x88, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x55, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x5, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xa1, 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xbb, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x15, 0x9b, 0xde, 0xec, 0xa7, 0x30, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x71, 0x0, 0x0, 0xe, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0xe, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0xd, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xc, 0xff, 0xff, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xb6, 0x42, 0x24, 0x7c, 0xff, + 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0x81, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x1e, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x1, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8e, 0xed, 0xcb, 0xaa, 0xff, 0xff, 0xff, 0xff, + 0x6, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xe0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0x60, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xbc, + 0xdd, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xe1, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, + 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x81, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, 0xca, 0xff, + 0xff, 0xff, 0xff, 0xb7, 0x42, 0x24, 0x6b, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0xff, 0xff, + 0xc0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xe0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x3, 0x7a, 0xde, 0xed, + 0xb9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8b, 0xbb, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0x16, + 0x77, 0x77, 0x77, 0x7e, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8b, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x4e, 0xe4, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xa, 0xff, 0xf5, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x6f, + 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x5f, 0xff, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x9f, 0xfd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x8f, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x3f, 0xff, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x5f, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xa, 0xff, 0xf7, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x5f, 0xf7, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x11, 0x0, 0x1, 0x67, 0x77, 0x77, 0x77, + 0xef, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x51, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, + 0xa8, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0xbf, 0xfd, 0x30, 0x0, + 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x30, 0x0, 0x9f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xfe, + 0x20, 0x1, 0xef, 0xfc, 0x0, 0x16, 0x77, 0x77, + 0x77, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfb, 0x0, 0x7, 0xff, + 0xf3, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf5, 0x0, 0x1f, 0xff, 0x80, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x4, 0xff, 0x50, 0x0, 0x1e, 0xff, 0xc0, 0x0, + 0xbf, 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0xff, 0x60, + 0x0, 0x8f, 0xff, 0x20, 0x6, 0xff, 0xf0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x5, 0xff, 0xff, 0x20, 0x1, 0xff, 0xf6, + 0x0, 0x2f, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x4, 0xff, + 0xf9, 0x0, 0xd, 0xff, 0x90, 0x0, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x9, 0xff, 0xd0, 0x0, 0xbf, + 0xfb, 0x0, 0xf, 0xff, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x6f, 0xff, 0x0, 0xa, 0xff, 0xc0, 0x0, 0xef, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x9, 0xff, 0xd0, 0x0, + 0xbf, 0xfb, 0x0, 0xf, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x4, 0xff, 0xf9, 0x0, 0xd, 0xff, 0x90, 0x0, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x5, 0xff, 0xff, 0x20, + 0x1, 0xff, 0xf6, 0x0, 0x3f, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xaf, 0xff, 0x60, 0x0, 0x8f, 0xff, 0x20, + 0x7, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x4, 0xff, 0x50, + 0x0, 0x1e, 0xff, 0xc0, 0x0, 0xbf, 0xfd, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, + 0x0, 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfb, 0x0, 0x8, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xfe, + 0x20, 0x1, 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x30, 0x0, 0xaf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xbf, 0xfd, + 0x30, 0x0, 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x2, 0xa8, 0x0, 0x0, 0x3f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xb4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x50, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x4a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x73, 0x48, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x1c, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x1, 0xcf, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x1c, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x1, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + + /* U+F043 "ïƒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x52, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xfc, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x80, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xbd, 0xff, 0xf9, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xcf, 0xff, 0xd0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x87, 0xff, 0xff, 0x40, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x2f, 0xff, + 0xfc, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xbf, 0xff, 0xfa, 0x0, 0x18, + 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x3, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x83, 0x10, 0xbf, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x56, + 0x76, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "ïˆ" */ + 0x6, 0x77, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x65, 0x0, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xc0, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xf2, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfd, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf1, 0x2f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "ï‹" */ + 0x0, 0x57, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x57, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "ïŒ" */ + 0x0, 0x47, 0x77, 0x77, 0x77, 0x62, 0x0, 0x0, + 0x0, 0x0, 0x47, 0x77, 0x77, 0x77, 0x62, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04D "ï" */ + 0x0, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x62, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F051 "ï‘" */ + 0x1, 0x65, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x57, 0x77, 0x42, 0xef, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x7f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x1, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x1, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x31, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x1, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xf7, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0x5f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xf0, 0xaf, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x6d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F053 "ï“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xc5, 0x0, + + /* U+F054 "ï”" */ + 0x0, 0x9, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xc4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x55, + 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x19, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xef, 0xff, + 0xff, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "ï¨" */ + 0x19, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0x50, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, + + /* U+F06E "ï®" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, + 0xad, 0xef, 0xfe, 0xdb, 0x85, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x76, + 0x8a, 0xef, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x14, 0x53, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x80, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xc1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0x50, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x11, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0x90, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x6, 0xfc, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x23, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xa, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0x90, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x8e, 0xff, + 0xfb, 0x40, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xc8, 0x66, 0x7a, 0xef, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, 0xef, 0xfe, + 0xdb, 0x85, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F070 "ï°" */ + 0x0, 0x16, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x3, 0x7b, + 0xdf, 0xfe, 0xdc, 0x96, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xf9, 0x0, 0x16, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd7, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xfc, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x76, + 0x79, 0xdf, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, + 0x0, 0x2b, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x2, 0x32, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xf6, 0x1, 0xff, 0xfe, 0x80, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xfa, 0xb, 0xff, 0xff, 0xd2, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xe4, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xd0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0x30, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0x10, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xfd, 0x30, 0xef, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xef, 0xff, 0xff, 0xff, 0xd9, 0x66, 0x76, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x26, 0x9c, 0xde, 0xfe, 0xdc, 0x95, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0x10, 0x0, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x56, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x75, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x31, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x17, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x84, + 0x0, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xe2, 0x0, 0x7a, 0xaa, 0xaa, 0xaa, 0xa3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0xaa, 0xaf, + 0xff, 0xff, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xf9, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x4, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfc, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0x50, 0x0, 0xf, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xa0, 0x3, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x1, 0x63, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x1, + 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xfa, 0x0, 0x56, 0x0, + 0x0, 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xb0, 0x4, + 0xff, 0x50, 0x0, 0xf, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfb, + 0x0, 0x3f, 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xc0, 0x3, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xf5, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x7a, 0xaa, + 0xaa, 0xaa, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8a, 0xaa, 0xaf, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xa0, + 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xa0, + 0x8f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xf0, + 0x3f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb0, + 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, + 0x0, 0x4c, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x90, 0x0, + + /* U+F078 "ï¸" */ + 0x0, 0x4c, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x90, 0x0, + 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, + 0x3f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb0, + 0x8f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf0, + 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xa0, + 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, + 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x2, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x6e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0x7c, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf3, 0x1f, 0xff, 0xf6, 0xc, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x8f, 0xf4, 0x1, 0xff, 0xff, 0x60, 0x1d, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xa9, 0x10, 0x1f, + 0xff, 0xf6, 0x0, 0x6b, 0x60, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xfc, 0x1, 0xff, 0xff, + 0x60, 0x7f, 0xff, 0x60, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfb, 0x1f, 0xff, 0xf6, 0x6f, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xfb, 0xff, 0xff, 0xbf, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xb8, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x40, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "ï»" */ + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x75, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + + /* U+F093 "ï‚“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9c, 0xcc, 0xcc, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xcc, 0xcc, + 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x8, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x68, 0x88, 0x88, + 0x73, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x10, 0x0, 0x0, 0x1, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xcf, 0xfd, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0xd, 0xf2, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xc, + 0xf0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x8f, 0xfa, 0x5d, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x3a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xa3, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x62, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfe, 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x84, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe9, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x77, 0x65, 0x31, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x3, 0x54, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xfb, 0x20, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xe3, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf5, + 0xbf, 0xff, 0xf9, 0x35, 0xef, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x70, + 0xef, 0xff, 0xb0, 0x0, 0x3f, 0xff, 0xf6, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0xff, 0xff, 0x80, 0x0, 0xf, 0xff, 0xf7, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0xef, 0xff, 0xd0, 0x0, 0x5f, 0xff, 0xf6, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0xaf, 0xff, 0xfc, 0x68, 0xff, 0xff, 0xf2, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x12, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x55, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf9, 0x35, 0xef, 0xff, 0xf2, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0xef, 0xff, 0xb0, 0x0, 0x3f, 0xff, 0xf6, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0xff, 0xff, 0x80, 0x0, 0xf, 0xff, 0xf7, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xef, 0xff, 0xd0, 0x0, 0x5f, 0xff, 0xf6, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xaf, 0xff, 0xfc, 0x68, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xf6, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xd7, 0x0, + 0x0, 0x4, 0xcf, 0xff, 0xe8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xab, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0x50, 0xa, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xfa, + 0x6e, 0xff, 0xff, 0xb0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x44, 0x44, 0x44, 0x43, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xf1, 0x6, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0x60, 0x0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf5, 0x0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x50, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xe9, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x89, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, + 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x97, + 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C9 "" */ + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + + /* U+F0E0 "" */ + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x50, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x30, 0x1, 0xf7, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x7f, 0xff, 0xb1, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x1b, 0xff, 0xff, 0xfe, + 0x40, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x30, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x50, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x5e, + 0xff, 0xff, 0xe5, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x1, 0x8e, 0xe8, 0x10, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x34, 0x44, 0x44, 0x44, 0x44, 0x43, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5a, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x5, 0x9a, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x66, 0x66, 0x6a, 0xff, 0xff, 0xff, 0xd6, + 0x66, 0x66, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0x53, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x53, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcb, 0xbb, + 0xbb, 0xbb, 0xbb, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x1f, 0x80, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x1f, 0xf9, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x1f, 0xff, 0x90, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x1f, 0xff, 0xf9, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x1f, 0xff, 0xff, 0x90, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x1f, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0xb, 0xbb, 0xbb, 0xb7, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x6e, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xab, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x91, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, + 0xff, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xa1, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xe8, 0x88, 0xaf, 0xfc, + 0x88, 0x8c, 0xff, 0xa8, 0x88, 0xdf, 0xf9, 0x88, + 0x9f, 0xfd, 0x88, 0x8a, 0xff, 0xff, 0x8f, 0xff, + 0xf8, 0x0, 0x0, 0xff, 0x40, 0x0, 0x4f, 0xf0, + 0x0, 0x5, 0xff, 0x0, 0x0, 0xff, 0x50, 0x0, + 0xf, 0xff, 0xf8, 0xff, 0xff, 0x80, 0x0, 0xf, + 0xf4, 0x0, 0x4, 0xff, 0x0, 0x0, 0x5f, 0xe0, + 0x0, 0xe, 0xf5, 0x0, 0x0, 0xff, 0xff, 0x8f, + 0xff, 0xf8, 0x0, 0x0, 0xff, 0x40, 0x0, 0x4f, + 0xf0, 0x0, 0x5, 0xfe, 0x0, 0x0, 0xef, 0x50, + 0x0, 0xf, 0xff, 0xf8, 0xff, 0xff, 0xa0, 0x0, + 0x2f, 0xf6, 0x0, 0x6, 0xff, 0x20, 0x0, 0x8f, + 0xf1, 0x0, 0x1f, 0xf8, 0x0, 0x2, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xf5, 0x44, 0x5f, + 0xfb, 0x44, 0x46, 0xff, 0xa4, 0x44, 0x7f, 0xf7, + 0x44, 0x4b, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0xdf, 0x60, 0x0, 0xe, + 0xf5, 0x0, 0x0, 0xff, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0xd, 0xf6, 0x0, 0x0, 0xef, 0x50, 0x0, 0xf, + 0xf0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0xdf, 0x60, 0x0, + 0xe, 0xf5, 0x0, 0x0, 0xff, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xf5, + 0x44, 0x5f, 0xfb, 0x44, 0x46, 0xff, 0xa4, 0x44, + 0x7f, 0xf7, 0x44, 0x4b, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xa0, 0x0, 0x2f, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf8, 0x0, 0x2, 0xff, 0xff, 0x8f, 0xff, 0xf8, + 0x0, 0x0, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0x50, 0x0, 0xf, + 0xff, 0xf8, 0xff, 0xff, 0x80, 0x0, 0xf, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xf5, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, + 0xf8, 0x0, 0x0, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x50, 0x0, + 0xf, 0xff, 0xf8, 0xff, 0xff, 0xe8, 0x88, 0xaf, + 0xfc, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x9f, 0xfd, 0x88, 0x8a, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x55, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x5, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xa1, 0x0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x47, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7e, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x3a, 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "ï…›" */ + 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, + 0x0, 0x30, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf, 0xd1, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xff, 0xd1, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0xf, 0xff, 0xd1, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xff, + 0xff, 0xd1, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xd1, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xff, 0xff, 0xff, 0xd1, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf, + 0xff, 0xff, 0xff, 0xd1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0xb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3a, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xba, 0x30, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x12, 0x34, 0x32, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x47, 0xad, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xa7, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x87, + 0x66, 0x67, 0x8a, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x30, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x8d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xae, + 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xfe, 0x3f, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0x30, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x6a, 0xce, 0xff, + 0xfe, 0xca, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x30, 0x0, 0x3b, 0x40, 0x0, 0x0, + 0x0, 0x1, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x81, 0x0, 0x0, 0x0, 0x0, 0x3b, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcb, + 0xab, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfc, 0x62, 0x0, 0x0, 0x0, + 0x2, 0x6c, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xcf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4b, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0xdb, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xaf, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x5, 0x7b, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc8, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0xef, 0xff, 0xd6, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, + + /* U+F241 "ï‰" */ + 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x5, 0x7b, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc8, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0xef, 0xff, 0xd6, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, + + /* U+F242 "" */ + 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x7b, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc8, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0xef, 0xff, 0xd6, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, + + /* U+F243 "" */ + 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x7b, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x1f, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc8, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0xef, 0xff, 0xd6, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, + + /* U+F244 "" */ + 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x7b, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc8, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0xef, 0xff, 0xd6, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x52, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xdd, + 0xdf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xbb, 0xbf, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf4, 0x0, 0xb, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xa0, 0x0, 0x0, 0x9f, 0xfe, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x44, 0x10, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x91, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfe, 0x60, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xa, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xfc, 0x30, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfe, + 0x88, 0xbf, 0xff, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x9c, 0xff, 0xff, + 0xf9, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, + 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x91, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xc3, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x6, 0xaa, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf8, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, 0x7, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xe8, 0x8b, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xbe, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x77, 0x77, 0x77, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x23, 0x32, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6a, 0xef, 0xff, 0xff, 0xfe, 0xa5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xe1, 0xdf, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x0, 0xd, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xe0, 0x9, 0x30, 0x8, 0xff, 0xff, + 0xff, 0x40, 0x1f, 0xff, 0xff, 0xb0, 0x5f, 0xff, + 0xe0, 0xa, 0xf3, 0x0, 0x9f, 0xff, 0xff, 0x70, + 0x3f, 0xff, 0xff, 0x10, 0x5, 0xff, 0xe0, 0xa, + 0xff, 0x20, 0xb, 0xff, 0xff, 0xa0, 0x6f, 0xff, + 0xff, 0xd1, 0x0, 0x5f, 0xe0, 0x9, 0xfa, 0x0, + 0x3f, 0xff, 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xfd, + 0x10, 0x4, 0xe0, 0x9, 0xa0, 0x2, 0xef, 0xff, + 0xff, 0xe0, 0x9f, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x30, 0x4, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xf0, + 0xaf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xaf, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf0, 0x9f, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x40, 0x5, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xfc, 0x0, 0x5, + 0xe0, 0x9, 0xb0, 0x0, 0xbf, 0xff, 0xff, 0xd0, + 0x6f, 0xff, 0xff, 0xc0, 0x0, 0x6f, 0xf0, 0x9, + 0xfa, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x3f, 0xff, + 0xff, 0x10, 0x6, 0xff, 0xf0, 0xa, 0xfe, 0x10, + 0x8, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, 0xc1, + 0x6f, 0xff, 0xf0, 0xa, 0xe2, 0x0, 0x7f, 0xff, + 0xff, 0x70, 0xc, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xf0, 0x8, 0x20, 0x7, 0xff, 0xff, 0xff, 0x40, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x68, 0x9a, 0xba, + 0x97, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "ï‹­" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xbb, 0xbb, + 0xbb, 0xbb, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x37, 0x77, 0x77, 0x77, 0x79, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x77, 0x77, 0x77, 0x77, 0x60, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x82, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0x22, 0xff, 0xff, 0xd1, + 0x6f, 0xff, 0xfa, 0xa, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0x22, 0xff, 0xff, 0xd1, + 0x6f, 0xff, 0xfa, 0xa, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x61, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xb1, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xd1, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xd1, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xd1, 0x1, 0xdf, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xd1, 0x1, 0xdf, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x1, 0xdf, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x1, + 0xde, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xfd, 0xca, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x76, 0x53, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, + 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xc, 0xff, 0xff, 0xff, 0xc0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0xc, 0xff, 0xc0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xc, + 0xc0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xc, + 0xff, 0xff, 0xc0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xc, 0xff, 0xff, + 0xff, 0xc0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, + 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x28, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x75, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x1d, 0xff, 0xe0, + 0x0, 0xef, 0x50, 0x2, 0xff, 0x20, 0x8, 0xff, + 0xff, 0x0, 0x1d, 0xff, 0xfe, 0x0, 0xe, 0xf5, + 0x0, 0x2f, 0xf2, 0x0, 0x8f, 0xff, 0xf0, 0x1d, + 0xff, 0xff, 0xe0, 0x0, 0xef, 0x50, 0x2, 0xff, + 0x20, 0x8, 0xff, 0xff, 0x1d, 0xff, 0xff, 0xfe, + 0x0, 0xe, 0xf5, 0x0, 0x2f, 0xf2, 0x0, 0x8f, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xe0, 0x0, 0xef, + 0x50, 0x2, 0xff, 0x20, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xe, 0xf5, 0x0, 0x2f, + 0xf2, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0xef, 0x50, 0x2, 0xff, 0x20, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x39, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb9, 0x30, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x37, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0xa, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x1c, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x10, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf1, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x10, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xa3, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 155, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 154, .box_w = 6, .box_h = 25, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 75, .adv_w = 225, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 15}, + {.bitmap_index = 125, .adv_w = 405, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 438, .adv_w = 358, .box_w = 20, .box_h = 34, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 778, .adv_w = 486, .box_w = 29, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1141, .adv_w = 395, .box_w = 24, .box_h = 26, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1453, .adv_w = 121, .box_w = 4, .box_h = 10, .ofs_x = 2, .ofs_y = 15}, + {.bitmap_index = 1473, .adv_w = 194, .box_w = 8, .box_h = 33, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 1605, .adv_w = 195, .box_w = 8, .box_h = 33, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 1737, .adv_w = 230, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 12}, + {.bitmap_index = 1835, .adv_w = 335, .box_w = 17, .box_h = 16, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 1971, .adv_w = 131, .box_w = 6, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 2001, .adv_w = 221, .box_w = 10, .box_h = 3, .ofs_x = 2, .ofs_y = 8}, + {.bitmap_index = 2016, .adv_w = 131, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2031, .adv_w = 203, .box_w = 16, .box_h = 34, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 2303, .adv_w = 384, .box_w = 22, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2578, .adv_w = 213, .box_w = 10, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2703, .adv_w = 331, .box_w = 20, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2953, .adv_w = 329, .box_w = 19, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3191, .adv_w = 385, .box_w = 23, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3479, .adv_w = 331, .box_w = 20, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3729, .adv_w = 355, .box_w = 21, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3992, .adv_w = 344, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4242, .adv_w = 371, .box_w = 21, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4505, .adv_w = 355, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4755, .adv_w = 131, .box_w = 6, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4812, .adv_w = 131, .box_w = 6, .box_h = 24, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 4884, .adv_w = 335, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 5029, .adv_w = 335, .box_w = 17, .box_h = 11, .ofs_x = 2, .ofs_y = 7}, + {.bitmap_index = 5123, .adv_w = 335, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 5268, .adv_w = 330, .box_w = 19, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5506, .adv_w = 596, .box_w = 35, .box_h = 32, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 6066, .adv_w = 422, .box_w = 28, .box_h = 25, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 6416, .adv_w = 436, .box_w = 23, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6704, .adv_w = 416, .box_w = 24, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7004, .adv_w = 476, .box_w = 26, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7329, .adv_w = 386, .box_w = 20, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7579, .adv_w = 366, .box_w = 19, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7817, .adv_w = 445, .box_w = 24, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8117, .adv_w = 468, .box_w = 23, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8405, .adv_w = 179, .box_w = 5, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8468, .adv_w = 295, .box_w = 16, .box_h = 25, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8668, .adv_w = 414, .box_w = 23, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8956, .adv_w = 342, .box_w = 19, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9194, .adv_w = 550, .box_w = 28, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9544, .adv_w = 468, .box_w = 23, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9832, .adv_w = 484, .box_w = 28, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10182, .adv_w = 416, .box_w = 22, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10457, .adv_w = 484, .box_w = 29, .box_h = 30, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 10892, .adv_w = 419, .box_w = 22, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 11167, .adv_w = 358, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11417, .adv_w = 338, .box_w = 21, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11680, .adv_w = 456, .box_w = 22, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 11955, .adv_w = 410, .box_w = 27, .box_h = 25, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 12293, .adv_w = 649, .box_w = 39, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12781, .adv_w = 388, .box_w = 24, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13081, .adv_w = 373, .box_w = 25, .box_h = 25, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 13394, .adv_w = 378, .box_w = 22, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13669, .adv_w = 192, .box_w = 9, .box_h = 33, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 13818, .adv_w = 203, .box_w = 16, .box_h = 34, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 14090, .adv_w = 192, .box_w = 9, .box_h = 33, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 14239, .adv_w = 336, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 14367, .adv_w = 288, .box_w = 18, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14394, .adv_w = 346, .box_w = 10, .box_h = 5, .ofs_x = 4, .ofs_y = 22}, + {.bitmap_index = 14419, .adv_w = 344, .box_w = 18, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 14590, .adv_w = 393, .box_w = 21, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 14863, .adv_w = 329, .box_w = 19, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 15044, .adv_w = 393, .box_w = 21, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 15317, .adv_w = 353, .box_w = 20, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 15507, .adv_w = 203, .box_w = 14, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15689, .adv_w = 397, .box_w = 21, .box_h = 26, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 15962, .adv_w = 392, .box_w = 19, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 16209, .adv_w = 161, .box_w = 6, .box_h = 27, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 16290, .adv_w = 164, .box_w = 12, .box_h = 34, .ofs_x = -4, .ofs_y = -7}, + {.bitmap_index = 16494, .adv_w = 355, .box_w = 20, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 16754, .adv_w = 161, .box_w = 4, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 16806, .adv_w = 609, .box_w = 32, .box_h = 19, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 17110, .adv_w = 392, .box_w = 19, .box_h = 19, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 17291, .adv_w = 366, .box_w = 21, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 17491, .adv_w = 393, .box_w = 21, .box_h = 26, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 17764, .adv_w = 393, .box_w = 21, .box_h = 26, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 18037, .adv_w = 236, .box_w = 11, .box_h = 19, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 18142, .adv_w = 289, .box_w = 17, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 18304, .adv_w = 238, .box_w = 14, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 18465, .adv_w = 390, .box_w = 19, .box_h = 19, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 18646, .adv_w = 322, .box_w = 22, .box_h = 19, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 18855, .adv_w = 518, .box_w = 33, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19169, .adv_w = 318, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19359, .adv_w = 322, .box_w = 22, .box_h = 26, .ofs_x = -1, .ofs_y = -7}, + {.bitmap_index = 19645, .adv_w = 300, .box_w = 17, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 19807, .adv_w = 202, .box_w = 10, .box_h = 33, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 19972, .adv_w = 172, .box_w = 4, .box_h = 33, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 20038, .adv_w = 202, .box_w = 11, .box_h = 33, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 20220, .adv_w = 335, .box_w = 17, .box_h = 6, .ofs_x = 2, .ofs_y = 9}, + {.bitmap_index = 20271, .adv_w = 241, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 14}, + {.bitmap_index = 20349, .adv_w = 181, .box_w = 7, .box_h = 7, .ofs_x = 2, .ofs_y = 7}, + {.bitmap_index = 20374, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 21040, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21526, .adv_w = 576, .box_w = 36, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 22120, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 22606, .adv_w = 396, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 22919, .adv_w = 576, .box_w = 36, .box_h = 36, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 23567, .adv_w = 576, .box_w = 35, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 24215, .adv_w = 648, .box_w = 41, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 24892, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 25558, .adv_w = 648, .box_w = 41, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 26112, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 26778, .adv_w = 288, .box_w = 18, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 27039, .adv_w = 432, .box_w = 27, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 27431, .adv_w = 648, .box_w = 41, .box_h = 35, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 28149, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 28635, .adv_w = 396, .box_w = 25, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 29098, .adv_w = 504, .box_w = 24, .box_h = 33, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 29494, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 30086, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 30614, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 31142, .adv_w = 504, .box_w = 23, .box_h = 33, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 31522, .adv_w = 504, .box_w = 34, .box_h = 33, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 32083, .adv_w = 360, .box_w = 20, .box_h = 31, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 32393, .adv_w = 360, .box_w = 20, .box_h = 31, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 32703, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 33231, .adv_w = 504, .box_w = 32, .box_h = 7, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 33343, .adv_w = 648, .box_w = 41, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 33897, .adv_w = 720, .box_w = 47, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 34767, .adv_w = 648, .box_w = 42, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 35544, .adv_w = 576, .box_w = 36, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 36138, .adv_w = 504, .box_w = 32, .box_h = 19, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 36442, .adv_w = 504, .box_w = 32, .box_h = 19, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 36746, .adv_w = 720, .box_w = 45, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37399, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 37885, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 38551, .adv_w = 576, .box_w = 37, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 39236, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 39764, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 40356, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 40884, .adv_w = 504, .box_w = 32, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41348, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 41834, .adv_w = 360, .box_w = 24, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 42278, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 42870, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 43462, .adv_w = 648, .box_w = 41, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 44016, .adv_w = 576, .box_w = 38, .box_h = 38, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 44738, .adv_w = 432, .box_w = 27, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 45238, .adv_w = 720, .box_w = 45, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 46003, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 46521, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 47039, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 47557, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 48075, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 48593, .adv_w = 720, .box_w = 46, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 49260, .adv_w = 504, .box_w = 28, .box_h = 37, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 49778, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 50370, .adv_w = 576, .box_w = 37, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 51055, .adv_w = 720, .box_w = 45, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 51663, .adv_w = 432, .box_w = 27, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 52163, .adv_w = 579, .box_w = 37, .box_h = 23, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 6, 0, 0, 0, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 26, 0, 16, -13, 0, 0, + 0, 0, -32, -35, 4, 27, 13, 10, + -23, 4, 28, 2, 24, 6, 18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 5, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 0, -17, 0, 0, 0, 0, + 0, -12, 10, 12, 0, 0, -6, 0, + -4, 6, 0, -6, 0, -6, -3, -12, + 0, 0, 0, 0, -6, 0, 0, -7, + -9, 0, 0, -6, 0, -12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + -6, 0, -9, 0, -16, 0, -70, 0, + 0, -12, 0, 12, 17, 1, 0, -12, + 6, 6, 19, 12, -10, 12, 0, 0, + -33, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -21, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -16, -7, -28, 0, -23, + -4, 0, 0, 0, 0, 1, 22, 0, + -17, -5, -2, 2, 0, -10, 0, 0, + -4, -43, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -46, -5, 22, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -24, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, + 0, 6, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 5, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -21, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 12, 6, 17, -6, 0, 0, 12, -6, + -19, -79, 4, 16, 12, 1, -7, 0, + 21, 0, 18, 0, 18, 0, -54, 0, + -7, 17, 0, 19, -6, 12, 6, 0, + 0, 2, -6, 0, 0, -10, 46, 0, + 46, 0, 17, 0, 24, 7, 10, 17, + 0, 0, 0, -21, 0, 0, 0, 0, + 2, -4, 0, 4, -10, -7, -12, 4, + 0, -6, 0, 0, 0, -23, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -37, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -32, 0, -36, 0, 0, 0, + 0, -4, 0, 57, -7, -7, 6, 6, + -5, 0, -7, 6, 0, 0, -31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -56, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -36, 0, 35, 0, 0, -21, 0, + 19, 0, -39, -56, -39, -12, 17, 0, + 0, -39, 0, 7, -13, 0, -9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 15, 17, -70, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 27, 0, 4, 0, 0, 0, + 0, 0, 4, 4, -7, -12, 0, -2, + -2, -6, 0, 0, -4, 0, 0, 0, + -12, 0, -5, 0, -13, -12, 0, -14, + -19, -19, -11, 0, -12, 0, -12, 0, + 0, 0, 0, -5, 0, 0, 6, 0, + 4, -6, 0, 2, 0, 0, 0, 6, + -4, 0, 0, 0, -4, 6, 6, -2, + 0, 0, 0, -11, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 7, -4, 0, + -7, 0, -10, 0, 0, -4, 0, 17, + 0, 0, -6, 0, 0, 0, 0, 0, + -2, 2, -4, -4, 0, 0, -6, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, 0, -6, -7, 0, + 0, 0, 0, 0, 2, 0, 0, -4, + 0, -6, -6, -6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, -4, -7, 0, -9, 0, -17, + -4, -17, 12, 0, 0, -12, 6, 12, + 16, 0, -14, -2, -7, 0, -2, -27, + 6, -4, 4, -31, 6, 0, 0, 2, + -30, 0, -31, -5, -50, -4, 0, -29, + 0, 12, 16, 0, 7, 0, 0, 0, + 0, 1, 0, -10, -7, 0, -17, 0, + 0, 0, -6, 0, 0, 0, -6, 0, + 0, 0, 0, 0, -3, -3, 0, -3, + -7, 0, 0, 0, 0, 0, 0, 0, + -6, -6, 0, -4, -7, -5, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, -7, + 0, -4, 0, -12, 6, 0, 0, -7, + 3, 6, 6, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 4, + 0, 0, -6, 0, -6, -4, -7, 0, + 0, 0, 0, 0, 0, 0, 5, 0, + -5, 0, 0, 0, 0, -6, -9, 0, + -11, 0, 17, -4, 2, -18, 0, 0, + 16, -29, -30, -24, -12, 6, 0, -5, + -37, -10, 0, -10, 0, -12, 9, -10, + -37, 0, -16, 0, 0, 3, -2, 5, + -4, 0, 6, 1, -17, -22, 0, -29, + -14, -12, -14, -17, -7, -16, -1, -11, + -16, 3, 0, 2, 0, -6, 0, 0, + 0, 4, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + 0, -3, 0, -2, -6, 0, -10, -13, + -13, -2, 0, -17, 0, 0, 0, 0, + 0, 0, -5, 0, 0, 0, 0, 2, + -3, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 28, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + -11, 0, 0, 0, 0, -29, -17, 0, + 0, 0, -9, -29, 0, 0, -6, 6, + 0, -16, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, -11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, -10, 0, + 0, 0, 0, 7, 0, 4, -12, -12, + 0, -6, -6, -7, 0, 0, 0, 0, + 0, 0, -17, 0, -6, 0, -9, -6, + 0, -13, -14, -17, -5, 0, -12, 0, + -17, 0, 0, 0, 0, 46, 0, 0, + 3, 0, 0, -7, 0, 6, 0, -25, + 0, 0, 0, 0, 0, -54, -10, 19, + 17, -5, -24, 0, 6, -9, 0, -29, + -3, -7, 6, -40, -6, 7, 0, 9, + -20, -9, -21, -19, -24, 0, 0, -35, + 0, 33, 0, 0, -3, 0, 0, 0, + -3, -3, -6, -16, -19, -1, -54, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -6, 0, -3, -6, -9, 0, 0, + -12, 0, -6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -12, 0, 0, 12, + -2, 7, 0, -13, 6, -4, -2, -15, + -6, 0, -7, -6, -4, 0, -9, -10, + 0, 0, -5, -2, -4, -10, -7, 0, + 0, -6, 0, 6, -4, 0, -13, 0, + 0, 0, -12, 0, -10, 0, -10, -10, + 6, 0, 0, 0, 0, 0, 0, 0, + 0, -12, 6, 0, -8, 0, -4, -7, + -18, -4, -4, -4, -2, -4, -7, -2, + 0, 0, 0, 0, 0, -6, -5, -5, + 0, 0, 0, 0, 7, -4, 0, -4, + 0, 0, 0, -4, -7, -4, -5, -7, + -5, 0, 5, 23, -2, 0, -16, 0, + -4, 12, 0, -6, -24, -7, 9, 1, + 0, -27, -10, 6, -10, 4, 0, -4, + -5, -18, 0, -9, 3, 0, 0, -10, + 0, 0, 0, 6, 6, -12, -11, 0, + -10, -6, -9, -6, -6, 0, -10, 3, + -11, -10, 17, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, -6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, -7, + 0, 0, -6, -6, 0, 0, 0, 0, + -6, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + -9, 0, -12, 0, 0, 0, -19, 0, + 4, -13, 12, 1, -4, -27, 0, 0, + -13, -6, 0, -23, -14, -16, 0, 0, + -25, -6, -23, -22, -28, 0, -15, 0, + 5, 39, -7, 0, -13, -6, -2, -6, + -10, -16, -10, -21, -24, -13, -6, 0, + 0, -4, 0, 2, 0, 0, -40, -5, + 17, 13, -13, -21, 0, 2, -18, 0, + -29, -4, -6, 12, -53, -7, 2, 0, + 0, -37, -7, -30, -6, -42, 0, 0, + -40, 0, 34, 2, 0, -4, 0, 0, + 0, 0, -3, -4, -22, -4, 0, -37, + 0, 0, 0, 0, -18, 0, -5, 0, + -2, -16, -27, 0, 0, -3, -9, -17, + -6, 0, -4, 0, 0, 0, 0, -26, + -6, -19, -18, -5, -10, -14, -6, -10, + 0, -12, -5, -19, -9, 0, -7, -11, + -6, -11, 0, 3, 0, -4, -19, 0, + 12, 0, -10, 0, 0, 0, 0, 7, + 0, 4, -12, 24, 0, -6, -6, -7, + 0, 0, 0, 0, 0, 0, -17, 0, + -6, 0, -9, -6, 0, -13, -14, -17, + -5, 0, -12, 5, 23, 0, 0, 0, + 0, 46, 0, 0, 3, 0, 0, -7, + 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -4, -12, 0, 0, 0, 0, 0, -3, + 0, 0, 0, -6, -6, 0, 0, -12, + -6, 0, 0, -12, 0, 10, -3, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 9, 12, 5, -5, 0, -18, + -9, 0, 17, -19, -18, -12, -12, 23, + 10, 6, -50, -4, 12, -6, 0, -6, + 6, -6, -20, 0, -6, 6, -7, -5, + -17, -5, 0, 0, 17, 12, 0, -16, + 0, -32, -7, 17, -7, -22, 2, -7, + -19, -19, -6, 23, 6, 0, -9, 0, + -16, 0, 5, 19, -13, -21, -23, -14, + 17, 0, 2, -42, -5, 6, -10, -4, + -13, 0, -13, -21, -9, -9, -5, 0, + 0, -13, -12, -6, 0, 17, 13, -6, + -32, 0, -32, -8, 0, -20, -33, -2, + -18, -10, -19, -16, 16, 0, 0, -7, + 0, -12, -5, 0, -6, -10, 0, 10, + -19, 6, 0, 0, -31, 0, -6, -13, + -10, -4, -17, -14, -19, -13, 0, -17, + -6, -13, -11, -17, -6, 0, 0, 2, + 27, -10, 0, -17, -6, 0, -6, -12, + -13, -16, -16, -22, -7, -12, 12, 0, + -9, 0, -29, -7, 3, 12, -18, -21, + -12, -19, 19, -6, 3, -54, -10, 12, + -13, -10, -21, 0, -17, -24, -7, -6, + -5, -6, -12, -17, -2, 0, 0, 17, + 16, -4, -37, 0, -35, -13, 14, -22, + -39, -12, -20, -24, -29, -19, 12, 0, + 0, 0, 0, -7, 0, 0, 6, -7, + 12, 4, -11, 12, 0, 0, -18, -2, + 0, -2, 0, 2, 2, -5, 0, 0, + 0, 0, 0, 0, -6, 0, 0, 0, + 0, 5, 17, 1, 0, -7, 0, 0, + 0, 0, -4, -4, -7, 0, 0, 0, + 2, 5, 0, 0, 0, 0, 5, 0, + -5, 0, 22, 0, 10, 2, 2, -7, + 0, 12, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 17, 0, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -35, 0, -6, 10, 0, 17, + 0, 0, 57, 7, -12, -12, 6, 6, + -4, 2, -29, 0, 0, 28, -35, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -39, 22, 81, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -35, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, -11, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, -16, 0, + 0, 2, 0, 0, 6, 74, -12, -5, + 18, 16, -16, 6, 0, 0, 6, 6, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -75, 16, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -16, + 0, 0, 0, -16, 0, 0, 0, 0, + -13, -3, 0, 0, 0, -13, 0, -7, + 0, -27, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -39, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -6, 0, 0, -11, 0, -9, 0, + -16, 0, 0, 0, -10, 6, -7, 0, + 0, -16, -6, -13, 0, 0, -16, 0, + -6, 0, -27, 0, -6, 0, 0, -47, + -11, -23, -6, -21, 0, 0, -39, 0, + -16, -3, 0, 0, 0, 0, 0, 0, + 0, 0, -9, -10, -5, -10, 0, 0, + 0, 0, -13, 0, -13, 7, -6, 12, + 0, -4, -13, -4, -10, -11, 0, -7, + -3, -4, 4, -16, -2, 0, 0, 0, + -51, -5, -8, 0, -13, 0, -4, -27, + -5, 0, 0, -4, -5, 0, 0, 0, + 0, 4, 0, -4, -10, -4, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 0, 0, 0, 0, 0, + 0, -13, 0, -4, 0, 0, 0, -12, + 6, 0, 0, 0, -16, -6, -12, 0, + 0, -16, 0, -6, 0, -27, 0, 0, + 0, 0, -56, 0, -12, -21, -29, 0, + 0, -39, 0, -4, -9, 0, 0, 0, + 0, 0, 0, 0, 0, -6, -9, -3, + -9, 2, 0, 0, 10, -7, 0, 18, + 28, -6, -6, -17, 7, 28, 10, 13, + -16, 7, 24, 7, 17, 13, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 36, 27, -10, -6, 0, -5, + 46, 25, 46, 0, 0, 0, 6, 0, + 0, 21, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 8, + 0, 0, 0, 0, -48, -7, -5, -24, + -28, 0, 0, -39, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, -48, -7, -5, + -24, -28, 0, 0, -23, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, -13, 6, 0, -6, + 5, 10, 6, -17, 0, -1, -5, 6, + 0, 5, 0, 0, 0, 0, -14, 0, + -5, -4, -12, 0, -5, -23, 0, 36, + -6, 0, -13, -4, 0, -4, -10, 0, + -6, -16, -12, -7, 0, 0, 0, -9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 0, 0, 0, -48, + -7, -5, -24, -28, 0, 0, -39, 0, + 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -9, 0, -18, -7, -5, 17, -5, -6, + -23, 2, -3, 2, -4, -16, 1, 13, + 1, 5, 2, 5, -14, -23, -7, 0, + -22, -11, -16, -24, -22, 0, -9, -12, + -7, -7, -5, -4, -7, -4, 0, -4, + -2, 9, 0, 9, -4, 0, 18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, -6, -6, 0, 0, + -16, 0, -3, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -35, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, -6, 0, -7, + 0, 0, 0, 0, -5, 0, 0, -10, + -6, 6, 0, -10, -11, -4, 0, -17, + -4, -13, -4, -7, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -39, 0, 18, 0, 0, -10, 0, + 0, 0, 0, -7, 0, -6, 0, 0, + -3, 0, 0, -4, 0, -13, 0, 0, + 24, -7, -19, -18, 4, 6, 6, -1, + -16, 4, 9, 4, 17, 4, 19, -4, + -16, 0, 0, -23, 0, 0, -17, -16, + 0, 0, -12, 0, -7, -10, 0, -9, + 0, -9, 0, -4, 9, 0, -5, -17, + -6, 21, 0, 0, -5, 0, -12, 0, + 0, 7, -13, 0, 6, -6, 5, 1, + 0, -19, 0, -4, -2, 0, -6, 6, + -5, 0, 0, 0, -24, -7, -13, 0, + -17, 0, 0, -27, 0, 21, -6, 0, + -10, 0, 3, 0, -6, 0, -6, -17, + 0, -6, 6, 0, 0, 0, 0, -4, + 0, 0, 6, -7, 2, 0, 0, -7, + -4, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -36, 0, 13, 0, + 0, -5, 0, 0, 0, 0, 1, 0, + -6, -6, 0, 0, 0, 12, 0, 13, + 0, 0, 0, 0, 0, -36, -33, 2, + 25, 17, 10, -23, 4, 24, 0, 21, + 0, 12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserrat_36 = { +#else +lv_font_t lv_font_montserrat_36 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 40, /*The maximum line height required by the font*/ + .base_line = 7, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -3, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_36*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_38.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_38.c new file mode 100644 index 0000000..883eae5 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_38.c @@ -0,0 +1,8409 @@ +/******************************************************************************* + * Size: 38 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 38 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_38.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_38 + #define LV_FONT_MONTSERRAT_38 1 +#endif + +#if LV_FONT_MONTSERRAT_38 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, + 0xf2, 0xe, 0xff, 0xf1, 0xd, 0xff, 0xf1, 0xd, + 0xff, 0xf0, 0xc, 0xff, 0xf0, 0xc, 0xff, 0xf0, + 0xb, 0xff, 0xe0, 0xa, 0xff, 0xe0, 0xa, 0xff, + 0xd0, 0x9, 0xff, 0xc0, 0x9, 0xff, 0xc0, 0x8, + 0xff, 0xb0, 0x7, 0xff, 0xa0, 0x7, 0xff, 0xa0, + 0x6, 0xff, 0x90, 0x5, 0xee, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xab, 0x50, 0x1f, 0xff, 0xf3, 0x5f, 0xff, 0xf8, + 0x2f, 0xff, 0xf5, 0x6, 0xee, 0x80, + + /* U+0022 "\"" */ + 0x9f, 0xf9, 0x0, 0xb, 0xff, 0x79, 0xff, 0x80, + 0x0, 0xbf, 0xf6, 0x8f, 0xf8, 0x0, 0xa, 0xff, + 0x68, 0xff, 0x70, 0x0, 0xaf, 0xf6, 0x8f, 0xf7, + 0x0, 0xa, 0xff, 0x57, 0xff, 0x70, 0x0, 0x9f, + 0xf5, 0x7f, 0xf6, 0x0, 0x9, 0xff, 0x47, 0xff, + 0x60, 0x0, 0x9f, 0xf4, 0x6f, 0xf5, 0x0, 0x8, + 0xff, 0x36, 0xff, 0x50, 0x0, 0x8f, 0xf3, 0x1, + 0x10, 0x0, 0x0, 0x11, 0x0, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x5, 0xff, 0x50, 0x0, 0x0, + 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x10, 0x0, + 0x0, 0xc, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf0, 0x0, 0x0, 0x0, 0xef, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfd, 0x0, + 0x0, 0x0, 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xa0, 0x0, 0x0, 0x2, 0xff, + 0x80, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x8, 0xbb, 0xbb, 0xdf, + 0xfc, 0xbb, 0xbb, 0xbb, 0xef, 0xfb, 0xbb, 0xbb, + 0x70, 0x0, 0x0, 0x8, 0xff, 0x20, 0x0, 0x0, + 0xb, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf0, 0x0, 0x0, 0x0, 0xdf, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xfe, 0x0, 0x0, + 0x0, 0xe, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xc0, 0x0, 0x0, 0x0, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, + 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x80, 0x0, 0x0, 0x4, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf6, + 0x0, 0x0, 0x0, 0x6f, 0xf4, 0x0, 0x0, 0x0, + 0xbb, 0xbb, 0xbd, 0xff, 0xcb, 0xbb, 0xbb, 0xbd, + 0xff, 0xcb, 0xbb, 0xb5, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xcf, 0xe0, 0x0, 0x0, 0x0, 0xef, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, 0x0, 0x0, + 0x0, 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xa0, 0x0, 0x0, 0x2, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, 0x0, + 0x0, 0x0, 0x4f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x60, 0x0, 0x0, 0x6, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf4, + 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x20, 0x0, 0x0, 0xa, + 0xff, 0x10, 0x0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xfe, 0xc9, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x9f, 0xff, 0xfb, 0x66, 0xff, 0x65, 0x8b, + 0xff, 0xf6, 0x0, 0x3, 0xff, 0xff, 0x40, 0x3, + 0xff, 0x30, 0x0, 0x18, 0xe0, 0x0, 0x8, 0xff, + 0xf5, 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf0, 0x0, 0x3, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, + 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf4, 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfe, 0x30, 0x3, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xfb, 0x54, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x57, 0xdf, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x4, 0xef, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x30, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x30, 0x0, 0xc, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, + 0xc, 0xff, 0xf0, 0x4, 0x90, 0x0, 0x0, 0x3, + 0xff, 0x30, 0x0, 0x1f, 0xff, 0xc0, 0xc, 0xfd, + 0x60, 0x0, 0x3, 0xff, 0x30, 0x1, 0xcf, 0xff, + 0x70, 0x3f, 0xff, 0xfe, 0xa6, 0x45, 0xff, 0x55, + 0x9f, 0xff, 0xfd, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0x0, 0x15, 0xac, 0xef, 0xff, + 0xfe, 0xb7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x88, 0x10, + 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x2, 0xae, 0xfe, 0xb4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0x80, 0x0, 0x0, 0x4, 0xff, + 0xc4, 0x24, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfc, 0x0, 0x0, 0x0, 0xd, 0xfd, 0x0, + 0x0, 0xa, 0xff, 0x10, 0x0, 0x0, 0x0, 0xcf, + 0xf2, 0x0, 0x0, 0x0, 0x3f, 0xf5, 0x0, 0x0, + 0x1, 0xff, 0x60, 0x0, 0x0, 0x8, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, + 0xdf, 0x90, 0x0, 0x0, 0x3f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xe0, 0x0, 0x0, 0x0, 0xbf, + 0xb0, 0x0, 0x0, 0xdf, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xe0, 0x0, 0x0, 0x0, 0xbf, 0xb0, + 0x0, 0x9, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf0, 0x0, 0x0, 0x0, 0xdf, 0x90, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf5, 0x0, 0x0, 0x2, 0xff, 0x60, 0x1, 0xef, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfd, + 0x0, 0x0, 0xa, 0xff, 0x10, 0xb, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xc5, + 0x24, 0xbf, 0xf7, 0x0, 0x6f, 0xf8, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0x90, 0x2, 0xff, 0xc0, 0x0, 0x6d, 0xff, + 0xfc, 0x50, 0x0, 0x0, 0x3, 0xae, 0xfe, 0xb4, + 0x0, 0xc, 0xff, 0x20, 0xa, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf6, 0x0, 0x8f, 0xf9, 0x20, 0x2b, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xb0, 0x1, 0xff, 0x90, 0x0, 0x0, 0xcf, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, 0x10, + 0x6, 0xff, 0x10, 0x0, 0x0, 0x4f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf5, 0x0, 0x9, + 0xfd, 0x0, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xa0, 0x0, 0xb, 0xfb, + 0x0, 0x0, 0x0, 0xe, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xfe, 0x0, 0x0, 0xa, 0xfb, 0x0, + 0x0, 0x0, 0xd, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf3, 0x0, 0x0, 0x9, 0xfd, 0x0, 0x0, + 0x0, 0xf, 0xf7, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x80, 0x0, 0x0, 0x5, 0xff, 0x10, 0x0, 0x0, + 0x3f, 0xf4, 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x80, 0x0, 0x0, 0xbf, + 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xf7, 0x0, 0x1a, 0xff, 0x40, + 0x0, 0x0, 0x7, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0xef, 0xea, 0x30, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfe, 0xba, 0xcf, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf7, 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfa, 0x0, 0x0, + 0x0, 0x8f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x60, 0x0, 0x0, 0x5, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf7, 0x0, + 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0x4f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x90, 0x0, 0x7f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x83, 0xcf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xfd, 0xcf, + 0xff, 0xa0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xf7, 0x0, 0xbf, 0xff, 0xb0, 0x0, + 0x0, 0xef, 0xb1, 0x0, 0x1e, 0xff, 0xe3, 0x0, + 0x0, 0xaf, 0xff, 0xc0, 0x0, 0x3f, 0xfe, 0x0, + 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xc1, 0x8, 0xff, 0xa0, 0x0, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd2, 0xff, 0xf5, + 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfd, 0x0, 0x4, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x50, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0xdf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xf3, 0x0, 0x4, 0xff, 0xff, 0xc6, 0x20, + 0x1, 0x37, 0xef, 0xff, 0xef, 0xff, 0xf4, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x4f, 0xff, 0xf3, 0x0, 0x3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x3f, 0xfc, + 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xec, 0x84, + 0x0, 0x0, 0x0, 0x3d, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0027 "'" */ + 0x9f, 0xf9, 0x9f, 0xf8, 0x8f, 0xf8, 0x8f, 0xf7, + 0x8f, 0xf7, 0x7f, 0xf7, 0x7f, 0xf6, 0x7f, 0xf6, + 0x6f, 0xf5, 0x6f, 0xf5, 0x1, 0x10, + + /* U+0028 "(" */ + 0x0, 0x0, 0x2f, 0xff, 0x50, 0x0, 0xb, 0xff, + 0xc0, 0x0, 0x3, 0xff, 0xf4, 0x0, 0x0, 0xbf, + 0xfd, 0x0, 0x0, 0x1f, 0xff, 0x70, 0x0, 0x7, + 0xff, 0xf1, 0x0, 0x0, 0xcf, 0xfb, 0x0, 0x0, + 0x1f, 0xff, 0x70, 0x0, 0x5, 0xff, 0xf3, 0x0, + 0x0, 0x9f, 0xff, 0x0, 0x0, 0xc, 0xff, 0xc0, + 0x0, 0x0, 0xff, 0xf9, 0x0, 0x0, 0x1f, 0xff, + 0x70, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x4f, + 0xff, 0x40, 0x0, 0x5, 0xff, 0xf3, 0x0, 0x0, + 0x5f, 0xff, 0x30, 0x0, 0x6, 0xff, 0xf3, 0x0, + 0x0, 0x5f, 0xff, 0x30, 0x0, 0x5, 0xff, 0xf3, + 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x3, 0xff, + 0xf6, 0x0, 0x0, 0x1f, 0xff, 0x70, 0x0, 0x0, + 0xff, 0xf9, 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, + 0x0, 0x9f, 0xff, 0x0, 0x0, 0x5, 0xff, 0xf3, + 0x0, 0x0, 0x1f, 0xff, 0x70, 0x0, 0x0, 0xcf, + 0xfb, 0x0, 0x0, 0x7, 0xff, 0xf1, 0x0, 0x0, + 0x1f, 0xff, 0x70, 0x0, 0x0, 0xbf, 0xfd, 0x0, + 0x0, 0x3, 0xff, 0xf4, 0x0, 0x0, 0xb, 0xff, + 0xc0, 0x0, 0x0, 0x2f, 0xff, 0x50, + + /* U+0029 ")" */ + 0x8f, 0xfe, 0x0, 0x0, 0x0, 0xef, 0xf8, 0x0, + 0x0, 0x7, 0xff, 0xf1, 0x0, 0x0, 0x1f, 0xff, + 0x80, 0x0, 0x0, 0x9f, 0xfe, 0x0, 0x0, 0x4, + 0xff, 0xf5, 0x0, 0x0, 0xe, 0xff, 0xa0, 0x0, + 0x0, 0xaf, 0xfe, 0x0, 0x0, 0x5, 0xff, 0xf3, + 0x0, 0x0, 0x2f, 0xff, 0x60, 0x0, 0x0, 0xff, + 0xf9, 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, + 0xaf, 0xfe, 0x0, 0x0, 0x8, 0xff, 0xf0, 0x0, + 0x0, 0x7f, 0xff, 0x10, 0x0, 0x6, 0xff, 0xf2, + 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x5, 0xff, + 0xf3, 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x6, + 0xff, 0xf2, 0x0, 0x0, 0x7f, 0xff, 0x10, 0x0, + 0x8, 0xff, 0xf0, 0x0, 0x0, 0xaf, 0xfe, 0x0, + 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xf9, + 0x0, 0x0, 0x2f, 0xff, 0x60, 0x0, 0x5, 0xff, + 0xf2, 0x0, 0x0, 0xaf, 0xfe, 0x0, 0x0, 0xe, + 0xff, 0xa0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, + 0x9f, 0xfe, 0x0, 0x0, 0x1f, 0xff, 0x80, 0x0, + 0x7, 0xff, 0xf1, 0x0, 0x0, 0xef, 0xf8, 0x0, + 0x0, 0x8f, 0xfe, 0x0, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xfb, 0x0, 0x0, 0x0, 0x2, + 0x40, 0x0, 0x8f, 0xb0, 0x0, 0x24, 0x0, 0xbf, + 0xa2, 0x8, 0xfb, 0x1, 0x9f, 0xe0, 0x1e, 0xff, + 0xf8, 0x8f, 0xb6, 0xef, 0xff, 0x30, 0x7, 0xef, + 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x1, 0x8f, + 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xfb, 0x30, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x1, 0xef, 0xfe, 0x78, 0xfb, + 0x5d, 0xff, 0xf3, 0xa, 0xf9, 0x10, 0x8f, 0xb0, + 0x7, 0xfd, 0x0, 0x12, 0x0, 0x8, 0xfb, 0x0, + 0x1, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xfa, 0x0, 0x0, + 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x3, 0x66, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, + 0x0, + + /* U+002C "," */ + 0x0, 0x35, 0x20, 0x9, 0xff, 0xf4, 0x1f, 0xff, + 0xfb, 0x1f, 0xff, 0xfc, 0xb, 0xff, 0xf9, 0x0, + 0xcf, 0xf4, 0x0, 0xdf, 0xe0, 0x1, 0xff, 0x90, + 0x5, 0xff, 0x40, 0x9, 0xfe, 0x0, 0xd, 0xf9, + 0x0, + + /* U+002D "-" */ + 0x11, 0x11, 0x11, 0x11, 0x11, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x6d, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+002E "." */ + 0x0, 0x0, 0x0, 0x5, 0xef, 0xc1, 0x1f, 0xff, + 0xfa, 0x3f, 0xff, 0xfc, 0xe, 0xff, 0xf9, 0x3, + 0xdf, 0xa0, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x2, 0x8c, 0xef, 0xfd, 0xa4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xb7, + 0x56, 0x9e, 0xff, 0xff, 0x70, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0x20, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x30, 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, 0xef, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf4, + 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xa0, 0xa, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x0, + 0xdf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf3, 0xf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x51, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf7, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x72, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf7, 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x70, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, + 0xd, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x30, 0xaf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf0, 0x5, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfa, 0x0, 0xe, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x40, 0x0, 0x7f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xd0, 0x0, 0x0, 0xdf, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xfb, 0x75, 0x69, 0xef, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x28, 0xce, 0xff, 0xda, 0x50, + 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0x12, 0x44, 0x44, 0x4c, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, 0x0, + 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x10, 0x0, 0x0, 0xb, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, + 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, 0x0, 0x0, + 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x10, 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, 0x0, + 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, 0xf1, + + /* U+0032 "2" */ + 0x0, 0x0, 0x4, 0x8c, 0xef, 0xfe, 0xd9, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1, + 0xdf, 0xff, 0xfe, 0x97, 0x55, 0x7a, 0xff, 0xff, + 0xf5, 0x0, 0x1b, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xd0, 0x0, 0x9, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x20, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, + + /* U+0033 "3" */ + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5b, 0xbb, 0xdf, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xdf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xe0, 0x6, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfa, 0x1, 0xef, 0xe7, 0x10, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x30, 0x9f, + 0xff, 0xff, 0xc8, 0x75, 0x56, 0xae, 0xff, 0xff, + 0x90, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x5b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x2, 0x6a, 0xde, 0xff, 0xec, 0x95, 0x0, 0x0, + 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x5, + 0x88, 0x70, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xc0, 0x0, 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfe, 0x10, 0x0, 0x0, 0xa, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xe0, 0x0, 0x0, 0xa, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x13, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x3d, 0xff, 0xe3, 0x33, 0x33, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xe0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x6f, 0xff, 0x54, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xfe, 0xc9, + 0x61, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x1, 0x44, 0x44, 0x44, 0x45, 0x79, 0xdf, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf5, 0x1, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x10, 0x9f, 0xfb, 0x40, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xa0, 0x2f, + 0xff, 0xff, 0xea, 0x76, 0x56, 0x8c, 0xff, 0xff, + 0xe1, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x18, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x48, 0xbd, 0xef, 0xfd, 0xb7, 0x20, 0x0, + 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xfd, + 0xb7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0xa6, 0x43, + 0x45, 0x8d, 0xe1, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x3f, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x5a, 0xdf, 0xfe, 0xc8, 0x30, 0x0, + 0x0, 0x1f, 0xff, 0xb0, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x20, 0x0, 0x2f, 0xff, 0xa8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x2f, + 0xff, 0xef, 0xff, 0xb5, 0x10, 0x3, 0x7e, 0xff, + 0xfe, 0x10, 0x1f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xa0, 0xf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, + 0xe, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf4, 0xb, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf6, 0x7, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf6, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf3, 0x0, 0xbf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0x80, 0x0, 0x6, 0xff, 0xff, 0xb5, 0x21, + 0x13, 0x7e, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, + 0xef, 0xfe, 0xb7, 0x10, 0x0, 0x0, + + /* U+0037 "7" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2d, + 0xff, 0xd4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x6f, + 0xff, 0xc0, 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf4, 0xd, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfd, 0x0, 0xdf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x60, 0xc, 0xee, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x0, 0x48, 0xcd, 0xff, 0xed, 0xa5, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x5f, 0xff, 0xfc, 0x62, 0x10, 0x14, + 0x9f, 0xff, 0xfc, 0x0, 0x0, 0xef, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0x50, 0x3, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xa0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xd0, 0x4, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xc0, + 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x90, 0x0, 0xbf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0x20, 0x0, 0x2e, + 0xff, 0xfc, 0x52, 0x0, 0x13, 0x8f, 0xff, 0xf7, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xed, 0xef, 0xff, 0xff, + 0xe5, 0x0, 0x1, 0xdf, 0xff, 0xe7, 0x20, 0x0, + 0x0, 0x4b, 0xff, 0xff, 0x50, 0x9, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, + 0xf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf7, 0x3f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfb, 0x4f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfc, 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfb, 0xf, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf7, 0xa, + 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf1, 0x1, 0xef, 0xff, 0xfa, 0x52, 0x10, + 0x13, 0x7d, 0xff, 0xff, 0x70, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x40, 0x0, 0x0, 0x0, 0x1, 0x59, 0xcd, + 0xff, 0xed, 0xb7, 0x20, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x4, 0x9c, 0xef, 0xed, 0xa5, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x8f, 0xff, 0xfa, 0x41, 0x1, 0x37, 0xdf, 0xff, + 0xc0, 0x0, 0x3f, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x80, 0x9, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, 0xdf, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf8, 0xe, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xe0, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x2b, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf5, 0x5f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x70, 0xcf, 0xff, 0xf9, 0x41, + 0x0, 0x27, 0xdf, 0xff, 0xff, 0xf8, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x4f, 0xff, + 0x90, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x13, 0xff, 0xf9, 0x0, 0x0, 0x27, 0xbe, 0xff, + 0xec, 0x83, 0x0, 0x4f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xb0, 0x0, 0x1, 0x20, 0x0, + 0x0, 0x0, 0x4, 0xdf, 0xff, 0xe1, 0x0, 0x0, + 0x9f, 0xc7, 0x43, 0x45, 0x8d, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x59, 0xce, 0xff, 0xec, 0x95, 0x0, 0x0, 0x0, + 0x0, + + /* U+003A ":" */ + 0x3, 0xdf, 0xa0, 0xe, 0xff, 0xf9, 0x3f, 0xff, + 0xfc, 0x1f, 0xff, 0xf9, 0x5, 0xef, 0xc1, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xc1, + 0x1f, 0xff, 0xfa, 0x3f, 0xff, 0xfc, 0xe, 0xff, + 0xf9, 0x3, 0xdf, 0xa0, + + /* U+003B ";" */ + 0x3, 0xdf, 0xa0, 0xe, 0xff, 0xf9, 0x3f, 0xff, + 0xfc, 0x1f, 0xff, 0xf9, 0x5, 0xef, 0xc1, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xa1, + 0xe, 0xff, 0xf9, 0x2f, 0xff, 0xfc, 0xe, 0xff, + 0xfb, 0x4, 0xef, 0xf6, 0x0, 0xbf, 0xf1, 0x0, + 0xff, 0xc0, 0x3, 0xff, 0x60, 0x8, 0xff, 0x10, + 0xc, 0xfb, 0x0, 0x6, 0x63, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x28, 0xe9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5b, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x9e, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x6, + 0xcf, 0xff, 0xff, 0xe9, 0x30, 0x0, 0x0, 0x39, + 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xf9, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xfc, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, + 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, + 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x9f, 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+003D "=" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, + + /* U+003E ">" */ + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7e, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xc6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf9, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, 0xff, + 0xfd, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, + 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0xcf, 0xff, 0xff, 0xd7, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x9e, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x39, 0xef, + 0xff, 0xff, 0xb5, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0xfd, 0x71, 0x0, 0x0, 0x5, 0xbf, 0xff, + 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7c, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, 0xda, 0x50, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x2d, 0xff, + 0xff, 0xb7, 0x43, 0x34, 0x8e, 0xff, 0xff, 0x60, + 0x3e, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xd0, 0x0, 0x9a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xaa, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xb9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xfc, + 0x20, 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0x9c, + 0xee, 0xff, 0xed, 0xa8, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xec, 0x98, 0x78, 0x8a, + 0xdf, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xe8, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x15, 0xbf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xfa, 0x0, 0x0, 0x0, 0x49, 0xcd, + 0xdb, 0x83, 0x0, 0x1e, 0xee, 0x22, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x3, + 0xcf, 0xff, 0xff, 0xff, 0xfb, 0x22, 0xff, 0xf3, + 0x2, 0xff, 0xe1, 0x0, 0x0, 0x3f, 0xfe, 0x10, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x4f, 0xff, 0x30, 0x5, 0xff, 0x90, 0x0, 0xb, + 0xff, 0x50, 0x0, 0x4, 0xff, 0xff, 0xa4, 0x10, + 0x25, 0xbf, 0xff, 0xff, 0xf3, 0x0, 0xb, 0xff, + 0x20, 0x1, 0xff, 0xd0, 0x0, 0x0, 0xef, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x30, + 0x0, 0x3f, 0xf8, 0x0, 0x7f, 0xf6, 0x0, 0x0, + 0x7f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf3, 0x0, 0x0, 0xdf, 0xd0, 0xb, 0xff, + 0x10, 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x30, 0x0, 0x8, 0xff, + 0x10, 0xef, 0xe0, 0x0, 0x1, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, + 0x0, 0x5f, 0xf4, 0xf, 0xfb, 0x0, 0x0, 0x4f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x30, 0x0, 0x3, 0xff, 0x51, 0xff, 0xa0, + 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf3, 0x0, 0x0, 0x2f, 0xf6, + 0x2f, 0xf9, 0x0, 0x0, 0x5f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x30, 0x0, + 0x2, 0xff, 0x71, 0xff, 0xa0, 0x0, 0x4, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x2f, 0xf6, 0xf, 0xfb, 0x0, + 0x0, 0x2f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x30, 0x0, 0x4, 0xff, 0x40, + 0xef, 0xe0, 0x0, 0x0, 0xdf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, + 0x7f, 0xf2, 0xb, 0xff, 0x20, 0x0, 0x7, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x30, 0x0, 0xb, 0xfe, 0x0, 0x7f, 0xf7, 0x0, + 0x0, 0x1e, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf5, 0x0, 0x2, 0xff, 0x90, 0x1, + 0xff, 0xd0, 0x0, 0x0, 0x4f, 0xff, 0xf8, 0x20, + 0x0, 0x29, 0xff, 0xed, 0xff, 0xd1, 0x2, 0xdf, + 0xf2, 0x0, 0xa, 0xff, 0x50, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xed, 0xff, 0xff, 0xf3, 0x7f, 0xff, + 0xfd, 0xff, 0xf8, 0x0, 0x0, 0x3f, 0xfe, 0x10, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x5, 0xbe, 0xff, + 0xda, 0x40, 0x0, 0x0, 0x8d, 0xfe, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xe8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xec, 0x98, 0x88, 0x9b, 0xef, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0x9c, + 0xef, 0xff, 0xec, 0x96, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x7b, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, + 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0xcf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x10, 0x5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x90, 0x0, 0xd, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf2, 0x0, 0x0, 0x6f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x0, + 0x0, 0x0, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, + 0x7, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xd0, 0x0, 0x0, 0x7, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, + 0x0, 0x0, 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x0, 0x0, + 0x6f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf3, 0x0, 0xd, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xb0, 0x5, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x20, 0xcf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfa, + + /* U+0042 "B" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xa6, 0x10, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x1, 0x26, 0xcf, 0xff, 0xf9, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x10, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x50, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x60, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x20, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x25, + 0xbf, 0xff, 0xe2, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x20, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x5b, 0xff, 0xff, 0x70, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf8, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfb, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfa, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x5a, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x91, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xca, 0x61, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, 0xde, 0xff, + 0xec, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xfd, 0x97, 0x55, 0x79, + 0xef, 0xff, 0xff, 0x60, 0x0, 0x1, 0xdf, 0xff, + 0xfb, 0x30, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, + 0x80, 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xf7, 0x0, 0x0, 0x7f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0xc, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xf7, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0x30, 0x0, + 0x0, 0x0, 0x4, 0xcf, 0xff, 0x80, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xfd, 0x96, 0x55, 0x79, 0xef, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x6a, 0xde, 0xff, 0xec, 0x95, 0x0, + 0x0, 0x0, + + /* U+0044 "D" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdb, + 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0xff, 0xfd, 0x44, 0x44, 0x44, 0x44, 0x57, + 0xbf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xf6, 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xf3, + 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x60, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf1, 0xf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x50, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf7, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x80, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf8, 0xf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x70, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x10, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xc0, 0xf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, + 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfd, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x30, 0x0, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0x70, + 0x0, 0xf, 0xff, 0xd4, 0x44, 0x44, 0x44, 0x45, + 0x7b, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x40, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xff, 0xfd, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x30, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0xf, 0xff, 0xd2, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xd4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, + + /* U+0046 "F" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xff, + 0xd4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xf, 0xff, + 0xd3, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xce, 0xff, + 0xed, 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xfe, 0x97, 0x55, 0x78, + 0xcf, 0xff, 0xff, 0xa0, 0x0, 0x1, 0xdf, 0xff, + 0xfb, 0x40, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xb0, 0x0, 0xb, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdb, 0x0, 0x0, 0x6f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, + 0x20, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x1f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf1, 0xe, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf1, 0x5, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf1, 0x0, 0xef, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, + 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf1, 0x0, 0xb, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf1, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0x40, 0x0, + 0x0, 0x0, 0x1, 0x7e, 0xff, 0xf1, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xfe, 0x97, 0x55, 0x68, 0xbf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x6a, 0xce, 0xff, 0xec, 0x96, 0x10, + 0x0, 0x0, + + /* U+0048 "H" */ + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xf, 0xff, 0xd4, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + + /* U+0049 "I" */ + 0xf, 0xff, 0xc0, 0xff, 0xfc, 0xf, 0xff, 0xc0, + 0xff, 0xfc, 0xf, 0xff, 0xc0, 0xff, 0xfc, 0xf, + 0xff, 0xc0, 0xff, 0xfc, 0xf, 0xff, 0xc0, 0xff, + 0xfc, 0xf, 0xff, 0xc0, 0xff, 0xfc, 0xf, 0xff, + 0xc0, 0xff, 0xfc, 0xf, 0xff, 0xc0, 0xff, 0xfc, + 0xf, 0xff, 0xc0, 0xff, 0xfc, 0xf, 0xff, 0xc0, + 0xff, 0xfc, 0xf, 0xff, 0xc0, 0xff, 0xfc, 0xf, + 0xff, 0xc0, 0xff, 0xfc, 0xf, 0xff, 0xc0, 0xff, + 0xfc, + + /* U+004A "J" */ + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf9, 0x0, 0xc8, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x50, 0xaf, 0xf9, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf1, 0x1e, 0xff, 0xfe, 0x85, 0x35, + 0xaf, 0xff, 0xf9, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x3, 0x8c, + 0xef, 0xed, 0x93, 0x0, 0x0, + + /* U+004B "K" */ + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xe2, 0x0, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe2, + 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xe3, 0x0, 0x0, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfc, 0x0, 0x0, 0x4f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, + 0x0, 0x4f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x3f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfc, 0x3f, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xef, 0xff, 0xfb, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf9, + 0x6, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf9, 0x0, 0x8, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0xa, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf3, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xe1, + 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xc0, + + /* U+004C "L" */ + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xd4, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, + + /* U+004D "M" */ + 0xf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf4, 0xf, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf4, 0xf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf4, 0xf, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xf4, 0xf, 0xff, 0xcf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, 0xff, 0xf4, + 0xf, 0xff, 0xa8, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xb6, 0xff, 0xf4, 0xf, + 0xff, 0xa0, 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x26, 0xff, 0xf4, 0xf, 0xff, + 0xa0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf8, 0x6, 0xff, 0xf4, 0xf, 0xff, 0xa0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xd0, 0x6, 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x2, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x40, + 0x6, 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x0, 0x7f, + 0xff, 0x40, 0x0, 0x0, 0xef, 0xfb, 0x0, 0x6, + 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x0, 0xd, 0xff, + 0xd0, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x5, 0xff, + 0xf4, 0xf, 0xff, 0xa0, 0x0, 0x4, 0xff, 0xf8, + 0x0, 0x2f, 0xff, 0x70, 0x0, 0x5, 0xff, 0xf4, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0xaf, 0xff, 0x20, + 0xbf, 0xfd, 0x0, 0x0, 0x5, 0xff, 0xf4, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0x1f, 0xff, 0xb5, 0xff, + 0xf4, 0x0, 0x0, 0x5, 0xff, 0xf4, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x5, 0xff, 0xf4, 0xf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x5, 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xcd, 0x30, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf4, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + + /* U+004E "N" */ + 0xf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc7, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0xaf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0xc, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x1, 0xef, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x3f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x5, 0xff, 0xff, 0x60, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0xb, 0xff, 0xfe, + 0x10, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xd0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xfa, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x80, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf5, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfd, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, 0xce, 0xff, + 0xec, 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xfd, 0x96, 0x55, 0x69, 0xdf, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xfb, 0x30, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, + 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfd, 0x0, + 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x40, 0xb, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0xe, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xd0, 0x1f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf0, 0x2f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf0, 0x2f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf0, 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf0, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xd0, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0x5, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, 0xef, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfd, 0x0, 0x0, 0x6f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf5, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfb, + 0x30, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xfd, + 0x96, 0x55, 0x69, 0xdf, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xce, 0xff, 0xec, + 0xa5, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xb7, + 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xff, 0xfd, 0x44, 0x44, 0x44, + 0x45, 0x7a, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xf4, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xc0, 0xf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x10, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf4, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf6, 0xf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x40, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf1, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xd4, 0x44, 0x44, 0x44, 0x57, + 0xaf, 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xdb, 0x83, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xce, 0xff, + 0xec, 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xd9, 0x65, 0x56, 0x9e, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x4, + 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf5, 0x0, 0x0, 0xe, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xd0, 0x0, 0x5, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x40, 0x0, 0xaf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf9, 0x0, 0xe, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xd0, 0x1, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf0, 0x2, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x10, 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, + 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x0, + 0xb, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, + 0x6f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf5, 0x0, 0x1, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfe, 0x0, 0x0, 0x8, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0xd, + 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, 0x2a, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xfc, 0x75, 0x33, 0x57, 0xcf, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xce, 0xff, 0xff, 0xfe, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x1, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x61, 0x0, 0x38, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x7c, 0xef, 0xec, 0x82, 0x0, + 0x0, + + /* U+0052 "R" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xb7, + 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xff, 0xfd, 0x44, 0x44, 0x44, + 0x45, 0x7a, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xf4, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xc0, 0xf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x10, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf4, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf6, 0xf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x50, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf2, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xd2, 0x22, 0x22, 0x22, 0x35, + 0x9e, 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe1, + 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xb0, 0x0, 0xf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x60, + 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0x20, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, 0x0, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf9, + + /* U+0053 "S" */ + 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xed, 0xb7, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x9f, 0xff, 0xfc, 0x74, 0x33, 0x45, + 0x9d, 0xff, 0xf6, 0x0, 0x2, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xe0, 0x0, 0x8, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xc8, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xc7, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x9d, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0xbf, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf0, 0x5, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xc0, 0xd, + 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0x60, 0x4f, 0xff, 0xff, 0xd9, 0x54, 0x33, + 0x46, 0xbf, 0xff, 0xfc, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, 0xde, + 0xff, 0xec, 0x95, 0x0, 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x23, 0x44, 0x44, 0x44, 0x44, 0xcf, + 0xff, 0x44, 0x44, 0x44, 0x44, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x2f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, + 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf2, 0xf, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, + 0xb, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xc0, 0x7, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x70, + 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x10, 0x0, 0x7f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf8, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xea, 0x75, 0x57, 0xae, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x9c, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xc, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfd, 0x0, 0x5f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0xef, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xe0, 0x0, 0x7, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf8, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, + 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, + 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x20, 0x0, 0x0, 0xc, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf9, 0x0, 0x0, 0x4, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf0, + 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfe, 0x0, 0x9, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf5, 0x1, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xc0, 0x8f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x4e, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0057 "W" */ + 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x64, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf1, 0xe, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xfb, 0x0, 0x9f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x60, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0xe, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xfb, 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x2f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x50, 0x0, + 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xa0, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf0, 0x0, 0x0, 0xd, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf4, 0x6, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x9f, 0xfe, 0x0, 0x1f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x50, 0x0, 0x0, 0x3, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, + 0xbf, 0xfe, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, 0x0, 0x0, + 0x4, 0xff, 0xf3, 0x0, 0x6, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x50, 0x0, 0x0, 0xaf, 0xfe, 0x0, + 0x0, 0xf, 0xff, 0x90, 0x0, 0x0, 0x5f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, + 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf1, 0x0, 0x5, 0xff, 0xf3, + 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x1, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x60, 0x0, 0xbf, 0xfd, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x1f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x0, 0xb, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf1, 0x6, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf5, 0x1, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x60, 0xcf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xa0, + 0x6f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfc, 0x1f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xc, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf9, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf7, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfe, 0x10, 0x0, 0xcf, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf4, 0x0, 0x0, 0x1e, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x80, 0x0, 0x0, + 0x4, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x40, 0x0, 0x8, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xe1, 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x1, 0xef, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x8c, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xaf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x5, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf2, 0x0, 0x9f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x50, + 0x0, 0xd, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfa, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, 0x0, + 0x6, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfe, 0x10, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xb0, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf6, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xc0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, + 0x1e, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf8, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xc0, 0x0, 0x0, 0xef, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, + 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0x10, 0x3f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xa0, 0xdf, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+005A "Z" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x61, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0xef, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x54, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x34, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, + + /* U+005B "[" */ + 0xf, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xfa, + 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, + 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xf0, + + /* U+005C "\\" */ + 0x4f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x30, + + /* U+005D "]" */ + 0x4f, 0xff, 0xff, 0xff, 0xa4, 0xff, 0xff, 0xff, + 0xfa, 0x4f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, + 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, + 0x4f, 0xff, 0xff, 0xff, 0xa4, 0xff, 0xff, 0xff, + 0xfa, 0x4f, 0xff, 0xff, 0xff, 0xa0, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0x4, 0x88, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xa7, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x31, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfc, 0x0, 0x9f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf6, 0x0, 0x3f, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xe0, 0x0, 0xc, 0xff, 0x10, + 0x0, 0x0, 0x5, 0xff, 0x80, 0x0, 0x5, 0xff, + 0x70, 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, 0x0, + 0xef, 0xe0, 0x0, 0x0, 0x3f, 0xfa, 0x0, 0x0, + 0x0, 0x8f, 0xf5, 0x0, 0x0, 0xaf, 0xf4, 0x0, + 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x1, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, 0x8, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x4, 0xff, 0xa0, 0xe, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf1, + + /* U+005F "_" */ + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+0060 "`" */ + 0x1c, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xfa, 0x0, 0x0, 0x0, + 0x1, 0xbf, 0xfb, 0x0, + + /* U+0061 "a" */ + 0x0, 0x0, 0x16, 0xad, 0xef, 0xfe, 0xb7, 0x10, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0xe, 0xff, 0xd8, + 0x42, 0x12, 0x5b, 0xff, 0xff, 0x50, 0x0, 0x6c, + 0x30, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf6, 0x0, 0x0, 0x3, 0x67, + 0x89, 0x99, 0x99, 0xaf, 0xff, 0x60, 0x0, 0x6d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x6f, 0xff, 0xe6, 0x20, 0x0, 0x0, 0x3, + 0xff, 0xf6, 0xd, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x60, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf6, 0xf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x60, 0xef, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, + 0x9, 0xff, 0xf9, 0x10, 0x0, 0x1, 0x8f, 0xff, + 0xff, 0x60, 0x1d, 0xff, 0xff, 0xb9, 0x9b, 0xff, + 0xfc, 0xff, 0xf6, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x1f, 0xff, 0x60, 0x0, 0x4, 0xad, + 0xff, 0xec, 0x93, 0x0, 0xff, 0xf6, + + /* U+0062 "b" */ + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x10, 0x4, 0x9d, 0xef, 0xec, 0x72, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x13, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x8f, 0xff, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x84, 0x23, 0x5a, + 0xff, 0xff, 0xe2, 0x0, 0x8f, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xfc, 0x0, 0x8f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0x50, 0x8f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x8f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, + 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf3, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf4, 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf3, 0x8f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, 0x8f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xb0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0x50, 0x8f, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xfc, 0x0, + 0x8f, 0xff, 0xff, 0xfe, 0x84, 0x23, 0x5a, 0xff, + 0xff, 0xe2, 0x0, 0x8f, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x8f, 0xff, + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, + 0x0, 0x8f, 0xff, 0x0, 0x4, 0x9d, 0xff, 0xec, + 0x82, 0x0, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x0, 0x16, 0xbd, 0xff, 0xec, 0x82, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2e, + 0xff, 0xff, 0xa5, 0x32, 0x48, 0xef, 0xff, 0xd0, + 0x0, 0xcf, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xc2, 0x6, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa6, 0x0, 0xd, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa6, 0x0, 0x0, 0xcf, + 0xff, 0xc2, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xc2, + 0x0, 0x2e, 0xff, 0xff, 0xa5, 0x32, 0x48, 0xef, + 0xff, 0xc0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x17, 0xbe, 0xff, 0xec, 0x82, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x28, 0xce, 0xfe, 0xd9, 0x40, + 0x3, 0xff, 0xf7, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x23, 0xff, 0xf7, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, + 0xf7, 0x0, 0x3f, 0xff, 0xff, 0xa5, 0x33, 0x49, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xdf, 0xff, 0xc2, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf7, 0x7, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf7, 0xd, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf7, 0x2f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf7, + 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf7, 0x6f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x6f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf7, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x1f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf7, 0xd, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf7, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf7, 0x0, 0xdf, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf7, + 0x0, 0x3f, 0xff, 0xfd, 0x61, 0x0, 0x16, 0xcf, + 0xff, 0xff, 0xf7, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xf7, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x38, 0xce, 0xfe, 0xda, + 0x50, 0x0, 0xff, 0xf7, + + /* U+0065 "e" */ + 0x0, 0x0, 0x0, 0x28, 0xce, 0xff, 0xda, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xc5, 0x20, 0x14, 0x9f, 0xff, + 0xf7, 0x0, 0x0, 0xdf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xf3, 0x0, 0x6f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0xd, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x11, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf6, 0x4f, 0xff, 0xb9, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x9f, 0xff, 0x86, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x94, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0xd, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x2c, 0xf4, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xa6, 0x32, 0x35, 0xaf, + 0xff, 0xf2, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x19, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6b, 0xdf, 0xfe, 0xd9, 0x40, + 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x6, 0xbe, 0xff, 0xc7, 0x10, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x7, 0xff, 0xfb, 0x30, 0x4, 0x90, 0x0, 0x0, + 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x0, 0x38, 0xce, 0xfe, 0xda, 0x50, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0xbf, 0xfb, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, + 0xfb, 0x0, 0x5f, 0xff, 0xff, 0x95, 0x32, 0x37, + 0xcf, 0xff, 0xff, 0xfb, 0x1, 0xef, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xfb, 0x9, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xfb, 0xe, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfb, 0x3f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, + 0x5f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfb, 0x6f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x5f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfb, 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfb, 0xe, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, 0x8, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xfb, 0x1, 0xef, 0xff, 0xb1, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xfb, 0x0, 0x4f, 0xff, + 0xff, 0xa5, 0x32, 0x47, 0xdf, 0xff, 0xff, 0xfb, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xef, 0xfb, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x50, 0xef, 0xfa, 0x0, 0x0, + 0x0, 0x38, 0xce, 0xff, 0xda, 0x50, 0x0, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, + 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xf0, 0x0, 0x4f, 0xd5, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0x80, 0x1, 0xef, 0xff, + 0xea, 0x64, 0x22, 0x36, 0xaf, 0xff, 0xfd, 0x10, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, + 0x1, 0x69, 0xce, 0xff, 0xed, 0xa7, 0x10, 0x0, + 0x0, + + /* U+0068 "h" */ + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x10, 0x5, 0xad, 0xef, 0xeb, 0x71, + 0x0, 0x0, 0x8f, 0xff, 0x14, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x8f, 0xff, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, + 0xff, 0xfc, 0x74, 0x34, 0x8e, 0xff, 0xff, 0x50, + 0x8f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xd0, 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf2, 0x8f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, 0x8f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, + 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + + /* U+0069 "i" */ + 0x0, 0x57, 0x20, 0xa, 0xff, 0xf4, 0x1f, 0xff, + 0xfa, 0x1f, 0xff, 0xf9, 0x6, 0xff, 0xd1, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, 0x8, 0xff, + 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, + 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, + 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, + 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, + 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, + 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, + 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x0, 0x47, 0x40, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xe3, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, + 0x7, 0x83, 0x12, 0xaf, 0xff, 0xb0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x5f, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x5, 0xbe, 0xff, 0xd9, 0x20, 0x0, + + /* U+006B "k" */ + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd1, 0x8, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd1, + 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xd1, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xd1, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x1, 0xcf, 0xff, 0xc1, 0x0, 0x0, + 0x8, 0xff, 0xf1, 0x0, 0x1, 0xdf, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x2, 0xef, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, + 0x3, 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x14, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf7, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0x62, 0xef, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0x50, 0x4, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x8, 0xff, 0xff, 0x40, + 0x0, 0x7, 0xff, 0xff, 0x30, 0x0, 0x0, 0x8f, + 0xff, 0x40, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x10, + 0x0, 0x8, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfb, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf8, 0x0, 0x8, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, + 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf2, 0x8, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd1, + + /* U+006C "l" */ + 0x8f, 0xff, 0x18, 0xff, 0xf1, 0x8f, 0xff, 0x18, + 0xff, 0xf1, 0x8f, 0xff, 0x18, 0xff, 0xf1, 0x8f, + 0xff, 0x18, 0xff, 0xf1, 0x8f, 0xff, 0x18, 0xff, + 0xf1, 0x8f, 0xff, 0x18, 0xff, 0xf1, 0x8f, 0xff, + 0x18, 0xff, 0xf1, 0x8f, 0xff, 0x18, 0xff, 0xf1, + 0x8f, 0xff, 0x18, 0xff, 0xf1, 0x8f, 0xff, 0x18, + 0xff, 0xf1, 0x8f, 0xff, 0x18, 0xff, 0xf1, 0x8f, + 0xff, 0x18, 0xff, 0xf1, 0x8f, 0xff, 0x18, 0xff, + 0xf1, 0x8f, 0xff, 0x18, 0xff, 0xf1, + + /* U+006D "m" */ + 0x8f, 0xff, 0x0, 0x16, 0xbd, 0xff, 0xda, 0x40, + 0x0, 0x0, 0x3, 0x8c, 0xef, 0xed, 0x93, 0x0, + 0x0, 0x8f, 0xff, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x8f, 0xff, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x8f, 0xff, 0xff, 0xf8, 0x31, + 0x2, 0x7e, 0xff, 0xfd, 0xef, 0xff, 0x83, 0x11, + 0x38, 0xff, 0xff, 0xa0, 0x8f, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x8f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x8f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfb, 0x8f, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfd, + 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfe, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x8f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x8f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfe, + + /* U+006E "n" */ + 0x8f, 0xff, 0x0, 0x6, 0xad, 0xff, 0xeb, 0x71, + 0x0, 0x0, 0x8f, 0xff, 0x6, 0xef, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x8f, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, + 0xff, 0xfa, 0x41, 0x1, 0x5c, 0xff, 0xff, 0x50, + 0x8f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xd0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf2, 0x8f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf6, 0x8f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, + 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + + /* U+006F "o" */ + 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xec, 0x82, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xa5, 0x33, 0x49, + 0xef, 0xff, 0xf3, 0x0, 0x0, 0xdf, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xfe, 0x10, 0x6, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x80, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x1f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf3, + 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf6, 0x6f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf8, 0x6f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf7, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf6, 0x1f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf3, 0xd, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xe0, 0x6, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x80, 0x0, 0xcf, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xfe, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xa5, 0x33, 0x49, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xec, + 0x82, 0x0, 0x0, 0x0, + + /* U+0070 "p" */ + 0x8f, 0xff, 0x0, 0x5, 0xad, 0xff, 0xec, 0x72, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x4, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x8f, 0xff, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x8f, 0xff, 0xff, 0xfc, 0x61, 0x0, 0x27, + 0xef, 0xff, 0xe2, 0x0, 0x8f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xfc, 0x0, 0x8f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x50, 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xc0, 0x8f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, + 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf3, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x8f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf4, 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf3, 0x8f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, 0x8f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xb0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0x50, 0x8f, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xfc, 0x0, + 0x8f, 0xff, 0xff, 0xfe, 0x94, 0x23, 0x5b, 0xff, + 0xff, 0xe2, 0x0, 0x8f, 0xff, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x8f, 0xff, + 0x12, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, + 0x0, 0x8f, 0xff, 0x10, 0x4, 0x9d, 0xff, 0xec, + 0x82, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x0, 0x28, 0xce, 0xfe, 0xd9, 0x40, + 0x0, 0xff, 0xf7, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0xff, 0xf7, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xf7, 0x0, 0x3f, 0xff, 0xff, 0xa5, 0x33, 0x49, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xdf, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf7, 0x7, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf7, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf7, 0x2f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, + 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf7, 0x6f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x6f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf7, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x1f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0xd, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf7, 0x0, 0xdf, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf7, + 0x0, 0x3f, 0xff, 0xff, 0xa5, 0x33, 0x49, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0xff, 0xf7, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x23, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x38, 0xce, 0xfe, 0xd9, + 0x30, 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf7, + + /* U+0072 "r" */ + 0x8f, 0xff, 0x0, 0x5, 0xad, 0xe4, 0x8f, 0xff, + 0x3, 0xdf, 0xff, 0xf4, 0x8f, 0xff, 0x4f, 0xff, + 0xff, 0xf4, 0x8f, 0xff, 0xef, 0xff, 0xb8, 0x72, + 0x8f, 0xff, 0xff, 0x91, 0x0, 0x0, 0x8f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x3, 0x9c, 0xef, 0xfe, 0xc9, 0x51, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0xdf, 0xff, 0xc5, 0x21, + 0x12, 0x59, 0xef, 0x50, 0x3, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x0, 0x6, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0xb7, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xea, + 0x50, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x3, 0x69, + 0xcf, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, + 0xd8, 0x10, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, + 0x7, 0xff, 0xfb, 0x74, 0x21, 0x24, 0x8f, 0xff, + 0xf5, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x59, 0xce, 0xff, + 0xed, 0xa6, 0x10, 0x0, + + /* U+0074 "t" */ + 0x0, 0x0, 0x88, 0x85, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfd, 0x41, 0x15, 0xb0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x18, + 0xcf, 0xfe, 0xb5, 0x0, + + /* U+0075 "u" */ + 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, + 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, + 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf3, + 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf3, 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf3, 0x5f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, 0xe, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf3, + 0x7, 0xff, 0xff, 0x93, 0x0, 0x14, 0xbf, 0xff, + 0xff, 0xf3, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xf3, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x33, 0xff, 0xf3, 0x0, 0x0, + 0x17, 0xbe, 0xff, 0xda, 0x50, 0x3, 0xff, 0xf3, + + /* U+0076 "v" */ + 0xd, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x10, 0x6f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, + 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf2, 0x0, 0x8, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x0, 0x0, 0x1f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x40, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0x3, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x9f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x60, 0x0, 0x0, 0x1f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xfd, 0x0, 0x0, 0x7, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, + 0x0, 0x0, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x5f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x10, + 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf8, 0x3, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, 0xaf, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x8f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0x9f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xfb, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf5, 0xd, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf0, 0x7, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x90, 0x1, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x30, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xda, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x6f, 0xfd, 0x0, 0x0, 0x5f, + 0xff, 0x10, 0x0, 0x0, 0xd, 0xff, 0x74, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xcf, 0xf7, 0x0, 0x0, + 0xe, 0xff, 0x70, 0x0, 0x0, 0x3f, 0xff, 0x10, + 0xef, 0xf7, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, + 0x0, 0x9, 0xff, 0xc0, 0x0, 0x0, 0xaf, 0xfa, + 0x0, 0x7f, 0xfd, 0x0, 0x0, 0x8, 0xff, 0xb0, + 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, 0x0, 0xff, + 0xf4, 0x0, 0x1f, 0xff, 0x30, 0x0, 0xe, 0xff, + 0x50, 0x0, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x6, + 0xff, 0xe0, 0x0, 0xb, 0xff, 0x90, 0x0, 0x4f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, + 0xc, 0xff, 0x80, 0x0, 0x5, 0xff, 0xf0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x40, 0x2f, 0xff, 0x10, 0x0, 0x0, 0xef, 0xf5, + 0x1, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xa0, 0x8f, 0xfb, 0x0, 0x0, 0x0, 0x9f, + 0xfb, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf1, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x1c, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xfa, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xaf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x90, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfa, 0x0, 0x1d, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x3f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, + 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0xaf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x30, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xfe, 0x2d, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xaf, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, 0xaf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc0, + 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xe1, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x5, 0xff, + 0xfa, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf7, 0x0, 0x4, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf4, 0x2, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xe1, + + /* U+0079 "y" */ + 0xd, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x10, 0x6f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, + 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf2, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x0, 0x0, 0x1f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x30, 0x0, 0x0, 0x9f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0xaf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x80, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x8, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, + 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xd0, 0x0, 0x6f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, + 0xd, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfc, 0x4, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0xbf, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xcf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xde, 0x62, 0x14, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8c, 0xef, 0xeb, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, + + /* U+007B "{" */ + 0x0, 0x0, 0x3, 0xad, 0xff, 0x90, 0x0, 0x6, + 0xff, 0xff, 0xf9, 0x0, 0x2, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x8f, 0xff, 0xc2, 0x0, 0x0, 0xb, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xfd, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xd0, 0x0, 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0x30, 0x0, 0xd, 0xff, 0xff, + 0x50, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xfd, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc2, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0x90, 0x0, 0x6, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x3, 0xae, 0xff, + 0x90, + + /* U+007C "|" */ + 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, + 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, + 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, + 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, + 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, + 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, + 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, + 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, + 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, + 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, + 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, + + /* U+007D "}" */ + 0x4f, 0xfe, 0xb6, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x18, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xf2, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x4f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x10, 0x0, 0x0, 0x18, 0xff, 0xfe, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x4f, 0xfe, 0xb6, 0x0, + 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x7, 0xbb, 0x93, 0x0, 0x0, 0x0, 0x6, + 0xca, 0x1, 0xdf, 0xff, 0xff, 0x80, 0x0, 0x0, + 0xa, 0xfc, 0xc, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0xe, 0xfa, 0x3f, 0xfc, 0x20, 0x5e, 0xff, + 0xd2, 0x0, 0x9f, 0xf6, 0x8f, 0xf2, 0x0, 0x1, + 0xdf, 0xff, 0xce, 0xff, 0xe0, 0xbf, 0xc0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0x40, 0x9b, 0x70, + 0x0, 0x0, 0x0, 0x5c, 0xff, 0xb3, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x1, 0x7c, 0xfe, 0xc6, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x2, 0xff, + 0xb3, 0x0, 0x4d, 0xfe, 0x10, 0xb, 0xfb, 0x0, + 0x0, 0x0, 0xcf, 0x90, 0x1f, 0xf2, 0x0, 0x0, + 0x0, 0x3f, 0xf0, 0x3f, 0xe0, 0x0, 0x0, 0x0, + 0xf, 0xf2, 0x3f, 0xe0, 0x0, 0x0, 0x0, 0xf, + 0xf2, 0x1f, 0xf2, 0x0, 0x0, 0x0, 0x4f, 0xf0, + 0xb, 0xfb, 0x0, 0x0, 0x0, 0xdf, 0x90, 0x2, + 0xff, 0xc4, 0x1, 0x5d, 0xfe, 0x10, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x1, 0x7d, + 0xfe, 0xc7, 0x0, 0x0, + + /* U+2022 "•" */ + 0x0, 0x7c, 0xb6, 0x0, 0xb, 0xff, 0xff, 0xa0, + 0x4f, 0xff, 0xff, 0xf3, 0x7f, 0xff, 0xff, 0xf5, + 0x4f, 0xff, 0xff, 0xf4, 0xd, 0xff, 0xff, 0xc0, + 0x1, 0xae, 0xe9, 0x0, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x5a, 0xef, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x38, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x5e, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc8, 0x30, 0x0, 0xef, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa6, 0x10, 0x0, 0x0, 0xe, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xfb, 0x72, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x55, 0x53, 0xef, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x1, + 0x58, 0x99, 0x7c, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x39, 0xef, 0xff, 0xfb, 0x60, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, + 0xcd, 0xdb, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F008 "" */ + 0x17, 0x30, 0x0, 0x7, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, + 0x0, 0x3, 0x71, 0xcf, 0x60, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x6, 0xfc, 0xff, 0xa2, + 0x22, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x22, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb4, 0x44, 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, 0x44, + 0x4b, 0xff, 0xff, 0x60, 0x0, 0xe, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xe0, 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, + 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x6, 0xff, + 0xff, 0x60, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, + 0x0, 0x6, 0xff, 0xff, 0x80, 0x0, 0x1f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf1, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x66, 0x7f, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xf7, 0x66, 0x6c, 0xff, 0xff, + 0x60, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x6, 0xff, 0xff, 0x60, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x6, 0xff, + 0xff, 0x70, 0x0, 0xf, 0xff, 0xf9, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xf0, + 0x0, 0x7, 0xff, 0xff, 0xfe, 0xee, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xee, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd8, 0x88, 0x9f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf9, 0x88, 0x8d, 0xff, 0xff, 0x60, 0x0, 0xe, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xe0, 0x0, 0x6, 0xff, 0xff, + 0x60, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, + 0x6, 0xff, 0xff, 0x60, 0x0, 0xe, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xe0, 0x0, 0x6, 0xff, 0xff, 0x70, 0x0, + 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x7, 0xff, + 0xff, 0xfc, 0xcc, 0xdf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, + 0xcc, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, + 0xaa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xaa, 0xae, + 0xff, 0xff, 0x60, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x6, 0xff, 0x6f, 0x60, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x6, 0xf6, + + /* U+F00B "" */ + 0x5e, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe5, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x17, 0x88, 0x88, 0x88, 0x87, + 0x10, 0x0, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x71, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x17, + 0x88, 0x88, 0x88, 0x87, 0x10, 0x0, 0x47, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x6, 0x77, 0x77, 0x77, 0x76, + 0x10, 0x0, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x60, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x25, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x7, + 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xd6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "ï€" */ + 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x30, 0x0, 0x0, 0xb, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xc1, 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xd1, + 0x9, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xb9, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xef, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xd, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf0, 0x5f, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xf7, 0x0, 0x6f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, + 0x4c, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0xc6, 0x0, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x44, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x38, 0x30, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, + 0x0, 0x2, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf2, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x10, 0x0, 0xe, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x8f, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xdf, 0xff, 0xff, + 0x10, 0x1, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x60, 0x0, + 0xdf, 0xff, 0xff, 0x10, 0x3, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x10, 0x0, 0x9, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xfe, 0x0, 0x1, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x50, 0x6, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf0, + 0xe, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xf2, 0xf, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xf4, 0x2f, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf6, 0x3f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xf6, 0x3f, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xf6, 0x2f, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf5, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x22, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xf3, 0xd, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xf1, + 0x9, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xd0, 0x4, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0x90, 0x0, 0xef, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x8f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xa5, 0x10, 0x0, 0x0, + 0x49, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xdd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, 0xff, + 0xff, 0xff, 0xda, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x11, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x58, 0x9a, 0xa9, 0x74, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xad, 0x50, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc3, 0x0, 0x8, 0xf7, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfc, 0x4a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0xef, 0xff, + 0x50, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0x1, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x3, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x75, 0x58, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xec, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x2, + 0xff, 0xd4, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x6e, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x36, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, 0x72, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xdf, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x21, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xce, 0xb3, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0xb, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0xbf, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfd, 0x8e, 0xff, + 0xff, 0xff, 0x4b, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xfa, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x26, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x4f, 0xfd, 0x20, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x7f, 0xff, 0xfe, 0x40, 0x3, 0xef, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0x90, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x60, 0x1, 0xcf, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0x70, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0xaf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0x40, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x7f, + 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xfd, 0x20, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xaf, 0xff, 0xff, 0xfb, 0x10, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x2e, 0xff, 0xff, 0xff, 0x70, + 0xcf, 0xff, 0xff, 0xf9, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0x8c, 0xff, 0xff, + 0xf6, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x9, + 0xff, 0xff, 0xf8, 0x1e, 0xff, 0xe4, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x7, 0xff, 0xfc, + 0x0, 0x3f, 0xd2, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x4, 0xfe, 0x10, 0x0, 0x10, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xcc, 0xcc, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, + 0x0, 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x22, 0x22, 0x22, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xee, 0xee, 0xee, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x7f, 0xff, 0xf7, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x7, 0xff, 0x70, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x33, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x33, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x8f, 0xd0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x4f, + 0xa0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x72, 0xcf, 0xf4, 0x4e, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8a, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfe, 0x10, 0x0, 0xd, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfa, 0x0, 0x9, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf5, 0x3, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xe1, 0xbf, 0xff, 0xff, + 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x44, 0x44, 0x44, 0x44, 0x6f, + 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x88, 0x88, 0x88, 0x88, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x95, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x77, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x46, 0x77, 0x53, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x2f, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x1f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xf, 0xff, 0xff, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xb6, 0x20, 0x0, 0x2, + 0x7c, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xe, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x7f, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xed, 0xdd, 0xff, 0xff, 0xff, 0xff, 0x5, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x1, 0x22, 0x21, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xd0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xe0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x60, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0x10, 0xff, 0xff, 0xff, 0xff, 0x90, 0x1, 0x23, + 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xf9, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf2, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, + 0x2, 0x9f, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x85, 0x33, 0x57, 0xcf, 0xff, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0xff, 0xff, 0xf0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xf1, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf2, 0x0, 0x4, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x5, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xef, + 0xff, 0xff, 0xd9, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7a, 0xaa, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x22, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x35, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xf0, 0x34, 0x44, 0x44, 0x44, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x35, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x44, + 0x44, 0x44, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x2, 0xef, 0x90, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x7f, 0xff, 0xb0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x4, 0xff, 0xff, 0x80, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x4, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x6, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1f, + 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x2, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x9f, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xaf, 0xff, 0xd0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x6f, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x6, 0xff, + 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x8, 0xb3, 0x0, + 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x1, 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xa1, 0x0, 0x1, + 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xe2, 0x0, 0x9, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xd0, + 0x0, 0xe, 0xff, 0xf0, 0x0, 0x34, 0x44, 0x44, + 0x44, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0x90, 0x0, 0x7f, + 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x20, 0x0, + 0x2, 0xff, 0xff, 0x20, 0x0, 0xff, 0xfb, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x2, 0xef, 0xa0, 0x0, 0x6, 0xff, + 0xf9, 0x0, 0xa, 0xff, 0xf1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x7f, 0xff, 0xc0, 0x0, 0xe, 0xff, 0xe0, 0x0, + 0x5f, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, 0xff, 0xff, + 0x80, 0x0, 0x7f, 0xff, 0x30, 0x2, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x4, 0xef, 0xff, 0x10, 0x3, + 0xff, 0xf6, 0x0, 0xf, 0xff, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x5, 0xff, 0xf5, 0x0, 0xf, 0xff, 0x80, + 0x0, 0xef, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1f, + 0xff, 0x70, 0x0, 0xff, 0xf9, 0x0, 0xd, 0xff, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, + 0xf, 0xff, 0x90, 0x0, 0xef, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xaf, 0xff, 0x30, 0x1, 0xff, 0xf8, + 0x0, 0xf, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xbf, + 0xff, 0xc0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x7f, 0xff, 0xf3, 0x0, + 0xa, 0xff, 0xf1, 0x0, 0x4f, 0xff, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x6, 0xff, 0xf5, 0x0, 0x2, 0xff, 0xfc, + 0x0, 0x8, 0xff, 0xf2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x7, + 0x93, 0x0, 0x0, 0xbf, 0xff, 0x50, 0x0, 0xdf, + 0xfe, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xd0, 0x0, 0x4f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf4, + 0x0, 0xb, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xf7, 0x0, 0x4, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf9, 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf7, 0x0, + 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x6, 0x92, 0x0, 0x0, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x41, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x40, 0x1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x72, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x29, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x8f, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x8f, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + + /* U+F043 "ïƒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xfb, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf, 0xff, 0xfd, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xef, + 0xff, 0xd0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd, 0xff, 0xfe, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xaf, 0xff, 0xf3, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x6, + 0xff, 0xff, 0xa0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, + 0x40, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x9f, 0xff, 0xff, 0x30, 0x2, + 0x8a, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x1, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xc6, 0x20, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x79, 0xbb, + 0x98, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "ïˆ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xee, + 0x70, 0x4f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x44, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xf7, 0x4f, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x84, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0x84, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x84, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0x10, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x84, 0xff, 0xff, 0xf1, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0x10, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x84, 0xff, 0xff, 0xf1, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xff, + 0xff, 0xf2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0x10, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, + 0xff, 0xff, 0xf1, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0x10, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x84, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x84, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0x84, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0x84, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf7, + 0x4f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x63, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xc0, 0x3, 0x44, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x40, 0x0, + + /* U+F04B "ï‹" */ + 0x0, 0x13, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfe, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8b, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "ïŒ" */ + 0x4, 0xcf, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, + 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xd6, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x24, 0x44, 0x44, 0x44, 0x43, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, + + /* U+F04D "ï" */ + 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, + + /* U+F051 "ï‘" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xe6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xe3, 0x2f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x65, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x65, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x65, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xe, 0xff, + 0xff, 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xe, + 0xff, 0xff, 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xf6, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9e, 0xff, 0xff, 0x65, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x65, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x65, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x65, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0xe, 0xff, 0xff, 0x65, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0xe, 0xff, 0xff, + 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xe, 0xff, + 0xff, 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x65, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf6, 0x5f, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x65, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf6, + 0x3f, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0x60, 0xaf, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xf5, 0x0, 0x34, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x44, 0x44, 0x0, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xbe, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x46, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x3, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x75, 0x0, + + /* U+F053 "ï“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xe6, 0x0, + + /* U+F054 "ï”" */ + 0x0, 0x26, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9e, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9d, + 0xed, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xcd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdf, 0xff, 0xff, 0xff, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xca, 0x20, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1, 0x45, 0x55, 0x55, + 0x55, 0x55, 0x5f, 0xff, 0xff, 0xff, 0x75, 0x55, + 0x55, 0x55, 0x55, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x25, 0x65, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F068 "ï¨" */ + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, 0x0, + + /* U+F06E "ï®" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x45, 0x77, 0x65, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfc, 0x73, + 0x21, 0x24, 0x8d, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x14, 0x54, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xa1, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe3, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xe2, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x2, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x9, 0xa7, + 0x9e, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x3, 0x9c, 0xdc, 0x82, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, + 0x15, 0xdf, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xba, 0x9a, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x9e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x7a, 0xce, 0xff, 0xed, 0xc9, 0x62, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "ï°" */ + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x25, 0x67, 0x76, 0x42, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x38, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x72, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xfb, 0x11, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa6, 0x31, 0x23, 0x7b, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, + 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x35, 0x42, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xd4, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xff, 0xff, 0xb1, 0x8f, 0xff, 0xff, 0x80, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0x80, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xfe, 0xbf, 0xff, 0xff, 0xf7, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0x90, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xe4, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0x74, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xa9, 0xab, 0x20, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x59, 0xcd, 0xef, 0xfe, 0xca, 0x72, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xa7, 0x0, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, 0x55, 0x57, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x20, 0x3c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x21, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x3b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xd9, 0x10, 0x0, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf5, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xbe, 0xee, 0xee, 0xef, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xee, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0x60, 0x5, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x8f, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf7, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x8f, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x90, 0x3, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8a, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x6, 0x93, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x10, 0x0, 0x0, 0x9, + 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0x30, 0x9, 0xe1, + 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0x50, 0x6, 0xff, 0xff, 0xc0, 0x0, + 0x8f, 0xff, 0xff, 0x60, 0x0, 0x1, 0x11, 0x11, + 0x18, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x4f, 0xff, + 0xff, 0xfb, 0x11, 0x8f, 0xff, 0xff, 0xf6, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xad, + 0xdd, 0xdd, 0xdd, 0xdb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xdd, 0xdd, 0xef, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x82, 0x0, 0x0, + 0x0, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x7f, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd1, + 0x6f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xa7, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xfb, 0x1d, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0x30, 0x1d, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x30, 0x0, 0x17, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x58, 0x20, 0x0, + + /* U+F078 "ï¸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xf9, + 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xfa, 0x4, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xf8, 0x7f, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xc2, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf5, 0x3, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0x40, 0x1d, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x5d, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x0, 0x0, 0x0, 0x59, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x6a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbe, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xef, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xfe, 0x2e, 0xff, 0xfd, 0x3f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf3, 0xe, 0xff, 0xfd, 0x4, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x40, 0xe, 0xff, 0xfd, 0x0, 0x5f, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x3, 0x72, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xc0, 0xa, 0xff, 0xff, 0x10, 0x6f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xfb, 0xa, 0xff, 0xff, 0x15, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xba, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xab, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x10, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "ï»" */ + 0x0, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x85, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xb9, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + + /* U+F093 "ï‚“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x11, 0x11, 0xef, 0xff, 0xff, 0xff, + 0xf9, 0x11, 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x5, 0x66, + 0x66, 0x66, 0x30, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x73, 0x22, 0x22, 0x22, + 0x37, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x8f, 0xd0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x4f, + 0xa0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x72, 0xcf, 0xf4, 0x4e, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xc9, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xfd, 0xa6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x28, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xbb, + 0xa9, 0x86, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x6a, 0xdd, 0xb7, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, 0xa9, + 0x50, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xfe, 0x30, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0xcf, 0xff, 0xf9, + 0x0, 0x6f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, + 0xe0, 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, + 0xff, 0xd0, 0x0, 0x9, 0xff, 0xff, 0x30, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xdf, 0xff, 0xf5, 0x0, 0x2e, 0xff, 0xff, 0x10, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xba, 0xff, 0xff, 0xfd, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6a, 0xdd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf9, 0x0, 0x6f, 0xff, 0xff, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xff, 0xff, 0xe0, 0x0, 0xa, 0xff, 0xff, + 0x20, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x9, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0xdf, 0xff, 0xf5, 0x0, 0x2e, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x9f, 0xff, 0xff, 0xba, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x9d, 0xfe, 0xa3, 0x0, + 0x0, 0x3, 0xaf, 0xff, 0xfc, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xed, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xef, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xef, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xef, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0xef, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xef, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xff, 0xf2, + 0x6f, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, + 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, + 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xf3, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x26, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x10, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x2, 0x9c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xa3, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0x70, 0x0, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0x70, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xfc, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x83, 0x12, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x10, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x9a, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x10, 0x0, 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x10, 0x0, + + /* U+F0C9 "" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x26, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x26, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x14, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, + + /* U+F0E0 "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x41, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x1, 0xc4, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x7f, 0xff, 0x90, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x1b, 0xff, 0xff, 0xfc, 0x20, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x20, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x2, 0xcf, 0xff, + 0xfc, 0x20, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x4, 0xaa, 0x40, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x4d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, + 0x33, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x13, 0x44, 0x44, 0x44, 0x44, 0x43, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb6, 0x66, 0x66, 0x66, 0x53, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x12, + 0x22, 0x22, 0x22, 0x28, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, 0xfd, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0xcc, 0xcc, 0xcc, 0xff, + 0xfe, 0xef, 0xff, 0xcc, 0xcc, 0xcc, 0xa2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xb, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x0, 0x20, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xed, 0x10, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0xef, 0xd1, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xef, 0xfd, 0x10, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xef, 0xff, 0xd1, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xef, 0xff, + 0xfd, 0x10, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xef, + 0xff, 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xef, 0xff, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xcf, 0xff, + 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x17, + 0x88, 0x88, 0x88, 0x84, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3a, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x40, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x9e, 0xff, 0xff, 0xff, 0xb5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xa, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xba, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xba, 0x60, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xfe, 0x10, 0x1, + 0xaf, 0xf2, 0x0, 0x9, 0xff, 0x40, 0x0, 0x7f, + 0xf5, 0x0, 0x5, 0xff, 0x70, 0x0, 0x4f, 0xff, + 0xfc, 0xff, 0xff, 0xc0, 0x0, 0x7, 0xfe, 0x0, + 0x0, 0x6f, 0xf0, 0x0, 0x4, 0xff, 0x20, 0x0, + 0x2f, 0xf4, 0x0, 0x0, 0xff, 0xff, 0xcf, 0xff, + 0xfc, 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x6, 0xff, + 0x0, 0x0, 0x4f, 0xf2, 0x0, 0x2, 0xff, 0x40, + 0x0, 0xf, 0xff, 0xfc, 0xff, 0xff, 0xc0, 0x0, + 0x7, 0xfe, 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x4, + 0xff, 0x20, 0x0, 0x2f, 0xf4, 0x0, 0x0, 0xff, + 0xff, 0xcf, 0xff, 0xfe, 0x10, 0x0, 0xaf, 0xf2, + 0x0, 0x9, 0xff, 0x30, 0x0, 0x7f, 0xf5, 0x0, + 0x5, 0xff, 0x70, 0x0, 0x3f, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x66, + 0x8f, 0xfd, 0x66, 0x68, 0xff, 0xd6, 0x66, 0x7f, + 0xfd, 0x66, 0x66, 0xef, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xff, 0x70, + 0x0, 0xe, 0xf7, 0x0, 0x0, 0xef, 0x70, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0xf, 0xf7, 0x0, 0x0, 0xef, + 0x70, 0x0, 0xe, 0xf7, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0xff, 0x70, 0x0, 0xe, 0xf7, 0x0, 0x0, + 0xef, 0x70, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x1f, 0xf9, + 0x0, 0x1, 0xff, 0x90, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0x76, 0x67, 0xdf, 0xf8, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6a, + 0xff, 0xb6, 0x66, 0x9f, 0xff, 0xfc, 0xff, 0xff, + 0xc0, 0x0, 0x7, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf4, 0x0, + 0x0, 0xff, 0xff, 0xcf, 0xff, 0xfc, 0x0, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x40, 0x0, 0xf, 0xff, + 0xfc, 0xff, 0xff, 0xc0, 0x0, 0x7, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf4, 0x0, 0x0, 0xff, 0xff, 0xcf, 0xff, + 0xfd, 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x50, + 0x0, 0x1f, 0xff, 0xfc, 0xff, 0xff, 0xfd, 0xcc, + 0xcf, 0xff, 0xdc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xef, 0xff, 0xcc, 0xce, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x95, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x27, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xab, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "ï…›" */ + 0x6, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x40, 0x6, 0x10, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, 0xfe, + 0x30, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0xf, 0xff, 0xfe, 0x30, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0xff, 0xff, 0xfe, 0x30, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xf, 0xff, 0xff, 0xfe, 0x30, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, + 0xff, 0xfe, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x32, + 0x22, 0x22, 0x22, 0x22, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x25, 0x8a, 0xcd, 0xee, 0xed, 0xcb, 0x96, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xae, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x86, 0x42, 0x11, 0x12, 0x35, 0x79, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0xcf, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xdf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xf5, + 0x2e, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x90, + 0x2, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x69, 0xce, 0xff, 0xfe, 0xdb, 0x84, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf9, 0x0, + 0x0, 0x2c, 0x70, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x2c, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xc8, 0x42, 0x0, 0x1, 0x26, 0xae, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xcf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfc, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x35, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf8, 0x20, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x37, 0x7f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x5c, 0xdf, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x7, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x93, 0x0, 0x0, + + /* U+F241 "ï‰" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf8, 0x20, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0x7f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xdf, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x7, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x93, 0x0, 0x0, + + /* U+F242 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf8, 0x20, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0x7f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xdf, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x7, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x85, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x93, 0x0, 0x0, + + /* U+F243 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf8, 0x20, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0x7f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xdf, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x7, 0x88, 0x88, 0x88, 0x88, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x93, 0x0, 0x0, + + /* U+F244 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf8, 0x20, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0x7f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xdf, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x93, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8b, 0xb4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x22, 0xcf, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf9, 0x88, 0xef, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x40, 0x0, 0x5f, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf9, 0x0, 0x0, 0x5, 0xef, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x78, 0x61, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0x60, 0x0, 0x0, 0xc, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xd4, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x4f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xb2, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, 0xef, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x70, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xb9, 0x9e, 0xff, + 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xac, 0xff, 0xff, 0xfd, 0x40, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xe6, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xfc, 0x20, 0x0, 0x0, + 0x0, 0x2a, 0xef, 0xd7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, 0xa, 0xdd, + 0xdd, 0xdd, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x53, 0x3e, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x56, 0x6f, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x8c, 0xff, 0xff, 0xff, + 0xd9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xbf, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xfe, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x20, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x0, 0x8, 0xff, 0xff, + 0xff, 0x7f, 0xff, 0xfe, 0x0, 0x5c, 0x0, 0xa, + 0xff, 0xff, 0xff, 0x40, 0xc, 0xff, 0xff, 0xe3, + 0x5, 0xff, 0xfe, 0x0, 0x4f, 0xc1, 0x0, 0xbf, + 0xff, 0xff, 0x70, 0xf, 0xff, 0xff, 0xb0, 0x0, + 0x4f, 0xfe, 0x0, 0x4f, 0xfa, 0x0, 0x1f, 0xff, + 0xff, 0x90, 0x1f, 0xff, 0xff, 0xfb, 0x0, 0x4, + 0xfe, 0x0, 0x4f, 0xd1, 0x0, 0xaf, 0xff, 0xff, + 0xc0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x4e, + 0x0, 0x4d, 0x10, 0x8, 0xff, 0xff, 0xff, 0xd0, + 0x4f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x3, 0x0, + 0x21, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xe0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x5f, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x1, + 0x0, 0x10, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf0, + 0x3f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x2d, 0x0, + 0x4b, 0x0, 0x8, 0xff, 0xff, 0xff, 0xe0, 0x1f, + 0xff, 0xff, 0xfd, 0x10, 0x2, 0xef, 0x0, 0x4f, + 0xa0, 0x0, 0x9f, 0xff, 0xff, 0xc0, 0xf, 0xff, + 0xff, 0xd1, 0x0, 0x2e, 0xff, 0x0, 0x4f, 0xf9, + 0x0, 0xc, 0xff, 0xff, 0xa0, 0xc, 0xff, 0xff, + 0xd1, 0x2, 0xef, 0xff, 0x0, 0x4f, 0xe2, 0x0, + 0x5f, 0xff, 0xff, 0x80, 0x9, 0xff, 0xff, 0xfd, + 0x4e, 0xff, 0xff, 0x0, 0x5e, 0x20, 0x5, 0xff, + 0xff, 0xff, 0x50, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x32, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x48, + 0xab, 0xcd, 0xdc, 0xa7, 0x30, 0x0, 0x0, 0x0, + 0x0, + + /* U+F2ED "ï‹­" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x22, + 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8c, 0xcc, 0xcc, 0xcc, 0xcc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xcc, + 0xcc, 0xcc, 0xcc, 0xa0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7c, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xa0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0x90, 0x9f, 0xff, 0xfb, 0x7, + 0xff, 0xff, 0xc1, 0x5f, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, + 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, + 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, + 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, + 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, + 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, + 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, + 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, + 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, + 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, + 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, + 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, + 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, + 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, + 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, + 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, + 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, + 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x90, 0x9f, 0xff, + 0xfb, 0x7, 0xff, 0xff, 0xc1, 0x5f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x7b, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcb, 0x81, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf7, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf7, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf7, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x4f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x4f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x4f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xab, 0x97, + 0x53, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x67, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x98, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0x60, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x6, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x6f, 0xff, 0x60, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x6, 0xf6, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x1, 0xa1, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x1d, 0xfd, 0x10, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x1, 0xdf, 0xff, 0xd1, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x1d, 0xff, 0xff, 0xfd, + 0x10, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x21, 0xdf, 0xff, 0xff, 0xff, + 0xd1, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa2, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x2, 0xef, 0xfc, 0xbb, 0xbf, 0xfc, + 0xbb, 0xcf, 0xfc, 0xbb, 0xbf, 0xff, 0xfa, 0x0, + 0x2, 0xef, 0xff, 0x50, 0x2, 0xff, 0x40, 0x3, + 0xff, 0x30, 0x1, 0xff, 0xff, 0xa0, 0x2, 0xef, + 0xff, 0xf5, 0x0, 0x2f, 0xf4, 0x0, 0x3f, 0xf3, + 0x0, 0x1f, 0xff, 0xfa, 0x2, 0xef, 0xff, 0xff, + 0x50, 0x2, 0xff, 0x40, 0x3, 0xff, 0x30, 0x1, + 0xff, 0xff, 0xa2, 0xef, 0xff, 0xff, 0xf5, 0x0, + 0x2f, 0xf4, 0x0, 0x3f, 0xf3, 0x0, 0x1f, 0xff, + 0xfa, 0xef, 0xff, 0xff, 0xff, 0x50, 0x2, 0xff, + 0x40, 0x3, 0xff, 0x30, 0x1, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x2f, 0xf4, 0x0, + 0x3f, 0xf3, 0x0, 0x1f, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0x62, 0x24, 0xff, 0x62, 0x25, 0xff, + 0x52, 0x23, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xac, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x5c, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xea, 0x20, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xf1, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xff, 0xff, 0xff, 0x10, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x40, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 164, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 163, .box_w = 6, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 78, .adv_w = 238, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 15}, + {.bitmap_index = 139, .adv_w = 427, .box_w = 25, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 464, .adv_w = 378, .box_w = 22, .box_h = 36, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 860, .adv_w = 513, .box_w = 30, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1250, .adv_w = 417, .box_w = 25, .box_h = 27, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1588, .adv_w = 128, .box_w = 4, .box_h = 11, .ofs_x = 2, .ofs_y = 15}, + {.bitmap_index = 1610, .adv_w = 205, .box_w = 9, .box_h = 35, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 1768, .adv_w = 206, .box_w = 9, .box_h = 35, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 1926, .adv_w = 243, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = 14}, + {.bitmap_index = 2031, .adv_w = 354, .box_w = 18, .box_h = 17, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 2184, .adv_w = 138, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 2217, .adv_w = 233, .box_w = 11, .box_h = 4, .ofs_x = 2, .ofs_y = 9}, + {.bitmap_index = 2239, .adv_w = 138, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2257, .adv_w = 214, .box_w = 17, .box_h = 35, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 2555, .adv_w = 406, .box_w = 23, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2854, .adv_w = 225, .box_w = 11, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2997, .adv_w = 349, .box_w = 21, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3270, .adv_w = 348, .box_w = 21, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3543, .adv_w = 407, .box_w = 24, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3855, .adv_w = 349, .box_w = 21, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4128, .adv_w = 375, .box_w = 22, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4414, .adv_w = 364, .box_w = 21, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4687, .adv_w = 392, .box_w = 22, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4973, .adv_w = 375, .box_w = 21, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5246, .adv_w = 138, .box_w = 6, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5306, .adv_w = 138, .box_w = 6, .box_h = 26, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 5384, .adv_w = 354, .box_w = 18, .box_h = 18, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 5546, .adv_w = 354, .box_w = 18, .box_h = 12, .ofs_x = 2, .ofs_y = 7}, + {.bitmap_index = 5654, .adv_w = 354, .box_w = 18, .box_h = 18, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 5816, .adv_w = 348, .box_w = 20, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6076, .adv_w = 629, .box_w = 37, .box_h = 33, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 6687, .adv_w = 445, .box_w = 29, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7064, .adv_w = 460, .box_w = 24, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7376, .adv_w = 440, .box_w = 26, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7714, .adv_w = 502, .box_w = 27, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8065, .adv_w = 407, .box_w = 21, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8338, .adv_w = 386, .box_w = 20, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8598, .adv_w = 469, .box_w = 26, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8936, .adv_w = 494, .box_w = 24, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9248, .adv_w = 188, .box_w = 5, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9313, .adv_w = 312, .box_w = 17, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 9534, .adv_w = 437, .box_w = 25, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9859, .adv_w = 361, .box_w = 20, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10119, .adv_w = 581, .box_w = 30, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10509, .adv_w = 494, .box_w = 24, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10821, .adv_w = 511, .box_w = 30, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11211, .adv_w = 439, .box_w = 23, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 11510, .adv_w = 511, .box_w = 31, .box_h = 31, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 11991, .adv_w = 442, .box_w = 23, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 12290, .adv_w = 378, .box_w = 22, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12576, .adv_w = 357, .box_w = 23, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12875, .adv_w = 481, .box_w = 24, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 13187, .adv_w = 433, .box_w = 29, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 13564, .adv_w = 685, .box_w = 41, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 14097, .adv_w = 409, .box_w = 26, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14435, .adv_w = 393, .box_w = 26, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 14773, .adv_w = 399, .box_w = 23, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 15072, .adv_w = 202, .box_w = 9, .box_h = 35, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 15230, .adv_w = 214, .box_w = 17, .box_h = 35, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 15528, .adv_w = 202, .box_w = 9, .box_h = 35, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 15686, .adv_w = 354, .box_w = 18, .box_h = 16, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 15830, .adv_w = 304, .box_w = 19, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15859, .adv_w = 365, .box_w = 11, .box_h = 5, .ofs_x = 4, .ofs_y = 23}, + {.bitmap_index = 15887, .adv_w = 364, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 16077, .adv_w = 415, .box_w = 22, .box_h = 28, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 16385, .adv_w = 347, .box_w = 20, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 16585, .adv_w = 415, .box_w = 22, .box_h = 28, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 16893, .adv_w = 372, .box_w = 21, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 17103, .adv_w = 215, .box_w = 15, .box_h = 28, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17313, .adv_w = 420, .box_w = 22, .box_h = 27, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 17610, .adv_w = 414, .box_w = 20, .box_h = 28, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 17890, .adv_w = 170, .box_w = 6, .box_h = 29, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 17977, .adv_w = 173, .box_w = 12, .box_h = 36, .ofs_x = -4, .ofs_y = -7}, + {.bitmap_index = 18193, .adv_w = 375, .box_w = 21, .box_h = 28, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 18487, .adv_w = 170, .box_w = 5, .box_h = 28, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 18557, .adv_w = 643, .box_w = 34, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 18897, .adv_w = 414, .box_w = 20, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 19097, .adv_w = 386, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 19317, .adv_w = 415, .box_w = 22, .box_h = 27, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 19614, .adv_w = 415, .box_w = 22, .box_h = 27, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 19911, .adv_w = 249, .box_w = 12, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 20031, .adv_w = 305, .box_w = 18, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20211, .adv_w = 252, .box_w = 15, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20399, .adv_w = 412, .box_w = 20, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 20599, .adv_w = 340, .box_w = 23, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 20829, .adv_w = 547, .box_w = 34, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21169, .adv_w = 336, .box_w = 21, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21379, .adv_w = 340, .box_w = 23, .box_h = 27, .ofs_x = -1, .ofs_y = -7}, + {.bitmap_index = 21690, .adv_w = 317, .box_w = 18, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 21870, .adv_w = 213, .box_w = 11, .box_h = 35, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 22063, .adv_w = 182, .box_w = 5, .box_h = 35, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 22151, .adv_w = 213, .box_w = 12, .box_h = 35, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 22361, .adv_w = 354, .box_w = 18, .box_h = 7, .ofs_x = 2, .ofs_y = 10}, + {.bitmap_index = 22424, .adv_w = 255, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 14}, + {.bitmap_index = 22508, .adv_w = 191, .box_w = 8, .box_h = 7, .ofs_x = 2, .ofs_y = 7}, + {.bitmap_index = 22536, .adv_w = 608, .box_w = 39, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 23297, .adv_w = 608, .box_w = 38, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23848, .adv_w = 608, .box_w = 38, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 24494, .adv_w = 608, .box_w = 38, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 25045, .adv_w = 418, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 25410, .adv_w = 608, .box_w = 38, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 26151, .adv_w = 608, .box_w = 36, .box_h = 39, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 26853, .adv_w = 684, .box_w = 43, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 27584, .adv_w = 608, .box_w = 38, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 28325, .adv_w = 684, .box_w = 43, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 28949, .adv_w = 608, .box_w = 38, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 29690, .adv_w = 304, .box_w = 19, .box_h = 30, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 29975, .adv_w = 456, .box_w = 29, .box_h = 30, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 30410, .adv_w = 684, .box_w = 43, .box_h = 37, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 31206, .adv_w = 608, .box_w = 38, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 31757, .adv_w = 418, .box_w = 27, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 32284, .adv_w = 532, .box_w = 25, .box_h = 35, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 32722, .adv_w = 532, .box_w = 34, .box_h = 40, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 33402, .adv_w = 532, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 33980, .adv_w = 532, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 34558, .adv_w = 532, .box_w = 25, .box_h = 35, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 34996, .adv_w = 532, .box_w = 35, .box_h = 34, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 35591, .adv_w = 380, .box_w = 20, .box_h = 33, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 35921, .adv_w = 380, .box_w = 20, .box_h = 33, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 36251, .adv_w = 532, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 36829, .adv_w = 532, .box_w = 34, .box_h = 8, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 36965, .adv_w = 684, .box_w = 43, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 37589, .adv_w = 760, .box_w = 48, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 38525, .adv_w = 684, .box_w = 45, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 39403, .adv_w = 608, .box_w = 38, .box_h = 35, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 40068, .adv_w = 532, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 40415, .adv_w = 532, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 40762, .adv_w = 760, .box_w = 48, .box_h = 30, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41482, .adv_w = 608, .box_w = 38, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 42033, .adv_w = 608, .box_w = 38, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 42774, .adv_w = 608, .box_w = 39, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 43535, .adv_w = 532, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 44113, .adv_w = 532, .box_w = 34, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 44776, .adv_w = 532, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 45354, .adv_w = 532, .box_w = 34, .box_h = 30, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 45864, .adv_w = 608, .box_w = 38, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 46415, .adv_w = 380, .box_w = 26, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 46922, .adv_w = 532, .box_w = 34, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 47585, .adv_w = 532, .box_w = 34, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 48248, .adv_w = 684, .box_w = 43, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 48872, .adv_w = 608, .box_w = 40, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 49652, .adv_w = 456, .box_w = 29, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 50218, .adv_w = 760, .box_w = 48, .box_h = 35, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 51058, .adv_w = 760, .box_w = 48, .box_h = 25, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 51658, .adv_w = 760, .box_w = 48, .box_h = 25, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 52258, .adv_w = 760, .box_w = 48, .box_h = 25, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 52858, .adv_w = 760, .box_w = 48, .box_h = 25, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 53458, .adv_w = 760, .box_w = 48, .box_h = 25, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 54058, .adv_w = 760, .box_w = 48, .box_h = 30, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 54778, .adv_w = 532, .box_w = 30, .box_h = 39, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 55363, .adv_w = 532, .box_w = 34, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 56026, .adv_w = 608, .box_w = 39, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 56787, .adv_w = 760, .box_w = 48, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 57483, .adv_w = 456, .box_w = 29, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 58049, .adv_w = 612, .box_w = 39, .box_h = 25, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 6, 0, 0, 0, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 27, 0, 16, -13, 0, 0, + 0, 0, -33, -36, 4, 29, 13, 10, + -24, 4, 30, 2, 26, 6, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 36, 5, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 0, -18, 0, 0, 0, 0, + 0, -12, 10, 12, 0, 0, -6, 0, + -4, 6, 0, -6, 0, -6, -3, -12, + 0, 0, 0, 0, -6, 0, 0, -8, + -9, 0, 0, -6, 0, -12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + -6, 0, -9, 0, -16, 0, -74, 0, + 0, -12, 0, 12, 18, 1, 0, -12, + 6, 6, 20, 12, -10, 12, 0, 0, + -35, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -22, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -16, -7, -30, 0, -24, + -4, 0, 0, 0, 0, 1, 24, 0, + -18, -5, -2, 2, 0, -10, 0, 0, + -4, -45, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -49, -5, 23, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 20, + 0, 6, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 23, 5, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -22, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 12, 6, 18, -6, 0, 0, 12, -6, + -20, -83, 4, 16, 12, 1, -8, 0, + 22, 0, 19, 0, 19, 0, -57, 0, + -7, 18, 0, 20, -6, 12, 6, 0, + 0, 2, -6, 0, 0, -10, 49, 0, + 49, 0, 18, 0, 26, 8, 10, 18, + 0, 0, 0, -22, 0, 0, 0, 0, + 2, -4, 0, 4, -11, -8, -12, 4, + 0, -6, 0, 0, 0, -24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -40, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -33, 0, -38, 0, 0, 0, + 0, -4, 0, 60, -7, -8, 6, 6, + -5, 0, -8, 6, 0, 0, -32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -59, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -38, 0, 36, 0, 0, -22, 0, + 20, 0, -41, -59, -41, -12, 18, 0, + 0, -41, 0, 7, -14, 0, -9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 18, -74, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 4, 0, 0, 0, + 0, 0, 4, 4, -7, -12, 0, -2, + -2, -6, 0, 0, -4, 0, 0, 0, + -12, 0, -5, 0, -14, -12, 0, -15, + -20, -20, -12, 0, -12, 0, -12, 0, + 0, 0, 0, -5, 0, 0, 6, 0, + 4, -6, 0, 2, 0, 0, 0, 6, + -4, 0, 0, 0, -4, 6, 6, -2, + 0, 0, 0, -12, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 8, -4, 0, + -7, 0, -10, 0, 0, -4, 0, 18, + 0, 0, -6, 0, 0, 0, 0, 0, + -2, 2, -4, -4, 0, 0, -6, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, 0, -6, -7, 0, + 0, 0, 0, 0, 2, 0, 0, -4, + 0, -6, -6, -6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, -4, -8, 0, -9, 0, -18, + -4, -18, 12, 0, 0, -12, 6, 12, + 16, 0, -15, -2, -7, 0, -2, -29, + 6, -4, 4, -32, 6, 0, 0, 2, + -32, 0, -32, -5, -53, -4, 0, -30, + 0, 12, 17, 0, 8, 0, 0, 0, + 0, 1, 0, -11, -8, 0, -18, 0, + 0, 0, -6, 0, 0, 0, -6, 0, + 0, 0, 0, 0, -3, -3, 0, -3, + -8, 0, 0, 0, 0, 0, 0, 0, + -6, -6, 0, -4, -7, -5, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, -7, + 0, -4, 0, -12, 6, 0, 0, -7, + 3, 6, 6, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 4, + 0, 0, -6, 0, -6, -4, -7, 0, + 0, 0, 0, 0, 0, 0, 5, 0, + -5, 0, 0, 0, 0, -7, -9, 0, + -12, 0, 18, -4, 2, -19, 0, 0, + 16, -30, -32, -26, -12, 6, 0, -5, + -40, -11, 0, -11, 0, -12, 9, -11, + -39, 0, -16, 0, 0, 3, -2, 5, + -4, 0, 6, 1, -18, -23, 0, -30, + -15, -13, -15, -18, -7, -16, -1, -12, + -16, 4, 0, 2, 0, -6, 0, 0, + 0, 4, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + 0, -3, 0, -2, -6, 0, -10, -13, + -13, -2, 0, -18, 0, 0, 0, 0, + 0, 0, -5, 0, 0, 0, 0, 2, + -4, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + -12, 0, 0, 0, 0, -30, -18, 0, + 0, 0, -9, -30, 0, 0, -6, 6, + 0, -16, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, -12, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, -11, 0, + 0, 0, 0, 7, 0, 4, -12, -12, + 0, -6, -6, -7, 0, 0, 0, 0, + 0, 0, -18, 0, -6, 0, -9, -6, + 0, -13, -15, -18, -5, 0, -12, 0, + -18, 0, 0, 0, 0, 49, 0, 0, + 3, 0, 0, -8, 0, 6, 0, -26, + 0, 0, 0, 0, 0, -57, -11, 20, + 18, -5, -26, 0, 6, -9, 0, -30, + -3, -8, 6, -43, -6, 8, 0, 9, + -21, -9, -22, -20, -26, 0, 0, -36, + 0, 35, 0, 0, -3, 0, 0, 0, + -3, -3, -6, -16, -20, -1, -57, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -6, 0, -3, -6, -9, 0, 0, + -12, 0, -6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -12, 0, 0, 12, + -2, 8, 0, -13, 6, -4, -2, -16, + -6, 0, -8, -6, -4, 0, -9, -10, + 0, 0, -5, -2, -4, -10, -7, 0, + 0, -6, 0, 6, -4, 0, -13, 0, + 0, 0, -12, 0, -10, 0, -10, -10, + 6, 0, 0, 0, 0, 0, 0, 0, + 0, -12, 6, 0, -9, 0, -4, -7, + -19, -4, -4, -4, -2, -4, -7, -2, + 0, 0, 0, 0, 0, -6, -5, -5, + 0, 0, 0, 0, 7, -4, 0, -4, + 0, 0, 0, -4, -7, -4, -5, -7, + -5, 0, 5, 24, -2, 0, -16, 0, + -4, 12, 0, -6, -26, -8, 9, 1, + 0, -29, -10, 6, -10, 4, 0, -4, + -5, -19, 0, -9, 3, 0, 0, -10, + 0, 0, 0, 6, 6, -12, -12, 0, + -10, -6, -9, -6, -6, 0, -10, 3, + -12, -10, 18, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, -6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, -8, + 0, 0, -6, -6, 0, 0, 0, 0, + -6, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + -9, 0, -12, 0, 0, 0, -20, 0, + 4, -13, 12, 1, -4, -29, 0, 0, + -13, -6, 0, -24, -15, -17, 0, 0, + -26, -6, -24, -23, -29, 0, -16, 0, + 5, 41, -8, 0, -14, -6, -2, -6, + -10, -16, -11, -22, -25, -14, -6, 0, + 0, -4, 0, 2, 0, 0, -43, -5, + 18, 13, -13, -22, 0, 2, -19, 0, + -30, -4, -6, 12, -56, -8, 2, 0, + 0, -40, -7, -32, -6, -44, 0, 0, + -43, 0, 36, 2, 0, -4, 0, 0, + 0, 0, -3, -4, -23, -4, 0, -40, + 0, 0, 0, 0, -19, 0, -5, 0, + -2, -17, -29, 0, 0, -3, -9, -18, + -6, 0, -4, 0, 0, 0, 0, -27, + -6, -20, -19, -5, -10, -15, -6, -10, + 0, -12, -5, -20, -9, 0, -7, -12, + -6, -12, 0, 3, 0, -4, -20, 0, + 12, 0, -11, 0, 0, 0, 0, 7, + 0, 4, -12, 25, 0, -6, -6, -7, + 0, 0, 0, 0, 0, 0, -18, 0, + -6, 0, -9, -6, 0, -13, -15, -18, + -5, 0, -12, 5, 24, 0, 0, 0, + 0, 49, 0, 0, 3, 0, 0, -8, + 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -4, -12, 0, 0, 0, 0, 0, -3, + 0, 0, 0, -6, -6, 0, 0, -12, + -6, 0, 0, -12, 0, 10, -3, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 9, 12, 5, -5, 0, -19, + -10, 0, 18, -20, -19, -12, -12, 24, + 11, 6, -53, -4, 12, -6, 0, -6, + 7, -6, -21, 0, -6, 6, -8, -5, + -18, -5, 0, 0, 18, 12, 0, -17, + 0, -33, -8, 18, -8, -23, 2, -8, + -20, -20, -6, 24, 6, 0, -9, 0, + -16, 0, 5, 20, -14, -22, -24, -15, + 18, 0, 2, -44, -5, 6, -10, -4, + -14, 0, -13, -22, -9, -9, -5, 0, + 0, -14, -13, -6, 0, 18, 14, -6, + -33, 0, -33, -9, 0, -21, -35, -2, + -19, -10, -20, -17, 16, 0, 0, -8, + 0, -12, -5, 0, -6, -11, 0, 10, + -20, 6, 0, 0, -32, 0, -6, -13, + -10, -4, -18, -15, -20, -14, 0, -18, + -6, -14, -12, -18, -6, 0, 0, 2, + 29, -10, 0, -18, -6, 0, -6, -12, + -14, -16, -17, -23, -8, -12, 12, 0, + -9, 0, -30, -7, 4, 12, -19, -22, + -12, -20, 20, -6, 3, -57, -11, 12, + -13, -10, -22, 0, -18, -26, -7, -6, + -5, -6, -13, -18, -2, 0, 0, 18, + 17, -4, -40, 0, -36, -14, 15, -23, + -41, -12, -21, -26, -30, -20, 12, 0, + 0, 0, 0, -7, 0, 0, 6, -7, + 12, 4, -12, 12, 0, 0, -19, -2, + 0, -2, 0, 2, 2, -5, 0, 0, + 0, 0, 0, 0, -6, 0, 0, 0, + 0, 5, 18, 1, 0, -7, 0, 0, + 0, 0, -4, -4, -7, 0, 0, 0, + 2, 5, 0, 0, 0, 0, 5, 0, + -5, 0, 23, 0, 11, 2, 2, -8, + 0, 12, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 18, 0, 17, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -36, 0, -6, 10, 0, 18, + 0, 0, 60, 7, -12, -12, 6, 6, + -4, 2, -30, 0, 0, 29, -36, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -41, 23, 85, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -36, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, -12, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, -16, 0, + 0, 2, 0, 0, 6, 78, -12, -5, + 19, 16, -16, 6, 0, 0, 6, 6, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -79, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -17, + 0, 0, 0, -16, 0, 0, 0, 0, + -13, -3, 0, 0, 0, -13, 0, -7, + 0, -29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -41, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -6, 0, 0, -12, 0, -9, 0, + -16, 0, 0, 0, -10, 6, -7, 0, + 0, -16, -6, -14, 0, 0, -16, 0, + -6, 0, -29, 0, -7, 0, 0, -49, + -12, -24, -7, -22, 0, 0, -41, 0, + -16, -3, 0, 0, 0, 0, 0, 0, + 0, 0, -9, -11, -5, -10, 0, 0, + 0, 0, -13, 0, -13, 8, -7, 12, + 0, -4, -14, -4, -10, -12, 0, -7, + -3, -4, 4, -16, -2, 0, 0, 0, + -54, -5, -9, 0, -13, 0, -4, -29, + -5, 0, 0, -4, -5, 0, 0, 0, + 0, 4, 0, -4, -10, -4, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 0, 0, 0, 0, + 0, -13, 0, -4, 0, 0, 0, -12, + 6, 0, 0, 0, -16, -6, -12, 0, + 0, -17, 0, -6, 0, -29, 0, 0, + 0, 0, -59, 0, -12, -22, -30, 0, + 0, -41, 0, -4, -9, 0, 0, 0, + 0, 0, 0, 0, 0, -6, -9, -3, + -9, 2, 0, 0, 10, -8, 0, 19, + 30, -6, -6, -18, 7, 30, 10, 13, + -16, 7, 26, 7, 18, 13, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 38, 29, -11, -6, 0, -5, + 49, 26, 49, 0, 0, 0, 6, 0, + 0, 22, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 9, + 0, 0, 0, 0, -51, -7, -5, -25, + -30, 0, 0, -41, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, -51, -7, -5, + -25, -30, 0, 0, -24, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, -14, 6, 0, -6, + 5, 11, 6, -18, 0, -1, -5, 6, + 0, 5, 0, 0, 0, 0, -15, 0, + -5, -4, -12, 0, -5, -24, 0, 38, + -6, 0, -13, -4, 0, -4, -10, 0, + -6, -17, -12, -7, 0, 0, 0, -10, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, -51, + -7, -5, -25, -30, 0, 0, -41, 0, + 0, 0, 0, 0, 0, 30, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -10, 0, -19, -7, -5, 18, -5, -6, + -24, 2, -4, 2, -4, -16, 1, 13, + 1, 5, 2, 5, -15, -24, -7, 0, + -23, -12, -16, -26, -24, 0, -10, -12, + -7, -8, -5, -4, -7, -4, 0, -4, + -2, 9, 0, 9, -4, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, -6, -6, 0, 0, + -16, 0, -3, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -36, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, -6, 0, -8, + 0, 0, 0, 0, -5, 0, 0, -10, + -6, 6, 0, -10, -12, -4, 0, -18, + -4, -13, -4, -7, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -41, 0, 19, 0, 0, -11, 0, + 0, 0, 0, -8, 0, -6, 0, 0, + -3, 0, 0, -4, 0, -14, 0, 0, + 26, -8, -20, -19, 4, 7, 7, -1, + -17, 4, 9, 4, 18, 4, 20, -4, + -16, 0, 0, -24, 0, 0, -18, -16, + 0, 0, -12, 0, -8, -10, 0, -9, + 0, -9, 0, -4, 9, 0, -5, -18, + -6, 22, 0, 0, -5, 0, -12, 0, + 0, 8, -14, 0, 6, -6, 5, 1, + 0, -20, 0, -4, -2, 0, -6, 7, + -5, 0, 0, 0, -25, -7, -13, 0, + -18, 0, 0, -29, 0, 22, -6, 0, + -11, 0, 4, 0, -6, 0, -6, -18, + 0, -6, 6, 0, 0, 0, 0, -4, + 0, 0, 6, -8, 2, 0, 0, -7, + -4, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -38, 0, 13, 0, + 0, -5, 0, 0, 0, 0, 1, 0, + -6, -6, 0, 0, 0, 12, 0, 14, + 0, 0, 0, 0, 0, -38, -35, 2, + 26, 18, 10, -24, 4, 26, 0, 22, + 0, 12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 32, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserrat_38 = { +#else +lv_font_t lv_font_montserrat_38 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 41, /*The maximum line height required by the font*/ + .base_line = 7, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -3, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_38*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_40.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_40.c new file mode 100644 index 0000000..0769235 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_40.c @@ -0,0 +1,9257 @@ +/******************************************************************************* + * Size: 40 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 40 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_40.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_40 + #define LV_FONT_MONTSERRAT_40 1 +#endif + +#if LV_FONT_MONTSERRAT_40 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xd, 0xff, 0xf9, 0xd, 0xff, 0xf9, 0xc, 0xff, + 0xf8, 0xb, 0xff, 0xf8, 0xb, 0xff, 0xf7, 0xa, + 0xff, 0xf6, 0xa, 0xff, 0xf6, 0x9, 0xff, 0xf5, + 0x9, 0xff, 0xf4, 0x8, 0xff, 0xf4, 0x7, 0xff, + 0xf3, 0x7, 0xff, 0xf3, 0x6, 0xff, 0xf2, 0x6, + 0xff, 0xf1, 0x5, 0xff, 0xf1, 0x4, 0xff, 0xf0, + 0x4, 0xff, 0xf0, 0x3, 0xff, 0xf0, 0x3, 0xff, + 0xe0, 0x1, 0xbb, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, + 0x6, 0xff, 0xe3, 0x1f, 0xff, 0xfc, 0x2f, 0xff, + 0xfe, 0xe, 0xff, 0xfa, 0x3, 0xcf, 0xb1, + + /* U+0022 "\"" */ + 0x7f, 0xfd, 0x0, 0x3, 0xff, 0xf1, 0x7f, 0xfd, + 0x0, 0x3, 0xff, 0xf1, 0x6f, 0xfc, 0x0, 0x2, + 0xff, 0xf0, 0x6f, 0xfc, 0x0, 0x2, 0xff, 0xf0, + 0x6f, 0xfc, 0x0, 0x2, 0xff, 0xf0, 0x5f, 0xfb, + 0x0, 0x1, 0xff, 0xf0, 0x5f, 0xfb, 0x0, 0x1, + 0xff, 0xf0, 0x5f, 0xfa, 0x0, 0x1, 0xff, 0xe0, + 0x4f, 0xfa, 0x0, 0x0, 0xff, 0xe0, 0x4f, 0xfa, + 0x0, 0x0, 0xff, 0xe0, 0x4f, 0xf9, 0x0, 0x0, + 0xff, 0xd0, 0x1, 0x11, 0x0, 0x0, 0x11, 0x10, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, + 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfd, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x70, 0x0, 0x0, 0x0, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xf5, 0x0, 0x0, 0x0, 0x2f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, 0x0, + 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, 0x0, + 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x2f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x20, + 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x0, 0x0, 0x0, 0x7, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x60, 0x0, 0x0, + 0x1, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x3f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x20, 0x0, 0x0, 0x5, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, + 0x0, 0x7f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0xbf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfa, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xff, + 0xfe, 0xc8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xea, 0xdf, 0xf9, 0xbe, 0xff, 0xff, 0x90, 0x0, + 0xc, 0xff, 0xfe, 0x50, 0xa, 0xfe, 0x0, 0x2, + 0x8f, 0xf3, 0x0, 0x3, 0xff, 0xff, 0x20, 0x0, + 0xaf, 0xe0, 0x0, 0x0, 0x17, 0x0, 0x0, 0x8f, + 0xff, 0x80, 0x0, 0xa, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, 0xaf, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x40, 0x0, 0xa, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf9, 0x0, 0x0, 0xaf, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf6, + 0x0, 0xa, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xfc, 0x50, 0xaf, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xfe, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xe0, 0x5b, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, + 0x4, 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xe0, 0x0, 0x3, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, 0x0, + 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xe0, 0x0, 0x0, 0xcf, 0xff, 0x20, 0x5, + 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, 0x0, 0xe, + 0xff, 0xf0, 0x6, 0xf9, 0x10, 0x0, 0x0, 0xaf, + 0xe0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0xdf, 0xff, + 0x82, 0x0, 0xa, 0xfe, 0x0, 0x18, 0xff, 0xff, + 0x40, 0x2f, 0xff, 0xff, 0xfd, 0xa9, 0xdf, 0xf8, + 0xbf, 0xff, 0xff, 0xa0, 0x0, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x37, 0xbd, + 0xef, 0xff, 0xfd, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x58, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0025 "%" */ + 0x0, 0x0, 0x7d, 0xff, 0xd7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x10, 0x0, 0x0, + 0x1, 0xef, 0xfa, 0x66, 0xaf, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x60, 0x0, 0x5, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xf, 0xfb, 0x0, 0x0, 0x0, 0xbf, 0xf0, 0x0, + 0x0, 0x0, 0x2f, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x5f, 0xf4, 0x0, + 0x0, 0x0, 0xbf, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf2, 0x0, 0x0, 0x0, 0x2f, 0xf6, 0x0, + 0x0, 0x6, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf1, 0x0, 0x0, 0x0, 0x1f, 0xf7, 0x0, + 0x0, 0x1f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf2, 0x0, 0x0, 0x0, 0x2f, 0xf6, 0x0, + 0x0, 0xbf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x1f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x20, 0x0, 0x2, 0xff, 0xb0, 0x0, + 0xbf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xe5, 0x0, 0x5e, 0xff, 0x30, 0x5, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x1e, + 0xff, 0x10, 0x2, 0x9d, 0xfe, 0xb5, 0x0, 0x0, + 0x0, 0x4, 0xdf, 0xff, 0xfd, 0x40, 0x0, 0xaf, + 0xf6, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x2, 0x44, 0x20, 0x0, 0x5, 0xff, + 0xb0, 0x3, 0xff, 0xf9, 0x67, 0xdf, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0x20, 0xc, 0xff, 0x30, 0x0, 0xb, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf6, + 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x1, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc0, + 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x0, 0xaf, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0x20, + 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x7f, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, + 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x6f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xc0, 0x0, + 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x6f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x20, 0x0, + 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x7f, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x0, + 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xe0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x1, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x20, 0x0, 0x0, + 0x0, 0xc, 0xff, 0x30, 0x0, 0xb, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf9, 0x57, 0xdf, 0xf9, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x9d, 0xfe, 0xb5, 0x0, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0xa3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf7, 0x10, 0x3, 0xbf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x50, 0x0, 0x0, 0xd, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x8, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, 0x0, 0x9f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf2, 0x0, 0x1b, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x15, + 0xef, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2c, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xc3, + 0xcf, 0xff, 0xd1, 0x0, 0x0, 0x7, 0x72, 0x0, + 0x0, 0x3f, 0xff, 0xf7, 0x0, 0xc, 0xff, 0xfd, + 0x10, 0x0, 0xe, 0xff, 0x50, 0x1, 0xef, 0xff, + 0x40, 0x0, 0x0, 0xcf, 0xff, 0xd1, 0x0, 0x2f, + 0xff, 0x20, 0x8, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfd, 0x10, 0x8f, 0xfe, 0x0, 0xe, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xd1, 0xef, 0xf9, 0x0, 0x1f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, 0xff, 0xf2, + 0x0, 0x2f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xa0, 0x0, 0x2f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0x30, 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xc1, 0x0, + 0x8, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x6, + 0xef, 0xff, 0xff, 0xfc, 0x10, 0x0, 0xdf, 0xff, + 0xfe, 0x96, 0x45, 0x6a, 0xef, 0xff, 0xfa, 0xcf, + 0xff, 0xc0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x1d, 0xff, 0xf9, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x1, 0xdf, 0xe1, 0x0, 0x0, 0x1, 0x5a, + 0xde, 0xfe, 0xdb, 0x62, 0x0, 0x0, 0x0, 0x1d, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x7f, 0xfd, 0x7f, 0xfd, 0x6f, 0xfc, 0x6f, 0xfc, + 0x6f, 0xfc, 0x5f, 0xfb, 0x5f, 0xfb, 0x5f, 0xfa, + 0x4f, 0xfa, 0x4f, 0xfa, 0x4f, 0xf9, 0x1, 0x11, + + /* U+0028 "(" */ + 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x0, 0x4f, + 0xff, 0x70, 0x0, 0x0, 0xcf, 0xfe, 0x0, 0x0, + 0x3, 0xff, 0xf8, 0x0, 0x0, 0x9, 0xff, 0xf1, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x5f, + 0xff, 0x60, 0x0, 0x0, 0x9f, 0xff, 0x10, 0x0, + 0x0, 0xef, 0xfd, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x0, 0x0, 0x5, 0xff, 0xf6, 0x0, 0x0, 0x8, + 0xff, 0xf3, 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, + 0x0, 0xd, 0xff, 0xe0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, + 0x1f, 0xff, 0xa0, 0x0, 0x0, 0x2f, 0xff, 0x90, + 0x0, 0x0, 0x2f, 0xff, 0x90, 0x0, 0x0, 0x3f, + 0xff, 0x90, 0x0, 0x0, 0x2f, 0xff, 0x90, 0x0, + 0x0, 0x2f, 0xff, 0x90, 0x0, 0x0, 0x1f, 0xff, + 0xa0, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0xd, 0xff, 0xe0, + 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x8, + 0xff, 0xf3, 0x0, 0x0, 0x5, 0xff, 0xf6, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xef, + 0xfd, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x10, 0x0, + 0x0, 0x4f, 0xff, 0x60, 0x0, 0x0, 0xe, 0xff, + 0xc0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0x0, + 0x3, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xbf, 0xfe, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, 0x0, + 0xb, 0xff, 0xe0, + + /* U+0029 ")" */ + 0x7f, 0xff, 0x30, 0x0, 0x0, 0xef, 0xfc, 0x0, + 0x0, 0x7, 0xff, 0xf4, 0x0, 0x0, 0x1f, 0xff, + 0xb0, 0x0, 0x0, 0xaf, 0xff, 0x20, 0x0, 0x4, + 0xff, 0xf7, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x0, + 0x0, 0xaf, 0xff, 0x10, 0x0, 0x5, 0xff, 0xf6, + 0x0, 0x0, 0x1f, 0xff, 0xa0, 0x0, 0x0, 0xef, + 0xfd, 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0x9f, 0xff, 0x30, 0x0, 0x6, 0xff, 0xf5, 0x0, + 0x0, 0x4f, 0xff, 0x70, 0x0, 0x3, 0xff, 0xf8, + 0x0, 0x0, 0x2f, 0xff, 0x90, 0x0, 0x1, 0xff, + 0xfa, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, 0x0, + 0xff, 0xfb, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, + 0x1, 0xff, 0xfa, 0x0, 0x0, 0x2f, 0xff, 0x90, + 0x0, 0x3, 0xff, 0xf8, 0x0, 0x0, 0x4f, 0xff, + 0x70, 0x0, 0x6, 0xff, 0xf5, 0x0, 0x0, 0x9f, + 0xff, 0x30, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0xef, 0xfd, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x0, + 0x5, 0xff, 0xf6, 0x0, 0x0, 0xaf, 0xff, 0x10, + 0x0, 0xe, 0xff, 0xd0, 0x0, 0x4, 0xff, 0xf7, + 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x1f, 0xff, + 0xb0, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, 0xef, + 0xfb, 0x0, 0x0, 0x7f, 0xff, 0x30, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x2f, 0xf2, 0x0, 0x1, 0x0, + 0x7, 0xf7, 0x0, 0x2f, 0xf2, 0x0, 0x7f, 0x70, + 0x1e, 0xff, 0xd4, 0x2f, 0xf2, 0x4d, 0xff, 0xe0, + 0x5, 0xef, 0xff, 0xcf, 0xfc, 0xff, 0xfe, 0x50, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x3, 0xcf, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, + 0x1e, 0xff, 0xf8, 0x3f, 0xf3, 0x8f, 0xff, 0xe1, + 0xa, 0xfb, 0x20, 0x2f, 0xf2, 0x2, 0xcf, 0xa0, + 0x1, 0x50, 0x0, 0x2f, 0xf2, 0x0, 0x5, 0x10, + 0x0, 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0x51, 0x0, 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x1, 0x33, 0x33, 0x33, 0x4f, 0xff, + 0x73, 0x33, 0x33, 0x32, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x95, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, + 0x0, 0x0, 0x0, + + /* U+002C "," */ + 0x0, 0x36, 0x40, 0x0, 0x6f, 0xff, 0x80, 0xe, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xf2, 0xc, 0xff, + 0xff, 0x0, 0x2d, 0xff, 0xc0, 0x0, 0x8f, 0xf7, + 0x0, 0xc, 0xff, 0x10, 0x0, 0xff, 0xc0, 0x0, + 0x4f, 0xf7, 0x0, 0x8, 0xff, 0x20, 0x0, 0xcf, + 0xc0, 0x0, + + /* U+002D "-" */ + 0x46, 0x66, 0x66, 0x66, 0x66, 0x60, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+002E "." */ + 0x0, 0x59, 0x60, 0x0, 0x9f, 0xff, 0xa0, 0xf, + 0xff, 0xff, 0x11, 0xff, 0xff, 0xf2, 0xc, 0xff, + 0xfd, 0x0, 0x2b, 0xfc, 0x20, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, + 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x0, 0x49, 0xdf, 0xfe, 0xc8, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xec, 0xac, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x17, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0xe, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xfa, 0x0, + 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x20, 0x0, 0xef, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, + 0x4, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xe0, 0x8, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf3, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf6, 0xe, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfa, 0xf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, + 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfc, 0xf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfa, 0xe, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf6, 0x8, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf3, + 0x4, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xe0, 0x0, 0xef, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, + 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x20, 0x0, 0xe, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfa, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xeb, 0xac, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4a, 0xdf, 0xfe, 0xc8, + 0x20, 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0x96, 0x99, 0x99, 0x9b, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x5, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, + 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x90, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x5, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, + 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x90, 0x0, 0x0, 0x5, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, + 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x90, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x5, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, + 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x90, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x5, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, + + /* U+0032 "2" */ + 0x0, 0x0, 0x1, 0x6a, 0xde, 0xff, 0xeb, 0x82, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xdb, 0xab, 0xdf, + 0xff, 0xff, 0xe1, 0x0, 0x2f, 0xff, 0xfe, 0x61, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xfa, 0x0, 0x3, + 0xef, 0x90, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0x0, 0x0, 0x27, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x95, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + + /* U+0033 "3" */ + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x4, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0xaf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xfc, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x44, 0x45, 0x7b, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf0, 0x1, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xc0, 0xa, 0xf9, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x70, + 0x3f, 0xff, 0xf9, 0x40, 0x0, 0x0, 0x1, 0x8f, + 0xff, 0xfe, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xdb, + 0xab, 0xdf, 0xff, 0xff, 0xf4, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x4, 0x8b, + 0xde, 0xff, 0xeb, 0x72, 0x0, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0xbe, 0xed, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xfd, 0x88, 0x88, 0x88, + 0x88, 0x88, 0xef, 0xff, 0x88, 0x88, 0x82, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x0, 0x0, + 0x0, + + /* U+0035 "5" */ + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x2, 0xff, 0xfc, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x0, 0x0, 0x3, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xe9, 0x99, 0x87, 0x64, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x47, 0xcf, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf7, 0x0, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf3, 0x2, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, + 0xb, 0xff, 0xfc, 0x62, 0x0, 0x0, 0x0, 0x4c, + 0xff, 0xff, 0x60, 0x1f, 0xff, 0xff, 0xff, 0xec, + 0xbb, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x2, 0x6a, + 0xce, 0xff, 0xec, 0x95, 0x0, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x8c, 0xef, 0xfe, + 0xda, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xeb, 0x99, 0x9b, 0xef, 0xf3, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x48, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x10, 0x1, 0x6b, 0xdf, 0xfe, 0xb7, 0x10, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x1f, 0xff, 0xfc, 0xff, 0xfe, 0x86, 0x56, + 0x9e, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x80, + 0xf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x0, 0xef, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, 0xc, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x70, 0x9f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x6, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x80, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0xaf, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x30, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x8, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xe9, 0x65, 0x69, 0xef, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, 0xce, + 0xff, 0xda, 0x50, 0x0, 0x0, 0x0, + + /* U+0037 "7" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xcf, 0xff, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0xaf, 0xff, 0xf0, 0xcf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0xcf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x20, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfb, 0x0, 0xcf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, + 0x9c, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x0, 0x15, 0xac, 0xef, 0xfd, 0xc8, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfe, 0x96, + 0x55, 0x7a, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x8f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, + 0xf4, 0x0, 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x2, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, + 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x1, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, 0x0, + 0xe, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xa0, 0x0, 0x7f, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, + 0xcf, 0xff, 0xf8, 0x41, 0x0, 0x15, 0xaf, 0xff, + 0xf8, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x6, 0xff, 0xff, + 0xf9, 0x53, 0x22, 0x36, 0xbf, 0xff, 0xfe, 0x20, + 0x2, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xfd, 0x0, 0xaf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf6, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xc2, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x3f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf2, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfe, 0xf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xb0, 0xaf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf6, 0x2, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, + 0x7, 0xff, 0xff, 0xfd, 0x96, 0x55, 0x7a, 0xef, + 0xff, 0xff, 0x30, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, + 0xfe, 0xca, 0x61, 0x0, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfd, 0xc8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xfc, 0x86, 0x57, 0xaf, + 0xff, 0xff, 0x70, 0x0, 0xb, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x3f, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xfd, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x50, 0xcf, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xb0, + 0xdf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf1, 0xdf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0xbf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf7, 0x7f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xf9, 0x1f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xfa, 0x7, + 0xff, 0xff, 0xe7, 0x30, 0x1, 0x4a, 0xff, 0xfe, + 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd5, 0xff, 0xfb, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x14, 0xff, 0xfb, + 0x0, 0x0, 0x29, 0xef, 0xff, 0xff, 0xfa, 0x40, + 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x2, 0x45, + 0x42, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf5, 0x0, + 0x0, 0x1a, 0x30, 0x0, 0x0, 0x0, 0x4d, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x9f, 0xfe, 0xa9, 0x89, + 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb3, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, + 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, + + /* U+003A ":" */ + 0x1, 0xbf, 0xc2, 0x0, 0xcf, 0xff, 0xd0, 0x1f, + 0xff, 0xff, 0x20, 0xff, 0xff, 0xf1, 0x9, 0xff, + 0xfa, 0x0, 0x5, 0x96, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x59, 0x60, 0x0, 0x9f, 0xff, 0xa0, 0xf, + 0xff, 0xff, 0x11, 0xff, 0xff, 0xf2, 0xc, 0xff, + 0xfd, 0x0, 0x2b, 0xfc, 0x20, + + /* U+003B ";" */ + 0x1, 0xbf, 0xc2, 0x0, 0xcf, 0xff, 0xd0, 0x1f, + 0xff, 0xff, 0x20, 0xff, 0xff, 0xf1, 0x9, 0xff, + 0xfa, 0x0, 0x5, 0x96, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x36, 0x40, 0x0, 0x6f, 0xff, 0x80, 0xe, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xf2, 0xc, 0xff, + 0xff, 0x0, 0x2d, 0xff, 0xc0, 0x0, 0x8f, 0xf7, + 0x0, 0xc, 0xff, 0x10, 0x0, 0xff, 0xc0, 0x0, + 0x4f, 0xf7, 0x0, 0x8, 0xff, 0x20, 0x0, 0xcf, + 0xc0, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x8e, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, 0xd6, 0x0, + 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xf9, 0x30, + 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xfc, 0x60, + 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, 0x93, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xc6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xe9, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, + 0xff, 0xff, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8e, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6c, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x50, + + /* U+003D "=" */ + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x95, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x95, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, + + /* U+003E ">" */ + 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xfb, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd7, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, + 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x17, 0xef, 0xff, 0xff, 0xfa, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, + 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xaf, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6d, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, + 0xff, 0xfa, 0x30, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xff, 0xfd, 0x71, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xfb, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x25, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xff, 0xeb, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0xaf, 0xff, 0xff, 0xea, 0x98, 0x9b, 0xff, 0xff, + 0xff, 0x20, 0x5f, 0xff, 0xfc, 0x40, 0x0, 0x0, + 0x1, 0x9f, 0xff, 0xfa, 0x0, 0x6f, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf0, 0x0, + 0x26, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xac, 0xcc, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xde, 0x80, 0x0, 0x0, 0x0, + 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x59, + 0xbd, 0xef, 0xfe, 0xda, 0x84, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xfd, + 0xcb, 0xcd, 0xef, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xc7, 0x30, 0x0, 0x0, 0x0, 0x14, 0x9e, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0x90, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x10, 0x0, 0x0, 0x1, 0x22, 0x10, + 0x3f, 0xff, 0x50, 0x0, 0x0, 0x6, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x28, 0xdf, 0xff, 0xfc, 0x71, + 0x0, 0xcf, 0xfb, 0x0, 0x4f, 0xfe, 0x10, 0x0, + 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0xc, 0xff, 0xb0, 0x0, + 0x9f, 0xf8, 0x0, 0x0, 0x7f, 0xfb, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xcf, 0xfb, 0x0, 0x1, 0xff, 0xf0, 0x0, 0xd, + 0xff, 0x40, 0x0, 0x0, 0xaf, 0xff, 0xfa, 0x41, + 0x1, 0x4b, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x8, + 0xff, 0x50, 0x3, 0xff, 0xd0, 0x0, 0x0, 0x5f, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x2f, 0xfb, 0x0, 0x7f, 0xf8, + 0x0, 0x0, 0xd, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xb0, 0x0, 0x0, 0xdf, + 0xf0, 0xa, 0xff, 0x40, 0x0, 0x4, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, + 0x0, 0x0, 0xa, 0xff, 0x20, 0xdf, 0xf1, 0x0, + 0x0, 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x7f, 0xf4, + 0xf, 0xff, 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfb, 0x0, + 0x0, 0x5, 0xff, 0x50, 0xff, 0xe0, 0x0, 0x0, + 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xb0, 0x0, 0x0, 0x4f, 0xf6, 0x1f, + 0xfd, 0x0, 0x0, 0xd, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x4, 0xff, 0x60, 0xff, 0xe0, 0x0, 0x0, 0xdf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xb0, 0x0, 0x0, 0x5f, 0xf5, 0xf, 0xff, + 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xfb, 0x0, 0x0, 0x7, + 0xff, 0x40, 0xdf, 0xf1, 0x0, 0x0, 0x7f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xb0, 0x0, 0x0, 0x9f, 0xf2, 0xa, 0xff, 0x40, + 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfb, 0x0, 0x0, 0xd, 0xff, + 0x0, 0x7f, 0xf8, 0x0, 0x0, 0xc, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, + 0x0, 0x2, 0xff, 0xa0, 0x2, 0xff, 0xd0, 0x0, + 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0x10, 0x0, 0xbf, 0xf5, 0x0, + 0xd, 0xff, 0x40, 0x0, 0x0, 0x8f, 0xff, 0xfc, + 0x63, 0x23, 0x6d, 0xff, 0xf8, 0xff, 0xfb, 0x33, + 0xaf, 0xfd, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x6, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x6, 0xbe, 0xff, 0xda, 0x50, 0x0, 0x0, + 0x3a, 0xef, 0xd9, 0x20, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfb, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xc7, 0x30, 0x0, 0x0, 0x0, 0x26, + 0xbf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xfe, + 0xdc, 0xcd, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, 0xff, + 0xfe, 0xc9, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x1e, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x7f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf3, 0x1, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfd, 0x0, 0xa, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x60, 0x0, 0x3f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf9, 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x20, 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfc, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x4a, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x3, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x1f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x50, 0x0, 0x8, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfc, 0x0, 0x0, 0xef, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf3, 0x0, 0x6f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xa0, 0xd, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x10, + + /* U+0042 "B" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, + 0x95, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0xc, 0xff, 0xf7, + 0x55, 0x55, 0x55, 0x55, 0x68, 0xcf, 0xff, 0xff, + 0x90, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0x20, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf8, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, 0xc, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, + 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x30, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xb0, 0x0, 0xcf, 0xff, + 0x75, 0x55, 0x55, 0x55, 0x56, 0x8c, 0xff, 0xff, + 0xd1, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x60, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x5b, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0x70, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfd, 0xc, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf1, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x3c, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf3, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x2c, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xe0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf8, + 0xc, 0xff, 0xf7, 0x55, 0x55, 0x55, 0x55, 0x56, + 0x7a, 0xff, 0xff, 0xfe, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc9, 0x60, + 0x0, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xad, 0xef, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xec, + 0xab, 0xcf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x4, + 0xaf, 0xff, 0xff, 0x20, 0x0, 0x2e, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0x50, 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0x50, 0x0, 0x5, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0x50, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xff, 0x60, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xe7, 0x20, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xeb, 0xab, 0xcf, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xad, 0xef, 0xfe, 0xc9, 0x40, 0x0, 0x0, 0x0, + + /* U+0044 "D" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xda, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xa9, 0x99, 0x99, 0x99, + 0x9b, 0xdf, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6d, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0x30, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xd0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfe, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x50, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xa0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf1, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf1, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xd0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xa0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfe, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf7, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xd0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x30, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6d, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xcf, 0xff, + 0xa9, 0x99, 0x99, 0x99, 0x9b, 0xdf, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xda, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc, + 0xff, 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x80, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x97, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x10, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x94, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, + + /* U+0046 "F" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xa9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0xcf, 0xff, 0xa8, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x10, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, + 0xfe, 0xca, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xec, + 0xbb, 0xce, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x3, + 0x8e, 0xff, 0xff, 0x60, 0x0, 0x2e, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0x90, 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x90, 0x0, 0x5, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4a, 0xaa, 0x40, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf7, + 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0xcf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf7, 0x8, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0x70, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf7, 0x0, 0xdf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x70, 0x5, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf7, 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, + 0x2e, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xe8, 0x20, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xec, 0xaa, 0xbe, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xad, 0xef, 0xfd, 0xc9, 0x51, 0x0, 0x0, 0x0, + + /* U+0048 "H" */ + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, + 0xa9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0xef, 0xff, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x40, + + /* U+0049 "I" */ + 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, 0x3c, + 0xff, 0xf3, 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, + 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, 0x3c, 0xff, + 0xf3, 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, + 0x3c, 0xff, 0xf3, 0xcf, 0xff, 0x3c, 0xff, 0xf3, + 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, 0x3c, + 0xff, 0xf3, 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, + 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, 0x3c, 0xff, + 0xf3, 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, + 0x30, + + /* U+004A "J" */ + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x4, 0x99, 0x99, 0x99, + 0x99, 0x9b, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, 0x0, 0x64, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf3, 0x4, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, + 0x1e, 0xff, 0xf7, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xa0, 0xc, 0xff, 0xff, 0xfb, 0x99, 0xcf, 0xff, + 0xff, 0x20, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x17, 0xbe, + 0xff, 0xda, 0x60, 0x0, 0x0, + + /* U+004B "K" */ + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xf7, 0xc, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf9, + 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xfa, 0x0, 0xc, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xfb, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfe, 0x10, 0x0, 0x0, 0xc, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf3, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x7, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf3, 0x0, 0x6, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x5, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf3, 0x4, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x33, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xd7, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xe2, 0x9, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xe2, 0x0, 0xb, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0xd, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xc, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0xc, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf5, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf2, 0x0, + 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xd1, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xb0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x80, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x50, + + /* U+004C "L" */ + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xa9, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x93, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, + + /* U+004D "M" */ + 0xcf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xcf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xcf, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xcf, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xcf, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xbf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfc, 0xef, 0xff, 0xcf, + 0xff, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf3, 0xef, 0xff, 0xcf, 0xff, + 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x90, 0xdf, 0xff, 0xcf, 0xff, 0x0, + 0xef, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x10, 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x5f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf7, + 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x0, + 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x3, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x40, 0x0, 0xdf, + 0xff, 0xcf, 0xff, 0x0, 0x0, 0x9f, 0xff, 0x50, + 0x0, 0x1, 0xff, 0xfb, 0x0, 0x0, 0xdf, 0xff, + 0xcf, 0xff, 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, + 0xa, 0xff, 0xf2, 0x0, 0x0, 0xdf, 0xff, 0xcf, + 0xff, 0x0, 0x0, 0x7, 0xff, 0xf8, 0x0, 0x3f, + 0xff, 0x90, 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x10, 0xcf, 0xfe, + 0x10, 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xa5, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfe, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xcf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x77, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, + + /* U+004E "N" */ + 0xcf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf4, 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf4, 0xcf, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, + 0xff, 0xfd, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x4d, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x4c, 0xff, 0xf3, 0x2f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, + 0x5f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x9f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, + 0x30, 0x0, 0xcf, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x1, 0xef, + 0xff, 0xe1, 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, + 0xff, 0x30, 0x0, 0x4, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x80, 0x0, 0xb, 0xff, 0xf4, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x40, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xfe, 0x20, 0xb, 0xff, + 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xfd, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfa, 0xb, + 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf6, 0xbf, 0xff, 0x4c, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfd, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0x4c, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xf4, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x40, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xeb, 0xab, 0xcf, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xe7, 0x20, 0x0, 0x0, 0x4, + 0xaf, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2c, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x60, 0x0, 0x5, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfe, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf7, 0x0, 0x3f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xd0, 0x8, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x20, 0xcf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf6, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x80, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfa, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xa0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, + 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x80, + 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf6, 0x8, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x20, 0x3f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, 0x0, 0xdf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf7, 0x0, 0x5, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfe, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x60, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xe7, 0x20, 0x0, 0x0, 0x3, 0xaf, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xeb, 0xab, 0xcf, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xad, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0050 "P" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xa6, + 0x10, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xc, 0xff, 0xfa, 0x99, 0x99, 0x99, + 0x9a, 0xdf, 0xff, 0xff, 0xf7, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x17, 0xff, 0xff, + 0xf4, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xc0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x3c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf8, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xac, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfc, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xcc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfa, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x8c, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf3, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xfd, 0xc, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, 0x40, + 0xcf, 0xff, 0xa9, 0x99, 0x99, 0x99, 0xad, 0xff, + 0xff, 0xff, 0x70, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xda, 0x72, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xeb, 0xab, 0xcf, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe7, + 0x20, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x4, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf7, 0x0, 0x0, 0x3f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x8, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, 0xbf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, 0xe, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x1f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, 0x0, + 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x80, + 0x0, 0xcf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf6, + 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x20, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xe0, 0x0, 0x0, 0xef, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xf7, 0x0, 0x0, 0x7, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x10, 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xd5, 0x0, 0x0, 0x0, 0x2, 0x8f, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xc9, 0x89, 0xad, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x59, 0xce, 0xff, 0xff, 0xfe, + 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x47, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfe, 0x85, 0x47, 0xcf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xd9, 0x30, + 0x0, 0x0, + + /* U+0052 "R" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xa6, + 0x10, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0xcf, 0xff, 0xa9, 0x99, + 0x99, 0x99, 0xad, 0xff, 0xff, 0xff, 0x50, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x17, + 0xff, 0xff, 0xf3, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfb, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x20, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x70, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xa0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xc0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x90, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf8, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x14, 0x8e, + 0xff, 0xff, 0xd0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x98, 0x88, 0x88, 0x87, 0x7f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xa0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf6, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x20, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x30, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, + + /* U+0053 "S" */ + 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xfe, 0xda, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xb9, + 0x88, 0x9c, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xcf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, + 0x30, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x80, 0x0, 0x8, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfe, 0xa6, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xe9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xae, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x9f, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x7f, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xb0, 0xe, 0xff, 0xfb, 0x51, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xf4, 0x2, + 0xef, 0xff, 0xff, 0xfc, 0xa9, 0x88, 0xad, 0xff, + 0xff, 0xf9, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x59, 0xce, 0xff, + 0xfe, 0xb8, 0x30, 0x0, 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x79, 0x99, 0x99, 0x99, + 0x9a, 0xff, 0xfe, 0x99, 0x99, 0x99, 0x99, 0x92, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xa0, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfa, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfa, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfa, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfa, 0xf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xa0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfa, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xa0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0xf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xa0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xa0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x90, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf8, 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0xcf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf5, 0x8, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x5f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe0, 0x0, 0xef, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf8, 0x0, + 0x7, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x10, 0x0, 0xd, 0xff, 0xff, + 0xb3, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xfe, 0xca, 0xbc, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x5a, 0xde, 0xff, 0xdc, 0x84, 0x0, + 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0x6, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x70, 0x0, 0x8f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x10, 0x0, 0x2f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf9, 0x0, 0x0, 0xb, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf2, 0x0, 0x0, 0x4, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, + 0xef, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf1, 0x0, 0x5, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf8, 0x0, 0xc, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xfe, 0x0, 0x3f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x50, 0xaf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xc1, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfb, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0x8f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x93, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf4, 0xe, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, + 0x0, 0x9f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x4, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf4, 0x0, 0xe, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf9, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x4, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf5, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x9f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf5, 0x3, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, + 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, + 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x10, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x60, 0x0, + 0x0, 0x5, 0xff, 0xf5, 0x0, 0x3, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, + 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf1, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, + 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, 0xcf, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x50, + 0x0, 0x5, 0xff, 0xf6, 0x0, 0x0, 0x4, 0xff, + 0xf8, 0x0, 0x0, 0x1f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, 0x0, 0xaf, + 0xff, 0x10, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, + 0x6, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf0, 0x0, 0xf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, 0xbf, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x50, 0x5, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf8, 0x0, 0x1f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, 0xaf, + 0xff, 0x10, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, + 0x6, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf0, 0xf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x30, 0xbf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x45, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf8, 0x1f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xbf, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xd6, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xef, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xdf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0x7, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf5, 0x0, 0xc, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x3f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfe, 0x10, 0x0, 0xd, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfb, 0x0, 0x9, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, + 0x4, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf3, 0xef, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x6f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0x60, 0x9f, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, + 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xe1, 0x0, 0x3, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf5, 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, + 0x0, 0x0, 0x1, 0xef, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, 0x0, + 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xa0, 0x0, 0x6f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x50, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x10, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x4, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x20, 0x0, 0xbf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf9, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xe1, 0x0, + 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x8, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xf4, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, + 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x4, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0xd, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf9, 0x7f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9e, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfa, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x91, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x24, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, + + /* U+005B "[" */ + 0xcf, 0xff, 0xff, 0xff, 0x9c, 0xff, 0xff, 0xff, + 0xf9, 0xcf, 0xff, 0xff, 0xff, 0x9c, 0xff, 0xf4, + 0x44, 0x42, 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, + 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0xc, + 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, + 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, + 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, + 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, + 0xff, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, + 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, + 0x0, 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, 0xf0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, + 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0xc, + 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, + 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, + 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, + 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, + 0xff, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, + 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, + 0x0, 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, 0xf4, + 0x33, 0x32, 0xcf, 0xff, 0xff, 0xff, 0x9c, 0xff, + 0xff, 0xff, 0xf9, 0xcf, 0xff, 0xff, 0xff, 0x90, + + /* U+005C "\\" */ + 0x38, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, + + /* U+005D "]" */ + 0x3f, 0xff, 0xff, 0xff, 0xf2, 0x3f, 0xff, 0xff, + 0xff, 0xf2, 0x3f, 0xff, 0xff, 0xff, 0xf2, 0x4, + 0x44, 0x4c, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, + 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, + 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, + 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, + 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, + 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, + 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, + 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, + 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, + 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, + 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, + 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, + 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, + 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, + 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, + 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x3, + 0x33, 0x3c, 0xff, 0xf2, 0x3f, 0xff, 0xff, 0xff, + 0xf2, 0x3f, 0xff, 0xff, 0xff, 0xf2, 0x3f, 0xff, + 0xff, 0xff, 0xf2, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xcf, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x2c, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfc, 0x6, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf5, 0x0, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xe0, 0x0, 0x9f, 0xf6, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x80, 0x0, 0x3f, 0xfc, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0xc, 0xff, + 0x30, 0x0, 0x0, 0x4f, 0xfb, 0x0, 0x0, 0x6, + 0xff, 0x90, 0x0, 0x0, 0xbf, 0xf5, 0x0, 0x0, + 0x0, 0xff, 0xf1, 0x0, 0x2, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x8, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x2f, 0xfd, 0x0, 0xe, 0xff, + 0x10, 0x0, 0x0, 0x0, 0xc, 0xff, 0x40, 0x6f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xb0, + 0xcf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf1, + + /* U+005F "_" */ + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x7, 0x88, 0x86, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x4, 0xef, + 0xf8, + + /* U+0061 "a" */ + 0x0, 0x0, 0x48, 0xbd, 0xef, 0xed, 0x95, 0x0, + 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x30, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x1, 0xef, 0xff, 0xfb, + 0x87, 0x79, 0xcf, 0xff, 0xff, 0x20, 0x7, 0xfc, + 0x50, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xf9, 0x0, + 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x5, + 0x8b, 0xcd, 0xdd, 0xdd, 0xde, 0xff, 0xf7, 0x0, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x3f, 0xff, 0xf9, 0x31, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x7a, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf7, 0xef, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x7f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf7, + 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x7a, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf7, 0x4f, 0xff, 0xfc, 0x52, 0x11, + 0x4a, 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xf7, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xe4, 0x3f, 0xff, 0x70, + 0x0, 0x17, 0xce, 0xff, 0xda, 0x60, 0x3, 0xff, + 0xf7, + + /* U+0062 "b" */ + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf7, 0x0, 0x16, 0xbd, 0xff, 0xeb, 0x61, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x5, 0xff, + 0xf7, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x5f, 0xff, 0xef, 0xff, 0xfc, 0x97, + 0x9b, 0xff, 0xff, 0xfd, 0x10, 0x5, 0xff, 0xff, + 0xff, 0xb2, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xfb, + 0x0, 0x5f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf5, 0x5, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xc0, + 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x15, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, 0x5f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x85, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x95, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf7, 0x5f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x55, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf1, 0x5f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x5, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x50, 0x5f, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x1a, 0xff, 0xff, 0xb0, 0x5, 0xff, + 0xfc, 0xff, 0xff, 0xc9, 0x79, 0xbf, 0xff, 0xff, + 0xe1, 0x0, 0x5f, 0xff, 0x59, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x5, 0xff, 0xf5, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x5f, 0xff, 0x50, 0x1, 0x6b, 0xdf, 0xfe, + 0xb6, 0x10, 0x0, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x0, 0x3, 0x8c, 0xef, 0xfe, 0xb6, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xd9, 0x78, 0xaf, 0xff, + 0xff, 0xb0, 0x0, 0x5f, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x40, 0xe, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xfe, 0x40, 0x7, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, + 0x0, 0xef, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xe5, 0x0, 0x5, 0xff, 0xff, 0xc3, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf4, 0x0, 0x8, 0xff, + 0xff, 0xfd, 0x97, 0x8a, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x38, 0xce, 0xff, 0xeb, 0x61, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfe, 0xc7, 0x20, + 0x3, 0xff, 0xfa, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xa0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 0xff, 0xfa, 0x0, 0xa, 0xff, 0xff, 0xfc, 0x97, + 0x8b, 0xff, 0xff, 0xef, 0xff, 0xa0, 0x7, 0xff, + 0xff, 0xc3, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, + 0xfa, 0x1, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xa0, 0x8f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, + 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xa1, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x3f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xa4, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0x4f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xa3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfa, 0x1f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xa0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfa, 0x7, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xa0, + 0x1f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xfa, 0x0, 0x7f, 0xff, 0xfc, 0x30, + 0x0, 0x0, 0x18, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xaf, 0xff, 0xff, 0xd9, 0x78, 0xbf, 0xff, 0xfc, + 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xa0, 0x0, 0x0, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xec, + 0x72, 0x0, 0xf, 0xff, 0xa0, + + /* U+0065 "e" */ + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xec, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xd9, 0x65, 0x7a, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x6f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xfe, 0x10, 0x1, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x90, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf0, 0xd, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf5, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf9, 0x3f, 0xff, 0xed, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xff, 0xfb, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xc0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x40, + 0x0, 0x0, 0x1, 0xaf, 0xfa, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xfd, 0x98, 0x79, 0xcf, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x3, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x8c, 0xef, 0xfd, 0xc8, 0x30, + 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x2, 0x9d, 0xff, 0xea, 0x40, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x1f, 0xff, 0xfc, 0x64, 0x6c, 0xa0, + 0x0, 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x13, 0x33, 0xdf, 0xff, 0x43, 0x33, 0x33, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xec, 0x83, + 0x0, 0xb, 0xff, 0xe0, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x20, 0xbf, 0xfe, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4b, 0xff, 0xe0, 0x0, 0xcf, 0xff, 0xff, 0xc9, + 0x78, 0x9d, 0xff, 0xff, 0xef, 0xfe, 0x0, 0x9f, + 0xff, 0xfb, 0x20, 0x0, 0x0, 0x4, 0xdf, 0xff, + 0xff, 0xe0, 0x2f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xfe, 0x9, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xe0, 0xef, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfe, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe4, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfe, 0x4f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xe4, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfe, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe0, 0xef, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfe, 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xe0, 0x2f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xfe, + 0x0, 0x8f, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x5, + 0xef, 0xff, 0xff, 0xe0, 0x0, 0xcf, 0xff, 0xff, + 0xd9, 0x78, 0xae, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3e, 0xff, 0xe0, 0x0, 0x0, 0x6e, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x5, 0xad, 0xff, 0xec, 0x83, 0x0, 0xf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf4, 0x0, 0xc, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, + 0x6, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xff, 0x70, 0x0, 0xff, 0xff, 0xff, 0xea, + 0x87, 0x79, 0xcf, 0xff, 0xff, 0xb0, 0x0, 0x5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x7a, 0xde, 0xff, 0xec, 0x95, 0x0, 0x0, + 0x0, + + /* U+0068 "h" */ + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf7, 0x0, 0x16, 0xbd, 0xff, 0xda, 0x60, 0x0, + 0x0, 0x5f, 0xff, 0x70, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x5, 0xff, 0xf8, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xfb, 0x99, 0xae, 0xff, 0xff, 0xf3, + 0x5, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xc0, 0x5f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x25, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf6, + 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x95, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfb, 0x5f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc5, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xc5, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x5f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xc5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xfc, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc5, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xc5, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xc5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc0, + + /* U+0069 "i" */ + 0x0, 0x37, 0x40, 0x0, 0x7f, 0xff, 0x90, 0xe, + 0xff, 0xff, 0x10, 0xff, 0xff, 0xf1, 0x9, 0xff, + 0xfa, 0x0, 0x6, 0x96, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x5f, + 0xff, 0x70, 0x5, 0xff, 0xf7, 0x0, 0x5f, 0xff, + 0x70, 0x5, 0xff, 0xf7, 0x0, 0x5f, 0xff, 0x70, + 0x5, 0xff, 0xf7, 0x0, 0x5f, 0xff, 0x70, 0x5, + 0xff, 0xf7, 0x0, 0x5f, 0xff, 0x70, 0x5, 0xff, + 0xf7, 0x0, 0x5f, 0xff, 0x70, 0x5, 0xff, 0xf7, + 0x0, 0x5f, 0xff, 0x70, 0x5, 0xff, 0xf7, 0x0, + 0x5f, 0xff, 0x70, 0x5, 0xff, 0xf7, 0x0, 0x5f, + 0xff, 0x70, 0x5, 0xff, 0xf7, 0x0, 0x5f, 0xff, + 0x70, 0x5, 0xff, 0xf7, 0x0, 0x5f, 0xff, 0x70, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x97, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf8, 0x0, 0x10, 0x0, 0x0, 0xdf, + 0xff, 0x40, 0xc, 0xc7, 0x57, 0xdf, 0xff, 0xe0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x5b, 0xef, + 0xfd, 0x92, 0x0, 0x0, + + /* U+006B "k" */ + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x30, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf4, + 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0x40, 0x0, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x5f, + 0xff, 0x70, 0x0, 0x0, 0xa, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0xbf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x70, 0x1, 0xcf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x1d, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x71, 0xdf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xae, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xfe, 0x39, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xe2, 0x0, 0xcf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, + 0x20, 0x0, 0x1e, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xd2, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf6, 0x0, 0x0, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, + 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xd0, 0x0, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfa, 0x0, 0x5f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x60, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf3, + + /* U+006C "l" */ + 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x75, + 0xff, 0xf7, 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, + 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x75, 0xff, + 0xf7, 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, + 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x75, 0xff, 0xf7, + 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x75, + 0xff, 0xf7, 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, + 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x75, 0xff, + 0xf7, 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, + 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x70, + + /* U+006D "m" */ + 0x5f, 0xff, 0x50, 0x2, 0x8c, 0xef, 0xec, 0x93, + 0x0, 0x0, 0x0, 0x16, 0xbe, 0xff, 0xeb, 0x71, + 0x0, 0x0, 0x5f, 0xff, 0x51, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x5f, 0xff, 0x6d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xb7, 0x56, 0x8e, 0xff, 0xff, 0xbb, + 0xff, 0xff, 0xa6, 0x56, 0xaf, 0xff, 0xff, 0x50, + 0x5f, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xd0, 0x5f, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf4, 0x5f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x5f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, + 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xfc, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, + + /* U+006E "n" */ + 0x5f, 0xff, 0x50, 0x2, 0x7b, 0xdf, 0xfd, 0xa6, + 0x0, 0x0, 0x5, 0xff, 0xf5, 0x19, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x5f, 0xff, 0x6d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x5, + 0xff, 0xff, 0xff, 0xfc, 0x86, 0x57, 0xbf, 0xff, + 0xff, 0x30, 0x5f, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xfc, 0x5, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x5f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x65, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf9, 0x5f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb5, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xc5, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xc5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc5, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xc5, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xfc, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc5, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xc5, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, + + /* U+006F "o" */ + 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfd, 0xa6, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xc9, + 0x78, 0xaf, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x5f, + 0xff, 0xfc, 0x30, 0x0, 0x0, 0x18, 0xff, 0xff, + 0xc0, 0x0, 0xe, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x60, 0x7, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfd, + 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf3, 0xf, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x73, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf9, 0x4f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xb4, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfa, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf7, 0xc, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x30, 0x7f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, + 0x0, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xff, 0xc3, + 0x0, 0x0, 0x1, 0x8f, 0xff, 0xfb, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xfd, 0x97, 0x8b, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xce, 0xff, + 0xda, 0x60, 0x0, 0x0, 0x0, + + /* U+0070 "p" */ + 0x5f, 0xff, 0x50, 0x1, 0x6b, 0xdf, 0xfe, 0xb6, + 0x10, 0x0, 0x0, 0x5, 0xff, 0xf5, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x5f, + 0xff, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x5, 0xff, 0xfe, 0xff, 0xfe, 0x85, + 0x45, 0x8e, 0xff, 0xff, 0xd1, 0x0, 0x5f, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xb0, 0x5, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, + 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf1, 0x5f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x55, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf8, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x95, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf9, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x75, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf5, 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x15, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, + 0x5f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf5, 0x5, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xfb, 0x0, 0x5f, + 0xff, 0xdf, 0xff, 0xfc, 0x97, 0x9b, 0xff, 0xff, + 0xfe, 0x10, 0x5, 0xff, 0xf7, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x5f, 0xff, + 0x70, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x5, 0xbd, 0xff, + 0xeb, 0x61, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xec, 0x72, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x1f, 0xff, 0xa0, 0x0, 0xaf, 0xff, 0xff, 0xc9, + 0x78, 0xbf, 0xff, 0xfc, 0xff, 0xfa, 0x0, 0x7f, + 0xff, 0xfc, 0x30, 0x0, 0x0, 0x18, 0xff, 0xff, + 0xff, 0xa0, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xfa, 0x8, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xa0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfa, 0x1f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xa3, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xfa, 0x4f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa4, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfa, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa1, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfa, 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xa0, 0x7f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, + 0x1, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xa0, 0x7, 0xff, 0xff, 0xc3, + 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xfa, 0x0, + 0xa, 0xff, 0xff, 0xfd, 0x97, 0x8b, 0xff, 0xff, + 0xdf, 0xff, 0xa0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc3, 0xff, 0xfa, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfe, + 0xc7, 0x10, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfa, + + /* U+0072 "r" */ + 0x5f, 0xff, 0x50, 0x1, 0x6b, 0xdf, 0x5, 0xff, + 0xf5, 0x7, 0xff, 0xff, 0xf0, 0x5f, 0xff, 0x5a, + 0xff, 0xff, 0xff, 0x5, 0xff, 0xfb, 0xff, 0xff, + 0xfd, 0xc0, 0x5f, 0xff, 0xff, 0xfb, 0x30, 0x0, + 0x5, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xdb, 0x83, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8, 0xff, 0xff, + 0xd8, 0x66, 0x78, 0xcf, 0xff, 0x60, 0x0, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x18, 0xc0, 0x0, + 0x4f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xb8, 0x52, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa4, 0x0, + 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x4, 0x7a, 0xdf, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x9f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0x0, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xc0, 0x1f, 0xf9, 0x30, 0x0, 0x0, 0x0, + 0x1b, 0xff, 0xf8, 0x8, 0xff, 0xff, 0xea, 0x87, + 0x78, 0xaf, 0xff, 0xff, 0x10, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x6d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x3, 0x7a, 0xde, 0xff, 0xec, 0x83, 0x0, + 0x0, + + /* U+0074 "t" */ + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x13, 0x33, 0xdf, 0xff, 0x43, 0x33, 0x33, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x75, 0x7d, 0xb0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x4, 0xae, 0xff, 0xd9, 0x20, + + /* U+0075 "u" */ + 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x69, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf6, 0x9f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x69, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf6, 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x69, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, 0x9f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x69, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf6, 0x9f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x69, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf6, 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x69, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, 0x8f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x67, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf6, 0x6f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x63, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x60, 0x8f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf6, 0x1, 0xef, 0xff, + 0xff, 0xb9, 0x9a, 0xef, 0xff, 0xdf, 0xff, 0x60, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 0xff, 0xf6, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x49, + 0xde, 0xfe, 0xc7, 0x20, 0x3, 0xff, 0xf6, + + /* U+0076 "v" */ + 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf3, 0x7, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, + 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x50, 0x0, 0x9f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x0, + 0x0, 0x2f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf8, 0x0, 0x0, 0xc, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, + 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xd0, 0x0, 0x0, 0x5, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, 0xc, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfa, 0x0, 0x0, 0x3f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x10, 0x0, 0xaf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x70, 0x1, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x7, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf5, 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xdf, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0x9f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf8, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf2, 0xd, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xd0, 0x8, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x70, + 0x2, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x10, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfe, 0xef, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x7f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0xef, 0xf8, 0x9f, 0xff, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf6, 0x0, 0x0, 0x1f, + 0xff, 0x80, 0x0, 0x0, 0x4, 0xff, 0xf2, 0x3f, + 0xff, 0x50, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, + 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0xa, 0xff, + 0xd0, 0xd, 0xff, 0xb0, 0x0, 0x0, 0xc, 0xff, + 0xa0, 0x0, 0x0, 0x5, 0xff, 0xf3, 0x0, 0x0, + 0x1f, 0xff, 0x70, 0x7, 0xff, 0xf1, 0x0, 0x0, + 0x2f, 0xff, 0x40, 0x0, 0x0, 0x0, 0xff, 0xf9, + 0x0, 0x0, 0x6f, 0xff, 0x10, 0x1, 0xff, 0xf6, + 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfe, 0x0, 0x0, 0xcf, 0xfb, 0x0, 0x0, + 0xbf, 0xfc, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x40, 0x2, 0xff, 0xf5, + 0x0, 0x0, 0x5f, 0xff, 0x20, 0x3, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xa0, 0x7, + 0xff, 0xe0, 0x0, 0x0, 0xf, 0xff, 0x70, 0x9, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf0, 0xd, 0xff, 0x90, 0x0, 0x0, 0xa, 0xff, + 0xd0, 0xe, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf5, 0x3f, 0xff, 0x30, 0x0, 0x0, + 0x4, 0xff, 0xf3, 0x4f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x9f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf8, 0xaf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xef, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0xa, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xb0, 0x1, 0xdf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfe, 0x10, 0x0, 0x3f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf3, + 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x70, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x80, 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xf4, 0x0, 0x2f, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, 0x10, + 0xdf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xc9, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xfe, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x54, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfa, 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xd0, 0x0, 0xc, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, + 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, 0xc, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfa, 0x0, 0x5, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, 0x2e, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf2, + + /* U+0079 "y" */ + 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf3, 0x6, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, + 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x50, 0x0, 0x9f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x0, + 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf7, 0x0, 0x0, 0xb, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, + 0x0, 0x4, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x90, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xe0, 0x0, 0x0, 0x5, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0xc, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfc, 0x0, 0x0, 0x3f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x9f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xa0, 0x1, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf1, 0x7, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf7, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x5f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xef, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, 0x0, + 0xbf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfd, 0x86, 0x8e, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, 0xef, 0xec, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x36, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x15, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x56, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, + + /* U+007B "{" */ + 0x0, 0x0, 0x0, 0x6c, 0xef, 0xf4, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf4, 0x0, 0x1, 0xff, 0xff, 0xc6, 0x41, + 0x0, 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xf1, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x34, 0x7f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xb5, 0x31, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6c, + 0xef, 0xf4, + + /* U+007C "|" */ + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + + /* U+007D "}" */ + 0x3f, 0xfe, 0xc6, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x4, 0x5b, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0xe, 0xff, 0xf8, 0x43, 0x0, 0x0, 0x2f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x70, 0x0, 0x3, 0x5b, 0xff, 0xff, 0x30, 0x0, + 0x3f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x3f, 0xfe, 0xc7, 0x0, + 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x9e, 0xff, 0xa3, 0x0, 0x0, + 0x0, 0x7, 0xcb, 0x1, 0xef, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xcf, 0xd0, 0xbf, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x2f, 0xfa, 0x2f, 0xff, + 0x50, 0x2a, 0xff, 0xfd, 0x41, 0x3d, 0xff, 0x66, + 0xff, 0x60, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x9f, 0xf0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xf4, 0x7, 0xba, 0x0, 0x0, 0x0, 0x0, + 0x8d, 0xfe, 0xa2, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7e, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xdf, 0xe6, + 0x10, 0x29, 0xff, 0x90, 0x7, 0xfe, 0x20, 0x0, + 0x0, 0x6f, 0xf3, 0xe, 0xf7, 0x0, 0x0, 0x0, + 0xb, 0xfa, 0x1f, 0xf2, 0x0, 0x0, 0x0, 0x6, + 0xfd, 0x2f, 0xf1, 0x0, 0x0, 0x0, 0x5, 0xfe, + 0x1f, 0xf3, 0x0, 0x0, 0x0, 0x7, 0xfd, 0xd, + 0xf8, 0x0, 0x0, 0x0, 0xd, 0xf9, 0x6, 0xff, + 0x40, 0x0, 0x0, 0x9f, 0xf2, 0x0, 0xbf, 0xfa, + 0x53, 0x6c, 0xff, 0x70, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x4b, 0xef, 0xd9, + 0x30, 0x0, + + /* U+2022 "•" */ + 0x0, 0x16, 0x84, 0x0, 0x3, 0xef, 0xff, 0xa0, + 0xe, 0xff, 0xff, 0xf7, 0x4f, 0xff, 0xff, 0xfc, + 0x5f, 0xff, 0xff, 0xfd, 0x2f, 0xff, 0xff, 0xfa, + 0xa, 0xff, 0xff, 0xf2, 0x0, 0x8e, 0xfc, 0x30, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xcf, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x9e, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x48, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x59, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x94, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc7, 0x20, 0x0, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xea, 0x51, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xcf, + 0xfe, 0xcf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, 0x9c, 0xff, + 0xec, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x39, 0xdf, 0xff, 0xd9, 0x30, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x9d, 0xff, 0xfd, 0x93, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x5e, 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x8, 0xe5, 0xef, 0x80, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x8, 0xfe, + 0xff, 0xe8, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x88, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1d, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0xb, 0xff, + 0xff, 0x80, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x40, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0xb, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x8, 0xff, + 0xff, 0x80, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x40, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x0, 0x1d, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe8, 0x88, 0x9f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xd8, 0x88, 0x8e, 0xff, 0xff, 0x80, 0x0, 0xb, + 0xff, 0xff, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xff, 0xff, 0x50, 0x0, 0x8, 0xff, + 0xff, 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x8, 0xff, + 0xff, 0x80, 0x0, 0xb, 0xff, 0xff, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, + 0x50, 0x0, 0x8, 0xff, 0xff, 0xe8, 0x88, 0x9f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xd8, 0x88, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x1d, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x80, 0x0, 0xb, 0xff, 0xff, 0x80, 0x0, 0xb, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x8, 0xff, + 0xff, 0x80, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x40, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0xb, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x8, 0xff, + 0xff, 0xa0, 0x0, 0x1d, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x88, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd8, 0x88, 0x8e, 0xff, + 0xef, 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x8, 0xfe, 0x5e, 0x80, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x8, 0xe5, + + /* U+F00B "" */ + 0x3, 0x44, 0x44, 0x44, 0x44, 0x10, 0x0, 0x2, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x30, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x2a, 0xbb, 0xbb, 0xbb, 0xbb, 0x80, 0x0, 0x19, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x44, 0x44, 0x44, + 0x44, 0x10, 0x0, 0x2, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x2a, 0xbb, 0xbb, 0xbb, + 0xbb, 0x80, 0x0, 0x19, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa2, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x5, 0xdb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x22, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xcc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "ï€" */ + 0x0, 0x17, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x79, 0x40, 0x0, 0x2, 0xef, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xf8, 0x0, 0x1e, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0x80, 0xbf, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf7, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xef, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf7, + 0xcf, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf4, 0x3f, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xb0, 0x4, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xfb, 0x0, 0x0, 0x3b, 0xc7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xac, 0x80, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xe3, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x3e, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfd, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0xdf, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x60, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x6, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xfd, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x30, + 0x9, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0x80, 0xd, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xd0, + 0xf, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf4, 0x5f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xf5, + 0x5f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xf5, 0x4f, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf4, + 0x3f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x78, 0x87, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf1, + 0xd, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xd0, 0x9, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x90, + 0x3, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xef, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x51, 0x0, 0x0, 0x16, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9d, + 0xff, 0xff, 0xff, 0xff, 0xd9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x45, 0x54, 0x31, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x34, 0x55, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, + 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, + 0x0, 0x1, 0x60, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xe6, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x7f, 0xfb, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xda, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xad, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xcc, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x0, 0x4, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x1a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x40, 0x0, 0x4, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcc, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xad, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x6e, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, + 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, + 0x0, 0x0, 0x1, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x55, 0x43, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x31, 0x0, 0x0, 0x0, 0x0, + 0x24, 0x44, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0x2, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0x0, 0x2f, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x2, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xfd, 0x7d, 0xff, 0xff, 0xff, 0xb3, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xfb, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x5, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x2d, 0xfd, 0x20, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x4e, 0xff, 0xfe, 0x40, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x60, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0x50, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xfe, 0x30, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xfc, 0x10, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xd2, 0x5, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xf5, 0xef, 0xff, 0xff, + 0xf7, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xf4, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x4, 0xff, + 0xff, 0xf7, 0xa, 0xff, 0xd2, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x2, 0xdf, 0xfa, + 0x0, 0xc, 0xb1, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x1, 0xbc, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdb, 0xbb, 0xbb, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, + 0xbb, 0xbb, 0xbb, 0xbb, 0xb3, 0x0, 0x0, 0x0, + 0x3, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0x10, 0x0, + 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xbc, 0xcc, 0xcc, 0xcb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xcc, 0xcc, 0xcc, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xcc, 0xcc, 0xcc, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x42, 0x0, 0x4f, 0xff, 0xff, 0xf4, + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x4, 0xff, 0xff, 0x40, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x4f, 0xf4, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc8, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x2, 0xef, 0x90, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xbf, + 0x30, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x46, 0xff, 0xc4, 0x6f, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x9e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xfe, 0x10, 0x0, + 0xa, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xfa, 0x0, 0x5, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf5, 0x1, 0xef, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xe1, 0x9f, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x25, 0x67, 0x75, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xc7, 0x10, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x40, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x6f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x5f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x5f, 0xff, 0xff, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xa6, 0x42, 0x24, 0x7b, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x5f, 0xff, 0xff, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfe, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xe, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x6f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x21, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x4, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x9, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3, 0x55, 0x55, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x53, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x47, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x67, 0x77, 0x40, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xec, 0xdd, 0xef, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xfd, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf6, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x50, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xef, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xb7, 0x42, 0x24, 0x6b, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0xff, 0xff, 0xf5, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xf5, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf6, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x4, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0x67, 0x76, 0x52, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0x3, 0x44, 0x44, 0x44, 0x44, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2a, 0xbb, + 0xbb, 0xbb, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x33, 0x33, 0x33, 0x33, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x2, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xcf, 0xd2, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x4, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x2, + 0xff, 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x4e, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x3, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xdf, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x2, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x2d, 0xff, 0xf7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x5, + 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, 0xef, + 0xe4, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x14, 0x10, + 0x0, 0x3b, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2a, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x16, 0x40, 0x0, + 0x0, 0xbf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xb1, 0x0, 0x0, + 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xd2, 0x0, 0x2, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xe1, 0x0, 0x8, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xc0, 0x0, 0xe, 0xff, 0xf4, 0x0, + 0x34, 0x44, 0x44, 0x44, 0x4d, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x60, 0x0, 0x6f, 0xff, 0xa0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x7, 0xff, 0xfe, + 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xd, 0xfe, 0x30, 0x0, 0xc, 0xff, 0xf6, 0x0, + 0xa, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x5, 0xff, + 0xff, 0x30, 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x5f, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x2f, 0xff, 0xfe, + 0x0, 0x0, 0xdf, 0xff, 0x10, 0x2, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x3e, 0xff, 0xf7, 0x0, + 0x9, 0xff, 0xf4, 0x0, 0xe, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x2f, 0xff, 0xc0, 0x0, 0x5f, + 0xff, 0x60, 0x0, 0xdf, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xdf, 0xfe, 0x0, 0x4, 0xff, 0xf7, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xd, 0xff, 0xe0, 0x0, 0x4f, 0xff, 0x70, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x2, 0xff, + 0xfc, 0x0, 0x5, 0xff, 0xf6, 0x0, 0xd, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x3, 0xdf, 0xff, 0x70, + 0x0, 0x9f, 0xff, 0x40, 0x0, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x2, 0xff, 0xff, 0xe0, 0x0, 0xd, + 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x4, 0xff, 0xfc, + 0x0, 0x5, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, + 0xdf, 0xe3, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, + 0xaf, 0xff, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x30, + 0x0, 0x0, 0x7f, 0xff, 0xe0, 0x0, 0x1f, 0xff, + 0xf0, 0x2a, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf6, 0x0, 0x7, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xfc, 0x0, 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfe, 0x10, + 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfd, 0x20, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xfb, 0x10, 0x0, 0x1d, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1, + 0x74, 0x0, 0x0, 0xc, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xaa, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x67, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x81, 0x0, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x4f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x4, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x3, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, + + /* U+F043 "ïƒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, + 0xf4, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xf0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xef, 0xff, 0xf1, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xcf, 0xff, 0xf4, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9f, 0xff, + 0xf9, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x4f, 0xff, 0xff, 0x20, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xe, 0xff, 0xff, 0xb0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x7, 0xff, 0xff, 0xf9, 0x0, 0x2, 0x68, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0x94, 0x10, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xad, + 0xff, 0xfd, 0xb7, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "ïˆ" */ + 0x24, 0x44, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x41, 0xe, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf4, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xdf, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x98, 0xbb, 0xbb, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8b, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "ï‹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xfe, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "ïŒ" */ + 0x1, 0x9c, 0xcc, 0xcc, 0xcc, 0xcc, 0x91, 0x0, + 0x0, 0x0, 0x1, 0x9c, 0xcc, 0xcc, 0xcc, 0xcc, + 0x91, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x23, 0x33, + 0x33, 0x33, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x33, 0x33, 0x33, 0x20, 0x0, + + /* U+F04D "ï" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x10, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x17, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0x10, + + /* U+F051 "ï‘" */ + 0x1, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x44, 0x44, 0x24, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xfe, 0xef, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xaf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xf0, 0x7b, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, + 0xbb, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x75, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x7, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb7, 0x0, + + /* U+F053 "ï“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F054 "ï”" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xd2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x44, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xfa, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8b, 0xbb, 0x81, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "ï¨" */ + 0x4, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x84, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0xbe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xa1, + + /* U+F06E "ï®" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x36, 0xac, 0xde, 0xfe, 0xdc, 0xa6, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xfe, 0x72, 0x0, 0x0, 0x2, 0x7e, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x24, 0x30, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xfa, 0x20, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x50, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x50, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x73, 0x2, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x1, 0x69, 0xba, 0x61, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xe7, 0x20, 0x0, 0x0, 0x27, + 0xef, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xed, 0xcd, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x93, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x7a, 0xce, 0xff, + 0xed, 0xca, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F070 "ï°" */ + 0x0, 0x6e, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x4, 0x8a, 0xde, 0xff, 0xed, 0xb7, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x17, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xa3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xec, 0xde, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb5, 0x10, 0x0, 0x1, 0x6c, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x57, 0x74, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x70, 0xd, + 0xff, 0xff, 0x80, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x30, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xa0, 0x8f, 0xff, 0xff, 0xc1, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0x90, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xdb, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xff, 0xf6, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xf9, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xcd, 0xe7, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x69, 0xcd, 0xef, + 0xfe, 0xda, 0x73, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xdd, 0x10, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xdf, 0xd6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xfe, 0xcc, 0xcc, 0xce, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x79, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x52, 0x5c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x4, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc4, 0x0, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x24, 0x44, 0x44, 0x44, + 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x44, 0x44, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf3, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0x40, 0x7, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xf5, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0x50, 0x5, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0xef, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5d, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x50, 0x1, + 0x0, 0x0, 0x0, 0x5d, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x5e, 0x20, 0x0, 0x0, 0xef, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0x60, 0x5, 0xff, + 0xe2, 0x0, 0x0, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x4f, 0xff, 0xfe, 0x20, 0x0, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0x70, 0x3, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x24, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x44, 0x44, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x25, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf8, 0x1d, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x4f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xfc, 0xb, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf4, 0x8f, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0x10, 0xbf, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0x50, 0x0, 0xbf, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x50, 0x0, + 0x0, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x20, + 0x0, + + /* U+F078 "ï¸" */ + 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, + 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xf5, 0x0, 0xb, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xf5, 0x8, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf1, 0xbf, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x44, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xc0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0x81, 0xdf, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x24, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x6, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0x5b, 0xff, 0xff, + 0x5c, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf6, 0xb, 0xff, + 0xff, 0x40, 0xcf, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x70, 0xb, + 0xff, 0xff, 0x40, 0x1d, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x53, 0x0, + 0xb, 0xff, 0xff, 0x40, 0x0, 0x53, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xeb, 0x10, 0xe, 0xff, 0xff, + 0x10, 0x9, 0xea, 0x10, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0xe, 0xff, + 0xff, 0x10, 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xfb, 0xe, + 0xff, 0xff, 0x19, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xae, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x74, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xa3, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x16, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "ï»" */ + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x3, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, + + /* U+F093 "ï‚“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x33, 0x33, 0x33, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x33, 0x33, 0x33, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x20, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0x70, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1, 0x11, 0x11, 0x10, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x88, 0x88, 0x88, 0x88, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x2, 0xef, 0x90, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xbf, + 0x30, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x46, 0xff, 0xc4, 0x6f, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xea, 0x63, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xb8, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x96, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6d, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x1, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xee, + 0xdb, 0x86, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x0, 0x34, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xa2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xdf, 0xfd, 0x81, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xfe, 0x40, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xec, 0xef, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xcf, 0xff, 0xfb, 0x0, + 0x1b, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xef, 0xff, + 0xf2, 0x0, 0x2, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0xff, 0xff, 0xf0, 0x0, 0x1, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0xef, 0xff, 0xf6, 0x0, 0x6, 0xff, + 0xff, 0xd0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x85, + 0x8f, 0xff, 0xff, 0x90, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xab, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x34, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xec, 0xef, 0xff, + 0xff, 0x90, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfb, 0x0, + 0x1b, 0xff, 0xff, 0xc0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0xef, 0xff, + 0xf2, 0x0, 0x2, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0xff, 0xff, 0xf0, 0x0, 0x1, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0xef, 0xff, 0xf6, 0x0, 0x6, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0xaf, 0xff, 0xff, 0x85, + 0x8f, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x46, 0x64, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xab, 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xe0, 0x68, 0x88, 0x88, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x48, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x6, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x86, 0xf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0xf, + 0xff, 0xff, 0xdb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xfe, 0x20, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x47, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x64, 0x6b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x17, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0x10, + + /* U+F0C9 "" */ + 0x48, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xa5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + + /* U+F0E0 "" */ + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x10, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, + 0xf8, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x8f, 0xff, 0xc1, 0x0, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x1c, 0xff, + 0xff, 0xfe, 0x50, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x6f, 0xff, 0xff, 0xf6, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x1, 0x9e, 0xe9, 0x10, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x19, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb9, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x3, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, + + /* U+F0E7 "" */ + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x88, 0x88, 0x88, 0x88, 0x60, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x9e, 0xfe, 0x91, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x88, 0x88, 0x88, 0xcf, + 0xff, 0xff, 0xff, 0xc8, 0x88, 0x88, 0x86, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x72, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x27, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x71, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x3, 0x78, 0x88, 0x88, 0x88, 0x88, 0x80, 0x3, + 0x60, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x8f, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8, 0xff, 0xb0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xb0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, + 0xb0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, + 0xff, 0xff, 0xb0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x98, 0x88, + 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x6, 0x88, 0x88, 0x88, 0x88, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xbf, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xbf, 0xff, 0xff, + 0xb7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x4, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9e, 0xfe, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x3f, 0xfb, 0x0, + 0x0, 0xbf, 0xf3, 0x0, 0x3, 0xff, 0xb0, 0x0, + 0xb, 0xff, 0x30, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xff, 0x80, 0x0, 0x8, + 0xff, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x8f, + 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x8f, 0xf0, + 0x0, 0x0, 0xff, 0x80, 0x0, 0x8, 0xff, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xff, 0x80, 0x0, 0x8, 0xff, 0x0, 0x0, + 0xf, 0xf8, 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x3f, + 0xfb, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x3, 0xff, + 0xb0, 0x0, 0xb, 0xff, 0x30, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x88, 0x8b, 0xff, 0xd8, 0x88, + 0xaf, 0xfe, 0x88, 0x88, 0xbf, 0xfd, 0x88, 0x89, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x1f, 0xf7, 0x0, 0x0, 0xff, + 0x90, 0x0, 0x1, 0xff, 0x70, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x1, 0xff, 0x60, 0x0, 0xe, 0xf9, 0x0, + 0x0, 0x1f, 0xf6, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x1f, 0xf6, 0x0, 0x0, 0xef, 0x90, 0x0, 0x1, + 0xff, 0x60, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x1, 0xff, + 0x70, 0x0, 0xf, 0xf9, 0x0, 0x0, 0x1f, 0xf7, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x98, 0x88, 0xbf, 0xfd, 0x88, + 0x8a, 0xff, 0xe8, 0x88, 0x8b, 0xff, 0xd8, 0x88, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x3, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, + 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3a, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8e, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "ï…›" */ + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x88, 0x88, + 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x45, 0x78, 0x88, 0x87, 0x54, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdd, 0xcc, 0xdd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xea, 0x73, 0x10, 0x0, 0x0, 0x0, 0x1, 0x37, + 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0xdf, 0xff, 0xff, 0xff, 0xfe, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, + 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0xff, 0xff, 0xff, 0xfd, 0x2e, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xe2, 0x2, 0xef, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0x9b, 0xde, 0xff, 0xed, 0xb9, 0x62, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xfe, 0x20, 0x0, + 0x2d, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc9, 0x65, + 0x44, 0x56, 0x9c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xfd, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xb1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1b, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xc7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7c, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, + 0xaa, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xdf, 0xff, 0xfa, 0x30, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x5b, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x24, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xaf, 0xff, 0xfd, 0xa2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x1, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, + 0x0, 0x0, + + /* U+F241 "ï‰" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xdf, 0xff, 0xfa, 0x30, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x5b, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x24, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xaf, 0xff, 0xfd, 0xa2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x1, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, + 0x0, 0x0, + + /* U+F242 "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xdf, 0xff, 0xfa, 0x30, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x24, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xaf, 0xff, 0xfd, 0xa2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x1, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, + 0x0, 0x0, + + /* U+F243 "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xdf, 0xff, 0xfa, 0x30, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x24, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xaf, 0xff, 0xfd, 0xa2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x1, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, + 0x0, 0x0, + + /* U+F244 "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xdf, 0xff, 0xfa, 0x30, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x24, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xaf, 0xff, 0xfd, 0xa2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x1, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, + 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, + 0x88, 0xcf, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfe, 0x65, 0x5a, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0x30, 0x0, 0x1d, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x90, 0x0, + 0x0, 0x19, 0xef, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x34, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xef, 0xff, 0xe7, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0x20, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x5, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x80, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x1, 0xef, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xd4, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x23, 0xcf, 0xfc, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x36, 0xff, 0xff, 0xfb, 0x20, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, + 0xaa, 0xaa, 0xaa, 0xdf, 0xff, 0xba, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xbf, 0xff, + 0xff, 0xf9, 0x10, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xc3, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xfe, 0x60, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xf9, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xba, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf1, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xa0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xa4, 0x38, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x78, 0xbf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, 0x55, + 0x55, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xac, 0xef, + 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xfc, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xa0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x1, 0x60, 0x1, 0xdf, 0xff, + 0xff, 0xfe, 0x0, 0x6f, 0xff, 0xff, 0xf6, 0x6f, + 0xff, 0xfc, 0x0, 0x1f, 0x60, 0x1, 0xef, 0xff, + 0xff, 0xf2, 0xa, 0xff, 0xff, 0xf6, 0x0, 0x6f, + 0xff, 0xc0, 0x1, 0xff, 0x60, 0x2, 0xef, 0xff, + 0xff, 0x50, 0xcf, 0xff, 0xff, 0x60, 0x0, 0x6f, + 0xfc, 0x0, 0x1f, 0xff, 0x10, 0x7, 0xff, 0xff, + 0xf7, 0xf, 0xff, 0xff, 0xff, 0x60, 0x0, 0x6f, + 0xc0, 0x1, 0xff, 0x30, 0x4, 0xff, 0xff, 0xff, + 0x90, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x6c, + 0x0, 0x1f, 0x30, 0x3, 0xff, 0xff, 0xff, 0xfb, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x30, + 0x0, 0x30, 0x2, 0xef, 0xff, 0xff, 0xff, 0xc3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xfd, 0x1f, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x80, 0x0, 0x90, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0xcc, 0x0, 0x1f, 0x90, 0x0, 0x8f, + 0xff, 0xff, 0xfa, 0xd, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0xcf, 0xc0, 0x1, 0xff, 0x80, 0x0, 0x9f, + 0xff, 0xff, 0x90, 0xbf, 0xff, 0xff, 0x20, 0x1, + 0xcf, 0xfd, 0x0, 0x1f, 0xfd, 0x0, 0x4, 0xff, + 0xff, 0xf7, 0x8, 0xff, 0xff, 0xfd, 0x11, 0xcf, + 0xff, 0xd0, 0x1, 0xfd, 0x10, 0x4, 0xff, 0xff, + 0xff, 0x40, 0x4f, 0xff, 0xff, 0xfd, 0xcf, 0xff, + 0xfd, 0x0, 0x1d, 0x10, 0x4, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x10, 0x5, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x7a, 0xde, 0xff, 0xfe, 0xca, 0x61, + 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "ï‹­" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xac, 0xcc, + 0xcc, 0xcc, 0xcc, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x64, + 0x44, 0x44, 0x44, 0x44, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x8, + 0xff, 0xff, 0xfe, 0x22, 0xef, 0xff, 0xf9, 0x9, + 0xff, 0xff, 0xe2, 0x2e, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, + 0x40, 0x4f, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xff, + 0x80, 0x0, 0x8, 0xff, 0xff, 0xfc, 0x0, 0xcf, + 0xff, 0xf4, 0x4, 0xff, 0xff, 0xc0, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc0, + 0xc, 0xff, 0xff, 0x40, 0x4f, 0xff, 0xfc, 0x0, + 0xcf, 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, + 0xfc, 0x0, 0xcf, 0xff, 0xf4, 0x4, 0xff, 0xff, + 0xc0, 0xc, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, 0x40, 0x4f, + 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xff, 0x80, 0x0, + 0x8, 0xff, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xf4, + 0x4, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc0, 0xc, 0xff, + 0xff, 0x40, 0x4f, 0xff, 0xfc, 0x0, 0xcf, 0xff, + 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xfc, 0x0, + 0xcf, 0xff, 0xf4, 0x4, 0xff, 0xff, 0xc0, 0xc, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xc0, 0xc, 0xff, 0xff, 0x40, 0x4f, 0xff, 0xfc, + 0x0, 0xcf, 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, + 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xf4, 0x4, 0xff, + 0xff, 0xc0, 0xc, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, 0x40, + 0x4f, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xff, 0x80, + 0x0, 0x8, 0xff, 0xff, 0xfc, 0x0, 0xcf, 0xff, + 0xf4, 0x4, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc0, 0xc, + 0xff, 0xff, 0x40, 0x4f, 0xff, 0xfc, 0x0, 0xcf, + 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xfc, + 0x0, 0xcf, 0xff, 0xf4, 0x4, 0xff, 0xff, 0xc0, + 0xc, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xc0, 0xc, 0xff, 0xff, 0x40, 0x4f, 0xff, + 0xfc, 0x0, 0xcf, 0xff, 0xff, 0x80, 0x0, 0x8, + 0xff, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xf4, 0x4, + 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, + 0x40, 0x4f, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xff, + 0x80, 0x0, 0x8, 0xff, 0xff, 0xfc, 0x0, 0xcf, + 0xff, 0xf4, 0x4, 0xff, 0xff, 0xc0, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xe2, + 0x2e, 0xff, 0xff, 0x80, 0x9f, 0xff, 0xfe, 0x22, + 0xef, 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe8, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xfd, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x61, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xd1, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd1, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xd1, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x9f, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x9f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x9f, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0xfd, 0xb9, 0x86, 0x42, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x1, 0xdf, 0xff, 0xff, 0xfd, + 0x10, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x1, 0xdf, + 0xfd, 0x10, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x1d, 0xd1, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x1, 0x10, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x1, 0x10, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x1d, 0xd1, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x1, 0xdf, 0xfd, 0x10, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x1, 0xdf, 0xff, 0xff, 0xfd, 0x10, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x4d, 0xff, 0xff, 0xff, 0xff, + 0xd4, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x8f, 0xff, 0xc0, + 0x0, 0x8f, 0xf0, 0x0, 0x1f, 0xf6, 0x0, 0xf, + 0xff, 0xff, 0x0, 0x8, 0xff, 0xff, 0xc0, 0x0, + 0x8f, 0xf0, 0x0, 0x1f, 0xf6, 0x0, 0xf, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xff, 0xc0, 0x0, 0x8f, + 0xf0, 0x0, 0x1f, 0xf6, 0x0, 0xf, 0xff, 0xff, + 0x8, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x8f, 0xf0, + 0x0, 0x1f, 0xf6, 0x0, 0xf, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x8f, 0xf0, 0x0, + 0x1f, 0xf6, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x8f, 0xf0, 0x0, 0x1f, + 0xf6, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x8f, 0xf0, 0x0, 0x1f, 0xf6, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x88, 0xcf, 0xf8, 0x88, 0x8f, 0xfb, 0x88, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xf2, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xc6, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0xff, + 0xff, 0xff, 0x20, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x2c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xc5, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 172, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 172, .box_w = 6, .box_h = 29, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 87, .adv_w = 250, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 17}, + {.bitmap_index = 159, .adv_w = 450, .box_w = 27, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 551, .adv_w = 397, .box_w = 23, .box_h = 39, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 1000, .adv_w = 540, .box_w = 32, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1464, .adv_w = 439, .box_w = 26, .box_h = 30, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1854, .adv_w = 134, .box_w = 4, .box_h = 12, .ofs_x = 2, .ofs_y = 17}, + {.bitmap_index = 1878, .adv_w = 216, .box_w = 10, .box_h = 39, .ofs_x = 3, .ofs_y = -8}, + {.bitmap_index = 2073, .adv_w = 216, .box_w = 9, .box_h = 39, .ofs_x = 1, .ofs_y = -8}, + {.bitmap_index = 2249, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = 15}, + {.bitmap_index = 2377, .adv_w = 372, .box_w = 19, .box_h = 18, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 2548, .adv_w = 145, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 2590, .adv_w = 245, .box_w = 12, .box_h = 4, .ofs_x = 2, .ofs_y = 10}, + {.bitmap_index = 2614, .adv_w = 145, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2635, .adv_w = 225, .box_w = 18, .box_h = 39, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 2986, .adv_w = 427, .box_w = 24, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3334, .adv_w = 237, .box_w = 11, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3494, .adv_w = 367, .box_w = 22, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3813, .adv_w = 366, .box_w = 22, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4132, .adv_w = 428, .box_w = 26, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4509, .adv_w = 367, .box_w = 22, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4828, .adv_w = 395, .box_w = 23, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5162, .adv_w = 383, .box_w = 22, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5481, .adv_w = 412, .box_w = 23, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5815, .adv_w = 395, .box_w = 22, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6134, .adv_w = 145, .box_w = 7, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6211, .adv_w = 145, .box_w = 7, .box_h = 28, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 6309, .adv_w = 372, .box_w = 19, .box_h = 19, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 6490, .adv_w = 372, .box_w = 19, .box_h = 13, .ofs_x = 2, .ofs_y = 8}, + {.bitmap_index = 6614, .adv_w = 372, .box_w = 19, .box_h = 19, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 6795, .adv_w = 367, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7100, .adv_w = 662, .box_w = 39, .box_h = 37, .ofs_x = 1, .ofs_y = -8}, + {.bitmap_index = 7822, .adv_w = 468, .box_w = 31, .box_h = 29, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8272, .adv_w = 484, .box_w = 25, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 8635, .adv_w = 463, .box_w = 27, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9027, .adv_w = 529, .box_w = 28, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 9433, .adv_w = 429, .box_w = 21, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 9738, .adv_w = 406, .box_w = 20, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10028, .adv_w = 494, .box_w = 27, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10420, .adv_w = 520, .box_w = 25, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10783, .adv_w = 198, .box_w = 5, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10856, .adv_w = 328, .box_w = 18, .box_h = 29, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 11117, .adv_w = 460, .box_w = 25, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11480, .adv_w = 380, .box_w = 20, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11770, .adv_w = 611, .box_w = 30, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12205, .adv_w = 520, .box_w = 25, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12568, .adv_w = 538, .box_w = 31, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13018, .adv_w = 462, .box_w = 23, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 13352, .adv_w = 538, .box_w = 33, .box_h = 35, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 13930, .adv_w = 465, .box_w = 24, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 14278, .adv_w = 397, .box_w = 23, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 14612, .adv_w = 376, .box_w = 24, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14960, .adv_w = 506, .box_w = 25, .box_h = 29, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 15323, .adv_w = 456, .box_w = 30, .box_h = 29, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 15758, .adv_w = 721, .box_w = 43, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 16382, .adv_w = 431, .box_w = 27, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16774, .adv_w = 414, .box_w = 28, .box_h = 29, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 17180, .adv_w = 420, .box_w = 25, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 17543, .adv_w = 213, .box_w = 9, .box_h = 39, .ofs_x = 4, .ofs_y = -8}, + {.bitmap_index = 17719, .adv_w = 225, .box_w = 18, .box_h = 39, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 18070, .adv_w = 213, .box_w = 10, .box_h = 39, .ofs_x = 0, .ofs_y = -8}, + {.bitmap_index = 18265, .adv_w = 373, .box_w = 18, .box_h = 17, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 18418, .adv_w = 320, .box_w = 20, .box_h = 3, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 18448, .adv_w = 384, .box_w = 11, .box_h = 6, .ofs_x = 4, .ofs_y = 25}, + {.bitmap_index = 18481, .adv_w = 383, .box_w = 19, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 18690, .adv_w = 436, .box_w = 23, .box_h = 31, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 19047, .adv_w = 365, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 19278, .adv_w = 436, .box_w = 23, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 19635, .adv_w = 392, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 19877, .adv_w = 226, .box_w = 16, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20125, .adv_w = 442, .box_w = 23, .box_h = 30, .ofs_x = 1, .ofs_y = -8}, + {.bitmap_index = 20470, .adv_w = 436, .box_w = 21, .box_h = 31, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 20796, .adv_w = 179, .box_w = 7, .box_h = 32, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 20908, .adv_w = 182, .box_w = 13, .box_h = 40, .ofs_x = -4, .ofs_y = -8}, + {.bitmap_index = 21168, .adv_w = 394, .box_w = 22, .box_h = 31, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 21509, .adv_w = 179, .box_w = 5, .box_h = 31, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 21587, .adv_w = 676, .box_w = 36, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 21983, .adv_w = 436, .box_w = 21, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 22214, .adv_w = 406, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22467, .adv_w = 436, .box_w = 23, .box_h = 30, .ofs_x = 3, .ofs_y = -8}, + {.bitmap_index = 22812, .adv_w = 436, .box_w = 23, .box_h = 30, .ofs_x = 1, .ofs_y = -8}, + {.bitmap_index = 23157, .adv_w = 262, .box_w = 13, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 23300, .adv_w = 321, .box_w = 19, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23509, .adv_w = 265, .box_w = 16, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23725, .adv_w = 433, .box_w = 21, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 23956, .adv_w = 358, .box_w = 24, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 24220, .adv_w = 575, .box_w = 36, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24616, .adv_w = 353, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24858, .adv_w = 358, .box_w = 24, .box_h = 30, .ofs_x = -1, .ofs_y = -8}, + {.bitmap_index = 25218, .adv_w = 333, .box_w = 19, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 25427, .adv_w = 225, .box_w = 12, .box_h = 39, .ofs_x = 2, .ofs_y = -8}, + {.bitmap_index = 25661, .adv_w = 191, .box_w = 4, .box_h = 39, .ofs_x = 4, .ofs_y = -8}, + {.bitmap_index = 25739, .adv_w = 225, .box_w = 12, .box_h = 39, .ofs_x = 0, .ofs_y = -8}, + {.bitmap_index = 25973, .adv_w = 372, .box_w = 19, .box_h = 8, .ofs_x = 2, .ofs_y = 11}, + {.bitmap_index = 26049, .adv_w = 268, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = 16}, + {.bitmap_index = 26147, .adv_w = 201, .box_w = 8, .box_h = 8, .ofs_x = 2, .ofs_y = 8}, + {.bitmap_index = 26179, .adv_w = 640, .box_w = 40, .box_h = 41, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 26999, .adv_w = 640, .box_w = 40, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 27599, .adv_w = 640, .box_w = 40, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 28319, .adv_w = 640, .box_w = 40, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 28919, .adv_w = 440, .box_w = 28, .box_h = 28, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 29311, .adv_w = 640, .box_w = 40, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 30111, .adv_w = 640, .box_w = 38, .box_h = 40, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 30871, .adv_w = 720, .box_w = 45, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 31681, .adv_w = 640, .box_w = 40, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 32481, .adv_w = 720, .box_w = 45, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 33156, .adv_w = 640, .box_w = 40, .box_h = 42, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 33996, .adv_w = 320, .box_w = 20, .box_h = 32, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 34316, .adv_w = 480, .box_w = 30, .box_h = 32, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 34796, .adv_w = 720, .box_w = 45, .box_h = 38, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 35651, .adv_w = 640, .box_w = 40, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 36251, .adv_w = 440, .box_w = 28, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 36811, .adv_w = 560, .box_w = 25, .box_h = 37, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 37274, .adv_w = 560, .box_w = 35, .box_h = 42, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 38009, .adv_w = 560, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 38639, .adv_w = 560, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 39269, .adv_w = 560, .box_w = 25, .box_h = 37, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 39732, .adv_w = 560, .box_w = 37, .box_h = 36, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 40398, .adv_w = 400, .box_w = 21, .box_h = 36, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 40776, .adv_w = 400, .box_w = 21, .box_h = 36, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 41154, .adv_w = 560, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 41784, .adv_w = 560, .box_w = 35, .box_h = 8, .ofs_x = 0, .ofs_y = 11}, + {.bitmap_index = 41924, .adv_w = 720, .box_w = 45, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 42599, .adv_w = 800, .box_w = 51, .box_h = 40, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 43619, .adv_w = 720, .box_w = 47, .box_h = 40, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 44559, .adv_w = 640, .box_w = 40, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 45279, .adv_w = 560, .box_w = 35, .box_h = 22, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 45664, .adv_w = 560, .box_w = 35, .box_h = 22, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 46049, .adv_w = 800, .box_w = 50, .box_h = 32, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 46849, .adv_w = 640, .box_w = 40, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 47449, .adv_w = 640, .box_w = 40, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 48249, .adv_w = 640, .box_w = 41, .box_h = 41, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 49090, .adv_w = 560, .box_w = 36, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 49738, .adv_w = 560, .box_w = 35, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 50438, .adv_w = 560, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 51068, .adv_w = 560, .box_w = 35, .box_h = 32, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 51628, .adv_w = 640, .box_w = 40, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 52228, .adv_w = 400, .box_w = 27, .box_h = 40, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 52768, .adv_w = 560, .box_w = 35, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 53468, .adv_w = 560, .box_w = 35, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 54168, .adv_w = 720, .box_w = 45, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 54843, .adv_w = 640, .box_w = 42, .box_h = 42, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 55725, .adv_w = 480, .box_w = 30, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 56325, .adv_w = 800, .box_w = 50, .box_h = 37, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 57250, .adv_w = 800, .box_w = 50, .box_h = 26, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 57900, .adv_w = 800, .box_w = 50, .box_h = 26, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 58550, .adv_w = 800, .box_w = 50, .box_h = 26, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 59200, .adv_w = 800, .box_w = 50, .box_h = 26, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 59850, .adv_w = 800, .box_w = 50, .box_h = 26, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 60500, .adv_w = 800, .box_w = 51, .box_h = 32, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 61316, .adv_w = 560, .box_w = 31, .box_h = 40, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 61936, .adv_w = 560, .box_w = 35, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 62636, .adv_w = 640, .box_w = 41, .box_h = 41, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 63477, .adv_w = 800, .box_w = 50, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 64227, .adv_w = 480, .box_w = 30, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 64827, .adv_w = 644, .box_w = 41, .box_h = 26, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 6, 0, 0, 0, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 29, 0, 17, -14, 0, 0, + 0, 0, -35, -38, 4, 30, 14, 11, + -26, 4, 31, 2, 27, 6, 20, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 38, 5, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 0, -19, 0, 0, 0, 0, + 0, -13, 11, 13, 0, 0, -6, 0, + -4, 6, 0, -6, 0, -6, -3, -13, + 0, 0, 0, 0, -6, 0, 0, -8, + -10, 0, 0, -6, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + -6, 0, -10, 0, -17, 0, -77, 0, + 0, -13, 0, 13, 19, 1, 0, -13, + 6, 6, 21, 13, -11, 13, 0, 0, + -36, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -24, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -17, -8, -31, 0, -26, + -4, 0, 0, 0, 0, 1, 25, 0, + -19, -5, -2, 2, 0, -11, 0, 0, + -4, -47, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -51, -5, 24, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 21, + 0, 6, 0, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 24, 5, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -24, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 13, 6, 19, -6, 0, 0, 13, -6, + -21, -88, 4, 17, 13, 1, -8, 0, + 23, 0, 20, 0, 20, 0, -60, 0, + -8, 19, 0, 21, -6, 13, 6, 0, + 0, 2, -6, 0, 0, -11, 51, 0, + 51, 0, 19, 0, 27, 8, 11, 19, + 0, 0, 0, -24, 0, 0, 0, 0, + 2, -4, 0, 4, -12, -8, -13, 4, + 0, -6, 0, 0, 0, -26, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -42, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -35, 0, -40, 0, 0, 0, + 0, -4, 0, 63, -8, -8, 6, 6, + -6, 0, -8, 6, 0, 0, -34, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -62, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -40, 0, 38, 0, 0, -24, 0, + 21, 0, -44, -62, -44, -13, 19, 0, + 0, -43, 0, 8, -15, 0, -10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 17, 19, -78, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 30, 0, 4, 0, 0, 0, + 0, 0, 4, 4, -8, -13, 0, -2, + -2, -6, 0, 0, -4, 0, 0, 0, + -13, 0, -5, 0, -15, -13, 0, -16, + -21, -21, -12, 0, -13, 0, -13, 0, + 0, 0, 0, -5, 0, 0, 6, 0, + 4, -6, 0, 2, 0, 0, 0, 6, + -4, 0, 0, 0, -4, 6, 6, -2, + 0, 0, 0, -12, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 8, -4, 0, + -8, 0, -11, 0, 0, -4, 0, 19, + 0, 0, -6, 0, 0, 0, 0, 0, + -2, 2, -4, -4, 0, 0, -6, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, 0, -6, -8, 0, + 0, 0, 0, 0, 2, 0, 0, -4, + 0, -6, -6, -6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, -4, -8, 0, -10, 0, -19, + -4, -19, 13, 0, 0, -13, 6, 13, + 17, 0, -16, -2, -8, 0, -2, -30, + 6, -4, 4, -34, 6, 0, 0, 2, + -33, 0, -34, -5, -56, -4, 0, -32, + 0, 13, 18, 0, 8, 0, 0, 0, + 0, 1, 0, -12, -8, 0, -19, 0, + 0, 0, -6, 0, 0, 0, -6, 0, + 0, 0, 0, 0, -3, -3, 0, -3, + -8, 0, 0, 0, 0, 0, 0, 0, + -6, -6, 0, -4, -8, -5, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, -8, + 0, -4, 0, -13, 6, 0, 0, -8, + 3, 6, 6, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 4, + 0, 0, -6, 0, -6, -4, -8, 0, + 0, 0, 0, 0, 0, 0, 5, 0, + -5, 0, 0, 0, 0, -7, -10, 0, + -12, 0, 19, -4, 2, -20, 0, 0, + 17, -32, -33, -27, -13, 6, 0, -5, + -42, -12, 0, -12, 0, -13, 10, -12, + -41, 0, -17, 0, 0, 3, -2, 5, + -4, 0, 6, 1, -19, -24, 0, -32, + -15, -13, -15, -19, -8, -17, -1, -12, + -17, 4, 0, 2, 0, -6, 0, 0, + 0, 4, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + 0, -3, 0, -2, -6, 0, -11, -14, + -14, -2, 0, -19, 0, 0, 0, 0, + 0, 0, -5, 0, 0, 0, 0, 3, + -4, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + -12, 0, 0, 0, 0, -32, -19, 0, + 0, 0, -10, -32, 0, 0, -6, 6, + 0, -17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, -12, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, -12, 0, + 0, 0, 0, 8, 0, 4, -13, -13, + 0, -6, -6, -8, 0, 0, 0, 0, + 0, 0, -19, 0, -6, 0, -10, -6, + 0, -14, -16, -19, -5, 0, -13, 0, + -19, 0, 0, 0, 0, 51, 0, 0, + 3, 0, 0, -8, 0, 6, 0, -28, + 0, 0, 0, 0, 0, -60, -12, 21, + 19, -5, -27, 0, 6, -10, 0, -32, + -3, -8, 6, -45, -6, 8, 0, 10, + -22, -10, -24, -21, -27, 0, 0, -38, + 0, 36, 0, 0, -3, 0, 0, 0, + -3, -3, -6, -17, -21, -1, -60, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -6, 0, -3, -6, -10, 0, 0, + -13, 0, -6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -13, 0, 0, 13, + -2, 8, 0, -14, 6, -4, -2, -17, + -6, 0, -8, -6, -4, 0, -10, -11, + 0, 0, -5, -2, -4, -11, -8, 0, + 0, -6, 0, 6, -4, 0, -14, 0, + 0, 0, -13, 0, -11, 0, -11, -11, + 6, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 6, 0, -9, 0, -4, -8, + -20, -4, -4, -4, -2, -4, -8, -2, + 0, 0, 0, 0, 0, -6, -5, -5, + 0, 0, 0, 0, 8, -4, 0, -4, + 0, 0, 0, -4, -8, -4, -6, -8, + -6, 0, 5, 26, -2, 0, -17, 0, + -4, 13, 0, -6, -27, -8, 10, 1, + 0, -30, -11, 6, -11, 4, 0, -4, + -5, -20, 0, -10, 3, 0, 0, -11, + 0, 0, 0, 6, 6, -13, -12, 0, + -11, -6, -10, -6, -6, 0, -11, 3, + -12, -11, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, -6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, -8, + 0, 0, -6, -6, 0, 0, 0, 0, + -6, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + -10, 0, -13, 0, 0, 0, -21, 0, + 4, -14, 13, 1, -4, -30, 0, 0, + -14, -6, 0, -26, -16, -18, 0, 0, + -28, -6, -26, -24, -31, 0, -17, 0, + 5, 43, -8, 0, -15, -6, -2, -6, + -11, -17, -12, -24, -26, -15, -6, 0, + 0, -4, 0, 2, 0, 0, -45, -6, + 19, 14, -14, -24, 0, 2, -20, 0, + -32, -4, -6, 13, -59, -8, 2, 0, + 0, -42, -8, -33, -6, -47, 0, 0, + -45, 0, 38, 2, 0, -4, 0, 0, + 0, 0, -3, -4, -24, -4, 0, -42, + 0, 0, 0, 0, -20, 0, -6, 0, + -2, -18, -30, 0, 0, -3, -10, -19, + -6, 0, -4, 0, 0, 0, 0, -29, + -6, -21, -20, -5, -11, -16, -6, -11, + 0, -13, -6, -21, -10, 0, -8, -12, + -6, -12, 0, 3, 0, -4, -21, 0, + 13, 0, -12, 0, 0, 0, 0, 8, + 0, 4, -13, 26, 0, -6, -6, -8, + 0, 0, 0, 0, 0, 0, -19, 0, + -6, 0, -10, -6, 0, -14, -16, -19, + -5, 0, -13, 5, 26, 0, 0, 0, + 0, 51, 0, 0, 3, 0, 0, -8, + 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -4, -13, 0, 0, 0, 0, 0, -3, + 0, 0, 0, -6, -6, 0, 0, -13, + -6, 0, 0, -13, 0, 11, -3, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 10, 13, 5, -6, 0, -20, + -10, 0, 19, -21, -20, -13, -13, 26, + 12, 6, -56, -4, 13, -6, 0, -6, + 7, -6, -22, 0, -6, 6, -8, -5, + -19, -5, 0, 0, 19, 13, 0, -18, + 0, -35, -8, 19, -8, -24, 2, -8, + -21, -21, -6, 26, 6, 0, -10, 0, + -17, 0, 5, 21, -15, -24, -26, -16, + 19, 0, 2, -47, -5, 6, -11, -4, + -15, 0, -14, -24, -10, -10, -5, 0, + 0, -15, -13, -6, 0, 19, 15, -6, + -35, 0, -35, -9, 0, -22, -37, -2, + -20, -11, -21, -18, 17, 0, 0, -8, + 0, -13, -6, 0, -6, -12, 0, 11, + -21, 6, 0, 0, -34, 0, -6, -14, + -11, -4, -19, -16, -21, -15, 0, -19, + -6, -15, -12, -19, -6, 0, 0, 2, + 30, -11, 0, -19, -6, 0, -6, -13, + -15, -17, -18, -24, -8, -13, 13, 0, + -10, 0, -32, -8, 4, 13, -20, -24, + -13, -21, 21, -6, 3, -60, -12, 13, + -14, -11, -24, 0, -19, -27, -8, -6, + -5, -6, -13, -19, -2, 0, 0, 19, + 18, -4, -42, 0, -38, -15, 15, -24, + -44, -13, -22, -27, -32, -21, 13, 0, + 0, 0, 0, -8, 0, 0, 6, -8, + 13, 4, -12, 13, 0, 0, -20, -2, + 0, -2, 0, 2, 2, -5, 0, 0, + 0, 0, 0, 0, -6, 0, 0, 0, + 0, 5, 19, 1, 0, -8, 0, 0, + 0, 0, -4, -4, -8, 0, 0, 0, + 2, 5, 0, 0, 0, 0, 5, 0, + -5, 0, 24, 0, 12, 2, 2, -8, + 0, 13, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 0, 18, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -38, 0, -6, 11, 0, 19, + 0, 0, 63, 8, -13, -13, 6, 6, + -4, 2, -32, 0, 0, 31, -38, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -44, 24, 90, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -38, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, -12, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, -17, 0, + 0, 2, 0, 0, 6, 83, -13, -5, + 20, 17, -17, 6, 0, 0, 6, 6, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -83, 18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -18, + 0, 0, 0, -17, 0, 0, 0, 0, + -14, -3, 0, 0, 0, -14, 0, -8, + 0, -30, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -43, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -6, 0, 0, -12, 0, -10, 0, + -17, 0, 0, 0, -11, 6, -8, 0, + 0, -17, -6, -15, 0, 0, -17, 0, + -6, 0, -30, 0, -7, 0, 0, -52, + -12, -26, -7, -23, 0, 0, -43, 0, + -17, -3, 0, 0, 0, 0, 0, 0, + 0, 0, -10, -12, -5, -11, 0, 0, + 0, 0, -14, 0, -14, 8, -7, 13, + 0, -4, -15, -4, -11, -12, 0, -8, + -3, -4, 4, -17, -2, 0, 0, 0, + -56, -5, -9, 0, -14, 0, -4, -30, + -6, 0, 0, -4, -5, 0, 0, 0, + 0, 4, 0, -4, -11, -4, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 0, 0, 0, 0, + 0, -14, 0, -4, 0, 0, 0, -13, + 6, 0, 0, 0, -17, -6, -13, 0, + 0, -18, 0, -6, 0, -30, 0, 0, + 0, 0, -62, 0, -13, -24, -32, 0, + 0, -43, 0, -4, -10, 0, 0, 0, + 0, 0, 0, 0, 0, -6, -10, -3, + -10, 2, 0, 0, 11, -8, 0, 20, + 31, -6, -6, -19, 8, 31, 11, 14, + -17, 8, 27, 8, 19, 14, 17, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 40, 30, -12, -6, 0, -5, + 51, 28, 51, 0, 0, 0, 6, 0, + 0, 24, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 9, + 0, 0, 0, 0, -54, -8, -5, -26, + -31, 0, 0, -43, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, -54, -8, -5, + -26, -31, 0, 0, -26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, -15, 6, 0, -6, + 5, 12, 6, -19, 0, -1, -5, 6, + 0, 5, 0, 0, 0, 0, -16, 0, + -6, -4, -13, 0, -6, -26, 0, 40, + -6, 0, -14, -4, 0, -4, -11, 0, + -6, -18, -13, -8, 0, 0, 0, -10, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, -54, + -8, -5, -26, -31, 0, 0, -43, 0, + 0, 0, 0, 0, 0, 32, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -10, 0, -20, -8, -6, 19, -6, -6, + -26, 2, -4, 2, -4, -17, 1, 14, + 1, 5, 2, 5, -15, -26, -8, 0, + -24, -12, -17, -27, -25, 0, -10, -13, + -8, -8, -5, -4, -8, -4, 0, -4, + -2, 10, 0, 10, -4, 0, 20, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, -6, -6, 0, 0, + -17, 0, -3, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -38, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, -6, 0, -8, + 0, 0, 0, 0, -5, 0, 0, -11, + -6, 6, 0, -11, -12, -4, 0, -19, + -4, -14, -4, -8, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -43, 0, 20, 0, 0, -12, 0, + 0, 0, 0, -8, 0, -6, 0, 0, + -3, 0, 0, -4, 0, -15, 0, 0, + 27, -8, -21, -20, 4, 7, 7, -1, + -18, 4, 10, 4, 19, 4, 21, -4, + -17, 0, 0, -26, 0, 0, -19, -17, + 0, 0, -13, 0, -8, -11, 0, -10, + 0, -10, 0, -4, 10, 0, -5, -19, + -6, 24, 0, 0, -6, 0, -13, 0, + 0, 8, -15, 0, 6, -6, 5, 1, + 0, -21, 0, -4, -2, 0, -6, 7, + -5, 0, 0, 0, -26, -8, -14, 0, + -19, 0, 0, -30, 0, 24, -6, 0, + -12, 0, 4, 0, -6, 0, -6, -19, + 0, -6, 6, 0, 0, 0, 0, -4, + 0, 0, 6, -8, 2, 0, 0, -8, + -4, 0, -8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -40, 0, 14, 0, + 0, -5, 0, 0, 0, 0, 1, 0, + -6, -6, 0, 0, 0, 13, 0, 15, + 0, 0, 0, 0, 0, -40, -36, 2, + 28, 19, 11, -26, 4, 27, 0, 24, + 0, 13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserrat_40 = { +#else +lv_font_t lv_font_montserrat_40 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 44, /*The maximum line height required by the font*/ + .base_line = 8, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -3, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_40*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_42.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_42.c new file mode 100644 index 0000000..a656393 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_42.c @@ -0,0 +1,10099 @@ +/******************************************************************************* + * Size: 42 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 42 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_42.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_42 + #define LV_FONT_MONTSERRAT_42 1 +#endif + +#if LV_FONT_MONTSERRAT_42 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xb, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, + 0xff, 0xfe, 0x0, 0x9f, 0xff, 0xe0, 0x8, 0xff, + 0xfd, 0x0, 0x8f, 0xff, 0xc0, 0x7, 0xff, 0xfc, + 0x0, 0x7f, 0xff, 0xb0, 0x6, 0xff, 0xfa, 0x0, + 0x6f, 0xff, 0xa0, 0x5, 0xff, 0xf9, 0x0, 0x4f, + 0xff, 0x90, 0x4, 0xff, 0xf8, 0x0, 0x3f, 0xff, + 0x70, 0x3, 0xff, 0xf7, 0x0, 0x2f, 0xff, 0x60, + 0x1, 0xff, 0xf6, 0x0, 0x1f, 0xff, 0x50, 0x0, + 0xff, 0xf4, 0x0, 0xf, 0xff, 0x40, 0x0, 0x99, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, + 0x6f, 0xff, 0xb0, 0xf, 0xff, 0xff, 0x30, 0xff, + 0xff, 0xf4, 0xc, 0xff, 0xfe, 0x10, 0x1b, 0xfd, + 0x30, + + /* U+0022 "\"" */ + 0x5f, 0xff, 0x20, 0x0, 0xbf, 0xfc, 0x5f, 0xff, + 0x20, 0x0, 0xbf, 0xfb, 0x4f, 0xff, 0x10, 0x0, + 0xbf, 0xfb, 0x4f, 0xff, 0x10, 0x0, 0xaf, 0xfb, + 0x4f, 0xff, 0x0, 0x0, 0xaf, 0xfa, 0x3f, 0xff, + 0x0, 0x0, 0xaf, 0xfa, 0x3f, 0xff, 0x0, 0x0, + 0x9f, 0xf9, 0x3f, 0xff, 0x0, 0x0, 0x9f, 0xf9, + 0x2f, 0xff, 0x0, 0x0, 0x9f, 0xf9, 0x2f, 0xfe, + 0x0, 0x0, 0x8f, 0xf8, 0x2f, 0xfe, 0x0, 0x0, + 0x8f, 0xf8, 0x19, 0x98, 0x0, 0x0, 0x49, 0x94, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf9, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf7, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf4, 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, + 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x3f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x5f, 0xfa, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x1, 0x22, 0x22, 0x2b, + 0xff, 0x62, 0x22, 0x22, 0x22, 0xdf, 0xf4, 0x22, + 0x22, 0x20, 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, + 0x0, 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfd, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf9, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x12, 0x22, 0x23, 0xff, + 0xe2, 0x22, 0x22, 0x22, 0x5f, 0xfc, 0x22, 0x22, + 0x22, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x5f, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x6f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xaf, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xcf, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, + 0xef, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x84, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xff, 0xed, + 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xfe, 0xcf, 0xfe, 0xde, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x8f, 0xff, 0xfc, 0x40, 0x1f, 0xf9, 0x0, + 0x26, 0xcf, 0xf5, 0x0, 0x0, 0xff, 0xff, 0xa0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x4, 0xb0, 0x0, + 0x5, 0xff, 0xfe, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf9, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x60, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, + 0x10, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xfb, 0x7f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfc, 0xaf, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x6e, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x1f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0xc, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0xd, 0xff, 0xf4, 0x0, 0xa1, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x1f, 0xff, 0xf2, + 0x6, 0xfe, 0x50, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0xbf, 0xff, 0xd0, 0xd, 0xff, 0xfd, 0x72, + 0x0, 0x1f, 0xf9, 0x0, 0x4c, 0xff, 0xff, 0x50, + 0x1e, 0xff, 0xff, 0xff, 0xec, 0xbf, 0xfd, 0xbe, + 0xff, 0xff, 0xfa, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, + 0xde, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x0, 0x5b, 0xef, 0xea, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x50, 0x0, + 0x0, 0x0, 0xbf, 0xfe, 0x97, 0x9f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x6f, 0xfc, 0x10, 0x0, 0x2e, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x3, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, 0x4f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xdf, 0xe0, 0x0, 0x0, 0x0, 0x8f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x10, 0x0, 0x0, 0x3f, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x8f, 0xf2, 0x0, 0x0, 0xd, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf4, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x20, 0x0, 0x9, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x9f, 0xf1, 0x0, 0x3, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfa, 0x0, + 0x0, 0x0, 0xd, 0xfe, 0x0, 0x0, 0xdf, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf1, + 0x0, 0x0, 0x3, 0xff, 0x90, 0x0, 0x9f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xc0, 0x0, 0x1, 0xdf, 0xf3, 0x0, 0x3f, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xe8, 0x79, 0xff, 0xf8, 0x0, 0xd, 0xff, + 0x50, 0x0, 0x4, 0x66, 0x40, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x9, 0xff, + 0xa0, 0x0, 0x6e, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x5, 0xbe, 0xfe, 0xa4, 0x0, 0x4, 0xff, + 0xe1, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf5, 0x0, 0x6f, 0xfd, 0x50, 0x5, 0xef, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfa, 0x0, 0xe, 0xfe, 0x10, 0x0, 0x2, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xfe, 0x10, 0x5, 0xff, 0x70, 0x0, 0x0, 0x7, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x40, 0x0, 0x9f, 0xf2, 0x0, 0x0, 0x0, + 0x2f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xa0, 0x0, 0xb, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xe1, 0x0, 0x0, 0xcf, 0xe0, 0x0, 0x0, + 0x0, 0xe, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf4, 0x0, 0x0, 0xc, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xf0, 0x0, + 0x0, 0x0, 0xf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xfe, 0x10, 0x0, 0x0, 0x7, 0xff, 0x40, + 0x0, 0x0, 0x4, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x40, 0x0, 0x0, 0x0, 0x2f, 0xfb, + 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf7, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfc, 0x88, 0xcf, 0xff, 0x20, 0x0, 0x0, + 0x0, 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8d, 0xff, 0xd8, 0x10, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x0, 0x49, 0xde, 0xfe, 0xc8, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfe, 0x62, + 0x2, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xd1, 0x0, 0x0, 0x3, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x60, 0x0, 0x0, 0x0, 0xcf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x0, 0x0, 0x8, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf6, 0x0, 0x0, 0x9f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x30, 0x3c, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xfe, 0xcf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x91, 0xb, 0xff, 0xff, + 0x30, 0x0, 0x0, 0xaf, 0xa4, 0x0, 0x0, 0x5f, + 0xff, 0xf5, 0x0, 0x0, 0xbf, 0xff, 0xf3, 0x0, + 0x0, 0xef, 0xf9, 0x0, 0x1, 0xff, 0xff, 0x30, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x30, 0x3, 0xff, + 0xf5, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xf4, 0x9, 0xff, 0xf1, 0x0, + 0xd, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x5f, 0xff, 0xb0, 0x0, 0xf, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x1f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf7, 0x0, 0x0, + 0xb, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0x50, 0x0, 0x4, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xd9, 0x77, 0x8a, 0xef, 0xff, 0xff, 0x9a, 0xff, + 0xff, 0x50, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0xaf, 0xff, 0xe0, + 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0xa, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x38, 0xcd, 0xff, 0xec, 0xa5, 0x10, 0x0, + 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0027 "'" */ + 0x5f, 0xff, 0x25, 0xff, 0xf2, 0x4f, 0xff, 0x14, + 0xff, 0xf1, 0x4f, 0xff, 0x3, 0xff, 0xf0, 0x3f, + 0xff, 0x3, 0xff, 0xf0, 0x2f, 0xff, 0x2, 0xff, + 0xe0, 0x2f, 0xfe, 0x1, 0x99, 0x80, + + /* U+0028 "(" */ + 0x0, 0x0, 0x4, 0xff, 0xf8, 0x0, 0x0, 0xd, + 0xff, 0xf1, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, + 0x0, 0xdf, 0xff, 0x10, 0x0, 0x4, 0xff, 0xfa, + 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, 0xf, + 0xff, 0xe0, 0x0, 0x0, 0x4f, 0xff, 0xa0, 0x0, + 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, 0xdf, 0xff, + 0x10, 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x4, + 0xff, 0xfa, 0x0, 0x0, 0x6, 0xff, 0xf8, 0x0, + 0x0, 0x9, 0xff, 0xf5, 0x0, 0x0, 0xb, 0xff, + 0xf3, 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, 0x0, + 0xe, 0xff, 0xf1, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xf0, 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, + 0xc, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf3, + 0x0, 0x0, 0x9, 0xff, 0xf5, 0x0, 0x0, 0x6, + 0xff, 0xf8, 0x0, 0x0, 0x4, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x10, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, + 0x0, 0x4f, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, + 0xe0, 0x0, 0x0, 0x9, 0xff, 0xf4, 0x0, 0x0, + 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x10, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, + 0xd, 0xff, 0xf1, 0x0, 0x0, 0x4, 0xff, 0xf8, + + /* U+0029 ")" */ + 0x6f, 0xff, 0x70, 0x0, 0x0, 0xd, 0xff, 0xf1, + 0x0, 0x0, 0x6, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x10, 0x0, 0x0, 0x8f, 0xff, 0x70, + 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0xc, + 0xff, 0xf2, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, + 0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, + 0x0, 0x8f, 0xff, 0x70, 0x0, 0x0, 0x5f, 0xff, + 0x90, 0x0, 0x0, 0x2f, 0xff, 0xc0, 0x0, 0x0, + 0xf, 0xff, 0xe0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0xd, 0xff, 0xf1, 0x0, 0x0, 0xc, + 0xff, 0xf2, 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, + 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, 0x0, + 0xc, 0xff, 0xf2, 0x0, 0x0, 0xd, 0xff, 0xf1, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0xe0, 0x0, 0x0, 0x2f, 0xff, 0xc0, 0x0, + 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff, + 0x70, 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x0, + 0xef, 0xff, 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, + 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, 0xc, 0xff, + 0xf2, 0x0, 0x0, 0x2f, 0xff, 0xc0, 0x0, 0x0, + 0x8f, 0xff, 0x60, 0x0, 0x0, 0xef, 0xff, 0x0, + 0x0, 0x6, 0xff, 0xf8, 0x0, 0x0, 0xd, 0xff, + 0xf1, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x10, + 0x5, 0xe6, 0x0, 0xd, 0xfa, 0x0, 0x8, 0xf2, + 0xd, 0xff, 0xc3, 0xd, 0xfa, 0x5, 0xef, 0xfa, + 0x8, 0xff, 0xff, 0x9d, 0xfb, 0xbf, 0xff, 0xe6, + 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, + 0x0, 0x0, 0x3c, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x3c, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x8, 0xff, 0xff, 0x9d, 0xfb, 0xbf, 0xff, 0xe6, + 0xd, 0xff, 0xc3, 0xd, 0xfa, 0x5, 0xef, 0xfa, + 0x5, 0xe6, 0x0, 0xd, 0xfa, 0x0, 0x8, 0xf2, + 0x0, 0x10, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0x7d, 0xdd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x16, 0x66, + 0x66, 0x66, 0xbf, 0xff, 0x66, 0x66, 0x66, 0x63, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, + + /* U+002C "," */ + 0x9, 0xed, 0x50, 0x9f, 0xff, 0xf2, 0xef, 0xff, + 0xf7, 0xef, 0xff, 0xf7, 0x8f, 0xff, 0xf5, 0x8, + 0xff, 0xf0, 0x7, 0xff, 0xb0, 0xa, 0xff, 0x50, + 0xe, 0xff, 0x0, 0x2f, 0xfb, 0x0, 0x6f, 0xf5, + 0x0, 0xaf, 0xf1, 0x0, + + /* U+002D "-" */ + 0x59, 0x99, 0x99, 0x99, 0x99, 0x96, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+002E "." */ + 0x0, 0x8d, 0xc4, 0x0, 0x9f, 0xff, 0xf2, 0xf, + 0xff, 0xff, 0x70, 0xff, 0xff, 0xf7, 0xa, 0xff, + 0xff, 0x20, 0x1a, 0xed, 0x50, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, + 0x88, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfe, 0xb7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x4b, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0xaf, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, + 0x3, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x30, 0xa, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf0, 0x4f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, + 0x8f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf8, 0xbf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, + 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfd, 0xef, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfe, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfe, 0xdf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, + 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x8f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, + 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf5, 0xf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, + 0xa, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xa0, 0x3, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x30, + 0x0, 0xaf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xfa, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xc4, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x7b, 0xef, 0xfe, 0xb7, 0x10, 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x7b, 0xbb, 0xbb, 0xbf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf2, + + /* U+0032 "2" */ + 0x0, 0x0, 0x0, 0x48, 0xce, 0xff, 0xed, 0xa6, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfd, + 0xdf, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x2f, 0xff, + 0xff, 0xb6, 0x10, 0x0, 0x2, 0x7f, 0xff, 0xff, + 0x80, 0x0, 0x5f, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xfe, 0x0, 0x0, 0x3c, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xfe, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x80, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, + + /* U+0033 "3" */ + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xdf, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xfb, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xcc, 0xde, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x5c, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x0, 0x2b, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xc0, 0xb, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf6, 0x4, + 0xff, 0xff, 0xe8, 0x40, 0x0, 0x0, 0x16, 0xdf, + 0xff, 0xfd, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xdd, 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x7, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x26, 0xac, 0xef, 0xfe, 0xda, 0x61, 0x0, 0x0, + 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xb0, + 0x0, 0x0, 0x7, 0x88, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x96, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x4b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbf, 0xff, 0xfb, 0xbb, 0xbb, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x0, 0x0, 0x0, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xcb, 0xbb, 0xa9, 0x85, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0x59, 0xef, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x60, 0xb, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf2, 0x4, 0xff, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfc, 0x0, + 0xcf, 0xff, 0xfc, 0x72, 0x0, 0x0, 0x3, 0xaf, + 0xff, 0xff, 0x40, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xef, 0xff, 0xff, 0xff, 0x80, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x8b, 0xde, 0xff, 0xeb, 0x83, 0x0, 0x0, + 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xfe, + 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xfd, 0xbb, 0xce, 0xff, 0xf5, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xf9, 0x30, 0x0, 0x0, 0x2, 0x7c, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf7, 0x0, 0x0, 0x4, 0x57, 0x65, 0x20, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x50, 0x5, 0xbf, 0xff, + 0xff, 0xff, 0xe8, 0x0, 0x0, 0xe, 0xff, 0xf4, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0xff, 0xff, 0x4d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0xf, 0xff, 0xfe, 0xff, + 0xfc, 0x62, 0x0, 0x25, 0xbf, 0xff, 0xff, 0x30, + 0xef, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfd, 0xd, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0xcf, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x89, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x6f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xc2, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfb, 0xd, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x6f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf5, 0x0, 0xdf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x0, + 0x3, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x2c, + 0xff, 0xff, 0x60, 0x0, 0x7, 0xff, 0xff, 0xfe, + 0xa8, 0x89, 0xcf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0xbd, 0xef, 0xfd, 0x94, 0x0, 0x0, + 0x0, + + /* U+0037 "7" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6b, 0xff, 0xfd, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf2, 0xbf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfb, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x40, 0xbf, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x0, 0x1, + 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x0, 0x3, 0x7b, 0xde, 0xfe, 0xdb, + 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xea, 0x88, 0x8a, 0xef, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x50, 0x0, + 0x0, 0x0, 0x5e, 0xff, 0xff, 0x40, 0x0, 0xb, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xfb, 0x0, 0x0, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, 0x0, + 0x1f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x10, 0x1, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, + 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0xaf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xa0, 0x0, 0x2, 0xff, 0xff, 0xb1, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xf2, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xfa, 0x75, 0x45, 0x7a, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xa5, 0x20, 0x0, 0x25, + 0xaf, 0xff, 0xff, 0x60, 0x0, 0x2f, 0xff, 0xfc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0x20, 0xa, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xfa, 0x0, 0xef, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x22, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf2, 0x1f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, + 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xe0, 0x8, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf9, + 0x0, 0x1e, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, + 0x2, 0xaf, 0xff, 0xff, 0x10, 0x0, 0x4f, 0xff, + 0xff, 0xfd, 0xa8, 0x78, 0xad, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, 0xce, + 0xff, 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfe, 0xdb, 0x62, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfc, 0x98, + 0x8a, 0xef, 0xff, 0xff, 0x50, 0x0, 0x8, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0x20, 0x1, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfc, 0x0, 0x7f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, + 0xa, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xb0, 0xcf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x1c, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf4, 0xbf, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x88, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xfb, 0x3f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xc0, 0xbf, 0xff, + 0xfa, 0x20, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, + 0xfd, 0x1, 0xef, 0xff, 0xff, 0xc9, 0x88, 0xae, + 0xff, 0xff, 0x9f, 0xff, 0xd0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x65, 0xff, 0xfd, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x17, 0xbe, + 0xff, 0xec, 0x83, 0x0, 0x7, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0x30, 0x0, + 0x1, 0xd7, 0x20, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x7f, 0xff, 0xec, 0xbb, + 0xdf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xad, 0xef, 0xfe, 0xca, 0x51, 0x0, 0x0, 0x0, + 0x0, + + /* U+003A ":" */ + 0x1, 0xae, 0xd5, 0x0, 0xaf, 0xff, 0xf3, 0xf, + 0xff, 0xff, 0x70, 0xff, 0xff, 0xf7, 0x9, 0xff, + 0xff, 0x20, 0x8, 0xdb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xdc, 0x40, 0x9, + 0xff, 0xff, 0x20, 0xff, 0xff, 0xf7, 0xf, 0xff, + 0xff, 0x70, 0xaf, 0xff, 0xf2, 0x1, 0xae, 0xd5, + 0x0, + + /* U+003B ";" */ + 0x1, 0xae, 0xd5, 0x0, 0xaf, 0xff, 0xf3, 0xf, + 0xff, 0xff, 0x70, 0xff, 0xff, 0xf7, 0x9, 0xff, + 0xff, 0x20, 0x8, 0xdb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xed, 0x50, 0x9, + 0xff, 0xff, 0x20, 0xef, 0xff, 0xf7, 0xe, 0xff, + 0xff, 0x70, 0x8f, 0xff, 0xf5, 0x0, 0x8f, 0xff, + 0x0, 0x7, 0xff, 0xb0, 0x0, 0xaf, 0xf5, 0x0, + 0xe, 0xff, 0x0, 0x2, 0xff, 0xb0, 0x0, 0x6f, + 0xf5, 0x0, 0xa, 0xff, 0x10, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3a, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x9f, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, + 0xfe, 0x81, 0x0, 0x0, 0x0, 0x39, 0xff, 0xff, + 0xff, 0xfb, 0x40, 0x0, 0x0, 0x0, 0x6c, 0xff, + 0xff, 0xff, 0xd7, 0x10, 0x0, 0x0, 0x2, 0x9e, + 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x7e, 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, + 0xe9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xef, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xbf, 0xff, 0xff, 0xff, 0x92, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x28, 0xea, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + + /* U+003D "=" */ + 0x16, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x64, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x64, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, + + /* U+003E ">" */ + 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xd6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf9, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, 0xff, 0xff, + 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, + 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, 0xfb, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x7d, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x8e, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xef, 0xff, 0xff, + 0xfa, 0x40, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, + 0xff, 0xd7, 0x10, 0x0, 0x0, 0x3, 0x9f, 0xff, + 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x6, 0xdf, + 0xff, 0xff, 0xfe, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xfb, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xe8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x0, 0x59, 0xce, 0xff, 0xed, 0xa7, + 0x10, 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xec, 0xbb, 0xcf, + 0xff, 0xff, 0xfe, 0x10, 0x5f, 0xff, 0xff, 0x93, + 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0x90, 0x9, + 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xe0, 0x0, 0x4b, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x66, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xaf, 0xd4, 0x0, 0x0, + 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x69, + 0xcd, 0xef, 0xfe, 0xdb, 0x85, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xed, 0xde, 0xff, 0xff, 0xff, 0xfd, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xfd, 0x84, 0x10, 0x0, 0x0, 0x2, + 0x59, 0xef, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xef, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x44, 0x20, 0x0, + 0x0, 0x15, 0x55, 0x10, 0xbf, 0xfe, 0x10, 0x0, + 0x0, 0x1e, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5b, + 0xff, 0xff, 0xff, 0xa4, 0x0, 0x6f, 0xff, 0x40, + 0xc, 0xff, 0xa0, 0x0, 0x0, 0xaf, 0xfd, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x6f, 0xff, 0x40, 0x2, 0xff, 0xf3, 0x0, + 0x2, 0xff, 0xf3, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x6f, 0xff, 0x40, + 0x0, 0x7f, 0xfb, 0x0, 0x9, 0xff, 0xb0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0x94, 0x10, 0x14, 0xaf, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xe, 0xff, 0x20, + 0xe, 0xff, 0x40, 0x0, 0x0, 0xbf, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0x40, + 0x0, 0x8, 0xff, 0x70, 0x4f, 0xfe, 0x0, 0x0, + 0x4, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0x40, 0x0, 0x2, 0xff, 0xc0, + 0x8f, 0xf9, 0x0, 0x0, 0xa, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, + 0x0, 0x0, 0xef, 0xf0, 0xaf, 0xf6, 0x0, 0x0, + 0xf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, 0xbf, 0xf2, + 0xdf, 0xf3, 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x40, + 0x0, 0x0, 0x8f, 0xf4, 0xef, 0xf2, 0x0, 0x0, + 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, 0x7f, 0xf5, + 0xff, 0xf1, 0x0, 0x0, 0x5f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x40, + 0x0, 0x0, 0x7f, 0xf6, 0xff, 0xf1, 0x0, 0x0, + 0x5f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, 0x7f, 0xf5, + 0xef, 0xf2, 0x0, 0x0, 0x4f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, + 0x0, 0x0, 0x8f, 0xf4, 0xdf, 0xf4, 0x0, 0x0, + 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x40, 0x0, 0x0, 0xaf, 0xf3, + 0xaf, 0xf6, 0x0, 0x0, 0xd, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, + 0x0, 0x0, 0xdf, 0xf0, 0x7f, 0xfa, 0x0, 0x0, + 0x8, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x40, 0x0, 0x1, 0xff, 0xd0, + 0x3f, 0xfe, 0x0, 0x0, 0x1, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x50, + 0x0, 0x7, 0xff, 0x80, 0xe, 0xff, 0x40, 0x0, + 0x0, 0x8f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x2f, 0xff, 0x20, + 0x9, 0xff, 0xc0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xe9, 0x54, 0x69, 0xef, 0xff, 0x6e, 0xff, 0xfa, + 0x57, 0xef, 0xfa, 0x0, 0x2, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x8, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0xcf, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0x0, 0x1e, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x16, 0xbe, 0xff, 0xeb, 0x60, + 0x0, 0x0, 0x7, 0xdf, 0xfc, 0x70, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xfd, 0x95, + 0x20, 0x0, 0x0, 0x14, 0x7c, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x69, 0xce, 0xff, 0xfe, 0xca, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, + 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, + 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x80, + 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, + 0x0, 0x7f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, + 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf3, 0x0, + 0x0, 0x9, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xc0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xa7, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0xdf, 0xff, 0x70, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x9, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, + 0x0, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, + 0x0, 0x7f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x30, + 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xa0, + 0x6, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, + 0xd, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf8, + + /* U+0042 "B" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xc9, 0x50, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x9f, + 0xff, 0xc7, 0x77, 0x77, 0x77, 0x78, 0x8b, 0xef, + 0xff, 0xff, 0xc0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xf6, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xfc, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x10, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x10, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfa, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf3, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x13, 0x7d, 0xff, 0xff, 0x70, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa2, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x9f, 0xff, 0xc7, 0x77, 0x77, 0x77, 0x77, 0x78, + 0xad, 0xff, 0xff, 0xfb, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, + 0xff, 0x80, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf1, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf6, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf9, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfa, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf9, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf8, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, + 0xff, 0xd0, 0x9f, 0xff, 0xc7, 0x77, 0x77, 0x77, + 0x77, 0x78, 0xad, 0xff, 0xff, 0xff, 0x30, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xec, 0x96, 0x10, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, + 0xfe, 0xc8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfe, + 0xde, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xe8, 0x30, 0x0, 0x0, 0x27, + 0xcf, 0xff, 0xff, 0x70, 0x0, 0xaf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xc1, 0x0, 0x6f, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xc1, 0x0, 0x1f, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x6, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcc, 0x10, 0x0, 0xa, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, + 0xfd, 0x10, 0x0, 0xb, 0xff, 0xff, 0xfe, 0x83, + 0x0, 0x0, 0x2, 0x7d, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xed, 0xef, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, 0xff, + 0xec, 0x84, 0x0, 0x0, 0x0, + + /* U+0044 "D" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, + 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc5, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0x0, 0x9, 0xff, 0xfe, 0xbb, 0xbb, + 0xbb, 0xbb, 0xcd, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0x70, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0x30, 0x9, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xfd, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf5, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xb0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x19, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x79, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf9, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xa9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x99, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf7, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x49, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf1, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xd0, 0x9, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xf3, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf7, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x9f, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x9f, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbc, + 0xdf, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x60, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xca, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x9f, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb1, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x9f, 0xff, 0xda, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xa3, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb8, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, + + /* U+0046 "F" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x9f, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb1, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x9f, 0xff, 0xeb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xb3, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xbd, 0xef, + 0xfe, 0xc9, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xed, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf9, 0x40, 0x0, + 0x0, 0x15, 0xaf, 0xff, 0xff, 0xc0, 0x0, 0xa, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0x30, 0x0, 0x6f, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xe3, 0x0, 0x1, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x22, 0x20, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, 0xcf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xd0, 0x9f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xd0, 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, + 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, 0x8, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xd0, 0x1, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xd0, 0x0, 0x6f, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, + 0x0, 0xa, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x9f, 0xff, 0xd0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf9, 0x40, 0x0, 0x0, 0x14, + 0x9f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xed, 0xde, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, 0xfd, 0xc9, + 0x51, 0x0, 0x0, 0x0, + + /* U+0048 "H" */ + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfb, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x9f, 0xff, 0xec, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xce, 0xff, 0xfb, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, + + /* U+0049 "I" */ + 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, 0x99, + 0xff, 0xf9, 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, + 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, 0x99, 0xff, + 0xf9, 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, + 0x99, 0xff, 0xf9, 0x9f, 0xff, 0x99, 0xff, 0xf9, + 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, 0x99, + 0xff, 0xf9, 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, + 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, 0x99, 0xff, + 0xf9, 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, + 0x99, 0xff, 0xf9, + + /* U+004A "J" */ + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x4b, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x8, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf0, 0x6, 0xff, 0x90, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xfc, 0x2, 0xff, 0xff, + 0xc4, 0x0, 0x0, 0x2c, 0xff, 0xff, 0x50, 0xa, + 0xff, 0xff, 0xfe, 0xcb, 0xdf, 0xff, 0xff, 0xc0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, + 0xfe, 0xc8, 0x30, 0x0, 0x0, + + /* U+004B "K" */ + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xd1, 0x9, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xd1, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe2, 0x0, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xe2, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf3, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, + 0x0, 0x6f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x5f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf9, 0x0, 0x5f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x4f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf9, 0x3f, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0x35, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x30, + 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0x40, 0x0, 0x9, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0x40, 0x0, 0x0, 0xc, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfb, 0x0, + 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf5, 0x0, 0x9, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xf2, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xd1, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xb0, + + /* U+004C "L" */ + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0x69, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x89, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, + + /* U+004D "M" */ + 0x9f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, + 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfa, + 0x9f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, + 0x9f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfa, + 0x9f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xfa, + 0x9f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xfa, + 0x9f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfa, + 0x9f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xfa, + 0x9f, 0xff, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0xff, 0xfa, + 0x9f, 0xff, 0x7d, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd6, 0xff, 0xfa, + 0x9f, 0xff, 0x74, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x45, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0xaf, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfa, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x1f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf1, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x7, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x70, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x0, 0xdf, 0xff, 0x40, 0x0, + 0x0, 0x2, 0xff, 0xfe, 0x0, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x0, 0x5f, 0xff, 0xd0, 0x0, + 0x0, 0xa, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x0, 0xb, 0xff, 0xf7, 0x0, + 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x0, 0x2, 0xff, 0xff, 0x10, + 0x0, 0xcf, 0xff, 0x20, 0x0, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x8f, 0xff, 0x90, + 0x6, 0xff, 0xf9, 0x0, 0x0, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xf3, + 0xe, 0xff, 0xe1, 0x0, 0x0, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x6, 0xff, 0xfc, + 0x8f, 0xff, 0x60, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + + /* U+004E "N" */ + 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0x9f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfb, 0x9f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfb, 0x9f, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, + 0x9f, 0xff, 0x9b, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, + 0xdf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x2f, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, + 0xff, 0x90, 0x5, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, + 0x8f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfb, 0x9f, 0xff, 0x90, 0x0, 0xb, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, + 0x90, 0x0, 0x1, 0xef, 0xff, 0xf4, 0x0, 0x0, + 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x3f, 0xff, 0xfe, 0x20, 0x0, 0x8, 0xff, 0xfb, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xd0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfa, 0x0, 0x8, + 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0x70, 0x8, 0xff, 0xfb, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xf3, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x18, 0xff, + 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xc8, 0xff, 0xfb, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfb, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfb, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xef, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xe8, 0x30, 0x0, + 0x0, 0x26, 0xcf, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x6f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, + 0x1, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, + 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfd, 0x0, + 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, + 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, + 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, + 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, + 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, + 0x8, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfd, 0x0, + 0x1, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, + 0x0, 0x6f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xe8, 0x30, 0x0, + 0x0, 0x26, 0xcf, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xdf, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xd9, + 0x61, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x9, 0xff, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbc, 0xdf, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xaf, 0xff, 0xff, 0x50, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xfe, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xb0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x19, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf6, 0x9, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xaf, 0xff, 0xff, 0x50, 0x9, 0xff, 0xfe, 0xcc, + 0xcc, 0xcc, 0xcc, 0xdf, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xda, 0x61, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xfe, 0xde, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xe8, + 0x30, 0x0, 0x0, 0x27, 0xdf, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x1e, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0x50, 0x0, 0x8, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xfd, 0x0, 0x0, 0xef, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf4, 0x0, 0x4f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x8, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, 0xcf, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0xe, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x20, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0xf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, + 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, + 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x10, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xe0, 0x5, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfa, 0x0, 0x1f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x40, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xe0, 0x0, 0x2, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf6, 0x0, 0x0, 0x8, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xfd, 0x61, 0x0, 0x0, 0x0, 0x5b, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xfe, 0xcb, 0xbd, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xff, 0xff, + 0xf6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xa2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x3, 0xcf, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xfb, 0x86, 0x8c, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x49, 0xdf, 0xfe, 0xb6, + 0x10, 0x0, + + /* U+0052 "R" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xd9, + 0x61, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x9, 0xff, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbc, 0xdf, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xaf, 0xff, 0xff, 0x50, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xfe, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xb0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x19, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf1, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf7, 0x9, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xfe, 0x10, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x9f, 0xff, 0xff, 0x60, 0x9, 0xff, 0xfd, 0xaa, + 0xaa, 0xaa, 0xab, 0xcf, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf2, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x30, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfd, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xf9, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, + + /* U+0053 "S" */ + 0x0, 0x0, 0x0, 0x4, 0x8b, 0xef, 0xff, 0xec, + 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xdb, 0xab, 0xcf, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x8f, 0xff, 0xfd, 0x50, 0x0, 0x0, 0x0, + 0x38, 0xef, 0xf6, 0x0, 0x0, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xc0, 0x0, + 0x5, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xfa, 0x51, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xd9, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x8c, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x8d, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf4, 0x0, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, + 0x7, 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xa5, + 0x10, 0x0, 0x0, 0x1, 0x6e, 0xff, 0xff, 0x40, + 0x1d, 0xff, 0xff, 0xff, 0xfd, 0xcb, 0xab, 0xdf, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x1, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, + 0xbd, 0xff, 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x79, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbe, 0xff, 0xfd, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0xcf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf0, 0xbf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe0, 0xaf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xd0, 0x7f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xa0, 0x4f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, 0xf, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x20, 0x9, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfb, 0x0, + 0x2, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xf4, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xa4, 0x0, 0x0, 0x3, 0x9f, 0xff, 0xff, + 0x90, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfe, + 0xde, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xde, 0xfe, + 0xdb, 0x83, 0x0, 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, + 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, + 0xef, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, 0x0, 0x8, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x1f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0xaf, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf9, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, 0xd, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x90, 0x0, + 0x0, 0x6, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf7, 0x0, 0x0, + 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, 0xb, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x40, 0x2, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x9f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf2, 0xf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x96, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xdf, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0057 "W" */ + 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc2, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf7, 0xd, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x20, 0x8f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xc0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf7, + 0x0, 0xd, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, + 0x8f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xbf, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xd0, 0x0, 0x3, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf3, 0xdf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf7, 0x0, 0x0, 0xd, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x7, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x20, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x2f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf3, 0x0, 0xdf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfd, 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x80, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, 0xf3, 0x0, + 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, 0x8, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf6, + 0x0, 0x0, 0x1, 0xff, 0xfd, 0x0, 0x0, 0x7, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, + 0x0, 0x6f, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x10, 0x0, 0xb, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x30, + 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf5, 0x0, 0x1, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, + 0xdf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xb0, 0x0, 0x6f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x2f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x30, 0x7, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf5, + 0x1, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf8, 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x6f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xc, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x37, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf6, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, 0xcf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xef, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0x6, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0x90, 0x0, 0xbf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfd, 0x0, 0x0, 0x1e, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf3, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, + 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x20, 0x0, + 0x9f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xc0, 0x5, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf7, 0x1e, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xef, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf6, 0x4f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xb0, 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x10, 0x0, + 0xdf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf5, 0x0, 0x0, 0x3f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x1e, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf3, 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x0, + 0x6, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xa0, 0x2f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf5, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x10, 0x4f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x70, 0x0, 0xaf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xd0, 0x0, 0x1, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf4, 0x0, 0x0, 0x7, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, + 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xc0, 0x0, 0x4f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x50, 0xd, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfe, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfa, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xa, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xeb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb4, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+005B "[" */ + 0x9f, 0xff, 0xff, 0xff, 0xf3, 0x9f, 0xff, 0xff, + 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, 0xf3, 0x9f, + 0xff, 0xa6, 0x66, 0x61, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, + 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, + 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, + 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, + 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, + 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, + 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, + 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, + 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0xa6, 0x66, + 0x61, 0x9f, 0xff, 0xff, 0xff, 0xf3, 0x9f, 0xff, + 0xff, 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, 0xf3, + + /* U+005C "\\" */ + 0x48, 0x88, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xfc, + + /* U+005D "]" */ + 0x3f, 0xff, 0xff, 0xff, 0xf9, 0x3f, 0xff, 0xff, + 0xff, 0xf9, 0x3f, 0xff, 0xff, 0xff, 0xf9, 0x16, + 0x66, 0x6a, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, + 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, + 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, + 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, + 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, + 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, + 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, + 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, + 0x0, 0x7, 0xff, 0xf9, 0x16, 0x66, 0x6a, 0xff, + 0xf9, 0x3f, 0xff, 0xff, 0xff, 0xf9, 0x3f, 0xff, + 0xff, 0xff, 0xf9, 0x3f, 0xff, 0xff, 0xff, 0xf9, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xd4, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf6, 0xe, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, 0x8f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x90, 0x1, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf3, + 0x0, 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, 0x5f, + 0xfd, 0x0, 0x0, 0x4f, 0xfd, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x60, 0x0, 0x0, 0xef, 0xf4, 0x0, + 0x0, 0x2, 0xff, 0xf0, 0x0, 0x0, 0x7, 0xff, + 0xa0, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x10, 0x0, 0xf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x6, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xe0, 0x0, 0xdf, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, + 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xfb, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf2, + + /* U+005F "_" */ + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+0060 "`" */ + 0x6, 0x88, 0x88, 0x20, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf4, + + /* U+0061 "a" */ + 0x0, 0x0, 0x16, 0xad, 0xef, 0xfe, 0xc8, 0x30, + 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x10, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0xe, 0xff, + 0xff, 0xfc, 0xa9, 0xac, 0xff, 0xff, 0xfe, 0x10, + 0x6, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x2b, 0xff, + 0xff, 0x80, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x5a, 0xde, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x2f, 0xff, 0xfc, 0x51, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf7, 0x9f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0xdf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, + 0xef, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf7, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf7, 0x8f, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xf7, 0x2f, 0xff, + 0xff, 0x95, 0x33, 0x59, 0xff, 0xff, 0xff, 0xf7, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, + 0xff, 0xf7, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x15, 0xff, 0xf7, 0x0, 0x0, 0x5a, 0xdf, + 0xfe, 0xc8, 0x30, 0x5, 0xff, 0xf7, + + /* U+0062 "b" */ + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x27, 0xce, 0xff, 0xda, 0x50, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x1a, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x70, 0x0, 0x0, 0x2f, 0xff, 0xd2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x2f, 0xff, 0xee, 0xff, 0xff, 0xdb, 0xac, 0xef, + 0xff, 0xff, 0xe1, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0x92, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xfc, 0x0, + 0x2f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x60, 0x2f, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe0, + 0x2f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x2f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf8, + 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfb, 0x2f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x2f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, + 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfb, 0x2f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, + 0x2f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x2f, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd0, + 0x2f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x60, 0x2f, 0xff, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xfc, 0x0, + 0x2f, 0xff, 0xcd, 0xff, 0xff, 0xdb, 0xac, 0xef, + 0xff, 0xff, 0xd1, 0x0, 0x2f, 0xff, 0xb2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x2f, 0xff, 0xb0, 0x1a, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x70, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, + 0x28, 0xce, 0xff, 0xda, 0x60, 0x0, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, 0xda, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xdb, 0xab, + 0xef, 0xff, 0xff, 0xa0, 0x0, 0x1e, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xf5, 0x0, + 0xaf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x80, 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x93, 0x0, 0x9, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x93, 0x0, 0x0, 0xaf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x0, 0x1e, + 0xff, 0xff, 0xa3, 0x0, 0x0, 0x4, 0xcf, 0xff, + 0xf5, 0x0, 0x3, 0xff, 0xff, 0xff, 0xeb, 0xab, + 0xef, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, + 0xff, 0xda, 0x50, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x2, + 0x7b, 0xef, 0xfd, 0xb6, 0x10, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xe6, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa3, 0xff, 0xfd, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xdb, 0xac, 0xef, + 0xff, 0xfc, 0xff, 0xfd, 0x0, 0x2f, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xfd, + 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xfd, 0x4, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfd, + 0xa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfd, 0xe, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, + 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfd, 0x2f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, + 0x3f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x2f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, + 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfd, 0xe, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, + 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xfd, 0x4, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfd, + 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xfd, 0x0, 0x2f, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xfd, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xdb, 0xac, 0xef, + 0xff, 0xfa, 0xff, 0xfd, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xff, 0xfd, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x2, + 0x7b, 0xef, 0xfd, 0xb6, 0x0, 0x0, 0xff, 0xfd, + + /* U+0065 "e" */ + 0x0, 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfe, 0xb7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xea, + 0x88, 0xae, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x2f, + 0xff, 0xfe, 0x40, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xc0, 0x0, 0xb, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0x70, 0x3, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf4, 0xe, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x91, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfc, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x0, 0xa, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xd1, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xc0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfe, + 0xba, 0xac, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xde, 0xfe, 0xdb, 0x61, 0x0, 0x0, + 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x0, 0x6b, 0xef, 0xfd, 0x92, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfa, 0x76, + 0xaf, 0x60, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x26, 0x66, + 0xcf, 0xff, 0xa6, 0x66, 0x66, 0x50, 0x0, 0x0, + 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x0, 0x2, 0x8b, 0xef, 0xfd, 0xb7, + 0x10, 0x0, 0xbf, 0xff, 0x10, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0xb, 0xff, + 0xf1, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0xbf, 0xff, 0x10, 0x0, 0x7f, + 0xff, 0xff, 0xfd, 0xba, 0xbd, 0xff, 0xff, 0xed, + 0xff, 0xf1, 0x0, 0x4f, 0xff, 0xff, 0x81, 0x0, + 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0x10, 0xe, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xf1, 0x6, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x10, + 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf1, 0xf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x12, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf1, 0x3f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x13, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, 0x1f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x10, 0xef, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf1, 0xa, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x10, 0x3f, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xf1, + 0x0, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0xff, 0xff, 0xff, 0x10, 0x1, 0xef, 0xff, + 0xfe, 0x83, 0x10, 0x13, 0x8e, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xef, 0xff, 0x10, 0x0, 0x2, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xe, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, + 0xff, 0xff, 0xb3, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x58, 0x99, 0x75, 0x10, 0x0, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x2, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf6, + 0x0, 0x0, 0xbf, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xfe, 0x0, 0x0, 0x5f, 0xff, + 0xe7, 0x20, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, + 0x70, 0x0, 0xd, 0xff, 0xff, 0xff, 0xec, 0xaa, + 0xac, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x15, 0x8c, 0xde, 0xff, 0xec, 0x84, + 0x0, 0x0, 0x0, 0x0, + + /* U+0068 "h" */ + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x38, + 0xce, 0xfe, 0xda, 0x50, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x2f, 0xff, 0xd3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xdb, 0xce, 0xff, 0xff, 0xff, 0x30, 0x2f, + 0xff, 0xff, 0xfe, 0x71, 0x0, 0x0, 0x2a, 0xff, + 0xff, 0xc0, 0x2f, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf4, 0x2f, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf8, + 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfc, 0x2f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, 0x2f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfe, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + + /* U+0069 "i" */ + 0x2, 0x66, 0x0, 0x4f, 0xff, 0xd1, 0xcf, 0xff, + 0xf7, 0xdf, 0xff, 0xf7, 0x8f, 0xff, 0xf2, 0x8, + 0xcc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, + 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, + 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, + 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, + 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, + 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, + 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, + 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, + 0x2f, 0xff, 0xd0, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x0, 0x16, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x5, 0xcc, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xd0, 0x4, 0x0, 0x0, 0x1d, 0xff, 0xf9, + 0x0, 0xfe, 0x98, 0x9e, 0xff, 0xff, 0x30, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0x90, 0xa, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x6, 0xbe, 0xff, 0xda, + 0x30, 0x0, 0x0, + + /* U+006B "k" */ + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x50, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x60, 0x2, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x60, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x60, 0x0, 0x2, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x1d, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x2e, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xd0, 0x2e, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfd, 0x3e, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0x40, 0x9f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x30, 0x0, 0xcf, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfe, 0x30, + 0x0, 0x1, 0xef, 0xff, 0xe2, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x90, 0x0, 0x2, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x50, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x20, 0x2, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, + 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xfa, 0x2, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf6, + + /* U+006C "l" */ + 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, + 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, + 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, + 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, + 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, + 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, + 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, + 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, + 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, + 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, + + /* U+006D "m" */ + 0x2f, 0xff, 0xb0, 0x0, 0x5a, 0xde, 0xfe, 0xc8, + 0x30, 0x0, 0x0, 0x0, 0x49, 0xce, 0xfe, 0xd9, + 0x50, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x4d, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x2f, 0xff, + 0xb7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x2f, 0xff, 0xef, 0xff, 0xfc, 0x98, 0x9c, + 0xff, 0xff, 0xfb, 0x7f, 0xff, 0xfe, 0xa8, 0x8a, + 0xef, 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x2f, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf1, 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf5, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, + 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfa, 0x2f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x2f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfc, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfc, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfc, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xfc, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfc, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfc, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfc, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfc, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xfc, + + /* U+006E "n" */ + 0x2f, 0xff, 0xb0, 0x0, 0x49, 0xce, 0xfe, 0xda, + 0x50, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x2f, 0xff, + 0xb6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x2f, 0xff, 0xef, 0xff, 0xfd, 0x98, 0x8a, + 0xef, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x7, 0xff, 0xff, 0xc0, 0x2f, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf4, 0x2f, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf8, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, + 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfd, 0x2f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, 0x2f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, + + /* U+006F "o" */ + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xc9, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xdb, 0xab, 0xef, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x4, + 0xcf, 0xff, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x50, + 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xd0, 0x9, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf4, + 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf8, 0x1f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfd, 0x3f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, + 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfd, 0x1f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf8, 0x9, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, + 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xd0, 0x0, 0xaf, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x50, + 0x0, 0x1e, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x5, + 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xdb, 0xac, 0xef, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xd9, + 0x40, 0x0, 0x0, 0x0, + + /* U+0070 "p" */ + 0x2f, 0xff, 0xb0, 0x0, 0x38, 0xce, 0xff, 0xda, + 0x50, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, + 0x2f, 0xff, 0xb4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x2f, 0xff, 0xdf, 0xff, + 0xfe, 0x97, 0x68, 0xbf, 0xff, 0xff, 0xe1, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x60, + 0x2f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xe0, 0x2f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf4, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf8, 0x2f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfd, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfd, 0x2f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, + 0x2f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf8, 0x2f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf4, + 0x2f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xd0, 0x2f, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0x60, + 0x2f, 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x5, + 0xdf, 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xed, 0xff, + 0xff, 0xdb, 0xac, 0xef, 0xff, 0xff, 0xd1, 0x0, + 0x2f, 0xff, 0xd1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x2f, 0xff, 0xd0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x27, 0xce, 0xff, 0xda, + 0x60, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfd, 0xb6, + 0x10, 0x0, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xff, 0xfd, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0xff, 0xfd, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xdb, 0xac, 0xef, 0xff, 0xfa, 0xff, 0xfd, + 0x0, 0x2f, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x5, + 0xdf, 0xff, 0xff, 0xfd, 0x0, 0xcf, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, + 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfd, 0xa, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, + 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfd, 0x1f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, + 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfd, 0x3f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfd, 0x1f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, + 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfd, 0x9, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, + 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfd, 0x0, 0xcf, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, + 0x0, 0x2f, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x5, + 0xdf, 0xff, 0xff, 0xfd, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xdb, 0xac, 0xef, 0xff, 0xfc, 0xff, 0xfd, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x93, 0xff, 0xfd, 0x0, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xe5, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfd, 0xa5, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, + + /* U+0072 "r" */ + 0x2f, 0xff, 0xb0, 0x0, 0x49, 0xce, 0xc2, 0xff, + 0xfb, 0x2, 0xcf, 0xff, 0xfc, 0x2f, 0xff, 0xb3, + 0xff, 0xff, 0xff, 0xc2, 0xff, 0xfc, 0xef, 0xff, + 0xff, 0xfc, 0x2f, 0xff, 0xff, 0xff, 0xa4, 0x10, + 0x2, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, 0xc9, 0x61, + 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x40, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x5f, 0xff, 0xff, + 0xda, 0x89, 0xac, 0xff, 0xff, 0x50, 0xd, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x5d, 0xc0, 0x2, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xa6, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0xa6, 0x10, 0x0, + 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb3, 0x0, 0x0, 0x0, 0x27, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x58, 0xbf, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xc0, 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfb, 0x1f, 0xfd, 0x72, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x68, 0xff, 0xff, 0xfe, + 0xba, 0x99, 0xbe, 0xff, 0xff, 0xd0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, + 0x0, 0x0, 0x1, 0x59, 0xce, 0xff, 0xed, 0xa7, + 0x10, 0x0, 0x0, + + /* U+0074 "t" */ + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x26, 0x66, 0xcf, 0xff, + 0xa6, 0x66, 0x66, 0x50, 0x0, 0x0, 0x9, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x60, 0x0, 0x3, 0x10, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xc8, 0x8b, 0xf8, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x18, 0xce, 0xfe, 0xb7, 0x0, + + /* U+0075 "u" */ + 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x6f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x6f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf9, 0x6f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x6f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf9, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf9, 0x6f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x6f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x6f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf9, 0x6f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf9, 0x5f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf9, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf9, 0x3f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf9, + 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf9, 0xa, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xf9, 0x3, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, + 0xf9, 0x0, 0xaf, 0xff, 0xff, 0xfc, 0xbc, 0xef, + 0xff, 0xfc, 0xff, 0xf9, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa4, 0xff, 0xf9, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x4, + 0xff, 0xf9, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, + 0xb6, 0x10, 0x4, 0xff, 0xf9, + + /* U+0076 "v" */ + 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x40, 0x7f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xd0, 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0x9, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x10, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, + 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf2, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, 0x0, + 0x0, 0x4f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x40, 0x0, 0xb, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x0, 0x2, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf2, 0x0, 0x9f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x80, 0xf, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x6, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf6, 0xdf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xef, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf5, 0x3f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xe0, 0xd, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x90, 0x7, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x30, 0x2, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfd, 0x0, 0x0, + 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xef, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf8, 0x0, 0x0, 0x6f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x8c, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf2, 0x0, 0x0, 0x1f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x26, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, + 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xdf, + 0xfc, 0x0, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x60, 0x0, 0x0, 0x5, 0xff, 0xf6, 0x0, + 0x0, 0x3, 0xff, 0xf6, 0x0, 0xaf, 0xff, 0x10, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0xff, 0xfc, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, + 0x4f, 0xff, 0x60, 0x0, 0x0, 0xef, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x20, 0x0, 0xe, + 0xff, 0xa0, 0x0, 0xe, 0xff, 0xc0, 0x0, 0x4, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x70, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x8, 0xff, + 0xf2, 0x0, 0x9, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xd0, 0x0, 0xbf, 0xfe, 0x0, + 0x0, 0x2, 0xff, 0xf8, 0x0, 0xf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf3, 0x1, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, + 0x5f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf8, 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x30, 0xbf, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfe, 0xc, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x91, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x6f, 0xff, 0x70, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xe6, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfc, 0x0, 0xd, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x10, 0x0, + 0x2f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x9f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x5f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x50, 0x1e, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x2c, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf9, 0x7, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0xb, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x20, 0x0, 0x1e, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0x60, 0x0, 0x0, 0x4f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xe1, 0x0, 0x0, 0x8f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xb0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x1e, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x30, + + /* U+0079 "y" */ + 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x40, 0x6f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xd0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf6, 0x0, 0x8, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, + 0xaf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf2, 0x0, 0x0, 0x3, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, + 0x7, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, + 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x80, 0x0, 0xc, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, + 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf6, 0x0, 0x9f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xd0, 0x1f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x37, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfb, 0xef, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x91, 0x0, + 0x0, 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfa, 0x89, 0xef, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6b, 0xef, 0xfd, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x6, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x6a, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x62, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + + /* U+007B "{" */ + 0x0, 0x0, 0x0, 0x3a, 0xdf, 0xff, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xfa, 0x76, + 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x9f, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x47, 0x9f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xfb, 0x76, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x39, 0xdf, 0xff, + + /* U+007C "|" */ + 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, + 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, + 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, + 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, + 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, + 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, + 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, + 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, + 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, + 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, + 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, + 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, + 0xff, 0x29, 0xff, 0xf2, + + /* U+007D "}" */ + 0x3f, 0xff, 0xc8, 0x10, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x1, 0x68, 0xcf, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0xaf, 0xff, 0xe8, 0x72, 0x0, + 0x0, 0xe, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, + 0x0, 0x0, 0x16, 0x8c, 0xff, 0xff, 0x80, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x3, 0xff, 0xfc, + 0x81, 0x0, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xf9, 0x10, + 0x0, 0x0, 0x0, 0xae, 0xe0, 0x1, 0xdf, 0xff, + 0xff, 0xfe, 0x40, 0x0, 0x0, 0xe, 0xfe, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x5, + 0xff, 0xb0, 0x1f, 0xff, 0x81, 0x6, 0xef, 0xff, + 0xc5, 0x37, 0xff, 0xf6, 0x4, 0xff, 0xb0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7f, + 0xf4, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0x30, 0x6, 0xbb, 0x10, 0x0, 0x0, 0x0, 0x3a, + 0xef, 0xe9, 0x20, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x29, 0xdf, 0xec, 0x60, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x7f, 0xfd, 0x75, 0x5a, 0xff, 0xe1, 0x0, 0x2f, + 0xfa, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x9, 0xfd, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x30, 0xef, 0x70, + 0x0, 0x0, 0x0, 0xe, 0xf8, 0xf, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xa0, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xb, 0xfa, 0xe, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xef, 0x80, 0x9f, 0xd0, 0x0, 0x0, + 0x0, 0x6f, 0xf3, 0x2, 0xff, 0xb0, 0x0, 0x0, + 0x4f, 0xfc, 0x0, 0x7, 0xff, 0xe8, 0x56, 0xaf, + 0xfe, 0x10, 0x0, 0x7, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x2, 0x9d, 0xfe, 0xc6, 0x0, + 0x0, + + /* U+2022 "•" */ + 0x0, 0x3b, 0xdb, 0x40, 0x0, 0x4f, 0xff, 0xff, + 0x60, 0xe, 0xff, 0xff, 0xff, 0x12, 0xff, 0xff, + 0xff, 0xf5, 0x3f, 0xff, 0xff, 0xff, 0x50, 0xff, + 0xff, 0xff, 0xf1, 0x6, 0xff, 0xff, 0xf8, 0x0, + 0x5, 0xdf, 0xd7, 0x0, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x5a, 0xca, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x7c, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x9d, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x5a, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x9d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x84, 0x1, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x62, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, + 0x40, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xfe, 0xa5, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0x83, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x47, 0x89, 0x86, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x1, 0x35, 0x53, 0x6f, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x6c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x8c, 0xdd, 0xda, 0x71, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x9d, 0xff, 0xff, 0xe9, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F008 "" */ + 0x6, 0x50, 0x0, 0x1, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x10, 0x0, 0x5, 0x60, 0xbf, 0xa0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0xa, 0xfb, 0xff, 0xc0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xc, 0xff, 0xff, + 0xfe, 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xcc, 0xce, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xec, 0xcc, 0xcf, 0xff, 0xff, 0xb0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x30, + 0x0, 0xb, 0xff, 0xff, 0xa0, 0x0, 0x2, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, 0xa, 0xff, + 0xff, 0xa0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x20, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, + 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, + 0xa, 0xff, 0xff, 0xc0, 0x0, 0x5, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x50, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xaa, 0xad, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xda, 0xaa, 0xaf, 0xff, 0xff, 0xa0, + 0x0, 0x2, 0xff, 0xff, 0xdb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0xff, 0x20, + 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xa, 0xff, + 0xff, 0xa0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0xa, 0xff, 0xff, 0xd2, 0x22, 0x27, 0xff, 0xff, + 0x53, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x35, 0xff, 0xff, 0x72, 0x22, 0x2d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x88, 0x8c, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xc8, 0x88, 0x8f, 0xff, 0xff, 0xa0, + 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, + 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x2, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, 0xa, 0xff, + 0xff, 0xa0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x20, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, + 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, + 0xa, 0xff, 0xff, 0xe4, 0x44, 0x49, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x94, 0x44, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe6, 0x66, 0x6a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa6, 0x66, 0x6e, 0xff, 0xef, 0xa0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0xa, 0xfe, 0x4e, 0xa0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xa, 0xe4, + + /* U+F00B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x5, + 0x77, 0x77, 0x77, 0x77, 0x61, 0x0, 0x0, 0x67, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x6, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x6, 0x88, 0x88, 0x88, 0x88, 0x71, 0x0, 0x1, + 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x7, 0x88, 0x88, 0x88, 0x88, 0x72, 0x0, + 0x1, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x3, 0xcd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "ï€" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x5, + 0xef, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xe3, 0x0, 0x5, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf4, 0x4, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xf3, 0xdf, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xfd, 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0x81, + 0xdf, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xc0, 0x1, 0xdf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xc0, 0x0, 0x1, 0x8b, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8b, 0x70, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2a, 0xcc, 0xb6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x93, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x18, 0x92, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0x20, + 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xb0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x5, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xf4, 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, + 0x0, 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x1, 0xff, 0xff, + 0xff, 0x70, 0x0, 0xe, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0x30, 0x2, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0x90, 0x7, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xe0, + 0xc, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xf2, 0xf, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xf5, 0x2f, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xfa, 0x5f, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xfb, 0x5f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xfb, 0x4f, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xfb, 0x3f, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4c, 0xee, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf9, + 0x1f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xf7, 0xd, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf5, 0xa, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf1, 0x5, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb7, 0x31, 0x0, 0x12, 0x5a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x67, 0x89, + 0x87, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x19, 0xcf, 0xff, 0xff, 0xeb, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x91, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x0, 0x2b, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfe, 0x60, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x19, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xdb, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x4c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, 0x0, 0x2, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x53, 0x36, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xe6, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x6f, 0xf8, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x1, + 0xaf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4, 0x20, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x70, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x47, 0x89, 0x98, 0x64, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xdf, 0xe7, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0x70, 0x5f, 0xff, 0xff, 0xff, + 0xda, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x3a, 0x50, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x5, 0xff, 0xf8, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x7f, 0xff, 0xff, 0xb0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0x60, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xe3, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x1, 0xcf, 0xff, 0xff, 0xff, 0x60, + 0xef, 0xff, 0xff, 0xfd, 0x20, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf2, + 0x9f, 0xff, 0xff, 0xa0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x7f, 0xff, 0xff, 0xc0, + 0xc, 0xff, 0xf8, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x5, 0xff, 0xfe, 0x10, + 0x1, 0xef, 0x50, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x2e, 0xf4, 0x0, + 0x0, 0x11, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x53, 0x33, 0x33, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7b, 0xbb, 0xbb, 0xbb, + 0xbb, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x9b, 0xbb, + 0xbb, 0xbb, 0xbb, 0x90, 0x0, 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5c, 0xdd, 0xdd, 0xdd, 0xc5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x11, 0x11, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x41, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xc, + 0xff, 0xc1, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x99, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xbb, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xaf, 0xff, 0xea, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x6, 0xff, 0x10, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x3, 0xfd, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x2c, 0xff, 0x71, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x2, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x20, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xa0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xf5, 0x0, + 0xc, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xfe, 0x10, + 0x6f, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xa0, + 0xdf, 0xff, 0xff, 0xdc, 0xcc, 0xcc, 0xcc, 0xcc, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcf, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x88, 0x88, 0x88, 0x88, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6b, 0xcc, 0xc8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x15, 0x9c, 0xef, 0xff, + 0xfd, 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x60, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0xaf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xaf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x9f, 0xff, 0xff, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x95, 0x10, 0x0, 0x1, 0x5b, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xaf, 0xff, 0xff, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0x81, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xd, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x6f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x22, 0x10, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xdf, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xed, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x3, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xaa, 0xa9, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9a, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xd0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x90, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x89, + 0xab, 0xbb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xf9, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf2, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6d, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, + 0xff, 0xf8, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x74, 0x22, 0x46, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf9, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xfa, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xfb, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x8a, 0xbb, + 0xb9, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x25, 0x55, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x77, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0x19, 0xbb, 0xbb, 0xbb, + 0xbb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x77, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x11, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x7, 0xff, 0x80, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xe, 0xff, 0xfb, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xc, 0xff, 0xff, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x1, 0xcf, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x4, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2e, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x5, 0xff, 0xff, 0xe0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xe, 0xff, 0xff, 0x40, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xd, 0xff, 0xf6, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x3, 0xcc, 0x30, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xdd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x77, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1, 0xbc, + 0x50, 0x0, 0x0, 0x9f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf9, 0x0, 0x0, 0xc, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xb0, 0x0, 0x1, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x7f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0x70, 0x0, 0xd, 0xff, 0xf7, 0x0, + 0x19, 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf2, 0x0, 0x6, 0xff, 0xfd, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x33, 0x0, 0x0, + 0x1e, 0xff, 0xfa, 0x0, 0x0, 0xff, 0xff, 0x20, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x8, 0xff, 0xa0, 0x0, + 0x4, 0xff, 0xff, 0x20, 0x0, 0xaf, 0xff, 0x70, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xe, 0xff, 0xfc, 0x0, + 0x0, 0xcf, 0xff, 0x70, 0x0, 0x5f, 0xff, 0xb0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xb, 0xff, 0xff, 0x90, + 0x0, 0x5f, 0xff, 0xc0, 0x0, 0x1f, 0xff, 0xe0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x1, 0xbf, 0xff, 0xf2, + 0x0, 0x1f, 0xff, 0xf0, 0x0, 0xe, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0xd, 0xff, 0xf1, 0x0, 0xd, 0xff, 0xf2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xfa, + 0x0, 0xc, 0xff, 0xf3, 0x0, 0xc, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x4, 0xff, 0xfa, + 0x0, 0xb, 0xff, 0xf3, 0x0, 0xb, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0xc, 0xff, 0xf2, 0x0, 0xc, 0xff, 0xf2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x3f, 0xff, 0xf5, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0xd, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x5, 0xff, 0xff, 0xd0, + 0x0, 0x3f, 0xff, 0xd0, 0x0, 0xf, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xe, 0xff, 0xff, 0x30, + 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x3f, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xd, 0xff, 0xf5, 0x0, + 0x1, 0xff, 0xff, 0x40, 0x0, 0x7f, 0xff, 0x90, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x2, 0xbb, 0x20, 0x0, + 0xa, 0xff, 0xfe, 0x0, 0x0, 0xcf, 0xff, 0x50, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf6, 0x0, 0x3, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xc0, 0x0, 0xa, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x20, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x40, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xc2, 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x34, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xdd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7e, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x0, 0x48, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x84, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x11, 0x4b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x35, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcb, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xdf, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x1d, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x1, 0xdf, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x1d, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x1, 0xde, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + + /* U+F043 "ïƒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xda, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xff, 0xff, 0xfd, 0x6c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xff, 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xde, 0xff, 0xff, 0x60, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xbf, 0xff, 0xfb, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x98, 0xff, 0xff, 0xf1, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x3f, 0xff, 0xff, 0x90, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xdf, + 0xff, 0xff, 0x50, 0x1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x5, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x2, 0x4c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0xc, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xe8, + 0x31, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, + 0xff, 0xff, 0xff, 0xeb, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, + 0x33, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "ïˆ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xfe, 0x50, 0xdf, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0x2d, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf6, 0xdf, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xf6, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x6d, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xdf, 0xff, 0xff, 0x10, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, + 0xff, 0xff, 0xf1, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, + 0x11, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xdf, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xdf, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, + 0xff, 0xf1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0x10, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x6d, 0xff, 0xff, 0xf1, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, + 0xff, 0xff, 0x10, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x6d, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xf5, 0xdf, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0x15, 0xbb, 0xbb, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xb9, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "ï‹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xbb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe6, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xef, 0xfd, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "ïŒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x6, 0xab, 0xbb, + 0xbb, 0xbb, 0xba, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x6a, 0xbb, 0xbb, 0xbb, 0xbb, 0xa5, 0x0, + + /* U+F04D "ï" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x6, 0xab, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa5, 0x0, + + /* U+F051 "ï‘" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xf8, 0x4f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xb8, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xfb, 0x8f, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xb8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfb, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x3, 0xff, + 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x3f, 0xff, 0xff, 0xb8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x3, 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x3f, + 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0xff, 0xff, 0xfb, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xb8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x73, 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x3f, 0xff, + 0xff, 0xb8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x3, 0xff, 0xff, 0xfb, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x3f, 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x3, 0xff, + 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfb, + 0x8f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb8, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xb7, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xfb, 0x2f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xb0, 0x2a, 0xb4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9b, 0xbb, + 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8e, 0xfd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x4, 0x89, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x73, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe7, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x3, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x72, 0x0, + + /* U+F053 "ï“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, + + /* U+F054 "ï”" */ + 0x0, 0x8, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0xff, 0xff, + 0xfc, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x30, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x2, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x3a, 0xff, 0xff, 0xff, 0xf7, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x18, 0x9a, 0x97, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "ï¨" */ + 0x8, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xc5, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x71, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F06E "ï®" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x25, 0x89, 0xab, 0xa9, 0x86, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa6, 0x53, 0x46, 0x9e, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, + 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x1, 0x89, 0x86, 0x10, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xd2, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x93, 0x13, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x7c, 0xff, 0xfe, 0x91, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, + 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x62, 0x0, 0x1, 0x49, 0xef, 0xff, + 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x7a, 0xce, 0xff, 0xfd, 0xcb, 0x74, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "ï°" */ + 0x2, 0xdc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, + 0x79, 0xab, 0xa8, 0x75, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x1, + 0x6a, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa6, 0x43, 0x57, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x6, 0xbc, 0xb7, 0x20, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x5f, + 0xff, 0xff, 0x80, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x33, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0x51, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf6, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xc1, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xe3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xfe, 0x94, 0x10, 0x1, 0x10, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x48, 0xbd, 0xef, 0xfe, + 0xdc, 0x96, 0x20, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5c, 0xed, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xfb, 0x77, 0x77, 0x79, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x33, 0x33, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x74, 0x6c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x34, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x6, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x23, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x31, 0x0, 0x0, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x69, 0x99, 0x99, 0x99, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xe9, 0x9c, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xfb, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x8, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x8, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xfd, 0x10, 0x7, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x7, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xe1, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x6, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x5, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x8d, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x80, 0x0, 0x0, + 0x2, 0xef, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0xa, 0xfb, 0x0, 0x0, 0x7, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x8f, 0xff, + 0x90, 0x0, 0x8, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x6, 0xff, 0xff, 0xf8, 0x0, 0x8, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0x70, 0x8, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x48, 0x88, 0x88, 0x88, 0x88, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, 0x88, 0x8c, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7b, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xf4, 0x4, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xf1, 0x7f, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0x22, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xc0, 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xc1, 0x0, 0x3, 0xef, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xb0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, + + /* U+F078 "ï¸" */ + 0x0, 0x6, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x83, 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf5, 0x0, 0xa, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf5, 0x5, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf1, 0x7f, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0x21, 0xef, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x0, 0x0, 0x0, 0x7, 0xc7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x3, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x4e, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xaf, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x92, 0xff, 0xff, 0xf2, + 0x9f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xa0, 0x2f, + 0xff, 0xff, 0x20, 0xaf, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xa0, 0x2, 0xff, 0xff, 0xf2, 0x0, 0xaf, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x20, 0x0, 0x2f, 0xff, 0xff, 0x20, + 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9d, 0x80, 0x0, 0xdf, 0xff, 0xf6, 0x0, 0x2b, + 0xc5, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x90, 0xd, 0xff, 0xff, + 0x60, 0x2e, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x80, + 0xdf, 0xff, 0xf6, 0x1e, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0x7d, 0xff, 0xff, 0x7d, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xea, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F07B "ï»" */ + 0x0, 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + + /* U+F093 "ï‚“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9b, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xee, + 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xee, 0xee, 0xee, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x29, 0xbb, 0xbb, 0xbb, 0xa5, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xda, 0xaa, 0xaa, 0xaa, 0xad, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xaf, 0xff, 0xea, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x6, 0xff, 0x10, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x3, 0xfd, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x2c, 0xff, 0x71, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x2, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x20, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, 0x84, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xd9, 0x62, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x19, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x6e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xdb, 0x85, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x32, + 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xbc, 0xb8, 0x20, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x90, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xaf, 0xff, 0xff, 0x93, 0x4c, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xfa, + 0x0, 0x0, 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x8f, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x9f, 0xff, 0xfb, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0xdf, 0xff, + 0xfd, 0x0, 0x2, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xd7, 0x8e, 0xff, 0xff, + 0xf4, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xbc, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x19, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x92, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x93, 0x4c, 0xff, 0xff, + 0xf5, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xfa, 0x0, + 0x0, 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x8f, 0xff, 0xfb, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x9f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0xdf, 0xff, 0xfd, + 0x0, 0x2, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x8f, 0xff, 0xff, 0xd7, 0x8e, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x68, 0x73, 0x0, 0x0, 0x0, + 0x0, 0x17, 0xbc, 0xca, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x10, 0x1c, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x1, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x1f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x1f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x1, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x1f, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x1, + 0xff, 0xff, 0xff, 0xfc, 0x4d, 0xff, 0xff, 0xfd, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xe0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xe0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xe0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xe0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xf0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x5, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x96, 0xf, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x1, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xff, + 0xff, 0xf9, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x28, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0xf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xd1, 0xf, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xfb, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x47, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, + 0x1, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb7, 0x68, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x19, 0xcd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xb5, 0x0, + + /* U+F0C9 "" */ + 0x8d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xd4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x0, + + /* U+F0E0 "" */ + 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x30, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x1, 0xd5, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x8f, 0xff, 0x90, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x1c, + 0xff, 0xff, 0xfd, 0x30, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc2, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x3, 0xcf, 0xff, 0xfc, + 0x30, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x4, 0xaa, 0x40, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x61, 0x0, 0x16, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x3, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x4a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x20, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xcc, 0xa4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x33, 0x33, + 0x33, 0x5f, 0xff, 0xff, 0xff, 0xf7, 0x33, 0x33, + 0x33, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x2b, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd2, 0x1, 0xc7, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x1f, 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x1, 0xff, 0xf8, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x1f, 0xff, + 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x1, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x1f, 0xff, 0xff, 0xf8, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x1, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x1f, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x42, + 0x22, 0x22, 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc9, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x4, 0x66, 0x66, + 0x66, 0x66, 0x30, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x31, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xea, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0xff, 0xff, 0xf7, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x82, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xbf, 0xf4, 0x0, + 0x0, 0xcf, 0xf3, 0x0, 0x0, 0xdf, 0xf2, 0x0, + 0x2, 0xff, 0xd0, 0x0, 0x3, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x0, 0xaf, 0xf0, 0x0, 0x0, 0xbf, 0xe0, 0x0, + 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x0, 0xaf, 0xf0, 0x0, 0x0, 0xbf, 0xe0, 0x0, + 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x0, 0xaf, 0xf0, 0x0, 0x0, 0xbf, 0xe0, 0x0, + 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xbf, 0xf5, 0x0, + 0x0, 0xcf, 0xf3, 0x0, 0x1, 0xdf, 0xf2, 0x0, + 0x2, 0xff, 0xd1, 0x0, 0x3, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xaa, 0xaa, 0xff, + 0xfd, 0xaa, 0xab, 0xff, 0xfc, 0xaa, 0xac, 0xff, + 0xfb, 0xaa, 0xac, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xaf, + 0xf2, 0x0, 0x0, 0xcf, 0xf0, 0x0, 0x0, 0xff, + 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x9f, + 0xf1, 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, 0xef, + 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x9f, + 0xf1, 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, 0xef, + 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x9f, + 0xf1, 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, 0xef, + 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1, 0xcf, + 0xf5, 0x0, 0x1, 0xdf, 0xf3, 0x0, 0x3, 0xff, + 0xe2, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xfd, 0x99, 0x99, 0xff, 0xfc, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x9b, 0xff, 0xfa, 0x99, 0x9c, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x9f, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xfa, 0x44, 0x44, 0xdf, 0xf8, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x46, 0xff, 0xe5, 0x44, 0x47, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xaa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xde, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "ï…›" */ + 0x7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x30, 0x8, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xff, 0x50, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xff, 0xff, 0x50, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xff, 0xff, 0xff, 0x50, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x22, + 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x59, 0xbe, + 0xff, 0xff, 0xff, 0xff, 0xec, 0xa7, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xa8, + 0x87, 0x77, 0x89, 0xbd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x96, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x6c, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xf4, 0x1d, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xf7, 0x0, 0x1d, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, + 0x9b, 0xde, 0xff, 0xfe, 0xca, 0x73, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xf7, 0x0, + 0x0, 0x1d, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xca, 0x99, 0x9b, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x24, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x9c, 0xdb, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x58, 0x97, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F240 "" */ + 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xff, 0x74, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x4a, 0xff, 0xff, 0xea, 0x40, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x48, + 0x8f, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xef, 0xff, 0xf5, 0xff, 0xff, + 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xef, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x1, 0x33, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, + 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, 0x0, 0x0, + + /* U+F241 "ï‰" */ + 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xff, 0x74, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x4a, 0xff, 0xff, 0xea, 0x40, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x48, + 0x8f, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf5, 0xff, 0xff, + 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x33, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, + 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, 0x0, 0x0, + + /* U+F242 "" */ + 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xff, 0x74, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x4a, 0xff, 0xff, 0xea, 0x40, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, + 0x8f, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf5, 0xff, 0xff, + 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x33, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, + 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, 0x0, 0x0, + + /* U+F243 "" */ + 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xff, 0x74, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x4a, 0xff, 0xff, 0xea, 0x40, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0x40, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xf4, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, + 0x8f, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf5, 0xff, 0xff, + 0xf4, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0x40, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0x40, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x33, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xf4, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, + 0x0, 0x88, 0x88, 0x88, 0x88, 0x88, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, 0x0, 0x0, + + /* U+F244 "" */ + 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xff, 0x74, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x4a, 0xff, 0xff, 0xea, 0x40, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, + 0x8f, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf5, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x33, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xcb, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0xde, 0xee, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xd3, 0x11, 0x3f, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf8, 0x0, + 0x0, 0x0, 0x4c, 0xed, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x47, 0x63, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xfd, + 0x30, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x9f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xb2, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf8, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x11, 0x4e, 0xff, 0xb2, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x24, 0xff, 0xff, 0xfd, 0x40, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xdd, 0xdd, 0xdd, 0xdf, 0xff, 0xfe, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdf, 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xfa, 0x10, 0x1, + 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd3, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xfe, 0x60, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, + 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x20, + 0x0, 0x6, 0xaa, 0xaa, 0xaa, 0xa7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfb, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, + 0xbb, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x2d, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x69, 0xbc, + 0xdd, 0xba, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x10, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0x90, 0x8, 0x50, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0x20, 0x5, 0xff, + 0xff, 0xff, 0x90, 0x9f, 0xff, 0xf9, 0x0, 0x8f, + 0x50, 0x0, 0xdf, 0xff, 0xff, 0xf5, 0x0, 0x8f, + 0xff, 0xff, 0xa0, 0x0, 0x8f, 0xff, 0x90, 0x8, + 0xff, 0x50, 0x1, 0xdf, 0xff, 0xff, 0x80, 0xa, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x8f, 0xf9, 0x0, + 0x8f, 0xfa, 0x0, 0xa, 0xff, 0xff, 0xfb, 0x0, + 0xdf, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x8f, 0x90, + 0x8, 0xfa, 0x0, 0x8, 0xff, 0xff, 0xff, 0xd0, + 0xe, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x89, + 0x0, 0x8a, 0x0, 0x7, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x30, 0x3, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x11, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x40, 0x4, 0x0, 0x1, + 0xef, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0xa9, 0x0, 0x8c, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xfe, 0x0, 0xcf, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0xaf, 0xa0, 0x8, 0xfc, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xc0, 0xa, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0xaf, 0xfa, 0x0, 0x8f, + 0xfa, 0x0, 0x4, 0xff, 0xff, 0xfb, 0x0, 0x7f, + 0xff, 0xff, 0xc0, 0x0, 0xaf, 0xff, 0xa0, 0x8, + 0xfe, 0x30, 0x0, 0xcf, 0xff, 0xff, 0x80, 0x4, + 0xff, 0xff, 0xff, 0xc1, 0xbf, 0xff, 0xfa, 0x0, + 0x8e, 0x30, 0x0, 0xcf, 0xff, 0xff, 0xf5, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x8, 0x30, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x20, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xfc, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x8b, 0xef, 0xff, 0xff, 0xfe, 0xb7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x21, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "ï‹­" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xcc, + 0xcc, 0xcc, 0xcc, 0xca, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, + 0x22, 0x22, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x22, 0x22, 0x22, 0x22, 0x21, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x1, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf8, 0x8, 0xff, 0xff, + 0xf6, 0xa, 0xff, 0xff, 0xf4, 0x1b, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, + 0x3f, 0xff, 0xff, 0x10, 0x5f, 0xff, 0xff, 0x0, + 0x7f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xf3, 0x3, 0xff, 0xff, 0xf1, 0x5, 0xff, + 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x6, 0xff, 0xff, 0xff, 0x30, 0x3f, 0xff, 0xff, + 0x10, 0x5f, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x3, + 0xff, 0xff, 0xf1, 0x5, 0xff, 0xff, 0xf0, 0x7, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, + 0xff, 0x30, 0x3f, 0xff, 0xff, 0x10, 0x5f, 0xff, + 0xff, 0x0, 0x7f, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xf3, 0x3, 0xff, 0xff, 0xf1, + 0x5, 0xff, 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x3f, + 0xff, 0xff, 0x10, 0x5f, 0xff, 0xff, 0x0, 0x7f, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xf3, 0x3, 0xff, 0xff, 0xf1, 0x5, 0xff, 0xff, + 0xf0, 0x7, 0xff, 0xff, 0xff, 0x20, 0x0, 0x6, + 0xff, 0xff, 0xff, 0x30, 0x3f, 0xff, 0xff, 0x10, + 0x5f, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x3, 0xff, + 0xff, 0xf1, 0x5, 0xff, 0xff, 0xf0, 0x7, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, 0xff, + 0x30, 0x3f, 0xff, 0xff, 0x10, 0x5f, 0xff, 0xff, + 0x0, 0x7f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xf3, 0x3, 0xff, 0xff, 0xf1, 0x5, + 0xff, 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x3f, 0xff, + 0xff, 0x10, 0x5f, 0xff, 0xff, 0x0, 0x7f, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, + 0x3, 0xff, 0xff, 0xf1, 0x5, 0xff, 0xff, 0xf0, + 0x7, 0xff, 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, + 0xff, 0xff, 0x30, 0x3f, 0xff, 0xff, 0x10, 0x5f, + 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x3, 0xff, 0xff, + 0xf1, 0x5, 0xff, 0xff, 0xf0, 0x7, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, + 0x3f, 0xff, 0xff, 0x10, 0x5f, 0xff, 0xff, 0x0, + 0x7f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xf3, 0x3, 0xff, 0xff, 0xf1, 0x5, 0xff, + 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x6, 0xff, 0xff, 0xff, 0x30, 0x3f, 0xff, 0xff, + 0x10, 0x5f, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf8, 0x8, + 0xff, 0xff, 0xf6, 0xa, 0xff, 0xff, 0xf4, 0x1b, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x34, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6a, 0xb7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf8, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf8, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xf8, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x1d, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x1d, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x1d, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xfe, 0xca, 0x86, 0x42, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x8, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x8, 0xf8, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x5, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x2c, 0x20, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x2e, 0xfe, 0x20, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x2e, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2e, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x2e, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x8e, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x80, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x1d, 0xff, 0xf6, 0x44, 0x4f, 0xfc, + 0x44, 0x45, 0xff, 0xa4, 0x44, 0xff, 0xff, 0xf5, + 0x0, 0x1, 0xdf, 0xff, 0xf3, 0x0, 0xe, 0xfb, + 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, + 0x0, 0x1d, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, + 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, + 0x1, 0xdf, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, + 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, + 0x1d, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, + 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, + 0xdf, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, + 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, + 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, + 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdd, 0xdf, 0xff, + 0xdd, 0xdd, 0xff, 0xed, 0xdd, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x1, 0xac, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0x10, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf1, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x10, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xba, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xcf, 0xff, 0xff, 0xf1, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 181, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 180, .box_w = 7, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 105, .adv_w = 263, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 18}, + {.bitmap_index = 177, .adv_w = 472, .box_w = 28, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 597, .adv_w = 417, .box_w = 24, .box_h = 41, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 1089, .adv_w = 566, .box_w = 33, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1584, .adv_w = 461, .box_w = 28, .box_h = 31, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 2018, .adv_w = 141, .box_w = 5, .box_h = 12, .ofs_x = 2, .ofs_y = 18}, + {.bitmap_index = 2048, .adv_w = 226, .box_w = 10, .box_h = 40, .ofs_x = 3, .ofs_y = -8}, + {.bitmap_index = 2248, .adv_w = 227, .box_w = 10, .box_h = 40, .ofs_x = 1, .ofs_y = -8}, + {.bitmap_index = 2448, .adv_w = 269, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = 15}, + {.bitmap_index = 2584, .adv_w = 391, .box_w = 20, .box_h = 19, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 2774, .adv_w = 153, .box_w = 6, .box_h = 12, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 2810, .adv_w = 257, .box_w = 12, .box_h = 4, .ofs_x = 2, .ofs_y = 10}, + {.bitmap_index = 2834, .adv_w = 153, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2855, .adv_w = 237, .box_w = 19, .box_h = 41, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 3245, .adv_w = 448, .box_w = 24, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3605, .adv_w = 249, .box_w = 12, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3785, .adv_w = 386, .box_w = 23, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4130, .adv_w = 384, .box_w = 23, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4475, .adv_w = 450, .box_w = 27, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4880, .adv_w = 386, .box_w = 23, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5225, .adv_w = 415, .box_w = 23, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5570, .adv_w = 402, .box_w = 23, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5915, .adv_w = 433, .box_w = 25, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6290, .adv_w = 415, .box_w = 23, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6635, .adv_w = 153, .box_w = 7, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6716, .adv_w = 153, .box_w = 7, .box_h = 29, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 6818, .adv_w = 391, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 7018, .adv_w = 391, .box_w = 20, .box_h = 14, .ofs_x = 2, .ofs_y = 8}, + {.bitmap_index = 7158, .adv_w = 391, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 7358, .adv_w = 385, .box_w = 22, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7688, .adv_w = 695, .box_w = 40, .box_h = 38, .ofs_x = 2, .ofs_y = -8}, + {.bitmap_index = 8448, .adv_w = 492, .box_w = 32, .box_h = 30, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8928, .adv_w = 509, .box_w = 26, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 9318, .adv_w = 486, .box_w = 27, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9723, .adv_w = 555, .box_w = 29, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10158, .adv_w = 450, .box_w = 22, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10488, .adv_w = 427, .box_w = 22, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10818, .adv_w = 519, .box_w = 28, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11238, .adv_w = 546, .box_w = 26, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11628, .adv_w = 208, .box_w = 5, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11703, .adv_w = 345, .box_w = 19, .box_h = 30, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 11988, .adv_w = 483, .box_w = 27, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12393, .adv_w = 399, .box_w = 21, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12708, .adv_w = 642, .box_w = 32, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 13188, .adv_w = 546, .box_w = 26, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 13578, .adv_w = 564, .box_w = 32, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14058, .adv_w = 485, .box_w = 25, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 14433, .adv_w = 564, .box_w = 33, .box_h = 36, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 15027, .adv_w = 489, .box_w = 25, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 15402, .adv_w = 417, .box_w = 24, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 15762, .adv_w = 394, .box_w = 25, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16137, .adv_w = 532, .box_w = 26, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 16527, .adv_w = 478, .box_w = 31, .box_h = 30, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 16992, .adv_w = 757, .box_w = 45, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 17667, .adv_w = 452, .box_w = 28, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 18087, .adv_w = 435, .box_w = 29, .box_h = 30, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 18522, .adv_w = 442, .box_w = 26, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 18912, .adv_w = 224, .box_w = 10, .box_h = 40, .ofs_x = 4, .ofs_y = -8}, + {.bitmap_index = 19112, .adv_w = 237, .box_w = 18, .box_h = 41, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 19481, .adv_w = 224, .box_w = 10, .box_h = 40, .ofs_x = 0, .ofs_y = -8}, + {.bitmap_index = 19681, .adv_w = 392, .box_w = 19, .box_h = 18, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 19852, .adv_w = 336, .box_w = 21, .box_h = 3, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 19884, .adv_w = 403, .box_w = 12, .box_h = 6, .ofs_x = 4, .ofs_y = 26}, + {.bitmap_index = 19920, .adv_w = 402, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 20150, .adv_w = 458, .box_w = 24, .box_h = 32, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 20534, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 20787, .adv_w = 458, .box_w = 24, .box_h = 32, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 21171, .adv_w = 411, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 21436, .adv_w = 237, .box_w = 17, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21708, .adv_w = 464, .box_w = 25, .box_h = 31, .ofs_x = 1, .ofs_y = -8}, + {.bitmap_index = 22096, .adv_w = 458, .box_w = 22, .box_h = 32, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 22448, .adv_w = 187, .box_w = 6, .box_h = 33, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 22547, .adv_w = 191, .box_w = 13, .box_h = 41, .ofs_x = -4, .ofs_y = -8}, + {.bitmap_index = 22814, .adv_w = 414, .box_w = 23, .box_h = 32, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 23182, .adv_w = 187, .box_w = 5, .box_h = 32, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 23262, .adv_w = 710, .box_w = 38, .box_h = 23, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 23699, .adv_w = 458, .box_w = 22, .box_h = 23, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 23952, .adv_w = 427, .box_w = 24, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 24228, .adv_w = 458, .box_w = 24, .box_h = 31, .ofs_x = 3, .ofs_y = -8}, + {.bitmap_index = 24600, .adv_w = 458, .box_w = 24, .box_h = 31, .ofs_x = 1, .ofs_y = -8}, + {.bitmap_index = 24972, .adv_w = 276, .box_w = 13, .box_h = 23, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 25122, .adv_w = 337, .box_w = 19, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 25341, .adv_w = 278, .box_w = 17, .box_h = 28, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 25579, .adv_w = 455, .box_w = 22, .box_h = 23, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 25832, .adv_w = 376, .box_w = 25, .box_h = 23, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26120, .adv_w = 604, .box_w = 38, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 26557, .adv_w = 371, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 26822, .adv_w = 376, .box_w = 25, .box_h = 31, .ofs_x = -1, .ofs_y = -8}, + {.bitmap_index = 27210, .adv_w = 350, .box_w = 20, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 27440, .adv_w = 236, .box_w = 12, .box_h = 40, .ofs_x = 2, .ofs_y = -8}, + {.bitmap_index = 27680, .adv_w = 201, .box_w = 5, .box_h = 40, .ofs_x = 4, .ofs_y = -8}, + {.bitmap_index = 27780, .adv_w = 236, .box_w = 13, .box_h = 40, .ofs_x = 0, .ofs_y = -8}, + {.bitmap_index = 28040, .adv_w = 391, .box_w = 21, .box_h = 8, .ofs_x = 2, .ofs_y = 11}, + {.bitmap_index = 28124, .adv_w = 282, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = 16}, + {.bitmap_index = 28229, .adv_w = 211, .box_w = 9, .box_h = 8, .ofs_x = 2, .ofs_y = 8}, + {.bitmap_index = 28265, .adv_w = 672, .box_w = 43, .box_h = 44, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 29211, .adv_w = 672, .box_w = 42, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 29883, .adv_w = 672, .box_w = 42, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 30681, .adv_w = 672, .box_w = 42, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 31353, .adv_w = 462, .box_w = 29, .box_h = 30, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 31788, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 32670, .adv_w = 672, .box_w = 40, .box_h = 43, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 33530, .adv_w = 756, .box_w = 48, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 34442, .adv_w = 672, .box_w = 42, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 35345, .adv_w = 756, .box_w = 48, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 36113, .adv_w = 672, .box_w = 42, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 37016, .adv_w = 336, .box_w = 21, .box_h = 33, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37363, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37891, .adv_w = 756, .box_w = 48, .box_h = 41, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 38875, .adv_w = 672, .box_w = 42, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 39547, .adv_w = 462, .box_w = 29, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 40171, .adv_w = 588, .box_w = 27, .box_h = 39, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 40698, .adv_w = 588, .box_w = 37, .box_h = 44, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 41512, .adv_w = 588, .box_w = 37, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 42215, .adv_w = 588, .box_w = 37, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 42918, .adv_w = 588, .box_w = 27, .box_h = 39, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 43445, .adv_w = 588, .box_w = 39, .box_h = 38, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 44186, .adv_w = 420, .box_w = 23, .box_h = 37, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 44612, .adv_w = 420, .box_w = 23, .box_h = 37, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 45038, .adv_w = 588, .box_w = 37, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 45741, .adv_w = 588, .box_w = 37, .box_h = 9, .ofs_x = 0, .ofs_y = 11}, + {.bitmap_index = 45908, .adv_w = 756, .box_w = 48, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 46676, .adv_w = 840, .box_w = 53, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 47816, .adv_w = 756, .box_w = 49, .box_h = 43, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 48870, .adv_w = 672, .box_w = 42, .box_h = 39, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 49689, .adv_w = 588, .box_w = 37, .box_h = 23, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 50115, .adv_w = 588, .box_w = 37, .box_h = 23, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 50541, .adv_w = 840, .box_w = 53, .box_h = 33, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 51416, .adv_w = 672, .box_w = 42, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 52088, .adv_w = 672, .box_w = 42, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 52991, .adv_w = 672, .box_w = 43, .box_h = 44, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 53937, .adv_w = 588, .box_w = 38, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 54659, .adv_w = 588, .box_w = 37, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 55455, .adv_w = 588, .box_w = 37, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 56158, .adv_w = 588, .box_w = 37, .box_h = 33, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 56769, .adv_w = 672, .box_w = 42, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 57441, .adv_w = 420, .box_w = 28, .box_h = 43, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 58043, .adv_w = 588, .box_w = 37, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 58839, .adv_w = 588, .box_w = 37, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 59635, .adv_w = 756, .box_w = 48, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 60403, .adv_w = 672, .box_w = 44, .box_h = 44, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 61371, .adv_w = 504, .box_w = 32, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 62059, .adv_w = 840, .box_w = 53, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 63093, .adv_w = 840, .box_w = 53, .box_h = 27, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 63809, .adv_w = 840, .box_w = 53, .box_h = 27, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 64525, .adv_w = 840, .box_w = 53, .box_h = 27, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 65241, .adv_w = 840, .box_w = 53, .box_h = 27, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 65957, .adv_w = 840, .box_w = 53, .box_h = 27, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 66673, .adv_w = 840, .box_w = 53, .box_h = 33, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 67548, .adv_w = 588, .box_w = 33, .box_h = 43, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 68258, .adv_w = 588, .box_w = 37, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 69054, .adv_w = 672, .box_w = 43, .box_h = 43, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 69979, .adv_w = 840, .box_w = 53, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 70827, .adv_w = 504, .box_w = 32, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 71515, .adv_w = 676, .box_w = 43, .box_h = 28, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 7, 0, 0, 0, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 30, 0, 18, -15, 0, 0, + 0, 0, -37, -40, 5, 32, 15, 11, + -27, 5, 33, 2, 28, 7, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 40, 5, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 0, -20, 0, 0, 0, 0, + 0, -13, 11, 13, 0, 0, -7, 0, + -5, 7, 0, -7, 0, -7, -3, -13, + 0, 0, 0, 0, -7, 0, 0, -9, + -10, 0, 0, -7, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + -7, 0, -10, 0, -18, 0, -81, 0, + 0, -13, 0, 13, 20, 1, 0, -13, + 7, 7, 22, 13, -11, 13, 0, 0, + -38, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -18, -8, -33, 0, -27, + -5, 0, 0, 0, 0, 1, 26, 0, + -20, -5, -2, 2, 0, -11, 0, 0, + -5, -50, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -54, -5, 26, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -28, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, + 0, 7, 0, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 26, 5, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -25, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, + 13, 7, 20, -7, 0, 0, 13, -7, + -22, -92, 5, 18, 13, 1, -9, 0, + 24, 0, 22, 0, 22, 0, -62, 0, + -8, 20, 0, 22, -7, 13, 7, 0, + 0, 2, -7, 0, 0, -11, 54, 0, + 54, 0, 20, 0, 28, 9, 11, 20, + 0, 0, 0, -25, 0, 0, 0, 0, + 2, -5, 0, 5, -12, -9, -13, 5, + 0, -7, 0, 0, 0, -27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -44, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -37, 0, -42, 0, 0, 0, + 0, -5, 0, 67, -8, -9, 7, 7, + -6, 0, -9, 7, 0, 0, -36, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -65, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -42, 0, 40, 0, 0, -25, 0, + 22, 0, -46, -65, -46, -13, 20, 0, + 0, -45, 0, 8, -15, 0, -10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 17, 20, -82, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 0, 5, 0, 0, 0, + 0, 0, 5, 5, -8, -13, 0, -2, + -2, -7, 0, 0, -5, 0, 0, 0, + -13, 0, -5, 0, -15, -13, 0, -17, + -22, -22, -13, 0, -13, 0, -13, 0, + 0, 0, 0, -5, 0, 0, 7, 0, + 5, -7, 0, 2, 0, 0, 0, 7, + -5, 0, 0, 0, -5, 7, 7, -2, + 0, 0, 0, -13, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 9, -5, 0, + -8, 0, -11, 0, 0, -5, 0, 20, + 0, 0, -7, 0, 0, 0, 0, 0, + -2, 2, -5, -5, 0, 0, -7, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, 0, -7, -8, 0, + 0, 0, 0, 0, 2, 0, 0, -5, + 0, -7, -7, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, -5, -9, 0, -10, 0, -20, + -5, -20, 13, 0, 0, -13, 7, 13, + 18, 0, -17, -2, -8, 0, -2, -32, + 7, -5, 5, -36, 7, 0, 0, 2, + -35, 0, -36, -5, -58, -5, 0, -34, + 0, 13, 19, 0, 9, 0, 0, 0, + 0, 1, 0, -12, -9, 0, -20, 0, + 0, 0, -7, 0, 0, 0, -7, 0, + 0, 0, 0, 0, -3, -3, 0, -3, + -9, 0, 0, 0, 0, 0, 0, 0, + -7, -7, 0, -5, -8, -5, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, -8, + 0, -5, 0, -13, 7, 0, 0, -8, + 3, 7, 7, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 5, + 0, 0, -7, 0, -7, -5, -8, 0, + 0, 0, 0, 0, 0, 0, 5, 0, + -5, 0, 0, 0, 0, -7, -10, 0, + -13, 0, 20, -5, 2, -22, 0, 0, + 18, -34, -35, -28, -13, 7, 0, -5, + -44, -12, 0, -12, 0, -13, 10, -12, + -43, 0, -18, 0, 0, 3, -2, 5, + -5, 0, 7, 1, -20, -26, 0, -34, + -16, -14, -16, -20, -8, -18, -1, -13, + -18, 4, 0, 2, 0, -7, 0, 0, + 0, 5, 0, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + 0, -3, 0, -2, -7, 0, -11, -15, + -15, -2, 0, -20, 0, 0, 0, 0, + 0, 0, -5, 0, 0, 0, 0, 3, + -4, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 32, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + -13, 0, 0, 0, 0, -34, -20, 0, + 0, 0, -10, -34, 0, 0, -7, 7, + 0, -18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, -13, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, -12, 0, + 0, 0, 0, 8, 0, 5, -13, -13, + 0, -7, -7, -8, 0, 0, 0, 0, + 0, 0, -20, 0, -7, 0, -10, -7, + 0, -15, -17, -20, -5, 0, -13, 0, + -20, 0, 0, 0, 0, 54, 0, 0, + 3, 0, 0, -9, 0, 7, 0, -29, + 0, 0, 0, 0, 0, -62, -12, 22, + 20, -5, -28, 0, 7, -10, 0, -34, + -3, -9, 7, -47, -7, 9, 0, 10, + -24, -10, -25, -22, -28, 0, 0, -40, + 0, 38, 0, 0, -3, 0, 0, 0, + -3, -3, -7, -18, -22, -1, -62, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -7, 0, -3, -7, -10, 0, 0, + -13, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -13, 0, 0, 13, + -2, 9, 0, -15, 7, -5, -2, -17, + -7, 0, -9, -7, -5, 0, -10, -11, + 0, 0, -5, -2, -5, -11, -8, 0, + 0, -7, 0, 7, -5, 0, -15, 0, + 0, 0, -13, 0, -11, 0, -11, -11, + 7, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 7, 0, -9, 0, -5, -8, + -21, -5, -5, -5, -2, -5, -8, -2, + 0, 0, 0, 0, 0, -7, -5, -5, + 0, 0, 0, 0, 8, -5, 0, -5, + 0, 0, 0, -5, -8, -5, -6, -8, + -6, 0, 5, 27, -2, 0, -18, 0, + -5, 13, 0, -7, -28, -9, 10, 1, + 0, -32, -11, 7, -11, 5, 0, -5, + -5, -22, 0, -10, 3, 0, 0, -11, + 0, 0, 0, 7, 7, -13, -13, 0, + -11, -7, -10, -7, -7, 0, -11, 3, + -13, -11, 20, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, -9, + 0, 0, -7, -7, 0, 0, 0, 0, + -7, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, -5, 0, 0, 0, 0, + -10, 0, -13, 0, 0, 0, -22, 0, + 5, -15, 13, 1, -5, -32, 0, 0, + -15, -7, 0, -27, -17, -19, 0, 0, + -29, -7, -27, -26, -32, 0, -17, 0, + 5, 45, -9, 0, -15, -7, -2, -7, + -11, -18, -12, -25, -28, -15, -7, 0, + 0, -5, 0, 2, 0, 0, -47, -6, + 20, 15, -15, -25, 0, 2, -21, 0, + -34, -5, -7, 13, -62, -9, 2, 0, + 0, -44, -8, -35, -7, -49, 0, 0, + -47, 0, 40, 2, 0, -5, 0, 0, + 0, 0, -3, -5, -26, -5, 0, -44, + 0, 0, 0, 0, -22, 0, -6, 0, + -2, -19, -32, 0, 0, -3, -10, -20, + -7, 0, -5, 0, 0, 0, 0, -30, + -7, -22, -22, -5, -11, -17, -7, -11, + 0, -13, -6, -22, -10, 0, -8, -13, + -7, -13, 0, 3, 0, -5, -22, 0, + 13, 0, -12, 0, 0, 0, 0, 8, + 0, 5, -13, 28, 0, -7, -7, -8, + 0, 0, 0, 0, 0, 0, -20, 0, + -7, 0, -10, -7, 0, -15, -17, -20, + -5, 0, -13, 5, 27, 0, 0, 0, + 0, 54, 0, 0, 3, 0, 0, -9, + 0, 7, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -5, -13, 0, 0, 0, 0, 0, -3, + 0, 0, 0, -7, -7, 0, 0, -13, + -7, 0, 0, -13, 0, 11, -3, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 10, 13, 5, -6, 0, -22, + -11, 0, 20, -22, -22, -13, -13, 27, + 12, 7, -58, -5, 13, -7, 0, -7, + 7, -7, -24, 0, -7, 7, -9, -5, + -20, -5, 0, 0, 20, 13, 0, -19, + 0, -37, -9, 19, -9, -26, 2, -9, + -22, -22, -7, 27, 7, 0, -10, 0, + -18, 0, 5, 22, -15, -25, -27, -17, + 20, 0, 2, -49, -5, 7, -11, -5, + -15, 0, -15, -25, -10, -10, -5, 0, + 0, -15, -14, -7, 0, 20, 15, -7, + -37, 0, -37, -9, 0, -24, -39, -2, + -22, -11, -22, -19, 18, 0, 0, -9, + 0, -13, -6, 0, -7, -12, 0, 11, + -22, 7, 0, 0, -36, 0, -7, -15, + -11, -5, -20, -17, -22, -15, 0, -20, + -7, -15, -13, -20, -7, 0, 0, 2, + 32, -11, 0, -20, -7, 0, -7, -13, + -15, -18, -19, -26, -9, -13, 13, 0, + -10, 0, -34, -8, 4, 13, -22, -25, + -13, -22, 22, -7, 3, -62, -12, 13, + -15, -11, -25, 0, -20, -28, -8, -7, + -5, -7, -14, -20, -2, 0, 0, 20, + 19, -5, -44, 0, -40, -15, 16, -26, + -46, -13, -24, -28, -34, -22, 13, 0, + 0, 0, 0, -8, 0, 0, 7, -8, + 13, 5, -13, 13, 0, 0, -21, -2, + 0, -2, 0, 2, 2, -5, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 5, 20, 1, 0, -8, 0, 0, + 0, 0, -5, -5, -8, 0, 0, 0, + 2, 5, 0, 0, 0, 0, 5, 0, + -5, 0, 26, 0, 12, 2, 2, -9, + 0, 13, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 20, 0, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -40, 0, -7, 11, 0, 20, + 0, 0, 67, 8, -13, -13, 7, 7, + -5, 2, -34, 0, 0, 32, -40, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -46, 26, 94, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -40, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, -13, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, -18, 0, + 0, 2, 0, 0, 7, 87, -13, -5, + 22, 18, -18, 7, 0, 0, 7, 7, + -9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -87, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -19, + 0, 0, 0, -18, 0, 0, 0, 0, + -15, -3, 0, 0, 0, -15, 0, -8, + 0, -32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -45, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -7, 0, 0, -13, 0, -10, 0, + -18, 0, 0, 0, -11, 7, -8, 0, + 0, -18, -7, -15, 0, 0, -18, 0, + -7, 0, -32, 0, -7, 0, 0, -54, + -13, -27, -7, -24, 0, 0, -45, 0, + -18, -3, 0, 0, 0, 0, 0, 0, + 0, 0, -10, -12, -5, -11, 0, 0, + 0, 0, -15, 0, -15, 9, -7, 13, + 0, -5, -15, -5, -11, -13, 0, -8, + -3, -5, 5, -18, -2, 0, 0, 0, + -59, -5, -9, 0, -15, 0, -5, -32, + -6, 0, 0, -5, -5, 0, 0, 0, + 0, 5, 0, -5, -11, -5, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, 0, + 0, -15, 0, -5, 0, 0, 0, -13, + 7, 0, 0, 0, -18, -7, -13, 0, + 0, -19, 0, -7, 0, -32, 0, 0, + 0, 0, -65, 0, -13, -25, -34, 0, + 0, -45, 0, -5, -10, 0, 0, 0, + 0, 0, 0, 0, 0, -7, -10, -3, + -10, 2, 0, 0, 11, -9, 0, 21, + 33, -7, -7, -20, 8, 33, 11, 15, + -18, 8, 28, 8, 19, 15, 18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 42, 32, -12, -7, 0, -5, + 54, 29, 54, 0, 0, 0, 7, 0, + 0, 25, 0, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 9, + 0, 0, 0, 0, -56, -8, -5, -28, + -33, 0, 0, -45, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, -56, -8, -5, + -28, -33, 0, 0, -27, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, -15, 7, 0, -7, + 5, 12, 7, -20, 0, -1, -5, 7, + 0, 5, 0, 0, 0, 0, -17, 0, + -6, -5, -13, 0, -6, -27, 0, 42, + -7, 0, -15, -5, 0, -5, -11, 0, + -7, -19, -13, -8, 0, 0, 0, -11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, -56, + -8, -5, -28, -33, 0, 0, -45, 0, + 0, 0, 0, 0, 0, 34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -11, 0, -22, -8, -6, 20, -6, -7, + -27, 2, -4, 2, -5, -18, 1, 15, + 1, 5, 2, 5, -16, -27, -8, 0, + -26, -13, -18, -28, -26, 0, -11, -13, + -8, -9, -5, -5, -8, -5, 0, -5, + -2, 10, 0, 10, -5, 0, 21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, -7, -7, 0, 0, + -18, 0, -3, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -40, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, -7, 0, -9, + 0, 0, 0, 0, -5, 0, 0, -11, + -7, 7, 0, -11, -13, -5, 0, -19, + -5, -15, -5, -8, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -45, 0, 22, 0, 0, -12, 0, + 0, 0, 0, -9, 0, -7, 0, 0, + -3, 0, 0, -5, 0, -15, 0, 0, + 28, -9, -22, -21, 5, 7, 7, -1, + -19, 5, 10, 5, 20, 5, 22, -5, + -18, 0, 0, -27, 0, 0, -20, -18, + 0, 0, -13, 0, -9, -11, 0, -10, + 0, -10, 0, -5, 10, 0, -5, -20, + -7, 25, 0, 0, -6, 0, -13, 0, + 0, 9, -15, 0, 7, -7, 5, 1, + 0, -22, 0, -5, -2, 0, -7, 7, + -5, 0, 0, 0, -28, -8, -15, 0, + -20, 0, 0, -32, 0, 25, -7, 0, + -12, 0, 4, 0, -7, 0, -7, -20, + 0, -7, 7, 0, 0, 0, 0, -5, + 0, 0, 7, -9, 2, 0, 0, -8, + -5, 0, -8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -42, 0, 15, 0, + 0, -5, 0, 0, 0, 0, 1, 0, + -7, -7, 0, 0, 0, 13, 0, 15, + 0, 0, 0, 0, 0, -42, -38, 2, + 29, 20, 11, -27, 5, 28, 0, 25, + 0, 13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 36, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserrat_42 = { +#else +lv_font_t lv_font_montserrat_42 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 46, /*The maximum line height required by the font*/ + .base_line = 8, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -3, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_42*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_44.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_44.c new file mode 100644 index 0000000..4156909 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_44.c @@ -0,0 +1,10925 @@ +/******************************************************************************* + * Size: 44 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 44 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_44.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_44 + #define LV_FONT_MONTSERRAT_44 1 +#endif + +#if LV_FONT_MONTSERRAT_44 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x8f, 0xff, 0xf6, 0x8f, 0xff, 0xf5, 0x7f, 0xff, + 0xf4, 0x7f, 0xff, 0xf4, 0x6f, 0xff, 0xf3, 0x5f, + 0xff, 0xf3, 0x5f, 0xff, 0xf2, 0x4f, 0xff, 0xf1, + 0x4f, 0xff, 0xf1, 0x3f, 0xff, 0xf0, 0x2f, 0xff, + 0xf0, 0x2f, 0xff, 0xf0, 0x1f, 0xff, 0xe0, 0x1f, + 0xff, 0xe0, 0xf, 0xff, 0xd0, 0xf, 0xff, 0xc0, + 0xf, 0xff, 0xc0, 0xe, 0xff, 0xb0, 0xe, 0xff, + 0xa0, 0xd, 0xff, 0xa0, 0xd, 0xff, 0x90, 0x6, + 0x77, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xaa, 0x30, 0x6f, 0xff, + 0xf3, 0xdf, 0xff, 0xfa, 0xef, 0xff, 0xfa, 0x9f, + 0xff, 0xf5, 0x9, 0xee, 0x70, + + /* U+0022 "\"" */ + 0x3f, 0xff, 0x70, 0x0, 0x4f, 0xff, 0x63, 0xff, + 0xf6, 0x0, 0x3, 0xff, 0xf6, 0x2f, 0xff, 0x60, + 0x0, 0x3f, 0xff, 0x52, 0xff, 0xf6, 0x0, 0x3, + 0xff, 0xf5, 0x2f, 0xff, 0x50, 0x0, 0x2f, 0xff, + 0x51, 0xff, 0xf5, 0x0, 0x2, 0xff, 0xf4, 0x1f, + 0xff, 0x40, 0x0, 0x2f, 0xff, 0x41, 0xff, 0xf4, + 0x0, 0x1, 0xff, 0xf3, 0xf, 0xff, 0x30, 0x0, + 0x1f, 0xff, 0x30, 0xff, 0xf3, 0x0, 0x0, 0xff, + 0xf3, 0xf, 0xff, 0x30, 0x0, 0xf, 0xff, 0x20, + 0xff, 0xf2, 0x0, 0x0, 0xff, 0xf2, 0x1, 0x11, + 0x0, 0x0, 0x1, 0x11, 0x0, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf5, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x1, 0x44, 0x44, 0x47, 0xff, 0xe4, 0x44, + 0x44, 0x44, 0x4e, 0xff, 0x74, 0x44, 0x44, 0x30, + 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf8, 0x0, 0x0, 0x0, 0x3, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x5f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf4, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf5, + 0x0, 0x0, 0x0, 0x3, 0x44, 0x44, 0x47, 0xff, + 0xd4, 0x44, 0x44, 0x44, 0x4e, 0xff, 0x74, 0x44, + 0x44, 0x10, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, 0x5f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf3, 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x9f, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf9, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, + 0xdf, 0xff, 0xfe, 0xda, 0x62, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xa3, 0x8, 0xff, 0x50, 0x15, 0x9f, 0xff, + 0x70, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, 0x8f, + 0xf5, 0x0, 0x0, 0x7, 0xe1, 0x0, 0x2, 0xff, + 0xff, 0x60, 0x0, 0x8, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, 0x0, 0x0, + 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfe, 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x70, 0x0, 0x8, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x70, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xe7, 0x28, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x54, 0xaf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, + 0x0, 0x1a, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, 0x8, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf5, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, 0x0, + 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf5, 0x0, 0x0, 0xe, 0xff, 0xf6, 0x0, + 0xd6, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, + 0x4, 0xff, 0xff, 0x30, 0x6f, 0xfb, 0x30, 0x0, + 0x0, 0x8f, 0xf5, 0x0, 0x2, 0xef, 0xff, 0xe0, + 0xd, 0xff, 0xff, 0xc7, 0x20, 0x8, 0xff, 0x50, + 0x28, 0xff, 0xff, 0xf5, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xfe, 0xef, 0xfd, 0xef, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x18, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, 0xbe, 0xff, + 0xff, 0xfe, 0xc8, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x0, 0x3a, 0xdf, 0xec, 0x71, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xc9, 0x9e, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, + 0x0, 0x8, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0x50, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x50, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xc0, 0x0, 0x0, 0x1, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xe, 0xfe, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xe0, 0x0, 0x0, 0x6f, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x90, + 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x1f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xfd, 0x0, 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, + 0xb, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf5, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x0, 0x6, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x8f, + 0xfd, 0x0, 0x2, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x9a, + 0xef, 0xff, 0x30, 0x0, 0xcf, 0xf9, 0x0, 0x0, + 0x57, 0x87, 0x20, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x7f, 0xfd, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x3, 0xae, 0xff, 0xc8, 0x10, 0x0, 0x2f, 0xff, + 0x30, 0x8, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x80, 0x5, 0xff, 0xf7, 0x10, 0x3b, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xd0, 0x0, 0xdf, 0xf4, 0x0, 0x0, + 0xb, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x4f, 0xfa, 0x0, + 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x8, 0xff, + 0x50, 0x0, 0x0, 0x0, 0xbf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, + 0xbf, 0xf1, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x20, + 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x70, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xc0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xaf, 0xf3, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf7, 0x0, 0x0, 0x0, 0x6, + 0xff, 0x70, 0x0, 0x0, 0x0, 0xef, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x6f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x4f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x1e, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0xa9, + 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6c, 0xef, 0xe9, 0x30, 0x0, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xeb, + 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xfb, 0x52, 0x35, 0xbf, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xa0, + 0x0, 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x1, + 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x67, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xfc, 0x3b, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x4, 0x83, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf6, 0x0, 0xb, 0xff, 0xff, 0x70, + 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x8f, 0xff, + 0xe3, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0x0, + 0xe, 0xff, 0xc0, 0x0, 0x2f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0x4, 0xff, + 0xf8, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x90, 0xbf, 0xff, 0x20, + 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xaf, 0xff, 0xc0, 0x0, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x9f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x2, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, + 0x1, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xeb, 0x9a, 0xbd, 0xff, + 0xff, 0xff, 0x66, 0xff, 0xff, 0xb0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x40, 0x7, 0xff, 0xff, 0x40, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, + 0x7, 0xff, 0x80, 0x0, 0x0, 0x0, 0x15, 0xac, + 0xef, 0xfd, 0xc8, 0x40, 0x0, 0x0, 0x0, 0x7, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x3f, 0xff, 0x73, 0xff, 0xf6, 0x2f, 0xff, 0x62, + 0xff, 0xf6, 0x2f, 0xff, 0x51, 0xff, 0xf5, 0x1f, + 0xff, 0x41, 0xff, 0xf4, 0xf, 0xff, 0x30, 0xff, + 0xf3, 0xf, 0xff, 0x30, 0xff, 0xf2, 0x1, 0x11, + 0x0, + + /* U+0028 "(" */ + 0x0, 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x6f, + 0xff, 0xa0, 0x0, 0x0, 0xef, 0xff, 0x20, 0x0, + 0x6, 0xff, 0xfb, 0x0, 0x0, 0xd, 0xff, 0xf4, + 0x0, 0x0, 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, + 0x2, 0xff, 0xfe, 0x0, 0x0, 0x7, 0xff, 0xfa, + 0x0, 0x0, 0xa, 0xff, 0xf6, 0x0, 0x0, 0xe, + 0xff, 0xf3, 0x0, 0x0, 0x1f, 0xff, 0xf0, 0x0, + 0x0, 0x3f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, + 0xb0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0x0, 0x0, + 0x9f, 0xff, 0x80, 0x0, 0x0, 0xbf, 0xff, 0x60, + 0x0, 0x0, 0xbf, 0xff, 0x60, 0x0, 0x0, 0xcf, + 0xff, 0x50, 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, + 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0xcf, 0xff, + 0x50, 0x0, 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, + 0xbf, 0xff, 0x60, 0x0, 0x0, 0x9f, 0xff, 0x80, + 0x0, 0x0, 0x8f, 0xff, 0x90, 0x0, 0x0, 0x6f, + 0xff, 0xb0, 0x0, 0x0, 0x3f, 0xff, 0xd0, 0x0, + 0x0, 0x1f, 0xff, 0xf0, 0x0, 0x0, 0xe, 0xff, + 0xf3, 0x0, 0x0, 0xa, 0xff, 0xf6, 0x0, 0x0, + 0x7, 0xff, 0xfa, 0x0, 0x0, 0x2, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, + 0x9f, 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, 0xe0, + 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, 0x0, 0x6, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0xef, 0xff, 0x20, + 0x0, 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0xd, + 0xff, 0xf2, + + /* U+0029 ")" */ + 0x5f, 0xff, 0xb0, 0x0, 0x0, 0xd, 0xff, 0xf4, + 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x40, 0x0, 0x0, 0x7f, 0xff, 0xb0, + 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0xb, + 0xff, 0xf7, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, 0xcf, + 0xff, 0x50, 0x0, 0x0, 0x9f, 0xff, 0x80, 0x0, + 0x0, 0x5f, 0xff, 0xc0, 0x0, 0x0, 0x2f, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, + 0xd, 0xff, 0xf4, 0x0, 0x0, 0xb, 0xff, 0xf6, + 0x0, 0x0, 0xa, 0xff, 0xf7, 0x0, 0x0, 0x9, + 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, 0xf9, 0x0, + 0x0, 0x7, 0xff, 0xfa, 0x0, 0x0, 0x7, 0xff, + 0xfa, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, 0x0, + 0x7, 0xff, 0xfa, 0x0, 0x0, 0x8, 0xff, 0xf9, + 0x0, 0x0, 0x9, 0xff, 0xf8, 0x0, 0x0, 0xa, + 0xff, 0xf7, 0x0, 0x0, 0xb, 0xff, 0xf6, 0x0, + 0x0, 0xd, 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, + 0xf1, 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x0, 0x0, + 0x5f, 0xff, 0xc0, 0x0, 0x0, 0x9f, 0xff, 0x80, + 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, 0x1, 0xff, + 0xff, 0x10, 0x0, 0x5, 0xff, 0xfc, 0x0, 0x0, + 0xb, 0xff, 0xf7, 0x0, 0x0, 0x1f, 0xff, 0xf1, + 0x0, 0x0, 0x7f, 0xff, 0xb0, 0x0, 0x0, 0xdf, + 0xff, 0x30, 0x0, 0x5, 0xff, 0xfc, 0x0, 0x0, + 0xd, 0xff, 0xf4, 0x0, 0x0, 0x5f, 0xff, 0xb0, + 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x0, 0x8, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x2e, 0x50, 0x0, 0x7f, 0xf1, 0x0, + 0x19, 0xb0, 0xa, 0xff, 0xb2, 0x7, 0xff, 0x10, + 0x6e, 0xff, 0x40, 0xcf, 0xff, 0xf8, 0x8f, 0xf4, + 0xcf, 0xff, 0xf6, 0x0, 0x5d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa2, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x2b, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x1, 0x9f, 0xff, + 0xfe, 0xff, 0xef, 0xff, 0xe6, 0x0, 0xef, 0xff, + 0xd4, 0x7f, 0xf1, 0x7f, 0xff, 0xf8, 0x8, 0xff, + 0x70, 0x7, 0xff, 0x10, 0x1a, 0xff, 0x20, 0x9, + 0x10, 0x0, 0x7f, 0xf1, 0x0, 0x4, 0x70, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xbb, 0x10, 0x0, 0x0, + 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0xa, 0xaa, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x8, 0x88, 0x88, 0x88, + 0x8f, 0xff, 0xd8, 0x88, 0x88, 0x88, 0x50, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, + + /* U+002C "," */ + 0x1, 0x66, 0x10, 0x2e, 0xff, 0xf3, 0xbf, 0xff, + 0xfb, 0xdf, 0xff, 0xfe, 0xbf, 0xff, 0xfc, 0x3f, + 0xff, 0xf9, 0x3, 0xff, 0xf4, 0x5, 0xff, 0xe0, + 0x9, 0xff, 0x90, 0xd, 0xff, 0x40, 0x1f, 0xfe, + 0x0, 0x4f, 0xf9, 0x0, 0x8f, 0xf4, 0x0, + + /* U+002D "-" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x37, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x57, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, + + /* U+002E "." */ + 0x0, 0x0, 0x0, 0xa, 0xff, 0xa0, 0x9f, 0xff, + 0xf9, 0xef, 0xff, 0xfd, 0xdf, 0xff, 0xfd, 0x8f, + 0xff, 0xf7, 0x8, 0xee, 0x80, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0x88, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xda, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xfa, 0x51, 0x1, 0x38, 0xef, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xdf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf3, 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x0, + 0xc, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x10, 0x1f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x70, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x8f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xe0, 0xbf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf0, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf3, 0xef, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf3, 0xcf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf2, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, 0x8f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xe0, 0x5f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xb0, 0x1f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x70, 0xc, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x10, 0x6, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x0, + 0x0, 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf3, 0x0, 0x0, 0x5f, 0xff, + 0xfe, 0x40, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xfa, 0x51, + 0x1, 0x38, 0xef, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xce, 0xff, 0xda, 0x60, 0x0, + 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x9e, 0xee, 0xee, 0xef, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, + + /* U+0032 "2" */ + 0x0, 0x0, 0x0, 0x27, 0xad, 0xff, 0xfe, 0xc9, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x2f, 0xff, 0xff, 0xfa, 0x52, 0x10, 0x2, 0x6c, + 0xff, 0xff, 0xf6, 0x0, 0x7, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0x0, + 0x0, 0x5f, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x30, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xeb, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, + + /* U+0033 "3" */ + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x5, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xfd, 0xa5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x15, 0x55, 0x67, 0xaf, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf0, + 0x3, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xb0, 0xc, 0xff, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0x50, + 0x6f, 0xff, 0xff, 0xd8, 0x42, 0x10, 0x2, 0x5a, + 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x5, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x58, 0xcd, 0xef, 0xfe, 0xc9, + 0x40, 0x0, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x77, 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x80, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x4, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xed, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xff, 0xff, 0xdd, 0xdd, 0xdc, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, + 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xed, 0xc9, + 0x61, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xd, 0xee, 0xee, + 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x49, + 0xef, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfa, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf7, + 0x0, 0xbb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf3, 0x4, 0xff, 0xe7, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xc0, + 0xd, 0xff, 0xff, 0xfb, 0x63, 0x10, 0x1, 0x38, + 0xef, 0xff, 0xff, 0x40, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x1, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x26, 0xac, 0xef, 0xff, 0xda, + 0x72, 0x0, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xde, 0xff, + 0xec, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0x94, 0x0, 0x0, + 0x1, 0x49, 0xe0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, 0x0, + 0x1, 0x58, 0x9a, 0x97, 0x40, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xa0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0x0, 0xcf, 0xff, 0x90, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0xdf, 0xff, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0xdf, 0xff, 0xef, 0xff, + 0xfa, 0x41, 0x0, 0x26, 0xdf, 0xff, 0xff, 0x40, + 0xdf, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xd0, 0xcf, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, + 0xbf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfa, 0xaf, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfd, + 0x6f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0x3f, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, + 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfd, 0x9, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x2, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x9f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xe0, + 0x0, 0xd, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x1, + 0x7f, 0xff, 0xff, 0x50, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xec, 0xaa, 0xcf, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x6e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x49, 0xcd, 0xff, 0xec, + 0x83, 0x0, 0x0, 0x0, + + /* U+0037 "7" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, 0xfe, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xf5, + 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xe0, 0xbf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x70, + 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x0, 0xbf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, 0x0, + 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf2, 0x0, 0x46, 0x66, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x0, 0x1, 0x59, 0xcd, 0xff, 0xed, + 0xb6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xeb, 0xaa, 0xbd, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x8f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x0, 0x0, 0xdf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x20, 0x0, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, + 0x0, 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x40, 0x0, 0xcf, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x10, 0x0, 0x7f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x4, + 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xfe, 0xa8, 0x66, 0x79, 0xdf, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xe8, 0x41, 0x0, 0x13, + 0x6c, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xdf, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0x30, 0x6, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xb0, 0xc, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf1, 0xf, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0xf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf5, 0xe, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, + 0xa, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf0, 0x3, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x90, 0x0, 0xaf, 0xff, 0xff, 0x82, 0x0, + 0x0, 0x0, 0x16, 0xef, 0xff, 0xfe, 0x10, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xeb, 0xaa, 0xbd, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7a, 0xde, 0xff, 0xfd, 0xb8, 0x40, + 0x0, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xec, 0x95, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xca, 0xab, 0xdf, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x28, 0xff, 0xff, 0xe1, 0x0, 0x0, 0xef, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xb0, 0x0, 0x5f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x9, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfb, 0x0, 0xbf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf1, + 0xb, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x50, 0xaf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf9, 0x7, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xc0, 0x1f, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xfd, 0x0, 0x9f, 0xff, 0xfe, 0x71, 0x0, + 0x0, 0x2, 0x8f, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0xdf, 0xff, 0xff, 0xfd, 0xba, 0xbd, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x5, + 0xad, 0xff, 0xfe, 0xb7, 0x20, 0x0, 0x8f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xaf, 0xff, 0xff, 0x20, 0x0, 0x0, 0xe, 0xd7, + 0x20, 0x0, 0x0, 0x49, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xbe, 0xff, 0xfe, 0xb8, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+003A ":" */ + 0x8, 0xee, 0x80, 0x8f, 0xff, 0xf7, 0xdf, 0xff, + 0xfd, 0xef, 0xff, 0xfd, 0x9f, 0xff, 0xf8, 0xa, + 0xff, 0xa0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xa0, 0x9f, 0xff, 0xf9, 0xef, 0xff, 0xfd, 0xdf, + 0xff, 0xfd, 0x8f, 0xff, 0xf7, 0x8, 0xee, 0x80, + + /* U+003B ";" */ + 0x8, 0xee, 0x80, 0x8f, 0xff, 0xf7, 0xdf, 0xff, + 0xfd, 0xef, 0xff, 0xfd, 0x9f, 0xff, 0xf8, 0xa, + 0xff, 0xa0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xee, + 0x80, 0x7f, 0xff, 0xf7, 0xcf, 0xff, 0xfd, 0xdf, + 0xff, 0xfd, 0x8f, 0xff, 0xfb, 0x9, 0xff, 0xf6, + 0x3, 0xff, 0xf1, 0x7, 0xff, 0xc0, 0xb, 0xff, + 0x60, 0xe, 0xff, 0x10, 0x2f, 0xfc, 0x0, 0x6f, + 0xf7, 0x0, 0x58, 0x81, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xff, 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, + 0x4a, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, + 0x0, 0x17, 0xdf, 0xff, 0xff, 0xfe, 0x92, 0x0, + 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xb5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xdf, + 0xff, 0xff, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, 0xfc, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0xff, 0xe9, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xaf, 0xff, 0xff, 0xff, 0xc6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xba, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003D "=" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x50, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, + + /* U+003E ">" */ + 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xfe, 0x82, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xb4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, + 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, 0xfb, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, + 0xff, 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x7d, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, 0xfb, + 0x30, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, 0xff, + 0xfe, 0x81, 0x0, 0x0, 0x0, 0x5, 0xbf, 0xff, + 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x2, 0x8e, + 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xfe, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xb5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x0, 0x37, 0xbd, 0xff, 0xfe, 0xc9, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xfe, + 0xdd, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x3f, 0xff, + 0xff, 0xe7, 0x30, 0x0, 0x0, 0x4b, 0xff, 0xff, + 0xf7, 0x1, 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xd0, 0x0, 0x6f, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x9a, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, 0xfa, + 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0x9c, 0xde, 0xff, 0xed, 0xb8, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x8d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xea, 0x63, + 0x10, 0x0, 0x1, 0x46, 0xaf, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5c, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x1, + 0x7b, 0xef, 0xfd, 0xb5, 0x10, 0x0, 0xff, 0xfc, + 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, 0x3f, 0xff, + 0x90, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0xff, 0xfc, 0x0, 0xa, 0xff, + 0xe0, 0x0, 0x0, 0xbf, 0xfe, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xff, 0xfc, 0x0, 0x0, 0xef, 0xf7, 0x0, 0x3, + 0xff, 0xf5, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xb8, 0x79, 0xbf, 0xff, 0xfb, 0xff, 0xfc, 0x0, + 0x0, 0x6f, 0xfe, 0x0, 0x9, 0xff, 0xd0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x81, 0x0, 0x0, 0x1, + 0x8f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xe, 0xff, + 0x40, 0xe, 0xff, 0x70, 0x0, 0x0, 0x7f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x8, 0xff, 0x90, 0x3f, 0xff, + 0x10, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfc, 0x0, 0x0, + 0x3, 0xff, 0xd0, 0x6f, 0xfd, 0x0, 0x0, 0x4, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x9f, 0xfa, 0x0, 0x0, 0x8, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0xcf, 0xf3, 0xcf, 0xf7, 0x0, + 0x0, 0xb, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0xbf, 0xf4, 0xcf, 0xf6, 0x0, 0x0, 0xd, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0xaf, 0xf5, 0xdf, + 0xf5, 0x0, 0x0, 0xd, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0xaf, 0xf5, 0xdf, 0xf5, 0x0, 0x0, + 0xd, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xaf, + 0xf5, 0xcf, 0xf6, 0x0, 0x0, 0xb, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xbf, 0xf4, 0xbf, 0xf7, + 0x0, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xdf, 0xf2, 0x9f, 0xfa, 0x0, 0x0, 0x4, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfc, 0x0, 0x0, 0x1, 0xff, 0xf0, + 0x6f, 0xfd, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, + 0x0, 0x0, 0x5, 0xff, 0xb0, 0x3f, 0xff, 0x20, + 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0x0, 0x0, 0xc, + 0xff, 0x60, 0xe, 0xff, 0x70, 0x0, 0x0, 0xc, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x1, 0x8f, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x7f, 0xfe, 0x10, 0x9, + 0xff, 0xd0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xa7, 0x68, 0xaf, 0xff, 0xfa, 0x7f, 0xff, 0xf9, + 0x7b, 0xff, 0xf7, 0x0, 0x2, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0xaf, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x2f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, + 0xfe, 0xb7, 0x10, 0x0, 0x0, 0x3a, 0xef, 0xeb, + 0x50, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xc5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xb6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xfa, 0x74, 0x21, 0x0, 0x14, + 0x6a, 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x9e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x37, 0x9c, 0xef, 0xff, 0xec, 0xa7, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xfe, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x97, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x21, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, + 0x9f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, + 0x0, 0x2f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xd0, 0x0, 0xb, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x60, 0x0, 0x4, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xc9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9c, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xc0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf3, 0x0, 0x0, 0x7f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x20, 0x5, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0xd, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf1, + + /* U+0042 "B" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xec, 0x95, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x0, 0x6f, 0xff, 0xfa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xab, 0xdf, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x7f, 0xff, 0xff, 0xa0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xf1, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf5, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf5, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf1, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xb0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x7f, 0xff, 0xfe, 0x10, 0x0, 0x6f, 0xff, + 0xfa, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xdf, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x5a, + 0xff, 0xff, 0xf7, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0x20, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x90, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, + 0xff, 0x20, 0x6f, 0xff, 0xfa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xac, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc9, 0x61, 0x0, + 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, + 0xff, 0xeb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, + 0x95, 0x20, 0x1, 0x25, 0x9e, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x70, 0x0, + 0x1e, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0x60, 0x0, 0xb, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x4, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x40, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0x60, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, 0x95, + 0x20, 0x1, 0x25, 0xae, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x9c, 0xef, 0xff, 0xeb, 0x84, 0x0, 0x0, + 0x0, 0x0, + + /* U+0044 "D" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xca, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xcf, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xf8, 0x0, 0x6, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xa0, 0x6, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x20, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf7, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xc0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x26, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x26, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x6, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf7, 0x6, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x20, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xa0, 0x6, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xf8, 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0xcf, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xee, 0xee, 0xee, + 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xca, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0045 "E" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x56, 0xff, 0xff, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xe5, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd6, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x6, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+0046 "F" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x56, 0xff, 0xff, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xe5, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xfd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0x60, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x8b, 0xef, + 0xff, 0xec, 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xa5, 0x20, 0x0, 0x24, 0x8d, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x4f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xb0, 0x0, + 0x1e, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xa0, 0x0, 0xb, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x4, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xaa, 0xa2, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x3c, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf3, 0x9f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x36, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf3, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x30, 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x3, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0xb, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf3, 0x0, 0x1e, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x4f, 0xff, 0xff, 0xf7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, + 0xf3, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xa5, + 0x20, 0x0, 0x13, 0x7c, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x9b, 0xef, 0xff, 0xec, 0x95, 0x10, 0x0, + 0x0, 0x0, + + /* U+0048 "H" */ + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xfe, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xef, 0xff, 0xf1, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, + + /* U+0049 "I" */ + 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, + 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, + 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, + 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, + 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, + 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, + 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, + 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, + 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, + 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, + 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, + 0xff, 0xf0, 0x6f, 0xff, 0xf0, + + /* U+004A "J" */ + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x3, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf0, + 0x0, 0xae, 0x10, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xc0, 0x8, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x70, 0x2f, 0xff, 0xff, 0x92, + 0x0, 0x2, 0x9f, 0xff, 0xff, 0x10, 0x7, 0xff, + 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, + 0xff, 0xed, 0xa6, 0x0, 0x0, 0x0, + + /* U+004B "K" */ + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf5, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x60, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf7, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x80, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x6f, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x5, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x5f, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x4, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x4f, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0x7e, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xf5, 0x3, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x5f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0x40, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfd, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xb0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0x50, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xf3, + + /* U+004C "L" */ + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xfe, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xea, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+004D "M" */ + 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf5, 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf5, 0x6f, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, 0x6f, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xf5, 0x6f, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, + 0x6f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xf5, 0x6f, 0xff, 0xd9, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x7e, + 0xff, 0xf5, 0x6f, 0xff, 0xd1, 0xef, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, + 0xd, 0xff, 0xf5, 0x6f, 0xff, 0xd0, 0x6f, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xf4, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0xc, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xb0, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, + 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x20, 0xd, 0xff, 0xf6, 0x6f, 0xff, + 0xd0, 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf8, 0x0, 0xd, 0xff, 0xf6, 0x6f, + 0xff, 0xd0, 0x0, 0x1e, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xe0, 0x0, 0xd, 0xff, 0xf6, + 0x6f, 0xff, 0xd0, 0x0, 0x6, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, 0xd, 0xff, + 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0xdf, 0xff, + 0x80, 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, 0xd, + 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x3f, + 0xff, 0xf2, 0x0, 0x1e, 0xff, 0xf2, 0x0, 0x0, + 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0xa, 0xff, 0xfb, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x53, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xec, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, + + /* U+004E "N" */ + 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf8, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0xbf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0xd, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x2, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x4f, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x8, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0xbf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x30, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xe1, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfc, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0x90, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xf6, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x8f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf1, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9b, 0xef, + 0xff, 0xeb, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, + 0x95, 0x20, 0x0, 0x25, 0x9e, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xfe, 0x10, 0x0, 0xb, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfa, 0x0, 0x3, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf3, 0x0, 0xbf, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xa0, 0x1f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x16, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x9f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x8c, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xce, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xcc, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xfb, 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x86, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf5, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x10, 0xbf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xa0, 0x3, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf3, 0x0, 0xb, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfa, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xfe, 0x95, 0x20, 0x0, 0x25, 0x9e, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x9b, 0xef, 0xff, + 0xec, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, + 0x95, 0x10, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x6f, + 0xff, 0xfe, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x7d, 0xff, 0xff, 0xf7, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0x20, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xa0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf5, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf6, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf5, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xe0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x90, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0x10, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x25, 0x9e, 0xff, 0xff, + 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, + 0x0, 0x6f, 0xff, 0xfe, 0xee, 0xee, 0xee, 0xed, + 0xcb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x8b, 0xef, + 0xff, 0xeb, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xfe, 0x95, 0x20, 0x0, 0x25, + 0x9e, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0xa, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xfa, 0x0, 0x0, 0x3, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf3, 0x0, 0x0, 0xaf, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xa0, 0x0, 0x1f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x0, + 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf5, 0x0, 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x80, 0xb, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfb, 0x0, 0xdf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xc0, 0xe, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xc0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfb, 0x0, 0x9f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x90, 0x6, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x2f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x10, 0x0, + 0xcf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xb0, + 0x0, 0x5, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf4, 0x0, 0x0, 0xc, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xef, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xfd, 0x73, 0x0, 0x0, + 0x2, 0x7d, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xef, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x38, 0xbe, 0xff, 0xff, 0xff, 0xf6, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x38, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x4e, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xe7, 0x20, 0x14, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xbf, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0x78, 0x75, 0x10, 0x0, + 0x0, + + /* U+0052 "R" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, + 0x95, 0x10, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xee, 0xee, 0xee, 0xee, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7d, 0xff, + 0xff, 0xf8, 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xf2, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xa0, 0x6, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf3, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x50, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf7, 0x6, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x70, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, 0x6, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x30, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xe0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf9, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0x10, 0x6, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x59, 0xef, 0xff, + 0xff, 0x60, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x10, 0x0, 0x0, 0x6, 0xff, 0xff, 0xdd, 0xdd, + 0xdd, 0xdc, 0xcd, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xe1, 0x0, 0x0, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xc0, 0x0, 0x6, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x30, 0x6, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfd, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xfa, 0x0, + + /* U+0053 "S" */ + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xce, 0xff, 0xed, + 0xb8, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xed, 0xde, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xb5, 0x10, + 0x0, 0x0, 0x36, 0xbf, 0xff, 0x80, 0x0, 0xc, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xf1, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xc8, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5a, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0xae, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8e, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x70, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf6, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x30, 0x7f, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xd0, 0xe, 0xff, 0xff, + 0xe9, 0x51, 0x0, 0x0, 0x1, 0x4a, 0xff, 0xff, + 0xf5, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xde, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x15, 0x9c, 0xef, 0xff, 0xec, 0xa6, + 0x10, 0x0, 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xce, + 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xfe, 0xee, + 0xee, 0xee, 0xee, 0xe9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x6a, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf6, 0xaf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x6a, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0xaf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x6a, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf6, 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x6a, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf6, 0xaf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x6a, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0xaf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x6a, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf6, 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x6a, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf6, 0xaf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x6a, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, + 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x6a, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf6, 0x9f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x58, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, 0x6f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x23, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf0, 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, 0x0, 0xaf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x60, 0x3, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xe0, 0x0, 0xb, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xf7, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xfa, 0x52, 0x0, 0x12, 0x6c, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x48, 0xcd, 0xef, 0xed, 0xb7, 0x30, 0x0, + 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x20, 0x6f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xb0, 0x0, 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x8, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfd, 0x0, 0x0, 0x1f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x60, 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, + 0x0, 0x0, 0xb, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfc, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf3, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xa0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x10, 0x7, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf8, 0x0, 0xef, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xe0, 0x5f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x5c, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfe, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, + 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xa0, + 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x40, + 0x6, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, + 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, + 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, + 0x0, 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfd, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, + 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf6, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, + 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf1, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xb0, 0x1f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x50, 0xb, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x0, 0x6, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfb, 0x0, 0x1, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf5, 0x0, 0x0, 0xbf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x1f, 0xff, 0xf2, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, + 0xcf, 0xff, 0x50, 0x0, 0x0, 0xb, 0xff, 0xf8, + 0x0, 0x0, 0x9, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, 0x1, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, + 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf0, 0x0, 0x7, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x20, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, 0x0, 0xc, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x80, 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x2f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xd0, 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, 0x7f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf2, 0x4, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, 0xdf, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf8, 0x9, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa2, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfd, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf8, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0x5, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x0, 0x0, + 0xaf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf3, 0x0, 0x0, 0xd, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x60, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, 0x0, + 0xa, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf3, 0x0, 0x5f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x2, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xac, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x9e, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xfc, 0x5, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf2, 0x0, 0x9f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x60, 0x0, 0xd, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf3, 0x0, 0x5, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xfe, 0x10, 0x1e, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xa0, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf5, 0x4, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x0, 0xaf, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x20, 0x0, 0x1f, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf8, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf1, 0x0, 0x4, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xfa, 0x0, 0xd, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x40, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xd2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfe, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+005A "Z" */ + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0xbe, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xef, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xe9, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, + + /* U+005B "[" */ + 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x6f, 0xff, 0xff, + 0xff, 0xfd, 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x6f, + 0xff, 0xe8, 0x88, 0x87, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, + 0xe8, 0x88, 0x87, 0x6f, 0xff, 0xff, 0xff, 0xfd, + 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x6f, 0xff, 0xff, + 0xff, 0xfd, + + /* U+005C "\\" */ + 0x48, 0x88, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x80, + + /* U+005D "]" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0x1, 0x88, 0x88, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0x18, 0x88, 0x8a, 0xff, 0xff, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0x2, 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0x0, 0x78, 0x85, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xef, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0x8f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xd0, 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x60, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x0, 0x5, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, + 0xef, 0xf6, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xc0, 0x0, 0x0, 0x1f, 0xff, 0x30, 0x0, + 0x0, 0xe, 0xff, 0x50, 0x0, 0x0, 0xb, 0xff, + 0xa0, 0x0, 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf1, 0x0, 0x0, 0xcf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf7, 0x0, 0x3, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, + 0xa, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x40, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xb0, 0x7f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf2, + + /* U+005F "_" */ + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, + + /* U+0060 "`" */ + 0x4f, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xe2, + + /* U+0061 "a" */ + 0x0, 0x0, 0x4, 0x8b, 0xde, 0xfe, 0xda, 0x71, + 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0xdf, 0xff, 0xff, 0xfd, 0xcc, 0xdf, 0xff, 0xff, + 0xfc, 0x0, 0x5, 0xff, 0xf9, 0x40, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xf6, 0x0, 0xb, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf7, 0x0, 0x0, 0x38, 0xbe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x2, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0xdf, 0xff, 0xfa, 0x52, 0x11, 0x11, 0x11, + 0x1c, 0xff, 0xf7, 0x5f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x7a, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, + 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x7b, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x9f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x74, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xf7, 0xc, 0xff, 0xff, 0xe8, 0x65, 0x58, + 0xdf, 0xff, 0xef, 0xff, 0x70, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa8, 0xff, 0xf7, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x8f, + 0xff, 0x70, 0x0, 0x3, 0x8c, 0xef, 0xfd, 0xb6, + 0x10, 0x8, 0xff, 0xf7, + + /* U+0062 "b" */ + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0x4, 0x9c, 0xef, 0xed, + 0x95, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0xf, 0xff, 0xf3, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0xff, 0xff, + 0xaf, 0xff, 0xff, 0xed, 0xce, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, 0x20, + 0x0, 0x2, 0x8f, 0xff, 0xff, 0xc0, 0x0, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0x70, 0xf, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf6, 0xf, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xb0, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfe, 0xf, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf1, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x2f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf2, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x1f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xe0, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, + 0xf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xf0, 0xf, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x82, 0x0, 0x0, 0x28, 0xff, 0xff, + 0xfc, 0x0, 0xf, 0xff, 0xf8, 0xff, 0xff, 0xfe, + 0xcc, 0xef, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xff, + 0xff, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0xf, 0xff, 0xf0, 0x4, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xda, + 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x0, 0x0, 0x38, 0xbe, 0xff, 0xec, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xed, 0xde, 0xff, 0xff, 0xff, 0x90, 0x0, 0xa, + 0xff, 0xff, 0xf9, 0x20, 0x0, 0x2, 0x8f, 0xff, + 0xff, 0x40, 0x6, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x3d, 0xff, 0xc2, 0x0, 0xef, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x70, + 0x0, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xe7, 0x0, 0x0, + 0x5f, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xfd, 0x30, 0x0, 0xaf, 0xff, 0xff, 0x82, + 0x0, 0x0, 0x28, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xfe, 0xcc, 0xef, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, 0xfe, + 0xc9, 0x40, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x5, 0x9d, 0xef, 0xec, + 0x94, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x3f, + 0xff, 0xf0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x73, 0xff, 0xff, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xfe, 0xcd, 0xef, 0xff, 0xff, + 0xaf, 0xff, 0xf0, 0x0, 0xcf, 0xff, 0xff, 0x82, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x7f, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0x6, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf1, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x1f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, + 0xef, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xb, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xf0, 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xf0, 0x7, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0x0, 0xc, + 0xff, 0xff, 0xf8, 0x20, 0x0, 0x2, 0x8f, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xec, 0xce, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x7, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xda, + 0x50, 0x0, 0xf, 0xff, 0xf0, + + /* U+0065 "e" */ + 0x0, 0x0, 0x0, 0x0, 0x5a, 0xde, 0xff, 0xda, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xfe, 0xba, 0xbe, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0xc, 0xff, 0xff, 0xb3, 0x0, + 0x0, 0x2, 0xaf, 0xff, 0xfc, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf7, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xe0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x60, 0xb, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, + 0x0, 0xef, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xd0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0x31, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0xe, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xf4, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xa3, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xdc, 0xdf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x7b, 0xef, 0xfe, 0xda, + 0x51, 0x0, 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x0, 0x49, 0xdf, 0xfe, 0xb6, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xeb, 0x9a, 0xef, 0x30, 0x0, 0x0, 0xf, 0xff, + 0xfb, 0x10, 0x0, 0x5, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x38, 0x88, 0xbf, 0xff, + 0xe8, 0x88, 0x88, 0x84, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x0, 0x0, 0x59, 0xde, 0xfe, 0xda, + 0x50, 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xb, + 0xff, 0xf5, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x1b, 0xff, 0xf5, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xfe, 0xdc, 0xef, 0xff, + 0xff, 0xdc, 0xff, 0xf5, 0x0, 0xe, 0xff, 0xff, + 0xf8, 0x20, 0x0, 0x1, 0x6d, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x9f, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf5, 0x2, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xf5, 0x8, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf5, + 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf5, 0xf, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf5, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf5, 0x2f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf5, 0x1f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xf5, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, 0xc, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf5, 0x7, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf5, + 0x1, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf5, 0x0, 0x9f, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf5, 0x0, 0xd, 0xff, 0xff, 0xf9, 0x30, + 0x0, 0x1, 0x7d, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xdc, 0xef, 0xff, + 0xff, 0xdf, 0xff, 0xf5, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1e, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0xe, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x59, 0xde, 0xfe, 0xda, 0x50, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xb0, 0x0, 0x2, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x60, 0x0, + 0xb, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfe, 0x0, 0x0, 0x5f, 0xff, 0xfd, + 0x73, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0xcc, + 0xdf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x19, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x7a, 0xce, 0xff, 0xed, + 0xb7, 0x30, 0x0, 0x0, 0x0, + + /* U+0068 "h" */ + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf3, 0x0, 0x4, 0x9d, 0xef, 0xed, 0x94, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0xf, 0xff, + 0xf3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfe, + 0xef, 0xff, 0xff, 0xff, 0x30, 0xf, 0xff, 0xff, + 0xff, 0xe6, 0x10, 0x0, 0x16, 0xef, 0xff, 0xfd, + 0x0, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xf5, 0xf, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfd, 0xf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x1f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf2, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf2, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf2, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x20, + + /* U+0069 "i" */ + 0x1, 0x66, 0x20, 0x1e, 0xff, 0xf4, 0x9f, 0xff, + 0xfd, 0xbf, 0xff, 0xfe, 0x7f, 0xff, 0xfa, 0x9, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, + 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, + 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, + 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, + 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, + 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, + 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, + 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, + 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x20, 0x0, 0x71, 0x0, + 0x1, 0xdf, 0xff, 0xe0, 0x0, 0x3f, 0xfc, 0xab, + 0xff, 0xff, 0xf7, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x6b, 0xef, 0xfe, 0xa4, + 0x0, 0x0, 0x0, + + /* U+006B "k" */ + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x90, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x1, 0xdf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x2e, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x2, + 0xef, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x3e, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x34, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0x66, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0xaf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xd, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf9, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0x50, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xa0, + + /* U+006C "l" */ + 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, + 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, + 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, + 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, + 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, + 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, + 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, + 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, + 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, + 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, + 0xff, 0xff, 0x30, + + /* U+006D "m" */ + 0xff, 0xff, 0x0, 0x1, 0x6b, 0xdf, 0xfe, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, + 0x82, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xff, + 0xff, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0xf, 0xff, 0xfd, 0xff, 0xff, 0xdb, + 0xab, 0xff, 0xff, 0xff, 0xa4, 0xff, 0xff, 0xfe, + 0xba, 0xbe, 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, + 0xff, 0xf9, 0x10, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xb3, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xf7, 0xf, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xe0, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x3f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf7, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x9f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfa, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xbf, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xbf, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfb, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xbf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xbf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, + + /* U+006E "n" */ + 0xff, 0xff, 0x0, 0x1, 0x5a, 0xde, 0xfe, 0xd9, + 0x40, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0xff, + 0xff, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0xf, 0xff, 0xfd, 0xff, 0xff, 0xeb, + 0xab, 0xdf, 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, + 0xff, 0xfb, 0x30, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xd0, 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x50, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfa, + 0xf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xd0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf1, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x2f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf2, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf2, + + /* U+006F "o" */ + 0x0, 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xec, + 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xfe, 0xcd, 0xef, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xf8, 0x20, 0x0, 0x2, 0x8f, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x6f, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xf5, 0x0, 0x0, 0xef, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xfd, 0x0, 0x5, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, + 0xb, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xa0, 0xe, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xd0, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x2f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf1, 0x2f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0xe, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xd0, 0xa, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x40, 0x0, 0xef, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xfd, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xf4, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf8, 0x20, 0x0, 0x2, 0x8f, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xfe, 0xcc, 0xef, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, + 0xce, 0xff, 0xec, 0x83, 0x0, 0x0, 0x0, 0x0, + + /* U+0070 "p" */ + 0xff, 0xff, 0x0, 0x0, 0x5a, 0xde, 0xfe, 0xd9, + 0x50, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x6, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0xf, 0xff, 0xfb, + 0xff, 0xff, 0xeb, 0x99, 0xae, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0x0, 0x5, 0xdf, 0xff, 0xfc, 0x0, 0xf, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf0, 0xf, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x60, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, + 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xe0, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x2f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfe, 0xf, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf6, 0xf, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0x70, 0xf, 0xff, 0xff, + 0xff, 0xf9, 0x20, 0x0, 0x2, 0x8f, 0xff, 0xff, + 0xc0, 0x0, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xec, + 0xce, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xf, 0xff, + 0xf3, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0xff, 0xff, 0x30, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0xf, + 0xff, 0xf3, 0x0, 0x4, 0x9c, 0xef, 0xfd, 0xa5, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x0, 0x0, 0x59, 0xde, 0xff, 0xda, + 0x50, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x6, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xf, 0xff, 0xf0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xec, 0xde, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0x0, 0xc, 0xff, 0xff, 0xf8, 0x20, + 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xf0, 0x7, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf0, + 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xb, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xf0, 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x1f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf2, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x2f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf1, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xe, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0xbf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0x6, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0x0, 0x7f, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xf0, 0x0, 0xcf, + 0xff, 0xff, 0x82, 0x0, 0x0, 0x28, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xfe, + 0xcc, 0xef, 0xff, 0xff, 0xaf, 0xff, 0xf0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x73, 0xff, 0xff, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x30, 0x3f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xed, 0x94, + 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf0, + + /* U+0072 "r" */ + 0xff, 0xff, 0x0, 0x0, 0x6a, 0xdf, 0x8f, 0xff, + 0xf0, 0x6, 0xef, 0xff, 0xf8, 0xff, 0xff, 0x9, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x32, + 0x1f, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xff, 0xdb, 0x84, + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x20, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x2, 0xff, + 0xff, 0xff, 0xdb, 0xbc, 0xdf, 0xff, 0xff, 0x40, + 0xa, 0xff, 0xff, 0x81, 0x0, 0x0, 0x0, 0x4a, + 0xfc, 0x0, 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x22, 0x0, 0x2f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xc6, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xfe, 0xb8, 0x41, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x20, 0x0, + 0x0, 0x1, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x6b, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x8, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x1f, 0xff, + 0xc6, 0x20, 0x0, 0x0, 0x3, 0xcf, 0xff, 0xf3, + 0x9f, 0xff, 0xff, 0xff, 0xdc, 0xbc, 0xff, 0xff, + 0xff, 0xa0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x2, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, + 0x48, 0xbd, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + + /* U+0074 "t" */ + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x38, 0x88, 0xbf, 0xff, 0xe8, 0x88, 0x88, 0x84, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfd, 0x20, 0x0, 0x7, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfb, 0xab, + 0xff, 0x50, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xef, 0xfd, 0xa4, 0x0, + + /* U+0075 "u" */ + 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xb3, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x3f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xb3, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x3f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xb3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfb, 0x3f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xb3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfb, 0x3f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb3, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfb, 0x3f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb3, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfb, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb3, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfb, 0x2f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xb1, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, + 0xe, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xb0, 0xbf, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfb, 0x5, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xb0, 0xe, 0xff, 0xff, 0xd6, 0x10, + 0x0, 0x27, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xb0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x74, 0xff, 0xfb, 0x0, 0x0, 0x3c, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x4f, 0xff, + 0xb0, 0x0, 0x0, 0x4, 0x8c, 0xef, 0xed, 0xa4, + 0x0, 0x4, 0xff, 0xfb, + + /* U+0076 "v" */ + 0xd, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf6, 0x7, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf0, 0x1, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x20, 0x0, 0x2f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x0, 0x0, 0xc, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, 0x6f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x80, 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, + 0x3, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf5, 0x0, 0xa, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xfc, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, 0x8f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x90, 0xef, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf6, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0x8f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf1, 0x3f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, + 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x60, 0x7, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x0, + 0x1, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfa, 0x0, 0x0, 0xbf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, + 0x0, 0x6f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf8, 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xe0, 0x0, 0x0, 0xf, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf2, 0x9f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xc0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x30, 0x0, 0x0, 0x4, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, 0xd, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xef, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x10, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x4, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x50, 0x0, 0x2, 0xff, 0xfa, 0x0, 0x1, 0xff, + 0xfc, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x8, 0xff, + 0xf4, 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, 0xf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf1, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x5f, + 0xff, 0x80, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf6, 0x0, 0x4f, 0xff, + 0x80, 0x0, 0x0, 0xf, 0xff, 0xd0, 0x0, 0xbf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfc, 0x0, 0xaf, 0xff, 0x20, 0x0, 0x0, 0x9, + 0xff, 0xf3, 0x1, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x10, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf9, 0x7, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x75, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xfe, 0xd, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xdb, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x7f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0x9, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xc0, 0x0, 0xcf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x20, + 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x1, 0xef, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf2, 0x0, 0x0, 0xb, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfd, 0x0, 0x0, 0x7f, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, 0x3, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf5, 0x1e, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xbf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xfa, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xd0, 0xa, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x20, 0x0, 0xdf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf6, 0x0, 0x0, 0x3f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xa0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xc, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xe1, 0x0, 0x0, 0x8f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfc, 0x0, + 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x80, 0x1e, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf4, + + /* U+0079 "y" */ + 0xd, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf6, 0x7, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf0, 0x1, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0x0, + 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x20, 0x0, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf4, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x5f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x90, 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, + 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf7, 0x0, 0x9, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xfe, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, 0x6f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xb0, 0xdf, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf6, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xd4, 0x0, 0x0, + 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xeb, 0xbe, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xdf, 0xfd, 0xa4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8d, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xb8, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x23, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x43, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, + + /* U+007B "{" */ + 0x0, 0x0, 0x0, 0x6, 0xbe, 0xff, 0x90, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xf9, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x6, 0xff, 0xff, + 0xfb, 0x95, 0x0, 0x0, 0xbf, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x10, 0x0, 0x4, 0x9a, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x1, 0x9f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x80, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xb9, 0x50, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x7c, 0xef, + 0xf9, + + /* U+007C "|" */ + 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, + 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, + 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, + 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, + 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, + 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, + 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, + 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, + 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, + 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, + 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, + 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, + 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, + 0xf8, + + /* U+007D "}" */ + 0x2f, 0xff, 0xd9, 0x30, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x1, 0x8a, 0xdf, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x70, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xfc, 0x98, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xfe, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x8f, 0xff, 0xe3, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x30, 0x0, 0x18, + 0xad, 0xff, 0xff, 0xe0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x2, 0xff, 0xfd, 0x93, 0x0, 0x0, + 0x0, + + /* U+007E "~" */ + 0x0, 0x3, 0xae, 0xfd, 0x81, 0x0, 0x0, 0x0, + 0x0, 0x9b, 0xb0, 0x0, 0x5f, 0xff, 0xff, 0xfe, + 0x40, 0x0, 0x0, 0x0, 0xef, 0xf0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x2, 0xff, + 0xd0, 0xa, 0xff, 0xf8, 0x58, 0xff, 0xff, 0x90, + 0x0, 0xa, 0xff, 0x90, 0xf, 0xff, 0x40, 0x0, + 0x2d, 0xff, 0xfd, 0x65, 0xbf, 0xff, 0x40, 0x3f, + 0xfc, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x4b, 0xb4, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0xef, 0xd8, 0x0, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x0, 0x24, 0x53, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5c, 0xff, 0xff, 0xe8, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x8f, 0xfc, 0x41, 0x3, 0x9f, 0xfe, 0x10, + 0x2, 0xff, 0xb0, 0x0, 0x0, 0x5, 0xff, 0x90, + 0x9, 0xfe, 0x10, 0x0, 0x0, 0x0, 0xaf, 0xf1, + 0xd, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf4, + 0xf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf6, + 0xe, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf5, + 0xc, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf3, + 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, 0xdf, 0xd0, + 0x1, 0xef, 0xe3, 0x0, 0x0, 0x1b, 0xff, 0x60, + 0x0, 0x4f, 0xff, 0xb7, 0x79, 0xef, 0xfa, 0x0, + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x17, 0xce, 0xfd, 0x93, 0x0, 0x0, + + /* U+2022 "•" */ + 0x0, 0x0, 0x22, 0x0, 0x0, 0x5, 0xef, 0xfd, + 0x30, 0x5, 0xff, 0xff, 0xff, 0x20, 0xdf, 0xff, + 0xff, 0xfa, 0xf, 0xff, 0xff, 0xff, 0xd0, 0xff, + 0xff, 0xff, 0xfd, 0xc, 0xff, 0xff, 0xff, 0x80, + 0x3f, 0xff, 0xff, 0xe1, 0x0, 0x3b, 0xfe, 0xa1, + 0x0, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x8d, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x37, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, + 0x30, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x61, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc7, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xea, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xfd, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x59, 0xbc, 0xb9, 0xbf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x23, 0x43, 0xf, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x4, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xcf, 0xff, 0xff, 0xe9, + 0x30, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x23, 0x21, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, + 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0x9a, 0xba, 0x84, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x4d, 0xb0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0xb, 0xd4, 0xef, 0xc0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0xc, 0xfd, 0xff, 0xe5, 0x44, 0x45, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x54, 0x44, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x88, 0x89, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x98, 0x88, 0x9f, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xe1, 0x0, 0x1, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, 0x10, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xcc, 0xcd, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xdc, 0xcc, 0xdf, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0xdf, 0xff, 0xe9, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x9e, 0xff, 0xfc, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0xdf, 0xff, 0xe9, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x9e, 0xff, 0xfc, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xfd, 0xcc, 0xcd, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xdc, 0xcc, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x1, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, 0x10, 0x0, + 0x1e, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xf9, 0x88, 0x89, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x98, 0x88, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x44, 0x45, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x54, 0x44, + 0x5f, 0xff, 0xef, 0xc0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xfd, + 0x4e, 0xb0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0xb, 0xe4, + + /* U+F00B "" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x20, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x20, 0x0, 0x9e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xdb, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x1, 0xbd, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "ï€" */ + 0x0, 0x2, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x25, 0x30, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x7, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xb0, 0x5, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xa0, 0xdf, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xef, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0x2a, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xd0, 0x1d, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xf3, 0x0, 0x1d, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf3, + 0x0, 0x0, 0x8, 0xca, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c, 0xa2, 0x0, + 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x89, 0x99, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0x60, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xcf, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xf2, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x7, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x2f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0x30, 0x1, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xa0, + 0x5, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xf3, 0xd, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf6, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf9, + 0x2f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfb, 0x3f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xfd, 0x2f, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfc, + 0x1f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfb, 0xf, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x12, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xf7, 0xa, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xf4, + 0x5, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x85, 0x21, 0x11, 0x36, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x7a, 0xbc, 0xcc, 0xb9, 0x63, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0xab, 0xcc, + 0xb9, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, + 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x10, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xfa, 0x10, 0x1, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x3, 0xcf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf7, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc3, 0x9f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xaa, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x60, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x2, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xaa, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf8, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x9f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xfb, + 0x20, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x3, 0xcf, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x3, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x10, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, + 0xab, 0xcc, 0xba, 0x73, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x76, 0x10, 0x0, 0x0, + 0x0, 0x4, 0x88, 0x88, 0x84, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xf, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xce, 0xff, 0xff, 0xff, 0xf8, 0xf, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xf5, 0x1, 0xbf, 0xff, 0xff, 0xff, + 0xbf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x2, 0xa7, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xff, 0xff, 0x70, 0x0, 0x4f, 0xff, + 0xb0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x7, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xfe, 0x40, 0xcf, 0xff, 0xff, 0xff, 0xb1, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xf4, 0xdf, 0xff, 0xff, 0xf9, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xf5, 0x2f, 0xff, 0xff, + 0x60, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x1c, 0xff, 0xff, 0x90, 0x5, 0xff, + 0xe3, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x9f, 0xfc, 0x0, 0x0, + 0x6b, 0x20, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x6, 0xb1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xbc, 0xcc, 0xcc, 0xcc, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xcc, 0xcc, 0xcc, 0xcb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0xbf, 0xfb, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x7, 0x70, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x10, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x3f, 0xfb, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xd, 0xf5, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x4f, 0xfc, + 0x10, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x5, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x50, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xfe, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8a, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xc0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xf7, 0x0, 0xa, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x20, 0x4f, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc0, + 0xcf, 0xff, 0xff, 0xe8, 0x88, 0x88, 0x88, 0x88, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x68, 0x88, 0x88, 0x88, 0x88, 0xaf, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, + 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x47, 0x77, 0x74, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0x9b, + 0xcd, 0xdb, 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x8d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x93, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd5, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc3, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0xdf, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd9, 0x75, 0x57, 0xad, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0xcf, 0xff, 0xff, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfe, + 0x81, 0x0, 0x0, 0x0, 0x0, 0x39, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x5f, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x43, 0x22, 0x10, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x2, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8, 0xcc, 0xcc, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xad, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xee, 0xed, 0x90, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xde, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xfb, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x1, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0x30, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x93, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0xff, 0xff, + 0xfd, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, + 0x75, 0x57, 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfd, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfe, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x3a, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x7a, 0xcd, 0xdc, 0xb9, 0x62, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x35, 0x66, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6, 0x88, 0x88, 0x88, 0x88, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x10, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xba, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x88, 0x88, + 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x2, 0x30, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x7, 0xff, 0xb1, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xef, 0xff, 0xd1, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xd, 0xff, 0xff, 0xb0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x2d, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xd, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xb, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xb, + 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xe2, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x9, 0xff, 0xd2, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x5, 0x50, 0x0, 0x3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xa2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xc1, 0x0, 0x2, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x8f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0x70, + 0x0, 0xe, 0xff, 0xf9, 0x0, 0x6, 0x88, 0x88, + 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xf2, 0x0, 0x7, 0xff, 0xfe, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x3, 0x40, 0x0, 0x0, 0x3f, + 0xff, 0xfa, 0x0, 0x1, 0xff, 0xff, 0x40, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x8f, 0xfc, 0x10, 0x0, + 0x8, 0xff, 0xff, 0x10, 0x0, 0xbf, 0xff, 0x90, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, 0x6f, 0xff, + 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xcf, 0xff, + 0xfc, 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x3f, + 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0x50, 0x0, 0x4f, 0xff, 0xf0, 0x0, + 0xf, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xb0, 0x0, 0x1f, 0xff, 0xf1, + 0x0, 0xe, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, 0xf, 0xff, + 0xf3, 0x0, 0xd, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x0, 0xe, + 0xff, 0xf3, 0x0, 0xc, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0xc, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, + 0x0, 0x1f, 0xff, 0xf1, 0x0, 0xe, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0x50, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0xf, 0xff, + 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xcf, 0xff, + 0xfc, 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x3f, + 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0xe1, 0x0, 0x1, 0xff, 0xff, 0x70, 0x0, + 0x6f, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x8f, 0xfc, 0x10, 0x0, 0x8, 0xff, 0xff, 0x10, + 0x0, 0xbf, 0xff, 0x90, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x3, 0x40, 0x0, 0x0, 0x3f, 0xff, 0xfa, + 0x0, 0x1, 0xff, 0xff, 0x40, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xf2, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0x70, 0x0, 0xe, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xc0, 0x0, 0x2, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xea, 0x10, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb9, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x9, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x9f, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x9f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x9, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xea, 0x10, + + /* U+F043 "ïƒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x88, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0xff, 0xff, 0xfc, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0xff, 0xff, 0x80, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xff, 0xff, 0xf9, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2d, 0xff, 0xff, 0xc0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xaf, 0xff, 0xff, 0x10, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x6, + 0xff, 0xff, 0xf7, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x1f, + 0xff, 0xff, 0xf1, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xbf, + 0xff, 0xff, 0xc0, 0x0, 0x29, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x13, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xfb, 0x62, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, + 0xff, 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x46, 0x77, 0x65, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F048 "ïˆ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, + 0x88, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x94, 0x0, 0x4f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf9, 0x4, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf1, 0x4f, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0x34, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xf3, 0x4f, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x34, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x4f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xe0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x34, 0xff, 0xff, 0xfe, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x34, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xe6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x34, 0xff, 0xff, 0xfe, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x4f, 0xff, 0xff, 0xe0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, + 0xff, 0xff, 0xfe, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, + 0xff, 0xe0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x34, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0x34, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf2, 0x4f, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x2, 0xef, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2c, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F04B "ï‹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x77, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x91, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfe, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x67, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "ïŒ" */ + 0x1, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xec, 0x50, + 0x0, 0x0, 0x0, 0x1, 0x9e, 0xff, 0xff, 0xff, + 0xff, 0xec, 0x50, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x37, 0x89, + 0x99, 0x99, 0x99, 0x86, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x37, 0x89, 0x99, 0x99, 0x99, 0x86, 0x0, + 0x0, + + /* U+F04D "ï" */ + 0x0, 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x86, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x21, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x1, 0x9e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0x50, + 0x0, + + /* U+F051 "ï‘" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x78, 0x88, 0x85, 0xd, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0x6f, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x7f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x3, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa3, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe5, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x13, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x3, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x2f, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0x4, 0xdf, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xb8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x2a, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x50, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x9e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, + + /* U+F053 "ï“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x12, 0x0, 0x0, + + /* U+F054 "ï”" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x39, 0xaa, 0xa7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, + 0xb8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x85, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x5a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xff, 0xff, 0xff, 0xff, 0xdb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xb9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xdd, 0xda, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F068 "ï¨" */ + 0x1, 0x56, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x30, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x68, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x7, 0xcd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xb2, 0x0, + + /* U+F06E "ï®" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x47, 0xac, 0xef, 0xff, 0xed, 0xb9, 0x62, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x53, + 0x23, 0x47, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x18, 0x99, 0x72, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x13, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x6f, + 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x2, 0x8b, 0xdc, 0xa6, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x53, + 0x23, 0x46, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x37, 0xac, 0xef, 0xff, 0xfd, 0xb9, 0x62, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F070 "ï°" */ + 0x0, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x69, 0xbd, 0xff, 0xfe, 0xdb, + 0x85, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x5a, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xfc, 0x11, + 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x32, 0x34, 0x8c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x4, 0xab, 0xa8, 0x30, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xd2, + 0x2, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0xef, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xb1, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xe4, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x84, 0x22, 0x35, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x15, 0x8b, 0xde, 0xff, 0xfd, 0xca, + 0x74, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x50, 0x0, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xfd, 0xdd, 0xdd, 0xdf, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x99, 0x99, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x20, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x41, 0x27, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x4, 0x89, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x97, + 0x10, 0x0, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x67, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xad, 0xdd, 0xdd, 0xdd, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xdd, + 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xfa, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0xf, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfc, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x41, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x34, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x4, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x5f, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x4, 0xff, 0xfa, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x3f, 0xff, 0xff, 0xa0, 0x0, + 0xf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x3, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0xad, 0xdd, 0xdd, 0xdd, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xdd, 0xdf, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, 0x10, 0x0, + 0x0, 0x0, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xbd, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xb5, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0x70, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x6f, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xfe, 0x5f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfd, 0xb, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, + 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x40, 0x0, 0x8, 0xd9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xc3, 0x0, + + /* U+F078 "ï¸" */ + 0x0, 0x8, 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0xc3, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0xb, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xf4, 0x5f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfd, 0x6f, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xfe, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xb5, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbd, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x64, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x2, 0x67, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x76, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf8, 0xef, + 0xff, 0xfa, 0xcf, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xf9, 0xe, 0xff, 0xff, 0x91, 0xdf, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xfa, 0x0, 0xef, 0xff, + 0xf9, 0x1, 0xef, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfa, + 0x0, 0xe, 0xff, 0xff, 0x90, 0x2, 0xdf, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x12, 0x0, 0x0, 0xef, 0xff, 0xf9, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0x82, 0x0, 0xe, 0xff, 0xff, 0x90, 0x0, 0x49, + 0x50, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xe2, 0x0, 0xef, 0xff, + 0xf9, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xe2, 0xe, 0xff, 0xff, 0x90, 0x6f, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xd1, 0xef, 0xff, 0xf9, + 0x5f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xc7, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x73, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F07B "ï»" */ + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x62, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xea, 0x10, + + /* U+F093 "ï‚“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x23, 0x33, 0x33, 0x33, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x33, 0x33, 0x33, 0x31, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x5, 0x99, + 0x99, 0x99, 0x98, 0x20, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x3f, 0xfb, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xd, 0xf5, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x4f, 0xfc, + 0x10, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x5, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x50, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x17, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfe, 0xb7, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xef, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x9f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x14, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfd, 0xa6, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x67, 0x76, 0x54, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x2, 0x79, 0x98, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x13, 0x31, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, + 0xfd, 0x50, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x76, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0xbf, 0xff, 0xff, + 0x90, 0x3, 0xef, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0xe, 0xff, 0xff, 0xc0, 0x0, 0x4, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x70, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0xe, + 0xff, 0xff, 0xb0, 0x0, 0x3, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x50, 0x1, + 0xcf, 0xff, 0xff, 0x30, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xcb, 0xef, 0xff, 0xff, 0xf0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xba, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xac, 0xde, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x79, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x90, 0x3, 0xef, + 0xff, 0xff, 0x20, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xc0, 0x0, 0x4, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0xe, 0xff, 0xff, 0xb0, + 0x0, 0x3, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xcf, 0xff, 0xff, 0x50, 0x1, 0xcf, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, 0xff, 0xcb, + 0xef, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x46, 0x75, 0x10, 0x0, 0x0, 0x0, 0x6, + 0xac, 0xdb, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xe, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xe, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xe, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0x44, + 0xef, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0x40, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb3, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x5f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, + 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0x40, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xff, 0x40, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xfe, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x11, 0x39, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x40, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd9, 0x9b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x1, 0x9e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x30, + 0x0, + + /* U+F0C9 "" */ + 0x3, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x32, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x15, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x64, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x6c, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x3, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x32, 0x0, + + /* U+F0E0 "" */ + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xea, 0x10, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x10, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x2, 0xf9, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x9f, + 0xff, 0xd2, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x2c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x40, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x2, + 0x9e, 0xe9, 0x20, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x75, 0x57, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xea, 0x10, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x3a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xea, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, 0x64, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x9b, 0xcc, 0xcc, 0xcc, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xcc, 0xcc, 0xcc, 0xb7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x1, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x87, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xdb, 0x10, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0xe, 0xfd, 0x10, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xef, + 0xfd, 0x10, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0xe, 0xff, 0xfd, 0x10, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xef, 0xff, + 0xfd, 0x10, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xe, 0xff, 0xff, 0xfd, 0x10, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0xef, 0xff, 0xff, + 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xe, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x54, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x40, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x8a, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x29, 0xdf, 0xff, 0xff, 0xff, 0xc6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x21, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x67, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xfe, + 0x88, 0x88, 0xaf, 0xff, 0x98, 0x88, 0x9f, 0xff, + 0xa8, 0x88, 0x8f, 0xff, 0xb8, 0x88, 0x8b, 0xff, + 0xf8, 0x88, 0x8a, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0xc, + 0xff, 0x0, 0x0, 0xb, 0xff, 0x10, 0x0, 0x1, + 0xff, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0x0, 0x0, 0xa, 0xff, 0x10, 0x0, + 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, 0x0, + 0x0, 0xc, 0xff, 0x0, 0x0, 0xa, 0xff, 0x10, + 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, + 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, 0xa, 0xff, + 0x10, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x3f, + 0xfe, 0x10, 0x0, 0x1e, 0xff, 0x30, 0x0, 0xd, + 0xff, 0x40, 0x0, 0x4, 0xff, 0xd0, 0x0, 0x3, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcc, 0xcc, 0xdf, 0xff, 0xdc, 0xcc, + 0xcf, 0xff, 0xec, 0xcc, 0xce, 0xff, 0xfc, 0xcc, + 0xce, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0xf, 0xfe, 0x0, + 0x0, 0xb, 0xff, 0x20, 0x0, 0x3, 0xff, 0xa0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xe, 0xfd, + 0x0, 0x0, 0xa, 0xff, 0x10, 0x0, 0x2, 0xff, + 0x90, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xe, + 0xfd, 0x0, 0x0, 0xa, 0xff, 0x10, 0x0, 0x2, + 0xff, 0x90, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0xe, 0xfd, 0x0, 0x0, 0xa, 0xff, 0x10, 0x0, + 0x2, 0xff, 0x90, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0xf, 0xfe, 0x0, 0x0, 0xb, 0xff, 0x20, + 0x0, 0x3, 0xff, 0xa0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcc, 0xcc, 0xdf, 0xff, 0xdc, 0xcc, 0xcf, 0xff, + 0xec, 0xcc, 0xce, 0xff, 0xfc, 0xcc, 0xce, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x3f, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xd0, 0x0, 0x3, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xfe, 0x88, 0x88, + 0xaf, 0xff, 0x98, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x8b, 0xff, 0xf8, 0x88, + 0x8a, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, + 0x0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x76, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xcf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x74, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "ï…›" */ + 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x41, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0xb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x25, 0x79, 0xbc, 0xcc, 0xcc, 0xb9, 0x75, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x8c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x84, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xa8, 0x64, 0x32, 0x22, 0x34, 0x68, + 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xea, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xbf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0xcf, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xc1, + 0x1, 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x15, 0x8b, 0xde, 0xff, 0xfe, 0xdb, + 0x85, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xc1, 0x0, 0x1, 0xcf, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xc1, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc8, 0x41, 0x0, 0x0, 0x1, + 0x48, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xf8, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, 0xfc, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x17, 0xcd, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x63, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfd, + 0x3f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2, 0x88, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfb, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x9f, 0xff, 0xff, 0xa6, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F241 "ï‰" */ + 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x63, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfd, + 0x3f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x2, 0x88, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfb, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x9f, 0xff, 0xff, 0xa6, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F242 "" */ + 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x63, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfd, + 0x3f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x88, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfb, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x9f, 0xff, 0xff, 0xa6, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F243 "" */ + 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x63, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfd, + 0x3f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x88, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfb, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x9f, 0xff, 0xff, 0xa6, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F244 "" */ + 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x63, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfd, + 0x3f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x88, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfb, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x9f, 0xff, 0xff, 0xa6, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xef, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x24, 0x34, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfd, 0xde, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfc, + 0x10, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf1, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x8c, 0xda, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9c, 0xca, + 0x50, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x6, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfb, + 0x20, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0xe, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x9f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x43, 0x49, 0xff, 0xf9, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x45, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdf, 0xff, 0xfe, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x3c, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x74, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x53, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xa0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfe, 0x20, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfd, + 0xde, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x26, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x34, 0x44, 0x44, 0x44, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x34, 0x43, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbe, + 0xff, 0xff, 0xff, 0xff, 0xc8, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x33, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x6, 0x60, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xe0, 0x5, 0xff, 0xff, + 0xff, 0xe2, 0x6f, 0xff, 0xff, 0x30, 0x6, 0xf6, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf1, 0x8, 0xff, + 0xff, 0xfe, 0x20, 0x6, 0xff, 0xff, 0x30, 0x6, + 0xff, 0x60, 0x0, 0xbf, 0xff, 0xff, 0xf4, 0xb, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x5f, 0xff, 0x30, + 0x6, 0xff, 0xf2, 0x0, 0x1f, 0xff, 0xff, 0xf6, + 0xd, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x5, 0xff, + 0x30, 0x5, 0xff, 0x40, 0x0, 0xcf, 0xff, 0xff, + 0xf9, 0xf, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x5f, 0x30, 0x5, 0xf4, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfa, 0xf, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x5, 0x30, 0x5, 0x40, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xfb, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x4, 0x30, 0x5, 0x40, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x4f, 0x30, 0x5, 0xf3, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xfa, 0xd, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x5, 0xff, 0x30, 0x5, 0xff, + 0x30, 0x0, 0x9f, 0xff, 0xff, 0xf9, 0xb, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x5f, 0xff, 0x40, 0x6, + 0xff, 0xe1, 0x0, 0xc, 0xff, 0xff, 0xf7, 0x8, + 0xff, 0xff, 0xfe, 0x20, 0x5, 0xff, 0xff, 0x40, + 0x6, 0xff, 0x60, 0x0, 0x6f, 0xff, 0xff, 0xf5, + 0x5, 0xff, 0xff, 0xff, 0xe2, 0x5f, 0xff, 0xff, + 0x40, 0x6, 0xf6, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xf2, 0x1, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0x40, 0x6, 0x60, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x25, 0x89, 0xab, 0xba, 0x97, 0x51, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "ï‹­" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x88, 0x88, 0x88, 0x88, 0x88, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x60, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xe2, 0x2e, 0xff, 0xff, 0xf4, 0x1b, 0xff, 0xff, + 0xf8, 0x8, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xfe, + 0x0, 0x6f, 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xa0, + 0xa, 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, 0xf2, + 0x2, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xfe, 0x0, + 0x6f, 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xa0, 0xa, + 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, 0xf2, 0x2, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xfe, 0x0, 0x6f, + 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xa0, 0xa, 0xff, + 0xff, 0xe0, 0x6, 0xff, 0xff, 0xf2, 0x2, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xfa, 0x0, 0xaf, 0xff, 0xfe, 0x0, 0x6f, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, + 0xe0, 0x6, 0xff, 0xff, 0xf2, 0x2, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfa, + 0x0, 0xaf, 0xff, 0xfe, 0x0, 0x6f, 0xff, 0xff, + 0x20, 0x2f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, 0xe0, + 0x6, 0xff, 0xff, 0xf2, 0x2, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfa, 0x0, + 0xaf, 0xff, 0xfe, 0x0, 0x6f, 0xff, 0xff, 0x20, + 0x2f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, 0xe0, 0x6, + 0xff, 0xff, 0xf2, 0x2, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfa, 0x0, 0xaf, + 0xff, 0xfe, 0x0, 0x6f, 0xff, 0xff, 0x20, 0x2f, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xa0, 0xa, 0xff, 0xff, 0xe0, 0x6, 0xff, + 0xff, 0xf2, 0x2, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, + 0xfe, 0x0, 0x6f, 0xff, 0xff, 0x20, 0x2f, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xa0, 0xa, 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, + 0xf2, 0x2, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xfe, + 0x0, 0x6f, 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xa0, + 0xa, 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, 0xf2, + 0x2, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xfe, 0x0, + 0x6f, 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xa0, 0xa, + 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, 0xf2, 0x2, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfe, 0x22, 0xef, 0xff, 0xff, 0x41, 0xbf, + 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x61, 0x0, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x47, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x20, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xee, + 0x20, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xfe, 0x20, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xfe, 0x20, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xfe, 0x20, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x3, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x3, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x3, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x3, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xfe, 0xcb, 0x97, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, + 0x54, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xea, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x3e, 0xe3, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x33, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x3e, 0xe3, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xea, 0x20, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x61, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x2e, 0xff, 0xfa, + 0x0, 0x1, 0xff, 0xa0, 0x0, 0x2f, 0xf9, 0x0, + 0x8, 0xff, 0xff, 0xf0, 0x0, 0x2e, 0xff, 0xff, + 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x2, 0xff, 0x90, + 0x0, 0x8f, 0xff, 0xff, 0x0, 0x2e, 0xff, 0xff, + 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x2f, 0xf9, + 0x0, 0x8, 0xff, 0xff, 0xf0, 0x2e, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x2, 0xff, + 0x90, 0x0, 0x8f, 0xff, 0xff, 0x3e, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x2f, + 0xf9, 0x0, 0x8, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x2, + 0xff, 0x90, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, + 0x2f, 0xf9, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, + 0x2, 0xff, 0x90, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x5, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, + 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6c, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf1, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0x10, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xdf, + 0xff, 0xff, 0xf1, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x12, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x71, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 189, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 189, .box_w = 6, .box_h = 31, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 93, .adv_w = 275, .box_w = 13, .box_h = 13, .ofs_x = 2, .ofs_y = 18}, + {.bitmap_index = 178, .adv_w = 495, .box_w = 29, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 628, .adv_w = 437, .box_w = 25, .box_h = 42, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 1153, .adv_w = 593, .box_w = 35, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1696, .adv_w = 483, .box_w = 29, .box_h = 32, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 2160, .adv_w = 148, .box_w = 5, .box_h = 13, .ofs_x = 2, .ofs_y = 18}, + {.bitmap_index = 2193, .adv_w = 237, .box_w = 10, .box_h = 42, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 2403, .adv_w = 238, .box_w = 10, .box_h = 42, .ofs_x = 1, .ofs_y = -9}, + {.bitmap_index = 2613, .adv_w = 282, .box_w = 17, .box_h = 17, .ofs_x = 0, .ofs_y = 16}, + {.bitmap_index = 2758, .adv_w = 410, .box_w = 21, .box_h = 20, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 2968, .adv_w = 160, .box_w = 6, .box_h = 13, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 3007, .adv_w = 270, .box_w = 13, .box_h = 4, .ofs_x = 2, .ofs_y = 10}, + {.bitmap_index = 3033, .adv_w = 160, .box_w = 6, .box_h = 7, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3054, .adv_w = 248, .box_w = 20, .box_h = 43, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 3484, .adv_w = 470, .box_w = 26, .box_h = 31, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3887, .adv_w = 260, .box_w = 12, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4073, .adv_w = 404, .box_w = 24, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4445, .adv_w = 403, .box_w = 24, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4817, .adv_w = 471, .box_w = 28, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5251, .adv_w = 404, .box_w = 24, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5623, .adv_w = 434, .box_w = 24, .box_h = 31, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5995, .adv_w = 421, .box_w = 24, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6367, .adv_w = 453, .box_w = 26, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6770, .adv_w = 434, .box_w = 25, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7158, .adv_w = 160, .box_w = 6, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7230, .adv_w = 160, .box_w = 6, .box_h = 31, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 7323, .adv_w = 410, .box_w = 21, .box_h = 21, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 7544, .adv_w = 410, .box_w = 21, .box_h = 14, .ofs_x = 2, .ofs_y = 9}, + {.bitmap_index = 7691, .adv_w = 410, .box_w = 21, .box_h = 21, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 7912, .adv_w = 403, .box_w = 23, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8269, .adv_w = 728, .box_w = 42, .box_h = 40, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 9109, .adv_w = 515, .box_w = 34, .box_h = 31, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 9636, .adv_w = 533, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10070, .adv_w = 509, .box_w = 29, .box_h = 31, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10520, .adv_w = 582, .box_w = 31, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11001, .adv_w = 472, .box_w = 23, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11358, .adv_w = 447, .box_w = 23, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11715, .adv_w = 543, .box_w = 29, .box_h = 31, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12165, .adv_w = 572, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12599, .adv_w = 218, .box_w = 6, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12692, .adv_w = 361, .box_w = 20, .box_h = 31, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 13002, .adv_w = 506, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 13436, .adv_w = 418, .box_w = 22, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 13777, .adv_w = 672, .box_w = 34, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 14304, .adv_w = 572, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 14738, .adv_w = 591, .box_w = 33, .box_h = 31, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 15250, .adv_w = 508, .box_w = 26, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 15653, .adv_w = 591, .box_w = 35, .box_h = 38, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 16318, .adv_w = 512, .box_w = 27, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 16737, .adv_w = 437, .box_w = 25, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 17125, .adv_w = 413, .box_w = 26, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17528, .adv_w = 557, .box_w = 27, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 17947, .adv_w = 501, .box_w = 33, .box_h = 31, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 18459, .adv_w = 793, .box_w = 48, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 19203, .adv_w = 474, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19668, .adv_w = 455, .box_w = 30, .box_h = 31, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 20133, .adv_w = 463, .box_w = 27, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 20552, .adv_w = 234, .box_w = 10, .box_h = 42, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 20762, .adv_w = 248, .box_w = 19, .box_h = 43, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 21171, .adv_w = 234, .box_w = 11, .box_h = 42, .ofs_x = 0, .ofs_y = -9}, + {.bitmap_index = 21402, .adv_w = 410, .box_w = 20, .box_h = 19, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 21592, .adv_w = 352, .box_w = 22, .box_h = 3, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 21625, .adv_w = 422, .box_w = 12, .box_h = 6, .ofs_x = 5, .ofs_y = 27}, + {.bitmap_index = 21661, .adv_w = 421, .box_w = 21, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 21913, .adv_w = 480, .box_w = 25, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 22326, .adv_w = 402, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22602, .adv_w = 480, .box_w = 25, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 23015, .adv_w = 431, .box_w = 25, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 23315, .adv_w = 249, .box_w = 18, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23612, .adv_w = 486, .box_w = 26, .box_h = 33, .ofs_x = 1, .ofs_y = -9}, + {.bitmap_index = 24041, .adv_w = 479, .box_w = 23, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 24421, .adv_w = 196, .box_w = 6, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 24523, .adv_w = 200, .box_w = 15, .box_h = 43, .ofs_x = -5, .ofs_y = -9}, + {.bitmap_index = 24846, .adv_w = 434, .box_w = 24, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 25242, .adv_w = 196, .box_w = 5, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 25325, .adv_w = 744, .box_w = 39, .box_h = 24, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 25793, .adv_w = 479, .box_w = 23, .box_h = 24, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 26069, .adv_w = 447, .box_w = 26, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 26381, .adv_w = 480, .box_w = 25, .box_h = 33, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 26794, .adv_w = 480, .box_w = 25, .box_h = 33, .ofs_x = 1, .ofs_y = -9}, + {.bitmap_index = 27207, .adv_w = 289, .box_w = 13, .box_h = 24, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 27363, .adv_w = 353, .box_w = 20, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 27603, .adv_w = 291, .box_w = 18, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 27864, .adv_w = 477, .box_w = 23, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 28140, .adv_w = 394, .box_w = 26, .box_h = 24, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28452, .adv_w = 633, .box_w = 40, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 28932, .adv_w = 389, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 29220, .adv_w = 394, .box_w = 26, .box_h = 33, .ofs_x = -1, .ofs_y = -9}, + {.bitmap_index = 29649, .adv_w = 367, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29901, .adv_w = 247, .box_w = 13, .box_h = 42, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 30174, .adv_w = 210, .box_w = 5, .box_h = 42, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 30279, .adv_w = 247, .box_w = 13, .box_h = 42, .ofs_x = 0, .ofs_y = -9}, + {.bitmap_index = 30552, .adv_w = 410, .box_w = 22, .box_h = 8, .ofs_x = 2, .ofs_y = 12}, + {.bitmap_index = 30640, .adv_w = 295, .box_w = 16, .box_h = 15, .ofs_x = 1, .ofs_y = 17}, + {.bitmap_index = 30760, .adv_w = 221, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 8}, + {.bitmap_index = 30801, .adv_w = 704, .box_w = 44, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 31791, .adv_w = 704, .box_w = 44, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 32517, .adv_w = 704, .box_w = 44, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 33375, .adv_w = 704, .box_w = 44, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 34101, .adv_w = 484, .box_w = 31, .box_h = 31, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 34582, .adv_w = 704, .box_w = 44, .box_h = 44, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 35550, .adv_w = 704, .box_w = 42, .box_h = 45, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 36495, .adv_w = 792, .box_w = 50, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 37470, .adv_w = 704, .box_w = 44, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 38460, .adv_w = 792, .box_w = 50, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 39285, .adv_w = 704, .box_w = 44, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 40275, .adv_w = 352, .box_w = 22, .box_h = 35, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 40660, .adv_w = 528, .box_w = 33, .box_h = 35, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41238, .adv_w = 792, .box_w = 50, .box_h = 43, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 42313, .adv_w = 704, .box_w = 44, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 43039, .adv_w = 484, .box_w = 31, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 43737, .adv_w = 616, .box_w = 29, .box_h = 41, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 44332, .adv_w = 616, .box_w = 39, .box_h = 47, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 45249, .adv_w = 616, .box_w = 39, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 46010, .adv_w = 616, .box_w = 39, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 46771, .adv_w = 616, .box_w = 28, .box_h = 41, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 47345, .adv_w = 616, .box_w = 41, .box_h = 39, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 48145, .adv_w = 440, .box_w = 24, .box_h = 39, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 48613, .adv_w = 440, .box_w = 24, .box_h = 39, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 49081, .adv_w = 616, .box_w = 39, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 49842, .adv_w = 616, .box_w = 39, .box_h = 9, .ofs_x = 0, .ofs_y = 12}, + {.bitmap_index = 50018, .adv_w = 792, .box_w = 50, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 50843, .adv_w = 880, .box_w = 56, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 52103, .adv_w = 792, .box_w = 52, .box_h = 45, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 53273, .adv_w = 704, .box_w = 44, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 54131, .adv_w = 616, .box_w = 38, .box_h = 23, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 54568, .adv_w = 616, .box_w = 38, .box_h = 23, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 55005, .adv_w = 880, .box_w = 55, .box_h = 35, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 55968, .adv_w = 704, .box_w = 44, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 56694, .adv_w = 704, .box_w = 44, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 57684, .adv_w = 704, .box_w = 45, .box_h = 45, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 58697, .adv_w = 616, .box_w = 39, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 59458, .adv_w = 616, .box_w = 39, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 60336, .adv_w = 616, .box_w = 39, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 61097, .adv_w = 616, .box_w = 39, .box_h = 35, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 61780, .adv_w = 704, .box_w = 44, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 62506, .adv_w = 440, .box_w = 29, .box_h = 45, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 63159, .adv_w = 616, .box_w = 39, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 64037, .adv_w = 616, .box_w = 39, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 64915, .adv_w = 792, .box_w = 50, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 65740, .adv_w = 704, .box_w = 46, .box_h = 46, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 66798, .adv_w = 528, .box_w = 33, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 67541, .adv_w = 880, .box_w = 55, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 68669, .adv_w = 880, .box_w = 55, .box_h = 29, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 69467, .adv_w = 880, .box_w = 55, .box_h = 29, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 70265, .adv_w = 880, .box_w = 55, .box_h = 29, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 71063, .adv_w = 880, .box_w = 55, .box_h = 29, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 71861, .adv_w = 880, .box_w = 55, .box_h = 29, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 72659, .adv_w = 880, .box_w = 56, .box_h = 35, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 73639, .adv_w = 616, .box_w = 34, .box_h = 45, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 74404, .adv_w = 616, .box_w = 39, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 75282, .adv_w = 704, .box_w = 45, .box_h = 45, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 76295, .adv_w = 880, .box_w = 55, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 77203, .adv_w = 528, .box_w = 33, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 77946, .adv_w = 708, .box_w = 45, .box_h = 29, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 7, 0, 0, 0, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 32, 0, 19, -15, 0, 0, + 0, 0, -39, -42, 5, 33, 15, 12, + -28, 5, 34, 2, 30, 7, 23, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 42, 6, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 14, 0, -21, 0, 0, 0, 0, + 0, -14, 12, 14, 0, 0, -7, 0, + -5, 7, 0, -7, 0, -7, -4, -14, + 0, 0, 0, 0, -7, 0, 0, -9, + -11, 0, 0, -7, 0, -14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + -7, 0, -11, 0, -19, 0, -85, 0, + 0, -14, 0, 14, 21, 1, 0, -14, + 7, 7, 23, 14, -12, 14, 0, 0, + -40, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -19, -8, -34, 0, -28, + -5, 0, 0, 0, 0, 1, 27, 0, + -21, -6, -2, 2, 0, -12, 0, 0, + -5, -52, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -56, -6, 27, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 23, + 0, 7, 0, 0, -14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 27, 6, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, + 14, 7, 21, -7, 0, 0, 14, -7, + -23, -96, 5, 19, 14, 1, -9, 0, + 25, 0, 23, 0, 23, 0, -65, 0, + -8, 21, 0, 23, -7, 14, 7, 0, + 0, 2, -7, 0, 0, -12, 56, 0, + 56, 0, 21, 0, 30, 9, 12, 21, + 0, 0, 0, -26, 0, 0, 0, 0, + 2, -5, 0, 5, -13, -9, -14, 5, + 0, -7, 0, 0, 0, -28, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -46, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -39, 0, -44, 0, 0, 0, + 0, -5, 0, 70, -8, -9, 7, 7, + -6, 0, -9, 7, 0, 0, -37, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -68, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -44, 0, 42, 0, 0, -26, 0, + 23, 0, -48, -68, -48, -14, 21, 0, + 0, -47, 0, 8, -16, 0, -11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 18, 21, -86, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 33, 0, 5, 0, 0, 0, + 0, 0, 5, 5, -8, -14, 0, -2, + -2, -7, 0, 0, -5, 0, 0, 0, + -14, 0, -6, 0, -16, -14, 0, -18, + -23, -23, -13, 0, -14, 0, -14, 0, + 0, 0, 0, -6, 0, 0, 7, 0, + 5, -7, 0, 2, 0, 0, 0, 7, + -5, 0, 0, 0, -5, 7, 7, -2, + 0, 0, 0, -13, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 9, -5, 0, + -8, 0, -12, 0, 0, -5, 0, 21, + 0, 0, -7, 0, 0, 0, 0, 0, + -2, 2, -5, -5, 0, 0, -7, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -4, 0, -7, -8, 0, + 0, 0, 0, 0, 2, 0, 0, -5, + 0, -7, -7, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, -5, -9, 0, -11, 0, -21, + -5, -21, 14, 0, 0, -14, 7, 14, + 19, 0, -18, -2, -8, 0, -2, -33, + 7, -5, 5, -37, 7, 0, 0, 2, + -37, 0, -37, -6, -61, -5, 0, -35, + 0, 14, 20, 0, 9, 0, 0, 0, + 0, 1, 0, -13, -9, 0, -21, 0, + 0, 0, -7, 0, 0, 0, -7, 0, + 0, 0, 0, 0, -4, -4, 0, -4, + -9, 0, 0, 0, 0, 0, 0, 0, + -7, -7, 0, -5, -8, -6, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, -6, 0, -8, + 0, -5, 0, -14, 7, 0, 0, -8, + 4, 7, 7, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 5, + 0, 0, -7, 0, -7, -5, -8, 0, + 0, 0, 0, 0, 0, 0, 6, 0, + -6, 0, 0, 0, 0, -8, -11, 0, + -13, 0, 21, -5, 2, -23, 0, 0, + 19, -35, -37, -30, -14, 7, 0, -6, + -46, -13, 0, -13, 0, -14, 11, -13, + -45, 0, -19, 0, 0, 4, -2, 6, + -5, 0, 7, 1, -21, -27, 0, -35, + -17, -15, -17, -21, -8, -19, -1, -13, + -19, 4, 0, 2, 0, -7, 0, 0, + 0, 5, 0, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + 0, -4, 0, -2, -7, 0, -12, -15, + -15, -2, 0, -21, 0, 0, 0, 0, + 0, 0, -6, 0, 0, 0, 0, 3, + -4, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + -13, 0, 0, 0, 0, -35, -21, 0, + 0, 0, -11, -35, 0, 0, -7, 7, + 0, -19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, -13, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, -13, 0, + 0, 0, 0, 8, 0, 5, -14, -14, + 0, -7, -7, -8, 0, 0, 0, 0, + 0, 0, -21, 0, -7, 0, -11, -7, + 0, -15, -18, -21, -6, 0, -14, 0, + -21, 0, 0, 0, 0, 56, 0, 0, + 4, 0, 0, -9, 0, 7, 0, -30, + 0, 0, 0, 0, 0, -65, -13, 23, + 21, -6, -30, 0, 7, -11, 0, -35, + -4, -9, 7, -49, -7, 9, 0, 11, + -25, -11, -26, -23, -30, 0, 0, -42, + 0, 40, 0, 0, -4, 0, 0, 0, + -4, -4, -7, -19, -23, -1, -65, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -7, 0, -4, -7, -11, 0, 0, + -14, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -14, 0, 0, 14, + -2, 9, 0, -15, 7, -5, -2, -18, + -7, 0, -9, -7, -5, 0, -11, -12, + 0, 0, -6, -2, -5, -12, -8, 0, + 0, -7, 0, 7, -5, 0, -15, 0, + 0, 0, -14, 0, -12, 0, -12, -12, + 7, 0, 0, 0, 0, 0, 0, 0, + 0, -14, 7, 0, -10, 0, -5, -8, + -22, -5, -5, -5, -2, -5, -8, -2, + 0, 0, 0, 0, 0, -7, -6, -6, + 0, 0, 0, 0, 8, -5, 0, -5, + 0, 0, 0, -5, -8, -5, -6, -8, + -6, 0, 6, 28, -2, 0, -19, 0, + -5, 14, 0, -7, -30, -9, 11, 1, + 0, -33, -12, 7, -12, 5, 0, -5, + -6, -23, 0, -11, 4, 0, 0, -12, + 0, 0, 0, 7, 7, -14, -13, 0, + -12, -7, -11, -7, -7, 0, -12, 4, + -13, -12, 21, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -6, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, -9, + 0, 0, -7, -7, 0, 0, 0, 0, + -7, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, -5, 0, 0, 0, 0, + -11, 0, -14, 0, 0, 0, -23, 0, + 5, -15, 14, 1, -5, -33, 0, 0, + -15, -7, 0, -28, -18, -20, 0, 0, + -30, -7, -28, -27, -34, 0, -18, 0, + 6, 47, -9, 0, -16, -7, -2, -7, + -12, -19, -13, -26, -29, -16, -7, 0, + 0, -5, 0, 2, 0, 0, -49, -6, + 21, 15, -15, -26, 0, 2, -22, 0, + -35, -5, -7, 14, -65, -9, 2, 0, + 0, -46, -8, -37, -7, -51, 0, 0, + -49, 0, 42, 2, 0, -5, 0, 0, + 0, 0, -4, -5, -27, -5, 0, -46, + 0, 0, 0, 0, -23, 0, -6, 0, + -2, -20, -33, 0, 0, -4, -11, -21, + -7, 0, -5, 0, 0, 0, 0, -32, + -7, -23, -23, -6, -12, -18, -7, -12, + 0, -14, -6, -23, -11, 0, -8, -13, + -7, -13, 0, 4, 0, -5, -23, 0, + 14, 0, -13, 0, 0, 0, 0, 8, + 0, 5, -14, 29, 0, -7, -7, -8, + 0, 0, 0, 0, 0, 0, -21, 0, + -7, 0, -11, -7, 0, -15, -18, -21, + -6, 0, -14, 6, 28, 0, 0, 0, + 0, 56, 0, 0, 4, 0, 0, -9, + 0, 7, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -5, -14, 0, 0, 0, 0, 0, -4, + 0, 0, 0, -7, -7, 0, 0, -14, + -7, 0, 0, -14, 0, 12, -4, 0, + 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 11, 14, 6, -6, 0, -23, + -11, 0, 21, -23, -23, -14, -14, 28, + 13, 7, -61, -5, 14, -7, 0, -7, + 8, -7, -25, 0, -7, 7, -9, -6, + -21, -6, 0, 0, 21, 14, 0, -20, + 0, -39, -9, 20, -9, -27, 2, -9, + -23, -23, -7, 28, 7, 0, -11, 0, + -19, 0, 6, 23, -16, -26, -28, -18, + 21, 0, 2, -51, -6, 7, -12, -5, + -16, 0, -15, -26, -11, -11, -6, 0, + 0, -16, -15, -7, 0, 21, 16, -7, + -39, 0, -39, -10, 0, -25, -41, -2, + -23, -12, -23, -20, 19, 0, 0, -9, + 0, -14, -6, 0, -7, -13, 0, 12, + -23, 7, 0, 0, -37, 0, -7, -15, + -12, -5, -21, -18, -23, -16, 0, -21, + -7, -16, -13, -21, -7, 0, 0, 2, + 33, -12, 0, -21, -7, 0, -7, -14, + -16, -19, -20, -27, -9, -14, 14, 0, + -11, 0, -35, -8, 4, 14, -23, -26, + -14, -23, 23, -7, 4, -65, -13, 14, + -15, -12, -26, 0, -21, -30, -8, -7, + -6, -7, -15, -21, -2, 0, 0, 21, + 20, -5, -46, 0, -42, -16, 17, -27, + -48, -14, -25, -30, -35, -23, 14, 0, + 0, 0, 0, -8, 0, 0, 7, -8, + 14, 5, -13, 14, 0, 0, -22, -2, + 0, -2, 0, 2, 2, -6, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 6, 21, 1, 0, -8, 0, 0, + 0, 0, -5, -5, -8, 0, 0, 0, + 2, 6, 0, 0, 0, 0, 6, 0, + -6, 0, 27, 0, 13, 2, 2, -9, + 0, 14, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 21, 0, 20, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -42, 0, -7, 12, 0, 21, + 0, 0, 70, 8, -14, -14, 7, 7, + -5, 2, -35, 0, 0, 34, -42, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -48, 27, 99, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -42, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, -13, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, -19, 0, + 0, 2, 0, 0, 7, 91, -14, -6, + 23, 19, -19, 7, 0, 0, 7, 7, + -9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -92, 20, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -20, + 0, 0, 0, -19, 0, 0, 0, 0, + -15, -4, 0, 0, 0, -15, 0, -8, + 0, -33, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -47, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -7, 0, 0, -13, 0, -11, 0, + -19, 0, 0, 0, -12, 7, -8, 0, + 0, -19, -7, -16, 0, 0, -19, 0, + -7, 0, -33, 0, -8, 0, 0, -57, + -13, -28, -8, -25, 0, 0, -47, 0, + -19, -4, 0, 0, 0, 0, 0, 0, + 0, 0, -11, -13, -6, -12, 0, 0, + 0, 0, -15, 0, -15, 9, -8, 14, + 0, -5, -16, -5, -12, -13, 0, -8, + -4, -5, 5, -19, -2, 0, 0, 0, + -62, -6, -10, 0, -15, 0, -5, -33, + -6, 0, 0, -5, -6, 0, 0, 0, + 0, 5, 0, -5, -12, -5, 12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, 0, + 0, -15, 0, -5, 0, 0, 0, -14, + 7, 0, 0, 0, -19, -7, -14, 0, + 0, -20, 0, -7, 0, -33, 0, 0, + 0, 0, -68, 0, -14, -26, -35, 0, + 0, -47, 0, -5, -11, 0, 0, 0, + 0, 0, 0, 0, 0, -7, -11, -4, + -11, 2, 0, 0, 12, -9, 0, 22, + 34, -7, -7, -21, 8, 34, 12, 15, + -19, 8, 30, 8, 20, 15, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 44, 33, -13, -7, 0, -6, + 56, 30, 56, 0, 0, 0, 7, 0, + 0, 26, 0, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 10, + 0, 0, 0, 0, -59, -8, -6, -29, + -34, 0, 0, -47, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, -59, -8, -6, + -29, -34, 0, 0, -28, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -6, 0, 0, 0, -16, 7, 0, -7, + 6, 13, 7, -21, 0, -1, -6, 7, + 0, 6, 0, 0, 0, 0, -18, 0, + -6, -5, -14, 0, -6, -28, 0, 44, + -7, 0, -15, -5, 0, -5, -12, 0, + -7, -20, -14, -8, 0, 0, 0, -11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 0, -59, + -8, -6, -29, -34, 0, 0, -47, 0, + 0, 0, 0, 0, 0, 35, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -11, 0, -23, -8, -6, 21, -6, -7, + -28, 2, -4, 2, -5, -19, 1, 15, + 1, 6, 2, 6, -17, -28, -8, 0, + -27, -13, -19, -30, -27, 0, -11, -14, + -8, -9, -6, -5, -8, -5, 0, -5, + -2, 11, 0, 11, -5, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, -7, -7, 0, 0, + -19, 0, -4, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -42, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, -7, 0, -9, + 0, 0, 0, 0, -6, 0, 0, -12, + -7, 7, 0, -12, -13, -5, 0, -20, + -5, -15, -5, -8, 0, -12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -47, 0, 23, 0, 0, -13, 0, + 0, 0, 0, -9, 0, -7, 0, 0, + -4, 0, 0, -5, 0, -16, 0, 0, + 30, -9, -23, -22, 5, 8, 8, -1, + -20, 5, 11, 5, 21, 5, 23, -5, + -19, 0, 0, -28, 0, 0, -21, -19, + 0, 0, -14, 0, -9, -12, 0, -11, + 0, -11, 0, -5, 11, 0, -6, -21, + -7, 26, 0, 0, -6, 0, -14, 0, + 0, 9, -16, 0, 7, -7, 6, 1, + 0, -23, 0, -5, -2, 0, -7, 8, + -6, 0, 0, 0, -29, -8, -15, 0, + -21, 0, 0, -33, 0, 26, -7, 0, + -13, 0, 4, 0, -7, 0, -7, -21, + 0, -7, 7, 0, 0, 0, 0, -5, + 0, 0, 7, -9, 2, 0, 0, -8, + -5, 0, -8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -44, 0, 15, 0, + 0, -6, 0, 0, 0, 0, 1, 0, + -7, -7, 0, 0, 0, 14, 0, 16, + 0, 0, 0, 0, 0, -44, -40, 2, + 30, 21, 12, -28, 5, 30, 0, 26, + 0, 14, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 37, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserrat_44 = { +#else +lv_font_t lv_font_montserrat_44 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 49, /*The maximum line height required by the font*/ + .base_line = 9, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -3, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_44*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_46.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_46.c new file mode 100644 index 0000000..745b42c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_46.c @@ -0,0 +1,11877 @@ +/******************************************************************************* + * Size: 46 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 46 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_46.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_46 + #define LV_FONT_MONTSERRAT_46 1 +#endif + +#if LV_FONT_MONTSERRAT_46 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x6f, 0xff, 0xfc, 0x5, 0xff, 0xff, 0xb0, 0x5f, + 0xff, 0xfa, 0x4, 0xff, 0xff, 0xa0, 0x3f, 0xff, + 0xf9, 0x3, 0xff, 0xff, 0x90, 0x2f, 0xff, 0xf8, + 0x2, 0xff, 0xff, 0x70, 0x1f, 0xff, 0xf7, 0x0, + 0xff, 0xff, 0x60, 0xf, 0xff, 0xf5, 0x0, 0xff, + 0xff, 0x50, 0xf, 0xff, 0xf4, 0x0, 0xef, 0xff, + 0x40, 0xd, 0xff, 0xf3, 0x0, 0xdf, 0xff, 0x20, + 0xc, 0xff, 0xf2, 0x0, 0xcf, 0xff, 0x10, 0xb, + 0xff, 0xf0, 0x0, 0xbf, 0xff, 0x0, 0xa, 0xff, + 0xf0, 0x0, 0x9f, 0xff, 0x0, 0x3, 0x66, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, + 0xea, 0x10, 0x5f, 0xff, 0xfb, 0xb, 0xff, 0xff, + 0xf1, 0xbf, 0xff, 0xff, 0x16, 0xff, 0xff, 0xb0, + 0x7, 0xde, 0xa1, 0x0, + + /* U+0022 "\"" */ + 0x1f, 0xff, 0xc0, 0x0, 0xc, 0xff, 0xf1, 0x1f, + 0xff, 0xb0, 0x0, 0xc, 0xff, 0xf0, 0xf, 0xff, + 0xb0, 0x0, 0xb, 0xff, 0xf0, 0xf, 0xff, 0xa0, + 0x0, 0xb, 0xff, 0xf0, 0xf, 0xff, 0xa0, 0x0, + 0xa, 0xff, 0xf0, 0xf, 0xff, 0x90, 0x0, 0xa, + 0xff, 0xf0, 0xf, 0xff, 0x90, 0x0, 0xa, 0xff, + 0xe0, 0xf, 0xff, 0x90, 0x0, 0x9, 0xff, 0xe0, + 0xe, 0xff, 0x80, 0x0, 0x9, 0xff, 0xd0, 0xe, + 0xff, 0x80, 0x0, 0x9, 0xff, 0xd0, 0xe, 0xff, + 0x70, 0x0, 0x8, 0xff, 0xd0, 0xd, 0xff, 0x70, + 0x0, 0x8, 0xff, 0xc0, 0x8, 0xaa, 0x40, 0x0, + 0x5, 0xaa, 0x70, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x16, 0x66, 0x66, 0x6e, 0xff, + 0xa6, 0x66, 0x66, 0x66, 0x6f, 0xff, 0x96, 0x66, + 0x66, 0x60, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x90, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x50, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x56, 0x66, 0x66, 0xaf, + 0xfe, 0x66, 0x66, 0x66, 0x66, 0xbf, 0xfd, 0x66, + 0x66, 0x66, 0x40, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x70, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x59, 0xce, 0xff, 0xff, 0xec, 0x95, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0xe, 0xff, 0xff, 0xf9, 0x41, + 0xff, 0xf1, 0x25, 0x8d, 0xff, 0xfa, 0x0, 0x0, + 0x7f, 0xff, 0xfc, 0x20, 0x0, 0xff, 0xf0, 0x0, + 0x0, 0x4c, 0xf3, 0x0, 0x0, 0xef, 0xff, 0xe1, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x40, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x30, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x30, 0x0, + 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x60, 0x0, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xfe, 0x83, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf4, 0x9f, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf0, 0x0, 0x6e, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, + 0x1, 0xdf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x3f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0xe, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, + 0xd, 0xff, 0xfa, 0x0, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf0, 0x0, 0x0, 0x1f, 0xff, 0xf8, + 0x0, 0xed, 0x20, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x6, 0xff, 0xf9, + 0x20, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x7, 0xff, + 0xff, 0xd0, 0xd, 0xff, 0xff, 0xfb, 0x63, 0x10, + 0xff, 0xf0, 0x26, 0xcf, 0xff, 0xff, 0x40, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x26, 0xad, 0xef, 0xff, 0xff, 0xeb, 0x72, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x78, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0025 "%" */ + 0x0, 0x0, 0x17, 0xce, 0xfd, 0x93, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xfb, 0xbd, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xa1, 0x0, 0x5, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, 0x6, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf4, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0x90, 0x0, 0x0, 0x6, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xfa, 0x0, 0x0, 0x1, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, + 0x0, 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xf8, 0x0, 0x0, 0x6f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x50, 0x0, 0x1f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x60, 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, 0xb, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xfe, 0x20, 0x0, 0x0, 0xaf, 0xfa, + 0x0, 0x6, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, 0x51, 0x3, + 0xbf, 0xff, 0x20, 0x1, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xbf, 0xfc, + 0x0, 0x0, 0x5a, 0xef, 0xeb, 0x60, 0x0, 0x0, + 0x0, 0x1, 0xaf, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x6f, 0xff, 0x20, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x27, 0x9a, 0x84, + 0x0, 0x0, 0x1f, 0xff, 0x70, 0x0, 0xcf, 0xff, + 0xdb, 0xcf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, 0x0, + 0x8f, 0xfe, 0x30, 0x0, 0x2d, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf2, 0x0, 0xf, 0xff, 0x30, 0x0, 0x0, 0x2f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf7, 0x0, 0x6, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfd, 0x0, 0x0, 0x9f, + 0xf5, 0x0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x30, + 0x0, 0xc, 0xff, 0x20, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x70, 0x0, 0x0, 0xdf, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, + 0x10, 0x0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0xcf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x3f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfa, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf3, 0x0, 0x0, 0x2, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xe3, 0x0, 0x2, + 0xdf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfd, 0xbc, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xbe, 0xfe, 0xb6, + 0x0, 0x0, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x0, 0x39, 0xce, 0xff, 0xda, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xfa, 0x64, 0x58, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf4, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, + 0x4e, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf4, 0x0, 0x9f, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xf7, 0xef, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0x95, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x37, 0x20, 0x0, 0x0, 0x5f, 0xff, + 0xfd, 0x30, 0x4, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x8, 0xff, 0xd2, 0x0, 0x3f, 0xff, 0xfb, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xcf, + 0xff, 0x10, 0xd, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xf3, 0x0, 0x1f, 0xff, 0xd0, + 0x5, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf3, 0x7, 0xff, 0xf8, 0x0, 0xaf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xf3, 0xef, 0xff, 0x20, 0xd, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xef, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0xd, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf4, 0x0, 0x5, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xc, 0xff, + 0xff, 0xf8, 0x20, 0x0, 0x0, 0x15, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xec, 0xcc, 0xef, 0xff, 0xff, 0xff, 0x53, + 0xff, 0xff, 0xf3, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x4, 0xff, + 0xff, 0x80, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd6, 0x0, 0x0, 0x4, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x48, 0xce, 0xff, 0xfd, 0xb7, + 0x30, 0x0, 0x0, 0x0, 0x4, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x1f, 0xff, 0xc1, 0xff, 0xfb, 0xf, 0xff, 0xb0, + 0xff, 0xfa, 0xf, 0xff, 0xa0, 0xff, 0xf9, 0xf, + 0xff, 0x90, 0xff, 0xf9, 0xe, 0xff, 0x80, 0xef, + 0xf8, 0xe, 0xff, 0x70, 0xdf, 0xf7, 0x8, 0xaa, + 0x40, + + /* U+0028 "(" */ + 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x1, + 0xef, 0xff, 0x40, 0x0, 0x0, 0x8f, 0xff, 0xb0, + 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, 0x0, 0x6, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x70, + 0x0, 0x0, 0x2f, 0xff, 0xf1, 0x0, 0x0, 0x8, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x5, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, + 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x1f, 0xff, 0xf3, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x6, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, + 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xb0, 0x0, 0x0, 0x9, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x9, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, 0x0, + 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xe0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xe, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x80, 0x0, 0x0, + 0x8, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xe0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x30, 0x0, + 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x10, + 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x40, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xc0, + + /* U+0029 ")" */ + 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x80, 0x0, 0x0, 0x4, 0xff, 0xff, 0x10, 0x0, + 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x9, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x50, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x10, 0x0, 0x0, 0xf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x70, 0x0, 0x0, 0xa, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, + 0x0, 0x0, 0x6, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xff, + 0xf2, 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xe0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xa0, 0x0, 0x0, 0xd, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x6, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xa0, + 0x0, 0x0, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x9f, 0xff, 0xb0, + 0x0, 0x0, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x5, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0xc, + 0xff, 0xf8, 0x0, 0x0, 0x4, 0xff, 0xfe, 0x0, + 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x2, 0xff, + 0x80, 0x0, 0x1a, 0x50, 0x8, 0xff, 0xb2, 0x2, + 0xff, 0x80, 0x7, 0xff, 0xe0, 0xd, 0xff, 0xff, + 0x72, 0xff, 0x84, 0xdf, 0xff, 0xf4, 0x0, 0x8f, + 0xff, 0xfe, 0xff, 0xef, 0xff, 0xfb, 0x30, 0x0, + 0x1, 0xaf, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x8, 0xff, 0xff, 0xd6, 0xff, + 0xaa, 0xff, 0xff, 0xc2, 0xb, 0xff, 0xf7, 0x2, + 0xff, 0x80, 0x3d, 0xff, 0xf2, 0x3, 0xfa, 0x10, + 0x2, 0xff, 0x80, 0x0, 0x7f, 0x90, 0x0, 0x20, + 0x0, 0x2, 0xff, 0x80, 0x0, 0x1, 0x10, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x66, 0x30, 0x0, + 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0x47, 0x77, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xab, 0xbb, + 0xbb, 0xbb, 0xdf, 0xff, 0xcb, 0xbb, 0xbb, 0xbb, + 0x70, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+002C "," */ + 0x0, 0x0, 0x0, 0x0, 0x6e, 0xfb, 0x10, 0x5f, + 0xff, 0xfc, 0xb, 0xff, 0xff, 0xf2, 0xbf, 0xff, + 0xff, 0x37, 0xff, 0xff, 0xf1, 0xa, 0xff, 0xfd, + 0x0, 0xf, 0xff, 0x70, 0x3, 0xff, 0xf2, 0x0, + 0x7f, 0xfd, 0x0, 0xb, 0xff, 0x80, 0x0, 0xff, + 0xf2, 0x0, 0x3f, 0xfd, 0x0, 0x7, 0xff, 0x80, + 0x0, + + /* U+002D "-" */ + 0x5e, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, + + /* U+002E "." */ + 0x0, 0x45, 0x10, 0x1, 0xcf, 0xff, 0x50, 0x9f, + 0xff, 0xff, 0xd, 0xff, 0xff, 0xf3, 0xcf, 0xff, + 0xff, 0x25, 0xff, 0xff, 0xc0, 0x6, 0xdf, 0xa1, + 0x0, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xff, 0xec, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xb6, 0x42, 0x47, 0xdf, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xfd, + 0x30, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, 0x0, 0x1f, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xfa, 0x0, 0x6, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf1, 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x1f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfb, 0x4, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x29, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf4, 0xbf, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x6c, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf6, + 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x7c, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf6, 0xbf, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x69, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x24, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfb, 0x0, 0xcf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x70, 0x6, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf1, 0x0, 0x1f, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfa, 0x0, 0x0, + 0x7f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x20, 0x0, 0x0, 0xdf, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xb6, + 0x32, 0x47, 0xdf, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xff, 0xed, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x1, 0x11, 0x11, 0x16, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, + + /* U+0032 "2" */ + 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xfe, 0xdb, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xa6, 0x43, + 0x24, 0x6b, 0xff, 0xff, 0xff, 0x30, 0x0, 0xbf, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xfb, 0x0, 0x0, 0x9f, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xc1, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, + + /* U+0033 "3" */ + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xfa, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x56, 0x66, 0x7a, 0xdf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3c, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x10, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xe0, 0x5, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf9, 0x0, 0xdf, 0xff, 0x92, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0x20, 0x7f, 0xff, + 0xff, 0xfd, 0x96, 0x43, 0x23, 0x6a, 0xff, 0xff, + 0xff, 0x80, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x48, 0xbd, 0xff, 0xff, 0xdb, + 0x72, 0x0, 0x0, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x3, 0x33, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xa1, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0, 0x0, + 0xb, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfd, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xb8, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x25, 0x8d, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xa0, 0x3, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf7, 0x0, 0xcf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x20, 0x5f, 0xff, 0xd6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xb0, 0xe, 0xff, + 0xff, 0xff, 0xb7, 0x53, 0x23, 0x47, 0xdf, 0xff, + 0xff, 0xf2, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0x9c, 0xef, 0xff, 0xec, + 0x95, 0x0, 0x0, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xbe, 0xff, + 0xfe, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x81, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xfa, 0x62, 0x10, 0x12, 0x48, 0xef, 0x20, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x3, 0x8c, 0xef, + 0xfe, 0xc9, 0x40, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xe0, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0xbf, 0xff, 0xd0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0xcf, 0xff, 0xd8, 0xff, 0xff, 0xff, 0xdc, 0xdf, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xfa, 0x40, 0x0, 0x0, 0x4b, 0xff, 0xff, + 0xf9, 0x0, 0xbf, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x20, 0xaf, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x90, 0x9f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xd0, 0x6f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x2f, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf1, 0xf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf1, + 0x9, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x3, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xc0, 0x0, 0xcf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x70, 0x0, + 0x2f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xfe, 0x10, 0x0, 0x7, 0xff, 0xff, + 0xfa, 0x40, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xec, + 0xdf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, 0xfe, + 0xb7, 0x20, 0x0, 0x0, 0x0, + + /* U+0037 "7" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xaf, 0xff, 0xd1, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x1b, 0xff, 0xff, 0x1a, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xa0, 0xaf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, 0xa, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfc, 0x0, 0xaf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, + 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x0, 0x3, 0x8b, 0xdf, 0xff, 0xec, + 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, + 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xfd, 0xcd, 0xef, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xa4, 0x0, 0x0, 0x1, 0x6d, 0xff, 0xff, 0xf4, + 0x0, 0x2, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xfc, 0x0, 0x8, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0x20, 0xb, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, + 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x60, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x60, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x5, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfe, 0x0, 0x0, 0xdf, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xf7, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xd7, 0x31, 0x0, + 0x14, 0x9f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xfe, 0xb9, 0x99, 0xad, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x5, 0xff, 0xff, 0xfa, 0x30, 0x0, + 0x0, 0x0, 0x16, 0xef, 0xff, 0xfd, 0x10, 0x1e, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x90, 0x7f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xf1, 0xbf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, 0xef, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf8, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, + 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf8, 0xbf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf5, 0x7f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf1, 0x1f, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xa0, 0x6, 0xff, 0xff, 0xfe, + 0x72, 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0xcd, + 0xef, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xff, 0xed, + 0xa7, 0x30, 0x0, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x0, 0x6, 0xad, 0xff, 0xfe, 0xc8, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xec, 0xde, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfd, + 0x61, 0x0, 0x0, 0x27, 0xef, 0xff, 0xfd, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x80, 0x0, 0x1f, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf9, 0x0, + 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x50, 0xbf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x80, 0x9f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xc0, 0x6f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xe0, 0x2f, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf0, 0xb, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xff, 0xff, 0xf1, 0x2, 0xff, 0xff, 0xff, 0xa4, + 0x10, 0x2, 0x5a, 0xff, 0xff, 0xef, 0xff, 0xf2, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, 0x4, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x7f, + 0xff, 0xf1, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xc4, 0x0, 0x8f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x4, 0x8a, 0xcc, 0xb9, 0x72, 0x0, + 0x0, 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x63, + 0x10, 0x12, 0x48, 0xdf, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x37, 0xad, 0xef, 0xfe, 0xda, 0x61, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003A ":" */ + 0x6, 0xdf, 0xa1, 0x5, 0xff, 0xff, 0xc0, 0xcf, + 0xff, 0xff, 0x2d, 0xff, 0xff, 0xf3, 0x9f, 0xff, + 0xfe, 0x1, 0xcf, 0xff, 0x50, 0x0, 0x45, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x45, 0x10, 0x1, 0xcf, 0xff, 0x50, 0x9f, 0xff, + 0xff, 0xd, 0xff, 0xff, 0xf3, 0xcf, 0xff, 0xff, + 0x25, 0xff, 0xff, 0xc0, 0x6, 0xdf, 0xa1, 0x0, + + /* U+003B ";" */ + 0x6, 0xdf, 0xa1, 0x5, 0xff, 0xff, 0xc0, 0xcf, + 0xff, 0xff, 0x2d, 0xff, 0xff, 0xf3, 0x9f, 0xff, + 0xfe, 0x1, 0xcf, 0xff, 0x50, 0x0, 0x45, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6e, 0xfb, 0x10, 0x5f, 0xff, + 0xfc, 0xb, 0xff, 0xff, 0xf2, 0xbf, 0xff, 0xff, + 0x37, 0xff, 0xff, 0xf1, 0xa, 0xff, 0xfd, 0x0, + 0xf, 0xff, 0x70, 0x3, 0xff, 0xf2, 0x0, 0x7f, + 0xfd, 0x0, 0xb, 0xff, 0x80, 0x0, 0xff, 0xf2, + 0x0, 0x3f, 0xfd, 0x0, 0x7, 0xff, 0x80, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5c, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8e, + 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, 0x0, 0x0, + 0x5b, 0xff, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, + 0x0, 0x28, 0xef, 0xff, 0xff, 0xff, 0xa4, 0x0, + 0x0, 0x0, 0x5, 0xbf, 0xff, 0xff, 0xff, 0xd7, + 0x10, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, 0xff, + 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe8, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0xff, 0xff, 0xff, 0xfe, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6d, 0xff, 0xff, + 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, + 0xff, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3a, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0x80, + + /* U+003D "=" */ + 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + + /* U+003E ">" */ + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xfa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xd7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6c, 0xff, 0xff, 0xff, 0xfd, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9f, 0xff, + 0xff, 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xd7, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, + 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x39, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xdf, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, + 0xff, 0xe8, 0x20, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x4a, + 0xff, 0xff, 0xff, 0xfe, 0x82, 0x0, 0x0, 0x0, + 0x28, 0xef, 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xe8, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfb, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x0, 0x16, 0xac, 0xef, 0xfe, 0xdb, + 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x1e, 0xff, 0xff, 0xfd, 0x73, 0x10, 0x1, 0x49, + 0xff, 0xff, 0xff, 0x40, 0x3e, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xb0, + 0x1, 0xbf, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xf0, 0x0, 0x6, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x77, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0xed, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xed, 0x60, + 0x0, 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x69, 0xcd, 0xef, 0xfe, 0xdb, 0x96, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xb8, 0x53, 0x21, 0x12, 0x36, 0x8c, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xfc, 0x51, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xdf, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, + 0xff, 0xdb, 0x61, 0x0, 0xa, 0xff, 0xf5, 0x0, + 0x5f, 0xff, 0x60, 0x0, 0x0, 0x4f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xa, 0xff, 0xf5, 0x0, 0xa, 0xff, + 0xe0, 0x0, 0x0, 0xbf, 0xfe, 0x10, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x1a, 0xff, 0xf5, 0x0, 0x1, 0xef, 0xf7, 0x0, + 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfd, 0xb9, 0xad, 0xff, 0xff, 0xdb, 0xff, + 0xf5, 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x9, 0xff, + 0xe0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xfa, 0x20, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x1f, 0xff, 0x40, 0xe, 0xff, 0x90, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xb, + 0xff, 0x90, 0x2f, 0xff, 0x40, 0x0, 0x0, 0x3f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x5, 0xff, 0xd0, + 0x5f, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf5, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x8f, 0xfd, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xff, 0xf2, 0xaf, 0xfb, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xef, 0xf3, 0xbf, 0xfa, 0x0, 0x0, 0x4, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xdf, 0xf4, + 0xcf, 0xf9, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xcf, 0xf5, 0xcf, 0xf9, + 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xcf, 0xf4, 0xbf, 0xfa, 0x0, 0x0, + 0x4, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xdf, 0xf4, 0xaf, 0xfb, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf2, + 0x8f, 0xfe, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf5, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x5f, 0xff, + 0x10, 0x0, 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf5, 0x0, + 0x0, 0x5, 0xff, 0xd0, 0x2f, 0xff, 0x50, 0x0, + 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xb, + 0xff, 0x80, 0xd, 0xff, 0xa0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x2f, 0xff, 0x30, + 0x8, 0xff, 0xf1, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xfa, 0x20, 0x0, 0x0, 0x19, 0xff, 0xfe, 0xff, + 0xfe, 0x10, 0x1, 0xdf, 0xfc, 0x0, 0x2, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfc, + 0xa9, 0x9c, 0xff, 0xff, 0xc2, 0xff, 0xff, 0xea, + 0xaf, 0xff, 0xf3, 0x0, 0x0, 0xbf, 0xfe, 0x10, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xbe, 0xff, 0xeb, 0x71, 0x0, 0x0, 0x0, + 0x7c, 0xff, 0xd9, 0x20, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xfc, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3a, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0xff, 0xff, 0xff, 0xc8, 0x53, 0x32, 0x23, + 0x57, 0xae, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7a, 0xce, + 0xef, 0xfe, 0xda, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x8e, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf1, 0x7f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfa, 0x1, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x30, 0xa, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0x0, 0x3f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, 0x0, + 0x0, 0xcf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf4, 0x0, 0x0, 0x1f, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xb0, 0x0, 0x8, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x20, 0x0, 0xef, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf9, 0x0, 0x6f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf1, + 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x70, + + /* U+0042 "B" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xee, 0xb8, 0x50, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe8, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x2, 0xff, 0xff, 0xec, 0xcc, + 0xcc, 0xcc, 0xcc, 0xde, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xfc, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x90, 0x2, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfb, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xc0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, + 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0x2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf4, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfd, 0x0, 0x2, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xff, 0x20, 0x0, 0x2f, 0xff, 0xfe, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xdf, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x36, 0xbf, + 0xff, 0xff, 0xb0, 0x2, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0x60, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfe, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x62, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x72, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf5, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x22, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xd0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x7e, 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xec, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xdf, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xec, 0x96, 0x10, 0x0, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, + 0xff, 0xfd, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xfb, 0x74, 0x32, 0x45, 0x8d, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, + 0xff, 0xe2, 0x0, 0x8, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfe, + 0x20, 0x0, 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xb2, 0x0, + 0x0, 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xc2, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xfe, 0x20, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x3b, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xfb, 0x74, 0x32, 0x45, 0x8d, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, + 0xff, 0xfd, 0xb8, 0x40, 0x0, 0x0, 0x0, + + /* U+0044 "D" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xec, 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, 0x11, 0x12, + 0x46, 0xaf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xa0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf5, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x60, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xc0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xc0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x60, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf5, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xa0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, 0x11, 0x12, + 0x36, 0xaf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xec, 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x2, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x32, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, + + /* U+0046 "F" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x10, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, + 0xff, 0xfe, 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xfc, 0x75, 0x32, 0x35, 0x7b, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xf5, 0x0, 0x8, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0x50, 0x0, 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x75, 0x0, + 0x0, 0xcf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xbb, 0xb6, 0xbf, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf9, 0x8f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf9, 0x5f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf9, 0x1f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf9, 0xb, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf9, 0x4, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, + 0x0, 0xcf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, + 0x3f, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x7, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf9, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xf9, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xfc, 0x75, 0x32, 0x34, 0x7a, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, + 0xff, 0xfe, 0xc9, 0x51, 0x0, 0x0, 0x0, + + /* U+0048 "H" */ + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x82, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x82, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xf7, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x12, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x80, + + /* U+0049 "I" */ + 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, + 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, + 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, + 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, + 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, + 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, + 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, + 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, + 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, + 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, + 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, + 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, + 0x2f, 0xff, 0xf7, + + /* U+004A "J" */ + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x18, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfe, 0x0, 0x2, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xb0, 0x1, 0xdf, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf7, 0x0, 0xbf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, 0x2f, 0xff, + 0xff, 0xd7, 0x31, 0x3, 0x8f, 0xff, 0xff, 0xb0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfe, 0xc8, 0x30, + 0x0, 0x0, 0x0, + + /* U+004B "K" */ + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfa, 0x0, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xb0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x1, + 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0xc, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf7, 0x0, 0xbf, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0xb, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf7, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xfe, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xbf, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x1d, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x2, 0xef, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0x30, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xe1, + 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfc, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x90, + + /* U+004C "L" */ + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, + + /* U+004D "M" */ + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xf0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf0, 0x2f, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xf0, 0x2f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf0, + 0x2f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xf0, 0x2f, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xf0, 0x2f, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xf0, 0x2f, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xf0, + 0x2f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf0, 0x2f, 0xff, 0xfc, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xaf, 0xff, 0xf0, 0x2f, 0xff, 0xf4, 0xef, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xfb, 0x5f, 0xff, 0xf0, 0x2f, 0xff, + 0xf4, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x5f, 0xff, 0xf1, + 0x2f, 0xff, 0xf4, 0xc, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x5f, + 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x3, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, + 0x10, 0x5f, 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, + 0x9f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xf6, 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, + 0xf4, 0x0, 0x1e, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x5f, 0xff, 0xf1, + 0x2f, 0xff, 0xf4, 0x0, 0x6, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x5f, + 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0xdf, + 0xff, 0xb0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, + 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x4f, 0xff, + 0xf2, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0xa, 0xff, 0xfd, 0x0, 0x0, + 0xdf, 0xff, 0x80, 0x0, 0x0, 0x5f, 0xff, 0xf1, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x70, 0x6, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf1, 0x1e, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf9, 0x9f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf1, + + /* U+004E "N" */ + 0x2f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, 0x2f, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x82, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xfd, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x82, 0xff, 0xff, 0x7b, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf8, 0x2f, 0xff, 0xf7, 0xd, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, + 0xff, 0xff, 0x70, 0x2f, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, + 0xf7, 0x0, 0x5f, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, + 0x0, 0x8f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0xcf, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x1, 0xef, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf2, 0x0, + 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xd0, 0x0, 0x1f, + 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xb0, 0x1, 0xff, 0xff, + 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0x70, 0x1f, 0xff, 0xf8, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0x41, 0xff, 0xff, 0x82, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xfe, 0x3f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, + 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x82, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf8, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x80, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, + 0xff, 0xed, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xfb, 0x74, 0x32, 0x35, + 0x8d, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0xcf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0x70, 0x0, 0x4f, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x0, 0xb, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf5, + 0x1, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xb0, 0x5f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x8, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf2, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x4b, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, + 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x6b, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf6, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x48, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x5f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x1, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xb0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf5, 0x0, 0x4f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfe, 0x0, 0x0, 0xcf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0x70, 0x0, 0x3, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x81, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xfb, 0x74, 0x32, 0x35, 0x8c, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, + 0xff, 0xfe, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0050 "P" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xc8, 0x50, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x20, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x2f, 0xff, + 0xf7, 0x11, 0x11, 0x11, 0x11, 0x23, 0x7b, 0xff, + 0xff, 0xff, 0x80, 0x2, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, + 0x30, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfc, 0x2, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf2, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x72, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xb2, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfc, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xb2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfa, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x72, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf2, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xfc, 0x2, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0x40, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x12, 0x5a, 0xff, 0xff, 0xff, 0x90, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xd9, 0x61, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x71, 0x11, 0x11, 0x11, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, + 0xff, 0xed, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfb, 0x74, + 0x32, 0x35, 0x8d, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf8, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0x60, 0x0, 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xe0, 0x0, 0xa, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf5, 0x0, 0xf, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x0, + 0x4f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x20, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, 0xbf, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x50, + 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x60, 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x60, 0xbf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, 0x8f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x20, + 0x5f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x0, 0x1f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xfb, 0x0, 0xc, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf6, 0x0, 0x6, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xe9, 0x52, + 0x10, 0x13, 0x6a, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, + 0xff, 0xff, 0xff, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xfb, + 0x10, 0x0, 0x0, 0x1, 0xaf, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xe8, 0x30, 0x3, 0x8e, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0x9a, 0xa8, 0x50, 0x0, 0x0, + + /* U+0052 "R" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xc8, 0x50, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x92, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, 0x11, 0x23, + 0x7b, 0xff, 0xff, 0xff, 0x80, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xf3, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xfc, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x20, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x70, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xb0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x70, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x30, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xfc, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xff, 0xf4, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x59, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa2, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf9, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xe1, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xfa, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x50, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xe1, + + /* U+0053 "S" */ + 0x0, 0x0, 0x0, 0x0, 0x38, 0xbd, 0xff, 0xfe, + 0xda, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, + 0x20, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0xd, 0xff, 0xff, + 0xfa, 0x52, 0x0, 0x1, 0x36, 0xaf, 0xff, 0xfa, + 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0xf4, 0x0, 0x0, 0xef, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x50, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfd, 0x72, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xea, 0x62, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x6a, 0xef, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7d, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfa, 0x0, 0x51, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, 0x0, 0xee, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0x7, + 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xd0, 0xe, 0xff, 0xff, 0xfe, + 0x96, 0x30, 0x0, 0x1, 0x48, 0xef, 0xff, 0xff, + 0x40, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x39, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x7a, 0xde, 0xff, 0xfe, + 0xc9, 0x50, 0x0, 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x1c, 0xff, 0xfc, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, + 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, + 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, + 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, + 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfc, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, + 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0x4f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf9, 0x1f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf6, 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, + 0x9, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x3, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x80, 0x0, 0xcf, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0x10, 0x0, 0x3f, 0xff, 0xff, 0xc3, 0x0, + 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xb7, 0x43, 0x24, + 0x6a, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x15, 0x9c, 0xef, 0xfe, + 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf9, 0x6, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf2, 0x0, 0xef, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xb0, 0x0, 0x8f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x40, 0x0, 0x2f, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfd, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x3f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xb0, 0x0, 0x0, 0xaf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf2, 0x0, 0x1, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x8, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, + 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x60, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xd0, 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf7, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0057 "W" */ + 0x5f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf2, 0x1f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xd0, 0xb, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x80, 0x6, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x20, 0x1, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfd, 0x0, 0x0, 0xbf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf8, 0x0, 0x0, 0x6f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, + 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xac, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, + 0x0, 0xc, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x57, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x80, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x1, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x1, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfa, 0x0, 0xcf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, + 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, + 0x0, 0x1f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xa0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x50, 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x30, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x9, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xa0, 0x0, 0x0, 0x7, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd0, 0x0, + 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xe0, 0x0, 0x0, 0xc, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf3, + 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf4, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf8, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf9, 0x0, 0x0, 0x7f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfd, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfe, 0x0, 0x0, 0xcf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x20, 0x4, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, 0x2, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x80, 0xa, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x90, + 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd0, 0xf, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xe0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x4f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf4, 0x1f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, + 0xaf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf9, 0x7f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xfd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfe, 0xcf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0058 "X" */ + 0x5, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf3, 0x0, + 0x9, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf7, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0x50, 0x0, 0x3f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xfe, 0x10, 0xd, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xfb, 0x9, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xfa, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xbf, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x90, 0xcf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xd0, 0x2, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf3, 0x0, 0x6, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf8, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x9f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x90, + 0x0, 0x5f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0x40, + 0x1e, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x10, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x4f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, 0x0, + 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x2, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xfd, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, 0xe, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf2, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xb0, 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x50, 0x3, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, + 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf8, + 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x0, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x3f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xf8, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + + /* U+005B "[" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0x72, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0x72, 0xff, 0xff, 0xcb, 0xbb, 0xb4, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0xfc, 0xbb, + 0xbb, 0x42, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0x72, 0xff, 0xff, 0xff, + 0xff, 0xf7, + + /* U+005C "\\" */ + 0x9f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, + + /* U+005D "]" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0x72, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0x71, 0xbb, 0xbb, 0xbf, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, + 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, + 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, + 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, + 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, + 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, + 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, + 0x0, 0xe, 0xff, 0xf7, 0x1b, 0xbb, 0xbb, 0xff, + 0xff, 0x72, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0x72, 0xff, 0xff, 0xff, + 0xff, 0xf7, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0x0, 0x48, 0x88, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xbf, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xe1, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf7, 0xa, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x10, 0x3f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xa0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf4, 0x0, 0x6, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x0, 0x0, 0xf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0xf, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xfd, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf1, 0x0, 0x0, 0x3, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xdf, 0xfa, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xa0, 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x10, 0x0, 0xa, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, + 0x1, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xe0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x50, 0xe, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfc, 0x5, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf2, + + /* U+005F "_" */ + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, + + /* U+0060 "`" */ + 0x2d, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, + + /* U+0061 "a" */ + 0x0, 0x0, 0x2, 0x6a, 0xce, 0xff, 0xec, 0x95, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x4, 0xff, 0xfe, 0x94, + 0x10, 0x0, 0x15, 0xcf, 0xff, 0xff, 0x40, 0x0, + 0xbf, 0x60, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xb0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x22, 0x33, 0x33, 0x33, 0x3e, 0xff, + 0xf7, 0x0, 0x0, 0x4a, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xc, 0xff, 0xff, 0xb5, 0x20, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf8, 0x4f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf8, + 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf8, 0xaf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0xaf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf8, 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xf8, 0xa, + 0xff, 0xff, 0xfd, 0x97, 0x79, 0xcf, 0xff, 0xfe, + 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6b, 0xff, 0xf8, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0xb, 0xff, 0xf8, + 0x0, 0x0, 0x17, 0xbe, 0xff, 0xec, 0x94, 0x0, + 0xb, 0xff, 0xf8, + + /* U+0062 "b" */ + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x17, 0xbe, + 0xff, 0xec, 0x94, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x90, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd5, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x91, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x0, 0xdf, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xf8, 0x30, 0x0, 0x15, 0xcf, 0xff, + 0xff, 0xc0, 0x0, 0xdf, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf8, 0x0, + 0xdf, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0x10, 0xdf, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x80, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0xdf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf2, 0xdf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf4, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf6, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, + 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf4, 0xdf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf1, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xd0, 0xdf, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x80, 0xdf, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0x10, 0xdf, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xf8, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xf8, 0x30, 0x0, 0x15, 0xcf, 0xff, + 0xff, 0xc0, 0x0, 0xdf, 0xff, 0x8d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0xdf, 0xff, 0x61, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0xdf, 0xff, 0x60, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x60, 0x0, 0x17, 0xbe, + 0xff, 0xec, 0x94, 0x0, 0x0, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x0, 0x0, 0x5, 0xac, 0xef, 0xfe, + 0xb7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x5, 0xff, 0xff, 0xfe, 0x83, 0x0, 0x1, + 0x6c, 0xff, 0xff, 0xf4, 0x0, 0x1f, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, + 0x0, 0xaf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xfb, 0x10, 0x2, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, + 0x7, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, + 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xfb, 0x20, 0x0, 0x1e, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, + 0x0, 0x4, 0xff, 0xff, 0xfe, 0x83, 0x0, 0x1, + 0x6c, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xad, 0xef, 0xfe, + 0xb7, 0x20, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, 0x83, + 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x2, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x3f, + 0xff, 0xf3, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x53, 0xff, 0xff, 0x30, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xf3, 0x0, 0x7, 0xff, + 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x3, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xf3, 0x8, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0x30, 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0xe, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x30, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf3, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf3, 0xe, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x30, 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0x8, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf3, 0x0, 0xbf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, + 0x3, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x7, 0xff, + 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xf3, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xbe, 0xff, 0xec, 0x83, 0x0, 0x0, 0xff, 0xff, + 0x30, + + /* U+0065 "e" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xdc, 0xef, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xfa, 0x30, 0x0, 0x1, 0x7e, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x2f, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xf5, 0x0, 0x0, 0xbf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfd, 0x0, 0x2, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, + 0x7, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xa0, 0xb, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xe0, 0xe, 0xff, 0xf8, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x4f, 0xff, 0xf0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xe, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0x60, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0x94, 0x0, 0x0, 0x27, 0xdf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xfe, + 0xc9, 0x50, 0x0, 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x0, 0x7, 0xbe, 0xff, 0xda, + 0x40, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfe, 0xbb, 0xef, 0xf1, 0x0, 0x0, 0x9, 0xff, + 0xff, 0x70, 0x0, 0x3, 0x70, 0x0, 0x0, 0xe, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x3b, 0xbb, 0xbf, + 0xff, 0xfc, 0xbb, 0xbb, 0xbb, 0x20, 0x0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, + 0x94, 0x0, 0x0, 0xaf, 0xff, 0x80, 0x0, 0x0, + 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0xa, 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xaf, 0xff, + 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbb, 0xff, 0xf8, 0x0, 0x9, + 0xff, 0xff, 0xfe, 0x73, 0x0, 0x1, 0x4a, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x4, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xf8, 0x0, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x80, 0x4f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xf8, 0x9, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x80, 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, 0xf, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x80, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf8, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x80, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf8, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x80, 0x9f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf8, + 0x3, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x80, 0xc, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xf8, 0x0, 0x3f, 0xff, 0xff, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0x41, 0x0, + 0x26, 0xcf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xef, 0xff, 0x80, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xe, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x1, 0x6a, 0xce, 0xed, 0xb7, 0x30, + 0x0, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfd, 0x0, 0x0, 0x1c, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x70, 0x0, 0x9, 0xff, 0x93, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xf1, 0x0, + 0x4, 0xff, 0xff, 0xfc, 0x84, 0x10, 0x0, 0x3, + 0x7d, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x15, 0x8b, 0xde, 0xff, 0xed, 0xa6, 0x20, + 0x0, 0x0, 0x0, + + /* U+0068 "h" */ + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x16, 0xbd, 0xef, 0xec, + 0x83, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x19, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0xdf, 0xff, 0x93, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0xdf, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xd7, 0x31, 0x1, 0x4a, + 0xff, 0xff, 0xfd, 0x0, 0xdf, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x50, + 0xdf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xb0, 0xdf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf0, + 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf2, 0xdf, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, + 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0xdf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, + + /* U+0069 "i" */ + 0x0, 0x57, 0x40, 0x0, 0xcf, 0xff, 0x90, 0x6f, + 0xff, 0xff, 0x38, 0xff, 0xff, 0xf5, 0x5f, 0xff, + 0xff, 0x20, 0xaf, 0xff, 0x60, 0x0, 0x24, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x90, 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, + 0x90, 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, + 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, 0xd, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, 0xd, 0xff, + 0xf9, 0x0, 0xdf, 0xff, 0x90, 0xd, 0xff, 0xf9, + 0x0, 0xdf, 0xff, 0x90, 0xd, 0xff, 0xf9, 0x0, + 0xdf, 0xff, 0x90, 0xd, 0xff, 0xf9, 0x0, 0xdf, + 0xff, 0x90, 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, + 0x90, 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, + 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, 0xd, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x14, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0xa3, 0x0, 0x2, + 0xdf, 0xff, 0xf3, 0x0, 0x6f, 0xfe, 0xcd, 0xff, + 0xff, 0xfb, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x1, 0xef, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x6b, 0xef, 0xfe, 0xa5, 0x0, + 0x0, 0x0, + + /* U+006B "k" */ + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xb0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xb0, 0x0, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xb0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xb0, 0x0, 0x0, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x3f, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, + 0x0, 0x4f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x5f, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf9, 0x6f, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0x70, 0x7f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0xaf, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x60, 0x0, 0x0, 0xdf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xe1, 0x0, 0x0, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xc0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0x80, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x50, 0xd, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0x20, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xfd, 0x0, + + /* U+006C "l" */ + 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, + 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, + 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, + 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, + 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, + 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, + 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, + 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, + 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, + 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, + 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x90, + + /* U+006D "m" */ + 0xdf, 0xff, 0x60, 0x0, 0x38, 0xce, 0xff, 0xeb, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x59, 0xce, 0xfe, + 0xda, 0x60, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x2, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, + 0x0, 0xdf, 0xff, 0x64, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0xd, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xc6, 0x20, + 0x12, 0x7e, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc6, + 0x20, 0x12, 0x7e, 0xff, 0xff, 0xf4, 0xd, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xb0, 0xdf, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x1d, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf5, 0xdf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x8d, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf9, 0xdf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xad, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xad, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xad, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xad, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfa, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xad, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfa, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xad, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfa, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xad, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfa, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xa0, + + /* U+006E "n" */ + 0xdf, 0xff, 0x60, 0x0, 0x27, 0xbe, 0xff, 0xec, + 0x83, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, 0x1a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0xdf, 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0xdf, 0xff, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xd7, 0x31, 0x1, 0x4a, + 0xff, 0xff, 0xfd, 0x0, 0xdf, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x50, + 0xdf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xb0, 0xdf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf0, + 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf2, 0xdf, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, + 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0xdf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, + + /* U+006F "o" */ + 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xfd, + 0xb7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x2, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0xaf, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xd0, 0x0, 0x2f, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x50, 0x7, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfa, 0x0, 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0xe, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x20, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf3, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x40, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf3, 0xe, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x10, 0xbf, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, + 0x7, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfa, 0x0, 0x1f, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x50, 0x0, 0xaf, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xd0, + 0x0, 0x1, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xad, 0xff, 0xfd, 0xb7, 0x20, 0x0, 0x0, + 0x0, 0x0, + + /* U+0070 "p" */ + 0xdf, 0xff, 0x60, 0x0, 0x17, 0xbe, 0xff, 0xec, + 0x94, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x62, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0xdf, + 0xff, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xf9, 0x30, 0x0, 0x15, 0xcf, 0xff, 0xff, 0xc0, + 0x0, 0xdf, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xf8, 0x0, 0xdf, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x10, 0xdf, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x80, + 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xe0, 0xdf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf2, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf6, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf6, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0xdf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf4, 0xdf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf1, + 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xd0, 0xdf, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x80, 0xdf, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x10, 0xdf, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf8, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xf8, 0x30, 0x0, 0x15, 0xcf, 0xff, 0xff, 0xc0, + 0x0, 0xdf, 0xff, 0xad, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xdf, 0xff, + 0x91, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x16, 0xbe, 0xff, 0xec, + 0x94, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, + 0x83, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, + 0x30, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6f, 0xff, 0xf3, 0x0, 0x7, + 0xff, 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x3, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x2f, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf3, 0x8, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0x30, 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0xe, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x30, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf3, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf3, 0xe, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x30, 0xbf, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, + 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0x30, 0x2f, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf3, 0x0, 0xbf, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0x30, 0x3, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x7, + 0xff, 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xf3, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x43, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x10, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xbe, 0xff, 0xec, 0x83, 0x0, 0x3, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf3, + + /* U+0072 "r" */ + 0xdf, 0xff, 0x60, 0x0, 0x27, 0xbe, 0xf4, 0xdf, + 0xff, 0x60, 0x1a, 0xff, 0xff, 0xf4, 0xdf, 0xff, + 0x63, 0xef, 0xff, 0xff, 0xf4, 0xdf, 0xff, 0x8e, + 0xff, 0xff, 0xff, 0xf4, 0xdf, 0xff, 0xff, 0xff, + 0xfb, 0x75, 0x41, 0xdf, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x0, 0x59, 0xce, 0xff, 0xed, 0xa7, + 0x30, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe8, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xed, 0xde, 0xff, 0xff, + 0xff, 0x40, 0x7, 0xff, 0xff, 0xd6, 0x10, 0x0, + 0x1, 0x49, 0xef, 0xb0, 0x0, 0xdf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x73, 0x0, 0xf, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xc9, 0x52, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc8, 0x40, 0x0, 0x0, 0x0, 0x6, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0x6a, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x25, + 0x7a, 0xdf, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfb, 0x1, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x8f, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf7, 0x1f, 0xff, 0xfb, 0x63, 0x0, 0x0, + 0x3, 0x8f, 0xff, 0xff, 0x19, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0x70, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, 0x36, 0xac, + 0xef, 0xfe, 0xdb, 0x82, 0x0, 0x0, 0x0, + + /* U+0074 "t" */ + 0x0, 0x0, 0x18, 0x88, 0x82, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x3b, 0xbb, 0xbf, 0xff, 0xfc, 0xbb, 0xbb, + 0xbb, 0x20, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xa1, + 0x0, 0x5, 0x90, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xdd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xce, 0xfe, 0xc8, 0x20, + + /* U+0075 "u" */ + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfe, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, + 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xfe, 0xb, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, + 0x7, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xfe, 0x1, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, + 0x0, 0x9f, 0xff, 0xff, 0xc6, 0x20, 0x2, 0x6c, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xfe, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x54, 0xff, 0xfe, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x4, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xfc, 0x93, + 0x0, 0x4, 0xff, 0xfe, + + /* U+0076 "v" */ + 0xd, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x80, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf2, 0x1, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, + 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, 0x0, 0x2f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xd0, 0x0, 0x0, 0xbf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf6, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, + 0x0, 0x0, 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x20, 0x0, 0x5, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf8, 0x0, 0x0, 0xcf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xe0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, 0x9, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfc, 0x1, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf3, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xae, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0077 "w" */ + 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x2f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x80, 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x20, 0x7, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xfc, 0x0, 0x1, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf6, + 0x0, 0x0, 0xbf, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf1, 0x0, 0x0, 0x5f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x2c, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, + 0x0, 0xa, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfc, 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, 0x0, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x5, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0xaf, 0xff, 0x60, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, 0x5f, 0xff, + 0xa0, 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x1f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xe0, 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, 0xe, + 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, 0x1, + 0xff, 0xfe, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x0, + 0x0, 0xcf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x0, 0x7, 0xff, 0xf8, 0x0, + 0x0, 0x2, 0xff, 0xfd, 0x0, 0x2, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x30, 0x8, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x50, 0x3f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, 0xd, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xb0, 0x9f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xe0, 0x3f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, + 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf5, 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfb, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, 0xef, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0x8, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xfd, 0x0, 0xc, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x20, 0x0, 0x1e, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x50, 0x0, 0x0, 0x4f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf2, 0x0, 0x0, 0xaf, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xd0, 0x0, 0x6f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x90, 0x2f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x6d, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xfc, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfd, 0x8, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x20, 0xc, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x60, 0x0, + 0x1e, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x4f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf2, 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xd0, 0x0, + 0x3f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x90, 0x1e, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x50, + + /* U+0079 "y" */ + 0x0, 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, 0x7f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf1, 0x0, 0xf, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xa0, 0x0, 0x9, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x30, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x90, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x50, 0x0, 0x5, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xc0, 0x0, 0xc, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf3, 0x0, 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x11, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x77, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xed, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x32, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0x81, 0x0, 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xed, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x9d, 0xff, 0xeb, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x9, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbf, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb2, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, + + /* U+007B "{" */ + 0x0, 0x0, 0x0, 0x3, 0x9d, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xfc, 0xb2, 0x0, 0x0, 0x6f, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x4b, 0xcf, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfc, 0xb2, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x3, 0x9d, 0xff, 0xf4, + + /* U+007C "|" */ + 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, + 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, + 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, + 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, + 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, + 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, + 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, + 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, + 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, + 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, + 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, + 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, + 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, + 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, + + /* U+007D "}" */ + 0x2f, 0xff, 0xda, 0x40, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x1b, 0xce, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xfc, 0xb5, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x91, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, + 0x1b, 0xce, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xda, + 0x40, 0x0, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x1, 0x8d, 0xfe, 0xb5, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xbb, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x1, + 0xef, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x4f, 0xfd, 0x0, 0x8f, 0xff, 0xc7, 0x8e, 0xff, + 0xff, 0x60, 0x0, 0xd, 0xff, 0xa0, 0xd, 0xff, + 0xa0, 0x0, 0xa, 0xff, 0xff, 0xc8, 0x8e, 0xff, + 0xf4, 0x1, 0xff, 0xf1, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x3f, 0xfc, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xfd, 0x10, + 0x3, 0xbb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x7c, + 0xff, 0xc7, 0x0, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x4a, 0xdf, 0xeb, 0x60, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x1, 0xef, 0xfe, 0x97, 0x9d, 0xff, 0xf4, 0x0, + 0xb, 0xff, 0x80, 0x0, 0x0, 0x6f, 0xfe, 0x10, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x6, 0xff, 0x90, + 0xaf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xe0, + 0xdf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, + 0xef, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf2, + 0xdf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, + 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xe0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x6, 0xff, 0x90, + 0xb, 0xff, 0x90, 0x0, 0x0, 0x7f, 0xfe, 0x10, + 0x1, 0xef, 0xfe, 0xa8, 0x9e, 0xff, 0xf4, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x4a, 0xdf, 0xeb, 0x60, 0x0, 0x0, + + /* U+2022 "•" */ + 0x0, 0x27, 0x85, 0x0, 0x0, 0x7f, 0xff, 0xfc, + 0x10, 0x5f, 0xff, 0xff, 0xfb, 0xc, 0xff, 0xff, + 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0x5e, 0xff, + 0xff, 0xff, 0xf4, 0x9f, 0xff, 0xff, 0xfe, 0x1, + 0xef, 0xff, 0xff, 0x50, 0x1, 0x9e, 0xfc, 0x40, + 0x0, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x8c, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xae, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xae, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa6, 0x10, 0xe, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x94, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x72, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xc7, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfe, + 0xa5, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x14, 0x55, 0x42, 0xef, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x4, 0x79, 0x99, 0x6c, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x1, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, 0xff, 0xff, + 0xea, 0x50, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x8b, 0xcd, 0xcb, 0x73, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F008 "" */ + 0x5, 0x60, 0x0, 0x0, 0x18, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x84, 0x0, 0x0, 0x6, 0x50, 0x9f, + 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xe, 0xf9, 0xff, 0xe0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xfc, 0xaa, + 0xaa, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaa, 0xaa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x44, 0x44, 0xaf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfd, 0x44, 0x44, 0x5f, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x7f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xee, 0xee, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xee, 0xee, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x5f, 0xff, 0xfa, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xf8, 0x66, 0x66, + 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x66, + 0x66, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x88, 0x88, 0xcf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfe, 0x88, 0x88, 0xaf, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf9, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xfd, 0xcc, 0xcc, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xcc, 0xcc, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x22, 0x22, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x22, 0x22, 0x3f, 0xff, 0xdf, + 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xe, 0xfd, 0x3d, 0xd0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xd, 0xd3, + + /* U+F00B "" */ + 0x4, 0x77, 0x77, 0x77, 0x77, 0x76, 0x10, 0x0, + 0x3, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x40, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x5, 0x78, + 0x88, 0x88, 0x88, 0x87, 0x10, 0x0, 0x3, 0x78, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x88, 0x88, 0x88, 0x88, + 0x87, 0x20, 0x0, 0x4, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x3c, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, + 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9d, 0x91, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbd, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1b, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xfe, 0x70, 0x0, + 0x1, 0xdf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xf9, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x90, + 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x5f, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xe1, + 0x7, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x7f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xe2, 0x0, + 0x0, 0x3, 0x77, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x86, 0x0, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x22, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xb5, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x1, 0x9b, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xf4, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xbf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0x70, 0x0, 0xd, 0xff, 0xff, + 0xff, 0x60, 0x0, 0xd, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf6, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0x30, + 0x1, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0x30, 0xdf, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xf6, 0xf, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0x92, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfb, 0x3f, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xc4, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xfd, 0x3f, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xc2, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xfc, 0x1f, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8b, 0xbb, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf8, 0xc, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0x50, 0x8f, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xf2, 0x3, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xfd, 0x0, 0xe, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc8, 0x53, 0x22, 0x46, 0x9e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, 0xff, + 0xff, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x46, + 0x78, 0x87, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xa3, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, + 0x0, 0x0, 0x6a, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xa2, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x3c, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xca, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb9, 0x9c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x31, 0x14, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf9, 0x16, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x42, 0xbf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x9, 0xfc, + 0x30, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x4, 0xdf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x92, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xce, + 0xff, 0xff, 0xdb, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x44, 0x44, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0x50, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x5f, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x5f, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x5f, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xe5, 0x7f, 0xff, 0xff, 0xff, 0xf9, + 0x5f, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x5f, 0xd2, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xd2, 0x0, 0x8, 0xff, 0xff, 0x40, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0xaf, 0xff, 0xff, + 0xf7, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0x50, + 0xaf, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x4, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf6, 0xef, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xfa, 0x4f, 0xff, 0xff, 0xc1, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x4e, 0xff, 0xff, 0xe1, 0x7, 0xff, + 0xfa, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x2, 0xdf, 0xff, 0x30, + 0x0, 0x9f, 0x80, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xb, + 0xf6, 0x0, 0x0, 0x1, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x77, 0x77, + 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8c, 0xcc, 0xcc, 0xcc, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xcc, 0xcc, 0xcc, + 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x63, + 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, 0x0, 0x36, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x40, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x7f, 0xff, 0xf8, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x7, 0xff, 0x70, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x22, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x11, 0x4c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x9f, 0xf7, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x3f, + 0xf1, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0xaf, 0xf8, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x6, 0x89, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, + 0x60, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6a, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xfa, 0x0, 0x9, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x50, + 0x3f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xe0, 0xbf, 0xff, 0xff, 0xf6, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x9f, 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x88, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x1, 0x9e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x22, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0x67, 0x88, 0x75, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9d, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x4, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x2, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x31, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb6, 0x21, 0x0, 0x3, 0x7c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x81, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, + 0x54, 0x43, 0x21, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xaf, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x9, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x44, 0x43, 0x10, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xb0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0x30, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xbc, 0xcd, 0xef, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0xf7, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x40, 0x0, 0x0, 0x0, 0x3, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb8, 0x77, 0x9a, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x10, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x20, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x7a, 0xdf, 0xff, 0xfe, + 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xad, 0xee, 0xec, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x2, 0x44, 0x44, 0x44, 0x44, + 0x48, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xec, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x24, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x4f, 0xfe, + 0x30, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xb, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x1, 0xcf, 0xff, 0xfb, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xb, 0xff, + 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xaf, 0xff, 0xd2, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x2, 0xcf, 0xa0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x44, 0x44, 0x44, 0x44, 0x48, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xec, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xab, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x93, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x70, 0x0, 0x0, 0x5f, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xfb, 0x0, 0x0, 0x9, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0xdf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x4f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0x50, 0x0, 0xc, 0xff, + 0xff, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xe0, 0x0, + 0x4, 0xff, 0xff, 0x50, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x36, 0x10, 0x0, 0x0, 0x9f, 0xff, + 0xf7, 0x0, 0x0, 0xdf, 0xff, 0xa0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x5, 0xff, 0xf5, 0x0, 0x0, + 0xd, 0xff, 0xfe, 0x0, 0x0, 0x8f, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xc, 0xff, 0xff, + 0x60, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, 0x3f, + 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x9, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0xef, 0xff, 0x90, + 0x0, 0xf, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x1, 0xbf, 0xff, 0xfc, 0x0, 0x0, 0xaf, + 0xff, 0xc0, 0x0, 0xd, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0xa, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x60, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0xa, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x70, 0x0, 0x3f, 0xff, 0xf1, + 0x0, 0x9, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x4f, + 0xff, 0xf1, 0x0, 0x9, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, + 0x0, 0x5f, 0xff, 0xf0, 0x0, 0xa, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, 0xc, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x5, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xcf, 0xff, 0xb0, + 0x0, 0xe, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xb, 0xff, 0xff, 0xc0, 0x0, 0x2, 0xff, + 0xff, 0x60, 0x0, 0x1f, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xa, 0xff, 0xfc, 0x10, 0x0, + 0xa, 0xff, 0xff, 0x10, 0x0, 0x6f, 0xff, 0xf1, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x1, 0xbe, 0x80, + 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, 0xbf, + 0xff, 0xd0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xf3, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x2, 0x44, 0x44, 0x44, + 0x44, 0x48, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xa0, 0x0, 0x9, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0xfe, 0x10, 0x0, 0x1f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x9f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0x40, 0x0, 0x4, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe3, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfa, + 0x10, 0x0, 0x0, 0xcf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0xa, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xec, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x0, 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, 0x4, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x7a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x46, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x5, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x5, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x1, 0x9e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe9, 0x10, + + /* U+F043 "ïƒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xef, 0xff, 0xff, 0xb8, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xfd, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xef, 0xff, 0xfe, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xcf, 0xff, 0xff, 0x10, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x9f, 0xff, 0xff, 0x60, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x5f, 0xff, 0xff, 0xd0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xf, 0xff, 0xff, 0xf7, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x9, 0xff, 0xff, 0xff, 0x40, 0x0, 0x3a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x1, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x1, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x94, 0x20, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x69, 0xbb, + 0xba, 0x85, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "ïˆ" */ + 0x3, 0x44, 0x44, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x52, 0x0, 0x2f, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x4f, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xf4, 0x4f, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf7, 0x4f, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xf3, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xf3, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xf3, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xf7, 0x3f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xf2, + 0x1e, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2b, 0xfc, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "ï‹" */ + 0x0, 0x2, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4a, 0xb8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "ïŒ" */ + 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x43, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x44, 0x44, + 0x44, 0x44, 0x30, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x8d, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xea, 0x20, + 0x0, + + /* U+F04D "ï" */ + 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x30, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x8d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x20, + 0x0, + + /* U+F051 "ï‘" */ + 0x0, 0x15, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x44, 0x44, 0x40, 0x5, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xf6, 0x1f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xf, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0xf, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x1f, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf8, 0x3f, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf8, 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf7, + 0x2, 0xbf, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, + 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x5, 0x9b, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x27, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x84, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xea, 0x10, + + /* U+F053 "ï“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2b, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x33, 0x0, 0x0, + + /* U+F054 "ï”" */ + 0x0, 0x7, 0xca, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x56, 0x65, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x79, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9a, + 0xff, 0xff, 0xff, 0xff, 0xc9, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x98, 0x40, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x29, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0x0, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xde, 0xed, 0xa2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F068 "ï¨" */ + 0x2, 0x89, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x98, 0x40, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x29, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F06E "ï®" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x35, 0x67, 0x66, 0x53, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x7b, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x51, 0x0, 0x0, + 0x26, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x2, 0xbd, 0xdb, + 0x71, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x3, 0x10, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xa, 0xfc, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, + 0xe9, 0x10, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x35, 0x53, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x71, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, + 0x65, 0x57, 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7a, 0xce, + 0xff, 0xff, 0xdc, 0x97, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "ï°" */ + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x46, 0x66, 0x64, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x15, 0x9c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xda, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x1, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xd3, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb6, 0x20, 0x0, 0x2, 0x6b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x82, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x3b, 0xdc, 0xa6, 0x10, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0xf, 0xff, 0xff, + 0xe6, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x40, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, + 0xff, 0xf5, 0xc, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0x9c, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xf9, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x86, 0x55, 0x74, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x48, 0xac, 0xef, 0xff, 0xed, + 0xb8, 0x51, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xb3, 0x0, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xfe, 0xcc, 0xcc, 0xcc, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x9a, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc4, 0x11, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x8, 0xce, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xdb, 0x60, 0x0, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, 0xda, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8d, 0xdd, 0xdd, 0xef, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x25, 0x55, 0x55, 0x55, 0x6f, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xf8, 0x55, 0xaf, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0x20, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x50, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xb, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xc9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xc8, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xb, 0xff, 0x70, 0x0, + 0x0, 0x7f, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x9f, 0xff, 0xf6, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x8, 0xff, 0xff, 0xff, 0x50, 0x0, 0x8f, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x11, 0x11, + 0x11, 0x2d, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xf4, 0x11, 0x8f, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x1, 0x22, 0x22, + 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, 0x9f, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xdb, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x5f, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xfb, 0x2f, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf7, + 0x4, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x90, 0x0, 0x5f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, + 0x0, 0x3, 0x97, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x59, 0x60, 0x0, + + /* U+F078 "ï¸" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xe3, 0x0, + 0x0, 0xcf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xfe, 0x30, 0xb, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xe2, + 0x4f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xfa, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfa, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x2, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xad, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xf6, 0x2f, 0xff, 0xff, 0x91, 0xdf, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x70, + 0x2f, 0xff, 0xff, 0x90, 0x2e, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf8, 0x0, 0x2f, 0xff, 0xff, + 0x90, 0x2, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, + 0x30, 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x16, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf9, 0x0, 0xa, 0xff, + 0xff, 0xf1, 0x0, 0x4e, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, 0xf1, 0x4, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xf9, + 0xa, 0xff, 0xff, 0xf1, 0x3f, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x7a, 0xff, 0xff, + 0xf3, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xba, 0x60, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "ï»" */ + 0x0, 0x16, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0xa5, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x1, 0x9e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe9, 0x10, + + /* U+F093 "ï‚“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0x33, 0x33, 0x33, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa3, 0x33, 0x33, 0x33, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x20, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x2, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x40, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x14, 0x44, + 0x44, 0x44, 0x30, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x21, 0x11, 0x11, 0x11, + 0x12, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x9f, 0xf7, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x3f, + 0xf1, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0xaf, 0xf8, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x6, 0x89, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, + 0x60, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xfd, 0xa6, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9b, 0xba, 0x98, 0x64, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x0, 0x57, 0x98, 0x51, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xdf, 0xff, 0xe8, 0x10, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x23, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x9f, 0xff, 0xff, 0xf7, 0x35, + 0xef, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0xd, + 0xff, 0xff, 0xf4, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0xf, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0xef, 0xff, 0xff, + 0x20, 0x0, 0xd, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xfd, 0x20, 0x1a, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, + 0xcd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x79, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0x73, 0x5e, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x40, 0x0, 0x1f, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0xe, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0xaf, 0xff, 0xff, 0xd2, 0x1, 0xaf, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x5, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x0, 0x3c, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x56, 0x52, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, + 0xdc, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x8f, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x8, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x8, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x8, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x46, 0x66, 0x66, 0x64, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x59, 0x99, 0x99, 0x99, 0x90, 0x8f, 0xff, 0xff, + 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xdd, 0xdd, + 0xdd, 0xdd, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x50, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, + 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xb9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x27, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x97, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0xff, 0xff, 0xfe, 0x32, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0xbf, 0xff, 0xff, 0xff, 0x60, 0x0, 0xf, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x60, + 0xf, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6f, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x10, 0x0, 0x3c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x8d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x30, + 0x0, + + /* U+F0C9 "" */ + 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x27, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x74, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x20, + + /* U+F0E0 "" */ + 0x0, 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, 0x3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x1, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x2, 0xd6, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x10, 0x0, 0xaf, 0xff, 0xb1, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x2d, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x1, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x10, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x4, 0xdf, 0xff, 0xfd, 0x40, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x5, 0xaa, 0x50, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x20, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xab, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x1, 0x9e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe9, 0x10, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xca, 0xaa, 0xaa, 0xaa, 0xaa, 0xa7, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x1, 0xad, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5c, 0xff, 0xfc, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x44, + 0x44, 0x44, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x64, + 0x44, 0x44, 0x44, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x9c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x82, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x8e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x8d, 0x50, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x8, + 0xff, 0x50, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xff, 0x50, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x8, 0xff, 0xff, 0x50, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xff, 0xff, + 0x50, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x8, 0xff, 0xff, 0xff, 0x50, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x8, 0xff, 0xff, 0xff, 0xfe, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x5a, + 0xaa, 0xaa, 0xaa, 0xa0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x42, 0x22, 0x22, 0x22, + 0x22, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x17, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x2, 0x55, 0x55, 0x55, 0x55, + 0x52, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, + 0xff, 0xff, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x30, 0x0, 0x12, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x8b, 0xb9, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0x82, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x1e, 0xff, 0x60, 0x0, 0x3, 0xff, 0xf4, + 0x0, 0x0, 0x5f, 0xfe, 0x20, 0x0, 0x2e, 0xff, + 0x50, 0x0, 0x4, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, + 0xef, 0xf0, 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0x10, 0x0, 0x0, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xb, 0xff, 0x20, + 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, 0x1f, 0xfc, + 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, 0x0, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xb, + 0xff, 0x20, 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, + 0x1f, 0xfc, 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, + 0x0, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, 0xef, 0xf0, + 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x0, 0xc, 0xff, + 0x10, 0x0, 0x0, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x1d, 0xff, 0x60, 0x0, 0x2, + 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xfe, 0x10, 0x0, + 0x1e, 0xff, 0x40, 0x0, 0x3, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xee, 0xef, 0xff, 0xfe, 0xee, 0xee, + 0xff, 0xff, 0xee, 0xee, 0xff, 0xff, 0xfe, 0xee, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, 0xe0, + 0x0, 0x0, 0xef, 0xf3, 0x0, 0x0, 0x1f, 0xff, + 0x10, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x1, + 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, + 0xf, 0xff, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xf1, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, + 0xcf, 0xf1, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x1, 0xff, 0xc0, + 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x62, 0x22, 0x27, + 0xff, 0xf3, 0x22, 0x23, 0xff, 0xf7, 0x22, 0x22, + 0x5f, 0xff, 0x52, 0x22, 0x2a, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xcb, 0xbb, 0xcf, 0xff, 0xeb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xcf, 0xff, 0xeb, 0xbb, 0xbd, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xc, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x1, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xb, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, + 0x0, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x10, 0x0, 0x0, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x10, 0x0, 0x0, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0xc, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x1, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xdc, 0xcc, 0xcf, + 0xff, 0xec, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xdf, 0xff, 0xec, 0xcc, + 0xce, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x1, 0x9e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x89, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x9b, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "ï…›" */ + 0x4, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x0, 0x6, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xf, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0xf, 0xff, 0xff, 0x60, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0xf, 0xff, 0xff, 0xff, + 0x60, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xf, + 0xff, 0xff, 0xff, 0xff, 0x60, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x18, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa4, 0x0, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x34, 0x56, 0x66, 0x65, 0x32, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x25, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xb7, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb7, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x29, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xdd, 0xee, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, + 0x53, 0x10, 0x0, 0x0, 0x0, 0x2, 0x47, 0xae, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xaf, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xf3, 0xb, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xcf, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x48, 0xac, 0xef, 0xff, 0xed, + 0xb9, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf4, 0x0, 0x0, 0xb, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x97, + 0x53, 0x33, 0x46, 0x8b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xe7, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xe6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x27, 0x98, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6b, 0xdc, 0x93, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb8, 0x30, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xfe, 0xa0, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xc, + 0xcd, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x6, 0x77, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x38, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xe2, 0xff, 0xff, 0xfe, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xd4, 0x10, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F241 "ï‰" */ + 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb8, 0x30, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xfe, 0xa0, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xcd, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x18, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xe2, 0xff, 0xff, 0xfe, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xd4, 0x10, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F242 "" */ + 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb8, 0x30, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xfe, 0xa0, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xcd, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xfc, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x18, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xe2, 0xff, 0xff, 0xfe, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xd4, 0x10, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F243 "" */ + 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb8, 0x30, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xfe, 0xa0, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xcd, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x38, 0x88, 0x88, 0x88, 0x88, 0x88, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xe2, 0xff, 0xff, 0xfe, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xd4, 0x10, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F244 "" */ + 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb8, 0x30, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xfe, 0xa0, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xcd, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xe2, 0xff, 0xff, 0xfe, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xd4, 0x10, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xad, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x38, 0xaa, 0xae, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfd, 0x99, 0x9e, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfe, 0x10, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x3, 0x9b, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x58, 0x98, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb9, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x1, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x9, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x6f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xde, + 0xff, 0xff, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xff, 0xff, 0xff, 0xfe, 0x50, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x55, 0x55, + 0x55, 0x55, 0xaf, 0xff, 0xd5, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xfe, 0x10, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf6, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xdd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x45, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x89, 0x99, 0x99, 0x99, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6a, 0xdf, 0xff, 0xff, 0xff, 0xc9, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x30, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xbf, + 0xff, 0xff, 0xf0, 0x0, 0xd5, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x3, 0xff, 0xff, 0xff, + 0xf5, 0x8, 0xff, 0xff, 0xf0, 0x0, 0xdf, 0x50, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0x50, 0x6, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x8f, 0xff, 0xf0, 0x0, + 0xcf, 0xf6, 0x0, 0x9, 0xff, 0xff, 0xff, 0x80, + 0x9, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x8, 0xff, + 0xf0, 0x0, 0xcf, 0xfc, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xa0, 0xb, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x7f, 0xf0, 0x0, 0xcf, 0xc0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xc0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x7, 0xf0, 0x0, 0xcc, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xe0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x70, 0x0, + 0x80, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x30, 0x0, 0x40, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x3, 0xe0, 0x0, 0xc7, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xf0, 0xc, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x3e, 0xf1, 0x0, 0xcf, 0x60, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xd0, 0xa, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x3, 0xff, 0xf1, 0x0, + 0xcf, 0xf6, 0x0, 0x3, 0xff, 0xff, 0xff, 0xb0, + 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, 0x3f, 0xff, + 0xf1, 0x0, 0xcf, 0xf9, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0x90, 0x4, 0xff, 0xff, 0xff, 0xd1, 0x3, + 0xff, 0xff, 0xf1, 0x0, 0xdf, 0xa0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0x70, 0x1, 0xff, 0xff, 0xff, + 0xfd, 0x5f, 0xff, 0xff, 0xf1, 0x0, 0xda, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0x40, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x70, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0x8a, 0xcd, 0xdd, 0xcb, 0x96, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "ï‹­" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, + 0x77, 0x77, 0x77, 0x77, 0x76, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x9d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x50, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xc4, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x7f, + 0xff, 0xff, 0xe3, 0x1c, 0xff, 0xff, 0xfb, 0x14, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, 0xfb, 0x0, + 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x10, + 0x1f, 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, 0xf5, + 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, 0xfb, + 0x0, 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0x10, 0x1f, 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, + 0xf5, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, + 0xfb, 0x0, 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0x10, 0x1f, 0xff, 0xff, 0xb0, 0x7, 0xff, + 0xff, 0xf5, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, + 0xff, 0xfb, 0x0, 0x7f, 0xff, 0xff, 0x50, 0xd, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0x10, 0x1f, 0xff, 0xff, 0xb0, 0x7, + 0xff, 0xff, 0xf5, 0x0, 0xdf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf1, 0x1, + 0xff, 0xff, 0xfb, 0x0, 0x7f, 0xff, 0xff, 0x50, + 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0x10, 0x1f, 0xff, 0xff, 0xb0, + 0x7, 0xff, 0xff, 0xf5, 0x0, 0xdf, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf1, + 0x1, 0xff, 0xff, 0xfb, 0x0, 0x7f, 0xff, 0xff, + 0x50, 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0x10, 0x1f, 0xff, 0xff, + 0xb0, 0x7, 0xff, 0xff, 0xf5, 0x0, 0xdf, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xf1, 0x1, 0xff, 0xff, 0xfb, 0x0, 0x7f, 0xff, + 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0x10, 0x1f, 0xff, + 0xff, 0xb0, 0x7, 0xff, 0xff, 0xf5, 0x0, 0xdf, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xf1, 0x1, 0xff, 0xff, 0xfb, 0x0, 0x7f, + 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x10, 0x1f, + 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, 0xf5, 0x0, + 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, 0xfb, 0x0, + 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x10, + 0x1f, 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, 0xf5, + 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, 0xfb, + 0x0, 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0x10, 0x1f, 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, + 0xf5, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, + 0xfb, 0x0, 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0x70, 0x7f, 0xff, 0xff, 0xe3, 0x1c, 0xff, + 0xff, 0xfb, 0x14, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xab, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, + 0x71, 0x0, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x23, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xdb, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9b, 0xa8, 0x64, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0xa, 0xfa, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x3, 0xe3, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x53, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xeb, 0x40, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x3, 0xff, 0xff, 0xbb, 0xbb, + 0xff, 0xfb, 0xbb, 0xbc, 0xff, 0xeb, 0xbb, 0xbf, + 0xff, 0xff, 0xa0, 0x0, 0x3, 0xff, 0xff, 0xf1, + 0x0, 0xc, 0xff, 0x10, 0x0, 0x3f, 0xfa, 0x0, + 0x1, 0xff, 0xff, 0xfa, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x10, 0x0, 0xcf, 0xf1, 0x0, 0x3, 0xff, + 0xa0, 0x0, 0x1f, 0xff, 0xff, 0xa0, 0x3, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0xc, 0xff, 0x10, 0x0, + 0x3f, 0xfa, 0x0, 0x1, 0xff, 0xff, 0xfa, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0xcf, 0xf1, + 0x0, 0x3, 0xff, 0xa0, 0x0, 0x1f, 0xff, 0xff, + 0xa4, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xc, + 0xff, 0x10, 0x0, 0x3f, 0xfa, 0x0, 0x1, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0xcf, 0xf1, 0x0, 0x3, 0xff, 0xa0, 0x0, + 0x1f, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0xc, 0xff, 0x10, 0x0, 0x3f, 0xfa, + 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0xcf, 0xf1, 0x0, 0x3, + 0xff, 0xa0, 0x0, 0x1f, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2, 0x8a, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xa9, 0x61, 0x0, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0xd8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x32, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 198, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 197, .box_w = 7, .box_h = 33, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 116, .adv_w = 288, .box_w = 14, .box_h = 13, .ofs_x = 2, .ofs_y = 20}, + {.bitmap_index = 207, .adv_w = 517, .box_w = 31, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 719, .adv_w = 457, .box_w = 26, .box_h = 45, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 1304, .adv_w = 620, .box_w = 37, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1915, .adv_w = 505, .box_w = 29, .box_h = 34, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 2408, .adv_w = 155, .box_w = 5, .box_h = 13, .ofs_x = 2, .ofs_y = 20}, + {.bitmap_index = 2441, .adv_w = 248, .box_w = 11, .box_h = 44, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 2683, .adv_w = 249, .box_w = 11, .box_h = 44, .ofs_x = 1, .ofs_y = -9}, + {.bitmap_index = 2925, .adv_w = 294, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = 17}, + {.bitmap_index = 3087, .adv_w = 428, .box_w = 21, .box_h = 21, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 3308, .adv_w = 167, .box_w = 7, .box_h = 14, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 3357, .adv_w = 282, .box_w = 13, .box_h = 4, .ofs_x = 2, .ofs_y = 11}, + {.bitmap_index = 3383, .adv_w = 167, .box_w = 7, .box_h = 7, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3408, .adv_w = 259, .box_w = 20, .box_h = 44, .ofs_x = -2, .ofs_y = -5}, + {.bitmap_index = 3848, .adv_w = 491, .box_w = 27, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4294, .adv_w = 272, .box_w = 13, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4509, .adv_w = 422, .box_w = 25, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4922, .adv_w = 421, .box_w = 25, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5335, .adv_w = 492, .box_w = 30, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5830, .adv_w = 422, .box_w = 25, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6243, .adv_w = 454, .box_w = 26, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6672, .adv_w = 440, .box_w = 25, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7085, .adv_w = 474, .box_w = 26, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7514, .adv_w = 454, .box_w = 26, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7943, .adv_w = 167, .box_w = 7, .box_h = 25, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8031, .adv_w = 167, .box_w = 7, .box_h = 32, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 8143, .adv_w = 428, .box_w = 21, .box_h = 21, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 8364, .adv_w = 428, .box_w = 21, .box_h = 15, .ofs_x = 3, .ofs_y = 9}, + {.bitmap_index = 8522, .adv_w = 428, .box_w = 21, .box_h = 21, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 8743, .adv_w = 422, .box_w = 24, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9139, .adv_w = 761, .box_w = 44, .box_h = 42, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 10063, .adv_w = 539, .box_w = 35, .box_h = 33, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 10641, .adv_w = 557, .box_w = 29, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11120, .adv_w = 532, .box_w = 30, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11615, .adv_w = 608, .box_w = 32, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12143, .adv_w = 493, .box_w = 25, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12556, .adv_w = 467, .box_w = 24, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12952, .adv_w = 568, .box_w = 30, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13447, .adv_w = 598, .box_w = 29, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 13926, .adv_w = 228, .box_w = 6, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 14025, .adv_w = 378, .box_w = 21, .box_h = 33, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 14372, .adv_w = 529, .box_w = 30, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 14867, .adv_w = 437, .box_w = 23, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 15247, .adv_w = 703, .box_w = 36, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 15841, .adv_w = 598, .box_w = 29, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 16320, .adv_w = 618, .box_w = 35, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 16898, .adv_w = 531, .box_w = 27, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 17344, .adv_w = 618, .box_w = 36, .box_h = 40, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 18064, .adv_w = 535, .box_w = 28, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 18526, .adv_w = 457, .box_w = 26, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 18955, .adv_w = 432, .box_w = 27, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19401, .adv_w = 582, .box_w = 28, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 19863, .adv_w = 524, .box_w = 34, .box_h = 33, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 20424, .adv_w = 829, .box_w = 50, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 21249, .adv_w = 495, .box_w = 31, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21761, .adv_w = 476, .box_w = 31, .box_h = 33, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22273, .adv_w = 484, .box_w = 28, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22735, .adv_w = 245, .box_w = 11, .box_h = 44, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 22977, .adv_w = 259, .box_w = 20, .box_h = 44, .ofs_x = -2, .ofs_y = -5}, + {.bitmap_index = 23417, .adv_w = 245, .box_w = 11, .box_h = 44, .ofs_x = 0, .ofs_y = -9}, + {.bitmap_index = 23659, .adv_w = 429, .box_w = 21, .box_h = 20, .ofs_x = 3, .ofs_y = 7}, + {.bitmap_index = 23869, .adv_w = 368, .box_w = 23, .box_h = 3, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 23904, .adv_w = 442, .box_w = 13, .box_h = 6, .ofs_x = 5, .ofs_y = 28}, + {.bitmap_index = 23943, .adv_w = 440, .box_w = 22, .box_h = 25, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 24218, .adv_w = 502, .box_w = 26, .box_h = 35, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 24673, .adv_w = 420, .box_w = 24, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 24973, .adv_w = 502, .box_w = 27, .box_h = 35, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 25446, .adv_w = 450, .box_w = 26, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 25771, .adv_w = 260, .box_w = 18, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 26086, .adv_w = 508, .box_w = 27, .box_h = 34, .ofs_x = 1, .ofs_y = -9}, + {.bitmap_index = 26545, .adv_w = 501, .box_w = 24, .box_h = 35, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 26965, .adv_w = 205, .box_w = 7, .box_h = 36, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 27091, .adv_w = 209, .box_w = 15, .box_h = 45, .ofs_x = -5, .ofs_y = -9}, + {.bitmap_index = 27429, .adv_w = 453, .box_w = 25, .box_h = 35, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 27867, .adv_w = 205, .box_w = 5, .box_h = 35, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 27955, .adv_w = 778, .box_w = 41, .box_h = 25, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 28468, .adv_w = 501, .box_w = 24, .box_h = 25, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 28768, .adv_w = 467, .box_w = 27, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29106, .adv_w = 502, .box_w = 26, .box_h = 34, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 29548, .adv_w = 502, .box_w = 27, .box_h = 34, .ofs_x = 1, .ofs_y = -9}, + {.bitmap_index = 30007, .adv_w = 302, .box_w = 14, .box_h = 25, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 30182, .adv_w = 369, .box_w = 21, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 30445, .adv_w = 305, .box_w = 18, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 30724, .adv_w = 498, .box_w = 24, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 31024, .adv_w = 411, .box_w = 27, .box_h = 25, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 31362, .adv_w = 662, .box_w = 42, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 31887, .adv_w = 406, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 32200, .adv_w = 411, .box_w = 28, .box_h = 34, .ofs_x = -2, .ofs_y = -9}, + {.bitmap_index = 32676, .adv_w = 383, .box_w = 22, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 32951, .adv_w = 258, .box_w = 14, .box_h = 44, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 33259, .adv_w = 220, .box_w = 5, .box_h = 44, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 33369, .adv_w = 258, .box_w = 14, .box_h = 44, .ofs_x = 0, .ofs_y = -9}, + {.bitmap_index = 33677, .adv_w = 428, .box_w = 23, .box_h = 8, .ofs_x = 2, .ofs_y = 12}, + {.bitmap_index = 33769, .adv_w = 308, .box_w = 16, .box_h = 15, .ofs_x = 2, .ofs_y = 18}, + {.bitmap_index = 33889, .adv_w = 231, .box_w = 9, .box_h = 9, .ofs_x = 3, .ofs_y = 9}, + {.bitmap_index = 33930, .adv_w = 736, .box_w = 47, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 35035, .adv_w = 736, .box_w = 46, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 35840, .adv_w = 736, .box_w = 46, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 36783, .adv_w = 736, .box_w = 46, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 37588, .adv_w = 506, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 38116, .adv_w = 736, .box_w = 45, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 39174, .adv_w = 736, .box_w = 44, .box_h = 47, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 40208, .adv_w = 828, .box_w = 52, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 41274, .adv_w = 736, .box_w = 46, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 42355, .adv_w = 828, .box_w = 52, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 43265, .adv_w = 736, .box_w = 46, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 44346, .adv_w = 368, .box_w = 23, .box_h = 36, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 44760, .adv_w = 552, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 45390, .adv_w = 828, .box_w = 52, .box_h = 44, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 46534, .adv_w = 736, .box_w = 46, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 47339, .adv_w = 506, .box_w = 32, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 48091, .adv_w = 644, .box_w = 30, .box_h = 42, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 48721, .adv_w = 644, .box_w = 41, .box_h = 48, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 49705, .adv_w = 644, .box_w = 41, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 50546, .adv_w = 644, .box_w = 41, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 51387, .adv_w = 644, .box_w = 30, .box_h = 42, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 52017, .adv_w = 644, .box_w = 42, .box_h = 41, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 52878, .adv_w = 460, .box_w = 25, .box_h = 40, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 53378, .adv_w = 460, .box_w = 25, .box_h = 40, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 53878, .adv_w = 644, .box_w = 41, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 54719, .adv_w = 644, .box_w = 41, .box_h = 10, .ofs_x = 0, .ofs_y = 12}, + {.bitmap_index = 54924, .adv_w = 828, .box_w = 52, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 55834, .adv_w = 920, .box_w = 58, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 57197, .adv_w = 828, .box_w = 54, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 58466, .adv_w = 736, .box_w = 46, .box_h = 42, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 59432, .adv_w = 644, .box_w = 40, .box_h = 25, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 59932, .adv_w = 644, .box_w = 40, .box_h = 25, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 60432, .adv_w = 920, .box_w = 58, .box_h = 36, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 61476, .adv_w = 736, .box_w = 46, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 62281, .adv_w = 736, .box_w = 46, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 63362, .adv_w = 736, .box_w = 47, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 64467, .adv_w = 644, .box_w = 41, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 65308, .adv_w = 644, .box_w = 41, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 66272, .adv_w = 644, .box_w = 41, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 67113, .adv_w = 644, .box_w = 41, .box_h = 36, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 67851, .adv_w = 736, .box_w = 46, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 68656, .adv_w = 460, .box_w = 31, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 69385, .adv_w = 644, .box_w = 41, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 70349, .adv_w = 644, .box_w = 41, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 71313, .adv_w = 828, .box_w = 52, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 72223, .adv_w = 736, .box_w = 48, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 73351, .adv_w = 552, .box_w = 35, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 74174, .adv_w = 920, .box_w = 58, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 75392, .adv_w = 920, .box_w = 58, .box_h = 30, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 76262, .adv_w = 920, .box_w = 58, .box_h = 30, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 77132, .adv_w = 920, .box_w = 58, .box_h = 30, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 78002, .adv_w = 920, .box_w = 58, .box_h = 30, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 78872, .adv_w = 920, .box_w = 58, .box_h = 30, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 79742, .adv_w = 920, .box_w = 58, .box_h = 36, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 80786, .adv_w = 644, .box_w = 36, .box_h = 47, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 81632, .adv_w = 644, .box_w = 41, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 82596, .adv_w = 736, .box_w = 47, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 83701, .adv_w = 920, .box_w = 58, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 84716, .adv_w = 552, .box_w = 35, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 85539, .adv_w = 740, .box_w = 47, .box_h = 30, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 7, 0, 0, 0, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 33, 0, 20, -16, 0, 0, + 0, 0, -40, -44, 5, 35, 16, 13, + -29, 5, 36, 2, 31, 7, 24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 44, 6, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 0, -22, 0, 0, 0, 0, + 0, -15, 13, 15, 0, 0, -7, 0, + -5, 7, 0, -7, 0, -7, -4, -15, + 0, 0, 0, 0, -7, 0, 0, -10, + -11, 0, 0, -7, 0, -15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + -7, 0, -11, 0, -20, 0, -89, 0, + 0, -15, 0, 15, 22, 1, 0, -15, + 7, 7, 24, 15, -13, 15, 0, 0, + -42, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -27, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -20, -9, -36, 0, -29, + -5, 0, 0, 0, 0, 1, 29, 0, + -22, -6, -2, 2, 0, -13, 0, 0, + -5, -54, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -59, -6, 28, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -30, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 24, + 0, 7, 0, 0, -15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 28, 6, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -27, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, + 15, 7, 22, -7, 0, 0, 15, -7, + -24, -101, 5, 20, 15, 1, -10, 0, + 26, 0, 24, 0, 24, 0, -68, 0, + -9, 22, 0, 24, -7, 15, 7, 0, + 0, 2, -7, 0, 0, -13, 59, 0, + 59, 0, 22, 0, 31, 10, 13, 22, + 0, 0, 0, -27, 0, 0, 0, 0, + 2, -5, 0, 5, -13, -10, -15, 5, + 0, -7, 0, 0, 0, -29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -48, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -40, 0, -46, 0, 0, 0, + 0, -5, 0, 73, -9, -10, 7, 7, + -7, 0, -10, 7, 0, 0, -39, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -71, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -46, 0, 44, 0, 0, -27, 0, + 24, 0, -50, -71, -50, -15, 22, 0, + 0, -49, 0, 9, -17, 0, -11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 22, -90, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 5, 0, 0, 0, + 0, 0, 5, 5, -9, -15, 0, -2, + -2, -7, 0, 0, -5, 0, 0, 0, + -15, 0, -6, 0, -17, -15, 0, -18, + -24, -24, -14, 0, -15, 0, -15, 0, + 0, 0, 0, -6, 0, 0, 7, 0, + 5, -7, 0, 2, 0, 0, 0, 7, + -5, 0, 0, 0, -5, 7, 7, -2, + 0, 0, 0, -14, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 10, -5, 0, + -9, 0, -13, 0, 0, -5, 0, 22, + 0, 0, -7, 0, 0, 0, 0, 0, + -2, 2, -5, -5, 0, 0, -7, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -4, 0, -7, -9, 0, + 0, 0, 0, 0, 2, 0, 0, -5, + 0, -7, -7, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, -5, -10, 0, -11, 0, -22, + -5, -22, 15, 0, 0, -15, 7, 15, + 20, 0, -18, -2, -9, 0, -2, -35, + 7, -5, 5, -39, 7, 0, 0, 2, + -38, 0, -39, -6, -64, -5, 0, -37, + 0, 15, 21, 0, 10, 0, 0, 0, + 0, 1, 0, -13, -10, 0, -22, 0, + 0, 0, -7, 0, 0, 0, -7, 0, + 0, 0, 0, 0, -4, -4, 0, -4, + -10, 0, 0, 0, 0, 0, 0, 0, + -7, -7, 0, -5, -9, -6, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, -6, 0, -9, + 0, -5, 0, -15, 7, 0, 0, -9, + 4, 7, 7, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 5, + 0, 0, -7, 0, -7, -5, -9, 0, + 0, 0, 0, 0, 0, 0, 6, 0, + -6, 0, 0, 0, 0, -8, -11, 0, + -14, 0, 22, -5, 2, -24, 0, 0, + 20, -37, -38, -31, -15, 7, 0, -6, + -48, -13, 0, -13, 0, -15, 11, -13, + -47, 0, -20, 0, 0, 4, -2, 6, + -5, 0, 7, 1, -22, -28, 0, -37, + -18, -15, -18, -22, -9, -20, -1, -14, + -20, 4, 0, 2, 0, -7, 0, 0, + 0, 5, 0, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + 0, -4, 0, -2, -7, 0, -13, -16, + -16, -2, 0, -22, 0, 0, 0, 0, + 0, 0, -6, 0, 0, 0, 0, 3, + -4, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 35, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + -14, 0, 0, 0, 0, -37, -22, 0, + 0, 0, -11, -37, 0, 0, -7, 7, + 0, -20, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, -14, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, -13, 0, + 0, 0, 0, 9, 0, 5, -15, -15, + 0, -7, -7, -9, 0, 0, 0, 0, + 0, 0, -22, 0, -7, 0, -11, -7, + 0, -16, -18, -22, -6, 0, -15, 0, + -22, 0, 0, 0, 0, 59, 0, 0, + 4, 0, 0, -10, 0, 7, 0, -32, + 0, 0, 0, 0, 0, -68, -13, 24, + 22, -6, -31, 0, 7, -11, 0, -37, + -4, -10, 7, -52, -7, 10, 0, 11, + -26, -11, -27, -24, -31, 0, 0, -44, + 0, 42, 0, 0, -4, 0, 0, 0, + -4, -4, -7, -20, -24, -1, -68, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -7, 0, -4, -7, -11, 0, 0, + -15, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -15, 0, 0, 15, + -2, 10, 0, -16, 7, -5, -2, -19, + -7, 0, -10, -7, -5, 0, -11, -13, + 0, 0, -6, -2, -5, -13, -9, 0, + 0, -7, 0, 7, -5, 0, -16, 0, + 0, 0, -15, 0, -13, 0, -13, -13, + 7, 0, 0, 0, 0, 0, 0, 0, + 0, -15, 7, 0, -10, 0, -5, -9, + -23, -5, -5, -5, -2, -5, -9, -2, + 0, 0, 0, 0, 0, -7, -6, -6, + 0, 0, 0, 0, 9, -5, 0, -5, + 0, 0, 0, -5, -9, -5, -7, -9, + -7, 0, 6, 29, -2, 0, -20, 0, + -5, 15, 0, -7, -31, -10, 11, 1, + 0, -35, -13, 7, -13, 5, 0, -5, + -6, -24, 0, -11, 4, 0, 0, -13, + 0, 0, 0, 7, 7, -15, -14, 0, + -13, -7, -11, -7, -7, 0, -13, 4, + -14, -13, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -6, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, -10, + 0, 0, -7, -7, 0, 0, 0, 0, + -7, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, -5, 0, 0, 0, 0, + -11, 0, -15, 0, 0, 0, -24, 0, + 5, -16, 15, 1, -5, -35, 0, 0, + -16, -7, 0, -29, -18, -21, 0, 0, + -32, -7, -29, -28, -35, 0, -19, 0, + 6, 49, -10, 0, -17, -7, -2, -7, + -13, -20, -13, -27, -30, -17, -7, 0, + 0, -5, 0, 2, 0, 0, -52, -7, + 22, 16, -16, -27, 0, 2, -23, 0, + -37, -5, -7, 15, -68, -10, 2, 0, + 0, -48, -9, -38, -7, -54, 0, 0, + -52, 0, 43, 2, 0, -5, 0, 0, + 0, 0, -4, -5, -28, -5, 0, -48, + 0, 0, 0, 0, -24, 0, -7, 0, + -2, -21, -35, 0, 0, -4, -11, -22, + -7, 0, -5, 0, 0, 0, 0, -33, + -7, -24, -24, -6, -13, -18, -7, -13, + 0, -15, -7, -24, -11, 0, -9, -14, + -7, -14, 0, 4, 0, -5, -24, 0, + 15, 0, -13, 0, 0, 0, 0, 9, + 0, 5, -15, 30, 0, -7, -7, -9, + 0, 0, 0, 0, 0, 0, -22, 0, + -7, 0, -11, -7, 0, -16, -18, -22, + -6, 0, -15, 6, 29, 0, 0, 0, + 0, 59, 0, 0, 4, 0, 0, -10, + 0, 7, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -5, -15, 0, 0, 0, 0, 0, -4, + 0, 0, 0, -7, -7, 0, 0, -15, + -7, 0, 0, -15, 0, 13, -4, 0, + 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 11, 15, 6, -7, 0, -24, + -12, 0, 22, -24, -24, -15, -15, 29, + 13, 7, -64, -5, 15, -7, 0, -7, + 8, -7, -26, 0, -7, 7, -10, -6, + -22, -6, 0, 0, 22, 15, 0, -21, + 0, -40, -10, 21, -10, -28, 2, -10, + -24, -24, -7, 29, 7, 0, -11, 0, + -20, 0, 6, 24, -17, -27, -29, -18, + 22, 0, 2, -54, -6, 7, -13, -5, + -17, 0, -16, -27, -11, -11, -6, 0, + 0, -17, -15, -7, 0, 22, 17, -7, + -40, 0, -40, -10, 0, -26, -43, -2, + -24, -13, -24, -21, 20, 0, 0, -10, + 0, -15, -7, 0, -7, -13, 0, 13, + -24, 7, 0, 0, -39, 0, -7, -16, + -13, -5, -22, -18, -24, -17, 0, -22, + -7, -17, -14, -22, -7, 0, 0, 2, + 35, -13, 0, -22, -7, 0, -7, -15, + -17, -20, -21, -28, -10, -15, 15, 0, + -11, 0, -37, -9, 4, 15, -24, -27, + -15, -24, 24, -7, 4, -68, -13, 15, + -16, -13, -27, 0, -22, -31, -9, -7, + -6, -7, -15, -22, -2, 0, 0, 22, + 21, -5, -48, 0, -44, -17, 18, -28, + -50, -15, -26, -31, -37, -24, 15, 0, + 0, 0, 0, -9, 0, 0, 7, -9, + 15, 5, -14, 15, 0, 0, -23, -2, + 0, -2, 0, 2, 2, -6, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 6, 22, 1, 0, -9, 0, 0, + 0, 0, -5, -5, -9, 0, 0, 0, + 2, 6, 0, 0, 0, 0, 6, 0, + -6, 0, 28, 0, 13, 2, 2, -10, + 0, 15, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 21, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -44, 0, -7, 13, 0, 22, + 0, 0, 73, 9, -15, -15, 7, 7, + -5, 2, -37, 0, 0, 35, -44, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -50, 28, 103, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -44, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, -14, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, -20, 0, + 0, 2, 0, 0, 7, 95, -15, -6, + 24, 20, -20, 7, 0, 0, 7, 7, + -10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -96, 21, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -21, + 0, 0, 0, -20, 0, 0, 0, 0, + -16, -4, 0, 0, 0, -16, 0, -9, + 0, -35, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -49, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -7, 0, 0, -14, 0, -11, 0, + -20, 0, 0, 0, -13, 7, -9, 0, + 0, -20, -7, -17, 0, 0, -20, 0, + -7, 0, -35, 0, -8, 0, 0, -60, + -14, -29, -8, -26, 0, 0, -49, 0, + -20, -4, 0, 0, 0, 0, 0, 0, + 0, 0, -11, -13, -6, -13, 0, 0, + 0, 0, -16, 0, -16, 10, -8, 15, + 0, -5, -17, -5, -13, -14, 0, -9, + -4, -5, 5, -20, -2, 0, 0, 0, + -65, -6, -10, 0, -16, 0, -5, -35, + -7, 0, 0, -5, -6, 0, 0, 0, + 0, 5, 0, -5, -13, -5, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 0, 0, + 0, -16, 0, -5, 0, 0, 0, -15, + 7, 0, 0, 0, -20, -7, -15, 0, + 0, -21, 0, -7, 0, -35, 0, 0, + 0, 0, -71, 0, -15, -27, -37, 0, + 0, -49, 0, -5, -11, 0, 0, 0, + 0, 0, 0, 0, 0, -7, -11, -4, + -11, 2, 0, 0, 13, -10, 0, 23, + 36, -7, -7, -22, 9, 36, 13, 16, + -20, 9, 31, 9, 21, 16, 20, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 46, 35, -13, -7, 0, -6, + 59, 32, 59, 0, 0, 0, 7, 0, + 0, 27, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 10, + 0, 0, 0, 0, -62, -9, -6, -30, + -36, 0, 0, -49, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, -62, -9, -6, + -30, -36, 0, 0, -29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -6, 0, 0, 0, -17, 7, 0, -7, + 6, 13, 7, -22, 0, -1, -6, 7, + 0, 6, 0, 0, 0, 0, -18, 0, + -7, -5, -15, 0, -7, -29, 0, 46, + -7, 0, -16, -5, 0, -5, -13, 0, + -7, -21, -15, -9, 0, 0, 0, -12, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 0, -62, + -9, -6, -30, -36, 0, 0, -49, 0, + 0, 0, 0, 0, 0, 37, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -12, 0, -24, -9, -7, 22, -7, -7, + -29, 2, -4, 2, -5, -20, 1, 16, + 1, 6, 2, 6, -18, -29, -9, 0, + -28, -14, -20, -31, -29, 0, -12, -15, + -9, -10, -6, -5, -9, -5, 0, -5, + -2, 11, 0, 11, -5, 0, 23, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, -7, -7, 0, 0, + -20, 0, -4, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -44, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, -7, 0, -10, + 0, 0, 0, 0, -6, 0, 0, -13, + -7, 7, 0, -13, -14, -5, 0, -21, + -5, -16, -5, -9, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -49, 0, 24, 0, 0, -13, 0, + 0, 0, 0, -10, 0, -7, 0, 0, + -4, 0, 0, -5, 0, -17, 0, 0, + 31, -10, -24, -23, 5, 8, 8, -1, + -21, 5, 11, 5, 22, 5, 24, -5, + -20, 0, 0, -29, 0, 0, -22, -20, + 0, 0, -15, 0, -10, -13, 0, -11, + 0, -11, 0, -5, 11, 0, -6, -22, + -7, 27, 0, 0, -7, 0, -15, 0, + 0, 10, -17, 0, 7, -7, 6, 1, + 0, -24, 0, -5, -2, 0, -7, 8, + -6, 0, 0, 0, -30, -9, -16, 0, + -22, 0, 0, -35, 0, 27, -7, 0, + -13, 0, 4, 0, -7, 0, -7, -22, + 0, -7, 7, 0, 0, 0, 0, -5, + 0, 0, 7, -10, 2, 0, 0, -9, + -5, 0, -9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -46, 0, 16, 0, + 0, -6, 0, 0, 0, 0, 1, 0, + -7, -7, 0, 0, 0, 15, 0, 17, + 0, 0, 0, 0, 0, -46, -42, 2, + 32, 22, 13, -29, 5, 31, 0, 27, + 0, 15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 39, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserrat_46 = { +#else +lv_font_t lv_font_montserrat_46 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 50, /*The maximum line height required by the font*/ + .base_line = 9, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -3, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_46*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_48.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_48.c new file mode 100644 index 0000000..9961b83 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_48.c @@ -0,0 +1,12578 @@ +/******************************************************************************* + * Size: 48 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 48 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_48.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_48 + #define LV_FONT_MONTSERRAT_48 1 +#endif + +#if LV_FONT_MONTSERRAT_48 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x3f, 0xff, 0xff, 0x23, 0xff, 0xff, 0xf1, 0x2f, + 0xff, 0xff, 0x11, 0xff, 0xff, 0xf0, 0x1f, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xfe, + 0x0, 0xff, 0xff, 0xd0, 0xf, 0xff, 0xfd, 0x0, + 0xef, 0xff, 0xc0, 0xd, 0xff, 0xfc, 0x0, 0xdf, + 0xff, 0xb0, 0xc, 0xff, 0xfa, 0x0, 0xcf, 0xff, + 0xa0, 0xb, 0xff, 0xf9, 0x0, 0xaf, 0xff, 0x80, + 0xa, 0xff, 0xf8, 0x0, 0x9f, 0xff, 0x70, 0x9, + 0xff, 0xf7, 0x0, 0x8f, 0xff, 0x60, 0x7, 0xff, + 0xf5, 0x0, 0x7f, 0xff, 0x50, 0x6, 0xff, 0xf4, + 0x0, 0x14, 0x44, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x7, 0xff, 0xf6, 0x4, 0xff, 0xff, + 0xf3, 0x9f, 0xff, 0xff, 0x79, 0xff, 0xff, 0xf6, + 0x3f, 0xff, 0xff, 0x10, 0x4c, 0xfc, 0x30, + + /* U+0022 "\"" */ + 0xff, 0xff, 0x0, 0x0, 0x4f, 0xff, 0xbf, 0xff, + 0xf0, 0x0, 0x4, 0xff, 0xfb, 0xef, 0xff, 0x0, + 0x0, 0x3f, 0xff, 0xae, 0xff, 0xf0, 0x0, 0x3, + 0xff, 0xfa, 0xef, 0xff, 0x0, 0x0, 0x3f, 0xff, + 0xad, 0xff, 0xe0, 0x0, 0x2, 0xff, 0xf9, 0xdf, + 0xfe, 0x0, 0x0, 0x2f, 0xff, 0x9c, 0xff, 0xd0, + 0x0, 0x1, 0xff, 0xf8, 0xcf, 0xfd, 0x0, 0x0, + 0x1f, 0xff, 0x8c, 0xff, 0xc0, 0x0, 0x1, 0xff, + 0xf7, 0xbf, 0xfc, 0x0, 0x0, 0xf, 0xff, 0x7b, + 0xff, 0xc0, 0x0, 0x0, 0xff, 0xf7, 0xbf, 0xfb, + 0x0, 0x0, 0xf, 0xff, 0x61, 0x22, 0x10, 0x0, + 0x0, 0x22, 0x20, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x1, 0x88, 0x88, 0x88, 0xcf, 0xff, 0x88, 0x88, + 0x88, 0x88, 0x9f, 0xff, 0xb8, 0x88, 0x88, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x68, 0x88, 0x88, 0x8d, 0xff, 0xe8, 0x88, 0x88, + 0x88, 0x89, 0xff, 0xfa, 0x88, 0x88, 0x87, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, + 0xff, 0xfd, 0xc8, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0xa, 0xff, 0xff, 0xfe, 0x95, 0x7f, 0xfc, 0x45, + 0x8c, 0xff, 0xff, 0xc0, 0x0, 0x4, 0xff, 0xff, + 0xf8, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x1, 0x7e, + 0xf5, 0x0, 0x0, 0xbf, 0xff, 0xf7, 0x0, 0x0, + 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, + 0xf, 0xff, 0xfd, 0x0, 0x0, 0x6, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x6f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0x20, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x30, + 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xb4, 0x6, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xfe, 0xcf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x5a, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xee, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x3, + 0xaf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x1b, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfb, 0x0, 0x0, 0xa, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xb0, + 0x0, 0x0, 0x1f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0xe, 0xff, 0xfc, + 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x90, 0xe, 0xf8, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, + 0xcf, 0xff, 0xf5, 0x6, 0xff, 0xfe, 0x71, 0x0, + 0x0, 0x6f, 0xfb, 0x0, 0x1, 0xbf, 0xff, 0xfd, + 0x0, 0xdf, 0xff, 0xff, 0xfb, 0x74, 0x37, 0xff, + 0xb3, 0x6a, 0xff, 0xff, 0xff, 0x40, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x48, 0xbe, 0xff, 0xff, 0xff, 0xda, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x88, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x0, 0x5, 0xbe, 0xfe, 0xc7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xfe, 0xcd, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfe, 0x40, 0x0, 0x3c, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf2, 0x0, + 0x0, 0x1, 0xdf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x5f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x40, 0x0, 0x0, + 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x50, 0x0, 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, 0x8f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x40, 0x0, + 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x30, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x10, 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x5f, 0xfd, 0x0, 0x0, 0x9f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf2, 0x0, 0x0, 0x1, 0xdf, 0xf7, 0x0, + 0x4, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x50, 0x0, 0x3c, + 0xff, 0xe0, 0x0, 0xe, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xfe, 0xce, 0xff, 0xff, 0x30, 0x0, 0x9f, 0xff, + 0x20, 0x0, 0x16, 0xab, 0xb9, 0x40, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x4, 0xff, 0xf6, 0x0, 0x5, 0xef, 0xff, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x5, 0xbe, 0xfe, + 0xc7, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x10, 0x3, 0xff, 0xfb, 0x30, 0x15, 0xef, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf6, 0x0, 0xd, 0xff, 0xa0, 0x0, + 0x0, 0x1d, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0x0, 0x3f, + 0xfe, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x10, 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf5, 0x0, 0x0, 0xbf, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0x0, 0x0, + 0xdf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x10, 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xdf, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0xcf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x9f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfd, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x70, 0x0, 0x0, 0xc, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf7, + 0x0, 0x2, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xfd, 0xdf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x39, 0xdf, 0xfd, 0x81, 0x0, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0xad, 0xff, 0xec, + 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xa7, 0x68, 0xcf, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x5f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf7, + 0x0, 0x6, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xf6, + 0x3c, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xf6, 0x4, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x4f, 0xb6, 0x10, 0x0, 0x8, + 0xff, 0xff, 0xc1, 0x0, 0x4, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x5, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0xcf, 0xff, 0x40, 0x0, 0xef, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf8, + 0x0, 0x2f, 0xff, 0xf0, 0x0, 0x5f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf8, + 0x9, 0xff, 0xfa, 0x0, 0xa, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf9, + 0xff, 0xff, 0x40, 0x0, 0xcf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0xbf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xfe, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xe7, 0x30, 0x0, + 0x1, 0x59, 0xff, 0xff, 0xff, 0xef, 0xff, 0xfa, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0xef, + 0xff, 0xff, 0xff, 0xfe, 0x31, 0xdf, 0xff, 0xfa, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x2, 0xef, 0xff, 0xc0, + 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb4, 0x0, 0x0, 0x2, 0xef, 0xe1, 0x0, + 0x0, 0x0, 0x2, 0x7a, 0xdf, 0xff, 0xed, 0xa6, + 0x10, 0x0, 0x0, 0x0, 0x2, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0xff, 0xff, 0xf, 0xff, 0xf0, 0xef, 0xff, 0xe, + 0xff, 0xf0, 0xef, 0xff, 0xd, 0xff, 0xe0, 0xdf, + 0xfe, 0xc, 0xff, 0xd0, 0xcf, 0xfd, 0xc, 0xff, + 0xc0, 0xbf, 0xfc, 0xb, 0xff, 0xc0, 0xbf, 0xfb, + 0x1, 0x22, 0x10, + + /* U+0028 "(" */ + 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x9f, 0xff, 0xd0, 0x0, 0x0, 0x2f, 0xff, 0xf5, + 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x7f, 0xff, 0xf0, + 0x0, 0x0, 0xd, 0xff, 0xfa, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x7f, 0xff, 0xf0, + 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x4f, 0xff, 0xf3, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, 0x6f, 0xff, + 0xf2, 0x0, 0x0, 0x6, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, 0x4f, + 0xff, 0xf3, 0x0, 0x0, 0x3, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xd, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, + 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, + 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xd0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, + + /* U+0029 ")" */ + 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xc0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, 0x0, + 0x0, 0xb, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x2f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xb0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x70, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x70, 0x0, 0x0, 0xe, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x90, 0x0, 0x0, 0xd, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x0, + 0x0, 0xd, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x90, 0x0, 0x0, 0xe, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1f, + 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xe0, + 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x3f, 0xff, 0xf3, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x1f, 0xff, 0xf6, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x4f, 0xff, 0xf4, + 0x0, 0x0, 0xb, 0xff, 0xfc, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xaf, 0xff, 0xc0, + 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, + 0xd, 0xff, 0x0, 0x0, 0x2a, 0x10, 0x5, 0xff, + 0xa1, 0x0, 0xdf, 0xf0, 0x0, 0x8f, 0xf8, 0x0, + 0xdf, 0xff, 0xf7, 0xc, 0xff, 0x5, 0xef, 0xff, + 0xf1, 0x2, 0xbf, 0xff, 0xfd, 0xef, 0xfb, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x19, 0xff, 0xff, 0xee, 0xff, 0xcf, 0xff, + 0xfb, 0x20, 0xd, 0xff, 0xff, 0x80, 0xcf, 0xf0, + 0x6e, 0xff, 0xff, 0x10, 0x6f, 0xfb, 0x20, 0xd, + 0xff, 0x0, 0x19, 0xff, 0x90, 0x0, 0xb5, 0x0, + 0x0, 0xdf, 0xf0, 0x0, 0x3, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x44, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xad, 0xdd, 0xdd, 0xdd, 0xdf, + 0xff, 0xfd, 0xdd, 0xdd, 0xdd, 0xd9, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, + + /* U+002C "," */ + 0x0, 0x57, 0x50, 0x0, 0xcf, 0xff, 0xb0, 0x7f, + 0xff, 0xff, 0x5a, 0xff, 0xff, 0xf9, 0x9f, 0xff, + 0xff, 0x83, 0xff, 0xff, 0xf5, 0x4, 0xef, 0xff, + 0x10, 0xd, 0xff, 0xb0, 0x1, 0xff, 0xf6, 0x0, + 0x5f, 0xff, 0x10, 0x9, 0xff, 0xb0, 0x0, 0xdf, + 0xf6, 0x0, 0x1f, 0xff, 0x10, 0x5, 0xff, 0xb0, + 0x0, + + /* U+002D "-" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, + + /* U+002E "." */ + 0x0, 0x79, 0x70, 0x1, 0xdf, 0xff, 0xc0, 0x8f, + 0xff, 0xff, 0x6b, 0xff, 0xff, 0xf9, 0xaf, 0xff, + 0xff, 0x73, 0xff, 0xff, 0xf1, 0x4, 0xcf, 0xc3, + 0x0, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, 0xfe, + 0xc8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfb, 0x75, 0x57, + 0xbf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, 0x0, + 0x2, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x20, 0x8, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x80, 0xd, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xd0, 0x1f, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0x5f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0x7f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf7, 0x9f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf9, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfa, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0xaf, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfb, 0xaf, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xfa, 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf9, + 0x7f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x5f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf5, 0x1f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf1, 0xd, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xd0, + 0x8, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x90, 0x2, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x20, 0x0, 0xbf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xfb, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xfb, 0x76, 0x67, 0xbf, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x8c, 0xef, 0xfe, 0xc8, 0x30, + 0x0, 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x23, 0x33, 0x33, 0x34, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfb, + + /* U+0032 "2" */ + 0x0, 0x0, 0x0, 0x3, 0x7b, 0xde, 0xff, 0xed, + 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xfa, 0x76, 0x55, 0x7a, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x1c, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xbf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf5, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, + + /* U+0033 "3" */ + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x38, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xfd, 0xa7, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x8e, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf2, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xe0, 0x6, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0x90, 0xe, 0xff, 0xfe, 0x72, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, + 0x10, 0x8f, 0xff, 0xff, 0xff, 0xd9, 0x76, 0x56, + 0x7a, 0xef, 0xff, 0xff, 0xf7, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x1, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0x9c, 0xef, 0xff, 0xec, 0x96, 0x10, 0x0, + 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x3, 0xbb, 0xbb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0x42, 0x22, 0x22, 0x22, 0x22, 0x22, 0x7f, + 0xff, 0xf4, 0x22, 0x22, 0x21, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x82, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x82, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf4, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xdc, 0x96, 0x20, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x60, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x2, 0x33, + 0x33, 0x33, 0x33, 0x45, 0x79, 0xdf, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xfa, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf6, 0x0, + 0xdf, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf1, 0x6, 0xff, 0xff, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, + 0x90, 0xe, 0xff, 0xff, 0xff, 0xfc, 0x87, 0x65, + 0x68, 0xcf, 0xff, 0xff, 0xfe, 0x10, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x39, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x7b, 0xde, 0xff, 0xfd, 0xb8, 0x40, 0x0, + 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xac, 0xef, + 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xb7, 0x53, 0x33, 0x57, + 0xbf, 0xf4, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x17, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x50, 0x0, 0x5, 0xad, 0xef, 0xfe, + 0xb8, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x22, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0xaf, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0xb, 0xff, 0xff, + 0xef, 0xff, 0xf9, 0x41, 0x0, 0x3, 0x8e, 0xff, + 0xff, 0xf8, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xf2, + 0x9, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x90, 0x8f, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0x6, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf2, 0x3f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf4, 0xb, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x30, 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, + 0xef, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x7, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x70, 0x0, 0xd, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xfa, 0x41, 0x0, 0x3, + 0x8e, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xce, 0xff, 0xfd, 0xa6, 0x10, + 0x0, 0x0, 0x0, + + /* U+0037 "7" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xff, 0xf4, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xdf, 0xff, + 0xf4, 0x9f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xc0, 0x9f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0x50, 0x9f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfe, 0x0, + 0x9f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf7, 0x0, 0x9f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xf1, 0x0, 0x25, 0x55, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, 0xff, 0xfe, + 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xf8, 0x41, 0x0, 0x1, 0x49, 0xff, + 0xff, 0xff, 0x50, 0x0, 0xf, 0xff, 0xff, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xfe, + 0x0, 0x5, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf4, 0x0, 0x9f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x70, 0xa, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf9, 0x0, 0xaf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x80, 0x7, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf6, 0x0, 0x3f, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x10, 0x0, 0xbf, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0x90, 0x0, + 0x1, 0xef, 0xff, 0xff, 0x95, 0x20, 0x0, 0x25, + 0xaf, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0xff, 0xdb, 0xbc, 0xdf, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x1, 0xef, 0xff, 0xff, 0x93, + 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, 0xd1, + 0x0, 0xbf, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0x90, 0x3f, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0x29, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf7, 0xcf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xad, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfc, 0xdf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xcc, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, 0x8f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x73, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xf1, 0xb, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfa, 0x0, + 0x2e, 0xff, 0xff, 0xfd, 0x73, 0x0, 0x0, 0x14, + 0x8e, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0xac, 0xef, 0xff, 0xec, 0xa6, 0x20, + 0x0, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x0, 0x3, 0x8c, 0xef, 0xff, 0xdb, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xb5, 0x10, 0x0, 0x15, 0xbf, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0x70, + 0x0, 0xe, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0x20, 0x4, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf9, 0x0, 0x8f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xe0, 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x50, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf9, 0x9, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xc0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x1, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xf1, 0xa, 0xff, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, + 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfb, 0x52, + 0x0, 0x1, 0x5b, 0xff, 0xff, 0xef, 0xff, 0xf3, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb8, 0xff, 0xff, 0x40, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x19, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x50, 0x9, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, 0xec, + 0x84, 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x4, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xcf, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0xbf, 0xfa, 0x74, 0x33, 0x45, 0x9d, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x69, 0xce, 0xff, 0xfe, 0xb9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+003A ":" */ + 0x4, 0xcf, 0xc3, 0x3, 0xff, 0xff, 0xf2, 0xaf, + 0xff, 0xff, 0x7b, 0xff, 0xff, 0xf9, 0x8f, 0xff, + 0xff, 0x61, 0xef, 0xff, 0xc0, 0x0, 0x79, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x97, 0x0, 0x1d, 0xff, + 0xfc, 0x8, 0xff, 0xff, 0xf6, 0xbf, 0xff, 0xff, + 0x9a, 0xff, 0xff, 0xf7, 0x3f, 0xff, 0xff, 0x10, + 0x4c, 0xfc, 0x30, + + /* U+003B ";" */ + 0x4, 0xcf, 0xc3, 0x3, 0xff, 0xff, 0xf2, 0xaf, + 0xff, 0xff, 0x7b, 0xff, 0xff, 0xf9, 0x8f, 0xff, + 0xff, 0x61, 0xef, 0xff, 0xc0, 0x0, 0x79, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x75, 0x0, 0xc, 0xff, + 0xfb, 0x7, 0xff, 0xff, 0xf5, 0xaf, 0xff, 0xff, + 0x99, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, 0x50, + 0x4e, 0xff, 0xf1, 0x0, 0xdf, 0xfb, 0x0, 0x1f, + 0xff, 0x60, 0x5, 0xff, 0xf1, 0x0, 0x9f, 0xfb, + 0x0, 0xd, 0xff, 0x60, 0x1, 0xff, 0xf1, 0x0, + 0x5f, 0xfb, 0x0, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x36, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6c, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xcf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x39, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, + 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, 0xff, 0xff, + 0x93, 0x0, 0x0, 0x0, 0x3, 0x9f, 0xff, 0xff, + 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x6, 0xcf, + 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, + 0x39, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfe, 0x82, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfe, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0xff, 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xff, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x9f, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, 0xff, + 0xff, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x39, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x9f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x36, + + /* U+003D "=" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xd9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xd9, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+003E ">" */ + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xc5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xe9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xfe, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3a, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, + 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x9e, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, + 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xef, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xbf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xef, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, + 0xfe, 0x92, 0x0, 0x0, 0x0, 0x2, 0x9e, 0xff, + 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x6, + 0xcf, 0xff, 0xff, 0xff, 0xe9, 0x20, 0x0, 0x0, + 0x0, 0x39, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xfe, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xe9, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xc6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x62, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x0, 0x4, 0x8b, 0xdf, 0xff, 0xed, + 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0xb, 0xff, 0xff, 0xff, 0xc7, 0x43, + 0x22, 0x48, 0xef, 0xff, 0xff, 0xf3, 0x4, 0xff, + 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xa0, 0x2, 0xdf, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, + 0x0, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x11, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0xfc, 0x20, 0x0, 0x0, 0x0, + 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x37, 0x9c, 0xde, 0xff, 0xed, 0xc9, 0x63, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xae, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xfd, 0xa7, 0x54, + 0x33, 0x45, 0x7a, 0xdf, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6d, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x37, 0xab, 0xba, 0x73, 0x0, 0x0, 0x3b, + 0xbb, 0xa0, 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x6e, + 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x5f, 0xff, + 0xd0, 0x1, 0xdf, 0xff, 0x20, 0x0, 0x0, 0xe, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x5f, 0xff, 0xd0, + 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x6f, 0xff, + 0x80, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x5f, 0xff, 0xd0, 0x0, + 0x7, 0xff, 0xf3, 0x0, 0x0, 0xef, 0xfe, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xf9, 0x41, 0x1, + 0x38, 0xef, 0xff, 0xef, 0xff, 0xd0, 0x0, 0x0, + 0xef, 0xfa, 0x0, 0x4, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x6f, + 0xff, 0x10, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x1f, 0xff, + 0x60, 0xf, 0xff, 0xb0, 0x0, 0x0, 0xc, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0xb, 0xff, 0xa0, + 0x2f, 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x5f, + 0xff, 0x30, 0x0, 0x0, 0x7f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xd0, 0x0, 0x0, 0x4, 0xff, 0xf0, 0x8f, 0xff, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd0, + 0x0, 0x0, 0x1, 0xff, 0xf2, 0x9f, 0xfe, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0xff, 0xf3, 0xaf, 0xfd, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0xff, 0xf4, 0xbf, 0xfd, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xff, 0xf4, 0xaf, 0xfd, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xff, + 0xf3, 0x9f, 0xfe, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x1, 0xff, 0xf3, + 0x8f, 0xff, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xd0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x5f, + 0xff, 0x30, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x5, 0xff, 0xe0, 0x2f, 0xff, + 0x60, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x9, 0xff, 0xb0, 0xe, 0xff, 0xb0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0xf, 0xff, 0x60, 0x9, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x8f, 0xff, 0x10, 0x4, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x3, + 0xbf, 0xff, 0xde, 0xff, 0xfb, 0x0, 0x6, 0xff, + 0xf9, 0x0, 0x0, 0xdf, 0xfe, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xfc, 0xbc, 0xef, 0xff, + 0xff, 0x2a, 0xff, 0xff, 0xeb, 0xdf, 0xff, 0xe1, + 0x0, 0x0, 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xd, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2, + 0x8b, 0xef, 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x2, + 0x9e, 0xfe, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xd6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x9f, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, + 0xff, 0xfd, 0xa7, 0x55, 0x44, 0x56, 0x9b, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, 0xac, + 0xee, 0xff, 0xed, 0xb8, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf9, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfe, + 0xd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x70, 0x7f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf9, 0x0, + 0x9, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x20, 0x0, 0x2f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xc0, 0x0, 0x0, 0xbf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xfe, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, 0x0, 0x9, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfb, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xf2, 0x0, 0x0, 0x7f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x90, 0x0, 0xe, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x10, + 0x6, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf8, 0x0, 0xdf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xe0, + + /* U+0042 "B" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xb8, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe8, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x7d, 0xff, 0xff, 0xfe, 0x0, + 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xf7, 0x0, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xd0, 0xf, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf1, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x10, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf0, 0xf, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfc, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x70, 0xf, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xe0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x14, 0x8e, 0xff, 0xff, 0xf3, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x59, 0xff, 0xff, + 0xff, 0x30, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xfd, + 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf5, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xaf, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfd, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xef, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfe, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xcf, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf8, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xaf, 0xff, 0xff, 0x3f, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x49, 0xff, + 0xff, 0xff, 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, + 0xc9, 0x61, 0x0, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, + 0xef, 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xc9, 0x65, 0x56, + 0x8b, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x5d, 0xff, 0xff, 0xf8, 0x0, 0x2, 0xff, + 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf8, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xe8, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0xd, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x90, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x90, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfe, + 0x81, 0x0, 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xfd, 0x97, 0x55, 0x68, 0xbf, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7a, 0xde, + 0xff, 0xfd, 0xb8, 0x40, 0x0, 0x0, 0x0, + + /* U+0044 "D" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xdb, 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, + 0x33, 0x45, 0x79, 0xdf, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, + 0xff, 0xd0, 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x30, 0xf, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfb, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xf2, 0xf, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x80, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfc, 0xf, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf0, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x2f, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf4, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x5f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf5, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf2, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xc0, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf8, 0xf, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0x20, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xb0, 0xf, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf9, 0x0, 0xf, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x9f, 0xff, 0xff, 0xfe, 0x20, 0x0, 0xf, 0xff, + 0xfe, 0x33, 0x33, 0x33, 0x33, 0x34, 0x46, 0x9d, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xee, 0xc9, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0045 "E" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x32, 0xf, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xd2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfe, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, + + /* U+0046 "F" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x32, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xff, 0xff, 0xd2, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x21, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xac, + 0xef, 0xff, 0xec, 0x95, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xd9, + 0x75, 0x56, 0x7a, 0xef, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xd0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xfd, 0x10, + 0x0, 0xd, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xc1, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x33, 0x20, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x7, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x1, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x0, 0x7f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x0, 0xc, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xe0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x8f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xd9, + 0x76, 0x56, 0x7a, 0xdf, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xad, + 0xef, 0xff, 0xdb, 0x95, 0x10, 0x0, 0x0, 0x0, + + /* U+0048 "H" */ + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, + + /* U+0049 "I" */ + 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, + 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, + 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, + 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, + 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, + 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, + 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, + 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, + 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, + 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, + 0xff, 0xff, 0xdf, 0xff, 0xfd, + + /* U+004A "J" */ + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xfa, 0x0, 0x3d, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x70, 0x2e, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf3, 0x1d, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfd, + 0x2, 0xff, 0xff, 0xff, 0xc6, 0x43, 0x48, 0xef, + 0xff, 0xff, 0x60, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xff, + 0xed, 0xa6, 0x10, 0x0, 0x0, + + /* U+004B "K" */ + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x20, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0x30, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0x50, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x1, + 0xdf, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0xc, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xd0, 0x0, 0xcf, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0xb, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xd0, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x68, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xaf, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0xc, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x30, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfc, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, + 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf6, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x40, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xe2, + + /* U+004C "L" */ + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe3, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+004D "M" */ + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfc, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfc, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfc, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xef, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xee, 0xff, 0xfc, 0xff, 0xff, 0xab, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x6d, 0xff, 0xfc, 0xff, 0xff, + 0xa2, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xfc, 0xd, 0xff, 0xfc, + 0xff, 0xff, 0xa0, 0x8f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0xd, + 0xff, 0xfc, 0xff, 0xff, 0xa0, 0xe, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xa0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x5, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0x10, 0xd, 0xff, 0xfc, 0xff, 0xff, + 0xa0, 0x0, 0xbf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf7, 0x0, 0xd, 0xff, 0xfc, + 0xff, 0xff, 0xa0, 0x0, 0x2f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xd0, 0x0, 0xd, + 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, 0x8, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, + 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xef, 0xff, 0xc0, 0x0, 0x0, 0xd, 0xff, + 0xfb, 0x0, 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x5f, 0xff, 0xf6, 0x0, 0x0, + 0x7f, 0xff, 0xf2, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0xc, 0xff, 0xfe, + 0x10, 0x1, 0xff, 0xff, 0x80, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x90, 0xa, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf2, 0x3f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfb, 0xcf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfc, + + /* U+004E "N" */ + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x7f, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0xaf, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0xdf, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x2, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x4, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x8, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0x70, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x40, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xfe, 0x20, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xfd, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xfa, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf7, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xad, + 0xef, 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xc9, 0x65, 0x56, 0x8b, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x5c, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xfc, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf5, + 0x0, 0x7, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xc0, 0x0, 0xcf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x20, 0x1f, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf7, + 0x5, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xa0, 0x8f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfd, 0x9, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xe0, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xa, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf0, 0x9f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x8, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xd0, 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xfa, 0x1, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, 0xc, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xf2, 0x0, 0x7f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xfc, 0x0, 0x0, 0xef, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x50, 0x0, 0x7, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6e, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xfc, + 0x96, 0x55, 0x68, 0xbf, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x7a, 0xde, 0xff, 0xed, 0xb8, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x82, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, 0x34, 0x56, + 0xae, 0xff, 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfe, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x50, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xa0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf1, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf1, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xe0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x50, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xf5, 0x0, 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, + 0x34, 0x56, 0xae, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xed, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xad, + 0xef, 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xc9, 0x65, 0x56, 0x8b, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0x40, 0x0, 0x6, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xc0, + 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf6, 0x0, 0x4f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xfa, 0x0, 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfd, 0x0, 0x9f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0x0, 0xaf, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0x0, 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfd, 0x0, 0x5f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x0, 0x2f, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf7, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf2, 0x0, 0x8, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xc0, 0x0, + 0x1, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xbf, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x43, + 0x34, 0x69, 0xdf, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x6a, 0xde, 0xff, 0xff, 0xff, 0xf7, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x4, 0xef, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0x94, 0x10, 0x25, 0xbf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x8b, 0xcd, 0xc9, + 0x50, 0x0, 0x0, + + /* U+0052 "R" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x81, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, 0x34, 0x56, + 0xae, 0xff, 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfe, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x50, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xa0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf2, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf1, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xe0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xb0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x60, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xf6, 0x0, 0xff, 0xff, 0xd2, 0x22, 0x22, 0x22, + 0x22, 0x35, 0x8d, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x50, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xfc, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x70, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xf3, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xa0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf5, + + /* U+0053 "S" */ + 0x0, 0x0, 0x0, 0x0, 0x16, 0x9c, 0xef, 0xff, + 0xec, 0x96, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x10, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xa6, 0x42, 0x23, 0x46, 0xad, + 0xff, 0xff, 0xd0, 0x0, 0x4, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9f, 0xf6, + 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0x0, 0x0, 0xf, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xfd, 0x95, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd9, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, + 0x9d, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7e, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfc, 0x0, + 0x65, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x90, 0xe, 0xfa, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf4, 0x6, 0xff, 0xff, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xfd, 0x0, + 0xdf, 0xff, 0xff, 0xfe, 0xa6, 0x42, 0x22, 0x35, + 0x7c, 0xff, 0xff, 0xff, 0x40, 0x3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x17, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0x9c, 0xef, 0xff, 0xed, 0xb8, 0x40, + 0x0, 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x37, 0xff, 0xff, + 0x93, 0x33, 0x33, 0x33, 0x33, 0x33, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, + 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, + 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x3f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf2, 0x2f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf1, 0x1f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0xf, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xe0, 0xc, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xb0, + 0x8, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x70, 0x4, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, 0x0, 0xdf, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xfc, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xfb, 0x30, 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xfd, 0x97, 0x55, 0x79, 0xdf, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x6a, 0xde, 0xff, 0xec, + 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x90, 0x0, 0xef, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, 0x8f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf4, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xd0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf7, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x6f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x50, 0x0, + 0xdf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xc0, 0x4, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf2, 0xb, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf9, 0x2f, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xaf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0x4f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf5, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0xa, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xb0, 0x5, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x50, + 0x0, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x0, 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xfb, 0x0, 0x0, 0x5f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x0, 0xf, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfd, 0xbf, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf8, 0x5f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xb0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0xf, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xd0, 0xb, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x80, 0x5, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x20, 0x0, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, + 0xaf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf7, + 0x0, 0x0, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf2, 0x0, 0x0, 0xf, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xd0, 0x0, 0x0, 0xa, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, 0xe, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf8, 0x0, 0x0, 0x5, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0xa, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, + 0x0, 0x0, 0x8f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x30, 0x0, + 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf4, 0x0, 0x0, 0xef, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x80, 0x0, 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf9, 0x0, 0x3, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0xbf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x0, 0x8, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf3, 0x1, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x40, 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x6, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x90, 0x3f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfd, 0xb, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xe0, 0x8f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x4f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0xef, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xdf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xfc, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0x4, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x70, + 0x0, 0x8f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfb, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfb, 0x0, + 0x0, 0x3f, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x60, + 0x0, 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf2, + 0x9, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfd, + 0x5f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, + 0x8f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xe1, + 0xc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0x40, + 0x2, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf9, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x60, 0x0, + 0x0, 0xc, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x9f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfd, 0x0, + 0x4, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x90, + 0x1e, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf5, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, + 0x0, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x50, 0x0, 0xaf, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xb0, 0x0, 0x1, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf2, 0x0, 0x0, 0x7, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf7, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xa0, 0x0, + 0x3f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, + 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, + 0x7, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf8, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+005A "Z" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x23, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x5f, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfd, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x30, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, + + /* U+005B "[" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0xff, 0xff, 0xdd, 0xdd, 0xd1, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xdd, 0xdd, 0xd1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + + /* U+005C "\\" */ + 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf0, + + /* U+005D "]" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xdd, 0xdd, 0xdf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf1, 0xdd, 0xdd, 0xdf, 0xff, 0xff, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xbb, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x44, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x0, + 0xdf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf7, 0x0, 0x7f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x1f, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xa0, + 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x30, 0x0, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, + 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, + 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf1, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, + 0x0, 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfe, 0x0, 0x5, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x50, 0xc, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xc0, 0x3f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf2, + + /* U+005F "_" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x7, 0x88, 0x88, 0x50, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0x70, + + /* U+0061 "a" */ + 0x0, 0x0, 0x0, 0x48, 0xbd, 0xef, 0xfd, 0xb8, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x3, 0xff, + 0xff, 0xd9, 0x52, 0x11, 0x25, 0x9f, 0xff, 0xff, + 0xf2, 0x0, 0xa, 0xfc, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xa0, 0x0, 0x27, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x49, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x6, 0xff, 0xff, 0xfd, 0x86, 0x55, 0x55, + 0x55, 0x56, 0xff, 0xff, 0x80, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, + 0x5f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x88, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x9f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x87, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf8, 0x4f, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0x80, 0xef, 0xff, 0xfa, 0x20, 0x0, 0x0, + 0x17, 0xef, 0xff, 0xff, 0xf8, 0x5, 0xff, 0xff, + 0xff, 0xda, 0x9a, 0xcf, 0xff, 0xfe, 0xef, 0xff, + 0x80, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x2d, 0xff, 0xf8, 0x0, 0x4, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0xdf, 0xff, 0x80, + 0x0, 0x0, 0x49, 0xce, 0xff, 0xdb, 0x72, 0x0, + 0xd, 0xff, 0xf8, + + /* U+0062 "b" */ + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x3, 0x8c, 0xef, 0xfe, 0xb8, + 0x30, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0xa, + 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0x95, 0x21, 0x25, 0x9f, 0xff, 0xff, + 0xfd, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf9, 0x0, + 0xaf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xf3, 0xa, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xa0, 0xaf, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xa, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xaf, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfa, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xba, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfb, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xaa, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, 0xaf, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x4a, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xf0, 0xaf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfa, 0xa, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x30, 0xaf, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0x90, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x52, 0x12, 0x59, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xaf, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0xa, 0xff, 0xfc, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0x3, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, + 0xa, 0xff, 0xfc, 0x0, 0x0, 0x38, 0xce, 0xff, + 0xeb, 0x83, 0x0, 0x0, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, 0xfd, + 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x1d, 0xff, 0xff, 0xfe, 0x84, 0x21, 0x35, + 0xbf, 0xff, 0xff, 0xf3, 0x0, 0xbf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xf8, + 0x5, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xfe, 0x50, 0xd, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, + 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x81, 0x0, 0x5, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfe, 0x50, + 0x0, 0xbf, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x2, 0xcf, 0xff, 0xf8, 0x0, 0x1d, 0xff, 0xff, + 0xfe, 0x84, 0x21, 0x35, 0xbf, 0xff, 0xff, 0xf2, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xbd, 0xff, 0xfd, 0xa6, 0x10, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xeb, 0x71, + 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x7, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x3f, + 0xff, 0xf6, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x33, 0xff, 0xff, 0x60, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xf6, 0x0, 0x2f, 0xff, + 0xff, 0xfe, 0x84, 0x21, 0x36, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xd, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xf6, + 0x7, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0x60, 0xef, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xf6, 0x4f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0x69, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0xcf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x6e, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf6, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x6f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf6, 0xef, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x6c, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x9f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0x64, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xf6, 0xe, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x60, + 0x7f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xf6, 0x0, 0xdf, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0x60, 0x2, 0xff, 0xff, 0xff, 0xe8, + 0x42, 0x13, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0x60, 0x0, 0x3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xfe, + 0xb7, 0x20, 0x0, 0xf, 0xff, 0xf6, + + /* U+0065 "e" */ + 0x0, 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xeb, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xf8, 0x30, 0x0, 0x15, 0xcf, 0xff, 0xff, 0x90, + 0x0, 0x0, 0xcf, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x0, 0x5, 0xef, 0xff, 0xf4, 0x0, 0x6, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xfd, 0x0, 0xd, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, + 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x9f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf0, 0xcf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xef, 0xff, + 0xc5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x51, 0xcf, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9c, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0x90, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0x95, 0x31, + 0x23, 0x6b, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd2, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0xbd, 0xff, 0xfe, 0xc8, 0x40, 0x0, + 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9d, 0xef, 0xec, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xde, 0xff, 0xd0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xd4, 0x0, 0x2, 0x86, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x3, 0xdd, 0xdd, 0xff, 0xff, + 0xfd, 0xdd, 0xdd, 0xdc, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x0, 0x0, 0x59, 0xce, 0xff, 0xec, + 0x83, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, + 0xa, 0xff, 0xfb, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, + 0xb0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaa, 0xff, 0xfb, 0x0, 0x6f, + 0xff, 0xff, 0xfd, 0x84, 0x21, 0x24, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x2f, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xfb, 0xb, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xb2, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xfb, 0x7f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xbb, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, 0xef, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xbf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfb, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xbe, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfb, 0xbf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xb8, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, + 0x2f, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb0, 0xbf, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xfb, 0x2, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xb0, 0x6, 0xff, 0xff, 0xff, 0xc7, 0x31, 0x1, + 0x37, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xef, 0xff, 0xb0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xe, 0xff, + 0xfb, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0xef, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x16, 0xbe, 0xff, 0xff, 0xd9, 0x40, + 0x0, 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xe0, 0x0, 0x1f, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf8, 0x0, + 0xa, 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0x10, 0x3, 0xff, 0xff, + 0xff, 0xd9, 0x53, 0x21, 0x23, 0x7b, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x3, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x6a, + 0xcd, 0xef, 0xfd, 0xc9, 0x61, 0x0, 0x0, 0x0, + 0x0, + + /* U+0068 "h" */ + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x4, 0x8c, 0xef, 0xfe, 0xb7, 0x20, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x0, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x0, 0xa, 0xff, 0xff, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xfd, 0x85, 0x33, 0x58, 0xef, + 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x60, + 0xaf, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xfd, 0xa, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xf1, 0xaf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x4a, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf6, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x7a, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf8, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x8a, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf8, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x8a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf8, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf8, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, + + /* U+0069 "i" */ + 0x0, 0x37, 0x50, 0x0, 0x8f, 0xff, 0xd1, 0x3f, + 0xff, 0xff, 0x96, 0xff, 0xff, 0xfb, 0x4f, 0xff, + 0xff, 0x90, 0xaf, 0xff, 0xe1, 0x0, 0x58, 0x61, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, + 0xf0, 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, + 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, + 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, 0xff, + 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, 0xff, 0xff, + 0x0, 0xaf, 0xff, 0xf0, 0xa, 0xff, 0xff, 0x0, + 0xaf, 0xff, 0xf0, 0xa, 0xff, 0xff, 0x0, 0xaf, + 0xff, 0xf0, 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, + 0xf0, 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, + 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, + 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, 0xff, + 0xff, 0x0, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0x61, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0x72, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x0, + 0x3, 0xd5, 0x10, 0x4, 0xdf, 0xff, 0xf7, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x1, 0x6b, 0xef, 0xfe, 0xb6, 0x0, 0x0, 0x0, + + /* U+006B "k" */ + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfd, 0x10, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xd1, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xfd, 0x10, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x4, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x5f, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x6, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x5f, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x90, 0x8, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x10, 0x0, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xc0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xf8, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x50, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xf2, + + /* U+006C "l" */ + 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, + 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, + 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, + 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, + 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, + 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, + 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, + 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, + 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, + 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, + 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, + 0xff, 0xff, + + /* U+006D "m" */ + 0xaf, 0xff, 0xc0, 0x0, 0x5, 0xad, 0xff, 0xfd, + 0xa5, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8b, 0xef, + 0xfe, 0xc8, 0x40, 0x0, 0x0, 0xa, 0xff, 0xfc, + 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc3, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0xa, 0xff, 0xfc, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xfc, 0x74, 0x34, 0x6b, 0xff, 0xff, + 0xff, 0x9f, 0xff, 0xff, 0xb6, 0x43, 0x47, 0xcf, + 0xff, 0xff, 0xf1, 0xa, 0xff, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0x80, 0xaf, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0xa, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf2, 0xaf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x6a, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, 0xaf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf9, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x9a, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf9, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x9a, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x9a, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf9, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x9a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x9a, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf9, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x9a, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf9, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x9a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, + + /* U+006E "n" */ + 0xaf, 0xff, 0xc0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xb7, 0x20, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0xaf, 0xff, 0xc0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0xa, 0xff, 0xfc, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfd, 0x85, + 0x33, 0x58, 0xef, 0xff, 0xff, 0xe0, 0xa, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfd, 0xa, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf1, 0xaf, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x4a, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf6, 0xaf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x7a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf8, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf8, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x8a, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf8, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x8a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf8, + + /* U+006F "o" */ + 0x0, 0x0, 0x0, 0x0, 0x38, 0xbe, 0xff, 0xed, + 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xfe, 0x84, 0x21, 0x25, 0xaf, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xf3, + 0x0, 0x6, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xd0, 0x0, 0xdf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x50, 0x4f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xfb, 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf0, 0xcf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x3e, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf6, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x7f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf6, 0xef, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x6c, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf3, + 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0x3, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xb0, 0xd, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf5, + 0x0, 0x5f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xfd, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0x30, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xe8, 0x42, 0x12, 0x5a, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, + 0xfe, 0xda, 0x61, 0x0, 0x0, 0x0, 0x0, + + /* U+0070 "p" */ + 0xaf, 0xff, 0xc0, 0x0, 0x3, 0x8c, 0xef, 0xfe, + 0xb8, 0x30, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, + 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0xa, 0xff, 0xfc, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x95, 0x21, 0x25, 0x9f, 0xff, + 0xff, 0xfd, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfb, + 0x10, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf9, + 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf3, 0xa, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xa0, 0xaf, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xa, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xaf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfa, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xba, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfb, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xaa, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, + 0xaf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x4a, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xf0, 0xaf, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfa, + 0xa, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0x30, 0xaf, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0x90, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x52, 0x12, 0x59, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0xaf, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xa, 0xff, + 0xff, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x2, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x38, 0xce, + 0xff, 0xeb, 0x83, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xeb, + 0x72, 0x0, 0x0, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, + 0x60, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xf6, 0x0, 0x2f, + 0xff, 0xff, 0xfe, 0x84, 0x21, 0x36, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xd, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xf6, 0x7, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x60, 0xef, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xf6, 0x4f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0x69, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0xcf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x6e, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf6, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x6f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf6, 0xef, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x6c, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, + 0x9f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0x64, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf6, 0xe, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x60, 0x7f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf6, 0x0, 0xdf, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0xff, 0x60, 0x2, 0xff, 0xff, 0xff, + 0xe8, 0x42, 0x13, 0x6b, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0x60, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, + 0xfe, 0xb7, 0x10, 0x0, 0x3f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x60, + + /* U+0072 "r" */ + 0xaf, 0xff, 0xc0, 0x0, 0x4, 0x9c, 0xef, 0xa, + 0xff, 0xfc, 0x0, 0x5e, 0xff, 0xff, 0xf0, 0xaf, + 0xff, 0xc0, 0x9f, 0xff, 0xff, 0xff, 0xa, 0xff, + 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0xaf, 0xff, + 0xef, 0xff, 0xff, 0xd9, 0x88, 0xa, 0xff, 0xff, + 0xff, 0xfa, 0x20, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, 0xfe, 0xc9, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x4, 0xff, 0xff, 0xfb, + 0x52, 0x0, 0x1, 0x48, 0xdf, 0xfa, 0x0, 0xa, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xc2, 0x0, 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xfd, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0xa7, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc6, 0x0, 0x0, 0x0, + 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x26, 0x9c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x58, 0xdf, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfa, 0x1, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf8, 0x8, 0xfd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x1f, + 0xff, 0xff, 0xa7, 0x32, 0x10, 0x13, 0x7d, 0xff, + 0xff, 0xe0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x15, 0x8c, 0xde, + 0xff, 0xec, 0x96, 0x10, 0x0, 0x0, + + /* U+0074 "t" */ + 0x0, 0x0, 0x7, 0x88, 0x85, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3, 0xdd, 0xdd, + 0xff, 0xff, 0xfd, 0xdd, 0xdd, 0xdc, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x71, 0x0, + 0x3a, 0x80, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x6a, 0xef, 0xfe, 0xb6, 0x0, + + /* U+0075 "u" */ + 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x1e, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf1, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x1e, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf1, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x1e, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf1, 0xef, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x1e, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf1, 0xef, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x1e, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf1, 0xef, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x1e, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, 0xef, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x1e, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, 0xdf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x1d, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x1a, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xf1, 0x6f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0x12, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xf1, 0xb, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0x10, 0x4f, + 0xff, 0xff, 0xfc, 0x74, 0x34, 0x6a, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0x10, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x4c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x4, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x4, 0x8c, 0xef, 0xfe, 0xb7, + 0x20, 0x0, 0x4f, 0xff, 0xf1, + + /* U+0076 "v" */ + 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfa, 0x7, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf3, 0x1, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xc0, 0x0, 0x9f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x60, + 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0x0, 0x0, 0xd, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x30, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x90, 0x0, + 0xbf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf1, 0x2, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x8, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xfd, 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xbf, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xa2, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf4, 0xc, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, + 0x0, 0x7f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0x1, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf3, 0x0, 0xb, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, + 0x0, 0x0, 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfc, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x70, 0x0, 0x0, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x2e, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf1, 0x0, 0x0, 0xa, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xc0, 0x9f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf6, 0x3, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x60, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0x0, + 0x7f, 0xff, 0xc0, 0x0, 0x0, 0x7, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf1, 0x0, + 0x0, 0xe, 0xff, 0xf3, 0x0, 0x1, 0xff, 0xff, + 0x20, 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x4, 0xff, + 0xfd, 0x0, 0x0, 0xb, 0xff, 0xf8, 0x0, 0x0, + 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfd, 0x0, 0x0, 0xaf, 0xff, 0x70, 0x0, + 0x0, 0x5f, 0xff, 0xd0, 0x0, 0x8, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf3, + 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x30, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x80, 0x6, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, + 0x4f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xfe, 0x0, 0xcf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xe0, 0xa, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf4, 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x50, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x98, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, + 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xef, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfc, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0x7, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xd0, 0x0, 0xbf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x30, 0x0, 0x1e, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf6, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x60, 0x0, + 0x0, 0xcf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xf2, 0x0, 0x9, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xfd, 0x0, 0x5f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xa1, 0xef, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfe, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xd7, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x30, 0xaf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf6, + 0x0, 0x1e, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xa0, 0x0, 0x3, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x60, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xf3, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, 0x0, + 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xa0, 0x1e, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf7, + + /* U+0079 "y" */ + 0x0, 0xdf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x6, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0xf, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x50, 0x0, 0x1, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xe0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x20, 0x0, 0x0, 0x1f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf1, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x70, 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, 0x0, + 0xc, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, 0x3, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xc0, 0xaf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x50, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xb4, 0x10, 0x27, + 0xef, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, + 0xef, 0xec, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdf, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xfd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0x31, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x31, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, + + /* U+007B "{" */ + 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xff, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xdc, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xf0, 0x0, 0x0, 0x3e, 0xef, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xe7, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xdc, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x1, + 0x7b, 0xef, 0xff, + + /* U+007C "|" */ + 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, + 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, + 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, + 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, + 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, + 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, + 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, + 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, + 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, + 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, + 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, + 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, + 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, + 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, + 0x50, + + /* U+007D "}" */ + 0x1f, 0xff, 0xeb, 0x60, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x1, 0xde, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, + 0x9f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xee, 0x0, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xfe, 0x0, 0x0, 0x1, 0xde, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xeb, 0x60, 0x0, 0x0, + 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x0, 0x15, 0x88, 0x61, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x44, 0x40, 0x0, 0x5, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x2, 0xff, 0xf0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x9, 0xff, 0xd0, + 0x8, 0xff, 0xf9, 0x10, 0x4d, 0xff, 0xff, 0x60, + 0x0, 0x3f, 0xff, 0x90, 0xc, 0xff, 0xb0, 0x0, + 0x0, 0xbf, 0xff, 0xfd, 0xab, 0xff, 0xff, 0x30, + 0xf, 0xff, 0x30, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x2f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x2a, 0xa9, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8d, + 0xfe, 0xc6, 0x0, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x2, 0x68, 0x86, 0x20, 0x0, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x3, 0xff, 0xfa, 0x30, 0x3, 0x9f, 0xff, 0x40, + 0xd, 0xff, 0x50, 0x0, 0x0, 0x5, 0xff, 0xe1, + 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf7, + 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, + 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, + 0xdf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0x7f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf9, + 0x2f, 0xfe, 0x10, 0x0, 0x0, 0x1, 0xef, 0xf3, + 0x8, 0xff, 0xd4, 0x0, 0x0, 0x3d, 0xff, 0x90, + 0x0, 0xbf, 0xff, 0xda, 0xad, 0xff, 0xfc, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x39, 0xdf, 0xfd, 0x93, 0x0, 0x0, + + /* U+2022 "•" */ + 0x0, 0x5b, 0xdc, 0x60, 0x0, 0x9f, 0xff, 0xff, + 0x90, 0x5f, 0xff, 0xff, 0xff, 0x5b, 0xff, 0xff, + 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, 0xdb, 0xff, + 0xff, 0xff, 0xfb, 0x6f, 0xff, 0xff, 0xff, 0x60, + 0xbf, 0xff, 0xff, 0xb0, 0x0, 0x7d, 0xfd, 0x80, + 0x0, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xee, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x27, 0xcf, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x15, 0xae, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x72, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xa5, 0x10, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x61, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xe9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x38, 0xce, 0xff, 0xeb, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x38, 0xce, 0xff, 0xeb, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x38, 0xce, 0xff, 0xec, 0x83, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x38, 0xce, 0xff, 0xec, 0x83, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x3d, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xd3, + 0xdf, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xdf, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xfd, + 0x3d, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xd3, + + /* U+F00B "" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2b, 0xd6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "ï€" */ + 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, + 0x0, 0x2, 0xcf, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xc2, + 0x0, 0x2, 0xef, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xe2, 0x1, 0xef, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xe1, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x5f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x7f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x7f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x49, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xa9, 0x30, + 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x40, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x2, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xf9, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x50, + 0x5, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xa0, + 0x9, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xe0, + 0xc, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf2, + 0xf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf4, + 0x1f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xf6, + 0x2f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf7, + 0x3f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf8, + 0x3f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf8, + 0x2f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf8, + 0x1f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf6, + 0xf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xf4, + 0xb, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf2, + 0x8, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xe0, + 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc9, 0x76, 0x56, 0x8b, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x7a, 0xdf, 0xff, 0xff, 0xfe, 0xc9, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x21, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x12, 0x33, 0x21, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x50, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xfd, 0x40, 0x0, 0x4, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x5, 0xef, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xfb, 0x20, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x2, 0xbf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xea, 0x88, 0xae, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe6, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x6e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xea, 0x88, 0xae, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfb, 0x20, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x2, 0xbf, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xfe, 0x50, 0x0, 0x4, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x40, 0x0, 0x4, 0xdf, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xff, 0xfc, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x33, 0x21, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0xcf, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0xcf, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, + 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x22, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x8, 0xff, 0x80, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0xaf, 0xff, 0xfa, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x8f, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0x6f, 0xff, 0xff, 0xf8, 0x0, 0x1, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x8f, 0xff, 0xff, 0xf6, 0x9, 0xff, 0xff, + 0x50, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x5, 0xff, 0xff, 0x90, + 0x0, 0xcf, 0xe3, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x3e, 0xfc, 0x0, 0x0, 0x17, 0x10, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x1, 0x71, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x4e, 0xe4, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x40, 0x4, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xae, 0xff, 0xfe, 0xae, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x2, 0xff, 0xd0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xdf, 0x80, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x2, 0xff, 0xd0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xae, 0xff, 0xfe, 0xae, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfa, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x50, + 0x1e, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xe1, 0x8f, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd8, 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x11, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x7b, 0xef, 0xff, 0xff, 0xfc, 0x84, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x30, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x50, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, 0x0, 0x8, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x6, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xba, 0xab, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x45, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa5, 0x10, 0x0, 0x0, 0x1, 0x6c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xa9, 0x87, + 0x76, 0x54, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xaf, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x5, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0x90, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xb0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x40, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfe, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x45, 0x67, + 0x78, 0x9a, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb6, 0x10, 0x0, 0x0, 0x1, 0x5a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x54, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xba, 0xab, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x60, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x70, 0x1, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x4, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x5, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xcf, 0xff, 0xff, 0xfe, 0xb8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8e, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x1, 0x52, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x2f, 0xff, + 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x8f, 0xff, 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0x70, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, 0xff, + 0xfc, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x4f, 0xff, 0xb1, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x3, 0x85, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x75, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xd3, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x7, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0xdf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x3f, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x30, 0x0, 0xb, 0xff, + 0xff, 0x30, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xc0, + 0x0, 0x4, 0xff, 0xff, 0x80, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x2, 0x74, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf4, 0x0, 0x0, 0xdf, 0xff, 0xd0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x3f, 0xff, + 0x90, 0x0, 0x0, 0x4f, 0xff, 0xfc, 0x0, 0x0, + 0x8f, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x9f, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x10, 0x0, 0x3f, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x80, + 0x0, 0x5, 0xff, 0xff, 0x60, 0x0, 0xf, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0xff, 0xff, 0xa0, + 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf9, 0x0, 0x0, + 0xcf, 0xff, 0xc0, 0x0, 0xa, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfd, 0x0, 0x0, 0xaf, 0xff, 0xe0, 0x0, 0x9, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x0, 0x0, 0x8f, 0xff, + 0xf0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfd, 0x0, 0x0, 0xaf, 0xff, 0xe0, 0x0, + 0x9, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf9, 0x0, 0x0, 0xcf, + 0xff, 0xc0, 0x0, 0xa, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0xc, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0x80, 0x0, 0x5, 0xff, 0xff, 0x60, + 0x0, 0xf, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x9f, 0xff, 0xfc, 0x0, 0x0, 0xc, + 0xff, 0xff, 0x10, 0x0, 0x3f, 0xff, 0xf6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x3f, 0xff, 0x90, + 0x0, 0x0, 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x8f, + 0xff, 0xf2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x2, 0x74, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf4, + 0x0, 0x0, 0xdf, 0xff, 0xd0, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xc0, 0x0, 0x5, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x30, 0x0, 0xc, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x3f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0xdf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xc3, 0x0, 0x0, 0x2, 0xef, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x75, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F03E "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa5, 0x45, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x22, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa5, 0x45, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2e, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x2e, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x2c, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + + /* U+F043 "ïƒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x48, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0x70, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xf3, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xbf, 0xff, 0xff, 0x70, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb7, 0xff, 0xff, 0xfc, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x3f, 0xff, 0xff, 0xf4, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0xdf, 0xff, 0xff, 0xd1, 0x0, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x5, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xfc, 0x73, 0x10, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, 0xbe, 0xff, + 0xfe, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "ïˆ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x80, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf9, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf9, 0xcf, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "ï‹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d, 0xfd, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7d, 0xfd, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F04C "ïŒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x7d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, + + /* U+F04D "ï" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd8, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x8d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x0, + + /* U+F051 "ï‘" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xfc, 0x9f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0x9f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x8, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xbf, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x8, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe8, 0x0, + + /* U+F053 "ï“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x89, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x0, 0x0, + + /* U+F054 "ï”" */ + 0x0, 0x2, 0x98, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xcf, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x86, 0x10, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x1, 0x68, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0xcf, 0xff, 0xff, + 0xff, 0xfc, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x86, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F068 "ï¨" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x42, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x3, 0x9b, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb9, 0x30, + + /* U+F06E "ï®" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x47, 0xac, 0xef, 0xff, 0xfe, 0xca, + 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xba, 0x88, 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x4, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xda, 0x40, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x20, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0xdc, 0x98, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x4, 0x9d, 0xff, 0xda, 0x40, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x40, 0x0, 0x0, + 0x0, 0x4, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xba, 0x88, 0xab, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0x9c, 0xee, 0xff, 0xfe, + 0xca, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "ï°" */ + 0x0, 0xaf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x58, 0xad, 0xef, 0xff, 0xec, 0xa7, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x49, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x1, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xa8, 0x8a, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x10, + 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x2, + 0xdf, 0xfd, 0xa4, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0xcf, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xee, + 0x30, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xfb, 0xaf, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x98, 0x89, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x7a, 0xce, 0xff, 0xfe, 0xdc, 0x96, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfa, 0x0, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xfb, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xa8, 0x88, 0x88, 0x8a, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xaa, 0xaa, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x51, 0x15, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x73, 0x37, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x8, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3d, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x47, 0x88, 0x88, 0x88, 0x8e, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x88, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xfd, 0x10, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xe2, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, + 0x20, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf3, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x40, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x4, 0x50, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x3f, 0xf4, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x2, 0xef, 0xff, 0x30, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x2e, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x1, 0xdf, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x47, 0x88, 0x88, 0x88, 0x8e, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x88, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3d, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x46, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xd9, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x2f, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf8, 0xa, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0xbf, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x30, + 0x0, 0xb, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x45, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, + 0x10, 0x0, + + /* U+F078 "ï¸" */ + 0x0, 0x0, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x35, 0x10, 0x0, 0x0, 0xb, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xe3, 0x0, 0x0, 0xbf, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x30, 0xa, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xe2, 0x2f, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd9, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xf8, 0xf, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0x90, 0xf, 0xff, 0xff, 0xf0, 0x9, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x49, 0x60, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x6, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, + 0x60, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x6, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0x90, 0xf, 0xff, + 0xff, 0xf0, 0x9, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xf8, 0xf, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "ï»" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + + /* U+F093 "ï‚“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x51, 0x0, 0x0, 0x0, 0x0, 0x15, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xae, 0xff, 0xfe, 0xae, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x2, 0xff, 0xd0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xdf, 0x80, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x2, 0xff, 0xd0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xae, 0xff, 0xfe, 0xae, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xea, 0x63, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xb8, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x2, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xfe, 0xdd, 0xb9, 0x74, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x4, 0xad, 0xff, 0xda, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x77, + 0x51, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x40, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xaf, 0xff, 0xff, 0xf7, 0x11, 0x7f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xd, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x1, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xf, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x71, 0x17, 0xff, 0xff, 0xff, 0x90, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4a, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xad, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xf7, 0x11, 0x7f, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x1, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x70, 0x0, + 0x7, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x71, 0x17, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xb2, 0x0, 0x0, 0x2, 0xcf, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x57, 0x75, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x4a, 0xdf, 0xfd, 0xa4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x83, 0x0, 0x38, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x83, 0x0, 0x38, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x8d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x0, + + /* U+F0C9 "" */ + 0x39, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x93, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x2, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x39, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x93, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x2, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x93, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, + + /* U+F0E0 "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x10, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x2, + 0xfa, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xaf, + 0xff, 0xd3, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x10, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x2, 0x9e, 0xe9, 0x20, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe7, 0x30, 0x13, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, + 0xc7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc5, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xb1, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xfe, 0x20, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xe2, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xfe, 0x20, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xff, 0xe2, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xfe, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xee, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x9e, 0xff, 0xff, 0xff, 0xea, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xc6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd8, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x1, 0xdf, 0xf8, 0x0, + 0x0, 0x1e, 0xff, 0x80, 0x0, 0x1, 0xef, 0xf8, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0xbf, 0xf4, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, + 0x0, 0xbf, 0xf4, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xb, + 0xff, 0x40, 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xbf, 0xf4, + 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, 0xbf, + 0xf4, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xb, 0xff, 0x40, + 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x1, 0xdf, 0xf8, 0x0, 0x0, + 0x1e, 0xff, 0x80, 0x0, 0x1, 0xef, 0xf8, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd8, 0x0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8d, 0xfc, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7d, 0xfc, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "ï…›" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xfb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x68, + 0xbd, 0xef, 0xff, 0xff, 0xfe, 0xdb, 0x86, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x8c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x93, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xec, 0xa9, 0x98, 0x89, 0x9a, 0xce, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x7b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfa, + 0xb, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xbf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x14, 0x7a, 0xce, 0xef, 0xfe, 0xec, 0xa7, + 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xfb, 0x0, 0x0, 0xb, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xb0, 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xca, 0x98, 0x89, + 0xac, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd7, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xce, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xec, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xcf, 0xfc, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xcf, 0xfc, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x80, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xd3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x80, 0x0, 0x0, + + /* U+F241 "ï‰" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x80, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xd3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x80, 0x0, 0x0, + + /* U+F242 "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x80, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xd3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x80, 0x0, 0x0, + + /* U+F243 "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x80, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xd3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x80, 0x0, 0x0, + + /* U+F244 "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x80, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xd3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x80, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, + 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbd, + 0xdc, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfe, 0x99, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x18, 0xcc, 0xa3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x15, 0x66, 0x20, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xfe, 0x60, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x76, 0x79, 0xff, + 0xff, 0x97, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7f, + 0xff, 0xff, 0xff, 0xc3, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xa1, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xbd, 0xc9, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, + 0x0, 0x1, 0xde, 0xee, 0xee, 0xee, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf6, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xfa, 0x88, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xbc, + 0xcd, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, 0xbd, + 0xef, 0xff, 0xec, 0xa7, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x81, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xee, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x71, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xf8, 0xaf, + 0xff, 0xff, 0xe0, 0x0, 0xac, 0x10, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, + 0x80, 0xa, 0xff, 0xff, 0xe0, 0x0, 0xaf, 0xd1, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, 0xe0, 0x0, + 0x9f, 0xfd, 0x10, 0x1, 0xdf, 0xff, 0xff, 0xf6, + 0x7f, 0xff, 0xff, 0xff, 0x50, 0x0, 0xa, 0xff, + 0xe0, 0x0, 0x9f, 0xfe, 0x10, 0x0, 0xcf, 0xff, + 0xff, 0xf8, 0x9f, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x9f, 0xe0, 0x0, 0x9f, 0xe2, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xfa, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x9, 0xe0, 0x0, 0x9e, 0x20, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfb, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x70, 0x0, + 0x72, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x1, 0xb0, 0x0, 0x85, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xfd, 0xaf, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x1d, 0xe0, 0x0, 0x9f, 0x50, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xfb, 0x8f, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x1, 0xdf, 0xe0, 0x0, + 0x9f, 0xf4, 0x0, 0x2, 0xef, 0xff, 0xff, 0xfa, + 0x6f, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x1d, 0xff, + 0xe0, 0x0, 0x9f, 0xff, 0x20, 0x0, 0x4f, 0xff, + 0xff, 0xf8, 0x3f, 0xff, 0xff, 0xfd, 0x10, 0x2, + 0xef, 0xff, 0xe0, 0x0, 0x9f, 0xf8, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xf5, 0xf, 0xff, 0xff, 0xff, + 0xd1, 0x2e, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0x80, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xf3, 0xc, 0xff, + 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff, 0xf0, 0x0, + 0xa8, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x30, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x58, 0xbd, 0xef, 0xff, + 0xed, 0xb9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "ï‹­" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd2, + 0x2d, 0xff, 0xff, 0xfd, 0x22, 0xdf, 0xff, 0xff, + 0xd2, 0x2d, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, + 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, + 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, + 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, + 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, + 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, + 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, + 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, + 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, + 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, + 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, + 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, + 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, + 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, + 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, + 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, + 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, + 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, + 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, + 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, + 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, + 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xd2, 0x2d, 0xff, 0xff, 0xfd, 0x22, + 0xdf, 0xff, 0xff, 0xd2, 0x2d, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x8, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x80, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xff, 0xa2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8e, 0x20, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xfe, 0x20, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x20, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0xcf, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0xcf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0xcf, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xfe, 0xca, 0x86, 0x53, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x4f, 0xf4, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x4, + 0x40, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x4, 0x40, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4b, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x70, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x80, 0x0, 0xf, 0xff, 0x0, 0x0, 0xbf, + 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x80, 0x0, 0xf, 0xff, 0x0, + 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, 0x0, 0xf, + 0xff, 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xf, 0xff, 0x0, 0x0, 0xbf, 0xf4, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0xf, 0xff, 0x0, 0x0, 0xbf, + 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xf, 0xff, 0x0, + 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xf, + 0xff, 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xf, 0xff, 0x0, 0x0, 0xbf, 0xf4, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0xf, 0xff, 0x0, 0x0, 0xbf, + 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x6, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x10, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcd, 0xff, 0xff, 0xff, 0xf1, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcb, 0x91, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 207, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 206, .box_w = 7, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 119, .adv_w = 300, .box_w = 13, .box_h = 14, .ofs_x = 3, .ofs_y = 20}, + {.bitmap_index = 210, .adv_w = 540, .box_w = 32, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 754, .adv_w = 477, .box_w = 27, .box_h = 46, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 1375, .adv_w = 647, .box_w = 38, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2021, .adv_w = 527, .box_w = 31, .box_h = 35, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 2564, .adv_w = 161, .box_w = 5, .box_h = 14, .ofs_x = 3, .ofs_y = 20}, + {.bitmap_index = 2599, .adv_w = 259, .box_w = 11, .box_h = 45, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 2847, .adv_w = 260, .box_w = 11, .box_h = 45, .ofs_x = 1, .ofs_y = -9}, + {.bitmap_index = 3095, .adv_w = 307, .box_w = 19, .box_h = 19, .ofs_x = 0, .ofs_y = 17}, + {.bitmap_index = 3276, .adv_w = 447, .box_w = 22, .box_h = 22, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 3518, .adv_w = 174, .box_w = 7, .box_h = 14, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 3567, .adv_w = 294, .box_w = 14, .box_h = 5, .ofs_x = 2, .ofs_y = 11}, + {.bitmap_index = 3602, .adv_w = 174, .box_w = 7, .box_h = 7, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3627, .adv_w = 270, .box_w = 21, .box_h = 46, .ofs_x = -2, .ofs_y = -5}, + {.bitmap_index = 4110, .adv_w = 512, .box_w = 28, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4586, .adv_w = 284, .box_w = 13, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4807, .adv_w = 441, .box_w = 26, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5249, .adv_w = 439, .box_w = 26, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5691, .adv_w = 514, .box_w = 31, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6218, .adv_w = 441, .box_w = 26, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6660, .adv_w = 474, .box_w = 27, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7119, .adv_w = 459, .box_w = 26, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7561, .adv_w = 495, .box_w = 27, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8020, .adv_w = 474, .box_w = 27, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8479, .adv_w = 174, .box_w = 7, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8570, .adv_w = 174, .box_w = 7, .box_h = 33, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 8686, .adv_w = 447, .box_w = 22, .box_h = 22, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 8928, .adv_w = 447, .box_w = 22, .box_h = 15, .ofs_x = 3, .ofs_y = 9}, + {.bitmap_index = 9093, .adv_w = 447, .box_w = 22, .box_h = 22, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 9335, .adv_w = 440, .box_w = 25, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9760, .adv_w = 794, .box_w = 46, .box_h = 43, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 10749, .adv_w = 562, .box_w = 37, .box_h = 34, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 11378, .adv_w = 581, .box_w = 29, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 11871, .adv_w = 555, .box_w = 31, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12398, .adv_w = 634, .box_w = 33, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 12959, .adv_w = 515, .box_w = 25, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 13384, .adv_w = 488, .box_w = 24, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 13792, .adv_w = 593, .box_w = 32, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14336, .adv_w = 624, .box_w = 29, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 14829, .adv_w = 238, .box_w = 5, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 14914, .adv_w = 394, .box_w = 21, .box_h = 34, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 15271, .adv_w = 552, .box_w = 30, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 15781, .adv_w = 456, .box_w = 24, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 16189, .adv_w = 733, .box_w = 36, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 16801, .adv_w = 624, .box_w = 29, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 17294, .adv_w = 645, .box_w = 37, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 17923, .adv_w = 554, .box_w = 28, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 18399, .adv_w = 645, .box_w = 38, .box_h = 41, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 19178, .adv_w = 558, .box_w = 28, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 19654, .adv_w = 477, .box_w = 27, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 20113, .adv_w = 451, .box_w = 28, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20589, .adv_w = 607, .box_w = 30, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 21099, .adv_w = 547, .box_w = 36, .box_h = 34, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 21711, .adv_w = 865, .box_w = 52, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22595, .adv_w = 517, .box_w = 32, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23139, .adv_w = 497, .box_w = 33, .box_h = 34, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 23700, .adv_w = 505, .box_w = 29, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 24193, .adv_w = 256, .box_w = 11, .box_h = 45, .ofs_x = 5, .ofs_y = -9}, + {.bitmap_index = 24441, .adv_w = 270, .box_w = 21, .box_h = 46, .ofs_x = -2, .ofs_y = -5}, + {.bitmap_index = 24924, .adv_w = 256, .box_w = 11, .box_h = 45, .ofs_x = 0, .ofs_y = -9}, + {.bitmap_index = 25172, .adv_w = 448, .box_w = 22, .box_h = 20, .ofs_x = 3, .ofs_y = 7}, + {.bitmap_index = 25392, .adv_w = 384, .box_w = 24, .box_h = 4, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 25440, .adv_w = 461, .box_w = 13, .box_h = 7, .ofs_x = 5, .ofs_y = 29}, + {.bitmap_index = 25486, .adv_w = 459, .box_w = 23, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 25785, .adv_w = 524, .box_w = 27, .box_h = 36, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 26271, .adv_w = 439, .box_w = 24, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 26583, .adv_w = 524, .box_w = 27, .box_h = 36, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 27069, .adv_w = 470, .box_w = 26, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 27407, .adv_w = 271, .box_w = 19, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 27749, .adv_w = 530, .box_w = 27, .box_h = 35, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 28222, .adv_w = 523, .box_w = 25, .box_h = 36, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 28672, .adv_w = 214, .box_w = 7, .box_h = 37, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 28802, .adv_w = 218, .box_w = 16, .box_h = 46, .ofs_x = -5, .ofs_y = -9}, + {.bitmap_index = 29170, .adv_w = 473, .box_w = 26, .box_h = 36, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 29638, .adv_w = 214, .box_w = 5, .box_h = 36, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 29728, .adv_w = 812, .box_w = 43, .box_h = 26, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 30287, .adv_w = 523, .box_w = 25, .box_h = 26, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 30612, .adv_w = 488, .box_w = 27, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 30963, .adv_w = 524, .box_w = 27, .box_h = 35, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 31436, .adv_w = 524, .box_w = 27, .box_h = 35, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 31909, .adv_w = 315, .box_w = 15, .box_h = 26, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 32104, .adv_w = 385, .box_w = 22, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 32390, .adv_w = 318, .box_w = 19, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 32694, .adv_w = 520, .box_w = 25, .box_h = 26, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 33019, .adv_w = 429, .box_w = 28, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33383, .adv_w = 690, .box_w = 43, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 33942, .adv_w = 424, .box_w = 26, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 34280, .adv_w = 429, .box_w = 29, .box_h = 35, .ofs_x = -2, .ofs_y = -9}, + {.bitmap_index = 34788, .adv_w = 400, .box_w = 23, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 35087, .adv_w = 270, .box_w = 14, .box_h = 45, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 35402, .adv_w = 230, .box_w = 5, .box_h = 45, .ofs_x = 5, .ofs_y = -9}, + {.bitmap_index = 35515, .adv_w = 270, .box_w = 15, .box_h = 45, .ofs_x = 0, .ofs_y = -9}, + {.bitmap_index = 35853, .adv_w = 447, .box_w = 24, .box_h = 9, .ofs_x = 2, .ofs_y = 13}, + {.bitmap_index = 35961, .adv_w = 322, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 19}, + {.bitmap_index = 36089, .adv_w = 241, .box_w = 9, .box_h = 9, .ofs_x = 3, .ofs_y = 9}, + {.bitmap_index = 36130, .adv_w = 768, .box_w = 48, .box_h = 49, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 37306, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 38170, .adv_w = 768, .box_w = 48, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 39178, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 40042, .adv_w = 528, .box_w = 33, .box_h = 34, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 40603, .adv_w = 768, .box_w = 48, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 41755, .adv_w = 768, .box_w = 46, .box_h = 48, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 42859, .adv_w = 864, .box_w = 54, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 43993, .adv_w = 768, .box_w = 48, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 45145, .adv_w = 864, .box_w = 54, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 46117, .adv_w = 768, .box_w = 48, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 47269, .adv_w = 384, .box_w = 24, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 47725, .adv_w = 576, .box_w = 36, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 48409, .adv_w = 864, .box_w = 54, .box_h = 46, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 49651, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 50515, .adv_w = 528, .box_w = 33, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 51307, .adv_w = 672, .box_w = 30, .box_h = 44, .ofs_x = 6, .ofs_y = -4}, + {.bitmap_index = 51967, .adv_w = 672, .box_w = 42, .box_h = 50, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 53017, .adv_w = 672, .box_w = 42, .box_h = 43, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 53920, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 54802, .adv_w = 672, .box_w = 30, .box_h = 44, .ofs_x = 6, .ofs_y = -4}, + {.bitmap_index = 55462, .adv_w = 672, .box_w = 44, .box_h = 42, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 56386, .adv_w = 480, .box_w = 26, .box_h = 42, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 56932, .adv_w = 480, .box_w = 26, .box_h = 42, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 57478, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 58360, .adv_w = 672, .box_w = 42, .box_h = 10, .ofs_x = 0, .ofs_y = 13}, + {.bitmap_index = 58570, .adv_w = 864, .box_w = 54, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 59542, .adv_w = 960, .box_w = 60, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 60982, .adv_w = 864, .box_w = 56, .box_h = 48, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 62326, .adv_w = 768, .box_w = 48, .box_h = 44, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 63382, .adv_w = 672, .box_w = 42, .box_h = 26, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 63928, .adv_w = 672, .box_w = 42, .box_h = 26, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 64474, .adv_w = 960, .box_w = 60, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 65614, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 66478, .adv_w = 768, .box_w = 48, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 67630, .adv_w = 768, .box_w = 49, .box_h = 49, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 68831, .adv_w = 672, .box_w = 43, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 69734, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 70742, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 71624, .adv_w = 672, .box_w = 42, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 72422, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 73286, .adv_w = 480, .box_w = 32, .box_h = 48, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 74054, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 75062, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 76070, .adv_w = 864, .box_w = 54, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 77042, .adv_w = 768, .box_w = 50, .box_h = 50, .ofs_x = -1, .ofs_y = -7}, + {.bitmap_index = 78292, .adv_w = 576, .box_w = 36, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 79156, .adv_w = 960, .box_w = 60, .box_h = 44, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 80476, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 81376, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 82276, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 83176, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 84076, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 84976, .adv_w = 960, .box_w = 61, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 86135, .adv_w = 672, .box_w = 36, .box_h = 48, .ofs_x = 3, .ofs_y = -6}, + {.bitmap_index = 86999, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 88007, .adv_w = 768, .box_w = 49, .box_h = 49, .ofs_x = -1, .ofs_y = -7}, + {.bitmap_index = 89208, .adv_w = 960, .box_w = 60, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 90288, .adv_w = 576, .box_w = 36, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 91152, .adv_w = 773, .box_w = 49, .box_h = 31, .ofs_x = 0, .ofs_y = 3} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 8, 0, 0, 0, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 35, 0, 21, -17, 0, 0, + 0, 0, -42, -46, 5, 36, 17, 13, + -31, 5, 38, 2, 32, 8, 25, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 46, 6, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 0, -23, 0, 0, 0, 0, + 0, -15, 13, 15, 0, 0, -8, 0, + -5, 8, 0, -8, 0, -8, -4, -15, + 0, 0, 0, 0, -8, 0, 0, -10, + -12, 0, 0, -8, 0, -15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -8, + -8, 0, -12, 0, -21, 0, -93, 0, + 0, -15, 0, 15, 23, 1, 0, -15, + 8, 8, 25, 15, -13, 15, 0, 0, + -44, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -28, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -21, -9, -38, 0, -31, + -5, 0, 0, 0, 0, 2, 30, 0, + -23, -6, -2, 2, 0, -13, 0, 0, + -5, -57, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -61, -6, 29, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 25, + 0, 8, 0, 0, -15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 29, 6, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -28, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, + 15, 8, 23, -8, 0, 0, 15, -8, + -25, -105, 5, 21, 15, 2, -10, 0, + 28, 0, 25, 0, 25, 0, -71, 0, + -9, 23, 0, 25, -8, 15, 8, 0, + 0, 2, -8, 0, 0, -13, 61, 0, + 61, 0, 23, 0, 32, 10, 13, 23, + 0, 0, 0, -28, 0, 0, 0, 0, + 2, -5, 0, 5, -14, -10, -15, 5, + 0, -8, 0, 0, 0, -31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -50, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -42, 0, -48, 0, 0, 0, + 0, -5, 0, 76, -9, -10, 8, 8, + -7, 0, -10, 8, 0, 0, -41, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -74, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -48, 0, 46, 0, 0, -28, 0, + 25, 0, -52, -74, -52, -15, 23, 0, + 0, -51, 0, 9, -18, 0, -12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 20, 23, -94, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 36, 0, 5, 0, 0, 0, + 0, 0, 5, 5, -9, -15, 0, -2, + -2, -8, 0, 0, -5, 0, 0, 0, + -15, 0, -6, 0, -18, -15, 0, -19, + -25, -25, -15, 0, -15, 0, -15, 0, + 0, 0, 0, -6, 0, 0, 8, 0, + 5, -8, 0, 2, 0, 0, 0, 8, + -5, 0, 0, 0, -5, 8, 8, -2, + 0, 0, 0, -15, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 10, -5, 0, + -9, 0, -13, 0, 0, -5, 0, 23, + 0, 0, -8, 0, 0, 0, 0, 0, + -2, 2, -5, -5, 0, 0, -8, 0, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -4, 0, -8, -9, 0, + 0, 0, 0, 0, 2, 0, 0, -5, + 0, -8, -8, -8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, 0, 0, + 0, 0, -5, -10, 0, -12, 0, -23, + -5, -23, 15, 0, 0, -15, 8, 15, + 21, 0, -19, -2, -9, 0, -2, -36, + 8, -5, 5, -41, 8, 0, 0, 2, + -40, 0, -41, -6, -67, -5, 0, -38, + 0, 15, 22, 0, 10, 0, 0, 0, + 0, 2, 0, -14, -10, 0, -23, 0, + 0, 0, -8, 0, 0, 0, -8, 0, + 0, 0, 0, 0, -4, -4, 0, -4, + -10, 0, 0, 0, 0, 0, 0, 0, + -8, -8, 0, -5, -9, -6, 0, 0, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, -6, 0, -9, + 0, -5, 0, -15, 8, 0, 0, -9, + 4, 8, 8, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 5, + 0, 0, -8, 0, -8, -5, -9, 0, + 0, 0, 0, 0, 0, 0, 6, 0, + -6, 0, 0, 0, 0, -8, -12, 0, + -15, 0, 23, -5, 2, -25, 0, 0, + 21, -38, -40, -32, -15, 8, 0, -6, + -50, -14, 0, -14, 0, -15, 12, -14, + -49, 0, -21, 0, 0, 4, -2, 6, + -5, 0, 8, 1, -23, -29, 0, -38, + -18, -16, -18, -23, -9, -21, -2, -15, + -21, 5, 0, 2, 0, -8, 0, 0, + 0, 5, 0, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -8, + 0, -4, 0, -2, -8, 0, -13, -17, + -17, -2, 0, -23, 0, 0, 0, 0, + 0, 0, -6, 0, 0, 0, 0, 3, + -5, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 37, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -14, 0, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + -15, 0, 0, 0, 0, -38, -23, 0, + 0, 0, -12, -38, 0, 0, -8, 8, + 0, -21, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, -15, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 0, -14, 0, + 0, 0, 0, 9, 0, 5, -15, -15, + 0, -8, -8, -9, 0, 0, 0, 0, + 0, 0, -23, 0, -8, 0, -12, -8, + 0, -17, -19, -23, -6, 0, -15, 0, + -23, 0, 0, 0, 0, 61, 0, 0, + 4, 0, 0, -10, 0, 8, 0, -33, + 0, 0, 0, 0, 0, -71, -14, 25, + 23, -6, -32, 0, 8, -12, 0, -38, + -4, -10, 8, -54, -8, 10, 0, 12, + -27, -12, -28, -25, -32, 0, 0, -46, + 0, 44, 0, 0, -4, 0, 0, 0, + -4, -4, -8, -21, -25, -2, -71, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, -4, -8, -12, 0, 0, + -15, 0, -8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -15, 0, 0, 15, + -2, 10, 0, -17, 8, -5, -2, -20, + -8, 0, -10, -8, -5, 0, -12, -13, + 0, 0, -6, -2, -5, -13, -9, 0, + 0, -8, 0, 8, -5, 0, -17, 0, + 0, 0, -15, 0, -13, 0, -13, -13, + 8, 0, 0, 0, 0, 0, 0, 0, + 0, -15, 8, 0, -11, 0, -5, -9, + -24, -5, -5, -5, -2, -5, -9, -2, + 0, 0, 0, 0, 0, -8, -6, -6, + 0, 0, 0, 0, 9, -5, 0, -5, + 0, 0, 0, -5, -9, -5, -7, -9, + -7, 0, 6, 31, -2, 0, -21, 0, + -5, 15, 0, -8, -32, -10, 12, 1, + 0, -36, -13, 8, -13, 5, 0, -5, + -6, -25, 0, -12, 4, 0, 0, -13, + 0, 0, 0, 8, 8, -15, -15, 0, + -13, -8, -12, -8, -8, 0, -13, 4, + -15, -13, 23, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -6, -8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, -10, + 0, 0, -8, -8, 0, 0, 0, 0, + -8, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, -5, 0, 0, 0, 0, + -12, 0, -15, 0, 0, 0, -25, 0, + 5, -17, 15, 2, -5, -36, 0, 0, + -17, -8, 0, -31, -19, -22, 0, 0, + -33, -8, -31, -29, -37, 0, -20, 0, + 6, 51, -10, 0, -18, -8, -2, -8, + -13, -21, -14, -28, -31, -18, -8, 0, + 0, -5, 0, 2, 0, 0, -54, -7, + 23, 17, -17, -28, 0, 2, -24, 0, + -38, -5, -8, 15, -71, -10, 2, 0, + 0, -50, -9, -40, -8, -56, 0, 0, + -54, 0, 45, 2, 0, -5, 0, 0, + 0, 0, -4, -5, -29, -5, 0, -50, + 0, 0, 0, 0, -25, 0, -7, 0, + -2, -22, -36, 0, 0, -4, -12, -23, + -8, 0, -5, 0, 0, 0, 0, -35, + -8, -25, -25, -6, -13, -19, -8, -13, + 0, -15, -7, -25, -12, 0, -9, -15, + -8, -15, 0, 4, 0, -5, -25, 0, + 15, 0, -14, 0, 0, 0, 0, 9, + 0, 5, -15, 31, 0, -8, -8, -9, + 0, 0, 0, 0, 0, 0, -23, 0, + -8, 0, -12, -8, 0, -17, -19, -23, + -6, 0, -15, 6, 31, 0, 0, 0, + 0, 61, 0, 0, 4, 0, 0, -10, + 0, 8, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, 0, 0, 0, 0, + -5, -15, 0, 0, 0, 0, 0, -4, + 0, 0, 0, -8, -8, 0, 0, -15, + -8, 0, 0, -15, 0, 13, -4, 0, + 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 12, 15, 6, -7, 0, -25, + -12, 0, 23, -25, -25, -15, -15, 31, + 14, 8, -67, -5, 15, -8, 0, -8, + 8, -8, -27, 0, -8, 8, -10, -6, + -23, -6, 0, 0, 23, 15, 0, -22, + 0, -42, -10, 22, -10, -29, 2, -10, + -25, -25, -8, 31, 8, 0, -12, 0, + -21, 0, 6, 25, -18, -28, -31, -19, + 23, 0, 2, -56, -6, 8, -13, -5, + -18, 0, -17, -28, -12, -12, -6, 0, + 0, -18, -16, -8, 0, 23, 18, -8, + -42, 0, -42, -11, 0, -27, -45, -2, + -25, -13, -25, -22, 21, 0, 0, -10, + 0, -15, -7, 0, -8, -14, 0, 13, + -25, 8, 0, 0, -41, 0, -8, -17, + -13, -5, -23, -19, -25, -18, 0, -23, + -8, -18, -15, -23, -8, 0, 0, 2, + 36, -13, 0, -23, -8, 0, -8, -15, + -18, -21, -22, -29, -10, -15, 15, 0, + -12, 0, -38, -9, 5, 15, -25, -28, + -15, -25, 25, -8, 4, -71, -14, 15, + -17, -13, -28, 0, -23, -32, -9, -8, + -6, -8, -16, -23, -2, 0, 0, 23, + 22, -5, -50, 0, -46, -18, 18, -29, + -52, -15, -27, -32, -38, -25, 15, 0, + 0, 0, 0, -9, 0, 0, 8, -9, + 15, 5, -15, 15, 0, 0, -24, -2, + 0, -2, 0, 2, 2, -6, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, + 0, 6, 23, 2, 0, -9, 0, 0, + 0, 0, -5, -5, -9, 0, 0, 0, + 2, 6, 0, 0, 0, 0, 6, 0, + -6, 0, 29, 0, 14, 2, 2, -10, + 0, 15, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 23, 0, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -46, 0, -8, 13, 0, 23, + 0, 0, 76, 9, -15, -15, 8, 8, + -5, 2, -38, 0, 0, 37, -46, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -52, 29, 108, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -46, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, -15, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, -21, 0, + 0, 2, 0, 0, 8, 99, -15, -6, + 25, 21, -21, 8, 0, 0, 8, 8, + -10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -100, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -22, + 0, 0, 0, -21, 0, 0, 0, 0, + -17, -4, 0, 0, 0, -17, 0, -9, + 0, -36, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -51, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -8, 0, 0, -15, 0, -12, 0, + -21, 0, 0, 0, -13, 8, -9, 0, + 0, -21, -8, -18, 0, 0, -21, 0, + -8, 0, -36, 0, -8, 0, 0, -62, + -15, -31, -8, -28, 0, 0, -51, 0, + -21, -4, 0, 0, 0, 0, 0, 0, + 0, 0, -12, -14, -6, -13, 0, 0, + 0, 0, -17, 0, -17, 10, -8, 15, + 0, -5, -18, -5, -13, -15, 0, -9, + -4, -5, 5, -21, -2, 0, 0, 0, + -68, -6, -11, 0, -17, 0, -5, -36, + -7, 0, 0, -5, -6, 0, 0, 0, + 0, 5, 0, -5, -13, -5, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 0, 0, + 0, -17, 0, -5, 0, 0, 0, -15, + 8, 0, 0, 0, -21, -8, -15, 0, + 0, -22, 0, -8, 0, -36, 0, 0, + 0, 0, -74, 0, -15, -28, -38, 0, + 0, -51, 0, -5, -12, 0, 0, 0, + 0, 0, 0, 0, 0, -8, -12, -4, + -12, 2, 0, 0, 13, -10, 0, 24, + 38, -8, -8, -23, 9, 38, 13, 17, + -21, 9, 32, 9, 22, 17, 21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 48, 36, -14, -8, 0, -6, + 61, 33, 61, 0, 0, 0, 8, 0, + 0, 28, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 11, + 0, 0, 0, 0, -65, -9, -6, -31, + -38, 0, 0, -51, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, -65, -9, -6, + -31, -38, 0, 0, -31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -6, 0, 0, 0, -18, 8, 0, -8, + 6, 14, 8, -23, 0, -2, -6, 8, + 0, 6, 0, 0, 0, 0, -19, 0, + -7, -5, -15, 0, -7, -31, 0, 48, + -8, 0, -17, -5, 0, -5, -13, 0, + -8, -22, -15, -9, 0, 0, 0, -12, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 11, 0, 0, 0, 0, -65, + -9, -6, -31, -38, 0, 0, -51, 0, + 0, 0, 0, 0, 0, 38, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -12, 0, -25, -9, -7, 23, -7, -8, + -31, 2, -5, 2, -5, -21, 2, 17, + 2, 6, 2, 6, -18, -31, -9, 0, + -29, -15, -21, -32, -30, 0, -12, -15, + -9, -10, -6, -5, -9, -5, 0, -5, + -2, 12, 0, 12, -5, 0, 24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, -8, -8, 0, 0, + -21, 0, -4, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -46, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, -8, 0, -10, + 0, 0, 0, 0, -6, 0, 0, -13, + -8, 8, 0, -13, -15, -5, 0, -22, + -5, -17, -5, -9, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -51, 0, 25, 0, 0, -14, 0, + 0, 0, 0, -10, 0, -8, 0, 0, + -4, 0, 0, -5, 0, -18, 0, 0, + 32, -10, -25, -24, 5, 8, 8, -2, + -22, 5, 12, 5, 23, 5, 25, -5, + -21, 0, 0, -31, 0, 0, -23, -21, + 0, 0, -15, 0, -10, -13, 0, -12, + 0, -12, 0, -5, 12, 0, -6, -23, + -8, 28, 0, 0, -7, 0, -15, 0, + 0, 10, -18, 0, 8, -8, 6, 1, + 0, -25, 0, -5, -2, 0, -8, 8, + -6, 0, 0, 0, -31, -9, -17, 0, + -23, 0, 0, -36, 0, 28, -8, 0, + -14, 0, 5, 0, -8, 0, -8, -23, + 0, -8, 8, 0, 0, 0, 0, -5, + 0, 0, 8, -10, 2, 0, 0, -9, + -5, 0, -9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -48, 0, 17, 0, + 0, -6, 0, 0, 0, 0, 2, 0, + -8, -8, 0, 0, 0, 15, 0, 18, + 0, 0, 0, 0, 0, -48, -44, 2, + 33, 23, 13, -31, 5, 32, 0, 28, + 0, 15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 41, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserrat_48 = { +#else +lv_font_t lv_font_montserrat_48 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 52, /*The maximum line height required by the font*/ + .base_line = 9, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -4, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_48*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_8.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_8.c new file mode 100644 index 0000000..3903332 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_montserrat_8.c @@ -0,0 +1,1449 @@ +/******************************************************************************* + * Size: 8 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 8 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_8.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_8 + #define LV_FONT_MONTSERRAT_8 1 +#endif + +#if LV_FONT_MONTSERRAT_8 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x58, 0x57, 0x46, 0x23, 0x46, + + /* U+0022 "\"" */ + 0x73, 0x97, 0x29, 0x0, 0x0, + + /* U+0023 "#" */ + 0x4, 0x52, 0x60, 0x4b, 0x9b, 0xa3, 0x8, 0x7, + 0x20, 0x6c, 0x8c, 0x81, 0x9, 0x9, 0x0, + + /* U+0024 "$" */ + 0x0, 0x80, 0x2, 0xbd, 0xa2, 0x76, 0x80, 0x0, + 0x8d, 0x81, 0x0, 0x84, 0x95, 0xad, 0xb3, 0x0, + 0x80, 0x0, + + /* U+0025 "%" */ + 0x58, 0x70, 0x63, 0x8, 0x8, 0x36, 0x0, 0x27, + 0x58, 0x67, 0x10, 0x8, 0x27, 0x26, 0x6, 0x20, + 0x88, 0x20, + + /* U+0026 "&" */ + 0x9, 0x99, 0x0, 0xb, 0x3a, 0x0, 0x19, 0xc2, + 0x20, 0x83, 0x1a, 0xa0, 0x3a, 0x99, 0x92, 0x0, + 0x0, 0x0, + + /* U+0027 "'" */ + 0x72, 0x72, 0x0, + + /* U+0028 "(" */ + 0x8, 0x20, 0xb0, 0x1a, 0x3, 0x80, 0x1a, 0x0, + 0xb0, 0x8, 0x20, + + /* U+0029 ")" */ + 0x73, 0x19, 0xb, 0xc, 0xb, 0x19, 0x73, + + /* U+002A "*" */ + 0x48, 0x40, 0x6e, 0x80, 0x15, 0x10, + + /* U+002B "+" */ + 0x0, 0x20, 0x0, 0xa, 0x0, 0x49, 0xd9, 0x10, + 0xa, 0x0, + + /* U+002C "," */ + 0x0, 0x75, 0x71, + + /* U+002D "-" */ + 0x5a, 0x60, + + /* U+002E "." */ + 0x0, 0x74, + + /* U+002F "/" */ + 0x0, 0xa, 0x0, 0x2, 0x80, 0x0, 0x82, 0x0, + 0xa, 0x0, 0x4, 0x60, 0x0, 0x91, 0x0, 0x19, + 0x0, 0x0, + + /* U+0030 "0" */ + 0xa, 0xbb, 0x26, 0x60, 0x1b, 0x93, 0x0, 0xc6, + 0x60, 0x1b, 0xa, 0xbb, 0x20, + + /* U+0031 "1" */ + 0x9e, 0x20, 0xa2, 0xa, 0x20, 0xa2, 0xa, 0x20, + + /* U+0032 "2" */ + 0x6a, 0xb9, 0x0, 0x0, 0xc0, 0x0, 0x58, 0x0, + 0x87, 0x0, 0x9e, 0xaa, 0x30, + + /* U+0033 "3" */ + 0x7a, 0xbe, 0x0, 0xa, 0x20, 0x4, 0xa9, 0x0, + 0x0, 0xa2, 0x8a, 0xa9, 0x0, + + /* U+0034 "4" */ + 0x0, 0x49, 0x0, 0x3, 0xa0, 0x0, 0x1b, 0x8, + 0x20, 0x8b, 0xad, 0xb2, 0x0, 0x9, 0x30, + + /* U+0035 "5" */ + 0x3d, 0xaa, 0x5, 0x60, 0x0, 0x5b, 0xa8, 0x0, + 0x0, 0x93, 0x7a, 0xaa, 0x0, + + /* U+0036 "6" */ + 0x9, 0xaa, 0x36, 0x70, 0x0, 0x98, 0x9a, 0x26, + 0x80, 0x2a, 0x9, 0x9a, 0x40, + + /* U+0037 "7" */ + 0xca, 0xad, 0x67, 0x0, 0xc0, 0x0, 0x67, 0x0, + 0xc, 0x0, 0x6, 0x70, 0x0, + + /* U+0038 "8" */ + 0x1a, 0xab, 0x25, 0x60, 0x48, 0x1d, 0xad, 0x38, + 0x40, 0x1b, 0x3a, 0x9a, 0x40, + + /* U+0039 "9" */ + 0x4a, 0x99, 0xb, 0x10, 0x95, 0x3a, 0x99, 0x80, + 0x0, 0x95, 0x3a, 0xb8, 0x0, + + /* U+003A ":" */ + 0x74, 0x0, 0x0, 0x74, + + /* U+003B ";" */ + 0x74, 0x0, 0x0, 0x75, 0x62, 0x0, + + /* U+003C "<" */ + 0x0, 0x1, 0x0, 0x49, 0x80, 0x5c, 0x30, 0x0, + 0x16, 0x91, 0x0, 0x0, 0x0, + + /* U+003D "=" */ + 0x49, 0x99, 0x10, 0x0, 0x0, 0x49, 0x99, 0x10, + + /* U+003E ">" */ + 0x10, 0x0, 0x3, 0x98, 0x20, 0x0, 0x6d, 0x14, + 0x94, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x6a, 0xb9, 0x0, 0x0, 0xc0, 0x0, 0xa4, 0x0, + 0x3, 0x0, 0x2, 0x80, 0x0, + + /* U+0040 "@" */ + 0x3, 0x87, 0x78, 0x50, 0x28, 0x4a, 0x9c, 0x75, + 0x80, 0xb0, 0xa, 0x28, 0x80, 0xb0, 0xa, 0x28, + 0x28, 0x49, 0x99, 0xa6, 0x3, 0x88, 0x75, 0x0, + + /* U+0041 "A" */ + 0x0, 0xb, 0x90, 0x0, 0x3, 0x8a, 0x10, 0x0, + 0xb1, 0x39, 0x0, 0x4d, 0x99, 0xd1, 0xb, 0x10, + 0x3, 0x90, + + /* U+0042 "B" */ + 0x2d, 0x99, 0xb1, 0x2a, 0x0, 0x84, 0x2d, 0x9a, + 0xd1, 0x2a, 0x0, 0x39, 0x2d, 0x99, 0xb4, + + /* U+0043 "C" */ + 0x7, 0xba, 0xa2, 0x59, 0x0, 0x0, 0x93, 0x0, + 0x0, 0x59, 0x0, 0x0, 0x7, 0xba, 0xa2, + + /* U+0044 "D" */ + 0x2e, 0xab, 0xb3, 0x2, 0xa0, 0x1, 0xc0, 0x2a, + 0x0, 0x9, 0x22, 0xa0, 0x1, 0xc0, 0x2e, 0xab, + 0xb3, 0x0, + + /* U+0045 "E" */ + 0x2e, 0xaa, 0x82, 0xa0, 0x0, 0x2d, 0xaa, 0x42, + 0xa0, 0x0, 0x2e, 0xaa, 0x90, + + /* U+0046 "F" */ + 0x2e, 0xaa, 0x82, 0xa0, 0x0, 0x2e, 0xaa, 0x42, + 0xa0, 0x0, 0x2a, 0x0, 0x0, + + /* U+0047 "G" */ + 0x7, 0xba, 0xa2, 0x59, 0x0, 0x0, 0x93, 0x0, + 0x23, 0x59, 0x0, 0x47, 0x7, 0xba, 0xa3, + + /* U+0048 "H" */ + 0x2a, 0x0, 0x2a, 0x2a, 0x0, 0x2a, 0x2e, 0xaa, + 0xba, 0x2a, 0x0, 0x2a, 0x2a, 0x0, 0x2a, + + /* U+0049 "I" */ + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + + /* U+004A "J" */ + 0x5, 0xad, 0x50, 0x0, 0x75, 0x0, 0x7, 0x50, + 0x0, 0x84, 0x9, 0xab, 0x0, + + /* U+004B "K" */ + 0x2a, 0x1, 0xa2, 0x2a, 0x1b, 0x20, 0x2c, 0xc7, + 0x0, 0x2d, 0x19, 0x50, 0x2a, 0x0, 0xa4, + + /* U+004C "L" */ + 0x2a, 0x0, 0x2, 0xa0, 0x0, 0x2a, 0x0, 0x2, + 0xa0, 0x0, 0x2e, 0xaa, 0x70, + + /* U+004D "M" */ + 0x2c, 0x0, 0x3, 0xc2, 0xd7, 0x0, 0xbc, 0x29, + 0x92, 0x84, 0xc2, 0x91, 0xb9, 0xc, 0x29, 0x3, + 0x0, 0xc0, + + /* U+004E "N" */ + 0x2d, 0x10, 0x2a, 0x2c, 0xb0, 0x2a, 0x2a, 0x4b, + 0x2a, 0x2a, 0x5, 0xca, 0x2a, 0x0, 0x7a, + + /* U+004F "O" */ + 0x7, 0xbb, 0xb3, 0x5, 0x90, 0x1, 0xc1, 0x93, + 0x0, 0x8, 0x45, 0x90, 0x1, 0xc1, 0x7, 0xbb, + 0xb3, 0x0, + + /* U+0050 "P" */ + 0x2e, 0xaa, 0x90, 0x2a, 0x0, 0x84, 0x2a, 0x0, + 0xa3, 0x2e, 0xaa, 0x60, 0x2a, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x7, 0xbb, 0xb3, 0x5, 0x90, 0x1, 0xc1, 0x93, + 0x0, 0x8, 0x45, 0x90, 0x0, 0xc1, 0x7, 0xbb, + 0xb3, 0x0, 0x0, 0x39, 0x93, + + /* U+0052 "R" */ + 0x2e, 0xaa, 0x90, 0x2a, 0x0, 0x84, 0x2a, 0x0, + 0xa3, 0x2d, 0xac, 0x80, 0x2a, 0x1, 0xa1, + + /* U+0053 "S" */ + 0x2a, 0xaa, 0x27, 0x60, 0x0, 0x8, 0x98, 0x10, + 0x0, 0x49, 0x5a, 0xaa, 0x30, + + /* U+0054 "T" */ + 0xaa, 0xea, 0x60, 0xc, 0x0, 0x0, 0xc0, 0x0, + 0xc, 0x0, 0x0, 0xc0, 0x0, + + /* U+0055 "U" */ + 0x39, 0x0, 0x48, 0x39, 0x0, 0x48, 0x39, 0x0, + 0x48, 0x1c, 0x0, 0x66, 0x6, 0xba, 0xa0, + + /* U+0056 "V" */ + 0xb, 0x10, 0x5, 0x70, 0x49, 0x0, 0xb0, 0x0, + 0xc1, 0x57, 0x0, 0x4, 0x9c, 0x0, 0x0, 0xc, + 0x70, 0x0, + + /* U+0057 "W" */ + 0x94, 0x0, 0xf1, 0x3, 0x93, 0xa0, 0x69, 0x70, + 0x93, 0xc, 0xb, 0xb, 0xb, 0x0, 0x79, 0x80, + 0x89, 0x70, 0x1, 0xf2, 0x2, 0xf1, 0x0, + + /* U+0058 "X" */ + 0x58, 0x2, 0xa0, 0x8, 0x7b, 0x10, 0x0, 0xf5, + 0x0, 0xa, 0x4b, 0x10, 0x76, 0x2, 0xb0, + + /* U+0059 "Y" */ + 0xa, 0x20, 0xb, 0x0, 0x1b, 0x9, 0x30, 0x0, + 0x5b, 0x80, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xc, + 0x0, 0x0, + + /* U+005A "Z" */ + 0x6a, 0xac, 0xd0, 0x0, 0x1b, 0x10, 0x0, 0xb2, + 0x0, 0xb, 0x30, 0x0, 0x8d, 0xaa, 0xa0, + + /* U+005B "[" */ + 0x2d, 0x42, 0x90, 0x29, 0x2, 0x90, 0x29, 0x2, + 0x90, 0x2d, 0x40, + + /* U+005C "\\" */ + 0x19, 0x0, 0x0, 0xa0, 0x0, 0x5, 0x50, 0x0, + 0xa, 0x0, 0x0, 0x91, 0x0, 0x3, 0x70, 0x0, + 0xa, 0x0, + + /* U+005D "]" */ + 0x8c, 0xc, 0xc, 0xc, 0xc, 0xc, 0x8c, + + /* U+005E "^" */ + 0x3, 0xc0, 0x0, 0x94, 0x50, 0x27, 0x9, 0x0, + + /* U+005F "_" */ + 0x77, 0x77, + + /* U+0060 "`" */ + 0x6, 0x60, + + /* U+0061 "a" */ + 0x29, 0x98, 0x2, 0x98, 0xd0, 0x84, 0xc, 0x13, + 0xb9, 0xd1, + + /* U+0062 "b" */ + 0x48, 0x0, 0x0, 0x48, 0x0, 0x0, 0x4c, 0xab, + 0x50, 0x4a, 0x0, 0xc0, 0x4a, 0x0, 0xc0, 0x4c, + 0xaa, 0x50, + + /* U+0063 "c" */ + 0x1a, 0xaa, 0x18, 0x40, 0x0, 0x84, 0x0, 0x1, + 0xaa, 0xa1, + + /* U+0064 "d" */ + 0x0, 0x0, 0xb0, 0x0, 0xb, 0x1a, 0xaa, 0xb9, + 0x40, 0x3b, 0x94, 0x2, 0xb1, 0xa9, 0x9b, + + /* U+0065 "e" */ + 0x19, 0x99, 0x19, 0x98, 0x86, 0x85, 0x1, 0x1, + 0xaa, 0xb1, + + /* U+0066 "f" */ + 0xa, 0xa0, 0x2a, 0x0, 0x9d, 0x70, 0x29, 0x0, + 0x29, 0x0, 0x29, 0x0, + + /* U+0067 "g" */ + 0x1a, 0x99, 0xb9, 0x40, 0x1c, 0x94, 0x2, 0xc1, + 0xaa, 0xab, 0x18, 0x9a, 0x30, + + /* U+0068 "h" */ + 0x48, 0x0, 0x4, 0x80, 0x0, 0x4c, 0x9b, 0x44, + 0x90, 0x1b, 0x48, 0x0, 0xc4, 0x80, 0xc, + + /* U+0069 "i" */ + 0x37, 0x0, 0x48, 0x48, 0x48, 0x48, + + /* U+006A "j" */ + 0x3, 0x70, 0x0, 0x3, 0x80, 0x38, 0x3, 0x80, + 0x38, 0x6b, 0x40, + + /* U+006B "k" */ + 0x48, 0x0, 0x4, 0x80, 0x0, 0x48, 0xa, 0x44, + 0x9c, 0x30, 0x4d, 0x6a, 0x4, 0x80, 0x77, + + /* U+006C "l" */ + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + + /* U+006D "m" */ + 0x4c, 0x9b, 0x89, 0xb4, 0x49, 0x3, 0xb0, 0xb, + 0x48, 0x2, 0xa0, 0xc, 0x48, 0x2, 0xa0, 0xc, + + /* U+006E "n" */ + 0x4c, 0x9b, 0x44, 0x90, 0x1b, 0x48, 0x0, 0xc4, + 0x80, 0xc, + + /* U+006F "o" */ + 0x1a, 0xaa, 0x18, 0x40, 0x3a, 0x84, 0x3, 0xa1, + 0xaa, 0xa1, + + /* U+0070 "p" */ + 0x4c, 0xab, 0x50, 0x4a, 0x0, 0xc0, 0x4a, 0x0, + 0xc0, 0x4c, 0xaa, 0x50, 0x48, 0x0, 0x0, + + /* U+0071 "q" */ + 0x1a, 0xa9, 0xb9, 0x40, 0x3b, 0x94, 0x3, 0xb1, + 0xaa, 0x9b, 0x0, 0x0, 0xb0, + + /* U+0072 "r" */ + 0x4b, 0xa0, 0x4a, 0x0, 0x48, 0x0, 0x48, 0x0, + + /* U+0073 "s" */ + 0x5b, 0x95, 0x87, 0x30, 0x3, 0x79, 0x7a, 0xa6, + + /* U+0074 "t" */ + 0x29, 0x0, 0x9d, 0x70, 0x29, 0x0, 0x29, 0x0, + 0xb, 0x90, + + /* U+0075 "u" */ + 0x57, 0x1, 0xb5, 0x70, 0x1b, 0x48, 0x3, 0xb0, + 0xa9, 0x9b, + + /* U+0076 "v" */ + 0xb, 0x0, 0x84, 0x5, 0x70, 0xb0, 0x0, 0xb7, + 0x50, 0x0, 0x6d, 0x0, + + /* U+0077 "w" */ + 0xb0, 0xe, 0x20, 0xa0, 0x55, 0x59, 0x82, 0x80, + 0xa, 0xa0, 0xa8, 0x20, 0x9, 0x80, 0x6b, 0x0, + + /* U+0078 "x" */ + 0x67, 0x1b, 0x0, 0x9b, 0x10, 0xa, 0xb2, 0x7, + 0x51, 0xb0, + + /* U+0079 "y" */ + 0xb, 0x10, 0x83, 0x3, 0x81, 0xa0, 0x0, 0xaa, + 0x30, 0x0, 0x4a, 0x0, 0xa, 0xb2, 0x0, + + /* U+007A "z" */ + 0x59, 0xbb, 0x1, 0xb1, 0xb, 0x20, 0x9c, 0x98, + + /* U+007B "{" */ + 0xa, 0x60, 0xc0, 0xc, 0x5, 0xb0, 0xc, 0x0, + 0xc0, 0xa, 0x60, + + /* U+007C "|" */ + 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, + + /* U+007D "}" */ + 0x97, 0x0, 0xb0, 0xb, 0x0, 0xd3, 0xb, 0x0, + 0xb0, 0x97, 0x0, + + /* U+007E "~" */ + 0x29, 0x35, 0x15, 0x6, 0x80, + + /* U+00B0 "°" */ + 0x26, 0x47, 0x7, 0x27, 0x50, + + /* U+2022 "•" */ + 0x0, 0x5d, 0x2, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xbe, + 0x0, 0x8d, 0xff, 0xff, 0x0, 0xff, 0xe9, 0x5f, + 0x0, 0xf3, 0x0, 0xf, 0x0, 0xf0, 0x0, 0xf, + 0x0, 0xf0, 0xa, 0xff, 0xaf, 0xf0, 0xa, 0xfa, + 0xaf, 0xa0, 0x0, 0x0, + + /* U+F008 "" */ + 0xbd, 0xcc, 0xce, 0xab, 0x8b, 0x0, 0x7, 0x58, + 0xcd, 0x66, 0x6a, 0xac, 0xcd, 0x66, 0x6a, 0xac, + 0x8b, 0x0, 0x7, 0x58, 0xbd, 0xcc, 0xce, 0xab, + + /* U+F00B "" */ + 0x34, 0x14, 0x44, 0x43, 0xff, 0x7f, 0xff, 0xff, + 0xab, 0x4b, 0xbb, 0xba, 0xbc, 0x5c, 0xcc, 0xcb, + 0xff, 0x7f, 0xff, 0xff, 0x67, 0x17, 0x88, 0x86, + 0xff, 0x7f, 0xff, 0xff, 0xab, 0x4b, 0xbb, 0xba, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x9a, 0x0, 0x0, 0x9, 0xfa, + 0xa9, 0x0, 0x9f, 0xa0, 0xaf, 0x99, 0xfa, 0x0, + 0xa, 0xff, 0xa0, 0x0, 0x0, 0x99, 0x0, 0x0, + + /* U+F00D "ï€" */ + 0x63, 0x0, 0x82, 0xcf, 0x4a, 0xf4, 0x1d, 0xff, + 0x60, 0xa, 0xff, 0x30, 0xaf, 0x7d, 0xf3, 0xa6, + 0x1, 0xb3, + + /* U+F011 "" */ + 0x0, 0xc, 0x51, 0x0, 0x1d, 0x7d, 0x6e, 0x70, + 0x8d, 0xd, 0x65, 0xf1, 0xc7, 0xd, 0x60, 0xe6, + 0xd7, 0x6, 0x20, 0xe6, 0x9d, 0x0, 0x4, 0xf2, + 0x1e, 0xc7, 0x8f, 0x80, 0x1, 0x9d, 0xc6, 0x0, + + /* U+F013 "" */ + 0x0, 0xc, 0xc0, 0x0, 0x18, 0x8f, 0xf8, 0x81, + 0x8f, 0xfe, 0xef, 0xf8, 0x2f, 0xe0, 0xe, 0xf2, + 0x2f, 0xe0, 0xe, 0xf2, 0x8f, 0xfe, 0xef, 0xf8, + 0x18, 0x8f, 0xf8, 0x81, 0x0, 0xc, 0xc0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x30, 0x22, 0x0, 0x0, 0xaf, 0xaa, + 0xa0, 0x1, 0xda, 0x6a, 0xfa, 0x3, 0xe8, 0xbf, + 0xb8, 0xe3, 0xb6, 0xdf, 0xff, 0xd6, 0xb0, 0x8f, + 0xfb, 0xff, 0x80, 0x8, 0xfc, 0xc, 0xf8, 0x0, + 0x5b, 0x80, 0x8b, 0x50, + + /* U+F019 "" */ + 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x7, 0xff, 0xff, 0x70, + 0x0, 0x9f, 0xf9, 0x0, 0x78, 0x7a, 0xa7, 0x87, + 0xff, 0xfb, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0xbf, + + /* U+F01C "" */ + 0x5, 0xff, 0xff, 0xf5, 0x1, 0xe3, 0x0, 0x3, + 0xe1, 0xa8, 0x0, 0x0, 0x8, 0xaf, 0xff, 0x60, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xfd, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x3, 0x2, 0xbf, 0xfb, 0x3f, + 0x2e, 0x91, 0x18, 0xff, 0x9a, 0x0, 0x6c, 0xff, + 0x31, 0x0, 0x24, 0x44, 0x44, 0x42, 0x0, 0x13, + 0xff, 0xc6, 0x0, 0xb9, 0xfe, 0xa5, 0x5b, 0xd1, + 0xf2, 0x8c, 0xc8, 0x10, 0x30, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x9, 0x34, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xab, 0xff, 0x0, 0x4f, 0x0, 0x1, + + /* U+F027 "" */ + 0x0, 0x9, 0x0, 0x34, 0xcf, 0x1, 0xff, 0xff, + 0x1b, 0xff, 0xff, 0x1b, 0xbb, 0xff, 0x1, 0x0, + 0x4f, 0x0, 0x0, 0x1, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x54, 0x0, 0x0, 0x90, 0x23, + 0xb3, 0x34, 0xcf, 0x2, 0xc3, 0xbf, 0xff, 0xf1, + 0xb5, 0x6c, 0xff, 0xff, 0x1b, 0x56, 0xca, 0xbf, + 0xf0, 0x2c, 0x3a, 0x0, 0x4f, 0x2, 0x3b, 0x30, + 0x0, 0x10, 0x5, 0x40, + + /* U+F03E "" */ + 0xdf, 0xff, 0xff, 0xfd, 0xf0, 0x7f, 0xff, 0xff, + 0xf8, 0xcf, 0xb1, 0xbf, 0xfb, 0x5b, 0x0, 0xf, + 0xf0, 0x0, 0x0, 0xf, 0xdf, 0xff, 0xff, 0xfd, + + /* U+F043 "ïƒ" */ + 0x0, 0xb4, 0x0, 0x3, 0xfb, 0x0, 0xb, 0xff, + 0x40, 0x6f, 0xff, 0xd0, 0xdf, 0xff, 0xf5, 0xf8, + 0xff, 0xf7, 0xaa, 0x8f, 0xf2, 0x1a, 0xfd, 0x40, + + /* U+F048 "ïˆ" */ + 0x40, 0x0, 0x2f, 0x20, 0x8f, 0xf2, 0x9f, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0x5e, 0xff, 0xf2, + 0x2e, 0xfb, 0x10, 0x19, + + /* U+F04B "ï‹" */ + 0x0, 0x0, 0x0, 0xd, 0xa1, 0x0, 0x0, 0xff, + 0xf7, 0x0, 0xf, 0xff, 0xfd, 0x40, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xd4, + 0xf, 0xff, 0x70, 0x0, 0xda, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F04C "ïŒ" */ + 0x9b, 0x90, 0x9b, 0x9f, 0xff, 0xf, 0xff, 0xff, + 0xf0, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf0, 0xff, + 0xf2, 0x42, 0x2, 0x42, + + /* U+F04D "ï" */ + 0x24, 0x44, 0x44, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xbb, 0xbb, 0xb8, + + /* U+F051 "ï‘" */ + 0x20, 0x0, 0x4f, 0x80, 0x2f, 0xff, 0x92, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x5f, 0xfd, + 0x22, 0xf9, 0x10, 0x1b, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x8f, 0x80, + 0x0, 0x0, 0x7f, 0xff, 0x70, 0x0, 0x5f, 0xff, + 0xff, 0x50, 0xe, 0xff, 0xff, 0xfe, 0x0, 0x58, + 0x88, 0x88, 0x50, 0xf, 0xff, 0xff, 0xff, 0x0, + 0xab, 0xbb, 0xbb, 0xa0, + + /* U+F053 "ï“" */ + 0x0, 0x6, 0x20, 0x7, 0xf4, 0x7, 0xf5, 0x5, + 0xf6, 0x0, 0x1e, 0xb0, 0x0, 0x2e, 0xb0, 0x0, + 0x2e, 0x60, 0x0, 0x10, + + /* U+F054 "ï”" */ + 0x26, 0x0, 0x4, 0xf7, 0x0, 0x5, 0xf7, 0x0, + 0x6, 0xf5, 0x0, 0xbe, 0x10, 0xbe, 0x20, 0x6e, + 0x20, 0x0, 0x10, 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x4, 0x0, 0x0, 0x3, 0xf3, 0x0, 0x0, + 0x4f, 0x40, 0x7, 0x8a, 0xfa, 0x87, 0xef, 0xff, + 0xff, 0xe0, 0x4, 0xf4, 0x0, 0x0, 0x4f, 0x40, + 0x0, 0x1, 0xb1, 0x0, + + /* U+F068 "ï¨" */ + 0x78, 0x88, 0x88, 0x7e, 0xff, 0xff, 0xfe, + + /* U+F06E "ï®" */ + 0x0, 0x8c, 0xcc, 0x80, 0x1, 0xdd, 0x16, 0x3d, + 0xd1, 0xcf, 0x55, 0xed, 0x5f, 0xcb, 0xf5, 0xdf, + 0xd5, 0xfc, 0x1d, 0xd3, 0x73, 0xdd, 0x10, 0x8, + 0xdc, 0xc8, 0x10, + + /* U+F070 "ï°" */ + 0x1d, 0x30, 0x0, 0x0, 0x0, 0x0, 0x5e, 0x8c, + 0xcc, 0xa2, 0x0, 0x0, 0x2d, 0xb4, 0x49, 0xf4, + 0x0, 0x7a, 0x1a, 0xff, 0x3f, 0xe1, 0x7, 0xfa, + 0x6, 0xf7, 0xff, 0x10, 0xa, 0xf3, 0x3, 0xef, + 0x40, 0x0, 0x6, 0xcc, 0x71, 0xbb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x89, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x3e, 0x30, 0x0, 0x0, 0x0, 0xc, + 0xfc, 0x0, 0x0, 0x0, 0x6, 0xfc, 0xf6, 0x0, + 0x0, 0x0, 0xed, 0xd, 0xe0, 0x0, 0x0, 0x8f, + 0xe0, 0xef, 0x80, 0x0, 0x2f, 0xff, 0x6f, 0xff, + 0x20, 0xb, 0xff, 0xe2, 0xef, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xd0, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x20, 0x44, 0x0, 0x4, 0xf5, + 0xef, 0xb1, 0xcf, 0xfd, 0x1, 0x8c, 0xd1, 0xc1, + 0x1, 0xdc, 0x81, 0xc1, 0xef, 0xc1, 0xbf, 0xfd, + 0x44, 0x0, 0x4, 0xf5, 0x0, 0x0, 0x0, 0x20, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0xe4, 0x0, 0x4, + 0xfc, 0xf4, 0x4, 0xf8, 0x8, 0xf4, 0xb8, 0x0, + 0x8, 0xb0, 0x0, 0x0, 0x0, + + /* U+F078 "ï¸" */ + 0x0, 0x0, 0x0, 0xb, 0x80, 0x0, 0x8b, 0x4f, + 0x80, 0x8f, 0x40, 0x4f, 0xcf, 0x40, 0x0, 0x4e, + 0x40, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x94, 0x14, 0x44, 0x40, 0x0, 0xbf, 0xf8, + 0xbb, 0xbf, 0x10, 0x8, 0xb7, 0x60, 0x0, 0xe1, + 0x0, 0xb, 0x40, 0x0, 0x1e, 0x20, 0x0, 0xb7, + 0x44, 0x5e, 0xfd, 0x50, 0x7, 0xbb, 0xb8, 0x5f, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+F07B "ï»" */ + 0xdf, 0xfb, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfd, + + /* U+F093 "ï‚“" */ + 0x0, 0x9, 0x90, 0x0, 0x0, 0x9f, 0xf9, 0x0, + 0x7, 0xff, 0xff, 0x70, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x78, 0x4f, 0xf4, 0x87, + 0xff, 0xe8, 0x8e, 0xff, 0xff, 0xff, 0xfb, 0xbf, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xea, 0x0, 0x0, 0x0, 0xef, 0xe0, 0x0, 0x0, + 0xc, 0xfc, 0x0, 0x0, 0x0, 0x4f, 0x70, 0x0, + 0x0, 0x1d, 0xe0, 0x7, 0xdc, 0x4d, 0xf3, 0x0, + 0xef, 0xff, 0xe3, 0x0, 0xa, 0xec, 0x70, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x3, 0x0, 0x0, 0x0, 0xcd, 0xc0, 0x2d, 0xc0, + 0xe7, 0xf2, 0xee, 0x20, 0x4b, 0xff, 0xe2, 0x0, + 0x4, 0xff, 0xa0, 0x0, 0xcd, 0xf9, 0xf9, 0x0, + 0xe7, 0xe0, 0x7f, 0x90, 0x4a, 0x40, 0x4, 0x50, + + /* U+F0C5 "" */ + 0x0, 0xff, 0xf7, 0x47, 0x4f, 0xff, 0x47, 0xf8, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xfb, 0x78, 0x88, + 0x7f, 0xff, 0xff, 0x0, + + /* U+F0C7 "" */ + 0x24, 0x44, 0x41, 0xf, 0xbb, 0xbb, 0xe2, 0xf0, + 0x0, 0xf, 0xdf, 0x44, 0x44, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xf9, 0x9, 0xff, 0xff, 0xd5, 0xdf, + 0xf8, 0xbb, 0xbb, 0xb8, + + /* U+F0C9 "" */ + 0x1, 0x11, 0x11, 0xf, 0xff, 0xff, 0xff, 0x1, + 0x11, 0x11, 0x5, 0x55, 0x55, 0x55, 0xcc, 0xcc, + 0xcc, 0xc0, 0x11, 0x11, 0x10, 0xff, 0xff, 0xff, + 0xf0, 0x11, 0x11, 0x10, + + /* U+F0E0 "" */ + 0xdf, 0xff, 0xff, 0xfd, 0x9f, 0xff, 0xff, 0xf9, + 0xb7, 0xff, 0xff, 0x7b, 0xfe, 0x7c, 0xc7, 0xef, + 0xff, 0xfa, 0xaf, 0xff, 0xdf, 0xff, 0xff, 0xfd, + + /* U+F0E7 "" */ + 0x7, 0xff, 0x60, 0x0, 0xaf, 0xf2, 0x0, 0xc, + 0xff, 0x87, 0x0, 0xef, 0xff, 0xb0, 0x7, 0x8e, + 0xf2, 0x0, 0x0, 0xf8, 0x0, 0x0, 0x3e, 0x0, + 0x0, 0x6, 0x50, 0x0, + + /* U+F0EA "" */ + 0x79, 0xb9, 0x70, 0xf, 0xfc, 0xff, 0x0, 0xff, + 0x68, 0x83, 0xf, 0xf8, 0xff, 0x8b, 0xff, 0x8f, + 0xf8, 0x8f, 0xf8, 0xff, 0xff, 0x78, 0x8f, 0xff, + 0xf0, 0x7, 0xff, 0xff, + + /* U+F0F3 "" */ + 0x0, 0xd, 0x0, 0x0, 0x4e, 0xfe, 0x30, 0xd, + 0xff, 0xfd, 0x0, 0xff, 0xff, 0xf0, 0x3f, 0xff, + 0xff, 0x3b, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, + 0x60, 0x4, 0xf4, 0x0, + + /* U+F11C "" */ + 0xdf, 0xff, 0xff, 0xff, 0xdf, 0x18, 0x81, 0x88, + 0x1f, 0xfe, 0xaa, 0xca, 0xae, 0xff, 0xea, 0xac, + 0xaa, 0xef, 0xf1, 0x80, 0x0, 0x81, 0xfd, 0xff, + 0xff, 0xff, 0xfd, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0xc0, 0x0, 0x0, 0x5c, 0xff, 0xb0, 0x0, + 0x6e, 0xff, 0xff, 0x40, 0xd, 0xff, 0xff, 0xfc, + 0x0, 0x6, 0x88, 0xcf, 0xf5, 0x0, 0x0, 0x0, + 0x8f, 0xe0, 0x0, 0x0, 0x0, 0x8f, 0x60, 0x0, + 0x0, 0x0, 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "ï…›" */ + 0xff, 0xf8, 0xb0, 0xff, 0xf8, 0xfb, 0xff, 0xfc, + 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+F1EB "" */ + 0x0, 0x4, 0x77, 0x40, 0x0, 0x9, 0xff, 0xcc, + 0xff, 0x90, 0xcd, 0x40, 0x0, 0x4, 0xdc, 0x20, + 0x4b, 0xff, 0xb4, 0x2, 0x1, 0xfa, 0x55, 0xaf, + 0x10, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + 0xee, 0x0, 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, + + /* U+F240 "" */ + 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, + 0xbb, 0xda, 0xf7, 0xee, 0xee, 0xee, 0x5f, 0xf8, + 0xff, 0xff, 0xff, 0x2f, 0xf5, 0x66, 0x66, 0x66, + 0xab, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, + + /* U+F241 "ï‰" */ + 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, + 0xbb, 0xda, 0xf7, 0xee, 0xee, 0x70, 0x5f, 0xf8, + 0xff, 0xff, 0x80, 0x2f, 0xf5, 0x66, 0x66, 0x54, + 0xab, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, + + /* U+F242 "" */ + 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, + 0xbb, 0xda, 0xf7, 0xee, 0xe0, 0x0, 0x5f, 0xf8, + 0xff, 0xf0, 0x0, 0x2f, 0xf5, 0x66, 0x64, 0x44, + 0xab, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, + + /* U+F243 "" */ + 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, + 0xbb, 0xda, 0xf7, 0xe7, 0x0, 0x0, 0x5f, 0xf8, + 0xf8, 0x0, 0x0, 0x2f, 0xf5, 0x65, 0x44, 0x44, + 0xab, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, + + /* U+F244 "" */ + 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, + 0xbb, 0xd8, 0xf0, 0x0, 0x0, 0x0, 0x5f, 0xf0, + 0x0, 0x0, 0x0, 0x2f, 0xf4, 0x44, 0x44, 0x44, + 0xad, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xd8, 0x0, 0x0, 0x0, 0x7, 0x36, 0x40, 0x0, + 0x9, 0xb1, 0x91, 0x11, 0x17, 0x20, 0xef, 0x88, + 0xd8, 0x88, 0xd9, 0x2, 0x20, 0x6, 0x48, 0x70, + 0x0, 0x0, 0x0, 0x6, 0xec, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x6, 0xdd, 0xc3, 0x4, 0xff, 0x3e, 0xd0, 0x9c, + 0xb5, 0x5f, 0x2b, 0xf7, 0x1a, 0xf4, 0xbf, 0x81, + 0xbf, 0x39, 0xc9, 0x64, 0xf2, 0x4f, 0xf3, 0xde, + 0x0, 0x6d, 0xed, 0x30, + + /* U+F2ED "ï‹­" */ + 0x78, 0xdf, 0xd8, 0x77, 0x88, 0x88, 0x87, 0x8f, + 0xff, 0xff, 0x88, 0xcc, 0x8c, 0xc8, 0x8c, 0xc8, + 0xcc, 0x88, 0xcc, 0x8c, 0xc8, 0x8c, 0xc8, 0xcc, + 0x85, 0xff, 0xff, 0xf5, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x7e, 0x30, 0x0, 0x0, 0x4b, + 0xfe, 0x0, 0x0, 0x8f, 0x9b, 0x70, 0x0, 0x8f, + 0xff, 0x40, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x7f, + 0xff, 0x80, 0x0, 0xe, 0xff, 0x80, 0x0, 0x0, + 0xee, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0xaf, 0xff, 0xff, 0xfc, 0xb, 0xff, 0x9c, + 0xc9, 0xff, 0xaf, 0xff, 0xc1, 0x1c, 0xff, 0xaf, + 0xff, 0xc1, 0x1c, 0xff, 0xb, 0xff, 0x9c, 0xc9, + 0xff, 0x0, 0xaf, 0xff, 0xff, 0xfc, + + /* U+F7C2 "" */ + 0x7, 0xff, 0xfe, 0x17, 0xb6, 0x27, 0xc3, 0xfe, + 0xb9, 0xbe, 0x3f, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0x3f, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0x3c, 0xff, 0xff, 0xe1, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x3, 0x0, 0x23, 0x0, 0x2, + 0xf0, 0x2e, 0x92, 0x22, 0x5f, 0xd, 0xff, 0xff, + 0xff, 0xf0, 0x2e, 0x92, 0x22, 0x21, 0x0, 0x23, + 0x0, 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 34, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 34, .box_w = 2, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5, .adv_w = 50, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 10, .adv_w = 90, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 25, .adv_w = 79, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 43, .adv_w = 108, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 61, .adv_w = 88, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 79, .adv_w = 27, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 82, .adv_w = 43, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 93, .adv_w = 43, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 100, .adv_w = 51, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 106, .adv_w = 74, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 116, .adv_w = 29, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 119, .adv_w = 49, .box_w = 3, .box_h = 1, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 121, .adv_w = 29, .box_w = 2, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 123, .adv_w = 45, .box_w = 5, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 141, .adv_w = 85, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 154, .adv_w = 47, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 162, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 175, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 188, .adv_w = 86, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 203, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 216, .adv_w = 79, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 229, .adv_w = 77, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 242, .adv_w = 82, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 255, .adv_w = 79, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 268, .adv_w = 29, .box_w = 2, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 272, .adv_w = 29, .box_w = 2, .box_h = 6, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 278, .adv_w = 74, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 291, .adv_w = 74, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 299, .adv_w = 74, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 312, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 325, .adv_w = 132, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 349, .adv_w = 94, .box_w = 7, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 367, .adv_w = 97, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 382, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 397, .adv_w = 106, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 415, .adv_w = 86, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 428, .adv_w = 81, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 441, .adv_w = 99, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 456, .adv_w = 104, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 471, .adv_w = 40, .box_w = 2, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 476, .adv_w = 66, .box_w = 5, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 489, .adv_w = 92, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 504, .adv_w = 76, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 517, .adv_w = 122, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 535, .adv_w = 104, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 550, .adv_w = 108, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 568, .adv_w = 92, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 583, .adv_w = 108, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 604, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 619, .adv_w = 79, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 632, .adv_w = 75, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 645, .adv_w = 101, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 660, .adv_w = 91, .box_w = 7, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 678, .adv_w = 144, .box_w = 9, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 701, .adv_w = 86, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 716, .adv_w = 83, .box_w = 7, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 734, .adv_w = 84, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 749, .adv_w = 43, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 760, .adv_w = 45, .box_w = 5, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 778, .adv_w = 43, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 785, .adv_w = 75, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 793, .adv_w = 64, .box_w = 4, .box_h = 1, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 795, .adv_w = 77, .box_w = 3, .box_h = 1, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 797, .adv_w = 77, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 807, .adv_w = 87, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 825, .adv_w = 73, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 835, .adv_w = 87, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 850, .adv_w = 78, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 860, .adv_w = 45, .box_w = 4, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 872, .adv_w = 88, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 885, .adv_w = 87, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 900, .adv_w = 36, .box_w = 2, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 906, .adv_w = 36, .box_w = 3, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 917, .adv_w = 79, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 932, .adv_w = 36, .box_w = 2, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 938, .adv_w = 135, .box_w = 8, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 954, .adv_w = 87, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 964, .adv_w = 81, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 974, .adv_w = 87, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 989, .adv_w = 87, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1002, .adv_w = 52, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1010, .adv_w = 64, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1018, .adv_w = 53, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1028, .adv_w = 87, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1038, .adv_w = 72, .box_w = 6, .box_h = 4, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1050, .adv_w = 115, .box_w = 8, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1066, .adv_w = 71, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1076, .adv_w = 72, .box_w = 6, .box_h = 5, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1091, .adv_w = 67, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1099, .adv_w = 45, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1110, .adv_w = 38, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1117, .adv_w = 45, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1128, .adv_w = 74, .box_w = 5, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1133, .adv_w = 54, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 1138, .adv_w = 40, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 1141, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1177, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1201, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1233, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1257, .adv_w = 88, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1275, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1307, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1339, .adv_w = 144, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1375, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1407, .adv_w = 144, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1434, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1474, .adv_w = 64, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1488, .adv_w = 96, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1509, .adv_w = 144, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1545, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1569, .adv_w = 88, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1593, .adv_w = 112, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1613, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1648, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1676, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1704, .adv_w = 112, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1724, .adv_w = 112, .box_w = 9, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1760, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1780, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1800, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1828, .adv_w = 112, .box_w = 7, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1835, .adv_w = 144, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1862, .adv_w = 160, .box_w = 11, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1906, .adv_w = 144, .box_w = 11, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1950, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1982, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2003, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2024, .adv_w = 160, .box_w = 11, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 2063, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2087, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2119, .adv_w = 128, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 2160, .adv_w = 112, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2192, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2220, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2248, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2276, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2300, .adv_w = 80, .box_w = 7, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 2328, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2356, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2384, .adv_w = 144, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2411, .adv_w = 128, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 2461, .adv_w = 96, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2485, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2525, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2555, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2585, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2615, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2645, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2675, .adv_w = 160, .box_w = 11, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2719, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2747, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2775, .adv_w = 128, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 2816, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2846, .adv_w = 96, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2874, .adv_w = 129, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 3, -3, 0, 0, + 0, 0, -7, -8, 1, 6, 3, 2, + -5, 1, 6, 0, 5, 1, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 1, -1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, -4, 0, 0, 0, 0, + 0, -3, 2, 3, 0, 0, -1, 0, + -1, 1, 0, -1, 0, -1, -1, -3, + 0, 0, 0, 0, -1, 0, 0, -2, + -2, 0, 0, -1, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + -1, 0, -2, 0, -3, 0, -15, 0, + 0, -3, 0, 3, 4, 0, 0, -3, + 1, 1, 4, 3, -2, 3, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, -2, -6, 0, -5, + -1, 0, 0, 0, 0, 0, 5, 0, + -4, -1, 0, 0, 0, -2, 0, 0, + -1, -9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -10, -1, 5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 0, 1, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, + 3, 1, 4, -1, 0, 0, 3, -1, + -4, -18, 1, 3, 3, 0, -2, 0, + 5, 0, 4, 0, 4, 0, -12, 0, + -2, 4, 0, 4, -1, 3, 1, 0, + 0, 0, -1, 0, 0, -2, 10, 0, + 10, 0, 4, 0, 5, 2, 2, 4, + 0, 0, 0, -5, 0, 0, 0, 0, + 0, -1, 0, 1, -2, -2, -3, 1, + 0, -1, 0, 0, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -7, 0, -8, 0, 0, 0, + 0, -1, 0, 13, -2, -2, 1, 1, + -1, 0, -2, 1, 0, 0, -7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -12, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, 8, 0, 0, -5, 0, + 4, 0, -9, -12, -9, -3, 4, 0, + 0, -9, 0, 2, -3, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 4, -16, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 1, 0, 0, 0, + 0, 0, 1, 1, -2, -3, 0, 0, + 0, -1, 0, 0, -1, 0, 0, 0, + -3, 0, -1, 0, -3, -3, 0, -3, + -4, -4, -2, 0, -3, 0, -3, 0, + 0, 0, 0, -1, 0, 0, 1, 0, + 1, -1, 0, 0, 0, 0, 0, 1, + -1, 0, 0, 0, -1, 1, 1, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, -1, 0, + -2, 0, -2, 0, 0, -1, 0, 4, + 0, 0, -1, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, 0, -1, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, -1, -2, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, -1, -1, -1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, -1, -2, 0, -2, 0, -4, + -1, -4, 3, 0, 0, -3, 1, 3, + 3, 0, -3, 0, -2, 0, 0, -6, + 1, -1, 1, -7, 1, 0, 0, 0, + -7, 0, -7, -1, -11, -1, 0, -6, + 0, 3, 4, 0, 2, 0, 0, 0, + 0, 0, 0, -2, -2, 0, -4, 0, + 0, 0, -1, 0, 0, 0, -1, 0, + 0, 0, 0, 0, -1, -1, 0, -1, + -2, 0, 0, 0, 0, 0, 0, 0, + -1, -1, 0, -1, -2, -1, 0, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, -1, 0, -2, + 0, -1, 0, -3, 1, 0, 0, -2, + 1, 1, 1, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 1, + 0, 0, -1, 0, -1, -1, -2, 0, + 0, 0, 0, 0, 0, 0, 1, 0, + -1, 0, 0, 0, 0, -1, -2, 0, + -2, 0, 4, -1, 0, -4, 0, 0, + 3, -6, -7, -5, -3, 1, 0, -1, + -8, -2, 0, -2, 0, -3, 2, -2, + -8, 0, -3, 0, 0, 1, 0, 1, + -1, 0, 1, 0, -4, -5, 0, -6, + -3, -3, -3, -4, -2, -3, 0, -2, + -3, 1, 0, 0, 0, -1, 0, 0, + 0, 1, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, -1, 0, 0, -1, 0, -2, -3, + -3, 0, 0, -4, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 1, + -1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, 0, 0, + -2, 0, 0, 0, 0, -6, -4, 0, + 0, 0, -2, -6, 0, 0, -1, 1, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, -2, 0, + 0, 0, 0, 2, 0, 1, -3, -3, + 0, -1, -1, -2, 0, 0, 0, 0, + 0, 0, -4, 0, -1, 0, -2, -1, + 0, -3, -3, -4, -1, 0, -3, 0, + -4, 0, 0, 0, 0, 10, 0, 0, + 1, 0, 0, -2, 0, 1, 0, -6, + 0, 0, 0, 0, 0, -12, -2, 4, + 4, -1, -5, 0, 1, -2, 0, -6, + -1, -2, 1, -9, -1, 2, 0, 2, + -4, -2, -5, -4, -5, 0, 0, -8, + 0, 7, 0, 0, -1, 0, 0, 0, + -1, -1, -1, -3, -4, 0, -12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1, 0, -1, -1, -2, 0, 0, + -3, 0, -1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 3, + 0, 2, 0, -3, 1, -1, 0, -3, + -1, 0, -2, -1, -1, 0, -2, -2, + 0, 0, -1, 0, -1, -2, -2, 0, + 0, -1, 0, 1, -1, 0, -3, 0, + 0, 0, -3, 0, -2, 0, -2, -2, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 1, 0, -2, 0, -1, -2, + -4, -1, -1, -1, 0, -1, -2, 0, + 0, 0, 0, 0, 0, -1, -1, -1, + 0, 0, 0, 0, 2, -1, 0, -1, + 0, 0, 0, -1, -2, -1, -1, -2, + -1, 0, 1, 5, 0, 0, -3, 0, + -1, 3, 0, -1, -5, -2, 2, 0, + 0, -6, -2, 1, -2, 1, 0, -1, + -1, -4, 0, -2, 1, 0, 0, -2, + 0, 0, 0, 1, 1, -3, -2, 0, + -2, -1, -2, -1, -1, 0, -2, 1, + -2, -2, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, -2, + 0, 0, -1, -1, 0, 0, 0, 0, + -1, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, -1, 0, 0, 0, 0, + -2, 0, -3, 0, 0, 0, -4, 0, + 1, -3, 3, 0, -1, -6, 0, 0, + -3, -1, 0, -5, -3, -4, 0, 0, + -6, -1, -5, -5, -6, 0, -3, 0, + 1, 9, -2, 0, -3, -1, 0, -1, + -2, -3, -2, -5, -5, -3, -1, 0, + 0, -1, 0, 0, 0, 0, -9, -1, + 4, 3, -3, -5, 0, 0, -4, 0, + -6, -1, -1, 3, -12, -2, 0, 0, + 0, -8, -2, -7, -1, -9, 0, 0, + -9, 0, 8, 0, 0, -1, 0, 0, + 0, 0, -1, -1, -5, -1, 0, -8, + 0, 0, 0, 0, -4, 0, -1, 0, + 0, -4, -6, 0, 0, -1, -2, -4, + -1, 0, -1, 0, 0, 0, 0, -6, + -1, -4, -4, -1, -2, -3, -1, -2, + 0, -3, -1, -4, -2, 0, -2, -2, + -1, -2, 0, 1, 0, -1, -4, 0, + 3, 0, -2, 0, 0, 0, 0, 2, + 0, 1, -3, 5, 0, -1, -1, -2, + 0, 0, 0, 0, 0, 0, -4, 0, + -1, 0, -2, -1, 0, -3, -3, -4, + -1, 0, -3, 1, 5, 0, 0, 0, + 0, 10, 0, 0, 1, 0, 0, -2, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, -3, 0, 0, 0, 0, 0, -1, + 0, 0, 0, -1, -1, 0, 0, -3, + -1, 0, 0, -3, 0, 2, -1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 2, 3, 1, -1, 0, -4, + -2, 0, 4, -4, -4, -3, -3, 5, + 2, 1, -11, -1, 3, -1, 0, -1, + 1, -1, -4, 0, -1, 1, -2, -1, + -4, -1, 0, 0, 4, 3, 0, -4, + 0, -7, -2, 4, -2, -5, 0, -2, + -4, -4, -1, 5, 1, 0, -2, 0, + -3, 0, 1, 4, -3, -5, -5, -3, + 4, 0, 0, -9, -1, 1, -2, -1, + -3, 0, -3, -5, -2, -2, -1, 0, + 0, -3, -3, -1, 0, 4, 3, -1, + -7, 0, -7, -2, 0, -4, -7, 0, + -4, -2, -4, -4, 3, 0, 0, -2, + 0, -3, -1, 0, -1, -2, 0, 2, + -4, 1, 0, 0, -7, 0, -1, -3, + -2, -1, -4, -3, -4, -3, 0, -4, + -1, -3, -2, -4, -1, 0, 0, 0, + 6, -2, 0, -4, -1, 0, -1, -3, + -3, -3, -4, -5, -2, -3, 3, 0, + -2, 0, -6, -2, 1, 3, -4, -5, + -3, -4, 4, -1, 1, -12, -2, 3, + -3, -2, -5, 0, -4, -5, -2, -1, + -1, -1, -3, -4, 0, 0, 0, 4, + 4, -1, -8, 0, -8, -3, 3, -5, + -9, -3, -4, -5, -6, -4, 3, 0, + 0, 0, 0, -2, 0, 0, 1, -2, + 3, 1, -2, 3, 0, 0, -4, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, 0, -1, 0, 0, 0, + 0, 1, 4, 0, 0, -2, 0, 0, + 0, 0, -1, -1, -2, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, + -1, 0, 5, 0, 2, 0, 0, -2, + 0, 3, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -8, 0, -1, 2, 0, 4, + 0, 0, 13, 2, -3, -3, 1, 1, + -1, 0, -6, 0, 0, 6, -8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -9, 5, 18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, -2, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, -3, 0, + 0, 0, 0, 0, 1, 17, -3, -1, + 4, 3, -3, 1, 0, 0, 1, 1, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -17, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, -3, 0, 0, 0, 0, + -3, -1, 0, 0, 0, -3, 0, -2, + 0, -6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1, 0, 0, -2, 0, -2, 0, + -3, 0, 0, 0, -2, 1, -2, 0, + 0, -3, -1, -3, 0, 0, -3, 0, + -1, 0, -6, 0, -1, 0, 0, -10, + -2, -5, -1, -5, 0, 0, -9, 0, + -3, -1, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, -1, -2, 0, 0, + 0, 0, -3, 0, -3, 2, -1, 3, + 0, -1, -3, -1, -2, -2, 0, -2, + -1, -1, 1, -3, 0, 0, 0, 0, + -11, -1, -2, 0, -3, 0, -1, -6, + -1, 0, 0, -1, -1, 0, 0, 0, + 0, 1, 0, -1, -2, -1, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -3, 0, -1, 0, 0, 0, -3, + 1, 0, 0, 0, -3, -1, -3, 0, + 0, -4, 0, -1, 0, -6, 0, 0, + 0, 0, -12, 0, -3, -5, -6, 0, + 0, -9, 0, -1, -2, 0, 0, 0, + 0, 0, 0, 0, 0, -1, -2, -1, + -2, 0, 0, 0, 2, -2, 0, 4, + 6, -1, -1, -4, 2, 6, 2, 3, + -3, 2, 5, 2, 4, 3, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 6, -2, -1, 0, -1, + 10, 6, 10, 0, 0, 0, 1, 0, + 0, 5, 0, 0, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, -11, -2, -1, -5, + -6, 0, 0, -9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, -11, -2, -1, + -5, -6, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, 0, 0, 0, -3, 1, 0, -1, + 1, 2, 1, -4, 0, 0, -1, 1, + 0, 1, 0, 0, 0, 0, -3, 0, + -1, -1, -3, 0, -1, -5, 0, 8, + -1, 0, -3, -1, 0, -1, -2, 0, + -1, -4, -3, -2, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, -11, + -2, -1, -5, -6, 0, 0, -9, 0, + 0, 0, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, -4, -2, -1, 4, -1, -1, + -5, 0, -1, 0, -1, -3, 0, 3, + 0, 1, 0, 1, -3, -5, -2, 0, + -5, -2, -3, -5, -5, 0, -2, -3, + -2, -2, -1, -1, -2, -1, 0, -1, + 0, 2, 0, 2, -1, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -1, -1, -1, 0, 0, + -3, 0, -1, 0, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, -1, 0, -2, + 0, 0, 0, 0, -1, 0, 0, -2, + -1, 1, 0, -2, -2, -1, 0, -4, + -1, -3, -1, -2, 0, -2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -9, 0, 4, 0, 0, -2, 0, + 0, 0, 0, -2, 0, -1, 0, 0, + -1, 0, 0, -1, 0, -3, 0, 0, + 5, -2, -4, -4, 1, 1, 1, 0, + -4, 1, 2, 1, 4, 1, 4, -1, + -3, 0, 0, -5, 0, 0, -4, -3, + 0, 0, -3, 0, -2, -2, 0, -2, + 0, -2, 0, -1, 2, 0, -1, -4, + -1, 5, 0, 0, -1, 0, -3, 0, + 0, 2, -3, 0, 1, -1, 1, 0, + 0, -4, 0, -1, 0, 0, -1, 1, + -1, 0, 0, 0, -5, -2, -3, 0, + -4, 0, 0, -6, 0, 5, -1, 0, + -2, 0, 1, 0, -1, 0, -1, -4, + 0, -1, 1, 0, 0, 0, 0, -1, + 0, 0, 1, -2, 0, 0, 0, -2, + -1, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 3, 0, + 0, -1, 0, 0, 0, 0, 0, 0, + -1, -1, 0, 0, 0, 3, 0, 3, + 0, 0, 0, 0, 0, -8, -7, 0, + 6, 4, 2, -5, 1, 5, 0, 5, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserrat_8 = { +#else +lv_font_t lv_font_montserrat_8 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 10, /*The maximum line height required by the font*/ + .base_line = 2, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 0, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_8*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_simsun_16_cjk.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_simsun_16_cjk.c new file mode 100644 index 0000000..bcd7c14 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_simsun_16_cjk.c @@ -0,0 +1,23781 @@ +/******************************************************************************* + * Size: 16 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 16 --font SimSun.woff -r 0x20-0x7f --symbols (),盗æé™½å¸¯é¼»ç”»è¼•ッ冊ェル写父ããƒ•çµæƒ³æ­£å››O夫æºåº­å ´å¤©çºŒé³¥ã‚Œè¬›çŒ¿è‹¦éšŽçµ¦äº†è£½å®ˆ8ç¥å·±å¦³è–„泣塩帰ãºåƒå¤‰è¼ªé‚£ç€ä»å—¯çˆ­ç†±å‰µå‘³ä¿å­—å®¿æ¨æº–查é”肯ァ薬得査障該é™å¯Ÿã­ç¶²åŠ æ˜¼æ–™ç­‰å›³é‚ªç§‹ã‚³æ…‹å“屬久原殊候路願楽確é‡ä¸Šè¢«æ€•æ‚²é¢¨ä»½é‡æ­¡ã£é™„ã·æ—¢4黨價娘æœå‡åƒ…際洋止å³èˆªã‚ˆä¸“è§’æ‡‰é…¸å¸«å€‹æ¯”å‰‡éŸ¿å¥æ˜‡è±ç­†æ­·é©ä¿®æ“šç´°å¿™è·Ÿç®¡é•·ä»¤å®¶ã‚¶æœŸèˆ¬èŠ±è¶ŠãƒŸåŸŸæ³³é€šäº›æ²¹ä¹ãƒ©ã€‚ç‡Ÿã‚¹è¿”èª¿è¾²å«æ¨¹åˆŠæ„›é–“包知把ヤ貧橋拡普èžå‰ã‚¸å»ºå½“ç¹°ãƒé€ç¿’渇用補ィ覺體法éŠå®™ãƒ§é…”余利壊語ãã¤æ‰•皆時辺追奇ã們åªèƒ¸æ¢°å‹ä½å…¨æ²ˆåŠ›å…‰ã‚“æ·±æºäºŒé¡žåŒ—é¢ç¤¾å€¼è©¦9å’Œäº”å‹µã‚ƒè²¿å¹¾é€æ‰“課ゲã¦é ˜3é¼“è¾¦ç™ºè©•ï¼‘æ¸‰è©³æš‡è¾¼è®¡é§„ä¾›å˜›éƒµé ƒè…¦åæ§‹çµµãŠå®¹è¦å€Ÿèº«å¦»å›½æ…®å‰›æ€¥ä¹—é™å¿…è­°ç½®å…‹åœŸã‚ªä¹Žè·æ›´è‚‰é‚„æ··å¤æ¸¡æŽˆåˆä¸»é›¢æ¢å€¤æ±ºå­£æ™´æ±å¤§å°šå¤®å·žãŒå—Žé¨“æµå…ˆåŒ»äº¦æž—田星晩拿60旅婦é‡ç‚ºç—›ãƒ†å­«ã†ç’°å‹æ³çީ務其ã¼ã¡æºåä¸€è‚©è…°çŠ¯ã‚¿ã‚‡å¸Œå³æžœã¶ç‰©ç·´å¾…ã¿é«˜ä¹æ‰¾ã‚„ヶ都グ去ã€ã‚µã€æ°”仮雑酒許終ä¼ç¬‘éŒ²å½¢ãƒªéŠ€åˆ‡ã‚®å¿«å•æ»¿å½¹å˜é»„集森毎實研喜蘇å¸é‰›æ´²å·æ¡åª½ãƒŽæ‰å…©è©±è¨€é›–媒出客ã¥å»ç¾ç•°æ•…り誌逮åŒè¨Šå·²è¦–本題ãžã‚’横開音第席費æŒçœ¾æ€Žé¸å…ƒé€€é™ãƒ¼è³½å‡¦å–就残無ã„ã‚¬å¤šã‚±æ²’ç¾©é æ­Œéš£éŒ¢æŸé›ªæžå¬‰æŽ¡è‡ªé€ãå´å“¡äºˆã‚¼ç™½å©šç”µã¸é¡¯å‘€å§‹å‡ç•«ä¼¼æ‡¸æ ¼è»Šé¨’度ã‚親店週維億締慣å…å¸³é›»ç”šä¾†åœ’æµ´ã‚…æ„ˆäº¬ã¨æ¯å„æµ·æ€’ãœæŽ’æ•—æŒ™è€è²·7極模実紀ヒæºéš»å‘Šã‚·ä¸¦å±‹é€™å­©è®“è³ªãƒ¯ãƒ–å¯Œè³ƒäº‰åº·ç”±è¾žãƒžç«æ–¼çŸ­æ¨£å‰Šå¼Ÿææ³¨ç¯€å¦å®¤ãƒ€æ‹›æ“ãƒè‹¥å¥—åº•æ³¢è¡Œå‹¤é—œè‘—æ³ŠèƒŒç–²ç‹­ä½œå¿µæŽ¨ãæ°‘貸祖介說ビ代温契你我レ入æè®Šå†æœ­ã‚½æ´¾é ­æ™ºé…ç§è½èˆ‰ç£å±±ä¼¸æ”¾ç›´å®‰ãƒˆèª•煙付符幅ãµçµ¡å¥¹å±Šè€³é£²å¿˜å‚é©åœ˜ä»•æ§˜è¼‰ã©æ­©ç²å«Œæ¯ã®æ±šäº¤èˆˆé­šæŒ‡è³‡é›™èˆ‡é¤¨åˆå­¦å¹´å¹¸å²ä½æŸ±æ—走括ã³è€ƒé’也共腕Lã§è²©æ“”ç†ç—…イ今逃當寺猫邊è“係ム秘示解池影ド文例斷曾事茶寫明科桃è—売便ãˆå°Žç¦è²¡é£›æ›¿è€Œäº¡åˆ°ã—具空å¯è¾›æ¥­ã‚¦åºœã‚»åœ‹ä½•基èœåŽ³å¸‚åŠªå¼µç¼ºé›²æ ¹å¤–ã æ–­ä¸‡ç ‚ゴ超使å°å®žã½ç¤¼æœ€æ…§ç®—軟界段律åƒå¤•ä¸ˆçª“åŠ©åˆ»æœˆå¤æ”¿å‘¼ã´ã–擇趣除動従涼方勉åç·šå¯¾å­˜è«‹å­æ°å°‡5å°‘å¦è«¸è«–美感或西者定食御表ã¯åƒæ­³ç·‘命進易性錯房もæ•皿判中觀戦ニ緩町ピ番ãšé‡‘åƒã‚?ä¸ãŸè±¡æ²»é–¢ãƒ£æ¯çœ‹å¾’å’çµ±ã˜æ‰‹ç¯„訪押座步å·ãƒ™æ—以æ¯ã™ã»å¯†æ¸›æˆå¾€æ­²ä»¶ç·’読歯效院ç§ä¸ƒè¬‚凿¿ƒåµŒéœ‡å–‰ç¹¼ã‚¯ãƒ¥æ‹­æ­»å††2ç©æ°´æ¬²å¦‚ãƒã«ã•寒é“å€ç²¾å•¦å§ã‚¢è¯èƒ½è¶³åŠåœæ€å£“ï¼’æ˜¥ä¸”ãƒ¡è£æ ªå®˜ç­”æ¦‚é»’éŽæ°·æŸ¿æˆ»åŽšã±å…šç¥­ç¹”引計ã‘委暗複誘港ãƒå¤±ä¸‹æ‘較続神ã‡å°¤å¼·ç§€è†å…’æ¥ç¸¾å書済化æœç ´æ–°å» 1紹您情åŠå¼ç”¢ç³»å¥½æ•™æš‘æ—©ã‚æ¨‚地休å”良ãªå“ªå¸¸è¦æ®å‘¨ã‹ã‚¨éº—境åƒé¿è­·ãƒ³ãƒ„é¦™å¤œå¤ªè¦‹è¨­éžæ”¹åºƒè²ä»–æ¤œæ±‚å±æ¸…å½¼ç¶“æœªåœ¨èµ·è‘‰æŽ§é´æ‰€å·®å…§é€ å¯„å—æœ›å°ºæ›å‘展備眠點完約ãŽè£¡åˆ†èª¬ç”³ç«¥å„ªä¼å³¶æœºé ˆå¡Šæ—¥ç«‹æ‹‰,鉄軽單気信很転識支布数紙此迎å—心輸åŠãƒ¢è™•「訳三曇兄野顔戰增ナ伊列åˆé«ªä¸¡æœ‰å–å·¦æ¯›è‡³å›°å§æ˜”èµ¤ç‹€ç›¸å¤ æ•´åˆ¥å£«çµŒé ¼ç„¶ç°¡ãƒ›ä¼šç™¼éš¨å–¶éœ€è„±ãƒ¨ã°æŽ¥æ°¸å±…å†¬è¿«åœç”˜é†«èª°éƒ¨å……æ¶ˆé€£å¼±å®‡æœƒå’²è¦šå§‰éº¼çš„å¢—é¦–ç»Ÿå¸¶ç³–æœ‹è¡“å•†æ‹…ç§»æ™¯åŠŸè‚²åº«æ›²ç¸½åŠƒç‰›ç¨‹é§…çŠ¬å ±ãƒ­å­¸è²¬å› ãƒ‘åš´å…«ä¸–å¾Œå¹³è² å…¬ã’æ›œé™¸å°ˆåˆä¹‹é–‰ã¬è«‡ã”ç½æ˜¨å†·è·æ‚ªè¬å°å®ƒè¿‘å°„æ•¢æ„é‹èˆ¹è‡‰å±€é›£ä»€ç”£é —!çƒçœŸè¨˜ã¾ä½†è”µç©¶åˆ¶æ©Ÿæ¡ˆæ¹–臺ã²å®³åˆ¸ç”·ç•™å†…æœ¨é©—é›¨æ–½ç¨®ç‰¹å¾©å¥æœ«æ¿Ÿã‚­è‰²è¨´ä¾ã›ç™¾åž‹ã‚‹çŸ³ç‰ è¨Žå‘¢æ—¶ä»»åŸ·é£¯æ­å®…組傳é…å°æ´»ã‚†ã¹æš–ズ漸站素らボæŸä¾¡ãƒæµ…回女片独妹英目從èªç”Ÿé•ç­–åƒ•æ¥šãƒšç±³ã“æŽ›ã‚€çˆ¸å…­çŠ¶è½æ¼¢ãƒ—投カ校åšå•Šæ´—声探ã‚割体項履触々訓技ãƒä½Žå·¥æ˜ æ˜¯æ¨™é€Ÿå–„ç‚¹äººãƒ‡å£æ¬¡å¯ --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_simsun_16_cjk.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_SIMSUN_16_CJK + #define LV_FONT_SIMSUN_16_CJK 1 +#endif + +#if LV_FONT_SIMSUN_16_CJK + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x97, 0xb9, 0xa8, 0x97, 0x75, 0x64, 0x53, 0x53, + 0x0, 0x0, 0xa8, 0xb9, + + /* U+0022 "\"" */ + 0x2, 0xe1, 0x98, 0xa, 0xc3, 0xf4, 0x2c, 0xa, + 0x60, 0x81, 0x27, 0x0, 0x0, 0x0, 0x0, + + /* U+0023 "#" */ + 0x0, 0x90, 0x3, 0x50, 0x0, 0x90, 0x4, 0x40, + 0x0, 0x90, 0x6, 0x40, 0x7f, 0xff, 0xff, 0xf6, + 0x13, 0xa3, 0x39, 0x41, 0x0, 0x80, 0x8, 0x0, + 0x1, 0x70, 0x9, 0x0, 0x3, 0x70, 0x9, 0x0, + 0x7f, 0xff, 0xff, 0xf6, 0x17, 0x73, 0x3a, 0x31, + 0x5, 0x30, 0x9, 0x0, 0x6, 0x20, 0x9, 0x0, + + /* U+0024 "$" */ + 0x0, 0x45, 0x0, 0x6, 0xaa, 0x80, 0x48, 0x45, + 0x86, 0x95, 0x45, 0xc7, 0x7b, 0x45, 0x20, 0x1e, + 0xc5, 0x0, 0x2, 0xec, 0x0, 0x0, 0x4f, 0xb0, + 0x0, 0x45, 0xd5, 0x52, 0x45, 0x6a, 0xe7, 0x45, + 0x49, 0xa4, 0x45, 0x74, 0x18, 0x9a, 0x60, 0x0, + 0x45, 0x0, 0x0, 0x45, 0x0, + + /* U+0025 "%" */ + 0x19, 0x80, 0x3, 0x20, 0x82, 0x64, 0x8, 0x0, + 0xb0, 0x47, 0x7, 0x0, 0xc0, 0x48, 0x61, 0x0, + 0xb0, 0x47, 0x70, 0x0, 0x73, 0x76, 0x50, 0x0, + 0x7, 0x67, 0x7, 0x60, 0x0, 0x7, 0x64, 0x64, + 0x0, 0x42, 0xa1, 0x38, 0x0, 0x70, 0xb1, 0x39, + 0x1, 0x50, 0x82, 0x47, 0x5, 0x0, 0x19, 0x91, + + /* U+0026 "&" */ + 0x0, 0x88, 0x50, 0x0, 0x6, 0x40, 0xc0, 0x0, + 0x9, 0x30, 0xd0, 0x0, 0x8, 0x53, 0x90, 0x0, + 0x6, 0x99, 0x10, 0x0, 0x5, 0xf0, 0x2a, 0x80, + 0x18, 0xd4, 0x9, 0x10, 0x84, 0x6a, 0x8, 0x0, + 0xc2, 0xe, 0x38, 0x0, 0xb3, 0x6, 0xe5, 0x0, + 0x6a, 0x0, 0xe9, 0x5, 0x9, 0xc9, 0x2b, 0xc3, + + /* U+0027 "'" */ + 0xb, 0xb0, 0x7, 0xf0, 0x0, 0xc0, 0x8, 0x30, + 0x1, 0x0, + + /* U+0028 "(" */ + 0x0, 0x6, 0x10, 0x4, 0x60, 0x0, 0xb0, 0x0, + 0x84, 0x0, 0xd, 0x0, 0x4, 0xa0, 0x0, 0x67, + 0x0, 0x8, 0x60, 0x0, 0x77, 0x0, 0x6, 0x80, + 0x0, 0x2c, 0x0, 0x0, 0xc1, 0x0, 0x5, 0x70, + 0x0, 0xa, 0x10, 0x0, 0x19, 0x0, 0x0, 0x21, + + /* U+0029 ")" */ + 0x16, 0x0, 0x0, 0x74, 0x0, 0x0, 0xb0, 0x0, + 0x5, 0x70, 0x0, 0xd, 0x0, 0x0, 0xb3, 0x0, + 0x8, 0x50, 0x0, 0x77, 0x0, 0x8, 0x60, 0x0, + 0x95, 0x0, 0xc, 0x10, 0x1, 0xb0, 0x0, 0x84, + 0x0, 0x29, 0x0, 0x9, 0x0, 0x1, 0x10, 0x0, + + /* U+002A "*" */ + 0x0, 0x7, 0x80, 0x0, 0x0, 0x8, 0x80, 0x0, + 0x5d, 0x26, 0x52, 0xd4, 0x18, 0xd6, 0x6d, 0x80, + 0x0, 0x1b, 0xa1, 0x0, 0x8, 0xd6, 0x6d, 0x80, + 0x5d, 0x27, 0x52, 0xd4, 0x0, 0x9, 0x70, 0x0, + 0x0, 0x9, 0x70, 0x0, + + /* U+002B "+" */ + 0x0, 0x2, 0x40, 0x0, 0x0, 0x3, 0x60, 0x0, + 0x0, 0x3, 0x60, 0x0, 0x0, 0x3, 0x60, 0x0, + 0x39, 0x9a, 0xc9, 0x94, 0x0, 0x3, 0x60, 0x0, + 0x0, 0x3, 0x60, 0x0, 0x0, 0x3, 0x60, 0x0, + 0x0, 0x2, 0x40, 0x0, + + /* U+002C "," */ + 0xb, 0xb0, 0x7, 0xf0, 0x0, 0xc0, 0x8, 0x40, + 0x2, 0x0, + + /* U+002D "-" */ + 0x49, 0x99, 0x99, 0x94, + + /* U+002E "." */ + 0x0, 0xcb, 0xbb, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x71, + 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x5, 0x20, + 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x44, 0x0, + 0x0, 0x0, 0x80, 0x0, 0x0, 0x2, 0x60, 0x0, + 0x0, 0x8, 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, + 0x0, 0x71, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, + 0x5, 0x30, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, + 0x35, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x6a, 0x95, 0x0, 0x3, 0xc0, 0xb, 0x30, + 0xb, 0x60, 0x6, 0xa0, 0xf, 0x20, 0x2, 0xf0, + 0x2f, 0x0, 0x1, 0xf1, 0x3f, 0x0, 0x0, 0xf2, + 0x3f, 0x0, 0x0, 0xf2, 0x2f, 0x0, 0x1, 0xf1, + 0xf, 0x20, 0x2, 0xe0, 0xb, 0x50, 0x6, 0xa0, + 0x3, 0xc0, 0xb, 0x30, 0x0, 0x6a, 0x95, 0x0, + + /* U+0031 "1" */ + 0x0, 0x17, 0x0, 0x16, 0xd9, 0x0, 0x0, 0x79, + 0x0, 0x0, 0x79, 0x0, 0x0, 0x79, 0x0, 0x0, + 0x79, 0x0, 0x0, 0x79, 0x0, 0x0, 0x79, 0x0, + 0x0, 0x79, 0x0, 0x0, 0x79, 0x0, 0x0, 0x79, + 0x0, 0x16, 0xde, 0x72, + + /* U+0032 "2" */ + 0x0, 0x77, 0x89, 0x0, 0x92, 0x0, 0x88, 0xe, + 0x20, 0x4, 0xc0, 0xd5, 0x0, 0x3c, 0x0, 0x0, + 0x8, 0x80, 0x0, 0x1, 0xd1, 0x0, 0x0, 0x93, + 0x0, 0x0, 0x74, 0x0, 0x0, 0x55, 0x0, 0x0, + 0x28, 0x0, 0x6, 0x9, 0x0, 0x1, 0xa2, 0xff, + 0xff, 0xfb, + + /* U+0033 "3" */ + 0x1, 0x77, 0xa5, 0x0, 0xa2, 0x0, 0xd3, 0xd, + 0x40, 0x8, 0x80, 0x10, 0x0, 0x96, 0x0, 0x0, + 0x2c, 0x10, 0x0, 0x8d, 0x20, 0x0, 0x0, 0xb, + 0x30, 0x0, 0x0, 0x4c, 0x3, 0x0, 0x2, 0xf0, + 0xf4, 0x0, 0x3d, 0xd, 0x30, 0x9, 0x60, 0x28, + 0x78, 0x70, + + /* U+0034 "4" */ + 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, 0xac, 0x0, + 0x0, 0x3, 0x8c, 0x0, 0x0, 0x8, 0x4c, 0x0, + 0x0, 0x53, 0x4c, 0x0, 0x0, 0x80, 0x4c, 0x0, + 0x6, 0x20, 0x4c, 0x0, 0x7, 0x0, 0x4c, 0x0, + 0x47, 0x66, 0x8d, 0x62, 0x0, 0x0, 0x4c, 0x0, + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x5, 0xaf, 0x71, + + /* U+0035 "5" */ + 0x5, 0xff, 0xff, 0xb0, 0x61, 0x0, 0x0, 0x7, + 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0x7, 0x5a, + 0xca, 0x0, 0x85, 0x0, 0xa7, 0x1, 0x0, 0x3, + 0xd0, 0x0, 0x0, 0x1f, 0x7, 0x20, 0x1, 0xe0, + 0xf4, 0x0, 0x3c, 0xb, 0x10, 0x9, 0x50, 0x17, + 0x79, 0x80, + + /* U+0036 "6" */ + 0x0, 0x28, 0x7b, 0x20, 0x1, 0xa0, 0xa, 0x80, + 0x9, 0x40, 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, + 0x1f, 0x2a, 0xbb, 0x10, 0x3f, 0x90, 0x7, 0xa0, + 0x3f, 0x20, 0x0, 0xf0, 0x3f, 0x0, 0x0, 0xe2, + 0x1f, 0x10, 0x0, 0xe2, 0xd, 0x40, 0x0, 0xe0, + 0x6, 0xb0, 0x4, 0x90, 0x0, 0x79, 0x88, 0x0, + + /* U+0037 "7" */ + 0xaf, 0xff, 0xff, 0xb, 0x30, 0x1, 0x80, 0x60, + 0x0, 0x71, 0x0, 0x0, 0x8, 0x0, 0x0, 0x7, + 0x30, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x49, 0x0, + 0x0, 0x9, 0x50, 0x0, 0x0, 0xd3, 0x0, 0x0, + 0xf, 0x30, 0x0, 0x2, 0xf3, 0x0, 0x0, 0x1e, + 0x20, 0x0, + + /* U+0038 "8" */ + 0x1, 0x87, 0x78, 0x0, 0xa, 0x20, 0x4, 0x80, + 0xd, 0x0, 0x0, 0xd0, 0xe, 0x20, 0x0, 0xc0, + 0x7, 0xd3, 0x7, 0x50, 0x0, 0x9f, 0xc6, 0x0, + 0x5, 0x72, 0xbe, 0x10, 0xc, 0x0, 0x9, 0xb0, + 0x39, 0x0, 0x0, 0xf0, 0x3a, 0x0, 0x0, 0xe0, + 0xb, 0x10, 0x3, 0x90, 0x1, 0x87, 0x78, 0x0, + + /* U+0039 "9" */ + 0x1, 0x98, 0x86, 0x0, 0xa, 0x40, 0x9, 0x40, + 0x1e, 0x0, 0x4, 0xb0, 0x3c, 0x0, 0x2, 0xf0, + 0x4c, 0x0, 0x1, 0xf1, 0x2e, 0x0, 0x6, 0xf1, + 0xc, 0x70, 0x29, 0xf1, 0x1, 0x99, 0x73, 0xf0, + 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, 0x9, 0x50, + 0xa, 0x80, 0x1c, 0x0, 0x4, 0xb7, 0x91, 0x0, + + /* U+003A ":" */ + 0xc8, 0xb7, 0x0, 0x0, 0x0, 0x0, 0xb7, 0xc8, + + /* U+003B ";" */ + 0xda, 0x64, 0x0, 0x0, 0x0, 0x0, 0x65, 0xda, + 0x56, 0x90, + + /* U+003C "<" */ + 0x0, 0x0, 0x1, 0x0, 0x0, 0x38, 0x0, 0x2, + 0x90, 0x0, 0x19, 0x0, 0x1, 0xa0, 0x0, 0xa, + 0x10, 0x0, 0xa1, 0x0, 0x0, 0x56, 0x0, 0x0, + 0x6, 0x50, 0x0, 0x0, 0x74, 0x0, 0x0, 0x8, + 0x30, 0x0, 0x0, 0x92, 0x0, 0x0, 0x6, + + /* U+003D "=" */ + 0x49, 0x99, 0x99, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x49, 0x99, 0x99, 0x94, + + /* U+003E ">" */ + 0x10, 0x0, 0x0, 0x83, 0x0, 0x0, 0x9, 0x20, + 0x0, 0x0, 0x91, 0x0, 0x0, 0xa, 0x10, 0x0, + 0x1, 0xa0, 0x0, 0x0, 0x1a, 0x0, 0x0, 0x65, + 0x0, 0x5, 0x60, 0x0, 0x47, 0x0, 0x3, 0x80, + 0x0, 0x29, 0x0, 0x0, 0x60, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x79, 0xa9, 0x10, 0x8, 0x10, 0x5, 0xb0, + 0x1a, 0x0, 0x0, 0xf1, 0x2f, 0x40, 0x0, 0xf1, + 0x5, 0x10, 0x5, 0xe0, 0x0, 0x0, 0x5d, 0x20, + 0x0, 0x3, 0xa0, 0x0, 0x0, 0x6, 0x10, 0x0, + 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x70, 0x0, 0x0, 0xc, 0x80, 0x0, + + /* U+0040 "@" */ + 0x0, 0x38, 0x78, 0x10, 0x2, 0x90, 0x0, 0x90, + 0xa, 0x10, 0x79, 0x64, 0x1b, 0x8, 0x2b, 0x27, + 0x49, 0xa, 0xc, 0x9, 0x58, 0x57, 0xc, 0x8, + 0x58, 0x84, 0xb, 0x8, 0x39, 0x93, 0x39, 0x25, + 0x1b, 0x73, 0x78, 0x70, 0xa, 0x29, 0x3a, 0x41, + 0x3, 0x80, 0x0, 0x72, 0x0, 0x59, 0x88, 0x30, + + /* U+0041 "A" */ + 0x0, 0x5, 0x50, 0x0, 0x0, 0xc, 0xa0, 0x0, + 0x0, 0x8, 0xe0, 0x0, 0x0, 0x44, 0xd1, 0x0, + 0x0, 0x70, 0x95, 0x0, 0x0, 0x80, 0x68, 0x0, + 0x0, 0x80, 0x2c, 0x0, 0x3, 0x96, 0x6f, 0x0, + 0x7, 0x10, 0xc, 0x30, 0x8, 0x0, 0x8, 0x70, + 0x9, 0x0, 0x5, 0xa0, 0x8d, 0x20, 0x9, 0xf5, + + /* U+0042 "B" */ + 0x4e, 0xa6, 0x8a, 0x20, 0xb, 0x50, 0x6, 0xb0, + 0xb, 0x50, 0x2, 0xe0, 0xb, 0x50, 0x3, 0xd0, + 0xb, 0x50, 0xa, 0x50, 0xb, 0x96, 0xb7, 0x0, + 0xb, 0x50, 0x7, 0x90, 0xb, 0x50, 0x0, 0xe2, + 0xb, 0x50, 0x0, 0xc6, 0xb, 0x50, 0x0, 0xd5, + 0xb, 0x50, 0x3, 0xe1, 0x5e, 0xa6, 0x7a, 0x30, + + /* U+0043 "C" */ + 0x0, 0x49, 0x7c, 0xf0, 0x3, 0xb0, 0x0, 0xb2, + 0xc, 0x40, 0x0, 0x25, 0x2f, 0x0, 0x0, 0x0, + 0x6c, 0x0, 0x0, 0x0, 0x7b, 0x0, 0x0, 0x0, + 0x7b, 0x0, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x2, 0xf, 0x20, 0x0, 0x42, + 0x7, 0xa0, 0x1, 0x70, 0x0, 0x7b, 0x98, 0x0, + + /* U+0044 "D" */ + 0x4e, 0xb6, 0x84, 0x0, 0xb, 0x50, 0xa, 0x50, + 0xb, 0x50, 0x3, 0xe0, 0xb, 0x50, 0x0, 0xe3, + 0xb, 0x50, 0x0, 0xd5, 0xb, 0x50, 0x0, 0xc6, + 0xb, 0x50, 0x0, 0xc6, 0xb, 0x50, 0x0, 0xd5, + 0xb, 0x50, 0x0, 0xf2, 0xb, 0x50, 0x3, 0xd0, + 0xb, 0x50, 0xb, 0x40, 0x4e, 0xb6, 0x94, 0x0, + + /* U+0045 "E" */ + 0x3d, 0xb6, 0x6b, 0xc0, 0xa, 0x60, 0x0, 0xb0, + 0xa, 0x60, 0x0, 0x22, 0xa, 0x60, 0x0, 0x0, + 0xa, 0x60, 0x6, 0x0, 0xa, 0xa6, 0x8b, 0x0, + 0xa, 0x60, 0x9, 0x0, 0xa, 0x60, 0x6, 0x0, + 0xa, 0x60, 0x0, 0x0, 0xa, 0x60, 0x0, 0x3, + 0xa, 0x60, 0x0, 0x63, 0x3d, 0xb6, 0x69, 0xe0, + + /* U+0046 "F" */ + 0x3d, 0xb6, 0x69, 0xf1, 0xa, 0x60, 0x0, 0x65, + 0xa, 0x60, 0x0, 0x5, 0xa, 0x60, 0x0, 0x0, + 0xa, 0x60, 0x6, 0x0, 0xa, 0xa6, 0x7e, 0x0, + 0xa, 0x60, 0x9, 0x0, 0xa, 0x60, 0x5, 0x0, + 0xa, 0x60, 0x0, 0x0, 0xa, 0x60, 0x0, 0x0, + 0xa, 0x60, 0x0, 0x0, 0x4d, 0xb2, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x68, 0x9f, 0x50, 0x4, 0x90, 0x4, 0x80, + 0xd, 0x10, 0x0, 0x70, 0x3c, 0x0, 0x0, 0x0, + 0x6a, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, 0x0, + 0x89, 0x0, 0x29, 0xb4, 0x6a, 0x0, 0x5, 0xb0, + 0x4d, 0x0, 0x5, 0xb0, 0xe, 0x10, 0x5, 0xb0, + 0x7, 0x80, 0x6, 0xb0, 0x0, 0x88, 0x77, 0x20, + + /* U+0048 "H" */ + 0x4f, 0x80, 0x9, 0xf4, 0xe, 0x20, 0x3, 0xd0, + 0xe, 0x20, 0x3, 0xd0, 0xe, 0x20, 0x3, 0xd0, + 0xe, 0x20, 0x3, 0xd0, 0xe, 0x76, 0x68, 0xd0, + 0xe, 0x20, 0x3, 0xd0, 0xe, 0x20, 0x3, 0xd0, + 0xe, 0x20, 0x3, 0xd0, 0xe, 0x20, 0x3, 0xd0, + 0xe, 0x20, 0x3, 0xd0, 0x5f, 0x90, 0x9, 0xf4, + + /* U+0049 "I" */ + 0x36, 0xcc, 0x63, 0x0, 0x88, 0x0, 0x0, 0x88, + 0x0, 0x0, 0x88, 0x0, 0x0, 0x88, 0x0, 0x0, + 0x88, 0x0, 0x0, 0x88, 0x0, 0x0, 0x88, 0x0, + 0x0, 0x88, 0x0, 0x0, 0x88, 0x0, 0x0, 0x88, + 0x0, 0x36, 0xcc, 0x63, + + /* U+004A "J" */ + 0x0, 0x36, 0xbd, 0x64, 0x0, 0x0, 0x79, 0x0, + 0x0, 0x0, 0x79, 0x0, 0x0, 0x0, 0x79, 0x0, + 0x0, 0x0, 0x79, 0x0, 0x0, 0x0, 0x79, 0x0, + 0x0, 0x0, 0x79, 0x0, 0x0, 0x0, 0x79, 0x0, + 0x0, 0x0, 0x79, 0x0, 0x0, 0x0, 0x79, 0x0, + 0x0, 0x0, 0x78, 0x0, 0x1, 0x0, 0x87, 0x0, + 0x5d, 0x0, 0xb2, 0x0, 0x1b, 0x77, 0x40, 0x0, + + /* U+004B "K" */ + 0x4e, 0xa1, 0x2c, 0xb2, 0xb, 0x50, 0x9, 0x0, + 0xb, 0x50, 0x62, 0x0, 0xb, 0x51, 0x60, 0x0, + 0xb, 0x5a, 0x10, 0x0, 0xb, 0x9d, 0x60, 0x0, + 0xb, 0xa3, 0xd0, 0x0, 0xb, 0x50, 0xd3, 0x0, + 0xb, 0x50, 0x6a, 0x0, 0xb, 0x50, 0xe, 0x10, + 0xb, 0x50, 0x9, 0x70, 0x4e, 0xa1, 0xa, 0xf5, + + /* U+004C "L" */ + 0x2c, 0xc3, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, + 0x8, 0x80, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, + 0x8, 0x80, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, + 0x8, 0x80, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, + 0x8, 0x80, 0x0, 0x0, 0x8, 0x80, 0x0, 0x4, + 0x8, 0x80, 0x0, 0x63, 0x3c, 0xc6, 0x69, 0xf0, + + /* U+004D "M" */ + 0x7f, 0x0, 0x4, 0xf6, 0x1f, 0x30, 0x7, 0xf0, + 0x1c, 0x60, 0x6, 0xf0, 0x19, 0x90, 0x6, 0xf0, + 0x16, 0xc0, 0x14, 0xf0, 0x15, 0xd0, 0x51, 0xf0, + 0x15, 0xb3, 0x60, 0xf0, 0x15, 0x86, 0x60, 0xf0, + 0x15, 0x49, 0x60, 0xf0, 0x15, 0x1e, 0x40, 0xf0, + 0x15, 0xe, 0x10, 0xf0, 0x7a, 0x9, 0x6, 0xf6, + + /* U+004E "N" */ + 0x5f, 0x40, 0x4, 0xc6, 0xb, 0xc0, 0x0, 0x60, + 0x6, 0xd3, 0x0, 0x60, 0x6, 0x6a, 0x0, 0x60, + 0x6, 0xe, 0x20, 0x60, 0x6, 0x8, 0x90, 0x60, + 0x6, 0x1, 0xe1, 0x60, 0x6, 0x0, 0x98, 0x60, + 0x6, 0x0, 0x2e, 0x60, 0x6, 0x0, 0xb, 0xc0, + 0x6, 0x0, 0x3, 0xd0, 0x6c, 0x40, 0x0, 0x90, + + /* U+004F "O" */ + 0x0, 0x68, 0x87, 0x0, 0x5, 0x90, 0x6, 0x70, + 0xd, 0x20, 0x0, 0xe0, 0x2e, 0x0, 0x0, 0xd3, + 0x5c, 0x0, 0x0, 0xb6, 0x6c, 0x0, 0x0, 0xa8, + 0x6c, 0x0, 0x0, 0xa8, 0x5c, 0x0, 0x0, 0xa7, + 0x2e, 0x0, 0x0, 0xc4, 0xd, 0x20, 0x0, 0xe0, + 0x4, 0x80, 0x5, 0x70, 0x0, 0x57, 0x77, 0x0, + + /* U+0050 "P" */ + 0x3d, 0xb6, 0x79, 0x20, 0xa, 0x60, 0x1, 0xd0, + 0xa, 0x60, 0x0, 0xc4, 0xa, 0x60, 0x0, 0xb5, + 0xa, 0x60, 0x0, 0xd2, 0xa, 0x60, 0x6, 0xa0, + 0xa, 0xa6, 0x76, 0x0, 0xa, 0x60, 0x0, 0x0, + 0xa, 0x60, 0x0, 0x0, 0xa, 0x60, 0x0, 0x0, + 0xa, 0x60, 0x0, 0x0, 0x4d, 0xb2, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x88, 0x87, 0x0, 0x7, 0x80, 0x6, 0x60, + 0xe, 0x10, 0x0, 0xe0, 0x3d, 0x0, 0x0, 0xd3, + 0x6b, 0x0, 0x0, 0xb6, 0x7b, 0x0, 0x0, 0xb7, + 0x7b, 0x0, 0x0, 0xb7, 0x6b, 0x0, 0x0, 0xb6, + 0x4d, 0x5b, 0x60, 0xd4, 0xf, 0x90, 0xd1, 0xe0, + 0x7, 0x90, 0x9c, 0x80, 0x0, 0x78, 0xbe, 0x0, + 0x0, 0x0, 0xd, 0xe1, 0x0, 0x0, 0x0, 0x0, + + /* U+0052 "R" */ + 0x3c, 0xb6, 0x7a, 0x20, 0x9, 0x70, 0x5, 0xc0, + 0x9, 0x70, 0x0, 0xf0, 0x9, 0x70, 0x1, 0xf0, + 0x9, 0x70, 0x8, 0x80, 0x9, 0xa6, 0xc5, 0x0, + 0x9, 0x70, 0xd1, 0x0, 0x9, 0x70, 0x87, 0x0, + 0x9, 0x70, 0x3c, 0x0, 0x9, 0x70, 0xe, 0x20, + 0x9, 0x70, 0x8, 0x70, 0x3c, 0xc2, 0x3, 0xe4, + + /* U+0053 "S" */ + 0x1, 0x77, 0x9f, 0x70, 0xa, 0x0, 0x5, 0x90, + 0x1a, 0x0, 0x0, 0x40, 0x1c, 0x0, 0x0, 0x0, + 0xb, 0xb2, 0x0, 0x0, 0x0, 0x9f, 0x91, 0x0, + 0x0, 0x2, 0xae, 0x20, 0x0, 0x0, 0x7, 0xb0, + 0x0, 0x0, 0x0, 0xe0, 0x35, 0x0, 0x0, 0xd0, + 0xd, 0x10, 0x3, 0x90, 0xe, 0xe8, 0x78, 0x0, + + /* U+0054 "T" */ + 0x1e, 0x8c, 0xb8, 0xe0, 0x54, 0x9, 0x70, 0x53, + 0x40, 0x9, 0x70, 0x3, 0x0, 0x9, 0x70, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x9, 0x70, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x9, 0x70, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x9, 0x70, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x4c, 0xb3, 0x0, + + /* U+0055 "U" */ + 0x5f, 0x90, 0x4, 0xc4, 0xe, 0x20, 0x0, 0x60, + 0xe, 0x20, 0x0, 0x60, 0xe, 0x20, 0x0, 0x60, + 0xe, 0x20, 0x0, 0x60, 0xe, 0x20, 0x0, 0x60, + 0xe, 0x20, 0x0, 0x60, 0xe, 0x20, 0x0, 0x60, + 0xe, 0x20, 0x0, 0x60, 0xc, 0x20, 0x0, 0x50, + 0x8, 0x60, 0x3, 0x40, 0x0, 0x98, 0x86, 0x0, + + /* U+0056 "V" */ + 0x5f, 0x90, 0x5, 0xe4, 0xb, 0x50, 0x0, 0x70, + 0x8, 0x80, 0x4, 0x30, 0x4, 0xb0, 0x7, 0x0, + 0x1, 0xf0, 0x7, 0x0, 0x0, 0xd2, 0x7, 0x0, + 0x0, 0xa6, 0x34, 0x0, 0x0, 0x69, 0x60, 0x0, + 0x0, 0x3c, 0x70, 0x0, 0x0, 0xf, 0x70, 0x0, + 0x0, 0xc, 0x40, 0x0, 0x0, 0x8, 0x10, 0x0, + + /* U+0057 "W" */ + 0x8d, 0x2b, 0xc0, 0xa8, 0x2b, 0x5, 0x90, 0x50, + 0xd, 0x3, 0xb0, 0x60, 0xd, 0x4, 0xd0, 0x60, + 0xc, 0x17, 0xe0, 0x60, 0xa, 0x37, 0xd1, 0x60, + 0x8, 0x57, 0xa5, 0x40, 0x5, 0x86, 0x89, 0x20, + 0x3, 0xd3, 0x6d, 0x0, 0x1, 0xf1, 0x4d, 0x0, + 0x0, 0xd0, 0x2a, 0x0, 0x0, 0x80, 0x7, 0x0, + + /* U+0058 "X" */ + 0x2c, 0xc1, 0x9, 0xb2, 0x4, 0xb0, 0x6, 0x10, + 0x0, 0xd2, 0x7, 0x0, 0x0, 0x78, 0x43, 0x0, + 0x0, 0x1d, 0x80, 0x0, 0x0, 0xa, 0x70, 0x0, + 0x0, 0x8, 0xc0, 0x0, 0x0, 0x8, 0xd2, 0x0, + 0x0, 0x62, 0x79, 0x0, 0x0, 0x80, 0x1e, 0x0, + 0x3, 0x50, 0xa, 0x60, 0x3d, 0x70, 0xb, 0xe4, + + /* U+0059 "Y" */ + 0x4f, 0xa0, 0x7, 0xe4, 0x9, 0x70, 0x2, 0x50, + 0x3, 0xc0, 0x6, 0x0, 0x0, 0xe1, 0x7, 0x0, + 0x0, 0x86, 0x24, 0x0, 0x0, 0x3c, 0x60, 0x0, + 0x0, 0xd, 0x70, 0x0, 0x0, 0x9, 0x70, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x9, 0x70, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x4c, 0xb3, 0x0, + + /* U+005A "Z" */ + 0x8, 0xd7, 0x67, 0xf1, 0xb, 0x10, 0x7, 0x90, + 0x3, 0x0, 0xe, 0x20, 0x0, 0x0, 0x6a, 0x0, + 0x0, 0x0, 0xd2, 0x0, 0x0, 0x5, 0xb0, 0x0, + 0x0, 0xd, 0x30, 0x0, 0x0, 0x4c, 0x0, 0x0, + 0x0, 0xc4, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x31, + 0xb, 0x50, 0x0, 0xa0, 0x3f, 0x66, 0x6b, 0xb0, + + /* U+005B "[" */ + 0xa9, 0x98, 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, + 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, + 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, + 0xa0, 0x0, 0xa0, 0x0, 0xa9, 0x98, + + /* U+005C "\\" */ + 0xa1, 0x0, 0x0, 0x4, 0x70, 0x0, 0x0, 0xb, + 0x0, 0x0, 0x0, 0x83, 0x0, 0x0, 0x2, 0x90, + 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x65, 0x0, + 0x0, 0x1, 0xa0, 0x0, 0x0, 0xa, 0x10, 0x0, + 0x0, 0x56, 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, + 0x9, 0x20, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, + 0xb0, 0x0, 0x0, 0x4, 0x10, + + /* U+005D "]" */ + 0x89, 0x99, 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, + 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, + 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, + 0x0, 0xa, 0x0, 0xa, 0x99, 0x99, + + /* U+005E "^" */ + 0x2, 0xdd, 0x20, 0x7, 0x1, 0x70, + + /* U+005F "_" */ + 0x66, 0x66, 0x66, 0x66, + + /* U+0060 "`" */ + 0x3c, 0x90, 0x0, 0x43, + + /* U+0061 "a" */ + 0x2, 0x86, 0x68, 0x0, 0xd, 0x20, 0x9, 0x40, + 0x5, 0x0, 0x8, 0x50, 0x0, 0x68, 0x6a, 0x60, + 0xb, 0x50, 0x8, 0x60, 0x3d, 0x0, 0x8, 0x60, + 0x3e, 0x0, 0x9, 0x63, 0x7, 0x97, 0x76, 0xb4, + + /* U+0062 "b" */ + 0x2, 0x10, 0x0, 0x0, 0x4e, 0x30, 0x0, 0x0, + 0xb, 0x30, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, + 0xb, 0x30, 0x0, 0x0, 0xb, 0x48, 0x9b, 0x10, + 0xb, 0xa0, 0x5, 0xa0, 0xb, 0x40, 0x0, 0xf0, + 0xb, 0x30, 0x0, 0xe1, 0xb, 0x30, 0x0, 0xe1, + 0xb, 0x30, 0x0, 0xe0, 0xb, 0x60, 0x5, 0x80, + 0x8, 0x57, 0x89, 0x0, + + /* U+0063 "c" */ + 0x0, 0x67, 0x69, 0x0, 0x59, 0x0, 0x87, 0xc, + 0x20, 0x4, 0x30, 0xf0, 0x0, 0x0, 0xf, 0x0, + 0x0, 0x0, 0xd2, 0x0, 0x3, 0x6, 0x80, 0x0, + 0x60, 0x8, 0xa8, 0x80, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x2a, 0xa0, + 0x0, 0x0, 0x4, 0xa0, 0x0, 0x0, 0x4, 0xa0, + 0x0, 0x0, 0x4, 0xa0, 0x0, 0x89, 0x87, 0xa0, + 0x6, 0x80, 0x6, 0xa0, 0xd, 0x20, 0x4, 0xa0, + 0xf, 0x0, 0x4, 0xa0, 0xf, 0x0, 0x4, 0xa0, + 0xe, 0x10, 0x4, 0xa0, 0x7, 0x60, 0x9, 0xa0, + 0x0, 0x99, 0x86, 0xc3, + + /* U+0065 "e" */ + 0x6, 0x87, 0x90, 0x4, 0x70, 0x5, 0xa0, 0xb1, + 0x0, 0xf, 0xe, 0x66, 0x66, 0xb0, 0xe0, 0x0, + 0x0, 0xc, 0x30, 0x0, 0x20, 0x5a, 0x0, 0x16, + 0x0, 0x7a, 0x87, 0x0, + + /* U+0066 "f" */ + 0x0, 0x2, 0x76, 0xa2, 0x0, 0xb, 0x0, 0x87, + 0x0, 0x2b, 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, + 0x6, 0x8d, 0x66, 0x20, 0x0, 0x3b, 0x0, 0x0, + 0x0, 0x3b, 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, + 0x0, 0x3b, 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, + 0x0, 0x3b, 0x0, 0x0, 0x5, 0x9e, 0x64, 0x0, + + /* U+0067 "g" */ + 0x0, 0x86, 0x88, 0xb6, 0x7, 0x50, 0xb, 0x21, + 0xa, 0x30, 0x9, 0x40, 0x4, 0x80, 0xb, 0x10, + 0x3, 0x86, 0x72, 0x0, 0x8, 0x84, 0x10, 0x0, + 0x3, 0xaa, 0xde, 0x70, 0xc, 0x0, 0x0, 0xe0, + 0xc, 0x0, 0x0, 0xb0, 0x3, 0x86, 0x68, 0x30, + + /* U+0068 "h" */ + 0x3d, 0x40, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, + 0xa, 0x40, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, + 0xa, 0x59, 0x9b, 0x10, 0xa, 0xb0, 0x6, 0x70, + 0xa, 0x40, 0x4, 0x90, 0xa, 0x40, 0x4, 0xa0, + 0xa, 0x40, 0x4, 0xa0, 0xa, 0x40, 0x4, 0xa0, + 0xa, 0x40, 0x4, 0xa0, 0x3d, 0xa0, 0xa, 0xd3, + + /* U+0069 "i" */ + 0x0, 0x8a, 0x0, 0x0, 0x56, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x22, 0x0, 0x26, 0xc7, 0x0, 0x0, + 0x77, 0x0, 0x0, 0x77, 0x0, 0x0, 0x77, 0x0, + 0x0, 0x77, 0x0, 0x0, 0x77, 0x0, 0x0, 0x77, + 0x0, 0x26, 0xbc, 0x62, + + /* U+006A "j" */ + 0x0, 0x0, 0xd5, 0x0, 0x0, 0x92, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x31, 0x0, 0x36, 0xe3, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0xb3, 0x0, 0x0, 0xb3, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0xb3, 0x0, 0x0, + 0xb2, 0x0, 0x0, 0xb1, 0x73, 0x0, 0xb0, 0x6c, + 0x88, 0x10, + + /* U+006B "k" */ + 0x3c, 0x50, 0x0, 0x0, 0x9, 0x50, 0x0, 0x0, + 0x9, 0x50, 0x0, 0x0, 0x9, 0x50, 0x0, 0x0, + 0x9, 0x50, 0x4e, 0x70, 0x9, 0x50, 0x63, 0x0, + 0x9, 0x54, 0x70, 0x0, 0x9, 0x7c, 0x80, 0x0, + 0x9, 0xb0, 0xd2, 0x0, 0x9, 0x50, 0x5a, 0x0, + 0x9, 0x50, 0xc, 0x30, 0x2c, 0xa1, 0xb, 0xd3, + + /* U+006C "l" */ + 0x26, 0xb7, 0x0, 0x0, 0x77, 0x0, 0x0, 0x77, + 0x0, 0x0, 0x77, 0x0, 0x0, 0x77, 0x0, 0x0, + 0x77, 0x0, 0x0, 0x77, 0x0, 0x0, 0x77, 0x0, + 0x0, 0x77, 0x0, 0x0, 0x77, 0x0, 0x0, 0x77, + 0x0, 0x26, 0xbb, 0x62, + + /* U+006D "m" */ + 0x8b, 0x7b, 0x68, 0xc1, 0x3d, 0x6, 0xa0, 0x94, + 0x3b, 0x6, 0x80, 0x95, 0x3b, 0x6, 0x80, 0x95, + 0x3b, 0x6, 0x80, 0x95, 0x3b, 0x6, 0x80, 0x95, + 0x3b, 0x6, 0x80, 0x95, 0x8d, 0x2b, 0xc2, 0xc9, + + /* U+006E "n" */ + 0x3d, 0x58, 0x8a, 0x10, 0xa, 0xa0, 0x6, 0x70, + 0xa, 0x40, 0x4, 0x90, 0xa, 0x40, 0x4, 0xa0, + 0xa, 0x40, 0x4, 0xa0, 0xa, 0x40, 0x4, 0xa0, + 0xa, 0x40, 0x4, 0xa0, 0x3d, 0xa0, 0xa, 0xd3, + + /* U+006F "o" */ + 0x0, 0x87, 0x78, 0x0, 0x7, 0x60, 0x6, 0x70, + 0xd, 0x0, 0x0, 0xd0, 0x2c, 0x0, 0x0, 0xd2, + 0x2c, 0x0, 0x0, 0xc2, 0xd, 0x0, 0x0, 0xd0, + 0x8, 0x50, 0x4, 0x80, 0x0, 0x87, 0x77, 0x0, + + /* U+0070 "p" */ + 0x5e, 0x59, 0x89, 0x10, 0xa, 0xa0, 0x3, 0xc0, + 0xa, 0x40, 0x0, 0xe1, 0xa, 0x40, 0x0, 0xc3, + 0xa, 0x40, 0x0, 0xc2, 0xa, 0x40, 0x0, 0xe0, + 0xa, 0x70, 0x5, 0x90, 0xa, 0x87, 0x8a, 0x0, + 0xa, 0x40, 0x0, 0x0, 0x3d, 0xa2, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x88, 0x74, 0x70, 0x7, 0x60, 0x8, 0x90, + 0xe, 0x0, 0x5, 0x90, 0x1d, 0x0, 0x5, 0x90, + 0x2d, 0x0, 0x5, 0x90, 0xe, 0x0, 0x5, 0x90, + 0x9, 0x40, 0x9, 0x90, 0x1, 0xa9, 0x87, 0x90, + 0x0, 0x0, 0x5, 0x90, 0x0, 0x0, 0x2a, 0xd3, + + /* U+0072 "r" */ + 0x38, 0xe3, 0x58, 0xd2, 0x0, 0xb7, 0x40, 0x82, + 0x0, 0xb8, 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x36, 0xe9, 0x60, 0x0, + + /* U+0073 "s" */ + 0x6, 0x68, 0xe6, 0x46, 0x0, 0x28, 0x59, 0x0, + 0x2, 0xa, 0xd7, 0x10, 0x0, 0x29, 0xe3, 0x40, + 0x0, 0x3b, 0x92, 0x0, 0xa, 0x8e, 0x86, 0x72, + + /* U+0074 "t" */ + 0x0, 0x30, 0x0, 0x0, 0x80, 0x0, 0x5, 0xb0, + 0x0, 0x67, 0xd6, 0x61, 0x2, 0xc0, 0x0, 0x2, + 0xc0, 0x0, 0x2, 0xc0, 0x0, 0x2, 0xc0, 0x0, + 0x1, 0xc0, 0x1, 0x0, 0xd0, 0x6, 0x0, 0x7a, + 0x81, + + /* U+0075 "u" */ + 0x4e, 0x30, 0x1a, 0x90, 0xb, 0x30, 0x5, 0x90, + 0xb, 0x30, 0x5, 0x90, 0xb, 0x30, 0x5, 0x90, + 0xb, 0x30, 0x5, 0x90, 0xa, 0x30, 0x5, 0x90, + 0x8, 0x50, 0xa, 0x90, 0x1, 0xca, 0x96, 0xb3, + + /* U+0076 "v" */ + 0x2c, 0xb1, 0x9, 0xc2, 0x4, 0x90, 0x5, 0x20, + 0x0, 0xd0, 0x7, 0x0, 0x0, 0xb3, 0x7, 0x0, + 0x0, 0x68, 0x42, 0x0, 0x0, 0x1c, 0x60, 0x0, + 0x0, 0xc, 0x70, 0x0, 0x0, 0x7, 0x30, 0x0, + + /* U+0077 "w" */ + 0x9e, 0x2b, 0xb1, 0xb8, 0x1c, 0x4, 0x80, 0x70, + 0xc, 0x6, 0xb0, 0x60, 0x9, 0x26, 0xc0, 0x60, + 0x6, 0x66, 0xa4, 0x30, 0x2, 0xa4, 0x7b, 0x0, + 0x0, 0xf1, 0x4c, 0x0, 0x0, 0x90, 0x8, 0x0, + + /* U+0078 "x" */ + 0x8, 0xf5, 0x2c, 0x80, 0x0, 0xa5, 0x8, 0x0, + 0x0, 0x2e, 0x81, 0x0, 0x0, 0x9, 0x90, 0x0, + 0x0, 0x9, 0xd0, 0x0, 0x0, 0x44, 0x77, 0x0, + 0x0, 0x80, 0xd, 0x10, 0x2b, 0xb0, 0x2d, 0xc2, + + /* U+0079 "y" */ + 0x2b, 0xd2, 0x1a, 0xb2, 0x2, 0xc0, 0x7, 0x10, + 0x0, 0xc1, 0x8, 0x0, 0x0, 0x66, 0x16, 0x0, + 0x0, 0x1b, 0x61, 0x0, 0x0, 0xb, 0x90, 0x0, + 0x0, 0x5, 0x70, 0x0, 0x0, 0x5, 0x20, 0x0, + 0x2, 0x8, 0x0, 0x0, 0xb, 0xc3, 0x0, 0x0, + + /* U+007A "z" */ + 0xaa, 0x66, 0xe4, 0x90, 0x4, 0xb0, 0x30, 0xd, + 0x20, 0x0, 0x78, 0x0, 0x1, 0xd0, 0x0, 0xa, + 0x50, 0x5, 0x4c, 0x0, 0x9, 0xc9, 0x66, 0xc8, + + /* U+007B "{" */ + 0x0, 0x46, 0x1, 0x80, 0x3, 0x50, 0x4, 0x50, + 0x4, 0x50, 0x4, 0x50, 0x5, 0x40, 0x38, 0x0, + 0x27, 0x0, 0x5, 0x30, 0x4, 0x50, 0x4, 0x50, + 0x4, 0x50, 0x3, 0x50, 0x1, 0x80, 0x0, 0x46, + + /* U+007C "|" */ + 0x21, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, + + /* U+007D "}" */ + 0x64, 0x0, 0x8, 0x10, 0x5, 0x30, 0x5, 0x40, + 0x5, 0x40, 0x5, 0x40, 0x4, 0x50, 0x0, 0x83, + 0x0, 0x72, 0x3, 0x50, 0x5, 0x40, 0x5, 0x40, + 0x5, 0x40, 0x5, 0x30, 0x8, 0x10, 0x64, 0x0, + + /* U+007E "~" */ + 0x4, 0x95, 0x0, 0x0, 0x5, 0xb, 0x30, 0x4, + 0x30, 0x1, 0xc1, 0x41, 0x0, 0x0, 0x3a, 0x50, + + /* U+007F "" */ + + /* U+3001 "ã€" */ + 0x3, 0x0, 0x0, 0x4d, 0x50, 0x0, 0x4f, 0x40, + 0x0, 0xa8, 0x0, 0x1, 0x0, + + /* U+3002 "。" */ + 0x4, 0x40, 0x74, 0x56, 0x80, 0x8, 0x48, 0x93, + 0x0, 0x0, + + /* U+3005 "々" */ + 0x0, 0x56, 0x0, 0x0, 0x0, 0x8, 0x60, 0x0, + 0x0, 0x0, 0xb0, 0x0, 0x15, 0x0, 0x5b, 0x86, + 0x58, 0xf1, 0x9, 0x21, 0x0, 0x85, 0x4, 0x0, + 0x0, 0xb, 0x0, 0x0, 0x0, 0x7, 0x30, 0x0, + 0x1, 0x0, 0x80, 0x0, 0x0, 0x9, 0xb1, 0x0, + 0x0, 0x0, 0xb, 0xa0, 0x0, 0x0, 0x0, 0x1e, + 0x20, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+300C "「" */ + 0xda, 0xa8, 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, + 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, + 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, + 0xa0, 0x0, 0xa0, 0x0, + + /* U+300D "ã€" */ + 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, + 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, + 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, + 0x0, 0xa, 0x8a, 0xad, + + /* U+3041 "ã" */ + 0x0, 0x3, 0x30, 0x0, 0x0, 0x0, 0x5, 0x61, + 0x50, 0x0, 0x2, 0x6b, 0xa8, 0x30, 0x0, 0x0, + 0x7, 0x3, 0x0, 0x0, 0x0, 0x8, 0x7c, 0x78, + 0x20, 0x0, 0x6c, 0x18, 0x0, 0xb0, 0x5, 0x56, + 0x92, 0x0, 0xb0, 0x8, 0x6, 0x80, 0x0, 0xa0, + 0xb, 0x87, 0xa0, 0xa, 0x20, 0x1, 0x20, 0x5, + 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+3042 "ã‚" */ + 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb1, 0x6b, + 0x40, 0x0, 0x4, 0x8a, 0xea, 0x51, 0x0, 0x0, + 0x0, 0x0, 0xb0, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xa2, 0xca, 0x73, 0x0, 0x0, 0x4, 0xe6, 0xc1, + 0x29, 0x80, 0x0, 0x6a, 0xa2, 0xa0, 0x0, 0xc1, + 0x6, 0x90, 0xaa, 0x20, 0x0, 0x94, 0xb, 0x0, + 0xd8, 0x0, 0x0, 0xb1, 0x47, 0x3, 0xf3, 0x0, + 0x2, 0xa0, 0x2b, 0x89, 0x4a, 0x0, 0x2b, 0x10, + 0x3, 0x20, 0x0, 0x17, 0x80, 0x0, 0x0, 0x0, + 0x1, 0x40, 0x0, 0x0, + + /* U+3043 "ãƒ" */ + 0xa, 0x0, 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, + 0x34, 0x0, 0x9, 0x0, 0x0, 0x7, 0x40, 0x9, + 0x0, 0x0, 0x0, 0xb0, 0xa, 0x3, 0x0, 0x5, + 0xd0, 0x9, 0x93, 0x0, 0x2, 0x60, 0x1, 0xa0, + 0x0, 0x0, 0x0, + + /* U+3044 "ã„" */ + 0x29, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x0, + 0x0, 0x0, 0x60, 0x0, 0x49, 0x0, 0x0, 0x0, + 0x1a, 0x10, 0x66, 0x0, 0x0, 0x0, 0x2, 0xb0, + 0x75, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x76, 0x3, + 0x0, 0x0, 0x20, 0xa3, 0x3c, 0x9, 0x0, 0x0, + 0x1b, 0xf1, 0xa, 0xd7, 0x0, 0x0, 0x0, 0x50, + 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, + + /* U+3046 "ã†" */ + 0x0, 0x5, 0x86, 0x30, 0x0, 0x0, 0x1, 0xce, + 0x30, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x3, + 0x9a, 0x50, 0x0, 0x4a, 0x71, 0xa, 0x41, 0xb9, + 0x10, 0x0, 0x49, 0x0, 0x0, 0x0, 0x3, 0x90, + 0x0, 0x0, 0x0, 0x67, 0x0, 0x0, 0x0, 0xa, + 0x30, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x1, + 0xc1, 0x0, 0x0, 0x5, 0xa1, 0x0, 0x0, 0x6, + 0x30, 0x0, 0x0, + + /* U+3047 "ã‡" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x81, 0x0, + 0x0, 0x2, 0x71, 0x0, 0x0, 0x5, 0xb6, 0x0, + 0x9, 0x93, 0x93, 0x0, 0x0, 0x5, 0x60, 0x0, + 0x0, 0x39, 0x0, 0x0, 0x3, 0x96, 0x80, 0x0, + 0x4b, 0x0, 0xa0, 0x0, 0x90, 0x0, 0x99, 0xa6, + 0x0, 0x0, 0x0, 0x0, + + /* U+3048 "ãˆ" */ + 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0x60, 0x0, 0x0, 0x0, 0x6, 0x84, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x60, 0x0, 0x0, 0x3, + 0x78, 0x6d, 0x0, 0x0, 0x2c, 0x81, 0xb, 0x20, + 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, + 0x5, 0x60, 0x0, 0x0, 0x0, 0x3, 0xd8, 0x10, + 0x0, 0x0, 0x1, 0xb1, 0x3a, 0x0, 0x0, 0x1, + 0xc2, 0x0, 0xc0, 0x0, 0x0, 0xe4, 0x0, 0xb, + 0x44, 0x88, 0x6, 0x0, 0x0, 0x17, 0x75, 0x10, + + /* U+304A "ãŠ" */ + 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0x20, 0x0, 0x10, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x4b, 0x90, 0x0, 0xc, 0x7d, 0x40, 0x6, 0xb4, + 0x29, 0xbe, 0x50, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x4, 0x9a, 0x70, 0x0, 0x0, 0xd, 0xa5, 0x0, + 0x4b, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x8, 0x50, + 0xa, 0x3c, 0x0, 0x0, 0x7, 0x70, 0x9, 0xc, + 0x5, 0x0, 0xc, 0x20, 0x1, 0xbf, 0x5, 0x86, + 0xb7, 0x0, 0x0, 0x4c, 0x0, 0x25, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+304B "ã‹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x25, 0xcb, 0xac, + 0x20, 0x53, 0x0, 0xb, 0xb6, 0xd0, 0x6, 0x90, + 0x9, 0x50, 0x0, 0x6, 0x60, 0x5, 0x80, 0x0, + 0xe2, 0x0, 0xc, 0x0, 0x8, 0x50, 0x22, 0xb7, + 0x0, 0x66, 0x0, 0xc, 0x10, 0x9, 0xf4, 0x1, + 0xc0, 0x0, 0x2c, 0x0, 0x0, 0x20, 0xc, 0x40, + 0x86, 0xc5, 0x0, 0x0, 0x0, 0x6, 0x0, 0x3f, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+304C "ãŒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, + 0x0, 0x8, 0x0, 0x3, 0x11, 0x80, 0x0, 0x0, + 0xe, 0x30, 0x1, 0xd2, 0x0, 0x0, 0x0, 0x2c, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x9a, 0x98, + 0x1, 0x10, 0x0, 0xb, 0xdb, 0xe2, 0x9, 0x70, + 0x84, 0x0, 0x0, 0x5, 0x70, 0x7, 0x60, 0xb, + 0x50, 0x0, 0xc, 0x10, 0xa, 0x30, 0x2, 0xe0, + 0x0, 0x48, 0x0, 0xd, 0x0, 0x43, 0xe3, 0x0, + 0xc1, 0x0, 0x3a, 0x0, 0x1b, 0xf1, 0x9, 0x71, + 0x60, 0xb4, 0x0, 0x0, 0x30, 0xb, 0x0, 0x6f, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, + 0x0, 0x0, 0x0, + + /* U+304D "ã" */ + 0x0, 0x47, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x10, + 0x25, 0x0, 0x0, 0x5, 0x99, 0xa1, 0x0, 0x4, + 0x9a, 0xd4, 0x0, 0x10, 0x0, 0x0, 0x3a, 0x2a, + 0x70, 0x0, 0x2, 0x5e, 0xb2, 0x0, 0x0, 0x67, + 0x53, 0xc0, 0x0, 0x0, 0x0, 0x10, 0x5a, 0x0, + 0x7, 0xb9, 0x9b, 0xbe, 0x70, 0x4b, 0x0, 0x0, + 0x18, 0xb0, 0x4a, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x70, 0x0, 0x21, 0x0, 0x0, 0x8d, 0xed, 0xa2, + 0x0, + + /* U+304E "ãŽ" */ + 0x0, 0x33, 0x0, 0x0, 0x1, 0x78, 0x0, 0x5, + 0xd0, 0x1, 0x20, 0xb5, 0x90, 0x0, 0xa, 0x47, + 0xc4, 0x1, 0x70, 0x0, 0x56, 0xae, 0x40, 0x0, + 0x0, 0x0, 0x1, 0x20, 0x84, 0x3c, 0x60, 0x0, + 0x0, 0x0, 0x16, 0xf9, 0x10, 0x0, 0x0, 0x1, + 0x77, 0x54, 0x90, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x7, 0x70, 0x0, 0x0, 0x7, 0xca, 0x9b, 0xbf, + 0x50, 0x0, 0x4, 0xa0, 0x0, 0x0, 0x78, 0x0, + 0x0, 0x58, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc8, 0x32, 0x58, 0x40, 0x0, 0x0, 0x0, 0x7b, + 0xb9, 0x50, 0x0, 0x0, 0x0, + + /* U+304F "ã" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xe2, 0x0, + 0x0, 0x7d, 0x10, 0x0, 0x3d, 0x10, 0x0, 0x2b, + 0x10, 0x0, 0x2a, 0x0, 0x0, 0x9, 0x0, 0x0, + 0x0, 0x80, 0x0, 0x0, 0x1, 0xa3, 0x0, 0x0, + 0x0, 0xb6, 0x0, 0x0, 0x0, 0xd8, 0x0, 0x0, + 0x4, 0xf4, 0x0, 0x0, 0xc, 0x80, 0x0, 0x0, + 0x22, + + /* U+3050 "ã" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xcb, 0x0, 0x22, + 0x0, 0x0, 0x8a, 0x0, 0x10, 0xc4, 0x0, 0x59, + 0x0, 0x6, 0xa1, 0x10, 0x39, 0x0, 0x0, 0x7, + 0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x3, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x9, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x50, 0x0, 0x0, + + /* U+3051 "ã‘" */ + 0x6, 0x10, 0x0, 0x0, 0xb2, 0x0, 0xb, 0x60, + 0x0, 0x0, 0xc4, 0x0, 0xc, 0x20, 0x0, 0x0, + 0xa3, 0x23, 0xc, 0x0, 0x6, 0x9a, 0xec, 0x95, + 0x48, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x84, 0x0, + 0x0, 0x0, 0xa2, 0x0, 0xa2, 0x10, 0x0, 0x0, + 0xb1, 0x0, 0xa3, 0x60, 0x0, 0x0, 0xc0, 0x0, + 0x87, 0x90, 0x0, 0x1, 0xc0, 0x0, 0x2f, 0x80, + 0x0, 0x8, 0x60, 0x0, 0x8, 0x50, 0x0, 0x4a, + 0x0, 0x0, 0x0, 0x0, 0x6, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + + /* U+3052 "ã’" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x50, 0x1, + 0x0, 0x0, 0x0, 0x30, 0x34, 0x5b, 0xc, 0x40, + 0x0, 0x0, 0xe4, 0x9, 0x63, 0xc, 0x30, 0x0, + 0x0, 0xb3, 0x0, 0x20, 0xd, 0x0, 0x0, 0x2, + 0xba, 0xc6, 0x0, 0x48, 0x0, 0x7, 0x98, 0xc5, + 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, 0x93, 0x0, + 0x0, 0x84, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, + 0x84, 0x10, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x76, + 0x70, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x3c, 0x90, + 0x0, 0x5, 0x80, 0x0, 0x0, 0xd, 0x70, 0x0, + 0x1c, 0x10, 0x0, 0x0, 0x2, 0x10, 0x2, 0xa2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x0, 0x0, + 0x0, 0x0, + + /* U+3053 "ã“" */ + 0x0, 0x58, 0x9a, 0xc7, 0x0, 0x0, 0x0, 0x3c, + 0x71, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x59, 0x0, 0x0, 0x3, 0x70, 0x6, 0xcc, 0xcd, + 0xfd, 0x70, 0x0, 0x0, 0x11, 0x0, 0x0, + + /* U+3054 "ã”" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x16, 0xa0, 0x0, 0x32, 0x1, + 0x31, 0xb, 0x56, 0x0, 0x1, 0x7a, 0xdf, 0x90, + 0x16, 0x0, 0x0, 0x0, 0x58, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x36, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x98, 0x42, 0x34, 0x8d, 0x20, 0x0, 0x0, 0x49, + 0xbc, 0xb8, 0x30, 0x0, 0x0, + + /* U+3055 "ã•" */ + 0x0, 0x24, 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, + 0x0, 0x0, 0x5, 0xb0, 0x7, 0x40, 0x0, 0x9, + 0xcc, 0x70, 0x3, 0xaa, 0x8b, 0x50, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x1, 0x20, 0x3d, 0x0, + 0x7b, 0x99, 0xbb, 0xd7, 0x4a, 0x0, 0x0, 0x1b, + 0x96, 0x70, 0x0, 0x0, 0x1, 0x1d, 0x30, 0x0, + 0x0, 0x0, 0x2a, 0xdc, 0xcd, 0x0, 0x0, 0x0, + 0x22, 0x0, 0x0, + + /* U+3056 "ã–" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x25, + 0x0, 0x0, 0x16, 0x5b, 0x0, 0x2d, 0x20, 0x0, + 0x7, 0x81, 0x0, 0x2, 0xc1, 0x6, 0xb0, 0x10, + 0x0, 0x1, 0x6d, 0xb7, 0x0, 0x0, 0x1, 0x67, + 0x77, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x96, + 0x0, 0x0, 0x0, 0x1, 0x10, 0xd, 0x20, 0x0, + 0x6, 0xba, 0xac, 0xbb, 0xa0, 0x0, 0x2c, 0x0, + 0x0, 0x19, 0xd0, 0x0, 0x3a, 0x0, 0x0, 0x0, + 0x10, 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8d, 0xee, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+3057 "ã—" */ + 0x7, 0x10, 0x0, 0x0, 0x0, 0xf, 0x40, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x0, 0x1, 0xe, 0x0, 0x0, + 0x2, 0x90, 0xb, 0x40, 0x0, 0x7a, 0x0, 0x2, + 0xda, 0xad, 0x70, 0x0, 0x0, 0x2, 0x20, 0x0, + 0x0, + + /* U+3058 "ã˜" */ + 0x1a, 0x10, 0x0, 0x0, 0x0, 0xf, 0x10, 0x0, + 0x86, 0x0, 0xe, 0x0, 0x2a, 0x3c, 0x0, 0x1d, + 0x0, 0x4, 0x90, 0x0, 0x1c, 0x0, 0x0, 0x0, + 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, + 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0x0, 0x0, 0x0, 0x11, 0xd, 0x0, 0x0, + 0x4, 0x80, 0xb, 0x50, 0x1, 0x99, 0x0, 0x2, + 0xcc, 0xcb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+3059 "ã™" */ + 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x13, 0x57, 0x40, 0x5, 0x57, 0x99, + 0x9e, 0x87, 0x65, 0x50, 0x3, 0x74, 0x10, 0xb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xae, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x56, 0xc, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x74, 0xd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0x8f, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x5c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x62, 0x0, + 0x0, 0x0, 0x0, + + /* U+305A "ãš" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, + 0x0, 0x0, 0x1, 0x40, 0x0, 0x31, 0x6a, 0x0, + 0x0, 0x0, 0x1f, 0x20, 0x0, 0xc3, 0x40, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x1, 0x20, 0x0, 0x0, + 0x24, 0x7e, 0xaa, 0xbc, 0x80, 0x0, 0x7d, 0xb8, + 0x52, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x7c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x81, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x92, 0xb, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x7, 0x60, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xbf, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+305B "ã›" */ + 0x0, 0x0, 0x0, 0x0, 0x69, 0x0, 0x0, 0x0, + 0xe, 0x20, 0x3, 0xc0, 0x0, 0x0, 0x0, 0xb1, + 0x0, 0x2a, 0x0, 0x0, 0x0, 0xb, 0x12, 0x58, + 0xec, 0xd8, 0x7, 0x8a, 0xe9, 0x74, 0x49, 0x0, + 0x0, 0x33, 0xb, 0x10, 0x3, 0x80, 0x0, 0x0, + 0x0, 0xa1, 0x5, 0x96, 0x0, 0x0, 0x0, 0xa, + 0x20, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x74, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xc2, 0x0, 0x13, + 0x0, 0x0, 0x0, 0x3, 0xac, 0xcb, 0x90, 0x0, + + /* U+305C "ãœ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0xa2, 0x0, + 0x0, 0x0, 0x0, 0x29, 0x4, 0xa3, 0x70, 0x0, + 0xc, 0x40, 0x0, 0xf0, 0x7, 0x10, 0x0, 0x0, + 0xa4, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x9, + 0x21, 0x46, 0xeb, 0xc8, 0x0, 0x5, 0x69, 0xdb, + 0x96, 0x4b, 0x0, 0x0, 0x0, 0x55, 0x29, 0x20, + 0x1, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x92, 0x4, + 0x87, 0x0, 0x0, 0x0, 0x0, 0x8, 0x30, 0x1c, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x75, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xd3, 0x0, 0x2, + 0x10, 0x0, 0x0, 0x0, 0x3, 0xad, 0xdd, 0xc4, + 0x0, 0x0, + + /* U+305D "ã" */ + 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, 0x1, 0x56, + 0x98, 0x9e, 0x0, 0x0, 0x8, 0x60, 0x3d, 0x40, + 0x0, 0x0, 0x0, 0x5a, 0x10, 0x0, 0x0, 0x0, + 0x86, 0x0, 0x2, 0x0, 0x4, 0x82, 0x48, 0xcc, + 0xa6, 0x2c, 0xe9, 0x85, 0xa4, 0x0, 0x1, 0x62, + 0x0, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x74, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x85, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd9, + 0x63, 0x0, 0x0, 0x0, 0x0, 0x7b, 0x80, 0x0, + + /* U+305E "ãž" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4a, 0x30, 0x17, 0x90, 0x0, 0x57, + 0x88, 0x5d, 0x90, 0x96, 0x52, 0x0, 0x15, 0x11, + 0xb4, 0x0, 0x9, 0x0, 0x0, 0x0, 0x3a, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x70, 0x0, 0x35, + 0x30, 0x0, 0x1, 0x85, 0x58, 0xbd, 0x97, 0x50, + 0x0, 0x4e, 0xc8, 0x35, 0x80, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x49, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x97, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xda, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x30, + 0x0, 0x0, + + /* U+305F "ãŸ" */ + 0x0, 0x4, 0x20, 0x0, 0x0, 0x0, 0x0, 0x9, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xa, 0x34, 0x70, + 0x0, 0x0, 0x14, 0x5d, 0xc9, 0x20, 0x1, 0x0, + 0x4, 0x5c, 0x0, 0x38, 0x8c, 0xd1, 0x0, 0x39, + 0x0, 0x0, 0x68, 0x30, 0x0, 0x75, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xa0, 0x3, 0x0, 0x0, 0x0, 0x9, 0x50, + 0x8, 0x0, 0x0, 0x0, 0x2d, 0x0, 0xa, 0x10, + 0x0, 0x0, 0x64, 0x0, 0x2, 0xab, 0xce, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+3060 "ã " */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x40, 0x0, 0x0, 0x8, 0x40, 0x0, 0x0, + 0xc5, 0x0, 0x1, 0x92, 0xc0, 0x0, 0x0, 0xc1, + 0x64, 0x0, 0x29, 0x0, 0x3, 0x35, 0xeb, 0x50, + 0x0, 0x10, 0x0, 0x1, 0x57, 0x90, 0x5, 0x98, + 0xd8, 0x0, 0x0, 0x6, 0x50, 0x0, 0x7, 0x84, + 0x0, 0x0, 0xb, 0x10, 0x0, 0x10, 0x0, 0x0, + 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x58, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0xb2, + 0x2, 0x50, 0x0, 0x0, 0x0, 0x4, 0xb0, 0x2, + 0xa1, 0x0, 0x11, 0x0, 0x7, 0x30, 0x0, 0x4a, + 0xbc, 0xd9, 0x0, + + /* U+3061 "ã¡" */ + 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xa3, 0x6a, 0x40, + 0x0, 0x7a, 0xdb, 0x75, 0x20, 0x0, 0x0, 0xa, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xb0, 0x16, 0x98, + 0x30, 0x0, 0x58, 0x88, 0x30, 0x4d, 0x40, 0xa, + 0xd2, 0x0, 0x0, 0x5b, 0x0, 0x63, 0x0, 0x0, + 0x5, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, + 0x0, 0x0, 0x4, 0xb5, 0x0, 0x0, 0x1, 0x56, + 0x40, 0x0, + + /* U+3063 "ã£" */ + 0x0, 0x5, 0x99, 0x99, 0x10, 0x6b, 0xa5, 0x0, + 0x4, 0xa0, 0x2, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x6, + 0x80, 0x0, 0x0, 0x2, 0x99, 0x0, 0x0, 0x16, + 0x87, 0x10, 0x0, + + /* U+3064 "ã¤" */ + 0x0, 0x0, 0x5, 0xaa, 0xab, 0x70, 0x0, 0x25, + 0x9b, 0x50, 0x0, 0x6, 0xc0, 0x9, 0xc3, 0x0, + 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xc5, 0x0, 0x0, 0x0, 0x36, 0x79, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+3065 "ã¥" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x31, 0xb6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0x24, 0x0, 0x0, 0x26, + 0x99, 0xaa, 0x44, 0x20, 0x4, 0x7b, 0x93, 0x0, + 0x0, 0xb4, 0x0, 0xb, 0x81, 0x0, 0x0, 0x0, + 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xb6, 0x0, 0x0, 0x0, 0x1, 0x68, + 0x84, 0x0, 0x0, 0x0, + + /* U+3066 "ã¦" */ + 0x0, 0x0, 0x1, 0x48, 0xbd, 0xd1, 0x37, 0x8a, + 0xa8, 0x49, 0xb6, 0x30, 0x15, 0x30, 0x1, 0xb4, + 0x0, 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0x61, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8d, + 0xc0, 0x0, + + /* U+3067 "ã§" */ + 0x0, 0x0, 0x0, 0x37, 0xad, 0xfb, 0x0, 0x66, + 0x8a, 0xa6, 0x4a, 0x82, 0x0, 0x4, 0x74, 0x0, + 0x2c, 0x20, 0x11, 0x0, 0x0, 0x0, 0x1c, 0x10, + 0x20, 0x95, 0x0, 0x0, 0xb, 0x30, 0x2, 0xc2, + 0x60, 0x0, 0x2, 0xc0, 0x0, 0x5, 0x20, 0x0, + 0x0, 0x58, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0x41, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+3068 "ã¨" */ + 0x0, 0x24, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, + 0x0, 0x0, 0x3a, 0x0, 0x0, 0x0, 0x2, 0xa0, + 0x0, 0x20, 0x0, 0xc, 0x0, 0x6e, 0x50, 0x0, + 0x7b, 0xc7, 0x20, 0x0, 0x5c, 0x50, 0x0, 0x0, + 0x7a, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, + 0x2, 0xa0, 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, + 0x1, 0x20, 0x2b, 0xdc, 0xce, 0xf9, 0x0, 0x0, + 0x12, 0x10, 0x0, + + /* U+3069 "ã©" */ + 0x0, 0x8, 0x10, 0x0, 0x1, 0x70, 0x0, 0xd, + 0x30, 0x0, 0x46, 0x4b, 0x0, 0xb, 0x10, 0x0, + 0xb, 0x32, 0x0, 0xa, 0x10, 0x1, 0x40, 0x0, + 0x0, 0x8, 0x40, 0x7e, 0x90, 0x0, 0x0, 0x2, + 0xdc, 0x71, 0x0, 0x0, 0x0, 0x3c, 0x60, 0x0, + 0x0, 0x0, 0x3, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x20, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x91, 0x0, 0x0, + 0x40, 0x0, 0x0, 0x6c, 0xcc, 0xde, 0xc2, 0x0, + + /* U+306A "ãª" */ + 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb1, 0x73, + 0x0, 0x0, 0x3, 0x8b, 0xca, 0x60, 0x47, 0x10, + 0x0, 0xa, 0x0, 0x0, 0x4, 0xd1, 0x0, 0x74, + 0x0, 0x4, 0xb7, 0xa5, 0x3, 0xa0, 0x0, 0xc, + 0x0, 0x0, 0x2e, 0x20, 0x0, 0xc, 0x0, 0x0, + 0x95, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x5, + 0x99, 0x9d, 0x0, 0x0, 0x0, 0x1a, 0x0, 0xe, + 0xc2, 0x0, 0x0, 0xc, 0x42, 0x96, 0x5d, 0x0, + 0x0, 0x1, 0x78, 0x40, 0x3, 0x0, + + /* U+306B "ã«" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, + 0x46, 0x7c, 0xd1, 0xc, 0x40, 0x1, 0x24, 0xa3, + 0x0, 0xd0, 0x0, 0x1, 0x40, 0x0, 0x48, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x84, 0x0, 0x10, 0x0, 0x0, 0x8, 0x35, + 0x6, 0x0, 0x0, 0x0, 0x58, 0x80, 0x90, 0x0, + 0x0, 0x1, 0xf6, 0x8, 0x81, 0x1, 0x45, 0x6, + 0x30, 0x5, 0xac, 0xcb, 0x40, + + /* U+306C "ã¬" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, + 0xc2, 0x30, 0x0, 0x0, 0x4a, 0x1, 0x9c, 0x66, + 0xa7, 0x0, 0x0, 0xa4, 0x97, 0x50, 0x0, 0x95, + 0x0, 0xc, 0x80, 0xa1, 0x0, 0x2, 0xa0, 0x3, + 0xd4, 0x19, 0x0, 0x0, 0xc, 0x0, 0xa1, 0xb9, + 0x20, 0x0, 0x1, 0xa0, 0x19, 0x7, 0xb0, 0x7, + 0xa8, 0x96, 0x2, 0x80, 0xbb, 0x67, 0x60, 0x2f, + 0xa0, 0xc, 0xb4, 0x0, 0x76, 0x1a, 0x68, 0xa0, + 0x11, 0x0, 0x0, 0x79, 0x40, 0x3, + + /* U+306D "ã­" */ + 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0xb, 0x40, + 0x89, 0x79, 0x80, 0x0, 0x18, 0xad, 0x2a, 0x20, + 0x0, 0x85, 0x0, 0x3, 0x3f, 0x80, 0x0, 0x0, + 0x3a, 0x0, 0x0, 0xae, 0x0, 0x0, 0x0, 0x2b, + 0x0, 0x1, 0xca, 0x0, 0x0, 0x0, 0x39, 0x0, + 0xa, 0x3a, 0x0, 0x6, 0x86, 0x86, 0x0, 0x4c, + 0x1a, 0x0, 0xa6, 0x25, 0xfb, 0x30, 0x81, 0xae, + 0x0, 0xc2, 0x29, 0x73, 0xd2, 0x0, 0x3c, 0x0, + 0x29, 0x94, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+306E "ã®" */ + 0x0, 0x0, 0x0, 0x45, 0x51, 0x0, 0x0, 0x0, + 0x8, 0xba, 0x56, 0xab, 0x10, 0x0, 0x1c, 0x30, + 0x80, 0x0, 0x4c, 0x0, 0xb, 0x20, 0x8, 0x10, + 0x0, 0xa5, 0x5, 0x80, 0x0, 0x81, 0x0, 0x6, + 0x90, 0xa2, 0x0, 0xa, 0x0, 0x0, 0x3a, 0xc, + 0x0, 0x0, 0xb0, 0x0, 0x4, 0x90, 0xb0, 0x0, + 0x57, 0x0, 0x0, 0x86, 0xa, 0x20, 0xc, 0x0, + 0x0, 0x1d, 0x10, 0x4b, 0x5c, 0x30, 0x0, 0x1c, + 0x40, 0x0, 0x48, 0x20, 0x0, 0x6a, 0x30, 0x0, + 0x0, 0x0, 0x1, 0x52, 0x0, 0x0, + + /* U+306F "ã¯" */ + 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0xc1, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0xc0, 0x0, 0x1, 0xb0, 0x0, 0x0, 0xc7, 0xc5, + 0x4, 0x70, 0x3, 0x89, 0xe3, 0x0, 0x8, 0x30, + 0x0, 0x0, 0xb0, 0x0, 0xb, 0x0, 0x0, 0x0, + 0xb0, 0x0, 0xb, 0x0, 0x0, 0x0, 0xb0, 0x0, + 0xc, 0x60, 0x4, 0x65, 0xb0, 0x0, 0xd, 0xa0, + 0x77, 0x35, 0xea, 0x20, 0x8, 0xa0, 0xb1, 0x1, + 0xc3, 0xe2, 0x0, 0x30, 0x3c, 0xab, 0x20, 0x31, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+3070 "ã°" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x11, 0xb2, 0x9, 0x20, + 0x0, 0xd, 0x30, 0x3a, 0x45, 0xc, 0x10, 0x0, + 0xb, 0x10, 0x6, 0x10, 0xc, 0x0, 0x0, 0xb, + 0x49, 0x60, 0x0, 0x29, 0x0, 0x38, 0xae, 0x73, + 0x0, 0x0, 0x55, 0x0, 0x0, 0xb, 0x0, 0x0, + 0x0, 0x73, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, + 0xa1, 0x10, 0x0, 0xb, 0x0, 0x0, 0x0, 0xb4, + 0x10, 0x2, 0x1b, 0x0, 0x0, 0x0, 0xba, 0x3, + 0xc6, 0x7e, 0x70, 0x0, 0x0, 0x7a, 0x7, 0x70, + 0xa, 0x6d, 0x10, 0x0, 0x15, 0x2, 0xd9, 0xb4, + 0x5, 0x30, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, + + /* U+3071 "ã±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x6, 0x75, 0xa, 0x10, 0x0, + 0xd, 0x30, 0x90, 0x60, 0xd1, 0x0, 0x0, 0xb0, + 0x1, 0x73, 0xb, 0x0, 0x0, 0xb, 0x5a, 0x60, + 0x3, 0x70, 0x3, 0x8a, 0xd5, 0x10, 0x0, 0x64, + 0x0, 0x0, 0xb, 0x0, 0x0, 0x9, 0x10, 0x0, + 0x0, 0xb0, 0x0, 0x0, 0xa0, 0x0, 0x0, 0xb, + 0x0, 0x0, 0xb, 0x50, 0x2, 0x43, 0xb0, 0x0, + 0x0, 0xba, 0x5, 0xa4, 0x5e, 0x80, 0x0, 0x7, + 0x90, 0x93, 0x1, 0xb4, 0xd1, 0x0, 0x3, 0x2, + 0xba, 0xb2, 0x3, 0x10, 0x0, + + /* U+3072 "ã²" */ + 0x0, 0x4a, 0xd1, 0x0, 0x82, 0x0, 0x6, 0xc6, + 0x99, 0x0, 0xd, 0x90, 0x0, 0x0, 0x49, 0x0, + 0x0, 0xac, 0x0, 0x0, 0xc, 0x0, 0x0, 0x9, + 0x86, 0x0, 0x7, 0x50, 0x0, 0x0, 0xa2, 0xd2, + 0x0, 0xc0, 0x0, 0x0, 0xc, 0x5, 0xd0, 0xc, + 0x0, 0x0, 0x1, 0xc0, 0x1, 0x0, 0xc0, 0x0, + 0x0, 0x67, 0x0, 0x0, 0xc, 0x10, 0x0, 0xd, + 0x10, 0x0, 0x0, 0x5a, 0x0, 0x1b, 0x50, 0x0, + 0x0, 0x0, 0x6c, 0xbb, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+3073 "ã³" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x95, 0x0, 0x16, + 0xc7, 0x0, 0x27, 0x1c, 0x14, 0xc, 0x94, 0xd4, + 0x0, 0x4f, 0x14, 0x10, 0x0, 0xb, 0x40, 0x0, + 0x2d, 0x60, 0x0, 0x0, 0x59, 0x0, 0x0, 0x29, + 0xc0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x29, 0x79, + 0x0, 0x3, 0xa0, 0x0, 0x0, 0x48, 0xc, 0x60, + 0x5, 0x60, 0x0, 0x0, 0x75, 0x0, 0x10, 0x6, + 0x50, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x4, 0x80, + 0x0, 0x6, 0x90, 0x0, 0x0, 0x0, 0xc3, 0x0, + 0x5c, 0x10, 0x0, 0x0, 0x0, 0x2c, 0xcc, 0x91, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+3074 "ã´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x70, 0x1, 0x38, + 0xc4, 0x0, 0x45, 0x16, 0x61, 0x2c, 0x75, 0xc2, + 0x0, 0x7e, 0x3, 0x30, 0x0, 0xc, 0x10, 0x0, + 0x4d, 0x30, 0x0, 0x0, 0x94, 0x0, 0x0, 0x49, + 0xa0, 0x0, 0x1, 0xb0, 0x0, 0x0, 0x46, 0xa4, + 0x0, 0x7, 0x60, 0x0, 0x0, 0x75, 0x1e, 0x20, + 0xa, 0x20, 0x0, 0x0, 0xa2, 0x1, 0x0, 0xb, + 0x10, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x8, 0x40, + 0x0, 0x8, 0x70, 0x0, 0x0, 0x2, 0xc1, 0x0, + 0x6b, 0x0, 0x0, 0x0, 0x0, 0x5d, 0xbc, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, + + /* U+3075 "ãµ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x3a, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0x20, 0x14, 0x0, + 0x0, 0x2, 0x1, 0xb0, 0x6, 0x90, 0x41, 0x83, + 0x0, 0xb1, 0x0, 0xc6, 0x8d, 0x24, 0x20, 0xc0, + 0x0, 0x35, 0x10, 0x0, 0x7a, 0x40, 0x0, 0x0, + + /* U+3076 "ã¶" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x52, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, + 0xb7, 0x0, 0x53, 0xc0, 0x0, 0x0, 0x6, 0xf3, + 0x5, 0x92, 0x0, 0x0, 0x8, 0x71, 0x0, 0x2, + 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x10, 0x31, 0x0, 0x0, 0x0, 0x30, 0x3a, + 0x0, 0xa4, 0x0, 0x33, 0x80, 0x0, 0xc0, 0x1, + 0xe2, 0xe, 0xb0, 0x13, 0x1c, 0x0, 0x6, 0x30, + 0x30, 0x0, 0x38, 0x20, 0x0, 0x0, + + /* U+3077 "ã·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x62, 0x0, 0x4, 0x61, 0x0, 0x0, 0x0, + 0xb7, 0x0, 0x60, 0x60, 0x0, 0x0, 0x8, 0xf2, + 0x3, 0x61, 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x10, 0x32, 0x0, 0x0, 0x0, 0x20, 0x3a, + 0x0, 0xa5, 0x0, 0x43, 0x80, 0x0, 0xc0, 0x1, + 0xe1, 0xf, 0xa0, 0x51, 0x2c, 0x0, 0x7, 0x10, + 0x50, 0x1, 0x99, 0x20, 0x0, 0x0, + + /* U+3078 "ã¸" */ + 0x0, 0x0, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1b, 0x4a, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x10, + 0x39, 0x0, 0x0, 0x0, 0x4d, 0x30, 0x0, 0x67, + 0x0, 0x0, 0x19, 0x30, 0x0, 0x0, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x67, + + /* U+3079 "ã¹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x24, 0xa1, 0x0, 0x0, 0x15, + 0x0, 0x6, 0x95, 0x30, 0x0, 0x29, 0x4a, 0x0, + 0x8, 0x0, 0x0, 0x1a, 0x0, 0x39, 0x0, 0x0, + 0x0, 0x3c, 0x20, 0x0, 0x66, 0x0, 0x0, 0x1b, + 0x40, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x78, + + /* U+307A "ãº" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x63, 0x0, 0x0, + 0x1, 0x50, 0x0, 0x60, 0x60, 0x0, 0x1, 0xb4, + 0xa0, 0x1, 0x64, 0x0, 0x1, 0xb1, 0x2, 0xa0, + 0x0, 0x0, 0x3, 0xc3, 0x0, 0x6, 0x70, 0x0, + 0x0, 0xa4, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x70, + + /* U+307B "ã»" */ + 0x5, 0x20, 0x0, 0x2, 0x48, 0x10, 0x9, 0x60, + 0x7, 0x9d, 0x63, 0x0, 0xa, 0x10, 0x0, 0xb, + 0x20, 0x0, 0xb, 0x0, 0x0, 0xa, 0x0, 0x0, + 0x1a, 0x0, 0x0, 0xb, 0x49, 0x70, 0x46, 0x0, + 0x7, 0x9e, 0x72, 0x0, 0x64, 0x0, 0x0, 0xb, + 0x0, 0x0, 0x82, 0x40, 0x0, 0xb, 0x0, 0x0, + 0x88, 0x30, 0x35, 0x4b, 0x0, 0x0, 0x5f, 0x6, + 0x63, 0x5e, 0x91, 0x0, 0x9, 0xa, 0x0, 0x2a, + 0x4d, 0x20, 0x0, 0x2, 0xaa, 0xa1, 0x2, 0x20, + + /* U+307C "ã¼" */ + 0x2, 0x40, 0x0, 0x1, 0x36, 0x50, 0x0, 0x3, + 0xa0, 0x2, 0x8b, 0xb4, 0x11, 0x60, 0x7, 0x40, + 0x0, 0x3, 0xb0, 0x36, 0x49, 0xa, 0x0, 0x0, + 0x2, 0xa0, 0x8, 0x40, 0xa, 0x0, 0x0, 0x2, + 0xb6, 0xa2, 0x0, 0xa, 0x0, 0x3, 0x8a, 0xc5, + 0x10, 0x0, 0xa, 0x0, 0x0, 0x2, 0xa0, 0x0, + 0x0, 0x19, 0x50, 0x0, 0x2, 0xa0, 0x0, 0x0, + 0x1b, 0x70, 0x4, 0x54, 0xa0, 0x0, 0x0, 0xd, + 0x50, 0xa4, 0x38, 0xd5, 0x0, 0x0, 0x5, 0x21, + 0x90, 0x6, 0x79, 0xa0, 0x0, 0x0, 0x0, 0x7a, + 0xa9, 0x0, 0x50, 0x0, + + /* U+307D "ã½" */ + 0x2, 0x40, 0x0, 0x1, 0x36, 0x40, 0x0, 0x3, + 0xa0, 0x2, 0x8b, 0xb4, 0x5, 0x85, 0x7, 0x40, + 0x0, 0x3, 0xb0, 0x5, 0x7, 0xa, 0x0, 0x0, + 0x2, 0xa0, 0x0, 0x51, 0xa, 0x0, 0x0, 0x2, + 0xb6, 0xa2, 0x0, 0xa, 0x0, 0x3, 0x8a, 0xc5, + 0x10, 0x0, 0xa, 0x0, 0x0, 0x2, 0xa0, 0x0, + 0x0, 0x19, 0x40, 0x0, 0x2, 0xa0, 0x0, 0x0, + 0x1b, 0x70, 0x4, 0x54, 0xa0, 0x0, 0x0, 0xd, + 0x50, 0xa4, 0x38, 0xd4, 0x0, 0x0, 0x6, 0x21, + 0x90, 0x6, 0x7b, 0x90, 0x0, 0x0, 0x0, 0x7a, + 0xa9, 0x0, 0x50, 0x0, + + /* U+307E "ã¾" */ + 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0x0, 0xc, 0x38, 0x80, 0x5, 0x9a, + 0xe7, 0x30, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, + 0x0, 0xd6, 0xb4, 0x0, 0x69, 0xad, 0x40, 0x0, + 0x0, 0x0, 0xc0, 0x0, 0x0, 0x56, 0x4c, 0x0, + 0x0, 0xb5, 0x27, 0xf8, 0x0, 0x1a, 0x0, 0x67, + 0x6d, 0x30, 0x8b, 0xba, 0x0, 0x3d, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+307F "ã¿" */ + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x26, 0x7a, 0xd9, 0x0, 0x0, 0x0, 0x0, 0x42, + 0xc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x20, + 0x0, 0x0, 0x0, 0x67, 0x0, 0x1f, 0x0, 0x0, + 0x59, 0x9e, 0xa9, 0x43, 0xa0, 0x0, 0x85, 0x9, + 0x40, 0x17, 0xe7, 0x0, 0x1a, 0x4, 0x90, 0x0, + 0x2b, 0xb9, 0x2, 0x93, 0xb0, 0x0, 0xb, 0x10, + 0xa1, 0x8, 0x80, 0x0, 0xa, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x27, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+3080 "ã‚€" */ + 0x0, 0x49, 0x0, 0x0, 0x0, 0x0, 0x2, 0xb0, + 0x0, 0x0, 0x0, 0x1, 0x3c, 0x8b, 0x0, 0x46, + 0x0, 0x69, 0xc2, 0x0, 0x0, 0xa6, 0x0, 0x2a, + 0x0, 0x0, 0x2, 0xb2, 0x76, 0xa0, 0x0, 0x0, + 0x0, 0x90, 0x3c, 0x0, 0x0, 0x0, 0xa, 0x38, + 0xa0, 0x0, 0x1, 0x0, 0x3b, 0xd4, 0x0, 0x0, + 0x8, 0x0, 0xc, 0x0, 0x0, 0x0, 0xd3, 0x0, + 0xd4, 0x1, 0x35, 0xbb, 0x0, 0x1, 0x79, 0xa9, + 0x61, 0x0, + + /* U+3081 "ã‚" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, + 0x0, 0xa6, 0x0, 0x0, 0x9, 0x70, 0x0, 0xa2, + 0x0, 0x0, 0x2, 0xa0, 0x49, 0xe9, 0x60, 0x0, + 0x0, 0xca, 0x53, 0x90, 0x6c, 0x10, 0x2, 0xd4, + 0x7, 0x40, 0x3, 0xb0, 0xb, 0x29, 0xb, 0x0, + 0x0, 0xc0, 0x64, 0xa, 0x95, 0x0, 0x0, 0xc0, + 0xb0, 0x4, 0xf1, 0x0, 0x2, 0xb0, 0xb0, 0x3b, + 0x55, 0x0, 0xa, 0x30, 0x4b, 0x81, 0x0, 0x1, + 0xa4, 0x0, 0x0, 0x0, 0x2, 0x67, 0x10, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + + /* U+3082 "ã‚‚" */ + 0x0, 0x2, 0x60, 0x0, 0x0, 0x0, 0x3d, 0x0, + 0x0, 0x0, 0x4, 0x80, 0x0, 0x0, 0x32, 0x74, + 0x0, 0x0, 0x0, 0x6e, 0xba, 0x10, 0x0, 0x0, + 0xc0, 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, 0x11, + 0x88, 0xa2, 0x20, 0x5, 0x0, 0x8a, 0x88, 0x0, + 0x80, 0x6, 0x50, 0x0, 0xa, 0x0, 0x48, 0x0, + 0x2, 0x90, 0x0, 0xc4, 0x13, 0xc2, 0x0, 0x1, + 0x8a, 0x92, 0x0, + + /* U+3083 "ゃ" */ + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x39, 0x0, 0x0, 0x0, 0x57, 0x1, 0xa4, 0x51, + 0x0, 0x1, 0xa2, 0x99, 0x55, 0xc4, 0x0, 0x2d, + 0x91, 0x0, 0x4, 0x80, 0xa9, 0x49, 0x7, 0x65, + 0xc3, 0x0, 0x0, 0xb2, 0x3, 0x52, 0x0, 0x0, + 0x4, 0x90, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, + + /* U+3084 "ã‚„" */ + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x10, 0x1a, 0x20, 0x0, 0x0, 0x0, 0x3a, + 0x0, 0x4c, 0x52, 0x31, 0x0, 0x0, 0xc, 0x0, + 0x4b, 0xb8, 0x7a, 0x80, 0x0, 0x7, 0xab, 0x71, + 0x0, 0x0, 0xd1, 0x0, 0x3b, 0xe1, 0x0, 0x0, + 0x0, 0xd0, 0x2c, 0x91, 0x77, 0x5, 0x40, 0x6, + 0xa0, 0x0, 0x0, 0xd, 0x0, 0x38, 0xa7, 0x0, + 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, 0x0, + + /* U+3085 "ã‚…" */ + 0x0, 0x0, 0x48, 0x0, 0x0, 0xd, 0x0, 0x3c, + 0xa5, 0x0, 0x1b, 0x9, 0x87, 0x56, 0x80, 0x47, + 0x76, 0x6, 0x50, 0xc0, 0x56, 0xa1, 0x7, 0x40, + 0xa2, 0x4d, 0x46, 0x19, 0x10, 0xd0, 0xe, 0x0, + 0xab, 0x18, 0x80, 0x2, 0x0, 0x8a, 0x94, 0x0, + 0x0, 0x6, 0x40, 0x0, 0x0, + + /* U+3086 "ゆ" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xa6, 0x0, 0x0, 0x8, 0x10, 0x0, 0x3e, + 0x51, 0x0, 0xb, 0x30, 0x3b, 0x8d, 0x5a, 0x70, + 0xc, 0x4, 0xb1, 0xb, 0x0, 0x95, 0x1a, 0x1c, + 0x0, 0xb, 0x0, 0x3b, 0x47, 0x94, 0x10, 0xc, + 0x0, 0xd, 0x47, 0xb0, 0x60, 0xc, 0x0, 0x2b, + 0x3d, 0x70, 0x72, 0x2a, 0x0, 0x77, 0xf, 0x40, + 0xb, 0x95, 0x17, 0xb0, 0x5, 0x10, 0x2, 0xda, + 0x95, 0x0, 0x0, 0x0, 0x3b, 0x20, 0x0, 0x0, + 0x0, 0x4, 0x50, 0x0, 0x0, 0x0, + + /* U+3087 "ょ" */ + 0x0, 0x9, 0x30, 0x0, 0x0, 0xa, 0x40, 0x0, + 0x0, 0x9, 0xab, 0x80, 0x0, 0x9, 0x30, 0x0, + 0x0, 0xa, 0x20, 0x0, 0x0, 0xa, 0x20, 0x0, + 0x29, 0x9e, 0xb8, 0x0, 0x83, 0x2d, 0x8, 0x40, + 0x2d, 0xd5, 0x0, 0x0, + + /* U+3088 "よ" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0xe, 0x40, + 0x0, 0x0, 0x0, 0xb2, 0x1, 0x0, 0x0, 0xb, + 0x9c, 0xa2, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, + 0xc, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, + 0x4, 0x4d, 0x0, 0x0, 0x2b, 0x65, 0xec, 0x80, + 0x6, 0x50, 0x49, 0x9, 0x70, 0x1b, 0xbb, 0x10, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+3089 "ら" */ + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x75, + 0x0, 0x0, 0x0, 0x2, 0x5c, 0xd0, 0x0, 0x0, + 0x67, 0x13, 0x90, 0x0, 0x1, 0xa0, 0x0, 0x0, + 0x0, 0x6, 0x40, 0x0, 0x0, 0x0, 0xb, 0x16, + 0xba, 0xba, 0x20, 0xe, 0xb5, 0x0, 0x3, 0xd0, + 0x3e, 0x20, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, + 0x0, 0xc1, 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, + 0x1, 0x37, 0xb7, 0x0, 0x0, 0x24, 0x31, 0x0, + 0x0, + + /* U+308A "り" */ + 0x5, 0x0, 0x0, 0x0, 0x1f, 0x4, 0xbb, 0x40, + 0x3a, 0x3a, 0x1, 0xc0, 0x66, 0xc0, 0x0, 0xd0, + 0x98, 0x70, 0x0, 0xb1, 0xac, 0x10, 0x0, 0xb1, + 0x9b, 0x0, 0x0, 0xc0, 0x58, 0x0, 0x1, 0xb0, + 0x1, 0x0, 0x6, 0x60, 0x0, 0x0, 0xb, 0x0, + 0x0, 0x0, 0x84, 0x0, 0x0, 0x6, 0x50, 0x0, + 0x0, 0x53, 0x0, 0x0, + + /* U+308B "ã‚‹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, + 0xca, 0x0, 0x1, 0xcb, 0x50, 0xb7, 0x0, 0x0, + 0x0, 0x8, 0x60, 0x0, 0x0, 0x0, 0x76, 0x0, + 0x0, 0x0, 0x6, 0x80, 0x0, 0x0, 0x0, 0x6d, + 0x9a, 0xab, 0x70, 0x8, 0xe6, 0x0, 0x0, 0x96, + 0x6d, 0x10, 0x0, 0x0, 0x3b, 0x21, 0x1a, 0x92, + 0x0, 0x49, 0x0, 0x85, 0x9, 0x10, 0xc3, 0x0, + 0x3b, 0x45, 0xbc, 0x40, 0x0, 0x2, 0x66, 0x40, + 0x0, + + /* U+308C "れ" */ + 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0x0, 0x18, 0x91, 0x0, 0x0, 0x0, 0xb, 0x63, + 0xb3, 0x57, 0x0, 0x0, 0x17, 0x9d, 0x88, 0x0, + 0x47, 0x0, 0x0, 0x3, 0x1f, 0x60, 0x0, 0x65, + 0x0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x82, 0x0, + 0x0, 0x0, 0xda, 0x0, 0x0, 0xa0, 0x0, 0x0, + 0x7, 0x6a, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x1d, + 0x2a, 0x0, 0x0, 0xb0, 0x1, 0x60, 0x75, 0x9e, + 0x10, 0x0, 0x97, 0x79, 0x0, 0x0, 0x2d, 0x0, + 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+308D "ã‚" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x34, 0x88, + 0xe4, 0x0, 0x1, 0x96, 0x3, 0xd2, 0x0, 0x0, + 0x0, 0x2b, 0x10, 0x0, 0x0, 0x1, 0xa1, 0x0, + 0x0, 0x0, 0x1a, 0x23, 0x42, 0x0, 0x2, 0xda, + 0x85, 0x58, 0xb1, 0x5e, 0x80, 0x0, 0x0, 0x4a, + 0xb3, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, + 0x0, 0x49, 0x0, 0x0, 0x0, 0x2, 0xc1, 0x0, + 0x4, 0x67, 0x99, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+308F "ã‚" */ + 0x0, 0x2, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x20, 0x35, + 0x41, 0x0, 0x1, 0x69, 0xf5, 0xa7, 0x56, 0xb7, + 0x0, 0x46, 0x4e, 0x90, 0x0, 0x0, 0x95, 0x0, + 0xc, 0xb0, 0x0, 0x0, 0x2, 0xa0, 0x5, 0xbb, + 0x0, 0x0, 0x0, 0x1b, 0x0, 0xd2, 0xb0, 0x0, + 0x0, 0x3, 0x80, 0x89, 0x1b, 0x0, 0x0, 0x0, + 0xa1, 0xc, 0x49, 0xb0, 0x0, 0x1, 0x93, 0x0, + 0x0, 0x79, 0x0, 0x4, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+3092 "ã‚’" */ + 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x10, 0x0, 0x0, 0x3, 0x5, 0x83, 0x99, 0x0, + 0x0, 0x59, 0xea, 0x73, 0x0, 0x0, 0x0, 0x84, + 0x0, 0x0, 0x0, 0x0, 0x4b, 0x89, 0x10, 0x1, + 0xa1, 0x4e, 0x70, 0x2a, 0x18, 0xc8, 0x1c, 0x40, + 0x2, 0xeb, 0x40, 0x0, 0x0, 0x8, 0xac, 0x0, + 0x0, 0x0, 0xb, 0x41, 0xb0, 0x0, 0x0, 0x2, + 0xa0, 0x14, 0x0, 0x0, 0x0, 0x1d, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x4c, 0xcc, 0xdd, 0x20, 0x0, + + /* U+3093 "ã‚“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x47, 0x91, 0x0, 0x0, 0x0, 0x1, 0xcb, + 0x46, 0x80, 0x0, 0x0, 0x0, 0x8e, 0x20, 0x39, + 0x0, 0x1, 0x30, 0x1f, 0x50, 0x3, 0x90, 0x0, + 0x80, 0xa, 0xa0, 0x0, 0x2a, 0x0, 0x55, 0x0, + 0xe1, 0x0, 0x0, 0xd5, 0x88, 0x0, 0x1, 0x0, + 0x0, 0x1, 0x62, 0x0, 0x0, + + /* U+30A1 "ã‚¡" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x57, 0x8a, + 0xc0, 0x4b, 0x84, 0x0, 0xb8, 0x0, 0x0, 0x23, + 0x92, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, + 0x95, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x5, 0x80, 0x0, 0x0, 0x1, 0xa0, 0x0, 0x0, + 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30A2 "ã‚¢" */ + 0x0, 0x0, 0x0, 0x0, 0x15, 0x60, 0x0, 0x1, + 0x36, 0x88, 0x89, 0xf3, 0x9, 0xfa, 0x62, 0x0, + 0x2e, 0x60, 0x0, 0x0, 0x0, 0x1, 0xb2, 0x0, + 0x0, 0x0, 0x6, 0x98, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x80, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x96, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+30A3 "ã‚£" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0xa7, + 0x0, 0x0, 0x4, 0xd1, 0x0, 0x0, 0x4c, 0x10, + 0x0, 0x6, 0xc9, 0x0, 0x0, 0x86, 0xc, 0x0, + 0x15, 0x10, 0xb, 0x0, 0x0, 0x0, 0xb, 0x0, + 0x0, 0x0, 0x1b, 0x0, 0x0, 0x0, 0x2a, 0x0, + 0x0, 0x0, 0x2, 0x0, + + /* U+30A4 "イ" */ + 0x0, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, + 0x3, 0xf3, 0x0, 0x0, 0x0, 0x1d, 0x40, 0x0, + 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0xb, 0x70, + 0x0, 0x0, 0x2, 0xb8, 0xc0, 0x0, 0x0, 0x69, + 0x13, 0xa0, 0x0, 0x27, 0x30, 0x2, 0xa0, 0x0, + 0x0, 0x0, 0x2, 0xa0, 0x0, 0x0, 0x0, 0x2, + 0xa0, 0x0, 0x0, 0x0, 0x3, 0xa0, 0x0, 0x0, + 0x0, 0x4, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x70, + 0x0, + + /* U+30A6 "ウ" */ + 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x47, 0xb8, + 0x9, 0x9a, 0xaa, 0x85, 0x27, 0xc0, 0x94, 0x0, + 0x0, 0x0, 0xd3, 0x8, 0x50, 0x0, 0x0, 0x59, + 0x0, 0x86, 0x0, 0x0, 0xc, 0x10, 0x4, 0x40, + 0x0, 0x9, 0x50, 0x0, 0x0, 0x0, 0x5, 0xa0, + 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, + 0x2, 0xa1, 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30A7 "ã‚§" */ + 0x0, 0x1, 0x25, 0x94, 0x0, 0x3, 0xb9, 0xd5, + 0x20, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, + 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0xa1, 0x0, + 0x0, 0x25, 0x78, 0xdb, 0xbc, 0xd1, 0x17, 0x42, + 0x0, 0x0, 0x0, + + /* U+30A8 "エ" */ + 0x0, 0x0, 0x0, 0x2, 0x51, 0x0, 0x2, 0x99, + 0xac, 0xa9, 0x73, 0x0, 0x0, 0x33, 0xc, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x20, 0x0, 0x0, 0x0, 0x0, 0xa, 0x43, + 0x56, 0x72, 0x6c, 0xca, 0xa9, 0x76, 0x55, 0x64, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30AA "オ" */ + 0x0, 0x0, 0x0, 0x2, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4c, + 0x8a, 0xc4, 0x0, 0x8d, 0xb9, 0x7e, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x9a, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xb0, 0xb0, 0x0, 0x0, 0x0, 0x3, + 0xb0, 0xb, 0x0, 0x0, 0x0, 0x3, 0xb1, 0x0, + 0xb0, 0x0, 0x0, 0x5, 0x90, 0x0, 0xb, 0x0, + 0x0, 0x4, 0x40, 0x0, 0x52, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x10, 0x0, 0x0, + + /* U+30AB "ã‚«" */ + 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xf, 0x30, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x2b, 0x37, 0xb5, 0x3, 0x88, + 0xac, 0xb6, 0x38, 0xb0, 0x6, 0x30, 0xb1, 0x0, + 0xa4, 0x0, 0x0, 0x2b, 0x0, 0xe, 0x0, 0x0, + 0xb, 0x30, 0x3, 0xb0, 0x0, 0x4, 0x90, 0x0, + 0x86, 0x0, 0x1, 0xb0, 0x0, 0xd, 0x10, 0x1, + 0x91, 0x0, 0xac, 0xb0, 0x0, 0x50, 0x0, 0x2, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30AC "ガ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x20, 0x1, 0x6, 0x90, 0x0, 0x0, 0xc, + 0x60, 0x1b, 0x28, 0x0, 0x0, 0x0, 0xd2, 0x0, + 0x36, 0x0, 0x0, 0x0, 0xd, 0x4, 0x85, 0x0, + 0x0, 0x55, 0x8a, 0xd9, 0x67, 0xe0, 0x0, 0x6, + 0x62, 0x76, 0x0, 0x69, 0x0, 0x0, 0x0, 0xc, + 0x10, 0xa, 0x40, 0x0, 0x0, 0x4, 0x90, 0x0, + 0xd0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x3a, 0x0, + 0x0, 0x0, 0x85, 0x0, 0x8, 0x50, 0x0, 0x0, + 0x66, 0x0, 0x88, 0xe1, 0x0, 0x0, 0x32, 0x0, + 0x0, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+30AD "ã‚­" */ + 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xc7, 0x9a, 0x90, 0x3, 0xca, + 0x7b, 0x30, 0x0, 0x0, 0x0, 0x0, 0x64, 0x0, + 0x0, 0x0, 0x0, 0x28, 0xba, 0xbb, 0x83, 0xcb, + 0xa7, 0x5a, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x8, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + + /* U+30AE "ã‚®" */ + 0x0, 0x0, 0x23, 0x0, 0x1, 0x83, 0x0, 0x0, + 0x3d, 0x0, 0x27, 0x29, 0x0, 0x0, 0xc, 0x0, + 0x5, 0x80, 0x0, 0x0, 0x2c, 0x8a, 0xb3, 0x0, + 0x2, 0xca, 0x6a, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x50, 0x1, 0x0, 0x0, 0x1, 0x38, 0xca, + 0xba, 0x80, 0x2c, 0xb9, 0x64, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x64, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30AF "ク" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, + 0x0, 0x0, 0x0, 0x0, 0xc6, 0x0, 0x0, 0x0, + 0x4, 0xe4, 0x46, 0x70, 0x0, 0xc, 0x56, 0x34, + 0xf4, 0x0, 0x94, 0x0, 0x9, 0x90, 0x7, 0x30, + 0x0, 0x3d, 0x0, 0x0, 0x0, 0x0, 0xc2, 0x0, + 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, 0x0, 0x5a, + 0x0, 0x0, 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, + 0x5a, 0x0, 0x0, 0x0, 0x7, 0x50, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+30B0 "ã‚°" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x40, 0x2, 0x93, 0x0, 0x0, 0x1e, 0x20, + 0x2a, 0x57, 0x0, 0x0, 0x9b, 0x55, 0x87, 0x60, + 0x0, 0x3, 0xb4, 0x42, 0x6f, 0x0, 0x0, 0x1b, + 0x10, 0x0, 0xd4, 0x0, 0x1, 0x70, 0x0, 0x7, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x87, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, 0x0, + 0x2, 0x82, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+30B1 "ケ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x4, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x31, 0x36, 0x9c, 0xb1, + 0x0, 0x7b, 0xca, 0x9b, 0x10, 0x0, 0x3, 0x90, + 0x0, 0x5c, 0x0, 0x0, 0x15, 0x0, 0x0, 0x95, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30B2 "ゲ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, + 0x1b, 0x0, 0x0, 0x21, 0xc2, 0x0, 0x6, 0xc0, + 0x0, 0x2, 0xc4, 0x30, 0x0, 0xc1, 0x1, 0x36, + 0x96, 0x20, 0x0, 0x8b, 0xb9, 0xba, 0x43, 0x0, + 0x0, 0x48, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x25, + 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30B3 "コ" */ + 0x0, 0x0, 0x0, 0x1, 0x10, 0x7, 0x78, 0x9a, + 0xab, 0xe1, 0x4, 0x53, 0x0, 0x3, 0xc0, 0x0, + 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, 0x0, 0x7, + 0x50, 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, + 0x0, 0xc, 0x0, 0x2, 0x34, 0x68, 0xaf, 0x20, + 0x2b, 0x96, 0x42, 0x11, 0x0, + + /* U+30B4 "ã‚´" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x20, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x4a, 0x18, 0x0, 0x0, 0x0, 0x2, 0x26, 0x30, + 0x15, 0x57, 0x99, 0x9b, 0xe0, 0x0, 0x7, 0x73, + 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x23, 0x45, 0x78, 0xae, + 0x0, 0x0, 0x29, 0x75, 0x32, 0x11, 0x0, 0x0, + + /* U+30B5 "サ" */ + 0x0, 0x0, 0x30, 0x0, 0xa2, 0x0, 0x0, 0x0, + 0x0, 0xf1, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0xc0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x1, 0xc4, + 0x68, 0xdb, 0xbc, 0xb0, 0x1c, 0xb8, 0xd4, 0x21, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x70, 0x2, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, + 0x0, 0x0, 0x0, 0x0, + + /* U+30B6 "ã‚¶" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x70, 0x0, + 0x0, 0x30, 0x0, 0xa1, 0x19, 0x28, 0x30, 0x0, + 0xd, 0x30, 0xc, 0x10, 0x2a, 0x0, 0x0, 0x0, + 0xa1, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0x56, 0x8e, 0x99, 0xb9, 0x0, 0xb, 0xb9, 0xd5, + 0x20, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x10, + 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x38, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, + 0x0, + + /* U+30B7 "ã‚·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x69, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x4, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x15, + 0x28, 0x40, 0x0, 0x0, 0x1, 0x90, 0x1, 0xc9, + 0x0, 0x0, 0x2b, 0x10, 0x0, 0x3, 0x0, 0x3, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, + 0x0, 0x0, 0x2b, 0x90, 0x0, 0x0, 0x2, 0x6b, + 0xd4, 0x0, 0x0, 0x0, 0x3, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30B8 "ジ" */ + 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x29, 0x60, 0x0, 0x69, 0x20, 0x0, + 0xc3, 0x20, 0x0, 0x3, 0xe1, 0x0, 0x21, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x24, 0x7, 0x80, + 0x0, 0x0, 0x2, 0x90, 0x0, 0x7d, 0x0, 0x0, + 0x2b, 0x10, 0x0, 0x5, 0x0, 0x3, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x6b, 0x10, 0x0, 0x0, 0x0, + 0x1b, 0x80, 0x0, 0x0, 0x1, 0x6a, 0xc3, 0x0, + 0x0, 0x0, 0x1, 0xb7, 0x0, 0x0, 0x0, 0x0, + + /* U+30B9 "ス" */ + 0x0, 0x0, 0x0, 0x16, 0x90, 0x0, 0x5, 0x68, + 0xaa, 0x6f, 0x40, 0x0, 0x68, 0x30, 0x7, 0x90, + 0x0, 0x0, 0x0, 0x1, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0xa6, 0x0, 0x0, 0x0, 0x0, 0x4d, 0x40, + 0x0, 0x0, 0x0, 0x2d, 0x16, 0x60, 0x0, 0x0, + 0x2d, 0x20, 0xa, 0x60, 0x0, 0x3c, 0x20, 0x0, + 0xe, 0x40, 0x68, 0x0, 0x0, 0x0, 0x6c, 0x21, + 0x0, 0x0, 0x0, 0x0, 0x60, + + /* U+30BA "ズ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x12, 0xc2, 0x0, 0x0, + 0x0, 0x5, 0x60, 0xa5, 0x22, 0x0, 0x55, 0x8a, + 0x99, 0xf1, 0x14, 0x0, 0x0, 0x97, 0x20, 0xa, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x19, 0x30, 0x0, 0x0, 0x0, + 0x2, 0xb1, 0x0, 0xc5, 0x0, 0x0, 0x0, 0x3a, + 0x10, 0x0, 0x1e, 0x30, 0x0, 0x6, 0x60, 0x0, + 0x0, 0x7, 0x90, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, + + /* U+30BB "ã‚»" */ + 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x19, 0x60, 0x0, 0x0, 0xd0, 0x49, 0x9a, 0xe0, + 0x0, 0x3, 0xe9, 0x60, 0x1c, 0x10, 0x39, 0xc8, + 0xd0, 0x0, 0x91, 0x0, 0x4, 0x0, 0xd0, 0x3, + 0x20, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb6, 0x22, 0x36, 0x70, 0x0, 0x0, 0x19, 0xbb, + 0x98, 0x30, + + /* U+30BC "ゼ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x96, 0x0, 0x1, 0x10, + 0x0, 0x0, 0xa5, 0x80, 0x0, 0x4e, 0x0, 0x0, + 0x1, 0x90, 0x0, 0x1, 0xd0, 0x0, 0x6, 0x40, + 0x0, 0x0, 0x1c, 0x2, 0x8a, 0xce, 0x0, 0x0, + 0x3, 0xea, 0x71, 0x2c, 0x10, 0x2, 0x7b, 0x9c, + 0x0, 0xa, 0x10, 0x0, 0x16, 0x1, 0xc0, 0x6, + 0x10, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x40, 0x12, 0x57, 0x0, 0x0, 0x0, + 0x3a, 0xbc, 0xba, 0x50, 0x0, + + /* U+30BD "ソ" */ + 0x0, 0x0, 0x0, 0x0, 0x40, 0x35, 0x0, 0x0, + 0x0, 0xf5, 0xb, 0x50, 0x0, 0x2, 0xe0, 0x4, + 0xe0, 0x0, 0x8, 0x80, 0x0, 0xa0, 0x0, 0x1e, + 0x10, 0x0, 0x0, 0x0, 0x97, 0x0, 0x0, 0x0, + 0x3, 0xc0, 0x0, 0x0, 0x0, 0x1c, 0x20, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0xa, 0x30, + 0x0, 0x0, 0x2, 0x81, 0x0, 0x0, 0x0, 0x3, + 0x0, 0x0, 0x0, 0x0, + + /* U+30BF "ã‚¿" */ + 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xaa, 0x0, 0x51, 0x0, 0x0, 0x2f, 0xaa, 0xaf, + 0x80, 0x0, 0xc, 0x42, 0x12, 0xe1, 0x0, 0xa, + 0xa0, 0x0, 0xa6, 0x0, 0xa, 0x43, 0xc3, 0x3c, + 0x0, 0x6, 0x10, 0x4, 0xed, 0x20, 0x0, 0x0, + 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, 0x7, 0x90, + 0x0, 0x0, 0x0, 0x7, 0x90, 0x0, 0x0, 0x0, + 0x1a, 0x60, 0x0, 0x0, 0x0, 0x58, 0x20, 0x0, + 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30C0 "ダ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x52, 0xc2, 0x0, 0x0, + 0x1f, 0x20, 0x35, 0x2d, 0x31, 0x0, 0x0, 0x9d, + 0x8a, 0xaf, 0x13, 0x0, 0x0, 0x4, 0xc3, 0x20, + 0x97, 0x0, 0x0, 0x0, 0x3d, 0x30, 0x2, 0xd0, + 0x0, 0x0, 0x4, 0xa0, 0x98, 0xb, 0x40, 0x0, + 0x0, 0x24, 0x0, 0xb, 0xa9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x6, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30C1 "ãƒ" */ + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0xe1, 0x0, 0x0, 0x4, 0x8b, 0xc3, + 0x0, 0x0, 0x0, 0x22, 0x1, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe2, 0x35, 0x61, 0x49, 0x9a, + 0xaa, 0xe8, 0x77, 0x75, 0x3, 0x20, 0x3, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x76, 0x0, 0x0, 0x0, 0x0, 0x4, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x47, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+30C3 "ッ" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x20, 0x73, 0x0, + 0xe3, 0x9, 0x41, 0xc0, 0x1f, 0x10, 0x39, 0x2, + 0x7, 0x80, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x94, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, + 0x0, 0x67, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, + 0x0, + + /* U+30C4 "ツ" */ + 0x0, 0x2, 0x0, 0x0, 0x0, 0x10, 0x9, 0x20, + 0x0, 0x75, 0x81, 0x2, 0xe0, 0x0, 0xa8, 0x3d, + 0x0, 0xc0, 0x1, 0xd0, 0xd, 0x10, 0x0, 0x9, + 0x50, 0x1, 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, + 0x0, 0xc2, 0x0, 0x0, 0x0, 0x8, 0x60, 0x0, + 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x5, 0x80, + 0x0, 0x0, 0x0, 0x55, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, + + /* U+30C6 "テ" */ + 0x0, 0x2, 0x35, 0x7b, 0x70, 0x0, 0x0, 0x77, + 0x53, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x23, 0x45, 0x78, 0x9b, 0xda, 0x2a, 0x85, + 0x38, 0x90, 0x0, 0x0, 0x0, 0x0, 0x98, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x5, 0x80, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x74, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, + 0x0, 0x0, + + /* U+30C7 "デ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x80, 0x0, 0x3, + 0x35, 0x7a, 0x70, 0x95, 0x90, 0x0, 0x6, 0x64, + 0x21, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x24, 0x68, 0x9a, 0xbc, + 0x80, 0x0, 0x29, 0x75, 0x25, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x73, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30C8 "ト" */ + 0x0, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, 0x3a, + 0x0, 0x0, 0x3, 0x90, 0x0, 0x0, 0x2b, 0x0, + 0x0, 0x2, 0x97, 0x81, 0x0, 0x29, 0x4, 0xe6, + 0x2, 0x90, 0x2, 0xd0, 0x29, 0x0, 0x0, 0x3, + 0x90, 0x0, 0x0, 0x49, 0x0, 0x0, 0x4, 0xa0, + 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + + /* U+30C9 "ド" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xe1, 0x0, 0x2, + 0x50, 0xe, 0x0, 0x7, 0x36, 0x90, 0xc0, 0x0, + 0x1d, 0x2, 0xc, 0x10, 0x0, 0x10, 0x0, 0xc5, + 0x93, 0x0, 0x0, 0xc, 0x2, 0xd8, 0x0, 0x0, + 0xc0, 0x1, 0xd1, 0x0, 0xc, 0x0, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0x0, 0x0, + + /* U+30CA "ナ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x27, 0xc8, 0xac, 0xc1, 0x5d, 0xca, + 0x78, 0x91, 0x0, 0x0, 0x0, 0x0, 0x6, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x75, 0x0, 0x0, 0x0, 0x0, 0x1, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+30CB "ニ" */ + 0x0, 0x0, 0x0, 0x1, 0x23, 0x0, 0x0, 0x0, + 0x2c, 0xa9, 0x98, 0x83, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x23, 0x45, 0x62, 0xb, + 0xca, 0x99, 0x87, 0x65, 0x55, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+30CD "ãƒ" */ + 0x0, 0x0, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x8c, 0xd0, 0x0, + 0x0, 0x6b, 0xa5, 0x1d, 0x40, 0x0, 0x0, 0x1, + 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, 0xc, 0x60, + 0x0, 0x0, 0x0, 0x1, 0xb6, 0xc0, 0x87, 0x0, + 0x0, 0x49, 0x11, 0xa0, 0x9, 0xb0, 0x6, 0x40, + 0x1, 0xa0, 0x0, 0x90, 0x0, 0x0, 0x1, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, + + /* U+30CE "ノ" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xb9, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0x10, 0x0, 0x0, 0x0, 0xc, 0x50, 0x0, 0x0, + 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x4, 0xb0, + 0x0, 0x0, 0x0, 0x3, 0xc1, 0x0, 0x0, 0x0, + 0x3, 0xb1, 0x0, 0x0, 0x0, 0x5, 0xa0, 0x0, + 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, 0x0, 0x15, + 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+30CF "ãƒ" */ + 0x0, 0x0, 0x17, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x5, 0xf1, 0x0, 0x81, 0x0, 0x0, 0x0, 0xc5, + 0x0, 0x1, 0xb1, 0x0, 0x0, 0x79, 0x0, 0x0, + 0x5, 0xc0, 0x0, 0x2b, 0x0, 0x0, 0x0, 0xc, + 0x70, 0x1a, 0x10, 0x0, 0x0, 0x0, 0x4d, 0x6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, + + /* U+30D0 "ãƒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x34, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb4, 0x40, 0x0, 0x0, 0x5, + 0x0, 0x2, 0x11, 0x0, 0x0, 0x0, 0x5e, 0x0, + 0x6, 0x20, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0xa1, 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, 0x4c, + 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0xb, 0x60, + 0x1, 0x91, 0x0, 0x0, 0x0, 0x4, 0xd0, 0x5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, + + /* U+30D1 "パ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x61, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x46, 0x10, 0x0, 0x0, 0x6, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x30, + 0x3, 0x60, 0x0, 0x0, 0x0, 0x88, 0x0, 0x0, + 0x94, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x1e, + 0x10, 0x0, 0xb, 0x10, 0x0, 0x0, 0x8, 0xa0, + 0x0, 0x83, 0x0, 0x0, 0x0, 0x1, 0xf1, 0x4, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x70, + + /* U+30D2 "ヒ" */ + 0x11, 0x0, 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x1, + 0x5c, 0xc0, 0xe, 0x67, 0x75, 0x32, 0x0, 0xc0, + 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, + 0xc0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xc6, 0x21, 0x23, 0x65, 0x1, 0x7a, 0xaa, + 0x98, 0x40, + + /* U+30D3 "ビ" */ + 0x30, 0x0, 0x0, 0x5, 0x10, 0xd5, 0x0, 0x0, + 0x42, 0xd1, 0xb2, 0x0, 0x0, 0x4d, 0x30, 0xb2, + 0x0, 0x1, 0x82, 0x0, 0xb2, 0x1, 0x8d, 0xb3, + 0x0, 0xb6, 0x78, 0x30, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x7a, 0x42, 0x23, + 0x68, 0x0, 0x5, 0x89, 0x99, 0x75, 0x0, + + /* U+30D4 "ピ" */ + 0x0, 0x0, 0x0, 0x0, 0x10, 0x3, 0x40, 0x0, + 0x0, 0x32, 0x60, 0x4d, 0x0, 0x0, 0x3, 0x9a, + 0x3, 0xa0, 0x0, 0x0, 0x1, 0x10, 0x2a, 0x0, + 0x4, 0xdb, 0x0, 0x2, 0xa0, 0x6a, 0x84, 0x0, + 0x0, 0x2c, 0x61, 0x0, 0x0, 0x0, 0x3, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x39, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xdc, 0xbc, 0xdd, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30D5 "フ" */ + 0x0, 0x0, 0x0, 0x0, 0x25, 0x30, 0x7, 0x78, + 0x9a, 0xa9, 0x7a, 0xe0, 0x3, 0x63, 0x10, 0x0, + 0xd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x6a, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, 0x0, 0x97, + 0x0, 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, 0x29, + 0x20, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, + 0x0, 0x0, + + /* U+30D6 "ブ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0x17, 0x0, 0x2, 0x36, + 0x8a, 0xbe, 0x25, 0x0, 0x5d, 0xb8, 0x64, 0x10, + 0x4e, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30D7 "プ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x34, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x73, 0x0, 0x0, 0x24, + 0x69, 0xbc, 0x10, 0x0, 0x7d, 0xca, 0x86, 0x31, + 0x4e, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30D9 "ベ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, + 0x12, 0x0, 0x2a, 0x1c, 0x0, 0x0, 0x3, 0xcb, + 0x50, 0x4, 0x60, 0x0, 0x0, 0x3c, 0x10, 0xb4, + 0x0, 0x0, 0x0, 0x4, 0xd1, 0x0, 0x1c, 0x40, + 0x0, 0x0, 0x3c, 0x20, 0x0, 0x1, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xd8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+30DA "ペ" */ + 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x37, 0x0, 0x0, 0x0, 0x0, + 0x35, 0x2, 0x78, 0x0, 0x0, 0x0, 0x5, 0xb9, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x5b, 0x0, 0x97, + 0x0, 0x0, 0x0, 0x7, 0xc0, 0x0, 0xb, 0x60, + 0x0, 0x0, 0x29, 0x10, 0x0, 0x0, 0xc6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30DB "ホ" */ + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc6, 0x0, 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x93, 0x13, 0x52, 0x9, 0xaa, + 0xad, 0xb9, 0x88, 0x70, 0x11, 0x0, 0x93, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x30, 0x20, 0x0, 0x7, + 0x0, 0x93, 0x2, 0x80, 0x3, 0x90, 0x9, 0x30, + 0x9, 0x61, 0xd3, 0x0, 0x83, 0x0, 0x2d, 0x13, + 0x0, 0x8d, 0x40, 0x0, 0x30, 0x0, 0x1, 0xc1, + 0x0, 0x0, + + /* U+30DC "ボ" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x20, 0xb3, 0x0, 0x0, 0xe, 0x20, + 0x5a, 0x37, 0x0, 0x0, 0xc, 0x10, 0x7, 0x0, + 0x0, 0x0, 0xb, 0x0, 0x24, 0x10, 0x19, 0x99, + 0x9e, 0x99, 0x88, 0x50, 0x2, 0x20, 0xb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0x0, 0x10, 0x0, + 0x0, 0x70, 0xb, 0x10, 0x27, 0x0, 0x2, 0x90, + 0xb, 0x10, 0x9, 0x60, 0xd, 0x40, 0xb, 0x10, + 0x2, 0xd0, 0x24, 0x1, 0x8d, 0x10, 0x0, 0x30, + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+30DD "ãƒ" */ + 0x0, 0x0, 0x1, 0x2, 0x76, 0x0, 0x0, 0x0, + 0xe2, 0x42, 0x60, 0x0, 0x0, 0xc, 0x10, 0x64, + 0x0, 0x0, 0x0, 0xb0, 0x13, 0x51, 0x1a, 0xaa, + 0x9e, 0x98, 0x77, 0x50, 0x11, 0x0, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x0, 0x20, 0x0, 0x7, + 0x0, 0xb1, 0x2, 0x80, 0x3, 0x90, 0xb, 0x10, + 0x9, 0x61, 0xd3, 0x0, 0xb1, 0x0, 0x2d, 0x13, + 0x1, 0x9e, 0x10, 0x0, 0x30, 0x0, 0x3, 0xb0, + 0x0, 0x0, + + /* U+30DE "マ" */ + 0x0, 0x0, 0x0, 0x1, 0x36, 0x60, 0x4c, 0xba, + 0x99, 0x98, 0x65, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x70, 0x0, 0x0, 0x10, 0x1, 0xa3, 0x0, + 0x0, 0x0, 0x83, 0x18, 0x10, 0x0, 0x0, 0x0, + 0xc, 0x70, 0x0, 0x0, 0x0, 0x0, 0x4, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, + + /* U+30DF "ミ" */ + 0x1, 0x67, 0x20, 0x0, 0x0, 0x3, 0xcc, 0x30, + 0x0, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x78, 0x30, 0x0, 0x0, 0x2, 0xcc, 0x0, + 0x0, 0x0, 0x7, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x85, 0x0, 0x0, 0x0, 0x6, 0xd9, 0x10, + 0x0, 0x0, 0x9, 0xc0, 0x0, 0x0, 0x0, 0x40, + + /* U+30E0 "ム" */ + 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xaa, 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, + 0x0, 0x0, 0x5, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x49, 0x0, 0x20, + 0x0, 0x0, 0xb, 0x10, 0x3, 0x80, 0x0, 0x4, + 0x70, 0x0, 0x8, 0x90, 0x0, 0xb0, 0x26, 0x98, + 0x5d, 0x50, 0xbe, 0xd9, 0x40, 0x0, 0x6a, 0x5, + 0x50, 0x0, 0x0, 0x0, 0x30, + + /* U+30E1 "メ" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5c, + 0x0, 0x0, 0x4, 0x10, 0xd, 0x20, 0x0, 0x0, + 0x6, 0x88, 0x80, 0x0, 0x0, 0x0, 0x5, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xc3, 0xca, 0x0, 0x0, + 0x0, 0xa5, 0x1, 0xd1, 0x0, 0x0, 0x96, 0x0, + 0x1, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x2, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, + + /* U+30E2 "モ" */ + 0x0, 0x0, 0x3, 0x59, 0xc7, 0x0, 0x2, 0xba, + 0xac, 0x31, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x13, 0x10, + 0x14, 0x57, 0x9e, 0x9a, 0xa9, 0x90, 0x17, 0x52, + 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x42, 0x24, 0x20, 0x0, 0x0, + 0x1, 0x8a, 0xa9, 0x20, + + /* U+30E3 "ャ" */ + 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x77, + 0x0, 0x5, 0x10, 0x0, 0x1, 0xc6, 0x98, 0xca, + 0x2, 0x7a, 0x9d, 0x30, 0xa, 0x0, 0x3, 0x0, + 0x75, 0x5, 0x10, 0x0, 0x0, 0x2, 0xa0, 0x10, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, 0x3, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30E4 "ヤ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x49, 0xd3, 0x0, 0x0, 0xc, 0x7a, 0x96, 0x2e, + 0x30, 0x68, 0xaa, 0xa8, 0x0, 0x7, 0x50, 0x3, + 0x40, 0x2, 0xa0, 0x1, 0x80, 0x0, 0x0, 0x0, + 0xc, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+30E5 "ュ" */ + 0x0, 0x0, 0x1, 0x20, 0x0, 0x2, 0xba, 0x99, + 0xf0, 0x0, 0x0, 0x0, 0x4, 0xa0, 0x0, 0x0, + 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x3c, 0xba, 0xac, 0xbc, 0xd5, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+30E7 "ョ" */ + 0x0, 0x0, 0x0, 0x10, 0x7, 0xcb, 0xbb, 0xf3, + 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, 0xd0, + 0x5, 0xcb, 0xaa, 0xb0, 0x0, 0x0, 0x3, 0x90, + 0x0, 0x0, 0x6, 0x70, 0x2c, 0xba, 0xaa, 0x70, + + /* U+30E8 "ヨ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xaa, + 0xbb, 0xbd, 0xd0, 0x0, 0x2, 0x10, 0x0, 0x2f, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x58, 0x0, 0x8, 0xdc, 0xaa, 0xad, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x93, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xc0, 0x0, 0x7e, 0xcb, 0xaa, 0xab, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30E9 "ラ" */ + 0x1, 0x43, 0x45, 0x7a, 0x60, 0x0, 0x78, 0x64, + 0x32, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x23, 0x58, 0xab, 0xe8, 0x5c, 0x97, 0x53, 0x10, + 0xb6, 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0x1d, 0x20, 0x0, 0x0, 0x0, 0xb4, 0x0, + 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, 0x1, 0xb4, + 0x0, 0x0, 0x0, 0x59, 0x10, 0x0, 0x0, 0x2, + 0x20, 0x0, 0x0, 0x0, + + /* U+30EA "リ" */ + 0x0, 0x0, 0x1, 0x2, 0x90, 0x0, 0xc6, 0xf, + 0x0, 0x9, 0x60, 0xd0, 0x0, 0x94, 0xd, 0x0, + 0x9, 0x40, 0xd0, 0x0, 0xa3, 0xe, 0x0, 0xb, + 0x20, 0xa0, 0x0, 0xd0, 0x0, 0x0, 0x2b, 0x0, + 0x0, 0x9, 0x40, 0x0, 0x5, 0x90, 0x0, 0x4, + 0x80, 0x0, 0x3, 0x30, 0x0, 0x0, + + /* U+30EB "ル" */ + 0x0, 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, + 0xa3, 0x0, 0x0, 0x50, 0x0, 0xd, 0x0, 0xa3, + 0x0, 0x4, 0x40, 0x0, 0x1b, 0x0, 0xa3, 0x0, + 0x48, 0x0, 0x0, 0x48, 0x0, 0xa3, 0x6, 0x90, + 0x0, 0x0, 0xa2, 0x0, 0xa5, 0xb8, 0x0, 0x0, + 0x4, 0x70, 0x0, 0xbf, 0x40, 0x0, 0x0, 0x5, + 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, + + /* U+30EC "レ" */ + 0x9, 0x20, 0x0, 0x0, 0x0, 0xc, 0x60, 0x0, + 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, 0xb, + 0x30, 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x2, + 0x50, 0xb, 0x20, 0x0, 0x78, 0x0, 0xb, 0x20, + 0x5b, 0x40, 0x0, 0xb, 0x7c, 0x90, 0x0, 0x0, + 0xa, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30ED "ロ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x55, 0x79, + 0xbc, 0xe2, 0x4d, 0x64, 0x31, 0x0, 0xf4, 0xc, + 0x0, 0x0, 0x2, 0xc0, 0xd, 0x0, 0x0, 0x5, + 0x70, 0xc, 0x0, 0x0, 0x8, 0x30, 0xd, 0x0, + 0x0, 0xc, 0x0, 0xe, 0x67, 0x9b, 0xcf, 0x20, + 0xc, 0x43, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30EF "ワ" */ + 0x0, 0x0, 0x0, 0x0, 0x41, 0x9, 0x98, 0x9b, + 0xbb, 0xbc, 0xd0, 0x97, 0x21, 0x0, 0x0, 0x8a, + 0x8, 0x60, 0x0, 0x0, 0xd, 0x10, 0x86, 0x0, + 0x0, 0x6, 0x80, 0x7, 0x70, 0x0, 0x1, 0xc0, + 0x0, 0x1, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, + 0x0, 0x68, 0x0, 0x0, 0x0, 0x0, 0x49, 0x0, + 0x0, 0x0, 0x0, 0x48, 0x0, 0x0, 0x0, 0x0, + 0x65, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, + 0x0, 0x0, + + /* U+30F3 "ン" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, 0x20, 0x0, + 0x0, 0x2, 0x0, 0x7, 0x80, 0x0, 0x0, 0x90, + 0x0, 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0x20, 0x0, 0x0, 0x0, 0x5, 0xc1, 0x0, 0x0, + 0x0, 0x1, 0xa9, 0x0, 0x0, 0x0, 0x4, 0xbd, + 0x40, 0x0, 0x0, 0x0, 0x1, 0x70, 0x0, 0x0, + 0x0, 0x0, + + /* U+30F6 "ヶ" */ + 0x0, 0xa, 0x10, 0x0, 0x0, 0x0, 0x2d, 0x10, + 0x1, 0x0, 0x0, 0xba, 0x8a, 0xbb, 0x80, 0x5, + 0x72, 0x1a, 0x50, 0x0, 0x15, 0x0, 0xd, 0x10, + 0x0, 0x0, 0x0, 0x58, 0x0, 0x0, 0x0, 0x0, + 0xc0, 0x0, 0x0, 0x0, 0x7, 0x30, 0x0, 0x0, + 0x0, 0x13, 0x0, 0x0, 0x0, + + /* U+30FC "ー" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x46, 0x81, 0x8, + 0xfe, 0xee, 0xdc, 0xcc, 0xbb, 0xbb, 0xa0, 0x4, + 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4E00 "一" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x10, + 0x7, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x80, + + /* U+4E03 "七" */ + 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x2c, 0x80, + 0x0, 0x0, 0x0, 0xe, 0x15, 0x66, 0x40, 0x0, + 0x0, 0x0, 0x15, 0x6f, 0x40, 0x0, 0x0, 0x0, + 0x6, 0x66, 0x40, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x30, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x70, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xa0, + 0x0, 0x0, 0x0, 0xf, 0x20, 0x0, 0x3, 0xf2, + 0x0, 0x0, 0x0, 0x6, 0xbc, 0xcc, 0xcc, 0xa1, + + /* U+4E07 "万" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x46, + 0x66, 0x66, 0x66, 0x66, 0x66, 0xe8, 0x11, 0x0, + 0xc, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x30, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x1f, 0x66, 0x66, + 0x6e, 0x60, 0x0, 0x0, 0x3e, 0x0, 0x0, 0xe, + 0x10, 0x0, 0x0, 0x7a, 0x0, 0x0, 0xf, 0x0, + 0x0, 0x0, 0xc5, 0x0, 0x0, 0xf, 0x0, 0x0, + 0x2, 0xe0, 0x0, 0x0, 0x1e, 0x0, 0x0, 0xa, + 0x60, 0x0, 0x0, 0x3d, 0x0, 0x0, 0x4a, 0x0, + 0x0, 0x0, 0x6b, 0x0, 0x1, 0xa0, 0x0, 0x4, + 0x87, 0xd7, 0x0, 0x17, 0x0, 0x0, 0x0, 0x2d, + 0x90, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+4E08 "丈" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x30, 0x0, 0x60, 0x5, 0x76, + 0x66, 0x66, 0xd8, 0x66, 0x7b, 0x60, 0x0, 0x10, + 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, 0x2, 0x30, + 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x9, 0x0, + 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0x1, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x4b, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdb, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xd7, 0xdb, 0x30, + 0x0, 0x0, 0x0, 0x4, 0xc3, 0x1, 0x9f, 0xc8, + 0x42, 0x0, 0x39, 0x70, 0x0, 0x0, 0x2a, 0xfc, + 0x20, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+4E09 "三" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x0, + 0x0, 0x76, 0x66, 0x66, 0x66, 0x66, 0x89, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x20, 0x0, + 0x0, 0x7, 0x66, 0x66, 0x66, 0x69, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x16, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xc1, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4E0A "上" */ + 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x66, 0x67, 0xd5, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x7, 0x80, + 0x7, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61, + + /* U+4E0B "下" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x46, + 0x66, 0x66, 0x66, 0x66, 0x67, 0xe6, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd7, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, 0x5d, 0x91, + 0x0, 0x0, 0x0, 0x0, 0xd1, 0x1, 0xdc, 0x0, + 0x0, 0x0, 0x0, 0xd1, 0x0, 0x1b, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, + 0x0, + + /* U+4E0D "ä¸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x10, + 0x76, 0x66, 0x66, 0x9c, 0x66, 0x66, 0x85, 0x0, + 0x0, 0x0, 0xc, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7b, 0xb3, 0x6, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0x1b, 0x30, 0x1a, 0x30, 0x0, 0x0, 0x1c, 0x20, + 0xb3, 0x0, 0x1d, 0x60, 0x0, 0x1b, 0x20, 0xb, + 0x30, 0x0, 0x2f, 0x60, 0x29, 0x10, 0x0, 0xb3, + 0x0, 0x0, 0x6a, 0x15, 0x0, 0x0, 0xb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, + + /* U+4E13 "专" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x36, 0x66, 0xaa, 0x66, 0x6a, 0xb0, 0x0, + 0x0, 0x1, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x66, 0x66, 0xf6, 0x66, 0x66, 0x6c, 0xa0, + 0x2, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x86, 0x66, 0x6a, 0x80, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x1d, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x85, 0x7, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xda, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, + + /* U+4E14 "且" */ + 0x0, 0x0, 0x30, 0x0, 0x0, 0x4, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6f, 0x10, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x7, 0x40, + 0x28, 0x66, 0x86, 0x66, 0x66, 0x68, 0x69, 0x80, + + /* U+4E16 "世" */ + 0x0, 0x0, 0x0, 0x6, 0x0, 0x8, 0x20, 0x0, + 0x0, 0x6, 0x0, 0xe, 0x0, 0xe, 0x10, 0x0, + 0x0, 0xe, 0x20, 0xd, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x0, 0xe, 0x7, 0x70, + 0x18, 0x6e, 0x66, 0x6e, 0x66, 0x6e, 0x66, 0x50, + 0x0, 0xe, 0x0, 0xd, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xe, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x7, 0x0, 0x5, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, + 0x0, 0x2e, 0x66, 0x66, 0x66, 0x66, 0x6a, 0x90, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4E21 "両" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x40, + 0x7, 0x66, 0x66, 0x6d, 0x66, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0xc, 0x0, 0x0, 0x3, 0x0, + 0x0, 0xd6, 0x66, 0x6d, 0x66, 0x66, 0x6e, 0x10, + 0x0, 0xd0, 0x0, 0xc, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xd0, 0x2b, 0xc, 0x0, 0xc4, 0xd, 0x0, + 0x0, 0xd0, 0x1b, 0xc, 0x0, 0xc1, 0xd, 0x0, + 0x0, 0xd0, 0x1b, 0xc, 0x0, 0xc1, 0xd, 0x0, + 0x0, 0xd0, 0x1b, 0xc, 0x0, 0xc1, 0xd, 0x0, + 0x0, 0xd0, 0x3c, 0x69, 0x66, 0xd1, 0xd, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0x0, 0x30, 0xd, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0x0, 0x43, 0x4c, 0x0, + 0x0, 0xc0, 0x0, 0x0, 0x0, 0x6, 0xf8, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+4E26 "並" */ + 0x0, 0x4, 0x10, 0x0, 0x0, 0x82, 0x0, 0x0, + 0x0, 0xb, 0x30, 0x0, 0x2e, 0x30, 0x0, 0x0, + 0x0, 0x3f, 0x10, 0x9, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xc2, 0x2, 0x50, 0x39, 0x0, 0x7, 0x66, + 0x6e, 0x66, 0xc7, 0x66, 0x61, 0x0, 0x10, 0x0, + 0xd0, 0xb, 0x30, 0x3, 0x0, 0x6, 0x20, 0xd, + 0x0, 0xb3, 0x2, 0xf3, 0x0, 0x1a, 0x0, 0xd0, + 0xb, 0x30, 0xa7, 0x0, 0x0, 0xc3, 0xd, 0x0, + 0xb3, 0x3a, 0x0, 0x0, 0x8, 0x90, 0xd0, 0xb, + 0x3a, 0x10, 0x0, 0x0, 0x68, 0xd, 0x0, 0xb8, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xd0, 0xb, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0xb3, 0x0, + 0x72, 0x5, 0x76, 0x66, 0x96, 0x68, 0x66, 0x6a, + 0x80, + + /* U+4E2D "中" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, + 0x0, 0x0, 0xa6, 0x66, 0x6e, 0x66, 0x66, 0x6e, + 0x2d, 0x10, 0x0, 0xd1, 0x0, 0x0, 0xe0, 0xd1, + 0x0, 0xd, 0x10, 0x0, 0xe, 0xd, 0x10, 0x0, + 0xd1, 0x0, 0x0, 0xe0, 0xd1, 0x0, 0xd, 0x10, + 0x0, 0xe, 0xd, 0x66, 0x66, 0xe6, 0x66, 0x66, + 0xe0, 0x60, 0x0, 0xd, 0x10, 0x0, 0x5, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, + + /* U+4E3B "主" */ + 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xd0, 0x0, 0x0, 0x0, 0x26, + 0x66, 0x66, 0x6a, 0x66, 0x6c, 0xb0, 0x0, 0x20, + 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb3, 0x0, 0x33, 0x0, 0x0, 0x28, 0x66, 0x6d, + 0x86, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0xb3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x7, 0x1, 0x86, 0x66, 0x66, 0x86, 0x66, 0x67, + 0xa5, + + /* U+4E45 "ä¹…" */ + 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x66, 0x6d, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x67, 0x0, 0x2e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb0, 0x0, 0x88, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x20, 0x0, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x43, 0x0, 0x6, 0x97, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x1d, 0x13, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa5, 0x0, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x80, 0x0, 0x59, 0x0, 0x0, + 0x0, 0x0, 0x69, 0x0, 0x0, 0xb, 0x80, 0x0, + 0x0, 0x7, 0x60, 0x0, 0x0, 0x1, 0xeb, 0x30, + 0x2, 0x62, 0x0, 0x0, 0x0, 0x0, 0x2c, 0x60, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4E4B "之" */ + 0x0, 0x0, 0x0, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, + 0x2, 0x76, 0x66, 0x66, 0x66, 0x8d, 0x10, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x1, 0xd8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7b, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x90, 0x1b, 0x95, 0x32, 0x22, 0x34, 0x51, + 0x3, 0x0, 0x0, 0x5a, 0xce, 0xef, 0xff, 0x30, + + /* U+4E4E "乎" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x6c, 0x20, 0x0, + 0x0, 0x23, 0x68, 0xab, 0xa8, 0x62, 0x0, 0x4, + 0x54, 0x32, 0x4b, 0x0, 0x2, 0x0, 0x0, 0x3, + 0x30, 0x3, 0xb0, 0x3, 0xd1, 0x0, 0x0, 0xb, + 0x40, 0x3b, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x4e, + 0x3, 0xb0, 0x37, 0x0, 0x0, 0x0, 0x0, 0x60, + 0x3b, 0x5, 0x0, 0x14, 0x6, 0x76, 0x66, 0x68, + 0xd6, 0x66, 0x69, 0xa1, 0x0, 0x0, 0x0, 0x3b, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x41, 0x6b, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, + 0x0, + + /* U+4E4F "ä¹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, + 0x0, 0x0, 0x24, 0x7a, 0xed, 0xc3, 0x0, 0x5, + 0x66, 0x78, 0x42, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3c, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x36, 0x66, + 0x66, 0x86, 0x6a, 0x70, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x8, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1b, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, 0x96, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0x92, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0x0, 0x7a, 0x63, 0x22, 0x23, + 0x45, 0x10, 0x20, 0x0, 0x16, 0xac, 0xde, 0xff, + 0x40, + + /* U+4E57 "ä¹—" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0xa7, 0x0, + 0x0, 0x45, 0x55, 0x67, 0xd9, 0x87, 0x66, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x46, 0x66, 0x66, 0xe6, 0x66, 0xab, 0x0, + 0x0, 0x11, 0x6, 0x0, 0xd0, 0x16, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0x0, 0xd0, 0x3b, 0x2, 0x30, + 0x6, 0x76, 0x6d, 0x66, 0xe6, 0x7c, 0x68, 0x80, + 0x0, 0x0, 0x1c, 0x0, 0xd0, 0x3b, 0x0, 0x0, + 0x0, 0x46, 0x6d, 0x66, 0xe6, 0x7c, 0x9c, 0x10, + 0x0, 0x11, 0x0, 0x7b, 0xd6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xc1, 0xd1, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0x10, 0xd0, 0x4c, 0x10, 0x0, + 0x0, 0x8, 0x70, 0x0, 0xd0, 0x5, 0xe9, 0x30, + 0x5, 0x61, 0x0, 0x0, 0xe0, 0x0, 0x2c, 0xc3, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + + /* U+4E5D "ä¹" */ + 0x0, 0x0, 0xa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xc0, 0x0, 0x40, 0x0, 0x0, 0x5, 0x65, + 0x6d, 0x66, 0x6e, 0x20, 0x0, 0x0, 0x0, 0x2, + 0xa0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x48, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x8, 0x50, + 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, + 0xd, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0x0, 0x9, 0x30, 0x0, 0xd, + 0x0, 0x3, 0x0, 0x4, 0x90, 0x0, 0x0, 0xd0, + 0x0, 0x70, 0x1, 0x90, 0x0, 0x0, 0xe, 0x0, + 0xb, 0x2, 0x70, 0x0, 0x0, 0x0, 0xbd, 0xcc, + 0xd2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+4E5F "也" */ + 0x0, 0x0, 0x0, 0x7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x30, 0xc, 0x10, 0x0, 0x20, 0x0, 0x0, + 0xa3, 0x0, 0xc1, 0x1, 0x6f, 0x20, 0x0, 0xa, + 0x30, 0xc, 0x67, 0x61, 0xd0, 0x0, 0x0, 0xa4, + 0x57, 0xe2, 0x0, 0xd, 0x0, 0x0, 0x5c, 0x81, + 0xc, 0x10, 0x2, 0xb0, 0x0, 0x61, 0xa3, 0x0, + 0xc1, 0x0, 0x3a, 0x0, 0x0, 0xa, 0x30, 0xc, + 0x12, 0x18, 0x70, 0x0, 0x0, 0xa3, 0x0, 0xc1, + 0x4d, 0xe1, 0x0, 0x0, 0xa, 0x30, 0xd, 0x10, + 0x10, 0x5, 0x0, 0x0, 0xa3, 0x0, 0x50, 0x0, + 0x0, 0x70, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0xa, 0x30, 0x0, 0x6e, 0xcc, 0xcc, 0xcc, 0xcc, + 0xe6, + + /* U+4E86 "了" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x3, 0x76, + 0x66, 0x66, 0x66, 0x7f, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x2b, 0x40, 0x0, 0x0, 0x0, 0x0, 0x47, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x94, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x5, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, + 0x0, 0x0, + + /* U+4E88 "予" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, + 0x6, 0x76, 0x66, 0x66, 0x7e, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0x50, 0x0, 0x0, 0x0, + 0x1, 0x76, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7e, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb5, 0x0, 0x5, 0x20, 0x47, 0x66, 0x66, + 0x6e, 0x66, 0x66, 0xfa, 0x0, 0x0, 0x0, 0x1, + 0xd0, 0x0, 0x85, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x21, 0x3d, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x8f, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, + 0x0, + + /* U+4E89 "争" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0x76, 0x6b, 0x80, 0x0, 0x0, + 0x0, 0x1, 0xc2, 0x0, 0x3c, 0x20, 0x0, 0x0, + 0x0, 0xa, 0x10, 0x0, 0x90, 0x0, 0x20, 0x0, + 0x1, 0x75, 0x76, 0x6b, 0x76, 0x67, 0xd0, 0x0, + 0x4, 0x0, 0x0, 0xb, 0x20, 0x3, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x3, 0xa5, 0x60, + 0x7, 0x66, 0x66, 0x6d, 0x76, 0x67, 0xc6, 0x50, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x3, 0xa0, 0x0, + 0x0, 0x26, 0x66, 0x6d, 0x76, 0x67, 0xa0, 0x0, + 0x0, 0x1, 0x0, 0xb, 0x20, 0x1, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0xd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xef, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0x0, 0x0, + + /* U+4E8B "事" */ + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd3, 0x0, 0x0, 0x10, 0x5, + 0x66, 0x66, 0x6e, 0x66, 0x66, 0xae, 0x20, 0x10, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0x66, 0x6e, 0x66, 0x6c, 0x40, 0x0, 0x0, 0xa2, + 0x0, 0xe0, 0x0, 0xc2, 0x0, 0x0, 0xa, 0x76, + 0x6e, 0x66, 0x6d, 0x20, 0x0, 0x0, 0x40, 0x0, + 0xe0, 0x0, 0x50, 0x0, 0x0, 0x27, 0x66, 0x6e, + 0x66, 0x6d, 0x50, 0x0, 0x0, 0x0, 0x0, 0xe0, + 0x0, 0xc2, 0x81, 0x27, 0x66, 0x66, 0x6e, 0x66, + 0x6d, 0x77, 0x40, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0xc2, 0x0, 0x0, 0x37, 0x66, 0x6e, 0x66, 0x6d, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x28, 0xed, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, + + /* U+4E8C "二" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, + 0x0, 0x27, 0x66, 0x66, 0x66, 0x67, 0xa4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0x40, + 0x7, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, + + /* U+4E94 "五" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x76, 0x66, 0x68, 0x66, 0x66, 0xab, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x85, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x37, 0x66, 0xc8, 0x66, 0x6e, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xc0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x90, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x70, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x40, 0x0, 0x1c, 0x6, 0x40, + 0x7, 0x66, 0x68, 0x66, 0x66, 0x68, 0x68, 0x80, + + /* U+4E9B "些" */ + 0x0, 0x0, 0x8, 0x0, 0x8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x50, 0xd, 0x0, 0xd, 0x0, 0x2b, 0x10, + 0x0, 0xd2, 0xe, 0x6c, 0x2d, 0x2, 0xc5, 0x0, + 0x0, 0xd0, 0xd, 0x0, 0xd, 0x47, 0x0, 0x0, + 0x0, 0xd0, 0xd, 0x0, 0xd, 0x20, 0x0, 0x40, + 0x0, 0xd0, 0xd, 0x0, 0xd, 0x0, 0x0, 0x70, + 0x0, 0xd0, 0xd, 0x55, 0x2d, 0x20, 0x5, 0xc0, + 0xa, 0xe9, 0x74, 0x0, 0x4, 0xaa, 0xaa, 0x50, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, + 0x0, 0x7, 0x66, 0x66, 0x66, 0x6a, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x20, + 0x6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x78, 0x60, + + /* U+4EA1 "亡" */ + 0x0, 0x0, 0x0, 0x17, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x10, + 0x5, 0x66, 0x66, 0x66, 0x86, 0x66, 0x6b, 0xe2, + 0x1, 0x11, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0x4, 0xe6, 0x66, 0x66, 0x66, 0xad, 0x20, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4EA4 "交" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2a, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xb0, 0x0, 0x2, 0x0, + 0x5, 0x66, 0x66, 0x66, 0x96, 0x66, 0x6f, 0x80, + 0x1, 0x0, 0x5, 0x0, 0x2, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0x20, 0x0, 0x78, 0x10, 0x0, + 0x0, 0x5, 0xb1, 0x0, 0x0, 0x15, 0xe4, 0x0, + 0x0, 0x67, 0x5, 0x0, 0x5, 0xd1, 0x7b, 0x0, + 0x4, 0x20, 0x5, 0x20, 0xa, 0x60, 0x1, 0x0, + 0x0, 0x0, 0x0, 0x90, 0x1d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x65, 0xa5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7a, 0xc5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3a, 0x50, 0x1a, 0xc6, 0x20, 0x0, + 0x0, 0x47, 0x60, 0x0, 0x0, 0x3a, 0xff, 0xb1, + 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0x10, + + /* U+4EA6 "亦" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0x20, 0x0, 0x10, 0x4, 0x66, + 0x66, 0x66, 0xd6, 0x66, 0x6d, 0xb0, 0x11, 0x0, + 0xe, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe0, 0x1, 0xc0, 0x0, 0x0, 0x0, 0xa6, 0xe, + 0x0, 0x1c, 0x21, 0x0, 0x0, 0xe, 0x10, 0xe0, + 0x1, 0xc0, 0x91, 0x0, 0x4, 0x80, 0x2c, 0x0, + 0x1c, 0x2, 0xc1, 0x0, 0xa1, 0x4, 0x90, 0x1, + 0xc0, 0x9, 0xa0, 0x26, 0x0, 0xa5, 0x0, 0x1c, + 0x0, 0x2f, 0x4, 0x0, 0x1c, 0x0, 0x1, 0xc0, + 0x0, 0x50, 0x0, 0xa, 0x30, 0x0, 0x1c, 0x0, + 0x0, 0x0, 0x8, 0x30, 0x3, 0x79, 0xc0, 0x0, + 0x0, 0x17, 0x10, 0x0, 0x2, 0xd5, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4EAC "京" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x10, 0x0, 0x50, 0x5, 0x76, + 0x66, 0x66, 0x86, 0x66, 0x6b, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa6, + 0x66, 0x66, 0x6b, 0x40, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x0, 0xf6, 0x66, 0xc6, + 0x6d, 0x10, 0x0, 0x0, 0x2, 0x20, 0x1d, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0x31, 0xd0, 0x38, + 0x0, 0x0, 0x0, 0x2c, 0x30, 0x1d, 0x0, 0x5c, + 0x10, 0x0, 0x3a, 0x10, 0x2, 0xd0, 0x0, 0x9b, + 0x0, 0x45, 0x0, 0x29, 0xeb, 0x0, 0x1, 0x80, + 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, 0x0, + + /* U+4EBA "人" */ + 0x0, 0x0, 0x0, 0x1b, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5c, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6a, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa7, 0x64, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe3, 0x1a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xd0, 0xb, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x60, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x3c, 0x0, 0x0, 0xb8, 0x0, 0x0, + 0x0, 0x1, 0xc2, 0x0, 0x0, 0x1e, 0x70, 0x0, + 0x0, 0x2b, 0x20, 0x0, 0x0, 0x3, 0xfc, 0x50, + 0x4, 0x70, 0x0, 0x0, 0x0, 0x0, 0x3d, 0x61, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4EC0 "什" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x40, 0x0, 0xb3, 0x0, 0x0, 0x0, + 0x2, 0xf1, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, + 0x79, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xd, + 0x20, 0x0, 0xc, 0x10, 0x0, 0x0, 0x4, 0xf3, + 0x0, 0x0, 0xc1, 0x0, 0x20, 0x0, 0xac, 0x47, + 0x66, 0x6d, 0x66, 0x6d, 0x60, 0x37, 0xa3, 0x0, + 0x0, 0xc1, 0x0, 0x0, 0x8, 0xa, 0x30, 0x0, + 0xc, 0x10, 0x0, 0x4, 0x10, 0xa3, 0x0, 0x0, + 0xc1, 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0xc, + 0x10, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, 0xc1, + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0xc, 0x10, + 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, 0xc1, 0x0, + 0x0, 0x0, 0xa, 0x40, 0x0, 0xd, 0x10, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x50, 0x0, 0x0, + + /* U+4ECA "今" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6c, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xe2, 0x54, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x60, 0x9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x79, 0x10, 0x0, 0xc6, 0x0, 0x0, + 0x0, 0x6, 0x90, 0x3a, 0x10, 0xb, 0xc4, 0x0, + 0x0, 0x76, 0x0, 0x6, 0xc0, 0x0, 0x7f, 0xc1, + 0x16, 0x20, 0x0, 0x0, 0x60, 0x0, 0x2, 0x10, + 0x0, 0x5, 0x66, 0x66, 0x66, 0x6a, 0x50, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x2e, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, + + /* U+4ECB "介" */ + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8b, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x16, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x60, 0xa, 0x10, 0x0, 0x0, 0x0, 0x6, + 0xa0, 0x0, 0x1c, 0x30, 0x0, 0x0, 0x5, 0x82, + 0x0, 0x3, 0x2d, 0xa3, 0x0, 0x6, 0x50, 0xb6, + 0x0, 0xb6, 0x1a, 0xf6, 0x15, 0x10, 0xb, 0x20, + 0xb, 0x30, 0x1, 0x0, 0x0, 0x0, 0xb2, 0x0, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0xa, + 0x30, 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, 0xa3, + 0x0, 0x0, 0x0, 0x0, 0x76, 0x0, 0xa, 0x30, + 0x0, 0x0, 0x0, 0x3a, 0x0, 0x0, 0xa3, 0x0, + 0x0, 0x0, 0x57, 0x0, 0x0, 0xa, 0x40, 0x0, + 0x0, 0x22, 0x0, 0x0, 0x0, 0x51, 0x0, 0x0, + + /* U+4ECD "ä»" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xc2, 0x76, 0x66, 0x66, 0xc2, 0x0, + 0x0, 0x9, 0x50, 0x13, 0xa0, 0x1, 0xd0, 0x0, + 0x0, 0xc, 0x0, 0x4, 0x90, 0x5, 0x90, 0x0, + 0x0, 0x7e, 0x30, 0x4, 0x90, 0x8, 0x50, 0x0, + 0x0, 0xac, 0x10, 0x5, 0x80, 0xc, 0x21, 0x20, + 0x7, 0x2c, 0x10, 0x6, 0x70, 0x1c, 0x69, 0xb0, + 0x25, 0xc, 0x10, 0x8, 0x50, 0x0, 0x7, 0x70, + 0x0, 0xc, 0x10, 0xa, 0x20, 0x0, 0x8, 0x50, + 0x0, 0xc, 0x10, 0xd, 0x0, 0x0, 0xa, 0x30, + 0x0, 0xc, 0x10, 0x48, 0x0, 0x0, 0xd, 0x10, + 0x0, 0xc, 0x10, 0xa1, 0x0, 0x0, 0xe, 0x0, + 0x0, 0xc, 0x14, 0x60, 0x0, 0x43, 0x8b, 0x0, + 0x0, 0xd, 0x46, 0x0, 0x0, 0x1a, 0xe3, 0x0, + 0x0, 0x6, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4ED5 "仕" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x93, 0x0, 0x0, 0x0, + 0x1, 0xf2, 0x0, 0xe, 0x20, 0x0, 0x0, 0x0, + 0x6b, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0xc, + 0x30, 0x0, 0xd, 0x10, 0x0, 0x0, 0x2, 0xf3, + 0x0, 0x0, 0xd1, 0x0, 0x30, 0x0, 0xae, 0x47, + 0x66, 0x6e, 0x66, 0x6b, 0x60, 0x28, 0xb3, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x8, 0xb, 0x30, 0x0, + 0xd, 0x10, 0x0, 0x3, 0x10, 0xb3, 0x0, 0x0, + 0xd1, 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0xd, + 0x10, 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0xd, 0x10, + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0xd1, 0x4, + 0x80, 0x0, 0xb, 0x43, 0x76, 0x66, 0x66, 0x66, + 0x10, 0x0, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4ED6 "ä»–" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xe2, 0x0, 0xc, 0x30, 0x0, 0x0, + 0x0, 0x5, 0xa0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x30, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0x0, 0xd3, 0xd, 0x0, 0x26, 0x0, + 0x0, 0x7d, 0x20, 0xd0, 0xd, 0x66, 0x7b, 0x0, + 0x0, 0xbd, 0x24, 0xe6, 0x5d, 0x0, 0x3a, 0x0, + 0x6, 0x4c, 0x22, 0xd0, 0xd, 0x0, 0x3a, 0x0, + 0x7, 0xc, 0x10, 0xd0, 0xd, 0x0, 0x49, 0x0, + 0x20, 0xc, 0x10, 0xd0, 0xd, 0x2, 0x88, 0x0, + 0x0, 0xc, 0x10, 0xd0, 0xd, 0x5, 0xe3, 0x0, + 0x0, 0xc, 0x10, 0xd0, 0xd, 0x0, 0x0, 0x30, + 0x0, 0xc, 0x10, 0xd0, 0x4, 0x0, 0x0, 0x60, + 0x0, 0xc, 0x10, 0xc0, 0x0, 0x0, 0x0, 0xc0, + 0x0, 0xd, 0x10, 0x7c, 0xbb, 0xbb, 0xbc, 0xb1, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4ED8 "付" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0xa3, 0x0, 0x0, + 0x0, 0xe2, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, + 0x4b, 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0xa, + 0x30, 0x0, 0x0, 0xd, 0x23, 0x0, 0x1, 0xf3, + 0x27, 0x66, 0x66, 0xe7, 0x96, 0x0, 0x9d, 0x30, + 0x0, 0x0, 0xd, 0x20, 0x0, 0x28, 0xa3, 0x1, + 0x20, 0x0, 0xd2, 0x0, 0x8, 0xa, 0x30, 0x9, + 0x30, 0xd, 0x20, 0x3, 0x10, 0xa3, 0x0, 0x2f, + 0x10, 0xd2, 0x0, 0x0, 0xa, 0x30, 0x0, 0xb1, + 0xd, 0x20, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, + 0xd2, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0xd, + 0x20, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, 0xd2, + 0x0, 0x0, 0xb, 0x40, 0x0, 0x16, 0xdf, 0x0, + 0x0, 0x0, 0x50, 0x0, 0x0, 0x3, 0x30, 0x0, + + /* U+4EE3 "代" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x10, 0x15, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7b, 0x0, 0x1e, 0x13, 0x92, 0x0, + 0x0, 0x0, 0xd2, 0x0, 0xd, 0x0, 0x4f, 0x20, + 0x0, 0x3, 0xa0, 0x0, 0xe, 0x0, 0x6, 0x10, + 0x0, 0xb, 0xa0, 0x0, 0xd, 0x0, 0x7, 0x50, + 0x0, 0x3c, 0xc1, 0x65, 0x6d, 0x76, 0x54, 0x30, + 0x0, 0xa3, 0xb0, 0x0, 0xa, 0x30, 0x0, 0x0, + 0x6, 0x32, 0xb0, 0x0, 0x7, 0x60, 0x0, 0x0, + 0x4, 0x2, 0xb0, 0x0, 0x4, 0x90, 0x0, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x0, 0xa6, 0x0, 0x11, + 0x0, 0x2, 0xb0, 0x0, 0x0, 0x2e, 0x30, 0x60, + 0x0, 0x2, 0xb0, 0x0, 0x0, 0x6, 0xe3, 0xb0, + 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, 0x5e, 0xf1, + 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x1, 0x72, + + /* U+4EE4 "令" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb6, 0x27, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xb0, 0x8, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x3d, 0x32, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0x2, 0xc2, 0xa, 0x70, 0x1d, 0x70, 0x0, + 0x0, 0x39, 0x10, 0x1, 0xf2, 0x1, 0xce, 0x81, + 0x5, 0x40, 0x0, 0x0, 0x40, 0x7, 0x16, 0x30, + 0x0, 0x4, 0x76, 0x66, 0x66, 0x9f, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0x0, 0x11, 0x0, 0x8, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x94, 0x44, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1a, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, + + /* U+4EE5 "以" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x60, 0x1, 0xe2, + 0x1, 0x0, 0x0, 0x4d, 0x0, 0xe, 0x0, 0x57, + 0x0, 0x4, 0xb0, 0x0, 0xe0, 0x0, 0xc8, 0x0, + 0x4b, 0x0, 0xe, 0x0, 0x5, 0xc0, 0x5, 0xa0, + 0x0, 0xe0, 0x0, 0x2, 0x0, 0x59, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x6, 0x80, 0x0, 0xe0, 0x0, + 0x1, 0x0, 0x96, 0x0, 0xe, 0x0, 0x37, 0x0, + 0xd, 0x30, 0x0, 0xe0, 0x87, 0x0, 0x4, 0xf1, + 0x0, 0x1f, 0xe5, 0x0, 0x0, 0xc4, 0xa4, 0x2, + 0xe4, 0x0, 0x1, 0xb6, 0x1, 0xe5, 0x1, 0x0, + 0x4, 0xb3, 0x0, 0x6, 0xc0, 0x2, 0x67, 0x40, + 0x0, 0x0, 0x5, 0x2, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+4EEE "ä»®" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x5a, 0x0, + 0x0, 0x0, 0xe0, 0x36, 0x56, 0x89, 0x86, 0x20, + 0x0, 0x6, 0x80, 0x49, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x49, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0x10, 0x4b, 0x66, 0x66, 0x7a, 0x0, + 0x0, 0xad, 0x0, 0x48, 0x50, 0x0, 0x88, 0x0, + 0x5, 0x3d, 0x0, 0x58, 0x60, 0x0, 0xb1, 0x0, + 0x14, 0xd, 0x0, 0x67, 0x34, 0x1, 0xc0, 0x0, + 0x0, 0xd, 0x0, 0x85, 0x9, 0x7, 0x60, 0x0, + 0x0, 0xd, 0x0, 0xa2, 0x8, 0x2c, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0x1, 0xe7, 0x0, 0x0, + 0x0, 0xd, 0x3, 0x70, 0x4, 0xdb, 0x0, 0x0, + 0x0, 0xd, 0x7, 0x0, 0x69, 0x8, 0xc3, 0x0, + 0x0, 0xd, 0x34, 0x38, 0x40, 0x0, 0x5f, 0xa0, + 0x0, 0x2, 0x12, 0x30, 0x0, 0x0, 0x1, 0x0, + + /* U+4EF6 "ä»¶" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa6, 0x0, 0x1, 0xd1, 0x0, 0x0, + 0x0, 0x1, 0xf2, 0x6, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x7, 0x90, 0x2e, 0x10, 0xd0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x59, 0x0, 0xd0, 0x5, 0x0, + 0x0, 0x5f, 0x40, 0x97, 0x66, 0xe6, 0x68, 0x30, + 0x0, 0xad, 0x10, 0x90, 0x0, 0xd0, 0x0, 0x0, + 0x6, 0x3c, 0x14, 0x20, 0x0, 0xd0, 0x0, 0x0, + 0x25, 0xc, 0x12, 0x0, 0x0, 0xd0, 0x1, 0x50, + 0x10, 0xc, 0x15, 0x76, 0x66, 0xe6, 0x66, 0x71, + 0x0, 0xc, 0x10, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, + + /* U+4EFB "ä»»" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe2, 0x0, 0x0, 0x27, 0xd5, 0x0, 0x0, + 0x59, 0x25, 0x67, 0xd8, 0x53, 0x10, 0x0, 0xc, + 0x20, 0x0, 0xc, 0x10, 0x0, 0x0, 0x3, 0xe1, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xae, 0x20, + 0x0, 0xc, 0x10, 0x0, 0x0, 0x46, 0xc1, 0x0, + 0x0, 0xc1, 0x0, 0x40, 0x7, 0xc, 0x17, 0x66, + 0x6d, 0x76, 0x6a, 0x43, 0x0, 0xc1, 0x0, 0x0, + 0xc1, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0xc, + 0x10, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0xc1, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0xc, 0x10, + 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0xc1, 0x0, + 0x40, 0x0, 0xd, 0x27, 0x66, 0x69, 0x66, 0x69, + 0x60, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4EFD "份" */ + 0x0, 0x0, 0x32, 0x0, 0x0, 0x43, 0x0, 0x0, + 0x0, 0x0, 0xb9, 0x0, 0xd3, 0x24, 0x0, 0x0, + 0x0, 0x1, 0xe0, 0x4, 0xb0, 0x8, 0x0, 0x0, + 0x0, 0x8, 0x60, 0xb, 0x30, 0x8, 0x10, 0x0, + 0x0, 0x1d, 0x0, 0x3a, 0x0, 0x2, 0xb0, 0x0, + 0x0, 0x8f, 0x30, 0xa1, 0x0, 0x0, 0x8b, 0x10, + 0x3, 0x6d, 0x16, 0x30, 0x0, 0x0, 0x4a, 0xc1, + 0x16, 0xd, 0x43, 0x16, 0xe6, 0x67, 0xd0, 0x0, + 0x10, 0xd, 0x10, 0x0, 0xe0, 0x2, 0xa0, 0x0, + 0x0, 0xd, 0x10, 0x1, 0xd0, 0x3, 0xa0, 0x0, + 0x0, 0xd, 0x10, 0x5, 0x90, 0x3, 0x90, 0x0, + 0x0, 0xd, 0x10, 0xb, 0x20, 0x4, 0x80, 0x0, + 0x0, 0xd, 0x10, 0x57, 0x1, 0x7, 0x70, 0x0, + 0x0, 0xd, 0x15, 0x60, 0x3, 0xcf, 0x20, 0x0, + 0x0, 0x6, 0x41, 0x0, 0x0, 0x1, 0x0, 0x0, + + /* U+4F01 "ä¼" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb8, 0x17, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xb0, 0x4, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0x0, 0x20, 0x7a, 0x0, 0x0, + 0x0, 0x4, 0xa0, 0x1, 0xe1, 0x6, 0xe6, 0x10, + 0x0, 0x66, 0x0, 0x1, 0xd0, 0x0, 0x4e, 0xa1, + 0x15, 0x10, 0x85, 0x1, 0xd0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0xa4, 0x1, 0xe6, 0x6c, 0x70, 0x0, + 0x0, 0x0, 0xa3, 0x1, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa3, 0x1, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa3, 0x1, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa3, 0x1, 0xd0, 0x0, 0x7, 0x20, + 0x7, 0x66, 0x76, 0x66, 0x86, 0x66, 0x69, 0x70, + + /* U+4F0A "伊" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xb3, 0x66, 0x66, 0x66, 0xc3, 0x0, + 0x0, 0xb, 0x30, 0x10, 0xe0, 0x0, 0xe0, 0x0, + 0x0, 0x2b, 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, + 0x0, 0x9e, 0x30, 0x0, 0xe0, 0x0, 0xe0, 0x30, + 0x1, 0x9d, 0x38, 0x66, 0xe6, 0x66, 0xe7, 0x90, + 0x7, 0xd, 0x10, 0x0, 0xe0, 0x0, 0xe0, 0x0, + 0x22, 0xd, 0x10, 0x0, 0xd0, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xd0, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0x15, 0x78, 0xc6, 0x66, 0xe0, 0x0, + 0x0, 0xd, 0x10, 0x7, 0x60, 0x0, 0x20, 0x0, + 0x0, 0xd, 0x10, 0xc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x16, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4F11 "休" */ + 0x0, 0x0, 0x84, 0x0, 0xb, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xe1, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x80, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0xd, 0x0, 0x8, 0x0, + 0x0, 0x4d, 0x37, 0x66, 0xcf, 0x96, 0x66, 0x30, + 0x0, 0xbe, 0x20, 0x0, 0xee, 0x60, 0x0, 0x0, + 0x5, 0x5c, 0x10, 0x4, 0xad, 0x35, 0x0, 0x0, + 0x7, 0xc, 0x10, 0xb, 0x2d, 0xa, 0x0, 0x0, + 0x20, 0xc, 0x10, 0x49, 0xd, 0x7, 0x60, 0x0, + 0x0, 0xc, 0x10, 0xb1, 0xd, 0x0, 0xe3, 0x0, + 0x0, 0xc, 0x17, 0x30, 0xd, 0x0, 0x5e, 0x50, + 0x0, 0xc, 0x44, 0x0, 0xd, 0x0, 0x7, 0x50, + 0x0, 0xc, 0x20, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, + + /* U+4F1A "会" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7d, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xd2, 0x63, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x50, 0xa, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x96, 0x0, 0x0, 0xa9, 0x10, 0x0, + 0x0, 0x8, 0x50, 0x0, 0x1, 0x78, 0xfa, 0x61, + 0x0, 0x73, 0x66, 0x66, 0x66, 0x61, 0x2a, 0x50, + 0x15, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x66, 0x66, 0x66, 0x66, 0x66, 0x9d, 0x10, + 0x0, 0x20, 0x0, 0xc8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xc0, 0x3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x10, 0x2, 0xa2, 0x0, 0x0, + 0x0, 0x2, 0xa1, 0x0, 0x0, 0x2e, 0x50, 0x0, + 0x0, 0xe, 0xcc, 0xba, 0x87, 0x67, 0xf0, 0x0, + 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, 0x60, 0x0, + + /* U+4F1D "ä¼" */ + 0x0, 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd8, 0x0, 0x0, 0x0, 0x60, 0x0, + 0x0, 0x2, 0xd0, 0x18, 0x66, 0x66, 0x62, 0x0, + 0x0, 0x9, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xae, 0x40, 0x0, 0x0, 0x0, 0x8, 0x30, + 0x6, 0x4c, 0x14, 0x76, 0x6e, 0x76, 0x66, 0x50, + 0x25, 0xc, 0x10, 0x0, 0x3e, 0x20, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x86, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0xc0, 0x2, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x7, 0x50, 0x2, 0x70, 0x0, + 0x0, 0xc, 0x10, 0x29, 0x0, 0x0, 0x96, 0x0, + 0x0, 0xc, 0x12, 0xc5, 0x55, 0x66, 0x7f, 0x0, + 0x0, 0xc, 0x21, 0xd9, 0x53, 0x10, 0xe, 0x10, + 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+4F38 "伸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x10, 0x0, 0x3a, 0x0, 0x0, 0x0, + 0x4, 0xc0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, + 0xa4, 0x2, 0x0, 0x2b, 0x0, 0x50, 0x0, 0x1c, + 0x0, 0xe6, 0x67, 0xd6, 0x6e, 0x20, 0x9, 0xf1, + 0xe, 0x0, 0x2b, 0x0, 0xe0, 0x1, 0x9e, 0x0, + 0xe0, 0x2, 0xb0, 0xe, 0x0, 0x81, 0xe0, 0xe, + 0x66, 0x7d, 0x66, 0xe0, 0x22, 0xe, 0x0, 0xe0, + 0x2, 0xb0, 0xe, 0x0, 0x0, 0xe0, 0xe, 0x0, + 0x2b, 0x0, 0xe0, 0x0, 0xe, 0x0, 0xe6, 0x67, + 0xd6, 0x6e, 0x0, 0x0, 0xe0, 0x5, 0x0, 0x2b, + 0x0, 0x50, 0x0, 0xe, 0x0, 0x0, 0x2, 0xb0, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x2b, 0x0, + 0x0, 0x0, 0xf, 0x0, 0x0, 0x3, 0xc0, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x14, 0x0, 0x0, + + /* U+4F3C "ä¼¼" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xd2, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, 0xa8, 0x0, + 0x0, 0xc, 0x20, 0x91, 0x40, 0x0, 0xa5, 0x0, + 0x0, 0x3a, 0x0, 0xd0, 0x1b, 0x0, 0xa4, 0x0, + 0x0, 0x9e, 0x20, 0xd0, 0xb, 0x60, 0xb4, 0x0, + 0x2, 0x9e, 0x0, 0xd0, 0x6, 0x30, 0xc3, 0x0, + 0x8, 0xe, 0x0, 0xd0, 0x0, 0x0, 0xe1, 0x0, + 0x22, 0xe, 0x0, 0xd0, 0x0, 0x1, 0xf0, 0x0, + 0x0, 0xe, 0x0, 0xd0, 0x0, 0x4, 0xc0, 0x0, + 0x0, 0xe, 0x0, 0xd0, 0x46, 0x9, 0x70, 0x0, + 0x0, 0xe, 0x0, 0xda, 0x50, 0x2e, 0x83, 0x0, + 0x0, 0xe, 0x0, 0xe5, 0x0, 0xc4, 0xc, 0x50, + 0x0, 0xe, 0x0, 0x10, 0x1b, 0x30, 0x4, 0xe0, + 0x0, 0xe, 0x0, 0x16, 0x60, 0x0, 0x0, 0x70, + 0x0, 0x5, 0x2, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+4F46 "但" */ + 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xe1, 0x86, 0x66, 0x66, 0x6c, 0x10, + 0x0, 0x8, 0x70, 0xb3, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x10, 0xa3, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x6d, 0x0, 0xa3, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xce, 0x0, 0xa3, 0x0, 0x0, 0xd, 0x0, + 0x7, 0x4d, 0x0, 0xa8, 0x66, 0x66, 0x6d, 0x0, + 0x15, 0xd, 0x0, 0xa3, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xa3, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xb8, 0x66, 0x66, 0x6d, 0x0, + 0x0, 0xd, 0x0, 0xb3, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, + 0x0, 0xe, 0x27, 0x66, 0x66, 0x66, 0x66, 0x93, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4F4D "ä½" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd4, 0x0, 0x62, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xd0, 0x0, 0x1e, 0x10, 0x0, 0x0, + 0x0, 0x8, 0x60, 0x0, 0xc, 0x20, 0x1, 0x0, + 0x0, 0xd, 0x4, 0x66, 0x66, 0x66, 0x7f, 0x40, + 0x0, 0x4e, 0x21, 0x10, 0x0, 0x1, 0x10, 0x0, + 0x0, 0xbe, 0x0, 0x20, 0x0, 0x4, 0xe1, 0x0, + 0x4, 0x5d, 0x0, 0x25, 0x0, 0x7, 0x90, 0x0, + 0x7, 0xd, 0x0, 0xc, 0x0, 0xa, 0x30, 0x0, + 0x10, 0xd, 0x0, 0xa, 0x60, 0xc, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x7, 0xa0, 0x19, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x5, 0x90, 0x54, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x1, 0x10, 0x80, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x70, 0x3, 0x60, + 0x0, 0xd, 0x17, 0x66, 0x66, 0x66, 0x66, 0x61, + 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4F4E "低" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x40, 0x0, + 0x0, 0x3, 0xd0, 0x0, 0x0, 0x5c, 0xd6, 0x0, + 0x0, 0xa, 0x40, 0x96, 0x68, 0xd1, 0x0, 0x0, + 0x0, 0x1c, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x9e, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x0, + 0x2, 0x9d, 0x0, 0xd0, 0x0, 0xd0, 0x1, 0x0, + 0x8, 0xd, 0x0, 0xd6, 0x66, 0xe6, 0x6a, 0x60, + 0x11, 0xd, 0x0, 0xd0, 0x0, 0xa2, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0x0, 0x85, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0x0, 0x4a, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0x2, 0xd, 0x10, 0x40, + 0x0, 0xd, 0x0, 0xd3, 0x83, 0x6, 0xb0, 0x80, + 0x0, 0xd, 0x0, 0xfb, 0x75, 0x0, 0xbb, 0xb0, + 0x0, 0xe, 0x0, 0x40, 0xc, 0x30, 0x8, 0xd0, + 0x0, 0x4, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+4F4F "ä½" */ + 0x0, 0x0, 0x57, 0x0, 0x72, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x70, 0x1, 0xe4, 0x0, 0x0, 0x0, + 0x2, 0xd0, 0x0, 0x8, 0x50, 0x1, 0x0, 0x0, + 0xa4, 0x36, 0x66, 0x66, 0x67, 0xe3, 0x0, 0x3e, + 0x10, 0x10, 0xe, 0x0, 0x0, 0x0, 0xa, 0xe2, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x6, 0x4c, 0x10, + 0x0, 0xe, 0x0, 0x0, 0x2, 0x50, 0xc1, 0x0, + 0x0, 0xe0, 0x6, 0x10, 0x0, 0xc, 0x11, 0x86, + 0x6e, 0x66, 0x75, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0xe0, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0xe, 0x0, + 0x4, 0x0, 0x0, 0xd3, 0x86, 0x66, 0xa6, 0x66, + 0xa5, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+4F53 "体" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc2, 0x0, 0xb, 0x30, 0x0, 0x0, + 0x0, 0x3, 0xc0, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0x9, 0x50, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0x1c, 0x4, 0x66, 0x6d, 0x66, 0x6d, 0x60, + 0x0, 0x7c, 0x21, 0x10, 0xcf, 0x60, 0x0, 0x0, + 0x0, 0xad, 0x0, 0x2, 0xbc, 0x43, 0x0, 0x0, + 0x7, 0x1d, 0x0, 0xa, 0x4c, 0x18, 0x0, 0x0, + 0x23, 0xd, 0x0, 0x2a, 0xc, 0x17, 0x40, 0x0, + 0x0, 0xd, 0x0, 0xa1, 0xc, 0x10, 0xd1, 0x0, + 0x0, 0xd, 0x6, 0x40, 0xc, 0x10, 0x7d, 0x20, + 0x0, 0xd, 0x35, 0x46, 0x6d, 0x69, 0xab, 0x90, + 0x0, 0xd, 0x10, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, + 0x0, 0x3, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, + + /* U+4F55 "何" */ + 0x0, 0x0, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x3, 0x50, + 0x0, 0x5, 0x92, 0x76, 0x66, 0x66, 0xe6, 0x50, + 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x3f, 0x20, 0x30, 0x0, 0x40, 0xd0, 0x0, + 0x0, 0xae, 0x0, 0xe6, 0x68, 0xc0, 0xd0, 0x0, + 0x4, 0x5d, 0x0, 0xd0, 0x3, 0xa0, 0xd0, 0x0, + 0x5, 0xd, 0x0, 0xd0, 0x3, 0xa0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0x3, 0xa0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xe6, 0x68, 0xb0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x80, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x5b, 0xe0, 0x0, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, + + /* U+4F59 "ä½™" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8b, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xd1, 0x46, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x20, 0x6, 0x80, 0x0, 0x0, + 0x0, 0x1, 0xc3, 0x0, 0x0, 0x7c, 0x30, 0x0, + 0x0, 0x1a, 0x76, 0x66, 0x66, 0xd8, 0xfc, 0x60, + 0x5, 0x60, 0x10, 0xc, 0x10, 0x0, 0x2a, 0x30, + 0x21, 0x0, 0x0, 0xc, 0x10, 0x2, 0x50, 0x0, + 0x0, 0x67, 0x66, 0x6d, 0x66, 0x67, 0x70, 0x0, + 0x0, 0x0, 0x31, 0xc, 0x12, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xe7, 0xc, 0x11, 0x95, 0x0, 0x0, + 0x0, 0xb, 0x50, 0xc, 0x10, 0xa, 0xb1, 0x0, + 0x0, 0xa4, 0x0, 0xd, 0x10, 0x0, 0xbb, 0x0, + 0x17, 0x10, 0x17, 0xcf, 0x0, 0x0, 0x17, 0x0, + 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, + + /* U+4F5C "作" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb5, 0x0, 0xb5, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xe1, 0x2, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x80, 0x9, 0x50, 0x0, 0x5, 0x30, + 0x0, 0xc, 0x10, 0x1c, 0x7c, 0x66, 0x66, 0x60, + 0x0, 0x4d, 0x20, 0x83, 0x2b, 0x0, 0x0, 0x0, + 0x0, 0xbd, 0x13, 0x60, 0x2b, 0x0, 0x0, 0x0, + 0x7, 0x3c, 0x15, 0x0, 0x2d, 0x66, 0x7d, 0x10, + 0x14, 0xc, 0x10, 0x0, 0x2b, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x2b, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x2b, 0x0, 0x4, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x2d, 0x66, 0x69, 0x60, + 0x0, 0xc, 0x10, 0x0, 0x2b, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x2b, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x2c, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, + + /* U+4F60 "ä½ " */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa8, 0x0, 0xa4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf3, 0x1, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x90, 0x7, 0x80, 0x0, 0x1, 0x0, + 0x0, 0xc, 0x10, 0xd, 0x76, 0x66, 0x6b, 0xb0, + 0x0, 0x5e, 0x20, 0x66, 0x1, 0x30, 0xb, 0x10, + 0x0, 0xbd, 0x11, 0x80, 0x3, 0xc0, 0x21, 0x0, + 0x7, 0x2c, 0x14, 0x3, 0x3, 0xb0, 0x0, 0x0, + 0x23, 0xc, 0x10, 0xd, 0x53, 0xb0, 0x60, 0x0, + 0x0, 0xc, 0x10, 0x3b, 0x3, 0xb0, 0x48, 0x0, + 0x0, 0xc, 0x10, 0x93, 0x3, 0xb0, 0xb, 0x60, + 0x0, 0xc, 0x12, 0x80, 0x3, 0xb0, 0x3, 0xe0, + 0x0, 0xc, 0x17, 0x0, 0x3, 0xb0, 0x0, 0xb0, + 0x0, 0xc, 0x31, 0x1, 0x4, 0xa0, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x2, 0x9f, 0x80, 0x0, 0x0, + 0x0, 0x3, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, + + /* U+4F7F "使" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x30, 0x0, 0xb3, 0x0, 0x0, 0x0, + 0x3, 0xd0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, + 0x96, 0x46, 0x66, 0xd6, 0x66, 0xa8, 0x0, 0xd, + 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x7, 0xe2, + 0x8, 0x66, 0xd6, 0x66, 0x90, 0x0, 0xad, 0x0, + 0xd0, 0xc, 0x0, 0x1b, 0x0, 0x71, 0xd0, 0xd, + 0x0, 0xc0, 0x1, 0xb0, 0x23, 0xd, 0x0, 0xd6, + 0x6e, 0x66, 0x6b, 0x0, 0x0, 0xd0, 0x7, 0x10, + 0xc0, 0x1, 0x60, 0x0, 0xd, 0x0, 0x6, 0xc, + 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x39, 0x90, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0xc9, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x0, 0x86, 0x6c, 0x72, + 0x0, 0x0, 0xd, 0x4, 0x72, 0x0, 0x18, 0xee, + 0x80, 0x0, 0x32, 0x10, 0x0, 0x0, 0x0, 0x20, + + /* U+4F86 "來" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa4, 0x0, 0x5, 0x40, 0x2, 0x76, + 0x76, 0x6c, 0x86, 0x67, 0x66, 0x0, 0x0, 0x3e, + 0x10, 0xa4, 0x2, 0xe1, 0x0, 0x0, 0x7, 0x80, + 0xa, 0x40, 0x59, 0x0, 0x0, 0x0, 0xc7, 0x70, + 0xa4, 0xa, 0x79, 0x10, 0x0, 0x84, 0xb, 0x4f, + 0x93, 0x70, 0x5a, 0x0, 0x43, 0x0, 0x1b, 0xe8, + 0x80, 0x0, 0x20, 0x0, 0x0, 0x8, 0x9a, 0x48, + 0x40, 0x0, 0x0, 0x0, 0x6, 0xa0, 0xa4, 0xb, + 0x50, 0x0, 0x0, 0x8, 0x80, 0xa, 0x40, 0xc, + 0xa2, 0x0, 0x18, 0x30, 0x0, 0xa4, 0x0, 0x9, + 0xf8, 0x14, 0x0, 0x0, 0xb, 0x50, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, 0x0, + + /* U+4F8B "例" */ + 0x0, 0x3, 0xa0, 0x0, 0x0, 0x0, 0x6, 0x30, + 0x0, 0x79, 0x0, 0x0, 0x42, 0x0, 0xa3, 0x0, + 0xc, 0x36, 0x7e, 0x66, 0x40, 0xa, 0x30, 0x1, + 0xc0, 0x5, 0x80, 0x0, 0xc2, 0xa3, 0x0, 0x8d, + 0x10, 0x93, 0x6, 0xd, 0xa, 0x30, 0xb, 0xd0, + 0xc, 0x66, 0xe2, 0xd0, 0xa3, 0x6, 0x2d, 0x4, + 0x60, 0x3b, 0xd, 0xa, 0x30, 0x50, 0xd0, 0x88, + 0x17, 0x60, 0xd0, 0xa3, 0x0, 0xd, 0x43, 0x48, + 0xd1, 0xd, 0xa, 0x30, 0x0, 0xd0, 0x0, 0x5a, + 0x0, 0xd0, 0xa3, 0x0, 0xd, 0x0, 0xb, 0x10, + 0xb, 0xa, 0x30, 0x0, 0xd0, 0x6, 0x60, 0x0, + 0x0, 0xa3, 0x0, 0xd, 0x4, 0x70, 0x0, 0x0, + 0xa, 0x30, 0x0, 0xe4, 0x40, 0x0, 0x0, 0x4a, + 0xf1, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x14, + 0x0, + + /* U+4F9B "ä¾›" */ + 0x0, 0x0, 0x86, 0x2, 0x80, 0x9, 0x10, 0x0, + 0x0, 0x0, 0xe4, 0x2, 0xa0, 0xd, 0x0, 0x0, + 0x0, 0x5, 0xa0, 0x2, 0xa0, 0xd, 0x0, 0x0, + 0x0, 0xc, 0x20, 0x2, 0xa0, 0xd, 0x7, 0x20, + 0x0, 0x4e, 0x23, 0x77, 0xc6, 0x6e, 0x66, 0x40, + 0x0, 0xbd, 0x0, 0x2, 0xa0, 0xd, 0x0, 0x0, + 0x6, 0x2d, 0x0, 0x2, 0xa0, 0xd, 0x0, 0x0, + 0x23, 0xd, 0x0, 0x2, 0xa0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x26, 0x67, 0xc6, 0x6e, 0x68, 0xd1, + 0x0, 0xd, 0x2, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x5, 0xd0, 0x15, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x1d, 0x20, 0x3, 0xb2, 0x0, + 0x0, 0xd, 0x0, 0xb3, 0x0, 0x0, 0x4f, 0x30, + 0x0, 0xe, 0x8, 0x20, 0x0, 0x0, 0x7, 0x70, + 0x0, 0x6, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4F9D "ä¾" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xd1, 0x0, 0x55, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x90, 0x0, 0xd, 0x40, 0x0, 0x0, + 0x0, 0xc, 0x25, 0x66, 0x6c, 0x76, 0x6d, 0x60, + 0x0, 0x2d, 0x11, 0x0, 0x2e, 0x10, 0x0, 0x0, + 0x0, 0x9e, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x0, + 0x1, 0x8d, 0x0, 0x4, 0x95, 0x0, 0x27, 0x0, + 0x7, 0x1d, 0x0, 0x1b, 0x3, 0x40, 0xc7, 0x0, + 0x13, 0xd, 0x0, 0xae, 0x10, 0x98, 0x20, 0x0, + 0x0, 0xd, 0x8, 0x3d, 0x0, 0xa1, 0x0, 0x0, + 0x0, 0xd, 0x41, 0xd, 0x0, 0x58, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x2d, 0x30, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x17, 0x14, 0xe3, 0x0, + 0x0, 0xd, 0x0, 0xe, 0xb0, 0x0, 0x7f, 0x90, + 0x0, 0xd, 0x0, 0xb, 0x0, 0x0, 0x6, 0x10, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4FA1 "価" */ + 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, 0x73, 0x0, + 0x5, 0x94, 0x76, 0xd6, 0x6d, 0x66, 0x40, 0x0, + 0xc1, 0x0, 0xc, 0x0, 0xb0, 0x0, 0x0, 0x4f, + 0x30, 0x0, 0xc0, 0xb, 0x0, 0x0, 0xa, 0xc0, + 0xc, 0x6d, 0x66, 0xd6, 0xd3, 0x5, 0x3c, 0x0, + 0xd0, 0xc0, 0xb, 0xd, 0x1, 0x40, 0xc0, 0xd, + 0xc, 0x0, 0xb0, 0xd0, 0x0, 0xc, 0x0, 0xd0, + 0xc0, 0xb, 0xd, 0x0, 0x0, 0xc0, 0xd, 0xc, + 0x0, 0xb0, 0xd0, 0x0, 0xc, 0x0, 0xd0, 0xc0, + 0xb, 0xd, 0x0, 0x0, 0xc0, 0xd, 0xc, 0x0, + 0xb0, 0xd0, 0x0, 0xc, 0x0, 0xd6, 0x86, 0x68, + 0x6e, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, 0x0, + 0xc0, 0x0, 0x4, 0x0, 0x30, 0x0, 0x0, 0x1, + 0x0, + + /* U+4FBF "便" */ + 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x2, 0xf7, 0x76, 0x67, 0x66, 0x69, 0xa0, + 0x0, 0x8, 0x70, 0x0, 0xa, 0x20, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xa6, 0x6c, 0x76, 0x6d, 0x20, + 0x0, 0x6b, 0x0, 0xd0, 0xa, 0x20, 0xd, 0x0, + 0x0, 0xbe, 0x0, 0xd0, 0xa, 0x20, 0xd, 0x0, + 0x6, 0x3d, 0x0, 0xd6, 0x6c, 0x76, 0x6d, 0x0, + 0x6, 0xd, 0x0, 0xd0, 0xa, 0x20, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xd6, 0x6c, 0x76, 0x6d, 0x0, + 0x0, 0xd, 0x0, 0x50, 0xc, 0x0, 0x1, 0x0, + 0x0, 0xd, 0x0, 0x6, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x2, 0xa9, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x1, 0xcc, 0x40, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x59, 0x21, 0x9e, 0xb9, 0x81, + 0x0, 0x6, 0x35, 0x20, 0x0, 0x0, 0x37, 0x40, + + /* U+4FC2 "ä¿‚" */ + 0x0, 0x0, 0x96, 0x0, 0x0, 0x0, 0x14, 0x0, + 0x0, 0x0, 0xf3, 0x2, 0x46, 0x9b, 0xdc, 0x40, + 0x0, 0x5, 0xa1, 0x43, 0x2b, 0x80, 0x0, 0x0, + 0x0, 0xc, 0x30, 0x0, 0x89, 0x20, 0x90, 0x0, + 0x0, 0x3e, 0x20, 0x39, 0x40, 0xb, 0xb2, 0x0, + 0x0, 0xae, 0x0, 0xcb, 0x97, 0xd7, 0x0, 0x0, + 0x4, 0x6d, 0x0, 0x0, 0x29, 0x20, 0x44, 0x0, + 0x7, 0xd, 0x0, 0x17, 0x60, 0x0, 0xb, 0x20, + 0x0, 0xd, 0x0, 0xac, 0xa8, 0xd5, 0x48, 0xa0, + 0x0, 0xd, 0x0, 0x1, 0x0, 0xc1, 0x1, 0x30, + 0x0, 0xd, 0x0, 0x9, 0xa0, 0xc1, 0x92, 0x0, + 0x0, 0xd, 0x0, 0x3b, 0x0, 0xc0, 0x1d, 0x40, + 0x0, 0xd, 0x1, 0xa0, 0x0, 0xc0, 0x4, 0xd0, + 0x0, 0xd, 0x6, 0x1, 0x8a, 0xb0, 0x0, 0x30, + 0x0, 0x6, 0x0, 0x0, 0x8, 0x20, 0x0, 0x0, + + /* U+4FDD "ä¿" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb7, 0x11, 0x0, 0x0, 0x30, 0x0, + 0x0, 0x1, 0xe1, 0x3d, 0x66, 0x66, 0xd4, 0x0, + 0x0, 0x6, 0x80, 0x2b, 0x0, 0x0, 0xc0, 0x0, + 0x0, 0xc, 0x10, 0x2b, 0x0, 0x0, 0xc0, 0x0, + 0x0, 0x5e, 0x10, 0x2b, 0x0, 0x0, 0xc0, 0x0, + 0x0, 0xad, 0x0, 0x3d, 0x6b, 0x66, 0xd0, 0x0, + 0x7, 0x2d, 0x0, 0x11, 0xb, 0x10, 0x0, 0x0, + 0x12, 0xd, 0x16, 0x66, 0x6d, 0x66, 0x69, 0xa0, + 0x0, 0xd, 0x1, 0x0, 0x8e, 0x51, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x1, 0xab, 0x18, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xa, 0x2b, 0x16, 0x60, 0x0, + 0x0, 0xd, 0x0, 0x74, 0xb, 0x10, 0xb7, 0x0, + 0x0, 0xd, 0x4, 0x50, 0xb, 0x10, 0x1c, 0xb0, + 0x0, 0xe, 0x23, 0x0, 0xc, 0x20, 0x0, 0x0, + 0x0, 0x3, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, + + /* U+4FE1 "ä¿¡" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa5, 0x0, 0x8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe1, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x0, 0x6, 0x93, 0x66, 0x67, 0xb6, 0x6a, 0x90, + 0x0, 0xc, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4d, 0x10, 0x0, 0x0, 0x0, 0x26, 0x0, + 0x0, 0xbd, 0x0, 0x27, 0x66, 0x66, 0x65, 0x0, + 0x5, 0x5d, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x16, 0xd, 0x0, 0x47, 0x66, 0x66, 0x78, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0xd, 0x0, 0x2b, 0x66, 0x66, 0x7d, 0x0, + 0x0, 0xd, 0x0, 0x1b, 0x0, 0x0, 0x2a, 0x0, + 0x0, 0xd, 0x0, 0x1b, 0x0, 0x0, 0x2a, 0x0, + 0x0, 0xd, 0x0, 0x1d, 0x66, 0x66, 0x7a, 0x0, + 0x0, 0xd, 0x0, 0x2b, 0x0, 0x0, 0x2a, 0x0, + 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4FEE "ä¿®" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0x6, 0x80, 0x0, 0x59, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x20, 0x0, 0xb8, 0x66, 0x7e, 0x20, + 0x0, 0x2b, 0x7, 0x5, 0x57, 0x0, 0xb5, 0x0, + 0x0, 0x9e, 0xc, 0x16, 0x1, 0xab, 0x50, 0x0, + 0x1, 0x9c, 0xc, 0x10, 0x2, 0xbc, 0x30, 0x0, + 0x8, 0x1c, 0xc, 0x0, 0x67, 0x3, 0xac, 0x82, + 0x12, 0xc, 0xc, 0x34, 0x0, 0x7c, 0x12, 0x30, + 0x0, 0xc, 0xc, 0x0, 0x19, 0x60, 0x41, 0x0, + 0x0, 0xc, 0xc, 0x4, 0x61, 0x6, 0xd4, 0x0, + 0x0, 0xc, 0xc, 0x0, 0x2, 0xa7, 0x2, 0x80, + 0x0, 0xc, 0xa, 0x2, 0x77, 0x10, 0x6d, 0x70, + 0x0, 0xc, 0x0, 0x13, 0x0, 0x5b, 0x80, 0x0, + 0x0, 0xc, 0x0, 0x3, 0x79, 0x50, 0x0, 0x0, + 0x0, 0x5, 0x2, 0x53, 0x0, 0x0, 0x0, 0x0, + + /* U+500B "個" */ + 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xf3, 0xb6, 0x66, 0x66, 0x66, 0xb0, + 0x0, 0x7, 0x80, 0xd0, 0x3, 0x30, 0x3, 0xa0, + 0x0, 0xd, 0x10, 0xd0, 0x5, 0x70, 0x3, 0xa0, + 0x0, 0x5e, 0x10, 0xd3, 0x69, 0xa7, 0x93, 0xa0, + 0x0, 0xbd, 0x0, 0xd0, 0x5, 0x60, 0x3, 0xa0, + 0x4, 0x4d, 0x0, 0xd0, 0x5, 0x60, 0x3, 0xa0, + 0x5, 0xd, 0x0, 0xd0, 0xa8, 0x8d, 0x33, 0xa0, + 0x0, 0xd, 0x0, 0xd0, 0xc0, 0xc, 0x3, 0xa0, + 0x0, 0xd, 0x0, 0xd0, 0xc0, 0xc, 0x3, 0xa0, + 0x0, 0xd, 0x0, 0xd0, 0xc6, 0x6d, 0x3, 0xa0, + 0x0, 0xd, 0x0, 0xd0, 0x70, 0x5, 0x3, 0xa0, + 0x0, 0xd, 0x0, 0xd6, 0x66, 0x66, 0x67, 0xa0, + 0x0, 0xe, 0x0, 0xd0, 0x0, 0x0, 0x3, 0xa0, + 0x0, 0x4, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+5011 "們" */ + 0x0, 0x1, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xc1, 0xa6, 0x6c, 0x39, 0x66, 0xd0, + 0x0, 0xa, 0x51, 0xd0, 0x2b, 0x3a, 0x1, 0xc0, + 0x0, 0xd, 0x1, 0xe6, 0x7b, 0x3c, 0x66, 0xc0, + 0x0, 0x5e, 0x11, 0xd0, 0x2b, 0x3a, 0x1, 0xc0, + 0x0, 0xad, 0x1, 0xd0, 0x2b, 0x3a, 0x1, 0xc0, + 0x2, 0x6d, 0x1, 0xe6, 0x79, 0x3a, 0x66, 0xc0, + 0x6, 0xd, 0x1, 0xd0, 0x0, 0x0, 0x1, 0xc0, + 0x0, 0xd, 0x1, 0xd0, 0x0, 0x0, 0x1, 0xc0, + 0x0, 0xd, 0x1, 0xd0, 0x0, 0x0, 0x1, 0xc0, + 0x0, 0xd, 0x1, 0xd0, 0x0, 0x0, 0x1, 0xc0, + 0x0, 0xd, 0x1, 0xd0, 0x0, 0x0, 0x1, 0xc0, + 0x0, 0xd, 0x1, 0xd0, 0x0, 0x0, 0x1, 0xc0, + 0x0, 0xe, 0x1, 0xd0, 0x0, 0x1, 0x7d, 0xa0, + 0x0, 0x4, 0x1, 0x30, 0x0, 0x0, 0x4, 0x10, + + /* U+5019 "候" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x30, 0x0, + 0x0, 0x4, 0xb0, 0x2, 0x86, 0x67, 0xd1, 0x0, + 0x0, 0x9, 0x50, 0x0, 0x0, 0x4, 0x80, 0x0, + 0x0, 0xd, 0x9, 0x40, 0x0, 0x6, 0x60, 0x50, + 0x0, 0x4d, 0xa, 0x27, 0xb7, 0x66, 0x66, 0x50, + 0x0, 0xad, 0xa, 0x20, 0xc2, 0x0, 0x1, 0x0, + 0x4, 0x5d, 0xa, 0x22, 0xb6, 0xa6, 0x78, 0x0, + 0x5, 0xd, 0xa, 0x27, 0x10, 0xd0, 0x0, 0x0, + 0x0, 0xd, 0xa, 0x21, 0x0, 0xe0, 0x2, 0x50, + 0x0, 0xd, 0xa, 0x27, 0x67, 0xd9, 0x66, 0x50, + 0x0, 0xd, 0xa, 0x20, 0x6, 0x77, 0x0, 0x0, + 0x0, 0xd, 0xa, 0x20, 0xc, 0x13, 0x80, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x95, 0x0, 0x98, 0x0, + 0x0, 0xe, 0x0, 0x8, 0x40, 0x0, 0xb, 0xd3, + 0x0, 0x7, 0x1, 0x50, 0x0, 0x0, 0x0, 0x20, + + /* U+501F "借" */ + 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0xa3, 0x6, 0xa0, 0xd, 0x20, 0x0, + 0x0, 0x1, 0xd0, 0x6, 0x70, 0xd, 0x0, 0x0, + 0x0, 0x6, 0x73, 0x69, 0xa6, 0x6e, 0x69, 0x70, + 0x0, 0xc, 0x10, 0x6, 0x70, 0xd, 0x0, 0x0, + 0x0, 0x59, 0x0, 0x6, 0x70, 0xd, 0x0, 0x0, + 0x0, 0xbe, 0x0, 0x6, 0x70, 0xd, 0x1, 0x60, + 0x7, 0x3d, 0x18, 0x66, 0x66, 0x66, 0x66, 0x71, + 0x24, 0xd, 0x0, 0x20, 0x0, 0x0, 0x30, 0x0, + 0x0, 0xd, 0x0, 0xd6, 0x66, 0x66, 0xd5, 0x0, + 0x0, 0xd, 0x0, 0xc1, 0x0, 0x0, 0xc1, 0x0, + 0x0, 0xd, 0x0, 0xc6, 0x66, 0x66, 0xd1, 0x0, + 0x0, 0xd, 0x0, 0xc1, 0x0, 0x0, 0xc1, 0x0, + 0x0, 0xd, 0x0, 0xc1, 0x0, 0x0, 0xc1, 0x0, + 0x0, 0xe, 0x0, 0xd6, 0x66, 0x66, 0xd1, 0x0, + 0x0, 0x7, 0x0, 0x40, 0x0, 0x0, 0x30, 0x0, + + /* U+5024 "値" */ + 0x0, 0x0, 0xa3, 0x0, 0x4, 0x90, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x5, 0x90, 0x0, 0x10, + 0x0, 0x7, 0x76, 0x76, 0x6a, 0xb6, 0x67, 0xc1, + 0x0, 0xc, 0x10, 0x0, 0x9, 0x50, 0x0, 0x0, + 0x0, 0x4e, 0x10, 0x8, 0x6c, 0x86, 0x6b, 0x0, + 0x0, 0xbd, 0x4, 0xd, 0x0, 0x0, 0x2a, 0x0, + 0x5, 0x3d, 0xd, 0x2d, 0x0, 0x0, 0x2a, 0x0, + 0x15, 0xd, 0xd, 0xd, 0x66, 0x66, 0x7a, 0x0, + 0x0, 0xd, 0xd, 0xd, 0x0, 0x0, 0x2a, 0x0, + 0x0, 0xd, 0xd, 0xd, 0x66, 0x66, 0x7a, 0x0, + 0x0, 0xd, 0xd, 0xd, 0x0, 0x0, 0x2a, 0x0, + 0x0, 0xd, 0xd, 0xd, 0x66, 0x66, 0x7b, 0x0, + 0x0, 0xd, 0xd, 0x9, 0x0, 0x0, 0x16, 0x20, + 0x0, 0xe, 0xe, 0x66, 0x66, 0x66, 0x67, 0xf4, + 0x0, 0x8, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+503C "值" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb1, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0x3, 0xb0, 0x0, 0xe, 0x0, 0x3, 0x0, + 0x0, 0x9, 0x57, 0x76, 0x6e, 0x66, 0x7b, 0x30, + 0x0, 0xd, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x6d, 0x10, 0x96, 0x6d, 0x66, 0xc2, 0x0, + 0x0, 0xbd, 0x0, 0xc0, 0x0, 0x0, 0xd0, 0x0, + 0x5, 0x4d, 0x0, 0xc6, 0x66, 0x66, 0xd0, 0x0, + 0x6, 0xd, 0x0, 0xc0, 0x0, 0x0, 0xd0, 0x0, + 0x10, 0xd, 0x0, 0xc0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xc6, 0x66, 0x66, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xc6, 0x66, 0x66, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x46, 0xd6, 0x66, 0x66, 0xe8, 0xd1, + 0x0, 0x7, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+505A "åš" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xb0, 0x24, 0x0, 0xb, 0x10, 0x0, + 0x0, 0x5, 0xa0, 0x48, 0x0, 0x2c, 0x0, 0x0, + 0x0, 0xa, 0x30, 0x37, 0x0, 0x57, 0x0, 0x0, + 0x0, 0xc, 0x0, 0x37, 0x33, 0x83, 0x11, 0x60, + 0x0, 0x6c, 0x28, 0x8a, 0x65, 0xa5, 0x5e, 0x50, + 0x0, 0xba, 0x0, 0x37, 0x0, 0xa0, 0xc, 0x0, + 0x4, 0x7a, 0x0, 0x37, 0x5, 0x60, 0xb, 0x0, + 0x6, 0x2a, 0x9, 0x8a, 0xa4, 0x51, 0x39, 0x0, + 0x0, 0x2a, 0xc, 0x0, 0xb1, 0x25, 0x75, 0x0, + 0x0, 0x2a, 0xc, 0x0, 0xb1, 0x8, 0xb1, 0x0, + 0x0, 0x2a, 0xc, 0x0, 0xb1, 0x8, 0xa0, 0x0, + 0x0, 0x2a, 0xd, 0x66, 0xc1, 0x1c, 0xb0, 0x0, + 0x0, 0x2a, 0xc, 0x0, 0x82, 0xa2, 0x5b, 0x10, + 0x0, 0x3a, 0x6, 0x0, 0x47, 0x0, 0x6, 0xd2, + 0x0, 0x24, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, + + /* U+505C "åœ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x19, 0x20, 0x0, 0x0, + 0x0, 0x6, 0x90, 0x0, 0x5, 0x90, 0x2, 0x50, + 0x0, 0xb, 0x24, 0x76, 0x66, 0x66, 0x66, 0x60, + 0x0, 0x1b, 0x0, 0xa, 0x66, 0x66, 0xb2, 0x0, + 0x0, 0x8d, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xbc, 0x0, 0xe, 0x66, 0x66, 0xe0, 0x0, + 0x6, 0x3c, 0x2, 0x4, 0x0, 0x0, 0x20, 0x20, + 0x3, 0xc, 0xa, 0x66, 0x66, 0x66, 0x66, 0xe3, + 0x0, 0xc, 0x4a, 0x0, 0x0, 0x0, 0x25, 0x10, + 0x0, 0xc, 0x0, 0x67, 0x66, 0xb6, 0x77, 0x0, + 0x0, 0xc, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xc, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xc, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, + 0x0, 0xc, 0x0, 0x0, 0x7c, 0xb0, 0x0, 0x0, + 0x0, 0x4, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, + + /* U+5065 "å¥" */ + 0x0, 0x0, 0xa3, 0x0, 0x0, 0x8, 0x0, 0x0, + 0x0, 0x1, 0xe0, 0x1, 0x0, 0xc, 0x1, 0x0, + 0x0, 0x6, 0x85, 0x7e, 0x6, 0x6d, 0x6d, 0x20, + 0x0, 0xb, 0x10, 0x66, 0x0, 0xc, 0xc, 0x30, + 0x0, 0x3b, 0x0, 0xc1, 0x46, 0x6d, 0x6d, 0x62, + 0x0, 0x9e, 0x3, 0xa1, 0x0, 0xc, 0xc, 0x0, + 0x4, 0x5d, 0xa, 0x8b, 0x64, 0x6d, 0x69, 0x0, + 0x5, 0xd, 0x0, 0xa, 0x10, 0xc, 0x6, 0x0, + 0x0, 0xd, 0x3, 0xc, 0x6, 0x6d, 0x66, 0x20, + 0x0, 0xd, 0x6, 0xb, 0x0, 0xc, 0x1, 0x50, + 0x0, 0xd, 0x4, 0x87, 0x46, 0x6d, 0x66, 0x50, + 0x0, 0xd, 0x0, 0xd4, 0x0, 0xc, 0x0, 0x0, + 0x0, 0xd, 0x4, 0x7a, 0x82, 0x4, 0x0, 0x0, + 0x0, 0xd, 0x35, 0x0, 0x4a, 0xcc, 0xcd, 0xb1, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5074 "å´" */ + 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x1, 0x70, + 0x0, 0x4, 0xc1, 0xb6, 0x6d, 0x10, 0x1, 0xc0, + 0x0, 0x9, 0x51, 0xb0, 0xc, 0xa, 0x31, 0xb0, + 0x0, 0xc, 0x1, 0xb0, 0xc, 0xc, 0x1, 0xb0, + 0x0, 0x4d, 0x1, 0xc6, 0x6c, 0xc, 0x1, 0xb0, + 0x0, 0xaa, 0x1, 0xb0, 0xc, 0xc, 0x1, 0xb0, + 0x3, 0x6a, 0x1, 0xb0, 0xc, 0xc, 0x1, 0xb0, + 0x5, 0x1a, 0x1, 0xc6, 0x6c, 0xc, 0x1, 0xb0, + 0x0, 0x1a, 0x1, 0xb0, 0xc, 0xc, 0x1, 0xb0, + 0x0, 0x1a, 0x1, 0xb0, 0xc, 0xc, 0x1, 0xb0, + 0x0, 0x1a, 0x1, 0xb6, 0x6a, 0x9, 0x1, 0xb0, + 0x0, 0x1a, 0x0, 0x75, 0x42, 0x0, 0x1, 0xb0, + 0x0, 0x1a, 0x2, 0xb1, 0xc, 0x20, 0x1, 0xa0, + 0x0, 0x2b, 0x8, 0x0, 0x7, 0x93, 0x8c, 0x90, + 0x0, 0x13, 0x20, 0x0, 0x1, 0x30, 0x6, 0x0, + + /* U+5099 "å‚™" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x95, 0x2, 0xc0, 0xb, 0x40, 0x0, + 0x0, 0x1, 0xf3, 0x2, 0xb0, 0xb, 0x14, 0x0, + 0x0, 0x6, 0x91, 0x87, 0xc6, 0x6d, 0x68, 0x50, + 0x0, 0xc, 0x20, 0x2, 0xb0, 0xb, 0x10, 0x30, + 0x0, 0x3e, 0x17, 0x67, 0xc6, 0x6a, 0x67, 0xc3, + 0x0, 0xad, 0x0, 0x8, 0xa0, 0x0, 0x0, 0x0, + 0x4, 0x4d, 0x0, 0x4e, 0x66, 0x86, 0x6d, 0x10, + 0x4, 0xd, 0x3, 0xbb, 0x1, 0xc0, 0xd, 0x0, + 0x0, 0xd, 0x46, 0x2c, 0x66, 0xd6, 0x6d, 0x0, + 0x0, 0xd, 0x0, 0x2b, 0x1, 0xc0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0x2c, 0x66, 0xd6, 0x6d, 0x0, + 0x0, 0xd, 0x0, 0x2b, 0x1, 0xc0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0x2b, 0x1, 0xc0, 0xc, 0x0, + 0x0, 0xe, 0x0, 0x2b, 0x1, 0xb5, 0xaa, 0x0, + 0x0, 0x4, 0x0, 0x13, 0x0, 0x0, 0x41, 0x0, + + /* U+50B3 "傳" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0xe, 0x10, 0x0, 0x0, + 0x0, 0x3, 0xd4, 0x66, 0x6e, 0x66, 0x7e, 0x30, + 0x0, 0x9, 0x51, 0x30, 0xd, 0x0, 0x40, 0x0, + 0x0, 0xd, 0x0, 0xd6, 0x6e, 0x66, 0xd3, 0x0, + 0x0, 0x6e, 0x10, 0xd6, 0x6e, 0x66, 0xd1, 0x0, + 0x0, 0xad, 0x0, 0xd0, 0xd, 0x0, 0xc1, 0x0, + 0x6, 0x1d, 0x0, 0xd6, 0x6e, 0x66, 0xa1, 0x0, + 0x13, 0xd, 0x0, 0x0, 0xd, 0x1, 0x95, 0x0, + 0x0, 0xd, 0x9, 0xca, 0x88, 0x67, 0x3c, 0x0, + 0x0, 0xd, 0x1, 0x0, 0x0, 0xd, 0x14, 0x20, + 0x0, 0xd, 0x37, 0x86, 0x66, 0x6e, 0x67, 0x60, + 0x0, 0xd, 0x0, 0x5b, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x7, 0x10, 0xd, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x27, 0xbc, 0x0, 0x0, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, + + /* U+50C5 "僅" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb2, 0x8, 0x40, 0xa, 0x40, 0x0, + 0x0, 0x4, 0xb0, 0x9, 0x30, 0xb, 0x21, 0x20, + 0x0, 0xa, 0x57, 0x6b, 0x76, 0x6c, 0x79, 0x90, + 0x0, 0xd, 0x0, 0x9, 0x30, 0xb, 0x20, 0x0, + 0x0, 0x6d, 0x10, 0x9, 0x7c, 0x7b, 0x10, 0x0, + 0x0, 0xcd, 0x0, 0x30, 0xb, 0x20, 0x23, 0x0, + 0x4, 0x5d, 0x0, 0xd6, 0x6c, 0x76, 0xa8, 0x0, + 0x6, 0xd, 0x0, 0xd0, 0xb, 0x20, 0x76, 0x0, + 0x0, 0xd, 0x0, 0xc6, 0x6c, 0x76, 0x83, 0x0, + 0x0, 0xd, 0x0, 0x66, 0x6c, 0x76, 0xb6, 0x0, + 0x0, 0xd, 0x0, 0x20, 0xb, 0x20, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x56, 0x6c, 0x76, 0xd5, 0x0, + 0x0, 0xd, 0x0, 0x10, 0xb, 0x20, 0x0, 0x0, + 0x0, 0xe, 0x16, 0x66, 0x6c, 0x76, 0x6a, 0xc0, + 0x0, 0x4, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+50CD "åƒ" */ + 0x0, 0xb, 0x40, 0x1, 0x50, 0x7, 0x30, 0x0, + 0x1, 0xf5, 0x6a, 0x97, 0x10, 0xb2, 0x0, 0x0, + 0x69, 0x0, 0xa2, 0x12, 0xa, 0x20, 0x0, 0xb, + 0x48, 0x6c, 0x77, 0x70, 0xa2, 0x20, 0x1, 0xf2, + 0x12, 0xa2, 0x42, 0x8c, 0x7c, 0x60, 0x8f, 0x2, + 0xcc, 0x7c, 0x50, 0xb2, 0xa2, 0xa, 0xb0, 0x2a, + 0xa2, 0xa2, 0xb, 0x1a, 0x15, 0x1b, 0x2, 0xcc, + 0x7c, 0x20, 0xc0, 0xb1, 0x0, 0xb0, 0x2c, 0xc7, + 0xc2, 0xc, 0xb, 0x0, 0xb, 0x1, 0x4a, 0x24, + 0x1, 0xa0, 0xc0, 0x0, 0xb0, 0x46, 0xc7, 0xb4, + 0x55, 0xc, 0x0, 0xb, 0x1, 0x1a, 0x20, 0x9, + 0x0, 0xc0, 0x0, 0xb1, 0x46, 0xc8, 0x54, 0x60, + 0xb, 0x0, 0xc, 0x1b, 0x61, 0x1, 0x70, 0x5d, + 0x80, 0x0, 0x40, 0x0, 0x0, 0x30, 0x0, 0x30, + 0x0, + + /* U+50CF "åƒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x6, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xb0, 0xd, 0x86, 0x6c, 0x60, 0x0, + 0x0, 0xa, 0x40, 0x84, 0x0, 0x47, 0x0, 0x0, + 0x0, 0x1d, 0x4, 0xd6, 0x67, 0xa6, 0x6e, 0x10, + 0x0, 0x8f, 0x23, 0xd0, 0x7, 0x50, 0xe, 0x0, + 0x1, 0x9e, 0x0, 0xd6, 0x6c, 0x86, 0x6e, 0x0, + 0x7, 0xe, 0x0, 0x60, 0x3a, 0x0, 0x15, 0x0, + 0x22, 0xe, 0x0, 0x3, 0xa7, 0x2, 0xd6, 0x0, + 0x0, 0xe, 0x1, 0x76, 0x1c, 0xaa, 0x10, 0x0, + 0x0, 0xe, 0x3, 0x3, 0xb2, 0xd4, 0x30, 0x0, + 0x0, 0xe, 0x1, 0x76, 0xa, 0xd5, 0xa0, 0x0, + 0x0, 0xe, 0x4, 0x2, 0xb4, 0x77, 0x6a, 0x0, + 0x0, 0xe, 0x0, 0x79, 0x10, 0x86, 0xc, 0xb1, + 0x0, 0xe, 0x36, 0x12, 0x7c, 0xe1, 0x1, 0x30, + 0x0, 0x4, 0x0, 0x0, 0x6, 0x20, 0x0, 0x0, + + /* U+50D5 "僕" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc2, 0x0, 0xc1, 0xb3, 0x0, 0x0, + 0x0, 0x3, 0xb1, 0x30, 0xd0, 0xc0, 0x34, 0x0, + 0x0, 0x8, 0x50, 0xb1, 0xd0, 0xc0, 0xb7, 0x0, + 0x0, 0xc, 0x0, 0x62, 0xd0, 0xc5, 0x51, 0x10, + 0x0, 0x4e, 0x17, 0x66, 0xa6, 0xa8, 0x69, 0x90, + 0x0, 0xad, 0x0, 0x9, 0x30, 0xc, 0x10, 0x0, + 0x3, 0x6d, 0x0, 0x2, 0x80, 0x53, 0x34, 0x0, + 0x7, 0xd, 0x2, 0x66, 0x6c, 0x66, 0x66, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xb, 0x1, 0x70, 0x0, + 0x0, 0xd, 0x0, 0x47, 0x6c, 0x66, 0x62, 0x0, + 0x0, 0xd, 0x7, 0x66, 0x7b, 0x66, 0x6b, 0x60, + 0x0, 0xd, 0x0, 0x0, 0xa1, 0x60, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x9, 0x30, 0x1a, 0x20, 0x0, + 0x0, 0xe, 0x3, 0x82, 0x0, 0x1, 0xbc, 0x80, + 0x0, 0x3, 0x33, 0x0, 0x0, 0x0, 0x4, 0x10, + + /* U+50F9 "價" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x4, 0x40, + 0x0, 0xb, 0x54, 0x76, 0xd6, 0x6d, 0x66, 0x50, + 0x0, 0xe, 0x0, 0x86, 0xd6, 0x6d, 0x6a, 0x10, + 0x0, 0x4c, 0x10, 0xb0, 0xc0, 0xb, 0xc, 0x0, + 0x0, 0xad, 0x0, 0xd6, 0xd6, 0x6d, 0x6d, 0x0, + 0x0, 0x9c, 0x0, 0x50, 0x0, 0x0, 0x4, 0x0, + 0x6, 0x2c, 0x0, 0x68, 0x66, 0x66, 0x96, 0x0, + 0x6, 0xc, 0x0, 0x65, 0x0, 0x0, 0x64, 0x0, + 0x10, 0xc, 0x0, 0x59, 0x66, 0x66, 0xa4, 0x0, + 0x0, 0xc, 0x0, 0x59, 0x66, 0x66, 0xa4, 0x0, + 0x0, 0xc, 0x0, 0x55, 0x0, 0x0, 0x64, 0x0, + 0x0, 0xc, 0x0, 0x58, 0x76, 0x67, 0x93, 0x0, + 0x0, 0xc, 0x0, 0x1b, 0x70, 0x3, 0x98, 0x20, + 0x0, 0xd, 0x3, 0x92, 0x0, 0x0, 0x6, 0xe1, + 0x0, 0x4, 0x12, 0x0, 0x0, 0x0, 0x0, 0x20, + + /* U+5104 "å„„" */ + 0x0, 0x3, 0xb0, 0x0, 0x64, 0x0, 0x0, 0x0, + 0x0, 0x89, 0x0, 0x0, 0xd0, 0x1, 0x30, 0x0, + 0xd, 0x21, 0x88, 0x67, 0x6b, 0x67, 0x0, 0x3, + 0xc0, 0x0, 0x58, 0x3, 0xa0, 0x0, 0x0, 0x9e, + 0x25, 0x66, 0xa6, 0xa6, 0x6b, 0x70, 0x19, 0xd0, + 0x22, 0x0, 0x0, 0x2, 0x0, 0x7, 0x1d, 0x0, + 0xb6, 0x66, 0x66, 0xe0, 0x1, 0x40, 0xd0, 0xb, + 0x66, 0x66, 0x6d, 0x0, 0x0, 0xd, 0x0, 0xb1, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd0, 0xa, 0x66, + 0x76, 0x6a, 0x0, 0x0, 0xd, 0x0, 0x18, 0x38, + 0x40, 0x61, 0x0, 0x0, 0xd0, 0x53, 0xb2, 0x17, + 0x42, 0xd1, 0x0, 0xd, 0xd, 0x1b, 0x30, 0x9, + 0x17, 0x40, 0x0, 0xe1, 0x40, 0x7d, 0xcc, 0xd4, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+512A "優" */ + 0x0, 0x2, 0x80, 0x0, 0x0, 0x0, 0x6, 0x0, + 0x0, 0x6, 0xa1, 0x78, 0x6b, 0x66, 0x96, 0x20, + 0x0, 0xb, 0x30, 0xe, 0x55, 0x55, 0xe1, 0x0, + 0x0, 0xc, 0x0, 0xd, 0x66, 0x66, 0xd0, 0x0, + 0x0, 0x5c, 0x0, 0xd, 0x66, 0x66, 0xd0, 0x0, + 0x0, 0xbb, 0x8, 0x6d, 0x66, 0x66, 0xd6, 0xb0, + 0x3, 0x6b, 0x2b, 0x14, 0x49, 0x30, 0x14, 0x70, + 0x6, 0x1b, 0x12, 0x97, 0x51, 0x66, 0x67, 0x0, + 0x0, 0x1b, 0x8, 0x54, 0xca, 0xad, 0x5b, 0x0, + 0x0, 0x1b, 0x0, 0x6, 0x80, 0x0, 0x10, 0x0, + 0x0, 0x1b, 0x0, 0x2e, 0x86, 0x69, 0xe2, 0x0, + 0x0, 0x1b, 0x2, 0x91, 0x84, 0x6b, 0x10, 0x0, + 0x0, 0x1b, 0x3, 0x0, 0x2e, 0xd3, 0x0, 0x0, + 0x0, 0x2c, 0x0, 0x38, 0x81, 0x3a, 0xda, 0x60, + 0x0, 0x13, 0x15, 0x30, 0x0, 0x0, 0x15, 0x10, + + /* U+5143 "å…ƒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x5, 0x76, 0x66, 0x66, 0x69, 0xb1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x3, 0x76, 0x66, 0x86, 0x68, 0x66, 0x7c, 0x40, + 0x0, 0x0, 0x4, 0xb0, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x90, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x60, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x30, 0xf, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x2d, 0x0, 0xf, 0x0, 0x0, 0x60, + 0x0, 0x0, 0xb5, 0x0, 0xf, 0x0, 0x0, 0x80, + 0x0, 0x8, 0x80, 0x0, 0xe, 0x20, 0x4, 0xc0, + 0x0, 0x95, 0x0, 0x0, 0x8, 0xdd, 0xde, 0xa0, + 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5144 "å…„" */ + 0x0, 0x40, 0x0, 0x0, 0x0, 0x51, 0x0, 0x0, + 0xe6, 0x66, 0x66, 0x66, 0xe4, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0xd1, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, + 0xd1, 0x0, 0x0, 0xe6, 0x6d, 0x67, 0xc6, 0xe1, + 0x0, 0x0, 0x70, 0x2c, 0x3, 0xc0, 0x10, 0x0, + 0x0, 0x0, 0x5a, 0x3, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x87, 0x3, 0xc0, 0x0, 0x20, 0x0, 0x0, + 0xc3, 0x3, 0xc0, 0x0, 0x50, 0x0, 0x3, 0xc0, + 0x3, 0xc0, 0x0, 0x71, 0x0, 0x2c, 0x20, 0x2, + 0xc0, 0x0, 0xb7, 0x4, 0x91, 0x0, 0x0, 0xcd, + 0xdd, 0xf8, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5145 "å……" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0x0, 0x0, 0x30, 0x6, 0x76, + 0x66, 0x68, 0x96, 0x66, 0x6b, 0x60, 0x0, 0x0, + 0x9, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xb1, 0x2, 0x50, 0x0, 0x0, 0x0, 0x6, 0x80, + 0x0, 0x3, 0xb3, 0x0, 0x0, 0xc, 0xb8, 0x88, + 0x87, 0x68, 0xf4, 0x0, 0x0, 0x65, 0x6c, 0x10, + 0xe0, 0x8, 0x80, 0x0, 0x0, 0x5, 0x90, 0xe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x86, 0x0, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0x10, 0xe, 0x0, + 0x0, 0x60, 0x0, 0x5, 0x90, 0x0, 0xe0, 0x0, + 0x8, 0x0, 0x4, 0xa0, 0x0, 0xe, 0x0, 0x2, + 0xc0, 0x6, 0x60, 0x0, 0x0, 0x9d, 0xdd, 0xea, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5148 "å…ˆ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x90, 0xa, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x89, 0x0, 0xa3, 0x0, 0x10, 0x0, 0x0, 0xd, + 0x86, 0x6c, 0x86, 0x6b, 0xa0, 0x0, 0x4, 0x90, + 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x90, 0x0, + 0xa, 0x30, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, + 0xa3, 0x0, 0x0, 0x50, 0x7, 0x66, 0x69, 0x88, + 0x89, 0x66, 0x7a, 0x30, 0x0, 0x0, 0x95, 0x4, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xc, 0x20, 0x49, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, 0x4, 0x90, + 0x0, 0x40, 0x0, 0x0, 0x85, 0x0, 0x49, 0x0, + 0x6, 0x10, 0x0, 0x5a, 0x0, 0x4, 0xa0, 0x0, + 0x85, 0x1, 0x86, 0x0, 0x0, 0xc, 0xcc, 0xcd, + 0x60, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5149 "å…‰" */ + 0x0, 0x0, 0x0, 0x3, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x4, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x90, 0x3, 0xa0, 0x8, 0xa0, 0x0, + 0x0, 0x0, 0x6c, 0x3, 0xa0, 0xe, 0x20, 0x0, + 0x0, 0x0, 0xe, 0x13, 0xa0, 0x66, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x3, 0xa0, 0x80, 0x3, 0x20, + 0x5, 0x76, 0x67, 0xa6, 0x8b, 0x66, 0x69, 0x80, + 0x0, 0x0, 0x3, 0xa0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x90, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x50, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x10, 0xd, 0x0, 0x0, 0x50, + 0x0, 0x0, 0x59, 0x0, 0xd, 0x0, 0x0, 0x70, + 0x0, 0x3, 0xa0, 0x0, 0xc, 0x10, 0x0, 0xd1, + 0x0, 0x67, 0x0, 0x0, 0x6, 0xdc, 0xcd, 0xc1, + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+514B "å…‹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x31, 0x3, 0x76, + 0x66, 0x66, 0xd6, 0x66, 0x6a, 0x80, 0x0, 0x0, + 0x0, 0x1b, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa6, + 0x67, 0xc6, 0x6c, 0x40, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xc, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0x0, 0x0, 0xe6, 0x88, 0x6a, + 0x6d, 0x10, 0x0, 0x0, 0x6, 0x9, 0x50, 0xb0, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xd1, 0xb, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x4a, 0x0, 0xb0, 0x0, + 0x6, 0x0, 0x0, 0x2c, 0x10, 0xb, 0x0, 0x1, + 0xa0, 0x2, 0x77, 0x0, 0x0, 0x9b, 0xbb, 0xdc, + 0x13, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+514D "å…" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd8, 0x66, 0x6e, 0x80, 0x0, 0x0, + 0x0, 0x7, 0x80, 0x0, 0x3a, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0x0, 0x0, 0x80, 0x0, 0x60, 0x0, + 0x2, 0xab, 0x86, 0x6c, 0xa6, 0x66, 0xf2, 0x0, + 0x5, 0xa, 0x30, 0xa, 0x60, 0x0, 0xe0, 0x0, + 0x0, 0xa, 0x30, 0xc, 0x40, 0x0, 0xe0, 0x0, + 0x0, 0xb, 0x86, 0x6f, 0x8a, 0x66, 0xe0, 0x0, + 0x0, 0x3, 0x0, 0x2e, 0x3b, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x88, 0x3b, 0x0, 0x0, 0x60, + 0x0, 0x0, 0x3, 0xe1, 0x3b, 0x0, 0x0, 0x80, + 0x0, 0x0, 0x4d, 0x30, 0x2b, 0x0, 0x3, 0xc0, + 0x0, 0x39, 0x70, 0x0, 0xe, 0xcc, 0xce, 0xb1, + 0x4, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5152 "å…’" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x85, 0x74, 0x14, 0x76, 0x6e, 0x10, 0x0, 0xd, + 0x10, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xd1, + 0x5, 0x0, 0x0, 0xe, 0x0, 0x0, 0xd, 0x66, + 0x82, 0x18, 0x66, 0xe0, 0x0, 0x0, 0xd1, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xd, 0x10, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xd6, 0x7d, 0x66, + 0xe6, 0x6c, 0x0, 0x0, 0x1, 0x3, 0xa0, 0xe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, 0x0, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x10, 0xe, 0x0, + 0x0, 0x50, 0x0, 0x4, 0xa0, 0x0, 0xe0, 0x0, + 0x8, 0x0, 0x3, 0xa0, 0x0, 0xf, 0x21, 0x15, + 0xe1, 0x6, 0x70, 0x0, 0x0, 0x7a, 0xbb, 0xa7, + 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+515A "å…š" */ + 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x19, 0x30, 0xd0, 0xb, 0x80, 0x0, 0x0, + 0x0, 0x2f, 0xd, 0x3, 0xb0, 0x0, 0x0, 0x4, + 0x0, 0x40, 0xd0, 0x80, 0x0, 0x60, 0x2, 0xb6, + 0x66, 0x66, 0x66, 0x66, 0x8d, 0x40, 0xd5, 0x3, + 0x0, 0x0, 0x4, 0x5, 0x0, 0x1, 0x0, 0xc6, + 0x66, 0x66, 0xe3, 0x0, 0x0, 0x0, 0xb, 0x10, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0xb6, 0x66, + 0x66, 0xe0, 0x0, 0x0, 0x0, 0x9, 0x1c, 0xb, + 0x15, 0x0, 0x0, 0x0, 0x0, 0x4, 0x90, 0xb1, + 0x0, 0x3, 0x0, 0x0, 0x0, 0xb2, 0xb, 0x10, + 0x0, 0x61, 0x0, 0x0, 0x88, 0x0, 0xb1, 0x0, + 0x7, 0x60, 0x16, 0x83, 0x0, 0x6, 0xdc, 0xcc, + 0xe7, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5165 "å…¥" */ + 0x0, 0x0, 0x15, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0x92, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa5, 0x49, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xd0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x40, 0x6, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x4b, 0x0, 0x0, 0xd6, 0x0, 0x0, + 0x0, 0x1, 0xc1, 0x0, 0x0, 0x3f, 0x40, 0x0, + 0x0, 0x1a, 0x10, 0x0, 0x0, 0x6, 0xf7, 0x0, + 0x1, 0x91, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xc1, + 0x26, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5167 "å…§" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0x10, 0x0, 0x0, 0x1, 0x0, 0x0, 0x64, 0x0, + 0x0, 0x20, 0xa7, 0x66, 0x68, 0xb6, 0x66, 0x7e, + 0xa, 0x30, 0x0, 0x4d, 0x0, 0x2, 0xc0, 0xa3, + 0x0, 0x8, 0xc3, 0x0, 0x2c, 0xa, 0x30, 0x0, + 0xc2, 0x90, 0x2, 0xc0, 0xa3, 0x0, 0x57, 0xb, + 0x20, 0x2c, 0xa, 0x30, 0xb, 0x0, 0x5c, 0x2, + 0xc0, 0xa3, 0x8, 0x10, 0x0, 0xbb, 0x3c, 0xa, + 0x36, 0x20, 0x0, 0x1, 0xa5, 0xc0, 0xa3, 0x10, + 0x0, 0x0, 0x0, 0x2b, 0xa, 0x30, 0x0, 0x0, + 0x1, 0x13, 0xb0, 0xa2, 0x0, 0x0, 0x0, 0x28, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+5168 "å…¨" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4d, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xb0, 0x62, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0x10, 0xb, 0x20, 0x0, 0x0, + 0x0, 0x1, 0xc3, 0x0, 0x0, 0xb6, 0x0, 0x0, + 0x0, 0x1b, 0x30, 0x0, 0x0, 0x4e, 0xd7, 0x30, + 0x3, 0x95, 0x76, 0x6d, 0x76, 0x65, 0x5d, 0x60, + 0x23, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x1, 0x0, 0x0, + 0x0, 0x7, 0x76, 0x6d, 0x76, 0x6c, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x2, 0x0, + 0x4, 0x66, 0x66, 0x6d, 0x76, 0x66, 0x8f, 0x30, + 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5169 "å…©" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x82, 0x5, + 0x76, 0x66, 0x6a, 0x76, 0x66, 0x69, 0x70, 0x0, + 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x0, 0xa, 0x20, 0x0, 0x2, 0x0, 0xe, 0x66, + 0x66, 0xc7, 0x66, 0x66, 0xe2, 0x0, 0xd0, 0x20, + 0xa, 0x22, 0x0, 0xd, 0x0, 0xd, 0x6, 0x10, + 0xa2, 0x16, 0x0, 0xd0, 0x0, 0xd0, 0xb, 0xa, + 0x20, 0x75, 0xd, 0x0, 0xd, 0x2, 0xe7, 0xa2, + 0xa, 0xd1, 0xd0, 0x0, 0xd0, 0x92, 0xea, 0x22, + 0x87, 0x9d, 0x0, 0xd, 0x35, 0xb, 0xb2, 0x80, + 0x2b, 0xd0, 0x0, 0xd5, 0x0, 0x1a, 0x60, 0x0, + 0x2d, 0x0, 0xd, 0x0, 0x0, 0xa2, 0x0, 0x0, + 0xe0, 0x0, 0xd0, 0x0, 0xa, 0x20, 0x16, 0xec, + 0x0, 0x2, 0x0, 0x0, 0x20, 0x0, 0x3, 0x10, + 0x0, + + /* U+516B "å…«" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x60, 0x9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xc0, 0x9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x80, 0xa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x60, 0x8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x30, 0x5, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x10, 0x2, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x0, 0x0, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x68, 0x0, 0x0, 0x84, 0x0, 0x0, + 0x0, 0x0, 0xb2, 0x0, 0x0, 0x2c, 0x0, 0x0, + 0x0, 0x2, 0xa0, 0x0, 0x0, 0xb, 0x70, 0x0, + 0x0, 0xa, 0x10, 0x0, 0x0, 0x2, 0xf5, 0x0, + 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0x6f, 0x70, + 0x4, 0x50, 0x0, 0x0, 0x0, 0x0, 0x8, 0x71, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+516C "å…¬" */ + 0x0, 0x0, 0x12, 0x0, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xe1, 0x9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb5, 0x0, 0x73, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0x0, 0x1, 0xb0, 0x0, 0x0, 0x0, 0xb, + 0x20, 0x0, 0x8, 0x70, 0x0, 0x0, 0x7, 0x60, + 0x2, 0x0, 0xc, 0x50, 0x0, 0x4, 0x70, 0x0, + 0xba, 0x0, 0x2e, 0x81, 0x3, 0x60, 0x0, 0x2e, + 0x10, 0x0, 0x2d, 0x70, 0x20, 0x0, 0xb, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x80, 0x3, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x1a, + 0x0, 0x0, 0x0, 0x0, 0xa1, 0x0, 0x0, 0x4c, + 0x0, 0x0, 0x1, 0xd8, 0x77, 0x77, 0x65, 0xc9, + 0x0, 0x0, 0xa, 0x64, 0x20, 0x0, 0x4, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, + + /* U+516D "å…­" */ + 0x0, 0x0, 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x70, 0x0, 0x2, 0x10, + 0x7, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x70, 0x4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x90, 0x2, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0x0, 0x0, 0x59, 0x0, 0x0, + 0x0, 0x0, 0xc5, 0x0, 0x0, 0xa, 0x80, 0x0, + 0x0, 0x6, 0x90, 0x0, 0x0, 0x1, 0xf6, 0x0, + 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x0, + 0x0, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, + 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5171 "å…±" */ + 0x0, 0x0, 0x8, 0x10, 0x0, 0x91, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x2, 0x0, + 0x3, 0x76, 0x6e, 0x66, 0x66, 0xe6, 0x6b, 0x60, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x20, + 0x17, 0x66, 0x6d, 0x66, 0x66, 0xd6, 0x6b, 0xd2, + 0x1, 0x0, 0x4, 0x20, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0x90, 0x4, 0x82, 0x0, 0x0, + 0x0, 0x1, 0xc6, 0x0, 0x0, 0x1b, 0x91, 0x0, + 0x0, 0x1b, 0x40, 0x0, 0x0, 0x0, 0xae, 0x0, + 0x3, 0x81, 0x0, 0x0, 0x0, 0x0, 0xb, 0x20, + 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5176 "å…¶" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x10, 0x0, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x4, 0x0, + 0x1, 0x86, 0x6e, 0x66, 0x66, 0xe6, 0x7a, 0x30, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x66, 0x66, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x66, 0x66, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x1, 0x0, + 0x5, 0x66, 0x6e, 0x66, 0x66, 0xe6, 0x6d, 0xc1, + 0x1, 0x0, 0x5, 0x40, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0x80, 0x0, 0x97, 0x0, 0x0, + 0x0, 0x6, 0xc2, 0x0, 0x0, 0x9, 0xe4, 0x0, + 0x1, 0x86, 0x0, 0x0, 0x0, 0x0, 0x8d, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + + /* U+5177 "å…·" */ + 0x0, 0x0, 0x86, 0x66, 0x66, 0x6b, 0x10, 0x0, + 0x0, 0x0, 0xb1, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0xb1, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0xb6, 0x66, 0x66, 0x6c, 0x0, 0x0, + 0x0, 0x0, 0xb1, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0xb6, 0x66, 0x66, 0x6c, 0x0, 0x0, + 0x0, 0x0, 0xb1, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0xb6, 0x66, 0x66, 0x6c, 0x0, 0x0, + 0x0, 0x0, 0xb1, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0xb1, 0x0, 0x0, 0x1c, 0xb, 0x40, + 0x7, 0x66, 0x68, 0x66, 0x66, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x5e, 0x20, 0x0, 0x66, 0x0, 0x0, + 0x0, 0x8, 0xa1, 0x0, 0x0, 0x5, 0xd4, 0x0, + 0x2, 0x94, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x0, + 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+5185 "内" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0x20, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0x0, + 0x0, 0x0, 0x39, 0x66, 0x67, 0xe6, 0x66, 0x7d, + 0x2, 0xb0, 0x0, 0x3b, 0x0, 0x3, 0xb0, 0x2b, + 0x0, 0x6, 0x90, 0x0, 0x3b, 0x2, 0xb0, 0x0, + 0xb9, 0x20, 0x3, 0xb0, 0x2b, 0x0, 0x2c, 0xb, + 0x70, 0x3b, 0x2, 0xb0, 0xb, 0x20, 0xc, 0x93, + 0xb0, 0x2b, 0x19, 0x20, 0x0, 0x2e, 0x3b, 0x2, + 0xd6, 0x0, 0x0, 0x0, 0x33, 0xb0, 0x2b, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0x2, 0xb0, 0x0, 0x0, + 0x2, 0x15, 0xa0, 0x2b, 0x0, 0x0, 0x0, 0x39, + 0xf6, 0x1, 0x30, 0x0, 0x0, 0x0, 0x4, 0x0, + + /* U+5186 "円" */ + 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xd, 0x66, + 0x66, 0xa6, 0x66, 0x68, 0xe0, 0xd1, 0x0, 0xd, + 0x0, 0x0, 0x3a, 0xc, 0x10, 0x0, 0xd0, 0x0, + 0x3, 0xa0, 0xc1, 0x0, 0xd, 0x0, 0x0, 0x3a, + 0xc, 0x10, 0x0, 0xd0, 0x0, 0x3, 0xa0, 0xc6, + 0x66, 0x6e, 0x66, 0x66, 0x8a, 0xc, 0x10, 0x0, + 0x0, 0x0, 0x3, 0xa0, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0xc, 0x10, 0x0, 0x0, 0x0, 0x3, + 0xa0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xc, + 0x10, 0x0, 0x0, 0x0, 0x3, 0xa0, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0xd, 0x10, 0x0, 0x0, + 0x5, 0xaf, 0x70, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x40, 0x0, + + /* U+518A "冊" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x66, 0x96, 0x69, 0x66, 0xe3, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd6, 0x40, + 0x7, 0x6e, 0x66, 0xe6, 0x6e, 0x66, 0xe6, 0x60, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0xc, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x10, 0x0, 0x6b, 0xd0, 0x0, + 0x0, 0x3, 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, + + /* U+518D "å†" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x82, 0x0, + 0x28, 0x66, 0x66, 0xc6, 0x66, 0x68, 0x60, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x86, 0x66, 0xe6, 0x66, 0xb4, 0x0, 0x0, 0xd, + 0x10, 0xd, 0x0, 0xc, 0x20, 0x0, 0x0, 0xc1, + 0x0, 0xd0, 0x0, 0xc1, 0x0, 0x0, 0xc, 0x66, + 0x6e, 0x66, 0x6d, 0x10, 0x0, 0x0, 0xc1, 0x0, + 0xd0, 0x0, 0xc1, 0x0, 0x0, 0xc, 0x10, 0xd, + 0x0, 0xc, 0x11, 0x1, 0x66, 0xd6, 0x66, 0xe6, + 0x66, 0xd7, 0xf6, 0x2, 0xc, 0x10, 0x0, 0x0, + 0xc, 0x10, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, + 0xc1, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0xc, + 0x10, 0x0, 0x0, 0xd1, 0x0, 0x1, 0x7d, 0xf0, + 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x33, 0x0, + 0x0, + + /* U+5199 "写" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x91, 0x8, 0x86, + 0x66, 0x66, 0x66, 0x66, 0xf6, 0xe, 0x32, 0x30, + 0x0, 0x0, 0x6, 0x30, 0x25, 0x5, 0xb0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x7, 0xa6, 0x66, 0x66, + 0x7d, 0x20, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x2f, 0x66, 0x66, 0x66, 0x68, 0xc0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x7, 0x60, 0x57, 0x66, 0x66, + 0x66, 0x8b, 0x29, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x31, + 0x3e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, + + /* U+51AC "冬" */ + 0x0, 0x0, 0x3a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x80, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x3, 0xd6, 0x66, 0x6a, 0xe1, 0x0, 0x0, 0x0, + 0xb6, 0x30, 0x2, 0xe3, 0x0, 0x0, 0x0, 0x74, + 0x8, 0x21, 0xc4, 0x0, 0x0, 0x0, 0x54, 0x0, + 0xb, 0xc4, 0x0, 0x0, 0x0, 0x12, 0x0, 0x4, + 0xcc, 0x80, 0x0, 0x0, 0x0, 0x0, 0x19, 0x91, + 0x8, 0xd7, 0x10, 0x0, 0x1, 0x78, 0x21, 0x73, + 0x3, 0xaf, 0xb7, 0x5, 0x50, 0x0, 0x1, 0xca, + 0x0, 0x28, 0x10, 0x0, 0x0, 0x0, 0x0, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x27, 0x97, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, + + /* U+51B7 "冷" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0x10, 0x0, 0x0, + 0x6, 0x10, 0x0, 0x0, 0xac, 0x10, 0x0, 0x0, + 0x2, 0xe2, 0x2, 0x0, 0xe1, 0x80, 0x0, 0x0, + 0x0, 0xa7, 0x5, 0x7, 0x80, 0x74, 0x0, 0x0, + 0x0, 0x20, 0x41, 0xc, 0x30, 0xc, 0x30, 0x0, + 0x0, 0x0, 0x70, 0x93, 0x1c, 0x12, 0xe7, 0x0, + 0x0, 0x3, 0x46, 0x40, 0x9, 0x70, 0x3e, 0xb2, + 0x0, 0xa, 0x42, 0x0, 0x1, 0x11, 0x21, 0x0, + 0x0, 0x69, 0x0, 0x76, 0x66, 0x6c, 0xc0, 0x0, + 0x7, 0xf4, 0x0, 0x0, 0x0, 0x2c, 0x10, 0x0, + 0x0, 0xd1, 0x0, 0x2, 0x10, 0x92, 0x0, 0x0, + 0x1, 0xf1, 0x0, 0x0, 0x99, 0x30, 0x0, 0x0, + 0x1, 0xe0, 0x0, 0x0, 0xd, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + + /* U+51CD "å‡" */ + 0x0, 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x2, + 0x70, 0x0, 0x0, 0xb, 0x10, 0x2, 0x20, 0x7, + 0xc0, 0x76, 0x66, 0xd6, 0x66, 0x87, 0x0, 0xb, + 0x10, 0x30, 0xb, 0x10, 0x3, 0x0, 0x0, 0x5, + 0xe, 0x66, 0xd6, 0x66, 0xe0, 0x0, 0x0, 0x50, + 0xd0, 0xb, 0x10, 0xd, 0x0, 0x0, 0x42, 0xd, + 0x66, 0xd6, 0x66, 0xd0, 0x0, 0x9, 0x0, 0xd0, + 0xb, 0x10, 0xd, 0x0, 0x15, 0x90, 0xe, 0x69, + 0xe9, 0x66, 0xc0, 0x4, 0xe5, 0x0, 0x21, 0xcb, + 0x71, 0x0, 0x0, 0xa, 0x30, 0x0, 0x94, 0xb2, + 0x90, 0x0, 0x0, 0xd3, 0x0, 0x57, 0xb, 0x15, + 0x80, 0x0, 0xf, 0x30, 0x47, 0x0, 0xb1, 0x9, + 0xb2, 0x0, 0x41, 0x34, 0x0, 0xb, 0x10, 0x9, + 0x80, 0x0, 0x1, 0x0, 0x0, 0x50, 0x0, 0x0, + 0x0, + + /* U+51DD "å‡" */ + 0x0, 0x0, 0xc, 0x11, 0x0, 0x0, 0x5, 0x10, + 0x6, 0x70, 0xc, 0x1b, 0x31, 0x76, 0x6e, 0x50, + 0x0, 0xd5, 0xc, 0x50, 0x30, 0x3, 0x53, 0x0, + 0x0, 0x41, 0x3c, 0x0, 0x90, 0x6, 0xb0, 0x0, + 0x0, 0x2, 0x28, 0xaa, 0x91, 0x0, 0xc0, 0x0, + 0x0, 0x6, 0xb, 0x20, 0x5, 0x76, 0x86, 0xc5, + 0x0, 0x7, 0x1c, 0x2, 0x40, 0x1, 0xb0, 0x80, + 0x0, 0x45, 0x76, 0xb7, 0x50, 0x91, 0xb0, 0x0, + 0x5, 0xd1, 0x40, 0x92, 0x10, 0xc1, 0xc6, 0xc1, + 0x3, 0xe1, 0x86, 0xb7, 0xb4, 0xc1, 0xb0, 0x0, + 0x2, 0xc0, 0x0, 0xc2, 0x0, 0xd1, 0xb0, 0x0, + 0x6, 0xb0, 0x2, 0xa8, 0x64, 0x88, 0xb0, 0x0, + 0x3, 0x70, 0xa, 0x11, 0xa8, 0x12, 0xc5, 0x10, + 0x0, 0x0, 0x72, 0x0, 0x26, 0x0, 0x19, 0xf5, + 0x0, 0x1, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + + /* U+51E6 "処" */ + 0x0, 0x4, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x80, 0x0, 0x2, 0x0, 0x40, 0x0, + 0x0, 0xb, 0x20, 0x10, 0xe, 0x67, 0xd0, 0x0, + 0x0, 0xe, 0x66, 0xb8, 0xd, 0x2, 0xb0, 0x0, + 0x0, 0x67, 0x0, 0xa2, 0xc, 0x2, 0xb0, 0x0, + 0x0, 0xb3, 0x0, 0xc0, 0x1b, 0x2, 0xb0, 0x0, + 0x4, 0x55, 0x1, 0xb0, 0x39, 0x2, 0xb0, 0x0, + 0x7, 0x6, 0x15, 0x70, 0x74, 0x2, 0xb0, 0x0, + 0x0, 0x1, 0x7b, 0x20, 0xb0, 0x2, 0xb0, 0x40, + 0x0, 0x0, 0x9b, 0x7, 0x40, 0x2, 0xb0, 0x80, + 0x0, 0x0, 0xac, 0x34, 0x0, 0x0, 0xdb, 0xe3, + 0x0, 0x7, 0x53, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x56, 0x0, 0x2b, 0xd8, 0x53, 0x33, 0x42, + 0x6, 0x30, 0x0, 0x0, 0x27, 0xbd, 0xef, 0xb0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+51FA "出" */ + 0x0, 0x0, 0x0, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x4, 0x70, 0x0, + 0xe0, 0x0, 0xc, 0x10, 0x49, 0x0, 0xe, 0x0, + 0x0, 0xe0, 0x4, 0x90, 0x0, 0xe0, 0x0, 0xe, + 0x0, 0x49, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x7, + 0xb6, 0x66, 0xe6, 0x66, 0x6e, 0x0, 0x1, 0x0, + 0xe, 0x0, 0x0, 0x60, 0x8, 0x20, 0x0, 0xe0, + 0x0, 0x4, 0x30, 0xc2, 0x0, 0xe, 0x0, 0x0, + 0x6a, 0xc, 0x10, 0x0, 0xe0, 0x0, 0x6, 0x80, + 0xc1, 0x0, 0xe, 0x0, 0x0, 0x68, 0xd, 0x10, + 0x0, 0xe0, 0x0, 0x6, 0x80, 0x96, 0x66, 0x66, + 0x66, 0x66, 0x98, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x10, + + /* U+5206 "分" */ + 0x0, 0x0, 0x4, 0x0, 0x71, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xd1, 0x5, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xd4, 0x0, 0x18, 0x0, 0x0, 0x0, 0x0, + 0x6a, 0x0, 0x0, 0x82, 0x0, 0x0, 0x0, 0x1c, + 0x0, 0x0, 0x1, 0xc1, 0x0, 0x0, 0xb, 0x20, + 0x0, 0x0, 0x4, 0xe5, 0x0, 0x8, 0x46, 0x67, + 0x76, 0x66, 0xe4, 0xec, 0x25, 0x10, 0x0, 0x77, + 0x0, 0x2b, 0x0, 0x20, 0x0, 0x0, 0xa, 0x40, + 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x4a, 0x0, 0x0, 0x0, 0x0, 0x58, 0x0, 0x5, + 0x90, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x77, + 0x0, 0x0, 0x0, 0x9, 0x30, 0x0, 0xb, 0x40, + 0x0, 0x0, 0x28, 0x10, 0x0, 0x7f, 0xc0, 0x0, + 0x0, 0x13, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, + 0x0, + + /* U+5207 "切" */ + 0x0, 0x7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x52, 0x0, + 0xc, 0x10, 0x28, 0x68, 0xd6, 0x6c, 0x60, 0x0, + 0xc1, 0x1, 0x10, 0x4b, 0x0, 0xb3, 0x0, 0xc, + 0x55, 0xa8, 0x5, 0xa0, 0xb, 0x31, 0x66, 0xd2, + 0x0, 0x0, 0x78, 0x0, 0xc3, 0x0, 0xc, 0x10, + 0x0, 0x9, 0x60, 0xc, 0x20, 0x0, 0xc1, 0x0, + 0x0, 0xc3, 0x0, 0xd1, 0x0, 0xc, 0x10, 0x2, + 0xe, 0x0, 0xe, 0x10, 0x0, 0xc1, 0x17, 0x16, + 0x90, 0x0, 0xe0, 0x0, 0xd, 0x79, 0x0, 0xd1, + 0x0, 0xe, 0x0, 0x0, 0xe9, 0x0, 0x87, 0x0, + 0x2, 0xd0, 0x0, 0x3, 0x0, 0x68, 0x0, 0x42, + 0x8a, 0x0, 0x0, 0x0, 0x65, 0x0, 0x2, 0xbf, + 0x30, 0x0, 0x0, 0x20, 0x0, 0x0, 0x1, 0x20, + 0x0, + + /* U+520A "刊" */ + 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0xa, 0x20, + 0x67, 0x69, 0x66, 0xa3, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xb2, 0x0, 0x2, 0xb0, 0xe, 0x0, 0x0, + 0xb, 0x20, 0x0, 0x2c, 0x0, 0xe0, 0x0, 0x0, + 0xb2, 0x0, 0x2, 0xc0, 0xe, 0x0, 0x0, 0xb, + 0x20, 0x46, 0x2c, 0x0, 0xe0, 0x18, 0x66, 0xd7, + 0x66, 0x52, 0xc0, 0xe, 0x0, 0x0, 0xb, 0x20, + 0x0, 0x2c, 0x0, 0xe0, 0x0, 0x0, 0xb2, 0x0, + 0x2, 0xc0, 0xe, 0x0, 0x0, 0xb, 0x20, 0x0, + 0x2c, 0x0, 0xe0, 0x0, 0x0, 0xb2, 0x0, 0x2, + 0x60, 0xe, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x24, + 0x4d, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x5e, + 0x90, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x20, + 0x0, + + /* U+5217 "列" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x20, + 0x36, 0x66, 0x66, 0x6e, 0x50, 0x0, 0xe0, 0x0, + 0x10, 0x98, 0x0, 0x0, 0x10, 0xe, 0x0, 0x0, + 0xd, 0x20, 0x0, 0xd, 0x20, 0xe0, 0x0, 0x3, + 0xe6, 0x6a, 0x50, 0xd0, 0xe, 0x0, 0x0, 0xa4, + 0x0, 0xd3, 0xd, 0x0, 0xe0, 0x0, 0x2d, 0x30, + 0x1d, 0x0, 0xd0, 0xe, 0x0, 0x9, 0x1c, 0x17, + 0x80, 0xd, 0x0, 0xe0, 0x5, 0x20, 0x95, 0xd2, + 0x0, 0xd0, 0xe, 0x0, 0x20, 0x2, 0x69, 0x0, + 0xd, 0x0, 0xe0, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0xd0, 0xe, 0x0, 0x0, 0x1b, 0x20, 0x0, 0x1, + 0x0, 0xe0, 0x0, 0x2a, 0x20, 0x0, 0x0, 0x33, + 0x3f, 0x0, 0x46, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, + 0x0, + + /* U+521D "åˆ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x33, 0x24, 0x68, 0x76, 0x66, 0xe3, + 0x6, 0x76, 0x6d, 0x70, 0x9, 0x40, 0x0, 0xe0, + 0x0, 0x0, 0x3b, 0x0, 0xa, 0x30, 0x0, 0xd0, + 0x0, 0x0, 0xc1, 0x46, 0xb, 0x20, 0x1, 0xc0, + 0x0, 0x9, 0xd0, 0xb2, 0xd, 0x0, 0x2, 0xb0, + 0x0, 0x65, 0xd9, 0x20, 0xd, 0x0, 0x3, 0xa0, + 0x5, 0x40, 0xd4, 0xd2, 0x2a, 0x0, 0x4, 0x90, + 0x1, 0x0, 0xd0, 0x54, 0x66, 0x0, 0x6, 0x80, + 0x0, 0x0, 0xd0, 0x0, 0xb0, 0x0, 0x7, 0x60, + 0x0, 0x0, 0xd0, 0x5, 0x60, 0x0, 0x9, 0x50, + 0x0, 0x0, 0xd0, 0x19, 0x0, 0x31, 0x1c, 0x20, + 0x0, 0x0, 0xe1, 0x70, 0x0, 0x3a, 0xfb, 0x0, + 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x40, 0x0, + + /* U+5224 "判" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0xb4, 0x0, + 0x20, 0xd, 0x0, 0x81, 0x0, 0xb, 0x10, 0x9, + 0x30, 0xd0, 0x3d, 0x21, 0x70, 0xb1, 0x0, 0x4e, + 0xd, 0xa, 0x10, 0x1b, 0xb, 0x10, 0x0, 0x90, + 0xd3, 0x30, 0x1, 0xb0, 0xb1, 0x1, 0x66, 0x6e, + 0x66, 0xd4, 0x1b, 0xb, 0x10, 0x2, 0x0, 0xc0, + 0x0, 0x1, 0xb0, 0xb1, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x1b, 0xb, 0x10, 0x56, 0x67, 0xd6, 0x6b, + 0xb2, 0xb0, 0xb1, 0x1, 0x0, 0x67, 0x0, 0x0, + 0x1b, 0xb, 0x10, 0x0, 0xb, 0x10, 0x0, 0x2, + 0xc0, 0xb1, 0x0, 0x6, 0x70, 0x0, 0x0, 0x2, + 0xb, 0x10, 0x3, 0x80, 0x0, 0x0, 0x0, 0x21, + 0xc1, 0x4, 0x60, 0x0, 0x0, 0x0, 0x4, 0xdd, + 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + + /* U+5225 "別" */ + 0x0, 0x10, 0x0, 0x3, 0x0, 0x0, 0x6, 0x10, + 0xd, 0x66, 0x66, 0xd5, 0x0, 0x0, 0xc1, 0x0, + 0xd0, 0x0, 0xb, 0x10, 0x0, 0xc, 0x0, 0xd, + 0x0, 0x0, 0xb1, 0xc, 0x10, 0xc0, 0x0, 0xd6, + 0x66, 0x6d, 0x20, 0xd0, 0xc, 0x0, 0x8, 0x62, + 0x0, 0x50, 0xd, 0x0, 0xc0, 0x0, 0xc, 0x20, + 0x0, 0x0, 0xd0, 0xc, 0x0, 0x0, 0xc6, 0x66, + 0xa3, 0xd, 0x0, 0xc0, 0x0, 0xd, 0x0, 0xd, + 0x0, 0xd0, 0xc, 0x0, 0x1, 0xb0, 0x0, 0xe0, + 0xd, 0x0, 0xc0, 0x0, 0x66, 0x0, 0x2c, 0x0, + 0x70, 0xc, 0x0, 0xb, 0x0, 0x5, 0x90, 0x0, + 0x0, 0xc0, 0x4, 0x60, 0x22, 0xa5, 0x0, 0x1, + 0x2e, 0x0, 0x80, 0x0, 0xbc, 0x0, 0x1, 0x6e, + 0xc0, 0x20, 0x0, 0x1, 0x0, 0x0, 0x0, 0x21, + 0x0, + + /* U+5229 "利" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x27, 0xe5, 0x0, 0x0, 0xc3, 0x2, + 0x56, 0x8f, 0x53, 0x10, 0x0, 0xc, 0x10, 0x0, + 0x0, 0xe0, 0x0, 0xb, 0x20, 0xc1, 0x0, 0x0, + 0xe, 0x0, 0x0, 0xd0, 0xc, 0x10, 0x56, 0x66, + 0xe6, 0x7e, 0x2d, 0x0, 0xc1, 0x1, 0x0, 0x3f, + 0x0, 0x0, 0xd0, 0xc, 0x10, 0x0, 0xa, 0xf4, + 0x0, 0xd, 0x0, 0xc1, 0x0, 0x3, 0xce, 0x5c, + 0x30, 0xd0, 0xc, 0x10, 0x0, 0xb2, 0xe0, 0x5d, + 0xd, 0x0, 0xc1, 0x0, 0x84, 0xe, 0x0, 0x30, + 0xd0, 0xc, 0x10, 0x64, 0x0, 0xe0, 0x0, 0x6, + 0x0, 0xc1, 0x13, 0x0, 0xe, 0x0, 0x0, 0x0, + 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x3, 0x55, + 0xe1, 0x0, 0x0, 0xf, 0x0, 0x0, 0x2, 0xcd, + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x1, 0x0, + + /* U+5230 "到" */ + 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x29, 0x3, + 0x76, 0x69, 0x66, 0x95, 0x0, 0x2, 0xa0, 0x0, + 0x6, 0xd1, 0x0, 0x2, 0x90, 0x2a, 0x0, 0x1, + 0xa0, 0x24, 0x0, 0x3b, 0x2, 0xa0, 0x1, 0x80, + 0x0, 0x78, 0x2, 0xa0, 0x2a, 0x1, 0xeb, 0x8b, + 0x65, 0xd7, 0x2a, 0x2, 0xa0, 0x2, 0x0, 0xf1, + 0x4, 0x42, 0xa0, 0x2a, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x2a, 0x2, 0xa0, 0x26, 0x66, 0xe6, 0x6d, + 0x22, 0xa0, 0x2a, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x3a, 0x2, 0xa0, 0x0, 0x0, 0xe0, 0x0, 0x3, + 0x90, 0x2a, 0x0, 0x0, 0xe, 0x14, 0x63, 0x0, + 0x2, 0xa0, 0x46, 0x9b, 0xb7, 0x20, 0x0, 0x10, + 0x4a, 0x7, 0xa4, 0x0, 0x0, 0x0, 0x3, 0x9f, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, + 0x0, + + /* U+5236 "制" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x93, 0x0, + 0x43, 0xc, 0x0, 0x0, 0x0, 0xa, 0x20, 0x9, + 0x50, 0xc0, 0x21, 0x0, 0x60, 0xa2, 0x0, 0xc6, + 0x6d, 0x68, 0x70, 0x1c, 0xa, 0x20, 0x43, 0x0, + 0xc0, 0x0, 0x0, 0xb0, 0xa2, 0x8, 0x66, 0x6d, + 0x66, 0xb7, 0xb, 0xa, 0x20, 0x0, 0x0, 0xc0, + 0x0, 0x0, 0xb0, 0xa2, 0x0, 0xa6, 0x6d, 0x66, + 0xc1, 0xb, 0xa, 0x20, 0xc, 0x0, 0xc0, 0xc, + 0x0, 0xb0, 0xa2, 0x0, 0xc0, 0xc, 0x0, 0xc0, + 0xb, 0xa, 0x20, 0xc, 0x0, 0xc0, 0xc, 0x1, + 0x70, 0xa2, 0x0, 0xc0, 0xc, 0x49, 0xa0, 0x0, + 0xa, 0x20, 0x7, 0x0, 0xc0, 0x52, 0x0, 0x0, + 0xb2, 0x0, 0x0, 0xc, 0x0, 0x0, 0x5, 0xcf, + 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x30, + + /* U+5238 "券" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x0, 0xe, 0x30, 0x33, 0x0, 0x0, + 0x0, 0x4, 0xc1, 0x2e, 0x0, 0xb7, 0x0, 0x0, + 0x0, 0x0, 0xc3, 0x69, 0x5, 0x40, 0x10, 0x0, + 0x1, 0x66, 0x76, 0xc9, 0x68, 0x67, 0xf4, 0x0, + 0x0, 0x20, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xa0, 0x0, 0x0, 0x1b, 0x20, + 0x17, 0x66, 0x6e, 0x66, 0x6a, 0x76, 0x66, 0x40, + 0x0, 0x0, 0x96, 0x0, 0x0, 0x94, 0x0, 0x0, + 0x0, 0x9, 0x96, 0x66, 0x66, 0x9e, 0xc7, 0x40, + 0x4, 0x71, 0x1, 0xd0, 0x0, 0xa4, 0x3c, 0x80, + 0x11, 0x0, 0x6, 0x80, 0x0, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x10, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xa5, 0x1, 0x1, 0xd0, 0x0, 0x0, + 0x0, 0x49, 0x30, 0x1, 0x9f, 0x80, 0x0, 0x0, + 0x3, 0x30, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + + /* U+523B "刻" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x55, 0x0, 0x0, 0x0, 0x1, 0xd0, + 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, 0x0, 0xc0, + 0x5, 0x66, 0x6b, 0x66, 0xb9, 0xa, 0x20, 0xc0, + 0x1, 0x10, 0x7a, 0x0, 0x0, 0xd, 0x0, 0xc0, + 0x0, 0x1, 0xc1, 0x7, 0x10, 0xd, 0x0, 0xc0, + 0x0, 0x9, 0x20, 0x2e, 0x30, 0xd, 0x0, 0xc0, + 0x0, 0xab, 0x75, 0xc4, 0x0, 0xd, 0x0, 0xc0, + 0x0, 0x21, 0x7, 0x80, 0xc3, 0xd, 0x0, 0xc0, + 0x0, 0x0, 0x68, 0x8, 0xa0, 0xd, 0x0, 0xc0, + 0x0, 0x7, 0x60, 0x5c, 0x0, 0xd, 0x0, 0xc0, + 0x2, 0x72, 0x3, 0xe3, 0x0, 0xb, 0x0, 0xc0, + 0x3, 0x0, 0x4b, 0x1a, 0x60, 0x0, 0x0, 0xc0, + 0x0, 0x7, 0x70, 0x1, 0xf1, 0x0, 0x1, 0xc0, + 0x4, 0x71, 0x0, 0x0, 0x50, 0x2, 0x8f, 0x90, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x10, + + /* U+5247 "則" */ + 0x0, 0x20, 0x0, 0x4, 0x0, 0x0, 0x9, 0x20, + 0xe, 0x66, 0x66, 0xe2, 0x0, 0x0, 0xc0, 0x0, + 0xd0, 0x0, 0xd, 0x0, 0x60, 0xc, 0x0, 0xd, + 0x66, 0x66, 0xd0, 0xd, 0x0, 0xc0, 0x0, 0xd0, + 0x0, 0xd, 0x0, 0xd0, 0xc, 0x0, 0xd, 0x0, + 0x0, 0xd0, 0xd, 0x0, 0xc0, 0x0, 0xd6, 0x66, + 0x6d, 0x0, 0xd0, 0xc, 0x0, 0xd, 0x0, 0x0, + 0xd0, 0xd, 0x0, 0xc0, 0x0, 0xd6, 0x66, 0x6e, + 0x0, 0xd0, 0xc, 0x0, 0xd, 0x0, 0x0, 0xc0, + 0xd, 0x0, 0xc0, 0x0, 0x19, 0x22, 0x40, 0x0, + 0x40, 0xc, 0x0, 0x4, 0xb1, 0x8, 0x60, 0x0, + 0x0, 0xc0, 0x0, 0x90, 0x0, 0xd, 0x60, 0x0, + 0xd, 0x0, 0x70, 0x0, 0x0, 0x49, 0x1, 0x7e, + 0xd0, 0x11, 0x0, 0x0, 0x0, 0x10, 0x0, 0x21, + 0x0, + + /* U+524A "削" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xd1, 0x0, 0x0, 0x0, 0x82, 0x26, 0x0, + 0xd0, 0x1d, 0x0, 0x0, 0xd0, 0x9, 0x80, 0xd0, + 0x83, 0x1, 0x0, 0xd0, 0x1, 0xb0, 0xd2, 0x40, + 0xd, 0x20, 0xd0, 0x9, 0x66, 0xe6, 0x6a, 0xd, + 0x0, 0xd0, 0xe, 0x0, 0x0, 0x3a, 0xd, 0x0, + 0xd0, 0xe, 0x0, 0x0, 0x3a, 0xd, 0x0, 0xd0, + 0xe, 0x66, 0x66, 0x8a, 0xd, 0x0, 0xd0, 0xe, + 0x0, 0x0, 0x3a, 0xd, 0x0, 0xd0, 0xe, 0x66, + 0x66, 0x8a, 0xd, 0x0, 0xd0, 0xe, 0x0, 0x0, + 0x3a, 0xd, 0x0, 0xd0, 0xe, 0x0, 0x0, 0x3a, + 0x3, 0x0, 0xd0, 0xe, 0x0, 0x12, 0x6a, 0x0, + 0x21, 0xe0, 0xe, 0x0, 0x16, 0xf5, 0x0, 0x5e, + 0xc0, 0x3, 0x0, 0x0, 0x20, 0x0, 0x2, 0x10, + + /* U+524D "å‰" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0x0, 0x0, 0x56, 0x0, 0x0, 0x0, + 0x0, 0xa8, 0x0, 0xa, 0x10, 0x0, 0x0, 0x0, + 0x3, 0x60, 0x4, 0x30, 0x8, 0x50, 0x57, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x65, 0x0, 0x12, 0x0, + 0x5, 0x0, 0x0, 0xa4, 0x0, 0x2, 0xc6, 0x67, + 0xc0, 0x1b, 0xc, 0x10, 0x0, 0x2a, 0x0, 0x2b, + 0x1, 0xc0, 0xc1, 0x0, 0x2, 0xc6, 0x67, 0xb0, + 0x1c, 0xc, 0x10, 0x0, 0x2a, 0x0, 0x2b, 0x1, + 0xc0, 0xc1, 0x0, 0x2, 0xc6, 0x67, 0xb0, 0x1c, + 0xc, 0x10, 0x0, 0x2a, 0x0, 0x2b, 0x1, 0xc0, + 0xc1, 0x0, 0x2, 0xa0, 0x2, 0xb0, 0x18, 0xc, + 0x10, 0x0, 0x2a, 0x0, 0x3a, 0x1, 0x54, 0xe0, + 0x0, 0x3, 0xa0, 0x3d, 0x70, 0x2, 0xda, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, + + /* U+525B "剛" */ + 0x30, 0x0, 0x0, 0x5, 0x0, 0x0, 0x81, 0xd6, + 0x66, 0x66, 0x6e, 0x30, 0x0, 0xd0, 0xd0, 0x81, + 0xb, 0xd, 0x0, 0x30, 0xd0, 0xd0, 0x4a, 0x36, + 0xd, 0x0, 0xd0, 0xd0, 0xd2, 0x47, 0x78, 0x4d, + 0x0, 0xc0, 0xd0, 0xd1, 0x32, 0xb2, 0x1d, 0x0, + 0xc0, 0xd0, 0xd0, 0x10, 0xa2, 0xd, 0x0, 0xc0, + 0xd0, 0xd0, 0xc0, 0xaa, 0x2d, 0x0, 0xc0, 0xd0, + 0xd0, 0xb0, 0xaa, 0x1d, 0x0, 0xc0, 0xd0, 0xd0, + 0xb0, 0xaa, 0x1d, 0x0, 0xc0, 0xd0, 0xd1, 0xb6, + 0x8c, 0xd, 0x0, 0x50, 0xd0, 0xd0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0xd0, 0xd0, 0x0, 0x0, 0xd, + 0x0, 0x10, 0xe0, 0xc0, 0x0, 0x6, 0xcd, 0x0, + 0x5d, 0xc0, 0x10, 0x0, 0x0, 0x42, 0x0, 0x1, + 0x20, + + /* U+5272 "割" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x30, 0x0, 0x0, 0x0, 0x92, 0x2, + 0x10, 0x37, 0x0, 0x30, 0x0, 0xc, 0x0, 0x86, + 0x67, 0x86, 0x6d, 0x50, 0x40, 0xc0, 0x2b, 0x0, + 0x2d, 0x2, 0x20, 0x1d, 0xc, 0x0, 0x36, 0x67, + 0xd6, 0x88, 0x0, 0xc0, 0xc0, 0x0, 0x0, 0x1b, + 0x0, 0x0, 0xc, 0xc, 0x0, 0x16, 0x66, 0xd6, + 0xa3, 0x0, 0xc0, 0xc0, 0x0, 0x0, 0x1b, 0x0, + 0x11, 0xc, 0xc, 0x1, 0x86, 0x67, 0xd6, 0x68, + 0x80, 0xc0, 0xc0, 0x0, 0x10, 0x17, 0x3, 0x0, + 0x1c, 0xc, 0x0, 0xd, 0x66, 0x66, 0xe1, 0x1, + 0x70, 0xc0, 0x0, 0xd0, 0x0, 0xd, 0x0, 0x0, + 0xc, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0xc0, 0x0, 0xd6, 0x66, 0x6d, 0x0, 0x17, 0xbe, + 0x0, 0x4, 0x0, 0x0, 0x10, 0x0, 0x2, 0x30, + + /* U+5275 "創" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x1, 0x90, + 0x0, 0x0, 0x5b, 0x62, 0x0, 0x0, 0x0, 0xb0, + 0x0, 0x0, 0xc3, 0xa, 0xa0, 0x1, 0x0, 0xb0, + 0x0, 0x9, 0x35, 0x70, 0xb2, 0x2c, 0x0, 0xb0, + 0x0, 0x65, 0x0, 0xb0, 0x0, 0x1a, 0x0, 0xb0, + 0x5, 0x3b, 0x66, 0x66, 0xd0, 0x1a, 0x0, 0xb0, + 0x1, 0xc, 0x0, 0x0, 0xc0, 0x1a, 0x0, 0xb0, + 0x0, 0xd, 0x66, 0x66, 0xc0, 0x1a, 0x0, 0xb0, + 0x0, 0xd, 0x66, 0x66, 0xc0, 0x1a, 0x0, 0xb0, + 0x0, 0x1c, 0x0, 0x0, 0x20, 0x1a, 0x0, 0xb0, + 0x0, 0x4e, 0x76, 0x66, 0xc2, 0x13, 0x0, 0xb0, + 0x0, 0x99, 0x50, 0x0, 0xc0, 0x0, 0x0, 0xb0, + 0x1, 0x97, 0x50, 0x0, 0xc0, 0x0, 0x2, 0xb0, + 0x7, 0x17, 0x96, 0x66, 0xd0, 0x3, 0x9f, 0x80, + 0x12, 0x2, 0x0, 0x0, 0x10, 0x0, 0x3, 0x0, + + /* U+5283 "劃" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x1, 0x80, + 0x0, 0x46, 0x6d, 0x66, 0xa0, 0x0, 0x1, 0xa0, + 0x0, 0x11, 0xc, 0x0, 0xc2, 0x1, 0x1, 0xa0, + 0x6, 0x76, 0x6d, 0x66, 0xd8, 0x2d, 0x1, 0xa0, + 0x0, 0x35, 0x5d, 0x55, 0xc0, 0xc, 0x1, 0xa0, + 0x0, 0x12, 0x1c, 0x12, 0x50, 0xc, 0x1, 0xa0, + 0x0, 0x47, 0x6d, 0x66, 0x52, 0xc, 0x1, 0xa0, + 0x6, 0x76, 0x69, 0x66, 0x69, 0x1c, 0x1, 0xa0, + 0x0, 0x96, 0x68, 0x66, 0xb0, 0xc, 0x1, 0xa0, + 0x0, 0xc0, 0xc, 0x0, 0xc0, 0xd, 0x1, 0xa0, + 0x0, 0xc6, 0x6d, 0x66, 0xc0, 0x5, 0x1, 0xa0, + 0x0, 0xc6, 0x6d, 0x66, 0xc0, 0x0, 0x1, 0xa0, + 0x0, 0x50, 0x0, 0x0, 0x62, 0x0, 0x2, 0xa0, + 0x5, 0x9a, 0x98, 0x75, 0x31, 0x4, 0xaf, 0x80, + 0x3, 0x40, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, + + /* U+529B "力" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x3, 0x0, 0x6, 0x66, + 0x66, 0xf6, 0x66, 0x66, 0xf4, 0x0, 0x0, 0x0, + 0x1d, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x4, + 0xa0, 0x0, 0x2, 0xd0, 0x0, 0x0, 0x0, 0x95, + 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x1d, 0x0, + 0x0, 0x5, 0xa0, 0x0, 0x0, 0x8, 0x70, 0x0, + 0x0, 0x69, 0x0, 0x0, 0x3, 0xc0, 0x0, 0x0, + 0x9, 0x70, 0x0, 0x1, 0xc1, 0x0, 0x0, 0x0, + 0xc4, 0x0, 0x1, 0xb2, 0x0, 0x2, 0x74, 0x6e, + 0x0, 0x3, 0x81, 0x0, 0x0, 0x1, 0xdf, 0x50, + 0x1, 0x30, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, + + /* U+529F "功" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x46, + 0x66, 0x6a, 0x70, 0xd, 0x0, 0x0, 0x1, 0x10, + 0xd0, 0x0, 0x0, 0xd0, 0x1, 0x0, 0x0, 0xd, + 0x0, 0x56, 0x6e, 0x66, 0xb8, 0x0, 0x0, 0xd0, + 0x0, 0x2, 0xb0, 0x8, 0x50, 0x0, 0xd, 0x0, + 0x0, 0x49, 0x0, 0x94, 0x0, 0x0, 0xd0, 0x0, + 0x7, 0x60, 0xa, 0x30, 0x0, 0xd, 0x0, 0x0, + 0xb3, 0x0, 0xb2, 0x0, 0x0, 0xd5, 0x64, 0x1c, + 0x0, 0xc, 0x10, 0x59, 0xc8, 0x20, 0x8, 0x50, + 0x0, 0xd0, 0x8, 0x60, 0x0, 0x4, 0xa0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0x3, 0xa0, 0x24, 0x24, + 0xc0, 0x0, 0x0, 0x6, 0x60, 0x0, 0x3c, 0xf6, + 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x4, 0x0, + + /* U+52A0 "加" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0x0, 0x0, 0x20, 0x0, 0x20, 0x6, 0x67, + 0xd6, 0x6d, 0x1c, 0x66, 0x6c, 0x50, 0x0, 0x3a, + 0x0, 0xd0, 0xc0, 0x0, 0xa2, 0x0, 0x4, 0xa0, + 0xc, 0xc, 0x0, 0xa, 0x20, 0x0, 0x48, 0x0, + 0xc0, 0xc0, 0x0, 0xa2, 0x0, 0x6, 0x70, 0xb, + 0xc, 0x0, 0xa, 0x20, 0x0, 0x84, 0x1, 0xb0, + 0xc0, 0x0, 0xa2, 0x0, 0xb, 0x0, 0x29, 0xc, + 0x0, 0xa, 0x20, 0x2, 0xa0, 0x4, 0x80, 0xc0, + 0x0, 0xa2, 0x0, 0x92, 0x0, 0x76, 0xc, 0x66, + 0x6c, 0x30, 0x36, 0x18, 0xbe, 0x10, 0xc0, 0x0, + 0xa3, 0x6, 0x0, 0x6, 0x30, 0xb, 0x0, 0x5, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+52A9 "助" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, + 0x0, 0xa6, 0x66, 0xc2, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0xd2, 0x86, 0xe6, 0x67, 0xd0, + 0x0, 0xd6, 0x66, 0xd0, 0x0, 0xd0, 0x1, 0xb0, + 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xe0, 0x2, 0xb0, + 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xe0, 0x2, 0xa0, + 0x0, 0xd6, 0x66, 0xd0, 0x2, 0xc0, 0x3, 0xa0, + 0x0, 0xd0, 0x0, 0xd0, 0x6, 0x80, 0x3, 0x90, + 0x0, 0xd0, 0x0, 0xd1, 0x2c, 0x10, 0x4, 0x80, + 0x0, 0xd5, 0x87, 0x73, 0x76, 0x0, 0x6, 0x70, + 0x1f, 0xb6, 0x10, 0x5, 0x70, 0x35, 0x5d, 0x30, + 0x2, 0x0, 0x0, 0x64, 0x0, 0x3, 0xd8, 0x0, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+52AA "努" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xb0, 0x11, 0x76, 0x66, 0x98, 0x0, + 0x7, 0x6a, 0x96, 0xc6, 0x24, 0x0, 0xb5, 0x0, + 0x0, 0xb, 0x0, 0xd0, 0x7, 0x3, 0xb0, 0x0, + 0x0, 0x48, 0x4, 0x90, 0x2, 0x9c, 0x10, 0x0, + 0x0, 0x15, 0x8e, 0x60, 0x0, 0xbc, 0x10, 0x0, + 0x0, 0x1, 0xa5, 0xb7, 0x1a, 0x43, 0xd7, 0x30, + 0x0, 0x57, 0x10, 0x28, 0x60, 0x0, 0x18, 0x80, + 0x15, 0x10, 0x0, 0x1b, 0x70, 0x0, 0x10, 0x0, + 0x0, 0x37, 0x66, 0x6e, 0x76, 0x66, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xc3, 0x0, 0x3, 0xc0, 0x0, + 0x0, 0x0, 0x1b, 0x60, 0x11, 0x7, 0x90, 0x0, + 0x0, 0x16, 0x92, 0x0, 0x7, 0xef, 0x20, 0x0, + 0x3, 0x41, 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, + + /* U+52C9 "勉" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, + 0x2b, 0x1, 0x30, 0x0, 0xc0, 0x0, 0x0, 0xa, + 0x76, 0xbc, 0x0, 0xc, 0x0, 0x0, 0x3, 0x90, + 0x9, 0x0, 0x0, 0xc0, 0x5, 0x0, 0x8b, 0x69, + 0x86, 0xd5, 0x5d, 0x55, 0xd1, 0x20, 0xc0, 0x94, + 0xc, 0x0, 0xb0, 0xc, 0x0, 0xc, 0x9, 0x30, + 0xc0, 0xb, 0x0, 0xc0, 0x0, 0xc5, 0xc6, 0x5d, + 0x2, 0x90, 0xc, 0x0, 0x8, 0x1c, 0xd1, 0x70, + 0x74, 0x0, 0xc0, 0x0, 0x2, 0xac, 0x0, 0xb, + 0x0, 0xb, 0x0, 0x0, 0x74, 0xc0, 0x7, 0x40, + 0x79, 0xa1, 0x0, 0x1b, 0xc, 0x3, 0x50, 0x0, + 0xa5, 0x20, 0x9, 0x10, 0xc0, 0x20, 0x0, 0x0, + 0x57, 0x7, 0x20, 0x8, 0xba, 0xaa, 0xaa, 0xac, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+52D5 "å‹•" */ + 0x0, 0x0, 0x0, 0x25, 0x0, 0x17, 0x0, 0x0, + 0x0, 0x46, 0x9a, 0xa8, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0xb1, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0x7, 0x66, 0xc6, 0x69, 0x81, 0x2b, 0x11, 0x61, + 0x0, 0x10, 0xb1, 0x3, 0x7, 0x6c, 0x55, 0xd3, + 0x2, 0xc6, 0xc6, 0x6d, 0x10, 0x2a, 0x0, 0xc0, + 0x1, 0xc6, 0xc6, 0x6d, 0x0, 0x48, 0x0, 0xc0, + 0x1, 0xa0, 0xb1, 0xc, 0x0, 0x66, 0x0, 0xc0, + 0x1, 0xc6, 0xc6, 0x6d, 0x0, 0xa2, 0x0, 0xc0, + 0x1, 0x40, 0xb1, 0x5, 0x0, 0xc0, 0x0, 0xc0, + 0x3, 0x66, 0xc6, 0x6c, 0x24, 0x70, 0x2, 0xa0, + 0x0, 0x10, 0xb1, 0x0, 0xa, 0x0, 0x5, 0x80, + 0x0, 0x13, 0xc8, 0x65, 0x74, 0x15, 0x3b, 0x40, + 0x9, 0xc7, 0x20, 0x3, 0x50, 0x2, 0xdb, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x20, 0x0, + + /* U+52D9 "å‹™" */ + 0x0, 0x0, 0x0, 0x20, 0xb, 0x0, 0x0, 0x0, + 0x5, 0x76, 0x68, 0xe1, 0x5d, 0x66, 0x86, 0x0, + 0x0, 0x14, 0x18, 0x10, 0xa4, 0x0, 0xb4, 0x0, + 0x0, 0x6, 0xd0, 0x4, 0x37, 0x3, 0xa0, 0x0, + 0x0, 0x0, 0x95, 0x2, 0x1, 0xac, 0x10, 0x0, + 0x6, 0x76, 0x86, 0xa2, 0x1, 0xbc, 0x20, 0x0, + 0x0, 0x8, 0xf1, 0x91, 0x3a, 0x12, 0xda, 0x51, + 0x0, 0xc, 0xc1, 0x27, 0x58, 0x50, 0x6, 0x60, + 0x0, 0x56, 0xc1, 0x35, 0x6c, 0x86, 0x76, 0x0, + 0x0, 0xa0, 0xc1, 0x1, 0xc, 0x0, 0x76, 0x0, + 0x6, 0x20, 0xc1, 0x0, 0x49, 0x0, 0x84, 0x0, + 0x13, 0x0, 0xc1, 0x0, 0xb2, 0x0, 0xa2, 0x0, + 0x0, 0x32, 0xd0, 0x7, 0x60, 0x10, 0xd0, 0x0, + 0x0, 0x3b, 0xc0, 0x74, 0x0, 0x7e, 0xa0, 0x0, + 0x0, 0x1, 0x2, 0x0, 0x0, 0x3, 0x0, 0x0, + + /* U+52DD "å‹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x96, 0x6a, 0x13, 0x3, 0xc0, 0x45, 0x0, + 0x0, 0xc0, 0xc, 0x9, 0x53, 0xa0, 0xb4, 0x0, + 0x0, 0xc0, 0xc, 0x1, 0xa4, 0x86, 0x10, 0x0, + 0x0, 0xc0, 0xc, 0x7, 0x69, 0xa6, 0x8a, 0x0, + 0x0, 0xd6, 0x6c, 0x0, 0xa, 0x20, 0x1, 0x10, + 0x0, 0xc0, 0xc, 0x76, 0x6d, 0x76, 0x69, 0x80, + 0x0, 0xc0, 0xc, 0x0, 0x76, 0x7, 0x10, 0x0, + 0x0, 0xc3, 0x3c, 0x4, 0x88, 0x51, 0xb6, 0x10, + 0x0, 0xc3, 0x3c, 0x46, 0xa, 0x20, 0x4a, 0xc2, + 0x0, 0xa0, 0xc, 0x17, 0x6d, 0x66, 0xc3, 0x0, + 0x3, 0x80, 0xc, 0x0, 0x1a, 0x0, 0xb0, 0x0, + 0x5, 0x40, 0xc, 0x0, 0x93, 0x0, 0xc0, 0x0, + 0x7, 0x0, 0xc, 0x4, 0x70, 0x0, 0xc0, 0x0, + 0x6, 0x6, 0xe9, 0x46, 0x1, 0x8d, 0x80, 0x0, + 0x10, 0x0, 0x32, 0x20, 0x0, 0x5, 0x0, 0x0, + + /* U+52E4 "勤" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0xa0, 0x0, 0x3c, 0x0, 0x0, + 0x5, 0x6e, 0x66, 0xc7, 0xd2, 0x3a, 0x0, 0x0, + 0x1, 0xd, 0x0, 0x90, 0x0, 0x39, 0x0, 0x0, + 0x0, 0xe, 0x67, 0xb0, 0x0, 0x39, 0x0, 0x20, + 0x0, 0x14, 0x1a, 0x22, 0x28, 0x8b, 0x66, 0xe0, + 0x0, 0xd6, 0x6c, 0x6d, 0x40, 0x48, 0x1, 0xb0, + 0x0, 0xd0, 0x1a, 0xc, 0x0, 0x48, 0x1, 0xb0, + 0x0, 0xe6, 0x6c, 0x6d, 0x0, 0x56, 0x2, 0xb0, + 0x0, 0x40, 0x1a, 0x6, 0x20, 0x75, 0x2, 0xa0, + 0x1, 0x76, 0x6c, 0x66, 0x50, 0xb1, 0x3, 0x90, + 0x0, 0x56, 0x6c, 0x6b, 0x41, 0xb0, 0x4, 0x80, + 0x0, 0x10, 0x1a, 0x0, 0x8, 0x40, 0x6, 0x70, + 0x0, 0x13, 0x6c, 0x65, 0x78, 0x5, 0x5d, 0x40, + 0xb, 0xb7, 0x30, 0x3, 0x60, 0x1, 0xc9, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, + + /* U+52F5 "勵" */ + 0x2, 0x0, 0x0, 0x1, 0x50, 0x38, 0x0, 0x0, + 0x9, 0x76, 0x76, 0x66, 0x61, 0x3a, 0x0, 0x0, + 0x9, 0x20, 0xb0, 0x44, 0x10, 0x39, 0x0, 0x0, + 0x8, 0x77, 0xc6, 0x88, 0x80, 0x29, 0x0, 0x30, + 0x8, 0x20, 0x30, 0x22, 0x28, 0x8b, 0x66, 0xd0, + 0x8, 0x2b, 0x6a, 0x6c, 0x20, 0x48, 0x0, 0xc0, + 0x8, 0x1b, 0x6c, 0x6c, 0x0, 0x56, 0x0, 0xc0, + 0x9, 0x1b, 0xb, 0xa, 0x0, 0x74, 0x0, 0xc0, + 0xa, 0x9, 0x6c, 0x69, 0x0, 0xa2, 0x0, 0xb0, + 0xa, 0x36, 0x6c, 0x66, 0x60, 0xc0, 0x1, 0xa0, + 0x9, 0x55, 0xb, 0x12, 0xa1, 0xa0, 0x2, 0x90, + 0x7, 0x56, 0x5c, 0x68, 0x97, 0x40, 0x4, 0x80, + 0x31, 0x55, 0x50, 0x6, 0x99, 0x4, 0x2a, 0x40, + 0x30, 0x55, 0x0, 0x1c, 0xa1, 0x1, 0xcb, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x30, 0x0, 0x10, 0x0, + + /* U+5305 "包" */ + 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc9, 0x66, 0x66, 0x66, 0xc3, 0x0, + 0x0, 0x5, 0x80, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x1b, 0x10, 0x0, 0x1, 0x0, 0xd0, 0x0, + 0x0, 0x94, 0xc6, 0x66, 0x6d, 0x0, 0xd0, 0x0, + 0x6, 0x21, 0xb0, 0x0, 0xc, 0x0, 0xe0, 0x0, + 0x1, 0x1, 0xb0, 0x0, 0xc, 0x0, 0xe0, 0x0, + 0x0, 0x1, 0xd6, 0x66, 0x6a, 0x0, 0xd0, 0x0, + 0x0, 0x1, 0xb0, 0x0, 0x5, 0x25, 0xb0, 0x10, + 0x0, 0x1, 0xb0, 0x0, 0x0, 0x6e, 0x40, 0x60, + 0x0, 0x1, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x80, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x2, 0xe1, + 0x0, 0x0, 0x7c, 0xbb, 0xcc, 0xcc, 0xde, 0xa0, + + /* U+5316 "化" */ + 0x0, 0x0, 0x63, 0x0, 0x82, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x30, 0xd, 0x20, 0x0, 0x0, 0x0, + 0x4, 0xb0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0xb4, 0x0, 0xc, 0x10, 0x9, 0x10, 0x0, 0x3e, + 0x10, 0x0, 0xc1, 0x8, 0xb2, 0x0, 0xb, 0xe4, + 0x0, 0xc, 0x15, 0xc0, 0x0, 0x3, 0x7b, 0x20, + 0x0, 0xc5, 0xc1, 0x0, 0x0, 0x80, 0xb2, 0x0, + 0xc, 0xb0, 0x0, 0x0, 0x30, 0xb, 0x20, 0x8, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0xb2, 0x19, 0x3c, + 0x10, 0x0, 0x0, 0x0, 0xb, 0x45, 0x0, 0xc1, + 0x0, 0x6, 0x0, 0x0, 0xb2, 0x0, 0xc, 0x10, + 0x0, 0x71, 0x0, 0xb, 0x20, 0x0, 0xc2, 0x0, + 0x9, 0x70, 0x0, 0xc2, 0x0, 0x6, 0xed, 0xdd, + 0xe6, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5317 "北" */ + 0x0, 0x0, 0xa, 0x40, 0x1a, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0xd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc1, 0x0, 0xd0, 0x0, 0x60, 0x5, 0x66, + 0x6d, 0x10, 0xd, 0x0, 0xbc, 0x20, 0x0, 0x0, + 0xc1, 0x0, 0xd2, 0xa5, 0x0, 0x0, 0x0, 0xc, + 0x10, 0xe, 0x50, 0x0, 0x0, 0x0, 0x0, 0xc1, + 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x10, + 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, + 0xd0, 0x0, 0x10, 0x0, 0x0, 0x4d, 0x10, 0xd, + 0x0, 0x5, 0x1, 0x6a, 0x92, 0xc1, 0x0, 0xd0, + 0x0, 0x61, 0xa, 0x20, 0xc, 0x10, 0xe, 0x0, + 0x9, 0x60, 0x0, 0x0, 0xd2, 0x0, 0xbe, 0xdd, + 0xe6, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+533B "医" */ + 0x1, 0x0, 0x0, 0x0, 0x0, 0x3, 0x40, 0x1, + 0xd6, 0x66, 0x76, 0x66, 0x66, 0x99, 0x0, 0xd, + 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, 0x0, 0xd0, + 0x2, 0xb0, 0x0, 0x5, 0x10, 0x0, 0xd, 0x0, + 0x78, 0x6b, 0x66, 0x85, 0x0, 0x0, 0xd0, 0x9, + 0x0, 0xd0, 0x0, 0x0, 0x0, 0xd, 0x6, 0x0, + 0xe, 0x0, 0x0, 0x10, 0x0, 0xd2, 0x76, 0x66, + 0xe6, 0x66, 0x6e, 0x30, 0xd, 0x0, 0x0, 0x3b, + 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x9, 0x88, + 0x40, 0x0, 0x0, 0xd, 0x0, 0x4, 0xa0, 0x8, + 0xd4, 0x0, 0x0, 0xd0, 0x5, 0x90, 0x0, 0x5, + 0xf1, 0x0, 0xd, 0x16, 0x30, 0x0, 0x0, 0x4, + 0x51, 0x2, 0xd6, 0x66, 0x66, 0x66, 0x66, 0x6a, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5340 "å€" */ + 0x3, 0x0, 0x0, 0x0, 0x0, 0x8, 0x30, 0xe, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, 0xd, 0x0, + 0x18, 0x66, 0x69, 0x40, 0x0, 0xd, 0x0, 0x1a, + 0x0, 0x8, 0x40, 0x0, 0xd, 0x0, 0x1a, 0x0, + 0x8, 0x40, 0x0, 0xd, 0x0, 0x1c, 0x66, 0x6b, + 0x40, 0x0, 0xd, 0x0, 0x3, 0x0, 0x3, 0x0, + 0x0, 0xd, 0x7, 0x66, 0x90, 0x86, 0x69, 0x0, + 0xd, 0xd, 0x0, 0xb0, 0xc0, 0xc, 0x0, 0xd, + 0xd, 0x0, 0xb0, 0xc0, 0xc, 0x0, 0xd, 0xd, + 0x0, 0xb0, 0xc0, 0xc, 0x0, 0xd, 0xd, 0x66, + 0xb0, 0xd6, 0x6c, 0x0, 0xd, 0x3, 0x0, 0x10, + 0x20, 0x1, 0x10, 0x1e, 0x66, 0x66, 0x66, 0x66, + 0x67, 0xf3, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5341 "å" */ + 0x0, 0x0, 0x0, 0x9, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0xa, 0x30, + 0x28, 0x66, 0x66, 0x6d, 0x76, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, + + /* U+5343 "åƒ" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x69, 0xcc, 0xa8, 0x30, 0x0, + 0x0, 0x25, 0x54, 0x2c, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x7, 0x10, + 0x27, 0x66, 0x66, 0x6d, 0x86, 0x66, 0x69, 0x60, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, + + /* U+5348 "åˆ" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8b, 0x66, 0x66, 0x66, 0xca, 0x0, 0x0, 0x1b, + 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, 0x8, 0x10, + 0x0, 0xa4, 0x0, 0x0, 0x0, 0x4, 0x20, 0x0, + 0xa, 0x40, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0xa4, 0x0, 0x0, 0x20, 0x16, 0x66, 0x66, 0x6c, + 0x86, 0x66, 0x6e, 0x60, 0x10, 0x0, 0x0, 0xa4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, + + /* U+534A "åŠ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0xc, 0x10, 0x8, 0x70, 0x0, + 0x0, 0x7, 0x70, 0xc, 0x10, 0x2d, 0x30, 0x0, + 0x0, 0x0, 0xb9, 0xc, 0x10, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x39, 0xc, 0x16, 0x10, 0x0, 0x0, + 0x1, 0x66, 0x66, 0x6d, 0x66, 0x66, 0xd7, 0x0, + 0x0, 0x20, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x8, 0x20, + 0x7, 0x66, 0x66, 0x6d, 0x66, 0x66, 0x68, 0x60, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, + + /* U+5352 "å’" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x0, 0x4, 0x50, 0x0, 0x67, + 0x69, 0x66, 0x66, 0x86, 0x66, 0x0, 0x0, 0x0, + 0xe3, 0x0, 0xd, 0x60, 0x0, 0x0, 0x0, 0x69, + 0x0, 0x5, 0xb0, 0x0, 0x0, 0x0, 0xb, 0x69, + 0x0, 0xb5, 0x91, 0x0, 0x0, 0x7, 0x40, 0xa5, + 0x83, 0x5, 0xe0, 0x0, 0x3, 0x50, 0x2, 0x77, + 0x0, 0xa, 0x0, 0x0, 0x20, 0x0, 0x1, 0xe1, + 0x0, 0x3, 0x50, 0x67, 0x66, 0x66, 0x6e, 0x66, + 0x66, 0x88, 0x10, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, + + /* U+5354 "å”" */ + 0x0, 0x9, 0x10, 0x0, 0x6, 0x60, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x9, 0x40, 0x3, 0x0, + 0x0, 0xd, 0x0, 0x37, 0x6d, 0x66, 0x6d, 0x40, + 0x0, 0xd, 0x0, 0x0, 0x39, 0x0, 0xb, 0x0, + 0x6, 0x6e, 0x6b, 0x21, 0xa1, 0x0, 0x48, 0x0, + 0x1, 0xd, 0x0, 0x57, 0x0, 0x4a, 0xd1, 0x0, + 0x0, 0xd, 0x3, 0x23, 0x0, 0x2, 0x40, 0x0, + 0x0, 0xd, 0x1, 0x4b, 0x14, 0x0, 0xe0, 0x40, + 0x0, 0xd, 0x6, 0x99, 0x5c, 0x58, 0xd6, 0xc2, + 0x0, 0xd, 0x0, 0x83, 0xb, 0x3, 0x90, 0xa0, + 0x0, 0xd, 0x0, 0xb0, 0xb, 0x7, 0x60, 0xb0, + 0x0, 0xd, 0x2, 0x80, 0x29, 0xc, 0x10, 0xb0, + 0x0, 0xd, 0x8, 0x24, 0x85, 0x47, 0x0, 0xc0, + 0x0, 0xe, 0x44, 0x4, 0xc4, 0x70, 0x6b, 0xa0, + 0x0, 0x5, 0x20, 0x0, 0x13, 0x0, 0x5, 0x10, + + /* U+5357 "å—" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x20, 0x0, 0x5, 0x1, 0x76, + 0x66, 0x66, 0xe6, 0x66, 0x68, 0xc4, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x8, 0x66, + 0x66, 0xe6, 0x66, 0x6a, 0x40, 0x0, 0xb1, 0x3, + 0x0, 0x8, 0x0, 0xb2, 0x0, 0xb, 0x10, 0x3c, + 0x3, 0xa0, 0xb, 0x20, 0x0, 0xb1, 0x0, 0x90, + 0x71, 0x60, 0xb2, 0x0, 0xb, 0x16, 0x76, 0xd6, + 0x67, 0x1b, 0x20, 0x0, 0xb1, 0x0, 0xc, 0x0, + 0x61, 0xb2, 0x0, 0xb, 0x38, 0x66, 0xd6, 0x66, + 0x4b, 0x20, 0x0, 0xb1, 0x0, 0xc, 0x0, 0x0, + 0xb2, 0x0, 0xb, 0x10, 0x0, 0xc0, 0x23, 0x2d, + 0x10, 0x0, 0xc1, 0x0, 0xa, 0x0, 0x5e, 0xc0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+5358 "å˜" */ + 0x0, 0x3, 0x0, 0x52, 0x0, 0x67, 0x0, 0x0, + 0x0, 0x89, 0x1, 0xd1, 0xc, 0x40, 0x0, 0x0, + 0x0, 0xd3, 0xb, 0x35, 0x60, 0x0, 0x0, 0x2, + 0x89, 0x66, 0x76, 0xa6, 0xb1, 0x0, 0x0, 0x2a, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0x2, 0xa0, + 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x0, 0x2c, 0x66, + 0x6e, 0x66, 0x6d, 0x0, 0x0, 0x2, 0xa0, 0x0, + 0xd0, 0x0, 0xd0, 0x0, 0x0, 0x2c, 0x66, 0x6e, + 0x66, 0x6d, 0x0, 0x0, 0x1, 0x40, 0x0, 0xd0, + 0x0, 0x41, 0x30, 0x37, 0x66, 0x66, 0x6e, 0x66, + 0x66, 0xac, 0x20, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x0, + + /* U+5371 "å±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7d, 0x66, 0x67, 0x90, 0x0, 0x0, 0x0, + 0x2c, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, 0x1b, + 0x10, 0x0, 0x55, 0x0, 0x2, 0x0, 0x28, 0xa6, + 0x66, 0x69, 0x66, 0x69, 0xb0, 0x4, 0xb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb2, 0xa, + 0x66, 0x66, 0xd0, 0x0, 0x0, 0xb, 0x20, 0xd0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0xb2, 0xd, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0xc, 0x10, 0xd0, 0x0, + 0xc, 0x0, 0x0, 0x0, 0xd0, 0xd, 0x1, 0x6d, + 0xa0, 0x50, 0x0, 0x3a, 0x0, 0xd0, 0x0, 0x30, + 0x7, 0x10, 0xa, 0x20, 0xc, 0x10, 0x0, 0x0, + 0x95, 0x6, 0x30, 0x0, 0x6d, 0xcc, 0xcc, 0xce, + 0x61, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5373 "å³" */ + 0x2, 0x0, 0x3, 0x0, 0x0, 0x0, 0x10, 0xe, + 0x66, 0x6e, 0x30, 0xc6, 0x66, 0xe1, 0xd, 0x0, + 0xd, 0x0, 0xd0, 0x0, 0xd0, 0xd, 0x66, 0x6e, + 0x0, 0xd0, 0x0, 0xd0, 0xd, 0x0, 0xd, 0x0, + 0xd0, 0x0, 0xd0, 0xd, 0x0, 0xd, 0x0, 0xd0, + 0x0, 0xd0, 0xd, 0x66, 0x6e, 0x0, 0xd0, 0x0, + 0xd0, 0xd, 0x0, 0x8, 0x0, 0xd0, 0x0, 0xd0, + 0xd, 0x3, 0x50, 0x0, 0xd0, 0x0, 0xd0, 0xd, + 0x0, 0x6a, 0x0, 0xd0, 0x0, 0xc0, 0xd, 0x1, + 0x5b, 0xa0, 0xd1, 0x8d, 0xa0, 0x1f, 0xa7, 0x11, + 0x90, 0xd0, 0x4, 0x0, 0x5, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, + 0x0, + + /* U+537B "å»" */ + 0x0, 0x3, 0x40, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x60, 0x2d, 0x40, 0xa6, 0x66, 0xa1, + 0x0, 0x83, 0x0, 0x4, 0xc0, 0xd0, 0x0, 0xd0, + 0x5, 0x10, 0x3d, 0x0, 0x20, 0xd0, 0x0, 0xd0, + 0x0, 0x0, 0xb7, 0x70, 0x0, 0xd0, 0x0, 0xd0, + 0x0, 0x6, 0x60, 0x3c, 0x20, 0xd0, 0x0, 0xd0, + 0x0, 0x39, 0x0, 0x5, 0xd0, 0xd0, 0x0, 0xd0, + 0x2, 0x83, 0x0, 0x4, 0x70, 0xd0, 0x0, 0xd0, + 0x5, 0xe, 0x66, 0x6e, 0x20, 0xd0, 0x0, 0xd0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0xd0, 0x0, 0xd0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0xd1, 0x79, 0xc0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0xd0, 0x8, 0x30, + 0x0, 0xe, 0x66, 0x6e, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x9, 0x0, 0x5, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + + /* U+539A "厚" */ + 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0xa3, 0x0, + 0xe, 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, 0x0, + 0xd0, 0xc, 0x66, 0x66, 0x6c, 0x0, 0x0, 0xd, + 0x0, 0xd0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd0, + 0xe, 0x66, 0x66, 0x6d, 0x0, 0x0, 0xd, 0x0, + 0xe6, 0x66, 0x66, 0xd0, 0x0, 0x0, 0xd0, 0xa, + 0x0, 0x0, 0x8, 0x0, 0x0, 0xd, 0x5, 0x66, + 0x66, 0x66, 0xc2, 0x0, 0x0, 0xc0, 0x0, 0x0, + 0x13, 0x85, 0x10, 0x0, 0x2a, 0x0, 0x0, 0xc, + 0x20, 0x2, 0x50, 0x5, 0x76, 0x66, 0x66, 0xe6, + 0x66, 0x77, 0x10, 0x92, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x9, 0x0, 0x0, 0x10, 0xd0, 0x0, + 0x0, 0x5, 0x10, 0x0, 0x4, 0xdb, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, + + /* U+539F "原" */ + 0x0, 0x30, 0x0, 0x0, 0x0, 0x5, 0x80, 0x0, + 0xe6, 0x66, 0x68, 0x96, 0x66, 0x61, 0x0, 0xe0, + 0x0, 0x8, 0x40, 0x0, 0x0, 0x0, 0xe0, 0x1a, + 0x69, 0x66, 0x6c, 0x30, 0x0, 0xe0, 0xc, 0x0, + 0x0, 0xb, 0x10, 0x0, 0xe0, 0xd, 0x66, 0x66, + 0x6d, 0x10, 0x0, 0xd0, 0xc, 0x0, 0x0, 0xb, + 0x10, 0x0, 0xd0, 0xd, 0x66, 0x66, 0x6d, 0x10, + 0x0, 0xc0, 0x7, 0x0, 0xd0, 0x6, 0x0, 0x2, + 0xa0, 0x2, 0x50, 0xd1, 0x0, 0x0, 0x4, 0x70, + 0xd, 0x80, 0xd0, 0x77, 0x0, 0x9, 0x21, 0xb4, + 0x0, 0xd0, 0x6, 0xe3, 0x18, 0x18, 0x10, 0x57, + 0xe0, 0x0, 0x6a, 0x60, 0x10, 0x0, 0x8, 0x80, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+53B3 "厳" */ + 0x0, 0x0, 0x81, 0x6, 0x20, 0xb, 0x20, 0x0, + 0x0, 0x4, 0xc0, 0x1e, 0x5, 0x70, 0x0, 0x0, + 0x52, 0x26, 0x22, 0x62, 0x62, 0x6b, 0x0, 0xb, + 0x64, 0x44, 0x44, 0x4a, 0x44, 0x41, 0x0, 0xa3, + 0x67, 0x97, 0x1, 0xd0, 0x0, 0x0, 0xa, 0x30, + 0xa, 0x14, 0x64, 0x3, 0x40, 0x0, 0xa5, 0x8c, + 0x6d, 0x5c, 0x66, 0xe5, 0x0, 0xa, 0x22, 0xc6, + 0xd4, 0x62, 0xd, 0x0, 0x0, 0xb2, 0x2a, 0xc, + 0x20, 0x62, 0xa0, 0x0, 0xc, 0x2, 0xc6, 0xd0, + 0x9, 0x75, 0x0, 0x0, 0xc0, 0x2a, 0xc, 0x0, + 0x6d, 0x0, 0x0, 0x28, 0x15, 0xc7, 0xd6, 0x27, + 0xe1, 0x0, 0x6, 0x25, 0xa4, 0xc, 0x3, 0x84, + 0xd3, 0x0, 0x60, 0x0, 0x0, 0xb3, 0x60, 0x5, + 0xd3, 0x11, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + 0x0, + + /* U+53BB "去" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x26, + 0x66, 0x6d, 0x86, 0x6a, 0xc0, 0x0, 0x0, 0x10, + 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb3, 0x0, 0x0, 0x80, 0x8, 0x66, 0x66, 0x6d, + 0x66, 0x66, 0x7a, 0x40, 0x0, 0x0, 0x5, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x37, + 0x0, 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, 0x3d, + 0x30, 0x0, 0x3, 0xd8, 0x77, 0x77, 0x76, 0x9f, + 0x20, 0x0, 0xb, 0x85, 0x32, 0x0, 0x0, 0xb4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+53C2 "å‚" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xa2, 0x1, 0x50, 0x0, 0x0, + 0x0, 0x3, 0x74, 0x0, 0x0, 0x3c, 0x60, 0x0, + 0x0, 0xd, 0xb9, 0xbc, 0x65, 0x54, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x23, 0x40, + 0x6, 0x66, 0x6a, 0xb6, 0x69, 0x66, 0x67, 0x70, + 0x0, 0x0, 0x2c, 0x1, 0x44, 0x60, 0x0, 0x0, + 0x0, 0x1, 0xb1, 0x1c, 0x90, 0x5b, 0x20, 0x0, + 0x0, 0x39, 0x12, 0xc5, 0x4, 0x13, 0xdc, 0x71, + 0x5, 0x50, 0x68, 0x10, 0x5e, 0x50, 0x6, 0x40, + 0x0, 0x16, 0x10, 0x8, 0xa1, 0x4, 0x30, 0x0, + 0x0, 0x0, 0x6, 0x93, 0x0, 0x7e, 0x60, 0x0, + 0x0, 0x15, 0x62, 0x0, 0x4c, 0x91, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6c, 0x92, 0x0, 0x0, 0x0, + 0x1, 0x57, 0x88, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+53C3 "åƒ" */ + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8b, 0x3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x27, 0x30, 0x2, 0xd5, 0x0, 0x0, + 0x0, 0x0, 0x7a, 0x86, 0x43, 0x4a, 0x0, 0x0, + 0x0, 0x6, 0x80, 0x0, 0x0, 0xb4, 0x10, 0x0, + 0x0, 0xa, 0x5, 0x0, 0x19, 0x30, 0x34, 0x0, + 0x0, 0x71, 0x6, 0x52, 0x5f, 0xed, 0xbd, 0x0, + 0x1, 0xb7, 0x45, 0xbe, 0x65, 0x0, 0x9, 0x0, + 0x0, 0x0, 0x6, 0xb2, 0x36, 0x20, 0x0, 0x0, + 0x0, 0x5, 0x83, 0x7, 0xc1, 0x7b, 0xa8, 0x60, + 0x4, 0x40, 0x16, 0xa6, 0x27, 0x10, 0x37, 0x0, + 0x0, 0x25, 0x51, 0x5, 0xda, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xa7, 0x10, 0x6c, 0x10, 0x0, + 0x0, 0x57, 0x51, 0x0, 0x4c, 0xb4, 0x10, 0x0, + 0x0, 0x0, 0x2, 0x7c, 0xa3, 0x0, 0x0, 0x0, + 0x1, 0x67, 0x98, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+53C8 "åˆ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x47, 0x76, 0x66, 0x66, 0x6a, 0xb0, 0x0, + 0x0, 0x0, 0x41, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x0, 0x5, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x0, 0x0, 0x77, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x10, 0x0, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x80, 0x5, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x82, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0x97, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5b, 0x7b, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x90, 0x5, 0xd6, 0x0, 0x0, + 0x0, 0x3, 0x94, 0x0, 0x0, 0x2c, 0xe9, 0x51, + 0x2, 0x65, 0x0, 0x0, 0x0, 0x0, 0x5c, 0x70, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+53CA "åŠ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x6, 0x67, 0xb6, 0x66, 0xad, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x90, 0x0, 0xa5, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x70, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x80, 0x6, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x60, 0xb, 0x86, 0xc7, 0x0, + 0x0, 0x0, 0xd, 0x16, 0x0, 0x1, 0xe1, 0x0, + 0x0, 0x0, 0x48, 0x8, 0x0, 0x8, 0x70, 0x0, + 0x0, 0x0, 0xa3, 0x3, 0x70, 0x2c, 0x0, 0x0, + 0x0, 0x1, 0xb0, 0x0, 0xa4, 0xc3, 0x0, 0x0, + 0x0, 0x9, 0x30, 0x0, 0x1f, 0x70, 0x0, 0x0, + 0x0, 0x57, 0x0, 0x1, 0xb8, 0xd3, 0x0, 0x0, + 0x2, 0x70, 0x0, 0x79, 0x20, 0x3d, 0xa4, 0x0, + 0x15, 0x3, 0x67, 0x20, 0x0, 0x0, 0x8f, 0x90, + 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+53CB "å‹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xd0, 0x0, 0x0, 0x9, 0x30, + 0x6, 0x76, 0x69, 0xc6, 0x66, 0x66, 0x67, 0x50, + 0x0, 0x0, 0x8, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x40, 0x0, 0x2, 0x10, 0x0, + 0x0, 0x0, 0xe, 0x86, 0x66, 0x6d, 0x80, 0x0, + 0x0, 0x0, 0x4a, 0x16, 0x0, 0x1e, 0x0, 0x0, + 0x0, 0x0, 0xa4, 0x8, 0x0, 0x88, 0x0, 0x0, + 0x0, 0x2, 0xb0, 0x2, 0x91, 0xd1, 0x0, 0x0, + 0x0, 0xa, 0x30, 0x0, 0x7d, 0x50, 0x0, 0x0, + 0x0, 0x38, 0x0, 0x0, 0xac, 0xa1, 0x0, 0x0, + 0x0, 0x90, 0x0, 0x3b, 0x50, 0x5e, 0x82, 0x0, + 0x7, 0x10, 0x38, 0x70, 0x0, 0x2, 0xaf, 0xa1, + 0x11, 0x4, 0x20, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+53CD "å" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xa1, 0x0, + 0x0, 0x6, 0x46, 0x78, 0x9a, 0xa8, 0x73, 0x0, + 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, 0x30, 0x0, + 0x0, 0xa, 0x86, 0x86, 0x66, 0x66, 0xf5, 0x0, + 0x0, 0xa, 0x30, 0x70, 0x0, 0x6, 0xc0, 0x0, + 0x0, 0xb, 0x20, 0x53, 0x0, 0xd, 0x30, 0x0, + 0x0, 0xc, 0x10, 0xa, 0x0, 0x89, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x2, 0xa4, 0xd0, 0x0, 0x0, + 0x0, 0x3a, 0x0, 0x0, 0x7f, 0x30, 0x0, 0x0, + 0x0, 0x93, 0x0, 0x4, 0xc9, 0xc3, 0x0, 0x0, + 0x1, 0x90, 0x2, 0x98, 0x0, 0x3e, 0xb5, 0x0, + 0x7, 0x3, 0x76, 0x0, 0x0, 0x0, 0x8f, 0xc2, + 0x10, 0x11, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+53D6 "å–" */ + 0x0, 0x0, 0x0, 0x17, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xd6, 0x66, 0xe6, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0xd3, 0x66, 0x66, 0x8b, 0x0, + 0x0, 0xc0, 0x0, 0xd0, 0x22, 0x0, 0x89, 0x0, + 0x0, 0xc6, 0x66, 0xd0, 0x5, 0x0, 0xb4, 0x0, + 0x0, 0xc0, 0x0, 0xd0, 0x7, 0x0, 0xe0, 0x0, + 0x0, 0xc0, 0x0, 0xd0, 0x8, 0x4, 0xa0, 0x0, + 0x0, 0xc6, 0x66, 0xd0, 0x5, 0x3a, 0x50, 0x0, + 0x0, 0xc0, 0x0, 0xd0, 0x1, 0xad, 0x0, 0x0, + 0x0, 0xc0, 0x14, 0xe6, 0x30, 0xb7, 0x0, 0x0, + 0x17, 0xec, 0x84, 0xd0, 0x1, 0xdc, 0x0, 0x0, + 0x1a, 0x30, 0x0, 0xd0, 0xa, 0x25, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x83, 0x0, 0x7f, 0x90, + 0x0, 0x0, 0x0, 0xd6, 0x20, 0x0, 0x5, 0x30, + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+53D7 "å—" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x5a, 0xb0, 0x0, + 0x0, 0x25, 0x66, 0x89, 0xa9, 0x87, 0x51, 0x0, + 0x0, 0x3, 0x0, 0x33, 0x0, 0xb, 0x60, 0x0, + 0x0, 0x5, 0xa0, 0xd, 0x30, 0x1c, 0x0, 0x0, + 0x0, 0x30, 0xe1, 0x9, 0x60, 0x82, 0x2, 0x0, + 0x0, 0xa6, 0x86, 0x67, 0x66, 0x76, 0x6c, 0xb0, + 0x4, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x10, + 0x6, 0x44, 0x66, 0x66, 0x66, 0xa8, 0x20, 0x0, + 0x0, 0x0, 0x6, 0x0, 0x1, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x80, 0xa, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x67, 0x99, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xb3, 0x4d, 0x94, 0x20, 0x0, + 0x0, 0x37, 0x83, 0x0, 0x0, 0x5b, 0xff, 0x91, + 0x4, 0x20, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+53E3 "å£" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x66, 0x66, + 0x66, 0x66, 0xe3, 0xe0, 0x0, 0x0, 0x0, 0xe, + 0xe, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xe0, 0x0, + 0x0, 0x0, 0xe, 0xe, 0x0, 0x0, 0x0, 0x0, + 0xe0, 0xe0, 0x0, 0x0, 0x0, 0xe, 0xe, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0xe0, 0x0, 0x0, 0x0, + 0xe, 0xe, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xe6, + 0x66, 0x66, 0x66, 0x6e, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+53E4 "å¤" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x20, 0x47, 0x66, + 0x66, 0x6e, 0x66, 0x66, 0x9b, 0x10, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x19, 0x66, 0x6e, + 0x66, 0x6b, 0x20, 0x0, 0x1, 0xd0, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x1, 0xe6, 0x66, 0x66, 0x66, 0xe0, + 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x10, 0x0, + + /* U+53E5 "å¥" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0x76, 0x66, 0x66, 0x66, 0xb6, 0x0, 0xa, + 0x40, 0x0, 0x0, 0x0, 0xa, 0x30, 0x4, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xa3, 0x2, 0x71, 0x20, + 0x0, 0x6, 0x0, 0xa, 0x30, 0x50, 0x3d, 0x66, + 0x66, 0xf1, 0x0, 0xa3, 0x0, 0x2, 0xb0, 0x0, + 0xe, 0x0, 0xa, 0x30, 0x0, 0x2b, 0x0, 0x0, + 0xe0, 0x0, 0xa3, 0x0, 0x2, 0xd6, 0x66, 0x6e, + 0x0, 0xa, 0x30, 0x0, 0x3b, 0x0, 0x0, 0x80, + 0x0, 0xb2, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0xc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x21, 0x2, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x43, 0x0, + + /* U+53E6 "å¦" */ + 0x0, 0x9, 0x66, 0x66, 0x66, 0x6b, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x2b, 0x0, 0x0, 0xe, 0x66, 0x66, + 0x66, 0x7b, 0x0, 0x0, 0xc, 0x0, 0x94, 0x0, + 0x27, 0x0, 0x0, 0x0, 0x0, 0xd3, 0x0, 0x0, + 0x10, 0x6, 0x66, 0x66, 0xe6, 0x66, 0x67, 0xe0, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x3, 0xb0, 0x0, + 0x0, 0x3, 0xa0, 0x0, 0x3, 0xa0, 0x0, 0x0, + 0x9, 0x40, 0x0, 0x4, 0xa0, 0x0, 0x0, 0x4a, + 0x0, 0x0, 0x5, 0x80, 0x0, 0x6, 0x90, 0x0, + 0x12, 0xa, 0x60, 0x4, 0x73, 0x0, 0x0, 0x5, + 0xee, 0x10, 0x31, 0x0, 0x0, 0x0, 0x0, 0x21, + 0x0, + + /* U+53EA "åª" */ + 0x0, 0x4, 0x0, 0x0, 0x0, 0x52, 0x0, 0x0, + 0xe6, 0x66, 0x66, 0x6c, 0x50, 0x0, 0xd, 0x0, + 0x0, 0x0, 0xa3, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0xa, 0x30, 0x0, 0xd, 0x0, 0x0, 0x0, 0xa3, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xa, 0x30, 0x0, + 0xd, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x1, 0xe6, + 0x66, 0x66, 0x6c, 0x30, 0x0, 0x17, 0x4, 0x0, + 0x20, 0x30, 0x0, 0x0, 0x7, 0xd1, 0x1, 0x91, + 0x0, 0x0, 0x2, 0xd2, 0x0, 0x3, 0xd3, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x6, 0xf2, 0x0, 0x93, + 0x0, 0x0, 0x0, 0xc, 0x90, 0x82, 0x0, 0x0, + 0x0, 0x0, 0x37, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+53EB "å«" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xb1, 0x0, + 0x0, 0x0, 0x1, 0x10, 0x0, 0xd0, 0x1c, 0x66, + 0xc6, 0x3, 0xd0, 0x0, 0xd0, 0xd, 0x0, 0xb2, + 0x2, 0xb0, 0x0, 0xd0, 0xd, 0x0, 0xb2, 0x2, + 0xb0, 0x0, 0xd0, 0xd, 0x0, 0xb2, 0x2, 0xb0, + 0x0, 0xd0, 0xd, 0x0, 0xb2, 0x2, 0xb0, 0x0, + 0xd0, 0xd, 0x0, 0xb2, 0x2, 0xb0, 0x0, 0xd0, + 0xd, 0x0, 0xb2, 0x3, 0xb3, 0x76, 0xd0, 0xe, + 0x66, 0xd2, 0x3, 0xf7, 0x0, 0xd0, 0x1d, 0x0, + 0x91, 0x0, 0x10, 0x0, 0xd0, 0x6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x30, + + /* U+53EF "å¯" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6d, 0x90, + 0x1, 0x0, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, + 0x0, 0xb, 0x66, 0x6c, 0x50, 0xc, 0x10, 0x0, + 0x0, 0xe, 0x0, 0xb, 0x20, 0xc, 0x10, 0x0, + 0x0, 0xe, 0x0, 0xb, 0x20, 0xc, 0x10, 0x0, + 0x0, 0xe, 0x0, 0xb, 0x20, 0xc, 0x10, 0x0, + 0x0, 0xe, 0x0, 0xb, 0x20, 0xc, 0x10, 0x0, + 0x0, 0xe, 0x66, 0x6d, 0x30, 0xc, 0x10, 0x0, + 0x0, 0xe, 0x0, 0x6, 0x10, 0xc, 0x10, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x25, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xcb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + + /* U+53F0 "å°" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaa, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x6a, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x65, 0x0, + 0x0, 0x4a, 0x0, 0x0, 0x0, 0x7b, 0x20, 0x8e, + 0x55, 0x66, 0x77, 0x66, 0xce, 0x16, 0xd9, 0x64, + 0x21, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x1d, 0x66, 0x66, 0x66, 0xc6, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xb, 0x30, 0x0, + 0xd, 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0xb, 0x30, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6c, + 0x30, 0x0, 0x4, 0x0, 0x0, 0x0, 0x30, 0x0, + + /* U+53F2 "å²" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0xe0, 0x0, 0x3, 0x0, + 0x0, 0xe, 0x66, 0x66, 0xe6, 0x66, 0x8d, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xe0, 0x0, 0x3a, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xe0, 0x0, 0x3a, 0x0, + 0x0, 0xd, 0x66, 0x66, 0xe6, 0x66, 0x8b, 0x0, + 0x0, 0xa, 0x0, 0x0, 0xc0, 0x0, 0x25, 0x0, + 0x0, 0x0, 0x24, 0x2, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x46, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8d, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7d, 0xc5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0x80, 0x29, 0xeb, 0x86, 0x51, + 0x0, 0x48, 0x81, 0x0, 0x0, 0x5, 0x9c, 0x80, + 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+53F3 "å³" */ + 0x0, 0x0, 0x0, 0x9, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x69, 0x0, 0x0, 0x8, 0x30, + 0x7, 0x66, 0x66, 0xd7, 0x66, 0x66, 0x67, 0x60, + 0x0, 0x0, 0x2, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0xad, 0x66, 0x66, 0x66, 0xf2, 0x0, + 0x0, 0x6, 0x6c, 0x10, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x38, 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, + 0x2, 0x70, 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, + 0x14, 0x0, 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0xd, 0x66, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+53F7 "å·" */ + 0x0, 0x9, 0x66, 0x66, 0x66, 0xb3, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x66, 0x66, + 0x66, 0xe0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, + 0x10, 0x31, 0x56, 0x66, 0x89, 0x66, 0x66, 0x66, + 0x97, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xe0, 0x0, 0x0, 0x34, 0x0, 0x0, + 0x3, 0x96, 0x66, 0x66, 0xca, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x5, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xdf, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x72, 0x0, + 0x0, + + /* U+53F8 "å¸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x27, + 0x66, 0x66, 0x66, 0x66, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x20, 0xd0, 0x46, 0x66, 0x66, 0x66, 0x76, 0xd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0xb6, 0x66, 0x6e, 0x20, 0xd, 0x0, 0xc, 0x10, + 0x0, 0xe0, 0x0, 0xd0, 0x0, 0xc1, 0x0, 0xe, + 0x0, 0xd, 0x0, 0xc, 0x10, 0x0, 0xe0, 0x0, + 0xd0, 0x0, 0xc6, 0x66, 0x6e, 0x0, 0xd, 0x0, + 0x8, 0x0, 0x0, 0x40, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8e, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x32, 0x0, + + /* U+5403 "åƒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0x20, 0x0, 0x0, 0x96, 0x6b, 0x50, + 0x77, 0x0, 0x0, 0x30, 0xd1, 0xb, 0x30, 0xc6, + 0x66, 0x66, 0xa4, 0xd1, 0xb, 0x36, 0x40, 0x0, + 0x0, 0x0, 0xc1, 0xb, 0x46, 0x0, 0x0, 0x30, + 0x0, 0xc1, 0xb, 0x54, 0x66, 0x67, 0xf5, 0x0, + 0xc1, 0xb, 0x30, 0x0, 0xc, 0x60, 0x0, 0xc1, + 0xb, 0x30, 0x0, 0xa8, 0x0, 0x0, 0xd6, 0x6c, + 0x30, 0x8, 0xa0, 0x0, 0x0, 0xd1, 0x5, 0x10, + 0x5c, 0x0, 0x0, 0x60, 0x10, 0x0, 0x1, 0xe1, + 0x0, 0x0, 0x70, 0x0, 0x0, 0x5, 0xb0, 0x0, + 0x0, 0xa6, 0x0, 0x0, 0x1, 0xcc, 0xcc, 0xcc, + 0xf6, + + /* U+5404 "å„" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0x86, 0x66, 0xb4, 0x0, 0x0, + 0x0, 0x0, 0xb8, 0x0, 0x3, 0xd1, 0x0, 0x0, + 0x0, 0x7, 0x63, 0x40, 0xc, 0x30, 0x0, 0x0, + 0x0, 0x55, 0x0, 0x82, 0x88, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x89, 0xb9, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0x50, 0x5, 0xdc, 0x74, 0x10, + 0x0, 0x7, 0xd6, 0x66, 0x66, 0xa8, 0xbe, 0x60, + 0x5, 0x61, 0xd1, 0x0, 0x0, 0xb3, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x70, 0x0, 0x0, 0x50, 0x0, 0x0, + + /* U+5408 "åˆ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb6, 0x37, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x90, 0x7, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x6a, 0x0, 0x0, 0x8a, 0x10, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x38, 0xea, 0x40, + 0x4, 0x82, 0x76, 0x66, 0x66, 0x98, 0x2b, 0x91, + 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x6, 0x0, 0x0, + 0x0, 0x0, 0xf6, 0x66, 0x66, 0x6f, 0x10, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+540C "åŒ" */ + 0x40, 0x0, 0x0, 0x0, 0x0, 0x5, 0xd, 0x66, + 0x66, 0x66, 0x66, 0x66, 0xe2, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xc, 0x15, 0x66, 0x66, 0x6b, + 0x90, 0xe0, 0xc1, 0x10, 0x0, 0x0, 0x0, 0xe, + 0xc, 0x10, 0x20, 0x0, 0x3, 0x0, 0xe0, 0xc1, + 0xd, 0x66, 0x66, 0xe1, 0xe, 0xc, 0x10, 0xd0, + 0x0, 0xd, 0x0, 0xe0, 0xc1, 0xd, 0x0, 0x0, + 0xd0, 0xe, 0xc, 0x10, 0xd6, 0x66, 0x6d, 0x0, + 0xe0, 0xc1, 0xc, 0x0, 0x0, 0xa0, 0xe, 0xc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xd1, 0x0, + 0x0, 0x0, 0x22, 0x3e, 0xe, 0x10, 0x0, 0x0, + 0x1, 0x7f, 0xa0, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x30, 0x0, + + /* U+540D "å" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xd0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xd, + 0x86, 0x66, 0x6c, 0xb0, 0x0, 0x0, 0x77, 0x0, + 0x0, 0x3e, 0x10, 0x0, 0x4, 0x98, 0x10, 0x1, + 0xd4, 0x0, 0x0, 0x47, 0x3, 0xe1, 0x1d, 0x50, + 0x0, 0x1, 0x30, 0x0, 0x72, 0xd5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xe7, 0x66, 0x66, 0xb2, 0x0, 0x5, + 0xae, 0x10, 0x0, 0x0, 0xe0, 0x5, 0x63, 0xc, + 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xc, 0x10, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xc, 0x66, 0x66, + 0x66, 0xe0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5411 "å‘" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa4, + 0x0, 0x0, 0x0, 0x4, 0x0, 0x8, 0x0, 0x0, + 0x0, 0x60, 0xd6, 0x66, 0x66, 0x66, 0x66, 0x6f, + 0x1c, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xc1, + 0x3, 0x0, 0x0, 0x40, 0xe, 0xc, 0x10, 0xd6, + 0x66, 0x8d, 0x0, 0xe0, 0xc1, 0xc, 0x10, 0x3, + 0xa0, 0xe, 0xc, 0x10, 0xc1, 0x0, 0x3a, 0x0, + 0xe0, 0xc1, 0xd, 0x66, 0x68, 0xa0, 0xe, 0xc, + 0x10, 0xd1, 0x0, 0x39, 0x0, 0xe0, 0xc1, 0x1, + 0x0, 0x0, 0x0, 0xe, 0xc, 0x10, 0x0, 0x0, + 0x2, 0x34, 0xd0, 0xd1, 0x0, 0x0, 0x0, 0x15, + 0xea, 0x4, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+5426 "å¦" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x81, 0x18, + 0x66, 0x66, 0x9c, 0x66, 0x66, 0x85, 0x0, 0x0, + 0x1, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0x6c, 0x31, 0x0, 0x0, 0x0, 0x1, 0xc4, 0x2b, + 0x6, 0x94, 0x0, 0x0, 0x4b, 0x20, 0x2b, 0x0, + 0x1b, 0xc1, 0x17, 0x60, 0x0, 0x3b, 0x0, 0x0, + 0x89, 0x30, 0x0, 0x0, 0x26, 0x0, 0x1, 0x1, + 0x0, 0xd, 0x66, 0x66, 0x66, 0x7e, 0x10, 0x0, + 0xf, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0xf, + 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0xf, 0x0, + 0x0, 0x0, 0x2c, 0x0, 0x0, 0xf, 0x66, 0x66, + 0x66, 0x7c, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x2d, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, + 0x0, + + /* U+5427 "å§" */ + 0x0, 0x0, 0x0, 0x95, 0x55, 0x55, 0xa1, 0x3, + 0xb6, 0x6d, 0xe, 0x11, 0xe1, 0x2c, 0x0, 0x2b, + 0x2, 0xc0, 0xe0, 0xe, 0x2, 0xc0, 0x2, 0xb0, + 0x2c, 0xe, 0x0, 0xe0, 0x2c, 0x0, 0x2b, 0x2, + 0xc0, 0xe0, 0xe, 0x2, 0xc0, 0x2, 0xb0, 0x2c, + 0xe, 0x0, 0xe0, 0x2c, 0x0, 0x2b, 0x2, 0xc0, + 0xe6, 0x66, 0x67, 0xc0, 0x2, 0xb0, 0x2c, 0xe, + 0x0, 0x0, 0x1, 0x0, 0x3d, 0x67, 0xc0, 0xe0, + 0x0, 0x0, 0x0, 0x3, 0xb0, 0x2c, 0xe, 0x0, + 0x0, 0x0, 0x50, 0x38, 0x0, 0x10, 0xe0, 0x0, + 0x0, 0x7, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x0, 0x8d, 0xcc, 0xcc, + 0xdd, 0x20, + + /* U+5440 "å‘€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x2, + 0x0, 0x3, 0x27, 0x66, 0x69, 0x7b, 0x20, 0xb7, + 0x66, 0xe0, 0x30, 0x0, 0xe0, 0x0, 0xb, 0x20, + 0x1d, 0xb, 0x60, 0xe, 0x0, 0x0, 0xb2, 0x1, + 0xd0, 0xd0, 0x0, 0xe0, 0x0, 0xb, 0x20, 0x1d, + 0x3a, 0x0, 0xe, 0x5, 0x30, 0xb2, 0x1, 0xd5, + 0x86, 0x7e, 0xe6, 0x65, 0xb, 0x20, 0x1d, 0x0, + 0x9, 0x7e, 0x0, 0x0, 0xb7, 0x66, 0xd0, 0x2, + 0xd0, 0xe0, 0x0, 0xb, 0x20, 0x9, 0x0, 0xc3, + 0xe, 0x0, 0x0, 0x70, 0x0, 0x0, 0x95, 0x0, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x74, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x0, 0x63, 0x2, 0x23, 0xe0, + 0x0, 0x0, 0x0, 0x40, 0x0, 0x16, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, + + /* U+544A "告" */ + 0x0, 0x2, 0x0, 0x1b, 0x10, 0x0, 0x0, 0x0, + 0xc, 0x60, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x3b, + 0x0, 0xe, 0x0, 0x46, 0x0, 0x0, 0xa6, 0x66, + 0x6e, 0x66, 0x65, 0x0, 0x5, 0x40, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x50, 0x47, 0x66, 0x66, 0x6a, 0x66, 0x67, + 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0x66, 0x66, 0x66, 0xb6, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0xa3, 0x0, 0x0, 0xe, 0x66, 0x66, + 0x66, 0xc3, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0xa3, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5462 "å‘¢" */ + 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x60, 0x86, + 0x6b, 0x21, 0xe6, 0x66, 0x66, 0xe1, 0xb2, 0xe, + 0x0, 0xd0, 0x0, 0x0, 0xe0, 0xb2, 0xe, 0x0, + 0xd0, 0x0, 0x0, 0xe0, 0xb2, 0xe, 0x0, 0xe6, + 0x66, 0x66, 0xe0, 0xb2, 0xe, 0x1, 0xc0, 0x20, + 0x0, 0x20, 0xb2, 0xe, 0x2, 0xb0, 0xe1, 0x1, + 0x40, 0xb2, 0xe, 0x4, 0x90, 0xd0, 0xb, 0xa0, + 0xb7, 0x6e, 0x7, 0x60, 0xd0, 0x96, 0x0, 0xb2, + 0xd, 0xb, 0x20, 0xe7, 0x30, 0x0, 0xc2, 0x2, + 0xc, 0x0, 0xe0, 0x0, 0x32, 0x10, 0x0, 0x75, + 0x0, 0xd0, 0x0, 0x44, 0x0, 0x0, 0x90, 0x0, + 0xe3, 0x11, 0x9a, 0x0, 0x7, 0x10, 0x0, 0x5a, + 0xaa, 0x93, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5468 "周" */ + 0x0, 0x9, 0x66, 0x66, 0x66, 0x66, 0x6c, 0x10, + 0x0, 0xd0, 0x0, 0x4, 0x0, 0x0, 0xd0, 0x0, + 0xd, 0x0, 0x0, 0xd0, 0x0, 0xc, 0x0, 0x0, + 0xd0, 0x0, 0xc, 0x7, 0x0, 0xc0, 0x0, 0xd, + 0x5, 0x76, 0xd6, 0x63, 0xc, 0x0, 0x0, 0xd0, + 0x0, 0xc, 0x0, 0x50, 0xc0, 0x0, 0xd, 0x47, + 0x66, 0x76, 0x67, 0x2c, 0x0, 0x1, 0xc0, 0x13, + 0x0, 0x6, 0x0, 0xc0, 0x0, 0x3a, 0x1, 0xd6, + 0x66, 0xe1, 0xc, 0x0, 0x5, 0x60, 0x1b, 0x0, + 0xd, 0x0, 0xc0, 0x0, 0x92, 0x1, 0xb0, 0x0, + 0xd0, 0xc, 0x0, 0xa, 0x0, 0x1d, 0x66, 0x6d, + 0x0, 0xc0, 0x6, 0x30, 0x1, 0x40, 0x0, 0x30, + 0x2c, 0x1, 0x50, 0x0, 0x0, 0x0, 0x3, 0x9f, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, + 0x0, + + /* U+5473 "味" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xb, 0x66, + 0xe2, 0x0, 0xd, 0x0, 0x71, 0x0, 0xd1, 0xe, + 0x6, 0x76, 0xe6, 0x66, 0x30, 0xc, 0x10, 0xe0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0xc1, 0xe, 0x0, + 0x0, 0xd0, 0x0, 0x51, 0xc, 0x10, 0xe5, 0x76, + 0x9f, 0x86, 0x68, 0x60, 0xc1, 0xe, 0x0, 0xd, + 0xf4, 0x20, 0x0, 0xc, 0x66, 0xe0, 0x5, 0x9d, + 0x9, 0x0, 0x0, 0xd1, 0xb, 0x1, 0xc0, 0xd0, + 0x75, 0x0, 0x7, 0x0, 0x0, 0xa2, 0xd, 0x0, + 0xd5, 0x0, 0x0, 0x0, 0x83, 0x0, 0xd0, 0x3, + 0xfa, 0x10, 0x0, 0x72, 0x0, 0xd, 0x0, 0x4, + 0x10, 0x0, 0x30, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, + + /* U+547C "呼" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x40, 0x1, + 0x0, 0x30, 0x1, 0x37, 0xac, 0xa7, 0x0, 0xb7, + 0x6e, 0x33, 0x42, 0x1e, 0x0, 0x0, 0xa, 0x20, + 0xe0, 0x41, 0x0, 0xe0, 0x9, 0x60, 0xa2, 0xe, + 0x0, 0xc1, 0xe, 0x2, 0xc0, 0xa, 0x20, 0xe0, + 0x8, 0x80, 0xe0, 0x91, 0x0, 0xa2, 0xe, 0x0, + 0x23, 0xe, 0x21, 0x1, 0xa, 0x20, 0xe4, 0x76, + 0x66, 0xe6, 0x69, 0xa0, 0xa2, 0xe, 0x0, 0x0, + 0xe, 0x0, 0x0, 0xa, 0x76, 0xe0, 0x0, 0x0, + 0xe0, 0x0, 0x0, 0xb2, 0xa, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x1d, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, + 0x0, + + /* U+547D "命" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc4, 0x18, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x50, 0x4, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0xa4, 0x0, 0x1, 0x6d, 0x82, 0x0, + 0x0, 0x49, 0x37, 0x66, 0x66, 0x61, 0xaf, 0xb1, + 0x6, 0x40, 0x0, 0x10, 0x1, 0x0, 0x33, 0x0, + 0x0, 0xd, 0x66, 0xd2, 0xd, 0x66, 0xe3, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xe, 0x66, 0xe0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xa0, 0xd, 0x5c, 0xc0, 0x0, + 0x0, 0x5, 0x0, 0x0, 0xd, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + + /* U+548C "å’Œ" */ + 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x48, 0xca, 0x81, 0x10, 0x0, 0x10, 0x0, + 0x31, 0xd, 0x0, 0xc, 0x66, 0x6c, 0x60, 0x0, + 0x0, 0xd0, 0x0, 0xc2, 0x0, 0xb3, 0x2, 0x66, + 0x6e, 0x6a, 0x5c, 0x20, 0xb, 0x30, 0x0, 0x8, + 0xd0, 0x0, 0xc2, 0x0, 0xb3, 0x0, 0x0, 0xde, + 0x50, 0xc, 0x20, 0xb, 0x30, 0x0, 0x68, 0xd4, + 0xd3, 0xc2, 0x0, 0xb3, 0x0, 0xb, 0xd, 0x4, + 0x8c, 0x20, 0xb, 0x30, 0x8, 0x20, 0xd0, 0x0, + 0xc2, 0x0, 0xb3, 0x4, 0x40, 0xd, 0x0, 0xc, + 0x76, 0x6c, 0x30, 0x30, 0x0, 0xd0, 0x0, 0xc2, + 0x0, 0xa3, 0x0, 0x0, 0xd, 0x0, 0x7, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+54B2 "å’²" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x18, 0x0, 0x3, 0xb1, 0x0, 0x30, + 0x4, 0x0, 0x7b, 0x0, 0x97, 0x0, 0xe, 0x66, + 0xe2, 0x0, 0xe1, 0x9, 0x0, 0x0, 0xe0, 0xe, + 0x0, 0x2, 0x5, 0x11, 0x80, 0xe, 0x0, 0xe0, + 0x76, 0x6d, 0x76, 0x66, 0x20, 0xe0, 0xe, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0xe, 0x0, 0xe0, 0x0, + 0xe, 0x0, 0x0, 0x10, 0xe0, 0xe, 0x57, 0x66, + 0xe6, 0x66, 0xaa, 0xe, 0x0, 0xe0, 0x0, 0x2c, + 0x60, 0x0, 0x0, 0xe6, 0x6e, 0x0, 0x6, 0x84, + 0x30, 0x0, 0xb, 0x0, 0x30, 0x0, 0xb3, 0xa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0x0, 0x95, + 0x0, 0x0, 0x0, 0x0, 0x2a, 0x10, 0x1, 0xe4, + 0x0, 0x0, 0x0, 0x57, 0x0, 0x0, 0x5, 0xfa, + 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x4, 0x10, + + /* U+54C1 "å“" */ + 0x0, 0x4, 0x0, 0x0, 0x2, 0x30, 0x0, 0x0, + 0xc, 0x76, 0x66, 0x69, 0xa0, 0x0, 0x0, 0xb, + 0x20, 0x0, 0x5, 0x70, 0x0, 0x0, 0xb, 0x20, + 0x0, 0x5, 0x70, 0x0, 0x0, 0xb, 0x20, 0x0, + 0x5, 0x80, 0x0, 0x0, 0xc, 0x76, 0x66, 0x69, + 0x80, 0x0, 0x0, 0x5, 0x0, 0x0, 0x2, 0x10, + 0x0, 0x9, 0x66, 0x7a, 0x0, 0x96, 0x66, 0xb1, + 0xe, 0x0, 0x3c, 0x0, 0xd0, 0x0, 0xe0, 0xe, + 0x0, 0x3b, 0x0, 0xd0, 0x0, 0xe0, 0xe, 0x0, + 0x3b, 0x0, 0xd0, 0x0, 0xe0, 0xe, 0x0, 0x3c, + 0x0, 0xd0, 0x0, 0xe0, 0xe, 0x66, 0x8c, 0x0, + 0xe6, 0x66, 0xe0, 0xd, 0x0, 0x26, 0x1, 0xb0, + 0x0, 0xa0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+54E1 "å“¡" */ + 0x0, 0x3, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, + 0xc6, 0x66, 0x66, 0x6e, 0x0, 0x0, 0xc, 0x10, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xc6, 0x66, 0x66, + 0x6d, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x90, + 0x0, 0xa, 0x66, 0x66, 0x66, 0x66, 0xc1, 0x0, + 0xe0, 0x0, 0x0, 0x0, 0xd, 0x0, 0xe, 0x66, + 0x66, 0x66, 0x66, 0xd0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xe, 0x66, 0x66, 0x66, 0x66, + 0xd0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xd, 0x0, + 0xe, 0x66, 0x66, 0x66, 0x66, 0xd0, 0x0, 0x40, + 0x2c, 0x20, 0x65, 0x1, 0x0, 0x0, 0x4c, 0x50, + 0x0, 0x5d, 0x91, 0x2, 0x75, 0x0, 0x0, 0x0, + 0xa, 0xb1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3, + + /* U+54EA "哪" */ + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x1, + 0x0, 0x17, 0x78, 0x6e, 0x1c, 0x68, 0xc0, 0xc6, + 0x7c, 0x2, 0x90, 0xd0, 0xc0, 0x85, 0xc, 0x2, + 0x90, 0x29, 0xd, 0xc, 0x9, 0x0, 0xc0, 0x29, + 0x37, 0xb6, 0xd0, 0xc1, 0x50, 0xc, 0x2, 0x90, + 0x29, 0xd, 0xc, 0x51, 0x0, 0xc0, 0x29, 0x3, + 0x80, 0xd0, 0xc0, 0x80, 0xc, 0x2, 0x90, 0x38, + 0xc, 0xc, 0x5, 0x50, 0xc6, 0x79, 0x5a, 0x96, + 0xd0, 0xc0, 0xb, 0xc, 0x2, 0x70, 0xa1, 0xd, + 0xc, 0x0, 0xc0, 0xb0, 0x0, 0x1a, 0x0, 0xc0, + 0xc5, 0x7c, 0x0, 0x0, 0x8, 0x20, 0x3a, 0xc, + 0xa, 0x20, 0x0, 0x4, 0x62, 0x9c, 0x50, 0xc0, + 0x0, 0x0, 0x3, 0x50, 0x2, 0x50, 0xc, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5546 "商" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xc2, 0x0, 0x0, 0x10, 0x5, + 0x66, 0x66, 0x6c, 0x86, 0x66, 0x9e, 0x20, 0x10, + 0x6, 0x0, 0x0, 0x29, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0x0, 0x8, 0x40, 0x0, 0x0, 0x8, 0x66, + 0xd6, 0x66, 0xa6, 0x6a, 0x40, 0x0, 0xd0, 0x2, + 0x20, 0x10, 0x0, 0xa2, 0x0, 0xd, 0x0, 0xb7, + 0x0, 0x9a, 0x1a, 0x20, 0x0, 0xd0, 0x75, 0x0, + 0x0, 0x87, 0xa2, 0x0, 0xd, 0x33, 0x96, 0x66, + 0xb3, 0xa, 0x20, 0x0, 0xd0, 0xd, 0x0, 0xb, + 0x10, 0xa2, 0x0, 0xd, 0x0, 0xd0, 0x0, 0xb1, + 0xa, 0x20, 0x0, 0xd0, 0xd, 0x66, 0x6d, 0x10, + 0xa2, 0x0, 0xd, 0x0, 0xb0, 0x0, 0x60, 0xa, + 0x20, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x3a, 0xf1, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, + + /* U+554A "啊" */ + 0x0, 0x0, 0x53, 0x54, 0x0, 0x0, 0x25, 0x9, + 0x69, 0x2c, 0x3a, 0x65, 0x66, 0x6e, 0x50, 0xc0, + 0xc0, 0xc0, 0xa0, 0x0, 0x0, 0xd0, 0xc, 0xc, + 0xc, 0x8, 0x0, 0x0, 0xd, 0x0, 0xc0, 0xc0, + 0xc4, 0x30, 0xc6, 0xd1, 0xd0, 0xc, 0xc, 0xc, + 0x31, 0xc, 0xc, 0xd, 0x0, 0xc0, 0xc0, 0xc0, + 0x80, 0xc0, 0xc0, 0xd0, 0xc, 0xc, 0xc, 0x6, + 0x5c, 0xc, 0xd, 0x0, 0xc6, 0xd0, 0xc0, 0x57, + 0xd5, 0xd0, 0xd0, 0xc, 0x9, 0xc, 0x6b, 0x5a, + 0x6, 0xd, 0x0, 0x70, 0x0, 0xc1, 0x70, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x1, 0x42, + 0xd0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x2, 0xd9, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+554F "å•" */ + 0x1a, 0x66, 0x6a, 0x50, 0x96, 0x66, 0xa3, 0xd, + 0x0, 0x9, 0x50, 0xd0, 0x0, 0xc1, 0xd, 0x0, + 0x9, 0x40, 0xd0, 0x0, 0xc1, 0xe, 0x66, 0x6b, + 0x40, 0xd6, 0x66, 0xd1, 0xd, 0x0, 0x9, 0x40, + 0xd0, 0x0, 0xc1, 0xe, 0x66, 0x6b, 0x40, 0xd6, + 0x66, 0xd1, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc1, 0xd, 0x0, 0x96, 0x66, 0x6a, 0x0, 0xc1, + 0xd, 0x0, 0xd0, 0x0, 0x9, 0x0, 0xc1, 0xd, + 0x0, 0xd0, 0x0, 0x9, 0x0, 0xc1, 0xd, 0x0, + 0xd6, 0x66, 0x69, 0x0, 0xc1, 0xd, 0x0, 0xd0, + 0x0, 0x9, 0x0, 0xc1, 0xd, 0x0, 0x0, 0x0, + 0x1, 0x22, 0xe0, 0xd, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xc0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, + + /* U+5566 "啦" */ + 0x0, 0x0, 0x2, 0x80, 0x1, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0x0, 0xb, 0x10, 0x0, 0x10, + 0x10, 0x2, 0xa0, 0x0, 0x88, 0x0, 0xc, 0x6c, + 0x60, 0x2a, 0x61, 0x14, 0x45, 0x40, 0xd0, 0xa3, + 0x88, 0xc5, 0x36, 0x55, 0x54, 0xd, 0xa, 0x20, + 0x2a, 0x0, 0x0, 0x7, 0x0, 0xd0, 0xa2, 0x2, + 0xa1, 0x44, 0x0, 0xf2, 0xd, 0xa, 0x20, 0x3d, + 0x50, 0x90, 0x2c, 0x0, 0xd0, 0xa6, 0xbb, 0xa0, + 0xa, 0x24, 0x80, 0xd, 0x6c, 0x34, 0x2a, 0x0, + 0x77, 0x73, 0x0, 0xd0, 0xa2, 0x2, 0xa0, 0x5, + 0x69, 0x0, 0x9, 0x0, 0x0, 0x2a, 0x0, 0x0, + 0x80, 0x0, 0x0, 0x1, 0x15, 0xa0, 0x0, 0x6, + 0x17, 0x0, 0x0, 0x28, 0xf6, 0x37, 0x66, 0x66, + 0x71, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5584 "å–„" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x40, 0x0, 0xb3, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xf0, 0x5, 0x60, 0x4, 0x0, + 0x0, 0x76, 0x66, 0x96, 0x98, 0x66, 0x7b, 0x30, + 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x80, 0x0, + 0x0, 0x7, 0x76, 0x67, 0xd6, 0x66, 0x62, 0x0, + 0x3, 0x66, 0x66, 0x67, 0xd6, 0x66, 0x6b, 0xa0, + 0x0, 0x10, 0x80, 0x2, 0xb0, 0x8, 0x40, 0x0, + 0x0, 0x0, 0x78, 0x2, 0xb0, 0x1a, 0x10, 0x20, + 0x5, 0x66, 0x78, 0x67, 0xc6, 0x96, 0x68, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x69, 0xa0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x5, 0x80, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x5, 0x80, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x69, 0x80, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x2, 0x20, 0x0, + + /* U+5589 "å–‰" */ + 0x0, 0x0, 0x0, 0x81, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x16, 0x6a, 0xa0, 0x0, 0x96, + 0x6d, 0x6, 0x60, 0x0, 0x94, 0x0, 0xa, 0x11, + 0xb0, 0xa0, 0x0, 0xc, 0x4, 0x30, 0xa1, 0x1b, + 0x1d, 0x38, 0xa6, 0x66, 0x64, 0xa, 0x11, 0xb7, + 0xc0, 0x4a, 0x0, 0x1, 0x0, 0xa1, 0x1b, 0x6c, + 0x9, 0x69, 0x67, 0x90, 0xa, 0x11, 0xb0, 0xc2, + 0x40, 0xc0, 0x0, 0x0, 0xa1, 0x1b, 0xc, 0x32, + 0x2d, 0x22, 0x45, 0xa, 0x66, 0xb0, 0xc4, 0x44, + 0xd8, 0x44, 0x30, 0xb1, 0x7, 0xc, 0x0, 0x2a, + 0x71, 0x0, 0x4, 0x0, 0x0, 0xc0, 0x8, 0x41, + 0xa0, 0x0, 0x0, 0x0, 0xc, 0x2, 0x90, 0x8, + 0x90, 0x0, 0x0, 0x0, 0xd2, 0x70, 0x0, 0xb, + 0x90, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, + 0x0, + + /* U+559C "å–œ" */ + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x56, 0x66, 0x6d, 0x66, 0x66, 0xd8, 0x0, + 0x0, 0x10, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x66, 0x6d, 0x66, 0x7d, 0x20, 0x0, + 0x0, 0x0, 0x50, 0x0, 0x0, 0x5, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x10, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xd8, 0x66, 0x68, 0x7b, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x90, 0x9, 0x50, 0x1, 0x0, + 0x6, 0x66, 0x66, 0xb6, 0x69, 0x66, 0x6d, 0x80, + 0x1, 0x0, 0x30, 0x0, 0x0, 0x4, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6d, 0x30, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xc, 0x10, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6d, 0x10, 0x0, + 0x0, 0x0, 0x60, 0x0, 0x0, 0x5, 0x0, 0x0, + + /* U+559D "å–" */ + 0x0, 0x0, 0x5, 0x76, 0x66, 0x6b, 0x30, 0x62, + 0x28, 0x6, 0x70, 0x0, 0xe, 0x0, 0xc4, 0x3e, + 0x16, 0xa6, 0x66, 0x6e, 0x0, 0xc1, 0xe, 0x6, + 0x70, 0x0, 0xe, 0x0, 0xc1, 0xe, 0x6, 0xa6, + 0x66, 0x6e, 0x0, 0xc1, 0xe, 0x5, 0x97, 0x0, + 0x5, 0x0, 0xc1, 0xe, 0x0, 0xd3, 0x0, 0x0, + 0x41, 0xc1, 0xe, 0x9, 0x76, 0x97, 0x66, 0xd6, + 0xc6, 0x6d, 0x6c, 0x0, 0xd5, 0x0, 0xc2, 0xc1, + 0x6, 0x4c, 0x6, 0x78, 0x50, 0xd1, 0x60, 0x1, + 0xc, 0x36, 0x0, 0xc0, 0xe0, 0x0, 0x0, 0xc, + 0x10, 0x1, 0x60, 0xe0, 0x0, 0x0, 0x2a, 0x66, + 0x66, 0x52, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xae, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, + 0x0, + + /* U+55AE "å–®" */ + 0x0, 0x20, 0x4, 0x0, 0x30, 0x1, 0x20, 0x0, + 0xe, 0x66, 0xe2, 0xe, 0x66, 0x8a, 0x0, 0x0, + 0xd0, 0xd, 0x0, 0xd0, 0x4, 0x80, 0x0, 0xd, + 0x0, 0xd0, 0xd, 0x0, 0x48, 0x0, 0x0, 0xc6, + 0x6a, 0x0, 0xd6, 0x67, 0x60, 0x0, 0x5, 0x76, + 0x66, 0x76, 0x66, 0xc0, 0x0, 0x0, 0x66, 0x0, + 0x68, 0x0, 0xc, 0x0, 0x0, 0x6, 0x96, 0x6a, + 0xb6, 0x66, 0xc0, 0x0, 0x0, 0x66, 0x0, 0x68, + 0x0, 0xc, 0x0, 0x0, 0x6, 0x60, 0x6, 0x80, + 0x0, 0xc0, 0x0, 0x0, 0x68, 0x66, 0xab, 0x66, + 0x6b, 0x0, 0x0, 0x0, 0x0, 0x6, 0x80, 0x0, + 0x3, 0x80, 0x57, 0x66, 0x66, 0xab, 0x66, 0x66, + 0x66, 0x10, 0x0, 0x0, 0x6, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x40, 0x0, 0x0, 0x0, + + /* U+55B6 "å–¶" */ + 0x0, 0x3, 0x10, 0x17, 0x0, 0x8, 0x0, 0x0, + 0x0, 0xc, 0x30, 0xa5, 0x4, 0xb1, 0x0, 0x0, + 0x0, 0x59, 0x5, 0x70, 0x90, 0x0, 0x0, 0x3, + 0x0, 0x0, 0x0, 0x21, 0x0, 0x40, 0x0, 0xb6, + 0x66, 0x66, 0x66, 0x66, 0x6e, 0x70, 0x78, 0x5, + 0x66, 0x66, 0x6a, 0x31, 0x70, 0x6, 0x10, 0x75, + 0x0, 0x0, 0xa2, 0x10, 0x0, 0x0, 0x7, 0x50, + 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, 0x79, 0x66, + 0x66, 0xa2, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x66, 0x66, 0x66, + 0x68, 0xb0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, + 0x48, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x4, + 0x80, 0x0, 0x0, 0xe6, 0x66, 0x66, 0x66, 0x88, + 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x2, 0x30, + 0x0, + + /* U+55CE "å—Ž" */ + 0x30, 0x4, 0x6, 0x33, 0x33, 0x33, 0xa1, 0xe, + 0x66, 0xe1, 0xd3, 0x33, 0xd3, 0x33, 0x10, 0xd0, + 0xd, 0xd, 0x0, 0xd, 0x1, 0x40, 0xd, 0x0, + 0xd0, 0xd6, 0x66, 0xe6, 0x66, 0x0, 0xd0, 0xd, + 0xd, 0x0, 0xd, 0x0, 0x20, 0xd, 0x0, 0xd0, + 0xd6, 0x66, 0xe6, 0x6a, 0x10, 0xd0, 0xd, 0xd, + 0x0, 0xd, 0x0, 0x0, 0xd, 0x0, 0xd0, 0xd5, + 0x65, 0xd6, 0x67, 0xd0, 0xe6, 0x6e, 0x7, 0x0, + 0x0, 0x0, 0x1b, 0xd, 0x0, 0x20, 0x1, 0x3, + 0x5, 0x62, 0xa0, 0x20, 0x0, 0x6, 0x64, 0x1b, + 0xc, 0x79, 0x0, 0x0, 0x5, 0x61, 0xd0, 0xa3, + 0x69, 0x70, 0x0, 0x0, 0xd2, 0x9, 0x2, 0x0, + 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xce, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x20, + 0x0, + + /* U+55EF "å—¯" */ + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x40, 0x8, + 0x66, 0xb1, 0xd6, 0x67, 0x66, 0x8c, 0x0, 0xb1, + 0xd, 0xd, 0x0, 0x69, 0x3, 0x90, 0xb, 0x10, + 0xd0, 0xd3, 0x69, 0x9a, 0x59, 0x0, 0xb1, 0xd, + 0xd, 0x0, 0x94, 0x3, 0x90, 0xb, 0x10, 0xd0, + 0xd0, 0x2b, 0x69, 0x39, 0x0, 0xb1, 0xd, 0xd, + 0x28, 0x0, 0x95, 0x90, 0xb, 0x66, 0xd0, 0xd6, + 0x55, 0x55, 0x7a, 0x0, 0xb1, 0xd, 0x8, 0x0, + 0x20, 0x2, 0x40, 0xc, 0x10, 0x10, 0x3, 0x5, + 0xa0, 0x11, 0x0, 0x30, 0x0, 0x60, 0xb7, 0xc, + 0x10, 0xa6, 0x0, 0x0, 0x1d, 0xb, 0x30, 0x0, + 0x51, 0xe1, 0x0, 0x8, 0x80, 0xb4, 0x0, 0xa, + 0x4, 0x0, 0x0, 0x0, 0x6, 0xdb, 0xbb, 0xd2, + 0x0, + + /* U+561B "嘛" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, + 0x10, 0x20, 0x0, 0x57, 0x0, 0x50, 0xd, 0x6d, + 0x2c, 0x66, 0x76, 0x68, 0x78, 0x20, 0xd0, 0xd0, + 0xc1, 0xd, 0x0, 0x94, 0x0, 0xd, 0xd, 0xc, + 0x10, 0xc0, 0x9, 0x20, 0x0, 0xd0, 0xd0, 0xc6, + 0x6d, 0xa4, 0xc7, 0xb3, 0xd, 0xd, 0xd, 0x13, + 0xc0, 0xd, 0x70, 0x0, 0xd0, 0xd0, 0xd0, 0x8d, + 0x92, 0xf8, 0x0, 0xe, 0x6e, 0x1b, 0xc, 0xc6, + 0x9d, 0x81, 0x0, 0xd0, 0x84, 0x76, 0x5c, 0x9, + 0x94, 0x90, 0x6, 0x0, 0x83, 0x80, 0xc4, 0x49, + 0x2b, 0x40, 0x0, 0x8, 0x70, 0xc, 0x50, 0x92, + 0x38, 0x0, 0x6, 0x20, 0x0, 0xc0, 0x9, 0x20, + 0x0, 0x2, 0x30, 0x0, 0xc, 0x0, 0xa3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + + /* U+56B4 "åš´" */ + 0x0, 0x3, 0x0, 0x4, 0x2, 0x0, 0x2, 0x0, + 0x0, 0xb7, 0x66, 0xd0, 0xb6, 0x66, 0xc0, 0x0, + 0xa, 0x30, 0xc, 0xb, 0x0, 0xb, 0x0, 0x0, + 0xb7, 0x66, 0xd0, 0xb6, 0x66, 0xb0, 0x0, 0x34, + 0x0, 0x2, 0x3, 0x0, 0x8, 0x20, 0xa, 0x76, + 0x66, 0x66, 0x68, 0x66, 0x64, 0x0, 0xa3, 0x18, + 0x6d, 0x10, 0xd4, 0x0, 0x0, 0xa, 0x20, 0x1, + 0xa1, 0x1b, 0x0, 0x41, 0x0, 0xb4, 0x7a, 0x68, + 0xb8, 0x86, 0xaa, 0x30, 0xc, 0x11, 0xc6, 0x88, + 0x85, 0x9, 0x30, 0x0, 0xd0, 0x1a, 0x4, 0x94, + 0x60, 0xc0, 0x0, 0xc, 0x1, 0xc6, 0x88, 0x2, + 0x9a, 0x0, 0x2, 0x80, 0x1a, 0x4, 0x83, 0xc, + 0x70, 0x0, 0x62, 0x37, 0xd8, 0x9a, 0x6, 0x6b, + 0x50, 0x7, 0x5, 0x61, 0x4, 0x85, 0x50, 0x1c, + 0x80, 0x10, 0x0, 0x0, 0x12, 0x10, 0x0, 0x0, + + /* U+56DB "å››" */ + 0x40, 0x0, 0x0, 0x0, 0x0, 0x6, 0xd, 0x66, + 0x6e, 0x66, 0xe6, 0x66, 0xf1, 0xd1, 0x1, 0xc0, + 0xe, 0x0, 0xe, 0xd, 0x10, 0x1c, 0x0, 0xe0, + 0x0, 0xe0, 0xd1, 0x1, 0xb0, 0xe, 0x0, 0xe, + 0xd, 0x10, 0x3a, 0x0, 0xe0, 0x0, 0xe0, 0xd1, + 0x5, 0x80, 0xe, 0x0, 0xe, 0xd, 0x10, 0x85, + 0x0, 0xe0, 0x0, 0xe0, 0xd1, 0xc, 0x0, 0xd, + 0x10, 0xe, 0xd, 0x17, 0x50, 0x0, 0x7c, 0xd8, + 0xe0, 0xd6, 0x50, 0x0, 0x0, 0x0, 0xe, 0xd, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xd6, 0x66, + 0x66, 0x66, 0x66, 0x6e, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x0, + + /* U+56DE "回" */ + 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc, 0x66, + 0x66, 0x66, 0x66, 0x66, 0xe1, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xd0, 0xc1, 0x9, 0x66, 0x66, 0xb1, 0xd, + 0xc, 0x10, 0xd0, 0x0, 0xe, 0x0, 0xd0, 0xc1, + 0xd, 0x0, 0x0, 0xd0, 0xd, 0xc, 0x10, 0xd0, + 0x0, 0xd, 0x0, 0xd0, 0xc1, 0xd, 0x66, 0x66, + 0xe0, 0xd, 0xc, 0x10, 0xd0, 0x0, 0xb, 0x0, + 0xd0, 0xc1, 0x1, 0x0, 0x0, 0x0, 0xd, 0xc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xd0, 0xd6, 0x66, + 0x66, 0x66, 0x66, 0x6d, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xb0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+56E0 "å› " */ + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0xe, + 0x66, 0x66, 0x66, 0x66, 0x66, 0xe2, 0xd, 0x0, + 0x0, 0xb4, 0x0, 0x0, 0xe0, 0xd, 0x0, 0x0, + 0xc1, 0x0, 0x0, 0xe0, 0xd, 0x0, 0x0, 0xc1, + 0x1, 0x50, 0xe0, 0xd, 0x18, 0x66, 0xe6, 0x67, + 0x81, 0xe0, 0xd, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0xe0, 0xd, 0x0, 0x1, 0xd7, 0x0, 0x0, 0xe0, + 0xd, 0x0, 0x7, 0x72, 0xc2, 0x0, 0xe0, 0xd, + 0x0, 0xc, 0x0, 0x5e, 0x10, 0xe0, 0xd, 0x0, + 0x93, 0x0, 0xc, 0x50, 0xe0, 0xd, 0x16, 0x20, + 0x0, 0x2, 0x10, 0xe0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0xe, 0x66, 0x66, 0x66, 0x66, + 0x66, 0xe0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x30, + + /* U+56F0 "å›°" */ + 0xa6, 0x66, 0x66, 0x66, 0x66, 0x6b, 0x1e, 0x0, + 0x0, 0x28, 0x0, 0x0, 0xe0, 0xe0, 0x0, 0x2, + 0xc0, 0x0, 0xe, 0xe, 0x0, 0x0, 0x2b, 0x0, + 0x10, 0xe0, 0xe1, 0x76, 0x69, 0xd6, 0x6d, 0x3e, + 0xe, 0x0, 0x2, 0xfb, 0x0, 0x0, 0xe0, 0xe0, + 0x0, 0x97, 0xd3, 0x0, 0xe, 0xe, 0x0, 0x3b, + 0x2b, 0x5b, 0x20, 0xe0, 0xe0, 0xa, 0x12, 0xb0, + 0x5f, 0x1e, 0xe, 0x8, 0x20, 0x2b, 0x0, 0x91, + 0xe0, 0xe5, 0x10, 0x2, 0xb0, 0x0, 0xe, 0xe, + 0x0, 0x0, 0x3c, 0x0, 0x0, 0xe0, 0xe0, 0x0, + 0x1, 0x20, 0x0, 0xe, 0xe, 0x66, 0x66, 0x66, + 0x66, 0x66, 0xe0, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, + + /* U+56F3 "図" */ + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, + 0xe6, 0x66, 0x66, 0x66, 0x66, 0x67, 0xd0, 0xd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x0, 0xd0, + 0x0, 0x1, 0x70, 0x2, 0x3, 0xb0, 0xd, 0x0, + 0x2a, 0x29, 0x61, 0xf2, 0x3b, 0x0, 0xd0, 0x6, + 0x4c, 0x36, 0x89, 0x3, 0xb0, 0xd, 0x0, 0x35, + 0x60, 0x1d, 0x0, 0x3b, 0x0, 0xd0, 0x0, 0x82, + 0xa, 0x50, 0x3, 0xb0, 0xd, 0x0, 0x1, 0xb5, + 0xa0, 0x0, 0x3b, 0x0, 0xd0, 0x0, 0x5, 0xf2, + 0x0, 0x3, 0xb0, 0xd, 0x0, 0x2, 0xa5, 0xd5, + 0x0, 0x3b, 0x0, 0xd0, 0x5, 0x80, 0x2, 0xdd, + 0x84, 0xb0, 0xd, 0x16, 0x30, 0x0, 0x0, 0x65, + 0x3b, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xb0, 0xe, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7b, + 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, + + /* U+56FD "国" */ + 0x96, 0x66, 0x66, 0x66, 0x66, 0x6b, 0x1d, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xe0, 0xc1, 0x56, 0x66, + 0x66, 0x7d, 0x2e, 0xc, 0x11, 0x0, 0xc1, 0x0, + 0x0, 0xe0, 0xc1, 0x0, 0xc, 0x10, 0x0, 0xe, + 0xc, 0x10, 0x0, 0xc1, 0x7, 0x20, 0xe0, 0xc1, + 0x46, 0x6d, 0x76, 0x64, 0xe, 0xc, 0x10, 0x0, + 0xc1, 0x96, 0x0, 0xe0, 0xc1, 0x0, 0xc, 0x10, + 0xe2, 0xe, 0xc, 0x10, 0x0, 0xc1, 0x3, 0x30, + 0xe0, 0xc3, 0x86, 0x6b, 0x66, 0x8c, 0x3e, 0xc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xd6, 0x66, + 0x66, 0x66, 0x66, 0x6e, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xc0, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+570B "國" */ + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, + 0xe6, 0x66, 0x66, 0x76, 0x66, 0x67, 0xc0, 0xd, + 0x0, 0x0, 0x6, 0xb8, 0x0, 0x3a, 0x0, 0xd0, + 0x0, 0x0, 0x56, 0x76, 0x33, 0xa0, 0xd, 0x28, + 0x66, 0x69, 0x96, 0x7b, 0x5a, 0x0, 0xd0, 0x0, + 0x0, 0x47, 0x0, 0x3, 0xa0, 0xd, 0xa, 0x66, + 0xc3, 0x80, 0x74, 0x3a, 0x0, 0xd0, 0xc0, 0xc, + 0xa, 0xc, 0x23, 0xa0, 0xd, 0xc, 0x0, 0xc0, + 0xb2, 0x90, 0x3a, 0x0, 0xd0, 0xc6, 0x6b, 0x8, + 0xc2, 0x3, 0xa0, 0xd, 0x3, 0x0, 0x32, 0x4e, + 0x2, 0x6a, 0x0, 0xd2, 0x89, 0x72, 0x2a, 0x6a, + 0x93, 0xa0, 0xd, 0x17, 0x0, 0x38, 0x0, 0x6f, + 0x4a, 0x0, 0xd0, 0x0, 0x13, 0x0, 0x0, 0x24, + 0xa0, 0xe, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7a, + 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, + + /* U+570D "åœ" */ + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0xe, + 0x66, 0x66, 0x76, 0x66, 0x66, 0xd4, 0xd, 0x0, + 0x0, 0xe1, 0x0, 0x0, 0xc1, 0xd, 0x0, 0x0, + 0xc0, 0x6, 0x0, 0xc1, 0xd, 0x3, 0x78, 0xc6, + 0x6d, 0x10, 0xc1, 0xd, 0x23, 0x37, 0x93, 0x3c, + 0x75, 0xc1, 0xd, 0x24, 0x53, 0x33, 0x37, 0x32, + 0xc1, 0xd, 0x0, 0xc6, 0x66, 0x6d, 0x10, 0xc1, + 0xd, 0x0, 0xb5, 0x59, 0x5b, 0x0, 0xc1, 0xd, + 0x4, 0x66, 0x6e, 0x68, 0x80, 0xc1, 0xd, 0x1, + 0xc0, 0xd, 0x0, 0x10, 0xc1, 0xd, 0x7, 0xa6, + 0x6e, 0x67, 0xc0, 0xc1, 0xd, 0x0, 0x0, 0xd, + 0x0, 0x0, 0xc1, 0xd, 0x0, 0x0, 0x8, 0x0, + 0x0, 0xc1, 0xe, 0x66, 0x66, 0x66, 0x66, 0x66, + 0xd1, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, + + /* U+5712 "園" */ + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0xe, + 0x66, 0x66, 0x96, 0x66, 0x66, 0xe2, 0xd, 0x0, + 0x0, 0xc3, 0x0, 0x0, 0xd0, 0xd, 0x0, 0x56, + 0xd6, 0x6d, 0x10, 0xd0, 0xd, 0x0, 0x10, 0xb1, + 0x0, 0x30, 0xd0, 0xd, 0x18, 0x66, 0x86, 0x66, + 0x93, 0xd0, 0xd, 0x0, 0x86, 0x66, 0x6a, 0x20, + 0xd0, 0xd, 0x0, 0xd0, 0x0, 0xd, 0x0, 0xd0, + 0xd, 0x0, 0xe6, 0x66, 0x6e, 0x0, 0xd0, 0xd, + 0x0, 0x5b, 0x30, 0x4, 0x90, 0xd0, 0xd, 0x0, + 0x7d, 0x33, 0x7, 0x50, 0xd0, 0xd, 0x6, 0x58, + 0x13, 0xb8, 0x0, 0xd0, 0xd, 0x41, 0x8, 0x10, + 0x9, 0xc0, 0xd0, 0xd, 0x0, 0x5, 0x0, 0x0, + 0x50, 0xd0, 0xe, 0x66, 0x66, 0x66, 0x66, 0x66, + 0xe0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, + + /* U+5718 "團" */ + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0xe, + 0x66, 0x66, 0x68, 0x66, 0x66, 0xc4, 0xd, 0x0, + 0x0, 0x1c, 0x0, 0x13, 0xb3, 0xd, 0x19, 0x77, + 0x7d, 0x77, 0x76, 0xb3, 0xd, 0x2, 0x86, 0x6d, + 0x66, 0xc0, 0xb3, 0xd, 0x2, 0xb4, 0x4d, 0x44, + 0xc0, 0xb3, 0xd, 0x2, 0xa2, 0x3c, 0x22, 0xc0, + 0xb3, 0xd, 0x2, 0xa6, 0x6d, 0x6a, 0x70, 0xb3, + 0xd, 0x3, 0x56, 0x7c, 0x57, 0xc4, 0xb3, 0xd, + 0x2, 0x52, 0x0, 0x86, 0x24, 0xb3, 0xd, 0x7, + 0x77, 0x66, 0xb9, 0x92, 0xb3, 0xd, 0x0, 0xa, + 0x10, 0x85, 0x0, 0xb3, 0xd, 0x0, 0x5, 0x56, + 0xc4, 0x0, 0xb3, 0xd, 0x0, 0x0, 0x3, 0xa0, + 0x0, 0xb3, 0xe, 0x66, 0x66, 0x66, 0x66, 0x66, + 0xc3, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, + + /* U+571F "土" */ + 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x10, 0x0, + 0x1, 0x66, 0x66, 0x6d, 0x76, 0x66, 0xe6, 0x0, + 0x0, 0x20, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x3, 0x0, + 0x27, 0x66, 0x66, 0x6c, 0x76, 0x66, 0x6d, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5728 "在" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5c, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x97, 0x0, 0x0, 0x1, 0x0, + 0x5, 0x66, 0x66, 0xf6, 0x66, 0x66, 0x8f, 0x40, + 0x1, 0x10, 0x7, 0x80, 0x3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x0, 0xe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xb4, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x80, 0x0, 0xd, 0x0, 0x23, 0x0, + 0x0, 0x5f, 0x14, 0x76, 0x6e, 0x66, 0x88, 0x0, + 0x4, 0x6c, 0x10, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x33, 0xc, 0x10, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0xd, 0x0, 0x1, 0x0, + 0x0, 0xc, 0x37, 0x66, 0x6d, 0x66, 0x6c, 0x90, + 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5730 "地" */ + 0x0, 0x5, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x1, 0xb0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xc, 0x1, 0xb0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x1, 0xb0, 0x7, 0x0, + 0x0, 0xe, 0x1, 0xd, 0x1, 0xc6, 0x6e, 0x0, + 0x8, 0x6e, 0x7a, 0xd, 0x56, 0xc0, 0xc, 0x0, + 0x0, 0xe, 0x4, 0x6d, 0x1, 0xb0, 0xc, 0x0, + 0x0, 0xe, 0x12, 0xd, 0x1, 0xb0, 0xc, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x1, 0xb0, 0xc, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x1, 0xb5, 0x9b, 0x0, + 0x0, 0xe, 0x3, 0x2d, 0x2, 0xc0, 0x73, 0x40, + 0x0, 0x4f, 0x82, 0xd, 0x1, 0x40, 0x0, 0x70, + 0x2e, 0xa2, 0x0, 0xd, 0x0, 0x0, 0x0, 0xc2, + 0x2, 0x0, 0x0, 0xa, 0xcc, 0xcc, 0xcd, 0xe3, + + /* U+5747 "å‡" */ + 0x0, 0xa, 0x20, 0x0, 0x86, 0x0, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x2, 0xc0, 0x0, 0x2, 0x0, 0x0, + 0xd0, 0x0, 0x88, 0x66, 0x66, 0xc6, 0x16, 0x6e, + 0x6b, 0x2a, 0x0, 0x0, 0xa, 0x30, 0x0, 0xd0, + 0x7, 0x23, 0x70, 0x0, 0xb2, 0x0, 0xd, 0x0, + 0x30, 0x9, 0x90, 0xb, 0x20, 0x0, 0xd0, 0x0, + 0x0, 0x2e, 0x0, 0xc2, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x15, 0xd, 0x10, 0x0, 0xd1, 0x65, 0x0, + 0x58, 0x10, 0xe0, 0x1, 0x6e, 0x81, 0x6, 0xc5, + 0x0, 0xf, 0x3, 0xf9, 0x10, 0x9, 0xc1, 0x0, + 0x1, 0xe0, 0x2, 0x0, 0x0, 0x0, 0x3, 0x21, + 0x8a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, + + /* U+574A "åŠ" */ + 0x0, 0x7, 0x20, 0x0, 0x37, 0x0, 0x0, 0x0, + 0x0, 0xd2, 0x0, 0x0, 0x9a, 0x0, 0x0, 0x0, + 0xc, 0x10, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, + 0xc1, 0x5, 0x66, 0x66, 0x66, 0xd6, 0x0, 0xc, + 0x17, 0x10, 0xb4, 0x0, 0x0, 0x0, 0x66, 0xd6, + 0x61, 0xc, 0x30, 0x0, 0x0, 0x0, 0xc, 0x10, + 0x0, 0xd7, 0x66, 0xa9, 0x0, 0x0, 0xc1, 0x0, + 0xf, 0x10, 0x9, 0x60, 0x0, 0xc, 0x10, 0x1, + 0xe0, 0x0, 0xa4, 0x0, 0x0, 0xc1, 0x34, 0x69, + 0x0, 0xc, 0x30, 0x1, 0x5e, 0x93, 0xc, 0x30, + 0x0, 0xd1, 0x2, 0xf9, 0x20, 0x5, 0x90, 0x0, + 0xe, 0x0, 0x1, 0x0, 0x2, 0xa0, 0x3, 0x4, + 0xc0, 0x0, 0x0, 0x4, 0x70, 0x0, 0x4d, 0xf6, + 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, 0x13, 0x0, + 0x0, + + /* U+5750 "å" */ + 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x10, 0xa, 0x30, 0x2, 0x10, 0x0, + 0x0, 0x8, 0xc0, 0xa, 0x30, 0x8, 0xc0, 0x0, + 0x0, 0xc, 0x40, 0xa, 0x30, 0xd, 0x40, 0x0, + 0x0, 0x1f, 0x0, 0xa, 0x30, 0x3e, 0x20, 0x0, + 0x0, 0x87, 0xb3, 0xa, 0x30, 0x93, 0xa5, 0x0, + 0x0, 0xb0, 0x3f, 0x1a, 0x32, 0x90, 0x1f, 0x20, + 0x7, 0x20, 0x9, 0xa, 0x37, 0x0, 0x8, 0x10, + 0x23, 0x0, 0x0, 0xa, 0x51, 0x2, 0x30, 0x0, + 0x0, 0x27, 0x66, 0x6c, 0x86, 0x69, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x9, 0x20, + 0x28, 0x66, 0x66, 0x67, 0x66, 0x66, 0x69, 0x70, + + /* U+578B "åž‹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x23, 0x0, 0x0, 0xc1, 0x6, 0x6b, + 0x6b, 0x87, 0x4, 0x10, 0xd0, 0x0, 0x1b, 0xb, + 0x10, 0xb, 0x30, 0xd0, 0x0, 0x1b, 0xb, 0x16, + 0xb, 0x10, 0xd0, 0x47, 0x7c, 0x6d, 0x78, 0x4b, + 0x10, 0xd0, 0x0, 0x48, 0xb, 0x10, 0xb, 0x10, + 0xd0, 0x0, 0x93, 0xb, 0x10, 0x6, 0x0, 0xd0, + 0x2, 0xa0, 0xb, 0x20, 0x2, 0x33, 0xd0, 0x18, + 0x0, 0x7, 0x62, 0x0, 0x5e, 0x80, 0x30, 0x0, + 0x0, 0xa5, 0x0, 0x3, 0x0, 0x0, 0x67, 0x66, + 0xc8, 0x66, 0x9c, 0x10, 0x0, 0x0, 0x0, 0xa3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa3, 0x0, + 0x0, 0x30, 0x46, 0x66, 0x66, 0xc8, 0x66, 0x67, + 0xf7, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+57DF "域" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x10, 0x0, 0x0, 0x76, 0x54, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x75, 0xc, 0x40, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x75, 0x2, 0x70, + 0x0, 0xe, 0x5, 0x76, 0x66, 0xa9, 0x67, 0x82, + 0x5, 0x6e, 0x98, 0x0, 0x0, 0x76, 0x0, 0x0, + 0x1, 0xe, 0x0, 0xb6, 0x7c, 0x66, 0xb, 0x30, + 0x0, 0xe, 0x0, 0xc0, 0x29, 0x57, 0x1e, 0x0, + 0x0, 0xe, 0x0, 0xc0, 0x29, 0x49, 0x77, 0x0, + 0x0, 0xe, 0x0, 0xc6, 0x79, 0x1c, 0xc1, 0x0, + 0x0, 0xe, 0x44, 0x50, 0x1, 0xe, 0x90, 0x0, + 0x19, 0xc9, 0x20, 0x0, 0x45, 0x2e, 0x70, 0x4, + 0x7, 0x10, 0x2a, 0xb7, 0x20, 0xb4, 0xe3, 0x34, + 0x0, 0x0, 0x5, 0x0, 0x1a, 0x30, 0x4e, 0xb3, + 0x0, 0x0, 0x0, 0x3, 0x81, 0x0, 0x4, 0xe3, + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x11, + + /* U+57F7 "執" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x1, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x10, 0x1, 0xc0, 0x0, 0x0, + 0x3, 0x66, 0xe6, 0xa2, 0x1, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x1, 0xc0, 0x25, 0x0, + 0x0, 0x0, 0xd0, 0x24, 0x57, 0xd5, 0x8c, 0x0, + 0x7, 0xb6, 0x66, 0x95, 0x2, 0xb0, 0x57, 0x0, + 0x0, 0x69, 0x4, 0xb0, 0x45, 0xa0, 0x76, 0x0, + 0x0, 0x8, 0x7, 0x50, 0xa, 0xb0, 0x85, 0x0, + 0x5, 0x76, 0xe6, 0x63, 0x9, 0xcb, 0x84, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xc, 0x8, 0x94, 0x0, + 0x7, 0x66, 0xe6, 0x99, 0x3a, 0x0, 0x85, 0x10, + 0x0, 0x0, 0xd0, 0x0, 0xa1, 0x0, 0x58, 0x60, + 0x0, 0x0, 0xe0, 0x6, 0x50, 0x0, 0x1d, 0xb0, + 0x0, 0x0, 0xe0, 0x64, 0x0, 0x0, 0x4, 0xf1, + 0x0, 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x11, + + /* U+57FA "基" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0x0, 0x0, 0xb3, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0x0, 0x0, 0xc2, 0x18, 0x0, + 0x0, 0x66, 0x6d, 0x66, 0x66, 0xd7, 0x66, 0x20, + 0x0, 0x0, 0x1d, 0x66, 0x66, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0x0, 0x0, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x66, 0x66, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0x0, 0x0, 0xc2, 0x5, 0x0, + 0x6, 0x76, 0x6d, 0x66, 0x66, 0xb6, 0x7c, 0x90, + 0x0, 0x0, 0x2c, 0x9, 0x30, 0x91, 0x0, 0x0, + 0x0, 0x2, 0xb1, 0xb, 0x20, 0x1b, 0x83, 0x0, + 0x0, 0x57, 0x46, 0x6c, 0x76, 0xd3, 0x7e, 0xb1, + 0x5, 0x10, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x11, 0x0, + 0x0, 0x56, 0x66, 0x6c, 0x76, 0x66, 0xcc, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5831 "å ±" */ + 0x0, 0x0, 0xb0, 0x0, 0x30, 0x0, 0x3, 0x0, + 0x0, 0x0, 0xd0, 0x10, 0xd6, 0x66, 0x6d, 0x30, + 0x3, 0x76, 0xe6, 0x91, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x1d, 0x0, + 0x15, 0x66, 0xe6, 0x98, 0xd0, 0x7, 0xe8, 0x0, + 0x1, 0x60, 0x4, 0x50, 0xd0, 0x0, 0x21, 0x0, + 0x0, 0x4b, 0x9, 0x20, 0xd7, 0x55, 0x5d, 0x50, + 0x3, 0x6c, 0x69, 0xa3, 0xd3, 0x20, 0x2d, 0x0, + 0x0, 0x10, 0xd0, 0x0, 0xd0, 0x80, 0x94, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x66, 0xb0, 0x0, + 0x17, 0x66, 0xe6, 0x98, 0xd0, 0xf, 0x30, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x78, 0xb0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xd5, 0x40, 0x6d, 0x50, + 0x0, 0x0, 0xe0, 0x0, 0xd2, 0x0, 0x7, 0x60, + 0x0, 0x0, 0x40, 0x0, 0x40, 0x0, 0x0, 0x0, + + /* U+5834 "å ´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x9, 0x66, 0x66, 0x6b, 0x10, + 0x0, 0xe, 0x0, 0xd, 0x0, 0x0, 0xe, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x66, 0x66, 0x6e, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x0, 0x0, 0xe, 0x0, + 0x18, 0x6e, 0x6b, 0x2e, 0x66, 0x66, 0x6e, 0x0, + 0x0, 0xe, 0x0, 0x8, 0x0, 0x0, 0x7, 0x10, + 0x0, 0xe, 0x2, 0x76, 0x76, 0x66, 0x66, 0xd3, + 0x0, 0xe, 0x0, 0x2, 0xd1, 0x0, 0x0, 0x10, + 0x0, 0xe, 0x1, 0x2b, 0x7b, 0x79, 0x98, 0xb0, + 0x0, 0xe, 0x76, 0x92, 0x4a, 0xd, 0x26, 0x70, + 0x18, 0xc7, 0x4, 0x2, 0xa0, 0x78, 0x8, 0x40, + 0x9, 0x10, 0x0, 0x47, 0x4, 0xa0, 0xb, 0x20, + 0x0, 0x0, 0x2, 0x20, 0x58, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x0, 0x17, 0x40, 0x19, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x30, 0x0, 0x1, 0x60, 0x0, + + /* U+584A "塊" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x10, 0x0, 0x8, 0x70, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x30, 0x19, 0x0, 0x4, 0x0, + 0x0, 0xe, 0x0, 0xc6, 0x68, 0xc6, 0x6f, 0x10, + 0x0, 0xe, 0x0, 0xb1, 0x3, 0xa0, 0xe, 0x0, + 0x5, 0x6e, 0x88, 0xb6, 0x68, 0xc6, 0x6e, 0x0, + 0x1, 0xe, 0x0, 0xb1, 0x4, 0x90, 0xe, 0x0, + 0x0, 0xe, 0x0, 0xb1, 0x6, 0x70, 0xe, 0x0, + 0x0, 0xe, 0x0, 0xc6, 0x6c, 0xd6, 0x6d, 0x0, + 0x0, 0xe, 0x0, 0x20, 0xd, 0xb1, 0x41, 0x0, + 0x0, 0xe, 0x66, 0x0, 0x68, 0xa1, 0xa1, 0x0, + 0x4, 0x9a, 0x10, 0x2, 0xc0, 0xa6, 0x28, 0x0, + 0xb, 0x40, 0x0, 0x1b, 0x20, 0xab, 0x79, 0x90, + 0x0, 0x0, 0x2, 0xa2, 0x0, 0xa2, 0x1, 0x90, + 0x0, 0x0, 0x55, 0x0, 0x0, 0x6c, 0xaa, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5869 "å¡©" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0x10, 0x0, 0xb3, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x0, 0x2, 0xc0, 0x0, 0x2, 0x0, + 0x0, 0xc, 0x0, 0x8, 0x86, 0x66, 0x6c, 0x40, + 0x0, 0xc, 0x0, 0x9, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x7d, 0x78, 0x66, 0x76, 0x66, 0x7a, 0x0, + 0x0, 0xc, 0x0, 0x16, 0x60, 0x0, 0x39, 0x0, + 0x0, 0xc, 0x0, 0x6, 0x60, 0x0, 0x39, 0x0, + 0x0, 0xc, 0x0, 0x6, 0x96, 0x66, 0x89, 0x0, + 0x0, 0xc, 0x0, 0x12, 0x0, 0x0, 0x2, 0x0, + 0x0, 0xd, 0x66, 0x4b, 0x6a, 0x6a, 0x6e, 0x20, + 0x4, 0xaa, 0x20, 0x2b, 0xc, 0xc, 0xd, 0x0, + 0x9, 0x40, 0x0, 0x2b, 0xc, 0xc, 0xd, 0x0, + 0x0, 0x0, 0x0, 0x2b, 0xc, 0xc, 0xd, 0x0, + 0x0, 0x0, 0x4, 0x7c, 0x6d, 0x6d, 0x6e, 0xc2, + 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+5883 "境" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x10, 0x0, 0x9, 0x30, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x2, 0x60, 0x26, 0x0, + 0x0, 0xe, 0x0, 0x48, 0x76, 0x69, 0x65, 0x10, + 0x0, 0xe, 0x0, 0x0, 0xb2, 0xb, 0x50, 0x0, + 0x6, 0x6e, 0x8a, 0x0, 0x62, 0x26, 0x4, 0x50, + 0x0, 0xe, 0x3, 0x76, 0x66, 0x66, 0x66, 0x50, + 0x0, 0xe, 0x0, 0xc, 0x66, 0x66, 0xc6, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x0, 0x0, 0xb1, 0x0, + 0x0, 0xe, 0x0, 0xe, 0x66, 0x66, 0xd1, 0x0, + 0x0, 0xe, 0x55, 0x2d, 0x0, 0x0, 0xb1, 0x0, + 0xb, 0xb6, 0x0, 0x9, 0xc9, 0xc7, 0x81, 0x20, + 0x2, 0x0, 0x0, 0x0, 0xd2, 0xa2, 0x0, 0x70, + 0x0, 0x0, 0x0, 0x8, 0x90, 0xa3, 0x0, 0xb0, + 0x0, 0x0, 0x26, 0x96, 0x0, 0x5d, 0xbc, 0xc1, + 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5897 "増" */ + 0x0, 0xb, 0x10, 0x5, 0x20, 0x0, 0x57, 0x0, + 0x0, 0xe, 0x0, 0x0, 0xd4, 0x0, 0xc5, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x68, 0x5, 0x30, 0x0, + 0x0, 0xe, 0x0, 0xc6, 0x66, 0x96, 0x66, 0xe0, + 0x4, 0x4e, 0x57, 0xd1, 0x0, 0xd0, 0x1, 0xd0, + 0x3, 0x2e, 0x21, 0xc6, 0x66, 0xe6, 0x66, 0xd0, + 0x0, 0xe, 0x0, 0xd1, 0x0, 0xd0, 0x1, 0xd0, + 0x0, 0xe, 0x0, 0xd6, 0x66, 0xa6, 0x66, 0xd0, + 0x0, 0xe, 0x0, 0x32, 0x0, 0x0, 0x3, 0x20, + 0x0, 0xe, 0x5, 0x1f, 0x66, 0x66, 0x6f, 0x10, + 0x0, 0x2f, 0x91, 0xe, 0x0, 0x0, 0xe, 0x0, + 0xc, 0xd3, 0x0, 0xe, 0x66, 0x66, 0x6e, 0x0, + 0x4, 0x0, 0x0, 0xe, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x66, 0x66, 0x6f, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x5, 0x0, + + /* U+589E "增" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb1, 0x0, 0x27, 0x0, 0xc, 0x30, 0x0, + 0xd, 0x0, 0x0, 0x96, 0x5, 0x60, 0x0, 0x0, + 0xd0, 0x8, 0x67, 0x86, 0xa6, 0x78, 0x0, 0xd, + 0x0, 0xc0, 0x0, 0xc0, 0x4, 0x70, 0x76, 0xe9, + 0x8c, 0x47, 0xc, 0xb, 0x77, 0x0, 0xd, 0x0, + 0xc0, 0xd2, 0xc3, 0x74, 0x70, 0x0, 0xd0, 0xc, + 0x4, 0xc, 0x30, 0x47, 0x0, 0xd, 0x0, 0xc6, + 0x66, 0x96, 0x68, 0x80, 0x0, 0xd0, 0x2, 0x30, + 0x0, 0x0, 0x60, 0x0, 0xd, 0x4, 0xe, 0x66, + 0x66, 0x7c, 0x0, 0x16, 0xd6, 0x0, 0xd0, 0x0, + 0x2, 0xa0, 0x1e, 0x60, 0x0, 0xe, 0x66, 0x66, + 0x7a, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x2, + 0xa0, 0x0, 0x0, 0x0, 0xe, 0x66, 0x66, 0x7b, + 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x10, + + /* U+58CA "壊" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, + 0x0, 0xd, 0x2, 0x66, 0x66, 0xd6, 0x69, 0x90, + 0x0, 0xd, 0x0, 0x10, 0x1, 0xa0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x86, 0x68, 0xb7, 0x6b, 0x30, + 0x5, 0x6e, 0x79, 0xa1, 0xc, 0xc, 0xa, 0x10, + 0x1, 0xd, 0x0, 0xa1, 0xc, 0xc, 0xa, 0x10, + 0x0, 0xd, 0x0, 0xb6, 0x6d, 0x6d, 0x6c, 0x20, + 0x0, 0xd, 0x0, 0x50, 0x2, 0x70, 0x4, 0x0, + 0x0, 0xd, 0x2, 0x66, 0x66, 0xd6, 0x6c, 0x30, + 0x0, 0xd, 0x5, 0x20, 0x97, 0x50, 0x3, 0x0, + 0x0, 0x2e, 0x70, 0x6, 0xd0, 0x35, 0x5b, 0x10, + 0xb, 0xd3, 0x0, 0x78, 0xc0, 0xb, 0x60, 0x0, + 0x4, 0x0, 0x36, 0x12, 0xc1, 0x42, 0xd5, 0x0, + 0x0, 0x0, 0x10, 0x4, 0xf7, 0x0, 0x3e, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x1, 0x0, + + /* U+58D3 "壓" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x76, 0x66, 0x66, 0x66, 0x66, 0x6d, 0x50, + 0x0, 0xa2, 0x64, 0x44, 0x70, 0x8, 0x20, 0x0, + 0x0, 0xa2, 0xc6, 0x66, 0xd0, 0xc, 0x3a, 0x0, + 0x0, 0xa2, 0xc2, 0x22, 0xc0, 0xc, 0x6, 0x0, + 0x0, 0xb1, 0x84, 0x44, 0x84, 0x6d, 0x6b, 0x10, + 0x0, 0xc0, 0xb6, 0x66, 0xd1, 0xb, 0x50, 0x0, + 0x0, 0xc0, 0xd6, 0x66, 0xc0, 0x47, 0x70, 0x0, + 0x2, 0x90, 0xb0, 0x0, 0xc0, 0x91, 0x81, 0x0, + 0x6, 0x30, 0xd6, 0x66, 0xc2, 0x70, 0x3b, 0x0, + 0x8, 0x0, 0xc0, 0x6, 0xb6, 0x0, 0xa, 0x70, + 0x22, 0x0, 0x10, 0x2, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x66, 0x67, 0xb6, 0x67, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x90, 0x0, 0x1, 0x0, + 0x4, 0x66, 0x66, 0x67, 0xb6, 0x66, 0x6c, 0xb0, + 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+58EB "士" */ + 0x0, 0x0, 0x0, 0x7, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x1, 0xb2, 0x7, 0x66, 0x66, + 0x6d, 0x86, 0x66, 0x66, 0x40, 0x0, 0x0, 0x0, + 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, + 0x1, 0x0, 0x0, 0x46, 0x66, 0x6d, 0x86, 0x66, + 0xf6, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+58F0 "声" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x0, 0x4, 0x0, 0x37, + 0x66, 0x66, 0x6e, 0x66, 0x67, 0xb4, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x10, 0x0, 0x0, 0x76, + 0x66, 0x6b, 0x66, 0x8b, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0xc7, 0x66, + 0x6c, 0x66, 0x6d, 0x30, 0x0, 0xc, 0x20, 0x0, + 0xd0, 0x0, 0xc1, 0x0, 0x0, 0xc2, 0x0, 0xd, + 0x0, 0xc, 0x10, 0x0, 0xd, 0x66, 0x66, 0x66, + 0x66, 0xb1, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x29, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+58F2 "売" */ + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb2, 0x0, 0x8, 0x10, 0x1, + 0x76, 0x66, 0x6d, 0x76, 0x66, 0x63, 0x0, 0x0, + 0x0, 0x0, 0xb2, 0x0, 0x60, 0x0, 0x0, 0x5, + 0x76, 0x66, 0x66, 0x67, 0x20, 0x0, 0x18, 0x66, + 0x66, 0x66, 0x66, 0x66, 0xa1, 0x6, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0x30, 0xb2, 0x0, 0x82, + 0x1, 0x60, 0x4, 0x0, 0x0, 0x0, 0xc, 0x40, + 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x1, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x1c, + 0x0, 0x1, 0x0, 0x0, 0x5, 0x90, 0x1, 0xc0, + 0x0, 0x60, 0x0, 0x1, 0xc2, 0x0, 0x1d, 0x0, + 0x8, 0x10, 0x5, 0x92, 0x0, 0x0, 0xdc, 0xcc, + 0xd4, 0x5, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5909 "変" */ + 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb2, 0x0, 0x3, 0xa0, 0x7, + 0x66, 0x6d, 0x76, 0x6d, 0x76, 0x67, 0x20, 0x0, + 0x41, 0xd2, 0x0, 0xe2, 0x10, 0x0, 0x0, 0x1d, + 0x5d, 0x20, 0xe, 0x25, 0xa4, 0x0, 0xa, 0x20, + 0xd2, 0x0, 0xe2, 0x2, 0xd7, 0x17, 0x10, 0xa, + 0x10, 0x6, 0x0, 0x2, 0x70, 0x0, 0x0, 0xb8, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x7c, 0x66, + 0x66, 0xcd, 0x0, 0x0, 0x0, 0x67, 0x71, 0x0, + 0x5e, 0x30, 0x0, 0x0, 0x63, 0x0, 0xa1, 0x5d, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xec, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xa6, 0x9c, 0x61, + 0x0, 0x0, 0x3, 0x78, 0x40, 0x0, 0x29, 0xee, + 0xc6, 0x15, 0x30, 0x0, 0x0, 0x0, 0x0, 0x44, + 0x0, + + /* U+590F "å¤" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x83, 0x0, + 0x4, 0x76, 0x66, 0xaa, 0x66, 0x66, 0x65, 0x0, + 0x0, 0xa, 0x66, 0x96, 0x66, 0x6d, 0x30, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xc, 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0xc, 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xc, 0x68, 0x86, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x4, 0xd, 0x20, 0x0, 0x51, 0x0, 0x0, + 0x0, 0x0, 0x9b, 0x66, 0x68, 0xf4, 0x0, 0x0, + 0x0, 0x7, 0x60, 0x80, 0x2d, 0x30, 0x0, 0x0, + 0x0, 0x74, 0x0, 0x1b, 0xd2, 0x0, 0x0, 0x0, + 0x4, 0x10, 0x2, 0x99, 0x8b, 0x62, 0x0, 0x0, + 0x0, 0x26, 0x86, 0x10, 0x1, 0x8d, 0xfd, 0x60, + 0x24, 0x30, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, + + /* U+5915 "夕" */ + 0x0, 0x0, 0x0, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x80, 0x0, 0x2, 0x0, 0x0, 0x0, 0x3f, + 0x66, 0x66, 0x6d, 0xb0, 0x0, 0x0, 0xa6, 0x0, + 0x0, 0x1f, 0x40, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x8c, 0x0, 0x0, 0xc, 0x94, 0x0, 0x0, 0xe4, + 0x0, 0x0, 0x75, 0xc, 0x80, 0x8, 0xa0, 0x0, + 0x4, 0x60, 0x2, 0xf4, 0x2e, 0x20, 0x0, 0x4, + 0x0, 0x0, 0x72, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0x30, + 0x0, 0x0, 0x0, 0x2, 0x78, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5916 "外" */ + 0x0, 0x0, 0x77, 0x0, 0x0, 0xb3, 0x0, 0x0, + 0x0, 0xc, 0x60, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x1, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x6c, 0x66, 0xb6, 0xe, 0x0, 0x0, 0x0, 0xb, + 0x30, 0xd, 0x70, 0xe0, 0x0, 0x0, 0x2, 0xb0, + 0x2, 0xe0, 0xe, 0x40, 0x0, 0x0, 0x98, 0x80, + 0x68, 0x0, 0xe3, 0xb7, 0x0, 0x26, 0x9, 0x8c, + 0x20, 0xe, 0x1, 0xca, 0x5, 0x0, 0x7, 0xa0, + 0x0, 0xe0, 0x1, 0x90, 0x0, 0x0, 0xb3, 0x0, + 0xe, 0x0, 0x0, 0x0, 0x0, 0x67, 0x0, 0x0, + 0xe0, 0x0, 0x0, 0x0, 0x39, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x47, 0x0, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0x53, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, + 0x0, + + /* U+591A "多" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xc1, 0x0, 0x5, 0x0, 0x0, 0x0, 0x9a, + 0x66, 0x66, 0x8f, 0x60, 0x0, 0x39, 0x49, 0x30, + 0x3, 0xd4, 0x0, 0x6, 0x40, 0x3, 0xb0, 0x6b, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x5a, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x69, 0x8a, 0x10, 0x0, 0x0, + 0x25, 0x66, 0x20, 0xaa, 0x10, 0x0, 0x30, 0x0, + 0x0, 0x1b, 0x96, 0x66, 0x69, 0xf2, 0x0, 0x4, + 0xb7, 0x0, 0x0, 0x2d, 0x30, 0x2, 0x74, 0x3, + 0xb0, 0x3, 0xc2, 0x0, 0x0, 0x0, 0x0, 0xd0, + 0x7a, 0x10, 0x0, 0x0, 0x0, 0x1, 0x7a, 0x40, + 0x0, 0x0, 0x0, 0x26, 0x77, 0x30, 0x0, 0x0, + 0x0, 0x24, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+591C "夜" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1a, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xb0, 0x0, 0x2, 0x0, + 0x8, 0x66, 0x76, 0x66, 0x86, 0x66, 0x6b, 0x70, + 0x0, 0x0, 0xe5, 0x5, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xc0, 0xa, 0x50, 0x0, 0x60, 0x0, + 0x0, 0xc, 0x30, 0x1d, 0x66, 0x67, 0xf2, 0x0, + 0x0, 0x4f, 0x40, 0x85, 0x53, 0x6, 0x90, 0x0, + 0x0, 0xbc, 0x21, 0xb5, 0xe, 0x1b, 0x30, 0x0, + 0x7, 0x2b, 0x28, 0x17, 0x15, 0x2c, 0x0, 0x0, + 0x13, 0xb, 0x42, 0x1, 0x90, 0x95, 0x0, 0x0, + 0x0, 0xb, 0x20, 0x0, 0x59, 0xc0, 0x0, 0x0, + 0x0, 0xb, 0x20, 0x0, 0x2f, 0x90, 0x0, 0x0, + 0x0, 0xb, 0x20, 0x3, 0xb2, 0x8c, 0x50, 0x0, + 0x0, 0xb, 0x21, 0x87, 0x0, 0x4, 0xdf, 0x90, + 0x0, 0x6, 0x35, 0x0, 0x0, 0x0, 0x4, 0x0, + + /* U+5920 "夠" */ + 0x0, 0x0, 0x85, 0x0, 0x1, 0x60, 0x0, 0x0, + 0x0, 0x3, 0xd2, 0x25, 0x6, 0xc0, 0x0, 0x0, + 0x0, 0x1b, 0x44, 0x6f, 0x3c, 0x10, 0x0, 0x50, + 0x1, 0x78, 0x50, 0xc4, 0x59, 0x66, 0x66, 0xe1, + 0x3, 0x1, 0x6a, 0x61, 0x90, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0x96, 0x8, 0x10, 0x0, 0x20, 0xd0, + 0x0, 0x38, 0x7d, 0x10, 0x3c, 0x66, 0xd0, 0xd0, + 0x4, 0x30, 0xd8, 0x6c, 0x7a, 0x1, 0xc0, 0xd0, + 0x0, 0xa, 0x40, 0x2e, 0x4a, 0x1, 0xc1, 0xc0, + 0x0, 0x88, 0x40, 0x96, 0x2c, 0x66, 0xc1, 0xc0, + 0x4, 0x10, 0xd3, 0xc0, 0x37, 0x0, 0x72, 0xb0, + 0x0, 0x0, 0x2c, 0x20, 0x0, 0x0, 0x4, 0x90, + 0x0, 0x2, 0xb2, 0x0, 0x0, 0x22, 0x19, 0x70, + 0x0, 0x67, 0x0, 0x0, 0x0, 0x26, 0xef, 0x20, + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, + + /* U+5927 "大" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x6, 0x10, + 0x6, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x6a, 0x80, + 0x0, 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x95, 0x27, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0x8, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x70, 0x1, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0x0, 0x0, 0x3c, 0x20, 0x0, + 0x0, 0x6, 0x90, 0x0, 0x0, 0x5, 0xf9, 0x20, + 0x2, 0x84, 0x0, 0x0, 0x0, 0x0, 0x3d, 0x60, + 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5929 "天" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, + 0x0, 0x28, 0x66, 0x69, 0x66, 0x69, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x3b, 0x0, + 0x6, 0x76, 0x66, 0x7e, 0x96, 0x66, 0x67, 0x30, + 0x0, 0x0, 0x0, 0x69, 0x42, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa5, 0x8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xd0, 0x7, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x50, 0x1, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x68, 0x0, 0x0, 0x5d, 0x20, 0x0, + 0x0, 0x5, 0x60, 0x0, 0x0, 0x6, 0xf8, 0x20, + 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x91, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+592A "太" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x8, 0x0, + 0x4, 0x76, 0x66, 0x6f, 0x86, 0x66, 0x7a, 0x50, + 0x0, 0x0, 0x0, 0x1d, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5a, 0x26, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x95, 0xa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0x7, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x70, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x54, 0x0, 0x5b, 0x0, 0x0, + 0x0, 0x1, 0xb1, 0xb, 0xa0, 0x9, 0xb0, 0x0, + 0x0, 0x2a, 0x10, 0x1, 0xf1, 0x0, 0xce, 0x60, + 0x4, 0x60, 0x0, 0x0, 0x20, 0x0, 0x1b, 0x61, + 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+592B "夫" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x6, 0x0, 0x0, 0x56, + 0x66, 0x6d, 0x86, 0x66, 0x83, 0x0, 0x0, 0x0, + 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x20, 0x0, 0x2, 0x0, 0x56, 0x66, 0x66, + 0xe6, 0x66, 0x68, 0xf5, 0x1, 0x0, 0x0, 0x1d, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x81, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd2, 0x9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x77, 0x0, 0x3b, + 0x0, 0x0, 0x0, 0x0, 0x69, 0x0, 0x0, 0x8a, + 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x9d, + 0x50, 0x4, 0x72, 0x0, 0x0, 0x0, 0x0, 0x6e, + 0x71, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+592E "央" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x20, 0x0, 0x0, 0xa, + 0x76, 0x6d, 0x86, 0x6d, 0x60, 0x0, 0x0, 0xa4, + 0x0, 0xb3, 0x0, 0xc3, 0x0, 0x0, 0xa, 0x40, + 0xb, 0x20, 0xc, 0x30, 0x0, 0x0, 0xa4, 0x0, + 0xc1, 0x0, 0xc3, 0x0, 0x0, 0xa, 0x40, 0xd, + 0x10, 0xc, 0x4b, 0x10, 0x57, 0x66, 0x66, 0xe9, + 0x66, 0x66, 0x63, 0x0, 0x0, 0x0, 0x4a, 0x33, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x40, 0x91, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x90, 0x2, 0xb2, + 0x0, 0x0, 0x0, 0x8, 0x70, 0x0, 0x3, 0xe8, + 0x10, 0x0, 0x58, 0x10, 0x0, 0x0, 0x2, 0xcf, + 0x61, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + + /* U+5931 "失" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x40, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x8a, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x76, 0x6d, 0x86, 0x6a, 0xc1, 0x0, 0x1, 0x90, + 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x71, 0x0, + 0xd, 0x10, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, + 0xe0, 0x0, 0x1, 0x80, 0x6, 0x76, 0x66, 0x7e, + 0x86, 0x66, 0x79, 0x40, 0x0, 0x0, 0x6, 0x94, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc3, 0x9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0x0, 0x57, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0x10, 0x0, 0xa7, + 0x0, 0x0, 0x0, 0x3a, 0x10, 0x0, 0x0, 0xbc, + 0x30, 0x1, 0x66, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x80, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + + /* U+5947 "奇" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, 0x30, 0x0, + 0x0, 0x76, 0x66, 0x8d, 0x66, 0x68, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0xc6, 0x76, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0x30, 0x4, 0xda, 0x0, 0x0, + 0x0, 0x46, 0x60, 0x0, 0x0, 0xa, 0x27, 0x10, + 0x18, 0x66, 0x66, 0x66, 0x66, 0x6a, 0x7a, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x10, 0xd, 0x0, 0x0, + 0x0, 0xc, 0x66, 0x66, 0xe1, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xe0, 0xd, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0xe0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x66, 0x66, 0xe0, 0xd, 0x0, 0x0, + 0x0, 0xa, 0x0, 0x0, 0x50, 0xe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xed, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, + + /* U+5951 "契" */ + 0x0, 0x0, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa2, 0x24, 0x1, 0x11, 0x16, 0x20, + 0x4, 0x76, 0xc7, 0x65, 0x36, 0xe5, 0x5c, 0x50, + 0x0, 0x56, 0xc7, 0xa3, 0x0, 0xd0, 0xc, 0x20, + 0x0, 0x10, 0xa2, 0x0, 0x4, 0x90, 0xd, 0x0, + 0x4, 0x66, 0xc7, 0x7b, 0xb, 0x10, 0xd, 0x0, + 0x1, 0x10, 0xa2, 0x0, 0x94, 0x33, 0x6b, 0x0, + 0x0, 0x0, 0xb3, 0x37, 0x10, 0x6, 0xe3, 0x0, + 0x0, 0x0, 0x51, 0xc, 0x20, 0x0, 0x1, 0x0, + 0x5, 0x66, 0x66, 0x6f, 0x66, 0x66, 0x8f, 0x40, + 0x1, 0x0, 0x0, 0x87, 0x61, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xd0, 0x9, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x3c, 0x20, 0x0, 0xb8, 0x20, 0x0, + 0x0, 0x38, 0x70, 0x0, 0x0, 0x7, 0xfe, 0x80, + 0x15, 0x30, 0x0, 0x0, 0x0, 0x0, 0x15, 0x0, + + /* U+5957 "套" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6b, 0x0, 0x0, 0x29, 0x0, + 0x0, 0x76, 0x66, 0xf6, 0x68, 0x76, 0x66, 0x20, + 0x0, 0x0, 0xa, 0x60, 0x0, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x88, 0x0, 0x0, 0x7c, 0x40, 0x0, + 0x0, 0x8, 0x4e, 0x66, 0x66, 0x95, 0xdc, 0x81, + 0x2, 0x61, 0xe, 0x0, 0x0, 0x80, 0x7, 0x50, + 0x2, 0x0, 0xe, 0x66, 0x66, 0x63, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x66, 0x66, 0x7b, 0x10, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x5, 0x10, + 0x6, 0x76, 0x6b, 0x79, 0x66, 0x66, 0x6b, 0x90, + 0x0, 0x0, 0x0, 0xc4, 0x2, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x19, 0x20, 0x0, 0x3c, 0x70, 0x0, + 0x0, 0x1, 0xeb, 0xa8, 0x76, 0x55, 0xd4, 0x0, + 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x11, 0x0, + + /* U+5973 "女" */ + 0x0, 0x0, 0x0, 0x96, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x88, 0x0, 0x0, 0x2, 0x0, 0x56, 0x66, + 0x6d, 0x86, 0x66, 0x66, 0xdb, 0x0, 0x0, 0x2, + 0xd0, 0x0, 0x5b, 0x0, 0x0, 0x0, 0x0, 0x77, + 0x0, 0xb, 0x60, 0x0, 0x0, 0x0, 0xd, 0x10, + 0x0, 0xf1, 0x0, 0x0, 0x0, 0x4, 0xa0, 0x0, + 0x6a, 0x0, 0x0, 0x0, 0x0, 0x48, 0x61, 0xe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xc5, 0xdb, + 0x40, 0x0, 0x0, 0x0, 0x2b, 0x70, 0x0, 0x7f, + 0x70, 0x0, 0x5, 0x86, 0x10, 0x0, 0x0, 0x3b, + 0x0, 0x35, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5979 "她" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x70, 0x0, 0x0, 0x82, 0x0, 0x0, + 0x0, 0x9, 0x50, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xb, 0x20, 0x2, 0x80, 0xd0, 0x0, 0x0, + 0x0, 0xd, 0x2, 0x32, 0xa0, 0xd0, 0x3, 0x0, + 0x6, 0x7d, 0x6a, 0x82, 0xa0, 0xd5, 0x6f, 0x20, + 0x0, 0x2a, 0x8, 0x68, 0xc6, 0xd0, 0xd, 0x0, + 0x0, 0x57, 0xb, 0x12, 0xa0, 0xd0, 0xe, 0x0, + 0x0, 0x83, 0xd, 0x2, 0xa0, 0xd0, 0xe, 0x0, + 0x0, 0xb0, 0x1b, 0x2, 0xa0, 0xd0, 0x1d, 0x0, + 0x0, 0xc0, 0x57, 0x2, 0xa0, 0xd3, 0xc8, 0x0, + 0x0, 0x59, 0xc3, 0x2, 0xa0, 0xd1, 0x0, 0x30, + 0x0, 0x2, 0xbd, 0x52, 0xa0, 0x70, 0x0, 0x70, + 0x0, 0x9, 0x2, 0xc2, 0xb0, 0x0, 0x0, 0xc0, + 0x1, 0x81, 0x0, 0x0, 0xdb, 0xbb, 0xbc, 0xd2, + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+597D "好" */ + 0x0, 0x7, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x40, 0x4, 0x66, 0x66, 0x99, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, + 0x26, 0x6e, 0x67, 0x80, 0x0, 0x7, 0x20, 0x0, + 0x0, 0x49, 0x6, 0x70, 0x0, 0xb6, 0x0, 0x0, + 0x0, 0x75, 0x9, 0x40, 0x0, 0xc1, 0x0, 0x0, + 0x0, 0xa1, 0xc, 0x10, 0x0, 0xc1, 0x3, 0x30, + 0x0, 0xc0, 0xd, 0x36, 0x66, 0xd6, 0x68, 0x70, + 0x3, 0x90, 0x39, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0x5, 0x80, 0x85, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0x0, 0x28, 0xf4, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0x0, 0x8, 0x7c, 0xa0, 0x0, 0xc1, 0x0, 0x0, + 0x0, 0x66, 0x0, 0xa0, 0x0, 0xd1, 0x0, 0x0, + 0x7, 0x30, 0x0, 0x1, 0x7d, 0xe0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, + + /* U+5982 "如" */ + 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x67, 0x0, 0x60, 0xb6, 0x66, 0xc4, 0x6, 0x7c, + 0x86, 0x8c, 0xd, 0x0, 0xb, 0x10, 0x0, 0xc0, + 0x5, 0x80, 0xd0, 0x0, 0xb1, 0x0, 0xc, 0x0, + 0x85, 0xd, 0x0, 0xb, 0x10, 0x3, 0x90, 0xb, + 0x20, 0xd0, 0x0, 0xb1, 0x0, 0x75, 0x0, 0xd0, + 0xd, 0x0, 0xb, 0x10, 0xb, 0x40, 0x3a, 0x0, + 0xd0, 0x0, 0xb1, 0x0, 0x4, 0x9c, 0x80, 0xd, + 0x0, 0xb, 0x10, 0x0, 0x3, 0xbb, 0xc0, 0xd6, + 0x66, 0xd1, 0x0, 0x3, 0xa0, 0x9, 0x2d, 0x0, + 0xb, 0x20, 0x6, 0x70, 0x0, 0x0, 0x70, 0x0, + 0x20, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+59B3 "妳" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xb0, 0x0, 0x8, 0x30, 0x0, 0x0, + 0x0, 0x8, 0x70, 0x0, 0xf, 0x20, 0x0, 0x0, + 0x0, 0xb, 0x30, 0x0, 0x49, 0x0, 0x0, 0x10, + 0x5, 0x6e, 0x66, 0xa0, 0xa8, 0x66, 0x66, 0xe2, + 0x1, 0x3b, 0x3, 0xc0, 0xa0, 0x0, 0x5, 0x60, + 0x0, 0x76, 0x6, 0x86, 0x20, 0x18, 0x4, 0x0, + 0x0, 0xb1, 0x9, 0x43, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0xc0, 0xd, 0x0, 0x33, 0x1c, 0x10, 0x0, + 0x4, 0x80, 0x2c, 0x0, 0x99, 0x1c, 0x28, 0x0, + 0x1, 0x77, 0x87, 0x0, 0xc0, 0x1c, 0x8, 0x90, + 0x0, 0x2, 0xfb, 0x16, 0x30, 0x1c, 0x0, 0xf1, + 0x0, 0x8, 0x67, 0xc3, 0x0, 0x1c, 0x0, 0x30, + 0x0, 0x58, 0x0, 0x20, 0x0, 0x2c, 0x0, 0x0, + 0x5, 0x50, 0x0, 0x0, 0x7, 0xf8, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + + /* U+59B9 "妹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x9, 0x80, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0xc, 0x30, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x1, 0x22, 0xd2, 0x38, 0x0, + 0x16, 0x7d, 0x68, 0x74, 0x54, 0xd4, 0x44, 0x10, + 0x2, 0x66, 0x8, 0x50, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xa2, 0xb, 0x20, 0x0, 0xd0, 0x1, 0x40, + 0x0, 0xc0, 0xd, 0x37, 0x6a, 0xe7, 0x67, 0x80, + 0x2, 0x90, 0x2a, 0x0, 0xd, 0xd6, 0x0, 0x0, + 0x7, 0x50, 0x66, 0x0, 0x48, 0xd6, 0x10, 0x0, + 0x5, 0x83, 0xb1, 0x0, 0xb1, 0xd1, 0xa0, 0x0, + 0x0, 0x8, 0xf3, 0x5, 0x60, 0xd0, 0x84, 0x0, + 0x0, 0x9, 0x4d, 0x29, 0x0, 0xd0, 0x1d, 0x40, + 0x0, 0x64, 0x2, 0x80, 0x0, 0xd0, 0x4, 0xb2, + 0x4, 0x40, 0x2, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, + + /* U+59BB "妻" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x20, 0x0, 0x12, 0x0, + 0x6, 0x76, 0x66, 0x6e, 0x66, 0x66, 0xbc, 0x20, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x66, 0x6e, 0x66, 0x6d, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0xe, 0x4, 0x20, + 0x7, 0x66, 0x66, 0x6e, 0x66, 0x6e, 0x69, 0x80, + 0x0, 0x0, 0x0, 0xe, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x18, 0x66, 0xa8, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xc0, 0x0, 0x0, 0x5, 0x20, + 0x28, 0x66, 0x6c, 0x86, 0x66, 0xb6, 0x69, 0x80, + 0x0, 0x0, 0x2b, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x79, 0x42, 0x2d, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x39, 0xfd, 0x94, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x8a, 0x20, 0x5b, 0xe2, 0x0, + 0x3, 0x56, 0x76, 0x10, 0x0, 0x0, 0x34, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+59C9 "姉" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb6, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, + 0xe, 0x10, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x2, + 0xc0, 0x0, 0x0, 0xd, 0x0, 0x20, 0x26, 0x9b, + 0x68, 0x68, 0x66, 0xe6, 0x69, 0x50, 0x29, 0x40, + 0x95, 0x0, 0xd, 0x0, 0x0, 0x0, 0xd0, 0xc, + 0x13, 0x0, 0xd0, 0x5, 0x0, 0x2b, 0x0, 0xd0, + 0xd6, 0x6e, 0x66, 0xe1, 0x6, 0x60, 0x49, 0xc, + 0x0, 0xd0, 0xd, 0x0, 0xa1, 0x8, 0x50, 0xc0, + 0xd, 0x0, 0xd0, 0x7, 0x72, 0xd0, 0xc, 0x0, + 0xd0, 0xd, 0x0, 0x0, 0xae, 0x50, 0xc0, 0xd, + 0x0, 0xd0, 0x0, 0xb, 0x3c, 0x6d, 0x0, 0xd3, + 0x9d, 0x0, 0x9, 0x20, 0x3, 0x20, 0xd, 0x2, + 0x20, 0x6, 0x20, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, + + /* U+59CB "å§‹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x6, 0xa0, 0x0, 0x3, 0xe1, 0x0, 0x0, + 0x0, 0x9, 0x60, 0x0, 0x8, 0x80, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0xc, 0x10, 0x20, 0x0, + 0x5, 0x6e, 0x66, 0xa0, 0x56, 0x0, 0x76, 0x0, + 0x2, 0x49, 0x4, 0xa0, 0xa0, 0x0, 0xc, 0x60, + 0x0, 0x85, 0x7, 0x7a, 0xb9, 0x87, 0x68, 0xe0, + 0x0, 0xc0, 0xa, 0x34, 0x61, 0x0, 0x0, 0x60, + 0x1, 0xb0, 0xd, 0x0, 0x20, 0x0, 0x3, 0x0, + 0x5, 0x70, 0x2b, 0x0, 0xe6, 0x66, 0x6e, 0x30, + 0x4, 0x84, 0x86, 0x0, 0xe0, 0x0, 0xe, 0x0, + 0x0, 0x5, 0xf8, 0x0, 0xe0, 0x0, 0xe, 0x0, + 0x0, 0x8, 0x6b, 0xa0, 0xe0, 0x0, 0xe, 0x0, + 0x0, 0x47, 0x0, 0x80, 0xe6, 0x66, 0x6e, 0x0, + 0x4, 0x50, 0x0, 0x0, 0xe0, 0x0, 0xd, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x20, 0x0, 0x1, 0x0, + + /* U+59D0 "å§" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x70, 0x0, 0xd6, 0x66, 0x6e, 0x10, + 0x0, 0xc, 0x20, 0x0, 0xe0, 0x0, 0xd, 0x0, + 0x16, 0x6e, 0x66, 0xa1, 0xe0, 0x0, 0xd, 0x0, + 0x0, 0x49, 0x2, 0xc0, 0xe0, 0x0, 0xd, 0x0, + 0x0, 0x85, 0x6, 0x80, 0xe6, 0x66, 0x6d, 0x0, + 0x0, 0xc0, 0x9, 0x40, 0xe0, 0x0, 0xd, 0x0, + 0x1, 0xb0, 0xd, 0x0, 0xe0, 0x0, 0xd, 0x0, + 0x6, 0x50, 0x2b, 0x0, 0xe0, 0x0, 0xd, 0x0, + 0x5, 0x84, 0x85, 0x0, 0xe6, 0x66, 0x6d, 0x0, + 0x0, 0x5, 0xf8, 0x0, 0xe0, 0x0, 0xd, 0x0, + 0x0, 0x9, 0x47, 0xd0, 0xe0, 0x0, 0xd, 0x0, + 0x0, 0x66, 0x0, 0x60, 0xe0, 0x0, 0xd, 0x20, + 0x5, 0x40, 0x0, 0x76, 0xa6, 0x66, 0x6a, 0xa3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+59D4 "å§”" */ + 0x0, 0x0, 0x0, 0x0, 0x14, 0x7c, 0x70, 0x0, + 0x0, 0x3, 0x56, 0x7a, 0xd5, 0x43, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x2, 0x30, + 0x4, 0x76, 0x66, 0x7b, 0xd8, 0x66, 0x69, 0xa0, + 0x0, 0x0, 0x2, 0xc5, 0xb4, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x4b, 0x22, 0xb0, 0x4c, 0x61, 0x0, + 0x0, 0x18, 0x60, 0x5, 0x90, 0x1, 0xaf, 0xc3, + 0x4, 0x40, 0x0, 0x7c, 0x0, 0x0, 0x2, 0x40, + 0x5, 0x66, 0x66, 0xe7, 0x66, 0x66, 0x6b, 0xd1, + 0x1, 0x0, 0xb, 0x40, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0x30, 0x7, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0xcf, 0x71, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3a, 0x82, 0x8e, 0xb2, 0x0, + 0x0, 0x25, 0x78, 0x61, 0x0, 0x0, 0x8e, 0x0, + 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+5A18 "娘" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xc1, 0x0, 0x1, 0x91, 0x0, 0x0, + 0x0, 0x5, 0xb0, 0x0, 0x0, 0x69, 0x1, 0x0, + 0x0, 0x8, 0x60, 0x0, 0xc6, 0x77, 0x6e, 0x0, + 0x4, 0x5d, 0x75, 0x91, 0xd0, 0x0, 0xd, 0x0, + 0x1, 0x1d, 0x1, 0xc0, 0xd6, 0x66, 0x6d, 0x0, + 0x0, 0x39, 0x4, 0x90, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x75, 0x7, 0x50, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0xb1, 0xa, 0x20, 0xd6, 0x86, 0x6d, 0x0, + 0x0, 0xc0, 0xc, 0x0, 0xd0, 0x80, 0x4, 0x80, + 0x0, 0x87, 0x69, 0x0, 0xd0, 0x55, 0x3a, 0x30, + 0x0, 0x2, 0xeb, 0x10, 0xd0, 0xc, 0x60, 0x0, + 0x0, 0x4, 0x97, 0xc0, 0xd0, 0x26, 0xb1, 0x0, + 0x0, 0x2a, 0x0, 0x40, 0xe9, 0x50, 0x7e, 0x71, + 0x2, 0x80, 0x0, 0x0, 0xd4, 0x0, 0x4, 0x80, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5A5A "婚" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x60, 0x0, 0x0, 0x27, 0xd9, 0x0, + 0x0, 0xd, 0x20, 0xb, 0x56, 0xe2, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xc, 0x0, 0xc0, 0x0, 0x0, + 0x5, 0x7c, 0x69, 0x4c, 0x66, 0xd7, 0x67, 0xa0, + 0x0, 0x76, 0xa, 0x3c, 0x0, 0x59, 0x0, 0x0, + 0x0, 0xb2, 0xd, 0xc, 0x2, 0x2c, 0x40, 0x50, + 0x0, 0xc0, 0xc, 0xe, 0xa5, 0x2, 0xd7, 0x90, + 0x3, 0x90, 0x39, 0x5, 0x0, 0x0, 0x8, 0xd0, + 0x7, 0x40, 0x85, 0x9, 0x66, 0x66, 0x6d, 0x0, + 0x4, 0x84, 0xc0, 0xa, 0x30, 0x0, 0xd, 0x0, + 0x0, 0x8, 0xe4, 0xa, 0x76, 0x66, 0x6d, 0x0, + 0x0, 0xb, 0x2d, 0x3a, 0x30, 0x0, 0xd, 0x0, + 0x0, 0x82, 0x2, 0x3a, 0x30, 0x0, 0xd, 0x0, + 0x6, 0x20, 0x0, 0xa, 0x76, 0x66, 0x6d, 0x0, + 0x10, 0x0, 0x0, 0x4, 0x0, 0x0, 0x2, 0x0, + + /* U+5A66 "婦" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x30, 0x5, 0x66, 0x66, 0x6a, 0x0, + 0x0, 0xe, 0x0, 0x1, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x3a, 0x0, 0x2, 0x86, 0x66, 0x6d, 0x0, + 0x14, 0x89, 0x48, 0x10, 0x0, 0x0, 0xd, 0x0, + 0x4, 0xb4, 0x2d, 0x26, 0x76, 0x66, 0x6d, 0x0, + 0x0, 0xc0, 0xd, 0x30, 0x0, 0x0, 0x0, 0x30, + 0x2, 0xa0, 0x3a, 0xa6, 0x66, 0xd6, 0x68, 0xd1, + 0x6, 0x60, 0x68, 0xc0, 0x0, 0xd0, 0x4, 0x0, + 0xa, 0x10, 0xb2, 0xa, 0x66, 0xe6, 0x6c, 0x0, + 0x6, 0x73, 0xc0, 0xc, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0xb, 0xd3, 0xc, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0x1b, 0x3e, 0x2c, 0x0, 0xd0, 0xc, 0x0, + 0x0, 0x91, 0x2, 0x1c, 0x0, 0xd3, 0xb8, 0x0, + 0x6, 0x10, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, + + /* U+5A92 "媒" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x70, 0x2, 0xa0, 0x0, 0xa3, 0x0, + 0x0, 0xa, 0x40, 0x1, 0xb0, 0x0, 0xd0, 0x10, + 0x0, 0xd, 0x0, 0x66, 0xd6, 0x66, 0xe7, 0xb1, + 0x3, 0x4d, 0x46, 0x51, 0xb0, 0x0, 0xd0, 0x0, + 0x3, 0x69, 0x28, 0x71, 0xd6, 0x66, 0xe0, 0x0, + 0x0, 0x84, 0xa, 0x31, 0xb0, 0x0, 0xd0, 0x0, + 0x0, 0xb0, 0xc, 0x2, 0xd6, 0x66, 0xe0, 0x0, + 0x0, 0xb0, 0xc, 0x1, 0x70, 0xa2, 0x40, 0x0, + 0x4, 0x70, 0x48, 0x0, 0x0, 0xd0, 0x4, 0x70, + 0x3, 0x84, 0x93, 0x67, 0x6d, 0xf9, 0x66, 0x51, + 0x0, 0x7, 0xf5, 0x0, 0x5a, 0xd7, 0x10, 0x0, + 0x0, 0xa, 0x4c, 0x42, 0xb0, 0xd1, 0xb1, 0x0, + 0x0, 0x56, 0x1, 0x5a, 0x0, 0xd0, 0x3e, 0x72, + 0x4, 0x60, 0x4, 0x60, 0x0, 0xe0, 0x3, 0x81, + 0x2, 0x0, 0x1, 0x0, 0x0, 0x70, 0x0, 0x0, + + /* U+5ABD "媽" */ + 0x0, 0x8, 0x40, 0x3, 0x0, 0x0, 0x7, 0x10, + 0x0, 0xd, 0x20, 0xd, 0x66, 0xe6, 0x66, 0x30, + 0x0, 0x1d, 0x0, 0xd, 0x0, 0xd0, 0x4, 0x0, + 0x16, 0x8b, 0x68, 0x4d, 0x55, 0xd5, 0x55, 0x0, + 0x2, 0x95, 0xa, 0x3d, 0x0, 0xd0, 0x1, 0x0, + 0x0, 0xc1, 0xc, 0xd, 0x66, 0xe6, 0x6b, 0x20, + 0x0, 0xc0, 0xc, 0xd, 0x0, 0xd0, 0x0, 0x0, + 0x4, 0x80, 0x39, 0xd, 0x0, 0xd0, 0x0, 0x50, + 0x8, 0x40, 0x75, 0xc, 0x66, 0x66, 0x66, 0xf1, + 0xa, 0x50, 0xc1, 0x0, 0x0, 0x20, 0x60, 0xe0, + 0x0, 0x3a, 0xe3, 0x4, 0x51, 0x94, 0x77, 0xd0, + 0x0, 0xa, 0x6d, 0x38, 0x38, 0x5b, 0x3b, 0xb0, + 0x0, 0x65, 0x1, 0xa7, 0x27, 0x2, 0x5, 0x90, + 0x4, 0x40, 0x0, 0x30, 0x0, 0x37, 0xae, 0x50, + 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56, 0x0, + + /* U+5ACC "嫌" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xc0, 0x0, 0x27, 0x0, 0xb1, 0x0, 0x0, + 0x59, 0x0, 0x0, 0xb3, 0x37, 0x1, 0x0, 0x8, + 0x50, 0x27, 0x69, 0x6a, 0x68, 0xc1, 0x25, 0xc6, + 0x59, 0x0, 0x92, 0xb1, 0x0, 0x0, 0x2d, 0x13, + 0xa2, 0x6c, 0x7c, 0x6a, 0x30, 0x1, 0xb0, 0x57, + 0x0, 0x92, 0xb1, 0xb1, 0x0, 0x47, 0x8, 0x45, + 0x6b, 0x7c, 0x6c, 0xb5, 0x7, 0x30, 0xb0, 0x10, + 0x92, 0xb1, 0xb1, 0x0, 0xb0, 0xb, 0x3, 0x6c, + 0x7c, 0x6c, 0x10, 0x6, 0x88, 0x70, 0x3, 0xf2, + 0xb6, 0x50, 0x0, 0x0, 0xdc, 0x20, 0xbb, 0x2b, + 0x45, 0x0, 0x0, 0x65, 0x37, 0x74, 0x92, 0xb1, + 0xa2, 0x0, 0x28, 0x0, 0x54, 0x9, 0x2b, 0x12, + 0xe6, 0x16, 0x0, 0x33, 0x0, 0x92, 0xb1, 0x3, + 0x1, 0x0, 0x0, 0x0, 0x4, 0x3, 0x0, 0x0, + + /* U+5B09 "嬉" */ + 0x0, 0xb, 0x10, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0x0, 0x2c, 0x0, 0x0, 0x0, 0xd0, 0x4, 0x40, + 0x0, 0x58, 0x0, 0x57, 0x66, 0xe6, 0x66, 0x50, + 0x13, 0x97, 0x38, 0x14, 0x66, 0xe6, 0x8b, 0x0, + 0x15, 0xc4, 0x3d, 0x3, 0x10, 0x0, 0x3, 0x0, + 0x0, 0xc0, 0x2a, 0xb, 0x66, 0x66, 0x7d, 0x0, + 0x3, 0x90, 0x57, 0xb, 0x10, 0x0, 0x2b, 0x0, + 0x7, 0x50, 0x93, 0x8, 0x96, 0x66, 0x96, 0x0, + 0xb, 0x10, 0xc0, 0x0, 0x68, 0x5, 0x70, 0x10, + 0xb, 0x53, 0xa1, 0x75, 0x68, 0x57, 0x56, 0xa1, + 0x0, 0x2d, 0xc2, 0x7, 0x66, 0x66, 0x6a, 0x10, + 0x0, 0x3a, 0x3d, 0xc, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xa1, 0x1, 0xc, 0x0, 0x0, 0xd, 0x0, + 0x8, 0x20, 0x0, 0xd, 0x66, 0x66, 0x6d, 0x0, + 0x21, 0x0, 0x0, 0x5, 0x0, 0x0, 0x2, 0x0, + + /* U+5B50 "å­" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x52, 0x0, + 0x0, 0x6, 0x66, 0x66, 0x66, 0x68, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xd0, 0x0, 0x1, 0x30, + 0x6, 0x66, 0x66, 0x67, 0xd6, 0x66, 0x6a, 0xc1, + 0x0, 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x14, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xaf, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, + + /* U+5B57 "å­—" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0x66, 0x66, 0x96, 0x66, 0x6b, 0x80, + 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, 0x19, 0x10, + 0x1, 0xc2, 0x56, 0x66, 0x66, 0x6c, 0x40, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0xa9, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xd1, 0x0, 0x0, 0x10, + 0x6, 0x66, 0x66, 0x67, 0xd6, 0x66, 0x6a, 0xd1, + 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xae, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, + + /* U+5B58 "å­˜" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7b, 0x0, 0x0, 0xa, 0x30, + 0x4, 0x66, 0x66, 0xf7, 0x66, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x5, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x56, 0x66, 0x66, 0x99, 0x0, + 0x0, 0x0, 0xd6, 0x0, 0x0, 0x4, 0xb3, 0x0, + 0x0, 0x3, 0xe0, 0x0, 0x0, 0x76, 0x0, 0x0, + 0x0, 0x1b, 0xe0, 0x0, 0x0, 0xf1, 0x0, 0x0, + 0x0, 0xa1, 0xe0, 0x0, 0x0, 0xe0, 0x2, 0x80, + 0x7, 0x10, 0xe0, 0x76, 0x66, 0xe6, 0x66, 0x61, + 0x10, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x1, 0x8d, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x50, 0x0, 0x5, 0x10, 0x0, 0x0, + + /* U+5B63 "å­£" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x7c, 0x80, 0x0, + 0x0, 0x3, 0x45, 0x79, 0xd8, 0x64, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x0, 0x20, + 0x6, 0x66, 0x66, 0x68, 0xd6, 0x66, 0x6a, 0xc1, + 0x0, 0x0, 0x1, 0xc6, 0xb6, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x42, 0xb0, 0x79, 0x20, 0x0, + 0x0, 0x7, 0x91, 0x2, 0xb0, 0x4, 0xdd, 0xa3, + 0x5, 0x62, 0x56, 0x66, 0x66, 0x6c, 0x24, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x95, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xd2, 0x0, 0x3, 0x20, + 0x6, 0x76, 0x66, 0x66, 0xd6, 0x66, 0x6b, 0xa0, + 0x0, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x9e, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, + + /* U+5B66 "å­¦" */ + 0x0, 0x30, 0x3, 0x40, 0x0, 0x67, 0x0, 0x0, + 0x3, 0xc1, 0xd, 0x40, 0xc, 0x50, 0x0, 0x0, + 0xb, 0x80, 0x98, 0x3, 0x90, 0x0, 0x0, 0x40, + 0x43, 0x2, 0x10, 0x80, 0x0, 0x40, 0xa, 0x66, + 0x66, 0x66, 0x66, 0x66, 0xae, 0x11, 0xf0, 0x0, + 0x0, 0x0, 0x1, 0x9, 0x0, 0x37, 0x18, 0x66, + 0x66, 0x68, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0x40, 0x0, 0x20, 0x4, 0x66, 0x66, 0x66, 0xe6, + 0x66, 0x6d, 0xb0, 0x0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x9f, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, + 0x0, + + /* U+5B69 "å­©" */ + 0x0, 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, + 0x3, 0x66, 0x6c, 0x70, 0x0, 0xc5, 0x0, 0x0, + 0x0, 0x0, 0x39, 0x56, 0x66, 0x97, 0x69, 0xc0, + 0x0, 0x1, 0x60, 0x0, 0x1d, 0x10, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x86, 0x1, 0x50, 0x0, + 0x0, 0xd, 0x0, 0x22, 0x70, 0x8, 0xb0, 0x0, + 0x0, 0xd, 0x57, 0x1c, 0x97, 0x6e, 0x10, 0x0, + 0x1, 0x7f, 0x40, 0x3, 0x0, 0xb4, 0x18, 0x0, + 0x3f, 0x7d, 0x0, 0x0, 0x8, 0x60, 0x99, 0x0, + 0x2, 0xd, 0x0, 0x0, 0x86, 0x6, 0xb0, 0x0, + 0x0, 0xd, 0x0, 0x38, 0x20, 0x4e, 0x0, 0x0, + 0x0, 0xd, 0x2, 0x30, 0x6, 0xa2, 0xb2, 0x0, + 0x1, 0xd, 0x0, 0x2, 0x96, 0x0, 0x3e, 0x20, + 0x2, 0xbc, 0x4, 0x75, 0x0, 0x0, 0x9, 0x50, + 0x0, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5B6B "å­«" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x8c, 0x0, + 0x5, 0x66, 0x6d, 0x55, 0x59, 0xb6, 0x42, 0x0, + 0x0, 0x0, 0x39, 0x10, 0xa, 0x80, 0x0, 0x0, + 0x0, 0x1, 0x70, 0x0, 0x58, 0x1, 0x80, 0x0, + 0x0, 0xe, 0x10, 0x7, 0x93, 0x4c, 0x70, 0x0, + 0x0, 0xd, 0x0, 0x8, 0x74, 0xa5, 0x0, 0x0, + 0x0, 0xd, 0x25, 0x0, 0x9, 0x40, 0x50, 0x0, + 0x0, 0x5e, 0x60, 0x4, 0x91, 0x0, 0x4a, 0x0, + 0x3e, 0x7d, 0x0, 0x2f, 0xa8, 0xe5, 0x49, 0x80, + 0x2, 0xd, 0x0, 0x1, 0x0, 0xd0, 0x1, 0x30, + 0x0, 0xd, 0x0, 0x7, 0x90, 0xd0, 0x70, 0x0, + 0x0, 0xd, 0x0, 0x2b, 0x0, 0xd0, 0x2c, 0x20, + 0x1, 0xd, 0x1, 0x81, 0x0, 0xd0, 0x6, 0xd0, + 0x3, 0xdb, 0x4, 0x1, 0x8f, 0xb0, 0x0, 0x70, + 0x0, 0x20, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, + + /* U+5B78 "å­¸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x39, 0x31, 0xb2, 0x0, 0x50, 0x0, + 0x0, 0xd, 0x30, 0xa, 0xb2, 0x76, 0xe2, 0x0, + 0x0, 0xc, 0x74, 0x32, 0x62, 0x66, 0xd0, 0x0, + 0x0, 0xb, 0x1, 0x21, 0xa2, 0x0, 0xc0, 0x0, + 0x0, 0xa, 0x77, 0xc, 0xa0, 0x66, 0xb0, 0x0, + 0x3, 0x9, 0x20, 0x52, 0x90, 0x1, 0xb0, 0x20, + 0x8, 0x77, 0x66, 0x66, 0x66, 0x66, 0x79, 0xd0, + 0xe, 0x10, 0x56, 0x66, 0x66, 0xa2, 0x8, 0x0, + 0x4, 0x0, 0x0, 0x0, 0x1a, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x90, 0x0, 0x5, 0x10, + 0x6, 0x66, 0x66, 0x6c, 0x86, 0x66, 0x6b, 0x90, + 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xbf, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, + + /* U+5B83 "它" */ + 0x0, 0x0, 0x0, 0x19, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, 0x2, + 0x96, 0x66, 0x67, 0xb6, 0x66, 0x6c, 0x10, 0x85, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xa1, 0x2f, 0x30, + 0x20, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0xc, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc1, + 0x0, 0x2, 0xc2, 0x0, 0x0, 0x0, 0xc, 0x10, + 0x7, 0xc7, 0x20, 0x0, 0x0, 0x0, 0xc3, 0x78, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xc, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0x0, 0x50, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x8, 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, + 0xc3, 0x0, 0x0, 0x6, 0xdc, 0xcc, 0xcc, 0xcd, + 0x50, + + /* U+5B85 "å®…" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0x66, 0x67, 0xa6, 0x66, 0x6a, 0x60, + 0x0, 0x85, 0x0, 0x0, 0x0, 0x30, 0xb, 0x30, + 0x0, 0xc2, 0x0, 0x2, 0x6b, 0xe8, 0x22, 0x0, + 0x0, 0x24, 0x56, 0x9d, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x7d, 0x20, + 0x0, 0x0, 0x0, 0x4d, 0x66, 0x66, 0x52, 0x0, + 0x6, 0x66, 0x65, 0x4c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x40, + 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x60, + 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x3, 0xa0, + 0x0, 0x0, 0x0, 0xb, 0xcc, 0xcc, 0xcd, 0xa0, + + /* U+5B87 "宇" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0x0, 0x0, 0x0, 0x0, 0x19, + 0x66, 0x66, 0xa6, 0x66, 0x6b, 0x40, 0x7, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xc3, 0x0, 0xc2, 0x0, + 0x0, 0x0, 0x3, 0x51, 0x0, 0x0, 0x26, 0x66, + 0x68, 0x66, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0x0, 0x0, 0x32, 0x4, 0x76, 0x66, 0x67, 0xd6, + 0x66, 0x6b, 0xa0, 0x0, 0x0, 0x0, 0x2b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x15, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3a, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, + + /* U+5B88 "守" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xa0, 0x0, 0x0, 0x0, 0x5, + 0x0, 0x0, 0x35, 0x0, 0x1, 0x70, 0x0, 0xb6, + 0x66, 0x66, 0x66, 0x66, 0xad, 0x20, 0x3f, 0x0, + 0x0, 0x0, 0xb3, 0x8, 0x0, 0x1, 0x10, 0x0, + 0x0, 0xd, 0x10, 0x1, 0x0, 0x56, 0x66, 0x66, + 0x66, 0xe6, 0x68, 0xe3, 0x1, 0x11, 0x0, 0x0, + 0xd, 0x10, 0x0, 0x0, 0x0, 0xa, 0x10, 0x0, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x5d, 0x0, 0xd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0xd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xee, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, + + /* U+5B89 "安" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x66, 0x66, 0xa6, 0x66, 0x6c, 0x30, + 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x10, + 0x0, 0xa2, 0x0, 0x77, 0x0, 0x0, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x1, 0x0, + 0x5, 0x66, 0x66, 0xe6, 0x66, 0x66, 0x6e, 0x90, + 0x0, 0x0, 0x8, 0x60, 0x0, 0x97, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x86, 0x0, 0xa, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x26, 0x78, 0x8c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xda, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x8a, 0x10, 0x29, 0xe6, 0x0, + 0x0, 0x15, 0x88, 0x20, 0x0, 0x0, 0x4e, 0x10, + 0x3, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5B8C "完" */ + 0x0, 0x0, 0x0, 0x9, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x67, 0x66, 0x67, 0x96, 0x66, 0x69, 0x70, + 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x9, 0x40, + 0x1, 0x90, 0x0, 0x0, 0x0, 0x24, 0x3, 0x0, + 0x0, 0x3, 0x76, 0x66, 0x66, 0x66, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x56, 0x66, 0x66, 0x66, 0x66, 0x9e, 0x20, + 0x0, 0x10, 0x4, 0xa0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x70, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x40, 0xd, 0x0, 0x0, 0x30, + 0x0, 0x0, 0x1d, 0x0, 0xd, 0x0, 0x0, 0x60, + 0x0, 0x0, 0xa4, 0x0, 0xe, 0x0, 0x0, 0xc0, + 0x0, 0x49, 0x30, 0x0, 0x9, 0xdc, 0xcd, 0xb1, + 0x5, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5B98 "官" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x86, + 0x66, 0x66, 0x96, 0x66, 0x69, 0xa0, 0x2d, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa5, 0x7, 0x70, 0x96, + 0x66, 0x66, 0x6b, 0x23, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0xe, 0x66, 0x66, + 0x66, 0xe0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, + 0x96, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x8, + 0x60, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x85, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x8, 0x50, + 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, 0xb5, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x1, 0x0, 0x0, + + /* U+5B99 "å®™" */ + 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, 0x0, + 0x84, 0x44, 0x47, 0x64, 0x44, 0x49, 0x0, 0x3a, + 0x22, 0x22, 0x62, 0x22, 0x25, 0xb2, 0xa, 0x60, + 0x0, 0xd, 0x30, 0x0, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x66, + 0x6e, 0x66, 0x6b, 0x70, 0x0, 0x0, 0xe0, 0x0, + 0xd0, 0x0, 0xa4, 0x0, 0x0, 0xe, 0x0, 0xd, + 0x0, 0xa, 0x40, 0x0, 0x0, 0xe6, 0x66, 0xe6, + 0x66, 0xc4, 0x0, 0x0, 0xe, 0x0, 0xd, 0x0, + 0xa, 0x40, 0x0, 0x0, 0xe0, 0x0, 0xd0, 0x0, + 0xa4, 0x0, 0x0, 0xe, 0x0, 0xd, 0x0, 0xa, + 0x40, 0x0, 0x0, 0xe6, 0x66, 0x66, 0x66, 0xc4, + 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x4, 0x10, + 0x0, + + /* U+5B9A "定" */ + 0x0, 0x0, 0x0, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, 0x1, + 0x96, 0x66, 0x79, 0x66, 0x66, 0xb5, 0x0, 0x95, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x40, 0x1c, 0x10, + 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, 0x36, 0x66, + 0x66, 0x66, 0x66, 0xd9, 0x0, 0x0, 0x10, 0x0, + 0x3a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x61, 0x3, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x40, 0x3a, + 0x0, 0x15, 0x0, 0x0, 0x1, 0xe0, 0x3, 0xc6, + 0x67, 0x81, 0x0, 0x0, 0x6b, 0x30, 0x3a, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x16, 0x43, 0xa0, 0x0, + 0x0, 0x0, 0x5, 0x70, 0x7, 0xcc, 0x42, 0x11, + 0x23, 0x3, 0x60, 0x0, 0x1, 0x7b, 0xde, 0xff, + 0x40, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5B9E "实" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x66, + 0x66, 0x66, 0xb6, 0x66, 0x69, 0x50, 0xd, 0x0, + 0x0, 0x2, 0x0, 0x0, 0xc7, 0x7, 0xc0, 0x1a, + 0x40, 0x7c, 0x0, 0x42, 0x0, 0x0, 0x0, 0x3f, + 0x8, 0x80, 0x0, 0x0, 0x0, 0x6, 0x20, 0x50, + 0x96, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x40, 0xa, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x66, 0x0, 0xc2, + 0x0, 0x4, 0x20, 0x67, 0x66, 0x66, 0x6e, 0x66, + 0x66, 0xa9, 0x0, 0x0, 0x0, 0x5, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xd3, 0x8a, 0x50, + 0x0, 0x0, 0x0, 0x4, 0xc3, 0x0, 0x2c, 0xe3, + 0x0, 0x1, 0x5a, 0x70, 0x0, 0x0, 0x9, 0xb0, + 0x4, 0x51, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + + /* U+5B9F "実" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, 0xa, + 0x66, 0x66, 0x79, 0x66, 0x66, 0xc2, 0x4, 0xa0, + 0x0, 0x4, 0x0, 0x0, 0x49, 0x20, 0xb5, 0x0, + 0x0, 0xb4, 0x0, 0x4, 0x0, 0x0, 0x36, 0x66, + 0x6d, 0x76, 0x6b, 0xa0, 0x0, 0x0, 0x10, 0x0, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x5, 0x66, 0x6d, + 0x76, 0x6e, 0x50, 0x0, 0x0, 0x0, 0x0, 0xb2, + 0x0, 0x1, 0x30, 0x4, 0x76, 0x66, 0x6e, 0x86, + 0x66, 0x9b, 0x10, 0x0, 0x0, 0x2, 0xd5, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb5, 0x9, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x98, 0x0, 0x2c, 0x61, + 0x0, 0x0, 0x6, 0xa4, 0x0, 0x0, 0x1b, 0xfb, + 0x30, 0x35, 0x20, 0x0, 0x0, 0x0, 0x3, 0x20, + + /* U+5BA2 "客" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x0, 0x7, 0x70, 0x0, 0x2, 0x0, + 0x1, 0xb6, 0x67, 0x66, 0x66, 0x66, 0x6e, 0x70, + 0xa, 0x70, 0x9, 0xa0, 0x0, 0x0, 0x57, 0x0, + 0x5, 0x0, 0x3f, 0x76, 0x66, 0xd7, 0x20, 0x0, + 0x0, 0x1, 0xb2, 0x60, 0x8, 0xb0, 0x0, 0x0, + 0x0, 0x9, 0x10, 0x38, 0x7a, 0x0, 0x0, 0x0, + 0x0, 0x60, 0x0, 0xb, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xb4, 0x8, 0xc7, 0x30, 0x0, + 0x0, 0x4, 0xa6, 0x0, 0x0, 0x1c, 0xef, 0xa1, + 0x15, 0x63, 0xd6, 0x66, 0x66, 0x6e, 0x13, 0x10, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x3, 0x0, 0x0, + + /* U+5BA4 "室" */ + 0x0, 0x0, 0x0, 0x1a, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x96, 0x66, 0x66, 0x76, 0x66, 0x6b, 0x10, + 0x4, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x65, 0x0, + 0x6, 0x56, 0x66, 0x66, 0x66, 0x6e, 0x50, 0x0, + 0x0, 0x1, 0x0, 0xb5, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x19, 0x20, 0x0, 0x88, 0x0, 0x0, + 0x0, 0x8, 0xd6, 0x66, 0x66, 0x6e, 0x80, 0x0, + 0x0, 0x6, 0x95, 0x37, 0x20, 0x4, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x60, 0x1, 0x0, 0x0, + 0x0, 0x7, 0x66, 0x6c, 0x86, 0x6c, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x2, 0x0, + 0x5, 0x66, 0x66, 0x6c, 0x86, 0x66, 0x6e, 0x90, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5BB3 "害" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0x57, 0x0, 0x0, 0x40, 0xa, 0x66, 0x66, + 0x67, 0x66, 0x66, 0xe4, 0x5b, 0x0, 0x0, 0x1e, + 0x0, 0x25, 0x10, 0x0, 0x56, 0x66, 0x6d, 0x66, + 0x77, 0x0, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x31, + 0x0, 0x0, 0x56, 0x66, 0x6d, 0x66, 0x75, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x82, 0x57, + 0x66, 0x66, 0x7d, 0x66, 0x66, 0x64, 0x0, 0x3, + 0x0, 0x29, 0x0, 0x40, 0x0, 0x0, 0xe, 0x66, + 0x66, 0x66, 0xc5, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xa2, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0xa2, 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, 0xc2, + 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x51, 0x0, + + /* U+5BB6 "å®¶" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x0, 0x4, 0x90, 0x0, 0x2, 0x10, + 0x0, 0xa6, 0x66, 0x66, 0x66, 0x66, 0x6d, 0x90, + 0x4, 0xc0, 0x0, 0x0, 0x0, 0x2, 0x16, 0x0, + 0x0, 0x4, 0x66, 0x7a, 0x66, 0x6a, 0x20, 0x0, + 0x0, 0x0, 0x2, 0xd4, 0x0, 0x2, 0x20, 0x0, + 0x0, 0x0, 0x5a, 0x29, 0x10, 0x3c, 0x70, 0x0, + 0x0, 0x47, 0x40, 0x4b, 0xb6, 0x90, 0x0, 0x0, + 0x3, 0x10, 0x6, 0x90, 0xb4, 0x70, 0x0, 0x0, + 0x0, 0x2, 0x95, 0x7, 0xe8, 0x36, 0x0, 0x0, + 0x2, 0x65, 0x0, 0x8a, 0x3b, 0xb, 0x30, 0x0, + 0x0, 0x0, 0x2a, 0x50, 0x3b, 0x1, 0xd9, 0x30, + 0x0, 0x17, 0x70, 0x0, 0x59, 0x0, 0x1a, 0x50, + 0x5, 0x40, 0x0, 0x6c, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, + + /* U+5BB9 "容" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x1d, 0x0, 0x0, 0x1, 0x0, 0x86, + 0x66, 0x66, 0x66, 0x66, 0x6a, 0xb0, 0x1e, 0x10, + 0x82, 0x0, 0x40, 0x0, 0x81, 0x1, 0x40, 0x6c, + 0x21, 0x71, 0x9a, 0x20, 0x0, 0x0, 0x59, 0x0, + 0xad, 0x0, 0x6f, 0x20, 0x0, 0x54, 0x0, 0x6b, + 0x17, 0x0, 0x63, 0x0, 0x0, 0x0, 0x6c, 0x0, + 0x3a, 0x10, 0x0, 0x0, 0x0, 0x6a, 0x0, 0x0, + 0x2c, 0x94, 0x0, 0x1, 0x88, 0xb6, 0x66, 0x66, + 0xe9, 0xed, 0x24, 0x50, 0x2b, 0x0, 0x0, 0xe, + 0x0, 0x10, 0x0, 0x2, 0xb0, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x3, 0xd6, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0x0, 0x13, 0x0, 0x0, 0x4, 0x0, 0x0, + + /* U+5BBF "宿" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x2, 0xc0, 0x0, 0x1, 0x0, 0xb, + 0x66, 0x66, 0x66, 0x66, 0x67, 0xf2, 0x6, 0xa0, + 0xb5, 0x0, 0x0, 0x0, 0x63, 0x0, 0x62, 0x2d, + 0x26, 0x66, 0x66, 0x66, 0xd4, 0x0, 0x9, 0x40, + 0x10, 0xb, 0x40, 0x0, 0x0, 0x2, 0xe3, 0x0, + 0x0, 0x90, 0x1, 0x0, 0x0, 0x9d, 0x10, 0xd, + 0x68, 0x66, 0xe2, 0x0, 0x53, 0xc1, 0x0, 0xe0, + 0x0, 0xe, 0x0, 0x23, 0xc, 0x10, 0xe, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0xc1, 0x0, 0xe6, 0x66, + 0x6e, 0x0, 0x0, 0xc, 0x10, 0xe, 0x0, 0x0, + 0xe0, 0x0, 0x0, 0xc1, 0x0, 0xe0, 0x0, 0xe, + 0x0, 0x0, 0xd, 0x10, 0xe, 0x66, 0x66, 0xf0, + 0x0, 0x0, 0x60, 0x0, 0x50, 0x0, 0x5, 0x0, + + /* U+5BC4 "寄" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x30, 0x0, 0x6, 0x10, 0x0, 0x5, 0x0, 0xb, + 0x66, 0x66, 0x96, 0x66, 0x68, 0xd1, 0x8, 0x80, + 0x0, 0x3d, 0x0, 0x3, 0x40, 0x0, 0x0, 0x66, + 0x6d, 0x86, 0x66, 0x95, 0x0, 0x0, 0x0, 0x8, + 0x61, 0x78, 0x10, 0x0, 0x0, 0x0, 0x57, 0x30, + 0x0, 0x5b, 0x0, 0x40, 0x7, 0x76, 0x66, 0x66, + 0x66, 0x69, 0x6b, 0x70, 0x0, 0x30, 0x0, 0x30, + 0x0, 0xe0, 0x0, 0x0, 0xd, 0x66, 0x6d, 0x70, + 0xe, 0x0, 0x0, 0x0, 0xc1, 0x0, 0xb2, 0x0, + 0xe0, 0x0, 0x0, 0xc, 0x66, 0x6d, 0x40, 0xe, + 0x0, 0x0, 0x0, 0xc0, 0x0, 0x63, 0x0, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, + + /* U+5BC6 "密" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x30, 0x0, 0xa, 0x40, 0x0, 0x3, 0x10, 0xb, + 0x66, 0x66, 0x66, 0x66, 0x66, 0xd8, 0x8, 0x90, + 0x0, 0x48, 0x0, 0x93, 0x25, 0x0, 0x10, 0x0, + 0xb2, 0xd0, 0x8c, 0x30, 0x0, 0x0, 0x8, 0xd, + 0x1, 0x99, 0x0, 0x94, 0x0, 0x9, 0x90, 0xd2, + 0xb5, 0x4, 0x1, 0xf2, 0x0, 0x60, 0x2e, 0x91, + 0x0, 0x84, 0x6, 0x0, 0x25, 0x77, 0x8b, 0xbb, + 0xba, 0x40, 0x0, 0x1, 0x0, 0x0, 0xa, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xc2, 0x0, 0xc0, 0x0, + 0x2c, 0x0, 0x0, 0xd, 0x0, 0xc, 0x0, 0x2, + 0xb0, 0x0, 0x0, 0xd0, 0x0, 0xc0, 0x0, 0x2b, + 0x0, 0x0, 0x1b, 0x66, 0x67, 0x66, 0x67, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+5BCC "富" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xb1, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0x84, 0x0, 0x0, 0x30, 0xb, 0x66, 0x66, + 0x66, 0x66, 0x68, 0xe1, 0x79, 0x0, 0x0, 0x0, + 0x5, 0x46, 0x10, 0x0, 0x27, 0x66, 0x66, 0x66, + 0x50, 0x0, 0x0, 0x7, 0x66, 0x66, 0x6b, 0x40, + 0x0, 0x0, 0x9, 0x30, 0x0, 0xb, 0x10, 0x0, + 0x0, 0x9, 0x76, 0x66, 0x6d, 0x20, 0x0, 0x0, + 0x23, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0xd6, + 0x66, 0xc6, 0x66, 0xb7, 0x0, 0x0, 0xd1, 0x0, + 0xd0, 0x0, 0x94, 0x0, 0x0, 0xc6, 0x66, 0xe6, + 0x66, 0xb4, 0x0, 0x0, 0xd1, 0x0, 0xd0, 0x0, + 0x95, 0x0, 0x0, 0xd6, 0x66, 0x96, 0x66, 0xb5, + 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+5BD2 "寒" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x30, 0x0, 0x8, 0x30, 0x0, 0x6, 0x10, 0x68, + 0x66, 0x86, 0x66, 0x86, 0x66, 0xd5, 0x1d, 0x10, + 0xd, 0x10, 0xe, 0x13, 0x22, 0x0, 0x5, 0x66, + 0xe6, 0x66, 0xe6, 0x95, 0x0, 0x0, 0x0, 0xd, + 0x0, 0xd, 0x4, 0x10, 0x0, 0x3, 0x66, 0xe6, + 0x66, 0xe6, 0x75, 0x0, 0x0, 0x0, 0xd, 0x0, + 0xd, 0x0, 0x1a, 0x11, 0x66, 0x66, 0xf6, 0x66, + 0xa6, 0x66, 0x74, 0x0, 0x0, 0x88, 0x16, 0x3, + 0x60, 0x0, 0x0, 0x0, 0x5a, 0x0, 0x3e, 0x17, + 0xa2, 0x0, 0x0, 0x67, 0x2, 0x0, 0x40, 0x5, + 0xed, 0x41, 0x52, 0x0, 0x26, 0xa9, 0x40, 0x0, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x5e, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, + + /* U+5BDD "å¯" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x1, 0x90, 0x0, 0x2, 0x0, + 0x0, 0xa6, 0x66, 0x66, 0x66, 0x66, 0x6d, 0x50, + 0x2, 0xd0, 0x50, 0x0, 0x0, 0x0, 0x53, 0x0, + 0x0, 0x10, 0xe1, 0x17, 0x66, 0x66, 0xe1, 0x0, + 0x2, 0x70, 0xd0, 0x4, 0x65, 0x55, 0xd0, 0x0, + 0x0, 0xc2, 0xd0, 0x16, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0x50, 0xd0, 0x22, 0x0, 0x0, 0x22, 0x0, + 0x0, 0x6, 0xd0, 0xb6, 0x66, 0x66, 0x6e, 0x30, + 0x5, 0xb2, 0xd7, 0x75, 0x66, 0x68, 0x82, 0x0, + 0x9, 0x10, 0xd0, 0x0, 0x50, 0xc, 0x30, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x45, 0x95, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xc, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x5, 0x82, 0x3b, 0xca, 0x70, + 0x0, 0x0, 0x62, 0x41, 0x0, 0x0, 0x14, 0x10, + + /* U+5BDF "察" */ + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, 0x5, + 0x66, 0x66, 0x6b, 0x66, 0x66, 0x6c, 0x0, 0xc0, + 0x46, 0x0, 0x0, 0x0, 0x8, 0x50, 0x36, 0xb, + 0x70, 0x31, 0x30, 0x0, 0x70, 0x0, 0x5, 0xc6, + 0x6e, 0x58, 0x66, 0x8e, 0x30, 0x1, 0xb8, 0x46, + 0x90, 0x34, 0xa, 0x10, 0x0, 0x95, 0x19, 0xc1, + 0x0, 0x87, 0x10, 0x0, 0x40, 0xa2, 0xb9, 0x66, + 0x98, 0xb6, 0x0, 0x0, 0x4, 0xa2, 0x0, 0x0, + 0x1, 0xae, 0xa2, 0x4, 0xa6, 0x66, 0x67, 0x66, + 0xaa, 0x44, 0x4, 0x10, 0x4, 0x2, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xc2, 0x2b, 0x6, 0x70, + 0x0, 0x0, 0x8, 0x70, 0x2, 0xb0, 0x4, 0xe3, + 0x0, 0x27, 0x20, 0x28, 0xd9, 0x0, 0x5, 0x90, + 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, 0x0, + + /* U+5BE6 "實" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x0, 0x2a, + 0x66, 0x66, 0x66, 0x66, 0x6a, 0xa0, 0x9, 0x56, + 0x66, 0x66, 0x66, 0x69, 0x70, 0x0, 0x0, 0xa1, + 0x0, 0xb0, 0x4, 0x93, 0x90, 0x47, 0x6d, 0x66, + 0x8b, 0x66, 0xa9, 0x66, 0x10, 0x1, 0xc6, 0x67, + 0x86, 0x6a, 0x40, 0x0, 0x0, 0xa, 0x55, 0x55, + 0x55, 0x6a, 0x0, 0x0, 0x0, 0xe6, 0x66, 0x66, + 0x67, 0xa0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x3a, 0x0, 0x0, 0x0, 0xe6, 0x66, 0x66, 0x68, + 0xa0, 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, 0x7a, + 0x0, 0x0, 0x0, 0x23, 0xc1, 0x5, 0x75, 0x10, + 0x0, 0x0, 0x38, 0x82, 0x0, 0x1, 0x9e, 0x20, + 0x0, 0x42, 0x0, 0x0, 0x0, 0x0, 0x43, 0x0, + + /* U+5BEB "寫" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x5, 0xa0, 0x0, 0x0, 0x0, 0xa, + 0x66, 0x66, 0x67, 0x66, 0x66, 0xd4, 0x8, 0x70, + 0x3, 0xb1, 0x0, 0x5, 0x28, 0x0, 0x61, 0xb5, + 0x41, 0x6, 0x76, 0xe3, 0x0, 0x0, 0xb, 0x10, + 0x50, 0x0, 0xd, 0x0, 0x0, 0x0, 0xb6, 0x65, + 0x3, 0x76, 0xe0, 0x0, 0x0, 0xc, 0x68, 0x76, + 0x66, 0x6e, 0x0, 0x0, 0x0, 0x43, 0xc0, 0x0, + 0x0, 0x41, 0x10, 0x0, 0x2, 0xb7, 0x66, 0x66, + 0x66, 0xb9, 0x0, 0x6, 0x71, 0x20, 0x14, 0x9, + 0x19, 0x30, 0x2, 0x14, 0x33, 0x80, 0xc1, 0x58, + 0xb1, 0x0, 0x1, 0xe1, 0xc, 0x5, 0x0, 0x1d, + 0x0, 0x0, 0x4, 0x0, 0x0, 0x5, 0xab, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x60, 0x0, + + /* U+5BFA "寺" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, 0x30, 0x0, + 0x0, 0x76, 0x66, 0x6e, 0x66, 0x67, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x5, 0x10, + 0x28, 0x66, 0x66, 0x6a, 0x66, 0x66, 0x6a, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x4, 0x0, + 0x6, 0x76, 0x66, 0x66, 0x66, 0xf6, 0x7a, 0x30, + 0x0, 0x0, 0x72, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0x10, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x20, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x9f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, + + /* U+5BFE "対" */ + 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, + 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x1, 0x20, 0x71, 0x0, 0x0, 0xe0, 0x0, + 0x4, 0x76, 0x6e, 0x73, 0x56, 0x66, 0xe6, 0xd2, + 0x0, 0x0, 0xe, 0x0, 0x10, 0x0, 0xe0, 0x0, + 0x0, 0x40, 0x2b, 0x1, 0x40, 0x0, 0xe0, 0x0, + 0x0, 0x28, 0x77, 0x0, 0xa5, 0x0, 0xe0, 0x0, + 0x0, 0x2, 0xf4, 0x0, 0x4e, 0x0, 0xe0, 0x0, + 0x0, 0x3, 0xce, 0x20, 0x9, 0x0, 0xe0, 0x0, + 0x0, 0xb, 0x17, 0xd0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x84, 0x0, 0xd0, 0x0, 0x0, 0xe0, 0x0, + 0x7, 0x40, 0x0, 0x0, 0x4, 0x33, 0xd0, 0x0, + 0x12, 0x0, 0x0, 0x0, 0x1, 0x8f, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, + + /* U+5C04 "å°„" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x2, 0xc0, 0x0, + 0x0, 0x20, 0x80, 0x30, 0x0, 0x2, 0xb0, 0x0, + 0x0, 0xd6, 0x66, 0xe2, 0x0, 0x2, 0xb0, 0x0, + 0x0, 0xd1, 0x0, 0xe0, 0x0, 0x2, 0xb0, 0x20, + 0x0, 0xc6, 0x66, 0xe3, 0x76, 0x67, 0xd8, 0xb1, + 0x0, 0xc1, 0x0, 0xe0, 0x0, 0x2, 0xb0, 0x0, + 0x0, 0xc6, 0x66, 0xe0, 0x40, 0x2, 0xb0, 0x0, + 0x0, 0xc1, 0x0, 0xe0, 0x3b, 0x2, 0xb0, 0x0, + 0x26, 0xd6, 0x66, 0xe0, 0xd, 0x42, 0xb0, 0x0, + 0x2, 0x0, 0xb4, 0xe0, 0x6, 0x2, 0xb0, 0x0, + 0x0, 0x5, 0x90, 0xe0, 0x0, 0x2, 0xb0, 0x0, + 0x0, 0x2b, 0x0, 0xe0, 0x0, 0x2, 0xb0, 0x0, + 0x1, 0x91, 0x10, 0xe0, 0x2, 0x3, 0xb0, 0x0, + 0x26, 0x0, 0x4d, 0xc0, 0x3, 0xaf, 0x80, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x4, 0x0, 0x0, + + /* U+5C07 "å°‡" */ + 0x0, 0x0, 0xa, 0x10, 0x3, 0x80, 0x0, 0x0, + 0x2, 0x80, 0xd, 0x0, 0xb, 0x60, 0x3, 0x10, + 0x2, 0xa0, 0xd, 0x0, 0x6b, 0x66, 0x6e, 0xa0, + 0x2, 0xa0, 0xd, 0x3, 0x88, 0x70, 0x6b, 0x0, + 0x4, 0xc6, 0x6d, 0x36, 0x91, 0xb4, 0xb0, 0x0, + 0x0, 0x30, 0xd, 0x0, 0x74, 0x5a, 0x10, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x19, 0x70, 0xc2, 0x0, + 0x4, 0x66, 0x6d, 0x36, 0x61, 0x0, 0xd0, 0x30, + 0x1, 0x69, 0xd, 0x67, 0x66, 0x66, 0xe6, 0xa2, + 0x0, 0x59, 0xd, 0x3, 0x30, 0x0, 0xd0, 0x0, + 0x0, 0x77, 0xd, 0x0, 0xd2, 0x0, 0xd0, 0x0, + 0x0, 0xa3, 0xd, 0x0, 0x95, 0x0, 0xd0, 0x0, + 0x1, 0xa0, 0xd, 0x0, 0x12, 0x10, 0xd0, 0x0, + 0x8, 0x0, 0xd, 0x0, 0x2, 0x9f, 0xb0, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x4, 0x10, 0x0, + + /* U+5C08 "å°ˆ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xd0, 0x0, 0x2, 0x0, 0x3, + 0x76, 0x66, 0x6e, 0x66, 0x69, 0xb1, 0x0, 0x0, + 0x10, 0x1, 0xd0, 0x1, 0x10, 0x0, 0x0, 0xe, + 0x66, 0x6e, 0x66, 0x9b, 0x0, 0x0, 0x0, 0xd0, + 0x1, 0xd0, 0x5, 0x80, 0x0, 0x0, 0xe, 0x66, + 0x6e, 0x66, 0x98, 0x0, 0x0, 0x1, 0xe6, 0x66, + 0xe6, 0x69, 0x80, 0x0, 0x0, 0x17, 0x0, 0x1d, + 0x2, 0x93, 0x0, 0x0, 0x16, 0x66, 0x78, 0xe7, + 0x68, 0xe4, 0x0, 0x0, 0x97, 0x43, 0x10, 0xb, + 0x13, 0x92, 0x3, 0x76, 0x66, 0x66, 0x66, 0xf6, + 0x6b, 0xb0, 0x0, 0x8, 0x40, 0x0, 0xf, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x40, 0x7, 0xcd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, + + /* U+5C0D "å°" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x2a, 0x20, 0x0, 0x0, 0xb3, 0x0, + 0x6, 0xc, 0xb, 0x7, 0x10, 0x0, 0xd0, 0x0, + 0x6, 0x8c, 0xb, 0x49, 0x0, 0x0, 0xd0, 0x0, + 0x1, 0x4c, 0xb, 0x52, 0x20, 0x0, 0xd0, 0x0, + 0x28, 0x69, 0x69, 0x68, 0x80, 0x0, 0xd3, 0x50, + 0x0, 0x63, 0x7, 0x60, 0x18, 0x66, 0xe6, 0x50, + 0x0, 0x1d, 0x9, 0x10, 0x12, 0x0, 0xd0, 0x0, + 0x5, 0x79, 0x87, 0xb6, 0xb, 0x30, 0xd0, 0x0, + 0x0, 0x0, 0xb0, 0x0, 0x4, 0xe0, 0xd0, 0x0, + 0x0, 0x0, 0xb0, 0x40, 0x0, 0xc0, 0xd0, 0x0, + 0x2, 0x86, 0xc6, 0x73, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0xb3, 0x54, 0x1, 0x10, 0xd0, 0x0, + 0x1b, 0xca, 0x73, 0x0, 0x1, 0x6e, 0xc0, 0x0, + 0x4, 0x0, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, + + /* U+5C0E "å°Ž" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x10, 0x0, 0x94, 0x5, 0x80, 0x0, 0x0, + 0x4c, 0x0, 0x1, 0x70, 0x80, 0x28, 0x0, 0x0, + 0x70, 0x77, 0x6a, 0x76, 0x67, 0x61, 0x3, 0x69, + 0x40, 0xe5, 0x65, 0x56, 0xd0, 0x0, 0x0, 0xb1, + 0xd, 0x55, 0x55, 0x6b, 0x0, 0x0, 0xb, 0x10, + 0xd6, 0x66, 0x67, 0xb0, 0x0, 0x0, 0xb1, 0xd, + 0x22, 0x22, 0x3b, 0x0, 0x0, 0x29, 0x72, 0x93, + 0x33, 0x34, 0x60, 0x0, 0x3a, 0x0, 0x6a, 0xbb, + 0xcc, 0xcd, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb1, 0x19, 0x0, 0x76, 0x66, 0x66, 0x66, 0x6e, + 0x68, 0xc6, 0x0, 0x0, 0x82, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x1, 0x7b, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x62, 0x0, 0x0, + + /* U+5C0F "å°" */ + 0x0, 0x0, 0x0, 0x2a, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0x0, 0x0, 0x0, 0x0, 0x3, 0x90, 0x1d, + 0x4, 0x0, 0x0, 0x0, 0x8, 0xc0, 0x1d, 0x1, + 0x90, 0x0, 0x0, 0x1e, 0x10, 0x1d, 0x0, 0x3c, + 0x10, 0x0, 0x86, 0x0, 0x1d, 0x0, 0x8, 0xd0, + 0x2, 0x90, 0x0, 0x1d, 0x0, 0x0, 0xe8, 0x8, + 0x0, 0x0, 0x1d, 0x0, 0x0, 0x89, 0x40, 0x0, + 0x0, 0x1d, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, + 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x6d, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, + 0x0, + + /* U+5C11 "å°‘" */ + 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x30, 0xb3, 0x16, 0x0, 0x0, 0x0, 0x2, + 0xf3, 0xb, 0x30, 0x2c, 0x60, 0x0, 0x0, 0xa7, + 0x0, 0xb3, 0x0, 0x1d, 0xb0, 0x0, 0x3b, 0x0, + 0xb, 0x30, 0x0, 0x2f, 0x50, 0xa, 0x10, 0x0, + 0xb3, 0x0, 0x40, 0x62, 0x7, 0x20, 0x0, 0xb, + 0x30, 0x3f, 0xa0, 0x1, 0x10, 0x0, 0x0, 0x81, + 0x3e, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9c, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x18, 0xc5, 0x0, 0x0, + 0x0, 0x0, 0x15, 0x88, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5C1A "å°š" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2c, 0x10, 0x0, 0x0, 0x7, 0x30, 0x2, + 0xc0, 0x0, 0xc4, 0x0, 0xd, 0x70, 0x2c, 0x0, + 0x5d, 0x10, 0x0, 0x4f, 0x2, 0xc0, 0xb, 0x10, + 0x2, 0x0, 0x40, 0x2c, 0x7, 0x30, 0x30, 0xc7, + 0x66, 0x66, 0x86, 0x76, 0x6f, 0x3b, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0xb2, 0xa, 0x76, 0x66, + 0xe0, 0xe, 0xb, 0x20, 0xa3, 0x0, 0xd, 0x0, + 0xe0, 0xb2, 0xa, 0x30, 0x0, 0xd0, 0xe, 0xb, + 0x20, 0xa7, 0x66, 0x6d, 0x0, 0xe0, 0xb2, 0xa, + 0x20, 0x0, 0xa0, 0xe, 0xb, 0x20, 0x10, 0x0, + 0x4, 0x55, 0xe0, 0xc2, 0x0, 0x0, 0x0, 0x4, + 0xe9, 0x1, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+5C24 "å°¤" */ + 0x0, 0x0, 0x0, 0x95, 0x3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb4, 0x2, 0xc9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x1e, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x2, 0x5, 0x20, + 0x6, 0x76, 0x66, 0xc7, 0x69, 0x66, 0x6a, 0x90, + 0x0, 0x0, 0x0, 0xb2, 0x1c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc1, 0x1c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0x1c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x1c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xa0, 0x1c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x30, 0x1c, 0x0, 0x0, 0x40, + 0x0, 0x0, 0x59, 0x0, 0x1c, 0x0, 0x0, 0x70, + 0x0, 0x4, 0xa0, 0x0, 0x1d, 0x0, 0x0, 0xc1, + 0x0, 0x76, 0x0, 0x0, 0xb, 0xdd, 0xdd, 0xd2, + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5C31 "å°±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x90, 0x0, 0x8, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xa4, 0x0, 0x9, 0x32, 0x80, 0x0, + 0x5, 0x66, 0x76, 0x6c, 0x29, 0x30, 0x87, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x9, 0x30, 0x12, 0x0, + 0x0, 0x86, 0x66, 0xa4, 0x6b, 0x86, 0x6a, 0x90, + 0x0, 0xd0, 0x0, 0xc1, 0x9, 0x3d, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0xc0, 0x9, 0x3d, 0x0, 0x0, + 0x0, 0xd6, 0x86, 0xd1, 0xa, 0x2d, 0x0, 0x0, + 0x0, 0x40, 0xb0, 0x30, 0xc, 0xd, 0x0, 0x0, + 0x0, 0x93, 0xb2, 0x50, 0xc, 0xd, 0x0, 0x0, + 0x1, 0xb0, 0xb0, 0xa5, 0x47, 0xd, 0x0, 0x10, + 0x7, 0x20, 0xb0, 0x34, 0xa1, 0xd, 0x0, 0x60, + 0x15, 0x10, 0xc0, 0x5, 0x50, 0xd, 0x1, 0x90, + 0x0, 0x2b, 0xd0, 0x35, 0x0, 0x9, 0xcc, 0xb0, + 0x0, 0x0, 0x10, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+5C3A "å°º" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xa6, 0x66, 0x66, 0x66, 0xd3, 0x0, + 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x4, 0xd6, 0x66, 0x76, 0x66, 0xe1, 0x0, + 0x0, 0x4, 0xa0, 0x0, 0x60, 0x0, 0x70, 0x0, + 0x0, 0x4, 0x90, 0x0, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x70, 0x0, 0x45, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x50, 0x0, 0xb, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x5, 0xa0, 0x0, 0x0, + 0x0, 0x2a, 0x0, 0x0, 0x0, 0xaa, 0x0, 0x0, + 0x0, 0xa1, 0x0, 0x0, 0x0, 0xb, 0xd5, 0x0, + 0x6, 0x30, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xa0, + 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+5C40 "å±€" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0xd6, 0x66, 0x66, 0x66, 0x6e, 0x30, 0x0, + 0xd, 0x10, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0xd6, 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, 0xd, + 0x10, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0xd, 0x66, + 0x66, 0x66, 0x66, 0x6e, 0x40, 0x0, 0xd0, 0x0, + 0x0, 0x2, 0x0, 0xd1, 0x0, 0xd, 0x2, 0xc6, + 0x66, 0xe0, 0xd, 0x10, 0x2, 0xa0, 0x1b, 0x0, + 0xd, 0x0, 0xd1, 0x0, 0x56, 0x1, 0xd6, 0x66, + 0xd0, 0xd, 0x10, 0xa, 0x0, 0x2a, 0x0, 0x7, + 0x0, 0xe0, 0x2, 0x60, 0x0, 0x0, 0x0, 0x34, + 0x4e, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, + + /* U+5C45 "å±…" */ + 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, + 0x0, 0xe, 0x66, 0x66, 0x66, 0x66, 0x9a, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, + 0x0, 0xe, 0x66, 0x66, 0x66, 0x66, 0x98, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xb4, 0x0, 0x22, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x76, 0x66, 0xd7, 0x66, 0x6b, 0x90, + 0x0, 0x1b, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, + 0x0, 0x39, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, + 0x0, 0x56, 0xc, 0x77, 0xb7, 0x77, 0xe1, 0x0, + 0x0, 0x82, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xa0, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x4, 0x50, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x7, 0x0, 0xf, 0x66, 0x66, 0x66, 0xe0, 0x0, + 0x10, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5C4A "届" */ + 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, + 0x0, 0xe6, 0x66, 0x66, 0x66, 0x66, 0xe0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0xe6, 0x66, 0x66, 0x66, 0x66, 0xd0, 0x0, 0xd, + 0x0, 0x0, 0x4, 0x0, 0x4, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0xc, 0x3, + 0x0, 0xe, 0x0, 0x5, 0x10, 0x1, 0xb0, 0xd6, + 0x66, 0xe6, 0x66, 0xd5, 0x0, 0x3a, 0xd, 0x10, + 0xe, 0x0, 0xb, 0x20, 0x5, 0x70, 0xd6, 0x66, + 0xe6, 0x66, 0xd2, 0x0, 0x83, 0xc, 0x10, 0xe, + 0x0, 0xb, 0x20, 0xa, 0x0, 0xc1, 0x0, 0xe0, + 0x0, 0xb2, 0x3, 0x60, 0xd, 0x66, 0x6e, 0x66, + 0x6d, 0x30, 0x70, 0x0, 0xc0, 0x0, 0x0, 0x0, + 0x92, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5C4B "屋" */ + 0x0, 0x19, 0x66, 0x66, 0x66, 0x66, 0x6b, 0x0, + 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, + 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, + 0x0, 0x1e, 0x66, 0x66, 0x66, 0x66, 0x7b, 0x0, + 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, + 0x0, 0x1c, 0x47, 0x66, 0xa6, 0x66, 0x79, 0x10, + 0x0, 0x2b, 0x0, 0x5, 0xc3, 0x13, 0x0, 0x0, + 0x0, 0x3a, 0x0, 0x76, 0x0, 0x6, 0xb1, 0x0, + 0x0, 0x49, 0xc, 0xda, 0x87, 0x65, 0xab, 0x0, + 0x0, 0x66, 0x2, 0x20, 0xd, 0x10, 0x4, 0x0, + 0x0, 0xa2, 0x0, 0x0, 0xd, 0x0, 0x45, 0x0, + 0x0, 0xb0, 0x6, 0x76, 0x6e, 0x66, 0x65, 0x0, + 0x4, 0x50, 0x0, 0x0, 0xd, 0x0, 0x0, 0x10, + 0x7, 0x3, 0x66, 0x66, 0x6e, 0x66, 0x6a, 0xd1, + 0x11, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5C55 "展" */ + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x51, 0x0, + 0x3, 0xc6, 0x66, 0x66, 0x66, 0x6d, 0x50, 0x0, + 0x3b, 0x0, 0x0, 0x0, 0x0, 0xb2, 0x0, 0x3, + 0xc6, 0x67, 0x66, 0x66, 0x6d, 0x30, 0x0, 0x3a, + 0x0, 0xb5, 0x0, 0xd0, 0x10, 0x0, 0x3, 0xa0, + 0xb, 0x20, 0xd, 0x7, 0x0, 0x0, 0x3c, 0x66, + 0xd7, 0x66, 0xe6, 0x62, 0x0, 0x4, 0x90, 0xb, + 0x20, 0xd, 0x0, 0x30, 0x0, 0x5a, 0x68, 0xa7, + 0x76, 0xa6, 0x7b, 0x30, 0x8, 0x50, 0xa2, 0x7, + 0x0, 0x57, 0x0, 0x0, 0xb1, 0xa, 0x20, 0x47, + 0x59, 0x20, 0x0, 0xb, 0x0, 0xa2, 0x0, 0xa9, + 0x0, 0x0, 0x5, 0x40, 0xa, 0x57, 0x50, 0x9c, + 0x63, 0x10, 0x70, 0x0, 0xbb, 0x10, 0x0, 0x4c, + 0xe5, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5C65 "å±¥" */ + 0x0, 0x28, 0x66, 0x66, 0x66, 0x66, 0x6a, 0x20, + 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x1d, 0x66, 0x66, 0x76, 0x66, 0x6d, 0x10, + 0x0, 0x1b, 0x4, 0x90, 0xb6, 0x0, 0x6, 0x0, + 0x0, 0x1b, 0xa, 0x10, 0xc6, 0x66, 0x68, 0x30, + 0x0, 0x2a, 0x63, 0x55, 0xc6, 0x66, 0x6c, 0x0, + 0x0, 0x2a, 0x26, 0xb6, 0xa1, 0x0, 0xc, 0x0, + 0x0, 0x39, 0xc, 0x20, 0xa7, 0x66, 0x6c, 0x0, + 0x0, 0x47, 0x7e, 0x20, 0xa8, 0x66, 0x6c, 0x0, + 0x0, 0x67, 0x5c, 0x0, 0x1c, 0x50, 0x11, 0x0, + 0x0, 0x91, 0xc, 0x0, 0x7b, 0x66, 0xc9, 0x0, + 0x0, 0x90, 0xc, 0x4, 0x42, 0x76, 0x90, 0x0, + 0x4, 0x40, 0xc, 0x1, 0x1, 0xbd, 0x40, 0x0, + 0x5, 0x0, 0xb, 0x2, 0x78, 0x20, 0x8d, 0xb1, + 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x20, + + /* U+5C6C "屬" */ + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, + 0x2, 0xd6, 0x66, 0x66, 0x66, 0x6a, 0x70, 0x0, + 0x2b, 0x0, 0x0, 0x0, 0x0, 0x75, 0x0, 0x2, + 0xc6, 0x86, 0x69, 0x86, 0x9b, 0x30, 0x0, 0x2b, + 0x1, 0xa3, 0x75, 0x46, 0x20, 0x0, 0x2, 0xa7, + 0x85, 0x47, 0x44, 0x7a, 0x30, 0x0, 0x3a, 0x56, + 0x66, 0x86, 0x66, 0x94, 0x0, 0x3, 0x95, 0x60, + 0xa0, 0xb, 0xa, 0x10, 0x0, 0x58, 0x5a, 0x68, + 0x66, 0x86, 0xb1, 0x0, 0x6, 0x50, 0x9b, 0x66, + 0x66, 0x66, 0x90, 0x0, 0x92, 0x66, 0x0, 0xa0, + 0x1, 0x1a, 0x0, 0xb, 0x32, 0xb6, 0x6d, 0x67, + 0x92, 0x90, 0x1, 0x90, 0xb, 0x66, 0xd6, 0x77, + 0x38, 0x0, 0x62, 0x0, 0x33, 0x3c, 0x57, 0x75, + 0x60, 0x6, 0x0, 0x1a, 0x64, 0x10, 0x19, 0xc3, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x15, 0x0, + + /* U+5C71 "å±±" */ + 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x9, 0x40, 0x0, 0xd0, 0x0, 0xa, + 0x30, 0xa3, 0x0, 0xd, 0x0, 0x0, 0xc1, 0xa, + 0x30, 0x0, 0xd0, 0x0, 0xc, 0x10, 0xa3, 0x0, + 0xd, 0x0, 0x0, 0xc1, 0xa, 0x30, 0x0, 0xd0, + 0x0, 0xc, 0x10, 0xa3, 0x0, 0xd, 0x0, 0x0, + 0xc1, 0xa, 0x30, 0x0, 0xd0, 0x0, 0xc, 0x10, + 0xa3, 0x0, 0xd, 0x0, 0x0, 0xc1, 0xd, 0x76, + 0x66, 0xa6, 0x66, 0x6d, 0x10, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x91, + + /* U+5CF6 "å³¶" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x7, 0x0, 0x0, 0x51, 0x0, 0x0, 0xc, + 0x66, 0x66, 0x66, 0x6d, 0x30, 0x0, 0x0, 0xc6, + 0x66, 0x66, 0x66, 0xd1, 0x0, 0x0, 0xc, 0x10, + 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0xc6, 0x66, + 0x66, 0x66, 0xd1, 0x0, 0x0, 0xc, 0x10, 0x0, + 0x0, 0x1, 0x2, 0x70, 0x0, 0xc6, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x10, 0xc, 0x66, 0x66, 0x66, + 0x66, 0x6a, 0x50, 0x0, 0x40, 0xa, 0x10, 0x0, + 0x0, 0x93, 0x1, 0xb0, 0x0, 0xd0, 0x0, 0xb1, + 0xb, 0x10, 0xc, 0x0, 0xd, 0x0, 0xd, 0x0, + 0xd0, 0x2, 0xc6, 0x66, 0x96, 0x66, 0xc0, 0x1c, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xce, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, + + /* U+5D4C "嵌" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x6, 0x80, 0x0, 0x20, 0x0, 0x1, + 0xd0, 0x0, 0x66, 0x0, 0xb, 0x40, 0x0, 0x1b, + 0x0, 0x6, 0x60, 0x0, 0xb2, 0x0, 0x2, 0xb6, + 0x66, 0x66, 0x66, 0x6c, 0x20, 0x0, 0x19, 0x0, + 0xb2, 0x2, 0xe0, 0x0, 0x0, 0x1, 0xb0, 0xd, + 0x22, 0x78, 0x0, 0x21, 0x5, 0x7d, 0x66, 0xe7, + 0x6b, 0x66, 0x6c, 0x90, 0x1, 0xb0, 0xd, 0x5, + 0x77, 0x41, 0x70, 0x0, 0x1d, 0x66, 0xe0, 0x70, + 0xb6, 0x0, 0x0, 0x1, 0xb0, 0xd, 0x0, 0xd, + 0x50, 0x0, 0x0, 0x1b, 0x0, 0xd0, 0x3, 0xa6, + 0x20, 0x0, 0x1, 0xb0, 0xd, 0x0, 0x94, 0x1b, + 0x0, 0x0, 0x1d, 0x66, 0xe0, 0x48, 0x0, 0x7b, + 0x10, 0x2, 0x80, 0x5, 0x66, 0x0, 0x0, 0xbd, + 0x20, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x10, + + /* U+5DDD "å·" */ + 0x0, 0x25, 0x0, 0x0, 0x0, 0x5, 0x50, 0x2, + 0xc0, 0x0, 0x40, 0x0, 0x78, 0x0, 0x2b, 0x0, + 0xd, 0x30, 0x7, 0x70, 0x2, 0xb0, 0x0, 0xc1, + 0x0, 0x77, 0x0, 0x3a, 0x0, 0xc, 0x10, 0x6, + 0x70, 0x3, 0xa0, 0x0, 0xc1, 0x0, 0x67, 0x0, + 0x39, 0x0, 0xc, 0x10, 0x6, 0x70, 0x5, 0x70, + 0x0, 0xc1, 0x0, 0x67, 0x0, 0x65, 0x0, 0xc, + 0x10, 0x6, 0x70, 0x9, 0x20, 0x0, 0xc1, 0x0, + 0x67, 0x0, 0xc0, 0x0, 0xd, 0x10, 0x6, 0x70, + 0x36, 0x0, 0x0, 0x80, 0x0, 0x67, 0x8, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x73, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x77, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, + + /* U+5DDE "å·ž" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x72, 0x0, + 0x0, 0xd2, 0x0, 0x93, 0x0, 0xb3, 0x0, 0x0, + 0xd0, 0x0, 0xb1, 0x0, 0xb2, 0x0, 0x0, 0xd0, + 0x0, 0xb1, 0x0, 0xb2, 0x0, 0x10, 0xd0, 0x0, + 0xb1, 0x10, 0xb2, 0x0, 0x70, 0xd0, 0x90, 0xb1, + 0x82, 0xb2, 0x1, 0xc0, 0xd0, 0xa5, 0xb1, 0x4b, + 0xb2, 0x9, 0x91, 0xb0, 0x64, 0xb1, 0x7, 0xb2, + 0x1, 0x4, 0x90, 0x0, 0xb1, 0x0, 0xb2, 0x0, + 0x7, 0x60, 0x0, 0xb1, 0x0, 0xb2, 0x0, 0xc, + 0x20, 0x0, 0xb1, 0x0, 0xb2, 0x0, 0x2b, 0x0, + 0x0, 0xb2, 0x0, 0xb2, 0x0, 0xa2, 0x0, 0x0, + 0x91, 0x0, 0xb2, 0x6, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xb2, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x30, + + /* U+5DE5 "å·¥" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x72, 0x0, + 0x28, 0x66, 0x66, 0xb7, 0x66, 0x68, 0x60, 0x0, + 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, + 0x0, 0x3, 0x1, 0x66, 0x66, 0x66, 0xd8, 0x66, + 0x68, 0xf6, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5DE6 "å·¦" */ + 0x0, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xb0, 0x0, 0x0, 0x96, 0x0, 0x37, + 0x66, 0xaa, 0x66, 0x66, 0x66, 0x50, 0x0, 0x0, + 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xb, 0x66, + 0x67, 0x66, 0xb9, 0x0, 0x0, 0x4, 0x80, 0x0, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0xa0, 0x0, 0xb, + 0x20, 0x0, 0x0, 0x0, 0x74, 0x0, 0x0, 0xb2, + 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0xb, 0x20, + 0x0, 0x0, 0x15, 0x0, 0x0, 0x0, 0xb2, 0x0, + 0x27, 0x0, 0x0, 0x66, 0x66, 0x67, 0x66, 0x67, + 0x82, + + /* U+5DEE "å·®" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x59, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, + 0x0, 0x96, 0x0, 0xa, 0x10, 0x10, 0x0, 0x56, + 0x67, 0x76, 0x68, 0x86, 0x6e, 0x90, 0x1, 0x0, + 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x81, 0x0, 0x0, 0x66, 0x68, + 0xc6, 0x66, 0x67, 0x40, 0x0, 0x0, 0x0, 0x85, + 0x0, 0x0, 0x4, 0x20, 0x46, 0x66, 0x6d, 0x66, + 0x66, 0x66, 0xa9, 0x0, 0x0, 0x7, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xc6, 0x66, 0x66, + 0x6d, 0x30, 0x0, 0x0, 0xa1, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x1, 0x71, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x10, 0x40, 0x36, 0x66, 0x66, 0xe6, 0x66, 0xbd, + 0x10, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5DF1 "å·±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0x66, 0x66, 0x66, 0x66, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0xe, 0x66, 0x66, 0x66, 0x66, 0xf0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0xd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x60, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb0, 0xe, 0x42, 0x22, 0x22, + 0x22, 0x26, 0xf3, 0x5, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0x70, + + /* U+5DF2 "å·²" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x18, + 0x66, 0x66, 0x66, 0x66, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x5, 0x0, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0xf, 0x10, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0xe, 0x66, 0x66, 0x66, 0x66, 0xe0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0xe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x60, 0xe, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x90, 0xe, 0x42, 0x22, 0x22, + 0x22, 0x27, 0xe1, 0x5, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x50, + + /* U+5E02 "市" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc5, 0x0, 0x0, 0x20, 0x4, 0x66, + 0x66, 0x69, 0x76, 0x66, 0x6f, 0x80, 0x11, 0x0, + 0x0, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0xb, 0x20, 0x0, 0x20, 0x0, 0x0, 0xd6, 0x66, + 0xd7, 0x66, 0x6f, 0x20, 0x0, 0xd, 0x10, 0xb, + 0x20, 0x0, 0xe0, 0x0, 0x0, 0xd1, 0x0, 0xb2, + 0x0, 0xe, 0x0, 0x0, 0xd, 0x10, 0xb, 0x20, + 0x0, 0xe0, 0x0, 0x0, 0xd1, 0x0, 0xb2, 0x0, + 0xe, 0x0, 0x0, 0xd, 0x10, 0xb, 0x20, 0x0, + 0xe0, 0x0, 0x0, 0xd1, 0x0, 0xb2, 0x17, 0x9d, + 0x0, 0x0, 0xb, 0x0, 0xb, 0x20, 0xb, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, + + /* U+5E03 "布" */ + 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8a, 0x0, 0x0, 0x3, 0xa0, + 0x4, 0x66, 0x66, 0xf6, 0x66, 0x66, 0x66, 0x62, + 0x0, 0x0, 0x7, 0x70, 0x1b, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x3, 0x0, + 0x0, 0x0, 0xbe, 0x66, 0x6e, 0x66, 0x7e, 0x10, + 0x0, 0x7, 0x4d, 0x0, 0xd, 0x0, 0x1c, 0x0, + 0x0, 0x64, 0xd, 0x0, 0xd, 0x0, 0x1c, 0x0, + 0x4, 0x30, 0xd, 0x0, 0xd, 0x0, 0x1c, 0x0, + 0x1, 0x0, 0xd, 0x0, 0xd, 0x0, 0x1c, 0x0, + 0x0, 0x0, 0xd, 0x0, 0xd, 0x5, 0x6c, 0x0, + 0x0, 0x0, 0x1b, 0x0, 0x1d, 0x2, 0xd6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, + + /* U+5E0C "希" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x30, 0x0, 0x0, 0xba, 0x0, 0x0, + 0x0, 0x0, 0x16, 0x86, 0x4c, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0xcb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x37, 0x83, 0x3, 0xbe, 0x30, 0x0, + 0x0, 0x25, 0x30, 0x9c, 0x0, 0x5, 0x61, 0x10, + 0x6, 0x66, 0x66, 0xf7, 0x66, 0x66, 0x6d, 0xb0, + 0x0, 0x0, 0xb, 0x40, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x86, 0x0, 0xd0, 0x0, 0x30, 0x0, + 0x0, 0x7, 0xf6, 0x66, 0xe6, 0x66, 0xf2, 0x0, + 0x0, 0x74, 0xe0, 0x0, 0xd0, 0x0, 0xe0, 0x0, + 0x16, 0x10, 0xe0, 0x0, 0xd0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0xd0, 0x12, 0xd0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x5e, 0x90, 0x0, + 0x0, 0x0, 0x30, 0x0, 0xe0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, + + /* U+5E2B "師" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x90, 0x2, 0x55, 0x55, 0x55, 0x5c, 0x19, 0x78, + 0x6b, 0x32, 0x11, 0xd1, 0x11, 0x10, 0xd0, 0x0, + 0xd0, 0x0, 0xd, 0x0, 0x0, 0xd, 0x0, 0xd, + 0x7, 0x66, 0xe6, 0x66, 0xb0, 0xd0, 0x0, 0xd0, + 0xd0, 0xd, 0x0, 0x2a, 0xd, 0x66, 0x6b, 0xd, + 0x0, 0xd0, 0x2, 0xa0, 0xd0, 0x0, 0x20, 0xd0, + 0xd, 0x0, 0x2a, 0xd, 0x66, 0x6e, 0x2d, 0x0, + 0xd0, 0x2, 0xa0, 0xd0, 0x0, 0xd0, 0xd0, 0xd, + 0x0, 0x2a, 0xd, 0x0, 0xd, 0xd, 0x0, 0xd0, + 0x24, 0xa0, 0xd0, 0x0, 0xd0, 0xb0, 0xd, 0x5, + 0xe6, 0xd, 0x66, 0x6d, 0x0, 0x0, 0xd0, 0x1, + 0x0, 0x90, 0x0, 0x10, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, + + /* U+5E2D "席" */ + 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x0, 0x0, 0xd0, 0x0, 0x4, 0x60, + 0x0, 0xb7, 0x66, 0x76, 0x66, 0x96, 0x66, 0x50, + 0x0, 0xb2, 0x0, 0x75, 0x0, 0xd3, 0x0, 0x0, + 0x0, 0xb3, 0x66, 0xa8, 0x66, 0xe6, 0x6d, 0x60, + 0x0, 0xb2, 0x0, 0x64, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xc1, 0x0, 0x68, 0x66, 0xe0, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0x52, 0xb1, 0x70, 0x0, 0x0, + 0x0, 0xd0, 0x3, 0x0, 0xb1, 0x0, 0x5, 0x0, + 0x0, 0xd0, 0xe, 0x66, 0xd6, 0x66, 0x7c, 0x0, + 0x1, 0xa0, 0xd, 0x0, 0xb1, 0x0, 0x2a, 0x0, + 0x5, 0x50, 0xd, 0x0, 0xb1, 0x0, 0x2a, 0x0, + 0x8, 0x0, 0xd, 0x0, 0xb1, 0x28, 0xd8, 0x0, + 0x6, 0x0, 0x5, 0x0, 0xc2, 0x0, 0x50, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, + + /* U+5E2F "帯" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x50, 0x1, 0x0, 0x0, + 0x0, 0x3, 0xa0, 0x7, 0x50, 0xb, 0x33, 0x0, + 0x4, 0x68, 0xb6, 0x6a, 0x96, 0x6d, 0x7c, 0x70, + 0x0, 0x3, 0x90, 0x7, 0x50, 0xb, 0x20, 0x0, + 0x0, 0x5, 0xb6, 0x69, 0x86, 0x6c, 0x20, 0x0, + 0x0, 0x40, 0x10, 0x0, 0x0, 0x3, 0x2, 0x10, + 0x2, 0xa6, 0x66, 0x68, 0x76, 0x66, 0x6b, 0xa0, + 0xb, 0x50, 0x0, 0x7, 0x70, 0x0, 0x7, 0x0, + 0x3, 0xb, 0x66, 0x6a, 0x96, 0x67, 0xc0, 0x0, + 0x0, 0xd, 0x0, 0x7, 0x50, 0x3, 0xa0, 0x0, + 0x0, 0xd, 0x0, 0x7, 0x50, 0x3, 0xa0, 0x0, + 0x0, 0xd, 0x0, 0x7, 0x50, 0x3, 0xa0, 0x0, + 0x0, 0xd, 0x0, 0x7, 0x50, 0x6c, 0x80, 0x0, + 0x0, 0x3, 0x0, 0x7, 0x50, 0x5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, 0x0, + + /* U+5E30 "帰" */ + 0x0, 0x7, 0x40, 0x56, 0x66, 0x66, 0x6b, 0x0, + 0x0, 0x9, 0x30, 0x11, 0x0, 0x0, 0x1c, 0x0, + 0x0, 0x9, 0x30, 0x36, 0x66, 0x66, 0x6c, 0x0, + 0x6, 0x29, 0x30, 0x1, 0x0, 0x0, 0x1c, 0x0, + 0xb, 0x9, 0x30, 0x66, 0x66, 0x66, 0x6c, 0x0, + 0xb, 0xa, 0x22, 0x0, 0x0, 0x0, 0x4, 0x10, + 0xb, 0xb, 0x1a, 0x66, 0x6a, 0x66, 0x66, 0xe1, + 0xb, 0xc, 0x5a, 0x0, 0xd, 0x0, 0x4, 0x30, + 0x7, 0xc, 0x11, 0x76, 0x6e, 0x66, 0x6a, 0x0, + 0x0, 0x2a, 0x0, 0xd0, 0xd, 0x0, 0x1c, 0x0, + 0x0, 0x65, 0x0, 0xd0, 0xd, 0x0, 0x1c, 0x0, + 0x0, 0xa0, 0x0, 0xd0, 0xd, 0x0, 0x1c, 0x0, + 0x3, 0x60, 0x0, 0xd0, 0xd, 0x6, 0xab, 0x0, + 0x6, 0x0, 0x0, 0x50, 0xd, 0x0, 0x62, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, + + /* U+5E33 "帳" */ + 0x0, 0xb1, 0x0, 0x4, 0x0, 0x0, 0x71, 0x0, + 0xd, 0x0, 0x0, 0xd6, 0x66, 0x66, 0x30, 0x10, + 0xd0, 0x30, 0xd, 0x22, 0x24, 0x70, 0xe, 0x6e, + 0x6e, 0x30, 0xd3, 0x33, 0x32, 0x0, 0xd0, 0xd0, + 0xd0, 0xc, 0x0, 0x1, 0x60, 0xd, 0xd, 0xd, + 0x0, 0xd6, 0x66, 0x65, 0x0, 0xd0, 0xd0, 0xd0, + 0xc, 0x0, 0x0, 0x17, 0xd, 0xd, 0xd, 0x47, + 0xd6, 0x96, 0x66, 0x61, 0xd0, 0xd0, 0xd0, 0x1b, + 0x6, 0x0, 0x84, 0xd, 0xd, 0x3d, 0x1, 0xb0, + 0x44, 0x6a, 0x20, 0x90, 0xd4, 0x80, 0x1b, 0x0, + 0xc4, 0x0, 0x0, 0xd, 0x0, 0x1, 0xb0, 0x5, + 0xa0, 0x0, 0x0, 0xd0, 0x0, 0x1c, 0x76, 0x9, + 0xb2, 0x0, 0xe, 0x0, 0x4, 0xf5, 0x0, 0x9, + 0xd3, 0x0, 0x50, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x0, + + /* U+5E36 "帶" */ + 0x0, 0x1, 0xb0, 0x92, 0x18, 0xb, 0x10, 0x0, + 0x0, 0x0, 0xd0, 0xc0, 0xb, 0xd, 0x4, 0x0, + 0x2, 0x66, 0xd6, 0xd6, 0x6d, 0x6e, 0x6b, 0x80, + 0x0, 0x4, 0x80, 0xc0, 0xb, 0xd, 0x0, 0x40, + 0x0, 0x1a, 0x0, 0xc6, 0x6c, 0xd, 0x57, 0xb0, + 0x1, 0x60, 0x0, 0x60, 0x4, 0x3, 0x55, 0x20, + 0x0, 0x96, 0x66, 0x67, 0x66, 0x66, 0x68, 0xb0, + 0x7, 0x50, 0x0, 0x6, 0xb0, 0x0, 0x7, 0x40, + 0xd, 0x18, 0x66, 0x69, 0xb6, 0x68, 0xb3, 0x0, + 0x0, 0xb, 0x20, 0x6, 0x90, 0x4, 0x90, 0x0, + 0x0, 0xb, 0x20, 0x6, 0x90, 0x4, 0x90, 0x0, + 0x0, 0xb, 0x20, 0x6, 0x90, 0x4, 0x90, 0x0, + 0x0, 0xb, 0x10, 0x6, 0x91, 0x8c, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xa0, 0x7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x40, 0x0, 0x0, 0x0, + + /* U+5E38 "常" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x15, 0x0, 0x93, 0x2, 0x60, 0x0, 0x0, 0x8, + 0xa0, 0xa2, 0xa, 0x60, 0x0, 0x2, 0x0, 0x90, + 0xa2, 0x43, 0x0, 0x30, 0xa, 0x66, 0x66, 0x76, + 0x66, 0x66, 0xe8, 0x78, 0x2, 0x10, 0x0, 0x4, + 0x2, 0x70, 0x61, 0x5, 0xa6, 0x66, 0x6d, 0x20, + 0x0, 0x0, 0x4, 0x70, 0x0, 0xc, 0x0, 0x0, + 0x0, 0x5, 0xa6, 0xb7, 0x6c, 0x0, 0x0, 0x0, + 0x21, 0x0, 0xa2, 0x0, 0x3, 0x0, 0x0, 0xd6, + 0x66, 0xc7, 0x66, 0x8c, 0x0, 0x0, 0xd1, 0x0, + 0xa2, 0x0, 0x39, 0x0, 0x0, 0xd1, 0x0, 0xa2, + 0x0, 0x39, 0x0, 0x0, 0xd1, 0x0, 0xa2, 0x18, + 0xd8, 0x0, 0x0, 0x40, 0x0, 0xb3, 0x0, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, + + /* U+5E45 "å¹…" */ + 0x0, 0x92, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0xc0, 0x4, 0x76, 0x66, 0x66, 0x96, 0x10, 0xc0, + 0x30, 0x0, 0x0, 0x1, 0x0, 0xc6, 0xd6, 0xd3, + 0xd, 0x66, 0x6d, 0x30, 0xc0, 0xc0, 0xc0, 0xd, + 0x0, 0xc, 0x0, 0xc0, 0xc0, 0xc0, 0xd, 0x66, + 0x6d, 0x0, 0xc0, 0xc0, 0xc0, 0xb, 0x0, 0x6, + 0x0, 0xc0, 0xc0, 0xc0, 0x86, 0x66, 0x66, 0xa2, + 0xc0, 0xc0, 0xc0, 0xd0, 0xc, 0x0, 0xb2, 0xc0, + 0xc0, 0xc0, 0xd0, 0xc, 0x0, 0xb1, 0xc0, 0xc6, + 0xa0, 0xd6, 0x6d, 0x66, 0xd1, 0x10, 0xc0, 0x0, + 0xd0, 0xc, 0x0, 0xb1, 0x0, 0xc0, 0x0, 0xd6, + 0x6d, 0x66, 0xd1, 0x0, 0xc0, 0x0, 0xd0, 0x0, + 0x0, 0xb1, 0x0, 0x50, 0x0, 0x40, 0x0, 0x0, + 0x10, + + /* U+5E73 "å¹³" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x51, 0x0, + 0x0, 0x76, 0x66, 0x6b, 0x76, 0x66, 0x86, 0x0, + 0x0, 0x3, 0x0, 0xb, 0x30, 0x6, 0x30, 0x0, + 0x0, 0x6, 0x80, 0xb, 0x30, 0xe, 0x50, 0x0, + 0x0, 0x0, 0xd7, 0xb, 0x30, 0x74, 0x0, 0x0, + 0x0, 0x0, 0x68, 0xb, 0x32, 0x50, 0x1, 0x0, + 0x26, 0x66, 0x66, 0x6d, 0x87, 0x66, 0x6e, 0x80, + 0x1, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5E74 "å¹´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0xc, 0x86, 0x66, 0x86, 0x66, 0x8c, 0x20, + 0x0, 0x67, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, + 0x1, 0x90, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, + 0x7, 0x4, 0x0, 0x1, 0xd0, 0x2, 0x90, 0x0, + 0x10, 0xb, 0x86, 0x66, 0xe6, 0x66, 0x62, 0x0, + 0x0, 0xb, 0x30, 0x1, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x30, 0x1, 0xd0, 0x0, 0x1, 0x0, + 0x27, 0x6c, 0x76, 0x66, 0xe6, 0x66, 0x6d, 0xa0, + 0x1, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x50, 0x0, 0x0, 0x0, + + /* U+5E78 "幸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x5, 0x0, 0x0, + 0x0, 0x6, 0x66, 0x6d, 0x76, 0x69, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x1, 0x0, + 0x4, 0x66, 0x66, 0x6c, 0x76, 0x66, 0xad, 0x10, + 0x0, 0x0, 0x6, 0x0, 0x5, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x90, 0xa, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x50, 0x25, 0x4, 0x80, 0x0, + 0x0, 0x57, 0x66, 0x6d, 0x76, 0x66, 0x61, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x1, 0x0, + 0x16, 0x66, 0x66, 0x6d, 0x76, 0x66, 0x6f, 0x80, + 0x2, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, + + /* U+5E7E "å¹¾" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x83, 0x4, 0xa0, 0xa, 0x30, 0x0, + 0x0, 0x2, 0xa0, 0x3, 0x90, 0x49, 0x0, 0x0, + 0x0, 0x18, 0x1, 0x72, 0xa2, 0x70, 0x9, 0x0, + 0x0, 0xc9, 0x6c, 0x61, 0xba, 0x96, 0xc7, 0x0, + 0x0, 0x10, 0x83, 0x0, 0xc0, 0x8, 0x41, 0x0, + 0x0, 0x7, 0x24, 0x50, 0xc2, 0x94, 0x2a, 0x20, + 0x0, 0x8c, 0x86, 0xc0, 0xc2, 0xc7, 0x45, 0x90, + 0x0, 0x0, 0xb2, 0x10, 0xb1, 0x1c, 0x2, 0x10, + 0x4, 0x66, 0xd6, 0x66, 0xb8, 0x69, 0x6e, 0x80, + 0x0, 0x0, 0xc0, 0x0, 0x57, 0x0, 0x81, 0x0, + 0x0, 0x4, 0xc8, 0x10, 0x1c, 0x9, 0xc3, 0x0, + 0x0, 0xa, 0x14, 0xb0, 0x9, 0xd8, 0x0, 0x31, + 0x0, 0x64, 0x0, 0x30, 0x5b, 0xc7, 0x0, 0x70, + 0x4, 0x50, 0x0, 0x58, 0x40, 0x7, 0xd9, 0xd0, + 0x2, 0x0, 0x15, 0x10, 0x0, 0x0, 0x5, 0x91, + + /* U+5E83 "広" */ + 0x0, 0x0, 0x0, 0x2, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x70, 0x0, 0x10, 0x0, + 0x28, 0x66, 0x66, 0x78, 0x66, 0x7f, 0x50, 0x2, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0x0, 0x0, 0x46, 0x0, 0x0, 0x0, 0x2, 0xc0, + 0x0, 0x9, 0xb0, 0x0, 0x0, 0x0, 0x2c, 0x0, + 0x0, 0xe2, 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, + 0x69, 0x0, 0x0, 0x0, 0x0, 0x59, 0x0, 0xc, + 0x10, 0x0, 0x0, 0x0, 0x7, 0x50, 0x5, 0x60, + 0x0, 0x40, 0x0, 0x0, 0xa1, 0x0, 0xa0, 0x0, + 0x1, 0xc2, 0x0, 0xa, 0x0, 0xa2, 0x0, 0x0, + 0x5, 0xe1, 0x5, 0x30, 0x7e, 0xcc, 0xba, 0x98, + 0x7d, 0x80, 0x70, 0x2, 0x62, 0x0, 0x0, 0x0, + 0x44, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5E95 "底" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0xd3, 0x0, 0x6, 0x10, + 0x0, 0xb8, 0x66, 0x66, 0x76, 0x66, 0x68, 0x60, + 0x0, 0xb3, 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, + 0x0, 0xb3, 0x4, 0x24, 0x7a, 0xcb, 0x93, 0x0, + 0x0, 0xb3, 0x1d, 0x32, 0x2e, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0xd, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0xe, 0x66, 0x6e, 0x76, 0x6e, 0x40, + 0x0, 0xc1, 0xd, 0x0, 0x9, 0x50, 0x0, 0x0, + 0x0, 0xd0, 0xd, 0x0, 0x4, 0xb0, 0x0, 0x0, + 0x0, 0xb0, 0xd, 0x0, 0x23, 0xd2, 0x0, 0x20, + 0x5, 0x60, 0xd, 0x49, 0x50, 0x5c, 0x0, 0x70, + 0x8, 0x0, 0x2f, 0xa3, 0xa2, 0x8, 0xd3, 0xa0, + 0x25, 0x0, 0x5, 0x0, 0x4c, 0x0, 0x6e, 0xd0, + 0x20, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x50, + + /* U+5E97 "店" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, + 0x12, 0x0, 0x0, 0xc3, 0x0, 0x9, 0x10, 0x3, + 0xd6, 0x66, 0x68, 0x66, 0x66, 0x85, 0x0, 0x2c, + 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, 0x2, 0xc0, + 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, 0x2b, 0x0, + 0x0, 0xc6, 0x66, 0xab, 0x0, 0x3, 0xb0, 0x0, + 0xc, 0x10, 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, + 0xc1, 0x0, 0x0, 0x0, 0x5, 0x90, 0x96, 0x6d, + 0x66, 0x6b, 0x40, 0x0, 0x77, 0xd, 0x10, 0x0, + 0x0, 0xc3, 0x0, 0xa, 0x30, 0xc1, 0x0, 0x0, + 0xc, 0x20, 0x0, 0xb0, 0xc, 0x10, 0x0, 0x0, + 0xc2, 0x0, 0x54, 0x0, 0xd6, 0x66, 0x66, 0x6d, + 0x30, 0x6, 0x0, 0xd, 0x10, 0x0, 0x0, 0x92, + 0x1, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+5E9C "府" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0xe1, 0x0, 0x5, 0x40, + 0x0, 0xb7, 0x66, 0x66, 0x76, 0x66, 0x67, 0x70, + 0x0, 0xb3, 0x0, 0xb5, 0x0, 0x2, 0xa0, 0x0, + 0x0, 0xb3, 0x1, 0xe1, 0x0, 0x1, 0xb0, 0x0, + 0x0, 0xb3, 0x8, 0x60, 0x0, 0x1, 0xb0, 0x60, + 0x0, 0xb2, 0xe, 0x45, 0x76, 0x66, 0xd6, 0x72, + 0x0, 0xc2, 0x7c, 0x20, 0x0, 0x1, 0xb0, 0x0, + 0x0, 0xd3, 0x5a, 0x21, 0xa2, 0x1, 0xb0, 0x0, + 0x0, 0xc4, 0xa, 0x20, 0x4e, 0x1, 0xb0, 0x0, + 0x0, 0xa0, 0xa, 0x20, 0x6, 0x1, 0xb0, 0x0, + 0x4, 0x50, 0xa, 0x20, 0x0, 0x1, 0xb0, 0x0, + 0x8, 0x0, 0xa, 0x20, 0x0, 0x1, 0xb0, 0x0, + 0x14, 0x0, 0xb, 0x20, 0x0, 0x7c, 0x90, 0x0, + 0x10, 0x0, 0x5, 0x0, 0x0, 0x5, 0x10, 0x0, + + /* U+5EA6 "度" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x86, 0x0, 0x0, 0x0, 0x0, + 0x40, 0x0, 0x1, 0xc0, 0x0, 0x29, 0x0, 0xb, + 0x86, 0x68, 0x66, 0x67, 0x66, 0x62, 0x0, 0xa3, + 0x0, 0xd2, 0x0, 0xb4, 0x0, 0x0, 0xa, 0x66, + 0x6e, 0x66, 0x6c, 0x79, 0xc0, 0x0, 0xb3, 0x0, + 0xd0, 0x0, 0xa2, 0x0, 0x0, 0xb, 0x20, 0xd, + 0x0, 0xa, 0x20, 0x0, 0x0, 0xc1, 0x0, 0xb6, + 0x66, 0xa1, 0x0, 0x0, 0xd, 0x1, 0x66, 0x66, + 0x66, 0xb1, 0x0, 0x0, 0xc0, 0x0, 0x51, 0x0, + 0x99, 0x0, 0x0, 0x38, 0x0, 0x0, 0x80, 0x5b, + 0x0, 0x0, 0x7, 0x30, 0x0, 0x1, 0xbb, 0x0, + 0x0, 0x0, 0x80, 0x0, 0x1, 0x99, 0xc8, 0x20, + 0x0, 0x33, 0x0, 0x38, 0x82, 0x0, 0x6d, 0xeb, + 0x42, 0x2, 0x52, 0x0, 0x0, 0x0, 0x2, 0x30, + + /* U+5EA7 "座" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x2, 0xd0, 0x0, 0x26, 0x0, 0xa, + 0x86, 0x66, 0x68, 0x66, 0x68, 0x92, 0x0, 0xa4, + 0x0, 0x0, 0x61, 0x0, 0x0, 0x0, 0xa, 0x40, + 0x83, 0xb, 0x20, 0x56, 0x0, 0x0, 0xa4, 0xd, + 0x10, 0xb1, 0xb, 0x60, 0x0, 0xa, 0x32, 0xc0, + 0xb, 0x11, 0xe4, 0x0, 0x0, 0xb3, 0x83, 0xc3, + 0xb1, 0x74, 0x7b, 0x0, 0xc, 0x27, 0x5, 0x8b, + 0x28, 0x0, 0xa3, 0x0, 0xd4, 0x0, 0x1, 0xb3, + 0x2, 0x91, 0x0, 0xb, 0x3, 0x76, 0x6d, 0x66, + 0x66, 0x20, 0x4, 0x60, 0x0, 0x0, 0xb1, 0x0, + 0x0, 0x0, 0x80, 0x0, 0x0, 0xb, 0x10, 0x0, + 0x10, 0x15, 0x5, 0x66, 0x66, 0xd6, 0x66, 0x7f, + 0x61, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5EAB "庫" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x3, 0x0, 0x2, + 0xc6, 0x66, 0x67, 0x66, 0x66, 0xb5, 0x0, 0x2c, + 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x1, 0xb3, + 0x76, 0x66, 0xe6, 0x6a, 0x80, 0x0, 0x1b, 0x2, + 0x0, 0xd, 0x0, 0x40, 0x0, 0x2, 0xb0, 0xa7, + 0x66, 0xe6, 0x6e, 0x20, 0x0, 0x3a, 0xa, 0x20, + 0xd, 0x0, 0xd0, 0x0, 0x4, 0x80, 0xa7, 0x66, + 0xe6, 0x6e, 0x0, 0x0, 0x65, 0xa, 0x76, 0x6e, + 0x66, 0xe0, 0x0, 0xa, 0x10, 0x61, 0x0, 0xd0, + 0x4, 0x30, 0x0, 0x90, 0x76, 0x66, 0x6e, 0x66, + 0x6d, 0x70, 0x53, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x6, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, + + /* U+5EAD "庭" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x40, 0x0, 0x0, 0xb4, 0x0, 0x9, 0x10, + 0x0, 0xe6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x30, + 0x0, 0xe0, 0x0, 0x40, 0x0, 0x2, 0x7a, 0x0, + 0x0, 0xe3, 0x78, 0xf3, 0x35, 0x8d, 0x52, 0x0, + 0x0, 0xe0, 0xb, 0x40, 0x0, 0x2b, 0x0, 0x0, + 0x0, 0xd0, 0x78, 0x0, 0x0, 0x2b, 0x2, 0x0, + 0x0, 0xd3, 0xe6, 0xb8, 0x57, 0x7d, 0x6a, 0x60, + 0x0, 0xc0, 0x0, 0xc2, 0x0, 0x2b, 0x0, 0x0, + 0x0, 0xc0, 0x61, 0xc0, 0x0, 0x2b, 0x0, 0x0, + 0x2, 0x90, 0x5c, 0x61, 0x66, 0x7d, 0x67, 0xb0, + 0x6, 0x30, 0x4e, 0x80, 0x10, 0x0, 0x0, 0x0, + 0x7, 0x2, 0xb1, 0x6c, 0x84, 0x21, 0x11, 0x21, + 0x23, 0x57, 0x0, 0x0, 0x59, 0xce, 0xff, 0xa1, + 0x11, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5EB7 "康" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xb4, 0x0, 0x0, 0x0, + 0x0, 0x12, 0x0, 0x0, 0x47, 0x0, 0x8, 0x50, + 0x0, 0x3d, 0x66, 0x66, 0xa6, 0x66, 0x66, 0x50, + 0x0, 0x2b, 0x0, 0x0, 0xb3, 0x0, 0x40, 0x0, + 0x0, 0x2b, 0x18, 0x66, 0xc7, 0x66, 0xe0, 0x0, + 0x0, 0x3a, 0x0, 0x0, 0xa2, 0x0, 0xc4, 0x60, + 0x0, 0x3b, 0x76, 0x66, 0xc7, 0x66, 0xd6, 0x50, + 0x0, 0x49, 0x16, 0x66, 0xc7, 0x66, 0xc0, 0x0, + 0x0, 0x57, 0x3, 0x0, 0xa7, 0x0, 0x56, 0x0, + 0x0, 0x75, 0x8, 0x90, 0xa4, 0x50, 0x88, 0x10, + 0x0, 0xa1, 0x0, 0x96, 0xc2, 0x97, 0x20, 0x0, + 0x0, 0xa0, 0x6, 0x91, 0xa2, 0x1c, 0x20, 0x0, + 0x5, 0x35, 0xe5, 0x11, 0xc2, 0x2, 0xea, 0x50, + 0x7, 0x0, 0x30, 0x2b, 0xd0, 0x0, 0x19, 0x30, + 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5EE0 "å» " */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x3, 0x90, 0x0, 0x29, 0x0, + 0x0, 0x98, 0x66, 0x66, 0x66, 0x66, 0x67, 0x30, + 0x0, 0x94, 0x0, 0x52, 0x10, 0x55, 0x0, 0x0, + 0x0, 0x93, 0x83, 0x50, 0xc3, 0x95, 0x0, 0x0, + 0x0, 0x93, 0x1a, 0x53, 0x40, 0xb3, 0x39, 0x10, + 0x0, 0xa2, 0x86, 0x97, 0xa5, 0xa2, 0x68, 0x10, + 0x0, 0xa1, 0xc0, 0x0, 0xa7, 0x70, 0x74, 0x0, + 0x0, 0xb0, 0xc2, 0xac, 0xa5, 0x52, 0x92, 0x0, + 0x0, 0xb0, 0xc2, 0x9b, 0xa2, 0x27, 0xb0, 0x0, + 0x0, 0x90, 0xc2, 0xbb, 0xa2, 0xc, 0x70, 0x0, + 0x5, 0x40, 0xc1, 0x44, 0xa2, 0x1c, 0xa0, 0x0, + 0x7, 0x0, 0xc0, 0x4, 0xc1, 0x91, 0x8a, 0x0, + 0x13, 0x0, 0x90, 0x4, 0x96, 0x10, 0x9, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + + /* U+5EFA "建" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x31, 0x0, 0xd, 0x0, 0x20, 0x0, + 0x5, 0x66, 0xe4, 0x36, 0x6e, 0x66, 0xe3, 0x0, + 0x0, 0x5, 0x80, 0x0, 0xd, 0x0, 0xd3, 0x20, + 0x0, 0xc, 0x3, 0x66, 0x6e, 0x66, 0xe6, 0x60, + 0x0, 0x75, 0x0, 0x0, 0xd, 0x0, 0xd0, 0x0, + 0x3, 0xd6, 0x7a, 0x46, 0x6e, 0x66, 0xa0, 0x0, + 0x0, 0x10, 0x66, 0x0, 0xd, 0x0, 0x30, 0x0, + 0x0, 0x20, 0x93, 0x46, 0x6e, 0x66, 0x70, 0x0, + 0x0, 0x60, 0xc0, 0x0, 0xd, 0x0, 0x6, 0x0, + 0x0, 0x38, 0xa4, 0x66, 0x6e, 0x66, 0x68, 0x20, + 0x0, 0xb, 0x80, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x56, 0x7c, 0x63, 0x9, 0x0, 0x0, 0x21, + 0x5, 0x40, 0x1, 0x7b, 0xde, 0xee, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5F0F "å¼" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0x23, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0x6c, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0xa4, 0x0, 0x17, 0x66, + 0x66, 0x66, 0xf6, 0x66, 0xda, 0x0, 0x10, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc2, 0x0, 0x0, 0x0, 0x56, 0x66, 0x6e, + 0x4a, 0x40, 0x0, 0x0, 0x1, 0x2, 0xb0, 0x0, + 0x77, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, 0x4, + 0xb0, 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0xe, + 0x10, 0x0, 0x0, 0x0, 0x2b, 0x0, 0x11, 0x88, + 0x0, 0x60, 0x0, 0x3, 0xd8, 0x64, 0x1, 0xe4, + 0x8, 0x5, 0xbd, 0x94, 0x0, 0x0, 0x4, 0xe7, + 0xb0, 0x26, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, + + /* U+5F15 "引" */ + 0x0, 0x0, 0x0, 0x20, 0x0, 0x91, 0x37, 0x66, + 0x68, 0xd0, 0x0, 0xe0, 0x0, 0x0, 0x3, 0xa0, + 0x0, 0xe0, 0x0, 0x0, 0x3, 0xa0, 0x0, 0xe0, + 0xc, 0x66, 0x68, 0xb0, 0x0, 0xe0, 0xd, 0x0, + 0x1, 0x30, 0x0, 0xe0, 0x3a, 0x0, 0x0, 0x0, + 0x0, 0xe0, 0xaa, 0x66, 0x66, 0xb3, 0x0, 0xe0, + 0x21, 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, 0x0, + 0x2, 0xb0, 0x0, 0xe0, 0x0, 0x0, 0x6, 0x80, + 0x0, 0xe0, 0x0, 0x0, 0xa, 0x40, 0x0, 0xe0, + 0x0, 0x45, 0x6e, 0x0, 0x0, 0xe0, 0x0, 0x7, + 0xe4, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x40, + + /* U+5F1F "弟" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x50, 0x0, 0x9, 0x50, 0x0, 0x0, 0x0, + 0xb7, 0x0, 0x1c, 0x10, 0x0, 0x0, 0x0, 0x26, + 0x0, 0x61, 0x3, 0x0, 0x2, 0x76, 0x66, 0x7b, + 0x66, 0x6d, 0x50, 0x0, 0x0, 0x0, 0x2b, 0x0, + 0xc, 0x20, 0x0, 0x41, 0x0, 0x2b, 0x0, 0xc, + 0x20, 0x0, 0xa9, 0x66, 0x7d, 0x66, 0x6c, 0x10, + 0x0, 0xe0, 0x0, 0x2b, 0x0, 0x0, 0x0, 0x6, + 0xd6, 0x66, 0xad, 0x66, 0x66, 0xc4, 0x0, 0x10, + 0x8, 0xbb, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x5b, + 0x2b, 0x0, 0x0, 0xe0, 0x0, 0x5, 0x90, 0x2b, + 0x0, 0x2, 0xc0, 0x0, 0x76, 0x0, 0x2b, 0x4, + 0xbd, 0x70, 0x36, 0x10, 0x0, 0x3c, 0x0, 0x26, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, 0x0, + + /* U+5F31 "å¼±" */ + 0x0, 0x0, 0x0, 0x60, 0x23, 0x33, 0x39, 0x0, + 0x17, 0x66, 0x6e, 0x13, 0x43, 0x33, 0xd0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x6, + 0x66, 0x6e, 0x0, 0xb5, 0x55, 0xd0, 0x0, 0xa2, + 0x0, 0x70, 0x2b, 0x0, 0x4, 0x0, 0xc, 0x0, + 0x0, 0x5, 0x80, 0x0, 0x0, 0x2, 0xe6, 0x66, + 0xd2, 0xa9, 0x66, 0x6c, 0x50, 0x3, 0x0, 0xe, + 0x1, 0x30, 0x0, 0xb2, 0x0, 0xc, 0x20, 0xd0, + 0x3, 0xc0, 0xb, 0x20, 0x0, 0x65, 0xd, 0x0, + 0xa, 0x20, 0xb2, 0x0, 0x0, 0x65, 0xd0, 0x0, + 0x27, 0x4c, 0x20, 0x39, 0x91, 0x1b, 0x5, 0xb7, + 0x0, 0xd1, 0xb, 0x50, 0x4, 0x90, 0xa2, 0x10, + 0xe, 0x0, 0x0, 0x4b, 0xe3, 0x0, 0x1, 0x9f, + 0x90, 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x40, + 0x0, + + /* U+5F35 "å¼µ" */ + 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x28, 0x0, + 0x4, 0x66, 0x6e, 0x1a, 0x76, 0x66, 0x66, 0x10, + 0x0, 0x0, 0xd, 0xa, 0x30, 0x0, 0x52, 0x0, + 0x0, 0x0, 0xd, 0xa, 0x76, 0x66, 0x64, 0x0, + 0x5, 0x86, 0x6e, 0xa, 0x30, 0x0, 0x34, 0x0, + 0x7, 0x60, 0x4, 0xa, 0x76, 0x66, 0x65, 0x0, + 0x8, 0x40, 0x0, 0xa, 0x30, 0x0, 0x4, 0x20, + 0xc, 0x20, 0x5, 0x7d, 0x69, 0x66, 0x67, 0x60, + 0x8, 0x66, 0x6d, 0x3d, 0x4, 0x20, 0x9, 0x0, + 0x0, 0x0, 0xd, 0xd, 0x0, 0x81, 0xa6, 0x10, + 0x0, 0x0, 0xc, 0xd, 0x0, 0x78, 0x0, 0x0, + 0x0, 0x0, 0x39, 0xd, 0x0, 0xc, 0x20, 0x0, + 0x0, 0x20, 0x85, 0xd, 0x48, 0x14, 0xe5, 0x0, + 0x0, 0x5e, 0xe0, 0xe, 0xa0, 0x0, 0x5f, 0x90, + 0x0, 0x4, 0x10, 0x3, 0x0, 0x0, 0x1, 0x0, + + /* U+5F37 "å¼·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x0, 0x5, 0xc0, 0x0, 0x0, + 0x6, 0x66, 0x6e, 0x20, 0xc, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x82, 0x0, 0x31, 0x0, + 0x0, 0x0, 0xd, 0x18, 0x20, 0x12, 0x3d, 0x60, + 0x6, 0x86, 0x6e, 0x2e, 0xb8, 0xa4, 0x22, 0xe0, + 0x8, 0x50, 0x3, 0x0, 0x0, 0xd1, 0x0, 0x10, + 0x9, 0x30, 0x0, 0x8, 0x66, 0xe6, 0x6a, 0x20, + 0xd, 0x10, 0x5, 0xd, 0x0, 0xd0, 0xd, 0x0, + 0x7, 0x66, 0x6d, 0x4d, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0x0, 0xd, 0xd, 0x66, 0xe6, 0x6e, 0x0, + 0x0, 0x0, 0x1d, 0x8, 0x0, 0xd0, 0x5, 0x0, + 0x0, 0x0, 0x5a, 0x0, 0x0, 0xd0, 0x7, 0x0, + 0x0, 0x42, 0xc4, 0x13, 0x45, 0xe7, 0x68, 0xb0, + 0x0, 0x2e, 0xa0, 0x1d, 0x95, 0x30, 0x0, 0xc0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5F53 "当" */ + 0x0, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x2, + 0x30, 0x0, 0xb3, 0x0, 0x66, 0x0, 0x0, 0x99, + 0x0, 0xb2, 0x1, 0xe7, 0x0, 0x0, 0xd, 0x60, + 0xb2, 0x9, 0x40, 0x0, 0x0, 0x3, 0x20, 0xb2, + 0x42, 0x0, 0x0, 0x5, 0x66, 0x66, 0xd7, 0x66, + 0x66, 0xc2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, 0x1, + 0x86, 0x66, 0x66, 0x66, 0x66, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xe0, 0x28, 0x66, 0x66, 0x66, 0x66, + 0x66, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x50, + + /* U+5F62 "å½¢" */ + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x13, 0x0, + 0x4, 0x68, 0x76, 0x68, 0xa8, 0x0, 0xab, 0x0, + 0x0, 0x9, 0x40, 0x2a, 0x0, 0x5, 0xa0, 0x0, + 0x0, 0x9, 0x40, 0x2a, 0x0, 0x29, 0x0, 0x0, + 0x0, 0x9, 0x40, 0x2a, 0x2, 0x50, 0x2, 0x0, + 0x0, 0x9, 0x40, 0x2a, 0x46, 0x0, 0x2e, 0x40, + 0x6, 0x6c, 0x86, 0x7c, 0x65, 0x1, 0xd6, 0x0, + 0x0, 0xb, 0x20, 0x2a, 0x0, 0x1b, 0x30, 0x0, + 0x0, 0xc, 0x10, 0x2a, 0x2, 0x81, 0x0, 0x0, + 0x0, 0xc, 0x0, 0x2a, 0x3, 0x0, 0x7, 0xc0, + 0x0, 0x48, 0x0, 0x2a, 0x0, 0x0, 0x5d, 0x30, + 0x0, 0xa1, 0x0, 0x3a, 0x0, 0x6, 0xb1, 0x0, + 0x3, 0x60, 0x0, 0x3a, 0x0, 0x87, 0x0, 0x0, + 0x6, 0x0, 0x0, 0x25, 0x38, 0x20, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + + /* U+5F71 "å½±" */ + 0x0, 0x30, 0x0, 0x3, 0x10, 0x0, 0x21, 0x0, + 0x0, 0xe6, 0x66, 0x6b, 0x60, 0x0, 0xb9, 0x0, + 0x0, 0xd6, 0x66, 0x6b, 0x30, 0x7, 0x80, 0x0, + 0x0, 0xd0, 0x0, 0x9, 0x30, 0x46, 0x0, 0x0, + 0x0, 0xd6, 0x88, 0x6b, 0x33, 0x40, 0x1, 0x0, + 0x1, 0x11, 0x1c, 0x11, 0x80, 0x0, 0x1e, 0x50, + 0x6, 0x65, 0x55, 0x57, 0x52, 0x0, 0xb6, 0x0, + 0x0, 0xd6, 0x66, 0x6d, 0x30, 0x9, 0x40, 0x0, + 0x0, 0xd1, 0x0, 0xb, 0x11, 0x82, 0x0, 0x10, + 0x0, 0xd6, 0x68, 0x6d, 0x23, 0x0, 0x7, 0xd0, + 0x0, 0x43, 0xd, 0x13, 0x0, 0x0, 0x5c, 0x20, + 0x0, 0x3d, 0x1d, 0x4b, 0x20, 0x6, 0xa0, 0x0, + 0x1, 0xa1, 0xc, 0x6, 0x80, 0x97, 0x0, 0x0, + 0x6, 0x3, 0xca, 0x0, 0x67, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x2, 0x10, 0x0, 0x0, 0x0, + + /* U+5F79 "å½¹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xe2, 0x3, 0x76, 0x6a, 0x0, 0x0, + 0x0, 0xb, 0x60, 0x3, 0x90, 0xd, 0x0, 0x0, + 0x0, 0x77, 0x0, 0x4, 0x90, 0xd, 0x0, 0x0, + 0x4, 0x60, 0x52, 0x6, 0x60, 0xd, 0x0, 0x0, + 0x13, 0x1, 0xe6, 0xb, 0x10, 0xe, 0x21, 0x30, + 0x0, 0xa, 0x60, 0x83, 0x0, 0x5, 0x88, 0x80, + 0x0, 0x5f, 0x15, 0x25, 0x66, 0x66, 0xb0, 0x0, + 0x3, 0x8c, 0x10, 0x1, 0x40, 0x6, 0x90, 0x0, + 0x26, 0xc, 0x10, 0x0, 0x70, 0xc, 0x20, 0x0, + 0x10, 0xc, 0x10, 0x0, 0x53, 0x4a, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0xa, 0xc1, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x3, 0xb3, 0x4d, 0x60, 0x0, + 0x0, 0xc, 0x12, 0x76, 0x0, 0x2, 0xbf, 0x80, + 0x0, 0x4, 0x12, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+5F7C "å½¼" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x85, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, + 0x1e, 0x20, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x8, + 0x50, 0x7, 0x66, 0x6d, 0x66, 0xa7, 0x2, 0x70, + 0x91, 0x84, 0x0, 0xc0, 0xb, 0x30, 0x60, 0x3d, + 0x18, 0x40, 0xc, 0x3, 0x10, 0x0, 0xc, 0x40, + 0x84, 0x0, 0xc0, 0x0, 0x0, 0x5, 0xf0, 0x8, + 0x86, 0x6c, 0x69, 0x80, 0x1, 0xad, 0x0, 0x93, + 0x60, 0x0, 0xa3, 0x0, 0x70, 0xd0, 0xa, 0x22, + 0x60, 0x1c, 0x0, 0x10, 0xd, 0x0, 0xc0, 0xa, + 0x8, 0x40, 0x0, 0x0, 0xd0, 0xb, 0x0, 0x49, + 0xa0, 0x0, 0x0, 0xd, 0x4, 0x60, 0x2, 0xf5, + 0x0, 0x0, 0x0, 0xd0, 0x80, 0x6, 0x92, 0xc9, + 0x20, 0x0, 0xd, 0x33, 0x47, 0x20, 0x0, 0x9f, + 0x90, 0x0, 0x41, 0x20, 0x0, 0x0, 0x0, 0x10, + + /* U+5F80 "å¾€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0x10, 0x4, 0x20, 0x0, 0x0, 0x0, + 0x9, 0x80, 0x0, 0xc, 0x40, 0x0, 0x0, 0x4, + 0x90, 0x0, 0x0, 0x68, 0x0, 0x0, 0x1, 0x80, + 0x11, 0x66, 0x66, 0x66, 0x9c, 0x0, 0x50, 0xe, + 0x42, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xa0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x2, 0xf1, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0x0, 0xbe, 0x10, 0x0, + 0xe, 0x0, 0x52, 0x0, 0x73, 0xc1, 0x6, 0x76, + 0xe6, 0x66, 0x40, 0x32, 0xc, 0x10, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0xe0, 0x0, + 0x61, 0x0, 0xd, 0x28, 0x66, 0x68, 0x66, 0x68, + 0x60, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5F85 "å¾…" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2c, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, + 0x9, 0x70, 0x0, 0xd, 0x0, 0x0, 0x0, 0x3, + 0xa0, 0x6, 0x66, 0xe6, 0x6c, 0x20, 0x0, 0x90, + 0x72, 0x0, 0xd, 0x0, 0x0, 0x0, 0x60, 0x1e, + 0x30, 0x0, 0xd0, 0x0, 0x10, 0x0, 0x9, 0x67, + 0x66, 0x6c, 0x66, 0x6b, 0x50, 0x3, 0xf1, 0x0, + 0x0, 0x0, 0x92, 0x0, 0x0, 0xad, 0x10, 0x0, + 0x0, 0xd, 0x7, 0x10, 0x71, 0xc1, 0x36, 0x66, + 0x66, 0xe6, 0x63, 0x10, 0xc, 0x10, 0x7, 0x30, + 0xd, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x1e, 0x10, + 0xd0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x70, 0xd, + 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0xd, 0x10, 0x0, 0x17, 0xbd, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x4, 0x20, 0x0, + + /* U+5F88 "很" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x59, 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, + 0xc, 0x40, 0xd, 0x66, 0x66, 0xe3, 0x0, 0x5, + 0x70, 0x0, 0xd0, 0x0, 0xd, 0x0, 0x1, 0x80, + 0x51, 0xd, 0x0, 0x0, 0xd0, 0x0, 0x50, 0xe, + 0x30, 0xd6, 0x66, 0x6e, 0x0, 0x0, 0x7, 0x70, + 0xd, 0x0, 0x0, 0xd0, 0x0, 0x1, 0xf0, 0x0, + 0xd6, 0x66, 0x6e, 0x0, 0x0, 0x9e, 0x0, 0xd, + 0x6, 0x0, 0x53, 0x0, 0x62, 0xd0, 0x0, 0xd0, + 0x70, 0x1c, 0x70, 0x22, 0xd, 0x0, 0xd, 0x2, + 0x87, 0x10, 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x9, + 0x20, 0x0, 0x0, 0xd, 0x0, 0xd, 0x0, 0x3c, + 0x40, 0x0, 0x0, 0xd0, 0x0, 0xe9, 0x70, 0x2e, + 0xa4, 0x0, 0xd, 0x0, 0xd, 0x30, 0x0, 0x8, + 0x30, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5F8B "律" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x30, 0x0, 0x1d, 0x10, 0x0, 0x0, + 0x0, 0x69, 0x0, 0x0, 0xd, 0x0, 0x10, 0x0, + 0x0, 0xb0, 0x0, 0x86, 0x6e, 0x66, 0xd4, 0x0, + 0x7, 0x12, 0xc1, 0x0, 0xd, 0x0, 0xc2, 0x10, + 0x1, 0x8, 0x96, 0x76, 0x6e, 0x66, 0xda, 0x90, + 0x0, 0x1e, 0x0, 0x0, 0xd, 0x0, 0xc1, 0x0, + 0x0, 0x9e, 0x0, 0x76, 0x6e, 0x66, 0xd1, 0x0, + 0x4, 0x6e, 0x0, 0x0, 0xd, 0x0, 0x20, 0x0, + 0x15, 0xe, 0x2, 0x76, 0x6e, 0x66, 0xb7, 0x0, + 0x0, 0xe, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x26, 0x66, 0x6e, 0x66, 0x6d, 0x60, + 0x0, 0xe, 0x1, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + + /* U+5F8C "後" */ + 0x0, 0x1, 0xb1, 0x0, 0xb, 0x30, 0x0, 0x0, + 0x0, 0x9, 0x90, 0x0, 0x79, 0x1, 0x50, 0x0, + 0x0, 0x49, 0x0, 0x7, 0x70, 0xc, 0xa0, 0x0, + 0x2, 0x80, 0x52, 0x8e, 0x76, 0xc5, 0x0, 0x0, + 0x15, 0x1, 0xe5, 0x11, 0x3a, 0x22, 0x40, 0x0, + 0x0, 0xa, 0x60, 0x7, 0x70, 0x0, 0x97, 0x0, + 0x0, 0x5f, 0x10, 0xdd, 0xc7, 0x65, 0x4e, 0x0, + 0x2, 0x9d, 0x10, 0x11, 0xe3, 0x0, 0x2, 0x0, + 0x26, 0xc, 0x10, 0x9, 0xa6, 0x66, 0xd1, 0x0, + 0x0, 0xc, 0x10, 0x47, 0x60, 0x8, 0x90, 0x0, + 0x0, 0xc, 0x12, 0x70, 0x44, 0x3c, 0x0, 0x0, + 0x0, 0xc, 0x13, 0x0, 0xa, 0xd2, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x4b, 0xa7, 0x10, 0x0, + 0x0, 0xd, 0x10, 0x49, 0x60, 0x6, 0xdc, 0x80, + 0x0, 0x6, 0x14, 0x20, 0x0, 0x0, 0x4, 0x10, + + /* U+5F92 "å¾’" */ + 0x0, 0x5, 0x80, 0x0, 0x9, 0x50, 0x0, 0x0, + 0x0, 0xc, 0x40, 0x0, 0xa, 0x30, 0x0, 0x0, + 0x0, 0x67, 0x0, 0x0, 0xa, 0x30, 0x36, 0x0, + 0x2, 0x90, 0x61, 0x66, 0x6c, 0x86, 0x65, 0x0, + 0x7, 0x2, 0xf3, 0x0, 0xa, 0x30, 0x0, 0x0, + 0x0, 0x9, 0x60, 0x0, 0xa, 0x30, 0x6, 0x30, + 0x0, 0x3f, 0x16, 0x66, 0x6c, 0x86, 0x66, 0x50, + 0x0, 0xad, 0x10, 0x32, 0xa, 0x50, 0x0, 0x0, + 0x7, 0x1c, 0x10, 0x79, 0xa, 0x30, 0x27, 0x0, + 0x21, 0xc, 0x10, 0x95, 0xa, 0x86, 0x66, 0x10, + 0x0, 0xc, 0x10, 0xc6, 0xa, 0x30, 0x0, 0x0, + 0x0, 0xc, 0x11, 0xa3, 0x6a, 0x30, 0x0, 0x0, + 0x0, 0xc, 0x18, 0x20, 0x3d, 0x83, 0x10, 0x10, + 0x0, 0xd, 0x44, 0x0, 0x0, 0x5a, 0xdf, 0x90, + 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5F93 "従" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xc3, 0x4, 0x0, 0x0, 0x38, 0x0, + 0x0, 0x8, 0xb1, 0x5, 0xb0, 0x0, 0x99, 0x0, + 0x0, 0x3a, 0x0, 0x0, 0xb7, 0x1, 0xa0, 0x0, + 0x1, 0xa0, 0x21, 0x0, 0x25, 0x6, 0x0, 0x0, + 0x6, 0x0, 0xba, 0x36, 0x66, 0x67, 0x6c, 0x80, + 0x0, 0x5, 0xb0, 0x1, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x1e, 0x20, 0x4, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0xae, 0x10, 0x1f, 0x20, 0xe0, 0x2, 0x0, + 0x7, 0x1c, 0x10, 0x1e, 0x0, 0xe6, 0x6a, 0x10, + 0x20, 0xc, 0x10, 0x2c, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x5c, 0x20, 0xe0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0xa1, 0x93, 0xe0, 0x0, 0x0, + 0x0, 0xd, 0x12, 0x70, 0xa, 0xe3, 0x0, 0x0, + 0x0, 0xd, 0x16, 0x0, 0x0, 0x5c, 0xec, 0xa1, + 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, 0x25, 0x20, + + /* U+5F97 "å¾—" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa5, 0x3, 0x0, 0x0, 0x22, 0x0, + 0x0, 0x5, 0xd2, 0xe, 0x66, 0x66, 0xa9, 0x0, + 0x0, 0x3b, 0x0, 0xd, 0x0, 0x0, 0x76, 0x0, + 0x3, 0x80, 0x1a, 0x1d, 0x66, 0x66, 0xa6, 0x0, + 0x4, 0x0, 0x8c, 0x1d, 0x0, 0x0, 0x77, 0x0, + 0x0, 0x3, 0xd1, 0xe, 0x66, 0x66, 0xa7, 0x0, + 0x0, 0x1e, 0x20, 0x4, 0x0, 0x0, 0x25, 0x10, + 0x0, 0xae, 0x10, 0x76, 0x66, 0x67, 0xc6, 0x40, + 0x7, 0x1c, 0x10, 0x0, 0x0, 0x3, 0xa0, 0x50, + 0x10, 0xc, 0x16, 0x77, 0x66, 0x68, 0xc6, 0x71, + 0x0, 0xc, 0x10, 0x8, 0x40, 0x3, 0xa0, 0x0, + 0x0, 0xc, 0x10, 0x1, 0xe0, 0x3, 0xa0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x40, 0x3, 0xa0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x2, 0x9d, 0x80, 0x0, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, + + /* U+5F9E "從" */ + 0x0, 0x0, 0xa1, 0x5, 0x50, 0x1, 0x70, 0x0, + 0x0, 0x7, 0xc1, 0x9, 0x80, 0x3, 0xe1, 0x0, + 0x0, 0x2b, 0x0, 0xc, 0x20, 0x8, 0x60, 0x0, + 0x0, 0x90, 0x11, 0x1c, 0xa5, 0xc, 0x75, 0x0, + 0x5, 0x0, 0x9b, 0x64, 0x1e, 0x46, 0xc, 0x50, + 0x0, 0x3, 0xc1, 0x70, 0x1, 0x60, 0x2, 0x30, + 0x0, 0xd, 0x23, 0x0, 0x1, 0x60, 0x0, 0x0, + 0x0, 0xae, 0x10, 0x6, 0x10, 0xe0, 0x0, 0x0, + 0x7, 0x1d, 0x10, 0xf, 0x10, 0xd0, 0x24, 0x0, + 0x10, 0xd, 0x10, 0xd, 0x0, 0xe6, 0x65, 0x0, + 0x0, 0xd, 0x10, 0x2b, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x69, 0x81, 0xd0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0xa0, 0x1a, 0xe3, 0x0, 0x0, + 0x0, 0xd, 0x16, 0x20, 0x0, 0x4b, 0xec, 0xa2, + 0x0, 0x5, 0x11, 0x0, 0x0, 0x0, 0x14, 0x30, + + /* U+5FA1 "御" */ + 0x0, 0x2, 0xa0, 0xc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x70, 0x3a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x58, 0x0, 0x78, 0x6b, 0x5b, 0x66, 0xd0, + 0x3, 0x70, 0x51, 0x81, 0xa0, 0xd, 0x1, 0xa0, + 0x4, 0x1, 0xe6, 0x41, 0xa0, 0xd, 0x1, 0xa0, + 0x0, 0x9, 0x61, 0x1, 0xa3, 0x4d, 0x1, 0xa0, + 0x0, 0x4e, 0x4, 0x66, 0xc6, 0x5d, 0x1, 0xa0, + 0x1, 0x8d, 0x1, 0x51, 0xa0, 0xd, 0x1, 0xa0, + 0x6, 0xd, 0x1, 0xb1, 0xc8, 0x6d, 0x1, 0xa0, + 0x0, 0xd, 0x1, 0xa1, 0xa0, 0xd, 0x1, 0xa0, + 0x0, 0xd, 0x1, 0xa1, 0xa0, 0xd, 0x1, 0xa0, + 0x0, 0xd, 0x1, 0xa4, 0xc5, 0x3d, 0x2b, 0x70, + 0x0, 0xd, 0xa, 0xd6, 0x0, 0xd, 0x1, 0x0, + 0x0, 0xd, 0x2, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x3, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, + + /* U+5FA9 "復" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xb1, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x90, 0xd, 0x30, 0x0, 0x6, 0x10, + 0x0, 0x49, 0x0, 0x59, 0x66, 0x66, 0x66, 0x40, + 0x3, 0x90, 0x1, 0x77, 0x66, 0x66, 0x6a, 0x10, + 0x16, 0x0, 0xc5, 0xc, 0x10, 0x0, 0xd, 0x0, + 0x0, 0x6, 0xb0, 0xb, 0x66, 0x66, 0x6d, 0x0, + 0x0, 0x1f, 0x10, 0xb, 0x10, 0x0, 0xd, 0x0, + 0x0, 0xae, 0x0, 0xc, 0x9a, 0x66, 0x6c, 0x0, + 0x7, 0x2d, 0x0, 0x0, 0xb2, 0x0, 0x12, 0x0, + 0x10, 0xd, 0x0, 0x7, 0xb6, 0x66, 0xcb, 0x0, + 0x0, 0xd, 0x0, 0x45, 0x16, 0x5, 0xc0, 0x0, + 0x0, 0xd, 0x3, 0x30, 0x5, 0xac, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x8, 0xcb, 0x20, 0x0, + 0x0, 0xd, 0x0, 0x16, 0x72, 0x4, 0xeb, 0x80, + 0x0, 0x4, 0x2, 0x30, 0x0, 0x0, 0x5, 0x20, + + /* U+5FC3 "心" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x60, 0xc, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x30, 0x43, 0x0, 0x0, 0x0, 0x0, 0x20, + 0xe1, 0x0, 0x0, 0x4, 0x0, 0x0, 0x35, 0xe, + 0x10, 0x0, 0x0, 0x58, 0x0, 0x8, 0x50, 0xe1, + 0x0, 0x0, 0x0, 0xd6, 0x2, 0xf3, 0xe, 0x10, + 0x0, 0x2, 0x8, 0xc0, 0xac, 0x0, 0xe1, 0x0, + 0x0, 0x60, 0x37, 0x0, 0x0, 0xe, 0x10, 0x0, + 0x8, 0x0, 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, + 0xc4, 0x0, 0x0, 0x0, 0x9, 0xdb, 0xbb, 0xcf, + 0x70, 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, 0x0, + 0x0, + + /* U+5FC5 "å¿…" */ + 0x0, 0x0, 0x0, 0x40, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x90, 0x0, 0xc6, 0x0, 0x0, + 0x0, 0x3, 0x9, 0x90, 0x1e, 0x0, 0x0, 0x0, + 0x0, 0xf1, 0x1b, 0x7, 0x80, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x4, 0x0, + 0xd0, 0x0, 0x69, 0x5, 0x0, 0x0, 0x71, 0xd, + 0x0, 0xd, 0x10, 0x39, 0x0, 0xc, 0x0, 0xd0, + 0x8, 0x70, 0x0, 0xc5, 0x6, 0xe0, 0xd, 0x3, + 0xc0, 0x0, 0x6, 0xa0, 0x33, 0x0, 0xd1, 0xc2, + 0x0, 0x50, 0x12, 0x0, 0x0, 0xe, 0xb3, 0x0, + 0x6, 0x10, 0x0, 0x0, 0x4, 0xf2, 0x0, 0x0, + 0x97, 0x0, 0x0, 0x58, 0x5b, 0xee, 0xee, 0xee, + 0x60, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5FD8 "忘" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x90, 0x0, 0x3, 0x0, 0x66, + 0x66, 0x66, 0x9a, 0x66, 0x68, 0xe5, 0x1, 0x0, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x10, + 0x0, 0x0, 0x9, 0x10, 0x0, 0x1, 0xc6, 0x67, + 0x66, 0x66, 0x63, 0x0, 0x0, 0x0, 0x0, 0x88, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0x0, 0xd5, + 0x0, 0x40, 0x0, 0x6, 0x14, 0x90, 0x5, 0x20, + 0x13, 0xc2, 0x0, 0xd0, 0x49, 0x0, 0x0, 0x6, + 0x8, 0xb0, 0x9c, 0x4, 0xa0, 0x0, 0x0, 0xc0, + 0x16, 0x0, 0x0, 0x1d, 0xcc, 0xcc, 0xdc, 0x10, + 0x0, + + /* U+5FD9 "å¿™" */ + 0x0, 0xa, 0x10, 0x0, 0x14, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x20, 0x4, 0x70, + 0x1, 0xe, 0xa8, 0x6e, 0x66, 0x66, 0x66, 0x61, + 0x6, 0x2e, 0x4b, 0xe, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x3e, 0x2, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0xe, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xe, 0x0, 0x0, 0x6, 0x10, + 0x0, 0xe, 0x0, 0x2a, 0x66, 0x66, 0x67, 0x50, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5FEB "å¿«" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x2c, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x1c, 0x0, 0x51, 0x0, + 0x0, 0xe, 0x40, 0x66, 0x6d, 0x66, 0xd5, 0x0, + 0x2, 0x2e, 0x6b, 0x0, 0x1c, 0x0, 0xc1, 0x0, + 0x7, 0x4e, 0xc, 0x0, 0x1b, 0x0, 0xc1, 0x0, + 0xe, 0x2e, 0x0, 0x0, 0x2b, 0x0, 0xc1, 0x0, + 0x2, 0xe, 0x5, 0x66, 0x8c, 0x66, 0xdb, 0xc1, + 0x0, 0xe, 0x1, 0x0, 0x77, 0x50, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0xb2, 0x70, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x3, 0xb0, 0x37, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xb, 0x20, 0xb, 0x40, 0x0, + 0x0, 0xe, 0x0, 0x94, 0x0, 0x2, 0xe7, 0x0, + 0x0, 0xf, 0x7, 0x30, 0x0, 0x0, 0x4f, 0xb1, + 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+5FF5 "念" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xd2, 0x9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x3c, 0x38, 0x0, 0xa6, 0x0, 0x0, + 0x0, 0x4, 0xb1, 0x7, 0x90, 0x7, 0xe9, 0x51, + 0x0, 0x76, 0x0, 0x2, 0x50, 0x1, 0x2a, 0x91, + 0x5, 0x10, 0x66, 0x66, 0x66, 0xbc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x42, 0xb, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x2d, 0x34, 0x0, 0x10, 0x0, + 0x0, 0x7, 0xd, 0x8, 0x60, 0x1, 0x48, 0x0, + 0x0, 0x87, 0xd, 0x0, 0x0, 0x7, 0xc, 0x70, + 0x2, 0xc1, 0xe, 0x0, 0x0, 0xc, 0x14, 0x50, + 0x0, 0x0, 0xc, 0xdc, 0xcc, 0xdd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+600E "怎" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xb0, 0x0, 0x0, 0x1, 0x20, 0x0, 0xc, 0x79, + 0x66, 0x66, 0x69, 0xa0, 0x0, 0x75, 0xe, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x70, 0xe, 0x66, 0x66, + 0xc7, 0x0, 0x16, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0xe, 0x0, 0x0, 0xa, 0x10, + 0x0, 0x0, 0xe, 0x66, 0x66, 0x67, 0x30, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x62, 0x47, 0x0, 0x1, 0x0, 0x2, 0x40, 0xe0, + 0xc, 0x40, 0x4, 0x90, 0x9, 0x20, 0xd0, 0x3, + 0x0, 0x50, 0x9a, 0x5e, 0x0, 0xe0, 0x0, 0x0, + 0x91, 0x19, 0x22, 0x0, 0xcc, 0xcc, 0xcc, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6012 "怒" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x1, 0x76, 0x66, 0x8b, 0x0, + 0x6, 0x69, 0xa6, 0xa9, 0x13, 0x0, 0x96, 0x0, + 0x0, 0xa, 0x10, 0xb2, 0x7, 0x2, 0xd0, 0x0, + 0x0, 0x1b, 0x2, 0xb0, 0x2, 0x9c, 0x30, 0x0, + 0x0, 0x4, 0x8e, 0x80, 0x0, 0xbc, 0x0, 0x0, + 0x0, 0x0, 0xa5, 0xb6, 0x1b, 0x45, 0xd5, 0x0, + 0x0, 0x58, 0x10, 0x18, 0x71, 0x0, 0x2c, 0xc1, + 0x4, 0x10, 0x0, 0x34, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9, 0x13, 0xc1, 0x0, 0x50, 0x0, + 0x0, 0x16, 0xe, 0x0, 0xa6, 0x0, 0x6b, 0x10, + 0x0, 0xa5, 0xe, 0x0, 0x10, 0x5, 0xb, 0x70, + 0x2, 0xb0, 0xe, 0x0, 0x0, 0xb, 0x2, 0x10, + 0x0, 0x0, 0xa, 0xdd, 0xdd, 0xdb, 0x10, 0x0, + + /* U+6015 "怕" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x95, 0x0, 0x0, 0x3c, 0x10, 0x0, 0x0, + 0xa, 0x30, 0x0, 0x5, 0x70, 0x0, 0x0, 0x0, + 0xa3, 0x0, 0x0, 0x80, 0x0, 0x20, 0x0, 0xa, + 0x70, 0xd, 0x67, 0x66, 0x6f, 0x10, 0x14, 0xa8, + 0xa0, 0xd0, 0x0, 0x0, 0xe0, 0x5, 0x6a, 0x3a, + 0xd, 0x0, 0x0, 0xe, 0x0, 0xc5, 0xa3, 0x0, + 0xd0, 0x0, 0x0, 0xe0, 0x5, 0xa, 0x30, 0xe, + 0x66, 0x66, 0x6e, 0x0, 0x0, 0xa3, 0x0, 0xd0, + 0x0, 0x0, 0xe0, 0x0, 0xa, 0x30, 0xd, 0x0, + 0x0, 0xe, 0x0, 0x0, 0xa3, 0x0, 0xd0, 0x0, + 0x0, 0xe0, 0x0, 0xa, 0x30, 0xd, 0x0, 0x0, + 0xe, 0x0, 0x0, 0xa3, 0x0, 0xe6, 0x66, 0x66, + 0xe0, 0x0, 0xb, 0x40, 0xd, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x40, 0x0, 0x30, 0x0, 0x0, 0x10, + + /* U+601D "æ€" */ + 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x50, 0x0, + 0x0, 0xd6, 0x66, 0xd7, 0x66, 0x8c, 0x0, 0x0, + 0xc, 0x10, 0xb, 0x20, 0x3, 0xa0, 0x0, 0x0, + 0xc1, 0x0, 0xb2, 0x0, 0x3a, 0x0, 0x0, 0xc, + 0x66, 0x6d, 0x76, 0x68, 0xa0, 0x0, 0x0, 0xc1, + 0x0, 0xb2, 0x0, 0x3a, 0x0, 0x0, 0xd, 0x10, + 0xb, 0x20, 0x3, 0xa0, 0x0, 0x0, 0xd6, 0x66, + 0x86, 0x66, 0x8b, 0x0, 0x0, 0x5, 0x0, 0x47, + 0x0, 0x1, 0x10, 0x0, 0x3, 0x5, 0x80, 0x9a, + 0x0, 0x4, 0x0, 0x0, 0x90, 0x57, 0x0, 0x70, + 0x4, 0x2c, 0x30, 0x3e, 0x5, 0x70, 0x0, 0x0, + 0x80, 0x7c, 0x9, 0x70, 0x58, 0x0, 0x0, 0xd, + 0x30, 0x50, 0x0, 0x2, 0xdd, 0xdd, 0xdd, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+6025 "急" */ + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd9, 0x66, 0x6c, 0x20, 0x0, 0x0, 0x0, + 0x94, 0x0, 0x5, 0xb2, 0x0, 0x0, 0x0, 0x74, + 0x0, 0x1, 0x80, 0x3, 0x20, 0x0, 0x65, 0x76, + 0x66, 0x66, 0x66, 0xb9, 0x0, 0x31, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x50, 0x0, 0x0, 0x57, 0x66, + 0x66, 0x66, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x60, 0x0, 0x4, 0x76, 0x66, 0x66, + 0x66, 0xb6, 0x0, 0x0, 0x0, 0x50, 0x77, 0x0, + 0x4, 0x10, 0x0, 0x5, 0xe, 0x10, 0xb5, 0x3, + 0x49, 0x10, 0x4, 0x70, 0xd0, 0x1, 0x0, 0x60, + 0x7c, 0x2, 0xe2, 0xe, 0x0, 0x0, 0x1c, 0x0, + 0x70, 0x1, 0x0, 0xcd, 0xcc, 0xce, 0xc1, 0x0, + 0x0, + + /* U+6027 "性" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x0, 0xb2, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x4, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xe, 0x40, 0xd0, 0x0, 0x0, + 0x0, 0xe, 0x81, 0x1d, 0x0, 0xd0, 0x3, 0x0, + 0x2, 0x3e, 0x4b, 0x5a, 0x66, 0xe6, 0x6b, 0x50, + 0x7, 0x4e, 0x2, 0xa1, 0x0, 0xd0, 0x0, 0x0, + 0xe, 0x2e, 0x0, 0x80, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xe, 0x4, 0x0, 0x0, 0xd0, 0x5, 0x0, + 0x0, 0xe, 0x0, 0x18, 0x66, 0xe6, 0x78, 0x10, + 0x0, 0xe, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0xd0, 0x4, 0x80, + 0x0, 0xf, 0x5, 0x76, 0x66, 0x66, 0x66, 0x61, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+606F "æ¯" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x9, + 0x69, 0x86, 0x66, 0xb5, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0xf, 0x66, 0x66, + 0x66, 0xd3, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, + 0xb3, 0x0, 0x0, 0xf, 0x66, 0x66, 0x66, 0xd3, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0xf, 0x66, 0x66, 0x66, 0xd3, 0x0, 0x0, + 0xa, 0x0, 0x60, 0x0, 0x71, 0x0, 0x0, 0x0, + 0x60, 0x5d, 0x10, 0x0, 0x0, 0x0, 0x50, 0xe1, + 0xc, 0x10, 0x15, 0x70, 0x7, 0x50, 0xd0, 0x0, + 0x0, 0x70, 0xc7, 0x4f, 0x20, 0xd0, 0x0, 0x1, + 0xb0, 0x57, 0x12, 0x0, 0x9c, 0xcc, 0xcc, 0xa0, + 0x0, + + /* U+60A8 "您" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0x10, 0x78, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x80, 0xe, 0x30, 0x0, 0x1, 0x0, 0x1, + 0xe0, 0x5, 0xb6, 0x66, 0x68, 0xe2, 0x0, 0xae, + 0x1, 0x90, 0x6, 0x10, 0x94, 0x0, 0x65, 0xe0, + 0x60, 0x30, 0xd2, 0x2, 0x0, 0x14, 0xe, 0x0, + 0x4e, 0x2c, 0x16, 0x20, 0x0, 0x0, 0xe0, 0x1a, + 0x10, 0xc1, 0xc, 0x40, 0x0, 0xe, 0x7, 0x5, + 0x5e, 0x0, 0x3b, 0x0, 0x0, 0xd0, 0x0, 0x8, + 0xa0, 0x0, 0x10, 0x0, 0x0, 0x18, 0x19, 0x20, + 0x0, 0x10, 0x0, 0x2, 0x51, 0xd0, 0x3e, 0x0, + 0x26, 0x60, 0x0, 0xa4, 0x1d, 0x0, 0x50, 0x6, + 0xb, 0x70, 0x7e, 0x0, 0xd0, 0x0, 0x0, 0xd1, + 0x28, 0x0, 0x0, 0xb, 0xbb, 0xbb, 0xcb, 0x10, + 0x0, + + /* U+60AA "悪" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x50, 0x7, + 0x66, 0x6d, 0x66, 0xd6, 0x66, 0x60, 0x0, 0x10, + 0xe, 0x0, 0xe0, 0x3, 0x0, 0x0, 0xe6, 0x6e, + 0x66, 0xe6, 0x6f, 0x20, 0x0, 0xe0, 0xe, 0x0, + 0xe0, 0xe, 0x0, 0x0, 0xe6, 0x6e, 0x66, 0xe6, + 0x6e, 0x0, 0x0, 0x60, 0xe, 0x0, 0xe0, 0x5, + 0x10, 0x26, 0x66, 0x6e, 0x66, 0xe6, 0x68, 0xf5, + 0x2, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x90, 0x4c, 0x10, 0x3, 0x10, 0x1, 0x64, + 0xa0, 0x9, 0x60, 0x20, 0xb1, 0x9, 0x54, 0xa0, + 0x0, 0x0, 0x70, 0x6a, 0x7e, 0x13, 0xa0, 0x0, + 0x0, 0xc2, 0x6, 0x1, 0x1, 0xed, 0xdd, 0xdd, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+60B2 "悲" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0xb, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xc1, 0x0, 0x61, 0x1, 0x66, + 0x66, 0xd0, 0xc, 0x66, 0x66, 0x30, 0x0, 0x0, + 0xd, 0x0, 0xc1, 0x2, 0x30, 0x0, 0x36, 0x66, + 0xd0, 0xc, 0x66, 0x66, 0x0, 0x0, 0x0, 0xd, + 0x0, 0xc1, 0x0, 0x10, 0x3, 0x66, 0x66, 0xd0, + 0xc, 0x66, 0x6a, 0x80, 0x0, 0x0, 0xd, 0x0, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x64, 0x15, + 0x0, 0x0, 0x0, 0x0, 0x11, 0xb0, 0x1d, 0x20, + 0x5, 0x30, 0x0, 0x43, 0xd, 0x0, 0x86, 0x1, + 0xc, 0x50, 0xd, 0x20, 0xd0, 0x0, 0x0, 0x60, + 0x39, 0x6, 0xa0, 0xe, 0x0, 0x0, 0xa, 0x40, + 0x0, 0x0, 0x0, 0xdc, 0xcc, 0xcc, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+60C5 "情" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0x20, 0x0, 0xc, 0x30, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xd, 0x10, 0x15, 0x0, + 0x0, 0xe, 0x0, 0x76, 0x6d, 0x66, 0x67, 0x10, + 0x2, 0xe, 0xb4, 0x0, 0xc, 0x10, 0x60, 0x0, + 0x7, 0x2d, 0x37, 0x17, 0x6d, 0x66, 0x63, 0x0, + 0xd, 0x2d, 0x0, 0x0, 0xc, 0x10, 0x5, 0x40, + 0x17, 0xd, 0x6, 0x66, 0x66, 0x66, 0x66, 0x50, + 0x0, 0xd, 0x0, 0x29, 0x66, 0x66, 0xd2, 0x0, + 0x0, 0xd, 0x0, 0x2b, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x1d, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0x1b, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x1d, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0x1b, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xe, 0x0, 0x2b, 0x0, 0x5a, 0xe0, 0x0, + 0x0, 0x5, 0x0, 0x14, 0x0, 0x4, 0x30, 0x0, + + /* U+60F3 "想" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xc6, 0x66, 0x6e, 0x10, + 0x0, 0x0, 0xd0, 0x70, 0xd0, 0x0, 0xd, 0x0, + 0x4, 0x66, 0xf6, 0x62, 0xd6, 0x66, 0x6d, 0x0, + 0x0, 0x6, 0xf6, 0x0, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0xc, 0xe5, 0xd0, 0xd6, 0x66, 0x6d, 0x0, + 0x0, 0x74, 0xd0, 0x90, 0xd0, 0x0, 0xd, 0x0, + 0x3, 0x60, 0xd0, 0x0, 0xd6, 0x66, 0x6d, 0x0, + 0x4, 0x0, 0xd0, 0x0, 0xc0, 0x0, 0xa, 0x0, + 0x0, 0x0, 0x22, 0x9, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xe, 0x20, 0xe4, 0x1, 0x33, 0x0, + 0x0, 0x46, 0xd, 0x0, 0x41, 0x5, 0xb, 0x60, + 0x1, 0xd4, 0xd, 0x0, 0x0, 0xb, 0x3, 0xa0, + 0x1, 0x50, 0xa, 0xcb, 0xbb, 0xbc, 0x10, 0x0, + + /* U+6108 "愈" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8b, 0x63, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x98, 0x0, 0x86, 0x0, 0x0, 0x0, 0x4, + 0x98, 0x66, 0x6b, 0xad, 0x83, 0x10, 0x46, 0x70, + 0x0, 0x40, 0x0, 0x4a, 0xe4, 0x0, 0xc, 0x66, + 0x6b, 0x7, 0xc, 0x20, 0x0, 0x0, 0xc5, 0x56, + 0x90, 0xb0, 0xc0, 0x0, 0x0, 0xc, 0x66, 0x69, + 0xb, 0xc, 0x0, 0x0, 0x0, 0xc0, 0x2, 0x90, + 0x70, 0xc0, 0x0, 0x0, 0xc, 0x2, 0xb6, 0x0, + 0x8d, 0x0, 0x0, 0x0, 0x0, 0x91, 0x6a, 0x0, + 0x10, 0x0, 0x0, 0x14, 0xe, 0x0, 0xa2, 0x3, + 0x48, 0x0, 0xb, 0x40, 0xe0, 0x0, 0x2, 0x80, + 0x97, 0x2, 0x70, 0xc, 0xbb, 0xbb, 0xd9, 0x1, + 0x20, + + /* U+610F "æ„" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0x16, 0x66, 0x6c, 0x76, 0x6e, 0x40, 0x0, 0x0, + 0x0, 0x82, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x80, 0x28, 0x0, 0x7, 0x0, 0x76, 0x66, + 0x66, 0x67, 0x66, 0x67, 0x93, 0x0, 0x7, 0x66, + 0x66, 0x66, 0x6a, 0x0, 0x0, 0x0, 0xb2, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xa, 0x76, 0x66, + 0x66, 0x6d, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0xb, 0x76, 0x76, 0x66, + 0x6c, 0x0, 0x0, 0x1, 0x15, 0x32, 0xb3, 0x0, + 0x3, 0x0, 0x0, 0x80, 0x85, 0x4, 0x90, 0x30, + 0x6a, 0x0, 0x3c, 0x8, 0x40, 0x0, 0x7, 0x0, + 0xb6, 0x9, 0x40, 0x4d, 0xbb, 0xbb, 0xd4, 0x1, + 0x10, + + /* U+611B "æ„›" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x47, 0xbc, 0x0, 0x1, 0x45, + 0x67, 0x97, 0x76, 0xb4, 0x10, 0x0, 0x9, 0x40, + 0x96, 0x6, 0x90, 0x0, 0x6, 0x68, 0xa6, 0x7b, + 0x6a, 0x66, 0xa3, 0x2d, 0x0, 0x30, 0x73, 0x0, + 0x1, 0xa3, 0x76, 0x70, 0xe0, 0x1e, 0x30, 0x46, + 0x40, 0x2, 0xc0, 0xd0, 0x3, 0x0, 0x90, 0xc7, + 0x6, 0x50, 0x9c, 0xcc, 0xcd, 0xa0, 0x26, 0x0, + 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xd6, 0x66, 0x6a, 0x10, 0x0, 0x0, 0x48, 0x35, + 0x0, 0x8c, 0x30, 0x0, 0x3, 0x50, 0x6, 0x89, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x5, 0xde, 0x61, + 0x0, 0x0, 0x0, 0x36, 0x85, 0x1, 0x8e, 0xdb, + 0x91, 0x14, 0x10, 0x0, 0x0, 0x0, 0x25, 0x20, + + /* U+611F "感" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0x66, 0x40, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x7, 0x50, 0xa1, 0x50, + 0x0, 0x3c, 0x66, 0x66, 0x69, 0xa6, 0x67, 0x71, + 0x0, 0x3a, 0x0, 0x0, 0x53, 0x90, 0x6, 0x0, + 0x0, 0x3a, 0x56, 0x66, 0x63, 0xb0, 0x6c, 0x10, + 0x0, 0x48, 0x27, 0x66, 0x91, 0xe2, 0xd1, 0x0, + 0x0, 0x66, 0x3a, 0x0, 0xd0, 0x9e, 0x40, 0x0, + 0x0, 0x92, 0x2a, 0x0, 0xd0, 0x9e, 0x20, 0x50, + 0x0, 0x90, 0x3c, 0x66, 0xb7, 0x54, 0xd4, 0x80, + 0x6, 0x10, 0x0, 0x2, 0x42, 0x0, 0x3d, 0xf1, + 0x2, 0x2, 0x39, 0x5, 0xb1, 0x0, 0x81, 0x32, + 0x0, 0x54, 0x3a, 0x0, 0x93, 0x4, 0x3d, 0x0, + 0x3, 0xe1, 0x2a, 0x0, 0x0, 0x18, 0xa, 0x10, + 0x2, 0x40, 0x1d, 0xbb, 0xbb, 0xda, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+614B "æ…‹" */ + 0x0, 0x3a, 0x0, 0x1, 0x50, 0x0, 0x0, 0x0, + 0x1b, 0x31, 0x20, 0x2b, 0x0, 0x83, 0x0, 0x58, + 0x21, 0x1a, 0x52, 0xb5, 0x75, 0x40, 0x7, 0xa7, + 0x53, 0x39, 0x2a, 0x0, 0x6, 0x30, 0xb, 0x55, + 0x5d, 0x21, 0xba, 0xaa, 0xa3, 0x0, 0xd6, 0x66, + 0xd0, 0x3c, 0x0, 0x52, 0x0, 0xd, 0x0, 0xd, + 0x2, 0xa2, 0x9b, 0x50, 0x0, 0xd6, 0x66, 0xd0, + 0x2b, 0x30, 0x4, 0x0, 0xd, 0x0, 0xd, 0x2, + 0xc1, 0x11, 0x93, 0x0, 0xc0, 0x4b, 0xa2, 0x8, + 0xaa, 0xa8, 0x10, 0x1, 0x8, 0x60, 0x4b, 0x10, + 0x11, 0x60, 0x0, 0x71, 0xa2, 0x0, 0x76, 0x5, + 0x8, 0x90, 0x6d, 0xa, 0x30, 0x0, 0x0, 0xa0, + 0x1d, 0x4, 0x20, 0x6d, 0xcc, 0xcc, 0xdc, 0x10, + 0x0, + + /* U+6163 "æ…£" */ + 0x0, 0xa, 0x10, 0x8, 0x66, 0x66, 0x6a, 0x0, + 0x0, 0xd, 0x0, 0xe, 0x0, 0xd0, 0x1d, 0x0, + 0x0, 0xd, 0x15, 0x6e, 0x67, 0xd6, 0x7d, 0xc2, + 0x0, 0x4d, 0x81, 0x2b, 0x5, 0x80, 0x59, 0x0, + 0x4, 0x5d, 0x75, 0x6b, 0x6a, 0xa6, 0xa7, 0x0, + 0xb, 0x4d, 0x31, 0x12, 0x0, 0x0, 0x42, 0x0, + 0x6, 0xd, 0x0, 0xa6, 0x66, 0x66, 0x6b, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, + 0x0, 0xd, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xd6, 0x66, 0x66, 0x6c, 0x0, + 0x0, 0xd, 0x0, 0x2b, 0x90, 0x4, 0x94, 0x0, + 0x0, 0xe, 0x2, 0x93, 0x0, 0x0, 0x2e, 0x60, + 0x0, 0x3, 0x13, 0x0, 0x0, 0x0, 0x2, 0x30, + + /* U+6167 "æ…§" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x6, + 0x66, 0xd6, 0xa3, 0x6c, 0x76, 0xc4, 0x0, 0x10, + 0xc, 0x1, 0x0, 0xb2, 0x2, 0x0, 0x3, 0x76, + 0xd7, 0x52, 0x7c, 0x76, 0x80, 0x2, 0x66, 0x6d, + 0x6a, 0x36, 0xc7, 0x67, 0x90, 0x2, 0x0, 0xc0, + 0x0, 0x1b, 0x20, 0x0, 0x0, 0x6, 0x76, 0x66, + 0x66, 0x66, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x1, 0x86, 0x66, 0x66, + 0x66, 0xe0, 0x0, 0x0, 0x56, 0x66, 0x66, 0x66, + 0x6e, 0x0, 0x0, 0x1, 0x5, 0x7, 0x20, 0x0, + 0x50, 0x0, 0x0, 0x60, 0xd2, 0x1d, 0x2, 0x34, + 0x80, 0x0, 0x94, 0xd, 0x0, 0x20, 0x38, 0x7, + 0x90, 0x7, 0x0, 0x9c, 0xbb, 0xbd, 0x90, 0x3, + 0x0, + + /* U+616E "æ…®" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe6, 0x69, 0x80, 0x0, + 0x0, 0x14, 0x0, 0x0, 0xd0, 0x0, 0x5, 0x0, + 0x0, 0x1e, 0x66, 0x66, 0xc6, 0x67, 0x6e, 0x60, + 0x0, 0x1c, 0x13, 0x55, 0xd5, 0x77, 0x44, 0x0, + 0x0, 0x1c, 0x4, 0x0, 0xd2, 0x22, 0x39, 0x0, + 0x0, 0x1b, 0x1, 0x0, 0x57, 0x88, 0xb3, 0x0, + 0x0, 0x2b, 0xe, 0x66, 0x99, 0x66, 0xe1, 0x0, + 0x0, 0x2a, 0xd, 0x66, 0x99, 0x66, 0xd0, 0x0, + 0x0, 0x48, 0xd, 0x0, 0x66, 0x0, 0xd0, 0x0, + 0x0, 0x65, 0xe, 0x66, 0x77, 0x66, 0xc0, 0x0, + 0x0, 0x90, 0x13, 0x40, 0x5a, 0x20, 0x17, 0x0, + 0x0, 0x80, 0x90, 0xf1, 0x5, 0x51, 0x5, 0xc0, + 0x6, 0x1c, 0x80, 0xe0, 0x0, 0x6, 0x10, 0x50, + 0x5, 0x2, 0x0, 0xcc, 0xcc, 0xcd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+61C9 "應" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7a, 0x0, 0x0, 0x10, 0x0, + 0x96, 0x66, 0x66, 0xc6, 0x66, 0x6e, 0x80, 0xb, + 0x40, 0x24, 0x36, 0x37, 0x0, 0x0, 0x0, 0xb3, + 0xa, 0xa9, 0x90, 0x81, 0x4, 0x0, 0xb, 0x35, + 0xd1, 0xe6, 0x6c, 0x66, 0x70, 0x0, 0xb6, 0x7c, + 0x6d, 0x66, 0xd6, 0x95, 0x0, 0xc, 0x21, 0xc2, + 0xd0, 0xc, 0x1, 0x0, 0x0, 0xd0, 0x1c, 0xd, + 0x66, 0xd6, 0x95, 0x0, 0xd, 0x1, 0xc0, 0xd0, + 0xc, 0x0, 0x71, 0x0, 0xd0, 0x1c, 0xd, 0x66, + 0x66, 0x66, 0x30, 0x2b, 0x0, 0x30, 0x30, 0x0, + 0x0, 0x0, 0x5, 0x70, 0x26, 0x32, 0xb4, 0x0, + 0x28, 0x0, 0x92, 0x27, 0x75, 0x3, 0xd0, 0x40, + 0x79, 0x8, 0x1d, 0x47, 0x40, 0x0, 0x8, 0x21, + 0x84, 0x21, 0x50, 0x3d, 0xcc, 0xcc, 0xd5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+61F8 "懸" */ + 0x0, 0x66, 0x66, 0xa2, 0x0, 0x25, 0x9b, 0x0, + 0x0, 0x92, 0x0, 0xc0, 0x45, 0x9c, 0x31, 0x0, + 0x0, 0x97, 0x66, 0xd0, 0x16, 0x71, 0x88, 0x0, + 0x0, 0x97, 0x55, 0xd0, 0x3b, 0x8d, 0x81, 0x0, + 0x0, 0x97, 0x66, 0xd0, 0x5, 0x82, 0x8, 0x10, + 0x0, 0x92, 0x0, 0xc4, 0x6f, 0xcd, 0x78, 0xa0, + 0x7, 0xa6, 0xc6, 0x88, 0x55, 0xd, 0x0, 0x30, + 0x0, 0xc4, 0xc3, 0x70, 0x2d, 0x2d, 0x9, 0x30, + 0x7, 0x44, 0xd0, 0x95, 0x91, 0xc, 0x2, 0xe0, + 0x0, 0x5, 0x70, 0x2, 0x3, 0xc9, 0x0, 0x40, + 0x0, 0x10, 0xa4, 0x8, 0x70, 0x0, 0x32, 0x0, + 0x0, 0x80, 0xa2, 0x0, 0xc5, 0x4, 0xb, 0x50, + 0x6, 0xb0, 0xa3, 0x0, 0x10, 0xb, 0x3, 0xb0, + 0x6, 0x20, 0x6d, 0xcc, 0xcc, 0xda, 0x0, 0x0, + + /* U+6210 "æˆ" */ + 0x0, 0x0, 0x0, 0x0, 0xa3, 0x24, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe3, 0xa, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc3, 0x2, 0xb2, 0x0, + 0x0, 0x87, 0x66, 0x66, 0xd8, 0x66, 0x6d, 0x50, + 0x0, 0x96, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, + 0x0, 0x96, 0x0, 0x0, 0x77, 0x0, 0x63, 0x0, + 0x0, 0x95, 0x0, 0x41, 0x4a, 0x0, 0xd7, 0x0, + 0x0, 0x99, 0x66, 0xd6, 0x1d, 0x4, 0xd0, 0x0, + 0x0, 0xa3, 0x0, 0xc1, 0xd, 0x1b, 0x60, 0x0, + 0x0, 0xb2, 0x0, 0xc0, 0x8, 0xad, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0xd0, 0x2, 0xf5, 0x0, 0x40, + 0x1, 0xa0, 0x78, 0xc0, 0x9, 0xbd, 0x10, 0x70, + 0x6, 0x40, 0xb, 0x40, 0x94, 0x8, 0xe6, 0xa0, + 0x8, 0x0, 0x0, 0x17, 0x20, 0x0, 0x5d, 0xc0, + 0x20, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x30, + + /* U+6211 "我" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xa0, 0xd4, 0x0, 0x0, 0x0, + 0x2, 0x57, 0xd9, 0x61, 0xd1, 0x8, 0x60, 0x0, + 0x1, 0x0, 0xb2, 0x0, 0xd1, 0x0, 0xd7, 0x0, + 0x0, 0x0, 0xb2, 0x0, 0xc1, 0x0, 0x35, 0x0, + 0x16, 0x66, 0xd7, 0x66, 0xd7, 0x66, 0x7f, 0x30, + 0x2, 0x0, 0xb2, 0x0, 0xa3, 0x0, 0x10, 0x0, + 0x0, 0x0, 0xb2, 0x0, 0x85, 0x2, 0xe1, 0x0, + 0x0, 0x0, 0xb6, 0x63, 0x66, 0xb, 0x50, 0x0, + 0x1, 0x5a, 0xe5, 0x0, 0x49, 0x78, 0x0, 0x0, + 0x3f, 0x92, 0xb2, 0x0, 0xe, 0xb0, 0x0, 0x0, + 0x1, 0x0, 0xb2, 0x0, 0x5e, 0x70, 0x0, 0x40, + 0x0, 0x0, 0xb2, 0x8, 0x70, 0xc6, 0x0, 0x70, + 0x0, 0x43, 0xd5, 0x61, 0x0, 0x1c, 0xa4, 0x90, + 0x0, 0x1c, 0xc0, 0x0, 0x0, 0x0, 0x6d, 0xd0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + + /* U+6216 "或" */ + 0x0, 0x0, 0x0, 0x0, 0x18, 0x18, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0x1, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x18, 0x20, + 0x6, 0x66, 0x66, 0x66, 0x6f, 0x66, 0x66, 0x40, + 0x0, 0x0, 0x0, 0x10, 0xe, 0x0, 0x10, 0x0, + 0x0, 0xd6, 0x66, 0xe3, 0xd, 0x10, 0x99, 0x0, + 0x0, 0xd1, 0x0, 0xe0, 0xb, 0x30, 0xe3, 0x0, + 0x0, 0xc1, 0x0, 0xe0, 0x9, 0x53, 0xc0, 0x0, + 0x0, 0xd6, 0x66, 0xe0, 0x5, 0x9a, 0x50, 0x0, + 0x0, 0xc0, 0x0, 0x80, 0x0, 0xec, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x42, 0xe9, 0x0, 0x40, + 0x14, 0x68, 0xa9, 0x62, 0x2c, 0x4d, 0x50, 0x70, + 0x1e, 0x94, 0x0, 0x5, 0x91, 0x2, 0xe8, 0xa0, + 0x0, 0x0, 0x2, 0x63, 0x0, 0x0, 0x1a, 0xd0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+6226 "戦" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x14, 0x60, 0x8, 0x10, 0x5b, 0x20, 0x0, 0xc, + 0x2c, 0x41, 0xb0, 0x4, 0xa4, 0x80, 0x0, 0x63, + 0x30, 0x52, 0x0, 0x4a, 0xd, 0x20, 0x1d, 0x66, + 0xa6, 0xe3, 0x4, 0xa0, 0x12, 0x0, 0xc0, 0x1b, + 0xd, 0x2, 0x6c, 0x55, 0x82, 0xd, 0x66, 0xc6, + 0xe3, 0x44, 0xa0, 0x33, 0x0, 0xc0, 0x1b, 0xd, + 0x0, 0x1b, 0xa, 0x90, 0x1c, 0x1, 0xb0, 0xd0, + 0x0, 0xd2, 0xd0, 0x1, 0xd6, 0x6c, 0x6d, 0x0, + 0xd, 0xa4, 0x0, 0x1, 0x1, 0xb0, 0x0, 0x0, + 0xba, 0x0, 0x5, 0x66, 0x6c, 0x67, 0xc1, 0x1d, + 0xb0, 0x4, 0x0, 0x1, 0xb0, 0x0, 0xc, 0x3c, + 0x53, 0x60, 0x0, 0x1b, 0x0, 0x1a, 0x30, 0x2e, + 0xb4, 0x0, 0x1, 0xb0, 0x38, 0x0, 0x0, 0x4f, + 0x60, 0x0, 0x2, 0x1, 0x0, 0x0, 0x0, 0x24, + + /* U+6230 "戰" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x7, 0x69, 0x18, 0x69, 0x20, 0xc5, 0x20, 0x0, + 0xb, 0xc, 0xc, 0xb, 0x0, 0xc2, 0x68, 0x0, + 0xb, 0xc, 0xc, 0xb, 0x0, 0xc2, 0xc, 0x0, + 0xc, 0x6d, 0xd, 0x6c, 0x0, 0xc2, 0x1, 0x0, + 0x5, 0x1, 0x2, 0x5, 0x0, 0xc6, 0x6a, 0x60, + 0x8, 0x86, 0xd6, 0x6d, 0x46, 0xc3, 0x3, 0x0, + 0x7, 0x40, 0xc0, 0x1b, 0x0, 0xa3, 0x2e, 0x30, + 0x7, 0x86, 0xd6, 0x6b, 0x0, 0x85, 0x96, 0x0, + 0x7, 0x40, 0xc0, 0x1b, 0x0, 0x69, 0xd0, 0x0, + 0x8, 0x86, 0xd6, 0x66, 0x0, 0x3f, 0x40, 0x0, + 0x0, 0x0, 0xc0, 0x5, 0x10, 0x6f, 0x20, 0x30, + 0x8, 0x66, 0xd6, 0x66, 0x33, 0xa5, 0xc0, 0x80, + 0x0, 0x0, 0xc0, 0x0, 0x38, 0x0, 0xaa, 0xc0, + 0x0, 0x0, 0xd0, 0x4, 0x40, 0x0, 0xb, 0xd0, + 0x0, 0x0, 0x30, 0x10, 0x0, 0x0, 0x0, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+623B "戻" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x78, 0x66, 0x68, 0x66, 0x6d, 0x30, 0x0, 0x7, + 0x70, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x87, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x8, 0xa6, + 0x66, 0x66, 0x66, 0xe0, 0x0, 0x0, 0xa5, 0x0, + 0x7, 0x20, 0x7, 0x0, 0x0, 0xb, 0x30, 0x0, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0xe3, 0x66, 0x6e, + 0x66, 0x6b, 0x90, 0x0, 0x2a, 0x1, 0x7, 0x76, + 0x0, 0x0, 0x0, 0x8, 0x40, 0x1, 0xd0, 0x27, + 0x0, 0x0, 0x0, 0xb0, 0x0, 0xb3, 0x0, 0x78, + 0x0, 0x0, 0x63, 0x0, 0x93, 0x0, 0x0, 0x9d, + 0x61, 0x6, 0x4, 0x71, 0x0, 0x0, 0x0, 0x6e, + 0x51, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+623F "房" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x0, 0x0, 0xa0, 0x0, 0x32, 0x0, 0x0, + 0xd6, 0x66, 0x66, 0x66, 0x6b, 0x80, 0x0, 0xd, + 0x10, 0x0, 0x0, 0x0, 0x95, 0x0, 0x0, 0xd6, + 0x66, 0x66, 0x66, 0x6b, 0x50, 0x0, 0xd, 0x0, + 0x0, 0x84, 0x0, 0x20, 0x0, 0x0, 0xd0, 0x0, + 0x2, 0xc0, 0x0, 0x20, 0x0, 0xd, 0x26, 0x68, + 0x86, 0x66, 0x6a, 0x50, 0x2, 0xa0, 0x0, 0x87, + 0x0, 0x0, 0x0, 0x0, 0x57, 0x0, 0xb, 0x96, + 0x66, 0xb7, 0x0, 0x9, 0x10, 0x1, 0xe0, 0x0, + 0xb, 0x30, 0x0, 0x90, 0x0, 0x97, 0x0, 0x0, + 0xd1, 0x0, 0x62, 0x0, 0x6a, 0x0, 0x0, 0xe, + 0x0, 0x15, 0x0, 0x77, 0x0, 0x1, 0x7c, 0xa0, + 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x50, 0x0, + + /* U+6240 "所" */ + 0x0, 0x0, 0x2, 0xa2, 0x0, 0x0, 0x4b, 0x40, + 0x0, 0x86, 0x78, 0x52, 0x85, 0x68, 0x75, 0x30, + 0x0, 0xc2, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0xc2, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0xc7, 0x66, 0xb1, 0xb3, 0x0, 0x0, 0x20, + 0x0, 0xc2, 0x0, 0xe0, 0xb8, 0x66, 0xa7, 0xa1, + 0x0, 0xc1, 0x0, 0xe0, 0xc3, 0x0, 0xd0, 0x0, + 0x0, 0xc1, 0x0, 0xe0, 0xd1, 0x0, 0xd0, 0x0, + 0x0, 0xd6, 0x66, 0xe0, 0xe0, 0x0, 0xd0, 0x0, + 0x0, 0xe0, 0x0, 0x23, 0xa0, 0x0, 0xd0, 0x0, + 0x0, 0xc0, 0x0, 0x9, 0x40, 0x0, 0xd0, 0x0, + 0x4, 0x70, 0x0, 0x1b, 0x0, 0x0, 0xd0, 0x0, + 0x8, 0x10, 0x0, 0x82, 0x0, 0x0, 0xd0, 0x0, + 0x16, 0x0, 0x4, 0x40, 0x0, 0x0, 0xe0, 0x0, + 0x20, 0x0, 0x3, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+624B "手" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0x80, 0x0, + 0x0, 0x35, 0x67, 0x8b, 0xba, 0x87, 0x60, 0x0, + 0x0, 0x10, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x10, 0x0, + 0x0, 0x56, 0x66, 0x6e, 0x66, 0x6a, 0xe2, 0x0, + 0x0, 0x11, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x9, 0x30, + 0x27, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x68, 0x60, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x11, 0x1e, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x18, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, + + /* U+624D "æ‰" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x6, 0x60, + 0x5, 0x76, 0x66, 0x66, 0xef, 0x66, 0x66, 0x60, + 0x0, 0x0, 0x0, 0x7, 0xbf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0x1f, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb5, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x70, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x59, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x70, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x65, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x6, 0x10, 0x0, 0x10, 0xf, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x4b, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x81, 0x0, 0x0, 0x0, + + /* U+6253 "打" */ + 0x0, 0x0, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x50, + 0x0, 0x0, 0xe0, 0x4, 0x66, 0x6c, 0x67, 0x81, + 0x5, 0x66, 0xe6, 0xc3, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x61, 0x0, 0x1d, 0x0, 0x0, + 0x1, 0x5a, 0xe2, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0xb, 0x91, 0xe0, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x1, 0x21, 0xe0, 0x0, 0x11, 0x2d, 0x0, 0x0, + 0x0, 0x7f, 0xb0, 0x0, 0x17, 0xfa, 0x0, 0x0, + 0x0, 0x4, 0x10, 0x0, 0x0, 0x40, 0x0, 0x0, + + /* U+6255 "払" */ + 0x0, 0x0, 0x81, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x4, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x7, 0xa0, 0x0, 0x0, + 0x5, 0x66, 0xe6, 0xc2, 0xb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x3a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe5, 0x61, 0x85, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xe2, 0x0, 0xc0, 0x0, 0x0, 0x0, + 0xc, 0xa2, 0xe0, 0x1, 0xa0, 0x0, 0x70, 0x0, + 0x1, 0x0, 0xe0, 0x6, 0x40, 0x0, 0x55, 0x0, + 0x0, 0x0, 0xe0, 0xa, 0x0, 0x0, 0xd, 0x10, + 0x0, 0x0, 0xe0, 0x29, 0x0, 0x0, 0x9, 0x80, + 0x1, 0x11, 0xd0, 0xcb, 0x9a, 0x98, 0x69, 0xd0, + 0x0, 0x7f, 0xa0, 0x68, 0x41, 0x0, 0x4, 0xd0, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+627E "找" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x1b, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x1e, 0x8, 0x80, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x1d, 0x0, 0xb7, 0x0, + 0x5, 0x66, 0xe6, 0xc1, 0x1d, 0x0, 0x15, 0x0, + 0x1, 0x10, 0xe0, 0x13, 0x5e, 0x66, 0x7b, 0x50, + 0x0, 0x0, 0xe0, 0x24, 0x3d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe1, 0x61, 0xe, 0x0, 0x26, 0x0, + 0x0, 0x5, 0xf8, 0x0, 0xd, 0x0, 0xca, 0x0, + 0x8, 0xe9, 0xe0, 0x0, 0xd, 0x18, 0xb0, 0x0, + 0x9, 0x20, 0xe0, 0x0, 0xa, 0xac, 0x10, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x8, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x6a, 0xd2, 0x0, 0x60, + 0x0, 0x0, 0xe0, 0x18, 0x40, 0x3d, 0x20, 0x90, + 0x2, 0x66, 0xd0, 0x40, 0x0, 0x4, 0xea, 0xb0, + 0x0, 0x2d, 0x60, 0x0, 0x0, 0x0, 0x2a, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6280 "技" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xb0, 0x0, 0x0, 0xc3, 0x0, 0x0, + 0x0, 0x3, 0xb0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x6, 0x67, 0xd7, 0xa4, 0x66, 0xe6, 0x6a, 0x90, + 0x0, 0x2, 0xb0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x2, 0xc6, 0x55, 0x66, 0xd6, 0x7b, 0x0, + 0x1, 0x6b, 0xd1, 0x0, 0x60, 0x0, 0x96, 0x0, + 0xb, 0x93, 0xb0, 0x0, 0x52, 0x0, 0xe0, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x8, 0x8, 0x70, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x7, 0x7d, 0x0, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x4, 0xf5, 0x0, 0x0, + 0x1, 0x3, 0xb0, 0x0, 0x89, 0x2c, 0x81, 0x0, + 0x1, 0x8f, 0x90, 0x68, 0x30, 0x0, 0x8f, 0xb2, + 0x0, 0x4, 0x4, 0x0, 0x0, 0x0, 0x1, 0x20, + + /* U+628A "把" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xa0, 0x9, 0x66, 0x66, 0x6b, 0x30, + 0x0, 0x3, 0xa0, 0xd, 0x0, 0xd0, 0xe, 0x0, + 0x6, 0x68, 0xc9, 0x8d, 0x0, 0xd0, 0xe, 0x0, + 0x0, 0x3, 0xa0, 0xd, 0x0, 0xd0, 0xe, 0x0, + 0x0, 0x3, 0xa0, 0xd, 0x0, 0xd0, 0xe, 0x0, + 0x0, 0x3, 0xc7, 0x4d, 0x66, 0xa6, 0x6e, 0x0, + 0x3, 0x8c, 0xc0, 0xd, 0x0, 0x0, 0x4, 0x0, + 0xb, 0x73, 0xa0, 0xd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xa0, 0xd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xa0, 0xd, 0x0, 0x0, 0x0, 0x40, + 0x0, 0x3, 0xa0, 0xd, 0x0, 0x0, 0x0, 0x70, + 0x1, 0x4, 0xa0, 0xd, 0x10, 0x0, 0x0, 0xc0, + 0x2, 0x9f, 0x80, 0x8, 0xdc, 0xcc, 0xcc, 0xd1, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6295 "投" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa4, 0x0, 0x11, 0x0, 0x40, 0x0, 0x0, + 0xb, 0x20, 0x3, 0xc6, 0x6e, 0x20, 0x0, 0x0, + 0xb2, 0x0, 0x3a, 0x0, 0xe0, 0x0, 0x16, 0x6d, + 0x7d, 0x45, 0x80, 0xe, 0x0, 0x0, 0x0, 0xb2, + 0x0, 0xa2, 0x0, 0xd0, 0x0, 0x0, 0xb, 0x20, + 0x39, 0x0, 0x7, 0xaa, 0x80, 0x0, 0xb8, 0x78, + 0x66, 0x66, 0x89, 0x0, 0x5, 0xbe, 0x30, 0x1, + 0x40, 0x8, 0x80, 0x1, 0xb2, 0xb2, 0x0, 0x7, + 0x0, 0xd1, 0x0, 0x0, 0xb, 0x20, 0x0, 0x44, + 0x68, 0x0, 0x0, 0x0, 0xb2, 0x0, 0x0, 0xbc, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x2c, 0xc1, + 0x0, 0x0, 0x42, 0xd2, 0x0, 0x69, 0x13, 0xd8, + 0x20, 0x0, 0x9c, 0x4, 0x73, 0x0, 0x1, 0x9e, + 0x50, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+62BC "押" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, + 0xd, 0x0, 0x2c, 0x66, 0xb6, 0x6f, 0x20, 0x0, + 0xd0, 0x2, 0xc0, 0xd, 0x0, 0xe0, 0x16, 0x5e, + 0x7c, 0x4c, 0x0, 0xd0, 0xe, 0x0, 0x0, 0xd0, + 0x2, 0xd6, 0x6e, 0x66, 0xe0, 0x0, 0xd, 0x0, + 0x2c, 0x0, 0xd0, 0xe, 0x0, 0x0, 0xd6, 0x52, + 0xc0, 0xd, 0x0, 0xe0, 0x1, 0x8f, 0x20, 0x2c, + 0x0, 0xd0, 0xe, 0x4, 0xe5, 0xd0, 0x2, 0xd6, + 0x6e, 0x66, 0xe0, 0x2, 0xd, 0x0, 0x14, 0x0, + 0xd0, 0x1, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0x21, 0xe0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x4, 0xdc, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, + + /* U+62C5 "æ‹…" */ + 0x0, 0x2, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xc0, 0x0, 0x40, 0x0, 0x5, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0xe6, 0x66, 0x6e, 0x10, + 0x4, 0x67, 0xd7, 0xb1, 0xd0, 0x0, 0x1d, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0xd0, 0x0, 0x1d, 0x0, + 0x0, 0x2, 0xb0, 0x10, 0xe6, 0x66, 0x6d, 0x0, + 0x0, 0x2, 0xc7, 0x40, 0xd0, 0x0, 0x1d, 0x0, + 0x0, 0x4b, 0xc0, 0x0, 0xd0, 0x0, 0x1d, 0x0, + 0xb, 0xc4, 0xb0, 0x0, 0xd0, 0x0, 0x1d, 0x0, + 0x2, 0x2, 0xb0, 0x0, 0xe6, 0x66, 0x6e, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0xd0, 0x0, 0x1c, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, 0x3, 0x90, + 0x1, 0x8e, 0x80, 0x76, 0x66, 0x66, 0x66, 0x61, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+62C9 "拉" */ + 0x0, 0x1, 0xa1, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x7, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xf2, 0x0, 0x0, + 0x4, 0x55, 0xe6, 0xa0, 0x0, 0x50, 0x3, 0x0, + 0x1, 0x11, 0xd1, 0x15, 0x76, 0x66, 0x69, 0x50, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x40, 0x0, + 0x0, 0x0, 0xd4, 0x60, 0x50, 0x0, 0xc7, 0x0, + 0x0, 0x6, 0xe3, 0x0, 0x90, 0x0, 0xe1, 0x0, + 0x8, 0xd7, 0xd0, 0x0, 0x77, 0x2, 0xb0, 0x0, + 0x5, 0x20, 0xd0, 0x0, 0x4d, 0x5, 0x60, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x2e, 0x9, 0x10, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x4, 0x9, 0x0, 0x0, + 0x0, 0x12, 0xd0, 0x0, 0x0, 0x16, 0x0, 0x60, + 0x0, 0x7f, 0xa0, 0x76, 0x66, 0x66, 0x67, 0x92, + 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+62DB "æ‹›" */ + 0x0, 0x8, 0x30, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0xa2, 0x5, 0x67, 0x86, 0x66, 0xd5, 0x0, + 0xa, 0x20, 0x0, 0x69, 0x0, 0xd, 0x1, 0x66, + 0xc7, 0xb4, 0x9, 0x50, 0x0, 0xe0, 0x0, 0xa, + 0x20, 0x0, 0xd0, 0x0, 0x1d, 0x0, 0x0, 0xa2, + 0x0, 0x58, 0x3, 0x25, 0xa0, 0x0, 0xa, 0x56, + 0x2a, 0x0, 0xa, 0xf4, 0x0, 0x5, 0xd7, 0x17, + 0x20, 0x0, 0x1, 0x20, 0x3e, 0x8b, 0x21, 0xd, + 0x66, 0x66, 0x7d, 0x0, 0x20, 0xa2, 0x0, 0xd0, + 0x0, 0x2, 0xb0, 0x0, 0xa, 0x20, 0xd, 0x0, + 0x0, 0x2b, 0x0, 0x0, 0xa2, 0x0, 0xd0, 0x0, + 0x2, 0xb0, 0x0, 0xb, 0x20, 0xd, 0x66, 0x66, + 0x7b, 0x0, 0x4c, 0xf0, 0x0, 0xc0, 0x0, 0x2, + 0x90, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+62E1 "æ‹¡" */ + 0x0, 0xb, 0x20, 0x0, 0x7, 0x50, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0xe4, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x24, 0x22, 0x63, 0x25, 0x70, + 0x0, 0xe, 0x6, 0x3c, 0x44, 0x44, 0x44, 0x30, + 0x16, 0x6e, 0x66, 0x4b, 0x0, 0x10, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x3b, 0x0, 0x7b, 0x0, 0x0, + 0x0, 0xe, 0x5, 0x3b, 0x0, 0xb5, 0x0, 0x0, + 0x0, 0x1e, 0x80, 0x3a, 0x0, 0xd0, 0x0, 0x0, + 0x18, 0xdf, 0x0, 0x49, 0x5, 0x70, 0x0, 0x0, + 0x3b, 0x1e, 0x0, 0x58, 0xa, 0x0, 0x20, 0x0, + 0x0, 0xe, 0x0, 0x85, 0x18, 0x0, 0x28, 0x0, + 0x0, 0xe, 0x0, 0xc0, 0x81, 0x0, 0xa, 0x50, + 0x0, 0xe, 0x4, 0x72, 0xeb, 0xa8, 0x68, 0xd0, + 0x6, 0xdd, 0x8, 0x0, 0x51, 0x0, 0x1, 0x70, + 0x0, 0x31, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+62EC "括" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, 0x15, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x25, 0x8a, 0xca, 0x20, + 0x0, 0x2, 0xb0, 0x24, 0x42, 0xe0, 0x0, 0x0, + 0x6, 0x67, 0xd7, 0x90, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x0, 0xe0, 0x0, 0x40, + 0x0, 0x2, 0xb0, 0x67, 0x66, 0xe6, 0x67, 0x92, + 0x0, 0x2, 0xb4, 0x50, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x49, 0xd3, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0xd, 0xb5, 0xb0, 0xb, 0x66, 0xb6, 0x6d, 0x30, + 0x1, 0x2, 0xb0, 0xd, 0x10, 0x0, 0xe, 0x0, + 0x0, 0x2, 0xb0, 0xc, 0x10, 0x0, 0xe, 0x0, + 0x0, 0x2, 0xb0, 0xc, 0x10, 0x0, 0xe, 0x0, + 0x1, 0x35, 0xb0, 0xd, 0x66, 0x66, 0x6e, 0x0, + 0x0, 0x5f, 0x70, 0xd, 0x10, 0x0, 0xb, 0x0, + 0x0, 0x2, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + + /* U+62ED "æ‹­" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x60, 0x0, 0x0, 0xc4, 0x41, 0x0, + 0x0, 0xb, 0x20, 0x0, 0x0, 0xc3, 0x2e, 0x10, + 0x0, 0xb, 0x20, 0x0, 0x0, 0xb3, 0x6, 0x10, + 0x26, 0x6d, 0x7c, 0x35, 0x66, 0xc7, 0x6c, 0x60, + 0x2, 0xb, 0x20, 0x1, 0x0, 0xa3, 0x0, 0x0, + 0x0, 0xb, 0x20, 0x0, 0x0, 0x94, 0x0, 0x0, + 0x0, 0xb, 0x36, 0x30, 0x4, 0x85, 0x0, 0x0, + 0x1, 0x5e, 0x81, 0x46, 0xe6, 0x77, 0x0, 0x0, + 0x4f, 0x8c, 0x20, 0x0, 0xe0, 0x3a, 0x0, 0x0, + 0x2, 0xb, 0x20, 0x0, 0xe0, 0xd, 0x0, 0x0, + 0x0, 0xb, 0x20, 0x0, 0xe0, 0xa, 0x40, 0x20, + 0x0, 0xb, 0x20, 0x3, 0xe7, 0x53, 0xd0, 0x60, + 0x0, 0xc, 0x23, 0xe9, 0x20, 0x0, 0x9b, 0x90, + 0x5, 0xce, 0x0, 0x10, 0x0, 0x0, 0x9, 0xc0, + 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, + + /* U+62FF "æ‹¿" */ + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xc3, 0x62, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xa1, 0x0, 0x98, 0x20, 0x0, 0x0, 0x58, + 0x46, 0x66, 0x69, 0x4a, 0xda, 0x62, 0x52, 0x8, + 0x66, 0x66, 0x6c, 0x21, 0x60, 0x0, 0x0, 0xb2, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xb, 0x76, + 0x66, 0x6e, 0x0, 0x0, 0x0, 0x0, 0x30, 0x1, + 0x35, 0x99, 0x0, 0x0, 0x4, 0x45, 0x66, 0xe7, + 0x55, 0x41, 0x0, 0x0, 0x0, 0x0, 0xd, 0x10, + 0x1a, 0x10, 0x0, 0x5, 0x76, 0x66, 0xe6, 0x66, + 0x63, 0x20, 0x28, 0x66, 0x66, 0x6e, 0x66, 0x66, + 0x9c, 0x20, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xce, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, 0x0, + + /* U+6301 "æŒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0xd0, 0x4, 0x66, 0xd7, 0x6a, 0x70, 0x16, 0x6e, + 0x6d, 0x20, 0xc, 0x20, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0xc2, 0x0, 0x10, 0x0, 0xd, 0x4, + 0x76, 0x6a, 0x66, 0x6a, 0x60, 0x0, 0xd2, 0x61, + 0x0, 0x5, 0x90, 0x0, 0x0, 0x5e, 0x60, 0x0, + 0x0, 0x59, 0x4, 0x1, 0xe8, 0xd0, 0x37, 0x66, + 0x69, 0xb6, 0x84, 0x1, 0xd, 0x0, 0x24, 0x0, + 0x59, 0x0, 0x0, 0x0, 0xd0, 0x0, 0xa7, 0x5, + 0x90, 0x0, 0x0, 0xd, 0x0, 0x2, 0x90, 0x59, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x5, 0x90, + 0x0, 0x4, 0xce, 0x0, 0x0, 0x8, 0xe6, 0x0, + 0x0, 0x2, 0x20, 0x0, 0x0, 0x5, 0x0, 0x0, + + /* U+6307 "指" */ + 0x0, 0x27, 0x0, 0x26, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xc0, 0x3, 0xc0, 0x0, 0x66, 0x0, 0x0, + 0x2b, 0x0, 0x2b, 0x3, 0xba, 0x50, 0x4, 0x67, + 0xd7, 0xb4, 0xc5, 0x40, 0x0, 0x40, 0x11, 0x2b, + 0x0, 0x2b, 0x0, 0x0, 0x8, 0x0, 0x2, 0xb0, + 0x2, 0xe3, 0x22, 0x25, 0xe1, 0x0, 0x2b, 0x54, + 0x6, 0x88, 0x88, 0x84, 0x0, 0x3a, 0xc0, 0x1, + 0x86, 0x66, 0x6a, 0x20, 0xac, 0x4b, 0x0, 0x1d, + 0x0, 0x0, 0xe0, 0x2, 0x2, 0xb0, 0x0, 0xd0, + 0x0, 0xe, 0x0, 0x0, 0x2b, 0x0, 0xe, 0x66, + 0x66, 0xe0, 0x0, 0x2, 0xb0, 0x0, 0xd0, 0x0, + 0xe, 0x0, 0x11, 0x4b, 0x0, 0x1e, 0x66, 0x66, + 0xe0, 0x0, 0x6f, 0x70, 0x1, 0xc0, 0x0, 0xe, + 0x0, 0x0, 0x20, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, + + /* U+6319 "挙" */ + 0x0, 0x2, 0x0, 0x14, 0x0, 0x9, 0x20, 0x0, + 0x0, 0x3, 0xb0, 0xa, 0x60, 0x1e, 0x30, 0x0, + 0x0, 0x0, 0xa8, 0x4, 0xc0, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x23, 0x0, 0x21, 0x60, 0xa, 0x20, + 0x7, 0x66, 0x8c, 0x66, 0x69, 0x66, 0x67, 0x50, + 0x0, 0x0, 0xb3, 0x0, 0x2, 0x91, 0x0, 0x0, + 0x0, 0x8, 0x61, 0x46, 0xbe, 0x8c, 0x60, 0x0, + 0x0, 0x85, 0x34, 0x3d, 0x10, 0x2, 0xcf, 0x70, + 0x36, 0x46, 0x66, 0x6d, 0x66, 0x6c, 0x93, 0x0, + 0x0, 0x1, 0x0, 0xc, 0x0, 0x0, 0x1, 0x0, + 0x5, 0x66, 0x66, 0x6d, 0x66, 0x66, 0x7f, 0x50, + 0x1, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xde, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0x0, 0x0, + + /* U+6355 "æ•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x30, 0x0, 0xc, 0x53, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xc, 0x2, 0xd1, 0x0, + 0x0, 0xd, 0x0, 0x11, 0x1c, 0x11, 0x64, 0x70, + 0x5, 0x6e, 0x7b, 0x55, 0x5d, 0x55, 0x55, 0x50, + 0x0, 0xd, 0x0, 0x0, 0xc, 0x0, 0x1, 0x0, + 0x0, 0xd, 0x0, 0xc6, 0x6d, 0x66, 0x6f, 0x10, + 0x0, 0xd, 0x74, 0xd0, 0xc, 0x0, 0xd, 0x0, + 0x1, 0x8f, 0x10, 0xd6, 0x6d, 0x66, 0x6d, 0x0, + 0x2f, 0x6d, 0x0, 0xd0, 0xc, 0x0, 0xd, 0x0, + 0x1, 0xd, 0x0, 0xd0, 0xc, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xd6, 0x6d, 0x66, 0x6d, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xc, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xc, 0x0, 0xd, 0x0, + 0x5, 0xbd, 0x0, 0xd0, 0xd, 0x15, 0xab, 0x0, + 0x0, 0x21, 0x0, 0x50, 0x4, 0x0, 0x41, 0x0, + + /* U+6368 "æ¨" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x40, 0x0, 0xa, 0x10, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x5d, 0x40, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xc1, 0x72, 0x0, 0x0, + 0x2, 0x2d, 0x39, 0x9, 0x30, 0xb, 0x40, 0x0, + 0x4, 0x4d, 0x44, 0x84, 0x0, 0x6, 0xcb, 0x50, + 0x0, 0xd, 0x15, 0x33, 0x6c, 0x66, 0x38, 0x40, + 0x0, 0xd, 0x14, 0x10, 0xb, 0x10, 0x1, 0x0, + 0x0, 0x1d, 0x92, 0x76, 0x6d, 0x66, 0x7b, 0x10, + 0x1a, 0xce, 0x10, 0x0, 0xb, 0x10, 0x0, 0x0, + 0x7, 0xd, 0x10, 0x12, 0xb, 0x10, 0x41, 0x0, + 0x0, 0xd, 0x10, 0x2c, 0x66, 0x66, 0xd5, 0x0, + 0x0, 0xd, 0x10, 0x2a, 0x0, 0x0, 0xb2, 0x0, + 0x1, 0xd, 0x0, 0x2a, 0x0, 0x0, 0xb2, 0x0, + 0x4, 0xdd, 0x0, 0x2c, 0x66, 0x66, 0xd3, 0x0, + 0x0, 0x21, 0x0, 0x13, 0x0, 0x0, 0x40, 0x0, + + /* U+6388 "授" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x30, 0x0, 0x0, 0x1, 0x67, 0x0, + 0x0, 0xc, 0x10, 0x34, 0x56, 0x89, 0x87, 0x0, + 0x0, 0xc, 0x10, 0x11, 0x5, 0x0, 0x7b, 0x0, + 0x16, 0x6d, 0x7b, 0x1b, 0x17, 0x80, 0xc2, 0x0, + 0x0, 0xc, 0x10, 0x7, 0x53, 0x73, 0x60, 0x0, + 0x0, 0xc, 0x12, 0x86, 0x66, 0x6a, 0x69, 0x60, + 0x0, 0xc, 0x86, 0xa0, 0x0, 0x0, 0xa, 0x30, + 0x1, 0x9f, 0x15, 0x30, 0x0, 0x2, 0x51, 0x0, + 0x3e, 0x4c, 0x10, 0x7, 0x96, 0x6c, 0xb0, 0x0, + 0x2, 0xc, 0x10, 0x0, 0x70, 0x2d, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x29, 0xc2, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x1d, 0xb0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x3, 0xb3, 0x6c, 0x50, 0x0, + 0x5, 0xce, 0x2, 0x86, 0x0, 0x3, 0xbf, 0x90, + 0x0, 0x22, 0x13, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+6392 "排" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x20, 0x0, 0xb4, 0xc, 0x20, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x20, + 0x16, 0x6e, 0x89, 0x66, 0xd0, 0xd, 0x66, 0x90, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x1, 0x0, 0xc0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x72, 0x56, 0xd0, 0xd, 0x67, 0x90, + 0x17, 0xce, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, + 0x2b, 0x1d, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x5, 0x66, 0xd0, 0xd, 0x66, 0xc1, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, + 0x2, 0x1e, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, + 0x3, 0xca, 0x0, 0x0, 0xd0, 0xd, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x20, 0x2, 0x0, 0x0, + + /* U+639B "掛" */ + 0x0, 0x9, 0x10, 0x0, 0x60, 0x0, 0x72, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, 0xd1, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x22, 0x66, 0xd7, 0x90, 0xd0, 0x0, + 0x6, 0x6e, 0x64, 0x0, 0xc0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0x40, 0xd5, 0x0, + 0x0, 0xd, 0x4, 0x66, 0x76, 0x63, 0xd4, 0xc0, + 0x0, 0x1e, 0x60, 0x0, 0xd1, 0x0, 0xd0, 0xa5, + 0x18, 0xcd, 0x0, 0x0, 0xc0, 0x10, 0xd0, 0x11, + 0x8, 0xd, 0x2, 0x66, 0xd6, 0xa1, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x13, 0xd6, 0x52, 0xd0, 0x0, + 0x5, 0xda, 0x8, 0xe8, 0x20, 0x0, 0xd0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+63A1 "採" */ + 0x0, 0x9, 0x20, 0x0, 0x0, 0x2, 0x68, 0x0, + 0x0, 0xd, 0x0, 0x35, 0x68, 0x99, 0x87, 0x10, + 0x0, 0xd, 0x0, 0x10, 0x12, 0x0, 0x5, 0x70, + 0x0, 0xd, 0x16, 0x65, 0xb, 0x40, 0xc, 0x40, + 0x16, 0x6e, 0x66, 0x1e, 0x34, 0xa0, 0x65, 0x0, + 0x0, 0xd, 0x0, 0x6, 0x11, 0x41, 0x50, 0x0, + 0x0, 0xd, 0x4, 0x10, 0x2, 0xc0, 0x1, 0x20, + 0x0, 0xd, 0x82, 0x66, 0x6c, 0xd6, 0x68, 0x80, + 0x18, 0xce, 0x0, 0x0, 0x5d, 0xb6, 0x0, 0x0, + 0x1a, 0xd, 0x0, 0x0, 0xc4, 0xa8, 0x10, 0x0, + 0x0, 0xd, 0x0, 0x8, 0x52, 0xa2, 0xb0, 0x0, + 0x0, 0xd, 0x0, 0x57, 0x2, 0xa0, 0x8a, 0x0, + 0x1, 0xd, 0x3, 0x60, 0x2, 0xa0, 0xb, 0xc3, + 0x5, 0xdd, 0x3, 0x0, 0x2, 0xb0, 0x0, 0x20, + 0x0, 0x21, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, + + /* U+63A2 "探" */ + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x30, 0x5, 0x0, 0x0, 0x0, 0x40, + 0x0, 0xd, 0x0, 0x2a, 0x66, 0x66, 0x68, 0xe1, + 0x0, 0xd, 0x0, 0x96, 0x21, 0x0, 0x7, 0x20, + 0x16, 0x6e, 0x6c, 0x40, 0xb9, 0x7, 0x60, 0x0, + 0x0, 0xd, 0x0, 0x6, 0x90, 0x0, 0x8d, 0x10, + 0x0, 0xd, 0x2, 0x57, 0x2, 0xc0, 0x9, 0x20, + 0x0, 0xd, 0x73, 0x30, 0x1, 0xb0, 0x0, 0x20, + 0x1, 0x8f, 0x12, 0x86, 0x6a, 0xd7, 0x68, 0xa0, + 0x2e, 0x5d, 0x0, 0x0, 0x5d, 0xb6, 0x0, 0x0, + 0x1, 0xd, 0x0, 0x0, 0xc3, 0xb5, 0x40, 0x0, + 0x0, 0xd, 0x0, 0x8, 0x51, 0xb0, 0xb2, 0x0, + 0x0, 0xd, 0x0, 0x67, 0x1, 0xb0, 0x3e, 0x50, + 0x0, 0xd, 0x5, 0x50, 0x1, 0xb0, 0x4, 0xb3, + 0x3, 0xbc, 0x11, 0x0, 0x2, 0xb0, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+63A5 "接" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x20, 0x0, 0x19, 0x10, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x6, 0x70, 0x2, 0x0, + 0x0, 0xd, 0x1, 0x57, 0x66, 0x66, 0x6a, 0x20, + 0x16, 0x6e, 0x6c, 0x22, 0x70, 0xb, 0x50, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xa5, 0x1a, 0x0, 0x0, + 0x0, 0xd, 0x3, 0x66, 0x86, 0x97, 0x6a, 0x80, + 0x0, 0xd, 0x34, 0x0, 0x2c, 0x0, 0x0, 0x0, + 0x0, 0x6e, 0x40, 0x0, 0x87, 0x0, 0x0, 0x0, + 0x4e, 0x6d, 0x16, 0x66, 0xe6, 0x66, 0x78, 0xb0, + 0x1, 0xd, 0x0, 0x6, 0x60, 0xa, 0x50, 0x0, + 0x0, 0xd, 0x0, 0x1c, 0x0, 0x3c, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x3, 0x79, 0xd6, 0x0, 0x0, + 0x1, 0xd, 0x0, 0x0, 0x3c, 0x59, 0xc4, 0x0, + 0x3, 0xcc, 0x0, 0x49, 0x81, 0x0, 0x3e, 0x30, + 0x0, 0x11, 0x25, 0x30, 0x0, 0x0, 0x1, 0x10, + + /* U+63A7 "控" */ + 0x0, 0xa, 0x30, 0x0, 0x5, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x5, 0xd1, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x12, 0x0, 0x80, 0x0, 0x40, + 0x16, 0x6e, 0x89, 0x77, 0x55, 0x55, 0x58, 0xa0, + 0x0, 0xd, 0x10, 0xa1, 0x39, 0x3, 0x5, 0x0, + 0x0, 0xd, 0x10, 0x1, 0xd5, 0x2, 0xb5, 0x0, + 0x0, 0xd, 0x56, 0x1a, 0x20, 0x0, 0x1e, 0x40, + 0x1, 0x7f, 0x51, 0x60, 0x0, 0x0, 0x16, 0x30, + 0x3f, 0x6d, 0x10, 0x26, 0x67, 0x96, 0x98, 0x0, + 0x1, 0xd, 0x10, 0x0, 0x3, 0xa0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x3, 0xa0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x3, 0xa0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x3, 0xa0, 0x2, 0x80, + 0x6, 0xae, 0x4, 0x76, 0x66, 0x66, 0x66, 0x61, + 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+63A8 "推" */ + 0x0, 0xa, 0x30, 0x2, 0xa0, 0x60, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0x69, 0x3, 0xd0, 0x0, 0x0, + 0xc, 0x0, 0xa, 0x40, 0x8, 0x6, 0x11, 0x66, + 0xd6, 0xc3, 0xe6, 0x6d, 0x66, 0x74, 0x0, 0xc, + 0x0, 0x4f, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xc0, + 0x18, 0xd0, 0xd, 0x1, 0x30, 0x0, 0xc, 0x75, + 0x5d, 0x66, 0xe6, 0x67, 0x0, 0x3a, 0xe0, 0x30, + 0xd0, 0xd, 0x0, 0x0, 0x4d, 0x2c, 0x0, 0xd, + 0x0, 0xd0, 0x3, 0x0, 0x10, 0xc0, 0x0, 0xd6, + 0x6e, 0x67, 0xa2, 0x0, 0xc, 0x0, 0xd, 0x0, + 0xd0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0xd0, 0xd, + 0x0, 0x0, 0x1, 0xd, 0x0, 0xd, 0x66, 0xe6, + 0x6d, 0x60, 0x4c, 0xd0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x11, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, + + /* U+63CF "æ" */ + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd4, 0x0, 0xc, 0x40, 0xa5, 0x0, 0x0, + 0xc, 0x10, 0x0, 0xd0, 0xa, 0x20, 0x0, 0x0, + 0xc1, 0x4, 0x4d, 0x44, 0xb5, 0xa4, 0x16, 0x6d, + 0x7c, 0x32, 0xd2, 0x2a, 0x42, 0x10, 0x10, 0xc1, + 0x0, 0xd, 0x0, 0xa2, 0x0, 0x0, 0xc, 0x10, + 0x0, 0x50, 0x3, 0x1, 0x0, 0x0, 0xc2, 0x49, + 0x66, 0x69, 0x66, 0xe2, 0x0, 0x3e, 0x80, 0xa3, + 0x0, 0xd0, 0xd, 0x2, 0xda, 0xd1, 0xa, 0x30, + 0xd, 0x0, 0xd0, 0x4, 0xc, 0x10, 0xa7, 0x66, + 0xe6, 0x6d, 0x0, 0x0, 0xc1, 0xa, 0x30, 0xd, + 0x0, 0xd0, 0x0, 0xc, 0x10, 0xa3, 0x0, 0xd0, + 0xd, 0x0, 0x31, 0xd1, 0xa, 0x76, 0x6e, 0x66, + 0xe0, 0x3, 0xcc, 0x0, 0xa2, 0x0, 0x0, 0xb, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+63D0 "æ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x30, 0x3, 0x0, 0x0, 0x50, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x66, 0x66, 0xe1, 0x0, + 0x0, 0xd, 0x1, 0xd, 0x0, 0x0, 0xd0, 0x0, + 0x6, 0x6e, 0x6b, 0x1d, 0x66, 0x66, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0xd, 0x64, 0x6, 0x0, 0x0, 0x31, 0x10, + 0x2, 0x9f, 0x16, 0x76, 0x66, 0x96, 0x69, 0xa0, + 0x2e, 0x4d, 0x0, 0x43, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x87, 0x0, 0xd0, 0x7, 0x0, + 0x0, 0xd, 0x0, 0xc4, 0x0, 0xe6, 0x66, 0x20, + 0x0, 0xd, 0x2, 0x96, 0x40, 0xd0, 0x0, 0x0, + 0x3, 0x2d, 0x9, 0x0, 0x8b, 0xd2, 0x0, 0x10, + 0x2, 0xb9, 0x52, 0x0, 0x3, 0x9c, 0xef, 0x70, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+63DB "æ›" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x96, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x3, 0xf7, 0x6b, 0x30, 0x0, + 0x0, 0xd, 0x0, 0x1a, 0x10, 0x4b, 0x20, 0x0, + 0x16, 0x6e, 0x86, 0x50, 0x0, 0x80, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xc6, 0x67, 0x66, 0x6e, 0x10, + 0x0, 0xd, 0x3, 0xd0, 0x87, 0x42, 0xd, 0x0, + 0x0, 0xd, 0x71, 0xd0, 0xb0, 0xb, 0x3d, 0x0, + 0x5, 0xbe, 0x0, 0xd6, 0x14, 0x24, 0x9d, 0x0, + 0xb, 0x2d, 0x0, 0xa0, 0x9, 0x70, 0xa, 0x0, + 0x0, 0xd, 0x5, 0x66, 0x6d, 0x76, 0x67, 0xc1, + 0x0, 0xd, 0x1, 0x0, 0x4a, 0x42, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x1, 0xc1, 0x9, 0x20, 0x0, + 0x0, 0xd, 0x0, 0x2b, 0x30, 0x1, 0xd7, 0x30, + 0x5, 0xdb, 0x26, 0x60, 0x0, 0x0, 0x1b, 0xb2, + 0x0, 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+63EE "æ®" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x12, 0x0, 0x0, 0x1, 0x40, + 0x0, 0xd, 0x0, 0x58, 0x66, 0x66, 0x6a, 0xc0, + 0x0, 0xd, 0x0, 0xd2, 0x0, 0xc1, 0x7, 0x0, + 0x0, 0xd, 0x33, 0x12, 0x22, 0xd2, 0x28, 0x10, + 0x16, 0x6e, 0x65, 0x25, 0x44, 0xd4, 0x44, 0x20, + 0x0, 0xd, 0x0, 0x18, 0x66, 0xe6, 0x6a, 0x20, + 0x0, 0xd, 0x4, 0x2b, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0xe, 0x71, 0x1d, 0x66, 0xe6, 0x6e, 0x0, + 0x16, 0xcd, 0x0, 0x1b, 0x0, 0xd0, 0xd, 0x0, + 0x1c, 0x1d, 0x0, 0x2d, 0x66, 0xe6, 0x6d, 0x0, + 0x0, 0xd, 0x0, 0x2, 0x0, 0xd0, 0x2, 0x20, + 0x0, 0xd, 0x1, 0x86, 0x66, 0xe6, 0x68, 0x80, + 0x0, 0xd, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x7, 0xda, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x51, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, + + /* U+63FA "æº" */ + 0x0, 0x9, 0x10, 0x0, 0x0, 0x2, 0x69, 0x0, + 0x0, 0xd, 0x0, 0x35, 0x79, 0xaa, 0x98, 0x20, + 0x0, 0xd, 0x0, 0x20, 0x3, 0x0, 0xb, 0x50, + 0x0, 0xd, 0x23, 0x53, 0x8, 0x50, 0x2c, 0x10, + 0x6, 0x6e, 0x64, 0xd, 0x22, 0xd0, 0x81, 0x0, + 0x0, 0xd, 0x0, 0x6, 0x10, 0x21, 0x22, 0x0, + 0x0, 0xd, 0x15, 0x47, 0x66, 0xa6, 0x7a, 0x10, + 0x0, 0x2e, 0x60, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x2c, 0xbd, 0x4, 0x66, 0x66, 0xe6, 0x69, 0xb0, + 0x7, 0xd, 0x1, 0x10, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xa4, 0x0, 0xd0, 0x9, 0x20, + 0x0, 0xd, 0x0, 0xb0, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0xe, 0x0, 0xb0, 0x0, 0xd0, 0xd, 0x0, + 0x6, 0xec, 0x0, 0xc6, 0x66, 0x86, 0x6e, 0x0, + 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + + /* U+643A "æº" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x19, 0x26, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x7, 0x90, 0xa6, 0x3, 0x0, 0x0, + 0xd0, 0x0, 0xd6, 0x6c, 0x66, 0x93, 0x17, 0x6e, + 0x89, 0x8d, 0x0, 0xc0, 0x6, 0x0, 0x0, 0xd0, + 0x35, 0xd6, 0x6d, 0x66, 0x50, 0x0, 0xd, 0x5, + 0xd, 0x66, 0xd6, 0x6a, 0x0, 0x0, 0xd8, 0x20, + 0xd0, 0xc, 0x0, 0x10, 0x4, 0xbf, 0x0, 0xe, + 0x66, 0xb6, 0x6a, 0x64, 0xe3, 0xd0, 0x0, 0x70, + 0x0, 0x3, 0x0, 0x1, 0xd, 0x0, 0x66, 0xe6, + 0x69, 0xb0, 0x0, 0x0, 0xd0, 0x0, 0x1c, 0x0, + 0xc8, 0x77, 0x0, 0xd, 0x0, 0x9, 0x50, 0x3, + 0x8, 0x60, 0x0, 0xd0, 0x5, 0xa0, 0x0, 0x0, + 0xc1, 0x5, 0xcc, 0x7, 0x60, 0x0, 0x19, 0xc9, + 0x0, 0x2, 0x13, 0x0, 0x0, 0x0, 0x5, 0x0, + + /* U+64C1 "æ“" */ + 0x0, 0x7, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x6, 0x90, 0x0, 0x40, + 0x0, 0xc, 0x3, 0x69, 0x66, 0x66, 0x66, 0x93, + 0x0, 0xc, 0x10, 0x1c, 0x2, 0xc9, 0x40, 0x0, + 0x6, 0x6d, 0x74, 0x72, 0x37, 0x90, 0xa0, 0x20, + 0x0, 0xc, 0x0, 0x62, 0xdd, 0x66, 0xa6, 0xa2, + 0x0, 0xc, 0x27, 0x8b, 0x6e, 0x10, 0xd0, 0x0, + 0x0, 0xe, 0x50, 0x36, 0x3c, 0x66, 0xe6, 0xa1, + 0x2, 0xcc, 0x0, 0x82, 0xbc, 0x10, 0xd0, 0x0, + 0xd, 0x5c, 0x9, 0x9a, 0x7c, 0x10, 0xd0, 0x0, + 0x1, 0xc, 0x3, 0x1b, 0xc, 0x66, 0xe6, 0xa0, + 0x0, 0xc, 0x0, 0x46, 0xc, 0x10, 0xd0, 0x0, + 0x0, 0xc, 0x0, 0x90, 0xc, 0x10, 0xd0, 0x40, + 0x5, 0xda, 0x6, 0x0, 0xc, 0x66, 0x76, 0x74, + 0x0, 0x30, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + + /* U+64C7 "擇" */ + 0x0, 0xa, 0x10, 0x10, 0x0, 0x0, 0x2, 0x0, + 0x0, 0xd, 0x0, 0xa6, 0x6b, 0x6c, 0x6d, 0x20, + 0x0, 0xd, 0x0, 0xa1, 0xb, 0xc, 0xc, 0x0, + 0x0, 0xd, 0x22, 0xa6, 0x6b, 0x6c, 0x6d, 0x0, + 0x6, 0x6e, 0x65, 0x50, 0x1, 0xa0, 0x3, 0x0, + 0x0, 0xd, 0x0, 0x26, 0x66, 0xc6, 0xb5, 0x0, + 0x0, 0xd, 0x22, 0x2, 0x1, 0xa0, 0x0, 0x20, + 0x0, 0xd, 0x61, 0x86, 0x66, 0x96, 0x68, 0x90, + 0x0, 0x9e, 0x0, 0x0, 0xa3, 0x8, 0x60, 0x0, + 0xe, 0x6d, 0x0, 0x0, 0x49, 0x7, 0x24, 0x0, + 0x3, 0xd, 0x0, 0x57, 0x66, 0xc6, 0x65, 0x0, + 0x0, 0xd, 0x5, 0x66, 0x66, 0xc6, 0x69, 0x90, + 0x0, 0xd, 0x1, 0x10, 0x1, 0xa0, 0x0, 0x0, + 0x5, 0xbc, 0x0, 0x0, 0x1, 0xa0, 0x0, 0x0, + 0x0, 0x31, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, + + /* U+64D4 "æ“”" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x30, 0x0, 0x8a, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xe7, 0x67, 0x70, 0x0, + 0x0, 0xd, 0x0, 0x9, 0x40, 0x8, 0x50, 0x0, + 0x0, 0xd, 0x14, 0x3d, 0x66, 0x69, 0x69, 0x90, + 0x6, 0x6e, 0x65, 0x4d, 0xc, 0x40, 0x85, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x62, 0x3a, 0x9, 0x10, + 0x0, 0xd, 0x16, 0xe, 0x66, 0x6a, 0x68, 0xb0, + 0x0, 0xd, 0x80, 0xc, 0x0, 0x0, 0x23, 0x0, + 0x3, 0xbe, 0x0, 0x2a, 0x27, 0x66, 0x65, 0x0, + 0x1e, 0x4d, 0x0, 0x47, 0x17, 0x66, 0x6a, 0x0, + 0x0, 0xd, 0x0, 0x83, 0x30, 0x0, 0x4, 0x0, + 0x0, 0xd, 0x0, 0xb0, 0x79, 0x66, 0x6e, 0x0, + 0x1, 0xd, 0x5, 0x20, 0x75, 0x0, 0xd, 0x0, + 0x3, 0xdc, 0x25, 0x0, 0x79, 0x66, 0x6c, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + + /* U+64DA "據" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x10, 0x0, 0xb, 0x20, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xd, 0x66, 0x97, 0x0, + 0x0, 0xd, 0x0, 0x52, 0x2d, 0x22, 0x23, 0x30, + 0x0, 0xd, 0x23, 0xd4, 0x4b, 0x64, 0x49, 0x70, + 0x16, 0x6e, 0x65, 0xd0, 0x1c, 0x69, 0x43, 0x0, + 0x0, 0xd, 0x0, 0xc4, 0x4c, 0x0, 0x52, 0x0, + 0x0, 0xd, 0x13, 0xc0, 0x5, 0x99, 0x95, 0x0, + 0x0, 0xe, 0x70, 0xc5, 0x67, 0x86, 0x6a, 0x50, + 0x2, 0xbd, 0x0, 0xb0, 0x1d, 0x20, 0x48, 0x0, + 0x1e, 0x3d, 0x1, 0xa2, 0x74, 0xb4, 0x91, 0x0, + 0x0, 0xd, 0x4, 0x71, 0x58, 0x7a, 0x40, 0x0, + 0x0, 0xd, 0x8, 0x36, 0x36, 0xac, 0x73, 0x0, + 0x0, 0xd, 0x8, 0x3, 0x95, 0xc, 0xc, 0x90, + 0x6, 0xcb, 0x41, 0x43, 0x5, 0x8d, 0x0, 0x10, + 0x0, 0x41, 0x10, 0x0, 0x0, 0x42, 0x0, 0x0, + + /* U+652F "支" */ + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x10, 0x0, 0x2a, 0x0, 0x76, + 0x66, 0x66, 0xe6, 0x66, 0x66, 0x63, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd1, 0x4, 0x10, 0x0, 0x0, 0x6, 0x86, + 0x66, 0x66, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x50, + 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x7, 0x10, + 0xd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x8, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xdc, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x2b, 0x80, 0x4d, 0xb5, + 0x10, 0x0, 0x3, 0x88, 0x10, 0x0, 0x6, 0xcf, + 0xf7, 0x15, 0x30, 0x0, 0x0, 0x0, 0x0, 0x13, + 0x0, + + /* U+6539 "改" */ + 0x0, 0x0, 0x0, 0x0, 0x58, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x9, 0x70, 0x0, 0x0, 0x26, + 0x66, 0x6e, 0x30, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd0, 0x4a, 0x0, 0x2, 0x50, 0x0, 0x0, + 0xd, 0xa, 0x86, 0x6a, 0x95, 0x0, 0x0, 0x0, + 0xd1, 0x85, 0x0, 0x94, 0x0, 0x1e, 0x66, 0x6c, + 0x70, 0x70, 0xb, 0x20, 0x0, 0xd0, 0x0, 0x2, + 0x8, 0x0, 0xd0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x63, 0x3a, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x1, + 0xa9, 0x40, 0x0, 0xd, 0x0, 0x3, 0x40, 0x8, + 0xc0, 0x0, 0x0, 0xd0, 0x69, 0x30, 0x1, 0xcc, + 0x40, 0x0, 0x2f, 0xd4, 0x0, 0x3, 0xa1, 0x1d, + 0x60, 0x0, 0x70, 0x0, 0x17, 0x60, 0x0, 0x1c, + 0xc2, 0x0, 0x0, 0x13, 0x0, 0x0, 0x0, 0x2, + 0x0, + + /* U+653E "放" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x20, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0xd4, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x44, 0x2, 0xb, 0x30, 0x1, 0x10, + 0x6, 0x6a, 0x66, 0x6a, 0x2d, 0x66, 0x7b, 0x80, + 0x0, 0xe, 0x0, 0x0, 0x48, 0x0, 0x95, 0x0, + 0x0, 0xe, 0x0, 0x20, 0x86, 0x0, 0xb3, 0x0, + 0x0, 0xe, 0x66, 0xc5, 0x67, 0x0, 0xe0, 0x0, + 0x0, 0x1c, 0x0, 0xb1, 0x6, 0x23, 0xb0, 0x0, + 0x0, 0x2a, 0x0, 0xc0, 0x2, 0x88, 0x50, 0x0, + 0x0, 0x58, 0x0, 0xd0, 0x0, 0xad, 0x0, 0x0, + 0x0, 0x84, 0x0, 0xd0, 0x0, 0xab, 0x0, 0x0, + 0x0, 0xb0, 0x1, 0xd0, 0x7, 0x79, 0x90, 0x0, + 0x4, 0x62, 0x8b, 0x80, 0x76, 0x0, 0xbb, 0x20, + 0x7, 0x0, 0x18, 0x27, 0x20, 0x0, 0x9, 0xb2, + 0x10, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+653F "政" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x13, 0xc, 0x40, 0x0, 0x0, + 0x7, 0x66, 0xa6, 0x89, 0x1e, 0x0, 0x1, 0x0, + 0x0, 0x0, 0xb1, 0x0, 0x4c, 0x66, 0x8a, 0x80, + 0x0, 0x10, 0xb1, 0x0, 0x84, 0x0, 0xb3, 0x0, + 0x0, 0xe1, 0xb1, 0x20, 0xa5, 0x0, 0xd1, 0x0, + 0x0, 0xd0, 0xb6, 0x96, 0x46, 0x0, 0xd0, 0x0, + 0x0, 0xd0, 0xb1, 0x5, 0x7, 0x3, 0xa0, 0x0, + 0x0, 0xd0, 0xb1, 0x0, 0x4, 0x58, 0x60, 0x0, + 0x0, 0xd0, 0xb1, 0x0, 0x0, 0xbd, 0x10, 0x0, + 0x0, 0xd0, 0xb4, 0x65, 0x0, 0xba, 0x0, 0x0, + 0x3, 0xea, 0xb6, 0x0, 0x8, 0x9b, 0x50, 0x0, + 0x1d, 0x72, 0x0, 0x0, 0x95, 0x1, 0xd8, 0x10, + 0x0, 0x0, 0x0, 0x57, 0x10, 0x0, 0x1c, 0xb1, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6545 "æ•…" */ + 0x0, 0x0, 0x81, 0x0, 0x2, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x6, 0xd, 0x11, 0x14, 0x50, + 0x6, 0x66, 0xe6, 0x66, 0x4d, 0x55, 0x9a, 0x40, + 0x0, 0x0, 0xd0, 0x0, 0x77, 0x0, 0x86, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x75, 0x0, 0xa3, 0x0, + 0x0, 0xa6, 0xc6, 0xc5, 0x3, 0x40, 0xd0, 0x0, + 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x81, 0xc0, 0x0, + 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xa7, 0x60, 0x0, + 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x6e, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0xd0, 0x1, 0xbd, 0x30, 0x0, + 0x0, 0xd6, 0x66, 0xe0, 0x2b, 0x42, 0xd5, 0x0, + 0x0, 0x90, 0x0, 0x27, 0x70, 0x0, 0x3d, 0xb1, + 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x1, 0x10, + + /* U+6548 "效" */ + 0x0, 0x14, 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, + 0x0, 0x97, 0x0, 0x0, 0xe4, 0x0, 0x0, 0x0, + 0x3, 0xc0, 0x52, 0x1d, 0x0, 0x0, 0x2, 0x86, + 0x66, 0x66, 0x56, 0x70, 0x2, 0x60, 0x0, 0xa4, + 0x19, 0x20, 0xa6, 0x68, 0xc5, 0x0, 0x2c, 0x0, + 0x3e, 0x1d, 0x0, 0x57, 0x0, 0xa, 0x20, 0x2, + 0x66, 0x52, 0x8, 0x40, 0x6, 0x32, 0x2, 0xe1, + 0x51, 0x60, 0xc0, 0x0, 0x20, 0x36, 0x95, 0x0, + 0x9, 0x1b, 0x0, 0x0, 0x0, 0x5e, 0x0, 0x0, + 0x8a, 0x50, 0x0, 0x0, 0xb, 0x8b, 0x0, 0x4, + 0xe0, 0x0, 0x0, 0x7, 0x60, 0xb6, 0x1, 0xbb, + 0x50, 0x0, 0x4, 0x60, 0x2, 0x52, 0x90, 0x1d, + 0x60, 0x4, 0x50, 0x0, 0x5, 0x60, 0x0, 0x2e, + 0xa1, 0x10, 0x0, 0x4, 0x0, 0x0, 0x0, 0x10, + 0x0, + + /* U+6557 "æ•—" */ + 0x0, 0x0, 0x0, 0x2, 0x0, 0xa2, 0x0, 0x0, + 0x3, 0xc6, 0x66, 0x6f, 0x12, 0xf1, 0x0, 0x0, + 0x2, 0xa0, 0x0, 0xd, 0x5, 0x90, 0x0, 0x20, + 0x2, 0xa0, 0x0, 0xd, 0x9, 0x86, 0x69, 0xc3, + 0x2, 0xc6, 0x66, 0x6d, 0xc, 0x0, 0xd, 0x0, + 0x2, 0xa0, 0x0, 0xd, 0x3a, 0x0, 0x2b, 0x0, + 0x2, 0xc6, 0x66, 0x6d, 0x72, 0x30, 0x58, 0x0, + 0x2, 0xa0, 0x0, 0xd, 0x40, 0x70, 0x94, 0x0, + 0x2, 0xa0, 0x0, 0xd, 0x0, 0x70, 0xd0, 0x0, + 0x3, 0xc6, 0x66, 0x6d, 0x0, 0x3b, 0x80, 0x0, + 0x1, 0x26, 0x25, 0x11, 0x0, 0x1f, 0x30, 0x0, + 0x0, 0x2d, 0x21, 0xd4, 0x0, 0xa5, 0xd1, 0x0, + 0x0, 0xa2, 0x0, 0x37, 0x9, 0x20, 0x5d, 0x30, + 0x7, 0x10, 0x0, 0x2, 0x61, 0x0, 0x5, 0xf5, + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x10, + + /* U+6559 "æ•™" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb2, 0x0, 0x0, 0x88, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x3, 0x20, 0xc4, 0x0, 0x0, + 0x0, 0x66, 0xe8, 0x8c, 0x60, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x78, 0x3, 0xb3, 0x37, 0x80, + 0x5, 0x66, 0xe6, 0xe8, 0xa8, 0x52, 0x6a, 0x20, + 0x0, 0x0, 0xb, 0x20, 0xa, 0x20, 0x67, 0x0, + 0x0, 0x66, 0xb9, 0x7a, 0x34, 0x50, 0x84, 0x0, + 0x0, 0x8, 0x31, 0x93, 0x50, 0x70, 0xb1, 0x0, + 0x1, 0x71, 0x39, 0x0, 0x0, 0x80, 0xc0, 0x0, + 0x3, 0x0, 0x4b, 0x35, 0x30, 0x59, 0x70, 0x0, + 0x4, 0x8a, 0xbb, 0x20, 0x0, 0x1f, 0x0, 0x0, + 0x3, 0x50, 0x49, 0x0, 0x0, 0xaa, 0x70, 0x0, + 0x0, 0x0, 0x49, 0x0, 0x9, 0x30, 0xc7, 0x0, + 0x0, 0x6, 0xb7, 0x4, 0x71, 0x0, 0x1c, 0xb1, + 0x0, 0x0, 0x60, 0x31, 0x0, 0x0, 0x0, 0x0, + + /* U+6562 "æ•¢" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0xc1, 0x0, 0x0, + 0x1, 0x66, 0x6a, 0x90, 0x3, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x20, 0x6, 0x70, 0x0, 0x0, + 0x26, 0x66, 0x6d, 0x6a, 0x8a, 0x76, 0x69, 0x90, + 0x0, 0xd0, 0x0, 0xd0, 0xd, 0x0, 0x94, 0x0, + 0x0, 0xd0, 0x0, 0xd0, 0x4b, 0x0, 0xb2, 0x0, + 0x0, 0xd6, 0x66, 0xd0, 0x83, 0x30, 0xd0, 0x0, + 0x0, 0xd0, 0x0, 0xd1, 0x50, 0x71, 0xc0, 0x0, + 0x0, 0xd6, 0x66, 0xd2, 0x0, 0x95, 0x80, 0x0, + 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x7d, 0x20, 0x0, + 0x0, 0xd1, 0x35, 0xe6, 0x30, 0x4e, 0x0, 0x0, + 0x4c, 0xea, 0x62, 0xd0, 0x0, 0xb8, 0x90, 0x0, + 0x5, 0x0, 0x0, 0xd0, 0x9, 0x10, 0xaa, 0x10, + 0x0, 0x0, 0x0, 0xd1, 0x61, 0x0, 0x9, 0xb1, + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, + + /* U+6570 "æ•°" */ + 0x0, 0x0, 0x1, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x10, 0x1e, 0x3, 0x20, 0xd6, 0x0, 0x0, + 0x0, 0x93, 0xc, 0xb, 0x41, 0xe0, 0x0, 0x0, + 0x0, 0x3b, 0xc, 0x44, 0x5, 0x80, 0x0, 0x0, + 0x3, 0x68, 0x6d, 0x69, 0x9a, 0x86, 0x66, 0xd2, + 0x0, 0x10, 0xcd, 0x40, 0xd, 0x10, 0x4a, 0x0, + 0x0, 0x9, 0x3c, 0x7b, 0x56, 0x30, 0x58, 0x0, + 0x0, 0x82, 0xc, 0x4, 0x60, 0x60, 0x76, 0x0, + 0x4, 0x0, 0x67, 0x0, 0x0, 0x80, 0xa3, 0x0, + 0x3, 0x66, 0xd9, 0x6a, 0x10, 0x90, 0xd0, 0x0, + 0x1, 0x13, 0x90, 0x3b, 0x0, 0x68, 0xa0, 0x0, + 0x0, 0xb, 0x61, 0xb2, 0x0, 0x1f, 0x40, 0x0, + 0x0, 0x0, 0x3e, 0xd8, 0x0, 0x9b, 0xa0, 0x0, + 0x0, 0x3, 0xa4, 0x8, 0x59, 0x50, 0x9c, 0x40, + 0x4, 0x65, 0x0, 0x4, 0x71, 0x0, 0x7, 0xb2, + 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + + /* U+6574 "æ•´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa6, 0x0, 0x2, 0xd0, 0x0, 0x0, + 0x4, 0x66, 0xc8, 0x6a, 0x77, 0x70, 0x1, 0x30, + 0x1, 0x10, 0xa3, 0x1, 0xb, 0x66, 0xaa, 0x70, + 0x0, 0xb6, 0xc8, 0x6d, 0x3a, 0x30, 0xa3, 0x0, + 0x0, 0xc0, 0xa3, 0xc, 0x70, 0x71, 0xd0, 0x0, + 0x0, 0xc6, 0xe8, 0x6b, 0x10, 0x5b, 0x60, 0x0, + 0x0, 0x19, 0xd9, 0x91, 0x0, 0x6e, 0x50, 0x0, + 0x0, 0x84, 0xa3, 0x75, 0x18, 0x50, 0xba, 0x40, + 0x16, 0x10, 0x71, 0x4, 0x40, 0x0, 0x97, 0x70, + 0x0, 0x28, 0x66, 0x69, 0xb6, 0x66, 0x62, 0x0, + 0x0, 0x0, 0x72, 0x5, 0x90, 0x6, 0x20, 0x0, + 0x0, 0x0, 0xd0, 0x5, 0xb6, 0x66, 0x40, 0x0, + 0x0, 0x0, 0xd0, 0x5, 0x90, 0x0, 0x1, 0x0, + 0x4, 0x66, 0xe6, 0x69, 0xb6, 0x66, 0x6e, 0x60, + 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6587 "æ–‡" */ + 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x70, 0x0, 0x6, 0x10, + 0x5, 0x76, 0x67, 0x66, 0x66, 0x97, 0x6a, 0x80, + 0x0, 0x0, 0x6, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x0, 0x2, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x20, 0x8, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x90, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x92, 0x5a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xb4, 0x7c, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x59, 0x20, 0x4, 0xdc, 0x73, 0x10, + 0x0, 0x57, 0x30, 0x0, 0x0, 0x5, 0xcf, 0x70, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+6599 "æ–™" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xd2, 0x0, + 0x1, 0x0, 0xd0, 0x10, 0x0, 0x0, 0xe0, 0x0, + 0x4, 0x60, 0xd0, 0xb4, 0x39, 0x0, 0xe0, 0x0, + 0x0, 0xe1, 0xd1, 0x80, 0x9, 0x70, 0xe0, 0x0, + 0x0, 0x60, 0xd5, 0x0, 0x1, 0x20, 0xe0, 0x0, + 0x3, 0x66, 0xe6, 0xb8, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x6, 0xe0, 0x0, 0x58, 0x0, 0xe0, 0x0, + 0x0, 0xc, 0xe9, 0x40, 0xa, 0x50, 0xe0, 0x0, + 0x0, 0x39, 0xd1, 0xd4, 0x1, 0x10, 0xe0, 0x91, + 0x0, 0xa1, 0xd0, 0x21, 0x1, 0x46, 0xe6, 0x51, + 0x5, 0x30, 0xd0, 0x37, 0x64, 0x10, 0xe0, 0x0, + 0x14, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xf0, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x40, 0x0, + + /* U+65AD "æ–­" */ + 0x3, 0x0, 0x83, 0x0, 0x0, 0x0, 0x45, 0x1, + 0xe0, 0xb, 0x21, 0x3, 0x76, 0x88, 0x60, 0xc, + 0x71, 0xb2, 0x7a, 0x3a, 0x0, 0x0, 0x0, 0xc3, + 0xab, 0x2b, 0x13, 0xa0, 0x0, 0x0, 0xc, 0x5, + 0xb5, 0x20, 0x3a, 0x0, 0x0, 0x0, 0xc6, 0x6d, + 0x77, 0xa4, 0xc6, 0x66, 0xd4, 0xc, 0x3, 0xf4, + 0x0, 0x39, 0x1, 0xc0, 0x0, 0xc0, 0x8e, 0x69, + 0x3, 0x90, 0x1c, 0x0, 0xc, 0x9, 0xb2, 0x97, + 0x48, 0x1, 0xc0, 0x0, 0xc5, 0x2b, 0x21, 0x35, + 0x70, 0x1c, 0x0, 0xc, 0x40, 0xb2, 0x0, 0x93, + 0x1, 0xc0, 0x0, 0xc0, 0x9, 0x32, 0xb, 0x0, + 0x1c, 0x0, 0x4d, 0x66, 0x68, 0x88, 0x30, 0x1, + 0xc0, 0x0, 0x0, 0x0, 0x5, 0x40, 0x0, 0x1c, + 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x10, + 0x0, + + /* U+65B0 "æ–°" */ + 0x0, 0x0, 0x71, 0x0, 0x0, 0x0, 0x5, 0x0, + 0x0, 0x0, 0x49, 0x3, 0x2, 0x56, 0xaa, 0x40, + 0x2, 0x86, 0x67, 0x89, 0x53, 0xa0, 0x0, 0x0, + 0x0, 0x38, 0x0, 0xb5, 0x3, 0xa0, 0x0, 0x0, + 0x0, 0xb, 0x21, 0x80, 0x2, 0xa0, 0x0, 0x0, + 0x5, 0x68, 0x69, 0x67, 0xc4, 0xc6, 0x69, 0xc0, + 0x0, 0x0, 0x2a, 0x0, 0x2, 0xa0, 0xc1, 0x0, + 0x0, 0x0, 0x2a, 0x3, 0x23, 0x90, 0xc1, 0x0, + 0x1, 0x66, 0x7c, 0x68, 0x74, 0x80, 0xc1, 0x0, + 0x0, 0x16, 0x2a, 0x30, 0x6, 0x60, 0xc1, 0x0, + 0x0, 0x7a, 0x2a, 0x68, 0xa, 0x20, 0xc1, 0x0, + 0x0, 0xb0, 0x2a, 0xc, 0x1b, 0x0, 0xc1, 0x0, + 0x6, 0x31, 0x3a, 0x0, 0x81, 0x0, 0xc1, 0x0, + 0x3, 0x5, 0xe7, 0x5, 0x30, 0x0, 0xc1, 0x0, + 0x0, 0x0, 0x10, 0x11, 0x0, 0x0, 0x40, 0x0, + + /* U+65B7 "æ–·" */ + 0x4, 0x13, 0x20, 0x15, 0x0, 0x0, 0x17, 0x20, + 0xb, 0x47, 0x20, 0x65, 0x8, 0x67, 0x86, 0x40, + 0xa, 0x59, 0xb3, 0xa9, 0x5a, 0x30, 0x0, 0x0, + 0xa, 0x35, 0x70, 0x48, 0x9, 0x30, 0x0, 0x0, + 0xa, 0x38, 0x63, 0x97, 0x39, 0x30, 0x0, 0x0, + 0xa, 0x58, 0x57, 0x74, 0x79, 0x86, 0x89, 0x90, + 0xa, 0x76, 0x66, 0x6a, 0x19, 0x30, 0xd0, 0x0, + 0xa, 0x26, 0x60, 0x66, 0x9, 0x30, 0xd0, 0x0, + 0xa, 0x28, 0x72, 0x77, 0x2a, 0x20, 0xd0, 0x0, + 0xa, 0x78, 0xa4, 0x9a, 0xb, 0x10, 0xd0, 0x0, + 0xa, 0x26, 0x50, 0x65, 0xb, 0x0, 0xd0, 0x0, + 0xa, 0x4b, 0x76, 0xc8, 0x5a, 0x0, 0xd0, 0x0, + 0xb, 0x20, 0x2, 0x73, 0x74, 0x0, 0xd0, 0x0, + 0x9, 0x66, 0x66, 0x64, 0x70, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x40, 0x0, + + /* U+65B9 "æ–¹" */ + 0x0, 0x0, 0x0, 0x28, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x70, 0x0, 0x2, 0x60, + 0x7, 0x66, 0x66, 0x7b, 0x66, 0x66, 0x68, 0x81, + 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x8a, 0x66, 0x69, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xb2, 0x0, 0x8, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xc0, 0x0, 0xa, 0x50, 0x0, + 0x0, 0x0, 0x7, 0x60, 0x0, 0xc, 0x20, 0x0, + 0x0, 0x0, 0x1b, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xa3, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x8, 0x30, 0x3, 0x30, 0x7a, 0x0, 0x0, + 0x1, 0x62, 0x0, 0x0, 0x6f, 0xf3, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, + + /* U+65BC "æ–¼" */ + 0x0, 0x5, 0x40, 0x0, 0x0, 0xb3, 0x0, 0x0, + 0x0, 0x0, 0xe1, 0x0, 0x1, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x50, 0x46, 0x5, 0x98, 0x0, 0x0, + 0x6, 0x7e, 0x66, 0x65, 0xa, 0x46, 0x40, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x1c, 0x0, 0xc0, 0x0, + 0x0, 0xe, 0x0, 0x50, 0x74, 0x0, 0x7b, 0x0, + 0x0, 0xe, 0x66, 0xe4, 0x81, 0x0, 0xc, 0xc1, + 0x0, 0xd, 0x0, 0xd6, 0x2, 0xa9, 0x11, 0x30, + 0x0, 0x1b, 0x0, 0xd0, 0x0, 0x9, 0x80, 0x0, + 0x0, 0x49, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x74, 0x1, 0xc0, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xb0, 0x3, 0xa0, 0x18, 0xb7, 0x10, 0x0, + 0x2, 0x63, 0x5a, 0x60, 0x0, 0x2c, 0xe1, 0x0, + 0x7, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x92, 0x0, + 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+65BD "æ–½" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, + 0x0, 0x6, 0xb0, 0x0, 0xe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x80, 0x30, 0x6b, 0x66, 0x69, 0xb0, + 0x5, 0x6a, 0x66, 0x96, 0xb0, 0x30, 0x0, 0x0, + 0x0, 0x1b, 0x0, 0x7, 0x20, 0xd3, 0x0, 0x0, + 0x0, 0x1b, 0x2, 0x22, 0xb1, 0xd0, 0x6, 0x0, + 0x0, 0x1d, 0x6b, 0x60, 0xd0, 0xd6, 0x6e, 0x10, + 0x0, 0x2a, 0x8, 0x42, 0xe7, 0xe0, 0xd, 0x0, + 0x0, 0x39, 0x9, 0x65, 0xd0, 0xd0, 0xd, 0x0, + 0x0, 0x57, 0x9, 0x30, 0xd0, 0xd0, 0xd, 0x0, + 0x0, 0x83, 0xa, 0x20, 0xd0, 0xd2, 0xb8, 0x0, + 0x0, 0xa0, 0xb, 0x10, 0xd0, 0xd0, 0x0, 0x50, + 0x3, 0x55, 0x5e, 0x0, 0xd0, 0x10, 0x0, 0xa0, + 0x6, 0x1, 0xc5, 0x0, 0xad, 0xcc, 0xcd, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+65C1 "æ—" */ + 0x0, 0x0, 0x0, 0x2a, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x50, 0x0, 0x93, 0x0, + 0x0, 0x47, 0x69, 0x66, 0x66, 0xa6, 0x64, 0x0, + 0x0, 0x0, 0x9, 0x70, 0x4, 0xb0, 0x0, 0x0, + 0x0, 0x40, 0x2, 0x80, 0x7, 0x0, 0x4, 0x0, + 0x0, 0xb6, 0x66, 0x68, 0x66, 0x66, 0x6f, 0x40, + 0x7, 0x80, 0x0, 0x8, 0x80, 0x0, 0x52, 0x0, + 0x3, 0x66, 0x66, 0x67, 0xd6, 0x66, 0x6c, 0x90, + 0x0, 0x10, 0x0, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf6, 0x66, 0x6a, 0x60, 0x0, + 0x0, 0x0, 0x5, 0x90, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x0, 0xc, 0x20, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xa4, 0x0, 0x31, 0x4c, 0x0, 0x0, + 0x0, 0x48, 0x20, 0x0, 0x1a, 0xf5, 0x0, 0x0, + 0x4, 0x10, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + + /* U+65C5 "æ—…" */ + 0x0, 0x8, 0x10, 0x0, 0x1b, 0x20, 0x0, 0x0, + 0x0, 0x3, 0xe0, 0x0, 0x5b, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa0, 0x10, 0x93, 0x0, 0x5, 0x10, + 0x6, 0x68, 0x66, 0xa6, 0xb6, 0x66, 0x68, 0x50, + 0x0, 0x2b, 0x0, 0x5, 0x30, 0x0, 0x51, 0x0, + 0x0, 0x2b, 0x0, 0x44, 0x10, 0x5a, 0x94, 0x0, + 0x0, 0x2c, 0x66, 0xd0, 0xd5, 0x60, 0x0, 0x0, + 0x0, 0x39, 0x1, 0xb0, 0xd0, 0x60, 0xa, 0x10, + 0x0, 0x58, 0x2, 0xa0, 0xd0, 0x63, 0x94, 0x0, + 0x0, 0x75, 0x2, 0x90, 0xd0, 0x46, 0x0, 0x0, + 0x0, 0xb1, 0x4, 0x80, 0xd0, 0xb, 0x0, 0x0, + 0x1, 0x90, 0x6, 0x60, 0xd0, 0x7, 0x90, 0x0, + 0x7, 0x14, 0x9d, 0x10, 0xd5, 0x70, 0xbb, 0x30, + 0x14, 0x0, 0x63, 0x0, 0xe7, 0x0, 0x9, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + + /* U+65CF "æ—" */ + 0x0, 0x16, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x60, 0x0, 0xa5, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x40, 0x40, 0xd2, 0x22, 0x28, 0x50, + 0x5, 0x6c, 0x66, 0x76, 0x99, 0x44, 0x44, 0x30, + 0x0, 0xd, 0x0, 0x8, 0x7a, 0x0, 0x2, 0x0, + 0x0, 0xe, 0x6a, 0x51, 0xb6, 0x95, 0x6a, 0x10, + 0x0, 0xc, 0xc, 0x15, 0x40, 0xc0, 0x0, 0x0, + 0x0, 0x1c, 0xc, 0x5, 0x0, 0xc0, 0x0, 0x0, + 0x0, 0x2a, 0xc, 0x46, 0x66, 0xe6, 0x68, 0xd1, + 0x0, 0x58, 0xc, 0x11, 0x1, 0xc5, 0x0, 0x0, + 0x0, 0x83, 0xd, 0x0, 0x6, 0x76, 0x20, 0x0, + 0x0, 0xb0, 0xd, 0x0, 0x1c, 0x1, 0xb0, 0x0, + 0x4, 0x45, 0xc9, 0x1, 0xb2, 0x0, 0x6b, 0x10, + 0x6, 0x0, 0x51, 0x58, 0x10, 0x0, 0x8, 0xe3, + 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, 0x10, + + /* U+65E2 "æ—¢" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, + 0xc6, 0x66, 0xe1, 0x66, 0x6c, 0x67, 0x80, 0xd, + 0x0, 0xd, 0x6, 0x20, 0xd0, 0x0, 0x0, 0xd0, + 0x0, 0xd0, 0xb3, 0x1c, 0x0, 0x0, 0xd, 0x66, + 0x6d, 0xc, 0x2, 0xb0, 0x0, 0x0, 0xd0, 0x0, + 0xd0, 0xc0, 0x49, 0x0, 0x10, 0xd, 0x66, 0x6d, + 0x2d, 0x5a, 0xa5, 0x7a, 0x10, 0xd0, 0x0, 0x80, + 0x0, 0xa8, 0x0, 0x0, 0xd, 0x1, 0x0, 0x0, + 0xd, 0xc2, 0x0, 0x0, 0xd0, 0x9, 0x20, 0x4, + 0x8c, 0x0, 0x0, 0xd, 0x0, 0x6e, 0x10, 0xc1, + 0xc0, 0x3, 0x0, 0xd5, 0x92, 0xb4, 0x76, 0xc, + 0x0, 0x60, 0x1f, 0x90, 0x1, 0x57, 0x0, 0xc0, + 0xa, 0x0, 0x30, 0x0, 0x65, 0x0, 0x8, 0xcb, + 0xe3, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+65E5 "æ—¥" */ + 0x20, 0x0, 0x0, 0x0, 0x30, 0xd6, 0x66, 0x66, + 0x66, 0xd5, 0xd1, 0x0, 0x0, 0x0, 0xb3, 0xc1, + 0x0, 0x0, 0x0, 0xb3, 0xc1, 0x0, 0x0, 0x0, + 0xb3, 0xc1, 0x0, 0x0, 0x0, 0xb3, 0xc6, 0x66, + 0x66, 0x66, 0xc3, 0xc1, 0x0, 0x0, 0x0, 0xb3, + 0xc1, 0x0, 0x0, 0x0, 0xb3, 0xc1, 0x0, 0x0, + 0x0, 0xb3, 0xc1, 0x0, 0x0, 0x0, 0xb3, 0xc1, + 0x0, 0x0, 0x0, 0xb3, 0xd6, 0x66, 0x66, 0x66, + 0xc3, 0xc0, 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+65E9 "æ—©" */ + 0x0, 0x0, 0x30, 0x0, 0x0, 0x4, 0x10, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6c, 0x60, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xa, 0x30, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6c, 0x30, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xa, 0x30, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xa, 0x30, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6c, 0x30, 0x0, + 0x0, 0x1, 0xa0, 0x0, 0xe0, 0x7, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x1, 0x0, + 0x6, 0x76, 0x66, 0x66, 0xe6, 0x66, 0x6c, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + + /* U+65F6 "æ—¶" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0xe0, 0x0, 0xc6, 0x67, 0xe0, + 0x0, 0x0, 0xe0, 0x0, 0xc1, 0x2, 0xc0, 0x0, + 0x0, 0xe0, 0x81, 0xc1, 0x2, 0xc7, 0x66, 0x66, + 0xe6, 0x63, 0xc1, 0x2, 0xc0, 0x0, 0x0, 0xe0, + 0x0, 0xc6, 0x67, 0xc0, 0x82, 0x0, 0xe0, 0x0, + 0xc1, 0x2, 0xc0, 0x2e, 0x10, 0xe0, 0x0, 0xc1, + 0x2, 0xc0, 0xb, 0x30, 0xe0, 0x0, 0xc1, 0x2, + 0xc0, 0x1, 0x0, 0xe0, 0x0, 0xc6, 0x67, 0xc0, + 0x0, 0x0, 0xe0, 0x0, 0xd1, 0x2, 0xb0, 0x0, + 0x0, 0xe0, 0x0, 0x70, 0x0, 0x0, 0x2, 0x34, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + + /* U+6607 "昇" */ + 0x0, 0x8, 0x66, 0x66, 0x66, 0x66, 0xb2, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, + 0xd, 0x10, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0xc6, 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, 0xc, + 0x10, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xc6, + 0x66, 0x76, 0x66, 0x6c, 0x0, 0x0, 0x1, 0x15, + 0xcd, 0x10, 0xa3, 0x0, 0x0, 0x3, 0x66, 0xe1, + 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0xd1, 0x3, 0x0, 0x66, 0x66, 0xe6, 0x66, + 0x6e, 0x66, 0xd7, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0xc1, 0x0, 0x0, 0x0, 0x6, 0x70, 0x0, 0xd, + 0x10, 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0x5, 0x91, 0x0, 0x0, 0xd, 0x10, + 0x0, 0x5, 0x20, 0x0, 0x0, 0x0, 0x40, 0x0, + 0x0, + + /* U+660E "明" */ + 0x0, 0x0, 0x0, 0x74, 0x44, 0x4a, 0x18, 0x66, + 0x6a, 0xc, 0x32, 0x22, 0xd0, 0xd0, 0x1, 0xc0, + 0xc1, 0x0, 0xd, 0xd, 0x0, 0x1b, 0xc, 0x10, + 0x0, 0xd0, 0xd0, 0x1, 0xb0, 0xc7, 0x66, 0x6d, + 0xd, 0x66, 0x6b, 0xc, 0x10, 0x0, 0xd0, 0xd0, + 0x1, 0xb0, 0xc0, 0x0, 0xd, 0xd, 0x0, 0x1b, + 0xd, 0x0, 0x0, 0xd0, 0xd6, 0x66, 0xb0, 0xe5, + 0x55, 0x5d, 0xd, 0x0, 0x1a, 0x1d, 0x0, 0x0, + 0xd0, 0x60, 0x0, 0x6, 0x70, 0x0, 0xd, 0x0, + 0x0, 0x1, 0xc0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x92, 0x0, 0x43, 0x4c, 0x0, 0x2, 0x71, 0x0, + 0x0, 0x5f, 0x70, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x10, 0x0, + + /* U+6613 "易" */ + 0x0, 0x9, 0x66, 0x66, 0x66, 0xc1, 0x0, 0x0, + 0xd, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xc, + 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xc, 0x66, + 0x66, 0x66, 0xe0, 0x0, 0x0, 0xd, 0x10, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0xd, 0x96, 0x66, 0x66, + 0xe0, 0x0, 0x0, 0x2, 0xe4, 0x0, 0x0, 0x10, + 0x0, 0x0, 0xa, 0xb6, 0x86, 0x68, 0x67, 0xd0, + 0x0, 0x68, 0x6, 0xa0, 0x5a, 0x4, 0xa0, 0x5, + 0x50, 0x1d, 0x10, 0xc3, 0x7, 0x70, 0x11, 0x1, + 0xb3, 0x5, 0xa0, 0xa, 0x40, 0x0, 0x58, 0x10, + 0x3c, 0x10, 0xd, 0x10, 0x4, 0x20, 0x5, 0xb1, + 0x20, 0x3c, 0x0, 0x0, 0x3, 0x74, 0x0, 0x2b, + 0xf5, 0x0, 0x0, 0x31, 0x0, 0x0, 0x1, 0x20, + 0x0, + + /* U+6614 "昔" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x70, 0x1, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x60, 0x1, 0xd0, 0x1, 0x0, + 0x0, 0x46, 0x6a, 0xa6, 0x66, 0xe6, 0x8e, 0x20, + 0x0, 0x11, 0x7, 0x60, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x60, 0x0, 0xd0, 0x0, 0x10, + 0x5, 0x66, 0x6a, 0xa6, 0x66, 0xe6, 0x6a, 0xd1, + 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xa6, 0x66, 0x66, 0x6a, 0x70, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x9, 0x50, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x9, 0x40, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6c, 0x40, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x9, 0x40, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x9, 0x40, 0x0, + 0x0, 0x1, 0xe6, 0x66, 0x66, 0x6c, 0x40, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x2, 0x0, 0x0, + + /* U+661F "星" */ + 0x0, 0x9, 0x66, 0x66, 0x66, 0x6b, 0x20, 0x0, + 0x0, 0xb2, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0xb, 0x20, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, + 0xb7, 0x66, 0x66, 0x66, 0xe0, 0x0, 0x0, 0xb, + 0x20, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xb7, + 0x66, 0x66, 0x66, 0xe0, 0x0, 0x0, 0x6, 0x30, + 0xd, 0x30, 0x1, 0x0, 0x0, 0x0, 0xc5, 0x0, + 0xe0, 0x0, 0x85, 0x0, 0x0, 0x3b, 0x66, 0x6e, + 0x66, 0x66, 0x50, 0x0, 0xa, 0x10, 0x0, 0xe0, + 0x0, 0x10, 0x0, 0x6, 0x24, 0x66, 0x6e, 0x66, + 0xac, 0x0, 0x0, 0x10, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x34, 0x1, 0x86, 0x66, 0x66, 0xa6, 0x66, 0x6a, + 0xa1, + + /* U+6620 "映" */ + 0x0, 0x0, 0x0, 0x0, 0x84, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x93, 0x0, 0x0, 0xa6, 0x6d, + 0x41, 0x10, 0x93, 0x3, 0x0, 0xb2, 0xd, 0x2, + 0xc6, 0xc8, 0x6d, 0x30, 0xa2, 0xd, 0x2, 0xa0, + 0x93, 0xc, 0x0, 0xa2, 0xd, 0x2, 0xa0, 0xa2, + 0xc, 0x0, 0xa7, 0x6e, 0x2, 0xa0, 0xb1, 0xc, + 0x0, 0xa2, 0xd, 0x2, 0xa0, 0xc0, 0xc, 0x63, + 0xa2, 0xd, 0x36, 0x66, 0xd8, 0x66, 0x64, 0xa2, + 0xd, 0x0, 0x3, 0xa5, 0x0, 0x0, 0xa7, 0x6e, + 0x0, 0xa, 0x32, 0x60, 0x0, 0xb2, 0xa, 0x0, + 0x49, 0x0, 0x92, 0x0, 0x71, 0x0, 0x5, 0x90, + 0x0, 0x1d, 0x50, 0x0, 0x2, 0x75, 0x0, 0x0, + 0x3, 0xe7, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, + 0x10, + + /* U+6625 "春" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5b, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7b, 0x0, 0x0, 0x55, 0x0, + 0x3, 0x66, 0x66, 0xc9, 0x66, 0x66, 0x65, 0x0, + 0x0, 0x0, 0x0, 0xd1, 0x0, 0x8, 0x10, 0x0, + 0x0, 0x56, 0x69, 0xc6, 0x66, 0x66, 0x30, 0x0, + 0x26, 0x66, 0x6d, 0x86, 0x66, 0x66, 0x6d, 0x60, + 0x0, 0x0, 0x96, 0x0, 0x0, 0x70, 0x0, 0x0, + 0x0, 0x7, 0x90, 0x0, 0x0, 0x48, 0x0, 0x0, + 0x0, 0x85, 0xb7, 0x66, 0x66, 0xf7, 0xb4, 0x0, + 0x36, 0x10, 0xb3, 0x0, 0x0, 0xe0, 0x2c, 0xa1, + 0x0, 0x0, 0xa8, 0x66, 0x66, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xa3, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xa3, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xb8, 0x66, 0x66, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x40, 0x0, 0x0, + + /* U+6628 "昨" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x97, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x20, 0xd, 0x30, 0x0, 0x0, 0xc, 0x66, + 0x7d, 0x2, 0xc0, 0x0, 0x4, 0x0, 0xb1, 0x2, + 0xb0, 0x88, 0xa6, 0x66, 0xa7, 0xb, 0x10, 0x2b, + 0xa, 0xe, 0x0, 0x0, 0x0, 0xb1, 0x2, 0xb5, + 0x20, 0xe0, 0x0, 0x0, 0xb, 0x66, 0x7b, 0x40, + 0xe, 0x66, 0x9a, 0x0, 0xb1, 0x2, 0xb0, 0x0, + 0xe0, 0x0, 0x0, 0xb, 0x10, 0x2b, 0x0, 0xe, + 0x0, 0x0, 0x0, 0xb1, 0x2, 0xb0, 0x0, 0xe4, + 0x45, 0xd3, 0xb, 0x10, 0x2b, 0x0, 0xe, 0x11, + 0x11, 0x10, 0xb6, 0x67, 0xb0, 0x0, 0xe0, 0x0, + 0x0, 0xb, 0x10, 0x13, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, + + /* U+662F "是" */ + 0x0, 0x0, 0x96, 0x66, 0x66, 0xa5, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xb, 0x30, 0x0, 0x0, + 0x0, 0xc1, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, + 0xc, 0x66, 0x66, 0x6c, 0x30, 0x0, 0x0, 0x0, + 0xc1, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0xd, + 0x66, 0x66, 0x6c, 0x30, 0x0, 0x0, 0x0, 0x40, + 0x0, 0x0, 0x20, 0x35, 0x0, 0x76, 0x66, 0x66, + 0xb6, 0x66, 0x68, 0x81, 0x0, 0x1, 0xd2, 0xc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x4c, 0x0, 0xc7, + 0x66, 0x9c, 0x10, 0x0, 0xa, 0x90, 0xc, 0x20, + 0x0, 0x0, 0x0, 0x2, 0xb0, 0x82, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0xb1, 0x0, 0x9e, 0x73, 0x21, + 0x12, 0x20, 0x82, 0x0, 0x0, 0x17, 0xbd, 0xff, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+663C "昼" */ + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x50, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x66, 0xd1, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xc0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x86, 0xc0, 0x0, + 0x0, 0x3, 0x90, 0x0, 0x0, 0x71, 0x0, 0x0, + 0x0, 0x7, 0x50, 0x0, 0x0, 0xa, 0x10, 0x0, + 0x0, 0xc, 0xa6, 0x66, 0x66, 0x6e, 0xc5, 0x0, + 0x0, 0x65, 0xa1, 0x0, 0x0, 0x1b, 0x1c, 0xd4, + 0x1, 0x80, 0xa7, 0x66, 0x66, 0x6b, 0x0, 0x40, + 0x5, 0x0, 0xa1, 0x0, 0x0, 0x1b, 0x0, 0x0, + 0x0, 0x0, 0xa1, 0x0, 0x0, 0x1b, 0x0, 0x0, + 0x0, 0x0, 0xb6, 0x66, 0x66, 0x6a, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x20, + 0x0, 0x76, 0x66, 0x66, 0x66, 0x66, 0x67, 0x50, + + /* U+6642 "時" */ + 0x0, 0x0, 0x0, 0x0, 0x82, 0x0, 0x0, 0x52, + 0x26, 0x10, 0x0, 0xc0, 0x0, 0x0, 0xd4, 0x4c, + 0x40, 0x0, 0xc0, 0x6, 0x0, 0xd0, 0xb, 0x14, + 0x66, 0xd6, 0x66, 0x20, 0xd0, 0xb, 0x10, 0x0, + 0xc0, 0x0, 0x0, 0xd0, 0xb, 0x44, 0x44, 0xd5, + 0x45, 0xc2, 0xd6, 0x6d, 0x21, 0x11, 0x11, 0x83, + 0x10, 0xd0, 0xb, 0x10, 0x0, 0x0, 0xb2, 0x50, + 0xd0, 0xb, 0x67, 0x66, 0x66, 0xd6, 0x74, 0xd0, + 0xb, 0x10, 0x57, 0x0, 0xb1, 0x0, 0xd6, 0x6d, + 0x10, 0xa, 0x50, 0xb1, 0x0, 0xd0, 0xb, 0x10, + 0x1, 0x20, 0xb1, 0x0, 0x60, 0x1, 0x0, 0x0, + 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7c, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, + 0x0, + + /* U+6669 "晩" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x0, 0x30, + 0x4, 0x0, 0x1e, 0x20, 0x11, 0x0, 0xd, 0x66, + 0xe4, 0xa, 0x96, 0x6b, 0xa0, 0x0, 0xd0, 0xd, + 0x4, 0xa0, 0x1, 0x90, 0x0, 0xd, 0x0, 0xd1, + 0xb9, 0x66, 0xa6, 0x6b, 0x10, 0xd0, 0xd, 0x52, + 0xa0, 0xd, 0x0, 0xd0, 0xd, 0x66, 0xe0, 0x2a, + 0x0, 0xd0, 0xd, 0x0, 0xd0, 0xd, 0x2, 0xc6, + 0x6e, 0x66, 0xd0, 0xd, 0x0, 0xd0, 0x27, 0xf, + 0x49, 0x4, 0x0, 0xd0, 0xd, 0x0, 0x1, 0xf3, + 0x90, 0x0, 0xd, 0x66, 0xe0, 0x0, 0x6a, 0x39, + 0x0, 0x10, 0xd0, 0xa, 0x0, 0xd, 0x33, 0x90, + 0x5, 0x4, 0x0, 0x0, 0xb, 0x60, 0x29, 0x0, + 0x90, 0x0, 0x0, 0x48, 0x20, 0x1, 0xdb, 0xbd, + 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+666E "æ™®" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x30, 0x0, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xf1, 0x7, 0x50, 0x2, 0x0, + 0x0, 0x66, 0x66, 0xd6, 0x6b, 0x66, 0x8d, 0x30, + 0x0, 0x3, 0x0, 0xe0, 0xe, 0x0, 0x70, 0x0, + 0x0, 0x6, 0x70, 0xe0, 0xe, 0x5, 0xb1, 0x0, + 0x0, 0x0, 0xf0, 0xe0, 0xe, 0xa, 0x10, 0x0, + 0x0, 0x0, 0x30, 0xe0, 0xe, 0x22, 0x7, 0x70, + 0x17, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, + 0x0, 0x0, 0xa6, 0x66, 0x66, 0x6c, 0x20, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6f, 0x0, 0x0, + 0x0, 0x0, 0x50, 0x0, 0x0, 0x4, 0x0, 0x0, + + /* U+666F "景" */ + 0x0, 0x0, 0x96, 0x66, 0x66, 0x69, 0x60, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x8, 0x60, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6b, 0x60, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x8, 0x60, 0x0, + 0x0, 0x1, 0xd6, 0x69, 0x96, 0x6a, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc2, 0x0, 0x7, 0x50, + 0x6, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, + 0x0, 0x0, 0xb6, 0x66, 0x66, 0x6d, 0x30, 0x0, + 0x0, 0x0, 0xc2, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xc7, 0x66, 0x86, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0x34, 0x0, 0xe0, 0x12, 0x0, 0x0, + 0x0, 0x0, 0x9c, 0x20, 0xe0, 0x39, 0x30, 0x0, + 0x0, 0x2a, 0x50, 0x0, 0xe0, 0x0, 0xbb, 0x0, + 0x5, 0x50, 0x0, 0x6b, 0xc0, 0x0, 0xa, 0x50, + 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, 0x0, + + /* U+6674 "æ™´" */ + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x86, 0x6a, + 0x36, 0x66, 0xc7, 0x68, 0xb0, 0xc0, 0xd, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x56, + 0xc7, 0x6c, 0x50, 0xc0, 0xd, 0x0, 0x0, 0xb3, + 0x0, 0x0, 0xc1, 0x1d, 0x36, 0x66, 0xc7, 0x66, + 0xc6, 0xc5, 0x5d, 0x0, 0x10, 0x0, 0x2, 0x0, + 0xc0, 0xd, 0x0, 0xd6, 0x66, 0x6e, 0x20, 0xc0, + 0xd, 0x0, 0xe6, 0x66, 0x6e, 0x0, 0xc0, 0xd, + 0x0, 0xd0, 0x0, 0xd, 0x0, 0xc6, 0x6e, 0x0, + 0xd6, 0x66, 0x6e, 0x0, 0xd0, 0xa, 0x0, 0xd0, + 0x0, 0xd, 0x0, 0x20, 0x0, 0x0, 0xd0, 0x0, + 0xd, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x5, 0xae, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x32, 0x0, + + /* U+667A "智" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0x66, 0x8b, 0x8, 0x66, 0x6b, 0x10, 0x9, + 0x12, 0xa0, 0x0, 0xd0, 0x0, 0xd0, 0x2, 0x30, + 0x48, 0x3, 0xd, 0x0, 0xd, 0x0, 0x76, 0x69, + 0xa6, 0xa4, 0xd0, 0x0, 0xd0, 0x0, 0x0, 0xb8, + 0x30, 0xd, 0x0, 0xd, 0x0, 0x0, 0x4a, 0x9, + 0xb0, 0xd6, 0x66, 0xd0, 0x0, 0x3a, 0x10, 0xa, + 0x15, 0x0, 0x3, 0x0, 0x55, 0xc, 0x66, 0x66, + 0x66, 0xd4, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x0, 0xc, 0x66, 0x66, 0x66, + 0xe0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6e, 0x0, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x30, 0x0, + + /* U+6687 "暇" */ + 0x0, 0x0, 0x21, 0x14, 0x12, 0x22, 0x60, 0x8, + 0x66, 0xa5, 0x95, 0xc3, 0x44, 0x4d, 0x10, 0xc0, + 0xc, 0x46, 0xb, 0x0, 0x0, 0xc0, 0xc, 0x0, + 0xc4, 0x60, 0xb0, 0x0, 0xc, 0x0, 0xc0, 0xc, + 0x4a, 0x6d, 0x16, 0x66, 0xd0, 0xc, 0x66, 0xc4, + 0x60, 0x30, 0x0, 0x1, 0x0, 0xc0, 0xc, 0x46, + 0x2, 0x23, 0x33, 0x81, 0xc, 0x0, 0xc4, 0xa6, + 0x72, 0x73, 0x3e, 0x10, 0xc0, 0xc, 0x46, 0x0, + 0x6, 0x4, 0x90, 0xc, 0x66, 0xc4, 0xa6, 0xb2, + 0x44, 0xb3, 0x0, 0xc0, 0x8, 0x46, 0x0, 0x0, + 0xca, 0x0, 0x3, 0x0, 0x4, 0x60, 0x0, 0x2c, + 0xb0, 0x0, 0x0, 0x0, 0x56, 0x0, 0x39, 0x6, + 0xd5, 0x0, 0x0, 0x5, 0x60, 0x54, 0x0, 0x4, + 0x81, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, + + /* U+6691 "æš‘" */ + 0x0, 0x0, 0x96, 0x66, 0x66, 0x6b, 0x20, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x10, 0x0, + 0x0, 0x0, 0x80, 0xd, 0x20, 0x6, 0xc9, 0x0, + 0x0, 0x3, 0x66, 0x6e, 0x6d, 0x2b, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x1, 0xc6, 0x3, 0x0, + 0x5, 0x76, 0x66, 0x6c, 0x8d, 0x96, 0x6c, 0x80, + 0x0, 0x0, 0x0, 0x29, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0xb7, 0x66, 0x6c, 0x70, 0x0, + 0x1, 0x57, 0x6b, 0x0, 0x0, 0xa, 0x40, 0x0, + 0x12, 0x0, 0x1d, 0x66, 0x66, 0x6c, 0x40, 0x0, + 0x0, 0x0, 0x1b, 0x0, 0x0, 0xa, 0x40, 0x0, + 0x0, 0x0, 0x2d, 0x66, 0x66, 0x6c, 0x40, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x2, 0x0, 0x0, + + /* U+6696 "æš–" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x59, 0x60, 0x30, + 0x4, 0x24, 0x56, 0x87, 0x66, 0x30, 0xd6, 0x6d, + 0x41, 0x50, 0x74, 0xe, 0x20, 0xd0, 0xb, 0x10, + 0x94, 0x29, 0x54, 0x0, 0xd0, 0xb, 0x16, 0x87, + 0x66, 0x97, 0xb0, 0xd0, 0xb, 0x10, 0x8, 0x50, + 0x0, 0x0, 0xd5, 0x5d, 0x36, 0x6c, 0x86, 0x66, + 0xb6, 0xd0, 0xb, 0x12, 0xd, 0x0, 0x0, 0x0, + 0xd0, 0xb, 0x10, 0x2d, 0x66, 0x6a, 0x30, 0xd0, + 0xb, 0x10, 0x97, 0x40, 0x4c, 0x10, 0xd6, 0x6d, + 0x21, 0xa0, 0x82, 0xd2, 0x0, 0xd0, 0x8, 0x1a, + 0x10, 0x2f, 0x50, 0x0, 0xa0, 0x0, 0x62, 0x1, + 0xa8, 0xd4, 0x0, 0x0, 0x1, 0x10, 0x58, 0x10, + 0x3d, 0xd7, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, + 0x50, + + /* U+6697 "æš—" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x51, 0x15, + 0x0, 0x0, 0x58, 0x3, 0x30, 0xd5, 0x5d, 0x24, + 0x76, 0x66, 0x76, 0x50, 0xd0, 0xd, 0x0, 0x36, + 0x0, 0x97, 0x0, 0xd0, 0xd, 0x0, 0xb, 0x40, + 0xb0, 0x0, 0xd0, 0xd, 0x0, 0x4, 0x14, 0x30, + 0x72, 0xd6, 0x6e, 0x28, 0x66, 0x66, 0x66, 0x64, + 0xd0, 0xd, 0x0, 0x30, 0x0, 0x4, 0x0, 0xd0, + 0xd, 0x0, 0xe6, 0x66, 0x6e, 0x30, 0xd0, 0xd, + 0x0, 0xd0, 0x0, 0xd, 0x0, 0xd6, 0x6e, 0x0, + 0xd5, 0x55, 0x5e, 0x0, 0xd0, 0xb, 0x0, 0xd0, + 0x0, 0xd, 0x0, 0x40, 0x0, 0x0, 0xd6, 0x66, + 0x6e, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0xc, + 0x10, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + + /* U+66C7 "曇" */ + 0x0, 0x11, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, + 0x4a, 0x66, 0x66, 0x66, 0xd3, 0x0, 0x0, 0x47, + 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x4a, 0x66, + 0x66, 0x66, 0xd0, 0x0, 0x0, 0x4a, 0x66, 0x66, + 0x66, 0xc0, 0x0, 0x0, 0x33, 0x22, 0x22, 0x22, + 0x84, 0x0, 0x2, 0x33, 0x33, 0xc4, 0x33, 0x33, + 0x21, 0xa, 0x66, 0x66, 0xd6, 0x66, 0x66, 0xc8, + 0x77, 0x46, 0x60, 0xb1, 0x36, 0x61, 0x50, 0x0, + 0x46, 0x60, 0x80, 0x36, 0x60, 0x0, 0x0, 0x37, + 0x66, 0x66, 0x68, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xa0, 0x57, 0x66, 0x6a, 0xa6, + 0x66, 0x66, 0x62, 0x0, 0x0, 0x59, 0x20, 0x7, + 0x40, 0x0, 0x0, 0x2b, 0xa6, 0x67, 0x66, 0xd5, + 0x0, 0x0, 0x18, 0x53, 0x10, 0x0, 0x13, 0x0, + + /* U+66DC "曜" */ + 0x0, 0x0, 0x1, 0x11, 0x50, 0x11, 0x51, 0x96, + 0x6b, 0x38, 0x55, 0xd3, 0x75, 0xc3, 0xd0, 0xd, + 0x3, 0xc0, 0xc0, 0x97, 0xb1, 0xc0, 0xd, 0x0, + 0x41, 0xc0, 0x5, 0xb1, 0xc0, 0xd, 0x5, 0x75, + 0xc2, 0x86, 0xc1, 0xc6, 0x6d, 0xa5, 0x30, 0x79, + 0x30, 0x70, 0xc0, 0xd, 0x0, 0xe5, 0xb, 0x40, + 0x0, 0xc0, 0xd, 0x6, 0xa6, 0x6b, 0x86, 0xc2, + 0xc0, 0xd, 0x1e, 0x30, 0xb, 0x1, 0x0, 0xc6, + 0x6d, 0x6a, 0x75, 0x5d, 0x5a, 0x60, 0xd0, 0xd, + 0xa, 0x30, 0xb, 0x1, 0x0, 0xc0, 0x2, 0xa, + 0x76, 0x6d, 0x68, 0x60, 0x10, 0x0, 0xa, 0x30, + 0xb, 0x0, 0x40, 0x0, 0x0, 0xa, 0x76, 0x68, + 0x66, 0x94, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x0, + + /* U+66F2 "曲" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xc0, 0xc, 0x20, 0x0, 0x0, 0x1, 0xc0, 0xd, + 0x0, 0x0, 0x0, 0x1, 0xc0, 0xd, 0x0, 0x0, + 0xa7, 0x66, 0xd6, 0x6e, 0x66, 0xc5, 0xb3, 0x1, + 0xc0, 0xd, 0x0, 0xc2, 0xb3, 0x1, 0xc0, 0xd, + 0x0, 0xc2, 0xa3, 0x1, 0xc0, 0xd, 0x0, 0xc2, + 0xa8, 0x66, 0xd6, 0x6e, 0x66, 0xd2, 0xa3, 0x1, + 0xc0, 0xd, 0x0, 0xc2, 0xa3, 0x1, 0xc0, 0xd, + 0x0, 0xc2, 0xa3, 0x1, 0xc0, 0xd, 0x0, 0xc2, + 0xb3, 0x1, 0xc0, 0xd, 0x0, 0xc2, 0xb8, 0x66, + 0xc6, 0x6c, 0x66, 0xd2, 0xb3, 0x0, 0x0, 0x0, + 0x0, 0xa1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+66F4 "æ›´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x10, + 0x5, 0x76, 0x66, 0x67, 0xb6, 0x66, 0x68, 0x50, + 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x10, 0x0, + 0x0, 0xd, 0x66, 0x67, 0xd6, 0x66, 0xf2, 0x0, + 0x0, 0xe, 0x0, 0x2, 0xb0, 0x0, 0xe0, 0x0, + 0x0, 0xe, 0x66, 0x67, 0xd6, 0x66, 0xe0, 0x0, + 0x0, 0xe, 0x0, 0x2, 0xb0, 0x0, 0xe0, 0x0, + 0x0, 0xe, 0x0, 0x3, 0xa0, 0x0, 0xe0, 0x0, + 0x0, 0xe, 0x66, 0x69, 0xb6, 0x66, 0xd0, 0x0, + 0x0, 0x0, 0x12, 0x8, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x3d, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0x75, 0xc8, 0x42, 0x10, 0x10, + 0x1, 0x57, 0x71, 0x0, 0x5, 0x9c, 0xef, 0x80, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+66F8 "書" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x36, 0x66, 0xe6, 0x66, 0x6b, 0x10, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xd1, 0x40, 0x47, 0x66, + 0x66, 0xe6, 0x66, 0x6e, 0x89, 0x10, 0x4, 0x66, + 0x6e, 0x66, 0x66, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x5, 0x0, 0x0, 0x36, 0x66, 0x6e, + 0x66, 0x66, 0xa7, 0x0, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0x75, 0x5, 0x76, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x50, 0x0, 0xc6, 0x66, 0x66, 0x66, + 0x6e, 0x10, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0xc6, 0x66, 0x66, 0x66, 0x6d, + 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x66, 0x6e, 0x0, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, + + /* U+66FE "曾" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0x10, 0x0, 0xb5, 0x0, 0x0, 0x4, 0xb0, 0x2, + 0xa0, 0x0, 0x9, 0x66, 0x96, 0x6a, 0x66, 0x88, + 0xd, 0x10, 0x0, 0xd0, 0x10, 0x67, 0xd, 0x1a, + 0x0, 0xd0, 0x97, 0x67, 0xd, 0x9, 0x60, 0xd1, + 0x90, 0x67, 0xd, 0x1, 0x10, 0xd3, 0x0, 0x67, + 0xd, 0x66, 0x66, 0x66, 0x66, 0x95, 0x0, 0x66, + 0x66, 0x66, 0x69, 0x20, 0x0, 0xa2, 0x0, 0x0, + 0xd, 0x0, 0x0, 0xa2, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xa7, 0x66, 0x66, 0x6e, 0x0, 0x0, 0xa2, + 0x0, 0x0, 0xd, 0x0, 0x0, 0xa7, 0x66, 0x66, + 0x6e, 0x0, 0x0, 0x20, 0x0, 0x0, 0x2, 0x0, + + /* U+66FF "替" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0xd2, 0x40, 0xd, 0x5, 0x10, 0x3, 0x66, 0xd6, + 0x63, 0x6e, 0x66, 0x40, 0x0, 0x2, 0xa1, 0x30, + 0xd, 0x0, 0x50, 0x6, 0x69, 0xa6, 0x65, 0x7c, + 0x96, 0x71, 0x0, 0xb, 0x78, 0x0, 0x84, 0x71, + 0x0, 0x0, 0x57, 0x7, 0x75, 0x70, 0x1b, 0x30, + 0x4, 0x61, 0x0, 0x64, 0x0, 0x33, 0xd5, 0x22, + 0xe, 0x66, 0x66, 0x66, 0xd6, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x0, 0xb2, 0x0, 0x0, 0xe, 0x66, + 0x66, 0x66, 0xd2, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xb2, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0xb3, 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, 0xd3, + 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x30, 0x0, + + /* U+6700 "最" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x86, 0x66, 0x66, 0x6b, 0x50, 0x0, + 0x0, 0x2, 0xd0, 0x0, 0x0, 0xb, 0x20, 0x0, + 0x0, 0x2, 0xe6, 0x66, 0x66, 0x6d, 0x20, 0x0, + 0x0, 0x2, 0xd0, 0x0, 0x0, 0xb, 0x20, 0x0, + 0x0, 0x2, 0xd6, 0x66, 0x66, 0x6c, 0x21, 0x0, + 0x5, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7e, 0xa0, + 0x1, 0xe, 0x0, 0xd, 0x0, 0x0, 0x2, 0x0, + 0x0, 0xe, 0x66, 0x6d, 0x57, 0x66, 0xad, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x5, 0x0, 0xc4, 0x0, + 0x0, 0xe, 0x66, 0x6d, 0x4, 0x24, 0xb0, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x22, 0x9c, 0x10, 0x0, + 0x0, 0xe, 0x69, 0x8e, 0x30, 0x9a, 0x0, 0x0, + 0xb, 0xe9, 0x41, 0xd, 0x5, 0x68, 0xb3, 0x0, + 0x1, 0x0, 0x0, 0xd, 0x44, 0x0, 0x5e, 0xa1, + 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, 0x0, + + /* U+6703 "會" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xc4, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0x30, 0x1a, 0x50, 0x0, 0x0, + 0x0, 0x3, 0xb8, 0x66, 0x6d, 0xed, 0x95, 0x31, + 0x0, 0x77, 0x0, 0x0, 0x0, 0x1, 0x9c, 0xb1, + 0x15, 0xb, 0x66, 0x69, 0x66, 0x66, 0xe1, 0x0, + 0x0, 0xd, 0x9, 0x2c, 0x3, 0xb0, 0xd0, 0x0, + 0x0, 0xd, 0x2, 0xac, 0x9, 0x20, 0xd0, 0x0, + 0x0, 0xc, 0x66, 0x69, 0x67, 0x66, 0xb0, 0x0, + 0x0, 0x0, 0x86, 0x66, 0x66, 0x69, 0x0, 0x0, + 0x0, 0x0, 0xc0, 0x0, 0x0, 0x2b, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x7a, 0x0, 0x0, + 0x0, 0x0, 0xc0, 0x0, 0x0, 0x2a, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x7b, 0x0, 0x0, + 0x0, 0x0, 0x60, 0x0, 0x0, 0x14, 0x0, 0x0, + + /* U+6708 "月" */ + 0x0, 0x0, 0x30, 0x0, 0x0, 0x5, 0x0, 0x0, + 0xd, 0x66, 0x66, 0x66, 0xe3, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xd, 0x10, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6e, + 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0xe, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe6, 0x66, + 0x66, 0x6e, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0x5, 0x90, 0x0, 0x0, 0xe, 0x0, + 0x0, 0xb2, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x57, + 0x0, 0x0, 0x21, 0x1f, 0x0, 0x37, 0x0, 0x0, + 0x2, 0x7f, 0xc0, 0x3, 0x0, 0x0, 0x0, 0x0, + 0x30, 0x0, + + /* U+6709 "有" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x5, 0x10, + 0x6, 0x66, 0x66, 0xbb, 0x66, 0x66, 0x6c, 0x90, + 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x50, 0x0, 0x4, 0x10, 0x0, + 0x0, 0x0, 0x5d, 0x66, 0x66, 0x6c, 0x60, 0x0, + 0x0, 0x2, 0xcc, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x29, 0x2d, 0x66, 0x66, 0x6c, 0x30, 0x0, + 0x2, 0x70, 0x1c, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x3, 0x0, 0x1c, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x0, 0x1d, 0x66, 0x66, 0x6c, 0x30, 0x0, + 0x0, 0x0, 0x1c, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x0, 0x1c, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x0, 0x2c, 0x0, 0x5, 0xbf, 0x10, 0x0, + 0x0, 0x0, 0x12, 0x0, 0x0, 0x23, 0x0, 0x0, + + /* U+670B "朋" */ + 0x0, 0x10, 0x0, 0x20, 0x0, 0x0, 0x2, 0x0, + 0xb, 0x66, 0x6e, 0x11, 0xc6, 0x66, 0xf1, 0x0, + 0xb1, 0x0, 0xd0, 0x1c, 0x0, 0xd, 0x0, 0xb, + 0x10, 0xd, 0x1, 0xc0, 0x0, 0xd0, 0x0, 0xb6, + 0x66, 0xd0, 0x1d, 0x66, 0x6d, 0x0, 0xb, 0x10, + 0xd, 0x1, 0xc0, 0x0, 0xd0, 0x0, 0xb1, 0x0, + 0xd0, 0x1c, 0x0, 0xd, 0x0, 0xb, 0x66, 0x6d, + 0x1, 0xd6, 0x66, 0xd0, 0x0, 0xc0, 0x0, 0xd0, + 0x2b, 0x0, 0xd, 0x0, 0xc, 0x0, 0xd, 0x3, + 0x90, 0x0, 0xd0, 0x0, 0xb0, 0x0, 0xd0, 0x66, + 0x0, 0xd, 0x0, 0x46, 0x0, 0xd, 0xa, 0x10, + 0x0, 0xd0, 0x8, 0x0, 0x68, 0xc3, 0x60, 0x0, + 0xd, 0x2, 0x40, 0x0, 0x95, 0x70, 0x2, 0x8f, + 0xa0, 0x10, 0x0, 0x0, 0x30, 0x0, 0x0, 0x40, + 0x0, + + /* U+670D "æœ" */ + 0x0, 0x20, 0x3, 0x0, 0x30, 0x0, 0x21, 0x0, + 0x0, 0xd6, 0x6c, 0x60, 0xe6, 0x66, 0xc8, 0x0, + 0x0, 0xd0, 0xa, 0x20, 0xd0, 0x0, 0xa3, 0x0, + 0x0, 0xd0, 0xa, 0x20, 0xd0, 0x0, 0xb2, 0x0, + 0x0, 0xd6, 0x6c, 0x20, 0xd0, 0x48, 0xe0, 0x0, + 0x0, 0xd0, 0xa, 0x20, 0xd0, 0x4, 0x20, 0x0, + 0x0, 0xd0, 0xa, 0x20, 0xd6, 0x55, 0x7c, 0x0, + 0x0, 0xd6, 0x6c, 0x20, 0xd3, 0x30, 0x78, 0x0, + 0x0, 0xc0, 0xa, 0x20, 0xd0, 0x70, 0xb2, 0x0, + 0x0, 0xc0, 0xa, 0x20, 0xd0, 0x74, 0xb0, 0x0, + 0x0, 0xb0, 0xa, 0x20, 0xd0, 0x1e, 0x30, 0x0, + 0x4, 0x60, 0xa, 0x20, 0xd0, 0x5a, 0xa0, 0x0, + 0x8, 0x4, 0x4c, 0x20, 0xd4, 0x60, 0x6e, 0x81, + 0x23, 0x0, 0x8c, 0x0, 0xe2, 0x0, 0x3, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + + /* U+671B "望" */ + 0x0, 0x26, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0xc3, 0x0, 0x4a, 0x66, 0x6e, 0x30, 0x12, + 0x26, 0x25, 0x64, 0x80, 0x0, 0xd0, 0x3, 0x4d, + 0x44, 0x43, 0x4b, 0x66, 0x6e, 0x0, 0x0, 0xd0, + 0x0, 0x4, 0x70, 0x0, 0xd0, 0x0, 0xd, 0x0, + 0x34, 0x69, 0x66, 0x6e, 0x0, 0x1, 0xea, 0x93, + 0xa, 0x20, 0x0, 0xd0, 0x0, 0x1b, 0x30, 0x5, + 0x60, 0x4, 0xbc, 0x0, 0x0, 0x0, 0x4, 0x30, + 0x0, 0x2, 0x80, 0x0, 0x76, 0x66, 0x67, 0xd6, + 0x66, 0x66, 0x10, 0x0, 0x0, 0x0, 0x2b, 0x0, + 0x24, 0x0, 0x0, 0x6, 0x76, 0x67, 0xd6, 0x67, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, + 0x0, 0x4, 0x66, 0x66, 0x67, 0xd6, 0x66, 0x6c, + 0xc0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+671D "æœ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa2, 0x2, 0x32, 0xb6, 0x6c, 0x60, 0x56, + 0x6c, 0x76, 0x76, 0x2b, 0x0, 0xa2, 0x0, 0x0, + 0xa2, 0x0, 0x1, 0xb0, 0xa, 0x20, 0xb, 0x6a, + 0x76, 0xe1, 0x1b, 0x0, 0xa2, 0x0, 0xd0, 0x0, + 0xd, 0x1, 0xd6, 0x6c, 0x20, 0xd, 0x66, 0x66, + 0xd0, 0x1b, 0x0, 0xa2, 0x0, 0xd0, 0x0, 0xd, + 0x2, 0xa0, 0xa, 0x20, 0xd, 0x67, 0x66, 0xd0, + 0x3c, 0x66, 0xc2, 0x0, 0x70, 0xa2, 0x3, 0x5, + 0x80, 0xa, 0x21, 0x66, 0x6c, 0x76, 0xa6, 0x94, + 0x0, 0xa2, 0x0, 0x0, 0xa2, 0x0, 0xc, 0x0, + 0xa, 0x20, 0x0, 0xa, 0x20, 0x8, 0x30, 0x20, + 0xb2, 0x0, 0x0, 0xa3, 0x5, 0x40, 0x2, 0xbe, + 0x0, 0x0, 0x3, 0x0, 0x10, 0x0, 0x0, 0x10, + + /* U+671F "期" */ + 0x0, 0xa, 0x10, 0x94, 0x0, 0x0, 0x0, 0x20, + 0x0, 0xe, 0x0, 0xb2, 0x2, 0xc6, 0x67, 0xd0, + 0x4, 0x6e, 0x66, 0xd9, 0xb3, 0xc0, 0x2, 0xb0, + 0x0, 0xe, 0x0, 0xb2, 0x1, 0xc0, 0x2, 0xb0, + 0x0, 0xe, 0x66, 0xd2, 0x1, 0xd6, 0x67, 0xb0, + 0x0, 0xe, 0x0, 0xb2, 0x1, 0xc0, 0x2, 0xb0, + 0x0, 0xe, 0x0, 0xb2, 0x1, 0xc0, 0x2, 0xb0, + 0x0, 0xe, 0x66, 0xd2, 0x2, 0xb0, 0x2, 0xb0, + 0x0, 0xe, 0x0, 0xb3, 0x23, 0xd5, 0x57, 0xb0, + 0x5, 0x69, 0x66, 0x89, 0x86, 0x90, 0x2, 0xb0, + 0x0, 0x8, 0x70, 0x70, 0x9, 0x60, 0x2, 0xb0, + 0x0, 0x2d, 0x10, 0x5c, 0x1d, 0x0, 0x2, 0xb0, + 0x0, 0xa1, 0x0, 0x7, 0x93, 0x0, 0x3, 0xb0, + 0x7, 0x10, 0x0, 0x7, 0x30, 0x1, 0x7f, 0x80, + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x3, 0x0, + + /* U+6728 "木" */ + 0x0, 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x6, 0x0, + 0x7, 0x66, 0x66, 0x9f, 0x86, 0x66, 0x8b, 0x40, + 0x0, 0x0, 0x0, 0xef, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xbd, 0x37, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x2d, 0x1a, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x87, 0xd, 0x13, 0xb0, 0x0, 0x0, + 0x0, 0x4, 0xb0, 0xd, 0x10, 0x8a, 0x0, 0x0, + 0x0, 0x2a, 0x0, 0xd, 0x10, 0xb, 0xd5, 0x0, + 0x3, 0x80, 0x0, 0xd, 0x10, 0x0, 0xaf, 0x80, + 0x24, 0x0, 0x0, 0xe, 0x20, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, + + /* U+672A "未" */ + 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x30, 0x8, 0x40, 0x0, 0x1, + 0x86, 0x66, 0xd8, 0x66, 0x65, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x40, 0x6, 0x66, 0x66, + 0x8e, 0x96, 0x66, 0x8b, 0x20, 0x0, 0x0, 0xd, + 0xe6, 0x30, 0x0, 0x0, 0x0, 0x0, 0x8, 0x9b, + 0x39, 0x0, 0x0, 0x0, 0x0, 0x4, 0xb0, 0xb3, + 0x2b, 0x0, 0x0, 0x0, 0x3, 0xb0, 0xb, 0x30, + 0x6c, 0x20, 0x0, 0x5, 0x80, 0x0, 0xb3, 0x0, + 0x7f, 0x82, 0x6, 0x30, 0x0, 0xb, 0x30, 0x0, + 0x4d, 0x50, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + 0x0, + + /* U+672B "末" */ + 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x30, 0x0, 0x3a, 0x0, 0x76, + 0x66, 0x66, 0xd8, 0x66, 0x66, 0x62, 0x0, 0x0, + 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x43, 0x0, 0x0, 0x37, 0x66, + 0xaf, 0xa6, 0x67, 0x70, 0x0, 0x0, 0x0, 0x1e, + 0xd5, 0x60, 0x0, 0x0, 0x0, 0x0, 0xb, 0x5b, + 0x38, 0x20, 0x0, 0x0, 0x0, 0x8, 0x70, 0xb3, + 0xc, 0x20, 0x0, 0x0, 0x7, 0x80, 0xb, 0x30, + 0x3e, 0x60, 0x0, 0x8, 0x50, 0x0, 0xb3, 0x0, + 0x3e, 0xe7, 0x16, 0x10, 0x0, 0xb, 0x30, 0x0, + 0x16, 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + 0x0, + + /* U+672C "本" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x1, 0x0, + 0x5, 0x66, 0x66, 0x6c, 0x96, 0x66, 0x7e, 0x30, + 0x0, 0x0, 0x0, 0x8f, 0x72, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xec, 0x47, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x7a, 0x46, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x3c, 0xa, 0x40, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0xa, 0x40, 0x4c, 0x10, 0x0, + 0x0, 0xa, 0x30, 0xa, 0x40, 0x7, 0xe4, 0x0, + 0x0, 0x93, 0x66, 0x6c, 0x86, 0xa8, 0x7f, 0x90, + 0x26, 0x0, 0x0, 0xa, 0x40, 0x0, 0x3, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x20, 0x0, 0x0, 0x0, + + /* U+672D "札" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe3, 0x0, 0xc, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xe1, 0x0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xe1, 0x0, 0xd, 0x10, 0x0, 0x0, + 0x5, 0x66, 0xe6, 0x9a, 0xd, 0x10, 0x0, 0x0, + 0x1, 0x0, 0xf1, 0x0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x4, 0xf2, 0x0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x9, 0xf9, 0x91, 0xd, 0x10, 0x0, 0x0, + 0x0, 0xc, 0xe1, 0xba, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x74, 0xe1, 0x16, 0xd, 0x10, 0x0, 0x0, + 0x0, 0xa0, 0xe1, 0x0, 0xd, 0x10, 0x0, 0x0, + 0x6, 0x0, 0xe1, 0x0, 0xd, 0x10, 0x0, 0x50, + 0x2, 0x0, 0xe1, 0x0, 0xd, 0x10, 0x0, 0x80, + 0x0, 0x0, 0xe1, 0x0, 0xd, 0x20, 0x2, 0xe1, + 0x0, 0x0, 0xe1, 0x0, 0x9, 0xdc, 0xcd, 0xb0, + 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+673A "机" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0xa, 0x66, 0x6c, 0x40, 0x0, + 0x0, 0xc, 0x10, 0xd, 0x10, 0xe, 0x0, 0x0, + 0x0, 0xc, 0x17, 0xd, 0x10, 0xe, 0x0, 0x0, + 0x16, 0x6f, 0x66, 0x2c, 0x10, 0xe, 0x0, 0x0, + 0x0, 0x2f, 0x10, 0xc, 0x10, 0xe, 0x0, 0x0, + 0x0, 0x6f, 0x84, 0xc, 0x10, 0xe, 0x0, 0x0, + 0x0, 0xbe, 0x1c, 0x6c, 0x10, 0xe, 0x0, 0x0, + 0x1, 0x9c, 0x11, 0x4d, 0x0, 0xe, 0x0, 0x0, + 0x7, 0x2c, 0x10, 0xd, 0x0, 0xe, 0x0, 0x0, + 0x6, 0xc, 0x10, 0x39, 0x0, 0xe, 0x0, 0x20, + 0x40, 0xc, 0x10, 0x84, 0x0, 0xe, 0x0, 0x60, + 0x0, 0xc, 0x10, 0xa0, 0x0, 0xe, 0x1, 0xa0, + 0x0, 0xd, 0x27, 0x10, 0x0, 0xa, 0xdd, 0xc0, + 0x0, 0xa, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6750 "æ" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x1, 0xf2, 0x0, 0x0, 0x2, 0xe1, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1, 0xd0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1, 0xd0, 0x0, + 0x5, 0x66, 0xf6, 0xc5, 0x46, 0x67, 0xe7, 0xd1, + 0x0, 0x2, 0xe0, 0x0, 0x0, 0x8, 0xd0, 0x0, + 0x0, 0x7, 0xf6, 0x0, 0x0, 0x1e, 0xd0, 0x0, + 0x0, 0xc, 0xe3, 0xd1, 0x0, 0x89, 0xd0, 0x0, + 0x0, 0x3b, 0xe0, 0x95, 0x3, 0xc1, 0xd0, 0x0, + 0x0, 0xa3, 0xe0, 0x0, 0xb, 0x11, 0xd0, 0x0, + 0x2, 0x70, 0xe0, 0x0, 0x92, 0x1, 0xd0, 0x0, + 0x7, 0x0, 0xe0, 0x7, 0x20, 0x1, 0xd0, 0x0, + 0x10, 0x0, 0xf0, 0x20, 0x0, 0x1, 0xd0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x2, 0x34, 0xd0, 0x0, + 0x0, 0x1, 0xf0, 0x0, 0x0, 0x5e, 0x90, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x2, 0x0, 0x0, + + /* U+6751 "æ‘" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x1, 0xf2, 0x0, 0x0, 0x0, 0xf2, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x5, 0x66, 0xf6, 0xc4, 0x46, 0x66, 0xf7, 0xc1, + 0x0, 0x4, 0xe0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x8, 0xf4, 0x0, 0x20, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0xe6, 0xb0, 0x76, 0x0, 0xe0, 0x0, + 0x0, 0x39, 0xe0, 0xb5, 0xe, 0x30, 0xe0, 0x0, + 0x0, 0xa2, 0xe0, 0x11, 0x8, 0x40, 0xe0, 0x0, + 0x2, 0x70, 0xe0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x7, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x1, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x3, 0x33, 0xe0, 0x0, + 0x0, 0x1, 0xf0, 0x0, 0x0, 0x5e, 0xb0, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x2, 0x0, 0x0, + + /* U+675F "æŸ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x20, 0x0, 0x5, 0x20, 0x66, + 0x66, 0x66, 0xd7, 0x66, 0x66, 0x75, 0x0, 0x0, + 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, 0x0, 0xc6, + 0x66, 0xd7, 0x66, 0x6e, 0x10, 0x0, 0xf, 0x0, + 0xc, 0x20, 0x1, 0xd0, 0x0, 0x0, 0xf0, 0x0, + 0xc2, 0x0, 0x1d, 0x0, 0x0, 0xf, 0x66, 0x6d, + 0x76, 0x66, 0xe0, 0x0, 0x0, 0xf0, 0xd, 0xe6, + 0x30, 0x19, 0x0, 0x0, 0x1, 0x9, 0x7c, 0x29, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xa0, 0xc2, 0x1b, + 0x10, 0x0, 0x0, 0x5, 0x90, 0xc, 0x20, 0x3d, + 0x60, 0x0, 0x7, 0x60, 0x0, 0xc2, 0x0, 0x2d, + 0xf7, 0x16, 0x20, 0x0, 0xd, 0x30, 0x0, 0x5, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, + + /* U+6761 "æ¡" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xb0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x86, 0x66, 0x6f, 0x50, 0x0, + 0x0, 0x0, 0x89, 0x30, 0x0, 0x9b, 0x0, 0x0, + 0x0, 0x4, 0x80, 0x71, 0x4, 0xe1, 0x0, 0x0, + 0x0, 0x27, 0x0, 0xb, 0x5e, 0x30, 0x0, 0x0, + 0x0, 0x40, 0x0, 0x9, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xb7, 0x5b, 0xd8, 0x42, 0x10, + 0x2, 0x57, 0x73, 0x0, 0xf2, 0x39, 0xdf, 0xa2, + 0x2, 0x0, 0x0, 0x0, 0xe0, 0x1, 0x80, 0x0, + 0x0, 0x6, 0x76, 0x66, 0xf6, 0x66, 0x62, 0x0, + 0x0, 0x0, 0xd, 0x40, 0xe1, 0x61, 0x0, 0x0, + 0x0, 0x0, 0xb8, 0x0, 0xe0, 0x1c, 0x60, 0x0, + 0x0, 0x9, 0x50, 0x0, 0xe0, 0x1, 0xd9, 0x0, + 0x1, 0x72, 0x2, 0x8d, 0xc0, 0x0, 0x3a, 0x0, + 0x1, 0x0, 0x0, 0x6, 0x20, 0x0, 0x0, 0x0, + + /* U+6765 "æ¥" */ + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x56, 0x66, 0x6d, 0x86, 0x66, 0xca, 0x0, + 0x0, 0x23, 0x0, 0xb, 0x30, 0x6, 0x10, 0x0, + 0x0, 0x1, 0xc3, 0xb, 0x30, 0x2e, 0x40, 0x0, + 0x0, 0x0, 0x6c, 0xb, 0x30, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xb, 0x34, 0x40, 0xa, 0x30, + 0x28, 0x66, 0x66, 0xbf, 0xb6, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x1, 0xed, 0x47, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x5b, 0x36, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x88, 0xb, 0x30, 0xb6, 0x0, 0x0, + 0x0, 0x6, 0x90, 0xb, 0x30, 0xc, 0xb2, 0x0, + 0x0, 0x76, 0x0, 0xb, 0x30, 0x0, 0xaf, 0x90, + 0x16, 0x20, 0x0, 0xc, 0x40, 0x0, 0x3, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, 0x0, + + /* U+676F "æ¯" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x46, 0x66, 0x66, 0x69, 0xb0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xa5, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x70, 0x0, 0xe0, 0x0, 0x0, + 0x6, 0x66, 0xe6, 0x62, 0x6, 0x80, 0x0, 0x0, + 0x0, 0x5, 0xe2, 0x0, 0xd, 0xb1, 0x0, 0x0, + 0x0, 0xb, 0xe9, 0x50, 0x59, 0xe2, 0x0, 0x0, + 0x0, 0x2a, 0xe1, 0xe0, 0xc1, 0xd1, 0x92, 0x0, + 0x0, 0x91, 0xe0, 0x39, 0x30, 0xd0, 0x2e, 0x30, + 0x3, 0x60, 0xe0, 0x54, 0x0, 0xd0, 0x8, 0x80, + 0x5, 0x0, 0xe2, 0x30, 0x0, 0xd0, 0x0, 0x10, + 0x10, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x70, 0x0, 0x0, 0x50, 0x0, 0x0, + + /* U+6771 "æ±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x9, 0x0, 0x57, + 0x66, 0x66, 0xe6, 0x66, 0x66, 0x62, 0x0, 0x4, + 0x0, 0xd, 0x0, 0x1, 0x60, 0x0, 0x0, 0xd6, + 0x66, 0xe6, 0x66, 0x8d, 0x0, 0x0, 0xd, 0x10, + 0xd, 0x0, 0x3, 0xa0, 0x0, 0x0, 0xc6, 0x66, + 0xe6, 0x66, 0x8a, 0x0, 0x0, 0xd, 0x10, 0xd, + 0x0, 0x3, 0xb0, 0x0, 0x0, 0xd6, 0x6d, 0xfa, + 0x66, 0x78, 0x0, 0x0, 0x1, 0x4, 0xbd, 0x26, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xc1, 0xd0, 0x74, + 0x0, 0x0, 0x0, 0x0, 0xa2, 0xd, 0x0, 0xa6, + 0x0, 0x0, 0x1, 0x92, 0x0, 0xd1, 0x0, 0x9d, + 0x62, 0x4, 0x70, 0x0, 0xd, 0x10, 0x0, 0x4c, + 0x51, 0x20, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, + + /* U+6790 "æž" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc3, 0x0, 0x0, 0x0, 0x39, 0x50, 0x0, + 0xd, 0x10, 0x9, 0x65, 0x76, 0x53, 0x0, 0x0, + 0xc1, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x16, 0x6e, + 0x6c, 0x3a, 0x30, 0x0, 0x0, 0x0, 0x0, 0xe1, + 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x30, + 0xa, 0x86, 0x67, 0x6b, 0x70, 0x7, 0xf9, 0x80, + 0xa3, 0x0, 0xc1, 0x0, 0x0, 0xbd, 0x1d, 0x2a, + 0x20, 0xc, 0x10, 0x0, 0x27, 0xc1, 0x20, 0xc1, + 0x0, 0xc1, 0x0, 0x7, 0xc, 0x10, 0xd, 0x0, + 0xc, 0x10, 0x2, 0x20, 0xc1, 0x2, 0xb0, 0x0, + 0xc1, 0x0, 0x0, 0xd, 0x10, 0x75, 0x0, 0xd, + 0x10, 0x0, 0x0, 0xd1, 0x1a, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0xd, 0x27, 0x0, 0x0, 0xd, 0x20, + 0x0, 0x0, 0x51, 0x0, 0x0, 0x0, 0x30, 0x0, + + /* U+6797 "æž—" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x1, 0x0, + 0x4, 0x66, 0xe8, 0xb3, 0x66, 0xe6, 0x6d, 0x40, + 0x0, 0x1, 0xe0, 0x0, 0x8, 0xe3, 0x0, 0x0, + 0x0, 0x5, 0xf1, 0x0, 0xd, 0xe6, 0x0, 0x0, + 0x0, 0xb, 0xe9, 0x50, 0x3a, 0xe7, 0x0, 0x0, + 0x0, 0x2a, 0xe1, 0xe0, 0xa2, 0xe2, 0x70, 0x0, + 0x0, 0x91, 0xe0, 0x34, 0x70, 0xe0, 0xb2, 0x0, + 0x3, 0x50, 0xe0, 0x9, 0x0, 0xe0, 0x3e, 0x20, + 0x5, 0x0, 0xe0, 0x70, 0x0, 0xe0, 0x8, 0xc2, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x30, 0x0, 0x0, + + /* U+679C "æžœ" */ + 0x0, 0x8, 0x66, 0x66, 0x66, 0x66, 0xa0, 0x0, + 0x0, 0xd1, 0x0, 0xd1, 0x0, 0x3c, 0x0, 0x0, + 0xc, 0x10, 0xd, 0x10, 0x3, 0xb0, 0x0, 0x0, + 0xc6, 0x66, 0xe6, 0x66, 0x7b, 0x0, 0x0, 0xc, + 0x10, 0xd, 0x10, 0x3, 0xb0, 0x0, 0x0, 0xd1, + 0x0, 0xd1, 0x0, 0x3b, 0x0, 0x0, 0xd, 0x66, + 0x6e, 0x66, 0x67, 0xa0, 0x0, 0x0, 0x10, 0x0, + 0xd1, 0x0, 0x0, 0x70, 0x6, 0x76, 0x66, 0xcf, + 0x96, 0x66, 0x68, 0x30, 0x0, 0x0, 0x6a, 0xd7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xd, 0x1a, + 0x40, 0x0, 0x0, 0x0, 0x4a, 0x0, 0xd1, 0xb, + 0x81, 0x0, 0x0, 0x76, 0x0, 0xe, 0x10, 0x8, + 0xe9, 0x31, 0x61, 0x0, 0x0, 0xe1, 0x0, 0x3, + 0x80, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, + 0x0, + + /* U+67D0 "æŸ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0x10, 0x0, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0xd1, 0x5, 0x20, + 0x3, 0x76, 0x6e, 0x66, 0x66, 0xd6, 0x68, 0x70, + 0x0, 0x0, 0xd, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x66, 0x66, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x66, 0x66, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x1, 0xc0, 0x40, 0x0, 0x10, + 0x5, 0x66, 0x66, 0x67, 0xd6, 0x66, 0x6a, 0xd2, + 0x0, 0x0, 0x0, 0xba, 0xc6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xb2, 0xc3, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x6b, 0x1, 0xc0, 0x6a, 0x20, 0x0, + 0x0, 0x9, 0x70, 0x2, 0xc0, 0x5, 0xfa, 0x61, + 0x5, 0x72, 0x0, 0x2, 0xc0, 0x0, 0x1a, 0x91, + 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, + + /* U+67E5 "查" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x9, 0x30, + 0x3, 0x76, 0x66, 0x7f, 0xd9, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x0, 0xc7, 0xb4, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0x52, 0xb0, 0x78, 0x0, 0x0, + 0x0, 0x3, 0xa2, 0x3, 0xb0, 0x7, 0xd7, 0x20, + 0x1, 0x66, 0xa6, 0x66, 0x66, 0x6b, 0x6b, 0x91, + 0x4, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x6, 0x2, 0x0, + 0x2, 0x66, 0x66, 0x66, 0x66, 0x66, 0x8f, 0x60, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+67F1 "柱" */ + 0x0, 0x9, 0x30, 0x0, 0x6, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x5, 0xd0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x0, 0xc, 0x17, 0x15, 0x55, 0x65, 0x5c, 0x80, + 0x18, 0x6e, 0x66, 0x23, 0x11, 0xe1, 0x11, 0x10, + 0x0, 0x1f, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x5f, 0x94, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0xae, 0x2f, 0x20, 0x0, 0xe0, 0x7, 0x0, + 0x2, 0x9c, 0x15, 0x17, 0x66, 0xe6, 0x67, 0x20, + 0x7, 0x1c, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x23, 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x10, 0xd, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0xe0, 0x3, 0x20, + 0x0, 0xd, 0x13, 0x76, 0x66, 0xa6, 0x69, 0x90, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+67FB "査" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x1, 0x0, + 0x4, 0x66, 0x66, 0x6c, 0x86, 0x66, 0x7f, 0x40, + 0x1, 0x10, 0x0, 0xae, 0x64, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x8a, 0x37, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x87, 0xa, 0x40, 0x8a, 0x30, 0x0, + 0x0, 0x29, 0x30, 0xb, 0x30, 0x5, 0xed, 0x90, + 0x5, 0x50, 0x96, 0x67, 0x66, 0x6d, 0x35, 0x20, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xc6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xc6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0xe, 0x2, 0x0, + 0x15, 0x66, 0xd6, 0x66, 0x66, 0x6e, 0x6e, 0xa0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+67FF "柿" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x30, 0x0, 0x8, 0x20, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x3, 0xf1, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x0, 0x90, 0x4, 0x10, + 0x0, 0xc, 0x16, 0x57, 0x66, 0xc6, 0x68, 0x60, + 0x16, 0x6f, 0x66, 0x20, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x1f, 0x10, 0x4, 0x0, 0xe0, 0x6, 0x0, + 0x0, 0x6f, 0x93, 0xe, 0x66, 0xe6, 0x6f, 0x10, + 0x0, 0xbe, 0x3e, 0xd, 0x0, 0xe0, 0xe, 0x0, + 0x1, 0x9c, 0x14, 0xd, 0x0, 0xe0, 0xe, 0x0, + 0x7, 0x2c, 0x10, 0xd, 0x0, 0xe0, 0xe, 0x0, + 0x15, 0xc, 0x10, 0xd, 0x0, 0xe0, 0xe, 0x0, + 0x10, 0xd, 0x10, 0xd, 0x0, 0xe3, 0xad, 0x0, + 0x0, 0xd, 0x10, 0x4, 0x0, 0xe0, 0x33, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x7, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, + + /* U+6821 "æ ¡" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x30, 0x0, 0xa, 0x10, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x6, 0xc0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x45, 0x55, 0xc5, 0x5c, 0x70, + 0x16, 0x6e, 0x6c, 0x51, 0x31, 0x11, 0x11, 0x0, + 0x0, 0xe, 0x10, 0x0, 0xe6, 0x5, 0x50, 0x0, + 0x0, 0x2f, 0x93, 0x9, 0x60, 0x0, 0x9c, 0x10, + 0x0, 0x7f, 0x3d, 0x46, 0x0, 0x3, 0x1b, 0x60, + 0x0, 0xbd, 0x14, 0x42, 0x20, 0xa, 0xb1, 0x20, + 0x4, 0x6c, 0x10, 0x0, 0x60, 0xe, 0x20, 0x0, + 0x7, 0xc, 0x10, 0x0, 0x62, 0x78, 0x0, 0x0, + 0x22, 0xd, 0x10, 0x0, 0xa, 0xc0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x1c, 0xc1, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x3, 0xa2, 0x5e, 0x82, 0x0, + 0x0, 0xd, 0x23, 0x75, 0x0, 0x1, 0x9f, 0xb1, + 0x0, 0x2, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+682A "æ ª" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x40, 0x0, 0x1, 0xc2, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x6, 0x80, 0xd0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0xa, 0x50, 0xd0, 0x3, 0x0, + 0x5, 0x6e, 0x7d, 0x2c, 0x66, 0xe6, 0x79, 0x10, + 0x1, 0xe, 0x10, 0x46, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x2f, 0x20, 0x50, 0x0, 0xd0, 0x0, 0x10, + 0x0, 0x7f, 0xa7, 0x56, 0x66, 0xe6, 0x68, 0xc1, + 0x0, 0xbd, 0x2d, 0x0, 0x1e, 0xd5, 0x0, 0x0, + 0x4, 0x6d, 0x10, 0x0, 0x88, 0xd7, 0x10, 0x0, + 0x8, 0xd, 0x10, 0x2, 0xc0, 0xd1, 0xa0, 0x0, + 0x22, 0xd, 0x10, 0xb, 0x10, 0xd0, 0x96, 0x0, + 0x0, 0xd, 0x10, 0x83, 0x0, 0xd0, 0xd, 0xa1, + 0x0, 0xd, 0x16, 0x20, 0x0, 0xd0, 0x2, 0x71, + 0x0, 0xd, 0x20, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, + + /* U+6839 "æ ¹" */ + 0x0, 0xa, 0x30, 0x2, 0x0, 0x0, 0x40, 0x0, + 0x0, 0xd, 0x10, 0x1e, 0x66, 0x66, 0xe4, 0x0, + 0x0, 0xc, 0x10, 0xd, 0x0, 0x0, 0xe0, 0x0, + 0x2, 0x2d, 0x37, 0x2d, 0x0, 0x0, 0xe0, 0x0, + 0x14, 0x4e, 0x44, 0x2e, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0x1f, 0x20, 0xd, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x6f, 0x95, 0xe, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0xad, 0x2e, 0xd, 0x6, 0x0, 0x56, 0x0, + 0x2, 0x7c, 0x13, 0xd, 0x6, 0x0, 0xca, 0x10, + 0x7, 0xd, 0x10, 0xd, 0x5, 0x58, 0x30, 0x0, + 0x22, 0xd, 0x10, 0xd, 0x0, 0xb0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0xd, 0x0, 0x6a, 0x0, 0x0, + 0x0, 0xd, 0x10, 0xd, 0x37, 0x19, 0xd4, 0x0, + 0x0, 0xd, 0x10, 0x2f, 0x80, 0x0, 0x7f, 0x90, + 0x0, 0x5, 0x0, 0x4, 0x0, 0x0, 0x1, 0x0, + + /* U+683C "æ ¼" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x30, 0x0, 0xc6, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x1, 0xe0, 0x0, 0x20, 0x0, + 0x0, 0xd, 0x0, 0x8, 0xb6, 0x67, 0xe2, 0x0, + 0x5, 0x6e, 0x6c, 0x39, 0x60, 0x9, 0x60, 0x0, + 0x0, 0xf, 0x0, 0x71, 0x27, 0x4c, 0x0, 0x0, + 0x0, 0x3f, 0x21, 0x10, 0x9, 0xd1, 0x0, 0x0, + 0x0, 0x8f, 0x77, 0x0, 0x1c, 0xc4, 0x0, 0x0, + 0x0, 0xad, 0xc, 0x3, 0xa1, 0x1c, 0xa4, 0x0, + 0x3, 0x5d, 0x0, 0x79, 0x0, 0x0, 0x9d, 0xa1, + 0x7, 0xd, 0x25, 0xd, 0x66, 0x66, 0xf1, 0x0, + 0x22, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xe, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0x7, 0x0, 0x7, 0x0, 0x0, 0x50, 0x0, + + /* U+6843 "桃" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x30, 0x0, 0xa4, 0x2c, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xd0, 0x1b, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0x1b, 0x0, 0x0, + 0x5, 0x6e, 0x79, 0x50, 0xc0, 0x1b, 0xc, 0x20, + 0x0, 0xe, 0x0, 0x75, 0xc0, 0x1b, 0x66, 0x0, + 0x0, 0x2f, 0x20, 0x49, 0xc0, 0x1d, 0x40, 0x0, + 0x0, 0x7f, 0x87, 0x1, 0xc0, 0x1b, 0x0, 0x0, + 0x0, 0xbe, 0xc, 0x0, 0xd0, 0x1d, 0x60, 0x0, + 0x2, 0x8d, 0x0, 0x28, 0xe0, 0x1b, 0x5e, 0x20, + 0x8, 0xd, 0x6, 0xc0, 0xe0, 0x1b, 0x5, 0x40, + 0x23, 0xd, 0x2, 0x13, 0xa0, 0x1b, 0x0, 0x10, + 0x0, 0xd, 0x0, 0x9, 0x40, 0x1b, 0x0, 0x50, + 0x0, 0xd, 0x0, 0x3a, 0x0, 0x1c, 0x2, 0x80, + 0x0, 0xd, 0x2, 0x90, 0x0, 0xc, 0xcd, 0xa0, + 0x0, 0x8, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6848 "案" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1a, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x4, 0x50, 0x0, 0x4, 0x0, + 0x0, 0x69, 0x66, 0x7c, 0x66, 0x66, 0x6e, 0x30, + 0x1, 0xd1, 0x0, 0x97, 0x0, 0x0, 0x46, 0x0, + 0x0, 0x66, 0x68, 0xc6, 0x66, 0xa6, 0x7b, 0x40, + 0x0, 0x0, 0x1c, 0x10, 0x6, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x15, 0x67, 0xae, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6a, 0x63, 0x9e, 0x70, 0x0, + 0x0, 0x25, 0x66, 0x23, 0xa0, 0x1, 0x81, 0x0, + 0x2, 0x66, 0x66, 0x67, 0xd6, 0x66, 0x6c, 0xb0, + 0x0, 0x0, 0x0, 0x9a, 0xb7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x82, 0xb1, 0xa2, 0x0, 0x0, + 0x0, 0x2, 0xa4, 0x3, 0xb0, 0x1b, 0xb5, 0x30, + 0x2, 0x66, 0x0, 0x3, 0xc0, 0x0, 0x5c, 0xb1, + 0x3, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, + + /* U+689D "æ¢" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd2, 0x0, 0x1d, 0x20, 0x0, 0x0, + 0x0, 0x5, 0xb0, 0x0, 0x69, 0x0, 0x1, 0x0, + 0x0, 0xb, 0x40, 0x0, 0xc8, 0x66, 0xac, 0x0, + 0x0, 0x2d, 0x9, 0x4, 0x78, 0x2, 0xd1, 0x0, + 0x0, 0x9e, 0xd, 0x8, 0x5, 0x8c, 0x20, 0x0, + 0x2, 0x8d, 0xc, 0x10, 0x3, 0xea, 0x0, 0x0, + 0x7, 0xd, 0xc, 0x0, 0x68, 0x6, 0xe9, 0x51, + 0x0, 0xd, 0xc, 0x36, 0x20, 0xb3, 0x17, 0x80, + 0x0, 0xd, 0xc, 0x0, 0x0, 0xd0, 0x6, 0x20, + 0x0, 0xd, 0xd, 0x57, 0x66, 0xe6, 0x66, 0x40, + 0x0, 0xd, 0xd, 0x2, 0xa0, 0xd0, 0x40, 0x0, + 0x0, 0xd, 0x4, 0xa, 0x50, 0xd0, 0x4c, 0x20, + 0x0, 0xd, 0x0, 0x66, 0x0, 0xd0, 0x7, 0xc0, + 0x0, 0xe, 0x3, 0x40, 0x6b, 0xe0, 0x0, 0x50, + 0x0, 0x5, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, + + /* U+68B0 "械" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0xa4, 0x62, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0xa2, 0x1e, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0xa2, 0x4, 0x10, + 0x5, 0x6e, 0x97, 0x76, 0x66, 0xc7, 0x68, 0x80, + 0x1, 0x1d, 0x0, 0x51, 0x50, 0x93, 0x0, 0x0, + 0x0, 0x3e, 0x91, 0x93, 0xb2, 0x93, 0x8, 0x50, + 0x0, 0x8e, 0x4a, 0x92, 0xb0, 0x74, 0xd, 0x30, + 0x0, 0xad, 0x18, 0xb7, 0xd9, 0x86, 0x3b, 0x0, + 0x4, 0x5d, 0x1, 0xa1, 0xb0, 0x49, 0xa3, 0x0, + 0x7, 0xd, 0x0, 0xb0, 0xb0, 0x1d, 0xb0, 0x0, + 0x21, 0xd, 0x0, 0xa0, 0xb0, 0xe, 0x40, 0x40, + 0x0, 0xd, 0x4, 0x50, 0xc0, 0x98, 0xb0, 0x70, + 0x0, 0xe, 0x8, 0x0, 0x68, 0x30, 0x8a, 0xa0, + 0x0, 0xe, 0x31, 0x2, 0x71, 0x0, 0x8, 0xe0, + 0x0, 0x3, 0x0, 0x2, 0x0, 0x0, 0x0, 0x10, + + /* U+68EE "森" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x65, 0x0, + 0x3, 0x76, 0x66, 0xcf, 0xb7, 0x66, 0x65, 0x0, + 0x0, 0x0, 0x4, 0xcb, 0x49, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4b, 0x1a, 0x32, 0xc3, 0x0, 0x0, + 0x0, 0x6, 0x80, 0xa, 0x40, 0x3d, 0xc6, 0x10, + 0x2, 0x63, 0xa1, 0xb, 0x40, 0xd3, 0x6a, 0x30, + 0x1, 0x0, 0xd0, 0x52, 0x0, 0xd0, 0x6, 0x0, + 0x6, 0x68, 0xf6, 0x64, 0x6b, 0xf9, 0x67, 0x30, + 0x0, 0x9, 0xf6, 0x0, 0xd, 0xe7, 0x0, 0x0, + 0x0, 0x39, 0xd4, 0xd0, 0x95, 0xd3, 0xa0, 0x0, + 0x0, 0x90, 0xd0, 0x45, 0x70, 0xd0, 0x99, 0x0, + 0x6, 0x0, 0xd0, 0x36, 0x0, 0xd0, 0xc, 0x80, + 0x10, 0x0, 0xe0, 0x20, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x60, 0x0, 0x0, 0x60, 0x0, 0x0, + + /* U+691C "検" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x40, 0x0, 0x9, 0x90, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x1e, 0x80, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0xa6, 0x1a, 0x20, 0x0, + 0x14, 0x4d, 0x5b, 0x16, 0x70, 0x1, 0xc9, 0x30, + 0x2, 0x2e, 0x32, 0x66, 0x66, 0x66, 0xc9, 0x90, + 0x0, 0x2f, 0x41, 0x20, 0x0, 0xc0, 0x0, 0x0, + 0x0, 0x7f, 0x99, 0xb, 0x66, 0xd6, 0x6c, 0x10, + 0x0, 0xbd, 0x1c, 0xd, 0x1, 0xb0, 0xd, 0x0, + 0x2, 0x7c, 0x10, 0xd, 0x2, 0xa0, 0xd, 0x0, + 0x7, 0xd, 0x10, 0xe, 0x68, 0xd6, 0x6d, 0x0, + 0x23, 0xd, 0x10, 0x4, 0x9, 0x95, 0x1, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x2c, 0xa, 0x30, 0x0, + 0x0, 0xd, 0x10, 0x1, 0xb2, 0x1, 0xc6, 0x0, + 0x0, 0xd, 0x10, 0x39, 0x10, 0x0, 0x1c, 0xb1, + 0x0, 0x6, 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+695A "楚" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x2c, 0x0, 0x0, 0x0, + 0x0, 0xd0, 0x10, 0x2, 0xb0, 0x0, 0x0, 0x66, + 0x6e, 0x6a, 0x36, 0x9c, 0x69, 0x60, 0x0, 0xa, + 0xe4, 0x0, 0x1e, 0xc1, 0x0, 0x0, 0x4, 0xad, + 0x5a, 0xa, 0x5b, 0x88, 0x0, 0x1, 0xa0, 0xd0, + 0x48, 0x42, 0xb0, 0xa5, 0x1, 0x70, 0xe, 0x6, + 0x20, 0x2b, 0x0, 0x0, 0x14, 0x66, 0x76, 0x66, + 0x66, 0x66, 0xa3, 0x0, 0x11, 0x0, 0x0, 0xd0, + 0x0, 0x48, 0x20, 0x0, 0x5, 0xc0, 0xd, 0x0, + 0x3, 0x0, 0x0, 0x0, 0xa6, 0x0, 0xd6, 0x66, + 0x87, 0x0, 0x0, 0x1c, 0x80, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x33, 0x91, 0xd0, 0x0, 0x0, + 0x0, 0x4, 0x60, 0x3, 0xce, 0x54, 0x34, 0x46, + 0x42, 0x60, 0x0, 0x0, 0x5a, 0xce, 0xff, 0xc0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+696D "業" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x42, 0x0, 0xc1, 0xc, 0x30, 0x50, 0x0, + 0x0, 0xb, 0x80, 0xd0, 0xd, 0xa, 0x90, 0x0, + 0x0, 0x1, 0xd0, 0xd0, 0xd, 0x63, 0x0, 0x0, + 0x4, 0x66, 0x66, 0xd6, 0x6d, 0x66, 0x6a, 0xa0, + 0x0, 0x0, 0x19, 0x20, 0x6, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x90, 0x8, 0x0, 0x61, 0x0, + 0x0, 0x26, 0x66, 0x6a, 0x76, 0x66, 0x95, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x30, 0x5, 0x30, 0x0, + 0x0, 0x5, 0x66, 0x6c, 0x76, 0x66, 0x50, 0x0, + 0x3, 0x66, 0x66, 0x6c, 0x85, 0x55, 0x6d, 0x30, + 0x0, 0x0, 0x1, 0xce, 0x57, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x4a, 0x34, 0xa2, 0x0, 0x0, + 0x0, 0x6, 0xa1, 0xa, 0x30, 0x3c, 0xc7, 0x41, + 0x4, 0x73, 0x0, 0xa, 0x30, 0x0, 0x5b, 0x90, + 0x1, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, + + /* U+6975 "極" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x16, 0x66, 0x66, 0xb4, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, + 0x15, 0x5e, 0x7a, 0x0, 0x0, 0xc2, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x86, 0x92, 0xc4, 0x66, 0x90, + 0x0, 0x2f, 0x40, 0xc0, 0xc0, 0xc0, 0x7, 0x60, + 0x0, 0x6f, 0x6a, 0xc0, 0xc0, 0xc4, 0x1c, 0x10, + 0x0, 0xbe, 0xa, 0xc0, 0xc0, 0xc0, 0x9b, 0x0, + 0x2, 0x9d, 0x0, 0xc0, 0xc0, 0xc0, 0x7c, 0x0, + 0x7, 0x1d, 0x0, 0xc6, 0xd0, 0xc0, 0x96, 0x90, + 0x14, 0xd, 0x0, 0xc0, 0x50, 0xc5, 0x20, 0x80, + 0x0, 0xd, 0x0, 0x20, 0x55, 0xc3, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, + 0x0, 0xd, 0x5, 0x66, 0x66, 0x66, 0x69, 0xd1, + 0x0, 0x6, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+697D "楽" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x7, 0x3, 0x0, 0x2, 0x0, 0x8, + 0xa1, 0xd6, 0x66, 0xd4, 0xa, 0x90, 0x0, 0x9, + 0x6c, 0x0, 0xc, 0x18, 0x30, 0x0, 0x0, 0x0, + 0xc6, 0x66, 0xd4, 0x20, 0x0, 0x0, 0x5, 0x5d, + 0x0, 0xc, 0x15, 0xb9, 0x10, 0x8b, 0x20, 0xd6, + 0x66, 0xd1, 0x0, 0x8a, 0x2, 0x0, 0xa, 0x6, + 0x28, 0x0, 0x0, 0x10, 0x56, 0x66, 0x66, 0xd7, + 0x66, 0x69, 0xe2, 0x1, 0x0, 0x0, 0xcf, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa6, 0xc1, 0xa2, + 0x0, 0x0, 0x0, 0x1, 0xa4, 0xc, 0x11, 0xc7, + 0x10, 0x0, 0x4, 0x81, 0x0, 0xc1, 0x0, 0x9f, + 0xb6, 0x26, 0x30, 0x0, 0xc, 0x10, 0x0, 0x26, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, + + /* U+6982 "概" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x0, 0xb6, 0xc4, 0x66, 0x97, 0x80, + 0x0, 0xc, 0x0, 0xc0, 0xb0, 0x0, 0xc0, 0x0, + 0x4, 0x5d, 0x95, 0xc0, 0xb0, 0x93, 0xc0, 0x0, + 0x1, 0x1d, 0x10, 0xd6, 0xc0, 0xb0, 0xc0, 0x0, + 0x0, 0x4e, 0x30, 0xc0, 0xb1, 0xa1, 0xb0, 0x0, + 0x0, 0x8e, 0x97, 0xc0, 0xb7, 0xb7, 0xc8, 0xb0, + 0x0, 0xbc, 0x1a, 0xd6, 0xb1, 0x16, 0x70, 0x0, + 0x3, 0x6c, 0x0, 0xc2, 0x10, 0xb, 0xe1, 0x0, + 0x8, 0xc, 0x0, 0xc0, 0xa1, 0x1b, 0xc0, 0x0, + 0x23, 0xc, 0x0, 0xc4, 0x98, 0x94, 0xc0, 0x0, + 0x0, 0xc, 0x0, 0xf6, 0x4, 0x90, 0xc0, 0x50, + 0x0, 0xd, 0x0, 0x40, 0x1a, 0x0, 0xc0, 0x80, + 0x0, 0xd, 0x0, 0x3, 0x70, 0x0, 0x9b, 0xd2, + 0x0, 0x4, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, + + /* U+69CB "æ§‹" */ + 0x0, 0x0, 0x0, 0x0, 0x20, 0x1, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x95, 0x8, 0x70, 0x0, + 0x0, 0xc, 0x0, 0x56, 0xb7, 0x6b, 0x8c, 0x70, + 0x0, 0xc, 0x0, 0x0, 0x92, 0x8, 0x41, 0x0, + 0x2, 0x2c, 0x29, 0x36, 0xb7, 0x6b, 0x9c, 0x20, + 0x4, 0x4d, 0x44, 0x20, 0x92, 0x8, 0x42, 0x40, + 0x0, 0x3e, 0x73, 0x66, 0x76, 0xc7, 0x67, 0x70, + 0x0, 0x7d, 0x78, 0x3, 0x0, 0xc0, 0x5, 0x0, + 0x0, 0xbc, 0x16, 0x1d, 0x66, 0xd6, 0x6d, 0x0, + 0x3, 0x8c, 0x0, 0xd, 0x66, 0xd6, 0x6c, 0x0, + 0x8, 0xc, 0x0, 0xb, 0x0, 0xc0, 0xc, 0x0, + 0x23, 0xc, 0x5, 0x6d, 0x66, 0xd6, 0x6e, 0xc1, + 0x0, 0xc, 0x0, 0xb, 0x0, 0x0, 0xc, 0x0, + 0x0, 0xc, 0x0, 0xb, 0x0, 0x0, 0xc, 0x0, + 0x0, 0xd, 0x0, 0x1b, 0x0, 0x7, 0xd9, 0x0, + 0x0, 0x2, 0x0, 0x2, 0x0, 0x0, 0x30, 0x0, + + /* U+69D8 "様" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x20, 0x0, 0x92, 0x0, 0xb5, 0x0, + 0x0, 0xc, 0x0, 0x0, 0x3d, 0x1, 0x91, 0x0, + 0x0, 0xc, 0x0, 0x26, 0x69, 0x98, 0x69, 0x80, + 0x2, 0x2c, 0x28, 0x0, 0x0, 0xd0, 0x1, 0x0, + 0x4, 0x4d, 0x44, 0x15, 0x66, 0xe6, 0x6b, 0x10, + 0x0, 0x1f, 0x70, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x5f, 0x5a, 0x46, 0x66, 0xd6, 0x69, 0xb0, + 0x0, 0xad, 0x7, 0x0, 0x0, 0xb3, 0x3, 0x0, + 0x1, 0x9c, 0x2, 0x66, 0x92, 0xd3, 0x1c, 0x40, + 0x7, 0x1c, 0x0, 0x0, 0xd2, 0xd7, 0x60, 0x0, + 0x23, 0xc, 0x0, 0x5, 0x80, 0xd2, 0x80, 0x0, + 0x0, 0xc, 0x0, 0xb, 0x0, 0xd0, 0xa6, 0x0, + 0x0, 0xc, 0x0, 0x92, 0x0, 0xd0, 0xd, 0xa0, + 0x0, 0xd, 0x6, 0x10, 0x7d, 0xd0, 0x1, 0x20, + 0x0, 0x2, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, + + /* U+6A02 "樂" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x7, 0x60, 0x1, 0xd1, 0x0, + 0x0, 0x3a, 0x0, 0x7a, 0x6a, 0x16, 0x70, 0x0, + 0x0, 0x91, 0x84, 0xc0, 0xc, 0xa, 0xa, 0x30, + 0x5, 0x84, 0xd2, 0xc0, 0xc, 0x76, 0x4b, 0x0, + 0x6, 0x6a, 0x40, 0xc6, 0x6c, 0x76, 0xb2, 0x0, + 0x0, 0x18, 0x20, 0xc0, 0xc, 0x3, 0x73, 0x0, + 0x0, 0x80, 0x64, 0xc6, 0x6c, 0x9, 0x7, 0x50, + 0x8, 0xd9, 0x6c, 0x92, 0x17, 0x9c, 0x85, 0xd0, + 0x0, 0x0, 0x4, 0x6, 0xa0, 0x10, 0x9, 0x30, + 0x6, 0x76, 0x66, 0xaf, 0xb8, 0x66, 0x67, 0x40, + 0x0, 0x0, 0x4, 0xd8, 0x77, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x6a, 0x16, 0x70, 0xb5, 0x0, 0x0, + 0x0, 0x29, 0x50, 0x6, 0x70, 0xa, 0xd8, 0x50, + 0x5, 0x50, 0x0, 0x6, 0x70, 0x0, 0x4b, 0x50, + 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, + + /* U+6A19 "標" */ + 0x0, 0x9, 0x30, 0x0, 0x0, 0x0, 0x5, 0x30, + 0x0, 0xc, 0x0, 0x67, 0x6c, 0x6c, 0x66, 0x50, + 0x0, 0xc, 0x0, 0x0, 0xb, 0xb, 0x1, 0x0, + 0x16, 0x6d, 0x6c, 0x5b, 0x5c, 0x5c, 0x5d, 0x30, + 0x0, 0xf, 0x0, 0x1a, 0xb, 0xb, 0xc, 0x0, + 0x0, 0x4f, 0x60, 0x1a, 0xb, 0xb, 0xc, 0x0, + 0x0, 0x9f, 0x69, 0x2c, 0x66, 0x66, 0x69, 0x0, + 0x0, 0xac, 0x9, 0x5, 0x66, 0x66, 0x87, 0x0, + 0x6, 0x3c, 0x0, 0x1, 0x0, 0x0, 0x0, 0x20, + 0x6, 0xc, 0x1, 0x86, 0x66, 0x96, 0x66, 0xa1, + 0x20, 0xc, 0x0, 0x5, 0x50, 0xb2, 0x20, 0x0, + 0x0, 0xc, 0x0, 0x2c, 0x20, 0xb0, 0x69, 0x0, + 0x0, 0xc, 0x3, 0x90, 0x0, 0xb0, 0x9, 0x90, + 0x0, 0xc, 0x25, 0x0, 0x5a, 0xb0, 0x0, 0x50, + 0x0, 0x5, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, + + /* U+6A21 "模" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x30, 0x0, 0xc2, 0xd, 0x20, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xd0, 0xd, 0x5, 0x30, + 0x0, 0xd, 0x2, 0x66, 0xe6, 0x6e, 0x66, 0x50, + 0x16, 0x6e, 0x6d, 0x20, 0xa0, 0x9, 0x0, 0x0, + 0x0, 0x1f, 0x0, 0xd, 0x66, 0x66, 0xa8, 0x0, + 0x0, 0x4f, 0x30, 0xd, 0x0, 0x0, 0x85, 0x0, + 0x0, 0x9f, 0x79, 0xd, 0x66, 0x66, 0xb5, 0x0, + 0x0, 0xad, 0xd, 0xd, 0x0, 0x0, 0x85, 0x0, + 0x6, 0x3d, 0x1, 0xe, 0x6b, 0x86, 0xa4, 0x0, + 0x6, 0xd, 0x0, 0x1, 0xa, 0x30, 0x2, 0x30, + 0x20, 0xd, 0x6, 0x76, 0x6e, 0x96, 0x67, 0x80, + 0x0, 0xd, 0x0, 0x0, 0x4a, 0x36, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x1, 0xc1, 0x7, 0x91, 0x0, + 0x0, 0xd, 0x0, 0x49, 0x20, 0x0, 0x7f, 0xa0, + 0x0, 0x5, 0x14, 0x20, 0x0, 0x0, 0x2, 0x0, + + /* U+6A23 "樣" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x30, 0x0, 0x92, 0x5, 0xa0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x39, 0x7, 0x16, 0x0, + 0x0, 0xd, 0x0, 0x56, 0x66, 0xd6, 0x66, 0x10, + 0x16, 0x6e, 0x6c, 0x36, 0x66, 0xd6, 0x89, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x10, + 0x0, 0x5f, 0x60, 0x66, 0x66, 0xa6, 0x67, 0x90, + 0x0, 0xaf, 0x5b, 0x0, 0x5, 0xc1, 0x0, 0x0, + 0x1, 0xad, 0x9, 0x0, 0x0, 0x70, 0x0, 0x0, + 0x7, 0x3d, 0x0, 0x16, 0x66, 0xe1, 0xd, 0x20, + 0x6, 0xd, 0x3, 0x66, 0x83, 0xd5, 0x83, 0x0, + 0x20, 0xd, 0x0, 0x2, 0xd2, 0xc7, 0x30, 0x0, + 0x0, 0xd, 0x0, 0xb, 0x30, 0xc0, 0xc2, 0x0, + 0x0, 0xd, 0x0, 0x84, 0x0, 0xd0, 0x2e, 0x71, + 0x0, 0xd, 0x17, 0x20, 0x6b, 0xd0, 0x2, 0x50, + 0x0, 0x4, 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, + + /* U+6A2A "横" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x4, 0x90, 0xc, 0x20, 0x0, + 0x0, 0xd, 0x0, 0x3, 0x90, 0xd, 0x6, 0x0, + 0x0, 0xd, 0x2, 0x68, 0xb6, 0x6e, 0x66, 0x10, + 0x16, 0x6e, 0x87, 0x3, 0x90, 0xd, 0x0, 0x10, + 0x0, 0x3e, 0x7, 0x66, 0x89, 0x69, 0x67, 0x80, + 0x0, 0x6e, 0x10, 0x10, 0xa, 0x10, 0x2, 0x0, + 0x0, 0xad, 0x95, 0xc6, 0x6c, 0x66, 0x7c, 0x0, + 0x0, 0xad, 0x1b, 0xb0, 0xa, 0x10, 0x39, 0x0, + 0x6, 0x3d, 0x0, 0xb6, 0x6c, 0x66, 0x79, 0x0, + 0x8, 0xd, 0x0, 0xb0, 0xa, 0x10, 0x39, 0x0, + 0x21, 0xd, 0x0, 0xc6, 0x6b, 0x66, 0x79, 0x0, + 0x0, 0xd, 0x0, 0x71, 0x80, 0x14, 0x11, 0x0, + 0x0, 0xd, 0x0, 0x1c, 0x60, 0x2, 0xb5, 0x0, + 0x0, 0xe, 0x3, 0x82, 0x0, 0x0, 0xd, 0x40, + 0x0, 0x5, 0x13, 0x0, 0x0, 0x0, 0x1, 0x20, + + /* U+6A39 "樹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x4, 0x90, 0x0, 0xb, 0x10, + 0x0, 0xd, 0x0, 0x4, 0x81, 0x40, 0xc, 0x0, + 0x0, 0xd, 0x4, 0x68, 0xb6, 0x50, 0xc, 0x0, + 0x6, 0x6e, 0x86, 0x3, 0x81, 0x2, 0x2c, 0x70, + 0x0, 0x1d, 0x0, 0x66, 0x88, 0x54, 0x4d, 0x41, + 0x0, 0x4e, 0x10, 0x76, 0x69, 0x10, 0xc, 0x0, + 0x0, 0x9e, 0xa5, 0xc0, 0xc, 0x18, 0xc, 0x0, + 0x0, 0xbd, 0x18, 0xc0, 0xc, 0xa, 0x4c, 0x0, + 0x5, 0x5d, 0x0, 0xc6, 0x6b, 0x5, 0x3c, 0x0, + 0x8, 0xd, 0x0, 0x50, 0xb, 0x20, 0xc, 0x0, + 0x21, 0xd, 0x0, 0x75, 0x29, 0x0, 0xc, 0x0, + 0x0, 0xd, 0x0, 0x25, 0x74, 0x50, 0xc, 0x0, + 0x0, 0xd, 0x7, 0xaa, 0x72, 0x0, 0xc, 0x0, + 0x0, 0xe, 0x5, 0x20, 0x0, 0x17, 0xdc, 0x0, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, + + /* U+6A4B "æ©‹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x2, 0x6a, 0xf6, 0x0, + 0x0, 0xd, 0x0, 0x35, 0x6d, 0x61, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x12, 0x3d, 0x22, 0x26, 0x30, + 0x6, 0x6e, 0x87, 0x34, 0xc5, 0x49, 0x44, 0x30, + 0x0, 0x1e, 0x0, 0x8, 0x60, 0x2, 0xb6, 0x0, + 0x0, 0x5e, 0x10, 0x76, 0xb6, 0x6b, 0x78, 0xc2, + 0x0, 0x9e, 0xa7, 0x2, 0x90, 0x9, 0x40, 0x0, + 0x0, 0xbd, 0x18, 0x2, 0x96, 0x69, 0x20, 0x0, + 0x5, 0x4d, 0x0, 0xc5, 0x55, 0x55, 0x56, 0xd0, + 0x7, 0xd, 0x0, 0xd0, 0x66, 0x69, 0x31, 0xa0, + 0x21, 0xd, 0x0, 0xd0, 0xb0, 0xc, 0x11, 0xa0, + 0x0, 0xd, 0x0, 0xd0, 0xb6, 0x6d, 0x1, 0xa0, + 0x0, 0xd, 0x0, 0xd0, 0x40, 0x2, 0x2, 0xa0, + 0x0, 0xe, 0x0, 0xd0, 0x0, 0x4, 0x9d, 0x80, + 0x0, 0x4, 0x0, 0x40, 0x0, 0x0, 0x4, 0x0, + + /* U+6A5F "機" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x10, 0x8, 0x40, 0xd2, 0x49, 0x0, + 0x0, 0xd, 0x0, 0xb, 0x10, 0xd0, 0x93, 0x0, + 0x0, 0xd, 0x20, 0x62, 0x97, 0xc3, 0x65, 0x90, + 0x6, 0x6e, 0xa7, 0xda, 0xc0, 0xcb, 0xad, 0x20, + 0x0, 0x1d, 0x0, 0x8, 0x30, 0xc1, 0x45, 0x0, + 0x0, 0x4e, 0x10, 0x53, 0x55, 0xc2, 0x62, 0x90, + 0x0, 0x8e, 0xa5, 0xc7, 0x49, 0xc9, 0xa5, 0xb0, + 0x0, 0xad, 0x18, 0x9, 0x20, 0xb0, 0x65, 0x0, + 0x3, 0x5d, 0x2, 0x6d, 0x66, 0xd6, 0x6c, 0xd2, + 0x7, 0xd, 0x0, 0xc, 0x0, 0x92, 0x1, 0x0, + 0x13, 0xd, 0x0, 0xd, 0x0, 0x75, 0xe, 0x30, + 0x0, 0xd, 0x0, 0x38, 0xa3, 0x2b, 0xa9, 0x0, + 0x0, 0xd, 0x0, 0x91, 0x14, 0xd, 0xb0, 0x32, + 0x0, 0xd, 0x4, 0x60, 0x4, 0x94, 0xc8, 0x72, + 0x0, 0xd, 0x35, 0x0, 0x52, 0x0, 0x7, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B21 "次" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x10, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, 0xa, + 0x40, 0x0, 0xf, 0x20, 0x0, 0x0, 0x0, 0x2f, + 0x23, 0x4, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x91, + 0x50, 0xa9, 0x66, 0x66, 0xb5, 0x0, 0x0, 0x42, + 0x1b, 0x3, 0x0, 0x1d, 0x50, 0x0, 0x7, 0x8, + 0x20, 0xc6, 0x6, 0x20, 0x0, 0x2, 0x52, 0x70, + 0xd, 0x40, 0x10, 0x0, 0x0, 0x80, 0x60, 0x0, + 0xd5, 0x0, 0x0, 0x1, 0x38, 0x0, 0x0, 0x3a, + 0x60, 0x0, 0x0, 0x4d, 0x40, 0x0, 0x8, 0x52, + 0x60, 0x0, 0x0, 0x94, 0x0, 0x0, 0xc0, 0xa, + 0x0, 0x0, 0xa, 0x50, 0x0, 0x93, 0x0, 0x5a, + 0x0, 0x0, 0xc7, 0x0, 0x75, 0x0, 0x0, 0xba, + 0x0, 0x3, 0x21, 0x83, 0x0, 0x0, 0x0, 0xcb, + 0x10, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B32 "欲" */ + 0x0, 0x3, 0x1, 0x0, 0x3, 0xa0, 0x0, 0x0, + 0x0, 0x4d, 0x3, 0xa2, 0x6, 0x90, 0x0, 0x0, + 0x1, 0xb1, 0x0, 0x6a, 0xa, 0x20, 0x0, 0x0, + 0x8, 0x10, 0xb3, 0x2, 0xd, 0x66, 0x69, 0xb0, + 0x10, 0x4, 0xe2, 0x0, 0x54, 0x10, 0xa, 0x20, + 0x0, 0xc, 0x27, 0xc2, 0x70, 0xd4, 0x31, 0x0, + 0x0, 0x93, 0x0, 0x5a, 0x10, 0xc4, 0x0, 0x0, + 0x6, 0x40, 0x0, 0x10, 0x0, 0xc5, 0x0, 0x0, + 0x21, 0xb6, 0x66, 0xe0, 0x2, 0xa7, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0xc0, 0x6, 0x68, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0xc0, 0xb, 0x15, 0x60, 0x0, + 0x0, 0xc0, 0x0, 0xc0, 0x48, 0x0, 0xd0, 0x0, + 0x0, 0xc6, 0x66, 0xd1, 0xa0, 0x0, 0x7c, 0x10, + 0x0, 0x70, 0x0, 0x57, 0x0, 0x0, 0xc, 0xb1, + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+6B4C "æ­Œ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x40, 0x78, 0x0, 0x0, + 0x4, 0x76, 0x66, 0x6d, 0x61, 0xb4, 0x0, 0x0, + 0x0, 0x66, 0x68, 0xc, 0x0, 0xc0, 0x0, 0x0, + 0x0, 0x84, 0xb, 0xc, 0x5, 0x96, 0x66, 0xe3, + 0x0, 0x88, 0x6b, 0xc, 0x8, 0x5, 0x5, 0x60, + 0x0, 0x72, 0x6, 0x1b, 0x31, 0xf, 0x13, 0x0, + 0x6, 0x66, 0x66, 0x68, 0xb0, 0x1f, 0x10, 0x0, + 0x1, 0x0, 0x0, 0x3a, 0x0, 0x3b, 0x40, 0x0, + 0x1, 0xc6, 0x6c, 0x3a, 0x0, 0x68, 0x70, 0x0, + 0x0, 0xd0, 0xc, 0x3a, 0x0, 0xa4, 0x90, 0x0, + 0x0, 0xe6, 0x6c, 0x3a, 0x0, 0xc0, 0x64, 0x0, + 0x1, 0xb0, 0x5, 0x3a, 0x6, 0x60, 0x1c, 0x0, + 0x0, 0x0, 0x5, 0x7a, 0x29, 0x0, 0x9, 0xb0, + 0x0, 0x0, 0x1, 0xc5, 0x70, 0x0, 0x0, 0xa3, + 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, + + /* U+6B50 "æ­" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x0, 0x0, 0x16, 0x9, 0x60, 0x0, 0x0, + 0xc, 0x66, 0x66, 0x65, 0xc, 0x20, 0x0, 0x0, + 0xc, 0x6, 0x66, 0x85, 0xc, 0x0, 0x0, 0x0, + 0xc, 0x9, 0x10, 0x84, 0x5a, 0x66, 0x6d, 0x50, + 0xc, 0x9, 0x10, 0x83, 0x90, 0x51, 0x28, 0x0, + 0xc, 0xa, 0x66, 0xa5, 0x40, 0xa7, 0x30, 0x0, + 0xc, 0x3, 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0, + 0xc, 0x46, 0xc4, 0x98, 0x60, 0xc6, 0x0, 0x0, + 0xc, 0x53, 0xd0, 0xb6, 0x40, 0xe7, 0x0, 0x0, + 0xc, 0x53, 0xd0, 0xb6, 0x42, 0xc5, 0x30, 0x0, + 0xc, 0x58, 0xe0, 0xca, 0x46, 0x71, 0xa0, 0x0, + 0xc, 0x41, 0x10, 0x51, 0xc, 0x10, 0xa4, 0x0, + 0xc, 0x0, 0x0, 0x50, 0x84, 0x0, 0x3f, 0x40, + 0x9, 0x66, 0x66, 0x6a, 0x40, 0x0, 0x7, 0xc1, + 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, + + /* U+6B61 "æ­¡" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x51, 0xb0, 0x0, 0x96, 0x0, 0x0, + 0x4, 0x7a, 0x86, 0xc8, 0x80, 0xd3, 0x0, 0x0, + 0x0, 0x6, 0x20, 0x80, 0x1, 0xd0, 0x0, 0x0, + 0x2, 0x96, 0xa8, 0x6b, 0x36, 0xb6, 0x69, 0xa0, + 0x2, 0xa2, 0x9a, 0xc, 0xa, 0x22, 0x9, 0x10, + 0x2, 0xa9, 0x87, 0x68, 0x26, 0x2d, 0x22, 0x0, + 0x0, 0x2d, 0x38, 0x0, 0x20, 0x3c, 0x0, 0x0, + 0x0, 0xa9, 0x6a, 0x69, 0x60, 0x4b, 0x0, 0x0, + 0x3, 0xd3, 0xc, 0x5, 0x0, 0x78, 0x30, 0x0, + 0x5, 0x88, 0x6d, 0x66, 0x10, 0xa3, 0x70, 0x0, + 0x0, 0x88, 0x6d, 0x69, 0x0, 0xd0, 0x90, 0x0, + 0x0, 0x83, 0xc, 0x2, 0x7, 0x60, 0x48, 0x0, + 0x0, 0x88, 0x69, 0x69, 0x59, 0x0, 0xd, 0x60, + 0x0, 0x92, 0x0, 0x4, 0x70, 0x0, 0x3, 0xc2, + 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0x0, 0x0, + + /* U+6B62 "æ­¢" */ + 0x0, 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xe2, 0x0, 0xd1, 0x0, 0x4, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xd6, 0x66, 0x8a, 0x20, + 0x0, 0x0, 0xd0, 0x0, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xc1, 0x0, 0x1, 0x0, + 0x5, 0x66, 0xe6, 0x66, 0xd6, 0x66, 0x6d, 0xc0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B63 "æ­£" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, + 0x0, 0x57, 0x66, 0x66, 0x96, 0x66, 0x6b, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf2, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0xe6, 0x66, 0xd8, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, 0xb, 0x30, + 0x6, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, + + /* U+6B64 "æ­¤" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x10, 0xd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x40, 0xd, 0x0, 0xd, 0x0, 0x7, 0x10, + 0x0, 0xd3, 0xd, 0x0, 0xd, 0x0, 0x8e, 0x40, + 0x0, 0xc0, 0xd, 0x6b, 0x6d, 0x19, 0x60, 0x0, + 0x0, 0xc0, 0xd, 0x0, 0xd, 0x60, 0x0, 0x0, + 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xc0, 0xd, 0x3, 0x3d, 0x0, 0x0, 0x50, + 0x0, 0xc0, 0x4d, 0x72, 0xd, 0x0, 0x0, 0x70, + 0x17, 0xec, 0x60, 0x0, 0xd, 0x10, 0x4, 0xd0, + 0x2c, 0x40, 0x0, 0x0, 0x6, 0xbc, 0xcb, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B65 "æ­¥" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe1, 0x0, 0xe6, 0x66, 0xa9, 0x0, 0x0, 0xd, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0xe0, 0x0, 0x0, 0x10, 0x56, 0x6d, 0x66, + 0x6d, 0x66, 0x66, 0xbc, 0x10, 0x0, 0x0, 0x0, + 0xa1, 0x0, 0x0, 0x0, 0x0, 0x3, 0x40, 0xe, + 0x0, 0x0, 0x60, 0x0, 0x0, 0xc7, 0x0, 0xe0, + 0x0, 0xad, 0x20, 0x0, 0x69, 0x0, 0xe, 0x0, + 0x8c, 0x10, 0x0, 0x2a, 0x0, 0x0, 0xf0, 0xaa, + 0x0, 0x0, 0x17, 0x0, 0x0, 0x6, 0xc6, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x29, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x26, 0x76, 0x10, 0x0, 0x0, 0x0, + 0x3, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B69 "æ­©" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x72, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd2, 0x0, 0xe6, 0x66, 0xd2, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0xe0, 0x0, 0x3, 0x20, + 0x6, 0x76, 0xa6, 0x66, 0xb6, 0x66, 0x6a, 0x90, + 0x0, 0x0, 0x0, 0x3, 0xd0, 0x23, 0x0, 0x0, + 0x0, 0x0, 0x98, 0x2, 0xb0, 0x4, 0xb4, 0x0, + 0x0, 0x4, 0xd2, 0x2, 0xb0, 0x1, 0x5e, 0x70, + 0x0, 0x1b, 0x10, 0x2, 0xb0, 0x1d, 0xc4, 0x90, + 0x1, 0x81, 0x0, 0x3, 0xb3, 0xe9, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x8d, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6b, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x88, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B6F "æ­¯" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0xa, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe1, 0xa, 0x30, 0x2, 0x20, 0x0, + 0x0, 0x0, 0xd0, 0xa, 0x86, 0x68, 0x70, 0x0, + 0x0, 0x0, 0xd0, 0xa, 0x30, 0x0, 0x1, 0x0, + 0x5, 0x66, 0xe6, 0x6c, 0x86, 0x66, 0x6e, 0x80, + 0x1, 0x0, 0x0, 0x6, 0x30, 0x11, 0x0, 0x0, + 0x0, 0x92, 0x2a, 0x9, 0x40, 0xa9, 0x5, 0x0, + 0x0, 0xd0, 0x7, 0x59, 0x34, 0x70, 0xe, 0x10, + 0x0, 0xd1, 0x66, 0x6b, 0x8a, 0x6d, 0x4e, 0x0, + 0x0, 0xd0, 0x20, 0x9e, 0x94, 0x0, 0xe, 0x0, + 0x0, 0xd0, 0x4, 0x89, 0x39, 0xb1, 0xe, 0x0, + 0x0, 0xd0, 0x38, 0x9, 0x30, 0x98, 0xe, 0x0, + 0x0, 0xd2, 0x40, 0x8, 0x20, 0x1, 0xe, 0x0, + 0x1, 0xd6, 0x66, 0x66, 0x66, 0x66, 0x6e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+6B72 "æ­²" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0xb, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc2, 0xa, 0x76, 0x6b, 0x60, 0x0, + 0x0, 0x0, 0xc0, 0xa, 0x20, 0x0, 0x3, 0x20, + 0x7, 0x66, 0x96, 0x68, 0x86, 0x76, 0x69, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x7a, 0xa, 0x41, 0x0, + 0x0, 0x96, 0x66, 0x66, 0x9c, 0x67, 0x8c, 0x30, + 0x0, 0xa3, 0x0, 0x0, 0x2c, 0x0, 0x30, 0x0, + 0x0, 0xa4, 0x77, 0x7b, 0x1e, 0x0, 0xe7, 0x0, + 0x0, 0xb2, 0x15, 0x50, 0xb, 0x36, 0xb0, 0x0, + 0x0, 0xc1, 0xb7, 0x5a, 0x66, 0x9d, 0x20, 0x0, + 0x0, 0xd2, 0x75, 0xac, 0x11, 0xf5, 0x0, 0x10, + 0x1, 0xa3, 0x7, 0xe1, 0xb, 0xba, 0x0, 0x60, + 0x6, 0x30, 0x4a, 0x11, 0xb5, 0xa, 0xb3, 0x90, + 0x7, 0x17, 0x50, 0x68, 0x10, 0x0, 0x8f, 0xc0, + 0x20, 0x30, 0x5, 0x10, 0x0, 0x0, 0x0, 0x40, + + /* U+6B73 "æ­³" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x20, 0xa, 0x50, 0x1, 0x0, 0x0, + 0x0, 0x0, 0xc2, 0xa, 0x66, 0x6b, 0x60, 0x0, + 0x0, 0x0, 0xc0, 0xa, 0x10, 0x0, 0x6, 0x10, + 0x7, 0x66, 0x96, 0x68, 0x86, 0x76, 0x69, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x8b, 0xb, 0x41, 0x0, + 0x0, 0x96, 0x66, 0x66, 0x9c, 0x67, 0x7c, 0x30, + 0x0, 0xc1, 0x0, 0x1, 0x2b, 0x0, 0x20, 0x0, + 0x0, 0xc5, 0x77, 0x79, 0x6e, 0x0, 0xe7, 0x0, + 0x0, 0xc0, 0x5, 0x60, 0xb, 0x36, 0xc0, 0x0, + 0x0, 0xc0, 0xc6, 0x69, 0x16, 0xad, 0x20, 0x0, + 0x0, 0xc5, 0x55, 0x64, 0xa1, 0xf5, 0x0, 0x0, + 0x2, 0xa5, 0x5, 0x60, 0x3b, 0xc9, 0x0, 0x50, + 0x6, 0x30, 0x6e, 0x21, 0xa4, 0xb, 0xa1, 0x80, + 0x8, 0x0, 0x1, 0x57, 0x0, 0x0, 0x9f, 0xb0, + 0x20, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x40, + + /* U+6B77 "æ­·" */ + 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x9, 0x20, + 0x0, 0xd6, 0x66, 0x68, 0x66, 0x66, 0x67, 0x40, + 0x0, 0xd1, 0x37, 0xbb, 0x21, 0x48, 0xc8, 0x0, + 0x0, 0xd2, 0x15, 0x70, 0x3, 0x2c, 0x0, 0x0, + 0x0, 0xd4, 0x69, 0xab, 0x36, 0x6d, 0x69, 0x70, + 0x0, 0xd0, 0xe, 0x91, 0x1, 0xcc, 0x60, 0x0, + 0x0, 0xd0, 0x5a, 0x8c, 0x18, 0x4c, 0x57, 0x0, + 0x0, 0xd1, 0x75, 0x71, 0x64, 0xc, 0x9, 0x90, + 0x0, 0xc5, 0x5, 0x62, 0x35, 0x9, 0x0, 0x0, + 0x0, 0xa0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, + 0x3, 0x70, 0xd, 0x10, 0x1c, 0x66, 0xc3, 0x0, + 0x7, 0x20, 0xc, 0x0, 0x1b, 0x0, 0x0, 0x0, + 0x9, 0x0, 0xc, 0x0, 0x1b, 0x0, 0x0, 0x10, + 0x25, 0x56, 0x6d, 0x66, 0x6c, 0x66, 0x6b, 0xd1, + 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B7B "æ­»" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, + 0x7, 0x66, 0x97, 0x66, 0x69, 0x66, 0x6a, 0x80, + 0x0, 0x0, 0xd2, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0x1, 0xe0, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0x5, 0x80, 0x15, 0xc, 0x10, 0xa, 0x20, + 0x0, 0xb, 0x76, 0x9d, 0xc, 0x10, 0x9b, 0x20, + 0x0, 0x2b, 0x0, 0x87, 0xc, 0x18, 0x60, 0x0, + 0x0, 0xa8, 0x50, 0xd2, 0xc, 0x72, 0x0, 0x0, + 0x4, 0x60, 0xe3, 0xc0, 0xc, 0x10, 0x0, 0x0, + 0x15, 0x0, 0x2a, 0x40, 0xc, 0x10, 0x0, 0x10, + 0x0, 0x0, 0x4b, 0x0, 0xc, 0x10, 0x0, 0x60, + 0x0, 0x1, 0xb1, 0x0, 0xc, 0x10, 0x1, 0x70, + 0x0, 0x1a, 0x10, 0x0, 0xc, 0x41, 0x16, 0xd1, + 0x3, 0x70, 0x0, 0x0, 0x5, 0xab, 0xba, 0x70, + 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B8A "殊" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xc1, 0x0, 0x0, + 0x5, 0x66, 0x6b, 0x64, 0xc0, 0xd0, 0x0, 0x0, + 0x0, 0x3b, 0x0, 0x7, 0x70, 0xd0, 0x4, 0x0, + 0x0, 0x58, 0x0, 0xa, 0x66, 0xe6, 0x79, 0x10, + 0x0, 0x89, 0x6a, 0x38, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xb1, 0xe, 0x60, 0x0, 0xd0, 0x0, 0x20, + 0x0, 0xc0, 0x2b, 0x56, 0x68, 0xe6, 0x69, 0xb1, + 0x5, 0x88, 0x58, 0x0, 0x1e, 0xd6, 0x0, 0x0, + 0x7, 0xa, 0x94, 0x0, 0x87, 0xd7, 0x10, 0x0, + 0x10, 0x0, 0xc0, 0x2, 0xc0, 0xd2, 0x80, 0x0, + 0x0, 0x5, 0x70, 0xa, 0x10, 0xd0, 0xa5, 0x0, + 0x0, 0xa, 0x0, 0x83, 0x0, 0xd0, 0x1e, 0x70, + 0x0, 0x72, 0x7, 0x20, 0x0, 0xe0, 0x4, 0xa2, + 0x4, 0x30, 0x20, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, + + /* U+6B8B "残" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0x51, 0x0, 0x0, + 0x6, 0x67, 0x66, 0xc1, 0xa, 0x34, 0x90, 0x0, + 0x0, 0xc, 0x0, 0x0, 0xa, 0x40, 0xa5, 0x0, + 0x0, 0x39, 0x0, 0x0, 0x9, 0x40, 0x16, 0x0, + 0x0, 0x75, 0x1, 0x54, 0x6b, 0x96, 0x67, 0x20, + 0x0, 0xb6, 0x69, 0xb1, 0x8, 0x50, 0x0, 0x0, + 0x1, 0xc0, 0x7, 0x50, 0x7, 0x62, 0x4b, 0x50, + 0x6, 0x4b, 0xb, 0x26, 0x69, 0xb3, 0x13, 0x0, + 0x6, 0xa, 0x3c, 0x0, 0x3, 0xa0, 0x6c, 0x0, + 0x10, 0x0, 0x57, 0x0, 0x0, 0xe3, 0xd1, 0x0, + 0x0, 0x0, 0xb1, 0x0, 0x0, 0xbd, 0x10, 0x0, + 0x0, 0x6, 0x50, 0x0, 0x5, 0xcd, 0x10, 0x50, + 0x0, 0x37, 0x0, 0x1, 0x97, 0x6, 0xc2, 0x80, + 0x2, 0x60, 0x2, 0x56, 0x10, 0x0, 0x6e, 0xd0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x60, + + /* U+6BB5 "段" */ + 0x0, 0x0, 0x4, 0xa0, 0x10, 0x2, 0x0, 0x0, + 0x0, 0xa6, 0x86, 0x41, 0xc6, 0x6e, 0x30, 0x0, + 0x0, 0xc0, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, + 0x0, 0xc0, 0x2, 0x0, 0xd0, 0xd, 0x0, 0x0, + 0x0, 0xc6, 0x68, 0x51, 0xb0, 0xc, 0x11, 0x0, + 0x0, 0xc0, 0x0, 0x8, 0x30, 0x6, 0xaa, 0x40, + 0x0, 0xc0, 0x3, 0x45, 0x22, 0x23, 0x80, 0x0, + 0x0, 0xc6, 0x66, 0x33, 0x73, 0x38, 0xb0, 0x0, + 0x0, 0xc0, 0x0, 0x0, 0x60, 0xc, 0x30, 0x0, + 0x0, 0xc0, 0x14, 0x62, 0x17, 0x3b, 0x0, 0x0, + 0x27, 0xeb, 0x83, 0x0, 0x8, 0xc2, 0x0, 0x0, + 0x18, 0xd0, 0x0, 0x0, 0xa, 0xd3, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0x3, 0xa3, 0x2d, 0x81, 0x0, + 0x0, 0xd1, 0x4, 0x75, 0x0, 0x1, 0xaf, 0x90, + 0x0, 0x30, 0x31, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+6BCD "æ¯" */ + 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x60, 0x0, + 0x0, 0x3, 0xd6, 0x66, 0x66, 0x67, 0xe1, 0x0, + 0x0, 0x5, 0xa0, 0x2a, 0x10, 0x3, 0xb0, 0x0, + 0x0, 0x6, 0x80, 0x8, 0xa0, 0x4, 0xa0, 0x0, + 0x0, 0x8, 0x60, 0x1, 0x80, 0x5, 0x90, 0x0, + 0x16, 0x6b, 0x96, 0x66, 0x66, 0x6a, 0xbb, 0xb0, + 0x1, 0xb, 0x30, 0x20, 0x0, 0x7, 0x70, 0x0, + 0x0, 0xd, 0x10, 0x1c, 0x20, 0x8, 0x60, 0x0, + 0x0, 0xf, 0x0, 0x8, 0xb0, 0xa, 0x50, 0x0, + 0x0, 0x1d, 0x0, 0x1, 0x60, 0xb, 0x40, 0x0, + 0x0, 0x5d, 0x66, 0x66, 0x66, 0x6d, 0x8c, 0x90, + 0x0, 0x14, 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x32, 0x3e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, + + /* U+6BCE "毎" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xf6, 0x66, 0x66, 0x66, 0xbb, 0x0, + 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x83, 0x30, 0x0, 0x0, 0x3, 0x30, 0x0, + 0x5, 0x22, 0xd6, 0x68, 0xc6, 0x6b, 0x90, 0x0, + 0x0, 0x4, 0xa0, 0x5, 0x80, 0x9, 0x40, 0x0, + 0x0, 0x5, 0x80, 0x7, 0x70, 0x9, 0x42, 0x0, + 0x26, 0x6a, 0xa6, 0x6b, 0x96, 0x6c, 0x8b, 0x80, + 0x0, 0xa, 0x40, 0xa, 0x30, 0xb, 0x20, 0x0, + 0x0, 0xc, 0x20, 0xc, 0x10, 0xc, 0x20, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x0, 0xc, 0x14, 0x0, + 0x0, 0x3e, 0x66, 0x69, 0x66, 0x6e, 0x6a, 0x40, + 0x0, 0x1, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x39, 0xda, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, + + /* U+6BCF "æ¯" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xe6, 0x66, 0x66, 0x66, 0xcb, 0x0, + 0x0, 0x1d, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa4, 0x30, 0x0, 0x0, 0x4, 0x30, 0x0, + 0x6, 0x42, 0xd6, 0x77, 0x66, 0x6b, 0x80, 0x0, + 0x22, 0x3, 0xa0, 0xa, 0x80, 0x9, 0x40, 0x0, + 0x0, 0x5, 0x80, 0x1, 0xd0, 0xa, 0x32, 0x0, + 0x26, 0x6a, 0xa6, 0x66, 0x66, 0x6c, 0x8b, 0x90, + 0x0, 0x9, 0x40, 0x27, 0x0, 0xc, 0x20, 0x0, + 0x0, 0xb, 0x20, 0x8, 0xb0, 0xd, 0x10, 0x0, + 0x0, 0xd, 0x0, 0x1, 0x90, 0xe, 0x4, 0x0, + 0x0, 0x2e, 0x66, 0x66, 0x66, 0x6f, 0x6a, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x39, 0xc9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, + + /* U+6BD4 "比" */ + 0x26, 0x0, 0x0, 0x9, 0x10, 0x0, 0x0, 0x2c, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x2b, 0x0, + 0x0, 0xd, 0x0, 0x3, 0x0, 0x2b, 0x0, 0x0, + 0xd, 0x0, 0x2f, 0x60, 0x2b, 0x0, 0x0, 0xd, + 0x1, 0xc5, 0x0, 0x2d, 0x66, 0x9b, 0xd, 0xa, + 0x30, 0x0, 0x2b, 0x0, 0x0, 0xe, 0x71, 0x0, + 0x0, 0x2b, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x2b, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x2b, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x10, 0x2b, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x60, 0x2b, 0x4, 0x75, + 0xd, 0x0, 0x0, 0x80, 0x4e, 0xd6, 0x0, 0xf, + 0x21, 0x15, 0xe1, 0x9, 0x10, 0x0, 0x7, 0xbb, + 0xbb, 0x70, + + /* U+6BDB "毛" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x25, 0x9d, 0xdb, 0x20, 0x0, + 0x0, 0x35, 0x67, 0x7e, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x5, 0x60, 0x0, + 0x0, 0x23, 0x46, 0x6e, 0x66, 0x66, 0x50, 0x0, + 0x0, 0x23, 0x10, 0xd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x9, 0x40, + 0x0, 0x0, 0x23, 0x5e, 0x66, 0x66, 0x66, 0x40, + 0x6, 0x65, 0x32, 0x1d, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x40, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x70, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x1, 0xc0, + 0x0, 0x0, 0x0, 0xb, 0xdd, 0xdd, 0xdd, 0xb1, + + /* U+6C0F "æ°" */ + 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x1, + 0x0, 0x3, 0x69, 0xee, 0x80, 0x0, 0xd, 0x66, + 0x67, 0xb2, 0x0, 0x0, 0x0, 0xd, 0x0, 0x2, + 0xb0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x1, 0xc0, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, + 0x1a, 0x10, 0xe, 0x66, 0x66, 0xe6, 0x66, 0x66, + 0x30, 0xd, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x69, 0x0, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x1e, 0x10, 0x0, 0x0, 0xd, 0x0, + 0x4, 0x18, 0xb0, 0x0, 0x40, 0xd, 0x5, 0x92, + 0x0, 0xca, 0x0, 0x80, 0x1f, 0xd7, 0x0, 0x0, + 0xb, 0xd6, 0x90, 0x1d, 0x30, 0x0, 0x0, 0x0, + 0x6e, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x30, + + /* U+6C11 "æ°‘" */ + 0x3, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, + 0xb7, 0x66, 0x66, 0x66, 0x6e, 0x30, 0x0, 0xb, + 0x20, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xb2, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0xb, 0x76, + 0x66, 0xc6, 0x66, 0xe0, 0x0, 0x0, 0xb2, 0x0, + 0xd, 0x0, 0x1, 0x0, 0x0, 0xb, 0x20, 0x0, + 0xb2, 0x0, 0x0, 0x50, 0x0, 0xb7, 0x66, 0x6b, + 0x86, 0x66, 0x89, 0x30, 0xb, 0x20, 0x0, 0x58, + 0x0, 0x0, 0x0, 0x0, 0xb2, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x8, 0x80, + 0x0, 0x11, 0x0, 0xb2, 0x6, 0x50, 0xd, 0x60, + 0x5, 0x20, 0xc, 0xac, 0x30, 0x0, 0x2d, 0x91, + 0x92, 0x0, 0xc9, 0x0, 0x0, 0x0, 0x19, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x43, + 0x0, + + /* U+6C14 "æ°”" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x97, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x13, 0x0, + 0x0, 0x7, 0xb6, 0x66, 0x66, 0x66, 0xaa, 0x10, + 0x0, 0xc, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x83, 0x27, 0x66, 0x66, 0x69, 0x60, 0x0, + 0x3, 0x60, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, + 0x5, 0x7, 0x66, 0x66, 0x66, 0x8d, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xc1, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x60, + + /* U+6C17 "æ°—" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, 0x37, 0x0, + 0x0, 0x9, 0x86, 0x66, 0x66, 0x66, 0x66, 0x10, + 0x0, 0x2a, 0x46, 0x66, 0x66, 0x6a, 0x70, 0x0, + 0x0, 0xa1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x6, 0x26, 0x76, 0x66, 0x66, 0x6d, 0x50, 0x0, + 0x12, 0x0, 0x0, 0x0, 0xb5, 0xd, 0x0, 0x0, + 0x0, 0x4, 0x0, 0x4, 0xd1, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x66, 0x2d, 0x20, 0xc, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xf9, 0x0, 0xa, 0x20, 0x0, + 0x0, 0x0, 0x9, 0x7c, 0xa0, 0x8, 0x50, 0x10, + 0x0, 0x0, 0x95, 0x0, 0xd7, 0x3, 0xb0, 0x50, + 0x0, 0x18, 0x20, 0x0, 0x35, 0x0, 0xc4, 0x80, + 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, + + /* U+6C34 "æ°´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x30, 0x0, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x60, 0x2, 0xe6, 0x0, + 0x5, 0x66, 0x6d, 0x2c, 0x80, 0x2a, 0x20, 0x0, + 0x1, 0x0, 0x3c, 0xc, 0x67, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x87, 0xc, 0x2a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0xc, 0x27, 0x40, 0x0, 0x0, + 0x0, 0x5, 0x90, 0xc, 0x21, 0xd1, 0x0, 0x0, + 0x0, 0xc, 0x10, 0xc, 0x20, 0x7b, 0x0, 0x0, + 0x0, 0x76, 0x0, 0xc, 0x20, 0xb, 0xb0, 0x0, + 0x2, 0x80, 0x0, 0xc, 0x20, 0x1, 0xcd, 0x60, + 0x16, 0x0, 0x2, 0x1d, 0x20, 0x0, 0x9, 0x30, + 0x0, 0x0, 0x5, 0xde, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + + /* U+6C37 "æ°·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x5, + 0x20, 0x0, 0xb3, 0x0, 0x3, 0x0, 0x0, 0xb, + 0xb0, 0xb, 0x40, 0x6, 0xd0, 0x0, 0x0, 0xc, + 0x30, 0xb9, 0x3, 0xb1, 0x0, 0x0, 0x0, 0x3, + 0x1b, 0xa4, 0x80, 0x0, 0x0, 0x57, 0x66, 0xd6, + 0xb5, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xb, + 0x3b, 0x10, 0x0, 0x0, 0x0, 0x8, 0x60, 0xb3, + 0x5a, 0x0, 0x0, 0x0, 0x1, 0xc0, 0xb, 0x30, + 0xc7, 0x0, 0x0, 0x0, 0xa3, 0x0, 0xb3, 0x2, + 0xf7, 0x0, 0x0, 0x76, 0x0, 0xb, 0x30, 0x5, + 0xfb, 0x30, 0x66, 0x0, 0x0, 0xc3, 0x0, 0x4, + 0xb3, 0x32, 0x0, 0x6, 0xdf, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, + + /* U+6C38 "æ°¸" */ + 0x0, 0x0, 0x0, 0x39, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x47, 0x66, 0xe3, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf1, 0x0, 0x9b, 0x0, + 0x0, 0x0, 0x2, 0x0, 0xe6, 0x4, 0xb0, 0x0, + 0x2, 0x86, 0x6d, 0x70, 0xe7, 0x29, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0x0, 0xe4, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x87, 0x0, 0xe0, 0xb1, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0xe0, 0x5b, 0x0, 0x0, + 0x0, 0x9, 0x40, 0x0, 0xe0, 0xa, 0x90, 0x0, + 0x0, 0x57, 0x0, 0x0, 0xe0, 0x0, 0xdc, 0x30, + 0x2, 0x70, 0x2, 0x44, 0xd0, 0x0, 0x1b, 0xa1, + 0x4, 0x0, 0x0, 0x4e, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + + /* U+6C42 "求" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x31, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x6d, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x8, 0x42, 0x0, + 0x5, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x8e, 0x20, + 0x0, 0x0, 0x0, 0xd, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x28, 0x10, 0xd, 0x70, 0x0, 0x80, 0x0, + 0x0, 0x5, 0xf2, 0xd, 0x71, 0x8, 0xc3, 0x0, + 0x0, 0x0, 0xb4, 0xd, 0x38, 0x86, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0x1a, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x49, 0x2d, 0x12, 0xd1, 0x0, 0x0, + 0x0, 0x4b, 0x70, 0xd, 0x10, 0x6d, 0x20, 0x0, + 0x2d, 0xc2, 0x0, 0xd, 0x10, 0x8, 0xf8, 0x20, + 0x6, 0x0, 0x1, 0x1e, 0x10, 0x0, 0x5e, 0x80, + 0x0, 0x0, 0x6, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, + + /* U+6C5A "汚" */ + 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x25, 0x0, + 0x0, 0x2d, 0x11, 0x86, 0x7d, 0x66, 0x65, 0x0, + 0x0, 0xa, 0x20, 0x0, 0x3a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x0, 0x67, 0x0, 0x0, 0x0, + 0x19, 0x10, 0x46, 0x66, 0xb9, 0x66, 0x67, 0xc1, + 0x5, 0xd0, 0x60, 0x0, 0xb2, 0x0, 0x0, 0x0, + 0x0, 0x80, 0x60, 0x0, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x20, 0x5, 0xd6, 0x66, 0x6b, 0x10, + 0x0, 0x9, 0x0, 0x1, 0x40, 0x0, 0x4c, 0x0, + 0x2, 0x49, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, + 0x4, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x86, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0xd3, 0x0, 0x0, 0x4, 0x13, 0xe0, 0x0, + 0x0, 0xa3, 0x0, 0x0, 0x1, 0xbf, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, + + /* U+6C60 "æ± " */ + 0x0, 0x71, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, + 0x3, 0xe0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, + 0x9, 0x10, 0x30, 0xd, 0x0, 0x0, 0x1, 0x0, + 0x4, 0xb, 0x30, 0xd0, 0x3, 0x10, 0x3a, 0x10, + 0x50, 0xb1, 0xd, 0x45, 0xb7, 0x0, 0x7a, 0x5, + 0x1c, 0x65, 0xd0, 0x8, 0x40, 0x1, 0x55, 0x34, + 0xb1, 0xd, 0x0, 0x84, 0x0, 0x0, 0x80, 0xb, + 0x10, 0xd0, 0x9, 0x30, 0x0, 0x17, 0x0, 0xb1, + 0xd, 0x0, 0xa3, 0x0, 0x9, 0x30, 0xb, 0x10, + 0xd4, 0xae, 0x0, 0x19, 0xf0, 0x0, 0xb1, 0xe, + 0x2, 0x33, 0x20, 0x1d, 0x0, 0xb, 0x10, 0x50, + 0x0, 0x44, 0x4, 0xd0, 0x0, 0xb3, 0x0, 0x0, + 0x7, 0xc0, 0x3c, 0x0, 0x4, 0xbc, 0xcc, 0xcc, + 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+6C7A "決" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x43, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, + 0xd4, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x5, + 0x60, 0x10, 0xe, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x53, 0x76, 0xe6, 0x6c, 0x60, 0x6, 0x60, 0x6, + 0x0, 0xd, 0x0, 0xb3, 0x0, 0xc, 0x54, 0x20, + 0x0, 0xd0, 0xb, 0x30, 0x0, 0x43, 0x80, 0x0, + 0xd, 0x0, 0xb3, 0x0, 0x0, 0x27, 0x56, 0x66, + 0xd6, 0x6c, 0x9c, 0x10, 0x9, 0x11, 0x10, 0x49, + 0x50, 0x0, 0x0, 0x46, 0xb0, 0x0, 0x9, 0x48, + 0x10, 0x0, 0x0, 0xa8, 0x0, 0x1, 0xd0, 0x2b, + 0x0, 0x0, 0x8, 0x70, 0x0, 0x95, 0x0, 0xa8, + 0x0, 0x0, 0xa7, 0x0, 0x68, 0x0, 0x1, 0xda, + 0x10, 0x4, 0x40, 0x57, 0x0, 0x0, 0x2, 0xdd, + 0x10, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6C88 "沈" */ + 0x0, 0x10, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, + 0x0, 0x87, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x20, 0x3b, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x11, 0xb6, 0x7c, 0x66, 0x6e, 0x30, + 0x15, 0x0, 0x48, 0x70, 0x3a, 0x0, 0x35, 0x0, + 0x8, 0x90, 0x52, 0x0, 0x49, 0x0, 0x10, 0x0, + 0x0, 0x63, 0x20, 0x0, 0x6d, 0x50, 0x0, 0x0, + 0x0, 0x7, 0x0, 0x0, 0x9c, 0x60, 0x0, 0x0, + 0x0, 0x8, 0x0, 0x0, 0xd8, 0x60, 0x0, 0x0, + 0x0, 0x65, 0x0, 0x3, 0xb7, 0x60, 0x0, 0x0, + 0x18, 0xf2, 0x0, 0xa, 0x37, 0x60, 0x0, 0x30, + 0x0, 0xf0, 0x0, 0x48, 0x7, 0x60, 0x0, 0x60, + 0x1, 0xf0, 0x2, 0x90, 0x6, 0x60, 0x0, 0xa0, + 0x3, 0xf0, 0x37, 0x0, 0x3, 0xdb, 0xbb, 0xc1, + 0x0, 0x31, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6C92 "æ²’" */ + 0x0, 0x31, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0x30, 0x7, 0x80, 0x0, 0x23, 0x0, + 0x0, 0x6, 0x71, 0xb, 0x66, 0x66, 0xaa, 0x0, + 0x0, 0x0, 0x5, 0x38, 0x0, 0x0, 0x85, 0x0, + 0x8, 0x20, 0x5, 0x90, 0x0, 0x0, 0xb2, 0x0, + 0x2, 0xe1, 0x47, 0x20, 0x0, 0x2b, 0xc0, 0x0, + 0x0, 0x81, 0x81, 0x66, 0x66, 0x67, 0x95, 0x0, + 0x0, 0x2, 0x60, 0x6, 0x0, 0x0, 0xd5, 0x0, + 0x0, 0x9, 0x10, 0x7, 0x0, 0x5, 0xa0, 0x0, + 0x4, 0x5a, 0x0, 0x2, 0x80, 0x1d, 0x10, 0x0, + 0x1, 0xc7, 0x0, 0x0, 0x95, 0xc4, 0x0, 0x0, + 0x0, 0x95, 0x0, 0x0, 0x1f, 0xa0, 0x0, 0x0, + 0x0, 0xb5, 0x0, 0x3, 0xc5, 0xab, 0x40, 0x0, + 0x0, 0x74, 0x3, 0x98, 0x10, 0x5, 0xee, 0xa2, + 0x0, 0x0, 0x54, 0x0, 0x0, 0x0, 0x5, 0x30, + + /* U+6CB9 "æ²¹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, + 0x4a, 0x10, 0x0, 0xb, 0x10, 0x0, 0x0, 0x0, + 0x96, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x1, + 0x14, 0x86, 0x6d, 0x66, 0x6b, 0x10, 0x60, 0x0, + 0x4d, 0x0, 0xb1, 0x0, 0xd0, 0x6, 0xb0, 0x50, + 0xd0, 0xb, 0x10, 0xd, 0x0, 0xa, 0x7, 0xd, + 0x0, 0xb1, 0x0, 0xd0, 0x0, 0x3, 0x60, 0xd0, + 0xb, 0x10, 0xd, 0x0, 0x0, 0x91, 0xd, 0x66, + 0xd6, 0x66, 0xd0, 0x0, 0x1b, 0x0, 0xd0, 0xb, + 0x10, 0xd, 0x0, 0x7e, 0x70, 0xd, 0x0, 0xb1, + 0x0, 0xd0, 0x0, 0xc4, 0x0, 0xd0, 0xb, 0x10, + 0xd, 0x0, 0xd, 0x40, 0xd, 0x66, 0xc6, 0x66, + 0xd0, 0x0, 0xe4, 0x0, 0xd0, 0x0, 0x0, 0xd, + 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x10, + + /* U+6CBB "æ²»" */ + 0x1, 0x0, 0x0, 0x0, 0x63, 0x0, 0x0, 0x0, + 0x1c, 0x40, 0x0, 0xe, 0x50, 0x0, 0x0, 0x0, + 0x5b, 0x1, 0x7, 0x60, 0x1, 0x0, 0x0, 0x0, + 0x21, 0x31, 0x90, 0x0, 0x83, 0x0, 0x50, 0x0, + 0x50, 0x90, 0x0, 0x0, 0xc5, 0x3, 0xd1, 0x6, + 0xbc, 0xa8, 0x76, 0x67, 0xf0, 0xb, 0x33, 0x44, + 0x30, 0x0, 0x0, 0x7, 0x0, 0x0, 0x80, 0x3, + 0x0, 0x0, 0x5, 0x0, 0x0, 0x19, 0x0, 0xe6, + 0x66, 0x67, 0xc0, 0x0, 0x8, 0x50, 0xd, 0x0, + 0x0, 0x2a, 0x0, 0x29, 0xf1, 0x0, 0xd0, 0x0, + 0x2, 0xa0, 0x0, 0x1f, 0x0, 0xd, 0x0, 0x0, + 0x2a, 0x0, 0x3, 0xe0, 0x0, 0xd6, 0x66, 0x67, + 0xa0, 0x0, 0x3d, 0x0, 0xd, 0x0, 0x0, 0x2a, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+6CC1 "æ³" */ + 0x0, 0x30, 0x0, 0x30, 0x0, 0x0, 0x3, 0x0, + 0x0, 0x1d, 0x20, 0xb7, 0x66, 0x66, 0x7d, 0x0, + 0x0, 0x8, 0x61, 0xa2, 0x0, 0x0, 0x2b, 0x0, + 0x0, 0x0, 0x5, 0xa2, 0x0, 0x0, 0x2b, 0x0, + 0x27, 0x0, 0x41, 0xa2, 0x0, 0x0, 0x2b, 0x0, + 0x8, 0x90, 0x60, 0xa2, 0x0, 0x0, 0x2b, 0x0, + 0x1, 0x92, 0x50, 0xb7, 0xd6, 0xe6, 0x7a, 0x0, + 0x0, 0x8, 0x0, 0x10, 0xd0, 0xd0, 0x0, 0x0, + 0x0, 0x19, 0x0, 0x0, 0xd0, 0xd0, 0x0, 0x0, + 0x24, 0xa4, 0x0, 0x2, 0xb0, 0xd0, 0x0, 0x0, + 0x5, 0xf0, 0x0, 0x7, 0x60, 0xd0, 0x0, 0x20, + 0x0, 0xf0, 0x0, 0x1c, 0x0, 0xd0, 0x0, 0x60, + 0x3, 0xf0, 0x1, 0xb2, 0x0, 0xc0, 0x0, 0xb0, + 0x1, 0xa0, 0x38, 0x10, 0x0, 0x8c, 0xbb, 0xc1, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6CCA "泊" */ + 0x1, 0x0, 0x0, 0x0, 0x28, 0x0, 0x0, 0x1, + 0xb2, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x79, + 0x0, 0x0, 0x80, 0x0, 0x10, 0x0, 0x2, 0x5, + 0xc6, 0x76, 0x66, 0xd5, 0x41, 0x0, 0x51, 0xc0, + 0x0, 0x0, 0xd1, 0x1d, 0x30, 0x60, 0xc0, 0x0, + 0x0, 0xd1, 0x6, 0x84, 0x30, 0xc0, 0x0, 0x0, + 0xd1, 0x0, 0x8, 0x0, 0xd6, 0x66, 0x66, 0xe1, + 0x0, 0x27, 0x0, 0xc0, 0x0, 0x0, 0xd1, 0x0, + 0xa2, 0x0, 0xc0, 0x0, 0x0, 0xd1, 0x3b, 0xd0, + 0x0, 0xc0, 0x0, 0x0, 0xd1, 0x3, 0xb0, 0x0, + 0xc0, 0x0, 0x0, 0xd1, 0x5, 0xb0, 0x0, 0xd6, + 0x66, 0x66, 0xe1, 0x5, 0xb0, 0x1, 0xc0, 0x0, + 0x0, 0xc1, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x10, + + /* U+6CD5 "法" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x40, 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, + 0x0, 0x3d, 0x10, 0x0, 0xb, 0x10, 0x0, 0x0, + 0x0, 0xa, 0x31, 0x0, 0xb, 0x10, 0x1, 0x0, + 0x0, 0x0, 0x5, 0x76, 0x6d, 0x66, 0x79, 0x0, + 0x37, 0x0, 0x50, 0x0, 0xb, 0x10, 0x0, 0x0, + 0x9, 0x90, 0x60, 0x0, 0xb, 0x10, 0x0, 0x0, + 0x1, 0x83, 0x40, 0x0, 0xb, 0x10, 0x1, 0x40, + 0x0, 0x8, 0x18, 0x66, 0x6d, 0x66, 0x67, 0x70, + 0x0, 0x18, 0x0, 0x0, 0x6d, 0x10, 0x0, 0x0, + 0x23, 0xb3, 0x0, 0x1, 0xd2, 0x0, 0x0, 0x0, + 0x5, 0xf0, 0x0, 0x9, 0x40, 0x6, 0x30, 0x0, + 0x0, 0xe0, 0x0, 0x56, 0x0, 0x0, 0xb5, 0x0, + 0x3, 0xe0, 0x7, 0xb6, 0x78, 0x76, 0x6e, 0x40, + 0x1, 0xa0, 0x9, 0xb6, 0x30, 0x0, 0x8, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6CE2 "æ³¢" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x50, 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, + 0x0, 0x3d, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x0, + 0x0, 0xa, 0x11, 0x20, 0x1, 0xb0, 0x2, 0x20, + 0x0, 0x0, 0x5, 0xd6, 0x66, 0xd6, 0x6c, 0xb0, + 0x19, 0x10, 0x23, 0xd0, 0x1, 0xb0, 0x17, 0x0, + 0x4, 0xd0, 0x60, 0xd0, 0x1, 0xb0, 0x0, 0x0, + 0x0, 0x71, 0x60, 0xd5, 0x66, 0xd6, 0x6a, 0x0, + 0x0, 0x7, 0x10, 0xd0, 0x50, 0x0, 0x78, 0x0, + 0x0, 0xa, 0x0, 0xc0, 0x33, 0x0, 0xd0, 0x0, + 0x12, 0x86, 0x3, 0x90, 0x9, 0x9, 0x50, 0x0, + 0x5, 0xf2, 0x7, 0x40, 0x2, 0xc9, 0x0, 0x0, + 0x0, 0xe0, 0xb, 0x0, 0x4, 0xcb, 0x0, 0x0, + 0x0, 0xf0, 0x63, 0x0, 0x89, 0x5, 0xd5, 0x0, + 0x0, 0xb3, 0x50, 0x68, 0x30, 0x0, 0x3d, 0xc1, + 0x0, 0x2, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+6CE3 "æ³£" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0x10, 0x0, 0x4d, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x40, 0x0, 0xb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x66, 0x66, 0x66, 0xad, 0x10, + 0x8, 0x10, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xe0, 0x50, 0x20, 0x0, 0xa, 0x60, 0x0, + 0x0, 0x90, 0x70, 0x52, 0x0, 0xd, 0x30, 0x0, + 0x0, 0x3, 0x50, 0xb, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x9, 0x10, 0xc, 0x30, 0x39, 0x0, 0x0, + 0x1, 0x3b, 0x0, 0x9, 0x80, 0x64, 0x0, 0x0, + 0x5, 0xe7, 0x0, 0x7, 0x80, 0x90, 0x0, 0x0, + 0x0, 0xa5, 0x0, 0x1, 0x10, 0x80, 0x0, 0x0, + 0x0, 0xc5, 0x0, 0x0, 0x3, 0x40, 0x7, 0x60, + 0x0, 0xa4, 0x37, 0x66, 0x66, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6CE8 "注" */ + 0x0, 0x20, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, + 0x6, 0xa0, 0x0, 0x4, 0xe2, 0x0, 0x0, 0x0, + 0xd, 0x30, 0x0, 0xb, 0x30, 0x1, 0x0, 0x0, + 0x31, 0x56, 0x66, 0x66, 0x67, 0xf4, 0x32, 0x0, + 0x50, 0x20, 0xe, 0x0, 0x0, 0x0, 0xc6, 0x7, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x4, 0xb2, 0x50, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x1, 0x81, 0x0, + 0x0, 0xe0, 0x7, 0x30, 0x0, 0xa, 0x2, 0x86, + 0x6e, 0x66, 0x65, 0x0, 0x6, 0x70, 0x0, 0x0, + 0xe0, 0x0, 0x0, 0x29, 0xf2, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, 0xe, 0x0, + 0x8, 0x30, 0x4e, 0x4, 0x76, 0x66, 0x66, 0x66, + 0x75, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+6CF3 "æ³³" */ + 0x0, 0x40, 0x0, 0x2, 0xa8, 0x0, 0x0, 0x0, + 0x2, 0xd2, 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, + 0x9, 0x40, 0x0, 0x5, 0x20, 0x0, 0x0, 0x0, + 0x2, 0x25, 0x76, 0xe4, 0x0, 0x20, 0x18, 0x10, + 0x50, 0x0, 0xe, 0x40, 0x5d, 0x10, 0x6d, 0x7, + 0x0, 0x30, 0xe6, 0x38, 0x0, 0x0, 0x82, 0x67, + 0x7f, 0x2e, 0x84, 0x0, 0x0, 0x0, 0x81, 0x3, + 0xa0, 0xe6, 0x30, 0x0, 0x0, 0xa, 0x0, 0x66, + 0xe, 0x19, 0x0, 0x0, 0x27, 0x80, 0xb, 0x10, + 0xe0, 0xb3, 0x0, 0x5, 0xf5, 0x3, 0x90, 0xe, + 0x3, 0xd1, 0x0, 0xe, 0x30, 0xa0, 0x0, 0xe0, + 0xa, 0xd3, 0x1, 0xf2, 0x62, 0x11, 0x1f, 0x0, + 0xb, 0x70, 0xc, 0x20, 0x0, 0x6f, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, + 0x0, + + /* U+6D0B "æ´‹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x24, 0x0, 0x8, 0x70, 0x0, + 0x0, 0x78, 0x0, 0xa, 0x80, 0xd, 0x20, 0x0, + 0x0, 0xd, 0x30, 0x2, 0xd0, 0x46, 0x0, 0x0, + 0x0, 0x3, 0x4, 0x66, 0x76, 0xa6, 0x7e, 0x30, + 0x13, 0x0, 0x22, 0x20, 0xc, 0x10, 0x0, 0x0, + 0x9, 0xa0, 0x60, 0x0, 0xc, 0x10, 0x10, 0x0, + 0x1, 0xd0, 0x70, 0x66, 0x6d, 0x66, 0xa8, 0x0, + 0x0, 0x3, 0x50, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0x9, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0x1b, 0x5, 0x66, 0x6d, 0x66, 0x6c, 0x90, + 0x6, 0xd8, 0x1, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0xb5, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0xd4, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0xe4, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, + + /* U+6D17 "æ´—" */ + 0x0, 0x10, 0x0, 0x0, 0x7, 0x20, 0x0, 0x0, + 0x0, 0x88, 0x0, 0x38, 0xb, 0x10, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x79, 0xb, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x4, 0xb8, 0x6c, 0x66, 0xc9, 0x0, + 0x16, 0x0, 0x41, 0x90, 0xb, 0x0, 0x0, 0x0, + 0x6, 0xc0, 0x66, 0x10, 0xb, 0x0, 0x0, 0x0, + 0x0, 0x90, 0x61, 0x0, 0xb, 0x0, 0x6, 0x30, + 0x0, 0x4, 0x47, 0x67, 0xc6, 0xb8, 0x66, 0x40, + 0x0, 0x9, 0x0, 0x3, 0xa0, 0x93, 0x0, 0x0, + 0x0, 0x1b, 0x0, 0x5, 0x80, 0x93, 0x0, 0x0, + 0x6, 0xe9, 0x0, 0x9, 0x50, 0x93, 0x0, 0x20, + 0x0, 0x97, 0x0, 0xd, 0x0, 0x93, 0x0, 0x60, + 0x0, 0xd6, 0x0, 0xa5, 0x0, 0x94, 0x1, 0xa0, + 0x0, 0xc6, 0x19, 0x40, 0x0, 0x4d, 0xbc, 0xb0, + 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6D32 "æ´²" */ + 0x0, 0x41, 0x0, 0x13, 0x0, 0x0, 0x8, 0x20, + 0x1, 0xd2, 0x3, 0xc0, 0x9, 0x10, 0xb2, 0x0, + 0x7, 0x32, 0x2a, 0x0, 0xc0, 0xb, 0x10, 0x0, + 0x0, 0x42, 0xa0, 0xc, 0x0, 0xb1, 0x8, 0x30, + 0x50, 0x29, 0x0, 0xc0, 0xb, 0x10, 0x3f, 0x6, + 0x53, 0x97, 0xc, 0x43, 0xb1, 0x0, 0x50, 0x6b, + 0x49, 0x76, 0xc0, 0xdb, 0x10, 0x0, 0x65, 0xb5, + 0x74, 0x3c, 0x5, 0xb1, 0x0, 0xa, 0x0, 0x75, + 0x0, 0xc0, 0xb, 0x10, 0x36, 0x90, 0xa, 0x20, + 0xc, 0x0, 0xb1, 0x3, 0xe6, 0x0, 0xb0, 0x0, + 0xc0, 0xb, 0x10, 0xb, 0x40, 0x66, 0x0, 0xc, + 0x0, 0xb1, 0x0, 0xe4, 0xa, 0x0, 0x0, 0xd0, + 0xb, 0x10, 0xa, 0x37, 0x10, 0x0, 0x1, 0x0, + 0xb2, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, + 0x0, + + /* U+6D3B "æ´»" */ + 0x0, 0x30, 0x0, 0x0, 0x0, 0x1, 0x70, 0x0, + 0x0, 0x2c, 0x10, 0x1, 0x47, 0xbe, 0xc5, 0x0, + 0x0, 0x8, 0x62, 0x55, 0x4d, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, + 0x17, 0x0, 0x40, 0x0, 0xc, 0x0, 0x0, 0x20, + 0x5, 0xc0, 0x56, 0x66, 0x6d, 0x66, 0x68, 0x80, + 0x0, 0xb1, 0x60, 0x0, 0xc, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x20, 0x0, 0xc, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x0, 0xa6, 0x6c, 0x66, 0xb6, 0x0, + 0x2, 0x58, 0x0, 0xd1, 0x0, 0x0, 0xb3, 0x0, + 0x4, 0xe4, 0x0, 0xd1, 0x0, 0x0, 0xb2, 0x0, + 0x0, 0xb3, 0x0, 0xd1, 0x0, 0x0, 0xb2, 0x0, + 0x0, 0xd2, 0x0, 0xd6, 0x66, 0x66, 0xd2, 0x0, + 0x0, 0xa2, 0x0, 0xd1, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x40, 0x0, + + /* U+6D3E "æ´¾" */ + 0x0, 0x33, 0x0, 0x0, 0x0, 0x1, 0x74, 0x0, + 0x0, 0xc, 0x50, 0x53, 0x56, 0x8a, 0x85, 0x0, + 0x0, 0x4, 0x60, 0x96, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x13, 0x94, 0x10, 0x16, 0xd9, 0x0, + 0x1b, 0x20, 0x50, 0x94, 0xc5, 0x82, 0x0, 0x0, + 0x5, 0xc0, 0x60, 0x94, 0xc0, 0x60, 0x7, 0x10, + 0x0, 0x42, 0x50, 0x93, 0xc0, 0x60, 0x8a, 0x30, + 0x0, 0x8, 0x0, 0xa2, 0xc0, 0x77, 0x20, 0x0, + 0x0, 0xa, 0x0, 0xc0, 0xc0, 0x45, 0x0, 0x0, + 0x15, 0xa7, 0x0, 0xc0, 0xc0, 0xb, 0x0, 0x0, + 0x2, 0xe4, 0x4, 0x70, 0xc0, 0x9, 0x40, 0x0, + 0x0, 0xe3, 0xa, 0x10, 0xc0, 0x12, 0xd3, 0x0, + 0x1, 0xf2, 0x46, 0x0, 0xd9, 0x50, 0x6f, 0x70, + 0x0, 0x82, 0x70, 0x0, 0xa3, 0x0, 0x6, 0x30, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6D41 "æµ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x49, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0x0, 0x0, 0xa, 0x30, 0x9, 0x10, + 0x0, 0xb, 0x53, 0x86, 0x6d, 0x66, 0x66, 0x30, + 0x0, 0x1, 0x2, 0x0, 0x86, 0x1, 0x0, 0x0, + 0x16, 0x0, 0x4, 0x5, 0x50, 0x7, 0x30, 0x0, + 0x7, 0xb0, 0x50, 0x79, 0x44, 0x45, 0xe2, 0x0, + 0x0, 0xa0, 0x70, 0x88, 0x53, 0x10, 0x84, 0x0, + 0x0, 0x3, 0x50, 0x95, 0x8, 0x9, 0x30, 0x0, + 0x0, 0x9, 0x0, 0xb2, 0xd, 0xc, 0x0, 0x0, + 0x0, 0x2a, 0x0, 0xc1, 0xd, 0xc, 0x0, 0x0, + 0x7, 0xf6, 0x0, 0xd0, 0xd, 0xc, 0x0, 0x10, + 0x0, 0xc4, 0x1, 0xb0, 0xd, 0xc, 0x0, 0x50, + 0x0, 0xe3, 0x9, 0x30, 0xd, 0xc, 0x0, 0x80, + 0x0, 0xf3, 0x65, 0x0, 0xd, 0x9, 0xcb, 0xc1, + 0x0, 0x12, 0x10, 0x0, 0x3, 0x0, 0x0, 0x0, + + /* U+6D45 "æµ…" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x22, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, + 0xb7, 0x0, 0x0, 0xe0, 0x88, 0x0, 0x0, 0x3, + 0xa0, 0x10, 0xe, 0x0, 0xd2, 0x0, 0x0, 0x0, + 0x40, 0x0, 0xe0, 0x1, 0x60, 0x8, 0x40, 0x6, + 0x34, 0x5e, 0x66, 0x67, 0x30, 0x1f, 0x31, 0x52, + 0x10, 0xd0, 0x0, 0x10, 0x0, 0x61, 0x70, 0x0, + 0xd, 0x13, 0x5c, 0x70, 0x0, 0x9, 0x46, 0x66, + 0xd5, 0x22, 0x0, 0x0, 0x5, 0x60, 0x0, 0x9, + 0x40, 0xb9, 0x0, 0x11, 0xc1, 0x0, 0x0, 0x59, + 0xa9, 0x0, 0x3, 0xcd, 0x0, 0x0, 0x1, 0xf8, + 0x0, 0x10, 0x5, 0xb0, 0x0, 0x3, 0xb9, 0xb0, + 0x6, 0x0, 0x89, 0x0, 0x17, 0x60, 0x9, 0xb2, + 0xa0, 0x8, 0x90, 0x33, 0x0, 0x0, 0x8, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x60, + + /* U+6D74 "æµ´" */ + 0x0, 0x40, 0x0, 0x0, 0x80, 0x3, 0x0, 0x0, + 0x0, 0x4d, 0x20, 0x7, 0xb0, 0x4, 0xb3, 0x0, + 0x0, 0xb, 0x41, 0x2b, 0x2, 0x0, 0x5f, 0x10, + 0x0, 0x0, 0x5, 0x80, 0xc, 0x80, 0x8, 0x0, + 0x19, 0x20, 0x44, 0x0, 0x5c, 0x70, 0x0, 0x0, + 0x4, 0xf0, 0x70, 0x1, 0xd1, 0x19, 0x0, 0x0, + 0x0, 0x80, 0x80, 0xb, 0x40, 0x4, 0xc2, 0x0, + 0x0, 0x4, 0x40, 0x97, 0x0, 0x0, 0x6f, 0xa2, + 0x0, 0xa, 0x17, 0x3d, 0x66, 0x66, 0xe6, 0x50, + 0x0, 0x2b, 0x20, 0xe, 0x0, 0x0, 0xe0, 0x0, + 0x5, 0xe8, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xa6, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xe6, 0x0, 0xe, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0xb6, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x20, 0x0, + + /* U+6D77 "æµ·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x0, 0x1c, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x87, 0x0, 0x69, 0x0, 0x0, 0x4, 0x0, + 0x0, 0x1a, 0x0, 0xb6, 0x66, 0x66, 0x68, 0x40, + 0x10, 0x0, 0x33, 0x90, 0x0, 0x0, 0x20, 0x0, + 0xb, 0x10, 0x58, 0xa7, 0x66, 0x66, 0xe3, 0x0, + 0x6, 0x71, 0x70, 0xc1, 0x56, 0x0, 0xd0, 0x0, + 0x0, 0x15, 0x0, 0xe0, 0xc, 0x10, 0xd0, 0x0, + 0x0, 0x7, 0x57, 0xe6, 0x66, 0x66, 0xd6, 0xc2, + 0x0, 0x7, 0x4, 0x90, 0x41, 0x1, 0xb0, 0x0, + 0x1, 0x84, 0x6, 0x70, 0x2b, 0x1, 0xb0, 0x0, + 0x6, 0xf0, 0x9, 0x40, 0x7, 0x2, 0xa0, 0x30, + 0x0, 0xe0, 0xc, 0x66, 0x66, 0x68, 0xb6, 0x80, + 0x2, 0xf0, 0x0, 0x0, 0x2, 0x7, 0x70, 0x0, + 0x1, 0xc0, 0x0, 0x0, 0x3, 0xdf, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, + + /* U+6D88 "消" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x10, 0x2, 0xc2, + 0x6, 0x60, 0xe, 0x0, 0xd5, 0x0, 0x78, 0x0, + 0xc6, 0xe, 0x7, 0x60, 0x0, 0x1, 0x4, 0x44, + 0xe, 0x25, 0x0, 0x63, 0x0, 0x42, 0x96, 0x6e, + 0x66, 0xc1, 0x1e, 0x40, 0x60, 0xd0, 0x0, 0x0, + 0xe0, 0x6, 0x31, 0x60, 0xd0, 0x0, 0x0, 0xe0, + 0x0, 0x7, 0x10, 0xe6, 0x66, 0x66, 0xe0, 0x0, + 0xa, 0x0, 0xd0, 0x0, 0x0, 0xe0, 0x0, 0x67, + 0x0, 0xe6, 0x66, 0x66, 0xe0, 0x38, 0xf3, 0x0, + 0xd0, 0x0, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0xd0, + 0x0, 0x0, 0xe0, 0x0, 0xf0, 0x0, 0xd0, 0x0, + 0x1, 0xd0, 0x0, 0xf0, 0x1, 0xd0, 0x1, 0x7f, + 0xa0, 0x0, 0x10, 0x0, 0x20, 0x0, 0x3, 0x0, + + /* U+6DBC "æ¶¼" */ + 0x0, 0x10, 0x0, 0x0, 0x9, 0x20, 0x0, 0x0, + 0x0, 0x77, 0x0, 0x0, 0x3, 0xc0, 0x0, 0x0, + 0x0, 0xd, 0x31, 0x56, 0x66, 0x96, 0x66, 0xd1, + 0x0, 0x3, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x14, 0x0, 0x4, 0x9, 0x66, 0x66, 0x68, 0x0, + 0x8, 0x80, 0x60, 0xd, 0x0, 0x0, 0x1c, 0x0, + 0x0, 0xe0, 0x70, 0xd, 0x0, 0x0, 0x1b, 0x0, + 0x0, 0x14, 0x40, 0xd, 0x66, 0x66, 0x6b, 0x0, + 0x0, 0xa, 0x0, 0xa, 0x0, 0xd0, 0x16, 0x0, + 0x0, 0x48, 0x0, 0x5, 0x0, 0xd0, 0x30, 0x0, + 0x6, 0xf4, 0x0, 0x1e, 0x40, 0xd0, 0x57, 0x0, + 0x0, 0xc2, 0x0, 0xa3, 0x0, 0xd0, 0xa, 0x80, + 0x0, 0xe2, 0x6, 0x40, 0x0, 0xc0, 0x1, 0xf0, + 0x0, 0xc2, 0x33, 0x0, 0x7c, 0xa0, 0x0, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, + + /* U+6DF1 "æ·±" */ + 0x0, 0x30, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xa0, 0xa, 0x66, 0x66, 0x66, 0xb2, 0x0, + 0xc, 0x24, 0x90, 0x0, 0x0, 0x38, 0x0, 0x0, + 0x4, 0x31, 0x89, 0x1, 0x86, 0x0, 0x34, 0x0, + 0x50, 0x3a, 0x1, 0x0, 0xc7, 0x0, 0xb6, 0x24, + 0x16, 0x0, 0xa5, 0x1, 0x80, 0x2, 0x57, 0x2, + 0x0, 0xa, 0x30, 0x3, 0x0, 0x0, 0x80, 0x47, + 0x68, 0xd9, 0x66, 0xb6, 0x0, 0x36, 0x0, 0x0, + 0xdc, 0x82, 0x0, 0x0, 0xb, 0x20, 0x0, 0x87, + 0xa3, 0xa0, 0x0, 0x19, 0xf0, 0x0, 0x49, 0xa, + 0x35, 0x90, 0x0, 0x1e, 0x0, 0x49, 0x0, 0xa3, + 0xb, 0xb2, 0x4, 0xd0, 0x55, 0x0, 0xa, 0x30, + 0xb, 0x50, 0x3b, 0x0, 0x0, 0x0, 0xb4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, + + /* U+6DF7 "æ··" */ + 0x0, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x40, 0x87, 0x66, 0x66, 0x6d, 0x0, + 0x0, 0x4, 0x92, 0x85, 0x0, 0x0, 0x1b, 0x0, + 0x11, 0x0, 0x5, 0x89, 0x66, 0x66, 0x6b, 0x0, + 0xa, 0x40, 0x4, 0x85, 0x0, 0x0, 0x1b, 0x0, + 0x2, 0xe0, 0x60, 0x85, 0x0, 0x0, 0x1b, 0x0, + 0x0, 0x40, 0x70, 0x77, 0x66, 0x96, 0x68, 0x0, + 0x0, 0x3, 0x50, 0x92, 0x0, 0xd3, 0x3, 0x0, + 0x0, 0x9, 0x0, 0xd0, 0x20, 0xd0, 0x4d, 0x40, + 0x4, 0x5a, 0x0, 0xd6, 0x94, 0xd7, 0x70, 0x0, + 0x2, 0xc7, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x20, + 0x0, 0x95, 0x0, 0xd0, 0x1, 0xd0, 0x0, 0x60, + 0x0, 0xb5, 0x0, 0xe9, 0x70, 0xd0, 0x0, 0xb0, + 0x0, 0x74, 0x0, 0x92, 0x0, 0x8c, 0xcc, 0xc1, + + /* U+6E05 "清" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x0, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, + 0x5d, 0x0, 0x0, 0xd, 0x0, 0x27, 0x0, 0x0, + 0xc1, 0x47, 0x66, 0xe6, 0x66, 0x61, 0x0, 0x0, + 0x10, 0x46, 0x6e, 0x66, 0xc1, 0x1, 0xa2, 0x4, + 0x1, 0x10, 0xd0, 0x0, 0x0, 0x4, 0xe0, 0x66, + 0x66, 0x6d, 0x66, 0x6b, 0x80, 0x5, 0x42, 0x10, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x7, 0x0, 0xc6, + 0x66, 0x66, 0xc5, 0x0, 0x0, 0x90, 0xd, 0x0, + 0x0, 0xa, 0x20, 0x0, 0x56, 0x0, 0xd6, 0x66, + 0x66, 0xc2, 0x1, 0x8f, 0x30, 0xd, 0x66, 0x66, + 0x6c, 0x20, 0x0, 0xd1, 0x0, 0xd0, 0x0, 0x0, + 0xa2, 0x0, 0xf, 0x0, 0xd, 0x0, 0x0, 0xb, + 0x20, 0x1, 0xf0, 0x0, 0xd0, 0x0, 0x4b, 0xf0, + 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x12, 0x0, + + /* U+6E07 "渇" */ + 0x0, 0x31, 0x0, 0x86, 0x66, 0x66, 0x93, 0x0, + 0x1, 0xd3, 0xc, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x6, 0x71, 0xc0, 0x0, 0x0, 0xb2, 0x0, 0x0, + 0x0, 0x5c, 0x66, 0x66, 0x6c, 0x20, 0x8, 0x10, + 0x5, 0xc0, 0x0, 0x0, 0xb2, 0x0, 0x3e, 0x5, + 0x1c, 0x76, 0x66, 0x6c, 0x20, 0x0, 0x90, 0x70, + 0x6c, 0x60, 0x0, 0x20, 0x0, 0x0, 0x45, 0x6, + 0xc6, 0x66, 0x66, 0xb3, 0x0, 0xa, 0x3, 0xa0, + 0x0, 0x10, 0xd, 0x10, 0x46, 0x93, 0x6a, 0x50, + 0x8b, 0x0, 0xd0, 0x2, 0xd5, 0x20, 0xa7, 0x72, + 0x1, 0xd, 0x0, 0xa, 0x40, 0xa, 0x30, 0x0, + 0x70, 0xd0, 0x0, 0xc4, 0x0, 0x5b, 0xbb, 0xa4, + 0xd, 0x0, 0x7, 0x30, 0x0, 0x0, 0x0, 0x4c, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x51, + 0x0, + + /* U+6E08 "済" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x30, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x1, + 0xc2, 0x0, 0x0, 0x5a, 0x0, 0x33, 0x0, 0x7, + 0x71, 0x79, 0x66, 0x66, 0xe7, 0x50, 0x0, 0x0, + 0x20, 0x54, 0x0, 0x96, 0x0, 0x6, 0x20, 0x5, + 0x0, 0xb3, 0x79, 0x0, 0x0, 0x1e, 0x22, 0x30, + 0x2, 0xfc, 0x0, 0x0, 0x0, 0x83, 0x70, 0x6, + 0xa4, 0x7c, 0x73, 0x10, 0x0, 0x18, 0x57, 0xa0, + 0x0, 0x1c, 0xcb, 0x10, 0x7, 0x20, 0x2d, 0x66, + 0x66, 0xe0, 0x0, 0x34, 0xc0, 0x2, 0xa0, 0x0, + 0xd, 0x0, 0x1, 0xb9, 0x0, 0x4b, 0x66, 0x66, + 0xd0, 0x0, 0x7, 0x70, 0x7, 0x40, 0x0, 0xd, + 0x0, 0x0, 0x97, 0x0, 0xb0, 0x0, 0x0, 0xd0, + 0x0, 0x6, 0x60, 0x64, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x60, 0x0, + + /* U+6E09 "渉" */ + 0x0, 0x31, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0x0, 0x1d, 0x30, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x6, 0x71, 0xb, 0x20, 0xd0, 0x3, 0x0, + 0x0, 0x0, 0x5, 0xc, 0x0, 0xd6, 0x68, 0x10, + 0x8, 0x20, 0x5, 0xc, 0x0, 0xd0, 0x0, 0x0, + 0x1, 0xe1, 0x55, 0x6d, 0x66, 0xe6, 0x66, 0xd2, + 0x0, 0x81, 0x81, 0x10, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x3, 0x60, 0x8, 0x70, 0xd0, 0x63, 0x0, + 0x0, 0x9, 0x0, 0xd, 0x10, 0xd0, 0xb, 0x70, + 0x4, 0x7a, 0x0, 0x56, 0x0, 0xd0, 0xc4, 0xc0, + 0x0, 0xb7, 0x0, 0x90, 0x0, 0xdb, 0x80, 0x0, + 0x0, 0x85, 0x3, 0x10, 0x2, 0xc6, 0x0, 0x0, + 0x0, 0xb6, 0x0, 0x0, 0x6b, 0x20, 0x0, 0x0, + 0x0, 0x53, 0x0, 0x69, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x15, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+6E1B "減" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x2b, 0x31, 0x0, + 0x0, 0x78, 0x0, 0x0, 0x0, 0xb, 0x1d, 0x10, + 0x0, 0xe, 0x11, 0x10, 0x0, 0xc, 0x4, 0x70, + 0x0, 0x2, 0x6, 0xc6, 0x66, 0x6d, 0x66, 0x71, + 0x24, 0x0, 0x42, 0xb0, 0x0, 0xc, 0x0, 0x0, + 0xa, 0x70, 0x61, 0xb4, 0x6a, 0x9c, 0x4, 0x50, + 0x1, 0xc1, 0x51, 0xa0, 0x0, 0xb, 0xa, 0x60, + 0x0, 0x7, 0x12, 0xa7, 0x66, 0xbb, 0x1d, 0x0, + 0x0, 0x9, 0x2, 0x99, 0x31, 0xa8, 0x79, 0x0, + 0x0, 0x76, 0x4, 0x89, 0x31, 0xa5, 0xe2, 0x0, + 0x17, 0xf1, 0x6, 0x69, 0x86, 0xa4, 0xd0, 0x20, + 0x0, 0xe0, 0xa, 0x28, 0x21, 0x7c, 0xa4, 0x60, + 0x1, 0xf0, 0x1a, 0x0, 0x0, 0xa2, 0x2c, 0x90, + 0x1, 0xe0, 0x81, 0x0, 0x19, 0x10, 0x5, 0xf1, + 0x0, 0x1, 0x20, 0x0, 0x40, 0x0, 0x0, 0x31, + + /* U+6E21 "渡" */ + 0x0, 0x60, 0x0, 0x0, 0x5, 0x50, 0x0, 0x0, + 0x0, 0x4c, 0x1, 0x0, 0x0, 0xd1, 0x0, 0x40, + 0x0, 0xb, 0x13, 0xc6, 0x66, 0x76, 0x66, 0x93, + 0x12, 0x0, 0x14, 0xa0, 0x2b, 0x1, 0xb0, 0x0, + 0xa, 0x50, 0x53, 0xa0, 0x1a, 0x1, 0xa2, 0x50, + 0x2, 0xd0, 0x62, 0xc6, 0x6c, 0x66, 0xc6, 0x50, + 0x0, 0x22, 0x53, 0x90, 0x1a, 0x1, 0xa0, 0x0, + 0x0, 0x8, 0x3, 0x90, 0x1a, 0x66, 0x80, 0x0, + 0x0, 0xa, 0x5, 0x72, 0x66, 0x66, 0x92, 0x0, + 0x14, 0x96, 0x7, 0x50, 0x33, 0x3, 0xc0, 0x0, + 0x2, 0xe3, 0x9, 0x20, 0x9, 0x2c, 0x20, 0x0, + 0x0, 0xd1, 0xc, 0x0, 0x2, 0xf6, 0x0, 0x0, + 0x0, 0xf2, 0x45, 0x0, 0x4b, 0x5c, 0x70, 0x0, + 0x0, 0x82, 0x80, 0x48, 0x60, 0x0, 0x9f, 0xc3, + 0x0, 0x2, 0x4, 0x10, 0x0, 0x0, 0x1, 0x30, + + /* U+6E29 "温" */ + 0x0, 0x40, 0x0, 0x20, 0x0, 0x0, 0x30, 0x0, + 0x0, 0x4c, 0x0, 0xd6, 0x66, 0x66, 0xf1, 0x0, + 0x0, 0x7, 0x1, 0xd1, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x31, 0xd6, 0x66, 0x66, 0xe0, 0x0, + 0x9, 0x20, 0x50, 0xd1, 0x0, 0x0, 0xe0, 0x0, + 0x4, 0xb0, 0x60, 0xd1, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x23, 0x40, 0xe6, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0x8, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xc, 0x66, 0x86, 0x96, 0x6d, 0x0, + 0x0, 0x58, 0xd, 0x1, 0xa0, 0xc0, 0xc, 0x0, + 0x7, 0xf5, 0xd, 0x1, 0xa0, 0xc0, 0xc, 0x0, + 0x0, 0xd3, 0xd, 0x1, 0xa0, 0xc0, 0xc, 0x0, + 0x0, 0xf2, 0xd, 0x1, 0xa0, 0xc0, 0xc, 0x0, + 0x0, 0xd4, 0x6e, 0x66, 0xc6, 0xd6, 0x6d, 0xd4, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6E2F "港" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x60, 0x0, 0x8, 0x60, 0xd, 0x0, 0x0, + 0x0, 0x4d, 0x0, 0x8, 0x50, 0xd, 0x0, 0x0, + 0x0, 0xa, 0x12, 0x6b, 0x96, 0x6e, 0x6c, 0x10, + 0x2, 0x0, 0x40, 0x28, 0x50, 0xd, 0x0, 0x0, + 0x9, 0x70, 0x50, 0x8, 0x50, 0xd, 0x0, 0x20, + 0x1, 0xd1, 0x68, 0x6a, 0xa6, 0x6b, 0x66, 0xa1, + 0x0, 0x15, 0x10, 0xb, 0x40, 0x6, 0x0, 0x0, + 0x0, 0x8, 0x0, 0x5b, 0x0, 0x5, 0xa0, 0x0, + 0x0, 0x8, 0x2, 0xcd, 0x66, 0x6c, 0x5d, 0x71, + 0x2, 0x85, 0x29, 0x1c, 0x0, 0xb, 0x2, 0x70, + 0x5, 0xf3, 0x50, 0xd, 0x66, 0x6c, 0x11, 0x0, + 0x0, 0xe0, 0x0, 0xc, 0x0, 0x2, 0x5, 0x0, + 0x1, 0xf0, 0x0, 0xc, 0x0, 0x0, 0x7, 0x30, + 0x0, 0xb0, 0x0, 0xb, 0xcc, 0xcc, 0xbc, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6E56 "æ¹–" */ + 0x0, 0x20, 0x0, 0x57, 0x0, 0x0, 0x0, 0x0, + 0x9, 0x60, 0x5, 0x70, 0xa, 0x66, 0xc3, 0x0, + 0x19, 0x20, 0x57, 0x0, 0xc0, 0xb, 0x0, 0x0, + 0x5, 0x59, 0xa9, 0x6c, 0x0, 0xb0, 0x28, 0x0, + 0x51, 0x57, 0x0, 0xb6, 0x6d, 0x0, 0x88, 0x15, + 0x5, 0x70, 0xb, 0x0, 0xb0, 0x1, 0x55, 0x12, + 0x57, 0x30, 0xb0, 0xb, 0x0, 0x0, 0x80, 0xd6, + 0x6d, 0xc, 0x0, 0xb0, 0x0, 0x8, 0xc, 0x0, + 0xc0, 0xd6, 0x6d, 0x1, 0x38, 0x50, 0xc0, 0xc, + 0xc, 0x0, 0xb0, 0x3, 0xe2, 0xd, 0x66, 0xc4, + 0x80, 0xb, 0x0, 0xd, 0x0, 0xc0, 0x7, 0xb1, + 0x0, 0xb0, 0x0, 0xf0, 0x8, 0x0, 0x65, 0x4, + 0x3c, 0x0, 0xa, 0x0, 0x0, 0x54, 0x0, 0x2c, + 0xb0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, + + /* U+6E90 "æº" */ + 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, + 0x0, 0x6c, 0x2, 0xc6, 0x66, 0x78, 0x68, 0x90, + 0x0, 0xc, 0x5, 0xb0, 0x0, 0x87, 0x0, 0x0, + 0x0, 0x0, 0x24, 0xb0, 0x86, 0xb6, 0x6b, 0x10, + 0x18, 0x10, 0x52, 0xb0, 0xd0, 0x0, 0xd, 0x0, + 0x6, 0xd0, 0x62, 0xb0, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x92, 0x53, 0xb0, 0xd6, 0x66, 0x6d, 0x0, + 0x0, 0x7, 0x13, 0x90, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x9, 0x6, 0x80, 0xe6, 0x79, 0x6d, 0x0, + 0x4, 0x78, 0x9, 0x40, 0x30, 0x3a, 0x1, 0x0, + 0x2, 0xe5, 0xc, 0x0, 0xd4, 0x3a, 0x82, 0x0, + 0x0, 0xb3, 0x37, 0x8, 0x60, 0x3a, 0x1d, 0x50, + 0x0, 0xe3, 0x80, 0x55, 0x0, 0x4a, 0x5, 0xc0, + 0x0, 0x86, 0x22, 0x30, 0x7, 0xf7, 0x0, 0x40, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, + + /* U+6E96 "準" */ + 0x0, 0x72, 0x0, 0x1a, 0x4, 0x50, 0x0, 0x0, + 0x0, 0x2c, 0x1, 0x76, 0x0, 0xb0, 0x4, 0x0, + 0x2, 0x2, 0x41, 0xe6, 0x66, 0xa6, 0x69, 0x20, + 0x7, 0x70, 0x67, 0xd1, 0x0, 0xd0, 0x24, 0x0, + 0x0, 0x74, 0x63, 0xc6, 0x66, 0xe6, 0x66, 0x0, + 0x0, 0x9, 0x10, 0xc1, 0x0, 0xd1, 0x25, 0x0, + 0x4, 0x97, 0x0, 0xc6, 0x66, 0xd5, 0x54, 0x0, + 0x0, 0x85, 0x0, 0xc1, 0x0, 0xd0, 0x7, 0x10, + 0x0, 0x66, 0x0, 0x88, 0x66, 0x66, 0x66, 0x30, + 0x0, 0x23, 0x0, 0xd, 0x40, 0x0, 0x0, 0x10, + 0x7, 0x66, 0x66, 0x6e, 0x76, 0x66, 0x67, 0xa0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, 0x0, + + /* U+6E9D "æº" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x5, 0x70, 0xc, 0x0, 0x0, + 0x0, 0x69, 0x0, 0x5, 0x60, 0xd, 0x4, 0x0, + 0x0, 0xd, 0x25, 0x79, 0xa6, 0x6e, 0x67, 0x40, + 0x0, 0x2, 0x4, 0x59, 0xa6, 0x6e, 0x6b, 0x10, + 0x33, 0x0, 0x40, 0x16, 0x60, 0xd, 0x0, 0x10, + 0xa, 0x70, 0x65, 0x78, 0x89, 0x6a, 0x68, 0x90, + 0x2, 0xb2, 0x50, 0x10, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x0, 0xd6, 0x6e, 0x66, 0xa9, 0x0, + 0x0, 0x9, 0x0, 0xd0, 0xd, 0x0, 0x76, 0x0, + 0x0, 0x85, 0x0, 0xd6, 0x6e, 0x66, 0xa6, 0x0, + 0x18, 0xf0, 0x26, 0xe6, 0x6e, 0x66, 0xaa, 0xa0, + 0x0, 0xe0, 0x1, 0xd0, 0x0, 0x0, 0x76, 0x0, + 0x2, 0xe0, 0x0, 0xd0, 0x0, 0x0, 0x76, 0x0, + 0x2, 0xd0, 0x0, 0xd0, 0x0, 0x29, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x70, 0x0, + + /* U+6EFF "滿" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x30, 0x0, 0x0, 0xd0, 0x1, 0xb0, 0x0, 0x1, + 0xc2, 0x0, 0xd, 0x0, 0x1c, 0x5, 0x20, 0x7, + 0x75, 0x76, 0xe6, 0x66, 0xd6, 0x64, 0x0, 0x0, + 0x40, 0xd, 0x0, 0x1c, 0x0, 0x6, 0x20, 0x5, + 0x0, 0xe6, 0xc6, 0xc0, 0x0, 0xd, 0x32, 0x40, + 0x2, 0xd, 0x0, 0x0, 0x0, 0x65, 0x72, 0xb6, + 0x66, 0xe6, 0x67, 0xc0, 0x0, 0x8, 0x1b, 0x60, + 0xd, 0x50, 0x3a, 0x0, 0x5, 0x41, 0xb1, 0xb0, + 0xd1, 0xc3, 0xa0, 0x12, 0xc0, 0x1b, 0x3d, 0x8d, + 0x3d, 0xaa, 0x2, 0xbb, 0x1, 0xb7, 0x19, 0xd8, + 0x2b, 0xa0, 0x5, 0x90, 0x1c, 0x0, 0xd, 0x10, + 0x3a, 0x0, 0x89, 0x1, 0xb0, 0x0, 0xd0, 0x3, + 0xa0, 0x6, 0x80, 0x2b, 0x0, 0xd, 0x6, 0xa8, + 0x0, 0x0, 0x1, 0x50, 0x0, 0x20, 0x8, 0x10, + + /* U+6F22 "æ¼¢" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x0, 0xa, 0x30, 0xb, 0x20, 0x0, + 0x0, 0x4b, 0x5, 0x6c, 0x66, 0x6d, 0x69, 0x80, + 0x0, 0xb, 0x31, 0xa, 0x0, 0xc, 0x0, 0x0, + 0x0, 0x1, 0x4, 0xb, 0x68, 0x6d, 0x0, 0x0, + 0x7, 0x10, 0x6, 0x3, 0xc, 0x3, 0x0, 0x0, + 0x3, 0xd1, 0x44, 0xc6, 0x6d, 0x66, 0x98, 0x0, + 0x0, 0xa1, 0x71, 0xb0, 0xc, 0x0, 0x66, 0x0, + 0x0, 0x2, 0x61, 0xd6, 0x6d, 0x66, 0x96, 0x0, + 0x0, 0x9, 0x10, 0x20, 0xc, 0x0, 0x61, 0x0, + 0x2, 0x3a, 0x0, 0x76, 0x6d, 0x66, 0x63, 0x0, + 0x4, 0xd7, 0x5, 0x66, 0x6d, 0x66, 0x66, 0xa0, + 0x0, 0x95, 0x1, 0x0, 0x57, 0x61, 0x0, 0x0, + 0x0, 0xc5, 0x0, 0x3, 0xa0, 0xa, 0x60, 0x0, + 0x0, 0x94, 0x0, 0x78, 0x0, 0x0, 0x9e, 0x91, + 0x0, 0x0, 0x15, 0x10, 0x0, 0x0, 0x2, 0x0, + + /* U+6F38 "漸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x50, 0x0, 0xd, 0x10, 0x0, 0x0, 0x60, + 0x0, 0x3d, 0x0, 0xd, 0x3, 0x26, 0x79, 0x83, + 0x0, 0xa, 0x38, 0x6e, 0x68, 0x5a, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xd, 0x5, 0x3a, 0x0, 0x0, + 0x9, 0x20, 0x4e, 0x6e, 0x6e, 0x4a, 0x0, 0x50, + 0x3, 0xe1, 0x5d, 0xd, 0xd, 0x2c, 0x5d, 0x63, + 0x0, 0x85, 0x1d, 0x6e, 0x6d, 0x29, 0xd, 0x0, + 0x0, 0x8, 0xd, 0xd, 0xd, 0x29, 0xd, 0x0, + 0x0, 0x9, 0xe, 0x6e, 0x6d, 0x39, 0xd, 0x0, + 0x1, 0x86, 0x4, 0xd, 0x3, 0x47, 0xd, 0x0, + 0x6, 0xf3, 0x67, 0x6e, 0x6a, 0x85, 0xd, 0x0, + 0x0, 0xe1, 0x0, 0xd, 0x0, 0xa1, 0xd, 0x0, + 0x0, 0xf1, 0x0, 0xd, 0x1, 0x90, 0xd, 0x0, + 0x0, 0xc0, 0x0, 0xe, 0x8, 0x10, 0xd, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x21, 0x0, 0x7, 0x0, + + /* U+6FC3 "濃" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0xc0, 0xa3, 0x0, 0x0, + 0x0, 0x78, 0x2, 0x86, 0xd6, 0xc6, 0x6a, 0x0, + 0x0, 0xe, 0x24, 0x90, 0xb0, 0xa1, 0xd, 0x0, + 0x0, 0x2, 0x43, 0xb6, 0xd6, 0xc6, 0x6d, 0x0, + 0x8, 0x10, 0x63, 0x90, 0xb0, 0xa1, 0xd, 0x0, + 0x3, 0xe1, 0x63, 0x96, 0x66, 0x66, 0x68, 0x0, + 0x0, 0x96, 0x19, 0x76, 0x66, 0x66, 0x6a, 0x30, + 0x0, 0x9, 0x9, 0x40, 0x0, 0x0, 0x32, 0x0, + 0x0, 0x28, 0x9, 0x47, 0x66, 0x66, 0x64, 0x0, + 0x5, 0xc3, 0x9, 0x89, 0x67, 0x66, 0x67, 0x90, + 0x2, 0xf0, 0xa, 0x2d, 0x6, 0x1, 0xc3, 0x0, + 0x0, 0xe0, 0xc, 0xd, 0x2, 0x97, 0x20, 0x0, + 0x1, 0xf0, 0x28, 0xd, 0x14, 0x3b, 0x50, 0x0, + 0x0, 0x80, 0x80, 0xe, 0x81, 0x1, 0xaf, 0x91, + 0x0, 0x1, 0x10, 0x1, 0x0, 0x0, 0x0, 0x0, + + /* U+6FDF "濟" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x20, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, + 0x0, 0xa6, 0x0, 0x0, 0x8, 0x10, 0x6, 0x20, + 0x0, 0x2d, 0x17, 0x66, 0xa6, 0x98, 0x66, 0x40, + 0x0, 0x1, 0x40, 0x1, 0x94, 0xa3, 0x29, 0x0, + 0x29, 0x10, 0x56, 0xca, 0x89, 0x37, 0x91, 0x0, + 0x6, 0xb3, 0x21, 0xa7, 0x4c, 0xb, 0x45, 0x0, + 0x0, 0x77, 0x7, 0x49, 0x3c, 0xb, 0x3c, 0x20, + 0x0, 0x8, 0x18, 0x4d, 0xb, 0x1b, 0x25, 0xa1, + 0x0, 0x54, 0x20, 0xd2, 0x0, 0x0, 0x96, 0x0, + 0x13, 0xd0, 0x0, 0xe6, 0x66, 0x66, 0xb5, 0x0, + 0x7, 0xc0, 0x0, 0xd0, 0x0, 0x0, 0x95, 0x0, + 0x2, 0xb0, 0x0, 0xc6, 0x66, 0x66, 0xb5, 0x0, + 0x5, 0xb0, 0x6, 0x50, 0x0, 0x0, 0x95, 0x0, + 0x2, 0x80, 0x48, 0x0, 0x0, 0x0, 0x95, 0x0, + 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x52, 0x0, + + /* U+7063 "ç£" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x9, 0x40, 0xa, 0x10, 0x57, 0x0, + 0x0, 0xa5, 0x26, 0x65, 0x79, 0x94, 0x65, 0x70, + 0x0, 0x2c, 0x88, 0xa0, 0x46, 0x76, 0x7b, 0x0, + 0x0, 0x2, 0x27, 0x32, 0x45, 0x50, 0x72, 0x50, + 0x46, 0x4, 0x99, 0x59, 0x54, 0x66, 0xb5, 0xb0, + 0xb, 0x66, 0x23, 0x21, 0xb6, 0xc2, 0x31, 0x30, + 0x3, 0x77, 0xa5, 0x6a, 0xb1, 0xb6, 0x5a, 0xb0, + 0x0, 0x35, 0x50, 0x22, 0x85, 0x86, 0x54, 0x20, + 0x0, 0x80, 0x6, 0x76, 0x66, 0x66, 0xe3, 0x0, + 0x1, 0xb0, 0x5, 0x86, 0x66, 0x66, 0xe0, 0x0, + 0x3c, 0x90, 0x8, 0x50, 0x0, 0x0, 0x34, 0x0, + 0x6, 0x80, 0x8, 0x66, 0x66, 0x66, 0x9c, 0x0, + 0x8, 0x70, 0x0, 0x0, 0x0, 0x0, 0x76, 0x0, + 0x8, 0x80, 0x0, 0x0, 0x1, 0x53, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x70, 0x0, + + /* U+706B "ç«" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x30, 0x0, + 0x0, 0x2, 0x30, 0xc, 0x30, 0x4, 0xf2, 0x0, + 0x0, 0x9, 0x10, 0xd, 0x30, 0xc, 0x30, 0x0, + 0x0, 0x4d, 0x0, 0xe, 0x60, 0x92, 0x0, 0x0, + 0x2, 0xf5, 0x0, 0x1e, 0x46, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x69, 0x8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc3, 0x6, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xb0, 0x0, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x10, 0x0, 0x2d, 0x40, 0x0, + 0x0, 0x3, 0xb1, 0x0, 0x0, 0x3, 0xea, 0x30, + 0x1, 0x76, 0x0, 0x0, 0x0, 0x0, 0x2c, 0x70, + 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+707D "ç½" */ + 0x0, 0x0, 0xa0, 0x2, 0x80, 0x0, 0x91, 0x0, + 0x0, 0x7, 0x70, 0xa, 0x50, 0x7, 0x80, 0x0, + 0x0, 0x27, 0x0, 0x45, 0x0, 0x18, 0x0, 0x0, + 0x0, 0x70, 0x0, 0x80, 0x0, 0x80, 0x0, 0x0, + 0x0, 0x1b, 0x20, 0x4a, 0x10, 0x1a, 0x10, 0x0, + 0x0, 0x4, 0xb0, 0x6, 0xa0, 0x3, 0xd0, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x20, 0x0, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x60, 0xd, 0x70, 0x7, 0x60, 0x0, + 0x0, 0x8, 0x60, 0xe, 0x51, 0x49, 0x10, 0x0, + 0x0, 0x4d, 0x10, 0x79, 0xa, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xd1, 0x4, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x3d, 0x30, 0x0, 0x8c, 0x30, 0x0, + 0x0, 0x39, 0x91, 0x0, 0x0, 0x5, 0xec, 0x81, + 0x5, 0x40, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, + + /* U+70B9 "点" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x3c, 0x66, 0x66, 0xd3, 0x0, 0x0, 0x0, 0x3b, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x0, + 0x1, 0x0, 0x0, 0x1c, 0x66, 0x7a, 0x66, 0x6f, + 0x20, 0x0, 0xe, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x1f, + 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, 0x6, 0x0, + 0x0, 0x0, 0x4, 0x0, 0x0, 0x60, 0x6, 0x0, + 0x52, 0x6, 0x30, 0x3, 0x80, 0x9, 0x50, 0x1d, + 0x0, 0xd3, 0x2f, 0x30, 0x5, 0x70, 0xa, 0x0, + 0x77, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+70BA "為" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x71, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3c, 0xa, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xe, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x67, 0x66, 0xab, 0x66, 0x6e, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xc1, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xb6, 0x66, 0x8a, 0x8a, 0x0, + 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0xa2, 0x0, + 0x0, 0x0, 0xa8, 0x66, 0x66, 0x66, 0xd7, 0xa0, + 0x0, 0x7, 0x50, 0x0, 0x0, 0x0, 0x4, 0xa0, + 0x0, 0x56, 0x11, 0x10, 0x51, 0x28, 0x6, 0x70, + 0x5, 0x40, 0x80, 0xa1, 0x1d, 0x18, 0x58, 0x50, + 0x1, 0x7, 0x80, 0x6a, 0x7, 0x21, 0x2a, 0x30, + 0x0, 0x1d, 0x20, 0x4, 0x0, 0x0, 0xe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, + + /* U+7121 "ç„¡" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0x70, 0x0, 0x0, 0x5, 0x0, 0x0, 0x4f, 0x6b, + 0x66, 0xb6, 0xb7, 0x40, 0x1, 0x9d, 0xb, 0x0, + 0xb0, 0xd0, 0x0, 0x6, 0xd, 0xb, 0x0, 0xb0, + 0xd0, 0x0, 0x0, 0xd, 0xb, 0x0, 0xb0, 0xd0, + 0x60, 0x7, 0x6e, 0x6d, 0x66, 0xd6, 0xe6, 0x83, + 0x0, 0xd, 0xb, 0x0, 0xb0, 0xd0, 0x0, 0x0, + 0xd, 0xb, 0x0, 0xb0, 0xd0, 0x0, 0x0, 0xd, + 0xb, 0x0, 0xb0, 0xd0, 0x83, 0x47, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x64, 0x0, 0x60, 0x34, 0x0, + 0x90, 0x6, 0x50, 0x6, 0x70, 0xc, 0x20, 0x5a, + 0x0, 0xd3, 0x5e, 0x10, 0x9, 0x60, 0xa, 0x0, + 0x74, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + + /* U+7136 "ç„¶" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe3, 0x0, 0x1, 0xd2, 0x0, 0x0, + 0x0, 0x3, 0xd0, 0x0, 0x1, 0xd2, 0xa1, 0x0, + 0x0, 0x9, 0xa6, 0x6c, 0x11, 0xd0, 0x98, 0x0, + 0x0, 0xd, 0x0, 0x4b, 0x1, 0xc0, 0x25, 0x0, + 0x0, 0x77, 0xb3, 0x87, 0x87, 0xd6, 0x6b, 0x70, + 0x1, 0xb5, 0x27, 0xd1, 0x4, 0x96, 0x0, 0x0, + 0x7, 0xa, 0x55, 0x90, 0x7, 0x68, 0x0, 0x0, + 0x0, 0x2, 0x3c, 0x10, 0xc, 0x12, 0xa0, 0x0, + 0x0, 0x0, 0x95, 0x0, 0x76, 0x0, 0x98, 0x0, + 0x0, 0x8, 0x50, 0x6, 0x60, 0x0, 0xd, 0xd2, + 0x2, 0x72, 0x0, 0x51, 0x0, 0x0, 0x1, 0x10, + 0x1, 0x6, 0x2, 0x60, 0x8, 0x0, 0x83, 0x0, + 0x0, 0x4a, 0x0, 0xd2, 0x7, 0xa0, 0x1e, 0x20, + 0x1, 0xe5, 0x0, 0xb4, 0x2, 0xc0, 0xa, 0x40, + 0x0, 0x20, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+7159 "ç…™" */ + 0x0, 0x8, 0x20, 0x0, 0x0, 0x0, 0x3, 0x20, + 0x0, 0xd, 0x20, 0x67, 0x6c, 0x6c, 0x67, 0x60, + 0x0, 0xd, 0x10, 0x0, 0xd, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x1a, 0x4a, 0x6e, 0x6e, 0x6c, 0x30, + 0x2, 0x2c, 0x68, 0xc, 0xd, 0xd, 0xd, 0x0, + 0x7, 0x3c, 0x60, 0xc, 0xd, 0xd, 0xd, 0x0, + 0x2e, 0x1c, 0x0, 0xc, 0xd, 0xd, 0xd, 0x0, + 0x13, 0xd, 0x0, 0xd, 0x69, 0x69, 0x6c, 0x0, + 0x0, 0xe, 0x0, 0x4, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0xe, 0x60, 0x0, 0x0, 0xd0, 0x2, 0x0, + 0x0, 0x2a, 0x4c, 0x17, 0x66, 0xe6, 0x78, 0x0, + 0x0, 0x75, 0xa, 0x50, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xb0, 0x1, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x8, 0x20, 0x3, 0x66, 0x66, 0xe6, 0x67, 0xd1, + 0x22, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+71B1 "熱" */ + 0x0, 0x0, 0xb3, 0x0, 0x3, 0x80, 0x0, 0x0, + 0x0, 0xc, 0x4, 0x0, 0x39, 0x0, 0x0, 0x0, + 0x76, 0xd6, 0x73, 0x25, 0xb4, 0xa0, 0x0, 0x0, + 0xc, 0x1, 0x44, 0x69, 0x3b, 0x0, 0x6, 0x79, + 0x68, 0x76, 0x5, 0x72, 0xa0, 0x0, 0x9, 0x82, + 0xa, 0x82, 0x75, 0x2a, 0x0, 0x7, 0x40, 0xc3, + 0xb, 0x3d, 0x51, 0xb0, 0x1, 0x26, 0x6d, 0x6c, + 0x21, 0xce, 0x4d, 0x2, 0x0, 0x20, 0xc0, 0x0, + 0x83, 0x34, 0x86, 0x60, 0x2, 0x5e, 0x75, 0x66, + 0x0, 0x1, 0xd9, 0x8, 0xb5, 0x10, 0x4, 0x0, + 0x0, 0x2, 0x70, 0x1, 0x60, 0x16, 0x1, 0x90, + 0x8, 0x30, 0x0, 0xa3, 0x0, 0xa4, 0x7, 0x90, + 0x1e, 0x10, 0x9b, 0x0, 0x5, 0x60, 0x18, 0x0, + 0xa3, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+71DF "營" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x60, 0x0, 0x29, 0x0, 0x0, 0x0, + 0x6, 0x75, 0x95, 0x33, 0x83, 0xb0, 0x0, 0x9, + 0x49, 0x82, 0x2b, 0x5a, 0x60, 0x0, 0x0, 0x40, + 0xc7, 0x85, 0x3a, 0x57, 0x40, 0x0, 0x0, 0x83, + 0x6, 0x55, 0x70, 0xb, 0x70, 0x0, 0x41, 0x0, + 0x2, 0x40, 0x0, 0x18, 0x0, 0x2a, 0x66, 0x66, + 0x66, 0x66, 0x69, 0xd2, 0xd, 0x30, 0xa6, 0x66, + 0x66, 0xd3, 0x60, 0x0, 0x20, 0xb, 0x0, 0x0, + 0xc, 0x0, 0x0, 0x0, 0x0, 0xc6, 0x66, 0x66, + 0xd1, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x1, + 0x50, 0x0, 0x0, 0xd, 0x66, 0x66, 0x66, 0x6d, + 0x50, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xb2, + 0x0, 0x0, 0xc, 0x66, 0x66, 0x66, 0x6d, 0x30, + 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x51, 0x0, + + /* U+722D "爭" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x6b, 0x20, 0x0, + 0x4, 0x56, 0x78, 0x9a, 0x98, 0x73, 0x0, 0x0, + 0x31, 0x0, 0x81, 0x0, 0x1c, 0x10, 0x0, 0x0, + 0xc3, 0x2, 0xd0, 0x9, 0x40, 0x0, 0x0, 0x4, + 0x60, 0x6, 0x4, 0x50, 0x0, 0x0, 0x3, 0x66, + 0x66, 0x66, 0x76, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0x2a, 0x0, 0xd, 0x0, 0x2, 0x66, 0x66, 0x67, + 0xc6, 0x66, 0xe6, 0xd3, 0x1, 0x0, 0x0, 0x2a, + 0x0, 0xd, 0x0, 0x0, 0x3, 0x66, 0x67, 0xc6, + 0x66, 0xe0, 0x0, 0x0, 0x1, 0x0, 0x2a, 0x0, + 0x7, 0x0, 0x0, 0x0, 0x0, 0x2, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x3a, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, + 0x0, + + /* U+7236 "父" */ + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x80, 0x2, 0x61, 0x0, 0x0, + 0x0, 0x0, 0xa9, 0x0, 0x0, 0x1a, 0x70, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, 0xbb, 0x0, + 0x0, 0x84, 0x10, 0x0, 0x0, 0x43, 0x1d, 0x20, + 0x6, 0x10, 0x23, 0x0, 0x0, 0xc6, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x0, 0x3, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x50, 0xb, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa2, 0x4a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xb3, 0x2d, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x79, 0x10, 0x0, 0x8f, 0xb6, 0x30, + 0x0, 0x68, 0x30, 0x0, 0x0, 0x1, 0x8d, 0x81, + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7238 "爸" */ + 0x0, 0x0, 0x6, 0x60, 0x0, 0x54, 0x0, 0x0, + 0x0, 0x0, 0x5c, 0x30, 0x0, 0x5, 0xc4, 0x0, + 0x0, 0x7, 0x72, 0x40, 0x4, 0xc0, 0x3f, 0x0, + 0x1, 0x61, 0x0, 0x57, 0x4c, 0x10, 0x1, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xb4, 0x8, 0xb8, 0x53, 0x31, + 0x4, 0x68, 0x92, 0x0, 0x0, 0x8, 0x8a, 0x91, + 0x0, 0x0, 0xd6, 0x67, 0xc6, 0x6e, 0x30, 0x0, + 0x0, 0x0, 0xc0, 0x3, 0xa0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xc0, 0x3, 0xa0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6a, 0x2, 0x0, + 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x6, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xb, 0x10, + 0x0, 0x0, 0xbc, 0xcc, 0xcc, 0xcc, 0xcd, 0x30, + + /* U+7247 "片" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0xf, + 0x20, 0x0, 0xd1, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0xd1, 0x0, 0x10, 0x0, 0xe, 0x66, 0x66, 0xe6, + 0x66, 0xf5, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x66, 0x66, 0x6c, 0x30, 0x0, 0x0, + 0x3b, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x67, + 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0xb1, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x3, 0x90, 0x0, 0x0, + 0xd, 0x10, 0x0, 0x9, 0x0, 0x0, 0x0, 0xd, + 0x10, 0x0, 0x50, 0x0, 0x0, 0x0, 0xd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + + /* U+725B "牛" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x9, 0x60, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe3, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0x66, 0x6e, 0x66, 0x6b, 0xa0, 0x0, 0xa, 0x30, + 0x1, 0xd0, 0x0, 0x0, 0x0, 0x2, 0x90, 0x0, + 0x1d, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x1, + 0xd0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1d, + 0x0, 0x0, 0x84, 0x4, 0x76, 0x66, 0x66, 0xe6, + 0x66, 0x69, 0x80, 0x0, 0x0, 0x0, 0x1d, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, + + /* U+7260 "牠" */ + 0x0, 0x0, 0xc1, 0x0, 0x0, 0x85, 0x0, 0x0, + 0x0, 0x10, 0xd0, 0x0, 0x0, 0xa2, 0x0, 0x0, + 0x0, 0xf4, 0xd0, 0x0, 0x90, 0xa2, 0x0, 0x0, + 0x1, 0xd0, 0xd0, 0x0, 0xc0, 0xa2, 0x5, 0x10, + 0x4, 0xb6, 0xe9, 0x80, 0xc0, 0xb7, 0x6c, 0x60, + 0x8, 0x20, 0xd0, 0x26, 0xd6, 0xb2, 0x9, 0x30, + 0x8, 0x0, 0xd0, 0x31, 0xc0, 0xa2, 0x9, 0x30, + 0x21, 0x0, 0xd0, 0x10, 0xc0, 0xa2, 0xa, 0x20, + 0x0, 0x0, 0xe7, 0x20, 0xc0, 0xa2, 0xc, 0x10, + 0x2, 0x79, 0xd0, 0x0, 0xc0, 0xa6, 0xcd, 0x0, + 0xb, 0x50, 0xd0, 0x0, 0xc0, 0xa2, 0x31, 0x20, + 0x0, 0x0, 0xd0, 0x0, 0xc0, 0x71, 0x0, 0x60, + 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x0, 0xc0, + 0x0, 0x0, 0xd0, 0x0, 0x9b, 0xbb, 0xbc, 0xb1, + 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7269 "物" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x78, 0x0, 0x0, 0x0, + 0x0, 0x50, 0xd0, 0x0, 0xb4, 0x0, 0x0, 0x0, + 0x0, 0xe2, 0xd0, 0x1, 0xd0, 0x0, 0x0, 0x30, + 0x2, 0xb0, 0xd3, 0x36, 0x99, 0x97, 0xb6, 0xe0, + 0x6, 0x96, 0xe6, 0x5a, 0xb, 0x25, 0x91, 0xc0, + 0x8, 0x0, 0xd0, 0x52, 0xc, 0x8, 0x62, 0xb0, + 0x13, 0x0, 0xd0, 0x30, 0x75, 0xd, 0x13, 0xb0, + 0x0, 0x0, 0xd5, 0x41, 0xb0, 0x2c, 0x4, 0xa0, + 0x0, 0x39, 0xe1, 0x8, 0x10, 0x86, 0x5, 0x90, + 0xb, 0xa1, 0xd0, 0x43, 0x1, 0xc0, 0x6, 0x70, + 0x1, 0x0, 0xd0, 0x20, 0xa, 0x30, 0x8, 0x60, + 0x0, 0x0, 0xd0, 0x0, 0x74, 0x0, 0xa, 0x40, + 0x0, 0x0, 0xd0, 0x5, 0x40, 0x53, 0x4e, 0x10, + 0x0, 0x0, 0xe0, 0x41, 0x0, 0xa, 0xf6, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x1, 0x10, 0x0, + + /* U+7279 "特" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xc1, 0x0, 0x1, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x1, 0xd0, 0x0, 0x0, + 0x3, 0xd1, 0xd0, 0x18, 0x66, 0xe6, 0xa8, 0x0, + 0x5, 0x90, 0xd0, 0x10, 0x1, 0xd0, 0x0, 0x0, + 0x7, 0x86, 0xe7, 0xb0, 0x1, 0xd0, 0x0, 0x20, + 0x9, 0x0, 0xd0, 0x76, 0x66, 0xb6, 0x69, 0xb0, + 0x6, 0x0, 0xd0, 0x0, 0x0, 0x8, 0x60, 0x0, + 0x0, 0x0, 0xe6, 0x50, 0x0, 0x9, 0x51, 0x60, + 0x0, 0x28, 0xe1, 0x57, 0x66, 0x6b, 0x96, 0x71, + 0xa, 0xc4, 0xd0, 0x7, 0x0, 0x9, 0x50, 0x0, + 0x3, 0x0, 0xd0, 0x5, 0xc0, 0x9, 0x50, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x9, 0x50, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x10, 0x9, 0x40, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x5, 0xdf, 0x20, 0x0, + 0x0, 0x0, 0x60, 0x0, 0x0, 0x22, 0x0, 0x0, + + /* U+72AC "犬" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x3, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x0, 0xb9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0x0, 0x4, 0x3, 0x20, + 0x5, 0x76, 0x66, 0x7d, 0x76, 0x66, 0x6a, 0xa0, + 0x0, 0x0, 0x0, 0x59, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x86, 0x52, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc2, 0x19, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xd0, 0x8, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x60, 0x1, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0x0, 0x0, 0x5d, 0x20, 0x0, + 0x0, 0x5, 0xa0, 0x0, 0x0, 0x7, 0xf7, 0x10, + 0x0, 0x86, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xb1, + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+72AF "犯" */ + 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x72, 0x8, 0xc2, 0xa6, 0x66, 0x6c, 0x20, + 0x0, 0x9, 0x7b, 0x0, 0xd0, 0x0, 0xe, 0x0, + 0x0, 0x3, 0xf0, 0x0, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x39, 0x84, 0x0, 0xd0, 0x0, 0xd, 0x0, + 0x4, 0x50, 0x49, 0x0, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x9c, 0x0, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x3, 0xae, 0x0, 0xd0, 0x11, 0x1d, 0x0, + 0x0, 0x1a, 0xe, 0x0, 0xd0, 0x28, 0xfa, 0x0, + 0x0, 0x91, 0xe, 0x0, 0xd0, 0x0, 0x40, 0x0, + 0x6, 0x0, 0xd, 0x0, 0xd0, 0x0, 0x0, 0x40, + 0x0, 0x0, 0x2c, 0x0, 0xd0, 0x0, 0x0, 0x80, + 0x0, 0x0, 0x78, 0x0, 0xe0, 0x0, 0x0, 0xd3, + 0x0, 0x7d, 0xd1, 0x0, 0x7e, 0xdd, 0xdd, 0xd3, + 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+72B6 "状" */ + 0x0, 0x0, 0xa3, 0x0, 0x19, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x1d, 0x4, 0x91, 0x0, + 0x1, 0x0, 0xd1, 0x0, 0xd, 0x0, 0x8c, 0x0, + 0x9, 0x30, 0xc1, 0x0, 0xd, 0x0, 0x6, 0x0, + 0x2, 0xe1, 0xc1, 0x0, 0xd, 0x0, 0x8, 0x20, + 0x0, 0xc1, 0xc4, 0x76, 0x6e, 0x86, 0x67, 0x50, + 0x0, 0x0, 0xc1, 0x0, 0x2b, 0x60, 0x0, 0x0, + 0x0, 0x3, 0xe1, 0x0, 0x59, 0x70, 0x0, 0x0, + 0x0, 0x65, 0xc1, 0x0, 0x76, 0x45, 0x0, 0x0, + 0x1a, 0x70, 0xc1, 0x0, 0xc2, 0xb, 0x0, 0x0, + 0x29, 0x0, 0xc1, 0x2, 0xb0, 0xa, 0x40, 0x0, + 0x0, 0x0, 0xc1, 0xa, 0x40, 0x3, 0xd1, 0x0, + 0x0, 0x0, 0xd1, 0x39, 0x0, 0x0, 0xad, 0x20, + 0x0, 0x0, 0xd4, 0x90, 0x0, 0x0, 0xd, 0x90, + 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+72C0 "ç‹€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x10, 0xa, 0x50, 0x0, 0x0, + 0x0, 0xc1, 0xd, 0x0, 0xb, 0x23, 0x70, 0x0, + 0x0, 0xd0, 0xd, 0x0, 0xb, 0x20, 0x97, 0x0, + 0x0, 0xd0, 0xd, 0x0, 0xb, 0x20, 0x14, 0x0, + 0x0, 0xd0, 0xd, 0x13, 0x3c, 0x53, 0x35, 0xa0, + 0x3, 0xc6, 0x6d, 0x24, 0x3c, 0x93, 0x33, 0x31, + 0x0, 0x0, 0xd, 0x0, 0xd, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0xd, 0x44, 0x0, 0x0, + 0x4, 0x9a, 0x6d, 0x0, 0x3b, 0x1a, 0x0, 0x0, + 0x0, 0x77, 0xd, 0x0, 0x76, 0xb, 0x20, 0x0, + 0x0, 0xa4, 0xd, 0x0, 0xc1, 0x5, 0xb0, 0x0, + 0x0, 0xc0, 0xd, 0x3, 0xa0, 0x0, 0xc6, 0x0, + 0x5, 0x50, 0xd, 0xa, 0x20, 0x0, 0x3f, 0x70, + 0x7, 0x0, 0xe, 0x54, 0x0, 0x0, 0x5, 0xa2, + 0x10, 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+72EC "独" */ + 0x0, 0x0, 0x5, 0x30, 0x0, 0xb1, 0x0, 0x0, + 0x2, 0x71, 0x1e, 0x40, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x1a, 0xb5, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x9, 0xc0, 0xa, 0x66, 0xe6, 0x6b, 0x20, + 0x0, 0x84, 0xc2, 0xe, 0x0, 0xe0, 0xe, 0x0, + 0x6, 0x10, 0x96, 0xe, 0x0, 0xe0, 0xe, 0x0, + 0x0, 0x2, 0xe9, 0xe, 0x0, 0xe0, 0xe, 0x0, + 0x0, 0xa, 0x6b, 0xe, 0x0, 0xe0, 0xe, 0x0, + 0x0, 0x57, 0x2c, 0xf, 0x66, 0xe6, 0x6f, 0x0, + 0x3, 0x80, 0x2c, 0x8, 0x0, 0xe0, 0x4, 0x0, + 0x15, 0x0, 0x3b, 0x0, 0x0, 0xe0, 0x35, 0x0, + 0x0, 0x0, 0x5a, 0x0, 0x0, 0xe0, 0x9, 0x50, + 0x0, 0x10, 0xa6, 0x46, 0x79, 0xe8, 0x64, 0xf0, + 0x0, 0x4e, 0xb0, 0x7a, 0x62, 0x0, 0x0, 0x80, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+72ED "ç‹­" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x0, 0xc, 0x20, 0x0, 0x0, + 0x2, 0x60, 0x3b, 0x10, 0xe, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0xb0, 0x0, 0xe, 0x0, 0x7, 0x0, + 0x0, 0x1d, 0x60, 0x76, 0x6e, 0x66, 0x68, 0x20, + 0x1, 0x92, 0xb0, 0x30, 0xe, 0x0, 0x91, 0x0, + 0x15, 0x0, 0xe0, 0x49, 0xe, 0x2, 0xc0, 0x0, + 0x0, 0x4, 0xf3, 0xe, 0x1e, 0x8, 0x10, 0x0, + 0x0, 0xb, 0x95, 0x4, 0xe, 0x3, 0x3, 0x30, + 0x0, 0x83, 0x78, 0x86, 0x6d, 0x86, 0x68, 0x70, + 0x4, 0x50, 0x77, 0x0, 0x58, 0x50, 0x0, 0x0, + 0x23, 0x0, 0x86, 0x0, 0xa3, 0x17, 0x0, 0x0, + 0x0, 0x0, 0xa4, 0x3, 0xa0, 0x9, 0x40, 0x0, + 0x1, 0x33, 0xe0, 0x1b, 0x10, 0x0, 0xd6, 0x0, + 0x0, 0x6e, 0x44, 0x81, 0x0, 0x0, 0x2d, 0xb1, + 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+732B "猫" */ + 0x1, 0x0, 0x6, 0x20, 0x55, 0x6, 0x60, 0x0, + 0x2, 0x70, 0x1e, 0x50, 0x76, 0x8, 0x50, 0x0, + 0x0, 0x1a, 0xc4, 0x0, 0x75, 0x8, 0x51, 0x40, + 0x0, 0xa, 0xa2, 0x86, 0xa9, 0x6b, 0x97, 0x81, + 0x0, 0x82, 0xb1, 0x0, 0x75, 0x8, 0x50, 0x0, + 0x5, 0x0, 0x95, 0x0, 0x53, 0x5, 0x20, 0x0, + 0x0, 0x1, 0xe8, 0xc, 0x66, 0x86, 0x6d, 0x20, + 0x0, 0x9, 0x6a, 0xd, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0x47, 0x2a, 0xd, 0x0, 0xd0, 0xd, 0x0, + 0x2, 0x70, 0x2a, 0xd, 0x66, 0xe6, 0x6e, 0x0, + 0x15, 0x0, 0x49, 0xd, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0x0, 0x77, 0xd, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0x44, 0xd2, 0xe, 0x66, 0xe6, 0x6e, 0x0, + 0x0, 0x1c, 0x70, 0xc, 0x0, 0x0, 0x9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+733F "猿" */ + 0x0, 0x0, 0x4, 0x0, 0xa, 0x20, 0x0, 0x0, + 0x5, 0x30, 0x5e, 0x10, 0xe, 0x0, 0x80, 0x0, + 0x0, 0x67, 0xd2, 0x27, 0x6e, 0x66, 0x62, 0x0, + 0x0, 0xe, 0x50, 0x0, 0xe, 0x0, 0x6, 0x50, + 0x0, 0x96, 0x85, 0x76, 0x66, 0x66, 0x66, 0x50, + 0x16, 0x11, 0xd0, 0x1a, 0x66, 0x66, 0xd2, 0x0, + 0x0, 0x6, 0xf0, 0xc, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xb, 0xb3, 0x1d, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0x82, 0xb3, 0x15, 0x86, 0x50, 0x37, 0x30, + 0x4, 0x50, 0xb4, 0x3, 0xb0, 0x80, 0x7a, 0x30, + 0x23, 0x0, 0xc3, 0x3e, 0x70, 0x3c, 0x20, 0x0, + 0x0, 0x0, 0xe5, 0x65, 0x50, 0xa, 0x70, 0x0, + 0x0, 0x15, 0xd0, 0x4, 0x77, 0x30, 0xcc, 0x50, + 0x0, 0x6f, 0x40, 0x6, 0xc1, 0x0, 0x9, 0x80, + 0x0, 0x1, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + + /* U+7372 "ç²" */ + 0x0, 0x0, 0x3, 0x0, 0x63, 0x4, 0x80, 0x0, + 0x5, 0x30, 0x3e, 0x66, 0xb7, 0x68, 0xb8, 0xa0, + 0x0, 0x76, 0xc3, 0x11, 0x84, 0x14, 0x80, 0x0, + 0x0, 0xd, 0x60, 0x8, 0x40, 0xc1, 0x0, 0x0, + 0x0, 0x87, 0x80, 0x1e, 0x66, 0xa6, 0x6c, 0x10, + 0x7, 0x30, 0xc0, 0x9c, 0x0, 0xd0, 0x24, 0x0, + 0x10, 0x5, 0xf4, 0x2d, 0x66, 0xe6, 0x66, 0x0, + 0x0, 0xc, 0xc2, 0xd, 0x55, 0xe5, 0x77, 0x0, + 0x0, 0x56, 0x93, 0xd, 0x66, 0xc6, 0x69, 0x60, + 0x2, 0x90, 0x94, 0x6, 0x0, 0x0, 0x40, 0x0, + 0x7, 0x0, 0xa3, 0x7, 0x96, 0x67, 0xe4, 0x0, + 0x10, 0x0, 0xb2, 0x0, 0x37, 0x1b, 0x30, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x7, 0xf4, 0x0, 0x0, + 0x1, 0x8d, 0xa0, 0x2, 0x89, 0x4b, 0xa7, 0x60, + 0x0, 0x8, 0x14, 0x54, 0x0, 0x0, 0x37, 0x20, + + /* U+73A9 "玩" */ + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x18, 0x6a, 0x6a, 0x54, 0x76, 0x66, 0x78, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x40, + 0x5, 0x6e, 0x7c, 0x37, 0x98, 0x6b, 0x67, 0x90, + 0x1, 0xd, 0x10, 0x0, 0xa4, 0xe, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xb3, 0xe, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xe0, 0xe, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x11, 0xd0, 0xe, 0x0, 0x0, + 0x0, 0xe, 0x86, 0x26, 0x80, 0xe, 0x0, 0x40, + 0x3c, 0xc5, 0x0, 0xd, 0x10, 0xe, 0x0, 0x70, + 0x6, 0x0, 0x0, 0xa4, 0x0, 0xe, 0x0, 0xb0, + 0x0, 0x0, 0x29, 0x30, 0x0, 0xc, 0xcc, 0xe2, + 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+73FE "ç¾" */ + 0x0, 0x0, 0x3, 0x2, 0x0, 0x0, 0x3, 0x0, + 0x7, 0x6a, 0x69, 0x3e, 0x66, 0x66, 0x6e, 0x10, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xc, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x66, 0x66, 0x6c, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xc, 0x0, + 0x0, 0xd, 0x5, 0xd, 0x33, 0x33, 0x3c, 0x0, + 0x6, 0x7e, 0x67, 0x2d, 0x33, 0x33, 0x3c, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xc, 0x0, + 0x0, 0xd, 0x0, 0xe, 0x7b, 0x6c, 0x6c, 0x0, + 0x0, 0xd, 0x0, 0x3, 0x58, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x14, 0x30, 0xa3, 0xd, 0x0, 0x10, + 0x16, 0x9b, 0x61, 0x2, 0xb0, 0xd, 0x0, 0x60, + 0x1a, 0x30, 0x0, 0x1b, 0x20, 0xd, 0x0, 0xa0, + 0x0, 0x0, 0x3, 0x92, 0x0, 0xc, 0xcc, 0xe3, + 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7403 "çƒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xb0, 0x40, 0x0, + 0x0, 0x0, 0x4, 0x0, 0x1, 0xc0, 0x6a, 0x0, + 0x7, 0x6d, 0x68, 0x20, 0x1, 0xc0, 0x8, 0x10, + 0x0, 0xe, 0x0, 0x66, 0x66, 0xd6, 0x68, 0xc1, + 0x0, 0xe, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x56, 0x1, 0xe3, 0x8, 0x60, + 0x7, 0x6e, 0x6a, 0xc, 0x61, 0xc7, 0x3b, 0x20, + 0x0, 0xe, 0x0, 0x4, 0x51, 0xc8, 0x60, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x4, 0xc3, 0x80, 0x0, + 0x0, 0xe, 0x2, 0x32, 0x84, 0xc0, 0xb3, 0x0, + 0x0, 0x3e, 0x85, 0x9b, 0x11, 0xc0, 0x2e, 0x40, + 0x2d, 0xa2, 0x1, 0x90, 0x1, 0xc0, 0x6, 0xd3, + 0x3, 0x0, 0x0, 0x1, 0x12, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8f, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + + /* U+7406 "ç†" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x7, 0xc, 0x66, 0x96, 0x6e, 0x0, + 0x7, 0x6d, 0x67, 0x2c, 0x0, 0xc0, 0xc, 0x0, + 0x0, 0xd, 0x0, 0xc, 0x0, 0xc0, 0xc, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x66, 0xd6, 0x6c, 0x0, + 0x0, 0xd, 0x4, 0xc, 0x0, 0xc0, 0xc, 0x0, + 0x7, 0x6e, 0x69, 0x2c, 0x0, 0xc0, 0xc, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x66, 0xd6, 0x6c, 0x0, + 0x0, 0xd, 0x0, 0x4, 0x0, 0xc0, 0x1, 0x0, + 0x0, 0xd, 0x0, 0x20, 0x0, 0xc0, 0x3, 0x0, + 0x0, 0xd, 0x87, 0x27, 0x66, 0xd6, 0x79, 0x10, + 0x1a, 0xd7, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, + 0x6, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x1, 0x40, + 0x0, 0x0, 0x7, 0x66, 0x66, 0x86, 0x67, 0x80, + + /* U+74B0 "ç’°" */ + 0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x4, 0x0, + 0x7, 0x68, 0x7b, 0x3b, 0x6c, 0x6c, 0x6d, 0x0, + 0x0, 0xc, 0x0, 0x29, 0xb, 0xb, 0xb, 0x0, + 0x0, 0xc, 0x0, 0x2b, 0x69, 0x69, 0x6b, 0x0, + 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, + 0x3, 0x4d, 0x68, 0x76, 0x66, 0x66, 0x66, 0x50, + 0x3, 0x3c, 0x21, 0x7, 0x66, 0x66, 0x95, 0x0, + 0x0, 0xc, 0x0, 0xc, 0x0, 0x0, 0x75, 0x0, + 0x0, 0xc, 0x0, 0xc, 0x66, 0x66, 0xa5, 0x0, + 0x0, 0xc, 0x0, 0x6, 0x4a, 0x50, 0x25, 0x80, + 0x0, 0x1d, 0x75, 0x2, 0xe1, 0x35, 0x78, 0x20, + 0x1d, 0xc4, 0x0, 0x3a, 0xc0, 0x7, 0x50, 0x0, + 0x2, 0x0, 0x5, 0x50, 0xb1, 0x50, 0x9b, 0x40, + 0x0, 0x0, 0x10, 0x0, 0xe9, 0x0, 0x6, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, + + /* U+7518 "甘" */ + 0x0, 0x0, 0xa3, 0x0, 0x0, 0x93, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0xc1, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, + 0xc, 0x10, 0x0, 0xc, 0x10, 0xb3, 0x37, 0x66, + 0xd6, 0x66, 0x66, 0xd6, 0x66, 0x40, 0x0, 0xc, + 0x10, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, 0xc1, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xc, 0x10, + 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, 0xc6, 0x66, + 0x66, 0xd1, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, + 0xc, 0x10, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0xc1, 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0xc, + 0x10, 0x0, 0x0, 0x0, 0xd6, 0x66, 0x66, 0xd2, + 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, 0xc, 0x20, + 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x20, 0x0, + 0x0, + + /* U+751A "甚" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x70, 0x0, 0xd, 0x20, 0x0, 0x0, + 0x0, 0x75, 0x0, 0x0, 0xe0, 0x24, 0x0, 0x37, + 0x6a, 0x96, 0x66, 0x6e, 0x67, 0x80, 0x0, 0x0, + 0x75, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x7, + 0x96, 0x66, 0x6e, 0x0, 0x0, 0x0, 0x0, 0x75, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x7, 0x96, + 0x66, 0x6e, 0x0, 0x0, 0x0, 0x0, 0x75, 0x0, + 0x0, 0xe0, 0x0, 0x2, 0x66, 0x6a, 0x96, 0x66, + 0x6e, 0x66, 0xc7, 0x1, 0xb, 0x20, 0x22, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb2, 0xc, 0x80, 0x1a, + 0x50, 0x0, 0x0, 0xb, 0x26, 0x80, 0x0, 0x1e, + 0x60, 0x0, 0x0, 0xb6, 0x70, 0x0, 0x0, 0x37, + 0x0, 0x0, 0xd, 0xa6, 0x66, 0x66, 0x66, 0xc8, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+751F "生" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x90, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x70, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0x0, 0xa, 0x40, 0x0, 0x82, 0x0, + 0x0, 0x6a, 0x66, 0x6c, 0x86, 0x66, 0x75, 0x0, + 0x0, 0xb0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x4, 0x50, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x7, 0x0, 0x0, 0xa, 0x40, 0x2, 0x30, 0x0, + 0x0, 0x6, 0x66, 0x6c, 0x86, 0x69, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x7, 0x20, + 0x18, 0x66, 0x66, 0x67, 0x66, 0x66, 0x69, 0x60, + + /* U+7522 "產" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x36, 0x66, 0x6a, 0x76, 0x66, 0xa7, 0x0, 0x0, + 0x10, 0x34, 0x0, 0x3d, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xb8, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x27, 0x75, 0xc5, 0x0, 0x0, 0x0, 0x30, 0x33, + 0x0, 0x0, 0xa0, 0x45, 0x0, 0xa, 0x86, 0x76, + 0x69, 0x66, 0x66, 0x50, 0x0, 0x94, 0xc, 0x30, + 0xd2, 0x0, 0x0, 0x0, 0xa, 0x33, 0xd6, 0x6e, + 0x66, 0x7b, 0x0, 0x0, 0xb1, 0x80, 0x0, 0xd0, + 0x0, 0x0, 0x0, 0xb, 0x23, 0x0, 0xd, 0x0, + 0x61, 0x0, 0x0, 0xa1, 0x7, 0x66, 0xe6, 0x66, + 0x30, 0x0, 0x44, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x7, 0x5, 0x66, 0x66, 0xe6, 0x66, 0x7e, + 0x31, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7523 "産" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x36, 0x66, 0x6a, 0x86, 0x66, 0xd8, 0x0, 0x0, + 0x10, 0x50, 0x0, 0x37, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x90, 0x7, 0x60, 0x0, 0x0, 0x3, 0x0, + 0x7, 0x0, 0x70, 0x1, 0x40, 0x0, 0xa8, 0x66, + 0x66, 0x86, 0x66, 0x77, 0x0, 0xa, 0x30, 0x83, + 0xd, 0x20, 0x0, 0x0, 0x0, 0xa3, 0xd, 0x10, + 0xd0, 0x0, 0x30, 0x0, 0xb, 0x26, 0x96, 0x6e, + 0x66, 0x69, 0x30, 0x0, 0xb0, 0x80, 0x0, 0xd0, + 0x0, 0x0, 0x0, 0xb, 0x31, 0x56, 0x6e, 0x66, + 0xa8, 0x0, 0x0, 0x90, 0x1, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0x54, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x7, 0x5, 0x66, 0x66, 0xe6, 0x66, 0x7e, + 0x20, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7528 "用" */ + 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, + 0x3, 0xd6, 0x66, 0x6d, 0x66, 0x66, 0xe0, 0x0, + 0x2b, 0x0, 0x1, 0xb0, 0x0, 0x1c, 0x0, 0x2, + 0xb0, 0x0, 0x1b, 0x0, 0x1, 0xc0, 0x0, 0x2d, + 0x66, 0x66, 0xd6, 0x66, 0x6c, 0x0, 0x2, 0xb0, + 0x0, 0x1b, 0x0, 0x1, 0xc0, 0x0, 0x3a, 0x0, + 0x1, 0xb0, 0x0, 0x1c, 0x0, 0x4, 0xa0, 0x0, + 0x1b, 0x0, 0x1, 0xc0, 0x0, 0x5b, 0x66, 0x66, + 0xd6, 0x66, 0x6c, 0x0, 0x7, 0x60, 0x0, 0x1b, + 0x0, 0x1, 0xc0, 0x0, 0xa3, 0x0, 0x1, 0xb0, + 0x0, 0x1c, 0x0, 0xc, 0x0, 0x0, 0x1b, 0x0, + 0x1, 0xc0, 0x4, 0x50, 0x0, 0x1, 0xc0, 0x22, + 0x5c, 0x0, 0x80, 0x0, 0x0, 0x29, 0x1, 0x6f, + 0x80, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, + 0x0, + + /* U+7530 "ç”°" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x86, + 0x66, 0x66, 0x66, 0x66, 0xb3, 0x2b, 0x0, 0x0, + 0xe0, 0x0, 0xc, 0x12, 0xb0, 0x0, 0xe, 0x0, + 0x0, 0xc1, 0x2b, 0x0, 0x0, 0xe0, 0x0, 0xc, + 0x12, 0xb0, 0x0, 0xe, 0x0, 0x0, 0xc1, 0x2b, + 0x0, 0x0, 0xe0, 0x0, 0xc, 0x12, 0xd6, 0x66, + 0x6e, 0x66, 0x66, 0xd1, 0x2b, 0x0, 0x0, 0xe0, + 0x0, 0xc, 0x12, 0xb0, 0x0, 0xe, 0x0, 0x0, + 0xc1, 0x2b, 0x0, 0x0, 0xe0, 0x0, 0xc, 0x12, + 0xb0, 0x0, 0xe, 0x0, 0x0, 0xc1, 0x2d, 0x66, + 0x66, 0x66, 0x66, 0x6d, 0x22, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x40, + + /* U+7531 "ç”±" */ + 0x0, 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0x1, 0x20, 0x0, 0xd, 0x0, + 0x0, 0x60, 0x3d, 0x66, 0x66, 0xe6, 0x66, 0x6f, + 0x22, 0xb0, 0x0, 0xd, 0x0, 0x0, 0xe0, 0x2b, + 0x0, 0x0, 0xd0, 0x0, 0xe, 0x2, 0xb0, 0x0, + 0xd, 0x0, 0x0, 0xe0, 0x2d, 0x66, 0x66, 0xe6, + 0x66, 0x6e, 0x2, 0xb0, 0x0, 0xd, 0x0, 0x0, + 0xe0, 0x2b, 0x0, 0x0, 0xd0, 0x0, 0xe, 0x2, + 0xb0, 0x0, 0xd, 0x0, 0x0, 0xe0, 0x2b, 0x0, + 0x0, 0xd0, 0x0, 0xe, 0x3, 0xd6, 0x66, 0x66, + 0x66, 0x66, 0xe0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, + + /* U+7533 "申" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0x1, 0x96, 0x66, 0x6e, 0x66, + 0x66, 0xc1, 0x1d, 0x0, 0x0, 0xd0, 0x0, 0x1d, + 0x0, 0xd0, 0x0, 0xd, 0x0, 0x1, 0xd0, 0xd, + 0x0, 0x0, 0xd0, 0x0, 0x1d, 0x0, 0xe6, 0x66, + 0x6e, 0x66, 0x66, 0xd0, 0xd, 0x0, 0x0, 0xd0, + 0x0, 0x1d, 0x1, 0xd0, 0x0, 0xd, 0x0, 0x1, + 0xd0, 0x1e, 0x66, 0x66, 0xe6, 0x66, 0x6d, 0x1, + 0x70, 0x0, 0xd, 0x0, 0x0, 0x40, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, + + /* U+7535 "电" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0xd0, 0x0, + 0x2, 0x0, 0xb7, 0x66, 0x6e, 0x66, 0x66, 0xf1, + 0xa, 0x30, 0x0, 0xd0, 0x0, 0x1d, 0x0, 0xa3, + 0x0, 0xd, 0x0, 0x1, 0xd0, 0xa, 0x86, 0x66, + 0xe6, 0x66, 0x6d, 0x0, 0xa3, 0x0, 0xd, 0x0, + 0x1, 0xd0, 0xa, 0x30, 0x0, 0xd0, 0x0, 0x1d, + 0x0, 0xb8, 0x66, 0x6e, 0x66, 0x66, 0xd0, 0xa, + 0x20, 0x0, 0xd0, 0x0, 0x3, 0x40, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0x76, 0x0, 0x0, 0xb, 0xcc, 0xcc, + 0xce, 0x70, + + /* U+7537 "ç”·" */ + 0x0, 0x86, 0x66, 0x66, 0x66, 0x6a, 0x0, 0x0, + 0xc0, 0x0, 0xd0, 0x0, 0x1d, 0x0, 0x0, 0xc0, + 0x0, 0xd0, 0x0, 0x1d, 0x0, 0x0, 0xc6, 0x66, + 0xe6, 0x66, 0x6d, 0x0, 0x0, 0xc0, 0x0, 0xd0, + 0x0, 0x1d, 0x0, 0x0, 0xc0, 0x0, 0xd0, 0x0, + 0x1d, 0x0, 0x0, 0xd6, 0x66, 0xa6, 0x66, 0x6c, + 0x0, 0x0, 0x10, 0x0, 0xe3, 0x0, 0x0, 0x0, + 0x6, 0x66, 0x66, 0xf6, 0x66, 0x66, 0xc0, 0x1, + 0x0, 0x3, 0xa0, 0x0, 0x4, 0xa0, 0x0, 0x0, + 0x9, 0x40, 0x0, 0x7, 0x60, 0x0, 0x0, 0x3b, + 0x0, 0x0, 0xa, 0x30, 0x0, 0x4, 0xc1, 0x2, + 0x41, 0x1d, 0x0, 0x2, 0x97, 0x0, 0x0, 0x3d, + 0xf7, 0x0, 0x43, 0x0, 0x0, 0x0, 0x2, 0x20, + 0x0, + + /* U+753A "町" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7, + 0x66, 0x66, 0xb5, 0x76, 0x68, 0x69, 0xa0, 0xb1, + 0x1c, 0xd, 0x0, 0x0, 0xe0, 0x0, 0xb, 0x11, + 0xc0, 0xd0, 0x0, 0xe, 0x0, 0x0, 0xb1, 0x1c, + 0xd, 0x0, 0x0, 0xe0, 0x0, 0xb, 0x11, 0xc0, + 0xd0, 0x0, 0xe, 0x0, 0x0, 0xb6, 0x6d, 0x6d, + 0x0, 0x0, 0xe0, 0x0, 0xb, 0x11, 0xc0, 0xd0, + 0x0, 0xe, 0x0, 0x0, 0xb1, 0x1c, 0xd, 0x0, + 0x0, 0xe0, 0x0, 0xb, 0x11, 0xc0, 0xd0, 0x0, + 0xe, 0x0, 0x0, 0xc6, 0x6c, 0x6e, 0x0, 0x0, + 0xe0, 0x0, 0xc, 0x10, 0x0, 0xa0, 0x0, 0xe, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x1, 0x11, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xea, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, + 0x0, + + /* U+753B "ç”»" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, 0x47, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xa6, + 0x69, 0x66, 0xe0, 0x0, 0x2, 0x3, 0xa0, 0xc, + 0x0, 0xc0, 0xa2, 0xe, 0x12, 0xa0, 0xc, 0x0, + 0xc0, 0xd0, 0xd, 0x2, 0xa0, 0xc, 0x0, 0xc0, + 0xd0, 0xd, 0x2, 0xc6, 0x6d, 0x66, 0xc0, 0xd0, + 0xd, 0x2, 0xa0, 0xc, 0x0, 0xc0, 0xd0, 0xd, + 0x3, 0xa0, 0xc, 0x0, 0xc0, 0xd0, 0xd, 0x3, + 0xc6, 0x6d, 0x66, 0xd0, 0xd0, 0xd, 0x3, 0x70, + 0x0, 0x0, 0x60, 0xd0, 0x2e, 0x66, 0x66, 0x66, + 0x66, 0x66, 0xe0, 0x4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+754C "界" */ + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, + 0x0, 0xb, 0x76, 0x6e, 0x66, 0x67, 0xd0, 0x0, + 0x0, 0xa, 0x20, 0xd, 0x0, 0x3, 0xa0, 0x0, + 0x0, 0xa, 0x76, 0x6e, 0x66, 0x67, 0xa0, 0x0, + 0x0, 0xa, 0x20, 0xd, 0x0, 0x3, 0xa0, 0x0, + 0x0, 0xb, 0x76, 0x8b, 0x67, 0x67, 0xa0, 0x0, + 0x0, 0x3, 0x1, 0xd0, 0x8, 0x10, 0x10, 0x0, + 0x0, 0x0, 0xc, 0x50, 0x0, 0xa5, 0x0, 0x0, + 0x0, 0x3, 0xc6, 0xa0, 0x1, 0xa8, 0xea, 0x71, + 0x2, 0x77, 0x13, 0x60, 0x1, 0xc0, 0x17, 0x50, + 0x3, 0x0, 0x6, 0x20, 0x1, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x0, 0x1, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x83, 0x0, 0x1, 0xc0, 0x0, 0x0, + 0x0, 0x37, 0x20, 0x0, 0x1, 0xc0, 0x0, 0x0, + 0x2, 0x10, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + + /* U+7559 "ç•™" */ + 0x0, 0x0, 0x29, 0x90, 0x0, 0x0, 0x0, 0x9, + 0x57, 0x63, 0x17, 0x77, 0x66, 0xc4, 0xd, 0x0, + 0x10, 0x0, 0x77, 0x0, 0xc1, 0xd, 0x0, 0x3a, + 0x10, 0xa3, 0x0, 0xd0, 0xd, 0x0, 0x39, 0xc1, + 0xb0, 0x0, 0xd0, 0xe, 0x89, 0x30, 0x6a, 0x22, + 0x68, 0x90, 0xa, 0x40, 0x1, 0x72, 0x0, 0x3b, + 0x10, 0x0, 0xa6, 0x68, 0x66, 0x66, 0x6b, 0x20, + 0x0, 0xe0, 0x0, 0x3a, 0x0, 0xe, 0x0, 0x0, + 0xe0, 0x0, 0x3a, 0x0, 0xe, 0x0, 0x0, 0xf6, + 0x66, 0x8c, 0x66, 0x6e, 0x0, 0x0, 0xe0, 0x0, + 0x3a, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x3a, + 0x0, 0xe, 0x0, 0x0, 0xf6, 0x66, 0x67, 0x66, + 0x6e, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x2, + 0x0, + + /* U+756A "番" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x6b, 0xc0, 0x0, + 0x0, 0x24, 0x56, 0x89, 0xe8, 0x66, 0x20, 0x0, + 0x0, 0x0, 0x35, 0x0, 0xd0, 0x3d, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0xd0, 0x81, 0x0, 0x20, + 0x4, 0x76, 0x68, 0x7a, 0xe7, 0x76, 0x68, 0x90, + 0x0, 0x0, 0x1, 0xc3, 0xd2, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0x20, 0xd0, 0x3b, 0x40, 0x0, + 0x0, 0x18, 0x60, 0x0, 0xe0, 0x1, 0xae, 0xa2, + 0x4, 0x51, 0xb6, 0x66, 0xa6, 0x66, 0xd4, 0x30, + 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0xe6, 0x66, 0xd0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x66, 0xc0, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+756B "ç•«" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x66, 0x6e, 0x66, 0x6b, 0x20, 0x0, 0x0, + 0x10, 0x0, 0xd0, 0x0, 0xd0, 0x70, 0x4, 0x76, + 0x66, 0x6e, 0x66, 0x6e, 0x66, 0x20, 0x0, 0x66, + 0x55, 0xe5, 0x55, 0xc0, 0x0, 0x0, 0x5, 0x66, + 0x6e, 0x66, 0x67, 0x80, 0x0, 0x0, 0x10, 0x0, + 0xd0, 0x0, 0x1, 0x30, 0x0, 0x76, 0x66, 0x67, + 0x66, 0x66, 0x66, 0x0, 0x0, 0xa6, 0x66, 0x76, + 0x66, 0xa6, 0x0, 0x0, 0xd, 0x0, 0xd, 0x0, + 0xa, 0x30, 0x0, 0x0, 0xd6, 0x66, 0xe6, 0x66, + 0xc3, 0x0, 0x0, 0xd, 0x66, 0x6e, 0x66, 0x6c, + 0x30, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x51, + 0x40, 0x16, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7f, + 0x60, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7570 "ç•°" */ + 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, + 0x0, 0xd6, 0x66, 0xd6, 0x66, 0x6e, 0x20, 0x0, + 0xd, 0x0, 0xb, 0x10, 0x0, 0xd0, 0x0, 0x0, + 0xd6, 0x66, 0xd6, 0x66, 0x6d, 0x0, 0x0, 0xd, + 0x0, 0xb, 0x10, 0x0, 0xd0, 0x0, 0x0, 0xd6, + 0x66, 0x96, 0x66, 0x6d, 0x0, 0x0, 0x5, 0xa, + 0x10, 0xa, 0x20, 0x30, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0xd0, 0x1, 0x60, 0x0, 0x76, 0x6e, 0x66, + 0x6e, 0x66, 0x65, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0xd0, 0x0, 0x0, 0x6, 0x76, 0x6b, 0x66, 0x6b, + 0x66, 0x6a, 0x70, 0x0, 0x0, 0x87, 0x0, 0x36, + 0x20, 0x0, 0x0, 0x2, 0xb9, 0x20, 0x0, 0x19, + 0xc4, 0x0, 0x28, 0x71, 0x0, 0x0, 0x0, 0x4, + 0xf2, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x10, + + /* U+7576 "ç•¶" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0xc3, 0x0, 0x30, 0x0, 0x0, 0x2b, + 0x10, 0xc0, 0x6, 0xc0, 0x0, 0x1, 0x7, 0x40, + 0xc0, 0x9, 0x0, 0x0, 0x9, 0x66, 0x66, 0xb6, + 0x86, 0x66, 0xd7, 0x2b, 0x0, 0x0, 0x0, 0x1, + 0x3, 0x80, 0x75, 0x8, 0x86, 0x66, 0x6c, 0x52, + 0x0, 0x0, 0x7, 0x40, 0x0, 0xa, 0x20, 0x0, + 0x0, 0x7, 0x86, 0x66, 0x6c, 0x30, 0x0, 0x0, + 0x4, 0x10, 0x0, 0x4, 0x0, 0x0, 0x0, 0xc6, + 0x66, 0x76, 0x66, 0x7d, 0x0, 0x0, 0xd0, 0x0, + 0xa2, 0x0, 0x39, 0x0, 0x0, 0xd6, 0x66, 0xc7, + 0x66, 0x89, 0x0, 0x0, 0xd0, 0x0, 0xa2, 0x0, + 0x39, 0x0, 0x0, 0xe6, 0x66, 0xc7, 0x66, 0x8a, + 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x26, 0x0, + + /* U+75B2 "ç–²" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x87, 0x0, 0x3, 0x20, + 0x0, 0x8, 0x86, 0x66, 0x77, 0x66, 0x69, 0x70, + 0x4, 0x8, 0x40, 0x0, 0xd, 0x20, 0x0, 0x0, + 0x7, 0x68, 0x40, 0x96, 0x6e, 0x66, 0x6b, 0x10, + 0x3, 0x98, 0x40, 0xc0, 0xd, 0x0, 0x67, 0x0, + 0x0, 0x8, 0x40, 0xc0, 0xd, 0x0, 0x30, 0x0, + 0x0, 0x5b, 0x40, 0xc0, 0xd, 0x0, 0x60, 0x0, + 0x2d, 0x3a, 0x21, 0xd6, 0x86, 0x67, 0xe2, 0x0, + 0x1, 0xb, 0x3, 0xa0, 0x60, 0xa, 0x50, 0x0, + 0x0, 0xb, 0x7, 0x60, 0x27, 0x4b, 0x0, 0x0, + 0x0, 0x66, 0xc, 0x0, 0x9, 0xd1, 0x0, 0x0, + 0x0, 0xa0, 0x65, 0x0, 0x5b, 0x8a, 0x40, 0x0, + 0x6, 0x13, 0x60, 0x48, 0x50, 0x2, 0xaf, 0x90, + 0x1, 0x1, 0x3, 0x10, 0x0, 0x0, 0x1, 0x0, + + /* U+75C5 "ç—…" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1a, 0x10, 0x0, 0x0, 0x0, + 0x4, 0x0, 0x0, 0x76, 0x0, 0x5, 0x20, 0x0, + 0xc7, 0x66, 0x66, 0x66, 0x66, 0x64, 0x8, 0x2c, + 0x10, 0x0, 0x0, 0x0, 0x5, 0x0, 0x49, 0xc3, + 0x76, 0x66, 0xd6, 0x66, 0x82, 0x0, 0x1c, 0x10, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x5, 0xd1, 0x86, + 0x66, 0xe6, 0x66, 0xb1, 0x2b, 0x2d, 0xd, 0x0, + 0x2b, 0x0, 0xe, 0x0, 0x30, 0xc0, 0xd0, 0x7, + 0x83, 0x0, 0xe0, 0x0, 0x1b, 0xc, 0x0, 0xc0, + 0x76, 0xe, 0x0, 0x4, 0x60, 0xc0, 0x83, 0x0, + 0xe1, 0xe0, 0x0, 0xa1, 0xc, 0x52, 0x0, 0x4, + 0xe, 0x0, 0x27, 0x0, 0xd0, 0x0, 0x1, 0x32, + 0xd0, 0x7, 0x0, 0xd, 0x0, 0x0, 0x5, 0xf9, + 0x1, 0x0, 0x0, 0x10, 0x0, 0x0, 0x1, 0x0, + + /* U+75DB "ç—›" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x85, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x10, 0x0, 0x2c, 0x0, 0x4, 0x50, + 0x0, 0x3, 0xc6, 0x66, 0x66, 0x66, 0x66, 0x60, + 0x8, 0x23, 0xb0, 0x76, 0x66, 0x66, 0xa8, 0x0, + 0x4, 0xc2, 0xb0, 0x0, 0x33, 0x18, 0x73, 0x0, + 0x0, 0x82, 0xb0, 0x20, 0xc, 0x60, 0x3, 0x0, + 0x0, 0x2, 0xb0, 0xe6, 0x6c, 0x76, 0x6e, 0x20, + 0x0, 0x59, 0xa0, 0xd0, 0xa, 0x20, 0xd, 0x0, + 0x2c, 0x74, 0x80, 0xe6, 0x6c, 0x76, 0x6e, 0x0, + 0x5, 0x7, 0x50, 0xd0, 0xa, 0x20, 0xd, 0x0, + 0x0, 0xb, 0x10, 0xd6, 0x6c, 0x76, 0x6e, 0x0, + 0x0, 0x2a, 0x0, 0xd0, 0xa, 0x20, 0xd, 0x0, + 0x0, 0x91, 0x0, 0xd0, 0xa, 0x20, 0xd, 0x0, + 0x5, 0x30, 0x0, 0xd0, 0xa, 0x35, 0xcd, 0x0, + 0x1, 0x0, 0x0, 0x40, 0x1, 0x0, 0x21, 0x0, + + /* U+767A "発" */ + 0x0, 0x0, 0x0, 0x43, 0x0, 0x32, 0x0, 0x0, + 0x46, 0x66, 0x8d, 0x43, 0x2c, 0x40, 0x0, 0x0, + 0x73, 0xb, 0x30, 0x95, 0x1, 0x90, 0x0, 0x2, + 0x97, 0x70, 0x3, 0x71, 0xa5, 0x0, 0x0, 0x6, + 0x80, 0x0, 0x6, 0xd2, 0x0, 0x0, 0x7, 0x60, + 0x0, 0x0, 0x19, 0xdc, 0x71, 0x36, 0x15, 0x7e, + 0x66, 0xe6, 0x50, 0x63, 0x0, 0x0, 0x0, 0xc0, + 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, + 0xd0, 0x0, 0x40, 0x0, 0x76, 0x66, 0xd6, 0x6e, + 0x66, 0x68, 0x30, 0x0, 0x0, 0x58, 0x0, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x10, 0xd, 0x0, + 0x5, 0x0, 0x0, 0x9, 0x30, 0x0, 0xc0, 0x0, + 0x74, 0x1, 0x57, 0x0, 0x0, 0x8, 0xcb, 0xbd, + 0x50, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+767C "發" */ + 0x0, 0x0, 0x0, 0x51, 0x10, 0x32, 0x0, 0x0, + 0x3, 0x86, 0x6f, 0x55, 0xa, 0x20, 0x0, 0x0, + 0x38, 0x9, 0x70, 0x1a, 0x1, 0xc0, 0x0, 0x0, + 0x67, 0x80, 0x0, 0x38, 0x61, 0x0, 0x0, 0x8, + 0x60, 0x0, 0x0, 0x3b, 0x73, 0x10, 0x47, 0x67, + 0xb6, 0x7, 0x76, 0xc7, 0xb4, 0x1, 0x0, 0xb, + 0x20, 0x93, 0xd, 0x0, 0x0, 0x3, 0x11, 0xb2, + 0xb, 0x0, 0xd0, 0x0, 0x0, 0xb6, 0x59, 0x12, + 0x80, 0x7, 0xbb, 0x70, 0xc, 0x10, 0x11, 0x63, + 0x33, 0x37, 0x10, 0x0, 0xc6, 0x6c, 0x70, 0x43, + 0x35, 0xc1, 0x0, 0x0, 0x0, 0xc1, 0x4, 0x30, + 0xb2, 0x0, 0x0, 0x0, 0xd, 0x0, 0x3, 0xca, + 0x0, 0x0, 0x0, 0x1, 0xc0, 0x0, 0x96, 0x6b, + 0x10, 0x0, 0x18, 0xc7, 0x4, 0x72, 0x0, 0x6b, + 0x0, 0x0, 0x5, 0x3, 0x10, 0x0, 0x0, 0x20, + + /* U+767D "白" */ + 0x0, 0x0, 0x1b, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x90, 0x0, + 0x0, 0x20, 0xd, 0x67, 0x66, 0x66, 0x66, 0xd6, + 0xe, 0x0, 0x0, 0x0, 0x0, 0xc1, 0xe, 0x0, + 0x0, 0x0, 0x0, 0xc1, 0xe, 0x0, 0x0, 0x0, + 0x0, 0xc1, 0xe, 0x66, 0x66, 0x66, 0x66, 0xd1, + 0xe, 0x0, 0x0, 0x0, 0x0, 0xc1, 0xe, 0x0, + 0x0, 0x0, 0x0, 0xc1, 0xe, 0x0, 0x0, 0x0, + 0x0, 0xc1, 0xe, 0x0, 0x0, 0x0, 0x0, 0xc1, + 0xe, 0x66, 0x66, 0x66, 0x66, 0xd1, 0xe, 0x0, + 0x0, 0x0, 0x0, 0xc2, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+767E "百" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x2, + 0x86, 0x66, 0x68, 0x96, 0x66, 0x68, 0x90, 0x0, + 0x0, 0x0, 0x99, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0x66, 0x96, 0x66, 0x6c, 0x0, 0x0, 0x1, 0xd0, + 0x0, 0x0, 0x3, 0xc0, 0x0, 0x0, 0x1d, 0x0, + 0x0, 0x0, 0x3c, 0x0, 0x0, 0x1, 0xd0, 0x0, + 0x0, 0x3, 0xc0, 0x0, 0x0, 0x1e, 0x66, 0x66, + 0x66, 0x7c, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, + 0x3, 0xc0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, + 0x3c, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x3, + 0xc0, 0x0, 0x0, 0x1e, 0x66, 0x66, 0x66, 0x7c, + 0x0, 0x0, 0x2, 0xd0, 0x0, 0x0, 0x3, 0xc0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+7684 "çš„" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0x30, 0x0, 0x2b, 0x10, 0x0, 0x0, 0xd0, 0x0, + 0x6, 0xc0, 0x0, 0x1, 0x44, 0x3, 0x0, 0xb3, + 0x0, 0x10, 0xe7, 0x66, 0xe4, 0x2d, 0x66, 0x6c, + 0x8d, 0x0, 0xd, 0x9, 0x30, 0x0, 0xb3, 0xd0, + 0x0, 0xd2, 0x60, 0x0, 0xb, 0x3d, 0x0, 0xd, + 0x41, 0x40, 0x0, 0xb3, 0xd6, 0x66, 0xd0, 0xa, + 0x40, 0xc, 0x2d, 0x0, 0xd, 0x0, 0x4b, 0x0, + 0xc2, 0xd0, 0x0, 0xd0, 0x0, 0x40, 0xd, 0x1d, + 0x0, 0xd, 0x0, 0x0, 0x0, 0xd1, 0xd0, 0x0, + 0xd0, 0x0, 0x0, 0xe, 0xe, 0x66, 0x6e, 0x0, + 0x5, 0x25, 0xd0, 0xd0, 0x0, 0xa0, 0x0, 0x1a, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+7686 "皆" */ + 0x28, 0x0, 0x0, 0x1b, 0x0, 0x10, 0x0, 0x2a, + 0x0, 0x0, 0x1c, 0x2, 0xe6, 0x0, 0x2c, 0x66, + 0xa8, 0x1c, 0x3b, 0x40, 0x0, 0x2a, 0x0, 0x0, + 0x1d, 0x40, 0x0, 0x40, 0x2a, 0x0, 0x14, 0x1c, + 0x0, 0x0, 0x70, 0x3d, 0xa9, 0x50, 0xd, 0x0, + 0x1, 0xe2, 0x2a, 0x20, 0xb, 0x28, 0xbb, 0xbb, + 0x80, 0x1, 0x0, 0x37, 0x0, 0x2, 0x0, 0x0, + 0x5, 0xc6, 0x66, 0x66, 0x6c, 0x60, 0x0, 0x4, + 0xa0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x4, 0xc6, + 0x66, 0x66, 0x6c, 0x30, 0x0, 0x4, 0xa0, 0x0, + 0x0, 0xb, 0x30, 0x0, 0x4, 0xa0, 0x0, 0x0, + 0xb, 0x30, 0x0, 0x5, 0xc6, 0x66, 0x66, 0x6c, + 0x30, 0x0, 0x1, 0x10, 0x0, 0x0, 0x1, 0x0, + 0x0, + + /* U+76BF "çš¿" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x1c, 0x66, 0xa6, 0x6a, 0x66, 0xf2, 0x0, + 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, + 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, + 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, + 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, + 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, + 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, + 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, + 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, + 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe2, 0x90, + 0x6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x62, + + /* U+76D7 "ç›—" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x31, 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0x0, + 0xc3, 0x1, 0x1e, 0x20, 0x0, 0x10, 0x0, 0x4, + 0x74, 0x29, 0x96, 0x66, 0x6e, 0x60, 0x0, 0x1, + 0x83, 0x90, 0x86, 0x4, 0x60, 0x0, 0x0, 0xb2, + 0x70, 0xd, 0x70, 0x20, 0x0, 0x6, 0xe6, 0x0, + 0x4, 0xb6, 0x30, 0x0, 0x0, 0xd, 0x0, 0x0, + 0xc3, 0xb, 0x20, 0x0, 0x0, 0xf0, 0x0, 0x95, + 0x0, 0x3e, 0x82, 0x0, 0x8, 0x4, 0x71, 0x0, + 0x0, 0x38, 0x10, 0x0, 0x96, 0x66, 0x66, 0x66, + 0x6d, 0x20, 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, + 0xd0, 0x0, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0xd, + 0x0, 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, + 0x0, 0x46, 0xe6, 0x6e, 0x66, 0xe6, 0x6e, 0xab, + 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+76EE "ç›®" */ + 0x1, 0x0, 0x0, 0x0, 0x2, 0x1, 0xd6, 0x66, + 0x66, 0x67, 0xe1, 0x1e, 0x0, 0x0, 0x0, 0x3c, + 0x0, 0xe0, 0x0, 0x0, 0x3, 0xc0, 0xe, 0x0, + 0x0, 0x0, 0x3c, 0x0, 0xf6, 0x66, 0x66, 0x67, + 0xc0, 0xe, 0x0, 0x0, 0x0, 0x3c, 0x0, 0xe0, + 0x0, 0x0, 0x3, 0xc0, 0xf, 0x66, 0x66, 0x66, + 0x7c, 0x0, 0xe0, 0x0, 0x0, 0x3, 0xc0, 0xe, + 0x0, 0x0, 0x0, 0x3c, 0x0, 0xe0, 0x0, 0x0, + 0x3, 0xc0, 0xf, 0x66, 0x66, 0x66, 0x7c, 0x1, + 0xd0, 0x0, 0x0, 0x3, 0xc0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+76F4 "ç›´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x70, 0x0, 0x37, 0x0, + 0x0, 0x76, 0x66, 0x6b, 0x86, 0x66, 0x66, 0x10, + 0x0, 0x0, 0x30, 0xb, 0x10, 0x5, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x20, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x6, 0x40, + 0x6, 0x66, 0x76, 0x66, 0x66, 0x67, 0x67, 0x70, + + /* U+76F8 "相" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0x96, 0x66, 0x6c, 0x30, 0x0, + 0xd, 0x0, 0xd, 0x10, 0x0, 0xe0, 0x0, 0x0, + 0xd0, 0x52, 0xd1, 0x0, 0xe, 0x0, 0x67, 0x6f, + 0x67, 0x4c, 0x10, 0x0, 0xe0, 0x0, 0x4, 0xf0, + 0x0, 0xc6, 0x66, 0x6e, 0x0, 0x0, 0x9f, 0x95, + 0xc, 0x10, 0x0, 0xe0, 0x0, 0xc, 0xd1, 0xe0, + 0xc1, 0x0, 0xe, 0x0, 0x6, 0x5d, 0x3, 0xc, + 0x66, 0x66, 0xe0, 0x0, 0xa0, 0xd0, 0x0, 0xc1, + 0x0, 0xe, 0x0, 0x62, 0xd, 0x0, 0xc, 0x10, + 0x0, 0xe0, 0x13, 0x0, 0xd0, 0x0, 0xc1, 0x0, + 0xe, 0x0, 0x0, 0xe, 0x0, 0xd, 0x66, 0x66, + 0xe0, 0x0, 0x0, 0xe0, 0x0, 0xd1, 0x0, 0xd, + 0x0, 0x0, 0x3, 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+770B "看" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, 0xc0, 0x0, + 0x0, 0x55, 0x67, 0x7e, 0x97, 0x53, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x30, 0x0, + 0x0, 0x37, 0x66, 0xaa, 0x66, 0x68, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1, 0x30, + 0x7, 0x66, 0x69, 0xb6, 0x66, 0x66, 0x69, 0x90, + 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8d, 0x66, 0x66, 0x6c, 0x40, 0x0, + 0x0, 0x4, 0x8d, 0x0, 0x0, 0xb, 0x20, 0x0, + 0x0, 0x38, 0xe, 0x66, 0x66, 0x6d, 0x20, 0x0, + 0x4, 0x50, 0xd, 0x0, 0x0, 0xb, 0x20, 0x0, + 0x1, 0x0, 0xe, 0x66, 0x66, 0x6d, 0x20, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0xb, 0x20, 0x0, + 0x0, 0x0, 0xe, 0x66, 0x66, 0x6d, 0x20, 0x0, + 0x0, 0x0, 0x9, 0x0, 0x0, 0x7, 0x10, 0x0, + + /* U+771F "真" */ + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x56, 0x66, 0x6b, 0x96, 0x66, 0x6e, 0x30, + 0x0, 0x20, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0xc, 0x10, 0x7, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6c, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0xc6, 0x66, 0x66, 0x6c, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0xc6, 0x66, 0x66, 0x6c, 0x0, 0x0, + 0x5, 0x66, 0xd6, 0x66, 0x66, 0x6d, 0x68, 0xd1, + 0x1, 0x0, 0x6, 0x90, 0x3, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x8a, 0x10, 0x0, 0x3c, 0x60, 0x0, + 0x0, 0x28, 0x40, 0x0, 0x0, 0x1, 0xc7, 0x0, + 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, + + /* U+7720 "眠" */ + 0x0, 0x0, 0x5, 0x22, 0x22, 0x22, 0x70, 0xa, + 0x66, 0xc2, 0xb5, 0x44, 0x44, 0x4e, 0x0, 0xd0, + 0xd, 0xa, 0x20, 0x0, 0x0, 0xd0, 0xd, 0x0, + 0xd0, 0xa2, 0x0, 0x0, 0xd, 0x0, 0xd0, 0xd, + 0xa, 0x76, 0x7a, 0x66, 0xd0, 0xd, 0x66, 0xe0, + 0xa2, 0x3, 0xa0, 0x0, 0x0, 0xd0, 0xd, 0xa, + 0x20, 0x2a, 0x0, 0x21, 0xd, 0x0, 0xd0, 0xa7, + 0x56, 0xd5, 0x58, 0x50, 0xd6, 0x6e, 0xa, 0x20, + 0xd, 0x0, 0x0, 0xd, 0x0, 0xd0, 0xa2, 0x0, + 0xa3, 0x0, 0x0, 0xd0, 0xd, 0xa, 0x20, 0x5, + 0xa0, 0x4, 0xd, 0x66, 0xe0, 0xa2, 0x45, 0xd, + 0x50, 0x50, 0xd0, 0x8, 0xb, 0xc6, 0x0, 0x3e, + 0x77, 0x1, 0x0, 0x0, 0x95, 0x0, 0x0, 0x3d, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x0, + + /* U+773E "眾" */ + 0x1, 0x86, 0x66, 0x66, 0x66, 0x69, 0x70, 0x1, + 0xc0, 0xc, 0x0, 0x30, 0x8, 0x60, 0x0, 0xc0, + 0xc, 0x0, 0x30, 0x8, 0x40, 0x0, 0xc0, 0xc, + 0x0, 0x30, 0x8, 0x40, 0x1, 0xd6, 0x66, 0x66, + 0x66, 0x69, 0x30, 0x0, 0x10, 0x0, 0x0, 0x25, + 0x9c, 0x10, 0x4, 0x56, 0x78, 0x9c, 0x87, 0x54, + 0x10, 0x0, 0x3, 0x10, 0x29, 0x0, 0x50, 0x0, + 0x0, 0xa, 0x70, 0x29, 0x3, 0xe1, 0x0, 0x0, + 0x1e, 0x0, 0x29, 0x6, 0xc0, 0x0, 0x0, 0x88, + 0xb3, 0x29, 0xb, 0x85, 0x0, 0x3, 0xa0, 0x1e, + 0x49, 0x38, 0xc, 0x40, 0x37, 0x0, 0x4, 0x4a, + 0x70, 0x2, 0xe5, 0x0, 0x0, 0x0, 0x29, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, + 0x0, + + /* U+7740 "ç€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x83, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0x2, 0xe0, 0x6, 0x40, 0x3, 0x0, 0x28, + 0x66, 0x69, 0x96, 0x86, 0x68, 0xb1, 0x0, 0x0, + 0x0, 0x1c, 0x0, 0x4, 0x0, 0x0, 0x0, 0x76, + 0x6a, 0xa6, 0x66, 0x93, 0x0, 0x0, 0x0, 0x0, + 0xc0, 0x0, 0x0, 0x6, 0x0, 0x76, 0x66, 0xb9, + 0x66, 0x66, 0x66, 0x84, 0x0, 0x0, 0x3e, 0x66, + 0x66, 0x69, 0x40, 0x0, 0x0, 0x29, 0xd0, 0x0, + 0x0, 0xa3, 0x0, 0x0, 0x38, 0xd, 0x66, 0x66, + 0x6c, 0x20, 0x0, 0x44, 0x0, 0xd0, 0x0, 0x0, + 0xa2, 0x0, 0x10, 0x0, 0xd, 0x66, 0x66, 0x6c, + 0x20, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xa2, + 0x0, 0x0, 0x0, 0xd, 0x66, 0x66, 0x6c, 0x30, + 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x40, 0x0, + + /* U+77E5 "知" */ + 0x0, 0x47, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc1, 0x0, 0x20, 0x10, 0x0, 0x2, 0x0, 0x1c, + 0x68, 0x7b, 0x1a, 0x76, 0x67, 0xd0, 0x7, 0x22, + 0xb0, 0x0, 0xa2, 0x0, 0x2a, 0x0, 0x70, 0x2b, + 0x0, 0xa, 0x20, 0x2, 0xa0, 0x20, 0x2, 0xb0, + 0x31, 0xa2, 0x0, 0x2a, 0x5, 0x76, 0x7c, 0x69, + 0x6a, 0x20, 0x2, 0xa0, 0x0, 0x5, 0x80, 0x0, + 0xa2, 0x0, 0x2a, 0x0, 0x0, 0x89, 0x50, 0xa, + 0x20, 0x2, 0xa0, 0x0, 0xd, 0x7, 0x90, 0xa2, + 0x0, 0x2b, 0x0, 0x6, 0x70, 0xc, 0x7a, 0x76, + 0x67, 0xb0, 0x2, 0xa0, 0x0, 0x37, 0xa2, 0x0, + 0x2b, 0x2, 0x80, 0x0, 0x0, 0x5, 0x0, 0x1, + 0x40, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+77ED "短" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x40, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0xe0, 0x0, 0x76, 0x66, 0x66, 0x89, 0x0, 0x58, + 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0xb, 0x7c, + 0x67, 0x2, 0x0, 0x0, 0x30, 0x3, 0x70, 0xd0, + 0x0, 0xe6, 0x66, 0x6f, 0x10, 0x40, 0xd, 0x0, + 0xd, 0x0, 0x0, 0xd0, 0x1, 0x11, 0xd1, 0x81, + 0xd0, 0x0, 0xd, 0x0, 0x45, 0x5d, 0x44, 0x2e, + 0x66, 0x66, 0xd0, 0x0, 0x3, 0xb0, 0x0, 0xb0, + 0x0, 0x7, 0x0, 0x0, 0x59, 0x70, 0x3, 0x0, + 0xb, 0x60, 0x0, 0x9, 0x36, 0x90, 0x92, 0x0, + 0xe1, 0x0, 0x0, 0xb0, 0xc, 0x6, 0x90, 0x29, + 0x0, 0x0, 0x64, 0x0, 0x0, 0x24, 0x6, 0x10, + 0x40, 0x27, 0x0, 0x6, 0x76, 0x66, 0x86, 0x6a, + 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+77F3 "石" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x4, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6d, 0xb0, + 0x1, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9c, 0x66, 0x66, 0x66, 0xc2, 0x0, + 0x0, 0x5, 0x9e, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x2a, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x2, 0x80, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x15, 0x0, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xc0, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7802 "ç ‚" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x16, 0x66, 0x69, 0xa0, 0x0, 0xd0, 0x0, 0x0, + 0x2, 0x2d, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x58, 0x0, 0x5, 0xb0, 0xd0, 0x61, 0x0, + 0x0, 0x93, 0x0, 0x8, 0x60, 0xd0, 0x1d, 0x40, + 0x0, 0xd0, 0x4, 0xb, 0x0, 0xd0, 0x5, 0xd0, + 0x4, 0xf6, 0x6e, 0x38, 0x0, 0xe0, 0x0, 0x50, + 0x9, 0xd0, 0xd, 0x61, 0x0, 0xe0, 0x24, 0x0, + 0x34, 0xc0, 0xd, 0x40, 0x0, 0xe0, 0xbb, 0x0, + 0x10, 0xc0, 0xd, 0x0, 0x0, 0x37, 0xc0, 0x0, + 0x0, 0xc0, 0xd, 0x0, 0x0, 0x5b, 0x0, 0x0, + 0x0, 0xc6, 0x6d, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x0, 0xd0, 0x7, 0x2, 0xa6, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x3, 0x66, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7814 "ç ”" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x50, + 0x4, 0x66, 0x6a, 0xa6, 0x7e, 0x66, 0xe6, 0x50, + 0x1, 0x1b, 0x20, 0x0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xc, 0x0, 0x0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0x29, 0x0, 0x0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0x7b, 0x6b, 0x50, 0xd, 0x0, 0xd0, 0x10, + 0x0, 0xda, 0xb, 0x37, 0x6e, 0x66, 0xe6, 0xd2, + 0x4, 0x7a, 0xb, 0x20, 0x1c, 0x0, 0xd0, 0x0, + 0x6, 0x2a, 0xb, 0x20, 0x2a, 0x0, 0xd0, 0x0, + 0x0, 0x2a, 0xb, 0x20, 0x57, 0x0, 0xd0, 0x0, + 0x0, 0x2c, 0x6c, 0x20, 0xb2, 0x0, 0xd0, 0x0, + 0x0, 0x3a, 0x9, 0x13, 0x90, 0x0, 0xd0, 0x0, + 0x0, 0x24, 0x0, 0x1a, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x3, 0x70, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x10, 0x0, + + /* U+7834 "ç ´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb2, 0x0, 0x0, + 0x1, 0x11, 0x17, 0x20, 0x0, 0xd0, 0x0, 0x0, + 0x7, 0x5e, 0x75, 0x29, 0x66, 0xe6, 0x6b, 0x50, + 0x0, 0xe, 0x0, 0xc, 0x0, 0xd0, 0xb, 0x20, + 0x0, 0x58, 0x0, 0xc, 0x0, 0xd0, 0x11, 0x0, + 0x0, 0xa2, 0x5, 0xc, 0x0, 0xd0, 0x0, 0x0, + 0x1, 0xf6, 0x6e, 0xc, 0x66, 0xe6, 0x97, 0x0, + 0x8, 0xe0, 0xd, 0xd, 0x5, 0x0, 0xa3, 0x0, + 0x26, 0xc0, 0xd, 0xd, 0x7, 0x0, 0xc0, 0x0, + 0x20, 0xc0, 0xd, 0x1c, 0x4, 0x45, 0x70, 0x0, + 0x0, 0xc0, 0xd, 0x48, 0x0, 0xbc, 0x10, 0x0, + 0x0, 0xc6, 0x6d, 0x82, 0x0, 0xac, 0x10, 0x0, + 0x0, 0xd0, 0x7, 0x70, 0x9, 0x54, 0xd6, 0x10, + 0x0, 0x70, 0x6, 0x16, 0x71, 0x0, 0x2c, 0xa0, + 0x0, 0x0, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+78BA "確" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0xa5, 0x0, 0x0, + 0x18, 0x79, 0x6a, 0x32, 0x0, 0xd1, 0x0, 0x40, + 0x0, 0x49, 0x0, 0x9, 0x68, 0xb6, 0x68, 0xc1, + 0x0, 0x65, 0x0, 0x2a, 0xa, 0x44, 0x4, 0x0, + 0x0, 0xa2, 0x2, 0x0, 0x2a, 0xb, 0x30, 0x0, + 0x0, 0xe5, 0x5e, 0x10, 0xc7, 0x6a, 0x78, 0x90, + 0x3, 0xf0, 0xc, 0x7, 0xc0, 0xd, 0x0, 0x0, + 0x8, 0xd0, 0xc, 0x56, 0xc0, 0xd, 0x4, 0x0, + 0x15, 0xc0, 0xc, 0x20, 0xd6, 0x6e, 0x66, 0x20, + 0x10, 0xc0, 0xc, 0x0, 0xc0, 0xd, 0x1, 0x0, + 0x0, 0xc6, 0x6c, 0x0, 0xd6, 0x6e, 0x6a, 0x20, + 0x0, 0xc0, 0x9, 0x0, 0xc0, 0xd, 0x0, 0x0, + 0x0, 0xa0, 0x0, 0x0, 0xc0, 0xd, 0x1, 0x50, + 0x0, 0x0, 0x0, 0x1, 0xd6, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, + + /* U+793A "示" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, + 0x0, 0x6, 0x66, 0x66, 0x66, 0x66, 0xa6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, + 0x6, 0x76, 0x66, 0x66, 0x86, 0x66, 0x68, 0xb2, + 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x59, 0x3, 0xb0, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xc7, 0x3, 0xb0, 0x19, 0x10, 0x0, + 0x0, 0x6, 0xb0, 0x3, 0xb0, 0x2, 0xd3, 0x0, + 0x0, 0x2c, 0x0, 0x3, 0xb0, 0x0, 0x4f, 0x20, + 0x0, 0xa1, 0x0, 0x3, 0xb0, 0x0, 0xb, 0x90, + 0x7, 0x10, 0x4, 0x37, 0xb0, 0x0, 0x2, 0x30, + 0x0, 0x0, 0x1, 0xaf, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, + + /* U+793C "礼" */ + 0x0, 0x3, 0x30, 0x0, 0x2a, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x30, 0x2, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x75, 0x0, 0x2b, 0x0, 0x0, 0x0, 0x36, + 0x66, 0x6b, 0x12, 0xb0, 0x0, 0x0, 0x0, 0x10, + 0x8, 0xa0, 0x2b, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xc0, 0x2, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xd3, + 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, 0xae, 0x97, + 0x2, 0xb0, 0x0, 0x0, 0x0, 0x92, 0xc1, 0xb5, + 0x2b, 0x0, 0x0, 0x1, 0x61, 0xc, 0x12, 0x22, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x2b, + 0x0, 0x4, 0x0, 0x0, 0xd, 0x10, 0x2, 0xb0, + 0x0, 0x51, 0x0, 0x0, 0xd1, 0x0, 0x1c, 0x0, + 0x8, 0x60, 0x0, 0xd, 0x10, 0x0, 0xad, 0xdd, + 0xd6, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+793E "社" */ + 0x0, 0x6, 0x20, 0x0, 0x0, 0x71, 0x0, 0x0, + 0x0, 0x1, 0xe1, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x71, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x4, 0x66, 0x6a, 0x90, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x30, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x78, 0x0, 0x0, 0xe0, 0x8, 0x20, + 0x0, 0x2, 0xe1, 0x7, 0x66, 0xe6, 0x66, 0x40, + 0x0, 0xc, 0xdb, 0x60, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x85, 0xc1, 0xd0, 0x0, 0xe0, 0x0, 0x0, + 0x5, 0x31, 0xc0, 0x10, 0x0, 0xe0, 0x0, 0x0, + 0x1, 0x1, 0xc0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x1, 0xc0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x1, 0xc0, 0x56, 0x66, 0xe6, 0x67, 0xe2, + 0x0, 0x2, 0xd0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7956 "祖" */ + 0x0, 0x26, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0xa, 0x80, 0xc, 0x66, 0x66, 0xe3, 0x0, + 0x0, 0x3, 0x50, 0xd, 0x10, 0x0, 0xe0, 0x0, + 0x7, 0x66, 0x9a, 0xd, 0x10, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0xd2, 0xd, 0x10, 0x0, 0xe0, 0x0, + 0x0, 0x7, 0x80, 0xd, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0x1e, 0x50, 0xc, 0x10, 0x0, 0xe0, 0x0, + 0x0, 0x9e, 0x6b, 0xc, 0x10, 0x0, 0xe0, 0x0, + 0x5, 0x4d, 0xc, 0x1c, 0x10, 0x0, 0xe0, 0x0, + 0x23, 0xd, 0x0, 0xc, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0xc, 0x10, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0xc, 0x10, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0xc, 0x10, 0x0, 0xe2, 0x60, + 0x0, 0xd, 0x7, 0x66, 0x66, 0x66, 0x66, 0x60, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+795D "ç¥" */ + 0x0, 0x26, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x70, 0x9, 0x66, 0x66, 0x96, 0x0, + 0x0, 0x4, 0x50, 0xd, 0x0, 0x0, 0x74, 0x0, + 0x7, 0x66, 0x7d, 0x1d, 0x0, 0x0, 0x74, 0x0, + 0x0, 0x0, 0x96, 0xd, 0x0, 0x0, 0x74, 0x0, + 0x0, 0x2, 0xb0, 0xd, 0x0, 0x0, 0x74, 0x0, + 0x0, 0xc, 0x50, 0xe, 0x67, 0x68, 0xa5, 0x0, + 0x0, 0x7e, 0x89, 0x5, 0x48, 0x2b, 0x31, 0x0, + 0x4, 0x6b, 0x1d, 0x10, 0x48, 0x2b, 0x0, 0x0, + 0x25, 0xb, 0x11, 0x0, 0x75, 0x2b, 0x0, 0x0, + 0x0, 0xb, 0x10, 0x0, 0xb1, 0x2b, 0x0, 0x30, + 0x0, 0xb, 0x10, 0x3, 0x90, 0x2b, 0x0, 0x60, + 0x0, 0xc, 0x10, 0x1a, 0x0, 0x2b, 0x1, 0x90, + 0x0, 0xc, 0x22, 0x80, 0x0, 0xd, 0xbc, 0xb0, + 0x0, 0x5, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+795E "神" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x70, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, + 0x9, 0x70, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, + 0x35, 0x0, 0x30, 0xd, 0x0, 0x40, 0x17, 0x66, + 0x7c, 0xd, 0x66, 0xe6, 0x6e, 0x20, 0x0, 0x9, + 0x50, 0xd0, 0xd, 0x0, 0xd0, 0x0, 0x2, 0xa0, + 0xd, 0x66, 0xe6, 0x6e, 0x0, 0x0, 0xc8, 0x10, + 0xd0, 0xd, 0x0, 0xd0, 0x0, 0x8e, 0x2e, 0x1d, + 0x0, 0xd0, 0xd, 0x0, 0x63, 0xc0, 0x61, 0xd6, + 0x6e, 0x66, 0xe0, 0x32, 0xc, 0x0, 0xc, 0x0, + 0xd0, 0x9, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x4, 0x0, 0x0, + + /* U+796D "祭" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc5, 0x0, 0x5, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xe6, 0x69, 0x58, 0x66, 0x7e, 0x20, + 0x0, 0xa, 0x70, 0xd, 0x26, 0x0, 0x96, 0x0, + 0x0, 0x39, 0x5b, 0x4a, 0x2, 0x64, 0x50, 0x0, + 0x0, 0xa7, 0x15, 0xc2, 0x0, 0xa6, 0x0, 0x0, + 0x6, 0x4, 0xa7, 0x70, 0x0, 0x1c, 0x10, 0x0, + 0x0, 0x0, 0x5b, 0x66, 0x66, 0xc5, 0xd6, 0x0, + 0x0, 0x5, 0x70, 0x20, 0x0, 0x0, 0x3d, 0xc1, + 0x1, 0x74, 0x0, 0x0, 0x0, 0x0, 0x71, 0x0, + 0x14, 0x7, 0x66, 0x66, 0xd6, 0x66, 0x73, 0x0, + 0x0, 0x0, 0x1e, 0x50, 0xd0, 0x64, 0x0, 0x0, + 0x0, 0x0, 0xc7, 0x0, 0xd0, 0x6, 0xc3, 0x0, + 0x0, 0x1a, 0x30, 0x0, 0xd0, 0x0, 0x4e, 0x0, + 0x1, 0x60, 0x2, 0x7c, 0xb0, 0x0, 0x4, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x20, 0x0, 0x0, 0x0, + + /* U+7981 "ç¦" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x10, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0xc0, 0x20, 0x0, 0xd0, 0x2, 0x0, 0x66, + 0x7e, 0x6a, 0x27, 0x8f, 0x66, 0xa3, 0x0, 0xc, + 0xf6, 0x10, 0xb, 0xf7, 0x0, 0x0, 0x5, 0x8c, + 0x3d, 0x5, 0x8d, 0x39, 0x0, 0x2, 0xa0, 0xc0, + 0x53, 0x80, 0xd0, 0x6d, 0x61, 0x70, 0xc, 0x11, + 0x50, 0xc, 0x0, 0x40, 0x0, 0x5, 0x66, 0x66, + 0x66, 0x6c, 0x50, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x27, 0x66, 0x66, 0x69, 0x66, + 0x66, 0x6a, 0x60, 0x0, 0x6, 0x40, 0xc2, 0x4, + 0x0, 0x0, 0x0, 0x4, 0xd3, 0xc, 0x20, 0x2b, + 0x40, 0x0, 0x4, 0x90, 0x0, 0xc2, 0x0, 0x1d, + 0x60, 0x3, 0x40, 0x6, 0xcf, 0x0, 0x0, 0x27, + 0x0, 0x0, 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, + + /* U+79C0 "ç§€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x46, 0x9d, 0xc0, 0x0, + 0x0, 0x4, 0x56, 0x67, 0xc2, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x2, 0x30, + 0x3, 0x76, 0x66, 0x8b, 0xd8, 0x66, 0x68, 0x80, + 0x0, 0x0, 0x2, 0xd4, 0xb2, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x21, 0xb0, 0x59, 0x0, 0x0, + 0x0, 0x5, 0xa1, 0x2, 0x80, 0x4, 0xd8, 0x30, + 0x1, 0x75, 0x66, 0x86, 0x66, 0xd2, 0x19, 0xa2, + 0x3, 0x0, 0x0, 0xe0, 0x4, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xb0, 0xd, 0x86, 0x97, 0x0, + 0x0, 0x0, 0x9, 0x50, 0x3, 0x0, 0xa3, 0x0, + 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x1, 0xb1, 0x0, 0x2, 0x2, 0xc0, 0x0, + 0x0, 0x48, 0x10, 0x0, 0x4, 0xcf, 0x50, 0x0, + 0x2, 0x20, 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, + + /* U+79C1 "ç§" */ + 0x0, 0x0, 0x0, 0x28, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x14, 0x7b, 0xb8, 0x20, 0x1e, 0x20, 0x0, + 0x1, 0x32, 0x1d, 0x0, 0x0, 0x4d, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x78, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x4, 0x50, 0xa3, 0x0, 0x0, + 0x4, 0x76, 0x7e, 0x66, 0x50, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x7e, 0x10, 0x2, 0x90, 0x0, 0x0, + 0x0, 0x1, 0xdd, 0xa8, 0x7, 0x40, 0x0, 0x0, + 0x0, 0x9, 0x4d, 0xd, 0x3a, 0x0, 0x60, 0x0, + 0x0, 0x56, 0xd, 0x2, 0x28, 0x0, 0x38, 0x0, + 0x3, 0x50, 0xd, 0x0, 0x62, 0x0, 0xc, 0x40, + 0x3, 0x0, 0xd, 0x0, 0xa0, 0x1, 0x29, 0xd0, + 0x0, 0x0, 0x1d, 0x6, 0xfd, 0x96, 0x33, 0xf1, + 0x0, 0x0, 0x1e, 0x0, 0x40, 0x0, 0x0, 0x70, + 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+79CB "ç§‹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x60, 0x2, 0xd1, 0x0, 0x0, + 0x0, 0x36, 0xca, 0x70, 0x2, 0xd0, 0x0, 0x0, + 0x1, 0x20, 0xe0, 0x0, 0x2, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x32, 0xc0, 0xd, 0x30, + 0x5, 0x66, 0xe6, 0xd3, 0x83, 0xd0, 0x98, 0x0, + 0x1, 0x13, 0xf0, 0x3, 0xb4, 0xe5, 0x70, 0x0, + 0x0, 0x8, 0xf0, 0xa, 0x65, 0xd4, 0x0, 0x0, + 0x0, 0xc, 0xe9, 0x50, 0x7, 0x95, 0x0, 0x0, + 0x0, 0x64, 0xe1, 0xe0, 0xa, 0x49, 0x0, 0x0, + 0x0, 0x90, 0xe0, 0x30, 0xd, 0x19, 0x10, 0x0, + 0x6, 0x0, 0xe0, 0x0, 0x4a, 0x4, 0x90, 0x0, + 0x10, 0x0, 0xe0, 0x0, 0xc1, 0x0, 0xc4, 0x0, + 0x0, 0x0, 0xe0, 0x9, 0x30, 0x0, 0x3f, 0x50, + 0x0, 0x0, 0xe2, 0x82, 0x0, 0x0, 0x7, 0x91, + 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+79CD "ç§" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x60, 0x0, 0x3b, 0x0, 0x0, + 0x1, 0x47, 0xba, 0x81, 0x0, 0x2a, 0x0, 0x0, + 0x1, 0x0, 0xd0, 0x0, 0x0, 0x2a, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x41, 0x3a, 0x11, 0x70, + 0x6, 0x66, 0xe6, 0xd3, 0xe5, 0x6c, 0x56, 0xc0, + 0x0, 0x2, 0xd0, 0x0, 0xd0, 0x2a, 0x2, 0xa0, + 0x0, 0x7, 0xe6, 0x0, 0xd0, 0x2a, 0x2, 0xa0, + 0x0, 0xc, 0xd5, 0xd0, 0xd0, 0x2a, 0x2, 0xa0, + 0x0, 0x65, 0xd0, 0x80, 0xe6, 0x7c, 0x67, 0xb0, + 0x1, 0x90, 0xd0, 0x0, 0x80, 0x2a, 0x1, 0x30, + 0x7, 0x0, 0xd0, 0x0, 0x0, 0x2a, 0x0, 0x0, + 0x10, 0x0, 0xd0, 0x0, 0x0, 0x2a, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x2a, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x3b, 0x0, 0x0, + 0x0, 0x0, 0x50, 0x0, 0x0, 0x13, 0x0, 0x0, + + /* U+79D1 "ç§‘" */ + 0x0, 0x0, 0x1, 0x70, 0x0, 0x0, 0xc2, 0x0, + 0x0, 0x36, 0xbb, 0x81, 0x0, 0x0, 0xd0, 0x0, + 0x2, 0x20, 0xd0, 0x0, 0x56, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xb, 0x50, 0xd0, 0x0, + 0x0, 0x0, 0xd0, 0x53, 0x2, 0x10, 0xd0, 0x0, + 0x7, 0x66, 0xf6, 0x64, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x4, 0xf1, 0x0, 0x57, 0x0, 0xd0, 0x0, + 0x0, 0xb, 0xe8, 0x80, 0xd, 0x10, 0xd0, 0x0, + 0x0, 0x48, 0xd0, 0xd1, 0x2, 0x0, 0xd4, 0xd1, + 0x0, 0xa0, 0xd0, 0x10, 0x35, 0x66, 0xd3, 0x0, + 0x7, 0x10, 0xd0, 0x26, 0x30, 0x0, 0xd0, 0x0, + 0x11, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x80, 0x0, + + /* U+79D8 "秘" */ + 0x0, 0x0, 0x3, 0x40, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x37, 0xbb, 0x80, 0x5, 0x90, 0x19, 0x0, + 0x3, 0x20, 0xc0, 0x0, 0x0, 0xd2, 0x4d, 0x0, + 0x0, 0x0, 0xc0, 0x0, 0x18, 0x40, 0x78, 0x0, + 0x0, 0x0, 0xc0, 0x70, 0x1d, 0x0, 0xb4, 0x0, + 0x6, 0x68, 0xd6, 0x62, 0xc, 0x0, 0xf0, 0x0, + 0x0, 0x9, 0xd5, 0x2, 0xc, 0x4, 0xb6, 0x0, + 0x0, 0xc, 0xc8, 0x88, 0xc, 0xb, 0x56, 0x80, + 0x0, 0x74, 0xc0, 0x5d, 0x1c, 0x2d, 0x1, 0xf1, + 0x1, 0x80, 0xc0, 0x5c, 0xc, 0xc4, 0x0, 0x90, + 0x6, 0x0, 0xc0, 0x0, 0xf, 0xa0, 0x4, 0x0, + 0x0, 0x0, 0xc0, 0x0, 0x6d, 0x0, 0x7, 0x0, + 0x0, 0x0, 0xc0, 0x7, 0x7d, 0x0, 0xc, 0x20, + 0x0, 0x1, 0xd2, 0x62, 0xb, 0xcc, 0xcc, 0x20, + 0x0, 0x1, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+79FB "ç§»" */ + 0x0, 0x0, 0x3, 0x30, 0x0, 0x90, 0x0, 0x0, + 0x0, 0x37, 0xbb, 0x70, 0x7, 0x80, 0x1, 0x0, + 0x2, 0x31, 0xd0, 0x0, 0x2b, 0x66, 0x6e, 0x50, + 0x0, 0x0, 0xd0, 0x0, 0x88, 0x30, 0x79, 0x0, + 0x0, 0x0, 0xd0, 0x74, 0x2, 0xa6, 0xa0, 0x0, + 0x7, 0x67, 0xe6, 0x62, 0x0, 0x79, 0x0, 0x0, + 0x0, 0x7, 0xe0, 0x0, 0x18, 0x59, 0x10, 0x0, + 0x0, 0xc, 0xea, 0x54, 0x60, 0x8b, 0x10, 0x10, + 0x0, 0x47, 0xd1, 0xc0, 0x6, 0xc6, 0x67, 0xe1, + 0x0, 0xa0, 0xd0, 0x10, 0x6a, 0x0, 0xb, 0x50, + 0x5, 0x20, 0xd0, 0x6, 0x35, 0x80, 0x88, 0x0, + 0x3, 0x0, 0xe0, 0x10, 0x0, 0x88, 0x90, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x3, 0xa6, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x5, 0x87, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x32, 0x31, 0x0, 0x0, 0x0, 0x0, + + /* U+7A0B "程" */ + 0x0, 0x0, 0x17, 0x70, 0x30, 0x0, 0x3, 0x0, + 0x3, 0x58, 0xd6, 0x40, 0xe6, 0x66, 0x6e, 0x30, + 0x0, 0x1, 0xb0, 0x0, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x1, 0xb0, 0x0, 0xd0, 0x0, 0xd, 0x0, + 0x5, 0x66, 0xd6, 0xc1, 0xe6, 0x66, 0x6e, 0x0, + 0x2, 0x6, 0xb0, 0x0, 0xc0, 0x0, 0x8, 0x0, + 0x0, 0xa, 0xd5, 0x0, 0x0, 0x0, 0x4, 0x30, + 0x0, 0xd, 0xb7, 0x94, 0x76, 0x7c, 0x66, 0x40, + 0x0, 0x57, 0xb0, 0x80, 0x0, 0x3a, 0x0, 0x0, + 0x0, 0xa1, 0xb0, 0x0, 0x0, 0x3a, 0x5, 0x0, + 0x4, 0x31, 0xb0, 0x1, 0x86, 0x7c, 0x66, 0x30, + 0x5, 0x1, 0xb0, 0x0, 0x0, 0x3a, 0x0, 0x0, + 0x0, 0x1, 0xb0, 0x0, 0x0, 0x3a, 0x0, 0x30, + 0x0, 0x2, 0xc0, 0x47, 0x66, 0x68, 0x67, 0x91, + 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7A2E "種" */ + 0x0, 0x0, 0x2, 0x0, 0x0, 0x25, 0xa4, 0x0, + 0x1, 0x48, 0xba, 0x14, 0x56, 0xe5, 0x31, 0x0, + 0x3, 0x1b, 0x10, 0x0, 0x0, 0xd0, 0x3, 0x40, + 0x0, 0xb, 0x10, 0x57, 0x66, 0xe6, 0x66, 0x50, + 0x4, 0x5c, 0x6c, 0x23, 0x0, 0xd0, 0x3, 0x0, + 0x2, 0x2f, 0x21, 0xd, 0x66, 0xe6, 0x6e, 0x0, + 0x0, 0x4f, 0x81, 0xc, 0x0, 0xd0, 0x1c, 0x0, + 0x0, 0xae, 0x3b, 0xd, 0x66, 0xe6, 0x6c, 0x0, + 0x1, 0x9b, 0x18, 0xc, 0x0, 0xd0, 0x1c, 0x0, + 0x8, 0x1b, 0x10, 0xc, 0x66, 0xe6, 0x6a, 0x0, + 0x23, 0xb, 0x10, 0x0, 0x0, 0xd0, 0x4, 0x0, + 0x0, 0xb, 0x10, 0x28, 0x66, 0xe6, 0x69, 0x30, + 0x0, 0xb, 0x10, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xc, 0x21, 0x66, 0x66, 0xe6, 0x6a, 0xc0, + 0x0, 0x4, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+7A4D "ç©" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x45, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0x3, 0x6c, 0x96, 0x26, 0x66, 0xe6, 0x6b, 0x50, + 0x0, 0xc, 0x0, 0x2, 0x0, 0xd0, 0x2, 0x0, + 0x0, 0xc, 0x2, 0x3, 0x76, 0xe6, 0x67, 0x0, + 0x18, 0x6e, 0x7a, 0x10, 0x0, 0xd0, 0x3, 0x60, + 0x0, 0x2f, 0x30, 0x57, 0x66, 0x66, 0x67, 0x50, + 0x0, 0x8f, 0x66, 0xb, 0x66, 0x66, 0x6e, 0x10, + 0x0, 0xbc, 0xc, 0xc, 0x0, 0x0, 0xd, 0x0, + 0x4, 0x5c, 0x0, 0xc, 0x66, 0x66, 0x6d, 0x0, + 0x8, 0xc, 0x0, 0xc, 0x66, 0x66, 0x6d, 0x0, + 0x31, 0xc, 0x0, 0xc, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xc, 0x0, 0xc, 0x76, 0x66, 0x6d, 0x0, + 0x0, 0xd, 0x0, 0x2, 0xc7, 0x1, 0x66, 0x0, + 0x0, 0xc, 0x0, 0x58, 0x20, 0x0, 0x6, 0xb0, + 0x0, 0x1, 0x3, 0x10, 0x0, 0x0, 0x0, 0x50, + + /* U+7A76 "ç©¶" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x4b, 0x0, 0x0, 0x30, 0x0, 0x39, + 0x67, 0x66, 0x76, 0x66, 0x7e, 0x10, 0xc, 0x31, + 0xd4, 0x0, 0x65, 0x7, 0x20, 0x0, 0x33, 0xb3, + 0x63, 0x0, 0x5e, 0x70, 0x0, 0x5, 0x50, 0xb, + 0x30, 0x0, 0x2c, 0x0, 0x0, 0x6, 0x77, 0xe7, + 0x77, 0xc0, 0x0, 0x0, 0x0, 0x10, 0xd, 0x0, + 0x2b, 0x0, 0x0, 0x0, 0x0, 0x3, 0xa0, 0x2, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x76, 0x0, 0x3a, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x3, 0xa0, + 0x0, 0x20, 0x0, 0x8, 0x70, 0x0, 0x3a, 0x0, + 0x15, 0x0, 0x5, 0xa0, 0x0, 0x3, 0xa0, 0x3, + 0xb0, 0x5, 0x70, 0x0, 0x0, 0xc, 0xcc, 0xd8, + 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7A7A "空" */ + 0x0, 0x0, 0x0, 0x29, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x0, 0x0, + 0x76, 0x66, 0x66, 0x96, 0x66, 0x6a, 0x20, 0x2b, + 0x0, 0x41, 0x0, 0x0, 0x1, 0xc4, 0xa, 0x70, + 0x2e, 0x60, 0x4, 0x95, 0x41, 0x0, 0x0, 0x3c, + 0x30, 0x0, 0x0, 0x9e, 0x40, 0x0, 0x67, 0x0, + 0x0, 0x0, 0x0, 0x7c, 0x0, 0x41, 0x56, 0x66, + 0x66, 0x66, 0xd4, 0x10, 0x0, 0x1, 0x10, 0xb, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x2, 0x0, 0x56, 0x66, 0x66, 0xd8, 0x66, 0x67, + 0xf4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+7A93 "窓" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0xe, 0x40, 0x0, 0x1, 0x0, 0x38, + 0x66, 0x66, 0x86, 0x66, 0x69, 0xd0, 0xd, 0x20, + 0x4c, 0x0, 0x47, 0x40, 0x81, 0x2, 0x51, 0x89, + 0x26, 0x70, 0x18, 0xe2, 0x0, 0x3, 0x50, 0x3, + 0xd5, 0x2, 0x4, 0x30, 0x0, 0x0, 0x4, 0xa1, + 0x0, 0x66, 0x0, 0x0, 0x0, 0xb, 0xb7, 0x77, + 0x66, 0xe4, 0x0, 0x0, 0x0, 0x88, 0x53, 0x10, + 0x6, 0x80, 0x0, 0x0, 0x2, 0x50, 0x84, 0x0, + 0x1, 0x0, 0x0, 0x5, 0x2d, 0x0, 0xe3, 0x2, + 0x46, 0x0, 0x3, 0x72, 0xb0, 0x4, 0x0, 0x60, + 0xa7, 0x4, 0xe2, 0x2c, 0x0, 0x0, 0x8, 0x43, + 0x90, 0x1, 0x0, 0xdd, 0xdd, 0xdd, 0xe6, 0x0, + 0x0, + + /* U+7ACB "ç«‹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x48, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x60, 0x0, 0x15, 0x0, + 0x1, 0x86, 0x66, 0x66, 0x66, 0x66, 0x89, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, + 0x0, 0x0, 0x60, 0x0, 0x0, 0x9c, 0x0, 0x0, + 0x0, 0x0, 0x37, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x10, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x80, 0x3, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xc0, 0x8, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xa0, 0x9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x26, 0x0, 0x0, 0x10, + 0x16, 0x66, 0x66, 0x66, 0x96, 0x66, 0x6b, 0xd1, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7AD9 "ç«™" */ + 0x0, 0x2, 0x0, 0x0, 0x0, 0x82, 0x0, 0x0, + 0x0, 0xa, 0x30, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x6, 0xa0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x1, 0x40, 0x44, 0x0, 0xd1, 0x13, 0x80, + 0x6, 0x66, 0x66, 0x77, 0x0, 0xd5, 0x55, 0x50, + 0x0, 0x10, 0x8, 0x50, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x70, 0xc, 0x30, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x74, 0xd, 0x0, 0x96, 0xe6, 0x6c, 0x30, + 0x0, 0x5a, 0x19, 0x0, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x3b, 0x43, 0x0, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x2, 0x60, 0x33, 0xd0, 0x0, 0xd, 0x0, + 0x1, 0x48, 0xb7, 0x20, 0xd0, 0x0, 0xd, 0x0, + 0xa, 0xa3, 0x0, 0x0, 0xe6, 0x66, 0x6e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0xb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + + /* U+7AE5 "ç«¥" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x66, 0x66, 0xd6, 0x66, 0xc6, 0x0, + 0x0, 0x2, 0x6, 0x60, 0x0, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x4, 0x40, 0x4, 0x0, + 0x2, 0x76, 0x55, 0x65, 0x57, 0x55, 0x59, 0x50, + 0x0, 0x1, 0x86, 0x66, 0x66, 0x66, 0xa1, 0x0, + 0x0, 0x1, 0xb0, 0x0, 0xd0, 0x0, 0xd0, 0x0, + 0x0, 0x1, 0xd6, 0x66, 0xe6, 0x66, 0xe0, 0x0, + 0x0, 0x1, 0xb0, 0x0, 0xd0, 0x0, 0xd0, 0x0, + 0x0, 0x1, 0xd6, 0x66, 0xe6, 0x66, 0xe0, 0x0, + 0x0, 0x1, 0x30, 0x0, 0xd0, 0x0, 0x33, 0x0, + 0x0, 0x18, 0x66, 0x66, 0xe6, 0x66, 0x7a, 0x20, + 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x40, + 0x6, 0x76, 0x66, 0x66, 0xa6, 0x66, 0x66, 0xa5, + + /* U+7B11 "笑" */ + 0x0, 0x2, 0xa0, 0x0, 0x0, 0x91, 0x0, 0x0, + 0x0, 0x8, 0x80, 0x4, 0x5, 0xc0, 0x3, 0x10, + 0x0, 0x1d, 0x77, 0x69, 0x4c, 0x78, 0x69, 0x80, + 0x0, 0x93, 0xc, 0x10, 0x65, 0x5, 0xa0, 0x0, + 0x5, 0x40, 0x9, 0x32, 0x50, 0x1, 0xa0, 0x0, + 0x2, 0x0, 0x0, 0x14, 0x68, 0xcf, 0x50, 0x0, + 0x0, 0x4, 0x56, 0x6d, 0x62, 0x11, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x5, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x6e, 0x50, + 0x1, 0x0, 0x0, 0x3a, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa4, 0x9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x90, 0x3, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x87, 0x0, 0x0, 0x3d, 0x82, 0x0, + 0x1, 0x57, 0x10, 0x0, 0x0, 0x1, 0xaf, 0x80, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+7B26 "符" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xc1, 0x0, 0x0, 0x96, 0x0, 0x0, + 0x0, 0x8, 0x90, 0x2, 0x20, 0xd1, 0x0, 0x50, + 0x0, 0x1c, 0x69, 0x76, 0x57, 0x86, 0xb6, 0x72, + 0x0, 0x92, 0x1, 0xc0, 0x28, 0x0, 0x95, 0x0, + 0x5, 0x20, 0x7, 0x30, 0x70, 0x1, 0x31, 0x0, + 0x0, 0x0, 0x5c, 0x20, 0x0, 0x3, 0xc0, 0x0, + 0x0, 0x1, 0xd2, 0x56, 0x66, 0x67, 0xc6, 0xc5, + 0x0, 0xb, 0xc0, 0x11, 0x0, 0x3, 0xa0, 0x0, + 0x0, 0x76, 0xa0, 0x8, 0x10, 0x3, 0xa0, 0x0, + 0x6, 0x22, 0xa0, 0x3, 0xd0, 0x3, 0xa0, 0x0, + 0x0, 0x2, 0xa0, 0x0, 0xc0, 0x3, 0xa0, 0x0, + 0x0, 0x2, 0xa0, 0x0, 0x0, 0x3, 0xa0, 0x0, + 0x0, 0x2, 0xa0, 0x0, 0x0, 0x3, 0x90, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x3, 0x9d, 0x80, 0x0, + 0x0, 0x1, 0x20, 0x0, 0x0, 0x5, 0x0, 0x0, + + /* U+7B2C "第" */ + 0x0, 0x1, 0xb1, 0x0, 0x3, 0x90, 0x0, 0x0, + 0x0, 0x9a, 0x0, 0x70, 0x98, 0x0, 0x53, 0x0, + 0x4b, 0x7b, 0x66, 0x6b, 0x7b, 0x66, 0x40, 0x28, + 0x0, 0xa3, 0x18, 0x0, 0xb3, 0x0, 0x2, 0x5, + 0x68, 0x67, 0x66, 0x68, 0xb2, 0x0, 0x0, 0x10, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0x3, 0x20, + 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x0, 0x99, 0x66, + 0x6e, 0x66, 0x6c, 0x0, 0x0, 0xd, 0x10, 0x0, + 0xd0, 0x0, 0x1, 0x0, 0x3, 0xd6, 0x66, 0xae, + 0x66, 0x66, 0xc7, 0x0, 0x1, 0x0, 0xb5, 0xd0, + 0x0, 0xc, 0x10, 0x0, 0x1, 0xa5, 0xd, 0x0, + 0x0, 0xe0, 0x0, 0x4, 0xa2, 0x0, 0xd0, 0x19, + 0xd9, 0x0, 0x47, 0x40, 0x0, 0xd, 0x0, 0x6, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, + 0x0, + + /* U+7B46 "ç­†" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xd0, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x0, 0xa, 0x60, 0x5, 0x16, 0xa0, 0x0, 0x70, + 0x0, 0x2d, 0x6b, 0x66, 0x5c, 0x67, 0xb6, 0x72, + 0x0, 0xa2, 0x5, 0xc0, 0x74, 0x0, 0x7b, 0x0, + 0x6, 0x30, 0x0, 0xa3, 0xb0, 0x0, 0x1a, 0x0, + 0x1, 0x1, 0x86, 0x68, 0xc6, 0x66, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xa0, 0x0, 0xe4, 0x60, + 0x0, 0x76, 0x66, 0x68, 0xc6, 0x66, 0xe6, 0x50, + 0x0, 0x1, 0x66, 0x68, 0xc6, 0x66, 0xe0, 0x0, + 0x0, 0x0, 0x20, 0x3, 0xa0, 0x0, 0x40, 0x0, + 0x0, 0x3, 0x66, 0x68, 0xc6, 0x6a, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xa0, 0x0, 0x8, 0x30, + 0x2, 0x86, 0x66, 0x68, 0xc6, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x0, 0x3, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x30, 0x0, 0x0, 0x0, + + /* U+7B49 "ç­‰" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xc1, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0xa, 0xa0, 0x6, 0x23, 0xd0, 0x0, 0x60, + 0x0, 0x2d, 0x79, 0x66, 0x4a, 0x6a, 0x76, 0x61, + 0x0, 0xa1, 0xc, 0x20, 0x44, 0x2, 0xc0, 0x0, + 0x6, 0x20, 0x7, 0x30, 0xe1, 0x0, 0x80, 0x0, + 0x0, 0x4, 0x76, 0x66, 0xe6, 0x66, 0x9a, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x5, 0x76, 0x66, 0x66, 0xd6, 0x66, 0x66, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x10, 0x0, + 0x0, 0x56, 0x66, 0x66, 0x66, 0x6e, 0x67, 0xc1, + 0x0, 0x10, 0x5, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x90, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x18, 0xeb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x51, 0x0, 0x0, + + /* U+7B54 "ç­”" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xb1, 0x0, 0x5, 0xa0, 0x0, 0x0, + 0x0, 0x8, 0xb0, 0x4, 0xa, 0x60, 0x2, 0x20, + 0x0, 0xd, 0x87, 0x67, 0x6b, 0x6a, 0x67, 0x50, + 0x0, 0x84, 0xc, 0x3, 0x61, 0x5, 0xa0, 0x0, + 0x3, 0x60, 0x8, 0x3e, 0x70, 0x0, 0xb0, 0x0, + 0x2, 0x0, 0x2, 0xd4, 0x46, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3c, 0x20, 0x4, 0xa4, 0x0, 0x0, + 0x0, 0x7, 0x80, 0x0, 0x0, 0x89, 0xda, 0x72, + 0x3, 0x73, 0x37, 0x66, 0x66, 0x61, 0x17, 0x70, + 0x1, 0x0, 0x30, 0x0, 0x0, 0x5, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x30, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x3, 0x0, 0x0, + + /* U+7B56 "ç­–" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, + 0xb, 0x50, 0x15, 0xd, 0x40, 0x6, 0x0, 0x5, + 0xa8, 0x86, 0x5a, 0x88, 0x96, 0x61, 0x2, 0x90, + 0xc, 0x3, 0x30, 0xd, 0x10, 0x0, 0x50, 0x0, + 0x40, 0xa4, 0x0, 0x40, 0x50, 0x6, 0x76, 0x66, + 0x6c, 0x76, 0x66, 0x6a, 0x40, 0x0, 0x20, 0x0, + 0xb2, 0x0, 0x4, 0x0, 0x0, 0xd, 0x66, 0x6c, + 0x76, 0x66, 0xe0, 0x0, 0x0, 0xc0, 0x0, 0xc2, + 0x0, 0xd, 0x0, 0x0, 0xc, 0x0, 0x7f, 0x70, + 0x56, 0xc0, 0x0, 0x0, 0xa0, 0x69, 0xb3, 0x70, + 0x85, 0x0, 0x0, 0x0, 0x87, 0xb, 0x22, 0xa2, + 0x0, 0x0, 0x2, 0x93, 0x0, 0xb2, 0x1, 0xab, + 0x63, 0x6, 0x50, 0x0, 0xb, 0x20, 0x0, 0x4b, + 0x31, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, + + /* U+7B97 "ç®—" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x2, 0xe1, 0x0, 0x0, 0xd3, 0x0, 0x0, + 0x0, 0x9, 0x96, 0x6b, 0x65, 0xc6, 0x66, 0xc1, + 0x0, 0x19, 0x7, 0x60, 0x9, 0x0, 0x94, 0x0, + 0x0, 0x91, 0x21, 0x60, 0x40, 0x0, 0x66, 0x0, + 0x4, 0x10, 0xe6, 0x66, 0x66, 0x67, 0xd0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x67, 0xb0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x3, 0xb0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x67, 0xb0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x67, 0xb0, 0x0, + 0x0, 0x0, 0x90, 0xf0, 0x0, 0xe1, 0x50, 0x0, + 0x0, 0x0, 0x1, 0xd0, 0x0, 0xe0, 0x0, 0x80, + 0x6, 0x76, 0x69, 0xc6, 0x66, 0xe6, 0x66, 0x73, + 0x0, 0x0, 0x1c, 0x20, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x4, 0xa2, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x52, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, + + /* U+7BA1 "管" */ + 0x0, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0xa7, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, + 0x2e, 0x66, 0x88, 0x2d, 0x66, 0x6c, 0x20, 0xa, + 0x15, 0x40, 0x7, 0x3, 0x60, 0x0, 0x5, 0x20, + 0x1a, 0xa, 0x10, 0xb, 0x0, 0x0, 0x13, 0x0, + 0x0, 0x75, 0x0, 0x0, 0x62, 0x2, 0xb6, 0x66, + 0x66, 0x66, 0x66, 0x6e, 0x70, 0xc4, 0x9, 0x66, + 0x66, 0x6a, 0x43, 0x40, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xa2, 0x0, 0x0, 0x0, 0xd, 0x66, 0x66, + 0x6c, 0x20, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x61, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x60, 0x0, 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x1, 0xb0, + 0x0, 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6c, 0x0, + 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+7BC0 "節" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xc0, 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, + 0xb9, 0x66, 0xc5, 0xa9, 0x66, 0x9c, 0x10, 0x48, + 0x7, 0x80, 0x19, 0x2, 0x92, 0x0, 0x18, 0x0, + 0xa, 0x16, 0x0, 0x3, 0xd0, 0x5, 0x3, 0x0, + 0x5, 0x3, 0x0, 0x7, 0x0, 0x0, 0xd6, 0x66, + 0xe1, 0xd6, 0x66, 0xe1, 0x0, 0xd, 0x66, 0x6d, + 0xd, 0x0, 0xd, 0x0, 0x0, 0xc0, 0x0, 0xd0, + 0xd0, 0x0, 0xd0, 0x0, 0xc, 0x0, 0xd, 0xd, + 0x0, 0xd, 0x0, 0x0, 0xd6, 0x66, 0xa0, 0xd0, + 0x0, 0xd0, 0x0, 0xc, 0x1, 0x60, 0xd, 0x0, + 0xd, 0x0, 0x0, 0xc0, 0x8, 0x80, 0xd0, 0x3b, + 0xa0, 0x0, 0x1d, 0x78, 0x3f, 0x1d, 0x0, 0x20, + 0x0, 0x0, 0xc4, 0x0, 0x60, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, + + /* U+7BC4 "範" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc5, 0x0, 0x0, 0x79, 0x0, 0x10, 0x0, + 0x4f, 0x76, 0x6d, 0x3d, 0x86, 0x6d, 0x30, 0xb, + 0x24, 0x80, 0x5, 0x60, 0x87, 0x0, 0x6, 0x30, + 0x49, 0x70, 0x70, 0x0, 0xb7, 0x1, 0x41, 0x1b, + 0x52, 0x70, 0x20, 0x5, 0x30, 0x2, 0x65, 0xc6, + 0x55, 0x1d, 0x66, 0xd3, 0x0, 0xa, 0x6c, 0x66, + 0xc1, 0xb0, 0xb, 0x0, 0x0, 0xc0, 0xa1, 0xb, + 0xb, 0x0, 0xb0, 0x0, 0xc, 0x6c, 0x66, 0xb0, + 0xb0, 0xb, 0x0, 0x0, 0xc0, 0xa1, 0xb, 0xb, + 0x0, 0xc0, 0x0, 0xb, 0x6c, 0x66, 0x90, 0xb3, + 0x8c, 0x0, 0x4, 0x66, 0xc6, 0x6b, 0x2b, 0x0, + 0x3, 0x0, 0x11, 0xa, 0x10, 0x0, 0xb0, 0x0, + 0x70, 0x0, 0x0, 0xb2, 0x0, 0xc, 0xbb, 0xbe, + 0x40, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7C21 "ç°¡" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa6, 0x0, 0x0, 0xf4, 0x0, 0x10, 0x0, + 0x2e, 0x76, 0x7b, 0x6d, 0x76, 0x6c, 0x60, 0xa, + 0x23, 0xa0, 0x9, 0x4, 0xb2, 0x0, 0x6, 0x20, + 0x8, 0x23, 0x0, 0x5, 0x51, 0x0, 0xc, 0x66, + 0x6c, 0x19, 0x76, 0x67, 0xd0, 0x0, 0xd0, 0x0, + 0xb0, 0x92, 0x0, 0x1b, 0x0, 0xd, 0x66, 0x6c, + 0x9, 0x76, 0x66, 0xb0, 0x0, 0xd6, 0x66, 0xc0, + 0xa7, 0x66, 0x6b, 0x0, 0xd, 0x0, 0x21, 0x2, + 0x5, 0x1, 0xb0, 0x0, 0xd0, 0xd, 0x66, 0x66, + 0xe1, 0x1b, 0x0, 0xd, 0x0, 0xc6, 0x66, 0x6d, + 0x1, 0xb0, 0x0, 0xd0, 0xc, 0x0, 0x1, 0xd0, + 0x1b, 0x0, 0xd, 0x0, 0xb6, 0x66, 0x6a, 0x1, + 0xb0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x26, 0xaa, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, + + /* U+7C73 "ç±³" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x0, 0xc, 0x20, 0xa, 0x90, 0x0, + 0x0, 0x5, 0xb0, 0xc, 0x20, 0x2e, 0x20, 0x0, + 0x0, 0x0, 0xe6, 0xc, 0x20, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x74, 0xc, 0x25, 0x50, 0x1, 0x0, + 0x5, 0x66, 0x66, 0x6d, 0x7a, 0x66, 0x6f, 0x50, + 0x1, 0x0, 0x0, 0xcf, 0x71, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xbc, 0x38, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x1c, 0x27, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xc4, 0xc, 0x20, 0xc4, 0x0, 0x0, + 0x0, 0xa, 0x50, 0xc, 0x20, 0x2e, 0x80, 0x0, + 0x0, 0x93, 0x0, 0xc, 0x20, 0x2, 0xee, 0x70, + 0x16, 0x10, 0x0, 0xc, 0x20, 0x0, 0x1a, 0x20, + 0x10, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, + + /* U+7CBE "ç²¾" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x50, 0x0, 0x0, 0xd2, 0x0, 0x0, + 0x1, 0xa, 0x22, 0x10, 0x0, 0xd0, 0x5, 0x10, + 0x7, 0x3a, 0x29, 0x64, 0x76, 0xe6, 0x66, 0x30, + 0x1, 0xda, 0x38, 0x0, 0x0, 0xd0, 0x5, 0x0, + 0x0, 0x4a, 0x51, 0x1, 0x76, 0xe6, 0x65, 0x0, + 0x18, 0x6d, 0x7a, 0x60, 0x0, 0xd0, 0x2, 0x50, + 0x0, 0xf, 0x20, 0x7, 0x66, 0x66, 0x66, 0x50, + 0x0, 0x5f, 0x95, 0x1, 0xa6, 0x66, 0x7b, 0x0, + 0x0, 0xac, 0x2e, 0x21, 0xc0, 0x0, 0x3a, 0x0, + 0x2, 0x8a, 0x23, 0x1, 0xd6, 0x66, 0x7a, 0x0, + 0x8, 0x1a, 0x20, 0x1, 0xc0, 0x0, 0x3a, 0x0, + 0x23, 0xa, 0x20, 0x1, 0xd6, 0x66, 0x7a, 0x0, + 0x10, 0xa, 0x20, 0x1, 0xc0, 0x0, 0x3a, 0x0, + 0x0, 0xb, 0x30, 0x1, 0xc0, 0x17, 0x99, 0x0, + 0x0, 0x5, 0x0, 0x1, 0x60, 0x0, 0x92, 0x0, + + /* U+7CD6 "ç³–" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x30, 0x0, 0x1, 0xb3, 0x0, 0x0, + 0x1, 0xc, 0x13, 0x3, 0x0, 0x34, 0x3, 0x60, + 0x8, 0x1c, 0x1d, 0x4e, 0x66, 0xb8, 0x66, 0x50, + 0x5, 0x8c, 0x66, 0xd, 0x0, 0xb1, 0x3, 0x0, + 0x2, 0x4c, 0x60, 0xd, 0x37, 0xd7, 0x6e, 0x0, + 0x6, 0x6d, 0x6b, 0x6d, 0x0, 0xb1, 0xd, 0x40, + 0x1, 0xf, 0x10, 0xc, 0x66, 0xd7, 0x6e, 0x61, + 0x0, 0x4f, 0x81, 0xc, 0x0, 0xb1, 0xd, 0x0, + 0x0, 0x9e, 0x4d, 0x1b, 0x37, 0xd7, 0x6c, 0x0, + 0x1, 0x9c, 0x16, 0x39, 0x10, 0x81, 0x3, 0x0, + 0x7, 0x1c, 0x10, 0x65, 0x87, 0x66, 0x6e, 0x10, + 0x14, 0xc, 0x10, 0xa0, 0x82, 0x0, 0xd, 0x0, + 0x0, 0xc, 0x12, 0x60, 0x82, 0x0, 0xd, 0x0, + 0x0, 0xc, 0x17, 0x0, 0x87, 0x66, 0x6e, 0x0, + 0x0, 0x5, 0x10, 0x0, 0x30, 0x0, 0x2, 0x0, + + /* U+7CFB "ç³»" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x47, 0xcf, 0x30, 0x0, + 0x14, 0x56, 0x7b, 0xa6, 0x42, 0x10, 0x0, 0x0, + 0x0, 0x2, 0xd7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xa1, 0x0, 0xb, 0x30, 0x0, 0x0, 0x28, + 0x93, 0x34, 0x5c, 0x71, 0x0, 0x0, 0x3, 0xe9, + 0x64, 0xa9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x92, 0x1, 0x61, 0x0, 0x0, 0x0, 0x6a, 0x40, + 0x0, 0x15, 0xe6, 0x0, 0x0, 0xdf, 0xa8, 0x8e, + 0x54, 0x35, 0xf0, 0x0, 0x2, 0x3, 0x0, 0xe0, + 0x10, 0x4, 0x0, 0x0, 0x2, 0xf5, 0xe, 0x5, + 0x82, 0x0, 0x0, 0x2, 0xc4, 0x0, 0xe0, 0x3, + 0xe9, 0x0, 0x4, 0x91, 0x12, 0x1e, 0x0, 0x2, + 0xf5, 0x5, 0x30, 0x0, 0x4e, 0xc0, 0x0, 0x5, + 0x30, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + + /* U+7D00 "ç´€" */ + 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x90, 0x4, 0x76, 0x66, 0x6e, 0x20, + 0x0, 0x1a, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x91, 0xa, 0x50, 0x0, 0x0, 0xe, 0x0, + 0xa, 0xa7, 0x7b, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x4, 0x41, 0xa1, 0x0, 0x86, 0x66, 0x6e, 0x0, + 0x0, 0xa, 0x15, 0x30, 0xe0, 0x0, 0x8, 0x0, + 0x2, 0xa2, 0x15, 0xe0, 0xe0, 0x0, 0x0, 0x0, + 0xa, 0xe9, 0x62, 0xc1, 0xe0, 0x0, 0x0, 0x0, + 0x2, 0x20, 0x2, 0x10, 0xe0, 0x0, 0x0, 0x0, + 0x1, 0x16, 0x12, 0xa0, 0xe0, 0x0, 0x0, 0x30, + 0x6, 0x24, 0xa0, 0xd4, 0xe0, 0x0, 0x0, 0x60, + 0xc, 0x31, 0xe0, 0x61, 0xd1, 0x0, 0x2, 0xa0, + 0x19, 0x0, 0x20, 0x0, 0x8e, 0xdd, 0xde, 0xc0, + + /* U+7D04 "ç´„" */ + 0x0, 0x0, 0x81, 0x0, 0x4, 0x80, 0x0, 0x0, + 0x0, 0x2c, 0x10, 0x0, 0x99, 0x0, 0x0, 0x0, + 0xa, 0x10, 0x0, 0xd, 0x10, 0x0, 0x0, 0x8, + 0x40, 0x87, 0x4, 0xc6, 0x66, 0xb9, 0x8, 0xb7, + 0x6d, 0x10, 0x91, 0x0, 0x8, 0x50, 0x47, 0x2a, + 0x20, 0x44, 0x0, 0x0, 0x94, 0x0, 0x9, 0x34, + 0x41, 0x10, 0x0, 0xa, 0x30, 0x1a, 0x30, 0x1e, + 0x10, 0xb5, 0x0, 0xb3, 0x9, 0xea, 0x85, 0xa4, + 0x2, 0xf4, 0xb, 0x20, 0x12, 0x0, 0x3, 0x0, + 0x7, 0x20, 0xc1, 0x0, 0x33, 0x30, 0xa1, 0x0, + 0x0, 0xd, 0x0, 0x45, 0xd, 0x6, 0xa0, 0x0, + 0x0, 0xe0, 0xc, 0x50, 0xd2, 0x29, 0x0, 0x0, + 0x2c, 0x0, 0xa1, 0x3, 0x0, 0x0, 0x5, 0xcf, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, + 0x0, + + /* U+7D19 "ç´™" */ + 0x0, 0x3, 0x70, 0x0, 0x0, 0x0, 0x34, 0x0, + 0x0, 0xb5, 0x0, 0x30, 0x36, 0xbb, 0x70, 0x0, + 0x57, 0x0, 0xa, 0x64, 0xb2, 0x0, 0x0, 0x29, + 0x0, 0xc2, 0xa1, 0xa, 0x20, 0x0, 0x1e, 0x87, + 0xa8, 0xa, 0x10, 0xa2, 0x0, 0x0, 0x73, 0x49, + 0x0, 0xa1, 0x9, 0x20, 0x50, 0x0, 0x39, 0x7, + 0xa, 0x66, 0xb8, 0x68, 0x40, 0x59, 0x1, 0xa6, + 0xa1, 0x6, 0x60, 0x0, 0xe, 0xc9, 0x66, 0xaa, + 0x10, 0x39, 0x0, 0x0, 0x20, 0x0, 0x11, 0xa1, + 0x0, 0xd0, 0x0, 0x3, 0x5, 0xa, 0x2a, 0x10, + 0xb, 0x30, 0x40, 0x90, 0xb2, 0x4a, 0xa1, 0x11, + 0x3c, 0x8, 0x2d, 0x9, 0x50, 0x2b, 0x85, 0x0, + 0x8d, 0x95, 0x70, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x7a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+7D20 "ç´ " */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, 0x3, + 0x66, 0x66, 0x8c, 0x66, 0x68, 0xc0, 0x0, 0x0, + 0x0, 0x3, 0xa0, 0x0, 0x10, 0x0, 0x0, 0x28, + 0x66, 0x8c, 0x66, 0x88, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xa0, 0x0, 0x1, 0x60, 0x67, 0x66, 0x6d, + 0xa6, 0x66, 0x66, 0x67, 0x10, 0x0, 0x29, 0x60, + 0x7, 0xc0, 0x0, 0x0, 0x0, 0x2f, 0x97, 0x6c, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x20, 0x69, 0x20, + 0x57, 0x0, 0x0, 0x0, 0x38, 0xc7, 0x56, 0x76, + 0xac, 0x0, 0x0, 0x8, 0xc8, 0x55, 0xa0, 0x0, + 0xa0, 0x0, 0x0, 0x5, 0xd1, 0x3a, 0x17, 0x50, + 0x0, 0x0, 0x5, 0xb2, 0x3, 0xa0, 0x6, 0xe5, + 0x0, 0x17, 0x40, 0x39, 0xe9, 0x0, 0x4, 0xe0, + 0x1, 0x0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x0, + + /* U+7D30 "ç´°" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x30, 0x8, 0x66, 0x66, 0x6c, 0x30, 0x7, + 0x50, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x3, 0x80, + 0xd, 0x1d, 0x0, 0xd0, 0xd, 0x2, 0xe7, 0x7a, + 0x70, 0xd0, 0xd, 0x0, 0xd0, 0x8, 0x35, 0x80, + 0xd, 0x0, 0xd0, 0xd, 0x0, 0x3, 0x92, 0x40, + 0xd0, 0xd, 0x0, 0xd0, 0x4, 0xa0, 0xc, 0x2d, + 0x66, 0xe6, 0x6e, 0x1, 0xfb, 0x97, 0xa7, 0xd0, + 0xd, 0x0, 0xd0, 0x4, 0x0, 0x2, 0x1d, 0x0, + 0xd0, 0xd, 0x0, 0x20, 0x50, 0xa0, 0xd0, 0xd, + 0x0, 0xd0, 0x9, 0xb, 0x27, 0x9d, 0x0, 0xd0, + 0xd, 0x1, 0xd0, 0x87, 0x15, 0xd6, 0x6c, 0x66, + 0xe0, 0x48, 0x1, 0x0, 0xd, 0x0, 0x0, 0xc, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x20, + + /* U+7D39 "ç´¹" */ + 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x4c, 0x10, 0x56, 0x88, 0x66, 0xc7, 0x0, + 0xb, 0x10, 0x0, 0x9, 0x50, 0xc, 0x20, 0x8, + 0x20, 0x75, 0x0, 0xb2, 0x0, 0xd0, 0x9, 0x95, + 0x5d, 0x20, 0x1d, 0x0, 0xe, 0x0, 0x78, 0x3b, + 0x20, 0x7, 0x60, 0x1, 0xd0, 0x0, 0x9, 0x36, + 0x1, 0x90, 0x17, 0xaa, 0x0, 0xa, 0x30, 0x59, + 0x60, 0x0, 0x9, 0x30, 0xb, 0xd9, 0x86, 0xd0, + 0xc6, 0x66, 0x6d, 0x40, 0x22, 0x0, 0x32, 0xd, + 0x0, 0x0, 0xc1, 0x0, 0x34, 0x22, 0xb0, 0xd0, + 0x0, 0xc, 0x10, 0x26, 0x1d, 0xb, 0x5d, 0x0, + 0x0, 0xc1, 0xa, 0x60, 0xd0, 0x21, 0xe6, 0x66, + 0x6d, 0x10, 0x91, 0x0, 0x0, 0xc, 0x0, 0x0, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+7D42 "終" */ + 0x0, 0x0, 0x80, 0x0, 0xb, 0x30, 0x0, 0x0, + 0x0, 0x7, 0x90, 0x0, 0x3d, 0x0, 0x2, 0x0, + 0x0, 0x1b, 0x0, 0x0, 0xa7, 0x66, 0x8e, 0x10, + 0x0, 0x91, 0xa, 0x43, 0x95, 0x0, 0xa5, 0x0, + 0xa, 0xa7, 0x7b, 0x16, 0x8, 0x3, 0xb0, 0x0, + 0x5, 0x52, 0xa0, 0x0, 0x2, 0xac, 0x10, 0x0, + 0x0, 0xa, 0x16, 0x10, 0x0, 0xda, 0x0, 0x0, + 0x1, 0xa2, 0x4, 0xb0, 0xa, 0x48, 0xc3, 0x0, + 0xa, 0xd9, 0x74, 0xb3, 0x72, 0x40, 0x6f, 0xb2, + 0x2, 0x10, 0x3, 0x32, 0x0, 0x6d, 0x11, 0x10, + 0x2, 0x16, 0x6, 0x60, 0x0, 0x9, 0x20, 0x0, + 0x6, 0x25, 0x80, 0xf0, 0x28, 0x61, 0x0, 0x0, + 0xd, 0x23, 0xb0, 0x30, 0x0, 0x5e, 0x80, 0x0, + 0x1a, 0x0, 0x0, 0x0, 0x0, 0x2, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, + + /* U+7D44 "組" */ + 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x7, 0x90, 0x0, 0xd6, 0x66, 0x7e, 0x10, + 0x0, 0x1b, 0x0, 0x0, 0xe0, 0x0, 0x1c, 0x0, + 0x0, 0xa1, 0x9, 0x40, 0xe0, 0x0, 0x1c, 0x0, + 0xb, 0x97, 0x7c, 0x0, 0xe0, 0x0, 0x1c, 0x0, + 0x6, 0x52, 0xb0, 0x0, 0xe6, 0x66, 0x6c, 0x0, + 0x0, 0x1a, 0x16, 0x20, 0xe0, 0x0, 0x1c, 0x0, + 0x2, 0xb1, 0x3, 0xd0, 0xe0, 0x0, 0x1c, 0x0, + 0xc, 0xd9, 0x74, 0xd1, 0xe0, 0x0, 0x1c, 0x0, + 0x2, 0x10, 0x3, 0x20, 0xe6, 0x66, 0x6c, 0x0, + 0x1, 0x25, 0x15, 0x80, 0xe0, 0x0, 0x1c, 0x0, + 0x4, 0x43, 0xa0, 0xe0, 0xe0, 0x0, 0x1c, 0x0, + 0xb, 0x41, 0xd0, 0x20, 0xe0, 0x0, 0x1c, 0x10, + 0xa, 0x0, 0x1, 0x66, 0xe6, 0x66, 0x6e, 0xe3, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+7D4C "経" */ + 0x0, 0x2, 0x70, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0x9, 0x60, 0x17, 0xa6, 0x66, 0x8f, 0x20, + 0x0, 0x2a, 0x0, 0x0, 0x62, 0x0, 0xb6, 0x0, + 0x0, 0x90, 0xa, 0x10, 0xa, 0x6, 0xa0, 0x0, + 0xa, 0x85, 0x79, 0x0, 0x5, 0xbb, 0x0, 0x0, + 0x7, 0x75, 0xb0, 0x0, 0x6, 0xdb, 0x10, 0x0, + 0x0, 0xa, 0x15, 0x0, 0x87, 0x5, 0xeb, 0x71, + 0x0, 0xa2, 0x7, 0x66, 0x10, 0xb4, 0x7, 0x30, + 0xb, 0xb9, 0x78, 0xa0, 0x0, 0xb2, 0x1, 0x0, + 0x4, 0x40, 0x1, 0x34, 0x76, 0xd7, 0x6b, 0x20, + 0x1, 0x15, 0x8, 0x30, 0x0, 0xb2, 0x0, 0x0, + 0x7, 0x25, 0x72, 0xd0, 0x0, 0xb2, 0x0, 0x0, + 0x1e, 0x13, 0xb0, 0x80, 0x0, 0xb2, 0x2, 0x70, + 0x18, 0x0, 0x10, 0x57, 0x66, 0x66, 0x66, 0x50, + + /* U+7D50 "çµ" */ + 0x0, 0x1, 0x70, 0x0, 0x0, 0x93, 0x0, 0x0, + 0x0, 0x8, 0x80, 0x0, 0x0, 0xa2, 0x0, 0x0, + 0x0, 0x2a, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, + 0x0, 0xa0, 0xa, 0x35, 0x66, 0xc7, 0x67, 0xc1, + 0xc, 0x86, 0x7b, 0x0, 0x0, 0xa2, 0x0, 0x0, + 0x7, 0x43, 0xa0, 0x0, 0x0, 0xa2, 0x0, 0x0, + 0x0, 0x2a, 0x6, 0x11, 0x66, 0xc7, 0x6c, 0x20, + 0x4, 0xa0, 0x16, 0xc0, 0x10, 0x0, 0x0, 0x0, + 0xd, 0xc9, 0x63, 0xd0, 0x96, 0x66, 0x6b, 0x10, + 0x1, 0x0, 0x4, 0x10, 0xd0, 0x0, 0xd, 0x0, + 0x2, 0x16, 0x23, 0xa0, 0xd0, 0x0, 0xd, 0x0, + 0x6, 0x33, 0xb0, 0xd2, 0xd0, 0x0, 0xd, 0x0, + 0xd, 0x21, 0xc0, 0x20, 0xe6, 0x66, 0x6d, 0x0, + 0x18, 0x0, 0x0, 0x0, 0xd0, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + + /* U+7D61 "絡" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x30, 0x0, 0xd, 0x40, 0x0, 0x0, + 0x0, 0xa, 0x60, 0x0, 0x4c, 0x0, 0x0, 0x0, + 0x0, 0x29, 0x0, 0x0, 0xa8, 0x66, 0x6e, 0x20, + 0x0, 0x90, 0x9, 0x2, 0xc0, 0x0, 0x7a, 0x0, + 0xa, 0x63, 0x7a, 0x8, 0x18, 0x3, 0xc0, 0x0, + 0xa, 0x86, 0xb0, 0x31, 0x3, 0x9c, 0x10, 0x0, + 0x0, 0xa, 0x14, 0x0, 0x2, 0xcb, 0x10, 0x0, + 0x0, 0xa2, 0xa, 0x20, 0x59, 0x13, 0xd8, 0x30, + 0xc, 0xa8, 0x79, 0xa6, 0x40, 0x0, 0x19, 0xa2, + 0x7, 0x50, 0x2, 0x40, 0xe6, 0x66, 0x8c, 0x0, + 0x0, 0x12, 0x5, 0x0, 0xd0, 0x0, 0x2a, 0x0, + 0x2, 0x57, 0x27, 0x70, 0xd0, 0x0, 0x2a, 0x0, + 0x9, 0x45, 0x92, 0xa0, 0xd0, 0x0, 0x2a, 0x0, + 0x1e, 0x13, 0x50, 0x0, 0xe6, 0x66, 0x7b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x12, 0x0, + + /* U+7D66 "給" */ + 0x0, 0x0, 0x70, 0x0, 0x0, 0x84, 0x0, 0x0, + 0x0, 0x4, 0xb0, 0x0, 0x0, 0xf8, 0x0, 0x0, + 0x0, 0xb, 0x10, 0x0, 0x7, 0x86, 0x10, 0x0, + 0x0, 0x73, 0x9, 0x30, 0xc, 0x10, 0xa0, 0x0, + 0x5, 0xb6, 0x6b, 0x0, 0x93, 0x0, 0x5a, 0x0, + 0x3, 0x83, 0xb1, 0x6, 0x40, 0x0, 0x29, 0xd5, + 0x0, 0x8, 0x26, 0x43, 0x76, 0x66, 0xa4, 0x70, + 0x0, 0x94, 0x4, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xea, 0x85, 0xd2, 0x96, 0x66, 0x6c, 0x10, + 0x0, 0x30, 0x2, 0x21, 0xb0, 0x0, 0xd, 0x0, + 0x0, 0x42, 0x56, 0x61, 0xb0, 0x0, 0xd, 0x0, + 0x4, 0x60, 0xd1, 0xf2, 0xb0, 0x0, 0xd, 0x0, + 0xd, 0x40, 0xd0, 0x42, 0xd6, 0x66, 0x6d, 0x0, + 0x5, 0x0, 0x0, 0x2, 0xb0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + + /* U+7D71 "çµ±" */ + 0x0, 0x5, 0x50, 0x0, 0x8, 0x40, 0x0, 0x0, + 0x0, 0xc, 0x30, 0x0, 0x1, 0xf1, 0x0, 0x0, + 0x0, 0x75, 0x0, 0x36, 0x66, 0x96, 0x6c, 0x70, + 0x2, 0x80, 0x1c, 0x11, 0xb, 0x40, 0x0, 0x0, + 0x2e, 0x76, 0xb6, 0x0, 0x78, 0x2, 0x40, 0x0, + 0x8, 0x36, 0x70, 0x6, 0x60, 0x0, 0x96, 0x0, + 0x0, 0x38, 0x7, 0x2e, 0x97, 0x54, 0x4f, 0x0, + 0x5, 0x90, 0xa, 0x61, 0x62, 0x6, 0x14, 0x0, + 0x1f, 0xb9, 0x77, 0xa0, 0xb3, 0xd, 0x0, 0x0, + 0x3, 0x0, 0x5, 0x10, 0xc1, 0xd, 0x0, 0x0, + 0x4, 0x8, 0x8, 0x60, 0xd0, 0xd, 0x0, 0x10, + 0xa, 0xb, 0x22, 0xb3, 0xa0, 0xd, 0x0, 0x50, + 0x4c, 0x7, 0x10, 0x1b, 0x20, 0xd, 0x0, 0x80, + 0x11, 0x0, 0x3, 0x82, 0x0, 0x9, 0xdd, 0xc0, + 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7D75 "çµµ" */ + 0x0, 0x4, 0x30, 0x0, 0x1, 0x90, 0x0, 0x0, + 0x0, 0xc, 0x50, 0x0, 0x7, 0xe1, 0x0, 0x0, + 0x0, 0x58, 0x0, 0x0, 0xd, 0x28, 0x0, 0x0, + 0x1, 0x90, 0xa, 0x0, 0x86, 0x5, 0x80, 0x0, + 0x1c, 0x55, 0x98, 0x4, 0x80, 0x0, 0x99, 0x0, + 0xa, 0x56, 0x90, 0x46, 0x0, 0x2, 0x6a, 0xd2, + 0x0, 0x39, 0x6, 0x20, 0x76, 0x66, 0x50, 0x10, + 0x4, 0x90, 0x9, 0x50, 0x0, 0x0, 0x2, 0x0, + 0x1f, 0xb9, 0x77, 0xa7, 0x67, 0x66, 0x6a, 0x40, + 0x4, 0x0, 0x2, 0x10, 0x9, 0x90, 0x0, 0x0, + 0x2, 0x7, 0xa, 0x30, 0x3c, 0x0, 0x10, 0x0, + 0x8, 0x8, 0x64, 0xc0, 0xb1, 0x0, 0x82, 0x0, + 0xd, 0x5, 0x70, 0x5a, 0x53, 0x45, 0x7e, 0x10, + 0x16, 0x0, 0x0, 0xc, 0x95, 0x31, 0xa, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7D93 "ç¶“" */ + 0x0, 0x7, 0x20, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0xc, 0x10, 0x47, 0x66, 0x66, 0x6a, 0x60, + 0x0, 0x74, 0x0, 0x3, 0x50, 0x92, 0x28, 0x0, + 0x1, 0x80, 0x46, 0x9, 0x62, 0xc0, 0x96, 0x0, + 0x1b, 0x44, 0xb3, 0x29, 0x9, 0x13, 0x70, 0x0, + 0xa, 0x58, 0x60, 0x53, 0x8, 0x5, 0x60, 0x0, + 0x0, 0x29, 0x21, 0xc, 0x33, 0xc0, 0xa7, 0x0, + 0x1, 0xa0, 0xb, 0x6, 0x90, 0xc1, 0x19, 0x0, + 0xe, 0x99, 0x8d, 0x30, 0x10, 0x0, 0x3, 0x0, + 0x8, 0x40, 0x4, 0x17, 0x66, 0xb6, 0x68, 0x30, + 0x1, 0x4, 0x9, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x6, 0x28, 0x36, 0x90, 0x0, 0xd0, 0x0, 0x0, + 0xc, 0x26, 0x81, 0x50, 0x0, 0xd0, 0x0, 0x10, + 0x1b, 0x1, 0x10, 0x46, 0x66, 0xe6, 0x6a, 0xc0, + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, + + /* U+7D9A "ç¶š" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x30, 0x0, 0x0, 0xb2, 0x0, 0x0, + 0x0, 0xb, 0x40, 0x0, 0x0, 0xd0, 0x1, 0x10, + 0x0, 0x38, 0x0, 0x18, 0x66, 0xe6, 0x69, 0x80, + 0x0, 0x90, 0x18, 0x0, 0x0, 0xd0, 0x1, 0x0, + 0x9, 0x74, 0x95, 0x0, 0x76, 0xb6, 0x7a, 0x0, + 0x8, 0x66, 0x80, 0x2, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x9, 0x13, 0xa, 0x66, 0x66, 0x67, 0xe1, + 0x0, 0x91, 0xb, 0x4a, 0x23, 0x2, 0x7, 0x40, + 0xa, 0xb9, 0x7b, 0x51, 0x4c, 0xd, 0x22, 0x0, + 0x5, 0x50, 0x3, 0x10, 0x58, 0xd, 0x10, 0x0, + 0x1, 0x4, 0x8, 0x20, 0x75, 0xc, 0x10, 0x20, + 0x5, 0x26, 0x44, 0xb0, 0xb1, 0xc, 0x10, 0x50, + 0xa, 0x33, 0xa0, 0x66, 0x60, 0xc, 0x10, 0xa0, + 0x9, 0x0, 0x21, 0x75, 0x0, 0xa, 0xdc, 0xe1, + 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7DAD "ç¶­" */ + 0x0, 0x8, 0x10, 0x0, 0x67, 0x43, 0x0, 0x0, + 0x0, 0x2c, 0x0, 0x0, 0xa5, 0xe, 0x30, 0x0, + 0x0, 0x92, 0x0, 0x0, 0xe0, 0x6, 0x31, 0x20, + 0x4, 0x50, 0x76, 0x5, 0xd6, 0x6a, 0x68, 0x80, + 0x2c, 0x66, 0xd2, 0xb, 0xb0, 0x1c, 0x0, 0x0, + 0x8, 0x2a, 0x30, 0x46, 0xb0, 0x1c, 0x1, 0x0, + 0x0, 0x56, 0x42, 0x52, 0xc6, 0x6d, 0x6b, 0x50, + 0x5, 0x80, 0x1d, 0x2, 0xb0, 0x1c, 0x0, 0x0, + 0x2f, 0xa8, 0x6c, 0x32, 0xb0, 0x1c, 0x0, 0x0, + 0x5, 0x0, 0x12, 0x2, 0xc6, 0x6d, 0x6b, 0x50, + 0x3, 0x14, 0x1a, 0x12, 0xb0, 0x1c, 0x0, 0x0, + 0x8, 0xc, 0x18, 0x92, 0xb0, 0x1c, 0x0, 0x0, + 0x4b, 0xb, 0x31, 0x32, 0xb0, 0x1c, 0x3, 0x70, + 0x64, 0x1, 0x0, 0x2, 0xc6, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, + + /* U+7DB2 "ç¶²" */ + 0x0, 0x5, 0x10, 0x1, 0x0, 0x0, 0x0, 0x30, + 0x0, 0xc, 0x20, 0x1d, 0x66, 0x66, 0x76, 0xf2, + 0x0, 0x65, 0x0, 0x1b, 0x17, 0x1, 0xe1, 0xd0, + 0x1, 0x80, 0x48, 0x1b, 0x7, 0x77, 0x30, 0xd0, + 0xd, 0x76, 0xc2, 0x1b, 0x56, 0x8a, 0xa6, 0xd0, + 0x6, 0x27, 0x50, 0x1b, 0x13, 0x30, 0x0, 0xd0, + 0x0, 0x47, 0x24, 0x1b, 0x0, 0xc5, 0x0, 0xd0, + 0x4, 0x90, 0x1d, 0x3c, 0x56, 0x98, 0xb7, 0xd0, + 0xe, 0xc9, 0x6a, 0x5b, 0x1d, 0x0, 0x0, 0xd0, + 0x3, 0x0, 0x11, 0x1b, 0xd, 0x0, 0x0, 0xd0, + 0x4, 0x7, 0x29, 0x1b, 0x2e, 0x66, 0xc2, 0xd0, + 0x9, 0xc, 0xc, 0x5b, 0x3, 0x0, 0x0, 0xd0, + 0x3d, 0xb, 0x23, 0x2b, 0x0, 0x1, 0x11, 0xd0, + 0x34, 0x0, 0x0, 0x1b, 0x0, 0x1, 0x6f, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+7DD1 "ç·‘" */ + 0x0, 0x5, 0x20, 0x0, 0x0, 0x0, 0x50, 0x0, + 0x0, 0xc, 0x20, 0x7, 0x66, 0x66, 0xe2, 0x0, + 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x2, 0x80, 0x48, 0x3, 0x76, 0x66, 0xe0, 0x0, + 0xd, 0x76, 0xb2, 0x0, 0x0, 0x0, 0xe1, 0x20, + 0x7, 0x27, 0x40, 0x37, 0x66, 0xa6, 0xa8, 0x90, + 0x0, 0x47, 0x24, 0x0, 0x0, 0xe2, 0x5, 0x0, + 0x4, 0x80, 0x1d, 0x2a, 0x30, 0xe4, 0x5b, 0x20, + 0xe, 0xb8, 0x5a, 0x43, 0xd0, 0xe7, 0x40, 0x0, + 0x2, 0x1, 0x33, 0x0, 0x35, 0xe4, 0x30, 0x0, + 0x4, 0x19, 0xd, 0x10, 0x83, 0xe0, 0xa0, 0x0, + 0xa, 0xb, 0x37, 0x7b, 0x20, 0xe0, 0x4c, 0x10, + 0x4d, 0x6, 0x20, 0x81, 0x0, 0xe0, 0x8, 0xb1, + 0x12, 0x0, 0x0, 0x0, 0x6d, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, + + /* U+7DD2 "ç·’" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x20, 0x0, 0x6, 0x60, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x6, 0x60, 0x9, 0x20, + 0x0, 0x73, 0x0, 0x5, 0x69, 0x9b, 0x7b, 0x0, + 0x2, 0x70, 0x58, 0x2, 0x5, 0x60, 0xc2, 0x0, + 0x1d, 0x66, 0xc2, 0x0, 0x5, 0x66, 0x80, 0x10, + 0x9, 0x48, 0x50, 0x76, 0x68, 0xae, 0x67, 0xc1, + 0x0, 0x37, 0x23, 0x0, 0x2, 0xb1, 0x0, 0x0, + 0x3, 0x90, 0xc, 0x10, 0x3b, 0x10, 0x4, 0x0, + 0xe, 0xb8, 0x7b, 0x55, 0xc6, 0x66, 0x6d, 0x0, + 0x4, 0x10, 0x2, 0x67, 0xa0, 0x0, 0xb, 0x0, + 0x3, 0x5, 0x38, 0x1, 0xc6, 0x66, 0x6b, 0x0, + 0x9, 0xc, 0xd, 0x21, 0xa0, 0x0, 0xb, 0x0, + 0x1d, 0xb, 0x36, 0x22, 0xa0, 0x0, 0xb, 0x0, + 0x35, 0x2, 0x0, 0x2, 0xc6, 0x66, 0x6b, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x2, 0x0, + + /* U+7DDA "ç·š" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x0, 0x0, 0x4, 0xa0, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x2, 0x9, 0x10, 0x4, 0x0, + 0x0, 0x74, 0x0, 0xd, 0x66, 0x66, 0x6e, 0x0, + 0x2, 0x80, 0x44, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x1c, 0x44, 0xc3, 0xd, 0x66, 0x66, 0x6d, 0x0, + 0xa, 0x59, 0x50, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x38, 0x40, 0xd, 0x66, 0xa6, 0x6c, 0x0, + 0x2, 0x90, 0x48, 0x2, 0x0, 0xf0, 0x1, 0x10, + 0x1e, 0xa8, 0x7e, 0x57, 0x95, 0xd5, 0xb, 0x70, + 0x6, 0x20, 0x23, 0x0, 0xc5, 0xd8, 0x82, 0x0, + 0x4, 0x25, 0x49, 0x3, 0x90, 0xd4, 0x70, 0x0, + 0xa, 0xd, 0xd, 0xa, 0x10, 0xd0, 0xb4, 0x0, + 0x79, 0xb, 0x1, 0x82, 0x0, 0xd0, 0x1e, 0x90, + 0x31, 0x0, 0x15, 0x11, 0x7c, 0xc0, 0x3, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x20, 0x0, 0x0, + + /* U+7DE0 "ç· " */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x10, 0x0, 0x8, 0x70, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x0, 0xc2, 0x5, 0x10, + 0x0, 0x65, 0x0, 0x57, 0x66, 0x66, 0x77, 0x50, + 0x1, 0x80, 0x46, 0x0, 0xa3, 0x3, 0xd0, 0x0, + 0xb, 0x44, 0xb4, 0x0, 0x49, 0x8, 0x20, 0x0, + 0xa, 0x58, 0x60, 0x76, 0x66, 0x68, 0x66, 0xe2, + 0x0, 0x28, 0x23, 0xe0, 0x0, 0xb0, 0x4, 0x30, + 0x2, 0xa0, 0xb, 0x20, 0x0, 0xc0, 0x1, 0x0, + 0xe, 0xa8, 0x7c, 0x2a, 0x66, 0xd6, 0x6d, 0x10, + 0x6, 0x30, 0x13, 0xc, 0x0, 0xc0, 0xc, 0x0, + 0x2, 0x22, 0x38, 0xc, 0x0, 0xc0, 0xc, 0x0, + 0x8, 0xc, 0xc, 0x3c, 0x0, 0xc2, 0x3b, 0x0, + 0x2c, 0xc, 0x23, 0x9, 0x0, 0xc1, 0xa6, 0x0, + 0x45, 0x1, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, + + /* U+7DE9 "ç·©" */ + 0x0, 0x5, 0x20, 0x0, 0x0, 0x14, 0x8b, 0x10, + 0x0, 0xd, 0x40, 0x25, 0x68, 0x75, 0x63, 0x10, + 0x0, 0x58, 0x0, 0x6, 0x5, 0x60, 0x98, 0x0, + 0x1, 0x90, 0x47, 0x6, 0x70, 0xa0, 0xa0, 0x0, + 0xb, 0x55, 0xc4, 0x27, 0x76, 0x67, 0x7c, 0x30, + 0x7, 0x48, 0x60, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x38, 0x24, 0x56, 0x6d, 0x66, 0x67, 0xc1, + 0x3, 0x80, 0x1d, 0x31, 0x68, 0x0, 0x0, 0x0, + 0xe, 0xc9, 0x5a, 0x40, 0xa8, 0x66, 0x78, 0x0, + 0x2, 0x0, 0x11, 0x1, 0xc8, 0x0, 0xc5, 0x0, + 0x5, 0x8, 0x2a, 0x8, 0x42, 0x88, 0x80, 0x0, + 0xb, 0xb, 0x3c, 0x58, 0x0, 0xac, 0x0, 0x0, + 0x5b, 0x6, 0x24, 0x70, 0x7, 0x9a, 0xa1, 0x0, + 0x0, 0x0, 0x3, 0x2, 0x84, 0x0, 0x7f, 0xb2, + 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x1, 0x20, + + /* U+7DF4 "ç·´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x40, 0x0, 0x0, 0xb0, 0x0, 0x0, + 0x0, 0xc, 0x20, 0x0, 0x0, 0xc0, 0x0, 0x20, + 0x0, 0x55, 0x0, 0x57, 0x66, 0xd6, 0x67, 0x80, + 0x1, 0x80, 0x39, 0x0, 0x0, 0xc0, 0x0, 0x0, + 0xc, 0x76, 0xb3, 0xb, 0x66, 0xd6, 0x6d, 0x20, + 0x7, 0x36, 0x60, 0xc, 0x50, 0xc1, 0x9c, 0x0, + 0x0, 0x28, 0x14, 0xc, 0x49, 0xc6, 0x4c, 0x0, + 0x1, 0xa0, 0xb, 0x1c, 0x4, 0xc4, 0xc, 0x0, + 0xd, 0xb9, 0x7b, 0x5c, 0x6c, 0xe9, 0x6b, 0x0, + 0x4, 0x20, 0x3, 0x1, 0x2c, 0xc7, 0x0, 0x0, + 0x2, 0x5, 0xb, 0x10, 0xa3, 0xc2, 0x70, 0x0, + 0x7, 0x18, 0x47, 0x75, 0x60, 0xc0, 0x96, 0x0, + 0xd, 0x6, 0x81, 0x56, 0x0, 0xc0, 0xc, 0xb2, + 0x19, 0x0, 0x2, 0x40, 0x0, 0xd0, 0x1, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, + + /* U+7E3D "總" */ + 0x0, 0x5, 0x30, 0x0, 0x1, 0xc0, 0x0, 0x0, + 0x0, 0xc2, 0x0, 0x30, 0x64, 0x0, 0x40, 0x0, + 0x65, 0x0, 0xc, 0x56, 0xa5, 0x5e, 0x20, 0x18, + 0x3, 0x90, 0xc0, 0x9b, 0x68, 0xd0, 0xd, 0x87, + 0xc2, 0xc, 0x36, 0x6, 0x8d, 0x0, 0x62, 0x65, + 0x0, 0xc3, 0x39, 0xc0, 0xd0, 0x0, 0x29, 0x14, + 0xc, 0x2, 0xac, 0x6d, 0x0, 0x1a, 0x0, 0xb1, + 0xc3, 0x50, 0x5, 0xd0, 0xd, 0xa8, 0x7b, 0x5b, + 0x78, 0x77, 0x7b, 0x0, 0x42, 0x1, 0x21, 0x7, + 0x1b, 0x10, 0x20, 0x2, 0x22, 0x93, 0x41, 0xc0, + 0x69, 0x9, 0x60, 0x70, 0xc3, 0x9b, 0xc, 0x0, + 0x24, 0x1e, 0xd, 0xb, 0x5, 0xc0, 0xc0, 0x0, + 0x62, 0x14, 0x80, 0x0, 0x0, 0xd, 0xcc, 0xce, + 0x60, + + /* U+7E3E "績" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x40, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xb, 0x20, 0x36, 0x66, 0xe6, 0x6d, 0x50, + 0x0, 0x46, 0x0, 0x11, 0x0, 0xd0, 0x12, 0x0, + 0x0, 0x90, 0x28, 0x5, 0x76, 0xe6, 0x78, 0x0, + 0xa, 0x75, 0xa4, 0x22, 0x22, 0xd2, 0x25, 0x90, + 0x7, 0x56, 0x70, 0x56, 0x44, 0x44, 0x46, 0x41, + 0x0, 0x19, 0x13, 0xe, 0x66, 0x66, 0x6e, 0x30, + 0x1, 0xa1, 0xb, 0x1d, 0x66, 0x66, 0x6e, 0x0, + 0xb, 0xc9, 0x8b, 0x5d, 0x0, 0x0, 0xd, 0x0, + 0x4, 0x30, 0x2, 0xe, 0x66, 0x66, 0x6e, 0x0, + 0x1, 0x15, 0xa, 0xe, 0x66, 0x66, 0x6e, 0x0, + 0x6, 0x2a, 0x38, 0x66, 0x22, 0x2, 0x6, 0x0, + 0xd, 0x17, 0x61, 0x11, 0xd7, 0x2, 0xa7, 0x0, + 0x6, 0x0, 0x0, 0x2a, 0x30, 0x0, 0xa, 0xb0, + 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x40, + + /* U+7E54 "ç¹”" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x0, 0x6, 0x50, 0x9, 0x10, 0x0, + 0x0, 0x49, 0x0, 0x0, 0xa3, 0x2b, 0x20, 0x0, + 0x0, 0x90, 0x1, 0x96, 0x68, 0x4b, 0xb, 0x0, + 0x5, 0x30, 0x90, 0x73, 0xc, 0x2b, 0x8, 0x20, + 0x3b, 0x57, 0x90, 0x39, 0x26, 0xb, 0x0, 0x0, + 0x18, 0x3b, 0x4, 0x66, 0x96, 0x6c, 0x68, 0xb0, + 0x0, 0x82, 0x51, 0x30, 0x2, 0xa, 0x3, 0x0, + 0x6, 0x50, 0x85, 0xc6, 0x6d, 0x1a, 0xe, 0x10, + 0x3e, 0xa7, 0x79, 0xc0, 0xc, 0x9, 0x78, 0x0, + 0x5, 0x0, 0x11, 0xc6, 0x6c, 0x7, 0xe1, 0x0, + 0x2, 0x31, 0xa3, 0xc0, 0xc, 0x6, 0xb0, 0x20, + 0x9, 0x39, 0x59, 0xc0, 0xc, 0xb, 0xd0, 0x60, + 0x5b, 0xd, 0x1, 0xc6, 0x6b, 0x72, 0x6a, 0x90, + 0x43, 0x0, 0x0, 0x40, 0x6, 0x20, 0x8, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+7E70 "ç¹°" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x20, 0x2, 0x96, 0x66, 0x90, 0x0, + 0x0, 0x2b, 0x0, 0x2, 0xc0, 0x0, 0xb0, 0x0, + 0x0, 0x91, 0x0, 0x2, 0xc0, 0x0, 0xa0, 0x0, + 0x4, 0x50, 0x74, 0x2, 0xa6, 0x66, 0x70, 0x0, + 0x1e, 0x86, 0xc0, 0x66, 0x69, 0x8, 0x69, 0x20, + 0x5, 0xa, 0x20, 0x92, 0xc, 0xc, 0xb, 0x10, + 0x0, 0x65, 0x43, 0x97, 0x6c, 0xd, 0x6c, 0x10, + 0x5, 0x80, 0x2d, 0x71, 0x5, 0x28, 0x5, 0x0, + 0xf, 0xb9, 0x6c, 0x10, 0x0, 0xd0, 0x7, 0x30, + 0x4, 0x0, 0x11, 0x47, 0x6c, 0xe7, 0x66, 0x60, + 0x2, 0x32, 0x47, 0x0, 0x59, 0xb8, 0x0, 0x0, + 0x9, 0xd, 0xd, 0x3, 0x90, 0xb3, 0xb1, 0x0, + 0x59, 0xc, 0x12, 0x57, 0x0, 0xc0, 0x7e, 0x71, + 0x42, 0x0, 0x5, 0x20, 0x0, 0xc0, 0x7, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + + /* U+7E7C "ç¹¼" */ + 0x0, 0x7, 0x0, 0x50, 0x20, 0x0, 0x10, 0x0, + 0x0, 0x2c, 0x0, 0xc1, 0xb2, 0x0, 0xb1, 0x0, + 0x0, 0x92, 0x0, 0xc6, 0x36, 0x87, 0x29, 0x40, + 0x4, 0x50, 0x83, 0xc9, 0x8a, 0xa, 0x88, 0x0, + 0x1d, 0x76, 0xb0, 0xc1, 0x84, 0x11, 0x83, 0x10, + 0x7, 0x19, 0x10, 0xca, 0x86, 0x9c, 0x74, 0xa0, + 0x0, 0x74, 0x51, 0xc1, 0x0, 0x12, 0x5, 0x30, + 0x6, 0x60, 0x4b, 0xc6, 0x76, 0x66, 0x88, 0x40, + 0x1f, 0xb8, 0x4c, 0xc0, 0xa3, 0x0, 0xa2, 0x0, + 0x3, 0x0, 0x0, 0xc5, 0x45, 0x76, 0x37, 0x50, + 0x3, 0x31, 0x81, 0xc7, 0x7a, 0xa, 0x98, 0x0, + 0x9, 0x29, 0x4a, 0xc0, 0x83, 0x3, 0x72, 0x60, + 0x4b, 0xd, 0x5, 0xc9, 0x86, 0x8c, 0x75, 0x90, + 0x42, 0x0, 0x0, 0xe6, 0x66, 0x86, 0x6b, 0xb0, + 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, + + /* U+7E8C "續" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x10, 0x0, 0x0, 0xc1, 0x1, 0x0, + 0x0, 0x9, 0x70, 0x47, 0x66, 0xd6, 0x69, 0x80, + 0x0, 0x1a, 0x0, 0x3, 0x44, 0xd4, 0x59, 0x0, + 0x0, 0x91, 0x6, 0x4, 0x32, 0x22, 0x25, 0x0, + 0x7, 0x62, 0x79, 0xd, 0x6c, 0x6c, 0x6c, 0x40, + 0xa, 0x87, 0xb0, 0xc, 0xb, 0xb, 0xa, 0x10, + 0x0, 0xa, 0x13, 0xc, 0x68, 0x68, 0x6a, 0x10, + 0x0, 0x93, 0xa, 0x16, 0x76, 0x66, 0x6a, 0x0, + 0xa, 0xa8, 0x8b, 0x77, 0x60, 0x0, 0x1a, 0x0, + 0x5, 0x61, 0x2, 0x27, 0x96, 0x66, 0x7a, 0x0, + 0x1, 0x12, 0x24, 0x7, 0x95, 0x55, 0x6a, 0x0, + 0x7, 0xb, 0xc, 0x27, 0x96, 0x66, 0x7a, 0x0, + 0xd, 0xa, 0x46, 0x33, 0x8b, 0x2, 0x86, 0x0, + 0x29, 0x2, 0x0, 0x39, 0x60, 0x0, 0x9, 0xc0, + 0x0, 0x0, 0x2, 0x30, 0x0, 0x0, 0x0, 0x50, + + /* U+7EDF "统" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc3, 0x0, 0x4, 0x80, 0x0, 0x0, 0x0, + 0x4c, 0x0, 0x0, 0xc, 0x40, 0x1, 0x0, 0xb, + 0x10, 0x17, 0x66, 0x96, 0x6a, 0xb0, 0x6, 0x50, + 0x5a, 0x0, 0x6a, 0x0, 0x0, 0x4, 0xa3, 0x4d, + 0x30, 0x19, 0x2, 0x0, 0x0, 0x59, 0x4a, 0x40, + 0x8, 0x0, 0xb, 0x70, 0x0, 0x7, 0x60, 0xb, + 0x98, 0x8b, 0x6d, 0x70, 0x6, 0x70, 0x1, 0x75, + 0xf0, 0xd0, 0x24, 0x4, 0xfb, 0x86, 0x20, 0x1d, + 0xd, 0x0, 0x0, 0x6, 0x0, 0x0, 0x2, 0xb0, + 0xd0, 0x0, 0x0, 0x0, 0x3, 0x50, 0x58, 0xd, + 0x0, 0x0, 0x49, 0xb8, 0x30, 0xb, 0x30, 0xd0, + 0x6, 0x4, 0x70, 0x0, 0x7, 0x90, 0xc, 0x0, + 0x90, 0x0, 0x0, 0x18, 0x50, 0x0, 0x8d, 0xcd, + 0x20, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7F3A "缺" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x30, 0x0, 0x0, 0xd2, 0x0, 0x0, + 0x0, 0x1d, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x56, 0x0, 0x60, 0x0, 0xd0, 0x3, 0x0, + 0x0, 0xa6, 0xc6, 0x74, 0x77, 0xe6, 0x6d, 0x0, + 0x2, 0x50, 0xc0, 0x0, 0x0, 0xd0, 0x1b, 0x0, + 0x3, 0x0, 0xc0, 0x2, 0x0, 0xc0, 0x1b, 0x0, + 0x7, 0x66, 0xd6, 0x8b, 0x10, 0xc0, 0x1b, 0x0, + 0x0, 0x10, 0xc0, 0x14, 0x76, 0xd6, 0x6b, 0xa6, + 0x0, 0xd0, 0xc0, 0xa3, 0x4, 0x86, 0x0, 0x0, + 0x0, 0xc0, 0xc0, 0xb1, 0x9, 0x46, 0x10, 0x0, + 0x0, 0xc0, 0xc0, 0xb1, 0xc, 0x1, 0x90, 0x0, + 0x1, 0xd8, 0xb6, 0xc1, 0x84, 0x0, 0xa4, 0x0, + 0x0, 0xa2, 0x0, 0x36, 0x70, 0x0, 0x2e, 0x50, + 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x5, 0xd4, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7F6E "ç½®" */ + 0x0, 0x28, 0x77, 0x77, 0x77, 0x77, 0x98, 0x0, + 0x0, 0x2b, 0x0, 0xe0, 0xc, 0x10, 0x78, 0x0, + 0x0, 0x2b, 0x0, 0xe0, 0xc, 0x10, 0x78, 0x0, + 0x0, 0x3d, 0x77, 0x99, 0x79, 0x77, 0xa7, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x60, 0x0, 0x54, 0x0, + 0x0, 0x78, 0x77, 0x7d, 0x77, 0x77, 0x76, 0x0, + 0x0, 0x0, 0xa7, 0x7d, 0x77, 0x7d, 0x30, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xf7, 0x77, 0x77, 0x7e, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xf7, 0x77, 0x77, 0x7e, 0x0, 0x0, + 0x0, 0x0, 0xf7, 0x77, 0x77, 0x7e, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x10, + 0x6, 0x77, 0xf7, 0x77, 0x77, 0x7e, 0x7b, 0xd1, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7F8E "美" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x50, 0x0, 0x88, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x50, 0xb, 0x10, 0x10, 0x0, 0x27, + 0x66, 0xa7, 0x68, 0x76, 0x6e, 0x50, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x3, 0x66, + 0x66, 0xe6, 0x66, 0xb8, 0x0, 0x0, 0x2, 0x0, + 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0xb1, 0x18, 0x66, 0x66, 0x6b, + 0x66, 0x66, 0x66, 0x30, 0x0, 0x0, 0x0, 0xf2, + 0x0, 0x4, 0x0, 0x4, 0x76, 0x66, 0x8c, 0x86, + 0x66, 0x94, 0x0, 0x0, 0x0, 0xb, 0x47, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xb0, 0xa, 0x30, + 0x0, 0x0, 0x0, 0x4, 0xb1, 0x0, 0x1b, 0x93, + 0x0, 0x0, 0x48, 0x60, 0x0, 0x0, 0x7, 0xef, + 0x71, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, + + /* U+7FA9 "義" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x30, 0x1, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x90, 0x7, 0x30, 0x73, 0x0, + 0x0, 0x66, 0x66, 0x6b, 0x76, 0x66, 0x76, 0x0, + 0x0, 0x5, 0x66, 0x6c, 0x76, 0x69, 0xb0, 0x0, + 0x0, 0x1, 0x0, 0xa, 0x20, 0x0, 0x5, 0x0, + 0x3, 0x76, 0x66, 0x69, 0x66, 0x66, 0x7b, 0x30, + 0x0, 0x0, 0x0, 0x48, 0x1b, 0x27, 0x20, 0x0, + 0x0, 0x45, 0x7d, 0x86, 0x1e, 0x2, 0xe1, 0x0, + 0x0, 0x0, 0xc, 0x0, 0xc, 0x10, 0x27, 0x40, + 0x8, 0x66, 0x6d, 0x66, 0x6b, 0x96, 0x76, 0x50, + 0x0, 0x0, 0xc, 0x4, 0x6, 0x70, 0xa9, 0x0, + 0x3, 0x57, 0xae, 0x61, 0x2, 0xc6, 0xc1, 0x0, + 0x4, 0xa4, 0xc, 0x0, 0x0, 0xdb, 0x0, 0x50, + 0x0, 0x3, 0x2c, 0x0, 0x4a, 0x7c, 0x51, 0x80, + 0x0, 0x2, 0xbb, 0x26, 0x30, 0x1, 0x8d, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7FD2 "ç¿’" */ + 0x26, 0x66, 0x6b, 0x14, 0x66, 0x69, 0x70, 0x40, + 0x0, 0xe0, 0x32, 0x0, 0x86, 0x3, 0xd3, 0xd, + 0x1, 0xc7, 0x8, 0x60, 0x5, 0x40, 0xd0, 0x1, + 0x60, 0x86, 0x0, 0x16, 0x5d, 0x0, 0x27, 0x8a, + 0x64, 0xa8, 0x0, 0xe0, 0x8d, 0x40, 0x85, 0x44, + 0x0, 0x2, 0xc4, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x46, 0x0, 0x0, 0x30, 0x0, 0xc6, 0x66, 0x66, + 0x66, 0x8d, 0x0, 0xc, 0x10, 0x0, 0x0, 0x3, + 0xb0, 0x0, 0xc6, 0x66, 0x66, 0x66, 0x7b, 0x0, + 0xc, 0x10, 0x0, 0x0, 0x3, 0xb0, 0x0, 0xc1, + 0x0, 0x0, 0x0, 0x3b, 0x0, 0xd, 0x66, 0x66, + 0x66, 0x67, 0xb0, 0x0, 0x40, 0x0, 0x0, 0x0, + 0x12, 0x0, + + /* U+8001 "è€" */ + 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0x0, 0x2, 0xb1, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0x12, 0x89, 0xb1, 0x0, + 0x0, 0x27, 0x66, 0x8c, 0x55, 0x8d, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0x1, 0xd2, 0x0, 0x0, + 0x5, 0x66, 0x66, 0x8c, 0x6c, 0xa6, 0x6d, 0x80, + 0x2, 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0x40, 0x1, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xb1, 0x0, 0xad, 0x0, 0x0, + 0x0, 0x4, 0xbe, 0x10, 0x4c, 0x71, 0x0, 0x0, + 0x4, 0x86, 0xd, 0x58, 0x50, 0x0, 0x40, 0x0, + 0x12, 0x0, 0xd, 0x30, 0x0, 0x0, 0x60, 0x0, + 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, 0x95, 0x0, + 0x0, 0x0, 0x8, 0xed, 0xdd, 0xdd, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8003 "考" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x20, 0x0, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x6, 0xd0, 0x0, + 0x0, 0x5, 0x66, 0x6e, 0x6c, 0x6d, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x1, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x1c, 0x30, 0x1, 0x80, + 0x7, 0x66, 0x66, 0x67, 0xe6, 0x66, 0x66, 0x62, + 0x0, 0x0, 0x0, 0x2c, 0x20, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x5, 0xb9, 0x86, 0x66, 0x99, 0x0, + 0x0, 0x1, 0x95, 0x6, 0x70, 0x0, 0x0, 0x0, + 0x1, 0x56, 0x0, 0xd, 0x76, 0x66, 0xb3, 0x0, + 0x2, 0x0, 0x0, 0x3, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x6, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x6b, 0xae, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x72, 0x0, 0x0, + + /* U+8005 "者" */ + 0x0, 0x0, 0x0, 0x19, 0x10, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0x1, 0x5, 0xd0, 0x0, + 0x0, 0x6, 0x66, 0x6d, 0x7e, 0x4e, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0x0, 0xc5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xa, 0x60, 0x4, 0x40, + 0x6, 0x76, 0x66, 0x68, 0xc9, 0x66, 0x68, 0x80, + 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xd8, 0x66, 0x6c, 0x30, 0x0, + 0x0, 0x0, 0x7e, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x29, 0x4e, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x5, 0x40, 0xe, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x0, 0x0, 0x3, 0x0, 0x0, + + /* U+800C "而" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x2, + 0x86, 0x66, 0x66, 0x87, 0x66, 0x67, 0xc4, 0x0, + 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x70, 0x0, 0x0, 0x0, 0x0, 0x86, + 0x66, 0x96, 0x66, 0x66, 0xb3, 0x0, 0xb, 0x20, + 0x3a, 0x0, 0xd0, 0xe, 0x10, 0x0, 0xb2, 0x3, + 0xa0, 0xd, 0x0, 0xe0, 0x0, 0xb, 0x20, 0x3a, + 0x0, 0xd0, 0xe, 0x0, 0x0, 0xb2, 0x3, 0xa0, + 0xd, 0x0, 0xe0, 0x0, 0xb, 0x20, 0x3a, 0x0, + 0xd0, 0xe, 0x0, 0x0, 0xb2, 0x3, 0xa0, 0xd, + 0x0, 0xe0, 0x0, 0xb, 0x20, 0x3a, 0x0, 0xd0, + 0xe, 0x0, 0x0, 0xc2, 0x3, 0xa0, 0xd, 0x10, + 0xe0, 0x0, 0xb, 0x10, 0x12, 0x0, 0x35, 0xec, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, + + /* U+8033 "耳" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x10, + 0x4, 0x76, 0xf6, 0x66, 0x66, 0xe6, 0x66, 0x30, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xf6, 0x66, 0x66, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xf6, 0x66, 0x66, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xd1, 0x17, 0x90, + 0x2, 0x45, 0xe5, 0x55, 0x55, 0xe6, 0x43, 0x10, + 0x4, 0x20, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, + + /* U+805E "èž" */ + 0x19, 0x66, 0x68, 0x80, 0x96, 0x66, 0x7a, 0x0, + 0xc0, 0x0, 0x57, 0xd, 0x0, 0x2, 0xb0, 0xd, + 0x66, 0x69, 0x70, 0xd6, 0x66, 0x7b, 0x0, 0xc0, + 0x0, 0x57, 0xd, 0x0, 0x2, 0xb0, 0xd, 0x66, + 0x69, 0x60, 0xd6, 0x66, 0x7b, 0x0, 0xc0, 0x0, + 0x0, 0x0, 0x2, 0x2, 0xb0, 0xc, 0x6, 0x69, + 0x66, 0x78, 0xa6, 0x2b, 0x0, 0xc0, 0x1, 0xc0, + 0x5, 0x80, 0x2, 0xb0, 0xc, 0x0, 0x1d, 0x66, + 0x98, 0x0, 0x2b, 0x0, 0xc0, 0x1, 0xd6, 0x69, + 0x80, 0x2, 0xb0, 0xc, 0x0, 0x1c, 0x0, 0x58, + 0x3, 0x2b, 0x0, 0xc2, 0x35, 0xd5, 0x59, 0xb6, + 0xa5, 0xb0, 0xc, 0x12, 0x10, 0x0, 0x58, 0x12, + 0x3a, 0x1, 0xc0, 0x0, 0x0, 0x4, 0x50, 0x6f, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x0, + + /* U+806F "è¯" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x20, 0xc5, 0x0, 0x56, 0x0, + 0x7, 0xa6, 0x6b, 0x95, 0x90, 0x10, 0xa0, 0x0, + 0x0, 0xd0, 0xd, 0x18, 0x8, 0x85, 0x31, 0xd1, + 0x0, 0xd0, 0xd, 0x7a, 0xa8, 0xd, 0x7b, 0x30, + 0x0, 0xd6, 0x6d, 0x2, 0x75, 0x2, 0x53, 0x50, + 0x0, 0xd0, 0xd, 0x27, 0x19, 0x46, 0x63, 0xc2, + 0x0, 0xd0, 0xd, 0x7a, 0x55, 0x56, 0x73, 0x62, + 0x0, 0xd6, 0x6d, 0x0, 0x2, 0x90, 0xb0, 0x0, + 0x0, 0xd0, 0xd, 0xb, 0x21, 0xa0, 0xc0, 0xb0, + 0x0, 0xd0, 0xd, 0x3c, 0x1, 0xa0, 0xc0, 0xc0, + 0x16, 0xea, 0x8d, 0xc, 0x57, 0xa0, 0xc0, 0xc0, + 0xb, 0x50, 0xd, 0x7, 0x44, 0x80, 0xd6, 0x90, + 0x0, 0x0, 0xd, 0x0, 0xa, 0x20, 0xc0, 0x0, + 0x0, 0x0, 0xe, 0x3, 0x84, 0x0, 0xc0, 0x0, + 0x0, 0x0, 0x3, 0x33, 0x0, 0x0, 0x40, 0x0, + + /* U+8072 "è²" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb1, 0x1, 0x6, 0x33, 0x70, 0x0, + 0x6, 0x76, 0xd6, 0x7a, 0x1b, 0x33, 0xc0, 0x0, + 0x1, 0x33, 0xc3, 0x61, 0x37, 0x0, 0xd7, 0x91, + 0x0, 0x73, 0x33, 0x53, 0x82, 0x22, 0x56, 0x30, + 0x0, 0xd6, 0xc6, 0xd3, 0x29, 0x44, 0xc5, 0x0, + 0x0, 0xc0, 0xc0, 0xb0, 0x1, 0x9a, 0x50, 0x0, + 0x1, 0xc6, 0x66, 0x60, 0x4, 0x7a, 0x83, 0x10, + 0x5, 0x50, 0x0, 0x3, 0x41, 0x0, 0x8a, 0x90, + 0x7, 0x37, 0xa8, 0x66, 0x66, 0x6d, 0x64, 0x0, + 0x0, 0x0, 0x88, 0x66, 0x66, 0x6c, 0x0, 0x0, + 0x0, 0x0, 0x84, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0x88, 0x66, 0x66, 0x6c, 0x2, 0x40, + 0x2, 0x45, 0xa8, 0x66, 0x66, 0x6d, 0x57, 0x80, + 0x1, 0x10, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x0, 0x0, + + /* U+8077 "è·" */ + 0x0, 0x0, 0x0, 0x40, 0x80, 0x4, 0x50, 0x0, + 0x7, 0xb6, 0x6b, 0x83, 0x75, 0x45, 0x82, 0x0, + 0x0, 0xc0, 0xc, 0x37, 0x66, 0x86, 0x88, 0x40, + 0x0, 0xc0, 0xc, 0x7, 0x2, 0xc4, 0x82, 0xa0, + 0x0, 0xd6, 0x6c, 0x7, 0x56, 0x24, 0x80, 0x0, + 0x0, 0xc0, 0xc, 0x57, 0x79, 0x68, 0xb8, 0xb0, + 0x0, 0xc0, 0xc, 0x12, 0x0, 0x13, 0x83, 0x50, + 0x0, 0xd6, 0x6c, 0xd, 0x69, 0x92, 0x98, 0x70, + 0x0, 0xc0, 0xc, 0xc, 0x5, 0x70, 0xab, 0x0, + 0x0, 0xc0, 0xc, 0x1d, 0x69, 0x70, 0xca, 0x0, + 0x4, 0xd9, 0x7d, 0x2c, 0x5, 0x70, 0xb4, 0x2, + 0x9, 0x50, 0xc, 0xd, 0x69, 0x73, 0xa9, 0x32, + 0x0, 0x0, 0xc, 0x8, 0x2, 0x38, 0xa, 0xc0, + 0x0, 0x0, 0xc, 0x0, 0x1, 0x60, 0x1, 0xd1, + 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, + + /* U+807D "è½" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x40, 0x0, 0x4a, 0x0, 0x0, + 0x7, 0xb6, 0x6a, 0xaa, 0x44, 0x98, 0x47, 0xa0, + 0x0, 0xc6, 0x6b, 0x21, 0x10, 0x80, 0x1, 0x0, + 0x0, 0xc0, 0x9, 0x22, 0x96, 0xa7, 0x7b, 0x60, + 0x0, 0xc6, 0x6b, 0x21, 0xa1, 0xa5, 0x68, 0x40, + 0x0, 0xc0, 0x9, 0x21, 0xa1, 0xa5, 0x68, 0x40, + 0x7, 0xa6, 0x6b, 0x21, 0xa1, 0xa5, 0x68, 0x40, + 0x0, 0x0, 0x49, 0x22, 0xb6, 0x66, 0x69, 0x20, + 0x5, 0x8b, 0x59, 0x22, 0x22, 0x22, 0x25, 0x90, + 0x0, 0x38, 0x39, 0x23, 0x53, 0x53, 0x33, 0x30, + 0x4, 0x8b, 0x59, 0x20, 0x29, 0x4a, 0x4, 0x10, + 0x0, 0x38, 0x9, 0x24, 0x4c, 0x8, 0x14, 0xd1, + 0x8, 0x97, 0x39, 0x3e, 0xc, 0x0, 0x7, 0x71, + 0x3, 0x0, 0xa, 0x32, 0xb, 0xbb, 0xbc, 0x0, + 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8089 "肉" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa6, 0x0, 0x0, 0x0, 0x10, 0x0, 0xa, + 0x40, 0x0, 0x1, 0xd, 0x66, 0x66, 0xd7, 0x66, + 0x67, 0xf1, 0xe1, 0x0, 0xe, 0x0, 0x0, 0x1d, + 0xd, 0x10, 0x7, 0x99, 0x70, 0x1, 0xd0, 0xd1, + 0x3, 0xa0, 0x8, 0xe2, 0x1d, 0xd, 0x14, 0x70, + 0xa7, 0x9, 0x61, 0xd0, 0xd3, 0x20, 0xe, 0x20, + 0x0, 0x1d, 0xd, 0x10, 0x6, 0xb7, 0x10, 0x1, + 0xd0, 0xd1, 0x2, 0xc0, 0x1c, 0x80, 0x1d, 0xd, + 0x12, 0xa1, 0x0, 0x1e, 0x41, 0xd0, 0xe3, 0x50, + 0x0, 0x0, 0x31, 0x1d, 0xe, 0x10, 0x0, 0x0, + 0x5, 0x68, 0xd0, 0xe1, 0x0, 0x0, 0x0, 0x4, + 0xf7, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+80A9 "è‚©" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x80, 0x0, 0x0, 0x0, 0x3, + 0x0, 0x0, 0xa0, 0x0, 0x14, 0x0, 0xe, 0x66, + 0x66, 0x66, 0x66, 0x9a, 0x0, 0xe, 0x10, 0x0, + 0x0, 0x0, 0x68, 0x0, 0xd, 0x66, 0x66, 0x66, + 0x66, 0x98, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0xd, 0xc, 0x66, 0x66, 0x66, 0xe3, + 0x0, 0xd, 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, + 0xd, 0xc, 0x66, 0x66, 0x66, 0xe0, 0x0, 0x2a, + 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x75, 0xc, + 0x66, 0x66, 0x66, 0xe0, 0x0, 0xb0, 0xc, 0x10, + 0x0, 0x0, 0xe0, 0x5, 0x40, 0xc, 0x10, 0x1, + 0x10, 0xe0, 0x16, 0x0, 0xd, 0x10, 0x1, 0x7f, + 0xc0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x2, 0x10, + + /* U+80AF "肯" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, + 0x2, 0xf2, 0x0, 0xe0, 0x0, 0x70, 0x0, 0x0, + 0x1e, 0x0, 0xf, 0x66, 0x67, 0x30, 0x0, 0x1, + 0xe0, 0x0, 0xe0, 0x0, 0x5, 0x2, 0x86, 0x6a, + 0x66, 0x6a, 0x66, 0x66, 0xa6, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0xa8, 0x66, + 0x66, 0x66, 0xf4, 0x0, 0x0, 0xa, 0x40, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0xa8, 0x66, 0x66, + 0x66, 0xf0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0xa8, 0x66, 0x66, 0x66, + 0xf0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0xb, 0x50, 0x0, 0x17, 0xee, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x3, 0x20, 0x0, + + /* U+80B2 "育" */ + 0x0, 0x0, 0x0, 0x93, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x48, 0x0, 0x1, 0x90, 0x47, 0x66, + 0x6d, 0xa6, 0x66, 0x66, 0x62, 0x0, 0x1, 0x98, + 0x10, 0x16, 0x20, 0x0, 0x0, 0x7a, 0x43, 0x34, + 0x46, 0xeb, 0x0, 0x0, 0x6a, 0x76, 0x43, 0x10, + 0xc, 0x20, 0x0, 0xa, 0x66, 0x66, 0x66, 0xc2, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xe, 0x66, 0x66, 0x66, 0xe0, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, + 0x66, 0x66, 0x66, 0xe0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x21, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x4c, + 0xc0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x1, 0x0, + 0x0, + + /* U+80CC "背" */ + 0x0, 0x0, 0x3, 0x90, 0xa, 0x10, 0x0, 0x0, + 0x2, 0x66, 0x67, 0xb0, 0xe, 0x0, 0x8d, 0x0, + 0x0, 0x10, 0x3, 0xb0, 0xe, 0x67, 0x51, 0x10, + 0x0, 0x2, 0x57, 0xb0, 0xe, 0x0, 0x0, 0x60, + 0xb, 0xc6, 0x23, 0xb0, 0xc, 0xca, 0xac, 0xd0, + 0x0, 0x0, 0x2, 0x60, 0x0, 0x34, 0x33, 0x0, + 0x0, 0x0, 0xb6, 0x66, 0x66, 0x6c, 0x80, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xb, 0x40, 0x0, + 0x0, 0x0, 0xf6, 0x66, 0x66, 0x6d, 0x30, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x0, 0xf6, 0x66, 0x66, 0x6d, 0x30, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xc, 0x30, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x16, 0xcf, 0x10, 0x0, + 0x0, 0x0, 0x60, 0x0, 0x0, 0x23, 0x0, 0x0, + + /* U+80F8 "胸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x3, 0x0, 0xb2, 0x0, 0x0, 0x0, + 0x0, 0xd6, 0x6e, 0x21, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xd0, 0xd, 0x7, 0x96, 0x66, 0x66, 0xb0, + 0x0, 0xd0, 0xd, 0xa, 0x0, 0x52, 0x0, 0xc0, + 0x0, 0xd6, 0x6e, 0x42, 0x50, 0xc6, 0x0, 0xc0, + 0x0, 0xd0, 0xd, 0x11, 0x44, 0xd0, 0x0, 0xc0, + 0x0, 0xd0, 0xd, 0xc, 0x1c, 0x70, 0xc0, 0xc0, + 0x0, 0xd0, 0xd, 0xc, 0xa, 0x40, 0xb0, 0xc0, + 0x0, 0xe6, 0x6e, 0xc, 0x19, 0xb0, 0xb0, 0xb0, + 0x0, 0xc0, 0xd, 0xc, 0x61, 0xb0, 0xb0, 0xb0, + 0x2, 0xa0, 0xd, 0xc, 0x30, 0x40, 0xb1, 0xb0, + 0x5, 0x60, 0xd, 0x9, 0x66, 0x66, 0xa2, 0xa0, + 0x8, 0x13, 0x3e, 0x0, 0x0, 0x14, 0x38, 0x80, + 0x6, 0x1, 0xba, 0x0, 0x0, 0x1, 0x8f, 0x30, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+80FD "能" */ + 0x0, 0x9, 0x10, 0x0, 0x40, 0x0, 0x0, 0x0, + 0x6, 0xa1, 0x0, 0xc, 0x30, 0x21, 0x0, 0x2, + 0x90, 0x8, 0x0, 0xc1, 0x2d, 0x60, 0x3, 0x91, + 0x11, 0x7c, 0xc, 0x77, 0x10, 0x0, 0x6b, 0x85, + 0x42, 0xc1, 0xc1, 0x0, 0x23, 0x0, 0x40, 0x0, + 0x61, 0xb, 0x40, 0x5, 0x90, 0xe, 0x55, 0x5e, + 0x20, 0x4a, 0xaa, 0xa5, 0x0, 0xe6, 0x66, 0xe0, + 0x7, 0x10, 0x1, 0x0, 0xe, 0x0, 0xd, 0x0, + 0xe0, 0x9, 0xb0, 0x0, 0xe0, 0x0, 0xd0, 0xd, + 0x9, 0x70, 0x0, 0xe, 0x66, 0x6e, 0x0, 0xd5, + 0x0, 0x1, 0x0, 0xe0, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0x60, 0xe, 0x0, 0xd, 0x0, 0xd0, 0x0, + 0x1a, 0x0, 0xe0, 0x4c, 0xd0, 0xa, 0xcc, 0xcd, + 0xb0, 0x3, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+8131 "脱" */ + 0x0, 0x30, 0x4, 0x1, 0x20, 0x1, 0x90, 0x0, + 0x0, 0xd6, 0x6e, 0x10, 0xb2, 0x6, 0x70, 0x0, + 0x0, 0xd0, 0xd, 0x0, 0x77, 0x9, 0x0, 0x0, + 0x0, 0xd0, 0xd, 0x5, 0x43, 0x37, 0x44, 0x0, + 0x0, 0xd6, 0x6d, 0xd, 0x44, 0x44, 0x87, 0x0, + 0x0, 0xd0, 0xd, 0xd, 0x0, 0x0, 0x56, 0x0, + 0x0, 0xd0, 0xd, 0xd, 0x0, 0x0, 0x56, 0x0, + 0x0, 0xd6, 0x6d, 0xd, 0x6b, 0x5a, 0x96, 0x0, + 0x0, 0xc0, 0xd, 0x7, 0x1d, 0xc, 0x10, 0x0, + 0x0, 0xc0, 0xd, 0x0, 0x2b, 0xc, 0x0, 0x0, + 0x0, 0xa0, 0xd, 0x0, 0x49, 0xc, 0x0, 0x10, + 0x3, 0x60, 0xd, 0x0, 0x85, 0xc, 0x0, 0x50, + 0x7, 0x13, 0x4d, 0x2, 0xc0, 0xd, 0x0, 0xa0, + 0x6, 0x0, 0x89, 0x38, 0x10, 0xb, 0xbb, 0xb0, + 0x10, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+8155 "è…•" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, + 0x0, 0xb6, 0x6d, 0x1, 0x0, 0x96, 0x0, 0x0, + 0x0, 0xd0, 0xd, 0xa, 0x66, 0x97, 0x67, 0xb0, + 0x0, 0xd0, 0xd, 0x49, 0x71, 0x0, 0x6, 0x20, + 0x0, 0xd3, 0x3d, 0x21, 0xd0, 0x0, 0x1, 0x0, + 0x0, 0xd2, 0x2d, 0x5, 0x82, 0x3a, 0x6d, 0x10, + 0x0, 0xd0, 0xd, 0xa, 0x6a, 0x9b, 0xc, 0x0, + 0x0, 0xd0, 0xd, 0x1a, 0x9, 0x4b, 0xc, 0x0, + 0x0, 0xe6, 0x6d, 0x67, 0x5c, 0x1b, 0xc, 0x0, + 0x0, 0xc0, 0xd, 0x10, 0x6b, 0xb, 0xc, 0x0, + 0x2, 0xa0, 0xd, 0x0, 0x84, 0xb, 0x99, 0x10, + 0x5, 0x60, 0xd, 0x2, 0xa0, 0xb, 0x0, 0x50, + 0x8, 0x11, 0x2c, 0x9, 0x0, 0xb, 0x0, 0xa0, + 0x7, 0x3, 0xc9, 0x71, 0x0, 0xc, 0xbb, 0xc2, + 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8166 "è…¦" */ + 0x0, 0x30, 0x4, 0x1, 0x90, 0x16, 0x4, 0x10, + 0xd, 0x66, 0xe1, 0x6a, 0x6, 0x90, 0xc5, 0x0, + 0xd0, 0xd, 0xa, 0x0, 0xa0, 0x28, 0x0, 0xd, + 0x0, 0xd4, 0x30, 0x62, 0x8, 0x0, 0x0, 0xd6, + 0x6d, 0xa, 0x21, 0xa2, 0x49, 0x10, 0xd, 0x0, + 0xd0, 0x4d, 0x33, 0xe0, 0x6c, 0x0, 0xd0, 0xd, + 0x0, 0x8b, 0x35, 0x0, 0x40, 0xd, 0x66, 0xd0, + 0xb6, 0x96, 0x66, 0xd3, 0x0, 0xc0, 0xd, 0xd, + 0x0, 0x4, 0x5c, 0x0, 0xc, 0x0, 0xd0, 0xd2, + 0x61, 0xc3, 0xc0, 0x0, 0xa0, 0xd, 0xd, 0x1, + 0xe8, 0xc, 0x0, 0x36, 0x0, 0xd0, 0xd0, 0x67, + 0xc5, 0xc0, 0x7, 0x10, 0xc, 0xd, 0x55, 0x2, + 0x9c, 0x0, 0x60, 0x6e, 0x90, 0xd6, 0x66, 0x66, + 0xd1, 0x20, 0x0, 0x30, 0x7, 0x0, 0x0, 0x6, + 0x0, + + /* U+8170 "è…°" */ + 0x0, 0x30, 0x4, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0xe6, 0x6e, 0x57, 0x69, 0x69, 0x69, 0x90, + 0x0, 0xd0, 0xc, 0x0, 0xc, 0xc, 0x0, 0x0, + 0x0, 0xd0, 0xc, 0x3a, 0x6d, 0x6d, 0x6c, 0x30, + 0x0, 0xd6, 0x6c, 0x29, 0xc, 0xc, 0xb, 0x10, + 0x0, 0xd0, 0xc, 0x29, 0xc, 0xc, 0xb, 0x10, + 0x0, 0xd0, 0xc, 0x3b, 0x6a, 0x6a, 0x6d, 0x20, + 0x0, 0xd3, 0x3c, 0x13, 0xc, 0x30, 0x3, 0x0, + 0x0, 0xd3, 0x3c, 0x0, 0x2c, 0x0, 0x2, 0x70, + 0x0, 0xc0, 0xc, 0x66, 0xc7, 0x68, 0xb6, 0x61, + 0x1, 0xa0, 0xc, 0x2, 0xa0, 0x8, 0x30, 0x0, + 0x4, 0x60, 0xc, 0x5, 0x85, 0x3a, 0x0, 0x0, + 0x7, 0x11, 0x1c, 0x0, 0x4, 0xdb, 0x82, 0x0, + 0x7, 0x4, 0xe9, 0x2, 0x88, 0x0, 0x5e, 0x30, + 0x10, 0x0, 0x22, 0x44, 0x0, 0x0, 0x1, 0x20, + + /* U+819D "è†" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x1, 0xc6, 0xd5, 0x46, 0x66, 0xe6, 0x6d, 0x70, + 0x1, 0xb0, 0xc1, 0x11, 0x1c, 0xe3, 0x0, 0x0, + 0x1, 0xb0, 0xc1, 0x0, 0xa3, 0xc4, 0xb7, 0x0, + 0x1, 0xd6, 0xd1, 0x9, 0x22, 0x50, 0xc, 0x80, + 0x1, 0xb0, 0xc2, 0x70, 0xb, 0xc0, 0x1, 0x40, + 0x1, 0xb0, 0xc1, 0x0, 0x89, 0x9, 0x20, 0x0, + 0x1, 0xb0, 0xc1, 0x7, 0x80, 0x92, 0xb9, 0x30, + 0x1, 0xc6, 0xd1, 0x77, 0x0, 0xd0, 0x67, 0xc2, + 0x2, 0x90, 0xc3, 0x3, 0xb0, 0xd7, 0x82, 0x0, + 0x4, 0x70, 0xc1, 0x0, 0x35, 0xe2, 0x0, 0x0, + 0x7, 0x30, 0xc1, 0x4, 0x92, 0xd5, 0xb5, 0x0, + 0x8, 0x0, 0xc0, 0xab, 0x0, 0xd0, 0x1c, 0x60, + 0x6, 0x2a, 0xd0, 0x10, 0x4b, 0xc0, 0x1, 0x30, + 0x10, 0x0, 0x10, 0x0, 0x3, 0x30, 0x0, 0x0, + + /* U+81C9 "臉" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x3, 0x0, 0x5, 0xc0, 0x0, 0x0, + 0x0, 0xd6, 0x7c, 0x0, 0xc, 0x63, 0x0, 0x0, + 0x0, 0xc0, 0x29, 0x0, 0x66, 0x7, 0x20, 0x0, + 0x0, 0xb0, 0x29, 0x2, 0x80, 0x1, 0xa4, 0x0, + 0x0, 0xd6, 0x79, 0x26, 0x56, 0x69, 0x6a, 0xb1, + 0x0, 0xb0, 0x29, 0x31, 0x2, 0x2, 0x0, 0x30, + 0x0, 0xb0, 0x29, 0xd, 0x6d, 0x1d, 0x67, 0xb0, + 0x0, 0xc4, 0x69, 0xb, 0xb, 0xb, 0x1, 0x90, + 0x0, 0xb1, 0x39, 0xc, 0x6c, 0xd, 0x66, 0x90, + 0x1, 0xa0, 0x29, 0x6, 0x43, 0x5, 0x52, 0x20, + 0x2, 0x70, 0x29, 0x2, 0xb0, 0x0, 0xd1, 0x0, + 0x6, 0x30, 0x29, 0x7, 0x91, 0x2, 0xd1, 0x0, + 0x7, 0x4, 0x78, 0x9, 0x1d, 0x1a, 0x28, 0x90, + 0x14, 0x2, 0xc2, 0x61, 0x2, 0x63, 0x0, 0xa1, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x10, 0x0, 0x0, + + /* U+81EA "自" */ + 0x0, 0x2, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x69, + 0x0, 0x0, 0x0, 0x40, 0x9, 0x0, 0x0, 0x17, + 0xe, 0x66, 0x66, 0x66, 0x68, 0xd1, 0xe1, 0x0, + 0x0, 0x0, 0x3b, 0xd, 0x10, 0x0, 0x0, 0x3, + 0xb0, 0xd6, 0x66, 0x66, 0x66, 0x8b, 0xd, 0x10, + 0x0, 0x0, 0x3, 0xb0, 0xd1, 0x0, 0x0, 0x0, + 0x3b, 0xd, 0x66, 0x66, 0x66, 0x68, 0xb0, 0xd1, + 0x0, 0x0, 0x0, 0x3b, 0xd, 0x10, 0x0, 0x0, + 0x3, 0xb0, 0xe1, 0x0, 0x0, 0x0, 0x3b, 0xe, + 0x66, 0x66, 0x66, 0x68, 0xc0, 0x70, 0x0, 0x0, + 0x0, 0x25, 0x0, + + /* U+81F3 "至" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, 0x0, + 0x47, 0x66, 0x6a, 0xa6, 0x66, 0x68, 0x81, 0x0, + 0x0, 0x1, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x1, 0x73, 0x0, 0x0, 0x0, 0x0, + 0x93, 0x0, 0x0, 0xab, 0x10, 0x0, 0x4, 0xa4, + 0x23, 0x45, 0x66, 0xde, 0x10, 0x0, 0x7e, 0xa7, + 0x5c, 0x50, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0x30, 0x2, 0x70, 0x0, 0x5, 0x76, 0x66, 0xd8, + 0x66, 0x88, 0x10, 0x0, 0x0, 0x0, 0xb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x1c, 0x31, 0x86, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x64, + + /* U+81FA "臺" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x3, 0x90, + 0x4, 0x76, 0x66, 0x66, 0xe6, 0x66, 0x76, 0x62, + 0x0, 0x7, 0x66, 0x66, 0xc6, 0x66, 0xb5, 0x0, + 0x0, 0x2, 0x86, 0x66, 0x66, 0x66, 0xc1, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x0, 0x1, 0xd0, 0x0, + 0x0, 0x2, 0xc6, 0x66, 0x66, 0x66, 0xb0, 0x0, + 0x1, 0xa6, 0x66, 0x66, 0x66, 0x66, 0x66, 0xd1, + 0xb, 0x50, 0x0, 0x0, 0x0, 0x3, 0x65, 0x81, + 0x8, 0x6, 0x66, 0xcc, 0x66, 0x86, 0x52, 0x0, + 0x0, 0x1, 0x57, 0x30, 0x0, 0x19, 0x80, 0x0, + 0x0, 0x6, 0xeb, 0xa9, 0xe6, 0x54, 0xa7, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xd0, 0x1, 0xa1, 0x0, + 0x0, 0x6, 0x66, 0x66, 0xe6, 0x66, 0x62, 0x0, + 0x2, 0x66, 0x66, 0x66, 0xe6, 0x66, 0x6c, 0x90, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8207 "與" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x29, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xa6, 0xa7, 0xa3, 0x3, 0x66, 0xb8, 0x0, 0xe, + 0x0, 0xa, 0x76, 0x81, 0x8, 0x50, 0x0, 0xd0, + 0x50, 0xa3, 0x0, 0x0, 0x94, 0x0, 0xc, 0x66, + 0x3d, 0x76, 0xd4, 0x7c, 0x30, 0x0, 0xc1, 0x0, + 0x20, 0xd, 0x0, 0xa3, 0x0, 0xc, 0x15, 0x1c, + 0x20, 0xc0, 0xa, 0x20, 0x0, 0xb7, 0x63, 0xd0, + 0xc, 0x27, 0xc2, 0x0, 0xb, 0x20, 0xd, 0x0, + 0xc0, 0xb, 0x20, 0x16, 0xc6, 0x55, 0xd5, 0x5d, + 0x55, 0xdb, 0x60, 0x31, 0x11, 0x51, 0x11, 0x22, + 0x11, 0x10, 0x0, 0x0, 0xad, 0x20, 0x0, 0x69, + 0x40, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x0, 0x1c, + 0xc1, 0x3, 0xa3, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x61, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8208 "興" */ + 0x0, 0x0, 0x33, 0x0, 0x2, 0x10, 0x0, 0x0, + 0x9, 0x96, 0xc6, 0x66, 0x98, 0x7b, 0x70, 0x0, + 0xd0, 0xc, 0x0, 0x56, 0x50, 0x93, 0x0, 0xc, + 0x32, 0xc5, 0x66, 0x85, 0xa, 0x20, 0x0, 0xb5, + 0x3c, 0x36, 0x87, 0x65, 0xd1, 0x0, 0xa, 0x10, + 0xc6, 0x5b, 0x65, 0xc, 0x10, 0x0, 0xa5, 0x3c, + 0x65, 0xb5, 0x50, 0xd0, 0x0, 0xa, 0x74, 0xc6, + 0x9c, 0x56, 0x7e, 0x0, 0x0, 0xa3, 0xc, 0x10, + 0x15, 0x50, 0xd0, 0x1, 0x6c, 0x86, 0xd6, 0x66, + 0x99, 0x6e, 0xd6, 0x1, 0x0, 0x6, 0x0, 0x2, + 0x20, 0x0, 0x0, 0x0, 0x9, 0xd2, 0x0, 0x5, + 0xb6, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x1, + 0xce, 0x10, 0x38, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xc4, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+8209 "舉" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x22, 0x6d, 0x5c, 0x3, 0x12, 0x36, 0x0, + 0x0, 0x5a, 0x20, 0x1d, 0x68, 0x46, 0x7b, 0x0, + 0x0, 0x4a, 0x48, 0x1c, 0x0, 0x3, 0x68, 0x0, + 0x0, 0x2b, 0x33, 0x5d, 0x6c, 0x75, 0x86, 0x0, + 0x0, 0x2a, 0x7, 0x5, 0xb, 0x20, 0x65, 0x0, + 0x0, 0x1d, 0x66, 0x2d, 0xc, 0x47, 0xb4, 0x0, + 0x0, 0xc, 0x0, 0x1c, 0xc, 0x10, 0x86, 0x50, + 0x6, 0x76, 0x6d, 0x97, 0x76, 0x86, 0x66, 0x60, + 0x0, 0x0, 0x7b, 0x1, 0xa0, 0x8, 0x0, 0x0, + 0x0, 0x6, 0x96, 0x76, 0xb6, 0xb4, 0xb1, 0x0, + 0x1, 0x85, 0x0, 0x1, 0x90, 0x0, 0x6e, 0xa1, + 0x4, 0x6, 0x76, 0x66, 0xb6, 0x69, 0xb4, 0x20, + 0x0, 0x0, 0x0, 0x1, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + + /* U+822A "航" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd2, 0x0, 0x2, 0x20, 0x0, 0x0, + 0x0, 0x11, 0x80, 0x10, 0x0, 0xc2, 0x0, 0x0, + 0x0, 0xc7, 0x66, 0xe0, 0x0, 0x52, 0x5, 0x0, + 0x0, 0xc2, 0x0, 0xd5, 0x66, 0x66, 0x69, 0x30, + 0x0, 0xc1, 0xa0, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc1, 0x91, 0xd0, 0x87, 0x66, 0xc0, 0x0, + 0x0, 0xc1, 0x0, 0xd0, 0x84, 0x1, 0xb0, 0x0, + 0x17, 0xd6, 0x66, 0xd0, 0x84, 0x1, 0xb0, 0x0, + 0x0, 0xc1, 0x50, 0xd0, 0x93, 0x1, 0xb0, 0x0, + 0x0, 0xb0, 0xa3, 0xd0, 0xa2, 0x1, 0xb0, 0x0, + 0x0, 0xa0, 0x42, 0xd0, 0xb0, 0x1, 0xb0, 0x0, + 0x3, 0x70, 0x0, 0xd0, 0xa0, 0x1, 0xb0, 0x60, + 0x7, 0x10, 0x33, 0xc5, 0x40, 0x1, 0xb0, 0xa0, + 0x15, 0x0, 0x3e, 0x86, 0x0, 0x0, 0xcc, 0xd1, + 0x10, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+822C "般" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x10, 0x0, 0x20, 0x0, + 0x0, 0x24, 0x40, 0x40, 0x3c, 0x66, 0xe1, 0x0, + 0x0, 0x98, 0x66, 0xe2, 0x39, 0x0, 0xd0, 0x0, + 0x0, 0x95, 0x50, 0xd0, 0x48, 0x0, 0xd0, 0x0, + 0x0, 0x93, 0xb2, 0xd0, 0x74, 0x0, 0xdc, 0xe4, + 0x0, 0x93, 0x41, 0xd0, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x93, 0x0, 0xd6, 0x44, 0x44, 0x78, 0x0, + 0x7, 0xc8, 0x66, 0xd0, 0x26, 0x22, 0x99, 0x0, + 0x0, 0xa5, 0x40, 0xd0, 0x6, 0x0, 0xd1, 0x0, + 0x0, 0xb1, 0xc2, 0xd0, 0x5, 0x35, 0x90, 0x0, + 0x0, 0xc0, 0x51, 0xd0, 0x0, 0xbd, 0x10, 0x0, + 0x1, 0xa0, 0x0, 0xd0, 0x0, 0xbc, 0x10, 0x0, + 0x6, 0x30, 0x32, 0xc0, 0x1a, 0x44, 0xe6, 0x0, + 0x7, 0x0, 0x3d, 0x75, 0x81, 0x0, 0x2d, 0xd2, + 0x20, 0x0, 0x1, 0x31, 0x0, 0x0, 0x0, 0x20, + + /* U+8239 "船" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd2, 0x0, 0x4, 0x0, 0x50, 0x0, + 0x0, 0x25, 0x40, 0x40, 0xd, 0x66, 0xe2, 0x0, + 0x0, 0xd6, 0x66, 0xe1, 0xc, 0x0, 0xd0, 0x0, + 0x0, 0xd1, 0x20, 0xd0, 0xc, 0x0, 0xd0, 0x0, + 0x0, 0xd0, 0xb1, 0xd0, 0x2a, 0x0, 0xd0, 0x0, + 0x0, 0xd0, 0x51, 0xd0, 0x64, 0x0, 0xac, 0xd1, + 0x15, 0xe5, 0x55, 0xd2, 0x60, 0x0, 0x0, 0x0, + 0x2, 0xd1, 0x11, 0xd3, 0x11, 0x0, 0x5, 0x0, + 0x0, 0xc1, 0x50, 0xd0, 0x2d, 0x66, 0x6e, 0x10, + 0x0, 0xb0, 0xb2, 0xd0, 0x1b, 0x0, 0x1c, 0x0, + 0x0, 0xa0, 0x31, 0xd0, 0x1b, 0x0, 0x1c, 0x0, + 0x4, 0x50, 0x0, 0xd0, 0x1b, 0x0, 0x1c, 0x0, + 0x8, 0x0, 0x44, 0xc0, 0x2d, 0x66, 0x6c, 0x0, + 0x15, 0x0, 0x1b, 0x50, 0x2b, 0x0, 0x1a, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+826F "良" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x40, 0x0, 0x0, 0x0, 0xb6, 0x66, 0x96, 0x66, + 0xe1, 0x0, 0xb, 0x20, 0x0, 0x0, 0x1d, 0x0, + 0x0, 0xb2, 0x0, 0x0, 0x1, 0xd0, 0x0, 0xb, + 0x76, 0x66, 0x66, 0x6d, 0x0, 0x0, 0xb2, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0xb, 0x76, 0x66, 0x66, + 0x6d, 0x0, 0x0, 0xb2, 0x6, 0x0, 0x0, 0x77, + 0x0, 0xb, 0x20, 0x26, 0x0, 0x7c, 0x70, 0x0, + 0xb2, 0x0, 0x87, 0x73, 0x0, 0x0, 0xb, 0x20, + 0x13, 0xb6, 0x0, 0x0, 0x0, 0xb5, 0x86, 0x0, + 0x9d, 0x84, 0x10, 0xc, 0xb1, 0x0, 0x0, 0x2a, + 0xfe, 0x40, 0x10, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+8272 "色" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0x66, 0x6a, 0xa0, 0x0, 0x0, + 0x0, 0x1, 0xd2, 0x0, 0x2d, 0x50, 0x0, 0x0, + 0x0, 0xa, 0x50, 0x0, 0x92, 0x0, 0x0, 0x0, + 0x0, 0x7d, 0x66, 0x68, 0x86, 0x66, 0xc1, 0x0, + 0x5, 0x4d, 0x0, 0xa, 0x20, 0x0, 0xd0, 0x0, + 0x1, 0xd, 0x0, 0xa, 0x20, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xa, 0x20, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x66, 0x67, 0x66, 0x66, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc1, + 0x0, 0xa, 0xdc, 0xcc, 0xcc, 0xcc, 0xcd, 0xa0, + + /* U+82B1 "花" */ + 0x0, 0x0, 0x7, 0x50, 0x4, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x60, 0x5, 0x80, 0x2, 0x10, + 0x7, 0x66, 0x6b, 0x96, 0x69, 0xb6, 0x6c, 0x90, + 0x0, 0x0, 0x8, 0x60, 0x5, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x20, 0x3, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0x0, 0x8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc3, 0x0, 0xe, 0x0, 0x6d, 0x0, + 0x0, 0x6, 0xd0, 0x0, 0xd, 0x6, 0xc2, 0x0, + 0x0, 0x2b, 0xd0, 0x0, 0xe, 0xa8, 0x0, 0x0, + 0x1, 0x91, 0xd0, 0x0, 0x7e, 0x20, 0x0, 0x0, + 0x16, 0x0, 0xd0, 0x57, 0x2d, 0x0, 0x0, 0x20, + 0x0, 0x0, 0xd0, 0x0, 0xd, 0x0, 0x0, 0x60, + 0x0, 0x0, 0xe0, 0x0, 0xe, 0x0, 0x0, 0xb0, + 0x0, 0x0, 0xe0, 0x0, 0xc, 0xdc, 0xcd, 0xd1, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+82E5 "è‹¥" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x70, 0x1, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x60, 0x0, 0xd0, 0x5, 0x10, + 0x2, 0x76, 0x6a, 0xa6, 0x66, 0xe6, 0x68, 0x60, + 0x0, 0x0, 0x8, 0x64, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x1e, 0x50, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4c, 0x0, 0x0, 0x1, 0x50, + 0x5, 0x66, 0x66, 0xd9, 0x66, 0x66, 0x68, 0x92, + 0x0, 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x10, 0x0, 0x2, 0x40, 0x0, + 0x0, 0x1, 0xce, 0x66, 0x66, 0x69, 0xb0, 0x0, + 0x0, 0x2a, 0x3d, 0x0, 0x0, 0x5, 0x80, 0x0, + 0x4, 0x60, 0xd, 0x0, 0x0, 0x5, 0x80, 0x0, + 0x1, 0x0, 0xe, 0x66, 0x66, 0x69, 0x90, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x5, 0x80, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+82E6 "苦" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x20, 0x0, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xd0, 0x6, 0x40, + 0x17, 0x66, 0x6e, 0x66, 0x66, 0xe6, 0x67, 0x70, + 0x0, 0x0, 0xe, 0x3, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xc, 0x40, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x8, 0x30, + 0x27, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x67, 0x50, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x66, 0x6e, 0x66, 0x68, 0x70, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, + 0x0, 0xd, 0x66, 0x66, 0x66, 0x6a, 0x60, 0x0, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + + /* U+82F1 "英" */ + 0x0, 0x0, 0xb, 0x20, 0x1, 0x91, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x1, 0xc0, 0x7, 0x60, + 0x8, 0x66, 0x6e, 0x66, 0x66, 0xd6, 0x66, 0x50, + 0x0, 0x0, 0xd, 0x9, 0x31, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x66, 0x6d, 0x66, 0x6b, 0x80, 0x0, + 0x0, 0xc, 0x0, 0xd, 0x0, 0x8, 0x50, 0x0, + 0x0, 0xc, 0x0, 0xd, 0x0, 0x8, 0x50, 0x0, + 0x0, 0xc, 0x0, 0xe, 0x0, 0x8, 0x54, 0x30, + 0x28, 0x68, 0x66, 0x8d, 0x86, 0x67, 0x68, 0x70, + 0x0, 0x0, 0x0, 0xa5, 0x26, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xb0, 0x6, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x6b, 0x10, 0x0, 0x5d, 0x61, 0x0, + 0x0, 0x48, 0x40, 0x0, 0x0, 0x2, 0xbf, 0x90, + 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+8336 "茶" */ + 0x0, 0x0, 0xb, 0x40, 0x0, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x10, 0x0, 0xd0, 0x6, 0x80, + 0x6, 0x66, 0x6e, 0x66, 0x66, 0xe6, 0x66, 0x61, + 0x0, 0x0, 0xd, 0x8, 0xb0, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x4c, 0x44, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xc1, 0x4, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x79, 0x2, 0x40, 0x3c, 0x71, 0x0, + 0x0, 0x47, 0x20, 0x3, 0xc0, 0x0, 0x9f, 0xc3, + 0x4, 0x26, 0x66, 0x68, 0xc6, 0x6a, 0xd2, 0x10, + 0x0, 0x2, 0x1, 0x3, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0x3, 0xa1, 0x83, 0x0, 0x0, + 0x0, 0x3, 0xb1, 0x3, 0xa0, 0xb, 0x80, 0x0, + 0x0, 0x39, 0x1, 0x4, 0xa0, 0x0, 0xc8, 0x0, + 0x2, 0x40, 0x0, 0x8f, 0x70, 0x0, 0x24, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, + + /* U+8377 "è·" */ + 0x0, 0x0, 0xa, 0x40, 0x5, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x20, 0x6, 0x80, 0x7, 0x20, + 0x7, 0x66, 0x6d, 0x76, 0x69, 0xb6, 0x68, 0x60, + 0x0, 0x0, 0xb, 0x20, 0x6, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xd3, 0x0, 0x1, 0x10, 0x2, 0x10, + 0x0, 0x7, 0x84, 0x76, 0x66, 0x66, 0x9b, 0x90, + 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x9f, 0x33, 0x86, 0x6c, 0x10, 0xe0, 0x0, + 0x5, 0x5e, 0x4, 0xa0, 0xd, 0x0, 0xe0, 0x0, + 0x24, 0xe, 0x3, 0xa0, 0xd, 0x0, 0xe0, 0x0, + 0x0, 0xe, 0x3, 0xa0, 0xd, 0x0, 0xe0, 0x0, + 0x0, 0xe, 0x4, 0xc6, 0x6c, 0x0, 0xe0, 0x0, + 0x0, 0xe, 0x3, 0x60, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x1, 0x6b, 0xd0, 0x0, + 0x0, 0x7, 0x0, 0x0, 0x0, 0x6, 0x30, 0x0, + + /* U+83D3 "è“" */ + 0x0, 0x0, 0xb, 0x10, 0x3, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x3b, 0x1, 0x90, 0x8, + 0x66, 0x6e, 0x66, 0x67, 0xc6, 0x67, 0x30, 0x0, + 0x0, 0xb0, 0x0, 0x29, 0x20, 0x0, 0x0, 0xc, + 0x66, 0x6a, 0x66, 0x6c, 0x70, 0x0, 0x0, 0xc0, + 0x0, 0xe0, 0x0, 0xb3, 0x0, 0x0, 0xc, 0x66, + 0x6e, 0x66, 0x6c, 0x30, 0x0, 0x0, 0xc0, 0x0, + 0xe0, 0x0, 0xb3, 0x0, 0x0, 0xa, 0x66, 0x6e, + 0x66, 0x69, 0x20, 0x0, 0x26, 0x66, 0x66, 0xe6, + 0x66, 0x6e, 0x70, 0x0, 0x10, 0x2, 0xce, 0x35, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xb1, 0xe0, 0x68, + 0x0, 0x0, 0x0, 0x6, 0x80, 0xe, 0x0, 0x6d, + 0x61, 0x0, 0x46, 0x20, 0x0, 0xe0, 0x0, 0x3c, + 0xe3, 0x10, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + 0x0, + + /* U+83DC "èœ" */ + 0x0, 0x0, 0xa, 0x30, 0xb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xb2, 0x0, 0xe0, 0x1, 0xb2, 0x27, + 0x66, 0x6d, 0x76, 0x6e, 0x66, 0x66, 0x40, 0x0, + 0x0, 0x81, 0x0, 0x95, 0xa5, 0x0, 0x0, 0x35, + 0x56, 0x78, 0x98, 0x65, 0x30, 0x0, 0x0, 0x10, + 0x2, 0x70, 0x0, 0xa4, 0x0, 0x0, 0x7, 0x80, + 0x7, 0x70, 0x2c, 0x0, 0x0, 0x0, 0xd, 0x0, + 0x62, 0x9, 0x10, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x42, 0x10, 0x1c, 0x23, 0x76, 0x66, 0x6e, 0xe9, + 0x76, 0x66, 0x64, 0x0, 0x0, 0x9, 0x6c, 0x18, + 0x0, 0x0, 0x0, 0x0, 0x9, 0x60, 0xc1, 0x1b, + 0x20, 0x0, 0x0, 0x29, 0x30, 0xc, 0x10, 0x2c, + 0xa4, 0x10, 0x56, 0x0, 0x0, 0xd1, 0x0, 0x7, + 0xe5, 0x20, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, + 0x0, + + /* U+843D "è½" */ + 0x0, 0x0, 0x9, 0x20, 0xa, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0xc, 0x0, 0x6, 0x90, + 0x7, 0x66, 0x6e, 0x66, 0x6d, 0x66, 0x66, 0x61, + 0x0, 0x72, 0x6, 0x3, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0x2, 0x9, 0x86, 0x67, 0x80, 0x0, + 0x0, 0x3, 0x4, 0x19, 0x50, 0xc, 0x30, 0x0, + 0x9, 0x30, 0x50, 0x81, 0x53, 0xa4, 0x0, 0x0, + 0x2, 0xb0, 0x73, 0x30, 0x1f, 0x90, 0x0, 0x0, + 0x0, 0x5, 0x40, 0x1, 0xb3, 0x7b, 0x40, 0x0, + 0x0, 0xb, 0x0, 0x5a, 0x10, 0x2, 0xde, 0xa2, + 0x5, 0xaa, 0x25, 0x4c, 0x66, 0x67, 0xd2, 0x30, + 0x0, 0x97, 0x0, 0x2a, 0x0, 0x1, 0xb0, 0x0, + 0x0, 0x97, 0x0, 0x2a, 0x0, 0x1, 0xb0, 0x0, + 0x0, 0x86, 0x0, 0x2c, 0x66, 0x66, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, 0x20, 0x0, + + /* U+8449 "葉" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x20, 0x1, 0xc0, 0x1, 0x0, + 0x6, 0x66, 0x6c, 0x66, 0x66, 0xd6, 0x6d, 0xa0, + 0x0, 0x0, 0xa, 0x0, 0x0, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xb1, 0x84, 0x0, 0x71, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0xa3, 0x0, 0xd0, 0x25, 0x0, + 0x1, 0x76, 0xe6, 0xc7, 0x66, 0xe6, 0x66, 0x0, + 0x0, 0x0, 0xd0, 0xa5, 0x44, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x52, 0x22, 0x70, 0x60, 0x0, + 0x0, 0x1, 0xb6, 0x6b, 0x96, 0x66, 0x61, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, 0x2b, 0x0, + 0x3, 0x66, 0x66, 0xef, 0xa9, 0x66, 0x66, 0x20, + 0x0, 0x0, 0xb, 0x8a, 0x54, 0x60, 0x0, 0x0, + 0x0, 0x3, 0xb4, 0xa, 0x50, 0x4b, 0x50, 0x0, + 0x3, 0x65, 0x0, 0xa, 0x60, 0x1, 0xaf, 0x80, + 0x1, 0x0, 0x0, 0x6, 0x20, 0x0, 0x2, 0x0, + + /* U+8457 "è‘—" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x50, 0xa, 0x60, 0x1, 0x0, + 0x3, 0x66, 0x6b, 0x86, 0x6c, 0x76, 0x6f, 0x60, + 0x0, 0x10, 0x9, 0x31, 0xa, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x1c, 0x35, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x8, 0x5, 0xd2, 0x0, + 0x0, 0x3, 0x76, 0x6e, 0x66, 0x8d, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x7, 0xb1, 0x7, 0x50, + 0x4, 0x76, 0x66, 0x66, 0xe8, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x0, 0x3a, 0x30, 0x0, 0x30, 0x0, + 0x0, 0x0, 0x1e, 0x96, 0x66, 0x67, 0xd0, 0x0, + 0x0, 0x17, 0x8d, 0x0, 0x0, 0x2, 0xa0, 0x0, + 0x5, 0x40, 0xd, 0x66, 0x66, 0x67, 0xa0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x2, 0xa0, 0x0, + 0x0, 0x0, 0xe, 0x66, 0x66, 0x67, 0xb0, 0x0, + 0x0, 0x0, 0x6, 0x0, 0x0, 0x1, 0x30, 0x0, + + /* U+8535 "蔵" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x50, 0x6, 0x70, 0x1, 0x0, + 0x4, 0x66, 0x6c, 0x76, 0x69, 0xa6, 0x6e, 0xa0, + 0x1, 0x10, 0xa, 0x20, 0x6, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x0, 0x4, 0x38, 0x70, 0x0, + 0x0, 0x13, 0x0, 0x0, 0x4, 0xb0, 0x4a, 0x20, + 0x0, 0x3c, 0x66, 0x66, 0x67, 0xc6, 0x66, 0x40, + 0x0, 0x3a, 0x86, 0x87, 0xa2, 0xb0, 0x5, 0x0, + 0x0, 0x29, 0x81, 0x92, 0x10, 0xc0, 0x1f, 0x20, + 0x0, 0x39, 0x86, 0x86, 0xd2, 0xc0, 0x78, 0x0, + 0x0, 0x48, 0x81, 0x0, 0xc0, 0x94, 0xd1, 0x0, + 0x0, 0x66, 0x86, 0x96, 0xa0, 0x5e, 0x60, 0x0, + 0x0, 0x92, 0x81, 0x92, 0x40, 0x6f, 0x20, 0x60, + 0x0, 0x90, 0x86, 0x76, 0x88, 0x73, 0xd3, 0x80, + 0x5, 0x10, 0x0, 0x1, 0x73, 0x0, 0x3e, 0x90, + 0x2, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x40, + + /* U+8584 "è–„" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xb0, 0x3, 0xb0, 0x0, 0x0, 0x16, + 0x66, 0x7c, 0x66, 0x7c, 0x66, 0xca, 0x0, 0x40, + 0x2, 0xa0, 0x3, 0x87, 0x30, 0x0, 0x5, 0xa0, + 0x0, 0x0, 0xb3, 0x19, 0x51, 0x0, 0x9, 0x3, + 0x76, 0x6d, 0x66, 0x67, 0x50, 0x30, 0x2, 0x28, + 0x66, 0xd6, 0x69, 0x70, 0x1, 0xd1, 0x60, 0xa1, + 0xc, 0x10, 0x76, 0x0, 0x6, 0x16, 0xa, 0x76, + 0xd6, 0x6a, 0x60, 0x0, 0x7, 0x10, 0xa7, 0x6d, + 0x66, 0xa6, 0x0, 0x2, 0xa0, 0x8, 0x10, 0x90, + 0x55, 0x20, 0x4, 0xc8, 0x27, 0x66, 0x66, 0x6c, + 0x89, 0xa0, 0x6, 0x70, 0x2, 0x81, 0x0, 0xb2, + 0x0, 0x0, 0x97, 0x0, 0x5, 0x70, 0xb, 0x20, + 0x0, 0x9, 0x80, 0x0, 0x0, 0x5a, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, + + /* U+85AC "è–¬" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x40, 0xa, 0x40, 0x1, 0x0, + 0x6, 0x66, 0x6c, 0x76, 0x6d, 0x66, 0x6d, 0x90, + 0x1, 0x0, 0xa, 0x13, 0xb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x76, 0x8, 0x78, 0x69, 0x60, 0x29, 0x0, + 0x0, 0xa, 0x4c, 0x0, 0x8, 0x36, 0xa4, 0x0, + 0x0, 0x0, 0x1c, 0x66, 0x6b, 0x61, 0x0, 0x0, + 0x1, 0x58, 0x5c, 0x0, 0x8, 0x47, 0x93, 0x0, + 0x9, 0x60, 0xc, 0x66, 0x6b, 0x40, 0x3e, 0x0, + 0x0, 0x0, 0x4, 0x7, 0x33, 0x0, 0x5, 0x0, + 0x7, 0x66, 0x66, 0x9d, 0x96, 0x66, 0x8c, 0x50, + 0x0, 0x0, 0x7, 0xba, 0x56, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xa7, 0x9, 0x30, 0x98, 0x20, 0x0, + 0x2, 0x66, 0x10, 0x9, 0x40, 0x5, 0xdf, 0x70, + 0x11, 0x0, 0x0, 0x5, 0x10, 0x0, 0x2, 0x0, + + /* U+85DD "è—" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x60, 0x2, 0xb0, 0x1, 0x20, + 0x7, 0x66, 0x6b, 0x86, 0x67, 0xc6, 0x6b, 0xa0, + 0x0, 0x0, 0x26, 0x20, 0x1, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xb2, 0x40, 0x0, 0xb1, 0x0, 0x0, + 0x0, 0x76, 0xc6, 0x65, 0x56, 0xd6, 0xc1, 0x0, + 0x4, 0x76, 0xa6, 0x7b, 0x20, 0xb0, 0xd0, 0x0, + 0x0, 0x95, 0xa2, 0x76, 0x5, 0xb0, 0xd0, 0x0, + 0x6, 0x37, 0xd6, 0x77, 0x8, 0x99, 0xc1, 0x20, + 0x0, 0x0, 0xb3, 0x51, 0x46, 0x3, 0x7a, 0x60, + 0x0, 0xca, 0x73, 0x13, 0x31, 0x47, 0x9, 0x60, + 0x0, 0x1, 0x75, 0x55, 0x55, 0x54, 0x63, 0x0, + 0x2, 0x86, 0x66, 0x9b, 0x66, 0x66, 0x77, 0x0, + 0x0, 0x0, 0x6, 0x93, 0x2, 0x85, 0x0, 0x0, + 0x0, 0x6, 0xeb, 0xa9, 0x76, 0x5b, 0x80, 0x0, + 0x0, 0x2, 0x52, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+8607 "蘇" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x20, 0x3, 0x90, 0x0, 0x0, + 0x5, 0x66, 0x6c, 0x66, 0x67, 0xb6, 0x6b, 0xa0, + 0x1, 0x0, 0xa, 0x0, 0x2, 0x90, 0x0, 0x0, + 0x0, 0x8, 0x72, 0x0, 0x0, 0x11, 0x67, 0x0, + 0x0, 0x1e, 0x69, 0x70, 0x46, 0x9c, 0x64, 0x0, + 0x0, 0xa3, 0x8, 0x10, 0x0, 0x28, 0x0, 0x0, + 0x6, 0xd5, 0xa6, 0xc3, 0x56, 0x7b, 0x6c, 0x40, + 0x1, 0xb0, 0xb0, 0xb0, 0x22, 0xfd, 0x0, 0x0, + 0x0, 0xb6, 0xc6, 0xc0, 0x6, 0x99, 0x60, 0x0, + 0x0, 0xb0, 0xb0, 0xb0, 0xb, 0x38, 0x91, 0x0, + 0x0, 0xb6, 0xc6, 0xc0, 0x64, 0x28, 0x3b, 0x0, + 0x0, 0x30, 0x0, 0x32, 0x50, 0x28, 0x9, 0xb0, + 0x0, 0x57, 0x46, 0xa4, 0x0, 0x39, 0x0, 0x0, + 0x9, 0x68, 0x3a, 0x43, 0x0, 0x39, 0x0, 0x0, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, + + /* U+8655 "處" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x66, 0x69, 0xb0, 0x0, + 0x0, 0x30, 0x0, 0xd, 0x0, 0x0, 0x3, 0x20, + 0x0, 0x99, 0x66, 0x6c, 0x66, 0x66, 0x6c, 0x80, + 0x0, 0x94, 0x0, 0xe, 0x22, 0x4a, 0x26, 0x0, + 0x0, 0x86, 0x87, 0x7e, 0x53, 0x20, 0x4, 0x0, + 0x0, 0x84, 0x0, 0xd, 0x0, 0x0, 0x58, 0x0, + 0x0, 0x93, 0x9, 0x16, 0x9a, 0xaa, 0x94, 0x0, + 0x0, 0xa2, 0x3e, 0x66, 0x95, 0x75, 0xa0, 0x0, + 0x0, 0xb0, 0x93, 0x6, 0x86, 0x50, 0xc0, 0x10, + 0x0, 0xb2, 0x67, 0x1c, 0x9, 0x20, 0xc0, 0x60, + 0x2, 0x75, 0x3, 0xe5, 0x17, 0x0, 0xc9, 0xd0, + 0x6, 0x0, 0x1a, 0x6b, 0xa4, 0x20, 0x0, 0x0, + 0x23, 0x4, 0x71, 0x0, 0x38, 0xce, 0xff, 0xb1, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+884C "行" */ + 0x0, 0x6, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xd3, 0x2, 0x66, 0x66, 0x6e, 0x40, 0x0, + 0xa3, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x63, + 0x8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x21, 0x3, + 0xd2, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0xc3, + 0x37, 0x66, 0x68, 0x67, 0xb3, 0x0, 0x9d, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x0, 0x66, 0xe0, 0x0, + 0x0, 0x2b, 0x0, 0x0, 0x45, 0xd, 0x0, 0x0, + 0x2, 0xb0, 0x0, 0x1, 0x0, 0xd0, 0x0, 0x0, + 0x2b, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x2, + 0xb0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x2b, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x3, 0x26, 0xa0, + 0x0, 0x0, 0x0, 0xd0, 0x0, 0x3a, 0xf7, 0x0, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x4, 0x0, 0x0, + 0x0, + + /* U+8853 "è¡“" */ + 0x0, 0x7, 0x50, 0x9, 0x20, 0x0, 0x0, 0x10, + 0x0, 0xc, 0x10, 0xd, 0x31, 0x4, 0x76, 0xb1, + 0x0, 0x83, 0x0, 0xd, 0xc, 0x20, 0x0, 0x0, + 0x3, 0x41, 0xb0, 0xd, 0x5, 0x10, 0x0, 0x0, + 0x2, 0x9, 0x84, 0x4d, 0x4a, 0x20, 0x0, 0x51, + 0x0, 0x2d, 0x3, 0x9f, 0x22, 0x17, 0x6e, 0x63, + 0x0, 0xae, 0x10, 0xbe, 0x30, 0x0, 0xd, 0x0, + 0x6, 0x2d, 0x0, 0xbd, 0x69, 0x0, 0xd, 0x0, + 0x1, 0xd, 0x4, 0x6d, 0xa, 0x50, 0xd, 0x0, + 0x0, 0xd, 0x8, 0xd, 0x1, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x16, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x50, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x18, 0xdb, 0x0, + 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x40, 0x0, + + /* U+8868 "表" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x26, 0x0, + 0x0, 0x76, 0x66, 0x6d, 0x66, 0x66, 0x77, 0x10, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x1, 0x40, 0x0, + 0x0, 0x6, 0x66, 0x6d, 0x66, 0x67, 0x81, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x3, 0x10, + 0x6, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x6b, 0x90, + 0x0, 0x0, 0x0, 0xb8, 0x50, 0x1, 0xa0, 0x0, + 0x0, 0x0, 0x9, 0x90, 0x90, 0x1b, 0x50, 0x0, + 0x0, 0x0, 0xae, 0x0, 0x39, 0x70, 0x0, 0x0, + 0x0, 0x2a, 0x6d, 0x0, 0x9, 0x50, 0x0, 0x0, + 0x16, 0x50, 0x1d, 0x0, 0x20, 0xa8, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x38, 0x40, 0x7, 0xfa, 0x71, + 0x0, 0x0, 0x3f, 0x90, 0x0, 0x0, 0x29, 0x40, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+88AB "被" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x38, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0xa, 0x50, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x1, 0x11, 0x3, 0x0, 0xd0, 0x2, 0x20, + 0x6, 0x76, 0xba, 0xe, 0x66, 0xe6, 0x6c, 0xa0, + 0x0, 0x0, 0xd1, 0xd, 0x0, 0xd0, 0x17, 0x0, + 0x0, 0x6, 0x74, 0x1d, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xe, 0x1c, 0x2e, 0x66, 0xe6, 0x78, 0x0, + 0x0, 0x8e, 0x71, 0x1c, 0x31, 0x0, 0x88, 0x0, + 0x5, 0x3d, 0x77, 0x2a, 0x6, 0x0, 0xd1, 0x0, + 0x12, 0xd, 0xd, 0x48, 0x8, 0x16, 0x80, 0x0, + 0x0, 0xd, 0x1, 0x74, 0x1, 0xbc, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xb0, 0x2, 0xd9, 0x0, 0x0, + 0x0, 0xd, 0x4, 0x60, 0x4a, 0x16, 0xc4, 0x0, + 0x0, 0xd, 0x18, 0x27, 0x50, 0x0, 0x4d, 0xb1, + 0x0, 0x2, 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+88CF "è£" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x78, 0x0, 0x0, 0x0, 0x36, 0x66, + 0x66, 0x6d, 0x66, 0x66, 0xc5, 0x0, 0x12, 0x0, + 0x0, 0x0, 0x5, 0x0, 0x0, 0x2c, 0x66, 0x6d, + 0x66, 0x6e, 0x0, 0x0, 0x2c, 0x66, 0x6d, 0x66, + 0x6d, 0x0, 0x0, 0x2a, 0x0, 0x1c, 0x0, 0xd, + 0x0, 0x0, 0x28, 0x66, 0x6d, 0x66, 0x66, 0x0, + 0x0, 0x76, 0x66, 0x6d, 0x66, 0x6b, 0x40, 0x0, + 0x0, 0x0, 0x1c, 0x0, 0x0, 0x53, 0x28, 0x66, + 0x66, 0xf9, 0x66, 0x69, 0x64, 0x0, 0x0, 0x2c, + 0x67, 0x0, 0x6c, 0x30, 0x0, 0x18, 0xd7, 0x1, + 0xa8, 0x40, 0x0, 0x16, 0x71, 0x77, 0x5, 0x49, + 0xb7, 0x42, 0x0, 0x0, 0x9d, 0x92, 0x0, 0x28, + 0xc4, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, + + /* U+88DC "補" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0x0, 0x0, 0x0, 0xb4, 0x20, 0x0, + 0x0, 0x6, 0xa0, 0x0, 0x0, 0xd0, 0xb4, 0x0, + 0x0, 0x0, 0x50, 0x0, 0x0, 0xd0, 0x38, 0x10, + 0x7, 0x66, 0xc8, 0x76, 0x66, 0xe6, 0x69, 0x70, + 0x0, 0x0, 0xd0, 0x2, 0x0, 0xd0, 0x4, 0x0, + 0x0, 0x6, 0x82, 0xe, 0x66, 0xe6, 0x6e, 0x20, + 0x0, 0xe, 0x1b, 0x4d, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0x9e, 0x56, 0xd, 0x66, 0xe6, 0x6d, 0x0, + 0x5, 0x4c, 0x95, 0xd, 0x0, 0xd0, 0xd, 0x0, + 0x33, 0xc, 0x1e, 0x2d, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0xc, 0x4, 0xd, 0x66, 0xe6, 0x6d, 0x0, + 0x0, 0xc, 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0xc, 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0xd, 0x10, 0xd, 0x0, 0xc3, 0x9c, 0x0, + 0x0, 0x4, 0x0, 0x6, 0x0, 0x20, 0x32, 0x0, + + /* U+88E1 "裡" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xa0, 0xb, 0x66, 0x66, 0x6d, 0x10, + 0x0, 0x0, 0x50, 0xc, 0x0, 0xd0, 0xc, 0x0, + 0x7, 0x66, 0xc9, 0xc, 0x0, 0xd0, 0xc, 0x0, + 0x0, 0x0, 0xe0, 0xd, 0x66, 0xe6, 0x6c, 0x0, + 0x0, 0x7, 0x82, 0xc, 0x0, 0xd0, 0xc, 0x0, + 0x0, 0x1e, 0x1b, 0x4c, 0x0, 0xd0, 0xc, 0x0, + 0x0, 0x9e, 0x56, 0xd, 0x66, 0xe6, 0x6c, 0x0, + 0x6, 0x3c, 0x95, 0xa, 0x0, 0xd0, 0x4, 0x0, + 0x33, 0xc, 0xe, 0x30, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xc, 0x4, 0x37, 0x66, 0xe6, 0x6d, 0x20, + 0x0, 0xc, 0x0, 0x1, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xc, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x10, + 0x0, 0xd, 0x13, 0x66, 0x66, 0xe6, 0x6a, 0xc0, + 0x0, 0x4, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+88FD "製" */ + 0x0, 0x18, 0xb, 0x10, 0x0, 0x0, 0x6, 0x0, + 0x0, 0x85, 0xc, 0x2, 0x50, 0x0, 0xd, 0x0, + 0x3, 0x86, 0x6d, 0x66, 0x60, 0xb3, 0xc, 0x0, + 0x6, 0x75, 0x5d, 0x56, 0xb2, 0xd0, 0xc, 0x0, + 0x0, 0x76, 0x6d, 0x66, 0x80, 0xd0, 0xc, 0x0, + 0x0, 0xc0, 0xc, 0x2, 0x90, 0xd0, 0xc, 0x0, + 0x0, 0xc0, 0xc, 0x37, 0x80, 0x20, 0xc, 0x0, + 0x0, 0xb0, 0xd, 0x9, 0x20, 0x6, 0xca, 0x0, + 0x0, 0x0, 0x3, 0x4, 0xa0, 0x0, 0x38, 0x0, + 0x6, 0x76, 0x66, 0xc7, 0x96, 0x66, 0x89, 0x50, + 0x0, 0x0, 0x2c, 0x40, 0x42, 0x6, 0xc1, 0x0, + 0x0, 0x18, 0x9d, 0x0, 0x6, 0x76, 0x0, 0x0, + 0x15, 0x50, 0xd, 0x16, 0x60, 0x8a, 0x40, 0x0, + 0x0, 0x0, 0xf, 0xb2, 0x0, 0x3, 0xbf, 0x70, + 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8907 "複" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x36, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x60, 0x0, 0xe1, 0x0, 0x3, 0x40, + 0x0, 0x2, 0x40, 0x4, 0xb6, 0x66, 0x66, 0x60, + 0x6, 0x55, 0xc7, 0xa, 0xa6, 0x66, 0x6a, 0x10, + 0x0, 0x1, 0xe0, 0x43, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x7, 0x72, 0x30, 0xd6, 0x66, 0x6d, 0x0, + 0x0, 0x1e, 0xb, 0x40, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x9d, 0x45, 0x0, 0xda, 0x86, 0x6b, 0x0, + 0x5, 0x4c, 0xa4, 0x0, 0x1c, 0x0, 0x13, 0x0, + 0x13, 0xc, 0xd, 0x20, 0x9a, 0x66, 0xba, 0x0, + 0x0, 0xc, 0x2, 0x6, 0x45, 0x11, 0xc0, 0x0, + 0x0, 0xc, 0x0, 0x21, 0x0, 0x9c, 0x20, 0x0, + 0x0, 0xc, 0x0, 0x0, 0x5, 0xcb, 0x30, 0x0, + 0x0, 0xd, 0x0, 0x16, 0x85, 0x2, 0xbc, 0x81, + 0x0, 0x3, 0x4, 0x30, 0x0, 0x0, 0x1, 0x10, + + /* U+897F "西" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x76, 0x66, 0x67, 0x66, 0x86, 0x66, 0xc5, 0x0, + 0x0, 0x3, 0xa0, 0xd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x86, + 0x67, 0xc6, 0x6e, 0x66, 0x6c, 0x0, 0xd, 0x0, + 0x39, 0x0, 0xd0, 0x1, 0xb0, 0x0, 0xd0, 0x5, + 0x80, 0xd, 0x0, 0x1b, 0x0, 0xd, 0x0, 0x75, + 0x0, 0xd0, 0x1, 0xb0, 0x0, 0xd0, 0xb, 0x10, + 0xd, 0x0, 0x1b, 0x0, 0xd, 0x4, 0x60, 0x0, + 0xcc, 0xd4, 0xb0, 0x0, 0xd1, 0x70, 0x0, 0x0, + 0x0, 0x1b, 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, + 0x1, 0xb0, 0x0, 0xd6, 0x66, 0x66, 0x66, 0x66, + 0x6c, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xa0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+8981 "è¦" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x0, + 0x2, 0x76, 0x66, 0xc6, 0x6c, 0x66, 0x68, 0x40, + 0x0, 0x0, 0x0, 0xd0, 0xd, 0x0, 0x10, 0x0, + 0x0, 0xd, 0x66, 0xe6, 0x6e, 0x66, 0xe3, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xe, 0x66, 0x96, 0x66, 0x66, 0xc0, 0x0, + 0x0, 0x1, 0x0, 0xd5, 0x0, 0x0, 0x1, 0x0, + 0x6, 0x66, 0x68, 0xd6, 0x66, 0x66, 0x6d, 0xa0, + 0x0, 0x0, 0xc, 0x20, 0x2, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x89, 0x10, 0xb, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x68, 0xdd, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5b, 0x63, 0x9e, 0xa1, 0x0, + 0x0, 0x25, 0x88, 0x50, 0x0, 0x0, 0x8b, 0x0, + 0x4, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+898B "見" */ + 0x0, 0x3, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, + 0x0, 0xb, 0x86, 0x66, 0x66, 0x6e, 0x40, 0x0, + 0x0, 0xa, 0x30, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xa, 0x86, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0xa, 0x30, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xa, 0x86, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0xa, 0x30, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xa, 0x30, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xa, 0x87, 0xa6, 0x6a, 0x6f, 0x0, 0x0, + 0x0, 0x8, 0x13, 0xb0, 0x1d, 0x5, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x90, 0x1d, 0x0, 0x0, 0x40, + 0x0, 0x0, 0xb, 0x40, 0x1d, 0x0, 0x0, 0x60, + 0x0, 0x0, 0x7a, 0x0, 0x1d, 0x0, 0x3, 0x90, + 0x0, 0x48, 0x60, 0x0, 0xd, 0xcc, 0xce, 0xb0, + 0x24, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+898F "è¦" */ + 0x0, 0x9, 0x30, 0x2, 0x0, 0x0, 0x5, 0x0, + 0x0, 0xb, 0x10, 0xe, 0x66, 0x66, 0x6e, 0x10, + 0x0, 0xb, 0x10, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x5, 0x6d, 0x7b, 0x1d, 0x66, 0x66, 0x6d, 0x0, + 0x1, 0xb, 0x10, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xb, 0x10, 0xd, 0x33, 0x33, 0x3d, 0x0, + 0x26, 0x6d, 0x6a, 0x7d, 0x22, 0x22, 0x2d, 0x0, + 0x2, 0xc, 0x10, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x10, 0xe, 0x6b, 0x6a, 0x6d, 0x0, + 0x0, 0xd, 0x74, 0x6, 0x1d, 0xd, 0x2, 0x0, + 0x0, 0x29, 0xa, 0x70, 0x3b, 0xd, 0x0, 0x0, + 0x0, 0x82, 0x1, 0x90, 0x86, 0xd, 0x0, 0x40, + 0x2, 0x70, 0x0, 0x3, 0xa0, 0xd, 0x0, 0x80, + 0x16, 0x0, 0x0, 0x66, 0x0, 0xd, 0xcc, 0xd1, + 0x10, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8996 "視" */ + 0x0, 0x8, 0x0, 0x3, 0x0, 0x0, 0x5, 0x0, + 0x0, 0x5, 0xb0, 0xe, 0x66, 0x66, 0x6e, 0x0, + 0x0, 0x0, 0x71, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x7, 0x66, 0xab, 0xd, 0x66, 0x66, 0x6d, 0x0, + 0x0, 0x0, 0xc2, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x6, 0x70, 0xd, 0x66, 0x66, 0x6d, 0x0, + 0x0, 0x2f, 0x30, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x9c, 0x88, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x7, 0x1b, 0x1b, 0x5e, 0x6b, 0x6a, 0x6d, 0x0, + 0x20, 0xb, 0x11, 0x15, 0x1d, 0xd, 0x2, 0x0, + 0x0, 0xb, 0x10, 0x0, 0x4a, 0xd, 0x0, 0x0, + 0x0, 0xb, 0x10, 0x0, 0xa4, 0xd, 0x0, 0x40, + 0x0, 0xb, 0x10, 0x5, 0x80, 0xd, 0x0, 0x70, + 0x0, 0xc, 0x11, 0x65, 0x0, 0xd, 0xcc, 0xc0, + 0x0, 0x2, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+899A "覚" */ + 0x0, 0x2, 0x0, 0x26, 0x0, 0x7, 0x40, 0x0, + 0x0, 0x0, 0xc3, 0xa, 0x60, 0xc, 0x30, 0x0, + 0x0, 0x30, 0x57, 0x3, 0x50, 0x54, 0x2, 0x10, + 0x2, 0xa6, 0x66, 0x66, 0x66, 0x76, 0x6b, 0xb0, + 0xc, 0x50, 0x10, 0x0, 0x0, 0x3, 0x9, 0x0, + 0x5, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x40, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0xb8, 0x6c, 0x6d, 0x0, 0x0, + 0x0, 0x0, 0x10, 0xe1, 0xd, 0x0, 0x0, 0x50, + 0x0, 0x0, 0x9, 0x80, 0xd, 0x0, 0x2, 0x70, + 0x0, 0x26, 0x84, 0x0, 0xd, 0xcc, 0xce, 0xa0, + 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+89AA "親" */ + 0x0, 0x4, 0x50, 0x0, 0x20, 0x0, 0x3, 0x0, + 0x0, 0x0, 0xc2, 0x31, 0xc6, 0x66, 0x6b, 0x50, + 0x3, 0x86, 0x78, 0xa4, 0xb0, 0x0, 0x9, 0x10, + 0x0, 0x54, 0x6, 0x70, 0xb6, 0x66, 0x6b, 0x10, + 0x0, 0xd, 0x7, 0x0, 0xb0, 0x0, 0x9, 0x10, + 0x7, 0x67, 0x88, 0x79, 0xb6, 0x66, 0x6b, 0x10, + 0x0, 0x0, 0xc0, 0x0, 0xb0, 0x0, 0x9, 0x10, + 0x0, 0x0, 0xc0, 0x40, 0xb0, 0x0, 0x9, 0x20, + 0x3, 0x76, 0xd6, 0x73, 0xb7, 0xa6, 0xab, 0x20, + 0x0, 0x30, 0xc1, 0x0, 0x54, 0x81, 0xa2, 0x0, + 0x0, 0xb5, 0xc2, 0x80, 0x6, 0x61, 0xa0, 0x0, + 0x3, 0x70, 0xc0, 0x79, 0xa, 0x21, 0xa0, 0x40, + 0x7, 0x10, 0xc0, 0x6, 0x39, 0x1, 0xa0, 0x70, + 0x0, 0x3c, 0xb0, 0x4, 0x60, 0x0, 0xcb, 0xe2, + 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + + /* U+89BA "覺" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x23, 0x8a, 0x13, 0x49, 0x46, 0x96, 0x0, + 0x0, 0x3b, 0x0, 0x7, 0xc7, 0x10, 0x84, 0x0, + 0x0, 0x1c, 0x69, 0x31, 0x4, 0x37, 0xc2, 0x0, + 0x0, 0xb, 0x4, 0x6, 0x8a, 0x0, 0xb1, 0x0, + 0x0, 0xd, 0x65, 0x36, 0x98, 0x27, 0xd0, 0x0, + 0x5, 0x7b, 0x66, 0x66, 0x67, 0x66, 0xb8, 0xb0, + 0x1e, 0x10, 0x74, 0x44, 0x44, 0x48, 0x18, 0x10, + 0x2, 0x0, 0xd2, 0x22, 0x22, 0x2c, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, + 0x0, 0x0, 0x50, 0xc1, 0xb, 0x4, 0x0, 0x50, + 0x0, 0x0, 0x8, 0x70, 0xb, 0x0, 0x0, 0x80, + 0x0, 0x15, 0x74, 0x0, 0xd, 0xbb, 0xbc, 0xd0, + 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+89C0 "è§€" */ + 0x0, 0x47, 0x9, 0x10, 0x20, 0x0, 0x3, 0x0, + 0x0, 0x57, 0xc, 0x33, 0xc6, 0x66, 0x6c, 0x40, + 0x7, 0x9a, 0x6d, 0x64, 0xc0, 0x0, 0xa, 0x0, + 0x2, 0x36, 0x25, 0x12, 0xc6, 0x66, 0x6c, 0x0, + 0xb, 0x6c, 0x6a, 0x97, 0xc0, 0x0, 0xa, 0x0, + 0xb, 0x5c, 0x4a, 0x85, 0xc6, 0x66, 0x6c, 0x0, + 0x4, 0x74, 0x80, 0x0, 0xc0, 0x0, 0xa, 0x0, + 0x0, 0xc1, 0x72, 0x30, 0xc0, 0x0, 0xa, 0x10, + 0x7, 0xb6, 0xa6, 0x83, 0xc7, 0xa7, 0xac, 0x10, + 0x19, 0xb6, 0xc6, 0x91, 0x44, 0x82, 0x92, 0x0, + 0x3, 0x90, 0xb1, 0x0, 0x6, 0x62, 0x90, 0x0, + 0x3, 0xb6, 0xc6, 0xa1, 0xa, 0x22, 0x90, 0x40, + 0x3, 0x90, 0xb1, 0x40, 0x39, 0x2, 0x90, 0x70, + 0x3, 0xa6, 0x66, 0x67, 0x60, 0x0, 0xdb, 0xd1, + 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + + /* U+89D2 "è§’" */ + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x76, 0x67, 0xc1, 0x0, 0x0, 0x0, + 0x9, 0x70, 0x0, 0x89, 0x10, 0x0, 0x0, 0x4, + 0xc0, 0x0, 0x8, 0x0, 0x2, 0x0, 0x2, 0xcd, + 0x66, 0x6b, 0x66, 0x68, 0xe0, 0x3, 0x80, 0xd0, + 0x0, 0xe0, 0x0, 0x3a, 0x0, 0x10, 0xe, 0x66, + 0x6e, 0x66, 0x68, 0xa0, 0x0, 0x0, 0xd0, 0x0, + 0xe0, 0x0, 0x3a, 0x0, 0x0, 0xd, 0x0, 0xe, + 0x0, 0x3, 0xa0, 0x0, 0x1, 0xd6, 0x66, 0xe6, + 0x66, 0x8a, 0x0, 0x0, 0x48, 0x0, 0xe, 0x0, + 0x3, 0xa0, 0x0, 0x9, 0x30, 0x0, 0xe0, 0x0, + 0x3a, 0x0, 0x3, 0xa0, 0x0, 0xe, 0x0, 0x3, + 0xa0, 0x2, 0x80, 0x0, 0x0, 0xe0, 0x49, 0xd9, + 0x0, 0x40, 0x0, 0x0, 0x1, 0x0, 0x7, 0x10, + + /* U+89E3 "è§£" */ + 0x0, 0x6, 0x60, 0x0, 0x0, 0x0, 0x2, 0x10, + 0x0, 0xc, 0x20, 0x0, 0x66, 0xd6, 0x6b, 0x60, + 0x0, 0x3c, 0x6c, 0x70, 0x3, 0xb0, 0x9, 0x30, + 0x0, 0xa2, 0xa, 0x0, 0xa, 0x40, 0xb, 0x20, + 0x4, 0xd6, 0x97, 0xa3, 0x58, 0x4, 0x9d, 0x0, + 0x15, 0xc0, 0xc0, 0xc3, 0x33, 0xa, 0x31, 0x0, + 0x0, 0xc1, 0xc1, 0xc0, 0xe, 0x2d, 0x0, 0x0, + 0x0, 0xd5, 0xd5, 0xd0, 0x6b, 0x6e, 0x6c, 0x30, + 0x0, 0xc0, 0xc0, 0xc0, 0xa0, 0xd, 0x0, 0x0, + 0x0, 0xd6, 0xd6, 0xd3, 0x10, 0xd, 0x0, 0x40, + 0x0, 0xb0, 0xc0, 0xc4, 0x76, 0x6e, 0x66, 0x81, + 0x2, 0x80, 0xc0, 0xc0, 0x0, 0xd, 0x0, 0x0, + 0x7, 0x20, 0xc0, 0xc0, 0x0, 0xd, 0x0, 0x0, + 0x7, 0x0, 0x56, 0xd0, 0x0, 0xe, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x40, 0x0, 0x5, 0x0, 0x0, + + /* U+89E6 "触" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x80, 0x0, 0x0, 0x9, 0x10, 0x0, + 0x0, 0xc, 0x31, 0x0, 0x0, 0xc, 0x0, 0x0, + 0x0, 0x3c, 0x6c, 0x80, 0x0, 0xc, 0x0, 0x0, + 0x0, 0xb2, 0xa, 0x0, 0x20, 0xc, 0x3, 0x0, + 0x6, 0xd6, 0x97, 0xc3, 0xb6, 0x6d, 0x6c, 0x40, + 0x14, 0xc0, 0xb0, 0xb0, 0xa1, 0xc, 0xa, 0x10, + 0x0, 0xc6, 0xc6, 0xd0, 0xa1, 0xc, 0xa, 0x10, + 0x0, 0xc0, 0xb0, 0xb0, 0xa1, 0xc, 0xa, 0x10, + 0x0, 0xc0, 0xb0, 0xb0, 0xb4, 0x3c, 0x3b, 0x10, + 0x0, 0xd6, 0xc6, 0xd0, 0x93, 0x3c, 0x37, 0x10, + 0x0, 0xb0, 0xb0, 0xb0, 0x0, 0xc, 0x11, 0x0, + 0x2, 0x80, 0xb0, 0xb0, 0x0, 0xc, 0x9, 0x10, + 0x7, 0x10, 0xb0, 0xb2, 0x45, 0x6d, 0x57, 0xb0, + 0x6, 0x0, 0x56, 0xe4, 0xb6, 0x30, 0x0, 0x90, + 0x10, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+8A00 "言" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7a, 0x0, 0x0, 0x10, 0x36, 0x66, 0x66, + 0x78, 0x66, 0x67, 0xe3, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa2, 0x0, 0x0, 0x27, 0x66, 0x66, 0x66, 0x64, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x37, 0x66, 0x66, 0x66, 0xa7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0x66, 0x66, 0x66, 0xd4, 0x0, 0x0, 0x1e, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1e, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x1e, 0x66, 0x66, 0x66, + 0xe1, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x10, 0x0, + + /* U+8A08 "計" */ + 0x0, 0x5, 0x50, 0x0, 0x0, 0xb, 0x10, 0x0, + 0x0, 0x0, 0xd3, 0x1, 0x0, 0xe, 0x0, 0x0, + 0x6, 0x66, 0xb6, 0x8c, 0x10, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x1, 0x44, 0x44, 0xa0, 0x0, 0xd, 0x0, 0x30, + 0x0, 0x32, 0x22, 0x22, 0x86, 0x6e, 0x66, 0x94, + 0x0, 0x0, 0x0, 0x60, 0x0, 0xd, 0x0, 0x0, + 0x1, 0x76, 0x66, 0x73, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0xd, 0x0, 0x0, + 0x3, 0xc6, 0x66, 0xe1, 0x0, 0xd, 0x0, 0x0, + 0x2, 0xa0, 0x0, 0xd0, 0x0, 0xd, 0x0, 0x0, + 0x2, 0xa0, 0x0, 0xd0, 0x0, 0xe, 0x0, 0x0, + 0x2, 0xc6, 0x66, 0xd0, 0x0, 0xe, 0x0, 0x0, + 0x3, 0xa0, 0x0, 0xd0, 0x0, 0x1e, 0x0, 0x0, + 0x1, 0x20, 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, + + /* U+8A0A "訊" */ + 0x0, 0x7, 0x30, 0x0, 0x0, 0x1, 0x50, 0x0, + 0x0, 0x2, 0xf0, 0x17, 0xd7, 0x68, 0xc0, 0x0, + 0x6, 0x66, 0xc6, 0xa4, 0xb2, 0x3, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb2, 0x3, 0x90, 0x0, + 0x1, 0x66, 0x68, 0x70, 0xb2, 0x3, 0x90, 0x0, + 0x0, 0x20, 0x0, 0x0, 0xb2, 0x3, 0x90, 0x0, + 0x0, 0x0, 0x4, 0x27, 0xd8, 0xc4, 0x90, 0x0, + 0x1, 0x76, 0x66, 0x40, 0xb2, 0x1, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0xb2, 0x0, 0xc0, 0x0, + 0x3, 0xc6, 0x68, 0xc0, 0xb2, 0x0, 0xd0, 0x0, + 0x2, 0xa0, 0x3, 0xa0, 0xb2, 0x0, 0xb2, 0x30, + 0x2, 0xa0, 0x3, 0xa0, 0xb2, 0x0, 0x68, 0x70, + 0x2, 0xc6, 0x67, 0xa0, 0xb2, 0x0, 0xd, 0xc0, + 0x3, 0xa0, 0x3, 0xa0, 0xb2, 0x0, 0x3, 0xe0, + 0x1, 0x20, 0x0, 0x0, 0x10, 0x0, 0x0, 0x10, + + /* U+8A0E "討" */ + 0x0, 0x6, 0x20, 0x0, 0x0, 0x1, 0xb1, 0x0, + 0x0, 0x1, 0xe1, 0x0, 0x0, 0x1, 0xe0, 0x0, + 0x6, 0x66, 0xc6, 0xa8, 0x0, 0x1, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xe0, 0x50, + 0x1, 0x66, 0x68, 0x94, 0x65, 0x56, 0xe6, 0x83, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, + 0x0, 0x0, 0x3, 0x11, 0x70, 0x1, 0xe0, 0x0, + 0x1, 0x76, 0x67, 0x50, 0x6a, 0x1, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0xe, 0x21, 0xe0, 0x0, + 0x3, 0xb6, 0x67, 0xd0, 0x3, 0x1, 0xe0, 0x0, + 0x2, 0xa0, 0x3, 0xa0, 0x0, 0x1, 0xe0, 0x0, + 0x2, 0xa0, 0x3, 0xa0, 0x0, 0x1, 0xe0, 0x0, + 0x2, 0xc6, 0x67, 0xa0, 0x2, 0x2, 0xe0, 0x0, + 0x3, 0xa0, 0x3, 0xa0, 0x3, 0xaf, 0xc0, 0x0, + 0x1, 0x20, 0x0, 0x10, 0x0, 0x6, 0x10, 0x0, + + /* U+8A13 "訓" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x30, 0x0, 0x74, 0x2, 0x0, 0xb0, + 0x0, 0x5, 0xc0, 0x10, 0xa4, 0xd, 0x20, 0xd0, + 0x6, 0x67, 0x86, 0x94, 0x93, 0xd, 0x0, 0xd0, + 0x0, 0x0, 0x0, 0x10, 0x93, 0xd, 0x0, 0xd0, + 0x1, 0x76, 0x67, 0x70, 0x93, 0xd, 0x0, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x93, 0xd, 0x0, 0xd0, + 0x0, 0x76, 0x69, 0x70, 0xa3, 0xd, 0x0, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0xb2, 0xd, 0x0, 0xd0, + 0x2, 0x86, 0x67, 0x90, 0xc0, 0xd, 0x0, 0xd0, + 0x3, 0xa0, 0x3, 0xa0, 0xc0, 0xd, 0x0, 0xd0, + 0x2, 0xa0, 0x3, 0xa3, 0x90, 0xd, 0x0, 0xd0, + 0x2, 0xa0, 0x3, 0xa9, 0x30, 0xd, 0x0, 0xd0, + 0x3, 0xc6, 0x67, 0xa8, 0x0, 0x8, 0x0, 0xd0, + 0x2, 0x40, 0x1, 0x80, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+8A18 "記" */ + 0x0, 0x8, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x6, 0xa0, 0x2, 0x76, 0x66, 0x6f, 0x30, + 0x7, 0x67, 0x96, 0xa5, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x1, 0x66, 0x66, 0xa0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x85, 0x55, 0x5e, 0x0, + 0x0, 0x0, 0x3, 0x30, 0xc1, 0x0, 0x9, 0x0, + 0x1, 0x76, 0x66, 0x50, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x20, 0xc1, 0x0, 0x0, 0x0, + 0x3, 0xc6, 0x66, 0xe0, 0xc1, 0x0, 0x0, 0x0, + 0x2, 0xa0, 0x0, 0xd0, 0xc1, 0x0, 0x0, 0x40, + 0x2, 0xa0, 0x0, 0xd0, 0xc1, 0x0, 0x0, 0x70, + 0x2, 0xc6, 0x66, 0xd0, 0xc2, 0x0, 0x0, 0xc0, + 0x3, 0xa0, 0x0, 0xd0, 0x5d, 0xdd, 0xde, 0xc1, + 0x1, 0x20, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+8A2A "訪" */ + 0x0, 0x54, 0x0, 0x0, 0x4, 0x70, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x0, 0xa9, 0x0, 0x0, + 0x37, 0x6b, 0x69, 0x70, 0x0, 0x37, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x7, 0x5b, 0x55, 0x58, 0x70, + 0x5, 0x66, 0x6a, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x0, 0x1e, 0x66, 0x6e, 0x20, + 0x5, 0x66, 0x66, 0x0, 0x2a, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x57, 0x0, 0xd, 0x0, + 0xb, 0x66, 0x6e, 0x10, 0x83, 0x0, 0xc, 0x0, + 0xb, 0x10, 0xd, 0x0, 0xb0, 0x0, 0x2b, 0x0, + 0xb, 0x10, 0xd, 0x4, 0x60, 0x0, 0x49, 0x0, + 0xb, 0x66, 0x6d, 0x9, 0x1, 0x30, 0x96, 0x0, + 0xc, 0x10, 0xc, 0x61, 0x0, 0x4e, 0xd0, 0x0, + 0x1, 0x0, 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, + + /* U+8A2D "設" */ + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x68, 0x0, 0x0, 0x96, 0x6b, 0x40, 0x0, + 0x0, 0xd, 0x22, 0x0, 0xe0, 0xb, 0x20, 0x0, + 0x37, 0x69, 0x69, 0x50, 0xd0, 0xb, 0x20, 0x0, + 0x0, 0x0, 0x1, 0x0, 0xc0, 0xb, 0x20, 0x0, + 0x6, 0x66, 0x69, 0x5, 0x70, 0xa, 0x42, 0x30, + 0x0, 0x0, 0x0, 0xa, 0x0, 0x4, 0xaa, 0x70, + 0x3, 0x66, 0x79, 0x56, 0x66, 0x66, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x50, 0x3, 0xf5, 0x0, + 0x3, 0x0, 0x4, 0x0, 0x60, 0xa, 0x90, 0x0, + 0xb, 0x66, 0x6d, 0x0, 0x27, 0x3d, 0x0, 0x0, + 0xb, 0x10, 0x1c, 0x0, 0xa, 0xc2, 0x0, 0x0, + 0xb, 0x10, 0x1c, 0x0, 0xa, 0xc1, 0x0, 0x0, + 0xb, 0x66, 0x6c, 0x0, 0x93, 0x4d, 0x40, 0x0, + 0xb, 0x10, 0x8, 0x38, 0x10, 0x4, 0xec, 0x71, + 0x1, 0x0, 0x2, 0x20, 0x0, 0x0, 0x18, 0x10, + + /* U+8A31 "許" */ + 0x0, 0x46, 0x0, 0x0, 0x48, 0x0, 0x0, 0x0, + 0x0, 0xd5, 0x0, 0x7, 0x70, 0x0, 0x0, 0x27, + 0x6a, 0x77, 0x80, 0xb1, 0x0, 0x12, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0x6a, 0x67, 0x80, 0x4, 0x66, + 0x79, 0x7, 0x20, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x70, 0xc, 0x10, 0x0, 0x3, 0x66, 0x78, + 0x30, 0x0, 0xc1, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x22, 0x2d, 0x32, 0x95, 0x2, 0x0, 0x4, 0x5, + 0x33, 0xd4, 0x33, 0x30, 0xb6, 0x66, 0xe0, 0x0, + 0xc, 0x10, 0x0, 0xb, 0x10, 0x1c, 0x0, 0x0, + 0xc1, 0x0, 0x0, 0xb1, 0x1, 0xc0, 0x0, 0xc, + 0x10, 0x0, 0xb, 0x66, 0x6c, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0xc1, 0x0, 0x90, 0x0, 0xd, 0x10, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, + 0x0, + + /* U+8A33 "訳" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x75, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x1d, 0x1, 0x1a, 0x76, 0x66, 0x6e, 0x20, + 0x37, 0x67, 0x67, 0x5a, 0x30, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x2, 0xa, 0x30, 0x0, 0xd, 0x0, + 0x4, 0x76, 0x66, 0xa, 0x30, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x87, 0x66, 0x6e, 0x0, + 0x4, 0x66, 0x78, 0xa, 0x34, 0x20, 0x3, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x21, 0x60, 0x0, 0x0, + 0x8, 0x66, 0x6a, 0xb, 0x10, 0x90, 0x0, 0x0, + 0xc, 0x0, 0xd, 0xc, 0x0, 0xa1, 0x0, 0x0, + 0xc, 0x0, 0xd, 0xb, 0x0, 0x49, 0x0, 0x0, + 0xc, 0x0, 0xd, 0x47, 0x0, 0xc, 0x40, 0x0, + 0xc, 0x66, 0x6d, 0x91, 0x0, 0x2, 0xe3, 0x0, + 0x7, 0x0, 0x4, 0x60, 0x0, 0x0, 0x6f, 0x90, + 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0x10, + + /* U+8A34 "訴" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x80, 0x0, 0x0, 0x0, 0x29, 0x60, 0x0, + 0xd, 0x30, 0x10, 0xa7, 0x99, 0x64, 0x2, 0x76, + 0x86, 0x77, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x37, 0x66, + 0x80, 0xe, 0x66, 0x66, 0xa8, 0x0, 0x0, 0x0, + 0x0, 0xd0, 0xc, 0x20, 0x0, 0x37, 0x66, 0x90, + 0xd, 0x10, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xc0, 0x6e, 0x60, 0x0, 0x76, 0x66, 0xa1, 0x3a, + 0x0, 0xc9, 0xe3, 0xa, 0x20, 0xd, 0x5, 0x70, + 0xc, 0x25, 0x90, 0xa2, 0x0, 0xd0, 0xa2, 0x0, + 0xc2, 0x0, 0xa, 0x20, 0xd, 0x1b, 0x0, 0xc, + 0x20, 0x0, 0xa7, 0x66, 0xd8, 0x20, 0x0, 0xc2, + 0x0, 0x8, 0x10, 0x5, 0x50, 0x0, 0xc, 0x20, + 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x10, 0x0, + + /* U+8A55 "è©•" */ + 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, + 0x0, 0xd, 0x40, 0x4, 0x66, 0xd6, 0x66, 0x20, + 0x27, 0x6a, 0x79, 0x64, 0x0, 0xc1, 0x8, 0x20, + 0x0, 0x0, 0x0, 0x5, 0x90, 0xc1, 0x1e, 0x20, + 0x4, 0x66, 0x78, 0x0, 0xe3, 0xc1, 0x66, 0x0, + 0x1, 0x0, 0x0, 0x0, 0xa3, 0xc1, 0x80, 0x0, + 0x0, 0x0, 0x23, 0x0, 0x0, 0xc2, 0x11, 0x10, + 0x5, 0x66, 0x64, 0x27, 0x66, 0xd6, 0x6a, 0x90, + 0x1, 0x0, 0x2, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0xc, 0x66, 0x6e, 0x10, 0x0, 0xc1, 0x0, 0x0, + 0xb, 0x10, 0xd, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0xb, 0x10, 0xd, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0xb, 0x66, 0x6d, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0xc, 0x10, 0xd, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x2, 0x0, 0x1, 0x0, 0x0, 0x20, 0x0, 0x0, + + /* U+8A66 "試" */ + 0x0, 0x53, 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, + 0x0, 0xe2, 0x0, 0x0, 0xc, 0x19, 0x70, 0x26, + 0x6b, 0x68, 0x80, 0x0, 0xc1, 0xb, 0x0, 0x0, + 0x0, 0x4, 0x55, 0x5d, 0x55, 0xb4, 0x4, 0x66, + 0x78, 0x10, 0x0, 0xb1, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, 0x12, + 0x24, 0x49, 0x94, 0x0, 0x0, 0x56, 0x66, 0x61, + 0x2d, 0x27, 0x60, 0x0, 0x0, 0x0, 0x1, 0x0, + 0xd0, 0x48, 0x0, 0x0, 0xb6, 0x66, 0xe0, 0xd, + 0x0, 0xc0, 0x0, 0xb, 0x10, 0x1c, 0x0, 0xd0, + 0x2b, 0x20, 0x20, 0xb1, 0x1, 0xc2, 0x7d, 0x60, + 0x4a, 0x24, 0xb, 0x66, 0x6c, 0x57, 0x0, 0x0, + 0xbc, 0x40, 0xb1, 0x1, 0xc0, 0x0, 0x0, 0x1, + 0xb7, 0x4, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x10, + + /* U+8A71 "話" */ + 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, 0x6, 0x20, + 0x0, 0xe, 0x20, 0x3, 0x57, 0x9b, 0xdc, 0x70, + 0x27, 0x6a, 0x68, 0x61, 0x11, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x3, 0x44, 0x56, 0x0, 0x0, 0xd0, 0x2, 0x70, + 0x2, 0x22, 0x21, 0x46, 0x66, 0xe6, 0x66, 0x50, + 0x0, 0x0, 0x13, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x5, 0x66, 0x64, 0x1, 0x0, 0xd0, 0x2, 0x0, + 0x1, 0x0, 0x2, 0xd, 0x66, 0x96, 0x7e, 0x0, + 0xb, 0x66, 0x7d, 0xd, 0x0, 0x0, 0x1c, 0x0, + 0xb, 0x10, 0x1c, 0xd, 0x0, 0x0, 0x1c, 0x0, + 0xb, 0x10, 0x1c, 0xd, 0x0, 0x0, 0x1c, 0x0, + 0xb, 0x66, 0x6c, 0xd, 0x66, 0x66, 0x6c, 0x0, + 0xb, 0x10, 0x1b, 0xd, 0x0, 0x0, 0x1c, 0x0, + 0x1, 0x0, 0x0, 0x2, 0x0, 0x0, 0x1, 0x0, + + /* U+8A72 "該" */ + 0x0, 0x52, 0x0, 0x0, 0x7, 0x40, 0x0, 0x0, + 0x0, 0x1e, 0x20, 0x0, 0x0, 0xe3, 0x0, 0x0, + 0x26, 0x6c, 0x68, 0x80, 0x0, 0x42, 0x1, 0x60, + 0x0, 0x0, 0x0, 0x17, 0x67, 0x96, 0x66, 0x71, + 0x4, 0x66, 0x78, 0x0, 0xa, 0x90, 0x10, 0x0, + 0x1, 0x10, 0x0, 0x0, 0x78, 0x0, 0x8c, 0x0, + 0x0, 0x0, 0x12, 0xa, 0xa6, 0x77, 0xe3, 0x0, + 0x5, 0x66, 0x66, 0x7, 0x74, 0x2c, 0x30, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x1, 0xb3, 0x1e, 0x30, + 0xb, 0x66, 0x6e, 0x0, 0x49, 0x10, 0xb9, 0x0, + 0xb, 0x10, 0x1c, 0x26, 0x30, 0x9, 0x90, 0x0, + 0xb, 0x10, 0x1c, 0x0, 0x0, 0xa8, 0x96, 0x0, + 0xb, 0x66, 0x6c, 0x0, 0x2b, 0x50, 0xa, 0xa0, + 0xc, 0x10, 0x1c, 0x7, 0x81, 0x0, 0x1, 0xf0, + 0x4, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x20, + + /* U+8A73 "詳" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x45, 0x0, 0x1, 0x50, 0x0, 0xb7, 0x0, + 0x0, 0xe, 0x30, 0x10, 0x87, 0x1, 0xd1, 0x0, + 0x27, 0x69, 0x68, 0x80, 0x2d, 0x6, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x36, 0x68, 0x6b, 0x6a, 0x90, + 0x4, 0x66, 0x79, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x1, 0x0, + 0x0, 0x0, 0x23, 0x4, 0x76, 0xe6, 0x8a, 0x0, + 0x5, 0x66, 0x64, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x1, 0x0, 0x2, 0x0, 0x0, 0xe0, 0x0, 0x10, + 0xb, 0x65, 0x6e, 0x47, 0x66, 0xe6, 0x69, 0xa0, + 0xb, 0x10, 0x1c, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0xb, 0x10, 0x1c, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0xb, 0x66, 0x6c, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0xb, 0x10, 0x9, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, + + /* U+8A8C "誌" */ + 0x0, 0x64, 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, + 0x0, 0xf, 0x20, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x27, 0x6b, 0x68, 0x70, 0x0, 0xd0, 0x3, 0x10, + 0x0, 0x0, 0x0, 0x17, 0x55, 0xe5, 0x59, 0x70, + 0x4, 0x66, 0x78, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x1, 0x10, 0x0, 0x0, 0x0, 0xd0, 0x3, 0x0, + 0x0, 0x0, 0x13, 0x4, 0x76, 0x96, 0x79, 0x0, + 0x5, 0x66, 0x65, 0x0, 0x2, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x20, 0xb4, 0x0, 0x0, + 0xb, 0x66, 0x6e, 0x2, 0xd2, 0x4c, 0x6, 0x0, + 0xb, 0x10, 0x1c, 0x16, 0xd0, 0x1, 0x5, 0xd0, + 0xb, 0x10, 0x1c, 0x86, 0xd0, 0x0, 0x50, 0xb2, + 0xb, 0x66, 0x6c, 0xa1, 0xc2, 0x0, 0xa1, 0x0, + 0xb, 0x10, 0x1c, 0x0, 0x5b, 0xcc, 0xa1, 0x0, + 0x4, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8A8D "èª" */ + 0x0, 0x56, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0xd, 0x30, 0x4, 0x77, 0x86, 0x6d, 0x40, + 0x27, 0x69, 0x68, 0x61, 0x6, 0x70, 0xd, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x9, 0x50, 0xd, 0x0, + 0x4, 0x66, 0x78, 0x2d, 0xd, 0x0, 0xe, 0x0, + 0x1, 0x10, 0x0, 0x12, 0x68, 0x0, 0x3c, 0x0, + 0x0, 0x0, 0x12, 0x2, 0xb0, 0x38, 0xb7, 0x0, + 0x5, 0x66, 0x64, 0x17, 0x1, 0x43, 0x80, 0x0, + 0x2, 0x0, 0x2, 0x0, 0x20, 0x95, 0x0, 0x0, + 0xb, 0x66, 0x6e, 0x2, 0xd2, 0x4a, 0x14, 0x0, + 0xb, 0x10, 0x1c, 0x26, 0xd0, 0x0, 0x7, 0x80, + 0xb, 0x10, 0x1c, 0xa5, 0xd0, 0x0, 0x60, 0xc0, + 0xb, 0x66, 0x6c, 0x60, 0xc2, 0x0, 0xc1, 0x0, + 0xb, 0x10, 0x1c, 0x0, 0x4b, 0xcc, 0xa1, 0x0, + 0x3, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8A95 "誕" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x81, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x4a, 0x4, 0x76, 0xd1, 0x15, 0xad, 0x50, + 0x27, 0x69, 0x97, 0x5, 0xa0, 0x43, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0xc0, 0x0, + 0x5, 0x66, 0xa1, 0x2c, 0x0, 0x60, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xa5, 0x20, 0xc0, 0xd8, 0x50, + 0x4, 0x66, 0xa2, 0xb6, 0xd6, 0xc0, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe1, 0xc0, 0xc0, 0x0, + 0x7, 0x66, 0xa5, 0x11, 0xd0, 0xc0, 0xc0, 0x0, + 0xa, 0x10, 0xa3, 0x86, 0x70, 0xc0, 0xc1, 0x0, + 0xa, 0x10, 0xa2, 0x5e, 0x11, 0xc6, 0x98, 0x60, + 0xa, 0x10, 0xa2, 0x6b, 0xa0, 0x0, 0x0, 0x0, + 0xa, 0x66, 0xb4, 0x90, 0x5d, 0xa6, 0x43, 0x30, + 0x5, 0x0, 0x27, 0x0, 0x0, 0x5a, 0xdf, 0x60, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8A98 "誘" */ + 0x0, 0x82, 0x0, 0x0, 0x0, 0x37, 0xc6, 0x0, + 0x0, 0x3b, 0x10, 0x5, 0x78, 0xe5, 0x43, 0x0, + 0x27, 0x68, 0x87, 0x0, 0x0, 0xd0, 0x2, 0x10, + 0x0, 0x0, 0x10, 0x66, 0x6a, 0xe7, 0x68, 0x70, + 0x5, 0x66, 0xa1, 0x0, 0x4b, 0xd6, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xa0, 0xd0, 0xc3, 0x0, + 0x5, 0x65, 0xa1, 0x76, 0x0, 0xe0, 0x2d, 0x90, + 0x0, 0x0, 0x2, 0x15, 0x66, 0x86, 0x91, 0x10, + 0x8, 0x55, 0xa3, 0x2, 0x4a, 0x2, 0xc1, 0x0, + 0xb, 0x10, 0xb2, 0x0, 0x68, 0x8, 0x62, 0x20, + 0xb, 0x10, 0xb2, 0x0, 0xb4, 0x7, 0x6b, 0x90, + 0xb, 0x10, 0xb2, 0x2, 0xc0, 0x0, 0xa, 0x40, + 0xc, 0x66, 0xc2, 0x1b, 0x20, 0x0, 0xd, 0x10, + 0x6, 0x0, 0x14, 0x81, 0x0, 0x39, 0xc9, 0x0, + 0x0, 0x0, 0x21, 0x0, 0x0, 0x2, 0x60, 0x0, + + /* U+8A9E "語" */ + 0x0, 0x53, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0xe, 0x20, 0x37, 0x6b, 0x66, 0x79, 0x0, + 0x26, 0x6b, 0x6a, 0x30, 0x3c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x9c, 0x55, 0xc1, 0x0, + 0x4, 0x66, 0x77, 0x0, 0x77, 0x0, 0xe0, 0x0, + 0x1, 0x10, 0x0, 0x0, 0x95, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0x12, 0x11, 0xb5, 0x12, 0xd3, 0x90, + 0x5, 0x66, 0x65, 0x45, 0x55, 0x55, 0x55, 0x50, + 0x0, 0x0, 0x1, 0x4, 0x11, 0x11, 0x26, 0x0, + 0xb, 0x66, 0x6d, 0xb, 0x75, 0x55, 0x7c, 0x0, + 0xb, 0x10, 0x1c, 0xb, 0x30, 0x0, 0x3a, 0x0, + 0xb, 0x10, 0x1c, 0xb, 0x30, 0x0, 0x3a, 0x0, + 0xb, 0x66, 0x6c, 0xb, 0x76, 0x66, 0x8b, 0x0, + 0xb, 0x10, 0xb, 0xb, 0x20, 0x0, 0x3a, 0x0, + 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + + /* U+8AAA "說" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x44, 0x0, 0x0, 0xc, 0x27, 0x0, 0x0, + 0x0, 0xd, 0x30, 0x0, 0x69, 0x8, 0x10, 0x0, + 0x27, 0x6a, 0x69, 0x70, 0xc0, 0x2, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x30, 0x0, 0x7c, 0x20, + 0x4, 0x66, 0x79, 0x54, 0xa6, 0x66, 0x9e, 0x70, + 0x1, 0x0, 0x0, 0x10, 0xd0, 0x0, 0x75, 0x0, + 0x0, 0x0, 0x13, 0x0, 0xd0, 0x0, 0x75, 0x0, + 0x5, 0x66, 0x65, 0x0, 0xd0, 0x0, 0x76, 0x0, + 0x1, 0x0, 0x2, 0x0, 0xe9, 0x7a, 0xa5, 0x0, + 0xb, 0x66, 0x6f, 0x10, 0x1a, 0x2d, 0x0, 0x0, + 0xb, 0x10, 0xd, 0x0, 0xc, 0xd, 0x0, 0x0, + 0xb, 0x10, 0xd, 0x0, 0x2a, 0xd, 0x0, 0x40, + 0xb, 0x66, 0x6d, 0x0, 0x92, 0xd, 0x0, 0x70, + 0xb, 0x10, 0xc, 0x7, 0x30, 0xa, 0xbc, 0xa0, + 0x1, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, + + /* U+8AAC "説" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x64, 0x0, 0x3, 0x40, 0x0, 0xd3, 0x0, + 0x0, 0xf, 0x20, 0x0, 0xb3, 0x5, 0xb0, 0x0, + 0x27, 0x6b, 0x6a, 0x30, 0x79, 0xa, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x55, 0x58, 0x58, 0x0, + 0x5, 0x66, 0x6a, 0xd, 0x22, 0x22, 0x4b, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x3a, 0x0, + 0x4, 0x66, 0x69, 0xd, 0x0, 0x0, 0x3a, 0x0, + 0x1, 0x10, 0x0, 0xd, 0x55, 0x55, 0x7a, 0x0, + 0x3, 0x0, 0x6, 0xb, 0x3b, 0x1d, 0x33, 0x0, + 0xb, 0x66, 0x6e, 0x0, 0x2a, 0xd, 0x0, 0x0, + 0xb, 0x10, 0xd, 0x0, 0x48, 0xd, 0x0, 0x30, + 0xb, 0x10, 0xd, 0x0, 0xa3, 0xd, 0x0, 0x60, + 0xb, 0x66, 0x6d, 0x5, 0x80, 0xd, 0x0, 0xa0, + 0x9, 0x0, 0x4, 0x77, 0x0, 0xa, 0xbb, 0xd1, + 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+8AAD "読" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x72, 0x0, 0x0, 0x1, 0xc0, 0x0, 0x0, + 0x0, 0x3a, 0x1, 0x0, 0x1, 0xd0, 0x2, 0x0, + 0x27, 0x68, 0x87, 0x57, 0x66, 0xe6, 0x6a, 0x60, + 0x0, 0x0, 0x10, 0x0, 0x1, 0xd0, 0x0, 0x0, + 0x5, 0x66, 0x93, 0x6, 0x66, 0xa6, 0x6a, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x10, + 0x5, 0x66, 0xa3, 0x68, 0x66, 0x66, 0x6a, 0xc0, + 0x0, 0x0, 0x0, 0xd1, 0x41, 0x3, 0x8, 0x10, + 0x8, 0x66, 0xa3, 0x0, 0xa6, 0xe, 0x10, 0x0, + 0xc, 0x10, 0xb2, 0x0, 0xb3, 0xd, 0x0, 0x0, + 0xb, 0x10, 0xb2, 0x0, 0xe0, 0xd, 0x0, 0x40, + 0xb, 0x10, 0xb2, 0x4, 0xa0, 0xd, 0x0, 0x50, + 0xc, 0x66, 0xc2, 0x1c, 0x10, 0xd, 0x2, 0x70, + 0x7, 0x0, 0x22, 0x92, 0x0, 0x9, 0xcd, 0xa0, + 0x0, 0x0, 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8AB0 "誰" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x64, 0x0, 0x0, 0x69, 0x53, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0xb3, 0xd, 0x40, 0x0, + 0x37, 0x6b, 0x6a, 0x61, 0xc0, 0x4, 0x14, 0x40, + 0x0, 0x0, 0x0, 0x6, 0xc6, 0x6d, 0x66, 0x50, + 0x5, 0x66, 0x78, 0xc, 0xb0, 0x1c, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x66, 0xb0, 0x1c, 0x4, 0x0, + 0x0, 0x0, 0x13, 0x52, 0xc6, 0x6d, 0x68, 0x50, + 0x6, 0x66, 0x65, 0x2, 0xb0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x2, 0xb0, 0x1c, 0x0, 0x0, + 0xb, 0x66, 0x6e, 0x2, 0xc6, 0x6d, 0x6b, 0x50, + 0xb, 0x10, 0x1c, 0x2, 0xb0, 0x1c, 0x0, 0x0, + 0xb, 0x10, 0x1c, 0x2, 0xb0, 0x1c, 0x0, 0x0, + 0xb, 0x76, 0x6c, 0x2, 0xb0, 0x1c, 0x3, 0x70, + 0xb, 0x10, 0x1c, 0x2, 0xc6, 0x66, 0x66, 0x50, + 0x4, 0x0, 0x1, 0x1, 0x30, 0x0, 0x0, 0x0, + + /* U+8AB2 "課" */ + 0x0, 0x52, 0x0, 0x4, 0x0, 0x0, 0x5, 0x0, + 0x0, 0x1f, 0x0, 0xd, 0x66, 0xe6, 0x7d, 0x0, + 0x27, 0x6b, 0x6a, 0x2d, 0x0, 0xd0, 0x2b, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x66, 0xe6, 0x7b, 0x0, + 0x5, 0x66, 0x88, 0xd, 0x0, 0xd0, 0x2b, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x66, 0xe6, 0x7b, 0x0, + 0x4, 0x66, 0x87, 0x7, 0x0, 0xd0, 0x14, 0x0, + 0x1, 0x0, 0x0, 0x11, 0x11, 0xd1, 0x14, 0x70, + 0x7, 0x66, 0x69, 0x34, 0x3e, 0xe8, 0x33, 0x30, + 0xa, 0x20, 0x3a, 0x0, 0x4a, 0xd8, 0x0, 0x0, + 0xa, 0x20, 0x3a, 0x0, 0xc2, 0xd4, 0x70, 0x0, + 0xa, 0x20, 0x3a, 0x8, 0x50, 0xd0, 0xb3, 0x0, + 0xa, 0x76, 0x7a, 0x66, 0x0, 0xd0, 0x2e, 0x80, + 0x6, 0x10, 0x5, 0x30, 0x0, 0xe0, 0x2, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, + + /* U+8ABF "調" */ + 0x0, 0x83, 0x0, 0x4, 0x0, 0x0, 0x1, 0x60, + 0x0, 0x2f, 0x0, 0xe, 0x66, 0xa8, 0x67, 0xc0, + 0x27, 0x6a, 0x6a, 0x3d, 0x0, 0x84, 0x3, 0xa0, + 0x0, 0x0, 0x0, 0xd, 0x17, 0xb8, 0xa4, 0xa0, + 0x5, 0x76, 0x6a, 0xd, 0x0, 0x84, 0x3, 0xa0, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x84, 0x44, 0xa0, + 0x2, 0x33, 0x37, 0xd, 0x66, 0x66, 0x66, 0xa0, + 0x2, 0x32, 0x22, 0xc, 0x8, 0x66, 0x93, 0xa0, + 0x3, 0x0, 0x4, 0xc, 0xc, 0x1, 0xb3, 0xa0, + 0xc, 0x66, 0x6e, 0x2b, 0xc, 0x1, 0xb3, 0xa0, + 0xb, 0x10, 0x1c, 0x48, 0xd, 0x66, 0xb3, 0xa0, + 0xb, 0x10, 0x1c, 0x83, 0x6, 0x0, 0x43, 0xa0, + 0xc, 0x66, 0x6a, 0xa0, 0x0, 0x3, 0x36, 0x90, + 0x4, 0x0, 0x5, 0x20, 0x0, 0x0, 0x5e, 0x50, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+8AC7 "談" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x93, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, + 0x0, 0x2f, 0x1, 0x0, 0x5a, 0x30, 0x4e, 0x20, + 0x37, 0x69, 0x6a, 0x34, 0x8a, 0x39, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0x3b, 0xb2, 0x0, 0x0, + 0x6, 0x66, 0x97, 0x1, 0x1f, 0x77, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa8, 0x1, 0xb9, 0x0, + 0x5, 0x66, 0x96, 0x19, 0x58, 0x60, 0xb, 0x0, + 0x1, 0x0, 0x0, 0x20, 0x9, 0x60, 0x2, 0x0, + 0x3, 0x0, 0x5, 0x0, 0x7b, 0x70, 0x9e, 0x10, + 0xb, 0x66, 0x6e, 0x1c, 0x4d, 0x99, 0x40, 0x0, + 0xb, 0x10, 0x1c, 0x26, 0x2c, 0x72, 0x0, 0x0, + 0xb, 0x10, 0x1c, 0x0, 0xa5, 0x1b, 0x0, 0x0, + 0xb, 0x66, 0x6c, 0x4, 0xa0, 0x9, 0xa1, 0x0, + 0xc, 0x10, 0x9, 0x58, 0x0, 0x0, 0xce, 0x81, + 0x2, 0x0, 0x5, 0x30, 0x0, 0x0, 0x7, 0x20, + + /* U+8ACB "è«‹" */ + 0x0, 0x63, 0x0, 0x0, 0x0, 0xa1, 0x0, 0x0, + 0x0, 0xf, 0x10, 0x0, 0x0, 0xd0, 0x3, 0x10, + 0x26, 0x5a, 0x5a, 0x47, 0x66, 0xe6, 0x68, 0x60, + 0x0, 0x0, 0x0, 0x5, 0x66, 0xe6, 0x6b, 0x10, + 0x5, 0x76, 0x7a, 0x1, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x46, 0x66, 0xe6, 0x69, 0xc0, + 0x0, 0x0, 0x14, 0x11, 0x0, 0x0, 0x2, 0x0, + 0x5, 0x66, 0x65, 0xb, 0x66, 0x66, 0x6e, 0x10, + 0x1, 0x0, 0x2, 0xb, 0x21, 0x11, 0x1d, 0x0, + 0xb, 0x66, 0x6e, 0xb, 0x65, 0x55, 0x5d, 0x0, + 0xb, 0x10, 0x1c, 0xb, 0x76, 0x66, 0x6d, 0x0, + 0xb, 0x10, 0x1c, 0xb, 0x20, 0x0, 0xd, 0x0, + 0xb, 0x66, 0x6c, 0xb, 0x20, 0x0, 0xd, 0x0, + 0x8, 0x0, 0x6, 0xb, 0x20, 0x18, 0xeb, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x41, 0x0, + + /* U+8AD6 "è«–" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x61, 0x0, 0x0, 0x2, 0xc1, 0x0, 0x0, + 0x0, 0x2c, 0x0, 0x0, 0x9, 0xc0, 0x0, 0x0, + 0x27, 0x6b, 0x6c, 0x30, 0x2d, 0x26, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb3, 0x9, 0x30, 0x0, + 0x3, 0x44, 0x92, 0xa, 0x40, 0x3, 0xd5, 0x0, + 0x2, 0x22, 0x22, 0x93, 0x76, 0x6a, 0x7d, 0xb1, + 0x0, 0x0, 0x44, 0x2, 0x0, 0x0, 0x4, 0x10, + 0x5, 0x66, 0x62, 0xd, 0x6c, 0x6c, 0x6d, 0x20, + 0x1, 0x0, 0x20, 0xc, 0xc, 0xc, 0xc, 0x0, + 0xa, 0x65, 0xd5, 0xd, 0x6d, 0x6d, 0x6d, 0x0, + 0xa, 0x10, 0xb1, 0xc, 0xc, 0xc, 0xc, 0x0, + 0xa, 0x10, 0xb1, 0xc, 0xc, 0xc, 0xc, 0x0, + 0xa, 0x66, 0xc1, 0xc, 0xb, 0x9, 0xc, 0x0, + 0xb, 0x10, 0xa1, 0xc, 0x0, 0x4, 0x9e, 0x0, + 0x3, 0x0, 0x10, 0x2, 0x0, 0x0, 0x34, 0x0, + + /* U+8AF8 "諸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x73, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0x1c, 0x1, 0x0, 0xd, 0x0, 0xb, 0x70, + 0x27, 0x68, 0x78, 0x26, 0x6e, 0x6c, 0x6d, 0x0, + 0x0, 0x0, 0x10, 0x2, 0xd, 0x0, 0xc3, 0x0, + 0x5, 0x66, 0xa2, 0x0, 0xd, 0x9, 0x61, 0x10, + 0x0, 0x0, 0x1, 0x76, 0x6a, 0xad, 0x69, 0x90, + 0x5, 0x66, 0xb1, 0x0, 0x7, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xa7, 0x0, 0x5, 0x0, + 0x3, 0x0, 0x40, 0x1d, 0x76, 0x66, 0x8d, 0x0, + 0xa, 0x76, 0xc8, 0x6b, 0x20, 0x0, 0x3a, 0x0, + 0xa, 0x20, 0xb2, 0xb, 0x76, 0x66, 0x7a, 0x0, + 0xa, 0x20, 0xb2, 0xb, 0x20, 0x0, 0x3a, 0x0, + 0xa, 0x75, 0xc2, 0xb, 0x76, 0x66, 0x7a, 0x0, + 0x7, 0x10, 0x61, 0xa, 0x10, 0x0, 0x28, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8B02 "謂" */ + 0x0, 0x56, 0x0, 0x3, 0x0, 0x0, 0x1, 0x30, + 0x0, 0xe, 0x31, 0xe, 0x66, 0xe6, 0x69, 0xb0, + 0x37, 0x59, 0x58, 0x5d, 0x0, 0xd0, 0x5, 0x80, + 0x0, 0x0, 0x1, 0xd, 0x66, 0xe6, 0x69, 0x80, + 0x6, 0x66, 0x6a, 0xd, 0x0, 0xd0, 0x5, 0x80, + 0x0, 0x0, 0x0, 0xe, 0x66, 0x86, 0x69, 0x70, + 0x5, 0x66, 0x6b, 0x4, 0x10, 0x0, 0x5, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xb6, 0x66, 0x6e, 0x10, + 0x7, 0x66, 0x6a, 0x4, 0xb5, 0x55, 0x5d, 0x0, + 0xb, 0x10, 0xd, 0x4, 0x80, 0x0, 0xd, 0x0, + 0xb, 0x10, 0xd, 0x4, 0xb6, 0x66, 0x6d, 0x0, + 0xb, 0x10, 0xd, 0x4, 0x80, 0x0, 0xd, 0x0, + 0xc, 0x66, 0x6d, 0x4, 0x80, 0x0, 0xd, 0x0, + 0xa, 0x0, 0x9, 0x4, 0x80, 0x17, 0xda, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x30, 0x0, + + /* U+8B1B "講" */ + 0x0, 0x61, 0x0, 0x0, 0x83, 0x4, 0x60, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0xa2, 0x5, 0x62, 0x40, + 0x26, 0x5b, 0x69, 0x66, 0xc7, 0x69, 0xa6, 0x50, + 0x0, 0x0, 0x0, 0x16, 0xc7, 0x69, 0xa9, 0x30, + 0x5, 0x66, 0xb2, 0x2, 0xa2, 0x5, 0x60, 0x20, + 0x0, 0x0, 0x1, 0x76, 0x96, 0x77, 0x86, 0xa2, + 0x2, 0x33, 0x81, 0x2, 0x0, 0xd1, 0x4, 0x0, + 0x3, 0x33, 0x31, 0xc, 0x66, 0xd6, 0x6d, 0x0, + 0x4, 0x11, 0x60, 0xc, 0x0, 0xc0, 0xb, 0x0, + 0xc, 0x55, 0xd2, 0xc, 0x66, 0xd6, 0x6b, 0x0, + 0xc, 0x0, 0xc0, 0xc, 0x0, 0xc0, 0xb, 0x50, + 0xc, 0x0, 0xc1, 0x7d, 0x66, 0x76, 0x6d, 0x61, + 0xc, 0x66, 0xd0, 0xc, 0x0, 0x0, 0xb, 0x0, + 0x9, 0x0, 0x50, 0xc, 0x0, 0x6, 0xba, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x42, 0x0, + + /* U+8B1D "è¬" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x70, 0x0, 0x3, 0xa0, 0x0, 0x9, 0x0, + 0x0, 0x6a, 0x0, 0x6, 0x22, 0x0, 0xc, 0x0, + 0x26, 0x7a, 0x96, 0xc7, 0x6d, 0x10, 0xc, 0x0, + 0x0, 0x0, 0x0, 0xc0, 0xc, 0x0, 0xc, 0x20, + 0x5, 0x66, 0xa0, 0xc6, 0x6d, 0x47, 0x6e, 0x90, + 0x1, 0x0, 0x0, 0xc0, 0xc, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x50, 0xc6, 0x6d, 0x34, 0xc, 0x0, + 0x5, 0x66, 0x61, 0xc0, 0xc, 0xb, 0x4c, 0x0, + 0x2, 0x0, 0x25, 0xb5, 0x8d, 0x5, 0x5c, 0x0, + 0xa, 0x66, 0xd1, 0x1, 0xcc, 0x0, 0xc, 0x0, + 0xa, 0x10, 0xc0, 0x9, 0x3c, 0x0, 0xc, 0x0, + 0xa, 0x10, 0xc0, 0x47, 0xc, 0x0, 0xc, 0x0, + 0xa, 0x66, 0xd3, 0x70, 0xc, 0x1, 0x1c, 0x0, + 0x7, 0x0, 0x44, 0x3, 0xbd, 0x5, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x20, 0x0, + + /* U+8B58 "è­˜" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x15, 0x0, 0x0, 0x80, 0x0, 0xa2, 0x0, 0x0, + 0xb5, 0x0, 0x8, 0x52, 0xb, 0x11, 0x2, 0x6a, + 0x7a, 0x57, 0x66, 0x93, 0xb0, 0xa4, 0x0, 0x0, + 0x1, 0x80, 0xd, 0x2b, 0x3, 0x80, 0x56, 0x78, + 0xb, 0x34, 0x50, 0xb0, 0x0, 0x0, 0x0, 0x5, + 0x86, 0xa6, 0x6d, 0x6c, 0x50, 0x22, 0x46, 0x11, + 0x0, 0x10, 0xb0, 0x61, 0x4, 0x44, 0x30, 0xd6, + 0x6d, 0xa, 0x1e, 0x20, 0x30, 0x15, 0xc, 0x0, + 0xc0, 0x97, 0xa0, 0xc, 0x55, 0xd0, 0xd6, 0x6c, + 0x6, 0xe3, 0x0, 0xc0, 0xc, 0xc, 0x0, 0xc0, + 0x5d, 0x2, 0xc, 0x0, 0xc0, 0xc0, 0xc, 0xd, + 0xd1, 0x60, 0xc6, 0x6c, 0xd, 0x66, 0xb8, 0x53, + 0xb9, 0xa, 0x0, 0x90, 0x40, 0x6, 0x50, 0x6, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x2, + + /* U+8B70 "è­°" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x81, 0x0, 0x0, 0x84, 0x2, 0xd0, 0x0, + 0x0, 0x59, 0x0, 0x0, 0x1d, 0x7, 0x25, 0x0, + 0x37, 0x69, 0x89, 0x37, 0x67, 0xc6, 0x67, 0x40, + 0x0, 0x0, 0x0, 0x2, 0x33, 0xc3, 0x64, 0x0, + 0x5, 0x66, 0xa0, 0x2, 0x43, 0xc3, 0x32, 0x0, + 0x0, 0x0, 0x0, 0x46, 0x55, 0xc5, 0x59, 0x90, + 0x4, 0x66, 0xa0, 0x0, 0x6, 0x37, 0x21, 0x0, + 0x1, 0x0, 0x0, 0x47, 0xe6, 0x49, 0x1c, 0x0, + 0x5, 0x22, 0x71, 0x0, 0xc0, 0x1a, 0x4, 0x50, + 0xc, 0x44, 0xd3, 0x76, 0xd6, 0x6d, 0x67, 0x70, + 0xc, 0x0, 0xc0, 0x0, 0xc5, 0x2b, 0x2d, 0x0, + 0xc, 0x0, 0xc1, 0xaa, 0xd0, 0x8, 0xc2, 0x0, + 0xc, 0x66, 0xd0, 0x20, 0xc0, 0x1b, 0xc1, 0x40, + 0x8, 0x0, 0x70, 0x39, 0xe4, 0x70, 0x4d, 0xb0, + 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x1, 0x70, + + /* U+8B77 "è­·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x82, 0x0, 0x0, 0x85, 0x9, 0x40, 0x0, + 0x0, 0x2c, 0x1, 0x56, 0xa8, 0x6b, 0x87, 0xc0, + 0x37, 0x69, 0x79, 0x21, 0x75, 0x28, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x60, 0xd1, 0x3, 0x0, + 0x6, 0x65, 0xa1, 0x1f, 0x55, 0xc5, 0x5a, 0x30, + 0x0, 0x0, 0x0, 0x9d, 0x66, 0xd6, 0x78, 0x0, + 0x4, 0x55, 0xa5, 0x3c, 0x0, 0xc0, 0x13, 0x0, + 0x1, 0x11, 0x10, 0xc, 0x66, 0xd6, 0x67, 0x0, + 0x6, 0x33, 0x81, 0xc, 0x66, 0xa6, 0x69, 0x90, + 0xc, 0x22, 0xc1, 0x38, 0x66, 0x66, 0xa2, 0x0, + 0xc, 0x0, 0xc0, 0x1, 0x60, 0x4, 0xc3, 0x0, + 0xc, 0x0, 0xc0, 0x0, 0x28, 0x4a, 0x0, 0x0, + 0xc, 0x66, 0xd0, 0x0, 0xb, 0xe1, 0x0, 0x0, + 0xa, 0x0, 0x80, 0x6, 0xb4, 0x6e, 0x84, 0x20, + 0x0, 0x0, 0x5, 0x73, 0x0, 0x3, 0xae, 0x80, + + /* U+8B8A "變" */ + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0x10, 0x8, 0x40, 0x0, 0x86, 0x0, + 0x0, 0xa6, 0x12, 0x76, 0x6a, 0x22, 0xc1, 0x0, + 0x9, 0x80, 0xc1, 0x56, 0x6a, 0x4d, 0x17, 0x50, + 0x6, 0x38, 0x30, 0x20, 0x4, 0x25, 0x38, 0x0, + 0x0, 0x54, 0x61, 0x88, 0x78, 0x1, 0x91, 0x60, + 0x4, 0xb2, 0x28, 0x86, 0x6b, 0xc, 0x50, 0xb0, + 0x0, 0x10, 0x40, 0xa1, 0xb, 0x2, 0x1, 0x0, + 0x2, 0x49, 0x48, 0x96, 0x69, 0x7, 0x63, 0xb0, + 0x9, 0x17, 0x3a, 0x0, 0x0, 0x35, 0x85, 0x50, + 0x0, 0x0, 0xc9, 0x66, 0x66, 0xc8, 0x74, 0x0, + 0x0, 0x9, 0x34, 0x20, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0x61, 0x0, 0x83, 0x3c, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xb6, 0x8c, 0x63, 0x10, 0x0, + 0x1, 0x57, 0x85, 0x0, 0x1, 0x8c, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8B93 "讓" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x70, 0x0, 0x0, 0x4, 0xb0, 0x0, 0x0, + 0x0, 0x69, 0x0, 0x56, 0x66, 0xe6, 0x6a, 0xb0, + 0x38, 0x8a, 0xa7, 0x12, 0x2, 0x1, 0x2, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x6d, 0x2c, 0x6d, 0x20, + 0x5, 0x65, 0xa1, 0xc, 0x6c, 0xc, 0x6c, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x43, 0x6, 0x3, 0x0, + 0x0, 0x0, 0x50, 0x22, 0x85, 0x29, 0x59, 0x30, + 0x6, 0x66, 0x50, 0x44, 0x95, 0x4a, 0x54, 0x20, + 0x3, 0x0, 0x30, 0x7, 0xa7, 0x6b, 0x7a, 0x20, + 0xb, 0x66, 0xc3, 0x0, 0x72, 0x8, 0x22, 0x70, + 0xb, 0x0, 0xb0, 0x76, 0x9d, 0xa6, 0x6a, 0x50, + 0xb, 0x0, 0xb0, 0x3, 0xe1, 0x56, 0x85, 0x0, + 0xb, 0x66, 0xc1, 0x78, 0xa0, 0x3a, 0xa1, 0x0, + 0x6, 0x0, 0x5, 0x10, 0xba, 0x20, 0x7f, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x1, 0x0, + + /* U+8BA1 "计" */ + 0x0, 0x42, 0x0, 0x0, 0x7, 0x30, 0x0, 0x0, + 0x0, 0xc5, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, + 0x3, 0xa0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x30, 0x0, 0x1, 0x66, 0xc4, + 0x36, 0x66, 0xd8, 0x66, 0xc7, 0x0, 0xd, 0x0, + 0x10, 0xb, 0x30, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0xb, 0x30, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0xb3, 0x0, 0x0, 0x0, 0xd, 0x5, 0x20, 0xb, + 0x30, 0x0, 0x0, 0x0, 0xd7, 0x60, 0x0, 0xb3, + 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0xb, 0x30, + 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, 0xc4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, + 0x0, + + /* U+8C50 "è±" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x10, 0xb0, 0xc2, 0xa, 0x3, 0x0, 0x0, + 0xb1, 0x2d, 0x7c, 0x26, 0xd6, 0xc1, 0x0, 0xb, + 0x12, 0xb1, 0xc0, 0xb, 0x1c, 0x0, 0x0, 0xb2, + 0x7d, 0x5c, 0x37, 0xd6, 0xc0, 0x0, 0xb, 0x26, + 0xd7, 0xc2, 0x6d, 0x7c, 0x0, 0x0, 0xd0, 0x1b, + 0xc, 0x1, 0xb0, 0xc0, 0x0, 0x8, 0x66, 0x66, + 0x66, 0x66, 0x67, 0x0, 0x2, 0x76, 0x66, 0x66, + 0x66, 0x66, 0xa9, 0x0, 0x0, 0x21, 0x0, 0x0, + 0x0, 0x30, 0x0, 0x0, 0x5, 0xb6, 0x66, 0x66, + 0x6d, 0x10, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, + 0xb0, 0x0, 0x0, 0x6, 0xa8, 0x66, 0x67, 0x9a, + 0x0, 0x0, 0x0, 0x0, 0x95, 0x0, 0x79, 0x0, + 0x10, 0x5, 0x66, 0x68, 0xa6, 0x6b, 0x66, 0x6e, + 0x70, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8C61 "象" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xe6, 0x66, 0xab, 0x0, 0x0, 0x0, 0x7, + 0xa0, 0x0, 0x29, 0x10, 0x0, 0x0, 0x8, 0xe6, + 0x66, 0x6b, 0x66, 0x6d, 0x10, 0x5, 0x1d, 0x0, + 0xa, 0x50, 0x0, 0xe0, 0x0, 0x0, 0xd6, 0x66, + 0xf6, 0x66, 0x6e, 0x0, 0x0, 0x9, 0x0, 0xaa, + 0x0, 0x0, 0x80, 0x0, 0x0, 0x1, 0xa5, 0x85, + 0x3, 0xc9, 0x10, 0x0, 0x5, 0x71, 0x6a, 0xb7, + 0x80, 0x0, 0x0, 0x4, 0x1, 0x97, 0x1c, 0x76, + 0x20, 0x0, 0x0, 0x16, 0x81, 0x1b, 0x6b, 0xc, + 0x20, 0x0, 0x14, 0x0, 0x6a, 0x13, 0xb0, 0x3e, + 0x71, 0x0, 0x5, 0x95, 0x10, 0x79, 0x0, 0x3d, + 0xa1, 0x46, 0x20, 0x6, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, + + /* U+8CA0 "è² " */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0x76, 0x6a, 0x80, 0x0, 0x0, 0x3, 0xd2, + 0x0, 0x1d, 0x50, 0x0, 0x0, 0x3b, 0x10, 0x0, + 0x82, 0x0, 0x0, 0x5, 0x76, 0x33, 0x35, 0x63, + 0x39, 0x0, 0x1, 0xd, 0x33, 0x33, 0x33, 0x3e, + 0x10, 0x0, 0xd, 0x66, 0x66, 0x66, 0x6e, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0xe, 0x0, 0x0, + 0xd, 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, 0xd, + 0x10, 0x0, 0x0, 0xe, 0x0, 0x0, 0xd, 0x66, + 0x66, 0x66, 0x6e, 0x0, 0x0, 0x7, 0x28, 0x0, + 0x5, 0x18, 0x0, 0x0, 0x3, 0xd7, 0x0, 0x1, + 0xab, 0x20, 0x0, 0x78, 0x10, 0x0, 0x0, 0x7, + 0xe0, 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, 0x30, + + /* U+8CA1 "財" */ + 0x2, 0x0, 0x3, 0x0, 0x0, 0x1, 0xa0, 0x0, + 0xb, 0x76, 0x6d, 0x40, 0x0, 0x1, 0xc0, 0x0, + 0xa, 0x20, 0xc, 0x10, 0x0, 0x1, 0xc0, 0x0, + 0xa, 0x20, 0xc, 0x10, 0x0, 0x1, 0xc1, 0x70, + 0xa, 0x76, 0x6d, 0x16, 0x66, 0x6e, 0xd6, 0x61, + 0xa, 0x20, 0xc, 0x10, 0x0, 0x4c, 0xc0, 0x0, + 0xa, 0x76, 0x6d, 0x10, 0x0, 0xc3, 0xc0, 0x0, + 0xa, 0x20, 0xc, 0x10, 0x7, 0x81, 0xc0, 0x0, + 0xa, 0x20, 0xc, 0x10, 0x3b, 0x1, 0xc0, 0x0, + 0xa, 0x76, 0x6d, 0x11, 0xa0, 0x1, 0xc0, 0x0, + 0x8, 0x20, 0x6, 0x18, 0x0, 0x1, 0xc0, 0x0, + 0x0, 0xb6, 0x37, 0x40, 0x0, 0x1, 0xc0, 0x0, + 0x5, 0x90, 0x9, 0x60, 0x0, 0x1, 0xc0, 0x0, + 0x28, 0x0, 0x2, 0x80, 0x2, 0x8e, 0xa0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, + + /* U+8CA7 "è²§" */ + 0x0, 0x0, 0x37, 0x0, 0x25, 0x0, 0x0, 0x0, + 0x0, 0x2c, 0x40, 0x0, 0x73, 0x0, 0x0, 0x0, + 0x49, 0x10, 0x0, 0x0, 0xb9, 0x30, 0x1, 0x54, + 0x37, 0xc9, 0x66, 0x6e, 0x7c, 0xc2, 0x0, 0x0, + 0x79, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x3, 0x94, + 0x0, 0x16, 0xb6, 0x0, 0x0, 0x4, 0x48, 0x66, + 0x66, 0x69, 0x6a, 0x0, 0x0, 0x1, 0xb0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x1d, 0x66, 0x66, + 0x66, 0x6d, 0x0, 0x0, 0x1, 0xd6, 0x66, 0x66, + 0x66, 0xd0, 0x0, 0x0, 0x1b, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x1, 0xc6, 0x76, 0x66, 0x66, + 0xa0, 0x0, 0x0, 0x1, 0x7d, 0x20, 0x5, 0x89, + 0x30, 0x0, 0x6, 0xa5, 0x0, 0x0, 0x0, 0x3d, + 0x50, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x0, + + /* U+8CA9 "販" */ + 0x1, 0x10, 0x0, 0x30, 0x0, 0x0, 0x39, 0x50, + 0x3, 0xc6, 0x66, 0xe0, 0x86, 0x79, 0x86, 0x40, + 0x2, 0xa0, 0x0, 0xd0, 0xd0, 0x0, 0x0, 0x0, + 0x2, 0xb4, 0x44, 0xd0, 0xd0, 0x0, 0x0, 0x0, + 0x2, 0xb1, 0x11, 0xd0, 0xd6, 0x66, 0x6a, 0x10, + 0x2, 0xa0, 0x0, 0xd0, 0xc3, 0x20, 0x1d, 0x0, + 0x2, 0xc6, 0x66, 0xd0, 0xc0, 0x60, 0x49, 0x0, + 0x2, 0xa0, 0x0, 0xd0, 0xc0, 0x80, 0x84, 0x0, + 0x2, 0xa0, 0x0, 0xd0, 0xb0, 0x81, 0xd0, 0x0, + 0x2, 0xc6, 0x66, 0xd1, 0x90, 0x3b, 0x80, 0x0, + 0x2, 0x71, 0x20, 0x75, 0x50, 0xf, 0x20, 0x0, + 0x0, 0x6b, 0x2b, 0x8, 0x0, 0x96, 0xc0, 0x0, + 0x0, 0xb1, 0x9, 0x47, 0x8, 0x30, 0x6d, 0x20, + 0x7, 0x20, 0x0, 0x51, 0x61, 0x0, 0x7, 0xa1, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8CAC "責" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd1, 0x0, 0x1, 0x0, 0x2, + 0x66, 0x66, 0x6e, 0x66, 0x67, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x50, 0x0, 0x0, 0x27, + 0x66, 0x6e, 0x66, 0x68, 0x30, 0x0, 0x22, 0x22, + 0x22, 0xe2, 0x22, 0x25, 0xb0, 0x15, 0x55, 0x44, + 0x44, 0x44, 0x48, 0x44, 0x10, 0x3, 0xc6, 0x66, + 0x66, 0x66, 0xd3, 0x0, 0x0, 0x3c, 0x66, 0x66, + 0x66, 0x6d, 0x10, 0x0, 0x3, 0xa0, 0x0, 0x0, + 0x0, 0xc1, 0x0, 0x0, 0x3c, 0x66, 0x66, 0x66, + 0x6d, 0x10, 0x0, 0x3, 0xa0, 0x0, 0x0, 0x0, + 0xc1, 0x0, 0x0, 0x39, 0x6b, 0x66, 0x76, 0x69, + 0x10, 0x0, 0x0, 0x1b, 0xc2, 0x2, 0x8a, 0x71, + 0x0, 0x0, 0x7a, 0x30, 0x0, 0x0, 0x9, 0xe0, + 0x0, 0x51, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, + + /* U+8CB7 "è²·" */ + 0x3, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0xb7, + 0x67, 0xc6, 0x6e, 0x66, 0xe3, 0xb, 0x20, 0x3a, + 0x0, 0xd0, 0xd, 0x0, 0xb2, 0x3, 0xa0, 0xd, + 0x0, 0xd0, 0x9, 0x66, 0x66, 0x66, 0x66, 0x6a, + 0x0, 0x6, 0x66, 0x66, 0x66, 0x6c, 0x20, 0x0, + 0x96, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x9, 0x96, + 0x66, 0x66, 0x6e, 0x0, 0x0, 0x96, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0x9, 0x96, 0x66, 0x66, 0x6e, + 0x0, 0x0, 0x96, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x8, 0x88, 0x76, 0x66, 0x6a, 0x0, 0x0, 0x4, + 0xe8, 0x0, 0x38, 0x93, 0x0, 0x29, 0x81, 0x0, + 0x0, 0x2, 0xc6, 0x34, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, + + /* U+8CB8 "貸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa9, 0xb, 0x48, 0x50, 0x0, 0x0, + 0x0, 0xa8, 0x0, 0x85, 0x1c, 0x2, 0x0, 0x0, + 0xae, 0x15, 0x58, 0xc6, 0x66, 0xc2, 0x4, 0x71, + 0xd0, 0x0, 0x9, 0x40, 0x0, 0x10, 0x10, 0xd, + 0x0, 0x0, 0x1c, 0x40, 0x4, 0x0, 0x0, 0xb0, + 0x0, 0x0, 0x1c, 0xb8, 0x50, 0x0, 0x39, 0x66, + 0x66, 0x66, 0x6f, 0x96, 0x0, 0x3, 0xa0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x0, 0x3c, 0x66, 0x66, + 0x66, 0x6d, 0x0, 0x0, 0x3, 0xc6, 0x66, 0x66, + 0x66, 0xd0, 0x0, 0x0, 0x3a, 0x0, 0x0, 0x0, + 0x1d, 0x0, 0x0, 0x3, 0xb6, 0x86, 0x66, 0x66, + 0xa0, 0x0, 0x0, 0x1, 0xbb, 0x0, 0x5, 0x98, + 0x20, 0x0, 0x7, 0xa4, 0x0, 0x0, 0x0, 0x5f, + 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x30, + + /* U+8CBB "è²»" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb2, 0xb, 0x10, 0x0, 0x0, 0x1, + 0x76, 0x6d, 0x66, 0xd6, 0x6c, 0x30, 0x0, 0x3, + 0x0, 0xc0, 0xc, 0x0, 0xc0, 0x0, 0x0, 0xe8, + 0x6d, 0x66, 0xd6, 0x69, 0x0, 0x0, 0x2e, 0x66, + 0xc6, 0x6d, 0x66, 0x66, 0xd0, 0x0, 0x1, 0xa2, + 0x0, 0xc0, 0x2, 0x68, 0x0, 0x15, 0x71, 0x0, + 0x8, 0x0, 0x7a, 0x10, 0x2, 0x1d, 0x66, 0x66, + 0x66, 0x7d, 0x0, 0x0, 0x1, 0xd6, 0x66, 0x66, + 0x67, 0xb0, 0x0, 0x0, 0x1b, 0x0, 0x0, 0x0, + 0x2b, 0x0, 0x0, 0x1, 0xd6, 0x66, 0x66, 0x67, + 0xb0, 0x0, 0x0, 0x1d, 0x66, 0x66, 0x66, 0x7b, + 0x0, 0x0, 0x0, 0x4c, 0x50, 0x4, 0x78, 0x40, + 0x0, 0x1, 0x8a, 0x30, 0x0, 0x0, 0x2b, 0xa0, + 0x1, 0x51, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, + + /* U+8CBF "貿" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6d, 0x40, 0x0, 0x0, 0x10, 0x2, 0xa6, + 0x40, 0x17, 0x88, 0x66, 0xc7, 0x2, 0xa0, 0x28, + 0x0, 0x85, 0x0, 0xb2, 0x2, 0xa0, 0x1a, 0x80, + 0xc1, 0x0, 0xd0, 0x4, 0xc9, 0x61, 0x48, 0x61, + 0x68, 0xb0, 0x1, 0x80, 0x0, 0x65, 0x0, 0x8, + 0x20, 0x0, 0x9, 0x67, 0x66, 0x66, 0x6c, 0x10, + 0x0, 0xd, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0xe, 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, 0xe, + 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xd, 0x68, 0x66, + 0x66, 0x6c, 0x0, 0x0, 0x1, 0xac, 0x10, 0x6, + 0xa7, 0x10, 0x0, 0x5a, 0x40, 0x0, 0x0, 0x7, + 0xe0, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x20, + + /* U+8CC3 "賃" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x69, 0x0, 0x0, 0x25, 0x95, 0x0, 0x0, + 0x2d, 0x24, 0x57, 0xd7, 0x55, 0x40, 0x0, 0x1c, + 0xa0, 0x0, 0xc, 0x10, 0x2, 0x40, 0x19, 0x3b, + 0x56, 0x66, 0xd6, 0x66, 0x77, 0x1, 0x1, 0xb0, + 0x0, 0xc, 0x10, 0x3, 0x0, 0x0, 0x18, 0x6, + 0x66, 0x96, 0x67, 0x90, 0x0, 0x1, 0x96, 0x66, + 0x66, 0x66, 0xc1, 0x0, 0x0, 0x1b, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x1, 0xd6, 0x66, 0x66, + 0x66, 0xd0, 0x0, 0x0, 0x1d, 0x66, 0x66, 0x66, + 0x6d, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0x1c, 0x67, 0x66, 0x66, 0x6b, + 0x0, 0x0, 0x0, 0x1b, 0xa0, 0x2, 0x69, 0x50, + 0x0, 0x0, 0x6a, 0x30, 0x0, 0x0, 0x19, 0xb0, + 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + + /* U+8CC7 "資" */ + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x54, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xd1, 0x51, 0xd7, 0x66, 0x66, 0xa0, 0x0, 0x1, + 0x62, 0x57, 0x7, 0x40, 0x64, 0x0, 0x24, 0x84, + 0x19, 0x0, 0xe7, 0x2, 0x0, 0x0, 0x6a, 0x3, + 0x0, 0x88, 0x66, 0x0, 0x0, 0x5, 0x80, 0x0, + 0x79, 0x0, 0xaa, 0x41, 0x0, 0x68, 0x13, 0x73, + 0x0, 0x0, 0x9c, 0x50, 0x0, 0x2d, 0x66, 0x66, + 0x66, 0x7e, 0x0, 0x0, 0x2, 0xd6, 0x66, 0x66, + 0x67, 0xc0, 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, + 0x2c, 0x0, 0x0, 0x2, 0xd6, 0x66, 0x66, 0x67, + 0xc0, 0x0, 0x0, 0x2d, 0x76, 0x66, 0x66, 0x7c, + 0x0, 0x0, 0x0, 0x3c, 0x90, 0x0, 0x59, 0x71, + 0x0, 0x0, 0x7a, 0x40, 0x0, 0x0, 0x6, 0xe0, + 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + + /* U+8CEA "質" */ + 0x0, 0x0, 0x3, 0x80, 0x0, 0x17, 0x70, 0x0, + 0x96, 0x76, 0x51, 0xb6, 0x86, 0x40, 0x0, 0xa3, + 0x0, 0x51, 0xd0, 0x0, 0x61, 0x0, 0xb7, 0x6e, + 0x63, 0xe6, 0x9a, 0x63, 0x1, 0xc0, 0xc, 0x4, + 0x90, 0x57, 0x0, 0x9, 0x20, 0xd, 0x1a, 0x0, + 0x57, 0x0, 0x41, 0x28, 0x67, 0xa6, 0x66, 0xa3, + 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0x2d, 0x66, 0x66, 0x66, 0xd2, 0x0, 0x0, + 0x2c, 0x0, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x2d, + 0x66, 0x66, 0x66, 0xd2, 0x0, 0x0, 0x2d, 0x66, + 0x66, 0x66, 0xc2, 0x0, 0x0, 0x1, 0x8b, 0x0, + 0x27, 0x83, 0x0, 0x0, 0x4a, 0x60, 0x0, 0x0, + 0x3d, 0x60, 0x4, 0x30, 0x0, 0x0, 0x0, 0x1, + 0x40, + + /* U+8CFD "è³½" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x66, 0x66, 0x6a, 0x86, 0x66, 0x6a, 0x10, + 0x4, 0xc0, 0x6, 0x30, 0x9, 0x10, 0x57, 0x0, + 0x0, 0x37, 0x6b, 0x86, 0x6d, 0x67, 0x90, 0x0, + 0x0, 0x4, 0x4a, 0x74, 0x4d, 0x46, 0x60, 0x0, + 0x0, 0x3, 0x19, 0x41, 0x1c, 0x11, 0x26, 0x0, + 0x3, 0x76, 0x7e, 0x66, 0x69, 0x76, 0x66, 0x10, + 0x0, 0x3, 0xf3, 0x11, 0x11, 0xc6, 0x0, 0x0, + 0x2, 0x76, 0xc4, 0x44, 0x44, 0xba, 0xd9, 0x71, + 0x13, 0x0, 0xc6, 0x66, 0x66, 0xc3, 0x6, 0x30, + 0x0, 0x0, 0xc6, 0x66, 0x66, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x57, 0x80, 0x4, 0x70, 0x0, 0x0, + 0x0, 0x3, 0x96, 0x0, 0x0, 0x3d, 0x70, 0x0, + 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, + + /* U+8D64 "赤" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x66, 0x66, 0xe6, 0x66, 0xc7, 0x0, 0x0, 0x11, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0x0, 0x36, 0x66, 0x66, + 0x6e, 0x66, 0x66, 0x6e, 0x40, 0x10, 0x0, 0xe0, + 0x2, 0xb0, 0x0, 0x0, 0x0, 0x5c, 0xe, 0x0, + 0x2b, 0x50, 0x0, 0x0, 0xc, 0x51, 0xc0, 0x2, + 0xb1, 0xa2, 0x0, 0x5, 0x70, 0x59, 0x0, 0x2b, + 0x2, 0xe2, 0x1, 0x70, 0xb, 0x30, 0x2, 0xb0, + 0x9, 0x80, 0x40, 0x4, 0xa0, 0x0, 0x2b, 0x0, + 0x12, 0x0, 0x2, 0x90, 0x0, 0x3, 0xb0, 0x0, + 0x0, 0x5, 0x60, 0x0, 0x29, 0xf9, 0x0, 0x0, + 0x2, 0x10, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + + /* U+8D70 "èµ°" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x1, 0x0, 0x0, + 0x0, 0x16, 0x66, 0x6d, 0x76, 0x6d, 0x80, 0x0, + 0x0, 0x1, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x1, 0x0, + 0x16, 0x66, 0x66, 0x6d, 0x76, 0x66, 0x8f, 0x30, + 0x1, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xa0, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x90, 0xb, 0x20, 0x3, 0x70, 0x0, + 0x0, 0xa, 0x50, 0xb, 0x76, 0x66, 0x61, 0x0, + 0x0, 0xe, 0x60, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x58, 0x9, 0x2b, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xb0, 0x1, 0xbf, 0x85, 0x43, 0x33, 0x40, + 0x8, 0x10, 0x0, 0x3, 0x7b, 0xde, 0xfe, 0x20, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8D77 "èµ·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x4, 0x0, + 0x0, 0x56, 0x6d, 0x6d, 0x17, 0x66, 0x6e, 0x10, + 0x0, 0x10, 0xc, 0x0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xd, 0x0, + 0x3, 0x66, 0x6d, 0x6b, 0x78, 0x66, 0x6e, 0x0, + 0x1, 0x10, 0xd, 0x10, 0xd, 0x0, 0x8, 0x0, + 0x0, 0x44, 0xd, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x79, 0xd, 0x7, 0xd, 0x0, 0x0, 0x50, + 0x0, 0x94, 0xd, 0x66, 0x2d, 0x0, 0x0, 0x70, + 0x0, 0xb4, 0xd, 0x0, 0xc, 0x21, 0x12, 0xd1, + 0x0, 0xb7, 0x3d, 0x0, 0x3, 0x9a, 0xa9, 0x60, + 0x2, 0x70, 0xae, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x10, 0x6, 0xd9, 0x53, 0x22, 0x23, 0x42, + 0x6, 0x0, 0x0, 0x4, 0x8a, 0xce, 0xee, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8D85 "è¶…" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0xd0, 0x0, 0x67, 0xb6, 0x6a, 0x80, + 0x3, 0x66, 0xe6, 0xb5, 0x0, 0xe0, 0x9, 0x50, + 0x0, 0x10, 0xd0, 0x0, 0x3, 0xa0, 0xa, 0x30, + 0x0, 0x0, 0xd0, 0x0, 0x9, 0x30, 0xc, 0x10, + 0x5, 0x66, 0xe6, 0xb8, 0x38, 0x2, 0xcc, 0x0, + 0x2, 0x0, 0xd0, 0x3, 0x70, 0x0, 0x11, 0x0, + 0x0, 0x71, 0xd0, 0x1, 0x3a, 0x66, 0x6d, 0x40, + 0x0, 0xe0, 0xd0, 0x26, 0x2b, 0x0, 0xd, 0x0, + 0x0, 0xc0, 0xd6, 0x65, 0x3b, 0x0, 0xd, 0x0, + 0x2, 0xb0, 0xd0, 0x0, 0x2b, 0x0, 0xd, 0x0, + 0x4, 0x77, 0xd0, 0x0, 0x2d, 0x66, 0x6e, 0x0, + 0x8, 0x13, 0xe1, 0x0, 0x38, 0x0, 0x5, 0x0, + 0x7, 0x0, 0x2a, 0xa5, 0x31, 0x11, 0x1, 0x10, + 0x32, 0x0, 0x0, 0x26, 0x9b, 0xde, 0xef, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8D8A "è¶Š" */ + 0x0, 0x0, 0xa0, 0x0, 0x0, 0x83, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xa2, 0x86, 0x0, + 0x3, 0x55, 0xd5, 0xc3, 0x0, 0xa2, 0x1b, 0x0, + 0x1, 0x21, 0xd1, 0x10, 0x96, 0xc7, 0x6b, 0x80, + 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x93, 0x0, 0x0, + 0x16, 0x66, 0xd6, 0x98, 0xd0, 0x84, 0xd, 0x10, + 0x0, 0x0, 0xb2, 0x0, 0xd0, 0x66, 0x5a, 0x0, + 0x0, 0xb3, 0xc1, 0x0, 0xd0, 0x3a, 0xb1, 0x0, + 0x0, 0xd1, 0xc6, 0xa7, 0xd2, 0x2e, 0x80, 0x30, + 0x0, 0xe0, 0xc1, 0x0, 0xe7, 0x1d, 0x80, 0x70, + 0x2, 0xd1, 0xc1, 0x0, 0x60, 0xa2, 0xb8, 0x80, + 0x5, 0x68, 0xd1, 0x0, 0x18, 0x10, 0xb, 0x90, + 0x8, 0x0, 0x7b, 0x73, 0x40, 0x0, 0x0, 0x30, + 0x16, 0x0, 0x1, 0x6b, 0xde, 0xee, 0xff, 0x80, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, + + /* U+8DA3 "è¶£" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x12, 0x66, 0x66, 0xb5, 0x0, 0x0, 0x0, + 0xa2, 0x71, 0xc0, 0xc0, 0x0, 0x20, 0x5, 0x6c, + 0x65, 0xc, 0xc, 0x27, 0x6b, 0x60, 0x0, 0xa1, + 0x0, 0xd5, 0xd0, 0x0, 0xc0, 0x26, 0x6c, 0x69, + 0x7c, 0xc, 0x5, 0xc, 0x0, 0x10, 0x66, 0x0, + 0xc0, 0xc0, 0x39, 0x80, 0x4, 0x46, 0x50, 0xd, + 0x6d, 0x0, 0xb4, 0x0, 0x77, 0x69, 0xa3, 0xc0, + 0xc0, 0x1a, 0xb0, 0x8, 0x46, 0x50, 0xc, 0x6d, + 0x58, 0x2a, 0x40, 0xa4, 0x65, 0x1d, 0x82, 0xc2, + 0x40, 0x44, 0xa, 0x4b, 0x50, 0x0, 0xc, 0x10, + 0x0, 0x1, 0x60, 0x3a, 0x73, 0x10, 0x40, 0x0, + 0x12, 0x40, 0x0, 0x3, 0x8c, 0xdf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8DB3 "è¶³" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x96, 0x66, 0x66, 0x6c, 0x30, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x67, 0xb6, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x2, 0xb0, 0x2, 0x0, 0x0, + 0x0, 0x2, 0x30, 0x2, 0xb0, 0x0, 0x20, 0x0, + 0x0, 0x6, 0xd0, 0x2, 0xd6, 0x67, 0xd3, 0x0, + 0x0, 0xa, 0x60, 0x2, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x81, 0x2, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x76, 0x1b, 0x42, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xa0, 0x0, 0xad, 0xd5, 0x42, 0x23, 0x40, + 0x7, 0x10, 0x0, 0x2, 0x8b, 0xde, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8DDF "è·Ÿ" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x1, 0x0, + 0x0, 0xc6, 0x66, 0xe0, 0xc6, 0x66, 0x6f, 0x10, + 0x0, 0xc0, 0x1, 0xa0, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0xc0, 0x1, 0xa0, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0xc0, 0x1, 0xa0, 0xd6, 0x66, 0x6d, 0x0, + 0x0, 0xc6, 0xc7, 0x80, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0xc0, 0x0, 0xd6, 0x66, 0x6d, 0x0, + 0x0, 0xd0, 0xc0, 0x40, 0xd0, 0x60, 0x6, 0x10, + 0x0, 0xc0, 0xc6, 0x82, 0xd0, 0x80, 0xb, 0x80, + 0x0, 0xc0, 0xc0, 0x0, 0xd0, 0x56, 0x94, 0x0, + 0x0, 0xc0, 0xc0, 0x0, 0xd0, 0xc, 0x10, 0x0, + 0x0, 0xc0, 0xc6, 0x51, 0xd0, 0x24, 0xc1, 0x0, + 0x5, 0xeb, 0x70, 0x0, 0xd9, 0x40, 0x5e, 0x82, + 0xa, 0x40, 0x0, 0x0, 0xb4, 0x0, 0x2, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8DEF "è·¯" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, + 0x0, 0xb6, 0x68, 0x90, 0x3c, 0x0, 0x4, 0x0, + 0x0, 0xd0, 0x4, 0x70, 0x88, 0x66, 0x7e, 0x20, + 0x0, 0xd0, 0x4, 0x70, 0xa5, 0x0, 0x95, 0x0, + 0x0, 0xd0, 0x4, 0x75, 0x26, 0x34, 0xb0, 0x0, + 0x0, 0xe6, 0xc8, 0x66, 0x0, 0xbd, 0x10, 0x0, + 0x0, 0x10, 0xc0, 0x0, 0x2, 0xdc, 0x80, 0x0, + 0x1, 0x90, 0xd6, 0x70, 0x3a, 0x10, 0x8e, 0x82, + 0x0, 0xb0, 0xc1, 0x15, 0xc6, 0x66, 0x6c, 0x91, + 0x0, 0xb0, 0xc0, 0x41, 0xa3, 0x0, 0x1c, 0x0, + 0x0, 0xb0, 0xc0, 0x0, 0xa3, 0x0, 0x1c, 0x0, + 0x0, 0xb3, 0xd6, 0x40, 0xa3, 0x0, 0x1c, 0x0, + 0xa, 0xc6, 0x10, 0x0, 0xa7, 0x66, 0x6c, 0x0, + 0x1, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x1b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + + /* U+8EAB "身" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x64, 0x0, 0x4, 0x0, 0x0, 0x0, + 0xd, 0x66, 0x66, 0x66, 0xe2, 0x0, 0x0, 0x0, + 0xd1, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xc, + 0x66, 0x66, 0x66, 0xe0, 0x40, 0x0, 0x0, 0xc1, + 0x0, 0x0, 0xe, 0x1e, 0x50, 0x0, 0xc, 0x66, + 0x66, 0x66, 0xeb, 0x50, 0x0, 0x0, 0xc1, 0x0, + 0x0, 0x1e, 0x60, 0x0, 0x36, 0x6d, 0x66, 0x66, + 0x6c, 0xf0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x1b, + 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0x20, + 0xe0, 0x0, 0x0, 0x0, 0x1, 0x97, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x7, 0x82, 0x0, 0x0, 0xe0, + 0x0, 0x3, 0x56, 0x10, 0x0, 0x17, 0xed, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, + + /* U+8ECA "車" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x0, 0x0, 0x32, 0x0, 0x27, + 0x66, 0x66, 0xd6, 0x66, 0x68, 0x70, 0x0, 0x1, + 0x0, 0xc, 0x0, 0x3, 0x20, 0x0, 0x0, 0xd6, + 0x66, 0xd6, 0x66, 0xb8, 0x0, 0x0, 0xd, 0x0, + 0xc, 0x0, 0x9, 0x40, 0x0, 0x0, 0xd6, 0x66, + 0xd6, 0x66, 0xb4, 0x0, 0x0, 0xd, 0x0, 0xc, + 0x0, 0x9, 0x40, 0x0, 0x0, 0xd6, 0x66, 0xd6, + 0x66, 0xb4, 0x0, 0x0, 0xa, 0x0, 0xc, 0x0, + 0x5, 0x20, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, + 0x0, 0xa2, 0x17, 0x66, 0x66, 0x6d, 0x66, 0x66, + 0x67, 0x50, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, + + /* U+8EDF "軟" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc3, 0x0, 0x4, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xc0, 0x22, 0x7, 0x70, 0x0, 0x0, + 0x4, 0x76, 0xd6, 0x77, 0xb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xc0, 0x20, 0x1d, 0x66, 0x69, 0xc0, + 0x2, 0xc6, 0xd6, 0xd4, 0x73, 0x83, 0x9, 0x30, + 0x1, 0xb0, 0xc0, 0xc0, 0x70, 0xc3, 0x2, 0x0, + 0x1, 0xd6, 0xd6, 0xd3, 0x0, 0xc4, 0x0, 0x0, + 0x1, 0xb0, 0xc0, 0xc0, 0x0, 0xd6, 0x0, 0x0, + 0x1, 0xd6, 0xd6, 0xd0, 0x1, 0xc7, 0x0, 0x0, + 0x1, 0x70, 0xc0, 0x50, 0x6, 0x88, 0x20, 0x0, + 0x5, 0x66, 0xd6, 0x7c, 0x1c, 0x13, 0x90, 0x0, + 0x1, 0x0, 0xc0, 0x0, 0x67, 0x0, 0xc4, 0x0, + 0x0, 0x0, 0xc0, 0x4, 0x90, 0x0, 0x2e, 0x60, + 0x0, 0x0, 0xd0, 0x46, 0x0, 0x0, 0x4, 0xa2, + 0x0, 0x0, 0x40, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+8EE2 "転" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc0, 0x13, 0x0, 0x0, 0x5, 0x0, + 0x4, 0x76, 0xd6, 0x77, 0x28, 0x66, 0x69, 0x20, + 0x0, 0x0, 0xc0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xc6, 0xd6, 0xc5, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xb0, 0xc0, 0xa1, 0x0, 0x0, 0x0, 0x30, + 0x1, 0xd6, 0xd6, 0xc3, 0x86, 0x76, 0x66, 0xa2, + 0x1, 0xb0, 0xc0, 0xa1, 0x0, 0x79, 0x0, 0x0, + 0x1, 0xd6, 0xd6, 0xc2, 0x0, 0xc1, 0x0, 0x0, + 0x1, 0x80, 0xc0, 0x51, 0x4, 0x70, 0x10, 0x0, + 0x5, 0x66, 0xd6, 0x9b, 0x9, 0x0, 0x37, 0x0, + 0x1, 0x0, 0xc0, 0x0, 0x72, 0x0, 0x8, 0x70, + 0x0, 0x0, 0xc0, 0x3, 0xec, 0x98, 0x65, 0xe0, + 0x0, 0x0, 0xd0, 0x0, 0x30, 0x0, 0x0, 0x60, + 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8EFD "軽" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, 0x15, 0x0, + 0x0, 0xa, 0x20, 0x54, 0x86, 0x66, 0xbb, 0x0, + 0x7, 0x6c, 0x76, 0x82, 0x32, 0x1, 0xc0, 0x0, + 0x1, 0xa, 0x20, 0x20, 0x8, 0xa, 0x30, 0x0, + 0xb, 0x7c, 0x76, 0xf1, 0x4, 0xc6, 0x0, 0x0, + 0xa, 0x2a, 0x20, 0xc0, 0x7, 0xaa, 0x10, 0x0, + 0xa, 0x7c, 0x76, 0xc0, 0x84, 0x3, 0xda, 0x50, + 0xa, 0x2a, 0x20, 0xd5, 0x0, 0xc4, 0x6, 0x10, + 0xa, 0x7c, 0x76, 0xc0, 0x0, 0xd0, 0x1, 0x0, + 0x8, 0x1a, 0x20, 0x52, 0x75, 0xe5, 0x7b, 0x10, + 0x26, 0x6c, 0x76, 0xa7, 0x0, 0xd0, 0x0, 0x0, + 0x1, 0xa, 0x20, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xa, 0x20, 0x0, 0x0, 0xd0, 0x3, 0x20, + 0x0, 0xa, 0x20, 0x27, 0x66, 0x96, 0x69, 0x70, + 0x0, 0x6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8F03 "較" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x80, 0x0, 0x1, 0xa2, 0x0, 0x0, + 0x0, 0xa, 0x20, 0x40, 0x0, 0x4b, 0x0, 0x0, + 0x7, 0x6c, 0x76, 0x92, 0x11, 0x13, 0x17, 0x20, + 0x0, 0xa, 0x20, 0x22, 0x68, 0x65, 0x55, 0x30, + 0xa, 0x7c, 0x76, 0xe2, 0xc, 0x60, 0x64, 0x0, + 0xa, 0x2a, 0x20, 0xc0, 0x58, 0x0, 0x8, 0xa0, + 0xa, 0x7c, 0x76, 0xc1, 0xa2, 0x0, 0x50, 0xc1, + 0xa, 0x2a, 0x20, 0xc7, 0x6, 0x0, 0xe3, 0x0, + 0xa, 0x7c, 0x76, 0xc0, 0x7, 0x14, 0x90, 0x0, + 0x8, 0x1a, 0x20, 0x50, 0x2, 0x9b, 0x20, 0x0, + 0x26, 0x6c, 0x76, 0xb7, 0x0, 0xaa, 0x0, 0x0, + 0x1, 0xa, 0x20, 0x0, 0x4, 0xac, 0x40, 0x0, + 0x0, 0xa, 0x20, 0x0, 0x77, 0x1, 0xd9, 0x30, + 0x0, 0xa, 0x20, 0x37, 0x20, 0x0, 0x9, 0x40, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8F09 "載" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x10, 0x3, 0xc3, 0x10, 0x0, + 0x0, 0x56, 0x6d, 0x6d, 0x33, 0xa0, 0xc3, 0x0, + 0x0, 0x10, 0xb, 0x0, 0x3, 0xa0, 0x43, 0x30, + 0x17, 0x66, 0x6a, 0x66, 0x67, 0xc6, 0x67, 0xb2, + 0x0, 0x0, 0x1c, 0x3, 0x12, 0xa0, 0x0, 0x0, + 0x2, 0x76, 0x6d, 0x68, 0x61, 0xa0, 0x4, 0x0, + 0x0, 0x86, 0x6d, 0x69, 0x30, 0xc0, 0xe, 0x40, + 0x0, 0xd0, 0xb, 0xc, 0x10, 0xd0, 0x4a, 0x0, + 0x0, 0xd6, 0x6d, 0x6d, 0x0, 0xc0, 0xc3, 0x0, + 0x0, 0xd0, 0xb, 0xc, 0x0, 0x8a, 0xa0, 0x0, + 0x0, 0xc6, 0x6d, 0x69, 0x0, 0x4f, 0x10, 0x0, + 0x5, 0x66, 0x6d, 0x69, 0xa1, 0xcc, 0x50, 0x5, + 0x1, 0x0, 0xb, 0x0, 0x2a, 0x21, 0xd5, 0x44, + 0x0, 0x0, 0x1c, 0x5, 0x70, 0x0, 0x1c, 0xe4, + 0x0, 0x0, 0x4, 0x1, 0x0, 0x0, 0x0, 0x43, + + /* U+8F15 "輕" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0xa, 0x20, 0x52, 0x76, 0x66, 0x6a, 0x70, + 0x17, 0x6c, 0x76, 0x82, 0x46, 0x57, 0xb, 0x30, + 0x1, 0xa, 0x20, 0x20, 0x93, 0xa3, 0x4b, 0x0, + 0xb, 0x7c, 0x76, 0xe3, 0x80, 0x60, 0x90, 0x0, + 0xa, 0x2a, 0x20, 0xc3, 0x51, 0x70, 0x92, 0x0, + 0xa, 0x7c, 0x76, 0xc0, 0x95, 0x77, 0x1e, 0x20, + 0xa, 0x2a, 0x20, 0xc0, 0x3b, 0x28, 0x6, 0x30, + 0xa, 0x4a, 0x32, 0xc0, 0x0, 0x0, 0x8, 0x0, + 0xa, 0x5b, 0x54, 0x80, 0x66, 0xd6, 0x66, 0x30, + 0x36, 0x6c, 0x76, 0x79, 0x0, 0xc1, 0x0, 0x0, + 0x1, 0xa, 0x20, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0x0, 0xa, 0x20, 0x0, 0x0, 0xc1, 0x0, 0x10, + 0x0, 0xa, 0x20, 0x16, 0x66, 0xd6, 0x68, 0xe2, + 0x0, 0x9, 0x20, 0x1, 0x0, 0x0, 0x0, 0x0, + + /* U+8F2A "輪" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x30, 0x0, 0x1, 0xe2, 0x0, 0x0, + 0x0, 0xc, 0x5, 0x10, 0x6, 0xb2, 0x0, 0x0, + 0x7, 0x6d, 0x66, 0x40, 0xd, 0x29, 0x0, 0x0, + 0x1, 0xc, 0x2, 0x0, 0x87, 0x3, 0xb0, 0x0, + 0xc, 0x6d, 0x6d, 0x44, 0x80, 0x1, 0xae, 0x70, + 0xb, 0x1c, 0xc, 0x45, 0x37, 0x66, 0x54, 0x10, + 0xb, 0x6d, 0x6d, 0x12, 0x0, 0x0, 0x4, 0x0, + 0xb, 0x1c, 0xc, 0xc, 0x6c, 0x6c, 0x6d, 0x30, + 0xb, 0x6d, 0x6d, 0xc, 0xb, 0xb, 0xc, 0x0, + 0x8, 0xc, 0x5, 0xc, 0xb, 0xb, 0xc, 0x0, + 0x26, 0x6d, 0x6b, 0x7c, 0x6c, 0x6c, 0x6d, 0x0, + 0x1, 0xc, 0x0, 0xc, 0xb, 0xb, 0xc, 0x0, + 0x0, 0xc, 0x0, 0xc, 0xb, 0xb, 0xc, 0x0, + 0x0, 0xc, 0x0, 0xc, 0x7, 0x6, 0x7d, 0x0, + 0x0, 0x5, 0x0, 0x2, 0x0, 0x0, 0x2, 0x0, + + /* U+8F38 "輸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x30, 0x0, 0x3, 0xb1, 0x0, 0x0, + 0x0, 0xc, 0x2, 0x0, 0x9, 0xb4, 0x0, 0x0, + 0x17, 0x6d, 0x69, 0x50, 0x2e, 0x27, 0x10, 0x0, + 0x0, 0xc, 0x1, 0x0, 0xc5, 0x2, 0xb1, 0x0, + 0xb, 0x6d, 0x6d, 0x58, 0x77, 0x68, 0x8e, 0x70, + 0xc, 0x1c, 0xc, 0x54, 0x0, 0x10, 0x6, 0x20, + 0xb, 0x6d, 0x6d, 0xb, 0x66, 0xd1, 0xc, 0x0, + 0xb, 0x1c, 0xc, 0xc, 0x1, 0xba, 0x2b, 0x0, + 0xc, 0x6d, 0x6d, 0xc, 0x56, 0xbb, 0xb, 0x0, + 0x9, 0xc, 0x5, 0xc, 0x1, 0xbb, 0xb, 0x0, + 0x26, 0x6d, 0x6b, 0x8c, 0x66, 0xbb, 0xb, 0x0, + 0x1, 0xc, 0x0, 0xc, 0x1, 0xba, 0x1b, 0x0, + 0x0, 0xc, 0x0, 0xc, 0x1, 0xb0, 0xb, 0x0, + 0x0, 0xc, 0x10, 0xc, 0x3b, 0x83, 0xab, 0x0, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8F9B "è¾›" */ + 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf4, 0x0, 0x1, 0x0, 0x0, + 0x46, 0x66, 0x6c, 0x76, 0x68, 0xd1, 0x0, 0x0, + 0x2, 0x20, 0x0, 0x39, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x30, 0x8, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x7a, 0x0, 0xa0, 0x0, 0x10, 0x5, 0x66, 0x67, + 0x96, 0x88, 0x66, 0x7f, 0x40, 0x10, 0x0, 0x0, + 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, + 0x0, 0x68, 0x0, 0x0, 0x47, 0x66, 0x6d, 0x86, + 0x66, 0x61, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + 0x0, + + /* U+8F9E "辞" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x30, 0x1, 0xb0, 0x0, 0x0, + 0x0, 0x26, 0xad, 0xa0, 0x0, 0x92, 0x2, 0x0, + 0x3, 0x43, 0xd0, 0x5, 0x76, 0x66, 0x69, 0x30, + 0x0, 0x0, 0xd0, 0x0, 0x40, 0x0, 0x92, 0x0, + 0x0, 0x0, 0xd0, 0x51, 0x49, 0x2, 0xe1, 0x0, + 0x6, 0x66, 0xe6, 0x63, 0xe, 0x7, 0x40, 0x0, + 0x0, 0x0, 0xd0, 0x1, 0x12, 0x18, 0x13, 0x50, + 0x0, 0x10, 0xd0, 0x36, 0x54, 0xd4, 0x44, 0x40, + 0x1, 0xe6, 0x76, 0xe0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xd0, 0x1, 0xb0, 0x0, 0xd0, 0x6, 0x0, + 0x0, 0xd0, 0x1, 0xb5, 0x76, 0xe6, 0x66, 0x10, + 0x0, 0xd0, 0x1, 0xb0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xe6, 0x66, 0xb0, 0x0, 0xd0, 0x0, 0x0, + 0x1, 0xb0, 0x0, 0x40, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, + + /* U+8FA6 "辦" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x43, 0x0, 0xb, 0x20, 0x6, 0x50, 0x0, + 0x0, 0xe, 0x0, 0xc, 0x0, 0x0, 0xd0, 0x0, + 0x5, 0x6b, 0x95, 0xc, 0x1, 0x66, 0x78, 0x90, + 0x1, 0x0, 0x72, 0x6d, 0x6d, 0x20, 0x5, 0x20, + 0x1, 0xa0, 0xc0, 0xb, 0xb, 0x19, 0xc, 0x30, + 0x0, 0xa4, 0x50, 0xb, 0xb, 0xc, 0x28, 0x0, + 0x7, 0x6b, 0x7a, 0x2a, 0xb, 0x56, 0x96, 0xd2, + 0x0, 0xc, 0x0, 0x47, 0x19, 0x10, 0xc0, 0x0, + 0x0, 0xc, 0x10, 0x83, 0x28, 0x0, 0xc0, 0x0, + 0x5, 0x6c, 0x74, 0xb0, 0x47, 0x46, 0xd7, 0xa0, + 0x0, 0x38, 0x4, 0x60, 0x65, 0x10, 0xc0, 0x0, + 0x0, 0x83, 0xa, 0x0, 0xa2, 0x0, 0xc0, 0x0, + 0x1, 0x90, 0x72, 0x3c, 0xc0, 0x0, 0xc0, 0x0, + 0x7, 0x15, 0x30, 0x1, 0x0, 0x0, 0xd0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, + + /* U+8FB2 "è¾²" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xd0, 0xd, 0x20, 0x10, 0x0, + 0x0, 0xe, 0x66, 0xd6, 0x6e, 0x66, 0xd3, 0x0, + 0x0, 0xd, 0x0, 0xb0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x66, 0xd6, 0x6e, 0x66, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0xb0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xb, 0x66, 0x76, 0x67, 0x66, 0xa0, 0x0, + 0x0, 0x9, 0x66, 0x66, 0x66, 0x66, 0xb8, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, + 0x0, 0xd, 0x47, 0x66, 0x66, 0x68, 0x10, 0x0, + 0x0, 0xe, 0x66, 0x66, 0x66, 0x66, 0x7d, 0x20, + 0x0, 0x1c, 0xb, 0x11, 0x50, 0x4, 0x60, 0x0, + 0x0, 0x67, 0xb, 0x10, 0x47, 0x3a, 0x20, 0x0, + 0x0, 0xb0, 0xb, 0x11, 0x43, 0xd5, 0x0, 0x0, + 0x7, 0x20, 0xe, 0xc6, 0x0, 0x19, 0xeb, 0x60, + 0x21, 0x0, 0x4, 0x0, 0x0, 0x0, 0x5, 0x0, + + /* U+8FBA "辺" */ + 0x0, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0x20, 0x0, 0x0, 0x0, 0x7, 0x0, + 0x0, 0xa, 0x34, 0x76, 0xb9, 0x66, 0x6d, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x1b, 0x0, + 0x0, 0x7, 0x0, 0x0, 0xc1, 0x0, 0x2a, 0x0, + 0x27, 0x6e, 0x30, 0x0, 0xd0, 0x0, 0x39, 0x0, + 0x0, 0xd, 0x0, 0x4, 0x90, 0x0, 0x48, 0x0, + 0x0, 0xd, 0x0, 0x9, 0x40, 0x0, 0x67, 0x0, + 0x0, 0xd, 0x0, 0x1b, 0x0, 0x0, 0x76, 0x0, + 0x0, 0xd, 0x0, 0x82, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0xd, 0x4, 0x50, 0x2, 0x56, 0xe0, 0x0, + 0x2, 0xa9, 0x74, 0x0, 0x0, 0x2d, 0x40, 0x0, + 0x2e, 0x30, 0x4b, 0x41, 0x0, 0x0, 0x1, 0x21, + 0x2, 0x0, 0x1, 0x8c, 0xef, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+8FBC "è¾¼" */ + 0x0, 0x50, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x6c, 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x30, 0x0, 0x33, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, + 0x17, 0x6e, 0x50, 0x0, 0x79, 0x50, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xd0, 0xa0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x7, 0x60, 0x74, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x2a, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x90, 0x0, 0x7, 0xb0, 0x0, + 0x0, 0xd, 0x6, 0x0, 0x0, 0x0, 0xbd, 0x40, + 0x2, 0xaa, 0x80, 0x0, 0x0, 0x0, 0x8, 0x40, + 0x1e, 0x50, 0x4a, 0x41, 0x0, 0x0, 0x0, 0x10, + 0x2, 0x0, 0x1, 0x7b, 0xde, 0xee, 0xff, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8FCE "迎" */ + 0x0, 0x30, 0x0, 0x0, 0x1a, 0x10, 0x0, 0x0, + 0x0, 0x69, 0x0, 0x56, 0x84, 0x10, 0x1, 0x0, + 0x0, 0xf, 0x10, 0xd0, 0x0, 0xd6, 0x6d, 0x30, + 0x0, 0x2, 0x0, 0xd0, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0x1, 0x0, 0xd0, 0x0, 0xd0, 0xd, 0x0, + 0x7, 0x6e, 0x20, 0xd0, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0x2, 0xd0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xd7, 0x70, 0xd0, 0xd, 0x0, + 0x0, 0xd, 0x1, 0xf6, 0x0, 0xd3, 0xad, 0x0, + 0x0, 0xd, 0x0, 0x10, 0x0, 0xd0, 0x11, 0x0, + 0x4, 0xb6, 0x80, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x2d, 0x10, 0x2a, 0x74, 0x32, 0x42, 0x24, 0x51, + 0x0, 0x0, 0x0, 0x37, 0xab, 0xcd, 0xdd, 0x30, + + /* U+8FD1 "è¿‘" */ + 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x62, 0x0, + 0x0, 0x4b, 0x0, 0x16, 0x47, 0x9a, 0x85, 0x0, + 0x0, 0xc, 0x20, 0x1c, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x1c, 0x0, 0x0, 0x2, 0x30, + 0x18, 0x6e, 0x30, 0x1d, 0x66, 0x6c, 0x67, 0x60, + 0x0, 0xd, 0x0, 0x1b, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x39, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x65, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xa0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x4, 0x50, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x5a, 0x43, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x9, 0x80, 0x49, 0x30, 0x0, 0x2, 0x0, 0x10, + 0x19, 0x0, 0x1, 0x8c, 0xde, 0xff, 0xff, 0x91, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+8FD4 "è¿”" */ + 0x0, 0x30, 0x0, 0x0, 0x0, 0x3, 0x80, 0x0, + 0x0, 0x3b, 0x0, 0x65, 0x78, 0x99, 0x82, 0x0, + 0x0, 0xc, 0x30, 0xa3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa8, 0x66, 0x66, 0xc2, 0x0, + 0x17, 0x6c, 0x30, 0xb2, 0x0, 0x2, 0xd0, 0x0, + 0x1, 0xd, 0x0, 0xc3, 0x10, 0x9, 0x50, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0x47, 0x3c, 0x0, 0x0, + 0x0, 0xd, 0x1, 0xa0, 0x1, 0xf9, 0x0, 0x0, + 0x0, 0xd, 0x6, 0x30, 0x9, 0x68, 0xc1, 0x0, + 0x0, 0xd, 0x8, 0x0, 0x95, 0x0, 0x8b, 0x0, + 0x0, 0x1c, 0x40, 0x37, 0x10, 0x0, 0x5, 0x0, + 0x7, 0x90, 0x58, 0x51, 0x0, 0x0, 0x1, 0x20, + 0x19, 0x0, 0x1, 0x7c, 0xef, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8FEB "è¿«" */ + 0x0, 0x0, 0x0, 0x0, 0x28, 0x0, 0x0, 0x0, + 0x0, 0x74, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x30, 0x10, 0x80, 0x0, 0x30, 0x0, + 0x0, 0x9, 0x20, 0xb7, 0x76, 0x66, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0xe0, 0x0, + 0x14, 0x4a, 0x20, 0xb3, 0x0, 0x0, 0xe0, 0x0, + 0x3, 0x1d, 0x10, 0xb7, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0xb3, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0xb3, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0xb3, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0xb7, 0x66, 0x66, 0xe0, 0x0, + 0x1, 0x99, 0x80, 0x91, 0x0, 0x0, 0x90, 0x0, + 0x2e, 0x40, 0x3a, 0x64, 0x22, 0x22, 0x34, 0x50, + 0x3, 0x0, 0x0, 0x58, 0xbc, 0xde, 0xee, 0x30, + + /* U+8FFD "追" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0x95, 0x0, 0x0, 0x56, 0x0, 0x10, 0x0, + 0x0, 0x2f, 0x0, 0xb6, 0x86, 0x66, 0xe1, 0x0, + 0x0, 0x6, 0x0, 0xc0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xd0, 0x0, + 0x16, 0x6b, 0x30, 0xc6, 0x55, 0x55, 0xd0, 0x0, + 0x1, 0xd, 0x0, 0xc0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0xd, 0x0, 0xc6, 0x66, 0x66, 0x98, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0x0, 0x0, 0x76, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0x0, 0x0, 0x76, 0x0, + 0x0, 0xd, 0x0, 0xd6, 0x66, 0x66, 0xa6, 0x0, + 0x1, 0x99, 0x70, 0xd0, 0x0, 0x0, 0x64, 0x0, + 0x2e, 0x40, 0x3a, 0x61, 0x0, 0x0, 0x0, 0x20, + 0x4, 0x0, 0x1, 0x7b, 0xde, 0xee, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, + + /* U+9000 "退" */ + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x87, 0x0, 0x4a, 0x66, 0x66, 0xe1, 0x0, + 0x0, 0x1f, 0x0, 0x3a, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x2, 0x0, 0x3c, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x3a, 0x0, 0x0, 0xe0, 0x0, + 0x6, 0x6c, 0x30, 0x3a, 0x0, 0x0, 0xe0, 0x0, + 0x1, 0xe, 0x0, 0x3c, 0x66, 0x66, 0xb2, 0x0, + 0x0, 0xe, 0x0, 0x3a, 0x10, 0x0, 0x8a, 0x0, + 0x0, 0xe, 0x0, 0x3a, 0x6, 0x77, 0x30, 0x0, + 0x0, 0xe, 0x0, 0x3a, 0x1, 0x4b, 0x70, 0x0, + 0x0, 0xe, 0x0, 0x3c, 0x85, 0x0, 0xab, 0x0, + 0x2, 0x97, 0x80, 0x3d, 0x20, 0x0, 0x9, 0x0, + 0x1e, 0x20, 0x1a, 0x74, 0x21, 0x11, 0x23, 0x41, + 0x0, 0x0, 0x0, 0x59, 0xbd, 0xef, 0xff, 0x40, + + /* U+9001 "é€" */ + 0x0, 0x20, 0x0, 0x14, 0x0, 0x7, 0x30, 0x0, + 0x0, 0x78, 0x0, 0x9, 0x60, 0xd, 0x20, 0x0, + 0x0, 0xf, 0x10, 0x3, 0xb0, 0x46, 0x0, 0x0, + 0x0, 0x3, 0x0, 0x56, 0x66, 0xa6, 0x7c, 0x10, + 0x0, 0x0, 0x0, 0x10, 0xb, 0x20, 0x0, 0x0, + 0x27, 0x6d, 0x10, 0x0, 0xc, 0x10, 0x2, 0x10, + 0x0, 0xd, 0x6, 0x66, 0x6e, 0x66, 0x6a, 0x80, + 0x0, 0xd, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x6b, 0x60, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x1, 0xc1, 0x2c, 0x60, 0x0, + 0x0, 0xd, 0x0, 0xa, 0x20, 0x1, 0xd7, 0x0, + 0x0, 0x8b, 0x62, 0x71, 0x0, 0x0, 0x28, 0x0, + 0x2d, 0x50, 0x5b, 0x40, 0x0, 0x0, 0x1, 0x21, + 0x4, 0x0, 0x1, 0x8c, 0xcd, 0xee, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+9003 "逃" */ + 0x0, 0x10, 0x0, 0x0, 0x91, 0x92, 0x0, 0x0, + 0x0, 0x76, 0x0, 0x0, 0xd0, 0xd0, 0x0, 0x0, + 0x0, 0x1f, 0x4, 0x10, 0xd0, 0xd0, 0x3e, 0x10, + 0x0, 0x4, 0x1, 0xd0, 0xd0, 0xd2, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0xa0, 0xd0, 0xd5, 0x0, 0x0, + 0x5, 0x6c, 0x20, 0x0, 0xd0, 0xd0, 0x0, 0x0, + 0x1, 0xd, 0x0, 0x7, 0xe0, 0xd7, 0x92, 0x0, + 0x0, 0xd, 0x5, 0xa1, 0xd0, 0xd0, 0x6d, 0x0, + 0x0, 0xd, 0x1b, 0x13, 0xa0, 0xd0, 0x3, 0x20, + 0x0, 0xd, 0x0, 0x9, 0x30, 0xd0, 0x0, 0x60, + 0x0, 0xd, 0x0, 0x37, 0x0, 0xc3, 0x14, 0xb0, + 0x0, 0x4b, 0x42, 0x50, 0x0, 0x49, 0x99, 0x50, + 0xc, 0x70, 0x59, 0x41, 0x0, 0x0, 0x12, 0x31, + 0x3, 0x0, 0x1, 0x7b, 0xde, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+900F "é€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0x60, 0x0, + 0x0, 0x93, 0x0, 0x45, 0x7d, 0x75, 0x30, 0x0, + 0x0, 0x3e, 0x0, 0x0, 0xc, 0x0, 0x5, 0x10, + 0x0, 0x4, 0x7, 0x66, 0xce, 0x96, 0x67, 0x50, + 0x0, 0x0, 0x0, 0x7, 0x6c, 0x28, 0x0, 0x0, + 0x14, 0x4a, 0x10, 0x75, 0xc, 0x3, 0xc8, 0x40, + 0x3, 0x1d, 0x26, 0x76, 0x6a, 0x69, 0x28, 0x40, + 0x0, 0xd, 0x0, 0x12, 0xc0, 0xc, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x3, 0x90, 0x7a, 0xa5, 0x0, + 0x0, 0xd, 0x0, 0x9, 0x20, 0x10, 0xa3, 0x0, + 0x0, 0xd, 0x0, 0x38, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x6b, 0x32, 0x60, 0x2, 0x8b, 0x90, 0x0, + 0x1d, 0x50, 0x59, 0x30, 0x0, 0x17, 0x0, 0x10, + 0x5, 0x0, 0x2, 0x8c, 0xde, 0xee, 0xef, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + + /* U+9010 "é€" */ + 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x6a, 0x2, 0x76, 0x67, 0x76, 0x6a, 0xa0, + 0x0, 0xe, 0x10, 0x0, 0x1c, 0x20, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x1, 0xa7, 0x0, 0x9, 0x30, + 0x0, 0x0, 0x0, 0x37, 0x6, 0x50, 0x88, 0x10, + 0x16, 0x6c, 0x32, 0x20, 0x2b, 0xc7, 0x20, 0x0, + 0x0, 0xd, 0x0, 0x4, 0x80, 0x85, 0x0, 0x0, + 0x0, 0xd, 0x1, 0x64, 0x2, 0xeb, 0x70, 0x0, + 0x0, 0xd, 0x2, 0x0, 0x3c, 0x5a, 0x3d, 0x20, + 0x0, 0xd, 0x0, 0x7, 0x90, 0x3a, 0x6, 0xc0, + 0x0, 0xd, 0x3, 0x73, 0x0, 0x68, 0x0, 0x60, + 0x0, 0x78, 0x61, 0x0, 0x5b, 0xe2, 0x0, 0x0, + 0x1d, 0x40, 0x39, 0x41, 0x3, 0x30, 0x0, 0x0, + 0x4, 0x0, 0x1, 0x7b, 0xde, 0xee, 0xef, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, + + /* U+9019 "這" */ + 0x0, 0x70, 0x0, 0x0, 0x9, 0x10, 0x0, 0x0, + 0x0, 0x5d, 0x0, 0x0, 0x7, 0x70, 0x0, 0x0, + 0x0, 0xb, 0x3, 0x66, 0x67, 0x76, 0x8d, 0x10, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x26, 0x66, 0x67, 0xd1, 0x0, + 0x18, 0x6f, 0x40, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x17, 0x66, 0x67, 0xc0, 0x0, + 0x0, 0xd, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x39, 0x66, 0x66, 0xc4, 0x0, + 0x0, 0xd, 0x0, 0x2a, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x2a, 0x0, 0x0, 0xd0, 0x0, + 0x3, 0xb8, 0x70, 0x2c, 0x66, 0x66, 0xe0, 0x0, + 0x3e, 0x10, 0x2a, 0x76, 0x0, 0x0, 0x11, 0x31, + 0x1, 0x0, 0x0, 0x5a, 0xce, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+901A "通" */ + 0x0, 0x10, 0x0, 0x56, 0x66, 0x66, 0xa2, 0x0, + 0x0, 0xb4, 0x0, 0x11, 0x20, 0x8, 0x83, 0x0, + 0x0, 0x4c, 0x0, 0x0, 0x4c, 0x61, 0x0, 0x0, + 0x0, 0x3, 0x1, 0xa6, 0x6d, 0x86, 0x6c, 0x10, + 0x0, 0x0, 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, + 0x17, 0x6d, 0x30, 0xc0, 0xd, 0x0, 0xd, 0x0, + 0x1, 0xd, 0x0, 0xd6, 0x6e, 0x66, 0x6d, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xd6, 0x6e, 0x66, 0x6d, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, + 0x0, 0x6a, 0x51, 0xa0, 0x8, 0x5, 0xcb, 0x0, + 0x1c, 0x60, 0x49, 0x41, 0x0, 0x0, 0x22, 0x21, + 0x6, 0x0, 0x1, 0x7b, 0xef, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, + + /* U+901F "速" */ + 0x0, 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, + 0x1, 0x91, 0x0, 0x0, 0xd, 0x0, 0x2, 0x0, + 0x0, 0x7c, 0x7, 0x66, 0x6e, 0x66, 0x6a, 0x30, + 0x0, 0x16, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa6, 0x6e, 0x66, 0xd4, 0x0, + 0x1, 0x16, 0x10, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x17, 0x5d, 0x20, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xc6, 0x9f, 0x66, 0xc0, 0x0, + 0x0, 0xd, 0x0, 0x11, 0xbe, 0x51, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xa, 0x2d, 0x1a, 0xa1, 0x0, + 0x0, 0xd, 0x1, 0x81, 0xd, 0x0, 0x7d, 0x0, + 0x0, 0x7a, 0x65, 0x0, 0xe, 0x0, 0x4, 0x0, + 0x1d, 0x50, 0x49, 0x30, 0x8, 0x0, 0x1, 0x21, + 0x3, 0x0, 0x1, 0x7c, 0xde, 0xef, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9020 "造" */ + 0x0, 0x10, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, + 0x0, 0xa6, 0x0, 0x2b, 0x1d, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0x0, 0x5b, 0xd, 0x0, 0x81, 0x0, + 0x0, 0x4, 0x0, 0x96, 0x6e, 0x66, 0x63, 0x0, + 0x0, 0x0, 0x0, 0x70, 0xd, 0x0, 0x0, 0x0, + 0x3, 0x39, 0x12, 0x0, 0xd, 0x0, 0x7, 0x40, + 0x5, 0x3d, 0x16, 0x66, 0x66, 0x66, 0x66, 0x50, + 0x0, 0xd, 0x0, 0x9, 0x66, 0x66, 0xa2, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, + 0x2, 0xa9, 0x50, 0xe, 0x66, 0x66, 0xd0, 0x0, + 0x2e, 0x30, 0x5a, 0x43, 0x0, 0x0, 0x0, 0x11, + 0x2, 0x0, 0x1, 0x8b, 0xdd, 0xef, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9023 "連" */ + 0x0, 0x50, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, + 0x0, 0x5a, 0x0, 0x0, 0xc, 0x0, 0x25, 0x0, + 0x0, 0xd, 0x13, 0x76, 0x6d, 0x66, 0x65, 0x0, + 0x0, 0x0, 0x0, 0x86, 0x6d, 0x66, 0xa3, 0x0, + 0x0, 0x4, 0x0, 0xc0, 0xc, 0x0, 0xb1, 0x0, + 0x27, 0x5e, 0x40, 0xc6, 0x6d, 0x66, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0xc, 0x0, 0xb0, 0x0, + 0x0, 0xd, 0x0, 0xc6, 0x6d, 0x66, 0xd1, 0x0, + 0x0, 0xd, 0x0, 0x70, 0xc, 0x0, 0x50, 0x0, + 0x0, 0xd, 0x26, 0x66, 0x6d, 0x66, 0x6c, 0x50, + 0x0, 0x1e, 0x1, 0x0, 0xc, 0x0, 0x0, 0x0, + 0x6, 0xc5, 0x91, 0x0, 0xc, 0x0, 0x0, 0x0, + 0x2d, 0x10, 0x2b, 0x84, 0x27, 0x22, 0x34, 0x50, + 0x0, 0x0, 0x0, 0x38, 0xab, 0xcc, 0xcc, 0x20, + + /* U+902E "逮" */ + 0x0, 0x20, 0x0, 0x0, 0xb, 0x10, 0x0, 0x0, + 0x0, 0x78, 0x0, 0x0, 0xd, 0x0, 0x50, 0x0, + 0x0, 0xe, 0x10, 0x76, 0x6e, 0x66, 0xe2, 0x0, + 0x0, 0x1, 0x0, 0x0, 0xd, 0x0, 0xe3, 0x40, + 0x0, 0x0, 0x7, 0x66, 0x6e, 0x66, 0xe6, 0x50, + 0x17, 0x6e, 0x40, 0x56, 0x6e, 0x66, 0xe0, 0x0, + 0x0, 0xd, 0x1, 0x40, 0xd, 0x0, 0x40, 0x0, + 0x0, 0xd, 0x0, 0x7b, 0xd, 0x8, 0xc0, 0x0, + 0x0, 0xd, 0x0, 0x5, 0x3d, 0x73, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x58, 0x3d, 0x78, 0x20, 0x0, + 0x0, 0xd, 0xd, 0x70, 0xd, 0x1, 0xc8, 0x0, + 0x0, 0x87, 0x50, 0x7, 0x8d, 0x0, 0x7, 0x0, + 0x1c, 0x30, 0x49, 0x30, 0x86, 0x0, 0x0, 0x10, + 0x4, 0x0, 0x1, 0x8c, 0xdd, 0xde, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+9031 "週" */ + 0x0, 0x71, 0x0, 0x40, 0x0, 0x0, 0x5, 0x0, + 0x0, 0x2e, 0x20, 0xd6, 0x6a, 0xb6, 0x6e, 0x10, + 0x0, 0x8, 0x30, 0xc0, 0x7, 0x54, 0xc, 0x0, + 0x0, 0x0, 0x0, 0xc0, 0x7a, 0x97, 0x1c, 0x0, + 0x0, 0x6, 0x0, 0xc0, 0x7, 0x52, 0xc, 0x0, + 0x27, 0x6e, 0x30, 0xb4, 0x77, 0x68, 0x5c, 0x0, + 0x0, 0xd, 0x0, 0xb0, 0x86, 0x6a, 0xc, 0x0, + 0x0, 0xd, 0x0, 0xa0, 0xc0, 0xc, 0xc, 0x0, + 0x0, 0xd, 0x2, 0x60, 0xc0, 0xb, 0xc, 0x0, + 0x0, 0xd, 0x6, 0x20, 0xd6, 0x6b, 0xc, 0x0, + 0x0, 0xd, 0x7, 0x0, 0x40, 0x0, 0xb, 0x0, + 0x3, 0xa8, 0x82, 0x0, 0x0, 0x15, 0xd8, 0x0, + 0x2e, 0x20, 0x4a, 0x41, 0x0, 0x0, 0x10, 0x11, + 0x2, 0x0, 0x1, 0x7b, 0xde, 0xee, 0xff, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9032 "進" */ + 0x0, 0x51, 0x0, 0x1a, 0x27, 0x30, 0x0, 0x0, + 0x0, 0x3e, 0x10, 0x5c, 0x11, 0xe0, 0x0, 0x0, + 0x0, 0xa, 0x30, 0xa4, 0x0, 0x50, 0x26, 0x0, + 0x0, 0x0, 0x1, 0xf7, 0x66, 0xc6, 0x66, 0x10, + 0x0, 0x5, 0x7, 0xc2, 0x0, 0xc0, 0x10, 0x0, + 0x7, 0x6e, 0x57, 0x97, 0x66, 0xd6, 0xa6, 0x0, + 0x0, 0xd, 0x10, 0x92, 0x0, 0xc0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x97, 0x66, 0xd6, 0xb7, 0x0, + 0x0, 0xd, 0x0, 0x92, 0x0, 0xc0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x92, 0x0, 0xc0, 0x1, 0x0, + 0x0, 0xd, 0x0, 0x97, 0x66, 0xc6, 0x8d, 0x20, + 0x3, 0xc8, 0x90, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0x30, 0x3b, 0x62, 0x0, 0x0, 0x12, 0x31, + 0x2, 0x0, 0x0, 0x7c, 0xef, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+9045 "é…" */ + 0x0, 0x61, 0x0, 0x40, 0x0, 0x0, 0x4, 0x0, + 0x0, 0x3d, 0x0, 0xd6, 0x66, 0x66, 0x6e, 0x30, + 0x0, 0xb, 0x20, 0xd0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, + 0x0, 0x3, 0x0, 0xd0, 0x75, 0x4, 0xb0, 0x0, + 0x18, 0x6e, 0x50, 0xc0, 0xc, 0x9, 0x27, 0x0, + 0x0, 0xd, 0x0, 0xc6, 0x76, 0xe6, 0x66, 0x10, + 0x0, 0xd, 0x1, 0x93, 0x66, 0xe6, 0x88, 0x0, + 0x0, 0xd, 0x5, 0x40, 0x10, 0xd0, 0x0, 0x0, + 0x0, 0xd, 0x8, 0x47, 0x66, 0xe6, 0x69, 0xa0, + 0x0, 0xd, 0x23, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x2, 0xb9, 0x90, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x2e, 0x40, 0x4b, 0x40, 0x0, 0x60, 0x0, 0x10, + 0x3, 0x0, 0x1, 0x7c, 0xdd, 0xdd, 0xef, 0x81, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+904A "éŠ" */ + 0x0, 0x81, 0x0, 0x43, 0x0, 0x8, 0x0, 0x0, + 0x0, 0x3e, 0x10, 0xe, 0x0, 0x3b, 0x10, 0x0, + 0x0, 0x9, 0x10, 0x3, 0x10, 0xa7, 0x46, 0xa0, + 0x0, 0x0, 0x7, 0xa6, 0x89, 0x82, 0x22, 0x20, + 0x0, 0x5, 0x0, 0xb0, 0x15, 0x46, 0x6a, 0x60, + 0x27, 0x6f, 0x30, 0xc6, 0xc5, 0x0, 0x38, 0x10, + 0x0, 0xd, 0x0, 0xc0, 0xb1, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x1, 0xa0, 0xc3, 0x66, 0xc7, 0xc1, + 0x0, 0xd, 0x5, 0x50, 0xc0, 0x0, 0xb0, 0x0, + 0x0, 0xd, 0x9, 0x0, 0xc0, 0x0, 0xb0, 0x0, + 0x0, 0xd, 0x43, 0x36, 0x80, 0x0, 0xa0, 0x0, + 0x3, 0xaa, 0x60, 0x2c, 0x10, 0x4c, 0x80, 0x0, + 0x2e, 0x20, 0x68, 0x20, 0x0, 0x2, 0x0, 0x11, + 0x1, 0x0, 0x2, 0x8b, 0xcd, 0xdd, 0xef, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, + + /* U+904B "é‹" */ + 0x1, 0x70, 0x1, 0x40, 0x0, 0x0, 0x6, 0x0, + 0x0, 0x7c, 0x5, 0x96, 0x66, 0x66, 0x7e, 0x40, + 0x0, 0xd, 0xd, 0x20, 0xb, 0x30, 0x51, 0x0, + 0x0, 0x0, 0x3, 0x76, 0x6d, 0x66, 0x97, 0x0, + 0x0, 0x1, 0x0, 0x30, 0xb, 0x0, 0x40, 0x0, + 0x17, 0x6e, 0x30, 0xb6, 0x6d, 0x66, 0xd3, 0x0, + 0x0, 0xd, 0x0, 0xb6, 0x6d, 0x66, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xb0, 0xb, 0x0, 0xb0, 0x0, + 0x0, 0xd, 0x0, 0xb6, 0x6d, 0x66, 0xd1, 0x0, + 0x0, 0xd, 0x0, 0x30, 0xb, 0x0, 0x25, 0x0, + 0x0, 0xd, 0x7, 0x66, 0x6d, 0x66, 0x67, 0x40, + 0x2, 0xa9, 0x50, 0x0, 0xb, 0x0, 0x0, 0x0, + 0x2e, 0x30, 0x59, 0x30, 0x9, 0x0, 0x0, 0x10, + 0x2, 0x0, 0x1, 0x8c, 0xde, 0xee, 0xef, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+904E "éŽ" */ + 0x0, 0x70, 0x0, 0x4, 0x0, 0x0, 0x40, 0x0, + 0x0, 0x4d, 0x0, 0xf, 0x66, 0x66, 0xc0, 0x0, + 0x0, 0xc, 0x10, 0xf, 0x66, 0x91, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x4, 0x81, 0xa0, 0x0, + 0x0, 0x5, 0x1, 0xe, 0x4, 0x71, 0xa2, 0x0, + 0x27, 0x6f, 0x2a, 0x78, 0x66, 0x76, 0x7d, 0x40, + 0x0, 0xd, 0xa, 0x20, 0x86, 0x69, 0x1c, 0x0, + 0x0, 0xd, 0x9, 0x20, 0xc0, 0xc, 0xc, 0x0, + 0x0, 0xd, 0x9, 0x20, 0xc0, 0xc, 0xc, 0x0, + 0x0, 0xd, 0x9, 0x20, 0xd6, 0x6d, 0xc, 0x0, + 0x0, 0xd, 0xa, 0x30, 0x60, 0x4, 0xd, 0x0, + 0x3, 0xa9, 0x56, 0x10, 0x0, 0x2, 0x9b, 0x0, + 0x3e, 0x20, 0x5a, 0x41, 0x0, 0x0, 0x0, 0x20, + 0x2, 0x0, 0x1, 0x7c, 0xde, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+9053 "é“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x60, 0x0, 0x7, 0x10, 0x6, 0x80, 0x0, + 0x0, 0x4d, 0x0, 0x3, 0xd0, 0xc, 0x20, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x80, 0x53, 0x6, 0x40, + 0x0, 0x0, 0x6, 0x76, 0x6d, 0x66, 0x66, 0x50, + 0x0, 0x2, 0x0, 0x5, 0x29, 0x22, 0x72, 0x0, + 0x17, 0x6e, 0x40, 0x1d, 0x33, 0x33, 0xd2, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0xc, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0xc, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x66, 0x66, 0xe0, 0x0, + 0x4, 0xa3, 0x80, 0x1a, 0x0, 0x0, 0x90, 0x0, + 0xb, 0x10, 0x1a, 0x73, 0x10, 0x0, 0x12, 0x30, + 0x0, 0x0, 0x0, 0x48, 0xbd, 0xee, 0xff, 0x60, + + /* U+9054 "é”" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x85, 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x56, 0x6c, 0x76, 0xd3, 0x0, + 0x0, 0x5, 0x10, 0x10, 0xa, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x66, 0x6c, 0x76, 0x6c, 0x90, + 0x0, 0x7, 0x1, 0x6, 0x40, 0xa, 0x20, 0x0, + 0x28, 0x6e, 0x30, 0x1, 0xe0, 0x49, 0x4, 0x0, + 0x0, 0xd, 0x3, 0x76, 0x89, 0x96, 0x69, 0x30, + 0x0, 0xd, 0x0, 0x0, 0xa, 0x20, 0x60, 0x0, + 0x0, 0xd, 0x0, 0x57, 0x6c, 0x76, 0x72, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xa, 0x20, 0x8, 0x10, + 0x0, 0xd, 0x6, 0x66, 0x6c, 0x76, 0x66, 0x30, + 0x5, 0xb8, 0x70, 0x0, 0xa, 0x20, 0x0, 0x0, + 0x3e, 0x20, 0x4a, 0x41, 0x8, 0x10, 0x0, 0x10, + 0x1, 0x0, 0x1, 0x7c, 0xde, 0xef, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9055 "é•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x70, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, + 0x0, 0x6d, 0x0, 0x57, 0xc6, 0x6b, 0x50, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x90, 0xa, 0x10, 0x0, + 0x0, 0x0, 0x5, 0x66, 0xb6, 0x6c, 0x6c, 0x60, + 0x0, 0x4, 0x1, 0x22, 0x0, 0x0, 0x40, 0x0, + 0x37, 0x6f, 0x30, 0x1c, 0x66, 0x67, 0xc0, 0x0, + 0x0, 0xd, 0x0, 0x1c, 0x66, 0x67, 0xa0, 0x0, + 0x0, 0xd, 0x0, 0x14, 0xc, 0x1, 0x50, 0x0, + 0x0, 0xd, 0x4, 0x76, 0x6d, 0x66, 0xa3, 0x0, + 0x0, 0xd, 0x0, 0x95, 0xc, 0x0, 0x3, 0x0, + 0x0, 0xd, 0x2, 0xe6, 0x6d, 0x66, 0x69, 0x50, + 0x4, 0xb9, 0x50, 0x0, 0xc, 0x0, 0x0, 0x0, + 0x4e, 0x20, 0x79, 0x20, 0x7, 0x0, 0x0, 0x10, + 0x1, 0x0, 0x3, 0xad, 0xdd, 0xde, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9060 "é " */ + 0x0, 0x30, 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, + 0x0, 0x3b, 0x0, 0x0, 0x8, 0x30, 0x70, 0x0, + 0x0, 0xb, 0x50, 0x76, 0x6b, 0x86, 0x63, 0x0, + 0x0, 0x1, 0x15, 0x66, 0x6b, 0x86, 0x69, 0x80, + 0x0, 0x1, 0x2, 0x20, 0x0, 0x0, 0x40, 0x0, + 0x28, 0x6f, 0x20, 0xc7, 0x66, 0x66, 0xe2, 0x0, + 0x0, 0xd, 0x0, 0xb1, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xc6, 0x7e, 0x66, 0xa0, 0x0, + 0x0, 0xd, 0x0, 0x12, 0xcd, 0x0, 0x78, 0x0, + 0x0, 0xd, 0x0, 0x69, 0x2c, 0x5a, 0x50, 0x0, + 0x0, 0xd, 0x25, 0x30, 0xc, 0x1, 0xa9, 0x0, + 0x3, 0xb9, 0x50, 0x0, 0x1d, 0x0, 0x8, 0x20, + 0x3e, 0x20, 0x49, 0x30, 0x6, 0x0, 0x0, 0x10, + 0x1, 0x0, 0x1, 0x7b, 0xcd, 0xee, 0xff, 0x81, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9069 "é©" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x50, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, + 0x0, 0x79, 0x0, 0x0, 0x5, 0x40, 0x3, 0x0, + 0x0, 0x1e, 0x3, 0x77, 0x66, 0x69, 0x69, 0x50, + 0x0, 0x0, 0x0, 0x3, 0xa0, 0x1b, 0x10, 0x0, + 0x0, 0x3, 0x0, 0x96, 0xb6, 0xa7, 0x6a, 0x10, + 0x27, 0x6f, 0x40, 0xc0, 0x6, 0x70, 0xc, 0x0, + 0x0, 0xd, 0x0, 0xc3, 0x7a, 0x8a, 0x4c, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0x6, 0x41, 0xc, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0xd7, 0x7d, 0xc, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0xc0, 0xc, 0xc, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0xd6, 0x6c, 0xc, 0x0, + 0x3, 0xa9, 0x50, 0xa0, 0x30, 0x5, 0x7c, 0x0, + 0x3e, 0x20, 0x59, 0x30, 0x0, 0x0, 0x54, 0x11, + 0x2, 0x0, 0x1, 0x8c, 0xde, 0xee, 0xff, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+9078 "é¸" */ + 0x0, 0x71, 0x0, 0x20, 0x20, 0x30, 0x4, 0x0, + 0x0, 0x3e, 0x10, 0xc6, 0xa3, 0xb6, 0x6d, 0x0, + 0x0, 0xa, 0x20, 0xc6, 0xa1, 0xb6, 0x6b, 0x0, + 0x0, 0x0, 0x0, 0xb0, 0x22, 0xb0, 0x6, 0x30, + 0x0, 0x3, 0x0, 0xb6, 0x69, 0x87, 0x57, 0x80, + 0x27, 0x6f, 0x30, 0x3, 0x91, 0x17, 0x32, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0x2d, 0x17, 0x0, + 0x0, 0xd, 0x1, 0x76, 0xd6, 0x7c, 0x66, 0x20, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0x2b, 0x1, 0x30, + 0x0, 0xd, 0x17, 0x66, 0x96, 0x77, 0x66, 0x70, + 0x0, 0xd, 0x0, 0x7, 0xc0, 0x29, 0x70, 0x0, + 0x4, 0xca, 0x61, 0x85, 0x0, 0x0, 0x8a, 0x0, + 0x3f, 0x30, 0x5b, 0x30, 0x0, 0x0, 0x2, 0x0, + 0x2, 0x0, 0x1, 0x8b, 0xcc, 0xdd, 0xde, 0x91, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, + + /* U+907F "é¿" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x40, 0x0, 0x0, 0x0, 0x8, 0x30, 0x0, + 0x0, 0x79, 0x9, 0x66, 0xc3, 0x2, 0xb0, 0x40, + 0x0, 0xd, 0xa, 0x10, 0xc4, 0x76, 0x67, 0x60, + 0x0, 0x0, 0xa, 0x10, 0xc0, 0x70, 0xd, 0x10, + 0x0, 0x1, 0xa, 0x65, 0xd1, 0x67, 0x46, 0x0, + 0x17, 0x6f, 0x2b, 0x0, 0x24, 0x77, 0x96, 0xc2, + 0x0, 0xd, 0xb, 0x20, 0x22, 0x11, 0xa0, 0x0, + 0x0, 0xd, 0xa, 0xe6, 0xa7, 0x1, 0xa0, 0x0, + 0x0, 0xd, 0x26, 0xd0, 0x77, 0x77, 0xc6, 0xb1, + 0x0, 0xd, 0x60, 0xd0, 0x75, 0x1, 0xa0, 0x0, + 0x0, 0xd, 0x30, 0xe6, 0xa5, 0x1, 0xa0, 0x0, + 0x1, 0x97, 0x50, 0x80, 0x42, 0x2, 0xb0, 0x0, + 0xd, 0x20, 0x4a, 0x41, 0x0, 0x0, 0x20, 0x11, + 0x0, 0x0, 0x0, 0x7b, 0xde, 0xee, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9084 "é‚„" */ + 0x0, 0x92, 0x0, 0x86, 0x66, 0x66, 0x6b, 0x10, + 0x0, 0x3e, 0x10, 0xd0, 0xb0, 0xb, 0xc, 0x0, + 0x0, 0xa, 0x10, 0xd0, 0xb0, 0xb, 0xc, 0x0, + 0x0, 0x0, 0x0, 0xd6, 0x86, 0x68, 0x6a, 0x10, + 0x0, 0x2, 0x6, 0x65, 0x55, 0x55, 0x57, 0xa0, + 0x17, 0x6f, 0x20, 0x56, 0x66, 0x66, 0x85, 0x0, + 0x0, 0xd, 0x0, 0x84, 0x0, 0x0, 0x65, 0x0, + 0x0, 0xd, 0x0, 0x88, 0x87, 0x66, 0x95, 0x0, + 0x0, 0xd, 0x0, 0x25, 0xc1, 0x0, 0x95, 0x0, + 0x0, 0xd, 0x0, 0x5d, 0x55, 0x99, 0x40, 0x0, + 0x0, 0xd, 0x7, 0x65, 0x50, 0x4b, 0xc3, 0x0, + 0x0, 0x9a, 0x50, 0x7, 0xd9, 0x30, 0x5d, 0x0, + 0x1d, 0x40, 0x68, 0x32, 0x40, 0x0, 0x1, 0x0, + 0x16, 0x0, 0x2, 0x8c, 0xdd, 0xee, 0xef, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+908A "邊" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x7, 0x60, 0x10, 0x0, + 0x0, 0x79, 0x0, 0xd, 0x67, 0x66, 0xd2, 0x0, + 0x0, 0xe, 0x40, 0xd, 0x66, 0x66, 0xd0, 0x0, + 0x0, 0x4, 0x0, 0xd, 0x66, 0x66, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x66, 0x66, 0xd1, 0x0, + 0x13, 0x3a, 0x10, 0x24, 0x5, 0x70, 0x32, 0x0, + 0x14, 0x3e, 0x25, 0x96, 0x86, 0x86, 0x6b, 0x70, + 0x0, 0xd, 0x7, 0x27, 0x86, 0x55, 0x94, 0x0, + 0x0, 0xd, 0x2, 0x75, 0x56, 0x95, 0x7c, 0x30, + 0x0, 0xd, 0x0, 0x0, 0xa8, 0x66, 0x93, 0x0, + 0x0, 0xd, 0x0, 0x6, 0x90, 0x0, 0xc1, 0x0, + 0x4, 0xc9, 0x80, 0x76, 0x0, 0x49, 0xa0, 0x0, + 0x3d, 0x10, 0x5d, 0x62, 0x0, 0x6, 0x11, 0x20, + 0x1, 0x0, 0x1, 0x8c, 0xee, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+90A3 "é‚£" */ + 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x2, 0x0, + 0x37, 0x6b, 0x66, 0xe3, 0xc6, 0x66, 0xf4, 0x0, + 0x0, 0xc1, 0xd, 0xc, 0x0, 0x3a, 0x0, 0x0, + 0xc, 0x10, 0xd0, 0xc0, 0x8, 0x20, 0x1, 0x66, + 0xd6, 0x6e, 0xc, 0x0, 0x80, 0x0, 0x2, 0xc, + 0x0, 0xd0, 0xc0, 0x23, 0x0, 0x0, 0x0, 0xc0, + 0xd, 0xc, 0x0, 0x70, 0x0, 0x0, 0xc, 0x0, + 0xd0, 0xc0, 0x2, 0x80, 0x3, 0x76, 0xd6, 0x6e, + 0xc, 0x0, 0xb, 0x10, 0x0, 0x37, 0x0, 0xd0, + 0xc0, 0x0, 0x94, 0x0, 0x8, 0x20, 0xd, 0xc, + 0x14, 0x4d, 0x40, 0x1, 0x90, 0x0, 0xd0, 0xc0, + 0x3d, 0xa0, 0x0, 0x91, 0x39, 0xcb, 0xc, 0x0, + 0x10, 0x0, 0x62, 0x0, 0x8, 0x10, 0xd1, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, + 0x0, + + /* U+90AA "邪" */ + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x10, + 0x1, 0x76, 0x66, 0xa8, 0xa4, 0xb6, 0x6a, 0xd0, + 0x0, 0x10, 0x0, 0xd0, 0x2, 0xa0, 0xb, 0x40, + 0x0, 0x6a, 0x0, 0xd0, 0x2, 0xa0, 0x1a, 0x0, + 0x0, 0xb3, 0x0, 0xd0, 0x2, 0xa0, 0x62, 0x0, + 0x3, 0xe6, 0x66, 0xe7, 0xe5, 0xa0, 0x70, 0x0, + 0x0, 0x20, 0xd, 0xd0, 0x2, 0xa0, 0x61, 0x0, + 0x0, 0x0, 0x68, 0xd0, 0x2, 0xa0, 0x9, 0x0, + 0x0, 0x1, 0xc0, 0xd0, 0x2, 0xa0, 0x5, 0x60, + 0x0, 0x9, 0x30, 0xd0, 0x2, 0xa0, 0x2, 0xc0, + 0x0, 0x65, 0x0, 0xd0, 0x2, 0xa2, 0x27, 0xc0, + 0x5, 0x40, 0x0, 0xd0, 0x2, 0xa1, 0x9f, 0x50, + 0x12, 0x1, 0x66, 0xc0, 0x2, 0xa0, 0x1, 0x0, + 0x0, 0x0, 0x1b, 0x60, 0x3, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+90E8 "部" */ + 0x0, 0x0, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x95, 0x55, 0x90, + 0x3, 0x66, 0x6b, 0x68, 0xb0, 0xd1, 0x17, 0x90, + 0x0, 0x11, 0x0, 0x25, 0x0, 0xd0, 0xb, 0x10, + 0x0, 0xb, 0x20, 0x79, 0x0, 0xd0, 0x19, 0x0, + 0x0, 0x6, 0x70, 0xa0, 0x0, 0xd0, 0x52, 0x0, + 0x16, 0x66, 0x67, 0x96, 0xb7, 0xd0, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x18, 0x0, + 0x0, 0x86, 0x66, 0x6c, 0x20, 0xd0, 0x7, 0x40, + 0x0, 0xb2, 0x0, 0xd, 0x0, 0xd0, 0x2, 0xa0, + 0x0, 0xa2, 0x0, 0xd, 0x0, 0xd0, 0x3, 0xc0, + 0x0, 0xa2, 0x0, 0xd, 0x0, 0xd4, 0xae, 0x60, + 0x0, 0xb7, 0x66, 0x6d, 0x0, 0xd0, 0x24, 0x0, + 0x0, 0xa1, 0x0, 0x9, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, + + /* U+90F5 "郵" */ + 0x0, 0x0, 0x37, 0xc1, 0x2, 0x0, 0x2, 0x0, + 0x67, 0x9d, 0x64, 0x10, 0xc6, 0x6b, 0xd0, 0x0, + 0x0, 0xc0, 0x0, 0xc, 0x0, 0xc2, 0x4, 0x78, + 0x6d, 0x68, 0xa5, 0xc0, 0x37, 0x0, 0x0, 0xb0, + 0xc0, 0xc0, 0xc, 0x8, 0x0, 0x0, 0xb, 0xc, + 0xc, 0x0, 0xc0, 0x60, 0x0, 0x27, 0xd6, 0xd6, + 0xd8, 0x4c, 0x5, 0x30, 0x0, 0xb, 0xc, 0xc, + 0x0, 0xc0, 0x8, 0x20, 0x0, 0xb0, 0xc0, 0xc1, + 0xc, 0x0, 0xc, 0x5, 0x69, 0x6d, 0x69, 0x86, + 0xc0, 0x0, 0xa2, 0x0, 0x0, 0xc0, 0x0, 0xc, + 0x0, 0xd, 0x30, 0x0, 0xc, 0x56, 0x50, 0xc3, + 0x8f, 0xc0, 0x2c, 0xda, 0x62, 0x0, 0xc, 0x0, + 0x30, 0x0, 0x40, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, + + /* U+90FD "都" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x66, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x65, 0x2, 0x90, 0xc6, 0x67, 0xe1, + 0x0, 0x76, 0xa9, 0xbb, 0xa0, 0xd0, 0x7, 0x70, + 0x0, 0x0, 0x65, 0x3d, 0x0, 0xd0, 0xb, 0x0, + 0x0, 0x0, 0x66, 0xc2, 0x31, 0xd0, 0x27, 0x0, + 0x7, 0x66, 0x6c, 0x96, 0x75, 0xd0, 0x60, 0x0, + 0x0, 0x0, 0x68, 0x1, 0x0, 0xd0, 0x44, 0x0, + 0x0, 0xb, 0xb6, 0x6d, 0x40, 0xd0, 0xa, 0x10, + 0x2, 0x7d, 0x0, 0xd, 0x0, 0xd0, 0x4, 0xa0, + 0x2, 0xd, 0x66, 0x6e, 0x0, 0xd0, 0x0, 0xe0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0xd2, 0x36, 0xd0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0xd0, 0x6f, 0x50, + 0x0, 0xd, 0x66, 0x6e, 0x10, 0xd0, 0x1, 0x0, + 0x0, 0xd, 0x0, 0x9, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x3, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, + + /* U+914D "é…" */ + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x1, 0x0, + 0x7, 0x67, 0x89, 0x69, 0x57, 0x66, 0x6d, 0x30, + 0x0, 0x5, 0x6c, 0x0, 0x0, 0x0, 0xc, 0x10, + 0x2, 0x79, 0xad, 0x6a, 0x10, 0x0, 0xc, 0x10, + 0x3, 0xa5, 0x5c, 0xd, 0x0, 0x0, 0xc, 0x10, + 0x2, 0xa6, 0x4c, 0xd, 0x8, 0x66, 0x6d, 0x10, + 0x2, 0xa9, 0xc, 0xd, 0xd, 0x0, 0x8, 0x0, + 0x2, 0xb7, 0x9, 0xbd, 0xd, 0x0, 0x0, 0x0, + 0x2, 0xc0, 0x0, 0xd, 0xd, 0x0, 0x0, 0x0, + 0x2, 0xc6, 0x66, 0x6d, 0xd, 0x0, 0x0, 0x0, + 0x2, 0xa0, 0x0, 0xd, 0xd, 0x0, 0x0, 0x40, + 0x2, 0xa0, 0x0, 0xd, 0xd, 0x0, 0x0, 0x60, + 0x2, 0xc6, 0x66, 0x6d, 0xc, 0x10, 0x0, 0xc0, + 0x3, 0xa0, 0x0, 0xd, 0x7, 0xcb, 0xbc, 0xc0, + 0x1, 0x30, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, + + /* U+9152 "é…’" */ + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, + 0x0, 0x77, 0x7, 0x66, 0x6a, 0x69, 0x67, 0x80, + 0x0, 0xc, 0x1, 0x0, 0x1b, 0x28, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x96, 0x6c, 0x7b, 0x6a, 0x20, + 0x8, 0x20, 0x51, 0xd0, 0x1a, 0x28, 0xd, 0x10, + 0x1, 0xe0, 0x70, 0xd0, 0x39, 0x28, 0xd, 0x0, + 0x0, 0x41, 0x70, 0xd0, 0x74, 0x19, 0xd, 0x0, + 0x0, 0x7, 0x20, 0xd0, 0x90, 0xc, 0x9e, 0x0, + 0x0, 0xb, 0x0, 0xd6, 0x10, 0x0, 0xd, 0x0, + 0x5, 0xba, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, + 0x0, 0x68, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x58, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x69, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, + 0x0, 0x26, 0x0, 0xd0, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+9154 "é…”" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0xd1, 0x0, 0x0, + 0x27, 0x6a, 0x96, 0x79, 0x0, 0xc0, 0x0, 0x0, + 0x0, 0xb, 0xa0, 0x0, 0x56, 0xe6, 0xc4, 0x0, + 0x3, 0x1b, 0xa0, 0x51, 0x1, 0xb0, 0xa1, 0x0, + 0xb, 0x5c, 0xc6, 0xd3, 0x5, 0x70, 0xb0, 0x10, + 0xb, 0xa, 0xa0, 0xc0, 0xb, 0x0, 0xb0, 0x50, + 0xb, 0x18, 0xa0, 0xc0, 0x83, 0x13, 0xb7, 0xc1, + 0xb, 0x53, 0xa2, 0xc4, 0x20, 0x2b, 0x13, 0x20, + 0xb, 0x60, 0x39, 0xe0, 0x0, 0x28, 0x0, 0x0, + 0xb, 0x0, 0x0, 0xc4, 0x76, 0x7b, 0x69, 0x70, + 0xb, 0x66, 0x66, 0xd0, 0x0, 0x18, 0x0, 0x0, + 0xb, 0x0, 0x0, 0xc0, 0x0, 0x18, 0x0, 0x0, + 0xb, 0x66, 0x66, 0xd0, 0x0, 0x29, 0x0, 0x0, + 0xb, 0x0, 0x0, 0xb0, 0x0, 0x29, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x10, 0x0, 0x11, 0x0, 0x0, + + /* U+9178 "é…¸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, + 0x27, 0x68, 0x86, 0x95, 0x8, 0x70, 0x31, 0x0, + 0x0, 0xb, 0xb0, 0x1, 0x73, 0x1, 0x3c, 0x30, + 0x3, 0xb, 0xb0, 0x55, 0xeb, 0x86, 0x46, 0xa0, + 0xb, 0x7c, 0xc6, 0xd0, 0x16, 0x20, 0x62, 0x10, + 0xa, 0x2a, 0xb0, 0xc0, 0x5a, 0x20, 0x1c, 0x80, + 0xa, 0x38, 0xb0, 0xc4, 0x54, 0xa0, 0x0, 0xd0, + 0xa, 0x64, 0x99, 0xc1, 0xb, 0x96, 0x69, 0x10, + 0xa, 0x70, 0x1, 0xc0, 0x49, 0x0, 0x87, 0x0, + 0xa, 0x10, 0x0, 0xc1, 0x87, 0x1, 0xc0, 0x0, + 0xa, 0x66, 0x66, 0xc5, 0x3, 0x6a, 0x40, 0x0, + 0xa, 0x10, 0x0, 0xc0, 0x0, 0xba, 0x0, 0x0, + 0xa, 0x66, 0x66, 0xc0, 0x6, 0x9b, 0x50, 0x0, + 0xb, 0x10, 0x0, 0xb1, 0x84, 0x0, 0xbd, 0x80, + 0x4, 0x0, 0x0, 0x34, 0x0, 0x0, 0x6, 0x20, + + /* U+91AB "醫" */ + 0x0, 0x96, 0x66, 0x8a, 0x8, 0x66, 0xb0, 0x0, + 0x0, 0xc1, 0xa0, 0x10, 0xc, 0x0, 0xb0, 0x0, + 0x0, 0xc7, 0x7a, 0x74, 0x37, 0x0, 0xa8, 0x30, + 0x0, 0xc6, 0x6c, 0x79, 0x56, 0x66, 0x92, 0x0, + 0x0, 0xc0, 0x68, 0x40, 0x5, 0x12, 0xb1, 0x0, + 0x0, 0xc2, 0x60, 0x81, 0x1, 0x9e, 0x70, 0x0, + 0x2, 0xd8, 0x66, 0x6a, 0x57, 0x70, 0x79, 0x0, + 0x5, 0x66, 0x66, 0x66, 0x96, 0x66, 0x66, 0xc1, + 0x1, 0x1, 0x0, 0xd0, 0xc, 0x0, 0x30, 0x0, + 0x0, 0xd, 0x66, 0xe6, 0x6d, 0x66, 0xd3, 0x0, + 0x0, 0xb, 0x6, 0x60, 0xc, 0x33, 0xb0, 0x0, + 0x0, 0xb, 0x33, 0x0, 0x3, 0x55, 0xc0, 0x0, + 0x0, 0xd, 0x66, 0x66, 0x66, 0x66, 0xc0, 0x0, + 0x0, 0xd, 0x66, 0x66, 0x66, 0x66, 0xd0, 0x0, + 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, + + /* U+91CD "é‡" */ + 0x0, 0x0, 0x0, 0x0, 0x14, 0x8c, 0x10, 0x0, + 0x2, 0x45, 0x67, 0xe7, 0x54, 0x31, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x35, 0x0, 0x57, + 0x66, 0x66, 0xe6, 0x66, 0x67, 0x70, 0x0, 0x3, + 0x0, 0xd, 0x0, 0x5, 0x0, 0x0, 0x0, 0xb8, + 0x66, 0xe6, 0x66, 0xe2, 0x0, 0x0, 0xa, 0x30, + 0xd, 0x0, 0xd, 0x0, 0x0, 0x0, 0xa8, 0x66, + 0xe6, 0x66, 0xe0, 0x0, 0x0, 0xa, 0x30, 0xd, + 0x0, 0xd, 0x0, 0x0, 0x0, 0xa7, 0x66, 0xe6, + 0x66, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, + 0x2, 0x60, 0x0, 0x6, 0x76, 0x66, 0xe6, 0x66, + 0x66, 0x10, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x5, 0x13, 0x76, 0x66, 0x66, 0xa6, 0x66, 0x66, + 0xa7, + + /* U+91CE "野" */ + 0x1, 0x20, 0x0, 0x4, 0x0, 0x0, 0x4, 0x0, + 0x1, 0xd6, 0xc7, 0x6e, 0x37, 0x66, 0x7e, 0x60, + 0x1, 0xb0, 0xa2, 0xd, 0x1, 0x40, 0x81, 0x0, + 0x1, 0xd6, 0xc7, 0x6e, 0x0, 0x5e, 0x20, 0x0, + 0x1, 0xb0, 0xa2, 0xd, 0x0, 0x9, 0x60, 0x10, + 0x1, 0xb0, 0xa2, 0xd, 0x57, 0x69, 0x68, 0xe1, + 0x1, 0xd6, 0xc7, 0x6e, 0x0, 0xd, 0x8, 0x30, + 0x1, 0x70, 0xa2, 0x7, 0x0, 0xd, 0x3, 0x0, + 0x0, 0x0, 0xa2, 0x2, 0x0, 0xd, 0x0, 0x0, + 0x3, 0x76, 0xc7, 0x6c, 0x50, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xa2, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xa2, 0x24, 0x40, 0xd, 0x0, 0x0, + 0x6, 0x8a, 0xb8, 0x40, 0x0, 0xd, 0x0, 0x0, + 0xa, 0x51, 0x0, 0x0, 0x6, 0xde, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, + + /* U+91CF "é‡" */ + 0x0, 0x6, 0x66, 0x66, 0x66, 0x6b, 0x10, 0x0, + 0x0, 0x9, 0x30, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x9, 0x86, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x9, 0x86, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x7, 0x10, 0x0, 0x0, 0x5, 0x2, 0x30, + 0x27, 0x66, 0x66, 0x66, 0x66, 0x66, 0x68, 0x70, + 0x0, 0x8, 0x66, 0x66, 0x66, 0x69, 0x30, 0x0, + 0x0, 0xc, 0x0, 0xd, 0x0, 0xa, 0x20, 0x0, + 0x0, 0xc, 0x66, 0x6e, 0x66, 0x6c, 0x20, 0x0, + 0x0, 0xc, 0x0, 0xd, 0x0, 0xa, 0x20, 0x0, + 0x0, 0xb, 0x66, 0x6e, 0x66, 0x69, 0x10, 0x0, + 0x0, 0x46, 0x66, 0x6e, 0x66, 0x67, 0xc1, 0x0, + 0x0, 0x11, 0x0, 0xd, 0x0, 0x0, 0x1, 0x0, + 0x5, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x6d, 0x90, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+91D1 "金" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xba, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xd0, 0x82, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x30, 0xb, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x1, 0xc7, 0x0, 0x0, + 0x0, 0x1a, 0x30, 0x0, 0x0, 0x3a, 0xe9, 0x50, + 0x5, 0x70, 0x67, 0x6b, 0x66, 0x93, 0x4b, 0x50, + 0x11, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x70, 0x0, + 0x0, 0x57, 0x66, 0x6e, 0x66, 0x66, 0x61, 0x0, + 0x0, 0x3, 0x70, 0xe, 0x0, 0x79, 0x0, 0x0, + 0x0, 0x0, 0x9a, 0xe, 0x0, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xe, 0x5, 0x50, 0x0, 0x0, + 0x16, 0x66, 0x67, 0x6e, 0x6a, 0x66, 0x6c, 0x80, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+91DD "é‡" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x1d, 0x20, 0x0, + 0x0, 0x4, 0xe3, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xb, 0x37, 0xb1, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x49, 0x0, 0x86, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xa0, 0x1, 0x10, 0x0, 0xd, 0x0, 0x0, + 0x7, 0x36, 0xa7, 0x60, 0x0, 0xd, 0x0, 0x80, + 0x1, 0x0, 0xd0, 0x2, 0x86, 0x6e, 0x66, 0x62, + 0x0, 0x0, 0xd0, 0x70, 0x0, 0xd, 0x0, 0x0, + 0x1, 0x86, 0xe6, 0x62, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x60, 0xd0, 0xb3, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x94, 0xd1, 0xb0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x65, 0xd5, 0x11, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x25, 0xe8, 0x62, 0x0, 0xe, 0x0, 0x0, + 0x4, 0xd6, 0x10, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, + + /* U+9244 "鉄" */ + 0x0, 0x1, 0xb2, 0x0, 0x0, 0x74, 0x0, 0x0, + 0x0, 0x6, 0xd2, 0x0, 0x41, 0x94, 0x0, 0x0, + 0x0, 0xd, 0x28, 0xa0, 0xe4, 0x93, 0x0, 0x0, + 0x0, 0x67, 0x0, 0xa6, 0xc0, 0x93, 0x7, 0x0, + 0x1, 0x90, 0x4, 0x26, 0x96, 0xb8, 0x67, 0x20, + 0x7, 0x37, 0xe6, 0x3a, 0x0, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x13, 0x0, 0xb1, 0x0, 0x10, + 0x2, 0x66, 0xe6, 0xa6, 0x75, 0xd7, 0x57, 0xb1, + 0x0, 0x20, 0xd0, 0x30, 0x0, 0xc6, 0x0, 0x0, + 0x0, 0x90, 0xd1, 0xe1, 0x5, 0x88, 0x0, 0x0, + 0x0, 0xa3, 0xd6, 0x40, 0xc, 0x14, 0x80, 0x0, + 0x0, 0x51, 0xd5, 0x52, 0x67, 0x0, 0xb5, 0x0, + 0x4, 0x9b, 0xa5, 0x13, 0x80, 0x0, 0x2e, 0x80, + 0x4, 0x60, 0x0, 0x45, 0x0, 0x0, 0x3, 0xa2, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+925B "鉛" */ + 0x0, 0x1, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xd2, 0x0, 0x58, 0x66, 0xa4, 0x0, + 0x0, 0xd, 0x18, 0xb0, 0x59, 0x0, 0xb1, 0x0, + 0x0, 0x66, 0x0, 0x94, 0x58, 0x0, 0xb1, 0x0, + 0x1, 0xa1, 0x15, 0x10, 0x66, 0x0, 0xb1, 0x0, + 0x7, 0x26, 0xd5, 0x20, 0xa1, 0x0, 0xb2, 0x0, + 0x0, 0x0, 0xd0, 0x3, 0x70, 0x0, 0x5b, 0xb0, + 0x2, 0x55, 0xd6, 0xc5, 0x10, 0x0, 0x1, 0x0, + 0x0, 0x21, 0xd1, 0x30, 0xd6, 0x66, 0x8d, 0x0, + 0x0, 0x80, 0xd1, 0xe1, 0xd0, 0x0, 0x2a, 0x0, + 0x0, 0xa3, 0xd6, 0x40, 0xd0, 0x0, 0x2a, 0x0, + 0x0, 0x61, 0xd4, 0x42, 0xd0, 0x0, 0x2a, 0x0, + 0x3, 0x8a, 0xb6, 0x10, 0xd6, 0x66, 0x7a, 0x0, + 0x4, 0x70, 0x0, 0x0, 0xd0, 0x0, 0x27, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + + /* U+9280 "銀" */ + 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0x9, 0x66, 0x66, 0xa3, 0x0, + 0x0, 0xa5, 0x6b, 0x1c, 0x10, 0x0, 0xd1, 0x0, + 0x2, 0xa0, 0x8, 0x7c, 0x10, 0x0, 0xd0, 0x0, + 0xa, 0x10, 0x22, 0xc, 0x66, 0x66, 0xe0, 0x0, + 0x42, 0x7d, 0x64, 0xc, 0x10, 0x0, 0xd0, 0x0, + 0x0, 0xc, 0x0, 0xc, 0x43, 0x33, 0xd0, 0x0, + 0x5, 0x6d, 0x6c, 0x2c, 0x27, 0x11, 0x65, 0x0, + 0x2, 0xc, 0x3, 0xc, 0x16, 0x10, 0x7a, 0x10, + 0x8, 0xc, 0xd, 0x3c, 0x11, 0x96, 0x40, 0x0, + 0x7, 0x7c, 0x36, 0xc, 0x10, 0x86, 0x0, 0x0, + 0x3, 0x3c, 0x45, 0x3c, 0x13, 0x2b, 0x91, 0x0, + 0x28, 0xba, 0x61, 0xd, 0xa3, 0x0, 0x8f, 0x70, + 0x18, 0x0, 0x0, 0x8, 0x10, 0x0, 0x0, 0x0, + + /* U+9322 "錢" */ + 0x0, 0x1, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x50, 0x0, 0xb6, 0xb, 0x40, 0x0, + 0x0, 0x5c, 0x72, 0x0, 0x69, 0x25, 0x9b, 0x10, + 0x0, 0xb2, 0x1d, 0x46, 0x6e, 0x31, 0x40, 0x0, + 0x5, 0x60, 0x3, 0x30, 0xb, 0x4a, 0xb1, 0x0, + 0x18, 0x56, 0x7a, 0x0, 0x6, 0xf7, 0x0, 0x20, + 0x20, 0x1a, 0x20, 0x3, 0x88, 0x7d, 0x40, 0x70, + 0x0, 0xa, 0x21, 0x53, 0x72, 0x66, 0xce, 0xc0, + 0x6, 0x6c, 0x7d, 0x30, 0x95, 0x2c, 0x4, 0x30, + 0x1, 0xa, 0x23, 0x0, 0x59, 0x36, 0x6b, 0x30, + 0x7, 0x1a, 0x2b, 0x78, 0x7e, 0x20, 0x10, 0x0, + 0x4, 0x9a, 0x3a, 0x0, 0xc, 0x25, 0xd0, 0x0, + 0x1, 0x4a, 0x53, 0x40, 0x5, 0xbd, 0x10, 0x0, + 0x4, 0x7d, 0x95, 0x0, 0x3, 0xf7, 0x0, 0x50, + 0xd, 0x60, 0x0, 0x1, 0x77, 0x2d, 0x93, 0x80, + 0x0, 0x0, 0x0, 0x34, 0x10, 0x0, 0x7c, 0xd0, + + /* U+932F "錯" */ + 0x0, 0xb, 0x40, 0x0, 0x85, 0xa, 0x30, 0x0, + 0x0, 0x4e, 0x40, 0x0, 0x95, 0xc, 0x20, 0x0, + 0x0, 0xb3, 0x5c, 0x36, 0xb9, 0x6d, 0x9b, 0x0, + 0x5, 0x70, 0x7, 0x50, 0x95, 0xc, 0x20, 0x0, + 0x19, 0x33, 0x55, 0x0, 0x95, 0xc, 0x20, 0x0, + 0x30, 0x4c, 0x32, 0x56, 0xb9, 0x6d, 0x7b, 0x80, + 0x0, 0xb, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x3c, 0x5c, 0x4, 0x0, 0x0, 0x43, 0x0, + 0x4, 0x3c, 0x44, 0xb, 0x76, 0x66, 0xb8, 0x0, + 0x7, 0xb, 0x1c, 0x4b, 0x30, 0x0, 0x95, 0x0, + 0x6, 0x7b, 0x38, 0xb, 0x76, 0x66, 0xb5, 0x0, + 0x3, 0x5b, 0x54, 0x3b, 0x30, 0x0, 0x95, 0x0, + 0x17, 0xab, 0x72, 0xb, 0x76, 0x66, 0xb5, 0x0, + 0xa, 0x10, 0x0, 0xb, 0x20, 0x0, 0x62, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + + /* U+9332 "録" */ + 0x0, 0x9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5e, 0x20, 0x5, 0x76, 0x66, 0xc5, 0x0, + 0x0, 0xb3, 0x89, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x4, 0x80, 0xa, 0x40, 0x66, 0x66, 0xe0, 0x0, + 0xa, 0x22, 0x45, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x41, 0x5d, 0x32, 0x36, 0x66, 0x66, 0xe9, 0x90, + 0x0, 0xd, 0x0, 0x1, 0x0, 0xd0, 0x1, 0x0, + 0x16, 0x6e, 0x6d, 0x17, 0x40, 0xe0, 0x2e, 0x20, + 0x2, 0xd, 0x3, 0x0, 0xe0, 0xd6, 0x81, 0x0, + 0x8, 0xd, 0xd, 0x40, 0x21, 0xd7, 0x0, 0x0, + 0x7, 0x6d, 0x37, 0x0, 0x63, 0xd2, 0xa0, 0x0, + 0x3, 0x3d, 0x45, 0x4a, 0x20, 0xd0, 0x7b, 0x10, + 0x28, 0xba, 0x61, 0x94, 0x0, 0xd0, 0xa, 0x60, + 0x17, 0x0, 0x0, 0x0, 0x6e, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+9577 "é•·" */ + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x50, 0x0, + 0x0, 0x0, 0xb8, 0x66, 0x66, 0x66, 0x71, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0xb8, 0x66, 0x66, 0x6a, 0x30, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb8, 0x66, 0x66, 0x6c, 0x50, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x3, 0x70, + 0x6, 0x76, 0xe6, 0x6a, 0x66, 0x66, 0x66, 0x50, + 0x0, 0x1, 0xd0, 0x2, 0x60, 0x8, 0xb0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x75, 0x85, 0x10, 0x0, + 0x0, 0x1, 0xd0, 0x3, 0xa, 0x60, 0x0, 0x0, + 0x0, 0x1, 0xd4, 0x82, 0x0, 0x8c, 0x51, 0x0, + 0x0, 0x3, 0xf9, 0x0, 0x0, 0x3, 0xbf, 0xa1, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+9589 "é–‰" */ + 0x50, 0x0, 0x70, 0x4, 0x0, 0x7, 0xe, 0x66, + 0x6e, 0x10, 0xe6, 0x66, 0xf2, 0xe0, 0x0, 0xd0, + 0xd, 0x0, 0xe, 0xe, 0x66, 0x6d, 0x0, 0xd6, + 0x66, 0xe0, 0xe6, 0x66, 0xd0, 0xe, 0x66, 0x6e, + 0xe, 0x0, 0x4, 0x1, 0x60, 0x0, 0xe0, 0xe0, + 0x0, 0x0, 0xd1, 0x0, 0xe, 0xe, 0x5, 0x66, + 0x6e, 0x67, 0xa0, 0xe0, 0xe0, 0x10, 0x1c, 0xe0, + 0x0, 0xe, 0xe, 0x0, 0xb, 0x3d, 0x0, 0x0, + 0xe0, 0xe0, 0x19, 0x20, 0xd0, 0x0, 0xe, 0xe, + 0x26, 0x0, 0xd, 0x0, 0x0, 0xe0, 0xe0, 0x0, + 0x3b, 0xd0, 0x0, 0xd, 0xe, 0x0, 0x0, 0x11, + 0x1, 0x8e, 0xa0, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x40, 0x0, + + /* U+958B "é–‹" */ + 0x40, 0x0, 0x60, 0x4, 0x0, 0x6, 0xf, 0x66, + 0x6e, 0x10, 0xe6, 0x66, 0xf1, 0xe6, 0x66, 0xd0, + 0xe, 0x66, 0x6e, 0xe, 0x0, 0xd, 0x0, 0xe0, + 0x0, 0xe0, 0xe6, 0x66, 0xd0, 0xe, 0x66, 0x6e, + 0xe, 0x0, 0x3, 0x0, 0x60, 0x0, 0xe0, 0xe0, + 0x16, 0x66, 0x66, 0xb2, 0xe, 0xe, 0x0, 0x2c, + 0x2, 0xa0, 0x0, 0xe0, 0xe0, 0x0, 0xc0, 0x2a, + 0x2, 0xe, 0xe, 0x7, 0x6d, 0x67, 0xc7, 0xa0, + 0xe0, 0xe0, 0x0, 0xc0, 0x2a, 0x0, 0xe, 0xe, + 0x0, 0x57, 0x2, 0xa0, 0x0, 0xe0, 0xe0, 0x49, + 0x0, 0x2a, 0x0, 0xd, 0xe, 0x13, 0x0, 0x1, + 0x11, 0x7d, 0xb0, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x41, 0x0, + + /* U+9593 "é–“" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x66, + 0x6b, 0x0, 0x96, 0x66, 0xc1, 0xe0, 0x1, 0xc0, + 0xd, 0x0, 0xe, 0xe, 0x66, 0x6c, 0x0, 0xd6, + 0x66, 0xe0, 0xe0, 0x1, 0xc0, 0xd, 0x0, 0xe, + 0xe, 0x66, 0x6c, 0x0, 0xd6, 0x66, 0xe0, 0xe0, + 0x0, 0x10, 0x4, 0x0, 0xe, 0xe, 0x0, 0x96, + 0x66, 0x97, 0x0, 0xe0, 0xe0, 0xd, 0x10, 0x8, + 0x50, 0xe, 0xe, 0x0, 0xd1, 0x0, 0x85, 0x0, + 0xe0, 0xe0, 0xd, 0x66, 0x6b, 0x50, 0xe, 0xe, + 0x0, 0xd1, 0x0, 0x85, 0x0, 0xe0, 0xe0, 0xd, + 0x66, 0x6b, 0x50, 0xe, 0xe, 0x0, 0x80, 0x0, + 0x42, 0x0, 0xd0, 0xe0, 0x0, 0x0, 0x0, 0x18, + 0xdb, 0x5, 0x0, 0x0, 0x0, 0x0, 0x5, 0x10, + + /* U+95A2 "é–¢" */ + 0xa6, 0x66, 0xb1, 0xa, 0x66, 0x6c, 0x1e, 0x0, + 0xd, 0x0, 0xd0, 0x0, 0xe0, 0xe6, 0x66, 0xd0, + 0xd, 0x66, 0x6e, 0xe, 0x0, 0xd, 0x0, 0xd0, + 0x0, 0xe0, 0xe6, 0x66, 0xd0, 0xe, 0x66, 0x6e, + 0xe, 0x0, 0x34, 0x0, 0x70, 0x0, 0xe0, 0xe0, + 0x0, 0xc1, 0x1b, 0x0, 0xe, 0xe, 0x2, 0x68, + 0x69, 0x69, 0x40, 0xe0, 0xe0, 0x2, 0x7, 0x60, + 0x0, 0xe, 0xe, 0x6, 0x76, 0xb8, 0x66, 0xa0, + 0xe0, 0xe0, 0x0, 0x1d, 0x73, 0x0, 0xe, 0xe, + 0x0, 0x1b, 0x20, 0x7d, 0x10, 0xe0, 0xe0, 0x58, + 0x10, 0x0, 0x31, 0xe, 0xe, 0x0, 0x0, 0x0, + 0x1, 0x7b, 0xd0, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x52, 0x0, + + /* U+95DC "é—œ" */ + 0x96, 0x66, 0xa1, 0x8, 0x66, 0x6b, 0x3d, 0x0, + 0xb, 0x0, 0xd0, 0x0, 0xd0, 0xe6, 0x66, 0xc0, + 0xd, 0x66, 0x6e, 0xd, 0x66, 0x6c, 0x0, 0xd6, + 0x66, 0xe0, 0xd0, 0x1, 0x70, 0x6, 0x70, 0xd, + 0xd, 0x0, 0x73, 0x11, 0x92, 0x30, 0xd0, 0xd0, + 0xa9, 0xb6, 0x97, 0xa9, 0xd, 0xd, 0x2, 0x63, + 0x42, 0x72, 0x50, 0xd0, 0xd0, 0x98, 0x69, 0x69, + 0x59, 0xd, 0xd, 0x9, 0x15, 0x65, 0x70, 0x60, + 0xd0, 0xd0, 0xc6, 0x86, 0x4a, 0x6d, 0xd, 0xd, + 0x2, 0x6, 0x44, 0x70, 0x50, 0xd0, 0xd0, 0x3, + 0x80, 0x57, 0x0, 0xd, 0xd, 0x1, 0x30, 0x1, + 0x10, 0x6c, 0xc0, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x21, 0x0, + + /* U+9644 "附" */ + 0x20, 0x3, 0x0, 0x73, 0x0, 0x82, 0x0, 0xe6, + 0x6e, 0x10, 0xd1, 0x0, 0xd0, 0x0, 0xd0, 0x56, + 0x4, 0x80, 0x0, 0xc0, 0x0, 0xd0, 0x90, 0xa, + 0x10, 0x0, 0xc0, 0x0, 0xd0, 0x80, 0x2f, 0x25, + 0x66, 0xd7, 0xa0, 0xd0, 0x50, 0x7c, 0x1, 0x0, + 0xc0, 0x0, 0xd0, 0x55, 0x2c, 0x2, 0x0, 0xc0, + 0x0, 0xd0, 0xa, 0xc, 0x3, 0xb1, 0xc0, 0x0, + 0xd0, 0xd, 0xc, 0x0, 0x85, 0xc0, 0x0, 0xd3, + 0x4c, 0xc, 0x0, 0x0, 0xc0, 0x0, 0xd4, 0xd3, + 0xc, 0x0, 0x0, 0xc0, 0x0, 0xd0, 0x0, 0xc, + 0x0, 0x0, 0xc0, 0x0, 0xd0, 0x0, 0xc, 0x0, + 0x21, 0xd0, 0x0, 0xd0, 0x0, 0xb, 0x0, 0x2c, + 0xc0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+964D "é™" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, + 0x4, 0x0, 0x68, 0x0, 0x0, 0x0, 0xe6, 0x6f, + 0x30, 0xb7, 0x66, 0xaa, 0x0, 0xd0, 0x39, 0x2, + 0xc1, 0x2, 0xd1, 0x0, 0xd0, 0x72, 0x8, 0x18, + 0x1c, 0x20, 0x0, 0xd0, 0x60, 0x32, 0x3, 0xe3, + 0x0, 0x0, 0xd0, 0x60, 0x0, 0x2a, 0x6b, 0x61, + 0x0, 0xd0, 0x18, 0x5, 0x80, 0x83, 0x7d, 0xa1, + 0xd0, 0xa, 0x51, 0x0, 0xc1, 0x6, 0x0, 0xd0, + 0x8, 0x67, 0x66, 0xd6, 0x66, 0x10, 0xd5, 0x3d, + 0x3c, 0x20, 0xc0, 0x0, 0x0, 0xd2, 0xe7, 0x3a, + 0x0, 0xc0, 0x1, 0x60, 0xd0, 0x0, 0x57, 0x66, + 0xd6, 0x66, 0x50, 0xd0, 0x0, 0x0, 0x0, 0xc0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xc0, 0x0, + 0x0, 0x70, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, + + /* U+9650 "é™" */ + 0x2, 0x0, 0x30, 0x20, 0x0, 0x3, 0x10, 0x0, + 0xe6, 0x7d, 0xd, 0x66, 0x66, 0xc6, 0x0, 0xd, + 0x6, 0x60, 0xd0, 0x0, 0xb, 0x30, 0x0, 0xd0, + 0x90, 0xd, 0x0, 0x0, 0xb3, 0x0, 0xd, 0x7, + 0x0, 0xd6, 0x66, 0x6c, 0x30, 0x0, 0xd0, 0x50, + 0xd, 0x0, 0x0, 0xb3, 0x0, 0xd, 0x6, 0x20, + 0xd6, 0x66, 0x6c, 0x30, 0x0, 0xd0, 0xa, 0xd, + 0x6, 0x0, 0x45, 0x0, 0xd, 0x0, 0xc0, 0xd0, + 0x61, 0x8, 0xd2, 0x0, 0xd2, 0x2e, 0xd, 0x2, + 0x88, 0x50, 0x0, 0xd, 0x4f, 0x90, 0xd0, 0xa, + 0x40, 0x0, 0x0, 0xd0, 0x20, 0xd, 0x1, 0x3d, + 0x30, 0x0, 0xd, 0x0, 0x0, 0xd8, 0x60, 0x2e, + 0xa4, 0x0, 0xe0, 0x0, 0xd, 0x50, 0x0, 0x2c, + 0x60, 0x5, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, + + /* U+9662 "院" */ + 0x0, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x1, + 0xc6, 0x6e, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xb, + 0x3, 0x72, 0x96, 0x6a, 0x66, 0xa6, 0x0, 0xb0, + 0x70, 0x86, 0x0, 0x0, 0x8, 0x0, 0xb, 0x5, + 0x4, 0x0, 0x0, 0x6, 0x0, 0x0, 0xb0, 0x30, + 0x2, 0x86, 0x66, 0x50, 0x0, 0xb, 0x5, 0x30, + 0x0, 0x0, 0x0, 0x10, 0x0, 0xb0, 0xb, 0x38, + 0x67, 0x68, 0x6b, 0x30, 0xb, 0x0, 0xb2, 0x3, + 0x91, 0xb0, 0x0, 0x0, 0xb2, 0x3d, 0x20, 0x57, + 0x1b, 0x0, 0x0, 0xb, 0x1c, 0x80, 0x9, 0x41, + 0xb0, 0x2, 0x0, 0xb0, 0x0, 0x0, 0xd0, 0x1b, + 0x0, 0x60, 0xb, 0x0, 0x0, 0xa4, 0x1, 0xb0, + 0xb, 0x1, 0xb0, 0x2, 0x82, 0x0, 0xc, 0xbc, + 0xc1, 0x15, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+9664 "除" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x1, 0x10, 0x2, 0xd1, 0x0, 0x0, 0xa7, 0x6c, + 0x80, 0xa, 0x94, 0x0, 0x0, 0x92, 0xd, 0x0, + 0x3c, 0x8, 0x20, 0x0, 0x92, 0x55, 0x0, 0xb2, + 0x0, 0xc3, 0x0, 0x92, 0x70, 0x8, 0x40, 0x0, + 0x2d, 0xa3, 0x92, 0x60, 0x63, 0x76, 0x86, 0xb3, + 0x95, 0x92, 0x28, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0x92, 0xb, 0x20, 0x0, 0xc1, 0x1, 0x40, 0x92, + 0x9, 0x68, 0x66, 0xd6, 0x67, 0x70, 0x96, 0x5d, + 0x30, 0x60, 0xc1, 0x20, 0x0, 0x93, 0xb6, 0x6, + 0xd1, 0xc1, 0x28, 0x0, 0x92, 0x0, 0x2b, 0x0, + 0xc1, 0x3, 0xd1, 0xa2, 0x1, 0x80, 0x0, 0xc0, + 0x0, 0x96, 0xa2, 0x2, 0x1, 0x6c, 0xe0, 0x0, + 0x10, 0x40, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, + + /* U+9678 "陸" */ + 0x11, 0x0, 0x20, 0x0, 0xc, 0x10, 0x0, 0x3, + 0xc6, 0x6d, 0x50, 0x0, 0xd0, 0x0, 0x0, 0x2a, + 0x1, 0xb0, 0x66, 0x6e, 0x66, 0xc2, 0x2, 0xa0, + 0x72, 0x1, 0x0, 0xd0, 0x0, 0x0, 0x2a, 0x6, + 0x0, 0x0, 0xd, 0x0, 0x5, 0x2, 0xa0, 0x51, + 0x86, 0x76, 0x76, 0x66, 0x82, 0x2a, 0x5, 0x30, + 0xc, 0x70, 0x39, 0x40, 0x2, 0xa0, 0xb, 0x9, + 0x50, 0xc1, 0x1d, 0x30, 0x2a, 0x0, 0xe4, 0x10, + 0xd, 0x0, 0x21, 0x2, 0xc6, 0xa9, 0x0, 0x0, + 0xd0, 0x5, 0x0, 0x2a, 0x28, 0x1, 0x86, 0x6e, + 0x66, 0x72, 0x2, 0xa0, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0xd, 0x0, + 0x3, 0x3, 0xa0, 0x7, 0x66, 0x66, 0xa6, 0x67, + 0xa2, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+967D "陽" */ + 0x40, 0x1, 0x40, 0x52, 0x22, 0x26, 0x10, 0xc6, + 0x6a, 0xb0, 0xd4, 0x44, 0x4d, 0x20, 0xb1, 0xb, + 0x10, 0xd6, 0x66, 0x6e, 0x0, 0xb1, 0x27, 0x0, + 0xd0, 0x0, 0xd, 0x0, 0xb1, 0x60, 0x0, 0xe6, + 0x66, 0x6e, 0x0, 0xb1, 0x51, 0x0, 0x70, 0x0, + 0x4, 0x0, 0xb1, 0xa, 0x27, 0x66, 0x66, 0x66, + 0xb4, 0xb1, 0x8, 0x40, 0x2d, 0x0, 0x0, 0x0, + 0xb1, 0x7, 0x70, 0xb8, 0x86, 0x86, 0xd3, 0xb6, + 0x7d, 0x39, 0x42, 0xb2, 0xb0, 0xd0, 0xb1, 0x85, + 0x62, 0xb, 0x19, 0x50, 0xd0, 0xb1, 0x0, 0x1, + 0x92, 0x4a, 0x2, 0xb0, 0xb1, 0x0, 0x15, 0x3, + 0xa0, 0x5, 0x90, 0xb1, 0x0, 0x0, 0x66, 0x5, + 0xbe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x43, + 0x0, + + /* U+968E "階" */ + 0x12, 0x0, 0x41, 0x60, 0x0, 0x90, 0x0, 0x3, + 0xb6, 0x6e, 0x4d, 0x0, 0xd, 0x3, 0x10, 0x29, + 0x4, 0x70, 0xd0, 0x51, 0xd2, 0xc5, 0x2, 0x90, + 0x90, 0xe, 0x66, 0x3e, 0x60, 0x10, 0x29, 0x24, + 0x0, 0xd0, 0x1, 0xd0, 0x5, 0x2, 0x90, 0x70, + 0xd, 0x76, 0xe, 0x0, 0xa0, 0x29, 0x4, 0x71, + 0xc3, 0x11, 0x8b, 0xba, 0x12, 0x90, 0xd, 0x0, + 0x7, 0x80, 0x0, 0x0, 0x29, 0x11, 0xe0, 0xa6, + 0xa6, 0x66, 0xb1, 0x2, 0x95, 0xf6, 0xd, 0x0, + 0x0, 0xd, 0x0, 0x29, 0x0, 0x0, 0xd6, 0x66, + 0x66, 0xd0, 0x2, 0x90, 0x0, 0xd, 0x0, 0x0, + 0xd, 0x0, 0x39, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0xd0, 0x3, 0x90, 0x0, 0xd, 0x66, 0x66, 0x6d, + 0x0, 0x10, 0x0, 0x0, 0x30, 0x0, 0x0, 0x20, + 0x0, + + /* U+969B "éš›" */ + 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x5, + 0x0, 0x44, 0xd, 0x50, 0x40, 0x0, 0x0, 0xc8, + 0x7d, 0x82, 0xf6, 0xa8, 0x66, 0xc3, 0xc, 0x1, + 0xc0, 0xa6, 0xc, 0x43, 0x1b, 0x0, 0xc0, 0x63, + 0x38, 0x95, 0xa0, 0x67, 0x10, 0xc, 0x6, 0x7, + 0x93, 0xa2, 0x7, 0x60, 0x0, 0xc0, 0x60, 0x2, + 0x57, 0x0, 0xc, 0x50, 0xc, 0x2, 0x80, 0x47, + 0x0, 0x2, 0x4c, 0x90, 0xc0, 0xb, 0x43, 0x18, + 0x66, 0x64, 0x0, 0xc, 0x0, 0xa4, 0x0, 0x0, + 0x0, 0x6, 0x0, 0xc4, 0xad, 0x6, 0x76, 0x6e, + 0x66, 0x62, 0xc, 0x3, 0x10, 0x6, 0x40, 0xd0, + 0x50, 0x0, 0xc0, 0x0, 0x4, 0xc3, 0xd, 0x3, + 0xc2, 0xc, 0x0, 0x5, 0x70, 0x0, 0xd0, 0x5, + 0xd0, 0xd0, 0x2, 0x20, 0x17, 0xdb, 0x0, 0x4, + 0x4, 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, + + /* U+969C "éšœ" */ + 0x0, 0x0, 0x0, 0x4, 0x60, 0x0, 0x0, 0xb6, + 0x8d, 0x0, 0x0, 0xc0, 0x6, 0x0, 0xc1, 0x76, + 0x7, 0x97, 0x66, 0xd6, 0x30, 0xb1, 0xa0, 0x0, + 0xc, 0x4, 0x90, 0x0, 0xb1, 0x71, 0x66, 0x6c, + 0x6a, 0x66, 0xc5, 0xb2, 0x40, 0x22, 0x0, 0x0, + 0x3, 0x0, 0xb1, 0x43, 0xb, 0x76, 0x66, 0x6c, + 0x50, 0xb1, 0xb, 0xb, 0x20, 0x0, 0xb, 0x20, + 0xb1, 0xd, 0xb, 0x76, 0x66, 0x6c, 0x20, 0xb5, + 0x4e, 0xb, 0x76, 0x66, 0x6c, 0x20, 0xb3, 0xd5, + 0x5, 0x0, 0xd0, 0x4, 0x30, 0xb1, 0x2, 0x86, + 0x66, 0xe6, 0x66, 0xa6, 0xb1, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x60, 0x0, + 0x0, + + /* U+96A3 "隣" */ + 0x20, 0x3, 0x0, 0x20, 0x29, 0x3, 0x0, 0xc, + 0x66, 0xe5, 0x8, 0x62, 0xb0, 0xd5, 0x0, 0xc0, + 0x3a, 0x0, 0x7, 0x2b, 0x64, 0x0, 0xc, 0x9, + 0x10, 0x67, 0x7a, 0xd9, 0x69, 0x60, 0xc2, 0x40, + 0x0, 0x1b, 0x4b, 0x72, 0x0, 0xc, 0x7, 0x0, + 0x58, 0x2, 0xb0, 0xac, 0x70, 0xc0, 0x37, 0x32, + 0x20, 0x29, 0x2, 0x21, 0xc, 0x0, 0xc0, 0x5c, + 0x0, 0x0, 0xd0, 0x0, 0xc1, 0xd, 0x1c, 0x78, + 0xc4, 0x7d, 0x69, 0xc, 0x4e, 0x88, 0x70, 0x95, + 0x51, 0xc0, 0x0, 0xc0, 0x13, 0x4a, 0x2c, 0xc, + 0x1c, 0x5, 0xc, 0x0, 0x0, 0x3a, 0x41, 0x86, + 0xd6, 0x61, 0xc0, 0x0, 0x7, 0x70, 0x0, 0xc, + 0x0, 0xd, 0x0, 0x7, 0x40, 0x0, 0x0, 0xd0, + 0x0, 0x30, 0x3, 0x0, 0x0, 0x0, 0x4, 0x0, + 0x0, + + /* U+96A8 "隨" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x11, 0x50, 0x0, 0x0, 0xd2, 0x0, 0x0, 0xc5, + 0x7d, 0x30, 0x46, 0x6e, 0x66, 0xa3, 0xc, 0x7, + 0x34, 0x91, 0x19, 0x30, 0x2, 0x0, 0xc0, 0x70, + 0xc, 0x8, 0x96, 0xb6, 0x80, 0xc, 0x22, 0x0, + 0x5, 0x66, 0x6d, 0x67, 0x70, 0xc0, 0x90, 0x3, + 0x1, 0x10, 0x0, 0x10, 0xc, 0x4, 0x87, 0xd5, + 0x2b, 0x66, 0x6d, 0x0, 0xc0, 0xd, 0xc, 0x1, + 0xa0, 0x0, 0xc0, 0xc, 0x1, 0xd0, 0xc0, 0x1c, + 0x66, 0x6c, 0x0, 0xc5, 0xe4, 0xc, 0x1, 0xc6, + 0x66, 0xc0, 0xc, 0x0, 0x0, 0xc0, 0x2a, 0x0, + 0xc, 0x0, 0xc0, 0x0, 0x1a, 0x22, 0xa0, 0x38, + 0xa0, 0xc, 0x0, 0x3a, 0x6, 0x84, 0x10, 0x42, + 0x10, 0xb0, 0x5, 0x20, 0x2, 0x9d, 0xee, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+96BB "éš»" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x5, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xb0, 0xd, 0x0, 0x0, 0x10, 0x0, 0x3, + 0xf6, 0x66, 0x76, 0x66, 0x9c, 0x10, 0x1, 0xac, + 0x0, 0xe, 0x0, 0x2, 0x0, 0x1, 0x71, 0xd6, + 0x66, 0xe6, 0x66, 0xa1, 0x0, 0x20, 0xc, 0x0, + 0xe, 0x0, 0x6, 0x0, 0x0, 0x0, 0xd6, 0x66, + 0xe6, 0x66, 0x62, 0x0, 0x0, 0xd, 0x66, 0x6e, + 0x66, 0x66, 0xd2, 0x0, 0x0, 0x60, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x77, 0x66, 0x66, 0x67, + 0xf3, 0x0, 0x0, 0x0, 0x8, 0x10, 0x2, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x9, 0x56, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5e, 0xe6, 0x10, 0x0, + 0x0, 0x0, 0x47, 0x85, 0x0, 0x6b, 0xcb, 0xa9, + 0x13, 0x41, 0x0, 0x0, 0x0, 0x0, 0x24, 0x20, + + /* U+96C6 "集" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0x5, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb5, 0x0, 0xc2, 0x0, 0x2, 0x0, + 0x0, 0x4, 0xe6, 0x66, 0xa6, 0x66, 0x6b, 0x10, + 0x0, 0x1d, 0xa0, 0x0, 0xc0, 0x0, 0x20, 0x0, + 0x0, 0x94, 0xc6, 0x66, 0xd6, 0x66, 0x93, 0x0, + 0x6, 0x12, 0xa0, 0x0, 0xc0, 0x0, 0x60, 0x0, + 0x0, 0x2, 0xc6, 0x66, 0xd6, 0x66, 0x62, 0x0, + 0x0, 0x3, 0xc6, 0x66, 0xd6, 0x66, 0x7b, 0x0, + 0x0, 0x3, 0x90, 0x1, 0xa0, 0x0, 0x0, 0x0, + 0x5, 0x66, 0x66, 0x66, 0xd6, 0x66, 0x66, 0xd2, + 0x1, 0x0, 0x0, 0x98, 0xb5, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0x51, 0xb0, 0x94, 0x0, 0x0, + 0x0, 0x4, 0x92, 0x1, 0xb0, 0x9, 0xb5, 0x20, + 0x3, 0x64, 0x0, 0x2, 0xc0, 0x0, 0x3b, 0xd3, + 0x1, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, + + /* U+96D1 "雑" */ + 0x0, 0xa, 0x10, 0x0, 0x2, 0x5, 0x0, 0x0, + 0x0, 0xd, 0x2, 0x0, 0x3e, 0x9, 0x60, 0x0, + 0x3, 0x6e, 0x6e, 0x10, 0x66, 0x4, 0x52, 0x0, + 0x0, 0x1b, 0xb, 0x0, 0xb7, 0x6a, 0x69, 0x60, + 0x0, 0x65, 0x38, 0x42, 0xf2, 0xd, 0x0, 0x0, + 0x2, 0x90, 0x2b, 0xb9, 0xc2, 0xd, 0x0, 0x0, + 0x15, 0x1, 0xb0, 0x5, 0xa7, 0x6e, 0x6b, 0x20, + 0x0, 0x1, 0xb0, 0x20, 0xa2, 0xd, 0x0, 0x0, + 0x6, 0x66, 0xd6, 0x84, 0xa2, 0xd, 0x0, 0x0, + 0x0, 0x31, 0xb2, 0x0, 0xa7, 0x6e, 0x6c, 0x20, + 0x0, 0xd4, 0xb4, 0x80, 0xa2, 0xd, 0x0, 0x0, + 0x5, 0x51, 0xb0, 0x88, 0xa2, 0xd, 0x0, 0x0, + 0x17, 0x1, 0xb0, 0x4, 0xb2, 0xd, 0x2, 0x50, + 0x0, 0x3a, 0xa0, 0x0, 0xb7, 0x66, 0x66, 0x50, + 0x0, 0x3, 0x10, 0x0, 0x50, 0x0, 0x0, 0x0, + + /* U+96D6 "é›–" */ + 0x0, 0x0, 0x0, 0x0, 0x34, 0x30, 0x0, 0x0, + 0x86, 0x66, 0xd3, 0x7, 0xb7, 0xa0, 0x0, 0x8, + 0x20, 0xc, 0x0, 0xb2, 0xa, 0x1, 0x0, 0x82, + 0x0, 0xc0, 0x1d, 0x66, 0x86, 0xb2, 0x9, 0x7a, + 0x6d, 0x17, 0xc0, 0x1b, 0x0, 0x0, 0x20, 0xc0, + 0x0, 0x7c, 0x1, 0xb0, 0x0, 0x28, 0x6d, 0x66, + 0xb0, 0xd6, 0x6c, 0x6b, 0x2, 0x90, 0xc0, 0x4a, + 0xc, 0x1, 0xb0, 0x0, 0x29, 0xc, 0x4, 0xa0, + 0xc0, 0x1b, 0x0, 0x2, 0xb6, 0xd6, 0x8a, 0xd, + 0x66, 0xc6, 0xb0, 0x13, 0xc, 0x3, 0x10, 0xc0, + 0x1b, 0x0, 0x0, 0x0, 0xc0, 0x73, 0xc, 0x1, + 0xb0, 0x0, 0x45, 0x7d, 0x88, 0xc0, 0xc0, 0x1b, + 0x6, 0x26, 0x95, 0x10, 0xc, 0xd, 0x66, 0x66, + 0x63, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, + 0x0, + + /* U+96D9 "é›™" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x28, 0x0, 0x27, 0x39, 0x0, 0x0, + 0x0, 0x4c, 0xa, 0x10, 0x78, 0xa, 0x3, 0x0, + 0x0, 0xd7, 0x68, 0x85, 0xc6, 0x6a, 0x68, 0x20, + 0x7, 0xe0, 0x1a, 0x23, 0xf0, 0x1a, 0x2, 0x0, + 0x13, 0xc6, 0x6c, 0x76, 0xc6, 0x6c, 0x66, 0x0, + 0x0, 0xc0, 0x1a, 0x20, 0xc0, 0x1a, 0x2, 0x0, + 0x0, 0xc6, 0x6c, 0x62, 0xc6, 0x6c, 0x66, 0x0, + 0x0, 0xc3, 0x4b, 0x54, 0xc0, 0x1a, 0x5, 0x10, + 0x0, 0xa3, 0x33, 0x32, 0xa6, 0x66, 0x66, 0x30, + 0x0, 0x56, 0x76, 0x66, 0x66, 0x6b, 0x50, 0x0, + 0x0, 0x0, 0x26, 0x0, 0x0, 0x98, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x82, 0x5a, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4d, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x78, 0x50, 0x17, 0xbb, 0x98, 0x83, + 0x4, 0x52, 0x0, 0x0, 0x0, 0x1, 0x46, 0x50, + + /* U+96E2 "離" */ + 0x0, 0x8, 0x0, 0x0, 0x24, 0x11, 0x0, 0x0, + 0x0, 0x84, 0x5, 0x16, 0xc0, 0xb1, 0x0, 0x46, + 0x66, 0x97, 0x62, 0x93, 0x7, 0x40, 0x0, 0x93, + 0x6b, 0x36, 0xd, 0x66, 0x86, 0xb2, 0xb, 0xa, + 0x80, 0xc3, 0xf0, 0xd, 0x0, 0x0, 0xc4, 0x9, + 0xc, 0x6d, 0x0, 0xd0, 0x0, 0x2c, 0x68, 0x66, + 0xc1, 0xd6, 0x6e, 0x6a, 0x0, 0x0, 0xc2, 0x2, + 0xd, 0x0, 0xd0, 0x0, 0x2a, 0x6b, 0x55, 0xd2, + 0xd0, 0xd, 0x0, 0x2, 0x97, 0x15, 0xb, 0xd, + 0x66, 0xe6, 0xb0, 0x2b, 0xc8, 0xa4, 0xb0, 0xd0, + 0xd, 0x0, 0x2, 0x94, 0x1, 0xb, 0xd, 0x0, + 0xd0, 0x0, 0x29, 0x0, 0x0, 0xb0, 0xd0, 0xd, + 0x5, 0x2, 0x90, 0x5, 0xcb, 0xd, 0x66, 0x66, + 0x63, 0x13, 0x0, 0x1, 0x0, 0x30, 0x0, 0x0, + 0x0, + + /* U+96E3 "難" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0x2, 0x60, 0x4, 0xc5, 0x40, 0x0, + 0x0, 0x29, 0x2, 0xb0, 0x7, 0xa0, 0xe1, 0x0, + 0x5, 0x8b, 0x67, 0xd8, 0x5b, 0x20, 0x50, 0x60, + 0x0, 0x29, 0x2, 0xb0, 0x1f, 0x66, 0xd6, 0x72, + 0x0, 0x28, 0xc7, 0x70, 0x6e, 0x0, 0xc0, 0x0, + 0x0, 0x86, 0xd6, 0x69, 0x6d, 0x0, 0xc0, 0x0, + 0x0, 0xc0, 0xc0, 0xb, 0xd, 0x66, 0xd6, 0x90, + 0x0, 0xd6, 0xd6, 0x6b, 0xd, 0x0, 0xc0, 0x0, + 0x0, 0x30, 0xc0, 0x5, 0xd, 0x0, 0xc0, 0x0, + 0x0, 0x76, 0xd6, 0x66, 0xd, 0x66, 0xd6, 0xa0, + 0x5, 0x76, 0xd6, 0x6a, 0x4d, 0x0, 0xc0, 0x0, + 0x0, 0x1, 0x93, 0x10, 0xd, 0x0, 0xc0, 0x0, + 0x0, 0xa, 0x21, 0xd3, 0xd, 0x0, 0xc0, 0x40, + 0x1, 0x82, 0x0, 0x44, 0xd, 0x66, 0x76, 0x73, + 0x3, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + + /* U+96E8 "雨" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x67, + 0x66, 0x66, 0x86, 0x66, 0x68, 0xc1, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0xd0, 0x0, 0x5, 0x0, 0xd, 0x66, 0x66, 0xe6, + 0x66, 0x6e, 0x20, 0xc, 0x16, 0x20, 0xd1, 0x50, + 0xe, 0x0, 0xc, 0x11, 0xe3, 0xd0, 0x6c, 0xe, + 0x0, 0xc, 0x10, 0x53, 0xd0, 0x8, 0xe, 0x0, + 0xc, 0x10, 0x0, 0xd0, 0x0, 0xe, 0x0, 0xc, + 0x1a, 0x50, 0xd1, 0x93, 0xe, 0x0, 0xc, 0x11, + 0xe0, 0xd0, 0x2e, 0xe, 0x0, 0xc, 0x10, 0x10, + 0xd0, 0x3, 0xe, 0x0, 0xc, 0x10, 0x0, 0xd0, + 0x15, 0x5f, 0x0, 0xc, 0x10, 0x0, 0x90, 0x2, + 0xca, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, + + /* U+96EA "雪" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x50, 0x0, + 0x4, 0x76, 0x66, 0xd6, 0x66, 0x66, 0x0, 0x1, + 0x20, 0x0, 0xd, 0x0, 0x0, 0x5, 0x10, 0x59, + 0x66, 0x66, 0xe6, 0x66, 0x66, 0xe5, 0xd, 0x45, + 0x66, 0x1d, 0x5, 0x66, 0x42, 0x0, 0x30, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x66, + 0x1d, 0x5, 0x66, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x70, 0x0, 0x10, 0x0, 0x0, 0x37, 0x66, 0x66, + 0x66, 0x6b, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x76, 0x0, 0x0, 0x6, 0x66, 0x66, 0x66, + 0x6a, 0x60, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0x60, 0x0, 0x6, 0x76, 0x66, 0x66, 0x66, 0xa6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, + 0x0, + + /* U+96F2 "雲" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x56, 0x66, 0x66, 0x66, 0x98, 0x0, 0x0, 0x20, + 0x0, 0xa3, 0x0, 0x0, 0x0, 0x9, 0x66, 0x66, + 0xc8, 0x66, 0x66, 0xb1, 0x59, 0x0, 0x0, 0xa3, + 0x0, 0x1, 0xc3, 0x82, 0x56, 0x60, 0xa3, 0x56, + 0x64, 0x10, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, + 0x0, 0x0, 0x56, 0x60, 0xa2, 0x56, 0x61, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, + 0x76, 0x66, 0x66, 0x66, 0x95, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x70, 0x47, 0x66, 0x6b, + 0x76, 0x66, 0x66, 0x83, 0x0, 0x0, 0x8b, 0x40, + 0x35, 0x0, 0x0, 0x0, 0x49, 0x30, 0x0, 0x4, + 0xd4, 0x0, 0x5, 0xfc, 0xba, 0x87, 0x65, 0x7e, + 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x4, 0x0, + + /* U+96FB "é›»" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x56, 0x66, 0x66, 0x66, 0x99, 0x0, 0x2, 0x10, + 0x0, 0xe0, 0x0, 0x0, 0x10, 0x9, 0x66, 0x66, + 0xe6, 0x66, 0x66, 0xd5, 0x5a, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0x90, 0x42, 0x46, 0x60, 0xe0, 0x26, + 0x65, 0x20, 0x0, 0x45, 0x50, 0xd0, 0x26, 0x64, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0xc6, 0x66, 0x96, 0x66, 0x7e, 0x0, 0x0, + 0xd0, 0x0, 0xe0, 0x0, 0x1b, 0x0, 0x0, 0xd6, + 0x66, 0xe6, 0x66, 0x6b, 0x0, 0x0, 0xd0, 0x0, + 0xe0, 0x0, 0x1b, 0x0, 0x0, 0xd6, 0x66, 0xe6, + 0x66, 0x6b, 0x40, 0x0, 0x40, 0x0, 0xe0, 0x0, + 0x1, 0x72, 0x0, 0x0, 0x0, 0xbd, 0xbb, 0xbb, + 0xd6, + + /* U+9700 "需" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x20, 0x0, + 0x5, 0x66, 0x68, 0xb6, 0x66, 0x64, 0x0, 0x7, + 0x66, 0x66, 0x8b, 0x66, 0x66, 0x7c, 0x11, 0xd0, + 0x0, 0x4, 0x90, 0x0, 0x7, 0x20, 0x13, 0x6, + 0x63, 0x49, 0x46, 0x63, 0x10, 0x0, 0x1, 0x66, + 0x34, 0x94, 0x66, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x0, 0x0, 0x61, 0x0, 0x76, 0x66, 0x6d, + 0x66, 0x66, 0x66, 0x40, 0x0, 0x30, 0x4, 0x30, + 0x0, 0x0, 0x40, 0x0, 0xe, 0x66, 0xe6, 0x6e, + 0x66, 0x7c, 0x0, 0x0, 0xd0, 0xd, 0x0, 0xd0, + 0x2, 0xa0, 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, + 0x2a, 0x0, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x2, + 0xa0, 0x0, 0xd, 0x0, 0x90, 0x7, 0x5, 0xc9, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, + + /* U+9707 "震" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x46, 0x66, 0x66, 0x66, 0xd6, 0x0, 0x0, + 0x21, 0x10, 0xa, 0x20, 0x0, 0x2, 0x0, 0x9, + 0x66, 0x66, 0xc7, 0x66, 0x66, 0xf3, 0x3, 0xd2, + 0x66, 0x3a, 0x25, 0x66, 0x53, 0x0, 0x11, 0x0, + 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x13, 0x66, + 0x38, 0x15, 0x66, 0x50, 0x0, 0x3, 0xb6, 0x66, + 0x66, 0x66, 0x6a, 0x40, 0x0, 0x3a, 0x16, 0x66, + 0x66, 0x6a, 0x50, 0x0, 0x3, 0xa0, 0x20, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x3c, 0x69, 0x67, 0x66, + 0x66, 0x6b, 0x30, 0x5, 0x80, 0xd0, 0x25, 0x0, + 0xb4, 0x0, 0x0, 0x84, 0xd, 0x0, 0x66, 0x84, + 0x0, 0x0, 0xb, 0x0, 0xd0, 0x52, 0x7a, 0x30, + 0x0, 0x6, 0x20, 0xe, 0xa1, 0x0, 0x3b, 0xfc, + 0x70, 0x20, 0x0, 0x30, 0x0, 0x0, 0x1, 0x40, + + /* U+9752 "é’" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x58, 0x0, + 0x5, 0x76, 0x66, 0x6e, 0x66, 0x66, 0x66, 0x10, + 0x0, 0x26, 0x66, 0x6e, 0x66, 0x68, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x10, + 0x6, 0x66, 0x66, 0x6d, 0x66, 0x66, 0x6b, 0xc0, + 0x1, 0x0, 0x20, 0x0, 0x0, 0x4, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x20, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x6, 0xce, 0x0, 0x0, + 0x0, 0x0, 0x70, 0x0, 0x0, 0x43, 0x0, 0x0, + + /* U+9759 "é™" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x91, 0x0, 0xa, 0x40, 0x0, 0x0, + 0x0, 0x11, 0xc1, 0x42, 0x1d, 0x0, 0x60, 0x0, + 0x3, 0x65, 0xd5, 0x53, 0x87, 0x68, 0xd2, 0x0, + 0x1, 0x66, 0xd6, 0xa4, 0x60, 0x8, 0x10, 0x0, + 0x0, 0x10, 0xc0, 0x3, 0x76, 0x97, 0x6d, 0x30, + 0x7, 0x66, 0xa6, 0x79, 0x0, 0xc0, 0xc, 0x0, + 0x0, 0x30, 0x0, 0x40, 0x0, 0xc0, 0xc, 0x70, + 0x0, 0xd6, 0x66, 0xd4, 0x76, 0xd6, 0x6d, 0x52, + 0x0, 0xd6, 0x66, 0xb0, 0x0, 0xc0, 0xc, 0x0, + 0x0, 0xc0, 0x0, 0xb1, 0x66, 0xd6, 0x6d, 0x0, + 0x0, 0xd6, 0x66, 0xb0, 0x10, 0xc0, 0x4, 0x0, + 0x0, 0xc0, 0x0, 0xb0, 0x0, 0xc0, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0xb0, 0x0, 0xc0, 0x0, 0x0, + 0x0, 0xc0, 0x5a, 0x90, 0x59, 0xd0, 0x0, 0x0, + 0x0, 0x40, 0x6, 0x10, 0x5, 0x40, 0x0, 0x0, + + /* U+975E "éž" */ + 0x0, 0x0, 0x0, 0x91, 0xa, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x1, 0x0, + 0x4, 0x76, 0x66, 0xe0, 0xd, 0x66, 0x6a, 0x50, + 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x56, 0x66, 0xe0, 0xd, 0x66, 0x6c, 0x20, + 0x0, 0x10, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x1, 0x50, + 0x7, 0x66, 0x66, 0xe0, 0xd, 0x66, 0x66, 0x70, + 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x40, 0x3, 0x0, 0x0, 0x0, + + /* U+9762 "é¢" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xa0, + 0x18, 0x66, 0x66, 0x6f, 0x76, 0x66, 0x66, 0x61, + 0x0, 0x0, 0x0, 0x3a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x61, 0x0, 0x0, 0x5, 0x0, + 0x0, 0xd6, 0x66, 0xd6, 0x6d, 0x66, 0x6e, 0x10, + 0x0, 0xd1, 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, + 0x0, 0xc1, 0x0, 0xd6, 0x6e, 0x0, 0xd, 0x0, + 0x0, 0xc1, 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, + 0x0, 0xc1, 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, + 0x0, 0xc1, 0x0, 0xd6, 0x6e, 0x0, 0xd, 0x0, + 0x0, 0xc1, 0x0, 0xc0, 0xd, 0x0, 0xe, 0x0, + 0x0, 0xc1, 0x0, 0xc0, 0xd, 0x0, 0xe, 0x0, + 0x0, 0xd6, 0x66, 0xd6, 0x6e, 0x66, 0x6e, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+9769 "é©" */ + 0x0, 0x0, 0xa, 0x20, 0x0, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x8, 0x10, + 0x2, 0x86, 0x6e, 0x66, 0x66, 0xe6, 0x66, 0x30, + 0x0, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x6b, 0x76, 0xa0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0xb, 0x20, 0x0, 0x30, 0x0, + 0x0, 0xd, 0x66, 0x6d, 0x76, 0x66, 0xf1, 0x0, + 0x0, 0xd, 0x10, 0xb, 0x20, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0x66, 0x6d, 0x76, 0x66, 0xe0, 0x0, + 0x0, 0x8, 0x0, 0xb, 0x20, 0x0, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x3, 0x90, + 0x7, 0x66, 0x66, 0x6d, 0x76, 0x66, 0x66, 0x61, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, 0x0, + + /* U+9774 "é´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x66, 0x7, 0x40, 0x8, 0x17, 0x10, 0x0, + 0x0, 0x66, 0x8, 0x52, 0xe, 0x1c, 0x0, 0x0, + 0x6, 0xa9, 0x6b, 0x84, 0x48, 0xc, 0x0, 0x0, + 0x0, 0x66, 0x8, 0x40, 0x81, 0xc, 0x4, 0xa0, + 0x0, 0x68, 0xc9, 0x30, 0xa0, 0xc, 0xb, 0x30, + 0x0, 0x20, 0xc0, 0x53, 0xe2, 0xc, 0x48, 0x0, + 0x0, 0xd6, 0xd6, 0xd6, 0xb0, 0xc, 0x90, 0x0, + 0x0, 0xc0, 0xc0, 0xc1, 0xb0, 0xd, 0x20, 0x0, + 0x0, 0xd6, 0xd6, 0xc0, 0xb0, 0x7d, 0x0, 0x0, + 0x0, 0x30, 0xc0, 0x10, 0xb3, 0x1c, 0x0, 0x0, + 0x5, 0x66, 0xd6, 0xa6, 0xb0, 0xc, 0x0, 0x10, + 0x1, 0x0, 0xc0, 0x0, 0xb0, 0xc, 0x0, 0x60, + 0x0, 0x0, 0xc0, 0x0, 0xb0, 0xb, 0x0, 0x90, + 0x0, 0x0, 0xd0, 0x0, 0xc1, 0x8, 0xcb, 0xe2, + 0x0, 0x0, 0x50, 0x0, 0x30, 0x0, 0x0, 0x0, + + /* U+97F3 "音" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x70, 0x0, 0x70, 0x0, 0x3, + 0x76, 0x76, 0x66, 0x68, 0x68, 0x30, 0x0, 0x0, + 0xa, 0x20, 0x1, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x5c, 0x0, 0x75, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x60, 0x8, 0x0, 0x1b, 0x30, 0x76, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x64, 0x0, 0x0, 0x40, 0x0, + 0x0, 0x7, 0x0, 0x0, 0x0, 0xe, 0x66, 0x66, + 0x66, 0xe2, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, + 0xe0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, 0xe0, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x10, 0x0, + + /* U+97FF "響" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x1, 0x28, 0x10, 0x0, 0x10, 0x0, 0xb4, + 0xb, 0x66, 0xc3, 0xc6, 0xc3, 0x28, 0x15, 0x7b, + 0x66, 0xc0, 0xb2, 0x60, 0x49, 0x86, 0xb, 0x0, + 0xb0, 0xb4, 0x20, 0x5, 0x34, 0x8b, 0x68, 0x70, + 0xb0, 0x92, 0xa, 0x6b, 0x2b, 0x36, 0xa0, 0xb2, + 0x75, 0x0, 0x68, 0x9, 0x80, 0x40, 0xb3, 0xa0, + 0x36, 0x40, 0x0, 0x46, 0x0, 0x36, 0x0, 0x1, + 0x76, 0xb9, 0x66, 0xb8, 0x66, 0x10, 0x0, 0x0, + 0x18, 0x3, 0x81, 0x0, 0x71, 0x56, 0x58, 0x55, + 0x55, 0x55, 0x85, 0x53, 0x0, 0xd, 0x66, 0x66, + 0x66, 0xd2, 0x0, 0x0, 0xd, 0x66, 0x66, 0x66, + 0xd0, 0x0, 0x0, 0xd, 0x66, 0x66, 0x66, 0xd0, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x30, 0x0, + + /* U+9803 "é ƒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x0, + 0xa1, 0x0, 0x7, 0x66, 0xe6, 0x66, 0x50, 0xd, + 0x0, 0x0, 0x0, 0x19, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x2, 0xb6, 0x76, 0x6d, 0x30, 0xd, 0x0, + 0x20, 0x2b, 0x0, 0x0, 0xd0, 0x0, 0xd6, 0x69, + 0x21, 0xd6, 0x66, 0x6e, 0x0, 0xd, 0x0, 0x0, + 0x1b, 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x1, + 0xd6, 0x66, 0x6e, 0x0, 0xd, 0x0, 0x0, 0x1b, + 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x5, 0x31, 0xb0, + 0x0, 0xd, 0x0, 0xd, 0x5a, 0x20, 0x2a, 0x76, + 0x66, 0xa0, 0x0, 0xfa, 0x0, 0x0, 0xd, 0x30, + 0x71, 0x0, 0x3, 0x0, 0x0, 0xa, 0x50, 0x1, + 0xd3, 0x0, 0x0, 0x0, 0x17, 0x20, 0x0, 0x5, + 0xa0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, + 0x0, + + /* U+9805 "é …" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x30, + 0x0, 0x0, 0x4, 0x7, 0x66, 0xd6, 0x66, 0x50, + 0x6, 0x7c, 0x67, 0x20, 0x1, 0x90, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x3, 0x97, 0x76, 0x6c, 0x30, + 0x0, 0xd, 0x0, 0x3, 0xa0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0x2, 0xc6, 0x66, 0x6e, 0x0, + 0x0, 0xd, 0x0, 0x2, 0xa0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0x2, 0xa0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0x2, 0xc6, 0x66, 0x6e, 0x0, + 0x0, 0xd, 0x36, 0x32, 0xa0, 0x0, 0xd, 0x0, + 0x15, 0xac, 0x50, 0x3, 0xb6, 0x66, 0x6c, 0x0, + 0x1d, 0x50, 0x0, 0x0, 0xc, 0x30, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x96, 0x0, 0x2c, 0x20, + 0x0, 0x0, 0x0, 0x7, 0x30, 0x0, 0x6, 0xa0, + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x20, + + /* U+9808 "é ˆ" */ + 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x6, 0x0, + 0x0, 0x9a, 0x6, 0x66, 0xb8, 0x66, 0x73, 0x0, + 0x5a, 0x0, 0x0, 0xa, 0x10, 0x0, 0x0, 0x48, + 0x0, 0x0, 0xa6, 0x96, 0x66, 0xd0, 0x43, 0x0, + 0x20, 0xd, 0x0, 0x0, 0x2b, 0x0, 0x0, 0x1e, + 0x40, 0xe6, 0x66, 0x67, 0xb0, 0x0, 0xb, 0x50, + 0xd, 0x0, 0x0, 0x2b, 0x0, 0x1a, 0x30, 0x0, + 0xd0, 0x0, 0x2, 0xb0, 0x36, 0x0, 0x0, 0xe, + 0x66, 0x66, 0x7b, 0x0, 0x0, 0x3, 0xd1, 0xd0, + 0x0, 0x2, 0xb0, 0x0, 0x2, 0xd4, 0xd, 0x66, + 0x66, 0x79, 0x0, 0x3, 0xb2, 0x0, 0x8, 0x60, + 0x71, 0x0, 0x5, 0x70, 0x0, 0x5, 0xc1, 0x2, + 0xc2, 0x2, 0x10, 0x0, 0x6, 0x70, 0x0, 0x6, + 0xa0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x2, + 0x0, + + /* U+9817 "é —" */ + 0x0, 0x0, 0x92, 0x0, 0x0, 0x0, 0x0, 0x60, + 0x0, 0x0, 0xc0, 0x4, 0x76, 0xa8, 0x66, 0x82, + 0x0, 0x10, 0xc0, 0x20, 0x0, 0xb2, 0x0, 0x0, + 0x1, 0xc6, 0xd6, 0xc6, 0x96, 0x96, 0x67, 0xc0, + 0x1, 0xb0, 0xc0, 0x80, 0xd0, 0x0, 0x2, 0xa0, + 0x1, 0xb0, 0xc0, 0x20, 0xd4, 0x44, 0x45, 0xa0, + 0x1, 0xc6, 0xd6, 0xb2, 0xd2, 0x22, 0x24, 0xa0, + 0x2, 0xa0, 0x0, 0xc0, 0xd0, 0x0, 0x2, 0xa0, + 0x3, 0x92, 0x4, 0x70, 0xd6, 0x66, 0x67, 0xa0, + 0x4, 0x71, 0x8b, 0x20, 0xd0, 0x0, 0x2, 0xb0, + 0x6, 0x40, 0x6d, 0x0, 0xd6, 0x66, 0x67, 0x90, + 0x8, 0x2, 0x98, 0x80, 0x8, 0x80, 0x61, 0x0, + 0x6, 0x28, 0x0, 0x80, 0x4c, 0x10, 0x1c, 0x40, + 0x22, 0x40, 0x0, 0x5, 0x70, 0x0, 0x3, 0xd0, + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x20, + + /* U+9818 "é ˜" */ + 0x0, 0x3, 0x50, 0x0, 0x0, 0x0, 0x4, 0x30, + 0x0, 0x8, 0x90, 0x6, 0x66, 0xc7, 0x66, 0x60, + 0x0, 0xd, 0x66, 0x0, 0x0, 0xa0, 0x0, 0x0, + 0x0, 0x49, 0x8, 0x90, 0xa6, 0x86, 0x6c, 0x30, + 0x0, 0xa3, 0x0, 0xd2, 0xd0, 0x0, 0xc, 0x0, + 0x5, 0x40, 0xb1, 0x20, 0xd6, 0x66, 0x6d, 0x0, + 0x15, 0x0, 0x74, 0x0, 0xd0, 0x0, 0xc, 0x0, + 0x1, 0x55, 0x55, 0xa0, 0xd0, 0x0, 0xc, 0x0, + 0x0, 0x31, 0x15, 0xb1, 0xd6, 0x66, 0x6d, 0x0, + 0x0, 0x0, 0xa, 0x0, 0xd0, 0x0, 0xc, 0x10, + 0x0, 0x71, 0x53, 0x0, 0xc6, 0x66, 0x6c, 0x0, + 0x0, 0xb, 0x80, 0x0, 0xa, 0x50, 0x62, 0x0, + 0x0, 0x1, 0xe3, 0x0, 0x79, 0x0, 0xc, 0x40, + 0x0, 0x0, 0x53, 0x6, 0x50, 0x0, 0x3, 0xd0, + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x20, + + /* U+982D "é ­" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x5, + 0x76, 0x66, 0xa7, 0x76, 0x7c, 0x66, 0x73, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, 0x0, 0x96, + 0x66, 0xb2, 0x2a, 0x75, 0x55, 0xe1, 0xd, 0x0, + 0xd, 0x2, 0xb0, 0x0, 0xd, 0x0, 0xd0, 0x0, + 0xd0, 0x2c, 0x66, 0x66, 0xd0, 0xd, 0x0, 0xd, + 0x2, 0xb0, 0x0, 0xd, 0x0, 0xb6, 0x66, 0x80, + 0x2b, 0x0, 0x0, 0xd0, 0x3, 0x0, 0x35, 0x2, + 0xc6, 0x66, 0x6d, 0x0, 0x64, 0x8, 0x60, 0x2b, + 0x0, 0x0, 0xd0, 0x2, 0xb0, 0x90, 0x2, 0xb6, + 0x66, 0x6b, 0x0, 0x4, 0x29, 0x54, 0x1, 0xd2, + 0x53, 0x0, 0x8d, 0xa7, 0x30, 0x0, 0xb5, 0x0, + 0xa6, 0x1, 0x0, 0x0, 0x2, 0x82, 0x0, 0x1, + 0xf0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x3, + 0x0, + + /* U+983C "é ¼" */ + 0x0, 0x0, 0x93, 0x0, 0x0, 0x0, 0x0, 0x60, + 0x0, 0x0, 0xc0, 0x0, 0x67, 0x6d, 0x66, 0x72, + 0x4, 0x66, 0xd6, 0x6c, 0x10, 0xa, 0x0, 0x0, + 0x1, 0x10, 0xc0, 0x0, 0xa, 0x77, 0x66, 0xd1, + 0x1, 0x41, 0xc1, 0x15, 0xd, 0x0, 0x0, 0xd0, + 0x1, 0xb4, 0xd4, 0x5c, 0xe, 0x66, 0x66, 0xd0, + 0x1, 0xa0, 0xc0, 0x2b, 0xd, 0x0, 0x0, 0xd0, + 0x1, 0xa1, 0xc1, 0x2b, 0xc, 0x0, 0x0, 0xd0, + 0x2, 0x99, 0xf5, 0x56, 0xd, 0x66, 0x66, 0xd0, + 0x0, 0xb, 0xe7, 0x30, 0xd, 0x0, 0x0, 0xd0, + 0x0, 0x38, 0xc0, 0xc6, 0xd, 0x66, 0x66, 0xb0, + 0x0, 0x90, 0xc0, 0x19, 0x1, 0xd2, 0x53, 0x0, + 0x6, 0x0, 0xc0, 0x0, 0x9, 0x60, 0xa, 0x70, + 0x0, 0x0, 0xc0, 0x0, 0x64, 0x0, 0x1, 0xe0, + 0x0, 0x0, 0x30, 0x1, 0x10, 0x0, 0x0, 0x20, + + /* U+984C "題" */ + 0x0, 0x30, 0x0, 0x60, 0x0, 0x0, 0x1, 0x40, + 0x0, 0xc6, 0x66, 0xd2, 0x76, 0x79, 0x66, 0x70, + 0x0, 0xb0, 0x0, 0xc0, 0x0, 0x54, 0x1, 0x0, + 0x0, 0xc6, 0x66, 0xc0, 0x2b, 0x76, 0x6e, 0x10, + 0x0, 0xc1, 0x11, 0xc0, 0x1a, 0x0, 0xc, 0x0, + 0x0, 0xb5, 0x55, 0x90, 0x1c, 0x66, 0x6c, 0x0, + 0x0, 0x0, 0x0, 0x16, 0x1b, 0x22, 0x2c, 0x0, + 0x5, 0x76, 0xd6, 0x66, 0x3b, 0x44, 0x4c, 0x0, + 0x0, 0xa0, 0xc0, 0x0, 0x1c, 0x55, 0x5c, 0x0, + 0x0, 0xb0, 0xc6, 0x88, 0x14, 0x40, 0x12, 0x0, + 0x2, 0xc0, 0xc0, 0x0, 0x8, 0x80, 0x85, 0x0, + 0x5, 0x57, 0xc0, 0x0, 0x56, 0x0, 0xd, 0x10, + 0x8, 0x1, 0xd6, 0x11, 0x20, 0x0, 0x2, 0x21, + 0x5, 0x0, 0x6, 0xcd, 0xdd, 0xde, 0xef, 0x90, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9854 "é¡”" */ + 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x60, + 0x0, 0x0, 0x76, 0x6, 0x76, 0x6c, 0x66, 0x72, + 0x2, 0x96, 0x66, 0xd6, 0x10, 0x28, 0x0, 0x0, + 0x0, 0xa, 0x2, 0xb0, 0x39, 0x86, 0x66, 0xd0, + 0x0, 0x8, 0x36, 0x12, 0x2a, 0x0, 0x1, 0xb0, + 0x3, 0xb6, 0x67, 0x69, 0x5c, 0x66, 0x66, 0xb0, + 0x2, 0x90, 0x0, 0xa2, 0x2a, 0x0, 0x1, 0xb0, + 0x2, 0x90, 0x2a, 0x50, 0x2c, 0x66, 0x66, 0xb0, + 0x3, 0x83, 0x40, 0x49, 0x2a, 0x0, 0x1, 0xc0, + 0x3, 0x80, 0x5, 0xc3, 0x2a, 0x0, 0x1, 0xc0, + 0x4, 0x62, 0x65, 0x2, 0x3b, 0x66, 0x66, 0x90, + 0x7, 0x21, 0x0, 0x6e, 0x32, 0xe1, 0x63, 0x0, + 0x7, 0x0, 0x2a, 0x80, 0xb, 0x30, 0xb, 0x60, + 0x13, 0x25, 0x61, 0x0, 0x82, 0x0, 0x2, 0xd0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x10, + + /* U+9858 "願" */ + 0x1, 0x0, 0x0, 0x20, 0x0, 0x0, 0x6, 0x20, + 0x8, 0x76, 0x86, 0x96, 0x76, 0xc8, 0x66, 0x40, + 0x8, 0x30, 0xa1, 0x0, 0x0, 0xa0, 0x0, 0x0, + 0x8, 0x57, 0x96, 0xa1, 0xb6, 0x86, 0x6d, 0x40, + 0x8, 0x58, 0x0, 0xb0, 0xd0, 0x0, 0xb, 0x10, + 0x8, 0x4b, 0x66, 0xc0, 0xd6, 0x66, 0x6d, 0x10, + 0x8, 0x48, 0x0, 0xb0, 0xc0, 0x0, 0xb, 0x10, + 0x9, 0x3b, 0x76, 0xc0, 0xc6, 0x66, 0x6d, 0x10, + 0xa, 0x11, 0x92, 0x10, 0xc0, 0x0, 0xb, 0x10, + 0x9, 0x18, 0x93, 0x10, 0xd0, 0x0, 0xb, 0x10, + 0x7, 0x75, 0x92, 0xa0, 0xc6, 0x66, 0x6b, 0x10, + 0x42, 0x70, 0x92, 0x86, 0xb, 0x60, 0x64, 0x0, + 0x23, 0x13, 0xb2, 0x22, 0x69, 0x0, 0xa, 0x70, + 0x0, 0x7, 0xd0, 0x4, 0x60, 0x0, 0x1, 0xe0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x10, + + /* U+985E "類" */ + 0x0, 0x0, 0x92, 0x0, 0x0, 0x0, 0x0, 0x70, + 0x3, 0x70, 0xd0, 0xb5, 0x67, 0x6d, 0x76, 0x62, + 0x0, 0xb3, 0xd2, 0x90, 0x0, 0xa, 0x0, 0x10, + 0x5, 0x76, 0xea, 0x6d, 0x2c, 0x67, 0x56, 0xe1, + 0x2, 0x1d, 0xe7, 0x30, 0xd, 0x0, 0x0, 0xc0, + 0x0, 0xa3, 0xd0, 0xb6, 0xe, 0x66, 0x66, 0xc0, + 0x7, 0x10, 0xd0, 0x14, 0xd, 0x0, 0x0, 0xc0, + 0x0, 0x0, 0x73, 0xa0, 0xd, 0x66, 0x66, 0xc0, + 0x0, 0x0, 0xd2, 0x53, 0xd, 0x0, 0x0, 0xc0, + 0x8, 0x76, 0xe6, 0x6c, 0x4d, 0x0, 0x0, 0xd0, + 0x0, 0x3, 0xc3, 0x0, 0xc, 0x66, 0x66, 0xa0, + 0x0, 0xa, 0x46, 0xb2, 0x0, 0xd4, 0x64, 0x0, + 0x0, 0x48, 0x0, 0x58, 0x9, 0x60, 0xa, 0x70, + 0x4, 0x60, 0x0, 0x0, 0x73, 0x0, 0x1, 0xe0, + 0x2, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x10, + + /* U+986F "顯" */ + 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x71, + 0x0, 0xd6, 0x66, 0x6e, 0x67, 0x6d, 0x76, 0x63, + 0x0, 0xd6, 0x66, 0x6c, 0x0, 0xb, 0x0, 0x10, + 0x0, 0xc0, 0x0, 0xc, 0xc, 0x78, 0x67, 0xe1, + 0x0, 0xd6, 0x66, 0x6a, 0xc, 0x0, 0x0, 0xc0, + 0x0, 0x47, 0x0, 0x53, 0xd, 0x66, 0x66, 0xc0, + 0x0, 0x82, 0x21, 0x84, 0x1c, 0x0, 0x0, 0xc0, + 0x7, 0x5b, 0x49, 0x6b, 0x2d, 0x66, 0x66, 0xc0, + 0x0, 0x84, 0x2, 0x74, 0xc, 0x0, 0x0, 0xc0, + 0xc, 0x87, 0xad, 0x78, 0x6c, 0x0, 0x0, 0xc0, + 0x2, 0x0, 0x41, 0x1, 0x3c, 0x66, 0x66, 0xa0, + 0x0, 0x56, 0x17, 0x18, 0x10, 0xd3, 0x72, 0x0, + 0x7, 0x64, 0x85, 0x85, 0x86, 0x70, 0xc, 0x40, + 0x8, 0x11, 0x20, 0x10, 0x46, 0x0, 0x3, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x10, + + /* U+98A8 "風" */ + 0x0, 0x9, 0x66, 0x66, 0x66, 0x67, 0x90, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x14, 0x80, 0x0, + 0x0, 0xd, 0x0, 0x35, 0x9c, 0xc5, 0x80, 0x0, + 0x0, 0xd, 0x36, 0x5d, 0x0, 0x4, 0x80, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x4, 0x80, 0x0, + 0x0, 0xd, 0xb, 0x6e, 0x66, 0xc4, 0x80, 0x0, + 0x0, 0xd, 0xd, 0xd, 0x2, 0xa4, 0x80, 0x0, + 0x0, 0xd, 0xd, 0xd, 0x2, 0xa3, 0x80, 0x0, + 0x0, 0xc, 0xe, 0x6e, 0x67, 0xa3, 0x80, 0x0, + 0x0, 0x1b, 0x3, 0xd, 0x1, 0x21, 0xa0, 0x0, + 0x0, 0x48, 0x0, 0xd, 0x0, 0x92, 0xc0, 0x20, + 0x0, 0x93, 0x23, 0x5e, 0x98, 0x8c, 0xa3, 0x70, + 0x1, 0x90, 0xda, 0x62, 0x0, 0xb, 0x3c, 0xa0, + 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xd0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+98DB "飛" */ + 0x0, 0x56, 0x66, 0x66, 0x69, 0x50, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x10, 0x7, 0x20, 0xa2, 0x0, + 0x0, 0x0, 0x37, 0xa5, 0x7, 0x1a, 0x82, 0x0, + 0x0, 0x3, 0xe6, 0xa1, 0x7, 0x82, 0x0, 0x0, + 0x0, 0x7b, 0x90, 0xa1, 0x5, 0x66, 0xa1, 0x0, + 0x2, 0x12, 0x90, 0xa1, 0x1, 0xd1, 0x43, 0x60, + 0x0, 0x2, 0x90, 0xa1, 0x3, 0x7e, 0x74, 0x80, + 0x8, 0x67, 0xb6, 0xc7, 0x6d, 0x25, 0xdf, 0xc0, + 0x0, 0x3, 0x80, 0xa1, 0xc, 0x2, 0x82, 0x40, + 0x0, 0x5, 0x70, 0xa1, 0xc, 0x57, 0x30, 0x0, + 0x0, 0x7, 0x40, 0xa1, 0xa, 0x4a, 0x50, 0x0, + 0x0, 0xb, 0x0, 0xa1, 0x7, 0x51, 0xc0, 0x20, + 0x0, 0x37, 0x0, 0xa2, 0x1, 0xc0, 0x0, 0x70, + 0x1, 0x80, 0x0, 0xa2, 0x0, 0x4b, 0x40, 0xa0, + 0x6, 0x0, 0x0, 0x60, 0x0, 0x2, 0x8c, 0xc0, + + /* U+98DF "食" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xb0, 0x19, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x7a, 0xa, 0x21, 0xb7, 0x0, 0x0, + 0x0, 0x8, 0x70, 0x5, 0x90, 0xa, 0xfa, 0x72, + 0x3, 0x72, 0xd6, 0x66, 0x76, 0x8c, 0x29, 0x80, + 0x1, 0x0, 0xe0, 0x0, 0x0, 0x3a, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x8a, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x3a, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x89, 0x30, 0x0, + 0x0, 0x0, 0xe0, 0x25, 0x10, 0xa, 0x90, 0x0, + 0x0, 0x0, 0xe0, 0x1, 0x89, 0x91, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x47, 0x31, 0xad, 0x50, 0x0, + 0x0, 0x0, 0xfc, 0x40, 0x0, 0x5, 0xf2, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x31, 0x0, + + /* U+98EF "飯" */ + 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, 0x5, 0x0, + 0x0, 0x4, 0xd1, 0x0, 0x54, 0x68, 0xaa, 0x40, + 0x0, 0xb, 0x27, 0x91, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x74, 0x60, 0x69, 0x93, 0x0, 0x0, 0x0, + 0x3, 0x60, 0x76, 0x1, 0x93, 0x0, 0x1, 0x0, + 0x14, 0x96, 0x67, 0xb1, 0x98, 0x66, 0x6b, 0x80, + 0x0, 0xc0, 0x0, 0xc0, 0x93, 0x40, 0xb, 0x10, + 0x0, 0xc6, 0x66, 0xd0, 0x93, 0x50, 0xb, 0x0, + 0x0, 0xc0, 0x0, 0xc0, 0xa2, 0x60, 0x56, 0x0, + 0x0, 0xc6, 0x66, 0xb0, 0xb0, 0x35, 0xb0, 0x0, + 0x0, 0xc0, 0x8, 0x0, 0xb0, 0xb, 0x60, 0x0, + 0x0, 0xc0, 0x19, 0xa1, 0x90, 0x3c, 0x90, 0x0, + 0x0, 0xda, 0x80, 0xa6, 0x21, 0x90, 0x97, 0x0, + 0x0, 0x93, 0x0, 0x5, 0x17, 0x0, 0xc, 0xa1, + 0x0, 0x0, 0x0, 0x20, 0x40, 0x0, 0x0, 0x30, + + /* U+98F2 "飲" */ + 0x0, 0x0, 0xa2, 0x0, 0x6, 0x60, 0x0, 0x0, + 0x0, 0x4, 0xe1, 0x0, 0xa, 0x50, 0x0, 0x0, + 0x0, 0xb, 0x28, 0x90, 0xc, 0x0, 0x0, 0x0, + 0x0, 0x65, 0x50, 0x79, 0x3c, 0x66, 0x6c, 0x60, + 0x2, 0x70, 0x75, 0x1, 0x81, 0x10, 0xc, 0x10, + 0x14, 0x86, 0x77, 0xa3, 0x70, 0xf2, 0x35, 0x0, + 0x0, 0xc0, 0x0, 0xc5, 0x0, 0xf1, 0x40, 0x0, + 0x0, 0xc6, 0x66, 0xd0, 0x1, 0xe3, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0xc0, 0x3, 0xa5, 0x0, 0x0, + 0x0, 0xc6, 0x66, 0xb0, 0x6, 0x77, 0x0, 0x0, + 0x0, 0xc0, 0x8, 0x0, 0xa, 0x28, 0x20, 0x0, + 0x0, 0xc0, 0x28, 0xa0, 0x1b, 0x2, 0xb0, 0x0, + 0x0, 0xdb, 0x70, 0x90, 0x81, 0x0, 0x89, 0x0, + 0x0, 0x72, 0x0, 0x6, 0x20, 0x0, 0xb, 0xc2, + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x10, + + /* U+9928 "館" */ + 0x0, 0x0, 0xa1, 0x0, 0x0, 0x74, 0x0, 0x0, + 0x0, 0x5, 0xd0, 0x0, 0x20, 0xe, 0x20, 0x20, + 0x0, 0xc, 0x3a, 0x62, 0x96, 0x68, 0x66, 0xe3, + 0x0, 0x86, 0x30, 0xce, 0x30, 0x0, 0x4, 0x50, + 0x4, 0x60, 0xb1, 0x0, 0x41, 0x11, 0x28, 0x0, + 0x14, 0x96, 0x96, 0xa0, 0xb5, 0x44, 0x5c, 0x0, + 0x0, 0xc0, 0x0, 0xc0, 0xa2, 0x0, 0x1b, 0x0, + 0x0, 0xd6, 0x66, 0xc0, 0xa7, 0x66, 0x6b, 0x0, + 0x0, 0xc0, 0x0, 0xc0, 0xa2, 0x0, 0x1, 0x0, + 0x0, 0xd6, 0x66, 0xa0, 0xa7, 0x66, 0x6c, 0x60, + 0x0, 0xc0, 0x7, 0x0, 0xa2, 0x0, 0xa, 0x20, + 0x0, 0xc0, 0x19, 0x90, 0xa2, 0x0, 0xa, 0x20, + 0x1, 0xeb, 0x70, 0xa0, 0xa7, 0x66, 0x6c, 0x20, + 0x0, 0xa2, 0x0, 0x0, 0xb2, 0x0, 0x8, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, + + /* U+9996 "首" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x16, 0x0, 0x0, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xa0, 0x4, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xd0, 0x8, 0x0, 0x8, 0x30, + 0x6, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x67, 0x50, + 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb6, 0x86, 0x66, 0x6d, 0x30, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x2, 0x0, 0x0, + + /* U+9999 "香" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x49, 0xe5, 0x0, 0x0, + 0x14, 0x56, 0x7d, 0x75, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0x10, 0x5, 0x66, + 0x66, 0x6d, 0x66, 0x66, 0x6e, 0x30, 0x10, 0x0, + 0x3c, 0xd4, 0x50, 0x0, 0x0, 0x0, 0x0, 0x2c, + 0x1c, 0x16, 0x70, 0x0, 0x0, 0x0, 0x3a, 0x10, + 0xc1, 0x6, 0xc5, 0x0, 0x0, 0x57, 0x20, 0x7, + 0x0, 0x8, 0xcf, 0x71, 0x52, 0xd, 0x66, 0x66, + 0x66, 0xe1, 0x30, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0xc, 0x0, 0x0, 0x0, 0xd, 0x66, 0x66, 0x66, + 0xc0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xc, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0xc0, + 0x0, 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+99C4 "é§„" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x96, 0x66, 0x6b, 0x0, 0x97, 0x0, 0x0, + 0x0, 0xd0, 0xa1, 0x0, 0x0, 0x93, 0x0, 0x0, + 0x0, 0xd0, 0xa1, 0x23, 0x0, 0x93, 0x0, 0x0, + 0x0, 0xe6, 0xc6, 0x64, 0x0, 0x92, 0x0, 0x30, + 0x0, 0xd0, 0xa1, 0x12, 0x76, 0xc9, 0x67, 0x80, + 0x0, 0xd6, 0xc6, 0x75, 0x0, 0xb6, 0x0, 0x0, + 0x0, 0xd0, 0xa1, 0x0, 0x0, 0xc7, 0x0, 0x0, + 0x0, 0xe5, 0x95, 0x5e, 0x10, 0xb6, 0x10, 0x0, + 0x0, 0x90, 0x0, 0xd, 0x3, 0x84, 0x50, 0x0, + 0x0, 0x24, 0x29, 0xc, 0x8, 0x30, 0xa0, 0x0, + 0x5, 0x54, 0xc7, 0x3a, 0xb, 0x0, 0xb1, 0x0, + 0xb, 0x46, 0x30, 0x58, 0x57, 0x60, 0x5a, 0x0, + 0x4, 0x1, 0x21, 0xb4, 0x90, 0x77, 0xe, 0x50, + 0x0, 0x0, 0x5f, 0x97, 0x10, 0x16, 0x4, 0xd2, + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, + + /* U+99C5 "é§…" */ + 0x0, 0x53, 0x33, 0x38, 0x13, 0x0, 0x0, 0x50, + 0x0, 0xd3, 0xb5, 0x33, 0x2d, 0x66, 0x67, 0xc0, + 0x0, 0xc0, 0xa2, 0x31, 0x1c, 0x0, 0x2, 0xa0, + 0x0, 0xd6, 0xc7, 0x63, 0x1c, 0x0, 0x2, 0xa0, + 0x0, 0xc0, 0xa2, 0x20, 0x1c, 0x0, 0x2, 0xa0, + 0x0, 0xd6, 0xc7, 0x74, 0xd, 0x68, 0x67, 0xa0, + 0x0, 0xc0, 0xa2, 0x0, 0xc, 0x6, 0x0, 0x0, + 0x0, 0xd5, 0x95, 0x6d, 0x2b, 0x7, 0x0, 0x0, + 0x0, 0x80, 0x0, 0x2a, 0x39, 0x8, 0x0, 0x0, + 0x1, 0x23, 0x39, 0x49, 0x56, 0x6, 0x50, 0x0, + 0x7, 0x45, 0xc4, 0x87, 0x82, 0x1, 0xc0, 0x0, + 0xd, 0x37, 0x30, 0x84, 0xa0, 0x0, 0x98, 0x0, + 0x4, 0x0, 0x10, 0xd4, 0x50, 0x0, 0xd, 0x80, + 0x0, 0x0, 0x5f, 0x77, 0x0, 0x0, 0x2, 0xa3, + 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+9A12 "騒" */ + 0x0, 0x30, 0x0, 0x32, 0x12, 0x22, 0x27, 0x0, + 0x0, 0xe6, 0xd6, 0x63, 0x48, 0x44, 0x6e, 0x20, + 0x0, 0xd0, 0xc0, 0x20, 0x4, 0x40, 0x96, 0x0, + 0x0, 0xe6, 0xd6, 0x83, 0x0, 0xa5, 0xc0, 0x0, + 0x0, 0xd0, 0xc0, 0x0, 0x0, 0x3f, 0x40, 0x0, + 0x0, 0xd6, 0xd6, 0xa2, 0x4, 0x94, 0xca, 0x50, + 0x0, 0xd0, 0xc0, 0x1, 0x54, 0xd, 0x6, 0x71, + 0x0, 0xe5, 0xc5, 0x6b, 0x56, 0x6e, 0x69, 0x30, + 0x0, 0x40, 0x0, 0x39, 0x66, 0xd, 0xc, 0x10, + 0x0, 0x23, 0x38, 0x48, 0x66, 0xd, 0xc, 0x0, + 0x6, 0x36, 0xa8, 0x76, 0x79, 0x6e, 0x6d, 0x0, + 0xc, 0x29, 0x30, 0x84, 0x10, 0xd, 0x23, 0x0, + 0x14, 0x0, 0x0, 0xc1, 0x0, 0xd, 0x3c, 0x60, + 0x0, 0x2, 0x7e, 0x81, 0xdc, 0xa7, 0x41, 0xc0, + 0x0, 0x0, 0x2, 0x0, 0x20, 0x0, 0x0, 0x0, + + /* U+9A13 "験" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x50, 0x0, 0x5a, 0x0, 0x0, + 0x0, 0xd6, 0xd6, 0x62, 0x0, 0xc8, 0x0, 0x0, + 0x0, 0xc0, 0xc0, 0x20, 0x7, 0x80, 0x80, 0x0, + 0x0, 0xd6, 0xd6, 0x71, 0x59, 0x0, 0x4d, 0x61, + 0x0, 0xc0, 0xc0, 0x5, 0x88, 0x6a, 0x78, 0x60, + 0x0, 0xd6, 0xd6, 0x91, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xc0, 0xc0, 0x0, 0xb6, 0x6e, 0x6d, 0x20, + 0x0, 0xd5, 0xc5, 0x96, 0xc0, 0xd, 0xc, 0x0, + 0x0, 0x60, 0x0, 0x84, 0xc0, 0xd, 0xc, 0x0, + 0x1, 0x24, 0x29, 0x93, 0xc6, 0x6d, 0x6d, 0x0, + 0xa, 0x55, 0xa8, 0xb2, 0x30, 0x4b, 0x2, 0x0, + 0x2d, 0x36, 0x20, 0xb1, 0x0, 0xb3, 0x60, 0x0, + 0x12, 0x0, 0x1, 0xc0, 0x8, 0x50, 0x85, 0x0, + 0x0, 0x2, 0x7e, 0x62, 0x83, 0x0, 0xb, 0xb1, + 0x0, 0x0, 0x1, 0x13, 0x0, 0x0, 0x0, 0x10, + + /* U+9A57 "é©—" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x50, 0x0, 0x77, 0x0, 0x0, + 0x0, 0xd6, 0xc6, 0x71, 0x0, 0xc6, 0x0, 0x0, + 0x0, 0xc0, 0xc0, 0x10, 0x8, 0x44, 0x70, 0x0, + 0x0, 0xd6, 0xd6, 0x80, 0x38, 0x0, 0x99, 0x0, + 0x0, 0xc0, 0xc0, 0x3, 0x86, 0x66, 0xaa, 0xc2, + 0x0, 0xd6, 0xd6, 0x83, 0x0, 0x0, 0x1, 0x0, + 0x0, 0xc0, 0xc0, 0x1, 0xc6, 0xc6, 0x8c, 0x40, + 0x0, 0xd5, 0xc4, 0xa5, 0xb0, 0xb5, 0x49, 0x10, + 0x0, 0xa0, 0x0, 0xb2, 0xb0, 0xb5, 0x49, 0x10, + 0x1, 0x23, 0x26, 0xb1, 0xd6, 0xa6, 0x8b, 0x10, + 0x7, 0x63, 0xa8, 0xc0, 0x2c, 0x10, 0x65, 0x0, + 0xc, 0x54, 0x40, 0xc0, 0x5a, 0x0, 0xa2, 0x0, + 0x13, 0x0, 0x2, 0xb0, 0xb5, 0x70, 0xa9, 0x10, + 0x0, 0x1, 0x7f, 0x48, 0x30, 0xa7, 0x13, 0x90, + 0x0, 0x0, 0x1, 0x21, 0x0, 0x12, 0x0, 0x10, + + /* U+9AD4 "é«”" */ + 0x0, 0x10, 0x3, 0x0, 0x1, 0xb0, 0xb0, 0x0, + 0x0, 0xc6, 0x6d, 0x30, 0x1, 0xc0, 0xc0, 0x30, + 0x0, 0xc6, 0x7b, 0x0, 0xd6, 0xd5, 0xd7, 0xc0, + 0x0, 0xc3, 0x7b, 0x0, 0xd4, 0xd3, 0xc6, 0x90, + 0x3, 0xc3, 0x7b, 0x20, 0xd3, 0xc2, 0xc5, 0x90, + 0xb, 0x76, 0x67, 0xc5, 0xd4, 0xd3, 0xc6, 0xa0, + 0x47, 0x86, 0x69, 0x60, 0x71, 0x11, 0x12, 0x60, + 0x0, 0xd0, 0xa, 0x25, 0x76, 0x66, 0x66, 0x72, + 0x0, 0xd6, 0x6c, 0x10, 0x67, 0x66, 0x6a, 0x50, + 0x0, 0xd0, 0xa, 0x10, 0x84, 0x0, 0x9, 0x30, + 0x0, 0xd6, 0x6c, 0x10, 0x88, 0x66, 0x6b, 0x30, + 0x0, 0xd0, 0xa, 0x10, 0x46, 0x0, 0x77, 0x0, + 0x0, 0xd0, 0xa, 0x10, 0x4, 0x80, 0xa1, 0x0, + 0x0, 0xd1, 0x8e, 0x16, 0x66, 0x86, 0xa6, 0xc3, + 0x0, 0x30, 0x1, 0x2, 0x0, 0x0, 0x0, 0x0, + + /* U+9AD8 "高" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2b, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x63, 0x0, 0x0, 0x15, 0x6, 0x76, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x60, 0x0, 0x8, + 0x66, 0x66, 0x66, 0x80, 0x0, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0xd, 0x66, + 0x66, 0x68, 0x80, 0x0, 0x0, 0x0, 0x90, 0x0, + 0x0, 0x24, 0x0, 0x0, 0xa, 0x66, 0x66, 0x66, + 0x66, 0x66, 0xd2, 0x0, 0xd0, 0x2, 0x0, 0x0, + 0x30, 0xe, 0x0, 0xd, 0x0, 0xe6, 0x66, 0x7d, + 0x0, 0xe0, 0x0, 0xd0, 0xd, 0x0, 0x1, 0xb0, + 0xe, 0x0, 0xd, 0x0, 0xe6, 0x66, 0x6b, 0x0, + 0xe0, 0x0, 0xd0, 0x9, 0x0, 0x1, 0x60, 0xe, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x6b, 0xd0, + 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, + + /* U+9AEA "髪" */ + 0x0, 0x2, 0x0, 0x4, 0x0, 0x0, 0x30, 0x0, + 0x0, 0xe, 0x66, 0x66, 0x10, 0x6, 0xc3, 0x0, + 0x0, 0xe, 0x66, 0x6a, 0x3, 0xa6, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x14, 0x24, 0x0, 0x5b, 0x0, + 0x0, 0xe, 0x55, 0x55, 0x10, 0x29, 0x71, 0x0, + 0x5, 0x7a, 0x96, 0x67, 0x95, 0x50, 0x4, 0x60, + 0x0, 0x8, 0x80, 0x73, 0x0, 0x3, 0xa9, 0x40, + 0x0, 0xcb, 0x76, 0x5c, 0x16, 0x75, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x77, 0x10, 0x0, 0x3, 0x0, + 0x6, 0x65, 0x56, 0xd7, 0x55, 0x55, 0x6a, 0x70, + 0x0, 0x0, 0x9, 0xa6, 0x66, 0x68, 0x10, 0x0, + 0x0, 0x0, 0x78, 0x60, 0x0, 0xa9, 0x10, 0x0, + 0x0, 0x7, 0x60, 0x8, 0x5c, 0x50, 0x0, 0x0, + 0x1, 0x73, 0x0, 0x29, 0xab, 0x40, 0x0, 0x0, + 0x3, 0x2, 0x67, 0x61, 0x1, 0x7c, 0xca, 0x70, + 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, 0x14, 0x10, + + /* U+9B5A "é­š" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xc1, 0x0, 0x60, 0x0, 0x0, 0x0, + 0x3, 0xc6, 0x66, 0xbc, 0x20, 0x0, 0x0, 0x3, + 0xa0, 0x0, 0x9, 0x0, 0x10, 0x0, 0x3, 0x9b, + 0x66, 0x6b, 0x66, 0x6e, 0x50, 0x4, 0x41, 0xb0, + 0x0, 0xe0, 0x0, 0xd1, 0x0, 0x0, 0x1b, 0x0, + 0xe, 0x0, 0xd, 0x10, 0x0, 0x1, 0xd6, 0x66, + 0xe6, 0x66, 0xe1, 0x0, 0x0, 0x1b, 0x0, 0xe, + 0x0, 0xd, 0x10, 0x0, 0x1, 0xd6, 0x66, 0xd6, + 0x66, 0xe1, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, + 0x5, 0x0, 0x0, 0x6, 0x4, 0x30, 0x56, 0x1, + 0x92, 0x0, 0x5, 0xa0, 0xe, 0x0, 0xc5, 0x2, + 0xf4, 0x3, 0xe2, 0x0, 0xd2, 0x6, 0x70, 0x8, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9CE5 "é³¥" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x3, 0x50, 0x0, 0x30, 0x0, 0x0, 0x0, + 0xd6, 0x66, 0x66, 0x6c, 0x50, 0x0, 0x0, 0xd, + 0x66, 0x66, 0x66, 0xc2, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0xd, 0x66, + 0x66, 0x66, 0xc3, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x2, 0x0, 0x62, 0x0, 0xd, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x40, 0x0, 0xd6, 0x66, 0x66, + 0x66, 0x67, 0xc0, 0x0, 0x6, 0x0, 0x0, 0x3, + 0x0, 0x4a, 0x0, 0x3, 0x4, 0x4, 0x70, 0x3b, + 0x6, 0x80, 0x0, 0x80, 0xa4, 0xa, 0x60, 0x96, + 0x85, 0x0, 0x78, 0x5, 0x80, 0x24, 0x11, 0x1c, + 0x30, 0x9, 0x10, 0x1, 0x0, 0x3, 0x9d, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x61, 0x0, + + /* U+9E97 "麗" */ + 0x2, 0x33, 0x33, 0x54, 0x23, 0x33, 0x38, 0x10, + 0x2, 0x73, 0x33, 0x62, 0x27, 0x33, 0x63, 0x10, + 0x0, 0xc6, 0x86, 0xd0, 0xe, 0x86, 0xd2, 0x0, + 0x0, 0xc0, 0x81, 0xc0, 0xd, 0x29, 0xc0, 0x0, + 0x0, 0xa0, 0x10, 0x96, 0x6a, 0x2, 0x94, 0x0, + 0x0, 0x79, 0x66, 0xa6, 0x79, 0x66, 0x79, 0x20, + 0x0, 0x76, 0x0, 0xc0, 0x9, 0x20, 0x23, 0x0, + 0x0, 0x7a, 0x66, 0xd6, 0x6b, 0x76, 0x9a, 0x0, + 0x0, 0x7a, 0x66, 0xc6, 0x6b, 0x76, 0x97, 0x0, + 0x0, 0x85, 0xb, 0x0, 0x8, 0x40, 0x21, 0x0, + 0x0, 0xa3, 0xd, 0x68, 0x89, 0x25, 0xc8, 0x0, + 0x0, 0xc0, 0xc, 0x0, 0x9, 0x73, 0x0, 0x50, + 0x2, 0x70, 0xc, 0x47, 0x48, 0x20, 0x0, 0xb0, + 0x7, 0x0, 0x1d, 0x60, 0x5, 0xdc, 0xcd, 0xc0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9EBC "麼" */ + 0x0, 0x0, 0x0, 0x5, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x50, 0x0, 0x0, 0xb2, 0x0, 0x8, 0x40, + 0x0, 0xd6, 0x66, 0x96, 0x66, 0x68, 0x66, 0x50, + 0x0, 0xc0, 0x0, 0xd1, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0xc3, 0x77, 0xd7, 0x57, 0x8d, 0x68, 0x40, + 0x0, 0xc0, 0xa, 0xd7, 0x10, 0xba, 0x70, 0x0, + 0x0, 0xc0, 0x65, 0xc3, 0x77, 0x6a, 0x4a, 0x20, + 0x0, 0xc5, 0x30, 0xc0, 0x33, 0x29, 0x5, 0x70, + 0x0, 0xb0, 0x0, 0x27, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xb0, 0x4, 0x73, 0x0, 0x5e, 0x20, 0x0, + 0x1, 0x90, 0x9d, 0x97, 0x6b, 0x81, 0x0, 0x0, + 0x4, 0x50, 0x0, 0x6, 0x71, 0x2, 0x60, 0x0, + 0x8, 0x0, 0x37, 0x73, 0x34, 0x55, 0xb6, 0x0, + 0x6, 0x0, 0x9d, 0xa7, 0x53, 0x10, 0x2b, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9EC4 "黄" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc2, 0x0, 0xb3, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xc, 0x10, 0x72, 0x0, 0x7, + 0x66, 0xe6, 0x66, 0xd6, 0x66, 0x40, 0x0, 0x0, + 0xd, 0x0, 0xc, 0x10, 0x4, 0x3, 0x76, 0x66, + 0xa6, 0xa6, 0x96, 0x66, 0xa6, 0x0, 0x1, 0x0, + 0xd, 0x0, 0x2, 0x0, 0x0, 0x0, 0xc6, 0x66, + 0xe6, 0x66, 0xc5, 0x0, 0x0, 0xc, 0x10, 0xd, + 0x0, 0xb, 0x20, 0x0, 0x0, 0xc6, 0x66, 0xe6, + 0x66, 0xc2, 0x0, 0x0, 0xc, 0x10, 0xd, 0x0, + 0xb, 0x20, 0x0, 0x0, 0xc6, 0x66, 0xd6, 0x66, + 0xc2, 0x0, 0x0, 0x6, 0x2c, 0x30, 0x4, 0x44, + 0x0, 0x0, 0x0, 0x3d, 0x70, 0x0, 0x3, 0xb9, + 0x10, 0x0, 0x89, 0x10, 0x0, 0x0, 0x0, 0x9d, + 0x0, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, + + /* U+9ED2 "é»’" */ + 0x0, 0x30, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, + 0xe6, 0x66, 0x7b, 0x66, 0x6e, 0x40, 0x0, 0xd0, + 0x0, 0x2a, 0x0, 0xd, 0x0, 0x0, 0xd6, 0x66, + 0x7c, 0x66, 0x6e, 0x0, 0x0, 0xd0, 0x0, 0x2a, + 0x0, 0xd, 0x0, 0x0, 0xe6, 0x66, 0x7c, 0x66, + 0x6e, 0x0, 0x0, 0x60, 0x0, 0x2a, 0x0, 0x3, + 0x0, 0x4, 0x66, 0x66, 0x7c, 0x66, 0x6d, 0x70, + 0x1, 0x10, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0x0, 0x1, 0xd3, 0x57, 0x66, + 0x66, 0x66, 0x66, 0x67, 0x64, 0x0, 0x60, 0x35, + 0x0, 0x90, 0x8, 0x20, 0x3, 0x90, 0xd, 0x0, + 0x87, 0x4, 0xd0, 0xd, 0x50, 0xa, 0x10, 0x36, + 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+9EDE "點" */ + 0x3, 0x0, 0x0, 0x30, 0x0, 0xa3, 0x0, 0x0, + 0x9, 0x66, 0xc6, 0xd2, 0x0, 0xd0, 0x0, 0x0, + 0x9, 0x42, 0xb8, 0xc0, 0x0, 0xd0, 0x0, 0x0, + 0x9, 0x2a, 0xc4, 0xc0, 0x0, 0xd5, 0x56, 0xa0, + 0x9, 0x67, 0xd6, 0xd0, 0x0, 0xd0, 0x0, 0x0, + 0x6, 0x1, 0xb0, 0x50, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x11, 0xb1, 0x70, 0x0, 0xd0, 0x0, 0x0, + 0x4, 0x65, 0xc5, 0x51, 0x96, 0xe6, 0x6b, 0x10, + 0x0, 0x1, 0xb0, 0x41, 0xc0, 0x0, 0xd, 0x0, + 0x4, 0x69, 0xa5, 0x10, 0xc0, 0x0, 0xd, 0x0, + 0xb, 0x50, 0x0, 0x40, 0xc0, 0x0, 0xd, 0x0, + 0x2, 0x6, 0x9, 0x38, 0xc0, 0x0, 0xd, 0x0, + 0x9, 0x9, 0x2a, 0x8, 0xd6, 0x66, 0x6d, 0x0, + 0x2a, 0x2, 0x0, 0x0, 0xc0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x1, 0x0, + + /* U+9EE8 "黨" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x50, 0xb, 0x30, 0x18, 0x0, 0x0, + 0x0, 0x0, 0x88, 0xb, 0x0, 0x96, 0x0, 0x0, + 0x0, 0x95, 0x58, 0x5b, 0x57, 0x75, 0x5a, 0x70, + 0x6, 0x70, 0x47, 0x66, 0x66, 0x91, 0x18, 0x10, + 0x8, 0x10, 0x56, 0x0, 0x0, 0xc0, 0x10, 0x0, + 0x0, 0x0, 0x5a, 0x66, 0x66, 0xc0, 0x0, 0x0, + 0x0, 0xa, 0x66, 0x66, 0x66, 0x66, 0xb2, 0x0, + 0x0, 0xd, 0x8, 0x18, 0x30, 0x90, 0xc0, 0x0, + 0x0, 0xd, 0x3, 0x48, 0x35, 0x20, 0xc0, 0x0, + 0x0, 0xd, 0x66, 0x6b, 0x86, 0x66, 0xa0, 0x0, + 0x0, 0x47, 0x55, 0x5b, 0x85, 0x55, 0x97, 0x0, + 0x5, 0x66, 0x66, 0x6b, 0x86, 0x66, 0x6b, 0x80, + 0x1, 0x13, 0x2, 0x30, 0x5, 0x0, 0x13, 0x0, + 0x0, 0x94, 0x0, 0xb0, 0x9, 0x20, 0xb, 0x10, + 0x2, 0x70, 0x0, 0x30, 0x2, 0x0, 0x3, 0x0, + + /* U+9F13 "鼓" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb4, 0x0, 0x0, 0xd, 0x10, 0x0, + 0x0, 0x0, 0xc0, 0x0, 0x20, 0xd, 0x0, 0x0, + 0x7, 0x66, 0xd6, 0x67, 0x60, 0xd, 0x0, 0x20, + 0x0, 0x0, 0xc0, 0x0, 0x57, 0x6e, 0x66, 0xa1, + 0x1, 0x86, 0xb6, 0x6a, 0x30, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xd6, 0x66, 0x6e, 0x38, 0x69, 0x6b, 0x90, + 0x0, 0xd1, 0x0, 0x1b, 0x4, 0x10, 0xd, 0x10, + 0x0, 0xd6, 0x66, 0x6c, 0x0, 0x70, 0x59, 0x0, + 0x0, 0x70, 0x0, 0x25, 0x0, 0x81, 0xc1, 0x0, + 0x0, 0x26, 0x1, 0xd0, 0x0, 0x2e, 0x60, 0x0, + 0x0, 0xb, 0x4, 0x20, 0x0, 0x6d, 0x80, 0x0, + 0x0, 0x14, 0x48, 0x76, 0x47, 0x70, 0x9b, 0x10, + 0x1e, 0xc8, 0x41, 0x2, 0x73, 0x0, 0x8, 0xd3, + 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, + + /* U+9F3B "é¼»" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x10, 0x1, 0x0, 0x0, 0x0, + 0xb, 0x67, 0x76, 0x66, 0xe1, 0x0, 0x0, 0x0, + 0xc6, 0x66, 0x66, 0x6c, 0x0, 0x0, 0x0, 0xc, + 0x10, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xc6, + 0x66, 0x66, 0x6c, 0x0, 0x0, 0x0, 0xc, 0x66, + 0x66, 0x66, 0xc0, 0x0, 0x0, 0xb, 0x65, 0x55, + 0x85, 0x55, 0xb5, 0x0, 0x0, 0xd6, 0x66, 0x6d, + 0x66, 0x6c, 0x20, 0x0, 0xc, 0x0, 0x0, 0xb0, + 0x0, 0xa2, 0x0, 0x0, 0xd6, 0x66, 0x68, 0x66, + 0x6c, 0x20, 0x4, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x67, 0xc1, 0x11, 0x0, 0xa5, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0xc0, 0x0, + 0x0, 0x0, 0x3a, 0x20, 0x0, 0xc, 0x0, 0x0, + 0x0, 0x33, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, + + /* U+F001 "ï€" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdc, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, + 0x0, 0x0, 0x3, 0x8d, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xea, 0x51, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x83, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x2b, 0xff, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xfd, + 0xdf, 0xff, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xb2, + 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, + 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, + 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + + /* U+F00B "" */ + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xc0, + 0x1b, 0xa0, 0x0, 0x0, 0xb, 0xff, 0xfc, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xc0, 0x0, + 0xbf, 0xff, 0xb0, 0xb, 0xff, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0xfb, 0xbf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "ï€" */ + 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xfc, 0x10, + 0x0, 0x1c, 0xf8, 0xff, 0xfc, 0x10, 0x1c, 0xff, + 0xf5, 0xff, 0xfc, 0x2c, 0xff, 0xf5, 0x5, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x1d, 0xff, 0xfd, 0x10, 0x0, 0x1c, + 0xff, 0xff, 0xfc, 0x10, 0x1c, 0xff, 0xf9, 0xff, + 0xfc, 0x1c, 0xff, 0xf5, 0x5, 0xff, 0xfc, 0xdf, + 0xf5, 0x0, 0x5, 0xff, 0xd1, 0xa4, 0x0, 0x0, + 0x4, 0xa1, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x4f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x10, 0x6f, 0xf1, 0x3, 0x10, 0x0, + 0x0, 0x5f, 0xd0, 0x6f, 0xf1, 0x3f, 0xd1, 0x0, + 0x3, 0xff, 0xf1, 0x6f, 0xf1, 0x5f, 0xfd, 0x0, + 0xd, 0xff, 0x40, 0x6f, 0xf1, 0x9, 0xff, 0x70, + 0x4f, 0xf7, 0x0, 0x6f, 0xf1, 0x0, 0xcf, 0xe0, + 0x9f, 0xf0, 0x0, 0x6f, 0xf1, 0x0, 0x5f, 0xf3, + 0xbf, 0xc0, 0x0, 0x6f, 0xf1, 0x0, 0x2f, 0xf5, + 0xbf, 0xc0, 0x0, 0x4f, 0xe0, 0x0, 0x1f, 0xf6, + 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0x6f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf0, + 0xf, 0xfe, 0x10, 0x0, 0x0, 0x5, 0xff, 0xa0, + 0x6, 0xff, 0xd3, 0x0, 0x0, 0x7f, 0xff, 0x20, + 0x0, 0x9f, 0xff, 0xda, 0xbe, 0xff, 0xf4, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0x0, 0x17, 0xbd, 0xca, 0x50, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, + 0x4, 0xfd, 0xdf, 0xff, 0xff, 0xfd, 0xef, 0x40, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, + 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, + 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, + 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, + 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, + 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x4, 0xfe, 0xdf, 0xff, 0xff, 0xfd, 0xdf, 0x40, + 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x3, 0xdd, 0x30, 0x3f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x4f, + 0xf4, 0x0, 0x0, 0x0, 0x9, 0xff, 0x99, 0xff, + 0xbf, 0xf4, 0x0, 0x0, 0x1, 0xbf, 0xf6, 0x22, + 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x2d, 0xfe, 0x35, + 0xff, 0x53, 0xef, 0xf4, 0x0, 0x4, 0xff, 0xc1, + 0x8f, 0xff, 0xf8, 0x2d, 0xfe, 0x40, 0x7f, 0xfa, + 0x1a, 0xff, 0xff, 0xff, 0xa1, 0xaf, 0xf7, 0xcf, + 0x82, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x28, 0xfc, + 0x14, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x41, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf9, 0x0, 0x8f, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xe, 0xff, + 0xf6, 0x0, 0x6f, 0xff, 0xe0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xfc, 0x1b, 0xb1, 0xcf, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xc2, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F01C "" */ + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0xaf, 0xb0, 0x0, 0x0, 0x0, + 0xb, 0xfa, 0x0, 0x5, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x50, 0x1e, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xe1, 0xaf, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, + + /* U+F021 "" */ + 0x0, 0x0, 0x6, 0xbd, 0xda, 0x50, 0x2, 0xff, + 0x0, 0x5, 0xef, 0xff, 0xff, 0xfe, 0x42, 0xff, + 0x0, 0x7f, 0xff, 0xa7, 0x7b, 0xff, 0xf9, 0xff, + 0x5, 0xff, 0xc1, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xe, 0xfc, 0x0, 0x0, 0x2, 0x22, 0xdf, 0xff, + 0x5f, 0xf2, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x8f, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xb, 0xf8, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2f, 0xf4, + 0xff, 0xfd, 0x22, 0x20, 0x0, 0x0, 0xcf, 0xe0, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x2c, 0xff, 0x40, + 0xff, 0x9f, 0xff, 0xb7, 0x6a, 0xff, 0xf7, 0x0, + 0xff, 0x24, 0xdf, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0xff, 0x20, 0x5, 0xac, 0xdb, 0x60, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d, + 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x8f, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0x1, 0x50, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xbe, 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, + 0xff, 0xff, 0xff, 0xff, 0x5, 0xf8, 0xdf, 0xff, + 0xff, 0xff, 0x2, 0x60, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x3, 0xee, 0x10, 0x0, 0x0, 0x8, 0xff, 0x0, + 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x5, 0xfc, 0x7, 0xf4, 0xdf, 0xff, 0xff, + 0xff, 0x2, 0x50, 0x5f, 0x60, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xf7, 0xd, 0xc0, 0xbd, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x6, 0xf7, 0xd, + 0xc0, 0xad, 0xdf, 0xff, 0xff, 0xff, 0x2, 0x50, + 0x5f, 0x60, 0xe9, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0x5, 0xfc, 0x6, 0xf4, 0x0, 0x0, 0x8, 0xff, + 0x0, 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x0, + 0x8d, 0x0, 0x0, 0x2, 0xee, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, + + /* U+F03E "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xc, 0xff, 0xff, 0xee, 0xff, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xfe, 0x22, 0xef, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xe2, 0x0, 0x2e, 0xff, + 0xff, 0xfe, 0x4e, 0xfe, 0x20, 0x0, 0x2, 0xff, + 0xff, 0xe2, 0x2, 0xc2, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F043 "ïƒ" */ + 0x0, 0x0, 0x4e, 0x40, 0x0, 0x0, 0x0, 0xb, + 0xfb, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x30, 0x0, 0xc, 0xff, 0xff, 0xfc, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xf8, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0x2f, 0xff, 0xff, 0xff, 0xfe, 0xf2, 0xbf, 0xff, + 0xff, 0xfe, 0x9f, 0xa1, 0xbf, 0xff, 0xff, 0x92, + 0xff, 0xa2, 0x2f, 0xff, 0xf2, 0x4, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x2, 0x9e, 0xfe, 0x92, 0x0, + + /* U+F048 "ïˆ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x30, 0x0, + 0x1, 0xcc, 0xff, 0x40, 0x0, 0x2d, 0xff, 0xff, + 0x40, 0x3, 0xef, 0xff, 0xff, 0x40, 0x3f, 0xff, + 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x45, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x3, 0xef, + 0xff, 0xff, 0x40, 0x0, 0x2e, 0xff, 0xff, 0x30, + 0x0, 0x1, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "ï‹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x8e, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "ïŒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xf7, 0x0, 0x7f, 0xff, + 0xf7, + + /* U+F04D "ï" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, + + /* U+F051 "ï‘" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0x10, 0x0, + 0x3, 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xff, + 0xfe, 0x30, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x54, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, + 0xff, 0xf3, 0x4, 0xff, 0xff, 0xfe, 0x30, 0x4, + 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xcc, 0x10, + 0x0, 0x3, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "ï’" */ + 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + + /* U+F053 "ï“" */ + 0x0, 0x0, 0x0, 0x1a, 0x40, 0x0, 0x0, 0x1, + 0xdf, 0xf0, 0x0, 0x0, 0x1d, 0xff, 0xa0, 0x0, + 0x1, 0xdf, 0xfa, 0x0, 0x0, 0x1d, 0xff, 0xa0, + 0x0, 0x1, 0xdf, 0xfa, 0x0, 0x0, 0xc, 0xff, + 0xa0, 0x0, 0x0, 0xd, 0xff, 0x80, 0x0, 0x0, + 0x1, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0x80, 0x0, 0x0, 0x1, 0xdf, 0xf8, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0x80, 0x0, 0x0, 0x1, 0xdf, + 0xf0, 0x0, 0x0, 0x0, 0x1b, 0x50, + + /* U+F054 "ï”" */ + 0x4, 0xa1, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x10, + 0x0, 0x0, 0xa, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0xaf, 0xfd, 0x10, 0x0, 0x0, 0xa, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x10, 0x0, 0x0, + 0xa, 0xff, 0xc0, 0x0, 0x0, 0x8, 0xff, 0xd0, + 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, 0xff, + 0xd1, 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, + 0xff, 0xd1, 0x0, 0x0, 0xf, 0xfd, 0x10, 0x0, + 0x0, 0x5, 0xb1, 0x0, 0x0, 0x0, + + /* U+F067 "ï§" */ + 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x48, 0x88, 0x8c, 0xff, 0xc8, + 0x88, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x48, 0x88, 0x8c, 0xff, 0xc8, 0x88, 0x84, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, + 0x0, 0x0, + + /* U+F068 "ï¨" */ + 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb7, + + /* U+F06E "ï®" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, 0xfd, + 0x40, 0x0, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, + 0xef, 0xf7, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x9e, + 0x80, 0x4f, 0xff, 0x70, 0x4f, 0xff, 0xc0, 0x0, + 0xaf, 0xf8, 0xc, 0xff, 0xf4, 0xdf, 0xff, 0x80, + 0x9a, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0xdf, 0xff, + 0x80, 0xef, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0x4f, + 0xff, 0xc0, 0x8f, 0xff, 0xf8, 0xc, 0xff, 0xf4, + 0x7, 0xff, 0xf4, 0x8, 0xee, 0x80, 0x4f, 0xff, + 0x70, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, 0xef, + 0xf8, 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, + 0xda, 0x50, 0x0, 0x0, + + /* U+F070 "ï°" */ + 0x8c, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0x80, 0x49, + 0xdf, 0xfd, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xd8, 0x8c, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xf8, 0x0, 0x0, 0x4e, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x1c, 0xff, 0x69, 0xe8, + 0x4, 0xff, 0xf7, 0x0, 0x4, 0xe3, 0x0, 0x9f, + 0xfe, 0xff, 0x80, 0xcf, 0xff, 0x40, 0xd, 0xff, + 0x70, 0x5, 0xff, 0xff, 0xe0, 0x8f, 0xff, 0xd0, + 0xd, 0xff, 0xf7, 0x0, 0x2d, 0xff, 0xe0, 0x8f, + 0xff, 0xd0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0xaf, + 0xf8, 0xcf, 0xff, 0x30, 0x0, 0x7f, 0xff, 0x40, + 0x0, 0x6, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x8, + 0xff, 0xf4, 0x0, 0x0, 0x3e, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x4d, 0xff, 0xc8, 0x82, 0x1, 0xbf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfc, + 0x10, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc8, + + /* U+F071 "ï±" */ + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd8, 0x8d, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xa0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xb0, 0xb, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xc0, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xd0, 0xd, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xf9, 0x9f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xe2, 0x2e, 0xff, 0xff, 0xf8, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x90, 0x9, 0xff, 0xff, + 0xff, 0x10, 0xa, 0xff, 0xff, 0xff, 0xe3, 0x3e, + 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+F074 "ï´" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0x78, 0x8e, 0xff, 0x15, 0xff, 0xe8, 0xff, 0xe2, + 0x0, 0x2, 0xe5, 0x4f, 0xfe, 0x20, 0xfe, 0x20, + 0x0, 0x0, 0x13, 0xff, 0xf3, 0x0, 0x52, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x31, 0x0, 0x52, 0x0, + 0x0, 0x2, 0xef, 0xf4, 0x5e, 0x20, 0xfe, 0x20, + 0x78, 0x8e, 0xff, 0x51, 0xff, 0xe8, 0xff, 0xe2, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F077 "ï·" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1d, 0xff, 0x99, + 0xff, 0xd1, 0x0, 0x1, 0xdf, 0xf9, 0x0, 0x9f, + 0xfd, 0x10, 0x1d, 0xff, 0x90, 0x0, 0x9, 0xff, + 0xd1, 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x9f, 0xfb, + 0x5f, 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F078 "ï¸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0xbf, 0xf9, + 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x1d, 0xff, 0x90, + 0x0, 0x9, 0xff, 0xd1, 0x1, 0xdf, 0xf9, 0x0, + 0x9f, 0xfd, 0x10, 0x0, 0x1d, 0xff, 0x99, 0xff, + 0xd1, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "ï¹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x10, + 0xef, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x1d, 0xff, + 0xff, 0xd1, 0xaf, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x6b, 0x1f, 0xf1, 0xb6, 0x0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x6b, 0x1f, + 0xf1, 0xb6, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, + 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xfe, 0x1, 0xdf, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "ï»" */ + 0x8f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F093 "ï‚“" */ + 0x0, 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf0, 0xdf, 0xfd, 0xf, 0xff, 0xfd, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F095 "ï‚•" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xea, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x4f, 0xff, 0x90, 0x0, 0x2, 0x8f, + 0xf3, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0xa, 0xff, + 0xff, 0xe4, 0xbf, 0xff, 0xd1, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x8, 0xee, 0x80, 0x0, 0x0, 0x6, 0x61, 0x8, + 0xff, 0xff, 0x80, 0x0, 0x2d, 0xff, 0xd0, 0xef, + 0x33, 0xfe, 0x0, 0x2e, 0xff, 0xf3, 0xe, 0xf3, + 0x3f, 0xe0, 0x2e, 0xff, 0xf3, 0x0, 0x8f, 0xff, + 0xff, 0x6e, 0xff, 0xf3, 0x0, 0x0, 0x8e, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x8, 0xff, 0xff, 0xf6, 0xef, + 0xff, 0x30, 0x0, 0xef, 0x33, 0xfe, 0x2, 0xef, + 0xff, 0x30, 0xe, 0xf3, 0x3f, 0xe0, 0x2, 0xef, + 0xff, 0x30, 0x8f, 0xff, 0xf8, 0x0, 0x2, 0xdf, + 0xfd, 0x0, 0x8e, 0xe8, 0x0, 0x0, 0x0, 0x66, + 0x10, + + /* U+F0C5 "" */ + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xd, 0x20, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xf, 0xe2, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf, 0xfd, 0xdf, 0xf0, 0xff, + 0xff, 0xff, 0x20, 0x0, 0xff, 0xf0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xdf, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xe2, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfc, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x11, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x11, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, + + /* U+F0C9 "" */ + 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, + + /* U+F0E0 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xd2, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2d, + 0xff, 0x62, 0xcf, 0xff, 0xff, 0xfc, 0x26, 0xff, + 0xff, 0xfa, 0x18, 0xff, 0xff, 0x81, 0xaf, 0xff, + 0xff, 0xff, 0xe3, 0x4d, 0xd4, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x81, 0x18, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F0E7 "" */ + 0x0, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x20, + 0xd, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xd7, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x99, 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, + 0x99, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xd, 0xff, 0xff, + 0xd, 0x20, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, + 0xe2, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, 0xfd, + 0xff, 0xff, 0xf, 0xff, 0xff, 0x20, 0x0, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xf, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfd, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1, + 0xbf, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, + + /* U+F11C "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0xf, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, + 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, 0xf8, + 0x8, 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, 0x0, + 0xff, 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x17, + 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "ï…›" */ + 0xdf, 0xff, 0xff, 0xf0, 0xd2, 0x0, 0xff, 0xff, + 0xff, 0xf0, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xe2, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xc9, 0x40, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x4, 0xdf, + 0xff, 0xfc, 0xa8, 0x8a, 0xcf, 0xff, 0xfd, 0x40, + 0x6f, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xf6, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfc, 0x1a, 0x30, 0x0, 0x5a, + 0xdf, 0xfd, 0xa5, 0x0, 0x3, 0xa1, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0xa8, 0x8a, 0xef, 0xff, + 0x50, 0x0, 0x0, 0x1, 0xdf, 0x70, 0x0, 0x0, + 0x7, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x12, 0x0, + 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F241 "ï‰" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F242 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F243 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F244 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb9, 0x29, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x10, 0x2, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0x80, 0xa, + 0x90, 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, 0xdf, + 0xff, 0x77, 0xf7, 0x55, 0x55, 0x55, 0x55, 0x8f, + 0xd3, 0xf, 0xff, 0xfd, 0xcc, 0xdf, 0xdc, 0xcc, + 0xcc, 0xcd, 0xff, 0xb0, 0x8f, 0xfe, 0x10, 0x0, + 0xaa, 0x0, 0x0, 0x0, 0x4d, 0x40, 0x0, 0x46, + 0x10, 0x0, 0x1, 0xf2, 0x2, 0x33, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xb1, 0xcf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, + 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x18, 0xdf, 0xfd, 0x92, 0x0, 0x2, 0xef, + 0xfb, 0xef, 0xff, 0x30, 0xd, 0xff, 0xfa, 0x2e, + 0xff, 0xe0, 0x4f, 0xff, 0xfa, 0x3, 0xff, 0xf5, + 0x9f, 0xfa, 0xfa, 0x35, 0x4f, 0xfa, 0xcf, 0xc0, + 0x8a, 0x3d, 0xb, 0xfd, 0xef, 0xfb, 0x3, 0x12, + 0x8f, 0xfe, 0xff, 0xff, 0xb0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x8, 0xff, 0xff, 0xef, 0xfd, + 0x11, 0x10, 0x9f, 0xff, 0xdf, 0xd1, 0x59, 0x3b, + 0xb, 0xfd, 0xaf, 0xd7, 0xfa, 0x38, 0x1d, 0xfb, + 0x5f, 0xff, 0xfa, 0x1, 0xdf, 0xf7, 0xd, 0xff, + 0xfa, 0x1d, 0xff, 0xf1, 0x3, 0xef, 0xfc, 0xdf, + 0xff, 0x50, 0x0, 0x18, 0xdf, 0xfe, 0xa3, 0x0, + + /* U+F2ED "ï‹­" */ + 0x0, 0x0, 0x7f, 0xff, 0xf7, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, 0x9f, + 0xf0, 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, + 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, + 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, + 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, + 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, 0x88, + 0xf8, 0x8f, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, + 0x9f, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x1d, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, + 0x1d, 0xff, 0x70, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xfa, 0x1d, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xde, 0xdb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1d, 0xff, 0xff, + 0xfa, 0xef, 0xfe, 0xaf, 0xff, 0xff, 0x1, 0xdf, + 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, 0xff, 0xff, + 0x1d, 0xff, 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x2, 0xef, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x2, 0xef, 0xff, 0xff, 0x1d, 0xff, + 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, 0xff, 0xff, + 0x1, 0xdf, 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, + 0xff, 0xff, 0x0, 0x1d, 0xff, 0xff, 0xfa, 0xef, + 0xfe, 0xaf, 0xff, 0xff, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + + /* U+F7C2 "" */ + 0x0, 0x8, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xfe, 0x8, 0xf8, 0xf, 0xb, + 0x40, 0xff, 0x8f, 0xf8, 0xf, 0xb, 0x40, 0xff, + 0xff, 0xf8, 0xf, 0xb, 0x40, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xe4, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xe0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, + 0xef, 0x10, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf1, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x11, 0xcf, 0xff, 0x77, 0x77, 0x77, + 0x77, 0xbf, 0xf1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x17, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x7, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+FF08 "(" */ + 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, 0x73, 0x0, + 0x65, 0x0, 0x2b, 0x0, 0x8, 0x50, 0x0, 0xb3, + 0x0, 0xc, 0x20, 0x0, 0xa3, 0x0, 0x6, 0x70, + 0x0, 0xb, 0x0, 0x0, 0x29, 0x0, 0x0, 0x28, + 0x0, 0x0, 0x2, + + /* U+FF09 ")" */ + 0x0, 0x0, 0x2, 0x60, 0x0, 0x2, 0x80, 0x0, + 0x4, 0x80, 0x0, 0xb, 0x30, 0x0, 0x59, 0x0, + 0x2, 0xd0, 0x0, 0x1e, 0x0, 0x2, 0xb0, 0x0, + 0x68, 0x0, 0x1d, 0x10, 0xa, 0x30, 0x8, 0x30, + 0x2, 0x0, 0x0, + + /* U+FF0C "," */ + 0x4, 0x91, 0xb, 0xf6, 0x1, 0xc3, 0x2, 0x90, + 0x5, 0x0, + + /* U+FF11 "1" */ + 0x1, 0x74, 0x0, 0x26, 0xd5, 0x0, 0x0, 0xb5, + 0x0, 0x0, 0xb5, 0x0, 0x0, 0xb5, 0x0, 0x0, + 0xb5, 0x0, 0x0, 0xb5, 0x0, 0x0, 0xb5, 0x0, + 0x0, 0xb5, 0x0, 0x1, 0xc7, 0x0, 0x45, 0x55, + 0x50, + + /* U+FF12 "ï¼’" */ + 0x0, 0x4, 0x41, 0x0, 0x5, 0x92, 0x3c, 0x60, + 0xf, 0x40, 0x5, 0xf0, 0xc, 0x60, 0x5, 0xf0, + 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x3d, 0x10, + 0x0, 0x1, 0xc2, 0x0, 0x0, 0xa, 0x20, 0x0, + 0x0, 0x93, 0x0, 0x0, 0x8, 0x30, 0x0, 0x70, + 0x2f, 0xdd, 0xdd, 0x80, 0x0, 0x0, 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 128, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 128, .box_w = 2, .box_h = 12, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 12, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 27, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 75, .adv_w = 128, .box_w = 6, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 120, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 168, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 216, .adv_w = 128, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 226, .adv_w = 128, .box_w = 5, .box_h = 16, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 266, .adv_w = 128, .box_w = 5, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 306, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 342, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 378, .adv_w = 128, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 388, .adv_w = 128, .box_w = 8, .box_h = 1, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 392, .adv_w = 128, .box_w = 2, .box_h = 3, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 395, .adv_w = 128, .box_w = 8, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 459, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 507, .adv_w = 128, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 543, .adv_w = 128, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 585, .adv_w = 128, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 627, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 675, .adv_w = 128, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 717, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 765, .adv_w = 128, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 807, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 855, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 903, .adv_w = 128, .box_w = 2, .box_h = 8, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 911, .adv_w = 128, .box_w = 2, .box_h = 10, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 921, .adv_w = 128, .box_w = 6, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 960, .adv_w = 128, .box_w = 8, .box_h = 4, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 976, .adv_w = 128, .box_w = 6, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1015, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1063, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1111, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1159, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1207, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1255, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1303, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1351, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1399, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1447, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1495, .adv_w = 128, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1531, .adv_w = 128, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1587, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1635, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1683, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1731, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1779, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1827, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1875, .adv_w = 128, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1931, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1979, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2027, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2075, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2123, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2171, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2219, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2267, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2315, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2363, .adv_w = 128, .box_w = 4, .box_h = 15, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 2393, .adv_w = 128, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 2446, .adv_w = 128, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 2476, .adv_w = 128, .box_w = 6, .box_h = 2, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 2482, .adv_w = 128, .box_w = 8, .box_h = 1, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2486, .adv_w = 128, .box_w = 4, .box_h = 2, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 2490, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2522, .adv_w = 128, .box_w = 8, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2574, .adv_w = 128, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2602, .adv_w = 128, .box_w = 8, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2654, .adv_w = 128, .box_w = 7, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2682, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2730, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2770, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2818, .adv_w = 128, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2854, .adv_w = 128, .box_w = 6, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 2896, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2944, .adv_w = 128, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2980, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3012, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3044, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3076, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3116, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3156, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3188, .adv_w = 128, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3212, .adv_w = 128, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3245, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3277, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3309, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3341, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3373, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3413, .adv_w = 128, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3437, .adv_w = 128, .box_w = 4, .box_h = 16, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 3469, .adv_w = 128, .box_w = 2, .box_h = 18, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 3487, .adv_w = 128, .box_w = 4, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 3519, .adv_w = 128, .box_w = 8, .box_h = 4, .ofs_x = 0, .ofs_y = 11}, + {.bitmap_index = 3535, .adv_w = 128, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3535, .adv_w = 256, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 3548, .adv_w = 256, .box_w = 4, .box_h = 5, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 3558, .adv_w = 256, .box_w = 9, .box_h = 12, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 3612, .adv_w = 256, .box_w = 4, .box_h = 14, .ofs_x = 10, .ofs_y = -1}, + {.bitmap_index = 3640, .adv_w = 256, .box_w = 4, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 3668, .adv_w = 256, .box_w = 10, .box_h = 11, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 3723, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 3807, .adv_w = 256, .box_w = 10, .box_h = 7, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 3842, .adv_w = 256, .box_w = 12, .box_h = 9, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 3896, .adv_w = 256, .box_w = 9, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 3955, .adv_w = 256, .box_w = 8, .box_h = 11, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 3999, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4071, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4149, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4240, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4331, .adv_w = 256, .box_w = 10, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 4396, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4481, .adv_w = 256, .box_w = 7, .box_h = 14, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 4530, .adv_w = 256, .box_w = 11, .box_h = 14, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 4607, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4685, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4783, .adv_w = 256, .box_w = 10, .box_h = 11, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 4838, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4923, .adv_w = 256, .box_w = 9, .box_h = 13, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 4982, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 5066, .adv_w = 256, .box_w = 10, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 5131, .adv_w = 256, .box_w = 10, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 5196, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5287, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5400, .adv_w = 256, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5472, .adv_w = 256, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5570, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 5642, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5740, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 5818, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5909, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5975, .adv_w = 256, .box_w = 10, .box_h = 7, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6010, .adv_w = 256, .box_w = 13, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6075, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 6159, .adv_w = 256, .box_w = 12, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6225, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6303, .adv_w = 256, .box_w = 9, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 6362, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6434, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 6512, .adv_w = 256, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6573, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6651, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6742, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6820, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6898, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6996, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7081, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7159, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7257, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7355, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7427, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7505, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7583, .adv_w = 256, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 7635, .adv_w = 256, .box_w = 13, .box_h = 10, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 7700, .adv_w = 256, .box_w = 13, .box_h = 9, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 7759, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7831, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7915, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7999, .adv_w = 256, .box_w = 9, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 8058, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8143, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 8209, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 8287, .adv_w = 256, .box_w = 9, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 8346, .adv_w = 256, .box_w = 11, .box_h = 10, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 8401, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8492, .adv_w = 256, .box_w = 10, .box_h = 9, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 8537, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 8615, .adv_w = 256, .box_w = 8, .box_h = 9, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 8651, .adv_w = 256, .box_w = 9, .box_h = 12, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8705, .adv_w = 256, .box_w = 10, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 8770, .adv_w = 256, .box_w = 8, .box_h = 13, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 8822, .adv_w = 256, .box_w = 10, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 8887, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8978, .adv_w = 256, .box_w = 10, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 9043, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 9128, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 9200, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 9285, .adv_w = 256, .box_w = 9, .box_h = 11, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 9335, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 9413, .adv_w = 256, .box_w = 8, .box_h = 11, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 9457, .adv_w = 256, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 9522, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 9594, .adv_w = 256, .box_w = 10, .box_h = 7, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 9629, .adv_w = 256, .box_w = 12, .box_h = 9, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 9683, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 9768, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 9840, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 9931, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 10003, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 10081, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 10151, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 10235, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 10313, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 10398, .adv_w = 256, .box_w = 10, .box_h = 9, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 10443, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 10515, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 10599, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10704, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 10776, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10848, .adv_w = 256, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10909, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11000, .adv_w = 256, .box_w = 12, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11066, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11151, .adv_w = 256, .box_w = 10, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 11211, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 11283, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11381, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 11459, .adv_w = 256, .box_w = 9, .box_h = 9, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 11500, .adv_w = 256, .box_w = 10, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 11560, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 11626, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11724, .adv_w = 256, .box_w = 7, .box_h = 13, .ofs_x = 6, .ofs_y = -1}, + {.bitmap_index = 11770, .adv_w = 256, .box_w = 9, .box_h = 13, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 11829, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 11907, .adv_w = 256, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 11959, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 12037, .adv_w = 256, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12098, .adv_w = 256, .box_w = 13, .box_h = 7, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 12144, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 12214, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 12284, .adv_w = 256, .box_w = 9, .box_h = 11, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 12334, .adv_w = 256, .box_w = 10, .box_h = 11, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12389, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12455, .adv_w = 256, .box_w = 12, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12521, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12619, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12717, .adv_w = 256, .box_w = 14, .box_h = 11, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 12794, .adv_w = 256, .box_w = 14, .box_h = 11, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 12871, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12937, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 13021, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13087, .adv_w = 256, .box_w = 12, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13141, .adv_w = 256, .box_w = 8, .box_h = 12, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 13189, .adv_w = 256, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13250, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 13316, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13376, .adv_w = 256, .box_w = 11, .box_h = 10, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 13431, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 13516, .adv_w = 256, .box_w = 10, .box_h = 7, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 13551, .adv_w = 256, .box_w = 8, .box_h = 8, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 13583, .adv_w = 256, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13644, .adv_w = 256, .box_w = 10, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 13704, .adv_w = 256, .box_w = 7, .box_h = 13, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 13750, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13820, .adv_w = 256, .box_w = 10, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 13870, .adv_w = 256, .box_w = 10, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 13920, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 13986, .adv_w = 256, .box_w = 12, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14052, .adv_w = 256, .box_w = 10, .box_h = 9, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 14097, .adv_w = 256, .box_w = 15, .box_h = 3, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 14120, .adv_w = 256, .box_w = 16, .box_h = 2, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 14136, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14248, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 14353, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14473, .adv_w = 256, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14577, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14689, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 14794, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14907, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15035, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15147, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15267, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15387, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 15492, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 15596, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15701, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15821, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15933, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 16046, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 16151, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16271, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 16384, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16489, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 16587, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 16700, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16828, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16948, .adv_w = 256, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17036, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17148, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17260, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17372, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17500, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 17620, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 17740, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17860, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17980, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18108, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18228, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18356, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18476, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18604, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18724, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18852, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18980, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 19078, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19206, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19334, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19454, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19574, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19694, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19822, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19942, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20070, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20190, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20310, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20438, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20558, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20686, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20814, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20927, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21055, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21175, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21303, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21431, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21559, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21679, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21799, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21912, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22032, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22160, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22273, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22393, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22513, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22641, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22769, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22897, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23017, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23137, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23265, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23393, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23513, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23641, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23769, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23897, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24017, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24137, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24265, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24393, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24521, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24634, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24762, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24890, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25018, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25131, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25251, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25371, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 25476, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 25596, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25716, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25836, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 25956, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26084, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 26204, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26317, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26437, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 26541, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26669, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 26782, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26902, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 27015, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27135, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27255, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27383, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27503, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 27607, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 27705, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27825, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27938, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 28050, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 28163, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28291, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 28404, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28524, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28644, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 28742, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 28855, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28968, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29081, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29194, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29322, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29442, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29555, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29675, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 29788, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29908, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30036, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30164, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30277, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 30389, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 30509, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 30614, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30734, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30862, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30990, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31110, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31230, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31350, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31470, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31598, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31718, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31838, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31958, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 32086, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 32214, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 32334, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 32446, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 32559, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 32672, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 32785, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 32890, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33010, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33130, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33250, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33378, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 33498, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33618, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33738, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 33851, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33971, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 34076, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 34196, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 34309, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 34414, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 34527, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 34647, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 34783, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 34919, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35039, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35159, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35287, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35407, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35527, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35647, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 35719, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 35839, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35959, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 36064, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 36162, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 36267, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 36387, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 36491, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 36619, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 36739, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 36844, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 36942, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 37047, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 37175, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 37303, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 37401, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 37513, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 37617, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 37722, .adv_w = 256, .box_w = 15, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 37820, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 37933, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 38038, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 38143, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 38256, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 38376, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 38489, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 38617, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 38730, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 38850, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 38955, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 39059, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 39172, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 39292, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 39405, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 39510, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 39623, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 39751, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 39864, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 39992, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 40097, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 40217, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 40330, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 40443, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 40548, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 40668, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 40788, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 40886, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 40984, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 41089, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 41187, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 41307, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 41405, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 41525, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 41637, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 41749, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 41861, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41973, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 42101, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 42213, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 42326, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 42439, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 42551, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 42663, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 42791, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 42919, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 43047, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 43167, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 43295, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 43423, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 43551, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 43679, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 43799, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 43919, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 44047, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 44175, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 44280, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 44400, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 44513, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 44626, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 44746, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 44851, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 44964, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 45076, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 45204, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 45324, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 45452, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 45572, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 45700, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 45820, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 45940, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46060, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46188, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46308, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46436, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 46549, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46677, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46797, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46910, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 47038, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 47166, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 47302, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 47422, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 47550, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 47678, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 47798, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 47926, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48054, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48182, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48310, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48430, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48550, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48670, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48790, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48918, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49046, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49166, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 49279, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49399, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49519, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49647, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 49752, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 49872, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 49992, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50112, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50240, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50360, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 50480, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50593, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 50706, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 50826, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50946, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 51074, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 51194, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 51306, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 51434, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 51554, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 51674, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 51794, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 51914, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 52026, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 52146, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 52274, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 52394, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 52514, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 52634, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 52762, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 52882, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 53010, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 53130, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 53250, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 53378, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 53498, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 53603, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 53716, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 53820, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 53940, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54068, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54188, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54301, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54421, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54534, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54654, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54767, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54887, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 55007, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 55098, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 55218, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 55338, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 55436, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 55541, .adv_w = 256, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 55639, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 55744, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 55864, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 55962, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 56060, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 56180, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 56300, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 56428, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 56548, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 56668, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 56796, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 56916, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 57029, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57149, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 57261, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 57366, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57486, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57614, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57742, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57870, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57983, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58111, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58231, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58359, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58479, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58599, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58719, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58847, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58975, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 59103, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 59231, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 59351, .adv_w = 256, .box_w = 12, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 59441, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 59553, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 59666, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 59786, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 59914, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 60019, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60139, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60259, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60387, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60507, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60627, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60747, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60867, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60995, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61115, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61235, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61363, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61491, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61611, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61731, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61859, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 61964, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 62069, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 62182, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 62302, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 62430, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 62558, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 62670, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 62790, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 62910, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 63023, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 63136, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 63264, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 63369, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 63482, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 63587, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 63707, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 63835, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 63955, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 64068, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 64181, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 64293, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 64421, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 64526, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 64646, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 64759, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 64895, .adv_w = 256, .box_w = 15, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 65023, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 65135, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 65255, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 65383, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 65503, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 65623, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 65759, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 65879, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 65999, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 66119, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 66239, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 66367, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 66487, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 66607, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 66743, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 66871, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 66999, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 67119, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 67239, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 67359, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 67479, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 67592, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 67712, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 67840, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 67968, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 68088, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 68208, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 68321, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 68441, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 68569, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 68697, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 68825, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 68953, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69073, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69193, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69321, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69449, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69569, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69682, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69802, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69930, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70058, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70186, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70306, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70426, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70546, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70666, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70794, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70922, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71035, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 71148, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71276, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71404, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71524, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 71637, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71757, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71885, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72013, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72141, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72269, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72389, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72517, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 72630, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72750, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72870, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72990, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73110, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73238, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73358, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73478, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73598, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 73711, .adv_w = 256, .box_w = 10, .box_h = 15, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 73786, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73906, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 74018, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 74131, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 74229, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 74334, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 74462, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 74567, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 74672, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 74800, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 74920, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75033, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 75145, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 75250, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 75370, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75498, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75618, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 75730, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75850, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 75963, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76083, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 76188, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 76300, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 76412, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 76517, .adv_w = 256, .box_w = 12, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 76613, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76733, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 76853, .adv_w = 256, .box_w = 12, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 76949, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 77061, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77189, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77317, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77415, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77543, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77656, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77776, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 77889, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78009, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78129, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78249, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78362, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78475, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78603, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78731, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78859, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78987, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79115, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79235, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79363, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79491, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79619, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79739, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79859, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79987, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80100, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80228, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80356, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80476, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80604, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80732, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80860, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80988, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81108, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81236, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81364, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81492, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81620, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81748, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81876, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 82004, .adv_w = 256, .box_w = 15, .box_h = 17, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 82132, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 82260, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 82388, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 82508, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 82636, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 82764, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 82892, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 83020, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 83140, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 83268, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 83396, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 83524, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 83652, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 83780, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 83916, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 84036, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 84156, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 84284, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 84412, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 84540, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 84652, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 84764, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 84892, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 85012, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 85140, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 85268, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 85396, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 85524, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 85644, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 85764, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 85892, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 86020, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 86140, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 86260, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 86388, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 86516, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 86614, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 86726, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 86831, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 86944, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 87072, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 87200, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 87328, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 87448, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 87568, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 87696, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 87816, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 87929, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 88049, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 88169, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 88289, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 88409, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 88522, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 88642, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 88747, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 88875, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89003, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89131, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89244, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89357, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89485, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89605, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89718, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89838, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89958, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 90086, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 90206, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 90326, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 90454, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 90566, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 90686, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 90799, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 90911, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 91031, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 91144, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 91264, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 91384, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 91512, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 91632, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 91752, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 91880, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 91993, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92113, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92233, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92361, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 92481, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92609, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92737, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92865, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92993, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 93121, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 93249, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 93369, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 93481, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 93609, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 93721, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 93849, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 93969, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 94082, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 94202, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 94315, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 94435, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 94547, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 94659, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 94779, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 94899, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95027, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95155, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95283, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95403, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95523, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95651, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95771, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95899, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96019, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96139, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96259, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96379, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96499, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96627, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 96739, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96859, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96972, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97092, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 97212, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97332, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97452, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97565, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 97656, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 97754, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 97858, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 97956, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 98061, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 98174, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 98279, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 98399, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 98504, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 98632, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 98752, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 98865, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 98977, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 99105, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 99225, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 99353, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 99466, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 99586, .adv_w = 256, .box_w = 12, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 99676, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 99789, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 99893, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 99998, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 100094, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 100214, .adv_w = 256, .box_w = 11, .box_h = 15, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 100297, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 100417, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 100537, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 100665, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 100793, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 100906, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 101011, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101131, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 101244, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 101364, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101484, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101612, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101732, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101852, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101980, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102100, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102213, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102333, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102453, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102573, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102693, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102821, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102941, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103069, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103189, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103317, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103445, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103565, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103685, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103805, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103925, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 104045, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 104173, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 104293, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 104406, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 104519, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 104639, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 104759, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 104879, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 104999, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105127, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105240, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105368, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105496, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105624, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105744, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105872, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105992, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 106112, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106232, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106352, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106480, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106608, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106736, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106856, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 106968, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107081, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107194, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 107314, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107434, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107547, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107667, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107787, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 107899, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108019, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108147, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108267, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108387, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108507, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108627, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108755, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108875, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108995, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109115, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109243, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109371, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109499, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109619, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109747, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 109852, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109980, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 110108, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 110236, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 110356, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 110484, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 110604, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 110732, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 110852, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 110972, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 111108, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 111206, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 111326, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 111454, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 111574, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 111687, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 111807, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 111920, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 112048, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 112176, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 112296, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 112424, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 112528, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 112640, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 112760, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 112865, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 112985, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 113113, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 113226, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 113346, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 113466, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 113579, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 113699, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 113827, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 113955, .adv_w = 256, .box_w = 11, .box_h = 15, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 114038, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 114143, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 114271, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 114391, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 114504, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 114632, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 114760, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 114888, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115016, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 115120, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 115240, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115360, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115488, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115616, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115736, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115856, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115976, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 116089, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 116202, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 116322, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 116450, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 116578, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 116706, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 116826, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 116954, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 117082, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 117210, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 117338, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 117451, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 117571, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 117699, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 117827, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 117939, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118067, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118195, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118315, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118443, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118556, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118676, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118796, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118916, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 119036, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 119156, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 119276, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 119404, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 119524, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 119644, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 119764, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 119892, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 120004, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 120124, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 120244, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 120364, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 120492, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 120612, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 120732, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 120860, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 120973, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 121101, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 121221, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 121341, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 121454, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 121574, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 121694, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 121822, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 121942, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122062, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122190, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122310, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122430, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122558, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122686, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122814, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122942, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123062, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123182, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123310, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123430, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123558, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123686, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123806, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123926, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 124054, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 124174, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 124302, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 124430, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 124566, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 124694, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 124807, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 124927, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 125047, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 125159, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 125279, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 125392, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 125512, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 125632, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 125730, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 125850, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 125970, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 126082, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 126202, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 126322, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 126427, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 126555, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 126675, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 126803, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 126939, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 127075, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 127195, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 127315, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 127443, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 127563, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 127691, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 127811, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 127931, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 128059, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 128187, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 128315, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 128443, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 128571, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 128699, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 128827, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 128955, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 129068, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 129196, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 129324, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 129452, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 129572, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 129692, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 129804, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 129924, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 130044, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 130156, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 130284, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 130396, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 130516, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 130636, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 130756, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 130876, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 130996, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 131116, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 131236, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 131356, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 131468, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 131588, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 131708, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 131828, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 131948, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 132068, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 132188, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 132308, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 132428, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 132556, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 132684, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 132804, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 132932, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 133052, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 133180, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 133300, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 133428, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 133541, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 133661, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 133781, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 133894, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 134022, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 134142, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 134262, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 134390, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 134518, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 134638, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 134743, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 134863, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 134983, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 135111, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 135239, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 135359, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 135479, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 135591, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 135719, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 135839, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 135959, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 136079, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 136177, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 136275, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 136379, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 136477, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 136575, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 136680, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 136792, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 136905, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 137018, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 137130, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 137243, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 137348, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 137461, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 137581, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 137686, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 137799, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 137919, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 138039, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 138167, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 138287, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 138400, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 138528, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 138641, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 138769, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 138874, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 138987, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 139099, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 139204, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 139317, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 139437, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 139565, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 139693, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 139813, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 139933, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 140053, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 140181, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 140301, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 140413, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 140526, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 140646, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 140759, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 140879, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 140999, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 141112, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 141232, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 141352, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 141472, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 141592, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 141712, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 141832, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 141952, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 142072, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 142200, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 142320, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 142440, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 142560, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 142688, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 142808, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 142936, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 143056, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 143176, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 143304, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 143432, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 143552, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 143672, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 143800, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 143920, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 144040, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 144160, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 144280, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 144400, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 144505, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 144625, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 144753, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 144881, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 145001, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 145137, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 145233, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 145345, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 145441, .adv_w = 176, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 145507, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 145635, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 145763, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 145889, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 146017, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 146125, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 146253, .adv_w = 128, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 146309, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 146393, .adv_w = 288, .box_w = 18, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 146537, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 146633, .adv_w = 176, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 146721, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 146801, .adv_w = 224, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 146927, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 147032, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 147130, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 147210, .adv_w = 224, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 147322, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 147392, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 147462, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 147560, .adv_w = 224, .box_w = 14, .box_h = 4, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 147588, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 147696, .adv_w = 320, .box_w = 20, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 147856, .adv_w = 288, .box_w = 20, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 148016, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 148144, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 148214, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 148284, .adv_w = 320, .box_w = 20, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 148424, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 148520, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 148648, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 148793, .adv_w = 224, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 148898, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 149010, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 149108, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 149206, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 149302, .adv_w = 160, .box_w = 12, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 149398, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 149510, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 149622, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 149730, .adv_w = 256, .box_w = 18, .box_h = 18, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 149892, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 149988, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 150138, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 150238, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 150338, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 150438, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 150538, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 150638, .adv_w = 320, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 150785, .adv_w = 224, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 150881, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 150993, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 151138, .adv_w = 320, .box_w = 20, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 151258, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 151354, .adv_w = 258, .box_w = 17, .box_h = 11, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 151448, .adv_w = 256, .box_w = 5, .box_h = 14, .ofs_x = 9, .ofs_y = -1}, + {.bitmap_index = 151483, .adv_w = 256, .box_w = 5, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 151518, .adv_w = 256, .box_w = 4, .box_h = 5, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 151528, .adv_w = 256, .box_w = 6, .box_h = 11, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 151561, .adv_w = 256, .box_w = 8, .box_h = 12, .ofs_x = 4, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1, 0x4, 0xb, 0xc, 0x40, 0x41, 0x42, + 0x43, 0x45, 0x46, 0x47 +}; + +static const uint8_t glyph_id_ofs_list_4[] = { + 0, 0, 0, 1, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 4, 5, 6, 0, 7, + 8, 9, 0, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 0, + 30, 31, 32, 0, 33, 34, 0, 35, + 36, 37, 38, 39, 40, 0, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, + 51, 0, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 0, + 65, 66, 67, 68, 69, 70, 71 +}; + +static const uint16_t unicode_list_5[] = { + 0x0, 0x4, 0x7, 0xd, 0x1d11, 0x1d14, 0x1d18, 0x1d19, + 0x1d1a, 0x1d1b, 0x1d1c, 0x1d1e, 0x1d24, 0x1d25, 0x1d27, 0x1d32, + 0x1d37, 0x1d3e, 0x1d4c, 0x1d56, 0x1d5c, 0x1d5f, 0x1d60, 0x1d68, + 0x1d6e, 0x1d70, 0x1d97, 0x1d99, 0x1d9a, 0x1d9c, 0x1d9d, 0x1da5, + 0x1dac, 0x1db2, 0x1db5, 0x1db7, 0x1dbd, 0x1dcb, 0x1dd1, 0x1ddb, + 0x1ddc, 0x1dde, 0x1de6, 0x1de7, 0x1de9, 0x1df4, 0x1df5, 0x1df6, + 0x1dff, 0x1e07, 0x1e0c, 0x1e0e, 0x1e12, 0x1e1b, 0x1e22, 0x1e2b, + 0x1e2e, 0x1e49, 0x1e4d, 0x1e57, 0x1e5e, 0x1e5f, 0x1e60, 0x1e64, + 0x1e66, 0x1e6a, 0x1e6d, 0x1e71, 0x1e90, 0x1e97, 0x1e9c, 0x1eac, + 0x1eae, 0x1eb2, 0x1ed0, 0x1ed3, 0x1eee, 0x1ef2, 0x1eff, 0x1f1c, + 0x1f22, 0x1f2a, 0x1f30, 0x1f35, 0x1f4d, 0x1f6b, 0x1f6d, 0x1f76, + 0x1f85, 0x1faa, 0x1fc4, 0x1fd6, 0x1fde, 0x1fe0, 0x1fe6, 0x200a, + 0x2015, 0x203b, 0x2054, 0x2055, 0x2056, 0x2059, 0x205a, 0x205c, + 0x205e, 0x2063, 0x206b, 0x2076, 0x2078, 0x2079, 0x207a, 0x207c, + 0x207d, 0x207e, 0x2082, 0x2087, 0x2088, 0x2096, 0x2097, 0x209b, + 0x209e, 0x20aa, 0x20bd, 0x20c8, 0x20de, 0x20ee, 0x20f7, 0x210b, + 0x2117, 0x2118, 0x211b, 0x2128, 0x212e, 0x2135, 0x2136, 0x213a, + 0x2141, 0x2147, 0x2149, 0x214c, 0x2158, 0x215b, 0x215e, 0x216c, + 0x2183, 0x2186, 0x2194, 0x21ac, 0x21b0, 0x21b1, 0x21ba, 0x21bb, + 0x21da, 0x21e6, 0x21ea, 0x21ee, 0x21f5, 0x2206, 0x2216, 0x2227, + 0x2228, 0x224c, 0x2251, 0x2252, 0x2254, 0x2259, 0x225b, 0x2263, + 0x2265, 0x2268, 0x2269, 0x2282, 0x2284, 0x228c, 0x22ab, 0x22b0, + 0x22c4, 0x22cc, 0x22d3, 0x22d4, 0x22d9, 0x22db, 0x22dc, 0x22de, + 0x22e7, 0x22e8, 0x22f4, 0x22f5, 0x22f6, 0x22f7, 0x22fb, 0x22fc, + 0x2300, 0x2301, 0x2303, 0x2304, 0x2308, 0x2309, 0x2314, 0x2315, + 0x2319, 0x231d, 0x231e, 0x2322, 0x2337, 0x2338, 0x2351, 0x235b, + 0x2373, 0x2379, 0x2384, 0x238d, 0x238e, 0x239d, 0x23c3, 0x23d2, + 0x23f2, 0x23fb, 0x2457, 0x245b, 0x2460, 0x2477, 0x2495, 0x249a, + 0x24ad, 0x24ae, 0x24bf, 0x24c7, 0x24df, 0x2500, 0x252c, 0x25c5, + 0x25ec, 0x25ef, 0x25f1, 0x2601, 0x2604, 0x260e, 0x261c, 0x261e, + 0x2623, 0x2629, 0x2630, 0x2639, 0x2641, 0x2658, 0x265b, 0x2661, + 0x269c, 0x26f0, 0x2708, 0x270b, 0x2742, 0x2745, 0x275b, 0x277a, + 0x2794, 0x27a8, 0x27af, 0x27db, 0x27e4, 0x27fc, 0x2801, 0x2803, + 0x281a, 0x2820, 0x2826, 0x2827, 0x282b, 0x282d, 0x2831, 0x2838, + 0x283a, 0x283b, 0x283c, 0x283f, 0x2842, 0x2858, 0x2862, 0x2868, + 0x2884, 0x288a, 0x288e, 0x2893, 0x28c4, 0x28ca, 0x28cc, 0x28da, + 0x28dc, 0x28e1, 0x28e5, 0x2929, 0x296b, 0x2977, 0x29a3, 0x29ce, + 0x29dd, 0x2a1a, 0x2a61, 0x2a68, 0x2a69, 0x2a74, 0x2a77, 0x2a7a, + 0x2a7c, 0x2a89, 0x2a94, 0x2a96, 0x2a98, 0x2a99, 0x2a9a, 0x2a9d, + 0x2aa9, 0x2aaa, 0x2aab, 0x2aaf, 0x2ab0, 0x2ab3, 0x2ab5, 0x2ac4, + 0x2ac7, 0x2aca, 0x2ad0, 0x2ad5, 0x2ad7, 0x2add, 0x2ae3, 0x2aee, + 0x2af0, 0x2af7, 0x2afc, 0x2b0b, 0x2b0f, 0x2b15, 0x2b18, 0x2b19, + 0x2b1e, 0x2b1f, 0x2b20, 0x2b22, 0x2b2b, 0x2b35, 0x2b42, 0x2b4b, + 0x2b51, 0x2b56, 0x2b5b, 0x2b5c, 0x2b66, 0x2b76, 0x2b7d, 0x2b82, + 0x2c07, 0x2c5d, 0x2cee, 0x2cef, 0x2cf6, 0x2cf7, 0x2cff, 0x2d02, + 0x2d03, 0x2d13, 0x2d14, 0x2d1d, 0x2d3c, 0x2d3e, 0x2d40, 0x2d41, + 0x2d44, 0x2d47, 0x2d49, 0x2d56, 0x2d84, 0x2d85, 0x2d89, 0x2d8f, + 0x2d94, 0x2da6, 0x2da8, 0x2dad, 0x2db7, 0x2db8, 0x2dbc, 0x2dbe, + 0x2dc8, 0x2df1, 0x2e0b, 0x2e20, 0x2e26, 0x2e30, 0x2e42, 0x2e46, + 0x2e48, 0x2e64, 0x2e73, 0x2e82, 0x2e8a, 0x2e8d, 0x2e91, 0x2e96, + 0x2e99, 0x2e9c, 0x2e9d, 0x2ea3, 0x2ea4, 0x2ea8, 0x2eaf, 0x2eb2, + 0x2eba, 0x2ed4, 0x2ed6, 0x2ee9, 0x2eea, 0x2efc, 0x2f06, 0x2f1f, + 0x2f23, 0x2f26, 0x2f2e, 0x2f36, 0x2f38, 0x2f80, 0x2fb9, 0x2fbb, + 0x2fc3, 0x2fd6, 0x3004, 0x3019, 0x3020, 0x302c, 0x3030, 0x305c, + 0x3074, 0x3078, 0x307f, 0x30da, 0x3109, 0x3121, 0x3122, 0x3127, + 0x3137, 0x3141, 0x314c, 0x3150, 0x3151, 0x315c, 0x315e, 0x3164, + 0x3166, 0x318f, 0x3191, 0x319b, 0x31a6, 0x31cd, 0x31d6, 0x31da, + 0x31ec, 0x31f2, 0x31fd, 0x31fe, 0x3210, 0x3212, 0x3218, 0x322a, + 0x3266, 0x3279, 0x3299, 0x32a3, 0x32ac, 0x32b2, 0x32b3, 0x32b6, + 0x32b8, 0x32b9, 0x32e0, 0x32e1, 0x32ec, 0x32ff, 0x330b, 0x334b, + 0x33d2, 0x33d8, 0x33e5, 0x33eb, 0x3440, 0x344a, 0x344f, 0x3450, + 0x3456, 0x3459, 0x3468, 0x346a, 0x3473, 0x3481, 0x3485, 0x3498, + 0x34aa, 0x34be, 0x34c1, 0x34c8, 0x34ca, 0x34cd, 0x34ce, 0x34d2, + 0x34d6, 0x34e0, 0x34f3, 0x34f6, 0x34fa, 0x3507, 0x3518, 0x351f, + 0x3524, 0x3525, 0x3530, 0x3531, 0x3536, 0x3539, 0x3540, 0x354d, + 0x3553, 0x357a, 0x357f, 0x3580, 0x3585, 0x358b, 0x3598, 0x35a2, + 0x35a7, 0x35a8, 0x35d8, 0x35ed, 0x3603, 0x3605, 0x3609, 0x360f, + 0x3610, 0x3611, 0x3614, 0x3619, 0x361a, 0x361c, 0x361e, 0x362c, + 0x362e, 0x3630, 0x3639, 0x363b, 0x363c, 0x363d, 0x363e, 0x364b, + 0x3661, 0x3662, 0x3670, 0x3672, 0x3676, 0x3680, 0x3682, 0x36a1, + 0x36a8, 0x36ad, 0x36e1, 0x36f6, 0x3702, 0x370c, 0x3710, 0x3732, + 0x373b, 0x374a, 0x374d, 0x3754, 0x3759, 0x37ae, 0x37c1, 0x37ff, + 0x382d, 0x386b, 0x387e, 0x3886, 0x388e, 0x3893, 0x38dc, 0x38e9, + 0x3913, 0x392a, 0x3932, 0x3934, 0x393b, 0x394a, 0x395c, 0x3970, + 0x3a32, 0x3a43, 0x3a5d, 0x3a61, 0x3a72, 0x3a73, 0x3a74, 0x3a75, + 0x3a76, 0x3a7a, 0x3a80, 0x3a83, 0x3a84, 0x3a88, 0x3a8c, 0x3a9b, + 0x3a9c, 0x3ac6, 0x3ade, 0x3adf, 0x3ae0, 0x3ae5, 0x3aec, 0x3b20, + 0x3b22, 0x3b25, 0x3b28, 0x3b45, 0x3b48, 0x3b49, 0x3b53, 0x3b6b, + 0x3b71, 0x3b8b, 0x3b99, 0x3ba3, 0x3bca, 0x3bcc, 0x3bd2, 0x3bdb, + 0x3be6, 0x3bf3, 0x3bf4, 0x3bf9, 0x3c04, 0x3c1c, 0x3c28, 0x3c43, + 0x3c4c, 0x3c4f, 0x3c52, 0x3c56, 0x3c85, 0x3c88, 0x3c99, 0x3ccd, + 0x3d02, 0x3d08, 0x3d16, 0x3d18, 0x3d19, 0x3d1a, 0x3d2c, 0x3d32, + 0x3d3a, 0x3d40, 0x3d67, 0x3da1, 0x3da7, 0x3dae, 0x3e10, 0x3e33, + 0x3e49, 0x3ed4, 0x3ef0, 0x3f74, 0x3f7c, 0x3f8e, 0x3fca, 0x3fcb, + 0x4032, 0x4047, 0x406a, 0x40c2, 0x40f0, 0x413e, 0x4147, 0x4149, + 0x4158, 0x416c, 0x4171, 0x417a, 0x418a, 0x41bd, 0x41c0, 0x41c7, + 0x41d1, 0x41fd, 0x41fe, 0x423c, 0x4250, 0x4283, 0x42ba, 0x430f, + 0x4314, 0x4317, 0x43c1, 0x4429, 0x442b, 0x4430, 0x4433, 0x4434, + 0x4439, 0x4441, 0x4442, 0x4444, 0x4446, 0x4448, 0x444b, 0x444c, + 0x445d, 0x446a, 0x447b, 0x447c, 0x4481, 0x4487, 0x44c3, 0x44d6, + 0x44ec, 0x458b, 0x458d, 0x458e, 0x458f, 0x4595, 0x4597, 0x45d0, + 0x45e8, 0x45ff, 0x4605, 0x4609, 0x461c, 0x4630, 0x4631, 0x464f, + 0x4651, 0x46f6, 0x46fe, 0x4704, 0x4713, 0x4725, 0x4745, 0x47cb, + 0x484b, 0x484d, 0x484f, 0x4867, 0x486e, 0x486f, 0x487e, 0x4892, + 0x48d1, 0x48d2, 0x48dc, 0x48de, 0x48e2, 0x48e9, 0x490c, 0x491c, + 0x493f, 0x495e, 0x4987, 0x498b, 0x49a4, 0x49dc, 0x49ea, 0x49f6, + 0x4a22, 0x4a37, 0x4a3d, 0x4a57, 0x4a5a, 0x4a65, 0x4a67, 0x4aa8, + 0x4ab2, 0x4ad1, 0x4ad5, 0x4b32, 0x4b84, 0x4bcf, 0x4be7, 0x4c0c, + 0x4c11, 0x4c15, 0x4c2a, 0x4c31, 0x4c41, 0x4c4a, 0x4c53, 0x4c55, + 0x4c5d, 0x4c61, 0x4c72, 0x4c77, 0x4c82, 0x4c86, 0x4ca4, 0x4cab, + 0x4cbe, 0x4cc3, 0x4ce2, 0x4ce3, 0x4ceb, 0x4cf1, 0x4cfa, 0x4d05, + 0x4d4e, 0x4d4f, 0x4d65, 0x4d81, 0x4d8d, 0x4d9d, 0x4df0, 0x4e4b, + 0x4e7f, 0x4e9f, 0x4eba, 0x4ee3, 0x4f12, 0x4f14, 0x4f16, 0x4f1d, + 0x4f44, 0x4f6f, 0x4f80, 0x4f83, 0x4f88, 0x4f8e, 0x4f9a, 0x4fba, + 0x4fc0, 0x4fc3, 0x4fdd, 0x5009, 0x500e, 0x5042, 0x5066, 0x5077, + 0x5081, 0x50ae, 0x50da, 0x50fb, 0x5104, 0x510b, 0x5118, 0x5119, + 0x511a, 0x513b, 0x513d, 0x514a, 0x5180, 0x5183, 0x51c2, 0x51f6, + 0x51f7, 0x5202, 0x5247, 0x5288, 0x52e4, 0x52ed, 0x534e, 0x535a, + 0x5368, 0x5446, 0x5495, 0x54bd, 0x54ee, 0x5518, 0x5566, 0x575d, + 0x5764, 0x5779, 0x57bc, 0x57e0, 0x57ed, 0x57f2, 0x580e, 0x5818, + 0x5890, 0x5892, 0x589c, 0x58a0, 0x58a7, 0x58ab, 0x58bb, 0x58cb, + 0x58d1, 0x58e3, 0x58f4, 0x58f7, 0x5911, 0x5919, 0x591b, 0x591f, + 0x5924, 0x5929, 0x593b, 0x593e, 0x5942, 0x5944, 0x5945, 0x5966, + 0x5977, 0x5982, 0x5983, 0x5984, 0x599d, 0x599e, 0x59a6, 0x59a9, + 0x59af, 0x59bb, 0x59bd, 0x59be, 0x59c1, 0x59c3, 0x59d0, 0x59d8, + 0x59dc, 0x59e7, 0x5a09, 0x5a13, 0x5a2c, 0x5a2e, 0x5a69, 0x5a81, + 0x5a88, 0x5a9b, 0x5aa4, 0x5ab2, 0x5b61, 0x5b72, 0x5bb1, 0x5bb2, + 0x5bb8, 0x5bba, 0x5bbd, 0x5bc8, 0x5bc9, 0x5bcc, 0x5bd0, 0x5bd4, + 0x5bd8, 0x5bfb, 0x5c0e, 0x5c75, 0x5c81, 0x5c88, 0x5c96, 0x5c9b, + 0x5cb4, 0x5cc4, 0x5cf0, 0x5d00, 0x5dbc, 0x5ddb, 0x5df0, 0x5df3, + 0x5e0e, 0x5e14, 0x5e1a, 0x5e26, 0x5e3b, 0x5e49, 0x5eac, 0x5eaf, + 0x5eb7, 0x5ec3, 0x5ecb, 0x5ecd, 0x5edf, 0x5ee2, 0x5ee5, 0x5efc, + 0x5f0e, 0x5f11, 0x5f12, 0x5f14, 0x5f20, 0x5f21, 0x5f2a, 0x5f2b, + 0x5f30, 0x5f31, 0x5f34, 0x5f3f, 0x5f42, 0x5f43, 0x5f56, 0x5f5b, + 0x5f5c, 0x5f5f, 0x5f64, 0x5f65, 0x5f66, 0x5f71, 0x5f7a, 0x5f89, + 0x5f90, 0x5f95, 0x5f9b, 0x5fb4, 0x5fbb, 0x5ff9, 0x6006, 0x600e, + 0x605e, 0x6063, 0x6065, 0x6089, 0x60bc, 0x60de, 0x60df, 0x60e0, + 0x60e2, 0x60ee, 0x6155, 0x616c, 0x6191, 0x6233, 0x6240, 0x6243, + 0x6488, 0x649a, 0x649c, 0x64a4, 0x64b3, 0x64ed, 0x6555, 0x655e, + 0x6561, 0x6573, 0x6575, 0x6589, 0x658e, 0x659f, 0x65ac, 0x65ad, + 0x65b4, 0x65b9, 0x65cc, 0x65d7, 0x65e2, 0x65e7, 0x65ea, 0x65f3, + 0x65f4, 0x65f9, 0x65fb, 0x6603, 0x660c, 0x6611, 0x6618, 0x6663, + 0x666a, 0x666f, 0x6673, 0x667a, 0x6685, 0x6704, 0x6710, 0x6714, + 0x6716, 0x6719, 0x6728, 0x6729, 0x673e, 0x674d, 0x675d, 0x6765, + 0x6769, 0x676f, 0x6780, 0x67b9, 0x67ec, 0x67f0, 0x6800, 0x6803, + 0x6839, 0x68a7, 0x68aa, 0x68d5, 0x68d6, 0x6923, 0x6924, 0x6968, + 0x69e5, 0x69e9, 0x69fb, 0x6a6b, 0x6bf6, 0x6da8, 0x6dcd, 0x6dd5, + 0x6de3, 0x6def, 0x6df9, 0x6e24, 0x6e4c, 0xbf12, 0xbf19, 0xbf1c, + 0xbf1d, 0xbf1e, 0xbf22, 0xbf24, 0xbf26, 0xbf2a, 0xbf2d, 0xbf32, + 0xbf37, 0xbf38, 0xbf39, 0xbf4f, 0xbf54, 0xbf59, 0xbf5c, 0xbf5d, + 0xbf5e, 0xbf62, 0xbf63, 0xbf64, 0xbf65, 0xbf78, 0xbf79, 0xbf7f, + 0xbf81, 0xbf82, 0xbf85, 0xbf88, 0xbf89, 0xbf8a, 0xbf8c, 0xbfa4, + 0xbfa6, 0xbfd5, 0xbfd6, 0xbfd8, 0xbfda, 0xbff1, 0xbff8, 0xbffb, + 0xc004, 0xc02d, 0xc035, 0xc06c, 0xc0fc, 0xc151, 0xc152, 0xc153, + 0xc154, 0xc155, 0xc198, 0xc1a4, 0xc1fe, 0xc215, 0xc46b, 0xc6d3, + 0xc7b3, 0xce19, 0xce1a, 0xce1d, 0xce22, 0xce23 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 96, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 12289, .range_length = 72, .glyph_id_start = 97, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 12, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + }, + { + .range_start = 12362, .range_length = 24, .glyph_id_start = 109, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 12387, .range_length = 43, .glyph_id_start = 133, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 12431, .range_length = 95, .glyph_id_start = 176, + .unicode_list = NULL, .glyph_id_ofs_list = glyph_id_ofs_list_4, .list_length = 95, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL + }, + { + .range_start = 12527, .range_length = 52772, .glyph_id_start = 248, + .unicode_list = unicode_list_5, .glyph_id_ofs_list = NULL, .list_length = 1166, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + + + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = NULL, + .kern_scale = 0, + .cmap_num = 6, + .bpp = 4, + .kern_classes = 0, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_simsun_16_cjk = { +#else +lv_font_t lv_font_simsun_16_cjk = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 19, /*The maximum line height required by the font*/ + .base_line = 3, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_SIMSUN_16_CJK*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_unscii_16.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_unscii_16.c new file mode 100644 index 0000000..d6b0eaa --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_unscii_16.c @@ -0,0 +1,652 @@ +/******************************************************************************* + * Size: 16 px + * Bpp: 1 + * Opts: --no-compress --no-prefilter --bpp 1 --size 16 --font unscii-8.ttf -r 0x20-0x7F --format lvgl -o lv_font_unscii_16.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_UNSCII_16 + #define LV_FONT_UNSCII_16 1 +#endif + +#if LV_FONT_UNSCII_16 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + 0x0, + + /* U+0021 "!" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + + /* U+0022 "\"" */ + 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, + + /* U+0023 "#" */ + 0x3c, 0xf0, 0xf3, 0xc3, 0xcf, 0xf, 0x3c, 0xff, + 0xff, 0xff, 0xf3, 0xcf, 0xf, 0x3c, 0xff, 0xff, + 0xff, 0xf3, 0xcf, 0xf, 0x3c, 0x3c, 0xf0, 0xf3, + 0xc0, + + /* U+0024 "$" */ + 0xf, 0x0, 0xf0, 0x3f, 0xf3, 0xff, 0xf0, 0xf, + 0x0, 0x3f, 0xc3, 0xfc, 0x0, 0xf0, 0xf, 0xff, + 0xcf, 0xfc, 0xf, 0x0, 0xf0, + + /* U+0025 "%" */ + 0xf0, 0x3f, 0xc0, 0xff, 0xf, 0x3c, 0x3c, 0x3, + 0xc0, 0xf, 0x0, 0xf0, 0x3, 0xc0, 0x3c, 0x3c, + 0xf0, 0xff, 0x3, 0xfc, 0xf, + + /* U+0026 "&" */ + 0xf, 0xc0, 0x3f, 0x3, 0xcf, 0xf, 0x3c, 0xf, + 0xc0, 0x3f, 0x3, 0xf3, 0xcf, 0xcf, 0xf3, 0xf3, + 0xcf, 0xcf, 0xf, 0x3c, 0x3c, 0x3f, 0x3c, 0xfc, + 0xf0, + + /* U+0027 "'" */ + 0x3c, 0xf3, 0xcf, 0xf3, 0xc0, + + /* U+0028 "(" */ + 0xf, 0xf, 0x3c, 0x3c, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0x3c, 0x3c, 0xf, 0xf, + + /* U+0029 ")" */ + 0xf0, 0xf0, 0x3c, 0x3c, 0xf, 0xf, 0xf, 0xf, + 0xf, 0xf, 0x3c, 0x3c, 0xf0, 0xf0, + + /* U+002A "*" */ + 0x3c, 0x3c, 0x3c, 0x3c, 0xf, 0xf0, 0xf, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xf, 0xf0, 0xf, 0xf0, + 0x3c, 0x3c, 0x3c, 0x3c, + + /* U+002B "+" */ + 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xff, 0xff, + 0xff, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, + + /* U+002C "," */ + 0x3c, 0xf3, 0xcf, 0xf3, 0xc0, + + /* U+002D "-" */ + 0xff, 0xff, 0xff, + + /* U+002E "." */ + 0xff, 0xff, + + /* U+002F "/" */ + 0x0, 0xf, 0x0, 0xf, 0x0, 0x3c, 0x0, 0x3c, + 0x0, 0xf0, 0x0, 0xf0, 0x3, 0xc0, 0x3, 0xc0, + 0xf, 0x0, 0xf, 0x0, 0x3c, 0x0, 0x3c, 0x0, + 0xf0, 0x0, 0xf0, 0x0, + + /* U+0030 "0" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf3, 0xff, + 0x3f, 0xfc, 0xff, 0xcf, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0031 "1" */ + 0xf, 0x0, 0xf0, 0x3f, 0x3, 0xf0, 0xf, 0x0, + 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0xff, 0xff, 0xff, + + /* U+0032 "2" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0x3, 0xc0, + 0x3c, 0xf, 0x0, 0xf0, 0x3c, 0x3, 0xc0, 0xf0, + 0xf, 0x0, 0xff, 0xff, 0xff, + + /* U+0033 "3" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0x0, 0xf0, + 0xf, 0xf, 0xc0, 0xfc, 0x0, 0xf0, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0034 "4" */ + 0x3, 0xf0, 0xf, 0xc0, 0xff, 0x3, 0xfc, 0x3c, + 0xf0, 0xf3, 0xcf, 0xf, 0x3c, 0x3c, 0xff, 0xff, + 0xff, 0xf0, 0xf, 0x0, 0x3c, 0x0, 0xf0, 0x3, + 0xc0, + + /* U+0035 "5" */ + 0xff, 0xff, 0xff, 0xf0, 0xf, 0x0, 0xff, 0xcf, + 0xfc, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0036 "6" */ + 0xf, 0xc0, 0xfc, 0x3c, 0x3, 0xc0, 0xf0, 0xf, + 0x0, 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0037 "7" */ + 0xff, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x3, 0xc0, 0x3c, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0xf, 0x0, 0xf0, + + /* U+0038 "8" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0039 "9" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0x3f, 0xf3, 0xff, 0x0, 0xf0, 0xf, 0x3, + 0xc0, 0x3c, 0x3f, 0x3, 0xf0, + + /* U+003A ":" */ + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + + /* U+003B ";" */ + 0x3c, 0xf3, 0xcf, 0x0, 0x0, 0x0, 0x3c, 0xf3, + 0xcf, 0xf3, 0xc0, + + /* U+003C "<" */ + 0x3, 0xc0, 0xf0, 0xf0, 0x3c, 0x3c, 0xf, 0xf, + 0x3, 0xc0, 0x3c, 0xf, 0x0, 0xf0, 0x3c, 0x3, + 0xc0, 0xf0, + + /* U+003D "=" */ + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, + + /* U+003E ">" */ + 0xf0, 0x3c, 0x3, 0xc0, 0xf0, 0xf, 0x3, 0xc0, + 0x3c, 0xf, 0xf, 0x3, 0xc3, 0xc0, 0xf0, 0xf0, + 0x3c, 0x0, + + /* U+003F "?" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0x0, 0xf0, + 0xf, 0x3, 0xc0, 0x3c, 0xf, 0x0, 0xf0, 0x0, + 0x0, 0x0, 0xf, 0x0, 0xf0, + + /* U+0040 "@" */ + 0x3f, 0xf0, 0xff, 0xcf, 0x3, 0xfc, 0xf, 0xf3, + 0xff, 0xcf, 0xff, 0x3f, 0xfc, 0xff, 0xf3, 0xff, + 0xcf, 0xff, 0x0, 0x3c, 0x0, 0x3f, 0xf0, 0xff, + 0xc0, + + /* U+0041 "A" */ + 0xf, 0x0, 0xf0, 0x3f, 0xc3, 0xfc, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xf, 0xf0, 0xff, 0xf, + + /* U+0042 "B" */ + 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0xff, 0xcf, 0xfc, + + /* U+0043 "C" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xf, + 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0044 "D" */ + 0xff, 0xf, 0xf0, 0xf3, 0xcf, 0x3c, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf3, + 0xcf, 0x3c, 0xff, 0xf, 0xf0, + + /* U+0045 "E" */ + 0xff, 0xff, 0xff, 0xf0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xff, 0xcf, 0xfc, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xff, 0xff, 0xff, + + /* U+0046 "F" */ + 0xff, 0xff, 0xff, 0xf0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xff, 0xcf, 0xfc, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xf0, 0xf, 0x0, + + /* U+0047 "G" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xf, + 0x0, 0xf3, 0xff, 0x3f, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xf3, 0xff, + + /* U+0048 "H" */ + 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0xf0, 0xff, 0xf, + + /* U+0049 "I" */ + 0xff, 0xff, 0xff, 0xf, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0xff, 0xff, 0xff, + + /* U+004A "J" */ + 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+004B "K" */ + 0xf0, 0x3f, 0xc0, 0xff, 0xf, 0x3c, 0x3c, 0xf3, + 0xc3, 0xcf, 0xf, 0xf0, 0x3f, 0xc0, 0xf3, 0xc3, + 0xcf, 0xf, 0xf, 0x3c, 0x3c, 0xf0, 0x3f, 0xc0, + 0xf0, + + /* U+004C "L" */ + 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xff, 0xff, 0xff, + + /* U+004D "M" */ + 0xf0, 0x3f, 0xc0, 0xff, 0xcf, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0x33, 0xfc, 0xcf, 0xf0, 0x3f, + 0xc0, 0xff, 0x3, 0xfc, 0xf, 0xf0, 0x3f, 0xc0, + 0xf0, + + /* U+004E "N" */ + 0xf0, 0x3f, 0xc0, 0xff, 0xc3, 0xff, 0xf, 0xff, + 0x3f, 0xfc, 0xff, 0x3f, 0xfc, 0xff, 0xf0, 0xff, + 0xc3, 0xff, 0x3, 0xfc, 0xf, 0xf0, 0x3f, 0xc0, + 0xf0, + + /* U+004F "O" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0050 "P" */ + 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xff, 0xcf, 0xfc, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xf0, 0xf, 0x0, + + /* U+0051 "Q" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf3, + 0xcf, 0x3c, 0x3c, 0xf3, 0xcf, + + /* U+0052 "R" */ + 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xff, 0xcf, 0xfc, 0xf3, 0xcf, 0x3c, 0xf0, + 0xff, 0xf, 0xf0, 0xff, 0xf, + + /* U+0053 "S" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xf, + 0x0, 0x3f, 0xc3, 0xfc, 0x0, 0xf0, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0054 "T" */ + 0xff, 0xff, 0xff, 0xf, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0xf, 0x0, 0xf0, + + /* U+0055 "U" */ + 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0056 "V" */ + 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0x3f, + 0xc3, 0xfc, 0xf, 0x0, 0xf0, + + /* U+0057 "W" */ + 0xf0, 0x3f, 0xc0, 0xff, 0x3, 0xfc, 0xf, 0xf0, + 0x3f, 0xc0, 0xff, 0x33, 0xfc, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0x3f, 0xf0, 0x3f, 0xc0, + 0xf0, + + /* U+0058 "X" */ + 0xf0, 0xf, 0xf0, 0xf, 0x3c, 0x3c, 0x3c, 0x3c, + 0xf, 0xf0, 0xf, 0xf0, 0x3, 0xc0, 0x3, 0xc0, + 0xf, 0xf0, 0xf, 0xf0, 0x3c, 0x3c, 0x3c, 0x3c, + 0xf0, 0xf, 0xf0, 0xf, + + /* U+0059 "Y" */ + 0xf0, 0xf, 0xf0, 0xf, 0x3c, 0x3c, 0x3c, 0x3c, + 0xf, 0xf0, 0xf, 0xf0, 0x3, 0xc0, 0x3, 0xc0, + 0x3, 0xc0, 0x3, 0xc0, 0x3, 0xc0, 0x3, 0xc0, + 0x3, 0xc0, 0x3, 0xc0, + + /* U+005A "Z" */ + 0xff, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x3, 0xc0, + 0x3c, 0xf, 0x0, 0xf0, 0x3c, 0x3, 0xc0, 0xf0, + 0xf, 0x0, 0xff, 0xff, 0xff, + + /* U+005B "[" */ + 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xff, 0xff, + + /* U+005C "\\" */ + 0xf0, 0x0, 0xf0, 0x0, 0x3c, 0x0, 0x3c, 0x0, + 0xf, 0x0, 0xf, 0x0, 0x3, 0xc0, 0x3, 0xc0, + 0x0, 0xf0, 0x0, 0xf0, 0x0, 0x3c, 0x0, 0x3c, + 0x0, 0xf, 0x0, 0xf, + + /* U+005D "]" */ + 0xff, 0xff, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, + 0xf, 0xf, 0xf, 0xf, 0xff, 0xff, + + /* U+005E "^" */ + 0x3, 0x0, 0xc, 0x0, 0xfc, 0x3, 0xf0, 0x3c, + 0xf0, 0xf3, 0xcf, 0x3, 0xfc, 0xf, + + /* U+005F "_" */ + 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0xf0, 0xf0, 0x3c, 0x3c, 0xf, 0xf, + + /* U+0061 "a" */ + 0x3f, 0xc3, 0xfc, 0x0, 0xf0, 0xf, 0x3f, 0xf3, + 0xff, 0xf0, 0xff, 0xf, 0x3f, 0xf3, 0xff, + + /* U+0062 "b" */ + 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xff, 0xcf, + 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0xff, 0xcf, 0xfc, + + /* U+0063 "c" */ + 0x3f, 0xcf, 0xff, 0x3, 0xc0, 0xf0, 0x3c, 0xf, + 0x3, 0xc0, 0x3f, 0xcf, 0xf0, + + /* U+0064 "d" */ + 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x3f, 0xf3, + 0xff, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xf3, 0xff, + + /* U+0065 "e" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xf0, 0xf, 0x0, 0x3f, 0xc3, 0xfc, + + /* U+0066 "f" */ + 0xf, 0xc3, 0xf3, 0xc0, 0xf0, 0xff, 0xff, 0xf3, + 0xc0, 0xf0, 0x3c, 0xf, 0x3, 0xc0, 0xf0, 0x3c, + 0xf, 0x0, + + /* U+0067 "g" */ + 0x3f, 0xf3, 0xff, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0x3f, 0xf3, 0xff, 0x0, 0xf0, 0xf, 0xff, + 0xcf, 0xfc, + + /* U+0068 "h" */ + 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xff, 0xcf, + 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0xf0, 0xff, 0xf, + + /* U+0069 "i" */ + 0x3c, 0xf, 0x0, 0x0, 0x0, 0xfc, 0x3f, 0x3, + 0xc0, 0xf0, 0x3c, 0xf, 0x3, 0xc0, 0xf0, 0x3f, + 0xcf, 0xf0, + + /* U+006A "j" */ + 0x3, 0xc0, 0xf0, 0x0, 0x0, 0x3, 0xc0, 0xf0, + 0x3c, 0xf, 0x3, 0xc0, 0xf0, 0x3c, 0xf, 0x3, + 0xc0, 0xff, 0xf3, 0xfc, + + /* U+006B "k" */ + 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xff, + 0xf, 0xf3, 0xcf, 0x3c, 0xff, 0xf, 0xf0, 0xf3, + 0xcf, 0x3c, 0xf0, 0xff, 0xf, + + /* U+006C "l" */ + 0xfc, 0x3f, 0x3, 0xc0, 0xf0, 0x3c, 0xf, 0x3, + 0xc0, 0xf0, 0x3c, 0xf, 0x3, 0xc0, 0xf0, 0x3f, + 0xcf, 0xf0, + + /* U+006D "m" */ + 0xf0, 0xf3, 0xc3, 0xcf, 0xff, 0xff, 0xff, 0xf3, + 0x3f, 0xcc, 0xff, 0x33, 0xfc, 0xcf, 0xf0, 0x3f, + 0xc0, 0xf0, + + /* U+006E "n" */ + 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, + + /* U+006F "o" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0070 "p" */ + 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xff, 0xcf, 0xfc, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, + + /* U+0071 "q" */ + 0x3f, 0xf3, 0xff, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0x3f, 0xf3, 0xff, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0xf, + + /* U+0072 "r" */ + 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xf, + 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, + + /* U+0073 "s" */ + 0x3f, 0xf3, 0xff, 0xf0, 0xf, 0x0, 0x3f, 0xc3, + 0xfc, 0x0, 0xf0, 0xf, 0xff, 0xcf, 0xfc, + + /* U+0074 "t" */ + 0x3c, 0x3, 0xc0, 0x3c, 0x3, 0xc0, 0xff, 0xff, + 0xff, 0x3c, 0x3, 0xc0, 0x3c, 0x3, 0xc0, 0x3c, + 0x3, 0xc0, 0xf, 0xf0, 0xff, + + /* U+0075 "u" */ + 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0x3f, 0xf3, 0xff, + + /* U+0076 "v" */ + 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0x3f, 0xc3, 0xfc, 0xf, 0x0, 0xf0, + + /* U+0077 "w" */ + 0xf0, 0x3f, 0xc0, 0xff, 0x3, 0xfc, 0xf, 0xf3, + 0x3f, 0xcc, 0xf3, 0xff, 0xf, 0xfc, 0x3c, 0xf0, + 0xf3, 0xc0, + + /* U+0078 "x" */ + 0xf0, 0x3f, 0xc0, 0xf3, 0xcf, 0xf, 0x3c, 0xf, + 0xc0, 0x3f, 0x3, 0xcf, 0xf, 0x3c, 0xf0, 0x3f, + 0xc0, 0xf0, + + /* U+0079 "y" */ + 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0x3f, 0xf3, 0xff, 0x0, 0xf0, 0xf, 0x3f, + 0xc3, 0xfc, + + /* U+007A "z" */ + 0xff, 0xff, 0xff, 0x3, 0xc0, 0x3c, 0xf, 0x0, + 0xf0, 0x3c, 0x3, 0xc0, 0xff, 0xff, 0xff, + + /* U+007B "{" */ + 0x3, 0xf0, 0x3f, 0xf, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0xfc, 0xf, 0xc0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0x3, 0xf0, 0x3f, + + /* U+007C "|" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+007D "}" */ + 0xfc, 0xf, 0xc0, 0xf, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0x3, 0xf0, 0x3f, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0xfc, 0xf, 0xc0, + + /* U+007E "~" */ + 0x3f, 0x3c, 0xfc, 0xff, 0x3f, 0x3c, 0xfc, + + /* U+007F "" */ + 0xf0, 0x3, 0xc0, 0xc, 0xc0, 0x33, 0x0, 0xcc, + 0xff, 0x33, 0xfc, 0xc3, 0x33, 0xc, 0xf0, 0x33, + 0xc0, 0xc0, 0x3, 0x0, 0xc, 0x0, 0x30, 0x0, + 0xc0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 256, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 16}, + {.bitmap_index = 1, .adv_w = 256, .box_w = 4, .box_h = 14, .ofs_x = 6, .ofs_y = 2}, + {.bitmap_index = 8, .adv_w = 256, .box_w = 12, .box_h = 6, .ofs_x = 2, .ofs_y = 10}, + {.bitmap_index = 17, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 42, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 63, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 84, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 109, .adv_w = 256, .box_w = 6, .box_h = 6, .ofs_x = 4, .ofs_y = 10}, + {.bitmap_index = 114, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, + {.bitmap_index = 128, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, + {.bitmap_index = 142, .adv_w = 256, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 162, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 177, .adv_w = 256, .box_w = 6, .box_h = 6, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 182, .adv_w = 256, .box_w = 12, .box_h = 2, .ofs_x = 2, .ofs_y = 8}, + {.bitmap_index = 185, .adv_w = 256, .box_w = 4, .box_h = 4, .ofs_x = 6, .ofs_y = 2}, + {.bitmap_index = 187, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 215, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 236, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 257, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 278, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 299, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 324, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 345, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 366, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 387, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 408, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 429, .adv_w = 256, .box_w = 4, .box_h = 12, .ofs_x = 6, .ofs_y = 2}, + {.bitmap_index = 435, .adv_w = 256, .box_w = 6, .box_h = 14, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 446, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 464, .adv_w = 256, .box_w = 12, .box_h = 6, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 473, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 491, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 512, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 537, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 558, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 579, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 600, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 621, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 642, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 663, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 684, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 705, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 726, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 747, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 772, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 793, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 818, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 843, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 864, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 885, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 906, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 927, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 948, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 969, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 990, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1011, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1036, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1064, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1092, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1113, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, + {.bitmap_index = 1127, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1155, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, + {.bitmap_index = 1169, .adv_w = 256, .box_w = 14, .box_h = 8, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 1183, .adv_w = 256, .box_w = 16, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1187, .adv_w = 256, .box_w = 8, .box_h = 6, .ofs_x = 6, .ofs_y = 10}, + {.bitmap_index = 1193, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1208, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1229, .adv_w = 256, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1242, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1263, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1278, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1296, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1314, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1335, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, + {.bitmap_index = 1353, .adv_w = 256, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1373, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1394, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, + {.bitmap_index = 1412, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1430, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1445, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1460, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1478, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1496, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1511, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1526, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1547, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1562, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1577, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1595, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1613, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1631, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1646, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1667, .adv_w = 256, .box_w = 4, .box_h = 14, .ofs_x = 6, .ofs_y = 2}, + {.bitmap_index = 1674, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1695, .adv_w = 256, .box_w = 14, .box_h = 4, .ofs_x = 0, .ofs_y = 12}, + {.bitmap_index = 1702, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + + + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 96, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + } +}; + + + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = NULL, + .kern_scale = 0, + .cmap_num = 1, + .bpp = 1, + .kern_classes = 0, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_unscii_16 = { +#else +lv_font_t lv_font_unscii_16 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 17, /*The maximum line height required by the font*/ + .base_line = 0, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = 0, + .underline_thickness = 0, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_UNSCII_16*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_unscii_8.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_unscii_8.c new file mode 100644 index 0000000..1b03c85 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_font_unscii_8.c @@ -0,0 +1,488 @@ +/******************************************************************************* + * Size: 8 px + * Bpp: 1 + * Opts: --no-compress --no-prefilter --bpp 1 --size 8 --font unscii-8.ttf -r 0x20-0x7F --format lvgl -o lv_font_unscii_8.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_UNSCII_8 + #define LV_FONT_UNSCII_8 1 +#endif + +#if LV_FONT_UNSCII_8 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + 0x0, + + /* U+0021 "!" */ + 0xff, 0xcc, + + /* U+0022 "\"" */ + 0xcf, 0x3c, 0xc0, + + /* U+0023 "#" */ + 0x6c, 0xdb, 0xfb, 0x6f, 0xed, 0x9b, 0x0, + + /* U+0024 "$" */ + 0x31, 0xfc, 0x1e, 0xf, 0xe3, 0x0, + + /* U+0025 "%" */ + 0xc7, 0x98, 0x61, 0x86, 0x78, 0xc0, + + /* U+0026 "&" */ + 0x38, 0xd8, 0xe3, 0xbd, 0xd9, 0x9d, 0x80, + + /* U+0027 "'" */ + 0x6f, 0x0, + + /* U+0028 "(" */ + 0x36, 0xcc, 0xc6, 0x30, + + /* U+0029 ")" */ + 0xc6, 0x33, 0x36, 0xc0, + + /* U+002A "*" */ + 0x66, 0x3c, 0xff, 0x3c, 0x66, + + /* U+002B "+" */ + 0x30, 0xcf, 0xcc, 0x30, + + /* U+002C "," */ + 0x6f, 0x0, + + /* U+002D "-" */ + 0xfc, + + /* U+002E "." */ + 0xf0, + + /* U+002F "/" */ + 0x3, 0x6, 0xc, 0x18, 0x30, 0x60, 0xc0, + + /* U+0030 "0" */ + 0x7b, 0x3d, 0xfb, 0xcf, 0x37, 0x80, + + /* U+0031 "1" */ + 0x31, 0xc3, 0xc, 0x30, 0xcf, 0xc0, + + /* U+0032 "2" */ + 0x7b, 0x31, 0x8c, 0x63, 0xf, 0xc0, + + /* U+0033 "3" */ + 0x7b, 0x30, 0xce, 0xf, 0x37, 0x80, + + /* U+0034 "4" */ + 0x1c, 0x79, 0xb6, 0x6f, 0xe1, 0x83, 0x0, + + /* U+0035 "5" */ + 0xff, 0xf, 0x83, 0xf, 0x37, 0x80, + + /* U+0036 "6" */ + 0x39, 0x8c, 0x3e, 0xcf, 0x37, 0x80, + + /* U+0037 "7" */ + 0xfc, 0x30, 0xc6, 0x30, 0xc3, 0x0, + + /* U+0038 "8" */ + 0x7b, 0x3c, 0xde, 0xcf, 0x37, 0x80, + + /* U+0039 "9" */ + 0x7b, 0x3c, 0xdf, 0xc, 0x67, 0x0, + + /* U+003A ":" */ + 0xf0, 0xf0, + + /* U+003B ";" */ + 0x6c, 0x6, 0xf0, + + /* U+003C "<" */ + 0x19, 0x99, 0x86, 0x18, 0x60, + + /* U+003D "=" */ + 0xfc, 0xf, 0xc0, + + /* U+003E ">" */ + 0xc3, 0xc, 0x33, 0x33, 0x0, + + /* U+003F "?" */ + 0x7b, 0x30, 0xc6, 0x30, 0x3, 0x0, + + /* U+0040 "@" */ + 0x7d, 0x8f, 0x7e, 0xfd, 0xf8, 0x1f, 0x0, + + /* U+0041 "A" */ + 0x31, 0xec, 0xf3, 0xff, 0x3c, 0xc0, + + /* U+0042 "B" */ + 0xfb, 0x3c, 0xfe, 0xcf, 0x3f, 0x80, + + /* U+0043 "C" */ + 0x7b, 0x3c, 0x30, 0xc3, 0x37, 0x80, + + /* U+0044 "D" */ + 0xf3, 0x6c, 0xf3, 0xcf, 0x6f, 0x0, + + /* U+0045 "E" */ + 0xff, 0xc, 0x3e, 0xc3, 0xf, 0xc0, + + /* U+0046 "F" */ + 0xff, 0xc, 0x3e, 0xc3, 0xc, 0x0, + + /* U+0047 "G" */ + 0x7b, 0x3c, 0x37, 0xcf, 0x37, 0xc0, + + /* U+0048 "H" */ + 0xcf, 0x3c, 0xff, 0xcf, 0x3c, 0xc0, + + /* U+0049 "I" */ + 0xfc, 0xc3, 0xc, 0x30, 0xcf, 0xc0, + + /* U+004A "J" */ + 0xc, 0x30, 0xc3, 0xf, 0x37, 0x80, + + /* U+004B "K" */ + 0xc7, 0x9b, 0x67, 0x8d, 0x99, 0xb1, 0x80, + + /* U+004C "L" */ + 0xc3, 0xc, 0x30, 0xc3, 0xf, 0xc0, + + /* U+004D "M" */ + 0xc7, 0xdf, 0xfe, 0xbc, 0x78, 0xf1, 0x80, + + /* U+004E "N" */ + 0xc7, 0xcf, 0xde, 0xfc, 0xf8, 0xf1, 0x80, + + /* U+004F "O" */ + 0x7b, 0x3c, 0xf3, 0xcf, 0x37, 0x80, + + /* U+0050 "P" */ + 0xfb, 0x3c, 0xfe, 0xc3, 0xc, 0x0, + + /* U+0051 "Q" */ + 0x7b, 0x3c, 0xf3, 0xcf, 0x66, 0xc0, + + /* U+0052 "R" */ + 0xfb, 0x3c, 0xfe, 0xdb, 0x3c, 0xc0, + + /* U+0053 "S" */ + 0x7b, 0x3c, 0x1e, 0xf, 0x37, 0x80, + + /* U+0054 "T" */ + 0xfc, 0xc3, 0xc, 0x30, 0xc3, 0x0, + + /* U+0055 "U" */ + 0xcf, 0x3c, 0xf3, 0xcf, 0x37, 0x80, + + /* U+0056 "V" */ + 0xcf, 0x3c, 0xf3, 0xcd, 0xe3, 0x0, + + /* U+0057 "W" */ + 0xc7, 0x8f, 0x1e, 0xbf, 0xfd, 0xf1, 0x80, + + /* U+0058 "X" */ + 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3, + + /* U+0059 "Y" */ + 0xc3, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, + + /* U+005A "Z" */ + 0xfc, 0x31, 0x8c, 0x63, 0xf, 0xc0, + + /* U+005B "[" */ + 0xfc, 0xcc, 0xcc, 0xf0, + + /* U+005C "\\" */ + 0xc0, 0x60, 0x30, 0x18, 0xc, 0x6, 0x3, + + /* U+005D "]" */ + 0xf3, 0x33, 0x33, 0xf0, + + /* U+005E "^" */ + 0x10, 0x71, 0xb6, 0x30, + + /* U+005F "_" */ + 0xff, + + /* U+0060 "`" */ + 0xc6, 0x30, + + /* U+0061 "a" */ + 0x78, 0x37, 0xf3, 0x7c, + + /* U+0062 "b" */ + 0xc3, 0xf, 0xb3, 0xcf, 0x3f, 0x80, + + /* U+0063 "c" */ + 0x7e, 0x31, 0x87, 0x80, + + /* U+0064 "d" */ + 0xc, 0x37, 0xf3, 0xcf, 0x37, 0xc0, + + /* U+0065 "e" */ + 0x7b, 0x3f, 0xf0, 0x78, + + /* U+0066 "f" */ + 0x3b, 0x3e, 0xc6, 0x31, 0x80, + + /* U+0067 "g" */ + 0x7f, 0x3c, 0xdf, 0xf, 0xe0, + + /* U+0068 "h" */ + 0xc3, 0xf, 0xb3, 0xcf, 0x3c, 0xc0, + + /* U+0069 "i" */ + 0x60, 0x38, 0xc6, 0x31, 0xe0, + + /* U+006A "j" */ + 0x18, 0x6, 0x31, 0x8c, 0x7e, + + /* U+006B "k" */ + 0xc3, 0xc, 0xf6, 0xf3, 0x6c, 0xc0, + + /* U+006C "l" */ + 0xe3, 0x18, 0xc6, 0x31, 0xe0, + + /* U+006D "m" */ + 0xcd, 0xff, 0x5e, 0xbc, 0x60, + + /* U+006E "n" */ + 0xfb, 0x3c, 0xf3, 0xcc, + + /* U+006F "o" */ + 0x7b, 0x3c, 0xf3, 0x78, + + /* U+0070 "p" */ + 0xfb, 0x3c, 0xfe, 0xc3, 0x0, + + /* U+0071 "q" */ + 0x7f, 0x3c, 0xdf, 0xc, 0x30, + + /* U+0072 "r" */ + 0xfb, 0x3c, 0x30, 0xc0, + + /* U+0073 "s" */ + 0x7f, 0x7, 0x83, 0xf8, + + /* U+0074 "t" */ + 0x61, 0x8f, 0xd8, 0x61, 0x83, 0xc0, + + /* U+0075 "u" */ + 0xcf, 0x3c, 0xf3, 0x7c, + + /* U+0076 "v" */ + 0xcf, 0x3c, 0xde, 0x30, + + /* U+0077 "w" */ + 0xc7, 0x8f, 0x5b, 0xe6, 0xc0, + + /* U+0078 "x" */ + 0xc6, 0xd8, 0xe3, 0x6c, 0x60, + + /* U+0079 "y" */ + 0xcf, 0x3c, 0xdf, 0xd, 0xe0, + + /* U+007A "z" */ + 0xfc, 0x63, 0x18, 0xfc, + + /* U+007B "{" */ + 0x1c, 0xc3, 0x38, 0x30, 0xc1, 0xc0, + + /* U+007C "|" */ + 0xff, 0xfc, + + /* U+007D "}" */ + 0xe0, 0xc3, 0x7, 0x30, 0xce, 0x0, + + /* U+007E "~" */ + 0x77, 0xb8, + + /* U+007F "" */ + 0xc1, 0x42, 0xbd, 0x2c, 0x40, 0x81, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 128, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 1, .adv_w = 128, .box_w = 2, .box_h = 7, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 3, .adv_w = 128, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 6, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 13, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 19, .adv_w = 128, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 25, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 32, .adv_w = 128, .box_w = 3, .box_h = 3, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 34, .adv_w = 128, .box_w = 4, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 38, .adv_w = 128, .box_w = 4, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 42, .adv_w = 128, .box_w = 8, .box_h = 5, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 47, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 51, .adv_w = 128, .box_w = 3, .box_h = 3, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 53, .adv_w = 128, .box_w = 6, .box_h = 1, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 54, .adv_w = 128, .box_w = 2, .box_h = 2, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 55, .adv_w = 128, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 62, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 68, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 74, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 80, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 86, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 93, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 99, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 105, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 111, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 117, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 123, .adv_w = 128, .box_w = 2, .box_h = 6, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 125, .adv_w = 128, .box_w = 3, .box_h = 7, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 128, .adv_w = 128, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 133, .adv_w = 128, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 136, .adv_w = 128, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 141, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 147, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 154, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 160, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 166, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 172, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 178, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 184, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 190, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 196, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 202, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 208, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 214, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 221, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 227, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 234, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 241, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 247, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 253, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 259, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 265, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 271, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 277, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 283, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 289, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 296, .adv_w = 128, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 303, .adv_w = 128, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 310, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 316, .adv_w = 128, .box_w = 4, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 320, .adv_w = 128, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 327, .adv_w = 128, .box_w = 4, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 331, .adv_w = 128, .box_w = 7, .box_h = 4, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 335, .adv_w = 128, .box_w = 8, .box_h = 1, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 336, .adv_w = 128, .box_w = 4, .box_h = 3, .ofs_x = 3, .ofs_y = 5}, + {.bitmap_index = 338, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 342, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 348, .adv_w = 128, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 352, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 358, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 362, .adv_w = 128, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 367, .adv_w = 128, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 372, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 378, .adv_w = 128, .box_w = 5, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 383, .adv_w = 128, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 388, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 394, .adv_w = 128, .box_w = 5, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 399, .adv_w = 128, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 404, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 408, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 412, .adv_w = 128, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 417, .adv_w = 128, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 422, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 426, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 430, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 436, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 440, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 444, .adv_w = 128, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 449, .adv_w = 128, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 454, .adv_w = 128, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 459, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 463, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 469, .adv_w = 128, .box_w = 2, .box_h = 7, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 471, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 477, .adv_w = 128, .box_w = 7, .box_h = 2, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 479, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + + + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 96, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + } +}; + + + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = NULL, + .kern_scale = 0, + .cmap_num = 1, + .bpp = 1, + .kern_classes = 0, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_unscii_8 = { +#else +lv_font_t lv_font_unscii_8 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 9, /*The maximum line height required by the font*/ + .base_line = 0, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = 0, + .underline_thickness = 0, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_UNSCII_8*/ + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_symbol_def.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_symbol_def.h new file mode 100644 index 0000000..696daf1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/font/lv_symbol_def.h @@ -0,0 +1,353 @@ +#ifndef LV_SYMBOL_DEF_H +#define LV_SYMBOL_DEF_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../lv_conf_internal.h" + +/*------------------------------- + * Symbols from "normal" font + *-----------------------------*/ +#if !defined LV_SYMBOL_BULLET +#define LV_SYMBOL_BULLET "\xE2\x80\xA2" /*20042, 0x2022*/ +#endif + +/*------------------------------- + * Symbols from FontAwesome font + *-----------------------------*/ + +/*In the font converter use this list as range: + 61441, 61448, 61451, 61452, 61453, 61457, 61459, 61461, 61465, 61468, + 61473, 61478, 61479, 61480, 61502, 61507, 61512, 61515, 61516, 61517, + 61521, 61522, 61523, 61524, 61543, 61544, 61550, 61552, 61553, 61556, + 61559, 61560, 61561, 61563, 61587, 61589, 61636, 61637, 61639, 61641, + 61664, 61671, 61674, 61683, 61724, 61732, 61787, 61931, 62016, 62017, + 62018, 62019, 62020, 62087, 62099, 62189, 62212, 62810, 63426, 63650 +*/ + +/* These symbols can be prefined in the lv_conf.h file. + * If they are not predefined, they will use the following values + */ + + +#if !defined LV_SYMBOL_AUDIO +#define LV_SYMBOL_AUDIO "\xEF\x80\x81" /*61441, 0xF001*/ +#endif + +#if !defined LV_SYMBOL_VIDEO +#define LV_SYMBOL_VIDEO "\xEF\x80\x88" /*61448, 0xF008*/ +#endif + +#if !defined LV_SYMBOL_LIST +#define LV_SYMBOL_LIST "\xEF\x80\x8B" /*61451, 0xF00B*/ +#endif + +#if !defined LV_SYMBOL_OK +#define LV_SYMBOL_OK "\xEF\x80\x8C" /*61452, 0xF00C*/ +#endif + +#if !defined LV_SYMBOL_CLOSE +#define LV_SYMBOL_CLOSE "\xEF\x80\x8D" /*61453, 0xF00D*/ +#endif + +#if !defined LV_SYMBOL_POWER +#define LV_SYMBOL_POWER "\xEF\x80\x91" /*61457, 0xF011*/ +#endif + +#if !defined LV_SYMBOL_SETTINGS +#define LV_SYMBOL_SETTINGS "\xEF\x80\x93" /*61459, 0xF013*/ +#endif + +#if !defined LV_SYMBOL_HOME +#define LV_SYMBOL_HOME "\xEF\x80\x95" /*61461, 0xF015*/ +#endif + +#if !defined LV_SYMBOL_DOWNLOAD +#define LV_SYMBOL_DOWNLOAD "\xEF\x80\x99" /*61465, 0xF019*/ +#endif + +#if !defined LV_SYMBOL_DRIVE +#define LV_SYMBOL_DRIVE "\xEF\x80\x9C" /*61468, 0xF01C*/ +#endif + +#if !defined LV_SYMBOL_REFRESH +#define LV_SYMBOL_REFRESH "\xEF\x80\xA1" /*61473, 0xF021*/ +#endif + +#if !defined LV_SYMBOL_MUTE +#define LV_SYMBOL_MUTE "\xEF\x80\xA6" /*61478, 0xF026*/ +#endif + +#if !defined LV_SYMBOL_VOLUME_MID +#define LV_SYMBOL_VOLUME_MID "\xEF\x80\xA7" /*61479, 0xF027*/ +#endif + +#if !defined LV_SYMBOL_VOLUME_MAX +#define LV_SYMBOL_VOLUME_MAX "\xEF\x80\xA8" /*61480, 0xF028*/ +#endif + +#if !defined LV_SYMBOL_IMAGE +#define LV_SYMBOL_IMAGE "\xEF\x80\xBE" /*61502, 0xF03E*/ +#endif + +#if !defined LV_SYMBOL_TINT +#define LV_SYMBOL_TINT "\xEF\x81\x83" /*61507, 0xF043*/ +#endif + +#if !defined LV_SYMBOL_PREV +#define LV_SYMBOL_PREV "\xEF\x81\x88" /*61512, 0xF048*/ +#endif + +#if !defined LV_SYMBOL_PLAY +#define LV_SYMBOL_PLAY "\xEF\x81\x8B" /*61515, 0xF04B*/ +#endif + +#if !defined LV_SYMBOL_PAUSE +#define LV_SYMBOL_PAUSE "\xEF\x81\x8C" /*61516, 0xF04C*/ +#endif + +#if !defined LV_SYMBOL_STOP +#define LV_SYMBOL_STOP "\xEF\x81\x8D" /*61517, 0xF04D*/ +#endif + +#if !defined LV_SYMBOL_NEXT +#define LV_SYMBOL_NEXT "\xEF\x81\x91" /*61521, 0xF051*/ +#endif + +#if !defined LV_SYMBOL_EJECT +#define LV_SYMBOL_EJECT "\xEF\x81\x92" /*61522, 0xF052*/ +#endif + +#if !defined LV_SYMBOL_LEFT +#define LV_SYMBOL_LEFT "\xEF\x81\x93" /*61523, 0xF053*/ +#endif + +#if !defined LV_SYMBOL_RIGHT +#define LV_SYMBOL_RIGHT "\xEF\x81\x94" /*61524, 0xF054*/ +#endif + +#if !defined LV_SYMBOL_PLUS +#define LV_SYMBOL_PLUS "\xEF\x81\xA7" /*61543, 0xF067*/ +#endif + +#if !defined LV_SYMBOL_MINUS +#define LV_SYMBOL_MINUS "\xEF\x81\xA8" /*61544, 0xF068*/ +#endif + +#if !defined LV_SYMBOL_EYE_OPEN +#define LV_SYMBOL_EYE_OPEN "\xEF\x81\xAE" /*61550, 0xF06E*/ +#endif + +#if !defined LV_SYMBOL_EYE_CLOSE +#define LV_SYMBOL_EYE_CLOSE "\xEF\x81\xB0" /*61552, 0xF070*/ +#endif + +#if !defined LV_SYMBOL_WARNING +#define LV_SYMBOL_WARNING "\xEF\x81\xB1" /*61553, 0xF071*/ +#endif + +#if !defined LV_SYMBOL_SHUFFLE +#define LV_SYMBOL_SHUFFLE "\xEF\x81\xB4" /*61556, 0xF074*/ +#endif + +#if !defined LV_SYMBOL_UP +#define LV_SYMBOL_UP "\xEF\x81\xB7" /*61559, 0xF077*/ +#endif + +#if !defined LV_SYMBOL_DOWN +#define LV_SYMBOL_DOWN "\xEF\x81\xB8" /*61560, 0xF078*/ +#endif + +#if !defined LV_SYMBOL_LOOP +#define LV_SYMBOL_LOOP "\xEF\x81\xB9" /*61561, 0xF079*/ +#endif + +#if !defined LV_SYMBOL_DIRECTORY +#define LV_SYMBOL_DIRECTORY "\xEF\x81\xBB" /*61563, 0xF07B*/ +#endif + +#if !defined LV_SYMBOL_UPLOAD +#define LV_SYMBOL_UPLOAD "\xEF\x82\x93" /*61587, 0xF093*/ +#endif + +#if !defined LV_SYMBOL_CALL +#define LV_SYMBOL_CALL "\xEF\x82\x95" /*61589, 0xF095*/ +#endif + +#if !defined LV_SYMBOL_CUT +#define LV_SYMBOL_CUT "\xEF\x83\x84" /*61636, 0xF0C4*/ +#endif + +#if !defined LV_SYMBOL_COPY +#define LV_SYMBOL_COPY "\xEF\x83\x85" /*61637, 0xF0C5*/ +#endif + +#if !defined LV_SYMBOL_SAVE +#define LV_SYMBOL_SAVE "\xEF\x83\x87" /*61639, 0xF0C7*/ +#endif + +#if !defined LV_SYMBOL_BARS +#define LV_SYMBOL_BARS "\xEF\x83\x89" /*61641, 0xF0C9*/ +#endif + +#if !defined LV_SYMBOL_ENVELOPE +#define LV_SYMBOL_ENVELOPE "\xEF\x83\xA0" /*61664, 0xF0E0*/ +#endif + +#if !defined LV_SYMBOL_CHARGE +#define LV_SYMBOL_CHARGE "\xEF\x83\xA7" /*61671, 0xF0E7*/ +#endif + +#if !defined LV_SYMBOL_PASTE +#define LV_SYMBOL_PASTE "\xEF\x83\xAA" /*61674, 0xF0EA*/ +#endif + +#if !defined LV_SYMBOL_BELL +#define LV_SYMBOL_BELL "\xEF\x83\xB3" /*61683, 0xF0F3*/ +#endif + +#if !defined LV_SYMBOL_KEYBOARD +#define LV_SYMBOL_KEYBOARD "\xEF\x84\x9C" /*61724, 0xF11C*/ +#endif + +#if !defined LV_SYMBOL_GPS +#define LV_SYMBOL_GPS "\xEF\x84\xA4" /*61732, 0xF124*/ +#endif + +#if !defined LV_SYMBOL_FILE +#define LV_SYMBOL_FILE "\xEF\x85\x9B" /*61787, 0xF158*/ +#endif + +#if !defined LV_SYMBOL_WIFI +#define LV_SYMBOL_WIFI "\xEF\x87\xAB" /*61931, 0xF1EB*/ +#endif + +#if !defined LV_SYMBOL_BATTERY_FULL +#define LV_SYMBOL_BATTERY_FULL "\xEF\x89\x80" /*62016, 0xF240*/ +#endif + +#if !defined LV_SYMBOL_BATTERY_3 +#define LV_SYMBOL_BATTERY_3 "\xEF\x89\x81" /*62017, 0xF241*/ +#endif + +#if !defined LV_SYMBOL_BATTERY_2 +#define LV_SYMBOL_BATTERY_2 "\xEF\x89\x82" /*62018, 0xF242*/ +#endif + +#if !defined LV_SYMBOL_BATTERY_1 +#define LV_SYMBOL_BATTERY_1 "\xEF\x89\x83" /*62019, 0xF243*/ +#endif + +#if !defined LV_SYMBOL_BATTERY_EMPTY +#define LV_SYMBOL_BATTERY_EMPTY "\xEF\x89\x84" /*62020, 0xF244*/ +#endif + +#if !defined LV_SYMBOL_USB +#define LV_SYMBOL_USB "\xEF\x8a\x87" /*62087, 0xF287*/ +#endif + +#if !defined LV_SYMBOL_BLUETOOTH +#define LV_SYMBOL_BLUETOOTH "\xEF\x8a\x93" /*62099, 0xF293*/ +#endif + +#if !defined LV_SYMBOL_TRASH +#define LV_SYMBOL_TRASH "\xEF\x8B\xAD" /*62189, 0xF2ED*/ +#endif + +#if !defined LV_SYMBOL_EDIT +#define LV_SYMBOL_EDIT "\xEF\x8C\x84" /*62212, 0xF304*/ +#endif + +#if !defined LV_SYMBOL_BACKSPACE +#define LV_SYMBOL_BACKSPACE "\xEF\x95\x9A" /*62810, 0xF55A*/ +#endif + +#if !defined LV_SYMBOL_SD_CARD +#define LV_SYMBOL_SD_CARD "\xEF\x9F\x82" /*63426, 0xF7C2*/ +#endif + +#if !defined LV_SYMBOL_NEW_LINE +#define LV_SYMBOL_NEW_LINE "\xEF\xA2\xA2" /*63650, 0xF8A2*/ +#endif + +#if !defined LV_SYMBOL_DUMMY +/** Invalid symbol at (U+F8FF). If written before a string then `lv_img` will show it as a label*/ +#define LV_SYMBOL_DUMMY "\xEF\xA3\xBF" +#endif + +/* + * The following list is generated using + * cat src/font/lv_symbol_def.h | sed -E -n 's/^#define\s+LV_(SYMBOL_\w+).*".*$/ _LV_STR_\1,/p' + */ +enum { + _LV_STR_SYMBOL_BULLET, + _LV_STR_SYMBOL_AUDIO, + _LV_STR_SYMBOL_VIDEO, + _LV_STR_SYMBOL_LIST, + _LV_STR_SYMBOL_OK, + _LV_STR_SYMBOL_CLOSE, + _LV_STR_SYMBOL_POWER, + _LV_STR_SYMBOL_SETTINGS, + _LV_STR_SYMBOL_HOME, + _LV_STR_SYMBOL_DOWNLOAD, + _LV_STR_SYMBOL_DRIVE, + _LV_STR_SYMBOL_REFRESH, + _LV_STR_SYMBOL_MUTE, + _LV_STR_SYMBOL_VOLUME_MID, + _LV_STR_SYMBOL_VOLUME_MAX, + _LV_STR_SYMBOL_IMAGE, + _LV_STR_SYMBOL_TINT, + _LV_STR_SYMBOL_PREV, + _LV_STR_SYMBOL_PLAY, + _LV_STR_SYMBOL_PAUSE, + _LV_STR_SYMBOL_STOP, + _LV_STR_SYMBOL_NEXT, + _LV_STR_SYMBOL_EJECT, + _LV_STR_SYMBOL_LEFT, + _LV_STR_SYMBOL_RIGHT, + _LV_STR_SYMBOL_PLUS, + _LV_STR_SYMBOL_MINUS, + _LV_STR_SYMBOL_EYE_OPEN, + _LV_STR_SYMBOL_EYE_CLOSE, + _LV_STR_SYMBOL_WARNING, + _LV_STR_SYMBOL_SHUFFLE, + _LV_STR_SYMBOL_UP, + _LV_STR_SYMBOL_DOWN, + _LV_STR_SYMBOL_LOOP, + _LV_STR_SYMBOL_DIRECTORY, + _LV_STR_SYMBOL_UPLOAD, + _LV_STR_SYMBOL_CALL, + _LV_STR_SYMBOL_CUT, + _LV_STR_SYMBOL_COPY, + _LV_STR_SYMBOL_SAVE, + _LV_STR_SYMBOL_BARS, + _LV_STR_SYMBOL_ENVELOPE, + _LV_STR_SYMBOL_CHARGE, + _LV_STR_SYMBOL_PASTE, + _LV_STR_SYMBOL_BELL, + _LV_STR_SYMBOL_KEYBOARD, + _LV_STR_SYMBOL_GPS, + _LV_STR_SYMBOL_FILE, + _LV_STR_SYMBOL_WIFI, + _LV_STR_SYMBOL_BATTERY_FULL, + _LV_STR_SYMBOL_BATTERY_3, + _LV_STR_SYMBOL_BATTERY_2, + _LV_STR_SYMBOL_BATTERY_1, + _LV_STR_SYMBOL_BATTERY_EMPTY, + _LV_STR_SYMBOL_USB, + _LV_STR_SYMBOL_BLUETOOTH, + _LV_STR_SYMBOL_TRASH, + _LV_STR_SYMBOL_EDIT, + _LV_STR_SYMBOL_BACKSPACE, + _LV_STR_SYMBOL_SD_CARD, + _LV_STR_SYMBOL_NEW_LINE, + _LV_STR_SYMBOL_DUMMY, +}; + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SYMBOL_DEF_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal.h new file mode 100644 index 0000000..167da1f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal.h @@ -0,0 +1,48 @@ +/** + * @file lv_hal.h + * + */ + +#ifndef LV_HAL_H +#define LV_HAL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_hal_disp.h" +#include "lv_hal_indev.h" +#include "lv_hal_tick.h" + +/********************* + * DEFINES + *********************/ +/** + * Same as Android's DIP. (Different name is chosen to avoid mistype between LV_DPI and LV_DIP) + * 1 dip is 1 px on a 160 DPI screen + * 1 dip is 2 px on a 320 DPI screen + * https://stackoverflow.com/questions/2025282/what-is-the-difference-between-px-dip-dp-and-sp + */ +#define _LV_DPX_CALC(dpi, n) ((n) == 0 ? 0 :LV_MAX((( (dpi) * (n) + 80) / 160), 1)) /*+80 for rounding*/ +#define LV_DPX(n) _LV_DPX_CALC(lv_disp_get_dpi(NULL), n) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal.mk b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal.mk new file mode 100644 index 0000000..c35ec2d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal.mk @@ -0,0 +1,8 @@ +CSRCS += lv_hal_disp.c +CSRCS += lv_hal_indev.c +CSRCS += lv_hal_tick.c + +DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/hal +VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/hal + +CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/hal" diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal_disp.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal_disp.c new file mode 100644 index 0000000..0dd8f6b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal_disp.c @@ -0,0 +1,710 @@ +/** + * @file lv_hal_disp.c + * + * @description HAL layer for display driver + * + */ + +/********************* + * INCLUDES + *********************/ +#include +#include +#include "lv_hal.h" +#include "../misc/lv_mem.h" +#include "../misc/lv_gc.h" +#include "../misc/lv_assert.h" +#include "../core/lv_obj.h" +#include "../core/lv_refr.h" +#include "../core/lv_theme.h" +#include "../draw/sdl/lv_draw_sdl.h" +#include "../draw/sw/lv_draw_sw.h" +#include "../draw/sdl/lv_draw_sdl.h" +#include "../draw/stm32_dma2d/lv_gpu_stm32_dma2d.h" +#include "../draw/swm341_dma2d/lv_gpu_swm341_dma2d.h" +#include "../draw/arm2d/lv_gpu_arm2d.h" +#if LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE + #include "../draw/nxp/lv_gpu_nxp.h" +#endif + +#if LV_USE_THEME_DEFAULT + #include "../extra/themes/default/lv_theme_default.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_obj_tree_walk_res_t invalidate_layout_cb(lv_obj_t * obj, void * user_data); + +static void set_px_true_color_alpha(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, + lv_coord_t y, + lv_color_t color, lv_opa_t opa); + +static void set_px_cb_alpha1(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa); + +static void set_px_cb_alpha2(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa); + +static void set_px_cb_alpha4(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa); + +static void set_px_cb_alpha8(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa); + +static void set_px_alpha_generic(lv_img_dsc_t * d, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa); + +/********************** + * STATIC VARIABLES + **********************/ +static lv_disp_t * disp_def; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Initialize a display driver with default values. + * It is used to surly have known values in the fields ant not memory junk. + * After it you can set the fields. + * @param driver pointer to driver variable to initialize + */ +void lv_disp_drv_init(lv_disp_drv_t * driver) +{ + lv_memset_00(driver, sizeof(lv_disp_drv_t)); + + driver->hor_res = 320; + driver->ver_res = 240; + driver->physical_hor_res = -1; + driver->physical_ver_res = -1; + driver->offset_x = 0; + driver->offset_y = 0; + driver->antialiasing = LV_COLOR_DEPTH > 8 ? 1 : 0; + driver->screen_transp = 0; + driver->dpi = LV_DPI_DEF; + driver->color_chroma_key = LV_COLOR_CHROMA_KEY; + + +#if LV_USE_GPU_STM32_DMA2D + driver->draw_ctx_init = lv_draw_stm32_dma2d_ctx_init; + driver->draw_ctx_deinit = lv_draw_stm32_dma2d_ctx_init; + driver->draw_ctx_size = sizeof(lv_draw_stm32_dma2d_ctx_t); +#elif LV_USE_GPU_SWM341_DMA2D + driver->draw_ctx_init = lv_draw_swm341_dma2d_ctx_init; + driver->draw_ctx_deinit = lv_draw_swm341_dma2d_ctx_init; + driver->draw_ctx_size = sizeof(lv_draw_swm341_dma2d_ctx_t); +#elif LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE + driver->draw_ctx_init = lv_draw_nxp_ctx_init; + driver->draw_ctx_deinit = lv_draw_nxp_ctx_deinit; + driver->draw_ctx_size = sizeof(lv_draw_nxp_ctx_t); +#elif LV_USE_GPU_SDL + driver->draw_ctx_init = lv_draw_sdl_init_ctx; + driver->draw_ctx_deinit = lv_draw_sdl_deinit_ctx; + driver->draw_ctx_size = sizeof(lv_draw_sdl_ctx_t); +#elif LV_USE_GPU_ARM2D + driver->draw_ctx_init = lv_draw_arm2d_ctx_init; + driver->draw_ctx_deinit = lv_draw_arm2d_ctx_init; + driver->draw_ctx_size = sizeof(lv_draw_arm2d_ctx_t); +#else + driver->draw_ctx_init = lv_draw_sw_init_ctx; + driver->draw_ctx_deinit = lv_draw_sw_init_ctx; + driver->draw_ctx_size = sizeof(lv_draw_sw_ctx_t); +#endif + +} + +/** + * Initialize a display buffer + * @param draw_buf pointer `lv_disp_draw_buf_t` variable to initialize + * @param buf1 A buffer to be used by LVGL to draw the image. + * Always has to specified and can't be NULL. + * Can be an array allocated by the user. E.g. `static lv_color_t disp_buf1[1024 * 10]` + * Or a memory address e.g. in external SRAM + * @param buf2 Optionally specify a second buffer to make image rendering and image flushing + * (sending to the display) parallel. + * In the `disp_drv->flush` you should use DMA or similar hardware to send + * the image to the display in the background. + * It lets LVGL to render next frame into the other buffer while previous is being + * sent. Set to `NULL` if unused. + * @param size_in_px_cnt size of the `buf1` and `buf2` in pixel count. + */ +void lv_disp_draw_buf_init(lv_disp_draw_buf_t * draw_buf, void * buf1, void * buf2, uint32_t size_in_px_cnt) +{ + lv_memset_00(draw_buf, sizeof(lv_disp_draw_buf_t)); + + draw_buf->buf1 = buf1; + draw_buf->buf2 = buf2; + draw_buf->buf_act = draw_buf->buf1; + draw_buf->size = size_in_px_cnt; +} + +/** + * Register an initialized display driver. + * Automatically set the first display as active. + * @param driver pointer to an initialized 'lv_disp_drv_t' variable. Only its pointer is saved! + * @return pointer to the new display or NULL on error + */ +lv_disp_t * lv_disp_drv_register(lv_disp_drv_t * driver) +{ + lv_disp_t * disp = _lv_ll_ins_head(&LV_GC_ROOT(_lv_disp_ll)); + LV_ASSERT_MALLOC(disp); + if(!disp) { + return NULL; + } + + /*Create a draw context if not created yet*/ + if(driver->draw_ctx == NULL) { + lv_draw_ctx_t * draw_ctx = lv_mem_alloc(driver->draw_ctx_size); + LV_ASSERT_MALLOC(draw_ctx); + if(draw_ctx == NULL) return NULL; + driver->draw_ctx_init(driver, draw_ctx); + driver->draw_ctx = draw_ctx; + } + + lv_memset_00(disp, sizeof(lv_disp_t)); + + disp->driver = driver; + + disp->inv_en_cnt = 1; + + lv_disp_t * disp_def_tmp = disp_def; + disp_def = disp; /*Temporarily change the default screen to create the default screens on the + new display*/ + /*Create a refresh timer*/ + disp->refr_timer = lv_timer_create(_lv_disp_refr_timer, LV_DISP_DEF_REFR_PERIOD, disp); + LV_ASSERT_MALLOC(disp->refr_timer); + if(disp->refr_timer == NULL) { + lv_mem_free(disp); + return NULL; + } + + if(driver->full_refresh && driver->draw_buf->size < (uint32_t)driver->hor_res * driver->ver_res) { + driver->full_refresh = 0; + LV_LOG_WARN("full_refresh requires at least screen sized draw buffer(s)"); + } + + disp->bg_color = lv_color_white(); +#if LV_COLOR_SCREEN_TRANSP + disp->bg_opa = LV_OPA_TRANSP; +#else + disp->bg_opa = LV_OPA_COVER; +#endif + +#if LV_USE_THEME_DEFAULT + if(lv_theme_default_is_inited() == false) { + disp->theme = lv_theme_default_init(disp, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_RED), + LV_THEME_DEFAULT_DARK, LV_FONT_DEFAULT); + } + else { + disp->theme = lv_theme_default_get(); + } +#endif + + disp->act_scr = lv_obj_create(NULL); /*Create a default screen on the display*/ + disp->top_layer = lv_obj_create(NULL); /*Create top layer on the display*/ + disp->sys_layer = lv_obj_create(NULL); /*Create sys layer on the display*/ + lv_obj_remove_style_all(disp->top_layer); + lv_obj_remove_style_all(disp->sys_layer); + lv_obj_clear_flag(disp->top_layer, LV_OBJ_FLAG_CLICKABLE); + lv_obj_clear_flag(disp->sys_layer, LV_OBJ_FLAG_CLICKABLE); + + lv_obj_set_scrollbar_mode(disp->top_layer, LV_SCROLLBAR_MODE_OFF); + lv_obj_set_scrollbar_mode(disp->sys_layer, LV_SCROLLBAR_MODE_OFF); + + lv_obj_invalidate(disp->act_scr); + + disp_def = disp_def_tmp; /*Revert the default display*/ + if(disp_def == NULL) disp_def = disp; /*Initialize the default display*/ + + lv_timer_ready(disp->refr_timer); /*Be sure the screen will be refreshed immediately on start up*/ + + return disp; +} + +/** + * Update the driver in run time. + * @param disp pointer to a display. (return value of `lv_disp_drv_register`) + * @param new_drv pointer to the new driver + */ +void lv_disp_drv_update(lv_disp_t * disp, lv_disp_drv_t * new_drv) +{ + disp->driver = new_drv; + + if(disp->driver->full_refresh && + disp->driver->draw_buf->size < (uint32_t)disp->driver->hor_res * disp->driver->ver_res) { + disp->driver->full_refresh = 0; + LV_LOG_WARN("full_refresh requires at least screen sized draw buffer(s)"); + } + + lv_coord_t w = lv_disp_get_hor_res(disp); + lv_coord_t h = lv_disp_get_ver_res(disp); + uint32_t i; + for(i = 0; i < disp->screen_cnt; i++) { + lv_area_t prev_coords; + lv_obj_get_coords(disp->screens[i], &prev_coords); + lv_area_set_width(&disp->screens[i]->coords, w); + lv_area_set_height(&disp->screens[i]->coords, h); + lv_event_send(disp->screens[i], LV_EVENT_SIZE_CHANGED, &prev_coords); + } + + /* + * This method is usually called upon orientation change, thus the screen is now a + * different size. + * The object invalidated its previous area. That area is now out of the screen area + * so we reset all invalidated areas and invalidate the active screen's new area only. + */ + lv_memset_00(disp->inv_areas, sizeof(disp->inv_areas)); + lv_memset_00(disp->inv_area_joined, sizeof(disp->inv_area_joined)); + disp->inv_p = 0; + if(disp->act_scr != NULL) lv_obj_invalidate(disp->act_scr); + + lv_obj_tree_walk(NULL, invalidate_layout_cb, NULL); + + if(disp->driver->drv_update_cb) disp->driver->drv_update_cb(disp->driver); +} + +/** + * Remove a display + * @param disp pointer to display + */ +void lv_disp_remove(lv_disp_t * disp) +{ + bool was_default = false; + if(disp == lv_disp_get_default()) was_default = true; + + /*Detach the input devices*/ + lv_indev_t * indev; + indev = lv_indev_get_next(NULL); + while(indev) { + if(indev->driver->disp == disp) { + indev->driver->disp = NULL; + } + indev = lv_indev_get_next(indev); + } + + /** delete screen and other obj */ + if(disp->sys_layer) { + lv_obj_del(disp->sys_layer); + disp->sys_layer = NULL; + } + if(disp->top_layer) { + lv_obj_del(disp->top_layer); + disp->top_layer = NULL; + } + while(disp->screen_cnt != 0) { + /*Delete the screenst*/ + lv_obj_del(disp->screens[0]); + } + + _lv_ll_remove(&LV_GC_ROOT(_lv_disp_ll), disp); + if(disp->refr_timer) lv_timer_del(disp->refr_timer); + lv_mem_free(disp); + + if(was_default) lv_disp_set_default(_lv_ll_get_head(&LV_GC_ROOT(_lv_disp_ll))); +} + +/** + * Set a default display. The new screens will be created on it by default. + * @param disp pointer to a display + */ +void lv_disp_set_default(lv_disp_t * disp) +{ + disp_def = disp; +} + +/** + * Get the default display + * @return pointer to the default display + */ +lv_disp_t * lv_disp_get_default(void) +{ + return disp_def; +} + +/** + * Get the horizontal resolution of a display + * @param disp pointer to a display (NULL to use the default display) + * @return the horizontal resolution of the display + */ +lv_coord_t lv_disp_get_hor_res(lv_disp_t * disp) +{ + if(disp == NULL) disp = lv_disp_get_default(); + + if(disp == NULL) { + return 0; + } + else { + switch(disp->driver->rotated) { + case LV_DISP_ROT_90: + case LV_DISP_ROT_270: + return disp->driver->ver_res; + default: + return disp->driver->hor_res; + } + } +} + +/** + * Get the vertical resolution of a display + * @param disp pointer to a display (NULL to use the default display) + * @return the vertical resolution of the display + */ +lv_coord_t lv_disp_get_ver_res(lv_disp_t * disp) +{ + if(disp == NULL) disp = lv_disp_get_default(); + + if(disp == NULL) { + return 0; + } + else { + switch(disp->driver->rotated) { + case LV_DISP_ROT_90: + case LV_DISP_ROT_270: + return disp->driver->hor_res; + default: + return disp->driver->ver_res; + } + } +} + +/** + * Get the full / physical horizontal resolution of a display + * @param disp pointer to a display (NULL to use the default display) + * @return the full / physical horizontal resolution of the display + */ +lv_coord_t lv_disp_get_physical_hor_res(lv_disp_t * disp) +{ + if(disp == NULL) disp = lv_disp_get_default(); + + if(disp == NULL) { + return 0; + } + else { + switch(disp->driver->rotated) { + case LV_DISP_ROT_90: + case LV_DISP_ROT_270: + return disp->driver->physical_ver_res > 0 ? disp->driver->physical_ver_res : disp->driver->ver_res; + default: + return disp->driver->physical_hor_res > 0 ? disp->driver->physical_hor_res : disp->driver->hor_res; + } + } +} + +/** + * Get the full / physical vertical resolution of a display + * @param disp pointer to a display (NULL to use the default display) + * @return the full / physical vertical resolution of the display + */ +lv_coord_t lv_disp_get_physical_ver_res(lv_disp_t * disp) +{ + if(disp == NULL) disp = lv_disp_get_default(); + + if(disp == NULL) { + return 0; + } + else { + switch(disp->driver->rotated) { + case LV_DISP_ROT_90: + case LV_DISP_ROT_270: + return disp->driver->physical_hor_res > 0 ? disp->driver->physical_hor_res : disp->driver->hor_res; + default: + return disp->driver->physical_ver_res > 0 ? disp->driver->physical_ver_res : disp->driver->ver_res; + } + } +} + +/** + * Get the horizontal offset from the full / physical display + * @param disp pointer to a display (NULL to use the default display) + * @return the horizontal offset from the full / physical display + */ +lv_coord_t lv_disp_get_offset_x(lv_disp_t * disp) +{ + if(disp == NULL) disp = lv_disp_get_default(); + + if(disp == NULL) { + return 0; + } + else { + switch(disp->driver->rotated) { + case LV_DISP_ROT_90: + return disp->driver->offset_y; + case LV_DISP_ROT_180: + return lv_disp_get_physical_hor_res(disp) - disp->driver->offset_x; + case LV_DISP_ROT_270: + return lv_disp_get_physical_hor_res(disp) - disp->driver->offset_y; + default: + return disp->driver->offset_x; + } + } +} + +/** + * Get the vertical offset from the full / physical display + * @param disp pointer to a display (NULL to use the default display) + * @return the horizontal offset from the full / physical display + */ +lv_coord_t lv_disp_get_offset_y(lv_disp_t * disp) +{ + if(disp == NULL) disp = lv_disp_get_default(); + + if(disp == NULL) { + return 0; + } + else { + switch(disp->driver->rotated) { + case LV_DISP_ROT_90: + return disp->driver->offset_x; + case LV_DISP_ROT_180: + return lv_disp_get_physical_ver_res(disp) - disp->driver->offset_y; + case LV_DISP_ROT_270: + return lv_disp_get_physical_ver_res(disp) - disp->driver->offset_x; + default: + return disp->driver->offset_y; + } + } +} + +/** + * Get if anti-aliasing is enabled for a display or not + * @param disp pointer to a display (NULL to use the default display) + * @return true: anti-aliasing is enabled; false: disabled + */ +bool lv_disp_get_antialiasing(lv_disp_t * disp) +{ + if(disp == NULL) disp = lv_disp_get_default(); + if(disp == NULL) return false; + + return disp->driver->antialiasing ? true : false; +} + +/** + * Get the DPI of the display + * @param disp pointer to a display (NULL to use the default display) + * @return dpi of the display + */ +lv_coord_t lv_disp_get_dpi(const lv_disp_t * disp) +{ + if(disp == NULL) disp = lv_disp_get_default(); + if(disp == NULL) return LV_DPI_DEF; /*Do not return 0 because it might be a divider*/ + return disp->driver->dpi; +} + +/** + * Call in the display driver's `flush_cb` function when the flushing is finished + * @param disp_drv pointer to display driver in `flush_cb` where this function is called + */ +LV_ATTRIBUTE_FLUSH_READY void lv_disp_flush_ready(lv_disp_drv_t * disp_drv) +{ + disp_drv->draw_buf->flushing = 0; + disp_drv->draw_buf->flushing_last = 0; +} + +/** + * Tell if it's the last area of the refreshing process. + * Can be called from `flush_cb` to execute some special display refreshing if needed when all areas area flushed. + * @param disp_drv pointer to display driver + * @return true: it's the last area to flush; false: there are other areas too which will be refreshed soon + */ +LV_ATTRIBUTE_FLUSH_READY bool lv_disp_flush_is_last(lv_disp_drv_t * disp_drv) +{ + return disp_drv->draw_buf->flushing_last; +} + +/** + * Get the next display. + * @param disp pointer to the current display. NULL to initialize. + * @return the next display or NULL if no more. Give the first display when the parameter is NULL + */ +lv_disp_t * lv_disp_get_next(lv_disp_t * disp) +{ + if(disp == NULL) + return _lv_ll_get_head(&LV_GC_ROOT(_lv_disp_ll)); + else + return _lv_ll_get_next(&LV_GC_ROOT(_lv_disp_ll), disp); +} + +/** + * Get the internal buffer of a display + * @param disp pointer to a display + * @return pointer to the internal buffers + */ +lv_disp_draw_buf_t * lv_disp_get_draw_buf(lv_disp_t * disp) +{ + return disp->driver->draw_buf; +} + +/** + * Set the rotation of this display. + * @param disp pointer to a display (NULL to use the default display) + * @param rotation rotation angle + */ +void lv_disp_set_rotation(lv_disp_t * disp, lv_disp_rot_t rotation) +{ + if(disp == NULL) disp = lv_disp_get_default(); + if(disp == NULL) return; + + disp->driver->rotated = rotation; + lv_disp_drv_update(disp, disp->driver); +} + +/** + * Get the current rotation of this display. + * @param disp pointer to a display (NULL to use the default display) + * @return rotation angle + */ +lv_disp_rot_t lv_disp_get_rotation(lv_disp_t * disp) +{ + if(disp == NULL) disp = lv_disp_get_default(); + if(disp == NULL) return LV_DISP_ROT_NONE; + return disp->driver->rotated; +} + +void lv_disp_drv_use_generic_set_px_cb(lv_disp_drv_t * disp_drv, lv_img_cf_t cf) +{ + switch(cf) { + case LV_IMG_CF_TRUE_COLOR_ALPHA: + disp_drv->set_px_cb = set_px_true_color_alpha; + break; + case LV_IMG_CF_ALPHA_1BIT: + disp_drv->set_px_cb = set_px_cb_alpha1; + break; + case LV_IMG_CF_ALPHA_2BIT: + disp_drv->set_px_cb = set_px_cb_alpha2; + break; + case LV_IMG_CF_ALPHA_4BIT: + disp_drv->set_px_cb = set_px_cb_alpha4; + break; + case LV_IMG_CF_ALPHA_8BIT: + disp_drv->set_px_cb = set_px_cb_alpha8; + break; + default: + disp_drv->set_px_cb = NULL; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_obj_tree_walk_res_t invalidate_layout_cb(lv_obj_t * obj, void * user_data) +{ + LV_UNUSED(user_data); + lv_obj_mark_layout_as_dirty(obj); + return LV_OBJ_TREE_WALK_NEXT; +} + +static void set_px_cb_alpha1(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa) +{ + (void) disp_drv; /*Unused*/ + + if(opa <= LV_OPA_MIN) return; + lv_img_dsc_t d; + d.data = buf; + d.header.w = buf_w; + d.header.cf = LV_IMG_CF_ALPHA_1BIT; + + set_px_alpha_generic(&d, x, y, color, opa); +} + +static void set_px_cb_alpha2(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa) +{ + (void) disp_drv; /*Unused*/ + + if(opa <= LV_OPA_MIN) return; + lv_img_dsc_t d; + d.data = buf; + d.header.w = buf_w; + d.header.cf = LV_IMG_CF_ALPHA_2BIT; + + set_px_alpha_generic(&d, x, y, color, opa); +} + +static void set_px_cb_alpha4(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa) +{ + (void) disp_drv; /*Unused*/ + + if(opa <= LV_OPA_MIN) return; + lv_img_dsc_t d; + d.data = buf; + d.header.w = buf_w; + d.header.cf = LV_IMG_CF_ALPHA_4BIT; + + set_px_alpha_generic(&d, x, y, color, opa); +} + +static void set_px_cb_alpha8(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa) +{ + (void) disp_drv; /*Unused*/ + + if(opa <= LV_OPA_MIN) return; + lv_img_dsc_t d; + d.data = buf; + d.header.w = buf_w; + d.header.cf = LV_IMG_CF_ALPHA_8BIT; + + set_px_alpha_generic(&d, x, y, color, opa); +} + +static void set_px_alpha_generic(lv_img_dsc_t * d, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa) +{ + d->header.always_zero = 0; + d->header.h = 1; /*Doesn't matter*/ + + uint8_t br = lv_color_brightness(color); + if(opa < LV_OPA_MAX) { + uint8_t bg = lv_img_buf_get_px_alpha(d, x, y); + br = (uint16_t)((uint16_t)br * opa + (bg * (255 - opa))) >> 8; + } + + lv_img_buf_set_px_alpha(d, x, y, br); +} + +static void set_px_true_color_alpha(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, + lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa) +{ + (void) disp_drv; /*Unused*/ + + uint8_t * buf_px = buf + (buf_w * y * LV_IMG_PX_SIZE_ALPHA_BYTE + x * LV_IMG_PX_SIZE_ALPHA_BYTE); + + lv_color_t bg_color; + lv_color_t res_color; + lv_opa_t bg_opa = buf_px[LV_IMG_PX_SIZE_ALPHA_BYTE - 1]; +#if LV_COLOR_DEPTH == 8 || LV_COLOR_DEPTH == 1 + bg_color.full = buf_px[0]; + lv_color_mix_with_alpha(bg_color, bg_opa, color, opa, &res_color, &buf_px[2]); + if(buf_px[1] <= LV_OPA_MIN) return; + buf_px[0] = res_color.full; +#elif LV_COLOR_DEPTH == 16 + bg_color.full = buf_px[0] + (buf_px[1] << 8); + lv_color_mix_with_alpha(bg_color, bg_opa, color, opa, &res_color, &buf_px[2]); + if(buf_px[2] <= LV_OPA_MIN) return; + buf_px[0] = res_color.full & 0xff; + buf_px[1] = res_color.full >> 8; +#elif LV_COLOR_DEPTH == 32 + bg_color = *((lv_color_t *)buf_px); + lv_color_mix_with_alpha(bg_color, bg_opa, color, opa, &res_color, &buf_px[3]); + if(buf_px[3] <= LV_OPA_MIN) return; + buf_px[0] = res_color.ch.blue; + buf_px[1] = res_color.ch.green; + buf_px[2] = res_color.ch.red; +#endif + +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal_disp.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal_disp.h new file mode 100644 index 0000000..d3425fe --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal_disp.h @@ -0,0 +1,371 @@ +/** + * @file lv_hal_disp.h + * + * @description Display Driver HAL interface header file + * + */ + +#ifndef LV_HAL_DISP_H +#define LV_HAL_DISP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include +#include "lv_hal.h" +#include "../draw/lv_draw.h" +#include "../misc/lv_color.h" +#include "../misc/lv_area.h" +#include "../misc/lv_ll.h" +#include "../misc/lv_timer.h" + +/********************* + * DEFINES + *********************/ +#ifndef LV_INV_BUF_SIZE +#define LV_INV_BUF_SIZE 32 /*Buffer size for invalid areas*/ +#endif + +#ifndef LV_ATTRIBUTE_FLUSH_READY +#define LV_ATTRIBUTE_FLUSH_READY +#endif + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_obj_t; +struct _lv_disp_t; +struct _lv_disp_drv_t; +struct _lv_theme_t; + +/** + * Structure for holding display buffer information. + */ +typedef struct _lv_disp_draw_buf_t { + void * buf1; /**< First display buffer.*/ + void * buf2; /**< Second display buffer.*/ + + /*Internal, used by the library*/ + void * buf_act; + uint32_t size; /*In pixel count*/ + /*1: flushing is in progress. (It can't be a bit field because when it's cleared from IRQ Read-Modify-Write issue might occur)*/ + volatile int flushing; + /*1: It was the last chunk to flush. (It can't be a bit field because when it's cleared from IRQ Read-Modify-Write issue might occur)*/ + volatile int flushing_last; + volatile uint32_t last_area : 1; /*1: the last area is being rendered*/ + volatile uint32_t last_part : 1; /*1: the last part of the current area is being rendered*/ +} lv_disp_draw_buf_t; + +typedef enum { + LV_DISP_ROT_NONE = 0, + LV_DISP_ROT_90, + LV_DISP_ROT_180, + LV_DISP_ROT_270 +} lv_disp_rot_t; + +/** + * Display Driver structure to be registered by HAL. + * Only its pointer will be saved in `lv_disp_t` so it should be declared as + * `static lv_disp_drv_t my_drv` or allocated dynamically. + */ +typedef struct _lv_disp_drv_t { + + lv_coord_t hor_res; /**< Horizontal resolution.*/ + lv_coord_t ver_res; /**< Vertical resolution.*/ + + lv_coord_t + physical_hor_res; /**< Horizontal resolution of the full / physical display. Set to -1 for fullscreen mode.*/ + lv_coord_t + physical_ver_res; /**< Vertical resolution of the full / physical display. Set to -1 for fullscreen mode.*/ + lv_coord_t + offset_x; /**< Horizontal offset from the full / physical display. Set to 0 for fullscreen mode.*/ + lv_coord_t offset_y; /**< Vertical offset from the full / physical display. Set to 0 for fullscreen mode.*/ + + /** Pointer to a buffer initialized with `lv_disp_draw_buf_init()`. + * LVGL will use this buffer(s) to draw the screens contents*/ + lv_disp_draw_buf_t * draw_buf; + + uint32_t direct_mode : 1; /**< 1: Use screen-sized buffers and draw to absolute coordinates*/ + uint32_t full_refresh : 1; /**< 1: Always make the whole screen redrawn*/ + uint32_t sw_rotate : 1; /**< 1: use software rotation (slower)*/ + uint32_t antialiasing : 1; /**< 1: anti-aliasing is enabled on this display.*/ + uint32_t rotated : 2; /**< 1: turn the display by 90 degree. @warning Does not update coordinates for you!*/ + uint32_t screen_transp : 1; /**Handle if the screen doesn't have a solid (opa == LV_OPA_COVER) background. + * Use only if required because it's slower.*/ + + uint32_t dpi : 10; /** DPI (dot per inch) of the display. Default value is `LV_DPI_DEF`.*/ + + /** MANDATORY: Write the internal buffer (draw_buf) to the display. 'lv_disp_flush_ready()' has to be + * called when finished*/ + void (*flush_cb)(struct _lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p); + + /** OPTIONAL: Extend the invalidated areas to match with the display drivers requirements + * E.g. round `y` to, 8, 16 ..) on a monochrome display*/ + void (*rounder_cb)(struct _lv_disp_drv_t * disp_drv, lv_area_t * area); + + /** OPTIONAL: Set a pixel in a buffer according to the special requirements of the display + * Can be used for color format not supported in LittelvGL. E.g. 2 bit -> 4 gray scales + * @note Much slower then drawing with supported color formats.*/ + void (*set_px_cb)(struct _lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa); + + void (*clear_cb)(struct _lv_disp_drv_t * disp_drv, uint8_t * buf, uint32_t size); + + + /** OPTIONAL: Called after every refresh cycle to tell the rendering and flushing time + the + * number of flushed pixels*/ + void (*monitor_cb)(struct _lv_disp_drv_t * disp_drv, uint32_t time, uint32_t px); + + /** OPTIONAL: Called periodically while lvgl waits for operation to be completed. + * For example flushing or GPU + * User can execute very simple tasks here or yield the task*/ + void (*wait_cb)(struct _lv_disp_drv_t * disp_drv); + + /** OPTIONAL: Called when lvgl needs any CPU cache that affects rendering to be cleaned*/ + void (*clean_dcache_cb)(struct _lv_disp_drv_t * disp_drv); + + /** OPTIONAL: called when driver parameters are updated */ + void (*drv_update_cb)(struct _lv_disp_drv_t * disp_drv); + + /** OPTIONAL: called when start rendering */ + void (*render_start_cb)(struct _lv_disp_drv_t * disp_drv); + + /** On CHROMA_KEYED images this color will be transparent. + * `LV_COLOR_CHROMA_KEY` by default. (lv_conf.h)*/ + lv_color_t color_chroma_key; + + lv_draw_ctx_t * draw_ctx; + void (*draw_ctx_init)(struct _lv_disp_drv_t * disp_drv, lv_draw_ctx_t * draw_ctx); + void (*draw_ctx_deinit)(struct _lv_disp_drv_t * disp_drv, lv_draw_ctx_t * draw_ctx); + size_t draw_ctx_size; + +#if LV_USE_USER_DATA + void * user_data; /**< Custom display driver user data*/ +#endif + +} lv_disp_drv_t; + +/** + * Display structure. + * @note `lv_disp_drv_t` should be the first member of the structure. + */ +typedef struct _lv_disp_t { + /**< Driver to the display*/ + struct _lv_disp_drv_t * driver; + + /**< A timer which periodically checks the dirty areas and refreshes them*/ + lv_timer_t * refr_timer; + + /**< The theme assigned to the screen*/ + struct _lv_theme_t * theme; + + /** Screens of the display*/ + struct _lv_obj_t ** screens; /**< Array of screen objects.*/ + struct _lv_obj_t * act_scr; /**< Currently active screen on this display*/ + struct _lv_obj_t * prev_scr; /**< Previous screen. Used during screen animations*/ + struct _lv_obj_t * scr_to_load; /**< The screen prepared to load in lv_scr_load_anim*/ + struct _lv_obj_t * top_layer; /**< @see lv_disp_get_layer_top*/ + struct _lv_obj_t * sys_layer; /**< @see lv_disp_get_layer_sys*/ + uint32_t screen_cnt; +uint8_t draw_prev_over_act : + 1; /**< 1: Draw previous screen over active screen*/ +uint8_t del_prev : + 1; /**< 1: Automatically delete the previous screen when the screen load animation is ready*/ + uint8_t rendering_in_progress : 1; /**< 1: The current screen rendering is in progress*/ + + lv_opa_t bg_opa; /**flush` you should use DMA or similar hardware to send + * the image to the display in the background. + * It lets LVGL to render next frame into the other buffer while previous is being + * sent. Set to `NULL` if unused. + * @param size_in_px_cnt size of the `buf1` and `buf2` in pixel count. + */ +void lv_disp_draw_buf_init(lv_disp_draw_buf_t * draw_buf, void * buf1, void * buf2, uint32_t size_in_px_cnt); + +/** + * Register an initialized display driver. + * Automatically set the first display as active. + * @param driver pointer to an initialized 'lv_disp_drv_t' variable. Only its pointer is saved! + * @return pointer to the new display or NULL on error + */ +lv_disp_t * lv_disp_drv_register(lv_disp_drv_t * driver); + +/** + * Update the driver in run time. + * @param disp pointer to a display. (return value of `lv_disp_drv_register`) + * @param new_drv pointer to the new driver + */ +void lv_disp_drv_update(lv_disp_t * disp, lv_disp_drv_t * new_drv); + +/** + * Remove a display + * @param disp pointer to display + */ +void lv_disp_remove(lv_disp_t * disp); + +/** + * Set a default display. The new screens will be created on it by default. + * @param disp pointer to a display + */ +void lv_disp_set_default(lv_disp_t * disp); + +/** + * Get the default display + * @return pointer to the default display + */ +lv_disp_t * lv_disp_get_default(void); + +/** + * Get the horizontal resolution of a display + * @param disp pointer to a display (NULL to use the default display) + * @return the horizontal resolution of the display + */ +lv_coord_t lv_disp_get_hor_res(lv_disp_t * disp); + +/** + * Get the vertical resolution of a display + * @param disp pointer to a display (NULL to use the default display) + * @return the vertical resolution of the display + */ +lv_coord_t lv_disp_get_ver_res(lv_disp_t * disp); + +/** + * Get the full / physical horizontal resolution of a display + * @param disp pointer to a display (NULL to use the default display) + * @return the full / physical horizontal resolution of the display + */ +lv_coord_t lv_disp_get_physical_hor_res(lv_disp_t * disp); + +/** + * Get the full / physical vertical resolution of a display + * @param disp pointer to a display (NULL to use the default display) + * @return the full / physical vertical resolution of the display + */ +lv_coord_t lv_disp_get_physical_ver_res(lv_disp_t * disp); + +/** + * Get the horizontal offset from the full / physical display + * @param disp pointer to a display (NULL to use the default display) + * @return the horizontal offset from the full / physical display + */ +lv_coord_t lv_disp_get_offset_x(lv_disp_t * disp); + +/** + * Get the vertical offset from the full / physical display + * @param disp pointer to a display (NULL to use the default display) + * @return the horizontal offset from the full / physical display + */ +lv_coord_t lv_disp_get_offset_y(lv_disp_t * disp); + +/** + * Get if anti-aliasing is enabled for a display or not + * @param disp pointer to a display (NULL to use the default display) + * @return true: anti-aliasing is enabled; false: disabled + */ +bool lv_disp_get_antialiasing(lv_disp_t * disp); + +/** + * Get the DPI of the display + * @param disp pointer to a display (NULL to use the default display) + * @return dpi of the display + */ +lv_coord_t lv_disp_get_dpi(const lv_disp_t * disp); + + +/** + * Set the rotation of this display. + * @param disp pointer to a display (NULL to use the default display) + * @param rotation rotation angle + */ +void lv_disp_set_rotation(lv_disp_t * disp, lv_disp_rot_t rotation); + +/** + * Get the current rotation of this display. + * @param disp pointer to a display (NULL to use the default display) + * @return rotation angle + */ +lv_disp_rot_t lv_disp_get_rotation(lv_disp_t * disp); + +//! @cond Doxygen_Suppress + +/** + * Call in the display driver's `flush_cb` function when the flushing is finished + * @param disp_drv pointer to display driver in `flush_cb` where this function is called + */ +LV_ATTRIBUTE_FLUSH_READY void lv_disp_flush_ready(lv_disp_drv_t * disp_drv); + +/** + * Tell if it's the last area of the refreshing process. + * Can be called from `flush_cb` to execute some special display refreshing if needed when all areas area flushed. + * @param disp_drv pointer to display driver + * @return true: it's the last area to flush; false: there are other areas too which will be refreshed soon + */ +LV_ATTRIBUTE_FLUSH_READY bool lv_disp_flush_is_last(lv_disp_drv_t * disp_drv); + +//! @endcond + +/** + * Get the next display. + * @param disp pointer to the current display. NULL to initialize. + * @return the next display or NULL if no more. Give the first display when the parameter is NULL + */ +lv_disp_t * lv_disp_get_next(lv_disp_t * disp); + +/** + * Get the internal buffer of a display + * @param disp pointer to a display + * @return pointer to the internal buffers + */ +lv_disp_draw_buf_t * lv_disp_get_draw_buf(lv_disp_t * disp); + +void lv_disp_drv_use_generic_set_px_cb(lv_disp_drv_t * disp_drv, lv_img_cf_t cf); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal_indev.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal_indev.c new file mode 100644 index 0000000..c3661e4 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal_indev.c @@ -0,0 +1,195 @@ +/** + * @file lv_hal_indev.c + * + * @description Input device HAL interface + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_assert.h" +#include "../hal/lv_hal_indev.h" +#include "../core/lv_indev.h" +#include "../misc/lv_mem.h" +#include "../misc/lv_gc.h" +#include "lv_hal_disp.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#if LV_LOG_TRACE_INDEV + #define INDEV_TRACE(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define INDEV_TRACE(...) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Initialize an input device driver with default values. + * It is used to surly have known values in the fields ant not memory junk. + * After it you can set the fields. + * @param driver pointer to driver variable to initialize + */ +void lv_indev_drv_init(lv_indev_drv_t * driver) +{ + lv_memset_00(driver, sizeof(lv_indev_drv_t)); + + driver->type = LV_INDEV_TYPE_NONE; + driver->scroll_limit = LV_INDEV_DEF_SCROLL_LIMIT; + driver->scroll_throw = LV_INDEV_DEF_SCROLL_THROW; + driver->long_press_time = LV_INDEV_DEF_LONG_PRESS_TIME; + driver->long_press_repeat_time = LV_INDEV_DEF_LONG_PRESS_REP_TIME; + driver->gesture_limit = LV_INDEV_DEF_GESTURE_LIMIT; + driver->gesture_min_velocity = LV_INDEV_DEF_GESTURE_MIN_VELOCITY; +} + +/** + * Register an initialized input device driver. + * @param driver pointer to an initialized 'lv_indev_drv_t' variable. + * Only pointer is saved, so the driver should be static or dynamically allocated. + * @return pointer to the new input device or NULL on error + */ +lv_indev_t * lv_indev_drv_register(lv_indev_drv_t * driver) +{ + if(driver->disp == NULL) driver->disp = lv_disp_get_default(); + + if(driver->disp == NULL) { + LV_LOG_WARN("lv_indev_drv_register: no display registered hence can't attach the indev to " + "a display"); + return NULL; + } + + lv_indev_t * indev = _lv_ll_ins_head(&LV_GC_ROOT(_lv_indev_ll)); + LV_ASSERT_MALLOC(indev); + if(!indev) { + return NULL; + } + + lv_memset_00(indev, sizeof(lv_indev_t)); + indev->driver = driver; + + indev->proc.reset_query = 1; + indev->driver->read_timer = lv_timer_create(lv_indev_read_timer_cb, LV_INDEV_DEF_READ_PERIOD, indev); + + return indev; +} + +/** + * Update the driver in run time. + * @param indev pointer to a input device. (return value of `lv_indev_drv_register`) + * @param new_drv pointer to the new driver + */ +void lv_indev_drv_update(lv_indev_t * indev, lv_indev_drv_t * new_drv) +{ + LV_ASSERT_NULL(indev); + LV_ASSERT_NULL(indev->driver); + LV_ASSERT_NULL(indev->driver->read_timer); + lv_timer_del(indev->driver->read_timer); + + LV_ASSERT_NULL(new_drv); + if(new_drv->disp == NULL) { + new_drv->disp = lv_disp_get_default(); + } + if(new_drv->disp == NULL) { + LV_LOG_WARN("lv_indev_drv_register: no display registered hence can't attach the indev to " + "a display"); + indev->proc.disabled = true; + return; + } + + indev->driver = new_drv; + indev->driver->read_timer = lv_timer_create(lv_indev_read_timer_cb, LV_INDEV_DEF_READ_PERIOD, indev); + indev->proc.reset_query = 1; +} + +/** +* Remove the provided input device. Make sure not to use the provided input device afterwards anymore. +* @param indev pointer to delete +*/ +void lv_indev_delete(lv_indev_t * indev) +{ + LV_ASSERT_NULL(indev); + LV_ASSERT_NULL(indev->driver); + LV_ASSERT_NULL(indev->driver->read_timer); + /*Clean up the read timer first*/ + lv_timer_del(indev->driver->read_timer); + /*Remove the input device from the list*/ + _lv_ll_remove(&LV_GC_ROOT(_lv_indev_ll), indev); + /*Free the memory of the input device*/ + lv_mem_free(indev); +} + +/** + * Get the next input device. + * @param indev pointer to the current input device. NULL to initialize. + * @return the next input devise or NULL if no more. Give the first input device when the parameter + * is NULL + */ +lv_indev_t * lv_indev_get_next(lv_indev_t * indev) +{ + if(indev == NULL) + return _lv_ll_get_head(&LV_GC_ROOT(_lv_indev_ll)); + else + return _lv_ll_get_next(&LV_GC_ROOT(_lv_indev_ll), indev); +} + +/** + * Read data from an input device. + * @param indev pointer to an input device + * @param data input device will write its data here + */ +void _lv_indev_read(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_memset_00(data, sizeof(lv_indev_data_t)); + + /* For touchpad sometimes users don't set the last pressed coordinate on release. + * So be sure a coordinates are initialized to the last point */ + if(indev->driver->type == LV_INDEV_TYPE_POINTER) { + data->point.x = indev->proc.types.pointer.last_raw_point.x; + data->point.y = indev->proc.types.pointer.last_raw_point.y; + } + /*Similarly set at least the last key in case of the user doesn't set it on release*/ + else if(indev->driver->type == LV_INDEV_TYPE_KEYPAD) { + data->key = indev->proc.types.keypad.last_key; + } + /*For compatibility assume that used button was enter (encoder push)*/ + else if(indev->driver->type == LV_INDEV_TYPE_ENCODER) { + data->key = LV_KEY_ENTER; + } + + if(indev->driver->read_cb) { + INDEV_TRACE("calling indev_read_cb"); + indev->driver->read_cb(indev->driver, data); + } + else { + LV_LOG_WARN("indev_read_cb is not registered"); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal_indev.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal_indev.h new file mode 100644 index 0000000..ca51a08 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal_indev.h @@ -0,0 +1,239 @@ +/** + * @file lv_hal_indev.h + * + * @description Input Device HAL interface layer header file + * + */ + +#ifndef LV_HAL_INDEV_H +#define LV_HAL_INDEV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include +#include +#include "../misc/lv_area.h" +#include "../misc/lv_timer.h" + +/********************* + * DEFINES + *********************/ + +/*Drag threshold in pixels*/ +#define LV_INDEV_DEF_SCROLL_LIMIT 10 + +/*Drag throw slow-down in [%]. Greater value -> faster slow-down*/ +#define LV_INDEV_DEF_SCROLL_THROW 10 + +/*Long press time in milliseconds. + *Time to send `LV_EVENT_LONG_PRESSSED`)*/ +#define LV_INDEV_DEF_LONG_PRESS_TIME 400 + +/*Repeated trigger period in long press [ms] + *Time between `LV_EVENT_LONG_PRESSED_REPEAT*/ +#define LV_INDEV_DEF_LONG_PRESS_REP_TIME 100 + + +/*Gesture threshold in pixels*/ +#define LV_INDEV_DEF_GESTURE_LIMIT 50 + +/*Gesture min velocity at release before swipe (pixels)*/ +#define LV_INDEV_DEF_GESTURE_MIN_VELOCITY 3 + + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_obj_t; +struct _lv_disp_t; +struct _lv_group_t; +struct _lv_indev_t; +struct _lv_indev_drv_t; + +/** Possible input device types*/ +typedef enum { + LV_INDEV_TYPE_NONE, /**< Uninitialized state*/ + LV_INDEV_TYPE_POINTER, /**< Touch pad, mouse, external button*/ + LV_INDEV_TYPE_KEYPAD, /**< Keypad or keyboard*/ + LV_INDEV_TYPE_BUTTON, /**< External (hardware button) which is assigned to a specific point of the screen*/ + LV_INDEV_TYPE_ENCODER, /**< Encoder with only Left, Right turn and a Button*/ +} lv_indev_type_t; + +/** States for input devices*/ +typedef enum { + LV_INDEV_STATE_RELEASED = 0, + LV_INDEV_STATE_PRESSED +} lv_indev_state_t; + +/** Data structure passed to an input driver to fill*/ +typedef struct { + lv_point_t point; /**< For LV_INDEV_TYPE_POINTER the currently pressed point*/ + uint32_t key; /**< For LV_INDEV_TYPE_KEYPAD the currently pressed key*/ + uint32_t btn_id; /**< For LV_INDEV_TYPE_BUTTON the currently pressed button*/ + int16_t enc_diff; /**< For LV_INDEV_TYPE_ENCODER number of steps since the previous read*/ + + lv_indev_state_t state; /**< LV_INDEV_STATE_REL or LV_INDEV_STATE_PR*/ + bool continue_reading; /**< If set to true, the read callback is invoked again*/ +} lv_indev_data_t; + +/** Initialized by the user and registered by 'lv_indev_add()'*/ +typedef struct _lv_indev_drv_t { + + /**< Input device type*/ + lv_indev_type_t type; + + /**< Function pointer to read input device data.*/ + void (*read_cb)(struct _lv_indev_drv_t * indev_drv, lv_indev_data_t * data); + + /** Called when an action happened on the input device. + * The second parameter is the event from `lv_event_t`*/ + void (*feedback_cb)(struct _lv_indev_drv_t *, uint8_t); + +#if LV_USE_USER_DATA + void * user_data; +#endif + + /**< Pointer to the assigned display*/ + struct _lv_disp_t * disp; + + /**< Timer to periodically read the input device*/ + lv_timer_t * read_timer; + + /**< Number of pixels to slide before actually drag the object*/ + uint8_t scroll_limit; + + /**< Drag throw slow-down in [%]. Greater value means faster slow-down*/ + uint8_t scroll_throw; + + /**< At least this difference should be between two points to evaluate as gesture*/ + uint8_t gesture_min_velocity; + + /**< At least this difference should be to send a gesture*/ + uint8_t gesture_limit; + + /**< Long press time in milliseconds*/ + uint16_t long_press_time; + + /**< Repeated trigger period in long press [ms]*/ + uint16_t long_press_repeat_time; +} lv_indev_drv_t; + +/** Run time data of input devices + * Internally used by the library, you should not need to touch it. + */ +typedef struct _lv_indev_proc_t { + lv_indev_state_t state; /**< Current state of the input device.*/ + /*Flags*/ + uint8_t long_pr_sent : 1; + uint8_t reset_query : 1; + uint8_t disabled : 1; + uint8_t wait_until_release : 1; + + union { + struct { + /*Pointer and button data*/ + lv_point_t act_point; /**< Current point of input device.*/ + lv_point_t last_point; /**< Last point of input device.*/ + lv_point_t last_raw_point; /**< Last point read from read_cb. */ + lv_point_t vect; /**< Difference between `act_point` and `last_point`.*/ + lv_point_t scroll_sum; /*Count the dragged pixels to check LV_INDEV_DEF_SCROLL_LIMIT*/ + lv_point_t scroll_throw_vect; + lv_point_t scroll_throw_vect_ori; + struct _lv_obj_t * act_obj; /*The object being pressed*/ + struct _lv_obj_t * last_obj; /*The last object which was pressed*/ + struct _lv_obj_t * scroll_obj; /*The object being scrolled*/ + struct _lv_obj_t * last_pressed; /*The lastly pressed object*/ + lv_area_t scroll_area; + + lv_point_t gesture_sum; /*Count the gesture pixels to check LV_INDEV_DEF_GESTURE_LIMIT*/ + /*Flags*/ + lv_dir_t scroll_dir : 4; + lv_dir_t gesture_dir : 4; + uint8_t gesture_sent : 1; + } pointer; + struct { + /*Keypad data*/ + lv_indev_state_t last_state; + uint32_t last_key; + } keypad; + } types; + + uint32_t pr_timestamp; /**< Pressed time stamp*/ + uint32_t longpr_rep_timestamp; /**< Long press repeat time stamp*/ +} _lv_indev_proc_t; + +/** The main input device descriptor with driver, runtime data ('proc') and some additional + * information*/ +typedef struct _lv_indev_t { + struct _lv_indev_drv_t * driver; + _lv_indev_proc_t proc; + struct _lv_obj_t * cursor; /**< Cursor for LV_INPUT_TYPE_POINTER*/ + struct _lv_group_t * group; /**< Keypad destination group*/ + const lv_point_t * btn_points; /**< Array points assigned to the button ()screen will be pressed + here by the buttons*/ +} lv_indev_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize an input device driver with default values. + * It is used to surely have known values in the fields and not memory junk. + * After it you can set the fields. + * @param driver pointer to driver variable to initialize + */ +void lv_indev_drv_init(struct _lv_indev_drv_t * driver); + +/** + * Register an initialized input device driver. + * @param driver pointer to an initialized 'lv_indev_drv_t' variable (can be local variable) + * @return pointer to the new input device or NULL on error + */ +lv_indev_t * lv_indev_drv_register(struct _lv_indev_drv_t * driver); + +/** + * Update the driver in run time. + * @param indev pointer to an input device. (return value of `lv_indev_drv_register`) + * @param new_drv pointer to the new driver + */ +void lv_indev_drv_update(lv_indev_t * indev, struct _lv_indev_drv_t * new_drv); + +/** +* Remove the provided input device. Make sure not to use the provided input device afterwards anymore. +* @param indev pointer to delete +*/ +void lv_indev_delete(lv_indev_t * indev); + +/** + * Get the next input device. + * @param indev pointer to the current input device. NULL to initialize. + * @return the next input device or NULL if there are no more. Provide the first input device when + * the parameter is NULL + */ +lv_indev_t * lv_indev_get_next(lv_indev_t * indev); + +/** + * Read data from an input device. + * @param indev pointer to an input device + * @param data input device will write its data here + */ +void _lv_indev_read(lv_indev_t * indev, lv_indev_data_t * data); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal_tick.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal_tick.c new file mode 100644 index 0000000..c12a594 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal_tick.c @@ -0,0 +1,104 @@ +/** + * @file lv_hal_tick.c + * Provide access to the system tick with 1 millisecond resolution + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_hal_tick.h" +#include + +#if LV_TICK_CUSTOM == 1 + #include LV_TICK_CUSTOM_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ +#if !LV_TICK_CUSTOM + static uint32_t sys_time = 0; + static volatile uint8_t tick_irq_flag; +#endif + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +#if !LV_TICK_CUSTOM +/** + * You have to call this function periodically + * @param tick_period the call period of this function in milliseconds + */ +LV_ATTRIBUTE_TICK_INC void lv_tick_inc(uint32_t tick_period) +{ + tick_irq_flag = 0; + sys_time += tick_period; +} +#endif + +/** + * Get the elapsed milliseconds since start up + * @return the elapsed milliseconds + */ +uint32_t lv_tick_get(void) +{ +#if LV_TICK_CUSTOM == 0 + + /*If `lv_tick_inc` is called from an interrupt while `sys_time` is read + *the result might be corrupted. + *This loop detects if `lv_tick_inc` was called while reading `sys_time`. + *If `tick_irq_flag` was cleared in `lv_tick_inc` try to read again + *until `tick_irq_flag` remains `1`.*/ + uint32_t result; + do { + tick_irq_flag = 1; + result = sys_time; + } while(!tick_irq_flag); /*Continue until see a non interrupted cycle*/ + + return result; +#else + return LV_TICK_CUSTOM_SYS_TIME_EXPR; +#endif +} + +/** + * Get the elapsed milliseconds since a previous time stamp + * @param prev_tick a previous time stamp (return value of lv_tick_get() ) + * @return the elapsed milliseconds since 'prev_tick' + */ +uint32_t lv_tick_elaps(uint32_t prev_tick) +{ + uint32_t act_time = lv_tick_get(); + + /*If there is no overflow in sys_time simple subtract*/ + if(act_time >= prev_tick) { + prev_tick = act_time - prev_tick; + } + else { + prev_tick = UINT32_MAX - prev_tick + 1; + prev_tick += act_time; + } + + return prev_tick; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal_tick.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal_tick.h new file mode 100644 index 0000000..949f56b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/hal/lv_hal_tick.h @@ -0,0 +1,69 @@ +/** + * @file lv_hal_tick.h + * Provide access to the system tick with 1 millisecond resolution + */ + +#ifndef LV_HAL_TICK_H +#define LV_HAL_TICK_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include +#include + +/********************* + * DEFINES + *********************/ +#ifndef LV_ATTRIBUTE_TICK_INC +#define LV_ATTRIBUTE_TICK_INC +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +//! @cond Doxygen_Suppress + +#if !LV_TICK_CUSTOM +/** + * You have to call this function periodically + * @param tick_period the call period of this function in milliseconds + */ +LV_ATTRIBUTE_TICK_INC void lv_tick_inc(uint32_t tick_period); +#endif + +//! @endcond + +/** + * Get the elapsed milliseconds since start up + * @return the elapsed milliseconds + */ +uint32_t lv_tick_get(void); + +/** + * Get the elapsed milliseconds since a previous time stamp + * @param prev_tick a previous time stamp (return value of lv_tick_get() ) + * @return the elapsed milliseconds since 'prev_tick' + */ +uint32_t lv_tick_elaps(uint32_t prev_tick); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_HAL_TICK_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/lv_api_map.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/lv_api_map.h new file mode 100644 index 0000000..f2b640a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/lv_api_map.h @@ -0,0 +1,88 @@ +/** + * @file lv_api_map.h + * + */ + +#ifndef LV_API_MAP_H +#define LV_API_MAP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lvgl.h" + +/********************* + * DEFINES + *********************/ + +#define LV_NO_TASK_READY LV_NO_TIMER_READY +#define LV_INDEV_STATE_REL LV_INDEV_STATE_RELEASED +#define LV_INDEV_STATE_PR LV_INDEV_STATE_PRESSED +#define LV_OBJ_FLAG_SNAPABLE LV_OBJ_FLAG_SNAPPABLE /*Fixed typo*/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +static inline LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_task_handler(void) +{ + return lv_timer_handler(); +} + +/********************** + * MACROS + **********************/ + + +/********************** + * INLINE FUNCTIONS + **********************/ + +/** + * Move the object to the foreground. + * It will look like if it was created as the last child of its parent. + * It also means it can cover any of the siblings. + * @param obj pointer to an object + */ +static inline void lv_obj_move_foreground(lv_obj_t * obj) +{ + lv_obj_t * parent = lv_obj_get_parent(obj); + lv_obj_move_to_index(obj, lv_obj_get_child_cnt(parent) - 1); +} + +/** + * Move the object to the background. + * It will look like if it was created as the first child of its parent. + * It also means any of the siblings can cover the object. + * @param obj pointer to an object + */ +static inline void lv_obj_move_background(lv_obj_t * obj) +{ + lv_obj_move_to_index(obj, 0); +} + + + +/********************** + * DEPRECATED FUNCTIONS + **********************/ + +static inline uint32_t lv_obj_get_child_id(const struct _lv_obj_t * obj) +{ + LV_LOG_WARN("lv_obj_get_child_id(obj) is deprecated, please use lv_obj_get_index(obj)."); + return lv_obj_get_index(obj); +} + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_API_MAP_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/lv_conf_internal.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/lv_conf_internal.h new file mode 100644 index 0000000..97807fe --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/lv_conf_internal.h @@ -0,0 +1,2469 @@ +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_conf_internal.h + * Make sure all the defines of lv_conf.h have a default value +**/ + +#ifndef LV_CONF_INTERNAL_H +#define LV_CONF_INTERNAL_H +/* clang-format off */ + +#include + +/* Handle special Kconfig options */ +#ifndef LV_KCONFIG_IGNORE + #include "lv_conf_kconfig.h" + #ifdef CONFIG_LV_CONF_SKIP + #define LV_CONF_SKIP + #endif +#endif + +/*If "lv_conf.h" is available from here try to use it later.*/ +#ifdef __has_include + #if __has_include("lv_conf.h") + #ifndef LV_CONF_INCLUDE_SIMPLE + #define LV_CONF_INCLUDE_SIMPLE + #endif + #endif +#endif + +/*If lv_conf.h is not skipped include it*/ +#ifndef LV_CONF_SKIP + #ifdef LV_CONF_PATH /*If there is a path defined for lv_conf.h use it*/ + #define __LV_TO_STR_AUX(x) #x + #define __LV_TO_STR(x) __LV_TO_STR_AUX(x) + #include __LV_TO_STR(LV_CONF_PATH) + #undef __LV_TO_STR_AUX + #undef __LV_TO_STR + #elif defined(LV_CONF_INCLUDE_SIMPLE) /*Or simply include lv_conf.h is enabled*/ + #include "lv_conf.h" + #else + #include "../../lv_conf.h" /*Else assume lv_conf.h is next to the lvgl folder*/ + #endif + #if !defined(LV_CONF_H) && !defined(LV_CONF_SUPPRESS_DEFINE_CHECK) + /* #include will sometimes silently fail when __has_include is used */ + /* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80753 */ + #pragma message("Possible failure to include lv_conf.h, please read the comment in this file if you get errors") + #endif +#endif + +#ifdef CONFIG_LV_COLOR_DEPTH + #define _LV_KCONFIG_PRESENT +#endif + +/*---------------------------------- + * Start parsing lv_conf_template.h + -----------------------------------*/ + +#include + +/*==================== + COLOR SETTINGS + *====================*/ + +/*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/ +#ifndef LV_COLOR_DEPTH + #ifdef CONFIG_LV_COLOR_DEPTH + #define LV_COLOR_DEPTH CONFIG_LV_COLOR_DEPTH + #else + #define LV_COLOR_DEPTH 16 + #endif +#endif + +/*Swap the 2 bytes of RGB565 color. Useful if the display has an 8-bit interface (e.g. SPI)*/ +#ifndef LV_COLOR_16_SWAP + #ifdef CONFIG_LV_COLOR_16_SWAP + #define LV_COLOR_16_SWAP CONFIG_LV_COLOR_16_SWAP + #else + #define LV_COLOR_16_SWAP 0 + #endif +#endif + +/*Enable features to draw on transparent background. + *It's required if opa, and transform_* style properties are used. + *Can be also used if the UI is above another layer, e.g. an OSD menu or video player.*/ +#ifndef LV_COLOR_SCREEN_TRANSP + #ifdef CONFIG_LV_COLOR_SCREEN_TRANSP + #define LV_COLOR_SCREEN_TRANSP CONFIG_LV_COLOR_SCREEN_TRANSP + #else + #define LV_COLOR_SCREEN_TRANSP 0 + #endif +#endif + +/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. + * 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */ +#ifndef LV_COLOR_MIX_ROUND_OFS + #ifdef CONFIG_LV_COLOR_MIX_ROUND_OFS + #define LV_COLOR_MIX_ROUND_OFS CONFIG_LV_COLOR_MIX_ROUND_OFS + #else + #define LV_COLOR_MIX_ROUND_OFS 0 + #endif +#endif + +/*Images pixels with this color will not be drawn if they are chroma keyed)*/ +#ifndef LV_COLOR_CHROMA_KEY + #ifdef CONFIG_LV_COLOR_CHROMA_KEY + #define LV_COLOR_CHROMA_KEY CONFIG_LV_COLOR_CHROMA_KEY + #else + #define LV_COLOR_CHROMA_KEY lv_color_hex(0x00ff00) /*pure green*/ + #endif +#endif + +/*========================= + MEMORY SETTINGS + *=========================*/ + +/*1: use custom malloc/free, 0: use the built-in `lv_mem_alloc()` and `lv_mem_free()`*/ +#ifndef LV_MEM_CUSTOM + #ifdef CONFIG_LV_MEM_CUSTOM + #define LV_MEM_CUSTOM CONFIG_LV_MEM_CUSTOM + #else + #define LV_MEM_CUSTOM 0 + #endif +#endif +#if LV_MEM_CUSTOM == 0 + /*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/ + #ifndef LV_MEM_SIZE + #ifdef CONFIG_LV_MEM_SIZE + #define LV_MEM_SIZE CONFIG_LV_MEM_SIZE + #else + #define LV_MEM_SIZE (48U * 1024U) /*[bytes]*/ + #endif + #endif + + /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/ + #ifndef LV_MEM_ADR + #ifdef CONFIG_LV_MEM_ADR + #define LV_MEM_ADR CONFIG_LV_MEM_ADR + #else + #define LV_MEM_ADR 0 /*0: unused*/ + #endif + #endif + /*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/ + #if LV_MEM_ADR == 0 + #ifndef LV_MEM_POOL_INCLUDE + #ifdef CONFIG_LV_MEM_POOL_INCLUDE + #define LV_MEM_POOL_INCLUDE CONFIG_LV_MEM_POOL_INCLUDE + #else + #undef LV_MEM_POOL_INCLUDE + #endif + #endif + #ifndef LV_MEM_POOL_ALLOC + #ifdef CONFIG_LV_MEM_POOL_ALLOC + #define LV_MEM_POOL_ALLOC CONFIG_LV_MEM_POOL_ALLOC + #else + #undef LV_MEM_POOL_ALLOC + #endif + #endif + #endif + +#else /*LV_MEM_CUSTOM*/ + #ifndef LV_MEM_CUSTOM_INCLUDE + #ifdef CONFIG_LV_MEM_CUSTOM_INCLUDE + #define LV_MEM_CUSTOM_INCLUDE CONFIG_LV_MEM_CUSTOM_INCLUDE + #else + #define LV_MEM_CUSTOM_INCLUDE /*Header for the dynamic memory function*/ + #endif + #endif + #ifndef LV_MEM_CUSTOM_ALLOC + #ifdef CONFIG_LV_MEM_CUSTOM_ALLOC + #define LV_MEM_CUSTOM_ALLOC CONFIG_LV_MEM_CUSTOM_ALLOC + #else + #define LV_MEM_CUSTOM_ALLOC malloc + #endif + #endif + #ifndef LV_MEM_CUSTOM_FREE + #ifdef CONFIG_LV_MEM_CUSTOM_FREE + #define LV_MEM_CUSTOM_FREE CONFIG_LV_MEM_CUSTOM_FREE + #else + #define LV_MEM_CUSTOM_FREE free + #endif + #endif + #ifndef LV_MEM_CUSTOM_REALLOC + #ifdef CONFIG_LV_MEM_CUSTOM_REALLOC + #define LV_MEM_CUSTOM_REALLOC CONFIG_LV_MEM_CUSTOM_REALLOC + #else + #define LV_MEM_CUSTOM_REALLOC realloc + #endif + #endif +#endif /*LV_MEM_CUSTOM*/ + +/*Number of the intermediate memory buffer used during rendering and other internal processing mechanisms. + *You will see an error log message if there wasn't enough buffers. */ +#ifndef LV_MEM_BUF_MAX_NUM + #ifdef CONFIG_LV_MEM_BUF_MAX_NUM + #define LV_MEM_BUF_MAX_NUM CONFIG_LV_MEM_BUF_MAX_NUM + #else + #define LV_MEM_BUF_MAX_NUM 16 + #endif +#endif + +/*Use the standard `memcpy` and `memset` instead of LVGL's own functions. (Might or might not be faster).*/ +#ifndef LV_MEMCPY_MEMSET_STD + #ifdef CONFIG_LV_MEMCPY_MEMSET_STD + #define LV_MEMCPY_MEMSET_STD CONFIG_LV_MEMCPY_MEMSET_STD + #else + #define LV_MEMCPY_MEMSET_STD 0 + #endif +#endif + +/*==================== + HAL SETTINGS + *====================*/ + +/*Default display refresh period. LVG will redraw changed areas with this period time*/ +#ifndef LV_DISP_DEF_REFR_PERIOD + #ifdef CONFIG_LV_DISP_DEF_REFR_PERIOD + #define LV_DISP_DEF_REFR_PERIOD CONFIG_LV_DISP_DEF_REFR_PERIOD + #else + #define LV_DISP_DEF_REFR_PERIOD 30 /*[ms]*/ + #endif +#endif + +/*Input device read period in milliseconds*/ +#ifndef LV_INDEV_DEF_READ_PERIOD + #ifdef CONFIG_LV_INDEV_DEF_READ_PERIOD + #define LV_INDEV_DEF_READ_PERIOD CONFIG_LV_INDEV_DEF_READ_PERIOD + #else + #define LV_INDEV_DEF_READ_PERIOD 30 /*[ms]*/ + #endif +#endif + +/*Use a custom tick source that tells the elapsed time in milliseconds. + *It removes the need to manually update the tick with `lv_tick_inc()`)*/ +#ifndef LV_TICK_CUSTOM + #ifdef CONFIG_LV_TICK_CUSTOM + #define LV_TICK_CUSTOM CONFIG_LV_TICK_CUSTOM + #else + #define LV_TICK_CUSTOM 0 + #endif +#endif +#if LV_TICK_CUSTOM + #ifndef LV_TICK_CUSTOM_INCLUDE + #ifdef CONFIG_LV_TICK_CUSTOM_INCLUDE + #define LV_TICK_CUSTOM_INCLUDE CONFIG_LV_TICK_CUSTOM_INCLUDE + #else + #define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/ + #endif + #endif + #ifndef LV_TICK_CUSTOM_SYS_TIME_EXPR + #ifdef CONFIG_LV_TICK_CUSTOM_SYS_TIME_EXPR + #define LV_TICK_CUSTOM_SYS_TIME_EXPR CONFIG_LV_TICK_CUSTOM_SYS_TIME_EXPR + #else + #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/ + #endif + #endif +#endif /*LV_TICK_CUSTOM*/ + +/*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. + *(Not so important, you can adjust it to modify default sizes and spaces)*/ +#ifndef LV_DPI_DEF + #ifdef CONFIG_LV_DPI_DEF + #define LV_DPI_DEF CONFIG_LV_DPI_DEF + #else + #define LV_DPI_DEF 130 /*[px/inch]*/ + #endif +#endif + +/*======================= + * FEATURE CONFIGURATION + *=======================*/ + +/*------------- + * Drawing + *-----------*/ + +/*Enable complex draw engine. + *Required to draw shadow, gradient, rounded corners, circles, arc, skew lines, image transformations or any masks*/ +#ifndef LV_DRAW_COMPLEX + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_DRAW_COMPLEX + #define LV_DRAW_COMPLEX CONFIG_LV_DRAW_COMPLEX + #else + #define LV_DRAW_COMPLEX 0 + #endif + #else + #define LV_DRAW_COMPLEX 1 + #endif +#endif +#if LV_DRAW_COMPLEX != 0 + + /*Allow buffering some shadow calculation. + *LV_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius` + *Caching has LV_SHADOW_CACHE_SIZE^2 RAM cost*/ + #ifndef LV_SHADOW_CACHE_SIZE + #ifdef CONFIG_LV_SHADOW_CACHE_SIZE + #define LV_SHADOW_CACHE_SIZE CONFIG_LV_SHADOW_CACHE_SIZE + #else + #define LV_SHADOW_CACHE_SIZE 0 + #endif + #endif + + /* Set number of maximally cached circle data. + * The circumference of 1/4 circle are saved for anti-aliasing + * radius * 4 bytes are used per circle (the most often used radiuses are saved) + * 0: to disable caching */ + #ifndef LV_CIRCLE_CACHE_SIZE + #ifdef CONFIG_LV_CIRCLE_CACHE_SIZE + #define LV_CIRCLE_CACHE_SIZE CONFIG_LV_CIRCLE_CACHE_SIZE + #else + #define LV_CIRCLE_CACHE_SIZE 4 + #endif + #endif +#endif /*LV_DRAW_COMPLEX*/ + +/** + * "Simple layers" are used when a widget has `style_opa < 255` to buffer the widget into a layer + * and blend it as an image with the given opacity. + * Note that `bg_opa`, `text_opa` etc don't require buffering into layer) + * The widget can be buffered in smaller chunks to avoid using large buffers. + * + * - LV_LAYER_SIMPLE_BUF_SIZE: [bytes] the optimal target buffer size. LVGL will try to allocate it + * - LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE: [bytes] used if `LV_LAYER_SIMPLE_BUF_SIZE` couldn't be allocated. + * + * Both buffer sizes are in bytes. + * "Transformed layers" (where transform_angle/zoom properties are used) use larger buffers + * and can't be drawn in chunks. So these settings affects only widgets with opacity. + */ +#ifndef LV_LAYER_SIMPLE_BUF_SIZE + #ifdef CONFIG_LV_LAYER_SIMPLE_BUF_SIZE + #define LV_LAYER_SIMPLE_BUF_SIZE CONFIG_LV_LAYER_SIMPLE_BUF_SIZE + #else + #define LV_LAYER_SIMPLE_BUF_SIZE (24 * 1024) + #endif +#endif +#ifndef LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE + #ifdef CONFIG_LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE + #define LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE CONFIG_LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE + #else + #define LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE (3 * 1024) + #endif +#endif + +/*Default image cache size. Image caching keeps the images opened. + *If only the built-in image formats are used there is no real advantage of caching. (I.e. if no new image decoder is added) + *With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images. + *However the opened images might consume additional RAM. + *0: to disable caching*/ +#ifndef LV_IMG_CACHE_DEF_SIZE + #ifdef CONFIG_LV_IMG_CACHE_DEF_SIZE + #define LV_IMG_CACHE_DEF_SIZE CONFIG_LV_IMG_CACHE_DEF_SIZE + #else + #define LV_IMG_CACHE_DEF_SIZE 0 + #endif +#endif + +/*Number of stops allowed per gradient. Increase this to allow more stops. + *This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/ +#ifndef LV_GRADIENT_MAX_STOPS + #ifdef CONFIG_LV_GRADIENT_MAX_STOPS + #define LV_GRADIENT_MAX_STOPS CONFIG_LV_GRADIENT_MAX_STOPS + #else + #define LV_GRADIENT_MAX_STOPS 2 + #endif +#endif + +/*Default gradient buffer size. + *When LVGL calculates the gradient "maps" it can save them into a cache to avoid calculating them again. + *LV_GRAD_CACHE_DEF_SIZE sets the size of this cache in bytes. + *If the cache is too small the map will be allocated only while it's required for the drawing. + *0 mean no caching.*/ +#ifndef LV_GRAD_CACHE_DEF_SIZE + #ifdef CONFIG_LV_GRAD_CACHE_DEF_SIZE + #define LV_GRAD_CACHE_DEF_SIZE CONFIG_LV_GRAD_CACHE_DEF_SIZE + #else + #define LV_GRAD_CACHE_DEF_SIZE 0 + #endif +#endif + +/*Allow dithering the gradients (to achieve visual smooth color gradients on limited color depth display) + *LV_DITHER_GRADIENT implies allocating one or two more lines of the object's rendering surface + *The increase in memory consumption is (32 bits * object width) plus 24 bits * object width if using error diffusion */ +#ifndef LV_DITHER_GRADIENT + #ifdef CONFIG_LV_DITHER_GRADIENT + #define LV_DITHER_GRADIENT CONFIG_LV_DITHER_GRADIENT + #else + #define LV_DITHER_GRADIENT 0 + #endif +#endif +#if LV_DITHER_GRADIENT + /*Add support for error diffusion dithering. + *Error diffusion dithering gets a much better visual result, but implies more CPU consumption and memory when drawing. + *The increase in memory consumption is (24 bits * object's width)*/ + #ifndef LV_DITHER_ERROR_DIFFUSION + #ifdef CONFIG_LV_DITHER_ERROR_DIFFUSION + #define LV_DITHER_ERROR_DIFFUSION CONFIG_LV_DITHER_ERROR_DIFFUSION + #else + #define LV_DITHER_ERROR_DIFFUSION 0 + #endif + #endif +#endif + +/*Maximum buffer size to allocate for rotation. + *Only used if software rotation is enabled in the display driver.*/ +#ifndef LV_DISP_ROT_MAX_BUF + #ifdef CONFIG_LV_DISP_ROT_MAX_BUF + #define LV_DISP_ROT_MAX_BUF CONFIG_LV_DISP_ROT_MAX_BUF + #else + #define LV_DISP_ROT_MAX_BUF (10*1024) + #endif +#endif + +/*------------- + * GPU + *-----------*/ + +/*Use Arm's 2D acceleration library Arm-2D */ +#ifndef LV_USE_GPU_ARM2D + #ifdef CONFIG_LV_USE_GPU_ARM2D + #define LV_USE_GPU_ARM2D CONFIG_LV_USE_GPU_ARM2D + #else + #define LV_USE_GPU_ARM2D 0 + #endif +#endif + +/*Use STM32's DMA2D (aka Chrom Art) GPU*/ +#ifndef LV_USE_GPU_STM32_DMA2D + #ifdef CONFIG_LV_USE_GPU_STM32_DMA2D + #define LV_USE_GPU_STM32_DMA2D CONFIG_LV_USE_GPU_STM32_DMA2D + #else + #define LV_USE_GPU_STM32_DMA2D 0 + #endif +#endif +#if LV_USE_GPU_STM32_DMA2D + /*Must be defined to include path of CMSIS header of target processor + e.g. "stm32f769xx.h" or "stm32f429xx.h"*/ + #ifndef LV_GPU_DMA2D_CMSIS_INCLUDE + #ifdef CONFIG_LV_GPU_DMA2D_CMSIS_INCLUDE + #define LV_GPU_DMA2D_CMSIS_INCLUDE CONFIG_LV_GPU_DMA2D_CMSIS_INCLUDE + #else + #define LV_GPU_DMA2D_CMSIS_INCLUDE + #endif + #endif +#endif + +/*Use SWM341's DMA2D GPU*/ +#ifndef LV_USE_GPU_SWM341_DMA2D + #ifdef CONFIG_LV_USE_GPU_SWM341_DMA2D + #define LV_USE_GPU_SWM341_DMA2D CONFIG_LV_USE_GPU_SWM341_DMA2D + #else + #define LV_USE_GPU_SWM341_DMA2D 0 + #endif +#endif +#if LV_USE_GPU_SWM341_DMA2D + #ifndef LV_GPU_SWM341_DMA2D_INCLUDE + #ifdef CONFIG_LV_GPU_SWM341_DMA2D_INCLUDE + #define LV_GPU_SWM341_DMA2D_INCLUDE CONFIG_LV_GPU_SWM341_DMA2D_INCLUDE + #else + #define LV_GPU_SWM341_DMA2D_INCLUDE "SWM341.h" + #endif + #endif +#endif + +/*Use NXP's PXP GPU iMX RTxxx platforms*/ +#ifndef LV_USE_GPU_NXP_PXP + #ifdef CONFIG_LV_USE_GPU_NXP_PXP + #define LV_USE_GPU_NXP_PXP CONFIG_LV_USE_GPU_NXP_PXP + #else + #define LV_USE_GPU_NXP_PXP 0 + #endif +#endif +#if LV_USE_GPU_NXP_PXP + /*1: Add default bare metal and FreeRTOS interrupt handling routines for PXP (lv_gpu_nxp_pxp_osa.c) + * and call lv_gpu_nxp_pxp_init() automatically during lv_init(). Note that symbol SDK_OS_FREE_RTOS + * has to be defined in order to use FreeRTOS OSA, otherwise bare-metal implementation is selected. + *0: lv_gpu_nxp_pxp_init() has to be called manually before lv_init() + */ + #ifndef LV_USE_GPU_NXP_PXP_AUTO_INIT + #ifdef CONFIG_LV_USE_GPU_NXP_PXP_AUTO_INIT + #define LV_USE_GPU_NXP_PXP_AUTO_INIT CONFIG_LV_USE_GPU_NXP_PXP_AUTO_INIT + #else + #define LV_USE_GPU_NXP_PXP_AUTO_INIT 0 + #endif + #endif +#endif + +/*Use NXP's VG-Lite GPU iMX RTxxx platforms*/ +#ifndef LV_USE_GPU_NXP_VG_LITE + #ifdef CONFIG_LV_USE_GPU_NXP_VG_LITE + #define LV_USE_GPU_NXP_VG_LITE CONFIG_LV_USE_GPU_NXP_VG_LITE + #else + #define LV_USE_GPU_NXP_VG_LITE 0 + #endif +#endif + +/*Use SDL renderer API*/ +#ifndef LV_USE_GPU_SDL + #ifdef CONFIG_LV_USE_GPU_SDL + #define LV_USE_GPU_SDL CONFIG_LV_USE_GPU_SDL + #else + #define LV_USE_GPU_SDL 0 + #endif +#endif +#if LV_USE_GPU_SDL + #ifndef LV_GPU_SDL_INCLUDE_PATH + #ifdef CONFIG_LV_GPU_SDL_INCLUDE_PATH + #define LV_GPU_SDL_INCLUDE_PATH CONFIG_LV_GPU_SDL_INCLUDE_PATH + #else + #define LV_GPU_SDL_INCLUDE_PATH + #endif + #endif + /*Texture cache size, 8MB by default*/ + #ifndef LV_GPU_SDL_LRU_SIZE + #ifdef CONFIG_LV_GPU_SDL_LRU_SIZE + #define LV_GPU_SDL_LRU_SIZE CONFIG_LV_GPU_SDL_LRU_SIZE + #else + #define LV_GPU_SDL_LRU_SIZE (1024 * 1024 * 8) + #endif + #endif + /*Custom blend mode for mask drawing, disable if you need to link with older SDL2 lib*/ + #ifndef LV_GPU_SDL_CUSTOM_BLEND_MODE + #ifdef CONFIG_LV_GPU_SDL_CUSTOM_BLEND_MODE + #define LV_GPU_SDL_CUSTOM_BLEND_MODE CONFIG_LV_GPU_SDL_CUSTOM_BLEND_MODE + #else + #define LV_GPU_SDL_CUSTOM_BLEND_MODE (SDL_VERSION_ATLEAST(2, 0, 6)) + #endif + #endif +#endif + +/*------------- + * Logging + *-----------*/ + +/*Enable the log module*/ +#ifndef LV_USE_LOG + #ifdef CONFIG_LV_USE_LOG + #define LV_USE_LOG CONFIG_LV_USE_LOG + #else + #define LV_USE_LOG 0 + #endif +#endif +#if LV_USE_LOG + + /*How important log should be added: + *LV_LOG_LEVEL_TRACE A lot of logs to give detailed information + *LV_LOG_LEVEL_INFO Log important events + *LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem + *LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail + *LV_LOG_LEVEL_USER Only logs added by the user + *LV_LOG_LEVEL_NONE Do not log anything*/ + #ifndef LV_LOG_LEVEL + #ifdef CONFIG_LV_LOG_LEVEL + #define LV_LOG_LEVEL CONFIG_LV_LOG_LEVEL + #else + #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN + #endif + #endif + + /*1: Print the log with 'printf'; + *0: User need to register a callback with `lv_log_register_print_cb()`*/ + #ifndef LV_LOG_PRINTF + #ifdef CONFIG_LV_LOG_PRINTF + #define LV_LOG_PRINTF CONFIG_LV_LOG_PRINTF + #else + #define LV_LOG_PRINTF 0 + #endif + #endif + + /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/ + #ifndef LV_LOG_TRACE_MEM + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_MEM + #define LV_LOG_TRACE_MEM CONFIG_LV_LOG_TRACE_MEM + #else + #define LV_LOG_TRACE_MEM 0 + #endif + #else + #define LV_LOG_TRACE_MEM 1 + #endif + #endif + #ifndef LV_LOG_TRACE_TIMER + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_TIMER + #define LV_LOG_TRACE_TIMER CONFIG_LV_LOG_TRACE_TIMER + #else + #define LV_LOG_TRACE_TIMER 0 + #endif + #else + #define LV_LOG_TRACE_TIMER 1 + #endif + #endif + #ifndef LV_LOG_TRACE_INDEV + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_INDEV + #define LV_LOG_TRACE_INDEV CONFIG_LV_LOG_TRACE_INDEV + #else + #define LV_LOG_TRACE_INDEV 0 + #endif + #else + #define LV_LOG_TRACE_INDEV 1 + #endif + #endif + #ifndef LV_LOG_TRACE_DISP_REFR + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_DISP_REFR + #define LV_LOG_TRACE_DISP_REFR CONFIG_LV_LOG_TRACE_DISP_REFR + #else + #define LV_LOG_TRACE_DISP_REFR 0 + #endif + #else + #define LV_LOG_TRACE_DISP_REFR 1 + #endif + #endif + #ifndef LV_LOG_TRACE_EVENT + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_EVENT + #define LV_LOG_TRACE_EVENT CONFIG_LV_LOG_TRACE_EVENT + #else + #define LV_LOG_TRACE_EVENT 0 + #endif + #else + #define LV_LOG_TRACE_EVENT 1 + #endif + #endif + #ifndef LV_LOG_TRACE_OBJ_CREATE + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_OBJ_CREATE + #define LV_LOG_TRACE_OBJ_CREATE CONFIG_LV_LOG_TRACE_OBJ_CREATE + #else + #define LV_LOG_TRACE_OBJ_CREATE 0 + #endif + #else + #define LV_LOG_TRACE_OBJ_CREATE 1 + #endif + #endif + #ifndef LV_LOG_TRACE_LAYOUT + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_LAYOUT + #define LV_LOG_TRACE_LAYOUT CONFIG_LV_LOG_TRACE_LAYOUT + #else + #define LV_LOG_TRACE_LAYOUT 0 + #endif + #else + #define LV_LOG_TRACE_LAYOUT 1 + #endif + #endif + #ifndef LV_LOG_TRACE_ANIM + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_ANIM + #define LV_LOG_TRACE_ANIM CONFIG_LV_LOG_TRACE_ANIM + #else + #define LV_LOG_TRACE_ANIM 0 + #endif + #else + #define LV_LOG_TRACE_ANIM 1 + #endif + #endif + +#endif /*LV_USE_LOG*/ + +/*------------- + * Asserts + *-----------*/ + +/*Enable asserts if an operation is failed or an invalid data is found. + *If LV_USE_LOG is enabled an error message will be printed on failure*/ +#ifndef LV_USE_ASSERT_NULL + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_ASSERT_NULL + #define LV_USE_ASSERT_NULL CONFIG_LV_USE_ASSERT_NULL + #else + #define LV_USE_ASSERT_NULL 0 + #endif + #else + #define LV_USE_ASSERT_NULL 1 /*Check if the parameter is NULL. (Very fast, recommended)*/ + #endif +#endif +#ifndef LV_USE_ASSERT_MALLOC + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_ASSERT_MALLOC + #define LV_USE_ASSERT_MALLOC CONFIG_LV_USE_ASSERT_MALLOC + #else + #define LV_USE_ASSERT_MALLOC 0 + #endif + #else + #define LV_USE_ASSERT_MALLOC 1 /*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/ + #endif +#endif +#ifndef LV_USE_ASSERT_STYLE + #ifdef CONFIG_LV_USE_ASSERT_STYLE + #define LV_USE_ASSERT_STYLE CONFIG_LV_USE_ASSERT_STYLE + #else + #define LV_USE_ASSERT_STYLE 0 /*Check if the styles are properly initialized. (Very fast, recommended)*/ + #endif +#endif +#ifndef LV_USE_ASSERT_MEM_INTEGRITY + #ifdef CONFIG_LV_USE_ASSERT_MEM_INTEGRITY + #define LV_USE_ASSERT_MEM_INTEGRITY CONFIG_LV_USE_ASSERT_MEM_INTEGRITY + #else + #define LV_USE_ASSERT_MEM_INTEGRITY 0 /*Check the integrity of `lv_mem` after critical operations. (Slow)*/ + #endif +#endif +#ifndef LV_USE_ASSERT_OBJ + #ifdef CONFIG_LV_USE_ASSERT_OBJ + #define LV_USE_ASSERT_OBJ CONFIG_LV_USE_ASSERT_OBJ + #else + #define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/ + #endif +#endif + +/*Add a custom handler when assert happens e.g. to restart the MCU*/ +#ifndef LV_ASSERT_HANDLER_INCLUDE + #ifdef CONFIG_LV_ASSERT_HANDLER_INCLUDE + #define LV_ASSERT_HANDLER_INCLUDE CONFIG_LV_ASSERT_HANDLER_INCLUDE + #else + #define LV_ASSERT_HANDLER_INCLUDE + #endif +#endif +#ifndef LV_ASSERT_HANDLER + #ifdef CONFIG_LV_ASSERT_HANDLER + #define LV_ASSERT_HANDLER CONFIG_LV_ASSERT_HANDLER + #else + #define LV_ASSERT_HANDLER while(1); /*Halt by default*/ + #endif +#endif + +/*------------- + * Others + *-----------*/ + +/*1: Show CPU usage and FPS count*/ +#ifndef LV_USE_PERF_MONITOR + #ifdef CONFIG_LV_USE_PERF_MONITOR + #define LV_USE_PERF_MONITOR CONFIG_LV_USE_PERF_MONITOR + #else + #define LV_USE_PERF_MONITOR 0 + #endif +#endif +#if LV_USE_PERF_MONITOR + #ifndef LV_USE_PERF_MONITOR_POS + #ifdef CONFIG_LV_USE_PERF_MONITOR_POS + #define LV_USE_PERF_MONITOR_POS CONFIG_LV_USE_PERF_MONITOR_POS + #else + #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT + #endif + #endif +#endif + +/*1: Show the used memory and the memory fragmentation + * Requires LV_MEM_CUSTOM = 0*/ +#ifndef LV_USE_MEM_MONITOR + #ifdef CONFIG_LV_USE_MEM_MONITOR + #define LV_USE_MEM_MONITOR CONFIG_LV_USE_MEM_MONITOR + #else + #define LV_USE_MEM_MONITOR 0 + #endif +#endif +#if LV_USE_MEM_MONITOR + #ifndef LV_USE_MEM_MONITOR_POS + #ifdef CONFIG_LV_USE_MEM_MONITOR_POS + #define LV_USE_MEM_MONITOR_POS CONFIG_LV_USE_MEM_MONITOR_POS + #else + #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT + #endif + #endif +#endif + +/*1: Draw random colored rectangles over the redrawn areas*/ +#ifndef LV_USE_REFR_DEBUG + #ifdef CONFIG_LV_USE_REFR_DEBUG + #define LV_USE_REFR_DEBUG CONFIG_LV_USE_REFR_DEBUG + #else + #define LV_USE_REFR_DEBUG 0 + #endif +#endif + +/*Change the built in (v)snprintf functions*/ +#ifndef LV_SPRINTF_CUSTOM + #ifdef CONFIG_LV_SPRINTF_CUSTOM + #define LV_SPRINTF_CUSTOM CONFIG_LV_SPRINTF_CUSTOM + #else + #define LV_SPRINTF_CUSTOM 0 + #endif +#endif +#if LV_SPRINTF_CUSTOM + #ifndef LV_SPRINTF_INCLUDE + #ifdef CONFIG_LV_SPRINTF_INCLUDE + #define LV_SPRINTF_INCLUDE CONFIG_LV_SPRINTF_INCLUDE + #else + #define LV_SPRINTF_INCLUDE + #endif + #endif + #ifndef lv_snprintf + #ifdef CONFIG_LV_SNPRINTF + #define lv_snprintf CONFIG_LV_SNPRINTF + #else + #define lv_snprintf snprintf + #endif + #endif + #ifndef lv_vsnprintf + #ifdef CONFIG_LV_VSNPRINTF + #define lv_vsnprintf CONFIG_LV_VSNPRINTF + #else + #define lv_vsnprintf vsnprintf + #endif + #endif +#else /*LV_SPRINTF_CUSTOM*/ + #ifndef LV_SPRINTF_USE_FLOAT + #ifdef CONFIG_LV_SPRINTF_USE_FLOAT + #define LV_SPRINTF_USE_FLOAT CONFIG_LV_SPRINTF_USE_FLOAT + #else + #define LV_SPRINTF_USE_FLOAT 0 + #endif + #endif +#endif /*LV_SPRINTF_CUSTOM*/ + +#ifndef LV_USE_USER_DATA + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_USER_DATA + #define LV_USE_USER_DATA CONFIG_LV_USE_USER_DATA + #else + #define LV_USE_USER_DATA 0 + #endif + #else + #define LV_USE_USER_DATA 1 + #endif +#endif + +/*Garbage Collector settings + *Used if lvgl is bound to higher level language and the memory is managed by that language*/ +#ifndef LV_ENABLE_GC + #ifdef CONFIG_LV_ENABLE_GC + #define LV_ENABLE_GC CONFIG_LV_ENABLE_GC + #else + #define LV_ENABLE_GC 0 + #endif +#endif +#if LV_ENABLE_GC != 0 + #ifndef LV_GC_INCLUDE + #ifdef CONFIG_LV_GC_INCLUDE + #define LV_GC_INCLUDE CONFIG_LV_GC_INCLUDE + #else + #define LV_GC_INCLUDE "gc.h" /*Include Garbage Collector related things*/ + #endif + #endif +#endif /*LV_ENABLE_GC*/ + +/*===================== + * COMPILER SETTINGS + *====================*/ + +/*For big endian systems set to 1*/ +#ifndef LV_BIG_ENDIAN_SYSTEM + #ifdef CONFIG_LV_BIG_ENDIAN_SYSTEM + #define LV_BIG_ENDIAN_SYSTEM CONFIG_LV_BIG_ENDIAN_SYSTEM + #else + #define LV_BIG_ENDIAN_SYSTEM 0 + #endif +#endif + +/*Define a custom attribute to `lv_tick_inc` function*/ +#ifndef LV_ATTRIBUTE_TICK_INC + #ifdef CONFIG_LV_ATTRIBUTE_TICK_INC + #define LV_ATTRIBUTE_TICK_INC CONFIG_LV_ATTRIBUTE_TICK_INC + #else + #define LV_ATTRIBUTE_TICK_INC + #endif +#endif + +/*Define a custom attribute to `lv_timer_handler` function*/ +#ifndef LV_ATTRIBUTE_TIMER_HANDLER + #ifdef CONFIG_LV_ATTRIBUTE_TIMER_HANDLER + #define LV_ATTRIBUTE_TIMER_HANDLER CONFIG_LV_ATTRIBUTE_TIMER_HANDLER + #else + #define LV_ATTRIBUTE_TIMER_HANDLER + #endif +#endif + +/*Define a custom attribute to `lv_disp_flush_ready` function*/ +#ifndef LV_ATTRIBUTE_FLUSH_READY + #ifdef CONFIG_LV_ATTRIBUTE_FLUSH_READY + #define LV_ATTRIBUTE_FLUSH_READY CONFIG_LV_ATTRIBUTE_FLUSH_READY + #else + #define LV_ATTRIBUTE_FLUSH_READY + #endif +#endif + +/*Required alignment size for buffers*/ +#ifndef LV_ATTRIBUTE_MEM_ALIGN_SIZE + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_ATTRIBUTE_MEM_ALIGN_SIZE + #define LV_ATTRIBUTE_MEM_ALIGN_SIZE CONFIG_LV_ATTRIBUTE_MEM_ALIGN_SIZE + #else + #define LV_ATTRIBUTE_MEM_ALIGN_SIZE 0 + #endif + #else + #define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1 + #endif +#endif + +/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default). + * E.g. __attribute__((aligned(4)))*/ +#ifndef LV_ATTRIBUTE_MEM_ALIGN + #ifdef CONFIG_LV_ATTRIBUTE_MEM_ALIGN + #define LV_ATTRIBUTE_MEM_ALIGN CONFIG_LV_ATTRIBUTE_MEM_ALIGN + #else + #define LV_ATTRIBUTE_MEM_ALIGN + #endif +#endif + +/*Attribute to mark large constant arrays for example font's bitmaps*/ +#ifndef LV_ATTRIBUTE_LARGE_CONST + #ifdef CONFIG_LV_ATTRIBUTE_LARGE_CONST + #define LV_ATTRIBUTE_LARGE_CONST CONFIG_LV_ATTRIBUTE_LARGE_CONST + #else + #define LV_ATTRIBUTE_LARGE_CONST + #endif +#endif + +/*Compiler prefix for a big array declaration in RAM*/ +#ifndef LV_ATTRIBUTE_LARGE_RAM_ARRAY + #ifdef CONFIG_LV_ATTRIBUTE_LARGE_RAM_ARRAY + #define LV_ATTRIBUTE_LARGE_RAM_ARRAY CONFIG_LV_ATTRIBUTE_LARGE_RAM_ARRAY + #else + #define LV_ATTRIBUTE_LARGE_RAM_ARRAY + #endif +#endif + +/*Place performance critical functions into a faster memory (e.g RAM)*/ +#ifndef LV_ATTRIBUTE_FAST_MEM + #ifdef CONFIG_LV_ATTRIBUTE_FAST_MEM + #define LV_ATTRIBUTE_FAST_MEM CONFIG_LV_ATTRIBUTE_FAST_MEM + #else + #define LV_ATTRIBUTE_FAST_MEM + #endif +#endif + +/*Prefix variables that are used in GPU accelerated operations, often these need to be placed in RAM sections that are DMA accessible*/ +#ifndef LV_ATTRIBUTE_DMA + #ifdef CONFIG_LV_ATTRIBUTE_DMA + #define LV_ATTRIBUTE_DMA CONFIG_LV_ATTRIBUTE_DMA + #else + #define LV_ATTRIBUTE_DMA + #endif +#endif + +/*Export integer constant to binding. This macro is used with constants in the form of LV_ that + *should also appear on LVGL binding API such as Micropython.*/ +#ifndef LV_EXPORT_CONST_INT + #ifdef CONFIG_LV_EXPORT_CONST_INT + #define LV_EXPORT_CONST_INT CONFIG_LV_EXPORT_CONST_INT + #else + #define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /*The default value just prevents GCC warning*/ + #endif +#endif + +/*Extend the default -32k..32k coordinate range to -4M..4M by using int32_t for coordinates instead of int16_t*/ +#ifndef LV_USE_LARGE_COORD + #ifdef CONFIG_LV_USE_LARGE_COORD + #define LV_USE_LARGE_COORD CONFIG_LV_USE_LARGE_COORD + #else + #define LV_USE_LARGE_COORD 0 + #endif +#endif + +/*================== + * FONT USAGE + *===================*/ + +/*Montserrat fonts with ASCII range and some symbols using bpp = 4 + *https://fonts.google.com/specimen/Montserrat*/ +#ifndef LV_FONT_MONTSERRAT_8 + #ifdef CONFIG_LV_FONT_MONTSERRAT_8 + #define LV_FONT_MONTSERRAT_8 CONFIG_LV_FONT_MONTSERRAT_8 + #else + #define LV_FONT_MONTSERRAT_8 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_10 + #ifdef CONFIG_LV_FONT_MONTSERRAT_10 + #define LV_FONT_MONTSERRAT_10 CONFIG_LV_FONT_MONTSERRAT_10 + #else + #define LV_FONT_MONTSERRAT_10 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_12 + #ifdef CONFIG_LV_FONT_MONTSERRAT_12 + #define LV_FONT_MONTSERRAT_12 CONFIG_LV_FONT_MONTSERRAT_12 + #else + #define LV_FONT_MONTSERRAT_12 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_14 + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_FONT_MONTSERRAT_14 + #define LV_FONT_MONTSERRAT_14 CONFIG_LV_FONT_MONTSERRAT_14 + #else + #define LV_FONT_MONTSERRAT_14 0 + #endif + #else + #define LV_FONT_MONTSERRAT_14 1 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_16 + #ifdef CONFIG_LV_FONT_MONTSERRAT_16 + #define LV_FONT_MONTSERRAT_16 CONFIG_LV_FONT_MONTSERRAT_16 + #else + #define LV_FONT_MONTSERRAT_16 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_18 + #ifdef CONFIG_LV_FONT_MONTSERRAT_18 + #define LV_FONT_MONTSERRAT_18 CONFIG_LV_FONT_MONTSERRAT_18 + #else + #define LV_FONT_MONTSERRAT_18 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_20 + #ifdef CONFIG_LV_FONT_MONTSERRAT_20 + #define LV_FONT_MONTSERRAT_20 CONFIG_LV_FONT_MONTSERRAT_20 + #else + #define LV_FONT_MONTSERRAT_20 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_22 + #ifdef CONFIG_LV_FONT_MONTSERRAT_22 + #define LV_FONT_MONTSERRAT_22 CONFIG_LV_FONT_MONTSERRAT_22 + #else + #define LV_FONT_MONTSERRAT_22 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_24 + #ifdef CONFIG_LV_FONT_MONTSERRAT_24 + #define LV_FONT_MONTSERRAT_24 CONFIG_LV_FONT_MONTSERRAT_24 + #else + #define LV_FONT_MONTSERRAT_24 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_26 + #ifdef CONFIG_LV_FONT_MONTSERRAT_26 + #define LV_FONT_MONTSERRAT_26 CONFIG_LV_FONT_MONTSERRAT_26 + #else + #define LV_FONT_MONTSERRAT_26 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_28 + #ifdef CONFIG_LV_FONT_MONTSERRAT_28 + #define LV_FONT_MONTSERRAT_28 CONFIG_LV_FONT_MONTSERRAT_28 + #else + #define LV_FONT_MONTSERRAT_28 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_30 + #ifdef CONFIG_LV_FONT_MONTSERRAT_30 + #define LV_FONT_MONTSERRAT_30 CONFIG_LV_FONT_MONTSERRAT_30 + #else + #define LV_FONT_MONTSERRAT_30 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_32 + #ifdef CONFIG_LV_FONT_MONTSERRAT_32 + #define LV_FONT_MONTSERRAT_32 CONFIG_LV_FONT_MONTSERRAT_32 + #else + #define LV_FONT_MONTSERRAT_32 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_34 + #ifdef CONFIG_LV_FONT_MONTSERRAT_34 + #define LV_FONT_MONTSERRAT_34 CONFIG_LV_FONT_MONTSERRAT_34 + #else + #define LV_FONT_MONTSERRAT_34 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_36 + #ifdef CONFIG_LV_FONT_MONTSERRAT_36 + #define LV_FONT_MONTSERRAT_36 CONFIG_LV_FONT_MONTSERRAT_36 + #else + #define LV_FONT_MONTSERRAT_36 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_38 + #ifdef CONFIG_LV_FONT_MONTSERRAT_38 + #define LV_FONT_MONTSERRAT_38 CONFIG_LV_FONT_MONTSERRAT_38 + #else + #define LV_FONT_MONTSERRAT_38 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_40 + #ifdef CONFIG_LV_FONT_MONTSERRAT_40 + #define LV_FONT_MONTSERRAT_40 CONFIG_LV_FONT_MONTSERRAT_40 + #else + #define LV_FONT_MONTSERRAT_40 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_42 + #ifdef CONFIG_LV_FONT_MONTSERRAT_42 + #define LV_FONT_MONTSERRAT_42 CONFIG_LV_FONT_MONTSERRAT_42 + #else + #define LV_FONT_MONTSERRAT_42 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_44 + #ifdef CONFIG_LV_FONT_MONTSERRAT_44 + #define LV_FONT_MONTSERRAT_44 CONFIG_LV_FONT_MONTSERRAT_44 + #else + #define LV_FONT_MONTSERRAT_44 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_46 + #ifdef CONFIG_LV_FONT_MONTSERRAT_46 + #define LV_FONT_MONTSERRAT_46 CONFIG_LV_FONT_MONTSERRAT_46 + #else + #define LV_FONT_MONTSERRAT_46 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_48 + #ifdef CONFIG_LV_FONT_MONTSERRAT_48 + #define LV_FONT_MONTSERRAT_48 CONFIG_LV_FONT_MONTSERRAT_48 + #else + #define LV_FONT_MONTSERRAT_48 0 + #endif +#endif + +/*Demonstrate special features*/ +#ifndef LV_FONT_MONTSERRAT_12_SUBPX + #ifdef CONFIG_LV_FONT_MONTSERRAT_12_SUBPX + #define LV_FONT_MONTSERRAT_12_SUBPX CONFIG_LV_FONT_MONTSERRAT_12_SUBPX + #else + #define LV_FONT_MONTSERRAT_12_SUBPX 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_28_COMPRESSED + #ifdef CONFIG_LV_FONT_MONTSERRAT_28_COMPRESSED + #define LV_FONT_MONTSERRAT_28_COMPRESSED CONFIG_LV_FONT_MONTSERRAT_28_COMPRESSED + #else + #define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /*bpp = 3*/ + #endif +#endif +#ifndef LV_FONT_DEJAVU_16_PERSIAN_HEBREW + #ifdef CONFIG_LV_FONT_DEJAVU_16_PERSIAN_HEBREW + #define LV_FONT_DEJAVU_16_PERSIAN_HEBREW CONFIG_LV_FONT_DEJAVU_16_PERSIAN_HEBREW + #else + #define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /*Hebrew, Arabic, Persian letters and all their forms*/ + #endif +#endif +#ifndef LV_FONT_SIMSUN_16_CJK + #ifdef CONFIG_LV_FONT_SIMSUN_16_CJK + #define LV_FONT_SIMSUN_16_CJK CONFIG_LV_FONT_SIMSUN_16_CJK + #else + #define LV_FONT_SIMSUN_16_CJK 0 /*1000 most common CJK radicals*/ + #endif +#endif + +/*Pixel perfect monospace fonts*/ +#ifndef LV_FONT_UNSCII_8 + #ifdef CONFIG_LV_FONT_UNSCII_8 + #define LV_FONT_UNSCII_8 CONFIG_LV_FONT_UNSCII_8 + #else + #define LV_FONT_UNSCII_8 0 + #endif +#endif +#ifndef LV_FONT_UNSCII_16 + #ifdef CONFIG_LV_FONT_UNSCII_16 + #define LV_FONT_UNSCII_16 CONFIG_LV_FONT_UNSCII_16 + #else + #define LV_FONT_UNSCII_16 0 + #endif +#endif + +/*Optionally declare custom fonts here. + *You can use these fonts as default font too and they will be available globally. + *E.g. #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/ +#ifndef LV_FONT_CUSTOM_DECLARE + #ifdef CONFIG_LV_FONT_CUSTOM_DECLARE + #define LV_FONT_CUSTOM_DECLARE CONFIG_LV_FONT_CUSTOM_DECLARE + #else + #define LV_FONT_CUSTOM_DECLARE + #endif +#endif + +/*Always set a default font*/ +#ifndef LV_FONT_DEFAULT + #ifdef CONFIG_LV_FONT_DEFAULT + #define LV_FONT_DEFAULT CONFIG_LV_FONT_DEFAULT + #else + #define LV_FONT_DEFAULT &lv_font_montserrat_14 + #endif +#endif + +/*Enable handling large font and/or fonts with a lot of characters. + *The limit depends on the font size, font face and bpp. + *Compiler error will be triggered if a font needs it.*/ +#ifndef LV_FONT_FMT_TXT_LARGE + #ifdef CONFIG_LV_FONT_FMT_TXT_LARGE + #define LV_FONT_FMT_TXT_LARGE CONFIG_LV_FONT_FMT_TXT_LARGE + #else + #define LV_FONT_FMT_TXT_LARGE 0 + #endif +#endif + +/*Enables/disables support for compressed fonts.*/ +#ifndef LV_USE_FONT_COMPRESSED + #ifdef CONFIG_LV_USE_FONT_COMPRESSED + #define LV_USE_FONT_COMPRESSED CONFIG_LV_USE_FONT_COMPRESSED + #else + #define LV_USE_FONT_COMPRESSED 0 + #endif +#endif + +/*Enable subpixel rendering*/ +#ifndef LV_USE_FONT_SUBPX + #ifdef CONFIG_LV_USE_FONT_SUBPX + #define LV_USE_FONT_SUBPX CONFIG_LV_USE_FONT_SUBPX + #else + #define LV_USE_FONT_SUBPX 0 + #endif +#endif +#if LV_USE_FONT_SUBPX + /*Set the pixel order of the display. Physical order of RGB channels. Doesn't matter with "normal" fonts.*/ + #ifndef LV_FONT_SUBPX_BGR + #ifdef CONFIG_LV_FONT_SUBPX_BGR + #define LV_FONT_SUBPX_BGR CONFIG_LV_FONT_SUBPX_BGR + #else + #define LV_FONT_SUBPX_BGR 0 /*0: RGB; 1:BGR order*/ + #endif + #endif +#endif + +/*Enable drawing placeholders when glyph dsc is not found*/ +#ifndef LV_USE_FONT_PLACEHOLDER + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_FONT_PLACEHOLDER + #define LV_USE_FONT_PLACEHOLDER CONFIG_LV_USE_FONT_PLACEHOLDER + #else + #define LV_USE_FONT_PLACEHOLDER 0 + #endif + #else + #define LV_USE_FONT_PLACEHOLDER 1 + #endif +#endif + +/*================= + * TEXT SETTINGS + *=================*/ + +/** + * Select a character encoding for strings. + * Your IDE or editor should have the same character encoding + * - LV_TXT_ENC_UTF8 + * - LV_TXT_ENC_ASCII + */ +#ifndef LV_TXT_ENC + #ifdef CONFIG_LV_TXT_ENC + #define LV_TXT_ENC CONFIG_LV_TXT_ENC + #else + #define LV_TXT_ENC LV_TXT_ENC_UTF8 + #endif +#endif + +/*Can break (wrap) texts on these chars*/ +#ifndef LV_TXT_BREAK_CHARS + #ifdef CONFIG_LV_TXT_BREAK_CHARS + #define LV_TXT_BREAK_CHARS CONFIG_LV_TXT_BREAK_CHARS + #else + #define LV_TXT_BREAK_CHARS " ,.;:-_" + #endif +#endif + +/*If a word is at least this long, will break wherever "prettiest" + *To disable, set to a value <= 0*/ +#ifndef LV_TXT_LINE_BREAK_LONG_LEN + #ifdef CONFIG_LV_TXT_LINE_BREAK_LONG_LEN + #define LV_TXT_LINE_BREAK_LONG_LEN CONFIG_LV_TXT_LINE_BREAK_LONG_LEN + #else + #define LV_TXT_LINE_BREAK_LONG_LEN 0 + #endif +#endif + +/*Minimum number of characters in a long word to put on a line before a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#ifndef LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN + #ifdef CONFIG_LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN + #define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN CONFIG_LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN + #else + #define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 + #endif +#endif + +/*Minimum number of characters in a long word to put on a line after a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#ifndef LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN + #ifdef CONFIG_LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN + #define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN CONFIG_LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN + #else + #define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 + #endif +#endif + +/*The control character to use for signalling text recoloring.*/ +#ifndef LV_TXT_COLOR_CMD + #ifdef CONFIG_LV_TXT_COLOR_CMD + #define LV_TXT_COLOR_CMD CONFIG_LV_TXT_COLOR_CMD + #else + #define LV_TXT_COLOR_CMD "#" + #endif +#endif + +/*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts. + *The direction will be processed according to the Unicode Bidirectional Algorithm: + *https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/ +#ifndef LV_USE_BIDI + #ifdef CONFIG_LV_USE_BIDI + #define LV_USE_BIDI CONFIG_LV_USE_BIDI + #else + #define LV_USE_BIDI 0 + #endif +#endif +#if LV_USE_BIDI + /*Set the default direction. Supported values: + *`LV_BASE_DIR_LTR` Left-to-Right + *`LV_BASE_DIR_RTL` Right-to-Left + *`LV_BASE_DIR_AUTO` detect texts base direction*/ + #ifndef LV_BIDI_BASE_DIR_DEF + #ifdef CONFIG_LV_BIDI_BASE_DIR_DEF + #define LV_BIDI_BASE_DIR_DEF CONFIG_LV_BIDI_BASE_DIR_DEF + #else + #define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO + #endif + #endif +#endif + +/*Enable Arabic/Persian processing + *In these languages characters should be replaced with an other form based on their position in the text*/ +#ifndef LV_USE_ARABIC_PERSIAN_CHARS + #ifdef CONFIG_LV_USE_ARABIC_PERSIAN_CHARS + #define LV_USE_ARABIC_PERSIAN_CHARS CONFIG_LV_USE_ARABIC_PERSIAN_CHARS + #else + #define LV_USE_ARABIC_PERSIAN_CHARS 0 + #endif +#endif + +/*================== + * WIDGET USAGE + *================*/ + +/*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/ + +#ifndef LV_USE_ARC + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_ARC + #define LV_USE_ARC CONFIG_LV_USE_ARC + #else + #define LV_USE_ARC 0 + #endif + #else + #define LV_USE_ARC 1 + #endif +#endif + +#ifndef LV_USE_BAR + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_BAR + #define LV_USE_BAR CONFIG_LV_USE_BAR + #else + #define LV_USE_BAR 0 + #endif + #else + #define LV_USE_BAR 1 + #endif +#endif + +#ifndef LV_USE_BTN + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_BTN + #define LV_USE_BTN CONFIG_LV_USE_BTN + #else + #define LV_USE_BTN 0 + #endif + #else + #define LV_USE_BTN 1 + #endif +#endif + +#ifndef LV_USE_BTNMATRIX + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_BTNMATRIX + #define LV_USE_BTNMATRIX CONFIG_LV_USE_BTNMATRIX + #else + #define LV_USE_BTNMATRIX 0 + #endif + #else + #define LV_USE_BTNMATRIX 1 + #endif +#endif + +#ifndef LV_USE_CANVAS + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_CANVAS + #define LV_USE_CANVAS CONFIG_LV_USE_CANVAS + #else + #define LV_USE_CANVAS 0 + #endif + #else + #define LV_USE_CANVAS 1 + #endif +#endif + +#ifndef LV_USE_CHECKBOX + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_CHECKBOX + #define LV_USE_CHECKBOX CONFIG_LV_USE_CHECKBOX + #else + #define LV_USE_CHECKBOX 0 + #endif + #else + #define LV_USE_CHECKBOX 1 + #endif +#endif + +#ifndef LV_USE_DROPDOWN + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_DROPDOWN + #define LV_USE_DROPDOWN CONFIG_LV_USE_DROPDOWN + #else + #define LV_USE_DROPDOWN 0 + #endif + #else + #define LV_USE_DROPDOWN 1 /*Requires: lv_label*/ + #endif +#endif + +#ifndef LV_USE_IMG + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_IMG + #define LV_USE_IMG CONFIG_LV_USE_IMG + #else + #define LV_USE_IMG 0 + #endif + #else + #define LV_USE_IMG 1 /*Requires: lv_label*/ + #endif +#endif + +#ifndef LV_USE_LABEL + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_LABEL + #define LV_USE_LABEL CONFIG_LV_USE_LABEL + #else + #define LV_USE_LABEL 0 + #endif + #else + #define LV_USE_LABEL 1 + #endif +#endif +#if LV_USE_LABEL + #ifndef LV_LABEL_TEXT_SELECTION + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LABEL_TEXT_SELECTION + #define LV_LABEL_TEXT_SELECTION CONFIG_LV_LABEL_TEXT_SELECTION + #else + #define LV_LABEL_TEXT_SELECTION 0 + #endif + #else + #define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/ + #endif + #endif + #ifndef LV_LABEL_LONG_TXT_HINT + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LABEL_LONG_TXT_HINT + #define LV_LABEL_LONG_TXT_HINT CONFIG_LV_LABEL_LONG_TXT_HINT + #else + #define LV_LABEL_LONG_TXT_HINT 0 + #endif + #else + #define LV_LABEL_LONG_TXT_HINT 1 /*Store some extra info in labels to speed up drawing of very long texts*/ + #endif + #endif +#endif + +#ifndef LV_USE_LINE + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_LINE + #define LV_USE_LINE CONFIG_LV_USE_LINE + #else + #define LV_USE_LINE 0 + #endif + #else + #define LV_USE_LINE 1 + #endif +#endif + +#ifndef LV_USE_ROLLER + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_ROLLER + #define LV_USE_ROLLER CONFIG_LV_USE_ROLLER + #else + #define LV_USE_ROLLER 0 + #endif + #else + #define LV_USE_ROLLER 1 /*Requires: lv_label*/ + #endif +#endif +#if LV_USE_ROLLER + #ifndef LV_ROLLER_INF_PAGES + #ifdef CONFIG_LV_ROLLER_INF_PAGES + #define LV_ROLLER_INF_PAGES CONFIG_LV_ROLLER_INF_PAGES + #else + #define LV_ROLLER_INF_PAGES 7 /*Number of extra "pages" when the roller is infinite*/ + #endif + #endif +#endif + +#ifndef LV_USE_SLIDER + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_SLIDER + #define LV_USE_SLIDER CONFIG_LV_USE_SLIDER + #else + #define LV_USE_SLIDER 0 + #endif + #else + #define LV_USE_SLIDER 1 /*Requires: lv_bar*/ + #endif +#endif + +#ifndef LV_USE_SWITCH + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_SWITCH + #define LV_USE_SWITCH CONFIG_LV_USE_SWITCH + #else + #define LV_USE_SWITCH 0 + #endif + #else + #define LV_USE_SWITCH 1 + #endif +#endif + +#ifndef LV_USE_TEXTAREA + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_TEXTAREA + #define LV_USE_TEXTAREA CONFIG_LV_USE_TEXTAREA + #else + #define LV_USE_TEXTAREA 0 + #endif + #else + #define LV_USE_TEXTAREA 1 /*Requires: lv_label*/ + #endif +#endif +#if LV_USE_TEXTAREA != 0 + #ifndef LV_TEXTAREA_DEF_PWD_SHOW_TIME + #ifdef CONFIG_LV_TEXTAREA_DEF_PWD_SHOW_TIME + #define LV_TEXTAREA_DEF_PWD_SHOW_TIME CONFIG_LV_TEXTAREA_DEF_PWD_SHOW_TIME + #else + #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ + #endif + #endif +#endif + +#ifndef LV_USE_TABLE + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_TABLE + #define LV_USE_TABLE CONFIG_LV_USE_TABLE + #else + #define LV_USE_TABLE 0 + #endif + #else + #define LV_USE_TABLE 1 + #endif +#endif + +/*================== + * EXTRA COMPONENTS + *==================*/ + +/*----------- + * Widgets + *----------*/ +#ifndef LV_USE_ANIMIMG + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_ANIMIMG + #define LV_USE_ANIMIMG CONFIG_LV_USE_ANIMIMG + #else + #define LV_USE_ANIMIMG 0 + #endif + #else + #define LV_USE_ANIMIMG 1 + #endif +#endif + +#ifndef LV_USE_CALENDAR + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_CALENDAR + #define LV_USE_CALENDAR CONFIG_LV_USE_CALENDAR + #else + #define LV_USE_CALENDAR 0 + #endif + #else + #define LV_USE_CALENDAR 1 + #endif +#endif +#if LV_USE_CALENDAR + #ifndef LV_CALENDAR_WEEK_STARTS_MONDAY + #ifdef CONFIG_LV_CALENDAR_WEEK_STARTS_MONDAY + #define LV_CALENDAR_WEEK_STARTS_MONDAY CONFIG_LV_CALENDAR_WEEK_STARTS_MONDAY + #else + #define LV_CALENDAR_WEEK_STARTS_MONDAY 0 + #endif + #endif + #if LV_CALENDAR_WEEK_STARTS_MONDAY + #ifndef LV_CALENDAR_DEFAULT_DAY_NAMES + #ifdef CONFIG_LV_CALENDAR_DEFAULT_DAY_NAMES + #define LV_CALENDAR_DEFAULT_DAY_NAMES CONFIG_LV_CALENDAR_DEFAULT_DAY_NAMES + #else + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"} + #endif + #endif + #else + #ifndef LV_CALENDAR_DEFAULT_DAY_NAMES + #ifdef CONFIG_LV_CALENDAR_DEFAULT_DAY_NAMES + #define LV_CALENDAR_DEFAULT_DAY_NAMES CONFIG_LV_CALENDAR_DEFAULT_DAY_NAMES + #else + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"} + #endif + #endif + #endif + + #ifndef LV_CALENDAR_DEFAULT_MONTH_NAMES + #ifdef CONFIG_LV_CALENDAR_DEFAULT_MONTH_NAMES + #define LV_CALENDAR_DEFAULT_MONTH_NAMES CONFIG_LV_CALENDAR_DEFAULT_MONTH_NAMES + #else + #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} + #endif + #endif + #ifndef LV_USE_CALENDAR_HEADER_ARROW + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_CALENDAR_HEADER_ARROW + #define LV_USE_CALENDAR_HEADER_ARROW CONFIG_LV_USE_CALENDAR_HEADER_ARROW + #else + #define LV_USE_CALENDAR_HEADER_ARROW 0 + #endif + #else + #define LV_USE_CALENDAR_HEADER_ARROW 1 + #endif + #endif + #ifndef LV_USE_CALENDAR_HEADER_DROPDOWN + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_CALENDAR_HEADER_DROPDOWN + #define LV_USE_CALENDAR_HEADER_DROPDOWN CONFIG_LV_USE_CALENDAR_HEADER_DROPDOWN + #else + #define LV_USE_CALENDAR_HEADER_DROPDOWN 0 + #endif + #else + #define LV_USE_CALENDAR_HEADER_DROPDOWN 1 + #endif + #endif +#endif /*LV_USE_CALENDAR*/ + +#ifndef LV_USE_CHART + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_CHART + #define LV_USE_CHART CONFIG_LV_USE_CHART + #else + #define LV_USE_CHART 0 + #endif + #else + #define LV_USE_CHART 1 + #endif +#endif + +#ifndef LV_USE_COLORWHEEL + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_COLORWHEEL + #define LV_USE_COLORWHEEL CONFIG_LV_USE_COLORWHEEL + #else + #define LV_USE_COLORWHEEL 0 + #endif + #else + #define LV_USE_COLORWHEEL 1 + #endif +#endif + +#ifndef LV_USE_IMGBTN + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_IMGBTN + #define LV_USE_IMGBTN CONFIG_LV_USE_IMGBTN + #else + #define LV_USE_IMGBTN 0 + #endif + #else + #define LV_USE_IMGBTN 1 + #endif +#endif + +#ifndef LV_USE_KEYBOARD + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_KEYBOARD + #define LV_USE_KEYBOARD CONFIG_LV_USE_KEYBOARD + #else + #define LV_USE_KEYBOARD 0 + #endif + #else + #define LV_USE_KEYBOARD 1 + #endif +#endif + +#ifndef LV_USE_LED + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_LED + #define LV_USE_LED CONFIG_LV_USE_LED + #else + #define LV_USE_LED 0 + #endif + #else + #define LV_USE_LED 1 + #endif +#endif + +#ifndef LV_USE_LIST + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_LIST + #define LV_USE_LIST CONFIG_LV_USE_LIST + #else + #define LV_USE_LIST 0 + #endif + #else + #define LV_USE_LIST 1 + #endif +#endif + +#ifndef LV_USE_MENU + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_MENU + #define LV_USE_MENU CONFIG_LV_USE_MENU + #else + #define LV_USE_MENU 0 + #endif + #else + #define LV_USE_MENU 1 + #endif +#endif + +#ifndef LV_USE_METER + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_METER + #define LV_USE_METER CONFIG_LV_USE_METER + #else + #define LV_USE_METER 0 + #endif + #else + #define LV_USE_METER 1 + #endif +#endif + +#ifndef LV_USE_MSGBOX + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_MSGBOX + #define LV_USE_MSGBOX CONFIG_LV_USE_MSGBOX + #else + #define LV_USE_MSGBOX 0 + #endif + #else + #define LV_USE_MSGBOX 1 + #endif +#endif + +#ifndef LV_USE_SPAN + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_SPAN + #define LV_USE_SPAN CONFIG_LV_USE_SPAN + #else + #define LV_USE_SPAN 0 + #endif + #else + #define LV_USE_SPAN 1 + #endif +#endif +#if LV_USE_SPAN + /*A line text can contain maximum num of span descriptor */ + #ifndef LV_SPAN_SNIPPET_STACK_SIZE + #ifdef CONFIG_LV_SPAN_SNIPPET_STACK_SIZE + #define LV_SPAN_SNIPPET_STACK_SIZE CONFIG_LV_SPAN_SNIPPET_STACK_SIZE + #else + #define LV_SPAN_SNIPPET_STACK_SIZE 64 + #endif + #endif +#endif + +#ifndef LV_USE_SPINBOX + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_SPINBOX + #define LV_USE_SPINBOX CONFIG_LV_USE_SPINBOX + #else + #define LV_USE_SPINBOX 0 + #endif + #else + #define LV_USE_SPINBOX 1 + #endif +#endif + +#ifndef LV_USE_SPINNER + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_SPINNER + #define LV_USE_SPINNER CONFIG_LV_USE_SPINNER + #else + #define LV_USE_SPINNER 0 + #endif + #else + #define LV_USE_SPINNER 1 + #endif +#endif + +#ifndef LV_USE_TABVIEW + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_TABVIEW + #define LV_USE_TABVIEW CONFIG_LV_USE_TABVIEW + #else + #define LV_USE_TABVIEW 0 + #endif + #else + #define LV_USE_TABVIEW 1 + #endif +#endif + +#ifndef LV_USE_TILEVIEW + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_TILEVIEW + #define LV_USE_TILEVIEW CONFIG_LV_USE_TILEVIEW + #else + #define LV_USE_TILEVIEW 0 + #endif + #else + #define LV_USE_TILEVIEW 1 + #endif +#endif + +#ifndef LV_USE_WIN + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_WIN + #define LV_USE_WIN CONFIG_LV_USE_WIN + #else + #define LV_USE_WIN 0 + #endif + #else + #define LV_USE_WIN 1 + #endif +#endif + +/*----------- + * Themes + *----------*/ + +/*A simple, impressive and very complete theme*/ +#ifndef LV_USE_THEME_DEFAULT + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_THEME_DEFAULT + #define LV_USE_THEME_DEFAULT CONFIG_LV_USE_THEME_DEFAULT + #else + #define LV_USE_THEME_DEFAULT 0 + #endif + #else + #define LV_USE_THEME_DEFAULT 1 + #endif +#endif +#if LV_USE_THEME_DEFAULT + + /*0: Light mode; 1: Dark mode*/ + #ifndef LV_THEME_DEFAULT_DARK + #ifdef CONFIG_LV_THEME_DEFAULT_DARK + #define LV_THEME_DEFAULT_DARK CONFIG_LV_THEME_DEFAULT_DARK + #else + #define LV_THEME_DEFAULT_DARK 0 + #endif + #endif + + /*1: Enable grow on press*/ + #ifndef LV_THEME_DEFAULT_GROW + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_THEME_DEFAULT_GROW + #define LV_THEME_DEFAULT_GROW CONFIG_LV_THEME_DEFAULT_GROW + #else + #define LV_THEME_DEFAULT_GROW 0 + #endif + #else + #define LV_THEME_DEFAULT_GROW 1 + #endif + #endif + + /*Default transition time in [ms]*/ + #ifndef LV_THEME_DEFAULT_TRANSITION_TIME + #ifdef CONFIG_LV_THEME_DEFAULT_TRANSITION_TIME + #define LV_THEME_DEFAULT_TRANSITION_TIME CONFIG_LV_THEME_DEFAULT_TRANSITION_TIME + #else + #define LV_THEME_DEFAULT_TRANSITION_TIME 80 + #endif + #endif +#endif /*LV_USE_THEME_DEFAULT*/ + +/*A very simple theme that is a good starting point for a custom theme*/ +#ifndef LV_USE_THEME_BASIC + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_THEME_BASIC + #define LV_USE_THEME_BASIC CONFIG_LV_USE_THEME_BASIC + #else + #define LV_USE_THEME_BASIC 0 + #endif + #else + #define LV_USE_THEME_BASIC 1 + #endif +#endif + +/*A theme designed for monochrome displays*/ +#ifndef LV_USE_THEME_MONO + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_THEME_MONO + #define LV_USE_THEME_MONO CONFIG_LV_USE_THEME_MONO + #else + #define LV_USE_THEME_MONO 0 + #endif + #else + #define LV_USE_THEME_MONO 1 + #endif +#endif + +/*----------- + * Layouts + *----------*/ + +/*A layout similar to Flexbox in CSS.*/ +#ifndef LV_USE_FLEX + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_FLEX + #define LV_USE_FLEX CONFIG_LV_USE_FLEX + #else + #define LV_USE_FLEX 0 + #endif + #else + #define LV_USE_FLEX 1 + #endif +#endif + +/*A layout similar to Grid in CSS.*/ +#ifndef LV_USE_GRID + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_GRID + #define LV_USE_GRID CONFIG_LV_USE_GRID + #else + #define LV_USE_GRID 0 + #endif + #else + #define LV_USE_GRID 1 + #endif +#endif + +/*--------------------- + * 3rd party libraries + *--------------------*/ + +/*File system interfaces for common APIs */ + +/*API for fopen, fread, etc*/ +#ifndef LV_USE_FS_STDIO + #ifdef CONFIG_LV_USE_FS_STDIO + #define LV_USE_FS_STDIO CONFIG_LV_USE_FS_STDIO + #else + #define LV_USE_FS_STDIO 0 + #endif +#endif +#if LV_USE_FS_STDIO + #ifndef LV_FS_STDIO_LETTER + #ifdef CONFIG_LV_FS_STDIO_LETTER + #define LV_FS_STDIO_LETTER CONFIG_LV_FS_STDIO_LETTER + #else + #define LV_FS_STDIO_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #endif + #endif + #ifndef LV_FS_STDIO_PATH + #ifdef CONFIG_LV_FS_STDIO_PATH + #define LV_FS_STDIO_PATH CONFIG_LV_FS_STDIO_PATH + #else + #define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #endif + #endif + #ifndef LV_FS_STDIO_CACHE_SIZE + #ifdef CONFIG_LV_FS_STDIO_CACHE_SIZE + #define LV_FS_STDIO_CACHE_SIZE CONFIG_LV_FS_STDIO_CACHE_SIZE + #else + #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ + #endif + #endif +#endif + +/*API for open, read, etc*/ +#ifndef LV_USE_FS_POSIX + #ifdef CONFIG_LV_USE_FS_POSIX + #define LV_USE_FS_POSIX CONFIG_LV_USE_FS_POSIX + #else + #define LV_USE_FS_POSIX 0 + #endif +#endif +#if LV_USE_FS_POSIX + #ifndef LV_FS_POSIX_LETTER + #ifdef CONFIG_LV_FS_POSIX_LETTER + #define LV_FS_POSIX_LETTER CONFIG_LV_FS_POSIX_LETTER + #else + #define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #endif + #endif + #ifndef LV_FS_POSIX_PATH + #ifdef CONFIG_LV_FS_POSIX_PATH + #define LV_FS_POSIX_PATH CONFIG_LV_FS_POSIX_PATH + #else + #define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #endif + #endif + #ifndef LV_FS_POSIX_CACHE_SIZE + #ifdef CONFIG_LV_FS_POSIX_CACHE_SIZE + #define LV_FS_POSIX_CACHE_SIZE CONFIG_LV_FS_POSIX_CACHE_SIZE + #else + #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ + #endif + #endif +#endif + +/*API for CreateFile, ReadFile, etc*/ +#ifndef LV_USE_FS_WIN32 + #ifdef CONFIG_LV_USE_FS_WIN32 + #define LV_USE_FS_WIN32 CONFIG_LV_USE_FS_WIN32 + #else + #define LV_USE_FS_WIN32 0 + #endif +#endif +#if LV_USE_FS_WIN32 + #ifndef LV_FS_WIN32_LETTER + #ifdef CONFIG_LV_FS_WIN32_LETTER + #define LV_FS_WIN32_LETTER CONFIG_LV_FS_WIN32_LETTER + #else + #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #endif + #endif + #ifndef LV_FS_WIN32_PATH + #ifdef CONFIG_LV_FS_WIN32_PATH + #define LV_FS_WIN32_PATH CONFIG_LV_FS_WIN32_PATH + #else + #define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #endif + #endif + #ifndef LV_FS_WIN32_CACHE_SIZE + #ifdef CONFIG_LV_FS_WIN32_CACHE_SIZE + #define LV_FS_WIN32_CACHE_SIZE CONFIG_LV_FS_WIN32_CACHE_SIZE + #else + #define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ + #endif + #endif +#endif + +/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/ +#ifndef LV_USE_FS_FATFS + #ifdef CONFIG_LV_USE_FS_FATFS + #define LV_USE_FS_FATFS CONFIG_LV_USE_FS_FATFS + #else + #define LV_USE_FS_FATFS 0 + #endif +#endif +#if LV_USE_FS_FATFS + #ifndef LV_FS_FATFS_LETTER + #ifdef CONFIG_LV_FS_FATFS_LETTER + #define LV_FS_FATFS_LETTER CONFIG_LV_FS_FATFS_LETTER + #else + #define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #endif + #endif + #ifndef LV_FS_FATFS_CACHE_SIZE + #ifdef CONFIG_LV_FS_FATFS_CACHE_SIZE + #define LV_FS_FATFS_CACHE_SIZE CONFIG_LV_FS_FATFS_CACHE_SIZE + #else + #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ + #endif + #endif +#endif + +/*PNG decoder library*/ +#ifndef LV_USE_PNG + #ifdef CONFIG_LV_USE_PNG + #define LV_USE_PNG CONFIG_LV_USE_PNG + #else + #define LV_USE_PNG 0 + #endif +#endif + +/*BMP decoder library*/ +#ifndef LV_USE_BMP + #ifdef CONFIG_LV_USE_BMP + #define LV_USE_BMP CONFIG_LV_USE_BMP + #else + #define LV_USE_BMP 0 + #endif +#endif + +/* JPG + split JPG decoder library. + * Split JPG is a custom format optimized for embedded systems. */ +#ifndef LV_USE_SJPG + #ifdef CONFIG_LV_USE_SJPG + #define LV_USE_SJPG CONFIG_LV_USE_SJPG + #else + #define LV_USE_SJPG 0 + #endif +#endif + +/*GIF decoder library*/ +#ifndef LV_USE_GIF + #ifdef CONFIG_LV_USE_GIF + #define LV_USE_GIF CONFIG_LV_USE_GIF + #else + #define LV_USE_GIF 0 + #endif +#endif + +/*QR code library*/ +#ifndef LV_USE_QRCODE + #ifdef CONFIG_LV_USE_QRCODE + #define LV_USE_QRCODE CONFIG_LV_USE_QRCODE + #else + #define LV_USE_QRCODE 0 + #endif +#endif + +/*FreeType library*/ +#ifndef LV_USE_FREETYPE + #ifdef CONFIG_LV_USE_FREETYPE + #define LV_USE_FREETYPE CONFIG_LV_USE_FREETYPE + #else + #define LV_USE_FREETYPE 0 + #endif +#endif +#if LV_USE_FREETYPE + /*Memory used by FreeType to cache characters [bytes] (-1: no caching)*/ + #ifndef LV_FREETYPE_CACHE_SIZE + #ifdef CONFIG_LV_FREETYPE_CACHE_SIZE + #define LV_FREETYPE_CACHE_SIZE CONFIG_LV_FREETYPE_CACHE_SIZE + #else + #define LV_FREETYPE_CACHE_SIZE (16 * 1024) + #endif + #endif + #if LV_FREETYPE_CACHE_SIZE >= 0 + /* 1: bitmap cache use the sbit cache, 0:bitmap cache use the image cache. */ + /* sbit cache:it is much more memory efficient for small bitmaps(font size < 256) */ + /* if font size >= 256, must be configured as image cache */ + #ifndef LV_FREETYPE_SBIT_CACHE + #ifdef CONFIG_LV_FREETYPE_SBIT_CACHE + #define LV_FREETYPE_SBIT_CACHE CONFIG_LV_FREETYPE_SBIT_CACHE + #else + #define LV_FREETYPE_SBIT_CACHE 0 + #endif + #endif + /* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. */ + /* (0:use system defaults) */ + #ifndef LV_FREETYPE_CACHE_FT_FACES + #ifdef CONFIG_LV_FREETYPE_CACHE_FT_FACES + #define LV_FREETYPE_CACHE_FT_FACES CONFIG_LV_FREETYPE_CACHE_FT_FACES + #else + #define LV_FREETYPE_CACHE_FT_FACES 0 + #endif + #endif + #ifndef LV_FREETYPE_CACHE_FT_SIZES + #ifdef CONFIG_LV_FREETYPE_CACHE_FT_SIZES + #define LV_FREETYPE_CACHE_FT_SIZES CONFIG_LV_FREETYPE_CACHE_FT_SIZES + #else + #define LV_FREETYPE_CACHE_FT_SIZES 0 + #endif + #endif + #endif +#endif + +/*Rlottie library*/ +#ifndef LV_USE_RLOTTIE + #ifdef CONFIG_LV_USE_RLOTTIE + #define LV_USE_RLOTTIE CONFIG_LV_USE_RLOTTIE + #else + #define LV_USE_RLOTTIE 0 + #endif +#endif + +/*FFmpeg library for image decoding and playing videos + *Supports all major image formats so do not enable other image decoder with it*/ +#ifndef LV_USE_FFMPEG + #ifdef CONFIG_LV_USE_FFMPEG + #define LV_USE_FFMPEG CONFIG_LV_USE_FFMPEG + #else + #define LV_USE_FFMPEG 0 + #endif +#endif +#if LV_USE_FFMPEG + /*Dump input information to stderr*/ + #ifndef LV_FFMPEG_DUMP_FORMAT + #ifdef CONFIG_LV_FFMPEG_DUMP_FORMAT + #define LV_FFMPEG_DUMP_FORMAT CONFIG_LV_FFMPEG_DUMP_FORMAT + #else + #define LV_FFMPEG_DUMP_FORMAT 0 + #endif + #endif +#endif + +/*----------- + * Others + *----------*/ + +/*1: Enable API to take snapshot for object*/ +#ifndef LV_USE_SNAPSHOT + #ifdef CONFIG_LV_USE_SNAPSHOT + #define LV_USE_SNAPSHOT CONFIG_LV_USE_SNAPSHOT + #else + #define LV_USE_SNAPSHOT 0 + #endif +#endif + +/*1: Enable Monkey test*/ +#ifndef LV_USE_MONKEY + #ifdef CONFIG_LV_USE_MONKEY + #define LV_USE_MONKEY CONFIG_LV_USE_MONKEY + #else + #define LV_USE_MONKEY 0 + #endif +#endif + +/*1: Enable grid navigation*/ +#ifndef LV_USE_GRIDNAV + #ifdef CONFIG_LV_USE_GRIDNAV + #define LV_USE_GRIDNAV CONFIG_LV_USE_GRIDNAV + #else + #define LV_USE_GRIDNAV 0 + #endif +#endif + +/*1: Enable lv_obj fragment*/ +#ifndef LV_USE_FRAGMENT + #ifdef CONFIG_LV_USE_FRAGMENT + #define LV_USE_FRAGMENT CONFIG_LV_USE_FRAGMENT + #else + #define LV_USE_FRAGMENT 0 + #endif +#endif + +/*1: Support using images as font in label or span widgets */ +#ifndef LV_USE_IMGFONT + #ifdef CONFIG_LV_USE_IMGFONT + #define LV_USE_IMGFONT CONFIG_LV_USE_IMGFONT + #else + #define LV_USE_IMGFONT 0 + #endif +#endif + +/*1: Enable a published subscriber based messaging system */ +#ifndef LV_USE_MSG + #ifdef CONFIG_LV_USE_MSG + #define LV_USE_MSG CONFIG_LV_USE_MSG + #else + #define LV_USE_MSG 0 + #endif +#endif + +/*1: Enable Pinyin input method*/ +/*Requires: lv_keyboard*/ +#ifndef LV_USE_IME_PINYIN + #ifdef CONFIG_LV_USE_IME_PINYIN + #define LV_USE_IME_PINYIN CONFIG_LV_USE_IME_PINYIN + #else + #define LV_USE_IME_PINYIN 0 + #endif +#endif +#if LV_USE_IME_PINYIN + /*1: Use default thesaurus*/ + /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesauruss*/ + #ifndef LV_IME_PINYIN_USE_DEFAULT_DICT + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_IME_PINYIN_USE_DEFAULT_DICT + #define LV_IME_PINYIN_USE_DEFAULT_DICT CONFIG_LV_IME_PINYIN_USE_DEFAULT_DICT + #else + #define LV_IME_PINYIN_USE_DEFAULT_DICT 0 + #endif + #else + #define LV_IME_PINYIN_USE_DEFAULT_DICT 1 + #endif + #endif + /*Set the maximum number of candidate panels that can be displayed*/ + /*This needs to be adjusted according to the size of the screen*/ + #ifndef LV_IME_PINYIN_CAND_TEXT_NUM + #ifdef CONFIG_LV_IME_PINYIN_CAND_TEXT_NUM + #define LV_IME_PINYIN_CAND_TEXT_NUM CONFIG_LV_IME_PINYIN_CAND_TEXT_NUM + #else + #define LV_IME_PINYIN_CAND_TEXT_NUM 6 + #endif + #endif + + /*Use 9 key input(k9)*/ + #ifndef LV_IME_PINYIN_USE_K9_MODE + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_IME_PINYIN_USE_K9_MODE + #define LV_IME_PINYIN_USE_K9_MODE CONFIG_LV_IME_PINYIN_USE_K9_MODE + #else + #define LV_IME_PINYIN_USE_K9_MODE 0 + #endif + #else + #define LV_IME_PINYIN_USE_K9_MODE 1 + #endif + #endif + #if LV_IME_PINYIN_USE_K9_MODE == 1 + #ifndef LV_IME_PINYIN_K9_CAND_TEXT_NUM + #ifdef CONFIG_LV_IME_PINYIN_K9_CAND_TEXT_NUM + #define LV_IME_PINYIN_K9_CAND_TEXT_NUM CONFIG_LV_IME_PINYIN_K9_CAND_TEXT_NUM + #else + #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3 + #endif + #endif + #endif // LV_IME_PINYIN_USE_K9_MODE +#endif + +/*================== +* EXAMPLES +*==================*/ + +/*Enable the examples to be built with the library*/ +#ifndef LV_BUILD_EXAMPLES + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_BUILD_EXAMPLES + #define LV_BUILD_EXAMPLES CONFIG_LV_BUILD_EXAMPLES + #else + #define LV_BUILD_EXAMPLES 0 + #endif + #else + #define LV_BUILD_EXAMPLES 1 + #endif +#endif + +/*=================== + * DEMO USAGE + ====================*/ + +/*Show some widget. It might be required to increase `LV_MEM_SIZE` */ +#ifndef LV_USE_DEMO_WIDGETS + #ifdef CONFIG_LV_USE_DEMO_WIDGETS + #define LV_USE_DEMO_WIDGETS CONFIG_LV_USE_DEMO_WIDGETS + #else + #define LV_USE_DEMO_WIDGETS 0 + #endif +#endif +#if LV_USE_DEMO_WIDGETS +#ifndef LV_DEMO_WIDGETS_SLIDESHOW + #ifdef CONFIG_LV_DEMO_WIDGETS_SLIDESHOW + #define LV_DEMO_WIDGETS_SLIDESHOW CONFIG_LV_DEMO_WIDGETS_SLIDESHOW + #else + #define LV_DEMO_WIDGETS_SLIDESHOW 0 + #endif +#endif +#endif + +/*Demonstrate the usage of encoder and keyboard*/ +#ifndef LV_USE_DEMO_KEYPAD_AND_ENCODER + #ifdef CONFIG_LV_USE_DEMO_KEYPAD_AND_ENCODER + #define LV_USE_DEMO_KEYPAD_AND_ENCODER CONFIG_LV_USE_DEMO_KEYPAD_AND_ENCODER + #else + #define LV_USE_DEMO_KEYPAD_AND_ENCODER 0 + #endif +#endif + +/*Benchmark your system*/ +#ifndef LV_USE_DEMO_BENCHMARK + #ifdef CONFIG_LV_USE_DEMO_BENCHMARK + #define LV_USE_DEMO_BENCHMARK CONFIG_LV_USE_DEMO_BENCHMARK + #else + #define LV_USE_DEMO_BENCHMARK 0 + #endif +#endif +#if LV_USE_DEMO_BENCHMARK +/*Use RGB565A8 images with 16 bit color depth instead of ARGB8565*/ +#ifndef LV_DEMO_BENCHMARK_RGB565A8 + #ifdef CONFIG_LV_DEMO_BENCHMARK_RGB565A8 + #define LV_DEMO_BENCHMARK_RGB565A8 CONFIG_LV_DEMO_BENCHMARK_RGB565A8 + #else + #define LV_DEMO_BENCHMARK_RGB565A8 0 + #endif +#endif +#endif + +/*Stress test for LVGL*/ +#ifndef LV_USE_DEMO_STRESS + #ifdef CONFIG_LV_USE_DEMO_STRESS + #define LV_USE_DEMO_STRESS CONFIG_LV_USE_DEMO_STRESS + #else + #define LV_USE_DEMO_STRESS 0 + #endif +#endif + +/*Music player demo*/ +#ifndef LV_USE_DEMO_MUSIC + #ifdef CONFIG_LV_USE_DEMO_MUSIC + #define LV_USE_DEMO_MUSIC CONFIG_LV_USE_DEMO_MUSIC + #else + #define LV_USE_DEMO_MUSIC 0 + #endif +#endif +#if LV_USE_DEMO_MUSIC + #ifndef LV_DEMO_MUSIC_SQUARE + #ifdef CONFIG_LV_DEMO_MUSIC_SQUARE + #define LV_DEMO_MUSIC_SQUARE CONFIG_LV_DEMO_MUSIC_SQUARE + #else + #define LV_DEMO_MUSIC_SQUARE 0 + #endif + #endif + #ifndef LV_DEMO_MUSIC_LANDSCAPE + #ifdef CONFIG_LV_DEMO_MUSIC_LANDSCAPE + #define LV_DEMO_MUSIC_LANDSCAPE CONFIG_LV_DEMO_MUSIC_LANDSCAPE + #else + #define LV_DEMO_MUSIC_LANDSCAPE 0 + #endif + #endif + #ifndef LV_DEMO_MUSIC_ROUND + #ifdef CONFIG_LV_DEMO_MUSIC_ROUND + #define LV_DEMO_MUSIC_ROUND CONFIG_LV_DEMO_MUSIC_ROUND + #else + #define LV_DEMO_MUSIC_ROUND 0 + #endif + #endif + #ifndef LV_DEMO_MUSIC_LARGE + #ifdef CONFIG_LV_DEMO_MUSIC_LARGE + #define LV_DEMO_MUSIC_LARGE CONFIG_LV_DEMO_MUSIC_LARGE + #else + #define LV_DEMO_MUSIC_LARGE 0 + #endif + #endif + #ifndef LV_DEMO_MUSIC_AUTO_PLAY + #ifdef CONFIG_LV_DEMO_MUSIC_AUTO_PLAY + #define LV_DEMO_MUSIC_AUTO_PLAY CONFIG_LV_DEMO_MUSIC_AUTO_PLAY + #else + #define LV_DEMO_MUSIC_AUTO_PLAY 0 + #endif + #endif +#endif + + + +/*---------------------------------- + * End of parsing lv_conf_template.h + -----------------------------------*/ + +LV_EXPORT_CONST_INT(LV_DPI_DEF); + +#undef _LV_KCONFIG_PRESENT + + +/*Set some defines if a dependency is disabled*/ +#if LV_USE_LOG == 0 + #define LV_LOG_LEVEL LV_LOG_LEVEL_NONE + #define LV_LOG_TRACE_MEM 0 + #define LV_LOG_TRACE_TIMER 0 + #define LV_LOG_TRACE_INDEV 0 + #define LV_LOG_TRACE_DISP_REFR 0 + #define LV_LOG_TRACE_EVENT 0 + #define LV_LOG_TRACE_OBJ_CREATE 0 + #define LV_LOG_TRACE_LAYOUT 0 + #define LV_LOG_TRACE_ANIM 0 +#endif /*LV_USE_LOG*/ + + +/*If running without lv_conf.h add typedefs with default value*/ +#ifdef LV_CONF_SKIP + #if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) /*Disable warnings for Visual Studio*/ + #define _CRT_SECURE_NO_WARNINGS + #endif +#endif /*defined(LV_CONF_SKIP)*/ + +#endif /*LV_CONF_INTERNAL_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/lv_conf_kconfig.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/lv_conf_kconfig.h new file mode 100644 index 0000000..7742fe7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/lv_conf_kconfig.h @@ -0,0 +1,182 @@ +/** * @file lv_conf_kconfig.h * Configs that need special handling when LVGL is used with Kconfig */ + +#ifndef LV_CONF_KCONFIG_H +#define LV_CONF_KCONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef LV_CONF_KCONFIG_EXTERNAL_INCLUDE +# include LV_CONF_KCONFIG_EXTERNAL_INCLUDE +#else + +# ifdef ESP_PLATFORM +# include "sdkconfig.h" +# include "esp_attr.h" +# endif + +# ifdef __NuttX__ +# include +# elif defined(__RTTHREAD__) +# define LV_CONF_INCLUDE_SIMPLE +# include +# endif + +#endif /*LV_CONF_KCONFIG_EXTERNAL_INCLUDE*/ + +/******************* + * LV COLOR CHROMA KEY + *******************/ + +#ifdef CONFIG_LV_COLOR_CHROMA_KEY_HEX +# define CONFIG_LV_COLOR_CHROMA_KEY lv_color_hex(CONFIG_LV_COLOR_CHROMA_KEY_HEX) +#endif + +/******************* + * LV_MEM_SIZE + *******************/ + +#ifdef CONFIG_LV_MEM_SIZE_KILOBYTES +# define CONFIG_LV_MEM_SIZE (CONFIG_LV_MEM_SIZE_KILOBYTES * 1024U) +#endif + +/*------------------ + * MONITOR POSITION + *-----------------*/ + +#ifdef CONFIG_LV_PERF_MONITOR_ALIGN_TOP_LEFT +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_LEFT +#elif defined(CONFIG_LV_USE_PERF_MONITOR_ALIGN_TOP_MID) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_MID +#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_TOP_RIGHT) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_RIGHT +#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_BOTTOM_LEFT) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_LEFT +#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_BOTTOM_MID) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_MID +#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_BOTTOM_RIGHT) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT +#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_LEFT_MID) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_LEFT_MID +#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_RIGHT_MID) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_RIGHT_MID +#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_CENTER) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_CENTER +#endif + +#ifdef CONFIG_LV_MEM_MONITOR_ALIGN_TOP_LEFT +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_LEFT +#elif defined(CONFIG_LV_USE_MEM_MONITOR_ALIGN_TOP_MID) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_MID +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_TOP_RIGHT) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_RIGHT +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_BOTTOM_LEFT) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_BOTTOM_MID) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_MID +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_BOTTOM_RIGHT) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_LEFT_MID) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_LEFT_MID +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_RIGHT_MID) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_RIGHT_MID +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_CENTER) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_CENTER +#endif + +/******************** + * FONT SELECTION + *******************/ + +/** + * NOTE: In Kconfig instead of `LV_DEFAULT_FONT` + * `CONFIG_LV_FONT_DEFAULT_` is defined + * hence the large selection with if-s + */ + +/*------------------ + * DEFAULT FONT + *-----------------*/ +#ifdef CONFIG_LV_FONT_DEFAULT_MONTSERRAT_8 +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_8 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_10) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_10 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_12) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_12 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_14) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_14 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_16) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_16 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_18) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_18 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_20) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_20 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_22) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_22 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_24) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_24 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_26 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_28) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_28 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_30) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_30 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_32) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_32 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_34) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_34 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_36) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_36 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_38) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_38 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_40) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_40 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_42) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_42 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_44) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_44 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_46) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_46 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_48) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_48 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_12_SUBPX) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_12_subpx +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_28_COMPRESSED) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_28_compressed +#elif defined(CONFIG_LV_FONT_DEFAULT_DEJAVU_16_PERSIAN_HEBREW) +# define CONFIG_LV_FONT_DEFAULT &lv_font_dejavu_16_persian_hebrew +#elif defined(CONFIG_LV_FONT_DEFAULT_SIMSUN_16_CJK) +# define CONFIG_LV_FONT_DEFAULT &lv_font_simsun_16_cjk +#elif defined(CONFIG_LV_FONT_DEFAULT_UNSCII_8) +# define CONFIG_LV_FONT_DEFAULT &lv_font_unscii_8 +#elif defined(CONFIG_LV_FONT_DEFAULT_UNSCII_16) +# define CONFIG_LV_FONT_DEFAULT &lv_font_unscii_16 +#endif + +/*------------------ + * TEXT ENCODING + *-----------------*/ +#ifdef CONFIG_LV_TXT_ENC_UTF8 +# define CONFIG_LV_TXT_ENC LV_TXT_ENC_UTF8 +#elif defined(CONFIG_LV_TXT_ENC_ASCII) +# define CONFIG_LV_TXT_ENC LV_TXT_ENC_ASCII +#endif + +/*------------------ + * BIDI DIRECTION + *-----------------*/ + +#ifdef CONFIG_LV_BASE_DIR_LTR +# define CONFIG_LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_LTR +#elif defined(CONFIG_LV_BASE_DIR_RTL) +# define CONFIG_LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_RTL +#elif defined(CONFIG_LV_BASE_DIR_AUTO) +# define CONFIG_LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CONF_KCONFIG_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/lvgl.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/lvgl.h new file mode 100644 index 0000000..a7db27c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/lvgl.h @@ -0,0 +1,39 @@ +/** + * @file lvgl.h + * This file exists only to be compatible with Arduino's library structure + */ + +#ifndef LVGL_SRC_H +#define LVGL_SRC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lvgl.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LVGL_SRC_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_anim.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_anim.c new file mode 100644 index 0000000..4e4253a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_anim.c @@ -0,0 +1,470 @@ +/** + * @file lv_anim.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_anim.h" + +#include "../hal/lv_hal_tick.h" +#include "lv_assert.h" +#include "lv_timer.h" +#include "lv_math.h" +#include "lv_mem.h" +#include "lv_gc.h" + +/********************* + * DEFINES + *********************/ +#define LV_ANIM_RESOLUTION 1024 +#define LV_ANIM_RES_SHIFT 10 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void anim_timer(lv_timer_t * param); +static void anim_mark_list_change(void); +static void anim_ready_handler(lv_anim_t * a); + +/********************** + * STATIC VARIABLES + **********************/ +static uint32_t last_timer_run; +static bool anim_list_changed; +static bool anim_run_round; +static lv_timer_t * _lv_anim_tmr; + +/********************** + * MACROS + **********************/ +#if LV_LOG_TRACE_ANIM + #define TRACE_ANIM(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define TRACE_ANIM(...) +#endif + + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void _lv_anim_core_init(void) +{ + _lv_ll_init(&LV_GC_ROOT(_lv_anim_ll), sizeof(lv_anim_t)); + _lv_anim_tmr = lv_timer_create(anim_timer, LV_DISP_DEF_REFR_PERIOD, NULL); + anim_mark_list_change(); /*Turn off the animation timer*/ + anim_list_changed = false; +} + +void lv_anim_init(lv_anim_t * a) +{ + lv_memset_00(a, sizeof(lv_anim_t)); + a->time = 500; + a->start_value = 0; + a->end_value = 100; + a->repeat_cnt = 1; + a->path_cb = lv_anim_path_linear; + a->early_apply = 1; +} + +lv_anim_t * lv_anim_start(const lv_anim_t * a) +{ + TRACE_ANIM("begin"); + + /*Do not let two animations for the same 'var' with the same 'exec_cb'*/ + if(a->exec_cb != NULL) lv_anim_del(a->var, a->exec_cb); /*exec_cb == NULL would delete all animations of var*/ + + /*If the list is empty the anim timer was suspended and it's last run measure is invalid*/ + if(_lv_ll_is_empty(&LV_GC_ROOT(_lv_anim_ll))) { + last_timer_run = lv_tick_get(); + } + + /*Add the new animation to the animation linked list*/ + lv_anim_t * new_anim = _lv_ll_ins_head(&LV_GC_ROOT(_lv_anim_ll)); + LV_ASSERT_MALLOC(new_anim); + if(new_anim == NULL) return NULL; + + /*Initialize the animation descriptor*/ + lv_memcpy(new_anim, a, sizeof(lv_anim_t)); + if(a->var == a) new_anim->var = new_anim; + new_anim->run_round = anim_run_round; + + /*Set the start value*/ + if(new_anim->early_apply) { + if(new_anim->get_value_cb) { + int32_t v_ofs = new_anim->get_value_cb(new_anim); + new_anim->start_value += v_ofs; + new_anim->end_value += v_ofs; + } + + if(new_anim->exec_cb && new_anim->var) new_anim->exec_cb(new_anim->var, new_anim->start_value); + } + + /*Creating an animation changed the linked list. + *It's important if it happens in a ready callback. (see `anim_timer`)*/ + anim_mark_list_change(); + + TRACE_ANIM("finished"); + return new_anim; +} + +uint32_t lv_anim_get_playtime(lv_anim_t * a) +{ + uint32_t playtime = LV_ANIM_PLAYTIME_INFINITE; + + if(a->repeat_cnt == LV_ANIM_REPEAT_INFINITE) + return playtime; + + playtime = a->time - a->act_time; + if(a->playback_now == 0) + playtime += a->playback_delay + a->playback_time; + + if(a->repeat_cnt <= 1) + return playtime; + + playtime += (a->repeat_delay + a->time + + a->playback_delay + a->playback_time) * + (a->repeat_cnt - 1); + + return playtime; +} + +bool lv_anim_del(void * var, lv_anim_exec_xcb_t exec_cb) +{ + lv_anim_t * a; + lv_anim_t * a_next; + bool del = false; + a = _lv_ll_get_head(&LV_GC_ROOT(_lv_anim_ll)); + while(a != NULL) { + /*'a' might be deleted, so get the next object while 'a' is valid*/ + a_next = _lv_ll_get_next(&LV_GC_ROOT(_lv_anim_ll), a); + + if((a->var == var || var == NULL) && (a->exec_cb == exec_cb || exec_cb == NULL)) { + _lv_ll_remove(&LV_GC_ROOT(_lv_anim_ll), a); + if(a->deleted_cb != NULL) a->deleted_cb(a); + lv_mem_free(a); + anim_mark_list_change(); /*Read by `anim_timer`. It need to know if a delete occurred in + the linked list*/ + del = true; + } + + a = a_next; + } + + return del; +} + +void lv_anim_del_all(void) +{ + _lv_ll_clear(&LV_GC_ROOT(_lv_anim_ll)); + anim_mark_list_change(); +} + +lv_anim_t * lv_anim_get(void * var, lv_anim_exec_xcb_t exec_cb) +{ + lv_anim_t * a; + _LV_LL_READ(&LV_GC_ROOT(_lv_anim_ll), a) { + if(a->var == var && (a->exec_cb == exec_cb || exec_cb == NULL)) { + return a; + } + } + + return NULL; +} + +struct _lv_timer_t * lv_anim_get_timer(void) +{ + return _lv_anim_tmr; +} + +uint16_t lv_anim_count_running(void) +{ + uint16_t cnt = 0; + lv_anim_t * a; + _LV_LL_READ(&LV_GC_ROOT(_lv_anim_ll), a) cnt++; + + return cnt; +} + +uint32_t lv_anim_speed_to_time(uint32_t speed, int32_t start, int32_t end) +{ + uint32_t d = LV_ABS(start - end); + uint32_t time = (d * 1000) / speed; + + if(time == 0) { + time++; + } + + return time; +} + +void lv_anim_refr_now(void) +{ + anim_timer(NULL); +} + +int32_t lv_anim_path_linear(const lv_anim_t * a) +{ + /*Calculate the current step*/ + int32_t step = lv_map(a->act_time, 0, a->time, 0, LV_ANIM_RESOLUTION); + + /*Get the new value which will be proportional to `step` + *and the `start` and `end` values*/ + int32_t new_value; + new_value = step * (a->end_value - a->start_value); + new_value = new_value >> LV_ANIM_RES_SHIFT; + new_value += a->start_value; + + return new_value; +} + +int32_t lv_anim_path_ease_in(const lv_anim_t * a) +{ + /*Calculate the current step*/ + uint32_t t = lv_map(a->act_time, 0, a->time, 0, LV_BEZIER_VAL_MAX); + int32_t step = lv_bezier3(t, 0, 50, 100, LV_BEZIER_VAL_MAX); + + int32_t new_value; + new_value = step * (a->end_value - a->start_value); + new_value = new_value >> LV_BEZIER_VAL_SHIFT; + new_value += a->start_value; + + return new_value; +} + +int32_t lv_anim_path_ease_out(const lv_anim_t * a) +{ + /*Calculate the current step*/ + uint32_t t = lv_map(a->act_time, 0, a->time, 0, LV_BEZIER_VAL_MAX); + int32_t step = lv_bezier3(t, 0, 900, 950, LV_BEZIER_VAL_MAX); + + int32_t new_value; + new_value = step * (a->end_value - a->start_value); + new_value = new_value >> LV_BEZIER_VAL_SHIFT; + new_value += a->start_value; + + return new_value; +} + +int32_t lv_anim_path_ease_in_out(const lv_anim_t * a) +{ + /*Calculate the current step*/ + uint32_t t = lv_map(a->act_time, 0, a->time, 0, LV_BEZIER_VAL_MAX); + int32_t step = lv_bezier3(t, 0, 50, 952, LV_BEZIER_VAL_MAX); + + int32_t new_value; + new_value = step * (a->end_value - a->start_value); + new_value = new_value >> LV_BEZIER_VAL_SHIFT; + new_value += a->start_value; + + return new_value; +} + +int32_t lv_anim_path_overshoot(const lv_anim_t * a) +{ + /*Calculate the current step*/ + uint32_t t = lv_map(a->act_time, 0, a->time, 0, LV_BEZIER_VAL_MAX); + int32_t step = lv_bezier3(t, 0, 1000, 1300, LV_BEZIER_VAL_MAX); + + int32_t new_value; + new_value = step * (a->end_value - a->start_value); + new_value = new_value >> LV_BEZIER_VAL_SHIFT; + new_value += a->start_value; + + return new_value; +} + +int32_t lv_anim_path_bounce(const lv_anim_t * a) +{ + /*Calculate the current step*/ + int32_t t = lv_map(a->act_time, 0, a->time, 0, LV_BEZIER_VAL_MAX); + int32_t diff = (a->end_value - a->start_value); + + /*3 bounces has 5 parts: 3 down and 2 up. One part is t / 5 long*/ + + if(t < 408) { + /*Go down*/ + t = (t * 2500) >> LV_BEZIER_VAL_SHIFT; /*[0..1024] range*/ + } + else if(t >= 408 && t < 614) { + /*First bounce back*/ + t -= 408; + t = t * 5; /*to [0..1024] range*/ + t = LV_BEZIER_VAL_MAX - t; + diff = diff / 20; + } + else if(t >= 614 && t < 819) { + /*Fall back*/ + t -= 614; + t = t * 5; /*to [0..1024] range*/ + diff = diff / 20; + } + else if(t >= 819 && t < 921) { + /*Second bounce back*/ + t -= 819; + t = t * 10; /*to [0..1024] range*/ + t = LV_BEZIER_VAL_MAX - t; + diff = diff / 40; + } + else if(t >= 921 && t <= LV_BEZIER_VAL_MAX) { + /*Fall back*/ + t -= 921; + t = t * 10; /*to [0..1024] range*/ + diff = diff / 40; + } + + if(t > LV_BEZIER_VAL_MAX) t = LV_BEZIER_VAL_MAX; + if(t < 0) t = 0; + int32_t step = lv_bezier3(t, LV_BEZIER_VAL_MAX, 800, 500, 0); + + int32_t new_value; + new_value = step * diff; + new_value = new_value >> LV_BEZIER_VAL_SHIFT; + new_value = a->end_value - new_value; + + return new_value; +} + +int32_t lv_anim_path_step(const lv_anim_t * a) +{ + if(a->act_time >= a->time) + return a->end_value; + else + return a->start_value; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Periodically handle the animations. + * @param param unused + */ +static void anim_timer(lv_timer_t * param) +{ + LV_UNUSED(param); + + uint32_t elaps = lv_tick_elaps(last_timer_run); + + /*Flip the run round*/ + anim_run_round = anim_run_round ? false : true; + + lv_anim_t * a = _lv_ll_get_head(&LV_GC_ROOT(_lv_anim_ll)); + + while(a != NULL) { + /*It can be set by `lv_anim_del()` typically in `end_cb`. If set then an animation delete + * happened in `anim_ready_handler` which could make this linked list reading corrupt + * because the list is changed meanwhile + */ + anim_list_changed = false; + + if(a->run_round != anim_run_round) { + a->run_round = anim_run_round; /*The list readying might be reset so need to know which anim has run already*/ + + /*The animation will run now for the first time. Call `start_cb`*/ + int32_t new_act_time = a->act_time + elaps; + if(!a->start_cb_called && a->act_time <= 0 && new_act_time >= 0) { + if(a->early_apply == 0 && a->get_value_cb) { + int32_t v_ofs = a->get_value_cb(a); + a->start_value += v_ofs; + a->end_value += v_ofs; + } + if(a->start_cb) a->start_cb(a); + a->start_cb_called = 1; + } + a->act_time += elaps; + if(a->act_time >= 0) { + if(a->act_time > a->time) a->act_time = a->time; + + int32_t new_value; + new_value = a->path_cb(a); + + if(new_value != a->current_value) { + a->current_value = new_value; + /*Apply the calculated value*/ + if(a->exec_cb) a->exec_cb(a->var, new_value); + } + + /*If the time is elapsed the animation is ready*/ + if(a->act_time >= a->time) { + anim_ready_handler(a); + } + } + } + + /*If the linked list changed due to anim. delete then it's not safe to continue + *the reading of the list from here -> start from the head*/ + if(anim_list_changed) + a = _lv_ll_get_head(&LV_GC_ROOT(_lv_anim_ll)); + else + a = _lv_ll_get_next(&LV_GC_ROOT(_lv_anim_ll), a); + } + + last_timer_run = lv_tick_get(); +} + +/** + * Called when an animation is ready to do the necessary thinks + * e.g. repeat, play back, delete etc. + * @param a pointer to an animation descriptor + */ +static void anim_ready_handler(lv_anim_t * a) +{ + /*In the end of a forward anim decrement repeat cnt.*/ + if(a->playback_now == 0 && a->repeat_cnt > 0 && a->repeat_cnt != LV_ANIM_REPEAT_INFINITE) { + a->repeat_cnt--; + } + + /*Delete the animation if + * - no repeat left and no play back (simple one shot animation) + * - no repeat, play back is enabled and play back is ready*/ + if(a->repeat_cnt == 0 && (a->playback_time == 0 || a->playback_now == 1)) { + + /*Delete the animation from the list. + * This way the `ready_cb` will see the animations like it's animation is ready deleted*/ + _lv_ll_remove(&LV_GC_ROOT(_lv_anim_ll), a); + /*Flag that the list has changed*/ + anim_mark_list_change(); + + /*Call the callback function at the end*/ + if(a->ready_cb != NULL) a->ready_cb(a); + if(a->deleted_cb != NULL) a->deleted_cb(a); + lv_mem_free(a); + } + /*If the animation is not deleted then restart it*/ + else { + a->act_time = -(int32_t)(a->repeat_delay); /*Restart the animation*/ + /*Swap the start and end values in play back mode*/ + if(a->playback_time != 0) { + /*If now turning back use the 'playback_pause*/ + if(a->playback_now == 0) a->act_time = -(int32_t)(a->playback_delay); + + /*Toggle the play back state*/ + a->playback_now = a->playback_now == 0 ? 1 : 0; + /*Swap the start and end values*/ + int32_t tmp = a->start_value; + a->start_value = a->end_value; + a->end_value = tmp; + /*Swap the time and playback_time*/ + tmp = a->time; + a->time = a->playback_time; + a->playback_time = tmp; + } + } +} + +static void anim_mark_list_change(void) +{ + anim_list_changed = true; + if(_lv_ll_get_head(&LV_GC_ROOT(_lv_anim_ll)) == NULL) + lv_timer_pause(_lv_anim_tmr); + else + lv_timer_resume(_lv_anim_tmr); +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_anim.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_anim.h new file mode 100644 index 0000000..faef727 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_anim.h @@ -0,0 +1,484 @@ +/** + * @file lv_anim.h + * + */ + +#ifndef LV_ANIM_H +#define LV_ANIM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include +#include +#include + +/********************* + * DEFINES + *********************/ + +#define LV_ANIM_REPEAT_INFINITE 0xFFFF +#define LV_ANIM_PLAYTIME_INFINITE 0xFFFFFFFF + +LV_EXPORT_CONST_INT(LV_ANIM_REPEAT_INFINITE); +LV_EXPORT_CONST_INT(LV_ANIM_PLAYTIME_INFINITE); + +/********************** + * TYPEDEFS + **********************/ + +/** Can be used to indicate if animations are enabled or disabled in a case*/ +typedef enum { + LV_ANIM_OFF, + LV_ANIM_ON, +} lv_anim_enable_t; + +struct _lv_anim_t; +struct _lv_timer_t; + +/** Get the current value during an animation*/ +typedef int32_t (*lv_anim_path_cb_t)(const struct _lv_anim_t *); + +/** Generic prototype of "animator" functions. + * First parameter is the variable to animate. + * Second parameter is the value to set. + * Compatible with `lv_xxx_set_yyy(obj, value)` functions + * The `x` in `_xcb_t` means it's not a fully generic prototype because + * it doesn't receive `lv_anim_t *` as its first argument*/ +typedef void (*lv_anim_exec_xcb_t)(void *, int32_t); + +/** Same as `lv_anim_exec_xcb_t` but receives `lv_anim_t *` as the first parameter. + * It's more consistent but less convenient. Might be used by binding generator functions.*/ +typedef void (*lv_anim_custom_exec_cb_t)(struct _lv_anim_t *, int32_t); + +/** Callback to call when the animation is ready*/ +typedef void (*lv_anim_ready_cb_t)(struct _lv_anim_t *); + +/** Callback to call when the animation really stars (considering `delay`)*/ +typedef void (*lv_anim_start_cb_t)(struct _lv_anim_t *); + +/** Callback used when the animation values are relative to get the current value*/ +typedef int32_t (*lv_anim_get_value_cb_t)(struct _lv_anim_t *); + +/** Callback used when the animation is deleted*/ +typedef void (*lv_anim_deleted_cb_t)(struct _lv_anim_t *); + +/** Describes an animation*/ +typedef struct _lv_anim_t { + void * var; /**var = var; +} + +/** + * Set a function to animate `var` + * @param a pointer to an initialized `lv_anim_t` variable + * @param exec_cb a function to execute during animation + * LVGL's built-in functions can be used. + * E.g. lv_obj_set_x + */ +static inline void lv_anim_set_exec_cb(lv_anim_t * a, lv_anim_exec_xcb_t exec_cb) +{ + a->exec_cb = exec_cb; +} + +/** + * Set the duration of an animation + * @param a pointer to an initialized `lv_anim_t` variable + * @param duration duration of the animation in milliseconds + */ +static inline void lv_anim_set_time(lv_anim_t * a, uint32_t duration) +{ + a->time = duration; +} + +/** + * Set a delay before starting the animation + * @param a pointer to an initialized `lv_anim_t` variable + * @param delay delay before the animation in milliseconds + */ +static inline void lv_anim_set_delay(lv_anim_t * a, uint32_t delay) +{ + a->act_time = -(int32_t)(delay); +} + +/** + * Set the start and end values of an animation + * @param a pointer to an initialized `lv_anim_t` variable + * @param start the start value + * @param end the end value + */ +static inline void lv_anim_set_values(lv_anim_t * a, int32_t start, int32_t end) +{ + a->start_value = start; + a->current_value = start; + a->end_value = end; +} + +/** + * Similar to `lv_anim_set_exec_cb` but `lv_anim_custom_exec_cb_t` receives + * `lv_anim_t * ` as its first parameter instead of `void *`. + * This function might be used when LVGL is bound to other languages because + * it's more consistent to have `lv_anim_t *` as first parameter. + * The variable to animate can be stored in the animation's `user_data` + * @param a pointer to an initialized `lv_anim_t` variable + * @param exec_cb a function to execute. + */ +static inline void lv_anim_set_custom_exec_cb(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb) +{ + a->var = a; + a->exec_cb = (lv_anim_exec_xcb_t)exec_cb; +} + +/** + * Set the path (curve) of the animation. + * @param a pointer to an initialized `lv_anim_t` variable + * @param path_cb a function to set the current value of the animation. + */ +static inline void lv_anim_set_path_cb(lv_anim_t * a, lv_anim_path_cb_t path_cb) +{ + a->path_cb = path_cb; +} + +/** + * Set a function call when the animation really starts (considering `delay`) + * @param a pointer to an initialized `lv_anim_t` variable + * @param start_cb a function call when the animation starts + */ +static inline void lv_anim_set_start_cb(lv_anim_t * a, lv_anim_start_cb_t start_cb) +{ + a->start_cb = start_cb; +} + +/** + * Set a function to use the current value of the variable and make start and end value + * relative to the returned current value. + * @param a pointer to an initialized `lv_anim_t` variable + * @param get_value_cb a function call when the animation starts + */ +static inline void lv_anim_set_get_value_cb(lv_anim_t * a, lv_anim_get_value_cb_t get_value_cb) +{ + a->get_value_cb = get_value_cb; +} + +/** + * Set a function call when the animation is ready + * @param a pointer to an initialized `lv_anim_t` variable + * @param ready_cb a function call when the animation is ready + */ +static inline void lv_anim_set_ready_cb(lv_anim_t * a, lv_anim_ready_cb_t ready_cb) +{ + a->ready_cb = ready_cb; +} + +/** + * Set a function call when the animation is deleted. + * @param a pointer to an initialized `lv_anim_t` variable + * @param deleted_cb a function call when the animation is deleted + */ +static inline void lv_anim_set_deleted_cb(lv_anim_t * a, lv_anim_deleted_cb_t deleted_cb) +{ + a->deleted_cb = deleted_cb; +} + +/** + * Make the animation to play back to when the forward direction is ready + * @param a pointer to an initialized `lv_anim_t` variable + * @param time the duration of the playback animation in milliseconds. 0: disable playback + */ +static inline void lv_anim_set_playback_time(lv_anim_t * a, uint32_t time) +{ + a->playback_time = time; +} + +/** + * Make the animation to play back to when the forward direction is ready + * @param a pointer to an initialized `lv_anim_t` variable + * @param delay delay in milliseconds before starting the playback animation. + */ +static inline void lv_anim_set_playback_delay(lv_anim_t * a, uint32_t delay) +{ + a->playback_delay = delay; +} + +/** + * Make the animation repeat itself. + * @param a pointer to an initialized `lv_anim_t` variable + * @param cnt repeat count or `LV_ANIM_REPEAT_INFINITE` for infinite repetition. 0: to disable repetition. + */ +static inline void lv_anim_set_repeat_count(lv_anim_t * a, uint16_t cnt) +{ + a->repeat_cnt = cnt; +} + +/** + * Set a delay before repeating the animation. + * @param a pointer to an initialized `lv_anim_t` variable + * @param delay delay in milliseconds before repeating the animation. + */ +static inline void lv_anim_set_repeat_delay(lv_anim_t * a, uint32_t delay) +{ + a->repeat_delay = delay; +} + +/** + * Set a whether the animation's should be applied immediately or only when the delay expired. + * @param a pointer to an initialized `lv_anim_t` variable + * @param en true: apply the start value immediately in `lv_anim_start`; + * false: apply the start value only when `delay` ms is elapsed and the animations really starts + */ +static inline void lv_anim_set_early_apply(lv_anim_t * a, bool en) +{ + a->early_apply = en; +} + +/** + * Set the custom user data field of the animation. + * @param a pointer to an initialized `lv_anim_t` variable + * @param user_data pointer to the new user_data. + */ +#if LV_USE_USER_DATA +static inline void lv_anim_set_user_data(lv_anim_t * a, void * user_data) +{ + a->user_data = user_data; +} +#endif + +/** + * Create an animation + * @param a an initialized 'anim_t' variable. Not required after call. + * @return pointer to the created animation (different from the `a` parameter) + */ +lv_anim_t * lv_anim_start(const lv_anim_t * a); + +/** + * Get a delay before starting the animation + * @param a pointer to an initialized `lv_anim_t` variable + * @return delay before the animation in milliseconds + */ +static inline uint32_t lv_anim_get_delay(lv_anim_t * a) +{ + return -a->act_time; +} + +/** + * Get the time used to play the animation. + * @param a pointer to an animation. + * @return the play time in milliseconds. + */ +uint32_t lv_anim_get_playtime(lv_anim_t * a); + +/** + * Get the user_data field of the animation + * @param a pointer to an initialized `lv_anim_t` variable + * @return the pointer to the custom user_data of the animation + */ +#if LV_USE_USER_DATA +static inline void * lv_anim_get_user_data(lv_anim_t * a) +{ + return a->user_data; +} +#endif + +/** + * Delete an animation of a variable with a given animator function + * @param var pointer to variable + * @param exec_cb a function pointer which is animating 'var', + * or NULL to ignore it and delete all the animations of 'var + * @return true: at least 1 animation is deleted, false: no animation is deleted + */ +bool lv_anim_del(void * var, lv_anim_exec_xcb_t exec_cb); + +/** + * Delete all the animations + */ +void lv_anim_del_all(void); + +/** + * Get the animation of a variable and its `exec_cb`. + * @param var pointer to variable + * @param exec_cb a function pointer which is animating 'var', or NULL to return first matching 'var' + * @return pointer to the animation. + */ +lv_anim_t * lv_anim_get(void * var, lv_anim_exec_xcb_t exec_cb); + +/** + * Get global animation refresher timer. + * @return pointer to the animation refresher timer. + */ +struct _lv_timer_t * lv_anim_get_timer(void); + +/** + * Delete an animation by getting the animated variable from `a`. + * Only animations with `exec_cb` will be deleted. + * This function exists because it's logical that all anim. functions receives an + * `lv_anim_t` as their first parameter. It's not practical in C but might make + * the API more consequent and makes easier to generate bindings. + * @param a pointer to an animation. + * @param exec_cb a function pointer which is animating 'var', + * or NULL to ignore it and delete all the animations of 'var + * @return true: at least 1 animation is deleted, false: no animation is deleted + */ +static inline bool lv_anim_custom_del(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb) +{ + return lv_anim_del(a ? a->var : NULL, (lv_anim_exec_xcb_t)exec_cb); +} + +/** + * Get the animation of a variable and its `exec_cb`. + * This function exists because it's logical that all anim. functions receives an + * `lv_anim_t` as their first parameter. It's not practical in C but might make + * the API more consequent and makes easier to generate bindings. + * @param a pointer to an animation. + * @param exec_cb a function pointer which is animating 'var', or NULL to return first matching 'var' + * @return pointer to the animation. + */ +static inline lv_anim_t * lv_anim_custom_get(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb) +{ + return lv_anim_get(a ? a->var : NULL, (lv_anim_exec_xcb_t)exec_cb); +} + +/** + * Get the number of currently running animations + * @return the number of running animations + */ +uint16_t lv_anim_count_running(void); + +/** + * Calculate the time of an animation with a given speed and the start and end values + * @param speed speed of animation in unit/sec + * @param start start value of the animation + * @param end end value of the animation + * @return the required time [ms] for the animation with the given parameters + */ +uint32_t lv_anim_speed_to_time(uint32_t speed, int32_t start, int32_t end); + +/** + * Manually refresh the state of the animations. + * Useful to make the animations running in a blocking process where + * `lv_timer_handler` can't run for a while. + * Shouldn't be used directly because it is called in `lv_refr_now()`. + */ +void lv_anim_refr_now(void); + +/** + * Calculate the current value of an animation applying linear characteristic + * @param a pointer to an animation + * @return the current value to set + */ +int32_t lv_anim_path_linear(const lv_anim_t * a); + +/** + * Calculate the current value of an animation slowing down the start phase + * @param a pointer to an animation + * @return the current value to set + */ +int32_t lv_anim_path_ease_in(const lv_anim_t * a); + +/** + * Calculate the current value of an animation slowing down the end phase + * @param a pointer to an animation + * @return the current value to set + */ +int32_t lv_anim_path_ease_out(const lv_anim_t * a); + +/** + * Calculate the current value of an animation applying an "S" characteristic (cosine) + * @param a pointer to an animation + * @return the current value to set + */ +int32_t lv_anim_path_ease_in_out(const lv_anim_t * a); + +/** + * Calculate the current value of an animation with overshoot at the end + * @param a pointer to an animation + * @return the current value to set + */ +int32_t lv_anim_path_overshoot(const lv_anim_t * a); + +/** + * Calculate the current value of an animation with 3 bounces + * @param a pointer to an animation + * @return the current value to set + */ +int32_t lv_anim_path_bounce(const lv_anim_t * a); + +/** + * Calculate the current value of an animation applying step characteristic. + * (Set end value on the end of the animation) + * @param a pointer to an animation + * @return the current value to set + */ +int32_t lv_anim_path_step(const lv_anim_t * a); + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ANIM_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_anim_timeline.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_anim_timeline.c new file mode 100644 index 0000000..08d5321 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_anim_timeline.c @@ -0,0 +1,198 @@ +/** + * @file lv_anim_timeline.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_anim_timeline.h" +#include "lv_mem.h" +#include "lv_assert.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of anim_timeline_dsc*/ +typedef struct { + lv_anim_t anim; + uint32_t start_time; +} lv_anim_timeline_dsc_t; + +/*Data of anim_timeline*/ +struct _lv_anim_timeline_t { + lv_anim_timeline_dsc_t * anim_dsc; /**< Dynamically allocated anim dsc array*/ + uint32_t anim_dsc_cnt; /**< The length of anim dsc array*/ + bool reverse; /**< Reverse playback*/ +}; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_anim_timeline_virtual_exec_cb(void * var, int32_t v); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_anim_timeline_t * lv_anim_timeline_create(void) +{ + lv_anim_timeline_t * at = (lv_anim_timeline_t *)lv_mem_alloc(sizeof(lv_anim_timeline_t)); + + LV_ASSERT_MALLOC(at); + + if(at) lv_memset_00(at, sizeof(lv_anim_timeline_t)); + + return at; +} + +void lv_anim_timeline_del(lv_anim_timeline_t * at) +{ + LV_ASSERT_NULL(at); + + lv_anim_timeline_stop(at); + + lv_mem_free(at->anim_dsc); + lv_mem_free(at); +} + +void lv_anim_timeline_add(lv_anim_timeline_t * at, uint32_t start_time, lv_anim_t * a) +{ + LV_ASSERT_NULL(at); + + at->anim_dsc_cnt++; + at->anim_dsc = lv_mem_realloc(at->anim_dsc, at->anim_dsc_cnt * sizeof(lv_anim_timeline_dsc_t)); + + LV_ASSERT_MALLOC(at->anim_dsc); + + at->anim_dsc[at->anim_dsc_cnt - 1].anim = *a; + at->anim_dsc[at->anim_dsc_cnt - 1].start_time = start_time; + + /*Add default var and virtual exec_cb, used to delete animation.*/ + if(a->var == NULL && a->exec_cb == NULL) { + at->anim_dsc[at->anim_dsc_cnt - 1].anim.var = at; + at->anim_dsc[at->anim_dsc_cnt - 1].anim.exec_cb = lv_anim_timeline_virtual_exec_cb; + } +} + +uint32_t lv_anim_timeline_start(lv_anim_timeline_t * at) +{ + LV_ASSERT_NULL(at); + + const uint32_t playtime = lv_anim_timeline_get_playtime(at); + bool reverse = at->reverse; + + for(uint32_t i = 0; i < at->anim_dsc_cnt; i++) { + lv_anim_t a = at->anim_dsc[i].anim; + uint32_t start_time = at->anim_dsc[i].start_time; + + if(reverse) { + int32_t temp = a.start_value; + a.start_value = a.end_value; + a.end_value = temp; + lv_anim_set_delay(&a, playtime - (start_time + a.time)); + } + else { + lv_anim_set_delay(&a, start_time); + } + + lv_anim_start(&a); + } + + return playtime; +} + +void lv_anim_timeline_stop(lv_anim_timeline_t * at) +{ + LV_ASSERT_NULL(at); + + for(uint32_t i = 0; i < at->anim_dsc_cnt; i++) { + lv_anim_t * a = &(at->anim_dsc[i].anim); + lv_anim_del(a->var, a->exec_cb); + } +} + +void lv_anim_timeline_set_reverse(lv_anim_timeline_t * at, bool reverse) +{ + LV_ASSERT_NULL(at); + at->reverse = reverse; +} + +void lv_anim_timeline_set_progress(lv_anim_timeline_t * at, uint16_t progress) +{ + LV_ASSERT_NULL(at); + + const uint32_t playtime = lv_anim_timeline_get_playtime(at); + const uint32_t act_time = progress * playtime / 0xFFFF; + + for(uint32_t i = 0; i < at->anim_dsc_cnt; i++) { + lv_anim_t * a = &(at->anim_dsc[i].anim); + + if(a->exec_cb == NULL) { + continue; + } + + uint32_t start_time = at->anim_dsc[i].start_time; + int32_t value = 0; + + if(act_time < start_time) { + value = a->start_value; + } + else if(act_time < (start_time + a->time)) { + a->act_time = act_time - start_time; + value = a->path_cb(a); + } + else { + value = a->end_value; + } + + a->exec_cb(a->var, value); + } +} + +uint32_t lv_anim_timeline_get_playtime(lv_anim_timeline_t * at) +{ + LV_ASSERT_NULL(at); + + uint32_t playtime = 0; + for(uint32_t i = 0; i < at->anim_dsc_cnt; i++) { + uint32_t end = lv_anim_get_playtime(&at->anim_dsc[i].anim); + if(end == LV_ANIM_PLAYTIME_INFINITE) + return end; + end += at->anim_dsc[i].start_time; + if(end > playtime) { + playtime = end; + } + } + + return playtime; +} + +bool lv_anim_timeline_get_reverse(lv_anim_timeline_t * at) +{ + LV_ASSERT_NULL(at); + return at->reverse; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_anim_timeline_virtual_exec_cb(void * var, int32_t v) +{ + LV_UNUSED(var); + LV_UNUSED(v); +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_anim_timeline.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_anim_timeline.h new file mode 100644 index 0000000..d4dd0fc --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_anim_timeline.h @@ -0,0 +1,103 @@ +/** + * @file lv_anim_timeline.h + * + */ + +#ifndef LV_ANIM_TIMELINE_H +#define LV_ANIM_TIMELINE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_anim.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_anim_timeline_t; + +typedef struct _lv_anim_timeline_t lv_anim_timeline_t; + +/********************** +* GLOBAL PROTOTYPES +**********************/ + +/** + * Create an animation timeline. + * @return pointer to the animation timeline. + */ +lv_anim_timeline_t * lv_anim_timeline_create(void); + +/** + * Delete animation timeline. + * @param at pointer to the animation timeline. + */ +void lv_anim_timeline_del(lv_anim_timeline_t * at); + +/** + * Add animation to the animation timeline. + * @param at pointer to the animation timeline. + * @param start_time the time the animation started on the timeline, note that start_time will override the value of delay. + * @param a pointer to an animation. + */ +void lv_anim_timeline_add(lv_anim_timeline_t * at, uint32_t start_time, lv_anim_t * a); + +/** + * Start the animation timeline. + * @param at pointer to the animation timeline. + * @return total time spent in animation timeline. + */ +uint32_t lv_anim_timeline_start(lv_anim_timeline_t * at); + +/** + * Stop the animation timeline. + * @param at pointer to the animation timeline. + */ +void lv_anim_timeline_stop(lv_anim_timeline_t * at); + +/** + * Set the playback direction of the animation timeline. + * @param at pointer to the animation timeline. + * @param reverse whether to play in reverse. + */ +void lv_anim_timeline_set_reverse(lv_anim_timeline_t * at, bool reverse); + +/** + * Set the progress of the animation timeline. + * @param at pointer to the animation timeline. + * @param progress set value 0~65535 to map 0~100% animation progress. + */ +void lv_anim_timeline_set_progress(lv_anim_timeline_t * at, uint16_t progress); + +/** + * Get the time used to play the animation timeline. + * @param at pointer to the animation timeline. + * @return total time spent in animation timeline. + */ +uint32_t lv_anim_timeline_get_playtime(lv_anim_timeline_t * at); + +/** + * Get whether the animation timeline is played in reverse. + * @param at pointer to the animation timeline. + * @return return true if it is reverse playback. + */ +bool lv_anim_timeline_get_reverse(lv_anim_timeline_t * at); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ANIM_TIMELINE_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_area.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_area.c new file mode 100644 index 0000000..c0221f7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_area.c @@ -0,0 +1,535 @@ +/** + * @file lv_area.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include "lv_area.h" +#include "lv_math.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static bool lv_point_within_circle(const lv_area_t * area, const lv_point_t * p); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Initialize an area + * @param area_p pointer to an area + * @param x1 left coordinate of the area + * @param y1 top coordinate of the area + * @param x2 right coordinate of the area + * @param y2 bottom coordinate of the area + */ +void lv_area_set(lv_area_t * area_p, lv_coord_t x1, lv_coord_t y1, lv_coord_t x2, lv_coord_t y2) +{ + area_p->x1 = x1; + area_p->y1 = y1; + area_p->x2 = x2; + area_p->y2 = y2; +} + +/** + * Set the width of an area + * @param area_p pointer to an area + * @param w the new width of the area (w == 1 makes x1 == x2) + */ +void lv_area_set_width(lv_area_t * area_p, lv_coord_t w) +{ + area_p->x2 = area_p->x1 + w - 1; +} + +/** + * Set the height of an area + * @param area_p pointer to an area + * @param h the new height of the area (h == 1 makes y1 == y2) + */ +void lv_area_set_height(lv_area_t * area_p, lv_coord_t h) +{ + area_p->y2 = area_p->y1 + h - 1; +} + +/** + * Set the position of an area (width and height will be kept) + * @param area_p pointer to an area + * @param x the new x coordinate of the area + * @param y the new y coordinate of the area + */ +void _lv_area_set_pos(lv_area_t * area_p, lv_coord_t x, lv_coord_t y) +{ + lv_coord_t w = lv_area_get_width(area_p); + lv_coord_t h = lv_area_get_height(area_p); + area_p->x1 = x; + area_p->y1 = y; + lv_area_set_width(area_p, w); + lv_area_set_height(area_p, h); +} + +/** + * Return with area of an area (x * y) + * @param area_p pointer to an area + * @return size of area + */ +uint32_t lv_area_get_size(const lv_area_t * area_p) +{ + uint32_t size; + + size = (uint32_t)(area_p->x2 - area_p->x1 + 1) * (area_p->y2 - area_p->y1 + 1); + + return size; +} + +void lv_area_increase(lv_area_t * area, lv_coord_t w_extra, lv_coord_t h_extra) +{ + area->x1 -= w_extra; + area->x2 += w_extra; + area->y1 -= h_extra; + area->y2 += h_extra; +} + +void lv_area_move(lv_area_t * area, lv_coord_t x_ofs, lv_coord_t y_ofs) +{ + area->x1 += x_ofs; + area->x2 += x_ofs; + area->y1 += y_ofs; + area->y2 += y_ofs; +} + +/** + * Get the common parts of two areas + * @param res_p pointer to an area, the result will be stored here + * @param a1_p pointer to the first area + * @param a2_p pointer to the second area + * @return false: the two area has NO common parts, res_p is invalid + */ +bool _lv_area_intersect(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area_t * a2_p) +{ + /*Get the smaller area from 'a1_p' and 'a2_p'*/ + res_p->x1 = LV_MAX(a1_p->x1, a2_p->x1); + res_p->y1 = LV_MAX(a1_p->y1, a2_p->y1); + res_p->x2 = LV_MIN(a1_p->x2, a2_p->x2); + res_p->y2 = LV_MIN(a1_p->y2, a2_p->y2); + + /*If x1 or y1 greater than x2 or y2 then the areas union is empty*/ + bool union_ok = true; + if((res_p->x1 > res_p->x2) || (res_p->y1 > res_p->y2)) { + union_ok = false; + } + + return union_ok; +} + +/** + * Join two areas into a third which involves the other two + * @param res_p pointer to an area, the result will be stored here + * @param a1_p pointer to the first area + * @param a2_p pointer to the second area + */ +void _lv_area_join(lv_area_t * a_res_p, const lv_area_t * a1_p, const lv_area_t * a2_p) +{ + a_res_p->x1 = LV_MIN(a1_p->x1, a2_p->x1); + a_res_p->y1 = LV_MIN(a1_p->y1, a2_p->y1); + a_res_p->x2 = LV_MAX(a1_p->x2, a2_p->x2); + a_res_p->y2 = LV_MAX(a1_p->y2, a2_p->y2); +} + +/** + * Check if a point is on an area + * @param a_p pointer to an area + * @param p_p pointer to a point + * @param radius radius of area (e.g. for rounded rectangle) + * @return false:the point is out of the area + */ +bool _lv_area_is_point_on(const lv_area_t * a_p, const lv_point_t * p_p, lv_coord_t radius) +{ + /*First check the basic area*/ + bool is_on_rect = false; + if((p_p->x >= a_p->x1 && p_p->x <= a_p->x2) && ((p_p->y >= a_p->y1 && p_p->y <= a_p->y2))) { + is_on_rect = true; + } + if(!is_on_rect) + return false; + /*Now handle potential rounded rectangles*/ + if(radius <= 0) { + /*No radius, it is within the rectangle*/ + return true; + } + lv_coord_t w = lv_area_get_width(a_p) / 2; + lv_coord_t h = lv_area_get_height(a_p) / 2; + lv_coord_t max_radius = LV_MIN(w, h); + if(radius > max_radius) + radius = max_radius; + + /*Check if it's in one of the corners*/ + lv_area_t corner_area; + /*Top left*/ + corner_area.x1 = a_p->x1; + corner_area.x2 = a_p->x1 + radius; + corner_area.y1 = a_p->y1; + corner_area.y2 = a_p->y1 + radius; + if(_lv_area_is_point_on(&corner_area, p_p, 0)) { + corner_area.x2 += radius; + corner_area.y2 += radius; + return lv_point_within_circle(&corner_area, p_p); + } + /*Bottom left*/ + corner_area.y1 = a_p->y2 - radius; + corner_area.y2 = a_p->y2; + if(_lv_area_is_point_on(&corner_area, p_p, 0)) { + corner_area.x2 += radius; + corner_area.y1 -= radius; + return lv_point_within_circle(&corner_area, p_p); + } + /*Bottom right*/ + corner_area.x1 = a_p->x2 - radius; + corner_area.x2 = a_p->x2; + if(_lv_area_is_point_on(&corner_area, p_p, 0)) { + corner_area.x1 -= radius; + corner_area.y1 -= radius; + return lv_point_within_circle(&corner_area, p_p); + } + /*Top right*/ + corner_area.y1 = a_p->y1; + corner_area.y2 = a_p->y1 + radius; + if(_lv_area_is_point_on(&corner_area, p_p, 0)) { + corner_area.x1 -= radius; + corner_area.y2 += radius; + return lv_point_within_circle(&corner_area, p_p); + } + /*Not within corners*/ + return true; +} + +/** + * Check if two area has common parts + * @param a1_p pointer to an area. + * @param a2_p pointer to an other area + * @return false: a1_p and a2_p has no common parts + */ +bool _lv_area_is_on(const lv_area_t * a1_p, const lv_area_t * a2_p) +{ + if((a1_p->x1 <= a2_p->x2) && (a1_p->x2 >= a2_p->x1) && (a1_p->y1 <= a2_p->y2) && (a1_p->y2 >= a2_p->y1)) { + return true; + } + else { + return false; + } +} + +/** + * Check if an area is fully on an other + * @param ain_p pointer to an area which could be in 'aholder_p' + * @param aholder_p pointer to an area which could involve 'ain_p' + * @param radius radius of `aholder_p` (e.g. for rounded rectangle) + * @return true: `ain_p` is fully inside `aholder_p` + */ +bool _lv_area_is_in(const lv_area_t * ain_p, const lv_area_t * aholder_p, lv_coord_t radius) +{ + bool is_in = false; + + if(ain_p->x1 >= aholder_p->x1 && ain_p->y1 >= aholder_p->y1 && ain_p->x2 <= aholder_p->x2 && + ain_p->y2 <= aholder_p->y2) { + is_in = true; + } + + if(!is_in) return false; + if(radius == 0) return true; + + /*Check if the corner points are inside the radius or not*/ + lv_point_t p; + + p.x = ain_p->x1; + p.y = ain_p->y1; + if(_lv_area_is_point_on(aholder_p, &p, radius) == false) return false; + + p.x = ain_p->x2; + p.y = ain_p->y1; + if(_lv_area_is_point_on(aholder_p, &p, radius) == false) return false; + + p.x = ain_p->x1; + p.y = ain_p->y2; + if(_lv_area_is_point_on(aholder_p, &p, radius) == false) return false; + + p.x = ain_p->x2; + p.y = ain_p->y2; + if(_lv_area_is_point_on(aholder_p, &p, radius) == false) return false; + + return true; +} + +/** + * Check if an area is fully out of an other + * @param aout_p pointer to an area which could be in 'aholder_p' + * @param aholder_p pointer to an area which could involve 'ain_p' + * @param radius radius of `aholder_p` (e.g. for rounded rectangle) + * @return true: `aout_p` is fully outside `aholder_p` + */ +bool _lv_area_is_out(const lv_area_t * aout_p, const lv_area_t * aholder_p, lv_coord_t radius) +{ + if(aout_p->x2 < aholder_p->x1 || aout_p->y2 < aholder_p->y1 || aout_p->x1 > aholder_p->x2 || + aout_p->y1 > aholder_p->y2) { + return true; + } + + if(radius == 0) return false; + + /*Check if the corner points are outside the radius or not*/ + lv_point_t p; + + p.x = aout_p->x1; + p.y = aout_p->y1; + if(_lv_area_is_point_on(aholder_p, &p, radius)) return false; + + p.x = aout_p->x2; + p.y = aout_p->y1; + if(_lv_area_is_point_on(aholder_p, &p, radius)) return false; + + p.x = aout_p->x1; + p.y = aout_p->y2; + if(_lv_area_is_point_on(aholder_p, &p, radius)) return false; + + p.x = aout_p->x2; + p.y = aout_p->y2; + if(_lv_area_is_point_on(aholder_p, &p, radius)) return false; + + return true; +} + +bool _lv_area_is_equal(const lv_area_t * a, const lv_area_t * b) +{ + return a->x1 == b->x1 && a->x2 == b->x2 && a->y1 == b->y1 && a->y2 == b->y2; +} + +/** + * Align an area to an other + * @param base an are where the other will be aligned + * @param to_align the area to align + * @param align `LV_ALIGN_...` + * @param res x/y coordinates where `to_align` align area should be placed + */ +void lv_area_align(const lv_area_t * base, lv_area_t * to_align, lv_align_t align, lv_coord_t ofs_x, lv_coord_t ofs_y) +{ + + lv_coord_t x; + lv_coord_t y; + switch(align) { + case LV_ALIGN_CENTER: + x = lv_area_get_width(base) / 2 - lv_area_get_width(to_align) / 2; + y = lv_area_get_height(base) / 2 - lv_area_get_height(to_align) / 2; + break; + + case LV_ALIGN_TOP_LEFT: + x = 0; + y = 0; + break; + case LV_ALIGN_TOP_MID: + x = lv_area_get_width(base) / 2 - lv_area_get_width(to_align) / 2; + y = 0; + break; + + case LV_ALIGN_TOP_RIGHT: + x = lv_area_get_width(base) - lv_area_get_width(to_align); + y = 0; + break; + + case LV_ALIGN_BOTTOM_LEFT: + x = 0; + y = lv_area_get_height(base) - lv_area_get_height(to_align); + break; + case LV_ALIGN_BOTTOM_MID: + x = lv_area_get_width(base) / 2 - lv_area_get_width(to_align) / 2; + y = lv_area_get_height(base) - lv_area_get_height(to_align); + break; + + case LV_ALIGN_BOTTOM_RIGHT: + x = lv_area_get_width(base) - lv_area_get_width(to_align); + y = lv_area_get_height(base) - lv_area_get_height(to_align); + break; + + case LV_ALIGN_LEFT_MID: + x = 0; + y = lv_area_get_height(base) / 2 - lv_area_get_height(to_align) / 2; + break; + + case LV_ALIGN_RIGHT_MID: + x = lv_area_get_width(base) - lv_area_get_width(to_align); + y = lv_area_get_height(base) / 2 - lv_area_get_height(to_align) / 2; + break; + + case LV_ALIGN_OUT_TOP_LEFT: + x = 0; + y = -lv_area_get_height(to_align); + break; + + case LV_ALIGN_OUT_TOP_MID: + x = lv_area_get_width(base) / 2 - lv_area_get_width(to_align) / 2; + y = -lv_area_get_height(to_align); + break; + + case LV_ALIGN_OUT_TOP_RIGHT: + x = lv_area_get_width(base) - lv_area_get_width(to_align); + y = -lv_area_get_height(to_align); + break; + + case LV_ALIGN_OUT_BOTTOM_LEFT: + x = 0; + y = lv_area_get_height(base); + break; + + case LV_ALIGN_OUT_BOTTOM_MID: + x = lv_area_get_width(base) / 2 - lv_area_get_width(to_align) / 2; + y = lv_area_get_height(base); + break; + + case LV_ALIGN_OUT_BOTTOM_RIGHT: + x = lv_area_get_width(base) - lv_area_get_width(to_align); + y = lv_area_get_height(base); + break; + + case LV_ALIGN_OUT_LEFT_TOP: + x = -lv_area_get_width(to_align); + y = 0; + break; + + case LV_ALIGN_OUT_LEFT_MID: + x = -lv_area_get_width(to_align); + y = lv_area_get_height(base) / 2 - lv_area_get_height(to_align) / 2; + break; + + case LV_ALIGN_OUT_LEFT_BOTTOM: + x = -lv_area_get_width(to_align); + y = lv_area_get_height(base) - lv_area_get_height(to_align); + break; + + case LV_ALIGN_OUT_RIGHT_TOP: + x = lv_area_get_width(base); + y = 0; + break; + + case LV_ALIGN_OUT_RIGHT_MID: + x = lv_area_get_width(base); + y = lv_area_get_height(base) / 2 - lv_area_get_height(to_align) / 2; + break; + + case LV_ALIGN_OUT_RIGHT_BOTTOM: + x = lv_area_get_width(base); + y = lv_area_get_height(base) - lv_area_get_height(to_align); + break; + default: + x = 0; + y = 0; + break; + } + + x += base->x1; + y += base->y1; + + lv_coord_t w = lv_area_get_width(to_align); + lv_coord_t h = lv_area_get_height(to_align); + to_align->x1 = x + ofs_x; + to_align->y1 = y + ofs_y; + to_align->x2 = to_align->x1 + w - 1; + to_align->y2 = to_align->y1 + h - 1; +} + +#define _LV_TRANSFORM_TRIGO_SHIFT 10 +void lv_point_transform(lv_point_t * p, int32_t angle, int32_t zoom, const lv_point_t * pivot) +{ + if(angle == 0 && zoom == 256) { + return; + } + + p->x -= pivot->x; + p->y -= pivot->y; + + if(angle == 0) { + p->x = (((int32_t)(p->x) * zoom) >> 8) + pivot->x; + p->y = (((int32_t)(p->y) * zoom) >> 8) + pivot->y; + return; + } + + static int32_t angle_prev = INT32_MIN; + static int32_t sinma; + static int32_t cosma; + if(angle_prev != angle) { + int32_t angle_limited = angle; + if(angle_limited > 3600) angle_limited -= 3600; + if(angle_limited < 0) angle_limited += 3600; + + int32_t angle_low = angle_limited / 10; + int32_t angle_high = angle_low + 1; + int32_t angle_rem = angle_limited - (angle_low * 10); + + int32_t s1 = lv_trigo_sin(angle_low); + int32_t s2 = lv_trigo_sin(angle_high); + + int32_t c1 = lv_trigo_sin(angle_low + 90); + int32_t c2 = lv_trigo_sin(angle_high + 90); + + sinma = (s1 * (10 - angle_rem) + s2 * angle_rem) / 10; + cosma = (c1 * (10 - angle_rem) + c2 * angle_rem) / 10; + sinma = sinma >> (LV_TRIGO_SHIFT - _LV_TRANSFORM_TRIGO_SHIFT); + cosma = cosma >> (LV_TRIGO_SHIFT - _LV_TRANSFORM_TRIGO_SHIFT); + angle_prev = angle; + } + int32_t x = p->x; + int32_t y = p->y; + if(zoom == 256) { + p->x = ((cosma * x - sinma * y) >> _LV_TRANSFORM_TRIGO_SHIFT) + pivot->x; + p->y = ((sinma * x + cosma * y) >> _LV_TRANSFORM_TRIGO_SHIFT) + pivot->y; + } + else { + p->x = (((cosma * x - sinma * y) * zoom) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->x; + p->y = (((sinma * x + cosma * y) * zoom) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->y; + } +} + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bool lv_point_within_circle(const lv_area_t * area, const lv_point_t * p) +{ + lv_coord_t r = (area->x2 - area->x1) / 2; + + /*Circle center*/ + lv_coord_t cx = area->x1 + r; + lv_coord_t cy = area->y1 + r; + + /*Simplify the code by moving everything to (0, 0)*/ + lv_coord_t px = p->x - cx; + lv_coord_t py = p->y - cy; + + uint32_t r_sqrd = r * r; + uint32_t dist = (px * px) + (py * py); + + if(dist <= r_sqrd) + return true; + else + return false; +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_area.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_area.h new file mode 100644 index 0000000..137931a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_area.h @@ -0,0 +1,295 @@ +/** + * @file lv_area.h + * + */ + +#ifndef LV_AREA_H +#define LV_AREA_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include +#include + +/********************* + * DEFINES + *********************/ + +#if LV_USE_LARGE_COORD +typedef int32_t lv_coord_t; +#else +typedef int16_t lv_coord_t; +#endif + +/********************** + * TYPEDEFS + **********************/ + +/** + * Represents a point on the screen. + */ +typedef struct { + lv_coord_t x; + lv_coord_t y; +} lv_point_t; + +/** Represents an area of the screen.*/ +typedef struct { + lv_coord_t x1; + lv_coord_t y1; + lv_coord_t x2; + lv_coord_t y2; +} lv_area_t; + +/** Alignments*/ +enum { + LV_ALIGN_DEFAULT = 0, + LV_ALIGN_TOP_LEFT, + LV_ALIGN_TOP_MID, + LV_ALIGN_TOP_RIGHT, + LV_ALIGN_BOTTOM_LEFT, + LV_ALIGN_BOTTOM_MID, + LV_ALIGN_BOTTOM_RIGHT, + LV_ALIGN_LEFT_MID, + LV_ALIGN_RIGHT_MID, + LV_ALIGN_CENTER, + + LV_ALIGN_OUT_TOP_LEFT, + LV_ALIGN_OUT_TOP_MID, + LV_ALIGN_OUT_TOP_RIGHT, + LV_ALIGN_OUT_BOTTOM_LEFT, + LV_ALIGN_OUT_BOTTOM_MID, + LV_ALIGN_OUT_BOTTOM_RIGHT, + LV_ALIGN_OUT_LEFT_TOP, + LV_ALIGN_OUT_LEFT_MID, + LV_ALIGN_OUT_LEFT_BOTTOM, + LV_ALIGN_OUT_RIGHT_TOP, + LV_ALIGN_OUT_RIGHT_MID, + LV_ALIGN_OUT_RIGHT_BOTTOM, +}; +typedef uint8_t lv_align_t; + +enum { + LV_DIR_NONE = 0x00, + LV_DIR_LEFT = (1 << 0), + LV_DIR_RIGHT = (1 << 1), + LV_DIR_TOP = (1 << 2), + LV_DIR_BOTTOM = (1 << 3), + LV_DIR_HOR = LV_DIR_LEFT | LV_DIR_RIGHT, + LV_DIR_VER = LV_DIR_TOP | LV_DIR_BOTTOM, + LV_DIR_ALL = LV_DIR_HOR | LV_DIR_VER, +}; + +typedef uint8_t lv_dir_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize an area + * @param area_p pointer to an area + * @param x1 left coordinate of the area + * @param y1 top coordinate of the area + * @param x2 right coordinate of the area + * @param y2 bottom coordinate of the area + */ +void lv_area_set(lv_area_t * area_p, lv_coord_t x1, lv_coord_t y1, lv_coord_t x2, lv_coord_t y2); + +/** + * Copy an area + * @param dest pointer to the destination area + * @param src pointer to the source area + */ +inline static void lv_area_copy(lv_area_t * dest, const lv_area_t * src) +{ + dest->x1 = src->x1; + dest->y1 = src->y1; + dest->x2 = src->x2; + dest->y2 = src->y2; +} + +/** + * Get the width of an area + * @param area_p pointer to an area + * @return the width of the area (if x1 == x2 -> width = 1) + */ +static inline lv_coord_t lv_area_get_width(const lv_area_t * area_p) +{ + return (lv_coord_t)(area_p->x2 - area_p->x1 + 1); +} + +/** + * Get the height of an area + * @param area_p pointer to an area + * @return the height of the area (if y1 == y2 -> height = 1) + */ +static inline lv_coord_t lv_area_get_height(const lv_area_t * area_p) +{ + return (lv_coord_t)(area_p->y2 - area_p->y1 + 1); +} + +/** + * Set the width of an area + * @param area_p pointer to an area + * @param w the new width of the area (w == 1 makes x1 == x2) + */ +void lv_area_set_width(lv_area_t * area_p, lv_coord_t w); + +/** + * Set the height of an area + * @param area_p pointer to an area + * @param h the new height of the area (h == 1 makes y1 == y2) + */ +void lv_area_set_height(lv_area_t * area_p, lv_coord_t h); + +/** + * Set the position of an area (width and height will be kept) + * @param area_p pointer to an area + * @param x the new x coordinate of the area + * @param y the new y coordinate of the area + */ +void _lv_area_set_pos(lv_area_t * area_p, lv_coord_t x, lv_coord_t y); + +/** + * Return with area of an area (x * y) + * @param area_p pointer to an area + * @return size of area + */ +uint32_t lv_area_get_size(const lv_area_t * area_p); + +void lv_area_increase(lv_area_t * area, lv_coord_t w_extra, lv_coord_t h_extra); + +void lv_area_move(lv_area_t * area, lv_coord_t x_ofs, lv_coord_t y_ofs); + +/** + * Get the common parts of two areas + * @param res_p pointer to an area, the result will be stored her + * @param a1_p pointer to the first area + * @param a2_p pointer to the second area + * @return false: the two area has NO common parts, res_p is invalid + */ +bool _lv_area_intersect(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area_t * a2_p); + +/** + * Join two areas into a third which involves the other two + * @param res_p pointer to an area, the result will be stored here + * @param a1_p pointer to the first area + * @param a2_p pointer to the second area + */ +void _lv_area_join(lv_area_t * a_res_p, const lv_area_t * a1_p, const lv_area_t * a2_p); + +/** + * Check if a point is on an area + * @param a_p pointer to an area + * @param p_p pointer to a point + * @param radius radius of area (e.g. for rounded rectangle) + * @return false:the point is out of the area + */ +bool _lv_area_is_point_on(const lv_area_t * a_p, const lv_point_t * p_p, lv_coord_t radius); + +/** + * Check if two area has common parts + * @param a1_p pointer to an area. + * @param a2_p pointer to an other area + * @return false: a1_p and a2_p has no common parts + */ +bool _lv_area_is_on(const lv_area_t * a1_p, const lv_area_t * a2_p); + +/** + * Check if an area is fully on an other + * @param ain_p pointer to an area which could be in 'aholder_p' + * @param aholder_p pointer to an area which could involve 'ain_p' + * @param radius radius of `aholder_p` (e.g. for rounded rectangle) + * @return true: `ain_p` is fully inside `aholder_p` + */ +bool _lv_area_is_in(const lv_area_t * ain_p, const lv_area_t * aholder_p, lv_coord_t radius); + + +/** + * Check if an area is fully out of an other + * @param aout_p pointer to an area which could be in 'aholder_p' + * @param aholder_p pointer to an area which could involve 'ain_p' + * @param radius radius of `aholder_p` (e.g. for rounded rectangle) + * @return true: `aout_p` is fully outside `aholder_p` + */ +bool _lv_area_is_out(const lv_area_t * aout_p, const lv_area_t * aholder_p, lv_coord_t radius); + +/** + * Check if 2 area is the same + * @param a pointer to an area + * @param b pointer to another area + */ +bool _lv_area_is_equal(const lv_area_t * a, const lv_area_t * b); + +/** + * Align an area to an other + * @param base an are where the other will be aligned + * @param to_align the area to align + * @param align `LV_ALIGN_...` + */ +void lv_area_align(const lv_area_t * base, lv_area_t * to_align, lv_align_t align, lv_coord_t ofs_x, lv_coord_t ofs_y); + +void lv_point_transform(lv_point_t * p, int32_t angle, int32_t zoom, const lv_point_t * pivot); + +/********************** + * MACROS + **********************/ + +#if LV_USE_LARGE_COORD +#define _LV_COORD_TYPE_SHIFT (29U) +#else +#define _LV_COORD_TYPE_SHIFT (13U) +#endif + +#define _LV_COORD_TYPE_MASK (3 << _LV_COORD_TYPE_SHIFT) +#define _LV_COORD_TYPE(x) ((x) & _LV_COORD_TYPE_MASK) /*Extract type specifiers*/ +#define _LV_COORD_PLAIN(x) ((x) & ~_LV_COORD_TYPE_MASK) /*Remove type specifiers*/ + +#define _LV_COORD_TYPE_PX (0 << _LV_COORD_TYPE_SHIFT) +#define _LV_COORD_TYPE_SPEC (1 << _LV_COORD_TYPE_SHIFT) +#define _LV_COORD_TYPE_PX_NEG (3 << _LV_COORD_TYPE_SHIFT) + +#define LV_COORD_IS_PX(x) (_LV_COORD_TYPE(x) == _LV_COORD_TYPE_PX || \ + _LV_COORD_TYPE(x) == _LV_COORD_TYPE_PX_NEG ? true : false) +#define LV_COORD_IS_SPEC(x) (_LV_COORD_TYPE(x) == _LV_COORD_TYPE_SPEC ? true : false) + +#define LV_COORD_SET_SPEC(x) ((x) | _LV_COORD_TYPE_SPEC) + +/*Special coordinates*/ +#define LV_PCT(x) (x < 0 ? LV_COORD_SET_SPEC(1000 - (x)) : LV_COORD_SET_SPEC(x)) +#define LV_COORD_IS_PCT(x) ((LV_COORD_IS_SPEC(x) && _LV_COORD_PLAIN(x) <= 2000) ? true : false) +#define LV_COORD_GET_PCT(x) (_LV_COORD_PLAIN(x) > 1000 ? 1000 - _LV_COORD_PLAIN(x) : _LV_COORD_PLAIN(x)) +#define LV_SIZE_CONTENT LV_COORD_SET_SPEC(2001) + +LV_EXPORT_CONST_INT(LV_SIZE_CONTENT); + +/*Max coordinate value*/ +#define LV_COORD_MAX ((1 << _LV_COORD_TYPE_SHIFT) - 1) +#define LV_COORD_MIN (-LV_COORD_MAX) + +LV_EXPORT_CONST_INT(LV_COORD_MAX); +LV_EXPORT_CONST_INT(LV_COORD_MIN); + +/** + * Convert a percentage value to `lv_coord_t`. + * Percentage values are stored in special range + * @param x the percentage (0..1000) + * @return a coordinate that stores the percentage + */ +static inline lv_coord_t lv_pct(lv_coord_t x) +{ + return LV_PCT(x); +} + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_assert.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_assert.h new file mode 100644 index 0000000..48db744 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_assert.h @@ -0,0 +1,79 @@ +/** + * @file lv_assert.h + * + */ + +#ifndef LV_ASSERT_H +#define LV_ASSERT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "lv_log.h" +#include "lv_mem.h" +#include LV_ASSERT_HANDLER_INCLUDE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#define LV_ASSERT(expr) \ + do { \ + if(!(expr)) { \ + LV_LOG_ERROR("Asserted at expression: %s", #expr); \ + LV_ASSERT_HANDLER \ + } \ + } while(0) + +#define LV_ASSERT_MSG(expr, msg) \ + do { \ + if(!(expr)) { \ + LV_LOG_ERROR("Asserted at expression: %s (%s)", #expr, msg); \ + LV_ASSERT_HANDLER \ + } \ + } while(0) + +/*----------------- + * ASSERTS + *-----------------*/ + +#if LV_USE_ASSERT_NULL +# define LV_ASSERT_NULL(p) LV_ASSERT_MSG(p != NULL, "NULL pointer"); +#else +# define LV_ASSERT_NULL(p) +#endif + +#if LV_USE_ASSERT_MALLOC +# define LV_ASSERT_MALLOC(p) LV_ASSERT_MSG(p != NULL, "Out of memory"); +#else +# define LV_ASSERT_MALLOC(p) +#endif + +#if LV_USE_ASSERT_MEM_INTEGRITY +# define LV_ASSERT_MEM_INTEGRITY() LV_ASSERT_MSG(lv_mem_test() == LV_RES_OK, "Memory integrity error"); +#else +# define LV_ASSERT_MEM_INTEGRITY() +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ASSERT_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_async.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_async.c new file mode 100644 index 0000000..c4941e8 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_async.c @@ -0,0 +1,105 @@ +/** + * @file lv_async.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_async.h" +#include "lv_mem.h" +#include "lv_timer.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_async_info_t { + lv_async_cb_t cb; + void * user_data; +} lv_async_info_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_async_timer_cb(lv_timer_t * timer); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_res_t lv_async_call(lv_async_cb_t async_xcb, void * user_data) +{ + /*Allocate an info structure*/ + lv_async_info_t * info = lv_mem_alloc(sizeof(lv_async_info_t)); + + if(info == NULL) + return LV_RES_INV; + + /*Create a new timer*/ + lv_timer_t * timer = lv_timer_create(lv_async_timer_cb, 0, info); + + if(timer == NULL) { + lv_mem_free(info); + return LV_RES_INV; + } + + info->cb = async_xcb; + info->user_data = user_data; + + lv_timer_set_repeat_count(timer, 1); + return LV_RES_OK; +} + +lv_res_t lv_async_call_cancel(lv_async_cb_t async_xcb, void * user_data) +{ + lv_timer_t * timer = lv_timer_get_next(NULL); + lv_res_t res = LV_RES_INV; + + while(timer != NULL) { + /*Find the next timer node*/ + lv_timer_t * timer_next = lv_timer_get_next(timer); + + /*Find async timer callback*/ + if(timer->timer_cb == lv_async_timer_cb) { + lv_async_info_t * info = (lv_async_info_t *)timer->user_data; + + /*Match user function callback and user data*/ + if(info->cb == async_xcb && info->user_data == user_data) { + lv_timer_del(timer); + lv_mem_free(info); + res = LV_RES_OK; + } + } + + timer = timer_next; + } + + return res; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_async_timer_cb(lv_timer_t * timer) +{ + lv_async_info_t * info = (lv_async_info_t *)timer->user_data; + + info->cb(info->user_data); + lv_mem_free(info); +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_async.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_async.h new file mode 100644 index 0000000..4ad5756 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_async.h @@ -0,0 +1,61 @@ +/** + * @file lv_async.h + * + */ + +#ifndef LV_ASYNC_H +#define LV_ASYNC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Type for async callback. + */ +typedef void (*lv_async_cb_t)(void *); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Call an asynchronous function the next time lv_timer_handler() is run. This function is likely to return + * **before** the call actually happens! + * @param async_xcb a callback which is the task itself. + * (the 'x' in the argument name indicates that it's not a fully generic function because it not follows + * the `func_name(object, callback, ...)` convention) + * @param user_data custom parameter + */ +lv_res_t lv_async_call(lv_async_cb_t async_xcb, void * user_data); + +/** + * Cancel an asynchronous function call + * @param async_xcb a callback which is the task itself. + * @param user_data custom parameter + */ +lv_res_t lv_async_call_cancel(lv_async_cb_t async_xcb, void * user_data); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ASYNC_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_bidi.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_bidi.c new file mode 100644 index 0000000..3dc3ce7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_bidi.c @@ -0,0 +1,682 @@ +/** + * @file lv_bidi.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include +#include "lv_bidi.h" +#include "lv_txt.h" +#include "../misc/lv_mem.h" + +#if LV_USE_BIDI + +/********************* + * DEFINES + *********************/ +#define LV_BIDI_BRACKLET_DEPTH 4 + +// Highest bit of the 16-bit pos_conv value specifies whether this pos is RTL or not +#define GET_POS(x) ((x) & 0x7FFF) +#define IS_RTL_POS(x) (((x) & 0x8000) != 0) +#define SET_RTL_POS(x, is_rtl) (GET_POS(x) | ((is_rtl)? 0x8000: 0)) + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + uint32_t bracklet_pos; + lv_base_dir_t dir; +} bracket_stack_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static uint32_t lv_bidi_get_next_paragraph(const char * txt); +static lv_base_dir_t lv_bidi_get_letter_dir(uint32_t letter); +static bool lv_bidi_letter_is_weak(uint32_t letter); +static bool lv_bidi_letter_is_rtl(uint32_t letter); +static bool lv_bidi_letter_is_neutral(uint32_t letter); + +static lv_base_dir_t get_next_run(const char * txt, lv_base_dir_t base_dir, uint32_t max_len, uint32_t * len, + uint16_t * pos_conv_len); +static void rtl_reverse(char * dest, const char * src, uint32_t len, uint16_t * pos_conv_out, uint16_t pos_conv_rd_base, + uint16_t pos_conv_len); +static uint32_t char_change_to_pair(uint32_t letter); +static lv_base_dir_t bracket_process(const char * txt, uint32_t next_pos, uint32_t len, uint32_t letter, + lv_base_dir_t base_dir); +static void fill_pos_conv(uint16_t * out, uint16_t len, uint16_t index); +static uint32_t get_txt_len(const char * txt, uint32_t max_len); + +/********************** + * STATIC VARIABLES + **********************/ +static const uint8_t bracket_left[] = {"<({["}; +static const uint8_t bracket_right[] = {">)}]"}; +static bracket_stack_t br_stack[LV_BIDI_BRACKLET_DEPTH]; +static uint8_t br_stack_p; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Convert a text to get the characters in the correct visual order according to + * Unicode Bidirectional Algorithm + * @param str_in the text to process + * @param str_out store the result here. Has the be `strlen(str_in)` length + * @param base_dir `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` + */ +void _lv_bidi_process(const char * str_in, char * str_out, lv_base_dir_t base_dir) +{ + if(base_dir == LV_BASE_DIR_AUTO) base_dir = _lv_bidi_detect_base_dir(str_in); + + uint32_t par_start = 0; + uint32_t par_len; + + while(str_in[par_start] == '\n' || str_in[par_start] == '\r') { + str_out[par_start] = str_in[par_start]; + par_start ++; + } + + while(str_in[par_start] != '\0') { + par_len = lv_bidi_get_next_paragraph(&str_in[par_start]); + _lv_bidi_process_paragraph(&str_in[par_start], &str_out[par_start], par_len, base_dir, NULL, 0); + par_start += par_len; + + while(str_in[par_start] == '\n' || str_in[par_start] == '\r') { + str_out[par_start] = str_in[par_start]; + par_start ++; + } + } + + str_out[par_start] = '\0'; +} + +/** + * Auto-detect the direction of a text based on the first strong character + * @param txt the text to process + * @return `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` + */ +lv_base_dir_t _lv_bidi_detect_base_dir(const char * txt) +{ + uint32_t i = 0; + uint32_t letter; + while(txt[i] != '\0') { + letter = _lv_txt_encoded_next(txt, &i); + + lv_base_dir_t dir; + dir = lv_bidi_get_letter_dir(letter); + if(dir == LV_BASE_DIR_RTL || dir == LV_BASE_DIR_LTR) return dir; + } + + /*If there were no strong char earlier return with the default base dir*/ + if(LV_BIDI_BASE_DIR_DEF == LV_BASE_DIR_AUTO) return LV_BASE_DIR_LTR; + else return LV_BIDI_BASE_DIR_DEF; +} + +/** + * Get the logical position of a character in a line + * @param str_in the input string. Can be only one line. + * @param bidi_txt internally the text is bidi processed which buffer can be get here. + * If not required anymore has to freed with `lv_mem_free()` + * Can be `NULL` is unused + * @param len length of the line in character count + * @param base_dir base direction of the text: `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` + * @param visual_pos the visual character position which logical position should be get + * @param is_rtl tell the char at `visual_pos` is RTL or LTR context + * @return the logical character position + */ +uint16_t _lv_bidi_get_logical_pos(const char * str_in, char ** bidi_txt, uint32_t len, lv_base_dir_t base_dir, + uint32_t visual_pos, bool * is_rtl) +{ + uint32_t pos_conv_len = get_txt_len(str_in, len); + char * buf = lv_mem_buf_get(len + 1); + if(buf == NULL) return (uint16_t) -1; + + uint16_t * pos_conv_buf = lv_mem_buf_get(pos_conv_len * sizeof(uint16_t)); + if(pos_conv_buf == NULL) { + lv_mem_buf_release(buf); + return (uint16_t) -1; + } + + if(bidi_txt) *bidi_txt = buf; + + _lv_bidi_process_paragraph(str_in, bidi_txt ? *bidi_txt : NULL, len, base_dir, pos_conv_buf, pos_conv_len); + + if(is_rtl) *is_rtl = IS_RTL_POS(pos_conv_buf[visual_pos]); + + if(bidi_txt == NULL) lv_mem_buf_release(buf); + uint16_t res = GET_POS(pos_conv_buf[visual_pos]); + lv_mem_buf_release(pos_conv_buf); + return res; +} + +/** + * Get the visual position of a character in a line + * @param str_in the input string. Can be only one line. + * @param bidi_txt internally the text is bidi processed which buffer can be get here. + * If not required anymore has to freed with `lv_mem_free()` + * Can be `NULL` is unused + * @param len length of the line in character count + * @param base_dir base direction of the text: `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` + * @param logical_pos the logical character position which visual position should be get + * @param is_rtl tell the char at `logical_pos` is RTL or LTR context + * @return the visual character position + */ +uint16_t _lv_bidi_get_visual_pos(const char * str_in, char ** bidi_txt, uint16_t len, lv_base_dir_t base_dir, + uint32_t logical_pos, bool * is_rtl) +{ + uint32_t pos_conv_len = get_txt_len(str_in, len); + char * buf = lv_mem_buf_get(len + 1); + if(buf == NULL) return (uint16_t) -1; + + uint16_t * pos_conv_buf = lv_mem_buf_get(pos_conv_len * sizeof(uint16_t)); + if(pos_conv_buf == NULL) { + lv_mem_buf_release(buf); + return (uint16_t) -1; + } + + if(bidi_txt) *bidi_txt = buf; + + _lv_bidi_process_paragraph(str_in, bidi_txt ? *bidi_txt : NULL, len, base_dir, pos_conv_buf, pos_conv_len); + + for(uint16_t i = 0; i < pos_conv_len; i++) { + if(GET_POS(pos_conv_buf[i]) == logical_pos) { + + if(is_rtl) *is_rtl = IS_RTL_POS(pos_conv_buf[i]); + lv_mem_buf_release(pos_conv_buf); + + if(bidi_txt == NULL) lv_mem_buf_release(buf); + return i; + } + } + lv_mem_buf_release(pos_conv_buf); + if(bidi_txt == NULL) lv_mem_buf_release(buf); + return (uint16_t) -1; +} + +/** + * Bidi process a paragraph of text + * @param str_in the string to process + * @param str_out store the result here + * @param len length of the text + * @param base_dir base dir of the text + * @param pos_conv_out an `uint16_t` array to store the related logical position of the character. + * Can be `NULL` is unused + * @param pos_conv_len length of `pos_conv_out` in element count + */ +void _lv_bidi_process_paragraph(const char * str_in, char * str_out, uint32_t len, lv_base_dir_t base_dir, + uint16_t * pos_conv_out, uint16_t pos_conv_len) +{ + uint32_t run_len = 0; + lv_base_dir_t run_dir; + uint32_t rd = 0; + uint32_t wr; + uint16_t pos_conv_run_len = 0; + uint16_t pos_conv_rd = 0; + uint16_t pos_conv_wr; + + if(base_dir == LV_BASE_DIR_AUTO) base_dir = _lv_bidi_detect_base_dir(str_in); + if(base_dir == LV_BASE_DIR_RTL) { + wr = len; + pos_conv_wr = pos_conv_len; + } + else { + wr = 0; + pos_conv_wr = 0; + } + + if(str_out) str_out[len] = '\0'; + + lv_base_dir_t dir = base_dir; + + /*Empty the bracket stack*/ + br_stack_p = 0; + + /*Process neutral chars in the beginning*/ + while(rd < len) { + uint32_t letter = _lv_txt_encoded_next(str_in, &rd); + pos_conv_rd++; + dir = lv_bidi_get_letter_dir(letter); + if(dir == LV_BASE_DIR_NEUTRAL) dir = bracket_process(str_in, rd, len, letter, base_dir); + if(dir != LV_BASE_DIR_NEUTRAL && dir != LV_BASE_DIR_WEAK) break; + } + + if(rd && str_in[rd] != '\0') { + _lv_txt_encoded_prev(str_in, &rd); + pos_conv_rd--; + } + + if(rd) { + if(base_dir == LV_BASE_DIR_LTR) { + if(str_out) { + lv_memcpy(&str_out[wr], str_in, rd); + wr += rd; + } + if(pos_conv_out) { + fill_pos_conv(&pos_conv_out[pos_conv_wr], pos_conv_rd, 0); + pos_conv_wr += pos_conv_rd; + } + } + else { + wr -= rd; + pos_conv_wr -= pos_conv_rd; + rtl_reverse(str_out ? &str_out[wr] : NULL, str_in, rd, pos_conv_out ? &pos_conv_out[pos_conv_wr] : NULL, 0, + pos_conv_rd); + } + } + + /*Get and process the runs*/ + + while(rd < len && str_in[rd]) { + run_dir = get_next_run(&str_in[rd], base_dir, len - rd, &run_len, &pos_conv_run_len); + + if(base_dir == LV_BASE_DIR_LTR) { + if(run_dir == LV_BASE_DIR_LTR) { + if(str_out) lv_memcpy(&str_out[wr], &str_in[rd], run_len); + if(pos_conv_out) fill_pos_conv(&pos_conv_out[pos_conv_wr], pos_conv_run_len, pos_conv_rd); + } + else rtl_reverse(str_out ? &str_out[wr] : NULL, &str_in[rd], run_len, pos_conv_out ? &pos_conv_out[pos_conv_wr] : NULL, + pos_conv_rd, pos_conv_run_len); + wr += run_len; + pos_conv_wr += pos_conv_run_len; + } + else { + wr -= run_len; + pos_conv_wr -= pos_conv_run_len; + if(run_dir == LV_BASE_DIR_LTR) { + if(str_out) lv_memcpy(&str_out[wr], &str_in[rd], run_len); + if(pos_conv_out) fill_pos_conv(&pos_conv_out[pos_conv_wr], pos_conv_run_len, pos_conv_rd); + } + else rtl_reverse(str_out ? &str_out[wr] : NULL, &str_in[rd], run_len, pos_conv_out ? &pos_conv_out[pos_conv_wr] : NULL, + pos_conv_rd, pos_conv_run_len); + } + + rd += run_len; + pos_conv_rd += pos_conv_run_len; + } +} + +void lv_bidi_calculate_align(lv_text_align_t * align, lv_base_dir_t * base_dir, const char * txt) +{ + if(*base_dir == LV_BASE_DIR_AUTO) *base_dir = _lv_bidi_detect_base_dir(txt); + + if(*align == LV_TEXT_ALIGN_AUTO) { + if(*base_dir == LV_BASE_DIR_RTL) *align = LV_TEXT_ALIGN_RIGHT; + else *align = LV_TEXT_ALIGN_LEFT; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Get the next paragraph from a text + * @param txt the text to process + * @return the length of the current paragraph in byte count + */ +static uint32_t lv_bidi_get_next_paragraph(const char * txt) +{ + uint32_t i = 0; + + _lv_txt_encoded_next(txt, &i); + + while(txt[i] != '\0' && txt[i] != '\n' && txt[i] != '\r') { + _lv_txt_encoded_next(txt, &i); + } + + return i; +} + +/** + * Get the direction of a character + * @param letter a Unicode character + * @return `LV_BASE_DIR_RTL/LTR/WEAK/NEUTRAL` + */ +static lv_base_dir_t lv_bidi_get_letter_dir(uint32_t letter) +{ + if(lv_bidi_letter_is_rtl(letter)) return LV_BASE_DIR_RTL; + if(lv_bidi_letter_is_neutral(letter)) return LV_BASE_DIR_NEUTRAL; + if(lv_bidi_letter_is_weak(letter)) return LV_BASE_DIR_WEAK; + + return LV_BASE_DIR_LTR; +} +/** + * Tell whether a character is weak or not + * @param letter a Unicode character + * @return true/false + */ +static bool lv_bidi_letter_is_weak(uint32_t letter) +{ + uint32_t i = 0; + static const char weaks[] = "0123456789"; + + do { + uint32_t x = _lv_txt_encoded_next(weaks, &i); + if(letter == x) { + return true; + } + } while(weaks[i] != '\0'); + + return false; +} +/** + * Tell whether a character is RTL or not + * @param letter a Unicode character + * @return true/false + */ +static bool lv_bidi_letter_is_rtl(uint32_t letter) +{ + if(letter >= 0x5d0 && letter <= 0x5ea) return true; + if(letter == 0x202E) return true; /*Unicode of LV_BIDI_RLO*/ + + /*Check for Persian and Arabic characters [https://en.wikipedia.org/wiki/Arabic_script_in_Unicode]*/ + if(letter >= 0x600 && letter <= 0x6FF) return true; + if(letter >= 0xFB50 && letter <= 0xFDFF) return true; + if(letter >= 0xFE70 && letter <= 0xFEFF) return true; + + return false; +} + +/** + * Tell whether a character is neutral or not + * @param letter a Unicode character + * @return true/false + */ +static bool lv_bidi_letter_is_neutral(uint32_t letter) +{ + uint16_t i; + static const char neutrals[] = " \t\n\r.,:;'\"`!?%/\\-=()[]{}<>@#&$|"; + for(i = 0; neutrals[i] != '\0'; i++) { + if(letter == (uint32_t)neutrals[i]) return true; + } + + return false; +} + +static uint32_t get_txt_len(const char * txt, uint32_t max_len) +{ + uint32_t len = 0; + uint32_t i = 0; + + while(i < max_len && txt[i] != '\0') { + _lv_txt_encoded_next(txt, &i); + len++; + } + + return len; +} + +static void fill_pos_conv(uint16_t * out, uint16_t len, uint16_t index) +{ + uint16_t i; + for(i = 0; i < len; i++) { + out[i] = SET_RTL_POS(index, false); + index++; + } +} + +static lv_base_dir_t get_next_run(const char * txt, lv_base_dir_t base_dir, uint32_t max_len, uint32_t * len, + uint16_t * pos_conv_len) +{ + uint32_t i = 0; + uint32_t letter; + + uint16_t pos_conv_i = 0; + + letter = _lv_txt_encoded_next(txt, NULL); + lv_base_dir_t dir = lv_bidi_get_letter_dir(letter); + if(dir == LV_BASE_DIR_NEUTRAL) dir = bracket_process(txt, 0, max_len, letter, base_dir); + + /*Find the first strong char. Skip the neutrals*/ + while(dir == LV_BASE_DIR_NEUTRAL || dir == LV_BASE_DIR_WEAK) { + letter = _lv_txt_encoded_next(txt, &i); + + pos_conv_i++; + dir = lv_bidi_get_letter_dir(letter); + if(dir == LV_BASE_DIR_NEUTRAL) dir = bracket_process(txt, i, max_len, letter, base_dir); + + if(dir == LV_BASE_DIR_LTR || dir == LV_BASE_DIR_RTL) break; + + if(i >= max_len || txt[i] == '\0' || txt[i] == '\n' || txt[i] == '\r') { + *len = i; + *pos_conv_len = pos_conv_i; + return base_dir; + } + } + + lv_base_dir_t run_dir = dir; + + uint32_t i_prev = i; + uint32_t i_last_strong = i; + uint16_t pos_conv_i_prev = pos_conv_i; + uint16_t pos_conv_i_last_strong = pos_conv_i; + + /*Find the next char which has different direction*/ + lv_base_dir_t next_dir = base_dir; + while(i_prev < max_len && txt[i] != '\0' && txt[i] != '\n' && txt[i] != '\r') { + letter = _lv_txt_encoded_next(txt, &i); + pos_conv_i++; + next_dir = lv_bidi_get_letter_dir(letter); + if(next_dir == LV_BASE_DIR_NEUTRAL) next_dir = bracket_process(txt, i, max_len, letter, base_dir); + + if(next_dir == LV_BASE_DIR_WEAK) { + if(run_dir == LV_BASE_DIR_RTL) { + if(base_dir == LV_BASE_DIR_RTL) { + next_dir = LV_BASE_DIR_LTR; + } + } + } + + /*New dir found?*/ + if((next_dir == LV_BASE_DIR_RTL || next_dir == LV_BASE_DIR_LTR) && next_dir != run_dir) { + /*Include neutrals if `run_dir == base_dir`*/ + if(run_dir == base_dir) { + *len = i_prev; + *pos_conv_len = pos_conv_i_prev; + } + /*Exclude neutrals if `run_dir != base_dir`*/ + else { + *len = i_last_strong; + *pos_conv_len = pos_conv_i_last_strong; + } + + return run_dir; + } + + if(next_dir != LV_BASE_DIR_NEUTRAL) { + i_last_strong = i; + pos_conv_i_last_strong = pos_conv_i; + } + + i_prev = i; + pos_conv_i_prev = pos_conv_i; + } + + /*Handle end of of string. Apply `base_dir` on trailing neutrals*/ + + /*Include neutrals if `run_dir == base_dir`*/ + if(run_dir == base_dir) { + *len = i_prev; + *pos_conv_len = pos_conv_i_prev; + } + /*Exclude neutrals if `run_dir != base_dir`*/ + else { + *len = i_last_strong; + *pos_conv_len = pos_conv_i_last_strong; + } + + return run_dir; +} + +static void rtl_reverse(char * dest, const char * src, uint32_t len, uint16_t * pos_conv_out, uint16_t pos_conv_rd_base, + uint16_t pos_conv_len) +{ + uint32_t i = len; + uint32_t wr = 0; + uint16_t pos_conv_i = pos_conv_len; + uint16_t pos_conv_wr = 0; + + while(i) { + uint32_t letter = _lv_txt_encoded_prev(src, &i); + uint16_t pos_conv_letter = --pos_conv_i; + + /*Keep weak letters (numbers) as LTR*/ + if(lv_bidi_letter_is_weak(letter)) { + uint32_t last_weak = i; + uint32_t first_weak = i; + uint16_t pos_conv_last_weak = pos_conv_i; + uint16_t pos_conv_first_weak = pos_conv_i; + while(i) { + letter = _lv_txt_encoded_prev(src, &i); + pos_conv_letter = --pos_conv_i; + + /*No need to call `char_change_to_pair` because there not such chars here*/ + + /*Finish on non-weak char*/ + /*but treat number and currency related chars as weak*/ + if(lv_bidi_letter_is_weak(letter) == false && letter != '.' && letter != ',' && letter != '$' && letter != '%') { + _lv_txt_encoded_next(src, &i); /*Rewind one letter*/ + pos_conv_i++; + first_weak = i; + pos_conv_first_weak = pos_conv_i; + break; + } + } + if(i == 0) { + first_weak = 0; + pos_conv_first_weak = 0; + } + + if(dest) lv_memcpy(&dest[wr], &src[first_weak], last_weak - first_weak + 1); + if(pos_conv_out) fill_pos_conv(&pos_conv_out[pos_conv_wr], pos_conv_last_weak - pos_conv_first_weak + 1, + pos_conv_rd_base + pos_conv_first_weak); + wr += last_weak - first_weak + 1; + pos_conv_wr += pos_conv_last_weak - pos_conv_first_weak + 1; + } + + /*Simply store in reversed order*/ + else { + uint32_t letter_size = _lv_txt_encoded_size((const char *)&src[i]); + /*Swap arithmetical symbols*/ + if(letter_size == 1) { + uint32_t new_letter = letter = char_change_to_pair(letter); + if(dest) dest[wr] = (uint8_t)new_letter; + if(pos_conv_out) pos_conv_out[pos_conv_wr] = SET_RTL_POS(pos_conv_rd_base + pos_conv_letter, true); + wr++; + pos_conv_wr++; + } + /*Just store the letter*/ + else { + if(dest) lv_memcpy(&dest[wr], &src[i], letter_size); + if(pos_conv_out) pos_conv_out[pos_conv_wr] = SET_RTL_POS(pos_conv_rd_base + pos_conv_i, true); + wr += letter_size; + pos_conv_wr++; + } + } + } +} + +static uint32_t char_change_to_pair(uint32_t letter) +{ + + uint8_t i; + for(i = 0; bracket_left[i] != '\0'; i++) { + if(letter == bracket_left[i]) return bracket_right[i]; + } + + for(i = 0; bracket_right[i] != '\0'; i++) { + if(letter == bracket_right[i]) return bracket_left[i]; + } + + return letter; +} + +static lv_base_dir_t bracket_process(const char * txt, uint32_t next_pos, uint32_t len, uint32_t letter, + lv_base_dir_t base_dir) +{ + lv_base_dir_t bracket_dir = LV_BASE_DIR_NEUTRAL; + + uint8_t i; + /*Is the letter an opening bracket?*/ + for(i = 0; bracket_left[i] != '\0'; i++) { + if(bracket_left[i] == letter) { + /*If so find its matching closing bracket. + *If a char with base dir. direction is found then the brackets will have `base_dir` direction*/ + uint32_t txt_i = next_pos; + while(txt_i < len) { + uint32_t letter_next = _lv_txt_encoded_next(txt, &txt_i); + if(letter_next == bracket_right[i]) { + /*Closing bracket found*/ + break; + } + else { + /*Save the dir*/ + lv_base_dir_t letter_dir = lv_bidi_get_letter_dir(letter_next); + if(letter_dir == base_dir) { + bracket_dir = base_dir; + } + } + } + + /*There were no matching closing bracket*/ + if(txt_i > len) return LV_BASE_DIR_NEUTRAL; + + /*There where a strong char with base dir in the bracket so the dir is found.*/ + if(bracket_dir != LV_BASE_DIR_NEUTRAL && bracket_dir != LV_BASE_DIR_WEAK) break; + + /*If there were no matching strong chars in the brackets then check the previous chars*/ + txt_i = next_pos; + if(txt_i) _lv_txt_encoded_prev(txt, &txt_i); + while(txt_i > 0) { + uint32_t letter_next = _lv_txt_encoded_prev(txt, &txt_i); + lv_base_dir_t letter_dir = lv_bidi_get_letter_dir(letter_next); + if(letter_dir == LV_BASE_DIR_LTR || letter_dir == LV_BASE_DIR_RTL) { + bracket_dir = letter_dir; + break; + } + } + + /*There where a previous strong char which can be used*/ + if(bracket_dir != LV_BASE_DIR_NEUTRAL) break; + + /*There were no strong chars before the bracket, so use the base dir.*/ + if(txt_i == 0) bracket_dir = base_dir; + + break; + } + } + + /*The letter was an opening bracket*/ + if(bracket_left[i] != '\0') { + + if(bracket_dir == LV_BASE_DIR_NEUTRAL || br_stack_p == LV_BIDI_BRACKLET_DEPTH) return LV_BASE_DIR_NEUTRAL; + + br_stack[br_stack_p].bracklet_pos = i; + br_stack[br_stack_p].dir = bracket_dir; + + br_stack_p++; + return bracket_dir; + } + else if(br_stack_p > 0) { + /*Is the letter a closing bracket of the last opening?*/ + if(letter == bracket_right[br_stack[br_stack_p - 1].bracklet_pos]) { + bracket_dir = br_stack[br_stack_p - 1].dir; + br_stack_p--; + return bracket_dir; + } + } + + return LV_BASE_DIR_NEUTRAL; +} + +#endif /*LV_USE_BIDI*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_bidi.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_bidi.h new file mode 100644 index 0000000..a27b580 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_bidi.h @@ -0,0 +1,141 @@ +/** + * @file lv_bidi.h + * + */ + +#ifndef LV_BIDI_H +#define LV_BIDI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include +#include +#include "lv_txt.h" + +/********************* + * DEFINES + *********************/ +/*Special non printable strong characters. + *They can be inserted to texts to affect the run's direction*/ +#define LV_BIDI_LRO "\xE2\x80\xAD" /*U+202D*/ +#define LV_BIDI_RLO "\xE2\x80\xAE" /*U+202E*/ + +/********************** + * TYPEDEFS + **********************/ +enum { + LV_BASE_DIR_LTR = 0x00, + LV_BASE_DIR_RTL = 0x01, + LV_BASE_DIR_AUTO = 0x02, + + LV_BASE_DIR_NEUTRAL = 0x20, + LV_BASE_DIR_WEAK = 0x21, +}; + +typedef uint8_t lv_base_dir_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ +#if LV_USE_BIDI + +/** + * Convert a text to get the characters in the correct visual order according to + * Unicode Bidirectional Algorithm + * @param str_in the text to process + * @param str_out store the result here. Has the be `strlen(str_in)` length + * @param base_dir `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` + */ +void _lv_bidi_process(const char * str_in, char * str_out, lv_base_dir_t base_dir); + +/** + * Auto-detect the direction of a text based on the first strong character + * @param txt the text to process + * @return `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` + */ +lv_base_dir_t _lv_bidi_detect_base_dir(const char * txt); + +/** + * Get the logical position of a character in a line + * @param str_in the input string. Can be only one line. + * @param bidi_txt internally the text is bidi processed which buffer can be get here. + * If not required anymore has to freed with `lv_mem_free()` + * Can be `NULL` is unused + * @param len length of the line in character count + * @param base_dir base direction of the text: `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` + * @param visual_pos the visual character position which logical position should be get + * @param is_rtl tell the char at `visual_pos` is RTL or LTR context + * @return the logical character position + */ +uint16_t _lv_bidi_get_logical_pos(const char * str_in, char ** bidi_txt, uint32_t len, lv_base_dir_t base_dir, + uint32_t visual_pos, bool * is_rtl); + +/** + * Get the visual position of a character in a line + * @param str_in the input string. Can be only one line. + * @param bidi_txt internally the text is bidi processed which buffer can be get here. + * If not required anymore has to freed with `lv_mem_free()` + * Can be `NULL` is unused + * @param len length of the line in character count + * @param base_dir base direction of the text: `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` + * @param logical_pos the logical character position which visual position should be get + * @param is_rtl tell the char at `logical_pos` is RTL or LTR context + * @return the visual character position + */ +uint16_t _lv_bidi_get_visual_pos(const char * str_in, char ** bidi_txt, uint16_t len, lv_base_dir_t base_dir, + uint32_t logical_pos, bool * is_rtl); + +/** + * Bidi process a paragraph of text + * @param str_in the string to process + * @param str_out store the result here + * @param len length of the text + * @param base_dir base dir of the text + * @param pos_conv_out an `uint16_t` array to store the related logical position of the character. + * Can be `NULL` is unused + * @param pos_conv_len length of `pos_conv_out` in element count + */ +void _lv_bidi_process_paragraph(const char * str_in, char * str_out, uint32_t len, lv_base_dir_t base_dir, + uint16_t * pos_conv_out, uint16_t pos_conv_len); + +/** + * Get the real text alignment from the a text alignment, base direction and a text. + * @param align LV_TEXT_ALIGN_..., write back the calculated align here (LV_TEXT_ALIGN_LEFT/RIGHT/CENTER) + * @param base_dir LV_BASE_DIR_..., write the calculated base dir here (LV_BASE_DIR_LTR/RTL) + * @param txt a text, used with LV_BASE_DIR_AUTO to determine the base direction + */ +void lv_bidi_calculate_align(lv_text_align_t * align, lv_base_dir_t * base_dir, const char * txt); + + +/********************** + * MACROS + **********************/ + +#else /*LV_USE_BIDI*/ +/** + * For compatibility if LV_USE_BIDI = 0 + * Get the real text alignment from the a text alignment, base direction and a text. + * @param align For LV_TEXT_ALIGN_AUTO give LV_TEXT_ALIGN_LEFT else leave unchanged, write back the calculated align here + * @param base_dir Unused + * @param txt Unused + */ +static inline void lv_bidi_calculate_align(lv_text_align_t * align, lv_base_dir_t * base_dir, const char * txt) +{ + LV_UNUSED(txt); + LV_UNUSED(base_dir); + if(*align == LV_TEXT_ALIGN_AUTO) * align = LV_TEXT_ALIGN_LEFT; +} +#endif /*LV_USE_BIDI*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BIDI_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_color.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_color.c new file mode 100644 index 0000000..0e26624 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_color.c @@ -0,0 +1,369 @@ +/** + * @file lv_color.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_color.h" +#include "lv_log.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +LV_ATTRIBUTE_FAST_MEM void lv_color_fill(lv_color_t * buf, lv_color_t color, uint32_t px_num) +{ +#if LV_COLOR_DEPTH == 16 + uintptr_t buf_int = (uintptr_t)buf; + if(buf_int & 0x3) { + *buf = color; + buf++; + px_num--; + } + + uint32_t c32 = (uint32_t)color.full + ((uint32_t)color.full << 16); + uint32_t * buf32 = (uint32_t *)buf; + + while(px_num > 16) { + *buf32 = c32; + buf32++; + *buf32 = c32; + buf32++; + *buf32 = c32; + buf32++; + *buf32 = c32; + buf32++; + + *buf32 = c32; + buf32++; + *buf32 = c32; + buf32++; + *buf32 = c32; + buf32++; + *buf32 = c32; + buf32++; + + px_num -= 16; + } + + buf = (lv_color_t *)buf32; + + while(px_num) { + *buf = color; + buf++; + px_num--; + } +#else + while(px_num > 16) { + *buf = color; + buf++; + *buf = color; + buf++; + *buf = color; + buf++; + *buf = color; + buf++; + + *buf = color; + buf++; + *buf = color; + buf++; + *buf = color; + buf++; + *buf = color; + buf++; + + *buf = color; + buf++; + *buf = color; + buf++; + *buf = color; + buf++; + *buf = color; + buf++; + + *buf = color; + buf++; + *buf = color; + buf++; + *buf = color; + buf++; + *buf = color; + buf++; + + px_num -= 16; + } + while(px_num) { + *buf = color; + buf++; + px_num--; + } +#endif +} + +lv_color_t lv_color_lighten(lv_color_t c, lv_opa_t lvl) +{ + return lv_color_mix(lv_color_white(), c, lvl); +} + +lv_color_t lv_color_darken(lv_color_t c, lv_opa_t lvl) +{ + return lv_color_mix(lv_color_black(), c, lvl); +} + +lv_color_t lv_color_change_lightness(lv_color_t c, lv_opa_t lvl) +{ + /*It'd be better to convert the color to HSL, change L and convert back to RGB.*/ + if(lvl == LV_OPA_50) return c; + else if(lvl < LV_OPA_50) return lv_color_darken(c, (LV_OPA_50 - lvl) * 2); + else return lv_color_lighten(c, (lvl - LV_OPA_50) * 2); +} + +/** + * Convert a HSV color to RGB + * @param h hue [0..359] + * @param s saturation [0..100] + * @param v value [0..100] + * @return the given RGB color in RGB (with LV_COLOR_DEPTH depth) + */ +lv_color_t lv_color_hsv_to_rgb(uint16_t h, uint8_t s, uint8_t v) +{ + h = (uint32_t)((uint32_t)h * 255) / 360; + s = (uint16_t)((uint16_t)s * 255) / 100; + v = (uint16_t)((uint16_t)v * 255) / 100; + + uint8_t r, g, b; + + uint8_t region, remainder, p, q, t; + + if(s == 0) { + return lv_color_make(v, v, v); + } + + region = h / 43; + remainder = (h - (region * 43)) * 6; + + p = (v * (255 - s)) >> 8; + q = (v * (255 - ((s * remainder) >> 8))) >> 8; + t = (v * (255 - ((s * (255 - remainder)) >> 8))) >> 8; + + switch(region) { + case 0: + r = v; + g = t; + b = p; + break; + case 1: + r = q; + g = v; + b = p; + break; + case 2: + r = p; + g = v; + b = t; + break; + case 3: + r = p; + g = q; + b = v; + break; + case 4: + r = t; + g = p; + b = v; + break; + default: + r = v; + g = p; + b = q; + break; + } + + lv_color_t result = lv_color_make(r, g, b); + return result; +} + +/** + * Convert a 32-bit RGB color to HSV + * @param r8 8-bit red + * @param g8 8-bit green + * @param b8 8-bit blue + * @return the given RGB color in HSV + */ +lv_color_hsv_t lv_color_rgb_to_hsv(uint8_t r8, uint8_t g8, uint8_t b8) +{ + uint16_t r = ((uint32_t)r8 << 10) / 255; + uint16_t g = ((uint32_t)g8 << 10) / 255; + uint16_t b = ((uint32_t)b8 << 10) / 255; + + uint16_t rgbMin = r < g ? (r < b ? r : b) : (g < b ? g : b); + uint16_t rgbMax = r > g ? (r > b ? r : b) : (g > b ? g : b); + + lv_color_hsv_t hsv; + + // https://en.wikipedia.org/wiki/HSL_and_HSV#Lightness + hsv.v = (100 * rgbMax) >> 10; + + int32_t delta = rgbMax - rgbMin; + if(delta < 3) { + hsv.h = 0; + hsv.s = 0; + return hsv; + } + + // https://en.wikipedia.org/wiki/HSL_and_HSV#Saturation + hsv.s = 100 * delta / rgbMax; + if(hsv.s < 3) { + hsv.h = 0; + return hsv; + } + + // https://en.wikipedia.org/wiki/HSL_and_HSV#Hue_and_chroma + int32_t h; + if(rgbMax == r) + h = (((g - b) << 10) / delta) + (g < b ? (6 << 10) : 0); // between yellow & magenta + else if(rgbMax == g) + h = (((b - r) << 10) / delta) + (2 << 10); // between cyan & yellow + else if(rgbMax == b) + h = (((r - g) << 10) / delta) + (4 << 10); // between magenta & cyan + else + h = 0; + h *= 60; + h >>= 10; + if(h < 0) h += 360; + + hsv.h = h; + return hsv; +} + +/** + * Convert a color to HSV + * @param color color + * @return the given color in HSV + */ +lv_color_hsv_t lv_color_to_hsv(lv_color_t color) +{ + lv_color32_t color32; + color32.full = lv_color_to32(color); + return lv_color_rgb_to_hsv(color32.ch.red, color32.ch.green, color32.ch.blue); +} + +lv_color_t lv_palette_main(lv_palette_t p) +{ + static const lv_color_t colors[] = { + LV_COLOR_MAKE(0xF4, 0x43, 0x36), LV_COLOR_MAKE(0xE9, 0x1E, 0x63), LV_COLOR_MAKE(0x9C, 0x27, 0xB0), LV_COLOR_MAKE(0x67, 0x3A, 0xB7), + LV_COLOR_MAKE(0x3F, 0x51, 0xB5), LV_COLOR_MAKE(0x21, 0x96, 0xF3), LV_COLOR_MAKE(0x03, 0xA9, 0xF4), LV_COLOR_MAKE(0x00, 0xBC, 0xD4), + LV_COLOR_MAKE(0x00, 0x96, 0x88), LV_COLOR_MAKE(0x4C, 0xAF, 0x50), LV_COLOR_MAKE(0x8B, 0xC3, 0x4A), LV_COLOR_MAKE(0xCD, 0xDC, 0x39), + LV_COLOR_MAKE(0xFF, 0xEB, 0x3B), LV_COLOR_MAKE(0xFF, 0xC1, 0x07), LV_COLOR_MAKE(0xFF, 0x98, 0x00), LV_COLOR_MAKE(0xFF, 0x57, 0x22), + LV_COLOR_MAKE(0x79, 0x55, 0x48), LV_COLOR_MAKE(0x60, 0x7D, 0x8B), LV_COLOR_MAKE(0x9E, 0x9E, 0x9E) + }; + + if(p >= _LV_PALETTE_LAST) { + LV_LOG_WARN("Invalid palette: %d", p); + return lv_color_black(); + } + + return colors[p]; + +} + +lv_color_t lv_palette_lighten(lv_palette_t p, uint8_t lvl) +{ + static const lv_color_t colors[][5] = { + {LV_COLOR_MAKE(0xEF, 0x53, 0x50), LV_COLOR_MAKE(0xE5, 0x73, 0x73), LV_COLOR_MAKE(0xEF, 0x9A, 0x9A), LV_COLOR_MAKE(0xFF, 0xCD, 0xD2), LV_COLOR_MAKE(0xFF, 0xEB, 0xEE)}, + {LV_COLOR_MAKE(0xEC, 0x40, 0x7A), LV_COLOR_MAKE(0xF0, 0x62, 0x92), LV_COLOR_MAKE(0xF4, 0x8F, 0xB1), LV_COLOR_MAKE(0xF8, 0xBB, 0xD0), LV_COLOR_MAKE(0xFC, 0xE4, 0xEC)}, + {LV_COLOR_MAKE(0xAB, 0x47, 0xBC), LV_COLOR_MAKE(0xBA, 0x68, 0xC8), LV_COLOR_MAKE(0xCE, 0x93, 0xD8), LV_COLOR_MAKE(0xE1, 0xBE, 0xE7), LV_COLOR_MAKE(0xF3, 0xE5, 0xF5)}, + {LV_COLOR_MAKE(0x7E, 0x57, 0xC2), LV_COLOR_MAKE(0x95, 0x75, 0xCD), LV_COLOR_MAKE(0xB3, 0x9D, 0xDB), LV_COLOR_MAKE(0xD1, 0xC4, 0xE9), LV_COLOR_MAKE(0xED, 0xE7, 0xF6)}, + {LV_COLOR_MAKE(0x5C, 0x6B, 0xC0), LV_COLOR_MAKE(0x79, 0x86, 0xCB), LV_COLOR_MAKE(0x9F, 0xA8, 0xDA), LV_COLOR_MAKE(0xC5, 0xCA, 0xE9), LV_COLOR_MAKE(0xE8, 0xEA, 0xF6)}, + {LV_COLOR_MAKE(0x42, 0xA5, 0xF5), LV_COLOR_MAKE(0x64, 0xB5, 0xF6), LV_COLOR_MAKE(0x90, 0xCA, 0xF9), LV_COLOR_MAKE(0xBB, 0xDE, 0xFB), LV_COLOR_MAKE(0xE3, 0xF2, 0xFD)}, + {LV_COLOR_MAKE(0x29, 0xB6, 0xF6), LV_COLOR_MAKE(0x4F, 0xC3, 0xF7), LV_COLOR_MAKE(0x81, 0xD4, 0xFA), LV_COLOR_MAKE(0xB3, 0xE5, 0xFC), LV_COLOR_MAKE(0xE1, 0xF5, 0xFE)}, + {LV_COLOR_MAKE(0x26, 0xC6, 0xDA), LV_COLOR_MAKE(0x4D, 0xD0, 0xE1), LV_COLOR_MAKE(0x80, 0xDE, 0xEA), LV_COLOR_MAKE(0xB2, 0xEB, 0xF2), LV_COLOR_MAKE(0xE0, 0xF7, 0xFA)}, + {LV_COLOR_MAKE(0x26, 0xA6, 0x9A), LV_COLOR_MAKE(0x4D, 0xB6, 0xAC), LV_COLOR_MAKE(0x80, 0xCB, 0xC4), LV_COLOR_MAKE(0xB2, 0xDF, 0xDB), LV_COLOR_MAKE(0xE0, 0xF2, 0xF1)}, + {LV_COLOR_MAKE(0x66, 0xBB, 0x6A), LV_COLOR_MAKE(0x81, 0xC7, 0x84), LV_COLOR_MAKE(0xA5, 0xD6, 0xA7), LV_COLOR_MAKE(0xC8, 0xE6, 0xC9), LV_COLOR_MAKE(0xE8, 0xF5, 0xE9)}, + {LV_COLOR_MAKE(0x9C, 0xCC, 0x65), LV_COLOR_MAKE(0xAE, 0xD5, 0x81), LV_COLOR_MAKE(0xC5, 0xE1, 0xA5), LV_COLOR_MAKE(0xDC, 0xED, 0xC8), LV_COLOR_MAKE(0xF1, 0xF8, 0xE9)}, + {LV_COLOR_MAKE(0xD4, 0xE1, 0x57), LV_COLOR_MAKE(0xDC, 0xE7, 0x75), LV_COLOR_MAKE(0xE6, 0xEE, 0x9C), LV_COLOR_MAKE(0xF0, 0xF4, 0xC3), LV_COLOR_MAKE(0xF9, 0xFB, 0xE7)}, + {LV_COLOR_MAKE(0xFF, 0xEE, 0x58), LV_COLOR_MAKE(0xFF, 0xF1, 0x76), LV_COLOR_MAKE(0xFF, 0xF5, 0x9D), LV_COLOR_MAKE(0xFF, 0xF9, 0xC4), LV_COLOR_MAKE(0xFF, 0xFD, 0xE7)}, + {LV_COLOR_MAKE(0xFF, 0xCA, 0x28), LV_COLOR_MAKE(0xFF, 0xD5, 0x4F), LV_COLOR_MAKE(0xFF, 0xE0, 0x82), LV_COLOR_MAKE(0xFF, 0xEC, 0xB3), LV_COLOR_MAKE(0xFF, 0xF8, 0xE1)}, + {LV_COLOR_MAKE(0xFF, 0xA7, 0x26), LV_COLOR_MAKE(0xFF, 0xB7, 0x4D), LV_COLOR_MAKE(0xFF, 0xCC, 0x80), LV_COLOR_MAKE(0xFF, 0xE0, 0xB2), LV_COLOR_MAKE(0xFF, 0xF3, 0xE0)}, + {LV_COLOR_MAKE(0xFF, 0x70, 0x43), LV_COLOR_MAKE(0xFF, 0x8A, 0x65), LV_COLOR_MAKE(0xFF, 0xAB, 0x91), LV_COLOR_MAKE(0xFF, 0xCC, 0xBC), LV_COLOR_MAKE(0xFB, 0xE9, 0xE7)}, + {LV_COLOR_MAKE(0x8D, 0x6E, 0x63), LV_COLOR_MAKE(0xA1, 0x88, 0x7F), LV_COLOR_MAKE(0xBC, 0xAA, 0xA4), LV_COLOR_MAKE(0xD7, 0xCC, 0xC8), LV_COLOR_MAKE(0xEF, 0xEB, 0xE9)}, + {LV_COLOR_MAKE(0x78, 0x90, 0x9C), LV_COLOR_MAKE(0x90, 0xA4, 0xAE), LV_COLOR_MAKE(0xB0, 0xBE, 0xC5), LV_COLOR_MAKE(0xCF, 0xD8, 0xDC), LV_COLOR_MAKE(0xEC, 0xEF, 0xF1)}, + {LV_COLOR_MAKE(0xBD, 0xBD, 0xBD), LV_COLOR_MAKE(0xE0, 0xE0, 0xE0), LV_COLOR_MAKE(0xEE, 0xEE, 0xEE), LV_COLOR_MAKE(0xF5, 0xF5, 0xF5), LV_COLOR_MAKE(0xFA, 0xFA, 0xFA)}, + }; + + if(p >= _LV_PALETTE_LAST) { + LV_LOG_WARN("Invalid palette: %d", p); + return lv_color_black(); + } + + if(lvl == 0 || lvl > 5) { + LV_LOG_WARN("Invalid level: %d. Must be 1..5", lvl); + return lv_color_black(); + } + + lvl--; + + return colors[p][lvl]; +} + +lv_color_t lv_palette_darken(lv_palette_t p, uint8_t lvl) +{ + static const lv_color_t colors[][4] = { + {LV_COLOR_MAKE(0xE5, 0x39, 0x35), LV_COLOR_MAKE(0xD3, 0x2F, 0x2F), LV_COLOR_MAKE(0xC6, 0x28, 0x28), LV_COLOR_MAKE(0xB7, 0x1C, 0x1C)}, + {LV_COLOR_MAKE(0xD8, 0x1B, 0x60), LV_COLOR_MAKE(0xC2, 0x18, 0x5B), LV_COLOR_MAKE(0xAD, 0x14, 0x57), LV_COLOR_MAKE(0x88, 0x0E, 0x4F)}, + {LV_COLOR_MAKE(0x8E, 0x24, 0xAA), LV_COLOR_MAKE(0x7B, 0x1F, 0xA2), LV_COLOR_MAKE(0x6A, 0x1B, 0x9A), LV_COLOR_MAKE(0x4A, 0x14, 0x8C)}, + {LV_COLOR_MAKE(0x5E, 0x35, 0xB1), LV_COLOR_MAKE(0x51, 0x2D, 0xA8), LV_COLOR_MAKE(0x45, 0x27, 0xA0), LV_COLOR_MAKE(0x31, 0x1B, 0x92)}, + {LV_COLOR_MAKE(0x39, 0x49, 0xAB), LV_COLOR_MAKE(0x30, 0x3F, 0x9F), LV_COLOR_MAKE(0x28, 0x35, 0x93), LV_COLOR_MAKE(0x1A, 0x23, 0x7E)}, + {LV_COLOR_MAKE(0x1E, 0x88, 0xE5), LV_COLOR_MAKE(0x19, 0x76, 0xD2), LV_COLOR_MAKE(0x15, 0x65, 0xC0), LV_COLOR_MAKE(0x0D, 0x47, 0xA1)}, + {LV_COLOR_MAKE(0x03, 0x9B, 0xE5), LV_COLOR_MAKE(0x02, 0x88, 0xD1), LV_COLOR_MAKE(0x02, 0x77, 0xBD), LV_COLOR_MAKE(0x01, 0x57, 0x9B)}, + {LV_COLOR_MAKE(0x00, 0xAC, 0xC1), LV_COLOR_MAKE(0x00, 0x97, 0xA7), LV_COLOR_MAKE(0x00, 0x83, 0x8F), LV_COLOR_MAKE(0x00, 0x60, 0x64)}, + {LV_COLOR_MAKE(0x00, 0x89, 0x7B), LV_COLOR_MAKE(0x00, 0x79, 0x6B), LV_COLOR_MAKE(0x00, 0x69, 0x5C), LV_COLOR_MAKE(0x00, 0x4D, 0x40)}, + {LV_COLOR_MAKE(0x43, 0xA0, 0x47), LV_COLOR_MAKE(0x38, 0x8E, 0x3C), LV_COLOR_MAKE(0x2E, 0x7D, 0x32), LV_COLOR_MAKE(0x1B, 0x5E, 0x20)}, + {LV_COLOR_MAKE(0x7C, 0xB3, 0x42), LV_COLOR_MAKE(0x68, 0x9F, 0x38), LV_COLOR_MAKE(0x55, 0x8B, 0x2F), LV_COLOR_MAKE(0x33, 0x69, 0x1E)}, + {LV_COLOR_MAKE(0xC0, 0xCA, 0x33), LV_COLOR_MAKE(0xAF, 0xB4, 0x2B), LV_COLOR_MAKE(0x9E, 0x9D, 0x24), LV_COLOR_MAKE(0x82, 0x77, 0x17)}, + {LV_COLOR_MAKE(0xFD, 0xD8, 0x35), LV_COLOR_MAKE(0xFB, 0xC0, 0x2D), LV_COLOR_MAKE(0xF9, 0xA8, 0x25), LV_COLOR_MAKE(0xF5, 0x7F, 0x17)}, + {LV_COLOR_MAKE(0xFF, 0xB3, 0x00), LV_COLOR_MAKE(0xFF, 0xA0, 0x00), LV_COLOR_MAKE(0xFF, 0x8F, 0x00), LV_COLOR_MAKE(0xFF, 0x6F, 0x00)}, + {LV_COLOR_MAKE(0xFB, 0x8C, 0x00), LV_COLOR_MAKE(0xF5, 0x7C, 0x00), LV_COLOR_MAKE(0xEF, 0x6C, 0x00), LV_COLOR_MAKE(0xE6, 0x51, 0x00)}, + {LV_COLOR_MAKE(0xF4, 0x51, 0x1E), LV_COLOR_MAKE(0xE6, 0x4A, 0x19), LV_COLOR_MAKE(0xD8, 0x43, 0x15), LV_COLOR_MAKE(0xBF, 0x36, 0x0C)}, + {LV_COLOR_MAKE(0x6D, 0x4C, 0x41), LV_COLOR_MAKE(0x5D, 0x40, 0x37), LV_COLOR_MAKE(0x4E, 0x34, 0x2E), LV_COLOR_MAKE(0x3E, 0x27, 0x23)}, + {LV_COLOR_MAKE(0x54, 0x6E, 0x7A), LV_COLOR_MAKE(0x45, 0x5A, 0x64), LV_COLOR_MAKE(0x37, 0x47, 0x4F), LV_COLOR_MAKE(0x26, 0x32, 0x38)}, + {LV_COLOR_MAKE(0x75, 0x75, 0x75), LV_COLOR_MAKE(0x61, 0x61, 0x61), LV_COLOR_MAKE(0x42, 0x42, 0x42), LV_COLOR_MAKE(0x21, 0x21, 0x21)}, + }; + + if(p >= _LV_PALETTE_LAST) { + LV_LOG_WARN("Invalid palette: %d", p); + return lv_color_black(); + } + + if(lvl == 0 || lvl > 4) { + LV_LOG_WARN("Invalid level: %d. Must be 1..4", lvl); + return lv_color_black(); + } + + lvl--; + + return colors[p][lvl]; +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_color.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_color.h new file mode 100644 index 0000000..2cc92f2 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_color.h @@ -0,0 +1,708 @@ +/** + * @file lv_color.h + * + */ + +#ifndef LV_COLOR_H +#define LV_COLOR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "lv_assert.h" +#include "lv_math.h" +#include "lv_types.h" + +/*Error checking*/ +#if LV_COLOR_DEPTH == 24 +#error "LV_COLOR_DEPTH 24 is deprecated. Use LV_COLOR_DEPTH 32 instead (lv_conf.h)" +#endif + +#if LV_COLOR_DEPTH != 16 && LV_COLOR_16_SWAP != 0 +#error "LV_COLOR_16_SWAP requires LV_COLOR_DEPTH == 16. Set it in lv_conf.h" +#endif + +#include + +/********************* + * DEFINES + *********************/ +LV_EXPORT_CONST_INT(LV_COLOR_DEPTH); +LV_EXPORT_CONST_INT(LV_COLOR_16_SWAP); + +/** + * Opacity percentages. + */ +enum { + LV_OPA_TRANSP = 0, + LV_OPA_0 = 0, + LV_OPA_10 = 25, + LV_OPA_20 = 51, + LV_OPA_30 = 76, + LV_OPA_40 = 102, + LV_OPA_50 = 127, + LV_OPA_60 = 153, + LV_OPA_70 = 178, + LV_OPA_80 = 204, + LV_OPA_90 = 229, + LV_OPA_100 = 255, + LV_OPA_COVER = 255, +}; + +#define LV_OPA_MIN 2 /*Opacities below this will be transparent*/ +#define LV_OPA_MAX 253 /*Opacities above this will fully cover*/ + +#if LV_COLOR_DEPTH == 1 +#define LV_COLOR_SIZE 8 +#elif LV_COLOR_DEPTH == 8 +#define LV_COLOR_SIZE 8 +#elif LV_COLOR_DEPTH == 16 +#define LV_COLOR_SIZE 16 +#elif LV_COLOR_DEPTH == 32 +#define LV_COLOR_SIZE 32 +#else +#error "Invalid LV_COLOR_DEPTH in lv_conf.h! Set it to 1, 8, 16 or 32!" +#endif + +#if defined(__cplusplus) && !defined(_LV_COLOR_HAS_MODERN_CPP) +/** +* MSVC compiler's definition of the __cplusplus indicating 199711L regardless to C++ standard version +* see https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-cplusplus +* so we use _MSC_VER macro instead of __cplusplus +*/ +#ifdef _MSC_VER +#if _MSC_VER >= 1900 /*Visual Studio 2015*/ +#define _LV_COLOR_HAS_MODERN_CPP 1 +#endif +#else +#if __cplusplus >= 201103L +#define _LV_COLOR_HAS_MODERN_CPP 1 +#endif +#endif +#endif /*__cplusplus*/ + +#ifndef _LV_COLOR_HAS_MODERN_CPP +#define _LV_COLOR_HAS_MODERN_CPP 0 +#endif + +#if _LV_COLOR_HAS_MODERN_CPP +/*Fix msvc compiler error C4576 inside C++ code*/ +#define _LV_COLOR_MAKE_TYPE_HELPER lv_color_t +#else +#define _LV_COLOR_MAKE_TYPE_HELPER (lv_color_t) +#endif + +/*--------------------------------------- + * Macros for all existing color depths + * to set/get values of the color channels + *------------------------------------------*/ +# define LV_COLOR_SET_R1(c, v) (c).ch.red = (uint8_t)((v) & 0x1) +# define LV_COLOR_SET_G1(c, v) (c).ch.green = (uint8_t)((v) & 0x1) +# define LV_COLOR_SET_B1(c, v) (c).ch.blue = (uint8_t)((v) & 0x1) +# define LV_COLOR_SET_A1(c, v) do {} while(0) + +# define LV_COLOR_GET_R1(c) (c).ch.red +# define LV_COLOR_GET_G1(c) (c).ch.green +# define LV_COLOR_GET_B1(c) (c).ch.blue +# define LV_COLOR_GET_A1(c) 0xFF + +# define _LV_COLOR_ZERO_INITIALIZER1 {0x00} +# define LV_COLOR_MAKE1(r8, g8, b8) {(uint8_t)((b8 >> 7) | (g8 >> 7) | (r8 >> 7))} + +# define LV_COLOR_SET_R8(c, v) (c).ch.red = (uint8_t)((v) & 0x7U) +# define LV_COLOR_SET_G8(c, v) (c).ch.green = (uint8_t)((v) & 0x7U) +# define LV_COLOR_SET_B8(c, v) (c).ch.blue = (uint8_t)((v) & 0x3U) +# define LV_COLOR_SET_A8(c, v) do {} while(0) + +# define LV_COLOR_GET_R8(c) (c).ch.red +# define LV_COLOR_GET_G8(c) (c).ch.green +# define LV_COLOR_GET_B8(c) (c).ch.blue +# define LV_COLOR_GET_A8(c) 0xFF + +# define _LV_COLOR_ZERO_INITIALIZER8 {{0x00, 0x00, 0x00}} +# define LV_COLOR_MAKE8(r8, g8, b8) {{(uint8_t)((b8 >> 6) & 0x3U), (uint8_t)((g8 >> 5) & 0x7U), (uint8_t)((r8 >> 5) & 0x7U)}} + +# define LV_COLOR_SET_R16(c, v) (c).ch.red = (uint8_t)((v) & 0x1FU) +#if LV_COLOR_16_SWAP == 0 +# define LV_COLOR_SET_G16(c, v) (c).ch.green = (uint8_t)((v) & 0x3FU) +#else +# define LV_COLOR_SET_G16(c, v) {(c).ch.green_h = (uint8_t)(((v) >> 3) & 0x7); (c).ch.green_l = (uint8_t)((v) & 0x7);} +#endif +# define LV_COLOR_SET_B16(c, v) (c).ch.blue = (uint8_t)((v) & 0x1FU) +# define LV_COLOR_SET_A16(c, v) do {} while(0) + +# define LV_COLOR_GET_R16(c) (c).ch.red +#if LV_COLOR_16_SWAP == 0 +# define LV_COLOR_GET_G16(c) (c).ch.green +#else +# define LV_COLOR_GET_G16(c) (((c).ch.green_h << 3) + (c).ch.green_l) +#endif +# define LV_COLOR_GET_B16(c) (c).ch.blue +# define LV_COLOR_GET_A16(c) 0xFF + +#if LV_COLOR_16_SWAP == 0 +# define _LV_COLOR_ZERO_INITIALIZER16 {{0x00, 0x00, 0x00}} +# define LV_COLOR_MAKE16(r8, g8, b8) {{(uint8_t)((b8 >> 3) & 0x1FU), (uint8_t)((g8 >> 2) & 0x3FU), (uint8_t)((r8 >> 3) & 0x1FU)}} +#else +# define _LV_COLOR_ZERO_INITIALIZER16 {{0x00, 0x00, 0x00, 0x00}} +# define LV_COLOR_MAKE16(r8, g8, b8) {{(uint8_t)((g8 >> 5) & 0x7U), (uint8_t)((r8 >> 3) & 0x1FU), (uint8_t)((b8 >> 3) & 0x1FU), (uint8_t)((g8 >> 2) & 0x7U)}} +#endif + +# define LV_COLOR_SET_R32(c, v) (c).ch.red = (uint8_t)((v) & 0xFF) +# define LV_COLOR_SET_G32(c, v) (c).ch.green = (uint8_t)((v) & 0xFF) +# define LV_COLOR_SET_B32(c, v) (c).ch.blue = (uint8_t)((v) & 0xFF) +# define LV_COLOR_SET_A32(c, v) (c).ch.alpha = (uint8_t)((v) & 0xFF) + +# define LV_COLOR_GET_R32(c) (c).ch.red +# define LV_COLOR_GET_G32(c) (c).ch.green +# define LV_COLOR_GET_B32(c) (c).ch.blue +# define LV_COLOR_GET_A32(c) (c).ch.alpha + +# define _LV_COLOR_ZERO_INITIALIZER32 {{0x00, 0x00, 0x00, 0x00}} +# define LV_COLOR_MAKE32(r8, g8, b8) {{b8, g8, r8, 0xff}} /*Fix 0xff alpha*/ + +/*--------------------------------------- + * Macros for the current color depth + * to set/get values of the color channels + *------------------------------------------*/ +#define LV_COLOR_SET_R(c, v) LV_CONCAT(LV_COLOR_SET_R, LV_COLOR_DEPTH)(c, v) +#define LV_COLOR_SET_G(c, v) LV_CONCAT(LV_COLOR_SET_G, LV_COLOR_DEPTH)(c, v) +#define LV_COLOR_SET_B(c, v) LV_CONCAT(LV_COLOR_SET_B, LV_COLOR_DEPTH)(c, v) +#define LV_COLOR_SET_A(c, v) LV_CONCAT(LV_COLOR_SET_A, LV_COLOR_DEPTH)(c, v) + +#define LV_COLOR_GET_R(c) LV_CONCAT(LV_COLOR_GET_R, LV_COLOR_DEPTH)(c) +#define LV_COLOR_GET_G(c) LV_CONCAT(LV_COLOR_GET_G, LV_COLOR_DEPTH)(c) +#define LV_COLOR_GET_B(c) LV_CONCAT(LV_COLOR_GET_B, LV_COLOR_DEPTH)(c) +#define LV_COLOR_GET_A(c) LV_CONCAT(LV_COLOR_GET_A, LV_COLOR_DEPTH)(c) + +#define _LV_COLOR_ZERO_INITIALIZER LV_CONCAT(_LV_COLOR_ZERO_INITIALIZER, LV_COLOR_DEPTH) +#define LV_COLOR_MAKE(r8, g8, b8) LV_CONCAT(LV_COLOR_MAKE, LV_COLOR_DEPTH)(r8, g8, b8) + +/********************** + * TYPEDEFS + **********************/ + +typedef union { + uint8_t full; /*must be declared first to set all bits of byte via initializer list*/ + union { + uint8_t blue : 1; + uint8_t green : 1; + uint8_t red : 1; + } ch; +} lv_color1_t; + +typedef union { + struct { + uint8_t blue : 2; + uint8_t green : 3; + uint8_t red : 3; + } ch; + uint8_t full; +} lv_color8_t; + +typedef union { + struct { +#if LV_COLOR_16_SWAP == 0 + uint16_t blue : 5; + uint16_t green : 6; + uint16_t red : 5; +#else + uint16_t green_h : 3; + uint16_t red : 5; + uint16_t blue : 5; + uint16_t green_l : 3; +#endif + } ch; + uint16_t full; +} lv_color16_t; + +typedef union { + struct { + uint8_t blue; + uint8_t green; + uint8_t red; + uint8_t alpha; + } ch; + uint32_t full; +} lv_color32_t; + +typedef LV_CONCAT3(uint, LV_COLOR_SIZE, _t) lv_color_int_t; +typedef LV_CONCAT3(lv_color, LV_COLOR_DEPTH, _t) lv_color_t; + +typedef struct { + uint16_t h; + uint8_t s; + uint8_t v; +} lv_color_hsv_t; + +//! @cond Doxygen_Suppress +/*No idea where the guard is required but else throws warnings in the docs*/ +typedef uint8_t lv_opa_t; +//! @endcond + +struct _lv_color_filter_dsc_t; + +typedef lv_color_t (*lv_color_filter_cb_t)(const struct _lv_color_filter_dsc_t *, lv_color_t, lv_opa_t); + +typedef struct _lv_color_filter_dsc_t { + lv_color_filter_cb_t filter_cb; + void * user_data; +} lv_color_filter_dsc_t; + + +typedef enum { + LV_PALETTE_RED, + LV_PALETTE_PINK, + LV_PALETTE_PURPLE, + LV_PALETTE_DEEP_PURPLE, + LV_PALETTE_INDIGO, + LV_PALETTE_BLUE, + LV_PALETTE_LIGHT_BLUE, + LV_PALETTE_CYAN, + LV_PALETTE_TEAL, + LV_PALETTE_GREEN, + LV_PALETTE_LIGHT_GREEN, + LV_PALETTE_LIME, + LV_PALETTE_YELLOW, + LV_PALETTE_AMBER, + LV_PALETTE_ORANGE, + LV_PALETTE_DEEP_ORANGE, + LV_PALETTE_BROWN, + LV_PALETTE_BLUE_GREY, + LV_PALETTE_GREY, + _LV_PALETTE_LAST, + LV_PALETTE_NONE = 0xff, +} lv_palette_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/*In color conversations: + * - When converting to bigger color type the LSB weight of 1 LSB is calculated + * E.g. 16 bit Red has 5 bits + * 8 bit Red has 3 bits + * ---------------------- + * 8 bit red LSB = (2^5 - 1) / (2^3 - 1) = 31 / 7 = 4 + * + * - When calculating to smaller color type simply shift out the LSBs + * E.g. 8 bit Red has 3 bits + * 16 bit Red has 5 bits + * ---------------------- + * Shift right with 5 - 3 = 2 + */ +static inline uint8_t lv_color_to1(lv_color_t color) +{ +#if LV_COLOR_DEPTH == 1 + return color.full; +#elif LV_COLOR_DEPTH == 8 + if((LV_COLOR_GET_R(color) & 0x4) || (LV_COLOR_GET_G(color) & 0x4) || (LV_COLOR_GET_B(color) & 0x2)) { + return 1; + } + else { + return 0; + } +#elif LV_COLOR_DEPTH == 16 + if((LV_COLOR_GET_R(color) & 0x10) || (LV_COLOR_GET_G(color) & 0x20) || (LV_COLOR_GET_B(color) & 0x10)) { + return 1; + } + else { + return 0; + } +#elif LV_COLOR_DEPTH == 32 + if((LV_COLOR_GET_R(color) & 0x80) || (LV_COLOR_GET_G(color) & 0x80) || (LV_COLOR_GET_B(color) & 0x80)) { + return 1; + } + else { + return 0; + } +#endif +} + +static inline uint8_t lv_color_to8(lv_color_t color) +{ +#if LV_COLOR_DEPTH == 1 + if(color.full == 0) + return 0; + else + return 0xFF; +#elif LV_COLOR_DEPTH == 8 + return color.full; +#elif LV_COLOR_DEPTH == 16 + lv_color8_t ret; + LV_COLOR_SET_R8(ret, LV_COLOR_GET_R(color) >> 2); /*5 - 3 = 2*/ + LV_COLOR_SET_G8(ret, LV_COLOR_GET_G(color) >> 3); /*6 - 3 = 3*/ + LV_COLOR_SET_B8(ret, LV_COLOR_GET_B(color) >> 3); /*5 - 2 = 3*/ + return ret.full; +#elif LV_COLOR_DEPTH == 32 + lv_color8_t ret; + LV_COLOR_SET_R8(ret, LV_COLOR_GET_R(color) >> 5); /*8 - 3 = 5*/ + LV_COLOR_SET_G8(ret, LV_COLOR_GET_G(color) >> 5); /*8 - 3 = 5*/ + LV_COLOR_SET_B8(ret, LV_COLOR_GET_B(color) >> 6); /*8 - 2 = 6*/ + return ret.full; +#endif +} + +static inline uint16_t lv_color_to16(lv_color_t color) +{ +#if LV_COLOR_DEPTH == 1 + if(color.full == 0) + return 0; + else + return 0xFFFF; +#elif LV_COLOR_DEPTH == 8 + lv_color16_t ret; + LV_COLOR_SET_R16(ret, LV_COLOR_GET_R(color) * 4); /*(2^5 - 1)/(2^3 - 1) = 31/7 = 4*/ + LV_COLOR_SET_G16(ret, LV_COLOR_GET_G(color) * 9); /*(2^6 - 1)/(2^3 - 1) = 63/7 = 9*/ + LV_COLOR_SET_B16(ret, LV_COLOR_GET_B(color) * 10); /*(2^5 - 1)/(2^2 - 1) = 31/3 = 10*/ + return ret.full; +#elif LV_COLOR_DEPTH == 16 + return color.full; +#elif LV_COLOR_DEPTH == 32 + lv_color16_t ret; + LV_COLOR_SET_R16(ret, LV_COLOR_GET_R(color) >> 3); /*8 - 5 = 3*/ + LV_COLOR_SET_G16(ret, LV_COLOR_GET_G(color) >> 2); /*8 - 6 = 2*/ + LV_COLOR_SET_B16(ret, LV_COLOR_GET_B(color) >> 3); /*8 - 5 = 3*/ + return ret.full; +#endif +} + +static inline uint32_t lv_color_to32(lv_color_t color) +{ +#if LV_COLOR_DEPTH == 1 + if(color.full == 0) + return 0xFF000000; + else + return 0xFFFFFFFF; +#elif LV_COLOR_DEPTH == 8 + lv_color32_t ret; + LV_COLOR_SET_R32(ret, LV_COLOR_GET_R(color) * 36); /*(2^8 - 1)/(2^3 - 1) = 255/7 = 36*/ + LV_COLOR_SET_G32(ret, LV_COLOR_GET_G(color) * 36); /*(2^8 - 1)/(2^3 - 1) = 255/7 = 36*/ + LV_COLOR_SET_B32(ret, LV_COLOR_GET_B(color) * 85); /*(2^8 - 1)/(2^2 - 1) = 255/3 = 85*/ + LV_COLOR_SET_A32(ret, 0xFF); + return ret.full; +#elif LV_COLOR_DEPTH == 16 + /** + * The floating point math for conversion is: + * valueto = valuefrom * ( (2^bitsto - 1) / (float)(2^bitsfrom - 1) ) + * The faster integer math for conversion is: + * valueto = ( valuefrom * multiplier + adder ) >> divisor + * multiplier = FLOOR( ( (2^bitsto - 1) << divisor ) / (float)(2^bitsfrom - 1) ) + * + * Find the first divisor where ( adder >> divisor ) <= 0 + * + * 5-bit to 8-bit: ( 31 * multiplier + adder ) >> divisor = 255 + * divisor multiplier adder min (0) max (31) + * 0 8 7 7 255 + * 1 16 14 7 255 + * 2 32 28 7 255 + * 3 65 25 3 255 + * 4 131 19 1 255 + * 5 263 7 0 255 + * + * 6-bit to 8-bit: 255 = ( 63 * multiplier + adder ) >> divisor + * divisor multiplier adder min (0) max (63) + * 0 4 3 3 255 + * 1 8 6 3 255 + * 2 16 12 3 255 + * 3 32 24 3 255 + * 4 64 48 3 255 + * 5 129 33 1 255 + * 6 259 3 0 255 + */ + + lv_color32_t ret; + LV_COLOR_SET_R32(ret, (LV_COLOR_GET_R(color) * 263 + 7) >> 5); + LV_COLOR_SET_G32(ret, (LV_COLOR_GET_G(color) * 259 + 3) >> 6); + LV_COLOR_SET_B32(ret, (LV_COLOR_GET_B(color) * 263 + 7) >> 5); + LV_COLOR_SET_A32(ret, 0xFF); + return ret.full; +#elif LV_COLOR_DEPTH == 32 + return color.full; +#endif +} + +//! @cond Doxygen_Suppress + +/** + * Mix two colors with a given ratio. + * @param c1 the first color to mix (usually the foreground) + * @param c2 the second color to mix (usually the background) + * @param mix The ratio of the colors. 0: full `c2`, 255: full `c1`, 127: half `c1` and half`c2` + * @return the mixed color + */ +LV_ATTRIBUTE_FAST_MEM static inline lv_color_t lv_color_mix(lv_color_t c1, lv_color_t c2, uint8_t mix) +{ + lv_color_t ret; + +#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0 && LV_COLOR_MIX_ROUND_OFS == 0 + /*Source: https://stackoverflow.com/a/50012418/1999969*/ + mix = (uint32_t)((uint32_t)mix + 4) >> 3; + uint32_t bg = (uint32_t)((uint32_t)c2.full | ((uint32_t)c2.full << 16)) & + 0x7E0F81F; /*0b00000111111000001111100000011111*/ + uint32_t fg = (uint32_t)((uint32_t)c1.full | ((uint32_t)c1.full << 16)) & 0x7E0F81F; + uint32_t result = ((((fg - bg) * mix) >> 5) + bg) & 0x7E0F81F; + ret.full = (uint16_t)((result >> 16) | result); +#elif LV_COLOR_DEPTH != 1 + /*LV_COLOR_DEPTH == 8, 16 or 32*/ + LV_COLOR_SET_R(ret, LV_UDIV255((uint16_t)LV_COLOR_GET_R(c1) * mix + LV_COLOR_GET_R(c2) * + (255 - mix) + LV_COLOR_MIX_ROUND_OFS)); + LV_COLOR_SET_G(ret, LV_UDIV255((uint16_t)LV_COLOR_GET_G(c1) * mix + LV_COLOR_GET_G(c2) * + (255 - mix) + LV_COLOR_MIX_ROUND_OFS)); + LV_COLOR_SET_B(ret, LV_UDIV255((uint16_t)LV_COLOR_GET_B(c1) * mix + LV_COLOR_GET_B(c2) * + (255 - mix) + LV_COLOR_MIX_ROUND_OFS)); + LV_COLOR_SET_A(ret, 0xFF); +#else + /*LV_COLOR_DEPTH == 1*/ + ret.full = mix > LV_OPA_50 ? c1.full : c2.full; +#endif + + return ret; +} + +LV_ATTRIBUTE_FAST_MEM static inline void lv_color_premult(lv_color_t c, uint8_t mix, uint16_t * out) +{ +#if LV_COLOR_DEPTH != 1 + out[0] = (uint16_t)LV_COLOR_GET_R(c) * mix; + out[1] = (uint16_t)LV_COLOR_GET_G(c) * mix; + out[2] = (uint16_t)LV_COLOR_GET_B(c) * mix; +#else + (void) mix; + /*Pre-multiplication can't be used with 1 bpp*/ + out[0] = LV_COLOR_GET_R(c); + out[1] = LV_COLOR_GET_G(c); + out[2] = LV_COLOR_GET_B(c); +#endif + +} + +/** + * Mix two colors with a given ratio. It runs faster then `lv_color_mix` but requires some pre computation. + * @param premult_c1 The first color. Should be preprocessed with `lv_color_premult(c1)` + * @param c2 The second color. As it is no pre computation required on it + * @param mix The ratio of the colors. 0: full `c1`, 255: full `c2`, 127: half `c1` and half `c2`. + * Should be modified like mix = `255 - mix` + * @return the mixed color + * @note 255 won't give clearly `c1`. + */ +LV_ATTRIBUTE_FAST_MEM static inline lv_color_t lv_color_mix_premult(uint16_t * premult_c1, lv_color_t c2, uint8_t mix) +{ + lv_color_t ret; +#if LV_COLOR_DEPTH != 1 + /*LV_COLOR_DEPTH == 8 or 32*/ + LV_COLOR_SET_R(ret, LV_UDIV255(premult_c1[0] + LV_COLOR_GET_R(c2) * mix + LV_COLOR_MIX_ROUND_OFS)); + LV_COLOR_SET_G(ret, LV_UDIV255(premult_c1[1] + LV_COLOR_GET_G(c2) * mix + LV_COLOR_MIX_ROUND_OFS)); + LV_COLOR_SET_B(ret, LV_UDIV255(premult_c1[2] + LV_COLOR_GET_B(c2) * mix + LV_COLOR_MIX_ROUND_OFS)); + LV_COLOR_SET_A(ret, 0xFF); +#else + /*LV_COLOR_DEPTH == 1*/ + /*Restore color1*/ + lv_color_t c1; + LV_COLOR_SET_R(c1, premult_c1[0]); + LV_COLOR_SET_G(c1, premult_c1[1]); + LV_COLOR_SET_B(c1, premult_c1[2]); + ret.full = mix > LV_OPA_50 ? c2.full : c1.full; +#endif + + return ret; +} + +/** + * Mix two colors. Both color can have alpha value. + * @param bg_color background color + * @param bg_opa alpha of the background color + * @param fg_color foreground color + * @param fg_opa alpha of the foreground color + * @param res_color the result color + * @param res_opa the result opacity + */ +LV_ATTRIBUTE_FAST_MEM static inline void lv_color_mix_with_alpha(lv_color_t bg_color, lv_opa_t bg_opa, + lv_color_t fg_color, lv_opa_t fg_opa, + lv_color_t * res_color, lv_opa_t * res_opa) +{ + /*Pick the foreground if it's fully opaque or the Background is fully transparent*/ + if(fg_opa >= LV_OPA_MAX || bg_opa <= LV_OPA_MIN) { + res_color->full = fg_color.full; + *res_opa = fg_opa; + } + /*Transparent foreground: use the Background*/ + else if(fg_opa <= LV_OPA_MIN) { + res_color->full = bg_color.full; + *res_opa = bg_opa; + } + /*Opaque background: use simple mix*/ + else if(bg_opa >= LV_OPA_MAX) { + *res_color = lv_color_mix(fg_color, bg_color, fg_opa); + *res_opa = LV_OPA_COVER; + } + /*Both colors have alpha. Expensive calculation need to be applied*/ + else { + /*Save the parameters and the result. If they will be asked again don't compute again*/ + static lv_opa_t fg_opa_save = 0; + static lv_opa_t bg_opa_save = 0; + static lv_color_t fg_color_save = _LV_COLOR_ZERO_INITIALIZER; + static lv_color_t bg_color_save = _LV_COLOR_ZERO_INITIALIZER; + static lv_color_t res_color_saved = _LV_COLOR_ZERO_INITIALIZER; + static lv_opa_t res_opa_saved = 0; + + if(fg_opa != fg_opa_save || bg_opa != bg_opa_save || fg_color.full != fg_color_save.full || + bg_color.full != bg_color_save.full) { + fg_opa_save = fg_opa; + bg_opa_save = bg_opa; + fg_color_save.full = fg_color.full; + bg_color_save.full = bg_color.full; + /*Info: + * https://en.wikipedia.org/wiki/Alpha_compositing#Analytical_derivation_of_the_over_operator*/ + res_opa_saved = 255 - ((uint16_t)((uint16_t)(255 - fg_opa) * (255 - bg_opa)) >> 8); + LV_ASSERT(res_opa_saved != 0); + lv_opa_t ratio = (uint16_t)((uint16_t)fg_opa * 255) / res_opa_saved; + res_color_saved = lv_color_mix(fg_color, bg_color, ratio); + + } + + res_color->full = res_color_saved.full; + *res_opa = res_opa_saved; + } +} + +//! @endcond + +/** + * Get the brightness of a color + * @param color a color + * @return the brightness [0..255] + */ +static inline uint8_t lv_color_brightness(lv_color_t color) +{ + lv_color32_t c32; + c32.full = lv_color_to32(color); + uint16_t bright = (uint16_t)(3u * LV_COLOR_GET_R32(c32) + LV_COLOR_GET_B32(c32) + 4u * LV_COLOR_GET_G32(c32)); + return (uint8_t)(bright >> 3); +} + +static inline lv_color_t lv_color_make(uint8_t r, uint8_t g, uint8_t b) +{ + return _LV_COLOR_MAKE_TYPE_HELPER LV_COLOR_MAKE(r, g, b); +} + +static inline lv_color_t lv_color_hex(uint32_t c) +{ +#if LV_COLOR_DEPTH == 16 + lv_color_t r; +#if LV_COLOR_16_SWAP == 0 + /* Convert a 4 bytes per pixel in format ARGB32 to R5G6B5 format + naive way (by calling lv_color_make with components): + r = ((c & 0xFF0000) >> 19) + g = ((c & 0xFF00) >> 10) + b = ((c & 0xFF) >> 3) + rgb565 = (r << 11) | (g << 5) | b + That's 3 mask, 5 bitshift and 2 or operations + + A bit better: + r = ((c & 0xF80000) >> 8) + g = ((c & 0xFC00) >> 5) + b = ((c & 0xFF) >> 3) + rgb565 = r | g | b + That's 3 mask, 3 bitshifts and 2 or operations */ + r.full = (uint16_t)(((c & 0xF80000) >> 8) | ((c & 0xFC00) >> 5) | ((c & 0xFF) >> 3)); +#else + /* We want: rrrr rrrr GGGg gggg bbbb bbbb => gggb bbbb rrrr rGGG */ + r.full = (uint16_t)(((c & 0xF80000) >> 16) | ((c & 0xFC00) >> 13) | ((c & 0x1C00) << 3) | ((c & 0xF8) << 5)); +#endif + return r; +#elif LV_COLOR_DEPTH == 32 + lv_color_t r; + r.full = c | 0xFF000000; + return r; +#else /*LV_COLOR_DEPTH == 8*/ + return lv_color_make((uint8_t)((c >> 16) & 0xFF), (uint8_t)((c >> 8) & 0xFF), (uint8_t)(c & 0xFF)); +#endif +} + +static inline lv_color_t lv_color_hex3(uint32_t c) +{ + return lv_color_make((uint8_t)(((c >> 4) & 0xF0) | ((c >> 8) & 0xF)), (uint8_t)((c & 0xF0) | ((c & 0xF0) >> 4)), + (uint8_t)((c & 0xF) | ((c & 0xF) << 4))); +} + +static inline void lv_color_filter_dsc_init(lv_color_filter_dsc_t * dsc, lv_color_filter_cb_t cb) +{ + dsc->filter_cb = cb; +} + +//! @cond Doxygen_Suppress +//! +LV_ATTRIBUTE_FAST_MEM void lv_color_fill(lv_color_t * buf, lv_color_t color, uint32_t px_num); + +//! @endcond +lv_color_t lv_color_lighten(lv_color_t c, lv_opa_t lvl); + +lv_color_t lv_color_darken(lv_color_t c, lv_opa_t lvl); + +lv_color_t lv_color_change_lightness(lv_color_t c, lv_opa_t lvl); + +/** + * Convert a HSV color to RGB + * @param h hue [0..359] + * @param s saturation [0..100] + * @param v value [0..100] + * @return the given RGB color in RGB (with LV_COLOR_DEPTH depth) + */ +lv_color_t lv_color_hsv_to_rgb(uint16_t h, uint8_t s, uint8_t v); + +/** + * Convert a 32-bit RGB color to HSV + * @param r8 8-bit red + * @param g8 8-bit green + * @param b8 8-bit blue + * @return the given RGB color in HSV + */ +lv_color_hsv_t lv_color_rgb_to_hsv(uint8_t r8, uint8_t g8, uint8_t b8); + +/** + * Convert a color to HSV + * @param color color + * @return the given color in HSV + */ +lv_color_hsv_t lv_color_to_hsv(lv_color_t color); + +/** + * Just a wrapper around LV_COLOR_CHROMA_KEY because it might be more convenient to use a function in some cases + * @return LV_COLOR_CHROMA_KEY + */ +static inline lv_color_t lv_color_chroma_key(void) +{ + return LV_COLOR_CHROMA_KEY; +} + +/********************** + * PREDEFINED COLORS + **********************/ +/*Source: https://vuetifyjs.com/en/styles/colors/#material-colors*/ + +lv_color_t lv_palette_main(lv_palette_t p); +static inline lv_color_t lv_color_white(void) +{ + return lv_color_make(0xff, 0xff, 0xff); +} +static inline lv_color_t lv_color_black(void) +{ + return lv_color_make(0x00, 0x0, 0x00); +} +lv_color_t lv_palette_lighten(lv_palette_t p, uint8_t lvl); +lv_color_t lv_palette_darken(lv_palette_t p, uint8_t lvl); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_COLOR_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_fs.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_fs.c new file mode 100644 index 0000000..52f3ce0 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_fs.c @@ -0,0 +1,518 @@ +/** + * @file lv_fs.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_fs.h" + +#include "../misc/lv_assert.h" +#include "lv_ll.h" +#include +#include "lv_gc.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static const char * lv_fs_get_real_path(const char * path); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void _lv_fs_init(void) +{ + _lv_ll_init(&LV_GC_ROOT(_lv_fsdrv_ll), sizeof(lv_fs_drv_t *)); +} + +bool lv_fs_is_ready(char letter) +{ + lv_fs_drv_t * drv = lv_fs_get_drv(letter); + + if(drv == NULL) return false; /*An unknown driver in not ready*/ + + if(drv->ready_cb == NULL) return true; /*Assume the driver is always ready if no handler provided*/ + + return drv->ready_cb(drv); +} + +lv_fs_res_t lv_fs_open(lv_fs_file_t * file_p, const char * path, lv_fs_mode_t mode) +{ + if(path == NULL) { + LV_LOG_WARN("Can't open file: path is NULL"); + return LV_FS_RES_INV_PARAM; + } + + char letter = path[0]; + lv_fs_drv_t * drv = lv_fs_get_drv(letter); + + if(drv == NULL) { + LV_LOG_WARN("Can't open file (%s): unknown driver letter", path); + return LV_FS_RES_NOT_EX; + } + + if(drv->ready_cb) { + if(drv->ready_cb(drv) == false) { + LV_LOG_WARN("Can't open file (%s): driver not ready", path); + return LV_FS_RES_HW_ERR; + } + } + + if(drv->open_cb == NULL) { + LV_LOG_WARN("Can't open file (%s): open function not exists", path); + return LV_FS_RES_NOT_IMP; + } + + const char * real_path = lv_fs_get_real_path(path); + void * file_d = drv->open_cb(drv, real_path, mode); + + if(file_d == NULL || file_d == (void *)(-1)) { + return LV_FS_RES_UNKNOWN; + } + + file_p->drv = drv; + file_p->file_d = file_d; + + if(drv->cache_size) { + file_p->cache = lv_mem_alloc(sizeof(lv_fs_file_cache_t)); + LV_ASSERT_MALLOC(file_p->cache); + lv_memset_00(file_p->cache, sizeof(lv_fs_file_cache_t)); + file_p->cache->start = UINT32_MAX; /*Set an invalid range by default*/ + file_p->cache->end = UINT32_MAX - 1; + } + + return LV_FS_RES_OK; +} + +lv_fs_res_t lv_fs_close(lv_fs_file_t * file_p) +{ + if(file_p->drv == NULL) { + return LV_FS_RES_INV_PARAM; + } + + if(file_p->drv->close_cb == NULL) { + return LV_FS_RES_NOT_IMP; + } + + lv_fs_res_t res = file_p->drv->close_cb(file_p->drv, file_p->file_d); + + if(file_p->drv->cache_size && file_p->cache) { + if(file_p->cache->buffer) { + lv_mem_free(file_p->cache->buffer); + } + + lv_mem_free(file_p->cache); + } + + file_p->file_d = NULL; + file_p->drv = NULL; + file_p->cache = NULL; + + return res; +} + +static lv_fs_res_t lv_fs_read_cached(lv_fs_file_t * file_p, char * buf, uint32_t btr, uint32_t * br) +{ + lv_fs_res_t res = LV_FS_RES_OK; + uint32_t file_position = file_p->cache->file_position; + uint32_t start = file_p->cache->start; + uint32_t end = file_p->cache->end; + char * buffer = file_p->cache->buffer; + uint16_t buffer_size = file_p->drv->cache_size; + + if(start <= file_position && file_position < end) { + /* Data can be read from cache buffer */ + uint16_t buffer_offset = file_position - start; + uint32_t buffer_remaining_length = LV_MIN((uint32_t)buffer_size - buffer_offset, (uint32_t)end - file_position); + + if(btr <= buffer_remaining_length) { + /*Data is in cache buffer, and buffer end not reached, no need to read from FS*/ + lv_memcpy(buf, buffer + buffer_offset, btr); + *br = btr; + } + else { + /*First part of data is in cache buffer, but we need to read rest of data from FS*/ + lv_memcpy(buf, buffer + buffer_offset, buffer_remaining_length); + + uint32_t bytes_read_to_buffer = 0; + if(btr > buffer_size) { + /*If remaining data chuck is bigger than buffer size, then do not use cache, instead read it directly from FS*/ + res = file_p->drv->read_cb(file_p->drv, file_p->file_d, (void *)(buf + buffer_remaining_length), + btr - buffer_remaining_length, &bytes_read_to_buffer); + } + else { + /*If remaining data chunk is smaller than buffer size, then read into cache buffer*/ + res = file_p->drv->read_cb(file_p->drv, file_p->file_d, (void *)buffer, buffer_size, &bytes_read_to_buffer); + file_p->cache->start = file_p->cache->end; + file_p->cache->end = file_p->cache->start + bytes_read_to_buffer; + + uint16_t data_chunk_remaining = LV_MIN(btr - buffer_remaining_length, bytes_read_to_buffer); + lv_memcpy(buf + buffer_remaining_length, buffer, data_chunk_remaining); + } + *br = LV_MIN(buffer_remaining_length + bytes_read_to_buffer, btr); + } + } + else { + /*Data is not in cache buffer*/ + if(btr > buffer_size) { + /*If bigger data is requested, then do not use cache, instead read it directly*/ + res = file_p->drv->read_cb(file_p->drv, file_p->file_d, (void *)buf, btr, br); + } + else { + /*If small data is requested, then read from FS into cache buffer*/ + if(buffer == NULL) { + file_p->cache->buffer = lv_mem_alloc(buffer_size); + LV_ASSERT_MALLOC(file_p->cache->buffer); + buffer = file_p->cache->buffer; + } + + uint32_t bytes_read_to_buffer = 0; + res = file_p->drv->read_cb(file_p->drv, file_p->file_d, (void *)buffer, buffer_size, &bytes_read_to_buffer); + file_p->cache->start = file_position; + file_p->cache->end = file_p->cache->start + bytes_read_to_buffer; + + *br = LV_MIN(btr, bytes_read_to_buffer); + lv_memcpy(buf, buffer, *br); + + } + } + + if(res == LV_FS_RES_OK) { + file_p->cache->file_position += *br; + } + + return res; +} + +lv_fs_res_t lv_fs_read(lv_fs_file_t * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + if(br != NULL) *br = 0; + if(file_p->drv == NULL) return LV_FS_RES_INV_PARAM; + if(file_p->drv->read_cb == NULL) return LV_FS_RES_NOT_IMP; + + uint32_t br_tmp = 0; + lv_fs_res_t res; + + if(file_p->drv->cache_size) { + res = lv_fs_read_cached(file_p, (char *)buf, btr, &br_tmp); + } + else { + res = file_p->drv->read_cb(file_p->drv, file_p->file_d, buf, btr, &br_tmp); + } + + if(br != NULL) *br = br_tmp; + + return res; +} + +lv_fs_res_t lv_fs_write(lv_fs_file_t * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ + if(bw != NULL) *bw = 0; + + if(file_p->drv == NULL) { + return LV_FS_RES_INV_PARAM; + } + + if(file_p->drv->write_cb == NULL) { + return LV_FS_RES_NOT_IMP; + } + + uint32_t bw_tmp = 0; + lv_fs_res_t res = file_p->drv->write_cb(file_p->drv, file_p->file_d, buf, btw, &bw_tmp); + if(bw != NULL) *bw = bw_tmp; + + return res; +} + +lv_fs_res_t lv_fs_seek(lv_fs_file_t * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + if(file_p->drv == NULL) { + return LV_FS_RES_INV_PARAM; + } + + if(file_p->drv->seek_cb == NULL) { + return LV_FS_RES_NOT_IMP; + } + + lv_fs_res_t res = LV_FS_RES_OK; + if(file_p->drv->cache_size) { + switch(whence) { + case LV_FS_SEEK_SET: { + file_p->cache->file_position = pos; + + /*FS seek if new position is outside cache buffer*/ + if(file_p->cache->file_position < file_p->cache->start || file_p->cache->file_position > file_p->cache->end) { + res = file_p->drv->seek_cb(file_p->drv, file_p->file_d, file_p->cache->file_position, LV_FS_SEEK_SET); + } + + break; + } + case LV_FS_SEEK_CUR: { + file_p->cache->file_position += pos; + + /*FS seek if new position is outside cache buffer*/ + if(file_p->cache->file_position < file_p->cache->start || file_p->cache->file_position > file_p->cache->end) { + res = file_p->drv->seek_cb(file_p->drv, file_p->file_d, file_p->cache->file_position, LV_FS_SEEK_SET); + } + + break; + } + case LV_FS_SEEK_END: { + /*Because we don't know the file size, we do a little trick: do a FS seek, then get new file position from FS*/ + res = file_p->drv->seek_cb(file_p->drv, file_p->file_d, pos, whence); + if(res == LV_FS_RES_OK) { + uint32_t tmp_position; + res = file_p->drv->tell_cb(file_p->drv, file_p->file_d, &tmp_position); + + if(res == LV_FS_RES_OK) { + file_p->cache->file_position = tmp_position; + } + } + break; + } + } + } + else { + res = file_p->drv->seek_cb(file_p->drv, file_p->file_d, pos, whence); + } + + return res; +} + +lv_fs_res_t lv_fs_tell(lv_fs_file_t * file_p, uint32_t * pos) +{ + if(file_p->drv == NULL) { + *pos = 0; + return LV_FS_RES_INV_PARAM; + } + + if(file_p->drv->tell_cb == NULL) { + *pos = 0; + return LV_FS_RES_NOT_IMP; + } + + lv_fs_res_t res; + if(file_p->drv->cache_size) { + *pos = file_p->cache->file_position; + res = LV_FS_RES_OK; + } + else { + res = file_p->drv->tell_cb(file_p->drv, file_p->file_d, pos); + } + + return res; +} + +lv_fs_res_t lv_fs_dir_open(lv_fs_dir_t * rddir_p, const char * path) +{ + if(path == NULL) return LV_FS_RES_INV_PARAM; + + char letter = path[0]; + lv_fs_drv_t * drv = lv_fs_get_drv(letter); + + if(drv == NULL) { + return LV_FS_RES_NOT_EX; + } + + if(drv->ready_cb) { + if(drv->ready_cb(drv) == false) { + return LV_FS_RES_HW_ERR; + } + } + + if(drv->dir_open_cb == NULL) { + return LV_FS_RES_NOT_IMP; + } + + const char * real_path = lv_fs_get_real_path(path); + void * dir_d = drv->dir_open_cb(drv, real_path); + + if(dir_d == NULL || dir_d == (void *)(-1)) { + return LV_FS_RES_UNKNOWN; + } + + rddir_p->drv = drv; + rddir_p->dir_d = dir_d; + + return LV_FS_RES_OK; +} + +lv_fs_res_t lv_fs_dir_read(lv_fs_dir_t * rddir_p, char * fn) +{ + if(rddir_p->drv == NULL || rddir_p->dir_d == NULL) { + fn[0] = '\0'; + return LV_FS_RES_INV_PARAM; + } + + if(rddir_p->drv->dir_read_cb == NULL) { + fn[0] = '\0'; + return LV_FS_RES_NOT_IMP; + } + + lv_fs_res_t res = rddir_p->drv->dir_read_cb(rddir_p->drv, rddir_p->dir_d, fn); + + return res; +} + +lv_fs_res_t lv_fs_dir_close(lv_fs_dir_t * rddir_p) +{ + if(rddir_p->drv == NULL || rddir_p->dir_d == NULL) { + return LV_FS_RES_INV_PARAM; + } + + if(rddir_p->drv->dir_close_cb == NULL) { + return LV_FS_RES_NOT_IMP; + } + + lv_fs_res_t res = rddir_p->drv->dir_close_cb(rddir_p->drv, rddir_p->dir_d); + + rddir_p->dir_d = NULL; + rddir_p->drv = NULL; + + return res; +} + +void lv_fs_drv_init(lv_fs_drv_t * drv) +{ + lv_memset_00(drv, sizeof(lv_fs_drv_t)); +} + +void lv_fs_drv_register(lv_fs_drv_t * drv_p) +{ + /*Save the new driver*/ + lv_fs_drv_t ** new_drv; + new_drv = _lv_ll_ins_head(&LV_GC_ROOT(_lv_fsdrv_ll)); + LV_ASSERT_MALLOC(new_drv); + if(new_drv == NULL) return; + + *new_drv = drv_p; +} + +lv_fs_drv_t * lv_fs_get_drv(char letter) +{ + lv_fs_drv_t ** drv; + + _LV_LL_READ(&LV_GC_ROOT(_lv_fsdrv_ll), drv) { + if((*drv)->letter == letter) { + return *drv; + } + } + + return NULL; +} + +char * lv_fs_get_letters(char * buf) +{ + lv_fs_drv_t ** drv; + uint8_t i = 0; + + _LV_LL_READ(&LV_GC_ROOT(_lv_fsdrv_ll), drv) { + buf[i] = (*drv)->letter; + i++; + } + + buf[i] = '\0'; + + return buf; +} + +const char * lv_fs_get_ext(const char * fn) +{ + size_t i; + for(i = strlen(fn); i > 0; i--) { + if(fn[i] == '.') { + return &fn[i + 1]; + } + else if(fn[i] == '/' || fn[i] == '\\') { + return ""; /*No extension if a '\' or '/' found*/ + } + } + + return ""; /*Empty string if no '.' in the file name.*/ +} + +char * lv_fs_up(char * path) +{ + size_t len = strlen(path); + if(len == 0) return path; + + len--; /*Go before the trailing '\0'*/ + + /*Ignore trailing '/' or '\'*/ + while(path[len] == '/' || path[len] == '\\') { + path[len] = '\0'; + if(len > 0) + len--; + else + return path; + } + + size_t i; + for(i = len; i > 0; i--) { + if(path[i] == '/' || path[i] == '\\') break; + } + + if(i > 0) path[i] = '\0'; + + return path; +} + +const char * lv_fs_get_last(const char * path) +{ + size_t len = strlen(path); + if(len == 0) return path; + + len--; /*Go before the trailing '\0'*/ + + /*Ignore trailing '/' or '\'*/ + while(path[len] == '/' || path[len] == '\\') { + if(len > 0) + len--; + else + return path; + } + + size_t i; + for(i = len; i > 0; i--) { + if(path[i] == '/' || path[i] == '\\') break; + } + + /*No '/' or '\' in the path so return with path itself*/ + if(i == 0) return path; + + return &path[i + 1]; +} +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Skip the driver letter and the possible : after the letter + * @param path path string (E.g. S:/folder/file.txt) + * @return pointer to the beginning of the real path (E.g. /folder/file.txt) + */ +static const char * lv_fs_get_real_path(const char * path) +{ + path++; /*Ignore the driver letter*/ + if(*path == ':') path++; + + return path; +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_fs.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_fs.h new file mode 100644 index 0000000..9f65e1b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_fs.h @@ -0,0 +1,262 @@ +/** + * @file lv_fs.h + * + */ + +#ifndef LV_FS_H +#define LV_FS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include +#include + +/********************* + * DEFINES + *********************/ +#define LV_FS_MAX_FN_LENGTH 64 +#define LV_FS_MAX_PATH_LENGTH 256 + +/********************** + * TYPEDEFS + **********************/ + +/** + * Errors in the file system module. + */ +enum { + LV_FS_RES_OK = 0, + LV_FS_RES_HW_ERR, /*Low level hardware error*/ + LV_FS_RES_FS_ERR, /*Error in the file system structure*/ + LV_FS_RES_NOT_EX, /*Driver, file or directory is not exists*/ + LV_FS_RES_FULL, /*Disk full*/ + LV_FS_RES_LOCKED, /*The file is already opened*/ + LV_FS_RES_DENIED, /*Access denied. Check 'fs_open' modes and write protect*/ + LV_FS_RES_BUSY, /*The file system now can't handle it, try later*/ + LV_FS_RES_TOUT, /*Process time outed*/ + LV_FS_RES_NOT_IMP, /*Requested function is not implemented*/ + LV_FS_RES_OUT_OF_MEM, /*Not enough memory for an internal operation*/ + LV_FS_RES_INV_PARAM, /*Invalid parameter among arguments*/ + LV_FS_RES_UNKNOWN, /*Other unknown error*/ +}; +typedef uint8_t lv_fs_res_t; + +/** + * File open mode. + */ +enum { + LV_FS_MODE_WR = 0x01, + LV_FS_MODE_RD = 0x02, +}; +typedef uint8_t lv_fs_mode_t; + + +/** + * Seek modes. + */ +typedef enum { + LV_FS_SEEK_SET = 0x00, /**< Set the position from absolutely (from the start of file)*/ + LV_FS_SEEK_CUR = 0x01, /**< Set the position from the current position*/ + LV_FS_SEEK_END = 0x02, /**< Set the position from the end of the file*/ +} lv_fs_whence_t; + +typedef struct _lv_fs_drv_t { + char letter; + uint16_t cache_size; + bool (*ready_cb)(struct _lv_fs_drv_t * drv); + + void * (*open_cb)(struct _lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); + lv_fs_res_t (*close_cb)(struct _lv_fs_drv_t * drv, void * file_p); + lv_fs_res_t (*read_cb)(struct _lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); + lv_fs_res_t (*write_cb)(struct _lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); + lv_fs_res_t (*seek_cb)(struct _lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); + lv_fs_res_t (*tell_cb)(struct _lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); + + void * (*dir_open_cb)(struct _lv_fs_drv_t * drv, const char * path); + lv_fs_res_t (*dir_read_cb)(struct _lv_fs_drv_t * drv, void * rddir_p, char * fn); + lv_fs_res_t (*dir_close_cb)(struct _lv_fs_drv_t * drv, void * rddir_p); + +#if LV_USE_USER_DATA + void * user_data; /**< Custom file user data*/ +#endif +} lv_fs_drv_t; + +typedef struct { + uint32_t start; + uint32_t end; + uint32_t file_position; + void * buffer; +} lv_fs_file_cache_t; + +typedef struct { + void * file_d; + lv_fs_drv_t * drv; + lv_fs_file_cache_t * cache; +} lv_fs_file_t; + +typedef struct { + void * dir_d; + lv_fs_drv_t * drv; +} lv_fs_dir_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the File system interface + */ +void _lv_fs_init(void); + +/** + * Initialize a file system driver with default values. + * It is used to surly have known values in the fields ant not memory junk. + * After it you can set the fields. + * @param drv pointer to driver variable to initialize + */ +void lv_fs_drv_init(lv_fs_drv_t * drv); + +/** + * Add a new drive + * @param drv pointer to an lv_fs_drv_t structure which is inited with the + * corresponding function pointers. Only pointer is saved, so the + * driver should be static or dynamically allocated. + */ +void lv_fs_drv_register(lv_fs_drv_t * drv); + +/** + * Give a pointer to a driver from its letter + * @param letter the driver letter + * @return pointer to a driver or NULL if not found + */ +lv_fs_drv_t * lv_fs_get_drv(char letter); + +/** + * Test if a drive is ready or not. If the `ready` function was not initialized `true` will be + * returned. + * @param letter letter of the drive + * @return true: drive is ready; false: drive is not ready + */ +bool lv_fs_is_ready(char letter); + +/** + * Open a file + * @param file_p pointer to a lv_fs_file_t variable + * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) + * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_open(lv_fs_file_t * file_p, const char * path, lv_fs_mode_t mode); + +/** + * Close an already opened file + * @param file_p pointer to a lv_fs_file_t variable + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_close(lv_fs_file_t * file_p); + +/** + * Read from a file + * @param file_p pointer to a lv_fs_file_t variable + * @param buf pointer to a buffer where the read bytes are stored + * @param btr Bytes To Read + * @param br the number of real read bytes (Bytes Read). NULL if unused. + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_read(lv_fs_file_t * file_p, void * buf, uint32_t btr, uint32_t * br); + +/** + * Write into a file + * @param file_p pointer to a lv_fs_file_t variable + * @param buf pointer to a buffer with the bytes to write + * @param btw Bytes To Write + * @param bw the number of real written bytes (Bytes Written). NULL if unused. + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_write(lv_fs_file_t * file_p, const void * buf, uint32_t btw, uint32_t * bw); + +/** + * Set the position of the 'cursor' (read write pointer) in a file + * @param file_p pointer to a lv_fs_file_t variable + * @param pos the new position expressed in bytes index (0: start of file) + * @param whence tells from where set the position. See @lv_fs_whence_t + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_seek(lv_fs_file_t * file_p, uint32_t pos, lv_fs_whence_t whence); + +/** + * Give the position of the read write pointer + * @param file_p pointer to a lv_fs_file_t variable + * @param pos_p pointer to store the position of the read write pointer + * @return LV_FS_RES_OK or any error from 'fs_res_t' + */ +lv_fs_res_t lv_fs_tell(lv_fs_file_t * file_p, uint32_t * pos); + +/** + * Initialize a 'fs_dir_t' variable for directory reading + * @param rddir_p pointer to a 'lv_fs_dir_t' variable + * @param path path to a directory + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_dir_open(lv_fs_dir_t * rddir_p, const char * path); + +/** + * Read the next filename form a directory. + * The name of the directories will begin with '/' + * @param rddir_p pointer to an initialized 'fs_dir_t' variable + * @param fn pointer to a buffer to store the filename + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_dir_read(lv_fs_dir_t * rddir_p, char * fn); + +/** + * Close the directory reading + * @param rddir_p pointer to an initialized 'fs_dir_t' variable + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_dir_close(lv_fs_dir_t * rddir_p); + +/** + * Fill a buffer with the letters of existing drivers + * @param buf buffer to store the letters ('\0' added after the last letter) + * @return the buffer + */ +char * lv_fs_get_letters(char * buf); + +/** + * Return with the extension of the filename + * @param fn string with a filename + * @return pointer to the beginning extension or empty string if no extension + */ +const char * lv_fs_get_ext(const char * fn); + +/** + * Step up one level + * @param path pointer to a file name + * @return the truncated file name + */ +char * lv_fs_up(char * path); + +/** + * Get the last element of a path (e.g. U:/folder/file -> file) + * @param path pointer to a file name + * @return pointer to the beginning of the last element in the path + */ +const char * lv_fs_get_last(const char * path); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FS_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_gc.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_gc.c new file mode 100644 index 0000000..95bb549 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_gc.c @@ -0,0 +1,47 @@ +/** + * @file lv_gc.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_gc.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +#if(!defined(LV_ENABLE_GC)) || LV_ENABLE_GC == 0 + LV_ROOTS +#endif /*LV_ENABLE_GC*/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void _lv_gc_clear_roots(void) +{ +#define LV_CLEAR_ROOT(root_type, root_name) lv_memset_00(&LV_GC_ROOT(root_name), sizeof(LV_GC_ROOT(root_name))); + LV_ITERATE_ROOTS(LV_CLEAR_ROOT) +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_gc.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_gc.h new file mode 100644 index 0000000..9d7d1bb --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_gc.h @@ -0,0 +1,97 @@ +/** + * @file lv_gc.h + * + */ + +#ifndef LV_GC_H +#define LV_GC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include +#include "lv_mem.h" +#include "lv_ll.h" +#include "lv_timer.h" +#include "lv_types.h" +#include "../draw/lv_img_cache.h" +#include "../draw/lv_draw_mask.h" +#include "../core/lv_obj_pos.h" + +/********************* + * DEFINES + *********************/ +#if LV_IMG_CACHE_DEF_SIZE +# define LV_IMG_CACHE_DEF 1 +#else +# define LV_IMG_CACHE_DEF 0 +#endif + +#define LV_DISPATCH(f, t, n) f(t, n) +#define LV_DISPATCH_COND(f, t, n, m, v) LV_CONCAT3(LV_DISPATCH, m, v)(f, t, n) + +#define LV_DISPATCH00(f, t, n) LV_DISPATCH(f, t, n) +#define LV_DISPATCH01(f, t, n) +#define LV_DISPATCH10(f, t, n) +#define LV_DISPATCH11(f, t, n) LV_DISPATCH(f, t, n) + +#define LV_ITERATE_ROOTS(f) \ + LV_DISPATCH(f, lv_ll_t, _lv_timer_ll) /*Linked list to store the lv_timers*/ \ + LV_DISPATCH(f, lv_ll_t, _lv_disp_ll) /*Linked list of display device*/ \ + LV_DISPATCH(f, lv_ll_t, _lv_indev_ll) /*Linked list of input device*/ \ + LV_DISPATCH(f, lv_ll_t, _lv_fsdrv_ll) \ + LV_DISPATCH(f, lv_ll_t, _lv_anim_ll) \ + LV_DISPATCH(f, lv_ll_t, _lv_group_ll) \ + LV_DISPATCH(f, lv_ll_t, _lv_img_decoder_ll) \ + LV_DISPATCH(f, lv_ll_t, _lv_obj_style_trans_ll) \ + LV_DISPATCH(f, lv_layout_dsc_t *, _lv_layout_list) \ + LV_DISPATCH_COND(f, _lv_img_cache_entry_t*, _lv_img_cache_array, LV_IMG_CACHE_DEF, 1) \ + LV_DISPATCH_COND(f, _lv_img_cache_entry_t, _lv_img_cache_single, LV_IMG_CACHE_DEF, 0) \ + LV_DISPATCH(f, lv_timer_t*, _lv_timer_act) \ + LV_DISPATCH(f, lv_mem_buf_arr_t , lv_mem_buf) \ + LV_DISPATCH_COND(f, _lv_draw_mask_radius_circle_dsc_arr_t , _lv_circle_cache, LV_DRAW_COMPLEX, 1) \ + LV_DISPATCH_COND(f, _lv_draw_mask_saved_arr_t , _lv_draw_mask_list, LV_DRAW_COMPLEX, 1) \ + LV_DISPATCH(f, void * , _lv_theme_default_styles) \ + LV_DISPATCH(f, void * , _lv_theme_basic_styles) \ + LV_DISPATCH_COND(f, uint8_t *, _lv_font_decompr_buf, LV_USE_FONT_COMPRESSED, 1) \ + LV_DISPATCH(f, uint8_t * , _lv_grad_cache_mem) \ + LV_DISPATCH(f, uint8_t * , _lv_style_custom_prop_flag_lookup_table) + +#define LV_DEFINE_ROOT(root_type, root_name) root_type root_name; +#define LV_ROOTS LV_ITERATE_ROOTS(LV_DEFINE_ROOT) + +#if LV_ENABLE_GC == 1 +#if LV_MEM_CUSTOM != 1 +#error "GC requires CUSTOM_MEM" +#endif /*LV_MEM_CUSTOM*/ +#include LV_GC_INCLUDE +#else /*LV_ENABLE_GC*/ +#define LV_GC_ROOT(x) x +#define LV_EXTERN_ROOT(root_type, root_name) extern root_type root_name; +LV_ITERATE_ROOTS(LV_EXTERN_ROOT) +#endif /*LV_ENABLE_GC*/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void _lv_gc_clear_roots(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GC_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_ll.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_ll.c new file mode 100644 index 0000000..e758231 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_ll.c @@ -0,0 +1,408 @@ +/** + * @file lv_ll.c + * Handle linked lists. + * The nodes are dynamically allocated by the 'lv_mem' module, + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_ll.h" +#include "lv_mem.h" + +/********************* + * DEFINES + *********************/ +#define LL_NODE_META_SIZE (sizeof(lv_ll_node_t *) + sizeof(lv_ll_node_t *)) +#define LL_PREV_P_OFFSET(ll_p) (ll_p->n_size) +#define LL_NEXT_P_OFFSET(ll_p) (ll_p->n_size + sizeof(lv_ll_node_t *)) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void node_set_prev(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * prev); +static void node_set_next(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * next); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Initialize linked list + * @param ll_p pointer to lv_ll_t variable + * @param node_size the size of 1 node in bytes + */ +void _lv_ll_init(lv_ll_t * ll_p, uint32_t node_size) +{ + ll_p->head = NULL; + ll_p->tail = NULL; +#ifdef LV_ARCH_64 + /*Round the size up to 8*/ + node_size = (node_size + 7) & (~0x7); +#else + /*Round the size up to 4*/ + node_size = (node_size + 3) & (~0x3); +#endif + + ll_p->n_size = node_size; +} + +/** + * Add a new head to a linked list + * @param ll_p pointer to linked list + * @return pointer to the new head + */ +void * _lv_ll_ins_head(lv_ll_t * ll_p) +{ + lv_ll_node_t * n_new; + + n_new = lv_mem_alloc(ll_p->n_size + LL_NODE_META_SIZE); + + if(n_new != NULL) { + node_set_prev(ll_p, n_new, NULL); /*No prev. before the new head*/ + node_set_next(ll_p, n_new, ll_p->head); /*After new comes the old head*/ + + if(ll_p->head != NULL) { /*If there is old head then before it goes the new*/ + node_set_prev(ll_p, ll_p->head, n_new); + } + + ll_p->head = n_new; /*Set the new head in the dsc.*/ + if(ll_p->tail == NULL) { /*If there is no tail (1. node) set the tail too*/ + ll_p->tail = n_new; + } + } + + return n_new; +} + +/** + * Insert a new node in front of the n_act node + * @param ll_p pointer to linked list + * @param n_act pointer a node + * @return pointer to the new node + */ +void * _lv_ll_ins_prev(lv_ll_t * ll_p, void * n_act) +{ + lv_ll_node_t * n_new; + + if(NULL == ll_p || NULL == n_act) return NULL; + + if(_lv_ll_get_head(ll_p) == n_act) { + n_new = _lv_ll_ins_head(ll_p); + if(n_new == NULL) return NULL; + } + else { + n_new = lv_mem_alloc(ll_p->n_size + LL_NODE_META_SIZE); + if(n_new == NULL) return NULL; + + lv_ll_node_t * n_prev; + n_prev = _lv_ll_get_prev(ll_p, n_act); + node_set_next(ll_p, n_prev, n_new); + node_set_prev(ll_p, n_new, n_prev); + node_set_prev(ll_p, n_act, n_new); + node_set_next(ll_p, n_new, n_act); + } + + return n_new; +} + +/** + * Add a new tail to a linked list + * @param ll_p pointer to linked list + * @return pointer to the new tail + */ +void * _lv_ll_ins_tail(lv_ll_t * ll_p) +{ + lv_ll_node_t * n_new; + + n_new = lv_mem_alloc(ll_p->n_size + LL_NODE_META_SIZE); + + if(n_new != NULL) { + node_set_next(ll_p, n_new, NULL); /*No next after the new tail*/ + node_set_prev(ll_p, n_new, ll_p->tail); /*The prev. before new is the old tail*/ + if(ll_p->tail != NULL) { /*If there is old tail then the new comes after it*/ + node_set_next(ll_p, ll_p->tail, n_new); + } + + ll_p->tail = n_new; /*Set the new tail in the dsc.*/ + if(ll_p->head == NULL) { /*If there is no head (1. node) set the head too*/ + ll_p->head = n_new; + } + } + + return n_new; +} + +/** + * Remove the node 'node_p' from 'll_p' linked list. + * It does not free the memory of node. + * @param ll_p pointer to the linked list of 'node_p' + * @param node_p pointer to node in 'll_p' linked list + */ +void _lv_ll_remove(lv_ll_t * ll_p, void * node_p) +{ + if(ll_p == NULL) return; + + if(_lv_ll_get_head(ll_p) == node_p) { + /*The new head will be the node after 'n_act'*/ + ll_p->head = _lv_ll_get_next(ll_p, node_p); + if(ll_p->head == NULL) { + ll_p->tail = NULL; + } + else { + node_set_prev(ll_p, ll_p->head, NULL); + } + } + else if(_lv_ll_get_tail(ll_p) == node_p) { + /*The new tail will be the node before 'n_act'*/ + ll_p->tail = _lv_ll_get_prev(ll_p, node_p); + if(ll_p->tail == NULL) { + ll_p->head = NULL; + } + else { + node_set_next(ll_p, ll_p->tail, NULL); + } + } + else { + lv_ll_node_t * n_prev = _lv_ll_get_prev(ll_p, node_p); + lv_ll_node_t * n_next = _lv_ll_get_next(ll_p, node_p); + + node_set_next(ll_p, n_prev, n_next); + node_set_prev(ll_p, n_next, n_prev); + } +} + +/** + * Remove and free all elements from a linked list. The list remain valid but become empty. + * @param ll_p pointer to linked list + */ +void _lv_ll_clear(lv_ll_t * ll_p) +{ + void * i; + void * i_next; + + i = _lv_ll_get_head(ll_p); + i_next = NULL; + + while(i != NULL) { + i_next = _lv_ll_get_next(ll_p, i); + + _lv_ll_remove(ll_p, i); + lv_mem_free(i); + + i = i_next; + } +} + +/** + * Move a node to a new linked list + * @param ll_ori_p pointer to the original (old) linked list + * @param ll_new_p pointer to the new linked list + * @param node pointer to a node + * @param head true: be the head in the new list + * false be the tail in the new list + */ +void _lv_ll_chg_list(lv_ll_t * ll_ori_p, lv_ll_t * ll_new_p, void * node, bool head) +{ + _lv_ll_remove(ll_ori_p, node); + + if(head) { + /*Set node as head*/ + node_set_prev(ll_new_p, node, NULL); + node_set_next(ll_new_p, node, ll_new_p->head); + + if(ll_new_p->head != NULL) { /*If there is old head then before it goes the new*/ + node_set_prev(ll_new_p, ll_new_p->head, node); + } + + ll_new_p->head = node; /*Set the new head in the dsc.*/ + if(ll_new_p->tail == NULL) { /*If there is no tail (first node) set the tail too*/ + ll_new_p->tail = node; + } + } + else { + /*Set node as tail*/ + node_set_prev(ll_new_p, node, ll_new_p->tail); + node_set_next(ll_new_p, node, NULL); + + if(ll_new_p->tail != NULL) { /*If there is old tail then after it goes the new*/ + node_set_next(ll_new_p, ll_new_p->tail, node); + } + + ll_new_p->tail = node; /*Set the new tail in the dsc.*/ + if(ll_new_p->head == NULL) { /*If there is no head (first node) set the head too*/ + ll_new_p->head = node; + } + } +} + +/** + * Return with head node of the linked list + * @param ll_p pointer to linked list + * @return pointer to the head of 'll_p' + */ +void * _lv_ll_get_head(const lv_ll_t * ll_p) +{ + if(ll_p == NULL) return NULL; + return ll_p->head; +} + +/** + * Return with tail node of the linked list + * @param ll_p pointer to linked list + * @return pointer to the tail of 'll_p' + */ +void * _lv_ll_get_tail(const lv_ll_t * ll_p) +{ + if(ll_p == NULL) return NULL; + return ll_p->tail; +} + +/** + * Return with the pointer of the next node after 'n_act' + * @param ll_p pointer to linked list + * @param n_act pointer a node + * @return pointer to the next node + */ +void * _lv_ll_get_next(const lv_ll_t * ll_p, const void * n_act) +{ + /*Pointer to the next node is stored in the end of this node. + *Go there and return the address found there*/ + const lv_ll_node_t * n_act_d = n_act; + n_act_d += LL_NEXT_P_OFFSET(ll_p); + return *((lv_ll_node_t **)n_act_d); +} + +/** + * Return with the pointer of the previous node before 'n_act' + * @param ll_p pointer to linked list + * @param n_act pointer a node + * @return pointer to the previous node + */ +void * _lv_ll_get_prev(const lv_ll_t * ll_p, const void * n_act) +{ + /*Pointer to the prev. node is stored in the end of this node. + *Go there and return the address found there*/ + const lv_ll_node_t * n_act_d = n_act; + n_act_d += LL_PREV_P_OFFSET(ll_p); + return *((lv_ll_node_t **)n_act_d); +} + +/** + * Return the length of the linked list. + * @param ll_p pointer to linked list + * @return length of the linked list + */ +uint32_t _lv_ll_get_len(const lv_ll_t * ll_p) +{ + uint32_t len = 0; + void * node; + + for(node = _lv_ll_get_head(ll_p); node != NULL; node = _lv_ll_get_next(ll_p, node)) { + len++; + } + + return len; +} + +/** + * Move a node before an other node in the same linked list + * @param ll_p pointer to a linked list + * @param n_act pointer to node to move + * @param n_after pointer to a node which should be after `n_act` + */ +void _lv_ll_move_before(lv_ll_t * ll_p, void * n_act, void * n_after) +{ + if(n_act == n_after) return; /*Can't move before itself*/ + + void * n_before; + if(n_after != NULL) + n_before = _lv_ll_get_prev(ll_p, n_after); + else + n_before = _lv_ll_get_tail(ll_p); /*if `n_after` is NULL `n_act` should be the new tail*/ + + if(n_act == n_before) return; /*Already before `n_after`*/ + + /*It's much easier to remove from the list and add again*/ + _lv_ll_remove(ll_p, n_act); + + /*Add again by setting the prev. and next nodes*/ + node_set_next(ll_p, n_before, n_act); + node_set_prev(ll_p, n_act, n_before); + node_set_prev(ll_p, n_after, n_act); + node_set_next(ll_p, n_act, n_after); + + /*If `n_act` was moved before NULL then it become the new tail*/ + if(n_after == NULL) ll_p->tail = n_act; + + /*If `n_act` was moved before `NULL` then it's the new head*/ + if(n_before == NULL) ll_p->head = n_act; +} + +/** + * Check if a linked list is empty + * @param ll_p pointer to a linked list + * @return true: the linked list is empty; false: not empty + */ +bool _lv_ll_is_empty(lv_ll_t * ll_p) +{ + if(ll_p == NULL) return true; + + if(ll_p->head == NULL && ll_p->tail == NULL) return true; + + return false; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Set the previous node pointer of a node + * @param ll_p pointer to linked list + * @param act pointer to a node which prev. node pointer should be set + * @param prev pointer to a node which should be the previous node before 'act' + */ +static void node_set_prev(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * prev) +{ + if(act == NULL) return; /*Can't set the prev node of `NULL`*/ + + uint8_t * act8 = (uint8_t *)act; + + act8 += LL_PREV_P_OFFSET(ll_p); + + lv_ll_node_t ** act_node_p = (lv_ll_node_t **) act8; + lv_ll_node_t ** prev_node_p = (lv_ll_node_t **) &prev; + + *act_node_p = *prev_node_p; +} + +/** + * Set the 'next node pointer' of a node + * @param ll_p pointer to linked list + * @param act pointer to a node which next node pointer should be set + * @param next pointer to a node which should be the next node before 'act' + */ +static void node_set_next(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * next) +{ + if(act == NULL) return; /*Can't set the next node of `NULL`*/ + uint8_t * act8 = (uint8_t *)act; + + act8 += LL_NEXT_P_OFFSET(ll_p); + lv_ll_node_t ** act_node_p = (lv_ll_node_t **) act8; + lv_ll_node_t ** next_node_p = (lv_ll_node_t **) &next; + + *act_node_p = *next_node_p; +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_ll.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_ll.h new file mode 100644 index 0000000..d38f692 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_ll.h @@ -0,0 +1,167 @@ +/** + * @file lv_ll.h + * Handle linked lists. The nodes are dynamically allocated by the 'lv_mem' module. + */ + +#ifndef LV_LL_H +#define LV_LL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** Dummy type to make handling easier*/ +typedef uint8_t lv_ll_node_t; + +/** Description of a linked list*/ +typedef struct { + uint32_t n_size; + lv_ll_node_t * head; + lv_ll_node_t * tail; +} lv_ll_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize linked list + * @param ll_p pointer to lv_ll_t variable + * @param node_size the size of 1 node in bytes + */ +void _lv_ll_init(lv_ll_t * ll_p, uint32_t node_size); + +/** + * Add a new head to a linked list + * @param ll_p pointer to linked list + * @return pointer to the new head + */ +void * _lv_ll_ins_head(lv_ll_t * ll_p); + +/** + * Insert a new node in front of the n_act node + * @param ll_p pointer to linked list + * @param n_act pointer a node + * @return pointer to the new node + */ +void * _lv_ll_ins_prev(lv_ll_t * ll_p, void * n_act); + +/** + * Add a new tail to a linked list + * @param ll_p pointer to linked list + * @return pointer to the new tail + */ +void * _lv_ll_ins_tail(lv_ll_t * ll_p); + +/** + * Remove the node 'node_p' from 'll_p' linked list. + * It does not free the memory of node. + * @param ll_p pointer to the linked list of 'node_p' + * @param node_p pointer to node in 'll_p' linked list + */ +void _lv_ll_remove(lv_ll_t * ll_p, void * node_p); + +/** + * Remove and free all elements from a linked list. The list remain valid but become empty. + * @param ll_p pointer to linked list + */ +void _lv_ll_clear(lv_ll_t * ll_p); + +/** + * Move a node to a new linked list + * @param ll_ori_p pointer to the original (old) linked list + * @param ll_new_p pointer to the new linked list + * @param node pointer to a node + * @param head true: be the head in the new list + * false be the tail in the new list + */ +void _lv_ll_chg_list(lv_ll_t * ll_ori_p, lv_ll_t * ll_new_p, void * node, bool head); + +/** + * Return with head node of the linked list + * @param ll_p pointer to linked list + * @return pointer to the head of 'll_p' + */ +void * _lv_ll_get_head(const lv_ll_t * ll_p); + +/** + * Return with tail node of the linked list + * @param ll_p pointer to linked list + * @return pointer to the tail of 'll_p' + */ +void * _lv_ll_get_tail(const lv_ll_t * ll_p); + +/** + * Return with the pointer of the next node after 'n_act' + * @param ll_p pointer to linked list + * @param n_act pointer a node + * @return pointer to the next node + */ +void * _lv_ll_get_next(const lv_ll_t * ll_p, const void * n_act); + +/** + * Return with the pointer of the previous node after 'n_act' + * @param ll_p pointer to linked list + * @param n_act pointer a node + * @return pointer to the previous node + */ +void * _lv_ll_get_prev(const lv_ll_t * ll_p, const void * n_act); + +/** + * Return the length of the linked list. + * @param ll_p pointer to linked list + * @return length of the linked list + */ +uint32_t _lv_ll_get_len(const lv_ll_t * ll_p); + +/** + * TODO + * @param ll_p + * @param n1_p + * @param n2_p +void lv_ll_swap(lv_ll_t * ll_p, void * n1_p, void * n2_p); + */ + +/** + * Move a node before an other node in the same linked list + * @param ll_p pointer to a linked list + * @param n_act pointer to node to move + * @param n_after pointer to a node which should be after `n_act` + */ +void _lv_ll_move_before(lv_ll_t * ll_p, void * n_act, void * n_after); + +/** + * Check if a linked list is empty + * @param ll_p pointer to a linked list + * @return true: the linked list is empty; false: not empty + */ +bool _lv_ll_is_empty(lv_ll_t * ll_p); + +/********************** + * MACROS + **********************/ + +#define _LV_LL_READ(list, i) for(i = _lv_ll_get_head(list); i != NULL; i = _lv_ll_get_next(list, i)) + +#define _LV_LL_READ_BACK(list, i) for(i = _lv_ll_get_tail(list); i != NULL; i = _lv_ll_get_prev(list, i)) + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_log.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_log.c new file mode 100644 index 0000000..d79463f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_log.c @@ -0,0 +1,144 @@ +/** + * @file lv_log.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_log.h" +#if LV_USE_LOG + +#include +#include +#include "lv_printf.h" +#include "../hal/lv_hal_tick.h" + +#if LV_LOG_PRINTF + #include +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ +static lv_log_print_g_cb_t custom_print_cb; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Register custom print/write function to call when a log is added. + * It can format its "File path", "Line number" and "Description" as required + * and send the formatted log message to a console or serial port. + * @param print_cb a function pointer to print a log + */ +void lv_log_register_print_cb(lv_log_print_g_cb_t print_cb) +{ + custom_print_cb = print_cb; +} + +/** + * Add a log + * @param level the level of log. (From `lv_log_level_t` enum) + * @param file name of the file when the log added + * @param line line number in the source code where the log added + * @param func name of the function when the log added + * @param format printf-like format string + * @param ... parameters for `format` + */ +void _lv_log_add(lv_log_level_t level, const char * file, int line, const char * func, const char * format, ...) +{ + if(level >= _LV_LOG_LEVEL_NUM) return; /*Invalid level*/ + + static uint32_t last_log_time = 0; + + if(level >= LV_LOG_LEVEL) { + va_list args; + va_start(args, format); + + /*Use only the file name not the path*/ + size_t p; + for(p = strlen(file); p > 0; p--) { + if(file[p] == '/' || file[p] == '\\') { + p++; /*Skip the slash*/ + break; + } + } + + uint32_t t = lv_tick_get(); + static const char * lvl_prefix[] = {"Trace", "Info", "Warn", "Error", "User"}; + +#if LV_LOG_PRINTF + printf("[%s]\t(%" LV_PRId32 ".%03" LV_PRId32 ", +%" LV_PRId32 ")\t %s: ", + lvl_prefix[level], t / 1000, t % 1000, t - last_log_time, func); + vprintf(format, args); + printf(" \t(in %s line #%d)\n", &file[p], line); +#else + if(custom_print_cb) { + char buf[512]; +#if LV_SPRINTF_CUSTOM + char msg[256]; + lv_vsnprintf(msg, sizeof(msg), format, args); + lv_snprintf(buf, sizeof(buf), "[%s]\t(%" LV_PRId32 ".%03" LV_PRId32 ", +%" LV_PRId32 ")\t %s: %s \t(in %s line #%d)\n", + lvl_prefix[level], t / 1000, t % 1000, t - last_log_time, func, msg, &file[p], line); +#else + lv_vaformat_t vaf = {format, &args}; + lv_snprintf(buf, sizeof(buf), "[%s]\t(%" LV_PRId32 ".%03" LV_PRId32 ", +%" LV_PRId32 ")\t %s: %pV \t(in %s line #%d)\n", + lvl_prefix[level], t / 1000, t % 1000, t - last_log_time, func, (void *)&vaf, &file[p], line); +#endif + custom_print_cb(buf); + } +#endif + + last_log_time = t; + va_end(args); + } +} + +void lv_log(const char * format, ...) +{ + if(LV_LOG_LEVEL >= LV_LOG_LEVEL_NONE) return; /* disable log */ + + va_list args; + va_start(args, format); + +#if LV_LOG_PRINTF + vprintf(format, args); +#else + if(custom_print_cb) { + char buf[512]; +#if LV_SPRINTF_CUSTOM + lv_vsnprintf(buf, sizeof(buf), format, args); +#else + lv_vaformat_t vaf = {format, &args}; + lv_snprintf(buf, sizeof(buf), "%pV", (void *)&vaf); +#endif + custom_print_cb(buf); + } +#endif + + va_end(args); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_LOG*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_log.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_log.h new file mode 100644 index 0000000..9a00993 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_log.h @@ -0,0 +1,154 @@ +/** + * @file lv_log.h + * + */ + +#ifndef LV_LOG_H +#define LV_LOG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include + +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ + +/*Possible log level. For compatibility declare it independently from `LV_USE_LOG`*/ + +#define LV_LOG_LEVEL_TRACE 0 /**< A lot of logs to give detailed information*/ +#define LV_LOG_LEVEL_INFO 1 /**< Log important events*/ +#define LV_LOG_LEVEL_WARN 2 /**< Log if something unwanted happened but didn't caused problem*/ +#define LV_LOG_LEVEL_ERROR 3 /**< Only critical issue, when the system may fail*/ +#define LV_LOG_LEVEL_USER 4 /**< Custom logs from the user*/ +#define LV_LOG_LEVEL_NONE 5 /**< Do not log anything*/ +#define _LV_LOG_LEVEL_NUM 6 /**< Number of log levels*/ + +LV_EXPORT_CONST_INT(LV_LOG_LEVEL_TRACE); +LV_EXPORT_CONST_INT(LV_LOG_LEVEL_INFO); +LV_EXPORT_CONST_INT(LV_LOG_LEVEL_WARN); +LV_EXPORT_CONST_INT(LV_LOG_LEVEL_ERROR); +LV_EXPORT_CONST_INT(LV_LOG_LEVEL_USER); +LV_EXPORT_CONST_INT(LV_LOG_LEVEL_NONE); + +typedef int8_t lv_log_level_t; + +#if LV_USE_LOG +/********************** + * TYPEDEFS + **********************/ + +/** + * Log print function. Receives a string buffer to print". + */ +typedef void (*lv_log_print_g_cb_t)(const char * buf); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Register custom print/write function to call when a log is added. + * It can format its "File path", "Line number" and "Description" as required + * and send the formatted log message to a console or serial port. + * @param print_cb a function pointer to print a log + */ +void lv_log_register_print_cb(lv_log_print_g_cb_t print_cb); + +/** + * Print a log message via `printf` if enabled with `LV_LOG_PRINTF` in `lv_conf.h` + * and/or a print callback if registered with `lv_log_register_print_cb` + * @param format printf-like format string + * @param ... parameters for `format` + */ +void lv_log(const char * format, ...) LV_FORMAT_ATTRIBUTE(1, 2); + +/** + * Add a log + * @param level the level of log. (From `lv_log_level_t` enum) + * @param file name of the file when the log added + * @param line line number in the source code where the log added + * @param func name of the function when the log added + * @param format printf-like format string + * @param ... parameters for `format` + */ +void _lv_log_add(lv_log_level_t level, const char * file, int line, + const char * func, const char * format, ...) LV_FORMAT_ATTRIBUTE(5, 6); + +/********************** + * MACROS + **********************/ +#ifndef LV_LOG_TRACE +# if LV_LOG_LEVEL <= LV_LOG_LEVEL_TRACE +# define LV_LOG_TRACE(...) _lv_log_add(LV_LOG_LEVEL_TRACE, __FILE__, __LINE__, __func__, __VA_ARGS__) +# else +# define LV_LOG_TRACE(...) do {}while(0) +# endif +#endif + +#ifndef LV_LOG_INFO +# if LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO +# define LV_LOG_INFO(...) _lv_log_add(LV_LOG_LEVEL_INFO, __FILE__, __LINE__, __func__, __VA_ARGS__) +# else +# define LV_LOG_INFO(...) do {}while(0) +# endif +#endif + +#ifndef LV_LOG_WARN +# if LV_LOG_LEVEL <= LV_LOG_LEVEL_WARN +# define LV_LOG_WARN(...) _lv_log_add(LV_LOG_LEVEL_WARN, __FILE__, __LINE__, __func__, __VA_ARGS__) +# else +# define LV_LOG_WARN(...) do {}while(0) +# endif +#endif + +#ifndef LV_LOG_ERROR +# if LV_LOG_LEVEL <= LV_LOG_LEVEL_ERROR +# define LV_LOG_ERROR(...) _lv_log_add(LV_LOG_LEVEL_ERROR, __FILE__, __LINE__, __func__, __VA_ARGS__) +# else +# define LV_LOG_ERROR(...) do {}while(0) +# endif +#endif + +#ifndef LV_LOG_USER +# if LV_LOG_LEVEL <= LV_LOG_LEVEL_USER +# define LV_LOG_USER(...) _lv_log_add(LV_LOG_LEVEL_USER, __FILE__, __LINE__, __func__, __VA_ARGS__) +# else +# define LV_LOG_USER(...) do {}while(0) +# endif +#endif + +#ifndef LV_LOG +# if LV_LOG_LEVEL < LV_LOG_LEVEL_NONE +# define LV_LOG(...) lv_log(__VA_ARGS__) +# else +# define LV_LOG(...) do {} while(0) +# endif +#endif + +#else /*LV_USE_LOG*/ + +/*Do nothing if `LV_USE_LOG 0`*/ +#define _lv_log_add(level, file, line, ...) +#define LV_LOG_TRACE(...) do {}while(0) +#define LV_LOG_INFO(...) do {}while(0) +#define LV_LOG_WARN(...) do {}while(0) +#define LV_LOG_ERROR(...) do {}while(0) +#define LV_LOG_USER(...) do {}while(0) +#define LV_LOG(...) do {}while(0) + +#endif /*LV_USE_LOG*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LOG_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_lru.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_lru.c new file mode 100644 index 0000000..6ff8390 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_lru.c @@ -0,0 +1,349 @@ +/** + * @file lv_lru.c + * + * @see https://github.com/willcannings/C-LRU-Cache + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_lru.h" +#include "lv_math.h" +#include "lv_mem.h" +#include "lv_assert.h" +#include "lv_log.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_lru_item_t { + void * value; + void * key; + size_t value_length; + size_t key_length; + uint64_t access_count; + struct _lv_lru_item_t * next; +}; + +/********************** + * STATIC PROTOTYPES + **********************/ + +/** + * MurmurHash2 + * @author Austin Appleby + * @see http://sites.google.com/site/murmurhash/ + */ +static uint32_t lv_lru_hash(lv_lru_t * cache, const void * key, uint32_t key_length); + +/** compare a key against an existing item's key */ +static int lv_lru_cmp_keys(lv_lru_item_t * item, const void * key, uint32_t key_length); + +/** remove an item and push it to the free items queue */ +static void lv_lru_remove_item(lv_lru_t * cache, lv_lru_item_t * prev, lv_lru_item_t * item, uint32_t hash_index); + +/** pop an existing item off the free queue, or create a new one */ +static lv_lru_item_t * lv_lru_pop_or_create_item(lv_lru_t * cache); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/* error helpers */ +#define error_for(conditions, error) if(conditions) {return error;} +#define test_for_missing_cache() error_for(!cache, LV_LRU_MISSING_CACHE) +#define test_for_missing_key() error_for(!key, LV_LRU_MISSING_KEY) +#define test_for_missing_value() error_for(!value || value_length == 0, LV_LRU_MISSING_VALUE) +#define test_for_value_too_large() error_for(value_length > cache->total_memory, LV_LRU_VALUE_TOO_LARGE) + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_lru_t * lv_lru_create(size_t cache_size, size_t average_length, lv_lru_free_t * value_free, + lv_lru_free_t * key_free) +{ + // create the cache + lv_lru_t * cache = (lv_lru_t *) lv_mem_alloc(sizeof(lv_lru_t)); + lv_memset_00(cache, sizeof(lv_lru_t)); + if(!cache) { + LV_LOG_WARN("LRU Cache unable to create cache object"); + return NULL; + } + cache->hash_table_size = cache_size / average_length; + cache->average_item_length = average_length; + cache->free_memory = cache_size; + cache->total_memory = cache_size; + cache->seed = lv_rand(1, UINT32_MAX); + cache->value_free = value_free ? value_free : lv_mem_free; + cache->key_free = key_free ? key_free : lv_mem_free; + + // size the hash table to a guestimate of the number of slots required (assuming a perfect hash) + cache->items = (lv_lru_item_t **) lv_mem_alloc(sizeof(lv_lru_item_t *) * cache->hash_table_size); + lv_memset_00(cache->items, sizeof(lv_lru_item_t *) * cache->hash_table_size); + if(!cache->items) { + LV_LOG_WARN("LRU Cache unable to create cache hash table"); + lv_mem_free(cache); + return NULL; + } + return cache; +} + + +void lv_lru_del(lv_lru_t * cache) +{ + LV_ASSERT_NULL(cache); + + // free each of the cached items, and the hash table + lv_lru_item_t * item = NULL, *next = NULL; + uint32_t i = 0; + if(cache->items) { + for(; i < cache->hash_table_size; i++) { + item = cache->items[i]; + while(item) { + next = (lv_lru_item_t *) item->next; + cache->value_free(item->value); + cache->key_free(item->key); + cache->free_memory += item->value_length; + lv_mem_free(item); + item = next; + } + } + lv_mem_free(cache->items); + } + + if(cache->free_items) { + item = cache->free_items; + while(item) { + next = (lv_lru_item_t *) item->next; + lv_mem_free(item); + item = next; + } + } + + // free the cache + lv_mem_free(cache); +} + + +lv_lru_res_t lv_lru_set(lv_lru_t * cache, const void * key, size_t key_length, void * value, size_t value_length) +{ + test_for_missing_cache(); + test_for_missing_key(); + test_for_missing_value(); + test_for_value_too_large(); + + // see if the key already exists + uint32_t hash_index = lv_lru_hash(cache, key, key_length); + int required = 0; + lv_lru_item_t * item = NULL, *prev = NULL; + item = cache->items[hash_index]; + + while(item && lv_lru_cmp_keys(item, key, key_length)) { + prev = item; + item = (lv_lru_item_t *) item->next; + } + + if(item) { + // update the value and value_lengths + required = (int)(value_length - item->value_length); + cache->value_free(item->value); + item->value = value; + item->value_length = value_length; + + } + else { + // insert a new item + item = lv_lru_pop_or_create_item(cache); + item->value = value; + item->key = lv_mem_alloc(key_length); + memcpy(item->key, key, key_length); + item->value_length = value_length; + item->key_length = key_length; + required = (int) value_length; + + if(prev) + prev->next = item; + else + cache->items[hash_index] = item; + } + item->access_count = ++cache->access_count; + + // remove as many items as necessary to free enough space + if(required > 0 && (size_t) required > cache->free_memory) { + while(cache->free_memory < (size_t) required) + lv_lru_remove_lru_item(cache); + } + cache->free_memory -= required; + return LV_LRU_OK; +} + + +lv_lru_res_t lv_lru_get(lv_lru_t * cache, const void * key, size_t key_size, void ** value) +{ + test_for_missing_cache(); + test_for_missing_key(); + + // loop until we find the item, or hit the end of a chain + uint32_t hash_index = lv_lru_hash(cache, key, key_size); + lv_lru_item_t * item = cache->items[hash_index]; + + while(item && lv_lru_cmp_keys(item, key, key_size)) + item = (lv_lru_item_t *) item->next; + + if(item) { + *value = item->value; + item->access_count = ++cache->access_count; + } + else { + *value = NULL; + } + + return LV_LRU_OK; +} + +lv_lru_res_t lv_lru_remove(lv_lru_t * cache, const void * key, size_t key_size) +{ + test_for_missing_cache(); + test_for_missing_key(); + + // loop until we find the item, or hit the end of a chain + lv_lru_item_t * item = NULL, *prev = NULL; + uint32_t hash_index = lv_lru_hash(cache, key, key_size); + item = cache->items[hash_index]; + + while(item && lv_lru_cmp_keys(item, key, key_size)) { + prev = item; + item = (lv_lru_item_t *) item->next; + } + + if(item) { + lv_lru_remove_item(cache, prev, item, hash_index); + } + + return LV_LRU_OK; +} + +void lv_lru_remove_lru_item(lv_lru_t * cache) +{ + lv_lru_item_t * min_item = NULL, *min_prev = NULL; + lv_lru_item_t * item = NULL, *prev = NULL; + uint32_t i = 0, min_index = -1; + uint64_t min_access_count = -1; + + for(; i < cache->hash_table_size; i++) { + item = cache->items[i]; + prev = NULL; + + while(item) { + if(item->access_count < min_access_count || (int64_t) min_access_count == -1) { + min_access_count = item->access_count; + min_item = item; + min_prev = prev; + min_index = i; + } + prev = item; + item = item->next; + } + } + + if(min_item) { + lv_lru_remove_item(cache, min_prev, min_item, min_index); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static uint32_t lv_lru_hash(lv_lru_t * cache, const void * key, uint32_t key_length) +{ + uint32_t m = 0x5bd1e995; + uint32_t r = 24; + uint32_t h = cache->seed ^ key_length; + char * data = (char *) key; + + while(key_length >= 4) { + uint32_t k = *(uint32_t *) data; + k *= m; + k ^= k >> r; + k *= m; + h *= m; + h ^= k; + data += 4; + key_length -= 4; + } + + if(key_length >= 3) { + h ^= data[2] << 16; + } + if(key_length >= 2) { + h ^= data[1] << 8; + } + if(key_length >= 1) { + h ^= data[0]; + h *= m; + } + + h ^= h >> 13; + h *= m; + h ^= h >> 15; + return h % cache->hash_table_size; +} + +static int lv_lru_cmp_keys(lv_lru_item_t * item, const void * key, uint32_t key_length) +{ + if(key_length != item->key_length) { + return 1; + } + else { + return memcmp(key, item->key, key_length); + } +} + +static void lv_lru_remove_item(lv_lru_t * cache, lv_lru_item_t * prev, lv_lru_item_t * item, uint32_t hash_index) +{ + if(prev) { + prev->next = item->next; + } + else { + cache->items[hash_index] = (lv_lru_item_t *) item->next; + } + + // free memory and update the free memory counter + cache->free_memory += item->value_length; + cache->value_free(item->value); + cache->key_free(item->key); + + // push the item to the free items queue + lv_memset_00(item, sizeof(lv_lru_item_t)); + item->next = cache->free_items; + cache->free_items = item; +} + +static lv_lru_item_t * lv_lru_pop_or_create_item(lv_lru_t * cache) +{ + lv_lru_item_t * item = NULL; + + if(cache->free_items) { + item = cache->free_items; + cache->free_items = item->next; + lv_memset_00(item, sizeof(lv_lru_item_t)); + } + else { + item = (lv_lru_item_t *) lv_mem_alloc(sizeof(lv_lru_item_t)); + lv_memset_00(item, sizeof(lv_lru_item_t)); + } + + return item; +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_lru.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_lru.h new file mode 100644 index 0000000..2d0134e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_lru.h @@ -0,0 +1,87 @@ +/** + * @file lv_lru.h + * + */ + +#ifndef LV_LRU_H +#define LV_LRU_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lv_conf_internal.h" + +#include "lv_types.h" + +#include +#include + + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_LRU_OK = 0, + LV_LRU_MISSING_CACHE, + LV_LRU_MISSING_KEY, + LV_LRU_MISSING_VALUE, + LV_LRU_LOCK_ERROR, + LV_LRU_VALUE_TOO_LARGE +} lv_lru_res_t; + +typedef void (lv_lru_free_t)(void * v); +typedef struct _lv_lru_item_t lv_lru_item_t; + +typedef struct lv_lru_t { + lv_lru_item_t ** items; + uint64_t access_count; + size_t free_memory; + size_t total_memory; + size_t average_item_length; + size_t hash_table_size; + uint32_t seed; + lv_lru_free_t * value_free; + lv_lru_free_t * key_free; + lv_lru_item_t * free_items; +} lv_lru_t; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_lru_t * lv_lru_create(size_t cache_size, size_t average_length, lv_lru_free_t * value_free, + lv_lru_free_t * key_free); + +void lv_lru_del(lv_lru_t * cache); + +lv_lru_res_t lv_lru_set(lv_lru_t * cache, const void * key, size_t key_length, void * value, size_t value_length); + +lv_lru_res_t lv_lru_get(lv_lru_t * cache, const void * key, size_t key_size, void ** value); + +lv_lru_res_t lv_lru_remove(lv_lru_t * cache, const void * key, size_t key_size); + +/** + * remove the least recently used item + * + * @todo we can optimise this by finding the n lru items, where n = required_space / average_length + */ +void lv_lru_remove_lru_item(lv_lru_t * cache); +/********************** + * MACROS + **********************/ +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LRU_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_math.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_math.c new file mode 100644 index 0000000..bfb3934 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_math.c @@ -0,0 +1,273 @@ +/** + * @file lv_math.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_math.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ +static const int16_t sin0_90_table[] = { + 0, 572, 1144, 1715, 2286, 2856, 3425, 3993, 4560, 5126, 5690, 6252, 6813, 7371, 7927, 8481, + 9032, 9580, 10126, 10668, 11207, 11743, 12275, 12803, 13328, 13848, 14364, 14876, 15383, 15886, 16383, 16876, + 17364, 17846, 18323, 18794, 19260, 19720, 20173, 20621, 21062, 21497, 21925, 22347, 22762, 23170, 23571, 23964, + 24351, 24730, 25101, 25465, 25821, 26169, 26509, 26841, 27165, 27481, 27788, 28087, 28377, 28659, 28932, 29196, + 29451, 29697, 29934, 30162, 30381, 30591, 30791, 30982, 31163, 31335, 31498, 31650, 31794, 31927, 32051, 32165, + 32269, 32364, 32448, 32523, 32587, 32642, 32687, 32722, 32747, 32762, 32767 +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Return with sinus of an angle + * @param angle + * @return sinus of 'angle'. sin(-90) = -32767, sin(90) = 32767 + */ +LV_ATTRIBUTE_FAST_MEM int16_t lv_trigo_sin(int16_t angle) +{ + int16_t ret = 0; + angle = angle % 360; + + if(angle < 0) angle = 360 + angle; + + if(angle < 90) { + ret = sin0_90_table[angle]; + } + else if(angle >= 90 && angle < 180) { + angle = 180 - angle; + ret = sin0_90_table[angle]; + } + else if(angle >= 180 && angle < 270) { + angle = angle - 180; + ret = -sin0_90_table[angle]; + } + else { /*angle >=270*/ + angle = 360 - angle; + ret = -sin0_90_table[angle]; + } + + return ret; +} + +/** + * Calculate a value of a Cubic Bezier function. + * @param t time in range of [0..LV_BEZIER_VAL_MAX] + * @param u0 start values in range of [0..LV_BEZIER_VAL_MAX] + * @param u1 control value 1 values in range of [0..LV_BEZIER_VAL_MAX] + * @param u2 control value 2 in range of [0..LV_BEZIER_VAL_MAX] + * @param u3 end values in range of [0..LV_BEZIER_VAL_MAX] + * @return the value calculated from the given parameters in range of [0..LV_BEZIER_VAL_MAX] + */ +uint32_t lv_bezier3(uint32_t t, uint32_t u0, uint32_t u1, uint32_t u2, uint32_t u3) +{ + uint32_t t_rem = 1024 - t; + uint32_t t_rem2 = (t_rem * t_rem) >> 10; + uint32_t t_rem3 = (t_rem2 * t_rem) >> 10; + uint32_t t2 = (t * t) >> 10; + uint32_t t3 = (t2 * t) >> 10; + + uint32_t v1 = (t_rem3 * u0) >> 10; + uint32_t v2 = (3 * t_rem2 * t * u1) >> 20; + uint32_t v3 = (3 * t_rem * t2 * u2) >> 20; + uint32_t v4 = (t3 * u3) >> 10; + + return v1 + v2 + v3 + v4; +} + +/** + * Get the square root of a number + * @param x integer which square root should be calculated + * @param q store the result here. q->i: integer part, q->f: fractional part in 1/256 unit + * @param mask optional to skip some iterations if the magnitude of the root is known. + * Set to 0x8000 by default. + * If root < 16: mask = 0x80 + * If root < 256: mask = 0x800 + * Else: mask = 0x8000 + */ +LV_ATTRIBUTE_FAST_MEM void lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask) +{ + x = x << 8; /*To get 4 bit precision. (sqrt(256) = 16 = 4 bit)*/ + + uint32_t root = 0; + uint32_t trial; + // http://ww1.microchip.com/...en/AppNotes/91040a.pdf + do { + trial = root + mask; + if(trial * trial <= x) root = trial; + mask = mask >> 1; + } while(mask); + + q->i = root >> 4; + q->f = (root & 0xf) << 4; +} + +/** + * Calculate the atan2 of a vector. + * @param x + * @param y + * @return the angle in degree calculated from the given parameters in range of [0..360] + */ +uint16_t lv_atan2(int x, int y) +{ + // Fast XY vector to integer degree algorithm - Jan 2011 www.RomanBlack.com + // Converts any XY values including 0 to a degree value that should be + // within +/- 1 degree of the accurate value without needing + // large slow trig functions like ArcTan() or ArcCos(). + // NOTE! at least one of the X or Y values must be non-zero! + // This is the full version, for all 4 quadrants and will generate + // the angle in integer degrees from 0-360. + // Any values of X and Y are usable including negative values provided + // they are between -1456 and 1456 so the 16bit multiply does not overflow. + + unsigned char negflag; + unsigned char tempdegree; + unsigned char comp; + unsigned int degree; // this will hold the result + unsigned int ux; + unsigned int uy; + + // Save the sign flags then remove signs and get XY as unsigned ints + negflag = 0; + if(x < 0) { + negflag += 0x01; // x flag bit + x = (0 - x); // is now + + } + ux = x; // copy to unsigned var before multiply + if(y < 0) { + negflag += 0x02; // y flag bit + y = (0 - y); // is now + + } + uy = y; // copy to unsigned var before multiply + + // 1. Calc the scaled "degrees" + if(ux > uy) { + degree = (uy * 45) / ux; // degree result will be 0-45 range + negflag += 0x10; // octant flag bit + } + else { + degree = (ux * 45) / uy; // degree result will be 0-45 range + } + + // 2. Compensate for the 4 degree error curve + comp = 0; + tempdegree = degree; // use an unsigned char for speed! + if(tempdegree > 22) { // if top half of range + if(tempdegree <= 44) comp++; + if(tempdegree <= 41) comp++; + if(tempdegree <= 37) comp++; + if(tempdegree <= 32) comp++; // max is 4 degrees compensated + } + else { // else is lower half of range + if(tempdegree >= 2) comp++; + if(tempdegree >= 6) comp++; + if(tempdegree >= 10) comp++; + if(tempdegree >= 15) comp++; // max is 4 degrees compensated + } + degree += comp; // degree is now accurate to +/- 1 degree! + + // Invert degree if it was X>Y octant, makes 0-45 into 90-45 + if(negflag & 0x10) degree = (90 - degree); + + // 3. Degree is now 0-90 range for this quadrant, + // need to invert it for whichever quadrant it was in + if(negflag & 0x02) { // if -Y + if(negflag & 0x01) // if -Y -X + degree = (180 + degree); + else // else is -Y +X + degree = (180 - degree); + } + else { // else is +Y + if(negflag & 0x01) // if +Y -X + degree = (360 - degree); + } + return degree; +} + +/** + * Calculate the integer exponents. + * @param base + * @param power + * @return base raised to the power exponent + */ +int64_t lv_pow(int64_t base, int8_t exp) +{ + int64_t result = 1; + while(exp) { + if(exp & 1) + result *= base; + exp >>= 1; + base *= base; + } + + return result; +} + +/** + * Get the mapped of a number given an input and output range + * @param x integer which mapped value should be calculated + * @param min_in min input range + * @param max_in max input range + * @param min_out max output range + * @param max_out max output range + * @return the mapped number + */ +int32_t lv_map(int32_t x, int32_t min_in, int32_t max_in, int32_t min_out, int32_t max_out) +{ + if(max_in >= min_in && x >= max_in) return max_out; + if(max_in >= min_in && x <= min_in) return min_out; + + if(max_in <= min_in && x <= max_in) return max_out; + if(max_in <= min_in && x >= min_in) return min_out; + + /** + * The equation should be: + * ((x - min_in) * delta_out) / delta in) + min_out + * To avoid rounding error reorder the operations: + * (x - min_in) * (delta_out / delta_min) + min_out + */ + + int32_t delta_in = max_in - min_in; + int32_t delta_out = max_out - min_out; + + return ((x - min_in) * delta_out) / delta_in + min_out; +} + +uint32_t lv_rand(uint32_t min, uint32_t max) +{ + static uint32_t a = 0x1234ABCD; /*Seed*/ + + /*Algorithm "xor" from p. 4 of Marsaglia, "Xorshift RNGs"*/ + uint32_t x = a; + x ^= x << 13; + x ^= x >> 17; + x ^= x << 5; + a = x; + + return (a % (max - min + 1)) + min; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_math.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_math.h new file mode 100644 index 0000000..4b2860a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_math.h @@ -0,0 +1,143 @@ +/** + * @file lv_math.h + * + */ + +#ifndef LV_MATH_H +#define LV_MATH_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include + +/********************* + * DEFINES + *********************/ +#define LV_TRIGO_SIN_MAX 32767 +#define LV_TRIGO_SHIFT 15 /**< >> LV_TRIGO_SHIFT to normalize*/ + +#define LV_BEZIER_VAL_MAX 1024 /**< Max time in Bezier functions (not [0..1] to use integers)*/ +#define LV_BEZIER_VAL_SHIFT 10 /**< log2(LV_BEZIER_VAL_MAX): used to normalize up scaled values*/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + uint16_t i; + uint16_t f; +} lv_sqrt_res_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +//! @cond Doxygen_Suppress +/** + * Return with sinus of an angle + * @param angle + * @return sinus of 'angle'. sin(-90) = -32767, sin(90) = 32767 + */ +LV_ATTRIBUTE_FAST_MEM int16_t lv_trigo_sin(int16_t angle); + +static inline LV_ATTRIBUTE_FAST_MEM int16_t lv_trigo_cos(int16_t angle) +{ + return lv_trigo_sin(angle + 90); +} + +//! @endcond + +/** + * Calculate a value of a Cubic Bezier function. + * @param t time in range of [0..LV_BEZIER_VAL_MAX] + * @param u0 start values in range of [0..LV_BEZIER_VAL_MAX] + * @param u1 control value 1 values in range of [0..LV_BEZIER_VAL_MAX] + * @param u2 control value 2 in range of [0..LV_BEZIER_VAL_MAX] + * @param u3 end values in range of [0..LV_BEZIER_VAL_MAX] + * @return the value calculated from the given parameters in range of [0..LV_BEZIER_VAL_MAX] + */ +uint32_t lv_bezier3(uint32_t t, uint32_t u0, uint32_t u1, uint32_t u2, uint32_t u3); + +/** + * Calculate the atan2 of a vector. + * @param x + * @param y + * @return the angle in degree calculated from the given parameters in range of [0..360] + */ +uint16_t lv_atan2(int x, int y); + +//! @cond Doxygen_Suppress + +/** + * Get the square root of a number + * @param x integer which square root should be calculated + * @param q store the result here. q->i: integer part, q->f: fractional part in 1/256 unit + * @param mask optional to skip some iterations if the magnitude of the root is known. + * Set to 0x8000 by default. + * If root < 16: mask = 0x80 + * If root < 256: mask = 0x800 + * Else: mask = 0x8000 + */ +LV_ATTRIBUTE_FAST_MEM void lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask); + +//! @endcond + +/** + * Calculate the integer exponents. + * @param base + * @param power + * @return base raised to the power exponent + */ +int64_t lv_pow(int64_t base, int8_t exp); + +/** + * Get the mapped of a number given an input and output range + * @param x integer which mapped value should be calculated + * @param min_in min input range + * @param max_in max input range + * @param min_out max output range + * @param max_out max output range + * @return the mapped number + */ +int32_t lv_map(int32_t x, int32_t min_in, int32_t max_in, int32_t min_out, int32_t max_out); + +/** + * Get a pseudo random number in the given range + * @param min the minimum value + * @param max the maximum value + * @return return the random number. min <= return_value <= max + */ +uint32_t lv_rand(uint32_t min, uint32_t max); + +/********************** + * MACROS + **********************/ +#define LV_MIN(a, b) ((a) < (b) ? (a) : (b)) +#define LV_MIN3(a, b, c) (LV_MIN(LV_MIN(a,b), c)) +#define LV_MIN4(a, b, c, d) (LV_MIN(LV_MIN(a,b), LV_MIN(c,d))) + +#define LV_MAX(a, b) ((a) > (b) ? (a) : (b)) +#define LV_MAX3(a, b, c) (LV_MAX(LV_MAX(a,b), c)) +#define LV_MAX4(a, b, c, d) (LV_MAX(LV_MAX(a,b), LV_MAX(c,d))) + +#define LV_CLAMP(min, val, max) (LV_MAX(min, (LV_MIN(val, max)))) + +#define LV_ABS(x) ((x) > 0 ? (x) : (-(x))) +#define LV_UDIV255(x) (((x) * 0x8081U) >> 0x17) + +#define LV_IS_SIGNED(t) (((t)(-1)) < ((t)0)) +#define LV_UMAX_OF(t) (((0x1ULL << ((sizeof(t) * 8ULL) - 1ULL)) - 1ULL) | (0xFULL << ((sizeof(t) * 8ULL) - 4ULL))) +#define LV_SMAX_OF(t) (((0x1ULL << ((sizeof(t) * 8ULL) - 1ULL)) - 1ULL) | (0x7ULL << ((sizeof(t) * 8ULL) - 4ULL))) +#define LV_MAX_OF(t) ((unsigned long)(LV_IS_SIGNED(t) ? LV_SMAX_OF(t) : LV_UMAX_OF(t))) + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_mem.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_mem.c new file mode 100644 index 0000000..b7c602f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_mem.c @@ -0,0 +1,566 @@ +/** + * @file lv_mem.c + * General and portable implementation of malloc and free. + * The dynamic memory monitoring is also supported. + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_mem.h" +#include "lv_tlsf.h" +#include "lv_gc.h" +#include "lv_assert.h" +#include "lv_log.h" + +#if LV_MEM_CUSTOM != 0 + #include LV_MEM_CUSTOM_INCLUDE +#endif + +#ifdef LV_MEM_POOL_INCLUDE + #include LV_MEM_POOL_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ +/*memset the allocated memories to 0xaa and freed memories to 0xbb (just for testing purposes)*/ +#ifndef LV_MEM_ADD_JUNK + #define LV_MEM_ADD_JUNK 0 +#endif + +#ifdef LV_ARCH_64 + #define MEM_UNIT uint64_t + #define ALIGN_MASK 0x7 +#else + #define MEM_UNIT uint32_t + #define ALIGN_MASK 0x3 +#endif + +#define ZERO_MEM_SENTINEL 0xa1b2c3d4 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +#if LV_MEM_CUSTOM == 0 + static void lv_mem_walker(void * ptr, size_t size, int used, void * user); +#endif + +/********************** + * STATIC VARIABLES + **********************/ +#if LV_MEM_CUSTOM == 0 + static lv_tlsf_t tlsf; + static uint32_t cur_used; + static uint32_t max_used; +#endif + +static uint32_t zero_mem = ZERO_MEM_SENTINEL; /*Give the address of this variable if 0 byte should be allocated*/ + +/********************** + * MACROS + **********************/ +#if LV_LOG_TRACE_MEM + #define MEM_TRACE(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define MEM_TRACE(...) +#endif + +#define COPY32 *d32 = *s32; d32++; s32++; +#define COPY8 *d8 = *s8; d8++; s8++; +#define SET32(x) *d32 = x; d32++; +#define SET8(x) *d8 = x; d8++; +#define REPEAT8(expr) expr expr expr expr expr expr expr expr + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Initialize the dyn_mem module (work memory and other variables) + */ +void lv_mem_init(void) +{ +#if LV_MEM_CUSTOM == 0 + +#if LV_MEM_ADR == 0 +#ifdef LV_MEM_POOL_ALLOC + tlsf = lv_tlsf_create_with_pool((void *)LV_MEM_POOL_ALLOC(LV_MEM_SIZE), LV_MEM_SIZE); +#else + /*Allocate a large array to store the dynamically allocated data*/ + static LV_ATTRIBUTE_LARGE_RAM_ARRAY MEM_UNIT work_mem_int[LV_MEM_SIZE / sizeof(MEM_UNIT)]; + tlsf = lv_tlsf_create_with_pool((void *)work_mem_int, LV_MEM_SIZE); +#endif +#else + tlsf = lv_tlsf_create_with_pool((void *)LV_MEM_ADR, LV_MEM_SIZE); +#endif +#endif + +#if LV_MEM_ADD_JUNK + LV_LOG_WARN("LV_MEM_ADD_JUNK is enabled which makes LVGL much slower"); +#endif +} + +/** + * Clean up the memory buffer which frees all the allocated memories. + * @note It work only if `LV_MEM_CUSTOM == 0` + */ +void lv_mem_deinit(void) +{ +#if LV_MEM_CUSTOM == 0 + lv_tlsf_destroy(tlsf); + lv_mem_init(); +#endif +} + +/** + * Allocate a memory dynamically + * @param size size of the memory to allocate in bytes + * @return pointer to the allocated memory + */ +void * lv_mem_alloc(size_t size) +{ + MEM_TRACE("allocating %lu bytes", (unsigned long)size); + if(size == 0) { + MEM_TRACE("using zero_mem"); + return &zero_mem; + } + +#if LV_MEM_CUSTOM == 0 + void * alloc = lv_tlsf_malloc(tlsf, size); +#else + void * alloc = LV_MEM_CUSTOM_ALLOC(size); +#endif + + if(alloc == NULL) { + LV_LOG_INFO("couldn't allocate memory (%lu bytes)", (unsigned long)size); +#if LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO + lv_mem_monitor_t mon; + lv_mem_monitor(&mon); + LV_LOG_INFO("used: %6d (%3d %%), frag: %3d %%, biggest free: %6d", + (int)(mon.total_size - mon.free_size), mon.used_pct, mon.frag_pct, + (int)mon.free_biggest_size); +#endif + } +#if LV_MEM_ADD_JUNK + else { + lv_memset(alloc, 0xaa, size); + } +#endif + + if(alloc) { +#if LV_MEM_CUSTOM == 0 + cur_used += size; + max_used = LV_MAX(cur_used, max_used); +#endif + MEM_TRACE("allocated at %p", alloc); + } + return alloc; +} + +/** + * Free an allocated data + * @param data pointer to an allocated memory + */ +void lv_mem_free(void * data) +{ + MEM_TRACE("freeing %p", data); + if(data == &zero_mem) return; + if(data == NULL) return; + +#if LV_MEM_CUSTOM == 0 +# if LV_MEM_ADD_JUNK + lv_memset(data, 0xbb, lv_tlsf_block_size(data)); +# endif + size_t size = lv_tlsf_free(tlsf, data); + if(cur_used > size) cur_used -= size; + else cur_used = 0; +#else + LV_MEM_CUSTOM_FREE(data); +#endif +} + +/** + * Reallocate a memory with a new size. The old content will be kept. + * @param data pointer to an allocated memory. + * Its content will be copied to the new memory block and freed + * @param new_size the desired new size in byte + * @return pointer to the new memory + */ +void * lv_mem_realloc(void * data_p, size_t new_size) +{ + MEM_TRACE("reallocating %p with %lu size", data_p, (unsigned long)new_size); + if(new_size == 0) { + MEM_TRACE("using zero_mem"); + lv_mem_free(data_p); + return &zero_mem; + } + + if(data_p == &zero_mem) return lv_mem_alloc(new_size); + +#if LV_MEM_CUSTOM == 0 + void * new_p = lv_tlsf_realloc(tlsf, data_p, new_size); +#else + void * new_p = LV_MEM_CUSTOM_REALLOC(data_p, new_size); +#endif + if(new_p == NULL) { + LV_LOG_ERROR("couldn't allocate memory"); + return NULL; + } + + MEM_TRACE("allocated at %p", new_p); + return new_p; +} + +lv_res_t lv_mem_test(void) +{ + if(zero_mem != ZERO_MEM_SENTINEL) { + LV_LOG_WARN("zero_mem is written"); + return LV_RES_INV; + } + +#if LV_MEM_CUSTOM == 0 + if(lv_tlsf_check(tlsf)) { + LV_LOG_WARN("failed"); + return LV_RES_INV; + } + + if(lv_tlsf_check_pool(lv_tlsf_get_pool(tlsf))) { + LV_LOG_WARN("pool failed"); + return LV_RES_INV; + } +#endif + MEM_TRACE("passed"); + return LV_RES_OK; +} + +/** + * Give information about the work memory of dynamic allocation + * @param mon_p pointer to a lv_mem_monitor_t variable, + * the result of the analysis will be stored here + */ +void lv_mem_monitor(lv_mem_monitor_t * mon_p) +{ + /*Init the data*/ + lv_memset(mon_p, 0, sizeof(lv_mem_monitor_t)); +#if LV_MEM_CUSTOM == 0 + MEM_TRACE("begin"); + + lv_tlsf_walk_pool(lv_tlsf_get_pool(tlsf), lv_mem_walker, mon_p); + + mon_p->total_size = LV_MEM_SIZE; + mon_p->used_pct = 100 - (100U * mon_p->free_size) / mon_p->total_size; + if(mon_p->free_size > 0) { + mon_p->frag_pct = mon_p->free_biggest_size * 100U / mon_p->free_size; + mon_p->frag_pct = 100 - mon_p->frag_pct; + } + else { + mon_p->frag_pct = 0; /*no fragmentation if all the RAM is used*/ + } + + mon_p->max_used = max_used; + + MEM_TRACE("finished"); +#endif +} + + +/** + * Get a temporal buffer with the given size. + * @param size the required size + */ +void * lv_mem_buf_get(uint32_t size) +{ + if(size == 0) return NULL; + + MEM_TRACE("begin, getting %d bytes", size); + + /*Try to find a free buffer with suitable size*/ + int8_t i_guess = -1; + for(uint8_t i = 0; i < LV_MEM_BUF_MAX_NUM; i++) { + if(LV_GC_ROOT(lv_mem_buf[i]).used == 0 && LV_GC_ROOT(lv_mem_buf[i]).size >= size) { + if(LV_GC_ROOT(lv_mem_buf[i]).size == size) { + LV_GC_ROOT(lv_mem_buf[i]).used = 1; + return LV_GC_ROOT(lv_mem_buf[i]).p; + } + else if(i_guess < 0) { + i_guess = i; + } + /*If size of `i` is closer to `size` prefer it*/ + else if(LV_GC_ROOT(lv_mem_buf[i]).size < LV_GC_ROOT(lv_mem_buf[i_guess]).size) { + i_guess = i; + } + } + } + + if(i_guess >= 0) { + LV_GC_ROOT(lv_mem_buf[i_guess]).used = 1; + MEM_TRACE("returning already allocated buffer (buffer id: %d, address: %p)", i_guess, + LV_GC_ROOT(lv_mem_buf[i_guess]).p); + return LV_GC_ROOT(lv_mem_buf[i_guess]).p; + } + + /*Reallocate a free buffer*/ + for(uint8_t i = 0; i < LV_MEM_BUF_MAX_NUM; i++) { + if(LV_GC_ROOT(lv_mem_buf[i]).used == 0) { + /*if this fails you probably need to increase your LV_MEM_SIZE/heap size*/ + void * buf = lv_mem_realloc(LV_GC_ROOT(lv_mem_buf[i]).p, size); + LV_ASSERT_MSG(buf != NULL, "Out of memory, can't allocate a new buffer (increase your LV_MEM_SIZE/heap size)"); + if(buf == NULL) return NULL; + + LV_GC_ROOT(lv_mem_buf[i]).used = 1; + LV_GC_ROOT(lv_mem_buf[i]).size = size; + LV_GC_ROOT(lv_mem_buf[i]).p = buf; + MEM_TRACE("allocated (buffer id: %d, address: %p)", i, LV_GC_ROOT(lv_mem_buf[i]).p); + return LV_GC_ROOT(lv_mem_buf[i]).p; + } + } + + LV_LOG_ERROR("no more buffers. (increase LV_MEM_BUF_MAX_NUM)"); + LV_ASSERT_MSG(false, "No more buffers. Increase LV_MEM_BUF_MAX_NUM."); + return NULL; +} + +/** + * Release a memory buffer + * @param p buffer to release + */ +void lv_mem_buf_release(void * p) +{ + MEM_TRACE("begin (address: %p)", p); + + for(uint8_t i = 0; i < LV_MEM_BUF_MAX_NUM; i++) { + if(LV_GC_ROOT(lv_mem_buf[i]).p == p) { + LV_GC_ROOT(lv_mem_buf[i]).used = 0; + return; + } + } + + LV_LOG_ERROR("p is not a known buffer"); +} + +/** + * Free all memory buffers + */ +void lv_mem_buf_free_all(void) +{ + for(uint8_t i = 0; i < LV_MEM_BUF_MAX_NUM; i++) { + if(LV_GC_ROOT(lv_mem_buf[i]).p) { + lv_mem_free(LV_GC_ROOT(lv_mem_buf[i]).p); + LV_GC_ROOT(lv_mem_buf[i]).p = NULL; + LV_GC_ROOT(lv_mem_buf[i]).used = 0; + LV_GC_ROOT(lv_mem_buf[i]).size = 0; + } + } +} + +#if LV_MEMCPY_MEMSET_STD == 0 +/** + * Same as `memcpy` but optimized for 4 byte operation. + * @param dst pointer to the destination buffer + * @param src pointer to the source buffer + * @param len number of byte to copy + */ +LV_ATTRIBUTE_FAST_MEM void * lv_memcpy(void * dst, const void * src, size_t len) +{ + uint8_t * d8 = dst; + const uint8_t * s8 = src; + + lv_uintptr_t d_align = (lv_uintptr_t)d8 & ALIGN_MASK; + lv_uintptr_t s_align = (lv_uintptr_t)s8 & ALIGN_MASK; + + /*Byte copy for unaligned memories*/ + if(s_align != d_align) { + while(len > 32) { + REPEAT8(COPY8); + REPEAT8(COPY8); + REPEAT8(COPY8); + REPEAT8(COPY8); + len -= 32; + } + while(len) { + COPY8 + len--; + } + return dst; + } + + /*Make the memories aligned*/ + if(d_align) { + d_align = ALIGN_MASK + 1 - d_align; + while(d_align && len) { + COPY8; + d_align--; + len--; + } + } + + uint32_t * d32 = (uint32_t *)d8; + const uint32_t * s32 = (uint32_t *)s8; + while(len > 32) { + REPEAT8(COPY32) + len -= 32; + } + + while(len > 4) { + COPY32; + len -= 4; + } + + d8 = (uint8_t *)d32; + s8 = (const uint8_t *)s32; + while(len) { + COPY8 + len--; + } + + return dst; +} + +/** + * Same as `memset` but optimized for 4 byte operation. + * @param dst pointer to the destination buffer + * @param v value to set [0..255] + * @param len number of byte to set + */ +LV_ATTRIBUTE_FAST_MEM void lv_memset(void * dst, uint8_t v, size_t len) +{ + + uint8_t * d8 = (uint8_t *)dst; + + uintptr_t d_align = (lv_uintptr_t) d8 & ALIGN_MASK; + + /*Make the address aligned*/ + if(d_align) { + d_align = ALIGN_MASK + 1 - d_align; + while(d_align && len) { + SET8(v); + len--; + d_align--; + } + } + + uint32_t v32 = (uint32_t)v + ((uint32_t)v << 8) + ((uint32_t)v << 16) + ((uint32_t)v << 24); + + uint32_t * d32 = (uint32_t *)d8; + + while(len > 32) { + REPEAT8(SET32(v32)); + len -= 32; + } + + while(len > 4) { + SET32(v32); + len -= 4; + } + + d8 = (uint8_t *)d32; + while(len) { + SET8(v); + len--; + } +} + +/** + * Same as `memset(dst, 0x00, len)` but optimized for 4 byte operation. + * @param dst pointer to the destination buffer + * @param len number of byte to set + */ +LV_ATTRIBUTE_FAST_MEM void lv_memset_00(void * dst, size_t len) +{ + uint8_t * d8 = (uint8_t *)dst; + uintptr_t d_align = (lv_uintptr_t) d8 & ALIGN_MASK; + + /*Make the address aligned*/ + if(d_align) { + d_align = ALIGN_MASK + 1 - d_align; + while(d_align && len) { + SET8(0); + len--; + d_align--; + } + } + + uint32_t * d32 = (uint32_t *)d8; + while(len > 32) { + REPEAT8(SET32(0)); + len -= 32; + } + + while(len > 4) { + SET32(0); + len -= 4; + } + + d8 = (uint8_t *)d32; + while(len) { + SET8(0); + len--; + } +} + +/** + * Same as `memset(dst, 0xFF, len)` but optimized for 4 byte operation. + * @param dst pointer to the destination buffer + * @param len number of byte to set + */ +LV_ATTRIBUTE_FAST_MEM void lv_memset_ff(void * dst, size_t len) +{ + uint8_t * d8 = (uint8_t *)dst; + uintptr_t d_align = (lv_uintptr_t) d8 & ALIGN_MASK; + + /*Make the address aligned*/ + if(d_align) { + d_align = ALIGN_MASK + 1 - d_align; + while(d_align && len) { + SET8(0xFF); + len--; + d_align--; + } + } + + uint32_t * d32 = (uint32_t *)d8; + while(len > 32) { + REPEAT8(SET32(0xFFFFFFFF)); + len -= 32; + } + + while(len > 4) { + SET32(0xFFFFFFFF); + len -= 4; + } + + d8 = (uint8_t *)d32; + while(len) { + SET8(0xFF); + len--; + } +} + +#endif /*LV_MEMCPY_MEMSET_STD*/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +#if LV_MEM_CUSTOM == 0 +static void lv_mem_walker(void * ptr, size_t size, int used, void * user) +{ + LV_UNUSED(ptr); + + lv_mem_monitor_t * mon_p = user; + if(used) { + mon_p->used_cnt++; + } + else { + mon_p->free_cnt++; + mon_p->free_size += size; + if(size > mon_p->free_biggest_size) + mon_p->free_biggest_size = size; + } +} +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_mem.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_mem.h new file mode 100644 index 0000000..7a83b3d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_mem.h @@ -0,0 +1,243 @@ +/** + * @file lv_mem.h + * + */ + +#ifndef LV_MEM_H +#define LV_MEM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include +#include +#include + +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Heap information structure. + */ +typedef struct { + uint32_t total_size; /**< Total heap size*/ + uint32_t free_cnt; + uint32_t free_size; /**< Size of available memory*/ + uint32_t free_biggest_size; + uint32_t used_cnt; + uint32_t max_used; /**< Max size of Heap memory used*/ + uint8_t used_pct; /**< Percentage used*/ + uint8_t frag_pct; /**< Amount of fragmentation*/ +} lv_mem_monitor_t; + +typedef struct { + void * p; + uint16_t size; + uint8_t used : 1; +} lv_mem_buf_t; + +typedef lv_mem_buf_t lv_mem_buf_arr_t[LV_MEM_BUF_MAX_NUM]; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the dyn_mem module (work memory and other variables) + */ +void lv_mem_init(void); + +/** + * Clean up the memory buffer which frees all the allocated memories. + * @note It work only if `LV_MEM_CUSTOM == 0` + */ +void lv_mem_deinit(void); + +/** + * Allocate a memory dynamically + * @param size size of the memory to allocate in bytes + * @return pointer to the allocated memory + */ +void * lv_mem_alloc(size_t size); + +/** + * Free an allocated data + * @param data pointer to an allocated memory + */ +void lv_mem_free(void * data); + +/** + * Reallocate a memory with a new size. The old content will be kept. + * @param data pointer to an allocated memory. + * Its content will be copied to the new memory block and freed + * @param new_size the desired new size in byte + * @return pointer to the new memory, NULL on failure + */ +void * lv_mem_realloc(void * data_p, size_t new_size); + +/** + * + * @return + */ +lv_res_t lv_mem_test(void); + +/** + * Give information about the work memory of dynamic allocation + * @param mon_p pointer to a lv_mem_monitor_t variable, + * the result of the analysis will be stored here + */ +void lv_mem_monitor(lv_mem_monitor_t * mon_p); + + +/** + * Get a temporal buffer with the given size. + * @param size the required size + */ +void * lv_mem_buf_get(uint32_t size); + +/** + * Release a memory buffer + * @param p buffer to release + */ +void lv_mem_buf_release(void * p); + +/** + * Free all memory buffers + */ +void lv_mem_buf_free_all(void); + +//! @cond Doxygen_Suppress + +#if LV_MEMCPY_MEMSET_STD + +/** + * Wrapper for the standard memcpy + * @param dst pointer to the destination buffer + * @param src pointer to the source buffer + * @param len number of byte to copy + */ +static inline void * lv_memcpy(void * dst, const void * src, size_t len) +{ + return memcpy(dst, src, len); +} + +/** + * Wrapper for the standard memcpy + * @param dst pointer to the destination buffer + * @param src pointer to the source buffer + * @param len number of byte to copy + */ +static inline void * lv_memcpy_small(void * dst, const void * src, size_t len) +{ + return memcpy(dst, src, len); +} + +/** + * Wrapper for the standard memset + * @param dst pointer to the destination buffer + * @param v value to set [0..255] + * @param len number of byte to set + */ +static inline void lv_memset(void * dst, uint8_t v, size_t len) +{ + memset(dst, v, len); +} + +/** + * Wrapper for the standard memset with fixed 0x00 value + * @param dst pointer to the destination buffer + * @param len number of byte to set + */ +static inline void lv_memset_00(void * dst, size_t len) +{ + memset(dst, 0x00, len); +} + +/** + * Wrapper for the standard memset with fixed 0xFF value + * @param dst pointer to the destination buffer + * @param len number of byte to set + */ +static inline void lv_memset_ff(void * dst, size_t len) +{ + memset(dst, 0xFF, len); +} + +#else +/** + * Same as `memcpy` but optimized for 4 byte operation. + * @param dst pointer to the destination buffer + * @param src pointer to the source buffer + * @param len number of byte to copy + */ +LV_ATTRIBUTE_FAST_MEM void * lv_memcpy(void * dst, const void * src, size_t len); + +/** + * Same as `memcpy` but optimized to copy only a few bytes. + * @param dst pointer to the destination buffer + * @param src pointer to the source buffer + * @param len number of byte to copy + */ +LV_ATTRIBUTE_FAST_MEM static inline void * lv_memcpy_small(void * dst, const void * src, size_t len) +{ + uint8_t * d8 = (uint8_t *)dst; + const uint8_t * s8 = (const uint8_t *)src; + + while(len) { + *d8 = *s8; + d8++; + s8++; + len--; + } + + return dst; +} + +/** + * Same as `memset` but optimized for 4 byte operation. + * @param dst pointer to the destination buffer + * @param v value to set [0..255] + * @param len number of byte to set + */ +LV_ATTRIBUTE_FAST_MEM void lv_memset(void * dst, uint8_t v, size_t len); + +/** + * Same as `memset(dst, 0x00, len)` but optimized for 4 byte operation. + * @param dst pointer to the destination buffer + * @param len number of byte to set + */ +LV_ATTRIBUTE_FAST_MEM void lv_memset_00(void * dst, size_t len); + +/** + * Same as `memset(dst, 0xFF, len)` but optimized for 4 byte operation. + * @param dst pointer to the destination buffer + * @param len number of byte to set + */ +LV_ATTRIBUTE_FAST_MEM void lv_memset_ff(void * dst, size_t len); + +//! @endcond + +#endif + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_MEM_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_misc.mk b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_misc.mk new file mode 100644 index 0000000..1dfd4ee --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_misc.mk @@ -0,0 +1,26 @@ +CSRCS += lv_anim.c +CSRCS += lv_anim_timeline.c +CSRCS += lv_area.c +CSRCS += lv_async.c +CSRCS += lv_bidi.c +CSRCS += lv_color.c +CSRCS += lv_fs.c +CSRCS += lv_gc.c +CSRCS += lv_ll.c +CSRCS += lv_log.c +CSRCS += lv_lru.c +CSRCS += lv_math.c +CSRCS += lv_mem.c +CSRCS += lv_printf.c +CSRCS += lv_style.c +CSRCS += lv_style_gen.c +CSRCS += lv_timer.c +CSRCS += lv_tlsf.c +CSRCS += lv_txt.c +CSRCS += lv_txt_ap.c +CSRCS += lv_utils.c + +DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/misc +VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/misc + +CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/misc" diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_printf.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_printf.c new file mode 100644 index 0000000..9077a7a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_printf.c @@ -0,0 +1,879 @@ +/////////////////////////////////////////////////////////////////////////////// +// \author (c) Marco Paland (info@paland.com) +// 2014-2019, PALANDesign Hannover, Germany +// +// \license The MIT License (MIT) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// \brief Tiny printf, sprintf and (v)snprintf implementation, optimized for speed on +// embedded systems with a very limited resources. These routines are thread +// safe and reentrant! +// Use this instead of the bloated standard/newlib printf cause these use +// malloc for printf (and may not be thread safe). +// +/////////////////////////////////////////////////////////////////////////////// + +/*Original repository: https://github.com/mpaland/printf*/ + +#include "lv_printf.h" + +#if LV_SPRINTF_CUSTOM == 0 + +#include + +#define PRINTF_DISABLE_SUPPORT_FLOAT (!LV_SPRINTF_USE_FLOAT) + +// 'ntoa' conversion buffer size, this must be big enough to hold one converted +// numeric number including padded zeros (dynamically created on stack) +// default: 32 byte +#ifndef PRINTF_NTOA_BUFFER_SIZE + #define PRINTF_NTOA_BUFFER_SIZE 32U +#endif + +// 'ftoa' conversion buffer size, this must be big enough to hold one converted +// float number including padded zeros (dynamically created on stack) +// default: 32 byte +#ifndef PRINTF_FTOA_BUFFER_SIZE + #define PRINTF_FTOA_BUFFER_SIZE 32U +#endif + +// support for the floating point type (%f) +// default: activated +#if !PRINTF_DISABLE_SUPPORT_FLOAT + #define PRINTF_SUPPORT_FLOAT +#endif + +// support for exponential floating point notation (%e/%g) +// default: activated +#ifndef PRINTF_DISABLE_SUPPORT_EXPONENTIAL + #define PRINTF_SUPPORT_EXPONENTIAL +#endif + +// define the default floating point precision +// default: 6 digits +#ifndef PRINTF_DEFAULT_FLOAT_PRECISION + #define PRINTF_DEFAULT_FLOAT_PRECISION 6U +#endif + +// define the largest float suitable to print with %f +// default: 1e9 +#ifndef PRINTF_MAX_FLOAT + #define PRINTF_MAX_FLOAT 1e9 +#endif + +// support for the long long types (%llu or %p) +// default: activated +#ifndef PRINTF_DISABLE_SUPPORT_LONG_LONG + #define PRINTF_SUPPORT_LONG_LONG +#endif + +// support for the ptrdiff_t type (%t) +// ptrdiff_t is normally defined in as long or long long type +// default: activated +#ifndef PRINTF_DISABLE_SUPPORT_PTRDIFF_T + #define PRINTF_SUPPORT_PTRDIFF_T +#endif + +/////////////////////////////////////////////////////////////////////////////// + +// internal flag definitions +#define FLAGS_ZEROPAD (1U << 0U) +#define FLAGS_LEFT (1U << 1U) +#define FLAGS_PLUS (1U << 2U) +#define FLAGS_SPACE (1U << 3U) +#define FLAGS_HASH (1U << 4U) +#define FLAGS_UPPERCASE (1U << 5U) +#define FLAGS_CHAR (1U << 6U) +#define FLAGS_SHORT (1U << 7U) +#define FLAGS_LONG (1U << 8U) +#define FLAGS_LONG_LONG (1U << 9U) +#define FLAGS_PRECISION (1U << 10U) +#define FLAGS_ADAPT_EXP (1U << 11U) + +// import float.h for DBL_MAX +#if defined(PRINTF_SUPPORT_FLOAT) + #include +#endif + +// output function type +typedef void (*out_fct_type)(char character, void * buffer, size_t idx, size_t maxlen); + +// wrapper (used as buffer) for output function type +typedef struct { + void (*fct)(char character, void * arg); + void * arg; +} out_fct_wrap_type; + +// internal buffer output +static inline void _out_buffer(char character, void * buffer, size_t idx, size_t maxlen) +{ + if(idx < maxlen) { + ((char *)buffer)[idx] = character; + } +} + +// internal null output +static inline void _out_null(char character, void * buffer, size_t idx, size_t maxlen) +{ + LV_UNUSED(character); + LV_UNUSED(buffer); + LV_UNUSED(idx); + LV_UNUSED(maxlen); +} + +// internal secure strlen +// \return The length of the string (excluding the terminating 0) limited by 'maxsize' +static inline unsigned int _strnlen_s(const char * str, size_t maxsize) +{ + const char * s; + for(s = str; *s && maxsize--; ++s); + return (unsigned int)(s - str); +} + +// internal test if char is a digit (0-9) +// \return true if char is a digit +static inline bool _is_digit(char ch) +{ + return (ch >= '0') && (ch <= '9'); +} + +// internal ASCII string to unsigned int conversion +static unsigned int _atoi(const char ** str) +{ + unsigned int i = 0U; + while(_is_digit(**str)) { + i = i * 10U + (unsigned int)(*((*str)++) - '0'); + } + return i; +} + +// output the specified string in reverse, taking care of any zero-padding +static size_t _out_rev(out_fct_type out, char * buffer, size_t idx, size_t maxlen, const char * buf, size_t len, + unsigned int width, unsigned int flags) +{ + const size_t start_idx = idx; + + // pad spaces up to given width + if(!(flags & FLAGS_LEFT) && !(flags & FLAGS_ZEROPAD)) { + size_t i; + for(i = len; i < width; i++) { + out(' ', buffer, idx++, maxlen); + } + } + + // reverse string + while(len) { + out(buf[--len], buffer, idx++, maxlen); + } + + // append pad spaces up to given width + if(flags & FLAGS_LEFT) { + while(idx - start_idx < width) { + out(' ', buffer, idx++, maxlen); + } + } + + return idx; +} + +// internal itoa format +static size_t _ntoa_format(out_fct_type out, char * buffer, size_t idx, size_t maxlen, char * buf, size_t len, + bool negative, unsigned int base, unsigned int prec, unsigned int width, unsigned int flags) +{ + // pad leading zeros + if(!(flags & FLAGS_LEFT)) { + if(width && (flags & FLAGS_ZEROPAD) && (negative || (flags & (FLAGS_PLUS | FLAGS_SPACE)))) { + width--; + } + while((len < prec) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } + while((flags & FLAGS_ZEROPAD) && (len < width) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } + } + + // handle hash + if(flags & FLAGS_HASH) { + if(!(flags & FLAGS_PRECISION) && len && ((len == prec) || (len == width))) { + len--; + if(len && (base == 16U)) { + len--; + } + } + if((base == 16U) && !(flags & FLAGS_UPPERCASE) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = 'x'; + } + else if((base == 16U) && (flags & FLAGS_UPPERCASE) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = 'X'; + } + else if((base == 2U) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = 'b'; + } + if(len < PRINTF_NTOA_BUFFER_SIZE) { + buf[len++] = '0'; + } + } + + if(len < PRINTF_NTOA_BUFFER_SIZE) { + if(negative) { + buf[len++] = '-'; + } + else if(flags & FLAGS_PLUS) { + buf[len++] = '+'; // ignore the space if the '+' exists + } + else if(flags & FLAGS_SPACE) { + buf[len++] = ' '; + } + } + + return _out_rev(out, buffer, idx, maxlen, buf, len, width, flags); +} + +// internal itoa for 'long' type +static size_t _ntoa_long(out_fct_type out, char * buffer, size_t idx, size_t maxlen, unsigned long value, bool negative, + unsigned long base, unsigned int prec, unsigned int width, unsigned int flags) +{ + char buf[PRINTF_NTOA_BUFFER_SIZE]; + size_t len = 0U; + + // no hash for 0 values + if(!value) { + flags &= ~FLAGS_HASH; + } + + // write if precision != 0 and value is != 0 + if(!(flags & FLAGS_PRECISION) || value) { + do { + const char digit = (char)(value % base); + buf[len++] = digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; + value /= base; + } while(value && (len < PRINTF_NTOA_BUFFER_SIZE)); + } + + return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, (unsigned int)base, prec, width, flags); +} + +// internal itoa for 'long long' type +#if defined(PRINTF_SUPPORT_LONG_LONG) +static size_t _ntoa_long_long(out_fct_type out, char * buffer, size_t idx, size_t maxlen, unsigned long long value, + bool negative, unsigned long long base, unsigned int prec, unsigned int width, unsigned int flags) +{ + char buf[PRINTF_NTOA_BUFFER_SIZE]; + size_t len = 0U; + + // no hash for 0 values + if(!value) { + flags &= ~FLAGS_HASH; + } + + // write if precision != 0 and value is != 0 + if(!(flags & FLAGS_PRECISION) || value) { + do { + const char digit = (char)(value % base); + buf[len++] = digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; + value /= base; + } while(value && (len < PRINTF_NTOA_BUFFER_SIZE)); + } + + return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, (unsigned int)base, prec, width, flags); +} +#endif // PRINTF_SUPPORT_LONG_LONG + +#if defined(PRINTF_SUPPORT_FLOAT) + +#if defined(PRINTF_SUPPORT_EXPONENTIAL) +// forward declaration so that _ftoa can switch to exp notation for values > PRINTF_MAX_FLOAT +static size_t _etoa(out_fct_type out, char * buffer, size_t idx, size_t maxlen, double value, unsigned int prec, + unsigned int width, unsigned int flags); +#endif + +// internal ftoa for fixed decimal floating point +static size_t _ftoa(out_fct_type out, char * buffer, size_t idx, size_t maxlen, double value, unsigned int prec, + unsigned int width, unsigned int flags) +{ + char buf[PRINTF_FTOA_BUFFER_SIZE]; + size_t len = 0U; + double diff = 0.0; + + // powers of 10 + static const double pow10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; + + // test for special values + if(value != value) + return _out_rev(out, buffer, idx, maxlen, "nan", 3, width, flags); + if(value < -DBL_MAX) + return _out_rev(out, buffer, idx, maxlen, "fni-", 4, width, flags); + if(value > DBL_MAX) + return _out_rev(out, buffer, idx, maxlen, (flags & FLAGS_PLUS) ? "fni+" : "fni", (flags & FLAGS_PLUS) ? 4U : 3U, width, + flags); + + // test for very large values + // standard printf behavior is to print EVERY whole number digit -- which could be 100s of characters overflowing your buffers == bad + if((value > PRINTF_MAX_FLOAT) || (value < -PRINTF_MAX_FLOAT)) { +#if defined(PRINTF_SUPPORT_EXPONENTIAL) + return _etoa(out, buffer, idx, maxlen, value, prec, width, flags); +#else + return 0U; +#endif + } + + // test for negative + bool negative = false; + if(value < 0) { + negative = true; + value = 0 - value; + } + + // set default precision, if not set explicitly + if(!(flags & FLAGS_PRECISION)) { + prec = PRINTF_DEFAULT_FLOAT_PRECISION; + } + // limit precision to 9, cause a prec >= 10 can lead to overflow errors + while((len < PRINTF_FTOA_BUFFER_SIZE) && (prec > 9U)) { + buf[len++] = '0'; + prec--; + } + + int whole = (int)value; + double tmp = (value - whole) * pow10[prec]; + unsigned long frac = (unsigned long)tmp; + diff = tmp - frac; + + if(diff > 0.5) { + ++frac; + // handle rollover, e.g. case 0.99 with prec 1 is 1.0 + if(frac >= pow10[prec]) { + frac = 0; + ++whole; + } + } + else if(diff < 0.5) { + } + else if((frac == 0U) || (frac & 1U)) { + // if halfway, round up if odd OR if last digit is 0 + ++frac; + } + + if(prec == 0U) { + diff = value - (double)whole; + if((!(diff < 0.5) || (diff > 0.5)) && (whole & 1)) { + // exactly 0.5 and ODD, then round up + // 1.5 -> 2, but 2.5 -> 2 + ++whole; + } + } + else { + unsigned int count = prec; + // now do fractional part, as an unsigned number + while(len < PRINTF_FTOA_BUFFER_SIZE) { + --count; + buf[len++] = (char)(48U + (frac % 10U)); + if(!(frac /= 10U)) { + break; + } + } + // add extra 0s + while((len < PRINTF_FTOA_BUFFER_SIZE) && (count-- > 0U)) { + buf[len++] = '0'; + } + if(len < PRINTF_FTOA_BUFFER_SIZE) { + // add decimal + buf[len++] = '.'; + } + } + + // do whole part, number is reversed + while(len < PRINTF_FTOA_BUFFER_SIZE) { + buf[len++] = (char)(48 + (whole % 10)); + if(!(whole /= 10)) { + break; + } + } + + // pad leading zeros + if(!(flags & FLAGS_LEFT) && (flags & FLAGS_ZEROPAD)) { + if(width && (negative || (flags & (FLAGS_PLUS | FLAGS_SPACE)))) { + width--; + } + while((len < width) && (len < PRINTF_FTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } + } + + if(len < PRINTF_FTOA_BUFFER_SIZE) { + if(negative) { + buf[len++] = '-'; + } + else if(flags & FLAGS_PLUS) { + buf[len++] = '+'; // ignore the space if the '+' exists + } + else if(flags & FLAGS_SPACE) { + buf[len++] = ' '; + } + } + + return _out_rev(out, buffer, idx, maxlen, buf, len, width, flags); +} + +#if defined(PRINTF_SUPPORT_EXPONENTIAL) +// internal ftoa variant for exponential floating-point type, contributed by Martijn Jasperse +static size_t _etoa(out_fct_type out, char * buffer, size_t idx, size_t maxlen, double value, unsigned int prec, + unsigned int width, unsigned int flags) +{ + // check for NaN and special values + if((value != value) || (value > DBL_MAX) || (value < -DBL_MAX)) { + return _ftoa(out, buffer, idx, maxlen, value, prec, width, flags); + } + + // determine the sign + const bool negative = value < 0; + if(negative) { + value = -value; + } + + // default precision + if(!(flags & FLAGS_PRECISION)) { + prec = PRINTF_DEFAULT_FLOAT_PRECISION; + } + + // determine the decimal exponent + // based on the algorithm by David Gay (https://www.ampl.com/netlib/fp/dtoa.c) + union { + uint64_t U; + double F; + } conv; + + conv.F = value; + int exp2 = (int)((conv.U >> 52U) & 0x07FFU) - 1023; // effectively log2 + conv.U = (conv.U & ((1ULL << 52U) - 1U)) | (1023ULL << 52U); // drop the exponent so conv.F is now in [1,2) + // now approximate log10 from the log2 integer part and an expansion of ln around 1.5 + int expval = (int)(0.1760912590558 + exp2 * 0.301029995663981 + (conv.F - 1.5) * 0.289529654602168); + // now we want to compute 10^expval but we want to be sure it won't overflow + exp2 = (int)(expval * 3.321928094887362 + 0.5); + const double z = expval * 2.302585092994046 - exp2 * 0.6931471805599453; + const double z2 = z * z; + conv.U = (uint64_t)(exp2 + 1023) << 52U; + // compute exp(z) using continued fractions, see https://en.wikipedia.org/wiki/Exponential_function#Continued_fractions_for_ex + conv.F *= 1 + 2 * z / (2 - z + (z2 / (6 + (z2 / (10 + z2 / 14))))); + // correct for rounding errors + if(value < conv.F) { + expval--; + conv.F /= 10; + } + + // the exponent format is "%+03d" and largest value is "307", so set aside 4-5 characters + unsigned int minwidth = ((expval < 100) && (expval > -100)) ? 4U : 5U; + + // in "%g" mode, "prec" is the number of *significant figures* not decimals + if(flags & FLAGS_ADAPT_EXP) { + // do we want to fall-back to "%f" mode? + if((value >= 1e-4) && (value < 1e6)) { + if((int)prec > expval) { + prec = (unsigned)((int)prec - expval - 1); + } + else { + prec = 0; + } + flags |= FLAGS_PRECISION; // make sure _ftoa respects precision + // no characters in exponent + minwidth = 0U; + expval = 0; + } + else { + // we use one sigfig for the whole part + if((prec > 0) && (flags & FLAGS_PRECISION)) { + --prec; + } + } + } + + // will everything fit? + unsigned int fwidth = width; + if(width > minwidth) { + // we didn't fall-back so subtract the characters required for the exponent + fwidth -= minwidth; + } + else { + // not enough characters, so go back to default sizing + fwidth = 0U; + } + if((flags & FLAGS_LEFT) && minwidth) { + // if we're padding on the right, DON'T pad the floating part + fwidth = 0U; + } + + // rescale the float value + if(expval) { + value /= conv.F; + } + + // output the floating part + const size_t start_idx = idx; + idx = _ftoa(out, buffer, idx, maxlen, negative ? -value : value, prec, fwidth, flags & ~FLAGS_ADAPT_EXP); + + // output the exponent part + if(minwidth) { + // output the exponential symbol + out((flags & FLAGS_UPPERCASE) ? 'E' : 'e', buffer, idx++, maxlen); + // output the exponent value + idx = _ntoa_long(out, buffer, idx, maxlen, (expval < 0) ? -expval : expval, expval < 0, 10, 0, minwidth - 1, + FLAGS_ZEROPAD | FLAGS_PLUS); + // might need to right-pad spaces + if(flags & FLAGS_LEFT) { + while(idx - start_idx < width) out(' ', buffer, idx++, maxlen); + } + } + return idx; +} +#endif // PRINTF_SUPPORT_EXPONENTIAL +#endif // PRINTF_SUPPORT_FLOAT + +// internal vsnprintf +static int _vsnprintf(out_fct_type out, char * buffer, const size_t maxlen, const char * format, va_list va) +{ + unsigned int flags, width, precision, n; + size_t idx = 0U; + + if(!buffer) { + // use null output function + out = _out_null; + } + + while(*format) { + // format specifier? %[flags][width][.precision][length] + if(*format != '%') { + // no + out(*format, buffer, idx++, maxlen); + format++; + continue; + } + else { + // yes, evaluate it + format++; + } + + // evaluate flags + flags = 0U; + do { + switch(*format) { + case '0': + flags |= FLAGS_ZEROPAD; + format++; + n = 1U; + break; + case '-': + flags |= FLAGS_LEFT; + format++; + n = 1U; + break; + case '+': + flags |= FLAGS_PLUS; + format++; + n = 1U; + break; + case ' ': + flags |= FLAGS_SPACE; + format++; + n = 1U; + break; + case '#': + flags |= FLAGS_HASH; + format++; + n = 1U; + break; + default : + n = 0U; + break; + } + } while(n); + + // evaluate width field + width = 0U; + if(_is_digit(*format)) { + width = _atoi(&format); + } + else if(*format == '*') { + const int w = va_arg(va, int); + if(w < 0) { + flags |= FLAGS_LEFT; // reverse padding + width = (unsigned int) - w; + } + else { + width = (unsigned int)w; + } + format++; + } + + // evaluate precision field + precision = 0U; + if(*format == '.') { + flags |= FLAGS_PRECISION; + format++; + if(_is_digit(*format)) { + precision = _atoi(&format); + } + else if(*format == '*') { + const int prec = (int)va_arg(va, int); + precision = prec > 0 ? (unsigned int)prec : 0U; + format++; + } + } + + // evaluate length field + switch(*format) { + case 'l' : + flags |= FLAGS_LONG; + format++; + if(*format == 'l') { + flags |= FLAGS_LONG_LONG; + format++; + } + break; + case 'h' : + flags |= FLAGS_SHORT; + format++; + if(*format == 'h') { + flags |= FLAGS_CHAR; + format++; + } + break; +#if defined(PRINTF_SUPPORT_PTRDIFF_T) + case 't' : + flags |= (sizeof(ptrdiff_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); + format++; + break; +#endif + case 'j' : + flags |= (sizeof(intmax_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); + format++; + break; + case 'z' : + flags |= (sizeof(size_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); + format++; + break; + default : + break; + } + + // evaluate specifier + switch(*format) { + case 'd' : + case 'i' : + case 'u' : + case 'x' : + case 'X' : + case 'p' : + case 'P' : + case 'o' : + case 'b' : { + // set the base + unsigned int base; + if(*format == 'x' || *format == 'X') { + base = 16U; + } + else if(*format == 'p' || *format == 'P') { + base = 16U; + flags |= FLAGS_HASH; // always hash for pointer format +#if defined(PRINTF_SUPPORT_LONG_LONG) + if(sizeof(uintptr_t) == sizeof(long long)) + flags |= FLAGS_LONG_LONG; + else +#endif + flags |= FLAGS_LONG; + + if(*(format + 1) == 'V') + format++; + } + else if(*format == 'o') { + base = 8U; + } + else if(*format == 'b') { + base = 2U; + } + else { + base = 10U; + flags &= ~FLAGS_HASH; // no hash for dec format + } + // uppercase + if(*format == 'X' || *format == 'P') { + flags |= FLAGS_UPPERCASE; + } + + // no plus or space flag for u, x, X, o, b + if((*format != 'i') && (*format != 'd')) { + flags &= ~(FLAGS_PLUS | FLAGS_SPACE); + } + + // ignore '0' flag when precision is given + if(flags & FLAGS_PRECISION) { + flags &= ~FLAGS_ZEROPAD; + } + + // convert the integer + if((*format == 'i') || (*format == 'd')) { + // signed + if(flags & FLAGS_LONG_LONG) { +#if defined(PRINTF_SUPPORT_LONG_LONG) + const long long value = va_arg(va, long long); + idx = _ntoa_long_long(out, buffer, idx, maxlen, (unsigned long long)(value > 0 ? value : 0 - value), value < 0, base, + precision, width, flags); +#endif + } + else if(flags & FLAGS_LONG) { + const long value = va_arg(va, long); + idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned long)(value > 0 ? value : 0 - value), value < 0, base, precision, + width, flags); + } + else { + const int value = (flags & FLAGS_CHAR) ? (char)va_arg(va, int) : (flags & FLAGS_SHORT) ? (short int)va_arg(va, + int) : va_arg(va, int); + idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned int)(value > 0 ? value : 0 - value), value < 0, base, precision, + width, flags); + } + } + else if(*format == 'V') { + lv_vaformat_t * vaf = va_arg(va, lv_vaformat_t *); + va_list copy; + + va_copy(copy, *vaf->va); + idx += _vsnprintf(out, buffer + idx, maxlen - idx, vaf->fmt, copy); + va_end(copy); + } + else { + // unsigned + if(flags & FLAGS_LONG_LONG) { +#if defined(PRINTF_SUPPORT_LONG_LONG) + idx = _ntoa_long_long(out, buffer, idx, maxlen, va_arg(va, unsigned long long), false, base, precision, width, flags); +#endif + } + else if(flags & FLAGS_LONG) { + idx = _ntoa_long(out, buffer, idx, maxlen, va_arg(va, unsigned long), false, base, precision, width, flags); + } + else { + const unsigned int value = (flags & FLAGS_CHAR) ? (unsigned char)va_arg(va, + unsigned int) : (flags & FLAGS_SHORT) ? (unsigned short int)va_arg(va, unsigned int) : va_arg(va, unsigned int); + idx = _ntoa_long(out, buffer, idx, maxlen, value, false, base, precision, width, flags); + } + } + format++; + break; + } +#if defined(PRINTF_SUPPORT_FLOAT) + case 'f' : + case 'F' : + if(*format == 'F') flags |= FLAGS_UPPERCASE; + idx = _ftoa(out, buffer, idx, maxlen, va_arg(va, double), precision, width, flags); + format++; + break; +#if defined(PRINTF_SUPPORT_EXPONENTIAL) + case 'e': + case 'E': + case 'g': + case 'G': + if((*format == 'g') || (*format == 'G')) flags |= FLAGS_ADAPT_EXP; + if((*format == 'E') || (*format == 'G')) flags |= FLAGS_UPPERCASE; + idx = _etoa(out, buffer, idx, maxlen, va_arg(va, double), precision, width, flags); + format++; + break; +#endif // PRINTF_SUPPORT_EXPONENTIAL +#endif // PRINTF_SUPPORT_FLOAT + case 'c' : { + unsigned int l = 1U; + // pre padding + if(!(flags & FLAGS_LEFT)) { + while(l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + // char output + out((char)va_arg(va, int), buffer, idx++, maxlen); + // post padding + if(flags & FLAGS_LEFT) { + while(l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + format++; + break; + } + + case 's' : { + const char * p = va_arg(va, char *); + unsigned int l = _strnlen_s(p, precision ? precision : (size_t) -1); + // pre padding + if(flags & FLAGS_PRECISION) { + l = (l < precision ? l : precision); + } + if(!(flags & FLAGS_LEFT)) { + while(l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + // string output + while((*p != 0) && (!(flags & FLAGS_PRECISION) || precision--)) { + out(*(p++), buffer, idx++, maxlen); + } + // post padding + if(flags & FLAGS_LEFT) { + while(l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + format++; + break; + } + + case '%' : + out('%', buffer, idx++, maxlen); + format++; + break; + + default : + out(*format, buffer, idx++, maxlen); + format++; + break; + } + } + + // termination + out((char)0, buffer, idx < maxlen ? idx : maxlen - 1U, maxlen); + + // return written chars without terminating \0 + return (int)idx; +} + +/////////////////////////////////////////////////////////////////////////////// + +int lv_snprintf(char * buffer, size_t count, const char * format, ...) +{ + va_list va; + va_start(va, format); + const int ret = _vsnprintf(_out_buffer, buffer, count, format, va); + va_end(va); + return ret; +} + +int lv_vsnprintf(char * buffer, size_t count, const char * format, va_list va) +{ + return _vsnprintf(_out_buffer, buffer, count, format, va); +} + +#endif /*LV_SPRINTF_CUSTOM*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_printf.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_printf.h new file mode 100644 index 0000000..4cbbd84 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_printf.h @@ -0,0 +1,92 @@ +/////////////////////////////////////////////////////////////////////////////// +// \author (c) Marco Paland (info@paland.com) +// 2014-2019, PALANDesign Hannover, Germany +// +// \license The MIT License (MIT) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// \brief Tiny printf, sprintf and snprintf implementation, optimized for speed on +// embedded systems with a very limited resources. +// Use this instead of bloated standard/newlib printf. +// These routines are thread safe and reentrant. +// +/////////////////////////////////////////////////////////////////////////////// + +/*Original repository: https://github.com/mpaland/printf*/ + +#ifndef _LV_PRINTF_H_ +#define _LV_PRINTF_H_ + +#if defined(__has_include) + #if __has_include() + #include + /* platform-specific printf format for int32_t, usually "d" or "ld" */ + #define LV_PRId32 PRId32 + #define LV_PRIu32 PRIu32 + #else + #define LV_PRId32 "d" + #define LV_PRIu32 "u" + #endif +#else + /* hope this is correct for ports without __has_include or without inttypes.h */ + #define LV_PRId32 "d" + #define LV_PRIu32 "u" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../lv_conf_internal.h" + +#if LV_SPRINTF_CUSTOM == 0 + +#include +#include + +#include "lv_types.h" + +typedef struct { + const char * fmt; + va_list * va; +} lv_vaformat_t; + +/** + * Tiny snprintf/vsnprintf implementation + * \param buffer A pointer to the buffer where to store the formatted string + * \param count The maximum number of characters to store in the buffer, including a terminating null character + * \param format A string that specifies the format of the output + * \param va A value identifying a variable arguments list + * \return The number of characters that COULD have been written into the buffer, not counting the terminating + * null character. A value equal or larger than count indicates truncation. Only when the returned value + * is non-negative and less than count, the string has been completely written. + */ +int lv_snprintf(char * buffer, size_t count, const char * format, ...) LV_FORMAT_ATTRIBUTE(3, 4); +int lv_vsnprintf(char * buffer, size_t count, const char * format, va_list va) LV_FORMAT_ATTRIBUTE(3, 0); + +#else +#include LV_SPRINTF_INCLUDE +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif // _LV_PRINTF_H_ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_style.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_style.c new file mode 100644 index 0000000..419c29e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_style.c @@ -0,0 +1,485 @@ +/** + * @file lv_style.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_style.h" +#include "../misc/lv_gc.h" +#include "../misc/lv_mem.h" +#include "lv_assert.h" +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_style_set_prop_internal(lv_style_t * style, lv_style_prop_t prop_and_meta, lv_style_value_t value, + void (*value_adjustment_helper)(lv_style_prop_t, lv_style_value_t, uint16_t *, lv_style_value_t *)); +static void lv_style_set_prop_helper(lv_style_prop_t prop, lv_style_value_t value, uint16_t * prop_storage, + lv_style_value_t * value_storage); +static void lv_style_set_prop_meta_helper(lv_style_prop_t prop, lv_style_value_t value, uint16_t * prop_storage, + lv_style_value_t * value_storage); + +/********************** + * GLOBAL VARIABLES + **********************/ + +const uint8_t _lv_style_builtin_prop_flag_lookup_table[_LV_STYLE_NUM_BUILT_IN_PROPS] = { + [LV_STYLE_WIDTH] = LV_STYLE_PROP_LAYOUT_REFR, + [LV_STYLE_MIN_WIDTH] = LV_STYLE_PROP_LAYOUT_REFR, + [LV_STYLE_MAX_WIDTH] = LV_STYLE_PROP_LAYOUT_REFR, + [LV_STYLE_HEIGHT] = LV_STYLE_PROP_LAYOUT_REFR, + [LV_STYLE_MIN_HEIGHT] = LV_STYLE_PROP_LAYOUT_REFR, + [LV_STYLE_MAX_HEIGHT] = LV_STYLE_PROP_LAYOUT_REFR, + [LV_STYLE_X] = LV_STYLE_PROP_LAYOUT_REFR, + [LV_STYLE_Y] = LV_STYLE_PROP_LAYOUT_REFR, + [LV_STYLE_ALIGN] = LV_STYLE_PROP_LAYOUT_REFR, + [LV_STYLE_TRANSFORM_WIDTH] = LV_STYLE_PROP_EXT_DRAW, + [LV_STYLE_TRANSFORM_HEIGHT] = LV_STYLE_PROP_EXT_DRAW, + [LV_STYLE_TRANSLATE_X] = LV_STYLE_PROP_LAYOUT_REFR | LV_STYLE_PROP_PARENT_LAYOUT_REFR, + [LV_STYLE_TRANSLATE_Y] = LV_STYLE_PROP_LAYOUT_REFR | LV_STYLE_PROP_PARENT_LAYOUT_REFR, + [LV_STYLE_TRANSFORM_ZOOM] = LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYER_REFR, + [LV_STYLE_TRANSFORM_ANGLE] = LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYER_REFR, + + [LV_STYLE_PAD_TOP] = LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYOUT_REFR, + [LV_STYLE_PAD_BOTTOM] = LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYOUT_REFR, + [LV_STYLE_PAD_LEFT] = LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYOUT_REFR, + [LV_STYLE_PAD_RIGHT] = LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYOUT_REFR, + [LV_STYLE_PAD_ROW] = LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYOUT_REFR, + [LV_STYLE_PAD_COLUMN] = LV_STYLE_PROP_EXT_DRAW | LV_STYLE_PROP_LAYOUT_REFR, + + [LV_STYLE_BG_COLOR] = 0, + [LV_STYLE_BG_OPA] = 0, + [LV_STYLE_BG_GRAD_COLOR] = 0, + [LV_STYLE_BG_GRAD_DIR] = 0, + [LV_STYLE_BG_MAIN_STOP] = 0, + [LV_STYLE_BG_GRAD_STOP] = 0, + [LV_STYLE_BG_GRAD] = 0, + [LV_STYLE_BG_DITHER_MODE] = 0, + + [LV_STYLE_BG_IMG_SRC] = LV_STYLE_PROP_EXT_DRAW, + [LV_STYLE_BG_IMG_OPA] = 0, + [LV_STYLE_BG_IMG_RECOLOR] = 0, + [LV_STYLE_BG_IMG_RECOLOR_OPA] = 0, + [LV_STYLE_BG_IMG_TILED] = 0, + + [LV_STYLE_BORDER_COLOR] = 0, + [LV_STYLE_BORDER_OPA] = 0, + [LV_STYLE_BORDER_WIDTH] = LV_STYLE_PROP_LAYOUT_REFR, + [LV_STYLE_BORDER_SIDE] = 0, + [LV_STYLE_BORDER_POST] = 0, + + [LV_STYLE_OUTLINE_WIDTH] = LV_STYLE_PROP_EXT_DRAW, + [LV_STYLE_OUTLINE_COLOR] = 0, + [LV_STYLE_OUTLINE_OPA] = LV_STYLE_PROP_EXT_DRAW, + [LV_STYLE_OUTLINE_PAD] = LV_STYLE_PROP_EXT_DRAW, + + [LV_STYLE_SHADOW_WIDTH] = LV_STYLE_PROP_EXT_DRAW, + [LV_STYLE_SHADOW_OFS_X] = LV_STYLE_PROP_EXT_DRAW, + [LV_STYLE_SHADOW_OFS_Y] = LV_STYLE_PROP_EXT_DRAW, + [LV_STYLE_SHADOW_SPREAD] = LV_STYLE_PROP_EXT_DRAW, + [LV_STYLE_SHADOW_COLOR] = 0, + [LV_STYLE_SHADOW_OPA] = LV_STYLE_PROP_EXT_DRAW, + + [LV_STYLE_IMG_OPA] = 0, + [LV_STYLE_IMG_RECOLOR] = 0, + [LV_STYLE_IMG_RECOLOR_OPA] = 0, + + [LV_STYLE_LINE_WIDTH] = LV_STYLE_PROP_EXT_DRAW, + [LV_STYLE_LINE_DASH_WIDTH] = 0, + [LV_STYLE_LINE_DASH_GAP] = 0, + [LV_STYLE_LINE_ROUNDED] = 0, + [LV_STYLE_LINE_COLOR] = 0, + [LV_STYLE_LINE_OPA] = 0, + + [LV_STYLE_ARC_WIDTH] = LV_STYLE_PROP_EXT_DRAW, + [LV_STYLE_ARC_ROUNDED] = 0, + [LV_STYLE_ARC_COLOR] = 0, + [LV_STYLE_ARC_OPA] = 0, + [LV_STYLE_ARC_IMG_SRC] = 0, + + [LV_STYLE_TEXT_COLOR] = LV_STYLE_PROP_INHERIT, + [LV_STYLE_TEXT_OPA] = LV_STYLE_PROP_INHERIT, + [LV_STYLE_TEXT_FONT] = LV_STYLE_PROP_INHERIT | LV_STYLE_PROP_LAYOUT_REFR, + [LV_STYLE_TEXT_LETTER_SPACE] = LV_STYLE_PROP_INHERIT | LV_STYLE_PROP_LAYOUT_REFR, + [LV_STYLE_TEXT_LINE_SPACE] = LV_STYLE_PROP_INHERIT | LV_STYLE_PROP_LAYOUT_REFR, + [LV_STYLE_TEXT_DECOR] = LV_STYLE_PROP_INHERIT, + [LV_STYLE_TEXT_ALIGN] = LV_STYLE_PROP_INHERIT | LV_STYLE_PROP_LAYOUT_REFR, + + [LV_STYLE_RADIUS] = 0, + [LV_STYLE_CLIP_CORNER] = 0, + [LV_STYLE_OPA] = LV_STYLE_PROP_LAYER_REFR, + [LV_STYLE_COLOR_FILTER_DSC] = LV_STYLE_PROP_INHERIT, + [LV_STYLE_COLOR_FILTER_OPA] = LV_STYLE_PROP_INHERIT, + [LV_STYLE_ANIM_TIME] = 0, + [LV_STYLE_ANIM_SPEED] = 0, + [LV_STYLE_TRANSITION] = 0, + [LV_STYLE_BLEND_MODE] = LV_STYLE_PROP_LAYER_REFR, + [LV_STYLE_LAYOUT] = LV_STYLE_PROP_LAYOUT_REFR, + [LV_STYLE_BASE_DIR] = LV_STYLE_PROP_INHERIT | LV_STYLE_PROP_LAYOUT_REFR, +}; + +uint32_t _lv_style_custom_prop_flag_lookup_table_size = 0; + +/********************** + * STATIC VARIABLES + **********************/ + +static uint16_t last_custom_prop_id = (uint16_t)_LV_STYLE_LAST_BUILT_IN_PROP; +static const lv_style_value_t null_style_value = { .num = 0 }; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_style_init(lv_style_t * style) +{ +#if LV_USE_ASSERT_STYLE + if(style->sentinel == LV_STYLE_SENTINEL_VALUE && style->prop_cnt > 1) { + LV_LOG_WARN("Style might be already inited. (Potential memory leak)"); + } +#endif + + lv_memset_00(style, sizeof(lv_style_t)); +#if LV_USE_ASSERT_STYLE + style->sentinel = LV_STYLE_SENTINEL_VALUE; +#endif +} + +void lv_style_reset(lv_style_t * style) +{ + LV_ASSERT_STYLE(style); + + if(style->prop1 == LV_STYLE_PROP_ANY) { + LV_LOG_ERROR("Cannot reset const style"); + return; + } + + if(style->prop_cnt > 1) lv_mem_free(style->v_p.values_and_props); + lv_memset_00(style, sizeof(lv_style_t)); +#if LV_USE_ASSERT_STYLE + style->sentinel = LV_STYLE_SENTINEL_VALUE; +#endif +} + +lv_style_prop_t lv_style_register_prop(uint8_t flag) +{ + if(LV_GC_ROOT(_lv_style_custom_prop_flag_lookup_table) == NULL) { + _lv_style_custom_prop_flag_lookup_table_size = 0; + last_custom_prop_id = (uint16_t)_LV_STYLE_LAST_BUILT_IN_PROP; + } + + if(((last_custom_prop_id + 1) & LV_STYLE_PROP_META_MASK) != 0) { + LV_LOG_ERROR("No more custom property IDs available"); + return LV_STYLE_PROP_INV; + } + + /* + * Allocate the lookup table if it's not yet available. + */ + size_t required_size = (last_custom_prop_id + 1 - _LV_STYLE_LAST_BUILT_IN_PROP); + if(_lv_style_custom_prop_flag_lookup_table_size < required_size) { + /* Round required_size up to the nearest 32-byte value */ + required_size = (required_size + 31) & ~31; + LV_ASSERT_MSG(required_size > 0, "required size has become 0?"); + uint8_t * old_p = LV_GC_ROOT(_lv_style_custom_prop_flag_lookup_table); + uint8_t * new_p = lv_mem_realloc(old_p, required_size * sizeof(uint8_t)); + if(new_p == NULL) { + LV_LOG_ERROR("Unable to allocate space for custom property lookup table"); + return LV_STYLE_PROP_INV; + } + LV_GC_ROOT(_lv_style_custom_prop_flag_lookup_table) = new_p; + _lv_style_custom_prop_flag_lookup_table_size = required_size; + } + last_custom_prop_id++; + /* This should never happen - we should bail out above */ + LV_ASSERT_NULL(LV_GC_ROOT(_lv_style_custom_prop_flag_lookup_table)); + LV_GC_ROOT(_lv_style_custom_prop_flag_lookup_table)[last_custom_prop_id - _LV_STYLE_NUM_BUILT_IN_PROPS] = flag; + return last_custom_prop_id; +} + +lv_style_prop_t lv_style_get_num_custom_props(void) +{ + return last_custom_prop_id - _LV_STYLE_LAST_BUILT_IN_PROP; +} + +bool lv_style_remove_prop(lv_style_t * style, lv_style_prop_t prop) +{ + LV_ASSERT_STYLE(style); + + if(style->prop1 == LV_STYLE_PROP_ANY) { + LV_LOG_ERROR("Cannot remove prop from const style"); + return false; + } + + if(style->prop_cnt == 0) return false; + + if(style->prop_cnt == 1) { + if(LV_STYLE_PROP_ID_MASK(style->prop1) == prop) { + style->prop1 = LV_STYLE_PROP_INV; + style->prop_cnt = 0; + return true; + } + return false; + } + + uint8_t * tmp = style->v_p.values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + uint16_t * old_props = (uint16_t *)tmp; + uint32_t i; + for(i = 0; i < style->prop_cnt; i++) { + if(LV_STYLE_PROP_ID_MASK(old_props[i]) == prop) { + lv_style_value_t * old_values = (lv_style_value_t *)style->v_p.values_and_props; + + if(style->prop_cnt == 2) { + style->prop_cnt = 1; + style->prop1 = i == 0 ? old_props[1] : old_props[0]; + style->v_p.value1 = i == 0 ? old_values[1] : old_values[0]; + } + else { + size_t size = (style->prop_cnt - 1) * (sizeof(lv_style_value_t) + sizeof(uint16_t)); + uint8_t * new_values_and_props = lv_mem_alloc(size); + if(new_values_and_props == NULL) return false; + style->v_p.values_and_props = new_values_and_props; + style->prop_cnt--; + + tmp = new_values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + uint16_t * new_props = (uint16_t *)tmp; + lv_style_value_t * new_values = (lv_style_value_t *)new_values_and_props; + + uint32_t j; + for(i = j = 0; j <= style->prop_cnt; + j++) { /*<=: because prop_cnt already reduced but all the old props. needs to be checked.*/ + if(old_props[j] != prop) { + new_values[i] = old_values[j]; + new_props[i++] = old_props[j]; + } + } + } + + lv_mem_free(old_values); + return true; + } + } + + return false; +} + +void lv_style_set_prop(lv_style_t * style, lv_style_prop_t prop, lv_style_value_t value) +{ + lv_style_set_prop_internal(style, prop, value, lv_style_set_prop_helper); +} + +void lv_style_set_prop_meta(lv_style_t * style, lv_style_prop_t prop, uint16_t meta) +{ + lv_style_set_prop_internal(style, prop | meta, null_style_value, lv_style_set_prop_meta_helper); +} + +lv_style_res_t lv_style_get_prop(const lv_style_t * style, lv_style_prop_t prop, lv_style_value_t * value) +{ + return lv_style_get_prop_inlined(style, prop, value); +} + +void lv_style_transition_dsc_init(lv_style_transition_dsc_t * tr, const lv_style_prop_t props[], + lv_anim_path_cb_t path_cb, uint32_t time, uint32_t delay, void * user_data) +{ + lv_memset_00(tr, sizeof(lv_style_transition_dsc_t)); + tr->props = props; + tr->path_xcb = path_cb == NULL ? lv_anim_path_linear : path_cb; + tr->time = time; + tr->delay = delay; +#if LV_USE_USER_DATA + tr->user_data = user_data; +#else + LV_UNUSED(user_data); +#endif +} + +lv_style_value_t lv_style_prop_get_default(lv_style_prop_t prop) +{ + lv_style_value_t value; + switch(prop) { + case LV_STYLE_TRANSFORM_ZOOM: + value.num = LV_IMG_ZOOM_NONE; + break; + case LV_STYLE_BG_COLOR: + value.color = lv_color_white(); + break; + case LV_STYLE_BG_GRAD_COLOR: + case LV_STYLE_BORDER_COLOR: + case LV_STYLE_SHADOW_COLOR: + case LV_STYLE_OUTLINE_COLOR: + case LV_STYLE_ARC_COLOR: + case LV_STYLE_LINE_COLOR: + case LV_STYLE_TEXT_COLOR: + case LV_STYLE_IMG_RECOLOR: + value.color = lv_color_black(); + break; + case LV_STYLE_OPA: + case LV_STYLE_BORDER_OPA: + case LV_STYLE_TEXT_OPA: + case LV_STYLE_IMG_OPA: + case LV_STYLE_BG_IMG_OPA: + case LV_STYLE_OUTLINE_OPA: + case LV_STYLE_SHADOW_OPA: + case LV_STYLE_LINE_OPA: + case LV_STYLE_ARC_OPA: + value.num = LV_OPA_COVER; + break; + case LV_STYLE_BG_GRAD_STOP: + value.num = 255; + break; + case LV_STYLE_BORDER_SIDE: + value.num = LV_BORDER_SIDE_FULL; + break; + case LV_STYLE_TEXT_FONT: + value.ptr = LV_FONT_DEFAULT; + break; + case LV_STYLE_MAX_WIDTH: + case LV_STYLE_MAX_HEIGHT: + value.num = LV_COORD_MAX; + break; + default: + value.ptr = NULL; + value.num = 0; + break; + } + + return value; +} + +bool lv_style_is_empty(const lv_style_t * style) +{ + LV_ASSERT_STYLE(style); + + return style->prop_cnt == 0 ? true : false; +} + +uint8_t _lv_style_get_prop_group(lv_style_prop_t prop) +{ + uint16_t group = (prop & 0x1FF) >> 4; + if(group > 7) group = 7; /*The MSB marks all the custom properties*/ + return (uint8_t)group; +} + +uint8_t _lv_style_prop_lookup_flags(lv_style_prop_t prop) +{ + extern const uint8_t _lv_style_builtin_prop_flag_lookup_table[]; + extern uint32_t _lv_style_custom_prop_flag_lookup_table_size; + if(prop == LV_STYLE_PROP_ANY) return LV_STYLE_PROP_ALL; /*Any prop can have any flags*/ + if(prop == LV_STYLE_PROP_INV) return 0; + + if(prop < _LV_STYLE_NUM_BUILT_IN_PROPS) + return _lv_style_builtin_prop_flag_lookup_table[prop]; + prop -= _LV_STYLE_NUM_BUILT_IN_PROPS; + if(LV_GC_ROOT(_lv_style_custom_prop_flag_lookup_table) != NULL && prop < _lv_style_custom_prop_flag_lookup_table_size) + return LV_GC_ROOT(_lv_style_custom_prop_flag_lookup_table)[prop]; + return 0; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_style_set_prop_helper(lv_style_prop_t prop, lv_style_value_t value, uint16_t * prop_storage, + lv_style_value_t * value_storage) +{ + *prop_storage = prop; + *value_storage = value; +} + +static void lv_style_set_prop_meta_helper(lv_style_prop_t prop, lv_style_value_t value, uint16_t * prop_storage, + lv_style_value_t * value_storage) +{ + LV_UNUSED(value); + LV_UNUSED(value_storage); + *prop_storage = prop; /* meta is OR-ed into the prop ID already */ +} + +static void lv_style_set_prop_internal(lv_style_t * style, lv_style_prop_t prop_and_meta, lv_style_value_t value, + void (*value_adjustment_helper)(lv_style_prop_t, lv_style_value_t, uint16_t *, lv_style_value_t *)) +{ + LV_ASSERT_STYLE(style); + + if(style->prop1 == LV_STYLE_PROP_ANY) { + LV_LOG_ERROR("Cannot set property of constant style"); + return; + } + + lv_style_prop_t prop_id = LV_STYLE_PROP_ID_MASK(prop_and_meta); + + if(style->prop_cnt > 1) { + uint8_t * tmp = style->v_p.values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + uint16_t * props = (uint16_t *)tmp; + int32_t i; + for(i = style->prop_cnt - 1; i >= 0; i--) { + if(LV_STYLE_PROP_ID_MASK(props[i]) == prop_id) { + lv_style_value_t * values = (lv_style_value_t *)style->v_p.values_and_props; + value_adjustment_helper(prop_and_meta, value, &props[i], &values[i]); + return; + } + } + + size_t size = (style->prop_cnt + 1) * (sizeof(lv_style_value_t) + sizeof(uint16_t)); + uint8_t * values_and_props = lv_mem_realloc(style->v_p.values_and_props, size); + if(values_and_props == NULL) return; + style->v_p.values_and_props = values_and_props; + + tmp = values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + props = (uint16_t *)tmp; + /*Shift all props to make place for the value before them*/ + for(i = style->prop_cnt - 1; i >= 0; i--) { + props[i + sizeof(lv_style_value_t) / sizeof(uint16_t)] = props[i]; + } + style->prop_cnt++; + + /*Go to the new position wit the props*/ + tmp = values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + props = (uint16_t *)tmp; + lv_style_value_t * values = (lv_style_value_t *)values_and_props; + + /*Set the new property and value*/ + value_adjustment_helper(prop_and_meta, value, &props[style->prop_cnt - 1], &values[style->prop_cnt - 1]); + } + else if(style->prop_cnt == 1) { + if(LV_STYLE_PROP_ID_MASK(style->prop1) == prop_id) { + value_adjustment_helper(prop_and_meta, value, &style->prop1, &style->v_p.value1); + return; + } + size_t size = (style->prop_cnt + 1) * (sizeof(lv_style_value_t) + sizeof(uint16_t)); + uint8_t * values_and_props = lv_mem_alloc(size); + if(values_and_props == NULL) return; + lv_style_value_t value_tmp = style->v_p.value1; + style->v_p.values_and_props = values_and_props; + style->prop_cnt++; + + uint8_t * tmp = values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + uint16_t * props = (uint16_t *)tmp; + lv_style_value_t * values = (lv_style_value_t *)values_and_props; + props[0] = style->prop1; + values[0] = value_tmp; + value_adjustment_helper(prop_and_meta, value, &props[1], &values[1]); + } + else { + style->prop_cnt = 1; + value_adjustment_helper(prop_and_meta, value, &style->prop1, &style->v_p.value1); + } + + uint8_t group = _lv_style_get_prop_group(prop_id); + style->has_group |= 1 << group; +} + diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_style.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_style.h new file mode 100644 index 0000000..1792dae --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_style.h @@ -0,0 +1,597 @@ +/** + * @file lv_style.h + * + */ + +#ifndef LV_STYLE_H +#define LV_STYLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include +#include "../font/lv_font.h" +#include "lv_color.h" +#include "lv_area.h" +#include "lv_anim.h" +#include "lv_txt.h" +#include "lv_types.h" +#include "lv_assert.h" +#include "lv_bidi.h" + +/********************* + * DEFINES + *********************/ + +#define LV_STYLE_SENTINEL_VALUE 0xAABBCCDD + +/** + * Flags for style behavior + * + * The rest of the flags will have _FLAG added to their name in v9. + */ +#define LV_STYLE_PROP_FLAG_NONE (0) +#define LV_STYLE_PROP_INHERIT (1 << 0) /*Inherited*/ +#define LV_STYLE_PROP_EXT_DRAW (1 << 1) /*Requires ext. draw size update when changed*/ +#define LV_STYLE_PROP_LAYOUT_REFR (1 << 2) /*Requires layout update when changed*/ +#define LV_STYLE_PROP_PARENT_LAYOUT_REFR (1 << 3) /*Requires layout update on parent when changed*/ +#define LV_STYLE_PROP_LAYER_REFR (1 << 4) /*Affects layer handling*/ +#define LV_STYLE_PROP_ALL (0x1F) /*Indicating all flags*/ + +/** + * Other constants + */ +#define LV_IMG_ZOOM_NONE 256 /*Value for not zooming the image*/ +LV_EXPORT_CONST_INT(LV_IMG_ZOOM_NONE); + +// *INDENT-OFF* +#if LV_USE_ASSERT_STYLE +#define LV_STYLE_CONST_INIT(var_name, prop_array) \ + const lv_style_t var_name = { \ + .sentinel = LV_STYLE_SENTINEL_VALUE, \ + .v_p = { .const_props = prop_array }, \ + .has_group = 0xFF, \ + .prop1 = LV_STYLE_PROP_ANY, \ + .prop_cnt = (sizeof(prop_array) / sizeof((prop_array)[0])), \ + } +#else +#define LV_STYLE_CONST_INIT(var_name, prop_array) \ + const lv_style_t var_name = { \ + .v_p = { .const_props = prop_array }, \ + .has_group = 0xFF, \ + .prop1 = LV_STYLE_PROP_ANY, \ + .prop_cnt = (sizeof(prop_array) / sizeof((prop_array)[0])), \ + } +#endif +// *INDENT-ON* + +/** On simple system, don't waste resources on gradients */ +#if !defined(LV_DRAW_COMPLEX) || !defined(LV_GRADIENT_MAX_STOPS) +#define LV_GRADIENT_MAX_STOPS 2 +#endif + +#define LV_STYLE_PROP_META_INHERIT 0x8000 +#define LV_STYLE_PROP_META_INITIAL 0x4000 +#define LV_STYLE_PROP_META_MASK (LV_STYLE_PROP_META_INHERIT | LV_STYLE_PROP_META_INITIAL) + +#define LV_STYLE_PROP_ID_MASK(prop) ((lv_style_prop_t)((prop) & ~LV_STYLE_PROP_META_MASK)) + +/********************** + * TYPEDEFS + **********************/ + +/** + * Possible options how to blend opaque drawings + */ +enum { + LV_BLEND_MODE_NORMAL, /**< Simply mix according to the opacity value*/ + LV_BLEND_MODE_ADDITIVE, /**< Add the respective color channels*/ + LV_BLEND_MODE_SUBTRACTIVE,/**< Subtract the foreground from the background*/ + LV_BLEND_MODE_MULTIPLY, /**< Multiply the foreground and background*/ + LV_BLEND_MODE_REPLACE, /**< Replace background with foreground in the area*/ +}; + +typedef uint8_t lv_blend_mode_t; + +/** + * Some options to apply decorations on texts. + * 'OR'ed values can be used. + */ +enum { + LV_TEXT_DECOR_NONE = 0x00, + LV_TEXT_DECOR_UNDERLINE = 0x01, + LV_TEXT_DECOR_STRIKETHROUGH = 0x02, +}; + +typedef uint8_t lv_text_decor_t; + +/** + * Selects on which sides border should be drawn + * 'OR'ed values can be used. + */ +enum { + LV_BORDER_SIDE_NONE = 0x00, + LV_BORDER_SIDE_BOTTOM = 0x01, + LV_BORDER_SIDE_TOP = 0x02, + LV_BORDER_SIDE_LEFT = 0x04, + LV_BORDER_SIDE_RIGHT = 0x08, + LV_BORDER_SIDE_FULL = 0x0F, + LV_BORDER_SIDE_INTERNAL = 0x10, /**< FOR matrix-like objects (e.g. Button matrix)*/ +}; +typedef uint8_t lv_border_side_t; + +/** + * The direction of the gradient. + */ +enum { + LV_GRAD_DIR_NONE, /**< No gradient (the `grad_color` property is ignored)*/ + LV_GRAD_DIR_VER, /**< Vertical (top to bottom) gradient*/ + LV_GRAD_DIR_HOR, /**< Horizontal (left to right) gradient*/ +}; + +typedef uint8_t lv_grad_dir_t; + +/** + * The dithering algorithm for the gradient + * Depends on LV_DITHER_GRADIENT + */ +enum { + LV_DITHER_NONE, /**< No dithering, colors are just quantized to the output resolution*/ + LV_DITHER_ORDERED, /**< Ordered dithering. Faster to compute and use less memory but lower quality*/ + LV_DITHER_ERR_DIFF, /**< Error diffusion mode. Slower to compute and use more memory but give highest dither quality*/ +}; + +typedef uint8_t lv_dither_mode_t; + +/** A gradient stop definition. + * This matches a color and a position in a virtual 0-255 scale. + */ +typedef struct { + lv_color_t color; /**< The stop color */ + uint8_t frac; /**< The stop position in 1/255 unit */ +} lv_gradient_stop_t; + +/** A descriptor of a gradient. */ +typedef struct { + lv_gradient_stop_t stops[LV_GRADIENT_MAX_STOPS]; /**< A gradient stop array */ + uint8_t stops_count; /**< The number of used stops in the array */ + lv_grad_dir_t dir : 3; /**< The gradient direction. + * Any of LV_GRAD_DIR_HOR, LV_GRAD_DIR_VER, LV_GRAD_DIR_NONE */ + lv_dither_mode_t dither : 3; /**< Whether to dither the gradient or not. + * Any of LV_DITHER_NONE, LV_DITHER_ORDERED, LV_DITHER_ERR_DIFF */ +} lv_grad_dsc_t; + +/** + * A common type to handle all the property types in the same way. + */ +typedef union { + int32_t num; /**< Number integer number (opacity, enums, booleans or "normal" numbers)*/ + const void * ptr; /**< Constant pointers (font, cone text, etc)*/ + lv_color_t color; /**< Colors*/ +} lv_style_value_t; + +/** + * Enumeration of all built in style properties + * + * Props are split into groups of 16. When adding a new prop to a group, ensure it does not overflow into the next one. + */ +typedef enum { + LV_STYLE_PROP_INV = 0, + + /*Group 0*/ + LV_STYLE_WIDTH = 1, + LV_STYLE_MIN_WIDTH = 2, + LV_STYLE_MAX_WIDTH = 3, + LV_STYLE_HEIGHT = 4, + LV_STYLE_MIN_HEIGHT = 5, + LV_STYLE_MAX_HEIGHT = 6, + LV_STYLE_X = 7, + LV_STYLE_Y = 8, + LV_STYLE_ALIGN = 9, + LV_STYLE_LAYOUT = 10, + LV_STYLE_RADIUS = 11, + + /*Group 1*/ + LV_STYLE_PAD_TOP = 16, + LV_STYLE_PAD_BOTTOM = 17, + LV_STYLE_PAD_LEFT = 18, + LV_STYLE_PAD_RIGHT = 19, + LV_STYLE_PAD_ROW = 20, + LV_STYLE_PAD_COLUMN = 21, + LV_STYLE_BASE_DIR = 22, + LV_STYLE_CLIP_CORNER = 23, + + /*Group 2*/ + LV_STYLE_BG_COLOR = 32, + LV_STYLE_BG_OPA = 33, + LV_STYLE_BG_GRAD_COLOR = 34, + LV_STYLE_BG_GRAD_DIR = 35, + LV_STYLE_BG_MAIN_STOP = 36, + LV_STYLE_BG_GRAD_STOP = 37, + LV_STYLE_BG_GRAD = 38, + LV_STYLE_BG_DITHER_MODE = 39, + LV_STYLE_BG_IMG_SRC = 40, + LV_STYLE_BG_IMG_OPA = 41, + LV_STYLE_BG_IMG_RECOLOR = 42, + LV_STYLE_BG_IMG_RECOLOR_OPA = 43, + LV_STYLE_BG_IMG_TILED = 44, + + /*Group 3*/ + LV_STYLE_BORDER_COLOR = 48, + LV_STYLE_BORDER_OPA = 49, + LV_STYLE_BORDER_WIDTH = 50, + LV_STYLE_BORDER_SIDE = 51, + LV_STYLE_BORDER_POST = 52, + LV_STYLE_OUTLINE_WIDTH = 53, + LV_STYLE_OUTLINE_COLOR = 54, + LV_STYLE_OUTLINE_OPA = 55, + LV_STYLE_OUTLINE_PAD = 56, + + /*Group 4*/ + LV_STYLE_SHADOW_WIDTH = 64, + LV_STYLE_SHADOW_OFS_X = 65, + LV_STYLE_SHADOW_OFS_Y = 66, + LV_STYLE_SHADOW_SPREAD = 67, + LV_STYLE_SHADOW_COLOR = 68, + LV_STYLE_SHADOW_OPA = 69, + LV_STYLE_IMG_OPA = 70, + LV_STYLE_IMG_RECOLOR = 71, + LV_STYLE_IMG_RECOLOR_OPA = 72, + LV_STYLE_LINE_WIDTH = 73, + LV_STYLE_LINE_DASH_WIDTH = 74, + LV_STYLE_LINE_DASH_GAP = 75, + LV_STYLE_LINE_ROUNDED = 76, + LV_STYLE_LINE_COLOR = 77, + LV_STYLE_LINE_OPA = 78, + + /*Group 5*/ + LV_STYLE_ARC_WIDTH = 80, + LV_STYLE_ARC_ROUNDED = 81, + LV_STYLE_ARC_COLOR = 82, + LV_STYLE_ARC_OPA = 83, + LV_STYLE_ARC_IMG_SRC = 84, + LV_STYLE_TEXT_COLOR = 85, + LV_STYLE_TEXT_OPA = 86, + LV_STYLE_TEXT_FONT = 87, + LV_STYLE_TEXT_LETTER_SPACE = 88, + LV_STYLE_TEXT_LINE_SPACE = 89, + LV_STYLE_TEXT_DECOR = 90, + LV_STYLE_TEXT_ALIGN = 91, + + /*Group 6*/ + LV_STYLE_OPA = 96, + LV_STYLE_COLOR_FILTER_DSC = 97, + LV_STYLE_COLOR_FILTER_OPA = 98, + LV_STYLE_ANIM = 99, + LV_STYLE_ANIM_TIME = 100, + LV_STYLE_ANIM_SPEED = 101, + LV_STYLE_TRANSITION = 102, + LV_STYLE_BLEND_MODE = 103, + LV_STYLE_TRANSFORM_WIDTH = 104, + LV_STYLE_TRANSFORM_HEIGHT = 105, + LV_STYLE_TRANSLATE_X = 106, + LV_STYLE_TRANSLATE_Y = 107, + LV_STYLE_TRANSFORM_ZOOM = 108, + LV_STYLE_TRANSFORM_ANGLE = 109, + LV_STYLE_TRANSFORM_PIVOT_X = 110, + LV_STYLE_TRANSFORM_PIVOT_Y = 111, + + _LV_STYLE_LAST_BUILT_IN_PROP = 111, + _LV_STYLE_NUM_BUILT_IN_PROPS = _LV_STYLE_LAST_BUILT_IN_PROP + 1, + + LV_STYLE_PROP_ANY = 0xFFFF, + _LV_STYLE_PROP_CONST = 0xFFFF /* magic value for const styles */ +} lv_style_prop_t; + +enum { + LV_STYLE_RES_NOT_FOUND, + LV_STYLE_RES_FOUND, + LV_STYLE_RES_INHERIT +}; + +typedef uint8_t lv_style_res_t; + +/** + * Descriptor for style transitions + */ +typedef struct { + const lv_style_prop_t * props; /**< An array with the properties to animate.*/ +#if LV_USE_USER_DATA + void * user_data; /**< A custom user data that will be passed to the animation's user_data */ +#endif + lv_anim_path_cb_t path_xcb; /**< A path for the animation.*/ + uint32_t time; /**< Duration of the transition in [ms]*/ + uint32_t delay; /**< Delay before the transition in [ms]*/ +} lv_style_transition_dsc_t; + +/** + * Descriptor of a constant style property. + */ +typedef struct { + lv_style_prop_t prop; + lv_style_value_t value; +} lv_style_const_prop_t; + +/** + * Descriptor of a style (a collection of properties and values). + */ +typedef struct { + +#if LV_USE_ASSERT_STYLE + uint32_t sentinel; +#endif + + /*If there is only one property store it directly. + *For more properties allocate an array*/ + union { + lv_style_value_t value1; + uint8_t * values_and_props; + const lv_style_const_prop_t * const_props; + } v_p; + + uint16_t prop1; + uint8_t has_group; + uint8_t prop_cnt; +} lv_style_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + + +/** + * Initialize a style + * @param style pointer to a style to initialize + * @note Do not call `lv_style_init` on styles that already have some properties + * because this function won't free the used memory, just sets a default state for the style. + * In other words be sure to initialize styles only once! + */ +void lv_style_init(lv_style_t * style); + +/** + * Clear all properties from a style and free all allocated memories. + * @param style pointer to a style + */ +void lv_style_reset(lv_style_t * style); + +/** + * Register a new style property for custom usage + * @return a new property ID, or LV_STYLE_PROP_INV if there are no more available. + * @example + * lv_style_prop_t MY_PROP; + * static inline void lv_style_set_my_prop(lv_style_t * style, lv_color_t value) { + * lv_style_value_t v = {.color = value}; lv_style_set_prop(style, MY_PROP, v); } + * + * ... + * MY_PROP = lv_style_register_prop(); + * ... + * lv_style_set_my_prop(&style1, lv_palette_main(LV_PALETTE_RED)); + */ +lv_style_prop_t lv_style_register_prop(uint8_t flag); + +/** + * Get the number of custom properties that have been registered thus far. + */ +lv_style_prop_t lv_style_get_num_custom_props(void); + +/** + * Remove a property from a style + * @param style pointer to a style + * @param prop a style property ORed with a state. + * @return true: the property was found and removed; false: the property wasn't found + */ +bool lv_style_remove_prop(lv_style_t * style, lv_style_prop_t prop); + +/** + * Set the value of property in a style. + * This function shouldn't be used directly by the user. + * Instead use `lv_style_set_()`. E.g. `lv_style_set_bg_color()` + * @param style pointer to style + * @param prop the ID of a property (e.g. `LV_STYLE_BG_COLOR`) + * @param value `lv_style_value_t` variable in which a field is set according to the type of `prop` + */ +void lv_style_set_prop(lv_style_t * style, lv_style_prop_t prop, lv_style_value_t value); + +/** + * Set a special meta state for a property in a style. + * This function shouldn't be used directly by the user. + * @param style pointer to style + * @param prop the ID of a property (e.g. `LV_STYLE_BG_COLOR`) + * @param meta the meta value to attach to the property in the style + */ +void lv_style_set_prop_meta(lv_style_t * style, lv_style_prop_t prop, uint16_t meta); + +/** + * Get the value of a property + * @param style pointer to a style + * @param prop the ID of a property + * @param value pointer to a `lv_style_value_t` variable to store the value + * @return LV_RES_INV: the property wasn't found in the style (`value` is unchanged) + * LV_RES_OK: the property was fond, and `value` is set accordingly + * @note For performance reasons there are no sanity check on `style` + */ +lv_style_res_t lv_style_get_prop(const lv_style_t * style, lv_style_prop_t prop, lv_style_value_t * value); + +/** + * Initialize a transition descriptor. + * @param tr pointer to a transition descriptor to initialize + * @param props an array with the properties to transition. The last element must be zero. + * @param path_cb an animation path (ease) callback. If `NULL` liner path will be used. + * @param time duration of the transition in [ms] + * @param delay delay before the transition in [ms] + * @param user_data any custom data that will be saved in the transition animation and will be available when `path_cb` is called + * @example + * const static lv_style_prop_t trans_props[] = { LV_STYLE_BG_OPA, LV_STYLE_BG_COLOR, 0 }; + * static lv_style_transition_dsc_t trans1; + * lv_style_transition_dsc_init(&trans1, trans_props, NULL, 300, 0, NULL); + */ +void lv_style_transition_dsc_init(lv_style_transition_dsc_t * tr, const lv_style_prop_t props[], + lv_anim_path_cb_t path_cb, uint32_t time, uint32_t delay, void * user_data); + +/** + * Get the default value of a property + * @param prop the ID of a property + * @return the default value + */ +lv_style_value_t lv_style_prop_get_default(lv_style_prop_t prop); + +/** + * Get the value of a property + * @param style pointer to a style + * @param prop the ID of a property + * @param value pointer to a `lv_style_value_t` variable to store the value + * @return LV_RES_INV: the property wasn't found in the style (`value` is unchanged) + * LV_RES_OK: the property was fond, and `value` is set accordingly + * @note For performance reasons there are no sanity check on `style` + * @note This function is the same as ::lv_style_get_prop but inlined. Use it only on performance critical places + */ +static inline lv_style_res_t lv_style_get_prop_inlined(const lv_style_t * style, lv_style_prop_t prop, + lv_style_value_t * value) +{ + if(style->prop1 == LV_STYLE_PROP_ANY) { + const lv_style_const_prop_t * const_prop; + uint32_t i; + for(i = 0; i < style->prop_cnt; i++) { + const_prop = style->v_p.const_props + i; + lv_style_prop_t prop_id = LV_STYLE_PROP_ID_MASK(const_prop->prop); + if(prop_id == prop) { + if(const_prop->prop & LV_STYLE_PROP_META_INHERIT) + return LV_STYLE_RES_INHERIT; + *value = (const_prop->prop & LV_STYLE_PROP_META_INITIAL) ? lv_style_prop_get_default(prop_id) : const_prop->value; + return LV_STYLE_RES_FOUND; + } + } + return LV_STYLE_RES_NOT_FOUND; + } + + if(style->prop_cnt == 0) return LV_STYLE_RES_NOT_FOUND; + + if(style->prop_cnt > 1) { + uint8_t * tmp = style->v_p.values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + uint16_t * props = (uint16_t *)tmp; + uint32_t i; + for(i = 0; i < style->prop_cnt; i++) { + lv_style_prop_t prop_id = LV_STYLE_PROP_ID_MASK(props[i]); + if(prop_id == prop) { + if(props[i] & LV_STYLE_PROP_META_INHERIT) + return LV_STYLE_RES_INHERIT; + if(props[i] & LV_STYLE_PROP_META_INITIAL) + *value = lv_style_prop_get_default(prop_id); + else { + lv_style_value_t * values = (lv_style_value_t *)style->v_p.values_and_props; + *value = values[i]; + } + return LV_STYLE_RES_FOUND; + } + } + } + else if(LV_STYLE_PROP_ID_MASK(style->prop1) == prop) { + if(style->prop1 & LV_STYLE_PROP_META_INHERIT) + return LV_STYLE_RES_INHERIT; + *value = (style->prop1 & LV_STYLE_PROP_META_INITIAL) ? lv_style_prop_get_default(LV_STYLE_PROP_ID_MASK( + style->prop1)) : style->v_p.value1; + return LV_STYLE_RES_FOUND; + } + return LV_STYLE_RES_NOT_FOUND; +} + +/** + * Checks if a style is empty (has no properties) + * @param style pointer to a style + * @return true if the style is empty + */ +bool lv_style_is_empty(const lv_style_t * style); + +/** + * Tell the group of a property. If the a property from a group is set in a style the (1 << group) bit of style->has_group is set. + * It allows early skipping the style if the property is not exists in the style at all. + * @param prop a style property + * @return the group [0..7] 7 means all the custom properties with index > 112 + */ +uint8_t _lv_style_get_prop_group(lv_style_prop_t prop); + +/** + * Get the flags of a built-in or custom property. + * + * @param prop a style property + * @return the flags of the property + */ +uint8_t _lv_style_prop_lookup_flags(lv_style_prop_t prop); + +#include "lv_style_gen.h" + +static inline void lv_style_set_size(lv_style_t * style, lv_coord_t value) +{ + lv_style_set_width(style, value); + lv_style_set_height(style, value); +} + +static inline void lv_style_set_pad_all(lv_style_t * style, lv_coord_t value) +{ + lv_style_set_pad_left(style, value); + lv_style_set_pad_right(style, value); + lv_style_set_pad_top(style, value); + lv_style_set_pad_bottom(style, value); +} + +static inline void lv_style_set_pad_hor(lv_style_t * style, lv_coord_t value) +{ + lv_style_set_pad_left(style, value); + lv_style_set_pad_right(style, value); +} + +static inline void lv_style_set_pad_ver(lv_style_t * style, lv_coord_t value) +{ + lv_style_set_pad_top(style, value); + lv_style_set_pad_bottom(style, value); +} + +static inline void lv_style_set_pad_gap(lv_style_t * style, lv_coord_t value) +{ + lv_style_set_pad_row(style, value); + lv_style_set_pad_column(style, value); +} + +/** + * @brief Check if the style property has a specified behavioral flag. + * + * Do not pass multiple flags to this function as backwards-compatibility is not guaranteed + * for that. + * + * @param prop Property ID + * @param flag Flag + * @return true if the flag is set for this property + */ +static inline bool lv_style_prop_has_flag(lv_style_prop_t prop, uint8_t flag) +{ + return _lv_style_prop_lookup_flags(prop) & flag; +} + +/************************* + * GLOBAL VARIABLES + *************************/ + +/********************** + * MACROS + **********************/ + +#if LV_USE_ASSERT_STYLE +# define LV_ASSERT_STYLE(style_p) \ + do { \ + LV_ASSERT_MSG(style_p != NULL, "The style is NULL"); \ + LV_ASSERT_MSG(style_p->sentinel == LV_STYLE_SENTINEL_VALUE, "Style is not initialized or corrupted"); \ + } while(0) +#else +# define LV_ASSERT_STYLE(p) do{}while(0) +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_STYLE_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_style_gen.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_style_gen.c new file mode 100644 index 0000000..13d8560 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_style_gen.c @@ -0,0 +1,673 @@ +#include "lv_style.h" + +void lv_style_set_width(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_WIDTH, v); +} + +void lv_style_set_min_width(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_MIN_WIDTH, v); +} + +void lv_style_set_max_width(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_MAX_WIDTH, v); +} + +void lv_style_set_height(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_HEIGHT, v); +} + +void lv_style_set_min_height(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_MIN_HEIGHT, v); +} + +void lv_style_set_max_height(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_MAX_HEIGHT, v); +} + +void lv_style_set_x(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_X, v); +} + +void lv_style_set_y(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_Y, v); +} + +void lv_style_set_align(lv_style_t * style, lv_align_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_ALIGN, v); +} + +void lv_style_set_transform_width(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_WIDTH, v); +} + +void lv_style_set_transform_height(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_HEIGHT, v); +} + +void lv_style_set_translate_x(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSLATE_X, v); +} + +void lv_style_set_translate_y(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSLATE_Y, v); +} + +void lv_style_set_transform_zoom(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_ZOOM, v); +} + +void lv_style_set_transform_angle(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_ANGLE, v); +} + +void lv_style_set_transform_pivot_x(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_PIVOT_X, v); +} + +void lv_style_set_transform_pivot_y(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_PIVOT_Y, v); +} + +void lv_style_set_pad_top(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_PAD_TOP, v); +} + +void lv_style_set_pad_bottom(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_PAD_BOTTOM, v); +} + +void lv_style_set_pad_left(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_PAD_LEFT, v); +} + +void lv_style_set_pad_right(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_PAD_RIGHT, v); +} + +void lv_style_set_pad_row(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_PAD_ROW, v); +} + +void lv_style_set_pad_column(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_PAD_COLUMN, v); +} + +void lv_style_set_bg_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_BG_COLOR, v); +} + +void lv_style_set_bg_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_OPA, v); +} + +void lv_style_set_bg_grad_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_BG_GRAD_COLOR, v); +} + +void lv_style_set_bg_grad_dir(lv_style_t * style, lv_grad_dir_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_GRAD_DIR, v); +} + +void lv_style_set_bg_main_stop(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_MAIN_STOP, v); +} + +void lv_style_set_bg_grad_stop(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_GRAD_STOP, v); +} + +void lv_style_set_bg_grad(lv_style_t * style, const lv_grad_dsc_t * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_BG_GRAD, v); +} + +void lv_style_set_bg_dither_mode(lv_style_t * style, lv_dither_mode_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_DITHER_MODE, v); +} + +void lv_style_set_bg_img_src(lv_style_t * style, const void * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_BG_IMG_SRC, v); +} + +void lv_style_set_bg_img_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_IMG_OPA, v); +} + +void lv_style_set_bg_img_recolor(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_BG_IMG_RECOLOR, v); +} + +void lv_style_set_bg_img_recolor_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_IMG_RECOLOR_OPA, v); +} + +void lv_style_set_bg_img_tiled(lv_style_t * style, bool value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_IMG_TILED, v); +} + +void lv_style_set_border_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_BORDER_COLOR, v); +} + +void lv_style_set_border_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BORDER_OPA, v); +} + +void lv_style_set_border_width(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BORDER_WIDTH, v); +} + +void lv_style_set_border_side(lv_style_t * style, lv_border_side_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BORDER_SIDE, v); +} + +void lv_style_set_border_post(lv_style_t * style, bool value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BORDER_POST, v); +} + +void lv_style_set_outline_width(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_OUTLINE_WIDTH, v); +} + +void lv_style_set_outline_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_OUTLINE_COLOR, v); +} + +void lv_style_set_outline_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_OUTLINE_OPA, v); +} + +void lv_style_set_outline_pad(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_OUTLINE_PAD, v); +} + +void lv_style_set_shadow_width(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_SHADOW_WIDTH, v); +} + +void lv_style_set_shadow_ofs_x(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_SHADOW_OFS_X, v); +} + +void lv_style_set_shadow_ofs_y(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_SHADOW_OFS_Y, v); +} + +void lv_style_set_shadow_spread(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_SHADOW_SPREAD, v); +} + +void lv_style_set_shadow_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_SHADOW_COLOR, v); +} + +void lv_style_set_shadow_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_SHADOW_OPA, v); +} + +void lv_style_set_img_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_IMG_OPA, v); +} + +void lv_style_set_img_recolor(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_IMG_RECOLOR, v); +} + +void lv_style_set_img_recolor_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_IMG_RECOLOR_OPA, v); +} + +void lv_style_set_line_width(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_LINE_WIDTH, v); +} + +void lv_style_set_line_dash_width(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_LINE_DASH_WIDTH, v); +} + +void lv_style_set_line_dash_gap(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_LINE_DASH_GAP, v); +} + +void lv_style_set_line_rounded(lv_style_t * style, bool value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_LINE_ROUNDED, v); +} + +void lv_style_set_line_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_LINE_COLOR, v); +} + +void lv_style_set_line_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_LINE_OPA, v); +} + +void lv_style_set_arc_width(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_ARC_WIDTH, v); +} + +void lv_style_set_arc_rounded(lv_style_t * style, bool value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_ARC_ROUNDED, v); +} + +void lv_style_set_arc_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_ARC_COLOR, v); +} + +void lv_style_set_arc_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_ARC_OPA, v); +} + +void lv_style_set_arc_img_src(lv_style_t * style, const void * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_ARC_IMG_SRC, v); +} + +void lv_style_set_text_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_COLOR, v); +} + +void lv_style_set_text_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_OPA, v); +} + +void lv_style_set_text_font(lv_style_t * style, const lv_font_t * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_FONT, v); +} + +void lv_style_set_text_letter_space(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_LETTER_SPACE, v); +} + +void lv_style_set_text_line_space(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_LINE_SPACE, v); +} + +void lv_style_set_text_decor(lv_style_t * style, lv_text_decor_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_DECOR, v); +} + +void lv_style_set_text_align(lv_style_t * style, lv_text_align_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_ALIGN, v); +} + +void lv_style_set_radius(lv_style_t * style, lv_coord_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_RADIUS, v); +} + +void lv_style_set_clip_corner(lv_style_t * style, bool value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_CLIP_CORNER, v); +} + +void lv_style_set_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_OPA, v); +} + +void lv_style_set_color_filter_dsc(lv_style_t * style, const lv_color_filter_dsc_t * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_COLOR_FILTER_DSC, v); +} + +void lv_style_set_color_filter_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_COLOR_FILTER_OPA, v); +} + +void lv_style_set_anim(lv_style_t * style, const lv_anim_t * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_ANIM, v); +} + +void lv_style_set_anim_time(lv_style_t * style, uint32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_ANIM_TIME, v); +} + +void lv_style_set_anim_speed(lv_style_t * style, uint32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_ANIM_SPEED, v); +} + +void lv_style_set_transition(lv_style_t * style, const lv_style_transition_dsc_t * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_TRANSITION, v); +} + +void lv_style_set_blend_mode(lv_style_t * style, lv_blend_mode_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BLEND_MODE, v); +} + +void lv_style_set_layout(lv_style_t * style, uint16_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_LAYOUT, v); +} + +void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BASE_DIR, v); +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_style_gen.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_style_gen.h new file mode 100644 index 0000000..8bf3b68 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_style_gen.h @@ -0,0 +1,504 @@ +void lv_style_set_width(lv_style_t * style, lv_coord_t value); +void lv_style_set_min_width(lv_style_t * style, lv_coord_t value); +void lv_style_set_max_width(lv_style_t * style, lv_coord_t value); +void lv_style_set_height(lv_style_t * style, lv_coord_t value); +void lv_style_set_min_height(lv_style_t * style, lv_coord_t value); +void lv_style_set_max_height(lv_style_t * style, lv_coord_t value); +void lv_style_set_x(lv_style_t * style, lv_coord_t value); +void lv_style_set_y(lv_style_t * style, lv_coord_t value); +void lv_style_set_align(lv_style_t * style, lv_align_t value); +void lv_style_set_transform_width(lv_style_t * style, lv_coord_t value); +void lv_style_set_transform_height(lv_style_t * style, lv_coord_t value); +void lv_style_set_translate_x(lv_style_t * style, lv_coord_t value); +void lv_style_set_translate_y(lv_style_t * style, lv_coord_t value); +void lv_style_set_transform_zoom(lv_style_t * style, lv_coord_t value); +void lv_style_set_transform_angle(lv_style_t * style, lv_coord_t value); +void lv_style_set_transform_pivot_x(lv_style_t * style, lv_coord_t value); +void lv_style_set_transform_pivot_y(lv_style_t * style, lv_coord_t value); +void lv_style_set_pad_top(lv_style_t * style, lv_coord_t value); +void lv_style_set_pad_bottom(lv_style_t * style, lv_coord_t value); +void lv_style_set_pad_left(lv_style_t * style, lv_coord_t value); +void lv_style_set_pad_right(lv_style_t * style, lv_coord_t value); +void lv_style_set_pad_row(lv_style_t * style, lv_coord_t value); +void lv_style_set_pad_column(lv_style_t * style, lv_coord_t value); +void lv_style_set_bg_color(lv_style_t * style, lv_color_t value); +void lv_style_set_bg_opa(lv_style_t * style, lv_opa_t value); +void lv_style_set_bg_grad_color(lv_style_t * style, lv_color_t value); +void lv_style_set_bg_grad_dir(lv_style_t * style, lv_grad_dir_t value); +void lv_style_set_bg_main_stop(lv_style_t * style, lv_coord_t value); +void lv_style_set_bg_grad_stop(lv_style_t * style, lv_coord_t value); +void lv_style_set_bg_grad(lv_style_t * style, const lv_grad_dsc_t * value); +void lv_style_set_bg_dither_mode(lv_style_t * style, lv_dither_mode_t value); +void lv_style_set_bg_img_src(lv_style_t * style, const void * value); +void lv_style_set_bg_img_opa(lv_style_t * style, lv_opa_t value); +void lv_style_set_bg_img_recolor(lv_style_t * style, lv_color_t value); +void lv_style_set_bg_img_recolor_opa(lv_style_t * style, lv_opa_t value); +void lv_style_set_bg_img_tiled(lv_style_t * style, bool value); +void lv_style_set_border_color(lv_style_t * style, lv_color_t value); +void lv_style_set_border_opa(lv_style_t * style, lv_opa_t value); +void lv_style_set_border_width(lv_style_t * style, lv_coord_t value); +void lv_style_set_border_side(lv_style_t * style, lv_border_side_t value); +void lv_style_set_border_post(lv_style_t * style, bool value); +void lv_style_set_outline_width(lv_style_t * style, lv_coord_t value); +void lv_style_set_outline_color(lv_style_t * style, lv_color_t value); +void lv_style_set_outline_opa(lv_style_t * style, lv_opa_t value); +void lv_style_set_outline_pad(lv_style_t * style, lv_coord_t value); +void lv_style_set_shadow_width(lv_style_t * style, lv_coord_t value); +void lv_style_set_shadow_ofs_x(lv_style_t * style, lv_coord_t value); +void lv_style_set_shadow_ofs_y(lv_style_t * style, lv_coord_t value); +void lv_style_set_shadow_spread(lv_style_t * style, lv_coord_t value); +void lv_style_set_shadow_color(lv_style_t * style, lv_color_t value); +void lv_style_set_shadow_opa(lv_style_t * style, lv_opa_t value); +void lv_style_set_img_opa(lv_style_t * style, lv_opa_t value); +void lv_style_set_img_recolor(lv_style_t * style, lv_color_t value); +void lv_style_set_img_recolor_opa(lv_style_t * style, lv_opa_t value); +void lv_style_set_line_width(lv_style_t * style, lv_coord_t value); +void lv_style_set_line_dash_width(lv_style_t * style, lv_coord_t value); +void lv_style_set_line_dash_gap(lv_style_t * style, lv_coord_t value); +void lv_style_set_line_rounded(lv_style_t * style, bool value); +void lv_style_set_line_color(lv_style_t * style, lv_color_t value); +void lv_style_set_line_opa(lv_style_t * style, lv_opa_t value); +void lv_style_set_arc_width(lv_style_t * style, lv_coord_t value); +void lv_style_set_arc_rounded(lv_style_t * style, bool value); +void lv_style_set_arc_color(lv_style_t * style, lv_color_t value); +void lv_style_set_arc_opa(lv_style_t * style, lv_opa_t value); +void lv_style_set_arc_img_src(lv_style_t * style, const void * value); +void lv_style_set_text_color(lv_style_t * style, lv_color_t value); +void lv_style_set_text_opa(lv_style_t * style, lv_opa_t value); +void lv_style_set_text_font(lv_style_t * style, const lv_font_t * value); +void lv_style_set_text_letter_space(lv_style_t * style, lv_coord_t value); +void lv_style_set_text_line_space(lv_style_t * style, lv_coord_t value); +void lv_style_set_text_decor(lv_style_t * style, lv_text_decor_t value); +void lv_style_set_text_align(lv_style_t * style, lv_text_align_t value); +void lv_style_set_radius(lv_style_t * style, lv_coord_t value); +void lv_style_set_clip_corner(lv_style_t * style, bool value); +void lv_style_set_opa(lv_style_t * style, lv_opa_t value); +void lv_style_set_color_filter_dsc(lv_style_t * style, const lv_color_filter_dsc_t * value); +void lv_style_set_color_filter_opa(lv_style_t * style, lv_opa_t value); +void lv_style_set_anim(lv_style_t * style, const lv_anim_t * value); +void lv_style_set_anim_time(lv_style_t * style, uint32_t value); +void lv_style_set_anim_speed(lv_style_t * style, uint32_t value); +void lv_style_set_transition(lv_style_t * style, const lv_style_transition_dsc_t * value); +void lv_style_set_blend_mode(lv_style_t * style, lv_blend_mode_t value); +void lv_style_set_layout(lv_style_t * style, uint16_t value); +void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value); + +#define LV_STYLE_CONST_WIDTH(val) \ + { \ + .prop = LV_STYLE_WIDTH, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_MIN_WIDTH(val) \ + { \ + .prop = LV_STYLE_MIN_WIDTH, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_MAX_WIDTH(val) \ + { \ + .prop = LV_STYLE_MAX_WIDTH, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_HEIGHT(val) \ + { \ + .prop = LV_STYLE_HEIGHT, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_MIN_HEIGHT(val) \ + { \ + .prop = LV_STYLE_MIN_HEIGHT, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_MAX_HEIGHT(val) \ + { \ + .prop = LV_STYLE_MAX_HEIGHT, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_X(val) \ + { \ + .prop = LV_STYLE_X, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_Y(val) \ + { \ + .prop = LV_STYLE_Y, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_ALIGN(val) \ + { \ + .prop = LV_STYLE_ALIGN, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TRANSFORM_WIDTH(val) \ + { \ + .prop = LV_STYLE_TRANSFORM_WIDTH, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TRANSFORM_HEIGHT(val) \ + { \ + .prop = LV_STYLE_TRANSFORM_HEIGHT, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TRANSLATE_X(val) \ + { \ + .prop = LV_STYLE_TRANSLATE_X, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TRANSLATE_Y(val) \ + { \ + .prop = LV_STYLE_TRANSLATE_Y, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TRANSFORM_ZOOM(val) \ + { \ + .prop = LV_STYLE_TRANSFORM_ZOOM, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TRANSFORM_ANGLE(val) \ + { \ + .prop = LV_STYLE_TRANSFORM_ANGLE, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TRANSFORM_PIVOT_X(val) \ + { \ + .prop = LV_STYLE_TRANSFORM_PIVOT_X, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TRANSFORM_PIVOT_Y(val) \ + { \ + .prop = LV_STYLE_TRANSFORM_PIVOT_Y, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_PAD_TOP(val) \ + { \ + .prop = LV_STYLE_PAD_TOP, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_PAD_BOTTOM(val) \ + { \ + .prop = LV_STYLE_PAD_BOTTOM, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_PAD_LEFT(val) \ + { \ + .prop = LV_STYLE_PAD_LEFT, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_PAD_RIGHT(val) \ + { \ + .prop = LV_STYLE_PAD_RIGHT, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_PAD_ROW(val) \ + { \ + .prop = LV_STYLE_PAD_ROW, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_PAD_COLUMN(val) \ + { \ + .prop = LV_STYLE_PAD_COLUMN, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BG_COLOR(val) \ + { \ + .prop = LV_STYLE_BG_COLOR, .value = { .color = val } \ + } + +#define LV_STYLE_CONST_BG_OPA(val) \ + { \ + .prop = LV_STYLE_BG_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BG_GRAD_COLOR(val) \ + { \ + .prop = LV_STYLE_BG_GRAD_COLOR, .value = { .color = val } \ + } + +#define LV_STYLE_CONST_BG_GRAD_DIR(val) \ + { \ + .prop = LV_STYLE_BG_GRAD_DIR, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BG_MAIN_STOP(val) \ + { \ + .prop = LV_STYLE_BG_MAIN_STOP, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BG_GRAD_STOP(val) \ + { \ + .prop = LV_STYLE_BG_GRAD_STOP, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BG_GRAD(val) \ + { \ + .prop = LV_STYLE_BG_GRAD, .value = { .ptr = val } \ + } + +#define LV_STYLE_CONST_BG_DITHER_MODE(val) \ + { \ + .prop = LV_STYLE_BG_DITHER_MODE, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BG_IMG_SRC(val) \ + { \ + .prop = LV_STYLE_BG_IMG_SRC, .value = { .ptr = val } \ + } + +#define LV_STYLE_CONST_BG_IMG_OPA(val) \ + { \ + .prop = LV_STYLE_BG_IMG_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BG_IMG_RECOLOR(val) \ + { \ + .prop = LV_STYLE_BG_IMG_RECOLOR, .value = { .color = val } \ + } + +#define LV_STYLE_CONST_BG_IMG_RECOLOR_OPA(val) \ + { \ + .prop = LV_STYLE_BG_IMG_RECOLOR_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BG_IMG_TILED(val) \ + { \ + .prop = LV_STYLE_BG_IMG_TILED, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BORDER_COLOR(val) \ + { \ + .prop = LV_STYLE_BORDER_COLOR, .value = { .color = val } \ + } + +#define LV_STYLE_CONST_BORDER_OPA(val) \ + { \ + .prop = LV_STYLE_BORDER_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BORDER_WIDTH(val) \ + { \ + .prop = LV_STYLE_BORDER_WIDTH, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BORDER_SIDE(val) \ + { \ + .prop = LV_STYLE_BORDER_SIDE, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BORDER_POST(val) \ + { \ + .prop = LV_STYLE_BORDER_POST, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_OUTLINE_WIDTH(val) \ + { \ + .prop = LV_STYLE_OUTLINE_WIDTH, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_OUTLINE_COLOR(val) \ + { \ + .prop = LV_STYLE_OUTLINE_COLOR, .value = { .color = val } \ + } + +#define LV_STYLE_CONST_OUTLINE_OPA(val) \ + { \ + .prop = LV_STYLE_OUTLINE_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_OUTLINE_PAD(val) \ + { \ + .prop = LV_STYLE_OUTLINE_PAD, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_SHADOW_WIDTH(val) \ + { \ + .prop = LV_STYLE_SHADOW_WIDTH, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_SHADOW_OFS_X(val) \ + { \ + .prop = LV_STYLE_SHADOW_OFS_X, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_SHADOW_OFS_Y(val) \ + { \ + .prop = LV_STYLE_SHADOW_OFS_Y, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_SHADOW_SPREAD(val) \ + { \ + .prop = LV_STYLE_SHADOW_SPREAD, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_SHADOW_COLOR(val) \ + { \ + .prop = LV_STYLE_SHADOW_COLOR, .value = { .color = val } \ + } + +#define LV_STYLE_CONST_SHADOW_OPA(val) \ + { \ + .prop = LV_STYLE_SHADOW_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_IMG_OPA(val) \ + { \ + .prop = LV_STYLE_IMG_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_IMG_RECOLOR(val) \ + { \ + .prop = LV_STYLE_IMG_RECOLOR, .value = { .color = val } \ + } + +#define LV_STYLE_CONST_IMG_RECOLOR_OPA(val) \ + { \ + .prop = LV_STYLE_IMG_RECOLOR_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_LINE_WIDTH(val) \ + { \ + .prop = LV_STYLE_LINE_WIDTH, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_LINE_DASH_WIDTH(val) \ + { \ + .prop = LV_STYLE_LINE_DASH_WIDTH, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_LINE_DASH_GAP(val) \ + { \ + .prop = LV_STYLE_LINE_DASH_GAP, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_LINE_ROUNDED(val) \ + { \ + .prop = LV_STYLE_LINE_ROUNDED, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_LINE_COLOR(val) \ + { \ + .prop = LV_STYLE_LINE_COLOR, .value = { .color = val } \ + } + +#define LV_STYLE_CONST_LINE_OPA(val) \ + { \ + .prop = LV_STYLE_LINE_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_ARC_WIDTH(val) \ + { \ + .prop = LV_STYLE_ARC_WIDTH, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_ARC_ROUNDED(val) \ + { \ + .prop = LV_STYLE_ARC_ROUNDED, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_ARC_COLOR(val) \ + { \ + .prop = LV_STYLE_ARC_COLOR, .value = { .color = val } \ + } + +#define LV_STYLE_CONST_ARC_OPA(val) \ + { \ + .prop = LV_STYLE_ARC_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_ARC_IMG_SRC(val) \ + { \ + .prop = LV_STYLE_ARC_IMG_SRC, .value = { .ptr = val } \ + } + +#define LV_STYLE_CONST_TEXT_COLOR(val) \ + { \ + .prop = LV_STYLE_TEXT_COLOR, .value = { .color = val } \ + } + +#define LV_STYLE_CONST_TEXT_OPA(val) \ + { \ + .prop = LV_STYLE_TEXT_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TEXT_FONT(val) \ + { \ + .prop = LV_STYLE_TEXT_FONT, .value = { .ptr = val } \ + } + +#define LV_STYLE_CONST_TEXT_LETTER_SPACE(val) \ + { \ + .prop = LV_STYLE_TEXT_LETTER_SPACE, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TEXT_LINE_SPACE(val) \ + { \ + .prop = LV_STYLE_TEXT_LINE_SPACE, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TEXT_DECOR(val) \ + { \ + .prop = LV_STYLE_TEXT_DECOR, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TEXT_ALIGN(val) \ + { \ + .prop = LV_STYLE_TEXT_ALIGN, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_RADIUS(val) \ + { \ + .prop = LV_STYLE_RADIUS, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_CLIP_CORNER(val) \ + { \ + .prop = LV_STYLE_CLIP_CORNER, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_OPA(val) \ + { \ + .prop = LV_STYLE_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_COLOR_FILTER_DSC(val) \ + { \ + .prop = LV_STYLE_COLOR_FILTER_DSC, .value = { .ptr = val } \ + } + +#define LV_STYLE_CONST_COLOR_FILTER_OPA(val) \ + { \ + .prop = LV_STYLE_COLOR_FILTER_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_ANIM(val) \ + { \ + .prop = LV_STYLE_ANIM, .value = { .ptr = val } \ + } + +#define LV_STYLE_CONST_ANIM_TIME(val) \ + { \ + .prop = LV_STYLE_ANIM_TIME, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_ANIM_SPEED(val) \ + { \ + .prop = LV_STYLE_ANIM_SPEED, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TRANSITION(val) \ + { \ + .prop = LV_STYLE_TRANSITION, .value = { .ptr = val } \ + } + +#define LV_STYLE_CONST_BLEND_MODE(val) \ + { \ + .prop = LV_STYLE_BLEND_MODE, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_LAYOUT(val) \ + { \ + .prop = LV_STYLE_LAYOUT, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BASE_DIR(val) \ + { \ + .prop = LV_STYLE_BASE_DIR, .value = { .num = (int32_t)val } \ + } diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_templ.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_templ.c new file mode 100644 index 0000000..939930c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_templ.c @@ -0,0 +1,40 @@ +/** + * @file lv_templ.c + * + */ + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*This typedef exists purely to keep -Wpedantic happy when the file is empty.*/ +/*It can be removed.*/ +typedef int _keep_pedantic_happy; + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_templ.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_templ.h new file mode 100644 index 0000000..f7e3c26 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_templ.h @@ -0,0 +1,37 @@ +/** + * @file lv_templ.h + * + */ + +#ifndef LV_TEMPL_H +#define LV_TEMPL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEMPL_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_timer.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_timer.c new file mode 100644 index 0000000..d8dd55b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_timer.c @@ -0,0 +1,341 @@ +/** + * @file lv_timer.c + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_timer.h" +#include "../hal/lv_hal_tick.h" +#include "lv_assert.h" +#include "lv_mem.h" +#include "lv_ll.h" +#include "lv_gc.h" + +/********************* + * DEFINES + *********************/ +#define IDLE_MEAS_PERIOD 500 /*[ms]*/ +#define DEF_PERIOD 500 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static bool lv_timer_exec(lv_timer_t * timer); +static uint32_t lv_timer_time_remaining(lv_timer_t * timer); + +/********************** + * STATIC VARIABLES + **********************/ +static bool lv_timer_run = false; +static uint8_t idle_last = 0; +static bool timer_deleted; +static bool timer_created; + +/********************** + * MACROS + **********************/ +#if LV_LOG_TRACE_TIMER + #define TIMER_TRACE(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define TIMER_TRACE(...) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Init the lv_timer module + */ +void _lv_timer_core_init(void) +{ + _lv_ll_init(&LV_GC_ROOT(_lv_timer_ll), sizeof(lv_timer_t)); + + /*Initially enable the lv_timer handling*/ + lv_timer_enable(true); +} + +/** + * Call it periodically to handle lv_timers. + * @return the time after which it must be called again + */ +LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void) +{ + TIMER_TRACE("begin"); + + /*Avoid concurrent running of the timer handler*/ + static bool already_running = false; + if(already_running) { + TIMER_TRACE("already running, concurrent calls are not allow, returning"); + return 1; + } + already_running = true; + + if(lv_timer_run == false) { + already_running = false; /*Release mutex*/ + return 1; + } + + static uint32_t idle_period_start = 0; + static uint32_t busy_time = 0; + + uint32_t handler_start = lv_tick_get(); + + if(handler_start == 0) { + static uint32_t run_cnt = 0; + run_cnt++; + if(run_cnt > 100) { + run_cnt = 0; + LV_LOG_WARN("It seems lv_tick_inc() is not called."); + } + } + + /*Run all timer from the list*/ + lv_timer_t * next; + do { + timer_deleted = false; + timer_created = false; + LV_GC_ROOT(_lv_timer_act) = _lv_ll_get_head(&LV_GC_ROOT(_lv_timer_ll)); + while(LV_GC_ROOT(_lv_timer_act)) { + /*The timer might be deleted if it runs only once ('repeat_count = 1') + *So get next element until the current is surely valid*/ + next = _lv_ll_get_next(&LV_GC_ROOT(_lv_timer_ll), LV_GC_ROOT(_lv_timer_act)); + + if(lv_timer_exec(LV_GC_ROOT(_lv_timer_act))) { + /*If a timer was created or deleted then this or the next item might be corrupted*/ + if(timer_created || timer_deleted) { + TIMER_TRACE("Start from the first timer again because a timer was created or deleted"); + break; + } + } + + LV_GC_ROOT(_lv_timer_act) = next; /*Load the next timer*/ + } + } while(LV_GC_ROOT(_lv_timer_act)); + + uint32_t time_till_next = LV_NO_TIMER_READY; + next = _lv_ll_get_head(&LV_GC_ROOT(_lv_timer_ll)); + while(next) { + if(!next->paused) { + uint32_t delay = lv_timer_time_remaining(next); + if(delay < time_till_next) + time_till_next = delay; + } + + next = _lv_ll_get_next(&LV_GC_ROOT(_lv_timer_ll), next); /*Find the next timer*/ + } + + busy_time += lv_tick_elaps(handler_start); + uint32_t idle_period_time = lv_tick_elaps(idle_period_start); + if(idle_period_time >= IDLE_MEAS_PERIOD) { + idle_last = (busy_time * 100) / idle_period_time; /*Calculate the busy percentage*/ + idle_last = idle_last > 100 ? 0 : 100 - idle_last; /*But we need idle time*/ + busy_time = 0; + idle_period_start = lv_tick_get(); + } + + already_running = false; /*Release the mutex*/ + + TIMER_TRACE("finished (%d ms until the next timer call)", time_till_next); + return time_till_next; +} + +/** + * Create an "empty" timer. It needs to initialized with at least + * `lv_timer_set_cb` and `lv_timer_set_period` + * @return pointer to the created timer + */ +lv_timer_t * lv_timer_create_basic(void) +{ + return lv_timer_create(NULL, DEF_PERIOD, NULL); +} + +/** + * Create a new lv_timer + * @param timer_xcb a callback which is the timer itself. It will be called periodically. + * (the 'x' in the argument name indicates that it's not a fully generic function because it not follows + * the `func_name(object, callback, ...)` convention) + * @param period call period in ms unit + * @param user_data custom parameter + * @return pointer to the new timer + */ +lv_timer_t * lv_timer_create(lv_timer_cb_t timer_xcb, uint32_t period, void * user_data) +{ + lv_timer_t * new_timer = NULL; + + new_timer = _lv_ll_ins_head(&LV_GC_ROOT(_lv_timer_ll)); + LV_ASSERT_MALLOC(new_timer); + if(new_timer == NULL) return NULL; + + new_timer->period = period; + new_timer->timer_cb = timer_xcb; + new_timer->repeat_count = -1; + new_timer->paused = 0; + new_timer->last_run = lv_tick_get(); + new_timer->user_data = user_data; + + timer_created = true; + + return new_timer; +} + +/** + * Set the callback the timer (the function to call periodically) + * @param timer pointer to a timer + * @param timer_cb the function to call periodically + */ +void lv_timer_set_cb(lv_timer_t * timer, lv_timer_cb_t timer_cb) +{ + timer->timer_cb = timer_cb; +} + +/** + * Delete a lv_timer + * @param timer pointer to timer created by timer + */ +void lv_timer_del(lv_timer_t * timer) +{ + _lv_ll_remove(&LV_GC_ROOT(_lv_timer_ll), timer); + timer_deleted = true; + + lv_mem_free(timer); +} + +/** + * Pause/resume a timer. + * @param timer pointer to an lv_timer + */ +void lv_timer_pause(lv_timer_t * timer) +{ + timer->paused = true; +} + +void lv_timer_resume(lv_timer_t * timer) +{ + timer->paused = false; +} + +/** + * Set new period for a lv_timer + * @param timer pointer to a lv_timer + * @param period the new period + */ +void lv_timer_set_period(lv_timer_t * timer, uint32_t period) +{ + timer->period = period; +} + +/** + * Make a lv_timer ready. It will not wait its period. + * @param timer pointer to a lv_timer. + */ +void lv_timer_ready(lv_timer_t * timer) +{ + timer->last_run = lv_tick_get() - timer->period - 1; +} + +/** + * Set the number of times a timer will repeat. + * @param timer pointer to a lv_timer. + * @param repeat_count -1 : infinity; 0 : stop ; n >0: residual times + */ +void lv_timer_set_repeat_count(lv_timer_t * timer, int32_t repeat_count) +{ + timer->repeat_count = repeat_count; +} + +/** + * Reset a lv_timer. + * It will be called the previously set period milliseconds later. + * @param timer pointer to a lv_timer. + */ +void lv_timer_reset(lv_timer_t * timer) +{ + timer->last_run = lv_tick_get(); +} + +/** + * Enable or disable the whole lv_timer handling + * @param en true: lv_timer handling is running, false: lv_timer handling is suspended + */ +void lv_timer_enable(bool en) +{ + lv_timer_run = en; +} + +/** + * Get idle percentage + * @return the lv_timer idle in percentage + */ +uint8_t lv_timer_get_idle(void) +{ + return idle_last; +} + +/** + * Iterate through the timers + * @param timer NULL to start iteration or the previous return value to get the next timer + * @return the next timer or NULL if there is no more timer + */ +lv_timer_t * lv_timer_get_next(lv_timer_t * timer) +{ + if(timer == NULL) return _lv_ll_get_head(&LV_GC_ROOT(_lv_timer_ll)); + else return _lv_ll_get_next(&LV_GC_ROOT(_lv_timer_ll), timer); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Execute timer if its remaining time is zero + * @param timer pointer to lv_timer + * @return true: execute, false: not executed + */ +static bool lv_timer_exec(lv_timer_t * timer) +{ + if(timer->paused) return false; + + bool exec = false; + if(lv_timer_time_remaining(timer) == 0) { + /* Decrement the repeat count before executing the timer_cb. + * If any timer is deleted `if(timer->repeat_count == 0)` is not executed below + * but at least the repeat count is zero and the timer can be deleted in the next round*/ + int32_t original_repeat_count = timer->repeat_count; + if(timer->repeat_count > 0) timer->repeat_count--; + timer->last_run = lv_tick_get(); + TIMER_TRACE("calling timer callback: %p", *((void **)&timer->timer_cb)); + if(timer->timer_cb && original_repeat_count != 0) timer->timer_cb(timer); + TIMER_TRACE("timer callback %p finished", *((void **)&timer->timer_cb)); + LV_ASSERT_MEM_INTEGRITY(); + exec = true; + } + + if(timer_deleted == false) { /*The timer might be deleted by itself as well*/ + if(timer->repeat_count == 0) { /*The repeat count is over, delete the timer*/ + TIMER_TRACE("deleting timer with %p callback because the repeat count is over", *((void **)&timer->timer_cb)); + lv_timer_del(timer); + } + } + + return exec; +} + +/** + * Find out how much time remains before a timer must be run. + * @param timer pointer to lv_timer + * @return the time remaining, or 0 if it needs to be run again + */ +static uint32_t lv_timer_time_remaining(lv_timer_t * timer) +{ + /*Check if at least 'period' time elapsed*/ + uint32_t elp = lv_tick_elaps(timer->last_run); + if(elp >= timer->period) + return 0; + return timer->period - elp; +} diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_timer.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_timer.h new file mode 100644 index 0000000..a9a8e50 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_timer.h @@ -0,0 +1,183 @@ +/** + * @file lv_timer.h + */ + +#ifndef LV_TIMER_H +#define LV_TIMER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "../hal/lv_hal_tick.h" + +#include +#include + +/********************* + * DEFINES + *********************/ +#ifndef LV_ATTRIBUTE_TIMER_HANDLER +#define LV_ATTRIBUTE_TIMER_HANDLER +#endif + +#define LV_NO_TIMER_READY 0xFFFFFFFF + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_timer_t; + +/** + * Timers execute this type of functions. + */ +typedef void (*lv_timer_cb_t)(struct _lv_timer_t *); + +/** + * Descriptor of a lv_timer + */ +typedef struct _lv_timer_t { + uint32_t period; /**< How often the timer should run*/ + uint32_t last_run; /**< Last time the timer ran*/ + lv_timer_cb_t timer_cb; /**< Timer function*/ + void * user_data; /**< Custom user data*/ + int32_t repeat_count; /**< 1: One time; -1 : infinity; n>0: residual times*/ + uint32_t paused : 1; +} lv_timer_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Init the lv_timer module + */ +void _lv_timer_core_init(void); + +//! @cond Doxygen_Suppress + +/** + * Call it periodically to handle lv_timers. + * @return time till it needs to be run next (in ms) + */ +LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void); + +//! @endcond + +/** + * Call it in the super-loop of main() or threads. It will run lv_timer_handler() + * with a given period in ms. You can use it with sleep or delay in OS environment. + * This function is used to simplify the porting. + * @param __ms the period for running lv_timer_handler() + */ +static inline LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler_run_in_period(uint32_t ms) +{ + static uint32_t last_tick = 0; + uint32_t curr_tick = lv_tick_get(); + + if((curr_tick - last_tick) >= (ms)) { + last_tick = curr_tick; + return lv_timer_handler(); + } + return 1; +} + +/** + * Create an "empty" timer. It needs to initialized with at least + * `lv_timer_set_cb` and `lv_timer_set_period` + * @return pointer to the created timer + */ +lv_timer_t * lv_timer_create_basic(void); + +/** + * Create a new lv_timer + * @param timer_xcb a callback to call periodically. + * (the 'x' in the argument name indicates that it's not a fully generic function because it not follows + * the `func_name(object, callback, ...)` convention) + * @param period call period in ms unit + * @param user_data custom parameter + * @return pointer to the new timer + */ +lv_timer_t * lv_timer_create(lv_timer_cb_t timer_xcb, uint32_t period, void * user_data); + +/** + * Delete a lv_timer + * @param timer pointer to an lv_timer + */ +void lv_timer_del(lv_timer_t * timer); + +/** + * Pause/resume a timer. + * @param timer pointer to an lv_timer + */ +void lv_timer_pause(lv_timer_t * timer); + +void lv_timer_resume(lv_timer_t * timer); + +/** + * Set the callback the timer (the function to call periodically) + * @param timer pointer to a timer + * @param timer_cb the function to call periodically + */ +void lv_timer_set_cb(lv_timer_t * timer, lv_timer_cb_t timer_cb); + +/** + * Set new period for a lv_timer + * @param timer pointer to a lv_timer + * @param period the new period + */ +void lv_timer_set_period(lv_timer_t * timer, uint32_t period); + +/** + * Make a lv_timer ready. It will not wait its period. + * @param timer pointer to a lv_timer. + */ +void lv_timer_ready(lv_timer_t * timer); + +/** + * Set the number of times a timer will repeat. + * @param timer pointer to a lv_timer. + * @param repeat_count -1 : infinity; 0 : stop ; n>0: residual times + */ +void lv_timer_set_repeat_count(lv_timer_t * timer, int32_t repeat_count); + +/** + * Reset a lv_timer. + * It will be called the previously set period milliseconds later. + * @param timer pointer to a lv_timer. + */ +void lv_timer_reset(lv_timer_t * timer); + +/** + * Enable or disable the whole lv_timer handling + * @param en true: lv_timer handling is running, false: lv_timer handling is suspended + */ +void lv_timer_enable(bool en); + +/** + * Get idle percentage + * @return the lv_timer idle in percentage + */ +uint8_t lv_timer_get_idle(void); + +/** + * Iterate through the timers + * @param timer NULL to start iteration or the previous return value to get the next timer + * @return the next timer or NULL if there is no more timer + */ +lv_timer_t * lv_timer_get_next(lv_timer_t * timer); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_tlsf.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_tlsf.c new file mode 100644 index 0000000..27e0a46 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_tlsf.c @@ -0,0 +1,1246 @@ +#include "../lv_conf_internal.h" +#if LV_MEM_CUSTOM == 0 + +#include +#include "lv_tlsf.h" +#include "lv_mem.h" +#include "lv_log.h" +#include "lv_assert.h" + +#undef printf +#define printf LV_LOG_ERROR + +#define TLSF_MAX_POOL_SIZE LV_MEM_SIZE + +#if !defined(_DEBUG) + #define _DEBUG 0 +#endif + +#if defined(__cplusplus) + #define tlsf_decl inline +#else + #define tlsf_decl static +#endif + +/* +** Architecture-specific bit manipulation routines. +** +** TLSF achieves O(1) cost for malloc and free operations by limiting +** the search for a free block to a free list of guaranteed size +** adequate to fulfill the request, combined with efficient free list +** queries using bitmasks and architecture-specific bit-manipulation +** routines. +** +** Most modern processors provide instructions to count leading zeroes +** in a word, find the lowest and highest set bit, etc. These +** specific implementations will be used when available, falling back +** to a reasonably efficient generic implementation. +** +** NOTE: TLSF spec relies on ffs/fls returning value 0..31. +** ffs/fls return 1-32 by default, returning 0 for error. +*/ + +/* +** Detect whether or not we are building for a 32- or 64-bit (LP/LLP) +** architecture. There is no reliable portable method at compile-time. +*/ +#if defined (__alpha__) || defined (__ia64__) || defined (__x86_64__) \ + || defined (_WIN64) || defined (__LP64__) || defined (__LLP64__) + #define TLSF_64BIT +#endif + +/* +** Returns one plus the index of the most significant 1-bit of n, +** or if n is zero, returns zero. +*/ +#ifdef TLSF_64BIT + #define TLSF_FLS(n) ((n) & 0xffffffff00000000ull ? 32 + TLSF_FLS32((size_t)(n) >> 32) : TLSF_FLS32(n)) +#else + #define TLSF_FLS(n) TLSF_FLS32(n) +#endif + +#define TLSF_FLS32(n) ((n) & 0xffff0000 ? 16 + TLSF_FLS16((n) >> 16) : TLSF_FLS16(n)) +#define TLSF_FLS16(n) ((n) & 0xff00 ? 8 + TLSF_FLS8 ((n) >> 8) : TLSF_FLS8 (n)) +#define TLSF_FLS8(n) ((n) & 0xf0 ? 4 + TLSF_FLS4 ((n) >> 4) : TLSF_FLS4 (n)) +#define TLSF_FLS4(n) ((n) & 0xc ? 2 + TLSF_FLS2 ((n) >> 2) : TLSF_FLS2 (n)) +#define TLSF_FLS2(n) ((n) & 0x2 ? 1 + TLSF_FLS1 ((n) >> 1) : TLSF_FLS1 (n)) +#define TLSF_FLS1(n) ((n) & 0x1 ? 1 : 0) + +/* +** Returns round up value of log2(n). +** Note: it is used at compile time. +*/ +#define TLSF_LOG2_CEIL(n) ((n) & (n - 1) ? TLSF_FLS(n) : TLSF_FLS(n) - 1) + +/* +** gcc 3.4 and above have builtin support, specialized for architecture. +** Some compilers masquerade as gcc; patchlevel test filters them out. +*/ +#if defined (__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) \ + && defined (__GNUC_PATCHLEVEL__) + +#if defined (__SNC__) +/* SNC for Playstation 3. */ + +tlsf_decl int tlsf_ffs(unsigned int word) +{ + const unsigned int reverse = word & (~word + 1); + const int bit = 32 - __builtin_clz(reverse); + return bit - 1; +} + +#else + +tlsf_decl int tlsf_ffs(unsigned int word) +{ + return __builtin_ffs(word) - 1; +} + +#endif + +tlsf_decl int tlsf_fls(unsigned int word) +{ + const int bit = word ? 32 - __builtin_clz(word) : 0; + return bit - 1; +} + +#elif defined (_MSC_VER) && (_MSC_VER >= 1400) && (defined (_M_IX86) || defined (_M_X64)) +/* Microsoft Visual C++ support on x86/X64 architectures. */ + +#include + +#pragma intrinsic(_BitScanReverse) +#pragma intrinsic(_BitScanForward) + +tlsf_decl int tlsf_fls(unsigned int word) +{ + unsigned long index; + return _BitScanReverse(&index, word) ? index : -1; +} + +tlsf_decl int tlsf_ffs(unsigned int word) +{ + unsigned long index; + return _BitScanForward(&index, word) ? index : -1; +} + +#elif defined (_MSC_VER) && defined (_M_PPC) +/* Microsoft Visual C++ support on PowerPC architectures. */ + +#include + +tlsf_decl int tlsf_fls(unsigned int word) +{ + const int bit = 32 - _CountLeadingZeros(word); + return bit - 1; +} + +tlsf_decl int tlsf_ffs(unsigned int word) +{ + const unsigned int reverse = word & (~word + 1); + const int bit = 32 - _CountLeadingZeros(reverse); + return bit - 1; +} + +#elif defined (__ARMCC_VERSION) +/* RealView Compilation Tools for ARM */ + +tlsf_decl int tlsf_ffs(unsigned int word) +{ + const unsigned int reverse = word & (~word + 1); + const int bit = 32 - __clz(reverse); + return bit - 1; +} + +tlsf_decl int tlsf_fls(unsigned int word) +{ + const int bit = word ? 32 - __clz(word) : 0; + return bit - 1; +} + +#elif defined (__ghs__) +/* Green Hills support for PowerPC */ + +#include + +tlsf_decl int tlsf_ffs(unsigned int word) +{ + const unsigned int reverse = word & (~word + 1); + const int bit = 32 - __CLZ32(reverse); + return bit - 1; +} + +tlsf_decl int tlsf_fls(unsigned int word) +{ + const int bit = word ? 32 - __CLZ32(word) : 0; + return bit - 1; +} + +#else +/* Fall back to generic implementation. */ + +/* Implement ffs in terms of fls. */ +tlsf_decl int tlsf_ffs(unsigned int word) +{ + const unsigned int reverse = word & (~word + 1); + return TLSF_FLS32(reverse) - 1; +} + +tlsf_decl int tlsf_fls(unsigned int word) +{ + return TLSF_FLS32(word) - 1; +} + +#endif + +/* Possibly 64-bit version of tlsf_fls. */ +#if defined (TLSF_64BIT) +tlsf_decl int tlsf_fls_sizet(size_t size) +{ + int high = (int)(size >> 32); + int bits = 0; + if(high) { + bits = 32 + tlsf_fls(high); + } + else { + bits = tlsf_fls((int)size & 0xffffffff); + + } + return bits; +} +#else +#define tlsf_fls_sizet tlsf_fls +#endif + +#undef tlsf_decl + +/* +** Constants. +*/ + +/* Public constants: may be modified. */ +enum tlsf_public { + /* log2 of number of linear subdivisions of block sizes. Larger + ** values require more memory in the control structure. Values of + ** 4 or 5 are typical. + */ + SL_INDEX_COUNT_LOG2 = 5, +}; + +/* Private constants: do not modify. */ +enum tlsf_private { +#if defined (TLSF_64BIT) + /* All allocation sizes and addresses are aligned to 8 bytes. */ + ALIGN_SIZE_LOG2 = 3, +#else + /* All allocation sizes and addresses are aligned to 4 bytes. */ + ALIGN_SIZE_LOG2 = 2, +#endif + ALIGN_SIZE = (1 << ALIGN_SIZE_LOG2), + + /* + ** We support allocations of sizes up to (1 << FL_INDEX_MAX) bits. + ** However, because we linearly subdivide the second-level lists, and + ** our minimum size granularity is 4 bytes, it doesn't make sense to + ** create first-level lists for sizes smaller than SL_INDEX_COUNT * 4, + ** or (1 << (SL_INDEX_COUNT_LOG2 + 2)) bytes, as there we will be + ** trying to split size ranges into more slots than we have available. + ** Instead, we calculate the minimum threshold size, and place all + ** blocks below that size into the 0th first-level list. + */ + +#if defined (TLSF_MAX_POOL_SIZE) + FL_INDEX_MAX = TLSF_LOG2_CEIL(TLSF_MAX_POOL_SIZE), +#elif defined (TLSF_64BIT) + /* + ** TODO: We can increase this to support larger sizes, at the expense + ** of more overhead in the TLSF structure. + */ + FL_INDEX_MAX = 32, +#else + FL_INDEX_MAX = 30, +#endif + SL_INDEX_COUNT = (1 << SL_INDEX_COUNT_LOG2), + FL_INDEX_SHIFT = (SL_INDEX_COUNT_LOG2 + ALIGN_SIZE_LOG2), + FL_INDEX_COUNT = (FL_INDEX_MAX - FL_INDEX_SHIFT + 1), + + SMALL_BLOCK_SIZE = (1 << FL_INDEX_SHIFT), +}; + +/* +** Cast and min/max macros. +*/ + +#define tlsf_cast(t, exp) ((t) (exp)) +#define tlsf_min(a, b) ((a) < (b) ? (a) : (b)) +#define tlsf_max(a, b) ((a) > (b) ? (a) : (b)) + +/* +** Set assert macro, if it has not been provided by the user. +*/ +#define tlsf_assert LV_ASSERT + +#if !defined (tlsf_assert) + #define tlsf_assert assert +#endif + +/* +** Static assertion mechanism. +*/ + +#define _tlsf_glue2(x, y) x ## y +#define _tlsf_glue(x, y) _tlsf_glue2(x, y) +#define tlsf_static_assert(exp) \ + typedef char _tlsf_glue(static_assert, __LINE__) [(exp) ? 1 : -1] + +/* This code has been tested on 32- and 64-bit (LP/LLP) architectures. */ +tlsf_static_assert(sizeof(int) * CHAR_BIT == 32); +tlsf_static_assert(sizeof(size_t) * CHAR_BIT >= 32); +tlsf_static_assert(sizeof(size_t) * CHAR_BIT <= 64); + +/* SL_INDEX_COUNT must be <= number of bits in sl_bitmap's storage type. */ +tlsf_static_assert(sizeof(unsigned int) * CHAR_BIT >= SL_INDEX_COUNT); + +/* Ensure we've properly tuned our sizes. */ +tlsf_static_assert(ALIGN_SIZE == SMALL_BLOCK_SIZE / SL_INDEX_COUNT); + +/* +** Data structures and associated constants. +*/ + +/* +** Block header structure. +** +** There are several implementation subtleties involved: +** - The prev_phys_block field is only valid if the previous block is free. +** - The prev_phys_block field is actually stored at the end of the +** previous block. It appears at the beginning of this structure only to +** simplify the implementation. +** - The next_free / prev_free fields are only valid if the block is free. +*/ +typedef struct block_header_t { + /* Points to the previous physical block. */ + struct block_header_t * prev_phys_block; + + /* The size of this block, excluding the block header. */ + size_t size; + + /* Next and previous free blocks. */ + struct block_header_t * next_free; + struct block_header_t * prev_free; +} block_header_t; + +/* +** Since block sizes are always at least a multiple of 4, the two least +** significant bits of the size field are used to store the block status: +** - bit 0: whether block is busy or free +** - bit 1: whether previous block is busy or free +*/ +static const size_t block_header_free_bit = 1 << 0; +static const size_t block_header_prev_free_bit = 1 << 1; + +/* +** The size of the block header exposed to used blocks is the size field. +** The prev_phys_block field is stored *inside* the previous free block. +*/ +static const size_t block_header_overhead = sizeof(size_t); + +/* User data starts directly after the size field in a used block. */ +static const size_t block_start_offset = + offsetof(block_header_t, size) + sizeof(size_t); + +/* +** A free block must be large enough to store its header minus the size of +** the prev_phys_block field, and no larger than the number of addressable +** bits for FL_INDEX. +*/ +static const size_t block_size_min = + sizeof(block_header_t) - sizeof(block_header_t *); +static const size_t block_size_max = tlsf_cast(size_t, 1) << FL_INDEX_MAX; + + +/* The TLSF control structure. */ +typedef struct control_t { + /* Empty lists point at this block to indicate they are free. */ + block_header_t block_null; + + /* Bitmaps for free lists. */ + unsigned int fl_bitmap; + unsigned int sl_bitmap[FL_INDEX_COUNT]; + + /* Head of free lists. */ + block_header_t * blocks[FL_INDEX_COUNT][SL_INDEX_COUNT]; +} control_t; + +/* A type used for casting when doing pointer arithmetic. */ +typedef ptrdiff_t tlsfptr_t; + +/* +** block_header_t member functions. +*/ + +static size_t block_size(const block_header_t * block) +{ + return block->size & ~(block_header_free_bit | block_header_prev_free_bit); +} + +static void block_set_size(block_header_t * block, size_t size) +{ + const size_t oldsize = block->size; + block->size = size | (oldsize & (block_header_free_bit | block_header_prev_free_bit)); +} + +static int block_is_last(const block_header_t * block) +{ + return block_size(block) == 0; +} + +static int block_is_free(const block_header_t * block) +{ + return tlsf_cast(int, block->size & block_header_free_bit); +} + +static void block_set_free(block_header_t * block) +{ + block->size |= block_header_free_bit; +} + +static void block_set_used(block_header_t * block) +{ + block->size &= ~block_header_free_bit; +} + +static int block_is_prev_free(const block_header_t * block) +{ + return tlsf_cast(int, block->size & block_header_prev_free_bit); +} + +static void block_set_prev_free(block_header_t * block) +{ + block->size |= block_header_prev_free_bit; +} + +static void block_set_prev_used(block_header_t * block) +{ + block->size &= ~block_header_prev_free_bit; +} + +static block_header_t * block_from_ptr(const void * ptr) +{ + return tlsf_cast(block_header_t *, + tlsf_cast(unsigned char *, ptr) - block_start_offset); +} + +static void * block_to_ptr(const block_header_t * block) +{ + return tlsf_cast(void *, + tlsf_cast(unsigned char *, block) + block_start_offset); +} + +/* Return location of next block after block of given size. */ +static block_header_t * offset_to_block(const void * ptr, size_t size) +{ + return tlsf_cast(block_header_t *, tlsf_cast(tlsfptr_t, ptr) + size); +} + +/* Return location of previous block. */ +static block_header_t * block_prev(const block_header_t * block) +{ + tlsf_assert(block_is_prev_free(block) && "previous block must be free"); + return block->prev_phys_block; +} + +/* Return location of next existing block. */ +static block_header_t * block_next(const block_header_t * block) +{ + block_header_t * next = offset_to_block(block_to_ptr(block), + block_size(block) - block_header_overhead); + tlsf_assert(!block_is_last(block)); + return next; +} + +/* Link a new block with its physical neighbor, return the neighbor. */ +static block_header_t * block_link_next(block_header_t * block) +{ + block_header_t * next = block_next(block); + next->prev_phys_block = block; + return next; +} + +static void block_mark_as_free(block_header_t * block) +{ + /* Link the block to the next block, first. */ + block_header_t * next = block_link_next(block); + block_set_prev_free(next); + block_set_free(block); +} + +static void block_mark_as_used(block_header_t * block) +{ + block_header_t * next = block_next(block); + block_set_prev_used(next); + block_set_used(block); +} + +static size_t align_up(size_t x, size_t align) +{ + tlsf_assert(0 == (align & (align - 1)) && "must align to a power of two"); + return (x + (align - 1)) & ~(align - 1); +} + +static size_t align_down(size_t x, size_t align) +{ + tlsf_assert(0 == (align & (align - 1)) && "must align to a power of two"); + return x - (x & (align - 1)); +} + +static void * align_ptr(const void * ptr, size_t align) +{ + const tlsfptr_t aligned = + (tlsf_cast(tlsfptr_t, ptr) + (align - 1)) & ~(align - 1); + tlsf_assert(0 == (align & (align - 1)) && "must align to a power of two"); + return tlsf_cast(void *, aligned); +} + +/* +** Adjust an allocation size to be aligned to word size, and no smaller +** than internal minimum. +*/ +static size_t adjust_request_size(size_t size, size_t align) +{ + size_t adjust = 0; + if(size) { + const size_t aligned = align_up(size, align); + + /* aligned sized must not exceed block_size_max or we'll go out of bounds on sl_bitmap */ + if(aligned < block_size_max) { + adjust = tlsf_max(aligned, block_size_min); + } + } + return adjust; +} + +/* +** TLSF utility functions. In most cases, these are direct translations of +** the documentation found in the white paper. +*/ + +static void mapping_insert(size_t size, int * fli, int * sli) +{ + int fl, sl; + if(size < SMALL_BLOCK_SIZE) { + /* Store small blocks in first list. */ + fl = 0; + sl = tlsf_cast(int, size) / (SMALL_BLOCK_SIZE / SL_INDEX_COUNT); + } + else { + fl = tlsf_fls_sizet(size); + sl = tlsf_cast(int, size >> (fl - SL_INDEX_COUNT_LOG2)) ^ (1 << SL_INDEX_COUNT_LOG2); + fl -= (FL_INDEX_SHIFT - 1); + } + *fli = fl; + *sli = sl; +} + +/* This version rounds up to the next block size (for allocations) */ +static void mapping_search(size_t size, int * fli, int * sli) +{ + if(size >= SMALL_BLOCK_SIZE) { + const size_t round = (1 << (tlsf_fls_sizet(size) - SL_INDEX_COUNT_LOG2)) - 1; + size += round; + } + mapping_insert(size, fli, sli); +} + +static block_header_t * search_suitable_block(control_t * control, int * fli, int * sli) +{ + int fl = *fli; + int sl = *sli; + + /* + ** First, search for a block in the list associated with the given + ** fl/sl index. + */ + unsigned int sl_map = control->sl_bitmap[fl] & (~0U << sl); + if(!sl_map) { + /* No block exists. Search in the next largest first-level list. */ + const unsigned int fl_map = control->fl_bitmap & (~0U << (fl + 1)); + if(!fl_map) { + /* No free blocks available, memory has been exhausted. */ + return 0; + } + + fl = tlsf_ffs(fl_map); + *fli = fl; + sl_map = control->sl_bitmap[fl]; + } + tlsf_assert(sl_map && "internal error - second level bitmap is null"); + sl = tlsf_ffs(sl_map); + *sli = sl; + + /* Return the first block in the free list. */ + return control->blocks[fl][sl]; +} + +/* Remove a free block from the free list.*/ +static void remove_free_block(control_t * control, block_header_t * block, int fl, int sl) +{ + block_header_t * prev = block->prev_free; + block_header_t * next = block->next_free; + tlsf_assert(prev && "prev_free field can not be null"); + tlsf_assert(next && "next_free field can not be null"); + next->prev_free = prev; + prev->next_free = next; + + /* If this block is the head of the free list, set new head. */ + if(control->blocks[fl][sl] == block) { + control->blocks[fl][sl] = next; + + /* If the new head is null, clear the bitmap. */ + if(next == &control->block_null) { + control->sl_bitmap[fl] &= ~(1U << sl); + + /* If the second bitmap is now empty, clear the fl bitmap. */ + if(!control->sl_bitmap[fl]) { + control->fl_bitmap &= ~(1U << fl); + } + } + } +} + +/* Insert a free block into the free block list. */ +static void insert_free_block(control_t * control, block_header_t * block, int fl, int sl) +{ + block_header_t * current = control->blocks[fl][sl]; + tlsf_assert(current && "free list cannot have a null entry"); + tlsf_assert(block && "cannot insert a null entry into the free list"); + block->next_free = current; + block->prev_free = &control->block_null; + current->prev_free = block; + + tlsf_assert(block_to_ptr(block) == align_ptr(block_to_ptr(block), ALIGN_SIZE) + && "block not aligned properly"); + /* + ** Insert the new block at the head of the list, and mark the first- + ** and second-level bitmaps appropriately. + */ + control->blocks[fl][sl] = block; + control->fl_bitmap |= (1U << fl); + control->sl_bitmap[fl] |= (1U << sl); +} + +/* Remove a given block from the free list. */ +static void block_remove(control_t * control, block_header_t * block) +{ + int fl, sl; + mapping_insert(block_size(block), &fl, &sl); + remove_free_block(control, block, fl, sl); +} + +/* Insert a given block into the free list. */ +static void block_insert(control_t * control, block_header_t * block) +{ + int fl, sl; + mapping_insert(block_size(block), &fl, &sl); + insert_free_block(control, block, fl, sl); +} + +static int block_can_split(block_header_t * block, size_t size) +{ + return block_size(block) >= sizeof(block_header_t) + size; +} + +/* Split a block into two, the second of which is free. */ +static block_header_t * block_split(block_header_t * block, size_t size) +{ + /* Calculate the amount of space left in the remaining block. */ + block_header_t * remaining = + offset_to_block(block_to_ptr(block), size - block_header_overhead); + + const size_t remain_size = block_size(block) - (size + block_header_overhead); + + tlsf_assert(block_to_ptr(remaining) == align_ptr(block_to_ptr(remaining), ALIGN_SIZE) + && "remaining block not aligned properly"); + + tlsf_assert(block_size(block) == remain_size + size + block_header_overhead); + block_set_size(remaining, remain_size); + tlsf_assert(block_size(remaining) >= block_size_min && "block split with invalid size"); + + block_set_size(block, size); + block_mark_as_free(remaining); + + return remaining; +} + +/* Absorb a free block's storage into an adjacent previous free block. */ +static block_header_t * block_absorb(block_header_t * prev, block_header_t * block) +{ + tlsf_assert(!block_is_last(prev) && "previous block can't be last"); + /* Note: Leaves flags untouched. */ + prev->size += block_size(block) + block_header_overhead; + block_link_next(prev); + return prev; +} + +/* Merge a just-freed block with an adjacent previous free block. */ +static block_header_t * block_merge_prev(control_t * control, block_header_t * block) +{ + if(block_is_prev_free(block)) { + block_header_t * prev = block_prev(block); + tlsf_assert(prev && "prev physical block can't be null"); + tlsf_assert(block_is_free(prev) && "prev block is not free though marked as such"); + block_remove(control, prev); + block = block_absorb(prev, block); + } + + return block; +} + +/* Merge a just-freed block with an adjacent free block. */ +static block_header_t * block_merge_next(control_t * control, block_header_t * block) +{ + block_header_t * next = block_next(block); + tlsf_assert(next && "next physical block can't be null"); + + if(block_is_free(next)) { + tlsf_assert(!block_is_last(block) && "previous block can't be last"); + block_remove(control, next); + block = block_absorb(block, next); + } + + return block; +} + +/* Trim any trailing block space off the end of a block, return to pool. */ +static void block_trim_free(control_t * control, block_header_t * block, size_t size) +{ + tlsf_assert(block_is_free(block) && "block must be free"); + if(block_can_split(block, size)) { + block_header_t * remaining_block = block_split(block, size); + block_link_next(block); + block_set_prev_free(remaining_block); + block_insert(control, remaining_block); + } +} + +/* Trim any trailing block space off the end of a used block, return to pool. */ +static void block_trim_used(control_t * control, block_header_t * block, size_t size) +{ + tlsf_assert(!block_is_free(block) && "block must be used"); + if(block_can_split(block, size)) { + /* If the next block is free, we must coalesce. */ + block_header_t * remaining_block = block_split(block, size); + block_set_prev_used(remaining_block); + + remaining_block = block_merge_next(control, remaining_block); + block_insert(control, remaining_block); + } +} + +static block_header_t * block_trim_free_leading(control_t * control, block_header_t * block, size_t size) +{ + block_header_t * remaining_block = block; + if(block_can_split(block, size)) { + /* We want the 2nd block. */ + remaining_block = block_split(block, size - block_header_overhead); + block_set_prev_free(remaining_block); + + block_link_next(block); + block_insert(control, block); + } + + return remaining_block; +} + +static block_header_t * block_locate_free(control_t * control, size_t size) +{ + int fl = 0, sl = 0; + block_header_t * block = 0; + + if(size) { + mapping_search(size, &fl, &sl); + + /* + ** mapping_search can futz with the size, so for excessively large sizes it can sometimes wind up + ** with indices that are off the end of the block array. + ** So, we protect against that here, since this is the only callsite of mapping_search. + ** Note that we don't need to check sl, since it comes from a modulo operation that guarantees it's always in range. + */ + if(fl < FL_INDEX_COUNT) { + block = search_suitable_block(control, &fl, &sl); + } + } + + if(block) { + tlsf_assert(block_size(block) >= size); + remove_free_block(control, block, fl, sl); + } + + return block; +} + +static void * block_prepare_used(control_t * control, block_header_t * block, size_t size) +{ + void * p = 0; + if(block) { + tlsf_assert(size && "size must be non-zero"); + block_trim_free(control, block, size); + block_mark_as_used(block); + p = block_to_ptr(block); + } + return p; +} + +/* Clear structure and point all empty lists at the null block. */ +static void control_constructor(control_t * control) +{ + int i, j; + + control->block_null.next_free = &control->block_null; + control->block_null.prev_free = &control->block_null; + + control->fl_bitmap = 0; + for(i = 0; i < FL_INDEX_COUNT; ++i) { + control->sl_bitmap[i] = 0; + for(j = 0; j < SL_INDEX_COUNT; ++j) { + control->blocks[i][j] = &control->block_null; + } + } +} + +/* +** Debugging utilities. +*/ + +typedef struct integrity_t { + int prev_status; + int status; +} integrity_t; + +#define tlsf_insist(x) { tlsf_assert(x); if (!(x)) { status--; } } + +static void integrity_walker(void * ptr, size_t size, int used, void * user) +{ + block_header_t * block = block_from_ptr(ptr); + integrity_t * integ = tlsf_cast(integrity_t *, user); + const int this_prev_status = block_is_prev_free(block) ? 1 : 0; + const int this_status = block_is_free(block) ? 1 : 0; + const size_t this_block_size = block_size(block); + + int status = 0; + LV_UNUSED(used); + tlsf_insist(integ->prev_status == this_prev_status && "prev status incorrect"); + tlsf_insist(size == this_block_size && "block size incorrect"); + + integ->prev_status = this_status; + integ->status += status; +} + +int lv_tlsf_check(lv_tlsf_t tlsf) +{ + int i, j; + + control_t * control = tlsf_cast(control_t *, tlsf); + int status = 0; + + /* Check that the free lists and bitmaps are accurate. */ + for(i = 0; i < FL_INDEX_COUNT; ++i) { + for(j = 0; j < SL_INDEX_COUNT; ++j) { + const int fl_map = control->fl_bitmap & (1U << i); + const int sl_list = control->sl_bitmap[i]; + const int sl_map = sl_list & (1U << j); + const block_header_t * block = control->blocks[i][j]; + + /* Check that first- and second-level lists agree. */ + if(!fl_map) { + tlsf_insist(!sl_map && "second-level map must be null"); + } + + if(!sl_map) { + tlsf_insist(block == &control->block_null && "block list must be null"); + continue; + } + + /* Check that there is at least one free block. */ + tlsf_insist(sl_list && "no free blocks in second-level map"); + tlsf_insist(block != &control->block_null && "block should not be null"); + + while(block != &control->block_null) { + int fli, sli; + tlsf_insist(block_is_free(block) && "block should be free"); + tlsf_insist(!block_is_prev_free(block) && "blocks should have coalesced"); + tlsf_insist(!block_is_free(block_next(block)) && "blocks should have coalesced"); + tlsf_insist(block_is_prev_free(block_next(block)) && "block should be free"); + tlsf_insist(block_size(block) >= block_size_min && "block not minimum size"); + + mapping_insert(block_size(block), &fli, &sli); + tlsf_insist(fli == i && sli == j && "block size indexed in wrong list"); + block = block->next_free; + } + } + } + + return status; +} + +#undef tlsf_insist + +static void default_walker(void * ptr, size_t size, int used, void * user) +{ + LV_UNUSED(user); + printf("\t%p %s size: %x (%p)\n", ptr, used ? "used" : "free", (unsigned int)size, (void *)block_from_ptr(ptr)); +} + +void lv_tlsf_walk_pool(lv_pool_t pool, lv_tlsf_walker walker, void * user) +{ + lv_tlsf_walker pool_walker = walker ? walker : default_walker; + block_header_t * block = + offset_to_block(pool, -(int)block_header_overhead); + + while(block && !block_is_last(block)) { + pool_walker( + block_to_ptr(block), + block_size(block), + !block_is_free(block), + user); + block = block_next(block); + } +} + +size_t lv_tlsf_block_size(void * ptr) +{ + size_t size = 0; + if(ptr) { + const block_header_t * block = block_from_ptr(ptr); + size = block_size(block); + } + return size; +} + +int lv_tlsf_check_pool(lv_pool_t pool) +{ + /* Check that the blocks are physically correct. */ + integrity_t integ = { 0, 0 }; + lv_tlsf_walk_pool(pool, integrity_walker, &integ); + + return integ.status; +} + +/* +** Size of the TLSF structures in a given memory block passed to +** lv_tlsf_create, equal to the size of a control_t +*/ +size_t lv_tlsf_size(void) +{ + return sizeof(control_t); +} + +size_t lv_tlsf_align_size(void) +{ + return ALIGN_SIZE; +} + +size_t lv_tlsf_block_size_min(void) +{ + return block_size_min; +} + +size_t lv_tlsf_block_size_max(void) +{ + return block_size_max; +} + +/* +** Overhead of the TLSF structures in a given memory block passed to +** lv_tlsf_add_pool, equal to the overhead of a free block and the +** sentinel block. +*/ +size_t lv_tlsf_pool_overhead(void) +{ + return 2 * block_header_overhead; +} + +size_t lv_tlsf_alloc_overhead(void) +{ + return block_header_overhead; +} + +lv_pool_t lv_tlsf_add_pool(lv_tlsf_t tlsf, void * mem, size_t bytes) +{ + block_header_t * block; + block_header_t * next; + + const size_t pool_overhead = lv_tlsf_pool_overhead(); + const size_t pool_bytes = align_down(bytes - pool_overhead, ALIGN_SIZE); + + if(((ptrdiff_t)mem % ALIGN_SIZE) != 0) { + printf("lv_tlsf_add_pool: Memory must be aligned by %u bytes.\n", + (unsigned int)ALIGN_SIZE); + return 0; + } + + if(pool_bytes < block_size_min || pool_bytes > block_size_max) { +#if defined (TLSF_64BIT) + printf("lv_tlsf_add_pool: Memory size must be between 0x%x and 0x%x00 bytes.\n", + (unsigned int)(pool_overhead + block_size_min), + (unsigned int)((pool_overhead + block_size_max) / 256)); +#else + printf("lv_tlsf_add_pool: Memory size must be between %u and %u bytes.\n", + (unsigned int)(pool_overhead + block_size_min), + (unsigned int)(pool_overhead + block_size_max)); +#endif + return 0; + } + + /* + ** Create the main free block. Offset the start of the block slightly + ** so that the prev_phys_block field falls outside of the pool - + ** it will never be used. + */ + block = offset_to_block(mem, -(tlsfptr_t)block_header_overhead); + block_set_size(block, pool_bytes); + block_set_free(block); + block_set_prev_used(block); + block_insert(tlsf_cast(control_t *, tlsf), block); + + /* Split the block to create a zero-size sentinel block. */ + next = block_link_next(block); + block_set_size(next, 0); + block_set_used(next); + block_set_prev_free(next); + + return mem; +} + +void lv_tlsf_remove_pool(lv_tlsf_t tlsf, lv_pool_t pool) +{ + control_t * control = tlsf_cast(control_t *, tlsf); + block_header_t * block = offset_to_block(pool, -(int)block_header_overhead); + + int fl = 0, sl = 0; + + tlsf_assert(block_is_free(block) && "block should be free"); + tlsf_assert(!block_is_free(block_next(block)) && "next block should not be free"); + tlsf_assert(block_size(block_next(block)) == 0 && "next block size should be zero"); + + mapping_insert(block_size(block), &fl, &sl); + remove_free_block(control, block, fl, sl); +} + +/* +** TLSF main interface. +*/ + +#if _DEBUG +int test_ffs_fls() +{ + /* Verify ffs/fls work properly. */ + int rv = 0; + rv += (tlsf_ffs(0) == -1) ? 0 : 0x1; + rv += (tlsf_fls(0) == -1) ? 0 : 0x2; + rv += (tlsf_ffs(1) == 0) ? 0 : 0x4; + rv += (tlsf_fls(1) == 0) ? 0 : 0x8; + rv += (tlsf_ffs(0x80000000) == 31) ? 0 : 0x10; + rv += (tlsf_ffs(0x80008000) == 15) ? 0 : 0x20; + rv += (tlsf_fls(0x80000008) == 31) ? 0 : 0x40; + rv += (tlsf_fls(0x7FFFFFFF) == 30) ? 0 : 0x80; + +#if defined (TLSF_64BIT) + rv += (tlsf_fls_sizet(0x80000000) == 31) ? 0 : 0x100; + rv += (tlsf_fls_sizet(0x100000000) == 32) ? 0 : 0x200; + rv += (tlsf_fls_sizet(0xffffffffffffffff) == 63) ? 0 : 0x400; +#endif + + if(rv) { + printf("test_ffs_fls: %x ffs/fls tests failed.\n", rv); + } + return rv; +} +#endif + +lv_tlsf_t lv_tlsf_create(void * mem) +{ +#if _DEBUG + if(test_ffs_fls()) { + return 0; + } +#endif + + if(((tlsfptr_t)mem % ALIGN_SIZE) != 0) { + printf("lv_tlsf_create: Memory must be aligned to %u bytes.\n", + (unsigned int)ALIGN_SIZE); + return 0; + } + + control_constructor(tlsf_cast(control_t *, mem)); + + return tlsf_cast(lv_tlsf_t, mem); +} + +lv_tlsf_t lv_tlsf_create_with_pool(void * mem, size_t bytes) +{ + lv_tlsf_t tlsf = lv_tlsf_create(mem); + lv_tlsf_add_pool(tlsf, (char *)mem + lv_tlsf_size(), bytes - lv_tlsf_size()); + return tlsf; +} + +void lv_tlsf_destroy(lv_tlsf_t tlsf) +{ + /* Nothing to do. */ + LV_UNUSED(tlsf); +} + +lv_pool_t lv_tlsf_get_pool(lv_tlsf_t tlsf) +{ + return tlsf_cast(lv_pool_t, (char *)tlsf + lv_tlsf_size()); +} + +void * lv_tlsf_malloc(lv_tlsf_t tlsf, size_t size) +{ + control_t * control = tlsf_cast(control_t *, tlsf); + const size_t adjust = adjust_request_size(size, ALIGN_SIZE); + block_header_t * block = block_locate_free(control, adjust); + return block_prepare_used(control, block, adjust); +} + +void * lv_tlsf_memalign(lv_tlsf_t tlsf, size_t align, size_t size) +{ + control_t * control = tlsf_cast(control_t *, tlsf); + const size_t adjust = adjust_request_size(size, ALIGN_SIZE); + + /* + ** We must allocate an additional minimum block size bytes so that if + ** our free block will leave an alignment gap which is smaller, we can + ** trim a leading free block and release it back to the pool. We must + ** do this because the previous physical block is in use, therefore + ** the prev_phys_block field is not valid, and we can't simply adjust + ** the size of that block. + */ + const size_t gap_minimum = sizeof(block_header_t); + const size_t size_with_gap = adjust_request_size(adjust + align + gap_minimum, align); + + /* + ** If alignment is less than or equals base alignment, we're done. + ** If we requested 0 bytes, return null, as lv_tlsf_malloc(0) does. + */ + const size_t aligned_size = (adjust && align > ALIGN_SIZE) ? size_with_gap : adjust; + + block_header_t * block = block_locate_free(control, aligned_size); + + /* This can't be a static assert. */ + tlsf_assert(sizeof(block_header_t) == block_size_min + block_header_overhead); + + if(block) { + void * ptr = block_to_ptr(block); + void * aligned = align_ptr(ptr, align); + size_t gap = tlsf_cast(size_t, + tlsf_cast(tlsfptr_t, aligned) - tlsf_cast(tlsfptr_t, ptr)); + + /* If gap size is too small, offset to next aligned boundary. */ + if(gap && gap < gap_minimum) { + const size_t gap_remain = gap_minimum - gap; + const size_t offset = tlsf_max(gap_remain, align); + const void * next_aligned = tlsf_cast(void *, + tlsf_cast(tlsfptr_t, aligned) + offset); + + aligned = align_ptr(next_aligned, align); + gap = tlsf_cast(size_t, + tlsf_cast(tlsfptr_t, aligned) - tlsf_cast(tlsfptr_t, ptr)); + } + + if(gap) { + tlsf_assert(gap >= gap_minimum && "gap size too small"); + block = block_trim_free_leading(control, block, gap); + } + } + + return block_prepare_used(control, block, adjust); +} + +size_t lv_tlsf_free(lv_tlsf_t tlsf, const void * ptr) +{ + size_t size = 0; + /* Don't attempt to free a NULL pointer. */ + if(ptr) { + control_t * control = tlsf_cast(control_t *, tlsf); + block_header_t * block = block_from_ptr(ptr); + tlsf_assert(!block_is_free(block) && "block already marked as free"); + size = block->size; + block_mark_as_free(block); + block = block_merge_prev(control, block); + block = block_merge_next(control, block); + block_insert(control, block); + } + + return size; +} + +/* +** The TLSF block information provides us with enough information to +** provide a reasonably intelligent implementation of realloc, growing or +** shrinking the currently allocated block as required. +** +** This routine handles the somewhat esoteric edge cases of realloc: +** - a non-zero size with a null pointer will behave like malloc +** - a zero size with a non-null pointer will behave like free +** - a request that cannot be satisfied will leave the original buffer +** untouched +** - an extended buffer size will leave the newly-allocated area with +** contents undefined +*/ +void * lv_tlsf_realloc(lv_tlsf_t tlsf, void * ptr, size_t size) +{ + control_t * control = tlsf_cast(control_t *, tlsf); + void * p = 0; + + /* Zero-size requests are treated as free. */ + if(ptr && size == 0) { + lv_tlsf_free(tlsf, ptr); + } + /* Requests with NULL pointers are treated as malloc. */ + else if(!ptr) { + p = lv_tlsf_malloc(tlsf, size); + } + else { + block_header_t * block = block_from_ptr(ptr); + block_header_t * next = block_next(block); + + const size_t cursize = block_size(block); + const size_t combined = cursize + block_size(next) + block_header_overhead; + const size_t adjust = adjust_request_size(size, ALIGN_SIZE); + if(size > cursize && adjust == 0) { + /* The request is probably too large, fail */ + return NULL; + } + + tlsf_assert(!block_is_free(block) && "block already marked as free"); + + /* + ** If the next block is used, or when combined with the current + ** block, does not offer enough space, we must reallocate and copy. + */ + if(adjust > cursize && (!block_is_free(next) || adjust > combined)) { + p = lv_tlsf_malloc(tlsf, size); + if(p) { + const size_t minsize = tlsf_min(cursize, size); + lv_memcpy(p, ptr, minsize); + lv_tlsf_free(tlsf, ptr); + } + } + else { + /* Do we need to expand to the next block? */ + if(adjust > cursize) { + block_merge_next(control, block); + block_mark_as_used(block); + } + + /* Trim the resulting block and return the original pointer. */ + block_trim_used(control, block, adjust); + p = ptr; + } + } + + return p; +} + +#endif /* LV_MEM_CUSTOM == 0 */ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_tlsf.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_tlsf.h new file mode 100644 index 0000000..f12590b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_tlsf.h @@ -0,0 +1,95 @@ +#include "../lv_conf_internal.h" +#if LV_MEM_CUSTOM == 0 + +#ifndef LV_TLSF_H +#define LV_TLSF_H + +/* +** Two Level Segregated Fit memory allocator, version 3.1. +** Written by Matthew Conte +** http://tlsf.baisoku.org +** +** Based on the original documentation by Miguel Masmano: +** http://www.gii.upv.es/tlsf/main/docs +** +** This implementation was written to the specification +** of the document, therefore no GPL restrictions apply. +** +** Copyright (c) 2006-2016, Matthew Conte +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** * Neither the name of the copyright holder nor the +** names of its contributors may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL MATTHEW CONTE BE LIABLE FOR ANY +** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +/* lv_tlsf_t: a TLSF structure. Can contain 1 to N pools. */ +/* lv_pool_t: a block of memory that TLSF can manage. */ +typedef void * lv_tlsf_t; +typedef void * lv_pool_t; + +/* Create/destroy a memory pool. */ +lv_tlsf_t lv_tlsf_create(void * mem); +lv_tlsf_t lv_tlsf_create_with_pool(void * mem, size_t bytes); +void lv_tlsf_destroy(lv_tlsf_t tlsf); +lv_pool_t lv_tlsf_get_pool(lv_tlsf_t tlsf); + +/* Add/remove memory pools. */ +lv_pool_t lv_tlsf_add_pool(lv_tlsf_t tlsf, void * mem, size_t bytes); +void lv_tlsf_remove_pool(lv_tlsf_t tlsf, lv_pool_t pool); + +/* malloc/memalign/realloc/free replacements. */ +void * lv_tlsf_malloc(lv_tlsf_t tlsf, size_t bytes); +void * lv_tlsf_memalign(lv_tlsf_t tlsf, size_t align, size_t bytes); +void * lv_tlsf_realloc(lv_tlsf_t tlsf, void * ptr, size_t size); +size_t lv_tlsf_free(lv_tlsf_t tlsf, const void * ptr); + +/* Returns internal block size, not original request size */ +size_t lv_tlsf_block_size(void * ptr); + +/* Overheads/limits of internal structures. */ +size_t lv_tlsf_size(void); +size_t lv_tlsf_align_size(void); +size_t lv_tlsf_block_size_min(void); +size_t lv_tlsf_block_size_max(void); +size_t lv_tlsf_pool_overhead(void); +size_t lv_tlsf_alloc_overhead(void); + +/* Debugging. */ +typedef void (*lv_tlsf_walker)(void * ptr, size_t size, int used, void * user); +void lv_tlsf_walk_pool(lv_pool_t pool, lv_tlsf_walker walker, void * user); +/* Returns nonzero if any internal consistency check fails. */ +int lv_tlsf_check(lv_tlsf_t tlsf); +int lv_tlsf_check_pool(lv_pool_t pool); + +#if defined(__cplusplus) +}; +#endif + +#endif /*LV_TLSF_H*/ + +#endif /* LV_MEM_CUSTOM == 0 */ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_txt.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_txt.c new file mode 100644 index 0000000..da7eca0 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_txt.c @@ -0,0 +1,864 @@ +/** + * @file lv_txt.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include +#include "lv_txt.h" +#include "lv_txt_ap.h" +#include "lv_math.h" +#include "lv_log.h" +#include "lv_mem.h" +#include "lv_assert.h" + +/********************* + * DEFINES + *********************/ +#define NO_BREAK_FOUND UINT32_MAX + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +#if LV_TXT_ENC == LV_TXT_ENC_UTF8 + static uint8_t lv_txt_utf8_size(const char * str); + static uint32_t lv_txt_unicode_to_utf8(uint32_t letter_uni); + static uint32_t lv_txt_utf8_conv_wc(uint32_t c); + static uint32_t lv_txt_utf8_next(const char * txt, uint32_t * i); + static uint32_t lv_txt_utf8_prev(const char * txt, uint32_t * i_start); + static uint32_t lv_txt_utf8_get_byte_id(const char * txt, uint32_t utf8_id); + static uint32_t lv_txt_utf8_get_char_id(const char * txt, uint32_t byte_id); + static uint32_t lv_txt_utf8_get_length(const char * txt); +#elif LV_TXT_ENC == LV_TXT_ENC_ASCII + static uint8_t lv_txt_iso8859_1_size(const char * str); + static uint32_t lv_txt_unicode_to_iso8859_1(uint32_t letter_uni); + static uint32_t lv_txt_iso8859_1_conv_wc(uint32_t c); + static uint32_t lv_txt_iso8859_1_next(const char * txt, uint32_t * i); + static uint32_t lv_txt_iso8859_1_prev(const char * txt, uint32_t * i_start); + static uint32_t lv_txt_iso8859_1_get_byte_id(const char * txt, uint32_t utf8_id); + static uint32_t lv_txt_iso8859_1_get_char_id(const char * txt, uint32_t byte_id); + static uint32_t lv_txt_iso8859_1_get_length(const char * txt); +#endif +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ +#if LV_TXT_ENC == LV_TXT_ENC_UTF8 + uint8_t (*_lv_txt_encoded_size)(const char *) = lv_txt_utf8_size; + uint32_t (*_lv_txt_unicode_to_encoded)(uint32_t) = lv_txt_unicode_to_utf8; + uint32_t (*_lv_txt_encoded_conv_wc)(uint32_t) = lv_txt_utf8_conv_wc; + uint32_t (*_lv_txt_encoded_next)(const char *, uint32_t *) = lv_txt_utf8_next; + uint32_t (*_lv_txt_encoded_prev)(const char *, uint32_t *) = lv_txt_utf8_prev; + uint32_t (*_lv_txt_encoded_get_byte_id)(const char *, uint32_t) = lv_txt_utf8_get_byte_id; + uint32_t (*_lv_txt_encoded_get_char_id)(const char *, uint32_t) = lv_txt_utf8_get_char_id; + uint32_t (*_lv_txt_get_encoded_length)(const char *) = lv_txt_utf8_get_length; +#elif LV_TXT_ENC == LV_TXT_ENC_ASCII + uint8_t (*_lv_txt_encoded_size)(const char *) = lv_txt_iso8859_1_size; + uint32_t (*_lv_txt_unicode_to_encoded)(uint32_t) = lv_txt_unicode_to_iso8859_1; + uint32_t (*_lv_txt_encoded_conv_wc)(uint32_t) = lv_txt_iso8859_1_conv_wc; + uint32_t (*_lv_txt_encoded_next)(const char *, uint32_t *) = lv_txt_iso8859_1_next; + uint32_t (*_lv_txt_encoded_prev)(const char *, uint32_t *) = lv_txt_iso8859_1_prev; + uint32_t (*_lv_txt_encoded_get_byte_id)(const char *, uint32_t) = lv_txt_iso8859_1_get_byte_id; + uint32_t (*_lv_txt_encoded_get_char_id)(const char *, uint32_t) = lv_txt_iso8859_1_get_char_id; + uint32_t (*_lv_txt_get_encoded_length)(const char *) = lv_txt_iso8859_1_get_length; + +#endif + +/********************** + * MACROS + **********************/ + +#define LV_IS_ASCII(value) ((value & 0x80U) == 0x00U) +#define LV_IS_2BYTES_UTF8_CODE(value) ((value & 0xE0U) == 0xC0U) +#define LV_IS_3BYTES_UTF8_CODE(value) ((value & 0xF0U) == 0xE0U) +#define LV_IS_4BYTES_UTF8_CODE(value) ((value & 0xF8U) == 0xF0U) +#define LV_IS_INVALID_UTF8_CODE(value) ((value & 0xC0U) != 0x80U) + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_txt_get_size(lv_point_t * size_res, const char * text, const lv_font_t * font, lv_coord_t letter_space, + lv_coord_t line_space, lv_coord_t max_width, lv_text_flag_t flag) +{ + size_res->x = 0; + size_res->y = 0; + + if(text == NULL) return; + if(font == NULL) return; + + if(flag & LV_TEXT_FLAG_EXPAND) max_width = LV_COORD_MAX; + + uint32_t line_start = 0; + uint32_t new_line_start = 0; + uint16_t letter_height = lv_font_get_line_height(font); + + /*Calc. the height and longest line*/ + while(text[line_start] != '\0') { + new_line_start += _lv_txt_get_next_line(&text[line_start], font, letter_space, max_width, NULL, flag); + + if((unsigned long)size_res->y + (unsigned long)letter_height + (unsigned long)line_space > LV_MAX_OF(lv_coord_t)) { + LV_LOG_WARN("lv_txt_get_size: integer overflow while calculating text height"); + return; + } + else { + size_res->y += letter_height; + size_res->y += line_space; + } + + /*Calculate the longest line*/ + lv_coord_t act_line_length = lv_txt_get_width(&text[line_start], new_line_start - line_start, font, letter_space, + flag); + + size_res->x = LV_MAX(act_line_length, size_res->x); + line_start = new_line_start; + } + + /*Make the text one line taller if the last character is '\n' or '\r'*/ + if((line_start != 0) && (text[line_start - 1] == '\n' || text[line_start - 1] == '\r')) { + size_res->y += letter_height + line_space; + } + + /*Correction with the last line space or set the height manually if the text is empty*/ + if(size_res->y == 0) + size_res->y = letter_height; + else + size_res->y -= line_space; +} + +/** + * Get the next word of text. A word is delimited by break characters. + * + * If the word cannot fit in the max_width space, obey LV_TXT_LINE_BREAK_LONG_* rules. + * + * If the next word cannot fit anything, return 0. + * + * If the first character is a break character, returns the next index. + * + * Example calls from lv_txt_get_next_line() assuming sufficient max_width and + * txt = "Test text\n" + * 0123456789 + * + * Calls would be as follows: + * 1. Return i=4, pointing at breakchar ' ', for the string "Test" + * 2. Return i=5, since i=4 was a breakchar. + * 3. Return i=9, pointing at breakchar '\n' + * 4. Parenting lv_txt_get_next_line() would detect subsequent '\0' + * + * TODO: Returned word_w_ptr may overestimate the returned word's width when + * max_width is reached. In current usage, this has no impact. + * + * @param txt a '\0' terminated string + * @param font pointer to a font + * @param letter_space letter space + * @param max_width max width of the text (break the lines to fit this size). Set COORD_MAX to avoid line breaks + * @param flags settings for the text from 'txt_flag_type' enum + * @param[out] word_w_ptr width (in pixels) of the parsed word. May be NULL. + * @param cmd_state pointer to a txt_cmd_state_t variable which stores the current state of command processing + * @param force Force return the fraction of the word that can fit in the provided space. + * @return the index of the first char of the next word (in byte index not letter index. With UTF-8 they are different) + */ +static uint32_t lv_txt_get_next_word(const char * txt, const lv_font_t * font, + lv_coord_t letter_space, lv_coord_t max_width, + lv_text_flag_t flag, uint32_t * word_w_ptr, lv_text_cmd_state_t * cmd_state, bool force) +{ + if(txt == NULL || txt[0] == '\0') return 0; + if(font == NULL) return 0; + + if(flag & LV_TEXT_FLAG_EXPAND) max_width = LV_COORD_MAX; + + uint32_t i = 0, i_next = 0, i_next_next = 0; /*Iterating index into txt*/ + uint32_t letter = 0; /*Letter at i*/ + uint32_t letter_next = 0; /*Letter at i_next*/ + lv_coord_t letter_w; + lv_coord_t cur_w = 0; /*Pixel Width of transversed string*/ + uint32_t word_len = 0; /*Number of characters in the transversed word*/ + uint32_t break_index = NO_BREAK_FOUND; /*only used for "long" words*/ + uint32_t break_letter_count = 0; /*Number of characters up to the long word break point*/ + + letter = _lv_txt_encoded_next(txt, &i_next); + i_next_next = i_next; + + /*Obtain the full word, regardless if it fits or not in max_width*/ + while(txt[i] != '\0') { + letter_next = _lv_txt_encoded_next(txt, &i_next_next); + word_len++; + + /*Handle the recolor command*/ + if((flag & LV_TEXT_FLAG_RECOLOR) != 0) { + if(_lv_txt_is_cmd(cmd_state, letter) != false) { + i = i_next; + i_next = i_next_next; + letter = letter_next; + continue; /*Skip the letter if it is part of a command*/ + } + } + + letter_w = lv_font_get_glyph_width(font, letter, letter_next); + cur_w += letter_w; + + if(letter_w > 0) { + cur_w += letter_space; + } + + /*Test if this character fits within max_width*/ + if(break_index == NO_BREAK_FOUND && (cur_w - letter_space) > max_width) { + break_index = i; + break_letter_count = word_len - 1; + /*break_index is now pointing at the character that doesn't fit*/ + } + + /*Check for new line chars and breakchars*/ + if(letter == '\n' || letter == '\r' || _lv_txt_is_break_char(letter)) { + /*Update the output width on the first character if it fits. + *Must do this here in case first letter is a break character.*/ + if(i == 0 && break_index == NO_BREAK_FOUND && word_w_ptr != NULL) *word_w_ptr = cur_w; + word_len--; + break; + } + + /*Update the output width*/ + if(word_w_ptr != NULL && break_index == NO_BREAK_FOUND) *word_w_ptr = cur_w; + + i = i_next; + i_next = i_next_next; + letter = letter_next; + } + + /*Entire Word fits in the provided space*/ + if(break_index == NO_BREAK_FOUND) { + if(word_len == 0 || (letter == '\r' && letter_next == '\n')) i = i_next; + return i; + } + +#if LV_TXT_LINE_BREAK_LONG_LEN > 0 + /*Word doesn't fit in provided space, but isn't "long"*/ + if(word_len < LV_TXT_LINE_BREAK_LONG_LEN) { + if(force) return break_index; + if(word_w_ptr != NULL) *word_w_ptr = 0; /*Return no word*/ + return 0; + } + + /*Word is "long," but insufficient amounts can fit in provided space*/ + if(break_letter_count < LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN) { + if(force) return break_index; + if(word_w_ptr != NULL) *word_w_ptr = 0; + return 0; + } + + /*Word is a "long", but letters may need to be better distributed*/ + { + i = break_index; + int32_t n_move = LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN - (word_len - break_letter_count); + /*Move pointer "i" backwards*/ + for(; n_move > 0; n_move--) { + _lv_txt_encoded_prev(txt, &i); + // TODO: it would be appropriate to update the returned word width here + // However, in current usage, this doesn't impact anything. + } + } + return i; +#else + if(force) return break_index; + if(word_w_ptr != NULL) *word_w_ptr = 0; /*Return no word*/ + (void) break_letter_count; + return 0; +#endif +} + +uint32_t _lv_txt_get_next_line(const char * txt, const lv_font_t * font, + lv_coord_t letter_space, lv_coord_t max_width, + lv_coord_t * used_width, lv_text_flag_t flag) +{ + if(used_width) *used_width = 0; + + if(txt == NULL) return 0; + if(txt[0] == '\0') return 0; + if(font == NULL) return 0; + + lv_coord_t line_w = 0; + + /*If max_width doesn't mater simply find the new line character + *without thinking about word wrapping*/ + if((flag & LV_TEXT_FLAG_EXPAND) || (flag & LV_TEXT_FLAG_FIT)) { + uint32_t i; + for(i = 0; txt[i] != '\n' && txt[i] != '\r' && txt[i] != '\0'; i++) { + /*Just find the new line chars or string ends by incrementing `i`*/ + } + if(txt[i] != '\0') i++; /*To go beyond `\n`*/ + if(used_width) *used_width = -1; + return i; + } + + if(flag & LV_TEXT_FLAG_EXPAND) max_width = LV_COORD_MAX; + lv_text_cmd_state_t cmd_state = LV_TEXT_CMD_STATE_WAIT; + uint32_t i = 0; /*Iterating index into txt*/ + + while(txt[i] != '\0' && max_width > 0) { + uint32_t word_w = 0; + uint32_t advance = lv_txt_get_next_word(&txt[i], font, letter_space, max_width, flag, &word_w, &cmd_state, i == 0); + max_width -= word_w; + line_w += word_w; + + if(advance == 0) { + break; + } + + i += advance; + + if(txt[0] == '\n' || txt[0] == '\r') break; + + if(txt[i] == '\n' || txt[i] == '\r') { + i++; /*Include the following newline in the current line*/ + break; + } + + } + + /*Always step at least one to avoid infinite loops*/ + if(i == 0) { + uint32_t letter = _lv_txt_encoded_next(txt, &i); + if(used_width != NULL) { + line_w = lv_font_get_glyph_width(font, letter, '\0'); + } + } + + if(used_width != NULL) { + *used_width = line_w; + } + + return i; +} + +lv_coord_t lv_txt_get_width(const char * txt, uint32_t length, const lv_font_t * font, lv_coord_t letter_space, + lv_text_flag_t flag) +{ + if(txt == NULL) return 0; + if(font == NULL) return 0; + if(txt[0] == '\0') return 0; + + uint32_t i = 0; + lv_coord_t width = 0; + lv_text_cmd_state_t cmd_state = LV_TEXT_CMD_STATE_WAIT; + + if(length != 0) { + while(i < length) { + uint32_t letter; + uint32_t letter_next; + _lv_txt_encoded_letter_next_2(txt, &letter, &letter_next, &i); + + if((flag & LV_TEXT_FLAG_RECOLOR) != 0) { + if(_lv_txt_is_cmd(&cmd_state, letter) != false) { + continue; + } + } + + lv_coord_t char_width = lv_font_get_glyph_width(font, letter, letter_next); + if(char_width > 0) { + width += char_width; + width += letter_space; + } + } + + if(width > 0) { + width -= letter_space; /*Trim the last letter space. Important if the text is center + aligned*/ + } + } + + return width; +} + +bool _lv_txt_is_cmd(lv_text_cmd_state_t * state, uint32_t c) +{ + bool ret = false; + + if(c == (uint32_t)LV_TXT_COLOR_CMD[0]) { + if(*state == LV_TEXT_CMD_STATE_WAIT) { /*Start char*/ + *state = LV_TEXT_CMD_STATE_PAR; + ret = true; + } + /*Other start char in parameter is escaped cmd. char*/ + else if(*state == LV_TEXT_CMD_STATE_PAR) { + *state = LV_TEXT_CMD_STATE_WAIT; + } + /*Command end*/ + else if(*state == LV_TEXT_CMD_STATE_IN) { + *state = LV_TEXT_CMD_STATE_WAIT; + ret = true; + } + } + + /*Skip the color parameter and wait the space after it*/ + if(*state == LV_TEXT_CMD_STATE_PAR) { + if(c == ' ') { + *state = LV_TEXT_CMD_STATE_IN; /*After the parameter the text is in the command*/ + } + ret = true; + } + + return ret; +} + +void _lv_txt_ins(char * txt_buf, uint32_t pos, const char * ins_txt) +{ + if(txt_buf == NULL || ins_txt == NULL) return; + + size_t old_len = strlen(txt_buf); + size_t ins_len = strlen(ins_txt); + if(ins_len == 0) return; + + size_t new_len = ins_len + old_len; + pos = _lv_txt_encoded_get_byte_id(txt_buf, pos); /*Convert to byte index instead of letter index*/ + + /*Copy the second part into the end to make place to text to insert*/ + size_t i; + for(i = new_len; i >= pos + ins_len; i--) { + txt_buf[i] = txt_buf[i - ins_len]; + } + + /*Copy the text into the new space*/ + lv_memcpy_small(txt_buf + pos, ins_txt, ins_len); +} + +void _lv_txt_cut(char * txt, uint32_t pos, uint32_t len) +{ + if(txt == NULL) return; + + size_t old_len = strlen(txt); + + pos = _lv_txt_encoded_get_byte_id(txt, pos); /*Convert to byte index instead of letter index*/ + len = _lv_txt_encoded_get_byte_id(&txt[pos], len); + + /*Copy the second part into the end to make place to text to insert*/ + uint32_t i; + for(i = pos; i <= old_len - len; i++) { + txt[i] = txt[i + len]; + } +} + +char * _lv_txt_set_text_vfmt(const char * fmt, va_list ap) +{ + /*Allocate space for the new text by using trick from C99 standard section 7.19.6.12*/ + va_list ap_copy; + va_copy(ap_copy, ap); + uint32_t len = lv_vsnprintf(NULL, 0, fmt, ap_copy); + va_end(ap_copy); + + char * text = 0; +#if LV_USE_ARABIC_PERSIAN_CHARS + /*Put together the text according to the format string*/ + char * raw_txt = lv_mem_buf_get(len + 1); + LV_ASSERT_MALLOC(raw_txt); + if(raw_txt == NULL) { + return NULL; + } + + lv_vsnprintf(raw_txt, len + 1, fmt, ap); + + /*Get the size of the Arabic text and process it*/ + size_t len_ap = _lv_txt_ap_calc_bytes_cnt(raw_txt); + text = lv_mem_alloc(len_ap + 1); + LV_ASSERT_MALLOC(text); + if(text == NULL) { + return NULL; + } + _lv_txt_ap_proc(raw_txt, text); + + lv_mem_buf_release(raw_txt); +#else + text = lv_mem_alloc(len + 1); + LV_ASSERT_MALLOC(text); + if(text == NULL) { + return NULL; + } + text[len] = 0; /*Ensure NULL termination*/ + + lv_vsnprintf(text, len + 1, fmt, ap); +#endif + + return text; +} + +void _lv_txt_encoded_letter_next_2(const char * txt, uint32_t * letter, uint32_t * letter_next, uint32_t * ofs) +{ + *letter = _lv_txt_encoded_next(txt, ofs); + *letter_next = *letter != '\0' ? _lv_txt_encoded_next(&txt[*ofs], NULL) : 0; +} + +#if LV_TXT_ENC == LV_TXT_ENC_UTF8 +/******************************* + * UTF-8 ENCODER/DECODER + ******************************/ + +/** + * Give the size of an UTF-8 coded character + * @param str pointer to a character in a string + * @return length of the UTF-8 character (1,2,3 or 4), 0 on invalid code. + */ +static uint8_t lv_txt_utf8_size(const char * str) +{ + if(LV_IS_ASCII(str[0])) + return 1; + else if(LV_IS_2BYTES_UTF8_CODE(str[0])) + return 2; + else if(LV_IS_3BYTES_UTF8_CODE(str[0])) + return 3; + else if(LV_IS_4BYTES_UTF8_CODE(str[0])) + return 4; + return 0; +} + +/** + * Convert a Unicode letter to UTF-8. + * @param letter_uni a Unicode letter + * @return UTF-8 coded character in Little Endian to be compatible with C chars (e.g. 'Ã', 'Ű') + */ +static uint32_t lv_txt_unicode_to_utf8(uint32_t letter_uni) +{ + if(letter_uni < 128) return letter_uni; + uint8_t bytes[4]; + + if(letter_uni < 0x0800) { + bytes[0] = ((letter_uni >> 6) & 0x1F) | 0xC0; + bytes[1] = ((letter_uni >> 0) & 0x3F) | 0x80; + bytes[2] = 0; + bytes[3] = 0; + } + else if(letter_uni < 0x010000) { + bytes[0] = ((letter_uni >> 12) & 0x0F) | 0xE0; + bytes[1] = ((letter_uni >> 6) & 0x3F) | 0x80; + bytes[2] = ((letter_uni >> 0) & 0x3F) | 0x80; + bytes[3] = 0; + } + else if(letter_uni < 0x110000) { + bytes[0] = ((letter_uni >> 18) & 0x07) | 0xF0; + bytes[1] = ((letter_uni >> 12) & 0x3F) | 0x80; + bytes[2] = ((letter_uni >> 6) & 0x3F) | 0x80; + bytes[3] = ((letter_uni >> 0) & 0x3F) | 0x80; + } + else { + return 0; + } + + uint32_t * res_p = (uint32_t *)bytes; + return *res_p; +} + +/** + * Convert a wide character, e.g. 'Ã' little endian to be UTF-8 compatible + * @param c a wide character or a Little endian number + * @return `c` in big endian + */ +static uint32_t lv_txt_utf8_conv_wc(uint32_t c) +{ +#if LV_BIG_ENDIAN_SYSTEM == 0 + /*Swap the bytes (UTF-8 is big endian, but the MCUs are little endian)*/ + if((c & 0x80) != 0) { + uint32_t swapped; + uint8_t c8[4]; + lv_memcpy_small(c8, &c, 4); + swapped = (c8[0] << 24) + (c8[1] << 16) + (c8[2] << 8) + (c8[3]); + uint8_t i; + for(i = 0; i < 4; i++) { + if((swapped & 0xFF) == 0) + swapped = (swapped >> 8); /*Ignore leading zeros (they were in the end originally)*/ + } + c = swapped; + } +#endif + return c; +} + +/** + * Decode an UTF-8 character from a string. + * @param txt pointer to '\0' terminated string + * @param i start byte index in 'txt' where to start. + * After call it will point to the next UTF-8 char in 'txt'. + * NULL to use txt[0] as index + * @return the decoded Unicode character or 0 on invalid UTF-8 code + */ +static uint32_t lv_txt_utf8_next(const char * txt, uint32_t * i) +{ + /** + * Unicode to UTF-8 + * 00000000 00000000 00000000 0xxxxxxx -> 0xxxxxxx + * 00000000 00000000 00000yyy yyxxxxxx -> 110yyyyy 10xxxxxx + * 00000000 00000000 zzzzyyyy yyxxxxxx -> 1110zzzz 10yyyyyy 10xxxxxx + * 00000000 000wwwzz zzzzyyyy yyxxxxxx -> 11110www 10zzzzzz 10yyyyyy 10xxxxxx + */ + + uint32_t result = 0; + + /*Dummy 'i' pointer is required*/ + uint32_t i_tmp = 0; + if(i == NULL) i = &i_tmp; + + /*Normal ASCII*/ + if(LV_IS_ASCII(txt[*i])) { + result = txt[*i]; + (*i)++; + } + /*Real UTF-8 decode*/ + else { + /*2 bytes UTF-8 code*/ + if(LV_IS_2BYTES_UTF8_CODE(txt[*i])) { + result = (uint32_t)(txt[*i] & 0x1F) << 6; + (*i)++; + if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; + result += (txt[*i] & 0x3F); + (*i)++; + } + /*3 bytes UTF-8 code*/ + else if(LV_IS_3BYTES_UTF8_CODE(txt[*i])) { + result = (uint32_t)(txt[*i] & 0x0F) << 12; + (*i)++; + + if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; + result += (uint32_t)(txt[*i] & 0x3F) << 6; + (*i)++; + + if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; + result += (txt[*i] & 0x3F); + (*i)++; + } + /*4 bytes UTF-8 code*/ + else if(LV_IS_4BYTES_UTF8_CODE(txt[*i])) { + result = (uint32_t)(txt[*i] & 0x07) << 18; + (*i)++; + + if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; + result += (uint32_t)(txt[*i] & 0x3F) << 12; + (*i)++; + + if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; + result += (uint32_t)(txt[*i] & 0x3F) << 6; + (*i)++; + + if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; + result += txt[*i] & 0x3F; + (*i)++; + } + else { + (*i)++; /*Not UTF-8 char. Go the next.*/ + } + } + return result; +} + +/** + * Get previous UTF-8 character form a string. + * @param txt pointer to '\0' terminated string + * @param i start byte index in 'txt' where to start. After the call it will point to the previous + * UTF-8 char in 'txt'. + * @return the decoded Unicode character or 0 on invalid UTF-8 code + */ +static uint32_t lv_txt_utf8_prev(const char * txt, uint32_t * i) +{ + uint8_t c_size; + uint8_t cnt = 0; + + /*Try to find a !0 long UTF-8 char by stepping one character back*/ + (*i)--; + do { + if(cnt >= 4) return 0; /*No UTF-8 char found before the initial*/ + + c_size = _lv_txt_encoded_size(&txt[*i]); + if(c_size == 0) { + if(*i != 0) + (*i)--; + else + return 0; + } + cnt++; + } while(c_size == 0); + + uint32_t i_tmp = *i; + uint32_t letter = _lv_txt_encoded_next(txt, &i_tmp); /*Character found, get it*/ + + return letter; +} + +/** + * Convert a character index (in an UTF-8 text) to byte index. + * E.g. in "AÃRT" index of 'R' is 2th char but start at byte 3 because 'Ã' is 2 bytes long + * @param txt a '\0' terminated UTF-8 string + * @param utf8_id character index + * @return byte index of the 'utf8_id'th letter + */ +static uint32_t lv_txt_utf8_get_byte_id(const char * txt, uint32_t utf8_id) +{ + uint32_t i; + uint32_t byte_cnt = 0; + for(i = 0; i < utf8_id && txt[byte_cnt] != '\0'; i++) { + uint8_t c_size = _lv_txt_encoded_size(&txt[byte_cnt]); + /* If the char was invalid tell it's 1 byte long*/ + byte_cnt += c_size ? c_size : 1; + } + + return byte_cnt; +} + +/** + * Convert a byte index (in an UTF-8 text) to character index. + * E.g. in "AÃRT" index of 'R' is 2th char but start at byte 3 because 'Ã' is 2 bytes long + * @param txt a '\0' terminated UTF-8 string + * @param byte_id byte index + * @return character index of the letter at 'byte_id'th position + */ +static uint32_t lv_txt_utf8_get_char_id(const char * txt, uint32_t byte_id) +{ + uint32_t i = 0; + uint32_t char_cnt = 0; + + while(i < byte_id) { + _lv_txt_encoded_next(txt, &i); /*'i' points to the next letter so use the prev. value*/ + char_cnt++; + } + + return char_cnt; +} + +/** + * Get the number of characters (and NOT bytes) in a string. Decode it with UTF-8 if enabled. + * E.g.: "ÃBC" is 3 characters (but 4 bytes) + * @param txt a '\0' terminated char string + * @return number of characters + */ +static uint32_t lv_txt_utf8_get_length(const char * txt) +{ + uint32_t len = 0; + uint32_t i = 0; + + while(txt[i] != '\0') { + _lv_txt_encoded_next(txt, &i); + len++; + } + + return len; +} + +#elif LV_TXT_ENC == LV_TXT_ENC_ASCII +/******************************* + * ASCII ENCODER/DECODER + ******************************/ + +/** + * Give the size of an ISO8859-1 coded character + * @param str pointer to a character in a string + * @return length of the UTF-8 character (1,2,3 or 4). O on invalid code + */ +static uint8_t lv_txt_iso8859_1_size(const char * str) +{ + LV_UNUSED(str); /*Unused*/ + return 1; +} + +/** + * Convert a Unicode letter to ISO8859-1. + * @param letter_uni a Unicode letter + * @return ISO8859-1 coded character in Little Endian to be compatible with C chars (e.g. 'Ã', 'Ű') + */ +static uint32_t lv_txt_unicode_to_iso8859_1(uint32_t letter_uni) +{ + if(letter_uni < 256) + return letter_uni; + else + return ' '; +} + +/** + * Convert wide characters to ASCII, however wide characters in ASCII range (e.g. 'A') are ASCII compatible by default. + * So this function does nothing just returns with `c`. + * @param c a character, e.g. 'A' + * @return same as `c` + */ +static uint32_t lv_txt_iso8859_1_conv_wc(uint32_t c) +{ + return c; +} + +/** + * Decode an ISO8859-1 character from a string. + * @param txt pointer to '\0' terminated string + * @param i start byte index in 'txt' where to start. + * After call it will point to the next UTF-8 char in 'txt'. + * NULL to use txt[0] as index + * @return the decoded Unicode character or 0 on invalid UTF-8 code + */ +static uint32_t lv_txt_iso8859_1_next(const char * txt, uint32_t * i) +{ + if(i == NULL) return txt[0]; /*Get the next char*/ + + uint8_t letter = txt[*i]; + (*i)++; + return letter; +} + +/** + * Get previous ISO8859-1 character form a string. + * @param txt pointer to '\0' terminated string + * @param i start byte index in 'txt' where to start. After the call it will point to the previous UTF-8 char in 'txt'. + * @return the decoded Unicode character or 0 on invalid UTF-8 code + */ +static uint32_t lv_txt_iso8859_1_prev(const char * txt, uint32_t * i) +{ + if(i == NULL) return *(txt - 1); /*Get the prev. char*/ + + (*i)--; + uint8_t letter = txt[*i]; + + return letter; +} + +/** + * Convert a character index (in an ISO8859-1 text) to byte index. + * E.g. in "AÃRT" index of 'R' is 2th char but start at byte 3 because 'Ã' is 2 bytes long + * @param txt a '\0' terminated UTF-8 string + * @param utf8_id character index + * @return byte index of the 'utf8_id'th letter + */ +static uint32_t lv_txt_iso8859_1_get_byte_id(const char * txt, uint32_t utf8_id) +{ + LV_UNUSED(txt); /*Unused*/ + return utf8_id; /*In Non encoded no difference*/ +} + +/** + * Convert a byte index (in an ISO8859-1 text) to character index. + * E.g. in "AÃRT" index of 'R' is 2th char but start at byte 3 because 'Ã' is 2 bytes long + * @param txt a '\0' terminated UTF-8 string + * @param byte_id byte index + * @return character index of the letter at 'byte_id'th position + */ +static uint32_t lv_txt_iso8859_1_get_char_id(const char * txt, uint32_t byte_id) +{ + LV_UNUSED(txt); /*Unused*/ + return byte_id; /*In Non encoded no difference*/ +} + +/** + * Get the number of characters (and NOT bytes) in a string. Decode it with UTF-8 if enabled. + * E.g.: "ÃBC" is 3 characters (but 4 bytes) + * @param txt a '\0' terminated char string + * @return number of characters + */ +static uint32_t lv_txt_iso8859_1_get_length(const char * txt) +{ + return strlen(txt); +} +#else + +#error "Invalid character encoding. See `LV_TXT_ENC` in `lv_conf.h`" + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_txt.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_txt.h new file mode 100644 index 0000000..46050dc --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_txt.h @@ -0,0 +1,264 @@ +/** + * @file lv_txt.h + * + */ + +#ifndef LV_TXT_H +#define LV_TXT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include +#include +#include "lv_area.h" +#include "../font/lv_font.h" +#include "lv_printf.h" +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ +#ifndef LV_TXT_COLOR_CMD +#define LV_TXT_COLOR_CMD "#" +#endif + +#define LV_TXT_ENC_UTF8 1 +#define LV_TXT_ENC_ASCII 2 + +/********************** + * TYPEDEFS + **********************/ + +/** + * Options for text rendering. + */ +enum { + LV_TEXT_FLAG_NONE = 0x00, + LV_TEXT_FLAG_RECOLOR = 0x01, /**< Enable parsing of recolor command*/ + LV_TEXT_FLAG_EXPAND = 0x02, /**< Ignore max-width to avoid automatic word wrapping*/ + LV_TEXT_FLAG_FIT = 0x04, /**< Max-width is already equal to the longest line. (Used to skip some calculation)*/ +}; +typedef uint8_t lv_text_flag_t; + +/** + * State machine for text renderer.*/ +enum { + LV_TEXT_CMD_STATE_WAIT, /**< Waiting for command*/ + LV_TEXT_CMD_STATE_PAR, /**< Processing the parameter*/ + LV_TEXT_CMD_STATE_IN, /**< Processing the command*/ +}; +typedef uint8_t lv_text_cmd_state_t; + +/** Label align policy*/ +enum { + LV_TEXT_ALIGN_AUTO, /**< Align text auto*/ + LV_TEXT_ALIGN_LEFT, /**< Align text to left*/ + LV_TEXT_ALIGN_CENTER, /**< Align text to center*/ + LV_TEXT_ALIGN_RIGHT, /**< Align text to right*/ +}; +typedef uint8_t lv_text_align_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Get size of a text + * @param size_res pointer to a 'point_t' variable to store the result + * @param text pointer to a text + * @param font pointer to font of the text + * @param letter_space letter space of the text + * @param line_space line space of the text + * @param flags settings for the text from ::lv_text_flag_t + * @param max_width max width of the text (break the lines to fit this size). Set COORD_MAX to avoid + * line breaks + */ +void lv_txt_get_size(lv_point_t * size_res, const char * text, const lv_font_t * font, lv_coord_t letter_space, + lv_coord_t line_space, lv_coord_t max_width, lv_text_flag_t flag); + +/** + * Get the next line of text. Check line length and break chars too. + * @param txt a '\0' terminated string + * @param font pointer to a font + * @param letter_space letter space + * @param max_width max width of the text (break the lines to fit this size). Set COORD_MAX to avoid + * line breaks + * @param used_width When used_width != NULL, save the width of this line if + * flag == LV_TEXT_FLAG_NONE, otherwise save -1. + * @param flags settings for the text from 'txt_flag_type' enum + * @return the index of the first char of the new line (in byte index not letter index. With UTF-8 + * they are different) + */ +uint32_t _lv_txt_get_next_line(const char * txt, const lv_font_t * font, lv_coord_t letter_space, + lv_coord_t max_width, lv_coord_t * used_width, lv_text_flag_t flag); + +/** + * Give the length of a text with a given font + * @param txt a '\0' terminate string + * @param length length of 'txt' in byte count and not characters (à is 1 character but 2 bytes in + * UTF-8) + * @param font pointer to a font + * @param letter_space letter space + * @param flags settings for the text from 'txt_flag_t' enum + * @return length of a char_num long text + */ +lv_coord_t lv_txt_get_width(const char * txt, uint32_t length, const lv_font_t * font, lv_coord_t letter_space, + lv_text_flag_t flag); + +/** + * Check next character in a string and decide if the character is part of the command or not + * @param state pointer to a txt_cmd_state_t variable which stores the current state of command + * processing + * @param c the current character + * @return true: the character is part of a command and should not be written, + * false: the character should be written + */ +bool _lv_txt_is_cmd(lv_text_cmd_state_t * state, uint32_t c); + +/** + * Insert a string into an other + * @param txt_buf the original text (must be big enough for the result text and NULL terminated) + * @param pos position to insert (0: before the original text, 1: after the first char etc.) + * @param ins_txt text to insert, must be '\0' terminated + */ +void _lv_txt_ins(char * txt_buf, uint32_t pos, const char * ins_txt); + +/** + * Delete a part of a string + * @param txt string to modify, must be '\0' terminated and should point to a heap or stack frame, not read-only memory. + * @param pos position where to start the deleting (0: before the first char, 1: after the first + * char etc.) + * @param len number of characters to delete + */ +void _lv_txt_cut(char * txt, uint32_t pos, uint32_t len); + +/** + * return a new formatted text. Memory will be allocated to store the text. + * @param fmt `printf`-like format + * @return pointer to the allocated text string. + */ +char * _lv_txt_set_text_vfmt(const char * fmt, va_list ap) LV_FORMAT_ATTRIBUTE(1, 0); + +/** + * Decode two encoded character from a string. + * @param txt pointer to '\0' terminated string + * @param letter the first decoded Unicode character or 0 on invalid data code + * @param letter_next the second decoded Unicode character or 0 on invalid data code + * @param ofs start index in 'txt' where to start. + * After the call it will point to the next encoded char in 'txt'. + * NULL to use txt[0] as index + */ +void _lv_txt_encoded_letter_next_2(const char * txt, uint32_t * letter, uint32_t * letter_next, uint32_t * ofs); + +/** + * Test if char is break char or not (a text can broken here or not) + * @param letter a letter + * @return false: 'letter' is not break char + */ +static inline bool _lv_txt_is_break_char(uint32_t letter) +{ + uint8_t i; + bool ret = false; + + /* each chinese character can be break */ + if(letter >= 0x4E00 && letter <= 0x9FA5) { + return true; + } + + /*Compare the letter to TXT_BREAK_CHARS*/ + for(i = 0; LV_TXT_BREAK_CHARS[i] != '\0'; i++) { + if(letter == (uint32_t)LV_TXT_BREAK_CHARS[i]) { + ret = true; /*If match then it is break char*/ + break; + } + } + + return ret; +} + +/*************************************************************** + * GLOBAL FUNCTION POINTERS FOR CHARACTER ENCODING INTERFACE + ***************************************************************/ + +/** + * Give the size of an encoded character + * @param str pointer to a character in a string + * @return length of the encoded character (1,2,3 ...). O in invalid + */ +extern uint8_t (*_lv_txt_encoded_size)(const char *); + +/** + * Convert a Unicode letter to encoded + * @param letter_uni a Unicode letter + * @return Encoded character in Little Endian to be compatible with C chars (e.g. 'Ã', 'Ü') + */ +extern uint32_t (*_lv_txt_unicode_to_encoded)(uint32_t); + +/** + * Convert a wide character, e.g. 'Ã' little endian to be compatible with the encoded format. + * @param c a wide character + * @return `c` in the encoded format + */ +extern uint32_t (*_lv_txt_encoded_conv_wc)(uint32_t c); + +/** + * Decode the next encoded character from a string. + * @param txt pointer to '\0' terminated string + * @param i start index in 'txt' where to start. + * After the call it will point to the next encoded char in 'txt'. + * NULL to use txt[0] as index + * @return the decoded Unicode character or 0 on invalid data code + */ +extern uint32_t (*_lv_txt_encoded_next)(const char *, uint32_t *); + +/** + * Get the previous encoded character form a string. + * @param txt pointer to '\0' terminated string + * @param i_start index in 'txt' where to start. After the call it will point to the previous + * encoded char in 'txt'. + * @return the decoded Unicode character or 0 on invalid data + */ +extern uint32_t (*_lv_txt_encoded_prev)(const char *, uint32_t *); + +/** + * Convert a letter index (in the encoded text) to byte index. + * E.g. in UTF-8 "AÃRT" index of 'R' is 2 but start at byte 3 because 'Ã' is 2 bytes long + * @param txt a '\0' terminated UTF-8 string + * @param enc_id letter index + * @return byte index of the 'enc_id'th letter + */ +extern uint32_t (*_lv_txt_encoded_get_byte_id)(const char *, uint32_t); + +/** + * Convert a byte index (in an encoded text) to character index. + * E.g. in UTF-8 "AÃRT" index of 'R' is 2 but start at byte 3 because 'Ã' is 2 bytes long + * @param txt a '\0' terminated UTF-8 string + * @param byte_id byte index + * @return character index of the letter at 'byte_id'th position + */ +extern uint32_t (*_lv_txt_encoded_get_char_id)(const char *, uint32_t); + +/** + * Get the number of characters (and NOT bytes) in a string. + * E.g. in UTF-8 "ÃBC" is 3 characters (but 4 bytes) + * @param txt a '\0' terminated char string + * @return number of characters + */ +extern uint32_t (*_lv_txt_get_encoded_length)(const char *); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TXT_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_txt_ap.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_txt_ap.c new file mode 100644 index 0000000..54faf8b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_txt_ap.c @@ -0,0 +1,301 @@ +/** + * @file lv_txt_ap.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include +#include "lv_bidi.h" +#include "lv_txt.h" +#include "lv_txt_ap.h" +#include "lv_mem.h" +#include "../draw/lv_draw.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + uint8_t char_offset; + uint16_t char_end_form; + int8_t char_begining_form_offset; + int8_t char_middle_form_offset; + int8_t char_isolated_form_offset; + struct { + uint8_t conj_to_previous; + uint8_t conj_to_next; + } ap_chars_conjunction; +} ap_chars_map_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 +static uint32_t lv_ap_get_char_index(uint16_t c); +static uint32_t lv_txt_lam_alef(uint32_t ch_curr, uint32_t ch_next); +static bool lv_txt_is_arabic_vowel(uint16_t c); + +/********************** + * STATIC VARIABLES + **********************/ + +const ap_chars_map_t ap_chars_map[] = { + /*{Key Offset, End, Beginning, Middle, Isolated, {conjunction}}*/ + {1, 0xFE84, -1, 0, -1, {1, 0}}, // Ø£ + {2, 0xFE86, -1, 0, -1, {1, 0}}, // ؤ + {3, 0xFE88, -1, 0, -1, {1, 0}}, // ﺇ + {4, 0xFE8A, 1, 2, -1, {1, 0}}, // ئ + {5, 0xFE8E, -1, 0, -1, {1, 0}}, // Ø¢ + {6, 0xFE90, 1, 2, -1, {1, 1}}, // ب + {92, 0xFB57, 1, 2, -1, {1, 1}}, // Ù¾ + {8, 0xFE96, 1, 2, -1, {1, 1}}, // ت + {9, 0xFE9A, 1, 2, -1, {1, 1}}, // Ø« + {10, 0xFE9E, 1, 2, -1, {1, 1}}, // ج + {100, 0xFB7B, 1, 2, -1, {1, 1}}, // Ú† + {11, 0xFEA2, 1, 2, -1, {1, 1}}, // Ø­ + {12, 0xFEA6, 1, 2, -1, {1, 1}}, // Ø® + {13, 0xFEAA, -1, 0, -1, {1, 0}}, // د + {14, 0xFEAC, -1, 0, -1, {1, 0}}, // ذ + {15, 0xFEAE, -1, 0, -1, {1, 0}}, // ر + {16, 0xFEB0, -1, 0, -1, {1, 0}}, // ز + {118, 0xFB8B, -1, 0, -1, {1, 0}}, // Ú˜ + {17, 0xFEB2, 1, 2, -1, {1, 1}}, // س + {18, 0xFEB6, 1, 2, -1, {1, 1}}, // Ø´ + {19, 0xFEBA, 1, 2, -1, {1, 1}}, // ص + {20, 0xFEBE, 1, 2, -1, {1, 1}}, // ض + {21, 0xFEC2, 1, 2, -1, {1, 1}}, // Ø· + {22, 0xFEC6, 1, 2, -1, {1, 1}}, // ظ + {23, 0xFECA, 1, 2, -1, {1, 1}}, // ع + {24, 0xFECE, 1, 2, -1, {1, 1}}, // غ + {30, 0x0640, 0, 0, 0, {1, 1}}, // - (mad, hyphen) + {31, 0xFED2, 1, 2, -1, {1, 1}}, // Ù + {32, 0xFED6, 1, 2, -1, {1, 1}}, // Ù‚ + {135, 0xFB8F, 1, 2, -1, {1, 1}}, // Ú© + {33, 0xFEDA, 1, 2, -1, {1, 1}}, // ï»™ + {141, 0xFB93, 1, 2, -1, {1, 1}}, // Ú¯ + {34, 0xFEDE, 1, 2, -1, {1, 1}}, // Ù„ + {35, 0xFEE2, 1, 2, -1, {1, 1}}, // Ù… + {36, 0xFEE6, 1, 2, -1, {1, 1}}, // Ù† + {38, 0xFEEE, -1, 0, -1, {1, 0}}, // Ùˆ + {37, 0xFEEA, 1, 2, -1, {1, 1}}, // Ù‡ + {39, 0xFEF0, 0, 0, -1, {1, 0}}, // Ù‰ + {40, 0xFEF2, 1, 2, -1, {1, 1}}, // ÙŠ + {170, 0xFBFD, 1, 2, -1, {1, 1}}, // ÛŒ + {7, 0xFE94, 1, 2, -1, {1, 0}}, // Ø© + {206, 0x06F0, 1, 2, -1, {0, 0}}, // Û° + {207, 0x06F1, 0, 0, 0, {0, 0}}, // Û± + {208, 0x06F2, 0, 0, 0, {0, 0}}, // Û² + {209, 0x06F3, 0, 0, 0, {0, 0}}, // Û³ + {210, 0x06F4, 0, 0, 0, {0, 0}}, // Û´ + {211, 0x06F5, 0, 0, 0, {0, 0}}, // Ûµ + {212, 0x06F6, 0, 0, 0, {0, 0}}, // Û¶ + {213, 0x06F7, 0, 0, 0, {0, 0}}, // Û· + {214, 0x06F8, 0, 0, 0, {0, 0}}, // Û¸ + {215, 0x06F9, 0, 0, 0, {0, 0}}, // Û¹ + LV_AP_END_CHARS_LIST +}; +/********************** +* MACROS +**********************/ + +/********************** +* GLOBAL FUNCTIONS +**********************/ +uint32_t _lv_txt_ap_calc_bytes_cnt(const char * txt) +{ + uint32_t txt_length = 0; + uint32_t chars_cnt = 0; + uint32_t current_ap_idx = 0; + uint32_t i, j; + uint32_t ch_enc; + + txt_length = _lv_txt_get_encoded_length(txt); + + i = 0; + j = 0; + while(i < txt_length) { + ch_enc = _lv_txt_encoded_next(txt, &j); + current_ap_idx = lv_ap_get_char_index(ch_enc); + + if(current_ap_idx != LV_UNDEF_ARABIC_PERSIAN_CHARS) + ch_enc = ap_chars_map[current_ap_idx].char_end_form; + + if(ch_enc < 0x80) + chars_cnt++; + else if(ch_enc < 0x0800) + chars_cnt += 2; + else if(ch_enc < 0x010000) + chars_cnt += 3; + else + chars_cnt += 4; + + i++; + } + + return chars_cnt + 1; +} + +void _lv_txt_ap_proc(const char * txt, char * txt_out) +{ + uint32_t txt_length = 0; + uint32_t index_current, idx_next, idx_previous, i, j; + uint32_t * ch_enc; + uint32_t * ch_fin; + char * txt_out_temp; + + txt_length = _lv_txt_get_encoded_length(txt); + + ch_enc = (uint32_t *)lv_mem_alloc(sizeof(uint32_t) * (txt_length + 1)); + ch_fin = (uint32_t *)lv_mem_alloc(sizeof(uint32_t) * (txt_length + 1)); + + i = 0; + j = 0; + while(j < txt_length) + ch_enc[j++] = _lv_txt_encoded_next(txt, &i); + + ch_enc[j] = 0; + + i = 0; + j = 0; + idx_previous = LV_UNDEF_ARABIC_PERSIAN_CHARS; + while(i < txt_length) { + index_current = lv_ap_get_char_index(ch_enc[i]); + idx_next = lv_ap_get_char_index(ch_enc[i + 1]); + + if(lv_txt_is_arabic_vowel(ch_enc[i])) { // Current character is a vowel + ch_fin[j] = ch_enc[i]; + i++; + j++; + continue; // Skip this character + } + else if(lv_txt_is_arabic_vowel(ch_enc[i + 1])) { // Next character is a vowel + idx_next = lv_ap_get_char_index(ch_enc[i + 2]); // Skip the vowel character to join with the character after it + } + + if(index_current == LV_UNDEF_ARABIC_PERSIAN_CHARS) { + ch_fin[j] = ch_enc[i]; + j++; + i++; + idx_previous = LV_UNDEF_ARABIC_PERSIAN_CHARS; + continue; + } + + uint8_t conjunction_to_previuse = (i == 0 || + idx_previous == LV_UNDEF_ARABIC_PERSIAN_CHARS) ? 0 : ap_chars_map[idx_previous].ap_chars_conjunction.conj_to_next; + uint8_t conjunction_to_next = ((i == txt_length - 1) || + idx_next == LV_UNDEF_ARABIC_PERSIAN_CHARS) ? 0 : ap_chars_map[idx_next].ap_chars_conjunction.conj_to_previous; + + uint32_t lam_alef = lv_txt_lam_alef(index_current, idx_next); + if(lam_alef) { + if(conjunction_to_previuse) { + lam_alef ++; + } + ch_fin[j] = lam_alef; + idx_previous = LV_UNDEF_ARABIC_PERSIAN_CHARS; + i += 2; + j++; + continue; + } + + if(conjunction_to_previuse && conjunction_to_next) + ch_fin[j] = ap_chars_map[index_current].char_end_form + ap_chars_map[index_current].char_middle_form_offset; + else if(!conjunction_to_previuse && conjunction_to_next) + ch_fin[j] = ap_chars_map[index_current].char_end_form + ap_chars_map[index_current].char_begining_form_offset; + else if(conjunction_to_previuse && !conjunction_to_next) + ch_fin[j] = ap_chars_map[index_current].char_end_form; + else + ch_fin[j] = ap_chars_map[index_current].char_end_form + ap_chars_map[index_current].char_isolated_form_offset; + idx_previous = index_current; + i++; + j++; + } + ch_fin[j] = 0; + for(i = 0; i < txt_length; i++) + ch_enc[i] = 0; + for(i = 0; i < j; i++) + ch_enc[i] = ch_fin[i]; + lv_mem_free(ch_fin); + + txt_out_temp = txt_out; + i = 0; + + while(i < txt_length) { + if(ch_enc[i] < 0x80) { + *(txt_out_temp++) = ch_enc[i] & 0xFF; + } + else if(ch_enc[i] < 0x0800) { + *(txt_out_temp++) = ((ch_enc[i] >> 6) & 0x1F) | 0xC0; + *(txt_out_temp++) = ((ch_enc[i] >> 0) & 0x3F) | 0x80; + } + else if(ch_enc[i] < 0x010000) { + *(txt_out_temp++) = ((ch_enc[i] >> 12) & 0x0F) | 0xE0; + *(txt_out_temp++) = ((ch_enc[i] >> 6) & 0x3F) | 0x80; + *(txt_out_temp++) = ((ch_enc[i] >> 0) & 0x3F) | 0x80; + } + else if(ch_enc[i] < 0x110000) { + *(txt_out_temp++) = ((ch_enc[i] >> 18) & 0x07) | 0xF0; + *(txt_out_temp++) = ((ch_enc[i] >> 12) & 0x3F) | 0x80; + *(txt_out_temp++) = ((ch_enc[i] >> 6) & 0x3F) | 0x80; + *(txt_out_temp++) = ((ch_enc[i] >> 0) & 0x3F) | 0x80; + } + + i++; + } + *(txt_out_temp) = '\0'; + lv_mem_free(ch_enc); +} +/********************** +* STATIC FUNCTIONS +**********************/ + +static uint32_t lv_ap_get_char_index(uint16_t c) +{ + for(uint8_t i = 0; ap_chars_map[i].char_end_form; i++) { + if(c == (ap_chars_map[i].char_offset + LV_AP_ALPHABET_BASE_CODE)) + return i; + else if(c == ap_chars_map[i].char_end_form //is it an End form + || c == (ap_chars_map[i].char_end_form + ap_chars_map[i].char_begining_form_offset) //is it a Beginning form + || c == (ap_chars_map[i].char_end_form + ap_chars_map[i].char_middle_form_offset) //is it a middle form + || c == (ap_chars_map[i].char_end_form + ap_chars_map[i].char_isolated_form_offset)) { //is it an isolated form + return i; + } + } + return LV_UNDEF_ARABIC_PERSIAN_CHARS; +} + +static uint32_t lv_txt_lam_alef(uint32_t ch_curr, uint32_t ch_next) +{ + uint32_t ch_code = 0; + if(ap_chars_map[ch_curr].char_offset != 34) { + return 0; + } + if(ch_next == LV_UNDEF_ARABIC_PERSIAN_CHARS) { + return 0; + } + ch_code = ap_chars_map[ch_next].char_offset + LV_AP_ALPHABET_BASE_CODE; + if(ch_code == 0x0622) { + return 0xFEF5; // (lam-alef) mad + } + if(ch_code == 0x0623) { + return 0xFEF7; // (lam-alef) top hamza + } + if(ch_code == 0x0625) { + return 0xFEF9; // (lam-alef) bot hamza + } + if(ch_code == 0x0627) { + return 0xFEFB; // (lam-alef) alef + } + return 0; +} + +static bool lv_txt_is_arabic_vowel(uint16_t c) +{ + return (c >= 0x064B) && (c <= 0x0652); +} + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_txt_ap.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_txt_ap.h new file mode 100644 index 0000000..e2d94b8 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_txt_ap.h @@ -0,0 +1,49 @@ +/** + * @file lv_txt_ap.h + * + */ + +#ifndef LV_TXT_AP_H +#define LV_TXT_AP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include "lv_txt.h" +#include "../draw/lv_draw.h" + +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 + +/********************* + * DEFINES + *********************/ + +#define LV_UNDEF_ARABIC_PERSIAN_CHARS (UINT32_MAX) +#define LV_AP_ALPHABET_BASE_CODE 0x0622 +#define LV_AP_END_CHARS_LIST {0,0,0,0,0,{0,0}} +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +uint32_t _lv_txt_ap_calc_bytes_cnt(const char * txt); +void _lv_txt_ap_proc(const char * txt, char * txt_out); + +/********************** + * MACROS + **********************/ + +#endif // LV_USE_ARABIC_PERSIAN_CHARS + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TXT_AP_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_types.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_types.h new file mode 100644 index 0000000..84aee10 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_types.h @@ -0,0 +1,94 @@ +/** + * @file lv_types.h + * + */ + +#ifndef LV_TYPES_H +#define LV_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include + +/********************* + * DEFINES + *********************/ + +// If __UINTPTR_MAX__ or UINTPTR_MAX are available, use them to determine arch size +#if defined(__UINTPTR_MAX__) && __UINTPTR_MAX__ > 0xFFFFFFFF +#define LV_ARCH_64 + +#elif defined(UINTPTR_MAX) && UINTPTR_MAX > 0xFFFFFFFF +#define LV_ARCH_64 + +// Otherwise use compiler-dependent means to determine arch size +#elif defined(_WIN64) || defined(__x86_64__) || defined(__ppc64__) || defined (__aarch64__) +#define LV_ARCH_64 + +#endif + +/********************** + * TYPEDEFS + **********************/ + +/** + * LVGL error codes. + */ +enum { + LV_RES_INV = 0, /*Typically indicates that the object is deleted (become invalid) in the action + function or an operation was failed*/ + LV_RES_OK, /*The object is valid (no deleted) after the action*/ +}; +typedef uint8_t lv_res_t; + +#if defined(__cplusplus) || __STDC_VERSION__ >= 199901L +// If c99 or newer, use the definition of uintptr_t directly from +typedef uintptr_t lv_uintptr_t; + +#else + +// Otherwise, use the arch size determination +#ifdef LV_ARCH_64 +typedef uint64_t lv_uintptr_t; +#else +typedef uint32_t lv_uintptr_t; +#endif + +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#define LV_UNUSED(x) ((void)x) + +#define _LV_CONCAT(x, y) x ## y +#define LV_CONCAT(x, y) _LV_CONCAT(x, y) + +#define _LV_CONCAT3(x, y, z) x ## y ## z +#define LV_CONCAT3(x, y, z) _LV_CONCAT3(x, y, z) + +#if defined(PYCPARSER) || defined(__CC_ARM) +#define LV_FORMAT_ATTRIBUTE(fmtstr, vararg) +#elif defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 4) || __GNUC__ > 4) +#define LV_FORMAT_ATTRIBUTE(fmtstr, vararg) __attribute__((format(gnu_printf, fmtstr, vararg))) +#elif (defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)) +#define LV_FORMAT_ATTRIBUTE(fmtstr, vararg) __attribute__((format(printf, fmtstr, vararg))) +#else +#define LV_FORMAT_ATTRIBUTE(fmtstr, vararg) +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TYPES_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_utils.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_utils.c new file mode 100644 index 0000000..e17a231 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_utils.c @@ -0,0 +1,79 @@ +/** + * @file lv_utils.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include + +#include "lv_utils.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** Searches base[0] to base[n - 1] for an item that matches *key. + * + * @note The function cmp must return negative if its first + * argument (the search key) is less than its second (a table entry), + * zero if equal, and positive if greater. + * + * @note Items in the array must be in ascending order. + * + * @param key Pointer to item being searched for + * @param base Pointer to first element to search + * @param n Number of elements + * @param size Size of each element + * @param cmp Pointer to comparison function (see #unicode_list_compare as a comparison function + * example) + * + * @return a pointer to a matching item, or NULL if none exists. + */ +void * _lv_utils_bsearch(const void * key, const void * base, uint32_t n, uint32_t size, + int32_t (*cmp)(const void * pRef, const void * pElement)) +{ + const char * middle; + int32_t c; + + for(middle = base; n != 0;) { + middle += (n / 2) * size; + if((c = (*cmp)(key, middle)) > 0) { + n = (n / 2) - ((n & 1) == 0); + base = (middle += size); + } + else if(c < 0) { + n /= 2; + middle = base; + } + else { + return (char *)middle; + } + } + return NULL; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_utils.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_utils.h new file mode 100644 index 0000000..84d2bb9 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/misc/lv_utils.h @@ -0,0 +1,58 @@ +/** + * @file lv_utils.h + * + */ + +#ifndef LV_UTILS_H +#define LV_UTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** Searches base[0] to base[n - 1] for an item that matches *key. + * + * @note The function cmp must return negative if it's first + * argument (the search key) is less that it's second (a table entry), + * zero if equal, and positive if greater. + * + * @note Items in the array must be in ascending order. + * + * @param key Pointer to item being searched for + * @param base Pointer to first element to search + * @param n Number of elements + * @param size Size of each element + * @param cmp Pointer to comparison function (see #unicode_list_compare as a comparison function + * example) + * + * @return a pointer to a matching item, or NULL if none exists. + */ +void * _lv_utils_bsearch(const void * key, const void * base, uint32_t n, uint32_t size, + int32_t (*cmp)(const void * pRef, const void * pElement)); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_arc.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_arc.c new file mode 100644 index 0000000..6cab5f3 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_arc.c @@ -0,0 +1,844 @@ +/** + * @file lv_arc.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_arc.h" +#if LV_USE_ARC != 0 + +#include "../core/lv_group.h" +#include "../core/lv_indev.h" +#include "../misc/lv_assert.h" +#include "../misc/lv_math.h" +#include "../draw/lv_draw_arc.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_arc_class + +#define VALUE_UNSET INT16_MIN + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_arc_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_arc_draw(lv_event_t * e); +static void lv_arc_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void inv_arc_area(lv_obj_t * arc, uint16_t start_angle, uint16_t end_angle, lv_part_t part); +static void inv_knob_area(lv_obj_t * obj); +static void get_center(const lv_obj_t * obj, lv_point_t * center, lv_coord_t * arc_r); +static lv_coord_t get_angle(const lv_obj_t * obj); +static void get_knob_area(lv_obj_t * arc, const lv_point_t * center, lv_coord_t r, lv_area_t * knob_area); +static void value_update(lv_obj_t * arc); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_arc_class = { + .constructor_cb = lv_arc_constructor, + .event_cb = lv_arc_event, + .instance_size = sizeof(lv_arc_t), + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .base_class = &lv_obj_class +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_arc_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*====================== + * Add/remove functions + *=====================*/ + +/* + * New object specific "add" or "remove" functions come here + */ + +/*===================== + * Setter functions + *====================*/ + +void lv_arc_set_start_angle(lv_obj_t * obj, uint16_t start) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + if(start > 360) start -= 360; + + int16_t old_delta = arc->indic_angle_end - arc->indic_angle_start; + int16_t new_delta = arc->indic_angle_end - start; + + if(old_delta < 0) old_delta = 360 + old_delta; + if(new_delta < 0) new_delta = 360 + new_delta; + + if(LV_ABS(new_delta - old_delta) > 180) lv_obj_invalidate(obj); + else if(new_delta < old_delta) inv_arc_area(obj, arc->indic_angle_start, start, LV_PART_INDICATOR); + else if(old_delta < new_delta) inv_arc_area(obj, start, arc->indic_angle_start, LV_PART_INDICATOR); + + inv_knob_area(obj); + + arc->indic_angle_start = start; + + inv_knob_area(obj); +} + +void lv_arc_set_end_angle(lv_obj_t * obj, uint16_t end) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + if(end > 360) end -= 360; + + int16_t old_delta = arc->indic_angle_end - arc->indic_angle_start; + int16_t new_delta = end - arc->indic_angle_start; + + if(old_delta < 0) old_delta = 360 + old_delta; + if(new_delta < 0) new_delta = 360 + new_delta; + + if(LV_ABS(new_delta - old_delta) > 180) lv_obj_invalidate(obj); + else if(new_delta < old_delta) inv_arc_area(obj, end, arc->indic_angle_end, LV_PART_INDICATOR); + else if(old_delta < new_delta) inv_arc_area(obj, arc->indic_angle_end, end, LV_PART_INDICATOR); + + inv_knob_area(obj); + + arc->indic_angle_end = end; + + inv_knob_area(obj); +} + +void lv_arc_set_angles(lv_obj_t * obj, uint16_t start, uint16_t end) +{ + lv_arc_set_end_angle(obj, end); + lv_arc_set_start_angle(obj, start); +} + +void lv_arc_set_bg_start_angle(lv_obj_t * obj, uint16_t start) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + if(start > 360) start -= 360; + + int16_t old_delta = arc->bg_angle_end - arc->bg_angle_start; + int16_t new_delta = arc->bg_angle_end - start; + + if(old_delta < 0) old_delta = 360 + old_delta; + if(new_delta < 0) new_delta = 360 + new_delta; + + if(LV_ABS(new_delta - old_delta) > 180) lv_obj_invalidate(obj); + else if(new_delta < old_delta) inv_arc_area(obj, arc->bg_angle_start, start, LV_PART_MAIN); + else if(old_delta < new_delta) inv_arc_area(obj, start, arc->bg_angle_start, LV_PART_MAIN); + + arc->bg_angle_start = start; + + value_update(obj); +} + +void lv_arc_set_bg_end_angle(lv_obj_t * obj, uint16_t end) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + if(end > 360) end -= 360; + + int16_t old_delta = arc->bg_angle_end - arc->bg_angle_start; + int16_t new_delta = end - arc->bg_angle_start; + + if(old_delta < 0) old_delta = 360 + old_delta; + if(new_delta < 0) new_delta = 360 + new_delta; + + if(LV_ABS(new_delta - old_delta) > 180) lv_obj_invalidate(obj); + else if(new_delta < old_delta) inv_arc_area(obj, end, arc->bg_angle_end, LV_PART_MAIN); + else if(old_delta < new_delta) inv_arc_area(obj, arc->bg_angle_end, end, LV_PART_MAIN); + + arc->bg_angle_end = end; + + value_update(obj); +} + +void lv_arc_set_bg_angles(lv_obj_t * obj, uint16_t start, uint16_t end) +{ + lv_arc_set_bg_end_angle(obj, end); + lv_arc_set_bg_start_angle(obj, start); +} + +void lv_arc_set_rotation(lv_obj_t * obj, uint16_t rotation) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + arc->rotation = rotation; + + lv_obj_invalidate(obj); +} + +void lv_arc_set_mode(lv_obj_t * obj, lv_arc_mode_t type) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + int16_t val = arc->value; + + arc->type = type; + arc->value = -1; /** Force set_value handling*/ + + int16_t bg_midpoint, bg_end = arc->bg_angle_end; + if(arc->bg_angle_end < arc->bg_angle_start) bg_end = arc->bg_angle_end + 360; + + switch(arc->type) { + case LV_ARC_MODE_SYMMETRICAL: + bg_midpoint = (arc->bg_angle_start + bg_end) / 2; + lv_arc_set_start_angle(obj, bg_midpoint); + lv_arc_set_end_angle(obj, bg_midpoint); + break; + case LV_ARC_MODE_REVERSE: + lv_arc_set_end_angle(obj, arc->bg_angle_end); + break; + default: /** LV_ARC_TYPE_NORMAL*/ + lv_arc_set_start_angle(obj, arc->bg_angle_start); + } + + lv_arc_set_value(obj, val); +} + +void lv_arc_set_value(lv_obj_t * obj, int16_t value) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + if(arc->value == value) return; + + int16_t new_value; + new_value = value > arc->max_value ? arc->max_value : value; + new_value = new_value < arc->min_value ? arc->min_value : new_value; + + if(arc->value == new_value) return; + arc->value = new_value; + + value_update(obj); +} + +void lv_arc_set_range(lv_obj_t * obj, int16_t min, int16_t max) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + if(arc->min_value == min && arc->max_value == max) return; + + arc->min_value = min; + arc->max_value = max; + + if(arc->value < min) { + arc->value = min; + } + if(arc->value > max) { + arc->value = max; + } + + value_update(obj); /*value has changed relative to the new range*/ +} + +void lv_arc_set_change_rate(lv_obj_t * obj, uint16_t rate) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + arc->chg_rate = rate; +} + +/*===================== + * Getter functions + *====================*/ + +uint16_t lv_arc_get_angle_start(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->indic_angle_start; +} + +uint16_t lv_arc_get_angle_end(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->indic_angle_end; +} + +uint16_t lv_arc_get_bg_angle_start(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->bg_angle_start; +} + +uint16_t lv_arc_get_bg_angle_end(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->bg_angle_end; +} + +int16_t lv_arc_get_value(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->value; +} + +int16_t lv_arc_get_min_value(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->min_value; +} + +int16_t lv_arc_get_max_value(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->max_value; +} + +lv_arc_mode_t lv_arc_get_mode(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->type; +} + +/*===================== + * Other functions + *====================*/ + + +void lv_arc_align_obj_to_angle(const lv_obj_t * obj, lv_obj_t * obj_to_align, lv_coord_t r_offset) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(obj_to_align); + + lv_obj_update_layout(obj); + + lv_point_t center; + lv_coord_t arc_r; + get_center(obj, ¢er, &arc_r); + lv_coord_t indic_width = lv_obj_get_style_arc_width(obj, LV_PART_INDICATOR); + lv_coord_t indic_width_half = indic_width / 2; + arc_r -= indic_width_half; + arc_r += r_offset; + + uint16_t angle = get_angle(obj); + lv_coord_t knob_x = (arc_r * lv_trigo_sin(angle + 90)) >> LV_TRIGO_SHIFT; + lv_coord_t knob_y = (arc_r * lv_trigo_sin(angle)) >> LV_TRIGO_SHIFT; + lv_obj_align_to(obj_to_align, obj, LV_ALIGN_CENTER, knob_x, knob_y); +} + +void lv_arc_rotate_obj_to_angle(const lv_obj_t * obj, lv_obj_t * obj_to_rotate, lv_coord_t r_offset) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(obj_to_rotate); + + lv_obj_update_layout(obj); + + lv_point_t center; + lv_coord_t arc_r; + get_center(obj, ¢er, &arc_r); + lv_coord_t indic_width = lv_obj_get_style_arc_width(obj, LV_PART_INDICATOR); + lv_coord_t indic_width_half = indic_width / 2; + arc_r -= indic_width_half; + + arc_r += r_offset; + lv_obj_align_to(obj_to_rotate, obj, LV_ALIGN_CENTER, 0, -arc_r); + + lv_obj_update_layout(obj); + + uint16_t angle = get_angle(obj); + lv_coord_t pivot_x = obj_to_rotate->coords.x1 - center.x; + lv_coord_t pivot_y = obj_to_rotate->coords.y1 - center.y; + lv_obj_set_style_transform_pivot_x(obj_to_rotate, -pivot_x, 0); + lv_obj_set_style_transform_pivot_y(obj_to_rotate, -pivot_y, 0); + lv_obj_set_style_transform_angle(obj_to_rotate, angle * 10 + 900, 0); +} + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_arc_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_arc_t * arc = (lv_arc_t *)obj; + + /*Initialize the allocated 'ext'*/ + arc->rotation = 0; + arc->bg_angle_start = 135; + arc->bg_angle_end = 45; + arc->indic_angle_start = 135; + arc->indic_angle_end = 270; + arc->type = LV_ARC_MODE_NORMAL; + arc->value = VALUE_UNSET; + arc->min_close = 1; + arc->min_value = 0; + arc->max_value = 100; + arc->dragging = false; + arc->chg_rate = 720; + arc->last_tick = lv_tick_get(); + arc->last_angle = arc->indic_angle_end; + + lv_obj_add_flag(obj, LV_OBJ_FLAG_CLICKABLE); + lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN | LV_OBJ_FLAG_SCROLLABLE); + lv_obj_set_ext_click_area(obj, LV_DPI_DEF / 10); + + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_arc_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_res_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RES_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + lv_arc_t * arc = (lv_arc_t *)lv_event_get_target(e); + if(code == LV_EVENT_PRESSING) { + lv_indev_t * indev = lv_indev_get_act(); + if(indev == NULL) return; + + /*Handle only pointers here*/ + lv_indev_type_t indev_type = lv_indev_get_type(indev); + if(indev_type != LV_INDEV_TYPE_POINTER) return; + + lv_point_t p; + lv_indev_get_point(indev, &p); + + /*Make point relative to the arc's center*/ + lv_point_t center; + lv_coord_t r; + get_center(obj, ¢er, &r); + + p.x -= center.x; + p.y -= center.y; + + /*Enter dragging mode if pressed out of the knob*/ + if(arc->dragging == false) { + lv_coord_t indic_width = lv_obj_get_style_arc_width(obj, LV_PART_INDICATOR); + r -= indic_width; + /*Add some more sensitive area if there is no advanced git testing. + * (Advanced hit testing is more precise)*/ + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_ADV_HITTEST)) { + r -= indic_width; + + } + else { + r -= LV_MAX(r / 4, indic_width); + } + if(r < 1) r = 1; + + if(p.x * p.x + p.y * p.y > r * r) { + arc->dragging = true; + arc->last_tick = lv_tick_get(); /*Capture timestamp at dragging start*/ + } + } + + /*It must be in "dragging" mode to turn the arc*/ + if(arc->dragging == false) return; + + /*No angle can be determined if exactly the middle of the arc is being pressed*/ + if(p.x == 0 && p.y == 0) return; + + /*Calculate the angle of the pressed point*/ + int16_t angle; + int16_t bg_end = arc->bg_angle_end; + if(arc->bg_angle_end < arc->bg_angle_start) { + bg_end = arc->bg_angle_end + 360; + } + + angle = lv_atan2(p.y, p.x); + angle -= arc->rotation; + angle -= arc->bg_angle_start; /*Make the angle relative to the start angle*/ + + if(angle < 0) angle += 360; + + int16_t deg_range = bg_end - arc->bg_angle_start; + + int16_t last_angle_rel = arc->last_angle - arc->bg_angle_start; + int16_t delta_angle = angle - last_angle_rel; + + /*Do not allow big jumps. + *It's mainly to avoid jumping to the opposite end if the "dead" range between min. and max. is crossed. + *Check which end was closer on the last valid press (arc->min_close) and prefer that end*/ + if(LV_ABS(delta_angle) > 280) { + if(arc->min_close) angle = 0; + else angle = deg_range; + } + else { + if(angle < deg_range / 2)arc->min_close = 1; + else arc->min_close = 0; + } + + /*Calculate the slew rate limited angle based on change rate (degrees/sec)*/ + delta_angle = angle - last_angle_rel; + uint32_t delta_tick = lv_tick_elaps(arc->last_tick); + int16_t delta_angle_max = (arc->chg_rate * delta_tick) / 1000; + + if(delta_angle > delta_angle_max) { + delta_angle = delta_angle_max; + } + else if(delta_angle < -delta_angle_max) { + delta_angle = -delta_angle_max; + } + + angle = last_angle_rel + delta_angle; /*Apply the limited angle change*/ + + /*Rounding for symmetry*/ + int32_t round = ((bg_end - arc->bg_angle_start) * 8) / (arc->max_value - arc->min_value); + round = (round + 4) >> 4; + angle += round; + + angle += arc->bg_angle_start; /*Make the angle absolute again*/ + + /*Set the new value*/ + int16_t old_value = arc->value; + int16_t new_value = lv_map(angle, arc->bg_angle_start, bg_end, arc->min_value, arc->max_value); + if(new_value != lv_arc_get_value(obj)) { + arc->last_tick = lv_tick_get(); /*Cache timestamp for the next iteration*/ + lv_arc_set_value(obj, new_value); /*set_value caches the last_angle for the next iteration*/ + if(new_value != old_value) { + res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RES_OK) return; + } + } + + /*Don't let the elapsed time become too big while sitting on an end point*/ + if(new_value == arc->min_value || new_value == arc->max_value) { + arc->last_tick = lv_tick_get(); /*Cache timestamp for the next iteration*/ + } + } + else if(code == LV_EVENT_RELEASED || code == LV_EVENT_PRESS_LOST) { + arc->dragging = false; + + /*Leave edit mode if released. (No need to wait for LONG_PRESS)*/ + lv_group_t * g = lv_obj_get_group(obj); + bool editing = lv_group_get_editing(g); + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_get_act()); + if(indev_type == LV_INDEV_TYPE_ENCODER) { + if(editing) lv_group_set_editing(g, false); + } + + } + else if(code == LV_EVENT_KEY) { + char c = *((char *)lv_event_get_param(e)); + + int16_t old_value = arc->value; + if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { + lv_arc_set_value(obj, lv_arc_get_value(obj) + 1); + } + else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { + lv_arc_set_value(obj, lv_arc_get_value(obj) - 1); + } + + if(old_value != arc->value) { + res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RES_OK) return; + } + } + else if(code == LV_EVENT_HIT_TEST) { + lv_hit_test_info_t * info = lv_event_get_param(e);; + + lv_point_t p; + lv_coord_t r; + get_center(obj, &p, &r); + + lv_coord_t ext_click_area = 0; + if(obj->spec_attr) ext_click_area = obj->spec_attr->ext_click_pad; + + lv_coord_t w = lv_obj_get_style_arc_width(obj, LV_PART_MAIN); + r -= w + ext_click_area; + + lv_area_t a; + /*Invalid if clicked inside*/ + lv_area_set(&a, p.x - r, p.y - r, p.x + r, p.y + r); + if(_lv_area_is_point_on(&a, info->point, LV_RADIUS_CIRCLE)) { + info->res = false; + return; + } + + /*Valid if no clicked outside*/ + lv_area_increase(&a, w + ext_click_area * 2, w + ext_click_area * 2); + info->res = _lv_area_is_point_on(&a, info->point, LV_RADIUS_CIRCLE); + } + else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + lv_coord_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + lv_coord_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + lv_coord_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + lv_coord_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + lv_coord_t bg_pad = LV_MAX4(bg_left, bg_right, bg_top, bg_bottom); + + lv_coord_t knob_left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); + lv_coord_t knob_right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); + lv_coord_t knob_top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); + lv_coord_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); + lv_coord_t knob_pad = LV_MAX4(knob_left, knob_right, knob_top, knob_bottom) + 2; + + lv_coord_t * s = lv_event_get_param(e); + *s = LV_MAX(*s, knob_pad - bg_pad); + } + else if(code == LV_EVENT_DRAW_MAIN) { + lv_arc_draw(e); + } +} + +static void lv_arc_draw(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + lv_arc_t * arc = (lv_arc_t *)obj; + + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + + lv_point_t center; + lv_coord_t arc_r; + get_center(obj, ¢er, &arc_r); + + lv_obj_draw_part_dsc_t part_draw_dsc; + lv_obj_draw_dsc_init(&part_draw_dsc, draw_ctx); + + /*Draw the background arc*/ + lv_draw_arc_dsc_t arc_dsc; + if(arc_r > 0) { + lv_draw_arc_dsc_init(&arc_dsc); + lv_obj_init_draw_arc_dsc(obj, LV_PART_MAIN, &arc_dsc); + + part_draw_dsc.part = LV_PART_MAIN; + part_draw_dsc.class_p = MY_CLASS; + part_draw_dsc.type = LV_ARC_DRAW_PART_BACKGROUND; + part_draw_dsc.p1 = ¢er; + part_draw_dsc.radius = arc_r; + part_draw_dsc.arc_dsc = &arc_dsc; + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + + lv_draw_arc(draw_ctx, &arc_dsc, ¢er, part_draw_dsc.radius, arc->bg_angle_start + arc->rotation, + arc->bg_angle_end + arc->rotation); + + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + } + + /*Make the indicator arc smaller or larger according to its greatest padding value*/ + lv_coord_t left_indic = lv_obj_get_style_pad_left(obj, LV_PART_INDICATOR); + lv_coord_t right_indic = lv_obj_get_style_pad_right(obj, LV_PART_INDICATOR); + lv_coord_t top_indic = lv_obj_get_style_pad_top(obj, LV_PART_INDICATOR); + lv_coord_t bottom_indic = lv_obj_get_style_pad_bottom(obj, LV_PART_INDICATOR); + lv_coord_t indic_r = arc_r - LV_MAX4(left_indic, right_indic, top_indic, bottom_indic); + + if(indic_r > 0) { + lv_draw_arc_dsc_init(&arc_dsc); + lv_obj_init_draw_arc_dsc(obj, LV_PART_INDICATOR, &arc_dsc); + + part_draw_dsc.part = LV_PART_INDICATOR; + part_draw_dsc.class_p = MY_CLASS; + part_draw_dsc.type = LV_ARC_DRAW_PART_FOREGROUND; + part_draw_dsc.p1 = ¢er; + part_draw_dsc.radius = indic_r; + part_draw_dsc.arc_dsc = &arc_dsc; + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + + if(arc_dsc.width > part_draw_dsc.radius) arc_dsc.width = part_draw_dsc.radius; + lv_draw_arc(draw_ctx, &arc_dsc, ¢er, part_draw_dsc.radius, arc->indic_angle_start + arc->rotation, + arc->indic_angle_end + arc->rotation); + + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + } + + lv_area_t knob_area; + get_knob_area(obj, ¢er, arc_r, &knob_area); + + lv_draw_rect_dsc_t knob_rect_dsc; + lv_draw_rect_dsc_init(&knob_rect_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_KNOB, &knob_rect_dsc); + + part_draw_dsc.part = LV_PART_KNOB; + part_draw_dsc.class_p = MY_CLASS; + part_draw_dsc.type = LV_ARC_DRAW_PART_KNOB; + part_draw_dsc.draw_area = &knob_area; + part_draw_dsc.rect_dsc = &knob_rect_dsc; + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + + lv_draw_rect(draw_ctx, &knob_rect_dsc, &knob_area); + + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); +} + +static void inv_arc_area(lv_obj_t * obj, uint16_t start_angle, uint16_t end_angle, lv_part_t part) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + /*Skip this complicated invalidation if the arc is not visible*/ + if(lv_obj_is_visible(obj) == false) return; + + lv_arc_t * arc = (lv_arc_t *)obj; + + if(start_angle == end_angle) return; + + if(start_angle > 360) start_angle -= 360; + if(end_angle > 360) end_angle -= 360; + + start_angle += arc->rotation; + end_angle += arc->rotation; + + if(start_angle > 360) start_angle -= 360; + if(end_angle > 360) end_angle -= 360; + + lv_coord_t r; + lv_point_t c; + get_center(obj, &c, &r); + + lv_coord_t w = lv_obj_get_style_arc_width(obj, part); + lv_coord_t rounded = lv_obj_get_style_arc_rounded(obj, part); + + lv_area_t inv_area; + lv_draw_arc_get_area(c.x, c.y, r, start_angle, end_angle, w, rounded, &inv_area); + lv_obj_invalidate_area(obj, &inv_area); +} + +static void inv_knob_area(lv_obj_t * obj) +{ + lv_point_t c; + lv_coord_t r; + get_center(obj, &c, &r); + + lv_area_t a; + get_knob_area(obj, &c, r, &a); + lv_obj_invalidate_area(obj, &a); +} + +static void get_center(const lv_obj_t * obj, lv_point_t * center, lv_coord_t * arc_r) +{ + lv_coord_t left_bg = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + lv_coord_t right_bg = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + lv_coord_t top_bg = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + lv_coord_t bottom_bg = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + + lv_coord_t r = (LV_MIN(lv_obj_get_width(obj) - left_bg - right_bg, + lv_obj_get_height(obj) - top_bg - bottom_bg)) / 2; + + center->x = obj->coords.x1 + r + left_bg; + center->y = obj->coords.y1 + r + top_bg; + + if(arc_r) *arc_r = r; +} + +static lv_coord_t get_angle(const lv_obj_t * obj) +{ + lv_arc_t * arc = (lv_arc_t *)obj; + uint16_t angle = arc->rotation; + if(arc->type == LV_ARC_MODE_NORMAL) { + angle += arc->indic_angle_end; + } + else if(arc->type == LV_ARC_MODE_REVERSE) { + angle += arc->indic_angle_start; + } + else if(arc->type == LV_ARC_MODE_SYMMETRICAL) { + int16_t bg_end = arc->bg_angle_end; + if(arc->bg_angle_end < arc->bg_angle_start) bg_end = arc->bg_angle_end + 360; + int16_t indic_end = arc->indic_angle_end; + if(arc->indic_angle_end < arc->indic_angle_start) indic_end = arc->indic_angle_end + 360; + + int32_t angle_midpoint = (int32_t)(arc->bg_angle_start + bg_end) / 2; + if(arc->indic_angle_start < angle_midpoint) angle += arc->indic_angle_start; + else if(indic_end > angle_midpoint) angle += arc->indic_angle_end; + else angle += angle_midpoint; + } + + return angle; +} + + +static void get_knob_area(lv_obj_t * obj, const lv_point_t * center, lv_coord_t r, lv_area_t * knob_area) +{ + lv_coord_t indic_width = lv_obj_get_style_arc_width(obj, LV_PART_INDICATOR); + lv_coord_t indic_width_half = indic_width / 2; + r -= indic_width_half; + + lv_coord_t angle = get_angle(obj); + lv_coord_t knob_x = (r * lv_trigo_sin(angle + 90)) >> LV_TRIGO_SHIFT; + lv_coord_t knob_y = (r * lv_trigo_sin(angle)) >> LV_TRIGO_SHIFT; + + lv_coord_t left_knob = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); + lv_coord_t right_knob = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); + lv_coord_t top_knob = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); + lv_coord_t bottom_knob = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); + + knob_area->x1 = center->x + knob_x - left_knob - indic_width_half; + knob_area->x2 = center->x + knob_x + right_knob + indic_width_half; + knob_area->y1 = center->y + knob_y - top_knob - indic_width_half; + knob_area->y2 = center->y + knob_y + bottom_knob + indic_width_half; +} + +/** + * Used internally to update arc angles after a value change + * @param arc pointer to an arc object + */ +static void value_update(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + /*If the value is still not set to any value do not update*/ + if(arc->value == VALUE_UNSET) return; + + int16_t bg_midpoint, range_midpoint, bg_end = arc->bg_angle_end; + if(arc->bg_angle_end < arc->bg_angle_start) bg_end = arc->bg_angle_end + 360; + + int16_t angle; + switch(arc->type) { + case LV_ARC_MODE_SYMMETRICAL: + bg_midpoint = (arc->bg_angle_start + bg_end) / 2; + range_midpoint = (int32_t)(arc->min_value + arc->max_value) / 2; + + if(arc->value < range_midpoint) { + angle = lv_map(arc->value, arc->min_value, range_midpoint, arc->bg_angle_start, bg_midpoint); + lv_arc_set_start_angle(obj, angle); + lv_arc_set_end_angle(obj, bg_midpoint); + } + else { + angle = lv_map(arc->value, range_midpoint, arc->max_value, bg_midpoint, bg_end); + lv_arc_set_start_angle(obj, bg_midpoint); + lv_arc_set_end_angle(obj, angle); + } + break; + case LV_ARC_MODE_REVERSE: + angle = lv_map(arc->value, arc->min_value, arc->max_value, bg_end, arc->bg_angle_start); + lv_arc_set_angles(obj, angle, arc->bg_angle_end); + break; + case LV_ARC_MODE_NORMAL: + angle = lv_map(arc->value, arc->min_value, arc->max_value, arc->bg_angle_start, bg_end); + lv_arc_set_angles(obj, arc->bg_angle_start, angle); + + break; + default: + LV_LOG_WARN("Invalid mode: %d", arc->type); + return; + } + arc->last_angle = angle; /*Cache angle for slew rate limiting*/ +} + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_arc.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_arc.h new file mode 100644 index 0000000..fd53fc1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_arc.h @@ -0,0 +1,256 @@ +/** + * @file lv_arc.h + * + */ + +#ifndef LV_ARC_H +#define LV_ARC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#if LV_USE_ARC != 0 + +#include "../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +enum { + LV_ARC_MODE_NORMAL, + LV_ARC_MODE_SYMMETRICAL, + LV_ARC_MODE_REVERSE +}; +typedef uint8_t lv_arc_mode_t; + +typedef struct { + lv_obj_t obj; + uint16_t rotation; + uint16_t indic_angle_start; + uint16_t indic_angle_end; + uint16_t bg_angle_start; + uint16_t bg_angle_end; + int16_t value; /*Current value of the arc*/ + int16_t min_value; /*Minimum value of the arc*/ + int16_t max_value; /*Maximum value of the arc*/ + uint16_t dragging : 1; + uint16_t type : 2; + uint16_t min_close : 1; /*1: the last pressed angle was closer to minimum end*/ + uint16_t chg_rate; /*Drag angle rate of change of the arc (degrees/sec)*/ + uint32_t last_tick; /*Last dragging event timestamp of the arc*/ + int16_t last_angle; /*Last dragging angle of the arc*/ +} lv_arc_t; + +extern const lv_obj_class_t lv_arc_class; + +/** + * `type` field in `lv_obj_draw_part_dsc_t` if `class_p = lv_arc_class` + * Used in `LV_EVENT_DRAW_PART_BEGIN` and `LV_EVENT_DRAW_PART_END` + */ +typedef enum { + LV_ARC_DRAW_PART_BACKGROUND, /**< The background arc*/ + LV_ARC_DRAW_PART_FOREGROUND, /**< The foreground arc*/ + LV_ARC_DRAW_PART_KNOB, /**< The knob*/ +} lv_arc_draw_part_type_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an arc object + * @param parent pointer to an object, it will be the parent of the new arc + * @return pointer to the created arc + */ +lv_obj_t * lv_arc_create(lv_obj_t * parent); + +/*====================== + * Add/remove functions + *=====================*/ + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the start angle of an arc. 0 deg: right, 90 bottom, etc. + * @param obj pointer to an arc object + * @param start the start angle + */ +void lv_arc_set_start_angle(lv_obj_t * obj, uint16_t start); + +/** + * Set the end angle of an arc. 0 deg: right, 90 bottom, etc. + * @param obj pointer to an arc object + * @param end the end angle + */ +void lv_arc_set_end_angle(lv_obj_t * obj, uint16_t end); + +/** + * Set the start and end angles + * @param obj pointer to an arc object + * @param start the start angle + * @param end the end angle + */ +void lv_arc_set_angles(lv_obj_t * obj, uint16_t start, uint16_t end); + +/** + * Set the start angle of an arc background. 0 deg: right, 90 bottom, etc. + * @param obj pointer to an arc object + * @param start the start angle + */ +void lv_arc_set_bg_start_angle(lv_obj_t * obj, uint16_t start); + +/** + * Set the start angle of an arc background. 0 deg: right, 90 bottom etc. + * @param obj pointer to an arc object + * @param end the end angle + */ +void lv_arc_set_bg_end_angle(lv_obj_t * obj, uint16_t end); + +/** + * Set the start and end angles of the arc background + * @param obj pointer to an arc object + * @param start the start angle + * @param end the end angle + */ +void lv_arc_set_bg_angles(lv_obj_t * obj, uint16_t start, uint16_t end); + +/** + * Set the rotation for the whole arc + * @param obj pointer to an arc object + * @param rotation rotation angle + */ +void lv_arc_set_rotation(lv_obj_t * obj, uint16_t rotation); + +/** + * Set the type of arc. + * @param obj pointer to arc object + * @param mode arc's mode + */ +void lv_arc_set_mode(lv_obj_t * obj, lv_arc_mode_t type); + +/** + * Set a new value on the arc + * @param obj pointer to an arc object + * @param value new value + */ +void lv_arc_set_value(lv_obj_t * obj, int16_t value); + +/** + * Set minimum and the maximum values of an arc + * @param obj pointer to the arc object + * @param min minimum value + * @param max maximum value + */ +void lv_arc_set_range(lv_obj_t * obj, int16_t min, int16_t max); + +/** + * Set a change rate to limit the speed how fast the arc should reach the pressed point. + * @param obj pointer to an arc object + * @param rate the change rate + */ +void lv_arc_set_change_rate(lv_obj_t * obj, uint16_t rate); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the start angle of an arc. + * @param obj pointer to an arc object + * @return the start angle [0..360] + */ +uint16_t lv_arc_get_angle_start(lv_obj_t * obj); + +/** + * Get the end angle of an arc. + * @param obj pointer to an arc object + * @return the end angle [0..360] + */ +uint16_t lv_arc_get_angle_end(lv_obj_t * obj); + +/** + * Get the start angle of an arc background. + * @param obj pointer to an arc object + * @return the start angle [0..360] + */ +uint16_t lv_arc_get_bg_angle_start(lv_obj_t * obj); + +/** + * Get the end angle of an arc background. + * @param obj pointer to an arc object + * @return the end angle [0..360] + */ +uint16_t lv_arc_get_bg_angle_end(lv_obj_t * obj); + +/** + * Get the value of an arc + * @param obj pointer to an arc object + * @return the value of the arc + */ +int16_t lv_arc_get_value(const lv_obj_t * obj); + +/** + * Get the minimum value of an arc + * @param obj pointer to an arc object + * @return the minimum value of the arc + */ +int16_t lv_arc_get_min_value(const lv_obj_t * obj); + +/** + * Get the maximum value of an arc + * @param obj pointer to an arc object + * @return the maximum value of the arc + */ +int16_t lv_arc_get_max_value(const lv_obj_t * obj); + +/** + * Get whether the arc is type or not. + * @param obj pointer to an arc object + * @return arc's mode + */ +lv_arc_mode_t lv_arc_get_mode(const lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +/** + * Align an object to the current position of the arc (knob) + * @param obj pointer to an arc object + * @param obj_to_align pointer to an object to align + * @param r_offset consider the radius larger with this value (< 0: for smaller radius) + */ +void lv_arc_align_obj_to_angle(const lv_obj_t * obj, lv_obj_t * obj_to_align, lv_coord_t r_offset); + +/** + * Rotate an object to the current position of the arc (knob) + * @param obj pointer to an arc object + * @param obj_to_align pointer to an object to rotate + * @param r_offset consider the radius larger with this value (< 0: for smaller radius) + */ +void lv_arc_rotate_obj_to_angle(const lv_obj_t * obj, lv_obj_t * obj_to_rotate, lv_coord_t r_offset); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_ARC*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ARC_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_bar.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_bar.c new file mode 100644 index 0000000..0da2a98 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_bar.c @@ -0,0 +1,611 @@ +/** + * @file lv_bar.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_bar.h" +#if LV_USE_BAR != 0 + +#include "../misc/lv_assert.h" +#include "../draw/lv_draw.h" +#include "../misc/lv_anim.h" +#include "../misc/lv_math.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_bar_class + +/** hor. pad and ver. pad cannot make the indicator smaller than this [px]*/ +#define LV_BAR_SIZE_MIN 4 + +#define LV_BAR_IS_ANIMATING(anim_struct) (((anim_struct).anim_state) != LV_BAR_ANIM_STATE_INV) +#define LV_BAR_GET_ANIM_VALUE(orig_value, anim_struct) (LV_BAR_IS_ANIMATING(anim_struct) ? ((anim_struct).anim_end) : (orig_value)) + +/** Bar animation start value. (Not the real value of the Bar just indicates process animation)*/ +#define LV_BAR_ANIM_STATE_START 0 + +/** Bar animation end value. (Not the real value of the Bar just indicates process animation)*/ +#define LV_BAR_ANIM_STATE_END 256 + +/** Mark no animation is in progress*/ +#define LV_BAR_ANIM_STATE_INV -1 + +/** log2(LV_BAR_ANIM_STATE_END) used to normalize data*/ +#define LV_BAR_ANIM_STATE_NORM 8 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_bar_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_bar_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_bar_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_indic(lv_event_t * e); +static void lv_bar_set_value_with_anim(lv_obj_t * obj, int32_t new_value, int32_t * value_ptr, + _lv_bar_anim_t * anim_info, lv_anim_enable_t en); +static void lv_bar_init_anim(lv_obj_t * bar, _lv_bar_anim_t * bar_anim); +static void lv_bar_anim(void * bar, int32_t value); +static void lv_bar_anim_ready(lv_anim_t * a); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_bar_class = { + .constructor_cb = lv_bar_constructor, + .destructor_cb = lv_bar_destructor, + .event_cb = lv_bar_event, + .width_def = LV_DPI_DEF * 2, + .height_def = LV_DPI_DEF / 10, + .instance_size = sizeof(lv_bar_t), + .base_class = &lv_obj_class +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_bar_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_bar_set_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + if(bar->cur_value == value) return; + + value = LV_CLAMP(bar->min_value, value, bar->max_value); + value = value < bar->start_value ? bar->start_value : value; /*Can't be smaller than the left value*/ + + if(bar->cur_value == value) return; + lv_bar_set_value_with_anim(obj, value, &bar->cur_value, &bar->cur_value_anim, anim); +} + +void lv_bar_set_start_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_bar_t * bar = (lv_bar_t *)obj; + + if(bar->mode != LV_BAR_MODE_RANGE) { + return; + } + + value = LV_CLAMP(bar->min_value, value, bar->max_value); + value = value > bar->cur_value ? bar->cur_value : value; /*Can't be greater than the right value*/ + + if(bar->start_value == value) return; + lv_bar_set_value_with_anim(obj, value, &bar->start_value, &bar->start_value_anim, anim); +} + +void lv_bar_set_range(lv_obj_t * obj, int32_t min, int32_t max) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_bar_t * bar = (lv_bar_t *)obj; + + if(bar->min_value == min && bar->max_value == max) return; + + bar->max_value = max; + bar->min_value = min; + + if(lv_bar_get_mode(obj) != LV_BAR_MODE_RANGE) + bar->start_value = min; + + if(bar->cur_value > max) { + bar->cur_value = max; + lv_bar_set_value(obj, bar->cur_value, LV_ANIM_OFF); + } + if(bar->cur_value < min) { + bar->cur_value = min; + lv_bar_set_value(obj, bar->cur_value, LV_ANIM_OFF); + } + lv_obj_invalidate(obj); +} + +void lv_bar_set_mode(lv_obj_t * obj, lv_bar_mode_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + bar->mode = mode; + if(bar->mode != LV_BAR_MODE_RANGE) { + bar->start_value = bar->min_value; + } + + lv_obj_invalidate(obj); +} + +/*===================== + * Getter functions + *====================*/ + +int32_t lv_bar_get_value(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + return LV_BAR_GET_ANIM_VALUE(bar->cur_value, bar->cur_value_anim); +} + +int32_t lv_bar_get_start_value(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + if(bar->mode != LV_BAR_MODE_RANGE) return bar->min_value; + + return LV_BAR_GET_ANIM_VALUE(bar->start_value, bar->start_value_anim); +} + +int32_t lv_bar_get_min_value(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + return bar->min_value; +} + +int32_t lv_bar_get_max_value(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + return bar->max_value; +} + +lv_bar_mode_t lv_bar_get_mode(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + return bar->mode; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_bar_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_bar_t * bar = (lv_bar_t *)obj; + bar->min_value = 0; + bar->max_value = 100; + bar->start_value = 0; + bar->cur_value = 0; + bar->indic_area.x1 = 0; + bar->indic_area.x2 = 0; + bar->indic_area.y1 = 0; + bar->indic_area.y2 = 0; + bar->mode = LV_BAR_MODE_NORMAL; + + lv_bar_init_anim(obj, &bar->cur_value_anim); + lv_bar_init_anim(obj, &bar->start_value_anim); + + lv_obj_clear_flag(obj, LV_OBJ_FLAG_CHECKABLE); + lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE); + lv_bar_set_value(obj, 0, LV_ANIM_OFF); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_bar_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_bar_t * bar = (lv_bar_t *)obj; + + lv_anim_del(&bar->cur_value_anim, NULL); + lv_anim_del(&bar->start_value_anim, NULL); +} + +static void draw_indic(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + lv_bar_t * bar = (lv_bar_t *)obj; + + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + + lv_area_t bar_coords; + lv_obj_get_coords(obj, &bar_coords); + + lv_coord_t transf_w = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); + lv_coord_t transf_h = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); + bar_coords.x1 -= transf_w; + bar_coords.x2 += transf_w; + bar_coords.y1 -= transf_h; + bar_coords.y2 += transf_h; + lv_coord_t barw = lv_area_get_width(&bar_coords); + lv_coord_t barh = lv_area_get_height(&bar_coords); + int32_t range = bar->max_value - bar->min_value; + bool hor = barw >= barh ? true : false; + bool sym = false; + if(bar->mode == LV_BAR_MODE_SYMMETRICAL && bar->min_value < 0 && bar->max_value > 0 && + bar->start_value == bar->min_value) sym = true; + + /*Calculate the indicator area*/ + lv_coord_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + lv_coord_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + lv_coord_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + lv_coord_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + /*Respect padding and minimum width/height too*/ + lv_area_copy(&bar->indic_area, &bar_coords); + bar->indic_area.x1 += bg_left; + bar->indic_area.x2 -= bg_right; + bar->indic_area.y1 += bg_top; + bar->indic_area.y2 -= bg_bottom; + + if(hor && lv_area_get_height(&bar->indic_area) < LV_BAR_SIZE_MIN) { + bar->indic_area.y1 = obj->coords.y1 + (barh / 2) - (LV_BAR_SIZE_MIN / 2); + bar->indic_area.y2 = bar->indic_area.y1 + LV_BAR_SIZE_MIN; + } + else if(!hor && lv_area_get_width(&bar->indic_area) < LV_BAR_SIZE_MIN) { + bar->indic_area.x1 = obj->coords.x1 + (barw / 2) - (LV_BAR_SIZE_MIN / 2); + bar->indic_area.x2 = bar->indic_area.x1 + LV_BAR_SIZE_MIN; + } + + lv_coord_t indicw = lv_area_get_width(&bar->indic_area); + lv_coord_t indich = lv_area_get_height(&bar->indic_area); + + /*Calculate the indicator length*/ + lv_coord_t anim_length = hor ? indicw : indich; + + lv_coord_t anim_cur_value_x, anim_start_value_x; + + lv_coord_t * axis1, * axis2; + lv_coord_t (*indic_length_calc)(const lv_area_t * area); + + if(hor) { + axis1 = &bar->indic_area.x1; + axis2 = &bar->indic_area.x2; + indic_length_calc = lv_area_get_width; + } + else { + axis1 = &bar->indic_area.y1; + axis2 = &bar->indic_area.y2; + indic_length_calc = lv_area_get_height; + } + + if(LV_BAR_IS_ANIMATING(bar->start_value_anim)) { + lv_coord_t anim_start_value_start_x = + (int32_t)((int32_t)anim_length * (bar->start_value_anim.anim_start - bar->min_value)) / range; + lv_coord_t anim_start_value_end_x = + (int32_t)((int32_t)anim_length * (bar->start_value_anim.anim_end - bar->min_value)) / range; + + anim_start_value_x = (((anim_start_value_end_x - anim_start_value_start_x) * bar->start_value_anim.anim_state) / + LV_BAR_ANIM_STATE_END); + + anim_start_value_x += anim_start_value_start_x; + } + else { + anim_start_value_x = (int32_t)((int32_t)anim_length * (bar->start_value - bar->min_value)) / range; + } + + if(LV_BAR_IS_ANIMATING(bar->cur_value_anim)) { + lv_coord_t anim_cur_value_start_x = + (int32_t)((int32_t)anim_length * (bar->cur_value_anim.anim_start - bar->min_value)) / range; + lv_coord_t anim_cur_value_end_x = + (int32_t)((int32_t)anim_length * (bar->cur_value_anim.anim_end - bar->min_value)) / range; + + anim_cur_value_x = anim_cur_value_start_x + (((anim_cur_value_end_x - anim_cur_value_start_x) * + bar->cur_value_anim.anim_state) / + LV_BAR_ANIM_STATE_END); + } + else { + anim_cur_value_x = (int32_t)((int32_t)anim_length * (bar->cur_value - bar->min_value)) / range; + } + + lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + if(hor && base_dir == LV_BASE_DIR_RTL) { + /*Swap axes*/ + lv_coord_t * tmp; + tmp = axis1; + axis1 = axis2; + axis2 = tmp; + anim_cur_value_x = -anim_cur_value_x; + anim_start_value_x = -anim_start_value_x; + } + + /*Set the indicator length*/ + if(hor) { + *axis2 = *axis1 + anim_cur_value_x; + *axis1 += anim_start_value_x; + } + else { + *axis1 = *axis2 - anim_cur_value_x + 1; + *axis2 -= anim_start_value_x; + } + if(sym) { + lv_coord_t zero, shift; + shift = (-bar->min_value * anim_length) / range; + if(hor) { + zero = *axis1 + shift; + if(*axis2 > zero) + *axis1 = zero; + else { + *axis1 = *axis2; + *axis2 = zero; + } + } + else { + zero = *axis2 - shift + 1; + if(*axis1 > zero) + *axis2 = zero; + else { + *axis2 = *axis1; + *axis1 = zero; + } + if(*axis2 < *axis1) { + /*swap*/ + zero = *axis1; + *axis1 = *axis2; + *axis2 = zero; + } + } + } + + /*Do not draw a zero length indicator but at least call the draw part events*/ + if(!sym && indic_length_calc(&bar->indic_area) <= 1) { + + lv_obj_draw_part_dsc_t part_draw_dsc; + lv_obj_draw_dsc_init(&part_draw_dsc, draw_ctx); + part_draw_dsc.part = LV_PART_INDICATOR; + part_draw_dsc.class_p = MY_CLASS; + part_draw_dsc.type = LV_BAR_DRAW_PART_INDICATOR; + part_draw_dsc.draw_area = &bar->indic_area; + + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + return; + } + + lv_area_t indic_area; + lv_area_copy(&indic_area, &bar->indic_area); + + lv_draw_rect_dsc_t draw_rect_dsc; + lv_draw_rect_dsc_init(&draw_rect_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &draw_rect_dsc); + + lv_obj_draw_part_dsc_t part_draw_dsc; + lv_obj_draw_dsc_init(&part_draw_dsc, draw_ctx); + part_draw_dsc.part = LV_PART_INDICATOR; + part_draw_dsc.class_p = MY_CLASS; + part_draw_dsc.type = LV_BAR_DRAW_PART_INDICATOR; + part_draw_dsc.rect_dsc = &draw_rect_dsc; + part_draw_dsc.draw_area = &bar->indic_area; + + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + + lv_coord_t bg_radius = lv_obj_get_style_radius(obj, LV_PART_MAIN); + lv_coord_t short_side = LV_MIN(barw, barh); + if(bg_radius > short_side >> 1) bg_radius = short_side >> 1; + + lv_coord_t indic_radius = draw_rect_dsc.radius; + short_side = LV_MIN(indicw, indich); + if(indic_radius > short_side >> 1) indic_radius = short_side >> 1; + + /*Draw only the shadow and outline only if the indicator is long enough. + *The radius of the bg and the indicator can make a strange shape where + *it'd be very difficult to draw shadow.*/ + if((hor && lv_area_get_width(&bar->indic_area) > indic_radius * 2) || + (!hor && lv_area_get_height(&bar->indic_area) > indic_radius * 2)) { + lv_opa_t bg_opa = draw_rect_dsc.bg_opa; + lv_opa_t bg_img_opa = draw_rect_dsc.bg_img_opa; + lv_opa_t border_opa = draw_rect_dsc.border_opa; + draw_rect_dsc.bg_opa = LV_OPA_TRANSP; + draw_rect_dsc.bg_img_opa = LV_OPA_TRANSP; + draw_rect_dsc.border_opa = LV_OPA_TRANSP; + + lv_draw_rect(draw_ctx, &draw_rect_dsc, &bar->indic_area); + + draw_rect_dsc.bg_opa = bg_opa; + draw_rect_dsc.bg_img_opa = bg_img_opa; + draw_rect_dsc.border_opa = border_opa; + } + +#if LV_DRAW_COMPLEX + lv_draw_mask_radius_param_t mask_bg_param; + lv_area_t bg_mask_area; + bg_mask_area.x1 = obj->coords.x1 + bg_left; + bg_mask_area.x2 = obj->coords.x2 - bg_right; + bg_mask_area.y1 = obj->coords.y1 + bg_top; + bg_mask_area.y2 = obj->coords.y2 - bg_bottom; + + lv_draw_mask_radius_init(&mask_bg_param, &bg_mask_area, bg_radius, false); + lv_coord_t mask_bg_id = lv_draw_mask_add(&mask_bg_param, NULL); +#endif + + /*Draw_only the background and background image*/ + lv_opa_t shadow_opa = draw_rect_dsc.shadow_opa; + lv_opa_t border_opa = draw_rect_dsc.border_opa; + draw_rect_dsc.border_opa = LV_OPA_TRANSP; + draw_rect_dsc.shadow_opa = LV_OPA_TRANSP; + + /*Get the max possible indicator area. The gradient should be applied on this*/ + lv_area_t mask_indic_max_area; + lv_area_copy(&mask_indic_max_area, &bar_coords); + mask_indic_max_area.x1 += bg_left; + mask_indic_max_area.y1 += bg_top; + mask_indic_max_area.x2 -= bg_right; + mask_indic_max_area.y2 -= bg_bottom; + if(hor && lv_area_get_height(&mask_indic_max_area) < LV_BAR_SIZE_MIN) { + mask_indic_max_area.y1 = obj->coords.y1 + (barh / 2) - (LV_BAR_SIZE_MIN / 2); + mask_indic_max_area.y2 = mask_indic_max_area.y1 + LV_BAR_SIZE_MIN; + } + else if(!hor && lv_area_get_width(&mask_indic_max_area) < LV_BAR_SIZE_MIN) { + mask_indic_max_area.x1 = obj->coords.x1 + (barw / 2) - (LV_BAR_SIZE_MIN / 2); + mask_indic_max_area.x2 = mask_indic_max_area.x1 + LV_BAR_SIZE_MIN; + } + +#if LV_DRAW_COMPLEX + /*Create a mask to the current indicator area to see only this part from the whole gradient.*/ + lv_draw_mask_radius_param_t mask_indic_param; + lv_draw_mask_radius_init(&mask_indic_param, &bar->indic_area, draw_rect_dsc.radius, false); + int16_t mask_indic_id = lv_draw_mask_add(&mask_indic_param, NULL); +#endif + + lv_draw_rect(draw_ctx, &draw_rect_dsc, &mask_indic_max_area); + draw_rect_dsc.border_opa = border_opa; + draw_rect_dsc.shadow_opa = shadow_opa; + + /*Draw the border*/ + draw_rect_dsc.bg_opa = LV_OPA_TRANSP; + draw_rect_dsc.bg_img_opa = LV_OPA_TRANSP; + draw_rect_dsc.shadow_opa = LV_OPA_TRANSP; + lv_draw_rect(draw_ctx, &draw_rect_dsc, &bar->indic_area); + +#if LV_DRAW_COMPLEX + lv_draw_mask_free_param(&mask_indic_param); + lv_draw_mask_free_param(&mask_bg_param); + lv_draw_mask_remove_id(mask_indic_id); + lv_draw_mask_remove_id(mask_bg_id); +#endif + + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); +} + +static void lv_bar_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_res_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RES_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + + if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + lv_coord_t indic_size; + indic_size = lv_obj_calculate_ext_draw_size(obj, LV_PART_INDICATOR); + + /*Bg size is handled by lv_obj*/ + lv_coord_t * s = lv_event_get_param(e); + *s = LV_MAX(*s, indic_size); + + /*Calculate the indicator area*/ + lv_coord_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + lv_coord_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + lv_coord_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + lv_coord_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + + lv_coord_t pad = LV_MIN4(bg_left, bg_right, bg_top, bg_bottom); + if(pad < 0) { + *s = LV_MAX(*s, -pad); + } + } + else if(code == LV_EVENT_PRESSED || code == LV_EVENT_RELEASED) { + lv_bar_t * bar = (lv_bar_t *)obj; + lv_obj_invalidate_area(obj, &bar->indic_area); + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_indic(e); + } +} + +static void lv_bar_anim(void * var, int32_t value) +{ + _lv_bar_anim_t * bar_anim = var; + bar_anim->anim_state = value; + lv_obj_invalidate(bar_anim->bar); +} + +static void lv_bar_anim_ready(lv_anim_t * a) +{ + _lv_bar_anim_t * var = a->var; + lv_obj_t * obj = (lv_obj_t *)var->bar; + lv_bar_t * bar = (lv_bar_t *)obj; + + var->anim_state = LV_BAR_ANIM_STATE_INV; + if(var == &bar->cur_value_anim) + bar->cur_value = var->anim_end; + else if(var == &bar->start_value_anim) + bar->start_value = var->anim_end; + lv_obj_invalidate(var->bar); +} + +static void lv_bar_set_value_with_anim(lv_obj_t * obj, int32_t new_value, int32_t * value_ptr, + _lv_bar_anim_t * anim_info, lv_anim_enable_t en) +{ + if(en == LV_ANIM_OFF) { + *value_ptr = new_value; + lv_obj_invalidate((lv_obj_t *)obj); + } + else { + /*No animation in progress -> simply set the values*/ + if(anim_info->anim_state == LV_BAR_ANIM_STATE_INV) { + anim_info->anim_start = *value_ptr; + anim_info->anim_end = new_value; + } + /*Animation in progress. Start from the animation end value*/ + else { + anim_info->anim_start = anim_info->anim_end; + anim_info->anim_end = new_value; + } + *value_ptr = new_value; + /*Stop the previous animation if it exists*/ + lv_anim_del(anim_info, NULL); + + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, anim_info); + lv_anim_set_exec_cb(&a, lv_bar_anim); + lv_anim_set_values(&a, LV_BAR_ANIM_STATE_START, LV_BAR_ANIM_STATE_END); + lv_anim_set_ready_cb(&a, lv_bar_anim_ready); + lv_anim_set_time(&a, lv_obj_get_style_anim_time(obj, LV_PART_MAIN)); + lv_anim_start(&a); + } +} + +static void lv_bar_init_anim(lv_obj_t * obj, _lv_bar_anim_t * bar_anim) +{ + bar_anim->bar = obj; + bar_anim->anim_start = 0; + bar_anim->anim_end = 0; + bar_anim->anim_state = LV_BAR_ANIM_STATE_INV; +} + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_bar.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_bar.h new file mode 100644 index 0000000..1726425 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_bar.h @@ -0,0 +1,164 @@ +/** + * @file lv_bar.h + * + */ + +#ifndef LV_BAR_H +#define LV_BAR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#if LV_USE_BAR != 0 + +#include "../core/lv_obj.h" +#include "../misc/lv_anim.h" +#include "lv_btn.h" +#include "lv_label.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +enum { + LV_BAR_MODE_NORMAL, + LV_BAR_MODE_SYMMETRICAL, + LV_BAR_MODE_RANGE +}; +typedef uint8_t lv_bar_mode_t; + +typedef struct { + lv_obj_t * bar; + int32_t anim_start; + int32_t anim_end; + int32_t anim_state; +} _lv_bar_anim_t; + +typedef struct { + lv_obj_t obj; + int32_t cur_value; /**< Current value of the bar*/ + int32_t min_value; /**< Minimum value of the bar*/ + int32_t max_value; /**< Maximum value of the bar*/ + int32_t start_value; /**< Start value of the bar*/ + lv_area_t indic_area; /**< Save the indicator area. Might be used by derived types*/ + _lv_bar_anim_t cur_value_anim; + _lv_bar_anim_t start_value_anim; + lv_bar_mode_t mode : 2; /**< Type of bar*/ +} lv_bar_t; + +extern const lv_obj_class_t lv_bar_class; + +/** + * `type` field in `lv_obj_draw_part_dsc_t` if `class_p = lv_bar_class` + * Used in `LV_EVENT_DRAW_PART_BEGIN` and `LV_EVENT_DRAW_PART_END` + */ +typedef enum { + LV_BAR_DRAW_PART_INDICATOR, /**< The indicator*/ +} lv_bar_draw_part_type_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a bar object + * @param parent pointer to an object, it will be the parent of the new bar + * @return pointer to the created bar + */ +lv_obj_t * lv_bar_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set a new value on the bar + * @param bar pointer to a bar object + * @param value new value + * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately + */ +void lv_bar_set_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim); + +/** + * Set a new start value on the bar + * @param obj pointer to a bar object + * @param value new start value + * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately + */ +void lv_bar_set_start_value(lv_obj_t * obj, int32_t start_value, lv_anim_enable_t anim); + +/** + * Set minimum and the maximum values of a bar + * @param obj pointer to the bar object + * @param min minimum value + * @param max maximum value + */ +void lv_bar_set_range(lv_obj_t * obj, int32_t min, int32_t max); + +/** + * Set the type of bar. + * @param obj pointer to bar object + * @param mode bar type from ::lv_bar_mode_t + */ +void lv_bar_set_mode(lv_obj_t * obj, lv_bar_mode_t mode); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the value of a bar + * @param obj pointer to a bar object + * @return the value of the bar + */ +int32_t lv_bar_get_value(const lv_obj_t * obj); + +/** + * Get the start value of a bar + * @param obj pointer to a bar object + * @return the start value of the bar + */ +int32_t lv_bar_get_start_value(const lv_obj_t * obj); + +/** + * Get the minimum value of a bar + * @param obj pointer to a bar object + * @return the minimum value of the bar + */ +int32_t lv_bar_get_min_value(const lv_obj_t * obj); + +/** + * Get the maximum value of a bar + * @param obj pointer to a bar object + * @return the maximum value of the bar + */ +int32_t lv_bar_get_max_value(const lv_obj_t * obj); + +/** + * Get the type of bar. + * @param obj pointer to bar object + * @return bar type from ::lv_bar_mode_t + */ +lv_bar_mode_t lv_bar_get_mode(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_BAR*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BAR_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_btn.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_btn.c new file mode 100644 index 0000000..5676dc7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_btn.c @@ -0,0 +1,72 @@ +/** + * @file lv_btn.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_btn.h" +#if LV_USE_BTN != 0 + +#include "../extra/layouts/flex/lv_flex.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_btn_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_btn_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_btn_class = { + .constructor_cb = lv_btn_constructor, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .instance_size = sizeof(lv_btn_t), + .base_class = &lv_obj_class +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_btn_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_btn_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + + LV_TRACE_OBJ_CREATE("finished"); +} + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_btn.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_btn.h new file mode 100644 index 0000000..1d471f9 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_btn.h @@ -0,0 +1,56 @@ +/** + * @file lv_btn.h + * + */ + +#ifndef LV_BTN_H +#define LV_BTN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#if LV_USE_BTN != 0 +#include "../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_obj_t obj; +} lv_btn_t; + +extern const lv_obj_class_t lv_btn_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a button object + * @param parent pointer to an object, it will be the parent of the new button + * @return pointer to the created button + */ +lv_obj_t * lv_btn_create(lv_obj_t * parent); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_BTN*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BTN_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_btnmatrix.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_btnmatrix.c new file mode 100644 index 0000000..92a4d2f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_btnmatrix.c @@ -0,0 +1,1048 @@ +/** + * @file lv_btnmatrix.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_btnmatrix.h" +#if LV_USE_BTNMATRIX != 0 + +#include "../misc/lv_assert.h" +#include "../core/lv_indev.h" +#include "../core/lv_group.h" +#include "../draw/lv_draw.h" +#include "../core/lv_refr.h" +#include "../misc/lv_txt.h" +#include "../misc/lv_txt_ap.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_btnmatrix_class + +#define BTN_EXTRA_CLICK_AREA_MAX (LV_DPI_DEF / 10) +#define LV_BTNMATRIX_WIDTH_MASK 0x0007 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_btnmatrix_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_btnmatrix_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_main(lv_event_t * e); + +static uint8_t get_button_width(lv_btnmatrix_ctrl_t ctrl_bits); +static bool button_is_hidden(lv_btnmatrix_ctrl_t ctrl_bits); +static bool button_is_checked(lv_btnmatrix_ctrl_t ctrl_bits); +static bool button_is_repeat_disabled(lv_btnmatrix_ctrl_t ctrl_bits); +static bool button_is_inactive(lv_btnmatrix_ctrl_t ctrl_bits); +static bool button_is_click_trig(lv_btnmatrix_ctrl_t ctrl_bits); +static bool button_is_popover(lv_btnmatrix_ctrl_t ctrl_bits); +static bool button_is_checkable(lv_btnmatrix_ctrl_t ctrl_bits); +static bool button_is_recolor(lv_btnmatrix_ctrl_t ctrl_bits); +static bool button_get_checked(lv_btnmatrix_ctrl_t ctrl_bits); +static uint16_t get_button_from_point(lv_obj_t * obj, lv_point_t * p); +static void allocate_btn_areas_and_controls(const lv_obj_t * obj, const char ** map); +static void invalidate_button_area(const lv_obj_t * obj, uint16_t btn_idx); +static void make_one_button_checked(lv_obj_t * obj, uint16_t btn_idx); +static bool has_popovers_in_top_row(lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ +static const char * lv_btnmatrix_def_map[] = {"Btn1", "Btn2", "Btn3", "\n", "Btn4", "Btn5", ""}; + +const lv_obj_class_t lv_btnmatrix_class = { + .constructor_cb = lv_btnmatrix_constructor, + .destructor_cb = lv_btnmatrix_destructor, + .event_cb = lv_btnmatrix_event, + .width_def = LV_DPI_DEF * 2, + .height_def = LV_DPI_DEF, + .instance_size = sizeof(lv_btnmatrix_t), + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .base_class = &lv_obj_class +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_btnmatrix_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_btnmatrix_set_map(lv_obj_t * obj, const char * map[]) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + if(map == NULL) return; + + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj; + + /*Analyze the map and create the required number of buttons*/ + allocate_btn_areas_and_controls(obj, map); + btnm->map_p = map; + + lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + + /*Set size and positions of the buttons*/ + lv_coord_t pleft = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + lv_coord_t ptop = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + lv_coord_t prow = lv_obj_get_style_pad_row(obj, LV_PART_MAIN); + lv_coord_t pcol = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + + lv_coord_t max_w = lv_obj_get_content_width(obj); + lv_coord_t max_h = lv_obj_get_content_height(obj); + + /*Calculate the position of each row*/ + lv_coord_t max_h_no_gap = max_h - (prow * (btnm->row_cnt - 1)); + + /*Count the units and the buttons in a line + *(A button can be 1,2,3... unit wide)*/ + uint32_t txt_tot_i = 0; /*Act. index in the str map*/ + uint32_t btn_tot_i = 0; /*Act. index of button areas*/ + const char ** map_row = map; + + /*Count the units and the buttons in a line*/ + uint32_t row; + for(row = 0; row < btnm->row_cnt; row++) { + uint16_t unit_cnt = 0; /*Number of units in a row*/ + uint16_t btn_cnt = 0; /*Number of buttons in a row*/ + /*Count the buttons and units in this row*/ + while(map_row[btn_cnt] && strcmp(map_row[btn_cnt], "\n") != 0 && map_row[btn_cnt][0] != '\0') { + unit_cnt += get_button_width(btnm->ctrl_bits[btn_tot_i + btn_cnt]); + btn_cnt++; + } + + /*Only deal with the non empty lines*/ + if(btn_cnt == 0) { + map_row = &map_row[btn_cnt + 1]; /*Set the map to the next row*/ + continue; + } + + lv_coord_t row_y1 = ptop + (max_h_no_gap * row) / btnm->row_cnt + row * prow; + lv_coord_t row_y2 = ptop + (max_h_no_gap * (row + 1)) / btnm->row_cnt + row * prow - 1; + + /*Set the button size and positions*/ + lv_coord_t max_w_no_gap = max_w - (pcol * (btn_cnt - 1)); + if(max_w_no_gap < 0) max_w_no_gap = 0; + + uint32_t row_unit_cnt = 0; /*The current unit position in the row*/ + uint32_t btn; + for(btn = 0; btn < btn_cnt; btn++, btn_tot_i++, txt_tot_i++) { + uint32_t btn_u = get_button_width(btnm->ctrl_bits[btn_tot_i]); + + lv_coord_t btn_x1 = (max_w_no_gap * row_unit_cnt) / unit_cnt + btn * pcol; + lv_coord_t btn_x2 = (max_w_no_gap * (row_unit_cnt + btn_u)) / unit_cnt + btn * pcol - 1; + + /*If RTL start from the right*/ + if(base_dir == LV_BASE_DIR_RTL) { + lv_coord_t tmp = btn_x1; + btn_x1 = btn_x2; + btn_x2 = tmp; + + btn_x1 = max_w - btn_x1; + btn_x2 = max_w - btn_x2; + } + + btn_x1 += pleft; + btn_x2 += pleft; + + lv_area_set(&btnm->button_areas[btn_tot_i], btn_x1, row_y1, btn_x2, row_y2); + + row_unit_cnt += btn_u; + } + + map_row = &map_row[btn_cnt + 1]; /*Set the map to the next line*/ + } + + /*Popovers in the top row will draw outside the widget and the extended draw size depends on + *the row height which may have changed when setting the new map*/ + lv_obj_refresh_ext_draw_size(obj); + + lv_obj_invalidate(obj); +} + +void lv_btnmatrix_set_ctrl_map(lv_obj_t * obj, const lv_btnmatrix_ctrl_t ctrl_map[]) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj; + lv_memcpy(btnm->ctrl_bits, ctrl_map, sizeof(lv_btnmatrix_ctrl_t) * btnm->btn_cnt); + + lv_btnmatrix_set_map(obj, btnm->map_p); +} + +void lv_btnmatrix_set_selected_btn(lv_obj_t * obj, uint16_t btn_id) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj; + + if(btn_id >= btnm->btn_cnt && btn_id != LV_BTNMATRIX_BTN_NONE) return; + + invalidate_button_area(obj, btnm->btn_id_sel); + btnm->btn_id_sel = btn_id; + invalidate_button_area(obj, btn_id); +} + +void lv_btnmatrix_set_btn_ctrl(lv_obj_t * obj, uint16_t btn_id, lv_btnmatrix_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj;; + + if(btn_id >= btnm->btn_cnt) return; + + if(btnm->one_check && (ctrl & LV_BTNMATRIX_CTRL_CHECKED)) { + lv_btnmatrix_clear_btn_ctrl_all(obj, LV_BTNMATRIX_CTRL_CHECKED); + } + + btnm->ctrl_bits[btn_id] |= ctrl; + invalidate_button_area(obj, btn_id); + + if(ctrl & LV_BTNMATRIX_CTRL_POPOVER) { + lv_obj_refresh_ext_draw_size(obj); + } +} + +void lv_btnmatrix_clear_btn_ctrl(lv_obj_t * obj, uint16_t btn_id, lv_btnmatrix_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj;; + + if(btn_id >= btnm->btn_cnt) return; + + btnm->ctrl_bits[btn_id] &= (~ctrl); + invalidate_button_area(obj, btn_id); + + if(ctrl & LV_BTNMATRIX_CTRL_POPOVER) { + lv_obj_refresh_ext_draw_size(obj); + } +} + +void lv_btnmatrix_set_btn_ctrl_all(lv_obj_t * obj, lv_btnmatrix_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj;; + uint16_t i; + for(i = 0; i < btnm->btn_cnt; i++) { + lv_btnmatrix_set_btn_ctrl(obj, i, ctrl); + } +} + +void lv_btnmatrix_clear_btn_ctrl_all(lv_obj_t * obj, lv_btnmatrix_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj;; + uint16_t i; + for(i = 0; i < btnm->btn_cnt; i++) { + lv_btnmatrix_clear_btn_ctrl(obj, i, ctrl); + } +} + +void lv_btnmatrix_set_btn_width(lv_obj_t * obj, uint16_t btn_id, uint8_t width) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj;; + if(btn_id >= btnm->btn_cnt) return; + btnm->ctrl_bits[btn_id] &= (~LV_BTNMATRIX_WIDTH_MASK); + btnm->ctrl_bits[btn_id] |= (LV_BTNMATRIX_WIDTH_MASK & width); + + lv_btnmatrix_set_map(obj, btnm->map_p); +} + +void lv_btnmatrix_set_one_checked(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj;; + btnm->one_check = en; + + /*If more than one button is toggled only the first one should be*/ + make_one_button_checked(obj, 0); +} + +/*===================== + * Getter functions + *====================*/ + +const char ** lv_btnmatrix_get_map(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj;; + return btnm->map_p; +} + +uint16_t lv_btnmatrix_get_selected_btn(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj;; + return btnm->btn_id_sel; +} + +const char * lv_btnmatrix_get_btn_text(const lv_obj_t * obj, uint16_t btn_id) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(btn_id == LV_BTNMATRIX_BTN_NONE) return NULL; + + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj; + if(btn_id > btnm->btn_cnt) return NULL; + + uint16_t txt_i = 0; + uint16_t btn_i = 0; + + /*Search the text of btnm->btn_pr the buttons text in the map + *Skip "\n"-s*/ + while(btn_i != btn_id) { + btn_i++; + txt_i++; + if(strcmp(btnm->map_p[txt_i], "\n") == 0) txt_i++; + } + + if(btn_i == btnm->btn_cnt) return NULL; + + return btnm->map_p[txt_i]; +} + +bool lv_btnmatrix_has_btn_ctrl(lv_obj_t * obj, uint16_t btn_id, lv_btnmatrix_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj;; + if(btn_id >= btnm->btn_cnt) return false; + + return ((btnm->ctrl_bits[btn_id] & ctrl) == ctrl) ? true : false; +} + +bool lv_btnmatrix_get_one_checked(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj;; + + return btnm->one_check; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_btnmatrix_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj; + btnm->btn_cnt = 0; + btnm->row_cnt = 0; + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; + btnm->button_areas = NULL; + btnm->ctrl_bits = NULL; + btnm->map_p = NULL; + btnm->one_check = 0; + + lv_btnmatrix_set_map(obj, lv_btnmatrix_def_map); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_btnmatrix_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_TRACE_OBJ_CREATE("begin"); + LV_UNUSED(class_p); + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj; + lv_mem_free(btnm->button_areas); + lv_mem_free(btnm->ctrl_bits); + btnm->button_areas = NULL; + btnm->ctrl_bits = NULL; + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_res_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RES_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj; + lv_point_t p; + + if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + if(has_popovers_in_top_row(obj)) { + /*reserve one row worth of extra space to account for popovers in the top row*/ + lv_coord_t s = btnm->row_cnt > 0 ? lv_obj_get_content_height(obj) / btnm->row_cnt : 0; + lv_event_set_ext_draw_size(e, s); + } + } + if(code == LV_EVENT_STYLE_CHANGED) { + lv_btnmatrix_set_map(obj, btnm->map_p); + } + else if(code == LV_EVENT_SIZE_CHANGED) { + lv_btnmatrix_set_map(obj, btnm->map_p); + } + else if(code == LV_EVENT_PRESSED) { + void * param = lv_event_get_param(e); + invalidate_button_area(obj, btnm->btn_id_sel); + + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_get_act()); + if(indev_type == LV_INDEV_TYPE_POINTER || indev_type == LV_INDEV_TYPE_BUTTON) { + uint16_t btn_pr; + /*Search the pressed area*/ + lv_indev_get_point(param, &p); + btn_pr = get_button_from_point(obj, &p); + /*Handle the case where there is no button there*/ + if(btn_pr != LV_BTNMATRIX_BTN_NONE) { + if(button_is_inactive(btnm->ctrl_bits[btn_pr]) == false && + button_is_hidden(btnm->ctrl_bits[btn_pr]) == false) { + btnm->btn_id_sel = btn_pr; + invalidate_button_area(obj, btnm->btn_id_sel); /*Invalidate the new area*/ + } + } + } + + if(btnm->btn_id_sel != LV_BTNMATRIX_BTN_NONE) { + if(button_is_click_trig(btnm->ctrl_bits[btnm->btn_id_sel]) == false && + button_is_popover(btnm->ctrl_bits[btnm->btn_id_sel]) == false && + button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel]) == false && + button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) == false) { + uint32_t b = btnm->btn_id_sel; + res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, &b); + if(res != LV_RES_OK) return; + } + } + } + else if(code == LV_EVENT_PRESSING) { + void * param = lv_event_get_param(e); + uint16_t btn_pr = LV_BTNMATRIX_BTN_NONE; + /*Search the pressed area*/ + lv_indev_t * indev = lv_indev_get_act(); + lv_indev_type_t indev_type = lv_indev_get_type(indev); + if(indev_type == LV_INDEV_TYPE_ENCODER || indev_type == LV_INDEV_TYPE_KEYPAD) return; + + lv_indev_get_point(indev, &p); + btn_pr = get_button_from_point(obj, &p); + /*Invalidate to old and the new areas*/ + if(btn_pr != btnm->btn_id_sel) { + if(btnm->btn_id_sel != LV_BTNMATRIX_BTN_NONE) { + invalidate_button_area(obj, btnm->btn_id_sel); + } + + btnm->btn_id_sel = btn_pr; + + lv_indev_reset_long_press(param); /*Start the log press time again on the new button*/ + if(btn_pr != LV_BTNMATRIX_BTN_NONE && + button_is_inactive(btnm->ctrl_bits[btn_pr]) == false && + button_is_hidden(btnm->ctrl_bits[btn_pr]) == false) { + invalidate_button_area(obj, btn_pr); + /*Send VALUE_CHANGED for the newly pressed button*/ + if(button_is_click_trig(btnm->ctrl_bits[btn_pr]) == false && + button_is_popover(btnm->ctrl_bits[btnm->btn_id_sel]) == false) { + uint32_t b = btn_pr; + res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, &b); + if(res != LV_RES_OK) return; + } + } + } + } + else if(code == LV_EVENT_RELEASED) { + if(btnm->btn_id_sel != LV_BTNMATRIX_BTN_NONE) { + /*Toggle the button if enabled*/ + if(button_is_checkable(btnm->ctrl_bits[btnm->btn_id_sel]) && + !button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { + if(button_get_checked(btnm->ctrl_bits[btnm->btn_id_sel]) && !btnm->one_check) { + btnm->ctrl_bits[btnm->btn_id_sel] &= (~LV_BTNMATRIX_CTRL_CHECKED); + } + else { + btnm->ctrl_bits[btnm->btn_id_sel] |= LV_BTNMATRIX_CTRL_CHECKED; + } + if(btnm->one_check) make_one_button_checked(obj, btnm->btn_id_sel); + } + + + if((button_is_click_trig(btnm->ctrl_bits[btnm->btn_id_sel]) == true || + button_is_popover(btnm->ctrl_bits[btnm->btn_id_sel]) == true) && + button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel]) == false && + button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) == false) { + uint32_t b = btnm->btn_id_sel; + res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, &b); + if(res != LV_RES_OK) return; + } + } + + /*Invalidate to old pressed area*/; + invalidate_button_area(obj, btnm->btn_id_sel); + + } + else if(code == LV_EVENT_LONG_PRESSED_REPEAT) { + if(btnm->btn_id_sel != LV_BTNMATRIX_BTN_NONE) { + if(button_is_repeat_disabled(btnm->ctrl_bits[btnm->btn_id_sel]) == false && + button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel]) == false && + button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) == false) { + uint32_t b = btnm->btn_id_sel; + res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, &b); + if(res != LV_RES_OK) return; + } + } + } + else if(code == LV_EVENT_PRESS_LOST) { + invalidate_button_area(obj, btnm->btn_id_sel); + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; + } + else if(code == LV_EVENT_FOCUSED) { + lv_indev_t * indev = lv_event_get_param(e); + lv_indev_type_t indev_type = lv_indev_get_type(indev); + + /*If not focused by an input device assume the last input device*/ + if(indev == NULL) { + indev = lv_indev_get_next(NULL); + indev_type = lv_indev_get_type(indev); + } + + bool editing = lv_group_get_editing(lv_obj_get_group(obj)); + /*Focus the first button if there is not selected button*/ + if(btnm->btn_id_sel == LV_BTNMATRIX_BTN_NONE) { + if(indev_type == LV_INDEV_TYPE_KEYPAD || (indev_type == LV_INDEV_TYPE_ENCODER && editing)) { + uint32_t b = 0; + if(btnm->one_check) { + while(button_is_hidden(btnm->ctrl_bits[b]) || button_is_inactive(btnm->ctrl_bits[b]) || + button_is_checked(btnm->ctrl_bits[b]) == false) b++; + } + else { + while(button_is_hidden(btnm->ctrl_bits[b]) || button_is_inactive(btnm->ctrl_bits[b])) b++; + } + + btnm->btn_id_sel = b; + } + else { + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; + } + } + } + else if(code == LV_EVENT_DEFOCUSED || code == LV_EVENT_LEAVE) { + if(btnm->btn_id_sel != LV_BTNMATRIX_BTN_NONE) invalidate_button_area(obj, btnm->btn_id_sel); + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; + } + else if(code == LV_EVENT_KEY) { + + invalidate_button_area(obj, btnm->btn_id_sel); + + char c = *((char *)lv_event_get_param(e)); + if(c == LV_KEY_RIGHT) { + if(btnm->btn_id_sel == LV_BTNMATRIX_BTN_NONE) btnm->btn_id_sel = 0; + else btnm->btn_id_sel++; + if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + + while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { + btnm->btn_id_sel++; + if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + } + } + else if(c == LV_KEY_LEFT) { + if(btnm->btn_id_sel == LV_BTNMATRIX_BTN_NONE) btnm->btn_id_sel = 0; + + if(btnm->btn_id_sel == 0) btnm->btn_id_sel = btnm->btn_cnt - 1; + else if(btnm->btn_id_sel > 0) btnm->btn_id_sel--; + + while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { + if(btnm->btn_id_sel > 0) btnm->btn_id_sel--; + else btnm->btn_id_sel = btnm->btn_cnt - 1; + } + } + else if(c == LV_KEY_DOWN) { + lv_coord_t col_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + /*Find the area below the current*/ + if(btnm->btn_id_sel == LV_BTNMATRIX_BTN_NONE) { + btnm->btn_id_sel = 0; + while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { + btnm->btn_id_sel++; + if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + } + } + else { + uint16_t area_below; + lv_coord_t pr_center = + btnm->button_areas[btnm->btn_id_sel].x1 + (lv_area_get_width(&btnm->button_areas[btnm->btn_id_sel]) >> 1); + + for(area_below = btnm->btn_id_sel; area_below < btnm->btn_cnt; area_below++) { + if(btnm->button_areas[area_below].y1 > btnm->button_areas[btnm->btn_id_sel].y1 && + pr_center >= btnm->button_areas[area_below].x1 && + pr_center <= btnm->button_areas[area_below].x2 + col_gap && + button_is_inactive(btnm->ctrl_bits[area_below]) == false && + button_is_hidden(btnm->ctrl_bits[area_below]) == false) { + break; + } + } + + if(area_below < btnm->btn_cnt) btnm->btn_id_sel = area_below; + } + } + else if(c == LV_KEY_UP) { + lv_coord_t col_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + /*Find the area below the current*/ + if(btnm->btn_id_sel == LV_BTNMATRIX_BTN_NONE) { + btnm->btn_id_sel = 0; + while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { + btnm->btn_id_sel++; + if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + } + } + else { + int16_t area_above; + lv_coord_t pr_center = + btnm->button_areas[btnm->btn_id_sel].x1 + (lv_area_get_width(&btnm->button_areas[btnm->btn_id_sel]) >> 1); + + for(area_above = btnm->btn_id_sel; area_above >= 0; area_above--) { + if(btnm->button_areas[area_above].y1 < btnm->button_areas[btnm->btn_id_sel].y1 && + pr_center >= btnm->button_areas[area_above].x1 - col_gap && + pr_center <= btnm->button_areas[area_above].x2 && + button_is_inactive(btnm->ctrl_bits[area_above]) == false && + button_is_hidden(btnm->ctrl_bits[area_above]) == false) { + break; + } + } + if(area_above >= 0) btnm->btn_id_sel = area_above; + } + } + + invalidate_button_area(obj, btnm->btn_id_sel); + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_main(e); + } + +} + +static void draw_main(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj; + if(btnm->btn_cnt == 0) return; + + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + obj->skip_trans = 1; + + lv_area_t area_obj; + lv_obj_get_coords(obj, &area_obj); + + lv_area_t btn_area; + + uint16_t btn_i = 0; + uint16_t txt_i = 0; + + lv_draw_rect_dsc_t draw_rect_dsc_act; + lv_draw_label_dsc_t draw_label_dsc_act; + + lv_draw_rect_dsc_t draw_rect_dsc_def; + lv_draw_label_dsc_t draw_label_dsc_def; + + lv_state_t state_ori = obj->state; + obj->state = LV_STATE_DEFAULT; + obj->skip_trans = 1; + lv_draw_rect_dsc_init(&draw_rect_dsc_def); + lv_draw_label_dsc_init(&draw_label_dsc_def); + lv_obj_init_draw_rect_dsc(obj, LV_PART_ITEMS, &draw_rect_dsc_def); + lv_obj_init_draw_label_dsc(obj, LV_PART_ITEMS, &draw_label_dsc_def); + obj->skip_trans = 0; + obj->state = state_ori; + + lv_coord_t ptop = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + lv_coord_t pbottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + lv_coord_t pleft = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + lv_coord_t pright = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + +#if LV_USE_ARABIC_PERSIAN_CHARS + const size_t txt_ap_size = 256 ; + char * txt_ap = lv_mem_buf_get(txt_ap_size); +#endif + + lv_obj_draw_part_dsc_t part_draw_dsc; + lv_obj_draw_dsc_init(&part_draw_dsc, draw_ctx); + part_draw_dsc.part = LV_PART_ITEMS; + part_draw_dsc.class_p = MY_CLASS; + part_draw_dsc.type = LV_BTNMATRIX_DRAW_PART_BTN; + part_draw_dsc.rect_dsc = &draw_rect_dsc_act; + part_draw_dsc.label_dsc = &draw_label_dsc_act; + + for(btn_i = 0; btn_i < btnm->btn_cnt; btn_i++, txt_i++) { + /*Search the next valid text in the map*/ + while(strcmp(btnm->map_p[txt_i], "\n") == 0) { + txt_i++; + } + + /*Skip hidden buttons*/ + if(button_is_hidden(btnm->ctrl_bits[btn_i])) continue; + + /*Get the state of the button*/ + lv_state_t btn_state = LV_STATE_DEFAULT; + if(button_get_checked(btnm->ctrl_bits[btn_i])) btn_state |= LV_STATE_CHECKED; + + if(button_is_inactive(btnm->ctrl_bits[btn_i])) btn_state |= LV_STATE_DISABLED; + else if(btn_i == btnm->btn_id_sel) { + if(state_ori & LV_STATE_PRESSED) btn_state |= LV_STATE_PRESSED; + if(state_ori & LV_STATE_FOCUSED) btn_state |= LV_STATE_FOCUSED; + if(state_ori & LV_STATE_FOCUS_KEY) btn_state |= LV_STATE_FOCUS_KEY; + if(state_ori & LV_STATE_EDITED) btn_state |= LV_STATE_EDITED; + } + + /*Get the button's area*/ + lv_area_copy(&btn_area, &btnm->button_areas[btn_i]); + btn_area.x1 += area_obj.x1; + btn_area.y1 += area_obj.y1; + btn_area.x2 += area_obj.x1; + btn_area.y2 += area_obj.y1; + + /*Set up the draw descriptors*/ + if(btn_state == LV_STATE_DEFAULT) { + lv_memcpy(&draw_rect_dsc_act, &draw_rect_dsc_def, sizeof(lv_draw_rect_dsc_t)); + lv_memcpy(&draw_label_dsc_act, &draw_label_dsc_def, sizeof(lv_draw_label_dsc_t)); + } + /*In other cases get the styles directly without caching them*/ + else { + obj->state = btn_state; + obj->skip_trans = 1; + lv_draw_rect_dsc_init(&draw_rect_dsc_act); + lv_draw_label_dsc_init(&draw_label_dsc_act); + lv_obj_init_draw_rect_dsc(obj, LV_PART_ITEMS, &draw_rect_dsc_act); + lv_obj_init_draw_label_dsc(obj, LV_PART_ITEMS, &draw_label_dsc_act); + obj->state = state_ori; + obj->skip_trans = 0; + } + + bool recolor = button_is_recolor(btnm->ctrl_bits[btn_i]); + if(recolor) draw_label_dsc_act.flag |= LV_TEXT_FLAG_RECOLOR; + else draw_label_dsc_act.flag &= ~LV_TEXT_FLAG_RECOLOR; + + + part_draw_dsc.draw_area = &btn_area; + part_draw_dsc.id = btn_i; + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + + /*Remove borders on the edges if `LV_BORDER_SIDE_INTERNAL`*/ + if(draw_rect_dsc_act.border_side & LV_BORDER_SIDE_INTERNAL) { + draw_rect_dsc_act.border_side = LV_BORDER_SIDE_FULL; + if(btn_area.x1 == obj->coords.x1 + pleft) draw_rect_dsc_act.border_side &= ~LV_BORDER_SIDE_LEFT; + if(btn_area.x2 == obj->coords.x2 - pright) draw_rect_dsc_act.border_side &= ~LV_BORDER_SIDE_RIGHT; + if(btn_area.y1 == obj->coords.y1 + ptop) draw_rect_dsc_act.border_side &= ~LV_BORDER_SIDE_TOP; + if(btn_area.y2 == obj->coords.y2 - pbottom) draw_rect_dsc_act.border_side &= ~LV_BORDER_SIDE_BOTTOM; + } + + lv_coord_t btn_height = lv_area_get_height(&btn_area); + + if((btn_state & LV_STATE_PRESSED) && (btnm->ctrl_bits[btn_i] & LV_BTNMATRIX_CTRL_POPOVER)) { + /*Push up the upper boundary of the btn area to create the popover*/ + btn_area.y1 -= btn_height; + } + + /*Draw the background*/ + lv_draw_rect(draw_ctx, &draw_rect_dsc_act, &btn_area); + + /*Calculate the size of the text*/ + const lv_font_t * font = draw_label_dsc_act.font; + lv_coord_t letter_space = draw_label_dsc_act.letter_space; + lv_coord_t line_space = draw_label_dsc_act.line_space; + const char * txt = btnm->map_p[txt_i]; + +#if LV_USE_ARABIC_PERSIAN_CHARS + /*Get the size of the Arabic text and process it*/ + size_t len_ap = _lv_txt_ap_calc_bytes_cnt(txt); + if(len_ap < txt_ap_size) { + _lv_txt_ap_proc(txt, txt_ap); + txt = txt_ap; + } +#endif + lv_point_t txt_size; + lv_txt_get_size(&txt_size, txt, font, letter_space, + line_space, lv_area_get_width(&area_obj), draw_label_dsc_act.flag); + + btn_area.x1 += (lv_area_get_width(&btn_area) - txt_size.x) / 2; + btn_area.y1 += (lv_area_get_height(&btn_area) - txt_size.y) / 2; + btn_area.x2 = btn_area.x1 + txt_size.x; + btn_area.y2 = btn_area.y1 + txt_size.y; + + if((btn_state & LV_STATE_PRESSED) && (btnm->ctrl_bits[btn_i] & LV_BTNMATRIX_CTRL_POPOVER)) { + /*Push up the button text into the popover*/ + btn_area.y1 -= btn_height / 2; + btn_area.y2 -= btn_height / 2; + } + + /*Draw the text*/ + lv_draw_label(draw_ctx, &draw_label_dsc_act, &btn_area, txt, NULL); + + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + } + + obj->skip_trans = 0; +#if LV_USE_ARABIC_PERSIAN_CHARS + lv_mem_buf_release(txt_ap); +#endif +} +/** + * Create the required number of buttons and control bytes according to a map + * @param obj pointer to button matrix object + * @param map_p pointer to a string array + */ +static void allocate_btn_areas_and_controls(const lv_obj_t * obj, const char ** map) +{ + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj; + btnm->row_cnt = 1; + /*Count the buttons in the map*/ + uint16_t btn_cnt = 0; + uint16_t i = 0; + while(map[i] && map[i][0] != '\0') { + if(strcmp(map[i], "\n") != 0) { /*Do not count line breaks*/ + btn_cnt++; + } + else { + btnm->row_cnt++; + } + i++; + } + + /*Do not allocate memory for the same amount of buttons*/ + if(btn_cnt == btnm->btn_cnt) return; + + if(btnm->button_areas != NULL) { + lv_mem_free(btnm->button_areas); + btnm->button_areas = NULL; + } + if(btnm->ctrl_bits != NULL) { + lv_mem_free(btnm->ctrl_bits); + btnm->ctrl_bits = NULL; + } + + btnm->button_areas = lv_mem_alloc(sizeof(lv_area_t) * btn_cnt); + LV_ASSERT_MALLOC(btnm->button_areas); + btnm->ctrl_bits = lv_mem_alloc(sizeof(lv_btnmatrix_ctrl_t) * btn_cnt); + LV_ASSERT_MALLOC(btnm->ctrl_bits); + if(btnm->button_areas == NULL || btnm->ctrl_bits == NULL) btn_cnt = 0; + + lv_memset_00(btnm->ctrl_bits, sizeof(lv_btnmatrix_ctrl_t) * btn_cnt); + + btnm->btn_cnt = btn_cnt; +} + +/** + * Get the width of a button in units (default is 1). + * @param ctrl_bits least significant 3 bits used (1..7 valid values) + * @return the width of the button in units + */ +static uint8_t get_button_width(lv_btnmatrix_ctrl_t ctrl_bits) +{ + uint8_t w = ctrl_bits & LV_BTNMATRIX_WIDTH_MASK; + return w != 0 ? w : 1; +} + +static bool button_is_hidden(lv_btnmatrix_ctrl_t ctrl_bits) +{ + return (ctrl_bits & LV_BTNMATRIX_CTRL_HIDDEN) ? true : false; +} + +static bool button_is_checked(lv_btnmatrix_ctrl_t ctrl_bits) +{ + return (ctrl_bits & LV_BTNMATRIX_CTRL_CHECKED) ? true : false; +} + +static bool button_is_repeat_disabled(lv_btnmatrix_ctrl_t ctrl_bits) +{ + return (ctrl_bits & LV_BTNMATRIX_CTRL_NO_REPEAT) ? true : false; +} + +static bool button_is_inactive(lv_btnmatrix_ctrl_t ctrl_bits) +{ + return (ctrl_bits & LV_BTNMATRIX_CTRL_DISABLED) ? true : false; +} + +static bool button_is_click_trig(lv_btnmatrix_ctrl_t ctrl_bits) +{ + return (ctrl_bits & LV_BTNMATRIX_CTRL_CLICK_TRIG) ? true : false; +} + +static bool button_is_popover(lv_btnmatrix_ctrl_t ctrl_bits) +{ + return (ctrl_bits & LV_BTNMATRIX_CTRL_POPOVER) ? true : false; +} + +static bool button_is_checkable(lv_btnmatrix_ctrl_t ctrl_bits) +{ + return (ctrl_bits & LV_BTNMATRIX_CTRL_CHECKABLE) ? true : false; +} + +static bool button_get_checked(lv_btnmatrix_ctrl_t ctrl_bits) +{ + return (ctrl_bits & LV_BTNMATRIX_CTRL_CHECKED) ? true : false; +} + +static bool button_is_recolor(lv_btnmatrix_ctrl_t ctrl_bits) +{ + return (ctrl_bits & LV_BTNMATRIX_CTRL_RECOLOR) ? true : false; +} +/** + * Gives the button id of a button under a given point + * @param obj pointer to a button matrix object + * @param p a point with absolute coordinates + * @return the id of the button or LV_BTNMATRIX_BTN_NONE. + */ +static uint16_t get_button_from_point(lv_obj_t * obj, lv_point_t * p) +{ + lv_area_t obj_cords; + lv_area_t btn_area; + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj;; + uint16_t i; + lv_obj_get_coords(obj, &obj_cords); + + lv_coord_t w = lv_obj_get_width(obj); + lv_coord_t h = lv_obj_get_height(obj); + lv_coord_t pleft = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + lv_coord_t pright = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + lv_coord_t ptop = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + lv_coord_t pbottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + lv_coord_t prow = lv_obj_get_style_pad_row(obj, LV_PART_MAIN); + lv_coord_t pcol = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + + /*Get the half gap. Button look larger with this value. (+1 for rounding error)*/ + prow = (prow / 2) + 1 + (prow & 1); + pcol = (pcol / 2) + 1 + (pcol & 1); + + prow = LV_MIN(prow, BTN_EXTRA_CLICK_AREA_MAX); + pcol = LV_MIN(pcol, BTN_EXTRA_CLICK_AREA_MAX); + pright = LV_MIN(pright, BTN_EXTRA_CLICK_AREA_MAX); + ptop = LV_MIN(ptop, BTN_EXTRA_CLICK_AREA_MAX); + pbottom = LV_MIN(pbottom, BTN_EXTRA_CLICK_AREA_MAX); + + for(i = 0; i < btnm->btn_cnt; i++) { + lv_area_copy(&btn_area, &btnm->button_areas[i]); + if(btn_area.x1 <= pleft) btn_area.x1 += obj_cords.x1 - LV_MIN(pleft, BTN_EXTRA_CLICK_AREA_MAX); + else btn_area.x1 += obj_cords.x1 - pcol; + + if(btn_area.y1 <= ptop) btn_area.y1 += obj_cords.y1 - LV_MIN(ptop, BTN_EXTRA_CLICK_AREA_MAX); + else btn_area.y1 += obj_cords.y1 - prow; + + if(btn_area.x2 >= w - pright - 2) btn_area.x2 += obj_cords.x1 + LV_MIN(pright, + BTN_EXTRA_CLICK_AREA_MAX); /*-2 for rounding error*/ + else btn_area.x2 += obj_cords.x1 + pcol; + + if(btn_area.y2 >= h - pbottom - 2) btn_area.y2 += obj_cords.y1 + LV_MIN(pbottom, + BTN_EXTRA_CLICK_AREA_MAX); /*-2 for rounding error*/ + else btn_area.y2 += obj_cords.y1 + prow; + + if(_lv_area_is_point_on(&btn_area, p, 0) != false) { + break; + } + } + + if(i == btnm->btn_cnt) i = LV_BTNMATRIX_BTN_NONE; + + return i; +} + +static void invalidate_button_area(const lv_obj_t * obj, uint16_t btn_idx) +{ + if(btn_idx == LV_BTNMATRIX_BTN_NONE) return; + + lv_area_t btn_area; + lv_area_t obj_area; + + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj;; + if(btn_idx >= btnm->btn_cnt) return; + + lv_area_copy(&btn_area, &btnm->button_areas[btn_idx]); + lv_obj_get_coords(obj, &obj_area); + + /*The buttons might have outline and shadow so make the invalidation larger with the gaps between the buttons. + *It assumes that the outline or shadow is smaller than the gaps*/ + lv_coord_t row_gap = lv_obj_get_style_pad_row(obj, LV_PART_MAIN); + lv_coord_t col_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + + /*Be sure to have a minimal extra space if row/col_gap is small*/ + lv_coord_t dpi = lv_disp_get_dpi(lv_obj_get_disp(obj)); + row_gap = LV_MAX(row_gap, dpi / 10); + col_gap = LV_MAX(col_gap, dpi / 10); + + /*Convert relative coordinates to absolute*/ + btn_area.x1 += obj_area.x1 - row_gap; + btn_area.y1 += obj_area.y1 - col_gap; + btn_area.x2 += obj_area.x1 + row_gap; + btn_area.y2 += obj_area.y1 + col_gap; + + if((btn_idx == btnm->btn_id_sel) && (btnm->ctrl_bits[btn_idx] & LV_BTNMATRIX_CTRL_POPOVER)) { + /*Push up the upper boundary of the btn area to also invalidate the popover*/ + btn_area.y1 -= lv_area_get_height(&btn_area); + } + + lv_obj_invalidate_area(obj, &btn_area); +} + +/** + * Enforces a single button being toggled on the button matrix. + * It simply clears the toggle flag on other buttons. + * @param obj Button matrix object + * @param btn_idx Button that should remain toggled + */ +static void make_one_button_checked(lv_obj_t * obj, uint16_t btn_idx) +{ + /*Save whether the button was toggled*/ + bool was_toggled = lv_btnmatrix_has_btn_ctrl(obj, btn_idx, LV_BTNMATRIX_CTRL_CHECKED); + + lv_btnmatrix_clear_btn_ctrl_all(obj, LV_BTNMATRIX_CTRL_CHECKED); + + if(was_toggled) lv_btnmatrix_set_btn_ctrl(obj, btn_idx, LV_BTNMATRIX_CTRL_CHECKED); +} + +/** + * Check if any of the buttons in the first row has the LV_BTNMATRIX_CTRL_POPOVER control flag set. + * @param obj Button matrix object + * @return true if at least one button has the flag, false otherwise + */ +static bool has_popovers_in_top_row(lv_obj_t * obj) +{ + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj; + + if(btnm->row_cnt <= 0) { + return false; + } + + const char ** map_row = btnm->map_p; + uint16_t btn_cnt = 0; + + while(map_row[btn_cnt] && strcmp(map_row[btn_cnt], "\n") != 0 && map_row[btn_cnt][0] != '\0') { + if(button_is_popover(btnm->ctrl_bits[btn_cnt])) { + return true; + } + btn_cnt++; + } + + return false; +} + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_btnmatrix.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_btnmatrix.h new file mode 100644 index 0000000..780d57b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_btnmatrix.h @@ -0,0 +1,225 @@ +/** + * @file lv_btnmatrix.h + * + */ + +#ifndef LV_BTNMATRIX_H +#define LV_BTNMATRIX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#if LV_USE_BTNMATRIX != 0 + +#include "../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ +#define LV_BTNMATRIX_BTN_NONE 0xFFFF +LV_EXPORT_CONST_INT(LV_BTNMATRIX_BTN_NONE); + +/********************** + * TYPEDEFS + **********************/ + +/** Type to store button control bits (disabled, hidden etc.) + * The first 3 bits are used to store the width*/ +enum { + _LV_BTNMATRIX_WIDTH = 0x0007, /**< Reserved to stire the size units*/ + LV_BTNMATRIX_CTRL_HIDDEN = 0x0008, /**< Button hidden*/ + LV_BTNMATRIX_CTRL_NO_REPEAT = 0x0010, /**< Do not repeat press this button.*/ + LV_BTNMATRIX_CTRL_DISABLED = 0x0020, /**< Disable this button.*/ + LV_BTNMATRIX_CTRL_CHECKABLE = 0x0040, /**< The button can be toggled.*/ + LV_BTNMATRIX_CTRL_CHECKED = 0x0080, /**< Button is currently toggled (e.g. checked).*/ + LV_BTNMATRIX_CTRL_CLICK_TRIG = 0x0100, /**< 1: Send LV_EVENT_VALUE_CHANGE on CLICK, 0: Send LV_EVENT_VALUE_CHANGE on PRESS*/ + LV_BTNMATRIX_CTRL_POPOVER = 0x0200, /**< Show a popover when pressing this key*/ + LV_BTNMATRIX_CTRL_RECOLOR = 0x1000, /**< Enable text recoloring with `#color`*/ + _LV_BTNMATRIX_CTRL_RESERVED = 0x2000, /**< Reserved for later use*/ + LV_BTNMATRIX_CTRL_CUSTOM_1 = 0x4000, /**< Custom free to use flag*/ + LV_BTNMATRIX_CTRL_CUSTOM_2 = 0x8000, /**< Custom free to use flag*/ +}; + +typedef uint16_t lv_btnmatrix_ctrl_t; + +typedef bool (*lv_btnmatrix_btn_draw_cb_t)(lv_obj_t * btnm, uint32_t btn_id, const lv_area_t * draw_area, + const lv_area_t * clip_area); + +/*Data of button matrix*/ +typedef struct { + lv_obj_t obj; + const char ** map_p; /*Pointer to the current map*/ + lv_area_t * button_areas; /*Array of areas of buttons*/ + lv_btnmatrix_ctrl_t * ctrl_bits; /*Array of control bytes*/ + uint16_t btn_cnt; /*Number of button in 'map_p'(Handled by the library)*/ + uint16_t row_cnt; /*Number of rows in 'map_p'(Handled by the library)*/ + uint16_t btn_id_sel; /*Index of the active button (being pressed/released etc) or LV_BTNMATRIX_BTN_NONE*/ + uint8_t one_check : 1; /*Single button toggled at once*/ +} lv_btnmatrix_t; + +extern const lv_obj_class_t lv_btnmatrix_class; + +/** + * `type` field in `lv_obj_draw_part_dsc_t` if `class_p = lv_btnmatrix_class` + * Used in `LV_EVENT_DRAW_PART_BEGIN` and `LV_EVENT_DRAW_PART_END` + */ +typedef enum { + LV_BTNMATRIX_DRAW_PART_BTN, /**< The rectangle and label of buttons*/ +} lv_btnmatrix_draw_part_type_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a button matrix object + * @param parent pointer to an object, it will be the parent of the new button matrix + * @return pointer to the created button matrix + */ +lv_obj_t * lv_btnmatrix_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set a new map. Buttons will be created/deleted according to the map. The + * button matrix keeps a reference to the map and so the string array must not + * be deallocated during the life of the matrix. + * @param obj pointer to a button matrix object + * @param map pointer a string array. The last string has to be: "". Use "\n" to make a line break. + */ +void lv_btnmatrix_set_map(lv_obj_t * obj, const char * map[]); + +/** + * Set the button control map (hidden, disabled etc.) for a button matrix. + * The control map array will be copied and so may be deallocated after this + * function returns. + * @param obj pointer to a button matrix object + * @param ctrl_map pointer to an array of `lv_btn_ctrl_t` control bytes. The + * length of the array and position of the elements must match + * the number and order of the individual buttons (i.e. excludes + * newline entries). + * An element of the map should look like e.g.: + * `ctrl_map[0] = width | LV_BTNMATRIX_CTRL_NO_REPEAT | LV_BTNMATRIX_CTRL_TGL_ENABLE` + */ +void lv_btnmatrix_set_ctrl_map(lv_obj_t * obj, const lv_btnmatrix_ctrl_t ctrl_map[]); + +/** + * Set the selected buttons + * @param obj pointer to button matrix object + * @param btn_id 0 based index of the button to modify. (Not counting new lines) + */ +void lv_btnmatrix_set_selected_btn(lv_obj_t * obj, uint16_t btn_id); + +/** + * Set the attributes of a button of the button matrix + * @param obj pointer to button matrix object + * @param btn_id 0 based index of the button to modify. (Not counting new lines) + * @param ctrl OR-ed attributs. E.g. `LV_BTNMATRIX_CTRL_NO_REPEAT | LV_BTNMATRIX_CTRL_CHECKABLE` + */ +void lv_btnmatrix_set_btn_ctrl(lv_obj_t * obj, uint16_t btn_id, lv_btnmatrix_ctrl_t ctrl); + +/** + * Clear the attributes of a button of the button matrix + * @param obj pointer to button matrix object + * @param btn_id 0 based index of the button to modify. (Not counting new lines) + * @param ctrl OR-ed attributs. E.g. `LV_BTNMATRIX_CTRL_NO_REPEAT | LV_BTNMATRIX_CTRL_CHECKABLE` + */ +void lv_btnmatrix_clear_btn_ctrl(lv_obj_t * obj, uint16_t btn_id, lv_btnmatrix_ctrl_t ctrl); + +/** + * Set attributes of all buttons of a button matrix + * @param obj pointer to a button matrix object + * @param ctrl attribute(s) to set from `lv_btnmatrix_ctrl_t`. Values can be ORed. + */ +void lv_btnmatrix_set_btn_ctrl_all(lv_obj_t * obj, lv_btnmatrix_ctrl_t ctrl); + +/** + * Clear the attributes of all buttons of a button matrix + * @param obj pointer to a button matrix object + * @param ctrl attribute(s) to set from `lv_btnmatrix_ctrl_t`. Values can be ORed. + * @param en true: set the attributes; false: clear the attributes + */ +void lv_btnmatrix_clear_btn_ctrl_all(lv_obj_t * obj, lv_btnmatrix_ctrl_t ctrl); + +/** + * Set a single button's relative width. + * This method will cause the matrix be regenerated and is a relatively + * expensive operation. It is recommended that initial width be specified using + * `lv_btnmatrix_set_ctrl_map` and this method only be used for dynamic changes. + * @param obj pointer to button matrix object + * @param btn_id 0 based index of the button to modify. + * @param width relative width compared to the buttons in the same row. [1..7] + */ +void lv_btnmatrix_set_btn_width(lv_obj_t * obj, uint16_t btn_id, uint8_t width); + +/** + * Make the button matrix like a selector widget (only one button may be checked at a time). + * `LV_BTNMATRIX_CTRL_CHECKABLE` must be enabled on the buttons to be selected using + * `lv_btnmatrix_set_ctrl()` or `lv_btnmatrix_set_btn_ctrl_all()`. + * @param obj pointer to a button matrix object + * @param en whether "one check" mode is enabled + */ +void lv_btnmatrix_set_one_checked(lv_obj_t * obj, bool en); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the current map of a button matrix + * @param obj pointer to a button matrix object + * @return the current map + */ +const char ** lv_btnmatrix_get_map(const lv_obj_t * obj); + +/** + * Get the index of the lastly "activated" button by the user (pressed, released, focused etc) + * Useful in the `event_cb` to get the text of the button, check if hidden etc. + * @param obj pointer to button matrix object + * @return index of the last released button (LV_BTNMATRIX_BTN_NONE: if unset) + */ +uint16_t lv_btnmatrix_get_selected_btn(const lv_obj_t * obj); + +/** + * Get the button's text + * @param obj pointer to button matrix object + * @param btn_id the index a button not counting new line characters. + * @return text of btn_index` button + */ +const char * lv_btnmatrix_get_btn_text(const lv_obj_t * obj, uint16_t btn_id); + +/** + * Get the whether a control value is enabled or disabled for button of a button matrix + * @param obj pointer to a button matrix object + * @param btn_id the index of a button not counting new line characters. + * @param ctrl control values to check (ORed value can be used) + * @return true: the control attribute is enabled false: disabled + */ +bool lv_btnmatrix_has_btn_ctrl(lv_obj_t * obj, uint16_t btn_id, lv_btnmatrix_ctrl_t ctrl); + +/** + * Tell whether "one check" mode is enabled or not. + * @param obj Button matrix object + * @return true: "one check" mode is enabled; false: disabled + */ +bool lv_btnmatrix_get_one_checked(const lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_BTNMATRIX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BTNMATRIX_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_canvas.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_canvas.c new file mode 100644 index 0000000..1f94927 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_canvas.c @@ -0,0 +1,836 @@ +/** + * @file lv_canvas.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_canvas.h" +#include "../misc/lv_assert.h" +#include "../misc/lv_math.h" +#include "../draw/lv_draw.h" +#include "../core/lv_refr.h" + +#if LV_USE_CANVAS != 0 + +#include "../draw/sw/lv_draw_sw.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_canvas_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_canvas_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_canvas_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void init_fake_disp(lv_obj_t * canvas, lv_disp_t * disp, lv_disp_drv_t * drv, lv_area_t * clip_area); +static void deinit_fake_disp(lv_obj_t * canvas, lv_disp_t * disp); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_canvas_class = { + .constructor_cb = lv_canvas_constructor, + .destructor_cb = lv_canvas_destructor, + .instance_size = sizeof(lv_canvas_t), + .base_class = &lv_img_class +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_canvas_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_canvas_set_buffer(lv_obj_t * obj, void * buf, lv_coord_t w, lv_coord_t h, lv_img_cf_t cf) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(buf); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + + canvas->dsc.header.cf = cf; + canvas->dsc.header.w = w; + canvas->dsc.header.h = h; + canvas->dsc.data = buf; + + lv_img_set_src(obj, &canvas->dsc); + lv_img_cache_invalidate_src(&canvas->dsc); +} + +void lv_canvas_set_px_color(lv_obj_t * obj, lv_coord_t x, lv_coord_t y, lv_color_t c) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + + lv_img_buf_set_px_color(&canvas->dsc, x, y, c); + lv_obj_invalidate(obj); +} + +void lv_canvas_set_px_opa(lv_obj_t * obj, lv_coord_t x, lv_coord_t y, lv_opa_t opa) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + + lv_img_buf_set_px_alpha(&canvas->dsc, x, y, opa); + lv_obj_invalidate(obj); +} + +void lv_canvas_set_palette(lv_obj_t * obj, uint8_t id, lv_color_t c) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + + lv_img_buf_set_palette(&canvas->dsc, id, c); + lv_obj_invalidate(obj); +} + +/*===================== + * Getter functions + *====================*/ + +lv_color_t lv_canvas_get_px(lv_obj_t * obj, lv_coord_t x, lv_coord_t y) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + lv_color_t color = lv_obj_get_style_img_recolor(obj, LV_PART_MAIN); + + return lv_img_buf_get_px_color(&canvas->dsc, x, y, color); +} + +lv_img_dsc_t * lv_canvas_get_img(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + return &canvas->dsc; +} + +/*===================== + * Other functions + *====================*/ + +void lv_canvas_copy_buf(lv_obj_t * obj, const void * to_copy, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(to_copy); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + + if(x + w - 1 >= (lv_coord_t)canvas->dsc.header.w || y + h - 1 >= (lv_coord_t)canvas->dsc.header.h) { + LV_LOG_WARN("lv_canvas_copy_buf: x or y out of the canvas"); + return; + } + + uint32_t px_size = lv_img_cf_get_px_size(canvas->dsc.header.cf) >> 3; + uint32_t px = canvas->dsc.header.w * y * px_size + x * px_size; + uint8_t * to_copy8 = (uint8_t *)to_copy; + lv_coord_t i; + for(i = 0; i < h; i++) { + lv_memcpy((void *)&canvas->dsc.data[px], to_copy8, w * px_size); + px += canvas->dsc.header.w * px_size; + to_copy8 += w * px_size; + } +} + +void lv_canvas_transform(lv_obj_t * obj, lv_img_dsc_t * src_img, int16_t angle, uint16_t zoom, lv_coord_t offset_x, + lv_coord_t offset_y, + int32_t pivot_x, int32_t pivot_y, bool antialias) +{ +#if LV_DRAW_COMPLEX + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(src_img); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + lv_img_dsc_t * dest_img = &canvas->dsc; + + int32_t x; + int32_t y; + + lv_draw_img_dsc_t draw_dsc; + lv_draw_img_dsc_init(&draw_dsc); + draw_dsc.angle = angle; + draw_dsc.zoom = zoom; + draw_dsc.pivot.x = pivot_x; + draw_dsc.pivot.y = pivot_y; + draw_dsc.antialias = antialias; + + lv_area_t dest_area; + dest_area.x1 = -offset_x; + dest_area.x2 = dest_area.x1 + dest_img->header.w - 1; + dest_area.y1 = -offset_y; + dest_area.y2 = -offset_y; + + lv_color_t * cbuf = lv_mem_alloc(dest_img->header.w * sizeof(lv_color_t)); + lv_opa_t * abuf = lv_mem_alloc(dest_img->header.w * sizeof(lv_opa_t)); + for(y = 0; y < dest_img->header.h; y++) { + if(y + offset_y >= 0) { + lv_draw_sw_transform(NULL, &dest_area, src_img->data, src_img->header.w, src_img->header.h, src_img->header.w, + &draw_dsc, canvas->dsc.header.cf, cbuf, abuf); + + for(x = 0; x < dest_img->header.w; x++) { + if(abuf[x]) { + lv_img_buf_set_px_color(dest_img, x, y, cbuf[x]); + lv_img_buf_set_px_alpha(dest_img, x, y, abuf[x]); + } + } + + dest_area.y1++; + dest_area.y2++; + } + } + lv_mem_free(cbuf); + lv_mem_free(abuf); + + lv_obj_invalidate(obj); + +#else + LV_UNUSED(obj); + LV_UNUSED(src_img); + LV_UNUSED(angle); + LV_UNUSED(zoom); + LV_UNUSED(offset_x); + LV_UNUSED(offset_y); + LV_UNUSED(pivot_x); + LV_UNUSED(pivot_y); + LV_UNUSED(antialias); + LV_LOG_WARN("Can't transform canvas with LV_DRAW_COMPLEX == 0"); +#endif +} + +void lv_canvas_blur_hor(lv_obj_t * obj, const lv_area_t * area, uint16_t r) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(r == 0) return; + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + + lv_area_t a; + if(area) { + lv_area_copy(&a, area); + if(a.x1 < 0) a.x1 = 0; + if(a.y1 < 0) a.y1 = 0; + if(a.x2 > canvas->dsc.header.w - 1) a.x2 = canvas->dsc.header.w - 1; + if(a.y2 > canvas->dsc.header.h - 1) a.y2 = canvas->dsc.header.h - 1; + } + else { + a.x1 = 0; + a.y1 = 0; + a.x2 = canvas->dsc.header.w - 1; + a.y2 = canvas->dsc.header.h - 1; + } + + lv_color_t color = lv_obj_get_style_img_recolor(obj, LV_PART_MAIN); + + uint16_t r_back = r / 2; + uint16_t r_front = r / 2; + + if((r & 0x1) == 0) r_back--; + + bool has_alpha = lv_img_cf_has_alpha(canvas->dsc.header.cf); + + lv_coord_t line_w = lv_img_buf_get_img_size(canvas->dsc.header.w, 1, canvas->dsc.header.cf); + uint8_t * line_buf = lv_mem_buf_get(line_w); + + lv_img_dsc_t line_img; + line_img.data = line_buf; + line_img.header.always_zero = 0; + line_img.header.w = canvas->dsc.header.w; + line_img.header.h = 1; + line_img.header.cf = canvas->dsc.header.cf; + + lv_coord_t x; + lv_coord_t y; + lv_coord_t x_safe; + + for(y = a.y1; y <= a.y2; y++) { + uint32_t asum = 0; + uint32_t rsum = 0; + uint32_t gsum = 0; + uint32_t bsum = 0; + + lv_color_t c; + lv_opa_t opa = LV_OPA_TRANSP; + lv_memcpy(line_buf, &canvas->dsc.data[y * line_w], line_w); + + for(x = a.x1 - r_back; x <= a.x1 + r_front; x++) { + x_safe = x < 0 ? 0 : x; + x_safe = x_safe > canvas->dsc.header.w - 1 ? canvas->dsc.header.w - 1 : x_safe; + + c = lv_img_buf_get_px_color(&line_img, x_safe, 0, color); + if(has_alpha) opa = lv_img_buf_get_px_alpha(&line_img, x_safe, 0); + + rsum += c.ch.red; +#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP + gsum += (c.ch.green_h << 3) + c.ch.green_l; +#else + gsum += c.ch.green; +#endif + bsum += c.ch.blue; + if(has_alpha) asum += opa; + } + + /*Just to indicate that the px is visible*/ + if(has_alpha == false) asum = LV_OPA_COVER; + + for(x = a.x1; x <= a.x2; x++) { + + if(asum) { + c.ch.red = rsum / r; +#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP + uint8_t gtmp = gsum / r; + c.ch.green_h = gtmp >> 3; + c.ch.green_l = gtmp & 0x7; +#else + c.ch.green = gsum / r; +#endif + c.ch.blue = bsum / r; + if(has_alpha) opa = asum / r; + + lv_img_buf_set_px_color(&canvas->dsc, x, y, c); + } + if(has_alpha) lv_img_buf_set_px_alpha(&canvas->dsc, x, y, opa); + + x_safe = x - r_back; + x_safe = x_safe < 0 ? 0 : x_safe; + c = lv_img_buf_get_px_color(&line_img, x_safe, 0, color); + if(has_alpha) opa = lv_img_buf_get_px_alpha(&line_img, x_safe, 0); + + rsum -= c.ch.red; +#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP + gsum -= (c.ch.green_h << 3) + c.ch.green_l; +#else + gsum -= c.ch.green; +#endif + bsum -= c.ch.blue; + if(has_alpha) asum -= opa; + + x_safe = x + 1 + r_front; + x_safe = x_safe > canvas->dsc.header.w - 1 ? canvas->dsc.header.w - 1 : x_safe; + c = lv_img_buf_get_px_color(&line_img, x_safe, 0, lv_color_white()); + if(has_alpha) opa = lv_img_buf_get_px_alpha(&line_img, x_safe, 0); + + rsum += c.ch.red; +#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP + gsum += (c.ch.green_h << 3) + c.ch.green_l; +#else + gsum += c.ch.green; +#endif + bsum += c.ch.blue; + if(has_alpha) asum += opa; + } + } + lv_obj_invalidate(obj); + + lv_mem_buf_release(line_buf); +} + +void lv_canvas_blur_ver(lv_obj_t * obj, const lv_area_t * area, uint16_t r) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(r == 0) return; + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + + lv_area_t a; + if(area) { + lv_area_copy(&a, area); + if(a.x1 < 0) a.x1 = 0; + if(a.y1 < 0) a.y1 = 0; + if(a.x2 > canvas->dsc.header.w - 1) a.x2 = canvas->dsc.header.w - 1; + if(a.y2 > canvas->dsc.header.h - 1) a.y2 = canvas->dsc.header.h - 1; + } + else { + a.x1 = 0; + a.y1 = 0; + a.x2 = canvas->dsc.header.w - 1; + a.y2 = canvas->dsc.header.h - 1; + } + + lv_color_t color = lv_obj_get_style_img_recolor(obj, LV_PART_MAIN); + + uint16_t r_back = r / 2; + uint16_t r_front = r / 2; + + if((r & 0x1) == 0) r_back--; + + bool has_alpha = lv_img_cf_has_alpha(canvas->dsc.header.cf); + lv_coord_t col_w = lv_img_buf_get_img_size(1, canvas->dsc.header.h, canvas->dsc.header.cf); + uint8_t * col_buf = lv_mem_buf_get(col_w); + lv_img_dsc_t line_img; + + line_img.data = col_buf; + line_img.header.always_zero = 0; + line_img.header.w = 1; + line_img.header.h = canvas->dsc.header.h; + line_img.header.cf = canvas->dsc.header.cf; + + lv_coord_t x; + lv_coord_t y; + lv_coord_t y_safe; + + for(x = a.x1; x <= a.x2; x++) { + uint32_t asum = 0; + uint32_t rsum = 0; + uint32_t gsum = 0; + uint32_t bsum = 0; + + lv_color_t c; + lv_opa_t opa = LV_OPA_COVER; + + for(y = a.y1 - r_back; y <= a.y1 + r_front; y++) { + y_safe = y < 0 ? 0 : y; + y_safe = y_safe > canvas->dsc.header.h - 1 ? canvas->dsc.header.h - 1 : y_safe; + + c = lv_img_buf_get_px_color(&canvas->dsc, x, y_safe, color); + if(has_alpha) opa = lv_img_buf_get_px_alpha(&canvas->dsc, x, y_safe); + + lv_img_buf_set_px_color(&line_img, 0, y_safe, c); + if(has_alpha) lv_img_buf_set_px_alpha(&line_img, 0, y_safe, opa); + + rsum += c.ch.red; +#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP + gsum += (c.ch.green_h << 3) + c.ch.green_l; +#else + gsum += c.ch.green; +#endif + bsum += c.ch.blue; + if(has_alpha) asum += opa; + } + + /*Just to indicate that the px is visible*/ + if(has_alpha == false) asum = LV_OPA_COVER; + + for(y = a.y1; y <= a.y2; y++) { + if(asum) { + c.ch.red = rsum / r; +#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP + uint8_t gtmp = gsum / r; + c.ch.green_h = gtmp >> 3; + c.ch.green_l = gtmp & 0x7; +#else + c.ch.green = gsum / r; +#endif + c.ch.blue = bsum / r; + if(has_alpha) opa = asum / r; + + lv_img_buf_set_px_color(&canvas->dsc, x, y, c); + } + if(has_alpha) lv_img_buf_set_px_alpha(&canvas->dsc, x, y, opa); + + y_safe = y - r_back; + y_safe = y_safe < 0 ? 0 : y_safe; + c = lv_img_buf_get_px_color(&line_img, 0, y_safe, color); + if(has_alpha) opa = lv_img_buf_get_px_alpha(&line_img, 0, y_safe); + + rsum -= c.ch.red; +#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP + gsum -= (c.ch.green_h << 3) + c.ch.green_l; +#else + gsum -= c.ch.green; +#endif + bsum -= c.ch.blue; + if(has_alpha) asum -= opa; + + y_safe = y + 1 + r_front; + y_safe = y_safe > canvas->dsc.header.h - 1 ? canvas->dsc.header.h - 1 : y_safe; + + c = lv_img_buf_get_px_color(&canvas->dsc, x, y_safe, color); + if(has_alpha) opa = lv_img_buf_get_px_alpha(&canvas->dsc, x, y_safe); + + lv_img_buf_set_px_color(&line_img, 0, y_safe, c); + if(has_alpha) lv_img_buf_set_px_alpha(&line_img, 0, y_safe, opa); + + rsum += c.ch.red; +#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP + gsum += (c.ch.green_h << 3) + c.ch.green_l; +#else + gsum += c.ch.green; +#endif + bsum += c.ch.blue; + if(has_alpha) asum += opa; + } + } + + lv_obj_invalidate(obj); + + lv_mem_buf_release(col_buf); +} + +void lv_canvas_fill_bg(lv_obj_t * canvas, lv_color_t color, lv_opa_t opa) +{ + LV_ASSERT_OBJ(canvas, MY_CLASS); + + lv_img_dsc_t * dsc = lv_canvas_get_img(canvas); + + if(dsc->header.cf == LV_IMG_CF_INDEXED_1BIT) { + uint32_t row_byte_cnt = (dsc->header.w + 7) >> 3; + /*+8 skip the palette*/ + lv_memset((uint8_t *)dsc->data + 8, color.full ? 0xff : 0x00, row_byte_cnt * dsc->header.h); + } + else if(dsc->header.cf == LV_IMG_CF_ALPHA_1BIT) { + uint32_t row_byte_cnt = (dsc->header.w + 7) >> 3; + lv_memset((uint8_t *)dsc->data, opa > LV_OPA_50 ? 0xff : 0x00, row_byte_cnt * dsc->header.h); + } + else { + uint32_t x; + uint32_t y; + for(y = 0; y < dsc->header.h; y++) { + for(x = 0; x < dsc->header.w; x++) { + lv_img_buf_set_px_color(dsc, x, y, color); + lv_img_buf_set_px_alpha(dsc, x, y, opa); + } + } + } + + lv_obj_invalidate(canvas); +} + +void lv_canvas_draw_rect(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, + const lv_draw_rect_dsc_t * draw_dsc) +{ + LV_ASSERT_OBJ(canvas, MY_CLASS); + + lv_img_dsc_t * dsc = lv_canvas_get_img(canvas); + + if(dsc->header.cf >= LV_IMG_CF_INDEXED_1BIT && dsc->header.cf <= LV_IMG_CF_INDEXED_8BIT) { + LV_LOG_WARN("lv_canvas_draw_rect: can't draw to LV_IMG_CF_INDEXED canvas"); + return; + } + + /*Create a dummy display to fool the lv_draw function. + *It will think it draws to real screen.*/ + lv_disp_t fake_disp; + lv_disp_drv_t driver; + lv_area_t clip_area; + init_fake_disp(canvas, &fake_disp, &driver, &clip_area); + + lv_disp_t * refr_ori = _lv_refr_get_disp_refreshing(); + _lv_refr_set_disp_refreshing(&fake_disp); + + /*Disable anti-aliasing if drawing with transparent color to chroma keyed canvas*/ + lv_color_t ctransp = LV_COLOR_CHROMA_KEY; + if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED && + draw_dsc->bg_color.full == ctransp.full) { + fake_disp.driver->antialiasing = 0; + } + + lv_area_t coords; + coords.x1 = x; + coords.y1 = y; + coords.x2 = x + w - 1; + coords.y2 = y + h - 1; + + lv_draw_rect(driver.draw_ctx, draw_dsc, &coords); + + _lv_refr_set_disp_refreshing(refr_ori); + + deinit_fake_disp(canvas, &fake_disp); + + lv_obj_invalidate(canvas); +} + +void lv_canvas_draw_text(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_coord_t max_w, + lv_draw_label_dsc_t * draw_dsc, const char * txt) +{ + LV_ASSERT_OBJ(canvas, MY_CLASS); + + lv_img_dsc_t * dsc = lv_canvas_get_img(canvas); + + if(dsc->header.cf >= LV_IMG_CF_INDEXED_1BIT && dsc->header.cf <= LV_IMG_CF_INDEXED_8BIT) { + LV_LOG_WARN("lv_canvas_draw_text: can't draw to LV_IMG_CF_INDEXED canvas"); + return; + } + + /*Create a dummy display to fool the lv_draw function. + *It will think it draws to real screen.*/ + lv_disp_t fake_disp; + lv_disp_drv_t driver; + lv_area_t clip_area; + init_fake_disp(canvas, &fake_disp, &driver, &clip_area); + + lv_disp_t * refr_ori = _lv_refr_get_disp_refreshing(); + _lv_refr_set_disp_refreshing(&fake_disp); + + lv_area_t coords; + coords.x1 = x; + coords.y1 = y; + coords.x2 = x + max_w - 1; + coords.y2 = dsc->header.h - 1; + lv_draw_label(driver.draw_ctx, draw_dsc, &coords, txt, NULL); + + _lv_refr_set_disp_refreshing(refr_ori); + + deinit_fake_disp(canvas, &fake_disp); + + lv_obj_invalidate(canvas); +} + +void lv_canvas_draw_img(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, const void * src, + const lv_draw_img_dsc_t * draw_dsc) +{ + LV_ASSERT_OBJ(canvas, MY_CLASS); + + lv_img_dsc_t * dsc = lv_canvas_get_img(canvas); + + if(dsc->header.cf >= LV_IMG_CF_INDEXED_1BIT && dsc->header.cf <= LV_IMG_CF_INDEXED_8BIT) { + LV_LOG_WARN("lv_canvas_draw_img: can't draw to LV_IMG_CF_INDEXED canvas"); + return; + } + + lv_img_header_t header; + lv_res_t res = lv_img_decoder_get_info(src, &header); + if(res != LV_RES_OK) { + LV_LOG_WARN("lv_canvas_draw_img: Couldn't get the image data."); + return; + } + /*Create a dummy display to fool the lv_draw function. + *It will think it draws to real screen.*/ + lv_disp_t fake_disp; + lv_disp_drv_t driver; + lv_area_t clip_area; + init_fake_disp(canvas, &fake_disp, &driver, &clip_area); + + lv_disp_t * refr_ori = _lv_refr_get_disp_refreshing(); + _lv_refr_set_disp_refreshing(&fake_disp); + + lv_area_t coords; + coords.x1 = x; + coords.y1 = y; + coords.x2 = x + header.w - 1; + coords.y2 = y + header.h - 1; + + lv_draw_img(driver.draw_ctx, draw_dsc, &coords, src); + + _lv_refr_set_disp_refreshing(refr_ori); + + deinit_fake_disp(canvas, &fake_disp); + + lv_obj_invalidate(canvas); +} + +void lv_canvas_draw_line(lv_obj_t * canvas, const lv_point_t points[], uint32_t point_cnt, + const lv_draw_line_dsc_t * draw_dsc) +{ + LV_ASSERT_OBJ(canvas, MY_CLASS); + + lv_img_dsc_t * dsc = lv_canvas_get_img(canvas); + + if(dsc->header.cf >= LV_IMG_CF_INDEXED_1BIT && dsc->header.cf <= LV_IMG_CF_INDEXED_8BIT) { + LV_LOG_WARN("lv_canvas_draw_line: can't draw to LV_IMG_CF_INDEXED canvas"); + return; + } + + /*Create a dummy display to fool the lv_draw function. + *It will think it draws to real screen.*/ + lv_disp_t fake_disp; + lv_disp_drv_t driver; + lv_area_t clip_area; + init_fake_disp(canvas, &fake_disp, &driver, &clip_area); + + lv_disp_t * refr_ori = _lv_refr_get_disp_refreshing(); + _lv_refr_set_disp_refreshing(&fake_disp); + + + /*Disable anti-aliasing if drawing with transparent color to chroma keyed canvas*/ + lv_color_t ctransp = LV_COLOR_CHROMA_KEY; + if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED && + draw_dsc->color.full == ctransp.full) { + fake_disp.driver->antialiasing = 0; + } + + uint32_t i; + for(i = 0; i < point_cnt - 1; i++) { + lv_draw_line(driver.draw_ctx, draw_dsc, &points[i], &points[i + 1]); + } + + _lv_refr_set_disp_refreshing(refr_ori); + + deinit_fake_disp(canvas, &fake_disp); + + lv_obj_invalidate(canvas); +} + +void lv_canvas_draw_polygon(lv_obj_t * canvas, const lv_point_t points[], uint32_t point_cnt, + const lv_draw_rect_dsc_t * draw_dsc) +{ + LV_ASSERT_OBJ(canvas, MY_CLASS); + + lv_img_dsc_t * dsc = lv_canvas_get_img(canvas); + + if(dsc->header.cf >= LV_IMG_CF_INDEXED_1BIT && dsc->header.cf <= LV_IMG_CF_INDEXED_8BIT) { + LV_LOG_WARN("lv_canvas_draw_polygon: can't draw to LV_IMG_CF_INDEXED canvas"); + return; + } + + /*Create a dummy display to fool the lv_draw function. + *It will think it draws to real screen.*/ + lv_disp_t fake_disp; + lv_disp_drv_t driver; + lv_area_t clip_area; + init_fake_disp(canvas, &fake_disp, &driver, &clip_area); + + lv_disp_t * refr_ori = _lv_refr_get_disp_refreshing(); + _lv_refr_set_disp_refreshing(&fake_disp); + + /*Disable anti-aliasing if drawing with transparent color to chroma keyed canvas*/ + lv_color_t ctransp = LV_COLOR_CHROMA_KEY; + if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED && + draw_dsc->bg_color.full == ctransp.full) { + fake_disp.driver->antialiasing = 0; + } + + lv_draw_polygon(driver.draw_ctx, draw_dsc, points, point_cnt); + + _lv_refr_set_disp_refreshing(refr_ori); + + deinit_fake_disp(canvas, &fake_disp); + + lv_obj_invalidate(canvas); +} + +void lv_canvas_draw_arc(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_coord_t r, int32_t start_angle, + int32_t end_angle, const lv_draw_arc_dsc_t * draw_dsc) +{ +#if LV_DRAW_COMPLEX + LV_ASSERT_OBJ(canvas, MY_CLASS); + + lv_img_dsc_t * dsc = lv_canvas_get_img(canvas); + + if(dsc->header.cf >= LV_IMG_CF_INDEXED_1BIT && dsc->header.cf <= LV_IMG_CF_INDEXED_8BIT) { + LV_LOG_WARN("lv_canvas_draw_arc: can't draw to LV_IMG_CF_INDEXED canvas"); + return; + } + + /*Create a dummy display to fool the lv_draw function. + *It will think it draws to real screen.*/ + lv_disp_t fake_disp; + lv_disp_drv_t driver; + lv_area_t clip_area; + init_fake_disp(canvas, &fake_disp, &driver, &clip_area); + + lv_disp_t * refr_ori = _lv_refr_get_disp_refreshing(); + _lv_refr_set_disp_refreshing(&fake_disp); + + lv_point_t p = {x, y}; + lv_draw_arc(driver.draw_ctx, draw_dsc, &p, r, start_angle, end_angle); + + _lv_refr_set_disp_refreshing(refr_ori); + + deinit_fake_disp(canvas, &fake_disp); + + lv_obj_invalidate(canvas); +#else + LV_UNUSED(canvas); + LV_UNUSED(x); + LV_UNUSED(y); + LV_UNUSED(r); + LV_UNUSED(start_angle); + LV_UNUSED(end_angle); + LV_UNUSED(draw_dsc); + LV_LOG_WARN("Can't draw arc with LV_DRAW_COMPLEX == 0"); +#endif +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_canvas_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + + canvas->dsc.header.always_zero = 0; + canvas->dsc.header.cf = LV_IMG_CF_TRUE_COLOR; + canvas->dsc.header.h = 0; + canvas->dsc.header.w = 0; + canvas->dsc.data_size = 0; + canvas->dsc.data = NULL; + + lv_img_set_src(obj, &canvas->dsc); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_canvas_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + lv_img_cache_invalidate_src(&canvas->dsc); +} + + +static void init_fake_disp(lv_obj_t * canvas, lv_disp_t * disp, lv_disp_drv_t * drv, lv_area_t * clip_area) +{ + lv_img_dsc_t * dsc = lv_canvas_get_img(canvas); + + clip_area->x1 = 0; + clip_area->x2 = dsc->header.w - 1; + clip_area->y1 = 0; + clip_area->y2 = dsc->header.h - 1; + + /*Allocate the fake driver on the stack as the entire display doesn't outlive this function*/ + lv_memset_00(disp, sizeof(lv_disp_t)); + disp->driver = drv; + + lv_disp_drv_init(disp->driver); + disp->driver->hor_res = dsc->header.w; + disp->driver->ver_res = dsc->header.h; + + lv_draw_ctx_t * draw_ctx = lv_mem_alloc(sizeof(lv_draw_sw_ctx_t)); + LV_ASSERT_MALLOC(draw_ctx); + if(draw_ctx == NULL) return; + lv_draw_sw_init_ctx(drv, draw_ctx); + disp->driver->draw_ctx = draw_ctx; + draw_ctx->clip_area = clip_area; + draw_ctx->buf_area = clip_area; + draw_ctx->buf = (void *)dsc->data; + + lv_disp_drv_use_generic_set_px_cb(disp->driver, dsc->header.cf); + if(LV_COLOR_SCREEN_TRANSP && dsc->header.cf != LV_IMG_CF_TRUE_COLOR_ALPHA) { + drv->screen_transp = 0; + } +} + +static void deinit_fake_disp(lv_obj_t * canvas, lv_disp_t * disp) +{ + LV_UNUSED(canvas); + lv_draw_sw_deinit_ctx(disp->driver, disp->driver->draw_ctx); + lv_mem_free(disp->driver->draw_ctx); +} + + + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_canvas.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_canvas.h new file mode 100644 index 0000000..71f0516 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_canvas.h @@ -0,0 +1,280 @@ +/** + * @file lv_canvas.h + * + */ + +#ifndef LV_CANVAS_H +#define LV_CANVAS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#if LV_USE_CANVAS != 0 + +#include "../core/lv_obj.h" +#include "../widgets/lv_img.h" +#include "../draw/lv_draw_img.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +extern const lv_obj_class_t lv_canvas_class; + +/*Data of canvas*/ +typedef struct { + lv_img_t img; + lv_img_dsc_t dsc; +} lv_canvas_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a canvas object + * @param parent pointer to an object, it will be the parent of the new canvas + * @return pointer to the created canvas + */ +lv_obj_t * lv_canvas_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set a buffer for the canvas. + * @param buf a buffer where the content of the canvas will be. + * The required size is (lv_img_color_format_get_px_size(cf) * w) / 8 * h) + * It can be allocated with `lv_mem_alloc()` or + * it can be statically allocated array (e.g. static lv_color_t buf[100*50]) or + * it can be an address in RAM or external SRAM + * @param canvas pointer to a canvas object + * @param w width of the canvas + * @param h height of the canvas + * @param cf color format. `LV_IMG_CF_...` + */ +void lv_canvas_set_buffer(lv_obj_t * canvas, void * buf, lv_coord_t w, lv_coord_t h, lv_img_cf_t cf); + +/** + * Set the color of a pixel on the canvas + * @param canvas + * @param x x coordinate of the point to set + * @param y x coordinate of the point to set + * @param c color of the pixel + */ +void lv_canvas_set_px_color(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_color_t c); + +/** + * DEPRECATED: added only for backward compatibility + */ +static inline void lv_canvas_set_px(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_color_t c) +{ + lv_canvas_set_px_color(canvas, x, y, c); +} + +/** + * Set the opacity of a pixel on the canvas + * @param canvas + * @param x x coordinate of the point to set + * @param y x coordinate of the point to set + * @param opa opacity of the pixel (0..255) + */ +void lv_canvas_set_px_opa(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_opa_t opa); + + +/** + * Set the palette color of a canvas with index format. Valid only for `LV_IMG_CF_INDEXED1/2/4/8` + * @param canvas pointer to canvas object + * @param id the palette color to set: + * - for `LV_IMG_CF_INDEXED1`: 0..1 + * - for `LV_IMG_CF_INDEXED2`: 0..3 + * - for `LV_IMG_CF_INDEXED4`: 0..15 + * - for `LV_IMG_CF_INDEXED8`: 0..255 + * @param c the color to set + */ +void lv_canvas_set_palette(lv_obj_t * canvas, uint8_t id, lv_color_t c); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the color of a pixel on the canvas + * @param canvas + * @param x x coordinate of the point to set + * @param y x coordinate of the point to set + * @return color of the point + */ +lv_color_t lv_canvas_get_px(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y); + +/** + * Get the image of the canvas as a pointer to an `lv_img_dsc_t` variable. + * @param canvas pointer to a canvas object + * @return pointer to the image descriptor. + */ +lv_img_dsc_t * lv_canvas_get_img(lv_obj_t * canvas); + +/*===================== + * Other functions + *====================*/ + +/** + * Copy a buffer to the canvas + * @param canvas pointer to a canvas object + * @param to_copy buffer to copy. The color format has to match with the canvas's buffer color + * format + * @param x left side of the destination position + * @param y top side of the destination position + * @param w width of the buffer to copy + * @param h height of the buffer to copy + */ +void lv_canvas_copy_buf(lv_obj_t * canvas, const void * to_copy, lv_coord_t x, lv_coord_t y, lv_coord_t w, + lv_coord_t h); + +/** + * Transform and image and store the result on a canvas. + * @param canvas pointer to a canvas object to store the result of the transformation. + * @param img pointer to an image descriptor to transform. + * Can be the image descriptor of an other canvas too (`lv_canvas_get_img()`). + * @param angle the angle of rotation (0..3600), 0.1 deg resolution + * @param zoom zoom factor (256 no zoom); + * @param offset_x offset X to tell where to put the result data on destination canvas + * @param offset_y offset X to tell where to put the result data on destination canvas + * @param pivot_x pivot X of rotation. Relative to the source canvas + * Set to `source width / 2` to rotate around the center + * @param pivot_y pivot Y of rotation. Relative to the source canvas + * Set to `source height / 2` to rotate around the center + * @param antialias apply anti-aliasing during the transformation. Looks better but slower. + */ +void lv_canvas_transform(lv_obj_t * canvas, lv_img_dsc_t * img, int16_t angle, uint16_t zoom, lv_coord_t offset_x, + lv_coord_t offset_y, + int32_t pivot_x, int32_t pivot_y, bool antialias); + +/** + * Apply horizontal blur on the canvas + * @param canvas pointer to a canvas object + * @param area the area to blur. If `NULL` the whole canvas will be blurred. + * @param r radius of the blur + */ +void lv_canvas_blur_hor(lv_obj_t * canvas, const lv_area_t * area, uint16_t r); + +/** + * Apply vertical blur on the canvas + * @param canvas pointer to a canvas object + * @param area the area to blur. If `NULL` the whole canvas will be blurred. + * @param r radius of the blur + */ +void lv_canvas_blur_ver(lv_obj_t * canvas, const lv_area_t * area, uint16_t r); + +/** + * Fill the canvas with color + * @param canvas pointer to a canvas + * @param color the background color + * @param opa the desired opacity + */ +void lv_canvas_fill_bg(lv_obj_t * canvas, lv_color_t color, lv_opa_t opa); + +/** + * Draw a rectangle on the canvas + * @param canvas pointer to a canvas object + * @param x left coordinate of the rectangle + * @param y top coordinate of the rectangle + * @param w width of the rectangle + * @param h height of the rectangle + * @param draw_dsc descriptor of the rectangle + */ +void lv_canvas_draw_rect(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, + const lv_draw_rect_dsc_t * draw_dsc); + +/** + * Draw a text on the canvas. + * @param canvas pointer to a canvas object + * @param x left coordinate of the text + * @param y top coordinate of the text + * @param max_w max width of the text. The text will be wrapped to fit into this size + * @param draw_dsc pointer to a valid label descriptor `lv_draw_label_dsc_t` + * @param txt text to display + */ +void lv_canvas_draw_text(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_coord_t max_w, + lv_draw_label_dsc_t * draw_dsc, const char * txt); + +/** + * Draw an image on the canvas + * @param canvas pointer to a canvas object + * @param x left coordinate of the image + * @param y top coordinate of the image + * @param src image source. Can be a pointer an `lv_img_dsc_t` variable or a path an image. + * @param draw_dsc pointer to a valid label descriptor `lv_draw_img_dsc_t` + */ +void lv_canvas_draw_img(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, const void * src, + const lv_draw_img_dsc_t * draw_dsc); + +/** + * Draw a line on the canvas + * @param canvas pointer to a canvas object + * @param points point of the line + * @param point_cnt number of points + * @param draw_dsc pointer to an initialized `lv_draw_line_dsc_t` variable + */ +void lv_canvas_draw_line(lv_obj_t * canvas, const lv_point_t points[], uint32_t point_cnt, + const lv_draw_line_dsc_t * draw_dsc); + +/** + * Draw a polygon on the canvas + * @param canvas pointer to a canvas object + * @param points point of the polygon + * @param point_cnt number of points + * @param draw_dsc pointer to an initialized `lv_draw_rect_dsc_t` variable + */ +void lv_canvas_draw_polygon(lv_obj_t * canvas, const lv_point_t points[], uint32_t point_cnt, + const lv_draw_rect_dsc_t * draw_dsc); + +/** + * Draw an arc on the canvas + * @param canvas pointer to a canvas object + * @param x origo x of the arc + * @param y origo y of the arc + * @param r radius of the arc + * @param start_angle start angle in degrees + * @param end_angle end angle in degrees + * @param draw_dsc pointer to an initialized `lv_draw_line_dsc_t` variable + */ +void lv_canvas_draw_arc(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_coord_t r, int32_t start_angle, + int32_t end_angle, const lv_draw_arc_dsc_t * draw_dsc); + +/********************** + * MACROS + **********************/ +#define LV_CANVAS_BUF_SIZE_TRUE_COLOR(w, h) LV_IMG_BUF_SIZE_TRUE_COLOR(w, h) +#define LV_CANVAS_BUF_SIZE_TRUE_COLOR_CHROMA_KEYED(w, h) LV_IMG_BUF_SIZE_TRUE_COLOR_CHROMA_KEYED(w, h) +#define LV_CANVAS_BUF_SIZE_TRUE_COLOR_ALPHA(w, h) LV_IMG_BUF_SIZE_TRUE_COLOR_ALPHA(w, h) + +/*+ 1: to be sure no fractional row*/ +#define LV_CANVAS_BUF_SIZE_ALPHA_1BIT(w, h) LV_IMG_BUF_SIZE_ALPHA_1BIT(w, h) +#define LV_CANVAS_BUF_SIZE_ALPHA_2BIT(w, h) LV_IMG_BUF_SIZE_ALPHA_2BIT(w, h) +#define LV_CANVAS_BUF_SIZE_ALPHA_4BIT(w, h) LV_IMG_BUF_SIZE_ALPHA_4BIT(w, h) +#define LV_CANVAS_BUF_SIZE_ALPHA_8BIT(w, h) LV_IMG_BUF_SIZE_ALPHA_8BIT(w, h) + +/*4 * X: for palette*/ +#define LV_CANVAS_BUF_SIZE_INDEXED_1BIT(w, h) LV_IMG_BUF_SIZE_INDEXED_1BIT(w, h) +#define LV_CANVAS_BUF_SIZE_INDEXED_2BIT(w, h) LV_IMG_BUF_SIZE_INDEXED_2BIT(w, h) +#define LV_CANVAS_BUF_SIZE_INDEXED_4BIT(w, h) LV_IMG_BUF_SIZE_INDEXED_4BIT(w, h) +#define LV_CANVAS_BUF_SIZE_INDEXED_8BIT(w, h) LV_IMG_BUF_SIZE_INDEXED_8BIT(w, h) + +#endif /*LV_USE_CANVAS*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CANVAS_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_checkbox.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_checkbox.c new file mode 100644 index 0000000..dd3b3d1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_checkbox.c @@ -0,0 +1,262 @@ +/** + * @file lv_cb.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_checkbox.h" +#if LV_USE_CHECKBOX != 0 + +#include "../misc/lv_assert.h" +#include "../misc/lv_txt_ap.h" +#include "../core/lv_group.h" +#include "../draw/lv_draw.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_checkbox_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_checkbox_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_checkbox_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_checkbox_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void lv_checkbox_draw(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_checkbox_class = { + .constructor_cb = lv_checkbox_constructor, + .destructor_cb = lv_checkbox_destructor, + .event_cb = lv_checkbox_event, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .instance_size = sizeof(lv_checkbox_t), + .base_class = &lv_obj_class +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_checkbox_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_checkbox_set_text(lv_obj_t * obj, const char * txt) +{ + lv_checkbox_t * cb = (lv_checkbox_t *)obj; +#if LV_USE_ARABIC_PERSIAN_CHARS + size_t len = _lv_txt_ap_calc_bytes_cnt(txt); +#else + size_t len = strlen(txt); +#endif + + if(!cb->static_txt) cb->txt = lv_mem_realloc(cb->txt, len + 1); + else cb->txt = lv_mem_alloc(len + 1); +#if LV_USE_ARABIC_PERSIAN_CHARS + _lv_txt_ap_proc(txt, cb->txt); +#else + strcpy(cb->txt, txt); +#endif + + cb->static_txt = 0; + + lv_obj_refresh_self_size(obj); + lv_obj_invalidate(obj); +} + +void lv_checkbox_set_text_static(lv_obj_t * obj, const char * txt) +{ + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + + if(!cb->static_txt) lv_mem_free(cb->txt); + + cb->txt = (char *)txt; + cb->static_txt = 1; + + lv_obj_refresh_self_size(obj); + lv_obj_invalidate(obj); +} + +/*===================== + * Getter functions + *====================*/ + +const char * lv_checkbox_get_text(const lv_obj_t * obj) +{ + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + return cb->txt; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_checkbox_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + + cb->txt = "Check box"; + cb->static_txt = 1; + lv_obj_add_flag(obj, LV_OBJ_FLAG_CLICKABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_CHECKABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_checkbox_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + if(!cb->static_txt) { + lv_mem_free(cb->txt); + cb->txt = NULL; + } + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_checkbox_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_res_t res; + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RES_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + + if(code == LV_EVENT_GET_SELF_SIZE) { + lv_point_t * p = lv_event_get_param(e); + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_coord_t font_h = lv_font_get_line_height(font); + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + + lv_point_t txt_size; + lv_txt_get_size(&txt_size, cb->txt, font, letter_space, line_space, LV_COORD_MAX, LV_TEXT_FLAG_NONE); + + lv_coord_t bg_colp = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + lv_coord_t marker_leftp = lv_obj_get_style_pad_left(obj, LV_PART_INDICATOR); + lv_coord_t marker_rightp = lv_obj_get_style_pad_right(obj, LV_PART_INDICATOR); + lv_coord_t marker_topp = lv_obj_get_style_pad_top(obj, LV_PART_INDICATOR); + lv_coord_t marker_bottomp = lv_obj_get_style_pad_bottom(obj, LV_PART_INDICATOR); + lv_point_t marker_size; + marker_size.x = font_h + marker_leftp + marker_rightp; + marker_size.y = font_h + marker_topp + marker_bottomp; + + p->x = marker_size.x + txt_size.x + bg_colp; + p->y = LV_MAX(marker_size.y, txt_size.y); + } + else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + lv_coord_t * s = lv_event_get_param(e); + lv_coord_t m = lv_obj_calculate_ext_draw_size(obj, LV_PART_INDICATOR); + *s = LV_MAX(*s, m); + } + else if(code == LV_EVENT_DRAW_MAIN) { + lv_checkbox_draw(e); + } +} + +static void lv_checkbox_draw(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_coord_t font_h = lv_font_get_line_height(font); + + lv_coord_t bg_border = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_coord_t bg_topp = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + bg_border; + lv_coord_t bg_leftp = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + bg_border; + lv_coord_t bg_colp = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + + lv_coord_t marker_leftp = lv_obj_get_style_pad_left(obj, LV_PART_INDICATOR); + lv_coord_t marker_rightp = lv_obj_get_style_pad_right(obj, LV_PART_INDICATOR); + lv_coord_t marker_topp = lv_obj_get_style_pad_top(obj, LV_PART_INDICATOR); + lv_coord_t marker_bottomp = lv_obj_get_style_pad_bottom(obj, LV_PART_INDICATOR); + + lv_coord_t transf_w = lv_obj_get_style_transform_width(obj, LV_PART_INDICATOR); + lv_coord_t transf_h = lv_obj_get_style_transform_height(obj, LV_PART_INDICATOR); + + lv_draw_rect_dsc_t indic_dsc; + lv_draw_rect_dsc_init(&indic_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &indic_dsc); + lv_area_t marker_area; + marker_area.x1 = obj->coords.x1 + bg_leftp; + marker_area.x2 = marker_area.x1 + font_h + marker_leftp + marker_rightp - 1; + marker_area.y1 = obj->coords.y1 + bg_topp; + marker_area.y2 = marker_area.y1 + font_h + marker_topp + marker_bottomp - 1; + + lv_area_t marker_area_transf; + lv_area_copy(&marker_area_transf, &marker_area); + marker_area_transf.x1 -= transf_w; + marker_area_transf.x2 += transf_w; + marker_area_transf.y1 -= transf_h; + marker_area_transf.y2 += transf_h; + + lv_obj_draw_part_dsc_t part_draw_dsc; + lv_obj_draw_dsc_init(&part_draw_dsc, draw_ctx); + part_draw_dsc.rect_dsc = &indic_dsc; + part_draw_dsc.class_p = MY_CLASS; + part_draw_dsc.type = LV_CHECKBOX_DRAW_PART_BOX; + part_draw_dsc.draw_area = &marker_area_transf; + part_draw_dsc.part = LV_PART_INDICATOR; + + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + lv_draw_rect(draw_ctx, &indic_dsc, &marker_area_transf); + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + + lv_point_t txt_size; + lv_txt_get_size(&txt_size, cb->txt, font, letter_space, line_space, LV_COORD_MAX, LV_TEXT_FLAG_NONE); + + lv_draw_label_dsc_t txt_dsc; + lv_draw_label_dsc_init(&txt_dsc); + lv_obj_init_draw_label_dsc(obj, LV_PART_MAIN, &txt_dsc); + + lv_coord_t y_ofs = (lv_area_get_height(&marker_area) - font_h) / 2; + lv_area_t txt_area; + txt_area.x1 = marker_area.x2 + bg_colp; + txt_area.x2 = txt_area.x1 + txt_size.x; + txt_area.y1 = obj->coords.y1 + bg_topp + y_ofs; + txt_area.y2 = txt_area.y1 + txt_size.y; + + lv_draw_label(draw_ctx, &txt_dsc, &txt_area, cb->txt, NULL); +} +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_checkbox.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_checkbox.h new file mode 100644 index 0000000..772f500 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_checkbox.h @@ -0,0 +1,97 @@ +/** + * @file lv_cb.h + * + */ + +#ifndef LV_CHECKBOX_H +#define LV_CHECKBOX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "../core/lv_obj.h" + +#if LV_USE_CHECKBOX != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_obj_t obj; + char * txt; + uint32_t static_txt : 1; +} lv_checkbox_t; + +extern const lv_obj_class_t lv_checkbox_class; + +/** + * `type` field in `lv_obj_draw_part_dsc_t` if `class_p = lv_checkbox_class` + * Used in `LV_EVENT_DRAW_PART_BEGIN` and `LV_EVENT_DRAW_PART_END` + */ +typedef enum { + LV_CHECKBOX_DRAW_PART_BOX, /**< The tick box*/ +} lv_checkbox_draw_part_type_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a check box object + * @param parent pointer to an object, it will be the parent of the new button + * @return pointer to the created check box + */ +lv_obj_t * lv_checkbox_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the text of a check box. `txt` will be copied and may be deallocated + * after this function returns. + * @param cb pointer to a check box + * @param txt the text of the check box. NULL to refresh with the current text. + */ +void lv_checkbox_set_text(lv_obj_t * obj, const char * txt); + +/** + * Set the text of a check box. `txt` must not be deallocated during the life + * of this checkbox. + * @param cb pointer to a check box + * @param txt the text of the check box. + */ +void lv_checkbox_set_text_static(lv_obj_t * obj, const char * txt); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the text of a check box + * @param cb pointer to check box object + * @return pointer to the text of the check box + */ +const char * lv_checkbox_get_text(const lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_CHECKBOX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CHECKBOX_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_dropdown.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_dropdown.c new file mode 100644 index 0000000..241d177 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_dropdown.c @@ -0,0 +1,1147 @@ +/** + * @file lv_dropdown.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../core/lv_obj.h" +#include "lv_dropdown.h" +#if LV_USE_DROPDOWN != 0 + +#include "../misc/lv_assert.h" +#include "../draw/lv_draw.h" +#include "../core/lv_group.h" +#include "../core/lv_indev.h" +#include "../core/lv_disp.h" +#include "../font/lv_symbol_def.h" +#include "../misc/lv_anim.h" +#include "../misc/lv_math.h" +#include "../misc/lv_txt_ap.h" +#include + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_dropdown_class +#define MY_CLASS_LIST &lv_dropdownlist_class + +#define LV_DROPDOWN_PR_NONE 0xFFFF + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_obj_t * lv_dropdown_list_create(lv_obj_t * parent); +static void lv_dropdown_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_dropdown_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_dropdown_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_main(lv_event_t * e); + +static void lv_dropdownlist_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_dropdownlist_destructor(const lv_obj_class_t * class_p, lv_obj_t * list_obj); +static void lv_dropdown_list_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_list(lv_event_t * e); + +static void draw_box(lv_obj_t * dropdown_obj, lv_draw_ctx_t * draw_ctx, uint16_t id, lv_state_t state); +static void draw_box_label(lv_obj_t * dropdown_obj, lv_draw_ctx_t * draw_ctx, uint16_t id, lv_state_t state); +static lv_res_t btn_release_handler(lv_obj_t * obj); +static lv_res_t list_release_handler(lv_obj_t * list_obj); +static void list_press_handler(lv_obj_t * page); +static uint16_t get_id_on_point(lv_obj_t * dropdown_obj, lv_coord_t y); +static void position_to_selected(lv_obj_t * obj); +static lv_obj_t * get_label(const lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_dropdown_class = { + .constructor_cb = lv_dropdown_constructor, + .destructor_cb = lv_dropdown_destructor, + .event_cb = lv_dropdown_event, + .width_def = LV_DPI_DEF, + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_dropdown_t), + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .base_class = &lv_obj_class +}; + +const lv_obj_class_t lv_dropdownlist_class = { + .constructor_cb = lv_dropdownlist_constructor, + .destructor_cb = lv_dropdownlist_destructor, + .event_cb = lv_dropdown_list_event, + .instance_size = sizeof(lv_dropdown_list_t), + .base_class = &lv_obj_class +}; + + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_dropdown_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_dropdown_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_dropdown_set_text(lv_obj_t * obj, const char * txt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + if(dropdown->text == txt) return; + + dropdown->text = txt; + + lv_obj_invalidate(obj); +} + +void lv_dropdown_set_options(lv_obj_t * obj, const char * options) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(options); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + /*Count the '\n'-s to determine the number of options*/ + dropdown->option_cnt = 0; + uint32_t i; + for(i = 0; options[i] != '\0'; i++) { + if(options[i] == '\n') dropdown->option_cnt++; + } + dropdown->option_cnt++; /*Last option has no `\n`*/ + dropdown->sel_opt_id = 0; + dropdown->sel_opt_id_orig = 0; + + /*Allocate space for the new text*/ +#if LV_USE_ARABIC_PERSIAN_CHARS == 0 + size_t len = strlen(options) + 1; +#else + size_t len = _lv_txt_ap_calc_bytes_cnt(options) + 1; +#endif + + if(dropdown->options != NULL && dropdown->static_txt == 0) { + lv_mem_free(dropdown->options); + dropdown->options = NULL; + } + + dropdown->options = lv_mem_alloc(len); + + LV_ASSERT_MALLOC(dropdown->options); + if(dropdown->options == NULL) return; + +#if LV_USE_ARABIC_PERSIAN_CHARS == 0 + strcpy(dropdown->options, options); +#else + _lv_txt_ap_proc(options, dropdown->options); +#endif + + /*Now the text is dynamically allocated*/ + dropdown->static_txt = 0; + + lv_obj_invalidate(obj); + if(dropdown->list) lv_obj_invalidate(dropdown->list); +} + +void lv_dropdown_set_options_static(lv_obj_t * obj, const char * options) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(options); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + /*Count the '\n'-s to determine the number of options*/ + dropdown->option_cnt = 0; + uint32_t i; + for(i = 0; options[i] != '\0'; i++) { + if(options[i] == '\n') dropdown->option_cnt++; + } + dropdown->option_cnt++; /*Last option has no `\n`*/ + dropdown->sel_opt_id = 0; + dropdown->sel_opt_id_orig = 0; + + if(dropdown->static_txt == 0 && dropdown->options != NULL) { + lv_mem_free(dropdown->options); + dropdown->options = NULL; + } + + dropdown->static_txt = 1; + dropdown->options = (char *)options; + + lv_obj_invalidate(obj); + if(dropdown->list) lv_obj_invalidate(dropdown->list); +} + +void lv_dropdown_add_option(lv_obj_t * obj, const char * option, uint32_t pos) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(option); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + /*Convert static options to dynamic*/ + if(dropdown->static_txt != 0) { + char * static_options = dropdown->options; + size_t len = strlen(static_options) + 1; + + dropdown->options = lv_mem_alloc(len); + LV_ASSERT_MALLOC(dropdown->options); + if(dropdown->options == NULL) return; + + strcpy(dropdown->options, static_options); + dropdown->static_txt = 0; + } + + /*Allocate space for the new option*/ + size_t old_len = (dropdown->options == NULL) ? 0 : strlen(dropdown->options); +#if LV_USE_ARABIC_PERSIAN_CHARS == 0 + size_t ins_len = strlen(option) + 1; +#else + size_t ins_len = _lv_txt_ap_calc_bytes_cnt(option) + 1; +#endif + + size_t new_len = ins_len + old_len + 2; /*+2 for terminating NULL and possible \n*/ + dropdown->options = lv_mem_realloc(dropdown->options, new_len + 1); + LV_ASSERT_MALLOC(dropdown->options); + if(dropdown->options == NULL) return; + + dropdown->options[old_len] = '\0'; + + /*Find the insert character position*/ + uint32_t insert_pos = old_len; + if(pos != LV_DROPDOWN_POS_LAST) { + uint32_t opcnt = 0; + for(insert_pos = 0; dropdown->options[insert_pos] != 0; insert_pos++) { + if(opcnt == pos) + break; + if(dropdown->options[insert_pos] == '\n') + opcnt++; + } + } + + /*Add delimiter to existing options*/ + if((insert_pos > 0) && (pos >= dropdown->option_cnt)) + _lv_txt_ins(dropdown->options, _lv_txt_encoded_get_char_id(dropdown->options, insert_pos++), "\n"); + + /*Insert the new option, adding \n if necessary*/ + char * ins_buf = lv_mem_buf_get(ins_len + 2); /*+ 2 for terminating NULL and possible \n*/ + LV_ASSERT_MALLOC(ins_buf); + if(ins_buf == NULL) return; +#if LV_USE_ARABIC_PERSIAN_CHARS == 0 + strcpy(ins_buf, option); +#else + _lv_txt_ap_proc(option, ins_buf); +#endif + if(pos < dropdown->option_cnt) strcat(ins_buf, "\n"); + + _lv_txt_ins(dropdown->options, _lv_txt_encoded_get_char_id(dropdown->options, insert_pos), ins_buf); + lv_mem_buf_release(ins_buf); + + dropdown->option_cnt++; + + lv_obj_invalidate(obj); + if(dropdown->list) lv_obj_invalidate(dropdown->list); +} + +void lv_dropdown_clear_options(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + if(dropdown->options == NULL) return; + + if(dropdown->static_txt == 0) + lv_mem_free(dropdown->options); + + dropdown->options = NULL; + dropdown->static_txt = 0; + dropdown->option_cnt = 0; + + lv_obj_invalidate(obj); + if(dropdown->list) lv_obj_invalidate(dropdown->list); +} + +void lv_dropdown_set_selected(lv_obj_t * obj, uint16_t sel_opt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + if(dropdown->sel_opt_id == sel_opt) return; + + dropdown->sel_opt_id = sel_opt < dropdown->option_cnt ? sel_opt : dropdown->option_cnt - 1; + dropdown->sel_opt_id_orig = dropdown->sel_opt_id; + + lv_obj_invalidate(obj); +} + +void lv_dropdown_set_dir(lv_obj_t * obj, lv_dir_t dir) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + if(dropdown->dir == dir) return; + + dropdown->dir = dir; + + lv_obj_invalidate(obj); +} + +void lv_dropdown_set_symbol(lv_obj_t * obj, const void * symbol) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + dropdown->symbol = symbol; + lv_obj_invalidate(obj); +} + +void lv_dropdown_set_selected_highlight(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + dropdown->selected_highlight = en; + if(dropdown->list) lv_obj_invalidate(dropdown->list); +} + +/*===================== + * Getter functions + *====================*/ + +lv_obj_t * lv_dropdown_get_list(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + return dropdown->list; +} + +const char * lv_dropdown_get_text(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + return dropdown->text; +} + +const char * lv_dropdown_get_options(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + return dropdown->options == NULL ? "" : dropdown->options; +} + +uint16_t lv_dropdown_get_selected(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + return dropdown->sel_opt_id; +} + +uint16_t lv_dropdown_get_option_cnt(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + return dropdown->option_cnt; +} + +void lv_dropdown_get_selected_str(const lv_obj_t * obj, char * buf, uint32_t buf_size) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + uint32_t i; + uint32_t line = 0; + size_t txt_len; + + if(dropdown->options) { + txt_len = strlen(dropdown->options); + } + else { + buf[0] = '\0'; + return; + } + + for(i = 0; i < txt_len && line != dropdown->sel_opt_id_orig; i++) { + if(dropdown->options[i] == '\n') line++; + } + + uint32_t c; + for(c = 0; i < txt_len && dropdown->options[i] != '\n'; c++, i++) { + if(buf_size && c >= buf_size - 1) { + LV_LOG_WARN("lv_dropdown_get_selected_str: the buffer was too small"); + break; + } + buf[c] = dropdown->options[i]; + } + + buf[c] = '\0'; +} + +int32_t lv_dropdown_get_option_index(lv_obj_t * obj, const char * option) +{ + const char * opts = lv_dropdown_get_options(obj); + uint32_t char_i = 0; + uint32_t opt_i = 0; + const char * start = opts; + + while(start[char_i] != '\0') { + for(char_i = 0; (start[char_i] != '\n') && (start[char_i] != '\0'); char_i++); + + if(memcmp(start, option, LV_MIN(strlen(option), char_i)) == 0) return opt_i; + start = &start[char_i]; + if(start[0] == '\n') start++; + opt_i++; + } + + return -1; +} + + +const char * lv_dropdown_get_symbol(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + return dropdown->symbol; +} + +bool lv_dropdown_get_selected_highlight(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + return dropdown->selected_highlight; +} + +lv_dir_t lv_dropdown_get_dir(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + return dropdown->dir; +} + +/*===================== + * Other functions + *====================*/ + +void lv_dropdown_open(lv_obj_t * dropdown_obj) +{ + LV_ASSERT_OBJ(dropdown_obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + + lv_obj_add_state(dropdown_obj, LV_STATE_CHECKED); + lv_obj_set_parent(dropdown->list, lv_obj_get_screen(dropdown_obj)); + lv_obj_move_to_index(dropdown->list, -1); + lv_obj_clear_flag(dropdown->list, LV_OBJ_FLAG_HIDDEN); + + /*To allow styling the list*/ + lv_event_send(dropdown_obj, LV_EVENT_READY, NULL); + + lv_obj_t * label = get_label(dropdown_obj); + lv_label_set_text_static(label, dropdown->options); + lv_obj_set_width(dropdown->list, LV_SIZE_CONTENT); + + lv_obj_update_layout(label); + /*Set smaller width to the width of the button*/ + if(lv_obj_get_width(dropdown->list) <= lv_obj_get_width(dropdown_obj) && + (dropdown->dir == LV_DIR_TOP || dropdown->dir == LV_DIR_BOTTOM)) { + lv_obj_set_width(dropdown->list, lv_obj_get_width(dropdown_obj)); + } + + lv_coord_t label_h = lv_obj_get_height(label); + lv_coord_t border_width = lv_obj_get_style_border_width(dropdown->list, LV_PART_MAIN); + lv_coord_t top = lv_obj_get_style_pad_top(dropdown->list, LV_PART_MAIN) + border_width; + lv_coord_t bottom = lv_obj_get_style_pad_bottom(dropdown->list, LV_PART_MAIN) + border_width; + + lv_coord_t list_fit_h = label_h + top + bottom; + lv_coord_t list_h = list_fit_h; + + lv_dir_t dir = dropdown->dir; + /*No space on the bottom? See if top is better.*/ + if(dropdown->dir == LV_DIR_BOTTOM) { + if(dropdown_obj->coords.y2 + list_h > LV_VER_RES) { + if(dropdown_obj->coords.y1 > LV_VER_RES - dropdown_obj->coords.y2) { + /*There is more space on the top, so make it drop up*/ + dir = LV_DIR_TOP; + list_h = dropdown_obj->coords.y1 - 1; + } + else { + list_h = LV_VER_RES - dropdown_obj->coords.y2 - 1 ; + } + } + } + /*No space on the top? See if bottom is better.*/ + else if(dropdown->dir == LV_DIR_TOP) { + if(dropdown_obj->coords.y1 - list_h < 0) { + if(dropdown_obj->coords.y1 < LV_VER_RES - dropdown_obj->coords.y2) { + /*There is more space on the top, so make it drop up*/ + dir = LV_DIR_BOTTOM; + list_h = LV_VER_RES - dropdown_obj->coords.y2; + } + else { + list_h = dropdown_obj->coords.y1; + } + } + } + + if(list_h > list_fit_h) list_h = list_fit_h; + lv_obj_set_height(dropdown->list, list_h); + + position_to_selected(dropdown_obj); + + if(dir == LV_DIR_BOTTOM) lv_obj_align_to(dropdown->list, dropdown_obj, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0); + else if(dir == LV_DIR_TOP) lv_obj_align_to(dropdown->list, dropdown_obj, LV_ALIGN_OUT_TOP_LEFT, 0, 0); + else if(dir == LV_DIR_LEFT) lv_obj_align_to(dropdown->list, dropdown_obj, LV_ALIGN_OUT_LEFT_TOP, 0, 0); + else if(dir == LV_DIR_RIGHT) lv_obj_align_to(dropdown->list, dropdown_obj, LV_ALIGN_OUT_RIGHT_TOP, 0, 0); + + lv_obj_update_layout(dropdown->list); + + if(dropdown->dir == LV_DIR_LEFT || dropdown->dir == LV_DIR_RIGHT) { + lv_coord_t y1 = lv_obj_get_y(dropdown->list); + lv_coord_t y2 = lv_obj_get_y2(dropdown->list); + if(y2 >= LV_VER_RES) { + lv_obj_set_y(dropdown->list, y1 - (y2 - LV_VER_RES) - 1); + } + } + + lv_text_align_t align = lv_obj_calculate_style_text_align(label, LV_PART_MAIN, dropdown->options); + + switch(align) { + default: + case LV_TEXT_ALIGN_LEFT: + lv_obj_align(label, LV_ALIGN_TOP_LEFT, 0, 0); + break; + case LV_TEXT_ALIGN_RIGHT: + lv_obj_align(label, LV_ALIGN_TOP_RIGHT, 0, 0); + break; + case LV_TEXT_ALIGN_CENTER: + lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 0); + break; + + } +} + +void lv_dropdown_close(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_clear_state(obj, LV_STATE_CHECKED); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + dropdown->pr_opt_id = LV_DROPDOWN_PR_NONE; + lv_obj_add_flag(dropdown->list, LV_OBJ_FLAG_HIDDEN); + + lv_event_send(obj, LV_EVENT_CANCEL, NULL); +} + +bool lv_dropdown_is_open(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + return lv_obj_has_flag(dropdown->list, LV_OBJ_FLAG_HIDDEN) ? false : true; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_obj_t * lv_dropdown_list_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_dropdownlist_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +static void lv_dropdown_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + /*Initialize the allocated 'ext'*/ + dropdown->list = NULL; + dropdown->options = NULL; + dropdown->symbol = LV_SYMBOL_DOWN; + dropdown->text = NULL; + dropdown->static_txt = 1; + dropdown->selected_highlight = 1; + dropdown->sel_opt_id = 0; + dropdown->sel_opt_id_orig = 0; + dropdown->pr_opt_id = LV_DROPDOWN_PR_NONE; + dropdown->option_cnt = 0; + dropdown->dir = LV_DIR_BOTTOM; + + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + lv_dropdown_set_options_static(obj, "Option 1\nOption 2\nOption 3"); + + dropdown->list = lv_dropdown_list_create(lv_obj_get_screen(obj)); + lv_dropdown_list_t * list = (lv_dropdown_list_t *)dropdown->list; + list->dropdown = obj; + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_dropdown_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + if(dropdown->list) { + lv_obj_del(dropdown->list); + dropdown->list = NULL; + } + + if(!dropdown->static_txt) { + lv_mem_free(dropdown->options); + dropdown->options = NULL; + } +} + +static void lv_dropdownlist_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + lv_obj_clear_flag(obj, LV_OBJ_FLAG_CLICK_FOCUSABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_IGNORE_LAYOUT); + lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN); + + lv_label_create(obj); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_dropdownlist_destructor(const lv_obj_class_t * class_p, lv_obj_t * list_obj) +{ + LV_UNUSED(class_p); + lv_dropdown_list_t * list = (lv_dropdown_list_t *)list_obj; + lv_obj_t * dropdown_obj = list->dropdown; + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + dropdown->list = NULL; +} + +static void lv_dropdown_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_res_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RES_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + if(code == LV_EVENT_FOCUSED) { + lv_group_t * g = lv_obj_get_group(obj); + bool editing = lv_group_get_editing(g); + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_get_act()); + + /*Encoders need special handling*/ + if(indev_type == LV_INDEV_TYPE_ENCODER) { + /*Open the list if editing*/ + if(editing) { + lv_dropdown_open(obj); + } + /*Close the list if navigating*/ + else { + dropdown->sel_opt_id = dropdown->sel_opt_id_orig; + lv_dropdown_close(obj); + } + } + } + else if(code == LV_EVENT_DEFOCUSED || code == LV_EVENT_LEAVE) { + lv_dropdown_close(obj); + } + else if(code == LV_EVENT_RELEASED) { + res = btn_release_handler(obj); + if(res != LV_RES_OK) return; + } + else if(code == LV_EVENT_STYLE_CHANGED) { + lv_obj_refresh_self_size(obj); + } + else if(code == LV_EVENT_SIZE_CHANGED) { + lv_obj_refresh_self_size(obj); + } + else if(code == LV_EVENT_GET_SELF_SIZE) { + lv_point_t * p = lv_event_get_param(e); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + p->y = lv_font_get_line_height(font); + } + else if(code == LV_EVENT_KEY) { + char c = *((char *)lv_event_get_param(e)); + if(c == LV_KEY_RIGHT || c == LV_KEY_DOWN) { + if(!lv_dropdown_is_open(obj)) { + lv_dropdown_open(obj); + } + else if(dropdown->sel_opt_id + 1 < dropdown->option_cnt) { + dropdown->sel_opt_id++; + position_to_selected(obj); + } + } + else if(c == LV_KEY_LEFT || c == LV_KEY_UP) { + + if(!lv_dropdown_is_open(obj)) { + lv_dropdown_open(obj); + } + else if(dropdown->sel_opt_id > 0) { + dropdown->sel_opt_id--; + position_to_selected(obj); + } + } + else if(c == LV_KEY_ESC) { + dropdown->sel_opt_id = dropdown->sel_opt_id_orig; + lv_dropdown_close(obj); + } + else if(c == LV_KEY_ENTER) { + /* Handle the ENTER key only if it was send by an other object. + * Do no process it if ENTER is sent by the dropdown because it's handled in LV_EVENT_RELEASED */ + lv_obj_t * indev_obj = lv_indev_get_obj_act(); + if(indev_obj != obj) { + res = btn_release_handler(obj); + if(res != LV_RES_OK) return; + } + } + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_main(e); + } +} + +static void lv_dropdown_list_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_res_t res; + + /*Call the ancestor's event handler*/ + lv_event_code_t code = lv_event_get_code(e); + if(code != LV_EVENT_DRAW_POST) { + res = lv_obj_event_base(MY_CLASS_LIST, e); + if(res != LV_RES_OK) return; + } + lv_obj_t * list = lv_event_get_target(e); + lv_obj_t * dropdown_obj = ((lv_dropdown_list_t *)list)->dropdown; + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + + if(code == LV_EVENT_RELEASED) { + if(lv_indev_get_scroll_obj(lv_indev_get_act()) == NULL) { + list_release_handler(list); + } + } + else if(code == LV_EVENT_PRESSED) { + list_press_handler(list); + } + else if(code == LV_EVENT_SCROLL_BEGIN) { + dropdown->pr_opt_id = LV_DROPDOWN_PR_NONE; + lv_obj_invalidate(list); + } + else if(code == LV_EVENT_DRAW_POST) { + draw_list(e); + res = lv_obj_event_base(MY_CLASS_LIST, e); + if(res != LV_RES_OK) return; + } +} + + +static void draw_main(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + + lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_coord_t left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; + lv_coord_t right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN) + border_width; + lv_coord_t top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width; + + lv_draw_label_dsc_t symbol_dsc; + lv_draw_label_dsc_init(&symbol_dsc); + lv_obj_init_draw_label_dsc(obj, LV_PART_INDICATOR, &symbol_dsc); + + /*If no text specified use the selected option*/ + const char * opt_txt; + if(dropdown->text) opt_txt = dropdown->text; + else { + char * buf = lv_mem_buf_get(128); + lv_dropdown_get_selected_str(obj, buf, 128); + opt_txt = buf; + } + + bool symbol_to_left = false; + if(dropdown->dir == LV_DIR_LEFT) symbol_to_left = true; + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL) symbol_to_left = true; + + if(dropdown->symbol) { + lv_img_src_t symbol_type = lv_img_src_get_type(dropdown->symbol); + lv_coord_t symbol_w; + lv_coord_t symbol_h; + if(symbol_type == LV_IMG_SRC_SYMBOL) { + lv_point_t size; + lv_txt_get_size(&size, dropdown->symbol, symbol_dsc.font, symbol_dsc.letter_space, symbol_dsc.line_space, LV_COORD_MAX, + symbol_dsc.flag); + symbol_w = size.x; + symbol_h = size.y; + } + else { + lv_img_header_t header; + lv_res_t res = lv_img_decoder_get_info(dropdown->symbol, &header); + if(res == LV_RES_OK) { + symbol_w = header.w; + symbol_h = header.h; + } + else { + symbol_w = -1; + symbol_h = -1; + } + } + + lv_area_t symbol_area; + if(symbol_to_left) { + symbol_area.x1 = obj->coords.x1 + left; + symbol_area.x2 = symbol_area.x1 + symbol_w - 1; + } + else { + symbol_area.x1 = obj->coords.x2 - right - symbol_w; + symbol_area.x2 = symbol_area.x1 + symbol_w - 1; + } + + if(symbol_type == LV_IMG_SRC_SYMBOL) { + symbol_area.y1 = obj->coords.y1 + top; + symbol_area.y2 = symbol_area.y1 + symbol_h - 1; + lv_draw_label(draw_ctx, &symbol_dsc, &symbol_area, dropdown->symbol, NULL); + } + else { + symbol_area.y1 = obj->coords.y1 + (lv_obj_get_height(obj) - symbol_h) / 2; + symbol_area.y2 = symbol_area.y1 + symbol_h - 1; + lv_draw_img_dsc_t img_dsc; + lv_draw_img_dsc_init(&img_dsc); + lv_obj_init_draw_img_dsc(obj, LV_PART_INDICATOR, &img_dsc); + img_dsc.pivot.x = symbol_w / 2; + img_dsc.pivot.y = symbol_h / 2; + img_dsc.angle = lv_obj_get_style_transform_angle(obj, LV_PART_INDICATOR); + lv_draw_img(draw_ctx, &img_dsc, &symbol_area, dropdown->symbol); + } + } + + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + lv_obj_init_draw_label_dsc(obj, LV_PART_MAIN, &label_dsc); + + lv_point_t size; + lv_txt_get_size(&size, opt_txt, label_dsc.font, label_dsc.letter_space, label_dsc.line_space, LV_COORD_MAX, + label_dsc.flag); + + lv_area_t txt_area; + txt_area.y1 = obj->coords.y1 + top; + txt_area.y2 = txt_area.y1 + size.y; + /*Center align the text if no symbol*/ + if(dropdown->symbol == NULL) { + txt_area.x1 = obj->coords.x1 + (lv_obj_get_width(obj) - size.x) / 2; + txt_area.x2 = txt_area.x1 + size.x; + } + else { + /*Text to the right*/ + if(symbol_to_left) { + txt_area.x1 = obj->coords.x2 - right - size.x; + txt_area.x2 = txt_area.x1 + size.x; + } + else { + txt_area.x1 = obj->coords.x1 + left; + txt_area.x2 = txt_area.x1 + size.x; + } + } + lv_draw_label(draw_ctx, &label_dsc, &txt_area, opt_txt, NULL); + + if(dropdown->text == NULL) { + lv_mem_buf_release((char *)opt_txt); + } +} + +static void draw_list(lv_event_t * e) +{ + lv_obj_t * list_obj = lv_event_get_target(e); + lv_dropdown_list_t * list = (lv_dropdown_list_t *)list_obj; + lv_obj_t * dropdown_obj = list->dropdown; + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + + /* Clip area might be too large too to shadow but + * the selected option can be drawn on only the background*/ + lv_area_t clip_area_core; + bool has_common; + has_common = _lv_area_intersect(&clip_area_core, draw_ctx->clip_area, &dropdown->list->coords); + if(has_common) { + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + draw_ctx->clip_area = &clip_area_core; + if(dropdown->selected_highlight) { + if(dropdown->pr_opt_id == dropdown->sel_opt_id) { + draw_box(dropdown_obj, draw_ctx, dropdown->pr_opt_id, LV_STATE_CHECKED | LV_STATE_PRESSED); + draw_box_label(dropdown_obj, draw_ctx, dropdown->pr_opt_id, LV_STATE_CHECKED | LV_STATE_PRESSED); + } + else { + draw_box(dropdown_obj, draw_ctx, dropdown->pr_opt_id, LV_STATE_PRESSED); + draw_box_label(dropdown_obj, draw_ctx, dropdown->pr_opt_id, LV_STATE_PRESSED); + draw_box(dropdown_obj, draw_ctx, dropdown->sel_opt_id, LV_STATE_CHECKED); + draw_box_label(dropdown_obj, draw_ctx, dropdown->sel_opt_id, LV_STATE_CHECKED); + } + } + else { + draw_box(dropdown_obj, draw_ctx, dropdown->pr_opt_id, LV_STATE_PRESSED); + draw_box_label(dropdown_obj, draw_ctx, dropdown->pr_opt_id, LV_STATE_PRESSED); + } + draw_ctx->clip_area = clip_area_ori; + } +} + +static void draw_box(lv_obj_t * dropdown_obj, lv_draw_ctx_t * draw_ctx, uint16_t id, lv_state_t state) +{ + if(id == LV_DROPDOWN_PR_NONE) return; + + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + lv_obj_t * list_obj = dropdown->list; + lv_state_t state_ori = list_obj->state; + + if(state != list_obj->state) { + list_obj->state = state; + list_obj->skip_trans = 1; + } + + /*Draw a rectangle under the selected item*/ + const lv_font_t * font = lv_obj_get_style_text_font(list_obj, LV_PART_SELECTED); + lv_coord_t line_space = lv_obj_get_style_text_line_space(list_obj, LV_PART_SELECTED); + lv_coord_t font_h = lv_font_get_line_height(font); + + /*Draw the selected*/ + lv_obj_t * label = get_label(dropdown_obj); + lv_area_t rect_area; + rect_area.y1 = label->coords.y1; + rect_area.y1 += id * (font_h + line_space); + rect_area.y1 -= line_space / 2; + + rect_area.y2 = rect_area.y1 + font_h + line_space - 1; + rect_area.x1 = dropdown->list->coords.x1; + rect_area.x2 = dropdown->list->coords.x2; + + lv_draw_rect_dsc_t sel_rect; + lv_draw_rect_dsc_init(&sel_rect); + lv_obj_init_draw_rect_dsc(list_obj, LV_PART_SELECTED, &sel_rect); + lv_draw_rect(draw_ctx, &sel_rect, &rect_area); + + list_obj->state = state_ori; + list_obj->skip_trans = 0; +} + +static void draw_box_label(lv_obj_t * dropdown_obj, lv_draw_ctx_t * draw_ctx, uint16_t id, lv_state_t state) +{ + if(id == LV_DROPDOWN_PR_NONE) return; + + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + lv_obj_t * list_obj = dropdown->list; + lv_state_t state_orig = list_obj->state; + + if(state != list_obj->state) { + list_obj->state = state; + list_obj->skip_trans = 1; + } + + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + lv_obj_init_draw_label_dsc(list_obj, LV_PART_SELECTED, &label_dsc); + + label_dsc.line_space = lv_obj_get_style_text_line_space(list_obj, + LV_PART_SELECTED); /*Line space should come from the list*/ + + lv_obj_t * label = get_label(dropdown_obj); + if(label == NULL) return; + + lv_coord_t font_h = lv_font_get_line_height(label_dsc.font); + + lv_area_t area_sel; + area_sel.y1 = label->coords.y1; + area_sel.y1 += id * (font_h + label_dsc.line_space); + area_sel.y1 -= label_dsc.line_space / 2; + + area_sel.y2 = area_sel.y1 + font_h + label_dsc.line_space - 1; + area_sel.x1 = list_obj->coords.x1; + area_sel.x2 = list_obj->coords.x2; + lv_area_t mask_sel; + bool area_ok; + area_ok = _lv_area_intersect(&mask_sel, draw_ctx->clip_area, &area_sel); + if(area_ok) { + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + draw_ctx->clip_area = &mask_sel; + lv_draw_label(draw_ctx, &label_dsc, &label->coords, lv_label_get_text(label), NULL); + draw_ctx->clip_area = clip_area_ori; + } + list_obj->state = state_orig; + list_obj->skip_trans = 0; +} + + +static lv_res_t btn_release_handler(lv_obj_t * obj) +{ + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + lv_indev_t * indev = lv_indev_get_act(); + if(lv_indev_get_scroll_obj(indev) == NULL) { + if(lv_dropdown_is_open(obj)) { + lv_dropdown_close(obj); + if(dropdown->sel_opt_id_orig != dropdown->sel_opt_id) { + dropdown->sel_opt_id_orig = dropdown->sel_opt_id; + lv_res_t res; + uint32_t id = dropdown->sel_opt_id; /*Just to use uint32_t in event data*/ + res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, &id); + if(res != LV_RES_OK) return res; + lv_obj_invalidate(obj); + } + lv_indev_type_t indev_type = lv_indev_get_type(indev); + if(indev_type == LV_INDEV_TYPE_ENCODER) { + lv_group_set_editing(lv_obj_get_group(obj), false); + } + } + else { + lv_dropdown_open(obj); + } + } + else { + dropdown->sel_opt_id = dropdown->sel_opt_id_orig; + lv_obj_invalidate(obj); + } + return LV_RES_OK; +} + +/** + * Called when a drop down list is released to open it or set new option + * @param list pointer to the drop down list's list + * @return LV_RES_INV if the list is not being deleted in the user callback. Else LV_RES_OK + */ +static lv_res_t list_release_handler(lv_obj_t * list_obj) +{ + lv_dropdown_list_t * list = (lv_dropdown_list_t *) list_obj; + lv_obj_t * dropdown_obj = list->dropdown; + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + + lv_indev_t * indev = lv_indev_get_act(); + /*Leave edit mode once a new item is selected*/ + if(lv_indev_get_type(indev) == LV_INDEV_TYPE_ENCODER) { + dropdown->sel_opt_id_orig = dropdown->sel_opt_id; + lv_group_t * g = lv_obj_get_group(dropdown_obj); + if(lv_group_get_editing(g)) { + lv_group_set_editing(g, false); + } + } + + /*Search the clicked option (For KEYPAD and ENCODER the new value should be already set)*/ + if(lv_indev_get_type(indev) == LV_INDEV_TYPE_POINTER || lv_indev_get_type(indev) == LV_INDEV_TYPE_BUTTON) { + lv_point_t p; + lv_indev_get_point(indev, &p); + dropdown->sel_opt_id = get_id_on_point(dropdown_obj, p.y); + dropdown->sel_opt_id_orig = dropdown->sel_opt_id; + } + + lv_dropdown_close(dropdown_obj); + + /*Invalidate to refresh the text*/ + if(dropdown->text == NULL) lv_obj_invalidate(dropdown_obj); + + uint32_t id = dropdown->sel_opt_id; /*Just to use uint32_t in event data*/ + lv_res_t res = lv_event_send(dropdown_obj, LV_EVENT_VALUE_CHANGED, &id); + if(res != LV_RES_OK) return res; + + return LV_RES_OK; +} + +static void list_press_handler(lv_obj_t * list_obj) +{ + lv_dropdown_list_t * list = (lv_dropdown_list_t *) list_obj; + lv_obj_t * dropdown_obj = list->dropdown; + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + + lv_indev_t * indev = lv_indev_get_act(); + if(indev && (lv_indev_get_type(indev) == LV_INDEV_TYPE_POINTER || lv_indev_get_type(indev) == LV_INDEV_TYPE_BUTTON)) { + lv_point_t p; + lv_indev_get_point(indev, &p); + dropdown->pr_opt_id = get_id_on_point(dropdown_obj, p.y); + lv_obj_invalidate(list_obj); + } +} + +static uint16_t get_id_on_point(lv_obj_t * dropdown_obj, lv_coord_t y) +{ + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + lv_obj_t * label = get_label(dropdown_obj); + if(label == NULL) return 0; + y -= label->coords.y1; + + const lv_font_t * font = lv_obj_get_style_text_font(label, LV_PART_MAIN); + lv_coord_t font_h = lv_font_get_line_height(font); + lv_coord_t line_space = lv_obj_get_style_text_line_space(label, LV_PART_MAIN); + + y += line_space / 2; + lv_coord_t h = font_h + line_space; + + uint16_t opt = y / h; + + if(opt >= dropdown->option_cnt) opt = dropdown->option_cnt - 1; + return opt; +} + +/** + * Set the position of list when it is closed to show the selected item + * @param ddlist pointer to a drop down list + */ +static void position_to_selected(lv_obj_t * dropdown_obj) +{ + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + + lv_obj_t * label = get_label(dropdown_obj); + if(label == NULL) return; + + if(lv_obj_get_height(label) <= lv_obj_get_content_height(dropdown_obj)) return; + + const lv_font_t * font = lv_obj_get_style_text_font(label, LV_PART_MAIN); + lv_coord_t font_h = lv_font_get_line_height(font); + lv_coord_t line_space = lv_obj_get_style_text_line_space(label, LV_PART_MAIN); + lv_coord_t unit_h = font_h + line_space; + lv_coord_t line_y1 = dropdown->sel_opt_id * unit_h; + + /*Scroll to the selected option*/ + lv_obj_scroll_to_y(dropdown->list, line_y1, LV_ANIM_OFF); + lv_obj_invalidate(dropdown->list); +} + +static lv_obj_t * get_label(const lv_obj_t * obj) +{ + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + if(dropdown->list == NULL) return NULL; + + return lv_obj_get_child(dropdown->list, 0); +} + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_dropdown.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_dropdown.h new file mode 100644 index 0000000..0c55e86 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_dropdown.h @@ -0,0 +1,254 @@ +/** + * @file lv_dropdown.h + * + */ + +#ifndef LV_DROPDOWN_H +#define LV_DROPDOWN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#if LV_USE_DROPDOWN != 0 + +/*Testing of dependencies*/ + +#if LV_USE_LABEL == 0 +#error "lv_dropdown: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1)" +#endif + +#include "../widgets/lv_label.h" + +/********************* + * DEFINES + *********************/ +#define LV_DROPDOWN_POS_LAST 0xFFFF +LV_EXPORT_CONST_INT(LV_DROPDOWN_POS_LAST); + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_obj_t obj; + lv_obj_t * list; /**< The dropped down list*/ + const char * text; /**< Text to display on the dropdown's button*/ + const void * symbol; /**< Arrow or other icon when the drop-down list is closed*/ + char * options; /**< Options in a '\n' separated list*/ + uint16_t option_cnt; /**< Number of options*/ + uint16_t sel_opt_id; /**< Index of the currently selected option*/ + uint16_t sel_opt_id_orig; /**< Store the original index on focus*/ + uint16_t pr_opt_id; /**< Index of the currently pressed option*/ + lv_dir_t dir : 4; /**< Direction in which the list should open*/ + uint8_t static_txt : 1; /**< 1: Only a pointer is saved in `options`*/ + uint8_t selected_highlight: 1; /**< 1: Make the selected option highlighted in the list*/ +} lv_dropdown_t; + +typedef struct { + lv_obj_t obj; + lv_obj_t * dropdown; +} lv_dropdown_list_t; + +extern const lv_obj_class_t lv_dropdown_class; +extern const lv_obj_class_t lv_dropdownlist_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a drop-down list object + * @param parent pointer to an object, it will be the parent of the new drop-down list + * @return pointer to the created drop-down list + */ +lv_obj_t * lv_dropdown_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set text of the drop-down list's button. + * If set to `NULL` the selected option's text will be displayed on the button. + * If set to a specific text then that text will be shown regardless of the selected option. + * @param obj pointer to a drop-down list object + * @param txt the text as a string (Only its pointer is saved) + */ +void lv_dropdown_set_text(lv_obj_t * obj, const char * txt); + +/** + * Set the options in a drop-down list from a string. + * The options will be copied and saved in the object so the `options` can be destroyed after calling this function + * @param obj pointer to drop-down list object + * @param options a string with '\n' separated options. E.g. "One\nTwo\nThree" + */ +void lv_dropdown_set_options(lv_obj_t * obj, const char * options); + +/** + * Set the options in a drop-down list from a static string (global, static or dynamically allocated). + * Only the pointer of the option string will be saved. + * @param obj pointer to drop-down list object + * @param options a static string with '\n' separated options. E.g. "One\nTwo\nThree" + */ +void lv_dropdown_set_options_static(lv_obj_t * obj, const char * options); + +/** + * Add an options to a drop-down list from a string. Only works for non-static options. + * @param obj pointer to drop-down list object + * @param option a string without '\n'. E.g. "Four" + * @param pos the insert position, indexed from 0, LV_DROPDOWN_POS_LAST = end of string + */ +void lv_dropdown_add_option(lv_obj_t * obj, const char * option, uint32_t pos); + +/** + * Clear all options in a drop-down list. Works with both static and dynamic options. + * @param obj pointer to drop-down list object + */ +void lv_dropdown_clear_options(lv_obj_t * obj); + +/** + * Set the selected option + * @param obj pointer to drop-down list object + * @param sel_opt id of the selected option (0 ... number of option - 1); + */ +void lv_dropdown_set_selected(lv_obj_t * obj, uint16_t sel_opt); + +/** + * Set the direction of the a drop-down list + * @param obj pointer to a drop-down list object + * @param dir LV_DIR_LEFT/RIGHT/TOP/BOTTOM + */ +void lv_dropdown_set_dir(lv_obj_t * obj, lv_dir_t dir); + +/** + * Set an arrow or other symbol to display when on drop-down list's button. Typically a down caret or arrow. + * @param obj pointer to drop-down list object + * @param symbol a text like `LV_SYMBOL_DOWN`, an image (pointer or path) or NULL to not draw symbol icon + * @note angle and zoom transformation can be applied if the symbol is an image. + * E.g. when drop down is checked (opened) rotate the symbol by 180 degree + */ +void lv_dropdown_set_symbol(lv_obj_t * obj, const void * symbol); + +/** + * Set whether the selected option in the list should be highlighted or not + * @param obj pointer to drop-down list object + * @param en true: highlight enabled; false: disabled + */ +void lv_dropdown_set_selected_highlight(lv_obj_t * obj, bool en); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the list of a drop-down to allow styling or other modifications + * @param obj pointer to a drop-down list object + * @return pointer to the list of the drop-down + */ +lv_obj_t * lv_dropdown_get_list(lv_obj_t * obj); + +/** + * Get text of the drop-down list's button. + * @param obj pointer to a drop-down list object + * @return the text as string, `NULL` if no text + */ +const char * lv_dropdown_get_text(lv_obj_t * obj); + +/** + * Get the options of a drop-down list + * @param obj pointer to drop-down list object + * @return the options separated by '\n'-s (E.g. "Option1\nOption2\nOption3") + */ +const char * lv_dropdown_get_options(const lv_obj_t * obj); + +/** + * Get the index of the selected option + * @param obj pointer to drop-down list object + * @return index of the selected option (0 ... number of option - 1); + */ +uint16_t lv_dropdown_get_selected(const lv_obj_t * obj); + +/** + * Get the total number of options + * @param obj pointer to drop-down list object + * @return the total number of options in the list + */ +uint16_t lv_dropdown_get_option_cnt(const lv_obj_t * obj); + +/** + * Get the current selected option as a string + * @param obj pointer to drop-down object + * @param buf pointer to an array to store the string + * @param buf_size size of `buf` in bytes. 0: to ignore it. + */ +void lv_dropdown_get_selected_str(const lv_obj_t * obj, char * buf, uint32_t buf_size); + +/** + * Get the index of an option. + * @param obj pointer to drop-down object + * @param option an option as string + * @return index of `option` in the list of all options. -1 if not found. + */ +int32_t lv_dropdown_get_option_index(lv_obj_t * obj, const char * option); + +/** + * Get the symbol on the drop-down list. Typically a down caret or arrow. + * @param obj pointer to drop-down list object + * @return the symbol or NULL if not enabled + */ +const char * lv_dropdown_get_symbol(lv_obj_t * obj); + +/** + * Get whether the selected option in the list should be highlighted or not + * @param obj pointer to drop-down list object + * @return true: highlight enabled; false: disabled + */ +bool lv_dropdown_get_selected_highlight(lv_obj_t * obj); + +/** + * Get the direction of the drop-down list + * @param obj pointer to a drop-down list object + * @return LV_DIR_LEF/RIGHT/TOP/BOTTOM + */ +lv_dir_t lv_dropdown_get_dir(const lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +/** + * Open the drop.down list + * @param obj pointer to drop-down list object + */ +void lv_dropdown_open(lv_obj_t * dropdown_obj); + +/** + * Close (Collapse) the drop-down list + * @param obj pointer to drop-down list object + */ +void lv_dropdown_close(lv_obj_t * obj); + +/** + * Tells whether the list is opened or not + * @param obj pointer to a drop-down list object + * @return true if the list os opened + */ +bool lv_dropdown_is_open(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DROPDOWN*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DROPDOWN_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_img.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_img.c new file mode 100644 index 0000000..f47a789 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_img.c @@ -0,0 +1,693 @@ +/** + * @file lv_img.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_img.h" +#if LV_USE_IMG != 0 + +#include "../core/lv_disp.h" +#include "../misc/lv_assert.h" +#include "../draw/lv_img_decoder.h" +#include "../misc/lv_fs.h" +#include "../misc/lv_txt.h" +#include "../misc/lv_math.h" +#include "../misc/lv_log.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_img_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_img_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_img_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_img_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_img(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_img_class = { + .constructor_cb = lv_img_constructor, + .destructor_cb = lv_img_destructor, + .event_cb = lv_img_event, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_img_t), + .base_class = &lv_obj_class +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_img_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_img_set_src(lv_obj_t * obj, const void * src) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_invalidate(obj); + + lv_img_src_t src_type = lv_img_src_get_type(src); + lv_img_t * img = (lv_img_t *)obj; + +#if LV_USE_LOG && LV_LOG_LEVEL >= LV_LOG_LEVEL_INFO + switch(src_type) { + case LV_IMG_SRC_FILE: + LV_LOG_TRACE("lv_img_set_src: `LV_IMG_SRC_FILE` type found"); + break; + case LV_IMG_SRC_VARIABLE: + LV_LOG_TRACE("lv_img_set_src: `LV_IMG_SRC_VARIABLE` type found"); + break; + case LV_IMG_SRC_SYMBOL: + LV_LOG_TRACE("lv_img_set_src: `LV_IMG_SRC_SYMBOL` type found"); + break; + default: + LV_LOG_WARN("lv_img_set_src: unknown type"); + } +#endif + + /*If the new source type is unknown free the memories of the old source*/ + if(src_type == LV_IMG_SRC_UNKNOWN) { + LV_LOG_WARN("lv_img_set_src: unknown image type"); + if(img->src_type == LV_IMG_SRC_SYMBOL || img->src_type == LV_IMG_SRC_FILE) { + lv_mem_free((void *)img->src); + } + img->src = NULL; + img->src_type = LV_IMG_SRC_UNKNOWN; + return; + } + + lv_img_header_t header; + lv_img_decoder_get_info(src, &header); + + /*Save the source*/ + if(src_type == LV_IMG_SRC_VARIABLE) { + /*If memory was allocated because of the previous `src_type` then free it*/ + if(img->src_type == LV_IMG_SRC_FILE || img->src_type == LV_IMG_SRC_SYMBOL) { + lv_mem_free((void *)img->src); + } + img->src = src; + } + else if(src_type == LV_IMG_SRC_FILE || src_type == LV_IMG_SRC_SYMBOL) { + /*If the new and the old src are the same then it was only a refresh.*/ + if(img->src != src) { + const void * old_src = NULL; + /*If memory was allocated because of the previous `src_type` then save its pointer and free after allocation. + *It's important to allocate first to be sure the new data will be on a new address. + *Else `img_cache` wouldn't see the change in source.*/ + if(img->src_type == LV_IMG_SRC_FILE || img->src_type == LV_IMG_SRC_SYMBOL) { + old_src = img->src; + } + char * new_str = lv_mem_alloc(strlen(src) + 1); + LV_ASSERT_MALLOC(new_str); + if(new_str == NULL) return; + strcpy(new_str, src); + img->src = new_str; + + if(old_src) lv_mem_free((void *)old_src); + } + } + + if(src_type == LV_IMG_SRC_SYMBOL) { + /*`lv_img_dsc_get_info` couldn't set the width and height of a font so set it here*/ + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_point_t size; + lv_txt_get_size(&size, src, font, letter_space, line_space, LV_COORD_MAX, LV_TEXT_FLAG_NONE); + header.w = size.x; + header.h = size.y; + } + + img->src_type = src_type; + img->w = header.w; + img->h = header.h; + img->cf = header.cf; + img->pivot.x = header.w / 2; + img->pivot.y = header.h / 2; + + lv_obj_refresh_self_size(obj); + + /*Provide enough room for the rotated corners*/ + if(img->angle || img->zoom != LV_IMG_ZOOM_NONE) lv_obj_refresh_ext_draw_size(obj); + + lv_obj_invalidate(obj); +} + +void lv_img_set_offset_x(lv_obj_t * obj, lv_coord_t x) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_img_t * img = (lv_img_t *)obj; + + x = x % img->w; + + img->offset.x = x; + lv_obj_invalidate(obj); +} + +void lv_img_set_offset_y(lv_obj_t * obj, lv_coord_t y) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_img_t * img = (lv_img_t *)obj; + + y = y % img->h; + + img->offset.y = y; + lv_obj_invalidate(obj); +} + +void lv_img_set_angle(lv_obj_t * obj, int16_t angle) +{ + if(angle < 0 || angle >= 3600) angle = angle % 3600; + + lv_img_t * img = (lv_img_t *)obj; + if(angle == img->angle) return; + + lv_obj_update_layout(obj); /*Be sure the object's size is calculated*/ + lv_coord_t w = lv_obj_get_width(obj); + lv_coord_t h = lv_obj_get_height(obj); + lv_area_t a; + _lv_img_buf_get_transformed_area(&a, w, h, img->angle, img->zoom, &img->pivot); + a.x1 += obj->coords.x1; + a.y1 += obj->coords.y1; + a.x2 += obj->coords.x1; + a.y2 += obj->coords.y1; + lv_obj_invalidate_area(obj, &a); + + img->angle = angle; + + /* Disable invalidations because lv_obj_refresh_ext_draw_size would invalidate + * the whole ext draw area */ + lv_disp_t * disp = lv_obj_get_disp(obj); + lv_disp_enable_invalidation(disp, false); + lv_obj_refresh_ext_draw_size(obj); + lv_disp_enable_invalidation(disp, true); + + _lv_img_buf_get_transformed_area(&a, w, h, img->angle, img->zoom, &img->pivot); + a.x1 += obj->coords.x1; + a.y1 += obj->coords.y1; + a.x2 += obj->coords.x1; + a.y2 += obj->coords.y1; + lv_obj_invalidate_area(obj, &a); +} + +void lv_img_set_pivot(lv_obj_t * obj, lv_coord_t x, lv_coord_t y) +{ + lv_img_t * img = (lv_img_t *)obj; + if(img->pivot.x == x && img->pivot.y == y) return; + + lv_obj_update_layout(obj); /*Be sure the object's size is calculated*/ + lv_coord_t w = lv_obj_get_width(obj); + lv_coord_t h = lv_obj_get_height(obj); + lv_area_t a; + _lv_img_buf_get_transformed_area(&a, w, h, img->angle, img->zoom, &img->pivot); + a.x1 += obj->coords.x1; + a.y1 += obj->coords.y1; + a.x2 += obj->coords.x1; + a.y2 += obj->coords.y1; + lv_obj_invalidate_area(obj, &a); + + img->pivot.x = x; + img->pivot.y = y; + + /* Disable invalidations because lv_obj_refresh_ext_draw_size would invalidate + * the whole ext draw area */ + lv_disp_t * disp = lv_obj_get_disp(obj); + lv_disp_enable_invalidation(disp, false); + lv_obj_refresh_ext_draw_size(obj); + lv_disp_enable_invalidation(disp, true); + + _lv_img_buf_get_transformed_area(&a, w, h, img->angle, img->zoom, &img->pivot); + a.x1 += obj->coords.x1; + a.y1 += obj->coords.y1; + a.x2 += obj->coords.x1; + a.y2 += obj->coords.y1; + lv_obj_invalidate_area(obj, &a); +} + +void lv_img_set_zoom(lv_obj_t * obj, uint16_t zoom) +{ + lv_img_t * img = (lv_img_t *)obj; + if(zoom == img->zoom) return; + + if(zoom == 0) zoom = 1; + + lv_obj_update_layout(obj); /*Be sure the object's size is calculated*/ + lv_coord_t w = lv_obj_get_width(obj); + lv_coord_t h = lv_obj_get_height(obj); + lv_area_t a; + _lv_img_buf_get_transformed_area(&a, w, h, img->angle, img->zoom >> 8, &img->pivot); + a.x1 += obj->coords.x1 - 1; + a.y1 += obj->coords.y1 - 1; + a.x2 += obj->coords.x1 + 1; + a.y2 += obj->coords.y1 + 1; + lv_obj_invalidate_area(obj, &a); + + img->zoom = zoom; + + /* Disable invalidations because lv_obj_refresh_ext_draw_size would invalidate + * the whole ext draw area */ + lv_disp_t * disp = lv_obj_get_disp(obj); + lv_disp_enable_invalidation(disp, false); + lv_obj_refresh_ext_draw_size(obj); + lv_disp_enable_invalidation(disp, true); + + _lv_img_buf_get_transformed_area(&a, w, h, img->angle, img->zoom, &img->pivot); + a.x1 += obj->coords.x1 - 1; + a.y1 += obj->coords.y1 - 1; + a.x2 += obj->coords.x1 + 1; + a.y2 += obj->coords.y1 + 1; + lv_obj_invalidate_area(obj, &a); +} + +void lv_img_set_antialias(lv_obj_t * obj, bool antialias) +{ + lv_img_t * img = (lv_img_t *)obj; + if(antialias == img->antialias) return; + + img->antialias = antialias; + lv_obj_invalidate(obj); +} + +void lv_img_set_size_mode(lv_obj_t * obj, lv_img_size_mode_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_img_t * img = (lv_img_t *)obj; + if(mode == img->obj_size_mode) return; + + img->obj_size_mode = mode; + lv_obj_invalidate(obj); +} + +/*===================== + * Getter functions + *====================*/ + +const void * lv_img_get_src(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_img_t * img = (lv_img_t *)obj; + + return img->src; +} + +lv_coord_t lv_img_get_offset_x(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_img_t * img = (lv_img_t *)obj; + + return img->offset.x; +} + +lv_coord_t lv_img_get_offset_y(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_img_t * img = (lv_img_t *)obj; + + return img->offset.y; +} + +uint16_t lv_img_get_angle(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_img_t * img = (lv_img_t *)obj; + + return img->angle; +} + +void lv_img_get_pivot(lv_obj_t * obj, lv_point_t * pivot) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_img_t * img = (lv_img_t *)obj; + + *pivot = img->pivot; +} + +uint16_t lv_img_get_zoom(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_img_t * img = (lv_img_t *)obj; + + return img->zoom; +} + +bool lv_img_get_antialias(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_img_t * img = (lv_img_t *)obj; + + return img->antialias ? true : false; +} + +lv_img_size_mode_t lv_img_get_size_mode(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_img_t * img = (lv_img_t *)obj; + return img->obj_size_mode; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_img_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_img_t * img = (lv_img_t *)obj; + + img->src = NULL; + img->src_type = LV_IMG_SRC_UNKNOWN; + img->cf = LV_IMG_CF_UNKNOWN; + img->w = lv_obj_get_width(obj); + img->h = lv_obj_get_height(obj); + img->angle = 0; + img->zoom = LV_IMG_ZOOM_NONE; + img->antialias = LV_COLOR_DEPTH > 8 ? 1 : 0; + img->offset.x = 0; + img->offset.y = 0; + img->pivot.x = 0; + img->pivot.y = 0; + img->obj_size_mode = LV_IMG_SIZE_MODE_VIRTUAL; + + lv_obj_clear_flag(obj, LV_OBJ_FLAG_CLICKABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_ADV_HITTEST); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_img_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_img_t * img = (lv_img_t *)obj; + if(img->src_type == LV_IMG_SRC_FILE || img->src_type == LV_IMG_SRC_SYMBOL) { + lv_mem_free((void *)img->src); + img->src = NULL; + img->src_type = LV_IMG_SRC_UNKNOWN; + } +} + +static lv_point_t lv_img_get_transformed_size(lv_obj_t * obj) +{ + lv_img_t * img = (lv_img_t *)obj; + + + lv_area_t area_transform; + _lv_img_buf_get_transformed_area(&area_transform, img->w, img->h, + img->angle, img->zoom, &img->pivot); + + return (lv_point_t) { + lv_area_get_width(&area_transform), lv_area_get_height(&area_transform) + }; +} + +static void lv_img_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_event_code_t code = lv_event_get_code(e); + + /*Ancestor events will be called during drawing*/ + if(code != LV_EVENT_DRAW_MAIN && code != LV_EVENT_DRAW_POST) { + /*Call the ancestor's event handler*/ + lv_res_t res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RES_OK) return; + } + + lv_obj_t * obj = lv_event_get_target(e); + lv_img_t * img = (lv_img_t *)obj; + + if(code == LV_EVENT_STYLE_CHANGED) { + /*Refresh the file name to refresh the symbol text size*/ + if(img->src_type == LV_IMG_SRC_SYMBOL) { + lv_img_set_src(obj, img->src); + } + else { + /*With transformation it might change*/ + lv_obj_refresh_ext_draw_size(obj); + } + } + else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + + lv_coord_t * s = lv_event_get_param(e); + + /*If the image has angle provide enough room for the rotated corners*/ + if(img->angle || img->zoom != LV_IMG_ZOOM_NONE) { + lv_area_t a; + lv_coord_t w = lv_obj_get_width(obj); + lv_coord_t h = lv_obj_get_height(obj); + _lv_img_buf_get_transformed_area(&a, w, h, img->angle, img->zoom, &img->pivot); + *s = LV_MAX(*s, -a.x1); + *s = LV_MAX(*s, -a.y1); + *s = LV_MAX(*s, a.x2 - w); + *s = LV_MAX(*s, a.y2 - h); + } + } + else if(code == LV_EVENT_HIT_TEST) { + lv_hit_test_info_t * info = lv_event_get_param(e); + + /*If the object is exactly image sized (not cropped, not mosaic) and transformed + *perform hit test on its transformed area*/ + if(img->w == lv_obj_get_width(obj) && img->h == lv_obj_get_height(obj) && + (img->zoom != LV_IMG_ZOOM_NONE || img->angle != 0 || img->pivot.x != img->w / 2 || img->pivot.y != img->h / 2)) { + + lv_coord_t w = lv_obj_get_width(obj); + lv_coord_t h = lv_obj_get_height(obj); + lv_area_t coords; + _lv_img_buf_get_transformed_area(&coords, w, h, img->angle, img->zoom, &img->pivot); + coords.x1 += obj->coords.x1; + coords.y1 += obj->coords.y1; + coords.x2 += obj->coords.x1; + coords.y2 += obj->coords.y1; + + info->res = _lv_area_is_point_on(&coords, info->point, 0); + } + else { + lv_area_t a; + lv_obj_get_click_area(obj, &a); + info->res = _lv_area_is_point_on(&a, info->point, 0); + } + } + else if(code == LV_EVENT_GET_SELF_SIZE) { + lv_point_t * p = lv_event_get_param(e); + if(img->obj_size_mode == LV_IMG_SIZE_MODE_REAL) { + *p = lv_img_get_transformed_size(obj); + } + else { + p->x = img->w; + p->y = img->h; + } + } + else if(code == LV_EVENT_DRAW_MAIN || code == LV_EVENT_DRAW_POST || code == LV_EVENT_COVER_CHECK) { + draw_img(e); + } +} + +static void draw_img(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + lv_img_t * img = (lv_img_t *)obj; + if(code == LV_EVENT_COVER_CHECK) { + lv_cover_check_info_t * info = lv_event_get_param(e); + if(info->res == LV_COVER_RES_MASKED) return; + if(img->src_type == LV_IMG_SRC_UNKNOWN || img->src_type == LV_IMG_SRC_SYMBOL) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + + /*Non true color format might have "holes"*/ + if(img->cf != LV_IMG_CF_TRUE_COLOR && img->cf != LV_IMG_CF_RAW) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + + /*With not LV_OPA_COVER images can't cover an area */ + if(lv_obj_get_style_img_opa(obj, LV_PART_MAIN) != LV_OPA_COVER) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + + if(img->angle != 0) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + + const lv_area_t * clip_area = lv_event_get_param(e); + if(img->zoom == LV_IMG_ZOOM_NONE) { + if(_lv_area_is_in(clip_area, &obj->coords, 0) == false) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + } + else { + lv_area_t a; + _lv_img_buf_get_transformed_area(&a, lv_obj_get_width(obj), lv_obj_get_height(obj), 0, img->zoom, &img->pivot); + a.x1 += obj->coords.x1; + a.y1 += obj->coords.y1; + a.x2 += obj->coords.x1; + a.y2 += obj->coords.y1; + + if(_lv_area_is_in(clip_area, &a, 0) == false) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + } + } + else if(code == LV_EVENT_DRAW_MAIN || code == LV_EVENT_DRAW_POST) { + + lv_coord_t obj_w = lv_obj_get_width(obj); + lv_coord_t obj_h = lv_obj_get_height(obj); + + lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_coord_t pleft = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; + lv_coord_t pright = lv_obj_get_style_pad_right(obj, LV_PART_MAIN) + border_width; + lv_coord_t ptop = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width; + lv_coord_t pbottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN) + border_width; + + lv_point_t bg_pivot; + bg_pivot.x = img->pivot.x + pleft; + bg_pivot.y = img->pivot.y + ptop; + lv_area_t bg_coords; + + if(img->obj_size_mode == LV_IMG_SIZE_MODE_REAL) { + /*Object size equals to transformed image size*/ + lv_obj_get_coords(obj, &bg_coords); + } + else { + _lv_img_buf_get_transformed_area(&bg_coords, obj_w, obj_h, + img->angle, img->zoom, &bg_pivot); + + /*Modify the coordinates to draw the background for the rotated and scaled coordinates*/ + bg_coords.x1 += obj->coords.x1; + bg_coords.y1 += obj->coords.y1; + bg_coords.x2 += obj->coords.x1; + bg_coords.y2 += obj->coords.y1; + } + + lv_area_t ori_coords; + lv_area_copy(&ori_coords, &obj->coords); + lv_area_copy(&obj->coords, &bg_coords); + + lv_res_t res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RES_OK) return; + + lv_area_copy(&obj->coords, &ori_coords); + + if(code == LV_EVENT_DRAW_MAIN) { + if(img->h == 0 || img->w == 0) return; + if(img->zoom == 0) return; + + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + + lv_area_t img_max_area; + lv_area_copy(&img_max_area, &obj->coords); + + lv_point_t img_size_final = lv_img_get_transformed_size(obj); + + if(img->obj_size_mode == LV_IMG_SIZE_MODE_REAL) { + img_max_area.x1 -= ((img->w - img_size_final.x) + 1) / 2; + img_max_area.x2 -= ((img->w - img_size_final.x) + 1) / 2; + img_max_area.y1 -= ((img->h - img_size_final.y) + 1) / 2; + img_max_area.y2 -= ((img->h - img_size_final.y) + 1) / 2; + } + else { + img_max_area.x2 = img_max_area.x1 + lv_area_get_width(&bg_coords) - 1; + img_max_area.y2 = img_max_area.y1 + lv_area_get_height(&bg_coords) - 1; + } + + img_max_area.x1 += pleft; + img_max_area.y1 += ptop; + img_max_area.x2 -= pright; + img_max_area.y2 -= pbottom; + + if(img->src_type == LV_IMG_SRC_FILE || img->src_type == LV_IMG_SRC_VARIABLE) { + lv_draw_img_dsc_t img_dsc; + lv_draw_img_dsc_init(&img_dsc); + lv_obj_init_draw_img_dsc(obj, LV_PART_MAIN, &img_dsc); + + img_dsc.zoom = img->zoom; + img_dsc.angle = img->angle; + img_dsc.pivot.x = img->pivot.x; + img_dsc.pivot.y = img->pivot.y; + img_dsc.antialias = img->antialias; + + lv_area_t img_clip_area; + img_clip_area.x1 = bg_coords.x1 + pleft; + img_clip_area.y1 = bg_coords.y1 + ptop; + img_clip_area.x2 = bg_coords.x2 - pright; + img_clip_area.y2 = bg_coords.y2 - pbottom; + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + + if(!_lv_area_intersect(&img_clip_area, draw_ctx->clip_area, &img_clip_area)) return; + draw_ctx->clip_area = &img_clip_area; + + lv_area_t coords_tmp; + coords_tmp.y1 = img_max_area.y1 + img->offset.y; + if(coords_tmp.y1 > img_max_area.y1) coords_tmp.y1 -= img->h; + coords_tmp.y2 = coords_tmp.y1 + img->h - 1; + + for(; coords_tmp.y1 < img_max_area.y2; coords_tmp.y1 += img_size_final.y, coords_tmp.y2 += img_size_final.y) { + coords_tmp.x1 = img_max_area.x1 + img->offset.x; + if(coords_tmp.x1 > img_max_area.x1) coords_tmp.x1 -= img->w; + coords_tmp.x2 = coords_tmp.x1 + img->w - 1; + + for(; coords_tmp.x1 < img_max_area.x2; coords_tmp.x1 += img_size_final.x, coords_tmp.x2 += img_size_final.x) { + lv_draw_img(draw_ctx, &img_dsc, &coords_tmp, img->src); + } + } + draw_ctx->clip_area = clip_area_ori; + } + else if(img->src_type == LV_IMG_SRC_SYMBOL) { + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + lv_obj_init_draw_label_dsc(obj, LV_PART_MAIN, &label_dsc); + + lv_draw_label(draw_ctx, &label_dsc, &obj->coords, img->src, NULL); + } + else { + /*Trigger the error handler of image draw*/ + LV_LOG_WARN("draw_img: image source type is unknown"); + lv_draw_img(draw_ctx, NULL, &obj->coords, NULL); + } + } + } +} + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_img.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_img.h new file mode 100644 index 0000000..eb76c8d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_img.h @@ -0,0 +1,234 @@ +/** + * @file lv_img.h + * + */ + +#ifndef LV_IMG_H +#define LV_IMG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#if LV_USE_IMG != 0 + +/*Testing of dependencies*/ +#if LV_USE_LABEL == 0 +#error "lv_img: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1)" +#endif + +#include "../core/lv_obj.h" +#include "../misc/lv_fs.h" +#include "../draw/lv_draw.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Data of image + */ +typedef struct { + lv_obj_t obj; + const void * src; /*Image source: Pointer to an array or a file or a symbol*/ + lv_point_t offset; + lv_coord_t w; /*Width of the image (Handled by the library)*/ + lv_coord_t h; /*Height of the image (Handled by the library)*/ + uint16_t angle; /*rotation angle of the image*/ + lv_point_t pivot; /*rotation center of the image*/ + uint16_t zoom; /*256 means no zoom, 512 double size, 128 half size*/ + uint8_t src_type : 2; /*See: lv_img_src_t*/ + uint8_t cf : 5; /*Color format from `lv_img_color_format_t`*/ + uint8_t antialias : 1; /*Apply anti-aliasing in transformations (rotate, zoom)*/ + uint8_t obj_size_mode: 2; /*Image size mode when image size and object size is different.*/ +} lv_img_t; + +extern const lv_obj_class_t lv_img_class; + +/** + * Image size mode, when image size and object size is different + */ +enum { + /** Zoom doesn't affect the coordinates of the object, + * however if zoomed in the image is drawn out of the its coordinates. + * The layout's won't change on zoom */ + LV_IMG_SIZE_MODE_VIRTUAL = 0, + + /** If the object size is set to SIZE_CONTENT, then object size equals zoomed image size. + * It causes layout recalculation. + * If the object size is set explicitly, the image will be cropped when zoomed in.*/ + LV_IMG_SIZE_MODE_REAL, +}; + +typedef uint8_t lv_img_size_mode_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an image object + * @param parent pointer to an object, it will be the parent of the new image + * @return pointer to the created image + */ +lv_obj_t * lv_img_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the image data to display on the object + * @param obj pointer to an image object + * @param src_img 1) pointer to an ::lv_img_dsc_t descriptor (converted by LVGL's image converter) (e.g. &my_img) or + * 2) path to an image file (e.g. "S:/dir/img.bin")or + * 3) a SYMBOL (e.g. LV_SYMBOL_OK) + */ +void lv_img_set_src(lv_obj_t * obj, const void * src); + +/** + * Set an offset for the source of an image so the image will be displayed from the new origin. + * @param obj pointer to an image + * @param x the new offset along x axis. + */ +void lv_img_set_offset_x(lv_obj_t * obj, lv_coord_t x); + +/** + * Set an offset for the source of an image. + * so the image will be displayed from the new origin. + * @param obj pointer to an image + * @param y the new offset along y axis. + */ +void lv_img_set_offset_y(lv_obj_t * obj, lv_coord_t y); + + +/** + * Set the rotation angle of the image. + * The image will be rotated around the set pivot set by `lv_img_set_pivot()` + * Note that indexed and alpha only images can't be transformed. + * @param obj pointer to an image object + * @param angle rotation angle in degree with 0.1 degree resolution (0..3600: clock wise) + */ +void lv_img_set_angle(lv_obj_t * obj, int16_t angle); + +/** + * Set the rotation center of the image. + * The image will be rotated around this point. + * @param obj pointer to an image object + * @param x rotation center x of the image + * @param y rotation center y of the image + */ +void lv_img_set_pivot(lv_obj_t * obj, lv_coord_t x, lv_coord_t y); + + +/** + * Set the zoom factor of the image. + * Note that indexed and alpha only images can't be transformed. + * @param img pointer to an image object + * @param zoom the zoom factor. + * @example 256 or LV_ZOOM_IMG_NONE for no zoom + * @example <256: scale down + * @example >256 scale up + * @example 128 half size + * @example 512 double size + */ +void lv_img_set_zoom(lv_obj_t * obj, uint16_t zoom); + +/** + * Enable/disable anti-aliasing for the transformations (rotate, zoom) or not. + * The quality is better with anti-aliasing looks better but slower. + * @param obj pointer to an image object + * @param antialias true: anti-aliased; false: not anti-aliased + */ +void lv_img_set_antialias(lv_obj_t * obj, bool antialias); + +/** + * Set the image object size mode. + * + * @param obj pointer to an image object + * @param mode the new size mode. + */ +void lv_img_set_size_mode(lv_obj_t * obj, lv_img_size_mode_t mode); +/*===================== + * Getter functions + *====================*/ + +/** + * Get the source of the image + * @param obj pointer to an image object + * @return the image source (symbol, file name or ::lv-img_dsc_t for C arrays) + */ +const void * lv_img_get_src(lv_obj_t * obj); + +/** + * Get the offset's x attribute of the image object. + * @param img pointer to an image + * @return offset X value. + */ +lv_coord_t lv_img_get_offset_x(lv_obj_t * obj); + +/** + * Get the offset's y attribute of the image object. + * @param obj pointer to an image + * @return offset Y value. + */ +lv_coord_t lv_img_get_offset_y(lv_obj_t * obj); + +/** + * Get the rotation angle of the image. + * @param obj pointer to an image object + * @return rotation angle in 0.1 degrees (0..3600) + */ +uint16_t lv_img_get_angle(lv_obj_t * obj); + +/** + * Get the pivot (rotation center) of the image. + * @param img pointer to an image object + * @param pivot store the rotation center here + */ +void lv_img_get_pivot(lv_obj_t * obj, lv_point_t * pivot); + +/** + * Get the zoom factor of the image. + * @param obj pointer to an image object + * @return zoom factor (256: no zoom) + */ +uint16_t lv_img_get_zoom(lv_obj_t * obj); + +/** + * Get whether the transformations (rotate, zoom) are anti-aliased or not + * @param obj pointer to an image object + * @return true: anti-aliased; false: not anti-aliased + */ +bool lv_img_get_antialias(lv_obj_t * obj); + +/** + * Get the size mode of the image + * @param obj pointer to an image object + * @return element of @ref lv_img_size_mode_t + */ +lv_img_size_mode_t lv_img_get_size_mode(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +/** Use this macro to declare an image in a C file*/ +#define LV_IMG_DECLARE(var_name) extern const lv_img_dsc_t var_name; + +#endif /*LV_USE_IMG*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IMG_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_label.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_label.c new file mode 100644 index 0000000..f4fbe01 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_label.c @@ -0,0 +1,1274 @@ +/** + * @file lv_label.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_label.h" +#if LV_USE_LABEL != 0 +#include "../core/lv_obj.h" +#include "../misc/lv_assert.h" +#include "../core/lv_group.h" +#include "../draw/lv_draw.h" +#include "../misc/lv_color.h" +#include "../misc/lv_math.h" +#include "../misc/lv_bidi.h" +#include "../misc/lv_txt_ap.h" +#include "../misc/lv_printf.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_label_class + +#define LV_LABEL_DEF_SCROLL_SPEED (lv_disp_get_dpi(lv_obj_get_disp(obj)) / 3) +#define LV_LABEL_SCROLL_DELAY 300 +#define LV_LABEL_DOT_END_INV 0xFFFFFFFF +#define LV_LABEL_HINT_HEIGHT_LIMIT 1024 /*Enable "hint" to buffer info about labels larger than this. (Speed up drawing)*/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_label_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_label_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_label_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_main(lv_event_t * e); + +static void lv_label_refr_text(lv_obj_t * obj); +static void lv_label_revert_dots(lv_obj_t * label); + +static bool lv_label_set_dot_tmp(lv_obj_t * label, char * data, uint32_t len); +static char * lv_label_get_dot_tmp(lv_obj_t * label); +static void lv_label_dot_tmp_free(lv_obj_t * label); +static void set_ofs_x_anim(void * obj, int32_t v); +static void set_ofs_y_anim(void * obj, int32_t v); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_label_class = { + .constructor_cb = lv_label_constructor, + .destructor_cb = lv_label_destructor, + .event_cb = lv_label_event, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_label_t), + .base_class = &lv_obj_class +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_label_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_label_set_text(lv_obj_t * obj, const char * text) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_label_t * label = (lv_label_t *)obj; + + lv_obj_invalidate(obj); + + /*If text is NULL then just refresh with the current text*/ + if(text == NULL) text = label->text; + + if(label->text == text && label->static_txt == 0) { + /*If set its own text then reallocate it (maybe its size changed)*/ +#if LV_USE_ARABIC_PERSIAN_CHARS + /*Get the size of the text and process it*/ + size_t len = _lv_txt_ap_calc_bytes_cnt(text); + + label->text = lv_mem_realloc(label->text, len); + LV_ASSERT_MALLOC(label->text); + if(label->text == NULL) return; + + _lv_txt_ap_proc(label->text, label->text); +#else + label->text = lv_mem_realloc(label->text, strlen(label->text) + 1); +#endif + + LV_ASSERT_MALLOC(label->text); + if(label->text == NULL) return; + } + else { + /*Free the old text*/ + if(label->text != NULL && label->static_txt == 0) { + lv_mem_free(label->text); + label->text = NULL; + } + +#if LV_USE_ARABIC_PERSIAN_CHARS + /*Get the size of the text and process it*/ + size_t len = _lv_txt_ap_calc_bytes_cnt(text); + + label->text = lv_mem_alloc(len); + LV_ASSERT_MALLOC(label->text); + if(label->text == NULL) return; + + _lv_txt_ap_proc(text, label->text); +#else + /*Get the size of the text*/ + size_t len = strlen(text) + 1; + + /*Allocate space for the new text*/ + label->text = lv_mem_alloc(len); + LV_ASSERT_MALLOC(label->text); + if(label->text == NULL) return; + strcpy(label->text, text); +#endif + + /*Now the text is dynamically allocated*/ + label->static_txt = 0; + } + + lv_label_refr_text(obj); +} + +void lv_label_set_text_fmt(lv_obj_t * obj, const char * fmt, ...) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(fmt); + + lv_obj_invalidate(obj); + lv_label_t * label = (lv_label_t *)obj; + + /*If text is NULL then refresh*/ + if(fmt == NULL) { + lv_label_refr_text(obj); + return; + } + + if(label->text != NULL && label->static_txt == 0) { + lv_mem_free(label->text); + label->text = NULL; + } + + va_list args; + va_start(args, fmt); + label->text = _lv_txt_set_text_vfmt(fmt, args); + va_end(args); + label->static_txt = 0; /*Now the text is dynamically allocated*/ + + lv_label_refr_text(obj); +} + +void lv_label_set_text_static(lv_obj_t * obj, const char * text) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_label_t * label = (lv_label_t *)obj; + + if(label->static_txt == 0 && label->text != NULL) { + lv_mem_free(label->text); + label->text = NULL; + } + + if(text != NULL) { + label->static_txt = 1; + label->text = (char *)text; + } + + lv_label_refr_text(obj); +} + +void lv_label_set_long_mode(lv_obj_t * obj, lv_label_long_mode_t long_mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_label_t * label = (lv_label_t *)obj; + + /*Delete the old animation (if exists)*/ + lv_anim_del(obj, set_ofs_x_anim); + lv_anim_del(obj, set_ofs_y_anim); + label->offset.x = 0; + label->offset.y = 0; + + if(long_mode == LV_LABEL_LONG_SCROLL || long_mode == LV_LABEL_LONG_SCROLL_CIRCULAR || long_mode == LV_LABEL_LONG_CLIP) + label->expand = 1; + else + label->expand = 0; + + /*Restore the character under the dots*/ + if(label->long_mode == LV_LABEL_LONG_DOT && label->dot_end != LV_LABEL_DOT_END_INV) { + lv_label_revert_dots(obj); + } + + label->long_mode = long_mode; + lv_label_refr_text(obj); +} + +void lv_label_set_recolor(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_label_t * label = (lv_label_t *)obj; + if(label->recolor == en) return; + + label->recolor = en == false ? 0 : 1; + + /*Refresh the text because the potential color codes in text needs to be hidden or revealed*/ + lv_label_refr_text(obj); +} + +void lv_label_set_text_sel_start(lv_obj_t * obj, uint32_t index) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_label_t * label = (lv_label_t *)obj; + label->sel_start = index; + lv_obj_invalidate(obj); +#else + LV_UNUSED(obj); /*Unused*/ + LV_UNUSED(index); /*Unused*/ +#endif +} + +void lv_label_set_text_sel_end(lv_obj_t * obj, uint32_t index) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_label_t * label = (lv_label_t *)obj; + label->sel_end = index; + lv_obj_invalidate(obj); +#else + LV_UNUSED(obj); /*Unused*/ + LV_UNUSED(index); /*Unused*/ +#endif +} + +/*===================== + * Getter functions + *====================*/ + +char * lv_label_get_text(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_label_t * label = (lv_label_t *)obj; + return label->text; +} + +lv_label_long_mode_t lv_label_get_long_mode(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_label_t * label = (lv_label_t *)obj; + return label->long_mode; +} + +bool lv_label_get_recolor(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_label_t * label = (lv_label_t *)obj; + return label->recolor == 0 ? false : true; +} + +void lv_label_get_letter_pos(const lv_obj_t * obj, uint32_t char_id, lv_point_t * pos) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(pos); + + lv_label_t * label = (lv_label_t *)obj; + const char * txt = lv_label_get_text(obj); + lv_text_align_t align = lv_obj_calculate_style_text_align(obj, LV_PART_MAIN, txt); + + if(txt[0] == '\0') { + pos->y = 0; + switch(align) { + case LV_TEXT_ALIGN_LEFT: + pos->x = 0; + break; + case LV_TEXT_ALIGN_RIGHT: + pos->x = lv_obj_get_content_width(obj); + break; + case LV_TEXT_ALIGN_CENTER: + pos->x = lv_obj_get_content_width(obj) / 2; + break; + } + return; + } + + lv_area_t txt_coords; + lv_obj_get_content_coords(obj, &txt_coords); + + uint32_t line_start = 0; + uint32_t new_line_start = 0; + lv_coord_t max_w = lv_area_get_width(&txt_coords); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + lv_coord_t letter_height = lv_font_get_line_height(font); + lv_coord_t y = 0; + lv_text_flag_t flag = LV_TEXT_FLAG_NONE; + + if(label->recolor != 0) flag |= LV_TEXT_FLAG_RECOLOR; + if(label->expand != 0) flag |= LV_TEXT_FLAG_EXPAND; + if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT && !obj->w_layout) flag |= LV_TEXT_FLAG_FIT; + + uint32_t byte_id = _lv_txt_encoded_get_byte_id(txt, char_id); + + /*Search the line of the index letter*/; + while(txt[new_line_start] != '\0') { + new_line_start += _lv_txt_get_next_line(&txt[line_start], font, letter_space, max_w, NULL, flag); + if(byte_id < new_line_start || txt[new_line_start] == '\0') + break; /*The line of 'index' letter begins at 'line_start'*/ + + y += letter_height + line_space; + line_start = new_line_start; + } + + /*If the last character is line break then go to the next line*/ + if(byte_id > 0) { + if((txt[byte_id - 1] == '\n' || txt[byte_id - 1] == '\r') && txt[byte_id] == '\0') { + y += letter_height + line_space; + line_start = byte_id; + } + } + + const char * bidi_txt; + uint32_t visual_byte_pos; +#if LV_USE_BIDI + lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + if(base_dir == LV_BASE_DIR_AUTO) base_dir = _lv_bidi_detect_base_dir(txt); + + char * mutable_bidi_txt = NULL; + /*Handle Bidi*/ + if(new_line_start == byte_id) { + visual_byte_pos = base_dir == LV_BASE_DIR_RTL ? 0 : byte_id - line_start; + bidi_txt = &txt[line_start]; + } + else { + uint32_t line_char_id = _lv_txt_encoded_get_char_id(&txt[line_start], byte_id - line_start); + + bool is_rtl; + uint32_t visual_char_pos = _lv_bidi_get_visual_pos(&txt[line_start], &mutable_bidi_txt, new_line_start - line_start, + base_dir, line_char_id, &is_rtl); + bidi_txt = mutable_bidi_txt; + if(is_rtl) visual_char_pos++; + + visual_byte_pos = _lv_txt_encoded_get_byte_id(bidi_txt, visual_char_pos); + } +#else + bidi_txt = &txt[line_start]; + visual_byte_pos = byte_id - line_start; +#endif + + /*Calculate the x coordinate*/ + lv_coord_t x = lv_txt_get_width(bidi_txt, visual_byte_pos, font, letter_space, flag); + if(char_id != line_start) x += letter_space; + + if(align == LV_TEXT_ALIGN_CENTER) { + lv_coord_t line_w; + line_w = lv_txt_get_width(bidi_txt, new_line_start - line_start, font, letter_space, flag); + x += lv_area_get_width(&txt_coords) / 2 - line_w / 2; + + } + else if(align == LV_TEXT_ALIGN_RIGHT) { + lv_coord_t line_w; + line_w = lv_txt_get_width(bidi_txt, new_line_start - line_start, font, letter_space, flag); + + x += lv_area_get_width(&txt_coords) - line_w; + } + pos->x = x; + pos->y = y; + +#if LV_USE_BIDI + if(mutable_bidi_txt) lv_mem_buf_release(mutable_bidi_txt); +#endif +} + +uint32_t lv_label_get_letter_on(const lv_obj_t * obj, lv_point_t * pos_in) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(pos_in); + lv_label_t * label = (lv_label_t *)obj; + + lv_point_t pos; + pos.x = pos_in->x - lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + pos.y = pos_in->y - lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + + lv_area_t txt_coords; + lv_obj_get_content_coords(obj, &txt_coords); + const char * txt = lv_label_get_text(obj); + uint32_t line_start = 0; + uint32_t new_line_start = 0; + lv_coord_t max_w = lv_area_get_width(&txt_coords); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + lv_coord_t letter_height = lv_font_get_line_height(font); + lv_coord_t y = 0; + lv_text_flag_t flag = LV_TEXT_FLAG_NONE; + uint32_t logical_pos; + char * bidi_txt; + + if(label->recolor != 0) flag |= LV_TEXT_FLAG_RECOLOR; + if(label->expand != 0) flag |= LV_TEXT_FLAG_EXPAND; + if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT && !obj->w_layout) flag |= LV_TEXT_FLAG_FIT; + + lv_text_align_t align = lv_obj_calculate_style_text_align(obj, LV_PART_MAIN, label->text); + + /*Search the line of the index letter*/; + while(txt[line_start] != '\0') { + new_line_start += _lv_txt_get_next_line(&txt[line_start], font, letter_space, max_w, NULL, flag); + + if(pos.y <= y + letter_height) { + /*The line is found (stored in 'line_start')*/ + /*Include the NULL terminator in the last line*/ + uint32_t tmp = new_line_start; + uint32_t letter; + letter = _lv_txt_encoded_prev(txt, &tmp); + if(letter != '\n' && txt[new_line_start] == '\0') new_line_start++; + break; + } + y += letter_height + line_space; + + line_start = new_line_start; + } + +#if LV_USE_BIDI + bidi_txt = lv_mem_buf_get(new_line_start - line_start + 1); + uint32_t txt_len = new_line_start - line_start; + if(new_line_start > 0 && txt[new_line_start - 1] == '\0' && txt_len > 0) txt_len--; + _lv_bidi_process_paragraph(txt + line_start, bidi_txt, txt_len, lv_obj_get_style_base_dir(obj, LV_PART_MAIN), NULL, 0); +#else + bidi_txt = (char *)txt + line_start; +#endif + + /*Calculate the x coordinate*/ + lv_coord_t x = 0; + if(align == LV_TEXT_ALIGN_CENTER) { + lv_coord_t line_w; + line_w = lv_txt_get_width(bidi_txt, new_line_start - line_start, font, letter_space, flag); + x += lv_area_get_width(&txt_coords) / 2 - line_w / 2; + } + else if(align == LV_TEXT_ALIGN_RIGHT) { + lv_coord_t line_w; + line_w = lv_txt_get_width(bidi_txt, new_line_start - line_start, font, letter_space, flag); + x += lv_area_get_width(&txt_coords) - line_w; + } + + lv_text_cmd_state_t cmd_state = LV_TEXT_CMD_STATE_WAIT; + + uint32_t i = 0; + uint32_t i_act = i; + + if(new_line_start > 0) { + while(i + line_start < new_line_start) { + /*Get the current letter and the next letter for kerning*/ + /*Be careful 'i' already points to the next character*/ + uint32_t letter; + uint32_t letter_next; + _lv_txt_encoded_letter_next_2(bidi_txt, &letter, &letter_next, &i); + + /*Handle the recolor command*/ + if((flag & LV_TEXT_FLAG_RECOLOR) != 0) { + if(_lv_txt_is_cmd(&cmd_state, bidi_txt[i]) != false) { + continue; /*Skip the letter if it is part of a command*/ + } + } + + lv_coord_t gw = lv_font_get_glyph_width(font, letter, letter_next); + + /*Finish if the x position or the last char of the next line is reached*/ + if(pos.x < x + gw || i + line_start == new_line_start || txt[i_act + line_start] == '\0') { + i = i_act; + break; + } + x += gw; + x += letter_space; + i_act = i; + } + } + +#if LV_USE_BIDI + /*Handle Bidi*/ + uint32_t cid = _lv_txt_encoded_get_char_id(bidi_txt, i); + if(txt[line_start + i] == '\0') { + logical_pos = i; + } + else { + bool is_rtl; + logical_pos = _lv_bidi_get_logical_pos(&txt[line_start], NULL, + txt_len, lv_obj_get_style_base_dir(obj, LV_PART_MAIN), cid, &is_rtl); + if(is_rtl) logical_pos++; + } + lv_mem_buf_release(bidi_txt); +#else + logical_pos = _lv_txt_encoded_get_char_id(bidi_txt, i); +#endif + + return logical_pos + _lv_txt_encoded_get_char_id(txt, line_start); +} + +bool lv_label_is_char_under_pos(const lv_obj_t * obj, lv_point_t * pos) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(pos); + + lv_area_t txt_coords; + lv_obj_get_content_coords(obj, &txt_coords); + const char * txt = lv_label_get_text(obj); + lv_label_t * label = (lv_label_t *)obj; + uint32_t line_start = 0; + uint32_t new_line_start = 0; + lv_coord_t max_w = lv_area_get_width(&txt_coords); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + lv_coord_t letter_height = lv_font_get_line_height(font); + lv_text_align_t align = lv_obj_calculate_style_text_align(obj, LV_PART_MAIN, label->text); + + lv_coord_t y = 0; + lv_text_flag_t flag = LV_TEXT_FLAG_NONE; + + if(label->recolor != 0) flag |= LV_TEXT_FLAG_RECOLOR; + if(label->expand != 0) flag |= LV_TEXT_FLAG_EXPAND; + if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT && !obj->w_layout) flag |= LV_TEXT_FLAG_FIT; + + /*Search the line of the index letter*/; + while(txt[line_start] != '\0') { + new_line_start += _lv_txt_get_next_line(&txt[line_start], font, letter_space, max_w, NULL, flag); + + if(pos->y <= y + letter_height) break; /*The line is found (stored in 'line_start')*/ + y += letter_height + line_space; + + line_start = new_line_start; + } + + /*Calculate the x coordinate*/ + lv_coord_t x = 0; + lv_coord_t last_x = 0; + if(align == LV_TEXT_ALIGN_CENTER) { + lv_coord_t line_w; + line_w = lv_txt_get_width(&txt[line_start], new_line_start - line_start, font, letter_space, flag); + x += lv_area_get_width(&txt_coords) / 2 - line_w / 2; + } + else if(align == LV_TEXT_ALIGN_RIGHT) { + lv_coord_t line_w; + line_w = lv_txt_get_width(&txt[line_start], new_line_start - line_start, font, letter_space, flag); + x += lv_area_get_width(&txt_coords) - line_w; + } + + lv_text_cmd_state_t cmd_state = LV_TEXT_CMD_STATE_WAIT; + + uint32_t i = line_start; + uint32_t i_current = i; + uint32_t letter = '\0'; + uint32_t letter_next = '\0'; + + if(new_line_start > 0) { + while(i <= new_line_start - 1) { + /*Get the current letter and the next letter for kerning*/ + /*Be careful 'i' already points to the next character*/ + _lv_txt_encoded_letter_next_2(txt, &letter, &letter_next, &i); + + /*Handle the recolor command*/ + if((flag & LV_TEXT_FLAG_RECOLOR) != 0) { + if(_lv_txt_is_cmd(&cmd_state, txt[i]) != false) { + continue; /*Skip the letter if it is part of a command*/ + } + } + last_x = x; + x += lv_font_get_glyph_width(font, letter, letter_next); + if(pos->x < x) { + i = i_current; + break; + } + x += letter_space; + i_current = i; + } + } + + int32_t max_diff = lv_font_get_glyph_width(font, letter, letter_next) + letter_space + 1; + return (pos->x >= (last_x - letter_space) && pos->x <= (last_x + max_diff)); +} + +uint32_t lv_label_get_text_selection_start(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_label_t * label = (lv_label_t *)obj; + return label->sel_start; + +#else + LV_UNUSED(obj); /*Unused*/ + return LV_LABEL_TEXT_SELECTION_OFF; +#endif +} + +uint32_t lv_label_get_text_selection_end(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_label_t * label = (lv_label_t *)obj; + return label->sel_end; +#else + LV_UNUSED(obj); /*Unused*/ + return LV_LABEL_TEXT_SELECTION_OFF; +#endif +} + +/*===================== + * Other functions + *====================*/ + +void lv_label_ins_text(lv_obj_t * obj, uint32_t pos, const char * txt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(txt); + + lv_label_t * label = (lv_label_t *)obj; + + /*Can not append to static text*/ + if(label->static_txt != 0) return; + + lv_obj_invalidate(obj); + + /*Allocate space for the new text*/ + size_t old_len = strlen(label->text); + size_t ins_len = strlen(txt); + size_t new_len = ins_len + old_len; + label->text = lv_mem_realloc(label->text, new_len + 1); + LV_ASSERT_MALLOC(label->text); + if(label->text == NULL) return; + + if(pos == LV_LABEL_POS_LAST) { + pos = _lv_txt_get_encoded_length(label->text); + } + + _lv_txt_ins(label->text, pos, txt); + lv_label_set_text(obj, NULL); +} + +void lv_label_cut_text(lv_obj_t * obj, uint32_t pos, uint32_t cnt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_label_t * label = (lv_label_t *)obj; + + /*Can not append to static text*/ + if(label->static_txt != 0) return; + + lv_obj_invalidate(obj); + + char * label_txt = lv_label_get_text(obj); + /*Delete the characters*/ + _lv_txt_cut(label_txt, pos, cnt); + + /*Refresh the label*/ + lv_label_refr_text(obj); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_label_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_label_t * label = (lv_label_t *)obj; + + label->text = NULL; + label->static_txt = 0; + label->recolor = 0; + label->dot_end = LV_LABEL_DOT_END_INV; + label->long_mode = LV_LABEL_LONG_WRAP; + label->offset.x = 0; + label->offset.y = 0; + +#if LV_LABEL_LONG_TXT_HINT + label->hint.line_start = -1; + label->hint.coord_y = 0; + label->hint.y = 0; +#endif + +#if LV_LABEL_TEXT_SELECTION + label->sel_start = LV_DRAW_LABEL_NO_TXT_SEL; + label->sel_end = LV_DRAW_LABEL_NO_TXT_SEL; +#endif + label->dot.tmp_ptr = NULL; + label->dot_tmp_alloc = 0; + + lv_obj_clear_flag(obj, LV_OBJ_FLAG_CLICKABLE); + lv_label_set_long_mode(obj, LV_LABEL_LONG_WRAP); + lv_label_set_text(obj, "Text"); + + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_label_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_label_t * label = (lv_label_t *)obj; + + lv_label_dot_tmp_free(obj); + if(!label->static_txt) lv_mem_free(label->text); + label->text = NULL; +} + +static void lv_label_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_res_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RES_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + + if(code == LV_EVENT_STYLE_CHANGED) { + /*Revert dots for proper refresh*/ + lv_label_revert_dots(obj); + lv_label_refr_text(obj); + } + else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + /* Italic or other non-typical letters can be drawn of out of the object. + * It happens if box_w + ofs_x > adw_w in the glyph. + * To avoid this add some extra draw area. + * font_h / 4 is an empirical value. */ + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_coord_t font_h = lv_font_get_line_height(font); + lv_event_set_ext_draw_size(e, font_h / 4); + } + else if(code == LV_EVENT_SIZE_CHANGED) { + lv_label_revert_dots(obj); + lv_label_refr_text(obj); + } + else if(code == LV_EVENT_GET_SELF_SIZE) { + lv_point_t size; + lv_label_t * label = (lv_label_t *)obj; + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_text_flag_t flag = LV_TEXT_FLAG_NONE; + if(label->recolor != 0) flag |= LV_TEXT_FLAG_RECOLOR; + if(label->expand != 0) flag |= LV_TEXT_FLAG_EXPAND; + + lv_coord_t w = lv_obj_get_content_width(obj); + if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT && !obj->w_layout) w = LV_COORD_MAX; + else w = lv_obj_get_content_width(obj); + + lv_txt_get_size(&size, label->text, font, letter_space, line_space, w, flag); + + lv_point_t * self_size = lv_event_get_param(e); + self_size->x = LV_MAX(self_size->x, size.x); + self_size->y = LV_MAX(self_size->y, size.y); + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_main(e); + } +} + + +static void draw_main(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + lv_label_t * label = (lv_label_t *)obj; + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + + lv_area_t txt_coords; + lv_obj_get_content_coords(obj, &txt_coords); + + lv_text_flag_t flag = LV_TEXT_FLAG_NONE; + if(label->recolor != 0) flag |= LV_TEXT_FLAG_RECOLOR; + if(label->expand != 0) flag |= LV_TEXT_FLAG_EXPAND; + if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT && !obj->w_layout) flag |= LV_TEXT_FLAG_FIT; + + lv_draw_label_dsc_t label_draw_dsc; + lv_draw_label_dsc_init(&label_draw_dsc); + + label_draw_dsc.ofs_x = label->offset.x; + label_draw_dsc.ofs_y = label->offset.y; + + label_draw_dsc.flag = flag; + lv_obj_init_draw_label_dsc(obj, LV_PART_MAIN, &label_draw_dsc); + lv_bidi_calculate_align(&label_draw_dsc.align, &label_draw_dsc.bidi_dir, label->text); + + label_draw_dsc.sel_start = lv_label_get_text_selection_start(obj); + label_draw_dsc.sel_end = lv_label_get_text_selection_end(obj); + if(label_draw_dsc.sel_start != LV_DRAW_LABEL_NO_TXT_SEL && label_draw_dsc.sel_end != LV_DRAW_LABEL_NO_TXT_SEL) { + label_draw_dsc.sel_color = lv_obj_get_style_text_color_filtered(obj, LV_PART_SELECTED); + label_draw_dsc.sel_bg_color = lv_obj_get_style_bg_color(obj, LV_PART_SELECTED); + } + + /* In SCROLL and SCROLL_CIRCULAR mode the CENTER and RIGHT are pointless, so remove them. + * (In addition, they will create misalignment in this situation)*/ + if((label->long_mode == LV_LABEL_LONG_SCROLL || label->long_mode == LV_LABEL_LONG_SCROLL_CIRCULAR) && + (label_draw_dsc.align == LV_TEXT_ALIGN_CENTER || label_draw_dsc.align == LV_TEXT_ALIGN_RIGHT)) { + lv_point_t size; + lv_txt_get_size(&size, label->text, label_draw_dsc.font, label_draw_dsc.letter_space, label_draw_dsc.line_space, + LV_COORD_MAX, flag); + if(size.x > lv_area_get_width(&txt_coords)) { + label_draw_dsc.align = LV_TEXT_ALIGN_LEFT; + } + } +#if LV_LABEL_LONG_TXT_HINT + lv_draw_label_hint_t * hint = &label->hint; + if(label->long_mode == LV_LABEL_LONG_SCROLL_CIRCULAR || lv_area_get_height(&txt_coords) < LV_LABEL_HINT_HEIGHT_LIMIT) + hint = NULL; + +#else + /*Just for compatibility*/ + lv_draw_label_hint_t * hint = NULL; +#endif + + lv_area_t txt_clip; + bool is_common = _lv_area_intersect(&txt_clip, &txt_coords, draw_ctx->clip_area); + if(!is_common) return; + + if(label->long_mode == LV_LABEL_LONG_WRAP) { + lv_coord_t s = lv_obj_get_scroll_top(obj); + lv_area_move(&txt_coords, 0, -s); + txt_coords.y2 = obj->coords.y2; + } + if(label->long_mode == LV_LABEL_LONG_SCROLL || label->long_mode == LV_LABEL_LONG_SCROLL_CIRCULAR) { + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + draw_ctx->clip_area = &txt_clip; + lv_draw_label(draw_ctx, &label_draw_dsc, &txt_coords, label->text, hint); + draw_ctx->clip_area = clip_area_ori; + } + else { + lv_draw_label(draw_ctx, &label_draw_dsc, &txt_coords, label->text, hint); + } + + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + draw_ctx->clip_area = &txt_clip; + + if(label->long_mode == LV_LABEL_LONG_SCROLL_CIRCULAR) { + lv_point_t size; + lv_txt_get_size(&size, label->text, label_draw_dsc.font, label_draw_dsc.letter_space, label_draw_dsc.line_space, + LV_COORD_MAX, flag); + + /*Draw the text again on label to the original to make a circular effect */ + if(size.x > lv_area_get_width(&txt_coords)) { + label_draw_dsc.ofs_x = label->offset.x + size.x + + lv_font_get_glyph_width(label_draw_dsc.font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT; + label_draw_dsc.ofs_y = label->offset.y; + + lv_draw_label(draw_ctx, &label_draw_dsc, &txt_coords, label->text, hint); + } + + /*Draw the text again below the original to make a circular effect */ + if(size.y > lv_area_get_height(&txt_coords)) { + label_draw_dsc.ofs_x = label->offset.x; + label_draw_dsc.ofs_y = label->offset.y + size.y + lv_font_get_line_height(label_draw_dsc.font); + + lv_draw_label(draw_ctx, &label_draw_dsc, &txt_coords, label->text, hint); + } + } + + draw_ctx->clip_area = clip_area_ori; +} + +/** + * Refresh the label with its text stored in its extended data + * @param label pointer to a label object + */ +static void lv_label_refr_text(lv_obj_t * obj) +{ + lv_label_t * label = (lv_label_t *)obj; + if(label->text == NULL) return; +#if LV_LABEL_LONG_TXT_HINT + label->hint.line_start = -1; /*The hint is invalid if the text changes*/ +#endif + + lv_area_t txt_coords; + lv_obj_get_content_coords(obj, &txt_coords); + lv_coord_t max_w = lv_area_get_width(&txt_coords); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + + /*Calc. the height and longest line*/ + lv_point_t size; + lv_text_flag_t flag = LV_TEXT_FLAG_NONE; + if(label->recolor != 0) flag |= LV_TEXT_FLAG_RECOLOR; + if(label->expand != 0) flag |= LV_TEXT_FLAG_EXPAND; + if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT && !obj->w_layout) flag |= LV_TEXT_FLAG_FIT; + + lv_txt_get_size(&size, label->text, font, letter_space, line_space, max_w, flag); + + lv_obj_refresh_self_size(obj); + + /*In scroll mode start an offset animation*/ + if(label->long_mode == LV_LABEL_LONG_SCROLL) { + uint16_t anim_speed = lv_obj_get_style_anim_speed(obj, LV_PART_MAIN); + if(anim_speed == 0) anim_speed = LV_LABEL_DEF_SCROLL_SPEED; + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, obj); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + lv_anim_set_playback_delay(&a, LV_LABEL_SCROLL_DELAY); + lv_anim_set_repeat_delay(&a, a.playback_delay); + + bool hor_anim = false; + if(size.x > lv_area_get_width(&txt_coords)) { +#if LV_USE_BIDI + int32_t start, end; + lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + + if(base_dir == LV_BASE_DIR_AUTO) + base_dir = _lv_bidi_detect_base_dir(label->text); + + if(base_dir == LV_BASE_DIR_RTL) { + start = lv_area_get_width(&txt_coords) - size.x; + end = 0; + } + else { + start = 0; + end = lv_area_get_width(&txt_coords) - size.x; + } + + lv_anim_set_values(&a, start, end); +#else + lv_anim_set_values(&a, 0, lv_area_get_width(&txt_coords) - size.x); + lv_anim_set_exec_cb(&a, set_ofs_x_anim); +#endif + lv_anim_set_exec_cb(&a, set_ofs_x_anim); + + lv_anim_t * anim_cur = lv_anim_get(obj, set_ofs_x_anim); + int32_t act_time = 0; + bool playback_now = false; + if(anim_cur) { + act_time = anim_cur->act_time; + playback_now = anim_cur->playback_now; + } + if(act_time < a.time) { + a.act_time = act_time; /*To keep the old position*/ + a.early_apply = 0; + if(playback_now) { + a.playback_now = 1; + /*Swap the start and end values*/ + int32_t tmp; + tmp = a.start_value; + a.start_value = a.end_value; + a.end_value = tmp; + } + } + + lv_anim_set_time(&a, lv_anim_speed_to_time(anim_speed, a.start_value, a.end_value)); + lv_anim_set_playback_time(&a, a.time); + lv_anim_start(&a); + hor_anim = true; + } + else { + /*Delete the offset animation if not required*/ + lv_anim_del(obj, set_ofs_x_anim); + label->offset.x = 0; + } + + if(size.y > lv_area_get_height(&txt_coords) && hor_anim == false) { + lv_anim_set_values(&a, 0, lv_area_get_height(&txt_coords) - size.y - (lv_font_get_line_height(font))); + lv_anim_set_exec_cb(&a, set_ofs_y_anim); + + lv_anim_t * anim_cur = lv_anim_get(obj, set_ofs_y_anim); + int32_t act_time = 0; + bool playback_now = false; + if(anim_cur) { + act_time = anim_cur->act_time; + playback_now = anim_cur->playback_now; + } + if(act_time < a.time) { + a.act_time = act_time; /*To keep the old position*/ + a.early_apply = 0; + if(playback_now) { + a.playback_now = 1; + /*Swap the start and end values*/ + int32_t tmp; + tmp = a.start_value; + a.start_value = a.end_value; + a.end_value = tmp; + } + } + + lv_anim_set_time(&a, lv_anim_speed_to_time(anim_speed, a.start_value, a.end_value)); + lv_anim_set_playback_time(&a, a.time); + lv_anim_start(&a); + } + else { + /*Delete the offset animation if not required*/ + lv_anim_del(obj, set_ofs_y_anim); + label->offset.y = 0; + } + } + /*In roll inf. mode keep the size but start offset animations*/ + else if(label->long_mode == LV_LABEL_LONG_SCROLL_CIRCULAR) { + const lv_anim_t * anim_template = lv_obj_get_style_anim(obj, LV_PART_MAIN); + uint16_t anim_speed = lv_obj_get_style_anim_speed(obj, LV_PART_MAIN); + if(anim_speed == 0) anim_speed = LV_LABEL_DEF_SCROLL_SPEED; + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, obj); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + + bool hor_anim = false; + if(size.x > lv_area_get_width(&txt_coords)) { +#if LV_USE_BIDI + int32_t start, end; + lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + + if(base_dir == LV_BASE_DIR_AUTO) + base_dir = _lv_bidi_detect_base_dir(label->text); + + if(base_dir == LV_BASE_DIR_RTL) { + start = -size.x - lv_font_get_glyph_width(font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT; + end = 0; + } + else { + start = 0; + end = -size.x - lv_font_get_glyph_width(font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT; + } + + lv_anim_set_values(&a, start, end); +#else + lv_anim_set_values(&a, 0, -size.x - lv_font_get_glyph_width(font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT); +#endif + lv_anim_set_exec_cb(&a, set_ofs_x_anim); + lv_anim_set_time(&a, lv_anim_speed_to_time(anim_speed, a.start_value, a.end_value)); + + lv_anim_t * anim_cur = lv_anim_get(obj, set_ofs_x_anim); + int32_t act_time = anim_cur ? anim_cur->act_time : 0; + + /*If a template animation exists, consider it's start delay and repeat delay*/ + if(anim_template) { + a.act_time = anim_template->act_time; + a.repeat_delay = anim_template->repeat_delay; + } + else if(act_time < a.time) { + a.act_time = act_time; /*To keep the old position when the label text is updated mid-scrolling*/ + a.early_apply = 0; + } + + lv_anim_start(&a); + hor_anim = true; + } + else { + /*Delete the offset animation if not required*/ + lv_anim_del(obj, set_ofs_x_anim); + label->offset.x = 0; + } + + if(size.y > lv_area_get_height(&txt_coords) && hor_anim == false) { + lv_anim_set_values(&a, 0, -size.y - (lv_font_get_line_height(font))); + lv_anim_set_exec_cb(&a, set_ofs_y_anim); + lv_anim_set_time(&a, lv_anim_speed_to_time(anim_speed, a.start_value, a.end_value)); + + lv_anim_t * anim_cur = lv_anim_get(obj, set_ofs_y_anim); + int32_t act_time = anim_cur ? anim_cur->act_time : 0; + + /*If a template animation exists, consider it's start delay and repeat delay*/ + if(anim_template) { + a.act_time = anim_template->act_time; + a.repeat_delay = anim_template->repeat_delay; + } + else if(act_time < a.time) { + a.act_time = act_time; /*To keep the old position when the label text is updated mid-scrolling*/ + a.early_apply = 0; + } + + lv_anim_start(&a); + } + else { + /*Delete the offset animation if not required*/ + lv_anim_del(obj, set_ofs_y_anim); + label->offset.y = 0; + } + } + else if(label->long_mode == LV_LABEL_LONG_DOT) { + if(size.y <= lv_area_get_height(&txt_coords)) { /*No dots are required, the text is short enough*/ + label->dot_end = LV_LABEL_DOT_END_INV; + } + else if(size.y <= lv_font_get_line_height(font)) { /*No dots are required for one-line texts*/ + label->dot_end = LV_LABEL_DOT_END_INV; + } + else if(_lv_txt_get_encoded_length(label->text) <= LV_LABEL_DOT_NUM) { /*Don't turn to dots all the characters*/ + label->dot_end = LV_LABEL_DOT_END_INV; + } + else { + lv_point_t p; + lv_coord_t y_overed; + p.x = lv_area_get_width(&txt_coords) - + (lv_font_get_glyph_width(font, '.', '.') + letter_space) * + LV_LABEL_DOT_NUM; /*Shrink with dots*/ + p.y = lv_area_get_height(&txt_coords); + y_overed = p.y % + (lv_font_get_line_height(font) + line_space); /*Round down to the last line*/ + if(y_overed >= lv_font_get_line_height(font)) { + p.y -= y_overed; + p.y += lv_font_get_line_height(font); + } + else { + p.y -= y_overed; + p.y -= line_space; + } + + uint32_t letter_id = lv_label_get_letter_on(obj, &p); + + /*Be sure there is space for the dots*/ + size_t txt_len = strlen(label->text); + uint32_t byte_id = _lv_txt_encoded_get_byte_id(label->text, letter_id); + while(byte_id + LV_LABEL_DOT_NUM > txt_len) { + _lv_txt_encoded_prev(label->text, &byte_id); + letter_id--; + } + + /*Save letters under the dots and replace them with dots*/ + uint32_t byte_id_ori = byte_id; + uint32_t i; + uint8_t len = 0; + for(i = 0; i <= LV_LABEL_DOT_NUM; i++) { + len += _lv_txt_encoded_size(&label->text[byte_id]); + _lv_txt_encoded_next(label->text, &byte_id); + if(len > LV_LABEL_DOT_NUM || byte_id > txt_len) { + break; + } + } + + if(lv_label_set_dot_tmp(obj, &label->text[byte_id_ori], len)) { + for(i = 0; i < LV_LABEL_DOT_NUM; i++) { + label->text[byte_id_ori + i] = '.'; + } + label->text[byte_id_ori + LV_LABEL_DOT_NUM] = '\0'; + label->dot_end = letter_id + LV_LABEL_DOT_NUM; + } + } + } + else if(label->long_mode == LV_LABEL_LONG_CLIP) { + /*Do nothing*/ + } + + lv_obj_invalidate(obj); +} + + +static void lv_label_revert_dots(lv_obj_t * obj) +{ + + lv_label_t * label = (lv_label_t *)obj; + + if(label->long_mode != LV_LABEL_LONG_DOT) return; + if(label->dot_end == LV_LABEL_DOT_END_INV) return; + uint32_t letter_i = label->dot_end - LV_LABEL_DOT_NUM; + uint32_t byte_i = _lv_txt_encoded_get_byte_id(label->text, letter_i); + + /*Restore the characters*/ + uint8_t i = 0; + char * dot_tmp = lv_label_get_dot_tmp(obj); + while(label->text[byte_i + i] != '\0') { + label->text[byte_i + i] = dot_tmp[i]; + i++; + } + label->text[byte_i + i] = dot_tmp[i]; + lv_label_dot_tmp_free(obj); + + label->dot_end = LV_LABEL_DOT_END_INV; +} + +/** + * Store `len` characters from `data`. Allocates space if necessary. + * + * @param label pointer to label object + * @param len Number of characters to store. + * @return true on success. + */ +static bool lv_label_set_dot_tmp(lv_obj_t * obj, char * data, uint32_t len) +{ + + lv_label_t * label = (lv_label_t *)obj; + lv_label_dot_tmp_free(obj); /*Deallocate any existing space*/ + if(len > sizeof(char *)) { + /*Memory needs to be allocated. Allocates an additional byte + *for a NULL-terminator so it can be copied.*/ + label->dot.tmp_ptr = lv_mem_alloc(len + 1); + if(label->dot.tmp_ptr == NULL) { + LV_LOG_ERROR("Failed to allocate memory for dot_tmp_ptr"); + return false; + } + lv_memcpy(label->dot.tmp_ptr, data, len); + label->dot.tmp_ptr[len] = '\0'; + label->dot_tmp_alloc = true; + } + else { + /*Characters can be directly stored in object*/ + label->dot_tmp_alloc = false; + lv_memcpy(label->dot.tmp, data, len); + } + return true; +} + +/** + * Get the stored dot_tmp characters + * @param label pointer to label object + * @return char pointer to a stored characters. Is *not* necessarily NULL-terminated. + */ +static char * lv_label_get_dot_tmp(lv_obj_t * obj) +{ + lv_label_t * label = (lv_label_t *)obj; + if(label->dot_tmp_alloc) { + return label->dot.tmp_ptr; + } + else { + return label->dot.tmp; + } +} + +/** + * Free the dot_tmp_ptr field if it was previously allocated. + * Always clears the field + * @param label pointer to label object. + */ +static void lv_label_dot_tmp_free(lv_obj_t * obj) +{ + lv_label_t * label = (lv_label_t *)obj; + if(label->dot_tmp_alloc && label->dot.tmp_ptr) { + lv_mem_free(label->dot.tmp_ptr); + } + label->dot_tmp_alloc = false; + label->dot.tmp_ptr = NULL; +} + + +static void set_ofs_x_anim(void * obj, int32_t v) +{ + lv_label_t * label = (lv_label_t *)obj; + label->offset.x = v; + lv_obj_invalidate(obj); +} + +static void set_ofs_y_anim(void * obj, int32_t v) +{ + lv_label_t * label = (lv_label_t *)obj; + label->offset.y = v; + lv_obj_invalidate(obj); +} + + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_label.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_label.h new file mode 100644 index 0000000..b31a63e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_label.h @@ -0,0 +1,246 @@ +/** + * @file lv_label.h + * + */ + +#ifndef LV_LABEL_H +#define LV_LABEL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#if LV_USE_LABEL != 0 + +#include +#include "../core/lv_obj.h" +#include "../font/lv_font.h" +#include "../font/lv_symbol_def.h" +#include "../misc/lv_txt.h" +#include "../draw/lv_draw.h" + +/********************* + * DEFINES + *********************/ +#define LV_LABEL_WAIT_CHAR_COUNT 3 +#define LV_LABEL_DOT_NUM 3 +#define LV_LABEL_POS_LAST 0xFFFF +#define LV_LABEL_TEXT_SELECTION_OFF LV_DRAW_LABEL_NO_TXT_SEL + +LV_EXPORT_CONST_INT(LV_LABEL_DOT_NUM); +LV_EXPORT_CONST_INT(LV_LABEL_POS_LAST); +LV_EXPORT_CONST_INT(LV_LABEL_TEXT_SELECTION_OFF); + +/********************** + * TYPEDEFS + **********************/ + +/** Long mode behaviors. Used in 'lv_label_ext_t'*/ +enum { + LV_LABEL_LONG_WRAP, /**< Keep the object width, wrap the too long lines and expand the object height*/ + LV_LABEL_LONG_DOT, /**< Keep the size and write dots at the end if the text is too long*/ + LV_LABEL_LONG_SCROLL, /**< Keep the size and roll the text back and forth*/ + LV_LABEL_LONG_SCROLL_CIRCULAR, /**< Keep the size and roll the text circularly*/ + LV_LABEL_LONG_CLIP, /**< Keep the size and clip the text out of it*/ +}; +typedef uint8_t lv_label_long_mode_t; + +typedef struct { + lv_obj_t obj; + char * text; + union { + char * tmp_ptr; /*Pointer to the allocated memory containing the character replaced by dots*/ + char tmp[LV_LABEL_DOT_NUM + 1]; /*Directly store the characters if <=4 characters*/ + } dot; + uint32_t dot_end; /*The real text length, used in dot mode*/ + +#if LV_LABEL_LONG_TXT_HINT + lv_draw_label_hint_t hint; +#endif + +#if LV_LABEL_TEXT_SELECTION + uint32_t sel_start; + uint32_t sel_end; +#endif + + lv_point_t offset; /*Text draw position offset*/ + lv_label_long_mode_t long_mode : 3; /*Determine what to do with the long texts*/ + uint8_t static_txt : 1; /*Flag to indicate the text is static*/ + uint8_t recolor : 1; /*Enable in-line letter re-coloring*/ + uint8_t expand : 1; /*Ignore real width (used by the library with LV_LABEL_LONG_SCROLL)*/ + uint8_t dot_tmp_alloc : 1; /*1: dot is allocated, 0: dot directly holds up to 4 chars*/ +} lv_label_t; + +extern const lv_obj_class_t lv_label_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a label object + * @param parent pointer to an object, it will be the parent of the new label. + * @return pointer to the created button + */ +lv_obj_t * lv_label_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set a new text for a label. Memory will be allocated to store the text by the label. + * @param obj pointer to a label object + * @param text '\0' terminated character string. NULL to refresh with the current text. + */ +void lv_label_set_text(lv_obj_t * obj, const char * text); + +/** + * Set a new formatted text for a label. Memory will be allocated to store the text by the label. + * @param obj pointer to a label object + * @param fmt `printf`-like format + * @example lv_label_set_text_fmt(label1, "%d user", user_num); + */ +void lv_label_set_text_fmt(lv_obj_t * obj, const char * fmt, ...) LV_FORMAT_ATTRIBUTE(2, 3); + +/** + * Set a static text. It will not be saved by the label so the 'text' variable + * has to be 'alive' while the label exists. + * @param obj pointer to a label object + * @param text pointer to a text. NULL to refresh with the current text. + */ +void lv_label_set_text_static(lv_obj_t * obj, const char * text); + +/** + * Set the behavior of the label with longer text then the object size + * @param obj pointer to a label object + * @param long_mode the new mode from 'lv_label_long_mode' enum. + * In LV_LONG_WRAP/DOT/SCROLL/SCROLL_CIRC the size of the label should be set AFTER this function + */ +void lv_label_set_long_mode(lv_obj_t * obj, lv_label_long_mode_t long_mode); + +/** + * Enable the recoloring by in-line commands + * @param obj pointer to a label object + * @param en true: enable recoloring, false: disable + * @example "This is a #ff0000 red# word" + */ +void lv_label_set_recolor(lv_obj_t * obj, bool en); + +/** + * Set where text selection should start + * @param obj pointer to a label object + * @param index character index from where selection should start. `LV_LABEL_TEXT_SELECTION_OFF` for no selection + */ +void lv_label_set_text_sel_start(lv_obj_t * obj, uint32_t index); + +/** + * Set where text selection should end + * @param obj pointer to a label object + * @param index character index where selection should end. `LV_LABEL_TEXT_SELECTION_OFF` for no selection + */ +void lv_label_set_text_sel_end(lv_obj_t * obj, uint32_t index); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the text of a label + * @param obj pointer to a label object + * @return the text of the label + */ +char * lv_label_get_text(const lv_obj_t * obj); + +/** + * Get the long mode of a label + * @param obj pointer to a label object + * @return the current long mode + */ +lv_label_long_mode_t lv_label_get_long_mode(const lv_obj_t * obj); + +/** + * Get the recoloring attribute + * @param obj pointer to a label object + * @return true: recoloring is enabled, false: disable + */ +bool lv_label_get_recolor(const lv_obj_t * obj); + +/** + * Get the relative x and y coordinates of a letter + * @param obj pointer to a label object + * @param index index of the character [0 ... text length - 1]. + * Expressed in character index, not byte index (different in UTF-8) + * @param pos store the result here (E.g. index = 0 gives 0;0 coordinates if the text if aligned to the left) + */ +void lv_label_get_letter_pos(const lv_obj_t * obj, uint32_t char_id, lv_point_t * pos); + +/** + * Get the index of letter on a relative point of a label. + * @param obj pointer to label object + * @param pos pointer to point with coordinates on a the label + * @return The index of the letter on the 'pos_p' point (E.g. on 0;0 is the 0. letter if aligned to the left) + * Expressed in character index and not byte index (different in UTF-8) + */ +uint32_t lv_label_get_letter_on(const lv_obj_t * obj, lv_point_t * pos_in); + +/** + * Check if a character is drawn under a point. + * @param obj pointer to a label object + * @param pos Point to check for character under + * @return whether a character is drawn under the point + */ +bool lv_label_is_char_under_pos(const lv_obj_t * obj, lv_point_t * pos); + +/** + * @brief Get the selection start index. + * @param obj pointer to a label object. + * @return selection start index. `LV_LABEL_TEXT_SELECTION_OFF` if nothing is selected. + */ +uint32_t lv_label_get_text_selection_start(const lv_obj_t * obj); + +/** + * @brief Get the selection end index. + * @param obj pointer to a label object. + * @return selection end index. `LV_LABEL_TXT_SEL_OFF` if nothing is selected. + */ +uint32_t lv_label_get_text_selection_end(const lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +/** + * Insert a text to a label. The label text can not be static. + * @param obj pointer to a label object + * @param pos character index to insert. Expressed in character index and not byte index. + * 0: before first char. LV_LABEL_POS_LAST: after last char. + * @param txt pointer to the text to insert + */ +void lv_label_ins_text(lv_obj_t * obj, uint32_t pos, const char * txt); + +/** + * Delete characters from a label. The label text can not be static. + * @param obj pointer to a label object + * @param pos character index from where to cut. Expressed in character index and not byte index. + * 0: start in from of the first character + * @param cnt number of characters to cut + */ +void lv_label_cut_text(lv_obj_t * obj, uint32_t pos, uint32_t cnt); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_LABEL*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LABEL_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_line.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_line.c new file mode 100644 index 0000000..df32bd0 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_line.c @@ -0,0 +1,201 @@ +/** + * @file lv_line.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_line.h" + +#if LV_USE_LINE != 0 +#include "../misc/lv_assert.h" +#include "../draw/lv_draw.h" +#include "../misc/lv_math.h" +#include +#include +#include + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_line_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_line_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_line_event(const lv_obj_class_t * class_p, lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_line_class = { + .constructor_cb = lv_line_constructor, + .event_cb = lv_line_event, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_line_t), + .base_class = &lv_obj_class +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_line_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_line_set_points(lv_obj_t * obj, const lv_point_t points[], uint16_t point_num) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_line_t * line = (lv_line_t *)obj; + line->point_array = points; + line->point_num = point_num; + + lv_obj_refresh_self_size(obj); + + lv_obj_invalidate(obj); +} + +void lv_line_set_y_invert(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_line_t * line = (lv_line_t *)obj; + if(line->y_inv == en) return; + + line->y_inv = en ? 1U : 0U; + + lv_obj_invalidate(obj); +} + +/*===================== + * Getter functions + *====================*/ + +bool lv_line_get_y_invert(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_line_t * line = (lv_line_t *)obj; + + return line->y_inv == 1U; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_line_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_line_t * line = (lv_line_t *)obj; + + line->point_num = 0; + line->point_array = NULL; + line->y_inv = 0; + + lv_obj_clear_flag(obj, LV_OBJ_FLAG_CLICKABLE); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_line_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_res_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RES_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + + if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + /*The corner of the skew lines is out of the intended area*/ + lv_coord_t line_width = lv_obj_get_style_line_width(obj, LV_PART_MAIN); + lv_coord_t * s = lv_event_get_param(e); + if(*s < line_width) *s = line_width; + } + else if(code == LV_EVENT_GET_SELF_SIZE) { + lv_line_t * line = (lv_line_t *)obj; + + if(line->point_num == 0 || line->point_array == NULL) return; + + lv_point_t * p = lv_event_get_param(e); + lv_coord_t w = 0; + lv_coord_t h = 0; + + uint16_t i; + for(i = 0; i < line->point_num; i++) { + w = LV_MAX(line->point_array[i].x, w); + h = LV_MAX(line->point_array[i].y, h); + } + + lv_coord_t line_width = lv_obj_get_style_line_width(obj, LV_PART_MAIN); + w += line_width; + h += line_width; + p->x = w; + p->y = h; + } + else if(code == LV_EVENT_DRAW_MAIN) { + lv_line_t * line = (lv_line_t *)obj; + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + + if(line->point_num == 0 || line->point_array == NULL) return; + + lv_area_t area; + lv_obj_get_coords(obj, &area); + lv_coord_t x_ofs = area.x1 - lv_obj_get_scroll_x(obj); + lv_coord_t y_ofs = area.y1 - lv_obj_get_scroll_y(obj); + lv_coord_t h = lv_obj_get_height(obj); + + lv_draw_line_dsc_t line_dsc; + lv_draw_line_dsc_init(&line_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_MAIN, &line_dsc); + + /*Read all points and draw the lines*/ + uint16_t i; + for(i = 0; i < line->point_num - 1; i++) { + lv_point_t p1; + lv_point_t p2; + p1.x = line->point_array[i].x + x_ofs; + p2.x = line->point_array[i + 1].x + x_ofs; + + if(line->y_inv == 0) { + p1.y = line->point_array[i].y + y_ofs; + p2.y = line->point_array[i + 1].y + y_ofs; + } + else { + p1.y = h - line->point_array[i].y + y_ofs; + p2.y = h - line->point_array[i + 1].y + y_ofs; + } + lv_draw_line(draw_ctx, &line_dsc, &p1, &p2); + line_dsc.round_start = 0; /*Draw the rounding only on the end points after the first line*/ + } + } +} +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_line.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_line.h new file mode 100644 index 0000000..54fa248 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_line.h @@ -0,0 +1,93 @@ +/** + * @file lv_line.h + * + */ + +#ifndef LV_LINE_H +#define LV_LINE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#if LV_USE_LINE != 0 + +#include "../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of line*/ +typedef struct { + lv_obj_t obj; + const lv_point_t * point_array; /**< Pointer to an array with the points of the line*/ + uint16_t point_num; /**< Number of points in 'point_array'*/ + uint8_t y_inv : 1; /**< 1: y == 0 will be on the bottom*/ +} lv_line_t; + +extern const lv_obj_class_t lv_line_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a line object + * @param parent pointer to an object, it will be the parent of the new line + * @return pointer to the created line + */ +lv_obj_t * lv_line_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set an array of points. The line object will connect these points. + * @param obj pointer to a line object + * @param points an array of points. Only the address is saved, so the array needs to be alive while the line exists + * @param point_num number of points in 'point_a' + */ +void lv_line_set_points(lv_obj_t * obj, const lv_point_t points[], uint16_t point_num); + +/** + * Enable (or disable) the y coordinate inversion. + * If enabled then y will be subtracted from the height of the object, + * therefore the y = 0 coordinate will be on the bottom. + * @param obj pointer to a line object + * @param en true: enable the y inversion, false:disable the y inversion + */ +void lv_line_set_y_invert(lv_obj_t * obj, bool en); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the y inversion attribute + * @param obj pointer to a line object + * @return true: y inversion is enabled, false: disabled + */ +bool lv_line_get_y_invert(const lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_LINE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LINE_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_objx_templ.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_objx_templ.c new file mode 100644 index 0000000..9156546 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_objx_templ.c @@ -0,0 +1,140 @@ +/** + * @file lv_templ.c + * + */ + +/** + * TODO Remove these instructions + * Search and replace: templ -> object short name with lower case(e.g. btn, label etc) + * TEMPL -> object short name with upper case (e.g. BTN, LABEL etc.) + * + * You can remove the defined() clause from the #if statement below. This exists because + * LV_USE_TEMPL is not in lv_conf.h or lv_conf_template.h by default. + */ + +/********************* + * INCLUDES + *********************/ +//#include "lv_templ.h" /*TODO uncomment this*/ + +#if defined(LV_USE_TEMPL) && LV_USE_TEMPL != 0 + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_templ_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_templ_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_templ_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_templ_event(const lv_obj_class_t * class_p, lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_templ_class = { + .constructor_cb = lv_templ_constructor, + .destructor_cb = lv_templ_destructor, + .event_cb = lv_templ_event, + .width_def = LV_DPI_DEF, + .height_def = LV_DPI_DEF, + .instance_size = sizeof(lv_templ_t), + .group_def = LV_OBJ_CLASS_GROUP_DEF_INHERIT, + .editable = LV_OBJ_CLASS_EDITABLE_INHERIT, + .base_class = &lv_templ_class +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_templ_create(lv_obj_t * parent) +{ + + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*====================== + * Add/remove functions + *=====================*/ + +/* + * New object specific "add" or "remove" functions come here + */ + +/*===================== + * Setter functions + *====================*/ + +/* + * New object specific "set" functions come here + */ + +/*===================== + * Getter functions + *====================*/ + +/* + * New object specific "get" functions come here + */ + +/*===================== + * Other functions + *====================*/ + +/* + * New object specific "other" functions come here + */ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_templ_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_templ_t * templ = (lv_templ_t *)obj; + /*Initialize the widget's data*/ + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_templ_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + lv_templ_t * templ = (lv_templ_t *)obj; + /*Free the widget specific data*/ +} + +static void lv_templ_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_res_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RES_OK) return; + + /*Add the widget specific event handling here*/ +} + +#else /*Enable this file at the top*/ + +/*This dummy typedef exists purely to silence -Wpedantic.*/ +typedef int keep_pedantic_happy; +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_objx_templ.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_objx_templ.h new file mode 100644 index 0000000..9de5285 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_objx_templ.h @@ -0,0 +1,81 @@ +/** + * @file lv_templ.h + * + */ + +/** + * TODO Remove these instructions + * Search and replace: templ -> object short name with lower case(e.g. btn, label etc) + * TEMPL -> object short name with upper case (e.g. BTN, LABEL etc.) + * + */ + +#ifndef LV_TEMPL_H +#define LV_TEMPL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#if LV_USE_TEMPL != 0 + +#include "../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +/*Data of template*/ +typedef struct { + lv_ANCESTOR_t ancestor; /*The ancestor widget, e.g. lv_slider_t slider*/ + /*New data for this type*/ +} lv_templ_t; + +extern const lv_obj_class_t lv_templ_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a templ object + * @param parent pointer to an object, it will be the parent of the new templ + * @return pointer to the created bar + */ +lv_obj_t * lv_templ_create(lv_obj_t * parent); + +/*====================== + * Add/remove functions + *=====================*/ + +/*===================== + * Setter functions + *====================*/ + +/*===================== + * Getter functions + *====================*/ + +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TEMPL*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEMPL_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_roller.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_roller.c new file mode 100644 index 0000000..fd9b394 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_roller.c @@ -0,0 +1,786 @@ +/** + * @file lv_roller.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_roller.h" +#if LV_USE_ROLLER != 0 + +#include "../misc/lv_assert.h" +#include "../draw/lv_draw.h" +#include "../core/lv_group.h" +#include "../core/lv_indev.h" +#include "../core/lv_indev_scroll.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_roller_class +#define MY_CLASS_LABEL &lv_roller_label_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_roller_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_roller_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void lv_roller_label_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_main(lv_event_t * e); +static void draw_label(lv_event_t * e); +static void get_sel_area(lv_obj_t * obj, lv_area_t * sel_area); +static void refr_position(lv_obj_t * obj, lv_anim_enable_t animen); +static lv_res_t release_handler(lv_obj_t * obj); +static void inf_normalize(lv_obj_t * obj_scrl); +static lv_obj_t * get_label(const lv_obj_t * obj); +static lv_coord_t get_selected_label_width(const lv_obj_t * obj); +static void scroll_anim_ready_cb(lv_anim_t * a); +static void set_y_anim(void * obj, int32_t v); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_roller_class = { + .constructor_cb = lv_roller_constructor, + .event_cb = lv_roller_event, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_DPI_DEF, + .instance_size = sizeof(lv_roller_t), + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .base_class = &lv_obj_class +}; + +const lv_obj_class_t lv_roller_label_class = { + .event_cb = lv_roller_label_event, + .instance_size = sizeof(lv_label_t), + .base_class = &lv_label_class +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Create a roller object + * @param parent pointer to an object, it will be the parent of the new roller + * @return pointer to the created roller + */ +lv_obj_t * lv_roller_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the options on a roller + * @param roller pointer to roller object + * @param options a string with '\n' separated options. E.g. "One\nTwo\nThree" + * @param mode `LV_ROLLER_MODE_NORMAL` or `LV_ROLLER_MODE_INFINITE` + */ +void lv_roller_set_options(lv_obj_t * obj, const char * options, lv_roller_mode_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(options); + + lv_roller_t * roller = (lv_roller_t *)obj; + lv_obj_t * label = get_label(obj); + + roller->sel_opt_id = 0; + roller->sel_opt_id_ori = 0; + + /*Count the '\n'-s to determine the number of options*/ + roller->option_cnt = 0; + uint32_t cnt; + for(cnt = 0; options[cnt] != '\0'; cnt++) { + if(options[cnt] == '\n') roller->option_cnt++; + } + roller->option_cnt++; /*Last option has no `\n`*/ + + if(mode == LV_ROLLER_MODE_NORMAL) { + roller->mode = LV_ROLLER_MODE_NORMAL; + lv_label_set_text(label, options); + } + else { + roller->mode = LV_ROLLER_MODE_INFINITE; + + size_t opt_len = strlen(options) + 1; /*+1 to add '\n' after option lists*/ + char * opt_extra = lv_mem_buf_get(opt_len * LV_ROLLER_INF_PAGES); + uint8_t i; + for(i = 0; i < LV_ROLLER_INF_PAGES; i++) { + strcpy(&opt_extra[opt_len * i], options); + opt_extra[opt_len * (i + 1) - 1] = '\n'; + } + opt_extra[opt_len * LV_ROLLER_INF_PAGES - 1] = '\0'; + lv_label_set_text(label, opt_extra); + lv_mem_buf_release(opt_extra); + + roller->sel_opt_id = ((LV_ROLLER_INF_PAGES / 2) + 0) * roller->option_cnt; + + roller->option_cnt = roller->option_cnt * LV_ROLLER_INF_PAGES; + inf_normalize(obj); + } + + roller->sel_opt_id_ori = roller->sel_opt_id; + + /*If the selected text has larger font the label needs some extra draw padding to draw it.*/ + lv_obj_refresh_ext_draw_size(label); + +} + +/** + * Set the selected option + * @param roller pointer to a roller object + * @param sel_opt id of the selected option (0 ... number of option - 1); + * @param anim_en LV_ANIM_ON: set with animation; LV_ANOM_OFF set immediately + */ +void lv_roller_set_selected(lv_obj_t * obj, uint16_t sel_opt, lv_anim_enable_t anim) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + /*Set the value even if it's the same as the current value because + *if moving to the next option with an animation which was just deleted in the PRESS Call the ancestor's event handler + *nothing will continue the animation.*/ + + lv_roller_t * roller = (lv_roller_t *)obj; + + /*In infinite mode interpret the new ID relative to the currently visible "page"*/ + if(roller->mode == LV_ROLLER_MODE_INFINITE) { + uint32_t real_option_cnt = roller->option_cnt / LV_ROLLER_INF_PAGES; + uint16_t current_page = roller->sel_opt_id / real_option_cnt; + /*Set by the user to e.g. 0, 1, 2, 3... + *Upscale the value to the current page*/ + if(sel_opt < real_option_cnt) { + uint16_t act_opt = roller->sel_opt_id - current_page * real_option_cnt; + int32_t sel_opt_signed = sel_opt; + /*Huge jump? Probably from last to first or first to last option.*/ + if(LV_ABS((int16_t)act_opt - sel_opt) > real_option_cnt / 2) { + if(act_opt > sel_opt) sel_opt_signed += real_option_cnt; + else sel_opt_signed -= real_option_cnt; + } + sel_opt = sel_opt_signed + real_option_cnt * current_page; + } + } + + roller->sel_opt_id = sel_opt < roller->option_cnt ? sel_opt : roller->option_cnt - 1; + roller->sel_opt_id_ori = roller->sel_opt_id; + + refr_position(obj, anim); +} + +/** + * Set the height to show the given number of rows (options) + * @param roller pointer to a roller object + * @param row_cnt number of desired visible rows + */ +void lv_roller_set_visible_row_count(lv_obj_t * obj, uint8_t row_cnt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_obj_set_height(obj, (lv_font_get_line_height(font) + line_space) * row_cnt + 2 * border_width); +} + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the id of the selected option + * @param roller pointer to a roller object + * @return id of the selected option (0 ... number of option - 1); + */ +uint16_t lv_roller_get_selected(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_roller_t * roller = (lv_roller_t *)obj; + if(roller->mode == LV_ROLLER_MODE_INFINITE) { + uint16_t real_id_cnt = roller->option_cnt / LV_ROLLER_INF_PAGES; + return roller->sel_opt_id % real_id_cnt; + } + else { + return roller->sel_opt_id; + } +} + +/** + * Get the current selected option as a string + * @param ddlist pointer to ddlist object + * @param buf pointer to an array to store the string + * @param buf_size size of `buf` in bytes. 0: to ignore it. + */ +void lv_roller_get_selected_str(const lv_obj_t * obj, char * buf, uint32_t buf_size) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_roller_t * roller = (lv_roller_t *)obj; + lv_obj_t * label = get_label(obj); + uint32_t i; + uint16_t line = 0; + const char * opt_txt = lv_label_get_text(label); + size_t txt_len = strlen(opt_txt); + + for(i = 0; i < txt_len && line != roller->sel_opt_id; i++) { + if(opt_txt[i] == '\n') line++; + } + + uint32_t c; + for(c = 0; i < txt_len && opt_txt[i] != '\n'; c++, i++) { + if(buf_size && c >= buf_size - 1) { + LV_LOG_WARN("lv_dropdown_get_selected_str: the buffer was too small"); + break; + } + buf[c] = opt_txt[i]; + } + + buf[c] = '\0'; +} + + +/** + * Get the options of a roller + * @param roller pointer to roller object + * @return the options separated by '\n'-s (E.g. "Option1\nOption2\nOption3") + */ +const char * lv_roller_get_options(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return lv_label_get_text(get_label(obj)); +} + + +/** + * Get the total number of options + * @param roller pointer to a roller object + * @return the total number of options + */ +uint16_t lv_roller_get_option_cnt(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_roller_t * roller = (lv_roller_t *)obj; + if(roller->mode == LV_ROLLER_MODE_INFINITE) { + return roller->option_cnt / LV_ROLLER_INF_PAGES; + } + else { + return roller->option_cnt; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + + +static void lv_roller_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_roller_t * roller = (lv_roller_t *)obj; + + roller->mode = LV_ROLLER_MODE_NORMAL; + roller->option_cnt = 0; + roller->sel_opt_id = 0; + roller->sel_opt_id_ori = 0; + + lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_VER); + + LV_LOG_INFO("begin"); + lv_obj_t * label = lv_obj_class_create_obj(&lv_roller_label_class, obj); + lv_obj_class_init_obj(label); + lv_roller_set_options(obj, "Option 1\nOption 2\nOption 3\nOption 4\nOption 5", LV_ROLLER_MODE_NORMAL); + + LV_LOG_TRACE("finshed"); +} + +static void lv_roller_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_res_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RES_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + lv_roller_t * roller = (lv_roller_t *)obj; + + if(code == LV_EVENT_GET_SELF_SIZE) { + lv_point_t * p = lv_event_get_param(e); + p->x = get_selected_label_width(obj); + } + else if(code == LV_EVENT_STYLE_CHANGED) { + lv_obj_t * label = get_label(obj); + /*Be sure the label's style is updated before processing the roller*/ + if(label) lv_event_send(label, LV_EVENT_STYLE_CHANGED, NULL); + lv_obj_refresh_self_size(obj); + refr_position(obj, LV_ANIM_OFF); + } + else if(code == LV_EVENT_SIZE_CHANGED) { + refr_position(obj, LV_ANIM_OFF); + } + else if(code == LV_EVENT_PRESSED) { + roller->moved = 0; + lv_anim_del(get_label(obj), set_y_anim); + } + else if(code == LV_EVENT_PRESSING) { + lv_indev_t * indev = lv_indev_get_act(); + lv_point_t p; + lv_indev_get_vect(indev, &p); + if(p.y) { + lv_obj_t * label = get_label(obj); + lv_obj_set_y(label, lv_obj_get_y(label) + p.y); + roller->moved = 1; + } + } + else if(code == LV_EVENT_RELEASED || code == LV_EVENT_PRESS_LOST) { + release_handler(obj); + } + else if(code == LV_EVENT_FOCUSED) { + lv_group_t * g = lv_obj_get_group(obj); + bool editing = lv_group_get_editing(g); + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_get_act()); + + /*Encoders need special handling*/ + if(indev_type == LV_INDEV_TYPE_ENCODER) { + /*In navigate mode revert the original value*/ + if(!editing) { + if(roller->sel_opt_id != roller->sel_opt_id_ori) { + roller->sel_opt_id = roller->sel_opt_id_ori; + refr_position(obj, LV_ANIM_ON); + } + } + /*Save the current state when entered to edit mode*/ + else { + roller->sel_opt_id_ori = roller->sel_opt_id; + } + } + else { + roller->sel_opt_id_ori = roller->sel_opt_id; /*Save the current value. Used to revert this state if + ENTER won't be pressed*/ + } + } + else if(code == LV_EVENT_DEFOCUSED) { + /*Revert the original state*/ + if(roller->sel_opt_id != roller->sel_opt_id_ori) { + roller->sel_opt_id = roller->sel_opt_id_ori; + refr_position(obj, LV_ANIM_ON); + } + } + else if(code == LV_EVENT_KEY) { + char c = *((char *)lv_event_get_param(e)); + if(c == LV_KEY_RIGHT || c == LV_KEY_DOWN) { + if(roller->sel_opt_id + 1 < roller->option_cnt) { + uint16_t ori_id = roller->sel_opt_id_ori; /*lv_roller_set_selected will overwrite this*/ + lv_roller_set_selected(obj, roller->sel_opt_id + 1, LV_ANIM_ON); + roller->sel_opt_id_ori = ori_id; + } + } + else if(c == LV_KEY_LEFT || c == LV_KEY_UP) { + if(roller->sel_opt_id > 0) { + uint16_t ori_id = roller->sel_opt_id_ori; /*lv_roller_set_selected will overwrite this*/ + + lv_roller_set_selected(obj, roller->sel_opt_id - 1, LV_ANIM_ON); + roller->sel_opt_id_ori = ori_id; + } + } + } + else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + lv_obj_t * label = get_label(obj); + lv_obj_refresh_ext_draw_size(label); + } + else if(code == LV_EVENT_DRAW_MAIN || code == LV_EVENT_DRAW_POST) { + draw_main(e); + } +} + +static void lv_roller_label_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_res_t res; + + lv_event_code_t code = lv_event_get_code(e); + /*LV_EVENT_DRAW_MAIN will be called in the draw function*/ + if(code != LV_EVENT_DRAW_MAIN) { + /* Call the ancestor's event handler */ + res = lv_obj_event_base(MY_CLASS_LABEL, e); + if(res != LV_RES_OK) return; + } + + lv_obj_t * label = lv_event_get_target(e); + if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + /*If the selected text has a larger font it needs some extra space to draw it*/ + lv_coord_t * s = lv_event_get_param(e); + lv_obj_t * obj = lv_obj_get_parent(label); + lv_coord_t sel_w = get_selected_label_width(obj); + lv_coord_t label_w = lv_obj_get_width(label); + *s = LV_MAX(*s, sel_w - label_w); + } + else if(code == LV_EVENT_SIZE_CHANGED) { + refr_position(lv_obj_get_parent(label), LV_ANIM_OFF); + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_label(e); + } +} + + +static void draw_main(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + if(code == LV_EVENT_DRAW_MAIN) { + /*Draw the selected rectangle*/ + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + lv_area_t sel_area; + get_sel_area(obj, &sel_area); + lv_draw_rect_dsc_t sel_dsc; + lv_draw_rect_dsc_init(&sel_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_SELECTED, &sel_dsc); + lv_draw_rect(draw_ctx, &sel_dsc, &sel_area); + } + /*Post draw when the children are drawn*/ + else if(code == LV_EVENT_DRAW_POST) { + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + lv_obj_init_draw_label_dsc(obj, LV_PART_SELECTED, &label_dsc); + + /*Redraw the text on the selected area*/ + lv_area_t sel_area; + get_sel_area(obj, &sel_area); + lv_area_t mask_sel; + bool area_ok; + area_ok = _lv_area_intersect(&mask_sel, draw_ctx->clip_area, &sel_area); + if(area_ok) { + lv_obj_t * label = get_label(obj); + + /*Get the size of the "selected text"*/ + lv_point_t res_p; + lv_txt_get_size(&res_p, lv_label_get_text(label), label_dsc.font, label_dsc.letter_space, label_dsc.line_space, + lv_obj_get_width(obj), LV_TEXT_FLAG_EXPAND); + + /*Move the selected label proportionally with the background label*/ + lv_coord_t roller_h = lv_obj_get_height(obj); + int32_t label_y_prop = label->coords.y1 - (roller_h / 2 + + obj->coords.y1); /*label offset from the middle line of the roller*/ + label_y_prop = (label_y_prop * 16384) / lv_obj_get_height( + label); /*Proportional position from the middle line (upscaled by << 14)*/ + + /*Apply a correction with different line heights*/ + const lv_font_t * normal_label_font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_coord_t corr = (label_dsc.font->line_height - normal_label_font->line_height) / 2; + + /*Apply the proportional position to the selected text*/ + res_p.y -= corr; + int32_t label_sel_y = roller_h / 2 + obj->coords.y1; + label_sel_y += (label_y_prop * res_p.y) >> 14; + label_sel_y -= corr; + + lv_coord_t bwidth = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_coord_t pleft = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + lv_coord_t pright = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + + /*Draw the selected text*/ + lv_area_t label_sel_area; + label_sel_area.x1 = obj->coords.x1 + pleft + bwidth; + label_sel_area.y1 = label_sel_y; + label_sel_area.x2 = obj->coords.x2 - pright - bwidth; + label_sel_area.y2 = label_sel_area.y1 + res_p.y; + + label_dsc.flag |= LV_TEXT_FLAG_EXPAND; + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + draw_ctx->clip_area = &mask_sel; + lv_draw_label(draw_ctx, &label_dsc, &label_sel_area, lv_label_get_text(label), NULL); + draw_ctx->clip_area = clip_area_ori; + } + } +} + +static void draw_label(lv_event_t * e) +{ + /* Split the drawing of the label into an upper (above the selected area) + * and a lower (below the selected area)*/ + lv_obj_t * label_obj = lv_event_get_target(e); + lv_obj_t * roller = lv_obj_get_parent(label_obj); + lv_draw_label_dsc_t label_draw_dsc; + lv_draw_label_dsc_init(&label_draw_dsc); + lv_obj_init_draw_label_dsc(roller, LV_PART_MAIN, &label_draw_dsc); + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + + /*If the roller has shadow or outline it has some ext. draw size + *therefore the label can overflow the roller's boundaries. + *To solve this limit the clip area to the "plain" roller.*/ + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + lv_area_t roller_clip_area; + if(!_lv_area_intersect(&roller_clip_area, draw_ctx->clip_area, &roller->coords)) return; + draw_ctx->clip_area = &roller_clip_area; + + lv_area_t sel_area; + get_sel_area(roller, &sel_area); + + lv_area_t clip2; + clip2.x1 = label_obj->coords.x1; + clip2.y1 = label_obj->coords.y1; + clip2.x2 = label_obj->coords.x2; + clip2.y2 = sel_area.y1; + if(_lv_area_intersect(&clip2, draw_ctx->clip_area, &clip2)) { + const lv_area_t * clip_area_ori2 = draw_ctx->clip_area; + draw_ctx->clip_area = &clip2; + lv_draw_label(draw_ctx, &label_draw_dsc, &label_obj->coords, lv_label_get_text(label_obj), NULL); + draw_ctx->clip_area = clip_area_ori2; + } + + clip2.x1 = label_obj->coords.x1; + clip2.y1 = sel_area.y2; + clip2.x2 = label_obj->coords.x2; + clip2.y2 = label_obj->coords.y2; + if(_lv_area_intersect(&clip2, draw_ctx->clip_area, &clip2)) { + const lv_area_t * clip_area_ori2 = draw_ctx->clip_area; + draw_ctx->clip_area = &clip2; + lv_draw_label(draw_ctx, &label_draw_dsc, &label_obj->coords, lv_label_get_text(label_obj), NULL); + draw_ctx->clip_area = clip_area_ori2; + } + + draw_ctx->clip_area = clip_area_ori; +} + +static void get_sel_area(lv_obj_t * obj, lv_area_t * sel_area) +{ + + const lv_font_t * font_main = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + const lv_font_t * font_sel = lv_obj_get_style_text_font(obj, LV_PART_SELECTED); + lv_coord_t font_main_h = lv_font_get_line_height(font_main); + lv_coord_t font_sel_h = lv_font_get_line_height(font_sel); + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_coord_t d = (font_sel_h + font_main_h) / 2 + line_space; + sel_area->y1 = obj->coords.y1 + lv_obj_get_height(obj) / 2 - d / 2; + sel_area->y2 = sel_area->y1 + d; + lv_area_t roller_coords; + lv_obj_get_coords(obj, &roller_coords); + + sel_area->x1 = roller_coords.x1; + sel_area->x2 = roller_coords.x2; + +} + +/** + * Refresh the position of the roller. It uses the id stored in: roller->ddlist.selected_option_id + * @param roller pointer to a roller object + * @param anim_en LV_ANIM_ON: refresh with animation; LV_ANOM_OFF: without animation + */ +static void refr_position(lv_obj_t * obj, lv_anim_enable_t anim_en) +{ + lv_obj_t * label = get_label(obj); + if(label == NULL) return; + + lv_text_align_t align = lv_obj_calculate_style_text_align(label, LV_PART_MAIN, lv_label_get_text(label)); + + switch(align) { + case LV_TEXT_ALIGN_CENTER: + lv_obj_set_x(label, (lv_obj_get_content_width(obj) - lv_obj_get_width(label)) / 2); + break; + case LV_TEXT_ALIGN_RIGHT: + lv_obj_set_x(label, lv_obj_get_content_width(obj) - lv_obj_get_width(label)); + break; + case LV_TEXT_ALIGN_LEFT: + lv_obj_set_x(label, 0); + break; + } + + lv_roller_t * roller = (lv_roller_t *)obj; + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_coord_t font_h = lv_font_get_line_height(font); + lv_coord_t h = lv_obj_get_content_height(obj); + uint16_t anim_time = lv_obj_get_style_anim_time(obj, LV_PART_MAIN); + + /*Normally the animation's `end_cb` sets correct position of the roller if infinite. + *But without animations do it manually*/ + if(anim_en == LV_ANIM_OFF || anim_time == 0) { + inf_normalize(obj); + } + + int32_t id = roller->sel_opt_id; + lv_coord_t sel_y1 = id * (font_h + line_space); + lv_coord_t mid_y1 = h / 2 - font_h / 2; + + lv_coord_t new_y = mid_y1 - sel_y1; + + if(anim_en == LV_ANIM_OFF || anim_time == 0) { + lv_anim_del(label, set_y_anim); + lv_obj_set_y(label, new_y); + } + else { + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, label); + lv_anim_set_exec_cb(&a, set_y_anim); + lv_anim_set_values(&a, lv_obj_get_y(label), new_y); + lv_anim_set_time(&a, anim_time); + lv_anim_set_ready_cb(&a, scroll_anim_ready_cb); + lv_anim_set_path_cb(&a, lv_anim_path_ease_out); + lv_anim_start(&a); + } +} + +static lv_res_t release_handler(lv_obj_t * obj) +{ + lv_obj_t * label = get_label(obj); + if(label == NULL) return LV_RES_OK; + + lv_indev_t * indev = lv_indev_get_act(); + lv_roller_t * roller = (lv_roller_t *)obj; + + /*Leave edit mode once a new option is selected*/ + lv_indev_type_t indev_type = lv_indev_get_type(indev); + if(indev_type == LV_INDEV_TYPE_ENCODER || indev_type == LV_INDEV_TYPE_KEYPAD) { + roller->sel_opt_id_ori = roller->sel_opt_id; + + if(indev_type == LV_INDEV_TYPE_ENCODER) { + lv_group_t * g = lv_obj_get_group(obj); + if(lv_group_get_editing(g)) { + lv_group_set_editing(g, false); + } + } + } + + if(lv_indev_get_type(indev) == LV_INDEV_TYPE_POINTER || lv_indev_get_type(indev) == LV_INDEV_TYPE_BUTTON) { + /*Search the clicked option (For KEYPAD and ENCODER the new value should be already set)*/ + int16_t new_opt = -1; + if(roller->moved == 0) { + new_opt = 0; + lv_point_t p; + lv_indev_get_point(indev, &p); + p.y -= label->coords.y1; + p.x -= label->coords.x1; + uint32_t letter_i; + letter_i = lv_label_get_letter_on(label, &p); + + const char * txt = lv_label_get_text(label); + uint32_t i = 0; + uint32_t i_prev = 0; + + uint32_t letter_cnt = 0; + for(letter_cnt = 0; letter_cnt < letter_i; letter_cnt++) { + uint32_t letter = _lv_txt_encoded_next(txt, &i); + /*Count he lines to reach the clicked letter. But ignore the last '\n' because it + * still belongs to the clicked line*/ + if(letter == '\n' && i_prev != letter_i) new_opt++; + i_prev = i; + } + } + else { + /*If dragged then align the list to have an element in the middle*/ + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_coord_t font_h = lv_font_get_line_height(font); + + lv_coord_t label_unit = font_h + line_space; + lv_coord_t mid = obj->coords.y1 + (obj->coords.y2 - obj->coords.y1) / 2; + lv_coord_t label_y1 = label->coords.y1 + lv_indev_scroll_throw_predict(indev, LV_DIR_VER); + int32_t id = (mid - label_y1) / label_unit; + + if(id < 0) id = 0; + if(id >= roller->option_cnt) id = roller->option_cnt - 1; + + new_opt = id; + } + + if(new_opt >= 0) { + lv_roller_set_selected(obj, new_opt, LV_ANIM_ON); + } + } + + uint32_t id = roller->sel_opt_id; /*Just to use uint32_t in event data*/ + lv_res_t res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, &id); + return res; +} + +/** + * Set the middle page for the roller if infinite is enabled + * @param roller pointer to a roller object + */ +static void inf_normalize(lv_obj_t * obj) +{ + lv_roller_t * roller = (lv_roller_t *)obj; + + if(roller->mode == LV_ROLLER_MODE_INFINITE) { + uint16_t real_id_cnt = roller->option_cnt / LV_ROLLER_INF_PAGES; + roller->sel_opt_id = roller->sel_opt_id % real_id_cnt; + roller->sel_opt_id += (LV_ROLLER_INF_PAGES / 2) * real_id_cnt; /*Select the middle page*/ + + roller->sel_opt_id_ori = roller->sel_opt_id % real_id_cnt; + roller->sel_opt_id_ori += (LV_ROLLER_INF_PAGES / 2) * real_id_cnt; /*Select the middle page*/ + + /*Move to the new id*/ + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_coord_t font_h = lv_font_get_line_height(font); + lv_coord_t h = lv_obj_get_content_height(obj); + + lv_obj_t * label = get_label(obj); + + + lv_coord_t sel_y1 = roller->sel_opt_id * (font_h + line_space); + lv_coord_t mid_y1 = h / 2 - font_h / 2; + lv_coord_t new_y = mid_y1 - sel_y1; + lv_obj_set_y(label, new_y); + } +} + +static lv_obj_t * get_label(const lv_obj_t * obj) +{ + return lv_obj_get_child(obj, 0); +} + + +static lv_coord_t get_selected_label_width(const lv_obj_t * obj) +{ + lv_obj_t * label = get_label(obj); + if(label == NULL) return 0; + + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_SELECTED); + lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_SELECTED); + const char * txt = lv_label_get_text(label); + lv_point_t size; + lv_txt_get_size(&size, txt, font, letter_space, 0, LV_COORD_MAX, LV_TEXT_FLAG_NONE); + return size.x; +} + +static void scroll_anim_ready_cb(lv_anim_t * a) +{ + lv_obj_t * obj = lv_obj_get_parent(a->var); /*The label is animated*/ + inf_normalize(obj); +} + + +static void set_y_anim(void * obj, int32_t v) +{ + lv_obj_set_y(obj, v); +} + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_roller.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_roller.h new file mode 100644 index 0000000..14411de --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_roller.h @@ -0,0 +1,138 @@ +/** + * @file lv_roller.h + * + */ + +#ifndef LV_ROLLER_H +#define LV_ROLLER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#if LV_USE_ROLLER != 0 + +/*Testing of dependencies*/ +#if LV_USE_LABEL == 0 +#error "lv_roller: lv_label is required. Enable it in lv_conf.h (LV_USE_ROLLER 1)" +#endif + +#include "../core/lv_obj.h" +#include "lv_label.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** Roller mode.*/ +enum { + LV_ROLLER_MODE_NORMAL, /**< Normal mode (roller ends at the end of the options).*/ + LV_ROLLER_MODE_INFINITE, /**< Infinite mode (roller can be scrolled forever).*/ +}; + +typedef uint8_t lv_roller_mode_t; + +typedef struct { + lv_obj_t obj; + uint16_t option_cnt; /**< Number of options*/ + uint16_t sel_opt_id; /**< Index of the current option*/ + uint16_t sel_opt_id_ori; /**< Store the original index on focus*/ + lv_roller_mode_t mode : 1; + uint32_t moved : 1; +} lv_roller_t; + +extern const lv_obj_class_t lv_roller_class; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a roller object + * @param parent pointer to an object, it will be the parent of the new roller. + * @return pointer to the created roller + */ +lv_obj_t * lv_roller_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the options on a roller + * @param obj pointer to roller object + * @param options a string with '\n' separated options. E.g. "One\nTwo\nThree" + * @param mode `LV_ROLLER_MODE_NORMAL` or `LV_ROLLER_MODE_INFINITE` + */ +void lv_roller_set_options(lv_obj_t * obj, const char * options, lv_roller_mode_t mode); + +/** + * Set the selected option + * @param obj pointer to a roller object + * @param sel_opt index of the selected option (0 ... number of option - 1); + * @param anim_en LV_ANIM_ON: set with animation; LV_ANOM_OFF set immediately + */ +void lv_roller_set_selected(lv_obj_t * obj, uint16_t sel_opt, lv_anim_enable_t anim); + +/** + * Set the height to show the given number of rows (options) + * @param obj pointer to a roller object + * @param row_cnt number of desired visible rows + */ +void lv_roller_set_visible_row_count(lv_obj_t * obj, uint8_t row_cnt); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the index of the selected option + * @param obj pointer to a roller object + * @return index of the selected option (0 ... number of option - 1); + */ +uint16_t lv_roller_get_selected(const lv_obj_t * obj); + +/** + * Get the current selected option as a string. + * @param obj pointer to ddlist object + * @param buf pointer to an array to store the string + * @param buf_size size of `buf` in bytes. 0: to ignore it. + */ +void lv_roller_get_selected_str(const lv_obj_t * obj, char * buf, uint32_t buf_size); + + +/** + * Get the options of a roller + * @param obj pointer to roller object + * @return the options separated by '\n'-s (E.g. "Option1\nOption2\nOption3") + */ +const char * lv_roller_get_options(const lv_obj_t * obj); + +/** + * Get the total number of options + * @param obj pointer to a roller object + * @return the total number of options + */ +uint16_t lv_roller_get_option_cnt(const lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_ROLLER*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ROLLER_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_slider.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_slider.c new file mode 100644 index 0000000..3f85efc --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_slider.c @@ -0,0 +1,443 @@ +/** + * @file lv_slider.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_slider.h" +#if LV_USE_SLIDER != 0 + +#include "../misc/lv_assert.h" +#include "../core/lv_group.h" +#include "../core/lv_indev.h" +#include "../draw/lv_draw.h" +#include "../misc/lv_math.h" +#include "../core/lv_disp.h" +#include "lv_img.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_slider_class + +#define LV_SLIDER_KNOB_COORD(is_rtl, area) (is_rtl ? area.x1 : area.x2) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_slider_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_slider_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void position_knob(lv_obj_t * obj, lv_area_t * knob_area, const lv_coord_t knob_size, const bool hor); +static void draw_knob(lv_event_t * e); +static bool is_slider_horizontal(lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_slider_class = { + .constructor_cb = lv_slider_constructor, + .event_cb = lv_slider_event, + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .instance_size = sizeof(lv_slider_t), + .base_class = &lv_bar_class +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_slider_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +bool lv_slider_is_dragged(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_slider_t * slider = (lv_slider_t *)obj; + + return slider->dragging ? true : false; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_slider_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_slider_t * slider = (lv_slider_t *)obj; + + /*Initialize the allocated 'slider'*/ + slider->value_to_set = NULL; + slider->dragging = 0U; + slider->left_knob_focus = 0U; + + lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN); + lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_set_ext_click_area(obj, LV_DPX(8)); +} + +static void lv_slider_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_res_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RES_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + lv_slider_t * slider = (lv_slider_t *)obj; + lv_slider_mode_t type = lv_slider_get_mode(obj); + + /*Advanced hit testing: react only on dragging the knob(s)*/ + if(code == LV_EVENT_HIT_TEST) { + lv_hit_test_info_t * info = lv_event_get_param(e); + lv_coord_t ext_click_area = obj->spec_attr ? obj->spec_attr->ext_click_pad : 0; + + /*Ordinary slider: was the knob area hit?*/ + lv_area_t a; + lv_area_copy(&a, &slider->right_knob_area); + lv_area_increase(&a, ext_click_area, ext_click_area); + info->res = _lv_area_is_point_on(&a, info->point, 0); + + /*There's still a chance that there is a hit if there is another knob*/ + if((info->res == false) && (type == LV_SLIDER_MODE_RANGE)) { + lv_area_copy(&a, &slider->left_knob_area); + lv_area_increase(&a, ext_click_area, ext_click_area); + info->res = _lv_area_is_point_on(&a, info->point, 0); + } + } + else if(code == LV_EVENT_PRESSED) { + lv_obj_invalidate(obj); + + lv_point_t p; + slider->dragging = true; + if(type == LV_SLIDER_MODE_NORMAL || type == LV_SLIDER_MODE_SYMMETRICAL) { + slider->value_to_set = &slider->bar.cur_value; + } + else if(type == LV_SLIDER_MODE_RANGE) { + lv_indev_get_point(lv_indev_get_act(), &p); + bool hor = lv_obj_get_width(obj) >= lv_obj_get_height(obj); + lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + + lv_coord_t dist_left, dist_right; + if(hor) { + if((base_dir != LV_BASE_DIR_RTL && p.x > slider->right_knob_area.x2) || (base_dir == LV_BASE_DIR_RTL && + p.x < slider->right_knob_area.x1)) { + slider->value_to_set = &slider->bar.cur_value; + } + else if((base_dir != LV_BASE_DIR_RTL && p.x < slider->left_knob_area.x1) || (base_dir == LV_BASE_DIR_RTL && + p.x > slider->left_knob_area.x2)) { + slider->value_to_set = &slider->bar.start_value; + } + else { + /*Calculate the distance from each knob*/ + dist_left = LV_ABS((slider->left_knob_area.x1 + (slider->left_knob_area.x2 - slider->left_knob_area.x1) / 2) - p.x); + dist_right = LV_ABS((slider->right_knob_area.x1 + (slider->right_knob_area.x2 - slider->right_knob_area.x1) / 2) - p.x); + + /*Use whichever one is closer*/ + if(dist_right < dist_left) { + slider->value_to_set = &slider->bar.cur_value; + slider->left_knob_focus = 0; + } + else { + slider->value_to_set = &slider->bar.start_value; + slider->left_knob_focus = 1; + } + } + } + else { + if(p.y < slider->right_knob_area.y1) { + slider->value_to_set = &slider->bar.cur_value; + } + else if(p.y > slider->left_knob_area.y2) { + slider->value_to_set = &slider->bar.start_value; + } + else { + /*Calculate the distance from each knob*/ + dist_left = LV_ABS((slider->left_knob_area.y1 + (slider->left_knob_area.y2 - slider->left_knob_area.y1) / 2) - p.y); + dist_right = LV_ABS((slider->right_knob_area.y1 + (slider->right_knob_area.y2 - slider->right_knob_area.y1) / 2) - p.y); + + /*Use whichever one is closer*/ + if(dist_right < dist_left) { + slider->value_to_set = &slider->bar.cur_value; + slider->left_knob_focus = 0; + } + else { + slider->value_to_set = &slider->bar.start_value; + slider->left_knob_focus = 1; + } + } + } + } + } + else if(code == LV_EVENT_PRESSING && slider->value_to_set != NULL) { + lv_indev_t * indev = lv_indev_get_act(); + if(lv_indev_get_type(indev) != LV_INDEV_TYPE_POINTER) return; + + lv_point_t p; + lv_indev_get_point(indev, &p); + int32_t new_value = 0; + + const int32_t range = slider->bar.max_value - slider->bar.min_value; + if(is_slider_horizontal(obj)) { + const lv_coord_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + const lv_coord_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + const lv_coord_t w = lv_obj_get_width(obj); + const lv_coord_t indic_w = w - bg_left - bg_right; + + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL) { + /*Make the point relative to the indicator*/ + new_value = (obj->coords.x2 - bg_right) - p.x; + } + else { + /*Make the point relative to the indicator*/ + new_value = p.x - (obj->coords.x1 + bg_left); + } + new_value = (new_value * range + indic_w / 2) / indic_w; + new_value += slider->bar.min_value; + } + else { + const lv_coord_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + const lv_coord_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + const lv_coord_t h = lv_obj_get_height(obj); + const lv_coord_t indic_h = h - bg_bottom - bg_top; + + /*Make the point relative to the indicator*/ + new_value = p.y - (obj->coords.y2 + bg_bottom); + new_value = (-new_value * range + indic_h / 2) / indic_h; + new_value += slider->bar.min_value; + } + + int32_t real_max_value = slider->bar.max_value; + int32_t real_min_value = slider->bar.min_value; + /*Figure out the min. and max. for this mode*/ + if(slider->value_to_set == &slider->bar.start_value) { + real_max_value = slider->bar.cur_value; + } + else { + real_min_value = slider->bar.start_value; + } + + new_value = LV_CLAMP(real_min_value, new_value, real_max_value); + if(*slider->value_to_set != new_value) { + *slider->value_to_set = new_value; + lv_obj_invalidate(obj); + res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RES_OK) return; + } + + } + else if(code == LV_EVENT_RELEASED || code == LV_EVENT_PRESS_LOST) { + slider->dragging = false; + slider->value_to_set = NULL; + + lv_obj_invalidate(obj); + + /*Leave edit mode if released. (No need to wait for LONG_PRESS)*/ + lv_group_t * g = lv_obj_get_group(obj); + bool editing = lv_group_get_editing(g); + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_get_act()); + if(indev_type == LV_INDEV_TYPE_ENCODER) { + if(editing) { + if(lv_slider_get_mode(obj) == LV_SLIDER_MODE_RANGE) { + if(slider->left_knob_focus == 0) slider->left_knob_focus = 1; + else { + slider->left_knob_focus = 0; + lv_group_set_editing(g, false); + } + } + else { + lv_group_set_editing(g, false); + } + } + } + + } + else if(code == LV_EVENT_FOCUSED) { + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_get_act()); + if(indev_type == LV_INDEV_TYPE_ENCODER || indev_type == LV_INDEV_TYPE_KEYPAD) { + slider->left_knob_focus = 0; + } + } + else if(code == LV_EVENT_SIZE_CHANGED) { + lv_obj_refresh_ext_draw_size(obj); + } + else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + lv_coord_t knob_left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); + lv_coord_t knob_right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); + lv_coord_t knob_top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); + lv_coord_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); + + /*The smaller size is the knob diameter*/ + lv_coord_t zoom = lv_obj_get_style_transform_zoom(obj, LV_PART_KNOB); + lv_coord_t trans_w = lv_obj_get_style_transform_width(obj, LV_PART_KNOB); + lv_coord_t trans_h = lv_obj_get_style_transform_height(obj, LV_PART_KNOB); + lv_coord_t knob_size = LV_MIN(lv_obj_get_width(obj) + 2 * trans_w, lv_obj_get_height(obj) + 2 * trans_h) >> 1; + knob_size = (knob_size * zoom) >> 8; + knob_size += LV_MAX(LV_MAX(knob_left, knob_right), LV_MAX(knob_bottom, knob_top)); + knob_size += 2; /*For rounding error*/ + knob_size += lv_obj_calculate_ext_draw_size(obj, LV_PART_KNOB); + + /*Indic. size is handled by bar*/ + lv_coord_t * s = lv_event_get_param(e); + *s = LV_MAX(*s, knob_size); + + } + else if(code == LV_EVENT_KEY) { + char c = *((char *)lv_event_get_param(e)); + + if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { + if(!slider->left_knob_focus) lv_slider_set_value(obj, lv_slider_get_value(obj) + 1, LV_ANIM_ON); + else lv_slider_set_left_value(obj, lv_slider_get_left_value(obj) + 1, LV_ANIM_ON); + } + else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { + if(!slider->left_knob_focus) lv_slider_set_value(obj, lv_slider_get_value(obj) - 1, LV_ANIM_ON); + else lv_slider_set_left_value(obj, lv_slider_get_left_value(obj) - 1, LV_ANIM_ON); + } + else { + return; + } + + res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RES_OK) return; + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_knob(e); + } +} + +static void draw_knob(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + lv_slider_t * slider = (lv_slider_t *)obj; + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + + const bool is_rtl = LV_BASE_DIR_RTL == lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + const bool is_horizontal = is_slider_horizontal(obj); + + lv_area_t knob_area; + lv_coord_t knob_size; + bool is_symmetrical = false; + if(slider->bar.mode == LV_BAR_MODE_SYMMETRICAL && slider->bar.min_value < 0 && + slider->bar.max_value > 0) is_symmetrical = true; + + if(is_horizontal) { + knob_size = lv_obj_get_height(obj); + if(is_symmetrical && slider->bar.cur_value < 0) knob_area.x1 = slider->bar.indic_area.x1; + else knob_area.x1 = LV_SLIDER_KNOB_COORD(is_rtl, slider->bar.indic_area); + } + else { + knob_size = lv_obj_get_width(obj); + if(is_symmetrical && slider->bar.cur_value < 0) knob_area.y1 = slider->bar.indic_area.y2; + else knob_area.y1 = slider->bar.indic_area.y1; + } + + lv_draw_rect_dsc_t knob_rect_dsc; + lv_draw_rect_dsc_init(&knob_rect_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_KNOB, &knob_rect_dsc); + /* Update knob area with knob style */ + position_knob(obj, &knob_area, knob_size, is_horizontal); + /* Update right knob area with calculated knob area */ + lv_area_copy(&slider->right_knob_area, &knob_area); + + lv_obj_draw_part_dsc_t part_draw_dsc; + lv_obj_draw_dsc_init(&part_draw_dsc, draw_ctx); + part_draw_dsc.part = LV_PART_KNOB; + part_draw_dsc.class_p = MY_CLASS; + part_draw_dsc.type = LV_SLIDER_DRAW_PART_KNOB; + part_draw_dsc.id = 0; + part_draw_dsc.draw_area = &slider->right_knob_area; + part_draw_dsc.rect_dsc = &knob_rect_dsc; + + if(lv_slider_get_mode(obj) != LV_SLIDER_MODE_RANGE) { + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + lv_draw_rect(draw_ctx, &knob_rect_dsc, &slider->right_knob_area); + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + } + else { + /*Save the draw part_draw_dsc. because it can be modified in the event*/ + lv_draw_rect_dsc_t knob_rect_dsc_tmp; + lv_memcpy(&knob_rect_dsc_tmp, &knob_rect_dsc, sizeof(lv_draw_rect_dsc_t)); + /* Draw the right knob */ + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + lv_draw_rect(draw_ctx, &knob_rect_dsc, &slider->right_knob_area); + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + + /*Calculate the second knob area*/ + if(is_horizontal) { + /*use !is_rtl to get the other knob*/ + knob_area.x1 = LV_SLIDER_KNOB_COORD(!is_rtl, slider->bar.indic_area); + } + else { + knob_area.y1 = slider->bar.indic_area.y2; + } + position_knob(obj, &knob_area, knob_size, is_horizontal); + lv_area_copy(&slider->left_knob_area, &knob_area); + + lv_memcpy(&knob_rect_dsc, &knob_rect_dsc_tmp, sizeof(lv_draw_rect_dsc_t)); + part_draw_dsc.type = LV_SLIDER_DRAW_PART_KNOB_LEFT; + part_draw_dsc.draw_area = &slider->left_knob_area; + part_draw_dsc.rect_dsc = &knob_rect_dsc; + part_draw_dsc.id = 1; + + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + lv_draw_rect(draw_ctx, &knob_rect_dsc, &slider->left_knob_area); + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + } +} + +static void position_knob(lv_obj_t * obj, lv_area_t * knob_area, const lv_coord_t knob_size, const bool hor) +{ + if(hor) { + knob_area->x1 -= (knob_size >> 1); + knob_area->x2 = knob_area->x1 + knob_size - 1; + knob_area->y1 = obj->coords.y1; + knob_area->y2 = obj->coords.y2; + } + else { + knob_area->y1 -= (knob_size >> 1); + knob_area->y2 = knob_area->y1 + knob_size - 1; + knob_area->x1 = obj->coords.x1; + knob_area->x2 = obj->coords.x2; + } + + lv_coord_t knob_left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); + lv_coord_t knob_right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); + lv_coord_t knob_top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); + lv_coord_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); + + lv_coord_t transf_w = lv_obj_get_style_transform_width(obj, LV_PART_KNOB); + lv_coord_t transf_h = lv_obj_get_style_transform_height(obj, LV_PART_KNOB); + + /*Apply the paddings on the knob area*/ + knob_area->x1 -= knob_left + transf_w; + knob_area->x2 += knob_right + transf_w; + knob_area->y1 -= knob_top + transf_h; + knob_area->y2 += knob_bottom + transf_h; +} + +static bool is_slider_horizontal(lv_obj_t * obj) +{ + return lv_obj_get_width(obj) >= lv_obj_get_height(obj); +} + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_slider.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_slider.h new file mode 100644 index 0000000..386950c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_slider.h @@ -0,0 +1,195 @@ +/** + * @file lv_slider.h + * + */ + +#ifndef LV_SLIDER_H +#define LV_SLIDER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#if LV_USE_SLIDER != 0 + +/*Testing of dependencies*/ +#if LV_USE_BAR == 0 +#error "lv_slider: lv_bar is required. Enable it in lv_conf.h (LV_USE_BAR 1)" +#endif + +#include "../core/lv_obj.h" +#include "lv_bar.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +enum { + LV_SLIDER_MODE_NORMAL = LV_BAR_MODE_NORMAL, + LV_SLIDER_MODE_SYMMETRICAL = LV_BAR_MODE_SYMMETRICAL, + LV_SLIDER_MODE_RANGE = LV_BAR_MODE_RANGE +}; +typedef uint8_t lv_slider_mode_t; + +typedef struct { + lv_bar_t bar; /*Add the ancestor's type first*/ + lv_area_t left_knob_area; + lv_area_t right_knob_area; + int32_t * value_to_set; /*Which bar value to set*/ + uint8_t dragging : 1; /*1: the slider is being dragged*/ + uint8_t left_knob_focus : 1; /*1: with encoder now the right knob can be adjusted*/ +} lv_slider_t; + +extern const lv_obj_class_t lv_slider_class; + +/** + * `type` field in `lv_obj_draw_part_dsc_t` if `class_p = lv_slider_class` + * Used in `LV_EVENT_DRAW_PART_BEGIN` and `LV_EVENT_DRAW_PART_END` + */ +typedef enum { + LV_SLIDER_DRAW_PART_KNOB, /**< The main (right) knob's rectangle*/ + LV_SLIDER_DRAW_PART_KNOB_LEFT, /**< The left knob's rectangle*/ +} lv_slider_draw_part_type_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a slider object + * @param parent pointer to an object, it will be the parent of the new slider. + * @return pointer to the created slider + */ +lv_obj_t * lv_slider_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set a new value on the slider + * @param obj pointer to a slider object + * @param value the new value + * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately + */ +static inline void lv_slider_set_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim) +{ + lv_bar_set_value(obj, value, anim); +} + +/** + * Set a new value for the left knob of a slider + * @param obj pointer to a slider object + * @param value new value + * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately + */ +static inline void lv_slider_set_left_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim) +{ + lv_bar_set_start_value(obj, value, anim); +} + +/** + * Set minimum and the maximum values of a bar + * @param obj pointer to the slider object + * @param min minimum value + * @param max maximum value + */ +static inline void lv_slider_set_range(lv_obj_t * obj, int32_t min, int32_t max) +{ + lv_bar_set_range(obj, min, max); +} + +/** + * Set the mode of slider. + * @param obj pointer to a slider object + * @param mode the mode of the slider. See ::lv_slider_mode_t + */ +static inline void lv_slider_set_mode(lv_obj_t * obj, lv_slider_mode_t mode) +{ + lv_bar_set_mode(obj, (lv_bar_mode_t)mode); +} + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the value of the main knob of a slider + * @param obj pointer to a slider object + * @return the value of the main knob of the slider + */ +static inline int32_t lv_slider_get_value(const lv_obj_t * obj) +{ + return lv_bar_get_value(obj); +} + +/** + * Get the value of the left knob of a slider + * @param obj pointer to a slider object + * @return the value of the left knob of the slider + */ +static inline int32_t lv_slider_get_left_value(const lv_obj_t * obj) +{ + return lv_bar_get_start_value(obj); +} + +/** + * Get the minimum value of a slider + * @param obj pointer to a slider object + * @return the minimum value of the slider + */ +static inline int32_t lv_slider_get_min_value(const lv_obj_t * obj) +{ + return lv_bar_get_min_value(obj); +} + +/** + * Get the maximum value of a slider + * @param obj pointer to a slider object + * @return the maximum value of the slider + */ +static inline int32_t lv_slider_get_max_value(const lv_obj_t * obj) +{ + return lv_bar_get_max_value(obj); +} + +/** + * Give the slider is being dragged or not + * @param obj pointer to a slider object + * @return true: drag in progress false: not dragged + */ +bool lv_slider_is_dragged(const lv_obj_t * obj); + +/** + * Get the mode of the slider. + * @param obj pointer to a bar object + * @return see ::lv_slider_mode_t + */ +static inline lv_slider_mode_t lv_slider_get_mode(lv_obj_t * slider) +{ + lv_bar_mode_t mode = lv_bar_get_mode(slider); + if(mode == LV_BAR_MODE_SYMMETRICAL) return LV_SLIDER_MODE_SYMMETRICAL; + else if(mode == LV_BAR_MODE_RANGE) return LV_SLIDER_MODE_RANGE; + else return LV_SLIDER_MODE_NORMAL; +} + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SLIDER*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SLIDER_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_switch.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_switch.c new file mode 100644 index 0000000..b328610 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_switch.c @@ -0,0 +1,277 @@ +/** + * @file lv_sw.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_switch.h" + +#if LV_USE_SWITCH != 0 + +#include "../misc/lv_assert.h" +#include "../misc/lv_math.h" +#include "../misc/lv_anim.h" +#include "../core/lv_indev.h" +#include "../core/lv_disp.h" +#include "lv_img.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_switch_class + +#define LV_SWITCH_IS_ANIMATING(sw) (((sw)->anim_state) != LV_SWITCH_ANIM_STATE_INV) + +/** Switch animation start value. (Not the real value of the switch just indicates process animation)*/ +#define LV_SWITCH_ANIM_STATE_START 0 + +/** Switch animation end value. (Not the real value of the switch just indicates process animation)*/ +#define LV_SWITCH_ANIM_STATE_END 256 + +/** Mark no animation is in progress*/ +#define LV_SWITCH_ANIM_STATE_INV -1 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_switch_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_switch_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_switch_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_main(lv_event_t * e); + +static void lv_switch_anim_exec_cb(void * sw, int32_t value); +static void lv_switch_trigger_anim(lv_obj_t * obj); +static void lv_switch_anim_ready(lv_anim_t * a); +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_switch_class = { + .constructor_cb = lv_switch_constructor, + .destructor_cb = lv_switch_destructor, + .event_cb = lv_switch_event, + .width_def = (4 * LV_DPI_DEF) / 10, + .height_def = (4 * LV_DPI_DEF) / 17, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .instance_size = sizeof(lv_switch_t), + .base_class = &lv_obj_class +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_switch_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_switch_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_switch_t * sw = (lv_switch_t *)obj; + + sw->anim_state = LV_SWITCH_ANIM_STATE_INV; + + lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_CHECKABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_switch_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_switch_t * sw = (lv_switch_t *)obj; + + lv_anim_del(sw, NULL); +} + +static void lv_switch_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_res_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RES_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + + if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + lv_coord_t knob_left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); + lv_coord_t knob_right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); + lv_coord_t knob_top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); + lv_coord_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); + + /*The smaller size is the knob diameter*/ + lv_coord_t knob_size = LV_MAX4(knob_left, knob_right, knob_bottom, knob_top); + knob_size += _LV_SWITCH_KNOB_EXT_AREA_CORRECTION; + knob_size += lv_obj_calculate_ext_draw_size(obj, LV_PART_KNOB); + + lv_coord_t * s = lv_event_get_param(e); + *s = LV_MAX(*s, knob_size); + *s = LV_MAX(*s, lv_obj_calculate_ext_draw_size(obj, LV_PART_INDICATOR)); + } + else if(code == LV_EVENT_VALUE_CHANGED) { + lv_switch_trigger_anim(obj); + lv_obj_invalidate(obj); + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_main(e); + } +} + +static void draw_main(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + lv_switch_t * sw = (lv_switch_t *)obj; + + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + + /*Calculate the indicator area*/ + lv_coord_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + lv_coord_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + lv_coord_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + lv_coord_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + + /*Draw the indicator*/ + /*Respect the background's padding*/ + lv_area_t indic_area; + lv_area_copy(&indic_area, &obj->coords); + indic_area.x1 += bg_left; + indic_area.x2 -= bg_right; + indic_area.y1 += bg_top; + indic_area.y2 -= bg_bottom; + + lv_draw_rect_dsc_t draw_indic_dsc; + lv_draw_rect_dsc_init(&draw_indic_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &draw_indic_dsc); + lv_draw_rect(draw_ctx, &draw_indic_dsc, &indic_area); + + /*Draw the knob*/ + lv_coord_t anim_value_x = 0; + lv_coord_t knob_size = lv_obj_get_height(obj); + lv_coord_t anim_length = lv_area_get_width(&obj->coords) - knob_size; + + if(LV_SWITCH_IS_ANIMATING(sw)) { + /* Use the animation's coordinate */ + anim_value_x = (anim_length * sw->anim_state) / LV_SWITCH_ANIM_STATE_END; + } + else { + /* Use LV_STATE_CHECKED to decide the coordinate */ + bool chk = lv_obj_get_state(obj) & LV_STATE_CHECKED; + anim_value_x = chk ? anim_length : 0; + } + + if(LV_BASE_DIR_RTL == lv_obj_get_style_base_dir(obj, LV_PART_MAIN)) { + anim_value_x = anim_length - anim_value_x; + } + + lv_area_t knob_area; + knob_area.x1 = obj->coords.x1 + anim_value_x; + knob_area.x2 = knob_area.x1 + knob_size; + + knob_area.y1 = obj->coords.y1; + knob_area.y2 = obj->coords.y2; + + lv_coord_t knob_left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); + lv_coord_t knob_right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); + lv_coord_t knob_top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); + lv_coord_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); + + /*Apply the paddings on the knob area*/ + knob_area.x1 -= knob_left; + knob_area.x2 += knob_right; + knob_area.y1 -= knob_top; + knob_area.y2 += knob_bottom; + + lv_draw_rect_dsc_t knob_rect_dsc; + lv_draw_rect_dsc_init(&knob_rect_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_KNOB, &knob_rect_dsc); + + lv_draw_rect(draw_ctx, &knob_rect_dsc, &knob_area); +} + +static void lv_switch_anim_exec_cb(void * var, int32_t value) +{ + lv_switch_t * sw = var; + sw->anim_state = value; + lv_obj_invalidate((lv_obj_t *)sw); +} + +/** + * Resets the switch's animation state to "no animation in progress". + */ +static void lv_switch_anim_ready(lv_anim_t * a) +{ + lv_switch_t * sw = a->var; + sw->anim_state = LV_SWITCH_ANIM_STATE_INV; + lv_obj_invalidate((lv_obj_t *)sw); +} + +/** + * Starts an animation for the switch knob. if the anim_time style property is greater than 0 + * @param obj the switch to animate + */ +static void lv_switch_trigger_anim(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_switch_t * sw = (lv_switch_t *)obj; + + uint32_t anim_dur_full = lv_obj_get_style_anim_time(obj, LV_PART_MAIN); + + if(anim_dur_full > 0) { + bool chk = lv_obj_get_state(obj) & LV_STATE_CHECKED; + int32_t anim_start; + int32_t anim_end; + /*No animation in progress -> simply set the values*/ + if(sw->anim_state == LV_SWITCH_ANIM_STATE_INV) { + anim_start = chk ? LV_SWITCH_ANIM_STATE_START : LV_SWITCH_ANIM_STATE_END; + anim_end = chk ? LV_SWITCH_ANIM_STATE_END : LV_SWITCH_ANIM_STATE_START; + } + /*Animation in progress. Start from the animation end value*/ + else { + anim_start = sw->anim_state; + anim_end = chk ? LV_SWITCH_ANIM_STATE_END : LV_SWITCH_ANIM_STATE_START; + } + /*Calculate actual animation duration*/ + uint32_t anim_dur = (anim_dur_full * LV_ABS(anim_start - anim_end)) / LV_SWITCH_ANIM_STATE_END; + + /*Stop the previous animation if it exists*/ + lv_anim_del(sw, NULL); + + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, sw); + lv_anim_set_exec_cb(&a, lv_switch_anim_exec_cb); + lv_anim_set_values(&a, anim_start, anim_end); + lv_anim_set_ready_cb(&a, lv_switch_anim_ready); + lv_anim_set_time(&a, anim_dur); + lv_anim_start(&a); + } +} + + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_switch.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_switch.h new file mode 100644 index 0000000..83ca81b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_switch.h @@ -0,0 +1,61 @@ +/** + * @file lv_switch.h + * + */ + +#ifndef LV_SWITCH_H +#define LV_SWITCH_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#if LV_USE_SWITCH != 0 + +#include "../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ + +/** Switch knob extra area correction factor */ +#define _LV_SWITCH_KNOB_EXT_AREA_CORRECTION 2 + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_obj_t obj; + int32_t anim_state; +} lv_switch_t; + +extern const lv_obj_class_t lv_switch_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a switch object + * @param parent pointer to an object, it will be the parent of the new switch + * @return pointer to the created switch + */ +lv_obj_t * lv_switch_create(lv_obj_t * parent); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SWITCH*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SWITCH_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_table.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_table.c new file mode 100644 index 0000000..5ff65ab --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_table.c @@ -0,0 +1,1007 @@ +/** + * @file lv_table.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_table.h" +#if LV_USE_TABLE != 0 + +#include "../core/lv_indev.h" +#include "../misc/lv_assert.h" +#include "../misc/lv_txt.h" +#include "../misc/lv_txt_ap.h" +#include "../misc/lv_math.h" +#include "../misc/lv_printf.h" +#include "../draw/lv_draw.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_table_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_table_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_table_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_table_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_main(lv_event_t * e); +static lv_coord_t get_row_height(lv_obj_t * obj, uint16_t row_id, const lv_font_t * font, + lv_coord_t letter_space, lv_coord_t line_space, + lv_coord_t cell_left, lv_coord_t cell_right, lv_coord_t cell_top, lv_coord_t cell_bottom); +static void refr_size_form_row(lv_obj_t * obj, uint32_t start_row); +static void refr_cell_size(lv_obj_t * obj, uint32_t row, uint32_t col); +static lv_res_t get_pressed_cell(lv_obj_t * obj, uint16_t * row, uint16_t * col); +static size_t get_cell_txt_len(const char * txt); +static void copy_cell_txt(char * dst, const char * txt); +static void get_cell_area(lv_obj_t * obj, uint16_t row, uint16_t col, lv_area_t * area); + +static inline bool is_cell_empty(void * cell) +{ + return cell == NULL; +} + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_table_class = { + .constructor_cb = lv_table_constructor, + .destructor_cb = lv_table_destructor, + .event_cb = lv_table_event, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .base_class = &lv_obj_class, + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .instance_size = sizeof(lv_table_t), +}; +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_table_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_table_set_cell_value(lv_obj_t * obj, uint16_t row, uint16_t col, const char * txt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(txt); + + lv_table_t * table = (lv_table_t *)obj; + + /*Auto expand*/ + if(col >= table->col_cnt) lv_table_set_col_cnt(obj, col + 1); + if(row >= table->row_cnt) lv_table_set_row_cnt(obj, row + 1); + + uint32_t cell = row * table->col_cnt + col; + lv_table_cell_ctrl_t ctrl = 0; + + /*Save the control byte*/ + if(table->cell_data[cell]) ctrl = table->cell_data[cell][0]; + + size_t to_allocate = get_cell_txt_len(txt); + + table->cell_data[cell] = lv_mem_realloc(table->cell_data[cell], to_allocate); + LV_ASSERT_MALLOC(table->cell_data[cell]); + if(table->cell_data[cell] == NULL) return; + + copy_cell_txt(table->cell_data[cell], txt); + + table->cell_data[cell][0] = ctrl; + refr_cell_size(obj, row, col); +} + +void lv_table_set_cell_value_fmt(lv_obj_t * obj, uint16_t row, uint16_t col, const char * fmt, ...) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(fmt); + + lv_table_t * table = (lv_table_t *)obj; + if(col >= table->col_cnt) { + lv_table_set_col_cnt(obj, col + 1); + } + + /*Auto expand*/ + if(row >= table->row_cnt) { + lv_table_set_row_cnt(obj, row + 1); + } + + uint32_t cell = row * table->col_cnt + col; + lv_table_cell_ctrl_t ctrl = 0; + + /*Save the control byte*/ + if(table->cell_data[cell]) ctrl = table->cell_data[cell][0]; + + va_list ap, ap2; + va_start(ap, fmt); + va_copy(ap2, ap); + + /*Allocate space for the new text by using trick from C99 standard section 7.19.6.12*/ + uint32_t len = lv_vsnprintf(NULL, 0, fmt, ap); + va_end(ap); + +#if LV_USE_ARABIC_PERSIAN_CHARS + /*Put together the text according to the format string*/ + char * raw_txt = lv_mem_buf_get(len + 1); + LV_ASSERT_MALLOC(raw_txt); + if(raw_txt == NULL) { + va_end(ap2); + return; + } + + lv_vsnprintf(raw_txt, len + 1, fmt, ap2); + + /*Get the size of the Arabic text and process it*/ + size_t len_ap = _lv_txt_ap_calc_bytes_cnt(raw_txt); + table->cell_data[cell] = lv_mem_realloc(table->cell_data[cell], len_ap + 1); + LV_ASSERT_MALLOC(table->cell_data[cell]); + if(table->cell_data[cell] == NULL) { + va_end(ap2); + return; + } + _lv_txt_ap_proc(raw_txt, &table->cell_data[cell][1]); + + lv_mem_buf_release(raw_txt); +#else + table->cell_data[cell] = lv_mem_realloc(table->cell_data[cell], len + 2); /*+1: trailing '\0; +1: format byte*/ + LV_ASSERT_MALLOC(table->cell_data[cell]); + if(table->cell_data[cell] == NULL) { + va_end(ap2); + return; + } + + table->cell_data[cell][len + 1] = 0; /*Ensure NULL termination*/ + + lv_vsnprintf(&table->cell_data[cell][1], len + 1, fmt, ap2); +#endif + + va_end(ap2); + + table->cell_data[cell][0] = ctrl; + + refr_cell_size(obj, row, col); +} + +void lv_table_set_row_cnt(lv_obj_t * obj, uint16_t row_cnt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + + if(table->row_cnt == row_cnt) return; + + uint16_t old_row_cnt = table->row_cnt; + table->row_cnt = row_cnt; + + table->row_h = lv_mem_realloc(table->row_h, table->row_cnt * sizeof(table->row_h[0])); + LV_ASSERT_MALLOC(table->row_h); + if(table->row_h == NULL) return; + + /*Free the unused cells*/ + if(old_row_cnt > row_cnt) { + uint16_t old_cell_cnt = old_row_cnt * table->col_cnt; + uint32_t new_cell_cnt = table->col_cnt * table->row_cnt; + uint32_t i; + for(i = new_cell_cnt; i < old_cell_cnt; i++) { + lv_mem_free(table->cell_data[i]); + } + } + + table->cell_data = lv_mem_realloc(table->cell_data, table->row_cnt * table->col_cnt * sizeof(char *)); + LV_ASSERT_MALLOC(table->cell_data); + if(table->cell_data == NULL) return; + + /*Initialize the new fields*/ + if(old_row_cnt < row_cnt) { + uint32_t old_cell_cnt = old_row_cnt * table->col_cnt; + uint32_t new_cell_cnt = table->col_cnt * table->row_cnt; + lv_memset_00(&table->cell_data[old_cell_cnt], (new_cell_cnt - old_cell_cnt) * sizeof(table->cell_data[0])); + } + + refr_size_form_row(obj, 0); +} + +void lv_table_set_col_cnt(lv_obj_t * obj, uint16_t col_cnt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + + if(table->col_cnt == col_cnt) return; + + uint16_t old_col_cnt = table->col_cnt; + table->col_cnt = col_cnt; + + char ** new_cell_data = lv_mem_alloc(table->row_cnt * table->col_cnt * sizeof(char *)); + LV_ASSERT_MALLOC(new_cell_data); + if(new_cell_data == NULL) return; + uint32_t new_cell_cnt = table->col_cnt * table->row_cnt; + + lv_memset_00(new_cell_data, new_cell_cnt * sizeof(table->cell_data[0])); + + /*The new column(s) messes up the mapping of `cell_data`*/ + uint32_t old_col_start; + uint32_t new_col_start; + uint32_t min_col_cnt = LV_MIN(old_col_cnt, col_cnt); + uint32_t row; + for(row = 0; row < table->row_cnt; row++) { + old_col_start = row * old_col_cnt; + new_col_start = row * col_cnt; + + lv_memcpy_small(&new_cell_data[new_col_start], &table->cell_data[old_col_start], + sizeof(new_cell_data[0]) * min_col_cnt); + + /*Free the old cells (only if the table becomes smaller)*/ + int32_t i; + for(i = 0; i < (int32_t)old_col_cnt - col_cnt; i++) { + uint32_t idx = old_col_start + min_col_cnt + i; + lv_mem_free(table->cell_data[idx]); + table->cell_data[idx] = NULL; + } + } + + lv_mem_free(table->cell_data); + table->cell_data = new_cell_data; + + /*Initialize the new column widths if any*/ + table->col_w = lv_mem_realloc(table->col_w, col_cnt * sizeof(table->col_w[0])); + LV_ASSERT_MALLOC(table->col_w); + if(table->col_w == NULL) return; + + uint32_t col; + for(col = old_col_cnt; col < col_cnt; col++) { + table->col_w[col] = LV_DPI_DEF; + } + + + refr_size_form_row(obj, 0) ; +} + +void lv_table_set_col_width(lv_obj_t * obj, uint16_t col_id, lv_coord_t w) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + + /*Auto expand*/ + if(col_id >= table->col_cnt) lv_table_set_col_cnt(obj, col_id + 1); + + table->col_w[col_id] = w; + refr_size_form_row(obj, 0); +} + +void lv_table_add_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table_cell_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + + /*Auto expand*/ + if(col >= table->col_cnt) lv_table_set_col_cnt(obj, col + 1); + if(row >= table->row_cnt) lv_table_set_row_cnt(obj, row + 1); + + uint32_t cell = row * table->col_cnt + col; + + if(is_cell_empty(table->cell_data[cell])) { + table->cell_data[cell] = lv_mem_alloc(2); /*+1: trailing '\0; +1: format byte*/ + LV_ASSERT_MALLOC(table->cell_data[cell]); + if(table->cell_data[cell] == NULL) return; + + table->cell_data[cell][0] = 0; + table->cell_data[cell][1] = '\0'; + } + + table->cell_data[cell][0] |= ctrl; +} + +void lv_table_clear_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table_cell_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + + /*Auto expand*/ + if(col >= table->col_cnt) lv_table_set_col_cnt(obj, col + 1); + if(row >= table->row_cnt) lv_table_set_row_cnt(obj, row + 1); + + uint32_t cell = row * table->col_cnt + col; + + if(is_cell_empty(table->cell_data[cell])) { + table->cell_data[cell] = lv_mem_alloc(2); /*+1: trailing '\0; +1: format byte*/ + LV_ASSERT_MALLOC(table->cell_data[cell]); + if(table->cell_data[cell] == NULL) return; + + table->cell_data[cell][0] = 0; + table->cell_data[cell][1] = '\0'; + } + + table->cell_data[cell][0] &= (~ctrl); +} + +/*===================== + * Getter functions + *====================*/ + +const char * lv_table_get_cell_value(lv_obj_t * obj, uint16_t row, uint16_t col) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + if(row >= table->row_cnt || col >= table->col_cnt) { + LV_LOG_WARN("invalid row or column"); + return ""; + } + uint32_t cell = row * table->col_cnt + col; + + if(is_cell_empty(table->cell_data[cell])) return ""; + + return &table->cell_data[cell][1]; /*Skip the format byte*/ +} + +uint16_t lv_table_get_row_cnt(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + return table->row_cnt; +} + +uint16_t lv_table_get_col_cnt(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + return table->col_cnt; +} + +lv_coord_t lv_table_get_col_width(lv_obj_t * obj, uint16_t col) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + + if(col >= table->col_cnt) { + LV_LOG_WARN("lv_table_set_col_width: too big 'col_id'. Must be < LV_TABLE_COL_MAX."); + return 0; + } + + return table->col_w[col]; +} + +bool lv_table_has_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table_cell_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + if(row >= table->row_cnt || col >= table->col_cnt) { + LV_LOG_WARN("lv_table_get_cell_crop: invalid row or column"); + return false; + } + uint32_t cell = row * table->col_cnt + col; + + if(is_cell_empty(table->cell_data[cell])) return false; + else return (table->cell_data[cell][0] & ctrl) == ctrl; +} + +void lv_table_get_selected_cell(lv_obj_t * obj, uint16_t * row, uint16_t * col) +{ + lv_table_t * table = (lv_table_t *)obj; + *row = table->row_act; + *col = table->col_act; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_table_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_table_t * table = (lv_table_t *)obj; + + table->col_cnt = 1; + table->row_cnt = 1; + table->col_w = lv_mem_alloc(table->col_cnt * sizeof(table->col_w[0])); + table->row_h = lv_mem_alloc(table->row_cnt * sizeof(table->row_h[0])); + table->col_w[0] = LV_DPI_DEF; + table->row_h[0] = LV_DPI_DEF; + table->cell_data = lv_mem_realloc(table->cell_data, table->row_cnt * table->col_cnt * sizeof(char *)); + table->cell_data[0] = NULL; + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_table_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_table_t * table = (lv_table_t *)obj; + /*Free the cell texts*/ + uint16_t i; + for(i = 0; i < table->col_cnt * table->row_cnt; i++) { + if(table->cell_data[i]) { + lv_mem_free(table->cell_data[i]); + table->cell_data[i] = NULL; + } + } + + if(table->cell_data) lv_mem_free(table->cell_data); + if(table->row_h) lv_mem_free(table->row_h); + if(table->col_w) lv_mem_free(table->col_w); +} + +static void lv_table_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_res_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RES_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + lv_table_t * table = (lv_table_t *)obj; + + if(code == LV_EVENT_STYLE_CHANGED) { + refr_size_form_row(obj, 0); + } + else if(code == LV_EVENT_GET_SELF_SIZE) { + lv_point_t * p = lv_event_get_param(e); + uint32_t i; + lv_coord_t w = 0; + for(i = 0; i < table->col_cnt; i++) w += table->col_w[i]; + + lv_coord_t h = 0; + for(i = 0; i < table->row_cnt; i++) h += table->row_h[i]; + + p->x = w - 1; + p->y = h - 1; + } + else if(code == LV_EVENT_PRESSED || code == LV_EVENT_PRESSING) { + uint16_t col; + uint16_t row; + lv_res_t pr_res = get_pressed_cell(obj, &row, &col); + + if(pr_res == LV_RES_OK && (table->col_act != col || table->row_act != row)) { + table->col_act = col; + table->row_act = row; + lv_obj_invalidate(obj); + } + } + else if(code == LV_EVENT_RELEASED) { + lv_obj_invalidate(obj); + lv_indev_t * indev = lv_indev_get_act(); + lv_obj_t * scroll_obj = lv_indev_get_scroll_obj(indev); + if(table->col_act != LV_TABLE_CELL_NONE && table->row_act != LV_TABLE_CELL_NONE && scroll_obj == NULL) { + res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RES_OK) return; + } + + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_get_act()); + if(indev_type == LV_INDEV_TYPE_POINTER || indev_type == LV_INDEV_TYPE_BUTTON) { + table->col_act = LV_TABLE_CELL_NONE; + table->row_act = LV_TABLE_CELL_NONE; + } + } + else if(code == LV_EVENT_FOCUSED) { + lv_obj_invalidate(obj); + } + else if(code == LV_EVENT_KEY) { + int32_t c = *((int32_t *)lv_event_get_param(e)); + int32_t col = table->col_act; + int32_t row = table->row_act; + if(col == LV_TABLE_CELL_NONE || row == LV_TABLE_CELL_NONE) { + table->col_act = 0; + table->row_act = 0; + lv_obj_invalidate(obj); + return; + } + + if(col >= table->col_cnt) col = 0; + if(row >= table->row_cnt) row = 0; + + if(c == LV_KEY_LEFT) col--; + else if(c == LV_KEY_RIGHT) col++; + else if(c == LV_KEY_UP) row--; + else if(c == LV_KEY_DOWN) row++; + else return; + + if(col >= table->col_cnt) { + if(row < table->row_cnt - 1) { + col = 0; + row++; + } + else { + col = table->col_cnt - 1; + } + } + else if(col < 0) { + if(row != 0) { + col = table->col_cnt - 1; + row--; + } + else { + col = 0; + } + } + + if(row >= table->row_cnt) { + row = table->row_cnt - 1; + } + else if(row < 0) { + row = 0; + } + + if(table->col_act != col || table->row_act != row) { + table->col_act = col; + table->row_act = row; + lv_obj_invalidate(obj); + + res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RES_OK) return; + } + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_main(e); + } +} + + +static void draw_main(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + lv_table_t * table = (lv_table_t *)obj; + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + lv_area_t clip_area; + if(!_lv_area_intersect(&clip_area, &obj->coords, draw_ctx->clip_area)) return; + + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + draw_ctx->clip_area = &clip_area; + + lv_point_t txt_size; + lv_area_t cell_area; + + lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_coord_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + lv_coord_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + lv_coord_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + lv_coord_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + + lv_state_t state_ori = obj->state; + obj->state = LV_STATE_DEFAULT; + obj->skip_trans = 1; + lv_draw_rect_dsc_t rect_dsc_def; + lv_draw_rect_dsc_t rect_dsc_act; /*Passed to the event to modify it*/ + lv_draw_rect_dsc_init(&rect_dsc_def); + lv_obj_init_draw_rect_dsc(obj, LV_PART_ITEMS, &rect_dsc_def); + + lv_draw_label_dsc_t label_dsc_def; + lv_draw_label_dsc_t label_dsc_act; /*Passed to the event to modify it*/ + lv_draw_label_dsc_init(&label_dsc_def); + lv_obj_init_draw_label_dsc(obj, LV_PART_ITEMS, &label_dsc_def); + obj->state = state_ori; + obj->skip_trans = 0; + + uint16_t col; + uint16_t row; + uint16_t cell = 0; + + cell_area.y2 = obj->coords.y1 + bg_top - 1 - lv_obj_get_scroll_y(obj) + border_width; + lv_coord_t scroll_x = lv_obj_get_scroll_x(obj) ; + bool rtl = lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL; + + /*Handle custom drawer*/ + lv_obj_draw_part_dsc_t part_draw_dsc; + lv_obj_draw_dsc_init(&part_draw_dsc, draw_ctx); + part_draw_dsc.part = LV_PART_ITEMS; + part_draw_dsc.class_p = MY_CLASS; + part_draw_dsc.type = LV_TABLE_DRAW_PART_CELL; + part_draw_dsc.rect_dsc = &rect_dsc_act; + part_draw_dsc.label_dsc = &label_dsc_act; + + for(row = 0; row < table->row_cnt; row++) { + lv_coord_t h_row = table->row_h[row]; + + cell_area.y1 = cell_area.y2 + 1; + cell_area.y2 = cell_area.y1 + h_row - 1; + + if(cell_area.y1 > clip_area.y2) break; + + if(rtl) cell_area.x1 = obj->coords.x2 - bg_right - 1 - scroll_x - border_width; + else cell_area.x2 = obj->coords.x1 + bg_left - 1 - scroll_x + border_width; + + for(col = 0; col < table->col_cnt; col++) { + lv_table_cell_ctrl_t ctrl = 0; + if(table->cell_data[cell]) ctrl = table->cell_data[cell][0]; + + if(rtl) { + cell_area.x2 = cell_area.x1 - 1; + cell_area.x1 = cell_area.x2 - table->col_w[col] + 1; + } + else { + cell_area.x1 = cell_area.x2 + 1; + cell_area.x2 = cell_area.x1 + table->col_w[col] - 1; + } + + uint16_t col_merge = 0; + for(col_merge = 0; col_merge + col < table->col_cnt - 1; col_merge++) { + char * next_cell_data = table->cell_data[cell + col_merge]; + + if(is_cell_empty(next_cell_data)) break; + + lv_table_cell_ctrl_t merge_ctrl = (lv_table_cell_ctrl_t) next_cell_data[0]; + if(merge_ctrl & LV_TABLE_CELL_CTRL_MERGE_RIGHT) { + lv_coord_t offset = table->col_w[col + col_merge + 1]; + + if(rtl) cell_area.x1 -= offset; + else cell_area.x2 += offset; + } + else { + break; + } + } + + if(cell_area.y2 < clip_area.y1) { + cell += col_merge + 1; + col += col_merge; + continue; + } + + /*Expand the cell area with a half border to avoid drawing 2 borders next to each other*/ + lv_area_t cell_area_border; + lv_area_copy(&cell_area_border, &cell_area); + if((rect_dsc_def.border_side & LV_BORDER_SIDE_LEFT) && cell_area_border.x1 > obj->coords.x1 + bg_left) { + cell_area_border.x1 -= rect_dsc_def.border_width / 2; + } + if((rect_dsc_def.border_side & LV_BORDER_SIDE_TOP) && cell_area_border.y1 > obj->coords.y1 + bg_top) { + cell_area_border.y1 -= rect_dsc_def.border_width / 2; + } + if((rect_dsc_def.border_side & LV_BORDER_SIDE_RIGHT) && cell_area_border.x2 < obj->coords.x2 - bg_right - 1) { + cell_area_border.x2 += rect_dsc_def.border_width / 2 + (rect_dsc_def.border_width & 0x1); + } + if((rect_dsc_def.border_side & LV_BORDER_SIDE_BOTTOM) && + cell_area_border.y2 < obj->coords.y2 - bg_bottom - 1) { + cell_area_border.y2 += rect_dsc_def.border_width / 2 + (rect_dsc_def.border_width & 0x1); + } + + lv_state_t cell_state = LV_STATE_DEFAULT; + if(row == table->row_act && col == table->col_act) { + if(!(obj->state & LV_STATE_SCROLLED) && (obj->state & LV_STATE_PRESSED)) cell_state |= LV_STATE_PRESSED; + if(obj->state & LV_STATE_FOCUSED) cell_state |= LV_STATE_FOCUSED; + if(obj->state & LV_STATE_FOCUS_KEY) cell_state |= LV_STATE_FOCUS_KEY; + if(obj->state & LV_STATE_EDITED) cell_state |= LV_STATE_EDITED; + } + + /*Set up the draw descriptors*/ + if(cell_state == LV_STATE_DEFAULT) { + lv_memcpy(&rect_dsc_act, &rect_dsc_def, sizeof(lv_draw_rect_dsc_t)); + lv_memcpy(&label_dsc_act, &label_dsc_def, sizeof(lv_draw_label_dsc_t)); + } + /*In other cases get the styles directly without caching them*/ + else { + obj->state = cell_state; + obj->skip_trans = 1; + lv_draw_rect_dsc_init(&rect_dsc_act); + lv_draw_label_dsc_init(&label_dsc_act); + lv_obj_init_draw_rect_dsc(obj, LV_PART_ITEMS, &rect_dsc_act); + lv_obj_init_draw_label_dsc(obj, LV_PART_ITEMS, &label_dsc_act); + obj->state = state_ori; + obj->skip_trans = 0; + } + + part_draw_dsc.draw_area = &cell_area_border; + part_draw_dsc.id = row * table->col_cnt + col; + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + + lv_draw_rect(draw_ctx, &rect_dsc_act, &cell_area_border); + + if(table->cell_data[cell]) { + const lv_coord_t cell_left = lv_obj_get_style_pad_left(obj, LV_PART_ITEMS); + const lv_coord_t cell_right = lv_obj_get_style_pad_right(obj, LV_PART_ITEMS); + const lv_coord_t cell_top = lv_obj_get_style_pad_top(obj, LV_PART_ITEMS); + const lv_coord_t cell_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_ITEMS); + lv_text_flag_t txt_flags = LV_TEXT_FLAG_NONE; + lv_area_t txt_area; + + txt_area.x1 = cell_area.x1 + cell_left; + txt_area.x2 = cell_area.x2 - cell_right; + txt_area.y1 = cell_area.y1 + cell_top; + txt_area.y2 = cell_area.y2 - cell_bottom; + + /*Align the content to the middle if not cropped*/ + bool crop = ctrl & LV_TABLE_CELL_CTRL_TEXT_CROP ? true : false; + if(crop) txt_flags = LV_TEXT_FLAG_EXPAND; + + lv_txt_get_size(&txt_size, table->cell_data[cell] + 1, label_dsc_def.font, + label_dsc_act.letter_space, label_dsc_act.line_space, + lv_area_get_width(&txt_area), txt_flags); + + /*Align the content to the middle if not cropped*/ + if(!crop) { + txt_area.y1 = cell_area.y1 + h_row / 2 - txt_size.y / 2; + txt_area.y2 = cell_area.y1 + h_row / 2 + txt_size.y / 2; + } + + lv_area_t label_clip_area; + bool label_mask_ok; + label_mask_ok = _lv_area_intersect(&label_clip_area, &clip_area, &cell_area); + if(label_mask_ok) { + draw_ctx->clip_area = &label_clip_area; + lv_draw_label(draw_ctx, &label_dsc_act, &txt_area, table->cell_data[cell] + 1, NULL); + draw_ctx->clip_area = &clip_area; + } + } + + lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); + + cell += col_merge + 1; + col += col_merge; + } + } + + draw_ctx->clip_area = clip_area_ori; +} + +/* Refreshes size of the table starting from @start_row row */ +static void refr_size_form_row(lv_obj_t * obj, uint32_t start_row) +{ + const lv_coord_t cell_pad_left = lv_obj_get_style_pad_left(obj, LV_PART_ITEMS); + const lv_coord_t cell_pad_right = lv_obj_get_style_pad_right(obj, LV_PART_ITEMS); + const lv_coord_t cell_pad_top = lv_obj_get_style_pad_top(obj, LV_PART_ITEMS); + const lv_coord_t cell_pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_ITEMS); + + lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_ITEMS); + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_ITEMS); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_ITEMS); + + const lv_coord_t minh = lv_obj_get_style_min_height(obj, LV_PART_ITEMS); + const lv_coord_t maxh = lv_obj_get_style_max_height(obj, LV_PART_ITEMS); + + lv_table_t * table = (lv_table_t *)obj; + uint32_t i; + for(i = start_row; i < table->row_cnt; i++) { + lv_coord_t calculated_height = get_row_height(obj, i, font, letter_space, line_space, + cell_pad_left, cell_pad_right, cell_pad_top, cell_pad_bottom); + table->row_h[i] = LV_CLAMP(minh, calculated_height, maxh); + } + + lv_obj_refresh_self_size(obj); + lv_obj_invalidate(obj); +} + + +static void refr_cell_size(lv_obj_t * obj, uint32_t row, uint32_t col) +{ + const lv_coord_t cell_pad_left = lv_obj_get_style_pad_left(obj, LV_PART_ITEMS); + const lv_coord_t cell_pad_right = lv_obj_get_style_pad_right(obj, LV_PART_ITEMS); + const lv_coord_t cell_pad_top = lv_obj_get_style_pad_top(obj, LV_PART_ITEMS); + const lv_coord_t cell_pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_ITEMS); + + lv_coord_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_ITEMS); + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_ITEMS); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_ITEMS); + + const lv_coord_t minh = lv_obj_get_style_min_height(obj, LV_PART_ITEMS); + const lv_coord_t maxh = lv_obj_get_style_max_height(obj, LV_PART_ITEMS); + + lv_table_t * table = (lv_table_t *)obj; + lv_coord_t calculated_height = get_row_height(obj, row, font, letter_space, line_space, + cell_pad_left, cell_pad_right, cell_pad_top, cell_pad_bottom); + + lv_coord_t prev_row_size = table->row_h[row]; + table->row_h[row] = LV_CLAMP(minh, calculated_height, maxh); + + /*If the row height havn't changed invalidate only this cell*/ + if(prev_row_size == table->row_h[row]) { + lv_area_t cell_area; + get_cell_area(obj, row, col, &cell_area); + lv_area_move(&cell_area, obj->coords.x1, obj->coords.y1); + lv_obj_invalidate_area(obj, &cell_area); + } + else { + lv_obj_refresh_self_size(obj); + lv_obj_invalidate(obj); + } +} + +static lv_coord_t get_row_height(lv_obj_t * obj, uint16_t row_id, const lv_font_t * font, + lv_coord_t letter_space, lv_coord_t line_space, + lv_coord_t cell_left, lv_coord_t cell_right, lv_coord_t cell_top, lv_coord_t cell_bottom) +{ + lv_table_t * table = (lv_table_t *)obj; + + lv_coord_t h_max = lv_font_get_line_height(font) + cell_top + cell_bottom; + /* Calculate the cell_data index where to start */ + uint16_t row_start = row_id * table->col_cnt; + + /* Traverse the cells in the row_id row */ + uint16_t cell; + uint16_t col; + for(cell = row_start, col = 0; cell < row_start + table->col_cnt; cell++, col++) { + char * cell_data = table->cell_data[cell]; + + if(is_cell_empty(cell_data)) { + continue; + } + + lv_coord_t txt_w = table->col_w[col]; + + /* Traverse the current row from the first until the penultimate column. + * Increment the text width if the cell has the LV_TABLE_CELL_CTRL_MERGE_RIGHT control, + * exit the traversal when the current cell control is not LV_TABLE_CELL_CTRL_MERGE_RIGHT */ + uint16_t col_merge = 0; + for(col_merge = 0; col_merge + col < table->col_cnt - 1; col_merge++) { + char * next_cell_data = table->cell_data[cell + col_merge]; + + if(is_cell_empty(next_cell_data)) break; + + lv_table_cell_ctrl_t ctrl = (lv_table_cell_ctrl_t) next_cell_data[0]; + if(ctrl & LV_TABLE_CELL_CTRL_MERGE_RIGHT) { + txt_w += table->col_w[col + col_merge + 1]; + } + else { + break; + } + } + + lv_table_cell_ctrl_t ctrl = (lv_table_cell_ctrl_t) cell_data[0]; + + /*When cropping the text we can assume the row height is equal to the line height*/ + if(ctrl & LV_TABLE_CELL_CTRL_TEXT_CROP) { + h_max = LV_MAX(lv_font_get_line_height(font) + cell_top + cell_bottom, + h_max); + } + /*Else we have to calculate the height of the cell text*/ + else { + lv_point_t txt_size; + txt_w -= cell_left + cell_right; + + lv_txt_get_size(&txt_size, table->cell_data[cell] + 1, font, + letter_space, line_space, txt_w, LV_TEXT_FLAG_NONE); + + h_max = LV_MAX(txt_size.y + cell_top + cell_bottom, h_max); + /*Skip until one element after the last merged column*/ + cell += col_merge; + col += col_merge; + } + } + + return h_max; +} + +static lv_res_t get_pressed_cell(lv_obj_t * obj, uint16_t * row, uint16_t * col) +{ + lv_table_t * table = (lv_table_t *)obj; + + lv_indev_type_t type = lv_indev_get_type(lv_indev_get_act()); + if(type != LV_INDEV_TYPE_POINTER && type != LV_INDEV_TYPE_BUTTON) { + if(col) *col = LV_TABLE_CELL_NONE; + if(row) *row = LV_TABLE_CELL_NONE; + return LV_RES_INV; + } + + lv_point_t p; + lv_indev_get_point(lv_indev_get_act(), &p); + + lv_coord_t tmp; + if(col) { + lv_coord_t x = p.x + lv_obj_get_scroll_x(obj); + + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL) { + x = obj->coords.x2 - lv_obj_get_style_pad_right(obj, LV_PART_MAIN) - x; + } + else { + x -= obj->coords.x1; + x -= lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + } + + *col = 0; + tmp = 0; + for(*col = 0; *col < table->col_cnt; (*col)++) { + tmp += table->col_w[*col]; + if(x < tmp) break; + } + } + + if(row) { + lv_coord_t y = p.y + lv_obj_get_scroll_y(obj);; + y -= obj->coords.y1; + y -= lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + + *row = 0; + tmp = 0; + + for(*row = 0; *row < table->row_cnt; (*row)++) { + tmp += table->row_h[*row]; + if(y < tmp) break; + } + } + + return LV_RES_OK; +} + +/* Returns number of bytes to allocate based on chars configuration */ +static size_t get_cell_txt_len(const char * txt) +{ + size_t retval = 0; + +#if LV_USE_ARABIC_PERSIAN_CHARS + retval = _lv_txt_ap_calc_bytes_cnt(txt) + 1; +#else + /* cell_data layout: [ctrl][txt][trailing '\0' terminator] + * +2 because of the trailing '\0' and the ctrl */ + retval = strlen(txt) + 2; +#endif + + return retval; +} + +/* Copy txt into dst skipping the format byte */ +static void copy_cell_txt(char * dst, const char * txt) +{ +#if LV_USE_ARABIC_PERSIAN_CHARS + _lv_txt_ap_proc(txt, &dst[1]); +#else + strcpy(&dst[1], txt); +#endif +} + +static void get_cell_area(lv_obj_t * obj, uint16_t row, uint16_t col, lv_area_t * area) +{ + lv_table_t * table = (lv_table_t *)obj; + + uint32_t c; + area->x1 = 0; + for(c = 0; c < col; c++) { + area->x1 += table->col_w[c]; + } + + bool rtl = lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL; + if(rtl) { + area->x1 += lv_obj_get_scroll_x(obj); + lv_coord_t w = lv_obj_get_width(obj); + area->x2 = w - area->x1 - lv_obj_get_style_pad_right(obj, 0); + area->x1 = area->x2 - table->col_w[col]; + } + else { + area->x1 -= lv_obj_get_scroll_x(obj); + area->x1 += lv_obj_get_style_pad_left(obj, 0); + area->x2 = area->x1 + table->col_w[col] - 1; + } + + uint32_t r; + area->y1 = 0; + for(r = 0; r < row; r++) { + area->y1 += table->row_h[r]; + } + + area->y1 += lv_obj_get_style_pad_top(obj, 0); + area->y1 -= lv_obj_get_scroll_y(obj); + area->y2 = area->y1 + table->row_h[row] - 1; + +} + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_table.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_table.h new file mode 100644 index 0000000..9106270 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_table.h @@ -0,0 +1,210 @@ +/** + * @file lv_table.h + * + */ + +#ifndef LV_TABLE_H +#define LV_TABLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#if LV_USE_TABLE != 0 + +/*Testing of dependencies*/ +#if LV_USE_LABEL == 0 +#error "lv_table: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1)" +#endif + +#include "../core/lv_obj.h" +#include "lv_label.h" + +/********************* + * DEFINES + *********************/ +#define LV_TABLE_CELL_NONE 0XFFFF +LV_EXPORT_CONST_INT(LV_TABLE_CELL_NONE); + +/********************** + * TYPEDEFS + **********************/ + +enum { + LV_TABLE_CELL_CTRL_MERGE_RIGHT = 1 << 0, + LV_TABLE_CELL_CTRL_TEXT_CROP = 1 << 1, + LV_TABLE_CELL_CTRL_CUSTOM_1 = 1 << 4, + LV_TABLE_CELL_CTRL_CUSTOM_2 = 1 << 5, + LV_TABLE_CELL_CTRL_CUSTOM_3 = 1 << 6, + LV_TABLE_CELL_CTRL_CUSTOM_4 = 1 << 7, +}; + +typedef uint8_t lv_table_cell_ctrl_t; + +/*Data of table*/ +typedef struct { + lv_obj_t obj; + uint16_t col_cnt; + uint16_t row_cnt; + char ** cell_data; + lv_coord_t * row_h; + lv_coord_t * col_w; + uint16_t col_act; + uint16_t row_act; +} lv_table_t; + +extern const lv_obj_class_t lv_table_class; + +/** + * `type` field in `lv_obj_draw_part_dsc_t` if `class_p = lv_table_class` + * Used in `LV_EVENT_DRAW_PART_BEGIN` and `LV_EVENT_DRAW_PART_END` + */ +typedef enum { + LV_TABLE_DRAW_PART_CELL, /**< A cell*/ +} lv_table_draw_part_type_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a table object + * @param parent pointer to an object, it will be the parent of the new table + * @return pointer to the created table + */ +lv_obj_t * lv_table_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the value of a cell. + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + * @param txt text to display in the cell. It will be copied and saved so this variable is not required after this function call. + * @note New roes/columns are added automatically if required + */ +void lv_table_set_cell_value(lv_obj_t * obj, uint16_t row, uint16_t col, const char * txt); + +/** + * Set the value of a cell. Memory will be allocated to store the text by the table. + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + * @param fmt `printf`-like format + * @note New roes/columns are added automatically if required + */ +void lv_table_set_cell_value_fmt(lv_obj_t * obj, uint16_t row, uint16_t col, const char * fmt, ...); + +/** + * Set the number of rows + * @param obj table pointer to a Table object + * @param row_cnt number of rows + */ +void lv_table_set_row_cnt(lv_obj_t * obj, uint16_t row_cnt); + +/** + * Set the number of columns + * @param obj table pointer to a Table object + * @param col_cnt number of columns. + */ +void lv_table_set_col_cnt(lv_obj_t * obj, uint16_t col_cnt); + +/** + * Set the width of a column + * @param obj table pointer to a Table object + * @param col_id id of the column [0 .. LV_TABLE_COL_MAX -1] + * @param w width of the column + */ +void lv_table_set_col_width(lv_obj_t * obj, uint16_t col_id, lv_coord_t w); + +/** + * Add control bits to the cell. + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + * @param ctrl OR-ed values from ::lv_table_cell_ctrl_t + */ +void lv_table_add_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table_cell_ctrl_t ctrl); + + +/** + * Clear control bits of the cell. + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + * @param ctrl OR-ed values from ::lv_table_cell_ctrl_t + */ +void lv_table_clear_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table_cell_ctrl_t ctrl); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the value of a cell. + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + * @return text in the cell + */ +const char * lv_table_get_cell_value(lv_obj_t * obj, uint16_t row, uint16_t col); + +/** + * Get the number of rows. + * @param obj table pointer to a Table object + * @return number of rows. + */ +uint16_t lv_table_get_row_cnt(lv_obj_t * obj); + +/** + * Get the number of columns. + * @param obj table pointer to a Table object + * @return number of columns. + */ +uint16_t lv_table_get_col_cnt(lv_obj_t * obj); + +/** + * Get the width of a column + * @param obj table pointer to a Table object + * @param col id of the column [0 .. LV_TABLE_COL_MAX -1] + * @return width of the column + */ +lv_coord_t lv_table_get_col_width(lv_obj_t * obj, uint16_t col); + +/** + * Get whether a cell has the control bits + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + * @param ctrl OR-ed values from ::lv_table_cell_ctrl_t + * @return true: all control bits are set; false: not all control bits are set + */ +bool lv_table_has_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table_cell_ctrl_t ctrl); + +/** + * Get the selected cell (pressed and or focused) + * @param obj pointer to a table object + * @param row pointer to variable to store the selected row (LV_TABLE_CELL_NONE: if no cell selected) + * @param col pointer to variable to store the selected column (LV_TABLE_CELL_NONE: if no cell selected) + */ +void lv_table_get_selected_cell(lv_obj_t * obj, uint16_t * row, uint16_t * col); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TABLE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TABLE_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_textarea.c b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_textarea.c new file mode 100644 index 0000000..4d497e6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_textarea.c @@ -0,0 +1,1370 @@ +/** + * @file lv_ta.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_textarea.h" +#if LV_USE_TEXTAREA != 0 + +#include +#include "../misc/lv_assert.h" +#include "../core/lv_group.h" +#include "../core/lv_refr.h" +#include "../core/lv_indev.h" +#include "../draw/lv_draw.h" +#include "../misc/lv_anim.h" +#include "../misc/lv_txt.h" +#include "../misc/lv_math.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_textarea_class + +/*Test configuration*/ +#ifndef LV_TEXTAREA_DEF_CURSOR_BLINK_TIME + #define LV_TEXTAREA_DEF_CURSOR_BLINK_TIME 400 /*ms*/ +#endif + +#ifndef LV_TEXTAREA_DEF_PWD_SHOW_TIME + #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ +#endif + +#define LV_TEXTAREA_PWD_BULLET_UNICODE 0x2022 +#define IGNORE_KERNING '\0' + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_textarea_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_textarea_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_textarea_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void label_event_cb(lv_event_t * e); +static void cursor_blink_anim_cb(void * obj, int32_t show); +static void pwd_char_hider_anim(void * obj, int32_t x); +static void pwd_char_hider_anim_ready(lv_anim_t * a); +static void pwd_char_hider(lv_obj_t * obj); +static bool char_is_accepted(lv_obj_t * obj, uint32_t c); +static void start_cursor_blink(lv_obj_t * obj); +static void refr_cursor_area(lv_obj_t * obj); +static void update_cursor_position_on_click(lv_event_t * e); +static lv_res_t insert_handler(lv_obj_t * obj, const char * txt); +static void draw_placeholder(lv_event_t * e); +static void draw_cursor(lv_event_t * e); +static void auto_hide_characters(lv_obj_t * obj); +static inline bool is_valid_but_non_printable_char(const uint32_t letter); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_textarea_class = { + .constructor_cb = lv_textarea_constructor, + .destructor_cb = lv_textarea_destructor, + .event_cb = lv_textarea_event, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .width_def = LV_DPI_DEF * 2, + .height_def = LV_DPI_DEF, + .instance_size = sizeof(lv_textarea_t), + .base_class = &lv_obj_class +}; + +static const char * ta_insert_replace; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_textarea_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*====================== + * Add/remove functions + *=====================*/ + +void lv_textarea_add_char(lv_obj_t * obj, uint32_t c) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + if(ta->one_line && (c == '\n' || c == '\r')) { + LV_LOG_INFO("Text area: line break ignored in one-line mode"); + return; + } + + uint32_t u32_buf[2]; + u32_buf[0] = c; + u32_buf[1] = 0; + + const char * letter_buf = (char *)&u32_buf; + +#if LV_BIG_ENDIAN_SYSTEM + if(c != 0) while(*letter_buf == 0) ++letter_buf; +#endif + + lv_res_t res = insert_handler(obj, letter_buf); + if(res != LV_RES_OK) return; + + uint32_t c_uni = _lv_txt_encoded_next((const char *)&c, NULL); + + if(char_is_accepted(obj, c_uni) == false) { + LV_LOG_INFO("Character is not accepted by the text area (too long text or not in the accepted list)"); + return; + } + + if(ta->pwd_mode) pwd_char_hider(obj); /*Make sure all the current text contains only '*'*/ + + /*If the textarea is empty, invalidate it to hide the placeholder*/ + if(ta->placeholder_txt) { + const char * txt = lv_label_get_text(ta->label); + if(txt[0] == '\0') lv_obj_invalidate(obj); + } + + lv_label_ins_text(ta->label, ta->cursor.pos, letter_buf); /*Insert the character*/ + lv_textarea_clear_selection(obj); /*Clear selection*/ + + if(ta->pwd_mode) { + /*+2: the new char + \0*/ + size_t realloc_size = strlen(ta->pwd_tmp) + strlen(letter_buf) + 1; + ta->pwd_tmp = lv_mem_realloc(ta->pwd_tmp, realloc_size); + LV_ASSERT_MALLOC(ta->pwd_tmp); + if(ta->pwd_tmp == NULL) return; + + _lv_txt_ins(ta->pwd_tmp, ta->cursor.pos, (const char *)letter_buf); + + /*Auto hide characters*/ + auto_hide_characters(obj); + } + + /*Move the cursor after the new character*/ + lv_textarea_set_cursor_pos(obj, lv_textarea_get_cursor_pos(obj) + 1); + + lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL); +} + +void lv_textarea_add_text(lv_obj_t * obj, const char * txt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(txt); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + if(ta->pwd_mode) pwd_char_hider(obj); /*Make sure all the current text contains only '*'*/ + + /*Add the character one-by-one if not all characters are accepted or there is character limit.*/ + if(lv_textarea_get_accepted_chars(obj) || lv_textarea_get_max_length(obj)) { + uint32_t i = 0; + while(txt[i] != '\0') { + uint32_t c = _lv_txt_encoded_next(txt, &i); + lv_textarea_add_char(obj, _lv_txt_unicode_to_encoded(c)); + } + return; + } + + lv_res_t res = insert_handler(obj, txt); + if(res != LV_RES_OK) return; + + /*If the textarea is empty, invalidate it to hide the placeholder*/ + if(ta->placeholder_txt) { + const char * txt_act = lv_label_get_text(ta->label); + if(txt_act[0] == '\0') lv_obj_invalidate(obj); + } + + /*Insert the text*/ + lv_label_ins_text(ta->label, ta->cursor.pos, txt); + lv_textarea_clear_selection(obj); + + if(ta->pwd_mode) { + size_t realloc_size = strlen(ta->pwd_tmp) + strlen(txt) + 1; + ta->pwd_tmp = lv_mem_realloc(ta->pwd_tmp, realloc_size); + LV_ASSERT_MALLOC(ta->pwd_tmp); + if(ta->pwd_tmp == NULL) return; + + _lv_txt_ins(ta->pwd_tmp, ta->cursor.pos, txt); + + /*Auto hide characters*/ + auto_hide_characters(obj); + } + + /*Move the cursor after the new text*/ + lv_textarea_set_cursor_pos(obj, lv_textarea_get_cursor_pos(obj) + _lv_txt_get_encoded_length(txt)); + + lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL); +} + +void lv_textarea_del_char(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + uint32_t cur_pos = ta->cursor.pos; + + if(cur_pos == 0) return; + + char del_buf[2] = {LV_KEY_DEL, '\0'}; + + lv_res_t res = insert_handler(obj, del_buf); + if(res != LV_RES_OK) return; + + char * label_txt = lv_label_get_text(ta->label); + + /*Delete a character*/ + _lv_txt_cut(label_txt, ta->cursor.pos - 1, 1); + + /*Refresh the label*/ + lv_label_set_text(ta->label, label_txt); + lv_textarea_clear_selection(obj); + + /*If the textarea became empty, invalidate it to hide the placeholder*/ + if(ta->placeholder_txt) { + const char * txt = lv_label_get_text(ta->label); + if(txt[0] == '\0') lv_obj_invalidate(obj); + } + + if(ta->pwd_mode) { + _lv_txt_cut(ta->pwd_tmp, ta->cursor.pos - 1, 1); + + ta->pwd_tmp = lv_mem_realloc(ta->pwd_tmp, strlen(ta->pwd_tmp) + 1); + LV_ASSERT_MALLOC(ta->pwd_tmp); + if(ta->pwd_tmp == NULL) return; + } + + /*Move the cursor to the place of the deleted character*/ + lv_textarea_set_cursor_pos(obj, ta->cursor.pos - 1); + + lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL); + +} + +void lv_textarea_del_char_forward(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + uint32_t cp = lv_textarea_get_cursor_pos(obj); + lv_textarea_set_cursor_pos(obj, cp + 1); + if(cp != lv_textarea_get_cursor_pos(obj)) lv_textarea_del_char(obj); +} + +/*===================== + * Setter functions + *====================*/ + +void lv_textarea_set_text(lv_obj_t * obj, const char * txt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(txt); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + /*Clear the existing selection*/ + lv_textarea_clear_selection(obj); + + /*Add the character one-by-one if not all characters are accepted or there is character limit.*/ + if(lv_textarea_get_accepted_chars(obj) || lv_textarea_get_max_length(obj)) { + lv_label_set_text(ta->label, ""); + lv_textarea_set_cursor_pos(obj, LV_TEXTAREA_CURSOR_LAST); + if(ta->pwd_mode) { + ta->pwd_tmp[0] = '\0'; /*Clear the password too*/ + } + uint32_t i = 0; + while(txt[i] != '\0') { + uint32_t c = _lv_txt_encoded_next(txt, &i); + lv_textarea_add_char(obj, _lv_txt_unicode_to_encoded(c)); + } + } + else { + lv_label_set_text(ta->label, txt); + lv_textarea_set_cursor_pos(obj, LV_TEXTAREA_CURSOR_LAST); + } + + /*If the textarea is empty, invalidate it to hide the placeholder*/ + if(ta->placeholder_txt) { + const char * txt_act = lv_label_get_text(ta->label); + if(txt_act[0] == '\0') lv_obj_invalidate(obj); + } + + if(ta->pwd_mode) { + ta->pwd_tmp = lv_mem_realloc(ta->pwd_tmp, strlen(txt) + 1); + LV_ASSERT_MALLOC(ta->pwd_tmp); + if(ta->pwd_tmp == NULL) return; + strcpy(ta->pwd_tmp, txt); + + /*Auto hide characters*/ + auto_hide_characters(obj); + } + + lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL); +} + +void lv_textarea_set_placeholder_text(lv_obj_t * obj, const char * txt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(txt); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + size_t txt_len = strlen(txt); + if((txt_len == 0) && (ta->placeholder_txt)) { + lv_mem_free(ta->placeholder_txt); + ta->placeholder_txt = NULL; + } + else { + /*Allocate memory for the placeholder_txt text*/ + /*NOTE: Using special realloc behavior, malloc-like when data_p is NULL*/ + ta->placeholder_txt = lv_mem_realloc(ta->placeholder_txt, txt_len + 1); + LV_ASSERT_MALLOC(ta->placeholder_txt); + if(ta->placeholder_txt == NULL) { + LV_LOG_ERROR("lv_textarea_set_placeholder_text: couldn't allocate memory for placeholder"); + return; + } + + strcpy(ta->placeholder_txt, txt); + ta->placeholder_txt[txt_len] = '\0'; + } + + lv_obj_invalidate(obj); +} + +void lv_textarea_set_cursor_pos(lv_obj_t * obj, int32_t pos) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + if((uint32_t)ta->cursor.pos == (uint32_t)pos) return; + + uint32_t len = _lv_txt_get_encoded_length(lv_label_get_text(ta->label)); + + if(pos < 0) pos = len + pos; + + if(pos > (int32_t)len || pos == LV_TEXTAREA_CURSOR_LAST) pos = len; + + ta->cursor.pos = pos; + + /*Position the label to make the cursor visible*/ + lv_obj_update_layout(obj); + + lv_point_t cur_pos; + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_label_get_letter_pos(ta->label, pos, &cur_pos); + + /*The text area needs to have it's final size to see if the cursor is out of the area or not*/ + + /*Check the top*/ + lv_coord_t font_h = lv_font_get_line_height(font); + if(cur_pos.y < lv_obj_get_scroll_top(obj)) { + lv_obj_scroll_to_y(obj, cur_pos.y, LV_ANIM_ON); + } + /*Check the bottom*/ + lv_coord_t h = lv_obj_get_content_height(obj); + if(cur_pos.y + font_h - lv_obj_get_scroll_top(obj) > h) { + lv_obj_scroll_to_y(obj, cur_pos.y - h + font_h, LV_ANIM_ON); + } + + /*Check the left*/ + if(cur_pos.x < lv_obj_get_scroll_left(obj)) { + lv_obj_scroll_to_x(obj, cur_pos.x, LV_ANIM_ON); + } + /*Check the right*/ + lv_coord_t w = lv_obj_get_content_width(obj); + if(cur_pos.x + font_h - lv_obj_get_scroll_left(obj) > w) { + lv_obj_scroll_to_x(obj, cur_pos.x - w + font_h, LV_ANIM_ON); + } + + ta->cursor.valid_x = cur_pos.x; + + start_cursor_blink(obj); + + refr_cursor_area(obj); +} + +void lv_textarea_set_cursor_click_pos(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + ta->cursor.click_pos = en ? 1U : 0U; +} + +void lv_textarea_set_password_mode(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + if(ta->pwd_mode == en) return; + + ta->pwd_mode = en ? 1U : 0U; + /*Pwd mode is now enabled*/ + if(en) { + char * txt = lv_label_get_text(ta->label); + size_t len = strlen(txt); + + ta->pwd_tmp = lv_mem_alloc(len + 1); + LV_ASSERT_MALLOC(ta->pwd_tmp); + if(ta->pwd_tmp == NULL) return; + + strcpy(ta->pwd_tmp, txt); + + pwd_char_hider(obj); + + lv_textarea_clear_selection(obj); + } + /*Pwd mode is now disabled*/ + else { + lv_textarea_clear_selection(obj); + lv_label_set_text(ta->label, ta->pwd_tmp); + lv_mem_free(ta->pwd_tmp); + ta->pwd_tmp = NULL; + } + + refr_cursor_area(obj); +} + +void lv_textarea_set_password_bullet(lv_obj_t * obj, const char * bullet) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(bullet); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + if(!bullet && (ta->pwd_bullet)) { + lv_mem_free(ta->pwd_bullet); + ta->pwd_bullet = NULL; + } + else { + size_t txt_len = strlen(bullet); + + /*Allocate memory for the pwd_bullet text*/ + /*NOTE: Using special realloc behavior, malloc-like when data_p is NULL*/ + ta->pwd_bullet = lv_mem_realloc(ta->pwd_bullet, txt_len + 1); + LV_ASSERT_MALLOC(ta->pwd_bullet); + if(ta->pwd_bullet == NULL) { + LV_LOG_ERROR("lv_textarea_set_password_bullet: couldn't allocate memory for bullet"); + return; + } + + strcpy(ta->pwd_bullet, bullet); + ta->pwd_bullet[txt_len] = '\0'; + } + + lv_obj_invalidate(obj); +} + +void lv_textarea_set_one_line(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + if(ta->one_line == en) return; + + ta->one_line = en ? 1U : 0U; + lv_coord_t width = en ? LV_SIZE_CONTENT : lv_pct(100); + lv_coord_t min_width_value = en ? lv_pct(100) : 0; + + lv_obj_set_width(ta->label, width); + lv_obj_set_style_min_width(ta->label, min_width_value, 0); + + if(en) { + lv_obj_set_height(obj, LV_SIZE_CONTENT); + } + else { + lv_obj_remove_local_style_prop(obj, LV_STYLE_HEIGHT, LV_PART_MAIN); + } + + lv_obj_scroll_to(obj, 0, 0, LV_ANIM_OFF); +} + +void lv_textarea_set_accepted_chars(lv_obj_t * obj, const char * list) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + ta->accepted_chars = list; +} + +void lv_textarea_set_max_length(lv_obj_t * obj, uint32_t num) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + ta->max_length = num; +} + +void lv_textarea_set_insert_replace(lv_obj_t * obj, const char * txt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + LV_UNUSED(obj); + ta_insert_replace = txt; +} + +void lv_textarea_set_text_selection(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_textarea_t * ta = (lv_textarea_t *)obj; + + ta->text_sel_en = en; + + if(!en) lv_textarea_clear_selection(obj); +#else + LV_UNUSED(obj); /*Unused*/ + LV_UNUSED(en); /*Unused*/ +#endif +} + +void lv_textarea_set_password_show_time(lv_obj_t * obj, uint16_t time) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + ta->pwd_show_time = time; +} + +void lv_textarea_set_align(lv_obj_t * obj, lv_text_align_t align) +{ + LV_LOG_WARN("Deprecated: use the normal text_align style property instead"); + lv_obj_set_style_text_align(obj, align, 0); + + switch(align) { + default: + case LV_TEXT_ALIGN_LEFT: + lv_obj_align(lv_textarea_get_label(obj), LV_ALIGN_TOP_LEFT, 0, 0); + break; + case LV_TEXT_ALIGN_RIGHT: + lv_obj_align(lv_textarea_get_label(obj), LV_ALIGN_TOP_RIGHT, 0, 0); + break; + case LV_TEXT_ALIGN_CENTER: + lv_obj_align(lv_textarea_get_label(obj), LV_ALIGN_TOP_MID, 0, 0); + break; + } +} + +/*===================== + * Getter functions + *====================*/ + +const char * lv_textarea_get_text(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + const char * txt; + if(ta->pwd_mode == 0) { + txt = lv_label_get_text(ta->label); + } + else { + txt = ta->pwd_tmp; + } + + return txt; +} + +const char * lv_textarea_get_placeholder_text(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + if(ta->placeholder_txt) return ta->placeholder_txt; + else return ""; +} + +lv_obj_t * lv_textarea_get_label(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + return ta->label; +} + +uint32_t lv_textarea_get_cursor_pos(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + return ta->cursor.pos; +} + +bool lv_textarea_get_cursor_click_pos(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + return ta->cursor.click_pos ? true : false; +} + +bool lv_textarea_get_password_mode(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + return ta->pwd_mode == 1U; +} + +const char * lv_textarea_get_password_bullet(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + if(ta->pwd_bullet) return ta->pwd_bullet; + + lv_font_glyph_dsc_t g; + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + + /*If the textarea's font has the bullet character use it else fallback to "*"*/ + if(lv_font_get_glyph_dsc(font, &g, LV_TEXTAREA_PWD_BULLET_UNICODE, 0)) + return LV_SYMBOL_BULLET; + return "*"; +} + +bool lv_textarea_get_one_line(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + return ta->one_line == 1U; +} + +const char * lv_textarea_get_accepted_chars(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + return ta->accepted_chars; +} + +uint32_t lv_textarea_get_max_length(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + return ta->max_length; +} + +bool lv_textarea_text_is_selected(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_textarea_t * ta = (lv_textarea_t *)obj; + + if((lv_label_get_text_selection_start(ta->label) != LV_DRAW_LABEL_NO_TXT_SEL || + lv_label_get_text_selection_end(ta->label) != LV_DRAW_LABEL_NO_TXT_SEL)) { + return true; + } + else { + return false; + } +#else + LV_UNUSED(obj); /*Unused*/ + return false; +#endif +} + +bool lv_textarea_get_text_selection(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_textarea_t * ta = (lv_textarea_t *)obj; + return ta->text_sel_en; +#else + LV_UNUSED(obj); /*Unused*/ + return false; +#endif +} + +uint16_t lv_textarea_get_password_show_time(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + return ta->pwd_show_time; +} + +/*===================== + * Other functions + *====================*/ + +void lv_textarea_clear_selection(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_textarea_t * ta = (lv_textarea_t *)obj; + + if(lv_label_get_text_selection_start(ta->label) != LV_DRAW_LABEL_NO_TXT_SEL || + lv_label_get_text_selection_end(ta->label) != LV_DRAW_LABEL_NO_TXT_SEL) { + lv_label_set_text_sel_start(ta->label, LV_DRAW_LABEL_NO_TXT_SEL); + lv_label_set_text_sel_end(ta->label, LV_DRAW_LABEL_NO_TXT_SEL); + } +#else + LV_UNUSED(obj); /*Unused*/ +#endif +} + +void lv_textarea_cursor_right(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + uint32_t cp = lv_textarea_get_cursor_pos(obj); + cp++; + lv_textarea_set_cursor_pos(obj, cp); +} + +void lv_textarea_cursor_left(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + uint32_t cp = lv_textarea_get_cursor_pos(obj); + if(cp > 0) { + cp--; + lv_textarea_set_cursor_pos(obj, cp); + } +} + +void lv_textarea_cursor_down(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + lv_point_t pos; + + /*Get the position of the current letter*/ + lv_label_get_letter_pos(ta->label, lv_textarea_get_cursor_pos(obj), &pos); + + /*Increment the y with one line and keep the valid x*/ + + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_coord_t font_h = lv_font_get_line_height(font); + pos.y += font_h + line_space + 1; + pos.x = ta->cursor.valid_x; + + /*Do not go below the last line*/ + if(pos.y < lv_obj_get_height(ta->label)) { + /*Get the letter index on the new cursor position and set it*/ + uint32_t new_cur_pos = lv_label_get_letter_on(ta->label, &pos); + + lv_coord_t cur_valid_x_tmp = ta->cursor.valid_x; /*Cursor position set overwrites the valid position*/ + lv_textarea_set_cursor_pos(obj, new_cur_pos); + ta->cursor.valid_x = cur_valid_x_tmp; + } +} + +void lv_textarea_cursor_up(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + lv_point_t pos; + + /*Get the position of the current letter*/ + lv_label_get_letter_pos(ta->label, lv_textarea_get_cursor_pos(obj), &pos); + + /*Decrement the y with one line and keep the valid x*/ + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_coord_t font_h = lv_font_get_line_height(font); + pos.y -= font_h + line_space - 1; + pos.x = ta->cursor.valid_x; + + /*Get the letter index on the new cursor position and set it*/ + uint32_t new_cur_pos = lv_label_get_letter_on(ta->label, &pos); + lv_coord_t cur_valid_x_tmp = ta->cursor.valid_x; /*Cursor position set overwrites the valid position*/ + lv_textarea_set_cursor_pos(obj, new_cur_pos); + ta->cursor.valid_x = cur_valid_x_tmp; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_textarea_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + ta->pwd_mode = 0; + ta->pwd_tmp = NULL; + ta->pwd_bullet = NULL; + ta->pwd_show_time = LV_TEXTAREA_DEF_PWD_SHOW_TIME; + ta->accepted_chars = NULL; + ta->max_length = 0; + ta->cursor.show = 1; + /*It will be set to zero later (with zero value lv_textarea_set_cursor_pos(obj, 0); wouldn't do anything as there is no difference)*/ + ta->cursor.pos = 1; + ta->cursor.click_pos = 1; + ta->cursor.valid_x = 0; + ta->one_line = 0; +#if LV_LABEL_TEXT_SELECTION + ta->text_sel_en = 0; +#endif + ta->label = NULL; + ta->placeholder_txt = NULL; + + ta->label = lv_label_create(obj); + lv_obj_set_width(ta->label, lv_pct(100)); + lv_label_set_text(ta->label, ""); + lv_obj_add_event_cb(ta->label, label_event_cb, LV_EVENT_ALL, NULL); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + lv_textarea_set_cursor_pos(obj, 0); + + start_cursor_blink(obj); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_textarea_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + if(ta->pwd_tmp != NULL) { + lv_mem_free(ta->pwd_tmp); + ta->pwd_tmp = NULL; + } + if(ta->pwd_bullet != NULL) { + lv_mem_free(ta->pwd_bullet); + ta->pwd_bullet = NULL; + } + if(ta->placeholder_txt != NULL) { + lv_mem_free(ta->placeholder_txt); + ta->placeholder_txt = NULL; + } +} + +static void lv_textarea_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_res_t res; + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RES_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_target(e); + + if(code == LV_EVENT_FOCUSED) { + start_cursor_blink(obj); + } + else if(code == LV_EVENT_KEY) { + uint32_t c = *((uint32_t *)lv_event_get_param(e)); /*uint32_t because can be UTF-8*/ + if(c == LV_KEY_RIGHT) + lv_textarea_cursor_right(obj); + else if(c == LV_KEY_LEFT) + lv_textarea_cursor_left(obj); + else if(c == LV_KEY_UP) + lv_textarea_cursor_up(obj); + else if(c == LV_KEY_DOWN) + lv_textarea_cursor_down(obj); + else if(c == LV_KEY_BACKSPACE) + lv_textarea_del_char(obj); + else if(c == LV_KEY_DEL) + lv_textarea_del_char_forward(obj); + else if(c == LV_KEY_HOME) + lv_textarea_set_cursor_pos(obj, 0); + else if(c == LV_KEY_END) + lv_textarea_set_cursor_pos(obj, LV_TEXTAREA_CURSOR_LAST); + else if(c == LV_KEY_ENTER && lv_textarea_get_one_line(obj)) + lv_event_send(obj, LV_EVENT_READY, NULL); + else { + lv_textarea_add_char(obj, c); + } + } + else if(code == LV_EVENT_PRESSED || code == LV_EVENT_PRESSING || code == LV_EVENT_PRESS_LOST || + code == LV_EVENT_RELEASED) { + update_cursor_position_on_click(e); + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_placeholder(e); + } + else if(code == LV_EVENT_DRAW_POST) { + draw_cursor(e); + } +} + +static void label_event_cb(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * label = lv_event_get_target(e); + lv_obj_t * ta = lv_obj_get_parent(label); + + if(code == LV_EVENT_STYLE_CHANGED || code == LV_EVENT_SIZE_CHANGED) { + lv_label_set_text(label, NULL); + refr_cursor_area(ta); + start_cursor_blink(ta); + } +} + + + +/** + * Called to blink the cursor + * @param ta pointer to a text area + * @param hide 1: hide the cursor, 0: show it + */ +static void cursor_blink_anim_cb(void * obj, int32_t show) +{ + lv_textarea_t * ta = (lv_textarea_t *)obj; + if(show != ta->cursor.show) { + ta->cursor.show = show ? 1U : 0U; + lv_area_t area_tmp; + lv_area_copy(&area_tmp, &ta->cursor.area); + area_tmp.x1 += ta->label->coords.x1; + area_tmp.y1 += ta->label->coords.y1; + area_tmp.x2 += ta->label->coords.x1; + area_tmp.y2 += ta->label->coords.y1; + lv_obj_invalidate_area(obj, &area_tmp); + } +} + +/** + * Dummy function to animate char hiding in pwd mode. + * Does nothing, but a function is required in car hiding anim. + * (pwd_char_hider callback do the real job) + * @param ta unused + * @param x unused + */ +static void pwd_char_hider_anim(void * obj, int32_t x) +{ + LV_UNUSED(obj); + LV_UNUSED(x); +} + +/** + * Call when an animation is ready to convert all characters to '*' + * @param a pointer to the animation + */ +static void pwd_char_hider_anim_ready(lv_anim_t * a) +{ + lv_obj_t * obj = a->var; + pwd_char_hider(obj); +} + +/** + * Hide all characters (convert them to '*') + * @param ta pointer to text area object + */ +static void pwd_char_hider(lv_obj_t * obj) +{ + lv_textarea_t * ta = (lv_textarea_t *)obj; + if(ta->pwd_mode == 0) { + return; + } + + /* When ta->label is empty we get 0 back */ + char * txt = lv_label_get_text(ta->label); + uint32_t enc_len = _lv_txt_get_encoded_length(txt); + if(enc_len == 0) return; + + const char * bullet = lv_textarea_get_password_bullet(obj); + const size_t bullet_len = strlen(bullet); + char * txt_tmp = lv_mem_buf_get(enc_len * bullet_len + 1); + + uint32_t i; + for(i = 0; i < enc_len; i++) { + lv_memcpy(&txt_tmp[i * bullet_len], bullet, bullet_len); + } + txt_tmp[i * bullet_len] = '\0'; + + lv_label_set_text(ta->label, txt_tmp); + lv_mem_buf_release(txt_tmp); + + refr_cursor_area(obj); +} + +/** + * Test a unicode character if it is accepted or not. Checks max length and accepted char list. + * @param ta pointer to a test area object + * @param c a unicode character + * @return true: accepted; false: rejected + */ +static bool char_is_accepted(lv_obj_t * obj, uint32_t c) +{ + lv_textarea_t * ta = (lv_textarea_t *)obj; + + /*Too many characters?*/ + if(ta->max_length > 0 && _lv_txt_get_encoded_length(lv_textarea_get_text(obj)) >= ta->max_length) { + return false; + } + + if(ta->accepted_chars == NULL || ta->accepted_chars[0] == '\0') return true; + /*Accepted character?*/ + uint32_t i = 0; + + while(ta->accepted_chars[i] != '\0') { + uint32_t a = _lv_txt_encoded_next(ta->accepted_chars, &i); + if(a == c) return true; /*Accepted*/ + } + + return false; /*The character wasn't in the list*/ +} + +static void start_cursor_blink(lv_obj_t * obj) +{ + lv_textarea_t * ta = (lv_textarea_t *)obj; + uint32_t blink_time = lv_obj_get_style_anim_time(obj, LV_PART_CURSOR); + if(blink_time == 0) { + lv_anim_del(obj, cursor_blink_anim_cb); + ta->cursor.show = 1; + } + else { + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, ta); + lv_anim_set_exec_cb(&a, cursor_blink_anim_cb); + lv_anim_set_time(&a, blink_time); + lv_anim_set_playback_time(&a, blink_time); + lv_anim_set_values(&a, 1, 0); + lv_anim_set_path_cb(&a, lv_anim_path_step); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + lv_anim_start(&a); + } +} + +static void refr_cursor_area(lv_obj_t * obj) +{ + lv_textarea_t * ta = (lv_textarea_t *)obj; + + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_coord_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + + uint32_t cur_pos = lv_textarea_get_cursor_pos(obj); + const char * txt = lv_label_get_text(ta->label); + + uint32_t byte_pos = _lv_txt_encoded_get_byte_id(txt, cur_pos); + uint32_t letter = _lv_txt_encoded_next(&txt[byte_pos], NULL); + + /* Letter height and width */ + const lv_coord_t letter_h = lv_font_get_line_height(font); + /*Set letter_w (set not 0 on non printable but valid chars)*/ + uint32_t letter_space = letter; + if(is_valid_but_non_printable_char(letter)) { + letter_space = ' '; + } + lv_coord_t letter_w = lv_font_get_glyph_width(font, letter_space, IGNORE_KERNING); + + lv_point_t letter_pos; + lv_label_get_letter_pos(ta->label, cur_pos, &letter_pos); + + lv_text_align_t align = lv_obj_calculate_style_text_align(ta->label, LV_PART_MAIN, lv_label_get_text(ta->label)); + + /*If the cursor is out of the text (most right) draw it to the next line*/ + if(((letter_pos.x + ta->label->coords.x1) + letter_w > ta->label->coords.x2) && + (ta->one_line == 0 && align != LV_TEXT_ALIGN_RIGHT)) { + + letter_pos.x = 0; + letter_pos.y += letter_h + line_space; + + if(letter != '\0') { + byte_pos += _lv_txt_encoded_size(&txt[byte_pos]); + letter = _lv_txt_encoded_next(&txt[byte_pos], NULL); + } + + uint32_t tmp = letter; + if(is_valid_but_non_printable_char(letter)) { + tmp = ' '; + } + letter_w = lv_font_get_glyph_width(font, tmp, IGNORE_KERNING); + } + + /*Save the byte position. It is required to draw `LV_CURSOR_BLOCK`*/ + ta->cursor.txt_byte_pos = byte_pos; + + /*Calculate the cursor according to its type*/ + lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_CURSOR); + lv_coord_t top = lv_obj_get_style_pad_top(obj, LV_PART_CURSOR) + border_width; + lv_coord_t bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_CURSOR) + border_width; + lv_coord_t left = lv_obj_get_style_pad_left(obj, LV_PART_CURSOR) + border_width; + lv_coord_t right = lv_obj_get_style_pad_right(obj, LV_PART_CURSOR) + border_width; + + lv_area_t cur_area; + cur_area.x1 = letter_pos.x - left; + cur_area.y1 = letter_pos.y - top; + cur_area.x2 = letter_pos.x + right + letter_w - 1; + cur_area.y2 = letter_pos.y + bottom + letter_h - 1; + + /*Save the new area*/ + lv_area_t area_tmp; + lv_area_copy(&area_tmp, &ta->cursor.area); + area_tmp.x1 += ta->label->coords.x1; + area_tmp.y1 += ta->label->coords.y1; + area_tmp.x2 += ta->label->coords.x1; + area_tmp.y2 += ta->label->coords.y1; + lv_obj_invalidate_area(obj, &area_tmp); + + lv_area_copy(&ta->cursor.area, &cur_area); + + lv_area_copy(&area_tmp, &ta->cursor.area); + area_tmp.x1 += ta->label->coords.x1; + area_tmp.y1 += ta->label->coords.y1; + area_tmp.x2 += ta->label->coords.x1; + area_tmp.y2 += ta->label->coords.y1; + lv_obj_invalidate_area(obj, &area_tmp); +} + +static void update_cursor_position_on_click(lv_event_t * e) +{ + lv_indev_t * click_source = lv_indev_get_act(); + if(click_source == NULL) return; + + lv_obj_t * obj = lv_event_get_target(e); + lv_textarea_t * ta = (lv_textarea_t *)obj; + if(ta->cursor.click_pos == 0) return; + + if(lv_indev_get_type(click_source) == LV_INDEV_TYPE_KEYPAD || + lv_indev_get_type(click_source) == LV_INDEV_TYPE_ENCODER) { + return; + } + + lv_area_t label_coords; + lv_obj_get_coords(ta->label, &label_coords); + + lv_point_t point_act, vect_act; + lv_indev_get_point(click_source, &point_act); + lv_indev_get_vect(click_source, &vect_act); + + if(point_act.x < 0 || point_act.y < 0) return; /*Ignore event from keypad*/ + lv_point_t rel_pos; + rel_pos.x = point_act.x - label_coords.x1; + rel_pos.y = point_act.y - label_coords.y1; + + const lv_event_code_t code = lv_event_get_code(e); + + lv_coord_t label_width = lv_obj_get_width(ta->label); + uint16_t char_id_at_click = 0; + +#if LV_LABEL_TEXT_SELECTION + lv_label_t * label_data = (lv_label_t *)ta->label; + bool click_outside_label = false; + /*Check if the click happened on the left side of the area outside the label*/ + if(rel_pos.x < 0) { + char_id_at_click = 0; + click_outside_label = true; + } + /*Check if the click happened on the right side of the area outside the label*/ + else if(rel_pos.x >= label_width) { + char_id_at_click = LV_TEXTAREA_CURSOR_LAST; + click_outside_label = true; + } + else { + char_id_at_click = lv_label_get_letter_on(ta->label, &rel_pos); + click_outside_label = !lv_label_is_char_under_pos(ta->label, &rel_pos); + } + + if(ta->text_sel_en) { + if(!ta->text_sel_in_prog && !click_outside_label && code == LV_EVENT_PRESSED) { + /*Input device just went down. Store the selection start position*/ + ta->sel_start = char_id_at_click; + ta->sel_end = LV_LABEL_TEXT_SELECTION_OFF; + ta->text_sel_in_prog = 1; + lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN); + } + else if(ta->text_sel_in_prog && code == LV_EVENT_PRESSING) { + /*Input device may be moving. Store the end position*/ + ta->sel_end = char_id_at_click; + } + else if(ta->text_sel_in_prog && (code == LV_EVENT_PRESS_LOST || code == LV_EVENT_RELEASED)) { + /*Input device is released. Check if anything was selected.*/ + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN); + } + } + + if(ta->text_sel_in_prog || code == LV_EVENT_PRESSED) lv_textarea_set_cursor_pos(obj, char_id_at_click); + + if(ta->text_sel_in_prog) { + /*If the selected area has changed then update the real values and*/ + + /*Invalidate the text area.*/ + if(ta->sel_start > ta->sel_end) { + if(label_data->sel_start != ta->sel_end || label_data->sel_end != ta->sel_start) { + label_data->sel_start = ta->sel_end; + label_data->sel_end = ta->sel_start; + lv_obj_invalidate(obj); + } + } + else if(ta->sel_start < ta->sel_end) { + if(label_data->sel_start != ta->sel_start || label_data->sel_end != ta->sel_end) { + label_data->sel_start = ta->sel_start; + label_data->sel_end = ta->sel_end; + lv_obj_invalidate(obj); + } + } + else { + if(label_data->sel_start != LV_DRAW_LABEL_NO_TXT_SEL || label_data->sel_end != LV_DRAW_LABEL_NO_TXT_SEL) { + label_data->sel_start = LV_DRAW_LABEL_NO_TXT_SEL; + label_data->sel_end = LV_DRAW_LABEL_NO_TXT_SEL; + lv_obj_invalidate(obj); + } + } + /*Finish selection if necessary*/ + if(code == LV_EVENT_PRESS_LOST || code == LV_EVENT_RELEASED) { + ta->text_sel_in_prog = 0; + } + } +#else + /*Check if the click happened on the left side of the area outside the label*/ + if(rel_pos.x < 0) { + char_id_at_click = 0; + } + /*Check if the click happened on the right side of the area outside the label*/ + else if(rel_pos.x >= label_width) { + char_id_at_click = LV_TEXTAREA_CURSOR_LAST; + } + else { + char_id_at_click = lv_label_get_letter_on(ta->label, &rel_pos); + } + + if(code == LV_EVENT_PRESSED) lv_textarea_set_cursor_pos(obj, char_id_at_click); +#endif +} + +/* Returns LV_RES_OK when no operation were performed + * Returns LV_RES_INV when a user defined text was inserted */ +static lv_res_t insert_handler(lv_obj_t * obj, const char * txt) +{ + ta_insert_replace = NULL; + lv_event_send(obj, LV_EVENT_INSERT, (char *)txt); + + /* Drop txt if insert replace is set to '\0' */ + if(ta_insert_replace && ta_insert_replace[0] == '\0') + return LV_RES_INV; + + if(ta_insert_replace) { + /*Add the replaced text directly it's different from the original*/ + if(strcmp(ta_insert_replace, txt)) { + lv_textarea_add_text(obj, ta_insert_replace); + return LV_RES_INV; + } + } + + return LV_RES_OK; +} + +static void draw_placeholder(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + lv_textarea_t * ta = (lv_textarea_t *)obj; + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + const char * txt = lv_label_get_text(ta->label); + + /*Draw the place holder*/ + if(txt[0] == '\0' && ta->placeholder_txt && ta->placeholder_txt[0] != 0) { + lv_draw_label_dsc_t ph_dsc; + lv_draw_label_dsc_init(&ph_dsc); + lv_obj_init_draw_label_dsc(obj, LV_PART_TEXTAREA_PLACEHOLDER, &ph_dsc); + + if(ta->one_line) ph_dsc.flag |= LV_TEXT_FLAG_EXPAND; + + lv_coord_t left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + lv_coord_t top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_area_t ph_coords; + lv_area_copy(&ph_coords, &obj->coords); + lv_area_move(&ph_coords, left + border_width, top + border_width); + lv_draw_label(draw_ctx, &ph_dsc, &ph_coords, ta->placeholder_txt, NULL); + } +} + +static void draw_cursor(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + lv_textarea_t * ta = (lv_textarea_t *)obj; + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); + const char * txt = lv_label_get_text(ta->label); + + if(ta->cursor.show == 0) return; + + lv_draw_rect_dsc_t cur_dsc; + lv_draw_rect_dsc_init(&cur_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_CURSOR, &cur_dsc); + + /*Draw he cursor according to the type*/ + lv_area_t cur_area; + lv_area_copy(&cur_area, &ta->cursor.area); + + + cur_area.x1 += ta->label->coords.x1; + cur_area.y1 += ta->label->coords.y1; + cur_area.x2 += ta->label->coords.x1; + cur_area.y2 += ta->label->coords.y1; + + lv_draw_rect(draw_ctx, &cur_dsc, &cur_area); + + lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_CURSOR); + lv_coord_t left = lv_obj_get_style_pad_left(obj, LV_PART_CURSOR) + border_width; + lv_coord_t top = lv_obj_get_style_pad_top(obj, LV_PART_CURSOR) + border_width; + char letter_buf[8] = {0}; + lv_memcpy(letter_buf, &txt[ta->cursor.txt_byte_pos], _lv_txt_encoded_size(&txt[ta->cursor.txt_byte_pos])); + + cur_area.x1 += left; + cur_area.y1 += top; + + /*Draw the letter over the cursor only if + *the cursor has background or the letter has different color than the original. + *Else the original letter is drawn twice which makes it look bolder*/ + lv_color_t label_color = lv_obj_get_style_text_color(ta->label, 0); + lv_draw_label_dsc_t cur_label_dsc; + lv_draw_label_dsc_init(&cur_label_dsc); + lv_obj_init_draw_label_dsc(obj, LV_PART_CURSOR, &cur_label_dsc); + if(cur_dsc.bg_opa > LV_OPA_MIN || cur_label_dsc.color.full != label_color.full) { + lv_draw_label(draw_ctx, &cur_label_dsc, &cur_area, letter_buf, NULL); + } +} + +static void auto_hide_characters(lv_obj_t * obj) +{ + lv_textarea_t * ta = (lv_textarea_t *) obj; + + if(ta->pwd_show_time == 0) { + pwd_char_hider(obj); + } + else { + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, ta); + lv_anim_set_exec_cb(&a, pwd_char_hider_anim); + lv_anim_set_time(&a, ta->pwd_show_time); + lv_anim_set_values(&a, 0, 1); + lv_anim_set_path_cb(&a, lv_anim_path_step); + lv_anim_set_ready_cb(&a, pwd_char_hider_anim_ready); + lv_anim_start(&a); + } +} + +static inline bool is_valid_but_non_printable_char(const uint32_t letter) +{ + if(letter == '\0' || letter == '\n' || letter == '\r') { + return true; + } + + return false; +} + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_textarea.h b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_textarea.h new file mode 100644 index 0000000..4b3289b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_textarea.h @@ -0,0 +1,358 @@ +/** + * @file lv_textarea.h + * + */ + +#ifndef LV_TEXTAREA_H +#define LV_TEXTAREA_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#if LV_USE_TEXTAREA != 0 + +/*Testing of dependencies*/ +#if LV_USE_LABEL == 0 +#error "lv_ta: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1)" +#endif + +#include "../core/lv_obj.h" +#include "lv_label.h" + +/********************* + * DEFINES + *********************/ +#define LV_TEXTAREA_CURSOR_LAST (0x7FFF) /*Put the cursor after the last character*/ + +LV_EXPORT_CONST_INT(LV_TEXTAREA_CURSOR_LAST); + +/********************** + * TYPEDEFS + **********************/ + +/*Data of text area*/ +typedef struct { + lv_obj_t obj; + lv_obj_t * label; /*Label of the text area*/ + char * placeholder_txt; /*Place holder label. only visible if text is an empty string*/ + char * pwd_tmp; /*Used to store the original text in password mode*/ + char * pwd_bullet; /*Replacement characters displayed in password mode*/ + const char * accepted_chars; /*Only these characters will be accepted. NULL: accept all*/ + uint32_t max_length; /*The max. number of characters. 0: no limit*/ + uint16_t pwd_show_time; /*Time to show characters in password mode before change them to '*'*/ + struct { + lv_coord_t valid_x; /*Used when stepping up/down to a shorter line. + *(Used by the library)*/ + uint32_t pos; /*The current cursor position + *(0: before 1st letter; 1: before 2nd letter ...)*/ + lv_area_t area; /*Cursor area relative to the Text Area*/ + uint32_t txt_byte_pos; /*Byte index of the letter after (on) the cursor*/ + uint8_t show : 1; /*Cursor is visible now or not (Handled by the library)*/ + uint8_t click_pos : 1; /*1: Enable positioning the cursor by clicking the text area*/ + } cursor; +#if LV_LABEL_TEXT_SELECTION + uint32_t sel_start; /*Temporary values for text selection*/ + uint32_t sel_end; + uint8_t text_sel_in_prog : 1; /*User is in process of selecting*/ + uint8_t text_sel_en : 1; /*Text can be selected on this text area*/ +#endif + uint8_t pwd_mode : 1; /*Replace characters with '*'*/ + uint8_t one_line : 1; /*One line mode (ignore line breaks)*/ +} lv_textarea_t; + +extern const lv_obj_class_t lv_textarea_class; + +enum { + LV_PART_TEXTAREA_PLACEHOLDER = LV_PART_CUSTOM_FIRST, +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a text area object + * @param parent pointer to an object, it will be the parent of the new text area + * @return pointer to the created text area + */ +lv_obj_t * lv_textarea_create(lv_obj_t * parent); + +/*====================== + * Add/remove functions + *=====================*/ + +/** + * Insert a character to the current cursor position. + * To add a wide char, e.g. 'Ã' use `_lv_txt_encoded_conv_wc('Ã')` + * @param obj pointer to a text area object + * @param c a character (e.g. 'a') + */ +void lv_textarea_add_char(lv_obj_t * obj, uint32_t c); + +/** + * Insert a text to the current cursor position + * @param obj pointer to a text area object + * @param txt a '\0' terminated string to insert + */ +void lv_textarea_add_text(lv_obj_t * obj, const char * txt); + +/** + * Delete a the left character from the current cursor position + * @param obj pointer to a text area object + */ +void lv_textarea_del_char(lv_obj_t * obj); + +/** + * Delete the right character from the current cursor position + * @param obj pointer to a text area object + */ +void lv_textarea_del_char_forward(lv_obj_t * obj); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the text of a text area + * @param obj pointer to a text area object + * @param txt pointer to the text + */ +void lv_textarea_set_text(lv_obj_t * obj, const char * txt); + +/** + * Set the placeholder text of a text area + * @param obj pointer to a text area object + * @param txt pointer to the text + */ +void lv_textarea_set_placeholder_text(lv_obj_t * obj, const char * txt); + +/** + * Set the cursor position + * @param obj pointer to a text area object + * @param pos the new cursor position in character index + * < 0 : index from the end of the text + * LV_TEXTAREA_CURSOR_LAST: go after the last character + */ +void lv_textarea_set_cursor_pos(lv_obj_t * obj, int32_t pos); + +/** + * Enable/Disable the positioning of the cursor by clicking the text on the text area. + * @param obj pointer to a text area object + * @param en true: enable click positions; false: disable + */ +void lv_textarea_set_cursor_click_pos(lv_obj_t * obj, bool en); + +/** + * Enable/Disable password mode + * @param obj pointer to a text area object + * @param en true: enable, false: disable + */ +void lv_textarea_set_password_mode(lv_obj_t * obj, bool en); + +/** + * Set the replacement characters to show in password mode + * @param obj pointer to a text area object + * @param bullet pointer to the replacement text + */ +void lv_textarea_set_password_bullet(lv_obj_t * obj, const char * bullet); + +/** + * Configure the text area to one line or back to normal + * @param obj pointer to a text area object + * @param en true: one line, false: normal + */ +void lv_textarea_set_one_line(lv_obj_t * obj, bool en); + +/** + * Set a list of characters. Only these characters will be accepted by the text area + * @param obj pointer to a text area object + * @param list list of characters. Only the pointer is saved. E.g. "+-.,0123456789" + */ +void lv_textarea_set_accepted_chars(lv_obj_t * obj, const char * list); + +/** + * Set max length of a Text Area. + * @param obj pointer to a text area object + * @param num the maximal number of characters can be added (`lv_textarea_set_text` ignores it) + */ +void lv_textarea_set_max_length(lv_obj_t * obj, uint32_t num); + +/** + * In `LV_EVENT_INSERT` the text which planned to be inserted can be replaced by an other text. + * It can be used to add automatic formatting to the text area. + * @param obj pointer to a text area object + * @param txt pointer to a new string to insert. If `""` no text will be added. + * The variable must be live after the `event_cb` exists. (Should be `global` or `static`) + */ +void lv_textarea_set_insert_replace(lv_obj_t * obj, const char * txt); + +/** + * Enable/disable selection mode. + * @param obj pointer to a text area object + * @param en true or false to enable/disable selection mode + */ +void lv_textarea_set_text_selection(lv_obj_t * obj, bool en); + +/** + * Set how long show the password before changing it to '*' + * @param obj pointer to a text area object + * @param time show time in milliseconds. 0: hide immediately. + */ +void lv_textarea_set_password_show_time(lv_obj_t * obj, uint16_t time); + +/** + * Deprecated: use the normal text_align style property instead + * Set the label's alignment. + * It sets where the label is aligned (in one line mode it can be smaller than the text area) + * and how the lines of the area align in case of multiline text area + * @param obj pointer to a text area object + * @param align the align mode from ::lv_text_align_t + */ +void lv_textarea_set_align(lv_obj_t * obj, lv_text_align_t align); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the text of a text area. In password mode it gives the real text (not '*'s). + * @param obj pointer to a text area object + * @return pointer to the text + */ +const char * lv_textarea_get_text(const lv_obj_t * obj); + +/** + * Get the placeholder text of a text area + * @param obj pointer to a text area object + * @return pointer to the text + */ +const char * lv_textarea_get_placeholder_text(lv_obj_t * obj); + +/** + * Get the label of a text area + * @param obj pointer to a text area object + * @return pointer to the label object + */ +lv_obj_t * lv_textarea_get_label(const lv_obj_t * obj); + +/** + * Get the current cursor position in character index + * @param obj pointer to a text area object + * @return the cursor position + */ +uint32_t lv_textarea_get_cursor_pos(const lv_obj_t * obj); + +/** + * Get whether the cursor click positioning is enabled or not. + * @param obj pointer to a text area object + * @return true: enable click positions; false: disable + */ +bool lv_textarea_get_cursor_click_pos(lv_obj_t * obj); + +/** + * Get the password mode attribute + * @param obj pointer to a text area object + * @return true: password mode is enabled, false: disabled + */ +bool lv_textarea_get_password_mode(const lv_obj_t * obj); + +/** + * Get the replacement characters to show in password mode + * @param obj pointer to a text area object + * @return pointer to the replacement text + */ +const char * lv_textarea_get_password_bullet(lv_obj_t * obj); + +/** + * Get the one line configuration attribute + * @param obj pointer to a text area object + * @return true: one line configuration is enabled, false: disabled + */ +bool lv_textarea_get_one_line(const lv_obj_t * obj); + +/** + * Get a list of accepted characters. + * @param obj pointer to a text area object + * @return list of accented characters. + */ +const char * lv_textarea_get_accepted_chars(lv_obj_t * obj); + +/** + * Get max length of a Text Area. + * @param obj pointer to a text area object + * @return the maximal number of characters to be add + */ +uint32_t lv_textarea_get_max_length(lv_obj_t * obj); + +/** + * Find whether text is selected or not. + * @param obj pointer to a text area object + * @return whether text is selected or not + */ +bool lv_textarea_text_is_selected(const lv_obj_t * obj); + +/** + * Find whether selection mode is enabled. + * @param obj pointer to a text area object + * @return true: selection mode is enabled, false: disabled + */ +bool lv_textarea_get_text_selection(lv_obj_t * obj); + +/** + * Set how long show the password before changing it to '*' + * @param obj pointer to a text area object + * @return show time in milliseconds. 0: hide immediately. + */ +uint16_t lv_textarea_get_password_show_time(lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +/** + * Clear the selection on the text area. + * @param obj pointer to a text area object + */ +void lv_textarea_clear_selection(lv_obj_t * obj); + +/** + * Move the cursor one character right + * @param obj pointer to a text area object + */ +void lv_textarea_cursor_right(lv_obj_t * obj); + +/** + * Move the cursor one character left + * @param obj pointer to a text area object + */ +void lv_textarea_cursor_left(lv_obj_t * obj); + +/** + * Move the cursor one line down + * @param obj pointer to a text area object + */ +void lv_textarea_cursor_down(lv_obj_t * obj); + +/** + * Move the cursor one line up + * @param obj pointer to a text area object + */ +void lv_textarea_cursor_up(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TEXTAREA_H*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEXTAREA_H*/ diff --git a/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_widgets.mk b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_widgets.mk new file mode 100644 index 0000000..4e62dc5 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/LittlevGL/lvgl/src/widgets/lv_widgets.mk @@ -0,0 +1,20 @@ +CSRCS += lv_arc.c +CSRCS += lv_bar.c +CSRCS += lv_btn.c +CSRCS += lv_btnmatrix.c +CSRCS += lv_canvas.c +CSRCS += lv_checkbox.c +CSRCS += lv_dropdown.c +CSRCS += lv_img.c +CSRCS += lv_label.c +CSRCS += lv_line.c +CSRCS += lv_roller.c +CSRCS += lv_slider.c +CSRCS += lv_switch.c +CSRCS += lv_table.c +CSRCS += lv_textarea.c + +DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/widgets +VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/widgets + +CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/widgets" diff --git a/TSM_PicoW_Sensor/McuLib/MCUXpresso_CMakeLists.txt b/TSM_PicoW_Sensor/McuLib/MCUXpresso_CMakeLists.txt new file mode 100644 index 0000000..5dd3f2f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/MCUXpresso_CMakeLists.txt @@ -0,0 +1,151 @@ +# file: Collect all files that need to be compiled. +# You can use a GLOB function as shown here, or explicitly mention the specific files +#file(GLOB FILES *.c *.h) + +# add_subdirectory(LittlevGL) +# LittlevGL is *not* added here. Instead, add it to the main CMakeLists.txt +# add_subdirectory(../McuLib/LittlevGL build/McuLib/LittlevGL) +# and add it to the target_link_libraries +# ... +# McuLib +# lvglLib # LittlevGL library inside the McuLib + +file(GLOB MCULIBFILES + RNet/*.c + fonts/*.c + + src/McuArmTools.c + src/McuButton.c + src/McuCoverage.c + src/McuCRC_CreateTable.c + src/McuCRC_Generator.c + src/McuCriticalSection.c + src/McuDebounce.c + + src/McuEE24.c + src/McuEvents.c + src/McuExtRTC.c + src/McuESP32.c + src/McuFlash.c + src/McuFontDisplay.c + + src/McuGDisplaySSD1306.c + src/McuGenericI2C.c + src/McuGenericSWI2C.c + src/SDA1.c + src/SCL1.c + src/McuINA260.c + src/McuFXOS8700.c + src/McuGFont.c + src/McuGPIO.c + src/McuHardFault.c + src/McuI2cLib.c + src/McuI2cSpy.c + src/McuLED.c + src/McuLib.c + src/McuPCF85063A.c + src/McuLog.c + src/McuRB.c + src/McuRingBuffer.c + src/McuRTOS.c + src/McuRTT.c + + # SEGGER RTT + SEGGER_RTT/RTT_Syscalls_GCC.c + SEGGER_RTT/SEGGER_RTT_printf.c + SEGGER_RTT/SEGGER_RTT.c + + # SEGGER SystemView + SEGGER_Sysview/McuSystemView.c + SEGGER_Sysview/SEGGER_SYSVIEW.c + SEGGER_Sysview/SEGGER_SYSVIEW_Config_FreeRTOS.c + SEGGER_Sysview/SEGGER_SYSVIEW_FreeRTOS.c + + src/McuSemihost.c + src/McuShell.c + src/McuShellUart.c + src/McuSHT31.c + src/McuSHT40.c + src/McuSPI.c + src/McuSSD1306.c + src/McuST7735.c + src/McuTimeDate.c + src/McuTimeout.c + src/McuTrigger.c + src/McuUart485.c + src/McuUnity.c + src/McuULN2003.c + src/McuUtility.c + src/McuW25Q128.c + src/McuWait.c + src/McuWatchdog.c + src/McuX12_017.c + src/McuXFormat.c + + # FreeRTOS + # FreeRTOS/FreeRTOShooks.c # You need to have this one part of the application sources + FreeRTOS/Source/croutine.c + FreeRTOS/Source/event_groups.c + FreeRTOS/Source/list.c + FreeRTOS/Source/queue.c + FreeRTOS/Source/stream_buffer.c + FreeRTOS/Source/tasks.c + FreeRTOS/Source/timers.c + FreeRTOS/Source/portable/Common/mpu_wrappers.c + FreeRTOS/Source/portable/MemMang/heap_1.c + FreeRTOS/Source/portable/MemMang/heap_2.c + FreeRTOS/Source/portable/MemMang/heap_3.c + FreeRTOS/Source/portable/MemMang/heap_4.c + FreeRTOS/Source/portable/MemMang/heap_5.c + FreeRTOS/Source/portable/MemMang/heap_useNewlib.c + FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c + + # littleFS + littleFS/lfs_util.c + littleFS/lfs.c + littleFS/McuLittleFS.c + littleFS/McuLittleFSBlockDevice.c + + # MinINI + minIni/McuMinINI.c + minIni/minIni.c + minIni/minGlue-FatSs.c + minIni/minGlue-Flash.c + minIni/minGlue-LittleFS.c + + # Modbus + Modbus/McuHeidelberg.c + Modbus/McuModbus.c +) + +# add_library: With this declaration, you express the intent to build a library. +# The first argument is the name of the library, +# the second argument are the files that will be compiled to create your library. +add_library(McuLib OBJECT ${MCULIBFILES}) + +# target_link_libraries: If you link with other libraries, list them here +target_link_libraries( + McuLib + # lvglLib # see note above +) + +# target_include_directories: Libraries need to publish their header files +# so that you can import them in source code. This statement expresses where to find the files +# - typically in an include directory of your projects. +target_include_directories( + McuLib + PUBLIC + ./ + ./src/ + ./config/ + ./FreeRTOS/Source/include/ + ./FreeRTOS/Source/portable/GCC/ARM_CM4F/ + ./fonts/ + ./config/fonts/ + ./SEGGER_RTT/ + ./SEGGER_Sysview/ + ./MinIni + ./LittlevGL + ./Modbus + ./RNet + ) diff --git a/TSM_PicoW_Sensor/McuLib/McuLibVersion.h b/TSM_PicoW_Sensor/McuLib/McuLibVersion.h new file mode 100644 index 0000000..5d5c63c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/McuLibVersion.h @@ -0,0 +1,24 @@ +/** + * \file + * \brief Version information header file for MCU library + * Copyright (c) 2020-2024, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef SOURCES_MCULIBVERSION_H_ +#define SOURCES_MCULIBVERSION_H_ + +/* See + * https://github.com/ErichStyger/McuOnEclipseLibrary + * Date: 16-Dec-2024 + * Time: 08:04 + */ + +#define McuLib_VERSION_VERSION_MAJOR (1) + /*!< McuLib major version number */ +#define McuLib_VERSION_VERSION_MINOR (0) + /*!< McuLib minor version number */ +#define McuLib_VERSION_VERSION_BUILD (11) + /*!< McuLib build version number */ + +#endif /* SOURCES_MCULIBVERSION_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/Modbus/McuHeidelberg.c b/TSM_PicoW_Sensor/McuLib/Modbus/McuHeidelberg.c new file mode 100644 index 0000000..ebcafed --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/Modbus/McuHeidelberg.c @@ -0,0 +1,1451 @@ +/* + * Copyright (c) 2022-2023, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuLib.h" +#if McuLib_CONFIG_SDK_USE_FREERTOS + +#include "McuHeidelberg.h" +#include "McuHeidelberg_config.h" +#include "McuShell.h" +#include "McuUtility.h" +#include "McuModbus.h" +#include "McuRTOS.h" +#include "McuLog.h" +#if McuHeidelberg_CONFIG_USE_WATCHDOG + #include "McuWatchdog.h" +#endif + +typedef enum McuHeidelberg_AddrMap_e{ + McuHeidelberg_Addr_ModbusRegisterLayoutVersion = 4, + McuHeidelberg_Addr_ChargingState = 5, + McuHeidelberg_Addr_Current_L1 = 6, + McuHeidelberg_Addr_Current_L2 = 7, + McuHeidelberg_Addr_Current_L3 = 8, + McuHeidelberg_Addr_Temperature = 9, + McuHeidelberg_Addr_Voltage_L1 = 10, + McuHeidelberg_Addr_Voltage_L2 = 11, + McuHeidelberg_Addr_Voltage_L3 = 12, + McuHeidelberg_Addr_LockState = 13, + McuHeidelberg_Addr_Power = 14, + McuHeidelberg_Addr_EnergyPowerOn = 15, + McuHeidelberg_Addr_EnergyPowerOn_High = McuHeidelberg_Addr_EnergyPowerOn, + McuHeidelberg_Addr_EnergyPowerOn_Low = McuHeidelberg_Addr_EnergyPowerOn+1, + McuHeidelberg_Addr_Energy_Installation = 17, + McuHeidelberg_Addr_Energy_Installation_High = McuHeidelberg_Addr_Energy_Installation, + McuHeidelberg_Addr_Energy_Installation_Low = McuHeidelberg_Addr_Energy_Installation+1, + McuHeidelberg_Addr_MaxCurrent = 100, + McuHeidelberg_Addr_MinCurrent = 101, + McuHeidelberg_Addr_LogisticString = 102, + McuHeidelberg_Addr_LogisticString_Start = McuHeidelberg_Addr_LogisticString, + McuHeidelberg_Addr_LogisticString_End = 133, + McuHeidelberg_Addr_HardwareVariant = 200, + McuHeidelberg_Addr_AppSoftwareRevision = 203, + McuHeidelberg_Addr_WatchDogTimeout = 257, + McuHeidelberg_Addr_StandbyFunctionControl = 258, + McuHeidelberg_Addr_RemoteLock = 259, + McuHeidelberg_Addr_MaxCurrentCommand = 261, + McuHeidelberg_Addr_FailSafeCurrent = 262, + McuHeidelberg_Addr_SupportDiagnosticData = 300, + McuHeidelberg_Addr_SupportDiagnosticData_Start = McuHeidelberg_Addr_SupportDiagnosticData, + McuHeidelberg_Addr_SupportDiagnosticData_End = 318, + McuHeidelberg_Addr_ErrorMemory = 500, + McuHeidelberg_Addr_ErrorMemory_Start = McuHeidelberg_Addr_ErrorMemory, + McuHeidelberg_Addr_ErrorMemory_End = 819, +} McuHeidelberg_AddrMap_e; + +static const uint8_t McuHeidelberg_deviceID = 0x01; /* assigned Modbus ID/address */ + +/* state of the wallbox task */ +typedef enum WallboxTaskState_e { + Wallbox_TaskState_None, + Wallbox_TaskState_Connected, + Wallbox_TaskState_Vehicle_Plugged, + Wallbox_TaskState_Vehicle_Start_Charging, + Wallbox_TaskState_Vehicle_Charging, + Wallbox_TaskState_Vehicle_Stop_Charging, + Wallbox_TaskState_Error, +} WallboxTaskState_e; + +static struct McuHeidelbergInfo_s { + bool isActive; /* if unit is in standby or not */ + WallboxTaskState_e state; /* state of the wallbox task */ + McuHeidelberg_UserChargingMode_e userChargingMode; /* selected user charging mode */ + uint32_t solarPowerW; /* produced solar power in Watt */ + uint32_t sitePowerW; /* used power by the building or site, including charger */ + int32_t gridPowerW; /* (positive) power from or to the grid (negative) */ + int32_t batteryPowerW; /* battery power, positive: discharging, negative: charging */ + uint32_t maxCarPowerW; /* maximum charge power in Watt: used for charger 'I max' command */ + uint8_t nofPhases; /* number of active phases detected on the charger */ + McuHeidelberg_EventCallback eventCallback; /* registered callback for events */ + struct hw { /* wallbox hardware register values */ + uint16_t version; /* register layout version */ + uint16_t chargerState; /* wallbox charging state */ + uint16_t minCurrent; /* minimal current, as configured by the hardware switch, 6 A up to 16 A */ + uint16_t maxCurrent; /* maximal current, as configured by the hardware switch, 6 A up to 16 A */ + uint16_t current[3]; /* RMS current of the three phases, in 0.1 A units */ + int16_t temperature; /* PCB temperature, in 0.1 degree C */ + uint16_t voltage[3]; /* RMS voltage of the three phases, in 0.1 A units */ + uint16_t lockState; /* external lock */ + uint16_t power; /* sum of power of all three phases, calculated by the wallbox */ + uint32_t energySincePowerOn; /* energy since last standby or power-off */ + uint32_t energySinceInstallation; /* energy since installation */ + } hw; +} McuHeidelbergInfo; + +static SemaphoreHandle_t semNewSolarValue; /* binary semaphore to notify task about new solar PV value */ + +#if McuHeidelberg_CONFIG_USE_MOCK_WALLBOX +static struct mock { + uint16_t hwChargerState; /* mock value of wallbox charging state */ +} mock; +#endif + +static const unsigned char *McuHeidelberg_GetHWChargerStateString(McuHeidelbergChargerState_e state) { + const unsigned char *str; + switch(state) { + case McuHeidelberg_ChargerState_A1: str = (unsigned char*)"A1: no vehicle plugged, wallbox doesn't allow charging"; break; + case McuHeidelberg_ChargerState_A2: str = (unsigned char*)"A2: no vehicle plugged, wallbox allows charging"; break; + case McuHeidelberg_ChargerState_B1: str = (unsigned char*)"B1: vehicle plugged, no charging request, wallbox doesn't allow charging"; break; + case McuHeidelberg_ChargerState_B2: str = (unsigned char*)"B2: vehicle plugged, no charging request, wallbox allows charging"; break; + case McuHeidelberg_ChargerState_C1: str = (unsigned char*)"C1: vehicle plugged with charging request, wallbox doesn't allow charging"; break; + case McuHeidelberg_ChargerState_C2: str = (unsigned char*)"C2: vehicle plugged with charging request, wallbox allows charging"; break; + case McuHeidelberg_ChargerState_Derating: str = (unsigned char*)"--: derating"; break; + case McuHeidelberg_ChargerState_E: str = (unsigned char*)"E: error"; break; + case McuHeidelberg_ChargerState_F: str = (unsigned char*)"F: wallbox locked or not ready"; break; + case McuHeidelberg_ChargerState_Error: str = (unsigned char*)"--: Error"; break; + default: str = (unsigned char*)"ERROR, unknown state!"; break; + } + return str; +} + +const unsigned char *McuHeidelberg_GetShortHWChargerStateString(McuHeidelbergChargerState_e state) { + const unsigned char *str; + switch(state) { + case McuHeidelberg_ChargerState_A1: str = (unsigned char*)"A1"; break; + case McuHeidelberg_ChargerState_A2: str = (unsigned char*)"A2"; break; + case McuHeidelberg_ChargerState_B1: str = (unsigned char*)"B1"; break; + case McuHeidelberg_ChargerState_B2: str = (unsigned char*)"B2"; break; + case McuHeidelberg_ChargerState_C1: str = (unsigned char*)"C1"; break; + case McuHeidelberg_ChargerState_C2: str = (unsigned char*)"C2"; break; + case McuHeidelberg_ChargerState_Derating: str = (unsigned char*)"der"; break; + case McuHeidelberg_ChargerState_E: str = (unsigned char*)"E"; break; + case McuHeidelberg_ChargerState_F: str = (unsigned char*)"F"; break; + case McuHeidelberg_ChargerState_Error: str = (unsigned char*)"Err"; break; + default: str = (unsigned char*)"ERR"; break; + } + return str; +} + +static const unsigned char *McuHeidelberg_GetStateString(WallboxTaskState_e state) { + const unsigned char *str; + switch(state) { + case Wallbox_TaskState_None: str = (unsigned char*)"none"; break; + case Wallbox_TaskState_Connected: str = (unsigned char*)"connected"; break; + case Wallbox_TaskState_Vehicle_Plugged: str = (unsigned char*)"vehicle plugged"; break; + case Wallbox_TaskState_Vehicle_Start_Charging:str = (unsigned char*)"start charging"; break; + case Wallbox_TaskState_Vehicle_Charging: str = (unsigned char*)"vehicle charging"; break; + case Wallbox_TaskState_Vehicle_Stop_Charging: str = (unsigned char*)"stop charging"; break; + case Wallbox_TaskState_Error: str = (unsigned char*)"error"; break; + default: str = (unsigned char*)"ERROR, unknown state!"; break; + } + return str; +} + +static const unsigned char *McuHeidelberg_GetUserChargingModeString(McuHeidelberg_UserChargingMode_e mode) { + const unsigned char *str; + switch(mode) { + case McuHeidelberg_User_ChargingMode_Stop: str = (unsigned char*)"stop"; break; + case McuHeidelberg_User_ChargingMode_Fast: str = (unsigned char*)"fast"; break; + case McuHeidelberg_User_ChargingMode_Slow: str = (unsigned char*)"slow"; break; + case McuHeidelberg_User_ChargingMode_SlowPlusPV: str = (unsigned char*)"slow plus PV"; break; + case McuHeidelberg_User_ChargingMode_OnlyPV: str = (unsigned char*)"only PV"; break; + case McuHeidelberg_User_ChargingMode_6_Amp: str = (unsigned char*)"6 A"; break; + case McuHeidelberg_User_ChargingMode_7_Amp: str = (unsigned char*)"7 A"; break; + case McuHeidelberg_User_ChargingMode_8_Amp: str = (unsigned char*)"8 A"; break; + case McuHeidelberg_User_ChargingMode_9_Amp: str = (unsigned char*)"9 A"; break; + case McuHeidelberg_User_ChargingMode_10_Amp: str = (unsigned char*)"10 A"; break; + case McuHeidelberg_User_ChargingMode_11_Amp: str = (unsigned char*)"11 A"; break; + case McuHeidelberg_User_ChargingMode_12_Amp: str = (unsigned char*)"12 A"; break; + case McuHeidelberg_User_ChargingMode_13_Amp: str = (unsigned char*)"13 A"; break; + case McuHeidelberg_User_ChargingMode_14_Amp: str = (unsigned char*)"14 A"; break; + case McuHeidelberg_User_ChargingMode_15_Amp: str = (unsigned char*)"15 A"; break; + case McuHeidelberg_User_ChargingMode_16_Amp: str = (unsigned char*)"16 A"; break; + default: str = (unsigned char*)"ERROR, unknown mode!"; break; + } + return str; +} + +/* -------------------------------------------- */ +/* Read and write the hardware Modbus registers */ + +uint8_t McuHeidelberg_ReadRegisterLayoutVersion(uint8_t id, uint16_t *version) { + uint16_t value; + + if (McuModbus_ReadInputRegisters(id, McuHeidelberg_Addr_ModbusRegisterLayoutVersion, 1, &value)!=ERR_OK) { + return ERR_FAILED; + } + *version = value; + return ERR_OK; +} + +uint8_t McuHeidelberg_ReadChargingState(uint8_t id, uint16_t *state) { +#if McuHeidelberg_CONFIG_USE_MOCK_WALLBOX + *state = mock.hwChargerState; +#else + uint16_t value; + + if (McuModbus_ReadInputRegisters(id, McuHeidelberg_Addr_ChargingState, 1, &value)!=ERR_OK) { + return ERR_FAILED; + } + *state = value; +#endif + return ERR_OK; +} + +uint8_t McuHeidelberg_ReadCurrent(uint8_t id, uint16_t current[3]) { + uint16_t value; + + if (McuModbus_ReadInputRegisters(McuHeidelberg_deviceID, McuHeidelberg_Addr_Current_L1, 1, &value)==ERR_OK) { + current[0] = value; + } else { + return ERR_FAILED; + } + if (McuModbus_ReadInputRegisters(McuHeidelberg_deviceID, McuHeidelberg_Addr_Current_L2, 1, &value)==ERR_OK) { + current[1] = value; + } else { + return ERR_FAILED; + } + if (McuModbus_ReadInputRegisters(McuHeidelberg_deviceID, McuHeidelberg_Addr_Current_L3, 1, &value)==ERR_OK) { + current[2] = value; + } else { + return ERR_FAILED; + } + return ERR_OK; +} + +uint8_t McuHeidelberg_ReadTemperature(uint8_t id, int16_t *temperature) { + int16_t value; + + if (McuModbus_ReadInputRegisters(id, McuHeidelberg_Addr_Temperature, 1, (uint16_t*)&value)!=ERR_OK) { + return ERR_FAILED; + } + *temperature = value; + return ERR_OK; +} + +uint8_t McuHeidelberg_ReadVoltage(uint8_t id, uint16_t voltage[3]) { + uint16_t value[3]; + + if (McuModbus_ReadInputRegisters(McuHeidelberg_deviceID, McuHeidelberg_Addr_Voltage_L1, 3, value)==ERR_OK) { + voltage[0] = value[0]; + voltage[1] = value[1]; + voltage[2] = value[2]; + } else { + return ERR_FAILED; + } + return ERR_OK; +} + +uint8_t McuHeidelberg_ReadLockstate(uint8_t id, uint16_t *state) { + uint16_t value; + + if (McuModbus_ReadInputRegisters(id, McuHeidelberg_Addr_LockState, 1, &value)!=ERR_OK) { + return ERR_FAILED; + } + *state = value; + return ERR_OK; +} + +uint8_t McuHeidelberg_ReadPower(uint8_t id, uint16_t *power) { + uint16_t value; + + if (McuModbus_ReadInputRegisters(id, McuHeidelberg_Addr_Power, 1, &value)!=ERR_OK) { + return ERR_FAILED; + } + *power = value; + return ERR_OK; +} + +uint8_t McuHeidelberg_ReadEnergySincePowerOn(uint8_t id, uint32_t *energy) { + uint16_t value[2]; + + if (McuModbus_ReadInputRegisters(id, McuHeidelberg_Addr_EnergyPowerOn, 2, value)!=ERR_OK) { + return ERR_FAILED; + } + *energy = (value[0]<<16) + value[1]; + return ERR_OK; +} + +uint8_t McuHeidelberg_ReadEnergySinceInstallation(uint8_t id, uint32_t *energy) { + uint16_t value[2]; + + if (McuModbus_ReadInputRegisters(id, McuHeidelberg_Addr_Energy_Installation, 2, value)!=ERR_OK) { + return ERR_FAILED; + } + *energy = (value[0]<<16) + value[1]; + return ERR_OK; +} + +uint8_t McuHeidelberg_ReadHardwareMaxCurrent(uint8_t id, uint16_t *current) { + uint16_t value; + + if (McuModbus_ReadInputRegisters(id, McuHeidelberg_Addr_MaxCurrent, 1, &value)!=ERR_OK) { + *current = 6; /* minimal current */ + return ERR_FAILED; + } + *current = value; + return ERR_OK; +} + +uint8_t McuHeidelberg_ReadHardwareMinCurrent(uint8_t id, uint16_t *current) { + uint16_t value; + + if (McuModbus_ReadInputRegisters(id, McuHeidelberg_Addr_MinCurrent, 1, &value)!=ERR_OK) { + *current = 6; /* minimal current */ + return ERR_FAILED; + } + *current = value; + return ERR_OK; +} + +uint8_t McuHeidelberg_ReadLogisticString(uint8_t id, unsigned char *string, size_t stringSize) { + uint16_t value[McuHeidelberg_Addr_LogisticString_End-McuHeidelberg_Addr_LogisticString_Start+1]; + + memset(value, 0, sizeof(value)); + for(int i=0; i>8)); + McuUtility_chcat(string, stringSize, (unsigned char)(value[i]&0xff)); + } + return ERR_OK; +} + +uint8_t McuHeidelberg_ReadHardwareVariant(uint8_t id, uint16_t *variant) { + uint16_t value; + + if (McuModbus_ReadInputRegisters(id, McuHeidelberg_Addr_HardwareVariant, 1, &value)!=ERR_OK) { + return ERR_FAILED; + } + *variant = value; + return ERR_OK; +} + +uint8_t McuHeidelberg_ReadApplicationSoftwareRevision(uint8_t id, uint16_t *revision) { + uint16_t value; + + if (McuModbus_ReadInputRegisters(id, McuHeidelberg_Addr_AppSoftwareRevision, 1, &value)!=ERR_OK) { + return ERR_FAILED; + } + *revision = value; + return ERR_OK; +} + +uint8_t McuHeidelberg_ReadWatchDogTimeOut(uint8_t id, uint16_t *timeout) { + uint16_t value; + + if (McuModbus_ReadHoldingRegisters(id, McuHeidelberg_Addr_WatchDogTimeout, 1, &value)!=ERR_OK) { + return ERR_FAILED; + } + *timeout = value; + return ERR_OK; +} + +uint8_t McuHeidelberg_WriteWatchDogTimeOut(uint8_t id, uint16_t timeoutMs) { + return McuModbus_WriteHoldingRegister(id, McuHeidelberg_Addr_WatchDogTimeout, timeoutMs); +} + +uint8_t McuHeidelberg_ReadStandbyFunctionControl(uint8_t id, uint16_t *control) { + uint16_t value; + + if (McuModbus_ReadHoldingRegisters(id, McuHeidelberg_Addr_StandbyFunctionControl, 1, &value)!=ERR_OK) { + return ERR_FAILED; + } + *control = value; + return ERR_OK; +} + +uint8_t McuHeidelberg_WriteStandbyFunctionControl(uint8_t id, bool standbyEnabled) { + return McuModbus_WriteHoldingRegister(id, McuHeidelberg_Addr_StandbyFunctionControl, standbyEnabled?0:4); +} + +uint8_t McuHeidelberg_ReadRemoteLock(uint8_t id, uint16_t *lock) { + uint16_t value; + + if (McuModbus_ReadHoldingRegisters(id, McuHeidelberg_Addr_RemoteLock, 1, &value)!=ERR_OK) { + return ERR_FAILED; + } + *lock = value; + return ERR_OK; +} + +uint8_t McuHeidelberg_ReadMaxCurrentCmd(uint8_t id, uint16_t *current) { + uint16_t value; + + if (McuModbus_ReadHoldingRegisters(id, McuHeidelberg_Addr_MaxCurrentCommand, 1, &value)!=ERR_OK) { + return ERR_FAILED; + } + *current = value; + return ERR_OK; +} + +uint8_t McuHeidelberg_WriteMaxCurrentCmd(uint8_t id, uint16_t current) { + if (current>1 && current<60) { + current = 0; /* not allowed, set to zero */ + } + if (current>160) { + current = 160; /* max 16.0 A */ + } + return McuModbus_WriteHoldingRegister(id, McuHeidelberg_Addr_MaxCurrentCommand, current); +} + +uint8_t McuHeidelberg_ReadFailSafeCurrent(uint8_t id, uint16_t *current) { + uint16_t value; + + if (McuModbus_ReadHoldingRegisters(id, McuHeidelberg_Addr_FailSafeCurrent, 1, &value)!=ERR_OK) { + return ERR_FAILED; + } + *current = value; + return ERR_OK; +} + +uint8_t McuHeidelberg_WriteFailSafeCurrent(uint8_t id, uint16_t current) { + if (current>1 && current<60) { + current = 0; /* not allowed, set to zero */ + } + if (current>160) { + current = 160; /* max 16.0 A */ + } + return McuModbus_WriteHoldingRegister(id, McuHeidelberg_Addr_FailSafeCurrent, current); +} + +uint8_t McuHeidelberg_ReadSupportDiagnosticDataItem(uint8_t id, McuHeidelberg_AddrMap_e itemAddr, uint16_t *data) { + uint16_t value; + + if (itemAddrMcuHeidelberg_Addr_SupportDiagnosticData_End) { + return ERR_RANGE; + } + if (McuModbus_ReadInputRegisters(id, itemAddr, 1, &value)!=ERR_OK) { + return ERR_FAILED; + } + *data = value; + return ERR_OK; +} + +static uint16_t calculatePowerToChargerDeciAmpere(uint32_t power) { + return power*10/230/McuHeidelbergInfo.nofPhases; +} + +static uint32_t calculateMinWallboxPower(void) { + return McuHeidelbergInfo.hw.minCurrent*230*McuHeidelbergInfo.nofPhases; /* minimum power setting possible */ +} + +static uint32_t calculateMaxWallboxPower(void) { + return McuHeidelbergInfo.hw.maxCurrent*230*McuHeidelbergInfo.nofPhases; /* maximum power setting possible */ +} + +#if 0 /* currently not used */ +static int32_t calculateSurplusSolarPower(void) { + /* Calculate how much extra power (plus) we do have available for charging the car using solar, + * or less (negative) if we are charing the car too much. + * For this we check if we are charing the battery or feeding back to the grid. + * Return a *negative* number if we have excess power available */ + int32_t batteryW, solarW, gridW, siteW, chargerW, setChargerW; + int32_t value; + + chargerW = McuHeidelberg_GetCurrChargerPower(); /* current power measured by the charger */ + batteryW = McuHeidelberg_GetBatteryPowerWatt(); /* negative: charging batteries */ + gridW = McuHeidelberg_GetGridPowerWatt(); /* negative: feeding to the greed */ + solarW = McuHeidelberg_GetSolarPowerWatt(); + siteW = McuHeidelberg_GetSitePowerWatt(); + setChargerW = McuHeidelberg_GetMaxCarPower(); /* what is set in the wallbox to charge */ + + value = -(batteryW+gridW); /* check if we are still have surplus power, either to battery or grid */ + McuLog_info("solar: %d, site: %d W, battery: %d W, grid: %d W, charger: %d W, hyst: %d W => value: %d W", solarW, siteW, batteryW, gridW, chargerW, McuHeidelberg_CONFIG_HYSTERESIS_POWER, value); + return value; /* positive: we can increase charging the car. Negative: we need to decrease charging the car */ +} +#endif + +static int32_t calculateChargingWatt(void) { + int32_t watt = 0; + McuHeidelberg_UserChargingMode_e mode = McuHeidelberg_GetUserChargingMode(); + + if (mode==McuHeidelberg_User_ChargingMode_Stop) { /* stop charging */ + watt = 0; + } else if (mode==McuHeidelberg_User_ChargingMode_Slow) { /* only charge with lowest power, slow */ + watt = calculateMinWallboxPower(); + } else if (mode==McuHeidelberg_User_ChargingMode_Fast) { /* only charge with maximum power, fast */ + watt = calculateMaxWallboxPower(); + } else if (mode==McuHeidelberg_User_ChargingMode_SlowPlusPV) { /* charge slow, but increase if solar is available */ + int minPower = calculateMinWallboxPower(); + int solarW = McuHeidelberg_GetSolarPowerWatt(); +#if 1 /* simple model */ + watt = solarW - McuHeidelberg_CONFIG_BASE_SITE_POWER; +#else + int surplus = calculateSurplusSolarPower(); /* Negative if we draw from battery and/or grid */ + + if (surplus>=0) { + watt = surplus; + } else { + watt = McuHeidelberg_GetMaxCarPower() + surplus; /* reduce by what we draw too much */ + } +#endif + if (watt=setChargerW-99) { /* charger reached desired charging level */ + int batteryW = McuHeidelberg_GetBatteryPowerWatt(); /* negative: charging batteries */ + int gridW = McuHeidelberg_GetGridPowerWatt(); /* negative: feeding to the greed */ + int value = batteryW+gridW; /* check if we are still have surplus power, either to battery or grid */ + if (value >= 500) { /* need more battery or grid power? */ + McuLog_info("Large site consumer %d W running?", value); + watt -= value; /* reduce charging amount */ + } + } +#else + int surplus = calculateSurplusSolarPower(); /* Negative if we draw from battery and/or grid */ + static int stableCntr = 0; + + if (currChargerW>=setChargerW-60 && currChargerW<=setChargerW+60) { /* charger reached desired charging level */ + stableCntr++; + if (stableCntr>2) { + stableCntr = 2; + watt = setChargerW + surplus; /* adapt current charging level */ + watt -= McuHeidelberg_CONFIG_HYSTERESIS_POWER; /* reduce by this amount to have some margin */ + McuLog_info("charger stable: curr %d W, set %d W => %d W", currChargerW, setChargerW, watt); + } else { + watt = setChargerW; /* keep current level */ + } + } else { + stableCntr = 0; + watt = surplus; + watt -= McuHeidelberg_CONFIG_HYSTERESIS_POWER; /* reduce by this amount to have some margin */ + McuLog_info("charger not stable yet: curr %d W, set %d W => %d W", currChargerW, setChargerW, watt); + } +#endif + if (wattsolarW) { /* do not go above solar power */ + watt = solarW; + } + } else if (mode>=McuHeidelberg_User_ChargingMode_6_Amp && mode<=McuHeidelberg_User_ChargingMode_16_Amp) { + watt = (mode-McuHeidelberg_User_ChargingMode_6_Amp+6)*230*McuHeidelbergInfo.nofPhases; + } + /* check current boundaries */ + if (watt < calculateMinWallboxPower()) { /* below minimal possible setting */ + watt = 0; + } else if (watt > calculateMaxWallboxPower()) { /* above maximum setting */ + watt = calculateMaxWallboxPower(); + } + return watt; +} + +static uint8_t calculateNofActivePhases(void) { + uint8_t nof; + uint8_t res; + + res = McuHeidelberg_ReadVoltage(McuHeidelberg_deviceID, &McuHeidelbergInfo.hw.voltage[0]); + if (res!=ERR_OK) { + McuLog_fatal("failed reading voltage"); + return 1; + } + nof = 0; + for(int i=0; i210) { /* voltage above 220V? */ + nof++; + } + } + if (nof<1 || nof>3) { /* should never be the case? */ + McuLog_fatal("failed determine active phases"); + return 1; /* error fallback */ + } + return nof; /* return number of phases detected */ +} + +void McuHeidelberg_RegisterEventCallback(McuHeidelberg_EventCallback callback) { + McuHeidelbergInfo.eventCallback = callback; +} + +static void CallEventCallback(McuHeidelberg_Event_e event) { + if (McuHeidelbergInfo.eventCallback!=NULL) { + McuHeidelbergInfo.eventCallback(event); + } +} + +McuHeidelbergChargerState_e McuHeidelberg_GetHWChargerState(void) { + return McuHeidelbergInfo.hw.chargerState; +} + +static void McuHeidelberg_SetHWChargerState(uint16_t state) { + if (McuHeidelbergInfo.hw.chargerState!=state) { + McuHeidelbergInfo.hw.chargerState = state; + CallEventCallback(McuHeidelberg_Event_HW_State_Changed); + } +} + +/* -------------------------------------------- */ +/* Setter and Getter for available solar power */ +uint32_t McuHeidelberg_GetSolarPowerWatt(void) { + return McuHeidelbergInfo.solarPowerW; +} + +void McuHeidelberg_SetSolarPowerWatt(uint32_t powerW) { + if (McuHeidelbergInfo.solarPowerW!=powerW) { + McuHeidelbergInfo.solarPowerW = powerW; + CallEventCallback(McuHeidelberg_Event_SolarPower_Changed); + (void)xSemaphoreGive(semNewSolarValue); /* notify task */ + } +} + +/* -------------------------------------------- */ +/* Setter and Getter for grid power */ +int32_t McuHeidelberg_GetGridPowerWatt(void) { + return McuHeidelbergInfo.gridPowerW; +} + +void McuHeidelberg_SetGridPowerWatt(int32_t powerW) { + if (McuHeidelbergInfo.gridPowerW!=powerW) { + McuHeidelbergInfo.gridPowerW = powerW; + CallEventCallback(McuHeidelberg_Event_GridPower_Changed); + } +} +/* -------------------------------------------- */ +/* Setter and Getter for battery power */ +int32_t McuHeidelberg_GetBatteryPowerWatt(void) { + return McuHeidelbergInfo.batteryPowerW; +} + +void McuHeidelberg_SetBatteryPowerWatt(int32_t powerW) { + if (McuHeidelbergInfo.batteryPowerW!=powerW) { + McuHeidelbergInfo.batteryPowerW = powerW; + CallEventCallback(McuHeidelberg_Event_BatteryPower_Changed); + } +} +/* -------------------------------------------- */ +/* Setter and Getter for power used by site */ +uint32_t McuHeidelberg_GetSitePowerWatt(void) { + return McuHeidelbergInfo.sitePowerW; +} + +void McuHeidelberg_SetSitePowerWatt(uint32_t powerW) { + if (McuHeidelbergInfo.sitePowerW!=powerW) { + McuHeidelbergInfo.sitePowerW = powerW; + CallEventCallback(McuHeidelberg_Event_SitePower_Changed); + } +} +/* -------------------------------------------- */ +/* Setter and Getter for maximum charging current */ +uint32_t McuHeidelberg_GetMaxCarPower(void) { + return McuHeidelbergInfo.maxCarPowerW; +} + +static void McuHeidelberg_SetMaxCarPower(uint32_t power) { + /* sets the maximum current to be provided by the charger */ + if (McuHeidelbergInfo.maxCarPowerW!=power) { + uint16_t dA = calculatePowerToChargerDeciAmpere(power); + if (McuHeidelberg_WriteMaxCurrentCmd(McuHeidelberg_deviceID, dA)!=ERR_OK) { + McuLog_error("failed writing max current"); + power = 0; + } + McuHeidelbergInfo.maxCarPowerW = power; + } +} + +uint32_t McuHeidelberg_GetCurrChargerPower(void) { + return McuHeidelbergInfo.hw.power; +} + +static void McuHeidelberg_UpdateCurrChargerPower(void) { + uint16_t power; + + if (McuHeidelberg_ReadPower(McuHeidelberg_deviceID, &power)!=ERR_OK) { + McuLog_error("failed reading charger power"); + McuHeidelbergInfo.hw.power = 0; + } else if (power != McuHeidelbergInfo.hw.power) { + McuHeidelbergInfo.hw.power = power; + } + CallEventCallback(McuHeidelberg_Event_ChargerPower_Changed); +} + +static void readStatusRegisters(void) { + if (McuHeidelberg_ReadCurrent(McuHeidelberg_deviceID, &McuHeidelbergInfo.hw.current[0])!=ERR_OK) { + McuLog_error("failed reading current"); + } + if (McuHeidelberg_ReadTemperature(McuHeidelberg_deviceID, &McuHeidelbergInfo.hw.temperature)!=ERR_OK) { + McuLog_error("failed reading temperature"); + } + if (McuHeidelberg_ReadVoltage(McuHeidelberg_deviceID, &McuHeidelbergInfo.hw.voltage[0])!=ERR_OK) { + McuLog_error("failed reading voltage"); + } + if (McuHeidelberg_ReadLockstate(McuHeidelberg_deviceID, &McuHeidelbergInfo.hw.lockState)!=ERR_OK) { + McuLog_error("failed reading lockstate"); + } + if (McuHeidelberg_ReadPower(McuHeidelberg_deviceID, &McuHeidelbergInfo.hw.power)!=ERR_OK) { + McuLog_error("failed reading power"); + } + if (McuHeidelberg_ReadEnergySincePowerOn(McuHeidelberg_deviceID, &McuHeidelbergInfo.hw.energySincePowerOn)!=ERR_OK) { + McuLog_error("failed reading energy since power-on"); + } + if (McuHeidelberg_ReadEnergySinceInstallation(McuHeidelberg_deviceID, &McuHeidelbergInfo.hw.energySinceInstallation)!=ERR_OK) { + McuLog_error("failed reading energy since installation"); + } + calculateNofActivePhases(); +} + +static void resetHardwareDataValues(void) { + McuHeidelbergInfo.hw.current[0] = 0; + McuHeidelbergInfo.hw.current[1] = 0; + McuHeidelbergInfo.hw.current[2] = 0; + McuHeidelbergInfo.hw.temperature = 0; + McuHeidelbergInfo.hw.voltage[0] = 0; + McuHeidelbergInfo.hw.voltage[1] = 0; + McuHeidelbergInfo.hw.voltage[2] = 0; + + McuHeidelbergInfo.hw.power = 0; + McuHeidelberg_UpdateCurrChargerPower(); +} + +/* -------------------------------------------- */ +/* Setter and Getter for user charging mode */ +McuHeidelberg_UserChargingMode_e McuHeidelberg_GetUserChargingMode(void) { + return McuHeidelbergInfo.userChargingMode; +} + +void McuHeidelberg_SetUserChargingMode(McuHeidelberg_UserChargingMode_e mode) { + if (McuHeidelbergInfo.userChargingMode!=mode) { + McuHeidelberg_SetMaxCarPower(0); /* set initial charger current to zero */ + readStatusRegisters(); /* read in again the status register to have a good and clean state */ + McuHeidelbergInfo.userChargingMode = mode; + CallEventCallback(McuHeidelberg_Event_UserChargingMode_Changed); + } +} + +static void wallboxTask(void *pv) { + uint8_t res; + uint16_t prevHWchargerState = 0; + uint16_t prevChargingWatt = 0; /* previous charging power in Watt */ + uint16_t currChargingWatt = 0; /* current charging power in Watt */ + bool newData = false; + + McuHeidelbergInfo.isActive = false; + McuHeidelbergInfo.state = Wallbox_TaskState_None; + McuHeidelbergInfo.userChargingMode = McuHeidelberg_CONFIG_DEFAULT_CHARGING_MODE; +#if McuHeidelberg_CONFIG_USE_MOCK_WALLBOX + mock.hwChargerState = McuHeidelberg_ChargerState_A1; +#endif +/* + * With the car plugged in, the charging state jumps to 4 (McuHeidelberg_ChargerState_B1). + * Then write every second the load current into register 261 (McuHeidelberg_Addr_MaxCurrentCommand). + * The charging state jumps to 7 (McuHeidelberg_ChargerState_C2) (charging). + * To stop the charging, write 0 to register 261 (McuHeidelberg_Addr_MaxCurrentCommand). + */ + for(;;) { + if (xSemaphoreTake(semNewSolarValue, pdMS_TO_TICKS(1000))==pdTRUE) { /* standard delay time, or notification received */ + McuLog_trace("new solar value received"); + newData = true; + } + + if (McuHeidelbergInfo.state!=Wallbox_TaskState_None) { /* as soon as we have a connection, check the wallbox state for changes */ + uint16_t HWchargerState; + if (McuHeidelberg_ReadChargingState(McuHeidelberg_deviceID, &HWchargerState)==ERR_OK) { + McuHeidelberg_SetHWChargerState(HWchargerState); /* store state we got */ + if (prevHWchargerState != HWchargerState) { /* state changed? */ + McuLog_trace("wallbox state changed from %s (%d) to %s (%d)", McuHeidelberg_GetShortHWChargerStateString(prevHWchargerState), prevHWchargerState, McuHeidelberg_GetShortHWChargerStateString(HWchargerState), HWchargerState); + McuHeidelberg_UpdateCurrChargerPower(); /* update values, as state has changed */ + prevHWchargerState = HWchargerState; + } + } else { + McuLog_error("failed to get charger state"); + McuHeidelbergInfo.state = Wallbox_TaskState_Error; + } + } + + switch(McuHeidelbergInfo.state) { + case Wallbox_TaskState_None: + McuHeidelbergInfo.isActive = false; + /* no state yet: probe layout register to check if we can reach the charger */ + res = McuHeidelberg_ReadRegisterLayoutVersion(McuHeidelberg_deviceID, &McuHeidelbergInfo.hw.version); + if (res==ERR_OK) { + McuLog_info("connected with charger"); + McuHeidelbergInfo.isActive = true; + McuHeidelbergInfo.state = Wallbox_TaskState_Connected; + /* read static values from wallbox */ + if (McuHeidelberg_ReadHardwareMinCurrent(McuHeidelberg_deviceID, &McuHeidelbergInfo.hw.minCurrent)!=ERR_OK) { + McuLog_error("failed reading min current"); + } + if (McuHeidelberg_ReadHardwareMaxCurrent(McuHeidelberg_deviceID, &McuHeidelbergInfo.hw.maxCurrent)!=ERR_OK) { + McuLog_error("failed reading max current"); + } + /* read other dynamic values the first time */ + uint16_t val; + + if (McuHeidelberg_ReadChargingState(McuHeidelberg_deviceID, &val)==ERR_OK) { + McuHeidelberg_SetHWChargerState(val); /* store state we got */ + prevHWchargerState = val; + } else { + McuLog_error("failed reading device ID"); + } + if (McuHeidelberg_ReadCurrent(McuHeidelberg_deviceID, &McuHeidelbergInfo.hw.current[0])!=ERR_OK) { + McuLog_error("failed reading current"); + } + if (McuHeidelberg_ReadTemperature(McuHeidelberg_deviceID, &McuHeidelbergInfo.hw.temperature)!=ERR_OK) { + McuLog_error("failed reading temperature"); + } + if (McuHeidelberg_ReadVoltage(McuHeidelberg_deviceID, &McuHeidelbergInfo.hw.voltage[0])!=ERR_OK) { + McuLog_error("failed reading voltage"); + } + if (McuHeidelberg_ReadLockstate(McuHeidelberg_deviceID, &McuHeidelbergInfo.hw.lockState)!=ERR_OK) { + McuLog_error("failed reading lockstate"); + } + if (McuHeidelberg_ReadPower(McuHeidelberg_deviceID, &McuHeidelbergInfo.hw.power)!=ERR_OK) { + McuLog_error("failed reading power"); + } + if (McuHeidelberg_ReadEnergySincePowerOn(McuHeidelberg_deviceID, &McuHeidelbergInfo.hw.energySincePowerOn)!=ERR_OK) { + McuLog_error("failed reading energy"); + } + /* determine the number of active phases */ + McuHeidelbergInfo.nofPhases = calculateNofActivePhases(); + McuHeidelberg_SetMaxCarPower(calculateMinWallboxPower()); /* set initial charging value */ + } else { + resetHardwareDataValues(); + McuLog_error("communication failed, charger in standby? Retry in 30 seconds..."); + vTaskDelay(pdMS_TO_TICKS(30000)); /* need to poll the device on a regular base, otherwise it goes into communication error state */ + } + break; + + case Wallbox_TaskState_Connected: + switch(McuHeidelbergInfo.hw.chargerState) { + case McuHeidelberg_ChargerState_A1: + case McuHeidelberg_ChargerState_A2: + /* no vehicle plugged, stay in current state */ + break; + + case McuHeidelberg_ChargerState_B1: + case McuHeidelberg_ChargerState_B2: + case McuHeidelberg_ChargerState_C1: + case McuHeidelberg_ChargerState_C2: + McuLog_info("vehicle plugged"); + McuHeidelbergInfo.state = Wallbox_TaskState_Vehicle_Plugged; + break; + + case McuHeidelberg_ChargerState_Derating: + case McuHeidelberg_ChargerState_E: + case McuHeidelberg_ChargerState_F: + case McuHeidelberg_ChargerState_Error: + default: + McuHeidelbergInfo.state = Wallbox_TaskState_Error; /* error case */ + break; + } /* switch */ + break; + + case Wallbox_TaskState_Vehicle_Plugged: + switch(McuHeidelbergInfo.hw.chargerState) { + case McuHeidelberg_ChargerState_A1: + case McuHeidelberg_ChargerState_A2: + McuLog_trace("vehicle not plugged any more"); + McuHeidelbergInfo.state = Wallbox_TaskState_Connected; + break; + + case McuHeidelberg_ChargerState_B1: /* plugged, no charging request, but charging not possible */ + currChargingWatt = calculateChargingWatt(); + if (currChargingWatt!=prevChargingWatt) { + McuLog_info("B1, setting charging power to %d W", currChargingWatt); + McuHeidelberg_SetMaxCarPower(currChargingWatt); + prevChargingWatt = currChargingWatt; + } + vTaskDelay(pdMS_TO_TICKS(5000)); + break; + + case McuHeidelberg_ChargerState_B2: /* plugged, no charging request, charging possible */ + /* vehicle plugged, but no charging request: stay in this state */ + break; + + case McuHeidelberg_ChargerState_C1: + /* charging request from vehicle, but wallbox does not allow charging: stay here */ + break; + + case McuHeidelberg_ChargerState_C2: + McuLog_trace("vehicle plugged, with charging request"); + McuHeidelbergInfo.state = Wallbox_TaskState_Vehicle_Start_Charging; + break; + + case McuHeidelberg_ChargerState_Derating: + case McuHeidelberg_ChargerState_E: + case McuHeidelberg_ChargerState_F: + case McuHeidelberg_ChargerState_Error: + default: + McuHeidelbergInfo.state = Wallbox_TaskState_Error; /* error case */ + break; + } /* switch */ + break; + + case Wallbox_TaskState_Vehicle_Start_Charging: + McuLog_info("start charging"); + currChargingWatt = calculateChargingWatt(); + McuLog_info("setting charging power to %d W", currChargingWatt); + McuHeidelberg_SetMaxCarPower(currChargingWatt); + prevChargingWatt = currChargingWatt; + McuHeidelbergInfo.state = Wallbox_TaskState_Vehicle_Charging; + break; + + case Wallbox_TaskState_Vehicle_Charging: + switch(McuHeidelbergInfo.hw.chargerState) { + case McuHeidelberg_ChargerState_A1: + case McuHeidelberg_ChargerState_A2: + McuLog_trace("vehicle not plugged any more"); + McuHeidelbergInfo.state = Wallbox_TaskState_Connected; + McuHeidelberg_UpdateCurrChargerPower(); /* update current charging power from hardware */ + vTaskDelay(pdMS_TO_TICKS(1000)); /* control loop delay */ + break; + + case McuHeidelberg_ChargerState_B1: + case McuHeidelberg_ChargerState_B2: + McuLog_trace("vehicle plugged, but dropped charging request"); + McuHeidelbergInfo.state = Wallbox_TaskState_Connected; + McuHeidelberg_UpdateCurrChargerPower(); /* update current charging power from hardware */ + vTaskDelay(pdMS_TO_TICKS(1000)); /* control loop delay */ + break; + + case McuHeidelberg_ChargerState_C1: + case McuHeidelberg_ChargerState_C2: + /* vehicle plugged, with charging request: stay in this state */ + McuHeidelberg_UpdateCurrChargerPower(); /* update current charging power from hardware */ + vTaskDelay(pdMS_TO_TICKS(1000)); /* control loop delay */ + break; + + case McuHeidelberg_ChargerState_Derating: + McuLog_trace("de-rating while charging, waiting 5 seconds"); + vTaskDelay(pdMS_TO_TICKS(5000)); + break; + case McuHeidelberg_ChargerState_E: + case McuHeidelberg_ChargerState_F: + case McuHeidelberg_ChargerState_Error: + default: + McuHeidelbergInfo.state = Wallbox_TaskState_Error; /* error case */ + break; + } /* switch */ + if (McuHeidelbergInfo.hw.chargerState==McuHeidelberg_ChargerState_C2) { /* in active charging state? */ + if (newData) { /* only do new calculation with if we have new data */ + newData = false; + /* calculate possible charging level */ + McuHeidelberg_UpdateCurrChargerPower(); /* update current charging power from hardware */ + currChargingWatt = calculateChargingWatt(); + if (currChargingWatt!=prevChargingWatt) { + int diff; + + if (currChargingWatt>prevChargingWatt) { + diff = currChargingWatt-prevChargingWatt; + } else { + diff = prevChargingWatt-currChargingWatt; + } + if (diff>=McuHeidelberg_CONFIG_HYSTERESIS_POWER || currChargingWatt==0) { + McuLog_info("diff > %d W, changing charging power from %d W to %d W", McuHeidelberg_CONFIG_HYSTERESIS_POWER, prevChargingWatt, currChargingWatt); + McuHeidelberg_SetMaxCarPower(currChargingWatt); /* tell hardware to change charging */ + prevChargingWatt = currChargingWatt; + } + } + } + } + break; + + case Wallbox_TaskState_Vehicle_Stop_Charging: + McuLog_info("stop charging"); + McuHeidelberg_SetMaxCarPower(0); /* stop charging */ + McuHeidelbergInfo.state = Wallbox_TaskState_Connected; + break; + + case Wallbox_TaskState_Error: + McuLog_error("error, stop charging, reinitializing"); + McuHeidelberg_SetMaxCarPower(0); /* stop charging */ + McuHeidelbergInfo.state = Wallbox_TaskState_None; + break; + + default: + break; + } /* switch */ + } +} + +static uint8_t PrintStatus(const McuShell_StdIOType *io) { + unsigned char buf[96]; + uint16_t value16u; + int32_t watt; + + readStatusRegisters(); /* read hardware registers into McuHeidelbergInfo.hw so we can use them below */ + McuShell_SendStatusStr((unsigned char*)"McuHeidelberg", (unsigned char*)"Heidelberg wallbox status\r\n", io->stdOut); + + McuShell_SendStatusStr((unsigned char*)" wallbox", McuHeidelbergInfo.isActive?(unsigned char*)"active\r\n":(unsigned char*)"standby or powered off\r\n", io->stdOut); + + McuUtility_Num8uToStr(buf, sizeof(buf), McuHeidelberg_deviceID); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" Modbus addr", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), McuHeidelberg_GetStateString(McuHeidelbergInfo.state)); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" state", buf, io->stdOut); + + McuHeidelberg_UserChargingMode_e mode = McuHeidelberg_GetUserChargingMode(); + McuUtility_Num16uToStr(buf, sizeof(buf), mode); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)": "); + McuUtility_strcat(buf, sizeof(buf), McuHeidelberg_GetUserChargingModeString(mode)); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" user mode", buf, io->stdOut); + + McuUtility_Num8uToStr(buf, sizeof(buf), McuHeidelbergInfo.nofPhases); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" (detected)\r\n"); + McuShell_SendStatusStr((unsigned char*)" nof phases", buf, io->stdOut); + + McuUtility_Num32uToStrFormatted(buf, sizeof(buf), McuHeidelberg_GetSolarPowerWatt(), ' ', 6); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" W\r\n"); + McuShell_SendStatusStr((unsigned char*)" solar", buf, io->stdOut); + + watt = McuHeidelberg_GetGridPowerWatt(); + if (watt<0) { + McuUtility_Num32sToStrFormatted(buf, sizeof(buf), -watt, ' ', 6); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" W to grid\r\n"); + } else { + McuUtility_Num32sToStrFormatted(buf, sizeof(buf), watt, ' ', 6); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" W from grid\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" grid", buf, io->stdOut); + + watt = McuHeidelberg_GetBatteryPowerWatt(); + if (watt<0) { + McuUtility_Num32sToStrFormatted(buf, sizeof(buf), -watt, ' ', 6); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" W charging\r\n"); + } else { + McuUtility_Num32sToStrFormatted(buf, sizeof(buf), watt, ' ', 6); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" W discharging\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" battery", buf, io->stdOut); + + McuUtility_Num32uToStrFormatted(buf, sizeof(buf), McuHeidelberg_GetSitePowerWatt(), ' ', 6); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" W with wallbox\r\n"); + McuShell_SendStatusStr((unsigned char*)" site", buf, io->stdOut); + + uint32_t powerW = McuHeidelberg_GetMaxCarPower(); + uint16_t dA = calculatePowerToChargerDeciAmpere(powerW); + McuUtility_Num32uToStrFormatted(buf, sizeof(buf), powerW, ' ', 6); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" W, Imax "); + McuUtility_strcatNum16uFormatted(buf, sizeof(buf), dA/10, ' ', 2); + McuUtility_chcat(buf, sizeof(buf), '.'); + McuUtility_strcatNum16uFormatted(buf, sizeof(buf), dA%10, '0', 1); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" A\r\n"); + McuShell_SendStatusStr((unsigned char*)" charge max", buf, io->stdOut); + + McuUtility_Num32sToStrFormatted(buf, sizeof(buf), McuHeidelberg_GetCurrChargerPower(), ' ', 6); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" W reported by charger\r\n"); + McuShell_SendStatusStr((unsigned char*)" charge curr", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"[ 4] "); + if (McuHeidelbergInfo.isActive) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum16Hex(buf, sizeof(buf), McuHeidelbergInfo.hw.version); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"(standby)\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" HW version", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"[ 5] "); + if (McuHeidelbergInfo.isActive) { + McuHeidelbergChargerState_e chargerState = McuHeidelberg_GetHWChargerState(); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum16Hex(buf, sizeof(buf), chargerState); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" "); + McuUtility_strcat(buf, sizeof(buf), McuHeidelberg_GetHWChargerStateString(chargerState)); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"(standby)\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" HW state", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"[ 6] "); + if (McuHeidelbergInfo.isActive) { + McuUtility_strcatNum16uFormatted(buf, sizeof(buf), McuHeidelbergInfo.hw.current[0]/10, ' ', 2); + McuUtility_chcat(buf, sizeof(buf), '.'); + McuUtility_strcatNum16uFormatted(buf, sizeof(buf), McuHeidelbergInfo.hw.current[0]%10, '0', 1); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" A, [ 10] "); + McuUtility_strcatNum16u(buf, sizeof(buf), McuHeidelbergInfo.hw.voltage[0]); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" V rms\r\n"); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"(standby)\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" L1", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"[ 7] "); + if (McuHeidelbergInfo.isActive) { + McuUtility_strcatNum16uFormatted(buf, sizeof(buf), McuHeidelbergInfo.hw.current[1]/10, ' ', 2); + McuUtility_chcat(buf, sizeof(buf), '.'); + McuUtility_strcatNum16uFormatted(buf, sizeof(buf), McuHeidelbergInfo.hw.current[1]%10, '0', 1); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" A, [ 11] "); + McuUtility_strcatNum16u(buf, sizeof(buf), McuHeidelbergInfo.hw.voltage[1]); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" V rms\r\n"); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"(standby)\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" L2", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"[ 8] "); + if (McuHeidelbergInfo.isActive) { + McuUtility_strcatNum16uFormatted(buf, sizeof(buf), McuHeidelbergInfo.hw.current[2]/10, ' ', 2); + McuUtility_chcat(buf, sizeof(buf), '.'); + McuUtility_strcatNum16uFormatted(buf, sizeof(buf), McuHeidelbergInfo.hw.current[2]%10, '0', 1); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" A, [ 12] "); + McuUtility_strcatNum16u(buf, sizeof(buf), McuHeidelbergInfo.hw.voltage[2]); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" V rms\r\n"); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"(standby)\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" L3", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"[ 9] "); + if (McuHeidelbergInfo.isActive) { + int16_t val = McuHeidelbergInfo.hw.temperature; + McuUtility_strcatNum16u(buf, sizeof(buf), McuHeidelbergInfo.hw.temperature/10); + McuUtility_chcat(buf, sizeof(buf), '.'); + if (val<0) { + val = -val; + } + McuUtility_chcat(buf, sizeof(buf), '0'+(val%10)); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" C (PCB)\r\n"); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"(standby)\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" temperature", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"[ 13] "); + if (McuHeidelbergInfo.isActive) { + McuUtility_strcatNum16u(buf, sizeof(buf), McuHeidelbergInfo.hw.lockState); + if (McuHeidelbergInfo.hw.lockState==0) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)": system locked\r\n"); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)": system unlocked\r\n"); + } + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"(standby)\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" lock", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"[ 14] "); + if (McuHeidelbergInfo.isActive) { + McuUtility_strcatNum16u(buf, sizeof(buf), McuHeidelbergInfo.hw.power); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" W (sum of all phases)\r\n"); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"(standby)\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" power", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"[ 15] "); + if (McuHeidelbergInfo.isActive) { + McuUtility_strcatNum32u(buf, sizeof(buf), McuHeidelbergInfo.hw.energySincePowerOn); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" Wh (since power-on)\r\n"); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"(standby)\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" energy", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"[ 17] "); + if (McuHeidelbergInfo.isActive) { + McuUtility_strcatNum32u(buf, sizeof(buf), McuHeidelbergInfo.hw.energySinceInstallation); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" Wh (since installation)\r\n"); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"(standby)\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" energy", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"[100] "); + if (McuHeidelbergInfo.isActive) { + McuUtility_strcatNum16u(buf, sizeof(buf), McuHeidelbergInfo.hw.minCurrent); + McuUtility_chcat(buf, sizeof(buf), '-'); + McuUtility_strcatNum16u(buf, sizeof(buf), McuHeidelbergInfo.hw.maxCurrent); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" A\r\n"); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"(standby)\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" I min-max", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"[200] "); + if (McuHeidelbergInfo.isActive && McuHeidelberg_ReadHardwareVariant(McuHeidelberg_deviceID, &value16u)==ERR_OK) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum16Hex(buf, sizeof(buf), value16u); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"(standby)\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" HW variant", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"[203] "); + if (McuHeidelbergInfo.isActive && McuHeidelberg_ReadApplicationSoftwareRevision(McuHeidelberg_deviceID, &value16u)==ERR_OK) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum16Hex(buf, sizeof(buf), value16u); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"(standby)\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" SW revision", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"[257] "); + if (McuHeidelbergInfo.isActive && McuHeidelberg_ReadWatchDogTimeOut(McuHeidelberg_deviceID, &value16u)==ERR_OK) { + if (value16u==0) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"0 (disabled Modbus timeout)\r\n"); + } else { + McuUtility_strcatNum16u(buf, sizeof(buf), value16u/1000); + McuUtility_chcat(buf, sizeof(buf), '.'); + McuUtility_strcatNum16uFormatted(buf, sizeof(buf), value16u%1000, '0', 3); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" s Modbus timeout\r\n"); + } + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"(standby)\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" WDT timeout", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"[258] "); + if (McuHeidelbergInfo.isActive && McuHeidelberg_ReadStandbyFunctionControl(McuHeidelberg_deviceID, &value16u)==ERR_OK) { + McuUtility_strcatNum16u(buf, sizeof(buf), value16u); + if (value16u==0) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" (enabled, power saving if no car is connected)\r\n"); + } else if (value16u==4) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" (disabled)\r\n"); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" (illegal value)\r\n"); + } + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"(standby)\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" standby", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"[259] "); + if (McuHeidelbergInfo.isActive && McuHeidelberg_ReadRemoteLock(McuHeidelberg_deviceID, &value16u)==ERR_OK) { + McuUtility_strcatNum16u(buf, sizeof(buf), value16u); + if (value16u==0) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" (locked)\r\n"); + } else if (value16u==1) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" (unlocked)\r\n"); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" (illegal value)\r\n"); + } + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"(standby)\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" remote lock", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"[261] "); + if (McuHeidelbergInfo.isActive && McuHeidelberg_ReadMaxCurrentCmd(McuHeidelberg_deviceID, &value16u)==ERR_OK) { + if (value16u==0) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"0 A (no charging possible)\r\n"); + } else if (value16u<60) { + McuUtility_strcatNum16u(buf, sizeof(buf), value16u); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" not allowed (no charging possible)\r\n"); + } else { + McuUtility_strcatNum16uFormatted(buf, sizeof(buf), value16u/10, ' ', 2); + McuUtility_chcat(buf, sizeof(buf), '.'); + McuUtility_strcatNum16uFormatted(buf, sizeof(buf), value16u%10, '0', 1); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" A\r\n"); + } + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"(standby)\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" I max cmd", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"[262] "); + if (McuHeidelbergInfo.isActive && McuHeidelberg_ReadFailSafeCurrent(McuHeidelberg_deviceID, &value16u)==ERR_OK) { + if (value16u==0) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"0 A (no charging possible)\r\n"); + } else if (value16u<60) { + McuUtility_strcatNum16u(buf, sizeof(buf), value16u); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" not allowed (no charging possible)\r\n"); + } else { + McuUtility_strcatNum16uFormatted(buf, sizeof(buf), value16u/10, ' ', 2); + McuUtility_chcat(buf, sizeof(buf), '.'); + McuUtility_strcatNum16uFormatted(buf, sizeof(buf), value16u%10, '0', 1); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" A\r\n"); + } + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"(standby)\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" I failsafe", buf, io->stdOut); + return ERR_OK; +} + +static uint8_t PrintHelp(const McuShell_StdIOType *io) { + McuShell_SendHelpStr((unsigned char*)"McuHeidelberg", (unsigned char*)"Group of McuHeidelberg wallbox commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" standby on|off", (unsigned char*)"Enable or disable standby function\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" show logistic", (unsigned char*)"Show logistic string\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" show diagnostic", (unsigned char*)"Show support diagnostic data\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" set timeout ", (unsigned char*)"Set WDT standby timeout\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" set Imax ", (unsigned char*)"Set max charging current in deci-amps (0 or 60-160), e.g. 60 for 6.0 A\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" set Ifail ", (unsigned char*)"Set failsafe current in case of comm lost, in deci-amps (0 or 60-160), e.g. 60 for 6.0 A\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" set charge mode ", (unsigned char*)"Set user charge mode: 0 (stop), 1 (PV only), 2 (slow), 3 (slow+PV), 4 (fast), 5 (6A), 6 (7A), ... 15 (16A) \r\n", io->stdOut); +#if McuHeidelberg_CONFIG_USE_MOCK_WALLBOX + McuShell_SendHelpStr((unsigned char*)" setmock state ", (unsigned char*)"Set mock hardware state register value (2-11)\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" setmock phases ", (unsigned char*)"Set mock number of phases (1-3)\r\n", io->stdOut); +#endif +#if McuHeidelberg_CONFIG_USE_MOCK_SOLAR + McuShell_SendHelpStr((unsigned char*)" setmock solar ", (unsigned char*)"Set mock solar panel power value (W)\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" setmock site ", (unsigned char*)"Set mock site or residual power value (W)\r\n", io->stdOut); +#endif + return ERR_OK; +} + +uint8_t McuHeidelberg_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) { + const unsigned char *p; + uint16_t val16u; + + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, "McuHeidelberg help")==0) { + *handled = true; + return PrintHelp(io); + } else if ((McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) || (McuUtility_strcmp((char*)cmd, "McuHeidelberg status")==0)) { + *handled = true; + return PrintStatus(io); + } else if (McuUtility_strcmp((char*)cmd, "McuHeidelberg show logistic")==0) { + *handled = true; + uint8_t res; + unsigned char buf[32]; + + res = McuHeidelberg_ReadLogisticString(McuHeidelberg_deviceID, buf, sizeof(buf)); + if (res!=ERR_OK) { + return res; + } + McuShell_SendStr(buf, io->stdOut); + return ERR_OK; + } else if (McuUtility_strcmp((char*)cmd, "McuHeidelberg show diagnostic")==0) { + uint16_t value; + uint8_t res; + uint8_t buf[8]; + + *handled = true; + for(int addr=McuHeidelberg_Addr_SupportDiagnosticData_Start; addr<=McuHeidelberg_Addr_SupportDiagnosticData_End; addr++) { + res = McuHeidelberg_ReadSupportDiagnosticDataItem(McuHeidelberg_deviceID, addr, &value); + if (res!=ERR_OK) { + McuShell_SendStr((unsigned char*)"failed!\r\n", io->stdOut); + break; + } + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum16Hex(buf, sizeof(buf), value); + McuUtility_chcat(buf, sizeof(buf), ' '); + McuShell_SendStr(buf, io->stdOut); + } /* for */ + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + } else if (McuUtility_strncmp((char*)cmd, "McuHeidelberg set timeout ", sizeof("McuHeidelberg set timeout ")-1)==0) { + *handled = true; + p = cmd+sizeof("McuHeidelberg set timeout ")-1; + if (McuUtility_ScanDecimal16uNumber(&p, &val16u)!=ERR_OK) { + return ERR_FAILED; + } + return McuHeidelberg_WriteWatchDogTimeOut(McuHeidelberg_deviceID, val16u); + } else if (McuUtility_strncmp((char*)cmd, "McuHeidelberg set Imax ", sizeof("McuHeidelberg set Imax ")-1)==0) { + *handled = true; + p = cmd+sizeof("McuHeidelberg set Imax ")-1; + if (McuUtility_ScanDecimal16uNumber(&p, &val16u)!=ERR_OK && !(val16u==0 || (val16u>=60 && val16u<=160))) { + return ERR_FAILED; + } + return McuHeidelberg_WriteMaxCurrentCmd(McuHeidelberg_deviceID, val16u); + } else if (McuUtility_strncmp((char*)cmd, "McuHeidelberg set Ifail ", sizeof("McuHeidelberg set Ifail ")-1)==0) { + *handled = true; + p = cmd+sizeof("McuHeidelberg set Ifail ")-1; + if (McuUtility_ScanDecimal16uNumber(&p, &val16u)!=ERR_OK && !(val16u==0 || (val16u>=60 && val16u<=160))) { + return ERR_FAILED; + } + return McuHeidelberg_WriteFailSafeCurrent(McuHeidelberg_deviceID, val16u); + } else if (McuUtility_strcmp((char*)cmd, "McuHeidelberg standby on")==0) { + *handled = true; + return McuHeidelberg_WriteStandbyFunctionControl(McuHeidelberg_deviceID, true); + } else if (McuUtility_strcmp((char*)cmd, "McuHeidelberg standby off")==0) { + *handled = true; + return McuHeidelberg_WriteStandbyFunctionControl(McuHeidelberg_deviceID, false); + } else if (McuUtility_strncmp((char*)cmd, "McuHeidelberg set charge mode ", sizeof("McuHeidelberg set charge mode ")-1)==0) { + *handled = true; + p = cmd+sizeof("McuHeidelberg set charge mode ")-1; + if (McuUtility_ScanDecimal16uNumber(&p, &val16u)==ERR_OK && val16u>=0 && val16u=2 && val16u<=11)) { + mock.hwChargerState = val16u; + return ERR_OK; + } + return ERR_FAILED; +#endif +#if McuHeidelberg_CONFIG_USE_MOCK_WALLBOX + } else if (McuUtility_strncmp((char*)cmd, "McuHeidelberg setmock phases ", sizeof("McuHeidelberg setmock phases ")-1)==0) { + *handled = true; + p = cmd+sizeof("McuHeidelberg setmock phases ")-1; + if (McuUtility_ScanDecimal16uNumber(&p, &val16u)==ERR_OK && val16u>=1 && val16u<=3) { + McuHeidelbergInfo.nofPhases = val16u; + return ERR_OK; + } + return ERR_FAILED; +#endif +#if McuHeidelberg_CONFIG_USE_MOCK_SOLAR + } else if (McuUtility_strncmp((char*)cmd, "McuHeidelberg setmock solar ", sizeof("McuHeidelberg setmock solar ")-1)==0) { + *handled = true; + p = cmd+sizeof("McuHeidelberg setmock solar ")-1; + if (McuUtility_ScanDecimal16uNumber(&p, &val16u)==ERR_OK) { + McuHeidelberg_SetSolarPowerWatt(val16u); + return ERR_OK; + } + return ERR_FAILED; +#endif +#if McuHeidelberg_CONFIG_USE_MOCK_SOLAR + } else if (McuUtility_strncmp((char*)cmd, "McuHeidelberg setmock site ", sizeof("McuHeidelberg setmock site ")-1)==0) { + *handled = true; + p = cmd+sizeof("McuHeidelberg setmock site ")-1; + if (McuUtility_ScanDecimal16uNumber(&p, &val16u)==ERR_OK) { + McuHeidelberg_SetSitePowerWatt(val16u); + return ERR_OK; + } + return ERR_FAILED; +#endif + } + return ERR_OK; +} + +void McuHeidelberg_Deinit(void) { + /* nothing needed */ +} + +void McuHeidelberg_Init(void) { + if (xTaskCreate( + wallboxTask, /* pointer to the task */ + "wallbox", /* task name for kernel awareness debugging */ + 1500/sizeof(StackType_t), /* task stack size */ + (void*)NULL, /* optional task startup argument */ + tskIDLE_PRIORITY+4, /* initial priority */ + (TaskHandle_t*)NULL /* optional task handle to create */ + ) != pdPASS) + { + McuLog_fatal("Failed creating task"); + for(;;){} /* error! probably out of memory */ + } + semNewSolarValue = xSemaphoreCreateBinary(); + if (semNewSolarValue==NULL) { + McuLog_fatal("Failed creating semaphore"); + for(;;){} /* error! probably out of memory */ + } + vQueueAddToRegistry(semNewSolarValue, "semNewSolarValue"); +} + +#endif /* McuLib_CONFIG_SDK_USE_FREERTOS */ diff --git a/TSM_PicoW_Sensor/McuLib/Modbus/McuHeidelberg.h b/TSM_PicoW_Sensor/McuLib/Modbus/McuHeidelberg.h new file mode 100644 index 0000000..36b40a2 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/Modbus/McuHeidelberg.h @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2022, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MODBUS_MCUHEIDELBERG_H_ +#define MODBUS_MCUHEIDELBERG_H_ + +#include "McuShell.h" +#include +#include + +typedef enum McuHeidelberg_Event_e { + McuHeidelberg_Event_HW_State_Changed, /* hardware charger state has changed */ + McuHeidelberg_Event_UserChargingMode_Changed, /* user charging mode has changed */ + McuHeidelberg_Event_ChargingSetCurrent_Changed, /* current in the charger has changed */ + McuHeidelberg_Event_SolarPower_Changed, /* produced solar power has changed */ + McuHeidelberg_Event_SitePower_Changed, /* used power by site has changed */ + McuHeidelberg_Event_ChargerPower_Changed, /* charging value of car changed */ + McuHeidelberg_Event_GridPower_Changed, /* grid power value changed */ + McuHeidelberg_Event_BatteryPower_Changed, /* battery power value changed */ +} McuHeidelberg_Event_e; + +typedef void (*McuHeidelberg_EventCallback)(McuHeidelberg_Event_e); + /*!< Event callback function prototype */ + +/*! + * \brief Register a callback for events + * \param callback function pointer for the callback + */ +void McuHeidelberg_RegisterEventCallback(McuHeidelberg_EventCallback callback); + +/* types of charging strategies and modes */ +typedef enum McuHeidelberg_ChargingMode_e { + McuHeidelberg_User_ChargingMode_Stop, /* stop immediately the charging */ + McuHeidelberg_User_ChargingMode_OnlyPV, /* charge only with the PV power available */ + McuHeidelberg_User_ChargingMode_Slow, /* charge immediately with the minimal power */ + McuHeidelberg_User_ChargingMode_SlowPlusPV, /* charge immediately with the minimal power. If PV supports more power, the power level gets increased */ + McuHeidelberg_User_ChargingMode_Fast, /* charge immediately with maximum power */ + McuHeidelberg_User_ChargingMode_6_Amp, + McuHeidelberg_User_ChargingMode_7_Amp, + McuHeidelberg_User_ChargingMode_8_Amp, + McuHeidelberg_User_ChargingMode_9_Amp, + McuHeidelberg_User_ChargingMode_10_Amp, + McuHeidelberg_User_ChargingMode_11_Amp, + McuHeidelberg_User_ChargingMode_12_Amp, + McuHeidelberg_User_ChargingMode_13_Amp, + McuHeidelberg_User_ChargingMode_14_Amp, + McuHeidelberg_User_ChargingMode_15_Amp, + McuHeidelberg_User_ChargingMode_16_Amp, + McuHeidelberg_User_ChargingMode_NofChargingMode, /* sentinel, must be last in list! */ +} McuHeidelberg_UserChargingMode_e; + +McuHeidelberg_UserChargingMode_e McuHeidelberg_GetUserChargingMode(void); +void McuHeidelberg_SetUserChargingMode(McuHeidelberg_UserChargingMode_e mode); + +/* state of the hardware wallbox */ +typedef enum McuHeidelbergChargerState_e { + McuHeidelberg_ChargerState_A1 = 2, /* no vehicle, charging not possible */ + McuHeidelberg_ChargerState_A2 = 3, /* no vehicle, charging possible */ + McuHeidelberg_ChargerState_B1 = 4, /* vehicle plugged, charging not possible */ + McuHeidelberg_ChargerState_B2 = 5, /* vehicle plugged, charging possible */ + McuHeidelberg_ChargerState_C1 = 6, /* vehicle charging request, charging not possible */ + McuHeidelberg_ChargerState_C2 = 7, /* vehicle charging request, charging possible */ + McuHeidelberg_ChargerState_Derating = 8, /* charging current derating due temperature */ + McuHeidelberg_ChargerState_E = 9, /* error state */ + McuHeidelberg_ChargerState_F = 10, /* wallbox locked or not ready */ + McuHeidelberg_ChargerState_Error = 11, /* error state */ +} McuHeidelbergChargerState_e; + +McuHeidelbergChargerState_e McuHeidelberg_GetHWChargerState(void); +const unsigned char *McuHeidelberg_GetShortHWChargerStateString(McuHeidelbergChargerState_e state); + +uint32_t McuHeidelberg_GetSolarPowerWatt(void); +void McuHeidelberg_SetSolarPowerWatt(uint32_t powerW); + +uint32_t McuHeidelberg_GetSitePowerWatt(void); +void McuHeidelberg_SetSitePowerWatt(uint32_t powerW); + +int32_t McuHeidelberg_GetGridPowerWatt(void); +void McuHeidelberg_SetGridPowerWatt(int32_t powerW); + +int32_t McuHeidelberg_GetBatteryPowerWatt(void); +void McuHeidelberg_SetBatteryPowerWatt(int32_t powerW); + +uint32_t McuHeidelberg_GetMaxCarPower(void); + +uint32_t McuHeidelberg_GetCurrChargerPower(void); + +uint8_t McuHeidelberg_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); + +void McuHeidelberg_Deinit(void); +void McuHeidelberg_Init(void); + +#endif /* MODBUS_MCUHEIDELBERG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/Modbus/McuHeidelberg_config.h b/TSM_PicoW_Sensor/McuLib/Modbus/McuHeidelberg_config.h new file mode 100644 index 0000000..c369efa --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/Modbus/McuHeidelberg_config.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2022, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MODBUS_MCUHEIDELBERG_CONFIG_H_ +#define MODBUS_MCUHEIDELBERG_CONFIG_H_ + +#ifndef McuHeidelberg_CONFIG_USE_MOCK_WALLBOX + #define McuHeidelberg_CONFIG_USE_MOCK_WALLBOX (0) + /*!< if using testing mocks for wallbox state and phase values instead of real state. Note this cannot be used with a real vehicle! */ +#endif + +#ifndef McuHeidelberg_CONFIG_USE_MOCK_SOLAR + #define McuHeidelberg_CONFIG_USE_MOCK_SOLAR (0) + /*!< if using testing mocks for solar and site power instead of real power */ +#endif + +#ifndef McuHeidelberg_CONFIG_USE_WATCHDOG + #define McuHeidelberg_CONFIG_USE_WATCHDOG (0) + /*!< if using MCU watchdog functionality */ +#endif + +#ifndef McuHeidelberg_CONFIG_HYSTERESIS_POWER + #define McuHeidelberg_CONFIG_HYSTERESIS_POWER (150) + /*! Use this value as hysteresis */ +#endif + +#ifndef McuHeidelberg_CONFIG_BASE_SITE_POWER + #define McuHeidelberg_CONFIG_BASE_SITE_POWER (250) + /*! Use this value as the site base power */ +#endif + +#ifndef McuHeidelberg_CONFIG_DEFAULT_CHARGING_MODE + #define McuHeidelberg_CONFIG_DEFAULT_CHARGING_MODE McuHeidelberg_User_ChargingMode_SlowPlusPV + /*!< one of McuHeidelberg_UserChargingMode_e, used at startup */ +#endif + +#endif /* MODBUS_MCUHEIDELBERG_CONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/Modbus/McuModbus.c b/TSM_PicoW_Sensor/McuLib/Modbus/McuModbus.c new file mode 100644 index 0000000..c438334 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/Modbus/McuModbus.c @@ -0,0 +1,207 @@ +/* + * Copyright (c) 2022, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuModbus.h" +#if McuModbus_CONFIG_IS_ENABLED +#include +#include "McuRTOS.h" +#include "McuUtility.h" +#include "McuUart485.h" +#include "McuLog.h" + +#define McuModbus_TELEGRAM_SIZE (8) + +#if McuModbus_CONFIG_USE_MUTEX + static SemaphoreHandle_t McuModbus_Mutex = NULL; /* Semaphore to protect bus access */ +#endif + +#if McuModbus_CONFIG_USE_MUTEX +static bool McuModbus_RequestBus(void) { + return xSemaphoreTakeRecursive(McuModbus_Mutex, portMAX_DELAY)==pdPASS; +} +#endif + +#if McuModbus_CONFIG_USE_MUTEX +static void McuModbus_ReleaseBus(void) { + (void)xSemaphoreGiveRecursive(McuModbus_Mutex); +} +#endif + +static uint16_t McuModbus_CRC(uint8_t *buf, size_t len) { + uint16_t crc = 0xFFFF; + + for(int pos=0; pos0; i--) { + if ((crc&0x1)!=0) { + crc >>= 1; + crc ^= 0xA001; + } else { + crc >>= 1; + } + } + } + return crc; +} + +static void McuModbus_CreateReadTelegram(uint8_t telegram[McuModbus_TELEGRAM_SIZE], uint8_t slaveId, McuModbus_Func_Code_e function, uint16_t addr, uint16_t nofCoils) { + telegram[0] = slaveId; + telegram[1] = function; + telegram[2] = addr>>8; + telegram[3] = addr&0xff; + telegram[4] = nofCoils>>8; + telegram[5] = nofCoils&0xff; + uint16_t crc = McuModbus_CRC(telegram, 6); + telegram[6] = crc&0xff; + telegram[7] = crc>>8; +} + +static void McuModbus_CreateWriteTelegram(uint8_t telegram[McuModbus_TELEGRAM_SIZE], uint8_t slaveId, McuModbus_Func_Code_e function, uint16_t addr, uint16_t data) { + telegram[0] = slaveId; + telegram[1] = function; + telegram[2] = addr>>8; + telegram[3] = addr&0xff; + telegram[4] = data>>8; + telegram[5] = data&0xff; + uint16_t crc = McuModbus_CRC(telegram, 6); + telegram[6] = crc&0xff; + telegram[7] = crc>>8; +} + +static void McuModbus_SendTelegram(uint8_t *telegram, size_t size) { + McuUart485_ClearRxQueue(); /* clear queue just in case */ + McuUart485_SendBlock(telegram, size); /* send telegram */ +} + +static uint8_t McuModbus_ReceiveResponseInputRegister(uint8_t deviceID, McuModbus_Func_Code_e function, uint16_t *regs, uint16_t nofRegs, int timeoutMs) { + unsigned char response[32]; /* minimum of 5 bytes + nofRegs*2 */ + int i; + + if (5+nofRegs*sizeof(uint16_t)>sizeof(response)) { + return ERR_OVERFLOW; /* response buffer size too small */ + } + i = 0; + memset(regs, 0, nofRegs/sizeof(uint16_t)); /* clear response buffer */ + while(i0) { + if (McuUart485_GetRxQueueByte(&response[i], pdMS_TO_TICKS(McuModbus_CONFIG_QUEUE_RX_TIMEOUT_MS))==ERR_OK) { + i++; + } else { /* timeout */ + timeoutMs -= McuModbus_CONFIG_QUEUE_RX_TIMEOUT_MS; /* queue waiting time */ + if (timeoutMs<0) { + return ERR_IDLE; /* timeout */ + } + } + } + /* check response, see https://www.simplymodbus.ca/FC04.htm */ + if (i!=5+nofRegs*sizeof(uint16_t)) { /* 1: slave addr, 1: function code, 1: nof bytes, nofData*2, 2: CRC */ + return ERR_FAILED; /* response size does not match */ + } + if (response[0]!=deviceID) { + return ERR_FAILED; /* response ID does not match */ + } + if (response[1]!=function) { + return ERR_FAILED; /* response function code does not match */ + } + if (response[2]!=nofRegs*sizeof(uint16_t)) { + return ERR_FAILED; /* number of bytes does not match expectation */ + } + uint16_t crc = (response[4+nofRegs*sizeof(uint16_t)]<<8)+response[3+nofRegs*sizeof(uint16_t)]; + if (crc!=McuModbus_CRC(response, 3+nofRegs*sizeof(uint16_t))) { + return ERR_CRC; /* CRC does not match */ + } + for(int i=0; istdOut); + return ERR_OK; +} + +static uint8_t PrintHelp(const McuShell_StdIOType *io) { + McuShell_SendHelpStr((unsigned char*)"McuModbus", (unsigned char*)"Group of McuModbus commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Print help or status information\r\n", io->stdOut); + return ERR_OK; +} + +uint8_t McuModbus_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) { + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, "McuModbus help")==0) { + *handled = true; + return PrintHelp(io); + } else if ((McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) || (McuUtility_strcmp((char*)cmd, "McuModbus status")==0)) { + *handled = true; + return PrintStatus(io); + } + return ERR_OK; +} + +void McuModbus_Deinit(void) { +#if McuModbus_CONFIG_USE_MUTEX + vSemaphoreDelete(McuModbus_Mutex); + McuModbus_Mutex = NULL; +#endif +} + +void McuModbus_Init(void) { +#if McuModbus_CONFIG_USE_MUTEX + McuModbus_Mutex = xSemaphoreCreateRecursiveMutex(); + if (McuModbus_Mutex==NULL) { /* semaphore creation failed */ + McuLog_fatal("failed creating mutex"); + for(;;) {} /* error, not enough memory? */ + } + vQueueAddToRegistry(McuModbus_Mutex, "McuModbus_Mutex"); +#endif +} + +#endif /* McuModbus_CONFIG_IS_ENABLED */ diff --git a/TSM_PicoW_Sensor/McuLib/Modbus/McuModbus.h b/TSM_PicoW_Sensor/McuLib/Modbus/McuModbus.h new file mode 100644 index 0000000..ddc4c9d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/Modbus/McuModbus.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MCUMODBUS_H_ +#define MCUMODBUS_H_ + +#include "McuModbus_config.h" +#include +#include +#include "McuShell.h" + +typedef enum McuModbus_Func_Code_e { + McuModbus_Func_ReadCoils = 0x01, + McuModbus_Func_ReadDiscreteInputs = 0x02, + McuModbus_Func_ReadHoldingRegisters = 0x03, + McuModbus_Func_ReadInputRegisters = 0x04, + McuModbus_Func_WriteSingleCoil = 0x05, + McuModbus_Func_WriteSingleRegister = 0x06, + McuModbus_Func_WriteMultipleCoils = 0x0f, + McuModbus_Func_WriteMultipleRegisters = 0x10, +} McuModbus_Func_Code_e; + +uint8_t McuModbus_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); + +void McuModbus_Send(uint8_t slaveID, McuModbus_Func_Code_e function, uint16_t addr, uint16_t nofCoils, uint8_t *result, const McuShell_StdIOType *io); + +uint8_t McuModbus_ReadInputRegisters(uint8_t deviceID, uint16_t addr, uint16_t nofRegs, uint16_t *result); +uint8_t McuModbus_WriteInputRegister(uint8_t deviceID, uint16_t addr, uint16_t value); + +uint8_t McuModbus_ReadHoldingRegisters(uint8_t deviceID, uint16_t addr, uint16_t nofRegs, uint16_t *result); +uint8_t McuModbus_WriteHoldingRegister(uint8_t deviceID, uint16_t addr, uint16_t value); + +void McuModbus_Deinit(void); +void McuModbus_Init(void); + +#endif /* MCUMODBUS_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/Modbus/McuModbus_config.h b/TSM_PicoW_Sensor/McuLib/Modbus/McuModbus_config.h new file mode 100644 index 0000000..d1c0404 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/Modbus/McuModbus_config.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2022, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MODBUS_MCUMODBUS_CONFIG_H_ +#define MODBUS_MCUMODBUS_CONFIG_H_ + +#ifndef McuModbus_CONFIG_IS_ENABLED + #define McuModbus_CONFIG_IS_ENABLED (0) + /*!< 0: disabled; 1: enabled */ +#endif + +#ifndef McuModbus_CONFIG_RX_TIMEOUT_MS + #define McuModbus_CONFIG_RX_TIMEOUT_MS (500) + /*!< default timeout waiting for an answer from the device */ +#endif + +#ifndef McuModbus_CONFIG_QUEUE_RX_TIMEOUT_MS + #define McuModbus_CONFIG_QUEUE_RX_TIMEOUT_MS (10) + /*!< default timeout waiting for a queue element from the RX interrupt */ +#endif + +#ifndef McuModbus_CONFIG_BUS_WAIT_TIME_MS + #define McuModbus_CONFIG_BUS_WAIT_TIME_MS (15) + /*!< forced waiting time after a bus transfer */ +#endif + +#ifndef McuModbus_CONFIG_USE_MUTEX + #define McuModbus_CONFIG_USE_MUTEX (1) + /*!< 1: use a mutex to access the bus; 0: no mutex used */ +#endif + +#endif /* MODBUS_MCUMODBUS_CONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/Modbus/readme.txt b/TSM_PicoW_Sensor/McuLib/Modbus/readme.txt new file mode 100644 index 0000000..8aafbba --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/Modbus/readme.txt @@ -0,0 +1,10 @@ +ModBus readme.txt +----------------- + +See https://en.wikipedia.org/wiki/Modbus + +Modbus client on host: +https://sourceforge.net/projects/qmodbus/ + +Modbus für RP2040: +https://github.com/alejoseb/Modbus-PI-Pico-FreeRTOS \ No newline at end of file diff --git a/TSM_PicoW_Sensor/McuLib/README.md b/TSM_PicoW_Sensor/McuLib/README.md new file mode 100644 index 0000000..2a39310 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/README.md @@ -0,0 +1,92 @@ +This is the 'McuOnEclipseLibrary' or short 'McuLib': a scalable C/C++ library from the McuOnEclipse (https://mcuoneclipse.com/) project. +Some of the drivers are generated by Processor Expert for legacy reasons, but no Processor Expert is required to use the library. + +Directories: +- Generator: Processor Expert (NXP Kinetis Design Studio) project used to create some of the files. +- `lib/src`: driver source and interface files +- `lib/config`: driver configuration header files +- `lib/fonts`: graphical fonts used with the McuFontDisplay + +Additionally following middleware is provided: +- `lib\FatFS`: FAT FS File System by Elm Chan +- `lib\FreeRTOS`: FreeRTOS port for ARM Cortex-M (M0, M4, M33, M7) and RISC-V +- `lib\HD44780`: library for the HD44780 character display + see https://mcuoneclipse.com/2019/01/27/tutorial-hd44780-display-driver-with-nxp-mcuxpresso-sdk/ +- `lib\LittlevGL`: GUI library for microcontrollers and small LCD's +- `lib\SEGGER_RTT`: Port of the SEGGER RTT Library +- `lib\SEGGER_Sysview`: Port of the SEGGER SystemView Library +- `lib\TraceRecorder`: Port of the Percepio Tracealyzer library, see + https://mcuoneclipse.com/2018/02/18/faster-freertos-percepio-tracealyzer-streaming-with-segger-rtt/ + https://mcuoneclipse.com/2017/03/08/percepio-freertos-tracealyzer-plugin-for-eclipse/ +- `lib\minIni`: INI file reading and writing, see + https://mcuoneclipse.com/2014/04/26/frdm-with-arduino-ethernet-shield-r3-part-4-minini/ + https://mcuoneclipse.com/2020/05/20/fatfs-minini-shell-and-freertos-for-the-nxp-k22fn512/ + https://mcuoneclipse.com/2021/05/15/using-fatfs-and-minini-with-the-nxp-lpc55s16-evk/ + https://mcuoneclipse.com/2021/12/19/key-value-pairs-in-flash-memory-file-system-less-minini/ + +Make sure you follow my McuOnEclipse blog: http://mcuoneclipse.com/ for updates and new articles. + +How to integrate the library +============================ +NEW: if you consider adding the McuLib to many Eclipse/MCUXpresso projects, consider using + the PowerShell scripts written by 'urhano': https://github.com/urhano/addMCULib + +- download the repository zip file: https://github.com/ErichStyger/McuOnEclipseLibrary/archive/master.zip +- place the 'lib' folder into your Eclipse project and rename it to 'McuLib'. You can use any other name, but then you need to change the include paths accordingly +- Make sure that the folder is included in the build (see https://mcuoneclipse.com/2014/07/22/exclude-source-files-from-build-in-eclipse/) +- Add the following paths to the compiler include settings (you might simply copy-paste them into the control): + +``` +../McuLib/config +../McuLib/config/fonts +../McuLib/fonts +../McuLib/src +../McuLib/FreeRTOS/Source/include +../McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F +../McuLib/SEGGER_RTT +../McuLib/SEGGER_Sysview +../McuLib/TraceRecorder +../McuLib/TraceRecorder/config +../McuLib/TraceRecorder/include +../McuLib/TraceRecorder/streamports/Jlink_RTT/include +../McuLib/HD44780 +../McuLib/minIni +``` + +- Disable or remove not used FreeRTOS ports, e.g. + ../McuLib/FreeRTOS/Source/portable/GCC/ARM_CM33 + ../McuLib/FreeRTOS/Source/portable/GCC/RISC-V +- If the project contains a hard fault handler: disable or remove it, as the McuLib comes with its own handler. +- Edit the McuLib/config/McuLibConfig.h header file which configures the library. Below the settings for the Kinetis (ARM Cortex-M4F with FPU) using the MCUXpresso SDK 2.5.0: + +```c +#define McuLib_CONFIG_CPU_IS_ARM_CORTEX_M (1 || defined(__CORTEX_M)) +#define McuLib_CONFIG_CPU_IS_KINETIS (1 && McuLib_CONFIG_CPU_IS_ARM_CORTEX_M) +#define McuLib_CONFIG_CORTEX_M (4) +#define McuLib_CONFIG_FPU_PRESENT (1 || (defined(__FPU_PRESENT) && (__FPU_PRESENT)==1)) +#define McuLib_CONFIG_FPU_USED (1 || (defined(__FPU_USED) && (__FPU_USED)==1)) +#define McuLib_CONFIG_SDK_VERSION_MAJOR (2) +#define McuLib_CONFIG_SDK_VERSION_MINOR (5) +#define McuLib_CONFIG_SDK_VERSION_BUILD (0) +#define McuLib_CONFIG_SDK_VERSION_USED McuLib_CONFIG_SDK_MCUXPRESSO_2_0 +``` + +How to use the Modules in the library +===================================== +a) Include the Module header file: +```c +#include "McuWait.h" +``` + +b) Initialize the Module before using it: +```c +McuWait_Init(); /* initialize the module */ +``` + +c) Use the Module: +```c +McuWait_Waitms(100); /* wait for 100 ms */ +``` + +Enjoy! +Erich diff --git a/TSM_PicoW_Sensor/McuLib/RNet/McuNRF24L01.c b/TSM_PicoW_Sensor/McuLib/RNet/McuNRF24L01.c new file mode 100644 index 0000000..9b43258 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/RNet/McuNRF24L01.c @@ -0,0 +1,1501 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuNRF24L01.c +** Component : nRF24L01 +** Version : Component 01.103, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2021-07-06, 16:35, # CodeGen: 0 +** Abstract : +** This component implements a driver for the Nordic Semiconductor nRF24L01 2.4 GHz transceiver. +** Settings : +** Contents : +** ConfigureSPI - void McuNRF24L01_ConfigureSPI(void); +** WriteRegister - void McuNRF24L01_WriteRegister(uint8_t reg, uint8_t val); +** ReadRegister - uint8_t McuNRF24L01_ReadRegister(uint8_t reg); +** ReadRegisterData - void McuNRF24L01_ReadRegisterData(uint8_t reg, uint8_t *buf, uint8_t bufSize); +** WriteRegisterData - void McuNRF24L01_WriteRegisterData(uint8_t reg, uint8_t *buf, uint8_t bufSize); +** WriteRead - uint8_t McuNRF24L01_WriteRead(uint8_t val); +** Write - void McuNRF24L01_Write(uint8_t val); +** GetStatus - uint8_t McuNRF24L01_GetStatus(void); +** GetStatusClrIRQ - uint8_t McuNRF24L01_GetStatusClrIRQ(void); +** ResetStatusIRQ - void McuNRF24L01_ResetStatusIRQ(uint8_t flags); +** TxPayload - void McuNRF24L01_TxPayload(uint8_t *payload, uint8_t payloadSize); +** RxPayload - void McuNRF24L01_RxPayload(uint8_t *payload, uint8_t payloadSize); +** StopRxTx - void McuNRF24L01_StopRxTx(void); +** StartRxTx - void McuNRF24L01_StartRxTx(void); +** EnableAutoAck - uint8_t McuNRF24L01_EnableAutoAck(uint8_t pipes); +** SetStaticPipePayload - uint8_t McuNRF24L01_SetStaticPipePayload(uint8_t pipe, uint8_t payloadBytes); +** EnableDynamicPayloadLength - uint8_t McuNRF24L01_EnableDynamicPayloadLength(uint8_t pipeMask); +** WriteFeature - uint8_t McuNRF24L01_WriteFeature(uint8_t featureMask); +** ReadFeature - uint8_t McuNRF24L01_ReadFeature(uint8_t *featureMask); +** ReadNofRxPayload - uint8_t McuNRF24L01_ReadNofRxPayload(uint8_t *nof); +** ReadObserveTxRegister - uint8_t McuNRF24L01_ReadObserveTxRegister(uint8_t *nofLoss, uint8_t *nofRetransmitted); +** ReadReceivedPowerDetector - uint8_t McuNRF24L01_ReadReceivedPowerDetector(uint8_t *rpd); +** SetChannel - uint8_t McuNRF24L01_SetChannel(uint8_t channel); +** GetChannel - uint8_t McuNRF24L01_GetChannel(uint8_t *channel); +** ConstantCarrierWave - uint8_t McuNRF24L01_ConstantCarrierWave(bool turnOn); +** SetOutputPower - uint8_t McuNRF24L01_SetOutputPower(int8_t power); +** GetOutputPower - uint8_t McuNRF24L01_GetOutputPower(int8_t *power); +** SetDataRate - uint8_t McuNRF24L01_SetDataRate(uint16_t rate); +** GetDataRate - uint8_t McuNRF24L01_GetDataRate(uint16_t *rate); +** SetAddressWidth - uint8_t McuNRF24L01_SetAddressWidth(uint8_t width); +** GetAddressWidth - uint8_t McuNRF24L01_GetAddressWidth(uint8_t *pAddrWidth); +** SetTxAddress - uint8_t McuNRF24L01_SetTxAddress(uint8_t *address, uint8_t nofAddressBytes); +** GetTxAddress - uint8_t McuNRF24L01_GetTxAddress(uint8_t *address, uint8_t nofAddressBytes); +** SetRxAddress - uint8_t McuNRF24L01_SetRxAddress(uint8_t pipe, uint8_t *address, uint8_t... +** GetRxAddress - uint8_t McuNRF24L01_GetRxAddress(uint8_t pipe, uint8_t *address, uint8_t... +** GetFifoStatus - uint8_t McuNRF24L01_GetFifoStatus(uint8_t *status); +** PollInterrupt - bool McuNRF24L01_PollInterrupt(void); +** Deinit - void McuNRF24L01_Deinit(void); +** Init - void McuNRF24L01_Init(void); +** +** * Copyright (c) 2013-2018, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuNRF24L01.c +** @version 01.00 +** @brief +** This component implements a driver for the Nordic Semiconductor nRF24L01 2.4 GHz transceiver. +*/ +/*! +** @addtogroup McuNRF24L01_module McuNRF24L01 module documentation +** @{ +*/ + +/* MODULE McuNRF24L01. */ + +#include "McuNRF24L01.h" +#if McuNRF24L01_CONFIG_IS_ENABLED +#include "McuWait.h" +#include "McuSPI.h" +#include "McuGPIO.h" +#include "McuLog.h" +#include "McuUtility.h" + +static McuGPIO_Handle_t cePin; /* CE pin, HIGH active, if active, device is in RX/TX mode */ +static McuGPIO_Handle_t csnPin; /* CSN pin, LOW active, used to select device (chip select) to send commands */ + +/* Macros to hide low level functionality */ +#define McuNRF24L01_WAIT_US(x) McuWait_Waitus(x) /* wait for the given number of micro-seconds */ +#define McuNRF24L01_CE_LOW() McuGPIO_SetLow(cePin) /* put CE LOW */ +#define McuNRF24L01_CE_HIGH() McuGPIO_SetHigh(cePin) /* put CE HIGH */ +#define McuNRF24L01_CSN_LOW() McuGPIO_SetLow(csnPin) /* put CSN LOW, activate bus */ +#define McuNRF24L01_CSN_HIGH() McuGPIO_SetHigh(csnPin) /* put CSN HIGH, deactivate bus */ + +#define McuNRF24L01_USE_SPI_BLOCK_MODE 0 /* using SPI block read/write */ + +#if 0 +static void SM1_Enable(void) { + /*! \todo */ +} + +static void SM1_Disable(void) { + /*! \todo */ +} + +static int SM1_SetShiftClockPolarity(int pol) { + /*! \todo */ + return ERR_OK; +} + +static int SM1_SetIdleClockPolarity(int pol) { + /*! \todo */ + return ERR_OK; +} + +static int SM1_SetBaudRate(int baud) { + return McuSPI_SetBaudRate(baud); +} +#endif +#if 0 +static int SM1_GetCharsInTxBuf(void) { + return 0; +} + +static int SM1_GetCharsInRxBuf(void) { + return 1; +} + +static int SM1_SendChar(unsigned char ch) { + return McuSPI_SendByte(ch); +} +#endif +void McuNRF24L01_OnActivate(void) { +#if PL_HAS_SPI + SPI_OnSPIActivate(SPI_BAUD_INDEX_NRF); +#endif +} + +void McuNRF24L01_OnDeactivate(void) { +#if PL_HAS_SPI + SPI_OnSPIDeactivate(SPI_BAUD_INDEX_NRF); +#endif +} + +/* HW SPI */ +#define McuNRF24L01_SPI_Enable() SM1_Enable() +#define McuNRF24L01_SPI_Disable() SM1_Disable() +#define McuNRF24L01_SPI_SetShiftClockPolarity(val) (void)SM1_SetShiftClockPolarity(val) +#define McuNRF24L01_SPI_SetIdleClockPolarity(val) (void)SM1_SetIdleClockPolarity(val) +#define McuNRF24L01_SPI_GetCharsInTxBuf() SM1_GetCharsInTxBuf() +#define McuNRF24L01_SPI_GetCharsInRxBuf() SM1_GetCharsInRxBuf() +#define McuNRF24L01_SPI_SendChar(ch) SM1_SendChar(ch) +#define McuNRF24L01_SPI_RecvChar(p) McuSPI_ReceiveByte(p) +#define McuNRF24L01_SPI_SetBaudRateMode(m) SM1_SetBaudRateMode(m) + +#if McuNRF24L01_CONFIG_USE_MUTEX + #include "McuRTOS.h" + + static SemaphoreHandle_t McuNRF24L01_Mutex = NULL; /* Mutex to allow mutual exclusive access to the bus */ +#endif +/* Internal method prototypes */ +static uint8_t SPIWriteRead(uint8_t val); +static void SPIWriteReadBuffer(uint8_t *bufOut, uint8_t *bufIn, uint8_t bufSize); +static void SPIWriteBuffer(uint8_t *bufOut, uint8_t bufSize); + +/* +** =================================================================== +** Method : ConfigureSPI (component nRF24L01) +** +** Description : +** Configures the SPI bus +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuNRF24L01_ConfigureSPI(void) +{ +#if McuNRF24L01_SWITCH_BUS + (void)McuNRF24L01_SPI_Disable(); + (void)McuNRF24L01_SPI_SetShiftClockPolarity(0); /* falling edge */ + (void)McuNRF24L01_SPI_SetIdleClockPolarity(0); /* low idle clock polarity */ + (void)McuNRF24L01_SPI_SetBaudRateMode(McuNRF24L01_BAUD_RATE_MODE); /* set bus speed */ + McuSPI_SetBaudRate(baud); + (void)McuNRF24L01_SPI_Enable(); +#endif +} + +/* +** =================================================================== +** Method : SPIWriteRead (component nRF24L01) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +static uint8_t SPIWriteRead(uint8_t val) +{ + uint8_t ch; +#if 0 + while(McuNRF24L01_SPI_GetCharsInTxBuf()!=0) {} /* wait until tx is empty */ + while(McuNRF24L01_SPI_SendChar(val)!=ERR_OK) {} /* send character */ + while(McuNRF24L01_SPI_GetCharsInTxBuf()!=0) {} /* wait until data has been sent */ + while(McuNRF24L01_SPI_GetCharsInRxBuf()==0) {} /* wait until we receive data */ + while(McuNRF24L01_SPI_RecvChar(&ch)!=ERR_OK) {} /* get data */ +#else + int res = McuSPI_SendReceiveByte(val, &ch); + if (res!=0) { + McuLog_fatal("failed SPI send and receive"); + } +#endif + return ch; +} + +/* +** =================================================================== +** Method : SPIWriteReadBuffer (component nRF24L01) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +static void SPIWriteReadBuffer(uint8_t *bufOut, uint8_t *bufIn, uint8_t bufSize) +{ +#if McuNRF24L01_USE_SPI_BLOCK_MODE + uint16_t snt, rcvd; + + while(McuNRF24L01_SPI_GetCharsInTxBuf()!=0) {} /* wait until tx is empty */ + while(SPI_SendBlock(bufOut, bufSize, &snt)!=ERR_OK) { + /* send buffer */ + } + while(McuNRF24L01_SPI_GetCharsInTxBuf()!=0) {} /* wait until data has been sent */ + while(McuNRF24L01_SPI_GetCharsInRxBuf()==0) {} /* wait until we receive data */ + while(SPI_RecvBlock(bufIn, bufSize, &rcvd)!=ERR_OK) { + /* get data */ + } +#else + uint8_t i; + + for(i=0;iSPI_INP_BUF_SIZE) { /* not enough dummy buffer */ + uint8_t i; + + for(i=0;i32 +** then the data is not valid. +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuNRF24L01_ReadNofRxPayload(uint8_t *nof) +{ + *nof = McuNRF24L01_ReadRegister(McuNRF24L01_R_RX_PL_WID); /* read number of RX payload for pipe */ + return ERR_OK; +} + +/* +** =================================================================== +** Method : SetStaticPipePayload (component nRF24L01) +** +** Description : +** Specifies the static payload for a pipe. +** Parameters : +** NAME - DESCRIPTION +** pipe - Pipe number, 0 to 5 +** payloadBytes - Number of payload pipes +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuNRF24L01_SetStaticPipePayload(uint8_t pipe, uint8_t payloadBytes) +{ + if (pipe > 5) { + return ERR_FAULT; /* only pipe 0 to 5 allowed */ + } + if (payloadBytes>32) { + return ERR_FAULT; + } + McuNRF24L01_WriteRegister(McuNRF24L01_RX_PW_P0+pipe, payloadBytes); /* write number of RX payload for pipe */ + return ERR_OK; +} + +/* +** =================================================================== +** Method : EnableDynamicPayloadLength (component nRF24L01) +** +** Description : +** Enables dynamic payload length for the give pipes +** Parameters : +** NAME - DESCRIPTION +** pipeMask - Mask of pipes, with 1 for pipe 0, +** 2 for pipe 1, 4 for pipe 2 and so on. +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuNRF24L01_EnableDynamicPayloadLength(uint8_t pipeMask) +{ + /* note: dynamic payload requires EN_DPL and ENAA_Px set for the pipe */ + if (pipeMask>0x3F) { + return ERR_FAULT; /* only pipe 0 to 5 allowed */ + } + McuNRF24L01_WriteRegister(McuNRF24L01_DYNPD, pipeMask); /* write number of RX payload for pipe */ + return ERR_OK; +} + +/* +** =================================================================== +** Method : WriteFeature (component nRF24L01) +** +** Description : +** Writes the FEATURE register +** Parameters : +** NAME - DESCRIPTION +** featureMask - Mask of FEATURE, e.g. +** FEATURE_EN_DPL +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuNRF24L01_WriteFeature(uint8_t featureMask) +{ + if (featureMask>(McuNRF24L01_FEATURE_EN_DPL|McuNRF24L01_FEATURE_EN_ACK_PAY|McuNRF24L01_FEATURE_EN_DYN_PAY)) { + return ERR_FAULT; /* mismatch of feature mask */ + } + McuNRF24L01_WriteRegister(McuNRF24L01_FEATURE, featureMask); /* write number of RX payload for pipe */ + return ERR_OK; +} + +/* +** =================================================================== +** Method : ReadFeature (component nRF24L01) +** +** Description : +** Reads the FEATURE register +** Parameters : +** NAME - DESCRIPTION +** * featureMask - Pointer to value of +** FEATURE register +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuNRF24L01_ReadFeature(uint8_t *featureMask) +{ + *featureMask = McuNRF24L01_ReadRegister(McuNRF24L01_FEATURE); /* read FEATURE register */ + return ERR_OK; +} + +/* +** =================================================================== +** Method : ReadObserveTxRegister (component nRF24L01) +** +** Description : +** Reads the OBSERVE_TX register to return the count of loss +** packets and count of retransmitted packets. +** Parameters : +** NAME - DESCRIPTION +** * nofLoss - Pointer to number of lost packets +** * nofRetransmitted - Pointer to +** number of retransmitted packets +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuNRF24L01_ReadObserveTxRegister(uint8_t *nofLoss, uint8_t *nofRetransmitted) +{ + uint8_t val; + + val = McuNRF24L01_ReadRegister(McuNRF24L01_OBSERVE_TX); /* read OBSERVE_TX register */ + *nofLoss = (uint8_t)((val&0xF0)>>4); /* high nibble */ + *nofRetransmitted = (uint8_t)(val&0x0F); /* high nibble */ + return ERR_OK; +} + +/* +** =================================================================== +** Method : ReadReceivedPowerDetector (component nRF24L01) +** +** Description : +** Reads the RPD (Received Power Detector) register. +** Parameters : +** NAME - DESCRIPTION +** * rpd - Pointer to RPD bit. Bit is one for +** received power levels above -64 dBm, zero +** for less than -64 dBm. +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuNRF24L01_ReadReceivedPowerDetector(uint8_t *rpd) +{ + *rpd = McuNRF24L01_ReadRegister(McuNRF24L01_RPD); /* read RPD register */ + return ERR_OK; +} + +/* +** =================================================================== +** Method : ConstantCarrierWave (component nRF24L01) +** +** Description : +** Put the transceiver into contant carrier wave output for +** testing. The output power of a radio is a critical factor +** for achieving wanted range. Output power is also the first +** test +** Parameters : +** NAME - DESCRIPTION +** turnOn - Set to true to start constant +** carrier wave, false to stop it. +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuNRF24L01_ConstantCarrierWave(bool turnOn) +{ + /* note: RF channel, output power should be set independently */ + uint8_t val; + + if (turnOn) { + /* Set PWR_UP = 1 and PRIM_RX = 0 in the CONFIG register. */ + McuNRF24L01_WriteRegister(McuNRF24L01_CONFIG, McuNRF24L01_PWR_UP|McuNRF24L01_PRIM_TX); + /*lint -save -e522 function lacks side effect */ + McuNRF24L01_WAIT_US(1500); /* Wait 1.5ms PWR_UP->standby */ + /*lint -restore */ + /* In the RF register set: + - CONT_WAVE = 1. + - PLL_LOCK = 1. + - RF_PWR (is set independently) + */ + val = McuNRF24L01_ReadRegister(McuNRF24L01_RF_SETUP); /* read RF_SETUP register */ + val |= McuNRF24L01_RF_SETUP_CONT_WAVE|McuNRF24L01_RF_SETUP_PLL_LOCK; /* set bits */ + McuNRF24L01_WriteRegister(McuNRF24L01_RF_SETUP, val); + McuNRF24L01_CE_HIGH(); /* CE is high for carrier transmission */ + /* CE is kept high as long the carrier is needed */ + } else { + val = McuNRF24L01_ReadRegister(McuNRF24L01_RF_SETUP); /* read RF_SETUP register */ + val &= ~(McuNRF24L01_RF_SETUP_CONT_WAVE|McuNRF24L01_RF_SETUP_PLL_LOCK); /* clear bits */ + McuNRF24L01_WriteRegister(McuNRF24L01_RF_SETUP, val); /* write back value */ + McuNRF24L01_CE_LOW(); /* pull CE Low to disable transceiver */ + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : SetOutputPower (component nRF24L01) +** +** Description : +** Sets the output power +** Parameters : +** NAME - DESCRIPTION +** power - Output power in dBm, either 0, -10, -12 +** or -18 +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuNRF24L01_SetOutputPower(int8_t power) +{ + uint8_t val; + + /* get current register value */ + val = McuNRF24L01_ReadRegister(McuNRF24L01_RF_SETUP); /* read RF_SETUP register */ + val &= ~McuNRF24L01_RF_SETUP_RF_PWR_MASK; /* clear bits */ + if (power==-18) { + val |= McuNRF24L01_RF_SETUP_RF_PWR_18; + } else if (power==-12) { + val |= McuNRF24L01_RF_SETUP_RF_PWR_12; + } else if (power==-10) { + val |= McuNRF24L01_RF_SETUP_RF_PWR_10; + } else if (power==0) { + val |= McuNRF24L01_RF_SETUP_RF_PWR_0; + } else { + return ERR_RANGE; + } + McuNRF24L01_WriteRegister(McuNRF24L01_RF_SETUP, val); + return ERR_OK; +} + +/* +** =================================================================== +** Method : GetOutputPower (component nRF24L01) +** +** Description : +** Returns the current output power +** Parameters : +** NAME - DESCRIPTION +** * power - Pointer to where to store the value. +** Returns the output power in dBm +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuNRF24L01_GetOutputPower(int8_t *power) +{ + uint8_t val; + + val = McuNRF24L01_ReadRegister(McuNRF24L01_RF_SETUP); /* read RF_SETUP register */ + if ((val&McuNRF24L01_RF_SETUP_RF_PWR_MASK)==McuNRF24L01_RF_SETUP_RF_PWR_18) { + *power = -18; + } else if ((val&McuNRF24L01_RF_SETUP_RF_PWR_MASK)==McuNRF24L01_RF_SETUP_RF_PWR_12) { + *power = -12; + } else if ((val&McuNRF24L01_RF_SETUP_RF_PWR_MASK)==McuNRF24L01_RF_SETUP_RF_PWR_10) { + *power = -10; + } else if ((val&McuNRF24L01_RF_SETUP_RF_PWR_MASK)==McuNRF24L01_RF_SETUP_RF_PWR_0) { + *power = 0; + } else { + return ERR_RANGE; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : SetDataRate (component nRF24L01) +** +** Description : +** Sets the data rate +** Parameters : +** NAME - DESCRIPTION +** rate - Data rate, either 250, 1000 or 2000 +** (kbps) +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuNRF24L01_SetDataRate(uint16_t rate) +{ + uint8_t val; + + /* get current register value */ + val = McuNRF24L01_ReadRegister(McuNRF24L01_RF_SETUP); /* read RF_SETUP register */ + val &= ~McuNRF24L01_RF_SETUP_RF_DR_MASK; /* clear bits */ + if (rate==250) { + val |= McuNRF24L01_RF_SETUP_RF_DR_250; + } else if (rate==1000) { + val |= McuNRF24L01_RF_SETUP_RF_DR_1000; + } else if (rate==2000) { + val |= McuNRF24L01_RF_SETUP_RF_DR_2000; + } else { /* illegal parameter */ + return ERR_RANGE; + } + McuNRF24L01_WriteRegister(McuNRF24L01_RF_SETUP, val); + return ERR_OK; +} + +/* +** =================================================================== +** Method : GetDataRate (component nRF24L01) +** +** Description : +** Returns the current data rate +** Parameters : +** NAME - DESCRIPTION +** * rate - Pointer to where to store the value. +** Returns the data rate, either 250, 1000 or +** 2000 (kbps) +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuNRF24L01_GetDataRate(uint16_t *rate) +{ + uint8_t val; + + val = McuNRF24L01_ReadRegister(McuNRF24L01_RF_SETUP); /* read RF_SETUP register */ + if ((val&McuNRF24L01_RF_SETUP_RF_DR_MASK)==McuNRF24L01_RF_SETUP_RF_DR_250) { + *rate = 250; + } else if ((val&McuNRF24L01_RF_SETUP_RF_DR_MASK)==McuNRF24L01_RF_SETUP_RF_DR_1000) { + *rate = 1000; + } else if ((val&McuNRF24L01_RF_SETUP_RF_DR_MASK)==McuNRF24L01_RF_SETUP_RF_DR_2000) { + *rate = 2000; + } else { + return ERR_RANGE; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : PollInterrupt (component nRF24L01) +** +** Description : +** If there is no interrupt line available, this method polls +** the device to check if there is an interrupt. If +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +bool McuNRF24L01_PollInterrupt(void) +{ + /*lint -save -e522 function lacks side effect */ + uint8_t status; + bool interrupt = false; + extern void RADIO_OnInterrupt(void); /* prototype */ + + status = McuNRF24L01_GetStatus(); + if (status&(McuNRF24L01_STATUS_RX_DR|McuNRF24L01_STATUS_TX_DS|McuNRF24L01_STATUS_MAX_RT)) { + McuNRF24L01_CE_LOW(); /* pull CE Low to disable transceiver */ + RADIO_OnInterrupt(); + McuNRF24L01_OnInterrupt(); /* call user event (if enabled)... */ + interrupt = true; + } + return interrupt; + /*lint -restore */ +} + +/* +** =================================================================== +** Method : GetFifoStatus (component nRF24L01) +** +** Description : +** Returns the FIFO_STATUS register value +** Parameters : +** NAME - DESCRIPTION +** * status - Pointer to where to store the FIFO +** status value. +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuNRF24L01_GetFifoStatus(uint8_t *status) +{ + *status = McuNRF24L01_ReadRegister(McuNRF24L01_FIFO_STATUS); /* read FIFO_STATUS register */ + return ERR_OK; +} + +/* +** =================================================================== +** Method : SetAddressWidth (component nRF24L01) +** +** Description : +** Sets the address width using the SETUP_AW register +** Parameters : +** NAME - DESCRIPTION +** width - only 3, 4 or 5 is allowed +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuNRF24L01_SetAddressWidth(uint8_t width) +{ + if (width==3) { + McuNRF24L01_WriteRegister(McuNRF24L01_SETUP_AW, McuNRF24L01_SETUP_AW_3BYTES); + } else if (width==4) { + McuNRF24L01_WriteRegister(McuNRF24L01_SETUP_AW, McuNRF24L01_SETUP_AW_4BYTES); + } else if (width==5) { + McuNRF24L01_WriteRegister(McuNRF24L01_SETUP_AW, McuNRF24L01_SETUP_AW_5BYTES); + } else { + return ERR_FAILED; /* only 3, 4 or 5 allowed */ + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : GetAddressWidth (component nRF24L01) +** +** Description : +** Returns the address width stored in the SETUP_AW register +** Parameters : +** NAME - DESCRIPTION +** * pAddrWidth - Pointer to where to store +** the value. +** Returns : +** --- - number of address bytes (3, 4 or 5) +** =================================================================== +*/ +uint8_t McuNRF24L01_GetAddressWidth(uint8_t *pAddrWidth) +{ + uint8_t val; + + val = McuNRF24L01_ReadRegister(McuNRF24L01_SETUP_AW); /* read RF_SETUP_AW register */ + if (val==McuNRF24L01_SETUP_AW_3BYTES) { + *pAddrWidth = 3; + return ERR_OK; + } else if (val==McuNRF24L01_SETUP_AW_4BYTES) { + *pAddrWidth = 4; + return ERR_OK; + } else if (val==McuNRF24L01_SETUP_AW_5BYTES) { + *pAddrWidth = 5; + return ERR_OK; + } else { + /* failure */ + *pAddrWidth = 0; /* illegal value */ + return ERR_FAILED; + } +} + +/* +** =================================================================== +** Method : SetTxAddress (component nRF24L01) +** +** Description : +** Sets the TX address using the RF_TX_ADDR register. +** Parameters : +** NAME - DESCRIPTION +** * address - Pointer to the buffer with the +** address bytes. +** nofAddressBytes - Number of address +** bytes and size of buffer, typically 5. +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuNRF24L01_SetTxAddress(uint8_t *address, uint8_t nofAddressBytes) +{ + int i, j; + uint8_t swap[5]; /* address is max 5 bytes */ + + if (nofAddressBytes>=3 && nofAddressBytes<=5) { + for(j=0,i=nofAddressBytes-1; i>=0 && j<(int)sizeof(swap); i--,j++) { /* need to send LSB first */ + swap[j] = address[i]; + } + McuNRF24L01_WriteRegisterData(McuNRF24L01_TX_ADDR, &swap[0], nofAddressBytes); + return ERR_OK; + } else { + return ERR_FAILED; /* only 3, 4 or 5 address bytes allowed */ + } +} + +/* +** =================================================================== +** Method : GetTxAddress (component nRF24L01) +** +** Description : +** Returns the TX address using the RF_TX_ADDR register. +** Parameters : +** NAME - DESCRIPTION +** * address - Pointer to array where the return +** the address bytes. +** nofAddressBytes - Number of address +** bytes and size of buffer, typically 5. +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuNRF24L01_GetTxAddress(uint8_t *address, uint8_t nofAddressBytes) +{ + int i, j; + uint8_t swap[5]; /* address is max 5 bytes */ + + if (nofAddressBytes>=3 && nofAddressBytes<=5) { + McuNRF24L01_ReadRegisterData(McuNRF24L01_TX_ADDR, swap, nofAddressBytes); + for(j=0,i=nofAddressBytes-1; i>=0 && j5) { + return ERR_FAILED; /* only pipe 0 to 5 allowed */ + } + if (!(nofAddressBytes>=3 && nofAddressBytes<=5)) { + return ERR_FAILED; /* only 3, 4 or 5 allowed */ + } + if (pipe==0 || pipe==1) { /* full number of address bytes */ + for(j=0,i=nofAddressBytes-1; i>=0 && j<(int)sizeof(swap); i--,j++) { /* need to send LSB first */ + swap[j] = address[i]; + } + McuNRF24L01_WriteRegisterData(McuNRF24L01_RX_ADDR_P0+pipe, &swap[0], nofAddressBytes); + } else { /* P2-P5: only last byte */ + McuNRF24L01_WriteRegisterData(McuNRF24L01_RX_ADDR_P0+pipe, &address[nofAddressBytes-1], 1); + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : GetRxAddress (component nRF24L01) +** +** Description : +** Returns the RX address using the RF_RX_ADDR_Px register. +** Parameters : +** NAME - DESCRIPTION +** pipe - pipe number (0-5) +** * address - Pointer to array where the return +** the address bytes. +** nofAddressBytes - Number of address +** bytes and size of buffer, typically 5. +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuNRF24L01_GetRxAddress(uint8_t pipe, uint8_t *address, uint8_t nofAddressBytes) +{ + int i, j; + uint8_t swap[5]; /* address is max 5 bytes */ + + if (pipe>5) { + return ERR_FAILED; /* only pipe 0 to 5 allowed */ + } + if (!(nofAddressBytes>=3 && nofAddressBytes<=5)) { + return ERR_FAILED; /* only 3, 4 or 5 allowed */ + } + for(i=0; i=2 && pipe<=5) { + McuNRF24L01_ReadRegisterData(McuNRF24L01_RX_ADDR_P1, swap, nofAddressBytes); /* read base address from P1 */ + McuNRF24L01_ReadRegisterData(McuNRF24L01_RX_ADDR_P0+pipe, &swap[0], 1); /* pipe 2-5 only have one address byte */ + } + /* swap back into correct order */ + for(j=0,i=nofAddressBytes-1; i>=0 && j<(int)nofAddressBytes; i--,j++) { + address[j] = swap[i]; + } + return ERR_OK; +} + +static uint8_t PrintHelp(const McuShell_StdIOType *io) { + McuShell_SendHelpStr((unsigned char*)"McuNRF", (unsigned char*)"Group of nRF24L01+ commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Shows help or status\r\n", io->stdOut); + return ERR_OK; +} + +static uint8_t PrintStatus(const McuShell_StdIOType *io) { + uint8_t buf[64]; + + McuShell_SendStatusStr((unsigned char*)"McuNRF", (unsigned char*)"nRF24L01+ status\r\n", io->stdOut); + + McuGPIO_GetPinStatusString(cePin, buf, sizeof(buf)); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((const unsigned char*)" CE", (const unsigned char*)buf, io->stdOut); + + McuGPIO_GetPinStatusString(csnPin, buf, sizeof(buf)); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((const unsigned char*)" CSN", (const unsigned char*)buf, io->stdOut); + return ERR_OK; +} + +uint8_t McuNRF24L01_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) { + uint8_t res = ERR_OK; + + if (McuUtility_strcmp((char*)cmd, (char*)McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, (char*)"McuNRF help")==0) { + *handled = TRUE; + return PrintHelp(io); + } else if (McuUtility_strcmp((char*)cmd, (char*)McuShell_CMD_STATUS)==0 || McuUtility_strcmp((char*)cmd, (char*)"McuNRF status")==0) { + *handled = TRUE; + return PrintStatus(io); + } + return res; +} + +#endif /* McuNRF24L01_CONFIG_IS_ENABLED */ + +/* END McuNRF24L01. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/RNet/McuNRF24L01.h b/TSM_PicoW_Sensor/McuLib/RNet/McuNRF24L01.h new file mode 100644 index 0000000..0c187f6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/RNet/McuNRF24L01.h @@ -0,0 +1,1046 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuNRF24L01.h +** Component : nRF24L01 +** Version : Component 01.103, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2021-07-06, 16:35, # CodeGen: 0 +** Abstract : +** This component implements a driver for the Nordic Semiconductor nRF24L01 2.4 GHz transceiver. +** Settings : +** Contents : +** ConfigureSPI - void McuNRF24L01_ConfigureSPI(void); +** WriteRegister - void McuNRF24L01_WriteRegister(uint8_t reg, uint8_t val); +** ReadRegister - uint8_t McuNRF24L01_ReadRegister(uint8_t reg); +** ReadRegisterData - void McuNRF24L01_ReadRegisterData(uint8_t reg, uint8_t *buf, uint8_t bufSize); +** WriteRegisterData - void McuNRF24L01_WriteRegisterData(uint8_t reg, uint8_t *buf, uint8_t bufSize); +** WriteRead - uint8_t McuNRF24L01_WriteRead(uint8_t val); +** Write - void McuNRF24L01_Write(uint8_t val); +** GetStatus - uint8_t McuNRF24L01_GetStatus(void); +** GetStatusClrIRQ - uint8_t McuNRF24L01_GetStatusClrIRQ(void); +** ResetStatusIRQ - void McuNRF24L01_ResetStatusIRQ(uint8_t flags); +** TxPayload - void McuNRF24L01_TxPayload(uint8_t *payload, uint8_t payloadSize); +** RxPayload - void McuNRF24L01_RxPayload(uint8_t *payload, uint8_t payloadSize); +** StopRxTx - void McuNRF24L01_StopRxTx(void); +** StartRxTx - void McuNRF24L01_StartRxTx(void); +** EnableAutoAck - uint8_t McuNRF24L01_EnableAutoAck(uint8_t pipes); +** SetStaticPipePayload - uint8_t McuNRF24L01_SetStaticPipePayload(uint8_t pipe, uint8_t payloadBytes); +** EnableDynamicPayloadLength - uint8_t McuNRF24L01_EnableDynamicPayloadLength(uint8_t pipeMask); +** WriteFeature - uint8_t McuNRF24L01_WriteFeature(uint8_t featureMask); +** ReadFeature - uint8_t McuNRF24L01_ReadFeature(uint8_t *featureMask); +** ReadNofRxPayload - uint8_t McuNRF24L01_ReadNofRxPayload(uint8_t *nof); +** ReadObserveTxRegister - uint8_t McuNRF24L01_ReadObserveTxRegister(uint8_t *nofLoss, uint8_t *nofRetransmitted); +** ReadReceivedPowerDetector - uint8_t McuNRF24L01_ReadReceivedPowerDetector(uint8_t *rpd); +** SetChannel - uint8_t McuNRF24L01_SetChannel(uint8_t channel); +** GetChannel - uint8_t McuNRF24L01_GetChannel(uint8_t *channel); +** ConstantCarrierWave - uint8_t McuNRF24L01_ConstantCarrierWave(bool turnOn); +** SetOutputPower - uint8_t McuNRF24L01_SetOutputPower(int8_t power); +** GetOutputPower - uint8_t McuNRF24L01_GetOutputPower(int8_t *power); +** SetDataRate - uint8_t McuNRF24L01_SetDataRate(uint16_t rate); +** GetDataRate - uint8_t McuNRF24L01_GetDataRate(uint16_t *rate); +** SetAddressWidth - uint8_t McuNRF24L01_SetAddressWidth(uint8_t width); +** GetAddressWidth - uint8_t McuNRF24L01_GetAddressWidth(uint8_t *pAddrWidth); +** SetTxAddress - uint8_t McuNRF24L01_SetTxAddress(uint8_t *address, uint8_t nofAddressBytes); +** GetTxAddress - uint8_t McuNRF24L01_GetTxAddress(uint8_t *address, uint8_t nofAddressBytes); +** SetRxAddress - uint8_t McuNRF24L01_SetRxAddress(uint8_t pipe, uint8_t *address, uint8_t... +** GetRxAddress - uint8_t McuNRF24L01_GetRxAddress(uint8_t pipe, uint8_t *address, uint8_t... +** GetFifoStatus - uint8_t McuNRF24L01_GetFifoStatus(uint8_t *status); +** PollInterrupt - bool McuNRF24L01_PollInterrupt(void); +** Deinit - void McuNRF24L01_Deinit(void); +** Init - void McuNRF24L01_Init(void); +** +** * Copyright (c) 2013-2018, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuNRF24L01.h +** @version 01.00 +** @brief +** This component implements a driver for the Nordic Semiconductor nRF24L01 2.4 GHz transceiver. +*/ +/*! +** @addtogroup McuNRF24L01_module module documentation +** @{ +*/ + +#ifndef __McuNRF24L01_H +#define __McuNRF24L01_H + +/* MODULE McuNRF24L01. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuNRF24L01config.h" /* configuration */ + +/* Include inherited beans */ +#include "McuWait.h" +#include "McuGPIO.h" +#include "McuSPI.h" + +/* event handler prototypes */ +void McuNRF24L01_OnInterrupt(void); +void McuNRF24L01_OnActivate(void); +void McuNRF24L01_OnDeactivate(void); + +/* if having multiple users on the SPI bus, enable bus sharing/switching */ +#ifndef McuNRF24L01_SWITCH_BUS + #define McuNRF24L01_SWITCH_BUS (0) +#endif + //#define McuNRF24L01_BAUD_RATE_MODE 2 /* Index of baud rate mode */ + +/* Memory Map - register address defines */ +#define McuNRF24L01_CONFIG 0x00 /* CONFIG register */ + +#define McuNRF24L01_EN_AA 0x01 /* EN_AA register: configures auto-acknowledge per pipe */ + /* EN_AA register bitwise definitions */ + /* masks for auto acknowledge per pipe */ + #define McuNRF24L01_EN_AA_RESERVED 0xC0 + #define McuNRF24L01_EN_AA_ENAA_ALL 0x3F + #define McuNRF24L01_EN_AA_ENAA_P5 0x20 + #define McuNRF24L01_EN_AA_ENAA_P4 0x10 + #define McuNRF24L01_EN_AA_ENAA_P3 0x08 + #define McuNRF24L01_EN_AA_ENAA_P2 0x04 + #define McuNRF24L01_EN_AA_ENAA_P1 0x02 + #define McuNRF24L01_EN_AA_ENAA_P0 0x01 + #define McuNRF24L01_EN_AA_ENAA_NONE 0x00 + +#define McuNRF24L01_EN_RXADDR 0x02 /* EN_RXADDR register */ +#define McuNRF24L01_SETUP_AW 0x03 /* SETUP_AW register */ +#define McuNRF24L01_SETUP_RETR 0x04 + +#define McuNRF24L01_RF_CH 0x05 /* Channel register, valid channels from 0x0 to 0x7F */ + /* RF_CH register bitwise definitions */ + #define McuNRF24L01_RF_CH_RESERVED 0x80 + +#define McuNRF24L01_RF_SETUP 0x06 /* RF_SETUP register */ + /* RF_SETUP register bits: */ + #define McuNRF24L01_RF_SETUP_CONT_WAVE (1<<7) /* Enables continuous carrier transmit when high. */ + #define McuNRF24L01_RF_SETUP_PLL_LOCK (1<<4) /* Force PLL lock signal. Only used in test */ + + #define McuNRF24L01_RF_SETUP_RF_DR_MASK (McuNRF24L01_RF_SETUP_RF_DR_LOW|McuNRF24L01_RF_SETUP_RF_DR_HIGH) /* xx: mask bits */ + #define McuNRF24L01_RF_SETUP_RF_DR_LOW (1<<5) /* Set RF Data Rate to 250kbps. See RF_DR_HIGH for encoding. */ + #define McuNRF24L01_RF_SETUP_RF_DR_HIGH (1<<3) /* Select between the high speed data rates. */ + #define McuNRF24L01_RF_SETUP_RF_DR_1000 (0) /* RF_DR_LOW|RF_DR_HIGH: 00 */ + #define McuNRF24L01_RF_SETUP_RF_DR_2000 (McuNRF24L01_RF_SETUP_RF_DR_HIGH) /* RF_DR_LOW|RF_DR_HIGH: 01 */ + #define McuNRF24L01_RF_SETUP_RF_DR_250 (McuNRF24L01_RF_SETUP_RF_DR_LOW) /* RF_DR_LOW|RF_DR_HIGH: 10 */ + + #define McuNRF24L01_RF_SETUP_RF_PWR_MASK (3<<1) /* xx: mask bits */ + #define McuNRF24L01_RF_SETUP_RF_PWR_18 (0<<1) /* 00: -18dBm */ + #define McuNRF24L01_RF_SETUP_RF_PWR_12 (1<<1) /* 01: -12dBm */ + #define McuNRF24L01_RF_SETUP_RF_PWR_10 (2<<1) /* 10: -10dBm */ + #define McuNRF24L01_RF_SETUP_RF_PWR_0 (3<<1) /* 11: 0dBm, default */ + +#define McuNRF24L01_STATUS 0x07 + /* STATUS register bits */ + #define McuNRF24L01_STATUS_RESERVED 0x80 /* bit 1xxx xxxx: This bit is reserved */ + #define McuNRF24L01_STATUS_RX_DR 0x40 /* bit x1xx xxxx: Data ready RX FIFO interrupt. Asserted when new data arrives RX FIFO */ + #define McuNRF24L01_STATUS_TX_DS 0x20 /* bit xx1x xxxx: Data sent TX FIFO interrupt. Asserted when packet transmitted on TX. */ + #define McuNRF24L01_STATUS_MAX_RT 0x10 /* bit xxx1 xxxx: maximum number of TX retransmit interrupts */ + #define McuNRF24L01_STATUS_RX_P_NO 0x0E + #define McuNRF24L01_STATUS_RX_P_NO_RX_FIFO_EMPTY 0x0E + #define McuNRF24L01_STATUS_RX_P_NO_UNUSED 0x0C + #define McuNRF24L01_STATUS_RX_P_NO_5 0x0A + #define McuNRF24L01_STATUS_RX_P_NO_4 0x08 + #define McuNRF24L01_STATUS_RX_P_NO_3 0x06 + #define McuNRF24L01_STATUS_RX_P_NO_2 0x04 + #define McuNRF24L01_STATUS_RX_P_NO_1 0x02 + #define McuNRF24L01_STATUS_RX_P_NO_0 0x00 /* bit xxxx 111x: pipe number for payload */ + #define McuNRF24L01_STATUS_TX_FULL 0x01 /* bit xxxx xxx1: if bit set, then TX FIFO is full */ + + +#define McuNRF24L01_OBSERVE_TX 0x08 +#define McuNRF24L01_RPD 0x09 /* Received Power Detector */ +#define McuNRF24L01_RX_ADDR_P0 0x0A +#define McuNRF24L01_RX_ADDR_P1 0x0B +#define McuNRF24L01_RX_ADDR_P2 0x0C +#define McuNRF24L01_RX_ADDR_P3 0x0D +#define McuNRF24L01_RX_ADDR_P4 0x0E +#define McuNRF24L01_RX_ADDR_P5 0x0F +#define McuNRF24L01_TX_ADDR 0x10 +#define McuNRF24L01_RX_PW_P0 0x11 /* register to set static RX payload on pipe 0, 0 to 32 bytes */ +#define McuNRF24L01_RX_PW_P1 0x12 /* register to set static RX payload on pipe 1, 0 to 32 bytes */ +#define McuNRF24L01_RX_PW_P2 0x13 /* register to set static RX payload on pipe 2, 0 to 32 bytes */ +#define McuNRF24L01_RX_PW_P3 0x14 /* register to set static RX payload on pipe 3, 0 to 32 bytes */ +#define McuNRF24L01_RX_PW_P4 0x15 /* register to set static RX payload on pipe 4, 0 to 32 bytes */ +#define McuNRF24L01_RX_PW_P5 0x16 /* register to set static RX payload on pipe 5, 0 to 32 bytes */ + +#define McuNRF24L01_FIFO_STATUS 0x17 /* FIFO status register */ + /* FIFO_STATUS register bits */ + #define McuNRF24L01_FIFO_STATUS_RESERVED (0x8C) /* reserved bits */ + #define McuNRF24L01_FIFO_STATUS_TX_REUSE (1<<6) + #define McuNRF24L01_FIFO_STATUS_TX_FULL (1<<5) + #define McuNRF24L01_FIFO_STATUS_TX_EMPTY (1<<4) + #define McuNRF24L01_FIFO_STATUS_RX_FULL (1<<1) + #define McuNRF24L01_FIFO_STATUS_RX_EMPTY (1<<0) + +#define McuNRF24L01_DYNPD 0x1C /* enable dynamic payload length */ + /* DYNPD register bits: */ + #define McuNRF24L01_DYNPD_DPL_ALL (0x3F) /* enable DPL for all pipes */ + #define McuNRF24L01_DYNPD_DPL_P0 (1<<0) /* enable DPL for pipe 0 */ + #define McuNRF24L01_DYNPD_DPL_P1 (1<<1) /* enable DPL for pipe 1 */ + #define McuNRF24L01_DYNPD_DPL_P2 (1<<2) /* enable DPL for pipe 2 */ + #define McuNRF24L01_DYNPD_DPL_P3 (1<<3) /* enable DPL for pipe 3 */ + #define McuNRF24L01_DYNPD_DPL_P4 (1<<4) /* enable DPL for pipe 4 */ + #define McuNRF24L01_DYNPD_DPL_P5 (1<<5) /* enable DPL for pipe 5 */ +#define McuNRF24L01_FEATURE 0x1D /* feature register */ + /* FEATURE register bits: */ + #define McuNRF24L01_FEATURE_EN_DPL (1<<2) /* enables dynamic payload length */ + #define McuNRF24L01_FEATURE_EN_ACK_PAY (1<<1) /* enables payload with ACK */ + #define McuNRF24L01_FEATURE_EN_DYN_PAY (1<<0) /* enables the W_TX_PAYLOAD_NOACK command */ + +/* Bit Mnemonics */ +/* CONFIG Register Bits */ +#define McuNRF24L01_MASK_RX_DR (1<<6) /* Mask interrupt caused by RX_DR: 1: interrupt masked. 0: interrupt enabled */ +#define McuNRF24L01_MASK_TX_DS (1<<5) /* Mask interrupt caused by TX_DS: 1: interrupt masked. 0: interrupt enabled */ +#define McuNRF24L01_MASK_MAX_RT (1<<4) /* Mask interrupt caused by MAX_RT. 1: interrupt not reflected on IRQ pin. 0: reflect MAX_RT as active low interrupt on IRQ pin */ +#define McuNRF24L01_EN_CRC (1<<3) /* Enable CRC. Forced high if on of the bits in EN_AA is high */ +#define McuNRF24L01_CRCO (1<<2) /* CRC encoding scheme, 0: 1 byte, 1: 2 bytes */ +#define McuNRF24L01_PWR_UP (1<<1) /* 1: Power up, 0: Power down */ +#define McuNRF24L01_PRIM_RX (1<<0) /* 1: PRX, 0: PTX */ +#define McuNRF24L01_PRIM_TX (0) /* 0: PTX */ + +#define McuNRF24L01_ERX_P5 5 +#define McuNRF24L01_ERX_P4 4 +#define McuNRF24L01_ERX_P3 3 +#define McuNRF24L01_ERX_P2 2 +#define McuNRF24L01_ERX_P1 1 +#define McuNRF24L01_ERX_P0 0 +#define McuNRF24L01_AW 0 +#define McuNRF24L01_ARD 4 +#define McuNRF24L01_ARC 0 +#define McuNRF24L01_PLL_LOCK 4 +#define McuNRF24L01_RF_DR_HIGH 3 +#define McuNRF24L01_RF_DR_LOW 5 +#define McuNRF24L01_RF_PWR 1 +#define McuNRF24L01_LNA_HCURR 0 +#define McuNRF24L01_RX_DR 6 +#define McuNRF24L01_TX_DS 5 +#define McuNRF24L01_MAX_RT 4 +#define McuNRF24L01_RX_P_NO 1 +#define McuNRF24L01_TX_FULL 0 +#define McuNRF24L01_PLOS_CNT 4 +#define McuNRF24L01_ARC_CNT 0 +#define McuNRF24L01_TX_REUSE 6 +#define McuNRF24L01_FIFO_FULL 5 +#define McuNRF24L01_TX_EMPTY 4 +#define McuNRF24L01_RX_FULL 1 +#define McuNRF24L01_RX_EMPTY 0 + +/* Command Name Mnemonics (Instructions) */ +#define McuNRF24L01_R_REGISTER 0x00 /* read register command, the address is encoded into the command (000A AAAA) */ +#define McuNRF24L01_W_REGISTER 0x20 /* write register command, the address is encoded into the command (001A AAAA) */ +#define McuNRF24L01_REGISTER_MASK 0x1F /* mask used for R_REGISTER and W_REGISTER commands */ +#define McuNRF24L01_R_RX_PAYLOAD 0x61 /* read RX payload command */ +#define McuNRF24L01_W_TX_PAYLOAD 0xA0 /* write TX payload command */ +#define McuNRF24L01_FLUSH_TX 0xE1 /* flush TX FIFO command */ +#define McuNRF24L01_FLUSH_RX 0xE2 /* flush RX FIFO command */ +#define McuNRF24L01_REUSE_TX_PL 0xE3 /* reuse last transmitted payload command */ +#define McuNRF24L01_R_RX_PL_WID 0x60 /* read RX payload width for the top R_RX_PAYLOAD in the RX FIFO */ +#define McuNRF24L01_W_ACK_PAYLOAD 0xA8 /* used in RX mode. Write payload to be transmitted with ACK packet to pipe (1010 1PPP) */ +#define McuNRF24L01_W_TX_PAYLOAD_NO_ACK 0xB0 /* used in TX mode. Disable AUTOACK on this specific packet */ +#define McuNRF24L01_NOP 0xFF /* no operation command, used for reading STATUS register */ + +#define McuNRF24L01_CONFIG_DEFAULT_VAL 0x08 +#define McuNRF24L01_EN_AA_DEFAULT_VAL 0x3F +#define McuNRF24L01_EN_RXADDR_DEFAULT_VAL 0x03 +#define McuNRF24L01_SETUP_AW_DEFAULT_VAL 0x03 +#define McuNRF24L01_SETUP_RETR_DEFAULT_VAL 0x03 +#define McuNRF24L01_RF_CH_DEFAULT_VAL 0x02 +#define McuNRF24L01_RF_SETUP_DEFAULT_VAL 0x0F +#define McuNRF24L01_STATUS_DEFAULT_VAL 0x0E +#define McuNRF24L01_OBSERVE_TX_DEFAULT_VAL 0x00 +#define McuNRF24L01_CD_DEFAULT_VAL 0x00 +#define McuNRF24L01_RX_ADDR_P0_B0_DEFAULT_VAL 0xE7 +#define McuNRF24L01_RX_ADDR_P0_B1_DEFAULT_VAL 0xE7 +#define McuNRF24L01_RX_ADDR_P0_B2_DEFAULT_VAL 0xE7 +#define McuNRF24L01_RX_ADDR_P0_B3_DEFAULT_VAL 0xE7 +#define McuNRF24L01_RX_ADDR_P0_B4_DEFAULT_VAL 0xE7 +#define McuNRF24L01_RX_ADDR_P1_B0_DEFAULT_VAL 0xC2 +#define McuNRF24L01_RX_ADDR_P1_B1_DEFAULT_VAL 0xC2 +#define McuNRF24L01_RX_ADDR_P1_B2_DEFAULT_VAL 0xC2 +#define McuNRF24L01_RX_ADDR_P1_B3_DEFAULT_VAL 0xC2 +#define McuNRF24L01_RX_ADDR_P1_B4_DEFAULT_VAL 0xC2 +#define McuNRF24L01_RX_ADDR_P2_DEFAULT_VAL 0xC3 +#define McuNRF24L01_RX_ADDR_P3_DEFAULT_VAL 0xC4 +#define McuNRF24L01_RX_ADDR_P4_DEFAULT_VAL 0xC5 +#define McuNRF24L01_RX_ADDR_P5_DEFAULT_VAL 0xC6 +#define McuNRF24L01_TX_ADDR_B0_DEFAULT_VAL 0xE7 +#define McuNRF24L01_TX_ADDR_B1_DEFAULT_VAL 0xE7 +#define McuNRF24L01_TX_ADDR_B2_DEFAULT_VAL 0xE7 +#define McuNRF24L01_TX_ADDR_B3_DEFAULT_VAL 0xE7 +#define McuNRF24L01_TX_ADDR_B4_DEFAULT_VAL 0xE7 +#define McuNRF24L01_RX_PW_P0_DEFAULT_VAL 0x00 +#define McuNRF24L01_RX_PW_P1_DEFAULT_VAL 0x00 +#define McuNRF24L01_RX_PW_P2_DEFAULT_VAL 0x00 +#define McuNRF24L01_RX_PW_P3_DEFAULT_VAL 0x00 +#define McuNRF24L01_RX_PW_P4_DEFAULT_VAL 0x00 +#define McuNRF24L01_RX_PW_P5_DEFAULT_VAL 0x00 +#define McuNRF24L01_FIFO_STATUS_DEFAULT_VAL 0x11 + +/* CONFIG register bitwise definitions */ +#define McuNRF24L01_CONFIG_RESERVED 0x80 +#define McuNRF24L01_CONFIG_MASK_RX_DR 0x40 +#define McuNRF24L01_CONFIG_MASK_TX_DS 0x20 +#define McuNRF24L01_CONFIG_MASK_MAX_RT 0x10 +#define McuNRF24L01_CONFIG_EN_CRC 0x08 +#define McuNRF24L01_CONFIG_CRCO 0x04 +#define McuNRF24L01_CONFIG_PWR_UP 0x02 +#define McuNRF24L01_CONFIG_PRIM_RX 0x01 + +/* EN_RXADDR register bitwise definitions */ +#define McuNRF24L01_EN_RXADDR_RESERVED 0xC0 +#define McuNRF24L01_EN_RXADDR_ERX_ALL 0x3F +#define McuNRF24L01_EN_RXADDR_ERX_P5 0x20 +#define McuNRF24L01_EN_RXADDR_ERX_P4 0x10 +#define McuNRF24L01_EN_RXADDR_ERX_P3 0x08 +#define McuNRF24L01_EN_RXADDR_ERX_P2 0x04 +#define McuNRF24L01_EN_RXADDR_ERX_P1 0x02 +#define McuNRF24L01_EN_RXADDR_ERX_P0 0x01 +#define McuNRF24L01_EN_RXADDR_ERX_NONE 0x00 + +/* SETUP_AW register bitwise definitions */ +#define McuNRF24L01_SETUP_AW_RESERVED 0xFC +#define McuNRF24L01_SETUP_AW 0x03 +#define McuNRF24L01_SETUP_AW_5BYTES 0x03 +#define McuNRF24L01_SETUP_AW_4BYTES 0x02 +#define McuNRF24L01_SETUP_AW_3BYTES 0x01 +#define McuNRF24L01_SETUP_AW_ILLEGAL 0x00 + +/* SETUP_RETR register bitwise definitions */ +#define McuNRF24L01_SETUP_RETR_ARD 0xF0 +#define McuNRF24L01_SETUP_RETR_ARD_4000 0xF0 /* 4400 us retry delay */ +#define McuNRF24L01_SETUP_RETR_ARD_3750 0xE0 /* 3750 us retry delay */ +#define McuNRF24L01_SETUP_RETR_ARD_3500 0xD0 /* 3500 us retry delay */ +#define McuNRF24L01_SETUP_RETR_ARD_3250 0xC0 /* 3250 us retry delay */ +#define McuNRF24L01_SETUP_RETR_ARD_3000 0xB0 /* 3000 us retry delay */ +#define McuNRF24L01_SETUP_RETR_ARD_2750 0xA0 /* 2750 us retry delay */ +#define McuNRF24L01_SETUP_RETR_ARD_2500 0x90 /* 2500 us retry delay */ +#define McuNRF24L01_SETUP_RETR_ARD_2250 0x80 /* 2250 us retry delay */ +#define McuNRF24L01_SETUP_RETR_ARD_2000 0x70 /* 2000 us retry delay */ +#define McuNRF24L01_SETUP_RETR_ARD_1750 0x60 /* 1750 us retry delay */ +#define McuNRF24L01_SETUP_RETR_ARD_1500 0x50 /* 1500 us retry delay */ +#define McuNRF24L01_SETUP_RETR_ARD_1250 0x40 /* 1250 us retry delay */ +#define McuNRF24L01_SETUP_RETR_ARD_1000 0x30 /* 1000 us retry delay */ +#define McuNRF24L01_SETUP_RETR_ARD_750 0x20 /* 750 us retry delay */ +#define McuNRF24L01_SETUP_RETR_ARD_500 0x10 /* 500 us retry delay */ +#define McuNRF24L01_SETUP_RETR_ARD_250 0x00 /* 250 us retry delay */ +#define McuNRF24L01_SETUP_RETR_ARC 0x0F +#define McuNRF24L01_SETUP_RETR_ARC_15 0x0F /* 15 retry count */ +#define McuNRF24L01_SETUP_RETR_ARC_14 0x0E /* 14 retry count */ +#define McuNRF24L01_SETUP_RETR_ARC_13 0x0D /* 13 retry count */ +#define McuNRF24L01_SETUP_RETR_ARC_12 0x0C /* 12 retry count */ +#define McuNRF24L01_SETUP_RETR_ARC_11 0x0B /* 11 retry count */ +#define McuNRF24L01_SETUP_RETR_ARC_10 0x0A /* 10 retry count */ +#define McuNRF24L01_SETUP_RETR_ARC_9 0x09 /* 9 retry count */ +#define McuNRF24L01_SETUP_RETR_ARC_8 0x08 /* 8 retry count */ +#define McuNRF24L01_SETUP_RETR_ARC_7 0x07 /* 7 retry count */ +#define McuNRF24L01_SETUP_RETR_ARC_6 0x06 /* 6 retry count */ +#define McuNRF24L01_SETUP_RETR_ARC_5 0x05 /* 5 retry count */ +#define McuNRF24L01_SETUP_RETR_ARC_4 0x04 /* 4 retry count */ +#define McuNRF24L01_SETUP_RETR_ARC_3 0x03 /* 3 retry count */ +#define McuNRF24L01_SETUP_RETR_ARC_2 0x02 /* 2 retry count */ +#define McuNRF24L01_SETUP_RETR_ARC_1 0x01 /* 1 retry count */ +#define McuNRF24L01_SETUP_RETR_ARC_0 0x00 /* 0 retry count, retry disabled */ + +/* OBSERVE_TX register bitwise definitions */ +#define McuNRF24L01_OBSERVE_TX_PLOS_CNT 0xF0 +#define McuNRF24L01_OBSERVE_TX_ARC_CNT 0x0F + +/* CD register bitwise definitions for nRF24L01 */ +//#define McuNRF24L01_CD_RESERVED 0xFE +//#define McuNRF24L01_CD_CD 0x01 + +/* RPD register bitwise definitions for nRF24L01+ */ +#define McuNRF24L01_RPD_RESERVED 0xFE +#define McuNRF24L01_RPD_RPD 0x01 + +/* RX_PW_P0 register bitwise definitions */ +#define McuNRF24L01_RX_PW_P0_RESERVED 0xC0 + +/* RX_PW_P0 register bitwise definitions */ +#define McuNRF24L01_RX_PW_P0_RESERVED 0xC0 + +/* RX_PW_P1 register bitwise definitions */ +#define McuNRF24L01_RX_PW_P1_RESERVED 0xC0 + +/* RX_PW_P2 register bitwise definitions */ +#define McuNRF24L01_RX_PW_P2_RESERVED 0xC0 + +/* RX_PW_P3 register bitwise definitions */ +#define McuNRF24L01_RX_PW_P3_RESERVED 0xC0 + +/* RX_PW_P4 register bitwise definitions */ +#define McuNRF24L01_RX_PW_P4_RESERVED 0xC0 + +/* RX_PW_P5 register bitwise definitions */ +#define McuNRF24L01_RX_PW_P5_RESERVED 0xC0 + + + +void McuNRF24L01_Init(void); +/* +** =================================================================== +** Method : Init (component nRF24L01) +** +** Description : +** Initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuNRF24L01_WriteRegister(uint8_t reg, uint8_t val); +/* +** =================================================================== +** Method : WriteRegister (component nRF24L01) +** +** Description : +** Write a register value to the transceiver +** Parameters : +** NAME - DESCRIPTION +** reg - Register address to write +** val - Value to write +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuNRF24L01_ReadRegister(uint8_t reg); +/* +** =================================================================== +** Method : ReadRegister (component nRF24L01) +** +** Description : +** Reads a register from the transceiver +** Parameters : +** NAME - DESCRIPTION +** reg - Register address +** Returns : +** --- - value read +** =================================================================== +*/ + +void McuNRF24L01_ReadRegisterData(uint8_t reg, uint8_t *buf, uint8_t bufSize); +/* +** =================================================================== +** Method : ReadRegisterData (component nRF24L01) +** +** Description : +** Read multiple bytes from the bus. +** Parameters : +** NAME - DESCRIPTION +** reg - Register address +** * buf - Pointer to buffer where to store the values +** bufSize - Size of the destination buffer +** Returns : Nothing +** =================================================================== +*/ + +void McuNRF24L01_WriteRegisterData(uint8_t reg, uint8_t *buf, uint8_t bufSize); +/* +** =================================================================== +** Method : WriteRegisterData (component nRF24L01) +** +** Description : +** Write multiple bytes to the bus. +** Parameters : +** NAME - DESCRIPTION +** reg - Register address +** * buf - Pointer to data buffer to write +** bufSize - Size of buffer in bytes +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuNRF24L01_WriteRead(uint8_t val); +/* +** =================================================================== +** Method : WriteRead (component nRF24L01) +** +** Description : +** Writes a byte and reads back one byte +** Parameters : +** NAME - DESCRIPTION +** val - Value to write to the bus +** Returns : +** --- - Value read from the bus +** =================================================================== +*/ + +void McuNRF24L01_Write(uint8_t val); +/* +** =================================================================== +** Method : Write (component nRF24L01) +** +** Description : +** Writes a byte to the bus, without returning the byte read. +** Parameters : +** NAME - DESCRIPTION +** val - Value to write +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuNRF24L01_GetStatus(void); +/* +** =================================================================== +** Method : GetStatus (component nRF24L01) +** +** Description : +** Returns the device status byte +** Parameters : None +** Returns : +** --- - status byte +** =================================================================== +*/ + +void McuNRF24L01_ResetStatusIRQ(uint8_t flags); +/* +** =================================================================== +** Method : ResetStatusIRQ (component nRF24L01) +** +** Description : +** Reset the given flags mask of status bits +** Parameters : +** NAME - DESCRIPTION +** flags - Flags, one or more of +** RF24_STATUS_RX_DR, RF24_STATUS_TX_DS, +** RF24_STATUS_MAX_RT +** Returns : Nothing +** =================================================================== +*/ + +void McuNRF24L01_TxPayload(uint8_t *payload, uint8_t payloadSize); +/* +** =================================================================== +** Method : TxPayload (component nRF24L01) +** +** Description : +** Send the payload to the Tx FIFO and send it +** Parameters : +** NAME - DESCRIPTION +** * payload - Pointer to buffer with payload to +** send +** payloadSize - Size of payload buffer +** Returns : Nothing +** =================================================================== +*/ + +void McuNRF24L01_TxPayloadNoAck(uint8_t *payload, uint8_t payloadSize); +/* +** =================================================================== +** Method : McuNRF24L01_TxPayloadNoAck (component nRF24L01) +** +** Description : +** Send the payload to the Tx FIFO and send it, +** but does not request an acknowledge. +** Parameters : +** NAME - DESCRIPTION +** * payload - Pointer to buffer with payload to +** send +** payloadSize - Size of payload buffer +** Returns : Nothing +** =================================================================== +*/ + +void McuNRF24L01_RxPayload(uint8_t *payload, uint8_t payloadSize); +/* +** =================================================================== +** Method : RxPayload (component nRF24L01) +** +** Description : +** Receive the Rx payload from the FIFO and stores it in a +** buffer. +** Parameters : +** NAME - DESCRIPTION +** * payload - Pointer to the payload buffer +** payloadSize - Size of the payload buffer +** Returns : Nothing +** =================================================================== +*/ + +void McuNRF24L01_StopRxTx(void); +/* +** =================================================================== +** Method : StopRxTx (component nRF24L01) +** +** Description : +** Stops sending or receiving (sets CE pin to LOW). +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuNRF24L01_StartRxTx(void); +/* +** =================================================================== +** Method : StartRxTx (component nRF24L01) +** +** Description : +** Starts sending or receiving (sets CE pin to HIGH). +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuNRF24L01_SetChannel(uint8_t channel); +/* +** =================================================================== +** Method : SetChannel (component nRF24L01) +** +** Description : +** Sets the radio channel (RF_CH register). +** Parameters : +** NAME - DESCRIPTION +** channel - Channel number, valid channel +** numbers are 0x0 to 0x7F +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuNRF24L01_EnableAutoAck(uint8_t pipes); +/* +** =================================================================== +** Method : EnableAutoAck (component nRF24L01) +** +** Description : +** Enables Auto-Acknowledgment for the given pipe(s) (RF_EN_AA +** register). +** Parameters : +** NAME - DESCRIPTION +** pipes - mask of pipes to be enabled (ENAA_P0 +** to ENAA_P5) +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuNRF24L01_ReadNofRxPayload(uint8_t *nof); +/* +** =================================================================== +** Method : ReadNofRxPayload (component nRF24L01) +** +** Description : +** Returns the number of received payload bytes for the top +** R_RX_PAYLOAD in the RX FIFO +** Parameters : +** NAME - DESCRIPTION +** * nof - Pointer to where to store the number of +** bytes. A return value of 0 means that the +** pipe is not used, and if the value is >32 +** then the data is not valid. +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuNRF24L01_SetStaticPipePayload(uint8_t pipe, uint8_t payloadBytes); +/* +** =================================================================== +** Method : SetStaticPipePayload (component nRF24L01) +** +** Description : +** Specifies the static payload for a pipe. +** Parameters : +** NAME - DESCRIPTION +** pipe - Pipe number, 0 to 5 +** payloadBytes - Number of payload pipes +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuNRF24L01_EnableDynamicPayloadLength(uint8_t pipeMask); +/* +** =================================================================== +** Method : EnableDynamicPayloadLength (component nRF24L01) +** +** Description : +** Enables dynamic payload length for the give pipes +** Parameters : +** NAME - DESCRIPTION +** pipeMask - Mask of pipes, with 1 for pipe 0, +** 2 for pipe 1, 4 for pipe 2 and so on. +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuNRF24L01_WriteFeature(uint8_t featureMask); +/* +** =================================================================== +** Method : WriteFeature (component nRF24L01) +** +** Description : +** Writes the FEATURE register +** Parameters : +** NAME - DESCRIPTION +** featureMask - Mask of FEATURE, e.g. +** FEATURE_EN_DPL +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuNRF24L01_ReadFeature(uint8_t *featureMask); +/* +** =================================================================== +** Method : ReadFeature (component nRF24L01) +** +** Description : +** Reads the FEATURE register +** Parameters : +** NAME - DESCRIPTION +** * featureMask - Pointer to value of +** FEATURE register +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuNRF24L01_ReadObserveTxRegister(uint8_t *nofLoss, uint8_t *nofRetransmitted); +/* +** =================================================================== +** Method : ReadObserveTxRegister (component nRF24L01) +** +** Description : +** Reads the OBSERVE_TX register to return the count of loss +** packets and count of retransmitted packets. +** Parameters : +** NAME - DESCRIPTION +** * nofLoss - Pointer to number of lost packets +** * nofRetransmitted - Pointer to +** number of retransmitted packets +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuNRF24L01_ReadReceivedPowerDetector(uint8_t *rpd); +/* +** =================================================================== +** Method : ReadReceivedPowerDetector (component nRF24L01) +** +** Description : +** Reads the RPD (Received Power Detector) register. +** Parameters : +** NAME - DESCRIPTION +** * rpd - Pointer to RPD bit. Bit is one for +** received power levels above -64 dBm, zero +** for less than -64 dBm. +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuNRF24L01_GetChannel(uint8_t *channel); +/* +** =================================================================== +** Method : GetChannel (component nRF24L01) +** +** Description : +** Returns the radio channel (RF_CH register). +** Parameters : +** NAME - DESCRIPTION +** * channel - Pointer to where to store the +** channel number. +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuNRF24L01_ConstantCarrierWave(bool turnOn); +/* +** =================================================================== +** Method : ConstantCarrierWave (component nRF24L01) +** +** Description : +** Put the transceiver into contant carrier wave output for +** testing. The output power of a radio is a critical factor +** for achieving wanted range. Output power is also the first +** test +** Parameters : +** NAME - DESCRIPTION +** turnOn - Set to true to start constant +** carrier wave, false to stop it. +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuNRF24L01_SetOutputPower(int8_t power); +/* +** =================================================================== +** Method : SetOutputPower (component nRF24L01) +** +** Description : +** Sets the output power +** Parameters : +** NAME - DESCRIPTION +** power - Ouput power in dBm, either 0, -10, -12 +** or -18 +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuNRF24L01_GetOutputPower(int8_t *power); +/* +** =================================================================== +** Method : GetOutputPower (component nRF24L01) +** +** Description : +** Returns the current output power +** Parameters : +** NAME - DESCRIPTION +** * power - Pointer to where to store the value. +** Returns the output power in dBm +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuNRF24L01_GetStatusClrIRQ(void); +/* +** =================================================================== +** Method : GetStatusClrIRQ (component nRF24L01) +** +** Description : +** Returns the device status byte and clears any IRQ bits in +** the status register. +** Parameters : None +** Returns : +** --- - status byte +** =================================================================== +*/ + +bool McuNRF24L01_PollInterrupt(void); +/* +** =================================================================== +** Method : PollInterrupt (component nRF24L01) +** +** Description : +** If there is no interrupt line available, this method polls +** the device to check if there is an interrupt. If +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuNRF24L01_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component nRF24L01) +** +** Description : +** Driver deinitialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuNRF24L01_SetDataRate(uint16_t rate); +/* +** =================================================================== +** Method : SetDataRate (component nRF24L01) +** +** Description : +** Sets the data rate +** Parameters : +** NAME - DESCRIPTION +** rate - Data rate, either 250, 1000 or 2000 +** (kbps) +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuNRF24L01_GetDataRate(uint16_t *rate); +/* +** =================================================================== +** Method : GetDataRate (component nRF24L01) +** +** Description : +** Returns the current data rate +** Parameters : +** NAME - DESCRIPTION +** * rate - Pointer to where to store the value. +** Returns the data rate, either 250, 1000 or +** 2000 (kbps) +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuNRF24L01_GetFifoStatus(uint8_t *status); +/* +** =================================================================== +** Method : GetFifoStatus (component nRF24L01) +** +** Description : +** Returns the FIFO_STATUS register value +** Parameters : +** NAME - DESCRIPTION +** * status - Pointer to where to store the FIFO +** status value. +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuNRF24L01_ConfigureSPI(void); +/* +** =================================================================== +** Method : ConfigureSPI (component nRF24L01) +** +** Description : +** Configures the SPI bus +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuNRF24L01_SetAddressWidth(uint8_t width); +/* +** =================================================================== +** Method : SetAddressWidth (component nRF24L01) +** +** Description : +** Sets the address width using the SETUP_AW register +** Parameters : +** NAME - DESCRIPTION +** width - only 3, 4 or 5 is allowed +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuNRF24L01_GetAddressWidth(uint8_t *pAddrWidth); +/* +** =================================================================== +** Method : GetAddressWidth (component nRF24L01) +** +** Description : +** Returns the address width stored in the SETUP_AW register +** Parameters : +** NAME - DESCRIPTION +** * pAddrWidth - Pointer to where to store +** the value. +** Returns : +** --- - number of address bytes (3, 4 or 5) +** =================================================================== +*/ + +uint8_t McuNRF24L01_SetTxAddress(uint8_t *address, uint8_t nofAddressBytes); +/* +** =================================================================== +** Method : SetTxAddress (component nRF24L01) +** +** Description : +** Sets the TX address using the RF_TX_ADDR register. +** Parameters : +** NAME - DESCRIPTION +** * address - Pointer to the buffer with the +** address bytes. +** nofAddressBytes - Number of address +** bytes and size of buffer, typically 5. +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuNRF24L01_GetTxAddress(uint8_t *address, uint8_t nofAddressBytes); +/* +** =================================================================== +** Method : GetTxAddress (component nRF24L01) +** +** Description : +** Returns the TX address using the RF_TX_ADDR register. +** Parameters : +** NAME - DESCRIPTION +** * address - Pointer to array where the return +** the address bytes. +** nofAddressBytes - Number of address +** bytes and size of buffer, typically 5. +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuNRF24L01_SetRxAddress(uint8_t pipe, uint8_t *address, uint8_t nofAddressBytes); +/* +** =================================================================== +** Method : SetRxAddress (component nRF24L01) +** +** Description : +** Set the TX address using the RF_RX_ADDR_Px register. +** Parameters : +** NAME - DESCRIPTION +** pipe - pipe number (0-5) +** * address - Pointer to array where the return +** the address bytes. +** nofAddressBytes - Number of address +** bytes and size of buffer, typically 5. +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuNRF24L01_GetRxAddress(uint8_t pipe, uint8_t *address, uint8_t nofAddressBytes); +/* +** =================================================================== +** Method : GetRxAddress (component nRF24L01) +** +** Description : +** Returns the RX address using the RF_RX_ADDR_Px register. +** Parameters : +** NAME - DESCRIPTION +** pipe - pipe number (0-5) +** * address - Pointer to array where the return +** the address bytes. +** nofAddressBytes - Number of address +** bytes and size of buffer, typically 5. +** Returns : +** --- - Error code +** =================================================================== +*/ + +#include "McuShell.h" +/*! + * \brief Parses a command + * \param cmd Command string to be parsed + * \param handled Sets this variable to TRUE if command was handled + * \param io I/O stream to be used for input/output + * \return Error code, ERR_OK if everything was fine + */ +uint8_t McuNRF24L01_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); + +/* END McuNRF24L01. */ + +#endif +/* ifndef __McuNRF24L01_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/RNet/McuNRF24L01config.h b/TSM_PicoW_Sensor/McuLib/RNet/McuNRF24L01config.h new file mode 100644 index 0000000..642c418 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/RNet/McuNRF24L01config.h @@ -0,0 +1,117 @@ +/** + * \file + * \brief Configuration header file for Nordic Semiconductor nRF24L01+ transceiver + * + * This header file is used to configure settings of the nRF24L01 module. + */ + +#ifndef __McuNRF24L01_CONFIG_H +#define __McuNRF24L01_CONFIG_H + +#include "McuLib.h" + +#ifndef McuNRF24L01_CONFIG_IS_ENABLED + #define McuNRF24L01_CONFIG_IS_ENABLED (0) + /*!< 1: enable driver/module; 0: module is not enabled */ +#endif + +#ifndef McuNRF24L01_CONFIG_IRQ_PIN_ENABLED + void McuNRF24L01_OnInterrupt(void); /* prototype for interrupt handler */ + #define McuNRF24L01_CONFIG_IRQ_PIN_ENABLED (0) + /*!< 1: IRQ pin is enabled, 0: No IRQ pin available */ +#endif + +#ifndef McuNRF24L01_CONFIG_USE_ON_ACTIVATE_CALLBACK + #define McuNRF24L01_CONFIG_USE_ON_ACTIVATE_CALLBACK (0) + /*!< If McuNRF24L01_CONFIG_ON_ACTIVATE_CALLBACK is called or not */ +#endif + +#ifndef McuNRF24L01_CONFIG_ON_ACTIVATE_CALLBACK + void McuNRF24L01_OnActivate(void); /* prototype */ + #define McuNRF24L01_CONFIG_ON_ACTIVATE_CALLBACK() McuNRF24L01_OnActivate() + /*!< User callback called before using device */ +#endif + +#ifndef McuNRF24L01_CONFIG_USE_ON_DEACTIVATE_CALLBACK + #define McuNRF24L01_CONFIG_USE_ON_DEACTIVATE_CALLBACK (0) + /*!< If McuNRF24L01_CONFIG_ON_DEACTIVATE_CALLBACK is called or not */ +#endif + +#ifndef McuNRF24L01_CONFIG_ON_DEACTIVATE_CALLBACK + void McuNRF24L01_OnDeactivate(void); /* prototype */ + #define McuNRF24L01_CONFIG_ON_DEACTIVATE_CALLBACK() McuNRF24L01_OnDeactivate() + /*!< User callback called after using device */ +#endif + +#ifndef McuNRF24L01_CONFIG_USE_MUTEX + #define McuNRF24L01_CONFIG_USE_MUTEX (1) + /*!< 1: Use FreeRTOS Mutex, 0: Do not use FreeRTOS mutex */ +#endif + +#ifndef McuNRF24L01_CONFIG_INITIALIZE_DURING_STARTUP + #define McuNRF24L01_CONFIG_INITIALIZE_DURING_STARTUP (0) + /*!< 1: Call Init() during startup, 0: Do not call Init() */ +#endif + +#ifndef McuNRF24L01_CONFIG_CE_CSN_PIN_PRE_INIT + #if McuLib_CONFIG_CPU_IS_RPxxxx + #define McuNRF24L01_CONFIG_CE_CSN_PIN_PRE_INIT() /* nothing needed */ + #elif McuLib_CONFIG_CPU_IS_ESP32 + #define McuNRF24L01_CONFIG_CE_CSN_PIN_PRE_INIT() /* nothing needed */ + #elif McuLib_CONFIG_CPU_IS_KINETIS + #define McuNRF24L01_CONFIG_CE_CSN_PIN_PRE_INIT() CLOCK_EnableClock(kCLOCK_PortB) + /*!< Optional hardware initialization for CS Pin */ + #endif +#endif + +#ifndef McuNRF24L01_CONFIG_CE_PIN_GPIO + #define McuNRF24L01_CONFIG_CE_PIN_GPIO GPIOB + /*!< GPIO for CE Pin */ +#endif + + #ifndef McuNRF24L01_CONFIG_CE_PIN_PORT + #define McuNRF24L01_CONFIG_CE_PIN_PORT PORTB + /*!< PORT for CE Pin */ +#endif + +#ifndef McuNRF24L01_CONFIG_CE_PIN_NUMBER + #define McuNRF24L01_CONFIG_CE_PIN_NUMBER 10 + /*!< Pin number of the CE Pin */ +#endif + +#ifndef McuNRF24L01_CONFIG_CSN_PIN_GPIO + #define McuNRF24L01_CONFIG_CSN_PIN_GPIO GPIOB + /*!< GPIO for CSN Pin */ +#endif + +#ifndef McuNRF24L01_CONFIG_CSN_PIN_PORT + #define McuNRF24L01_CONFIG_CSN_PIN_PORT PORTB + /*!< PORT for CSN Pin */ +#endif + +#ifndef McuNRF24L01_CONFIG_CSN_PIN_NUMBER + #define McuNRF24L01_CONFIG_CSN_PIN_NUMBER 0 + /*!< Pin number of the CSN Pin */ +#endif + +#ifndef McuNRF24L01_CONFIG_IRQ_PIN_GPIO + #define McuNRF24L01_CONFIG_IRQ_PIN_GPIO GPIOB + /*!< GPIO for IRQ Pin */ +#endif + +#ifndef McuNRF24L01_CONFIG_IRQ_PIN_PORT + #define McuNRF24L01_CONFIG_IRQ_PIN_PORT PORTB + /*!< PORT for IRQ Pin */ +#endif + +#ifndef McuNRF24L01_CONFIG_IRQ_PIN_NUMBER + #define McuNRF24L01_CONFIG_IRQ_PIN_NUMBER 0 + /*!< Pin number of the IRQ Pin */ +#endif + +#ifndef McuNRF24L01_CONFIG_IRQ_LINE_NUMBER + #define McuNRF24L01_CONFIG_IRQ_LINE_NUMBER PORTB_IRQn + /*!< Kinetis IRQ line number for interrupt settings */ +#endif + +#endif /* __McuNRF24L01_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/RNet/McuRNet.c b/TSM_PicoW_Sensor/McuLib/RNet/McuRNet.c new file mode 100644 index 0000000..80202ff --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/RNet/McuRNet.c @@ -0,0 +1,204 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuRNet.h +** Component : McuRNet +** Version : Component 01.096, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2021-07-06, 16:35, # CodeGen: 0 +** Abstract : +** This components implements the RNet Stack. +** Settings : +** Component name : McuRNet +** Transceiver : +** Transceiver Type : nRF24L01+ +** nRF24L01+ : Enabled +** nRF24L01+ : McuNRF24L01 +** Radio Channel : 81 +** Data Rate : 2000 kBit +** Payload Size : 32 +** Address : 0x11, 0x22, 0x33, 0x44, 0x55 +** SMAC : Disabled +** Network : +** Address Size : 8 Bits +** Queues : +** Rx Message Queue Size : 15 +** Tx Message Queue Size : 15 +** Message Queue Blocking Time (ms) : 200 +** Send Retry Count : 3 +** Send Timeout (ms) : 250 +** System : +** Utility : UTIL1 +** RTOS : FRTOS1 +** Shell : Enabled +** Remote StdIO : Enabled +** Queue length : 48 +** Queue Timeout (ms) : 500 +** Shell : McuShell +** Contents : +** SetChannel - uint8_t McuRNet_SetChannel(uint8_t channel); +** ParseCommand - uint8_t McuRNet_ParseCommand(const unsigned char *cmd, bool *handled, const... +** Init - void McuRNet_Init(void); +** Deinit - void McuRNet_Deinit(void); +** +** * Copyright (c) 2014-2019, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** \file McuRNet.c +** \version 01.00 +** \brief This module implements the RNet Stack. +*/ +/*! +** @addtogroup McuRNet_module McuRNet module documentation +** @{ +*/ + +/* MODULE McuRNet. */ + +#include "McuRNetConfig.h" +#if McuRNET_CONFIG_IS_ENABLED +#include "McuRNet.h" +#include "RStack.h" +#include "Radio.h" +#include "RNWK.h" +#include "RMSG.h" +#include "RApp.h" +#include "RStdIO.h" +#include "McuNRF24L01.h" + +/* +** =================================================================== +** Method : McuRNet_OnInterrupt (component RNet) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +void McuNRF24L01_OnInterrupt(void) +{ + /* Write your code here ... */ +} + +/* +** =================================================================== +** Method : Init (component RNet) +** +** Description : +** Initializes the RNet Stack +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuRNet_Init(void) +{ + RSTACK_Init(); +} + +/* +** =================================================================== +** Method : Deinit (component RNet) +** +** Description : +** Deinitializes the RNet Stack +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuRNet_Deinit(void) +{ + RSTACK_Deinit(); +} + +/* +** =================================================================== +** Method : SetChannel (component RNet) +** +** Description : +** Sets the radio channel +** Parameters : +** NAME - DESCRIPTION +** channel - Channel number +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuRNet_SetChannel(uint8_t channel) +{ + return RADIO_SetChannel(channel); +} + +/* +** =================================================================== +** Method : ParseCommand (component RNet) +** +** Description : +** Shell Command Line parser. This method is enabled/disabled +** depending on if you have the Shell enabled/disabled in the +** properties. +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command string +** * handled - Pointer to variable which tells if +** the command has been handled or not +** * io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuRNet_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) +{ + static const McuShell_ParseCommandCallback CmdParserTable[] = + { + RADIO_ParseCommand, + RNWK_ParseCommand, + RMSG_ParseCommand, + #if RNET_CONFIG_REMOTE_STDIO + #if RSTDIO_PARSE_COMMAND_ENABLED + RSTDIO_ParseCommand, + #endif + #endif + McuNRF24L01_ParseCommand, + NULL /* sentinel */ + }; + return McuShell_IterateTable(cmd, handled, io, CmdParserTable); +} + +#if PL_HAS_RADIO +void McuRNet_OnRadioEvent(McuRNet_RadioEvent event) +{ + (void)event; + /* Write your code here ... */ +} +#endif + +#endif /* McuRNET_CONFIG_IS_ENABLED */ + +/* END McuRNet. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/RNet/McuRNet.h b/TSM_PicoW_Sensor/McuLib/RNet/McuRNet.h new file mode 100644 index 0000000..9fb583c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/RNet/McuRNet.h @@ -0,0 +1,161 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuRNet.h +** Project : INTRO_K22_Robo +** Processor : MK22FX512VLK12 +** Component : RNet +** Version : Component 01.096, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2021-07-06, 16:35, # CodeGen: 0 +** Abstract : +** This components implements the RNet Stack. +** Settings : +** Component name : McuRNet +** Transceiver : +** Transceiver Type : nRF24L01+ +** nRF24L01+ : Enabled +** nRF24L01+ : McuNRF24L01 +** Radio Channel : 81 +** Data Rate : 2000 kBit +** Payload Size : 32 +** Address : 0x11, 0x22, 0x33, 0x44, 0x55 +** SMAC : Disabled +** Network : +** Address Size : 8 Bits +** Queues : +** Rx Message Queue Size : 15 +** Tx Message Queue Size : 15 +** Message Queue Blocking Time (ms) : 200 +** Send Retry Count : 3 +** Send Timeout (ms) : 250 +** System : +** Utility : UTIL1 +** RTOS : FRTOS1 +** Shell : Enabled +** Remote StdIO : Enabled +** Queue length : 48 +** Queue Timeout (ms) : 500 +** Shell : CLS1 +** Contents : +** ParseCommand - uint8_t McuRNet_ParseCommand(const unsigned char *cmd, bool *handled, const... +** Init - void McuRNet_Init(void); +** Deinit - void McuRNet_Deinit(void); +** +** * Copyright (c) 2014-2019, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuRNet.h +** @version 01.00 +** @brief +** This components implements the RNet Stack. +*/ +/*! +** @addtogroup McuRNet_module McuRNet module documentation +** @{ +*/ + +#ifndef __McuRNet_H +#define __McuRNet_H + +/* MODULE McuRNet. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuRNetConfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuNRF24L01.h" +#include "McuUtility.h" +#include "McuRTOS.h" +#include "McuShell.h" + + +#define McuRNet_PARSE_COMMAND_ENABLED 1 /* set to 1 if method ParseCommand() is present, 0 otherwise */ + +typedef enum { + McuRNet_RADIO_MSG_RECEIVED, /* message has been received */ + McuRNet_RADIO_MSG_SENT, /* message has been sent */ + McuRNet_RADIO_TIMEOUT, /* timeout, no response received */ + McuRNet_RADIO_RETRY, /* retry, sending message again */ + McuRNet_RADIO_RETRY_MSG_FAILED, /* creating retry message failed */ + McuRNet_RADIO_ACK_RECEIVED /* acknowledge message received */ +} McuRNet_RadioEvent; + +#ifndef McuRNet_CREATE_EVENTS + #define McuRNet_CREATE_EVENTS 0 /* if to call user event handler */ +#endif + +void McuRNet_Init(void); +/* +** =================================================================== +** Method : Init (component RNet) +** +** Description : +** Initializes the RNet Stack +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuRNet_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component RNet) +** +** Description : +** Deinitializes the RNet Stack +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuRNet_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : ParseCommand (component RNet) +** +** Description : +** Shell Command Line parser. This method is enabled/disabled +** depending on if you have the Shell enabled/disabled in the +** properties. +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command string +** * handled - Pointer to variable which tells if +** the command has been handled or not +** * io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ + +/* END McuRNet. */ + +#endif +/* ifndef __McuRNet_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/RNet/McuRNetConfig.h b/TSM_PicoW_Sensor/McuLib/RNet/McuRNetConfig.h new file mode 100644 index 0000000..37f48c0 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/RNet/McuRNetConfig.h @@ -0,0 +1,117 @@ +/** + * \file + * \brief This is a main configuration file for the RNet stack + * \author (c) 2013-2014 Erich Styger, http://mcuoneclipse.com/ + * \note MIT License (http://opensource.org/licenses/mit-license.html) + * + * With this header file, the stack is configured. It sets the configuration defaults. + * The application can overwrite the configuration with a RNet_AppConfig.h header file. + */ + +#ifndef __McuRNet_CONFIG_H +#define __McuRNet_CONFIG_H + +#include "McuRNetConfig.h" +#if McuRNET_CONFIG_IS_ENABLED + +#ifndef McuRNet_CONFIG_APPLICATION_HEADER_FILE + #define McuRNet_CONFIG_APPLICATION_HEADER_FILE "RNet_AppConfig.h" + /*!< Header file to be used for the RNet application configuration */ +#endif + +#include "McuLib.h" +#include "McuRNet.h" /* component main header file */ + +#ifndef McuRNET_CONFIG_IS_ENABLED + #define McuRNET_CONFIG_IS_ENABLED (1 && McuLib_CONFIG_SDK_USE_FREERTOS) +#endif + +/* remote standard I/O destination address */ +#ifndef RSTDIO_CONFIG_SETTING_RSTDIO_DEFAULT_DESTINATION_ADDRESS + #define RSTDIO_CONFIG_SETTING_RSTDIO_DEFAULT_DESTINATION_ADDRESS 255 +#endif + +#ifndef RSTDIO_CONFIG_QUEUE_LENGTH + #define RSTDIO_CONFIG_QUEUE_LENGTH (48) + /*!< Size in bytes for the different RStdIO queues: RxStdOut, RxStdIn, RxStdErr, TxStdIn, TxStdErr */ +#endif + +/* Default configuration items, can be overwritten by the application configuration header file: */ +#define RNET_CONFIG_TRANSCEIVER_NRF24 1 + /*!< Nordic Semiconductor nRF24L01+ */ +#define RNET_CONFIG_TRANSCEIVER_MC13201 2 + /*!< Freescale MC13201/MC13213 */ + +#define RNET_CONFIG_TRANSCEIVER_TYPE RNET_CONFIG_TRANSCEIVER_NRF24 + /*!< Transceiver type used */ + +#if RNET_CONFIG_TRANSCEIVER_TYPE==RNET_CONFIG_TRANSCEIVER_NRF24 + /* nRF24L01+ specific settings */ + #ifndef RNET_CONFIG_NRF24_DATA_RATE + #define RNET_CONFIG_NRF24_DATA_RATE (McuNRF24L01_RF_SETUP_RF_DR_2000) + /*!< default transceiver data rate */ + #endif +#endif /* RNET_CONFIG_TRANSCEIVER_TYPE==RNET_CONFIG_TRANSCEIVER_NRF24 */ + +#if RNET_CONFIG_TRANSCEIVER_TYPE==RNET_CONFIG_TRANSCEIVER_MC13201 + /* MC1320x specific settings */ + #ifndef RNET_CONFIG_SMAC_OUPTUT_POWER + #define RNET_CONFIG_SMAC_OUPTUT_POWER (McuNRF24L01_RF_SETUP_RF_DR_2000) + /*!< default transceiver data rate */ +#endif + +#endif /* RNET_CONFIG_TRANSCEIVER_TYPE==RNET_CONFIG_TRANSCEIVER_MC13201 */ + +#ifndef RNET_CONFIG_TRANSCEIVER_PAYLOAD_SIZE + #define RNET_CONFIG_TRANSCEIVER_PAYLOAD_SIZE (32) + /*!< Size of the physical transceiver payload (bytes), max 32 bytes for nRF24L01+, max 128 bytes for MC1320x */ +#endif + +#ifndef RNET_CONFIG_TRANSCEIVER_CHANNEL + #define RNET_CONFIG_TRANSCEIVER_CHANNEL (81) + /*!< default radio channel of transceiver */ +#endif + +#ifndef RNET_CONFIG_SHORT_ADDR_SIZE + #define RNET_CONFIG_SHORT_ADDR_SIZE (1) + /*!< size of short address type. Either 1 or 2 */ +#endif + +#ifndef RNET_CONFIG_SEND_RETRY_CNT + #define RNET_CONFIG_SEND_RETRY_CNT (3) + /*!< Number of retries if message sending failed. Set to zero to disable retry. */ +#endif + +#ifndef RNET_CONFIG_RX_MULTIPLE_MESSAGE_COUNT + #define RNET_CONFIG_RX_MULTIPLE_MESSAGE_COUNT (10) + /*!< How many incomming messages should be handled togther. */ +#endif + +/* Configuration for Rx and Tx queues */ +#ifndef RNET_CONFIG_MSG_QUEUE_NOF_RX_ITEMS + #define RNET_CONFIG_MSG_QUEUE_NOF_RX_ITEMS (15) + /*!< Number items in the Rx message queue. The higher, the more items can be buffered. */ +#endif + +#ifndef RNET_CONFIG_MSG_QUEUE_NOF_TX_ITEMS + #define RNET_CONFIG_MSG_QUEUE_NOF_TX_ITEMS (15) + /*!< Number items in the Tx message queue. The higher, the more items can be buffered. */ +#endif + +#ifndef RNET_CONFIG_MSG_QUEUE_PUT_BLOCK_TIME_TICKS + #define RNET_CONFIG_MSG_QUEUE_PUT_BLOCK_TIME_TICKS (pdMS_TO_TICKS(200)) + /*!< Blocking number of RTOS ticks for putting items into the message queue before timeout. Use portMAX_DELAY for blocking. */ +#endif + +#ifndef RNET_CONFIG_REMOTE_STDIO + #define RNET_CONFIG_REMOTE_STDIO (1) + /*!< 1 for remote stdio over radio enabled, 0 for disabled. */ +#endif + +#ifndef RNET_RADIO_WAITNG_TIMEOUT_MS + #define RNET_RADIO_WAITNG_TIMEOUT_MS 250 /* timeout value in milliseconds, used for RADIO_WAITING_DATA_SENT */ +#endif + +#endif /* McuRNET_CONFIG_IS_ENABLED */ + +#endif /* __McuRNet_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/RNet/RApp.c b/TSM_PicoW_Sensor/McuLib/RNet/RApp.c new file mode 100644 index 0000000..4bc0c0b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/RNet/RApp.c @@ -0,0 +1,174 @@ +/** + * \file + * \brief This is the implementation for the Radio Application service part. + * \author (c) 2013-2014 Erich Styger, http://mcuoneclipse.com/ + * \note MIT License (http://opensource.org/licenses/mit-license.html), see 'RNet_License.txt' + * + * This module provides application services of the network stack. + */ + +#include "McuRNetConfig.h" +#if McuRNET_CONFIG_IS_ENABLED +#include "RApp.h" +#include "RNWK.h" +#include "McuUtility.h" +#include "McuLog.h" + +static const RAPP_MsgHandler *RAPP_MsgHandlerTable; + +uint8_t RAPP_PutPayload(uint8_t *buf, size_t bufSize, uint8_t payloadSize, RAPP_MSG_Type type, RAPP_ShortAddrType dstAddr, RAPP_FlagsType flags) { + RAPP_BUF_TYPE(buf) = (uint8_t)type; + RAPP_BUF_SIZE(buf) = payloadSize; + return RNWK_PutPayload(buf, bufSize, payloadSize+RAPP_HEADER_SIZE, dstAddr, flags); +} + +uint8_t RAPP_SendPayloadDataBlock(uint8_t *appPayload, uint8_t appPayloadSize, uint8_t msgType, RAPP_ShortAddrType dstAddr, RAPP_FlagsType flags) { + uint8_t buf[RAPP_BUFFER_SIZE]; /* payload data buffer */ + int i; + + if (appPayloadSize>RAPP_PAYLOAD_SIZE) { + return ERR_OVERFLOW; /* block too large for payload */ + } + i = 0; + while(iphyData); + size = RAPP_BUF_SIZE(packet->phyData); + data = RAPP_BUF_PAYLOAD_START(packet->phyData); + srcAddr = RNWK_BUF_GET_SRC_ADDR(packet->phyData); + return ParseMessage(type, size, data, srcAddr, packet); +} + +uint8_t RAPP_SetMessageHandlerTable(const RAPP_MsgHandler *table) { + RAPP_MsgHandlerTable = table; + return ERR_OK; +} + +RAPP_ShortAddrType RAPP_GetThisNodeAddr(void) { + return RNWK_GetThisNodeAddr(); +} + +uint8_t RAPP_SetThisNodeAddr(RAPP_ShortAddrType addr) { + return RNWK_SetThisNodeAddr(addr); +} + +void RAPP_SniffPacket(RAPP_PacketDesc *packet, bool isTx) { + int i; + uint8_t dataSize; + unsigned char flagsBuf[32]; + unsigned char phyBuf[96]; + unsigned char macBuf[32]; + + if (packet->flags!=RPHY_PACKET_FLAGS_NONE) { + flagsBuf[0] = '\0'; + if (packet->flags&RPHY_PACKET_FLAGS_IS_ACK) { + McuUtility_strcat(flagsBuf, sizeof(flagsBuf), (unsigned char*)" IS_ACK"); + } + if (packet->flags&RPHY_PACKET_FLAGS_REQ_ACK) { + McuUtility_strcat(flagsBuf, sizeof(flagsBuf), (unsigned char*)" REQ_ACK"); + } + if (packet->flags&RPHY_PACKET_FLAGS_NO_ACK) { + McuUtility_strcat(flagsBuf, sizeof(flagsBuf), (unsigned char*)" NO_ACK"); + } + if (packet->flags&RPHY_PACKET_FLAGS_POWER_DOWN) { + McuUtility_strcat(flagsBuf, sizeof(flagsBuf), (unsigned char*)" POWER_DOWN"); + } + } else { + McuUtility_strcpy(flagsBuf, sizeof(flagsBuf), (unsigned char*)" "); + } + + /* PHY */ + phyBuf[0] = '\0'; + dataSize = RPHY_BUF_SIZE(packet->phyData); + for(i=0; iphyData[i]); + McuUtility_chcat(phyBuf, sizeof(phyBuf), ' '); + } + + /* MAC */ + RMAC_DecodeType(macBuf, sizeof(macBuf), packet); + + McuLog_trace("%s:flags:%02x%s size:%02x PHY: %sMAC: type:%02x%s, s#:%02x NWK: src:%02x dst:%02x", + isTx?"Tx":"Rx", + packet->flags, + flagsBuf, + packet->phySize, + /* PHY */ + phyBuf, + /* MAC */ + RMAC_BUF_TYPE(packet->phyData), + macBuf, + RMAC_BUF_SEQN(packet->phyData), + /* NWK */ + RNWK_BUF_GET_SRC_ADDR(packet->phyData), + RNWK_BUF_GET_DST_ADDR(packet->phyData) + ); + + /* APP */ + if (dataSize>RMAC_HEADER_SIZE+RNWK_HEADER_SIZE) { /* there is application data */ + unsigned char appBuf[32]; + + dataSize = RAPP_BUF_SIZE(packet->phyData); + uint8_t *app_data = RAPP_BUF_PAYLOAD_START(packet->phyData); + appBuf[0] = '\0'; + for(i=0; iphyData), + RAPP_BUF_SIZE(packet->phyData), + appBuf + ); + } +} + +void RAPP_Deinit(void) { + /* nothing needed */ +} + +void RAPP_Init(void) { + (void)RNWK_SetAppOnPacketRxCallback(RAPP_OnPacketRx); + RAPP_MsgHandlerTable = NULL; +} + +#endif /* McuRNET_CONFIG_IS_ENABLED */ diff --git a/TSM_PicoW_Sensor/McuLib/RNet/RApp.h b/TSM_PicoW_Sensor/McuLib/RNet/RApp.h new file mode 100644 index 0000000..e6df321 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/RNet/RApp.h @@ -0,0 +1,87 @@ +/** + * \file + * \brief This is the interface for the Radio Application part. + * \author (c) 2013-2014 Erich Styger, http://mcuoneclipse.com/ + * \note MIT License (http://opensource.org/licenses/mit-license.html), see 'RNet_License.txt' + * + * This module acts as the application part of the network stack. + */ + +#ifndef RAPP_H_ +#define RAPP_H_ + +#include "McuRNetConfig.h" +#if McuRNET_CONFIG_IS_ENABLED +#include McuRNet_CONFIG_APPLICATION_HEADER_FILE +#include "RNWK.h" +#include "RPHY.h" + +/* payload format is: + * + */ +#define RAPP_HEADER_SIZE (2) /* */ +#define RAPP_PAYLOAD_SIZE (RNWK_PAYLOAD_SIZE-RAPP_HEADER_SIZE) +#define RAPP_BUFFER_SIZE (RNWK_BUFFER_SIZE) + +/* PHY buffer access macros */ +#define RAPP_BUF_IDX_TYPE (RNWK_BUF_IDX_PAYLOAD+0) /* index */ +#define RAPP_BUF_IDX_SIZE (RNWK_BUF_IDX_PAYLOAD+1) /* index */ +#define RAPP_BUF_IDX_PAYLOAD (RNWK_BUF_IDX_PAYLOAD+2) /* index */ + +#define RAPP_BUF_TYPE(phy) ((phy)[RAPP_BUF_IDX_TYPE]) +#define RAPP_BUF_SIZE(phy) ((phy)[RAPP_BUF_IDX_SIZE]) + +#define RAPP_BUF_PAYLOAD_START(phy) (RNWK_BUF_PAYLOAD_START(phy)+RAPP_HEADER_SIZE) + +/* wrapper defines of low level types */ +#define RAPP_FlagsType RPHY_FlagsType +#define RAPP_ShortAddrType RNWK_ShortAddrType +#define RAPP_PacketDesc RPHY_PacketDesc + +/* message handler */ +typedef uint8_t (*RAPP_MsgHandler) (RAPP_MSG_Type type, uint8_t size, uint8_t *data, RAPP_ShortAddrType srcAddr, bool *handled, RAPP_PacketDesc *packet); + +uint8_t RAPP_SetMessageHandlerTable(const RAPP_MsgHandler *table); + +uint8_t RAPP_PutPayload(uint8_t *buf, size_t bufSize, uint8_t payloadSize, RAPP_MSG_Type type, RAPP_ShortAddrType dstAddr, RAPP_FlagsType flags); + +/*! + * \brief Returns the network node address + * \return Current network address of this node. + */ +RAPP_ShortAddrType RAPP_GetThisNodeAddr(void); + +/*! + * \brief Sets the network address of this node. + * \param addr Network node address to set. + * \return Error code, ERR_OK for no failure. + */ +uint8_t RAPP_SetThisNodeAddr(RAPP_ShortAddrType addr); + +/*! + * \brief Send an application payload data block. + * \param appPayload Size of application payload. + * \param appPayloadSize Application payload size. + * \param msgType Payload message type. + * \param dstAddr destination address. + * \param flags Packet flags. + * \return Error code, ERR_OK for no failure. + */ +uint8_t RAPP_SendPayloadDataBlock(uint8_t *appPayload, uint8_t appPayloadSize, uint8_t msgType, RAPP_ShortAddrType dstAddr, RAPP_FlagsType flags); + +/*! + * \brief Sniffs and dumps a packet. + * \param packet Data packet. + * \param isTx If either Tx or Rx packet. + */ +void RAPP_SniffPacket(RAPP_PacketDesc *packet, bool isTx); + +/*! \brief Initializes the module */ +void RAPP_Init(void); + +/*! \brief Deinitializes the module */ +void RAPP_Deinit(void); +#endif /* McuRNET_CONFIG_IS_ENABLED */ + +#endif /* RAPP_H_ */ + diff --git a/TSM_PicoW_Sensor/McuLib/RNet/RMAC.c b/TSM_PicoW_Sensor/McuLib/RNet/RMAC.c new file mode 100644 index 0000000..59edb65 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/RNet/RMAC.c @@ -0,0 +1,98 @@ +/** + * \file + * \brief This is the implementation of the Radio MAC part. + * \author (c) 2013-2014 Erich Styger, http://mcuoneclipse.com/ + * \note MIT License (http://opensource.org/licenses/mit-license.html), see 'RNet_License.txt' + * + * This module encapsulates the Media Access of network stack. + */ + +#include "McuRNetConfig.h" +#if McuRNET_CONFIG_IS_ENABLED +#include "RMAC.h" +#include "RPHY.h" +#include "RNWK.h" +#include "McuUtility.h" + +static uint8_t RMAC_SeqNr = 0; +static uint8_t RMAC_ExpectedAckSeqNr; + +uint8_t RMAC_PutPayload(uint8_t *buf, size_t bufSize, uint8_t payloadSize, RPHY_FlagsType flags) { + if (flags&RPHY_PACKET_FLAGS_REQ_ACK) { + RMAC_BUF_TYPE(buf) = (uint8_t)((uint8_t)RMAC_MSG_TYPE_DATA|(uint8_t)RMAC_MSG_TYPE_REQ_ACK); + } else { + RMAC_BUF_TYPE(buf) = (uint8_t)RMAC_MSG_TYPE_DATA; + } + RMAC_ExpectedAckSeqNr = RMAC_SeqNr; + RMAC_BUF_SEQN(buf) = RMAC_SeqNr++; + return RPHY_PutPayload(buf, bufSize, payloadSize+RMAC_HEADER_SIZE, flags); +} + +uint8_t RMAC_OnPacketRx(RPHY_PacketDesc *packet) { + return RNWK_OnPacketRx(packet); /* pass data packet up the stack */ +} + +uint8_t RMAC_SendACK(RPHY_PacketDesc *rxPacket, RPHY_PacketDesc *ackPacket) { + RMAC_BUF_TYPE(ackPacket->phyData) = (uint8_t)RMAC_MSG_TYPE_ACK; /* set type to ack */ + RMAC_BUF_SEQN(ackPacket->phyData) = RMAC_BUF_SEQN(rxPacket->phyData); + /* use same sequence number as in the received package, so no change */ + return RPHY_PutPayload(ackPacket->phyData, ackPacket->phySize, RMAC_HEADER_SIZE+RNWK_HEADER_SIZE, RPHY_PACKET_FLAGS_NONE); +} + +RMAC_MsgType RMAC_GetType(uint8_t *buf, size_t bufSize) { + (void)bufSize; /* not used */ + return (RMAC_MsgType)RMAC_BUF_TYPE(buf); +} + +bool RMAC_IsExpectedACK(uint8_t *buf, size_t bufSize) { + (void)bufSize; /* not used */ + return RMAC_BUF_SEQN(buf)==RMAC_ExpectedAckSeqNr; +} + +void RMAC_SniffPacket(RPHY_PacketDesc *packet, bool isTx) { + RNWK_SniffPacket(packet, isTx); +} + +void RMAC_DecodeType(uint8_t *buf, size_t bufSize, RPHY_PacketDesc *packet) { + RMAC_MsgType type; + bool first = TRUE; + + type = (RMAC_MsgType)RMAC_BUF_TYPE(packet->phyData); + buf[0] = '\0'; + McuUtility_chcat(buf, bufSize, '('); + if ((uint8_t)type&(uint8_t)RMAC_MSG_TYPE_REQ_ACK) { + McuUtility_strcat(buf, bufSize, (unsigned char*)"RACK"); + first = FALSE; + } else { + McuUtility_strcat(buf, bufSize, (unsigned char*)"NACK"); + first = FALSE; + } + if ((uint8_t)type&(uint8_t)RMAC_MSG_TYPE_DATA) { + if (!first) { + McuUtility_chcat(buf, bufSize, '|'); + } + McuUtility_strcat(buf, bufSize, (unsigned char*)"DATA"); + first = FALSE; + } + if ((uint8_t)type&(uint8_t)RMAC_MSG_TYPE_ACK) { + if (!first) { + McuUtility_chcat(buf, bufSize, '|'); + } + McuUtility_strcat(buf, bufSize, (unsigned char*)"ACK"); + } + if ((uint8_t)type&(uint8_t)RMAC_MSG_TYPE_CMD) { + McuUtility_strcat(buf, bufSize, (unsigned char*)"CMD"); + } + McuUtility_chcat(buf, bufSize, ')'); +} + +void RMAC_Deinit(void) { + /* nothing needed */ +} + +void RMAC_Init(void) { + RMAC_SeqNr = 0; + RMAC_ExpectedAckSeqNr = 0; +} + +#endif /* McuRNET_CONFIG_IS_ENABLED */ diff --git a/TSM_PicoW_Sensor/McuLib/RNet/RMAC.h b/TSM_PicoW_Sensor/McuLib/RNet/RMAC.h new file mode 100644 index 0000000..95e6c89 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/RNet/RMAC.h @@ -0,0 +1,110 @@ +/** + * \file + * \brief This is the interface for the Radio MAC part. + * \author (c) 2013-2014 Erich Styger, http://mcuoneclipse.com/ + * \note MIT License (http://opensource.org/licenses/mit-license.html), see 'RNet_License.txt' + * + * This module encapsulates the Media Access of network stack. + */ + +#ifndef RMAC_H_ +#define RMAC_H_ + +#include "McuRNetConfig.h" +#if McuRNET_CONFIG_IS_ENABLED +#include "RPHY.h" + +typedef enum RMAC_MsgType { + RMAC_MSG_TYPE_INIT = 0x0, /* initialization value */ + RMAC_MSG_TYPE_DATA = 0x1, /* flag: data message */ + RMAC_MSG_TYPE_ACK = 0x2, /* flag: acknowledge message */ + RMAC_MSG_TYPE_CMD = 0x4, /* flag: command message */ + RMAC_MSG_TYPE_REQ_ACK = 0x80, /* flag: ack requested */ +} RMAC_MsgType; + +#define RMAC_MSG_TYPE_IS_DATA(type) ((uint8_t)(type)&(uint8_t)RMAC_MSG_TYPE_DATA) +#define RMAC_MSG_TYPE_IS_ACK(type) ((uint8_t)(type)&(uint8_t)RMAC_MSG_TYPE_ACK) +#define RMAC_MSG_TYPE_IS_CMD(type) ((uint8_t)(type)&(uint8_t)RMAC_MSG_TYPE_CMD) +#define RMAC_MSG_TYPE_REQ_ACK(type) ((uint8_t)(type)&(uint8_t)RMAC_MSG_TYPE_REQ_ACK) + +/* payload format is: + * PHY: + * MAC: + * NWK: + * APP: + */ +#define RMAC_HEADER_SIZE (2) /* */ +#define RMAC_PAYLOAD_SIZE (RPHY_PAYLOAD_SIZE-RMAC_HEADER_SIZE) +#define RMAC_BUFFER_SIZE (RPHY_BUFFER_SIZE) + +/* PHY buffer access macros */ +#define RMAC_BUF_IDX_TYPE (RPHY_BUF_IDX_PAYLOAD+0) /* index */ +#define RMAC_BUF_IDX_SEQNR (RPHY_BUF_IDX_PAYLOAD+1) /* index */ +#define RMAC_BUF_IDX_PAYLOAD (RPHY_BUF_IDX_PAYLOAD+2) /* index */ + +#define RMAC_BUF_TYPE(phy) ((phy)[RMAC_BUF_IDX_TYPE]) +#define RMAC_BUF_SEQN(phy) ((phy)[RMAC_BUF_IDX_SEQNR]) + +#define RMAC_BUF_PAYLOAD_START(phy) (RPHY_BUF_PAYLOAD_START(phy)+RMAC_HEADER_SIZE) + +uint8_t RMAC_OnPacketRx(RPHY_PacketDesc *packet); + +/*! + * \brief Puts the MAC payload data into a buffer to be sent later. + * \param[in] buf Buffer with the data, must be of RMAC_BUFFER_SIZE. + * \param[in] bufSize Buffer size. + * \param[in] payloadSize Size of MAC payload data. + * \param[in] flags Packet flags + * \return Error code, ERR_OK if everything is ok, ERR_OVERFLOW if buffer is too small. + */ +uint8_t RMAC_PutPayload(uint8_t *buf, size_t bufSize, uint8_t payloadSize, RPHY_FlagsType flags); + +/*! + * \brief Sends an acknowledge message for the received MAC payload data. + * \param[in] packet Packet data for which we need to send the ack. + * \param[in] saddr Source address of the packet (our own address). + * \return Error code, ERR_OK if everything is ok, error code otherwise. + */ +uint8_t RMAC_SendACK(RPHY_PacketDesc *rxPacket, RPHY_PacketDesc *ackPacket); + +/*! + * \brief Check if the expected ACK message is expected. This is done with checking the sequence number. + * \param[in] buf Pointer to the received packet. + * \param[in] bufSize size of the received packet. + * \return TRUE if it is an expected ACK packet, false otherwise (e.g. if sequence number does not match). + */ +bool RMAC_IsExpectedACK(uint8_t *buf, size_t bufSize); + +/*! + * \brief Returns the type of the message. + * \param buf Pointer to the message buffer. + * \param bufSize Size of the buffer. + * \return Type of message. + */ +RMAC_MsgType RMAC_GetType(uint8_t *buf, size_t bufSize); + +/*! + * \brief Sniffs and dumps a packet to the Shell. + * \param packet Data packet. + * \param isTx If either Tx or Rx packet. + */ +void RMAC_SniffPacket(RPHY_PacketDesc *packet, bool isTx); + +/*! + * \brief Decodes the MAC type information as string. + * \param[out] buf Character buffer where to store the string. + * \param[in] bufSize Size of character buffer in bytes. + * \param[in] packet Packet information. + */ +void RMAC_DecodeType(uint8_t *buf, size_t bufSize, RPHY_PacketDesc *packet); + +/*! \brief Initializes the module */ +void RMAC_Init(void); + +/*! \brief Deinitializes the module */ +void RMAC_Deinit(void); + +#endif /* McuRNET_CONFIG_IS_ENABLED */ + +#endif /* RMAC_H_ */ + diff --git a/TSM_PicoW_Sensor/McuLib/RNet/RMSG.c b/TSM_PicoW_Sensor/McuLib/RNet/RMSG.c new file mode 100644 index 0000000..6dd0f74 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/RNet/RMSG.c @@ -0,0 +1,201 @@ +/** + * \file + * \brief This implements a queue/buffer for radio messages + * \author (c) 2013-2014 Erich Styger, http://mcuoneclipse.com/ + * \note MIT License (http://opensource.org/licenses/mit-license.html), see 'RNet_License.txt' + * + * This module uses queues to retrieve and store radio messages. + */ + +#include "McuRNetConfig.h" +#if McuRNET_CONFIG_IS_ENABLED +#include "Radio.h" +#include "RMSG.h" +#include "McuRTOS.h" +#include "RPHY.h" + +/* Configuration for tx and rx queues */ +#define RMSG_QUEUE_RX_NOF_ITEMS (RNET_CONFIG_MSG_QUEUE_NOF_RX_ITEMS) /* number of items in the queue */ +#define RMSG_QUEUE_TX_NOF_ITEMS (RNET_CONFIG_MSG_QUEUE_NOF_TX_ITEMS) /* number of items in the queue */ +#define RMSG_QUEUE_PUT_WAIT (RNET_CONFIG_MSG_QUEUE_PUT_BLOCK_TIME_TICKS) /* blocking time (ticks!) for putting messages into queue */ + +static QueueHandle_t RMSG_MsgRxQueue, RMSG_MsgTxQueue; /* queue for messages, format is: kind(8bit) dataSize(8bit) data */ + +unsigned int RMSG_RxQueueNofItems(void) { + return (unsigned int)McuRTOS_uxQueueMessagesWaiting(RMSG_MsgRxQueue); +} + +unsigned int RMSG_TxQueueNofItems(void) { + return (unsigned int)McuRTOS_uxQueueMessagesWaiting(RMSG_MsgTxQueue); +} + +uint8_t RMSG_FlushRxQueue(void) { + if (McuRTOS_xQueueReset(RMSG_MsgRxQueue)!=pdPASS) { + return ERR_FAILED; + } + return ERR_OK; +} + +uint8_t RMSG_FlushTxQueue(void) { + if (McuRTOS_xQueueReset(RMSG_MsgTxQueue)!=pdPASS) { + return ERR_FAILED; + } + return ERR_OK; +} + +uint8_t RMSG_QueuePut(uint8_t *buf, size_t bufSize, uint8_t payloadSize, bool fromISR, bool isTx, bool toBack, RPHY_FlagsType flags) { + /* data format is: dataSize(8bit) data */ + uint8_t res = ERR_OK; + QueueHandle_t queue; + BaseType_t qRes; + + if (payloadSize>RPHY_PAYLOAD_SIZE) { + return ERR_OVERFLOW; /* more data than can fit into payload! */ + } + if (bufSize!=RPHY_BUFFER_SIZE) { + return ERR_FAILED; /* must be exactly this buffer size!!! */ + } + if (isTx) { + queue = RMSG_MsgTxQueue; + } else { + queue = RMSG_MsgRxQueue; + } + RPHY_BUF_FLAGS(buf) = flags; + RPHY_BUF_SIZE(buf) = payloadSize; + if (fromISR) { + BaseType_t pxHigherPriorityTaskWoken; + + if (toBack) { + qRes = McuRTOS_xQueueSendToBackFromISR(queue, buf, &pxHigherPriorityTaskWoken); + } else { + qRes = McuRTOS_xQueueSendToFrontFromISR(queue, buf, &pxHigherPriorityTaskWoken); + } + if (qRes!=pdTRUE) { + /* was not able to send to the queue. Well, not much we can do here... */ + res = ERR_BUSY; + } else { + if (isTx) { + RADIO_NotifyFromInterrupt(RADIO_FLAG_TX_REQUEST, &pxHigherPriorityTaskWoken); + } + } + } else { + if (toBack) { + qRes = McuRTOS_xQueueSendToBack(queue, buf, RMSG_QUEUE_PUT_WAIT); + } else { + qRes = McuRTOS_xQueueSendToFront(queue, buf, RMSG_QUEUE_PUT_WAIT); + } + if (qRes!=pdTRUE) { + res = ERR_BUSY; + } else { + if (isTx) { + RADIO_Notify(RADIO_FLAG_TX_REQUEST); + } + } + } + return res; +} + +uint8_t RMSG_PutRetryTxMsg(uint8_t *buf, size_t bufSize) { + if (bufSizestdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Shows radio help or status\r\n", io->stdOut); + return ERR_OK; +} + +static uint8_t RMSG_PrintStatus(const McuShell_StdIOType *io) { + uint8_t buf[32]; + + McuShell_SendStatusStr((unsigned char*)"rmsg", (unsigned char*)"\r\n", io->stdOut); + + McuUtility_Num32uToStr(buf, sizeof(buf), RMSG_RxQueueNofItems()); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" items\r\n"); + McuShell_SendStatusStr((unsigned char*)" rx", buf, io->stdOut); + McuUtility_Num32uToStr(buf, sizeof(buf), RMSG_TxQueueNofItems()); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" items\r\n"); + McuShell_SendStatusStr((unsigned char*)" tx", buf, io->stdOut); + return ERR_OK; +} + +uint8_t RMSG_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) { + uint8_t res = ERR_OK; + + if (McuUtility_strcmp((char*)cmd, (char*)McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, (char*)"rmsg help")==0) { + *handled = TRUE; + return RMSG_PrintHelp(io); + } else if (McuUtility_strcmp((char*)cmd, (char*)McuShell_CMD_STATUS)==0 || McuUtility_strcmp((char*)cmd, (char*)"rmsg status")==0) { + *handled = TRUE; + return RMSG_PrintStatus(io); + } + return res; +} + +void RMSG_Deinit(void) { + McuRTOS_vQueueUnregisterQueue(RMSG_MsgRxQueue); + McuRTOS_vQueueDelete(RMSG_MsgRxQueue); + RMSG_MsgRxQueue = NULL; + + McuRTOS_vQueueUnregisterQueue(RMSG_MsgTxQueue); + McuRTOS_vQueueDelete(RMSG_MsgTxQueue); + RMSG_MsgTxQueue = NULL; +} + +void RMSG_Init(void) { + RMSG_MsgRxQueue = McuRTOS_xQueueCreate(RMSG_QUEUE_RX_NOF_ITEMS, RPHY_BUFFER_SIZE); + if (RMSG_MsgRxQueue==NULL) { /* queue creation failed! */ + for(;;) {} /* not enough memory? */ + } + McuRTOS_vQueueAddToRegistry(RMSG_MsgRxQueue, "RadioRxMsg"); +#if configUSE_TRACE_HOOKS + vTraceSetQueueName(RMSG_MsgRxQueue, "RadioRxMsg"); +#endif + + RMSG_MsgTxQueue = McuRTOS_xQueueCreate(RMSG_QUEUE_TX_NOF_ITEMS, RPHY_BUFFER_SIZE); + if (RMSG_MsgTxQueue==NULL) { /* queue creation failed! */ + for(;;) {} /* not enough memory? */ + } + McuRTOS_vQueueAddToRegistry(RMSG_MsgTxQueue, "RadioTxMsg"); +#if configUSE_TRACE_HOOKS + vTraceSetQueueName(RMSG_MsgTxQueue, "RadioTxMsg"); +#endif +} + +#endif /* McuRNET_CONFIG_IS_ENABLED */ diff --git a/TSM_PicoW_Sensor/McuLib/RNet/RMSG.h b/TSM_PicoW_Sensor/McuLib/RNet/RMSG.h new file mode 100644 index 0000000..112aad1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/RNet/RMSG.h @@ -0,0 +1,118 @@ +/** + * \file + * \brief Radio Network Message Layer + * \author (c) 2013-2014 Erich Styger, http://mcuoneclipse.com/ + * \note MIT License (http://opensource.org/licenses/mit-license.html), see 'RNet_License.txt' + * + * This module implements radio message handling module of the radio network stack. + */ + +#ifndef RADIOMESSAGE_H_ +#define RADIOMESSAGE_H_ + +#include "McuRNetConfig.h" +#if McuRNET_CONFIG_IS_ENABLED +#include "RPHY.h" + +#include "McuShell.h" +/*! + * \brief Parses a command + * \param cmd Command string to be parsed + * \param handled Sets this variable to TRUE if command was handled + * \param io I/O stream to be used for input/output + * \return Error code, ERR_OK if everything was fine + */ +uint8_t RMSG_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); + +/*! + * \brief Returns the number of messages in the Rx queue + * \return Number of items in the Rx queue + */ +unsigned int RMSG_RxQueueNofItems(void); + +/*! + * \brief Returns the number of messages in the Tx queue + * \return Number of items in the Tx queue + */ +unsigned int RMSG_TxQueueNofItems(void); + +/*! + * \brief Flushes the Rx queue (makes it empty). + * \return Error code, ERR_OK for everything fine. + */ +uint8_t RMSG_FlushRxQueue(void); + +/*! + * \brief Flushes the Rx queue (makes it empty). + * \return Error code, ERR_OK for everything fine. + */ +uint8_t RMSG_FlushTxQueue(void); + +/*! + * \brief Queues a message to be sent to the radio transceiver. + * \param buf Pointer to the message data to be sent. + * \param bufSize Size of buffer. + * \param payloadSize Size of payload data. + * \param fromISR If called from an ISR routine. + * \param isTx If message is TX or RX. + * \param toBack If message shall be sent to the back of the list. + * \param flags Packet flags. + * \return Error code, ERR_OK if message has been queued. + */ +uint8_t RMSG_QueuePut(uint8_t *buf, size_t bufSize, uint8_t payloadSize, bool fromISR, bool isTx, bool toBack, RPHY_FlagsType flags); + +/*! + * \brief Puts a message into the TX queue for resending (in front of the queue) + * \param buf[in] pointer to message + * \param bufSize[in] size of message + * \return Error code, ERR_OK if message has been queued. + */ +uint8_t RMSG_PutRetryTxMsg(uint8_t *buf, size_t bufSize); + +/*! + * \brief Used to check if we have a message incoming from the RX queue. + * \param[in] buf Buffer where to store the incoming message + * \param[in] bufSize Size of buffer, must be at least of size PHY_BUFFER_SIZE + * \param[in] payLoadPtr Pointer to payload start. + * \param[in] payloadSize Size of payload. + * \return ERR_OK if we have a message, otherwise error code. + */ +uint8_t RMSG_GetRxMsg(uint8_t *buf, size_t bufSize); + +/*! + * \brief Used to check if we have a message outgoing in the TX queue. + * \param buf Buffer where to store the incoming message + * \param bufSize Size of buffer, must be at least of size RMSG_QUEUE_ITEM_SIZE + * \return ERR_OK if we have a message, otherwise error code. + */ +uint8_t RMSG_GetTxMsg(uint8_t *buf, size_t bufSize); + +/*! + * \brief Add a message to the TX queue. + * \param buf Pointer to the message data. + * \param bufSize Size of the buffer in bytes, must be RPHY_BUFFER_SIZE. + * \param payloadSize Size of payload in buffer. + * \param flags Packet flags. + * \return ERR_OK, or error code. + */ +uint8_t RMSG_QueueTxMsg(uint8_t *buf, size_t bufSize, uint8_t payloadSize, RPHY_FlagsType flags); + +/*! + * \brief Add a message to the RX queue. + * \param buf Pointer to the message data. + * \param bufSize Size of the buffer in bytes. + * \param payloadSize Size of payload in buffer. + * \param flags Packet flags + * \return ERR_OK, or error code. + */ +uint8_t RMSG_QueueRxMsg(uint8_t *buf, size_t bufSize, uint8_t payloadSize, RPHY_FlagsType flags); + +/*! \brief Initializes the module */ +void RMSG_Init(void); + +/*! \brief Deinitializes the module */ +void RMSG_Deinit(void); + +#endif /* RADIOMESSAGE_H_ */ + +#endif /* McuRNET_CONFIG_IS_ENABLED */ diff --git a/TSM_PicoW_Sensor/McuLib/RNet/RNWK.c b/TSM_PicoW_Sensor/McuLib/RNet/RNWK.c new file mode 100644 index 0000000..dc18bf8 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/RNet/RNWK.c @@ -0,0 +1,132 @@ +/** + * \file + * \brief Radio Network NWK Layer Implementation + * \author (c) 2013-2014 Erich Styger, http://mcuoneclipse.com/ + * \note MIT License (http://opensource.org/licenses/mit-license.html), see 'RNet_License.txt' + * + * This module implements the NWK (Network) of the radio network stack. + */ + +#include "McuRNetConfig.h" +#if McuRNET_CONFIG_IS_ENABLED +#include "RPHY.h" +#include "RMAC.h" +#include "RNWK.h" +#include "RApp.h" +#include "McuUtility.h" + +static RNWK_ShortAddrType RNWK_ThisNodeAddr = RNWK_ADDR_BROADCAST; /* address of this network node */ +static RNWK_AppOnRxCallbackType RNWK_AppOnRxCallback = NULL; /* notification callback installed by upper layer */ + +RNWK_ShortAddrType RNWK_GetThisNodeAddr(void) { + return RNWK_ThisNodeAddr; +} + +uint8_t RNWK_SetThisNodeAddr(RNWK_ShortAddrType addr) { + RNWK_ThisNodeAddr = addr; + return ERR_OK; +} + +uint8_t RNWK_SetAppOnPacketRxCallback(RNWK_AppOnRxCallbackType callback) { + RNWK_AppOnRxCallback = callback; + return ERR_OK; +} + +uint8_t RNWK_PutPayload(uint8_t *buf, size_t bufSize, uint8_t payloadSize, RNWK_ShortAddrType dstAddr, RPHY_FlagsType flags) { + RNWK_ShortAddrType srcAddr; + + srcAddr = RNWK_GetThisNodeAddr(); + RNWK_BUF_SET_SRC_ADDR(buf, srcAddr); + RNWK_BUF_SET_DST_ADDR(buf, dstAddr); + return RMAC_PutPayload(buf, bufSize, payloadSize+RNWK_HEADER_SIZE, flags); +} + +uint8_t RNWK_SendACK(RPHY_PacketDesc *rxPacket, RNWK_ShortAddrType saddr) { + RNWK_ShortAddrType addr; + uint8_t buf[RMAC_BUFFER_SIZE]; + RPHY_PacketDesc ackPacket; + + ackPacket.flags = RPHY_PACKET_FLAGS_NONE; + ackPacket.phyData = buf; + ackPacket.phySize = sizeof(buf); + + /* send an ack message back: this is is of type ack with src and dst address */ + addr = RNWK_BUF_GET_SRC_ADDR(rxPacket->phyData); /* who should receive the ack? */ + RNWK_BUF_SET_SRC_ADDR(ackPacket.phyData, saddr); /* set source address */ + RNWK_BUF_SET_DST_ADDR(ackPacket.phyData, addr); /* destination address is from where we got the data */ + return RMAC_SendACK(rxPacket, &ackPacket); +} + +uint8_t RNWK_OnPacketRx(RPHY_PacketDesc *packet) { + RNWK_ShortAddrType addr; + RMAC_MsgType type; + + addr = RNWK_BUF_GET_DST_ADDR(packet->phyData); + if (addr==RNWK_ADDR_BROADCAST || addr==RNWK_GetThisNodeAddr()) { /* it is for me :-) */ + type = RMAC_GetType(packet->phyData, packet->phySize); /* get the type of the message */ + if (RMAC_MSG_TYPE_IS_ACK(type) && RMAC_IsExpectedACK(packet->phyData, packet->phySize)) { + /* it is an ACK, and the sequence number matches. Mark it with a flag and return, as no need for further processing */ + packet->flags |= RPHY_PACKET_FLAGS_IS_ACK; + return ERR_OK; /* no need to process the packet further */ + } else if (RMAC_MSG_TYPE_IS_DATA(type)) { /* data packet received */ + if (RNWK_AppOnRxCallback!=NULL) { /* do we have a callback? */ + if (RMAC_MSG_TYPE_REQ_ACK(type)) { /* ACK requested */ + (void)RNWK_SendACK(packet, RNWK_GetThisNodeAddr()); /* send ack message back */ + } + return RNWK_AppOnRxCallback(packet); /* call upper layer */ + } + } else { + return ERR_FAULT; /* wrong message type? */ + } + } + return ERR_FAILED; +} + +void RNWK_SniffPacket(RPHY_PacketDesc *packet, bool isTx) { + RAPP_SniffPacket(packet, isTx); +} + +static uint8_t PrintHelp(const McuShell_StdIOType *io) { + McuShell_SendHelpStr((unsigned char*)"rnwk", (unsigned char*)"Group of rnwk commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Shows help or status\r\n", io->stdOut); + return ERR_OK; +} + +static uint8_t PrintStatus(const McuShell_StdIOType *io) { + uint8_t buf[32]; + + McuShell_SendStatusStr((unsigned char*)"rnwk", (unsigned char*)"\r\n", io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); +#if RNWK_SHORT_ADDR_SIZE==1 + McuUtility_strcatNum8Hex(buf, sizeof(buf), RNWK_GetThisNodeAddr()); +#else + McuUtility_strcatNum16Hex(buf, sizeof(buf), RNWK_GetThisNodeAddr()); +#endif + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" addr", buf, io->stdOut); + + return ERR_OK; +} + +uint8_t RNWK_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) { + if (McuUtility_strcmp((char*)cmd, (char*)McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, (char*)"rnwk help")==0) { + *handled = TRUE; + return PrintHelp(io); + } else if (McuUtility_strcmp((char*)cmd, (char*)McuShell_CMD_STATUS)==0 || McuUtility_strcmp((char*)cmd, (char*)"rnwk status")==0) { + *handled = TRUE; + return PrintStatus(io); + } + return ERR_OK; +} + +void RNWK_Deinit(void) { + /* nothing needed */ +} + +void RNWK_Init(void) { + RNWK_ThisNodeAddr = RNWK_ADDR_BROADCAST; + RNWK_AppOnRxCallback = NULL; +} + +#endif /* McuRNET_CONFIG_IS_ENABLED */ diff --git a/TSM_PicoW_Sensor/McuLib/RNet/RNWK.h b/TSM_PicoW_Sensor/McuLib/RNet/RNWK.h new file mode 100644 index 0000000..d560860 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/RNet/RNWK.h @@ -0,0 +1,121 @@ +/** + * \file + * \brief Radio Network NWK Layer + * \author (c) 2013-2014 Erich Styger, http://mcuoneclipse.com/ + * \note MIT License (http://opensource.org/licenses/mit-license.html), see 'RNet_License.txt' + * + * This module implements interface for the NWK (Network) of the radio network stack. + */ + +#ifndef RNWK_H_ +#define RNWK_H_ + +#include "McuRNetConfig.h" +#if McuRNET_CONFIG_IS_ENABLED +#include "RMAC.h" +#include "RPHY.h" + +/* payload format is: + * PHY: + * MAC: + * NWK: + * APP: + */ +#define RNWK_SHORT_ADDR_SIZE RNET_CONFIG_SHORT_ADDR_SIZE /* size of short address type */ +#if RNWK_SHORT_ADDR_SIZE==1 + typedef uint8_t RNWK_ShortAddrType; /* short address type */ +#elif RNWK_SHORT_ADDR_SIZE==2 + typedef uint16_t RNWK_ShortAddrType; /* short address type */ +#else + #error "ERROR: unsupported address size" +#endif + +#define RNWK_HEADER_SIZE (2*RNWK_SHORT_ADDR_SIZE) /* */ +#define RNWK_PAYLOAD_SIZE (RMAC_PAYLOAD_SIZE-RNWK_HEADER_SIZE) +#define RNWK_BUFFER_SIZE (RMAC_BUFFER_SIZE) + +/* PHY buffer access macros */ +#define RNWK_BUF_IDX_SRC_ADDR (RMAC_BUF_IDX_PAYLOAD+0) /* index */ +#define RNWK_BUF_IDX_DST_ADDR (RMAC_BUF_IDX_PAYLOAD +RNWK_SHORT_ADDR_SIZE) /* index */ +#define RNWK_BUF_IDX_PAYLOAD (RNWK_BUF_IDX_DST_ADDR+RNWK_SHORT_ADDR_SIZE) /* index */ + +#if RNWK_SHORT_ADDR_SIZE==1 + #define RNWK_BUF_SET_SRC_ADDR(phy, addr) ((phy)[RNWK_BUF_IDX_SRC_ADDR])=(addr); + #define RNWK_BUF_SET_DST_ADDR(phy, addr) ((phy)[RNWK_BUF_IDX_DST_ADDR])=(addr); + #define RNWK_ADDR_BROADCAST 0xFF +#elif RNWK_SHORT_ADDR_SIZE==2 + #define RNWK_BUF_SET_SRC_ADDR(phy, addr) {((phy)[RNWK_BUF_IDX_SRC_ADDR])=(uint8_t)((addr)&0xFF); ((phy)[RNWK_BUF_IDX_SRC_ADDR+1])=(uint8_t)((addr>>8)&0xFF);} + #define RNWK_BUF_SET_DST_ADDR(phy, addr) {((phy)[RNWK_BUF_IDX_DST_ADDR])=(uint8_t)((addr)&0xFF); ((phy)[RNWK_BUF_IDX_DST_ADDR+1])=(uint8_t)((addr>>8)&0xFF);} + #define RNWK_ADDR_BROADCAST 0xFFFF +#else + #error "NYI" +#endif + +#if RNWK_SHORT_ADDR_SIZE==1 + #define RNWK_BUF_GET_SRC_ADDR(phy) ((phy)[RNWK_BUF_IDX_SRC_ADDR]) + #define RNWK_BUF_GET_DST_ADDR(phy) ((phy)[RNWK_BUF_IDX_DST_ADDR]) +#elif RNWK_SHORT_ADDR_SIZE==2 + #define RNWK_BUF_GET_SRC_ADDR(phy) (((phy)[RNWK_BUF_IDX_SRC_ADDR+1])<<8)|((phy)[RNWK_BUF_IDX_SRC_ADDR]) + #define RNWK_BUF_GET_DST_ADDR(phy) (((phy)[RNWK_BUF_IDX_DST_ADDR+1])<<8)|((phy)[RNWK_BUF_IDX_DST_ADDR]) +#else + #error "NYI" +#endif + +#define RNWK_BUF_PAYLOAD_START(phy) (RMAC_BUF_PAYLOAD_START(phy)+RNWK_HEADER_SIZE) + +typedef uint8_t (*RNWK_AppOnRxCallbackType)(RPHY_PacketDesc *packet); + +uint8_t RNWK_SetAppOnPacketRxCallback(RNWK_AppOnRxCallbackType callback); + +uint8_t RNWK_OnPacketRx(RPHY_PacketDesc *packet); + +/*! + * \brief Sents an ACK packet for a packet received. + * \param rxPacket Packet which has been received and for which an ACK should be sent. + * \param saddr Address to where to send the ACK back. + * \return Error code, ERR_OK for no error. + */ +uint8_t RNWK_SendACK(RPHY_PacketDesc *rxPacket, RNWK_ShortAddrType saddr); + +/*! + * \brief Puts a payload into the buffer queue to be sent asynchronously. + * \param buf Message buffer with payload. + * \param bufSize Size of message buffer, must be of RNWK_BUFFER_SIZE. + * \param payloadSize Size of the payload in bytes. + * \param dstAddr Destination node address. + * \param flags Packet flags. + */ +uint8_t RNWK_PutPayload(uint8_t *buf, size_t bufSize, uint8_t payloadSize, RNWK_ShortAddrType dstAddr, RPHY_FlagsType flags); + +#include "McuShell.h" +uint8_t RNWK_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); + +/*! + * \brief Returns the node network address. + * \return Node short address. + */ +RNWK_ShortAddrType RNWK_GetThisNodeAddr(void); + +/*! + * \brief Sets this node own address + * \param addr New address to use + */ +uint8_t RNWK_SetThisNodeAddr(RNWK_ShortAddrType addr); + +/*! + * \brief Sniffs and dumps a packet. + * \param packet Data packet. + * \param isTx If either Tx or Rx packet. + */ +void RNWK_SniffPacket(RPHY_PacketDesc *packet, bool isTx); + +/*! \brief Initializes the module */ +void RNWK_Init(void); + +/*! \brief Deinitializes the module */ +void RNWK_Deinit(void); + +#endif /* McuRNET_CONFIG_IS_ENABLED */ + +#endif /* RNWK_H_ */ + diff --git a/TSM_PicoW_Sensor/McuLib/RNet/RPHY.c b/TSM_PicoW_Sensor/McuLib/RNet/RPHY.c new file mode 100644 index 0000000..b147af4 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/RNet/RPHY.c @@ -0,0 +1,49 @@ +/** + * \file + * \brief This implements the PHY layer of the network stack. + * \author (c) 2013-2014 Erich Styger, http://mcuoneclipse.com/ + * \note MIT License (http://opensource.org/licenses/mit-license.html), see 'RNet_License.txt' + * + * This module is used to process the raw payload packets. + */ + +#include "McuRNetConfig.h" +#if McuRNET_CONFIG_IS_ENABLED +#include "RPHY.h" +#include "RMAC.h" +#include "RMSG.h" + +uint8_t RPHY_FlushRxQueue(void) { + return RMSG_FlushRxQueue(); +} + +uint8_t RPHY_FlushTxQueue(void) { + return RMSG_FlushTxQueue(); +} + +uint8_t RPHY_GetPayload(RPHY_PacketDesc *packet) { + packet->flags = RPHY_PACKET_FLAGS_NONE; + return RMSG_GetRxMsg(packet->phyData, packet->phySize); /* ERR_OK, ERR_OVERFLOW or ERR_RXEMPTY */ +} + +uint8_t RPHY_OnPacketRx(RPHY_PacketDesc *packet) { + return RMAC_OnPacketRx(packet); /* pass message up the stack */ +} + +uint8_t RPHY_PutPayload(uint8_t *buf, size_t bufSize, uint8_t payloadSize, RPHY_FlagsType flags) { + return RMSG_QueueTxMsg(buf, bufSize, payloadSize, flags); +} + +void RPHY_SniffPacket(RPHY_PacketDesc *packet, bool isTx) { + RMAC_SniffPacket(packet, isTx); +} + +void RPHY_Deinit(void) { + /* nothing needed */ +} + +void RPHY_Init(void) { + /* nothing needed */ +} + +#endif /* McuRNET_CONFIG_IS_ENABLED */ diff --git a/TSM_PicoW_Sensor/McuLib/RNet/RPHY.h b/TSM_PicoW_Sensor/McuLib/RNet/RPHY.h new file mode 100644 index 0000000..a3ef7ef --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/RNet/RPHY.h @@ -0,0 +1,107 @@ +/** + * \file + * \brief Radio PHY (Physical Interface) + * \author (c) 2013-2014 Erich Styger, http://mcuoneclipse.com/ + * \note MIT License (http://opensource.org/licenses/mit-license.html), see 'RNet_License.txt' + * + * This interface is for the PHY (Physical) part of the stack. + */ + +#ifndef RPHY_H_ +#define RPHY_H_ + +#include "McuRNetConfig.h" +#if McuRNET_CONFIG_IS_ENABLED + +/* payload format is: + * PHY: + * MAC: + * NWK: + * APP: + */ +#define RPHY_HEADER_SIZE (2) /* */ +#define RPHY_PAYLOAD_SIZE (RNET_CONFIG_TRANSCEIVER_PAYLOAD_SIZE) /* total number of payload bytes */ +#define RPHY_BUFFER_SIZE (RPHY_HEADER_SIZE+RPHY_PAYLOAD_SIZE) /* */ + +/* PHY buffer access macros */ +#define RPHY_BUF_IDX_FLAGS (0) /* index */ +#define RPHY_BUF_IDX_SIZE (1) /* index */ +#define RPHY_BUF_IDX_PAYLOAD (2) /* index */ +/* access macros */ +#define RPHY_BUF_FLAGS(phy) ((phy)[RPHY_BUF_IDX_FLAGS]) +#define RPHY_BUF_SIZE(phy) ((phy)[RPHY_BUF_IDX_SIZE]) +#define RPHY_BUF_PAYLOAD_START(phy) ((phy)+RPHY_HEADER_SIZE) + +typedef uint8_t RPHY_FlagsType; +/* flag bits inside PacketDesc below */ +#define RPHY_PACKET_FLAGS_NONE (0) + /*!< initialization value */ +#define RPHY_PACKET_FLAGS_IS_ACK (1<<0) + /*!< valid ACK received */ +#define RPHY_PACKET_FLAGS_REQ_ACK (1<<1) + /*!< request acknowledge RNet acknowledge */ +#define RPHY_PACKET_FLAGS_POWER_DOWN (1<<2) + /*!< power down transceiver */ +#define RPHY_PACKET_FLAGS_NO_ACK (1<<3) + /*!< send package without low-level/shockburst acknowledge */ + +typedef struct { + RPHY_FlagsType flags;/*!< flags, see RPHY_PACKET_FLAGS_XXXX above */ + uint8_t phySize; /*!< size of PHY data buffer */ + uint8_t *phyData; /*!< pointer to the PHY data buffer */ + uint8_t *rxtx; /*!< pointer into phyData, start of TX/RX data */ +} RPHY_PacketDesc; + +/*! + * \brief Flushes the Rx queue. + * \return Error code, ERR_OK for everything fine. + */ +uint8_t RPHY_FlushRxQueue(void); + +/*! + * \brief Flushes the Tx queue. + * \return Error code, ERR_OK for everything fine. + */ +uint8_t RPHY_FlushTxQueue(void); + +/*! + * \brief Function called on Rx of a packet. + * \param packet Pointer to packet + * \return ERR_OK, if everything is fine, error code otherwise. + */ +uint8_t RPHY_OnPacketRx(RPHY_PacketDesc *packet); + +/*! + * \brief Returns the PHY payload data. + * \param[out] packet Pointer to packet descriptor. + * \return Error code, ERR_OK if everything is ok, ERR_OVERFLOW if buffer is too small, ERR_. + */ +uint8_t RPHY_GetPayload(RPHY_PacketDesc *packet); + +/*! + * \brief Puts a packet into the queue to be sent. + * \param buf Pointer to the packet buffer. + * \param bufSize Size of the payload buffer. + * \param payloadSize Size of payload data. + * \param flags Packet flags. + * \return Error code, ERR_OK for everything fine. + */ +uint8_t RPHY_PutPayload(uint8_t *buf, size_t bufSize, uint8_t payloadSize, RPHY_FlagsType flags); + +/*! + * \brief Sniffs and dumps a packet. + * \param packet Data packet. + * \param isTx If either Tx or Rx packet. + */ +void RPHY_SniffPacket(RPHY_PacketDesc *packet, bool isTx); + +/*! \brief Initializes the module */ +void RPHY_Init(void); + +/*! \brief Deinitializes the module */ +void RPHY_Deinit(void); + +#endif /* McuRNET_CONFIG_IS_ENABLED */ + +#endif /* RPHY_H_ */ + diff --git a/TSM_PicoW_Sensor/McuLib/RNet/RStack.c b/TSM_PicoW_Sensor/McuLib/RNet/RStack.c new file mode 100644 index 0000000..8b648e2 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/RNet/RStack.c @@ -0,0 +1,45 @@ +/** + * \file + * \brief This main init module for the stack. + * \author (c) 2013-2014 Erich Styger, http://mcuoneclipse.com/ + * \note MIT License (http://opensource.org/licenses/mit-license.html), see 'RNet_License.txt' + * + * This module is used to simplify stack initialization. + */ + +#include "McuRNetConfig.h" +#if McuRNET_CONFIG_IS_ENABLED +#include "RStack.h" +#include "Radio.h" +#include "RMSG.h" +#include "RPHY.h" +#include "RMAC.h" +#include "RNWK.h" +#include "RStdIO.h" +#include "RApp.h" + +void RSTACK_Init(void) { + /*lint -save -e522 function lacks side-effects */ + RADIO_Init(); + RMSG_Init(); + RPHY_Init(); + RMAC_Init(); + RNWK_Init(); + RSTDIO_Init(); + RAPP_Init(); + /*lint -restore */ +} + +void RSTACK_Deinit(void) { + /*lint -save -e522 function lacks side-effects */ + RAPP_Deinit(); + RSTDIO_Deinit(); + RNWK_Deinit(); + RMAC_Deinit(); + RPHY_Deinit(); + RMSG_Deinit(); + RADIO_Deinit(); + /*lint -restore */ +} + +#endif /* McuRNET_CONFIG_IS_ENABLED */ diff --git a/TSM_PicoW_Sensor/McuLib/RNet/RStack.h b/TSM_PicoW_Sensor/McuLib/RNet/RStack.h new file mode 100644 index 0000000..c740f1e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/RNet/RStack.h @@ -0,0 +1,20 @@ +/** + * \file + * \brief Radio Network Stack Main file + * \author (c) 2013-2014 Erich Styger, http://mcuoneclipse.com/ + * \note MIT License (http://opensource.org/licenses/mit-license.html), see 'RNet_License.txt' + * + * This interface is the common entry point for the stack. + */ + +#ifndef RSTACK_H_ +#define RSTACK_H_ + +/*! \brief Stack initialization function */ +void RSTACK_Init(void); + +/*! \brief Stack de-initialization function */ +void RSTACK_Deinit(void); + +#endif /* RSTACK_H_ */ + diff --git a/TSM_PicoW_Sensor/McuLib/RNet/RStdIO.c b/TSM_PicoW_Sensor/McuLib/RNet/RStdIO.c new file mode 100644 index 0000000..56a7c8f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/RNet/RStdIO.c @@ -0,0 +1,511 @@ +/** + * \file + * \brief Radio/remote Standard I/O module. + * \author (c) 2013-2014 Erich Styger, http://mcuoneclipse.com/ + * \note MIT License (http://opensource.org/licenses/mit-license.html), see 'RNet_License.txt' + * + * This module uses queues for remote/radio standard I/O handling. + */ + +#include "McuRNetConfig.h" +#if McuRNET_CONFIG_IS_ENABLED +#include "RStdIO.h" +#include "McuRTOS.h" +#include "McuUtility.h" +#include "McuShell.h" +#include "Radio.h" +#include "RMSG.h" +#include "RNWK.h" +#include "RApp.h" + +/* three shell queues, one for each channel. + * E.g. the command "radio send stdin help" will place "help" into the RSTDIO_RxStdIn queue, which then will be processed by the shell. + * */ +static QueueHandle_t RSTDIO_RxStdInQ, RSTDIO_RxStdOutQ, RSTDIO_RxStdErrQ; +static QueueHandle_t RSTDIO_TxStdInQ, RSTDIO_TxStdOutQ, RSTDIO_TxStdErrQ; + +#define RSTDIO_PAYLOAD_SIZE (RNWK_PAYLOAD_SIZE-1/*type*/-1/*size*/) /* data size we can transmit in one message. stdout string will be added */ + +#define RSTDIO_QUEUE_LENGTH RSTDIO_CONFIG_QUEUE_LENGTH /* items in queue, that's my buffer size */ +#define RSTDIO_QUEUE_ITEM_SIZE 1 /* each item is a single character */ + +#define RSTDIO_QUEUE_TIMEOUT_MS 500 /* timeout for stdio queues */ + +static RNWK_ShortAddrType RSTDIO_dstAddr; /* destination address */ + +uint8_t RSTDIO_DefaultShellBuffer[McuShell_DEFAULT_SHELL_BUFFER_SIZE]; /* default buffer which can be used by the application */ + +void RSTDIO_SetDestinationAddress(RNWK_ShortAddrType addr) { + RSTDIO_dstAddr = addr; +} + +/*! + * \brief Returns a queue handle for a Remote Standard I/O type + * \param queueType Type of queue + * \return Queue handle + */ +QueueHandle_t RSTDIO_GetQueueForType(RSTDIO_QueueType queueType) { + switch(queueType) { + case RSTDIO_QUEUE_RX_IN: return RSTDIO_RxStdInQ; + case RSTDIO_QUEUE_RX_OUT: return RSTDIO_RxStdOutQ; + case RSTDIO_QUEUE_RX_ERR: return RSTDIO_RxStdErrQ; + case RSTDIO_QUEUE_TX_IN: return RSTDIO_TxStdInQ; + case RSTDIO_QUEUE_TX_OUT: return RSTDIO_TxStdOutQ; + case RSTDIO_QUEUE_TX_ERR: return RSTDIO_TxStdErrQ; + default: break; + } + return NULL; +} + +/*! + * \brief Adds binary data to the queue. + * \param queue Queue to be used + * \param data Pointer to the binary data + * \param dataSize Size of data in bytes + */ +static uint8_t AddToQueue(QueueHandle_t queue, const unsigned char *data, size_t dataSize) { + while(dataSize!=0) { + if (McuRTOS_xQueueSendToBack(queue, data, pdMS_TO_TICKS(RSTDIO_QUEUE_TIMEOUT_MS))!=pdPASS) { + return ERR_FAULT; + } + data++; + dataSize--; + } + return ERR_OK; +} + +uint8_t RSTDIO_AddToQueue(RSTDIO_QueueType queueType, const unsigned char *data, size_t dataSize) { + switch(queueType) { + case RSTDIO_QUEUE_RX_IN: return AddToQueue(RSTDIO_RxStdInQ, data, dataSize); + case RSTDIO_QUEUE_RX_OUT: return AddToQueue(RSTDIO_RxStdOutQ, data, dataSize); + case RSTDIO_QUEUE_RX_ERR: return AddToQueue(RSTDIO_RxStdErrQ, data, dataSize); + case RSTDIO_QUEUE_TX_IN: return AddToQueue(RSTDIO_TxStdInQ, data, dataSize); + case RSTDIO_QUEUE_TX_OUT: return AddToQueue(RSTDIO_TxStdOutQ, data, dataSize); + case RSTDIO_QUEUE_TX_ERR: return AddToQueue(RSTDIO_TxStdErrQ, data, dataSize); + default: break; + } + return ERR_FAILED; +} + +/*! + * \brief Peeks a character from the queue without removing it. + * \param queue Queue to be used + * \return '\0' if the queue is empty, otherwise it contains the character. + */ +static unsigned short RSTDIO_NofElements(QueueHandle_t queue) { + return (unsigned short)McuRTOS_uxQueueMessagesWaiting(queue); +} + +/*! + * \brief Returns the number of elements in the queue + * \param queueType Queue type + * \return Number of elements in the queue, 0 if the queue is not known. + */ +uint8_t RSTDIO_NofInQueue(RSTDIO_QueueType queueType) { + switch(queueType) { + case RSTDIO_QUEUE_RX_IN: return RSTDIO_NofElements(RSTDIO_RxStdInQ); + case RSTDIO_QUEUE_RX_OUT: return RSTDIO_NofElements(RSTDIO_RxStdOutQ); + case RSTDIO_QUEUE_RX_ERR: return RSTDIO_NofElements(RSTDIO_RxStdErrQ); + case RSTDIO_QUEUE_TX_IN: return RSTDIO_NofElements(RSTDIO_TxStdInQ); + case RSTDIO_QUEUE_TX_OUT: return RSTDIO_NofElements(RSTDIO_TxStdOutQ); + case RSTDIO_QUEUE_TX_ERR: return RSTDIO_NofElements(RSTDIO_TxStdErrQ); + default: break; + } + return 0; +} + +/*! + * \brief Receives an a message character from the queue, and returns immediately if the queue is empty. + * \return Message character, or '\0' if there was no message. + */ +static unsigned char RSTDIO_ReceiveChar(QueueHandle_t queue) { + unsigned char ch; + portBASE_TYPE res; + + res = McuRTOS_xQueueReceive(queue, &ch, 0); + if (res==errQUEUE_EMPTY) { + return '\0'; + } else { + return ch; + } +} + +/*! + * \brief Returns a character from a queue + * \param queueType Queue type + * \return Character, or zero byte if queue is empty or unknown + */ +uint8_t RSTDIO_ReceiveQueueChar(RSTDIO_QueueType queueType) { + switch(queueType) { + case RSTDIO_QUEUE_RX_IN: return RSTDIO_ReceiveChar(RSTDIO_RxStdInQ); + case RSTDIO_QUEUE_RX_OUT: return RSTDIO_ReceiveChar(RSTDIO_RxStdOutQ); + case RSTDIO_QUEUE_RX_ERR: return RSTDIO_ReceiveChar(RSTDIO_RxStdErrQ); + case RSTDIO_QUEUE_TX_IN: return RSTDIO_ReceiveChar(RSTDIO_TxStdInQ); + case RSTDIO_QUEUE_TX_OUT: return RSTDIO_ReceiveChar(RSTDIO_TxStdOutQ); + case RSTDIO_QUEUE_TX_ERR: return RSTDIO_ReceiveChar(RSTDIO_TxStdErrQ); + default: break; + } + return '\0'; +} + +uint8_t RSTDIO_HandleStdioRxMessage(RAPP_MSG_Type type, uint8_t size, uint8_t *data, RNWK_ShortAddrType srcAddr, bool *handled, RPHY_PacketDesc *packet) { + (void)srcAddr; + (void)packet; + switch(type) { + case RAPP_MSG_TYPE_STDIN: /* */ + *handled = TRUE; + return RSTDIO_AddToQueue(RSTDIO_QUEUE_RX_IN, data, size); + case RAPP_MSG_TYPE_STDOUT: /* */ + *handled = TRUE; + return RSTDIO_AddToQueue(RSTDIO_QUEUE_RX_OUT, data, size); + case RAPP_MSG_TYPE_STDERR: /* */ + *handled = TRUE; + return RSTDIO_AddToQueue(RSTDIO_QUEUE_RX_ERR, data, size); + default: + break; + } /* switch */ + return ERR_OK; +} + +/*! + * \brief Flushes the given buffer/queue. The buffer will be sent over the radio. + * \return Error code, ERR_OK for no error. + */ +static uint8_t FlushAndTxQueue(RSTDIO_QueueType queueType, RAPP_MSG_Type msgType) { + unsigned char buf[RAPP_BUFFER_SIZE]; + uint8_t i; + uint8_t res = ERR_OK; + uint8_t *p, ch; + + p = RAPP_BUF_PAYLOAD_START(buf); + i = 0; + while (istdErr('*'); + io->stdErr('F'); + io->stdErr('A'); + io->stdErr('I'); + io->stdErr('L'); + io->stdErr('*'); + io->stdErr('\n'); + return res; + } + return res; +} + +/*! + * \brief Radio StdIn: sends a character to the wireless communication channel. + * \param ch Character to send + */ +static void RSTDIO_TxStdInSendChar(uint8_t ch) { + (void)RSTDIO_AddToQueue(RSTDIO_QUEUE_TX_IN, &ch, 1); + if (ch=='\n' || RSTDIO_NofInQueue(RSTDIO_QUEUE_TX_IN)>RSTDIO_PAYLOAD_SIZE) { /* can send string over radio */ + (void)FlushAndTxQueue(RSTDIO_QUEUE_TX_IN, RAPP_MSG_TYPE_STDIN); + } +} + +/*! + * \brief Radio StdOut: sends a character to the wireless communication channel. + * \param ch Character to send + */ +static void RSTDIO_TxStdOut(uint8_t ch) { + (void)RSTDIO_AddToQueue(RSTDIO_QUEUE_TX_OUT, &ch, 1); + if (ch=='\n' || RSTDIO_NofInQueue(RSTDIO_QUEUE_TX_OUT)>RSTDIO_PAYLOAD_SIZE) { /* can send string over radio */ + (void)FlushAndTxQueue(RSTDIO_QUEUE_TX_OUT, RAPP_MSG_TYPE_STDOUT); + } +} + +/*! + * \brief Radio StdErr: sends a character to the wireless communication channel. + * \param ch Character to send + */ +static void RSTDIO_TxStdErr(uint8_t ch) { + (void)RSTDIO_AddToQueue(RSTDIO_QUEUE_TX_ERR, &ch, sizeof(ch)); + if (ch=='\n' || RSTDIO_NofInQueue(RSTDIO_QUEUE_TX_ERR)>RSTDIO_PAYLOAD_SIZE) { /* can send string over radio */ + (void)FlushAndTxQueue(RSTDIO_QUEUE_TX_ERR, RAPP_MSG_TYPE_STDERR); + } +} + +uint8_t RSTDIO_SendToTxStdio(RSTDIO_QueueType queueType, uint8_t *buf, size_t bufSize) { + if (queueType==RSTDIO_QUEUE_TX_IN) { + while(bufSize!=0) { + RSTDIO_TxStdInSendChar(*buf); + buf++; bufSize--; + } + } else if (queueType==RSTDIO_QUEUE_TX_OUT) { + while(bufSize!=0) { + RSTDIO_TxStdOut(*buf); + buf++; bufSize--; + } + } else if (queueType==RSTDIO_QUEUE_TX_ERR) { + while(bufSize!=0) { + RSTDIO_TxStdErr(*buf); + buf++; bufSize--; + } + } else { + return ERR_FAILED; /* unknown queue? */ + } + return ERR_OK; +} + +/*! + * \brief Radio StdIn: Reads a character from the StdIn queue and echoes it on the standard shell stdOut + */ +static void RSTDIO_RxStdInReadChar(uint8_t *ch) { + *ch = RSTDIO_ReceiveQueueChar(RSTDIO_QUEUE_RX_IN); /* will return '\0' if queue is empty */ +} + +/*! + * \brief Checks if we have a character in the stdin queue without removing it. + * \return TRUE if character is present. + */ +static bool RSTDIO_RxStdInKeyPressed(void) { + return (bool)(RSTDIO_NofElements(RSTDIO_RxStdInQ)!=0); +} + +McuShell_ConstStdIOType RSTDIO_stdio = { + .stdIn = (McuShell_StdIO_In_FctType)RSTDIO_RxStdInReadChar, /* stdin */ + .stdOut = (McuShell_StdIO_OutErr_FctType)RSTDIO_TxStdOut, /* stdout */ + .stdErr = (McuShell_StdIO_OutErr_FctType)RSTDIO_TxStdErr, /* stderr */ + .keyPressed = RSTDIO_RxStdInKeyPressed, /* if input is not empty */ +#if McuShell_CONFIG_ECHO_ENABLED + .echoEnabled = false, +#endif +}; + +McuShell_ConstStdIOTypePtr RSTDIO_GetStdio(void) { + return &RSTDIO_stdio; +} + +/*! + * \brief Called from the application task. This function checks the Radio RX queue and checks if it contains stdio messages. + * If so, it dispatches it to the corresponding shell queues. + */ +void RSTDIO_Print(McuShell_ConstStdIOTypePtr io) { + unsigned char ch; + + for(;;) { /* breaks */ + ch = RSTDIO_ReceiveChar(RSTDIO_RxStdOutQ); + if(ch=='\0') { + break; /* get out of for loop */ + } + io->stdOut(ch); /* output character */ + } + for(;;) { /* breaks */ + ch = RSTDIO_ReceiveChar(RSTDIO_RxStdErrQ); + if(ch=='\0') { + break; /* get out of for loop */ + } + io->stdErr(ch); /* output character */ + } +} + +unsigned int RSTDIO_AddIntoBuffer(unsigned char *buffer, size_t bufSize) { + unsigned char ch; + unsigned int nofChars = 0; + + for(;;) { /* breaks */ + ch = RSTDIO_ReceiveChar(RSTDIO_RxStdOutQ); + if(ch=='\0') { + break; /* get out of for loop */ + } + McuUtility_chcat(buffer, bufSize, ch); + nofChars++; + } + for(;;) { /* breaks */ + ch = RSTDIO_ReceiveChar(RSTDIO_RxStdErrQ); + if(ch=='\0') { + break; /* get out of for loop */ + } + McuUtility_chcat(buffer, bufSize, ch); + nofChars++; + } + return nofChars; +} + +static void PrintHelp(const McuShell_StdIOType *io) { + McuShell_SendHelpStr((unsigned char*)"rstdio", (unsigned char*)"Group of rstdio commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Shows help or status\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" daddr 0x", (unsigned char*)"Set destination node address\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" send (in/out/err)", (unsigned char*)"Send a string to remote stdio\r\n", io->stdOut); +} + +static uint8_t PrintStatus(const McuShell_StdIOType *io) { + uint8_t buf[32]; + + McuShell_SendStatusStr((unsigned char*)"rstdio", (unsigned char*)"\r\n", io->stdOut); + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); +#if RNWK_SHORT_ADDR_SIZE==1 + McuUtility_strcatNum8Hex(buf, sizeof(buf), RSTDIO_dstAddr); +#else + McuUtility_strcatNum16Hex(buf, sizeof(buf), RSTDIO_dstAddr); +#endif + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" dest addr", buf, io->stdOut); + + McuUtility_Num8uToStr(buf, sizeof(buf), RSTDIO_QUEUE_LENGTH); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" queue size", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"in: "); + McuUtility_strcatNum8u(buf, sizeof(buf), RSTDIO_NofInQueue(RSTDIO_QUEUE_RX_IN)); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)", out: "); + McuUtility_strcatNum8u(buf, sizeof(buf), RSTDIO_NofInQueue(RSTDIO_QUEUE_RX_OUT)); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)", err: "); + McuUtility_strcatNum8u(buf, sizeof(buf), RSTDIO_NofInQueue(RSTDIO_QUEUE_RX_ERR)); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" Rx queue", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"in: "); + McuUtility_strcatNum8u(buf, sizeof(buf), RSTDIO_NofInQueue(RSTDIO_QUEUE_TX_IN)); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)", out: "); + McuUtility_strcatNum8u(buf, sizeof(buf), RSTDIO_NofInQueue(RSTDIO_QUEUE_TX_OUT)); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)", err: "); + McuUtility_strcatNum8u(buf, sizeof(buf), RSTDIO_NofInQueue(RSTDIO_QUEUE_TX_ERR)); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" Tx queue", buf, io->stdOut); + return ERR_OK; +} + +uint8_t RSTDIO_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) { + uint8_t res = ERR_OK; + const uint8_t *p; + uint16_t val16; + + if (McuUtility_strcmp((char*)cmd, (char*)McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, (char*)"rstdio help")==0) { + PrintHelp(io); + *handled = TRUE; + } else if (McuUtility_strcmp((char*)cmd, (char*)McuShell_CMD_STATUS)==0 || McuUtility_strcmp((char*)cmd, (char*)"rstdio status")==0) { + *handled = TRUE; + return PrintStatus(io); + } else if (McuUtility_strncmp((char*)cmd, (char*)"rstdio send", sizeof("rstdio send")-1)==0) { + unsigned char buf[McuShell_DEFAULT_SHELL_BUFFER_SIZE]; + RSTDIO_QueueType queue; + + if (McuUtility_strncmp((char*)cmd, (char*)"rstdio send in", sizeof("rstdio send in")-1)==0) { + queue = RSTDIO_QUEUE_TX_IN; + cmd += sizeof("rstdio send in"); + } else if (McuUtility_strncmp((char*)cmd, (char*)"rstdio send out", sizeof("rstdio send out")-1)==0) { + queue = RSTDIO_QUEUE_TX_OUT; + cmd += sizeof("rstdio send out"); + } else if (McuUtility_strncmp((char*)cmd, (char*)"rstdio send err", sizeof("rstdio send err")-1)==0) { + queue = RSTDIO_QUEUE_TX_ERR; + cmd += sizeof("rstdio send err"); + } else { + return ERR_OK; /* not handled */ + } + McuUtility_strcpy(buf, sizeof(buf), cmd); + McuUtility_chcat(buf, sizeof(buf), '\n'); + buf[sizeof(buf)-2] = '\n'; /* have a '\n' in any case */ + if (RSTDIO_SendToTxStdio(queue, buf, McuUtility_strlen((char*)buf))!=ERR_OK) { + McuShell_SendStr((unsigned char*)"failed!\r\n", io->stdErr); + } + *handled = TRUE; + } else if (McuUtility_strncmp((char*)cmd, (char*)"rstdio daddr", sizeof("rstdio daddr")-1)==0) { + p = cmd + sizeof("rstdio daddr")-1; + *handled = TRUE; + if (McuUtility_ScanHex16uNumber(&p, &val16)==ERR_OK) { + RSTDIO_dstAddr = val16; + } else { + McuShell_SendStr((unsigned char*)"ERR: wrong address\r\n", io->stdErr); + return ERR_FAILED; + } + } + return res; +} + +/*! \brief Deinitializes the queue module */ +void RSTDIO_Deinit(void) { + McuRTOS_vQueueUnregisterQueue(RSTDIO_RxStdInQ); + McuRTOS_vQueueDelete(RSTDIO_RxStdInQ); + RSTDIO_RxStdInQ = NULL; + + McuRTOS_vQueueUnregisterQueue(RSTDIO_RxStdOutQ); + McuRTOS_vQueueDelete(RSTDIO_RxStdOutQ); + RSTDIO_RxStdOutQ = NULL; + + McuRTOS_vQueueUnregisterQueue(RSTDIO_RxStdErrQ); + McuRTOS_vQueueDelete(RSTDIO_RxStdErrQ); + RSTDIO_RxStdErrQ = NULL; + + McuRTOS_vQueueUnregisterQueue(RSTDIO_TxStdInQ); + McuRTOS_vQueueDelete(RSTDIO_TxStdInQ); + RSTDIO_TxStdInQ = NULL; + + McuRTOS_vQueueUnregisterQueue(RSTDIO_TxStdOutQ); + McuRTOS_vQueueDelete(RSTDIO_TxStdOutQ); + RSTDIO_TxStdOutQ = NULL; + + McuRTOS_vQueueUnregisterQueue(RSTDIO_TxStdErrQ); + McuRTOS_vQueueDelete(RSTDIO_TxStdErrQ); + RSTDIO_TxStdErrQ = NULL; +} + +void RSTDIO_Init(void) { + RSTDIO_SetDestinationAddress(RSTDIO_CONFIG_SETTING_RSTDIO_DEFAULT_DESTINATION_ADDRESS); + RSTDIO_RxStdInQ = McuRTOS_xQueueCreate(RSTDIO_QUEUE_LENGTH, RSTDIO_QUEUE_ITEM_SIZE); + if (RSTDIO_RxStdInQ==NULL) { + for(;;){} /* out of memory? */ + } + McuRTOS_vQueueAddToRegistry(RSTDIO_RxStdInQ, "RxStdInQ"); +#if configUSE_TRACE_HOOKS + vTraceSetQueueName(RSTDIO_RxStdInQ, "RxStdInQ"); +#endif + + RSTDIO_RxStdOutQ = McuRTOS_xQueueCreate(RSTDIO_QUEUE_LENGTH, RSTDIO_QUEUE_ITEM_SIZE); + if (RSTDIO_RxStdOutQ==NULL) { + for(;;){} /* out of memory? */ + } + McuRTOS_vQueueAddToRegistry(RSTDIO_RxStdOutQ, "RxStdOutQ"); +#if configUSE_TRACE_HOOKS + vTraceSetQueueName(RSTDIO_RxStdOutQ, "RxStdOutQ"); +#endif + + RSTDIO_RxStdErrQ = McuRTOS_xQueueCreate(RSTDIO_QUEUE_LENGTH, RSTDIO_QUEUE_ITEM_SIZE); + if (RSTDIO_RxStdErrQ==NULL) { + for(;;){} /* out of memory? */ + } + McuRTOS_vQueueAddToRegistry(RSTDIO_RxStdErrQ, "RxStdErrQ"); +#if configUSE_TRACE_HOOKS + vTraceSetQueueName(RSTDIO_RxStdErrQ, "RxStdErrQ"); +#endif + + RSTDIO_TxStdInQ = McuRTOS_xQueueCreate(RSTDIO_QUEUE_LENGTH, RSTDIO_QUEUE_ITEM_SIZE); + if (RSTDIO_TxStdInQ==NULL) { + for(;;){} /* out of memory? */ + } + McuRTOS_vQueueAddToRegistry(RSTDIO_TxStdInQ, "TxStdInQ"); +#if configUSE_TRACE_HOOKS + vTraceSetQueueName(RSTDIO_TxStdInQ, "TxStdInQ"); +#endif + + RSTDIO_TxStdOutQ = McuRTOS_xQueueCreate(RSTDIO_QUEUE_LENGTH, RSTDIO_QUEUE_ITEM_SIZE); + if (RSTDIO_TxStdOutQ==NULL) { + for(;;){} /* out of memory? */ + } + McuRTOS_vQueueAddToRegistry(RSTDIO_TxStdOutQ , "TxStdOutQ"); +#if configUSE_TRACE_HOOKS + vTraceSetQueueName(RSTDIO_TxStdOutQ, "TxStdOutQ"); +#endif + + RSTDIO_TxStdErrQ = McuRTOS_xQueueCreate(RSTDIO_QUEUE_LENGTH, RSTDIO_QUEUE_ITEM_SIZE); + if (RSTDIO_TxStdErrQ==NULL) { + for(;;){} /* out of memory? */ + } + McuRTOS_vQueueAddToRegistry(RSTDIO_TxStdErrQ , "TxStdErrQ"); +#if configUSE_TRACE_HOOKS + vTraceSetQueueName(RSTDIO_TxStdErrQ, "TxStdErrQ"); +#endif +} + +#endif /* McuRNET_CONFIG_IS_ENABLED */ diff --git a/TSM_PicoW_Sensor/McuLib/RNet/RStdIO.h b/TSM_PicoW_Sensor/McuLib/RNet/RStdIO.h new file mode 100644 index 0000000..208efa6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/RNet/RStdIO.h @@ -0,0 +1,133 @@ +/** + * \file + * \brief This is the interface of the remote/radio standard I/O module + * \author (c) 2013-2014 Erich Styger, http://mcuoneclipse.com/ + * \note MIT License (http://opensource.org/licenses/mit-license.html), see 'RNet_License.txt' + * + * This module is used for radio/remote stdio. + */ + +#ifndef RSTDIO_C_ +#define RSTDIO_C_ + +#include "McuRNetConfig.h" +#if McuRNET_CONFIG_IS_ENABLED +#include "RApp.h" +#include "RPHY.h" +#include "RNWK.h" +#include "McuShell.h" +#include "McuRTOS.h" + +typedef enum RSTDIO_QueueType { + /* Rx stdio queues: */ + RSTDIO_QUEUE_RX_IN, + RSTDIO_QUEUE_RX_OUT, + RSTDIO_QUEUE_RX_ERR, + /* Tx stdio queues: */ + RSTDIO_QUEUE_TX_IN, + RSTDIO_QUEUE_TX_OUT, + RSTDIO_QUEUE_TX_ERR +} RSTDIO_QueueType; + +extern uint8_t RSTDIO_DefaultShellBuffer[McuShell_DEFAULT_SHELL_BUFFER_SIZE]; /* default buffer which can be used by the application */ + +extern McuShell_ConstStdIOType RSTDIO_stdio; /* default standard I/O */ + +#define RSTDIO_PARSE_COMMAND_ENABLED 1 /* set to 1 if method ParseCommand() is present, 0 otherwise */ + +/*! + * \brief Shell parser routine. + * \param cmd Pointer to command line string. + * \param handled Pointer to status if command has been handled. Set to TRUE if command was understood. + * \param io Pointer to stdio handle + * \return Error code, ERR_OK if everything was ok. + */ +uint8_t RSTDIO_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); + +/*! + * \brief Returns a queue handle for a Remote Standard I/O type + * \param queueType Type of queue + * \return Queue handle + */ +QueueHandle_t RSTDIO_GetQueueForType(RSTDIO_QueueType queueType); + +/*! + * \brief Returns the number of elements in the queue + * \param queueType Queue type + * \return Number of elements in the queue, 0 if the queue is not known. + */ +uint8_t RSTDIO_NofInQueue(RSTDIO_QueueType queueType); + +/*! + * \brief Returns a character from a queue + * \param queueType Queue type + * \return Character, or zero byte if queue is empty or unknown + */ +uint8_t RSTDIO_ReceiveQueueChar(RSTDIO_QueueType queueType); + +/*! + * \brief Sends a message to a tx stdio queues and sends it if queue is full or has \n at the end + * \param queueType Which stdio queue to use + * \param buf Data buffer. + * \param bufSize Size of data buffer. + * \return Error code + */ +uint8_t RSTDIO_SendToTxStdio(RSTDIO_QueueType queueType, uint8_t *buf, size_t bufSize); + +/*! + * \brief Adds a message to a tx queues without sending it + * \param queueType Which stdio queue to use + * \param buf Data buffer. + * \param bufSize Size of data buffer. + * \return Error code + */ +uint8_t RSTDIO_AddToQueue(RSTDIO_QueueType queueType, const unsigned char *data, size_t dataSize); + +/*! + * \brief returns the Standard I/O hander for the remote Rx channel + * \return Standard I/O handler with stdin, stdout and stderr + */ +McuShell_ConstStdIOTypePtr RSTDIO_GetStdio(void); + +/*! + * \brief Message handler for StdIO messages sent over the radio + * \param type Message type + * \param Size of the payload data + * \param data Payload data + * \param srcAddr Address of node who has sent the message + * \param[out] handled Message handler sets this to TRUE if message was handled + * \param packet Message data packet data + */ +uint8_t RSTDIO_HandleStdioRxMessage(RAPP_MSG_Type type, uint8_t size, uint8_t *data, RNWK_ShortAddrType srcAddr, bool *handled, RPHY_PacketDesc *packet); + +/*! + * \brief Call this routines periodically. It will parse incoming remote messages and will dispatch them between stdin, stdout and stderr. + * \param io Standard I/O handle to be used for printing + */ +void RSTDIO_Print(McuShell_ConstStdIOTypePtr io); + +/*! + * \brief Same as RSTDIO_Print(), but *adds* the input (in, err) into a buffer. + * \param buffer Buffer to be used + * \param bufSize Size of the buffer in bytes + * \return Number of characters added to buffer +*/ +unsigned int RSTDIO_AddIntoBuffer(unsigned char *buffer, size_t bufSize); + +/*! + * \brief Sets the destination address to be used for remote standard I/O + * \param addr Address to be used + */ +void RSTDIO_SetDestinationAddress(RNWK_ShortAddrType addr); + +/*! \brief Initializes the module */ +void RSTDIO_Init(void); + +/*! \brief Deinitializes the module */ +void RSTDIO_Deinit(void); + + +#endif /* McuRNET_CONFIG_IS_ENABLED */ + +#endif /* RSTDIO_C_ */ + diff --git a/TSM_PicoW_Sensor/McuLib/RNet/Radio.c b/TSM_PicoW_Sensor/McuLib/RNet/Radio.c new file mode 100644 index 0000000..3e4f8fb --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/RNet/Radio.c @@ -0,0 +1,1133 @@ +/** + * \file + * \brief This is the implementation of the Nordic Semiconductor nRF24L01+ low level driver. + * \author (c) 2013-2024 Erich Styger, http://mcuoneclipse.com/ + * \note MIT License (http://opensource.org/licenses/mit-license.html), see 'RNet_License.txt' + * + * This module deals with the low level functions of the transceiver. + */ + +#include "McuRNetConfig.h" +#if McuRNET_CONFIG_IS_ENABLED +#include "Radio.h" +#include "RadioNRF24.h" +#include "McuNRF24L01.h" +#include "RMSG.h" +#include "RStdIO.h" +#include "RPHY.h" +#include "McuUtility.h" +#include "McuRNet.h" +#include "McuLog.h" +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS + #include "McuSystemView.h" +#endif + +#if McuRNet_CREATE_EVENTS /* optional application user events */ + extern void McuRNet_OnRadioEvent(McuRNet_RadioEvent event); +#endif + +#define NRF24_DYNAMIC_PAYLOAD 1 /* if set to one, use dynamic payload size */ +#define NRF24_AUTO_ACKNOWLEDGE 1 /* if set to one, the transceiver is configured to use auto acknowledge */ +#define RADIO_CHANNEL_DEFAULT RNET_CONFIG_TRANSCEIVER_CHANNEL /* default communication channel */ +#define RADIO_USE_DTN (1 && McuLib_CONFIG_SDK_USE_FREERTOS) /* use direct task notification for interrupt */ + +/* macros to configure device either for RX or TX operation */ +#define McuNRF24L01_CONFIG_SETTINGS (McuNRF24L01_EN_CRC|McuNRF24L01_CRCO) +#define TX_POWERUP() McuNRF24L01_WriteRegister(McuNRF24L01_CONFIG, McuNRF24L01_CONFIG_SETTINGS|McuNRF24L01_PWR_UP|McuNRF24L01_PRIM_TX) /* enable 2 byte CRC, power up and set as PTX */ +#define RX_POWERUP() McuNRF24L01_WriteRegister(McuNRF24L01_CONFIG, McuNRF24L01_CONFIG_SETTINGS|McuNRF24L01_PWR_UP|McuNRF24L01_PRIM_RX) /* enable 1 byte CRC, power up and set as PRX */ +#define POWERDOWN() McuNRF24L01_WriteRegister(McuNRF24L01_CONFIG, McuNRF24L01_CONFIG_SETTINGS) /* power down */ + +static bool RADIO_isSniffing = FALSE; +#define RADIO_NOF_ADDR_BYTES 5 /* we are using 5 address bytes */ +static const uint8_t RADIO_TADDR_P0[RADIO_NOF_ADDR_BYTES] = {0x11, 0x22, 0x33, 0x44, 0x55}; /* device address for pipe 0 */ +static const uint8_t RADIO_TADDR_P1[RADIO_NOF_ADDR_BYTES] = {0xB3, 0xB4, 0xB5, 0xB6, 0xF1}; /* device address for pipe 1 */ +static const uint8_t RADIO_TADDR_P2[1] = {0xF2}; /* device address for pipe 2 */ +static const uint8_t RADIO_TADDR_P3[1] = {0xF3}; /* device address for pipe 3 */ +static const uint8_t RADIO_TADDR_P4[1] = {0xF4}; /* device address for pipe 4 */ +static const uint8_t RADIO_TADDR_P5[1] = {0xF5}; /* device address for pipe 5 */ + +#if RNET_CONFIG_SEND_RETRY_CNT>0 + static uint8_t RADIO_RetryCnt; + static uint8_t TxDataBuffer[RPHY_BUFFER_SIZE]; /*!< global buffer if using retries */ +#endif + +static TaskHandle_t radioTaskHandle; /* used for direct task notification */ + +/* Radio state definitions */ +typedef enum RADIO_AppStatusKind { + RADIO_INITIAL_STATE, /* initial state of the state machine */ + RADIO_RECEIVER_ALWAYS_ON, /* receiver is in RX mode */ + RADIO_TRANSMIT_DATA, /* send data */ + RADIO_WAITING_DATA_SENT, /* wait until data is sent */ + RADIO_TIMEOUT, + RADIO_READY_FOR_TX_RX_DATA, + RADIO_CHECK_TX, /* send data if any */ + RADIO_POWER_DOWN, /* transceiver powered down */ +} RADIO_AppStatusKind; + +static RADIO_AppStatusKind RADIO_AppStatus = RADIO_INITIAL_STATE; +static RPHY_PacketDesc radioRx; +static uint8_t radioRxBuf[RPHY_BUFFER_SIZE]; +static uint8_t RADIO_CurrChannel = RADIO_CHANNEL_DEFAULT; + +typedef enum RADIO_State { + RADIO_NONE, + RADIO_POWERUP, /* powering up */ + RADIO_TX_RX, +} RADIO_State; + +static RADIO_State appState = RADIO_NONE; + +void RADIO_Notify(uint32_t flags) { + if (flags!=0) { + (void)xTaskNotify(radioTaskHandle, flags, eSetBits); + } +} + +void RADIO_NotifyFromInterrupt(uint32_t flags, BaseType_t *pxHigherPriorityTaskWoken) { + if (flags!=0) { + (void)xTaskNotifyFromISR(radioTaskHandle, flags, eSetBits, pxHigherPriorityTaskWoken); + } +} + +/* callback called from radio driver */ +void RADIO_OnInterrupt(void) { +#if McuNRF24L01_CONFIG_IRQ_PIN_ENABLED + /* called from interrupt context */ + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + RADIO_NotifyFromInterrupt(RADIO_FLAG_INTERRUPT, &xHigherPriorityTaskWoken); + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); +#else + RADIO_Notify(RADIO_FLAG_INTERRUPT); +#endif +} + +bool RADIO_PollInterruptFlag(void) { + uint8_t status = McuNRF24L01_GetStatus(); + if (status&(McuNRF24L01_STATUS_RX_DR|McuNRF24L01_STATUS_TX_DS|McuNRF24L01_STATUS_MAX_RT)) { + McuLog_trace("IRQ in status"); + return true; /* interrupt */ + } + return false; /* no interrupt */ +} + +static bool CheckAndClearFlag(uint32_t *flags, uint32_t flag) { + if ((*flags)&flag) { + *flags &= ~flag; /* clear flag */ + return true; + } + return false; /* flag not set */ +} + +#if 0 +static bool RADIO_GetInterruptFlag(uint32_t timeoutTicks) { + bool hasInterrupt = false; + +#if 1 + uint8_t status = McuNRF24L01_GetStatus(); + if (status&(McuNRF24L01_STATUS_RX_DR|McuNRF24L01_STATUS_TX_DS|McuNRF24L01_STATUS_MAX_RT)) { + hasInterrupt = true; + McuLog_trace("No Radio IRQ, but set in status?"); + } +#else + (void)timeoutTicks; /* not used */ + hasInterrupt = RADIO_isrFlag; + if (!hasInterrupt) { + hasInterrupt = McuNRF24L01_PollInterrupt(); + } +#endif + return hasInterrupt; +} +#endif + +uint8_t RADIO_FlushQueues(void) { + uint8_t res = ERR_OK; + + if (RPHY_FlushRxQueue()!=ERR_OK) { + res = ERR_FAILED; + } + if (RPHY_FlushTxQueue()!=ERR_OK) { + res = ERR_FAILED; + } + return res; +} + +static uint8_t RADIO_Flush(void) { + McuNRF24L01_Write(McuNRF24L01_FLUSH_RX); /* flush old data */ + McuNRF24L01_Write(McuNRF24L01_FLUSH_TX); /* flush old data */ + return ERR_OK; +} + +bool RADIO_CanDoPowerDown(uint32_t notifcationValue) { + if (notifcationValue&RADIO_FLAG_INTERRUPT) { + return FALSE; /* interrupt pending */ + } + switch(RADIO_AppStatus) { + case RADIO_TRANSMIT_DATA: + case RADIO_WAITING_DATA_SENT: + case RADIO_TIMEOUT: + return FALSE; /* sending/receiving data, cannot power down */ + + case RADIO_INITIAL_STATE: + case RADIO_RECEIVER_ALWAYS_ON: + case RADIO_READY_FOR_TX_RX_DATA: + case RADIO_CHECK_TX: + case RADIO_POWER_DOWN: + break; /* check other conditions */ + default: + break; + } /* switch */ + if (RMSG_RxQueueNofItems()!=0) { + return FALSE; /* items received, cannot power down */ + } + if (RMSG_TxQueueNofItems()!=0) { + return FALSE; /* items to be sent, cannot power down */ + } + return TRUE; /* ok to power down */ +} + +uint8_t RADIO_PowerDown(void) { + uint8_t res; + + res = RADIO_Flush(); + POWERDOWN(); + return res; +} + +static uint8_t CheckTx(void) { + RPHY_PacketDesc packet; +#if RNET_CONFIG_SEND_RETRY_CNT==0 + uint8_t TxDataBuffer[RPHY_BUFFER_SIZE]; /* local tx buffer if not using retries */ +#endif + RPHY_FlagsType flags; + + if (RMSG_GetTxMsg(TxDataBuffer, sizeof(TxDataBuffer))==ERR_OK) { + flags = RPHY_BUF_FLAGS(TxDataBuffer); + if (flags&RPHY_PACKET_FLAGS_POWER_DOWN) { + /* special request */ + (void)RADIO_PowerDown(); + return ERR_DISABLED; /* no more data, pipes flushed */ + } + McuNRF24L01_StopRxTx(); /* CE low */ + TX_POWERUP(); + /* set up packet structure */ + packet.phyData = &TxDataBuffer[0]; + packet.flags = flags; + packet.phySize = sizeof(TxDataBuffer); +#if NRF24_DYNAMIC_PAYLOAD + packet.rxtx = RPHY_BUF_PAYLOAD_START(packet.phyData); +#else + packet.rxtx = &RPHY_BUF_SIZE(packet.phyData); /* we transmit the data size too */ +#endif + if (RADIO_isSniffing) { + RPHY_SniffPacket(&packet, TRUE); /* sniff outgoing packet */ + } +#if NRF24_DYNAMIC_PAYLOAD + if (flags&RPHY_PACKET_FLAGS_NO_ACK) { + McuNRF24L01_TxPayloadNoAck(packet.rxtx, RPHY_BUF_SIZE(packet.phyData)); /* send data, using dynamic payload size, without ack request */ + } else { + McuNRF24L01_TxPayload(packet.rxtx, RPHY_BUF_SIZE(packet.phyData)); /* send data, using dynamic payload size, with ack request */ + } +#else + McuNRF24L01_TxPayload(packet.rxtx, RPHY_PAYLOAD_SIZE); /* send data, using fixed payload size */ +#endif + return ERR_OK; + } + return ERR_NOTAVAIL; /* no data to send? */ +} + +/* called to check if we have something in the RX payload FIFO. If so, we queue it to the RX queue. */ +static uint8_t ReadRxPayload(void) { +#if NRF24_DYNAMIC_PAYLOAD + uint8_t payloadSize; +#endif + uint8_t res = ERR_OK; + uint8_t RxDataBuffer[RPHY_BUFFER_SIZE]; + uint8_t status; + RPHY_PacketDesc packet; + bool hasRxData, hasRx; + + hasRxData = FALSE; + packet.flags = RPHY_PACKET_FLAGS_NONE; + packet.phyData = &RxDataBuffer[0]; + packet.phySize = sizeof(RxDataBuffer); +#if NRF24_DYNAMIC_PAYLOAD + packet.rxtx = RPHY_BUF_PAYLOAD_START(packet.phyData); +#else + packet.rxtx = &RPHY_BUF_SIZE(packet.phyData); /* we transmit the data size too */ +#endif + status = McuNRF24L01_GetStatusClrIRQ(); + hasRx = (status&McuNRF24L01_STATUS_RX_DR)!=0; + if (hasRx) { /* data received interrupt */ + hasRxData = TRUE; +#if NRF24_DYNAMIC_PAYLOAD + (void)McuNRF24L01_ReadNofRxPayload(&payloadSize); + if (payloadSize==0 || payloadSize>32) { /* packet with error? */ + McuNRF24L01_Write(McuNRF24L01_FLUSH_RX); /* flush old data */ + return ERR_FAILED; + } else { + memset(packet.rxtx, 0xab, payloadSize); /* have defined data for the SPI transfer */ + McuNRF24L01_RxPayload(packet.rxtx, payloadSize); /* get payload: note that we transmit as payload! */ + RPHY_BUF_SIZE(packet.phyData) = payloadSize; + } +#else + McuNRF24L01_RxPayload(packet.rxtx, RPHY_PAYLOAD_SIZE); /* get payload: note that we transmit as payload! */ +#endif + } else { + McuNRF24L01_Write(McuNRF24L01_FLUSH_RX); /* flush old data */ + } + if (hasRxData) { + /* put message into Rx queue */ +#if McuRNet_CREATE_EVENTS + /*lint -save -e522 function lacks side effect */ + McuRNet_OnRadioEvent(McuRNet_RADIO_MSG_RECEIVED); + /*lint -restore */ +#endif + res = RMSG_QueueRxMsg(packet.phyData, packet.phySize, RPHY_BUF_SIZE(packet.phyData), packet.flags); + if (res!=ERR_OK) { + if (res==ERR_OVERFLOW) { + McuLog_error("Rx queue overflow!"); + } else { + McuLog_error("Rx Queue full?"); + } + } + } else { + res = ERR_RXEMPTY; /* no data */ + } + return res; +} + +static void WaitRandomTime(void) { + if (configTICK_RATE_HZ<=100) { /* slower tick rate */ + vTaskDelay(10+(xTaskGetTickCount()%16)); + } else { /* higher tick rate: wait between 10 and 10+32 ticks */ + vTaskDelay(10+(xTaskGetTickCount()%32)); + } +} + +static void RADIO_HandleStateMachine(uint32_t notifcationValue) { +#if RNET_RADIO_WAITNG_TIMEOUT_MS>0 + static TickType_t sentTimeTickCntr = 0; /* used for timeout */ +#endif + uint8_t status, res; + bool interrupt; + + for(;;) { /* will break/return */ + switch (RADIO_AppStatus) { + case RADIO_INITIAL_STATE: + McuNRF24L01_StopRxTx(); /* will send/receive data later */ + RADIO_AppStatus = RADIO_RECEIVER_ALWAYS_ON; /* turn receive on */ + break; /* process switch again */ + + case RADIO_RECEIVER_ALWAYS_ON: /* turn receive on */ + RX_POWERUP(); + McuNRF24L01_StartRxTx(); /* Listening for packets */ + RADIO_AppStatus = RADIO_READY_FOR_TX_RX_DATA; + break; /* process switch again */ + + case RADIO_READY_FOR_TX_RX_DATA: /* we are ready to receive/send data data */ + /* check first if we have incoming data: */ + interrupt = CheckAndClearFlag(¬ifcationValue, RADIO_FLAG_INTERRUPT); + if (interrupt) { /* Rx data? */ + int cntr = 0; + while(ReadRxPayload()==ERR_OK) { + /* continoue reading messages from transceiver */ + cntr++; + if (cntr>2) { + McuLog_trace("cntr: %d", cntr); + } + } + RADIO_AppStatus = RADIO_RECEIVER_ALWAYS_ON; /* continue listening */ + break; /* process switch again */ + #if 1 + } else { + uint8_t val; + (void)McuNRF24L01_GetFifoStatus(&val); + if (!(val&McuNRF24L01_FIFO_STATUS_RX_EMPTY)) { /* */ + McuLog_fatal("rx fifo not empty"); + } + #endif + } + #if RNET_CONFIG_SEND_RETRY_CNT>0 + RADIO_RetryCnt = 0; + #endif + RADIO_AppStatus = RADIO_CHECK_TX; /* check if we can send something */ + break; /* process switch again */ + + case RADIO_CHECK_TX: + if (CheckAndClearFlag(¬ifcationValue, RADIO_FLAG_TX_REQUEST)) { + res = CheckTx(); + if (res==ERR_OK) { /* there was data and it has been sent */ + #if RNET_RADIO_WAITNG_TIMEOUT_MS>0 + sentTimeTickCntr = xTaskGetTickCount(); /* remember time when it was sent, used for timeout */ + #endif + RADIO_AppStatus = RADIO_WAITING_DATA_SENT; + break; /* process switch again */ + } else if (res==ERR_DISABLED) { /* special message to power down transceiver */ + RADIO_AppStatus = RADIO_POWER_DOWN; + } else if (res==ERR_NOTAVAIL) { /* no data available to be sent */ + RADIO_AppStatus = RADIO_READY_FOR_TX_RX_DATA; + } else { + McuLog_fatal("wrong return code %d", res); + } + } else { + RADIO_AppStatus = RADIO_READY_FOR_TX_RX_DATA; + } + return; + + case RADIO_POWER_DOWN: + return; + + case RADIO_WAITING_DATA_SENT: + interrupt = CheckAndClearFlag(¬ifcationValue, RADIO_FLAG_INTERRUPT); + if (interrupt) { /* check if we have received an interrupt: this is either timeout or low level ack */ + status = McuNRF24L01_GetStatusClrIRQ(); + if (status&McuNRF24L01_STATUS_MAX_RT) { /* retry timeout interrupt */ + McuNRF24L01_Write(McuNRF24L01_FLUSH_TX); /* flush old data */ + RADIO_AppStatus = RADIO_TIMEOUT; /* timeout */ + WaitRandomTime(); + } else { + #if McuRNet_CREATE_EVENTS + /*lint -save -e522 function lacks side effect */ + McuRNet_OnRadioEvent(McuRNet_RADIO_MSG_SENT); + /*lint -restore */ + #endif + RADIO_AppStatus = RADIO_RECEIVER_ALWAYS_ON; /* turn receive on */ + } + break; /* process switch again */ + } + #if RNET_RADIO_WAITNG_TIMEOUT_MS>0 + if (pdMS_TO_TICKS((xTaskGetTickCount()-sentTimeTickCntr))>pdMS_TO_TICKS(RNET_RADIO_WAITNG_TIMEOUT_MS)) { + RADIO_AppStatus = RADIO_TIMEOUT; /* timeout */ + } + #endif + return; + + case RADIO_TIMEOUT: + #if RNET_CONFIG_SEND_RETRY_CNT>0 + if (RADIO_RetryCnt0) { + //McuLog_trace("Tx again: nof: %d", nof); + RADIO_Notify(RADIO_FLAG_TX_REQUEST); /* trigger again */ + } + } + for(i=0;i10) { /* limit frequency of checks */ + if (RADIO_IsSane()!=ERR_OK) { + McuLog_error("Radio not ready, going to re-initialize"); + RADIO_Notify(RADIO_FLAG_REQUEST_INIT); + nofRadioInit++; + } + checkCntr = 0; + } + if (nofRadioInit>5) { /* limit number of retry */ + for(;;) { + McuLog_fatal("Radio not ready, to many attempts"); + vTaskDelay(pdMS_TO_TICKS(30*1000)); + } + } + #endif + notifcationValue = 0; + res = xTaskNotifyWait(0UL, RADIO_FLAG_INTERRUPT|RADIO_FLAG_TX_REQUEST|RADIO_FLAG_REQUEST_INIT, ¬ifcationValue, portMAX_DELAY); /* check flags */ + #if RNet_App_CONFIG_DO_SANITY_CHECK + checkCntr++; + #endif + if (res==pdPASS) { + if (notifcationValue&RADIO_FLAG_INTERRUPT) { + //McuLog_trace("DTN: ISR"); + #if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS + McuSystemView_Print("DTN: ISR"); + #endif + } + if (notifcationValue&RADIO_FLAG_TX_REQUEST) { + //McuLog_trace("DTN: Tx"); + #if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS + McuSystemView_Print("DTN: Tx"); + #endif + } + if (notifcationValue&RADIO_FLAG_REQUEST_INIT) { + //McuLog_trace("DTN: Init"); + #if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS + McuSystemView_Print("DTN: Init"); + #endif + appState = RADIO_NONE; /* re-initialize and power up transceiver */ + } + Process(notifcationValue); /* process radio in/out queues */ + } + } +} + +static const unsigned char *RadioStateStr(RADIO_AppStatusKind state) { + switch(state) { + case RADIO_INITIAL_STATE: return (const unsigned char*)"INITIAL"; + case RADIO_RECEIVER_ALWAYS_ON: return (const unsigned char*)"ALWAYS_ON"; + case RADIO_TRANSMIT_DATA: return (const unsigned char*)"TRANSMIT_DATA"; + case RADIO_WAITING_DATA_SENT: return (const unsigned char*)"WAITING_DATA_SENT"; + case RADIO_READY_FOR_TX_RX_DATA: return (const unsigned char*)"READY_TX_RX"; + case RADIO_CHECK_TX: return (const unsigned char*)"CHECK_TX"; + case RADIO_POWER_DOWN: return (const unsigned char*)"POWER_DOWN"; + default: break; + } + return (const unsigned char*)"UNKNOWN"; +} + +static void RADIO_PrintHelp(const McuShell_StdIOType *io) { + McuShell_SendHelpStr((unsigned char*)"radio", (unsigned char*)"Group of radio commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Shows radio help or status\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" init", (unsigned char*)"Initialize radio\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" channel ", (unsigned char*)"Switches to the given channel (0..127)\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" datarate ", (unsigned char*)"Changes the data rate (250, 1000, 2000)\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" txaddr ", (unsigned char*)"Set TX address, of up to 5 hex bytes, separated by space\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" rxaddr ", (unsigned char*)"Set RX pipe address for pipe (0-5), of up to 5 hex bytes, separated by space\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" power ", (unsigned char*)"Changes output power (0, -10, -12, -18)\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" sniff on|off", (unsigned char*)"Turns sniffing on or off\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" writereg 0xReg 0xVal", (unsigned char*)"Write a transceiver register\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" readreg 0xReg", (unsigned char*)"Read a transceiver register\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" printregs", (unsigned char*)"Print the radio registers\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" flush", (unsigned char*)"Empty all queues\r\n", io->stdOut); +} + +static void RadioPrintRegisters(McuShell_ConstStdIOType *io) { + int i; + uint8_t val; + uint8_t bufidx[16], buf[16]; + + for(i=0;i<=0x1D;i++) { + val = McuNRF24L01_ReadRegister(i); + McuUtility_strcpy(bufidx, sizeof(bufidx), (unsigned char*)" addr 0x"); + McuUtility_strcatNum8Hex(bufidx, sizeof(bufidx), i); + buf[0] = '\0'; + McuUtility_strcatNum8Hex(buf, sizeof(buf), val); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr(bufidx, buf, io->stdOut); + } +} + +static void RADIO_PrintStatus(const McuShell_StdIOType *io) { + uint8_t buf[48]; + uint8_t val0, val1; + int8_t val; + uint16_t dataRate; + + McuShell_SendStatusStr((unsigned char*)"Radio", (unsigned char*)"\r\n", io->stdOut); + + McuShell_SendStatusStr((unsigned char*)" state", RadioStateStr(RADIO_AppStatus), io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + + McuShell_SendStatusStr((unsigned char*)" sniff", RADIO_isSniffing?(unsigned char*)"yes\r\n":(unsigned char*)"no\r\n", io->stdOut); + McuShell_SendStatusStr((unsigned char*)" sniff stdio", McuShell_GetStdio()==NULL?(unsigned char*)"NULL\r\n":(unsigned char*)"Shell default standard I/O\r\n", io->stdOut); + (void)McuNRF24L01_GetChannel(&val0); + McuUtility_Num8uToStr(buf, sizeof(buf), val0); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" (HW), "); + McuUtility_strcatNum8u(buf, sizeof(buf), RADIO_CurrChannel); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" (SW)\r\n"); + McuShell_SendStatusStr((unsigned char*)" channel", buf, io->stdOut); + + (void)McuNRF24L01_GetAddressWidth(&val0); + McuUtility_Num8uToStr(buf, sizeof(buf), val0); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" bytes\r\n"); + McuShell_SendStatusStr((unsigned char*)" addr width", buf, io->stdOut); + + { + int i, pipe; /* Pipes 0 to 5 */ + uint8_t pipeAddr[RADIO_NOF_ADDR_BYTES]; + uint8_t str[sizeof(" RX_ADDR_Px")]; + + for(i=0;istdOut); + + for (pipe=0;pipe<6;pipe++) { /* pipes 0 to 5 */ + /* RX_ADDR_Px */ + (void)McuNRF24L01_GetRxAddress(pipe, &pipeAddr[0], sizeof(pipeAddr)); + buf[0] = '\0'; + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"0x"); + for(i=0;istdOut); + } + } + + (void)McuNRF24L01_GetOutputPower(&val); + McuUtility_Num8sToStr(buf, sizeof(buf), val); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" dBm\r\n"); + McuShell_SendStatusStr((unsigned char*)" power", buf, io->stdOut); + + (void)McuNRF24L01_GetDataRate(&dataRate); + McuUtility_Num16uToStr(buf, sizeof(buf), dataRate); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" kbps\r\n"); + McuShell_SendStatusStr((unsigned char*)" data rate", buf, io->stdOut); + + val0 = McuNRF24L01_GetStatus(); + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), val0); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)": "); + if (val0&McuNRF24L01_STATUS_RX_DR) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"RX_DR "); + } + if (val0&McuNRF24L01_STATUS_TX_DS) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"TX_DS "); + } + if (val0&McuNRF24L01_STATUS_MAX_RT) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"MAX_RT "); + } + if ((val0&McuNRF24L01_STATUS_RX_P_NO) == McuNRF24L01_STATUS_RX_P_NO_RX_FIFO_EMPTY) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"RxFifoEmpty "); + } + if ((val0&McuNRF24L01_STATUS_RX_P_NO) == McuNRF24L01_STATUS_RX_P_NO_UNUSED) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"RxUnused "); + } + if ((val0&McuNRF24L01_STATUS_RX_P_NO) == McuNRF24L01_STATUS_RX_P_NO_5) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"RxP#5 "); + } + if ((val0&McuNRF24L01_STATUS_RX_P_NO) == McuNRF24L01_STATUS_RX_P_NO_4) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"RxP#4 "); + } + if ((val0&McuNRF24L01_STATUS_RX_P_NO) == McuNRF24L01_STATUS_RX_P_NO_3) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"RxP#3 "); + } + if ((val0&McuNRF24L01_STATUS_RX_P_NO) == McuNRF24L01_STATUS_RX_P_NO_2) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"RxP#2 "); + } + if ((val0&McuNRF24L01_STATUS_RX_P_NO) == McuNRF24L01_STATUS_RX_P_NO_1) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"RxP#1 "); + } + if ((val0&McuNRF24L01_STATUS_RX_P_NO) == McuNRF24L01_STATUS_RX_P_NO_0) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"RxP#0 "); + } + if (val0&McuNRF24L01_STATUS_TX_FULL) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"TX_FULL "); + } + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" STATUS", buf, io->stdOut); + + (void)McuNRF24L01_GetFifoStatus(&val0); + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), val0); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)": "); + if (val0&McuNRF24L01_FIFO_STATUS_TX_REUSE) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"REUSE "); + } + if (val0&McuNRF24L01_FIFO_STATUS_TX_FULL) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"TX_FULL "); + } + if (val0&McuNRF24L01_FIFO_STATUS_TX_EMPTY) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"TX_EMPTY "); + } + if (val0&McuNRF24L01_FIFO_STATUS_RX_FULL) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"RX_FULL "); + } + if (val0&McuNRF24L01_FIFO_STATUS_RX_EMPTY) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"RX_EMPTY "); + } + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" FIFO_STATUS", buf, io->stdOut); + + (void)McuNRF24L01_ReadObserveTxRegister(&val0, &val1); + McuUtility_Num8uToStr(buf, sizeof(buf), val0); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" lost, "); + McuUtility_strcatNum8u(buf, sizeof(buf), val1); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" retry\r\n"); + McuShell_SendStatusStr((unsigned char*)" OBSERVE_TX", buf, io->stdOut); +#if 0 /* The RPD status will get reset very fast by another (e.g. WLAN) packet. So this is not really a useful feature :-( */ + (void)McuNRF24L01_ReadReceivedPowerDetector(&val0); /*! \todo only works in RX mode, but somehow this still does not work? */ + if (val0&1) { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"1, > -64 dBm\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0, < -64 dBm\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" RPD", buf, io->stdOut); +#endif + McuUtility_Num16uToStr(buf, sizeof(buf), RNET_CONFIG_SEND_RETRY_CNT); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" Max Retries", buf, io->stdOut); + + if (McuNRF24L01_ReadFeature(&val0)==ERR_OK) { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), val0); + if (val0&McuNRF24L01_FEATURE_EN_DPL) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" EN_DPL"); + } + if (val0&McuNRF24L01_FEATURE_EN_ACK_PAY) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" EN_ACK_PAY"); + } + if (val0&McuNRF24L01_FEATURE_EN_DYN_PAY) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" EN_DYN_ACK"); + } + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ERROR\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" Feature", buf, io->stdOut); +} + +uint8_t RADIO_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) { + uint8_t res = ERR_OK; + const unsigned char *p; + uint8_t val; + int8_t vals; + uint8_t addr[RADIO_NOF_ADDR_BYTES]; + int i; + + if (McuUtility_strcmp((char*)cmd, (char*)McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, (char*)"radio help")==0) { + RADIO_PrintHelp(io); + *handled = TRUE; + } else if (McuUtility_strcmp((char*)cmd, (char*)McuShell_CMD_STATUS)==0 || McuUtility_strcmp((char*)cmd, (char*)"radio status")==0) { + RADIO_PrintStatus(io); + *handled = TRUE; + } else if (McuUtility_strcmp((char*)cmd, (char*)"radio init")==0) { + *handled = TRUE; + RADIO_Notify(RADIO_FLAG_REQUEST_INIT); + return ERR_OK; + } else if (McuUtility_strcmp((char*)cmd, (char*)"radio sniff on")==0) { + RADIO_isSniffing = TRUE; + *handled = TRUE; + } else if (McuUtility_strcmp((char*)cmd, (char*)"radio sniff off")==0) { + RADIO_isSniffing = FALSE; + *handled = TRUE; + } else if (McuUtility_strncmp((char*)cmd, (char*)"radio channel", sizeof("radio channel")-1)==0) { + p = cmd+sizeof("radio channel"); + if (McuUtility_ScanDecimal8uNumber(&p, &val)==ERR_OK && val<=0x7F) { + res = RADIO_SetChannel(val); + *handled = TRUE; + } else { + McuShell_SendStr((unsigned char*)"Wrong argument, must be in the range 0..128\r\n", io->stdErr); + res = ERR_FAILED; + } + } else if (McuUtility_strncmp((char*)cmd, (char*)"radio power", sizeof("radio power")-1)==0) { + p = cmd+sizeof("radio power"); + if (McuUtility_ScanDecimal8sNumber(&p, &vals)==ERR_OK && (vals==0 || vals==-10 || vals==-12 || vals==-18)) { + (void)McuNRF24L01_SetOutputPower(vals); + *handled = TRUE; + } else { + McuShell_SendStr((unsigned char*)"Wrong argument, must be 0, -10, -12 or -18\r\n", io->stdErr); + res = ERR_FAILED; + } + } else if (McuUtility_strncmp((char*)cmd, (char*)"radio writereg", sizeof("radio writereg")-1)==0) { + uint8_t reg; + + p = cmd+sizeof("radio writereg"); + if (McuUtility_ScanHex8uNumber(&p, ®)==ERR_OK && McuUtility_ScanHex8uNumber(&p, &val)==ERR_OK) { + McuNRF24L01_WriteRegister(reg, val); + *handled = TRUE; + } else { + McuShell_SendStr((unsigned char*)"Wrong arguments\r\n", io->stdErr); + res = ERR_FAILED; + } + } else if (McuUtility_strncmp((char*)cmd, (char*)"radio readreg", sizeof("radio readreg")-1)==0) { + uint8_t reg; + uint8_t buf[16]; + + p = cmd+sizeof("radio readreg"); + if (McuUtility_ScanHex8uNumber(&p, ®)==ERR_OK) { + val = McuNRF24L01_ReadRegister(reg); + buf[0] = '\0'; + McuUtility_strcpy(buf, sizeof(buf), (uint8_t*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), val); + McuUtility_strcat(buf, sizeof(buf), (uint8_t*)"\r\n"); + McuShell_SendStr(buf, io->stdOut); + *handled = TRUE; + } else { + McuShell_SendStr((unsigned char*)"Wrong arguments\r\n", io->stdErr); + res = ERR_FAILED; + } + } else if (McuUtility_strcmp((char*)cmd, (char*)"radio flush")==0) { + *handled = TRUE; + if (RADIO_Flush()!=ERR_OK) { + McuShell_SendStr((unsigned char*)"Flushing failed!\r\n", io->stdErr); + res = ERR_FAILED; + } + if (RADIO_FlushQueues()!=ERR_OK) { + McuShell_SendStr((unsigned char*)"Flushing queues failed!\r\n", io->stdErr); + res = ERR_FAILED; + } + } else if (McuUtility_strcmp((char*)cmd, (char*)"radio printregs")==0) { + RadioPrintRegisters(io); + *handled = TRUE; + } else if (McuUtility_strcmp((char*)cmd, (char*)"radio datarate 250")==0) { + (void)McuNRF24L01_SetDataRate(250); + *handled = TRUE; + } else if (McuUtility_strcmp((char*)cmd, (char*)"radio datarate 1000")==0) { + (void)McuNRF24L01_SetDataRate(1000); + *handled = TRUE; + } else if (McuUtility_strcmp((char*)cmd, (char*)"radio datarate 2000")==0) { + (void)McuNRF24L01_SetDataRate(2000); + *handled = TRUE; + } else if (McuUtility_strncmp((char*)cmd, (char*)"radio txaddr ", sizeof("radio txaddr ")-1)==0) { + p = cmd+sizeof("radio txaddr ")-1; + for(i=0;istdErr); + res = ERR_FAILED; + break; /* break for loop */ + } + } /* for */ + if (McuNRF24L01_SetTxAddress(addr, sizeof(addr))!=ERR_OK) { + McuShell_SendStr((unsigned char*)"Error setting TX address!\r\n", io->stdErr); + res = ERR_FAILED; + } + *handled = TRUE; + } else if (McuUtility_strncmp((char*)cmd, (char*)"radio rxaddr ", sizeof("radio rxaddr ")-1)==0) { + uint8_t pipe; + + p = cmd+sizeof("radio rxaddr ")-1; + if (McuUtility_ScanDecimal8uNumber(&p, &pipe)==ERR_OK) { + for(i=0;istdErr); + res = ERR_FAILED; + break; /* break for loop */ + } + } /* for */ + if (McuNRF24L01_SetRxAddress(pipe, addr, sizeof(addr))!=ERR_OK) { + McuShell_SendStr((unsigned char*)"Error setting RX address!\r\n", io->stdErr); + res = ERR_FAILED; + } + } + *handled = TRUE; + } + return res; +} + +#if McuNRF24L01_CONFIG_IRQ_PIN_ENABLED +#include "McuGPIO.h" +#include "RadioNRF24.h" +#if McuLib_CONFIG_CPU_IS_KINETIS + #include "fsl_port.h" +#endif + +static McuGPIO_Handle_t irqPin; + +#if McuLib_CONFIG_CPU_IS_RPxxxx +static void gpio_IsrCallback(uint gpio, uint32_t events) { + switch(gpio) { + case McuNRF24L01_CONFIG_IRQ_PIN_NUMBER: + RADIO_OnInterrupt(); + break; + default: + break; + } +} +#endif /* McuLib_CONFIG_CPU_IS_RPxxxx */ + +#if McuLib_CONFIG_CPU_IS_KINETIS +void PORTB_IRQHandler(void) { /* interrupt handler for PORTB */ + uint32_t flags; + + flags = GPIO_PortGetInterruptFlags(McuNRF24L01_CONFIG_IRQ_PIN_GPIO); + if (flags&(1U< // required for _write_r +#endif +#include "SEGGER_RTT.h" + +#if McuRTT_CONFIG_PROVIDE_SYSCALLS /* << EST */ +#include /* for EOF */ /* << EST */ +#include // required for _write_r // << EST moved from above + +/********************************************************************* +* +* Types +* +********************************************************************** +*/ +// +// If necessary define the _reent struct +// to match the one passed by the used standard library. +// +struct _reent; + +/********************************************************************* +* +* Function prototypes +* +********************************************************************** +*/ +_ssize_t _write (int file, const void *ptr, size_t len); +_ssize_t _write_r(struct _reent *r, int file, const void *ptr, size_t len); + +/********************************************************************* +* +* Global functions +* +********************************************************************** +*/ + +/********************************************************************* +* +* _write() +* +* Function description +* Low-level write function. +* libc subroutines will use this system routine for output to all files, +* including stdout. +* Write data via RTT. +*/ +_ssize_t _write(int file, const void *ptr, size_t len) { + (void) file; /* Not used, avoid warning */ + SEGGER_RTT_Write(0, ptr, len); + return len; +} + +/********************************************************************* +* +* _write_r() +* +* Function description +* Low-level reentrant write function. +* libc subroutines will use this system routine for output to all files, +* including stdout. +* Write data via RTT. +*/ +_ssize_t _write_r(struct _reent *r, int file, const void *ptr, size_t len) { + (void) file; /* Not used, avoid warning */ + (void) r; /* Not used, avoid warning */ + SEGGER_RTT_Write(0, ptr, len); + return len; +} + +int _putc(int c, __FILE *fp) { /* << EST */ + char ch = c; + (void)fp; /* Not used, avoid warning */ + SEGGER_RTT_Write(0, &ch, 1); + return 1; +} + +int _putchar(int c) { /* << EST */ + char ch = c; + SEGGER_RTT_Write(0, &ch, 1); + return 1; +} + +int _getc(__FILE *fp) { /* << EST */ + char ch; + (void)fp; /* Not used, avoid warning */ + if (SEGGER_RTT_Read(0, &ch, 1)==0) { + return EOF; + } + return ch; +} + +int _read(void) { + uint8_t ch; + if (SEGGER_RTT_Read(0, &ch, 1)==0) { + return EOF; + } + return (int)ch; +} + +int __attribute__((weak)) _isatty(int file __attribute__((unused))) { + return 1; +} + +int __attribute__((weak)) _close(int fildes __attribute__((unused))) { + return -1; +} + +int __attribute__((weak)) _lseek(int file __attribute__((unused)), int ptr __attribute__((unused)), int dir __attribute__((unused))) { + return -1; +} + +#if 0 +int __attribute__((weak)) _fstat (int fd __attribute__((unused)), struct stat *st) +{ + memset (st, 0, sizeof(*st)); + st->st_mode = S_IFCHR; + return 0; +} +#endif + + +#endif /* McuRTT_CONFIG_PROVIDE_SYSCALLS */ /* << EST */ + +#endif +/****** End Of File *************************************************/ + diff --git a/TSM_PicoW_Sensor/McuLib/SEGGER_RTT/SEGGER_RTT.c b/TSM_PicoW_Sensor/McuLib/SEGGER_RTT/SEGGER_RTT.c new file mode 100644 index 0000000..9d24821 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/SEGGER_RTT/SEGGER_RTT.c @@ -0,0 +1,2088 @@ +/** Copyright (C) SEGGER Microcontroller GmbH */ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2019 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER RTT * Real Time Transfer for embedded targets * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the RTT protocol and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* RTT version: 6.86e * +* * +********************************************************************** + +---------------------------END-OF-HEADER------------------------------ +File : SEGGER_RTT.c +Purpose : Implementation of SEGGER real-time transfer (RTT) which + allows real-time communication on targets which support + debugger memory accesses while the CPU is running. +Revision: $Rev: 20869 $ + +Additional information: + Type "int" is assumed to be 32-bits in size + H->T Host to target communication + T->H Target to host communication + + RTT channel 0 is always present and reserved for Terminal usage. + Name is fixed to "Terminal" + + Effective buffer size: SizeOfBuffer - 1 + + WrOff == RdOff: Buffer is empty + WrOff == (RdOff - 1): Buffer is full + WrOff > RdOff: Free space includes wrap-around + WrOff < RdOff: Used space includes wrap-around + (WrOff == (SizeOfBuffer - 1)) && (RdOff == 0): + Buffer full and wrap-around after next byte + + +---------------------------------------------------------------------- +*/ + +#include "SEGGER_RTT.h" + +#include // for memcpy + +/********************************************************************* +* +* Configuration, default values +* +********************************************************************** +*/ + +#if SEGGER_RTT_CPU_CACHE_LINE_SIZE + #ifdef SEGGER_RTT_CB_ALIGN + #error "Custom SEGGER_RTT_CB_ALIGN() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" + #endif + #ifdef SEGGER_RTT_BUFFER_ALIGN + #error "Custom SEGGER_RTT_BUFFER_ALIGN() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" + #endif + #ifdef SEGGER_RTT_PUT_CB_SECTION + #error "Custom SEGGER_RTT_PUT_CB_SECTION() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" + #endif + #ifdef SEGGER_RTT_PUT_BUFFER_SECTION + #error "Custom SEGGER_RTT_PUT_BUFFER_SECTION() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" + #endif + #ifdef SEGGER_RTT_BUFFER_ALIGNMENT + #error "Custom SEGGER_RTT_BUFFER_ALIGNMENT is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" + #endif + #ifdef SEGGER_RTT_ALIGNMENT + #error "Custom SEGGER_RTT_ALIGNMENT is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" + #endif +#endif + +#ifndef BUFFER_SIZE_UP + #define BUFFER_SIZE_UP 1024 // Size of the buffer for terminal output of target, up to host +#endif + +#ifndef BUFFER_SIZE_DOWN + #define BUFFER_SIZE_DOWN 16 // Size of the buffer for terminal input to target from host (Usually keyboard input) +#endif + +#ifndef SEGGER_RTT_MAX_NUM_UP_BUFFERS + #define SEGGER_RTT_MAX_NUM_UP_BUFFERS 2 // Number of up-buffers (T->H) available on this target +#endif + +#ifndef SEGGER_RTT_MAX_NUM_DOWN_BUFFERS + #define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS 2 // Number of down-buffers (H->T) available on this target +#endif + +#ifndef SEGGER_RTT_BUFFER_SECTION + #if defined(SEGGER_RTT_SECTION) + #define SEGGER_RTT_BUFFER_SECTION SEGGER_RTT_SECTION + #endif +#endif + +#ifndef SEGGER_RTT_ALIGNMENT + #define SEGGER_RTT_ALIGNMENT SEGGER_RTT_CPU_CACHE_LINE_SIZE +#endif + +#ifndef SEGGER_RTT_BUFFER_ALIGNMENT + #define SEGGER_RTT_BUFFER_ALIGNMENT SEGGER_RTT_CPU_CACHE_LINE_SIZE +#endif + +#ifndef SEGGER_RTT_MODE_DEFAULT + #define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP +#endif + +#ifndef SEGGER_RTT_LOCK + #define SEGGER_RTT_LOCK() +#endif + +#ifndef SEGGER_RTT_UNLOCK + #define SEGGER_RTT_UNLOCK() +#endif + +#ifndef STRLEN + #define STRLEN(a) strlen((a)) +#endif + +#ifndef STRCPY + #define STRCPY(pDest, pSrc) strcpy((pDest), (pSrc)) +#endif + +#ifndef SEGGER_RTT_MEMCPY_USE_BYTELOOP + #define SEGGER_RTT_MEMCPY_USE_BYTELOOP 0 +#endif + +#ifndef SEGGER_RTT_MEMCPY + #ifdef MEMCPY + #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes) MEMCPY((pDest), (pSrc), (NumBytes)) + #else + #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes) memcpy((pDest), (pSrc), (NumBytes)) + #endif +#endif + +#ifndef MIN + #define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +#ifndef MAX + #define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif +// +// For some environments, NULL may not be defined until certain headers are included +// +#ifndef NULL + #define NULL 0 +#endif + +/********************************************************************* +* +* Defines, fixed +* +********************************************************************** +*/ +#if (defined __ICCARM__) || (defined __ICCRX__) + #define RTT_PRAGMA(P) _Pragma(#P) +#endif + +#if SEGGER_RTT_ALIGNMENT || SEGGER_RTT_BUFFER_ALIGNMENT + #if (defined __GNUC__) + #define SEGGER_RTT_ALIGN(Var, Alignment) Var __attribute__ ((aligned (Alignment))) + #elif (defined __ICCARM__) || (defined __ICCRX__) + #define PRAGMA(A) _Pragma(#A) +#define SEGGER_RTT_ALIGN(Var, Alignment) RTT_PRAGMA(data_alignment=Alignment) \ + Var + #elif (defined __CC_ARM) + #define SEGGER_RTT_ALIGN(Var, Alignment) Var __attribute__ ((aligned (Alignment))) + #else + #error "Alignment not supported for this compiler." + #endif +#else + #define SEGGER_RTT_ALIGN(Var, Alignment) Var +#endif + +#if defined(SEGGER_RTT_SECTION) || defined (SEGGER_RTT_BUFFER_SECTION) + #if (defined __GNUC__) + #define SEGGER_RTT_PUT_SECTION(Var, Section) __attribute__ ((section (Section))) Var + #elif (defined __ICCARM__) || (defined __ICCRX__) +#define SEGGER_RTT_PUT_SECTION(Var, Section) RTT_PRAGMA(location=Section) \ + Var + #elif (defined __CC_ARM) + #define SEGGER_RTT_PUT_SECTION(Var, Section) __attribute__ ((section (Section), zero_init)) Var + #else + #error "Section placement not supported for this compiler." + #endif +#else + #define SEGGER_RTT_PUT_SECTION(Var, Section) Var +#endif + +#if SEGGER_RTT_ALIGNMENT + #define SEGGER_RTT_CB_ALIGN(Var) SEGGER_RTT_ALIGN(Var, SEGGER_RTT_ALIGNMENT) +#else + #define SEGGER_RTT_CB_ALIGN(Var) Var +#endif + +#if SEGGER_RTT_BUFFER_ALIGNMENT + #define SEGGER_RTT_BUFFER_ALIGN(Var) SEGGER_RTT_ALIGN(Var, SEGGER_RTT_BUFFER_ALIGNMENT) +#else + #define SEGGER_RTT_BUFFER_ALIGN(Var) Var +#endif + + +#if defined(SEGGER_RTT_SECTION) + #define SEGGER_RTT_PUT_CB_SECTION(Var) SEGGER_RTT_PUT_SECTION(Var, SEGGER_RTT_SECTION) +#else + #define SEGGER_RTT_PUT_CB_SECTION(Var) Var +#endif + +#if defined(SEGGER_RTT_BUFFER_SECTION) + #define SEGGER_RTT_PUT_BUFFER_SECTION(Var) SEGGER_RTT_PUT_SECTION(Var, SEGGER_RTT_BUFFER_SECTION) +#else + #define SEGGER_RTT_PUT_BUFFER_SECTION(Var) Var +#endif + +/********************************************************************* +* +* Static const data +* +********************************************************************** +*/ + +static unsigned char _aTerminalId[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +// +// RTT Control Block and allocate buffers for channel 0 +// +SEGGER_RTT_PUT_CB_SECTION(SEGGER_RTT_CB_ALIGN(SEGGER_RTT_CB _SEGGER_RTT)); +SEGGER_RTT_PUT_BUFFER_SECTION(SEGGER_RTT_BUFFER_ALIGN(static char _acUpBuffer [SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(BUFFER_SIZE_UP)])); +SEGGER_RTT_PUT_BUFFER_SECTION(SEGGER_RTT_BUFFER_ALIGN(static char _acDownBuffer[SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(BUFFER_SIZE_DOWN)])); + +static unsigned char _ActiveTerminal; + +/********************************************************************* +* +* Static functions +* +********************************************************************** +*/ + +/********************************************************************* +* +* _DoInit() +* +* Function description +* Initializes the control block an buffers. +* May only be called via INIT() to avoid overriding settings. +* +*/ +#define INIT() { \ + volatile SEGGER_RTT_CB* pRTTCBInit; \ + pRTTCBInit = (volatile SEGGER_RTT_CB*)((char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); \ + do { \ + if (pRTTCBInit->acID[0] == '\0') { \ + _DoInit(); \ + } \ + } while (0); \ + } + +static void _DoInit(void) { + volatile SEGGER_RTT_CB* p; // Volatile to make sure that compiler cannot change the order of accesses to the control block + // + // Initialize control block + // + p = (volatile SEGGER_RTT_CB*)((char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access control block uncached so that nothing in the cache ever becomes dirty and all changes are visible in HW directly + p->MaxNumUpBuffers = SEGGER_RTT_MAX_NUM_UP_BUFFERS; + p->MaxNumDownBuffers = SEGGER_RTT_MAX_NUM_DOWN_BUFFERS; + // + // Initialize up buffer 0 + // + p->aUp[0].sName = "Terminal"; + p->aUp[0].pBuffer = _acUpBuffer; + p->aUp[0].SizeOfBuffer = sizeof(_acUpBuffer); + p->aUp[0].RdOff = 0u; + p->aUp[0].WrOff = 0u; +#if 1 /* << EST */ + p->aUp[0].Flags = SEGGER_RTT_CHANNEL_0_MODE_UP; +#else + p->aUp[0].Flags = SEGGER_RTT_MODE_DEFAULT; +#endif + // + // Initialize down buffer 0 + // + p->aDown[0].sName = "Terminal"; + p->aDown[0].pBuffer = _acDownBuffer; + p->aDown[0].SizeOfBuffer = sizeof(_acDownBuffer); + p->aDown[0].RdOff = 0u; + p->aDown[0].WrOff = 0u; +#if 1 /* << EST */ + p->aDown[0].Flags = SEGGER_RTT_CHANNEL_0_MODE_DOWN; +#else + p->aDown[0].Flags = SEGGER_RTT_MODE_DEFAULT; +#endif + // + // Finish initialization of the control block. + // Copy Id string in three steps to make sure "SEGGER RTT" is not found + // in initializer memory (usually flash) by J-Link + // + STRCPY((char*)&p->acID[7], "RTT"); + RTT__DMB(); // Force order of memory accessed inside core for cores that allow to change the order + STRCPY((char*)&p->acID[0], "SEGGER"); + RTT__DMB(); // Force order of memory accessed inside core for cores that allow to change the order + p->acID[6] = ' '; + RTT__DMB(); // Force order of memory accessed inside core for cores that allow to change the order +} + +/********************************************************************* +* +* _WriteBlocking() +* +* Function description +* Stores a specified number of characters in SEGGER RTT ring buffer +* and updates the associated write pointer which is periodically +* read by the host. +* The caller is responsible for managing the write chunk sizes as +* _WriteBlocking() will block until all data has been posted successfully. +* +* Parameters +* pRing Ring buffer to post to. +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* +* Return value +* >= 0 - Number of bytes written into buffer. +*/ +static unsigned _WriteBlocking(SEGGER_RTT_BUFFER_UP* pRing, const char* pBuffer, unsigned NumBytes) { + unsigned NumBytesToWrite; + unsigned NumBytesWritten; + unsigned RdOff; + unsigned WrOff; + volatile char* pDst; + // + // Write data to buffer and handle wrap-around if necessary + // + NumBytesWritten = 0u; + WrOff = pRing->WrOff; + do { + RdOff = pRing->RdOff; // May be changed by host (debug probe) in the meantime + if (RdOff > WrOff) { + NumBytesToWrite = RdOff - WrOff - 1u; + } else { + NumBytesToWrite = pRing->SizeOfBuffer - (WrOff - RdOff + 1u); + } + NumBytesToWrite = MIN(NumBytesToWrite, (pRing->SizeOfBuffer - WrOff)); // Number of bytes that can be written until buffer wrap-around + NumBytesToWrite = MIN(NumBytesToWrite, NumBytes); + pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + NumBytesWritten += NumBytesToWrite; + NumBytes -= NumBytesToWrite; + WrOff += NumBytesToWrite; + while (NumBytesToWrite--) { + *pDst++ = *pBuffer++; + }; +#else + SEGGER_RTT_MEMCPY((void*)pDst, pBuffer, NumBytesToWrite); + NumBytesWritten += NumBytesToWrite; + pBuffer += NumBytesToWrite; + NumBytes -= NumBytesToWrite; + WrOff += NumBytesToWrite; +#endif + if (WrOff == pRing->SizeOfBuffer) { + WrOff = 0u; + } + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = WrOff; + } while (NumBytes); + return NumBytesWritten; +} + +/********************************************************************* +* +* _WriteNoCheck() +* +* Function description +* Stores a specified number of characters in SEGGER RTT ring buffer +* and updates the associated write pointer which is periodically +* read by the host. +* It is callers responsibility to make sure data actually fits in buffer. +* +* Parameters +* pRing Ring buffer to post to. +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* +* Notes +* (1) If there might not be enough space in the "Up"-buffer, call _WriteBlocking +*/ +static void _WriteNoCheck(SEGGER_RTT_BUFFER_UP* pRing, const char* pData, unsigned NumBytes) { + unsigned NumBytesAtOnce; + unsigned WrOff; + unsigned Rem; + volatile char* pDst; + + WrOff = pRing->WrOff; + Rem = pRing->SizeOfBuffer - WrOff; + if (Rem > NumBytes) { + // + // All data fits before wrap around + // + pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + WrOff += NumBytes; + while (NumBytes--) { + *pDst++ = *pData++; + }; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = WrOff; +#else + SEGGER_RTT_MEMCPY((void*)pDst, pData, NumBytes); + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = WrOff + NumBytes; +#endif + } else { + // + // We reach the end of the buffer, so need to wrap around + // +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; + NumBytesAtOnce = Rem; + while (NumBytesAtOnce--) { + *pDst++ = *pData++; + }; + pDst = pRing->pBuffer + SEGGER_RTT_UNCACHED_OFF; + NumBytesAtOnce = NumBytes - Rem; + while (NumBytesAtOnce--) { + *pDst++ = *pData++; + }; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = NumBytes - Rem; +#else + NumBytesAtOnce = Rem; + pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; + SEGGER_RTT_MEMCPY((void*)pDst, pData, NumBytesAtOnce); + NumBytesAtOnce = NumBytes - Rem; + pDst = pRing->pBuffer + SEGGER_RTT_UNCACHED_OFF; + SEGGER_RTT_MEMCPY((void*)pDst, pData + Rem, NumBytesAtOnce); + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = NumBytesAtOnce; +#endif + } +} + +/********************************************************************* +* +* _PostTerminalSwitch() +* +* Function description +* Switch terminal to the given terminal ID. It is the caller's +* responsibility to ensure the terminal ID is correct and there is +* enough space in the buffer for this to complete successfully. +* +* Parameters +* pRing Ring buffer to post to. +* TerminalId Terminal ID to switch to. +*/ +static void _PostTerminalSwitch(SEGGER_RTT_BUFFER_UP* pRing, unsigned char TerminalId) { + unsigned char ac[2]; + + ac[0] = 0xFFu; + ac[1] = _aTerminalId[TerminalId]; // Caller made already sure that TerminalId does not exceed our terminal limit + _WriteBlocking(pRing, (const char*)ac, 2u); +} + +/********************************************************************* +* +* _GetAvailWriteSpace() +* +* Function description +* Returns the number of bytes that can be written to the ring +* buffer without blocking. +* +* Parameters +* pRing Ring buffer to check. +* +* Return value +* Number of bytes that are free in the buffer. +*/ +static unsigned _GetAvailWriteSpace(SEGGER_RTT_BUFFER_UP* pRing) { + unsigned RdOff; + unsigned WrOff; + unsigned r; + // + // Avoid warnings regarding volatile access order. It's not a problem + // in this case, but dampen compiler enthusiasm. + // + RdOff = pRing->RdOff; + WrOff = pRing->WrOff; + if (RdOff <= WrOff) { + r = pRing->SizeOfBuffer - 1u - WrOff + RdOff; + } else { + r = RdOff - WrOff - 1u; + } + return r; +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ + +/********************************************************************* +* +* SEGGER_RTT_ReadUpBufferNoLock() +* +* Function description +* Reads characters from SEGGER real-time-terminal control block +* which have been previously stored by the application. +* Do not lock against interrupts and multiple access. +* Used to do the same operation that J-Link does, to transfer +* RTT data via other channels, such as TCP/IP or UART. +* +* Parameters +* BufferIndex Index of Up-buffer to be used. +* pBuffer Pointer to buffer provided by target application, to copy characters from RTT-up-buffer to. +* BufferSize Size of the target application buffer. +* +* Return value +* Number of bytes that have been read. +* +* Additional information +* This function must not be called when J-Link might also do RTT. +*/ +unsigned SEGGER_RTT_ReadUpBufferNoLock(unsigned BufferIndex, void* pData, unsigned BufferSize) { + unsigned NumBytesRem; + unsigned NumBytesRead; + unsigned RdOff; + unsigned WrOff; + unsigned char* pBuffer; + SEGGER_RTT_BUFFER_UP* pRing; + volatile char* pSrc; + + INIT(); + pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + pBuffer = (unsigned char*)pData; + RdOff = pRing->RdOff; + WrOff = pRing->WrOff; + NumBytesRead = 0u; + // + // Read from current read position to wrap-around of buffer, first + // + if (RdOff > WrOff) { + NumBytesRem = pRing->SizeOfBuffer - RdOff; + NumBytesRem = MIN(NumBytesRem, BufferSize); + pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + NumBytesRead += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; + while (NumBytesRem--) { + *pBuffer++ = *pSrc++; + }; +#else + SEGGER_RTT_MEMCPY(pBuffer, (void*)pSrc, NumBytesRem); + NumBytesRead += NumBytesRem; + pBuffer += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; +#endif + // + // Handle wrap-around of buffer + // + if (RdOff == pRing->SizeOfBuffer) { + RdOff = 0u; + } + } + // + // Read remaining items of buffer + // + NumBytesRem = WrOff - RdOff; + NumBytesRem = MIN(NumBytesRem, BufferSize); + if (NumBytesRem > 0u) { + pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + NumBytesRead += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; + while (NumBytesRem--) { + *pBuffer++ = *pSrc++; + }; +#else + SEGGER_RTT_MEMCPY(pBuffer, (void*)pSrc, NumBytesRem); + NumBytesRead += NumBytesRem; + pBuffer += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; +#endif + } + // + // Update read offset of buffer + // + if (NumBytesRead) { + pRing->RdOff = RdOff; + } + // + return NumBytesRead; +} + +/********************************************************************* +* +* SEGGER_RTT_ReadNoLock() +* +* Function description +* Reads characters from SEGGER real-time-terminal control block +* which have been previously stored by the host. +* Do not lock against interrupts and multiple access. +* +* Parameters +* BufferIndex Index of Down-buffer to be used (e.g. 0 for "Terminal"). +* pBuffer Pointer to buffer provided by target application, to copy characters from RTT-down-buffer to. +* BufferSize Size of the target application buffer. +* +* Return value +* Number of bytes that have been read. +*/ +unsigned SEGGER_RTT_ReadNoLock(unsigned BufferIndex, void* pData, unsigned BufferSize) { + unsigned NumBytesRem; + unsigned NumBytesRead; + unsigned RdOff; + unsigned WrOff; + unsigned char* pBuffer; + SEGGER_RTT_BUFFER_DOWN* pRing; + volatile char* pSrc; + // + INIT(); + pRing = (SEGGER_RTT_BUFFER_DOWN*)((char*)&_SEGGER_RTT.aDown[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + pBuffer = (unsigned char*)pData; + RdOff = pRing->RdOff; + WrOff = pRing->WrOff; + NumBytesRead = 0u; + // + // Read from current read position to wrap-around of buffer, first + // + if (RdOff > WrOff) { + NumBytesRem = pRing->SizeOfBuffer - RdOff; + NumBytesRem = MIN(NumBytesRem, BufferSize); + pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + NumBytesRead += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; + while (NumBytesRem--) { + *pBuffer++ = *pSrc++; + }; +#else + SEGGER_RTT_MEMCPY(pBuffer, (void*)pSrc, NumBytesRem); + NumBytesRead += NumBytesRem; + pBuffer += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; +#endif + // + // Handle wrap-around of buffer + // + if (RdOff == pRing->SizeOfBuffer) { + RdOff = 0u; + } + } + // + // Read remaining items of buffer + // + NumBytesRem = WrOff - RdOff; + NumBytesRem = MIN(NumBytesRem, BufferSize); + if (NumBytesRem > 0u) { + pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + NumBytesRead += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; + while (NumBytesRem--) { + *pBuffer++ = *pSrc++; + }; +#else + SEGGER_RTT_MEMCPY(pBuffer, (void*)pSrc, NumBytesRem); + NumBytesRead += NumBytesRem; + pBuffer += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; +#endif + } + if (NumBytesRead) { + pRing->RdOff = RdOff; + } + // + return NumBytesRead; +} + +/********************************************************************* +* +* SEGGER_RTT_ReadUpBuffer +* +* Function description +* Reads characters from SEGGER real-time-terminal control block +* which have been previously stored by the application. +* Used to do the same operation that J-Link does, to transfer +* RTT data via other channels, such as TCP/IP or UART. +* +* Parameters +* BufferIndex Index of Up-buffer to be used. +* pBuffer Pointer to buffer provided by target application, to copy characters from RTT-up-buffer to. +* BufferSize Size of the target application buffer. +* +* Return value +* Number of bytes that have been read. +* +* Additional information +* This function must not be called when J-Link might also do RTT. +* This function locks against all other RTT operations. I.e. during +* the read operation, writing is also locked. +* If only one consumer reads from the up buffer, +* call sEGGER_RTT_ReadUpBufferNoLock() instead. +*/ +unsigned SEGGER_RTT_ReadUpBuffer(unsigned BufferIndex, void* pBuffer, unsigned BufferSize) { + unsigned NumBytesRead; + + SEGGER_RTT_LOCK(); + // + // Call the non-locking read function + // + NumBytesRead = SEGGER_RTT_ReadUpBufferNoLock(BufferIndex, pBuffer, BufferSize); + // + // Finish up. + // + SEGGER_RTT_UNLOCK(); + // + return NumBytesRead; +} + +/********************************************************************* +* +* SEGGER_RTT_Read +* +* Function description +* Reads characters from SEGGER real-time-terminal control block +* which have been previously stored by the host. +* +* Parameters +* BufferIndex Index of Down-buffer to be used (e.g. 0 for "Terminal"). +* pBuffer Pointer to buffer provided by target application, to copy characters from RTT-down-buffer to. +* BufferSize Size of the target application buffer. +* +* Return value +* Number of bytes that have been read. +*/ +unsigned SEGGER_RTT_Read(unsigned BufferIndex, void* pBuffer, unsigned BufferSize) { + unsigned NumBytesRead; + + SEGGER_RTT_LOCK(); + // + // Call the non-locking read function + // + NumBytesRead = SEGGER_RTT_ReadNoLock(BufferIndex, pBuffer, BufferSize); + // + // Finish up. + // + SEGGER_RTT_UNLOCK(); + // + return NumBytesRead; +} + +/********************************************************************* +* +* SEGGER_RTT_WriteWithOverwriteNoLock +* +* Function description +* Stores a specified number of characters in SEGGER RTT +* control block. +* SEGGER_RTT_WriteWithOverwriteNoLock does not lock the application +* and overwrites data if the data does not fit into the buffer. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* +* Notes +* (1) If there is not enough space in the "Up"-buffer, data is overwritten. +* (2) For performance reasons this function does not call Init() +* and may only be called after RTT has been initialized. +* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. +* (3) Do not use SEGGER_RTT_WriteWithOverwriteNoLock if a J-Link +* connection reads RTT data. +*/ +void SEGGER_RTT_WriteWithOverwriteNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { + const char* pData; + SEGGER_RTT_BUFFER_UP* pRing; + unsigned Avail; + volatile char* pDst; + // + // Get "to-host" ring buffer and copy some elements into local variables. + // + pData = (const char *)pBuffer; + pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + // + // Check if we will overwrite data and need to adjust the RdOff. + // + if (pRing->WrOff == pRing->RdOff) { + Avail = pRing->SizeOfBuffer - 1u; + } else if ( pRing->WrOff < pRing->RdOff) { + Avail = pRing->RdOff - pRing->WrOff - 1u; + } else { + Avail = pRing->RdOff - pRing->WrOff - 1u + pRing->SizeOfBuffer; + } + if (NumBytes > Avail) { + pRing->RdOff += (NumBytes - Avail); + while (pRing->RdOff >= pRing->SizeOfBuffer) { + pRing->RdOff -= pRing->SizeOfBuffer; + } + } + // + // Write all data, no need to check the RdOff, but possibly handle multiple wrap-arounds + // + Avail = pRing->SizeOfBuffer - pRing->WrOff; + do { + if (Avail > NumBytes) { + // + // Last round + // + pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + Avail = NumBytes; + while (NumBytes--) { + *pDst++ = *pData++; + }; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff += Avail; +#else + SEGGER_RTT_MEMCPY((void*)pDst, pData, NumBytes); + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff += NumBytes; +#endif + break; + } else { + // + // Wrap-around necessary, write until wrap-around and reset WrOff + // + pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + NumBytes -= Avail; + while (Avail--) { + *pDst++ = *pData++; + }; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = 0; +#else + SEGGER_RTT_MEMCPY((void*)pDst, pData, Avail); + pData += Avail; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = 0; + NumBytes -= Avail; +#endif + Avail = (pRing->SizeOfBuffer - 1); + } + } while (NumBytes); +} + +/********************************************************************* +* +* SEGGER_RTT_WriteSkipNoLock +* +* Function description +* Stores a specified number of characters in SEGGER RTT +* control block which is then read by the host. +* SEGGER_RTT_WriteSkipNoLock does not lock the application and +* skips all data, if the data does not fit into the buffer. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* MUST be > 0!!! +* This is done for performance reasons, so no initial check has do be done. +* +* Return value +* 1: Data has been copied +* 0: No space, data has not been copied +* +* Notes +* (1) If there is not enough space in the "Up"-buffer, all data is dropped. +* (2) For performance reasons this function does not call Init() +* and may only be called after RTT has been initialized. +* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. +*/ +#if (RTT_USE_ASM == 0) +unsigned SEGGER_RTT_WriteSkipNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { + const char* pData; + SEGGER_RTT_BUFFER_UP* pRing; + unsigned Avail; + unsigned RdOff; + unsigned WrOff; + unsigned Rem; + volatile char* pDst; + // + // Cases: + // 1) RdOff <= WrOff => Space until wrap-around is sufficient + // 2) RdOff <= WrOff => Space after wrap-around needed (copy in 2 chunks) + // 3) RdOff < WrOff => No space in buf + // 4) RdOff > WrOff => Space is sufficient + // 5) RdOff > WrOff => No space in buf + // + // 1) is the most common case for large buffers and assuming that J-Link reads the data fast enough + // + pData = (const char *)pBuffer; + pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + RdOff = pRing->RdOff; + WrOff = pRing->WrOff; + if (RdOff <= WrOff) { // Case 1), 2) or 3) + Avail = pRing->SizeOfBuffer - WrOff - 1u; // Space until wrap-around (assume 1 byte not usable for case that RdOff == 0) + if (Avail >= NumBytes) { // Case 1)? +CopyStraight: + pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; + memcpy((void*)pDst, pData, NumBytes); + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = WrOff + NumBytes; + return 1; + } + Avail += RdOff; // Space incl. wrap-around + if (Avail >= NumBytes) { // Case 2? => If not, we have case 3) (does not fit) + Rem = pRing->SizeOfBuffer - WrOff; // Space until end of buffer + pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; + memcpy((void*)pDst, pData, Rem); // Copy 1st chunk + NumBytes -= Rem; + // + // Special case: First check that assumed RdOff == 0 calculated that last element before wrap-around could not be used + // But 2nd check (considering space until wrap-around and until RdOff) revealed that RdOff is not 0, so we can use the last element + // In this case, we may use a copy straight until buffer end anyway without needing to copy 2 chunks + // Therefore, check if 2nd memcpy is necessary at all + // + if (NumBytes) { + pDst = pRing->pBuffer + SEGGER_RTT_UNCACHED_OFF; + memcpy((void*)pDst, pData + Rem, NumBytes); + } + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = NumBytes; + return 1; + } + } else { // Potential case 4) + Avail = RdOff - WrOff - 1u; + if (Avail >= NumBytes) { // Case 4)? => If not, we have case 5) (does not fit) + goto CopyStraight; // << EST @suppress("Goto statement used") + } + } + return 0; // No space in buffer +} +#endif + +/********************************************************************* +* +* SEGGER_RTT_WriteDownBufferNoLock +* +* Function description +* Stores a specified number of characters in SEGGER RTT +* control block inside a buffer. +* SEGGER_RTT_WriteDownBufferNoLock does not lock the application. +* Used to do the same operation that J-Link does, to transfer +* RTT data from other channels, such as TCP/IP or UART. +* +* Parameters +* BufferIndex Index of "Down"-buffer to be used. +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* +* Return value +* Number of bytes which have been stored in the "Down"-buffer. +* +* Notes +* (1) Data is stored according to buffer flags. +* (2) For performance reasons this function does not call Init() +* and may only be called after RTT has been initialized. +* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. +* +* Additional information +* This function must not be called when J-Link might also do RTT. +*/ +unsigned SEGGER_RTT_WriteDownBufferNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { + unsigned Status; + unsigned Avail; + const char* pData; + SEGGER_RTT_BUFFER_UP* pRing; + // + // Get "to-target" ring buffer. + // It is save to cast that to a "to-host" buffer. Up and Down buffer differ in volatility of offsets that might be modified by J-Link. + // + pData = (const char *)pBuffer; + pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aDown[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + // + // How we output depends upon the mode... + // + switch (pRing->Flags) { + case SEGGER_RTT_MODE_NO_BLOCK_SKIP: + // + // If we are in skip mode and there is no space for the whole + // of this output, don't bother. + // + Avail = _GetAvailWriteSpace(pRing); + if (Avail < NumBytes) { + Status = 0u; + } else { + Status = NumBytes; + _WriteNoCheck(pRing, pData, NumBytes); + } + break; + case SEGGER_RTT_MODE_NO_BLOCK_TRIM: + // + // If we are in trim mode, trim to what we can output without blocking. + // + Avail = _GetAvailWriteSpace(pRing); + Status = Avail < NumBytes ? Avail : NumBytes; + _WriteNoCheck(pRing, pData, Status); + break; + case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL: + // + // If we are in blocking mode, output everything. + // + Status = _WriteBlocking(pRing, pData, NumBytes); + break; + default: + Status = 0u; + break; + } + // + // Finish up. + // + return Status; +} + +/********************************************************************* +* +* SEGGER_RTT_WriteNoLock +* +* Function description +* Stores a specified number of characters in SEGGER RTT +* control block which is then read by the host. +* SEGGER_RTT_WriteNoLock does not lock the application. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* +* Return value +* Number of bytes which have been stored in the "Up"-buffer. +* +* Notes +* (1) Data is stored according to buffer flags. +* (2) For performance reasons this function does not call Init() +* and may only be called after RTT has been initialized. +* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. +*/ +unsigned SEGGER_RTT_WriteNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { + unsigned Status; + unsigned Avail; + const char* pData; + SEGGER_RTT_BUFFER_UP* pRing; + // + // Get "to-host" ring buffer. + // + pData = (const char *)pBuffer; + pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + // + // How we output depends upon the mode... + // + switch (pRing->Flags) { + case SEGGER_RTT_MODE_NO_BLOCK_SKIP: + // + // If we are in skip mode and there is no space for the whole + // of this output, don't bother. + // + Avail = _GetAvailWriteSpace(pRing); + if (Avail < NumBytes) { + Status = 0u; + } else { + Status = NumBytes; + _WriteNoCheck(pRing, pData, NumBytes); + } + break; + case SEGGER_RTT_MODE_NO_BLOCK_TRIM: + // + // If we are in trim mode, trim to what we can output without blocking. + // + Avail = _GetAvailWriteSpace(pRing); + Status = Avail < NumBytes ? Avail : NumBytes; + _WriteNoCheck(pRing, pData, Status); + break; + case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL: + // + // If we are in blocking mode, output everything. + // + Status = _WriteBlocking(pRing, pData, NumBytes); + break; + default: + Status = 0u; + break; + } + // + // Finish up. + // + return Status; +} + +/********************************************************************* +* +* SEGGER_RTT_WriteDownBuffer +* +* Function description +* Stores a specified number of characters in SEGGER RTT control block in a buffer. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* +* Return value +* Number of bytes which have been stored in the "Down"-buffer. +* +* Notes +* (1) Data is stored according to buffer flags. +* +* Additional information +* This function must not be called when J-Link might also do RTT. +* This function locks against all other RTT operations. I.e. during +* the write operation, writing from the application is also locked. +* If only one consumer writes to the down buffer, +* call SEGGER_RTT_WriteDownBufferNoLock() instead. +*/ +unsigned SEGGER_RTT_WriteDownBuffer(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { + unsigned Status; + + INIT(); + SEGGER_RTT_LOCK(); + Status = SEGGER_RTT_WriteDownBufferNoLock(BufferIndex, pBuffer, NumBytes); // Call the non-locking write function + SEGGER_RTT_UNLOCK(); + return Status; +} + +/********************************************************************* +* +* SEGGER_RTT_Write +* +* Function description +* Stores a specified number of characters in SEGGER RTT +* control block which is then read by the host. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* +* Return value +* Number of bytes which have been stored in the "Up"-buffer. +* +* Notes +* (1) Data is stored according to buffer flags. +*/ +unsigned SEGGER_RTT_Write(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { + unsigned Status; + + INIT(); + SEGGER_RTT_LOCK(); + Status = SEGGER_RTT_WriteNoLock(BufferIndex, pBuffer, NumBytes); // Call the non-locking write function + SEGGER_RTT_UNLOCK(); + return Status; +} + +/********************************************************************* +* +* SEGGER_RTT_WriteString +* +* Function description +* Stores string in SEGGER RTT control block. +* This data is read by the host. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* s Pointer to string. +* +* Return value +* Number of bytes which have been stored in the "Up"-buffer. +* +* Notes +* (1) Data is stored according to buffer flags. +* (2) String passed to this function has to be \0 terminated +* (3) \0 termination character is *not* stored in RTT buffer +*/ +unsigned SEGGER_RTT_WriteString(unsigned BufferIndex, const char* s) { + unsigned Len; + + Len = STRLEN(s); + return SEGGER_RTT_Write(BufferIndex, s, Len); +} + +/********************************************************************* +* +* SEGGER_RTT_PutCharSkipNoLock +* +* Function description +* Stores a single character/byte in SEGGER RTT buffer. +* SEGGER_RTT_PutCharSkipNoLock does not lock the application and +* skips the byte, if it does not fit into the buffer. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* c Byte to be stored. +* +* Return value +* Number of bytes which have been stored in the "Up"-buffer. +* +* Notes +* (1) If there is not enough space in the "Up"-buffer, the character is dropped. +* (2) For performance reasons this function does not call Init() +* and may only be called after RTT has been initialized. +* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. +*/ + +unsigned SEGGER_RTT_PutCharSkipNoLock(unsigned BufferIndex, char c) { + SEGGER_RTT_BUFFER_UP* pRing; + unsigned WrOff; + unsigned Status; + volatile char* pDst; + // + // Get "to-host" ring buffer. + // + pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + // + // Get write position and handle wrap-around if necessary + // + WrOff = pRing->WrOff + 1; + if (WrOff == pRing->SizeOfBuffer) { + WrOff = 0; + } + // + // Output byte if free space is available + // + if (WrOff != pRing->RdOff) { + pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; + *pDst = c; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = WrOff; + Status = 1; + } else { + Status = 0; + } + // + return Status; +} + +/********************************************************************* +* +* SEGGER_RTT_PutCharSkip +* +* Function description +* Stores a single character/byte in SEGGER RTT buffer. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* c Byte to be stored. +* +* Return value +* Number of bytes which have been stored in the "Up"-buffer. +* +* Notes +* (1) If there is not enough space in the "Up"-buffer, the character is dropped. +*/ + +unsigned SEGGER_RTT_PutCharSkip(unsigned BufferIndex, char c) { + SEGGER_RTT_BUFFER_UP* pRing; + unsigned WrOff; + unsigned Status; + volatile char* pDst; + // + // Prepare + // + INIT(); + SEGGER_RTT_LOCK(); + // + // Get "to-host" ring buffer. + // + pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + // + // Get write position and handle wrap-around if necessary + // + WrOff = pRing->WrOff + 1; + if (WrOff == pRing->SizeOfBuffer) { + WrOff = 0; + } + // + // Output byte if free space is available + // + if (WrOff != pRing->RdOff) { + pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; + *pDst = c; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = WrOff; + Status = 1; + } else { + Status = 0; + } + // + // Finish up. + // + SEGGER_RTT_UNLOCK(); + // + return Status; +} + + /********************************************************************* +* +* SEGGER_RTT_PutChar +* +* Function description +* Stores a single character/byte in SEGGER RTT buffer. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* c Byte to be stored. +* +* Return value +* Number of bytes which have been stored in the "Up"-buffer. +* +* Notes +* (1) Data is stored according to buffer flags. +*/ + +unsigned SEGGER_RTT_PutChar(unsigned BufferIndex, char c) { + SEGGER_RTT_BUFFER_UP* pRing; + unsigned WrOff; + unsigned Status; + volatile char* pDst; + // + // Prepare + // + INIT(); + SEGGER_RTT_LOCK(); + // + // Get "to-host" ring buffer. + // + pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + // + // Get write position and handle wrap-around if necessary + // + WrOff = pRing->WrOff + 1; + if (WrOff == pRing->SizeOfBuffer) { + WrOff = 0; + } + // + // Wait for free space if mode is set to blocking + // + if (pRing->Flags == SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL) { + while (WrOff == pRing->RdOff) { + ; + } + } + // + // Output byte if free space is available + // + if (WrOff != pRing->RdOff) { + pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; + *pDst = c; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = WrOff; + Status = 1; + } else { + Status = 0; + } + // + // Finish up. + // + SEGGER_RTT_UNLOCK(); + return Status; +} + +/********************************************************************* +* +* SEGGER_RTT_GetKey +* +* Function description +* Reads one character from the SEGGER RTT buffer. +* Host has previously stored data there. +* +* Return value +* < 0 - No character available (buffer empty). +* >= 0 - Character which has been read. (Possible values: 0 - 255) +* +* Notes +* (1) This function is only specified for accesses to RTT buffer 0. +*/ +int SEGGER_RTT_GetKey(void) { + char c; + int r; + + r = (int)SEGGER_RTT_Read(0u, &c, 1u); + if (r == 1) { + r = (int)(unsigned char)c; + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_WaitKey +* +* Function description +* Waits until at least one character is avaible in the SEGGER RTT buffer. +* Once a character is available, it is read and this function returns. +* +* Return value +* >=0 - Character which has been read. +* +* Notes +* (1) This function is only specified for accesses to RTT buffer 0 +* (2) This function is blocking if no character is present in RTT buffer +*/ +int SEGGER_RTT_WaitKey(void) { + int r; + + do { + r = SEGGER_RTT_GetKey(); + } while (r < 0); + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_HasKey +* +* Function description +* Checks if at least one character for reading is available in the SEGGER RTT buffer. +* +* Return value +* == 0 - No characters are available to read. +* == 1 - At least one character is available. +* +* Notes +* (1) This function is only specified for accesses to RTT buffer 0 +*/ +int SEGGER_RTT_HasKey(void) { + SEGGER_RTT_BUFFER_DOWN* pRing; + unsigned RdOff; + int r; + + INIT(); + pRing = (SEGGER_RTT_BUFFER_DOWN*)((char*)&_SEGGER_RTT.aDown[0] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + RdOff = pRing->RdOff; + if (RdOff != pRing->WrOff) { + r = 1; + } else { + r = 0; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_HasData +* +* Function description +* Check if there is data from the host in the given buffer. +* +* Return value: +* ==0: No data +* !=0: Data in buffer +* +*/ +unsigned SEGGER_RTT_HasData(unsigned BufferIndex) { + SEGGER_RTT_BUFFER_DOWN* pRing; + unsigned v; + + pRing = (SEGGER_RTT_BUFFER_DOWN*)((char*)&_SEGGER_RTT.aDown[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + v = pRing->WrOff; + return v - pRing->RdOff; +} + +/********************************************************************* +* +* SEGGER_RTT_HasDataUp +* +* Function description +* Check if there is data remaining to be sent in the given buffer. +* +* Return value: +* ==0: No data +* !=0: Data in buffer +* +*/ +unsigned SEGGER_RTT_HasDataUp(unsigned BufferIndex) { + SEGGER_RTT_BUFFER_UP* pRing; + unsigned v; + + pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + v = pRing->RdOff; + return pRing->WrOff - v; +} + +/********************************************************************* +* +* SEGGER_RTT_AllocDownBuffer +* +* Function description +* Run-time configuration of the next down-buffer (H->T). +* The next buffer, which is not used yet is configured. +* This includes: Buffer address, size, name, flags, ... +* +* Parameters +* sName Pointer to a constant name string. +* pBuffer Pointer to a buffer to be used. +* BufferSize Size of the buffer. +* Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). +* +* Return value +* >= 0 - O.K. Buffer Index +* < 0 - Error +*/ +int SEGGER_RTT_AllocDownBuffer(const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) { + int BufferIndex; + volatile SEGGER_RTT_CB* pRTTCB; + + INIT(); + SEGGER_RTT_LOCK(); + pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + BufferIndex = 0; + do { + if (pRTTCB->aDown[BufferIndex].pBuffer == NULL) { + break; + } + BufferIndex++; + } while (BufferIndex < pRTTCB->MaxNumDownBuffers); + if (BufferIndex < pRTTCB->MaxNumDownBuffers) { + pRTTCB->aDown[BufferIndex].sName = sName; + pRTTCB->aDown[BufferIndex].pBuffer = (char*)pBuffer; + pRTTCB->aDown[BufferIndex].SizeOfBuffer = BufferSize; + pRTTCB->aDown[BufferIndex].RdOff = 0u; + pRTTCB->aDown[BufferIndex].WrOff = 0u; + pRTTCB->aDown[BufferIndex].Flags = Flags; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + } else { + BufferIndex = -1; + } + SEGGER_RTT_UNLOCK(); + return BufferIndex; +} + +/********************************************************************* +* +* SEGGER_RTT_AllocUpBuffer +* +* Function description +* Run-time configuration of the next up-buffer (T->H). +* The next buffer, which is not used yet is configured. +* This includes: Buffer address, size, name, flags, ... +* +* Parameters +* sName Pointer to a constant name string. +* pBuffer Pointer to a buffer to be used. +* BufferSize Size of the buffer. +* Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). +* +* Return value +* >= 0 - O.K. Buffer Index +* < 0 - Error +*/ +int SEGGER_RTT_AllocUpBuffer(const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) { + int BufferIndex; + volatile SEGGER_RTT_CB* pRTTCB; + + INIT(); + SEGGER_RTT_LOCK(); + pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + BufferIndex = 0; + do { + if (pRTTCB->aUp[BufferIndex].pBuffer == NULL) { + break; + } + BufferIndex++; + } while (BufferIndex < pRTTCB->MaxNumUpBuffers); + if (BufferIndex < pRTTCB->MaxNumUpBuffers) { + pRTTCB->aUp[BufferIndex].sName = sName; + pRTTCB->aUp[BufferIndex].pBuffer = (char*)pBuffer; + pRTTCB->aUp[BufferIndex].SizeOfBuffer = BufferSize; + pRTTCB->aUp[BufferIndex].RdOff = 0u; + pRTTCB->aUp[BufferIndex].WrOff = 0u; + pRTTCB->aUp[BufferIndex].Flags = Flags; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + } else { + BufferIndex = -1; + } + SEGGER_RTT_UNLOCK(); + return BufferIndex; +} + +/********************************************************************* +* +* SEGGER_RTT_ConfigUpBuffer +* +* Function description +* Run-time configuration of a specific up-buffer (T->H). +* Buffer to be configured is specified by index. +* This includes: Buffer address, size, name, flags, ... +* +* Parameters +* BufferIndex Index of the buffer to configure. +* sName Pointer to a constant name string. +* pBuffer Pointer to a buffer to be used. +* BufferSize Size of the buffer. +* Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). +* +* Return value +* >= 0 - O.K. +* < 0 - Error +* +* Additional information +* Buffer 0 is configured on compile-time. +* May only be called once per buffer. +* Buffer name and flags can be reconfigured using the appropriate functions. +*/ +int SEGGER_RTT_ConfigUpBuffer(unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) { + int r; + volatile SEGGER_RTT_CB* pRTTCB; + + INIT(); + pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + if (BufferIndex < (unsigned)pRTTCB->MaxNumUpBuffers) { + SEGGER_RTT_LOCK(); + if (BufferIndex > 0u && SEGGER_RTT_MAX_NUM_UP_BUFFERS>1) { /* << EST additional check to avoid gcc warning with -Os */ + pRTTCB->aUp[BufferIndex].sName = sName; + pRTTCB->aUp[BufferIndex].pBuffer = (char*)pBuffer; + pRTTCB->aUp[BufferIndex].SizeOfBuffer = BufferSize; + pRTTCB->aUp[BufferIndex].RdOff = 0u; + pRTTCB->aUp[BufferIndex].WrOff = 0u; + } + pRTTCB->aUp[BufferIndex].Flags = Flags; + SEGGER_RTT_UNLOCK(); + r = 0; + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_ConfigDownBuffer +* +* Function description +* Run-time configuration of a specific down-buffer (H->T). +* Buffer to be configured is specified by index. +* This includes: Buffer address, size, name, flags, ... +* +* Parameters +* BufferIndex Index of the buffer to configure. +* sName Pointer to a constant name string. +* pBuffer Pointer to a buffer to be used. +* BufferSize Size of the buffer. +* Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). +* +* Return value +* >= 0 O.K. +* < 0 Error +* +* Additional information +* Buffer 0 is configured on compile-time. +* May only be called once per buffer. +* Buffer name and flags can be reconfigured using the appropriate functions. +*/ +int SEGGER_RTT_ConfigDownBuffer(unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) { + int r; + volatile SEGGER_RTT_CB* pRTTCB; + + INIT(); + pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + if (BufferIndex < (unsigned)pRTTCB->MaxNumDownBuffers) { + SEGGER_RTT_LOCK(); + if (BufferIndex > 0u && SEGGER_RTT_MAX_NUM_DOWN_BUFFERS>1) { /* << EST additional check to avoid gcc warning with -Os */ + pRTTCB->aDown[BufferIndex].sName = sName; + pRTTCB->aDown[BufferIndex].pBuffer = (char*)pBuffer; + pRTTCB->aDown[BufferIndex].SizeOfBuffer = BufferSize; + pRTTCB->aDown[BufferIndex].RdOff = 0u; + pRTTCB->aDown[BufferIndex].WrOff = 0u; + } + pRTTCB->aDown[BufferIndex].Flags = Flags; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + SEGGER_RTT_UNLOCK(); + r = 0; + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_SetNameUpBuffer +* +* Function description +* Run-time configuration of a specific up-buffer name (T->H). +* Buffer to be configured is specified by index. +* +* Parameters +* BufferIndex Index of the buffer to renamed. +* sName Pointer to a constant name string. +* +* Return value +* >= 0 O.K. +* < 0 Error +*/ +int SEGGER_RTT_SetNameUpBuffer(unsigned BufferIndex, const char* sName) { + int r; + volatile SEGGER_RTT_CB* pRTTCB; + + INIT(); + pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + if (BufferIndex < (unsigned)pRTTCB->MaxNumUpBuffers) { + SEGGER_RTT_LOCK(); + pRTTCB->aUp[BufferIndex].sName = sName; + SEGGER_RTT_UNLOCK(); + r = 0; + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_SetNameDownBuffer +* +* Function description +* Run-time configuration of a specific Down-buffer name (T->H). +* Buffer to be configured is specified by index. +* +* Parameters +* BufferIndex Index of the buffer to renamed. +* sName Pointer to a constant name string. +* +* Return value +* >= 0 O.K. +* < 0 Error +*/ +int SEGGER_RTT_SetNameDownBuffer(unsigned BufferIndex, const char* sName) { + int r; + volatile SEGGER_RTT_CB* pRTTCB; + + INIT(); + pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + if (BufferIndex < (unsigned)pRTTCB->MaxNumDownBuffers) { + SEGGER_RTT_LOCK(); + pRTTCB->aDown[BufferIndex].sName = sName; + SEGGER_RTT_UNLOCK(); + r = 0; + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_SetFlagsUpBuffer +* +* Function description +* Run-time configuration of specific up-buffer flags (T->H). +* Buffer to be configured is specified by index. +* +* Parameters +* BufferIndex Index of the buffer. +* Flags Flags to set for the buffer. +* +* Return value +* >= 0 O.K. +* < 0 Error +*/ +int SEGGER_RTT_SetFlagsUpBuffer(unsigned BufferIndex, unsigned Flags) { + int r; + volatile SEGGER_RTT_CB* pRTTCB; + + INIT(); + pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + if (BufferIndex < (unsigned)pRTTCB->MaxNumUpBuffers) { + SEGGER_RTT_LOCK(); + pRTTCB->aUp[BufferIndex].Flags = Flags; + SEGGER_RTT_UNLOCK(); + r = 0; + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_SetFlagsDownBuffer +* +* Function description +* Run-time configuration of specific Down-buffer flags (T->H). +* Buffer to be configured is specified by index. +* +* Parameters +* BufferIndex Index of the buffer to renamed. +* Flags Flags to set for the buffer. +* +* Return value +* >= 0 O.K. +* < 0 Error +*/ +int SEGGER_RTT_SetFlagsDownBuffer(unsigned BufferIndex, unsigned Flags) { + int r; + volatile SEGGER_RTT_CB* pRTTCB; + + INIT(); + pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + if (BufferIndex < (unsigned)pRTTCB->MaxNumDownBuffers) { + SEGGER_RTT_LOCK(); + pRTTCB->aDown[BufferIndex].Flags = Flags; + SEGGER_RTT_UNLOCK(); + r = 0; + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_Init +* +* Function description +* Initializes the RTT Control Block. +* Should be used in RAM targets, at start of the application. +* +*/ +void SEGGER_RTT_Init (void) { + _DoInit(); +} + +/********************************************************************* +* +* SEGGER_RTT_SetTerminal +* +* Function description +* Sets the terminal to be used for output on channel 0. +* +* Parameters +* TerminalId Index of the terminal. +* +* Return value +* >= 0 O.K. +* < 0 Error (e.g. if RTT is configured for non-blocking mode and there was no space in the buffer to set the new terminal Id) +* +* Notes +* (1) Buffer 0 is always reserved for terminal I/O, so we can use index 0 here, fixed +*/ +int SEGGER_RTT_SetTerminal (unsigned char TerminalId) { + unsigned char ac[2]; + SEGGER_RTT_BUFFER_UP* pRing; + unsigned Avail; + int r; + + INIT(); + r = 0; + ac[0] = 0xFFu; + if (TerminalId < sizeof(_aTerminalId)) { // We only support a certain number of channels + ac[1] = _aTerminalId[TerminalId]; + pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[0] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + SEGGER_RTT_LOCK(); // Lock to make sure that no other task is writing into buffer, while we are and number of free bytes in buffer does not change downwards after checking and before writing + if ((pRing->Flags & SEGGER_RTT_MODE_MASK) == SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL) { + _ActiveTerminal = TerminalId; + _WriteBlocking(pRing, (const char*)ac, 2u); + } else { // Skipping mode or trim mode? => We cannot trim this command so handling is the same for both modes + Avail = _GetAvailWriteSpace(pRing); + if (Avail >= 2) { + _ActiveTerminal = TerminalId; // Only change active terminal in case of success + _WriteNoCheck(pRing, (const char*)ac, 2u); + } else { + r = -1; + } + } + SEGGER_RTT_UNLOCK(); + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_TerminalOut +* +* Function description +* Writes a string to the given terminal +* without changing the terminal for channel 0. +* +* Parameters +* TerminalId Index of the terminal. +* s String to be printed on the terminal. +* +* Return value +* >= 0 - Number of bytes written. +* < 0 - Error. +* +*/ +int SEGGER_RTT_TerminalOut (unsigned char TerminalId, const char* s) { + int Status; + unsigned FragLen; + unsigned Avail; + SEGGER_RTT_BUFFER_UP* pRing; + // + INIT(); + // + // Validate terminal ID. + // + if (TerminalId < (char)sizeof(_aTerminalId)) { // We only support a certain number of channels + // + // Get "to-host" ring buffer. + // + pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[0] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + // + // Need to be able to change terminal, write data, change back. + // Compute the fixed and variable sizes. + // + FragLen = STRLEN(s); + // + // How we output depends upon the mode... + // + SEGGER_RTT_LOCK(); + Avail = _GetAvailWriteSpace(pRing); + switch (pRing->Flags & SEGGER_RTT_MODE_MASK) { + case SEGGER_RTT_MODE_NO_BLOCK_SKIP: + // + // If we are in skip mode and there is no space for the whole + // of this output, don't bother switching terminals at all. + // + if (Avail < (FragLen + 4u)) { + Status = 0; + } else { + _PostTerminalSwitch(pRing, TerminalId); + Status = (int)_WriteBlocking(pRing, s, FragLen); + _PostTerminalSwitch(pRing, _ActiveTerminal); + } + break; + case SEGGER_RTT_MODE_NO_BLOCK_TRIM: + // + // If we are in trim mode and there is not enough space for everything, + // trim the output but always include the terminal switch. If no room + // for terminal switch, skip that totally. + // + if (Avail < 4u) { + Status = -1; + } else { + _PostTerminalSwitch(pRing, TerminalId); + Status = (int)_WriteBlocking(pRing, s, (FragLen < (Avail - 4u)) ? FragLen : (Avail - 4u)); + _PostTerminalSwitch(pRing, _ActiveTerminal); + } + break; + case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL: + // + // If we are in blocking mode, output everything. + // + _PostTerminalSwitch(pRing, TerminalId); + Status = (int)_WriteBlocking(pRing, s, FragLen); + _PostTerminalSwitch(pRing, _ActiveTerminal); + break; + default: + Status = -1; + break; + } + // + // Finish up. + // + SEGGER_RTT_UNLOCK(); + } else { + Status = -1; + } + return Status; +} + +/********************************************************************* +* +* SEGGER_RTT_GetAvailWriteSpace +* +* Function description +* Returns the number of bytes available in the ring buffer. +* +* Parameters +* BufferIndex Index of the up buffer. +* +* Return value +* Number of bytes that are free in the selected up buffer. +*/ +unsigned SEGGER_RTT_GetAvailWriteSpace (unsigned BufferIndex) { + SEGGER_RTT_BUFFER_UP* pRing; + + pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + return _GetAvailWriteSpace(pRing); +} + + +/********************************************************************* +* +* SEGGER_RTT_GetBytesInBuffer() +* +* Function description +* Returns the number of bytes currently used in the up buffer. +* +* Parameters +* BufferIndex Index of the up buffer. +* +* Return value +* Number of bytes that are used in the buffer. +*/ +unsigned SEGGER_RTT_GetBytesInBuffer(unsigned BufferIndex) { + unsigned RdOff; + unsigned WrOff; + unsigned r; + volatile SEGGER_RTT_CB* pRTTCB; + // + // Avoid warnings regarding volatile access order. It's not a problem + // in this case, but dampen compiler enthusiasm. + // + pRTTCB = (volatile SEGGER_RTT_CB*)((unsigned char*)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + RdOff = pRTTCB->aUp[BufferIndex].RdOff; + WrOff = pRTTCB->aUp[BufferIndex].WrOff; + if (RdOff <= WrOff) { + r = WrOff - RdOff; + } else { + r = pRTTCB->aUp[BufferIndex].SizeOfBuffer - (WrOff - RdOff); + } + return r; +} + +#if 1 /* << EST: extra function */ +unsigned int SEGGER_RTT_GetUpBufferFreeSize(unsigned int bufferIndex) { /* << EST */ + unsigned int avail; + + INIT(); + SEGGER_RTT_LOCK(); + avail = _GetAvailWriteSpace(&_SEGGER_RTT.aUp[bufferIndex]); + SEGGER_RTT_UNLOCK(); + return avail; +} +#endif +/*************************** End of file ****************************/ + + diff --git a/TSM_PicoW_Sensor/McuLib/SEGGER_RTT/SEGGER_RTT.h b/TSM_PicoW_Sensor/McuLib/SEGGER_RTT/SEGGER_RTT.h new file mode 100644 index 0000000..5c16471 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/SEGGER_RTT/SEGGER_RTT.h @@ -0,0 +1,424 @@ +/** Copyright (C) SEGGER Microcontroller GmbH */ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2019 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER RTT * Real Time Transfer for embedded targets * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the RTT protocol and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* RTT version: 6.86e * +* * +********************************************************************** + +---------------------------END-OF-HEADER------------------------------ +File : SEGGER_RTT.h +Purpose : Implementation of SEGGER real-time transfer which allows + real-time communication on targets which support debugger + memory accesses while the CPU is running. +Revision: $Rev: 20869 $ +---------------------------------------------------------------------- +*/ + +#ifndef SEGGER_RTT_H +#define SEGGER_RTT_H + +#include "SEGGER_RTT_Conf.h" + +/********************************************************************* +* +* Defines, defaults +* +********************************************************************** +*/ +#ifndef RTT_USE_ASM + #if (defined __SES_ARM) // SEGGER Embedded Studio + #define _CC_HAS_RTT_ASM_SUPPORT 1 + #elif (defined __CROSSWORKS_ARM) // Rowley Crossworks + #define _CC_HAS_RTT_ASM_SUPPORT 1 + #elif (defined __ARMCC_VERSION) // ARM compiler + #if (__ARMCC_VERSION >= 6000000) // ARM compiler V6.0 and later is clang based + #define _CC_HAS_RTT_ASM_SUPPORT 1 + #else + #define _CC_HAS_RTT_ASM_SUPPORT 0 + #endif + #elif (defined __GNUC__) // GCC + #define _CC_HAS_RTT_ASM_SUPPORT 1 + #elif (defined __clang__) // Clang compiler + #define _CC_HAS_RTT_ASM_SUPPORT 1 + #elif ((defined __IASMARM__) || (defined __ICCARM__)) // IAR assembler/compiler + #define _CC_HAS_RTT_ASM_SUPPORT 1 + #else + #define _CC_HAS_RTT_ASM_SUPPORT 0 + #endif + #if ((defined __IASMARM__) || (defined __ICCARM__)) // IAR assembler/compiler + // + // IAR assembler / compiler + // + #if (__VER__ < 6300000) + #define VOLATILE + #else + #define VOLATILE volatile + #endif + #if (defined __ARM7M__) // Needed for old versions that do not know the define yet + #if (__CORE__ == __ARM7M__) // Cortex-M3 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #endif + #endif + #if (defined __ARM7EM__) // Needed for old versions that do not know the define yet + #if (__CORE__ == __ARM7EM__) // Cortex-M4/M7 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() asm VOLATILE ("DMB"); + #endif + #endif + #if (defined __ARM8M_BASELINE__) // Needed for old versions that do not know the define yet + #if (__CORE__ == __ARM8M_BASELINE__) // Cortex-M23 + #define _CORE_HAS_RTT_ASM_SUPPORT 0 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() asm VOLATILE ("DMB"); + #endif + #endif + #if (defined __ARM8M_MAINLINE__) // Needed for old versions that do not know the define yet + #if (__CORE__ == __ARM8M_MAINLINE__) // Cortex-M33 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() asm VOLATILE ("DMB"); + #endif + #endif + #else + // + // GCC / Clang + // + #if (defined __ARM_ARCH_7M__) // Cortex-M3 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #elif (defined __ARM_ARCH_7EM__) // Cortex-M4/M7 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() __asm volatile ("dmb\n" : : :); + #elif (defined __ARM_ARCH_8M_BASE__) // Cortex-M23 + #define _CORE_HAS_RTT_ASM_SUPPORT 0 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() __asm volatile ("dmb\n" : : :); + #elif (defined __ARM_ARCH_8M_MAIN__) // Cortex-M33 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() __asm volatile ("dmb\n" : : :); + #else + #define _CORE_HAS_RTT_ASM_SUPPORT 0 + #endif + #endif + // + // If IDE and core support the ASM version, enable ASM version by default + // + #ifndef _CORE_HAS_RTT_ASM_SUPPORT + #define _CORE_HAS_RTT_ASM_SUPPORT 0 // Default for unknown cores + #endif + #if (_CC_HAS_RTT_ASM_SUPPORT && _CORE_HAS_RTT_ASM_SUPPORT) + #define RTT_USE_ASM (1) + #else + #define RTT_USE_ASM (0) + #endif +#endif + +// +// We need to know if a DMB is needed to make sure that on Cortex-M7 etc. +// the order of accesses to the ring buffers is guaranteed +// Needed for: Cortex-M7, Cortex-M23, Cortex-M33 +// +#ifndef _CORE_NEEDS_DMB + #define _CORE_NEEDS_DMB 0 +#endif + +#ifndef RTT__DMB + #if _CORE_NEEDS_DMB + #error "Don't know how to place inline assembly for DMB" + #else + #define RTT__DMB() + #endif +#endif + +#ifndef SEGGER_RTT_CPU_CACHE_LINE_SIZE + #define SEGGER_RTT_CPU_CACHE_LINE_SIZE (0) // On most target systems where RTT is used, we do not have a CPU cache, therefore 0 is a good default here +#endif + +#ifndef SEGGER_RTT_UNCACHED_OFF + #if SEGGER_RTT_CPU_CACHE_LINE_SIZE + #error "SEGGER_RTT_UNCACHED_OFF must be defined when setting SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" + #else + #define SEGGER_RTT_UNCACHED_OFF (0) + #endif +#endif +#if RTT_USE_ASM + #if SEGGER_RTT_CPU_CACHE_LINE_SIZE + #error "RTT_USE_ASM is not available if SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" + #endif +#endif + +#ifndef SEGGER_RTT_ASM // defined when SEGGER_RTT.h is included from assembly file +#include +#include + +/********************************************************************* +* +* Defines, fixed +* +********************************************************************** +*/ + +// +// Determine how much we must pad the control block to make it a multiple of a cache line in size +// Assuming: U8 = 1B +// U16 = 2B +// U32 = 4B +// U8/U16/U32* = 4B +// +#if SEGGER_RTT_CPU_CACHE_LINE_SIZE // Avoid division by zero in case we do not have any cache + #define SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(NumBytes) (((NumBytes + SEGGER_RTT_CPU_CACHE_LINE_SIZE - 1) / SEGGER_RTT_CPU_CACHE_LINE_SIZE) * SEGGER_RTT_CPU_CACHE_LINE_SIZE) +#else + #define SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(NumBytes) (NumBytes) +#endif +#define SEGGER_RTT__CB_SIZE (16 + 4 + 4 + (SEGGER_RTT_MAX_NUM_UP_BUFFERS * 24) + (SEGGER_RTT_MAX_NUM_DOWN_BUFFERS * 24)) +#define SEGGER_RTT__CB_PADDING (SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(SEGGER_RTT__CB_SIZE) - SEGGER_RTT__CB_SIZE) + +/********************************************************************* +* +* Types +* +********************************************************************** +*/ + +// +// Description for a circular buffer (also called "ring buffer") +// which is used as up-buffer (T->H) +// +typedef struct { + const char* sName; // Optional name. Standard names so far are: "Terminal", "SysView", "J-Scope_t4i4" + char* pBuffer; // Pointer to start of buffer + unsigned SizeOfBuffer; // Buffer size in bytes. Note that one byte is lost, as this implementation does not fill up the buffer in order to avoid the problem of being unable to distinguish between full and empty. + unsigned WrOff; // Position of next item to be written by either target. + volatile unsigned RdOff; // Position of next item to be read by host. Must be volatile since it may be modified by host. + unsigned Flags; // Contains configuration flags +} SEGGER_RTT_BUFFER_UP; + +// +// Description for a circular buffer (also called "ring buffer") +// which is used as down-buffer (H->T) +// +typedef struct { + const char* sName; // Optional name. Standard names so far are: "Terminal", "SysView", "J-Scope_t4i4" + char* pBuffer; // Pointer to start of buffer + unsigned SizeOfBuffer; // Buffer size in bytes. Note that one byte is lost, as this implementation does not fill up the buffer in order to avoid the problem of being unable to distinguish between full and empty. + volatile unsigned WrOff; // Position of next item to be written by host. Must be volatile since it may be modified by host. + unsigned RdOff; // Position of next item to be read by target (down-buffer). + unsigned Flags; // Contains configuration flags +} SEGGER_RTT_BUFFER_DOWN; + +// +// RTT control block which describes the number of buffers available +// as well as the configuration for each buffer +// +// +typedef struct { + char acID[16]; // Initialized to "SEGGER RTT" + int MaxNumUpBuffers; // Initialized to SEGGER_RTT_MAX_NUM_UP_BUFFERS (type. 2) + int MaxNumDownBuffers; // Initialized to SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (type. 2) + SEGGER_RTT_BUFFER_UP aUp[SEGGER_RTT_MAX_NUM_UP_BUFFERS]; // Up buffers, transferring information up from target via debug probe to host + SEGGER_RTT_BUFFER_DOWN aDown[SEGGER_RTT_MAX_NUM_DOWN_BUFFERS]; // Down buffers, transferring information down from host via debug probe to target +#if SEGGER_RTT__CB_PADDING + unsigned char aDummy[SEGGER_RTT__CB_PADDING]; +#endif +} SEGGER_RTT_CB; + +/********************************************************************* +* +* Global data +* +********************************************************************** +*/ +extern SEGGER_RTT_CB _SEGGER_RTT; + +/********************************************************************* +* +* RTT API functions +* +********************************************************************** +*/ +#ifdef __cplusplus + extern "C" { +#endif +int SEGGER_RTT_AllocDownBuffer (const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); +int SEGGER_RTT_AllocUpBuffer (const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); +int SEGGER_RTT_ConfigUpBuffer (unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); +int SEGGER_RTT_ConfigDownBuffer (unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); +int SEGGER_RTT_GetKey (void); +unsigned SEGGER_RTT_HasData (unsigned BufferIndex); +int SEGGER_RTT_HasKey (void); +unsigned SEGGER_RTT_HasDataUp (unsigned BufferIndex); +void SEGGER_RTT_Init (void); +unsigned SEGGER_RTT_Read (unsigned BufferIndex, void* pBuffer, unsigned BufferSize); +unsigned SEGGER_RTT_ReadNoLock (unsigned BufferIndex, void* pData, unsigned BufferSize); +int SEGGER_RTT_SetNameDownBuffer (unsigned BufferIndex, const char* sName); +int SEGGER_RTT_SetNameUpBuffer (unsigned BufferIndex, const char* sName); +int SEGGER_RTT_SetFlagsDownBuffer (unsigned BufferIndex, unsigned Flags); +int SEGGER_RTT_SetFlagsUpBuffer (unsigned BufferIndex, unsigned Flags); +int SEGGER_RTT_WaitKey (void); +unsigned SEGGER_RTT_Write (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); +unsigned SEGGER_RTT_WriteNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); +unsigned SEGGER_RTT_WriteSkipNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); +unsigned SEGGER_RTT_ASM_WriteSkipNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); +unsigned SEGGER_RTT_WriteString (unsigned BufferIndex, const char* s); +void SEGGER_RTT_WriteWithOverwriteNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); +unsigned SEGGER_RTT_PutChar (unsigned BufferIndex, char c); +unsigned SEGGER_RTT_PutCharSkip (unsigned BufferIndex, char c); +unsigned SEGGER_RTT_PutCharSkipNoLock (unsigned BufferIndex, char c); +unsigned SEGGER_RTT_GetAvailWriteSpace (unsigned BufferIndex); +unsigned SEGGER_RTT_GetBytesInBuffer (unsigned BufferIndex); +unsigned int SEGGER_RTT_GetUpBufferFreeSize(unsigned int bufferIndex); /* << EST */ +// +// Function macro for performance optimization +// +#define SEGGER_RTT_HASDATA(n) (((SEGGER_RTT_BUFFER_DOWN*)((char*)&_SEGGER_RTT.aDown[n] + SEGGER_RTT_UNCACHED_OFF))->WrOff - ((SEGGER_RTT_BUFFER_DOWN*)((char*)&_SEGGER_RTT.aDown[n] + SEGGER_RTT_UNCACHED_OFF))->RdOff) + +#if RTT_USE_ASM + #define SEGGER_RTT_WriteSkipNoLock SEGGER_RTT_ASM_WriteSkipNoLock +#endif + +/********************************************************************* +* +* RTT transfer functions to send RTT data via other channels. +* +********************************************************************** +*/ +unsigned SEGGER_RTT_ReadUpBuffer (unsigned BufferIndex, void* pBuffer, unsigned BufferSize); +unsigned SEGGER_RTT_ReadUpBufferNoLock (unsigned BufferIndex, void* pData, unsigned BufferSize); +unsigned SEGGER_RTT_WriteDownBuffer (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); +unsigned SEGGER_RTT_WriteDownBufferNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); + +#define SEGGER_RTT_HASDATA_UP(n) (((SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[n] + SEGGER_RTT_UNCACHED_OFF))->WrOff - ((SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[n] + SEGGER_RTT_UNCACHED_OFF))->RdOff) // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + +/********************************************************************* +* +* RTT "Terminal" API functions +* +********************************************************************** +*/ +int SEGGER_RTT_SetTerminal (unsigned char TerminalId); +int SEGGER_RTT_TerminalOut (unsigned char TerminalId, const char* s); + +/********************************************************************* +* +* RTT printf functions (require SEGGER_RTT_printf.c) +* +********************************************************************** +*/ +int SEGGER_RTT_printf(unsigned BufferIndex, const char * sFormat, ...); +int SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pParamList); + +int SEGGER_printf(const char * sFormat, ...); /* << EST */ + +#ifdef __cplusplus + } +#endif + +#endif // ifndef(SEGGER_RTT_ASM) + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +// +// Operating modes. Define behavior if buffer is full (not enough space for entire message) +// +#define SEGGER_RTT_MODE_NO_BLOCK_SKIP (0) // Skip. Do not block, output nothing. (Default) +#define SEGGER_RTT_MODE_NO_BLOCK_TRIM (1) // Trim: Do not block, output as much as fits. +#define SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL (2) // Block: Wait until there is space in the buffer. +#define SEGGER_RTT_MODE_MASK (3) + +// +// Control sequences, based on ANSI. +// Can be used to control color, and clear the screen +// +#define RTT_CTRL_RESET "\x1B[0m" // Reset to default colors +#define RTT_CTRL_CLEAR "\x1B[2J" // Clear screen, reposition cursor to top left + +#define RTT_CTRL_TEXT_BLACK "\x1B[2;30m" +#define RTT_CTRL_TEXT_RED "\x1B[2;31m" +#define RTT_CTRL_TEXT_GREEN "\x1B[2;32m" +#define RTT_CTRL_TEXT_YELLOW "\x1B[2;33m" +#define RTT_CTRL_TEXT_BLUE "\x1B[2;34m" +#define RTT_CTRL_TEXT_MAGENTA "\x1B[2;35m" +#define RTT_CTRL_TEXT_CYAN "\x1B[2;36m" +#define RTT_CTRL_TEXT_WHITE "\x1B[2;37m" + +#define RTT_CTRL_TEXT_BRIGHT_BLACK "\x1B[1;30m" +#define RTT_CTRL_TEXT_BRIGHT_RED "\x1B[1;31m" +#define RTT_CTRL_TEXT_BRIGHT_GREEN "\x1B[1;32m" +#define RTT_CTRL_TEXT_BRIGHT_YELLOW "\x1B[1;33m" +#define RTT_CTRL_TEXT_BRIGHT_BLUE "\x1B[1;34m" +#define RTT_CTRL_TEXT_BRIGHT_MAGENTA "\x1B[1;35m" +#define RTT_CTRL_TEXT_BRIGHT_CYAN "\x1B[1;36m" +#define RTT_CTRL_TEXT_BRIGHT_WHITE "\x1B[1;37m" + +#define RTT_CTRL_BG_BLACK "\x1B[24;40m" +#define RTT_CTRL_BG_RED "\x1B[24;41m" +#define RTT_CTRL_BG_GREEN "\x1B[24;42m" +#define RTT_CTRL_BG_YELLOW "\x1B[24;43m" +#define RTT_CTRL_BG_BLUE "\x1B[24;44m" +#define RTT_CTRL_BG_MAGENTA "\x1B[24;45m" +#define RTT_CTRL_BG_CYAN "\x1B[24;46m" +#define RTT_CTRL_BG_WHITE "\x1B[24;47m" + +#define RTT_CTRL_BG_BRIGHT_BLACK "\x1B[4;40m" +#define RTT_CTRL_BG_BRIGHT_RED "\x1B[4;41m" +#define RTT_CTRL_BG_BRIGHT_GREEN "\x1B[4;42m" +#define RTT_CTRL_BG_BRIGHT_YELLOW "\x1B[4;43m" +#define RTT_CTRL_BG_BRIGHT_BLUE "\x1B[4;44m" +#define RTT_CTRL_BG_BRIGHT_MAGENTA "\x1B[4;45m" +#define RTT_CTRL_BG_BRIGHT_CYAN "\x1B[4;46m" +#define RTT_CTRL_BG_BRIGHT_WHITE "\x1B[4;47m" + + +#endif + +/*************************** End of file ****************************/ + diff --git a/TSM_PicoW_Sensor/McuLib/SEGGER_RTT/SEGGER_RTT_Conf.h b/TSM_PicoW_Sensor/McuLib/SEGGER_RTT/SEGGER_RTT_Conf.h new file mode 100644 index 0000000..f6eff35 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/SEGGER_RTT/SEGGER_RTT_Conf.h @@ -0,0 +1,437 @@ +/** Copyright (C) SEGGER Microcontroller GmbH */ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2019 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER RTT * Real Time Transfer for embedded targets * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the RTT protocol and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* RTT version: 6.86e * +* * +********************************************************************** + +---------------------------END-OF-HEADER------------------------------ +File : SEGGER_RTT_Conf.h +Purpose : Implementation of SEGGER real-time transfer (RTT) which + allows real-time communication on targets which support + debugger memory accesses while the CPU is running. +Revision: $Rev: 21074 $ + +*/ + +#ifndef SEGGER_RTT_CONF_H +#define SEGGER_RTT_CONF_H + +#ifdef __IAR_SYSTEMS_ICC__ + #include +#endif + +/********************************************************************* +* +* Defines, configurable +* +********************************************************************** +*/ +/* << EST: Additional setting to check for FreeRTOS: need to use FreeRTOS with proper BASEPRI mask to create critical sections */ +#include "McuLib.h" /* SDK and API used */ +#include "McuRTTconfig.h" /* configuration */ + +#if McuLib_CONFIG_SDK_USE_FREERTOS + #include "portmacro.h" /* include FreeRTOS port header file for critical section handling */ +#endif + +// +// Take in and set to correct values for Cortex-A systems with CPU cache +// +//#define SEGGER_RTT_CPU_CACHE_LINE_SIZE (32) // Largest cache line size (in bytes) in the current system +//#define SEGGER_RTT_UNCACHED_OFF (0xFB000000) // Address alias where RTT CB and buffers can be accessed uncached +// +// Most common case: +// Up-channel 0: RTT +// Up-channel 1: SystemView +// +#ifndef SEGGER_RTT_MAX_NUM_UP_BUFFERS + #define SEGGER_RTT_MAX_NUM_UP_BUFFERS (McuRTT_CONFIG_RTT_MAX_NUM_UP_BUFFERS) // Max. number of up-buffers (T->H) available on this target (Default: 3) +#endif +// +// Most common case: +// Down-channel 0: RTT +// Down-channel 1: SystemView +// +#ifndef SEGGER_RTT_MAX_NUM_DOWN_BUFFERS + #define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (McuRTT_CONFIG_RTT_MAX_NUM_DOWN_BUFFERS) // Max. number of down-buffers (H->T) available on this target (Default: 3) +#endif + +#ifndef BUFFER_SIZE_UP + //#define BUFFER_SIZE_UP (1024) // Size of the buffer for terminal output of target, up to host (Default: 1k) + #define BUFFER_SIZE_UP (McuRTT_CONFIG_RTT_BUFFER_SIZE_UP) // Size of the buffer for terminal output of target, up to host (Default: 1k) +#endif + +#ifndef BUFFER_SIZE_DOWN + //#define BUFFER_SIZE_DOWN (16) // Size of the buffer for terminal input to target from host (Usually keyboard input) (Default: 16) + #define BUFFER_SIZE_DOWN (McuRTT_CONFIG_RTT_BUFFER_SIZE_DOWN) // Size of the buffer for terminal input to target from host (Usually keyboard input) (Default: 16) +#endif + +#ifndef SEGGER_RTT_PRINTF_BUFFER_SIZE + //#define SEGGER_RTT_PRINTF_BUFFER_SIZE (64u) // Size of buffer for RTT printf to bulk-send chars via RTT (Default: 64) + #define SEGGER_RTT_PRINTF_BUFFER_SIZE (McuRTT_CONFIG_RTT_BUFFER_SIZE_PRINTF) // Size of buffer for RTT printf to bulk-send chars via RTT (Default: 64) +#endif + +#ifndef SEGGER_RTT_MODE_DEFAULT + #define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP // Mode for pre-initialized terminal channel (buffer 0) +#endif + +/********************************************************************* +* +* RTT memcpy configuration +* +* memcpy() is good for large amounts of data, +* but the overhead is big for small amounts, which are usually stored via RTT. +* With SEGGER_RTT_MEMCPY_USE_BYTELOOP a simple byte loop can be used instead. +* +* SEGGER_RTT_MEMCPY() can be used to replace standard memcpy() in RTT functions. +* This is may be required with memory access restrictions, +* such as on Cortex-A devices with MMU. +*/ +#ifndef SEGGER_RTT_MEMCPY_USE_BYTELOOP + #define SEGGER_RTT_MEMCPY_USE_BYTELOOP 0 // 0: Use memcpy/SEGGER_RTT_MEMCPY, 1: Use a simple byte-loop +#endif +// +// Example definition of SEGGER_RTT_MEMCPY to external memcpy with GCC toolchains and Cortex-A targets +// +//#if ((defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __GNUC__)) && (defined (__ARM_ARCH_7A__)) +// #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes) SEGGER_memcpy((pDest), (pSrc), (NumBytes)) +//#endif + +// +// Target is not allowed to perform other RTT operations while string still has not been stored completely. +// Otherwise we would probably end up with a mixed string in the buffer. +// If using RTT from within interrupts, multiple tasks or multi processors, define the SEGGER_RTT_LOCK() and SEGGER_RTT_UNLOCK() function here. +// +// SEGGER_RTT_MAX_INTERRUPT_PRIORITY can be used in the sample lock routines on Cortex-M3/4. +// Make sure to mask all interrupts which can send RTT data, i.e. generate SystemView events, or cause task switches. +// When high-priority interrupts must not be masked while sending RTT data, SEGGER_RTT_MAX_INTERRUPT_PRIORITY needs to be adjusted accordingly. +// (Higher priority = lower priority number) +// Default value for embOS: 128u +// Default configuration in FreeRTOS: configMAX_SYSCALL_INTERRUPT_PRIORITY: ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) +// In case of doubt mask all interrupts: 1 << (8 - BASEPRI_PRIO_BITS) i.e. 1 << 5 when 3 bits are implemented in NVIC +// or define SEGGER_RTT_LOCK() to completely disable interrupts. +// +#ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY + #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) // Interrupt priority to lock on SEGGER_RTT_LOCK on Cortex-M3/4 (Default: 0x20) +#endif + +/********************************************************************* +* +* RTT lock configuration for SEGGER Embedded Studio, +* Rowley CrossStudio and GCC +*/ +#if ((defined(__SES_ARM) || defined(__SES_RISCV) || defined(__CROSSWORKS_ARM) || defined(__GNUC__) || defined(__clang__)) && !defined (__CC_ARM) && !defined(WIN32)) + #if (defined(__ARM_ARCH_6M__) || defined(__ARM_ARCH_8M_BASE__)) /* EST >> */ || (McuLib_CONFIG_CPU_IS_ARM_CORTEX_M && McuLib_CONFIG_CORTEX_M==0) + #define SEGGER_RTT_LOCK() { \ + unsigned int LockState; \ + __asm volatile ("mrs %0, primask \n\t" \ + "movs r1, #1 \n\t" \ + "msr primask, r1 \n\t" \ + : "=r" (LockState) \ + : \ + : "r1", "cc" \ + ); + + #define SEGGER_RTT_UNLOCK() __asm volatile ("msr primask, %0 \n\t" \ + : \ + : "r" (LockState) \ + : \ + ); \ + } + #elif (defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_8M_MAIN__)) /* EST >> */ || (McuLib_CONFIG_CPU_IS_ARM_CORTEX_M && McuLib_CONFIG_CORTEX_M>=3) + #define SEGGER_RTT_LOCK() { \ + unsigned int LockState; \ + __asm volatile ("mrs %0, basepri \n\t" \ + "mov r1, %1 \n\t" \ + "msr basepri, r1 \n\t" \ + : "=r" (LockState) \ + : "i"(SEGGER_RTT_MAX_INTERRUPT_PRIORITY) \ + : "r1", "cc" \ + ); + + #define SEGGER_RTT_UNLOCK() __asm volatile ("msr basepri, %0 \n\t" \ + : \ + : "r" (LockState) \ + : \ + ); \ + } + + #elif defined(__ARM_ARCH_7A__) + #define SEGGER_RTT_LOCK() { \ + unsigned int LockState; \ + __asm volatile ("mrs r1, CPSR \n\t" \ + "mov %0, r1 \n\t" \ + "orr r1, r1, #0xC0 \n\t" \ + "msr CPSR_c, r1 \n\t" \ + : "=r" (LockState) \ + : \ + : "r1", "cc" \ + ); + + #define SEGGER_RTT_UNLOCK() __asm volatile ("mov r0, %0 \n\t" \ + "mrs r1, CPSR \n\t" \ + "bic r1, r1, #0xC0 \n\t" \ + "and r0, r0, #0xC0 \n\t" \ + "orr r1, r1, r0 \n\t" \ + "msr CPSR_c, r1 \n\t" \ + : \ + : "r" (LockState) \ + : "r0", "r1", "cc" \ + ); \ + } + #elif defined(__riscv) || defined(__riscv_xlen) + #define SEGGER_RTT_LOCK() { \ + unsigned int LockState; \ + __asm volatile ("csrr %0, mstatus \n\t" \ + "csrci mstatus, 8 \n\t" \ + "andi %0, %0, 8 \n\t" \ + : "=r" (LockState) \ + : \ + : \ + ); + + #define SEGGER_RTT_UNLOCK() __asm volatile ("csrr a1, mstatus \n\t" \ + "or %0, %0, a1 \n\t" \ + "csrs mstatus, %0 \n\t" \ + : \ + : "r" (LockState) \ + : "a1" \ + ); \ + } + #else + #define SEGGER_RTT_LOCK() + #define SEGGER_RTT_UNLOCK() + #endif +#endif +/********************************************************************* +* +* RTT lock configuration for IAR EWARM +*/ +#ifdef __ICCARM__ + #if (defined (__ARM6M__) && (__CORE__ == __ARM6M__)) || \ + (defined (__ARM8M_BASELINE__) && (__CORE__ == __ARM8M_BASELINE__)) + #define SEGGER_RTT_LOCK() { \ + unsigned int LockState; \ + LockState = __get_PRIMASK(); \ + __set_PRIMASK(1); + + #define SEGGER_RTT_UNLOCK() __set_PRIMASK(LockState); \ + } + #elif (defined (__ARM7EM__) && (__CORE__ == __ARM7EM__)) || \ + (defined (__ARM7M__) && (__CORE__ == __ARM7M__)) || \ + (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__)) || \ + (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__)) + #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY + #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) + #endif + #define SEGGER_RTT_LOCK() { \ + unsigned int LockState; \ + LockState = __get_BASEPRI(); \ + __set_BASEPRI(SEGGER_RTT_MAX_INTERRUPT_PRIORITY); + + #define SEGGER_RTT_UNLOCK() __set_BASEPRI(LockState); \ + } + #elif (defined (__ARM7A__) && (__CORE__ == __ARM7A__)) || \ + (defined (__ARM7R__) && (__CORE__ == __ARM7R__)) + #define SEGGER_RTT_LOCK() { \ + unsigned int LockState; \ + __asm volatile ("mrs r1, CPSR \n\t" \ + "mov %0, r1 \n\t" \ + "orr r1, r1, #0xC0 \n\t" \ + "msr CPSR_c, r1 \n\t" \ + : "=r" (LockState) \ + : \ + : "r1", "cc" \ + ); + + #define SEGGER_RTT_UNLOCK() __asm volatile ("mov r0, %0 \n\t" \ + "mrs r1, CPSR \n\t" \ + "bic r1, r1, #0xC0 \n\t" \ + "and r0, r0, #0xC0 \n\t" \ + "orr r1, r1, r0 \n\t" \ + "msr CPSR_c, r1 \n\t" \ + : \ + : "r" (LockState) \ + : "r0", "r1", "cc" \ + ); \ + } + #endif +#endif + +/********************************************************************* +* +* RTT lock configuration for IAR RX +*/ +#ifdef __ICCRX__ + #define SEGGER_RTT_LOCK() { \ + unsigned long LockState; \ + LockState = __get_interrupt_state(); \ + __disable_interrupt(); + + #define SEGGER_RTT_UNLOCK() __set_interrupt_state(LockState); \ + } +#endif + +/********************************************************************* +* +* RTT lock configuration for IAR RL78 +*/ +#ifdef __ICCRL78__ + #define SEGGER_RTT_LOCK() { \ + __istate_t LockState; \ + LockState = __get_interrupt_state(); \ + __disable_interrupt(); + + #define SEGGER_RTT_UNLOCK() __set_interrupt_state(LockState); \ + } +#endif + +/********************************************************************* +* +* RTT lock configuration for KEIL ARM +*/ +#ifdef __CC_ARM + #if (defined __TARGET_ARCH_6S_M) + #define SEGGER_RTT_LOCK() { \ + unsigned int LockState; \ + register unsigned char PRIMASK __asm( "primask"); \ + LockState = PRIMASK; \ + PRIMASK = 1u; \ + __schedule_barrier(); + + #define SEGGER_RTT_UNLOCK() PRIMASK = LockState; \ + __schedule_barrier(); \ + } + #elif (defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M)) + #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY + #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) + #endif + #define SEGGER_RTT_LOCK() { \ + unsigned int LockState; \ + register unsigned char BASEPRI __asm( "basepri"); \ + LockState = BASEPRI; \ + BASEPRI = SEGGER_RTT_MAX_INTERRUPT_PRIORITY; \ + __schedule_barrier(); + + #define SEGGER_RTT_UNLOCK() BASEPRI = LockState; \ + __schedule_barrier(); \ + } + #endif +#endif + +/********************************************************************* +* +* RTT lock configuration for TI ARM +*/ +#ifdef __TI_ARM__ + #if defined (__TI_ARM_V6M0__) + #define SEGGER_RTT_LOCK() { \ + unsigned int LockState; \ + LockState = __get_PRIMASK(); \ + __set_PRIMASK(1); + + #define SEGGER_RTT_UNLOCK() __set_PRIMASK(LockState); \ + } + #elif (defined (__TI_ARM_V7M3__) || defined (__TI_ARM_V7M4__)) + #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY + #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) + #endif + #define SEGGER_RTT_LOCK() { \ + unsigned int LockState; \ + LockState = _set_interrupt_priority(SEGGER_RTT_MAX_INTERRUPT_PRIORITY); + + #define SEGGER_RTT_UNLOCK() _set_interrupt_priority(LockState); \ + } + #endif +#endif + +/********************************************************************* +* +* RTT lock configuration for CCRX +*/ +#ifdef __RX + #include + #define SEGGER_RTT_LOCK() { \ + unsigned long LockState; \ + LockState = get_psw() & 0x010000; \ + clrpsw_i(); + + #define SEGGER_RTT_UNLOCK() set_psw(get_psw() | LockState); \ + } +#endif + +/********************************************************************* +* +* RTT lock configuration for embOS Simulation on Windows +* (Can also be used for generic RTT locking with embOS) +*/ +#if defined(WIN32) || defined(SEGGER_RTT_LOCK_EMBOS) + +void OS_SIM_EnterCriticalSection(void); +void OS_SIM_LeaveCriticalSection(void); + +#define SEGGER_RTT_LOCK() { \ + OS_SIM_EnterCriticalSection(); + +#define SEGGER_RTT_UNLOCK() OS_SIM_LeaveCriticalSection(); \ + } +#endif + +/********************************************************************* +* +* RTT lock configuration fallback +*/ +#ifndef SEGGER_RTT_LOCK + #define SEGGER_RTT_LOCK() // Lock RTT (nestable) (i.e. disable interrupts) +#endif + +#ifndef SEGGER_RTT_UNLOCK + #define SEGGER_RTT_UNLOCK() // Unlock RTT (nestable) (i.e. enable previous interrupt lock state) +#endif + +#endif +/*************************** End of file ****************************/ + diff --git a/TSM_PicoW_Sensor/McuLib/SEGGER_RTT/SEGGER_RTT_printf.c b/TSM_PicoW_Sensor/McuLib/SEGGER_RTT/SEGGER_RTT_printf.c new file mode 100644 index 0000000..5d3b9b3 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/SEGGER_RTT/SEGGER_RTT_printf.c @@ -0,0 +1,555 @@ +/** Copyright (C) SEGGER Microcontroller GmbH */ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2019 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER RTT * Real Time Transfer for embedded targets * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the RTT protocol and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* RTT version: 6.86e * +* * +********************************************************************** + +---------------------------END-OF-HEADER------------------------------ +File : SEGGER_RTT_printf.c +Purpose : Replacement for printf to write formatted data via RTT +Revision: $Rev: 17697 $ +---------------------------------------------------------------------- +*/ +#include "SEGGER_RTT.h" +#include "SEGGER_RTT_Conf.h" + +/********************************************************************* +* +* Defines, configurable +* +********************************************************************** +*/ + +#ifndef SEGGER_RTT_PRINTF_BUFFER_SIZE + #define SEGGER_RTT_PRINTF_BUFFER_SIZE (64) +#endif + +#include +#include + + +#define FORMAT_FLAG_LEFT_JUSTIFY (1u << 0) +#define FORMAT_FLAG_PAD_ZERO (1u << 1) +#define FORMAT_FLAG_PRINT_SIGN (1u << 2) +#define FORMAT_FLAG_ALTERNATE (1u << 3) + +/********************************************************************* +* +* Types +* +********************************************************************** +*/ + +typedef struct { + char* pBuffer; + unsigned BufferSize; + unsigned Cnt; + + int ReturnValue; + + unsigned RTTBufferIndex; +} SEGGER_RTT_PRINTF_DESC; + +/********************************************************************* +* +* Function prototypes +* +********************************************************************** +*/ +int SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pParamList); + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _StoreChar +*/ +static void _StoreChar(SEGGER_RTT_PRINTF_DESC * p, char c) { + unsigned Cnt; + + Cnt = p->Cnt; + if ((Cnt + 1u) <= p->BufferSize) { + *(p->pBuffer + Cnt) = c; + p->Cnt = Cnt + 1u; + p->ReturnValue++; + } + // + // Write part of string, when the buffer is full + // + if (p->Cnt == p->BufferSize) { + if (SEGGER_RTT_Write(p->RTTBufferIndex, p->pBuffer, p->Cnt) != p->Cnt) { + p->ReturnValue = -1; + } else { + p->Cnt = 0u; + } + } +} + +/********************************************************************* +* +* _PrintUnsigned +*/ +static void _PrintUnsigned(SEGGER_RTT_PRINTF_DESC * pBufferDesc, unsigned v, unsigned Base, unsigned NumDigits, unsigned FieldWidth, unsigned FormatFlags) { + static const char _aV2C[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + unsigned Div; + unsigned Digit; + unsigned Number; + unsigned Width; + char c; + + Number = v; + Digit = 1u; + // + // Get actual field width + // + Width = 1u; + while (Number >= Base) { + Number = (Number / Base); + Width++; + } + if (NumDigits > Width) { + Width = NumDigits; + } + // + // Print leading chars if necessary + // + if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) { + if (FieldWidth != 0u) { + if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && (NumDigits == 0u)) { + c = '0'; + } else { + c = ' '; + } + while ((FieldWidth != 0u) && (Width < FieldWidth)) { + FieldWidth--; + _StoreChar(pBufferDesc, c); + if (pBufferDesc->ReturnValue < 0) { + break; + } + } + } + } + if (pBufferDesc->ReturnValue >= 0) { + // + // Compute Digit. + // Loop until Digit has the value of the highest digit required. + // Example: If the output is 345 (Base 10), loop 2 times until Digit is 100. + // + while (1) { + if (NumDigits > 1u) { // User specified a min number of digits to print? => Make sure we loop at least that often, before checking anything else (> 1 check avoids problems with NumDigits being signed / unsigned) + NumDigits--; + } else { + Div = v / Digit; + if (Div < Base) { // Is our divider big enough to extract the highest digit from value? => Done + break; + } + } + Digit *= Base; + } + // + // Output digits + // + do { + Div = v / Digit; + v -= Div * Digit; + _StoreChar(pBufferDesc, _aV2C[Div]); + if (pBufferDesc->ReturnValue < 0) { + break; + } + Digit /= Base; + } while (Digit); + // + // Print trailing spaces if necessary + // + if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == FORMAT_FLAG_LEFT_JUSTIFY) { + if (FieldWidth != 0u) { + while ((FieldWidth != 0u) && (Width < FieldWidth)) { + FieldWidth--; + _StoreChar(pBufferDesc, ' '); + if (pBufferDesc->ReturnValue < 0) { + break; + } + } + } + } + } +} + +/********************************************************************* +* +* _PrintInt +*/ +static void _PrintInt(SEGGER_RTT_PRINTF_DESC * pBufferDesc, int v, unsigned Base, unsigned NumDigits, unsigned FieldWidth, unsigned FormatFlags) { + unsigned Width; + int Number; + + Number = (v < 0) ? -v : v; + + // + // Get actual field width + // + Width = 1u; + while (Number >= (int)Base) { + Number = (Number / (int)Base); + Width++; + } + if (NumDigits > Width) { + Width = NumDigits; + } + if ((FieldWidth > 0u) && ((v < 0) || ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN))) { + FieldWidth--; + } + + // + // Print leading spaces if necessary + // + if ((((FormatFlags & FORMAT_FLAG_PAD_ZERO) == 0u) || (NumDigits != 0u)) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u)) { + if (FieldWidth != 0u) { + while ((FieldWidth != 0u) && (Width < FieldWidth)) { + FieldWidth--; + _StoreChar(pBufferDesc, ' '); + if (pBufferDesc->ReturnValue < 0) { + break; + } + } + } + } + // + // Print sign if necessary + // + if (pBufferDesc->ReturnValue >= 0) { + if (v < 0) { + v = -v; + _StoreChar(pBufferDesc, '-'); + } else if ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN) { + _StoreChar(pBufferDesc, '+'); + } else { + + } + if (pBufferDesc->ReturnValue >= 0) { + // + // Print leading zeros if necessary + // + if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) && (NumDigits == 0u)) { + if (FieldWidth != 0u) { + while ((FieldWidth != 0u) && (Width < FieldWidth)) { + FieldWidth--; + _StoreChar(pBufferDesc, '0'); + if (pBufferDesc->ReturnValue < 0) { + break; + } + } + } + } + if (pBufferDesc->ReturnValue >= 0) { + // + // Print number without sign + // + _PrintUnsigned(pBufferDesc, (unsigned)v, Base, NumDigits, FieldWidth, FormatFlags); + } + } + } +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* SEGGER_RTT_vprintf +* +* Function description +* Stores a formatted string in SEGGER RTT control block. +* This data is read by the host. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used. (e.g. 0 for "Terminal") +* sFormat Pointer to format string +* pParamList Pointer to the list of arguments for the format string +* +* Return values +* >= 0: Number of bytes which have been stored in the "Up"-buffer. +* < 0: Error +*/ +int SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pParamList) { + char c; + SEGGER_RTT_PRINTF_DESC BufferDesc; + int v; + unsigned NumDigits; + unsigned FormatFlags; + unsigned FieldWidth; + char acBuffer[SEGGER_RTT_PRINTF_BUFFER_SIZE]; + + BufferDesc.pBuffer = acBuffer; + BufferDesc.BufferSize = SEGGER_RTT_PRINTF_BUFFER_SIZE; + BufferDesc.Cnt = 0u; + BufferDesc.RTTBufferIndex = BufferIndex; + BufferDesc.ReturnValue = 0; + + do { + c = *sFormat; + sFormat++; + if (c == 0u) { + break; + } + if (c == '%') { + // + // Filter out flags + // + FormatFlags = 0u; + v = 1; + do { + c = *sFormat; + switch (c) { + case '-': FormatFlags |= FORMAT_FLAG_LEFT_JUSTIFY; sFormat++; break; + case '0': FormatFlags |= FORMAT_FLAG_PAD_ZERO; sFormat++; break; + case '+': FormatFlags |= FORMAT_FLAG_PRINT_SIGN; sFormat++; break; + case '#': FormatFlags |= FORMAT_FLAG_ALTERNATE; sFormat++; break; + default: v = 0; break; + } + } while (v); + // + // filter out field with + // + FieldWidth = 0u; + do { + c = *sFormat; + if ((c < '0') || (c > '9')) { + break; + } + sFormat++; + FieldWidth = (FieldWidth * 10u) + ((unsigned)c - '0'); + } while (1); + + // + // Filter out precision (number of digits to display) + // + NumDigits = 0u; + c = *sFormat; + if (c == '.') { + sFormat++; + do { + c = *sFormat; + if ((c < '0') || (c > '9')) { + break; + } + sFormat++; + NumDigits = NumDigits * 10u + ((unsigned)c - '0'); + } while (1); + } + // + // Filter out length modifier + // + c = *sFormat; + do { + if ((c == 'l') || (c == 'h')) { + sFormat++; + c = *sFormat; + } else { + break; + } + } while (1); + // + // Handle specifiers + // + switch (c) { + case 'c': { + char c0; + v = va_arg(*pParamList, int); + c0 = (char)v; + _StoreChar(&BufferDesc, c0); + break; + } + case 'd': + v = va_arg(*pParamList, int); + _PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags); + break; + case 'u': + v = va_arg(*pParamList, int); + _PrintUnsigned(&BufferDesc, (unsigned)v, 10u, NumDigits, FieldWidth, FormatFlags); + break; + case 'x': + case 'X': + v = va_arg(*pParamList, int); + _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, NumDigits, FieldWidth, FormatFlags); + break; + case 's': + { + const char * s = va_arg(*pParamList, const char *); + do { + c = *s; + s++; + if (c == '\0') { + break; + } + _StoreChar(&BufferDesc, c); + } while (BufferDesc.ReturnValue >= 0); + } + break; + case 'p': + v = va_arg(*pParamList, int); + _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, 8u, 8u, 0u); + break; + case '%': + _StoreChar(&BufferDesc, '%'); + break; + default: + break; + } + sFormat++; + } else { + _StoreChar(&BufferDesc, c); + } + } while (BufferDesc.ReturnValue >= 0); + + if (BufferDesc.ReturnValue > 0) { + // + // Write remaining data, if any + // + if (BufferDesc.Cnt != 0u) { + SEGGER_RTT_Write(BufferIndex, acBuffer, BufferDesc.Cnt); + } +#if 0 + BufferDesc.ReturnValue += (int)BufferDesc.Cnt; +#else /* << EST: Do not count the characters twice! */ + BufferDesc.ReturnValue = (int)BufferDesc.Cnt; +#endif + } + return BufferDesc.ReturnValue; +} + +/********************************************************************* +* +* SEGGER_RTT_printf +* +* Function description +* Stores a formatted string in SEGGER RTT control block. +* This data is read by the host. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used. (e.g. 0 for "Terminal") +* sFormat Pointer to format string, followed by the arguments for conversion +* +* Return values +* >= 0: Number of bytes which have been stored in the "Up"-buffer. +* < 0: Error +* +* Notes +* (1) Conversion specifications have following syntax: +* %[flags][FieldWidth][.Precision]ConversionSpecifier +* (2) Supported flags: +* -: Left justify within the field width +* +: Always print sign extension for signed conversions +* 0: Pad with 0 instead of spaces. Ignored when using '-'-flag or precision +* Supported conversion specifiers: +* c: Print the argument as one char +* d: Print the argument as a signed integer +* u: Print the argument as an unsigned integer +* x: Print the argument as an hexadecimal integer +* s: Print the string pointed to by the argument +* p: Print the argument as an 8-digit hexadecimal integer. (Argument shall be a pointer to void.) +*/ +int SEGGER_RTT_printf(unsigned BufferIndex, const char * sFormat, ...) { + int r; + va_list ParamList; + + va_start(ParamList, sFormat); + r = SEGGER_RTT_vprintf(BufferIndex, sFormat, &ParamList); + va_end(ParamList); + return r; +} + +#if 0 /* << EST extension to support extra format characters like %f */ +#include "McuXFormat.h" +#include "McuWait.h" + +int SEGGER_printf(const char * sFormat, ...) { + static char buffer[256]; /* NOT reentrant! */ + va_list args; + int res; + unsigned int avail; + + va_start(args, sFormat); + res = xsnprintf(buffer, sizeof(buffer), sFormat, args); + va_end(args); + if (res > 0) { + int retry = 5; + + do { + /* res is the number of characters written */ + avail = SEGGER_RTT_GetUpBufferFreeSize(0); + if (avail>res) { + break; /* enough space available */ + } else { + McuWait_Waitms(50); + retry--; + } + } while(retry>0); + return SEGGER_RTT_printf(0, "%s", buffer); + } + return -1; /* failed */ +} +#else +int SEGGER_printf(const char * sFormat, ...) { + va_list ParamList; + int res; + + va_start(ParamList, sFormat); + res = SEGGER_RTT_vprintf(0, sFormat, &ParamList); + va_end(ParamList); + return res; +} +#endif + +/*************************** End of file ****************************/ + diff --git a/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/License_SystemView.txt b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/License_SystemView.txt new file mode 100644 index 0000000..8e0a9cb --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/License_SystemView.txt @@ -0,0 +1,250 @@ +IMPORTANT - READ CAREFULLY: + +This is a legal agreement between "you" (either as an individual or a single entity) and SEGGER Microcontroller GmbH ("SEGGER") for the SEGGER SystemView Application software product ("SystemView", "Software"). +All IP rights, title and interest in SystemView is and shall at all times remain with SEGGER. +By downloading and/or using SystemView, YOU agree to be bound by the terms of this agreement. + +1. LICENSE GRANT +a) FREE OF CHARGE LICENSE FOR EVALUATION, HOBBYIST NON-COMMERCIAL, AND EDUCATIONAL PURPOSES +SEGGER grants you a personal, non-exclusive license free of charge when either of the following conditions is met: + + The software is only used for + I. Evaluation purposes + II. Educational purposes + III. Hobbyist (non-commercial) purposes + +EVALUATION PURPOSES means you shall only use the Software to try it out, test it, and determine further use. + +HOBBYIST (NON-COMMERCIAL) and EDUCATIONAL PURPOSES means the Software can be used by you, as a private individual, student, tutor or teacher, + - in universities + - in colleges + - in non-profit organizations + - at home +for + - classes + - training + - self-education + - non-commercial projects +if the Software is used for teaching, learning, studying, and hobbyists purposes only. + +You shall not use the Software within universities, colleges, or non-profit organizations + - for any commercial purposes or project or other undertaking, intended for profit + +Using Systemview without a commercial-use license for any other purpose is prohibited. + +b) COMMERCIAL-USE LICENSE +Subject to the payment of the license fee, SEGGER grants to you a personal, non-exclusive license to install and use SystemView for personal or for commercial purposes. The use of SystemView is limited to the specific license model purchased. + +J-Link locked License (default): +The J-Link locked License entitles an individual to use SystemView with a specific SEGGER J-Link debug probe only, identified by its unique serial number. The specific SEGGER J-Link debug probe serves as a hardware lock (dongle). +A hardware lock is a device to be attached to one of the computer's external ports, which allows the individual to move the license to another computer. +The SEGGER J-Link locked License may be used by an individual only on a single, self-contained computer unit (stationary or portable), directly and physically connected to the SEGGER J-Link debug probe. A switch of the specific SEGGER J-Link debug probe to another SEGGER J-Link debug probe may be allowed by SEGGER; provided that the initial SEGGER J-Link debug probe has been identified and approved as defective by SEGGER. SystemView may not be accessed by other individuals from or on other computer units NOT directly and physically connected to the specific SEGGER J-Link (except for access via J-Link tunnel mode). +The number of individuals within an organisation, company, entity or a like to use the SystemView under this J-Link locked License model, if more than one, is defined by the number of SEGGER J-Link debug probes identified by their unique serial numbers on the PO and related order confirmation. + +PC locked license (on request): +A PC-locked License is a personal, non-exclusive license for an individual to use SystemView while locked to the MAC address of a PC where the software is installed. +The PC-locked License may be used by the individual only on one single, self-contained computer unit (stationary or portable), designated and identified through its MAC address or other means of identification. PC locked license are available from SEGGER upon request. + +Site License (on request): +A Site license entitles you, as a Company, the right to designate an unlimited number of persons employed by you and working in facilities located within one city or within a range of 20 miles (whichever is greater) to use the Software in connection with the development and creation of your Products. The city is defined in the PO and related order confirmation. + +Company-wide License (on request): +A Company-wide License entitles you, as a Company, the right to designate an unlimited number of persons employed by you to use the Software in connection with the development and creation of your Products. +A Company-wide License forgoes the need to activate the software each time it is installed on another computer within your Company. +The use of the Software by your Consultants or Affiliates is not permitted and requires the purchase of additional licenses. + +GENERAL TERMS THAT APPLY TO SystemView + +2. RESTRICTIONS +YOU may not: +(a) decompile, disassemble, reverse engineer, or otherwise attempt to derive the source code of SystemView, +(b) sell, rent, lease, sublicense, or otherwise transfer rights to SystemView, +(c) remove or alter any trademark, logo, copyright or other proprietary notices, legends, symbols or label in SystemView, +(d) redistribute or encumber SystemView without prior written authorisation from SEGGER. +Without prejudice to any other rights, SEGGER may terminate this agreement if YOU fail to comply with foregoing restrictions. + + +3. DISCLAIMER OF WARRANTY +SystemView is provided on an "as is" basis, without warranty of any kind, including without limitation the warranties that it is free of defects, merchantable, fit for a particular purpose or non-infringing. This disclaimer of warranty constitutes an essential part of this agreement. No use of SystemView is authorized hereunder except under this disclaimer. + +4. LIMITATION OF LIABILITY +To the maximum extent permitted by applicable law, in no event will SEGGER be liable for any indirect, special, incidental or consequential damages arising out of the use of or inability to use SystemView, including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other damages or losses, even if advised of the possibility thereof, and regardless of the legal or equitable theory (contract, tort or otherwise) upon which the claim is based. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not be applicable. In any case, SEGGER's entire liability shall not exceed in aggregate the sum of the fees YOU paid for SystemView (if any). + +5. MISCELLANEOUS +(a) This agreement shall be governed by the laws of the Federal Republic of Germany. This agreement constitutes the entire agreement between the parties concerning the subject matter hereof. +(b) If any provision in this agreement should be held illegal or unenforceable by a court having jurisdiction, such provision shall be modified to the extent necessary to render it enforceable without losing its intent, or severed from this agreement if no such modification is possible, and other provisions of this agreement shall remain in full force and effect.This agreement may be changed only by an amendment in writing, signed by both parties. +(c) If any SEGGER professional services are being provided, then such professional services are provided pursuant to the terms of a separate agreement. + +(c) 2004-2019 SEGGER Microcontroller GmbH + + +ADDITIONAL SOFTWARE + +This sofware dynamically links against the Qt4 libraries distributed unter the GNU Lesser General Public License v.3 ("LGPL"). + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + diff --git a/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/McuSystemView.c b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/McuSystemView.c new file mode 100644 index 0000000..3865d14 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/McuSystemView.c @@ -0,0 +1,423 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuSystemView.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SeggerSystemView +** Version : Component 01.074, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2023-04-10, 17:28, # CodeGen: 807 +** Abstract : +** This component implements and integrates the SEGGER Systemview library for FreeRTOS. +** Settings : +** Component name : McuSystemView +** Version : V3.50a +** Application Name : "Demo Application" +** Device Name : "Cortex" +** RAM Base : 0x20000000 +** ID Base : 0x10000000 +** ID Shift : 2 +** Number of tasks : 10 +** Static Buffer : yes +** Post Mortem : no +** Implicit Format for printf() : no +** RTT Channel : +** Segger RTT : McuRTT +** Name : "SysView" +** Channel Index : 1 +** Up Buffer size : 1024 +** SDK : McuLib +** Source Folders : +** Source Folder : SEGGER_Sysview +** Config Folder : SEGGER_Sysview +** Contents : +** OnUserStart - void McuSystemView_OnUserStart(unsigned UserId); +** OnUserStop - void McuSystemView_OnUserStop(unsigned UserId); +** RecordEnterISR - void McuSystemView_RecordEnterISR(void); +** RecordExitISR - void McuSystemView_RecordExitISR(void); +** Print - void McuSystemView_Print(const char *s); +** PrintfHost - void McuSystemView_PrintfHost(const char *s, ...); +** PrintfTarget - void McuSystemView_PrintfTarget(const char *s, ...); +** Warn - void McuSystemView_Warn(const char *s); +** WarnfHost - void McuSystemView_WarnfHost(const char *s, ...); +** WarnfTarget - void McuSystemView_WarnfTarget(const char *s, ...); +** Error - void McuSystemView_Error(const char *s); +** ErrorfHost - void McuSystemView_ErrorfHost(const char *s, ...); +** ErrorfTarget - void McuSystemView_ErrorfTarget(const char *s, ...); +** EnableEvents - void McuSystemView_EnableEvents(uint32_t EnableMask); +** DisableEvents - void McuSystemView_DisableEvents(uint32_t DisableMask); +** Deinit - void McuSystemView_Deinit(void); +** Init - void McuSystemView_Init(void); +** +** * (c) Copyright Segger, 2020-2023 +** * http : www.segger.com +** * See separate Segger licensing terms. +** * +** * Processor Expert port: Copyright (c) 2016-2019, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuSystemView.h +** @version 01.00 +** @brief +** This component implements and integrates the SEGGER Systemview library for FreeRTOS. +*/ +/*! +** @addtogroup McuSystemView_module McuSystemView module documentation +** @{ +*/ + +/* MODULE McuSystemView. */ + +#include "McuSystemView.h" + +/* +** =================================================================== +** Method : Init (component SeggerSystemView) +** +** Description : +** Driver Initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuSystemView_Init(void) +{ + SEGGER_SYSVIEW_Conf(); /* initialize Segger System Viewer */ +} + +/* +** =================================================================== +** Method : OnUserStart (component SeggerSystemView) +** +** Description : +** Send a user event start, such as start of a subroutine for +** profiling. +** Parameters : +** NAME - DESCRIPTION +** UserId - User defined ID for the event +** Returns : Nothing +** =================================================================== +*/ +/** +void McuSystemView_OnUserStart(unsigned UserId) +{ + Implemented as macro on the header file. +} +*/ + +/* +** =================================================================== +** Method : OnUserStop (component SeggerSystemView) +** +** Description : +** Send a user event stop, such as return of a subroutine for +** profiling. +** Parameters : +** NAME - DESCRIPTION +** UserId - User defined ID for the event +** Returns : Nothing +** =================================================================== +*/ +/** +void McuSystemView_OnUserStop(unsigned UserId) +{ + Implemented as macro on the header file. +} +*/ + +/* +** =================================================================== +** Method : RecordEnterISR (component SeggerSystemView) +** +** Description : +** Records the enter of an ISR. Place this call at the +** beginning of the interrupt service routine. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +/* +void McuSystemView_RecordEnterISR(void) +{ + Implemented as macro on the header file. +} +*/ + +/* +** =================================================================== +** Method : RecordExitISR (component SeggerSystemView) +** +** Description : +** Records the end of the ISR. Call this function at the end of +** the ISR to be recorded. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +/* +void McuSystemView_RecordExitISR(void) +{ + Implemented as macro on the header file. +} +*/ + +/* +** =================================================================== +** Method : Print (component SeggerSystemView) +** +** Description : +** Prints a string to the host +** Parameters : +** NAME - DESCRIPTION +** * s - Pointer to string +** Returns : Nothing +** =================================================================== +*/ +/* +void McuSystemView_Print(const char *s) +{ + Implemented as macro on the header file. +} +*/ + +/* +** =================================================================== +** Method : Warn (component SeggerSystemView) +** +** Description : +** Prints a warning string to the host +** Parameters : +** NAME - DESCRIPTION +** * s - Pointer to string +** Returns : Nothing +** =================================================================== +*/ +/* +void McuSystemView_Warn(const char *s) +{ + Implemented as macro on the header file. +} +*/ + +/* +** =================================================================== +** Method : Error (component SeggerSystemView) +** +** Description : +** Prints an error string to the host +** Parameters : +** NAME - DESCRIPTION +** * s - Pointer to string +** Returns : Nothing +** =================================================================== +*/ +/* +void McuSystemView_Error(const char *s) +{ + Implemented as macro on the header file. +} +*/ + +/* +** =================================================================== +** Method : PrintfHost (component SeggerSystemView) +** +** Description : +** Prints a string using printf() to the host which is +** processed on the host +** Parameters : +** NAME - DESCRIPTION +** * s - Pointer to string +** Returns : Nothing +** =================================================================== +*/ +/* +void McuSystemView_PrintfHost(const char *s, ...) +{ + Implemented as macro on the header file. +} +*/ + +/* +** =================================================================== +** Method : PrintfTarget (component SeggerSystemView) +** +** Description : +** Prints a string using printf() to the host which is +** processed first on the target +** Parameters : +** NAME - DESCRIPTION +** * s - Pointer to string +** Returns : Nothing +** =================================================================== +*/ +/* +void McuSystemView_PrintfTarget(const char *s, ...) +{ + Implemented as macro on the header file. +} +*/ + +/* +** =================================================================== +** Method : WarnfHost (component SeggerSystemView) +** +** Description : +** Prints a warning string using printf() to the host which is +** processed on the host +** Parameters : +** NAME - DESCRIPTION +** * s - Pointer to string +** Returns : Nothing +** =================================================================== +*/ +/* +void McuSystemView_WarnfHost(const char *s, ...) +{ + Implemented as macro on the header file. +} +*/ + +/* +** =================================================================== +** Method : WarnfTarget (component SeggerSystemView) +** +** Description : +** Prints a warning string using printf() to the host which is +** processed first on the target +** Parameters : +** NAME - DESCRIPTION +** * s - Pointer to string +** Returns : Nothing +** =================================================================== +*/ +/* +void McuSystemView_WarnfTarget(const char *s, ...) +{ + Implemented as macro on the header file. +} +*/ + +/* +** =================================================================== +** Method : ErrorfHost (component SeggerSystemView) +** +** Description : +** Prints an error string using printf() to the host which is +** processed on the host +** Parameters : +** NAME - DESCRIPTION +** * s - Pointer to string +** Returns : Nothing +** =================================================================== +*/ +/* +void McuSystemView_ErrorfHost(const char *s, ...) +{ + Implemented as macro on the header file. +} +*/ + +/* +** =================================================================== +** Method : ErrorfTarget (component SeggerSystemView) +** +** Description : +** Prints an error string using printf() to the host which is +** processed first on the target +** Parameters : +** NAME - DESCRIPTION +** * s - Pointer to string +** Returns : Nothing +** =================================================================== +*/ +/* +void McuSystemView_ErrorfTarget(const char *s, ...) +{ + Implemented as macro on the header file. +} +*/ + +/* +** =================================================================== +** Method : DisableEvents (component SeggerSystemView) +** +** Description : +** Disable standard SystemView events to not be generated. +** Parameters : +** NAME - DESCRIPTION +** DisableMask - Events to be disabled. +** Returns : Nothing +** =================================================================== +*/ +/* +void McuSystemView_DisableEvents(uint32_t DisableMask) +{ + Implemented as macro on the header file. +} +*/ + +/* +** =================================================================== +** Method : EnableEvents (component SeggerSystemView) +** +** Description : +** Enables standard SystemView events to be generated. +** Parameters : +** NAME - DESCRIPTION +** EnableMask - Events to be enabled +** Returns : Nothing +** =================================================================== +*/ +/* +void McuSystemView_EnableEvents(uint32_t EnableMask) +{ + Implemented as macro on the header file. +} +*/ + +/* +** =================================================================== +** Method : Deinit (component SeggerSystemView) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuSystemView_Deinit(void) +{ + /* nothing needed */ +} + +/* END McuSystemView. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/McuSystemView.h b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/McuSystemView.h new file mode 100644 index 0000000..94daf40 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/McuSystemView.h @@ -0,0 +1,369 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuSystemView.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SeggerSystemView +** Version : Component 01.074, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2023-04-10, 17:28, # CodeGen: 807 +** Abstract : +** This component implements and integrates the SEGGER Systemview library for FreeRTOS. +** Settings : +** Component name : McuSystemView +** Version : V3.50a +** Application Name : "Demo Application" +** Device Name : "Cortex" +** RAM Base : 0x20000000 +** ID Base : 0x10000000 +** ID Shift : 2 +** Number of tasks : 10 +** Static Buffer : yes +** Post Mortem : no +** Implicit Format for printf() : no +** RTT Channel : +** Segger RTT : McuRTT +** Name : "SysView" +** Channel Index : 1 +** Up Buffer size : 1024 +** SDK : McuLib +** Source Folders : +** Source Folder : SEGGER_Sysview +** Config Folder : SEGGER_Sysview +** Contents : +** OnUserStart - void McuSystemView_OnUserStart(unsigned UserId); +** OnUserStop - void McuSystemView_OnUserStop(unsigned UserId); +** RecordEnterISR - void McuSystemView_RecordEnterISR(void); +** RecordExitISR - void McuSystemView_RecordExitISR(void); +** Print - void McuSystemView_Print(const char *s); +** PrintfHost - void McuSystemView_PrintfHost(const char *s, ...); +** PrintfTarget - void McuSystemView_PrintfTarget(const char *s, ...); +** Warn - void McuSystemView_Warn(const char *s); +** WarnfHost - void McuSystemView_WarnfHost(const char *s, ...); +** WarnfTarget - void McuSystemView_WarnfTarget(const char *s, ...); +** Error - void McuSystemView_Error(const char *s); +** ErrorfHost - void McuSystemView_ErrorfHost(const char *s, ...); +** ErrorfTarget - void McuSystemView_ErrorfTarget(const char *s, ...); +** EnableEvents - void McuSystemView_EnableEvents(uint32_t EnableMask); +** DisableEvents - void McuSystemView_DisableEvents(uint32_t DisableMask); +** Deinit - void McuSystemView_Deinit(void); +** Init - void McuSystemView_Init(void); +** +** * (c) Copyright Segger, 2020-2023 +** * http : www.segger.com +** * See separate Segger licensing terms. +** * +** * Processor Expert port: Copyright (c) 2016-2019, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuSystemView.h +** @version 01.00 +** @brief +** This component implements and integrates the SEGGER Systemview library for FreeRTOS. +*/ +/*! +** @addtogroup McuSystemView_module McuSystemView module documentation +** @{ +*/ + +#ifndef __McuSystemView_H +#define __McuSystemView_H + +/* MODULE McuSystemView. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuSystemViewconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuRTT.h" +#include "McuLib.h" + +#include "SEGGER_SYSVIEW.h" + + + + +void McuSystemView_Init(void); +/* +** =================================================================== +** Method : Init (component SeggerSystemView) +** +** Description : +** Driver Initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +#define McuSystemView_OnUserStart(UserId) \ + SEGGER_SYSVIEW_OnUserStart(UserId) + +/* +** =================================================================== +** Method : OnUserStart (component SeggerSystemView) +** +** Description : +** Send a user event start, such as start of a subroutine for +** profiling. +** Parameters : +** NAME - DESCRIPTION +** UserId - User defined ID for the event +** Returns : Nothing +** =================================================================== +*/ + +#define McuSystemView_OnUserStop(UserId) \ + SEGGER_SYSVIEW_OnUserStop(UserId) + +/* +** =================================================================== +** Method : OnUserStop (component SeggerSystemView) +** +** Description : +** Send a user event stop, such as return of a subroutine for +** profiling. +** Parameters : +** NAME - DESCRIPTION +** UserId - User defined ID for the event +** Returns : Nothing +** =================================================================== +*/ + +#define McuSystemView_RecordEnterISR() \ + SEGGER_SYSVIEW_RecordEnterISR() +/* +** =================================================================== +** Method : RecordEnterISR (component SeggerSystemView) +** +** Description : +** Records the enter of an ISR. Place this call at the +** beginning of the interrupt service routine. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +#define McuSystemView_RecordExitISR() \ + SEGGER_SYSVIEW_RecordExitISR() +/* +** =================================================================== +** Method : RecordExitISR (component SeggerSystemView) +** +** Description : +** Records the end of the ISR. Call this function at the end of +** the ISR to be recorded. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +#define McuSystemView_Print(s) \ + SEGGER_SYSVIEW_Print(s) +/* +** =================================================================== +** Method : Print (component SeggerSystemView) +** +** Description : +** Prints a string to the host +** Parameters : +** NAME - DESCRIPTION +** * s - Pointer to string +** Returns : Nothing +** =================================================================== +*/ + +#define McuSystemView_Warn(s) \ + SEGGER_SYSVIEW_Warn(s) +/* +** =================================================================== +** Method : Warn (component SeggerSystemView) +** +** Description : +** Prints a warning string to the host +** Parameters : +** NAME - DESCRIPTION +** * s - Pointer to string +** Returns : Nothing +** =================================================================== +*/ + +#define McuSystemView_Error(s) \ + SEGGER_SYSVIEW_Error(s) +/* +** =================================================================== +** Method : Error (component SeggerSystemView) +** +** Description : +** Prints an error string to the host +** Parameters : +** NAME - DESCRIPTION +** * s - Pointer to string +** Returns : Nothing +** =================================================================== +*/ + +#define McuSystemView_PrintfHost SEGGER_SYSVIEW_PrintfHost +/* +** =================================================================== +** Method : PrintfHost (component SeggerSystemView) +** +** Description : +** Prints a string using printf() to the host which is +** processed on the host +** Parameters : +** NAME - DESCRIPTION +** * s - Pointer to string +** Returns : Nothing +** =================================================================== +*/ + +#define McuSystemView_PrintfTarget SEGGER_SYSVIEW_PrintfTarget +/* +** =================================================================== +** Method : PrintfTarget (component SeggerSystemView) +** +** Description : +** Prints a string using printf() to the host which is +** processed first on the target +** Parameters : +** NAME - DESCRIPTION +** * s - Pointer to string +** Returns : Nothing +** =================================================================== +*/ + +#define McuSystemView_WarnfHost SEGGER_SYSVIEW_WarnfHost +/* +** =================================================================== +** Method : WarnfHost (component SeggerSystemView) +** +** Description : +** Prints a warning string using printf() to the host which is +** processed on the host +** Parameters : +** NAME - DESCRIPTION +** * s - Pointer to string +** Returns : Nothing +** =================================================================== +*/ + +#define McuSystemView_WarnfTarget SEGGER_SYSVIEW_WarnfTarget +/* +** =================================================================== +** Method : WarnfTarget (component SeggerSystemView) +** +** Description : +** Prints a warning string using printf() to the host which is +** processed first on the target +** Parameters : +** NAME - DESCRIPTION +** * s - Pointer to string +** Returns : Nothing +** =================================================================== +*/ + +#define McuSystemView_ErrorfHost SEGGER_SYSVIEW_ErrorfHost +/* +** =================================================================== +** Method : ErrorfHost (component SeggerSystemView) +** +** Description : +** Prints an error string using printf() to the host which is +** processed on the host +** Parameters : +** NAME - DESCRIPTION +** * s - Pointer to string +** Returns : Nothing +** =================================================================== +*/ + +#define McuSystemView_ErrorfTarget SEGGER_SYSVIEW_ErrorfTarget +/* +** =================================================================== +** Method : ErrorfTarget (component SeggerSystemView) +** +** Description : +** Prints an error string using printf() to the host which is +** processed first on the target +** Parameters : +** NAME - DESCRIPTION +** * s - Pointer to string +** Returns : Nothing +** =================================================================== +*/ + +#define McuSystemView_DisableEvents(DisableMask) \ + SEGGER_SYSVIEW_DisableEvents(DisableMask) + +/* +** =================================================================== +** Method : DisableEvents (component SeggerSystemView) +** +** Description : +** Disable standard SystemView events to not be generated. +** Parameters : +** NAME - DESCRIPTION +** DisableMask - Events to be disabled. +** Returns : Nothing +** =================================================================== +*/ + +#define McuSystemView_EnableEvents(EnableMask) \ + SEGGER_SYSVIEW_EnableEvents(EnableMask) + +/* +** =================================================================== +** Method : EnableEvents (component SeggerSystemView) +** +** Description : +** Enables standard SystemView events to be generated. +** Parameters : +** NAME - DESCRIPTION +** EnableMask - Events to be enabled +** Returns : Nothing +** =================================================================== +*/ + +void McuSystemView_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SeggerSystemView) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuSystemView. */ + +#endif +/* ifndef __McuSystemView_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/McuSystemViewconfig.h b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/McuSystemViewconfig.h new file mode 100644 index 0000000..8e43db0 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/McuSystemViewconfig.h @@ -0,0 +1,83 @@ +/** + * \file + * \brief Configuration header file for SeggerSystemView + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Segger SystemView module. + */ +#ifndef __McuSystemView_CONFIG_H +#define __McuSystemView_CONFIG_H + +#ifndef McuSystemView_CONFIG_GENERATE_QUEUE_EVENTS + #define McuSystemView_CONFIG_GENERATE_QUEUE_EVENTS (1) + /*!< 1: events for queues are generated. 0: no queue events are generated */ +#endif + +#ifndef McuSystemView_CONFIG_GENERATE_ISR_EVENTS + #define McuSystemView_CONFIG_GENERATE_ISR_EVENTS (1) + /*!< 1: events for ISR are generated. 0: no ISR events are generated */ +#endif + +#ifndef McuSystemView_CONFIG_GENERATE_STREAMBUFFER_EVENTS + #define McuSystemView_CONFIG_GENERATE_STREAMBUFFER_EVENTS (1) + /*!< 1: events for Stream Buffer are generated. 0: no Stream Buffer events are generated */ +#endif + +#ifndef McuSystemView_CONFIG_GENERATE_STEPTICK_EVENTS + #define McuSystemView_CONFIG_GENERATE_STEPTICK_EVENTS (1) + /*!< 1: events for tickets steps are generated. 0: no ticket step events are generated */ +#endif + +#ifndef McuSystemView_CONFIG_USE_STATIC_BUFFER + #define McuSystemView_CONFIG_USE_STATIC_BUFFER (1) + /*!< 1: Use a static buffer to generate events instead of a buffer on the stack. 0: Use a buffer on the stack */ +#endif + +#ifndef McuSystemView_CONFIG_POST_MORTEM_MODE + #define McuSystemView_CONFIG_POST_MORTEM_MODE (0) + /*!< 1: Enable post mortem analysis. 0: do not use it in post-morem mode */ +#endif + +#ifndef McuSystemView_CONFIG_RTT_BUFFER_SIZE + #define McuSystemView_CONFIG_RTT_BUFFER_SIZE (1024) + /*!< Buffer size of RTT buffer, default 1024 */ +#endif + +#ifndef McuSystemView_CONFIG_RTT_CHANNEL + #define McuSystemView_CONFIG_RTT_CHANNEL (1) + /*!< RTT channel to be used (default 1) */ +#endif + +#ifndef McuSystemView_CONFIG_SYSVIEW_RAM_BASE + #define McuSystemView_CONFIG_SYSVIEW_RAM_BASE (0x20000000) + /*!< lowest RAM address used */ +#endif + +#ifndef McuSystemView_CONFIG_SYSVIEW_CONFIG_CALLBACK + //#define McuSystemView_CONFIG_SYSVIEW_CONFIG_CALLBACK _cbSendSystemDesc + /*!< Custom SystemView configuration callback, default is _cbSendSystemDesc() */ +#endif + +// The application name to be displayed in SystemViewer +#ifndef SYSVIEW_APP_NAME + #define SYSVIEW_APP_NAME "Application" /* application name, configured in properties */ +#endif + +#define SYSVIEW_USING_PEX (McuLib_CONFIG_PEX_SDK_USED) /* 1: project is a Kinetis SDK Processor Expert project; 0: No Kinetis Processor Expert project */ +#define SYSVIEW_USING_FREERTOS (McuLib_CONFIG_SDK_USE_FREERTOS) /* 1: using FreeRTOS; 0: Bare metal */ + +#ifndef SYSVIEW_OS_NAME + #if SYSVIEW_USING_FREERTOS + #define SYSVIEW_OS_NAME "FreeRTOS" + #else + #define SYSVIEW_OS_NAME "Bare-metal" + #endif +#endif + +// The target device name +#ifndef SYSVIEW_DEVICE_NAME + #define SYSVIEW_DEVICE_NAME "Cortex" /* device name, configured in properties */ +#endif + +#endif /* __McuSystemView_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW.c b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW.c new file mode 100644 index 0000000..b4a26e1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW.c @@ -0,0 +1,3636 @@ +/** Copyright (C) SEGGER Microcontroller GmbH */ /* << EST */ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2024 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER SystemView * Real-time application analysis * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the SystemView and RTT protocol, and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* SystemView version: 3.56 * +* * +********************************************************************** +-------------------------- END-OF-HEADER ----------------------------- + +File : SEGGER_SYSVIEW.c +Purpose : System visualization API implementation. +Revision: $Rev: 29105 $ + +Additional information: + Packet format: + Packets with IDs 0..23 are standard packets with known structure. + For efficiency, they do *NOT* contain a length field. + + + Packets with IDs 24..31 are standard packets with extendible + structure and contain a length field. + + + Packet ID 31 is used for SystemView extended events. + + + Packets with IDs >= 32 always contain a length field. + + + Packet IDs: + 0.. 31 : Standard packets, known by SystemView. + 32..1023 : OS-definable packets, described in a SystemView description file. + 1024..2047 : User-definable packets, described in a SystemView description file. + 2048..32767: Undefined. + + Data encoding: + Basic types (int, short, char, ...): + Basic types are encoded little endian with most-significant bit variant + encoding. + Each encoded byte contains 7 data bits [6:0] and the MSB continuation bit. + The continuation bit indicates whether the next byte belongs to the data + (bit set) or this is the last byte (bit clear). + The most significant bits of data are encoded first, proceeding to the + least significant bits in the final byte (little endian). + + Example encoding: + Data: 0x1F4 (500) + Encoded: 0xF4 (First 7 data bits 74 | Continuation bit) + 0x03 (Second 7 data bits 03, no continuation) + + Data: 0xFFFFFFFF + Encoded: 0xFF 0xFF 0xFF 0xFF 0x0F + + Data: 0xA2 (162), 0x03 (3), 0x7000 + Encoded: 0xA2 0x01 0x03 0x80 0xE0 0x01 + + Byte arrays and strings: + Byte arrays and strings are encoded as followed by the raw data. + NumBytes is encoded as a basic type with a theoretical maximum of 4G. + + Example encoding: + Data: "Hello World\0" (0x48 0x65 0x6C 0x6C 0x6F 0x20 0x57 0x6F 0x72 0x6C 0x64 0x00) + Encoded: 0x0B 0x48 0x65 0x6C 0x6C 0x6F 0x20 0x57 0x6F 0x72 0x6C 0x64 + + Examples packets: + 01 F4 03 80 80 10 // Overflow packet. Data is a single U32. + This packet means: 500 packets lost, Timestamp is 0x40000 + + 02 0F 50 // ISR(15) Enter. Timestamp 80 (0x50) + + 03 20 // ISR Exit. Timestamp 32 (0x20) (Shortest possible packet.) + + Sample code for user defined Packets: + #define MY_ID 0x400 // Any value between 0x400 and 0x7FF + void SendMyPacket(unsigned Para0, unsigned Para1, const char* s) { + U8 aPacket[SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + MAX_STR_LEN + 1]; + U8* pPayload; + // + pPayload = SEGGER_SYSVIEW_PPREPARE_PACKET(aPacket); // Prepare the packet for SystemView + pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para0); // Add the first parameter to the packet + pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para1); // Add the second parameter to the packet + pPayload = SEGGER_SYSVIEW_EncodeString(pPayload, s, MAX_STR_LEN); // Add the string to the packet + // + SEGGER_SYSVIEW_SendPacket(&aPacket[0], pPayload, MY_ID); // Send the packet with EventId = MY_ID + } + + #define MY_ID_1 0x401 + void SendOnePara(unsigned Para0) { + SEGGER_SYSVIEW_RecordU32(MY_ID_1, Para0); + } + +*/ + +/********************************************************************* +* +* #include section +* +********************************************************************** +*/ + +#define SEGGER_SYSVIEW_C // For EXTERN statements in SEGGER_SYSVIEW.h + +#include +#include +#include +#include "SEGGER_SYSVIEW_Int.h" +#include "SEGGER_RTT.h" + +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS /* << EST: added check, otherwise compiler might complain about calling RTT init with out-of-bound RTT channel index */ + +#if 1 /* << EST */ + unsigned int SEGGER_SYSVIEW_InterruptId; +#endif + +/********************************************************************* +* +* Defines, fixed +* +********************************************************************** +*/ +#if SEGGER_SYSVIEW_ID_SHIFT + #define SHRINK_ID(Id) (((Id) - _SYSVIEW_Globals.RAMBaseAddress) >> SEGGER_SYSVIEW_ID_SHIFT) +#else + #define SHRINK_ID(Id) ((Id) - _SYSVIEW_Globals.RAMBaseAddress) +#endif + +#if SEGGER_SYSVIEW_RTT_CHANNEL > 0 + #define CHANNEL_ID_UP SEGGER_SYSVIEW_RTT_CHANNEL + #define CHANNEL_ID_DOWN SEGGER_SYSVIEW_RTT_CHANNEL +#else + #define CHANNEL_ID_UP _SYSVIEW_Globals.UpChannel + #define CHANNEL_ID_DOWN _SYSVIEW_Globals.DownChannel +#endif + +#if SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE + #if (SEGGER_SYSVIEW_RTT_BUFFER_SIZE % SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE) + #error "SEGGER_SYSVIEW_RTT_BUFFER_SIZE must be a multiple of SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE" + #endif +#endif + +/********************************************************************* +* +* Defines, configurable +* +********************************************************************** +*/ +// Timestamps may be less than full 32-bits, in which case we need to zero +// the unused bits to properly handle overflows. +// Note that this is a quite common scenario, as a 32-bit time such as +// SysTick might be scaled down to reduce bandwith +// or a 16-bit hardware time might be used. +#if SEGGER_SYSVIEW_TIMESTAMP_BITS < 32 // Eliminate unused bits in case hardware timestamps are less than 32 bits + #define MAKE_DELTA_32BIT(Delta) Delta <<= 32 - SEGGER_SYSVIEW_TIMESTAMP_BITS; \ + Delta >>= 32 - SEGGER_SYSVIEW_TIMESTAMP_BITS; +#else + #define MAKE_DELTA_32BIT(Delta) +#endif + +#if SEGGER_SYSVIEW_SUPPORT_LONG_ID + #define _MAX_ID_BYTES 5u +#else + #define _MAX_ID_BYTES 2u +#endif + +#if SEGGER_SYSVIEW_SUPPORT_LONG_DATA + #define _MAX_DATA_BYTES 5u +#else + #define _MAX_DATA_BYTES 2u +#endif + +/********************************************************************* +* +* Defines, fixed +* +********************************************************************** +*/ +#define ENABLE_STATE_OFF 0 +#define ENABLE_STATE_ON 1 +#define ENABLE_STATE_DROPPING 2 + +#define FORMAT_FLAG_LEFT_JUSTIFY (1u << 0) +#define FORMAT_FLAG_PAD_ZERO (1u << 1) +#define FORMAT_FLAG_PRINT_SIGN (1u << 2) +#define FORMAT_FLAG_ALTERNATE (1u << 3) + +#define MODULE_EVENT_OFFSET (512) + +/********************************************************************* +* +* Types, local +* +********************************************************************** +*/ +typedef struct { + U8* pBuffer; + U8* pPayload; + U8* pPayloadStart; + U32 Options; + unsigned Cnt; +} SEGGER_SYSVIEW_PRINTF_DESC; + +typedef struct { + U8 EnableState; // 0: Disabled, 1: Enabled, (2: Dropping) + U8 UpChannel; + U8 RecursionCnt; + U32 SysFreq; + U32 CPUFreq; + U32 LastTxTimeStamp; + U32 RAMBaseAddress; +#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) + U32 PacketCount; +#else + U32 DropCount; + U8 DownChannel; +#endif + U32 DisabledEvents; + const SEGGER_SYSVIEW_OS_API* pOSAPI; + SEGGER_SYSVIEW_SEND_SYS_DESC_FUNC* pfSendSysDesc; +} SEGGER_SYSVIEW_GLOBALS; + +/********************************************************************* +* +* Function prototypes, required +* +********************************************************************** +*/ +static void _SendPacket(U8* pStartPacket, U8* pEndPacket, unsigned int EventId); + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ +static const U8 _abSync[10] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +#if SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE + #ifdef SEGGER_SYSVIEW_SECTION + // + // Alignment + special section required + // + #if (defined __GNUC__) + __attribute__ ((section (SEGGER_SYSVIEW_SECTION), aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE))) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + __attribute__ ((section (SEGGER_SYSVIEW_SECTION), aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE))) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #elif (defined __ICCARM__) || (defined __ICCRX__) + #pragma location=SEGGER_SYSVIEW_SECTION + #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE + static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + #pragma location=SEGGER_SYSVIEW_SECTION + #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE + static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #elif (defined __CC_ARM) + __attribute__ ((section (SEGGER_SYSVIEW_SECTION), aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE), zero_init)) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + __attribute__ ((section (SEGGER_SYSVIEW_SECTION), aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE), zero_init)) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #else + #error "Do not know how to place SystemView buffers in specific section" + #endif + #else + // + // Only alignment required + // + #if (defined __GNUC__) + __attribute__ ((aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE))) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + __attribute__ ((aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE))) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #elif (defined __ICCARM__) || (defined __ICCRX__) + #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE + static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE + static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #elif (defined __CC_ARM) + __attribute__ ((aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE), zero_init)) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + __attribute__ ((aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE), zero_init)) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #else + #error "Do not know how to align SystemView buffers to cache line size" + #endif + #endif +#else + #ifdef SEGGER_SYSVIEW_SECTION + // + // Only special section required + // + #if (defined __GNUC__) + __attribute__ ((section (SEGGER_SYSVIEW_SECTION))) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + __attribute__ ((section (SEGGER_SYSVIEW_SECTION))) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #elif (defined __ICCARM__) || (defined __ICCRX__) + #pragma location=SEGGER_SYSVIEW_SECTION + static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + #pragma location=SEGGER_SYSVIEW_SECTION + static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #elif (defined __CC_ARM) + __attribute__ ((section (SEGGER_SYSVIEW_SECTION), zero_init)) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + __attribute__ ((section (SEGGER_SYSVIEW_SECTION), zero_init)) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #else + #error "Do not know how to place SystemView buffers in specific section" + #endif + #else + // + // Neither special section nor alignment required + // + static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #endif +#endif + +static SEGGER_SYSVIEW_GLOBALS _SYSVIEW_Globals; + +static SEGGER_SYSVIEW_MODULE* _pFirstModule; +static U8 _NumModules; + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ + +#define ENCODE_U32(pDest, Value) { \ + U8* pSysviewPointer; \ + U32 SysViewData; \ + pSysviewPointer = pDest; \ + SysViewData = Value; \ + while(SysViewData > 0x7F) { \ + *pSysviewPointer++ = (U8)(SysViewData | 0x80); \ + SysViewData >>= 7; \ + }; \ + *pSysviewPointer++ = (U8)SysViewData; \ + pDest = pSysviewPointer; \ + }; + +#if (SEGGER_SYSVIEW_USE_STATIC_BUFFER == 1) +static U8 _aPacket[SEGGER_SYSVIEW_MAX_PACKET_SIZE]; + +#define RECORD_START(PacketSize) SEGGER_SYSVIEW_LOCK(); \ + pPayloadStart = _PreparePacket(_aPacket); + +#define RECORD_END() SEGGER_SYSVIEW_UNLOCK() + +#else + +#define RECORD_START(PacketSize) U8 aPacket[(PacketSize)]; \ + pPayloadStart = _PreparePacket(aPacket); \ + +#define RECORD_END() + +#endif + +/********************************************************************* +* +* _EncodeData() +* +* Function description +* Encode a byte buffer in variable-length format. +* +* Parameters +* pPayload - Pointer to where string will be encoded. +* pSrc - Pointer to data buffer to be encoded. +* NumBytes - Number of bytes in the buffer to be encoded. +* +* Return value +* Pointer to the byte following the value, i.e. the first free +* byte in the payload and the next position to store payload +* content. +* +* Additional information +* The data is encoded as a count byte followed by the contents +* of the data buffer. +* Make sure NumBytes + 1 bytes are free for the payload. +*/ +static U8* _EncodeData(U8* pPayload, const char* pSrc, unsigned int NumBytes) { + unsigned int n; + const U8* p; + // + n = 0; + p = (const U8*)pSrc; + // + // Write Len + // + if (NumBytes < 255) { + *pPayload++ = (U8)NumBytes; + } else { + *pPayload++ = 255; + *pPayload++ = ((NumBytes >> 8) & 255); + *pPayload++ = (NumBytes & 255); + } + while (n < NumBytes) { + *pPayload++ = *p++; + n++; + } + return pPayload; +} + +/********************************************************************* +* +* _EncodeFloat() +* +* Function description +* Encode a float value in variable-length format. +* +* Parameters +* pPayload - Pointer to where value will be encoded. +* Value - Value to be encoded. +* +* Return value +* Pointer to the byte following the value, i.e. the first free +* byte in the payload and the next position to store payload +* content. +*/ +static U8* _EncodeFloat(U8* pPayload, float Value) { + float Val = Value; + U8* pSysviewPointer; + U32* SysViewData; + pSysviewPointer = pPayload; + SysViewData = (U32*)&Val; + while((*SysViewData) > 0x7F) { + *pSysviewPointer++ = (U8)((*SysViewData) | 0x80); + (*SysViewData) >>= 7; + }; + *pSysviewPointer++ = (U8)(*SysViewData); + pPayload = pSysviewPointer; + + return pPayload; +} + +/********************************************************************* +* +* _EncodeStr() +* +* Function description +* Encode a string in variable-length format. +* +* Parameters +* pPayload - Pointer to where string will be encoded. +* pText - String to encode. +* Limit - Maximum number of characters to encode from string. +* +* Return value +* Pointer to the byte following the value, i.e. the first free +* byte in the payload and the next position to store payload +* content. +* +* Additional information +* The string is encoded as a count byte followed by the contents +* of the string. +* No more than 1 + Limit bytes will be encoded to the payload. +*/ +static U8 *_EncodeStr(U8 *pPayload, const char *pText, unsigned int Limit) { + U8* pLen; + const char* sStart; + + if (pText == NULL) { + *pPayload++ = (U8)0; + } else { + sStart = pText; // Remember start of string. + // + // Save space to store count byte(s). + // + pLen = pPayload++; +#if (SEGGER_SYSVIEW_MAX_STRING_LEN >= 255) // Length always encodes in 3 bytes + pPayload += 2; +#endif + // + // Limit string to maximum length and copy into payload buffer. + // + if (Limit > SEGGER_SYSVIEW_MAX_STRING_LEN) { + Limit = SEGGER_SYSVIEW_MAX_STRING_LEN; + } + while ((Limit-- > 0) && (*pText != '\0')) { + *pPayload++ = *pText++; + } + // + // Save string length to buffer. + // +#if (SEGGER_SYSVIEW_MAX_STRING_LEN >= 255) // Length always encodes in 3 bytes + Limit = (unsigned int)(pText - sStart); + *pLen++ = (U8)255; + *pLen++ = (U8)((Limit >> 8) & 255); + *pLen++ = (U8)(Limit & 255); +#else // Length always encodes in 1 byte + *pLen = (U8)(pText - sStart); +#endif + } + // + return pPayload; +} + +/********************************************************************* +* +* _PreparePacket() +* +* Function description +* Prepare a SystemView event packet header. +* +* Parameters +* pPacket - Pointer to start of packet to initialize. +* +* Return value +* Pointer to first byte of packet payload. +* +* Additional information +* The payload length and evnetId are not initialized. +* PreparePacket only reserves space for them and they are +* computed and filled in by the sending function. +*/ +static U8* _PreparePacket(U8* pPacket) { + return pPacket + _MAX_ID_BYTES + _MAX_DATA_BYTES; +} + +/********************************************************************* +* +* _HandleIncomingPacket() +* +* Function description +* Read an incoming command from the down channel and process it. +* +* Additional information +* This function is called each time after sending a packet. +* Processing incoming packets is done asynchronous. SystemView might +* already have sent event packets after the host has sent a command. +*/ +#if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) +static void _HandleIncomingPacket(void) { + U8 Cmd; + unsigned int Status; + // + Status = SEGGER_RTT_ReadNoLock(CHANNEL_ID_DOWN, &Cmd, 1); + if (Status > 0) { + switch (Cmd) { + case SEGGER_SYSVIEW_COMMAND_ID_START: + SEGGER_SYSVIEW_Start(); + break; + case SEGGER_SYSVIEW_COMMAND_ID_STOP: + SEGGER_SYSVIEW_Stop(); + break; + case SEGGER_SYSVIEW_COMMAND_ID_GET_SYSTIME: + SEGGER_SYSVIEW_RecordSystime(); + break; + case SEGGER_SYSVIEW_COMMAND_ID_GET_TASKLIST: + SEGGER_SYSVIEW_SendTaskList(); + break; + case SEGGER_SYSVIEW_COMMAND_ID_GET_SYSDESC: + SEGGER_SYSVIEW_GetSysDesc(); + break; + case SEGGER_SYSVIEW_COMMAND_ID_GET_NUMMODULES: + SEGGER_SYSVIEW_SendNumModules(); + break; + case SEGGER_SYSVIEW_COMMAND_ID_GET_MODULEDESC: + SEGGER_SYSVIEW_SendModuleDescription(); + break; + case SEGGER_SYSVIEW_COMMAND_ID_GET_MODULE: + Status = SEGGER_RTT_ReadNoLock(CHANNEL_ID_DOWN, &Cmd, 1); + if (Status > 0) { + SEGGER_SYSVIEW_SendModule(Cmd); + } + break; + case SEGGER_SYSVIEW_COMMAND_ID_HEARTBEAT: + break; + default: + if (Cmd >= 128) { // Unknown extended command. Dummy read its parameter. + SEGGER_RTT_ReadNoLock(CHANNEL_ID_DOWN, &Cmd, 1); + } + break; + } + } +} +#endif // (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + +/********************************************************************* +* +* _TrySendOverflowPacket() +* +* Function description +* Try to transmit an SystemView Overflow packet containing the +* number of dropped packets. +* +* Additional information +* Format as follows: +* 01 Max. packet len is 1 + 5 + 5 = 11 +* +* Example packets sent +* 01 20 40 +* +* Return value +* !=0: Success, Message sent (stored in RTT-Buffer) +* ==0: Buffer full, Message *NOT* stored +* +*/ +#if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) +static int _TrySendOverflowPacket(void) { + U32 TimeStamp; + I32 Delta; + int Status; + U8 aPacket[11]; + U8* pPayload; + + aPacket[0] = SYSVIEW_EVTID_OVERFLOW; // 1 + pPayload = &aPacket[1]; + ENCODE_U32(pPayload, _SYSVIEW_Globals.DropCount); + // + // Compute time stamp delta and append it to packet. + // + TimeStamp = SEGGER_SYSVIEW_GET_TIMESTAMP(); + Delta = TimeStamp - _SYSVIEW_Globals.LastTxTimeStamp; + MAKE_DELTA_32BIT(Delta); + ENCODE_U32(pPayload, Delta); + // + // Try to store packet in RTT buffer and update time stamp when this was successful + // + Status = (int)SEGGER_RTT_WriteSkipNoLock(CHANNEL_ID_UP, aPacket, (unsigned int)(pPayload - aPacket)); + SEGGER_SYSVIEW_ON_EVENT_RECORDED(pPayload - aPacket); + if (Status) { + _SYSVIEW_Globals.LastTxTimeStamp = TimeStamp; + _SYSVIEW_Globals.EnableState--; // EnableState has been 2, will be 1. Always. + } else { + _SYSVIEW_Globals.DropCount++; + } + // + return Status; +} +#endif // (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + +/********************************************************************* +* +* _SendSyncInfo() +* +* Function description +* Send SystemView sync packet and system information in +* post mortem mode. +* +* Additional information +* Sync is 10 * 0x00 without timestamp +*/ +#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) +static void _SendSyncInfo(void) { + // + // Add sync packet ( 10 * 0x00) + // Send system description + // Send system time + // Send task list + // Send module description + // Send module information + // + SEGGER_RTT_WriteWithOverwriteNoLock(CHANNEL_ID_UP, _abSync, 10); + SEGGER_SYSVIEW_ON_EVENT_RECORDED(10); + SEGGER_SYSVIEW_RecordVoid(SYSVIEW_EVTID_TRACE_START); + { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, _SYSVIEW_Globals.SysFreq); + ENCODE_U32(pPayload, _SYSVIEW_Globals.CPUFreq); + ENCODE_U32(pPayload, _SYSVIEW_Globals.RAMBaseAddress); + ENCODE_U32(pPayload, SEGGER_SYSVIEW_ID_SHIFT); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_INIT); + RECORD_END(); + } + if (_SYSVIEW_Globals.pfSendSysDesc) { + _SYSVIEW_Globals.pfSendSysDesc(); + } + SEGGER_SYSVIEW_RecordSystime(); + SEGGER_SYSVIEW_SendTaskList(); + if (_NumModules > 0) { + int n; + SEGGER_SYSVIEW_SendNumModules(); + for (n = 0; n < _NumModules; n++) { + SEGGER_SYSVIEW_SendModule(n); + } + } +} +#endif // (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) + +/********************************************************************* +* +* _SendPacket() +* +* Function description +* Send a SystemView packet over RTT. RTT channel and mode are +* configured by macros when the SystemView component is initialized. +* This function takes care of maintaining the packet drop count +* and sending overflow packets when necessary. +* The packet must be passed without Id and Length because this +* function prepends it to the packet before transmission. +* +* Parameters +* pStartPacket - Pointer to start of packet payload. +* There must be at least 4 bytes free to prepend Id and Length. +* pEndPacket - Pointer to end of packet payload. +* EventId - Id of the event to send. +* +*/ +static void _SendPacket(U8* pStartPacket, U8* pEndPacket, unsigned int EventId) { + unsigned int NumBytes; + U32 TimeStamp; + U32 Delta; +#if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + unsigned int Status; +#endif + +#if (SEGGER_SYSVIEW_USE_STATIC_BUFFER == 0) + SEGGER_SYSVIEW_LOCK(); +#endif + +#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) + if (_SYSVIEW_Globals.EnableState == 0) { + goto SendDone; /* << EST: @suppress("Goto statement used") */ + } +#else + if (_SYSVIEW_Globals.EnableState == 1) { // Enabled, no dropped packets remaining + goto Send; /* << EST: @suppress("Goto statement used") */ + } + if (_SYSVIEW_Globals.EnableState == 0) { + goto SendDone; /* << EST: @suppress("Goto statement used") */ + } + // + // Handle buffer full situations: + // Have packets been dropped before because buffer was full? + // In this case try to send and overflow packet. + // + if (_SYSVIEW_Globals.EnableState == 2) { + _TrySendOverflowPacket(); + if (_SYSVIEW_Globals.EnableState != 1) { + goto SendDone; /* << EST: @suppress("Goto statement used") */ + } + } +Send: +#endif + // + // Check if event is disabled from being recorded. + // + if (EventId < 32) { + if (_SYSVIEW_Globals.DisabledEvents & ((U32)1u << EventId)) { + goto SendDone; /* << EST: @suppress("Goto statement used") */ + } + } + // + // Prepare actual packet. + // If it is a known packet, prepend eventId only, + // otherwise prepend packet length and eventId. + // + if (EventId < 24) { + *--pStartPacket = (U8)EventId; + } else { + // + // Get data length and prepend it. + // + NumBytes = (unsigned int)(pEndPacket - pStartPacket); +#if SEGGER_SYSVIEW_SUPPORT_LONG_DATA + if (NumBytes < 127) { + *--pStartPacket = EventId; + } else { + // + // Backwards U32 encode EventId. + // + if (NumBytes < (1ul << 14)) { // Encodes in 2 bytes + *--pStartPacket = (U8)(NumBytes >> 7); + *--pStartPacket = (U8)(NumBytes | 0x80); + } else if (NumBytes < (1ul << 21)) { // Encodes in 3 bytes + *--pStartPacket = (U8)(NumBytes >> 14); + *--pStartPacket = (U8)((NumBytes >> 7) | 0x80); + *--pStartPacket = (U8)(NumBytes | 0x80); + } else if (NumBytes < (1ul << 28)) { // Encodes in 4 bytes + *--pStartPacket = (U8)(NumBytes >> 21); + *--pStartPacket = (U8)((NumBytes >> 14) | 0x80); + *--pStartPacket = (U8)((NumBytes >> 7) | 0x80); + *--pStartPacket = (U8)(NumBytes | 0x80); + } else { // Encodes in 5 bytes + *--pStartPacket = (U8)(NumBytes >> 28); + *--pStartPacket = (U8)((NumBytes >> 21) | 0x80); + *--pStartPacket = (U8)((NumBytes >> 14) | 0x80); + *--pStartPacket = (U8)((NumBytes >> 7) | 0x80); + *--pStartPacket = (U8)(NumBytes | 0x80); + } + } +#else + if (NumBytes > 127) { + *--pStartPacket = (U8)(NumBytes >> 7); + *--pStartPacket = (U8)(NumBytes | 0x80); + } else { + *--pStartPacket = (U8)NumBytes; + } +#endif + // + // Prepend EventId. + // +#if SEGGER_SYSVIEW_SUPPORT_LONG_ID + if (EventId < 127) { + *--pStartPacket = (U8)EventId; + } else { + // + // Backwards U32 encode EventId. + // + if (EventId < (1u << 14)) { // Encodes in 2 bytes + *--pStartPacket = (U8)(EventId >> 7); + *--pStartPacket = (U8)(EventId | 0x80); + } else if (EventId < (1ul << 21)) { // Encodes in 3 bytes + *--pStartPacket = (U8)(EventId >> 14); + *--pStartPacket = (U8)((EventId >> 7) | 0x80); + *--pStartPacket = (U8)(EventId | 0x80); + } else if (EventId < (1ul << 28)) { // Encodes in 4 bytes + *--pStartPacket = (U8)(EventId >> 21); + *--pStartPacket = (U8)((EventId >> 14) | 0x80); + *--pStartPacket = (U8)((EventId >> 7) | 0x80); + *--pStartPacket = (U8)(EventId | 0x80); + } else { // Encodes in 5 bytes + *--pStartPacket = (U8)(EventId >> 28); + *--pStartPacket = (U8)((EventId >> 21) | 0x80); + *--pStartPacket = (U8)((EventId >> 14) | 0x80); + *--pStartPacket = (U8)((EventId >> 7) | 0x80); + *--pStartPacket = (U8)(EventId | 0x80); + } + } +#else + if (EventId > 127) { + *--pStartPacket = (U8)(EventId >> 7); + *--pStartPacket = (U8)(EventId | 0x80); + } else { + *--pStartPacket = (U8)EventId; + } +#endif + } + // + // Compute time stamp delta and append it to packet. + // + TimeStamp = SEGGER_SYSVIEW_GET_TIMESTAMP(); + Delta = TimeStamp - _SYSVIEW_Globals.LastTxTimeStamp; + MAKE_DELTA_32BIT(Delta); + ENCODE_U32(pEndPacket, Delta); +#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) + // + // Store packet in RTT buffer by overwriting old data and update time stamp + // + SEGGER_RTT_WriteWithOverwriteNoLock(CHANNEL_ID_UP, pStartPacket, pEndPacket - pStartPacket); + SEGGER_SYSVIEW_ON_EVENT_RECORDED(pEndPacket - pStartPacket); + _SYSVIEW_Globals.LastTxTimeStamp = TimeStamp; +#else + // + // Try to store packet in RTT buffer and update time stamp when this was successful + // + Status = SEGGER_RTT_WriteSkipNoLock(CHANNEL_ID_UP, pStartPacket, (unsigned int)(pEndPacket - pStartPacket)); + SEGGER_SYSVIEW_ON_EVENT_RECORDED(pEndPacket - pStartPacket); + if (Status) { + _SYSVIEW_Globals.LastTxTimeStamp = TimeStamp; + } else { + _SYSVIEW_Globals.EnableState++; // EnableState has been 1, will be 2. Always. + } +#endif + +#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) + // + // Add sync and system information periodically if we are in post mortem mode + // + if (_SYSVIEW_Globals.RecursionCnt == 0) { // Avoid uncontrolled nesting. This way, this routine can call itself once, but no more often than that. + _SYSVIEW_Globals.RecursionCnt = 1; + if (_SYSVIEW_Globals.PacketCount++ & (1 << SEGGER_SYSVIEW_SYNC_PERIOD_SHIFT)) { + _SendSyncInfo(); + _SYSVIEW_Globals.PacketCount = 0; + } + _SYSVIEW_Globals.RecursionCnt = 0; + } +SendDone: + ; // Avoid "label at end of compound statement" error when using static buffer +#else +SendDone: + // + // Check if host is sending data which needs to be processed. + // Note that since this code is called for every packet, it is very time critical, so we do + // only what is really needed here, which is checking if there is any data + // + if (SEGGER_RTT_HASDATA(CHANNEL_ID_DOWN)) { + if (_SYSVIEW_Globals.RecursionCnt == 0) { // Avoid uncontrolled nesting. This way, this routine can call itself once, but no more often than that. + _SYSVIEW_Globals.RecursionCnt = 1; + _HandleIncomingPacket(); + _SYSVIEW_Globals.RecursionCnt = 0; + } + } +#endif + // +#if (SEGGER_SYSVIEW_USE_STATIC_BUFFER == 0) + SEGGER_SYSVIEW_UNLOCK(); // We are done. Unlock and return +#endif +} + +#ifndef SEGGER_SYSVIEW_EXCLUDE_PRINTF // Define in project to avoid warnings about variable parameter list +/********************************************************************* +* +* _VPrintHost() +* +* Function description +* Send a format string and its parameters to the host. +* +* Parameters +* s Pointer to format string. +* Options Options to be sent to the host. +* pParamList Pointer to the list of arguments for the format string. +*/ +static int _VPrintHost(const char* s, U32 Options, va_list* pParamList) { + U32 aParas[SEGGER_SYSVIEW_MAX_ARGUMENTS]; + U32* pParas; + U32 NumArguments; + const char* p; + char c; + U8* pPayload; + U8* pPayloadStart; +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + U8 HasNonScalar; + + HasNonScalar = 0; +#endif + // + // Count number of arguments by counting '%' characters in string. + // If enabled, check for non-scalar modifier flags to format string on the target. + // + p = s; + NumArguments = 0; + for (;;) { + c = *p++; + if (c == 0) { + break; + } + if (c == '%') { + c = *p; +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT == 0 + aParas[NumArguments++] = (U32)(va_arg(*pParamList, int)); + if (NumArguments == SEGGER_SYSVIEW_MAX_ARGUMENTS) { + break; + } +#else + if (c == 's') { + HasNonScalar = 1; + break; + } else { + aParas[NumArguments++] = (U32)(va_arg(*pParamList, int)); + if (NumArguments == SEGGER_SYSVIEW_MAX_ARGUMENTS) { + break; + } + } +#endif + } + } + +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + if (HasNonScalar) { + return -1; + } +#endif + // + // Send string and parameters to host + // + { + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_MAX_STRING_LEN + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_ARGUMENTS * SEGGER_SYSVIEW_QUANTA_U32); + pPayload = _EncodeStr(pPayloadStart, s, SEGGER_SYSVIEW_MAX_STRING_LEN); + ENCODE_U32(pPayload, Options); + ENCODE_U32(pPayload, NumArguments); + pParas = aParas; + while (NumArguments--) { + ENCODE_U32(pPayload, (*pParas)); + pParas++; + } + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); + RECORD_END(); + } + return 0; +} + +/********************************************************************* +* +* _StoreChar() +* +* Function description +* Stores a character in the printf-buffer and sends the buffer when +* it is filled. +* +* Parameters +* p Pointer to the buffer description. +* c Character to be printed. +*/ +static void _StoreChar(SEGGER_SYSVIEW_PRINTF_DESC * p, char c) { + unsigned int Cnt; + U8* pPayload; + U32 Options; + + Cnt = p->Cnt; + if ((Cnt + 1u) <= SEGGER_SYSVIEW_MAX_STRING_LEN) { + *(p->pPayload++) = (U8)c; + p->Cnt = Cnt + 1u; + } + // + // Write part of string, when the buffer is full + // + if (p->Cnt == SEGGER_SYSVIEW_MAX_STRING_LEN) { + *(p->pPayloadStart) = (U8)p->Cnt; + pPayload = p->pPayload; + Options = p->Options; + ENCODE_U32(pPayload, Options); + ENCODE_U32(pPayload, 0); + _SendPacket(p->pPayloadStart, pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); + p->pPayloadStart = _PreparePacket(p->pBuffer); + p->pPayload = p->pPayloadStart + 1u; + p->Cnt = 0u; + } +} + +/********************************************************************* +* +* _PrintUnsigned() +* +* Function description +* Print an unsigned integer with the given formatting into the +* formatted string. +* +* Parameters +* pBufferDesc Pointer to the buffer description. +* v Value to be printed. +* Base Base of the value. +* NumDigits Number of digits to be printed. +* FieldWidth Width of the printed field. +* FormatFlags Flags for formatting the value. +*/ +static void _PrintUnsigned(SEGGER_SYSVIEW_PRINTF_DESC * pBufferDesc, unsigned int v, unsigned int Base, unsigned int NumDigits, unsigned int FieldWidth, unsigned int FormatFlags) { + static const char _aV2C[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + unsigned int Div; + unsigned int Digit; + unsigned int Number; + unsigned int Width; + char c; + + Number = v; + Digit = 1u; + // + // Get actual field width + // + Width = 1u; + while (Number >= Base) { + Number = (Number / Base); + Width++; + } + if (NumDigits > Width) { + Width = NumDigits; + } + // + // Print leading chars if necessary + // + if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) { + if (FieldWidth != 0u) { + if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && (NumDigits == 0u)) { + c = '0'; + } else { + c = ' '; + } + while ((FieldWidth != 0u) && (Width < FieldWidth)) { + FieldWidth--; + _StoreChar(pBufferDesc, c); + } + } + } + // + // Compute Digit. + // Loop until Digit has the value of the highest digit required. + // Example: If the output is 345 (Base 10), loop 2 times until Digit is 100. + // + while (1) { + if (NumDigits > 1u) { // User specified a min number of digits to print? => Make sure we loop at least that often, before checking anything else (> 1 check avoids problems with NumDigits being signed / unsigned) + NumDigits--; + } else { + Div = v / Digit; + if (Div < Base) { // Is our divider big enough to extract the highest digit from value? => Done + break; + } + } + Digit *= Base; + } + // + // Output digits + // + do { + Div = v / Digit; + v -= Div * Digit; + _StoreChar(pBufferDesc, _aV2C[Div]); + Digit /= Base; + } while (Digit); + // + // Print trailing spaces if necessary + // + if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == FORMAT_FLAG_LEFT_JUSTIFY) { + if (FieldWidth != 0u) { + while ((FieldWidth != 0u) && (Width < FieldWidth)) { + FieldWidth--; + _StoreChar(pBufferDesc, ' '); + } + } + } +} + +/********************************************************************* +* +* _PrintInt() +* +* Function description +* Print a signed integer with the given formatting into the +* formatted string. +* +* Parameters +* pBufferDesc Pointer to the buffer description. +* v Value to be printed. +* Base Base of the value. +* NumDigits Number of digits to be printed. +* FieldWidth Width of the printed field. +* FormatFlags Flags for formatting the value. +*/ +static void _PrintInt(SEGGER_SYSVIEW_PRINTF_DESC * pBufferDesc, int v, unsigned int Base, unsigned int NumDigits, unsigned int FieldWidth, unsigned int FormatFlags) { + unsigned int Width; + int Number; + + Number = (v < 0) ? -v : v; + + // + // Get actual field width + // + Width = 1u; + while (Number >= (int)Base) { + Number = (Number / (int)Base); + Width++; + } + if (NumDigits > Width) { + Width = NumDigits; + } + if ((FieldWidth > 0u) && ((v < 0) || ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN))) { + FieldWidth--; + } + + // + // Print leading spaces if necessary + // + if ((((FormatFlags & FORMAT_FLAG_PAD_ZERO) == 0u) || (NumDigits != 0u)) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u)) { + if (FieldWidth != 0u) { + while ((FieldWidth != 0u) && (Width < FieldWidth)) { + FieldWidth--; + _StoreChar(pBufferDesc, ' '); + } + } + } + // + // Print sign if necessary + // + if (v < 0) { + v = -v; + _StoreChar(pBufferDesc, '-'); + } else if ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN) { + _StoreChar(pBufferDesc, '+'); + } else { + + } + // + // Print leading zeros if necessary + // + if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) && (NumDigits == 0u)) { + if (FieldWidth != 0u) { + while ((FieldWidth != 0u) && (Width < FieldWidth)) { + FieldWidth--; + _StoreChar(pBufferDesc, '0'); + } + } + } + // + // Print number without sign + // + _PrintUnsigned(pBufferDesc, (unsigned int)v, Base, NumDigits, FieldWidth, FormatFlags); +} + +/********************************************************************* +* +* _VPrintTarget() +* +* Function description +* Stores a formatted string. +* This data is read by the host. +* +* Parameters +* sFormat Pointer to format string. +* Options Options to be sent to the host. +* pParamList Pointer to the list of arguments for the format string. +*/ +static void _VPrintTarget(const char* sFormat, U32 Options, va_list* pParamList) { + SEGGER_SYSVIEW_PRINTF_DESC BufferDesc; + char c; + int v; + unsigned int NumDigits; + unsigned int FormatFlags; + unsigned int FieldWidth; + U8* pPayloadStart; + const char* s; +#if SEGGER_SYSVIEW_USE_STATIC_BUFFER == 0 + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_MAX_STRING_LEN + 1 + 2 * SEGGER_SYSVIEW_QUANTA_U32); + SEGGER_SYSVIEW_LOCK(); +#else + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_MAX_STRING_LEN + 1 + 2 * SEGGER_SYSVIEW_QUANTA_U32); +#endif + +#if SEGGER_SYSVIEW_USE_STATIC_BUFFER == 0 + BufferDesc.pBuffer = aPacket; +#else + BufferDesc.pBuffer = _aPacket; +#endif + BufferDesc.Cnt = 0u; + BufferDesc.pPayloadStart = pPayloadStart; + BufferDesc.pPayload = BufferDesc.pPayloadStart + 1u; + BufferDesc.Options = Options; + + do { + c = *sFormat; + sFormat++; + if (c == 0u) { + break; + } + if (c == '%') { + // + // Filter out flags + // + FormatFlags = 0u; + v = 1; + do { + c = *sFormat; + switch (c) { + case '-': FormatFlags |= FORMAT_FLAG_LEFT_JUSTIFY; sFormat++; break; + case '0': FormatFlags |= FORMAT_FLAG_PAD_ZERO; sFormat++; break; + case '+': FormatFlags |= FORMAT_FLAG_PRINT_SIGN; sFormat++; break; + case '#': FormatFlags |= FORMAT_FLAG_ALTERNATE; sFormat++; break; + default: v = 0; break; + } + } while (v); + // + // filter out field with + // + FieldWidth = 0u; + do { + c = *sFormat; + if ((c < '0') || (c > '9')) { + break; + } + sFormat++; + FieldWidth = (FieldWidth * 10u) + ((unsigned int)c - '0'); + } while (1); + + // + // Filter out precision (number of digits to display) + // + NumDigits = 0u; + c = *sFormat; + if (c == '.') { + sFormat++; + do { + c = *sFormat; + if ((c < '0') || (c > '9')) { + break; + } + sFormat++; + NumDigits = NumDigits * 10u + ((unsigned int)c - '0'); + } while (1); + } + // + // Filter out length modifier + // + c = *sFormat; + do { + if ((c == 'l') || (c == 'h')) { + c = *sFormat; + sFormat++; + } else { + break; + } + } while (1); + // + // Handle specifiers + // + switch (c) { + case 'c': { + char c0; + v = va_arg(*pParamList, int); + c0 = (char)v; + _StoreChar(&BufferDesc, c0); + break; + } + case 'd': + v = va_arg(*pParamList, int); + _PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags); + break; + case 'u': + v = va_arg(*pParamList, int); + _PrintUnsigned(&BufferDesc, (unsigned int)v, 10u, NumDigits, FieldWidth, FormatFlags); + break; + case 'x': + case 'X': + v = va_arg(*pParamList, int); + _PrintUnsigned(&BufferDesc, (unsigned int)v, 16u, NumDigits, FieldWidth, FormatFlags); + break; + case 's': + s = va_arg(*pParamList, const char*); + if (s == NULL) { + s = "(null)"; + } + do { + c = *s; + s++; + if (c == '\0') { + break; + } + _StoreChar(&BufferDesc, c); + } while (BufferDesc.Cnt < SEGGER_SYSVIEW_MAX_STRING_LEN); + break; + case 'p': + v = va_arg(*pParamList, int); + _PrintUnsigned(&BufferDesc, (unsigned int)v, 16u, 8u, 8u, 0u); + break; + case '%': + _StoreChar(&BufferDesc, '%'); + break; + default: + break; + } + sFormat++; + } else { + _StoreChar(&BufferDesc, c); + } + } while (*sFormat); + + // + // Write remaining data, if any + // + if (BufferDesc.Cnt != 0u) { + *(BufferDesc.pPayloadStart) = (U8)BufferDesc.Cnt; + ENCODE_U32(BufferDesc.pPayload, BufferDesc.Options); + ENCODE_U32(BufferDesc.pPayload, 0); + _SendPacket(BufferDesc.pPayloadStart, BufferDesc.pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); + } +#if SEGGER_SYSVIEW_USE_STATIC_BUFFER == 0 + SEGGER_SYSVIEW_UNLOCK(); + RECORD_END(); +#else + RECORD_END(); +#endif +} +#endif // SEGGER_SYSVIEW_EXCLUDE_PRINTF + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ + +/********************************************************************* +* +* SEGGER_SYSVIEW_Init() +* +* Function description +* Initializes the SYSVIEW module. +* Must be called before the SystemView Application connects to +* the system. +* +* Parameters +* SysFreq - Frequency of timestamp, usually CPU core clock frequency. +* CPUFreq - CPU core clock frequency. +* pOSAPI - Pointer to the API structure for OS-specific functions. +* pfSendSysDesc - Pointer to record system description callback function. +* +* Additional information +* This function initializes the RTT channel used to transport +* SEGGER SystemView packets. +* The channel is assigned the label "SysView" for client software +* to identify the SystemView channel. +* +* The channel is configured with the macro SEGGER_SYSVIEW_RTT_CHANNEL. +*/ +void SEGGER_SYSVIEW_Init(U32 SysFreq, U32 CPUFreq, const SEGGER_SYSVIEW_OS_API *pOSAPI, SEGGER_SYSVIEW_SEND_SYS_DESC_FUNC pfSendSysDesc) { +#ifdef SEGGER_RTT_SECTION + // + // Explicitly initialize the RTT Control Block if it is in its dedicated section. + // + SEGGER_RTT_Init(); +#endif +#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) +#if SEGGER_SYSVIEW_RTT_CHANNEL > 0 + SEGGER_RTT_ConfigUpBuffer(SEGGER_SYSVIEW_RTT_CHANNEL, "SysView", &_UpBuffer[0], sizeof(_UpBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); +#else + _SYSVIEW_Globals.UpChannel = (U8)SEGGER_RTT_AllocUpBuffer ("SysView", &_UpBuffer[0], sizeof(_UpBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); +#endif + _SYSVIEW_Globals.RAMBaseAddress = SEGGER_SYSVIEW_ID_BASE; + _SYSVIEW_Globals.LastTxTimeStamp = SEGGER_SYSVIEW_GET_TIMESTAMP(); + _SYSVIEW_Globals.pOSAPI = pOSAPI; + _SYSVIEW_Globals.SysFreq = SysFreq; + _SYSVIEW_Globals.CPUFreq = CPUFreq; + _SYSVIEW_Globals.pfSendSysDesc = pfSendSysDesc; + _SYSVIEW_Globals.EnableState = 0; + _SYSVIEW_Globals.PacketCount = 0; +#else // (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) +#if SEGGER_SYSVIEW_RTT_CHANNEL > 0 + SEGGER_RTT_ConfigUpBuffer (SEGGER_SYSVIEW_RTT_CHANNEL, "SysView", &_UpBuffer[0], sizeof(_UpBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); + SEGGER_RTT_ConfigDownBuffer (SEGGER_SYSVIEW_RTT_CHANNEL, "SysView", &_DownBuffer[0], sizeof(_DownBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); +#elif SEGGER_SYSVIEW_RTT_CHANNEL==0 /* << EST: handle properly buffer usage for RTT channel 0 */ + _SYSVIEW_Globals.UpChannel = SEGGER_RTT_AllocUpBuffer ("SysView", &_UpBuffer[0], sizeof(_UpBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); + _SYSVIEW_Globals.DownChannel = SEGGER_RTT_AllocDownBuffer ("SysView", &_DownBuffer[0], sizeof(_DownBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); +#else + _SYSVIEW_Globals.UpChannel = (U8)SEGGER_RTT_AllocUpBuffer ("SysView", &_UpBuffer[0], sizeof(_UpBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); + _SYSVIEW_Globals.DownChannel = _SYSVIEW_Globals.UpChannel; + SEGGER_RTT_ConfigDownBuffer (_SYSVIEW_Globals.DownChannel, "SysView", &_DownBuffer[0], sizeof(_DownBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); +#endif + _SYSVIEW_Globals.RAMBaseAddress = SEGGER_SYSVIEW_ID_BASE; + _SYSVIEW_Globals.LastTxTimeStamp = SEGGER_SYSVIEW_GET_TIMESTAMP(); + _SYSVIEW_Globals.pOSAPI = pOSAPI; + _SYSVIEW_Globals.SysFreq = SysFreq; + _SYSVIEW_Globals.CPUFreq = CPUFreq; + _SYSVIEW_Globals.pfSendSysDesc = pfSendSysDesc; + _SYSVIEW_Globals.EnableState = 0; +#endif // (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_SetRAMBase() +* +* Function description +* Sets the RAM base address, which is subtracted from IDs in order +* to save bandwidth. +* +* Parameters +* RAMBaseAddress - Lowest RAM Address. (i.e. 0x20000000 on most Cortex-M) +*/ +void SEGGER_SYSVIEW_SetRAMBase(U32 RAMBaseAddress) { + _SYSVIEW_Globals.RAMBaseAddress = RAMBaseAddress; +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordVoid() +* +* Function description +* Formats and sends a SystemView packet with an empty payload. +* +* Parameters +* EventID - SystemView event ID. +*/ +void SEGGER_SYSVIEW_RecordVoid(unsigned int EventID) { + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); + // + _SendPacket(pPayloadStart, pPayloadStart, EventID); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordU32() +* +* Function description +* Formats and sends a SystemView packet containing a single U32 +* parameter payload. +* +* Parameters +* EventID - SystemView event ID. +* Value - The 32-bit parameter encoded to SystemView packet payload. +*/ +void SEGGER_SYSVIEW_RecordU32(unsigned int EventID, U32 Value) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, Value); + _SendPacket(pPayloadStart, pPayload, EventID); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordU32x2() +* +* Function description +* Formats and sends a SystemView packet containing 2 U32 parameter payload. +* +* Parameters +* EventID - SystemView event ID. +* Para0 - The 32-bit parameter encoded to SystemView packet payload. +* Para1 - The 32-bit parameter encoded to SystemView packet payload. +*/ +void SEGGER_SYSVIEW_RecordU32x2(unsigned int EventID, U32 Para0, U32 Para1) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, Para0); + ENCODE_U32(pPayload, Para1); + _SendPacket(pPayloadStart, pPayload, EventID); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordU32x3() +* +* Function description +* Formats and sends a SystemView packet containing 3 U32 parameter payload. +* +* Parameters +* EventID - SystemView event ID. +* Para0 - The 32-bit parameter encoded to SystemView packet payload. +* Para1 - The 32-bit parameter encoded to SystemView packet payload. +* Para2 - The 32-bit parameter encoded to SystemView packet payload. +*/ +void SEGGER_SYSVIEW_RecordU32x3(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 3 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, Para0); + ENCODE_U32(pPayload, Para1); + ENCODE_U32(pPayload, Para2); + _SendPacket(pPayloadStart, pPayload, EventID); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordU32x4() +* +* Function description +* Formats and sends a SystemView packet containing 4 U32 parameter payload. +* +* Parameters +* EventID - SystemView event ID. +* Para0 - The 32-bit parameter encoded to SystemView packet payload. +* Para1 - The 32-bit parameter encoded to SystemView packet payload. +* Para2 - The 32-bit parameter encoded to SystemView packet payload. +* Para3 - The 32-bit parameter encoded to SystemView packet payload. +*/ +void SEGGER_SYSVIEW_RecordU32x4(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, Para0); + ENCODE_U32(pPayload, Para1); + ENCODE_U32(pPayload, Para2); + ENCODE_U32(pPayload, Para3); + _SendPacket(pPayloadStart, pPayload, EventID); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordU32x5() +* +* Function description +* Formats and sends a SystemView packet containing 5 U32 parameter payload. +* +* Parameters +* EventID - SystemView event ID. +* Para0 - The 32-bit parameter encoded to SystemView packet payload. +* Para1 - The 32-bit parameter encoded to SystemView packet payload. +* Para2 - The 32-bit parameter encoded to SystemView packet payload. +* Para3 - The 32-bit parameter encoded to SystemView packet payload. +* Para4 - The 32-bit parameter encoded to SystemView packet payload. +*/ +void SEGGER_SYSVIEW_RecordU32x5(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 5 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, Para0); + ENCODE_U32(pPayload, Para1); + ENCODE_U32(pPayload, Para2); + ENCODE_U32(pPayload, Para3); + ENCODE_U32(pPayload, Para4); + _SendPacket(pPayloadStart, pPayload, EventID); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordU32x6() +* +* Function description +* Formats and sends a SystemView packet containing 6 U32 parameter payload. +* +* Parameters +* EventID - SystemView event ID. +* Para0 - The 32-bit parameter encoded to SystemView packet payload. +* Para1 - The 32-bit parameter encoded to SystemView packet payload. +* Para2 - The 32-bit parameter encoded to SystemView packet payload. +* Para3 - The 32-bit parameter encoded to SystemView packet payload. +* Para4 - The 32-bit parameter encoded to SystemView packet payload. +* Para5 - The 32-bit parameter encoded to SystemView packet payload. +*/ +void SEGGER_SYSVIEW_RecordU32x6(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 6 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, Para0); + ENCODE_U32(pPayload, Para1); + ENCODE_U32(pPayload, Para2); + ENCODE_U32(pPayload, Para3); + ENCODE_U32(pPayload, Para4); + ENCODE_U32(pPayload, Para5); + _SendPacket(pPayloadStart, pPayload, EventID); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordU32x7() +* +* Function description +* Formats and sends a SystemView packet containing 7 U32 parameter payload. +* +* Parameters +* EventID - SystemView event ID. +* Para0 - The 32-bit parameter encoded to SystemView packet payload. +* Para1 - The 32-bit parameter encoded to SystemView packet payload. +* Para2 - The 32-bit parameter encoded to SystemView packet payload. +* Para3 - The 32-bit parameter encoded to SystemView packet payload. +* Para4 - The 32-bit parameter encoded to SystemView packet payload. +* Para5 - The 32-bit parameter encoded to SystemView packet payload. +* Para6 - The 32-bit parameter encoded to SystemView packet payload. +*/ +void SEGGER_SYSVIEW_RecordU32x7(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 7 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, Para0); + ENCODE_U32(pPayload, Para1); + ENCODE_U32(pPayload, Para2); + ENCODE_U32(pPayload, Para3); + ENCODE_U32(pPayload, Para4); + ENCODE_U32(pPayload, Para5); + ENCODE_U32(pPayload, Para6); + _SendPacket(pPayloadStart, pPayload, EventID); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordU32x8() +* +* Function description +* Formats and sends a SystemView packet containing 8 U32 parameter payload. +* +* Parameters +* EventID - SystemView event ID. +* Para0 - The 32-bit parameter encoded to SystemView packet payload. +* Para1 - The 32-bit parameter encoded to SystemView packet payload. +* Para2 - The 32-bit parameter encoded to SystemView packet payload. +* Para3 - The 32-bit parameter encoded to SystemView packet payload. +* Para4 - The 32-bit parameter encoded to SystemView packet payload. +* Para5 - The 32-bit parameter encoded to SystemView packet payload. +* Para6 - The 32-bit parameter encoded to SystemView packet payload. +* Para7 - The 32-bit parameter encoded to SystemView packet payload. +*/ +void SEGGER_SYSVIEW_RecordU32x8(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 8 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, Para0); + ENCODE_U32(pPayload, Para1); + ENCODE_U32(pPayload, Para2); + ENCODE_U32(pPayload, Para3); + ENCODE_U32(pPayload, Para4); + ENCODE_U32(pPayload, Para5); + ENCODE_U32(pPayload, Para6); + ENCODE_U32(pPayload, Para7); + _SendPacket(pPayloadStart, pPayload, EventID); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordU32x9() +* +* Function description +* Formats and sends a SystemView packet containing 9 U32 parameter payload. +* +* Parameters +* EventID - SystemView event ID. +* Para0 - The 32-bit parameter encoded to SystemView packet payload. +* Para1 - The 32-bit parameter encoded to SystemView packet payload. +* Para2 - The 32-bit parameter encoded to SystemView packet payload. +* Para3 - The 32-bit parameter encoded to SystemView packet payload. +* Para4 - The 32-bit parameter encoded to SystemView packet payload. +* Para5 - The 32-bit parameter encoded to SystemView packet payload. +* Para6 - The 32-bit parameter encoded to SystemView packet payload. +* Para7 - The 32-bit parameter encoded to SystemView packet payload. +* Para8 - The 32-bit parameter encoded to SystemView packet payload. +*/ +void SEGGER_SYSVIEW_RecordU32x9(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7, U32 Para8) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 9 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, Para0); + ENCODE_U32(pPayload, Para1); + ENCODE_U32(pPayload, Para2); + ENCODE_U32(pPayload, Para3); + ENCODE_U32(pPayload, Para4); + ENCODE_U32(pPayload, Para5); + ENCODE_U32(pPayload, Para6); + ENCODE_U32(pPayload, Para7); + ENCODE_U32(pPayload, Para8); + _SendPacket(pPayloadStart, pPayload, EventID); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordU32x10() +* +* Function description +* Formats and sends a SystemView packet containing 10 U32 parameter payload. +* +* Parameters +* EventID - SystemView event ID. +* Para0 - The 32-bit parameter encoded to SystemView packet payload. +* Para1 - The 32-bit parameter encoded to SystemView packet payload. +* Para2 - The 32-bit parameter encoded to SystemView packet payload. +* Para3 - The 32-bit parameter encoded to SystemView packet payload. +* Para4 - The 32-bit parameter encoded to SystemView packet payload. +* Para5 - The 32-bit parameter encoded to SystemView packet payload. +* Para6 - The 32-bit parameter encoded to SystemView packet payload. +* Para7 - The 32-bit parameter encoded to SystemView packet payload. +* Para8 - The 32-bit parameter encoded to SystemView packet payload. +* Para9 - The 32-bit parameter encoded to SystemView packet payload. +*/ +void SEGGER_SYSVIEW_RecordU32x10(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7, U32 Para8, U32 Para9) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 10 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, Para0); + ENCODE_U32(pPayload, Para1); + ENCODE_U32(pPayload, Para2); + ENCODE_U32(pPayload, Para3); + ENCODE_U32(pPayload, Para4); + ENCODE_U32(pPayload, Para5); + ENCODE_U32(pPayload, Para6); + ENCODE_U32(pPayload, Para7); + ENCODE_U32(pPayload, Para8); + ENCODE_U32(pPayload, Para9); + _SendPacket(pPayloadStart, pPayload, EventID); + RECORD_END(); +} +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordString() +* +* Function description +* Formats and sends a SystemView packet containing a string. +* +* Parameters +* EventID - SystemView event ID. +* pString - The string to be sent in the SystemView packet payload. +* +* Additional information +* The string is encoded as a count byte followed by the contents +* of the string. +* No more than SEGGER_SYSVIEW_MAX_STRING_LEN bytes will be encoded to the payload. +*/ +void SEGGER_SYSVIEW_RecordString(unsigned int EventID, const char* pString) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); + // + pPayload = _EncodeStr(pPayloadStart, pString, SEGGER_SYSVIEW_MAX_STRING_LEN); + _SendPacket(pPayloadStart, pPayload, EventID); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_Start() +* +* Function description +* Start recording SystemView events. +* +* This function is triggered by the SystemView Application on connect. +* For single-shot or post-mortem mode recording, it needs to be called +* by the application. +* +* Additional information +* This function enables transmission of SystemView packets recorded +* by subsequent trace calls and records a SystemView Start event. +* +* As part of start, a SystemView Init packet is sent, containing the system +* frequency. The list of current tasks, the current system time and the +* system description string is sent, too. +* +* Notes +* SEGGER_SYSVIEW_Start and SEGGER_SYSVIEW_Stop do not nest. +* When SEGGER_SYSVIEW_CAN_RESTART is 1, each received start command +* records the system information. This is required to enable restart +* of recordings when SystemView unexpectedly disconnects without sending +* a stop command before. +*/ +void SEGGER_SYSVIEW_Start(void) { +#if (SEGGER_SYSVIEW_CAN_RESTART == 0) + if (_SYSVIEW_Globals.EnableState == 0) { +#endif + _SYSVIEW_Globals.EnableState = 1; +#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) + _SendSyncInfo(); +#else + SEGGER_SYSVIEW_LOCK(); + SEGGER_RTT_WriteSkipNoLock(CHANNEL_ID_UP, _abSync, 10); + SEGGER_SYSVIEW_UNLOCK(); + SEGGER_SYSVIEW_ON_EVENT_RECORDED(10); + SEGGER_SYSVIEW_RecordVoid(SYSVIEW_EVTID_TRACE_START); + { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, _SYSVIEW_Globals.SysFreq); + ENCODE_U32(pPayload, _SYSVIEW_Globals.CPUFreq); + ENCODE_U32(pPayload, _SYSVIEW_Globals.RAMBaseAddress); + ENCODE_U32(pPayload, SEGGER_SYSVIEW_ID_SHIFT); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_INIT); + RECORD_END(); + } + if (_SYSVIEW_Globals.pfSendSysDesc) { + _SYSVIEW_Globals.pfSendSysDesc(); + } + SEGGER_SYSVIEW_RecordSystime(); + SEGGER_SYSVIEW_SendTaskList(); + SEGGER_SYSVIEW_SendNumModules(); +#endif +#if (SEGGER_SYSVIEW_CAN_RESTART == 0) + } +#endif +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_Stop() +* +* Function description +* Stop recording SystemView events. +* +* This function is triggered by the SystemView Application on disconnect. +* For single-shot or postmortem mode recording, it can be called +* by the application. +* +* Additional information +* This function disables transmission of SystemView packets recorded +* by subsequent trace calls. If transmission is enabled when +* this function is called, a single SystemView Stop event is recorded +* to the trace, send, and then trace transmission is halted. +*/ +void SEGGER_SYSVIEW_Stop(void) { + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); + // + if (_SYSVIEW_Globals.EnableState) { + _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_TRACE_STOP); + _SYSVIEW_Globals.EnableState = 0; + } + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_GetChannelID() +* +* Function description +* Returns the RTT / channel ID used by SystemView. +*/ +int SEGGER_SYSVIEW_GetChannelID(void) { + return CHANNEL_ID_UP; +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_GetSysDesc() +* +* Function description +* Triggers a send of the system information and description. +* +*/ +void SEGGER_SYSVIEW_GetSysDesc(void) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, _SYSVIEW_Globals.SysFreq); + ENCODE_U32(pPayload, _SYSVIEW_Globals.CPUFreq); + ENCODE_U32(pPayload, _SYSVIEW_Globals.RAMBaseAddress); + ENCODE_U32(pPayload, SEGGER_SYSVIEW_ID_SHIFT); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_INIT); + RECORD_END(); + if (_SYSVIEW_Globals.pfSendSysDesc) { + _SYSVIEW_Globals.pfSendSysDesc(); + } +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_SendTaskInfo() +* +* Function description +* Send a Task Info Packet, containing TaskId for identification, +* task priority and task name. +* +* Parameters +* pInfo - Pointer to task information to send. +*/ +void SEGGER_SYSVIEW_SendTaskInfo(const SEGGER_SYSVIEW_TASKINFO *pInfo) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32 + 1 + 32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, SHRINK_ID(pInfo->TaskID)); + ENCODE_U32(pPayload, pInfo->Prio); + pPayload = _EncodeStr(pPayload, pInfo->sName, 32); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_INFO); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, SHRINK_ID(pInfo->TaskID)); + ENCODE_U32(pPayload, pInfo->StackBase); + ENCODE_U32(pPayload, pInfo->StackSize); + ENCODE_U32(pPayload, pInfo->StackUsage); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_STACK_INFO); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_SendStackInfo() +* +* Function description +* Send a Stack Info Packet, containing TaskId for identification, +* stack base, stack size and stack usage. +* +* +* Parameters +* pInfo - Pointer to stack information to send. +*/ +void SEGGER_SYSVIEW_SendStackInfo(const SEGGER_SYSVIEW_STACKINFO *pInfo) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, SHRINK_ID(pInfo->TaskID)); + ENCODE_U32(pPayload, pInfo->StackBase); + ENCODE_U32(pPayload, pInfo->StackSize); + ENCODE_U32(pPayload, pInfo->StackUsage); + + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_SampleData() +* +* Function description +* Send a Data Sample Packet, containing the data Id and the value. +* +* +* Parameters +* pInfo - Pointer to data sample struct to send. +*/ +void SEGGER_SYSVIEW_SampleData(const SEGGER_SYSVIEW_DATA_SAMPLE *pInfo) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32); + + pPayload = pPayloadStart; + ENCODE_U32(pPayload, pInfo->ID); + pPayload = _EncodeFloat(pPayload, *(pInfo->pValue.pFloat_Value)); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_DATA_SAMPLE); + + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_SendTaskList() +* +* Function description +* Send all tasks descriptors to the host. +*/ +void SEGGER_SYSVIEW_SendTaskList(void) { + if (_SYSVIEW_Globals.pOSAPI && _SYSVIEW_Globals.pOSAPI->pfSendTaskList) { + _SYSVIEW_Globals.pOSAPI->pfSendTaskList(); + } +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_SendSysDesc() +* +* Function description +* Send the system description string to the host. +* The system description is used by the SystemView Application +* to identify the current application and handle events accordingly. +* +* The system description is usually called by the system description +* callback, to ensure it is only sent when the SystemView Application +* is connected. +* +* Parameters +* sSysDesc - Pointer to the 0-terminated system description string. +* +* Additional information +* One system description string may not exceed SEGGER_SYSVIEW_MAX_STRING_LEN characters. +* Multiple description strings can be recorded. +* +* The Following items can be described in a system description string. +* Each item is identified by its identifier, followed by '=' and the value. +* Items are separated by ','. +*/ +void SEGGER_SYSVIEW_SendSysDesc(const char *sSysDesc) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); + // + pPayload = _EncodeStr(pPayloadStart, sSysDesc, SEGGER_SYSVIEW_MAX_STRING_LEN); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_SYSDESC); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordSystime() +* +* Function description +* Formats and sends a SystemView Systime containing a single U64 or U32 +* parameter payload. +*/ +void SEGGER_SYSVIEW_RecordSystime(void) { + U64 Systime; + + if (_SYSVIEW_Globals.pOSAPI && _SYSVIEW_Globals.pOSAPI->pfGetTime) { + Systime = _SYSVIEW_Globals.pOSAPI->pfGetTime(); + SEGGER_SYSVIEW_RecordU32x2(SYSVIEW_EVTID_SYSTIME_US, + (U32)(Systime), + (U32)(Systime >> 32)); + } else { + SEGGER_SYSVIEW_RecordU32(SYSVIEW_EVTID_SYSTIME_CYCLES, SEGGER_SYSVIEW_GET_TIMESTAMP()); + } +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordEnterISR() +* +* Function description +* Format and send an ISR entry event. +* +* Additional information +* Example packets sent +* 02 0F 50 // ISR(15) Enter. Timestamp is 80 (0x50) +*/ +void SEGGER_SYSVIEW_RecordEnterISR(void) { + unsigned v; + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + v = SEGGER_SYSVIEW_GET_INTERRUPT_ID(); + ENCODE_U32(pPayload, v); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_ISR_ENTER); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordExitISR() +* +* Function description +* Format and send an ISR exit event. +* +* Additional information +* Format as follows: +* 03 // Max. packet len is 6 +* +* Example packets sent +* 03 20 // ISR Exit. Timestamp is 32 (0x20) +*/ +void SEGGER_SYSVIEW_RecordExitISR(void) { + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); + // + _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_ISR_EXIT); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordExitISRToScheduler() +* +* Function description +* Format and send an ISR exit into scheduler event. +* +* Additional information +* Format as follows: +* 18 // Max. packet len is 6 +* +* Example packets sent +* 18 20 // ISR Exit to Scheduler. Timestamp is 32 (0x20) +*/ +void SEGGER_SYSVIEW_RecordExitISRToScheduler(void) { + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); + // + _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_ISR_TO_SCHEDULER); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordEnterTimer() +* +* Function description +* Format and send a Timer entry event. +* +* Parameters +* TimerId - Id of the timer which starts. +*/ +void SEGGER_SYSVIEW_RecordEnterTimer(U32 TimerId) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, SHRINK_ID(TimerId)); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TIMER_ENTER); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordExitTimer() +* +* Function description +* Format and send a Timer exit event. +*/ +void SEGGER_SYSVIEW_RecordExitTimer(void) { + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); + // + _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_TIMER_EXIT); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordEndCall() +* +* Function description +* Format and send an End API Call event without return value. +* +* Parameters +* EventID - Id of API function which ends. +*/ +void SEGGER_SYSVIEW_RecordEndCall(unsigned int EventID) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, EventID); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_END_CALL); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordEndCallU32() +* +* Function description +* Format and send an End API Call event with return value. +* +* Parameters +* EventID - Id of API function which ends. +* Para0 - Return value which will be returned by the API function. +*/ +void SEGGER_SYSVIEW_RecordEndCallU32(unsigned int EventID, U32 Para0) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, EventID); + ENCODE_U32(pPayload, Para0); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_END_CALL); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_OnIdle() +* +* Function description +* Record an Idle event. +*/ +void SEGGER_SYSVIEW_OnIdle(void) { + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); + // + _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_IDLE); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_OnTaskCreate() +* +* Function description +* Record a Task Create event. The Task Create event corresponds +* to creating a task in the OS. +* +* Parameters +* TaskId - Task ID of created task. +*/ +void SEGGER_SYSVIEW_OnTaskCreate(U32 TaskId) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + TaskId = SHRINK_ID(TaskId); + ENCODE_U32(pPayload, TaskId); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_CREATE); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_OnTaskTerminate() +* +* Function description +* Record a Task termination event. +* The Task termination event corresponds to terminating a task in +* the OS. If the TaskId is the currently active task, +* SEGGER_SYSVIEW_OnTaskStopExec may be used, either. +* +* Parameters +* TaskId - Task ID of terminated task. +*/ +void SEGGER_SYSVIEW_OnTaskTerminate(U32 TaskId) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + TaskId = SHRINK_ID(TaskId); + ENCODE_U32(pPayload, TaskId); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_TERMINATE); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_OnTaskStartExec() +* +* Function description +* Record a Task Start Execution event. The Task Start event +* corresponds to when a task has started to execute rather than +* when it is ready to execute. +* +* Parameters +* TaskId - Task ID of task that started to execute. +*/ +void SEGGER_SYSVIEW_OnTaskStartExec(U32 TaskId) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + TaskId = SHRINK_ID(TaskId); + ENCODE_U32(pPayload, TaskId); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_START_EXEC); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_OnTaskStopExec() +* +* Function description +* Record a Task Stop Execution event. The Task Stop event +* corresponds to when a task stops executing and terminates. +*/ +void SEGGER_SYSVIEW_OnTaskStopExec(void) { + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); + // + _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_TASK_STOP_EXEC); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_OnTaskStartReady() +* +* Function description +* Record a Task Start Ready event. +* +* Parameters +* TaskId - Task ID of task that started to execute. +*/ +void SEGGER_SYSVIEW_OnTaskStartReady(U32 TaskId) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + TaskId = SHRINK_ID(TaskId); + ENCODE_U32(pPayload, TaskId); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_START_READY); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_OnTaskStopReady() +* +* Function description +* Record a Task Stop Ready event. +* +* Parameters +* TaskId - Task ID of task that completed execution. +* Cause - Reason for task to stop (i.e. Idle/Sleep) +*/ +void SEGGER_SYSVIEW_OnTaskStopReady(U32 TaskId, unsigned int Cause) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + TaskId = SHRINK_ID(TaskId); + ENCODE_U32(pPayload, TaskId); + ENCODE_U32(pPayload, Cause); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_STOP_READY); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_MarkStart() +* +* Function description +* Record a Performance Marker Start event to start measuring runtime. +* +* Parameters +* MarkerId - User defined ID for the marker. +*/ +void SEGGER_SYSVIEW_MarkStart(unsigned MarkerId) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, MarkerId); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_MARK_START); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_MarkStop() +* +* Function description +* Record a Performance Marker Stop event to stop measuring runtime. +* +* Parameters +* MarkerId - User defined ID for the marker. +*/ +void SEGGER_SYSVIEW_MarkStop(unsigned MarkerId) { + U8 * pPayload; + U8 * pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, MarkerId); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_MARK_STOP); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_Mark() +* +* Function description +* Record a Performance Marker intermediate event. +* +* Parameters +* MarkerId - User defined ID for the marker. +*/ +void SEGGER_SYSVIEW_Mark(unsigned int MarkerId) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, SYSVIEW_EVTID_EX_MARK); + ENCODE_U32(pPayload, MarkerId); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_EX); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_NameMarker() +* +* Function description +* Send the name of a Performance Marker to be displayed in SystemView. +* +* Marker names are usually set in the system description +* callback, to ensure it is only sent when the SystemView Application +* is connected. +* +* Parameters +* MarkerId - User defined ID for the marker. +* sName - Pointer to the marker name. (Max. SEGGER_SYSVIEW_MAX_STRING_LEN Bytes) +*/ +void SEGGER_SYSVIEW_NameMarker(unsigned int MarkerId, const char* sName) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, SYSVIEW_EVTID_EX_NAME_MARKER); + ENCODE_U32(pPayload, MarkerId); + pPayload = _EncodeStr(pPayload, sName, SEGGER_SYSVIEW_MAX_STRING_LEN); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_EX); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_NameResource() +* +* Function description +* Send the name of a resource to be displayed in SystemView. +* +* Marker names are usually set in the system description +* callback, to ensure it is only sent when the SystemView Application +* is connected. +* +* Parameters +* ResourceId - Id of the resource to be named. i.e. its address. +* sName - Pointer to the resource name. (Max. SEGGER_SYSVIEW_MAX_STRING_LEN Bytes) +*/ +void SEGGER_SYSVIEW_NameResource(U32 ResourceId, const char* sName) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32 + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, SHRINK_ID(ResourceId)); + pPayload = _EncodeStr(pPayload, sName, SEGGER_SYSVIEW_MAX_STRING_LEN); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_NAME_RESOURCE); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RegisterData() +* +* Function description +* Register data to sample the values via SystemView. +* +* Register functions are usually set in the system description +* callback, to ensure it is only sent when the SystemView Application +* is connected. +* +* Parameters +* pInfo - Struct containing all possible properties that can be sent via this registration event. +*/ +void SEGGER_SYSVIEW_RegisterData(SEGGER_SYSVIEW_DATA_REGISTER* pInfo) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 8 * SEGGER_SYSVIEW_QUANTA_U32 + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, SYSVIEW_EVTID_EX_REGISTER_DATA); + ENCODE_U32(pPayload, pInfo->ID); + pPayload = _EncodeStr(pPayload, pInfo->sName, SEGGER_SYSVIEW_MAX_STRING_LEN); + + if (pInfo->sName != 0) { + ENCODE_U32(pPayload, pInfo->DataType); + ENCODE_U32(pPayload, pInfo->Offset); + ENCODE_U32(pPayload, pInfo->RangeMin); + ENCODE_U32(pPayload, pInfo->RangeMax); + pPayload = _EncodeFloat(pPayload, pInfo->ScalingFactor); + pPayload = _EncodeStr(pPayload, pInfo->sUnit, SEGGER_SYSVIEW_MAX_STRING_LEN); + } else if (pInfo->ScalingFactor != 0) { + ENCODE_U32(pPayload, pInfo->DataType); + ENCODE_U32(pPayload, pInfo->Offset); + ENCODE_U32(pPayload, pInfo->RangeMin); + ENCODE_U32(pPayload, pInfo->RangeMax); + pPayload = _EncodeFloat(pPayload, pInfo->ScalingFactor); + } else if (pInfo->RangeMax != 0) { + ENCODE_U32(pPayload, pInfo->DataType); + ENCODE_U32(pPayload, pInfo->Offset); + ENCODE_U32(pPayload, pInfo->RangeMin); + ENCODE_U32(pPayload, pInfo->RangeMax); + } else if (pInfo->RangeMin != 0) { + ENCODE_U32(pPayload, pInfo->DataType); + ENCODE_U32(pPayload, pInfo->Offset); + ENCODE_U32(pPayload, pInfo->RangeMin); + } else if (pInfo->Offset != 0) { + ENCODE_U32(pPayload, pInfo->DataType); + ENCODE_U32(pPayload, pInfo->Offset); + } else if (pInfo->DataType != 0) { + ENCODE_U32(pPayload, pInfo->DataType); + } + + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_EX); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_HeapDefine() +* +* Function description +* Define heap. +* +* Parameters +* pHeap - Pointer to heap control structure. +* pBase - Pointer to managed heap memory. +* HeapSize - Size of managed heap memory in bytes. +* MetadataSize - Size of metadata associated with each heap allocation. +* +* Additional information +* SystemView can track allocations across multiple heaps. +* +* HeapSize must be a multiple of the natural alignment unit of the +* target. This size is subject to compression, controlled by the +* specific setting of SEGGER_SYSVIEW_ID_SHIFT. +* +* MetadataSize defines the size of the per-allocation metadata. +* For many heap implementations, the metadata size is a multiple of +* the word size of the machine and typically contains the size +* of the allocated block (used upon deallocation), optional +* pointers to the preceding and/or following blocks, and optionally +* a tag identifying the owner of the block. Note that MetadataSize +* is not compressed within the SystemView packet and is not +* required to be a multiple of 1<> SEGGER_SYSVIEW_ID_SHIFT); + ENCODE_U32(pPayload, MetadataSize); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_EX); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_HeapAlloc() +* +* Function description +* Record a system-heap allocation event. +* +* Parameters +* pHeap - Pointer to heap where allocation was made. +* pUserData - Pointer to allocated user data. +* UserDataLen - Size of block allocated to hold user data, excluding any metadata. +* +* Additional information +* The user data must be correctly aligned for the architecture, which +* typically requires that the alignment is at least the alignment +* of a double or a long long. pUserData is, therefore, compressed by +* shrinking as IDs are compressed, controlled by the specific setting +* of SEGGER_SYSVIEW_ID_SHIFT. +* +* In the same way, UserDataLen must reflect the size of the allocated +* block, not the allocation size requested by the application. This +* size is also subject to compression, controlled by the specific setting +* of SEGGER_SYSVIEW_ID_SHIFT. +* +* As an example, assume the allocator is running on a Cortex-M device +* with SEGGER_SYSVIEW_ID_SHIFT set to 2 (the word alignment of the device). +* If a user requests an allocation of 5 bytes, a hypothetical heap +* allocator could allocate a block with size 32 bytes for this. The value +* of UserDataLen sent to SystemView for recording should be 32, not 5, +* and the 32 is compressed by shifting by two bits, the configured value +* of SEGGER_SYSVIEW_ID_SHIFT, and describes the number of bytes that are +* consumed from managed memory from which SystemView can calculate +* accurate heap metrics. +*/ +void SEGGER_SYSVIEW_HeapAlloc(void *pHeap, void* pUserData, unsigned int UserDataLen) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 3 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, SYSVIEW_EVTID_EX_HEAP_ALLOC); + ENCODE_U32(pPayload, SHRINK_ID((U32)pHeap)); + ENCODE_U32(pPayload, SHRINK_ID((U32)pUserData)); + ENCODE_U32(pPayload, UserDataLen >> SEGGER_SYSVIEW_ID_SHIFT); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_EX); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_HeapAllocEx() +* +* Function description +* Record a per-heap allocation event. +* +* Parameters +* pHeap - Pointer to heap where allocation was made. +* pUserData - Pointer to allocated user data. +* UserDataLen - Size of block allocated to hold user data, excluding any metadata. +* Tag - Block tag, typically used to identify the owner of the block. +* +* Additional information +* The user data must be correctly aligned for the architecture, which +* typically requires that the alignment is at least the alignment +* of a double or a long long. pUserData is, therefore, compressed by +* shrinking as IDs are compressed, controlled by the specific setting +* of SEGGER_SYSVIEW_ID_SHIFT. +* +* In the same way, UserDataLen must reflect the size of the allocated +* block, not the allocation size requested by the application. This +* size is also subject to compression, controlled by the specific setting +* of SEGGER_SYSVIEW_ID_SHIFT. +* +* As an example, assume the allocator is running on a Cortex-M device +* with SEGGER_SYSVIEW_ID_SHIFT set to 2 (the word alignment of the device). +* If a user requests an allocation of 5 bytes, a hypothetical heap +* allocator could allocate a block with size 32 bytes for this. The value +* of UserDataLen sent to SystemView for recording should be 32, not 5, +* and the 32 is compressed by shifting by two bits, the configured value +* of SEGGER_SYSVIEW_ID_SHIFT, and describes the number of bytes that are +* consumed from managed memory from which SystemView can calculate +* accurate heap metrics. +* +* See also +* SEGGER_SYSVIEW_HeapAlloc(). +*/ +void SEGGER_SYSVIEW_HeapAllocEx(void *pHeap, void* pUserData, unsigned int UserDataLen, unsigned int Tag) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 5 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, SYSVIEW_EVTID_EX_HEAP_ALLOC_EX); + ENCODE_U32(pPayload, SHRINK_ID((U32)pHeap)); + ENCODE_U32(pPayload, SHRINK_ID((U32)pUserData)); + ENCODE_U32(pPayload, UserDataLen >> SEGGER_SYSVIEW_ID_SHIFT); + ENCODE_U32(pPayload, Tag); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_EX); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_HeapFree() +* +* Function description +* Record a heap deallocation event. +* +* Parameters +* pHeap - Pointer to heap where allocation was made. +* pUserData - Pointer to allocated user data. +* +* Additional information +* SystemViews track allocations and knows the size of the +* allocated data. +*/ +void SEGGER_SYSVIEW_HeapFree(void* pHeap, void* pUserData) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, SYSVIEW_EVTID_EX_HEAP_FREE); + ENCODE_U32(pPayload, SHRINK_ID((U32)pHeap)); + ENCODE_U32(pPayload, SHRINK_ID((U32)pUserData)); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_EX); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_SendPacket() +* +* Function description +* Send an event packet. +* +* Parameters +* pPacket - Pointer to the start of the packet. +* pPayloadEnd - Pointer to the end of the payload. +* Make sure there are at least 5 bytes free after the payload. +* EventId - Id of the event packet. +* +* Return value +* !=0: Success, Message sent. +* ==0: Buffer full, Message *NOT* sent. +*/ +int SEGGER_SYSVIEW_SendPacket(U8* pPacket, U8* pPayloadEnd, unsigned int EventId) { +#if (SEGGER_SYSVIEW_USE_STATIC_BUFFER == 1) + SEGGER_SYSVIEW_LOCK(); +#endif + _SendPacket(pPacket + 4, pPayloadEnd, EventId); +#if (SEGGER_SYSVIEW_USE_STATIC_BUFFER == 1) + SEGGER_SYSVIEW_UNLOCK(); +#endif + return 0; +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_EncodeU32() +* +* Function description +* Encode a U32 in variable-length format. +* +* Parameters +* pPayload - Pointer to where U32 will be encoded. +* Value - The 32-bit value to be encoded. +* +* Return value +* Pointer to the byte following the value, i.e. the first free +* byte in the payload and the next position to store payload +* content. +*/ +U8* SEGGER_SYSVIEW_EncodeU32(U8* pPayload, U32 Value) { + ENCODE_U32(pPayload, Value); + return pPayload; +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_EncodeString() +* +* Function description +* Encode a string in variable-length format. +* +* Parameters +* pPayload - Pointer to where string will be encoded. +* s - String to encode. +* MaxLen - Maximum number of characters to encode from string. +* +* Return value +* Pointer to the byte following the value, i.e. the first free +* byte in the payload and the next position to store payload +* content. +* +* Additional information +* The string is encoded as a count byte followed by the contents +* of the string. +* No more than 1 + MaxLen bytes will be encoded to the payload. +*/ +U8* SEGGER_SYSVIEW_EncodeString(U8* pPayload, const char* s, unsigned int MaxLen) { + return _EncodeStr(pPayload, s, MaxLen); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_EncodeData() +* +* Function description +* Encode a byte buffer in variable-length format. +* +* Parameters +* pPayload - Pointer to where string will be encoded. +* pSrc - Pointer to data buffer to be encoded. +* NumBytes - Number of bytes in the buffer to be encoded. +* +* Return value +* Pointer to the byte following the value, i.e. the first free +* byte in the payload and the next position to store payload +* content. +* +* Additional information +* The data is encoded as a count byte followed by the contents +* of the data buffer. +* Make sure NumBytes + 1 bytes are free for the payload. +*/ +U8* SEGGER_SYSVIEW_EncodeData(U8 *pPayload, const char* pSrc, unsigned int NumBytes) { + return _EncodeData(pPayload, pSrc, NumBytes); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_EncodeId() +* +* Function description +* Encode a 32-bit Id in shrunken variable-length format. +* +* Parameters +* pPayload - Pointer to where the Id will be encoded. +* Id - The 32-bit value to be encoded. +* +* Return value +* Pointer to the byte following the value, i.e. the first free +* byte in the payload and the next position to store payload +* content. +* +* Additional information +* The parameters to shrink an Id can be configured in +* SEGGER_SYSVIEW_Conf.h and via SEGGER_SYSVIEW_SetRAMBase(). +* SEGGER_SYSVIEW_ID_BASE: Lowest Id reported by the application. +* (i.e. 0x20000000 when all Ids are an address in this RAM) +* SEGGER_SYSVIEW_ID_SHIFT: Number of bits to shift the Id to +* save bandwidth. (i.e. 2 when Ids are 4 byte aligned) +*/ +U8* SEGGER_SYSVIEW_EncodeId(U8* pPayload, U32 Id) { + Id = SHRINK_ID(Id); + ENCODE_U32(pPayload, Id); + return pPayload; +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_ShrinkId() +* +* Function description +* Get the shrunken value of an Id for further processing like in +* SEGGER_SYSVIEW_NameResource(). +* +* Parameters +* Id - The 32-bit value to be shrunken. +* +* Return value +* Shrunken Id. +* +* Additional information +* The parameters to shrink an Id can be configured in +* SEGGER_SYSVIEW_Conf.h and via SEGGER_SYSVIEW_SetRAMBase(). +* SEGGER_SYSVIEW_ID_BASE: Lowest Id reported by the application. +* (i.e. 0x20000000 when all Ids are an address in this RAM) +* SEGGER_SYSVIEW_ID_SHIFT: Number of bits to shift the Id to +* save bandwidth. (i.e. 2 when Ids are 4 byte aligned) +*/ +U32 SEGGER_SYSVIEW_ShrinkId(U32 Id) { + return SHRINK_ID(Id); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RegisterModule() +* +* Function description +* Register a middleware module for recording its events. +* +* Parameters +* pModule - The middleware module information. +* +* Additional information +* SEGGER_SYSVIEW_MODULE elements: +* sDescription - Pointer to a string containing the module name and optionally the module event description. +* NumEvents - Number of events the module wants to register. +* EventOffset - Offset to be added to the event Ids. Out parameter, set by this function. Do not modify after calling this function. +* pfSendModuleDesc - Callback function pointer to send more detailed module description to SystemView Application. +* pNext - Pointer to next registered module. Out parameter, set by this function. Do not modify after calling this function. +*/ +void SEGGER_SYSVIEW_RegisterModule(SEGGER_SYSVIEW_MODULE* pModule) { + SEGGER_SYSVIEW_LOCK(); + if (_pFirstModule == 0) { + // + // No module registered, yet. + // Start list with new module. + // EventOffset is the base offset for modules + // + pModule->EventOffset = MODULE_EVENT_OFFSET; + pModule->pNext = 0; + _pFirstModule = pModule; + _NumModules = 1; + } else { + // + // Registreded module(s) present. + // Prepend new module in list. + // EventOffset set from number of events and offset of previous module. + // + pModule->EventOffset = _pFirstModule->EventOffset + _pFirstModule->NumEvents; + pModule->pNext = _pFirstModule; + _pFirstModule = pModule; + _NumModules++; + } + SEGGER_SYSVIEW_SendModule(0); + SEGGER_SYSVIEW_UNLOCK(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordModuleDescription() +* +* Function description +* Sends detailed information of a registered module to the host. +* +* Parameters +* pModule - Pointer to the described module. +* sDescription - Pointer to a description string. +*/ +void SEGGER_SYSVIEW_RecordModuleDescription(const SEGGER_SYSVIEW_MODULE* pModule, const char* sDescription) { + U8 ModuleId; + SEGGER_SYSVIEW_MODULE* p; + + p = _pFirstModule; + ModuleId = 0; + do { + if (p == pModule) { + break; + } + ModuleId++; + p = p->pNext; + } while (p); + { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); + // + pPayload = pPayloadStart; + // + // Send module description + // Send event offset and number of events + // + ENCODE_U32(pPayload, ModuleId); + ENCODE_U32(pPayload, (pModule->EventOffset)); + pPayload = _EncodeStr(pPayload, sDescription, SEGGER_SYSVIEW_MAX_STRING_LEN); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_MODULEDESC); + RECORD_END(); + } +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_SendModule() +* +* Function description +* Sends the information of a registered module to the host. +* +* Parameters +* ModuleId - Id of the requested module. +*/ +void SEGGER_SYSVIEW_SendModule(U8 ModuleId) { + SEGGER_SYSVIEW_MODULE* pModule; + U32 n; + + if (_pFirstModule != 0) { + pModule = _pFirstModule; + for (n = 0; n < ModuleId; n++) { + pModule = pModule->pNext; + if (pModule == 0) { + break; + } + } + if (pModule != 0) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); + // + pPayload = pPayloadStart; + // + // Send module description + // Send event offset and number of events + // + ENCODE_U32(pPayload, ModuleId); + ENCODE_U32(pPayload, (pModule->EventOffset)); + pPayload = _EncodeStr(pPayload, pModule->sModule, SEGGER_SYSVIEW_MAX_STRING_LEN); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_MODULEDESC); + RECORD_END(); + } + if (pModule && pModule->pfSendModuleDesc) { + pModule->pfSendModuleDesc(); + } + } +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_SendModuleDescription() +* +* Function description +* Triggers a send of the registered module descriptions. +* +*/ +void SEGGER_SYSVIEW_SendModuleDescription(void) { + SEGGER_SYSVIEW_MODULE* pModule; + + if (_pFirstModule != 0) { + pModule = _pFirstModule; + do { + if (pModule->pfSendModuleDesc) { + pModule->pfSendModuleDesc(); + } + pModule = pModule->pNext; + } while (pModule); + } +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_SendNumModules() +* +* Function description +* Send the number of registered modules to the host. +*/ +void SEGGER_SYSVIEW_SendNumModules(void) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2*SEGGER_SYSVIEW_QUANTA_U32); + pPayload = pPayloadStart; + ENCODE_U32(pPayload, _NumModules); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_NUMMODULES); + RECORD_END(); +} + +#ifndef SEGGER_SYSVIEW_EXCLUDE_PRINTF // Define in project to avoid warnings about variable parameter list + +/********************************************************************* +* +* SEGGER_SYSVIEW_PrintfHostEx() +* +* Function description +* Print a string which is formatted on the host by the SystemView Application +* with Additional information. +* +* Parameters +* s - String to be formatted. +* Options - Options for the string. i.e. Log level. +* +* Additional information +* All format arguments are treated as 32-bit scalar values. +*/ +void SEGGER_SYSVIEW_PrintfHostEx(const char* s, U32 Options, ...) { + va_list ParamList; +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + int r; + + va_start(ParamList, Options); + r = _VPrintHost(s, Options, &ParamList); + va_end(ParamList); + + if (r == -1) { + va_start(ParamList, Options); + _VPrintTarget(s, Options, &ParamList); + va_end(ParamList); + } +#else + va_start(ParamList, Options); + _VPrintHost(s, Options, &ParamList); + va_end(ParamList); +#endif +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_VPrintfHostEx() +* +* Function description +* Print a string which is formatted on the host by the SystemView Application +* with Additional information. +* +* Parameters +* s - String to be formatted. +* Options - Options for the string. i.e. Log level. +* pParamList - Pointer to the list of arguments for the format string +* +* Additional information +* All format arguments are treated as 32-bit scalar values. +*/ +void SEGGER_SYSVIEW_VPrintfHostEx(const char* s, U32 Options, va_list *pParamList) { +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + int r; + va_list ParamListCopy; + va_copy(ParamListCopy, *pParamList); + + r = _VPrintHost(s, Options, pParamList); + + if (r == -1) { + _VPrintTarget(s, Options, &ParamListCopy); + } + va_end(ParamListCopy); +#else + _VPrintHost(s, Options, pParamList); +#endif +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_PrintfHost() +* +* Function description +* Print a string which is formatted on the host by the SystemView Application. +* +* Parameters +* s - String to be formatted. +* +* Additional information +* All format arguments are treated as 32-bit scalar values. +*/ +void SEGGER_SYSVIEW_PrintfHost(const char* s, ...) { + va_list ParamList; +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + int r; + + va_start(ParamList, s); + r = _VPrintHost(s, SEGGER_SYSVIEW_LOG, &ParamList); + va_end(ParamList); + + if (r == -1) { + va_start(ParamList, s); + _VPrintTarget(s, SEGGER_SYSVIEW_LOG, &ParamList); + va_end(ParamList); + } +#else + va_start(ParamList, s); + _VPrintHost(s, SEGGER_SYSVIEW_LOG, &ParamList); + va_end(ParamList); +#endif +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_VPrintfHost() +* +* Function description +* Print a string which is formatted on the host by the SystemView Application. +* +* Parameters +* s - String to be formatted. +* pParamList - Pointer to the list of arguments for the format string +* +* Additional information +* All format arguments are treated as 32-bit scalar values. +*/ +void SEGGER_SYSVIEW_VPrintfHost(const char* s, va_list *pParamList) { +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + int r; + va_list ParamListCopy; + va_copy(ParamListCopy, *pParamList); + + r = _VPrintHost(s, SEGGER_SYSVIEW_LOG, pParamList); + + if (r == -1) { + _VPrintTarget(s, SEGGER_SYSVIEW_LOG, &ParamListCopy); + } + va_end(ParamListCopy); +#else + _VPrintHost(s, SEGGER_SYSVIEW_LOG, pParamList); +#endif +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_WarnfHost() +* +* Function description +* Print a warning string which is formatted on the host by +* the SystemView Application. +* +* Parameters +* s - String to be formatted. +* +* Additional information +* All format arguments are treated as 32-bit scalar values. +*/ +void SEGGER_SYSVIEW_WarnfHost(const char* s, ...) { + va_list ParamList; +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + int r; + + va_start(ParamList, s); + r = _VPrintHost(s, SEGGER_SYSVIEW_WARNING, &ParamList); + va_end(ParamList); + + if (r == -1) { + va_start(ParamList, s); + _VPrintTarget(s, SEGGER_SYSVIEW_WARNING, &ParamList); + va_end(ParamList); + } +#else + va_start(ParamList, s); + _VPrintHost(s, SEGGER_SYSVIEW_WARNING, &ParamList); + va_end(ParamList); +#endif +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_VWarnfHost() +* +* Function description +* Print a warning string which is formatted on the host by +* the SystemView Application. +* +* Parameters +* s - String to be formatted. +* pParamList - Pointer to the list of arguments for the format string +* +* Additional information +* All format arguments are treated as 32-bit scalar values. +*/ +void SEGGER_SYSVIEW_VWarnfHost(const char* s, va_list *pParamList) { +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + int r; + va_list ParamListCopy; + va_copy(ParamListCopy, *pParamList); + + r = _VPrintHost(s, SEGGER_SYSVIEW_WARNING, pParamList); + + if (r == -1) { + _VPrintTarget(s, SEGGER_SYSVIEW_WARNING, &ParamListCopy); + } + va_end(ParamListCopy); +#else + _VPrintHost(s, SEGGER_SYSVIEW_WARNING, pParamList); +#endif +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_ErrorfHost() +* +* Function description +* Print an error string which is formatted on the host by +* the SystemView Application. +* +* Parameters +* s - String to be formatted. +* +* Additional information +* All format arguments are treated as 32-bit scalar values. +*/ +void SEGGER_SYSVIEW_ErrorfHost(const char* s, ...) { + va_list ParamList; +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + int r; + + va_start(ParamList, s); + r = _VPrintHost(s, SEGGER_SYSVIEW_ERROR, &ParamList); + va_end(ParamList); + + if (r == -1) { + va_start(ParamList, s); + _VPrintTarget(s, SEGGER_SYSVIEW_ERROR, &ParamList); + va_end(ParamList); + } +#else + va_start(ParamList, s); + _VPrintHost(s, SEGGER_SYSVIEW_ERROR, &ParamList); + va_end(ParamList); +#endif +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_VErrorfHost() +* +* Function description +* Print a warning string which is formatted on the host by +* the SystemView Application. +* +* Parameters +* s - String to be formatted. +* pParamList - Pointer to the list of arguments for the format string +* +* Additional information +* All format arguments are treated as 32-bit scalar values. +*/ +void SEGGER_SYSVIEW_VErrorfHost(const char* s, va_list *pParamList) { +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + int r; + va_list ParamListCopy; + va_copy(ParamListCopy, *pParamList); + + r = _VPrintHost(s, SEGGER_SYSVIEW_ERROR, pParamList); + + if (r == -1) { + _VPrintTarget(s, SEGGER_SYSVIEW_ERROR, &ParamListCopy); + } + va_end(ParamListCopy); +#else + _VPrintHost(s, SEGGER_SYSVIEW_ERROR, pParamList); +#endif +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_PrintfTargetEx() +* +* Function description +* Print a string which is formatted on the target before sent to +* the host with Additional information. +* +* Parameters +* s - String to be formatted. +* Options - Options for the string. i.e. Log level. +*/ +void SEGGER_SYSVIEW_PrintfTargetEx(const char* s, U32 Options, ...) { + va_list ParamList; + + va_start(ParamList, Options); + _VPrintTarget(s, Options, &ParamList); + va_end(ParamList); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_VPrintfTargetEx() +* +* Function description +* Print a string which is formatted on the target before sent to +* the host with Additional information. +* +* Parameters +* s - String to be formatted. +* Options - Options for the string. i.e. Log level. +* pParamList - Pointer to the list of arguments for the format string +*/ +void SEGGER_SYSVIEW_VPrintfTargetEx(const char* s, U32 Options, va_list *pParamList) { + _VPrintTarget(s, Options, pParamList); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_PrintfTarget() +* +* Function description +* Print a string which is formatted on the target before sent to +* the host. +* +* Parameters +* s - String to be formatted. +*/ +void SEGGER_SYSVIEW_PrintfTarget(const char* s, ...) { + va_list ParamList; + + va_start(ParamList, s); + _VPrintTarget(s, SEGGER_SYSVIEW_LOG, &ParamList); + va_end(ParamList); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_VPrintfTarget() +* +* Function description +* Print a string which is formatted on the target before sent to +* the host. +* +* Parameters +* s - String to be formatted. +* pParamList - Pointer to the list of arguments for the format string +*/ +void SEGGER_SYSVIEW_VPrintfTarget(const char* s, va_list* pParamList) { + _VPrintTarget(s, SEGGER_SYSVIEW_LOG, pParamList); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_WarnfTarget() +* +* Function description +* Print a warning string which is formatted on the target before +* sent to the host. +* +* Parameters +* s - String to be formatted. +*/ +void SEGGER_SYSVIEW_WarnfTarget(const char* s, ...) { + va_list ParamList; + + va_start(ParamList, s); + _VPrintTarget(s, SEGGER_SYSVIEW_WARNING, &ParamList); + va_end(ParamList); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_VWarnfTarget() +* +* Function description +* Print a warning string which is formatted on the target before +* sent to the host. +* +* Parameters +* s - String to be formatted. +* pParamList - Pointer to the list of arguments for the format string +*/ +void SEGGER_SYSVIEW_VWarnfTarget(const char* s, va_list* pParamList) { + _VPrintTarget(s, SEGGER_SYSVIEW_WARNING, pParamList); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_ErrorfTarget() +* +* Function description +* Print an error string which is formatted on the target before +* sent to the host. +* +* Parameters +* s - String to be formatted. +*/ +void SEGGER_SYSVIEW_ErrorfTarget(const char* s, ...) { + va_list ParamList; + + va_start(ParamList, s); + _VPrintTarget(s, SEGGER_SYSVIEW_ERROR, &ParamList); + va_end(ParamList); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_VErrorfTarget() +* +* Function description +* Print an error string which is formatted on the target before +* sent to the host. +* +* Parameters +* s - String to be formatted. +* pParamList - Pointer to the list of arguments for the format string +*/ +void SEGGER_SYSVIEW_VErrorfTarget(const char* s, va_list* pParamList) { + _VPrintTarget(s, SEGGER_SYSVIEW_ERROR, pParamList); +} +#endif // SEGGER_SYSVIEW_EXCLUDE_PRINTF + +/********************************************************************* +* +* SEGGER_SYSVIEW_Print() +* +* Function description +* Print a string to the host. +* +* Parameters +* s - String to sent. +*/ +void SEGGER_SYSVIEW_Print(const char* s) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_STRING_LEN); + // + pPayload = _EncodeStr(pPayloadStart, s, SEGGER_SYSVIEW_MAX_STRING_LEN); + ENCODE_U32(pPayload, SEGGER_SYSVIEW_LOG); + ENCODE_U32(pPayload, 0); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_Warn() +* +* Function description +* Print a warning string to the host. +* +* Parameters +* s - String to sent. +*/ +void SEGGER_SYSVIEW_Warn(const char* s) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_STRING_LEN); + // + pPayload = _EncodeStr(pPayloadStart, s, SEGGER_SYSVIEW_MAX_STRING_LEN); + ENCODE_U32(pPayload, SEGGER_SYSVIEW_WARNING); + ENCODE_U32(pPayload, 0); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_Error() +* +* Function description +* Print an error string to the host. +* +* Parameters +* s - String to sent. +*/ +void SEGGER_SYSVIEW_Error(const char* s) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_STRING_LEN); + // + pPayload = _EncodeStr(pPayloadStart, s, SEGGER_SYSVIEW_MAX_STRING_LEN); + ENCODE_U32(pPayload, SEGGER_SYSVIEW_ERROR); + ENCODE_U32(pPayload, 0); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_EnableEvents() +* +* Function description +* Enable standard SystemView events to be generated. +* +* Parameters +* EnableMask - Events to be enabled. +*/ +void SEGGER_SYSVIEW_EnableEvents(U32 EnableMask) { + _SYSVIEW_Globals.DisabledEvents &= ~EnableMask; +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_DisableEvents() +* +* Function description +* Disable standard SystemView events to not be generated. +* +* Parameters +* DisableMask - Events to be disabled. +*/ +void SEGGER_SYSVIEW_DisableEvents(U32 DisableMask) { + _SYSVIEW_Globals.DisabledEvents |= DisableMask; +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_IsStarted() +* +* Function description +* Handle incoming packets if any and check if recording is started. +* +* Return value +* 0: Recording not started. +* > 0: Recording started. +*/ +int SEGGER_SYSVIEW_IsStarted(void) { +#if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + // + // Check if host is sending data which needs to be processed. + // + if (SEGGER_RTT_HASDATA(CHANNEL_ID_DOWN)) { + if (_SYSVIEW_Globals.RecursionCnt == 0) { // Avoid uncontrolled nesting. This way, this routine can call itself once, but no more often than that. + _SYSVIEW_Globals.RecursionCnt = 1; + _HandleIncomingPacket(); + _SYSVIEW_Globals.RecursionCnt = 0; + } + } +#endif + return _SYSVIEW_Globals.EnableState; +} + +#endif /* configUSE_SEGGER_SYSTEM_VIEWER_HOOKS */ /* << EST: added check, otherwise compiler might complain about calling RTT init with out-of-bound RTT channel index */ + + +/*************************** End of file ****************************/ + diff --git a/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW.h b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW.h new file mode 100644 index 0000000..d90d8c2 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW.h @@ -0,0 +1,441 @@ +/** Copyright (C) SEGGER Microcontroller GmbH */ /* << EST */ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2024 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER SystemView * Real-time application analysis * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the SystemView and RTT protocol, and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* SystemView version: 3.56 * +* * +********************************************************************** +-------------------------- END-OF-HEADER ----------------------------- +File : SEGGER_SYSVIEW.h +Purpose : System visualization API. +Revision: $Rev: 28768 $ +*/ + +#ifndef SEGGER_SYSVIEW_H +#define SEGGER_SYSVIEW_H + +/********************************************************************* +* +* #include Section +* +********************************************************************** +*/ + +#if 1 /* << EST */ +#include +#include +typedef uint8_t U8; +typedef int32_t I32; +typedef uint32_t U32; +typedef uint64_t U64; +#else +#include "SEGGER.h" +#endif +#include "SEGGER_SYSVIEW_ConfDefaults.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/********************************************************************* +* +* Defines, fixed +* +********************************************************************** +*/ + +#define SEGGER_SYSVIEW_MAJOR 3 +#define SEGGER_SYSVIEW_MINOR 32 +#define SEGGER_SYSVIEW_REV 0 +#define SEGGER_SYSVIEW_VERSION ((SEGGER_SYSVIEW_MAJOR * 10000) + (SEGGER_SYSVIEW_MINOR * 100) + SEGGER_SYSVIEW_REV) + +#define SEGGER_SYSVIEW_INFO_SIZE 9 // Minimum size, which has to be reserved for a packet. 1-2 byte of message type, 0-2 byte of payload length, 1-5 bytes of timestamp. +#define SEGGER_SYSVIEW_QUANTA_U32 5 // Maximum number of bytes to encode a U32, should be reserved for each 32-bit value in a packet. + +#define SEGGER_SYSVIEW_LOG (0u) +#define SEGGER_SYSVIEW_WARNING (1u) +#define SEGGER_SYSVIEW_ERROR (2u) +#define SEGGER_SYSVIEW_FLAG_APPEND (1u << 6) + +#define SEGGER_SYSVIEW_PREPARE_PACKET(p) (p) + 4 +// +// SystemView events. First 32 IDs from 0 .. 31 are reserved for these +// +#define SYSVIEW_EVTID_NOP 0 // Dummy packet. +#define SYSVIEW_EVTID_OVERFLOW 1 +#define SYSVIEW_EVTID_ISR_ENTER 2 +#define SYSVIEW_EVTID_ISR_EXIT 3 +#define SYSVIEW_EVTID_TASK_START_EXEC 4 +#define SYSVIEW_EVTID_TASK_STOP_EXEC 5 +#define SYSVIEW_EVTID_TASK_START_READY 6 +#define SYSVIEW_EVTID_TASK_STOP_READY 7 +#define SYSVIEW_EVTID_TASK_CREATE 8 +#define SYSVIEW_EVTID_TASK_INFO 9 +#define SYSVIEW_EVTID_TRACE_START 10 +#define SYSVIEW_EVTID_TRACE_STOP 11 +#define SYSVIEW_EVTID_SYSTIME_CYCLES 12 +#define SYSVIEW_EVTID_SYSTIME_US 13 +#define SYSVIEW_EVTID_SYSDESC 14 +#define SYSVIEW_EVTID_MARK_START 15 +#define SYSVIEW_EVTID_MARK_STOP 16 +#define SYSVIEW_EVTID_IDLE 17 +#define SYSVIEW_EVTID_ISR_TO_SCHEDULER 18 +#define SYSVIEW_EVTID_TIMER_ENTER 19 +#define SYSVIEW_EVTID_TIMER_EXIT 20 +#define SYSVIEW_EVTID_STACK_INFO 21 +#define SYSVIEW_EVTID_MODULEDESC 22 +#define SYSVIEW_EVTID_DATA_SAMPLE 23 +#define SYSVIEW_EVTID_INIT 24 +#define SYSVIEW_EVTID_NAME_RESOURCE 25 +#define SYSVIEW_EVTID_PRINT_FORMATTED 26 +#define SYSVIEW_EVTID_NUMMODULES 27 +#define SYSVIEW_EVTID_END_CALL 28 +#define SYSVIEW_EVTID_TASK_TERMINATE 29 + +#define SYSVIEW_EVTID_EX 31 +// +// SystemView extended events. Sent with ID 31. +// +#define SYSVIEW_EVTID_EX_MARK 0 +#define SYSVIEW_EVTID_EX_NAME_MARKER 1 +#define SYSVIEW_EVTID_EX_HEAP_DEFINE 2 +#define SYSVIEW_EVTID_EX_HEAP_ALLOC 3 +#define SYSVIEW_EVTID_EX_HEAP_ALLOC_EX 4 +#define SYSVIEW_EVTID_EX_HEAP_FREE 5 +#define SYSVIEW_EVTID_EX_REGISTER_DATA 6 +// +// Event masks to disable/enable events +// +#define SYSVIEW_EVTMASK_NOP (1 << SYSVIEW_EVTID_NOP) +#define SYSVIEW_EVTMASK_OVERFLOW (1 << SYSVIEW_EVTID_OVERFLOW) +#define SYSVIEW_EVTMASK_ISR_ENTER (1 << SYSVIEW_EVTID_ISR_ENTER) +#define SYSVIEW_EVTMASK_ISR_EXIT (1 << SYSVIEW_EVTID_ISR_EXIT) +#define SYSVIEW_EVTMASK_TASK_START_EXEC (1 << SYSVIEW_EVTID_TASK_START_EXEC) +#define SYSVIEW_EVTMASK_TASK_STOP_EXEC (1 << SYSVIEW_EVTID_TASK_STOP_EXEC) +#define SYSVIEW_EVTMASK_TASK_START_READY (1 << SYSVIEW_EVTID_TASK_START_READY) +#define SYSVIEW_EVTMASK_TASK_STOP_READY (1 << SYSVIEW_EVTID_TASK_STOP_READY) +#define SYSVIEW_EVTMASK_TASK_CREATE (1 << SYSVIEW_EVTID_TASK_CREATE) +#define SYSVIEW_EVTMASK_TASK_INFO (1 << SYSVIEW_EVTID_TASK_INFO) +#define SYSVIEW_EVTMASK_TRACE_START (1 << SYSVIEW_EVTID_TRACE_START) +#define SYSVIEW_EVTMASK_TRACE_STOP (1 << SYSVIEW_EVTID_TRACE_STOP) +#define SYSVIEW_EVTMASK_SYSTIME_CYCLES (1 << SYSVIEW_EVTID_SYSTIME_CYCLES) +#define SYSVIEW_EVTMASK_SYSTIME_US (1 << SYSVIEW_EVTID_SYSTIME_US) +#define SYSVIEW_EVTMASK_SYSDESC (1 << SYSVIEW_EVTID_SYSDESC) +#define SYSVIEW_EVTMASK_USER_START (1 << SYSVIEW_EVTID_USER_START) +#define SYSVIEW_EVTMASK_USER_STOP (1 << SYSVIEW_EVTID_USER_STOP) +#define SYSVIEW_EVTMASK_IDLE (1 << SYSVIEW_EVTID_IDLE) +#define SYSVIEW_EVTMASK_ISR_TO_SCHEDULER (1 << SYSVIEW_EVTID_ISR_TO_SCHEDULER) +#define SYSVIEW_EVTMASK_TIMER_ENTER (1 << SYSVIEW_EVTID_TIMER_ENTER) +#define SYSVIEW_EVTMASK_TIMER_EXIT (1 << SYSVIEW_EVTID_TIMER_EXIT) +#define SYSVIEW_EVTMASK_STACK_INFO (1 << SYSVIEW_EVTID_STACK_INFO) +#define SYSVIEW_EVTMASK_MODULEDESC (1 << SYSVIEW_EVTID_MODULEDESC) +#define SYSVIEW_EVTMASK_DATA_SAMPLE (1 << SYSVIEW_EVTID_DATA_SAMPLE) +#define SYSVIEW_EVTMASK_INIT (1 << SYSVIEW_EVTID_INIT) +#define SYSVIEW_EVTMASK_NAME_RESOURCE (1 << SYSVIEW_EVTID_NAME_RESOURCE) +#define SYSVIEW_EVTMASK_PRINT_FORMATTED (1 << SYSVIEW_EVTID_PRINT_FORMATTED) +#define SYSVIEW_EVTMASK_NUMMODULES (1 << SYSVIEW_EVTID_NUMMODULES) +#define SYSVIEW_EVTMASK_END_CALL (1 << SYSVIEW_EVTID_END_CALL) +#define SYSVIEW_EVTMASK_TASK_TERMINATE (1 << SYSVIEW_EVTID_TASK_TERMINATE) + +#define SYSVIEW_EVTMASK_EX (1 << SYSVIEW_EVTID_EX) + +#define SYSVIEW_EVTMASK_ALL_INTERRUPTS ( SYSVIEW_EVTMASK_ISR_ENTER \ + | SYSVIEW_EVTMASK_ISR_EXIT \ + | SYSVIEW_EVTMASK_ISR_TO_SCHEDULER) +#define SYSVIEW_EVTMASK_ALL_TASKS ( SYSVIEW_EVTMASK_TASK_START_EXEC \ + | SYSVIEW_EVTMASK_TASK_STOP_EXEC \ + | SYSVIEW_EVTMASK_TASK_START_READY \ + | SYSVIEW_EVTMASK_TASK_STOP_READY \ + | SYSVIEW_EVTMASK_TASK_CREATE \ + | SYSVIEW_EVTMASK_TASK_INFO \ + | SYSVIEW_EVTMASK_STACK_INFO \ + | SYSVIEW_EVTMASK_TASK_TERMINATE) + +/********************************************************************* +* +* Structures +* +********************************************************************** +*/ + +typedef struct { + U32 TaskID; + const char* sName; + U32 Prio; + U32 StackBase; + U32 StackSize; + U32 StackUsage; +} SEGGER_SYSVIEW_TASKINFO; + +typedef struct { + U32 TaskID; + U32 StackBase; + U32 StackSize; + U32 StackUsage; +} SEGGER_SYSVIEW_STACKINFO; + +typedef struct { + U32 ID; + union { + U32* pU32_Value; + I32* pI32_Value; + float* pFloat_Value; + } pValue; +} SEGGER_SYSVIEW_DATA_SAMPLE; + +typedef enum { + SEGGER_SYSVIEW_TYPE_U32 = 0, + SEGGER_SYSVIEW_TYPE_I32 = 1, + SEGGER_SYSVIEW_TYPE_FLOAT = 2 +} SEGGER_SYSVIEW_DATA_TYPE; + +typedef struct { + U32 ID; + SEGGER_SYSVIEW_DATA_TYPE DataType; + I32 Offset; + I32 RangeMin; + I32 RangeMax; + float ScalingFactor; + const char* sName; + const char* sUnit; +} SEGGER_SYSVIEW_DATA_REGISTER; + +typedef struct SEGGER_SYSVIEW_MODULE_STRUCT SEGGER_SYSVIEW_MODULE; + +struct SEGGER_SYSVIEW_MODULE_STRUCT { + const char* sModule; + U32 NumEvents; + U32 EventOffset; + void (*pfSendModuleDesc)(void); + SEGGER_SYSVIEW_MODULE* pNext; +}; + +typedef void (SEGGER_SYSVIEW_SEND_SYS_DESC_FUNC)(void); + + +/********************************************************************* +* +* Global data +* +********************************************************************** +*/ +#if 1 /* << EST */ + extern unsigned int SEGGER_SYSVIEW_TickCnt; + extern unsigned int SEGGER_SYSVIEW_InterruptId; +#else + +#ifdef EXTERN + #undef EXTERN +#endif + +#ifndef SEGGER_SYSVIEW_C // Defined in SEGGER_SYSVIEW.c which includes this header beside other C-files + #define EXTERN extern +#else + #define EXTERN +#endif + +EXTERN unsigned int SEGGER_SYSVIEW_TickCnt; +EXTERN unsigned int SEGGER_SYSVIEW_InterruptId; + +#undef EXTERN + +#endif /* << EST */ +/********************************************************************* +* +* API functions +* +********************************************************************** +*/ + +typedef struct { + U64 (*pfGetTime) (void); + void (*pfSendTaskList) (void); +} SEGGER_SYSVIEW_OS_API; + +/********************************************************************* +* +* Control and initialization functions +*/ +void SEGGER_SYSVIEW_Init (U32 SysFreq, U32 CPUFreq, const SEGGER_SYSVIEW_OS_API *pOSAPI, SEGGER_SYSVIEW_SEND_SYS_DESC_FUNC pfSendSysDesc); +void SEGGER_SYSVIEW_SetRAMBase (U32 RAMBaseAddress); +void SEGGER_SYSVIEW_Start (void); +void SEGGER_SYSVIEW_Stop (void); +void SEGGER_SYSVIEW_GetSysDesc (void); +void SEGGER_SYSVIEW_SendTaskList (void); +void SEGGER_SYSVIEW_SendTaskInfo (const SEGGER_SYSVIEW_TASKINFO* pInfo); +void SEGGER_SYSVIEW_SendStackInfo (const SEGGER_SYSVIEW_STACKINFO* pInfo); +void SEGGER_SYSVIEW_SendSysDesc (const char* sSysDesc); +int SEGGER_SYSVIEW_IsStarted (void); +int SEGGER_SYSVIEW_GetChannelID (void); + +void SEGGER_SYSVIEW_SampleData (const SEGGER_SYSVIEW_DATA_SAMPLE *pInfo); + +/********************************************************************* +* +* Event recording functions +*/ +void SEGGER_SYSVIEW_RecordVoid (unsigned int EventId); +void SEGGER_SYSVIEW_RecordU32 (unsigned int EventId, U32 Para0); +void SEGGER_SYSVIEW_RecordU32x2 (unsigned int EventId, U32 Para0, U32 Para1); +void SEGGER_SYSVIEW_RecordU32x3 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2); +void SEGGER_SYSVIEW_RecordU32x4 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3); +void SEGGER_SYSVIEW_RecordU32x5 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4); +void SEGGER_SYSVIEW_RecordU32x6 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5); +void SEGGER_SYSVIEW_RecordU32x7 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6); +void SEGGER_SYSVIEW_RecordU32x8 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7); +void SEGGER_SYSVIEW_RecordU32x9 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7, U32 Para8); +void SEGGER_SYSVIEW_RecordU32x10 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7, U32 Para8, U32 Para9); +void SEGGER_SYSVIEW_RecordString (unsigned int EventId, const char* pString); +void SEGGER_SYSVIEW_RecordSystime (void); +void SEGGER_SYSVIEW_RecordEnterISR (void); +void SEGGER_SYSVIEW_RecordExitISR (void); +void SEGGER_SYSVIEW_RecordExitISRToScheduler (void); +void SEGGER_SYSVIEW_RecordEnterTimer (U32 TimerId); +void SEGGER_SYSVIEW_RecordExitTimer (void); +void SEGGER_SYSVIEW_RecordEndCall (unsigned int EventID); +void SEGGER_SYSVIEW_RecordEndCallU32 (unsigned int EventID, U32 Para0); + +void SEGGER_SYSVIEW_OnIdle (void); +void SEGGER_SYSVIEW_OnTaskCreate (U32 TaskId); +void SEGGER_SYSVIEW_OnTaskTerminate (U32 TaskId); +void SEGGER_SYSVIEW_OnTaskStartExec (U32 TaskId); +void SEGGER_SYSVIEW_OnTaskStopExec (void); +void SEGGER_SYSVIEW_OnTaskStartReady (U32 TaskId); +void SEGGER_SYSVIEW_OnTaskStopReady (U32 TaskId, unsigned int Cause); +void SEGGER_SYSVIEW_MarkStart (unsigned int MarkerId); +void SEGGER_SYSVIEW_MarkStop (unsigned int MarkerId); +void SEGGER_SYSVIEW_Mark (unsigned int MarkerId); +void SEGGER_SYSVIEW_NameMarker (unsigned int MarkerId, const char* sName); + +void SEGGER_SYSVIEW_HeapDefine (void* pHeap, void* pBase, unsigned int HeapSize, unsigned int MetadataSize); +void SEGGER_SYSVIEW_HeapAlloc (void* pHeap, void* pUserData, unsigned int UserDataLen); +void SEGGER_SYSVIEW_HeapAllocEx (void* pHeap, void* pUserData, unsigned int UserDataLen, unsigned int Tag); +void SEGGER_SYSVIEW_HeapFree (void* pHeap, void* pUserData); + +void SEGGER_SYSVIEW_NameResource (U32 ResourceId, const char* sName); +void SEGGER_SYSVIEW_RegisterData ( SEGGER_SYSVIEW_DATA_REGISTER* pInfo); + +int SEGGER_SYSVIEW_SendPacket (U8* pPacket, U8* pPayloadEnd, unsigned int EventId); + +/********************************************************************* +* +* Event parameter encoding functions +*/ +U8* SEGGER_SYSVIEW_EncodeU32 (U8* pPayload, U32 Value); +U8* SEGGER_SYSVIEW_EncodeData (U8* pPayload, const char* pSrc, unsigned int Len); +U8* SEGGER_SYSVIEW_EncodeString (U8* pPayload, const char* s, unsigned int MaxLen); +U8* SEGGER_SYSVIEW_EncodeId (U8* pPayload, U32 Id); +U32 SEGGER_SYSVIEW_ShrinkId (U32 Id); + + +/********************************************************************* +* +* Middleware module registration +*/ +void SEGGER_SYSVIEW_RegisterModule (SEGGER_SYSVIEW_MODULE* pModule); +void SEGGER_SYSVIEW_RecordModuleDescription (const SEGGER_SYSVIEW_MODULE* pModule, const char* sDescription); +void SEGGER_SYSVIEW_SendModule (U8 ModuleId); +void SEGGER_SYSVIEW_SendModuleDescription (void); +void SEGGER_SYSVIEW_SendNumModules (void); + +/********************************************************************* +* +* printf-Style functions +*/ +#ifndef SEGGER_SYSVIEW_EXCLUDE_PRINTF // Define in project to avoid warnings about variable parameter list +void SEGGER_SYSVIEW_PrintfHostEx (const char* s, U32 Options, ...); +void SEGGER_SYSVIEW_VPrintfHostEx (const char* s, U32 Options, va_list* pParamList); +void SEGGER_SYSVIEW_PrintfTargetEx (const char* s, U32 Options, ...); +void SEGGER_SYSVIEW_VPrintfTargetEx (const char* s, U32 Options, va_list* pParamList); +void SEGGER_SYSVIEW_PrintfHost (const char* s, ...); +void SEGGER_SYSVIEW_VPrintfHost (const char* s, va_list* pParamList); +void SEGGER_SYSVIEW_PrintfTarget (const char* s, ...); +void SEGGER_SYSVIEW_VPrintfTarget (const char* s, va_list* pParamList); +void SEGGER_SYSVIEW_WarnfHost (const char* s, ...); +void SEGGER_SYSVIEW_VWarnfHost (const char* s, va_list* pParamList); +void SEGGER_SYSVIEW_WarnfTarget (const char* s, ...); +void SEGGER_SYSVIEW_VWarnfTarget (const char* s, va_list* pParamList); +void SEGGER_SYSVIEW_ErrorfHost (const char* s, ...); +void SEGGER_SYSVIEW_VErrorfHost (const char* s, va_list* pParamList); +void SEGGER_SYSVIEW_ErrorfTarget (const char* s, ...); +void SEGGER_SYSVIEW_VErrorfTarget (const char* s, va_list* pParamList); +#endif + +void SEGGER_SYSVIEW_Print (const char* s); +void SEGGER_SYSVIEW_Warn (const char* s); +void SEGGER_SYSVIEW_Error (const char* s); + +/********************************************************************* +* +* Run-time configuration functions +*/ +void SEGGER_SYSVIEW_EnableEvents (U32 EnableMask); +void SEGGER_SYSVIEW_DisableEvents (U32 DisableMask); + +/********************************************************************* +* +* Application-provided functions +*/ +void SEGGER_SYSVIEW_Conf (void); +U32 SEGGER_SYSVIEW_X_GetTimestamp (void); +U32 SEGGER_SYSVIEW_X_GetInterruptId (void); + +void SEGGER_SYSVIEW_X_StartComm (void); +void SEGGER_SYSVIEW_X_OnEventRecorded (unsigned NumBytes); + +#ifdef __cplusplus +} +#endif + +/********************************************************************* +* +* Compatibility API defines +*/ +#define SEGGER_SYSVIEW_OnUserStart SEGGER_SYSVIEW_MarkStart +#define SEGGER_SYSVIEW_OnUserStop SEGGER_SYSVIEW_MarkStop + +#endif + +/*************************** End of file ****************************/ diff --git a/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW_Conf.h b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW_Conf.h new file mode 100644 index 0000000..56ebee1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW_Conf.h @@ -0,0 +1,227 @@ +/** Copyright (C) SEGGER Microcontroller GmbH */ /* << EST */ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2024 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER SystemView * Real-time application analysis * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the SystemView and RTT protocol, and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* SystemView version: 3.56 * +* * +********************************************************************** +-------------------------- END-OF-HEADER ----------------------------- + +File : SEGGER_SYSVIEW_Conf.h +Purpose : SEGGER SystemView configuration file. + Set defines which deviate from the defaults (see SEGGER_SYSVIEW_ConfDefaults.h) here. +Revision: $Rev: 21292 $ + +Additional information: + Required defines which must be set are: + SEGGER_SYSVIEW_GET_TIMESTAMP + SEGGER_SYSVIEW_GET_INTERRUPT_ID + For known compilers and cores, these might be set to good defaults + in SEGGER_SYSVIEW_ConfDefaults.h. + + SystemView needs a (nestable) locking mechanism. + If not defined, the RTT locking mechanism is used, + which then needs to be properly configured. +*/ + +#ifndef SEGGER_SYSVIEW_CONF_H +#define SEGGER_SYSVIEW_CONF_H + +#include "SEGGER_RTT_Conf.h" /* << EST */ +#include "McuSystemViewconfig.h" /* << EST configuration */ +/********************************************************************* +* +* Defines, configurable +* +********************************************************************** +*/ +// +// Constants for known core configuration +// +#define SEGGER_SYSVIEW_CORE_OTHER 0 +#define SEGGER_SYSVIEW_CORE_CM0 1 // Cortex-M0/M0+/M1 +#define SEGGER_SYSVIEW_CORE_CM3 2 // Cortex-M3/M4/M7 +#define SEGGER_SYSVIEW_CORE_RX 3 // Renesas RX + +#if (defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __GNUC__) || (defined __clang__) + #if (defined __ARM_ARCH_6M__) || (defined __ARM_ARCH_8M_BASE__) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 + #elif (defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_8M_MAIN__)) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 + #endif +#elif defined(__ICCARM__) + #if (defined (__ARM6M__) && (__CORE__ == __ARM6M__)) \ + || (defined (__ARM8M_BASELINE__) && (__CORE__ == __ARM8M_BASELINE__)) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 + #elif (defined (__ARM7EM__) && (__CORE__ == __ARM7EM__)) \ + || (defined (__ARM7M__) && (__CORE__ == __ARM7M__)) \ + || (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__)) \ + || (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__)) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 + #endif +#elif defined(__CC_ARM) + #if (defined(__TARGET_ARCH_6S_M)) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 + #elif (defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M)) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 + #endif +#elif defined(__TI_ARM__) + #ifdef __TI_ARM_V6M0__ + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 + #elif (defined(__TI_ARM_V7M3__) || defined(__TI_ARM_V7M4__)) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 + #endif +#elif defined(__ICCRX__) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_RX +#elif defined(__RX) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_RX +#endif + +#ifndef SEGGER_SYSVIEW_CORE + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_OTHER +#endif + +#ifndef SEGGER_SYSVIEW_ON_EVENT_RECORDED + #define SEGGER_SYSVIEW_ON_EVENT_RECORDED(NumBytes) // Needed for SystemView via non-J-Link Recorder. Macro to enable the UART or notify IP task. +#endif + +/********************************************************************* +* +* Defines, configurable +* +********************************************************************** +*/ +/********************************************************************* +* +* SystemView buffer configuration +*/ +#ifndef SEGGER_SYSVIEW_RTT_BUFFER_SIZE + //#define SEGGER_SYSVIEW_RTT_BUFFER_SIZE 1024 // Number of bytes that SystemView uses for the buffer. + #define SEGGER_SYSVIEW_RTT_BUFFER_SIZE McuSystemView_CONFIG_RTT_BUFFER_SIZE // << EST: Number of bytes that SystemView uses for the buffer. +#endif + +#ifndef SEGGER_SYSVIEW_RTT_CHANNEL + //#define SEGGER_SYSVIEW_RTT_CHANNEL 1 // The RTT channel that SystemView will use. 0: Auto selection + #define SEGGER_SYSVIEW_RTT_CHANNEL McuSystemView_CONFIG_RTT_CHANNEL // << EST: The RTT channel that SystemView will use. 0: Auto selection + #if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && SEGGER_SYSVIEW_RTT_CHANNEL>=SEGGER_RTT_MAX_NUM_UP_BUFFERS /* << EST */ + #error "Not enough RTT buffers allocated in SEGGER_RTT_Conf.h!" + #endif +#endif + +#ifndef SEGGER_SYSVIEW_USE_STATIC_BUFFER + // #define SEGGER_SYSVIEW_USE_STATIC_BUFFER 1 // Use a static buffer to generate events instead of a buffer on the stack + #define SEGGER_SYSVIEW_USE_STATIC_BUFFER McuSystemView_CONFIG_USE_STATIC_BUFFER // << EST: 1: Use a static buffer to generate events instead of a buffer on the stack +#endif + +#ifndef SEGGER_SYSVIEW_POST_MORTEM_MODE + //#define SEGGER_SYSVIEW_POST_MORTEM_MODE 0 // 1: Enable post mortem analysis mode + #define SEGGER_SYSVIEW_POST_MORTEM_MODE McuSystemView_CONFIG_POST_MORTEM_MODE // << EST: 1: Enable post mortem analysis mode +#endif + +#ifndef SEGGER_SYSVIEW_CAN_RESTART + #define SEGGER_SYSVIEW_CAN_RESTART 1 // 1: Send the SystemView start sequence on every start command, not just on the first. Enables restart when SystemView Application disconnected unexpectedly. +#endif + +/********************************************************************* +* +* SystemView timestamp configuration +*/ +#if !defined(SEGGER_SYSVIEW_GET_TIMESTAMP) && !defined(SEGGER_SYSVIEW_TIMESTAMP_BITS) + #if SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM3 + #define SEGGER_SYSVIEW_TIMESTAMP_SHIFT 4 /* << EST */ + //#define SEGGER_SYSVIEW_GET_TIMESTAMP() (*(U32 *)(0xE0001004)) // Retrieve a system timestamp. Cortex-M cycle counter. + #define SEGGER_SYSVIEW_GET_TIMESTAMP() ((*(U32 *)(0xE0001004))>>SEGGER_SYSVIEW_TIMESTAMP_SHIFT) // << EST: Retrieve a system timestamp. Cortex-M cycle counter. Shifted by 4 to save bandwith. + #define SEGGER_SYSVIEW_TIMESTAMP_BITS 32 // Define number of valid bits low-order delivered by clock source + #else + #define SEGGER_SYSVIEW_TIMESTAMP_SHIFT 0 /* << EST */ + #define SEGGER_SYSVIEW_GET_TIMESTAMP() SEGGER_SYSVIEW_X_GetTimestamp() // Retrieve a system timestamp via user-defined function + #define SEGGER_SYSVIEW_TIMESTAMP_BITS 32 // Define number of valid bits low-order delivered by SEGGER_SYSVIEW_X_GetTimestamp() + #endif +#endif + +/********************************************************************* +* +* SystemView Id configuration +*/ +#ifndef SEGGER_SYSVIEW_ID_BASE + //#define SEGGER_SYSVIEW_ID_BASE 0x10000000 // Default value for the lowest Id reported by the application. Can be overridden by the application via SEGGER_SYSVIEW_SetRAMBase(). (i.e. 0x20000000 when all Ids are an address in this RAM) + #define SEGGER_SYSVIEW_ID_BASE (0x10000000) // << EST: Default value for the lowest Id reported by the application. Can be overridden by the application via SEGGER_SYSVIEW_SetRAMBase(). (i.e. 0x20000000 when all Ids are an address in this RAM) +#endif + +#ifndef SEGGER_SYSVIEW_ID_SHIFT + //#define SEGGER_SYSVIEW_ID_SHIFT 2 // Number of bits to shift the Id to save bandwidth. (i.e. 2 when Ids are 4 byte aligned) + #define SEGGER_SYSVIEW_ID_SHIFT (2) // << EST: Number of bits to shift the Id to save bandwidth. (i.e. 2 when Ids are 4 byte aligned) +#endif +/********************************************************************* +* +* SystemView interrupt configuration +*/ +#ifndef SEGGER_SYSVIEW_GET_INTERRUPT_ID + #if SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM3 + #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32*)(0xE000ED04)) & 0x1FF) // Get the currently active interrupt Id. (i.e. read Cortex-M ICSR[8:0] = active vector) + #elif SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM0 + #if defined(__ICCARM__) + #if (__VER__ > 6010000) + #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() (__get_IPSR()) // Workaround for IAR, which might do a byte-access to 0xE000ED04. Read IPSR instead. + #else + #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32*)(0xE000ED04)) & 0x3F) // Older versions of IAR do not include __get_IPSR, but might also not optimize to byte-access. + #endif + #else + #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32*)(0xE000ED04)) & 0x3F) // Get the currently active interrupt Id. (i.e. read Cortex-M ICSR[5:0] = active vector) + #endif + #else + #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() SEGGER_SYSVIEW_X_GetInterruptId() // Get the currently active interrupt Id from the user-provided function. + #endif +#endif + +#if 1 /* << EST */ + uint32_t SEGGER_uxGetTickCounterValue(void); + +#define SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT 0 +#endif /* << EST */ + +#endif // SEGGER_SYSVIEW_CONF_H + +/*************************** End of file ****************************/ + diff --git a/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW_ConfDefaults.h b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW_ConfDefaults.h new file mode 100644 index 0000000..42de3b5 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW_ConfDefaults.h @@ -0,0 +1,581 @@ +/** Copyright (C) SEGGER Microcontroller GmbH */ /* << EST */ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2024 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER SystemView * Real-time application analysis * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the SystemView and RTT protocol, and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* SystemView version: 3.56 * +* * +********************************************************************** +-------------------------- END-OF-HEADER ----------------------------- +File : SEGGER_SYSVIEW_ConfDefaults.h +Purpose : Defines defaults for configurable defines used in + SEGGER SystemView. +Revision: $Rev: 26230 $ +*/ + +#ifndef SEGGER_SYSVIEW_CONFDEFAULTS_H +#define SEGGER_SYSVIEW_CONFDEFAULTS_H + +/********************************************************************* +* +* #include Section +* +********************************************************************** +*/ + +#include "SEGGER_SYSVIEW_Conf.h" +#include "SEGGER_RTT_Conf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/********************************************************************* +* +* Defines, fixed +* +********************************************************************** +*/ +// +// Use auto-detection for SEGGER_SYSVIEW_CORE define +// based on compiler-/toolchain-specific defines +// to define SEGGER_SYSVIEW_GET_INTERRUPT_ID and SEGGER_SYSVIEW_GET_TIMESTAMP +// +#define SEGGER_SYSVIEW_CORE_OTHER 0 +#define SEGGER_SYSVIEW_CORE_CM0 1 // Cortex-M0/M0+/M1 +#define SEGGER_SYSVIEW_CORE_CM3 2 // Cortex-M3/M4/M7 +#define SEGGER_SYSVIEW_CORE_RX 3 // Renesas RX +#ifndef SEGGER_SYSVIEW_CORE + #if (defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __SEGGER_CC__) || (defined __GNUC__) || (defined __clang__) + #if (defined __ARM_ARCH_6M__) || (defined __ARM_ARCH_8M_BASE__) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 + #elif (defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_8M_MAIN__)) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 + #endif + #elif defined(__ICCARM__) + #if (defined (__ARM6M__) && (__CORE__ == __ARM6M__)) \ + || (defined (__ARM8M_BASELINE__) && (__CORE__ == __ARM8M_BASELINE__)) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 + #elif (defined (__ARM7EM__) && (__CORE__ == __ARM7EM__)) \ + || (defined (__ARM7M__) && (__CORE__ == __ARM7M__)) \ + || (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__)) \ + || (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__)) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 + #endif + #elif defined(__CC_ARM) + #if (defined(__TARGET_ARCH_6S_M)) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 + #elif (defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M)) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 + #endif + #elif defined(__TI_ARM__) + #ifdef __TI_ARM_V6M0__ + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 + #elif (defined(__TI_ARM_V7M3__) || defined(__TI_ARM_V7M4__)) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 + #endif + #elif defined(__ICCRX__) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_RX + #elif defined(__RX) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_RX + #endif + + #ifndef SEGGER_SYSVIEW_CORE + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_OTHER + #endif +#endif + + +/********************************************************************* +* +* Defines, defaults +* +********************************************************************** +*/ +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_APP_NAME +* +* Description +* The application name to be displayed in SystemView. +* Default +* "SystemView-enabled Application" +* Notes +* Convenience define to be used for SEGGER_SYSVIEW_SendSysDesc(). +*/ +#ifndef SEGGER_SYSVIEW_APP_NAME + #define SEGGER_SYSVIEW_APP_NAME "SystemView-enabled Application" +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_DEVICE_NAME +* +* Description +* The target device name to be displayed in SystemView. +* Default +* "undefined device" +* Notes +* Convenience define to be used for SEGGER_SYSVIEW_SendSysDesc(). +*/ +#ifndef SEGGER_SYSVIEW_DEVICE_NAME + #define SEGGER_SYSVIEW_DEVICE_NAME "undefined device" +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_GET_INTERRUPT_ID() +* +* Description +* Function macro to retrieve the Id of the currently active +* interrupt. +* Default +* Call user-supplied function SEGGER_SYSVIEW_X_GetInterruptId(). +* Notes +* For some known compilers and cores, a ready-to-use, core-specific +* default is set. +* ARMv7M: Read ICSR[8:0] (active vector) +* ARMv6M: Read ICSR[5:0] (active vector) +*/ +#ifndef SEGGER_SYSVIEW_GET_INTERRUPT_ID + #if SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM3 + #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32*)(0xE000ED04)) & 0x1FF) // Get the currently active interrupt Id. (i.e. read Cortex-M ICSR[8:0] = active vector) + #elif SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM0 + #if defined(__ICCARM__) + #if (__VER__ > 6010000) + #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() (__get_IPSR()) // Workaround for IAR, which might do a byte-access to 0xE000ED04. Read IPSR instead. + #else + #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32*)(0xE000ED04)) & 0x3F) // Older versions of IAR do not include __get_IPSR, but might also not optimize to byte-access. + #endif + #else + #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32*)(0xE000ED04)) & 0x3F) // Get the currently active interrupt Id. (i.e. read Cortex-M ICSR[5:0] = active vector) + #endif + #else + #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() SEGGER_SYSVIEW_X_GetInterruptId() // Get the currently active interrupt Id from the user-provided function. + #endif +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_GET_TIMESTAMP() +* +* Description +* Function macro to retrieve a system timestamp for SYSVIEW events. +* Default +* Call user-supplied function SEGGER_SYSVIEW_X_GetTimestamp(). +* Notes +* For some known compilers and cores, a ready-to-use, core-specific +* default is set. +* ARMv7M: Read Cortex-M Cycle Count register. +* +* The system timestamp clock frequency has to be passed in +* SEGGER_SYSVIEW_Init(). +*/ +#ifndef SEGGER_SYSVIEW_GET_TIMESTAMP + #if defined (SEGGER_SYSVIEW_CORE) && (SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM3) + #define SEGGER_SYSVIEW_GET_TIMESTAMP() (*(U32 *)(0xE0001004)) // Retrieve a system timestamp. Cortex-M cycle counter. + #else + #define SEGGER_SYSVIEW_GET_TIMESTAMP() SEGGER_SYSVIEW_X_GetTimestamp() // Retrieve a system timestamp via user-defined function + #endif +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_TIMESTAMP_BITS +* +* Description +* Number of valid (low-order) bits delivered in system timestamp. +* Default +* 32 +* Notes +* Value has to match system timestamp clock source. +*/ +// Define number of valid bits low-order delivered by clock source. +#ifndef SEGGER_SYSVIEW_TIMESTAMP_BITS + #define SEGGER_SYSVIEW_TIMESTAMP_BITS 32 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_RTT_CHANNEL +* +* Description +* The RTT channel that SystemView will use. +* Default +* 0: Auto selection. +* Notes +* Value has to be lower than SEGGER_RTT_MAX_NUM_UP_BUFFERS. +*/ +#ifndef SEGGER_SYSVIEW_RTT_CHANNEL + #define SEGGER_SYSVIEW_RTT_CHANNEL 0 +#endif +// Sanity check of RTT channel +#if (SEGGER_SYSVIEW_RTT_CHANNEL == 0) && (SEGGER_RTT_MAX_NUM_UP_BUFFERS < 2) + #error "SEGGER_RTT_MAX_NUM_UP_BUFFERS in SEGGER_RTT_Conf.h has to be > 1!" +#elif (SEGGER_SYSVIEW_RTT_CHANNEL >= SEGGER_RTT_MAX_NUM_UP_BUFFERS) + #error "SEGGER_RTT_MAX_NUM_UP_BUFFERS in SEGGER_RTT_Conf.h has to be > SEGGER_SYSVIEW_RTT_CHANNEL!" +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_RTT_BUFFER_SIZE +* +* Description +* Number of bytes that SystemView uses for the RTT buffer. +* Default +* 1024 +*/ +#ifndef SEGGER_SYSVIEW_RTT_BUFFER_SIZE + #define SEGGER_SYSVIEW_RTT_BUFFER_SIZE 1024 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_SECTION +* +* Description +* Section to place the SystemView RTT Buffer into. +* Default +* undefined: Do not place into a specific section. +* Notes +* If SEGGER_RTT_SECTION is defined, the default changes to use +* this section for the SystemView RTT Buffer, too. +*/ +#if !(defined SEGGER_SYSVIEW_SECTION) && (defined SEGGER_RTT_SECTION) + #define SEGGER_SYSVIEW_SECTION SEGGER_RTT_SECTION +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE +* +* Description +* Largest cache line size (in bytes) in the target system. +* Default +* 0 +* Notes +* Required in systems with caches to make sure that the SystemView +* RTT buffer can be aligned accordingly. +*/ +#ifndef SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE + #define SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE 0 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_ID_BASE +* +* Description +* Lowest Id reported by the application. +* Default +* 0 +* Notes +* Value is usually subtracted from mailboxes, semaphores, tasks, +* .... addresses, to compress event parameters. +* Should be the lowest RAM address of the system. +*/ +#ifndef SEGGER_SYSVIEW_ID_BASE + #define SEGGER_SYSVIEW_ID_BASE 0 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_ID_SHIFT +* +* Description +* Number of bits to shift Ids. +* Default +* 0 +* Notes +* Ids are shifted to compress event parameters. +* Should match the alignment of Ids (addresses), +* e.g. 2 when Ids are 4 byte aligned. +*/ +#ifndef SEGGER_SYSVIEW_ID_SHIFT + #define SEGGER_SYSVIEW_ID_SHIFT 0 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_MAX_ARGUMENTS +* +* Description +* Maximum number of arguments which are handled with SystemView +* print routines or may be encoded in one recording function. +* routines. +* Default +* 16 +*/ +#ifndef SEGGER_SYSVIEW_MAX_ARGUMENTS + #define SEGGER_SYSVIEW_MAX_ARGUMENTS 16 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_MAX_STRING_LEN +* +* Description +* Maximum string length which can be used in SystemView print and +* system description routines. +* Default +* 128 +*/ +#ifndef SEGGER_SYSVIEW_MAX_STRING_LEN + #define SEGGER_SYSVIEW_MAX_STRING_LEN 128 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_SUPPORT_LONG_ID +* +* Description +* It set, support enconding Evend Ids longer than 14 bit. +* Default +* 1 +*/ +#ifndef SEGGER_SYSVIEW_SUPPORT_LONG_ID + #define SEGGER_SYSVIEW_SUPPORT_LONG_ID 1 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_SUPPORT_LONG_DATA +* +* Description +* It set, support enconding event data longer than 14 bit. +* Default +* 0 +*/ +#ifndef SEGGER_SYSVIEW_SUPPORT_LONG_DATA + #define SEGGER_SYSVIEW_SUPPORT_LONG_DATA 0 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT +* +* Description +* If enabled, on SEGGER_SYSVIEW_PrintHost, check the format string +* and if it includes unsupported formatters, use formatting on the +* target instead. +* Default +* 0: Disabled. +*/ +#ifndef SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + #define SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT 0 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_USE_INTERNAL_RECORDER +* +* Description +* If set, an internal recorder, such as UART or IP is used. +* Default +* 0: Disabled. +* Notes +* Convenience define to be used by SEGGER_SYSVIEW_Conf(), +* such as in embOS configuration to enable Cortex-M cycle counter. +*/ +#ifndef SEGGER_SYSVIEW_USE_INTERNAL_RECORDER + #define SEGGER_SYSVIEW_USE_INTERNAL_RECORDER 0 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_CAN_RESTART +* +* Description +* If enabled, send the SystemView start sequence on every start +* command, not just on the first one. +* Enables restart when SystemView disconnected unexpectedly. +* Default +* 1: Enabled +*/ +#ifndef SEGGER_SYSVIEW_CAN_RESTART + #define SEGGER_SYSVIEW_CAN_RESTART 1 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_START_ON_INIT +* +* Description +* Enable calling SEGGER_SYSVIEW_Start() after initialization. +* Default +* 0: Disabled. +* Notes +* Convenience define to be used by SEGGER_SYSVIEW_Conf(), +* such as in embOS configuration. +*/ +#ifndef SEGGER_SYSVIEW_START_ON_INIT + #define SEGGER_SYSVIEW_START_ON_INIT 0 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_USE_STATIC_BUFFER +* +* Description +* If enabled, use a static buffer instead of a buffer on the stack +* for SystemView event packets. +* Default +* 1: Enabled. +* Notes +* If enabled, the static memory use by SystemView is increased by +* the maximum packet size. SystemView is locked on entry of a +* recording function. +* If disabled, the stack usage by SystemView recording functions +* might be increased by up to the maximum packet size. SystemView +* is locked when writing the packet to the RTT buffer. +*/ +#ifndef SEGGER_SYSVIEW_USE_STATIC_BUFFER + #define SEGGER_SYSVIEW_USE_STATIC_BUFFER 1 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_MAX_PACKET_SIZE +* +* Description +* Maximum packet size for a SystemView event. +* Default +* Automatically calculated. +* Notes +* The maximum packet size is mainly defined by the maximum string +* length and the maximum number of arguments. +*/ +#ifndef SEGGER_SYSVIEW_MAX_PACKET_SIZE + #define SEGGER_SYSVIEW_MAX_PACKET_SIZE (SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_MAX_STRING_LEN + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_ARGUMENTS * SEGGER_SYSVIEW_QUANTA_U32) +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_POST_MORTEM_MODE +* +* Description +* If enabled, SystemView records for post-mortem analysis instead +* of real-time analysis. +* Default +* 0: Disabled. +* Notes +* For more information refer to +* https://www.segger.com/products/development-tools/systemview/technology/post-mortem-mode +*/ +#ifndef SEGGER_SYSVIEW_POST_MORTEM_MODE + #define SEGGER_SYSVIEW_POST_MORTEM_MODE 0 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_SYNC_PERIOD_SHIFT +* +* Description +* Configure how frequently syncronization is sent in post-mortem +* mode. +* Default +* 8: (1 << 8) = Every 256 Events. +* Notes +* In post-mortem mode, at least one sync has to be in the RTT buffer. +* Recommended sync frequency: Buffer Size / 16 +* For more information refer to +* https://www.segger.com/products/development-tools/systemview/technology/post-mortem-mode +*/ +#ifndef SEGGER_SYSVIEW_SYNC_PERIOD_SHIFT + #define SEGGER_SYSVIEW_SYNC_PERIOD_SHIFT 8 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_ON_EVENT_RECORDED() +* +* Description +* Function macro to notify recorder about a new event in buffer. +* Default +* undefined: Do not notify recorder. +* Notes +* Used for non-J-Link recorder, +* such as to enable transmission via UART or notify IP task. +*/ +#ifndef SEGGER_SYSVIEW_ON_EVENT_RECORDED + #define SEGGER_SYSVIEW_ON_EVENT_RECORDED(NumBytes) +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_LOCK() +* +* Description +* Function macro to (nestable) lock SystemView recording. +* Default +* Use RTT Locking mechanism (defined by SEGGER_RTT_LOCK()). +* Notes +* If SystemView recording is not locked, recording events from +* interrupts and tasks may lead to unpredictable, undefined, event +* data. +*/ +#ifndef SEGGER_SYSVIEW_LOCK + #define SEGGER_SYSVIEW_LOCK() SEGGER_RTT_LOCK() +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_UNLOCK +* +* Description +* Function macro to unlock SystemView recording. +* Default +* Use RTT Unlocking mechanism (defined by SEGGER_RTT_UNLOCK()). +*/ +#ifndef SEGGER_SYSVIEW_UNLOCK + #define SEGGER_SYSVIEW_UNLOCK() SEGGER_RTT_UNLOCK() +#endif + +#ifdef __cplusplus +} +#endif + +#endif + +/*************************** End of file ****************************/ + diff --git a/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW_Config_FreeRTOS.c b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW_Config_FreeRTOS.c new file mode 100644 index 0000000..b26c108 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW_Config_FreeRTOS.c @@ -0,0 +1,273 @@ +/** Copyright (C) SEGGER Microcontroller GmbH */ /* << EST */ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2024 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER SystemView * Real-time application analysis * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the SystemView and RTT protocol, and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* SystemView version: 3.56 * +* * +********************************************************************** +-------------------------- END-OF-HEADER ----------------------------- + +File : SEGGER_SYSVIEW_Config_FreeRTOS.c +Purpose : Sample setup configuration of SystemView with FreeRTOS. +Revision: $Rev: 7745 $ +*/ +#include "FreeRTOS.h" +#include "SEGGER_SYSVIEW.h" + +extern const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI; + +/********************************************************************* +* +* Defines, configurable +* +********************************************************************** +*/ +#if 0 /* << EST: original code by SEGGER: */ +// The application name to be displayed in SystemViewer +#define SYSVIEW_APP_NAME "FreeRTOS Demo Application" + +// The target device name +#define SYSVIEW_DEVICE_NAME "Cortex-M4" + +// Frequency of the timestamp. Must match SEGGER_SYSVIEW_GET_TIMESTAMP in SEGGER_SYSVIEW_Conf.h +#define SYSVIEW_TIMESTAMP_FREQ (configCPU_CLOCK_HZ) + +// System Frequency. SystemcoreClock is used in most CMSIS compatible projects. +#define SYSVIEW_CPU_FREQ configCPU_CLOCK_HZ + +// The lowest RAM address used for IDs (pointers) +#define SYSVIEW_RAM_BASE (0x10000000) +#endif +/* << EST: begin */ +#include "SEGGER_SYSVIEW_Conf.h" /* needed for SEGGER_SYSVIEW_TIMESTAMP_SHIFT */ +#include "McuSystemViewconfig.h" +#include "McuLib.h" +//#define SYSVIEW_USING_PEX (McuLib_CONFIG_PEX_SDK_USED) /* 1: project is a Kinetis SDK Processor Expert project; 0: No Kinetis Processor Expert project */ +//#define SYSVIEW_USING_FREERTOS (McuLib_CONFIG_SDK_USE_FREERTOS) /* 1: using FreeRTOS; 0: Bare metal */ + +#if SYSVIEW_USING_PEX + #include "Cpu.h" +#endif +#if SYSVIEW_USING_FREERTOS + #include "FreeRTOS.h" +#endif + +// The application name to be displayed in SystemViewer +//#ifndef SYSVIEW_APP_NAME +// #define SYSVIEW_APP_NAME "Demo Application" /* application name, configured in properties */ +//#endif + +// The operating system, if any +#if SYSVIEW_USING_FREERTOS + extern const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI; + //#define SYSVIEW_OS_NAME "FreeRTOS" + #define SYSVIEW_OS_API &SYSVIEW_X_OS_TraceAPI +#else + //#define SYSVIEW_OS_NAME "Bare-metal" + #define SYSVIEW_OS_API NULL +#endif +/* << EST: end */ + +// The target device name +//#ifndef SYSVIEW_DEVICE_NAME +// #define SYSVIEW_DEVICE_NAME "Cortex" /* device name, configured in properties */ +//#endif + +// System Frequency. SystemcoreClock is used in most CMSIS compatible projects. +#if SYSVIEW_USING_FREERTOS + #define SYSVIEW_CPU_FREQ configCPU_CLOCK_HZ +#elif SYSVIEW_USING_PEX + #define SYSVIEW_CPU_FREQ configCPU_CLOCK_HZ +#else + /* The SDK variable SystemCoreClock contains the current clock speed */ + extern uint32_t SystemCoreClock; + #define SYSVIEW_CPU_FREQ (SystemCoreClock) /* CPU clock frequency */ +#endif /* SYSVIEW_USING_KINETIS_SDK */ + +// Frequency of the timestamp. Must match SEGGER_SYSVIEW_Conf.h +#define SYSVIEW_TIMESTAMP_FREQ (configSYSTICK_CLOCK_HZ>>SEGGER_SYSVIEW_TIMESTAMP_SHIFT) /* use FreeRTOS Systick frequency value, as this might depend on prescalers */ + +// The lowest RAM address used for IDs (pointers) +#define SYSVIEW_RAM_BASE (McuSystemView_CONFIG_SYSVIEW_RAM_BASE) /* RAM base, configured in properties */ + +#if 1 /* << EST */ +#define portNVIC_SYSTICK_LOAD_REG (*((volatile unsigned long *)0xe000e014)) /* SYST_RVR, SysTick reload value register */ +#define portNVIC_SYSTICK_CURRENT_VALUE_REG (*((volatile unsigned long *)0xe000e018)) /* SYST_CVR, SysTick current value register */ + +#define TICK_NOF_BITS 24 +#define COUNTS_UP 0 /* SysTick is counting down to zero */ +#define SET_TICK_DURATION(val) portNVIC_SYSTICK_LOAD_REG = val +#define GET_TICK_DURATION() portNVIC_SYSTICK_LOAD_REG +#define GET_TICK_CURRENT_VAL(addr) *(addr)=portNVIC_SYSTICK_CURRENT_VALUE_REG + + +uint32_t SEGGER_uxGetTickCounterValue(void) { + uint32_t val; + + GET_TICK_CURRENT_VAL(&val); + return val; +} +#endif + +#if SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM0 /* << EST */ +// +// SEGGER_SYSVIEW_TickCnt has to be defined in the module which +// handles the SysTick and must be incremented in the SysTick +// handler before any SYSVIEW event is generated. +// +// Example in embOS RTOSInit.c: +// +// unsigned int SEGGER_SYSVIEW_TickCnt; // <<-- Define SEGGER_SYSVIEW_TickCnt. +// void SysTick_Handler(void) { +// #if OS_PROFILE +// SYSVIEW_TickCnt++; // <<-- Increment SEGGER_SYSVIEW_TickCnt before calling OS_EnterNestableInterrupt. +// #endif +// OS_EnterNestableInterrupt(); +// OS_TICK_Handle(); +// OS_LeaveNestableInterrupt(); +// } +// +extern unsigned int SEGGER_SYSVIEW_TickCnt; + +#ifndef SCB_ICSR +#define SCB_ICSR (*(volatile U32*) (0xE000ED04uL)) // Interrupt Control State Register +#endif + +#ifndef SCB_ICSR_PENDSTSET_MASK +#define SCB_ICSR_PENDSTSET_MASK (1UL << 26) // SysTick pending bit +#endif + +#ifndef SYST_RVR +#define SYST_RVR (*(volatile U32*) (0xE000E014uL)) // SysTick Reload Value Register +#endif + +#ifndef SYST_CVR +#define SYST_CVR (*(volatile U32*) (0xE000E018uL)) // SysTick Current Value Register +#endif + +/********************************************************************* +* +* SEGGER_SYSVIEW_X_GetTimestamp() +* +* Function description +* Returns the current timestamp in ticks using the system tick +* count and the SysTick counter. +* All parameters of the SysTick have to be known and are set via +* configuration defines on top of the file. +* +* Return value +* The current timestamp. +* +* Additional information +* SEGGER_SYSVIEW_X_GetTimestamp is always called when interrupts are +* disabled. Therefore locking here is not required. +*/ +U32 SEGGER_SYSVIEW_X_GetTimestamp(void) { +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS + U32 TickCount; + U32 Cycles; + U32 CyclesPerTick; + // + // Get the cycles of the current system tick. + // SysTick is down-counting, subtract the current value from the number of cycles per tick. + // + CyclesPerTick = SYST_RVR + 1; + Cycles = (CyclesPerTick - SYST_CVR); + // + // Get the system tick count. + // + TickCount = SEGGER_SYSVIEW_TickCnt; + // + // If a SysTick interrupt is pending increment the TickCount + // + if ((SCB_ICSR & SCB_ICSR_PENDSTSET_MASK) != 0) { + TickCount++; + } + Cycles += TickCount * CyclesPerTick; + + return Cycles; +#else + return 0; +#endif +} +#endif /* << EST */ + +/********************************************************************* +* +* _cbSendSystemDesc() +* +* Function description +* Sends SystemView description strings. +*/ +#if SYSVIEW_USING_FREERTOS /* << EST */ +/* default callback */ +void _cbSendSystemDesc(void) { + SEGGER_SYSVIEW_SendSysDesc("N="SYSVIEW_APP_NAME",O="SYSVIEW_OS_NAME",D="SYSVIEW_DEVICE_NAME); + SEGGER_SYSVIEW_SendSysDesc("I#15=SysTick"); +} +#endif + +/********************************************************************* +* +* Global functions +* +********************************************************************** +*/ +void SEGGER_SYSVIEW_Conf(void) { +#if SYSVIEW_USING_FREERTOS /* << EST */ + #if configUSE_TRACE_HOOKS /* << EST: using Percepio Trace */ && configUSE_SEGGER_SYSTEM_VIEWER_HOOKS /* using SEGGER SystemViewer */ + #warning "Percepio Trace is enabled, this might conflict with Segger System View." + #endif +#if !defined(McuSystemView_CONFIG_SYSVIEW_CONFIG_CALLBACK) /* use default */ + SEGGER_SYSVIEW_Init(SYSVIEW_TIMESTAMP_FREQ, SYSVIEW_CPU_FREQ, &SYSVIEW_X_OS_TraceAPI, _cbSendSystemDesc); +#else /* use application specific callback */ + void McuSystemView_CONFIG_SYSVIEW_CONFIG_CALLBACK(void); /* prototype */ + SEGGER_SYSVIEW_Init(SYSVIEW_TIMESTAMP_FREQ, SYSVIEW_CPU_FREQ, &SYSVIEW_X_OS_TraceAPI, McuSystemView_CONFIG_SYSVIEW_CONFIG_CALLBACK); + #endif + SEGGER_SYSVIEW_SetRAMBase(SYSVIEW_RAM_BASE); +#endif +} + +/*************************** End of file ****************************/ + diff --git a/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW_FreeRTOS.c b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW_FreeRTOS.c new file mode 100644 index 0000000..e6e2fe7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW_FreeRTOS.c @@ -0,0 +1,252 @@ +/********************************************************************* // @suppress("Lack of copyright information") +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2024 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER SystemView * Real-time application analysis * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the SystemView and RTT protocol, and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* SystemView version: 3.56 * +* * +********************************************************************** +-------------------------- END-OF-HEADER ----------------------------- + +File : SEGGER_SYSVIEW_FreeRTOS.c +Purpose : Interface between FreeRTOS and SystemView. +Revision: $Rev: 7947 $ +*/ +#include "FreeRTOS.h" +#include "task.h" +#include "SEGGER_SYSVIEW.h" +#include "SEGGER_SYSVIEW_FreeRTOS.h" +#include "string.h" // Required for memset + + + +typedef struct SYSVIEW_FREERTOS_TASK_STATUS SYSVIEW_FREERTOS_TASK_STATUS; + +struct SYSVIEW_FREERTOS_TASK_STATUS { + U32 xHandle; + const char* pcTaskName; + unsigned uxCurrentPriority; + U32 pxStack; + unsigned uStackHighWaterMark; +}; + +static SYSVIEW_FREERTOS_TASK_STATUS _aTasks[SYSVIEW_FREERTOS_MAX_NOF_TASKS]; +static unsigned _NumTasks; + +/********************************************************************* +* +* _cbSendTaskList() +* +* Function description +* This function is part of the link between FreeRTOS and SYSVIEW. +* Called from SystemView when asked by the host, it uses SYSVIEW +* functions to send the entire task list to the host. +*/ +static void _cbSendTaskList(void) { + unsigned n; + + for (n = 0; n < _NumTasks; n++) { +#if INCLUDE_uxTaskGetStackHighWaterMark // Report Task Stack High Watermark + _aTasks[n].uStackHighWaterMark = uxTaskGetStackHighWaterMark((TaskHandle_t)_aTasks[n].xHandle); +#endif + SYSVIEW_SendTaskInfo((U32)_aTasks[n].xHandle, _aTasks[n].pcTaskName, (unsigned)_aTasks[n].uxCurrentPriority, (U32)_aTasks[n].pxStack, (unsigned)_aTasks[n].uStackHighWaterMark); + } +} + +/********************************************************************* +* +* _cbGetTime() +* +* Function description +* This function is part of the link between FreeRTOS and SYSVIEW. +* Called from SystemView when asked by the host, returns the +* current system time in micro seconds. +*/ +static U64 _cbGetTime(void) { + U64 Time; + + Time = xTaskGetTickCountFromISR(); + Time *= portTICK_PERIOD_MS; + Time *= 1000; + return Time; +} + +/********************************************************************* +* +* Global functions +* +********************************************************************** +*/ +/********************************************************************* +* +* SYSVIEW_AddTask() +* +* Function description +* Add a task to the internal list and record its information. +*/ +void SYSVIEW_AddTask(U32 xHandle, const char* pcTaskName, unsigned uxCurrentPriority, U32 pxStack, unsigned uStackHighWaterMark) { + + if (memcmp(pcTaskName, "IDLE", 5) == 0) { + return; + } + + if (_NumTasks >= SYSVIEW_FREERTOS_MAX_NOF_TASKS) { + SEGGER_SYSVIEW_Warn("SYSTEMVIEW: Could not record task information. Maximum number of tasks reached."); + return; + } + + _aTasks[_NumTasks].xHandle = xHandle; + _aTasks[_NumTasks].pcTaskName = pcTaskName; + _aTasks[_NumTasks].uxCurrentPriority = uxCurrentPriority; + _aTasks[_NumTasks].pxStack = pxStack; + _aTasks[_NumTasks].uStackHighWaterMark = uStackHighWaterMark; + + _NumTasks++; + + SYSVIEW_SendTaskInfo(xHandle, pcTaskName,uxCurrentPriority, pxStack, uStackHighWaterMark); + +} + +/********************************************************************* +* +* SYSVIEW_UpdateTask() +* +* Function description +* Update a task in the internal list and record its information. +*/ +void SYSVIEW_UpdateTask(U32 xHandle, const char* pcTaskName, unsigned uxCurrentPriority, U32 pxStack, unsigned uStackHighWaterMark) { + unsigned n; + + if (memcmp(pcTaskName, "IDLE", 5) == 0) { + return; + } + + for (n = 0; n < _NumTasks; n++) { + if (_aTasks[n].xHandle == xHandle) { + break; + } + } + if (n < _NumTasks) { + _aTasks[n].pcTaskName = pcTaskName; + _aTasks[n].uxCurrentPriority = uxCurrentPriority; + _aTasks[n].pxStack = pxStack; + _aTasks[n].uStackHighWaterMark = uStackHighWaterMark; + + SYSVIEW_SendTaskInfo(xHandle, pcTaskName, uxCurrentPriority, pxStack, uStackHighWaterMark); + } else { + SYSVIEW_AddTask(xHandle, pcTaskName, uxCurrentPriority, pxStack, uStackHighWaterMark); + } +} + +/********************************************************************* +* +* SYSVIEW_DeleteTask() +* +* Function description +* Delete a task from the internal list. +*/ +void SYSVIEW_DeleteTask(U32 xHandle) { + unsigned n; + + if (_NumTasks == 0) { + return; // Early out + } + for (n = 0; n < _NumTasks; n++) { + if (_aTasks[n].xHandle == xHandle) { + break; + } + } + if (n == (_NumTasks - 1)) { + // + // Task is last item in list. + // Simply zero the item and decrement number of tasks. + // + memset(&_aTasks[n], 0, sizeof(_aTasks[n])); + _NumTasks--; + } else if (n < _NumTasks) { + // + // Task is in the middle of the list. + // Move last item to current position and decrement number of tasks. + // Order of tasks does not really matter, so no need to move all following items. + // + _aTasks[n].xHandle = _aTasks[_NumTasks - 1].xHandle; + _aTasks[n].pcTaskName = _aTasks[_NumTasks - 1].pcTaskName; + _aTasks[n].uxCurrentPriority = _aTasks[_NumTasks - 1].uxCurrentPriority; + _aTasks[n].pxStack = _aTasks[_NumTasks - 1].pxStack; + _aTasks[n].uStackHighWaterMark = _aTasks[_NumTasks - 1].uStackHighWaterMark; + memset(&_aTasks[_NumTasks - 1], 0, sizeof(_aTasks[_NumTasks - 1])); + _NumTasks--; + } +} + +/********************************************************************* +* +* SYSVIEW_SendTaskInfo() +* +* Function description +* Record task information. +*/ +void SYSVIEW_SendTaskInfo(U32 TaskID, const char* sName, unsigned Prio, U32 StackBase, unsigned StackSize) { + SEGGER_SYSVIEW_TASKINFO TaskInfo; + + memset(&TaskInfo, 0, sizeof(TaskInfo)); // Fill all elements with 0 to allow extending the structure in future version without breaking the code + TaskInfo.TaskID = TaskID; + TaskInfo.sName = sName; + TaskInfo.Prio = Prio; + TaskInfo.StackBase = StackBase; + TaskInfo.StackSize = StackSize; + SEGGER_SYSVIEW_SendTaskInfo(&TaskInfo); +} + +/********************************************************************* +* +* Public API structures +* +********************************************************************** +*/ +// Callbacks provided to SYSTEMVIEW by FreeRTOS +const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI = { + _cbGetTime, + _cbSendTaskList, +}; + +/*************************** End of file ****************************/ diff --git a/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW_FreeRTOS.h b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW_FreeRTOS.h new file mode 100644 index 0000000..079073e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW_FreeRTOS.h @@ -0,0 +1,581 @@ +/********************************************************************* // <pcTaskName[0]), \ + pxNewTCB->uxPriority, \ + (U32)pxNewTCB->pxStack, \ + ((U32)pxNewTCB->pxTopOfStack - (U32)pxNewTCB->pxStack) \ + ); \ + } +#else +#define traceTASK_CREATE(pxNewTCB) if (pxNewTCB != NULL) { \ + SEGGER_SYSVIEW_OnTaskCreate((U32)pxNewTCB); \ + SYSVIEW_AddTask((U32)pxNewTCB, \ + &(pxNewTCB->pcTaskName[0]), \ + pxNewTCB->uxPriority, \ + (U32)pxNewTCB->pxStack, \ + (U32)(pxNewTCB->pxStack-pxNewTCB->pxTopOfStack) \ + ); \ + } +#endif +#if 0 /* << EST */ +#define traceTASK_PRIORITY_SET(pxTask, uxNewPriority) { \ + SEGGER_SYSVIEW_RecordU32x2(apiID_OFFSET+apiID_VTASKPRIORITYSET, \ + SEGGER_SYSVIEW_ShrinkId((U32)pxTCB), \ + uxNewPriority \ + ); \ + SYSVIEW_UpdateTask((U32)pxTask, \ + &(pxTask->pcTaskName[0]), \ + uxNewPriority, \ + (U32)pxTask->pxStack, \ + 0 \ + ); \ + } + + +#else /* << EST */ +#define traceTASK_PRIORITY_SET(pxTask, uxNewPriority) { \ + SEGGER_SYSVIEW_RecordU32x2(apiID_OFFSET+apiID_VTASKPRIORITYSET, \ + SEGGER_SYSVIEW_ShrinkId((U32)pxTCB), \ + uxNewPriority \ + ); \ + SYSVIEW_UpdateTask((U32)pxTask, \ + &(pxTask->pcTaskName[0]), \ + uxNewPriority, \ + (U32)pxTask->pxStack, \ + (portSTACK_GROWTH<0)? \ + (U32)(pxTask->pxTopOfStack-pxTask->pxStack)\ + :(U32)(pxTask->pxStack-pxTask->pxTopOfStack)\ + ); \ + } +#endif /* << EST */ +// +// Define INCLUDE_xTaskGetIdleTaskHandle as 1 in FreeRTOSConfig.h to allow identification of Idle state. +// +#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) + #define traceTASK_SWITCHED_IN() if(prvGetTCBFromHandle(NULL) == xIdleTaskHandles[0]) { \ + SEGGER_SYSVIEW_OnIdle(); \ + } else { \ + SEGGER_SYSVIEW_OnTaskStartExec((U32)pxCurrentTCB); \ + } +#else + #define traceTASK_SWITCHED_IN() { \ + if (memcmp(pxCurrentTCB->pcTaskName, "IDLE", 5) != 0) { \ + SEGGER_SYSVIEW_OnTaskStartExec((U32)pxCurrentTCB); \ + } else { \ + SEGGER_SYSVIEW_OnIdle(); \ + } \ + } +#endif + +#if 1 /* << EST */ +#define traceMOVED_TASK_TO_READY_STATE(pxTCB) +#define tracePOST_MOVED_TASK_TO_READY_STATE(pxTCB) SEGGER_SYSVIEW_OnTaskStartReady((U32)pxTCB) +#else +#define traceMOVED_TASK_TO_READY_STATE(pxTCB) SEGGER_SYSVIEW_OnTaskStartReady((U32)pxTCB) +#endif +#define traceREADDED_TASK_TO_READY_STATE(pxTCB) + +#define traceMOVED_TASK_TO_DELAYED_LIST() SEGGER_SYSVIEW_OnTaskStopReady((U32)pxCurrentTCB, (1u << 2)) +#define traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST() SEGGER_SYSVIEW_OnTaskStopReady((U32)pxCurrentTCB, (1u << 2)) +#define traceMOVED_TASK_TO_SUSPENDED_LIST(pxTCB) SEGGER_SYSVIEW_OnTaskStopReady((U32)pxTCB, ((3u << 3) | 3)) + + +#if McuSystemView_CONFIG_GENERATE_ISR_EVENTS /* << EST */ +#define traceISR_EXIT_TO_SCHEDULER() SEGGER_SYSVIEW_RecordExitISRToScheduler() +#define traceISR_EXIT() SEGGER_SYSVIEW_RecordExitISR() +#define traceISR_ENTER() SEGGER_SYSVIEW_RecordEnterISR() +#endif /* #if McuSystemView_CONFIG_GENERATE_QUEUE_EVENTS */ + +#endif /* configUSE_SEGGER_SYSTEM_VIEWER_HOOKS */ /* << EST */ + +/********************************************************************* +* +* API functions +* +********************************************************************** +*/ +#ifdef __cplusplus +extern "C" { +#endif +void SYSVIEW_AddTask (U32 xHandle, const char* pcTaskName, unsigned uxCurrentPriority, U32 pxStack, unsigned uStackHighWaterMark); +void SYSVIEW_UpdateTask (U32 xHandle, const char* pcTaskName, unsigned uxCurrentPriority, U32 pxStack, unsigned uStackHighWaterMark); +void SYSVIEW_DeleteTask (U32 xHandle); +void SYSVIEW_SendTaskInfo (U32 TaskID, const char* sName, unsigned Prio, U32 StackBase, unsigned StackSize); + +#ifdef __cplusplus +} +#endif + +#endif + +/*************************** End of file ****************************/ + diff --git a/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW_Int.h b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW_Int.h new file mode 100644 index 0000000..46d3bdc --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/SEGGER_Sysview/SEGGER_SYSVIEW_Int.h @@ -0,0 +1,103 @@ +/** Copyright (C) SEGGER Microcontroller GmbH */ /* << EST */ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2024 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER SystemView * Real-time application analysis * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the SystemView and RTT protocol, and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* SystemView version: 3.56 * +* * +********************************************************************** +-------------------------- END-OF-HEADER ----------------------------- +File : SEGGER_SYSVIEW_Int.h +Purpose : SEGGER SystemView internal header. +Revision: $Rev: 21281 $ +*/ + +#ifndef SEGGER_SYSVIEW_INT_H +#define SEGGER_SYSVIEW_INT_H + +/********************************************************************* +* +* #include Section +* +********************************************************************** +*/ + +#include "SEGGER_SYSVIEW.h" +#include "SEGGER_SYSVIEW_Conf.h" /* << EST */ +#include "SEGGER_SYSVIEW_ConfDefaults.h" /* << EST */ + +#ifdef __cplusplus +extern "C" { +#endif + + +/********************************************************************* +* +* Private data types +* +********************************************************************** +*/ +// +// Commands that Host can send to target +// +typedef enum { + SEGGER_SYSVIEW_COMMAND_ID_START = 1, + SEGGER_SYSVIEW_COMMAND_ID_STOP, + SEGGER_SYSVIEW_COMMAND_ID_GET_SYSTIME, + SEGGER_SYSVIEW_COMMAND_ID_GET_TASKLIST, + SEGGER_SYSVIEW_COMMAND_ID_GET_SYSDESC, + SEGGER_SYSVIEW_COMMAND_ID_GET_NUMMODULES, + SEGGER_SYSVIEW_COMMAND_ID_GET_MODULEDESC, + SEGGER_SYSVIEW_COMMAND_ID_HEARTBEAT = 127, + // Extended commands: Commands >= 128 have a second parameter + SEGGER_SYSVIEW_COMMAND_ID_GET_MODULE = 128 +} SEGGER_SYSVIEW_COMMAND_ID; + +#ifdef __cplusplus +} +#endif + +#endif + +/*************************** End of file ****************************/ + diff --git a/TSM_PicoW_Sensor/McuLib/Template_IncludeMcuLibConfig.h b/TSM_PicoW_Sensor/McuLib/Template_IncludeMcuLibConfig.h new file mode 100644 index 0000000..a63d31c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/Template_IncludeMcuLibConfig.h @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2016-2020, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* header file is included with -include compiler option +Instructions: + - Remove the 'Template_' from the name and place this file into your 'src' folder. + - Include it with the -include compiler option with: "${ProjDirPath}/source/IncludeMcuLibConfig.h" + - Add the following to the -I compiler option: +../McuLib +../McuLib/config +../McuLib/config/fonts +../McuLib/fonts +../McuLib/src +../McuLib/FreeRTOS/Source/include +../McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F +../McuLib/SEGGER_RTT +../McuLib/SEGGER_Sysview +../McuLib/TraceRecorder +../McuLib/TraceRecorder/config +../McuLib/TraceRecorder/include +../McuLib/TraceRecorder/streamports/Jlink_RTT/include +../McuLib/HD44780 +../McuLib/FatFS +../McuLib/FatFS/source + +if using a CDT Build variable pointing to the library, the following can be used instead: +${MCULIB} +${MCULIB}/config +${MCULIB}/config/fonts +${MCULIB}/fonts +${MCULIB}/src +${MCULIB}/FreeRTOS/Source/include +${MCULIB}/FreeRTOS/Source/portable/GCC/ARM_CM4F +${MCULIB}/SEGGER_RTT +${MCULIB}/SEGGER_Sysview +${MCULIB}/TraceRecorder +${MCULIB}/TraceRecorder/config +${MCULIB}/TraceRecorder/include +${MCULIB}/TraceRecorder/streamports/Jlink_RTT/include +${MCULIB}/HD44780 +${MCULIB}/minIni +${MCULIB}/FatFS +${MCULIB}/FatFS/source + */ + +/* For ESP32 targets: + - place the IncludeMcuLibConfig.h into the project 'config' folder + - copy the template file McuLib\ESP32_CMakeLists.txt and rename it to McuLib\CMakeLists.text + - add the following to your main CMakeLists.txt, between cmake_minimum_required() and the include(): +list(APPEND EXTRA_COMPONENT_DIRS "../McuLib") + - add the following after the include(): +add_compile_options(-I../config) +add_compile_options(-include "../config/IncludeMcuLibConfig.h") + + - It should look similar to this: + cmake_minimum_required(VERSION 3.5) + + list(APPEND EXTRA_COMPONENT_DIRS "../McuLib") + + include($ENV{IDF_PATH}/tools/cmake/project.cmake) + + add_compile_options(-I../config) + add_compile_options(-include "../config/IncludeMcuLibConfig.h") + + project(idf-eclipse) + + */ + +#ifndef INCLUDEMCULIBCONFIG_H_ +#define INCLUDEMCULIBCONFIG_H_ + +/* ------------------- SDK/Library ---------------------------*/ +#define McuLib_CONFIG_SDK_VERSION_USED McuLib_CONFIG_SDK_MCUXPRESSO_2_0 +/* set the CPU. See McuLibconfig.h for all supported CPUs */ +#if 1 /* example configuration for LPC845 */ + #define McuLib_CONFIG_CPU_IS_LPC (1) /* LPC family */ + #define McuLib_CONFIG_CORTEX_M (0) /*!< 0: Cortex-M0, 3: M3, 4: M4, 7: M7, 33: M33, -1 otherwise */ + #define McuLib_CONFIG_CPU_VARIANT (McuLib_CONFIG_CPU_VARIANT_NXP_LPC845) /* for LPC need to specify the actual device */ +#elif 0 /* example configuration for LPC55xx */ + #define McuLib_CONFIG_CPU_IS_LPC (1) /* LPC family */ + #define McuLib_CONFIG_CPU_IS_LPC55xx (1) /* LPC55xx */ + #define McuLib_CONFIG_CORTEX_M (33) /*!< 0: Cortex-M0, 3: M3, 4: M4, 7: M7, 33: M33, -1 otherwise */ + #define McuLib_CONFIG_CPU_VARIANT (McuLib_CONFIG_CPU_VARIANT_NXP_LPC55S69) /* for LPC need to specify the actual device */ +#elif 0 /* example configuration for Kinetis K22 */ + #define McuLib_CONFIG_CPU_IS_KINETIS (1) /* NXP Kinetis family */ + #define McuLib_CONFIG_CORTEX_M (4) /*!< 0: Cortex-M0, 3: M3, 4: M4, 7: M7, 33: M33, -1 otherwise */ +#elif 0 /* example configuration for i.MX RT */ + #define McuLib_CONFIG_CPU_IS_IMXRT (1) /* i.MX RT family */ + #define McuLib_CONFIG_CORTEX_M (7) /*!< 0: Cortex-M0, 3: M3, 4: M4, 7: M7, 33: M33, -1 otherwise */ +#elif 0 /* ESP32 */ + #define McuLib_CONFIG_CPU_IS_ARM_CORTEX_M (0) /* ESP32 is detected automatically */ + #define configHEAP_SCHEME_IDENTIFICATION (0) /* ESP-IDF RTOS used */ + #define McuCriticalSection_CONFIG_USE_RTOS_CRITICAL_SECTION (1) /* no native Extensa implementation yet */ +#endif +/* ------------------- RTOS ---------------------------*/ +#define McuLib_CONFIG_SDK_USE_FREERTOS (0) +/* #define configUSE_SEGGER_SYSTEM_VIEWER_HOOKS (1) */ +/* #define configTOTAL_HEAP_SIZE (24*1024) */ +/* #define configUSE_HEAP_SECTION_NAME (1) */ +/* #define configHEAP_SECTION_NAME_STRING ".bss.$SRAM_LOWER.FreeRTOS" */ +/* ------------------- FatFS ---------------------------*/ +#define McuLib_CONFIG_USE_FAT_FS (0) + +#endif /* INCLUDEMCULIBCONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/TraceRecorder/License_PercepioTrace.txt b/TSM_PicoW_Sensor/McuLib/TraceRecorder/License_PercepioTrace.txt new file mode 100644 index 0000000..3d2b426 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/TraceRecorder/License_PercepioTrace.txt @@ -0,0 +1,36 @@ +/******************************************************************************* + * Tracealyzer v2.5.0 Recorder Library + * Percepio AB, www.percepio.com + * + * trcKernelPort.c + * + * Kernel-specific functionality for FreeRTOS, used by the recorder library. + * + * Terms of Use + * This software is copyright Percepio AB. The recorder library is free for + * use together with Percepio products. You may distribute the recorder library + * in its original form, including modifications in trcHardwarePort.c/.h + * given that these modification are clearly marked as your own modifications + * and documented in the initial comment section of these source files. + * This software is the intellectual property of Percepio AB and may not be + * sold or in other ways commercially redistributed without explicit written + * permission by Percepio AB. + * + * Disclaimer + * The trace tool and recorder library is being delivered to you AS IS and + * Percepio AB makes no warranty as to its use or performance. Percepio AB does + * not and cannot warrant the performance or results you may obtain by using the + * software or documentation. Percepio AB make no warranties, express or + * implied, as to noninfringement of third party rights, merchantability, or + * fitness for any particular purpose. In no event will Percepio AB, its + * technology partners, or distributors be liable to you for any consequential, + * incidental or special damages, including any lost profits or lost savings, + * even if a representative of Percepio AB has been advised of the possibility + * of such damages, or for any claim by any third party. Some jurisdictions do + * not allow the exclusion or limitation of incidental, consequential or special + * damages, or the exclusion of implied warranties or limitations on how long an + * implied warranty may last, so the above limitations may not apply to you. + * + * Copyright Percepio AB, 2013. + * www.percepio.com + ******************************************************************************/ diff --git a/TSM_PicoW_Sensor/McuLib/TraceRecorder/McuPercepio.c b/TSM_PicoW_Sensor/McuLib/TraceRecorder/McuPercepio.c new file mode 100644 index 0000000..11b9c33 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/TraceRecorder/McuPercepio.c @@ -0,0 +1,625 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuPercepio.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : PercepioTrace +** Version : Component 01.140, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-11-28, 10:44, # CodeGen: 717 +** Abstract : +** +** Settings : +** Component name : McuPercepio +** RTOS+Trace Version : V4.4.1 +** Recorder Mode : Streaming +** Recorder Buffer Allocation : static +** Max ISR Nesting : 16 +** Snapshot Mode : +** Recorder store mode : Ring Buffer +** Scheduling only : no +** Description string : FreeRTOS+Trace +** Description max length : 80 +** Event buffer size : 1200 +** Symbol table size : 400 +** Objects : +** Number of tasks : 10 +** Name length for task : configMAX_TASK_NAME_LEN +** Number of ISR : 4 +** Number of queue : 3 +** Number of semaphore : 4 +** Number of mutex : 4 +** Number of timer : 2 +** Number of event groups : 2 +** Name length for ISR : 10 +** Name length for queue : 15 +** Name length for semaphore : 15 +** Name length for mutex : 15 +** Name length for timer : 15 +** Name length for event group : 15 +** Events Creation : +** Include OS Tick events : no +** Include ready events : yes +** Include memory manager events : no +** Include ISR tracing : yes +** Include object delete events : yes +** Include user events : yes +** Heap Size below 16M : no +** Float support : no +** Use implicit IFE rules : yes +** Use 16bit Object Handles : no +** Segger RTT : Enabled +** Segger RTT : McuRTT +** Streaming Mode : +** Up Buffer Index : 2 +** Up Buffer Size : 1024 +** Down Buffer Index : 2 +** Down Buffer Size : 32 +** Symbol Table Slots : 30 +** Symbol Max Length : 24 +** Object Data Slots : 20 +** Ctrl Task Priority : 1 +** Ctrl Task Stack Size : configMINIMAL_STACK_SIZE +** Ctrl Task Delay : ((10 * configTICK_RATE_HZ) / 1000) +** Source Folders : Enabled +** Recorder : TraceRecorder +** Config : TraceRecorder/config +** Include : TraceRecorder/include +** RTT Include : TraceRecorder/streamports/Jlink_RTT/include +** System : +** SDK : McuLib +** Utility : McuUtility +** Contents : +** vTraceEnable - void McuPercepio_vTraceEnable(int startOption); +** uiTraceStart - dword McuPercepio_uiTraceStart(void); +** vTraceStop - void McuPercepio_vTraceStop(void); +** vTraceClear - void McuPercepio_vTraceClear(void); +** uiTraceGetTraceBufferSize - dword McuPercepio_uiTraceGetTraceBufferSize(void); +** xTraceGetTraceBuffer - void* McuPercepio_xTraceGetTraceBuffer(void); +** xTraceRegisterString - traceString McuPercepio_xTraceRegisterString(const char* name); +** vTracePrint - void McuPercepio_vTracePrint(traceString chn, const char* str); +** vTracePrintF - void McuPercepio_vTracePrintF(traceLabel eventLabel, char *formatStr, ...); +** vTraceSetQueueName - void McuPercepio_vTraceSetQueueName(void *queue, char *name); +** vTraceSetSemaphoreName - void McuPercepio_vTraceSetSemaphoreName(void *semaphore, char *name); +** vTraceSetMutexName - void McuPercepio_vTraceSetMutexName(void *mutex, char *name); +** xTraceSetISRProperties - traceHandle McuPercepio_xTraceSetISRProperties(char *name, char prioritiy); +** vTraceStoreISRBegin - void McuPercepio_vTraceStoreISRBegin(traceHandle handle); +** vTraceStoreISREnd - void McuPercepio_vTraceStoreISREnd(int isTaskSwitchRequired); +** vGetGDBDumpCommand - void McuPercepio_vGetGDBDumpCommand(uint8_t *buf, uint16_t bufSize, uint8_t... +** vTraceSetStopHook - void McuPercepio_vTraceSetStopHook(TRACE_STOP_HOOK stopHookFunction); +** xTraceGetLastError - char* McuPercepio_xTraceGetLastError(void); +** vTraceClearError - byte McuPercepio_vTraceClearError(int resetErrorMessage); +** Startup - void McuPercepio_Startup(void); +** +** * (c) Copyright Percepio AB, 2013-2020 +** * http : www.percepio.se +** * mail : info@percepio.com +** * See separate Percepio licensing terms. +** * +** * Processor Expert Component: (c) Copyright Erich Styger, 2013-2020 +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuPercepio.h +** @version 01.00 +** @brief +** +*/ +/*! +** @addtogroup McuPercepio_module McuPercepio module documentation +** @{ +*/ + +/* MODULE McuPercepio. */ +#include "McuPercepio.h" +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT + #include "Events.h" +#endif + +/* +** =================================================================== +** Method : uiTraceGetTraceBufferSize (component PercepioTrace) +** +** Description : +** Gets the size of the recorder data structure. For use +** together with vTraceGetTraceBuffer if you wish to implement +** an own store/upload solution, e.g., in case a debugger +** connection is not available for uploading the data. +** Parameters : None +** Returns : +** --- - Size of the trace buffer +** =================================================================== +*/ +/* +dword McuPercepio_uiTraceGetTraceBufferSize(void) +{ + *** Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : xTraceGetTraceBuffer (component PercepioTrace) +** +** Description : +** Return a pointer to the recorder data structure. Use this +** together with uiTraceGetTraceBufferSize if you wish to +** implement an own store/upload solution, e.g., in case a +** debugger connection is not available for uploading the data. +** Parameters : None +** Returns : +** --- - Pointer to the trace buffer +** =================================================================== +*/ +/* +void* McuPercepio_xTraceGetTraceBuffer(void) +{ + *** Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : uiTraceStart (component PercepioTrace) +** +** Description : +** Starts the trace. +** Parameters : None +** Returns : +** --- - returns 1 if trace has been started, 0 +** otherwise. +** =================================================================== +*/ +/* +dword McuPercepio_uiTraceStart(void) +{ + *** Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : vTraceStop (component PercepioTrace) +** +** Description : +** Stops the trace. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +/* +void McuPercepio_vTraceStop(void) +{ + *** Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : vTraceClear (component PercepioTrace) +** +** Description : +** Clears the trace. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +/* +void McuPercepio_vTraceClear(void) +{ + *** Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : xTraceRegisterString (component PercepioTrace) +** +** Description : +** Register strings in the recorder, e.g. for names of user +** event channels. +** Parameters : +** NAME - DESCRIPTION +** * name - Pointer to label +** Returns : +** --- - trace label to be used with vTracePrintF +** =================================================================== +*/ +/* +traceString McuPercepio_xTraceRegisterString(const char* name) +{ + *** Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : vTracePrint (component PercepioTrace) +** +** Description : +** Generates a User Event with a text label. The label is +** created/looked up in the symbol table using +** xTraceRegisterString. +** Parameters : +** NAME - DESCRIPTION +** chn - trace label for the user event +** * str - Pointer to string +** Returns : Nothing +** =================================================================== +*/ +/* +void McuPercepio_vTracePrint(traceString chn, const char* str) +{ + *** Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : vTracePrintF (component PercepioTrace) +** +** Description : +** Advanced user event - like printf (but limited formatting +** support - will improve) +** Parameters : +** NAME - DESCRIPTION +** eventLabel - trace label +** * formatStr - Pointer to format string +** Variable_1 - open parameter list +** Returns : Nothing +** =================================================================== +*/ +/* +void McuPercepio_vTracePrintF(traceLabel eventLabel, char *formatStr, ...) +{ + *** Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : vTraceSetQueueName (component PercepioTrace) +** +** Description : +** Assigns a name to a FreeRTOS Queue, Semaphore or Mutex. This +** function should be called right after creation of the +** queue/mutex/semaphore. If not using this function, the +** queues/mutexes/semaphores will be presented by their numeric +** handle only. +** Parameters : +** NAME - DESCRIPTION +** * queue - Pointer to the queue +** * name - Pointer to name +** Returns : Nothing +** =================================================================== +*/ +/* +void McuPercepio_vTraceSetQueueName(void *queue, char *name) +{ + *** Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : xTraceSetISRProperties (component PercepioTrace) +** +** Description : +** Registers an Interrupt Service Routine in the recorder +** library, This must be called before using +** vTraceStoreISRBegin to store ISR events. This is typically +** called in the startup of the system, before the scheduler is +** started. Method is always enabled if 'Include ISR tracing' +** is set to 'yes' in the properties. +** Parameters : +** NAME - DESCRIPTION +** * name - Pointer to name +** prioritiy - priority +** Returns : +** --- - trace handle to be used for +** vTaceStoreISRBegin() +** =================================================================== +*/ +/* +traceHandle McuPercepio_xTraceSetISRProperties(char *name, char prioritiy) +{ + *** Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : vTraceStoreISRBegin (component PercepioTrace) +** +** Description : +** Registers the beginning of an Interrupt Service Routine. +** This must not be interrupted by another ISR containing +** recorder library calls, so if allowing nested ISRs this must +** be called with interrupts disabled. Method is always +** enabled if 'Include ISR tracing' is set to 'yes' in the +** properties. +** Parameters : +** NAME - DESCRIPTION +** handle - trace handle +** Returns : Nothing +** =================================================================== +*/ +/* +void McuPercepio_vTraceStoreISRBegin(traceHandle handle) +{ + *** Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : vTraceStoreISREnd (component PercepioTrace) +** +** Description : +** Registers the end of an Interrupt Service Routine. This must +** not be interrupted by another ISR containing recorder +** library calls, so if allowing nested ISRs this must be +** called with interrupts disabled. Method is always enabled +** if 'Include ISR tracing' is set to 'yes' in the properties. +** Parameters : +** NAME - DESCRIPTION +** isTaskSwitchRequired - The +** parameter pendingISR indicates if the +** interrupt has requested a task-switch (= 1) +** or if the interrupt returns to the earlier +** context (= 0) +** Returns : Nothing +** =================================================================== +*/ +/* +void McuPercepio_vTraceStoreISREnd(int isTaskSwitchRequired) +{ + *** Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : vGetGDBDumpCommand (component PercepioTrace) +** +** Description : +** Gets the gdb command to dump the trace data to a file. +** Useful for copy-pasting it to the gdb console. +** Parameters : +** NAME - DESCRIPTION +** * buf - Pointer to buffer for the command. Make it +** large enoug (about 64 bytes) +** bufSize - size of the buffer +** * fileName - Pointer to the file name string, +** e.g. "C:\\tmp\\trace.dump" +** Returns : Nothing +** =================================================================== +*/ +void McuPercepio_vGetGDBDumpCommand(uint8_t *buf, uint16_t bufSize, uint8_t *fileName) +{ +#if !TRC_USE_TRACEALYZER_RECORDER || (TRC_CFG_RECORDER_MODE==TRC_RECORDER_MODE_STREAMING) /* trace disabled or streaming mode */ + (void)bufSize; /* not used */ + (void)fileName; /* not used */ + /* with RTT streaming, there is no trace buffer */ + *buf = '\0'; +#else + /* construct gdb command string: dump binary memory */ + uint8_t *ptr; /* pointer to data */ + size_t len; /* size/length of data */ + + ptr = (uint8_t*)McuPercepio_xTraceGetTraceBuffer(); + len = McuPercepio_uiTraceGetTraceBufferSize(); + McuUtility_strcpy(buf, bufSize, (unsigned char*)"dump binary memory "); + McuUtility_strcat(buf, bufSize, fileName); + McuUtility_strcat(buf, bufSize, (unsigned char*)" 0x"); + McuUtility_strcatNum32Hex(buf, bufSize, (uint32_t)ptr); + McuUtility_strcat(buf, bufSize, (unsigned char*)" 0x"); + McuUtility_strcatNum32Hex(buf, bufSize, (uint32_t)(ptr+len)); +#endif +} + +/* +** =================================================================== +** Method : vTraceSetStopHook (component PercepioTrace) +** +** Description : +** Sets a function to be called when the recorder is stopped. +** Parameters : +** NAME - DESCRIPTION +** stopHookFunction - +** Returns : Nothing +** =================================================================== +*/ +/* +void McuPercepio_vTraceSetStopHook(TRACE_STOP_HOOK stopHookFunction) +{ + *** Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : xTraceGetLastError (component PercepioTrace) +** +** Description : +** Gives the last error message, if any. NULL if no error +** message is stored. Any error message is also presented when +** opening a trace file. +** Parameters : None +** Returns : +** --- - Error message +** =================================================================== +*/ +/* +char* McuPercepio_xTraceGetLastError(void) +{ + *** Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : vTraceClearError (component PercepioTrace) +** +** Description : +** Removes any previous error message generated by recorder +** calling vTraceError. By calling this function, it may be +** possible to start/restart the trace despite errors in the +** recorder, but there is no guarantee that the trace recorder +** will work correctly in that case, depending on the type of +** error. +** Parameters : +** NAME - DESCRIPTION +** resetErrorMessage - parameter is +** not used +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +byte McuPercepio_vTraceClearError(int resetErrorMessage) +{ + *** Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : vTraceEnable (component PercepioTrace) +** +** Description : +** +** Parameters : +** NAME - DESCRIPTION +** startoption - * TRC_START: Starts the +** tracing directly. In snapshot mode this +** allows for +** * starting the trace at any point in your +** code, assuming vTraceEnable(TRC_INIT) +** * has been called in the startup. +** * Can also be used for streaming without +** Tracealyzer control, e.g. to a local +** * flash file system (assuming such a +** "stream port", see trcStreamingPort.h). +** * +** * TRC_START_AWAIT_HOST: For streaming mode +** only. Initializes the trace recorder +** * if necessary and waits for a Start +** command from Tracealyzer ("Start Recording" +** * button). This call is intentionally +** blocking! By calling vTraceEnable with +** * this option from the startup code, you +** start tracing at this point and capture +** * the early events. +** * +** * TRC_INIT: Initializes the trace recorder, +** but does not start the tracing. +** * In snapshot mode, this must be followed +** by a vTraceEnable(TRC_START) sometime +** * later. +** Returns : Nothing +** =================================================================== +*/ +/* +void McuPercepio_vTraceEnable(int startOption) +{ + *** Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : vTraceSetSemaphoreName (component PercepioTrace) +** +** Description : +** Assigns a name to a FreeRTOS Queue, Semaphore or Mutex. This +** function should be called right after creation of the +** queue/mutex/semaphore. If not using this function, the +** queues/mutexes/semaphores will be presented by their numeric +** handle only. +** Parameters : +** NAME - DESCRIPTION +** * queue - Pointer to the semaphore +** * name - Pointer to name +** Returns : Nothing +** =================================================================== +*/ +/* +void McuPercepio_vTraceSetSemaphoreName(void *semaphore, char *name) +{ + *** Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : vTraceSetMutexName (component PercepioTrace) +** +** Description : +** Assigns a name to a FreeRTOS Queue, Semaphore or Mutex. This +** function should be called right after creation of the +** queue/mutex/semaphore. If not using this function, the +** queues/mutexes/semaphores will be presented by their numeric +** handle only. +** Parameters : +** NAME - DESCRIPTION +** * queue - Pointer to the mutex +** * name - Pointer to name +** Returns : Nothing +** =================================================================== +*/ +/* +void McuPercepio_vTraceSetMutexName(void *mutex, char *name) +{ + *** Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : Startup (component PercepioTrace) +** +** Description : +** Routine called during startup. Depending on the mode and +** settings, it starts tracing and might block! +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuPercepio_Startup(void) +{ +#if configUSE_PERCEPIO_TRACE_HOOKS /* FreeRTOS using Percepio Trace */ + vTraceSetFrequency(configSYSTICK_CLOCK_HZ); + vTraceEnable(McuPercepio_CONFIG_START_TRACE_IN_STARTUP_MODE); /* snapshot trace, from startup */ +#endif /* configUSE_PERCEPIO_TRACE_HOOKS */ +} + +/* END McuPercepio. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/TraceRecorder/McuPercepio.h b/TSM_PicoW_Sensor/McuLib/TraceRecorder/McuPercepio.h new file mode 100644 index 0000000..2059592 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/TraceRecorder/McuPercepio.h @@ -0,0 +1,553 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuPercepio.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : PercepioTrace +** Version : Component 01.140, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-11-28, 10:44, # CodeGen: 717 +** Abstract : +** +** Settings : +** Component name : McuPercepio +** RTOS+Trace Version : V4.4.1 +** Recorder Mode : Streaming +** Recorder Buffer Allocation : static +** Max ISR Nesting : 16 +** Snapshot Mode : +** Recorder store mode : Ring Buffer +** Scheduling only : no +** Description string : FreeRTOS+Trace +** Description max length : 80 +** Event buffer size : 1200 +** Symbol table size : 400 +** Objects : +** Number of tasks : 10 +** Name length for task : configMAX_TASK_NAME_LEN +** Number of ISR : 4 +** Number of queue : 3 +** Number of semaphore : 4 +** Number of mutex : 4 +** Number of timer : 2 +** Number of event groups : 2 +** Name length for ISR : 10 +** Name length for queue : 15 +** Name length for semaphore : 15 +** Name length for mutex : 15 +** Name length for timer : 15 +** Name length for event group : 15 +** Events Creation : +** Include OS Tick events : no +** Include ready events : yes +** Include memory manager events : no +** Include ISR tracing : yes +** Include object delete events : yes +** Include user events : yes +** Heap Size below 16M : no +** Float support : no +** Use implicit IFE rules : yes +** Use 16bit Object Handles : no +** Segger RTT : Enabled +** Segger RTT : McuRTT +** Streaming Mode : +** Up Buffer Index : 2 +** Up Buffer Size : 1024 +** Down Buffer Index : 2 +** Down Buffer Size : 32 +** Symbol Table Slots : 30 +** Symbol Max Length : 24 +** Object Data Slots : 20 +** Ctrl Task Priority : 1 +** Ctrl Task Stack Size : configMINIMAL_STACK_SIZE +** Ctrl Task Delay : ((10 * configTICK_RATE_HZ) / 1000) +** Source Folders : Enabled +** Recorder : TraceRecorder +** Config : TraceRecorder/config +** Include : TraceRecorder/include +** RTT Include : TraceRecorder/streamports/Jlink_RTT/include +** System : +** SDK : McuLib +** Utility : McuUtility +** Contents : +** vTraceEnable - void McuPercepio_vTraceEnable(int startOption); +** uiTraceStart - dword McuPercepio_uiTraceStart(void); +** vTraceStop - void McuPercepio_vTraceStop(void); +** vTraceClear - void McuPercepio_vTraceClear(void); +** uiTraceGetTraceBufferSize - dword McuPercepio_uiTraceGetTraceBufferSize(void); +** xTraceGetTraceBuffer - void* McuPercepio_xTraceGetTraceBuffer(void); +** xTraceRegisterString - traceString McuPercepio_xTraceRegisterString(const char* name); +** vTracePrint - void McuPercepio_vTracePrint(traceString chn, const char* str); +** vTracePrintF - void McuPercepio_vTracePrintF(traceLabel eventLabel, char *formatStr, ...); +** vTraceSetQueueName - void McuPercepio_vTraceSetQueueName(void *queue, char *name); +** vTraceSetSemaphoreName - void McuPercepio_vTraceSetSemaphoreName(void *semaphore, char *name); +** vTraceSetMutexName - void McuPercepio_vTraceSetMutexName(void *mutex, char *name); +** xTraceSetISRProperties - traceHandle McuPercepio_xTraceSetISRProperties(char *name, char prioritiy); +** vTraceStoreISRBegin - void McuPercepio_vTraceStoreISRBegin(traceHandle handle); +** vTraceStoreISREnd - void McuPercepio_vTraceStoreISREnd(int isTaskSwitchRequired); +** vGetGDBDumpCommand - void McuPercepio_vGetGDBDumpCommand(uint8_t *buf, uint16_t bufSize, uint8_t... +** vTraceSetStopHook - void McuPercepio_vTraceSetStopHook(TRACE_STOP_HOOK stopHookFunction); +** xTraceGetLastError - char* McuPercepio_xTraceGetLastError(void); +** vTraceClearError - byte McuPercepio_vTraceClearError(int resetErrorMessage); +** Startup - void McuPercepio_Startup(void); +** +** * (c) Copyright Percepio AB, 2013-2020 +** * http : www.percepio.se +** * mail : info@percepio.com +** * See separate Percepio licensing terms. +** * +** * Processor Expert Component: (c) Copyright Erich Styger, 2013-2020 +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuPercepio.h +** @version 01.00 +** @brief +** +*/ +/*! +** @addtogroup McuPercepio_module McuPercepio module documentation +** @{ +*/ + +#ifndef __McuPercepio_HvTraceInitTraceData +#define __McuPercepio_H + +/* MODULE McuPercepio. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuPercepioconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuRTT.h" +#include "McuLib.h" +#include "McuUtility.h" + +#if McuLib_CONFIG_SDK_VERSION_USED != McuLib_CONFIG_SDK_PROCESSOR_EXPERT + /* prototypes for user events */ + void McuPercepio_OnTraceWrap(void); +#endif + +#include "trcRecorder.h" /* streaming interface */ + + +#define McuPercepio_uiTraceGetTraceBufferSize() \ + uiTraceGetTraceBufferSize() + +/* +** =================================================================== +** Method : uiTraceGetTraceBufferSize (component PercepioTrace) +** +** Description : +** Gets the size of the recorder data structure. For use +** together with vTraceGetTraceBuffer if you wish to implement +** an own store/upload solution, e.g., in case a debugger +** connection is not available for uploading the data. +** Parameters : None +** Returns : +** --- - Size of the trace buffer +** =================================================================== +*/ + +#define McuPercepio_xTraceGetTraceBuffer() \ + xTraceGetTraceBuffer() + +/* +** =================================================================== +** Method : xTraceGetTraceBuffer (component PercepioTrace) +** +** Description : +** Return a pointer to the recorder data structure. Use this +** together with uiTraceGetTraceBufferSize if you wish to +** implement an own store/upload solution, e.g., in case a +** debugger connection is not available for uploading the data. +** Parameters : None +** Returns : +** --- - Pointer to the trace buffer +** =================================================================== +*/ + +#define McuPercepio_uiTraceStart() \ + uiTraceStart() +/* +** =================================================================== +** Method : uiTraceStart (component PercepioTrace) +** +** Description : +** Starts the trace. +** Parameters : None +** Returns : +** --- - returns 1 if trace has been started, 0 +** otherwise. +** =================================================================== +*/ + +#define McuPercepio_vTraceStop() \ + vTraceStop() + +/* +** =================================================================== +** Method : vTraceStop (component PercepioTrace) +** +** Description : +** Stops the trace. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +#define McuPercepio_vTraceClear() \ + vTraceClear() + +/* +** =================================================================== +** Method : vTraceClear (component PercepioTrace) +** +** Description : +** Clears the trace. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +#define McuPercepio_xTraceRegisterString (label) \ + xTraceRegisterString(label) + +/* +** =================================================================== +** Method : xTraceRegisterString (component PercepioTrace) +** +** Description : +** Register strings in the recorder, e.g. for names of user +** event channels. +** Parameters : +** NAME - DESCRIPTION +** * name - Pointer to label +** Returns : +** --- - trace label to be used with vTracePrintF +** =================================================================== +*/ + +#define McuPercepio_vTracePrint(chn, str) \ + vTracePrint(chn, str) + +/* +** =================================================================== +** Method : vTracePrint (component PercepioTrace) +** +** Description : +** Generates a User Event with a text label. The label is +** created/looked up in the symbol table using +** xTraceRegisterString. +** Parameters : +** NAME - DESCRIPTION +** chn - trace label for the user event +** * str - Pointer to string +** Returns : Nothing +** =================================================================== +*/ + +/* void McuPercepio_vTracePrintF(traceLabel eventLabel, char *formatStr, ...); */ +#define McuPercepio_vTracePrintF vTracePrintF + +/* +** =================================================================== +** Method : vTracePrintF (component PercepioTrace) +** +** Description : +** Advanced user event - like printf (but limited formatting +** support - will improve) +** Parameters : +** NAME - DESCRIPTION +** eventLabel - trace label +** * formatStr - Pointer to format string +** Variable_1 - open parameter list +** Returns : Nothing +** =================================================================== +*/ + +#define McuPercepio_vTraceSetQueueName(queue, name) \ + vTraceSetQueueName(queue, name) + +/* +** =================================================================== +** Method : vTraceSetQueueName (component PercepioTrace) +** +** Description : +** Assigns a name to a FreeRTOS Queue, Semaphore or Mutex. This +** function should be called right after creation of the +** queue/mutex/semaphore. If not using this function, the +** queues/mutexes/semaphores will be presented by their numeric +** handle only. +** Parameters : +** NAME - DESCRIPTION +** * queue - Pointer to the queue +** * name - Pointer to name +** Returns : Nothing +** =================================================================== +*/ + +#define McuPercepio_xTraceSetISRProperties(name, prioritiy) \ + xTraceSetISRProperties(name, prioritiy) + +/* +** =================================================================== +** Method : xTraceSetISRProperties (component PercepioTrace) +** +** Description : +** Registers an Interrupt Service Routine in the recorder +** library, This must be called before using +** vTraceStoreISRBegin to store ISR events. This is typically +** called in the startup of the system, before the scheduler is +** started. Method is always enabled if 'Include ISR tracing' +** is set to 'yes' in the properties. +** Parameters : +** NAME - DESCRIPTION +** * name - Pointer to name +** prioritiy - priority +** Returns : +** --- - trace handle to be used for +** vTaceStoreISRBegin() +** =================================================================== +*/ + +#define McuPercepio_vTraceStoreISRBegin(handle) \ + vTraceStoreISRBegin(handle) + +/* +** =================================================================== +** Method : vTraceStoreISRBegin (component PercepioTrace) +** +** Description : +** Registers the beginning of an Interrupt Service Routine. +** This must not be interrupted by another ISR containing +** recorder library calls, so if allowing nested ISRs this must +** be called with interrupts disabled. Method is always +** enabled if 'Include ISR tracing' is set to 'yes' in the +** properties. +** Parameters : +** NAME - DESCRIPTION +** handle - trace handle +** Returns : Nothing +** =================================================================== +*/ + +#define McuPercepio_vTraceStoreISREnd(isTaskSwitchRequired) \ + vTraceStoreISREnd(isTaskSwitchRequired) + +/* +** =================================================================== +** Method : vTraceStoreISREnd (component PercepioTrace) +** +** Description : +** Registers the end of an Interrupt Service Routine. This must +** not be interrupted by another ISR containing recorder +** library calls, so if allowing nested ISRs this must be +** called with interrupts disabled. Method is always enabled +** if 'Include ISR tracing' is set to 'yes' in the properties. +** Parameters : +** NAME - DESCRIPTION +** isTaskSwitchRequired - The +** parameter pendingISR indicates if the +** interrupt has requested a task-switch (= 1) +** or if the interrupt returns to the earlier +** context (= 0) +** Returns : Nothing +** =================================================================== +*/ + +void McuPercepio_vGetGDBDumpCommand(uint8_t *buf, uint16_t bufSize, uint8_t *fileName); +/* +** =================================================================== +** Method : vGetGDBDumpCommand (component PercepioTrace) +** +** Description : +** Gets the gdb command to dump the trace data to a file. +** Useful for copy-pasting it to the gdb console. +** Parameters : +** NAME - DESCRIPTION +** * buf - Pointer to buffer for the command. Make it +** large enoug (about 64 bytes) +** bufSize - size of the buffer +** * fileName - Pointer to the file name string, +** e.g. "C:\\tmp\\trace.dump" +** Returns : Nothing +** =================================================================== +*/ + +#define McuPercepio_vTraceSetStopHook(stopHookFunction) \ + vTraceSetStopHook(stopHookFunction) +/* +** =================================================================== +** Method : vTraceSetStopHook (component PercepioTrace) +** +** Description : +** Sets a function to be called when the recorder is stopped. +** Parameters : +** NAME - DESCRIPTION +** stopHookFunction - +** Returns : Nothing +** =================================================================== +*/ + +#define McuPercepio_xTraceGetLastError() \ + xTraceGetLastError() +/* +** =================================================================== +** Method : xTraceGetLastError (component PercepioTrace) +** +** Description : +** Gives the last error message, if any. NULL if no error +** message is stored. Any error message is also presented when +** opening a trace file. +** Parameters : None +** Returns : +** --- - Error message +** =================================================================== +*/ + +#define McuPercepio_vTraceClearError(resetErrorMessage) \ + vTraceClearError(resetErrorMessage) +/* +** =================================================================== +** Method : vTraceClearError (component PercepioTrace) +** +** Description : +** Removes any previous error message generated by recorder +** calling vTraceError. By calling this function, it may be +** possible to start/restart the trace despite errors in the +** recorder, but there is no guarantee that the trace recorder +** will work correctly in that case, depending on the type of +** error. +** Parameters : +** NAME - DESCRIPTION +** resetErrorMessage - parameter is +** not used +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuPercepio_vTraceEnable(startOption) \ + vTraceEnable(startOption) +/* +** =================================================================== +** Method : vTraceEnable (component PercepioTrace) +** +** Description : +** +** Parameters : +** NAME - DESCRIPTION +** startoption - * TRC_START: Starts the +** tracing directly. In snapshot mode this +** allows for +** * starting the trace at any point in your +** code, assuming vTraceEnable(TRC_INIT) +** * has been called in the startup. +** * Can also be used for streaming without +** Tracealyzer control, e.g. to a local +** * flash file system (assuming such a +** "stream port", see trcStreamingPort.h). +** * +** * TRC_START_AWAIT_HOST: For streaming mode +** only. Initializes the trace recorder +** * if necessary and waits for a Start +** command from Tracealyzer ("Start Recording" +** * button). This call is intentionally +** blocking! By calling vTraceEnable with +** * this option from the startup code, you +** start tracing at this point and capture +** * the early events. +** * +** * TRC_INIT: Initializes the trace recorder, +** but does not start the tracing. +** * In snapshot mode, this must be followed +** by a vTraceEnable(TRC_START) sometime +** * later. +** Returns : Nothing +** =================================================================== +*/ + +#define McuPercepio_vTraceSetSemaphoreName(semaphore, name) \ + vTraceSetSemaphoreName(semaphore, name) +/* +** =================================================================== +** Method : vTraceSetSemaphoreName (component PercepioTrace) +** +** Description : +** Assigns a name to a FreeRTOS Queue, Semaphore or Mutex. This +** function should be called right after creation of the +** queue/mutex/semaphore. If not using this function, the +** queues/mutexes/semaphores will be presented by their numeric +** handle only. +** Parameters : +** NAME - DESCRIPTION +** * queue - Pointer to the semaphore +** * name - Pointer to name +** Returns : Nothing +** =================================================================== +*/ + +#define McuPercepio_vTraceSetMutexName(mutex, name) \ + vTraceSetMutexName(mutex, name) +/* +** =================================================================== +** Method : vTraceSetMutexName (component PercepioTrace) +** +** Description : +** Assigns a name to a FreeRTOS Queue, Semaphore or Mutex. This +** function should be called right after creation of the +** queue/mutex/semaphore. If not using this function, the +** queues/mutexes/semaphores will be presented by their numeric +** handle only. +** Parameters : +** NAME - DESCRIPTION +** * queue - Pointer to the mutex +** * name - Pointer to name +** Returns : Nothing +** =================================================================== +*/ + +void McuPercepio_Startup(void); +/* +** =================================================================== +** Method : Startup (component PercepioTrace) +** +** Description : +** Routine called during startup. Depending on the mode and +** settings, it starts tracing and might block! +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuPercepio. */ + +#endif +/* ifndef __McuPercepio_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/TraceRecorder/McuPercepioconfig.h b/TSM_PicoW_Sensor/McuLib/TraceRecorder/McuPercepioconfig.h new file mode 100644 index 0000000..87bc72a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/TraceRecorder/McuPercepioconfig.h @@ -0,0 +1,38 @@ +/** + * \file + * \brief Configuration header file for Percepio Trace for FreeRTOS + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Percepio trace. + */ + +#ifndef __McuPercepio_CONFIG_H +#define __McuPercepio_CONFIG_H + +#include "trcPortDefines.h" +#include "trcConfig.h" + +#if !defined(TRC_CFG_RECORDER_MODE) || !defined(TRC_RECORDER_MODE_SNAPSHOT) + #error "these macros are used below, but do not exist?" +#endif + +#ifndef McuPercepio_CONFIG_START_TRACE_IN_STARTUP_MODE + /* Percepio trace startup mode used for calling vTraceEnable() from Startup(): + Snapshot Mode: + TRC_INIT: Initializes trace module. Application needs to start tracing later with vTraceEnable(TRC_START); + TRC_START: Initializes and starts tracing + Streaming Mode: + TRC_INIT: Initializes trace module. Application needs to start tracing later with vTraceEnable(TRC_START); + TRC_START: Initializes and starts tracing + TRC_START_AWAIT_HOST: Initializes trace module and blocks and waits for data to be retrieved */ + #if TRC_CFG_RECORDER_MODE==TRC_RECORDER_MODE_SNAPSHOT + #define McuPercepio_CONFIG_START_TRACE_IN_STARTUP_MODE TRC_START + /*!< Trace startup for snapshot mode: TRC_INIT or TRC_START */ + #else /* streaming mode */ + #define McuPercepio_CONFIG_START_TRACE_IN_STARTUP_MODE TRC_START + /*!< Trace startup for streaming mode: TRC_INIT, TRC_START or TRC_START_AWAIT_HOST */ + #endif +#endif + +#endif /* __McuPercepio_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/TraceRecorder/config/trcConfig.h b/TSM_PicoW_Sensor/McuLib/TraceRecorder/config/trcConfig.h new file mode 100644 index 0000000..db1d7e8 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/TraceRecorder/config/trcConfig.h @@ -0,0 +1,488 @@ +/******************************************************************************* + * Trace Recorder Library for Tracealyzer v4.4.1 + * Percepio AB, www.percepio.com + * + * trcConfig.h + * + * Main configuration parameters for the trace recorder library. + * More settings can be found in trcStreamingConfig.h and trcSnapshotConfig.h. + * + * Read more at http://percepio.com/2016/10/05/rtos-tracing/ + * + * Terms of Use + * This file is part of the trace recorder library (RECORDER), which is the + * intellectual property of Percepio AB (PERCEPIO) and provided under a + * license as follows. + * The RECORDER may be used free of charge for the purpose of recording data + * intended for analysis in PERCEPIO products. It may not be used or modified + * for other purposes without explicit permission from PERCEPIO. + * You may distribute the RECORDER in its original source code form, assuming + * this text (terms of use, disclaimer, copyright notice) is unchanged. You are + * allowed to distribute the RECORDER with minor modifications intended for + * configuration or porting of the RECORDER, e.g., to allow using it on a + * specific processor, processor family or with a specific communication + * interface. Any such modifications should be documented directly below + * this comment block. + * + * Disclaimer + * The RECORDER is being delivered to you AS IS and PERCEPIO makes no warranty + * as to its use or performance. PERCEPIO does not and cannot warrant the + * performance or results you may obtain by using the RECORDER or documentation. + * PERCEPIO make no warranties, express or implied, as to noninfringement of + * third party rights, merchantability, or fitness for any particular purpose. + * In no event will PERCEPIO, its technology partners, or distributors be liable + * to you for any consequential, incidental or special damages, including any + * lost profits or lost savings, even if a representative of PERCEPIO has been + * advised of the possibility of such damages, or for any claim by any third + * party. Some jurisdictions do not allow the exclusion or limitation of + * incidental, consequential or special damages, or the exclusion of implied + * warranties or limitations on how long an implied warranty may last, so the + * above limitations may not apply to you. + * + * Tabs are used for indent in this file (1 tab = 4 spaces) + * + * Copyright Percepio AB, 2018. + * www.percepio.com + ******************************************************************************/ + +#ifndef TRC_CONFIG_H +#define TRC_CONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "trcPortDefines.h" + +/****************************************************************************** + * Include of processor header file + * + * Here you may need to include the header file for your processor. This is + * required at least for the ARM Cortex-M port, that uses the ARM CMSIS API. + * Try that in case of build problems. Otherwise, remove the #error line below. + *****************************************************************************/ +#if 1 /* << EST */ + #include "McuLib.h" /* include SDK and API used */ + #include "FreeRTOSConfig.h" + + #if McuLib_CONFIG_PEX_SDK_USED + #ifndef __CORTEX_M + #if configCPU_FAMILY_IS_ARM_M0(configCPU_FAMILY) + #define __CORTEX_M 0 + #elif configCPU_FAMILY_IS_ARM_M4(configCPU_FAMILY) + #define __CORTEX_M 4 + #elif configCPU_FAMILY_IS_ARM_M7(configCPU_FAMILY) + #define __CORTEX_M 7 + #endif + #endif + #endif +#else +#error "Trace Recorder: Please include your processor's header file here and remove this line." +#endif + +/******************************************************************************* + * Configuration Macro: TRC_CFG_HARDWARE_PORT + * + * Specify what hardware port to use (i.e., the "timestamping driver"). + * + * All ARM Cortex-M MCUs are supported by "TRC_HARDWARE_PORT_ARM_Cortex_M". + * This port uses the DWT cycle counter for Cortex-M3/M4/M7 devices, which is + * available on most such devices. In case your device don't have DWT support, + * you will get an error message opening the trace. In that case, you may + * force the recorder to use SysTick timestamping instead, using this define: + * + * #define TRC_CFG_ARM_CM_USE_SYSTICK + * + * For ARM Cortex-M0/M0+ devices, SysTick mode is used automatically. + * + * See trcHardwarePort.h for available ports and information on how to + * define your own port, if not already present. + ******************************************************************************/ +#if 1 /* << EST */ +#if configCPU_FAMILY_IS_ARM(configCPU_FAMILY) + #define TRC_CFG_HARDWARE_PORT TRC_HARDWARE_PORT_ARM_Cortex_M +#else + #define TRC_CFG_HARDWARE_PORT TRC_HARDWARE_PORT_PROCESSOR_EXPERT +#endif +#else + #define TRC_CFG_HARDWARE_PORT TRC_HARDWARE_PORT_NOT_SET +#endif + +/******************************************************************************* + * Configuration Macro: TRC_CFG_RECORDER_MODE + * + * Specify what recording mode to use. Snapshot means that the data is saved in + * an internal RAM buffer, for later upload. Streaming means that the data is + * transferred continuously to the host PC. + * + * For more information, see http://percepio.com/2016/10/05/rtos-tracing/ + * and the Tracealyzer User Manual. + * + * Values: + * TRC_RECORDER_MODE_SNAPSHOT + * TRC_RECORDER_MODE_STREAMING + ******************************************************************************/ +#define TRC_CFG_RECORDER_MODE TRC_RECORDER_MODE_STREAMING + +/****************************************************************************** + * TRC_CFG_FREERTOS_VERSION + * + * Specify what version of FreeRTOS that is used (don't change unless using the + * trace recorder library with an older version of FreeRTOS). + * + * TRC_FREERTOS_VERSION_7_3_X If using FreeRTOS v7.3.X + * TRC_FREERTOS_VERSION_7_4_X If using FreeRTOS v7.4.X + * TRC_FREERTOS_VERSION_7_5_X If using FreeRTOS v7.5.X + * TRC_FREERTOS_VERSION_7_6_X If using FreeRTOS v7.6.X + * TRC_FREERTOS_VERSION_8_X_X If using FreeRTOS v8.X.X + * TRC_FREERTOS_VERSION_9_0_0 If using FreeRTOS v9.0.0 + * TRC_FREERTOS_VERSION_9_0_1 If using FreeRTOS v9.0.1 + * TRC_FREERTOS_VERSION_9_0_2 If using FreeRTOS v9.0.2 + * TRC_FREERTOS_VERSION_10_0_0 If using FreeRTOS v10.0.0 + * TRC_FREERTOS_VERSION_10_0_1 If using FreeRTOS v10.0.1 + * TRC_FREERTOS_VERSION_10_1_0 If using FreeRTOS v10.1.0 + * TRC_FREERTOS_VERSION_10_1_1 If using FreeRTOS v10.1.1 + * TRC_FREERTOS_VERSION_10_2_0 If using FreeRTOS v10.2.0 + * TRC_FREERTOS_VERSION_10_2_1 If using FreeRTOS v10.2.1 + * TRC_FREERTOS_VERSION_10_3_0 If using FreeRTOS v10.3.0 + * TRC_FREERTOS_VERSION_10_3_1 If using FreeRTOS v10.3.1 + * TRC_FREERTOS_VERSION_10_4_0 If using FreeRTOS v10.4.0 + * TRC_FREERTOS_VERSION_10_4_1 If using FreeRTOS v10.4.1 or later + *****************************************************************************/ +#define TRC_CFG_FREERTOS_VERSION TRC_FREERTOS_VERSION_10_4_1 /* << EST */ + +/******************************************************************************* + * TRC_CFG_SCHEDULING_ONLY + * + * Macro which should be defined as an integer value. + * + * If this setting is enabled (= 1), only scheduling events are recorded. + * If disabled (= 0), all events are recorded (unless filtered in other ways). + * + * Default value is 0 (= include additional events). + ******************************************************************************/ +#define TRC_CFG_SCHEDULING_ONLY 0 + + /****************************************************************************** + * TRC_CFG_INCLUDE_MEMMANG_EVENTS + * + * Macro which should be defined as either zero (0) or one (1). + * + * This controls if malloc and free calls should be traced. Set this to zero (0) + * to exclude malloc/free calls, or one (1) to include such events in the trace. + * + * Default value is 1. + *****************************************************************************/ +#define TRC_CFG_INCLUDE_MEMMANG_EVENTS 0 + + /****************************************************************************** + * TRC_CFG_INCLUDE_USER_EVENTS + * + * Macro which should be defined as either zero (0) or one (1). + * + * If this is zero (0), all code related to User Events is excluded in order + * to reduce code size. Any attempts of storing User Events are then silently + * ignored. + * + * User Events are application-generated events, like "printf" but for the + * trace log, generated using vTracePrint and vTracePrintF. + * The formatting is done on host-side, by Tracealyzer. User Events are + * therefore much faster than a console printf and can often be used + * in timing critical code without problems. + * + * Note: In streaming mode, User Events are used to provide error messages + * and warnings from the recorder (in case of incorrect configuration) for + * display in Tracealyzer. Disabling user events will also disable these + * warnings. You can however still catch them by calling xTraceGetLastError + * or by putting breakpoints in prvTraceError and prvTraceWarning. + * + * Default value is 1. + *****************************************************************************/ +#define TRC_CFG_INCLUDE_USER_EVENTS 1 + + /***************************************************************************** + * TRC_CFG_INCLUDE_ISR_TRACING + * + * Macro which should be defined as either zero (0) or one (1). + * + * If this is zero (0), the code for recording Interrupt Service Routines is + * excluded, in order to reduce code size. This means that any calls to + * vTraceStoreISRBegin/vTraceStoreISREnd will be ignored. + * This does not completely disable ISR tracing, in cases where an ISR is + * calling a traced kernel service. These events will still be recorded and + * show up in anonymous ISR instances in Tracealyzer, with names such as + * "ISR sending to ". + * To disable such tracing, please refer to vTraceSetFilterGroup and + * vTraceSetFilterMask. + * + * Default value is 1. + * + * Note: tracing ISRs requires that you insert calls to vTraceStoreISRBegin + * and vTraceStoreISREnd in your interrupt handlers. + *****************************************************************************/ +#define TRC_CFG_INCLUDE_ISR_TRACING 1 + + /***************************************************************************** + * TRC_CFG_INCLUDE_READY_EVENTS + * + * Macro which should be defined as either zero (0) or one (1). + * + * If one (1), events are recorded when tasks enter scheduling state "ready". + * This allows Tracealyzer to show the initial pending time before tasks enter + * the execution state, and present accurate response times. + * If zero (0), "ready events" are not created, which allows for recording + * longer traces in the same amount of RAM. + * + * Default value is 1. + *****************************************************************************/ +#define TRC_CFG_INCLUDE_READY_EVENTS 1 + + /***************************************************************************** + * TRC_CFG_INCLUDE_OSTICK_EVENTS + * + * Macro which should be defined as either zero (0) or one (1). + * + * If this is one (1), events will be generated whenever the OS clock is + * increased. If zero (0), OS tick events are not generated, which allows for + * recording longer traces in the same amount of RAM. + * + * Default value is 1. + *****************************************************************************/ +#define TRC_CFG_INCLUDE_OSTICK_EVENTS 0 + + /***************************************************************************** + * TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS + * + * Macro which should be defined as either zero (0) or one (1). + * + * If this is zero (0), the trace will exclude any "event group" events. + * + * Default value is 0 (excluded) since dependent on event_groups.c + *****************************************************************************/ +#define TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS 0 + + /***************************************************************************** + * TRC_CFG_INCLUDE_TIMER_EVENTS + * + * Macro which should be defined as either zero (0) or one (1). + * + * If this is zero (0), the trace will exclude any Timer events. + * + * Default value is 0 since dependent on timers.c + *****************************************************************************/ +#define TRC_CFG_INCLUDE_TIMER_EVENTS 0 + + /***************************************************************************** + * TRC_CFG_INCLUDE_PEND_FUNC_CALL_EVENTS + * + * Macro which should be defined as either zero (0) or one (1). + * + * If this is zero (0), the trace will exclude any "pending function call" + * events, such as xTimerPendFunctionCall(). + * + * Default value is 0 since dependent on timers.c + *****************************************************************************/ +#define TRC_CFG_INCLUDE_PEND_FUNC_CALL_EVENTS 0 + +/******************************************************************************* + * Configuration Macro: TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS + * + * Macro which should be defined as either zero (0) or one (1). + * + * If this is zero (0), the trace will exclude any stream buffer or message + * buffer events. + * + * Default value is 0 since dependent on stream_buffer.c (new in FreeRTOS v10) + ******************************************************************************/ +#define TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS 0 + + /****************************************************************************** + * TRC_CFG_ENABLE_STACK_MONITOR + * + * If enabled (1), the recorder periodically reports the unused stack space of + * all active tasks. + * The stack monitoring runs in the Tracealyzer Control task, TzCtrl. This task + * is always created by the recorder when in streaming mode. + * In snapshot mode, the TzCtrl task is only used for stack monitoring and is + * not created unless this is enabled. + *****************************************************************************/ +#define TRC_CFG_ENABLE_STACK_MONITOR 1 + + /****************************************************************************** + * TRC_CFG_STACK_MONITOR_MAX_TASKS + * + * Macro which should be defined as a non-zero integer value. + * + * This controls how many tasks that can be monitored by the stack monitor. + * If this is too small, some tasks will be excluded and a warning is shown. + * + * Default value is 10. + *****************************************************************************/ +#define TRC_CFG_STACK_MONITOR_MAX_TASKS 10 + + /****************************************************************************** + * TRC_CFG_STACK_MONITOR_MAX_REPORTS + * + * Macro which should be defined as a non-zero integer value. + * + * This defines how many tasks that will be subject to stack usage analysis for + * each execution of the Tracealyzer Control task (TzCtrl). Note that the stack + * monitoring cycles between the tasks, so this does not affect WHICH tasks that + * are monitored, but HOW OFTEN each task stack is analyzed. + * + * This setting can be combined with TRC_CFG_CTRL_TASK_DELAY to tune the + * frequency of the stack monitoring. This is motivated since the stack analysis + * can take some time to execute. + * However, note that the stack analysis runs in a separate task (TzCtrl) that + * can be executed on low priority. This way, you can avoid that the stack + * analysis disturbs any time-sensitive tasks. + * + * Default value is 1. + *****************************************************************************/ +#define TRC_CFG_STACK_MONITOR_MAX_REPORTS 1 + + /******************************************************************************* + * Configuration Macro: TRC_CFG_CTRL_TASK_PRIORITY + * + * The scheduling priority of the Tracealyzer Control (TzCtrl) task. + * + * In streaming mode, TzCtrl is used to receive start/stop commands from + * Tracealyzer and in some cases also to transmit the trace data (for stream + * ports that uses the internal buffer, like TCP/IP). For such stream ports, + * make sure the TzCtrl priority is high enough to ensure reliable periodic + * execution and transfer of the data, but low enough to avoid disturbing any + * time-sensitive functions. + * + * In Snapshot mode, TzCtrl is only used for the stack usage monitoring and is + * not created if stack monitoring is disabled. TRC_CFG_CTRL_TASK_PRIORITY should + * be low, to avoid disturbing any time-sensitive tasks. + ******************************************************************************/ +#define TRC_CFG_CTRL_TASK_PRIORITY 1 + + /******************************************************************************* + * Configuration Macro: TRC_CFG_CTRL_TASK_DELAY + * + * The delay between loops of the TzCtrl task (see TRC_CFG_CTRL_TASK_PRIORITY), + * which affects the frequency of the stack monitoring. + * + * In streaming mode, this also affects the trace data transfer if you are using + * a stream port leveraging the internal buffer (like TCP/IP). A shorter delay + * increases the CPU load of TzCtrl somewhat, but may improve the performance of + * of the trace streaming, especially if the trace buffer is small. + ******************************************************************************/ +#define TRC_CFG_CTRL_TASK_DELAY 10 + + /******************************************************************************* + * Configuration Macro: TRC_CFG_CTRL_TASK_STACK_SIZE + * + * The stack size of the Tracealyzer Control (TzCtrl) task. + * See TRC_CFG_CTRL_TASK_PRIORITY for further information about TzCtrl. + ******************************************************************************/ +#define TRC_CFG_CTRL_TASK_STACK_SIZE (configMINIMAL_STACK_SIZE * 2) + +/******************************************************************************* + * Configuration Macro: TRC_CFG_RECORDER_BUFFER_ALLOCATION + * + * Specifies how the recorder buffer is allocated (also in case of streaming, in + * port using the recorder's internal temporary buffer) + * + * Values: + * TRC_RECORDER_BUFFER_ALLOCATION_STATIC - Static allocation (internal) + * TRC_RECORDER_BUFFER_ALLOCATION_DYNAMIC - Malloc in vTraceEnable + * TRC_RECORDER_BUFFER_ALLOCATION_CUSTOM - Use vTraceSetRecorderDataBuffer + * + * Static and dynamic mode does the allocation for you, either in compile time + * (static) or in runtime (malloc). + * The custom mode allows you to control how and where the allocation is made, + * for details see TRC_ALLOC_CUSTOM_BUFFER and vTraceSetRecorderDataBuffer(). + ******************************************************************************/ +#define TRC_CFG_RECORDER_BUFFER_ALLOCATION TRC_RECORDER_BUFFER_ALLOCATION_STATIC + +/****************************************************************************** + * TRC_CFG_MAX_ISR_NESTING + * + * Defines how many levels of interrupt nesting the recorder can handle, in + * case multiple ISRs are traced and ISR nesting is possible. If this + * is exceeded, the particular ISR will not be traced and the recorder then + * logs an error message. This setting is used to allocate an internal stack + * for keeping track of the previous execution context (4 byte per entry). + * + * This value must be a non-zero positive constant, at least 1. + * + * Default value: 8 + *****************************************************************************/ +#define TRC_CFG_MAX_ISR_NESTING 16 + +/****************************************************************************** + * TRC_CFG_ACKNOWLEDGE_QUEUE_SET_SEND + * + * When using FreeRTOS v10.3.0 or v10.3.1, please make sure that the trace + * point in prvNotifyQueueSetContainer() in queue.c is renamed from + * traceQUEUE_SEND to traceQUEUE_SET_SEND in order to tell them apart from + * other traceQUEUE_SEND trace points. Then set this to TRC_ACKNOWLEDGED. + *****************************************************************************/ +#define TRC_CFG_ACKNOWLEDGE_QUEUE_SET_SEND 0 /* TRC_ACKNOWLEDGED */ + +/* Specific configuration, depending on Streaming/Snapshot mode */ +#if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_SNAPSHOT) +#include "trcSnapshotConfig.h" +#elif (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) +#include "trcStreamingConfig.h" +#endif + +/* << EST: additional configuration item */ +/****************************************************************************** + * TRC_CFG_TRACE_DESCRIPTION + * + * Macro which should be defined as a string. + * + * This string is stored in the trace and displayed in Tracealyzer. Can be + * used to store, e.g., system version or build date. This is also used to store + * internal error messages from the recorder, which if occurs overwrites the + * value defined here. This may be maximum 256 chars. + *****************************************************************************/ +#define TRC_CFG_TRACE_DESCRIPTION "FreeRTOS+Trace" + +/* << EST: additional configuration item */ +/****************************************************************************** + * TRC_CFG_TRACE_DESCRIPTION_MAX_LENGTH + * + * The maximum length (including zero termination) for the TRC_CFG_TRACE_DESCRIPTION + * string. Since this string also is used for internal error messages from the + * recorder do not make it too short, as this may truncate the error messages. + * Default is 80. + * Maximum allowed length is 256 - the trace will fail to load if longer. + *****************************************************************************/ +#define TRC_CFG_TRACE_DESCRIPTION_MAX_LENGTH 80 + +/****************************************************************************** + * TRC_CFG_INCLUDE_OBJECT_DELETE + * + * Macro which should be defined as either zero (0) or one (1). + * + * This must be enabled (1) if tasks, queues or other + * traced kernel objects are deleted at runtime. If no deletes are made, this + * can be set to 0 in order to exclude the delete-handling code. + * + * Default value is 1. + *****************************************************************************/ +#define TRC_CFG_INCLUDE_OBJECT_DELETE 1 + +/****************************************************************************** + * TRC_CFG_INCLUDE_QUEUE_EVENTS + * + * Macro which should be defined as either zero (0) or one (1). + * + * This must be enabled (1) for recording queue events. + * + * Default value is 1. + *****************************************************************************/ +#define TRC_CFG_INCLUDE_QUEUE_EVENTS 1 +/* << EST: end additional configuration item */ + +#ifdef __cplusplus +} +#endif + +#endif /* _TRC_CONFIG_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/TraceRecorder/config/trcSnapshotConfig.h b/TSM_PicoW_Sensor/McuLib/TraceRecorder/config/trcSnapshotConfig.h new file mode 100644 index 0000000..d5ee225 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/TraceRecorder/config/trcSnapshotConfig.h @@ -0,0 +1,378 @@ +/******************************************************************************* + * Trace Recorder Library for Tracealyzer v4.4.1 + * Percepio AB, www.percepio.com + * + * trcSnapshotConfig.h + * + * Configuration parameters for trace recorder library in snapshot mode. + * Read more at http://percepio.com/2016/10/05/rtos-tracing/ + * + * Terms of Use + * This file is part of the trace recorder library (RECORDER), which is the + * intellectual property of Percepio AB (PERCEPIO) and provided under a + * license as follows. + * The RECORDER may be used free of charge for the purpose of recording data + * intended for analysis in PERCEPIO products. It may not be used or modified + * for other purposes without explicit permission from PERCEPIO. + * You may distribute the RECORDER in its original source code form, assuming + * this text (terms of use, disclaimer, copyright notice) is unchanged. You are + * allowed to distribute the RECORDER with minor modifications intended for + * configuration or porting of the RECORDER, e.g., to allow using it on a + * specific processor, processor family or with a specific communication + * interface. Any such modifications should be documented directly below + * this comment block. + * + * Disclaimer + * The RECORDER is being delivered to you AS IS and PERCEPIO makes no warranty + * as to its use or performance. PERCEPIO does not and cannot warrant the + * performance or results you may obtain by using the RECORDER or documentation. + * PERCEPIO make no warranties, express or implied, as to noninfringement of + * third party rights, merchantability, or fitness for any particular purpose. + * In no event will PERCEPIO, its technology partners, or distributors be liable + * to you for any consequential, incidental or special damages, including any + * lost profits or lost savings, even if a representative of PERCEPIO has been + * advised of the possibility of such damages, or for any claim by any third + * party. Some jurisdictions do not allow the exclusion or limitation of + * incidental, consequential or special damages, or the exclusion of implied + * warranties or limitations on how long an implied warranty may last, so the + * above limitations may not apply to you. + * + * Tabs are used for indent in this file (1 tab = 4 spaces) + * + * Copyright Percepio AB, 2018. + * www.percepio.com + ******************************************************************************/ + +#ifndef TRC_SNAPSHOT_CONFIG_H +#define TRC_SNAPSHOT_CONFIG_H + +#define TRC_SNAPSHOT_MODE_RING_BUFFER (0x01) +#define TRC_SNAPSHOT_MODE_STOP_WHEN_FULL (0x02) + +/****************************************************************************** + * TRC_CFG_SNAPSHOT_MODE + * + * Macro which should be defined as one of: + * - TRC_SNAPSHOT_MODE_RING_BUFFER + * - TRC_SNAPSHOT_MODE_STOP_WHEN_FULL + * Default is TRC_SNAPSHOT_MODE_RING_BUFFER. + * + * With TRC_CFG_SNAPSHOT_MODE set to TRC_SNAPSHOT_MODE_RING_BUFFER, the + * events are stored in a ring buffer, i.e., where the oldest events are + * overwritten when the buffer becomes full. This allows you to get the last + * events leading up to an interesting state, e.g., an error, without having + * to store the whole run since startup. + * + * When TRC_CFG_SNAPSHOT_MODE is TRC_SNAPSHOT_MODE_STOP_WHEN_FULL, the + * recording is stopped when the buffer becomes full. This is useful for + * recording events following a specific state, e.g., the startup sequence. + *****************************************************************************/ +#define TRC_CFG_SNAPSHOT_MODE TRC_SNAPSHOT_MODE_RING_BUFFER + +/******************************************************************************* + * TRC_CFG_EVENT_BUFFER_SIZE + * + * Macro which should be defined as an integer value. + * + * This defines the capacity of the event buffer, i.e., the number of records + * it may store. Most events use one record (4 byte), although some events + * require multiple 4-byte records. You should adjust this to the amount of RAM + * available in the target system. + * + * Default value is 1000, which means that 4000 bytes is allocated for the + * event buffer. + ******************************************************************************/ +#define TRC_CFG_EVENT_BUFFER_SIZE 1000 + +/******************************************************************************* + * TRC_CFG_NTASK, TRC_CFG_NISR, TRC_CFG_NQUEUE, TRC_CFG_NSEMAPHORE... + * + * A group of macros which should be defined as integer values, zero or larger. + * + * These define the capacity of the Object Property Table, i.e., the maximum + * number of objects active at any given point, within each object class (e.g., + * task, queue, semaphore, ...). + * + * If tasks or other objects are deleted in your system, this + * setting does not limit the total amount of objects created, only the number + * of objects that have been successfully created but not yet deleted. + * + * Using too small values will cause vTraceError to be called, which stores an + * error message in the trace that is shown when opening the trace file. The + * error message can also be retrieved using xTraceGetLastError. + * + * It can be wise to start with large values for these constants, + * unless you are very confident on these numbers. Then do a recording and + * check the actual usage by selecting View menu -> Trace Details -> + * Resource Usage -> Object Table. + ******************************************************************************/ +#define TRC_CFG_NTASK 15 +#define TRC_CFG_NISR 5 +#define TRC_CFG_NQUEUE 10 +#define TRC_CFG_NSEMAPHORE 10 +#define TRC_CFG_NMUTEX 10 +#define TRC_CFG_NTIMER 5 +#define TRC_CFG_NEVENTGROUP 5 +#define TRC_CFG_NSTREAMBUFFER 5 +#define TRC_CFG_NMESSAGEBUFFER 5 + +/****************************************************************************** + * TRC_CFG_INCLUDE_FLOAT_SUPPORT + * + * Macro which should be defined as either zero (0) or one (1). + * + * If this is zero (0), the support for logging floating point values in + * vTracePrintF is stripped out, in case floating point values are not used or + * supported by the platform used. + * + * Floating point values are only used in vTracePrintF and its subroutines, to + * allow for storing float (%f) or double (%lf) arguments. + * + * vTracePrintF can be used with integer and string arguments in either case. + * + * Default value is 0. + *****************************************************************************/ +#define TRC_CFG_INCLUDE_FLOAT_SUPPORT 0 + +/******************************************************************************* + * TRC_CFG_SYMBOL_TABLE_SIZE + * + * Macro which should be defined as an integer value. + * + * This defines the capacity of the symbol table, in bytes. This symbol table + * stores User Events labels and names of deleted tasks, queues, or other kernel + * objects. If you don't use User Events or delete any kernel + * objects you set this to a very low value. The minimum recommended value is 4. + * A size of zero (0) is not allowed since a zero-sized array may result in a + * 32-bit pointer, i.e., using 4 bytes rather than 0. + * + * Default value is 800. + ******************************************************************************/ +#define TRC_CFG_SYMBOL_TABLE_SIZE 800 + +#if (TRC_CFG_SYMBOL_TABLE_SIZE == 0) +#error "TRC_CFG_SYMBOL_TABLE_SIZE may not be zero!" +#endif + +/****************************************************************************** + * TRC_CFG_NAME_LEN_TASK, TRC_CFG_NAME_LEN_QUEUE, ... + * + * Macros that specify the maximum lengths (number of characters) for names of + * kernel objects, such as tasks and queues. If longer names are used, they will + * be truncated when stored in the recorder. + *****************************************************************************/ +#define TRC_CFG_NAME_LEN_TASK 15 +#define TRC_CFG_NAME_LEN_ISR 15 +#define TRC_CFG_NAME_LEN_QUEUE 15 +#define TRC_CFG_NAME_LEN_SEMAPHORE 15 +#define TRC_CFG_NAME_LEN_MUTEX 15 +#define TRC_CFG_NAME_LEN_TIMER 15 +#define TRC_CFG_NAME_LEN_EVENTGROUP 15 +#define TRC_CFG_NAME_LEN_STREAMBUFFER 15 +#define TRC_CFG_NAME_LEN_MESSAGEBUFFER 15 + +/****************************************************************************** + *** ADVANCED SETTINGS ******************************************************** + ****************************************************************************** + * The remaining settings are not necessary to modify but allows for optimizing + * the recorder setup for your specific needs, e.g., to exclude events that you + * are not interested in, in order to get longer traces. + *****************************************************************************/ + +/****************************************************************************** +* TRC_CFG_HEAP_SIZE_BELOW_16M +* +* An integer constant that can be used to reduce the buffer usage of memory +* allocation events (malloc/free). This value should be 1 if the heap size is +* below 16 MB (2^24 byte), and you can live with reported addresses showing the +* lower 24 bits only. If 0, you get the full 32-bit addresses. +* +* Default value is 0. +******************************************************************************/ +#define TRC_CFG_HEAP_SIZE_BELOW_16M 0 + +/****************************************************************************** + * TRC_CFG_USE_IMPLICIT_IFE_RULES + * + * Macro which should be defined as either zero (0) or one (1). + * Default is 1. + * + * Tracealyzer groups the events into "instances" based on Instance Finish + * Events (IFEs), produced either by default rules or calls to the recorder + * functions vTraceInstanceFinishedNow and vTraceInstanceFinishedNext. + * + * If TRC_CFG_USE_IMPLICIT_IFE_RULES is one (1), the default IFE rules is + * used, resulting in a "typical" grouping of events into instances. + * If these rules don't give appropriate instances in your case, you can + * override the default rules using vTraceInstanceFinishedNow/Next for one + * or several tasks. The default IFE rules are then disabled for those tasks. + * + * If TRC_CFG_USE_IMPLICIT_IFE_RULES is zero (0), the implicit IFE rules are + * disabled globally. You must then call vTraceInstanceFinishedNow or + * vTraceInstanceFinishedNext to manually group the events into instances, + * otherwise the tasks will appear a single long instance. + * + * The default IFE rules count the following events as "instance finished": + * - Task delay, delay until + * - Task suspend + * - Blocking on "input" operations, i.e., when the task is waiting for the + * next a message/signal/event. But only if this event is blocking. + * + * For details, see trcSnapshotKernelPort.h and look for references to the + * macro trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED. + *****************************************************************************/ +#define TRC_CFG_USE_IMPLICIT_IFE_RULES 1 + +/****************************************************************************** + * TRC_CFG_USE_16BIT_OBJECT_HANDLES + * + * Macro which should be defined as either zero (0) or one (1). + * + * If set to 0 (zero), the recorder uses 8-bit handles to identify kernel + * objects such as tasks and queues. This limits the supported number of + * concurrently active objects to 255 of each type (tasks, queues, mutexes, + * etc.) Note: 255, not 256, since handle 0 is reserved. + * + * If set to 1 (one), the recorder uses 16-bit handles to identify kernel + * objects such as tasks and queues. This limits the supported number of + * concurrent objects to 65535 of each type (object class). However, since the + * object property table is limited to 64 KB, the practical limit is about + * 3000 objects in total. + * + * Default is 0 (8-bit handles) + * + * NOTE: An object with handle above 255 will use an extra 4-byte record in + * the event buffer whenever the object is referenced. Moreover, some internal + * tables in the recorder gets slightly larger when using 16-bit handles. + *****************************************************************************/ +#define TRC_CFG_USE_16BIT_OBJECT_HANDLES 0 + +/****************************************************************************** + * TRC_CFG_USE_TRACE_ASSERT + * + * Macro which should be defined as either zero (0) or one (1). + * Default is 1. + * + * If this is one (1), the TRACE_ASSERT macro (used at various locations in the + * trace recorder) will verify that a relevant condition is true. + * If the condition is false, prvTraceError() will be called, which stops the + * recording and stores an error message that is displayed when opening the + * trace in Tracealyzer. + * + * This is used on several places in the recorder code for sanity checks on + * parameters. Can be switched off to reduce the footprint of the tracing, but + * we recommend to have it enabled initially. + *****************************************************************************/ +#define TRC_CFG_USE_TRACE_ASSERT 1 + +/******************************************************************************* + * TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER + * + * Macro which should be defined as an integer value. + * + * Set TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER to 1 to enable the + * separate user event buffer (UB). + * In this mode, user events are stored separately from other events, + * e.g., RTOS events. Thereby you can get a much longer history of + * user events as they don't need to share the buffer space with more + * frequent events. + * + * The UB is typically used with the snapshot ring-buffer mode, so the + * recording can continue when the main buffer gets full. And since the + * main buffer then overwrites the earliest events, Tracealyzer displays + * "Unknown Actor" instead of task scheduling for periods with UB data only. + * + * In UB mode, user events are structured as UB channels, which contains + * a channel name and a default format string. Register a UB channel using + * xTraceRegisterUBChannel. + * + * Events and data arguments are written using vTraceUBEvent and + * vTraceUBData. They are designed to provide efficient logging of + * repeating events, using the same format string within each channel. + * + * Examples: + * + * traceString chn1 = xTraceRegisterString("Channel 1"); + * traceString fmt1 = xTraceRegisterString("Event!"); + * traceUBChannel UBCh1 = xTraceRegisterUBChannel(chn1, fmt1); + * + * traceString chn2 = xTraceRegisterString("Channel 2"); + * traceString fmt2 = xTraceRegisterString("X: %d, Y: %d"); + * traceUBChannel UBCh2 = xTraceRegisterUBChannel(chn2, fmt2); + * + * // Result in "[Channel 1] Event!" + * vTraceUBEvent(UBCh1); + * + * // Result in "[Channel 2] X: 23, Y: 19" + * vTraceUBData(UBCh2, 23, 19); + * + * You can also use the other user event functions, like vTracePrintF. + * as they are then rerouted to the UB instead of the main event buffer. + * vTracePrintF then looks up the correct UB channel based on the + * provided channel name and format string, or creates a new UB channel + * if no match is found. The format string should therefore not contain + * "random" messages but mainly format specifiers. Random strings should + * be stored using %s and with the string as an argument. + * + * // Creates a new UB channel ("Channel 2", "%Z: %d") + * vTracePrintF(chn2, "%Z: %d", value1); + * + * // Finds the existing UB channel + * vTracePrintF(chn2, "%Z: %d", value2); + + ******************************************************************************/ +#define TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER 0 + +/******************************************************************************* + * TRC_CFG_SEPARATE_USER_EVENT_BUFFER_SIZE + * + * Macro which should be defined as an integer value. + * + * This defines the capacity of the user event buffer (UB), in number of slots. + * A single user event can use multiple slots, depending on the arguments. + * + * Only applicable if TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER is 1. + ******************************************************************************/ +#define TRC_CFG_SEPARATE_USER_EVENT_BUFFER_SIZE 200 + +/******************************************************************************* + * TRC_CFG_UB_CHANNELS + * + * Macro which should be defined as an integer value. + * + * This defines the number of User Event Buffer Channels (UB channels). + * These are used to structure the events when using the separate user + * event buffer, and contains both a User Event Channel (the name) and + * a default format string for the channel. + * + * Only applicable if TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER is 1. + ******************************************************************************/ +#define TRC_CFG_UB_CHANNELS 32 + +/******************************************************************************* + * TRC_CFG_ISR_TAILCHAINING_THRESHOLD + * + * Macro which should be defined as an integer value. + * + * If tracing multiple ISRs, this setting allows for accurate display of the + * context-switching also in cases when the ISRs execute in direct sequence. + * + * vTraceStoreISREnd normally assumes that the ISR returns to the previous + * context, i.e., a task or a preempted ISR. But if another traced ISR + * executes in direct sequence, Tracealyzer may incorrectly display a minimal + * fragment of the previous context in between the ISRs. + * + * By using TRC_CFG_ISR_TAILCHAINING_THRESHOLD you can avoid this. This is + * however a threshold value that must be measured for your specific setup. + * See http://percepio.com/2014/03/21/isr_tailchaining_threshold/ + * + * The default setting is 0, meaning "disabled" and that you may get an + * extra fragments of the previous context in between tail-chained ISRs. + * + * Note: This setting has separate definitions in trcSnapshotConfig.h and + * trcStreamingConfig.h, since it is affected by the recorder mode. + ******************************************************************************/ +#define TRC_CFG_ISR_TAILCHAINING_THRESHOLD 0 + +#endif /*TRC_SNAPSHOT_CONFIG_H*/ + diff --git a/TSM_PicoW_Sensor/McuLib/TraceRecorder/config/trcStreamingConfig.h b/TSM_PicoW_Sensor/McuLib/TraceRecorder/config/trcStreamingConfig.h new file mode 100644 index 0000000..0c2648a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/TraceRecorder/config/trcStreamingConfig.h @@ -0,0 +1,145 @@ +/******************************************************************************* + * Trace Recorder Library for Tracealyzer v4.4.1 + * Percepio AB, www.percepio.com + * + * trcStreamingConfig.h + * + * Configuration parameters for the trace recorder library in streaming mode. + * Read more at http://percepio.com/2016/10/05/rtos-tracing/ + * + * Terms of Use + * This file is part of the trace recorder library (RECORDER), which is the + * intellectual property of Percepio AB (PERCEPIO) and provided under a + * license as follows. + * The RECORDER may be used free of charge for the purpose of recording data + * intended for analysis in PERCEPIO products. It may not be used or modified + * for other purposes without explicit permission from PERCEPIO. + * You may distribute the RECORDER in its original source code form, assuming + * this text (terms of use, disclaimer, copyright notice) is unchanged. You are + * allowed to distribute the RECORDER with minor modifications intended for + * configuration or porting of the RECORDER, e.g., to allow using it on a + * specific processor, processor family or with a specific communication + * interface. Any such modifications should be documented directly below + * this comment block. + * + * Disclaimer + * The RECORDER is being delivered to you AS IS and PERCEPIO makes no warranty + * as to its use or performance. PERCEPIO does not and cannot warrant the + * performance or results you may obtain by using the RECORDER or documentation. + * PERCEPIO make no warranties, express or implied, as to noninfringement of + * third party rights, merchantability, or fitness for any particular purpose. + * In no event will PERCEPIO, its technology partners, or distributors be liable + * to you for any consequential, incidental or special damages, including any + * lost profits or lost savings, even if a representative of PERCEPIO has been + * advised of the possibility of such damages, or for any claim by any third + * party. Some jurisdictions do not allow the exclusion or limitation of + * incidental, consequential or special damages, or the exclusion of implied + * warranties or limitations on how long an implied warranty may last, so the + * above limitations may not apply to you. + * + * Tabs are used for indent in this file (1 tab = 4 spaces) + * + * Copyright Percepio AB, 2018. + * www.percepio.com + ******************************************************************************/ + +#ifndef TRC_STREAMING_CONFIG_H +#define TRC_STREAMING_CONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************* + * Configuration Macro: TRC_CFG_SYMBOL_TABLE_SLOTS + * + * The maximum number of symbols names that can be stored. This includes: + * - Task names + * - Named ISRs (vTraceSetISRProperties) + * - Named kernel objects (vTraceStoreKernelObjectName) + * - User event channels (xTraceRegisterString) + * + * If this value is too small, not all symbol names will be stored and the + * trace display will be affected. In that case, there will be warnings + * (as User Events) from TzCtrl task, that monitors this. + ******************************************************************************/ +#define TRC_CFG_SYMBOL_TABLE_SLOTS 40 + +/******************************************************************************* + * Configuration Macro: TRC_CFG_SYMBOL_MAX_LENGTH + * + * The maximum length of symbol names, including: + * - Task names + * - Named ISRs (vTraceSetISRProperties) + * - Named kernel objects (vTraceStoreKernelObjectName) + * - User event channel names (xTraceRegisterString) + * + * If longer symbol names are used, they will be truncated by the recorder, + * which will affect the trace display. In that case, there will be warnings + * (as User Events) from TzCtrl task, that monitors this. + ******************************************************************************/ +#define TRC_CFG_SYMBOL_MAX_LENGTH 25 + +/******************************************************************************* + * Configuration Macro: TRC_CFG_OBJECT_DATA_SLOTS + * + * The maximum number of object data entries (used for task priorities) that can + * be stored at the same time. Must be sufficient for all tasks, otherwise there + * will be warnings (as User Events) from TzCtrl task, that monitors this. + ******************************************************************************/ +#define TRC_CFG_OBJECT_DATA_SLOTS 40 + +/******************************************************************************* + * Configuration Macro: TRC_CFG_PAGED_EVENT_BUFFER_PAGE_COUNT + * + * Specifies the number of pages used by the paged event buffer. + * This may need to be increased if there are a lot of missed events. + * + * Note: not used by the J-Link RTT stream port (see trcStreamingPort.h instead) + ******************************************************************************/ +#define TRC_CFG_PAGED_EVENT_BUFFER_PAGE_COUNT 10 + +/******************************************************************************* + * Configuration Macro: TRC_CFG_PAGED_EVENT_BUFFER_PAGE_SIZE + * + * Specifies the size of each page in the paged event buffer. This can be tuned + * to match any internal low-level buffers used by the streaming interface, like + * the Ethernet MTU (Maximum Transmission Unit). However, since the currently + * active page can't be transfered, having more but smaller pages is more + * efficient with respect memory usage, than having a few large pages. + * + * Note: not used by the J-Link RTT stream port (see trcStreamingPort.h instead) + ******************************************************************************/ +#define TRC_CFG_PAGED_EVENT_BUFFER_PAGE_SIZE 500 + +/******************************************************************************* + * TRC_CFG_ISR_TAILCHAINING_THRESHOLD + * + * Macro which should be defined as an integer value. + * + * If tracing multiple ISRs, this setting allows for accurate display of the + * context-switching also in cases when the ISRs execute in direct sequence. + * + * vTraceStoreISREnd normally assumes that the ISR returns to the previous + * context, i.e., a task or a preempted ISR. But if another traced ISR + * executes in direct sequence, Tracealyzer may incorrectly display a minimal + * fragment of the previous context in between the ISRs. + * + * By using TRC_CFG_ISR_TAILCHAINING_THRESHOLD you can avoid this. This is + * however a threshold value that must be measured for your specific setup. + * See http://percepio.com/2014/03/21/isr_tailchaining_threshold/ + * + * The default setting is 0, meaning "disabled" and that you may get an + * extra fragments of the previous context in between tail-chained ISRs. + * + * Note: This setting has separate definitions in trcSnapshotConfig.h and + * trcStreamingConfig.h, since it is affected by the recorder mode. + ******************************************************************************/ +#define TRC_CFG_ISR_TAILCHAINING_THRESHOLD 0 + +#ifdef __cplusplus +} +#endif + +#endif /* TRC_STREAMING_CONFIG_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/TraceRecorder/include/trcExtensions.h b/TSM_PicoW_Sensor/McuLib/TraceRecorder/include/trcExtensions.h new file mode 100644 index 0000000..1fd8731 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/TraceRecorder/include/trcExtensions.h @@ -0,0 +1,422 @@ +/******************************************************************************* + * Trace Recorder Library for Tracealyzer v4.4.1 + * Percepio AB, www.percepio.com + * + * trcExtensions.h + * + * The extension interface of the recorder library, allowing for tracing + * function calls to any API without modifications. All that is needed is a + * single #include line in the .c files calling the API. + * + * This can be used to provide more detailed traces, including calls to e.g. + * middleware, drivers or important APIs in your application code. This can be + * applied selectively to specified functions and may include selected + * parameters as well as the return value. + * + * Unlike the "User Event" concept, an extension is intended for systematic use + * and can benefit from all powerful features in Tracealyzer via host-side XML + * files that configure how Tracealyzer should interpret each event. + * + * Extensions are self-contained and easy to integrate, which makes them + * convenient for distribution. Software vendors can thus develop such + * extensions and provide trace support for their users. + * + * An extension consists of two files: + * + * - An extension header file (e.g. "api.tzext.h") - this defines how to + * trace the API function calls. + * + * - An XML file for the Tracealyzer application (e.g. "api-v1.0.0.xml"). + * This needs to match the tracing setup in your extension header file. + * + * + * USAGE + * + * This description assumes you already have the extension files for the APIs you + * like to trace. To include them, follow these steps: + * + * 1. Update trcExtensions.h with respect to: + * + * 1.1. TRC_CFG_EXTENSION_COUNT: The number of extensions to enable (max 4). + * + * 1.2. The name(s) of the extension header file(s) to include. + * + * 1.3. The Extension Prefix, i.e., the first part of the definition names + * used in each header file. + * + * 2. Add #include "trcExtensions.h" in all .c files calling the API: + * + * #include ... + * #include "api.h" // The API you like to trace + * #include ... + * #include "trcExtensions.h" + * + * We recommend to put this as the LAST #include statement. + * + * HOWEVER, don't include "trcExtensions.h" in the .c files containing the + * functions you intend to trace. The compiler will then complain about + * multiple definitions of the trace wrapper function. + * + * 3. Copy the extension XML file to the "Tracealyzer 4/cfg" folder. + * On Windows this is typically + * + * C:\Program Files\Percepio\Tracealyzer 4\cfg + * + * + * HOW IT WORKS + * + * By including "trcExtensions.h" in your .c files, the preprocessor will + * redefine all calls of the functions specified in the extension header file. + * Calls to those functions will now instead call the "trace wrapper functions" + * defined in the extension header. The trace wrapper functions then call the + * original function as well as the trace recorder library. + * + * call foo(a) ----> foo__trace(a) -----> foo(a) + * -----> trace recorder library + * + * Note that the trace wrapper function should have the same declaration as the + * original function (apart from the name) and also returns any return value + * back to the original caller. So functionally this is completely transparent. + * + * This works also for calls via function pointers, as the assignments of the + * function pointers will be affected, so the function pointers will point to + * the trace wrapper function. + * + * It even works when calling binary libraries, since only the calling code + * is modified, not the API itself. + * + * Extensions include a version code (Major.Minor.Patch), which is registered + * in the trace and also part of the XML file name. This way, Tracealyzer + * automatically finds the matching XML file, even if you open a old trace + * recorded using a earlier version of the extension (e.g. if the API has + * changed). + * + * LIMITATIONS + * + * The main limitation of this automatic approach is that it only allows for + * tracing call between different .c files. Moreover, you can't trace multiple + * APIs with calls between them. This since the calling file must include + * trcExtensions.h, while the called file must NOT include this. + * + * It is however possible to get around this limitation. You need to add + * #undef lines for each affected function to locally disable the redefinition, + * and modify each function call to instead call the trace wrapper function. + * + * #include "trcExtensions.h" + * #undef foo + * ... + * void foo(int a) + * { + * ... + * } + * ... + * foo__trace(a); // in another function - call foo and trace it + * + * These changes can remain in your code if you like, as the trace wrappers + * works even if the recorder is disabled. + * + * MAKING YOUR OWN EXTENSIONS + * + * Examples are found in the extensions directory. We recommend that you start + * by looking at aws_secure_sockets files (.h and .xml) that provides a basic + * example. The aws_wifi files provides a more advanced example. + * The header files include detailed documentation about how to design them, + * + * The XML files should have the same name as specified in the NAME property + * in the header file, followed by the version, i.e. + * + * -v.<..xml + * + * Documentation for the XML file format is not yet available, but is under + * development. + * + * + * Terms of Use + * This file is part of the trace recorder library (RECORDER), which is the + * intellectual property of Percepio AB (PERCEPIO) and provided under a + * license as follows. + * The RECORDER may be used free of charge for the purpose of recording data + * intended for analysis in PERCEPIO products. It may not be used or modified + * for other purposes without explicit permission from PERCEPIO. + * You may distribute the RECORDER in its original source code form, assuming + * this text (terms of use, disclaimer, copyright notice) is unchanged. You are + * allowed to distribute the RECORDER with minor modifications intended for + * configuration or porting of the RECORDER, e.g., to allow using it on a + * specific processor, processor family or with a specific communication + * interface. Any such modifications should be documented directly below + * this comment block. + * + * Disclaimer + * The RECORDER is being delivered to you AS IS and PERCEPIO makes no warranty + * as to its use or performance. PERCEPIO does not and cannot warrant the + * performance or results you may obtain by using the RECORDER or documentation. + * PERCEPIO make no warranties, express or implied, as to noninfringement of + * third party rights, merchantability, or fitness for any particular purpose. + * In no event will PERCEPIO, its technology partners, or distributors be liable + * to you for any consequential, incidental or special damages, including any + * lost profits or lost savings, even if a representative of PERCEPIO has been + * advised of the possibility of such damages, or for any claim by any third + * party. Some jurisdictions do not allow the exclusion or limitation of + * incidental, consequential or special damages, or the exclusion of implied + * warranties or limitations on how long an implied warranty may last, so the + * above limitations may not apply to you. + * + * Tabs are used for indent in this file (1 tab = 4 spaces) + * + * Copyright Percepio AB, 2018. + * www.percepio.com + ******************************************************************************/ + +#ifndef TRCEXTENSIONS_H_ +#define TRCEXTENSIONS_H_ + +#include "trcRecorder.h" + +/****************************************************************************** + * TRC_CFG_EXTENSION_COUNT + * + * Defines the number of extensions included in the trace. Maximum 4 extensions + * can be included. + * + * Default value is 0 (extension support disabled). + * + *****************************************************************************/ +#define TRC_CFG_EXTENSION_COUNT 0 + +/****************************************************************************** + * TRC_CFG_EXT_MAX_NAME_LEN + * + * Defines the maximum length of extension name(s), i.e. the _NAME + * macro(s) in trcExtensions.h. + * + * This value should will by rounded up to the nearest multiple of 4, and must + * not be zero. To disable extension support, see TRC_CFG_EXTENSION_COUNT. + * + * It is important that this setting is large enough so extension names are + * not truncated, otherwise the host-side Tracealyzer application won't be able + * to find the corresponding XML file. + * + * You may adjust this to reduce memory usage, or increase it to allow for + * longer extension names. + * + * Default value is 20. + *****************************************************************************/ +#define TRC_CFG_EXT_MAX_NAME_LEN 20 + +/****************************************************************************** + * TRC_EXTENSION_EVENTCODE_BASE + * + * The first event code used for the Extension system. This will be the first + * event code of the first extension, and other event codes are relative to + * this. This can be modified but this is normally not required. + *****************************************************************************/ +#define TRC_EXTENSION_EVENTCODE_BASE 256 + +/*** Included Extensions ****************************************************** + * + * Below you specify what extensions to include. For each + * extension you must define: + * + * - HEADER: The header file that defines the trace extension. + * + * - EXTENSION_PREFIX: The first part of the HEADER definition names. + * + *****************************************************************************/ +#define TRC_EXT1_HEADER "aws_secure_sockets.tzext.h" +#define TRC_EXT1_PREFIX TRC_EXT_SOCKETS + +#define TRC_EXT2_HEADER "aws_wifi.tzext.h" +#define TRC_EXT2_PREFIX TRC_EXT_WIFI + +#define TRC_EXT3_HEADER "Here you specify the header file for Extensions 3." +#define TRC_EXT3_PREFIX NOT_DEFINED + +#define TRC_EXT4_HEADER "Here you specify the header file for Extensions 4." +#define TRC_EXT4_PREFIX NOT_DEFINED + +/*** Don't modify below ******************************************************/ + +#define ROUNDUP4(n) (4*((n+3)/4)) + +typedef struct{ + uint16_t firstEventCode; + uint16_t lastEventCode; + uint16_t patchVersion; + uint8_t minorVersion; + uint8_t majorVersion; + char name[ROUNDUP4(TRC_CFG_EXT_MAX_NAME_LEN)]; +} PSFExtensionEntryType; + +typedef struct{ + uint16_t extensionEntryCount; + uint16_t baseEventCode; +#if (TRC_CFG_EXTENSION_COUNT > 0) + uint8_t extensionEntryNameMaxLength; + uint8_t extensionEntrySize; + PSFExtensionEntryType extension[TRC_CFG_EXTENSION_COUNT]; +#endif +} PSFExtensionInfoType; + + +extern PSFExtensionInfoType PSFExtensionInfo; + +#define CAT(a, ...) PRIMITIVE_CAT(a, __VA_ARGS__) +#define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__ + +#define TRC_EXT_BASECODE (PSFExtensionInfo.extension[TRC_EXT_NUMBER-1].firstEventCode) + +#if (TRC_CFG_EXTENSION_COUNT >= 1) + #ifdef TRC_EXT1_HEADER + #define TRC_EXT_NUMBER 1 + #include TRC_EXT1_HEADER + #undef TRC_EXT_NUMBER + #endif +#endif + +#if (TRC_CFG_EXTENSION_COUNT >= 2) + #ifdef TRC_EXT2_HEADER + #define TRC_EXT_NUMBER 2 + #include TRC_EXT2_HEADER + #undef TRC_EXT_NUMBER + #endif +#endif + +#if (TRC_CFG_EXTENSION_COUNT >= 3) + #ifdef TRC_EXT3_HEADER + #define TRC_EXT_NUMBER 3 + #include TRC_EXT3_HEADER + #undef TRC_EXT_NUMBER + #endif +#endif + +#if (TRC_CFG_EXTENSION_COUNT == 4) + #ifdef TRC_EXT3_HEADER + #define TRC_EXT_NUMBER 4 + #include TRC_EXT4_HEADER + #undef TRC_EXT_NUMBER + #endif +#endif + +#define TRC_EXT1_COUNT CAT(TRC_EXT1_PREFIX, _COUNT) +#define TRC_EXT2_COUNT CAT(TRC_EXT2_PREFIX, _COUNT) +#define TRC_EXT3_COUNT CAT(TRC_EXT3_PREFIX, _COUNT) +#define TRC_EXT4_COUNT CAT(TRC_EXT4_PREFIX, _COUNT) + +#define TRC_EXT1_NAME CAT(TRC_EXT1_PREFIX, _NAME) +#define TRC_EXT2_NAME CAT(TRC_EXT2_PREFIX, _NAME) +#define TRC_EXT3_NAME CAT(TRC_EXT3_PREFIX, _NAME) +#define TRC_EXT4_NAME CAT(TRC_EXT4_PREFIX, _NAME) + +#define TRC_EXT1_VERSION_MAJOR CAT(TRC_EXT1_PREFIX, _VERSION_MAJOR) +#define TRC_EXT2_VERSION_MAJOR CAT(TRC_EXT2_PREFIX, _VERSION_MAJOR) +#define TRC_EXT3_VERSION_MAJOR CAT(TRC_EXT3_PREFIX, _VERSION_MAJOR) +#define TRC_EXT4_VERSION_MAJOR CAT(TRC_EXT4_PREFIX, _VERSION_MAJOR) + +#define TRC_EXT1_VERSION_MINOR CAT(TRC_EXT1_PREFIX, _VERSION_MINOR) +#define TRC_EXT2_VERSION_MINOR CAT(TRC_EXT2_PREFIX, _VERSION_MINOR) +#define TRC_EXT3_VERSION_MINOR CAT(TRC_EXT3_PREFIX, _VERSION_MINOR) +#define TRC_EXT4_VERSION_MINOR CAT(TRC_EXT4_PREFIX, _VERSION_MINOR) + +#define TRC_EXT1_VERSION_PATCH CAT(TRC_EXT1_PREFIX, _VERSION_PATCH) +#define TRC_EXT2_VERSION_PATCH CAT(TRC_EXT2_PREFIX, _VERSION_PATCH) +#define TRC_EXT3_VERSION_PATCH CAT(TRC_EXT3_PREFIX, _VERSION_PATCH) +#define TRC_EXT4_VERSION_PATCH CAT(TRC_EXT4_PREFIX, _VERSION_PATCH) + +#if ((TRC_CFG_EXTENSION_COUNT > 4) || (TRC_CFG_EXTENSION_COUNT < 0)) + #error "TRC_CFG_EXTENSION_COUNT must be in range [0..4]" +#endif + +#if (TRC_CFG_EXTENSION_COUNT == 0) +#define TRC_EXTENSIONS_DATA +#endif + +#if (TRC_CFG_EXTENSION_COUNT == 1) +#define TRC_EXTENSIONS_DATA \ +{ \ + { TRC_EXTENSION_EVENTCODE_BASE, \ + TRC_EXTENSION_EVENTCODE_BASE + TRC_EXT1_COUNT-1, \ + TRC_EXT1_VERSION_PATCH, \ + TRC_EXT1_VERSION_MINOR, \ + TRC_EXT1_VERSION_MAJOR, \ + TRC_EXT1_NAME } \ +} +#endif + +#if (TRC_CFG_EXTENSION_COUNT == 2) +#define TRC_EXTENSIONS_DATA \ +{ \ + { TRC_EXTENSION_EVENTCODE_BASE, \ + TRC_EXTENSION_EVENTCODE_BASE + TRC_EXT1_COUNT-1, \ + TRC_EXT1_VERSION_PATCH, \ + TRC_EXT1_VERSION_MINOR, \ + TRC_EXT1_VERSION_MAJOR, \ + TRC_EXT1_NAME } \ + ,{ TRC_EXTENSION_EVENTCODE_BASE + TRC_EXT1_COUNT, \ + TRC_EXTENSION_EVENTCODE_BASE + TRC_EXT1_COUNT + TRC_EXT2_COUNT-1, \ + TRC_EXT2_VERSION_PATCH, \ + TRC_EXT2_VERSION_MINOR, \ + TRC_EXT2_VERSION_MAJOR, \ + TRC_EXT2_NAME } \ +} +#endif + +#if (TRC_CFG_EXTENSION_COUNT == 3) +#define TRC_EXTENSIONS_DATA \ +{ \ + { TRC_EXTENSION_EVENTCODE_BASE, \ + TRC_EXTENSION_EVENTCODE_BASE + TRC_EXT1_COUNT-1, \ + TRC_EXT1_VERSION_PATCH, \ + TRC_EXT1_VERSION_MINOR, \ + TRC_EXT1_VERSION_MAJOR, \ + TRC_EXT1_NAME } \ + ,{ TRC_EXTENSION_EVENTCODE_BASE + TRC_EXT1_COUNT, \ + TRC_EXTENSION_EVENTCODE_BASE + TRC_EXT1_COUNT + TRC_EXT2_COUNT-1, \ + TRC_EXT2_VERSION_PATCH, \ + TRC_EXT2_VERSION_MINOR, \ + TRC_EXT2_VERSION_MAJOR, \ + TRC_EXT2_NAME } \ + ,{ TRC_EXTENSION_EVENTCODE_BASE + TRC_EXT1_COUNT + TRC_EXT2_COUNT, \ + TRC_EXTENSION_EVENTCODE_BASE + TRC_EXT1_COUNT + TRC_EXT2_COUNT + TRC_EXT3_COUNT - 1, \ + TRC_EXT3_VERSION_PATCH, \ + TRC_EXT3_VERSION_MINOR, \ + TRC_EXT3_VERSION_MAJOR, \ + TRC_EXT3_NAME } \ +} +#endif +#if (TRC_CFG_EXTENSION_COUNT == 4) +#define TRC_EXTENSIONS_DATA \ +{ \ + { TRC_EXTENSION_EVENTCODE_BASE, \ + TRC_EXTENSION_EVENTCODE_BASE + TRC_EXT1_COUNT-1, \ + TRC_EXT1_VERSION_PATCH, \ + TRC_EXT1_VERSION_MINOR, \ + TRC_EXT1_VERSION_MAJOR, \ + TRC_EXT1_NAME } \ + ,{ TRC_EXTENSION_EVENTCODE_BASE + TRC_EXT1_COUNT, \ + TRC_EXTENSION_EVENTCODE_BASE + TRC_EXT1_COUNT + TRC_EXT2_COUNT-1, \ + TRC_EXT2_VERSION_PATCH, \ + TRC_EXT2_VERSION_MINOR, \ + TRC_EXT2_VERSION_MAJOR, \ + TRC_EXT2_NAME } \ + ,{ TRC_EXTENSION_EVENTCODE_BASE + TRC_EXT1_COUNT + TRC_EXT2_COUNT, \ + TRC_EXTENSION_EVENTCODE_BASE + TRC_EXT1_COUNT + TRC_EXT2_COUNT + TRC_EXT3_COUNT - 1, \ + TRC_EXT3_VERSION_PATCH, \ + TRC_EXT3_VERSION_MINOR, \ + TRC_EXT3_VERSION_MAJOR, \ + TRC_EXT3_NAME } \ + ,{ TRC_EXTENSION_EVENTCODE_BASE + TRC_EXT1_COUNT + TRC_EXT2_COUNT + TRC_EXT3_COUNT, \ + TRC_EXTENSION_EVENTCODE_BASE + TRC_EXT1_COUNT + TRC_EXT2_COUNT + TRC_EXT3_COUNT + TRC_EXT4_COUNT- 1, \ + TRC_EXT4_VERSION_PATCH, \ + TRC_EXT4_VERSION_MINOR, \ + TRC_EXT4_VERSION_MAJOR, \ + TRC_EXT4_NAME } \ +} +#endif + +#if (TRC_CFG_EXTENSION_COUNT > 0) +#define TRC_EXTENSION_INFO {TRC_CFG_EXTENSION_COUNT, TRC_EXTENSION_EVENTCODE_BASE, ROUNDUP4(TRC_CFG_EXT_MAX_NAME_LEN), sizeof(PSFExtensionEntryType), TRC_EXTENSIONS_DATA} +#else +#define TRC_EXTENSION_INFO {TRC_CFG_EXTENSION_COUNT, TRC_EXTENSION_EVENTCODE_BASE} +#endif + +#endif /* TRCEXTENSIONS_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/TraceRecorder/include/trcHardwarePort.h b/TSM_PicoW_Sensor/McuLib/TraceRecorder/include/trcHardwarePort.h new file mode 100644 index 0000000..678605c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/TraceRecorder/include/trcHardwarePort.h @@ -0,0 +1,597 @@ +/******************************************************************************* + * Trace Recorder Library for Tracealyzer v4.4.1 + * Percepio AB, www.percepio.com + * + * trcHardwarePort.h + * + * The hardware abstraction layer for the trace recorder. + * + * Terms of Use + * This file is part of the trace recorder library (RECORDER), which is the + * intellectual property of Percepio AB (PERCEPIO) and provided under a + * license as follows. + * The RECORDER may be used free of charge for the purpose of recording data + * intended for analysis in PERCEPIO products. It may not be used or modified + * for other purposes without explicit permission from PERCEPIO. + * You may distribute the RECORDER in its original source code form, assuming + * this text (terms of use, disclaimer, copyright notice) is unchanged. You are + * allowed to distribute the RECORDER with minor modifications intended for + * configuration or porting of the RECORDER, e.g., to allow using it on a + * specific processor, processor family or with a specific communication + * interface. Any such modifications should be documented directly below + * this comment block. + * + * Disclaimer + * The RECORDER is being delivered to you AS IS and PERCEPIO makes no warranty + * as to its use or performance. PERCEPIO does not and cannot warrant the + * performance or results you may obtain by using the RECORDER or documentation. + * PERCEPIO make no warranties, express or implied, as to noninfringement of + * third party rights, merchantability, or fitness for any particular purpose. + * In no event will PERCEPIO, its technology partners, or distributors be liable + * to you for any consequential, incidental or special damages, including any + * lost profits or lost savings, even if a representative of PERCEPIO has been + * advised of the possibility of such damages, or for any claim by any third + * party. Some jurisdictions do not allow the exclusion or limitation of + * incidental, consequential or special damages, or the exclusion of implied + * warranties or limitations on how long an implied warranty may last, so the + * above limitations may not apply to you. + * + * Tabs are used for indent in this file (1 tab = 4 spaces) + * + * Copyright Percepio AB, 2018. + * www.percepio.com + ******************************************************************************/ + +#ifndef TRC_HARDWARE_PORT_H +#define TRC_HARDWARE_PORT_H + +#include "trcPortDefines.h" + +#if 1 /* << EST */ +#include "FreeRTOSConfig.h" + +#if configCPU_FAMILY_IS_ARM(configCPU_FAMILY) +#if McuLib_CONFIG_PEX_SDK_USED/* << EST Kinetis SDK is using CMSIS core, therefore the functions below are defined in core_cmFunc.h. For non-SDK projects, define them locally here */ + /** \brief Get Priority Mask + This function returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ + __attribute__( ( always_inline ) ) static inline uint32_t __get_PRIMASK(void) + { + uint32_t result; + + __asm volatile ("MRS %0, primask" : "=r" (result) ); + return(result); + } + + + /** \brief Set Priority Mask + This function assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ + __attribute__( ( always_inline ) ) static inline void __set_PRIMASK(uint32_t priMask) + { + __asm volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); + } +#elif McuLib_CONFIG_CPU_IS_STM32 + #include "stm32f3xx_hal.h" /* header file for STM32F303K8 */ +#elif McuLib_CONFIG_CPU_IS_NORDIC_NRF + #include "nrf.h" /* header file Nordic devices */ +#else + #include "fsl_device_registers.h" +#endif /* #if McuLib_CONFIG_PEX_SDK_USED */ +#endif /* configCPU_FAMILY_IS_ARM */ +#endif /* << EST */ + +#if (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_NOT_SET) + #error "TRC_CFG_HARDWARE_PORT not selected - see trcConfig.h" +#endif + +/******************************************************************************* + * TRC_IRQ_PRIORITY_ORDER + * + * Macro which should be defined as an integer of 0 or 1. + * + * This should be 0 if lower IRQ priority values implies higher priority + * levels, such as on ARM Cortex M. If the opposite scheme is used, i.e., + * if higher IRQ priority values means higher priority, this should be 1. + * + * This setting is not critical. It is used only to sort and colorize the + * interrupts in priority order, in case you record interrupts using + * the vTraceStoreISRBegin and vTraceStoreISREnd routines. + * + ****************************************************************************** + * + * HWTC Macros + * + * These macros provides a hardware isolation layer representing the + * hardware timer/counter used for the event timestamping. + * + * TRC_HWTC_COUNT: How to read the current value of the timer/counter. + * + * TRC_HWTC_TYPE: Tells the type of timer/counter used for TRC_HWTC_COUNT: + * + * - TRC_FREE_RUNNING_32BIT_INCR: + * Free-running 32-bit timer/counter, counting upwards from 0. + * + * - TRC_FREE_RUNNING_32BIT_DECR + * Free-running 32-bit timer/counter, counting downwards from 0xFFFFFFFF. + * + * - TRC_OS_TIMER_INCR + * Periodic timer that drives the OS tick interrupt, counting upwards + * from 0 until (TRC_HWTC_PERIOD-1). + * + * - TRC_OS_TIMER_DECR + * Periodic timer that drives the OS tick interrupt, counting downwards + * from TRC_HWTC_PERIOD-1 until 0. + * + * - TRC_CUSTOM_TIMER_INCR + * A custom timer or counter independent of the OS tick, counting + * downwards from TRC_HWTC_PERIOD-1 until 0. (Currently only supported + * in streaming mode). + * + * - TRC_CUSTOM_TIMER_DECR + * A custom timer independent of the OS tick, counting downwards + * from TRC_HWTC_PERIOD-1 until 0. (Currently only supported + * in streaming mode). + * + * TRC_HWTC_PERIOD: The number of HWTC_COUNT ticks until the timer wraps + * around. If using TRC_FREE_RUNNING_32BIT_INCR/DECR, this should be 0. + * + * TRC_HWTC_FREQ_HZ: The clock rate of the TRC_HWTC_COUNT counter in Hz. If using + * TRC_OS_TIMER_INCR/DECR, this is should be TRC_HWTC_PERIOD * TRACE_TICK_RATE_HZ. + * If using a free-running timer, this is often TRACE_CPU_CLOCK_HZ (if running at + * the core clock rate). If using TRC_CUSTOM_TIMER_INCR/DECR, this should match + * the clock rate of your custom timer (i.e., TRC_HWTC_COUNT). If the default value + * of TRC_HWTC_FREQ_HZ is incorrect for your setup, you can override it by calling + * vTraceSetFrequency before calling vTraceEnable. + * + * TRC_HWTC_DIVISOR (used in snapshot mode only): + * In snapshot mode, the timestamp resolution is TRC_HWTC_FREQ_HZ/TRC_HWTC_DIVISOR. + * If the timer frequency is very high (hundreds of MHz), we recommend increasing + * the TRC_HWTC_DIVISOR prescaler, to reduce the bandwidth needed to store + * timestamps. This since extra "XTS" events are inserted if the time since the + * previous event exceeds a certain limit (255 or 65535 depending on event type). + * It is advised to keep the time between most events below 65535 native ticks + * (after division by TRC_HWTC_DIVISOR) to avoid frequent XTS events. + ******************************************************************************/ + +#if (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_NOT_SET) + #error "TRC_CFG_HARDWARE_PORT not selected - see trcConfig.h" +#endif + +#if (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_Win32) + /* This can be used as a template for any free-running 32-bit counter */ + #define TRC_HWTC_TYPE TRC_FREE_RUNNING_32BIT_INCR + #define TRC_HWTC_COUNT (ulGetRunTimeCounterValue()) + #define TRC_HWTC_PERIOD 0 + #define TRC_HWTC_DIVISOR 1 + #define TRC_HWTC_FREQ_HZ 100000 + + #define TRC_IRQ_PRIORITY_ORDER 1 + + #define TRC_PORT_SPECIFIC_INIT() + +#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_HWIndependent) + /* Timestamping by OS tick only (typically 1 ms resolution) */ + #define TRC_HWTC_TYPE TRC_OS_TIMER_INCR + #define TRC_HWTC_COUNT 0 + #define TRC_HWTC_PERIOD 1 + #define TRC_HWTC_DIVISOR 1 + #define TRC_HWTC_FREQ_HZ TRACE_TICK_RATE_HZ + + /* Set the meaning of IRQ priorities in ISR tracing - see above */ + #define TRC_IRQ_PRIORITY_ORDER NOT_SET + +#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_ARM_Cortex_M) + + #ifndef __CORTEX_M + #error "Can't find the CMSIS API. Please include your processor's header file in trcConfig.h" + #endif + + /************************************************************************** + * For Cortex-M3, M4 and M7, the DWT cycle counter is used for timestamping. + * For Cortex-M0 and M0+, the SysTick timer is used since DWT is not + * available. Systick timestamping can also be forced on Cortex-M3, M4 and + * M7 by defining the preprocessor directive TRC_CFG_ARM_CM_USE_SYSTICK, + * either directly below or in trcConfig.h. + * + * #define TRC_CFG_ARM_CM_USE_SYSTICK + **************************************************************************/ + + #if ((__CORTEX_M >= 0x03) && (! defined TRC_CFG_ARM_CM_USE_SYSTICK)) + + void prvTraceInitCortexM(void); + + #define TRC_REG_DEMCR (*(volatile uint32_t*)0xE000EDFC) + #define TRC_REG_DWT_CTRL (*(volatile uint32_t*)0xE0001000) + #define TRC_REG_DWT_CYCCNT (*(volatile uint32_t*)0xE0001004) + #define TRC_REG_DWT_EXCCNT (*(volatile uint32_t*)0xE000100C) + + #define TRC_REG_ITM_LOCKACCESS (*(volatile uint32_t*)0xE0001FB0) + #define TRC_ITM_LOCKACCESS_UNLOCK (0xC5ACCE55) + + /* Bit mask for TRCENA bit in DEMCR - Global enable for DWT and ITM */ + #define TRC_DEMCR_TRCENA (1 << 24) + + /* Bit mask for NOPRFCNT bit in DWT_CTRL. If 1, DWT_EXCCNT is not supported */ + #define TRC_DWT_CTRL_NOPRFCNT (1 << 24) + + /* Bit mask for NOCYCCNT bit in DWT_CTRL. If 1, DWT_CYCCNT is not supported */ + #define TRC_DWT_CTRL_NOCYCCNT (1 << 25) + + /* Bit mask for EXCEVTENA_ bit in DWT_CTRL. Set to 1 to enable DWT_EXCCNT */ + #define TRC_DWT_CTRL_EXCEVTENA (1 << 18) + + /* Bit mask for EXCEVTENA_ bit in DWT_CTRL. Set to 1 to enable DWT_CYCCNT */ + #define TRC_DWT_CTRL_CYCCNTENA (1) + + #define TRC_PORT_SPECIFIC_INIT() prvTraceInitCortexM() + + #define TRC_HWTC_TYPE TRC_FREE_RUNNING_32BIT_INCR + #define TRC_HWTC_COUNT TRC_REG_DWT_CYCCNT + #define TRC_HWTC_PERIOD 0 + #define TRC_HWTC_DIVISOR 4 + #define TRC_HWTC_FREQ_HZ TRACE_CPU_CLOCK_HZ + #define TRC_IRQ_PRIORITY_ORDER 0 + + #else + + #define TRC_HWTC_TYPE TRC_OS_TIMER_DECR + #define TRC_HWTC_COUNT (*((volatile uint32_t*)0xE000E018)) + #define TRC_HWTC_PERIOD ((*((volatile uint32_t*)0xE000E014)) + 1) + #define TRC_HWTC_DIVISOR 4 + #define TRC_HWTC_FREQ_HZ TRACE_CPU_CLOCK_HZ + #define TRC_IRQ_PRIORITY_ORDER 0 + + #endif + +#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_Renesas_RX600) + + #include "iodefine.h" + + #if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) + + #define TRC_HWTC_TYPE TRC_OS_TIMER_INCR + #define TRC_HWTC_COUNT (CMT0.CMCNT) + + #elif (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_SNAPSHOT) + + /* Decreasing counters better for Tickless Idle? */ + #define TRC_HWTC_TYPE TRC_OS_TIMER_DECR + #define TRC_HWTC_COUNT (CMT0.CMCOR - CMT0.CMCNT) + + #endif + + #define TRC_HWTC_PERIOD (CMT0.CMCOR + 1) + #define TRC_HWTC_DIVISOR 1 + #define TRC_HWTC_FREQ_HZ (TRACE_TICK_RATE_HZ * TRC_HWTC_PERIOD) + #define TRC_IRQ_PRIORITY_ORDER 1 + +#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_MICROCHIP_PIC24_PIC32) + + #define TRC_HWTC_TYPE TRC_OS_TIMER_INCR + #define TRC_HWTC_COUNT (TMR1) + #define TRC_HWTC_PERIOD (PR1 + 1) + #define TRC_HWTC_DIVISOR 1 + #define TRC_HWTC_FREQ_HZ (TRACE_TICK_RATE_HZ * TRC_HWTC_PERIOD) + #define TRC_IRQ_PRIORITY_ORDER 1 + +#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_TEXAS_INSTRUMENTS_TMS570_RM48) + + #define TRC_RTIFRC0 *((uint32_t *)0xFFFFFC10) + #define TRC_RTICOMP0 *((uint32_t *)0xFFFFFC50) + #define TRC_RTIUDCP0 *((uint32_t *)0xFFFFFC54) + + #define TRC_HWTC_TYPE TRC_OS_TIMER_INCR + #define TRC_HWTC_COUNT (TRC_RTIFRC0 - (TRC_RTICOMP0 - TRC_RTIUDCP0)) + #define TRC_HWTC_PERIOD (TRC_RTIUDCP0) + #define TRC_HWTC_DIVISOR 1 + #define TRC_HWTC_FREQ_HZ (TRACE_TICK_RATE_HZ * TRC_HWTC_PERIOD) + #define TRC_IRQ_PRIORITY_ORDER 0 + +#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_Atmel_AT91SAM7) + + /* UNOFFICIAL PORT - NOT YET VERIFIED BY PERCEPIO */ + + #define TRC_HWTC_TYPE TRC_OS_TIMER_INCR + #define TRC_HWTC_COUNT ((uint32_t)(AT91C_BASE_PITC->PITC_PIIR & 0xFFFFF)) + #define TRC_HWTC_PERIOD ((uint32_t)(AT91C_BASE_PITC->PITC_PIMR + 1)) + #define TRC_HWTC_DIVISOR 1 + #define TRC_HWTC_FREQ_HZ (TRACE_TICK_RATE_HZ * TRC_HWTC_PERIOD) + #define TRC_IRQ_PRIORITY_ORDER 1 + +#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_Atmel_UC3A0) + + /* UNOFFICIAL PORT - NOT YET VERIFIED BY PERCEPIO*/ + + /* For Atmel AVR32 (AT32UC3A) */ + + #define TRC_HWTC_TYPE TRC_OS_TIMER_INCR + #define TRC_HWTC_COUNT ((uint32_t)sysreg_read(AVR32_COUNT)) + #define TRC_HWTC_PERIOD ((uint32_t)(sysreg_read(AVR32_COMPARE) + 1)) + #define TRC_HWTC_DIVISOR 1 + #define TRC_HWTC_FREQ_HZ (TRACE_TICK_RATE_HZ * TRC_HWTC_PERIOD) + #define TRC_IRQ_PRIORITY_ORDER 1 + +#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_NXP_LPC210X) + + /* UNOFFICIAL PORT - NOT YET VERIFIED BY PERCEPIO */ + + /* Tested with LPC2106, but should work with most LPC21XX chips. */ + + #define TRC_HWTC_TYPE TRC_OS_TIMER_INCR + #define TRC_HWTC_COUNT *((uint32_t *)0xE0004008 ) + #define TRC_HWTC_PERIOD *((uint32_t *)0xE0004018 ) + #define TRC_HWTC_DIVISOR 1 + #define TRC_HWTC_FREQ_HZ (TRACE_TICK_RATE_HZ * TRC_HWTC_PERIOD) + #define TRC_IRQ_PRIORITY_ORDER 0 + +#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_TEXAS_INSTRUMENTS_MSP430) + + /* UNOFFICIAL PORT - NOT YET VERIFIED */ + + #define TRC_HWTC_TYPE TRC_OS_TIMER_INCR + #define TRC_HWTC_COUNT (TA0R) + #define TRC_HWTC_PERIOD (((uint16_t)TACCR0)+1) + #define TRC_HWTC_DIVISOR 1 + #define TRC_HWTC_FREQ_HZ (TRACE_TICK_RATE_HZ * TRC_HWTC_PERIOD) + #define TRC_IRQ_PRIORITY_ORDER 1 + +#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_XILINX_PPC405) + + /* UNOFFICIAL PORT - NOT YET VERIFIED */ + + #define TRC_HWTC_TYPE TRC_OS_TIMER_DECR + #define TRC_HWTC_COUNT mfspr(0x3db) + #define TRC_HWTC_PERIOD (TRACE_CPU_CLOCK_HZ / TRACE_TICK_RATE_HZ) + #define TRC_HWTC_DIVISOR 1 + #define TRC_HWTC_FREQ_HZ (TRACE_TICK_RATE_HZ * TRC_HWTC_PERIOD) + #define TRC_IRQ_PRIORITY_ORDER 0 + +#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_XILINX_PPC440) + + /* UNOFFICIAL PORT */ + + /* This should work with most PowerPC chips */ + + #define TRC_HWTC_TYPE TRC_OS_TIMER_DECR + #define TRC_HWTC_COUNT mfspr(0x016) + #define TRC_HWTC_PERIOD (TRACE_CPU_CLOCK_HZ / TRACE_TICK_RATE_HZ) + #define TRC_HWTC_DIVISOR 1 + #define TRC_HWTC_FREQ_HZ (TRACE_TICK_RATE_HZ * TRC_HWTC_PERIOD) + #define TRC_IRQ_PRIORITY_ORDER 0 + +#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_XILINX_MICROBLAZE) + + /* UNOFFICIAL PORT - NOT YET VERIFIED BY PERCEPIO */ + + /* This should work with most Microblaze configurations. + * It uses the AXI Timer 0 - the tick interrupt source. + * If an AXI Timer 0 peripheral is available on your hardware platform, no modifications are required. + */ + #include "xtmrctr_l.h" + + #define TRC_HWTC_TYPE TRC_OS_TIMER_DECR + #define TRC_HWTC_COUNT XTmrCtr_GetTimerCounterReg( XPAR_TMRCTR_0_BASEADDR, 0 ) + #define TRC_HWTC_PERIOD (XTmrCtr_mGetLoadReg( XPAR_TMRCTR_0_BASEADDR, 0) + 1) + #define TRC_HWTC_DIVISOR 16 + #define TRC_HWTC_FREQ_HZ (TRACE_TICK_RATE_HZ * TRC_HWTC_PERIOD) + #define TRC_IRQ_PRIORITY_ORDER 0 + +#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_XILINX_ZyncUltraScaleR5) + + #include "xttcps_hw.h" + + #define TRC_HWTC_TYPE TRC_OS_TIMER_INCR + #define TRC_HWTC_COUNT (*(volatile uint32_t *)(configTIMER_BASEADDR + XTTCPS_COUNT_VALUE_OFFSET)) + #define TRC_HWTC_PERIOD (*(volatile uint32_t *)(configTIMER_BASEADDR + XTTCPS_INTERVAL_VAL_OFFSET)) + #define TRC_HWTC_DIVISOR 16 + #define TRC_HWTC_FREQ_HZ (TRC_HWTC_PERIOD * TRACE_TICK_RATE_HZ) + #define TRC_IRQ_PRIORITY_ORDER 0 + + #ifdef __GNUC__ + /* For Arm Cortex-A and Cortex-R in general. */ + static inline uint32_t prvGetCPSR(void) + { + unsigned long ret; + /* GCC-style assembly for getting the CPSR/APSR register, where the system execution mode is found. */ + asm volatile (" mrs %0, cpsr" : "=r" (ret) : /* no inputs */ ); + return ret; + } + #else + #error "Only GCC Supported!" + #endif + +#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_Altera_NiosII) + + /* OFFICIAL PORT */ + + #include + #include + + #define NOT_SET 1 + + /* The base address for the sustem timer set. + * The name user for the system timer can be found in the BSP editor. + * If the name of the timer is sys_tmr SYSTEM_TIMER_BASE should be set to SYS_TMR_BASE. + */ + #define SYSTEM_TIMER_BASE NOT_SET + + #if (SYSTEM_TIMER == NOT_SET) + #error "Set SYSTEM_TIMER_BASE to the timer base used for system ticks." + #endif + + static inline uint32_t altera_nios2_GetTimerSnapReg(void) + { + /* A processor can read the current counter value by first writing to either snapl or snaph to request a coherent snapshot of the counter, + * and then reading snapl and snaph for the full 32-bit value. + */ + IOWR_ALTERA_AVALON_TIMER_SNAPL(SYSTEM_TIMER_BASE, 0); + return (IORD_ALTERA_AVALON_TIMER_SNAPH(SYSTEM_TIMER_BASE) << 16) | IORD_ALTERA_AVALON_TIMER_SNAPL(SYSTEM_TIMER_BASE); + } + + #define TRC_HWTC_TYPE TRC_OS_TIMER_DECR + #define TRC_HWTC_COUNT altera_nios2_GetTimerSnapReg() + #define TRC_HWTC_PERIOD (configCPU_CLOCK_HZ / configTICK_RATE_HZ ) + #define TRC_HWTC_DIVISOR 16 + #define TRC_HWTC_FREQ_HZ (TRACE_TICK_RATE_HZ * TRC_HWTC_PERIOD) + #define TRC_IRQ_PRIORITY_ORDER 0 + +#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_ARM_CORTEX_A9) + + /************************************************************************** + * This hardware port only supports FreeRTOS and the GCC compiler at the + * moment, due to the implementation of critical sections (trcKernelPort.h). + * + * Assuming FreeRTOS is used: + * + * For critical sections, this uses vTaskEnterCritical is when called from + * task context and ulPortSetInterruptMask when called from ISR context. + * Thus, it does not disable all ISRs. This means that the trace recorder + * can only be called from ISRs with priority less or equal to + * configMAX_API_CALL_INTERRUPT_PRIORITY (like FreeRTOS fromISR functions). + * + * This hardware port has been tested on it a Xilinx Zync 7000 (Cortex-A9), + * but should work with all Cortex-A and R processors assuming that + * TRC_CA9_MPCORE_PERIPHERAL_BASE_ADDRESS is set accordingly. + **************************************************************************/ + + /* INPUT YOUR PERIPHERAL BASE ADDRESS HERE (0xF8F00000 for Xilinx Zynq 7000)*/ + #define TRC_CA9_MPCORE_PERIPHERAL_BASE_ADDRESS 0 + + #if (TRC_CA9_MPCORE_PERIPHERAL_BASE_ADDRESS == 0) + #error "Please specify TRC_CA9_MPCORE_PERIPHERAL_BASE_ADDRESS." + #endif + + #define TRC_CA9_MPCORE_PRIVATE_MEMORY_OFFSET 0x0600 + #define TRC_CA9_MPCORE_PRIVCTR_PERIOD_REG (*(volatile uint32_t*)(TRC_CA9_MPCORE_PERIPHERAL_BASE_ADDRESS + TRC_CA9_MPCORE_PRIVATE_MEMORY_OFFSET + 0x00)) + #define TRC_CA9_MPCORE_PRIVCTR_COUNTER_REG (*(volatile uint32_t*)(TRC_CA9_MPCORE_PERIPHERAL_BASE_ADDRESS + TRC_CA9_MPCORE_PRIVATE_MEMORY_OFFSET + 0x04)) + #define TRC_CA9_MPCORE_PRIVCTR_CONTROL_REG (*(volatile uint32_t*)(TRC_CA9_MPCORE_PERIPHERAL_BASE_ADDRESS + TRC_CA9_MPCORE_PRIVATE_MEMORY_OFFSET + 0x08)) + + #define TRC_CA9_MPCORE_PRIVCTR_CONTROL_PRESCALER_MASK 0x0000FF00 + #define TRC_CA9_MPCORE_PRIVCTR_CONTROL_PRESCALER_SHIFT 8 + #define TRC_CA9_MPCORE_PRIVCTR_PRESCALER (((TRC_CA9_MPCORE_PRIVCTR_CONTROL_REG & TRC_CA9_MPCORE_PRIVCTR_CONTROL_PRESCALER_MASK) >> TRC_CA9_MPCORE_PRIVCTR_CONTROL_PRESCALER_SHIFT) + 1) + + #define TRC_HWTC_TYPE TRC_OS_TIMER_DECR + #define TRC_HWTC_COUNT TRC_CA9_MPCORE_PRIVCTR_COUNTER_REG + #define TRC_HWTC_PERIOD (TRC_CA9_MPCORE_PRIVCTR_PERIOD_REG + 1) + + /**************************************************************************************** + NOTE: The private timer ticks with a very high frequency (half the core-clock usually), + depending on the prescaler used. If a low prescaler is used, the number of HW ticks between + the trace events gets large, and thereby inefficient to store (sometimes extra events are + needed). To improve efficiency, you may use the TRC_HWTC_DIVISOR as an additional prescaler. + *****************************************************************************************/ + #define TRC_HWTC_DIVISOR 1 + + #define TRC_HWTC_FREQ_HZ (TRACE_TICK_RATE_HZ * TRC_HWTC_PERIOD) + #define TRC_IRQ_PRIORITY_ORDER 0 + + #ifdef __GNUC__ + /* For Arm Cortex-A and Cortex-R in general. */ + static inline uint32_t prvGetCPSR(void) + { + unsigned long ret; + /* GCC-style assembly for getting the CPSR/APSR register, where the system execution mode is found. */ + asm volatile (" mrs %0, cpsr" : "=r" (ret) : /* no inputs */ ); + return ret; + } + #else + #error "Only GCC Supported!" + #endif + + +#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_POWERPC_Z4) + + /* UNOFFICIAL PORT - NOT YET VERIFIED BY PERCEPIO */ + + #define TRC_HWTC_TYPE TRC_OS_TIMER_DECR + //#define HWTC_COUNT_DIRECTION DIRECTION_DECREMENTING + #define TRC_HWTC_COUNT PIT.TIMER[configTICK_PIT_CHANNEL].CVAL.R // must be the PIT channel used for the systick + #define TRC_HWTC_PERIOD ((configPIT_CLOCK_HZ / configTICK_RATE_HZ) - 1U) // TODO FIXME or maybe not -1? what's the right "period" value? + #define TRC_HWTC_FREQ_HZ configPIT_CLOCK_HZ + #define TRC_HWTC_DIVISOR 1 + #define TRC_IRQ_PRIORITY_ORDER 1 // higher IRQ priority values are more significant + +#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_APPLICATION_DEFINED) + + #if !( defined (TRC_HWTC_TYPE) && defined (TRC_HWTC_COUNT) && defined (TRC_HWTC_PERIOD) && defined (TRC_HWTC_FREQ_HZ) && defined (TRC_IRQ_PRIORITY_ORDER) ) + #error "The hardware port is not completely defined!" + #endif + +#elif (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_PROCESSOR_EXPERT) /* << EST */ + #include "portTicks.h" /* << EST */ + +#elif (TRC_CFG_HARDWARE_PORT != TRC_HARDWARE_PORT_NOT_SET) + + #error "TRC_CFG_HARDWARE_PORT had unsupported value!" + #define TRC_CFG_HARDWARE_PORT TRC_HARDWARE_PORT_NOT_SET + +#endif + +#ifndef TRC_HWTC_DIVISOR + #define TRC_HWTC_DIVISOR 1 +#endif + +#ifndef TRC_PORT_SPECIFIC_INIT + #define TRC_PORT_SPECIFIC_INIT() +#endif + +/* If Win32 port */ +#ifdef WIN32 + + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x0600 + + /* Standard includes. */ + #include + #include + #include + + /*************************************************************************** + * The Win32 port by default saves the trace to file and then kills the + * program when the recorder is stopped, to facilitate quick, simple tests + * of the recorder. + ***************************************************************************/ + #define WIN32_PORT_SAVE_WHEN_STOPPED 1 + #define WIN32_PORT_EXIT_WHEN_STOPPED 1 + +#endif + +#if (TRC_CFG_HARDWARE_PORT != TRC_HARDWARE_PORT_NOT_SET) + + #ifndef TRC_HWTC_TYPE + #error "TRC_HWTC_TYPE is not set!" + #endif + + #ifndef TRC_HWTC_COUNT + #error "TRC_HWTC_COUNT is not set!" + #endif + + #ifndef TRC_HWTC_PERIOD + #error "TRC_HWTC_PERIOD is not set!" + #endif + + #ifndef TRC_HWTC_DIVISOR + #error "TRC_HWTC_DIVISOR is not set!" + #endif + + #ifndef TRC_IRQ_PRIORITY_ORDER + #error "TRC_IRQ_PRIORITY_ORDER is not set!" + #elif (TRC_IRQ_PRIORITY_ORDER != 0) && (TRC_IRQ_PRIORITY_ORDER != 1) + #error "TRC_IRQ_PRIORITY_ORDER has bad value!" + #endif + + #if (TRC_HWTC_DIVISOR < 1) + #error "TRC_HWTC_DIVISOR must be a non-zero positive value!" + #endif + + #ifndef TRC_HWTC_FREQ_HZ + #error "TRC_HWTC_FREQ_HZ not defined!" + #endif + +#endif + +#endif /*TRC_SNAPSHOT_HARDWARE_PORT_H*/ + diff --git a/TSM_PicoW_Sensor/McuLib/TraceRecorder/include/trcKernelPort.h b/TSM_PicoW_Sensor/McuLib/TraceRecorder/include/trcKernelPort.h new file mode 100644 index 0000000..28227a4 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/TraceRecorder/include/trcKernelPort.h @@ -0,0 +1,2831 @@ +/******************************************************************************* + * Trace Recorder Library for Tracealyzer v4.4.1 + * Percepio AB, www.percepio.com + * + * Terms of Use + * This file is part of the trace recorder library (RECORDER), which is the + * intellectual property of Percepio AB (PERCEPIO) and provided under a + * license as follows. + * The RECORDER may be used free of charge for the purpose of recording data + * intended for analysis in PERCEPIO products. It may not be used or modified + * for other purposes without explicit permission from PERCEPIO. + * You may distribute the RECORDER in its original source code form, assuming + * this text (terms of use, disclaimer, copyright notice) is unchanged. You are + * allowed to distribute the RECORDER with minor modifications intended for + * configuration or porting of the RECORDER, e.g., to allow using it on a + * specific processor, processor family or with a specific communication + * interface. Any such modifications should be documented directly below + * this comment block. + * + * Disclaimer + * The RECORDER is being delivered to you AS IS and PERCEPIO makes no warranty + * as to its use or performance. PERCEPIO does not and cannot warrant the + * performance or results you may obtain by using the RECORDER or documentation. + * PERCEPIO make no warranties, express or implied, as to noninfringement of + * third party rights, merchantability, or fitness for any particular purpose. + * In no event will PERCEPIO, its technology partners, or distributors be liable + * to you for any consequential, incidental or special damages, including any + * lost profits or lost savings, even if a representative of PERCEPIO has been + * advised of the possibility of such damages, or for any claim by any third + * party. Some jurisdictions do not allow the exclusion or limitation of + * incidental, consequential or special damages, or the exclusion of implied + * warranties or limitations on how long an implied warranty may last, so the + * above limitations may not apply to you. + * + * FreeRTOS-specific definitions needed by the trace recorder + * + * + * + * Tabs are used for indent in this file (1 tab = 4 spaces) + * + * Copyright Percepio AB, 2018. + * www.percepio.com + ******************************************************************************/ + +#ifndef TRC_KERNEL_PORT_H +#define TRC_KERNEL_PORT_H + +#include "FreeRTOS.h" /* Defines configUSE_TRACE_FACILITY */ +#include "trcPortDefines.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define TRC_USE_TRACEALYZER_RECORDER configUSE_TRACE_FACILITY + +/*** FreeRTOS version codes **************************************************/ +#define FREERTOS_VERSION_NOT_SET 0 +#define TRC_FREERTOS_VERSION_7_3_X 1 /* v7.3 is earliest supported.*/ +#define TRC_FREERTOS_VERSION_7_4_X 2 +#define TRC_FREERTOS_VERSION_7_5_X 3 +#define TRC_FREERTOS_VERSION_7_6_X TRC_FREERTOS_VERSION_7_5_X +#define TRC_FREERTOS_VERSION_8_X_X 4 +#define TRC_FREERTOS_VERSION_9_0_0 5 +#define TRC_FREERTOS_VERSION_9_0_1 6 +#define TRC_FREERTOS_VERSION_9_0_2 7 +#define TRC_FREERTOS_VERSION_10_0_0 8 +#define TRC_FREERTOS_VERSION_10_0_1 TRC_FREERTOS_VERSION_10_0_0 +#define TRC_FREERTOS_VERSION_10_1_0 TRC_FREERTOS_VERSION_10_0_0 +#define TRC_FREERTOS_VERSION_10_1_1 TRC_FREERTOS_VERSION_10_0_0 +#define TRC_FREERTOS_VERSION_10_2_0 TRC_FREERTOS_VERSION_10_0_0 +#define TRC_FREERTOS_VERSION_10_2_1 TRC_FREERTOS_VERSION_10_0_0 +#define TRC_FREERTOS_VERSION_10_3_0 9 +#define TRC_FREERTOS_VERSION_10_3_1 TRC_FREERTOS_VERSION_10_3_0 +#define TRC_FREERTOS_VERSION_10_4_0 10 +#define TRC_FREERTOS_VERSION_10_4_1 TRC_FREERTOS_VERSION_10_4_0 + +/* Legacy FreeRTOS version codes for backwards compatibility with old trace configurations */ +#define TRC_FREERTOS_VERSION_7_3 TRC_FREERTOS_VERSION_7_3_X +#define TRC_FREERTOS_VERSION_7_4 TRC_FREERTOS_VERSION_7_4_X +#define TRC_FREERTOS_VERSION_7_5_OR_7_6 TRC_FREERTOS_VERSION_7_5_X +#define TRC_FREERTOS_VERSION_8_X TRC_FREERTOS_VERSION_8_X_X + +#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) +#define prvGetStreamBufferType(x) ((( StreamBuffer_t * )x )->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER) +#else +#define prvGetStreamBufferType(x) 0 +#endif + +/* Added mainly for our internal testing. This makes it easier to create test applications that + runs on multiple FreeRTOS versions. */ +#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_8_X_X) + /* FreeRTOS v7.x */ + #define STRING_CAST(x) ( (signed char*) x ) + #define TickType portTickType + #define TaskType xTaskHandle +#else + /* FreeRTOS v8.0 and later */ + #define STRING_CAST(x) x + #define TickType TickType_t + #define TaskType TaskHandle_t +#endif + + + +#if (defined(TRC_USE_TRACEALYZER_RECORDER)) && (TRC_USE_TRACEALYZER_RECORDER == 1) + +#if defined(TRC_CFG_ENABLE_STACK_MONITOR) && (TRC_CFG_ENABLE_STACK_MONITOR == 1) && (TRC_CFG_SCHEDULING_ONLY == 0) + /* Required for this feature */ +#undef INCLUDE_uxTaskGetStackHighWaterMark +#define INCLUDE_uxTaskGetStackHighWaterMark 1 +#endif /* defined(TRC_CFG_ENABLE_STACK_MONITOR) && (TRC_CFG_ENABLE_STACK_MONITOR == 1) && (TRC_CFG_SCHEDULING_ONLY == 0) */ + +/******************************************************************************* + * INCLUDE_xTaskGetCurrentTaskHandle must be set to 1 for tracing to work properly + ******************************************************************************/ +#undef INCLUDE_xTaskGetCurrentTaskHandle +#define INCLUDE_xTaskGetCurrentTaskHandle 1 + +#if (TRC_CFG_SCHEDULING_ONLY == 0) +/******************************************************************************* + * vTraceSetQueueName(void* object, const char* name) + * + * Parameter object: pointer to the Queue that shall be named + * Parameter name: the name to set (const string literal) + * + * Sets a name for Queue objects for display in Tracealyzer. + ******************************************************************************/ +void vTraceSetQueueName(void* object, const char* name); + +/******************************************************************************* + * vTraceSetSemaphoreName(void* object, const char* name) + * + * Parameter object: pointer to the Semaphore that shall be named + * Parameter name: the name to set (const string literal) + * + * Sets a name for Semaphore objects for display in Tracealyzer. + ******************************************************************************/ +void vTraceSetSemaphoreName(void* object, const char* name); + +/******************************************************************************* + * vTraceSetMutexName(void* object, const char* name) + * + * Parameter object: pointer to the Mutex that shall be named + * Parameter name: the name to set (const string literal) + * + * Sets a name for Semaphore objects for display in Tracealyzer. + ******************************************************************************/ +void vTraceSetMutexName(void* object, const char* name); + +#if (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1) +/******************************************************************************* +* vTraceSetEventGroupName(void* object, const char* name) +* +* Parameter object: pointer to the EventGroup that shall be named +* Parameter name: the name to set (const string literal) +* +* Sets a name for EventGroup objects for display in Tracealyzer. +******************************************************************************/ +void vTraceSetEventGroupName(void* object, const char* name); +#else /* (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1) */ +#define vTraceSetEventGroupName(object, name) /* Do nothing */ +#endif /* (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1) */ + +#if (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1) +/******************************************************************************* +* vTraceSetStreamBufferName(void* object, const char* name) +* +* Parameter object: pointer to the StreamBuffer that shall be named +* Parameter name: the name to set (const string literal) +* +* Sets a name for StreamBuffer objects for display in Tracealyzer. +******************************************************************************/ +void vTraceSetStreamBufferName(void* object, const char* name); +#else /* (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1) */ +#define vTraceSetStreamBufferName(object, name) /* Do nothing */ +#endif /* (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1) */ + +#if (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1) +/******************************************************************************* + * vTraceSetMessageBufferName(void* object, const char* name) + * + * Parameter object: pointer to the MessageBuffer that shall be named + * Parameter name: the name to set (const string literal) + * + * Sets a name for MessageBuffer objects for display in Tracealyzer. + ******************************************************************************/ +void vTraceSetMessageBufferName(void* object, const char* name); +#else /* (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1) */ +#define vTraceSetMessageBufferName(object, name) /* Do nothing */ +#endif /* (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1) */ + +#if defined (TRC_CFG_ENABLE_STACK_MONITOR) && (TRC_CFG_ENABLE_STACK_MONITOR == 1) +void prvAddTaskToStackMonitor(void* task); +void prvRemoveTaskFromStackMonitor(void* task); +#else /* defined (TRC_CFG_ENABLE_STACK_MONITOR) && (TRC_CFG_ENABLE_STACK_MONITOR == 1) */ +#define prvAddTaskToStackMonitor(task) +#define prvRemoveTaskFromStackMonitor(task) +#endif /* defined (TRC_CFG_ENABLE_STACK_MONITOR) && (TRC_CFG_ENABLE_STACK_MONITOR == 1) */ + +#else /* (TRC_CFG_SCHEDULING_ONLY == 0) */ + +#define vTraceSetQueueName(object, name) /* Do nothing */ +#define vTraceSetSemaphoreName(object, name) /* Do nothing */ +#define vTraceSetMutexName(object, name) /* Do nothing */ +#define vTraceSetEventGroupName(object, name) /* Do nothing */ +#define vTraceSetStreamBufferName(object, name) /* Do nothing */ +#define vTraceSetMessageBufferName(object, name) /* Do nothing */ +#define prvAddTaskToStackMonitor(task) /* Do nothing */ +#define prvRemoveTaskFromStackMonitor(task) /* Do nothing */ + +#endif /* (TRC_CFG_SCHEDULING_ONLY == 0) */ + +/******************************************************************************* + * Note: Setting names for event groups is difficult to support, this has been + * excluded intentionally. This since we don't know if event_groups.c is + * included in the build, so referencing it from the recorder may cause errors. + ******************************************************************************/ + +/* Gives the currently executing task (wrapper for RTOS-specific function) */ +void* prvTraceGetCurrentTaskHandle(void); + +#if (((TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_SNAPSHOT) && (TRC_CFG_INCLUDE_ISR_TRACING == 1)) || (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING)) +/* Tells if the scheduler currently is suspended (task-switches can't occur) */ +unsigned char prvTraceIsSchedulerSuspended(void); + +/******************************************************************************* + * INCLUDE_xTaskGetSchedulerState must be set to 1 for tracing to work properly + ******************************************************************************/ +#undef INCLUDE_xTaskGetSchedulerState +#define INCLUDE_xTaskGetSchedulerState 1 + +#endif /* (((TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_SNAPSHOT) && (TRC_CFG_INCLUDE_ISR_TRACING == 1)) || (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING)) */ + +#define TRACE_KERNEL_VERSION 0x1AA1 +#define TRACE_TICK_RATE_HZ configTICK_RATE_HZ /* Defined in "FreeRTOS.h" */ +#define TRACE_CPU_CLOCK_HZ configCPU_CLOCK_HZ /* Defined in "FreeRTOSConfig.h" */ +#define TRACE_GET_CURRENT_TASK() prvTraceGetCurrentTaskHandle() + +#define TRACE_GET_OS_TICKS() (uiTraceTickCount) /* Streaming only */ + +/* If using dynamic allocation of snapshot trace buffer... */ +#define TRACE_MALLOC(size) pvPortMalloc(size) + +#if defined(configUSE_TIMERS) +#if (configUSE_TIMERS == 1) +#undef INCLUDE_xTimerGetTimerDaemonTaskHandle +#define INCLUDE_xTimerGetTimerDaemonTaskHandle 1 +#endif /* configUSE_TIMERS == 1*/ +#endif /* configUSE_TIMERS */ + +/* For ARM Cortex-M devices - assumes the ARM CMSIS API is available */ +#if (defined (__CORTEX_M)) + #define TRACE_ALLOC_CRITICAL_SECTION() uint32_t __irq_status; + #define TRACE_ENTER_CRITICAL_SECTION() {__irq_status = __get_PRIMASK(); __set_PRIMASK(1);} /* PRIMASK disables ALL interrupts - allows for tracing in any ISR */ + #define TRACE_EXIT_CRITICAL_SECTION() {__set_PRIMASK(__irq_status);} +#endif + +#if (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_ARM_CORTEX_A9) || (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_XILINX_ZyncUltraScaleR5) + + /************************************************************************** + * Disables "FreeRTOS-enabled" interrupts only , i.e. with priorities up to + * configMAX_API_CALL_INTERRUPT_PRIORITY. Don't add tracing in ISRs with + * greater priority. + *************************************************************************/ + + extern int cortex_a9_r5_enter_critical(void); + extern void cortex_a9_r5_exit_critical(int irq_already_masked_at_enter); + + #define TRACE_ALLOC_CRITICAL_SECTION() uint32_t __irq_mask_status; + + #define TRACE_ENTER_CRITICAL_SECTION() { __irq_mask_status = cortex_a9_r5_enter_critical(); } + + #define TRACE_EXIT_CRITICAL_SECTION() { cortex_a9_r5_exit_critical(__irq_mask_status); } + +#endif + +#if ( (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_Renesas_RX600) || (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_MICROCHIP_PIC24_PIC32)) + #define TRACE_ALLOC_CRITICAL_SECTION() int __irq_status; + #define TRACE_ENTER_CRITICAL_SECTION() {__irq_status = portSET_INTERRUPT_MASK_FROM_ISR();} + #define TRACE_EXIT_CRITICAL_SECTION() {portCLEAR_INTERRUPT_MASK_FROM_ISR(__irq_status);} +#endif + +#if (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_Altera_NiosII) + #include "system.h" + #include "sys/alt_irq.h" + #define TRACE_ALLOC_CRITICAL_SECTION() alt_irq_context __irq_status; + #define TRACE_ENTER_CRITICAL_SECTION(){__irq_status = alt_irq_disable_all();} + #define TRACE_EXIT_CRITICAL_SECTION() {alt_irq_enable_all(__irq_status);} +#endif + +#if (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_Win32) + /* In the Win32 port, there are no real interrupts, so we can use the normal critical sections */ + #define TRACE_ALLOC_CRITICAL_SECTION() + #define TRACE_ENTER_CRITICAL_SECTION() portENTER_CRITICAL() + #define TRACE_EXIT_CRITICAL_SECTION() portEXIT_CRITICAL() +#endif + +#if (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_PROCESSOR_EXPERT) /* << EST */ + #define TRACE_ALLOC_CRITICAL_SECTION() + #define TRACE_ENTER_CRITICAL_SECTION() portENTER_CRITICAL() + #define TRACE_EXIT_CRITICAL_SECTION() portEXIT_CRITICAL() +#endif + +#if (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_POWERPC_Z4) +#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X) + /* FreeRTOS v8.0 or later */ + #define TRACE_ALLOC_CRITICAL_SECTION() UBaseType_t __irq_status; + #define TRACE_ENTER_CRITICAL_SECTION() {__irq_status = portSET_INTERRUPT_MASK_FROM_ISR();} + #define TRACE_EXIT_CRITICAL_SECTION() {portCLEAR_INTERRUPT_MASK_FROM_ISR(__irq_status);} +#else + /* FreeRTOS v7.x */ + #define TRACE_ALLOC_CRITICAL_SECTION() unsigned portBASE_TYPE __irq_status; + #define TRACE_ENTER_CRITICAL_SECTION() {__irq_status = portSET_INTERRUPT_MASK_FROM_ISR();} + #define TRACE_EXIT_CRITICAL_SECTION() {portCLEAR_INTERRUPT_MASK_FROM_ISR(__irq_status);} +#endif +#endif + +#ifndef TRACE_ENTER_CRITICAL_SECTION + #error "This hardware port has no definition for critical sections! See http://percepio.com/2014/10/27/how-to-define-critical-sections-for-the-recorder/" +#endif + + +#if (TRC_CFG_FREERTOS_VERSION == TRC_FREERTOS_VERSION_9_0_1) + /****************************************************************************** + * Fix for FreeRTOS v9.0.1 to correctly identify xQueuePeek events. + * + * In FreeRTOS v9.0.1, the below trace hooks are incorrectly used from three + * different functions. This as the earlier function xQueueGenericReceive + * has been replaced by xQueuePeek, xQueueSemaphoreTake and xQueueReceive. + * + * xQueueGenericReceive had a parameter "xJustPeeking", used by the trace hooks + * to tell between xQueuePeek events and others. This is no longer present, so + * we need another way to correctly identify peek events. Since all three + * functions call the same trace macros, the context of these macro is unknown. + * + * We therefore check the __LINE__ macro inside of the trace macros. This gives + * the line number of queue.c, where the macros are used. This can be used to + * tell if the context is xQueuePeek or another function. + * __LINE__ is a standard compiler feature since ancient times, so it should + * work on all common compilers. + * + * This might seem as a quite brittle and unusual solution, but works in this + * particular case and is only for FreeRTOS v9.0.1. + * Future versions of FreeRTOS should not need this fix, as we have submitted + * a correction of queue.c with individual trace macros for each function. + ******************************************************************************/ +#define isQueueReceiveHookActuallyPeek (__LINE__ > 1674) /* Half way between the closes trace points */ + +#elif (TRC_CFG_FREERTOS_VERSION <= TRC_FREERTOS_VERSION_9_0_0) +#define isQueueReceiveHookActuallyPeek xJustPeeking + +#elif (TRC_CFG_FREERTOS_VERSION > TRC_FREERTOS_VERSION_9_0_1) +#define isQueueReceiveHookActuallyPeek (__LINE__ < 0) /* instead of pdFALSE to fix a warning of "constant condition" */ + +#endif + +extern uint16_t CurrentFilterMask; + +extern uint16_t CurrentFilterGroup; + +uint8_t prvTraceGetQueueType(void* handle); +uint16_t prvTraceGetTaskNumberLow16(void* handle); +uint16_t prvTraceGetTaskNumberHigh16(void* handle); +void prvTraceSetTaskNumberLow16(void* handle, uint16_t value); +void prvTraceSetTaskNumberHigh16(void* handle, uint16_t value); + +uint16_t prvTraceGetQueueNumberLow16(void* handle); +uint16_t prvTraceGetQueueNumberHigh16(void* handle); +void prvTraceSetQueueNumberLow16(void* handle, uint16_t value); +void prvTraceSetQueueNumberHigh16(void* handle, uint16_t value); + +#if (TRC_CFG_INCLUDE_TIMER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) +uint16_t prvTraceGetTimerNumberLow16(void* handle); +uint16_t prvTraceGetTimerNumberHigh16(void* handle); +void prvTraceSetTimerNumberLow16(void* handle, uint16_t value); +void prvTraceSetTimerNumberHigh16(void* handle, uint16_t value); +#endif /* (TRC_CFG_INCLUDE_TIMER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */ + +#if (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) +uint16_t prvTraceGetEventGroupNumberLow16(void* handle); +uint16_t prvTraceGetEventGroupNumberHigh16(void* handle); +void prvTraceSetEventGroupNumberLow16(void* handle, uint16_t value); +void prvTraceSetEventGroupNumberHigh16(void* handle, uint16_t value); +#endif /* (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */ + +#if (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) +uint16_t prvTraceGetStreamBufferNumberLow16(void* handle); +uint16_t prvTraceGetStreamBufferNumberHigh16(void* handle); +void prvTraceSetStreamBufferNumberLow16(void* handle, uint16_t value); +void prvTraceSetStreamBufferNumberHigh16(void* handle, uint16_t value); +#endif /* (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */ + +#define TRACE_GET_TASK_FILTER(pxTask) prvTraceGetTaskNumberHigh16((void*)pxTask) +#define TRACE_SET_TASK_FILTER(pxTask, group) prvTraceSetTaskNumberHigh16((void*)pxTask, group) + +#define TRACE_GET_QUEUE_FILTER(pxObject) prvTraceGetQueueNumberHigh16((void*)pxObject) +#define TRACE_SET_QUEUE_FILTER(pxObject, group) prvTraceSetQueueNumberHigh16((void*)pxObject, group) + +#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) +#define TRACE_GET_EVENTGROUP_FILTER(pxObject) prvTraceGetEventGroupNumberHigh16((void*)pxObject) +#define TRACE_SET_EVENTGROUP_FILTER(pxObject, group) prvTraceSetEventGroupNumberHigh16((void*)pxObject, group) +#else /* (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */ +/* FreeRTOS versions before v10.0 does not support filtering for event groups */ +#define TRACE_GET_EVENTGROUP_FILTER(pxObject) 1 +#define TRACE_SET_EVENTGROUP_FILTER(pxObject, group) +#endif /* (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */ + +#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) +#define TRACE_GET_TIMER_FILTER(pxObject) prvTraceGetTimerNumberHigh16((void*)pxObject) +#define TRACE_SET_TIMER_FILTER(pxObject, group) prvTraceSetTimerNumberHigh16((void*)pxObject, group) +#else /* (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */ +/* FreeRTOS versions before v10.0 does not support filtering for timers */ +#define TRACE_GET_TIMER_FILTER(pxObject) 1 +#define TRACE_SET_TIMER_FILTER(pxObject, group) +#endif /* (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */ + +#define TRACE_GET_STREAMBUFFER_FILTER(pxObject) prvTraceGetStreamBufferNumberHigh16((void*)pxObject) +#define TRACE_SET_STREAMBUFFER_FILTER(pxObject, group) prvTraceSetStreamBufferNumberHigh16((void*)pxObject, group) + +/* We can only support filtering if FreeRTOS is at least v8.0 */ +#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X) +#define TRACE_GET_OBJECT_FILTER(CLASS, pxObject) TRACE_GET_##CLASS##_FILTER(pxObject) +#define TRACE_SET_OBJECT_FILTER(CLASS, pxObject, group) TRACE_SET_##CLASS##_FILTER(pxObject, group) +#else /* (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X) */ +#define TRACE_GET_OBJECT_FILTER(CLASS, pxObject) 0xFFFF +#define TRACE_SET_OBJECT_FILTER(CLASS, pxObject, group) +#endif /* (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X) */ + +/* Helpers needed to correctly expand names */ +#define TZ__CAT2(a,b) a ## b +#define TZ__CAT(a,b) TZ__CAT2(a, b) + +/**************************************************************************/ +/* Makes sure xQueueGiveFromISR also has a xCopyPosition parameter */ +/**************************************************************************/ + +/* Expands name if this header is included... uxQueueType must be a macro that only exists in queue.c or whatever, and it must expand to nothing or to something that's valid in identifiers */ +#define xQueueGiveFromISR(a,b) TZ__CAT(xQueueGiveFromISR__, uxQueueType) (a,b) + +/* If in queue.c, the "uxQueueType" macro expands to "pcHead". queueSEND_TO_BACK is the value we need to send in */ +#define xQueueGiveFromISR__pcHead(__a, __b) MyWrapper_xQueueGiveFromISR(__a, __b, const BaseType_t xCopyPosition); \ +BaseType_t xQueueGiveFromISR(__a, __b) { return MyWrapper_xQueueGiveFromISR(xQueue, pxHigherPriorityTaskWoken, queueSEND_TO_BACK); } \ +BaseType_t MyWrapper_xQueueGiveFromISR(__a, __b, const BaseType_t xCopyPosition) + +/* If not in queue.c, "uxQueueType" isn't expanded */ +#define xQueueGiveFromISR__uxQueueType(__a, __b) xQueueGiveFromISR(__a,__b) + +/**************************************************************************/ +/* End of xQueueGiveFromISR fix */ +/**************************************************************************/ + +/******************************************************************************/ +/*** Definitions for Snapshot mode ********************************************/ +/******************************************************************************/ +#if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_SNAPSHOT) + +/*** The object classes *******************************************************/ + +#define TRACE_NCLASSES 9 +#define TRACE_CLASS_QUEUE ((traceObjectClass)0) +#define TRACE_CLASS_SEMAPHORE ((traceObjectClass)1) +#define TRACE_CLASS_MUTEX ((traceObjectClass)2) +#define TRACE_CLASS_TASK ((traceObjectClass)3) +#define TRACE_CLASS_ISR ((traceObjectClass)4) +#define TRACE_CLASS_TIMER ((traceObjectClass)5) +#define TRACE_CLASS_EVENTGROUP ((traceObjectClass)6) +#define TRACE_CLASS_STREAMBUFFER ((traceObjectClass)7) +#define TRACE_CLASS_MESSAGEBUFFER ((traceObjectClass)8) + +/*** Definitions for Object Table ********************************************/ +#define TRACE_KERNEL_OBJECT_COUNT ((TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) + (TRC_CFG_NTASK) + (TRC_CFG_NISR) + (TRC_CFG_NTIMER) + (TRC_CFG_NEVENTGROUP) + (TRC_CFG_NSTREAMBUFFER) + (TRC_CFG_NMESSAGEBUFFER)) + +/* Queue properties (except name): current number of message in queue */ +#define PropertyTableSizeQueue ((TRC_CFG_NAME_LEN_QUEUE) + 1) + +/* Semaphore properties (except name): state (signaled = 1, cleared = 0) */ +#define PropertyTableSizeSemaphore ((TRC_CFG_NAME_LEN_SEMAPHORE) + 1) + +/* Mutex properties (except name): owner (task handle, 0 = free) */ +#define PropertyTableSizeMutex ((TRC_CFG_NAME_LEN_MUTEX) + 1) + +/* Task properties (except name): Byte 0: Current priority + Byte 1: state (if already active) + Byte 2: legacy, not used + Byte 3: legacy, not used */ +#define PropertyTableSizeTask ((TRC_CFG_NAME_LEN_TASK) + 4) + +/* ISR properties: Byte 0: priority + Byte 1: state (if already active) */ +#define PropertyTableSizeISR ((TRC_CFG_NAME_LEN_ISR) + 2) + +/* TRC_CFG_NTIMER properties: Byte 0: state (unused for now) */ +#define PropertyTableSizeTimer ((TRC_CFG_NAME_LEN_TIMER) + 1) + +/* TRC_CFG_NEVENTGROUP properties: Byte 0-3: state (unused for now)*/ +#define PropertyTableSizeEventGroup ((TRC_CFG_NAME_LEN_EVENTGROUP) + 4) + +/* TRC_CFG_NSTREAMBUFFER properties: Byte 0-3: state (unused for now)*/ +#define PropertyTableSizeStreamBuffer ((TRC_CFG_NAME_LEN_STREAMBUFFER) + 4) + +/* TRC_CFG_NMESSAGEBUFFER properties: Byte 0-3: state (unused for now)*/ +#define PropertyTableSizeMessageBuffer ((TRC_CFG_NAME_LEN_MESSAGEBUFFER) + 4) + + +/* The layout of the byte array representing the Object Property Table */ +#define StartIndexQueue (0) +#define StartIndexSemaphore (StartIndexQueue + (TRC_CFG_NQUEUE) * PropertyTableSizeQueue) +#define StartIndexMutex (StartIndexSemaphore + (TRC_CFG_NSEMAPHORE) * PropertyTableSizeSemaphore) +#define StartIndexTask (StartIndexMutex + (TRC_CFG_NMUTEX) * PropertyTableSizeMutex) +#define StartIndexISR (StartIndexTask + (TRC_CFG_NTASK) * PropertyTableSizeTask) +#define StartIndexTimer (StartIndexISR + (TRC_CFG_NISR) * PropertyTableSizeISR) +#define StartIndexEventGroup (StartIndexTimer + (TRC_CFG_NTIMER) * PropertyTableSizeTimer) +#define StartIndexStreamBuffer (StartIndexEventGroup + (TRC_CFG_NEVENTGROUP) * PropertyTableSizeEventGroup) +#define StartIndexMessageBuffer (StartIndexStreamBuffer + (TRC_CFG_NSTREAMBUFFER) * PropertyTableSizeStreamBuffer) + +/* Number of bytes used by the object table */ +#define TRACE_OBJECT_TABLE_SIZE (StartIndexMessageBuffer + (TRC_CFG_NMESSAGEBUFFER) * PropertyTableSizeMessageBuffer) + +/* Flag to tell the context of tracePEND_FUNC_CALL_FROM_ISR */ +extern int uiInEventGroupSetBitsFromISR; + +/* Initialization of the object property table */ +void vTraceInitObjectPropertyTable(void); + +/* Initialization of the handle mechanism, see e.g, prvTraceGetObjectHandle */ +void vTraceInitObjectHandleStack(void); + +/* Returns the "Not enough handles" error message for the specified object class */ +const char* pszTraceGetErrorNotEnoughHandles(traceObjectClass objectclass); + +void* prvTraceGetCurrentTaskHandle(void); + +/****************************************************************************** + * TraceQueueClassTable + * Translates a FreeRTOS QueueType into trace objects classes (TRACE_CLASS_). + * Has one entry for each QueueType, gives TRACE_CLASS ID. + ******************************************************************************/ +extern traceObjectClass TraceQueueClassTable[5]; + + +/*** Event codes for snapshot mode - must match Tracealyzer config files ******/ + +#define NULL_EVENT (0x00UL) + +/******************************************************************************* + * EVENTGROUP_DIV + * + * Miscellaneous events. + ******************************************************************************/ +#define EVENTGROUP_DIV (NULL_EVENT + 1UL) /*0x01*/ +#define DIV_XPS (EVENTGROUP_DIV + 0UL) /*0x01*/ +#define DIV_TASK_READY (EVENTGROUP_DIV + 1UL) /*0x02*/ +#define DIV_NEW_TIME (EVENTGROUP_DIV + 2UL) /*0x03*/ + +/******************************************************************************* + * EVENTGROUP_TS + * + * Events for storing task-switches and interrupts. The RESUME events are + * generated if the task/interrupt is already marked active. + ******************************************************************************/ +#define EVENTGROUP_TS (EVENTGROUP_DIV + 3UL) /*0x04*/ +#define TS_ISR_BEGIN (EVENTGROUP_TS + 0UL) /*0x04*/ +#define TS_ISR_RESUME (EVENTGROUP_TS + 1UL) /*0x05*/ +#define TS_TASK_BEGIN (EVENTGROUP_TS + 2UL) /*0x06*/ +#define TS_TASK_RESUME (EVENTGROUP_TS + 3UL) /*0x07*/ + +/******************************************************************************* + * EVENTGROUP_OBJCLOSE_NAME + * + * About Close Events + * When an object is evicted from the object property table (object close), two + * internal events are stored (EVENTGROUP_OBJCLOSE_NAME and + * EVENTGROUP_OBJCLOSE_PROP), containing the handle-name mapping and object + * properties valid up to this point. + ******************************************************************************/ +#define EVENTGROUP_OBJCLOSE_NAME_TRCSUCCESS (EVENTGROUP_TS + 4UL) /*0x08*/ + +/******************************************************************************* + * EVENTGROUP_OBJCLOSE_PROP + * + * The internal event carrying properties of deleted objects + * The handle and object class of the closed object is not stored in this event, + * but is assumed to be the same as in the preceding CLOSE event. Thus, these + * two events must be generated from within a critical section. + * When queues are closed, arg1 is the "state" property (i.e., number of + * buffered messages/signals). + * When actors are closed, arg1 is priority, arg2 is handle of the "instance + * finish" event, and arg3 is event code of the "instance finish" event. + * In this case, the lower three bits is the object class of the instance finish + * handle. The lower three bits are not used (always zero) when queues are + * closed since the queue type is given in the previous OBJCLOSE_NAME event. + ******************************************************************************/ +#define EVENTGROUP_OBJCLOSE_PROP_TRCSUCCESS (EVENTGROUP_OBJCLOSE_NAME_TRCSUCCESS + 8UL) /*0x10*/ + +/******************************************************************************* + * EVENTGROUP_CREATE + * + * The events in this group are used to log Kernel object creations. + * The lower three bits in the event code gives the object class, i.e., type of + * create operation (task, queue, semaphore, etc). + ******************************************************************************/ +#define EVENTGROUP_CREATE_OBJ_TRCSUCCESS (EVENTGROUP_OBJCLOSE_PROP_TRCSUCCESS + 8UL) /*0x18*/ + +/******************************************************************************* + * EVENTGROUP_SEND + * + * The events in this group are used to log Send/Give events on queues, + * semaphores and mutexes The lower three bits in the event code gives the + * object class, i.e., what type of object that is operated on (queue, semaphore + * or mutex). + ******************************************************************************/ +#define EVENTGROUP_SEND_TRCSUCCESS (EVENTGROUP_CREATE_OBJ_TRCSUCCESS + 8UL) /*0x20*/ + +/******************************************************************************* + * EVENTGROUP_RECEIVE + * + * The events in this group are used to log Receive/Take events on queues, + * semaphores and mutexes. The lower three bits in the event code gives the + * object class, i.e., what type of object that is operated on (queue, semaphore + * or mutex). + ******************************************************************************/ +#define EVENTGROUP_RECEIVE_TRCSUCCESS (EVENTGROUP_SEND_TRCSUCCESS + 8UL) /*0x28*/ + +/* Send/Give operations, from ISR */ +#define EVENTGROUP_SEND_FROM_ISR_TRCSUCCESS \ + (EVENTGROUP_RECEIVE_TRCSUCCESS + 8UL) /*0x30*/ + +/* Receive/Take operations, from ISR */ +#define EVENTGROUP_RECEIVE_FROM_ISR_TRCSUCCESS \ + (EVENTGROUP_SEND_FROM_ISR_TRCSUCCESS + 8UL) /*0x38*/ + +/* "Failed" event type versions of above (timeout, failed allocation, etc) */ +#define EVENTGROUP_KSE_TRCFAILED \ + (EVENTGROUP_RECEIVE_FROM_ISR_TRCSUCCESS + 8UL) /*0x40*/ + +/* Failed create calls - memory allocation failed */ +#define EVENTGROUP_CREATE_OBJ_TRCFAILED (EVENTGROUP_KSE_TRCFAILED) /*0x40*/ + +/* Failed send/give - timeout! */ +#define EVENTGROUP_SEND_TRCFAILED (EVENTGROUP_CREATE_OBJ_TRCFAILED + 8UL) /*0x48*/ + +/* Failed receive/take - timeout! */ +#define EVENTGROUP_RECEIVE_TRCFAILED (EVENTGROUP_SEND_TRCFAILED + 8UL) /*0x50*/ + +/* Failed non-blocking send/give - queue full */ +#define EVENTGROUP_SEND_FROM_ISR_TRCFAILED (EVENTGROUP_RECEIVE_TRCFAILED + 8UL) /*0x58*/ + +/* Failed non-blocking receive/take - queue empty */ +#define EVENTGROUP_RECEIVE_FROM_ISR_TRCFAILED \ + (EVENTGROUP_SEND_FROM_ISR_TRCFAILED + 8UL) /*0x60*/ + +/* Events when blocking on receive/take */ +#define EVENTGROUP_RECEIVE_TRCBLOCK \ + (EVENTGROUP_RECEIVE_FROM_ISR_TRCFAILED + 8UL) /*0x68*/ + +/* Events when blocking on send/give */ +#define EVENTGROUP_SEND_TRCBLOCK (EVENTGROUP_RECEIVE_TRCBLOCK + 8UL) /*0x70*/ + +/* Events on queue peek (receive) */ +#define EVENTGROUP_PEEK_TRCSUCCESS (EVENTGROUP_SEND_TRCBLOCK + 8UL) /*0x78*/ + +/* Events on object delete (vTaskDelete or vQueueDelete) */ +#define EVENTGROUP_DELETE_OBJ_TRCSUCCESS (EVENTGROUP_PEEK_TRCSUCCESS + 8UL) /*0x80*/ + +/* Other events - object class is implied: TASK */ +#define EVENTGROUP_OTHERS (EVENTGROUP_DELETE_OBJ_TRCSUCCESS + 8UL) /*0x88*/ +#define TASK_DELAY_UNTIL (EVENTGROUP_OTHERS + 0UL) /*0x88*/ +#define TASK_DELAY (EVENTGROUP_OTHERS + 1UL) /*0x89*/ +#define TASK_SUSPEND (EVENTGROUP_OTHERS + 2UL) /*0x8A*/ +#define TASK_RESUME (EVENTGROUP_OTHERS + 3UL) /*0x8B*/ +#define TASK_RESUME_FROM_ISR (EVENTGROUP_OTHERS + 4UL) /*0x8C*/ +#define TASK_PRIORITY_SET (EVENTGROUP_OTHERS + 5UL) /*0x8D*/ +#define TASK_PRIORITY_INHERIT (EVENTGROUP_OTHERS + 6UL) /*0x8E*/ +#define TASK_PRIORITY_DISINHERIT (EVENTGROUP_OTHERS + 7UL) /*0x8F*/ + +#define EVENTGROUP_MISC_PLACEHOLDER (EVENTGROUP_OTHERS + 8UL) /*0x90*/ +#define PEND_FUNC_CALL (EVENTGROUP_MISC_PLACEHOLDER+0UL) /*0x90*/ +#define PEND_FUNC_CALL_FROM_ISR (EVENTGROUP_MISC_PLACEHOLDER+1UL) /*0x91*/ +#define PEND_FUNC_CALL_TRCFAILED (EVENTGROUP_MISC_PLACEHOLDER+2UL) /*0x92*/ +#define PEND_FUNC_CALL_FROM_ISR_TRCFAILED (EVENTGROUP_MISC_PLACEHOLDER+3UL) /*0x93*/ +#define MEM_MALLOC_SIZE (EVENTGROUP_MISC_PLACEHOLDER+4UL) /*0x94*/ +#define MEM_MALLOC_ADDR (EVENTGROUP_MISC_PLACEHOLDER+5UL) /*0x95*/ +#define MEM_FREE_SIZE (EVENTGROUP_MISC_PLACEHOLDER+6UL) /*0x96*/ +#define MEM_FREE_ADDR (EVENTGROUP_MISC_PLACEHOLDER+7UL) /*0x97*/ + +/* User events */ +#define EVENTGROUP_USEREVENT (EVENTGROUP_MISC_PLACEHOLDER + 8UL) /*0x98*/ +#define USER_EVENT (EVENTGROUP_USEREVENT + 0UL) + +/* Allow for 0-15 arguments (the number of args is added to event code) */ +#define USER_EVENT_LAST (EVENTGROUP_USEREVENT + 15UL) /*0xA7*/ + +/******************************************************************************* + * XTS Event - eXtended TimeStamp events + * The timestamps used in the recorder are "differential timestamps" (DTS), i.e. + * the time since the last stored event. The DTS fields are either 1 or 2 bytes + * in the other events, depending on the bytes available in the event struct. + * If the time since the last event (the DTS) is larger than allowed for by + * the DTS field of the current event, an XTS event is inserted immediately + * before the original event. The XTS event contains up to 3 additional bytes + * of the DTS value - the higher bytes of the true DTS value. The lower 1-2 + * bytes are stored in the normal DTS field. + * There are two types of XTS events, XTS8 and XTS16. An XTS8 event is stored + * when there is only room for 1 byte (8 bit) DTS data in the original event, + * which means a limit of 0xFF (255UL). The XTS16 is used when the original event + * has a 16 bit DTS field and thereby can handle values up to 0xFFFF (65535UL). + * + * Using a very high frequency time base can result in many XTS events. + * Preferably, the time between two OS ticks should fit in 16 bits, i.e., + * at most 65535. If your time base has a higher frequency, you can define + * the TRACE + ******************************************************************************/ + +#define EVENTGROUP_SYS (EVENTGROUP_USEREVENT + 16UL) /*0xA8*/ +#define XTS8 (EVENTGROUP_SYS + 0UL) /*0xA8*/ +#define XTS16 (EVENTGROUP_SYS + 1UL) /*0xA9*/ +#define EVENT_BEING_WRITTEN (EVENTGROUP_SYS + 2UL) /*0xAA*/ +#define RESERVED_DUMMY_CODE (EVENTGROUP_SYS + 3UL) /*0xAB*/ +#define LOW_POWER_BEGIN (EVENTGROUP_SYS + 4UL) /*0xAC*/ +#define LOW_POWER_END (EVENTGROUP_SYS + 5UL) /*0xAD*/ +#define XID (EVENTGROUP_SYS + 6UL) /*0xAE*/ +#define XTS16L (EVENTGROUP_SYS + 7UL) /*0xAF*/ + +#define EVENTGROUP_TIMER (EVENTGROUP_SYS + 8UL) /*0xB0*/ +#define TIMER_CREATE (EVENTGROUP_TIMER + 0UL) /*0xB0*/ +#define TIMER_START (EVENTGROUP_TIMER + 1UL) /*0xB1*/ +#define TIMER_RST (EVENTGROUP_TIMER + 2UL) /*0xB2*/ +#define TIMER_STOP (EVENTGROUP_TIMER + 3UL) /*0xB3*/ +#define TIMER_CHANGE_PERIOD (EVENTGROUP_TIMER + 4UL) /*0xB4*/ +#define TIMER_DELETE_OBJ (EVENTGROUP_TIMER + 5UL) /*0xB5*/ +#define TIMER_START_FROM_ISR (EVENTGROUP_TIMER + 6UL) /*0xB6*/ +#define TIMER_RESET_FROM_ISR (EVENTGROUP_TIMER + 7UL) /*0xB7*/ +#define TIMER_STOP_FROM_ISR (EVENTGROUP_TIMER + 8UL) /*0xB8*/ + +#define TIMER_CREATE_TRCFAILED (EVENTGROUP_TIMER + 9UL) /*0xB9*/ +#define TIMER_START_TRCFAILED (EVENTGROUP_TIMER + 10UL) /*0xBA*/ +#define TIMER_RESET_TRCFAILED (EVENTGROUP_TIMER + 11UL) /*0xBB*/ +#define TIMER_STOP_TRCFAILED (EVENTGROUP_TIMER + 12UL) /*0xBC*/ +#define TIMER_CHANGE_PERIOD_TRCFAILED (EVENTGROUP_TIMER + 13UL) /*0xBD*/ +#define TIMER_DELETE_TRCFAILED (EVENTGROUP_TIMER + 14UL) /*0xBE*/ +#define TIMER_START_FROM_ISR_TRCFAILED (EVENTGROUP_TIMER + 15UL) /*0xBF*/ +#define TIMER_RESET_FROM_ISR_TRCFAILED (EVENTGROUP_TIMER + 16UL) /*0xC0*/ +#define TIMER_STOP_FROM_ISR_TRCFAILED (EVENTGROUP_TIMER + 17UL) /*0xC1*/ + +#define EVENTGROUP_EG (EVENTGROUP_TIMER + 18UL) /*0xC2*/ +#define EVENT_GROUP_CREATE (EVENTGROUP_EG + 0UL) /*0xC2*/ +#define EVENT_GROUP_CREATE_TRCFAILED (EVENTGROUP_EG + 1UL) /*0xC3*/ +#define EVENT_GROUP_SYNC_TRCBLOCK (EVENTGROUP_EG + 2UL) /*0xC4*/ +#define EVENT_GROUP_SYNC_END (EVENTGROUP_EG + 3UL) /*0xC5*/ +#define EVENT_GROUP_WAIT_BITS_TRCBLOCK (EVENTGROUP_EG + 4UL) /*0xC6*/ +#define EVENT_GROUP_WAIT_BITS_END (EVENTGROUP_EG + 5UL) /*0xC7*/ +#define EVENT_GROUP_CLEAR_BITS (EVENTGROUP_EG + 6UL) /*0xC8*/ +#define EVENT_GROUP_CLEAR_BITS_FROM_ISR (EVENTGROUP_EG + 7UL) /*0xC9*/ +#define EVENT_GROUP_SET_BITS (EVENTGROUP_EG + 8UL) /*0xCA*/ +#define EVENT_GROUP_DELETE_OBJ (EVENTGROUP_EG + 9UL) /*0xCB*/ +#define EVENT_GROUP_SYNC_END_TRCFAILED (EVENTGROUP_EG + 10UL) /*0xCC*/ +#define EVENT_GROUP_WAIT_BITS_END_TRCFAILED (EVENTGROUP_EG + 11UL) /*0xCD*/ +#define EVENT_GROUP_SET_BITS_FROM_ISR (EVENTGROUP_EG + 12UL) /*0xCE*/ +#define EVENT_GROUP_SET_BITS_FROM_ISR_TRCFAILED (EVENTGROUP_EG + 13UL) /*0xCF*/ + +#define TASK_INSTANCE_FINISHED_NEXT_KSE (EVENTGROUP_EG + 14UL) /*0xD0*/ +#define TASK_INSTANCE_FINISHED_DIRECT (EVENTGROUP_EG + 15UL) /*0xD1*/ + +#define TRACE_TASK_NOTIFY_GROUP (EVENTGROUP_EG + 16UL) /*0xD2*/ +#define TRACE_TASK_NOTIFY (TRACE_TASK_NOTIFY_GROUP + 0UL) /*0xD2*/ +#define TRACE_TASK_NOTIFY_TAKE (TRACE_TASK_NOTIFY_GROUP + 1UL) /*0xD3*/ +#define TRACE_TASK_NOTIFY_TAKE_TRCBLOCK (TRACE_TASK_NOTIFY_GROUP + 2UL) /*0xD4*/ +#define TRACE_TASK_NOTIFY_TAKE_TRCFAILED (TRACE_TASK_NOTIFY_GROUP + 3UL) /*0xD5*/ +#define TRACE_TASK_NOTIFY_WAIT (TRACE_TASK_NOTIFY_GROUP + 4UL) /*0xD6*/ +#define TRACE_TASK_NOTIFY_WAIT_TRCBLOCK (TRACE_TASK_NOTIFY_GROUP + 5UL) /*0xD7*/ +#define TRACE_TASK_NOTIFY_WAIT_TRCFAILED (TRACE_TASK_NOTIFY_GROUP + 6UL) /*0xD8*/ +#define TRACE_TASK_NOTIFY_FROM_ISR (TRACE_TASK_NOTIFY_GROUP + 7UL) /*0xD9*/ +#define TRACE_TASK_NOTIFY_GIVE_FROM_ISR (TRACE_TASK_NOTIFY_GROUP + 8UL) /*0xDA*/ + +#define TIMER_EXPIRED (TRACE_TASK_NOTIFY_GROUP + 9UL) /*0xDB*/ + + /* Events on queue peek (receive) */ +#define EVENTGROUP_PEEK_TRCBLOCK (TRACE_TASK_NOTIFY_GROUP + 10UL) /*0xDC*/ +/* peek block on queue: 0xDC */ +/* peek block on semaphore: 0xDD */ +/* peek block on mutex: 0xDE */ + +/* Events on queue peek (receive) */ +#define EVENTGROUP_PEEK_TRCFAILED (EVENTGROUP_PEEK_TRCBLOCK + 3UL) /*0xDF*/ +/* peek failed on queue: 0xDF */ +/* peek failed on semaphore: 0xE0 */ +/* peek failed on mutex: 0xE1 */ + +#define EVENTGROUP_STREAMBUFFER_DIV (EVENTGROUP_PEEK_TRCFAILED + 3UL) /*0xE2*/ +#define TRACE_STREAMBUFFER_RESET (EVENTGROUP_STREAMBUFFER_DIV + 0) /*0xE2*/ +#define TRACE_MESSAGEBUFFER_RESET (EVENTGROUP_STREAMBUFFER_DIV + 1UL) /*0xE3*/ +#define TRACE_STREAMBUFFER_OBJCLOSE_NAME_TRCSUCCESS (EVENTGROUP_STREAMBUFFER_DIV + 2UL) /*0xE4*/ +#define TRACE_MESSAGEBUFFER_OBJCLOSE_NAME_TRCSUCCESS (EVENTGROUP_STREAMBUFFER_DIV + 3UL) /*0xE5*/ +#define TRACE_STREAMBUFFER_OBJCLOSE_PROP_TRCSUCCESS (EVENTGROUP_STREAMBUFFER_DIV + 4UL) /*0xE6*/ +#define TRACE_MESSAGEBUFFER_OBJCLOSE_PROP_TRCSUCCESS (EVENTGROUP_STREAMBUFFER_DIV + 5UL) /*0xE7*/ + +#define EVENTGROUP_MALLOC_FAILED (EVENTGROUP_STREAMBUFFER_DIV + 6UL) /*0xE8*/ +#define MEM_MALLOC_SIZE_TRCFAILED (EVENTGROUP_MALLOC_FAILED + 0UL) /*0xE8*/ +#define MEM_MALLOC_ADDR_TRCFAILED (EVENTGROUP_MALLOC_FAILED + 1UL) /*0xE9*/ + +/* The following are using previously "lost" event codes */ +#define TRACE_STREAMBUFFER_CREATE_OBJ_TRCSUCCESS (EVENTGROUP_CREATE_OBJ_TRCSUCCESS + 4UL) /*0x1C*/ +#define TRACE_STREAMBUFFER_CREATE_OBJ_TRCFAILED (EVENTGROUP_CREATE_OBJ_TRCFAILED + 4UL) /*0x44*/ +#define TRACE_STREAMBUFFER_DELETE_OBJ_TRCSUCCESS (EVENTGROUP_DELETE_OBJ_TRCSUCCESS + 4UL) /*0x84*/ +#define TRACE_STREAMBUFFER_SEND_TRCSUCCESS (EVENTGROUP_SEND_TRCSUCCESS + 3UL) /*0x23*/ +#define TRACE_STREAMBUFFER_SEND_TRCBLOCK (EVENTGROUP_SEND_TRCBLOCK + 3UL) /*0x73*/ +#define TRACE_STREAMBUFFER_SEND_TRCFAILED (EVENTGROUP_SEND_TRCFAILED + 3UL) /*0x4B*/ +#define TRACE_STREAMBUFFER_RECEIVE_TRCSUCCESS (EVENTGROUP_RECEIVE_TRCSUCCESS + 3UL) /*0x2B*/ +#define TRACE_STREAMBUFFER_RECEIVE_TRCBLOCK (EVENTGROUP_RECEIVE_TRCBLOCK + 3UL) /*0x6B*/ +#define TRACE_STREAMBUFFER_RECEIVE_TRCFAILED (EVENTGROUP_RECEIVE_TRCFAILED + 3UL) /*0x53*/ +#define TRACE_STREAMBUFFER_SEND_FROM_ISR_TRCSUCCESS (EVENTGROUP_SEND_FROM_ISR_TRCSUCCESS + 3UL) /*0x33*/ +#define TRACE_STREAMBUFFER_SEND_FROM_ISR_TRCFAILED (EVENTGROUP_SEND_FROM_ISR_TRCFAILED + 3UL) /*0x5B*/ +#define TRACE_STREAMBUFFER_RECEIVE_FROM_ISR_TRCSUCCESS (EVENTGROUP_RECEIVE_FROM_ISR_TRCSUCCESS + 3UL) /*0x3B*/ +#define TRACE_STREAMBUFFER_RECEIVE_FROM_ISR_TRCFAILED (EVENTGROUP_RECEIVE_FROM_ISR_TRCFAILED + 3UL) /*0x63*/ + +/* The following are using previously "lost" event codes. These macros aren't even directly referenced, instead we do (equivalent STREAMBUFFER code) + 1. */ +#define TRACE_MESSAGEBUFFER_CREATE_OBJ_TRCSUCCESS (EVENTGROUP_CREATE_OBJ_TRCSUCCESS + 5UL) /*0x1D*/ +#define TRACE_MESSAGEBUFFER_CREATE_OBJ_TRCFAILED (EVENTGROUP_CREATE_OBJ_TRCFAILED + 5UL) /*0x45*/ +#define TRACE_MESSAGEBUFFER_DELETE_OBJ_TRCSUCCESS (EVENTGROUP_DELETE_OBJ_TRCSUCCESS + 5UL) /*0x85*/ +#define TRACE_MESSAGEBUFFER_SEND_TRCSUCCESS (EVENTGROUP_SEND_TRCSUCCESS + 4UL) /*0x24*/ +#define TRACE_MESSAGEBUFFER_SEND_TRCBLOCK (EVENTGROUP_SEND_TRCBLOCK + 4UL) /*0x74*/ +#define TRACE_MESSAGEBUFFER_SEND_TRCFAILED (EVENTGROUP_SEND_TRCFAILED + 4UL) /*0x4C*/ +#define TRACE_MESSAGEBUFFER_RECEIVE_TRCSUCCESS (EVENTGROUP_RECEIVE_TRCSUCCESS + 4UL) /*0x2C*/ +#define TRACE_MESSAGEBUFFER_RECEIVE_TRCBLOCK (EVENTGROUP_RECEIVE_TRCBLOCK + 4UL) /*0x6C*/ +#define TRACE_MESSAGEBUFFER_RECEIVE_TRCFAILED (EVENTGROUP_RECEIVE_TRCFAILED + 4UL) /*0x54*/ +#define TRACE_MESSAGEBUFFER_SEND_FROM_ISR_TRCSUCCESS (EVENTGROUP_SEND_FROM_ISR_TRCSUCCESS + 4UL) /*0x34*/ +#define TRACE_MESSAGEBUFFER_SEND_FROM_ISR_TRCFAILED (EVENTGROUP_SEND_FROM_ISR_TRCFAILED + 4UL) /*0x5C*/ +#define TRACE_MESSAGEBUFFER_RECEIVE_FROM_ISR_TRCSUCCESS (EVENTGROUP_RECEIVE_FROM_ISR_TRCSUCCESS + 4UL) /*0x3C*/ +#define TRACE_MESSAGEBUFFER_RECEIVE_FROM_ISR_TRCFAILED (EVENTGROUP_RECEIVE_FROM_ISR_TRCFAILED + 4UL) /*0x64*/ + +#define TRACE_QUEUE_SEND_TO_FRONT_TRCSUCCESS (EVENTGROUP_SEND_TRCSUCCESS + 5UL) /*0x25*/ +#define TRACE_QUEUE_SEND_TO_FRONT_TRCBLOCK (EVENTGROUP_SEND_TRCBLOCK + 5UL) /*0x75*/ +#define TRACE_QUEUE_SEND_TO_FRONT_TRCFAILED (EVENTGROUP_SEND_TRCFAILED + 5UL) /*0x4D*/ +#define TRACE_QUEUE_SEND_TO_FRONT_FROM_ISR_TRCSUCCESS (EVENTGROUP_SEND_FROM_ISR_TRCSUCCESS + 5UL) /*0x35*/ +#define TRACE_QUEUE_SEND_TO_FRONT_FROM_ISR_TRCFAILED (EVENTGROUP_SEND_FROM_ISR_TRCFAILED + 5UL) /*0x5D*/ + +#define TRACE_UNUSED_STACK (EVENTGROUP_MALLOC_FAILED + 2UL) /*0xEA*/ + +/* LAST EVENT (0xEA) */ + +/**************************** +* MACROS TO GET TRACE CLASS * +****************************/ +#define TRACE_GET_TRACE_CLASS_FROM_TASK_CLASS(kernelClass) (TRACE_CLASS_TASK) +#define TRACE_GET_TRACE_CLASS_FROM_TASK_OBJECT(pxObject) (TRACE_CLASS_TASK) + +#define TRACE_GET_TRACE_CLASS_FROM_QUEUE_CLASS(kernelClass) TraceQueueClassTable[kernelClass] +#define TRACE_GET_TRACE_CLASS_FROM_QUEUE_OBJECT(pxObject) TRACE_GET_TRACE_CLASS_FROM_QUEUE_CLASS(prvTraceGetQueueType(pxObject)) + +#define TRACE_GET_TRACE_CLASS_FROM_TIMER_CLASS(kernelClass) (TRACE_CLASS_TIMER) +#define TRACE_GET_TRACE_CLASS_FROM_TIMER_OBJECT(pxObject) (TRACE_CLASS_TIMER) + +#define TRACE_GET_TRACE_CLASS_FROM_EVENTGROUP_CLASS(kernelClass) (TRACE_CLASS_EVENTGROUP) +#define TRACE_GET_TRACE_CLASS_FROM_EVENTGROUP_OBJECT(pxObject) (TRACE_CLASS_EVENTGROUP) + +/* TRACE_GET_TRACE_CLASS_FROM_STREAMBUFFER_CLASS can only be accessed with a parameter indicating if it is a MessageBuffer */ +#define TRACE_GET_TRACE_CLASS_FROM_STREAMBUFFER_CLASS(xIsMessageBuffer) (xIsMessageBuffer == 1 ? TRACE_CLASS_MESSAGEBUFFER : TRACE_CLASS_STREAMBUFFER) +#define TRACE_GET_TRACE_CLASS_FROM_STREAMBUFFER_OBJECT(pxObject) (prvGetStreamBufferType(pxObject) == 1 ? TRACE_CLASS_MESSAGEBUFFER : TRACE_CLASS_STREAMBUFFER) + +/* Generic versions */ +#define TRACE_GET_CLASS_TRACE_CLASS(CLASS, kernelClass) TRACE_GET_TRACE_CLASS_FROM_##CLASS##_CLASS(kernelClass) +#define TRACE_GET_OBJECT_TRACE_CLASS(CLASS, pxObject) TRACE_GET_TRACE_CLASS_FROM_##CLASS##_OBJECT(pxObject) + +/****************************** +* MACROS TO GET OBJECT NUMBER * +******************************/ +#define TRACE_GET_TASK_NUMBER(pxTCB) (traceHandle)(prvTraceGetTaskNumberLow16(pxTCB)) +#define TRACE_SET_TASK_NUMBER(pxTCB) prvTraceSetTaskNumberLow16(pxTCB, prvTraceGetObjectHandle(TRACE_GET_OBJECT_TRACE_CLASS(TASK, pxTCB))); + +#define TRACE_GET_QUEUE_NUMBER(queue) ( ( traceHandle ) prvTraceGetQueueNumberLow16(queue) ) +#define TRACE_SET_QUEUE_NUMBER(queue) prvTraceSetQueueNumberLow16(queue, (uint16_t)prvTraceGetObjectHandle(TRACE_GET_OBJECT_TRACE_CLASS(QUEUE, queue))); + +#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) +#define TRACE_GET_TIMER_NUMBER(tmr) ( ( traceHandle ) prvTraceGetTimerNumberLow16(tmr) ) +#define TRACE_SET_TIMER_NUMBER(tmr) prvTraceSetTimerNumberLow16(tmr, (uint16_t)prvTraceGetObjectHandle(TRACE_GET_OBJECT_TRACE_CLASS(TIMER, tmr))); +#else /* (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */ +#define TRACE_GET_TIMER_NUMBER(tmr) ( ( traceHandle ) ((Timer_t*)tmr)->uxTimerNumber ) +#define TRACE_SET_TIMER_NUMBER(tmr) ((Timer_t*)tmr)->uxTimerNumber = prvTraceGetObjectHandle(TRACE_GET_OBJECT_TRACE_CLASS(TIMER, tmr)); +#endif /* (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */ + +#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) +#define TRACE_GET_EVENTGROUP_NUMBER(eg) ( ( traceHandle ) prvTraceGetEventGroupNumberLow16(eg) ) +#define TRACE_SET_EVENTGROUP_NUMBER(eg) prvTraceSetEventGroupNumberLow16(eg, (uint16_t)prvTraceGetObjectHandle(TRACE_GET_OBJECT_TRACE_CLASS(EVENTGROUP, eg))); +#else /* (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */ +#define TRACE_GET_EVENTGROUP_NUMBER(eg) ( ( traceHandle ) uxEventGroupGetNumber(eg) ) +#define TRACE_SET_EVENTGROUP_NUMBER(eg) ((EventGroup_t*)eg)->uxEventGroupNumber = prvTraceGetObjectHandle(TRACE_GET_OBJECT_TRACE_CLASS(EVENTGROUP, eg)); +#endif /* (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */ + + +#define TRACE_GET_STREAMBUFFER_NUMBER(sb) ( ( traceHandle ) prvTraceGetStreamBufferNumberLow16(sb) ) +#define TRACE_SET_STREAMBUFFER_NUMBER(sb) prvTraceSetStreamBufferNumberLow16(sb, (uint16_t)prvTraceGetObjectHandle(TRACE_GET_OBJECT_TRACE_CLASS(STREAMBUFFER, sb))); + +/* Generic versions */ +#define TRACE_GET_OBJECT_NUMBER(CLASS, pxObject) TRACE_GET_##CLASS##_NUMBER(pxObject) +#define TRACE_SET_OBJECT_NUMBER(CLASS, pxObject) TRACE_SET_##CLASS##_NUMBER(pxObject) + +/****************************** +* MACROS TO GET EVENT CODES * +******************************/ +#define TRACE_GET_TASK_CLASS_EVENT_CODE(SERVICE, RESULT, kernelClass) (uint8_t)(EVENTGROUP_##SERVICE##_##RESULT + TRACE_GET_CLASS_TRACE_CLASS(TASK, kernelClass)) +#define TRACE_GET_QUEUE_CLASS_EVENT_CODE(SERVICE, RESULT, kernelClass) (uint8_t)(EVENTGROUP_##SERVICE##_##RESULT + TRACE_GET_CLASS_TRACE_CLASS(QUEUE, kernelClass)) +#define TRACE_GET_TIMER_CLASS_EVENT_CODE(SERVICE, RESULT, kernelClass) -- THIS IS NOT USED -- +#define TRACE_GET_EVENTGROUP_CLASS_EVENT_CODE(SERVICE, RESULT, kernelClass) -- THIS IS NOT USED -- +#define TRACE_GET_STREAMBUFFER_CLASS_EVENT_CODE(SERVICE, RESULT, isMessageBuffer) (uint8_t)(TRACE_STREAMBUFFER_##SERVICE##_##RESULT + (uint8_t)isMessageBuffer) + +#define TRACE_GET_TASK_OBJECT_EVENT_CODE(SERVICE, RESULT, pxTCB) (uint8_t)(EVENTGROUP_##SERVICE##_##RESULT + TRACE_CLASS_TASK) +#define TRACE_GET_QUEUE_OBJECT_EVENT_CODE(SERVICE, RESULT, pxObject) (uint8_t)(EVENTGROUP_##SERVICE##_##RESULT + TRACE_GET_OBJECT_TRACE_CLASS(QUEUE, pxObject)) +#define TRACE_GET_TIMER_OBJECT_EVENT_CODE(SERVICE, RESULT, UNUSED) -- THIS IS NOT USED -- +#define TRACE_GET_EVENTGROUP_OBJECT_EVENT_CODE(SERVICE, RESULT, UNUSED) -- THIS IS NOT USED -- +#define TRACE_GET_STREAMBUFFER_OBJECT_EVENT_CODE(SERVICE, RESULT, pxObject) (uint8_t)(TRACE_STREAMBUFFER_##SERVICE##_##RESULT + prvGetStreamBufferType(pxObject)) + +/* Generic versions */ +#define TRACE_GET_CLASS_EVENT_CODE(SERVICE, RESULT, CLASS, kernelClass) TRACE_GET_##CLASS##_CLASS_EVENT_CODE(SERVICE, RESULT, kernelClass) +#define TRACE_GET_OBJECT_EVENT_CODE(SERVICE, RESULT, CLASS, pxObject) TRACE_GET_##CLASS##_OBJECT_EVENT_CODE(SERVICE, RESULT, pxObject) + +/****************************** +* SPECIAL MACROS FOR TASKS * +******************************/ +#define TRACE_GET_TASK_PRIORITY(pxTCB) ((uint8_t)pxTCB->uxPriority) +#define TRACE_GET_TASK_NAME(pxTCB) ((char*)pxTCB->pcTaskName) + +/*** The trace macros for snapshot mode **************************************/ + +/* A macro that will update the tick count when returning from tickless idle */ +#undef traceINCREASE_TICK_COUNT +#define traceINCREASE_TICK_COUNT( xCount ) + +/* Called for each task that becomes ready */ +#undef traceMOVED_TASK_TO_READY_STATE +#define traceMOVED_TASK_TO_READY_STATE( pxTCB ) \ + trcKERNEL_HOOKS_MOVED_TASK_TO_READY_STATE(pxTCB); + +/* Called on each OS tick. Will call uiPortGetTimestamp to make sure it is called at least once every OS tick. */ +#undef traceTASK_INCREMENT_TICK + +#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_3_0) + +#define traceTASK_INCREMENT_TICK( xTickCount ) \ + if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdTRUE || xPendedTicks == 0) { trcKERNEL_HOOKS_INCREMENT_TICK(); } \ + if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE) { trcKERNEL_HOOKS_NEW_TIME(DIV_NEW_TIME, xTickCount + 1); } + +#elif (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_7_5_X) + +#define traceTASK_INCREMENT_TICK( xTickCount ) \ + if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdTRUE || uxPendedTicks == 0) { trcKERNEL_HOOKS_INCREMENT_TICK(); } \ + if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE) { trcKERNEL_HOOKS_NEW_TIME(DIV_NEW_TIME, xTickCount + 1); } + +#else + +#define traceTASK_INCREMENT_TICK( xTickCount ) \ + if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdTRUE || uxMissedTicks == 0) { trcKERNEL_HOOKS_INCREMENT_TICK(); } \ + if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE) { trcKERNEL_HOOKS_NEW_TIME(DIV_NEW_TIME, xTickCount + 1); } + +#endif + +extern volatile uint32_t uiTraceSystemState; + +/* Called on each task-switch */ +#undef traceTASK_SWITCHED_IN +#define traceTASK_SWITCHED_IN() \ + uiTraceSystemState = TRC_STATE_IN_TASKSWITCH; \ + trcKERNEL_HOOKS_TASK_SWITCH(TRACE_GET_CURRENT_TASK()); \ + uiTraceSystemState = TRC_STATE_IN_APPLICATION; + +/* Called on vTaskCreate */ +#undef traceTASK_CREATE +#define traceTASK_CREATE(pxNewTCB) \ + if (pxNewTCB != NULL) \ + { \ + trcKERNEL_HOOKS_TASK_CREATE(TRACE_GET_OBJECT_EVENT_CODE(CREATE_OBJ, TRCSUCCESS, TASK, pxNewTCB), TASK, pxNewTCB); \ + prvAddTaskToStackMonitor(pxNewTCB); \ + } + +/* Called in vTaskCreate, if it fails (typically if the stack can not be allocated) */ +#undef traceTASK_CREATE_FAILED +#define traceTASK_CREATE_FAILED() \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_NUMERIC_PARAM_ONLY(TRACE_GET_CLASS_EVENT_CODE(CREATE_OBJ, TRCFAILED, TASK, NOT_USED), 0); + +/* Called on vTaskDelete */ +#undef traceTASK_DELETE +#define traceTASK_DELETE( pxTaskToDelete ) \ + { TRACE_ALLOC_CRITICAL_SECTION(); \ + TRACE_ENTER_CRITICAL_SECTION(); \ + trcKERNEL_HOOKS_TASK_DELETE(TRACE_GET_OBJECT_EVENT_CODE(DELETE_OBJ, TRCSUCCESS, TASK, pxTaskToDelete), TRACE_GET_OBJECT_EVENT_CODE(OBJCLOSE_NAME, TRCSUCCESS, TASK, pxTaskToDelete), TRACE_GET_OBJECT_EVENT_CODE(OBJCLOSE_PROP, TRCSUCCESS, TASK, pxTaskToDelete), pxTaskToDelete); \ + prvRemoveTaskFromStackMonitor(pxTaskToDelete); \ + TRACE_EXIT_CRITICAL_SECTION(); } + +#if (TRC_CFG_SCHEDULING_ONLY == 0) + +#if defined(configUSE_TICKLESS_IDLE) +#if (configUSE_TICKLESS_IDLE != 0) + +#undef traceLOW_POWER_IDLE_BEGIN +#define traceLOW_POWER_IDLE_BEGIN() \ + { \ + extern uint32_t trace_disable_timestamp; \ + prvTraceStoreLowPower(0); \ + trace_disable_timestamp = 1; \ + } + +#undef traceLOW_POWER_IDLE_END +#define traceLOW_POWER_IDLE_END() \ + { \ + extern uint32_t trace_disable_timestamp; \ + trace_disable_timestamp = 0; \ + prvTraceStoreLowPower(1); \ + } + +#endif /* (configUSE_TICKLESS_IDLE != 0) */ +#endif /* defined(configUSE_TICKLESS_IDLE) */ + +/* Called on vTaskSuspend */ +#undef traceTASK_SUSPEND +#define traceTASK_SUSPEND( pxTaskToSuspend ) \ + trcKERNEL_HOOKS_TASK_SUSPEND(TASK_SUSPEND, pxTaskToSuspend); + +/* Called from special case with timer only */ +#undef traceTASK_DELAY_SUSPEND +#define traceTASK_DELAY_SUSPEND( pxTaskToSuspend ) \ + trcKERNEL_HOOKS_TASK_SUSPEND(TASK_SUSPEND, pxTaskToSuspend); \ + trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED(); + +/* Called on vTaskDelay - note the use of FreeRTOS variable xTicksToDelay */ +#undef traceTASK_DELAY +#define traceTASK_DELAY() \ + trcKERNEL_HOOKS_TASK_DELAY(TASK_DELAY, pxCurrentTCB, xTicksToDelay); \ + trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED(); + +/* Called on vTaskDelayUntil - note the use of FreeRTOS variable xTimeToWake */ +#undef traceTASK_DELAY_UNTIL +#if TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0 +#define traceTASK_DELAY_UNTIL(xTimeToWake) \ + trcKERNEL_HOOKS_TASK_DELAY(TASK_DELAY_UNTIL, pxCurrentTCB, xTimeToWake); \ + trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED(); +#else /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0 */ +#define traceTASK_DELAY_UNTIL() \ + trcKERNEL_HOOKS_TASK_DELAY(TASK_DELAY_UNTIL, pxCurrentTCB, xTimeToWake); \ + trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED(); +#endif /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0 */ + +/* Called in xQueueCreate, and thereby for all other object based on queues, such as semaphores. */ +#undef traceQUEUE_CREATE +#define traceQUEUE_CREATE( pxNewQueue ) \ + trcKERNEL_HOOKS_OBJECT_CREATE(TRACE_GET_OBJECT_EVENT_CODE(CREATE_OBJ, TRCSUCCESS, QUEUE, pxNewQueue), QUEUE, pxNewQueue); + +/* Called in xQueueCreate, if the queue creation fails */ +#undef traceQUEUE_CREATE_FAILED +#define traceQUEUE_CREATE_FAILED( queueType ) \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_NUMERIC_PARAM_ONLY(TRACE_GET_CLASS_EVENT_CODE(CREATE_OBJ, TRCFAILED, QUEUE, queueType), 0); + +/* Called on vQueueDelete */ +#undef traceQUEUE_DELETE +#define traceQUEUE_DELETE( pxQueue ) \ + { TRACE_ALLOC_CRITICAL_SECTION(); \ + TRACE_ENTER_CRITICAL_SECTION(); \ + trcKERNEL_HOOKS_OBJECT_DELETE(TRACE_GET_OBJECT_EVENT_CODE(DELETE_OBJ, TRCSUCCESS, QUEUE, pxQueue), TRACE_GET_OBJECT_EVENT_CODE(OBJCLOSE_NAME, TRCSUCCESS, QUEUE, pxQueue), TRACE_GET_OBJECT_EVENT_CODE(OBJCLOSE_PROP, TRCSUCCESS, QUEUE, pxQueue), QUEUE, pxQueue); \ + TRACE_EXIT_CRITICAL_SECTION(); } + +/* This macro is not necessary as of FreeRTOS v9.0.0 */ +#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_9_0_0) +/* Called in xQueueCreateMutex, and thereby also from xSemaphoreCreateMutex and xSemaphoreCreateRecursiveMutex */ +#undef traceCREATE_MUTEX +#define traceCREATE_MUTEX( pxNewQueue ) \ + trcKERNEL_HOOKS_OBJECT_CREATE(TRACE_GET_OBJECT_EVENT_CODE(CREATE_OBJ, TRCSUCCESS, QUEUE, pxNewQueue), QUEUE, pxNewQueue); + +/* Called in xQueueCreateMutex when the operation fails (when memory allocation fails) */ +#undef traceCREATE_MUTEX_FAILED +#define traceCREATE_MUTEX_FAILED() \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_NUMERIC_PARAM_ONLY(TRACE_GET_CLASS_EVENT_CODE(CREATE_OBJ, TRCFAILED, QUEUE, queueQUEUE_TYPE_MUTEX), 0); +#endif /* (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_9_0_0) */ + +/* Called when the Mutex can not be given, since not holder */ +#undef traceGIVE_MUTEX_RECURSIVE_FAILED +#define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ) \ + trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(SEND, TRCFAILED, QUEUE, pxMutex), QUEUE, pxMutex); + +/* Called when a message is sent to a queue */ /* CS IS NEW ! */ +#undef traceQUEUE_SEND +#define traceQUEUE_SEND( pxQueue ) \ + trcKERNEL_HOOKS_KERNEL_SERVICE(xCopyPosition == queueSEND_TO_BACK ? (TRACE_GET_OBJECT_EVENT_CODE(SEND, TRCSUCCESS, QUEUE, pxQueue)) : TRACE_QUEUE_SEND_TO_FRONT_TRCSUCCESS, QUEUE, pxQueue); \ + trcKERNEL_HOOKS_SET_OBJECT_STATE(QUEUE, pxQueue, TRACE_GET_OBJECT_TRACE_CLASS(QUEUE, pxQueue) == TRACE_CLASS_MUTEX ? (uint8_t)0 : (uint8_t)(pxQueue->uxMessagesWaiting + 1)); + +/* Called when a message is sent to a queue set */ +#undef traceQUEUE_SET_SEND +#define traceQUEUE_SET_SEND( pxQueue ) \ + trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(SEND, TRCSUCCESS, QUEUE, pxQueue), QUEUE, pxQueue); \ + trcKERNEL_HOOKS_SET_OBJECT_STATE(QUEUE, pxQueue, (uint8_t)(pxQueue->uxMessagesWaiting + 1)); + +/* Called when a message failed to be sent to a queue (timeout) */ +#undef traceQUEUE_SEND_FAILED +#define traceQUEUE_SEND_FAILED( pxQueue ) \ + trcKERNEL_HOOKS_KERNEL_SERVICE(xCopyPosition == queueSEND_TO_BACK ? (TRACE_GET_OBJECT_EVENT_CODE(SEND, TRCFAILED, QUEUE, pxQueue)) : TRACE_QUEUE_SEND_TO_FRONT_TRCFAILED, QUEUE, pxQueue); + +/* Called when the task is blocked due to a send operation on a full queue */ +#undef traceBLOCKING_ON_QUEUE_SEND +#define traceBLOCKING_ON_QUEUE_SEND( pxQueue ) \ + trcKERNEL_HOOKS_KERNEL_SERVICE(xCopyPosition == queueSEND_TO_BACK ? (TRACE_GET_OBJECT_EVENT_CODE(SEND, TRCBLOCK, QUEUE, pxQueue)) : TRACE_QUEUE_SEND_TO_FRONT_TRCBLOCK, QUEUE, pxQueue); + +/* Called when a message is received from a queue */ +#undef traceQUEUE_RECEIVE +#define traceQUEUE_RECEIVE( pxQueue ) \ + if (isQueueReceiveHookActuallyPeek) \ + { \ + trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(PEEK, TRCSUCCESS, QUEUE, pxQueue), QUEUE, pxQueue); \ + } \ + else \ + { \ + trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(RECEIVE, TRCSUCCESS, QUEUE, pxQueue), QUEUE, pxQueue); \ + } \ + trcKERNEL_HOOKS_SET_OBJECT_STATE(QUEUE, pxQueue, TRACE_GET_OBJECT_TRACE_CLASS(QUEUE, pxQueue) == TRACE_CLASS_MUTEX ? (uint8_t)TRACE_GET_TASK_NUMBER(TRACE_GET_CURRENT_TASK()) : (uint8_t)(pxQueue->uxMessagesWaiting - 1)); + +/* Called when a receive operation on a queue fails (timeout) */ +#undef traceQUEUE_RECEIVE_FAILED +#define traceQUEUE_RECEIVE_FAILED( pxQueue ) \ + if (isQueueReceiveHookActuallyPeek) \ + { \ + trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(PEEK, TRCFAILED, QUEUE, pxQueue), QUEUE, pxQueue); \ + } \ + else \ + { \ + trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(RECEIVE, TRCFAILED, QUEUE, pxQueue), QUEUE, pxQueue); \ + } + +/* Called when the task is blocked due to a receive operation on an empty queue */ +#undef traceBLOCKING_ON_QUEUE_RECEIVE +#define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ) \ + if (isQueueReceiveHookActuallyPeek) \ + { \ + trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(PEEK, TRCBLOCK, QUEUE, pxQueue), QUEUE, pxQueue); \ + } \ + else \ + { \ + trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(RECEIVE, TRCBLOCK, QUEUE, pxQueue), QUEUE, pxQueue); \ + } \ + if (TRACE_GET_OBJECT_TRACE_CLASS(QUEUE, pxQueue) != TRACE_CLASS_MUTEX) \ + { \ + trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED(); \ + } + +/* Called on xQueuePeek */ +#undef traceQUEUE_PEEK +#define traceQUEUE_PEEK( pxQueue ) \ + trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(PEEK, TRCSUCCESS, QUEUE, pxQueue), QUEUE, pxQueue); + +/* Called on xQueuePeek fail/timeout (added in FreeRTOS v9.0.2) */ +#undef traceQUEUE_PEEK_FAILED +#define traceQUEUE_PEEK_FAILED( pxQueue ) \ + trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(PEEK, TRCFAILED, QUEUE, pxQueue), QUEUE, pxQueue); + +/* Called on xQueuePeek blocking (added in FreeRTOS v9.0.2) */ +#undef traceBLOCKING_ON_QUEUE_PEEK +#define traceBLOCKING_ON_QUEUE_PEEK( pxQueue ) \ + trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(PEEK, TRCBLOCK, QUEUE, pxQueue), QUEUE, pxQueue); \ + if (TRACE_GET_OBJECT_TRACE_CLASS(QUEUE, pxQueue) != TRACE_CLASS_MUTEX) \ + { \ + trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED(); \ + } + +/* Called when a message is sent from interrupt context, e.g., using xQueueSendFromISR */ +#undef traceQUEUE_SEND_FROM_ISR +#define traceQUEUE_SEND_FROM_ISR( pxQueue ) \ + trcKERNEL_HOOKS_KERNEL_SERVICE_FROM_ISR(xCopyPosition == queueSEND_TO_BACK ? (TRACE_GET_OBJECT_EVENT_CODE(SEND_FROM_ISR, TRCSUCCESS, QUEUE, pxQueue)) : TRACE_QUEUE_SEND_TO_FRONT_FROM_ISR_TRCSUCCESS, QUEUE, pxQueue); \ + trcKERNEL_HOOKS_SET_OBJECT_STATE(QUEUE, pxQueue, (uint8_t)(pxQueue->uxMessagesWaiting + 1)); + +/* Called when a message send from interrupt context fails (since the queue was full) */ +#undef traceQUEUE_SEND_FROM_ISR_FAILED +#define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) \ + trcKERNEL_HOOKS_KERNEL_SERVICE_FROM_ISR(xCopyPosition == queueSEND_TO_BACK ? (TRACE_GET_OBJECT_EVENT_CODE(SEND_FROM_ISR, TRCFAILED, QUEUE, pxQueue)) : TRACE_QUEUE_SEND_TO_FRONT_FROM_ISR_TRCFAILED, QUEUE, pxQueue); + +/* Called when a message is received in interrupt context, e.g., using xQueueReceiveFromISR */ +#undef traceQUEUE_RECEIVE_FROM_ISR +#define traceQUEUE_RECEIVE_FROM_ISR( pxQueue ) \ + trcKERNEL_HOOKS_KERNEL_SERVICE_FROM_ISR(TRACE_GET_OBJECT_EVENT_CODE(RECEIVE_FROM_ISR, TRCSUCCESS, QUEUE, pxQueue), QUEUE, pxQueue); \ + trcKERNEL_HOOKS_SET_OBJECT_STATE(QUEUE, pxQueue, (uint8_t)(pxQueue->uxMessagesWaiting - 1)); + +/* Called when a message receive from interrupt context fails (since the queue was empty) */ +#undef traceQUEUE_RECEIVE_FROM_ISR_FAILED +#define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) \ + trcKERNEL_HOOKS_KERNEL_SERVICE_FROM_ISR(TRACE_GET_OBJECT_EVENT_CODE(RECEIVE_FROM_ISR, TRCFAILED, QUEUE, pxQueue), QUEUE, pxQueue); + +#undef traceQUEUE_REGISTRY_ADD +#define traceQUEUE_REGISTRY_ADD(object, name) prvTraceSetObjectName(TRACE_GET_OBJECT_TRACE_CLASS(QUEUE, object), TRACE_GET_OBJECT_NUMBER(QUEUE, object), name); + +/* Called in vTaskPrioritySet */ +#undef traceTASK_PRIORITY_SET +#define traceTASK_PRIORITY_SET( pxTask, uxNewPriority ) \ + trcKERNEL_HOOKS_TASK_PRIORITY_CHANGE(TASK_PRIORITY_SET, pxTask, uxNewPriority); + +/* Called in vTaskPriorityInherit, which is called by Mutex operations */ +#undef traceTASK_PRIORITY_INHERIT +#define traceTASK_PRIORITY_INHERIT( pxTask, uxNewPriority ) \ + trcKERNEL_HOOKS_TASK_PRIORITY_CHANGE(TASK_PRIORITY_INHERIT, pxTask, uxNewPriority); + +/* Called in vTaskPriorityDisinherit, which is called by Mutex operations */ +#undef traceTASK_PRIORITY_DISINHERIT +#define traceTASK_PRIORITY_DISINHERIT( pxTask, uxNewPriority ) \ + trcKERNEL_HOOKS_TASK_PRIORITY_CHANGE(TASK_PRIORITY_DISINHERIT, pxTask, uxNewPriority); + +/* Called in vTaskResume */ +#undef traceTASK_RESUME +#define traceTASK_RESUME( pxTaskToResume ) \ + trcKERNEL_HOOKS_TASK_RESUME(TASK_RESUME, pxTaskToResume); + +/* Called in vTaskResumeFromISR */ +#undef traceTASK_RESUME_FROM_ISR +#define traceTASK_RESUME_FROM_ISR( pxTaskToResume ) \ + trcKERNEL_HOOKS_TASK_RESUME_FROM_ISR(TASK_RESUME_FROM_ISR, pxTaskToResume); + + +#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X) + +#if (TRC_CFG_INCLUDE_MEMMANG_EVENTS == 1) + +extern void vTraceStoreMemMangEvent(uint32_t ecode, uint32_t address, int32_t size); + +/* MALLOC and FREE are always stored, no matter if they happen inside filtered task */ +#undef traceMALLOC +#define traceMALLOC( pvAddress, uiSize ) \ + if (pvAddress != 0) \ + { \ + vTraceStoreMemMangEvent(MEM_MALLOC_SIZE, ( uint32_t ) pvAddress, (int32_t)uiSize); \ + } \ + else \ + { \ + vTraceStoreMemMangEvent(MEM_MALLOC_SIZE_TRCFAILED, ( uint32_t ) pvAddress, (int32_t)uiSize); \ + } + +#undef traceFREE +#define traceFREE( pvAddress, uiSize ) \ + vTraceStoreMemMangEvent(MEM_FREE_SIZE, ( uint32_t ) pvAddress, -((int32_t)uiSize)); + +#endif /* (TRC_CFG_INCLUDE_MEMMANG_EVENTS == 1) */ + +#if (TRC_CFG_INCLUDE_TIMER_EVENTS == 1) + +/* Called in timer.c - xTimerCreate */ +#undef traceTIMER_CREATE +#define traceTIMER_CREATE(tmr) \ + trcKERNEL_HOOKS_OBJECT_CREATE(TIMER_CREATE, TIMER, tmr); + +#undef traceTIMER_CREATE_FAILED +#define traceTIMER_CREATE_FAILED() \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_NUMERIC_PARAM_ONLY(TIMER_CREATE_TRCFAILED, 0); + +/* Note that xCommandID can never be tmrCOMMAND_EXECUTE_CALLBACK (-1) since the trace macro is not called in that case */ +#undef traceTIMER_COMMAND_SEND +#define traceTIMER_COMMAND_SEND(tmr, xCommandID, xOptionalValue, xReturn) \ + if (xCommandID > tmrCOMMAND_START_DONT_TRACE) \ + { \ + if (xCommandID == tmrCOMMAND_CHANGE_PERIOD) \ + { \ + if (xReturn == pdPASS) { \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(TIMER_CHANGE_PERIOD, TIMER, tmr, xOptionalValue); \ + } \ + else \ + { \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(TIMER_CHANGE_PERIOD_TRCFAILED, TIMER, tmr, xOptionalValue); \ + } \ + } \ + else if ((xCommandID == tmrCOMMAND_DELETE) && (xReturn == pdPASS)) \ + { \ + trcKERNEL_HOOKS_OBJECT_DELETE(TIMER_DELETE_OBJ, EVENTGROUP_OBJCLOSE_NAME_TRCSUCCESS + TRACE_GET_OBJECT_TRACE_CLASS(TIMER, tmr), EVENTGROUP_OBJCLOSE_PROP_TRCSUCCESS + TRACE_GET_OBJECT_TRACE_CLASS(TIMER, tmr), TIMER, tmr); \ + } \ + else \ + { \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(EVENTGROUP_TIMER + (uint32_t)xCommandID + ((xReturn == pdPASS) ? 0 : (TIMER_CREATE_TRCFAILED - TIMER_CREATE)), TIMER, tmr, xOptionalValue); \ + }\ + } + +#undef traceTIMER_EXPIRED +#define traceTIMER_EXPIRED(tmr) \ + trcKERNEL_HOOKS_KERNEL_SERVICE(TIMER_EXPIRED, TIMER, tmr); + +#endif /* (TRC_CFG_INCLUDE_TIMER_EVENTS == 1) */ + +#if (TRC_CFG_INCLUDE_PEND_FUNC_CALL_EVENTS == 1) + +#undef tracePEND_FUNC_CALL +#define tracePEND_FUNC_CALL(func, arg1, arg2, ret) \ + if (ret == pdPASS){ \ + trcKERNEL_HOOKS_KERNEL_SERVICE(PEND_FUNC_CALL, TASK, xTimerGetTimerDaemonTaskHandle() ); \ + } \ + else \ + { \ + trcKERNEL_HOOKS_KERNEL_SERVICE(PEND_FUNC_CALL_TRCFAILED, TASK, xTimerGetTimerDaemonTaskHandle() ); \ + } + +#undef tracePEND_FUNC_CALL_FROM_ISR +#define tracePEND_FUNC_CALL_FROM_ISR(func, arg1, arg2, ret) \ + if (! uiInEventGroupSetBitsFromISR) \ + prvTraceStoreKernelCall(PEND_FUNC_CALL_FROM_ISR, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(xTimerGetTimerDaemonTaskHandle()) ); \ + uiInEventGroupSetBitsFromISR = 0; + +#endif /* (TRC_CFG_INCLUDE_PEND_FUNC_CALL_EVENTS == 1) */ + +#endif /* (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X) */ + +#if (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1) + +#undef traceEVENT_GROUP_CREATE +#define traceEVENT_GROUP_CREATE(eg) \ + trcKERNEL_HOOKS_OBJECT_CREATE(EVENT_GROUP_CREATE, EVENTGROUP, eg); + +#undef traceEVENT_GROUP_CREATE_FAILED +#define traceEVENT_GROUP_CREATE_FAILED() \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_NUMERIC_PARAM_ONLY(EVENT_GROUP_CREATE_TRCFAILED, 0); + +#undef traceEVENT_GROUP_DELETE +#define traceEVENT_GROUP_DELETE(eg) \ + { TRACE_ALLOC_CRITICAL_SECTION(); \ + TRACE_ENTER_CRITICAL_SECTION(); \ + trcKERNEL_HOOKS_OBJECT_DELETE(EVENT_GROUP_DELETE_OBJ, EVENTGROUP_OBJCLOSE_NAME_TRCSUCCESS + TRACE_GET_OBJECT_TRACE_CLASS(EVENTGROUP, eg), EVENTGROUP_OBJCLOSE_NAME_TRCSUCCESS + TRACE_GET_OBJECT_TRACE_CLASS(EVENTGROUP, eg), EVENTGROUP, eg); \ + TRACE_EXIT_CRITICAL_SECTION(); } + +#undef traceEVENT_GROUP_SYNC_BLOCK +#define traceEVENT_GROUP_SYNC_BLOCK(eg, bitsToSet, bitsToWaitFor) \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(EVENT_GROUP_SYNC_TRCBLOCK, EVENTGROUP, eg, bitsToWaitFor); + +#undef traceEVENT_GROUP_SYNC_END +#define traceEVENT_GROUP_SYNC_END(eg, bitsToSet, bitsToWaitFor, wasTimeout) \ + if (wasTimeout) \ + { \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(EVENT_GROUP_SYNC_END_TRCFAILED, EVENTGROUP, eg, bitsToWaitFor); \ + } \ + else \ + { \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(EVENT_GROUP_SYNC_END, EVENTGROUP, eg, bitsToWaitFor); \ + } + +#undef traceEVENT_GROUP_WAIT_BITS_BLOCK +#define traceEVENT_GROUP_WAIT_BITS_BLOCK(eg, bitsToWaitFor) \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(EVENT_GROUP_WAIT_BITS_TRCBLOCK, EVENTGROUP, eg, bitsToWaitFor); \ + trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED(); + +#undef traceEVENT_GROUP_WAIT_BITS_END +#define traceEVENT_GROUP_WAIT_BITS_END(eg, bitsToWaitFor, wasTimeout) \ + if (wasTimeout) \ + { \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(EVENT_GROUP_WAIT_BITS_END_TRCFAILED, EVENTGROUP, eg, bitsToWaitFor); \ + } \ + else \ + { \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(EVENT_GROUP_WAIT_BITS_END, EVENTGROUP, eg, bitsToWaitFor); \ + } + +#undef traceEVENT_GROUP_CLEAR_BITS +#define traceEVENT_GROUP_CLEAR_BITS(eg, bitsToClear) \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(EVENT_GROUP_CLEAR_BITS, EVENTGROUP, eg, bitsToClear); + +#undef traceEVENT_GROUP_CLEAR_BITS_FROM_ISR +#define traceEVENT_GROUP_CLEAR_BITS_FROM_ISR(eg, bitsToClear) \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM_FROM_ISR(EVENT_GROUP_CLEAR_BITS_FROM_ISR, EVENTGROUP, eg, bitsToClear); + +#undef traceEVENT_GROUP_SET_BITS +#define traceEVENT_GROUP_SET_BITS(eg, bitsToSet) \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(EVENT_GROUP_SET_BITS, EVENTGROUP, eg, bitsToSet); + +#undef traceEVENT_GROUP_SET_BITS_FROM_ISR +#define traceEVENT_GROUP_SET_BITS_FROM_ISR(eg, bitsToSet) \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM_FROM_ISR(EVENT_GROUP_SET_BITS_FROM_ISR, EVENTGROUP, eg, bitsToSet); \ + uiInEventGroupSetBitsFromISR = 1; + +#endif /* (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1) */ + +#undef traceTASK_NOTIFY_TAKE +#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_9_0_0) +#define traceTASK_NOTIFY_TAKE() \ + if (pxCurrentTCB->eNotifyState == eNotified){ \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(TRACE_TASK_NOTIFY_TAKE, TASK, pxCurrentTCB, xTicksToWait); \ + } \ + else{ \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(TRACE_TASK_NOTIFY_TAKE_TRCFAILED, TASK, pxCurrentTCB, xTicksToWait); \ + } +#elif (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0) +#define traceTASK_NOTIFY_TAKE() \ + if (pxCurrentTCB->ucNotifyState == taskNOTIFICATION_RECEIVED){ \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(TRACE_TASK_NOTIFY_TAKE, TASK, pxCurrentTCB, xTicksToWait); \ + }else{ \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(TRACE_TASK_NOTIFY_TAKE_TRCFAILED, TASK, pxCurrentTCB, xTicksToWait);} +#else /* TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_9_0_0 */ +#define traceTASK_NOTIFY_TAKE(index) \ + if (pxCurrentTCB->ucNotifyState[index] == taskNOTIFICATION_RECEIVED){ \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(TRACE_TASK_NOTIFY_TAKE, TASK, pxCurrentTCB, xTicksToWait); \ + }else{ \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(TRACE_TASK_NOTIFY_TAKE_TRCFAILED, TASK, pxCurrentTCB, xTicksToWait);} +#endif /* TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_9_0_0 */ + +#undef traceTASK_NOTIFY_TAKE_BLOCK +#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0) +#define traceTASK_NOTIFY_TAKE_BLOCK() \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(TRACE_TASK_NOTIFY_TAKE_TRCBLOCK, TASK, pxCurrentTCB, xTicksToWait); \ + trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED(); +#else /* TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0 */ +#define traceTASK_NOTIFY_TAKE_BLOCK(index) \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(TRACE_TASK_NOTIFY_TAKE_TRCBLOCK, TASK, pxCurrentTCB, xTicksToWait); \ + trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED(); +#endif /* TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0 */ + +#undef traceTASK_NOTIFY_WAIT +#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_9_0_0) +#define traceTASK_NOTIFY_WAIT() \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxCurrentTCB) & CurrentFilterMask) \ + { \ + if (pxCurrentTCB->eNotifyState == eNotified) \ + prvTraceStoreKernelCallWithParam(TRACE_TASK_NOTIFY_WAIT, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxCurrentTCB), xTicksToWait); \ + else \ + prvTraceStoreKernelCallWithParam(TRACE_TASK_NOTIFY_WAIT_TRCFAILED, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxCurrentTCB), xTicksToWait); \ + } +#elif (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0) +#define traceTASK_NOTIFY_WAIT() \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxCurrentTCB) & CurrentFilterMask) \ + { \ + if (pxCurrentTCB->ucNotifyState == taskNOTIFICATION_RECEIVED) \ + prvTraceStoreKernelCallWithParam(TRACE_TASK_NOTIFY_WAIT, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxCurrentTCB), xTicksToWait); \ + else \ + prvTraceStoreKernelCallWithParam(TRACE_TASK_NOTIFY_WAIT_TRCFAILED, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxCurrentTCB), xTicksToWait); \ + } +#else /* TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_9_0_0 */ +#define traceTASK_NOTIFY_WAIT(index) \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxCurrentTCB) & CurrentFilterMask) \ + { \ + if (pxCurrentTCB->ucNotifyState[index] == taskNOTIFICATION_RECEIVED) \ + prvTraceStoreKernelCallWithParam(TRACE_TASK_NOTIFY_WAIT, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxCurrentTCB), xTicksToWait); \ + else \ + prvTraceStoreKernelCallWithParam(TRACE_TASK_NOTIFY_WAIT_TRCFAILED, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxCurrentTCB), xTicksToWait); \ + } +#endif /* TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_9_0_0 */ + +#undef traceTASK_NOTIFY_WAIT_BLOCK +#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0) +#define traceTASK_NOTIFY_WAIT_BLOCK() \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxCurrentTCB) & CurrentFilterMask) \ + prvTraceStoreKernelCallWithParam(TRACE_TASK_NOTIFY_WAIT_TRCBLOCK, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxCurrentTCB), xTicksToWait); \ + trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED(); +#else /* TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0 */ +#define traceTASK_NOTIFY_WAIT_BLOCK(index) \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxCurrentTCB) & CurrentFilterMask) \ + prvTraceStoreKernelCallWithParam(TRACE_TASK_NOTIFY_WAIT_TRCBLOCK, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxCurrentTCB), xTicksToWait); \ + trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED(); +#endif /* TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0 */ + +#undef traceTASK_NOTIFY +#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0) +#define traceTASK_NOTIFY() \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(TASK, xTaskToNotify) & CurrentFilterMask) \ + prvTraceStoreKernelCall(TRACE_TASK_NOTIFY, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(xTaskToNotify)); +#else /* TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0 */ +#define traceTASK_NOTIFY(index) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(TASK, xTaskToNotify) & CurrentFilterMask) \ + prvTraceStoreKernelCall(TRACE_TASK_NOTIFY, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(xTaskToNotify)); +#endif /* TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0 */ + +#undef traceTASK_NOTIFY_FROM_ISR +#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0) +#define traceTASK_NOTIFY_FROM_ISR() \ + if (TRACE_GET_OBJECT_FILTER(TASK, xTaskToNotify) & CurrentFilterMask) \ + prvTraceStoreKernelCall(TRACE_TASK_NOTIFY_FROM_ISR, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(xTaskToNotify)); +#else /* TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0 */ +#define traceTASK_NOTIFY_FROM_ISR(index) \ + if (TRACE_GET_OBJECT_FILTER(TASK, xTaskToNotify) & CurrentFilterMask) \ + prvTraceStoreKernelCall(TRACE_TASK_NOTIFY_FROM_ISR, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(xTaskToNotify)); +#endif /* TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0 */ + +#undef traceTASK_NOTIFY_GIVE_FROM_ISR +#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0) +#define traceTASK_NOTIFY_GIVE_FROM_ISR() \ + if (TRACE_GET_OBJECT_FILTER(TASK, xTaskToNotify) & CurrentFilterMask) \ + prvTraceStoreKernelCall(TRACE_TASK_NOTIFY_GIVE_FROM_ISR, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(xTaskToNotify)); +#else /* TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0 */ +#define traceTASK_NOTIFY_GIVE_FROM_ISR(index) \ + if (TRACE_GET_OBJECT_FILTER(TASK, xTaskToNotify) & CurrentFilterMask) \ + prvTraceStoreKernelCall(TRACE_TASK_NOTIFY_GIVE_FROM_ISR, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(xTaskToNotify)); +#endif /* TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0 */ + +#if (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1) + +#undef traceSTREAM_BUFFER_CREATE +#define traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer ) \ + trcKERNEL_HOOKS_OBJECT_CREATE(TRACE_GET_OBJECT_EVENT_CODE(CREATE_OBJ, TRCSUCCESS, STREAMBUFFER, pxStreamBuffer), STREAMBUFFER, pxStreamBuffer); + +#undef traceSTREAM_BUFFER_CREATE_FAILED +#define traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ) \ + trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_NUMERIC_PARAM_ONLY(TRACE_GET_CLASS_EVENT_CODE(CREATE_OBJ, TRCFAILED, STREAMBUFFER, xIsMessageBuffer), 0); + +#undef traceSTREAM_BUFFER_CREATE_STATIC_FAILED +#define traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer ) \ + traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ) + +#undef traceSTREAM_BUFFER_DELETE +#define traceSTREAM_BUFFER_DELETE( xStreamBuffer ) \ + trcKERNEL_HOOKS_OBJECT_DELETE(TRACE_GET_OBJECT_EVENT_CODE(DELETE_OBJ, TRCSUCCESS, STREAMBUFFER, xStreamBuffer), TRACE_GET_OBJECT_EVENT_CODE(OBJCLOSE_NAME, TRCSUCCESS, STREAMBUFFER, xStreamBuffer), TRACE_GET_OBJECT_EVENT_CODE(OBJCLOSE_PROP, TRCSUCCESS, STREAMBUFFER, xStreamBuffer), STREAMBUFFER, xStreamBuffer); + +#undef traceSTREAM_BUFFER_RESET +#define traceSTREAM_BUFFER_RESET( xStreamBuffer ) \ + trcKERNEL_HOOKS_KERNEL_SERVICE(prvGetStreamBufferType(xStreamBuffer) > 0 ? TRACE_MESSAGEBUFFER_RESET : TRACE_STREAMBUFFER_RESET, STREAMBUFFER, xStreamBuffer); \ + trcKERNEL_HOOKS_SET_OBJECT_STATE(STREAMBUFFER, xStreamBuffer, 0); + +#undef traceSTREAM_BUFFER_SEND +#define traceSTREAM_BUFFER_SEND( xStreamBuffer, xReturn ) \ + trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(SEND, TRCSUCCESS, STREAMBUFFER, xStreamBuffer), STREAMBUFFER, xStreamBuffer); \ + trcKERNEL_HOOKS_SET_OBJECT_STATE(STREAMBUFFER, xStreamBuffer, prvBytesInBuffer(xStreamBuffer)); + +#undef traceBLOCKING_ON_STREAM_BUFFER_SEND +#define traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer ) \ + trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(SEND, TRCBLOCK, STREAMBUFFER, xStreamBuffer), STREAMBUFFER, xStreamBuffer); + +#undef traceSTREAM_BUFFER_SEND_FAILED +#define traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer ) \ + trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(SEND, TRCFAILED, STREAMBUFFER, xStreamBuffer), STREAMBUFFER, xStreamBuffer); + +#undef traceSTREAM_BUFFER_RECEIVE +#define traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength ) \ + trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(RECEIVE, TRCSUCCESS, STREAMBUFFER, xStreamBuffer), STREAMBUFFER, xStreamBuffer); \ + trcKERNEL_HOOKS_SET_OBJECT_STATE(STREAMBUFFER, xStreamBuffer, prvBytesInBuffer(xStreamBuffer)); + + +#undef traceBLOCKING_ON_STREAM_BUFFER_RECEIVE +#define traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer ) \ + trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(RECEIVE, TRCBLOCK, STREAMBUFFER, xStreamBuffer), STREAMBUFFER, xStreamBuffer); + +#undef traceSTREAM_BUFFER_RECEIVE_FAILED +#define traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer ) \ + trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(RECEIVE, TRCFAILED, STREAMBUFFER, xStreamBuffer), STREAMBUFFER, xStreamBuffer); + +#undef traceSTREAM_BUFFER_SEND_FROM_ISR +#define traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xReturn ) \ + if( xReturn > ( size_t ) 0 ) \ + { \ + trcKERNEL_HOOKS_KERNEL_SERVICE_FROM_ISR(TRACE_GET_OBJECT_EVENT_CODE(SEND_FROM_ISR, TRCSUCCESS, STREAMBUFFER, xStreamBuffer), STREAMBUFFER, xStreamBuffer); \ + trcKERNEL_HOOKS_SET_OBJECT_STATE(STREAMBUFFER, xStreamBuffer, prvBytesInBuffer(xStreamBuffer)); \ + } \ + else \ + { \ + trcKERNEL_HOOKS_KERNEL_SERVICE_FROM_ISR(TRACE_GET_OBJECT_EVENT_CODE(SEND_FROM_ISR, TRCFAILED, STREAMBUFFER, xStreamBuffer), STREAMBUFFER, xStreamBuffer); \ + } + +#undef traceSTREAM_BUFFER_RECEIVE_FROM_ISR +#define traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength ) \ + if( xReceivedLength > ( size_t ) 0 ) \ + { \ + trcKERNEL_HOOKS_KERNEL_SERVICE_FROM_ISR(TRACE_GET_OBJECT_EVENT_CODE(RECEIVE_FROM_ISR, TRCSUCCESS, STREAMBUFFER, xStreamBuffer), STREAMBUFFER, xStreamBuffer); \ + trcKERNEL_HOOKS_SET_OBJECT_STATE(STREAMBUFFER, xStreamBuffer, prvBytesInBuffer(xStreamBuffer)); \ + } \ + else \ + { \ + trcKERNEL_HOOKS_KERNEL_SERVICE_FROM_ISR(TRACE_GET_OBJECT_EVENT_CODE(RECEIVE_FROM_ISR, TRCFAILED, STREAMBUFFER, xStreamBuffer), STREAMBUFFER, xStreamBuffer); \ + } + +#endif /* (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1) */ + +#endif /* (TRC_CFG_SCHEDULING_ONLY == 0) */ + +#endif /*#if TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_SNAPSHOT */ + +/******************************************************************************/ +/*** Definitions for Streaming mode *******************************************/ +/******************************************************************************/ +#if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) + +/******************************************************************************* +* vTraceStoreKernelObjectName +* +* Set the name for a kernel object (defined by its address). +******************************************************************************/ +void vTraceStoreKernelObjectName(void* object, const char* name); + +/******************************************************************************* +* prvIsNewTCB +* +* Tells if this task is already executing, or if there has been a task-switch. +* Assumed to be called within a trace hook in kernel context. +*******************************************************************************/ +uint32_t prvIsNewTCB(void* pNewTCB); + +#define TRACE_GET_CURRENT_TASK() prvTraceGetCurrentTaskHandle() + +/*************************************************************************/ +/* KERNEL SPECIFIC OBJECT CONFIGURATION */ +/*************************************************************************/ + +/******************************************************************************* + * The event codes - should match the offline config file. + ******************************************************************************/ + +/*** Event codes for streaming - should match the Tracealyzer config file *****/ +#define PSF_EVENT_NULL_EVENT 0x00 + +#define PSF_EVENT_TRACE_START 0x01 +#define PSF_EVENT_TS_CONFIG 0x02 +#define PSF_EVENT_OBJ_NAME 0x03 +#define PSF_EVENT_TASK_PRIORITY 0x04 +#define PSF_EVENT_TASK_PRIO_INHERIT 0x05 +#define PSF_EVENT_TASK_PRIO_DISINHERIT 0x06 +#define PSF_EVENT_DEFINE_ISR 0x07 + +#define PSF_EVENT_TASK_CREATE 0x10 +#define PSF_EVENT_QUEUE_CREATE 0x11 +#define PSF_EVENT_SEMAPHORE_BINARY_CREATE 0x12 +#define PSF_EVENT_MUTEX_CREATE 0x13 +#define PSF_EVENT_TIMER_CREATE 0x14 +#define PSF_EVENT_EVENTGROUP_CREATE 0x15 +#define PSF_EVENT_SEMAPHORE_COUNTING_CREATE 0x16 +#define PSF_EVENT_MUTEX_RECURSIVE_CREATE 0x17 +#define PSF_EVENT_STREAMBUFFER_CREATE 0x18 +#define PSF_EVENT_MESSAGEBUFFER_CREATE 0x19 + +#define PSF_EVENT_TASK_DELETE 0x20 +#define PSF_EVENT_QUEUE_DELETE 0x21 +#define PSF_EVENT_SEMAPHORE_DELETE 0x22 +#define PSF_EVENT_MUTEX_DELETE 0x23 +#define PSF_EVENT_TIMER_DELETE 0x24 +#define PSF_EVENT_EVENTGROUP_DELETE 0x25 +#define PSF_EVENT_STREAMBUFFER_DELETE 0x28 +#define PSF_EVENT_MESSAGEBUFFER_DELETE 0x29 + +#define PSF_EVENT_TASK_READY 0x30 +#define PSF_EVENT_NEW_TIME 0x31 +#define PSF_EVENT_NEW_TIME_SCHEDULER_SUSPENDED 0x32 +#define PSF_EVENT_ISR_BEGIN 0x33 +#define PSF_EVENT_ISR_RESUME 0x34 +#define PSF_EVENT_TS_BEGIN 0x35 +#define PSF_EVENT_TS_RESUME 0x36 +#define PSF_EVENT_TASK_ACTIVATE 0x37 + +#define PSF_EVENT_MALLOC 0x38 +#define PSF_EVENT_FREE 0x39 + +#define PSF_EVENT_LOWPOWER_BEGIN 0x3A +#define PSF_EVENT_LOWPOWER_END 0x3B + +#define PSF_EVENT_IFE_NEXT 0x3C +#define PSF_EVENT_IFE_DIRECT 0x3D + +#define PSF_EVENT_TASK_CREATE_FAILED 0x40 +#define PSF_EVENT_QUEUE_CREATE_FAILED 0x41 +#define PSF_EVENT_SEMAPHORE_BINARY_CREATE_FAILED 0x42 +#define PSF_EVENT_MUTEX_CREATE_FAILED 0x43 +#define PSF_EVENT_TIMER_CREATE_FAILED 0x44 +#define PSF_EVENT_EVENTGROUP_CREATE_FAILED 0x45 +#define PSF_EVENT_SEMAPHORE_COUNTING_CREATE_FAILED 0x46 +#define PSF_EVENT_MUTEX_RECURSIVE_CREATE_FAILED 0x47 +#define PSF_EVENT_STREAMBUFFER_CREATE_FAILED 0x49 +#define PSF_EVENT_MESSAGEBUFFER_CREATE_FAILED 0x4A + +#define PSF_EVENT_TIMER_DELETE_FAILED 0x48 + +#define PSF_EVENT_QUEUE_SEND 0x50 +#define PSF_EVENT_SEMAPHORE_GIVE 0x51 +#define PSF_EVENT_MUTEX_GIVE 0x52 + +#define PSF_EVENT_QUEUE_SEND_FAILED 0x53 +#define PSF_EVENT_SEMAPHORE_GIVE_FAILED 0x54 +#define PSF_EVENT_MUTEX_GIVE_FAILED 0x55 + +#define PSF_EVENT_QUEUE_SEND_BLOCK 0x56 +#define PSF_EVENT_SEMAPHORE_GIVE_BLOCK 0x57 +#define PSF_EVENT_MUTEX_GIVE_BLOCK 0x58 + +#define PSF_EVENT_QUEUE_SEND_FROMISR 0x59 +#define PSF_EVENT_SEMAPHORE_GIVE_FROMISR 0x5A + +#define PSF_EVENT_QUEUE_SEND_FROMISR_FAILED 0x5C +#define PSF_EVENT_SEMAPHORE_GIVE_FROMISR_FAILED 0x5D + +#define PSF_EVENT_QUEUE_RECEIVE 0x60 +#define PSF_EVENT_SEMAPHORE_TAKE 0x61 +#define PSF_EVENT_MUTEX_TAKE 0x62 + +#define PSF_EVENT_QUEUE_RECEIVE_FAILED 0x63 +#define PSF_EVENT_SEMAPHORE_TAKE_FAILED 0x64 +#define PSF_EVENT_MUTEX_TAKE_FAILED 0x65 + +#define PSF_EVENT_QUEUE_RECEIVE_BLOCK 0x66 +#define PSF_EVENT_SEMAPHORE_TAKE_BLOCK 0x67 +#define PSF_EVENT_MUTEX_TAKE_BLOCK 0x68 + +#define PSF_EVENT_QUEUE_RECEIVE_FROMISR 0x69 +#define PSF_EVENT_SEMAPHORE_TAKE_FROMISR 0x6A + +#define PSF_EVENT_QUEUE_RECEIVE_FROMISR_FAILED 0x6C +#define PSF_EVENT_SEMAPHORE_TAKE_FROMISR_FAILED 0x6D + +#define PSF_EVENT_QUEUE_PEEK 0x70 +#define PSF_EVENT_SEMAPHORE_PEEK 0x71 +#define PSF_EVENT_MUTEX_PEEK 0x72 + +#define PSF_EVENT_QUEUE_PEEK_FAILED 0x73 +#define PSF_EVENT_SEMAPHORE_PEEK_FAILED 0x74 +#define PSF_EVENT_MUTEX_PEEK_FAILED 0x75 + +#define PSF_EVENT_QUEUE_PEEK_BLOCK 0x76 +#define PSF_EVENT_SEMAPHORE_PEEK_BLOCK 0x77 +#define PSF_EVENT_MUTEX_PEEK_BLOCK 0x78 + +#define PSF_EVENT_TASK_DELAY_UNTIL 0x79 +#define PSF_EVENT_TASK_DELAY 0x7A +#define PSF_EVENT_TASK_SUSPEND 0x7B +#define PSF_EVENT_TASK_RESUME 0x7C +#define PSF_EVENT_TASK_RESUME_FROMISR 0x7D + +#define PSF_EVENT_TIMER_PENDFUNCCALL 0x80 +#define PSF_EVENT_TIMER_PENDFUNCCALL_FROMISR 0x81 +#define PSF_EVENT_TIMER_PENDFUNCCALL_FAILED 0x82 +#define PSF_EVENT_TIMER_PENDFUNCCALL_FROMISR_FAILED 0x83 + +#define PSF_EVENT_USER_EVENT 0x90 + +#define PSF_EVENT_TIMER_START 0xA0 +#define PSF_EVENT_TIMER_RESET 0xA1 +#define PSF_EVENT_TIMER_STOP 0xA2 +#define PSF_EVENT_TIMER_CHANGEPERIOD 0xA3 +#define PSF_EVENT_TIMER_START_FROMISR 0xA4 +#define PSF_EVENT_TIMER_RESET_FROMISR 0xA5 +#define PSF_EVENT_TIMER_STOP_FROMISR 0xA6 +#define PSF_EVENT_TIMER_CHANGEPERIOD_FROMISR 0xA7 +#define PSF_EVENT_TIMER_START_FAILED 0xA8 +#define PSF_EVENT_TIMER_RESET_FAILED 0xA9 +#define PSF_EVENT_TIMER_STOP_FAILED 0xAA +#define PSF_EVENT_TIMER_CHANGEPERIOD_FAILED 0xAB +#define PSF_EVENT_TIMER_START_FROMISR_FAILED 0xAC +#define PSF_EVENT_TIMER_RESET_FROMISR_FAILED 0xAD +#define PSF_EVENT_TIMER_STOP_FROMISR_FAILED 0xAE +#define PSF_EVENT_TIMER_CHANGEPERIOD_FROMISR_FAILED 0xAF + +#define PSF_EVENT_EVENTGROUP_SYNC 0xB0 +#define PSF_EVENT_EVENTGROUP_WAITBITS 0xB1 +#define PSF_EVENT_EVENTGROUP_CLEARBITS 0xB2 +#define PSF_EVENT_EVENTGROUP_CLEARBITS_FROMISR 0xB3 +#define PSF_EVENT_EVENTGROUP_SETBITS 0xB4 +#define PSF_EVENT_EVENTGROUP_SETBITS_FROMISR 0xB5 +#define PSF_EVENT_EVENTGROUP_SYNC_BLOCK 0xB6 +#define PSF_EVENT_EVENTGROUP_WAITBITS_BLOCK 0xB7 +#define PSF_EVENT_EVENTGROUP_SYNC_FAILED 0xB8 +#define PSF_EVENT_EVENTGROUP_WAITBITS_FAILED 0xB9 + +#define PSF_EVENT_QUEUE_SEND_FRONT 0xC0 +#define PSF_EVENT_QUEUE_SEND_FRONT_FAILED 0xC1 +#define PSF_EVENT_QUEUE_SEND_FRONT_BLOCK 0xC2 +#define PSF_EVENT_QUEUE_SEND_FRONT_FROMISR 0xC3 +#define PSF_EVENT_QUEUE_SEND_FRONT_FROMISR_FAILED 0xC4 +#define PSF_EVENT_MUTEX_GIVE_RECURSIVE 0xC5 +#define PSF_EVENT_MUTEX_GIVE_RECURSIVE_FAILED 0xC6 +#define PSF_EVENT_MUTEX_TAKE_RECURSIVE 0xC7 +#define PSF_EVENT_MUTEX_TAKE_RECURSIVE_FAILED 0xC8 + +#define PSF_EVENT_TASK_NOTIFY 0xC9 +#define PSF_EVENT_TASK_NOTIFY_TAKE 0xCA +#define PSF_EVENT_TASK_NOTIFY_TAKE_BLOCK 0xCB +#define PSF_EVENT_TASK_NOTIFY_TAKE_FAILED 0xCC +#define PSF_EVENT_TASK_NOTIFY_WAIT 0xCD +#define PSF_EVENT_TASK_NOTIFY_WAIT_BLOCK 0xCE +#define PSF_EVENT_TASK_NOTIFY_WAIT_FAILED 0xCF +#define PSF_EVENT_TASK_NOTIFY_FROM_ISR 0xD0 +#define PSF_EVENT_TASK_NOTIFY_GIVE_FROM_ISR 0xD1 + +#define PSF_EVENT_TIMER_EXPIRED 0xD2 + +#define PSF_EVENT_STREAMBUFFER_SEND 0xD3 +#define PSF_EVENT_STREAMBUFFER_SEND_BLOCK 0xD4 +#define PSF_EVENT_STREAMBUFFER_SEND_FAILED 0xD5 +#define PSF_EVENT_STREAMBUFFER_RECEIVE 0xD6 +#define PSF_EVENT_STREAMBUFFER_RECEIVE_BLOCK 0xD7 +#define PSF_EVENT_STREAMBUFFER_RECEIVE_FAILED 0xD8 +#define PSF_EVENT_STREAMBUFFER_SEND_FROM_ISR 0xD9 +#define PSF_EVENT_STREAMBUFFER_SEND_FROM_ISR_FAILED 0xDA +#define PSF_EVENT_STREAMBUFFER_RECEIVE_FROM_ISR 0xDB +#define PSF_EVENT_STREAMBUFFER_RECEIVE_FROM_ISR_FAILED 0xDC +#define PSF_EVENT_STREAMBUFFER_RESET 0xDD + +#define PSF_EVENT_MESSAGEBUFFER_SEND 0xDE +#define PSF_EVENT_MESSAGEBUFFER_SEND_BLOCK 0xDF +#define PSF_EVENT_MESSAGEBUFFER_SEND_FAILED 0xE0 +#define PSF_EVENT_MESSAGEBUFFER_RECEIVE 0xE1 +#define PSF_EVENT_MESSAGEBUFFER_RECEIVE_BLOCK 0xE2 +#define PSF_EVENT_MESSAGEBUFFER_RECEIVE_FAILED 0xE3 +#define PSF_EVENT_MESSAGEBUFFER_SEND_FROM_ISR 0xE4 +#define PSF_EVENT_MESSAGEBUFFER_SEND_FROM_ISR_FAILED 0xE5 +#define PSF_EVENT_MESSAGEBUFFER_RECEIVE_FROM_ISR 0xE6 +#define PSF_EVENT_MESSAGEBUFFER_RECEIVE_FROM_ISR_FAILED 0xE7 +#define PSF_EVENT_MESSAGEBUFFER_RESET 0xE8 + +#define PSF_EVENT_MALLOC_FAILED 0xE9 + +#define PSF_EVENT_UNUSED_STACK 0xEA + +/*** The trace macros for streaming ******************************************/ + +/* A macro that will update the tick count when returning from tickless idle */ +#undef traceINCREASE_TICK_COUNT +/* Note: This can handle time adjustments of max 2^32 ticks, i.e., 35 seconds at 120 MHz. Thus, tick-less idle periods longer than 2^32 ticks will appear "compressed" on the time line.*/ +#define traceINCREASE_TICK_COUNT( xCount ) { extern uint32_t uiTraceTickCount; uiTraceTickCount += xCount; } + +#if (TRC_CFG_INCLUDE_OSTICK_EVENTS == 1) +#define OS_TICK_EVENT(uxSchedulerSuspended, xTickCount) if (uxSchedulerSuspended == (unsigned portBASE_TYPE) pdFALSE) { prvTraceStoreEvent1(PSF_EVENT_NEW_TIME, (uint32_t)(xTickCount + 1)); } +#else +#define OS_TICK_EVENT(uxSchedulerSuspended, xTickCount) +#endif + +/* Called on each OS tick. Will call uiPortGetTimestamp to make sure it is called at least once every OS tick. */ +#undef traceTASK_INCREMENT_TICK +#if TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_3_0 + +#define traceTASK_INCREMENT_TICK( xTickCount ) \ + if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdTRUE || xPendedTicks == 0) { extern uint32_t uiTraceTickCount; uiTraceTickCount++; } \ + OS_TICK_EVENT(uxSchedulerSuspended, xTickCount) + +#elif TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_7_5_X + +#define traceTASK_INCREMENT_TICK( xTickCount ) \ + if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdTRUE || uxPendedTicks == 0) { extern uint32_t uiTraceTickCount; uiTraceTickCount++; } \ + OS_TICK_EVENT(uxSchedulerSuspended, xTickCount) + +#else + +#define traceTASK_INCREMENT_TICK( xTickCount ) \ + if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdTRUE || uxMissedTicks == 0) { extern uint32_t uiTraceTickCount; uiTraceTickCount++; } \ + OS_TICK_EVENT(uxSchedulerSuspended, xTickCount) + +#endif + +extern volatile uint32_t uiTraceSystemState; + +/* Called on each task-switch */ +#undef traceTASK_SWITCHED_IN +#define traceTASK_SWITCHED_IN() \ + uiTraceSystemState = TRC_STATE_IN_TASKSWITCH; \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + { \ + if (prvIsNewTCB(pxCurrentTCB)) \ + { \ + prvTraceStoreEvent2(PSF_EVENT_TASK_ACTIVATE, (uint32_t)pxCurrentTCB, pxCurrentTCB->uxPriority); \ + } \ + } \ + uiTraceSystemState = TRC_STATE_IN_APPLICATION; + +/* Called for each task that becomes ready */ +#if (TRC_CFG_INCLUDE_READY_EVENTS == 1) +#undef traceMOVED_TASK_TO_READY_STATE +#define traceMOVED_TASK_TO_READY_STATE( pxTCB ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxTCB) & CurrentFilterMask) \ + prvTraceStoreEvent1(PSF_EVENT_TASK_READY, (uint32_t)pxTCB); +#endif + +#undef traceTASK_CREATE +#if TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0 +#define traceTASK_CREATE(pxNewTCB) \ + if (pxNewTCB != NULL) \ + { \ + prvAddTaskToStackMonitor(pxNewTCB); \ + prvTraceSaveObjectSymbol(pxNewTCB, pxNewTCB->pcTaskName); \ + prvTraceSaveObjectData(pxNewTCB, pxNewTCB->uxPriority); \ + prvTraceStoreStringEvent(1, PSF_EVENT_OBJ_NAME, pxNewTCB->pcTaskName, pxNewTCB); \ + TRACE_SET_OBJECT_FILTER(TASK, pxNewTCB, CurrentFilterGroup); \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxNewTCB) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_TASK_CREATE, (uint32_t)pxNewTCB, pxNewTCB->uxPriority); \ + } +#else /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0 */ +#define traceTASK_CREATE(pxNewTCB) \ + if (pxNewTCB != NULL) \ + { \ + prvAddTaskToStackMonitor(pxNewTCB); \ + prvTraceSaveObjectSymbol(pxNewTCB, (const char*)pcName); \ + prvTraceSaveObjectData(pxNewTCB, uxPriority); \ + prvTraceStoreStringEvent(1, PSF_EVENT_OBJ_NAME, (const char*)pcName, pxNewTCB); \ + TRACE_SET_OBJECT_FILTER(TASK, pxNewTCB, CurrentFilterGroup); \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxNewTCB) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_TASK_CREATE, (uint32_t)pxNewTCB, uxPriority); \ + } +#endif /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0 */ + +/* Called in vTaskCreate, if it fails (typically if the stack can not be allocated) */ +#undef traceTASK_CREATE_FAILED +#define traceTASK_CREATE_FAILED() \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + prvTraceStoreEvent0(PSF_EVENT_TASK_CREATE_FAILED); + +/* Called on vTaskDelete */ +#undef traceTASK_DELETE // We don't allow for filtering out "delete" events. They are important and not very frequent. Moreover, we can't exclude create events, so this should be symmetrical. +#define traceTASK_DELETE( pxTaskToDelete ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxTaskToDelete) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_TASK_DELETE, (uint32_t)pxTaskToDelete, (pxTaskToDelete != NULL) ? (pxTaskToDelete->uxPriority) : 0); \ + prvTraceDeleteSymbol(pxTaskToDelete); \ + prvTraceDeleteObjectData(pxTaskToDelete); \ + prvRemoveTaskFromStackMonitor(pxTaskToDelete); + +#if (TRC_CFG_SCHEDULING_ONLY == 0) + +#if (defined(configUSE_TICKLESS_IDLE) && configUSE_TICKLESS_IDLE != 0) + +#undef traceLOW_POWER_IDLE_BEGIN +#define traceLOW_POWER_IDLE_BEGIN() \ + { \ + prvTraceStoreEvent1(PSF_EVENT_LOWPOWER_BEGIN, xExpectedIdleTime); \ + } + +#undef traceLOW_POWER_IDLE_END +#define traceLOW_POWER_IDLE_END() \ + { \ + prvTraceStoreEvent0(PSF_EVENT_LOWPOWER_END); \ + } + +#endif /* (defined(configUSE_TICKLESS_IDLE) && configUSE_TICKLESS_IDLE != 0) */ + +/* Called on vTaskSuspend */ +#undef traceTASK_SUSPEND +#define traceTASK_SUSPEND( pxTaskToSuspend ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxTaskToSuspend) & CurrentFilterMask) \ + prvTraceStoreEvent1(PSF_EVENT_TASK_SUSPEND, (uint32_t)pxTaskToSuspend); + +/* Called on vTaskDelay - note the use of FreeRTOS variable xTicksToDelay */ +#undef traceTASK_DELAY +#define traceTASK_DELAY() \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + prvTraceStoreEvent1(PSF_EVENT_TASK_DELAY, xTicksToDelay); + +/* Called on vTaskDelayUntil - note the use of FreeRTOS variable xTimeToWake */ +#undef traceTASK_DELAY_UNTIL +#if TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0 +#define traceTASK_DELAY_UNTIL(xTimeToWake) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + prvTraceStoreEvent1(PSF_EVENT_TASK_DELAY_UNTIL, (uint32_t)xTimeToWake); +#else /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0 */ +#define traceTASK_DELAY_UNTIL() \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + prvTraceStoreEvent1(PSF_EVENT_TASK_DELAY_UNTIL, (uint32_t)xTimeToWake); +#endif /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0 */ + +#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0) +#define traceQUEUE_CREATE_HELPER() \ + case queueQUEUE_TYPE_MUTEX: \ + prvTraceStoreEvent1(PSF_EVENT_MUTEX_CREATE, (uint32_t)pxNewQueue); \ + break; \ + case queueQUEUE_TYPE_RECURSIVE_MUTEX: \ + prvTraceStoreEvent1(PSF_EVENT_MUTEX_RECURSIVE_CREATE, (uint32_t)pxNewQueue); \ + break; +#else +#define traceQUEUE_CREATE_HELPER() +#endif /* (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_9_0_0) */ + +/* Called in xQueueCreate, and thereby for all other object based on queues, such as semaphores. */ +#undef traceQUEUE_CREATE +#define traceQUEUE_CREATE( pxNewQueue )\ + TRACE_SET_OBJECT_FILTER(QUEUE, pxNewQueue, CurrentFilterGroup); \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + { \ + if (TRACE_GET_OBJECT_FILTER(QUEUE, pxNewQueue) & CurrentFilterMask) \ + { \ + switch (pxNewQueue->ucQueueType) \ + { \ + case queueQUEUE_TYPE_BASE: \ + prvTraceStoreEvent2(PSF_EVENT_QUEUE_CREATE, (uint32_t)pxNewQueue, uxQueueLength); \ + break; \ + case queueQUEUE_TYPE_BINARY_SEMAPHORE: \ + prvTraceStoreEvent1(PSF_EVENT_SEMAPHORE_BINARY_CREATE, (uint32_t)pxNewQueue); \ + break; \ + traceQUEUE_CREATE_HELPER() \ + } \ + } \ + } + +#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0) +#define traceQUEUE_CREATE_FAILED_HELPER() \ + case queueQUEUE_TYPE_MUTEX: \ + prvTraceStoreEvent1(PSF_EVENT_MUTEX_CREATE_FAILED, 0); \ + break; \ + case queueQUEUE_TYPE_RECURSIVE_MUTEX: \ + prvTraceStoreEvent1(PSF_EVENT_MUTEX_RECURSIVE_CREATE_FAILED, 0); \ + break; +#else +#define traceQUEUE_CREATE_FAILED_HELPER() +#endif /* (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_9_0_0) */ + +/* Called in xQueueCreate, if the queue creation fails */ +#undef traceQUEUE_CREATE_FAILED +#define traceQUEUE_CREATE_FAILED( queueType ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + { \ + switch (queueType) \ + { \ + case queueQUEUE_TYPE_BASE: \ + prvTraceStoreEvent2(PSF_EVENT_QUEUE_CREATE_FAILED, 0, uxQueueLength); \ + break; \ + case queueQUEUE_TYPE_BINARY_SEMAPHORE: \ + prvTraceStoreEvent1(PSF_EVENT_SEMAPHORE_BINARY_CREATE_FAILED, 0); \ + break; \ + traceQUEUE_CREATE_FAILED_HELPER() \ + } \ + } + +#undef traceQUEUE_DELETE // We don't allow for filtering out "delete" events. They are important and not very frequent. Moreover, we can't exclude create events, so this should be symmetrical. +#define traceQUEUE_DELETE( pxQueue ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + { \ + if (TRACE_GET_OBJECT_FILTER(QUEUE, pxQueue) & CurrentFilterMask) \ + { \ + switch (pxQueue->ucQueueType) \ + { \ + case queueQUEUE_TYPE_BASE: \ + prvTraceStoreEvent2(PSF_EVENT_QUEUE_DELETE, (uint32_t)pxQueue, (pxQueue != NULL) ? (pxQueue->uxMessagesWaiting) : 0); \ + break; \ + case queueQUEUE_TYPE_MUTEX: \ + case queueQUEUE_TYPE_RECURSIVE_MUTEX: \ + prvTraceStoreEvent2(PSF_EVENT_MUTEX_DELETE, (uint32_t)pxQueue, (pxQueue != NULL) ? (pxQueue->uxMessagesWaiting) : 0); \ + break; \ + case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \ + case queueQUEUE_TYPE_BINARY_SEMAPHORE: \ + prvTraceStoreEvent2(PSF_EVENT_SEMAPHORE_DELETE, (uint32_t)pxQueue, (pxQueue != NULL) ? (pxQueue->uxMessagesWaiting) : 0); \ + break; \ + } \ + } \ + } \ + prvTraceDeleteSymbol(pxQueue); + +/* Called in xQueueCreateCountingSemaphore, if the queue creation fails */ +#undef traceCREATE_COUNTING_SEMAPHORE +#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X) +#define traceCREATE_COUNTING_SEMAPHORE() \ + TRACE_SET_OBJECT_FILTER(QUEUE, xHandle, CurrentFilterGroup); \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(QUEUE, xHandle) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_SEMAPHORE_COUNTING_CREATE, (uint32_t)xHandle, uxMaxCount) +#elif (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_7_5_X) +#define traceCREATE_COUNTING_SEMAPHORE() \ + TRACE_SET_OBJECT_FILTER(QUEUE, xHandle, CurrentFilterGroup); \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(QUEUE, xHandle) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_SEMAPHORE_COUNTING_CREATE, (uint32_t)xHandle, uxInitialCount); +#elif (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_7_4_X) +#define traceCREATE_COUNTING_SEMAPHORE() \ + TRACE_SET_OBJECT_FILTER(QUEUE, xHandle, CurrentFilterGroup); \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(QUEUE, xHandle) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_SEMAPHORE_COUNTING_CREATE, (uint32_t)xHandle, uxCountValue); +#else +#define traceCREATE_COUNTING_SEMAPHORE() \ + TRACE_SET_OBJECT_FILTER(QUEUE, pxHandle, CurrentFilterGroup); \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(QUEUE, pxHandle) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_SEMAPHORE_COUNTING_CREATE, (uint32_t)pxHandle, uxCountValue); +#endif /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X */ + +#undef traceCREATE_COUNTING_SEMAPHORE_FAILED +#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X) +#define traceCREATE_COUNTING_SEMAPHORE_FAILED() \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_SEMAPHORE_COUNTING_CREATE_FAILED, 0, uxMaxCount); +#elif (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_7_5_X) +#define traceCREATE_COUNTING_SEMAPHORE_FAILED() \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_SEMAPHORE_COUNTING_CREATE_FAILED, 0, uxInitialCount); +#elif (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_7_4_X) +#define traceCREATE_COUNTING_SEMAPHORE_FAILED() \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_SEMAPHORE_COUNTING_CREATE_FAILED, 0, uxCountValue); +#else +#define traceCREATE_COUNTING_SEMAPHORE_FAILED() \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_SEMAPHORE_COUNTING_CREATE_FAILED, 0, uxCountValue); +#endif /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X */ + + +/* This macro is not necessary as of FreeRTOS v9.0.0 */ +#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_9_0_0) +/* Called in xQueueCreateMutex, and thereby also from xSemaphoreCreateMutex and xSemaphoreCreateRecursiveMutex */ +#undef traceCREATE_MUTEX +#define traceCREATE_MUTEX( pxNewQueue ) \ + TRACE_SET_OBJECT_FILTER(QUEUE, pxNewQueue, CurrentFilterGroup); \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + { \ + if (TRACE_GET_OBJECT_FILTER(QUEUE, pxNewQueue) & CurrentFilterMask) \ + { \ + switch (pxNewQueue->ucQueueType) \ + { \ + case queueQUEUE_TYPE_MUTEX: \ + prvTraceStoreEvent1(PSF_EVENT_MUTEX_CREATE, (uint32_t)pxNewQueue); \ + break; \ + case queueQUEUE_TYPE_RECURSIVE_MUTEX: \ + prvTraceStoreEvent1(PSF_EVENT_MUTEX_RECURSIVE_CREATE, (uint32_t)pxNewQueue); \ + break; \ + } \ + }\ + } + +/* Called in xQueueCreateMutex when the operation fails (when memory allocation fails) */ +#undef traceCREATE_MUTEX_FAILED +#define traceCREATE_MUTEX_FAILED() \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + prvTraceStoreEvent1(PSF_EVENT_MUTEX_CREATE_FAILED, 0); +#endif /* (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_9_0_0) */ + +#if TRC_CFG_INCLUDE_QUEUE_EVENTS /* << EST */ +/* Called when a message is sent to a queue */ /* CS IS NEW ! */ +#undef traceQUEUE_SEND +#define traceQUEUE_SEND( pxQueue ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(QUEUE, pxQueue) & CurrentFilterMask) \ + switch (pxQueue->ucQueueType) \ + { \ + case queueQUEUE_TYPE_BASE: \ + prvTraceStoreEvent2(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND : PSF_EVENT_QUEUE_SEND_FRONT, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting + 1); \ + break; \ + case queueQUEUE_TYPE_BINARY_SEMAPHORE: \ + case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \ + prvTraceStoreEvent2(PSF_EVENT_SEMAPHORE_GIVE, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting + 1); \ + break; \ + case queueQUEUE_TYPE_MUTEX: \ + case queueQUEUE_TYPE_RECURSIVE_MUTEX: \ + prvTraceStoreEvent1(PSF_EVENT_MUTEX_GIVE, (uint32_t)pxQueue); \ + break; \ + } +#endif /* TRC_CFG_INCLUDE_QUEUE_EVENTS */ /* << EST */ + +#if TRC_CFG_INCLUDE_QUEUE_EVENTS /* << EST */ +#undef traceQUEUE_SET_SEND +#define traceQUEUE_SET_SEND( pxQueue ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(QUEUE, pxQueue) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_QUEUE_SEND, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting + 1); + +/* Called when a message failed to be sent to a queue (timeout) */ +#undef traceQUEUE_SEND_FAILED +#define traceQUEUE_SEND_FAILED( pxQueue ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(QUEUE, pxQueue) & CurrentFilterMask) \ + switch (pxQueue->ucQueueType) \ + { \ + case queueQUEUE_TYPE_BASE: \ + prvTraceStoreEvent2(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND_FAILED : PSF_EVENT_QUEUE_SEND_FRONT_FAILED, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \ + break; \ + case queueQUEUE_TYPE_BINARY_SEMAPHORE: \ + case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \ + prvTraceStoreEvent2(PSF_EVENT_SEMAPHORE_GIVE_FAILED, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \ + break; \ + case queueQUEUE_TYPE_MUTEX: \ + case queueQUEUE_TYPE_RECURSIVE_MUTEX: \ + prvTraceStoreEvent1(PSF_EVENT_MUTEX_GIVE_FAILED, (uint32_t)pxQueue); \ + break; \ + } +#endif /* TRC_CFG_INCLUDE_QUEUE_EVENTS */ /* << EST */ + +#if TRC_CFG_INCLUDE_QUEUE_EVENTS /* << EST */ +/* Called when the task is blocked due to a send operation on a full queue */ +#undef traceBLOCKING_ON_QUEUE_SEND +#define traceBLOCKING_ON_QUEUE_SEND( pxQueue ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(QUEUE, pxQueue) & CurrentFilterMask) \ + switch (pxQueue->ucQueueType) \ + { \ + case queueQUEUE_TYPE_BASE: \ + prvTraceStoreEvent2(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND_BLOCK : PSF_EVENT_QUEUE_SEND_FRONT_BLOCK, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \ + break; \ + case queueQUEUE_TYPE_BINARY_SEMAPHORE: \ + case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \ + prvTraceStoreEvent2(PSF_EVENT_SEMAPHORE_GIVE_BLOCK, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \ + break; \ + case queueQUEUE_TYPE_MUTEX: \ + case queueQUEUE_TYPE_RECURSIVE_MUTEX: \ + prvTraceStoreEvent1(PSF_EVENT_MUTEX_GIVE_BLOCK, (uint32_t)pxQueue); \ + break; \ + } +#endif /* TRC_CFG_INCLUDE_QUEUE_EVENTS */ /* << EST */ + +/* Called when a message is sent from interrupt context, e.g., using xQueueSendFromISR */ +#if TRC_CFG_INCLUDE_QUEUE_EVENTS /* << EST */ +#undef traceQUEUE_SEND_FROM_ISR +#define traceQUEUE_SEND_FROM_ISR( pxQueue ) \ + if (TRACE_GET_OBJECT_FILTER(QUEUE, pxQueue) & CurrentFilterMask) \ + switch (pxQueue->ucQueueType) \ + { \ + case queueQUEUE_TYPE_BASE: \ + prvTraceStoreEvent2(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND_FROMISR : PSF_EVENT_QUEUE_SEND_FRONT_FROMISR, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting + 1); \ + break; \ + case queueQUEUE_TYPE_BINARY_SEMAPHORE: \ + case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \ + prvTraceStoreEvent2(PSF_EVENT_SEMAPHORE_GIVE_FROMISR, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting + 1); \ + break; \ + } +#endif /* TRC_CFG_INCLUDE_QUEUE_EVENTS */ /* << EST */ + +#if TRC_CFG_INCLUDE_QUEUE_EVENTS /* << EST */ + +/* Called when a message send from interrupt context fails (since the queue was full) */ +#undef traceQUEUE_SEND_FROM_ISR_FAILED +#define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) \ + if (TRACE_GET_OBJECT_FILTER(QUEUE, pxQueue) & CurrentFilterMask) \ + switch (pxQueue->ucQueueType) \ + { \ + case queueQUEUE_TYPE_BASE: \ + prvTraceStoreEvent2(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND_FROMISR_FAILED : PSF_EVENT_QUEUE_SEND_FRONT_FROMISR_FAILED, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \ + break; \ + case queueQUEUE_TYPE_BINARY_SEMAPHORE: \ + case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \ + prvTraceStoreEvent2(PSF_EVENT_SEMAPHORE_GIVE_FROMISR_FAILED, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \ + break; \ + } +#endif /* TRC_CFG_INCLUDE_QUEUE_EVENTS */ /* << EST */ + +#if TRC_CFG_INCLUDE_QUEUE_EVENTS /* << EST */ + +/* Called when a message is received from a queue */ +#undef traceQUEUE_RECEIVE +#define traceQUEUE_RECEIVE( pxQueue ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(QUEUE, pxQueue) & CurrentFilterMask) \ + switch (pxQueue->ucQueueType) \ + { \ + case queueQUEUE_TYPE_BASE: \ + if (isQueueReceiveHookActuallyPeek) \ + prvTraceStoreEvent3(PSF_EVENT_QUEUE_PEEK, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting - 1); \ + else\ + prvTraceStoreEvent3(PSF_EVENT_QUEUE_RECEIVE, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting - 1); \ + break; \ + case queueQUEUE_TYPE_BINARY_SEMAPHORE: \ + case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \ + if (isQueueReceiveHookActuallyPeek) \ + prvTraceStoreEvent3(PSF_EVENT_SEMAPHORE_PEEK, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting - 1); \ + else \ + prvTraceStoreEvent3(PSF_EVENT_SEMAPHORE_TAKE, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting - 1); \ + break; \ + case queueQUEUE_TYPE_MUTEX: \ + case queueQUEUE_TYPE_RECURSIVE_MUTEX: \ + if (isQueueReceiveHookActuallyPeek) \ + prvTraceStoreEvent2(PSF_EVENT_MUTEX_PEEK, (uint32_t)pxQueue, xTicksToWait); \ + else \ + prvTraceStoreEvent2(PSF_EVENT_MUTEX_TAKE, (uint32_t)pxQueue, xTicksToWait); \ + break; \ + } +#endif /* TRC_CFG_INCLUDE_QUEUE_EVENTS */ /* << EST */ + +#if TRC_CFG_INCLUDE_QUEUE_EVENTS /* << EST */ + +/* Called when a receive operation on a queue fails (timeout) */ +#undef traceQUEUE_RECEIVE_FAILED +#define traceQUEUE_RECEIVE_FAILED( pxQueue ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(QUEUE, pxQueue) & CurrentFilterMask) \ + switch (pxQueue->ucQueueType) \ + { \ + case queueQUEUE_TYPE_BASE: \ + prvTraceStoreEvent3(isQueueReceiveHookActuallyPeek ? PSF_EVENT_QUEUE_PEEK_FAILED : PSF_EVENT_QUEUE_RECEIVE_FAILED, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting); \ + break; \ + case queueQUEUE_TYPE_BINARY_SEMAPHORE: \ + case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \ + prvTraceStoreEvent3(isQueueReceiveHookActuallyPeek ? PSF_EVENT_SEMAPHORE_PEEK_FAILED : PSF_EVENT_SEMAPHORE_TAKE_FAILED, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting); \ + break; \ + case queueQUEUE_TYPE_MUTEX: \ + case queueQUEUE_TYPE_RECURSIVE_MUTEX: \ + prvTraceStoreEvent2(isQueueReceiveHookActuallyPeek ? PSF_EVENT_MUTEX_PEEK_FAILED : PSF_EVENT_MUTEX_TAKE_FAILED, (uint32_t)pxQueue, xTicksToWait); \ + break; \ + } +#endif /* TRC_CFG_INCLUDE_QUEUE_EVENTS */ /* << EST */ + +#if TRC_CFG_INCLUDE_QUEUE_EVENTS /* << EST */ + +/* Called when the task is blocked due to a receive operation on an empty queue */ +#undef traceBLOCKING_ON_QUEUE_RECEIVE +#define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(QUEUE, pxQueue) & CurrentFilterMask) \ + switch (pxQueue->ucQueueType) \ + { \ + case queueQUEUE_TYPE_BASE: \ + prvTraceStoreEvent3(isQueueReceiveHookActuallyPeek ? PSF_EVENT_QUEUE_PEEK_BLOCK : PSF_EVENT_QUEUE_RECEIVE_BLOCK, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting); \ + break; \ + case queueQUEUE_TYPE_BINARY_SEMAPHORE: \ + case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \ + prvTraceStoreEvent3(isQueueReceiveHookActuallyPeek ? PSF_EVENT_SEMAPHORE_PEEK_BLOCK : PSF_EVENT_SEMAPHORE_TAKE_BLOCK, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting); \ + break; \ + case queueQUEUE_TYPE_MUTEX: \ + case queueQUEUE_TYPE_RECURSIVE_MUTEX: \ + prvTraceStoreEvent2(isQueueReceiveHookActuallyPeek ? PSF_EVENT_MUTEX_PEEK_BLOCK : PSF_EVENT_MUTEX_TAKE_BLOCK, (uint32_t)pxQueue, xTicksToWait); \ + break; \ + } +#endif /* TRC_CFG_INCLUDE_QUEUE_EVENTS */ /* << EST */ + +#if (TRC_CFG_FREERTOS_VERSION > TRC_FREERTOS_VERSION_9_0_1) +#if TRC_CFG_INCLUDE_QUEUE_EVENTS /* << EST */ +/* Called when a peek operation on a queue fails (timeout) */ +#undef traceQUEUE_PEEK_FAILED +#define traceQUEUE_PEEK_FAILED( pxQueue ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(QUEUE, pxQueue) & CurrentFilterMask) \ + switch (pxQueue->ucQueueType) \ + { \ + case queueQUEUE_TYPE_BASE: \ + prvTraceStoreEvent3(PSF_EVENT_QUEUE_PEEK_FAILED, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting); \ + break; \ + case queueQUEUE_TYPE_BINARY_SEMAPHORE: \ + case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \ + prvTraceStoreEvent3(PSF_EVENT_SEMAPHORE_PEEK_FAILED, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting); \ + break; \ + case queueQUEUE_TYPE_MUTEX: \ + case queueQUEUE_TYPE_RECURSIVE_MUTEX: \ + prvTraceStoreEvent2(PSF_EVENT_MUTEX_PEEK_FAILED, (uint32_t)pxQueue, xTicksToWait); \ + break; \ + } +#endif /* TRC_CFG_INCLUDE_QUEUE_EVENTS */ /* << EST */ + +#if TRC_CFG_INCLUDE_QUEUE_EVENTS /* << EST */ +/* Called when the task is blocked due to a peek operation on an empty queue */ +#undef traceBLOCKING_ON_QUEUE_PEEK +#define traceBLOCKING_ON_QUEUE_PEEK( pxQueue ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(QUEUE, pxQueue) & CurrentFilterMask) \ + switch (pxQueue->ucQueueType) \ + { \ + case queueQUEUE_TYPE_BASE: \ + prvTraceStoreEvent3(PSF_EVENT_QUEUE_PEEK_BLOCK, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting); \ + break; \ + case queueQUEUE_TYPE_BINARY_SEMAPHORE: \ + case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \ + prvTraceStoreEvent3(PSF_EVENT_SEMAPHORE_PEEK_BLOCK, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting); \ + break; \ + case queueQUEUE_TYPE_MUTEX: \ + case queueQUEUE_TYPE_RECURSIVE_MUTEX: \ + prvTraceStoreEvent2(PSF_EVENT_MUTEX_PEEK_BLOCK, (uint32_t)pxQueue, xTicksToWait); \ + break; \ + } +#endif /* TRC_CFG_INCLUDE_QUEUE_EVENTS */ /* << EST */ + +#endif /* (TRC_CFG_FREERTOS_VERSION > TRC_FREERTOS_VERSION_9_0_1) */ + +/* Called when a message is received in interrupt context, e.g., using xQueueReceiveFromISR */ +#if TRC_CFG_INCLUDE_QUEUE_EVENTS /* << EST */ +#undef traceQUEUE_RECEIVE_FROM_ISR +#define traceQUEUE_RECEIVE_FROM_ISR( pxQueue ) \ + if (TRACE_GET_OBJECT_FILTER(QUEUE, pxQueue) & CurrentFilterMask) \ + switch (pxQueue->ucQueueType) \ + { \ + case queueQUEUE_TYPE_BASE: \ + prvTraceStoreEvent2(PSF_EVENT_QUEUE_RECEIVE_FROMISR, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting - 1); \ + break; \ + case queueQUEUE_TYPE_BINARY_SEMAPHORE: \ + case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \ + prvTraceStoreEvent2(PSF_EVENT_SEMAPHORE_TAKE_FROMISR, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting - 1); \ + break; \ + } +#endif /* TRC_CFG_INCLUDE_QUEUE_EVENTS */ /* << EST */ + +#if TRC_CFG_INCLUDE_QUEUE_EVENTS /* << EST */ + +/* Called when a message receive from interrupt context fails (since the queue was empty) */ +#undef traceQUEUE_RECEIVE_FROM_ISR_FAILED +#define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) \ + if (TRACE_GET_OBJECT_FILTER(QUEUE, pxQueue) & CurrentFilterMask) \ + switch (pxQueue->ucQueueType) \ + { \ + case queueQUEUE_TYPE_BASE: \ + prvTraceStoreEvent2(PSF_EVENT_QUEUE_RECEIVE_FROMISR_FAILED, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \ + break; \ + case queueQUEUE_TYPE_BINARY_SEMAPHORE: \ + case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \ + prvTraceStoreEvent2(PSF_EVENT_SEMAPHORE_TAKE_FROMISR_FAILED, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \ + break; \ + } +#endif /* TRC_CFG_INCLUDE_QUEUE_EVENTS */ /* << EST */ + +#if TRC_CFG_INCLUDE_QUEUE_EVENTS /* << EST */ + +/* Called on xQueuePeek */ +#undef traceQUEUE_PEEK +#define traceQUEUE_PEEK( pxQueue ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(QUEUE, pxQueue) & CurrentFilterMask) \ + switch (pxQueue->ucQueueType) \ + { \ + case queueQUEUE_TYPE_BASE: \ + prvTraceStoreEvent3(PSF_EVENT_QUEUE_PEEK, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting); \ + break; \ + case queueQUEUE_TYPE_BINARY_SEMAPHORE: \ + case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \ + prvTraceStoreEvent3(PSF_EVENT_SEMAPHORE_PEEK, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting); \ + break; \ + case queueQUEUE_TYPE_MUTEX: \ + case queueQUEUE_TYPE_RECURSIVE_MUTEX: \ + prvTraceStoreEvent1(PSF_EVENT_MUTEX_PEEK, (uint32_t)pxQueue); \ + break; \ + } +#endif /* TRC_CFG_INCLUDE_QUEUE_EVENTS */ /* << EST */ + +/* Called in vTaskPrioritySet */ +#undef traceTASK_PRIORITY_SET +#define traceTASK_PRIORITY_SET( pxTask, uxNewPriority ) \ + prvTraceSaveObjectData(pxTask, uxNewPriority); \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxTask) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_TASK_PRIORITY, (uint32_t)pxTask, uxNewPriority); + +/* Called in vTaskPriorityInherit, which is called by Mutex operations */ +#undef traceTASK_PRIORITY_INHERIT +#define traceTASK_PRIORITY_INHERIT( pxTask, uxNewPriority ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxTask) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_TASK_PRIO_INHERIT, (uint32_t)pxTask, uxNewPriority); + +/* Called in vTaskPriorityDisinherit, which is called by Mutex operations */ +#undef traceTASK_PRIORITY_DISINHERIT +#define traceTASK_PRIORITY_DISINHERIT( pxTask, uxNewPriority ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxTask) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_TASK_PRIO_DISINHERIT, (uint32_t)pxTask, uxNewPriority); + +/* Called in vTaskResume */ +#undef traceTASK_RESUME +#define traceTASK_RESUME( pxTaskToResume ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxTaskToResume) & CurrentFilterMask) \ + prvTraceStoreEvent1(PSF_EVENT_TASK_RESUME, (uint32_t)pxTaskToResume); + +/* Called in vTaskResumeFromISR */ +#undef traceTASK_RESUME_FROM_ISR +#define traceTASK_RESUME_FROM_ISR( pxTaskToResume ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxTaskToResume) & CurrentFilterMask) \ + prvTraceStoreEvent1(PSF_EVENT_TASK_RESUME_FROMISR, (uint32_t)pxTaskToResume); + +#if (TRC_CFG_INCLUDE_MEMMANG_EVENTS == 1) + +extern uint32_t trcHeapCounter; + +#undef traceMALLOC +#define traceMALLOC( pvAddress, uiSize ) \ + if (pvAddress != 0) \ + { \ + trcHeapCounter += uiSize; \ + } \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + { \ + if (pvAddress != 0) \ + { \ + prvTraceStoreEvent2(PSF_EVENT_MALLOC, (uint32_t)pvAddress, uiSize); \ + } \ + else \ + { \ + prvTraceStoreEvent2(PSF_EVENT_MALLOC_FAILED, (uint32_t)pvAddress, uiSize); \ + } \ + } + +#undef traceFREE +#define traceFREE( pvAddress, uiSize ) \ + trcHeapCounter -= uiSize; \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_FREE, (uint32_t)pvAddress, (uint32_t)(0 - uiSize)); /* "0 -" instead of just "-" to get rid of a warning... */ + +#endif /* (TRC_CFG_INCLUDE_MEMMANG_EVENTS == 1) */ + +#if (TRC_CFG_INCLUDE_TIMER_EVENTS == 1) + +/* Called in timer.c - xTimerCreate */ +#undef traceTIMER_CREATE +#define traceTIMER_CREATE(tmr) \ + TRACE_SET_OBJECT_FILTER(TIMER, tmr, CurrentFilterGroup); \ + prvTraceSaveObjectSymbol(tmr, (const char*)tmr->pcTimerName); \ + prvTraceStoreStringEvent(1, PSF_EVENT_OBJ_NAME, (const char*)tmr->pcTimerName, tmr); \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(TIMER, tmr) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_TIMER_CREATE, (uint32_t)tmr, tmr->xTimerPeriodInTicks); + +#undef traceTIMER_CREATE_FAILED +#define traceTIMER_CREATE_FAILED() \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + prvTraceStoreEvent0(PSF_EVENT_TIMER_CREATE_FAILED); + +#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X) +#define traceTIMER_COMMAND_SEND_8_0_CASES(tmr) \ + case tmrCOMMAND_RESET: \ + prvTraceStoreEvent2((xReturn == pdPASS) ? PSF_EVENT_TIMER_RESET : PSF_EVENT_TIMER_RESET_FAILED, (uint32_t)tmr, xOptionalValue); \ + break; \ + case tmrCOMMAND_START_FROM_ISR: \ + prvTraceStoreEvent2((xReturn == pdPASS) ? PSF_EVENT_TIMER_START_FROMISR : PSF_EVENT_TIMER_START_FROMISR_FAILED, (uint32_t)tmr, xOptionalValue); \ + break; \ + case tmrCOMMAND_RESET_FROM_ISR: \ + prvTraceStoreEvent2((xReturn == pdPASS) ? PSF_EVENT_TIMER_RESET_FROMISR : PSF_EVENT_TIMER_RESET_FROMISR_FAILED, (uint32_t)tmr, xOptionalValue); \ + break; \ + case tmrCOMMAND_STOP_FROM_ISR: \ + prvTraceStoreEvent2((xReturn == pdPASS) ? PSF_EVENT_TIMER_STOP_FROMISR : PSF_EVENT_TIMER_STOP_FROMISR_FAILED, (uint32_t)tmr, xOptionalValue); \ + break; \ + case tmrCOMMAND_CHANGE_PERIOD_FROM_ISR: \ + prvTraceStoreEvent2((xReturn == pdPASS) ? PSF_EVENT_TIMER_CHANGEPERIOD_FROMISR : PSF_EVENT_TIMER_CHANGEPERIOD_FROMISR_FAILED, (uint32_t)tmr, xOptionalValue); \ + break; +#else /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X */ +#define traceTIMER_COMMAND_SEND_8_0_CASES(tmr) +#endif /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X */ + +/* Note that xCommandID can never be tmrCOMMAND_EXECUTE_CALLBACK (-1) since the trace macro is not called in that case */ +#undef traceTIMER_COMMAND_SEND +#define traceTIMER_COMMAND_SEND(tmr, xCommandID, xOptionalValue, xReturn) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(TIMER, tmr) & CurrentFilterMask) \ + switch(xCommandID) \ + { \ + case tmrCOMMAND_START: \ + prvTraceStoreEvent1((xReturn == pdPASS) ? PSF_EVENT_TIMER_START : PSF_EVENT_TIMER_START_FAILED, (uint32_t)tmr); \ + break; \ + case tmrCOMMAND_STOP: \ + prvTraceStoreEvent1((xReturn == pdPASS) ? PSF_EVENT_TIMER_STOP : PSF_EVENT_TIMER_STOP_FAILED, (uint32_t)tmr); \ + break; \ + case tmrCOMMAND_CHANGE_PERIOD: \ + prvTraceStoreEvent2((xReturn == pdPASS) ? PSF_EVENT_TIMER_CHANGEPERIOD : PSF_EVENT_TIMER_CHANGEPERIOD_FAILED, (uint32_t)tmr, xOptionalValue); \ + break; \ + case tmrCOMMAND_DELETE: \ + prvTraceStoreEvent1((xReturn == pdPASS) ? PSF_EVENT_TIMER_DELETE : PSF_EVENT_TIMER_DELETE_FAILED, (uint32_t)tmr); \ + break; \ + traceTIMER_COMMAND_SEND_8_0_CASES(tmr) \ + } + +#undef traceTIMER_EXPIRED +#define traceTIMER_EXPIRED(tmr) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(TIMER, tmr) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_TIMER_EXPIRED, (uint32_t)tmr->pxCallbackFunction, (uint32_t)tmr->pvTimerID); + +#endif /* #if (TRC_CFG_INCLUDE_TIMER_EVENTS == 1) */ + + +#if (TRC_CFG_INCLUDE_PEND_FUNC_CALL_EVENTS == 1) + +#undef tracePEND_FUNC_CALL +#define tracePEND_FUNC_CALL(func, arg1, arg2, ret) \ + prvTraceStoreEvent1((ret == pdPASS) ? PSF_EVENT_TIMER_PENDFUNCCALL : PSF_EVENT_TIMER_PENDFUNCCALL_FAILED, (uint32_t)func); + +#undef tracePEND_FUNC_CALL_FROM_ISR +#define tracePEND_FUNC_CALL_FROM_ISR(func, arg1, arg2, ret) \ + prvTraceStoreEvent1((ret == pdPASS) ? PSF_EVENT_TIMER_PENDFUNCCALL_FROMISR : PSF_EVENT_TIMER_PENDFUNCCALL_FROMISR_FAILED, (uint32_t)func); + +#endif /* (TRC_CFG_INCLUDE_PEND_FUNC_CALL_EVENTS == 1) */ + +#if (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1) + +#undef traceEVENT_GROUP_CREATE +#define traceEVENT_GROUP_CREATE(eg) \ + TRACE_SET_OBJECT_FILTER(EVENTGROUP, eg, CurrentFilterGroup); \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(EVENTGROUP, eg) & CurrentFilterMask) \ + prvTraceStoreEvent1(PSF_EVENT_EVENTGROUP_CREATE, (uint32_t)eg); + +#undef traceEVENT_GROUP_DELETE +#define traceEVENT_GROUP_DELETE(eg) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(EVENTGROUP, eg) & CurrentFilterMask) \ + prvTraceStoreEvent1(PSF_EVENT_EVENTGROUP_DELETE, (uint32_t)eg); \ + prvTraceDeleteSymbol(eg); + +#undef traceEVENT_GROUP_CREATE_FAILED +#define traceEVENT_GROUP_CREATE_FAILED() \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + prvTraceStoreEvent0(PSF_EVENT_EVENTGROUP_CREATE_FAILED); + +#undef traceEVENT_GROUP_SYNC_BLOCK +#define traceEVENT_GROUP_SYNC_BLOCK(eg, bitsToSet, bitsToWaitFor) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(EVENTGROUP, eg) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_EVENTGROUP_SYNC_BLOCK, (uint32_t)eg, bitsToWaitFor); + +#undef traceEVENT_GROUP_SYNC_END +#define traceEVENT_GROUP_SYNC_END(eg, bitsToSet, bitsToWaitFor, wasTimeout) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(EVENTGROUP, eg) & CurrentFilterMask) \ + prvTraceStoreEvent2((wasTimeout != pdTRUE) ? PSF_EVENT_EVENTGROUP_SYNC : PSF_EVENT_EVENTGROUP_SYNC_FAILED, (uint32_t)eg, bitsToWaitFor); + +#undef traceEVENT_GROUP_WAIT_BITS_BLOCK +#define traceEVENT_GROUP_WAIT_BITS_BLOCK(eg, bitsToWaitFor) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(EVENTGROUP, eg) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_EVENTGROUP_WAITBITS_BLOCK, (uint32_t)eg, bitsToWaitFor); + +#undef traceEVENT_GROUP_WAIT_BITS_END +#define traceEVENT_GROUP_WAIT_BITS_END(eg, bitsToWaitFor, wasTimeout) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(EVENTGROUP, eg) & CurrentFilterMask) \ + prvTraceStoreEvent2((wasTimeout != pdTRUE) ? PSF_EVENT_EVENTGROUP_WAITBITS : PSF_EVENT_EVENTGROUP_WAITBITS_FAILED, (uint32_t)eg, bitsToWaitFor); + +#undef traceEVENT_GROUP_CLEAR_BITS +#define traceEVENT_GROUP_CLEAR_BITS(eg, bitsToClear) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(EVENTGROUP, eg) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_EVENTGROUP_CLEARBITS, (uint32_t)eg, bitsToClear); + +#undef traceEVENT_GROUP_CLEAR_BITS_FROM_ISR +#define traceEVENT_GROUP_CLEAR_BITS_FROM_ISR(eg, bitsToClear) \ + if (TRACE_GET_OBJECT_FILTER(EVENTGROUP, eg) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_EVENTGROUP_CLEARBITS_FROMISR, (uint32_t)eg, bitsToClear); + +#undef traceEVENT_GROUP_SET_BITS +#define traceEVENT_GROUP_SET_BITS(eg, bitsToSet) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(EVENTGROUP, eg) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_EVENTGROUP_SETBITS, (uint32_t)eg, bitsToSet); + +#undef traceEVENT_GROUP_SET_BITS_FROM_ISR +#define traceEVENT_GROUP_SET_BITS_FROM_ISR(eg, bitsToSet) \ + if (TRACE_GET_OBJECT_FILTER(EVENTGROUP, eg) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_EVENTGROUP_SETBITS_FROMISR, (uint32_t)eg, bitsToSet); + +#endif /* (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1) */ + +#undef traceTASK_NOTIFY_TAKE +#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0) +#define traceTASK_NOTIFY_TAKE(index) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask){ \ + if (pxCurrentTCB->ucNotifyState[index] == taskNOTIFICATION_RECEIVED) \ + prvTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_TAKE, (uint32_t)pxCurrentTCB, xTicksToWait); \ + else \ + prvTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_TAKE_FAILED, (uint32_t)pxCurrentTCB, xTicksToWait);} +#elif (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0) +#define traceTASK_NOTIFY_TAKE() \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask){ \ + if (pxCurrentTCB->ucNotifyState == taskNOTIFICATION_RECEIVED) \ + prvTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_TAKE, (uint32_t)pxCurrentTCB, xTicksToWait); \ + else \ + prvTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_TAKE_FAILED, (uint32_t)pxCurrentTCB, xTicksToWait);} +#else /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0 */ +#define traceTASK_NOTIFY_TAKE() \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask){ \ + if (pxCurrentTCB->eNotifyState == eNotified) \ + prvTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_TAKE, (uint32_t)pxCurrentTCB, xTicksToWait); \ + else \ + prvTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_TAKE_FAILED, (uint32_t)pxCurrentTCB, xTicksToWait);} +#endif /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0 */ + +#undef traceTASK_NOTIFY_TAKE_BLOCK +#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0) +#define traceTASK_NOTIFY_TAKE_BLOCK(index) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_TAKE_BLOCK, (uint32_t)pxCurrentTCB, xTicksToWait); +#else /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0 */ +#define traceTASK_NOTIFY_TAKE_BLOCK() \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_TAKE_BLOCK, (uint32_t)pxCurrentTCB, xTicksToWait); +#endif /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0 */ + +#undef traceTASK_NOTIFY_WAIT +#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0) +#define traceTASK_NOTIFY_WAIT(index) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask){ \ + if (pxCurrentTCB->ucNotifyState[index] == taskNOTIFICATION_RECEIVED) \ + prvTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_WAIT, (uint32_t)pxCurrentTCB, xTicksToWait); \ + else \ + prvTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_WAIT_FAILED, (uint32_t)pxCurrentTCB, xTicksToWait);} +#elif (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0) +#define traceTASK_NOTIFY_WAIT() \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask){ \ + if (pxCurrentTCB->ucNotifyState == taskNOTIFICATION_RECEIVED) \ + prvTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_WAIT, (uint32_t)pxCurrentTCB, xTicksToWait); \ + else \ + prvTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_WAIT_FAILED, (uint32_t)pxCurrentTCB, xTicksToWait);} +#else /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0 */ +#define traceTASK_NOTIFY_WAIT() \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask){ \ + if (pxCurrentTCB->eNotifyState == eNotified) \ + prvTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_WAIT, (uint32_t)pxCurrentTCB, xTicksToWait); \ + else \ + prvTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_WAIT_FAILED, (uint32_t)pxCurrentTCB, xTicksToWait);} +#endif /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0 */ + +#undef traceTASK_NOTIFY_WAIT_BLOCK +#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0) +#define traceTASK_NOTIFY_WAIT_BLOCK(index) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_WAIT_BLOCK, (uint32_t)pxCurrentTCB, xTicksToWait); +#else /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0 */ +#define traceTASK_NOTIFY_WAIT_BLOCK() \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + prvTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_WAIT_BLOCK, (uint32_t)pxCurrentTCB, xTicksToWait); +#endif /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0 */ + +#undef traceTASK_NOTIFY +#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0) +#define traceTASK_NOTIFY(index) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(TASK, xTaskToNotify) & CurrentFilterMask) \ + prvTraceStoreEvent1(PSF_EVENT_TASK_NOTIFY, (uint32_t)xTaskToNotify); +#else /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0 */ +#define traceTASK_NOTIFY() \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(TASK, xTaskToNotify) & CurrentFilterMask) \ + prvTraceStoreEvent1(PSF_EVENT_TASK_NOTIFY, (uint32_t)xTaskToNotify); +#endif /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0 */ + +#undef traceTASK_NOTIFY_FROM_ISR +#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0) +#define traceTASK_NOTIFY_FROM_ISR(index) \ + if (TRACE_GET_OBJECT_FILTER(TASK, xTaskToNotify) & CurrentFilterMask) \ + prvTraceStoreEvent1(PSF_EVENT_TASK_NOTIFY_FROM_ISR, (uint32_t)xTaskToNotify); +#else /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0 */ +#define traceTASK_NOTIFY_FROM_ISR() \ + if (TRACE_GET_OBJECT_FILTER(TASK, xTaskToNotify) & CurrentFilterMask) \ + prvTraceStoreEvent1(PSF_EVENT_TASK_NOTIFY_FROM_ISR, (uint32_t)xTaskToNotify); +#endif /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0 */ + +#undef traceTASK_NOTIFY_GIVE_FROM_ISR +#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0) +#define traceTASK_NOTIFY_GIVE_FROM_ISR(index) \ + if (TRACE_GET_OBJECT_FILTER(TASK, xTaskToNotify) & CurrentFilterMask) \ + prvTraceStoreEvent1(PSF_EVENT_TASK_NOTIFY_GIVE_FROM_ISR, (uint32_t)xTaskToNotify); +#else /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0 */ +#define traceTASK_NOTIFY_GIVE_FROM_ISR() \ + if (TRACE_GET_OBJECT_FILTER(TASK, xTaskToNotify) & CurrentFilterMask) \ + prvTraceStoreEvent1(PSF_EVENT_TASK_NOTIFY_GIVE_FROM_ISR, (uint32_t)xTaskToNotify); +#endif /* TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0 */ + +#undef traceQUEUE_REGISTRY_ADD +#define traceQUEUE_REGISTRY_ADD(object, name) \ + prvTraceSaveObjectSymbol(object, (const char*)name); \ + prvTraceStoreStringEvent(1, PSF_EVENT_OBJ_NAME, name, object); + +#if (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1) + +#undef traceSTREAM_BUFFER_CREATE +#define traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer ) \ + TRACE_SET_OBJECT_FILTER(STREAMBUFFER, pxStreamBuffer, CurrentFilterGroup); \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(STREAMBUFFER, pxStreamBuffer) & CurrentFilterMask) \ + prvTraceStoreEvent2(xIsMessageBuffer == 1 ? PSF_EVENT_MESSAGEBUFFER_CREATE : PSF_EVENT_STREAMBUFFER_CREATE, (uint32_t)pxStreamBuffer, xBufferSizeBytes); + +#undef traceSTREAM_BUFFER_CREATE_FAILED +#define traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + prvTraceStoreEvent2(xIsMessageBuffer == 1 ? PSF_EVENT_MESSAGEBUFFER_CREATE_FAILED : PSF_EVENT_STREAMBUFFER_CREATE_FAILED, 0 , xBufferSizeBytes); + +#undef traceSTREAM_BUFFER_CREATE_STATIC_FAILED +#define traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer ) \ + traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ) + +#undef traceSTREAM_BUFFER_DELETE +#define traceSTREAM_BUFFER_DELETE( xStreamBuffer ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(STREAMBUFFER, pxStreamBuffer) & CurrentFilterMask) \ + prvTraceStoreEvent2(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_DELETE : PSF_EVENT_STREAMBUFFER_DELETE, (uint32_t)xStreamBuffer, prvBytesInBuffer(xStreamBuffer)); \ + prvTraceDeleteSymbol(xStreamBuffer); + +#undef traceSTREAM_BUFFER_RESET +#define traceSTREAM_BUFFER_RESET( xStreamBuffer ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(STREAMBUFFER, xStreamBuffer) & CurrentFilterMask) \ + prvTraceStoreEvent2(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_RESET : PSF_EVENT_STREAMBUFFER_RESET, (uint32_t)xStreamBuffer, 0); + +#undef traceSTREAM_BUFFER_SEND +#define traceSTREAM_BUFFER_SEND( xStreamBuffer, xReturn ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(STREAMBUFFER, xStreamBuffer) & CurrentFilterMask) \ + prvTraceStoreEvent2(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_SEND : PSF_EVENT_STREAMBUFFER_SEND, (uint32_t)xStreamBuffer, prvBytesInBuffer(xStreamBuffer)); + +#undef traceBLOCKING_ON_STREAM_BUFFER_SEND +#define traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(STREAMBUFFER, xStreamBuffer) & CurrentFilterMask) \ + prvTraceStoreEvent1(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_SEND_BLOCK : PSF_EVENT_STREAMBUFFER_SEND_BLOCK, (uint32_t)xStreamBuffer); + +#undef traceSTREAM_BUFFER_SEND_FAILED +#define traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(STREAMBUFFER, xStreamBuffer) & CurrentFilterMask) \ + prvTraceStoreEvent1(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_SEND_FAILED : PSF_EVENT_STREAMBUFFER_SEND_FAILED, (uint32_t)xStreamBuffer); + +#undef traceSTREAM_BUFFER_RECEIVE +#define traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(STREAMBUFFER, xStreamBuffer) & CurrentFilterMask) \ + prvTraceStoreEvent2(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_RECEIVE: PSF_EVENT_STREAMBUFFER_RECEIVE, (uint32_t)xStreamBuffer, prvBytesInBuffer(xStreamBuffer)); + +#undef traceBLOCKING_ON_STREAM_BUFFER_RECEIVE +#define traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(STREAMBUFFER, xStreamBuffer) & CurrentFilterMask) \ + prvTraceStoreEvent1(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_RECEIVE_BLOCK: PSF_EVENT_STREAMBUFFER_RECEIVE_BLOCK, (uint32_t)xStreamBuffer); + +#undef traceSTREAM_BUFFER_RECEIVE_FAILED +#define traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(STREAMBUFFER, xStreamBuffer) & CurrentFilterMask) \ + prvTraceStoreEvent1(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_RECEIVE_FAILED: PSF_EVENT_STREAMBUFFER_RECEIVE_FAILED, (uint32_t)xStreamBuffer); + +#undef traceSTREAM_BUFFER_SEND_FROM_ISR +#define traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xReturn ) \ + if (TRACE_GET_OBJECT_FILTER(STREAMBUFFER, xStreamBuffer) & CurrentFilterMask) \ + { \ + if ( xReturn > ( size_t ) 0 ) \ + { \ + prvTraceStoreEvent2(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_SEND_FROM_ISR : PSF_EVENT_STREAMBUFFER_SEND_FROM_ISR, (uint32_t)xStreamBuffer, prvBytesInBuffer(xStreamBuffer)); \ + } \ + else \ + { \ + prvTraceStoreEvent1(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_SEND_FROM_ISR_FAILED : PSF_EVENT_STREAMBUFFER_SEND_FROM_ISR_FAILED, (uint32_t)xStreamBuffer); \ + } \ + } + +#undef traceSTREAM_BUFFER_RECEIVE_FROM_ISR +#define traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength ) \ +if (TRACE_GET_OBJECT_FILTER(STREAMBUFFER, xStreamBuffer) & CurrentFilterMask) \ + { \ + if ( xReceivedLength > ( size_t ) 0 ) \ + { \ + prvTraceStoreEvent2(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_RECEIVE_FROM_ISR : PSF_EVENT_STREAMBUFFER_RECEIVE_FROM_ISR, (uint32_t)xStreamBuffer, prvBytesInBuffer(xStreamBuffer)); \ + } \ + else \ + { \ + prvTraceStoreEvent1(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_RECEIVE_FROM_ISR_FAILED : PSF_EVENT_STREAMBUFFER_RECEIVE_FROM_ISR_FAILED, (uint32_t)xStreamBuffer); \ + } \ + } + +#endif /* (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1) */ + +#endif /* (TRC_CFG_SCHEDULING_ONLY == 0) */ + +#endif /* (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) */ + +#else /* (TRC_USE_TRACEALYZER_RECORDER == 1) */ + +/* When recorder is disabled */ +#define vTraceSetQueueName(object, name) +#define vTraceSetSemaphoreName(object, name) +#define vTraceSetMutexName(object, name) +#define vTraceSetEventGroupName(object, name) +#define vTraceSetStreamBufferName(object, name) +#define vTraceSetMessageBufferName(object, name) + +#endif /* (TRC_USE_TRACEALYZER_RECORDER == 1) */ + +#ifdef __cplusplus +} +#endif + +#endif /* TRC_KERNEL_PORT_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/TraceRecorder/include/trcPortDefines.h b/TSM_PicoW_Sensor/McuLib/TraceRecorder/include/trcPortDefines.h new file mode 100644 index 0000000..9743d64 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/TraceRecorder/include/trcPortDefines.h @@ -0,0 +1,140 @@ +/******************************************************************************* + * Trace Recorder Library for Tracealyzer v4.4.1 + * Percepio AB, www.percepio.com + * + * trcPortDefines.h + * + * Some common defines for the trace recorder. + * + * Terms of Use + * This file is part of the trace recorder library (RECORDER), which is the + * intellectual property of Percepio AB (PERCEPIO) and provided under a + * license as follows. + * The RECORDER may be used free of charge for the purpose of recording data + * intended for analysis in PERCEPIO products. It may not be used or modified + * for other purposes without explicit permission from PERCEPIO. + * You may distribute the RECORDER in its original source code form, assuming + * this text (terms of use, disclaimer, copyright notice) is unchanged. You are + * allowed to distribute the RECORDER with minor modifications intended for + * configuration or porting of the RECORDER, e.g., to allow using it on a + * specific processor, processor family or with a specific communication + * interface. Any such modifications should be documented directly below + * this comment block. + * + * Disclaimer + * The RECORDER is being delivered to you AS IS and PERCEPIO makes no warranty + * as to its use or performance. PERCEPIO does not and cannot warrant the + * performance or results you may obtain by using the RECORDER or documentation. + * PERCEPIO make no warranties, express or implied, as to noninfringement of + * third party rights, merchantability, or fitness for any particular purpose. + * In no event will PERCEPIO, its technology partners, or distributors be liable + * to you for any consequential, incidental or special damages, including any + * lost profits or lost savings, even if a representative of PERCEPIO has been + * advised of the possibility of such damages, or for any claim by any third + * party. Some jurisdictions do not allow the exclusion or limitation of + * incidental, consequential or special damages, or the exclusion of implied + * warranties or limitations on how long an implied warranty may last, so the + * above limitations may not apply to you. + * + * Tabs are used for indent in this file (1 tab = 4 spaces) + * + * Copyright Percepio AB, 2018. + * www.percepio.com + ******************************************************************************/ + +#ifndef TRC_PORTDEFINES_H +#define TRC_PORTDEFINES_H + +#define TRC_FREE_RUNNING_32BIT_INCR 1 +#define TRC_FREE_RUNNING_32BIT_DECR 2 +#define TRC_OS_TIMER_INCR 3 +#define TRC_OS_TIMER_DECR 4 +#define TRC_CUSTOM_TIMER_INCR 5 +#define TRC_CUSTOM_TIMER_DECR 6 + +/* Start options for vTraceEnable. */ +#define TRC_INIT 0 +#define TRC_START 1 +#define TRC_START_AWAIT_HOST 2 + +/* Command codes for TzCtrl task */ +#define CMD_SET_ACTIVE 1 /* Start (param1 = 1) or Stop (param1 = 0) */ + +/* The final command code, used to validate commands. */ +#define CMD_LAST_COMMAND 1 + +#define TRC_RECORDER_MODE_SNAPSHOT 0 +#define TRC_RECORDER_MODE_STREAMING 1 + +#define TRC_RECORDER_BUFFER_ALLOCATION_STATIC (0x00) +#define TRC_RECORDER_BUFFER_ALLOCATION_DYNAMIC (0x01) +#define TRC_RECORDER_BUFFER_ALLOCATION_CUSTOM (0x02) + +/* Filter Groups */ +#define FilterGroup0 (uint16_t)0x0001 +#define FilterGroup1 (uint16_t)0x0002 +#define FilterGroup2 (uint16_t)0x0004 +#define FilterGroup3 (uint16_t)0x0008 +#define FilterGroup4 (uint16_t)0x0010 +#define FilterGroup5 (uint16_t)0x0020 +#define FilterGroup6 (uint16_t)0x0040 +#define FilterGroup7 (uint16_t)0x0080 +#define FilterGroup8 (uint16_t)0x0100 +#define FilterGroup9 (uint16_t)0x0200 +#define FilterGroup10 (uint16_t)0x0400 +#define FilterGroup11 (uint16_t)0x0800 +#define FilterGroup12 (uint16_t)0x1000 +#define FilterGroup13 (uint16_t)0x2000 +#define FilterGroup14 (uint16_t)0x4000 +#define FilterGroup15 (uint16_t)0x8000 + +/****************************************************************************** + * Supported ports + * + * TRC_HARDWARE_PORT_HWIndependent + * A hardware independent fallback option for event timestamping. Provides low + * resolution timestamps based on the OS tick. + * This may be used on the Win32 port, but may also be used on embedded hardware + * platforms. All time durations will be truncated to the OS tick frequency, + * typically 1 KHz. This means that a task or ISR that executes in less than + * 1 ms get an execution time of zero. + * + * TRC_HARDWARE_PORT_APPLICATION_DEFINED + * Allows for defining the port macros in other source code files. + * + * TRC_HARDWARE_PORT_Win32 + * "Accurate" timestamping based on the Windows performance counter for Win32 + * builds. Note that this gives the host machine time, not the kernel time. + * + * Hardware specific ports + * To get accurate timestamping, a hardware timer is necessary. Below are the + * available ports. Some of these are "unofficial", meaning that + * they have not yet been verified by Percepio but have been contributed by + * external developers. They should work, otherwise let us know by emailing + * support@percepio.com. Some work on any OS platform, while other are specific + * to a certain operating system. + *****************************************************************************/ + +/****** Port Name ************************************* Code ** Official ** OS Platform *********/ +#define TRC_HARDWARE_PORT_APPLICATION_DEFINED 98 /* - - */ +#define TRC_HARDWARE_PORT_NOT_SET 99 /* - - */ +#define TRC_HARDWARE_PORT_HWIndependent 0 /* Yes Any */ +#define TRC_HARDWARE_PORT_Win32 1 /* Yes FreeRTOS on Win32 */ +#define TRC_HARDWARE_PORT_Atmel_AT91SAM7 2 /* No Any */ +#define TRC_HARDWARE_PORT_Atmel_UC3A0 3 /* No Any */ +#define TRC_HARDWARE_PORT_ARM_Cortex_M 4 /* Yes Any */ +#define TRC_HARDWARE_PORT_Renesas_RX600 6 /* Yes Any */ +#define TRC_HARDWARE_PORT_MICROCHIP_PIC24_PIC32 7 /* Yes Any */ +#define TRC_HARDWARE_PORT_TEXAS_INSTRUMENTS_TMS570_RM48 8 /* Yes Any */ +#define TRC_HARDWARE_PORT_TEXAS_INSTRUMENTS_MSP430 9 /* No Any */ +#define TRC_HARDWARE_PORT_XILINX_PPC405 11 /* No FreeRTOS */ +#define TRC_HARDWARE_PORT_XILINX_PPC440 12 /* No FreeRTOS */ +#define TRC_HARDWARE_PORT_XILINX_MICROBLAZE 13 /* No Any */ +#define TRC_HARDWARE_PORT_XILINX_ZyncUltraScaleR5 14 /* No FreeRTOS */ +#define TRC_HARDWARE_PORT_NXP_LPC210X 15 /* No Any */ +#define TRC_HARDWARE_PORT_ARM_CORTEX_A9 16 /* Yes Any */ +#define TRC_HARDWARE_PORT_POWERPC_Z4 17 /* No FreeRTOS */ +#define TRC_HARDWARE_PORT_Altera_NiosII 18 /* Yes Any (Tested with FreeRTOS) */ +#define TRC_HARDWARE_PORT_PROCESSOR_EXPERT 95 /* No FreeRTOS */ /* << EST */ +#endif /*TRC_PORTDEFINES_H*/ + diff --git a/TSM_PicoW_Sensor/McuLib/TraceRecorder/include/trcRecorder.h b/TSM_PicoW_Sensor/McuLib/TraceRecorder/include/trcRecorder.h new file mode 100644 index 0000000..da68672 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/TraceRecorder/include/trcRecorder.h @@ -0,0 +1,1912 @@ +/******************************************************************************* + * Trace Recorder Library for Tracealyzer v4.4.1 + * Percepio AB, www.percepio.com + * + * trcRecorder.h + * + * The public API of the trace recorder. + * + * Terms of Use + * This file is part of the trace recorder library (RECORDER), which is the + * intellectual property of Percepio AB (PERCEPIO) and provided under a + * license as follows. + * The RECORDER may be used free of charge for the purpose of recording data + * intended for analysis in PERCEPIO products. It may not be used or modified + * for other purposes without explicit permission from PERCEPIO. + * You may distribute the RECORDER in its original source code form, assuming + * this text (terms of use, disclaimer, copyright notice) is unchanged. You are + * allowed to distribute the RECORDER with minor modifications intended for + * configuration or porting of the RECORDER, e.g., to allow using it on a + * specific processor, processor family or with a specific communication + * interface. Any such modifications should be documented directly below + * this comment block. + * + * Disclaimer + * The RECORDER is being delivered to you AS IS and PERCEPIO makes no warranty + * as to its use or performance. PERCEPIO does not and cannot warrant the + * performance or results you may obtain by using the RECORDER or documentation. + * PERCEPIO make no warranties, express or implied, as to noninfringement of + * third party rights, merchantability, or fitness for any particular purpose. + * In no event will PERCEPIO, its technology partners, or distributors be liable + * to you for any consequential, incidental or special damages, including any + * lost profits or lost savings, even if a representative of PERCEPIO has been + * advised of the possibility of such damages, or for any claim by any third + * party. Some jurisdictions do not allow the exclusion or limitation of + * incidental, consequential or special damages, or the exclusion of implied + * warranties or limitations on how long an implied warranty may last, so the + * above limitations may not apply to you. + * + * Tabs are used for indent in this file (1 tab = 4 spaces) + * + * Copyright Percepio AB, 2018. + * www.percepio.com + ******************************************************************************/ + +#ifndef TRC_RECORDER_H +#define TRC_RECORDER_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef __HIWARE__ /* << EST */ + #include +#endif +#include +#include + +#define TRC_ACKNOWLEDGED (0xABC99123) + +#include "trcConfig.h" +#include "trcPortDefines.h" + +#if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_SNAPSHOT) + +typedef uint16_t traceString; +typedef uint8_t traceUBChannel; +typedef uint8_t traceObjectClass; + +#if (TRC_CFG_USE_16BIT_OBJECT_HANDLES == 1) +typedef uint16_t traceHandle; +#else /* (TRC_CFG_USE_16BIT_OBJECT_HANDLES == 1) */ +typedef uint8_t traceHandle; +#endif /* (TRC_CFG_USE_16BIT_OBJECT_HANDLES == 1) */ + +#include "trcHardwarePort.h" +#include "trcKernelPort.h" + +/* Not yet available in snapshot mode */ +#define vTraceConsoleChannelPrintF(fmt, ...) (void)(fmt) +#define prvTraceStoreEvent0(...) +#define prvTraceStoreEvent1(...) +#define prvTraceStoreEvent2(...) +#define prvTraceStoreEvent3(...) +#define prvTraceStoreEvent(...) +#define prvTraceStoreStringEvent(...) + +#endif /* (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_SNAPSHOT) */ + +#if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) + +typedef const char* traceString; +typedef const void* traceHandle; + +#include "trcHardwarePort.h" +#include "trcStreamingPort.h" +#include "trcKernelPort.h" + +#endif /* (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) */ + +#if (TRC_USE_TRACEALYZER_RECORDER == 1) + +#define TRC_STATE_IN_STARTUP 0 +#define TRC_STATE_IN_TASKSWITCH 1 +#define TRC_STATE_IN_APPLICATION 2 + +/* The user event channel for recorder warnings, must be defined in trcKernelPort.c */ +extern traceString trcWarningChannel; + +#define TRACE_GET_LOW16(value) ((uint16_t)((value) & 0x0000FFFF)) +#define TRACE_GET_HIGH16(value) ((uint16_t)(((value) >> 16) & 0x0000FFFF)) +#define TRACE_SET_LOW16(current, value) (((current) & 0xFFFF0000) | (value)) +#define TRACE_SET_HIGH16(current, value) (((current) & 0x0000FFFF) | (((uint32_t)(value)) << 16)) + +/******************************************************************************/ +/*** Common API - both Snapshot and Streaming mode ****************************/ +/******************************************************************************/ + +/****************************************************************************** +* vTraceEnable(int startOption); +* +* Initializes and optionally starts the trace, depending on the start option. +* To use the trace recorder, the startup must call vTraceEnable before any RTOS +* calls are made (including "create" calls). Three start options are provided: +* +* TRC_START: Starts the tracing directly. In snapshot mode this allows for +* starting the trace at any point in your code, assuming vTraceEnable(TRC_INIT) +* has been called in the startup. +* Can also be used for streaming without Tracealyzer control, e.g. to a local +* flash file system (assuming such a "stream port", see trcStreamingPort.h). +* +* TRC_START_AWAIT_HOST: For streaming mode only. Initializes the trace recorder +* if necessary and waits for a Start command from Tracealyzer ("Start Recording" +* button). This call is intentionally blocking! By calling vTraceEnable with +* this option from the startup code, you start tracing at this point and capture +* the early events. +* +* TRC_INIT: Initializes the trace recorder, but does not start the tracing. +* In snapshot mode, this must be followed by a vTraceEnable(TRC_START) sometime +* later. +* +* Usage examples: +* +* Snapshot trace, from startup: +* +* vTraceEnable(TRC_START); +* +* +* Snapshot trace, from a later point: +* +* vTraceEnable(TRC_INIT); +* +* ... +* vTraceEnable(TRC_START); // e.g., in task context, at some relevant event +* +* Streaming trace, from startup: +* +* vTraceEnable(TRC_START_AWAIT_HOST); // Blocks! +* +* +* Streaming trace, from a later point: +* +* vTraceEnable(TRC_INIT); +* +* +******************************************************************************/ +void vTraceEnable(int startOption); + +/****************************************************************************** + * vTracePrintF + * + * Generates "User Events", with formatted text and data, similar to a "printf". + * User Events can be used for very efficient logging from your application code. + * It is very fast since the actual string formatting is done on the host side, + * when the trace is displayed. The execution time is just some microseconds on + * a 32-bit MCU. + * + * User Events are shown as yellow labels in the main trace view of $PNAME. + * + * An advantage of User Events is that data can be plotted in the "User Event + * Signal Plot" view, visualizing any data you log as User Events, discrete + * states or control system signals (e.g. system inputs or outputs). + * + * You may group User Events into User Event Channels. The yellow User Event + * labels show the logged string, preceded by the channel name within brackets. + * + * Example: + * + * "[MyChannel] Hello World!" + * + * The User Event Channels are shown in the View Filter, which makes it easy to + * select what User Events you wish to display. User Event Channels are created + * using xTraceRegisterString(). + * + * Example: + * + * traceString adc_uechannel = xTraceRegisterString("ADC User Events"); + * ... + * vTracePrintF(adc_uechannel, + * "ADC channel %d: %d volts", + * ch, adc_reading); + * + * The following format specifiers are supported in both modes: + * %d - signed integer. + * %u - unsigned integer. + * %X - hexadecimal, uppercase. + * %x - hexadecimal, lowercase. + * %s - string (see comment below) + * + * For integer formats (%d, %u, %x, %X) you may also use width and padding. + * If using -42 as data argument, two examples are: + * "%05d" -> "-0042" + * "%5d" -> " -42". + * + * String arguments are supported in both snapshot and streaming, but in streaming + * mode you need to use xTraceRegisterString and use the returned traceString as + * the argument. In snapshot you simply provide a char* as argument. + * + * Snapshot: vTracePrintF(myChn, "my string: %s", str); + * Streaming: vTracePrintF(myChn, "my string: %s", xTraceRegisterString(str)); + * + * In snapshot mode you can specify 8-bit or 16-bit arguments to reduce RAM usage: + * %hd -> 16 bit (h) signed integer (d). + * %bu -> 8 bit (b) unsigned integer (u). + * + * However, in streaming mode all data arguments are assumed to be 32 bit wide. + * Width specifiers (e.g. %hd) are accepted but ignored (%hd treated like %d). + * + * The maximum event size also differs between the modes. In streaming this is + * limited by a maximum payload size of 52 bytes, including format string and + * data arguments. So if using one data argument, the format string is limited + * to 48 byte, etc. If this is exceeded, the format string is truncated and you + * get a warning in Tracealyzer. + * + * In snapshot mode you are limited to maximum 15 arguments, that must not exceed + * 32 bytes in total (not counting the format string). If exceeded, the recorder + * logs an internal error (displayed when opening the trace) and stops recording. + ******************************************************************************/ +#if (TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1) +void vTracePrintF(traceString chn, const char* fmt, ...); +#else +#define vTracePrintF(chn, fmt, ...) (void)(chn), (void)(fmt) /* Comma operator is used to avoid "unused variable" compiler warnings in a single statement */ +#endif + +/****************************************************************************** + * vTraceVPrintF + * + * vTracePrintF variant that accepts a va_list. + * See vTracePrintF documentation for further details. + * + ******************************************************************************/ +#if (TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1) +void vTraceVPrintF(traceString eventLabel, const char* formatStr, va_list vl); +#else +#define vTraceVPrintF(chn, formatStr, vl) (void)(chn), (void)(formatStr), (void)(vl) /* Comma operator is used to avoid "unused variable" compiler warnings in a single statement */ +#endif + +/****************************************************************************** +* vTracePrint +* +* A faster version of vTracePrintF, that only allows for logging a string. +* +* Example: +* +* traceString chn = xTraceRegisterString("MyChannel"); +* ... +* vTracePrint(chn, "Hello World!"); +******************************************************************************/ +#if (TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1) +void vTracePrint(traceString chn, const char* str); +#else +#define vTracePrint(chn, str) (void)(chn), (void)(str) /* Comma operator is used to avoid "unused variable" compiler warnings in a single statement */ +#endif + + +/******************************************************************************* +* vTraceConsoleChannelPrintF +* +* Wrapper for vTracePrint, using the default channel. Can be used as a drop-in +* replacement for printf and similar functions, e.g. in a debug logging macro. +* +* Example: +* +* // Old: #define LogString debug_console_printf +* +* // New, log to Tracealyzer instead: +* #define LogString vTraceConsoleChannelPrintF +* ... +* LogString("My value is: %d", myValue); +******************************************************************************/ +#if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) +void vTraceConsoleChannelPrintF(const char* fmt, ...); +#endif + +/******************************************************************************* +* xTraceRegisterString +* +* Register strings in the recorder, e.g. for names of user event channels. +* +* Example: +* myEventHandle = xTraceRegisterString("MyUserEvent"); +* ... +* vTracePrintF(myEventHandle, "My value is: %d", myValue); +******************************************************************************/ +#if (TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1) +traceString xTraceRegisterString(const char* name); +#else +#define xTraceRegisterString(x) ((void)(x), (traceString)0) /* Comma operator in parenthesis is used to avoid "unused variable" compiler warnings and return 0 in a single statement */ +#endif + +/******************************************************************************* + * vTraceSet...Name(void* object, const char* name) + * + * Parameter object: pointer to the kernel object that shall be named + * Parameter name: the name to set + * + * Kernel-specific functions for setting names of kernel objects, for display in + * Tracealyzer. + ******************************************************************************/ +/* See trcKernelPort.h for details (kernel-specific) */ + +/******************************************************************************* + * xTraceSetISRProperties + * + * Stores a name and priority level for an Interrupt Service Routine, to allow + * for better visualization. Returns a traceHandle used by vTraceStoreISRBegin. + * + * Example: + * #define PRIO_ISR_TIMER1 3 // the hardware priority of the interrupt + * ... + * traceHandle Timer1Handle = xTraceSetISRProperties("ISRTimer1", PRIO_ISR_TIMER1); + * ... + * void ISR_handler() + * { + * vTraceStoreISRBegin(Timer1Handle); + * ... + * vTraceStoreISREnd(0); + * } + ******************************************************************************/ +traceHandle xTraceSetISRProperties(const char* name, uint8_t priority); + +/******************************************************************************* + * vTraceStoreISRBegin + * + * Registers the beginning of an Interrupt Service Routine, using a traceHandle + * provided by xTraceSetISRProperties. + * + * Example: + * #define PRIO_ISR_TIMER1 3 // the hardware priority of the interrupt + * ... + * traceHandle Timer1Handle = xTraceSetISRProperties("ISRTimer1", PRIO_ISR_TIMER1); + * ... + * void ISR_handler() + * { + * vTraceStoreISRBegin(Timer1Handle); + * ... + * vTraceStoreISREnd(0); + * } + ******************************************************************************/ +void vTraceStoreISRBegin(traceHandle handle); + +/******************************************************************************* + * vTraceStoreISREnd + * + * Registers the end of an Interrupt Service Routine. + * + * The parameter pendingISR indicates if the interrupt has requested a + * task-switch (= 1), e.g., by signaling a semaphore. Otherwise (= 0) the + * interrupt is assumed to return to the previous context. + * + * Example: + * #define PRIO_OF_ISR_TIMER1 3 // the hardware priority of the interrupt + * traceHandle traceHandleIsrTimer1 = 0; // The ID set by the recorder + * ... + * traceHandleIsrTimer1 = xTraceSetISRProperties("ISRTimer1", PRIO_OF_ISR_TIMER1); + * ... + * void ISR_handler() + * { + * vTraceStoreISRBegin(traceHandleIsrTimer1); + * ... + * vTraceStoreISREnd(0); + * } + ******************************************************************************/ +void vTraceStoreISREnd(int isTaskSwitchRequired); + +/******************************************************************************* + * vTraceInstanceFinishNow + * + * Creates an event that ends the current task instance at this very instant. + * This makes the viewer to splits the current fragment at this point and begin + * a new actor instance, even if no task-switch has occurred. + *****************************************************************************/ +void vTraceInstanceFinishedNow(void); + +/******************************************************************************* + * vTraceInstanceFinishedNext + * + * Marks the current "task instance" as finished on the next kernel call. + * + * If that kernel call is blocking, the instance ends after the blocking event + * and the corresponding return event is then the start of the next instance. + * If the kernel call is not blocking, the viewer instead splits the current + * fragment right before the kernel call, which makes this call the first event + * of the next instance. + *****************************************************************************/ +void vTraceInstanceFinishedNext(void); + +/******************************************************************************* + * xTraceGetLastError + * + * Returns the last error or warning as a string, or NULL if none. + *****************************************************************************/ +const char* xTraceGetLastError(void); + +/******************************************************************************* + * vTraceClearError + * + * Clears any errors. + *****************************************************************************/ +void vTraceClearError(void); + +/******************************************************************************* +* vTraceStop +* +* Stops the recording. Intended for snapshot mode or if streaming without +* Tracealyzer control (e.g., to a device file system). +******************************************************************************/ +void vTraceStop(void); + +/****************************************************************************** +* vTraceSetFrequency +* +* Registers the clock rate of the time source for the event timestamping. +* This is normally not required, but if the default value (TRC_HWTC_FREQ_HZ) +* should be incorrect for your setup, you can override it using this function. +* +* Must be called prior to vTraceEnable, and the time source is assumed to +* have a fixed clock frequency after the startup. +* +* Note that, in snapshot mode, the value is divided by the TRC_HWTC_DIVISOR. +* This is a software "prescaler" that is also applied on the timestamps. +*****************************************************************************/ +void vTraceSetFrequency(uint32_t frequency); + +/******************************************************************************* +* vTraceSetRecorderDataBuffer +* +* The trcConfig.h setting TRC_CFG_RECORDER_BUFFER_ALLOCATION allows for selecting +* custom allocation (TRC_RECORDER_BUFFER_ALLOCATION_CUSTOM), which allows you to +* control where the recorder trace buffer is allocated. +* +* When custom allocation is selected, use TRC_ALLOC_CUSTOM_BUFFER to make the +* allocation (in global context) and then call vTraceSetRecorderDataBuffer to +* register the allocated buffer. This supports both snapshot and streaming, +* and has no effect if using other allocation modes than CUSTOM. +* +* NOTE: vTraceSetRecorderDataBuffer must be called before vTraceEnable. +******************************************************************************/ +#if (TRC_CFG_RECORDER_BUFFER_ALLOCATION == TRC_RECORDER_BUFFER_ALLOCATION_CUSTOM) +void vTraceSetRecorderDataBuffer(void* pRecorderData); +#else +#define vTraceSetRecorderDataBuffer(pRecorderData) /* If not CUSTOM, pRecorderData will be an undefined symbol (same as in TRC_ALLOC_CUSTOM_BUFFER), so no (void) here */ +#endif + + +/******************************************************************************* +* TRC_ALLOC_CUSTOM_BUFFER +* +* If using custom allocation of the trace buffer (i.e., your trcConfig.h has the +* setting TRC_RECORDER_BUFFER_ALLOCATION_CUSTOM), this macro allows you to declare +* the trace buffer in a portable way that works both in snapshot and streaming. +* +* This macro has no effect if using another allocation mode, so you can easily +* switch between different recording modes and configurations, using the same +* initialization code. +* +* This translates to a single static allocation, on which you can apply linker +* directives to place it in a particular memory region. +* +* - Snapshot mode: "RecorderDataType " +* +* - Streaming mode: "char []", +* where is defined in trcStreamingConfig.h. +* +* Example: +* +* // GCC example: place myTraceBuffer in section .tz, defined in the .ld file. +* TRC_ALLOC_CUSTOM_BUFFER(myTraceBuffer) __attribute__((section(".tz"))); +* +* int main(void) +* { +* ... +* vTraceSetRecorderDataBuffer(&myTraceBuffer); // Note the "&" +* ... +* vTraceEnable(TRC_INIT); // Initialize the data structure +******************************************************************************/ +#if (TRC_CFG_RECORDER_BUFFER_ALLOCATION == TRC_RECORDER_BUFFER_ALLOCATION_CUSTOM) + #if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_SNAPSHOT) + #define TRC_ALLOC_CUSTOM_BUFFER(bufname) RecorderDataType bufname; + #elif (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) + #ifdef TRC_CFG_RTT_BUFFER_SIZE_UP /* J-Link RTT */ + #define TRC_ALLOC_CUSTOM_BUFFER(bufname) char bufname [TRC_CFG_RTT_BUFFER_SIZE_UP]; /* Not static in this case, since declared in user code */ + #else + #define TRC_ALLOC_CUSTOM_BUFFER(bufname) char bufname [(TRC_CFG_PAGED_EVENT_BUFFER_PAGE_COUNT) * (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_SIZE)]; + #endif + #endif +#else + #define TRC_ALLOC_CUSTOM_BUFFER(bufname) /* If not CUSTOM, bufname will be an undefined symbol (same as in vTraceSetRecorderDataBuffer), so no (void) here */ +#endif + +/****************************************************************************** +* xTraceIsRecordingEnabled +* +* Returns true (1) if the recorder is enabled (i.e. is recording), otherwise 0. +******************************************************************************/ +int xTraceIsRecordingEnabled(void); + +/******************************************************************************* +* vTraceSetFilterGroup +* +* Sets the "filter group" to assign when creating RTOS objects, such as tasks, +* queues, semaphores and mutexes. This together with vTraceSetFilterMask +* allows you to control what events that are recorded, based on the +* objects they refer to. +* +* There are 16 filter groups named FilterGroup0 .. FilterGroup15. +* +* Note: We don't recommend filtering out the Idle task, so make sure to call +* vTraceSetFilterGroup just before initializing the RTOS, in order to assign +* such "default" objects to the right Filter Group (typically group 0). +* +* Example: +* +* // Assign tasks T1 to FilterGroup0 (default) +* +* +* // Assign Q1 and Q2 to FilterGroup1 +* vTraceSetFilterGroup(FilterGroup1); +* +* +* +* // Assigns Q3 to FilterGroup2 +* vTraceSetFilterGroup(FilterGroup2); +* +* +* // Only include FilterGroup0 and FilterGroup2, exclude FilterGroup1 (Q1 and Q2) from the trace +* vTraceSetFilterMask( FilterGroup0 | FilterGroup2 ); +* +* // Assign the default RTOS objects (e.g. Idle task) to FilterGroup0 +* vTraceSetFilterGroup(FilterGroup0); +* +* +* Note that you may define your own names for the filter groups using +* preprocessor definitions, to make the code easier to understand. +* +* Example: +* +* #define BASE FilterGroup0 +* #define USB_EVENTS FilterGroup1 +* #define CAN_EVENTS FilterGroup2 +* +* Note that filtering per event type (regardless of object) is also available +* in trcConfig.h. +******************************************************************************/ +void vTraceSetFilterGroup(uint16_t filterGroup); + +/****************************************************************************** +* vTraceSetFilterMask +* +* Sets the "filter mask" that is used to filter the events by object. This can +* be used to reduce the trace data rate, i.e., if your streaming interface is +* a bottleneck or if you want longer snapshot traces without increasing the +* buffer size. +* +* Note: There are two kinds of filters in the recorder. The other filter type +* excludes all events of certain kinds (e.g., OS ticks). See trcConfig.h. +* +* The filtering is based on bitwise AND with the Filter Group ID, assigned +* to RTOS objects such as tasks, queues, semaphores and mutexes. +* This together with vTraceSetFilterGroup allows you to control what +* events that are recorded, based on the objects they refer to. +* +* See example for vTraceSetFilterGroup. +******************************************************************************/ +void vTraceSetFilterMask(uint16_t filterMask); + +#if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_SNAPSHOT) + +/******************************************************************************/ +/*** Extended API for Snapshot mode *******************************************/ +/******************************************************************************/ + +/****************************************************************************** +* TRACE_STOP_HOOK - Hook Pointer Data Type +* +* Declares a data type for a call back function that will be invoked whenever +* the recorder is stopped. +* +* Snapshot mode only! +******************************************************************************/ +typedef void(*TRACE_STOP_HOOK)(void); + +/******************************************************************************* +* vTraceStopHookPtr +* +* Points to a call back function that is called from vTraceStop(). +* +* Snapshot mode only! +******************************************************************************/ +extern TRACE_STOP_HOOK vTraceStopHookPtr; + +/******************************************************************************* +* vTraceSetStopHook +* +* Sets a function to be called when the recorder is stopped. +* +* Snapshot mode only! +******************************************************************************/ +void vTraceSetStopHook(TRACE_STOP_HOOK stopHookFunction); + +/******************************************************************************* +* uiTraceStart +* +* [DEPRECATED] Use vTraceEnable instead. +* +* Starts the recorder. The recorder will not be started if an error has been +* indicated using prvTraceError, e.g. if any of the Nx constants in +* trcSnapshotConfig.h has a too small value (TRC_CFG_NTASK, TRC_CFG_NQUEUE, etc). +* +* Returns 1 if the recorder was started successfully. +* Returns 0 if the recorder start was prevented due to a previous internal +* error. In that case, check xTraceGetLastError to get the error message. +* Any error message is also presented when opening a trace file. +* +* Snapshot mode only! +******************************************************************************/ +uint32_t uiTraceStart(void); + +/******************************************************************************* +* vTraceStart +* +* [DEPRECATED] Use vTraceEnable instead. +* +* Starts the recorder. The recorder will not be started if an error has been +* indicated using prvTraceError, e.g. if any of the Nx constants in +* trcSnapshotConfig.h has a too small value (TRC_CFG_NTASK, TRC_CFG_NQUEUE, etc). +* +* Snapshot mode only! +******************************************************************************/ +void vTraceStart(void); + +/******************************************************************************* +* vTraceClear +* +* Resets the recorder. Only necessary if a restart is desired - this is not +* needed in the startup initialization. +* +* Snapshot mode only! +******************************************************************************/ +void vTraceClear(void); + + +/*****************************************************************************/ +/*** INTERNAL SNAPSHOT FUNCTIONS *********************************************/ +/*****************************************************************************/ + +#define TRC_UNUSED + +#ifndef TRC_CFG_INCLUDE_OBJECT_DELETE +#define TRC_CFG_INCLUDE_OBJECT_DELETE 0 +#endif + +#ifndef TRC_CFG_INCLUDE_READY_EVENTS +#define TRC_CFG_INCLUDE_READY_EVENTS 1 +#endif + +#ifndef TRC_CFG_INCLUDE_OSTICK_EVENTS +#define TRC_CFG_INCLUDE_OSTICK_EVENTS 0 +#endif + +/* This macro will create a task in the object table */ +#undef trcKERNEL_HOOKS_TASK_CREATE +#define trcKERNEL_HOOKS_TASK_CREATE(SERVICE, CLASS, pxTCB) \ + TRACE_SET_OBJECT_NUMBER(TASK, pxTCB); \ + TRACE_SET_OBJECT_FILTER(TASK, pxTCB, CurrentFilterGroup); \ + prvTraceSetObjectName(TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxTCB), TRACE_GET_TASK_NAME(pxTCB)); \ + prvTraceSetPriorityProperty(TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxTCB), TRACE_GET_TASK_PRIORITY(pxTCB)); \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxTCB) & CurrentFilterMask) \ + prvTraceStoreKernelCall(SERVICE, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxTCB)); + +/* This macro will remove the task and store it in the event buffer */ +#undef trcKERNEL_HOOKS_TASK_DELETE +#define trcKERNEL_HOOKS_TASK_DELETE(SERVICE, SERVICE_NAME, SERVICE_PROP, pxTCB) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxTCB) & CurrentFilterMask) \ + prvTraceStoreKernelCall(SERVICE, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxTCB)); \ + prvTraceStoreObjectNameOnCloseEvent(SERVICE_NAME, TRACE_GET_TASK_NUMBER(pxTCB), TRACE_CLASS_TASK); \ + prvTraceStoreObjectPropertiesOnCloseEvent(SERVICE_PROP, TRACE_GET_TASK_NUMBER(pxTCB), TRACE_CLASS_TASK); \ + prvTraceSetPriorityProperty(TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxTCB), TRACE_GET_TASK_PRIORITY(pxTCB)); \ + prvTraceSetObjectState(TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxTCB), TASK_STATE_INSTANCE_NOT_ACTIVE); \ + prvTraceFreeObjectHandle(TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxTCB)); + + +/* This macro will setup a task in the object table */ +#undef trcKERNEL_HOOKS_OBJECT_CREATE +#define trcKERNEL_HOOKS_OBJECT_CREATE(SERVICE, CLASS, pxObject)\ + TRACE_SET_OBJECT_NUMBER(CLASS, pxObject);\ + TRACE_SET_OBJECT_FILTER(CLASS, pxObject, CurrentFilterGroup); \ + prvMarkObjectAsUsed(TRACE_GET_OBJECT_TRACE_CLASS(CLASS, pxObject), TRACE_GET_OBJECT_NUMBER(CLASS, pxObject));\ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(CLASS, pxObject) & CurrentFilterMask) \ + prvTraceStoreKernelCall(SERVICE, TRACE_GET_OBJECT_TRACE_CLASS(CLASS, pxObject), TRACE_GET_OBJECT_NUMBER(CLASS, pxObject)); \ + prvTraceSetObjectState(TRACE_GET_OBJECT_TRACE_CLASS(CLASS, pxObject), TRACE_GET_OBJECT_NUMBER(CLASS, pxObject), 0); + +/* This macro will remove the object and store it in the event buffer */ +#undef trcKERNEL_HOOKS_OBJECT_DELETE +#define trcKERNEL_HOOKS_OBJECT_DELETE(SERVICE, SERVICE_NAME, SERVICE_PROP, CLASS, pxObject) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(CLASS, pxObject) & CurrentFilterMask) \ + prvTraceStoreKernelCall(SERVICE, TRACE_GET_OBJECT_TRACE_CLASS(CLASS, pxObject), TRACE_GET_OBJECT_NUMBER(CLASS, pxObject)); \ + prvTraceStoreObjectNameOnCloseEvent(SERVICE_NAME, TRACE_GET_OBJECT_NUMBER(CLASS, pxObject), TRACE_GET_OBJECT_TRACE_CLASS(CLASS, pxObject)); \ + prvTraceStoreObjectPropertiesOnCloseEvent(SERVICE_PROP, TRACE_GET_OBJECT_NUMBER(CLASS, pxObject), TRACE_GET_OBJECT_TRACE_CLASS(CLASS, pxObject)); \ + prvTraceFreeObjectHandle(TRACE_GET_OBJECT_TRACE_CLASS(CLASS, pxObject), TRACE_GET_OBJECT_NUMBER(CLASS, pxObject)); + +/* This macro will create a call to a kernel service with a certain result, with an object as parameter */ +#undef trcKERNEL_HOOKS_KERNEL_SERVICE +#define trcKERNEL_HOOKS_KERNEL_SERVICE(SERVICE, CLASS, pxObject) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(CLASS, pxObject) & CurrentFilterMask) \ + prvTraceStoreKernelCall(SERVICE, TRACE_GET_OBJECT_TRACE_CLASS(CLASS, pxObject), TRACE_GET_OBJECT_NUMBER(CLASS, pxObject)); + +/* This macro will create a call to a kernel service with a certain result, with a null object as parameter */ +#undef trcKERNEL_HOOKS_KERNEL_SERVICE_NULL_OBJECT +#define trcKERNEL_HOOKS_KERNEL_SERVICE_NULL_OBJECT(SERVICE, TRACECLASS) \ + if (TRACE_GET_TASK_FILTER(TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + prvTraceStoreKernelCall(SERVICE, TRACECLASS, 0); + +/* This macro will create a call to a kernel service with a certain result, with an object as parameter */ +#undef trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM +#define trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(SERVICE, CLASS, pxObject, param) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(CLASS, pxObject) & CurrentFilterMask) \ + prvTraceStoreKernelCallWithParam(SERVICE, TRACE_GET_OBJECT_TRACE_CLASS(CLASS, pxObject), TRACE_GET_OBJECT_NUMBER(CLASS, pxObject), (uint32_t)param); + +/* This macro will create a call to a kernel service with a certain result, with a null object and other value as parameter */ +#undef trcKERNEL_HOOKS_KERNEL_SERVICE_NULL_OBJECT_WITH_PARAM +#define trcKERNEL_HOOKS_KERNEL_SERVICE_NULL_OBJECT_WITH_PARAM(SERVICE, TRACECLASS, param) \ + if (TRACE_GET_TASK_FILTER(TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + prvTraceStoreKernelCallWithParam(SERVICE, TRACECLASS, 0, param); + +/* This macro will create a call to a kernel service with a certain result, with an object as parameter */ +#undef trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_NUMERIC_PARAM_ONLY +#define trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_NUMERIC_PARAM_ONLY(SERVICE, param) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + prvTraceStoreKernelCallWithNumericParamOnly(SERVICE, (uint32_t)param); + +/* This macro will create a call to a kernel service with a certain result, with an object as parameter */ +#undef trcKERNEL_HOOKS_KERNEL_SERVICE_FROM_ISR +#define trcKERNEL_HOOKS_KERNEL_SERVICE_FROM_ISR(SERVICE, CLASS, pxObject) \ + if (TRACE_GET_OBJECT_FILTER(CLASS, pxObject) & CurrentFilterMask) \ + prvTraceStoreKernelCall(SERVICE, TRACE_GET_OBJECT_TRACE_CLASS(CLASS, pxObject), TRACE_GET_OBJECT_NUMBER(CLASS, pxObject)); + +/* This macro will create a call to a kernel service with a certain result, with a null object as parameter */ +#undef trcKERNEL_HOOKS_KERNEL_SERVICE_NULL_OBJECT_FROM_ISR +#define trcKERNEL_HOOKS_KERNEL_SERVICE_NULL_OBJECT_FROM_ISR(SERVICE, TRACECLASS) \ + prvTraceStoreKernelCall(SERVICE, TRACECLASS, 0); + +/* This macro will create a call to a kernel service with a certain result, with an object as parameter */ +#undef trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM_FROM_ISR +#define trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM_FROM_ISR(SERVICE, CLASS, pxObject, param) \ + if (TRACE_GET_OBJECT_FILTER(CLASS, pxObject) & CurrentFilterMask) \ + prvTraceStoreKernelCallWithParam(SERVICE, TRACE_GET_OBJECT_TRACE_CLASS(CLASS, pxObject), TRACE_GET_OBJECT_NUMBER(CLASS, pxObject), (uint32_t)param); + +/* This macro will create a call to a kernel service with a certain result, with a null object and other value as parameter */ +#undef trcKERNEL_HOOKS_KERNEL_SERVICE_NULL_OBJECT_WITH_PARAM_FROM_ISR +#define trcKERNEL_HOOKS_KERNEL_SERVICE_NULL_OBJECT_WITH_PARAM_FROM_ISR(SERVICE, TRACECLASS, param) \ + prvTraceStoreKernelCallWithParam(SERVICE, TRACECLASS, 0, param); + +/* This macro will create a call to a kernel service with a certain result, with an object as parameter */ +#undef trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_NUMERIC_PARAM_ONLY_FROM_ISR +#define trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_NUMERIC_PARAM_ONLY_FROM_ISR(SERVICE, param) \ + prvTraceStoreKernelCallWithNumericParamOnly(SERVICE, (uint32_t)param); + +/* This macro will set the state for an object */ +#undef trcKERNEL_HOOKS_SET_OBJECT_STATE +#define trcKERNEL_HOOKS_SET_OBJECT_STATE(CLASS, pxObject, STATE) \ + prvTraceSetObjectState(TRACE_GET_OBJECT_TRACE_CLASS(CLASS, pxObject), TRACE_GET_OBJECT_NUMBER(CLASS, pxObject), (uint8_t)STATE); + +/* This macro will flag a certain task as a finished instance */ +#undef trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED +#define trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED() \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + prvTraceSetTaskInstanceFinished(TRACE_GET_TASK_NUMBER(TRACE_GET_CURRENT_TASK())); + +#if (TRC_CFG_INCLUDE_READY_EVENTS == 1) +/* This macro will create an event to indicate that a task became Ready */ +#undef trcKERNEL_HOOKS_MOVED_TASK_TO_READY_STATE +#define trcKERNEL_HOOKS_MOVED_TASK_TO_READY_STATE(pxTCB) \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxTCB) & CurrentFilterMask) \ + prvTraceStoreTaskReady(TRACE_GET_TASK_NUMBER(pxTCB)); +#else /*(TRC_CFG_INCLUDE_READY_EVENTS == 1)*/ +#undef trcKERNEL_HOOKS_MOVED_TASK_TO_READY_STATE +#define trcKERNEL_HOOKS_MOVED_TASK_TO_READY_STATE(pxTCB) +#endif /*(TRC_CFG_INCLUDE_READY_EVENTS == 1)*/ + +/* This macro will update the internal tick counter and call prvTracePortGetTimeStamp(0) to update the internal counters */ +#undef trcKERNEL_HOOKS_INCREMENT_TICK +#define trcKERNEL_HOOKS_INCREMENT_TICK() \ + { \ + extern uint32_t uiTraceTickCount; \ + uiTraceTickCount++; \ + prvTracePortGetTimeStamp(0); \ + } + +#if (TRC_CFG_INCLUDE_OSTICK_EVENTS == 1) +/* This macro will create an event indicating that the OS tick count has increased */ +#undef trcKERNEL_HOOKS_NEW_TIME +#define trcKERNEL_HOOKS_NEW_TIME(SERVICE, xValue) \ + prvTraceStoreKernelCallWithNumericParamOnly(SERVICE, xValue); +#else /*(TRC_CFG_INCLUDE_OSTICK_EVENTS == 1)*/ +#undef trcKERNEL_HOOKS_NEW_TIME +#define trcKERNEL_HOOKS_NEW_TIME(SERVICE, xValue) +#endif /*(TRC_CFG_INCLUDE_OSTICK_EVENTS == 1)*/ + +/* This macro will create a task switch event to the currently executing task */ +#undef trcKERNEL_HOOKS_TASK_SWITCH +#define trcKERNEL_HOOKS_TASK_SWITCH( pxTCB ) \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxTCB) & CurrentFilterMask) \ + prvTraceStoreTaskswitch(TRACE_GET_TASK_NUMBER(pxTCB)); + +/* This macro will create an event to indicate that the task has been suspended */ +#undef trcKERNEL_HOOKS_TASK_SUSPEND +#define trcKERNEL_HOOKS_TASK_SUSPEND(SERVICE, pxTCB) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxTCB) & CurrentFilterMask) \ + prvTraceStoreKernelCall(SERVICE, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxTCB)); \ + prvTraceSetTaskInstanceFinished((uint8_t)TRACE_GET_TASK_NUMBER(pxTCB)); + +/* This macro will create an event to indicate that a task has called a wait/delay function */ +#undef trcKERNEL_HOOKS_TASK_DELAY +#define trcKERNEL_HOOKS_TASK_DELAY(SERVICE, pxTCB, xValue) \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxTCB) & CurrentFilterMask) \ + { \ + prvTraceStoreKernelCallWithNumericParamOnly(SERVICE, xValue); \ + prvTraceSetTaskInstanceFinished((uint8_t)TRACE_GET_TASK_NUMBER(pxTCB)); \ + } + +/* This macro will create an event to indicate that a task has gotten its priority changed */ +#undef trcKERNEL_HOOKS_TASK_PRIORITY_CHANGE +#define trcKERNEL_HOOKS_TASK_PRIORITY_CHANGE(SERVICE, pxTCB, uxNewPriority) \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxTCB) & CurrentFilterMask) \ + { \ + prvTraceStoreKernelCallWithParam(SERVICE, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxTCB), prvTraceGetPriorityProperty(TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxTCB)));\ + prvTraceSetPriorityProperty(TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxTCB), (uint8_t)uxNewPriority); \ + } + +/* This macro will create an event to indicate that the task has been resumed */ +#undef trcKERNEL_HOOKS_TASK_RESUME +#define trcKERNEL_HOOKS_TASK_RESUME(SERVICE, pxTCB) \ + if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxTCB) & CurrentFilterMask) \ + prvTraceStoreKernelCall(SERVICE, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxTCB)); + +#undef trcKERNEL_HOOKS_TASK_RESUME_FROM_ISR +#define trcKERNEL_HOOKS_TASK_RESUME_FROM_ISR(SERVICE, pxTCB) \ + if (TRACE_GET_OBJECT_FILTER(TASK, pxTCB) & CurrentFilterMask) \ + prvTraceStoreKernelCall(SERVICE, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxTCB)); + +#if !defined TRC_CFG_INCLUDE_READY_EVENTS || TRC_CFG_INCLUDE_READY_EVENTS == 1 + void prvTraceSetReadyEventsEnabled(int status); + void prvTraceStoreTaskReady(traceHandle handle); +#else + #define prvTraceSetReadyEventsEnabled(status) +#endif + +void prvTraceStoreLowPower(uint32_t flag); + +void prvTraceStoreTaskswitch(traceHandle task_handle); + + +#if (TRC_CFG_SCHEDULING_ONLY == 0) + +void prvTraceStoreKernelCall(uint32_t eventcode, traceObjectClass objectClass, uint32_t byteParam); + +void prvTraceStoreKernelCallWithNumericParamOnly(uint32_t evtcode, uint32_t param); + +void prvTraceStoreKernelCallWithParam(uint32_t evtcode, traceObjectClass objectClass, + uint32_t objectNumber, uint32_t param); +#else + +#define prvTraceStoreKernelCall(eventcode, objectClass, byteParam) {} +#define prvTraceStoreKernelCallWithNumericParamOnly(evtcode, param) {} +#define prvTraceStoreKernelCallWithParam(evtcode, objectClass, objectNumber, param) {} + +#endif + +/******************************************************************************* +* prvTraceInitTraceData +* +* Allocates and initializes the recorder data structure, based on the constants +* in trcConfig.h. This allows for allocating the data on the heap, instead of +* using a static declaration. +******************************************************************************/ +void prvTraceInitTraceData(void); + +void prvTraceSetTaskInstanceFinished(traceHandle handle); + +void prvTraceSetPriorityProperty(uint8_t objectclass, traceHandle id, uint8_t value); + +uint8_t prvTraceGetPriorityProperty(uint8_t objectclass, traceHandle id); + +void prvTraceSetObjectState(uint8_t objectclass, traceHandle id, uint8_t value); + +void prvMarkObjectAsUsed(traceObjectClass objectclass, traceHandle handle); + +void prvTraceStoreObjectNameOnCloseEvent(uint8_t evtcode, traceHandle handle, + traceObjectClass objectclass); + +void prvTraceStoreObjectPropertiesOnCloseEvent(uint8_t evtcode, traceHandle handle, + traceObjectClass objectclass); + +/* Internal constants for task state */ +#define TASK_STATE_INSTANCE_NOT_ACTIVE 0 +#define TASK_STATE_INSTANCE_ACTIVE 1 + + +#if (TRC_CFG_INCLUDE_ISR_TRACING == 0) + +#undef vTraceSetISRProperties +#define vTraceSetISRProperties(handle, name, priority) (void)(handle), (void)(name), (void)(priority) /* Comma operator is used to avoid "unused variable" compiler warnings in a single statement */ + +#undef vTraceStoreISRBegin +#define vTraceStoreISRBegin(x) (void)(x) + +#undef vTraceStoreISREnd +#define vTraceStoreISREnd(x) (void)(x) + +#undef xTraceSetISRProperties +#define xTraceSetISRProperties(name, priority) ((void)(name), (void)(priority), (traceHandle)0) /* Comma operator in parenthesis is used to avoid "unused variable" compiler warnings and return 0 in a single statement */ + +#endif /*(TRC_CFG_INCLUDE_ISR_TRACING == 0)*/ + +/******************************************************************************* + * xTraceGetTraceBuffer + * + * Returns a pointer to the recorder data structure. Use this together with + * uiTraceGetTraceBufferSize if you wish to implement an own store/upload + * solution, e.g., in case a debugger connection is not available for uploading + * the data. + ******************************************************************************/ +void* xTraceGetTraceBuffer(void); + +/******************************************************************************* + * uiTraceGetTraceBufferSize + * + * Gets the size of the recorder data structure. For use together with + * vTraceGetTraceBuffer if you wish to implement an own store/upload solution, + * e.g., in case a debugger connection is not available for uploading the data. + ******************************************************************************/ +uint32_t uiTraceGetTraceBufferSize(void); + +#if (TRC_CFG_SCHEDULING_ONLY == 1) +#undef TRC_CFG_INCLUDE_USER_EVENTS +#define TRC_CFG_INCLUDE_USER_EVENTS 0 +#endif /*(TRC_CFG_SCHEDULING_ONLY == 1)*/ + +#if ((TRC_CFG_INCLUDE_USER_EVENTS == 1) && (TRC_CFG_SCHEDULING_ONLY == 0)) + +#if (TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER == 1) +traceUBChannel xTraceRegisterUBChannel(traceString channel, traceString formatStr); +void vTraceUBData(traceUBChannel channel, ...); +void vTraceUBEvent(traceUBChannel channel); +#endif /*(TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER == 1)*/ + +#else /*((TRC_CFG_INCLUDE_USER_EVENTS == 1) && (TRC_CFG_SCHEDULING_ONLY == 0))*/ + +#undef vTracePrint +#define vTracePrint(chn, ...) (void)(chn) +#undef vTracePrintF +#define vTracePrintF(chn, fmt, ...) (void)(chn), (void)(fmt) /* Comma operator is used to avoid "unused variable" compiler warnings in a single statement */ +#undef vTraceVPrintF +#define vTraceVPrintF(chn, formatStr, vl) (void)(chn), (void)(formatStr), (void)(vl) /* Comma operator is used to avoid "unused variable" compiler warnings in a single statement */ +#undef xTraceRegisterString +#define xTraceRegisterString(x) ((void)(x), (traceString)0) /* Comma operator in parenthesis is used to avoid "unused variable" compiler warnings and return 0 in a single statement */ +#undef xTraceRegisterChannelFormat +#define xTraceRegisterChannelFormat(eventLabel, formatStr) ((void)(eventLabel), (void)(formatStr), 0) /* Comma operator in parenthesis is used to avoid "unused variable" compiler warnings and return 0 in a single statement */ +#undef vTraceUBData +#define vTraceUBData(label, ...) (void)(label) +#undef vTraceChannelPrint +#define vTraceChannelPrint(label) (void)(label) + +#endif /*(TRC_CFG_INCLUDE_USER_EVENTS == 1)*/ + +#define NEventCodes 0x100 + +/* Our local critical sections for the recorder */ +#define trcCRITICAL_SECTION_BEGIN() {TRACE_ENTER_CRITICAL_SECTION(); recorder_busy++;} +#define trcCRITICAL_SECTION_END() {recorder_busy--; TRACE_EXIT_CRITICAL_SECTION();} + +#if (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_ARM_Cortex_M) + #define trcSR_ALLOC_CRITICAL_SECTION_ON_CORTEX_M_ONLY TRACE_ALLOC_CRITICAL_SECTION + #define trcCRITICAL_SECTION_BEGIN_ON_CORTEX_M_ONLY trcCRITICAL_SECTION_BEGIN + #define trcCRITICAL_SECTION_END_ON_CORTEX_M_ONLY trcCRITICAL_SECTION_END +#else + #define trcSR_ALLOC_CRITICAL_SECTION_ON_CORTEX_M_ONLY() {} + #define trcCRITICAL_SECTION_BEGIN_ON_CORTEX_M_ONLY() recorder_busy++; + #define trcCRITICAL_SECTION_END_ON_CORTEX_M_ONLY() recorder_busy--; +#endif + +/****************************************************************************** + * ObjectHandleStack + * This data-structure is used to provide a mechanism for 1-byte trace object + * handles. This way, only 1 byte is necessary instead of 4 bytes (a pointer) + * when storing a reference to an object. This allows for up to 255 objects of + * each object class active at any given moment. There can be more "historic" + * objects, that have been deleted - that number is only limited by the size of + * the symbol table. + * + * Note that handle zero (0) is not used, it is a code for an invalid handle. + * + * This data structure keeps track of the FREE handles, not the handles in use. + * This data structure contains one stack per object class. When a handle is + * allocated to an object, the next free handle is popped from the stack. When + * a handle is released (on object delete), it is pushed back on the stack. + * Note that there is no initialization code that pushed the free handles + * initially, that is not necessary due to the following optimization: + * + * The stack of handles (objectHandles) is initially all zeros. Since zero + * is not a valid handle, that is a signal of additional handles needed. + * If a zero is received when popping a new handle, it is replaced by the + * index of the popped handle instead. + *****************************************************************************/ +typedef struct +{ + /* For each object class, the index of the next handle to allocate */ + uint16_t indexOfNextAvailableHandle[ TRACE_NCLASSES ]; + + /* The lowest index of this class (constant) */ + uint16_t lowestIndexOfClass[ TRACE_NCLASSES ]; + + /* The highest index of this class (constant) */ + uint16_t highestIndexOfClass[ TRACE_NCLASSES ]; + + /* The highest use count for this class (for statistics) */ + uint16_t handleCountWaterMarksOfClass[ TRACE_NCLASSES ]; + + /* The free object handles - a set of stacks within this array */ + traceHandle objectHandles[ TRACE_KERNEL_OBJECT_COUNT ]; + +} objectHandleStackType; + +extern objectHandleStackType objectHandleStacks; + +/****************************************************************************** + * Object Property Table + * The Object Table contains name and other properties of the objects (tasks, + * queues, mutexes, etc). The below data structures defines the properties of + * each object class and are used to cast the byte buffer into a cleaner format. + * + * The values in the object table are continuously overwritten and always + * represent the current state. If a property is changed during runtime, the OLD + * value should be stored in the trace buffer, not the new value (since the new + * value is found in the Object Property Table). + * + * For close events this mechanism is the old names are stored in the symbol + * table), for "priority set" (the old priority is stored in the event data) + * and for "isActive", where the value decides if the task switch event type + * should be "new" or "resume". + ******************************************************************************/ + +typedef struct +{ + /* = NCLASSES */ + uint32_t NumberOfObjectClasses; + + uint32_t ObjectPropertyTableSizeInBytes; + + /* This is used to calculate the index in the dynamic object table + (handle - 1 - nofStaticObjects = index)*/ +#if (TRC_CFG_USE_16BIT_OBJECT_HANDLES == 1) + traceHandle NumberOfObjectsPerClass[2*((TRACE_NCLASSES+1)/2)]; +#else + traceHandle NumberOfObjectsPerClass[4*((TRACE_NCLASSES+3)/4)]; +#endif + + /* Allocation size rounded up to the closest multiple of 4 */ + uint8_t NameLengthPerClass[ 4*((TRACE_NCLASSES+3)/4) ]; + + uint8_t TotalPropertyBytesPerClass[ 4*((TRACE_NCLASSES+3)/4) ]; + + /* Allocation size rounded up to the closest multiple of 2 */ + uint16_t StartIndexOfClass[ 2*((TRACE_NCLASSES+1)/2) ]; + + /* The actual handles issued, should be Initiated to all zeros */ + uint8_t objbytes[ 4*((TRACE_OBJECT_TABLE_SIZE+3)/4) ]; +} ObjectPropertyTableType; + +/* Symbol table data structure */ +typedef struct +{ + /* = SYMBOL_HISTORY_TABLE_SIZE_IN_BYTES */ + uint32_t symTableSize; + + /* Entry 0 is reserved. Any reference to entry 0 implies NULL*/ + uint32_t nextFreeSymbolIndex; + + /* Size rounded up to closest multiple of 4, to avoid alignment issues*/ + uint8_t symbytes[4*(((TRC_CFG_SYMBOL_TABLE_SIZE)+3)/4)]; + + /* Used for lookups - Up to 64 linked lists within the symbol table + connecting all entries with the same 6 bit checksum. + This field holds the current list heads. Should be initiated to zeros */ + uint16_t latestEntryOfChecksum[64]; +} symbolTableType; + + +/******************************************************************************* + * The data structures of the different events, all 4 bytes long + ******************************************************************************/ + +typedef struct +{ + uint8_t type; + uint8_t objHandle; + uint16_t dts; /* differential timestamp - time since last event */ +} TSEvent, TREvent; + +typedef struct +{ + uint8_t type; + uint8_t dummy; + uint16_t dts; /* differential timestamp - time since last event */ +} LPEvent; + +typedef struct +{ + uint8_t type; + uint8_t objHandle; + uint16_t dts; /* differential timestamp - time since last event */ +} KernelCall; + +typedef struct +{ + uint8_t type; + uint8_t objHandle; + uint8_t param; + uint8_t dts; /* differential timestamp - time since last event */ +} KernelCallWithParamAndHandle; + +typedef struct +{ + uint8_t type; + uint8_t dts; /* differential timestamp - time since last event */ + uint16_t param; +} KernelCallWithParam16; + +typedef struct +{ + uint8_t type; + uint8_t objHandle; /* the handle of the closed object */ + uint16_t symbolIndex; /* the name of the closed object */ +} ObjCloseNameEvent; + +typedef struct +{ + uint8_t type; + uint8_t arg1; + uint8_t arg2; + uint8_t arg3; +} ObjClosePropEvent; + +typedef struct +{ + uint8_t type; + uint8_t unused1; + uint8_t unused2; + uint8_t dts; +} TaskInstanceStatusEvent; + +typedef struct +{ + uint8_t type; + uint8_t dts; + uint16_t payload; /* the name of the user event */ +} UserEvent; + +typedef struct +{ + uint8_t type; + + /* 8 bits extra for storing DTS, if it does not fit in ordinary event + (this one is always MSB if used) */ + uint8_t xts_8; + + /* 16 bits extra for storing DTS, if it does not fit in ordinary event. */ + uint16_t xts_16; +} XTSEvent; + +typedef struct +{ + uint8_t type; + + uint8_t xps_8; + uint16_t xps_16; +} XPSEvent; + +typedef struct{ + uint8_t type; + uint8_t dts; + uint16_t size; +} MemEventSize; + +typedef struct{ + uint8_t type; + uint8_t addr_high; + uint16_t addr_low; +} MemEventAddr; + +/******************************************************************************* + * The separate user event buffer structure. Can be enabled in trcConfig.h. + ******************************************************************************/ + +#if (TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER == 1) +typedef struct +{ + traceString name; + traceString defaultFormat; +} ChannelFormatPair; + +typedef struct +{ + uint16_t bufferID; + uint16_t version; + uint32_t wraparoundCounter; + uint32_t numberOfSlots; + uint32_t nextSlotToWrite; + uint8_t numberOfChannels; + uint8_t padding1; + uint8_t padding2; + uint8_t padding3; + ChannelFormatPair channels[(TRC_CFG_UB_CHANNELS)+1]; + uint8_t channelBuffer[((TRC_CFG_SEPARATE_USER_EVENT_BUFFER_SIZE) + 3) & 0xFFFFFFFC]; /* 1 byte per slot, with padding for 4 byte alignment */ + uint8_t dataBuffer[(TRC_CFG_SEPARATE_USER_EVENT_BUFFER_SIZE) * 4]; /* 4 bytes per slot */ + +} UserEventBuffer; +#endif + +/******************************************************************************* + * The main data structure, read by Tracealyzer from the RAM dump + ******************************************************************************/ + +typedef struct +{ + volatile uint8_t startmarker0; /* Volatile is important, see init code. */ + volatile uint8_t startmarker1; + volatile uint8_t startmarker2; + volatile uint8_t startmarker3; + volatile uint8_t startmarker4; + volatile uint8_t startmarker5; + volatile uint8_t startmarker6; + volatile uint8_t startmarker7; + volatile uint8_t startmarker8; + volatile uint8_t startmarker9; + volatile uint8_t startmarker10; + volatile uint8_t startmarker11; + + /* Used to determine Kernel and Endianess */ + uint16_t version; + + /* Currently 5 */ + uint8_t minor_version; + + /* This should be 0 if lower IRQ priority values implies higher priority + levels, such as on ARM Cortex M. If the opposite scheme is used, i.e., + if higher IRQ priority values means higher priority, this should be 1. */ + uint8_t irq_priority_order; + + /* sizeof(RecorderDataType) - just for control */ + uint32_t filesize; + + /* Current number of events recorded */ + uint32_t numEvents; + + /* The buffer size, in number of event records */ + uint32_t maxEvents; + + /* The event buffer index, where to write the next event */ + uint32_t nextFreeIndex; + + /* 1 if the buffer is full, 0 otherwise */ + uint32_t bufferIsFull; + + /* The frequency of the clock/timer/counter used as time base */ + uint32_t frequency; + + /* The absolute timestamp of the last stored event, in the native + timebase, modulo frequency! */ + uint32_t absTimeLastEvent; + + /* The number of seconds in total - lasts for 136 years */ + uint32_t absTimeLastEventSecond; + + /* 1 if the recorder has been started, 0 if not yet started or stopped. + This is a 32 bit variable due to alignment issues. */ + uint32_t recorderActive; + + /* If > 0, tells the maximum time between two traced ISRs that execute + back-to-back. If the time between vTraceStoreISREnd and a directly + following vTraceISRBegin is above isrTailchainingThreshold, we assume a + return to the previous context in between the ISRs, otherwise we assume + the have executed back-to-back and don't show any fragment of the previous + context in between. */ + uint32_t isrTailchainingThreshold; + + /* Not used, remains for compatibility and future use */ + uint8_t notused[24]; + + /* The amount of heap memory remaining at the last malloc or free event */ + uint32_t heapMemUsage; + + /* 0xF0F0F0F0 - for control only */ + int32_t debugMarker0; + + /* Set to value of TRC_CFG_USE_16BIT_OBJECT_HANDLES */ + uint32_t isUsing16bitHandles; + + /* The Object Property Table holds information about currently active + tasks, queues, and other recorded objects. This is updated on each + create call and includes object name and other properties. */ + ObjectPropertyTableType ObjectPropertyTable; + + /* 0xF1F1F1F1 - for control only */ + int32_t debugMarker1; + + /* The Symbol Table stores strings for User Events and is also used to + store names of deleted objects, which still may be in the trace but no + longer are available. */ + symbolTableType SymbolTable; + + /* For inclusion of float support, and for endian detection of floats. + The value should be (float)1 or (uint32_t)0 */ +#if (TRC_CFG_INCLUDE_FLOAT_SUPPORT == 1) + float exampleFloatEncoding; +#else + uint32_t exampleFloatEncoding; +#endif + /* This is non-zero if an internal error occurred in the recorder, e.g., if + one of the Nxxx constants was too small. The systemInfo string will then + contain an error message that is displayed when attempting to view the + trace file. */ + uint32_t internalErrorOccured; + + /* 0xF2F2F2F2 - for control only */ + int32_t debugMarker2; + + /* Error messages from the recorder. */ + #if 0 + char systemInfo[80]; + #else + char systemInfo[TRC_CFG_TRACE_DESCRIPTION_MAX_LENGTH]; /* << EST */ + #endif + + /* 0xF3F3F3F3 - for control only */ + int32_t debugMarker3; + + /* The event data, in 4-byte records */ + uint8_t eventData[ (TRC_CFG_EVENT_BUFFER_SIZE) * 4 ]; + +#if (TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER == 1) + UserEventBuffer userEventBuffer; +#endif + + /* This should always be 0 */ + uint32_t endOfSecondaryBlocks; + + uint8_t endmarker0; + uint8_t endmarker1; + uint8_t endmarker2; + uint8_t endmarker3; + uint8_t endmarker4; + uint8_t endmarker5; + uint8_t endmarker6; + uint8_t endmarker7; + uint8_t endmarker8; + uint8_t endmarker9; + uint8_t endmarker10; + uint8_t endmarker11; +} RecorderDataType; + +extern RecorderDataType* RecorderDataPtr; + +/* Internal functions */ + +/* Signal an error. */ +void prvTraceError(const char* msg); + +/******************************************************************************* + * prvTracePortGetTimeStamp + * + * Returns the current time based on the HWTC macros which provide a hardware + * isolation layer towards the hardware timer/counter. + * + * The HWTC macros and prvTracePortGetTimeStamp is the main porting issue + * or the trace recorder library. Typically you should not need to change + * the code of prvTracePortGetTimeStamp if using the HWTC macros. + * + ******************************************************************************/ +void prvTracePortGetTimeStamp(uint32_t *puiTimestamp); + +traceHandle prvTraceGetObjectHandle(traceObjectClass objectclass); + +void prvTraceFreeObjectHandle(traceObjectClass objectclass, + traceHandle handle); + +/* Private function. Use the public functions in trcKernelPort.h */ +void prvTraceSetObjectName(traceObjectClass objectclass, + traceHandle handle, + const char* name); + +/* Internal macros */ + +#define TRACE_PROPERTY_NAME_GET(objectclass, objecthandle) \ +(const char*)(& RecorderDataPtr->ObjectPropertyTable.objbytes \ +[uiIndexOfObject(objecthandle, objectclass)]) + +#define TRACE_PROPERTY_OBJECT_STATE(objectclass, handle) \ +RecorderDataPtr->ObjectPropertyTable.objbytes[uiIndexOfObject(handle, objectclass) \ ++ RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[objectclass]] + +#define TRACE_PROPERTY_ACTOR_PRIORITY(objectclass, handle) \ +RecorderDataPtr->ObjectPropertyTable.objbytes[uiIndexOfObject(handle, objectclass) \ ++ RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[objectclass] + 1] + +/* DEBUG ASSERTS */ +#if defined TRC_CFG_USE_TRACE_ASSERT && TRC_CFG_USE_TRACE_ASSERT != 0 +#define TRACE_ASSERT(eval, msg, defRetVal) \ +if (!(eval)) \ +{ \ + prvTraceError("TRACE_ASSERT: " msg); \ + return defRetVal; \ +} +#else +#define TRACE_ASSERT(eval, msg, defRetVal) +#endif + +#endif /*(TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_SNAPSHOT)*/ + +#if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) + +/****************************************************************************** + * Default values for STREAM PORT macros + * + * As a normal user, this is nothing you don't need to bother about. This is + * only important if you want to define your own custom streaming interface. + * + * You may override these in your own trcStreamingPort.h to create a custom + * stream port, and thereby stream the trace on any host-target interface. + * These default values are suitable for most cases, except the J-Link port. + ******************************************************************************/ + +/****************************************************************************** + * TRC_STREAM_PORT_USE_INTERNAL_BUFFER + * + * There are two kinds of stream ports, those that store the event to the + * internal buffer (with periodic flushing by the TzCtrl task) and those that + * write directly to the streaming interface. Most stream ports use the + * recorder's internal buffer, except for the SEGGER J-Link port (also uses a + * RAM buffer, but one defined in the SEGGER code). + * + * If the stream port (trcStreamingPort.h) defines this as zero (0), it is + * expected to transmit the data directly using TRC_STREAM_PORT_COMMIT_EVENT. + * Otherwise it is expected that the trace data is stored in the internal buffer + * and the TzCtrl task will then send the buffer pages when they become full. + ******************************************************************************/ +#ifndef TRC_STREAM_PORT_USE_INTERNAL_BUFFER +#define TRC_STREAM_PORT_USE_INTERNAL_BUFFER 1 +#endif + + /****************************************************************************** + * TRC_STREAM_PORT_ON_TRACE_BEGIN + * + * Defining any actions needed in the stream port when the recording is activated. + *******************************************************************************/ +#ifndef TRC_STREAM_PORT_ON_TRACE_BEGIN + #define TRC_STREAM_PORT_ON_TRACE_BEGIN() /* Do nothing */ +#endif + + /****************************************************************************** + * TRC_STREAM_PORT_ON_TRACE_END + * + * Defining any actions needed in the stream port when the tracing stops. + * Empty by default. + *******************************************************************************/ +#ifndef TRC_STREAM_PORT_ON_TRACE_END +#define TRC_STREAM_PORT_ON_TRACE_END() /* Do nothing */ +#endif + + /****************************************************************************** + * TRC_STREAM_PORT_ALLOCATE_EVENT + * + * This macro is used to allocate memory for each event record, just before + * assigning the record fields. + * Depending on "TRC_STREAM_PORT_USE_INTERNAL_BUFFER", this either allocates + * space in the paged event buffer, or on the local stack. In the latter case, + * the COMMIT event is used to write the data to the streaming interface. + * + * The BLOCKING option is only used within vTraceEnable, to ensure the full + * header, object table and symbol table is transferred without data loss. + ******************************************************************************/ +#ifndef TRC_STREAM_PORT_ALLOCATE_EVENT +#if (TRC_STREAM_PORT_USE_INTERNAL_BUFFER == 1) + #define TRC_STREAM_PORT_ALLOCATE_EVENT(_type, _ptrData, _size) \ + _type* _ptrData; \ + _ptrData = (_type*)prvPagedEventBufferGetWritePointer(_size); + + /************************************************************************** + If your application gets stuck in TRC_STREAM_PORT_ALLOCATE_EVENT_BLOCKING, + it means it fails to transfer the header, object table or symbol table + during vTraceEnable. + This occurs if the trace buffer is too small to accomodate these in full, + i.e. before the streaming interface is started and begins to transfer. + + Note that this is intentionally blocking to avoid data loss, but only + used within vTraceEnable. + **************************************************************************/ + + #define TRC_STREAM_PORT_ALLOCATE_EVENT_BLOCKING(_type, _ptrData, _size) \ + _type* _ptrData; \ + do { _ptrData = (_type*)prvPagedEventBufferGetWritePointer(_size); } while (_ptrData == NULL); + +#else + #define TRC_STREAM_PORT_ALLOCATE_EVENT(_type, _ptrData, _size) _type _tmpArray[_size / sizeof(_type)]; _type* _ptrData = _tmpArray; + #define TRC_STREAM_PORT_ALLOCATE_EVENT_BLOCKING(_type, _ptrData, _size) _type _tmpArray[_size / sizeof(_type)]; _type* _ptrData = _tmpArray; +#endif +#endif + + /****************************************************************************** + * TRC_STREAM_PORT_ALLOCATE_DYNAMIC_EVENT + * + * This macro is used to allocate memory for each event record, just before + * assigning the record fields. + * This has the same purpose as TRC_STREAM_PORT_ALLOCATE_EVENT and by default + * it has the same definition as TRC_STREAM_PORT_ALLOCATE_EVENT. This is used + * for events carrying variable-sized payload, such as strings. + * In the SEGGER RTT port, we need this in order to make a worst-case + * allocation on the stack. + ******************************************************************************/ +#ifndef TRC_STREAM_PORT_ALLOCATE_DYNAMIC_EVENT +#if (TRC_STREAM_PORT_USE_INTERNAL_BUFFER == 1) + #define TRC_STREAM_PORT_ALLOCATE_DYNAMIC_EVENT(_type, _ptrData, _size) TRC_STREAM_PORT_ALLOCATE_EVENT(_type, _ptrData, _size) /* We do the same thing as for non-dynamic event sizes */ +#else + #define TRC_STREAM_PORT_ALLOCATE_DYNAMIC_EVENT(_type, _ptrData, _size) _type _tmpArray[sizeof(largestEventType) / sizeof(_type)]; _type* _ptrData = _tmpArray; +#endif +#endif + + /****************************************************************************** + * TRC_STREAM_PORT_COMMIT_EVENT + * TRC_STREAM_PORT_COMMIT_EVENT_BLOCKING + * + * The COMMIT macro is used to write a single event record directly to the + * streaming inteface, without first storing the event in the internal buffer. + * This is currently only used in the SEGGER J-Link RTT port. + * + * The BLOCKING version is used when sending the initial trace header, which is + * important to receive in full. Otherwise, when using non-blocking RTT transfer + * this may be corrupted if using an RTT buffer smaller than the combined size + * of the header, object table and symbol table. + * + * This relies on the TRC_STREAM_PORT_WRITE_DATA macro, defined in by the + * stream port in trcStreamingPort.h. The COMMIT macro calls + * prvTraceWarning(TRC_STREAM_PORT_WRITE_DATA) if a non-zero value is returned + * from TRC_STREAM_PORT_WRITE_DATA. If zero (0) is returned, it is assumed + * that all data was successfully written. + * + * In ports using the internal buffer, this macro has no purpose as the events + * are written to the internal buffer instead. They are then flushed to the + * streaming interface in the TzCtrl task using TRC_STREAM_PORT_WRITE_DATA. + ******************************************************************************/ +#ifndef TRC_STREAM_PORT_COMMIT_EVENT +#if (TRC_STREAM_PORT_USE_INTERNAL_BUFFER == 1) + #define TRC_STREAM_PORT_COMMIT_EVENT(_ptrData, _size) /* Not used */ + #define TRC_STREAM_PORT_COMMIT_EVENT_BLOCKING(_ptrData, _size) /* Not used */ +#else + #define TRC_STREAM_PORT_COMMIT_EVENT(_ptrData, _size) \ + { \ + int32_t dummy = 0; \ + (void)dummy; \ + if (TRC_STREAM_PORT_WRITE_DATA(_ptrData, _size, &dummy) != 0) \ + { \ + vTraceStop(); \ + } \ + } + + /* Only used during vTraceEnable */ + #define TRC_STREAM_PORT_COMMIT_EVENT_BLOCKING(_ptrData, _size) \ + { \ + char* ptrWrite = (char*)_ptrData; \ + uint32_t writeSize = _size; \ + uint32_t attemptCounter = 0; \ + int32_t bytesWritten; \ + int32_t status; \ + do \ + { \ + bytesWritten = 0; \ + status = TRC_STREAM_PORT_WRITE_DATA(ptrWrite, writeSize, &bytesWritten); \ + if (status != 0) \ + { \ + prvTraceError(PSF_ERROR_STREAM_PORT_WRITE); \ + break; \ + } \ + ptrWrite += bytesWritten; \ + writeSize -= bytesWritten; \ + attemptCounter++; \ + } while (writeSize > 0); \ + \ + if (attemptCounter > 1) \ + { \ + prvTraceWarning(PSF_WARNING_STREAM_PORT_INITIAL_BLOCKING); \ + } \ + } + +#endif +#endif + +/****************************************************************************** + * TRC_STREAM_PORT_READ_DATA (defined in trcStreamingPort.h) + * + * Defining how to read data from host (commands from Tracealyzer). + * + * If there is no direct interface to host (e.g., if streaming to a file + * system) this should be defined as 0. Instead use vTraceEnable(TRC_START) and + * vTraceStop() to control the recording from target. + * + * Parameters: + * + * - _ptrData: a pointer to a data buffer, where the received data shall be + * stored (TracealyzerCommandType*). + * + * - _size: the number of bytes to read (int). + * + * - _ptrBytesRead: a pointer to an integer (int), that should be assigned + * with the number of bytes that was received. + * + * Example: + * + * int32_t myRead(void* ptrData, uint32_t size, int32_t* ptrBytesRead); + * + * #define TRC_STREAM_PORT_READ_DATA(_ptrData, _size, _ptrBytesRead) \ + * myRead(_ptrData, _size, _ptrBytesRead) + * + * Your "myRead" function should return 0 if successful, i.e. if at least some + * bytes were received. A non-zero value should be returned if the streaming + * interface returned an error (e.g. a closed socket), which results in the + * recorder calling prvTraceWarning with the error code + * PSF_WARNING_STREAM_PORT_WRITE. + * + * If developing your own custom stream port and using the default internal + * buffer, it is important that the _ptrBytesRead parameter is assigned + * correctly by "myRead", i.e. with the number of bytes actually written. + * Otherwise the data stream may get out of sync in case the streaming interface + * can't swallow all data at once. + ******************************************************************************/ +#ifndef TRC_STREAM_PORT_READ_DATA +#error "No definition for TRC_STREAM_PORT_READ_DATA (should be in trcStreamingPort.h)" +#endif + +/****************************************************************************** + * TRC_STREAM_PORT_WRITE_DATA (defined in trcStreamingPort.h) + * + * Defining how to write trace data to the streaming interface. + * + * Parameters: + * + * - _ptrData: a pointer (void*) to the data to write. + * + * - _size: the number of bytes to write (uint32_t). + * + * - _ptrBytesWritten: a pointer to an integer (int32_t), that should be + * assigned with the number of bytes actually written. + * + * Example: + * + * int32_t myWrite(void* ptrData, uint32_t size, int32_t* ptrBytesWritten); + * + * #define TRC_STREAM_PORT_WRITE_DATA(_ptrData, _size, _ptrBytesWritten) \ + * myWrite(_ptrData, _size, _ptrBytesWritten) + * + * Your "myWrite" function should return 0 if successful, i.e. if at least some + * bytes were sent. A non-zero value should be returned if the streaming interface + * returned an error (e.g. a closed socket), which results in the recorder calling + * prvTraceWarning with the error code PSF_WARNING_STREAM_PORT_WRITE. + * + * If developing your own custom stream port and using the default internal + * buffer, it is important that the _ptrBytesWritten parameter is assigned + * correctly by "myWrite", i.e. with the number of bytes actually written. + * Otherwise the data stream may get out of sync in case the streaming interface + * can't swallow all data at once. + * + * Assuming TRC_STREAM_PORT_USE_INTERNAL_BUFFER is 1 (default), the TzCtrl task + * will use this macro to send one buffer page at a time. In case all data can't + * be written at once (if _ptrBytesWritten is less than _size), the TzCtrl task + * is smart enough to make repeated calls (with updated parameters) in order to + * send the remaining data. + * + * However, if TRC_STREAM_PORT_USE_INTERNAL_BUFFER is 0, this is used from the + * COMMIT macro, directly in the "event functions". In that case, the + * _ptrBytesWritten parameter will be NULL and should be ignored by the write + * function. In this case, it is assumed that all data can be sent in a single + * call, otherwise the write function should return a non-zero error code. + ******************************************************************************/ +#ifndef TRC_STREAM_PORT_WRITE_DATA +#error "No definition for TRC_STREAM_PORT_WRITE_DATA (should be in trcStreamingPort.h)" +#endif + +/****************************************************************************** +* Data structure declaration, depending on TRC_CFG_RECORDER_BUFFER_ALLOCATION +*******************************************************************************/ +#if (TRC_CFG_RECORDER_BUFFER_ALLOCATION == TRC_RECORDER_BUFFER_ALLOCATION_STATIC) + + /* Static allocation. */ + + /* If not defined in trcStreamingPort.h */ + #ifndef TRC_STREAM_PORT_ALLOCATE_FIELDS + #define TRC_STREAM_PORT_ALLOCATE_FIELDS() \ + char _TzTraceData[(TRC_CFG_PAGED_EVENT_BUFFER_PAGE_COUNT) * (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_SIZE)]; + extern char _TzTraceData[(TRC_CFG_PAGED_EVENT_BUFFER_PAGE_COUNT) * (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_SIZE)]; + #endif + + /* If not defined in trcStreamingPort.h */ + #ifndef TRC_STREAM_PORT_MALLOC + #define TRC_STREAM_PORT_MALLOC() /* Static allocation. Not used. */ + #endif +#else + /* For Dynamic or Custom Allocation mode */ + + /* If not defined in trcStreamingPort.h */ + #ifndef TRC_STREAM_PORT_ALLOCATE_FIELDS + #define TRC_STREAM_PORT_ALLOCATE_FIELDS() char* _TzTraceData = NULL; + extern char* _TzTraceData; + #endif + + /* If not defined in trcStreamingPort.h */ + #ifndef TRC_STREAM_PORT_MALLOC + #if (TRC_CFG_RECORDER_BUFFER_ALLOCATION == TRC_RECORDER_BUFFER_ALLOCATION_DYNAMIC) + #define TRC_STREAM_PORT_MALLOC() \ + _TzTraceData = TRC_PORT_MALLOC((TRC_CFG_PAGED_EVENT_BUFFER_PAGE_COUNT) * (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_SIZE)); + extern char* _TzTraceData; + #else + #define TRC_STREAM_PORT_MALLOC() /* Custom allocation. Not used. */ + #endif + #endif +#endif + +#ifndef TRC_STREAM_PORT_INIT + #define TRC_STREAM_PORT_INIT() \ + TRC_STREAM_PORT_MALLOC(); /* Empty if static allocation mode */ \ + prvPagedEventBufferInit(_TzTraceData); +#endif + + +/* Signal an error. */ +void prvTraceError(int errCode); + +/* Signal an warning (does not stop the recorder). */ +void prvTraceWarning(int errCode); + +/******************************************************************************/ +/*** ERROR AND WARNING CODES (check using xTraceGetLastError) *****************/ +/******************************************************************************/ + +#define PSF_ERROR_NONE 0 +#define PSF_ERROR_EVENT_CODE_TOO_LARGE 1 +#define PSF_ERROR_ISR_NESTING_OVERFLOW 2 +#define PSF_ERROR_DWT_NOT_SUPPORTED 3 +#define PSF_ERROR_DWT_CYCCNT_NOT_SUPPORTED 4 +#define PSF_ERROR_TZCTRLTASK_NOT_CREATED 5 +#define PSF_ERROR_STREAM_PORT_WRITE 6 + +#define PSF_WARNING_SYMBOL_TABLE_SLOTS 7 +#define PSF_WARNING_SYMBOL_MAX_LENGTH 8 +#define PSF_WARNING_OBJECT_DATA_SLOTS 9 +#define PSF_WARNING_STRING_TOO_LONG 10 +#define PSF_WARNING_STREAM_PORT_READ 11 +#define PSF_WARNING_STREAM_PORT_WRITE 12 +#define PSF_WARNING_STREAM_PORT_INITIAL_BLOCKING 13 +#define PSF_WARNING_STACKMON_NO_SLOTS 14 + +/******************************************************************************/ +/*** INTERNAL STREAMING FUNCTIONS *********************************************/ +/******************************************************************************/ + +/* Saves a symbol name in the symbol table and returns the slot address */ +void* prvTraceSaveSymbol(const char *name); + +/* Saves a string in the symbol table for an object (task name etc.) */ +void prvTraceSaveObjectSymbol(void* address, const char *name); + +/* Deletes a symbol name (task name etc.) from symbol table */ +void prvTraceDeleteSymbol(void *address); + +/* Saves an object data entry (task base priority) in object data table */ +void prvTraceSaveObjectData(const void *address, uint32_t data); + +/* Removes an object data entry (task base priority) from object data table */ +void prvTraceDeleteObjectData(void *address); + +/* Store an event with zero parameters (event ID only) */ +void prvTraceStoreEvent0(uint16_t eventID); + +/* Store an event with one 32-bit parameter (pointer address or an int) */ +void prvTraceStoreEvent1(uint16_t eventID, + uint32_t param1); + +/* Store an event with two 32-bit parameters */ +void prvTraceStoreEvent2(uint16_t eventID, + uint32_t param1, + uint32_t param2); + +/* Store an event with three 32-bit parameters */ +void prvTraceStoreEvent3(uint16_t eventID, + uint32_t param1, + uint32_t param2, + uint32_t param3); + +/* Stores an event with 32-bit integer parameters */ +void prvTraceStoreEvent(int nParam, uint16_t EventID, ...); + +/* Stories an event with a string and 32-bit integer parameters */ +void prvTraceStoreStringEvent(int nArgs, uint16_t eventID, const char* str, ...); + +/* Initializes the paged event buffer used by certain stream ports */ +void prvPagedEventBufferInit(char* buffer); + +/* Retrieve a pointer to the paged event buffer */ +void* prvPagedEventBufferGetWritePointer(int sizeOfEvent); + +/* Transfer a full buffer page */ +uint32_t prvPagedEventBufferTransfer(void); + +/* The data structure for commands (a bit overkill) */ +typedef struct +{ + unsigned char cmdCode; + unsigned char param1; + unsigned char param2; + unsigned char param3; + unsigned char param4; + unsigned char param5; + unsigned char checksumLSB; + unsigned char checksumMSB; +} TracealyzerCommandType; + +/* Checks if the provided command is a valid command */ +int prvIsValidCommand(TracealyzerCommandType* cmd); + +/* Executed the received command (Start or Stop) */ +void prvProcessCommand(TracealyzerCommandType* cmd); + +#define vTraceSetStopHook(x) (void)(x) + +#endif /*(TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING)*/ + +#else /* when TRC_USE_TRACEALYZER_RECORDER == 0 */ + +#define vTraceEnable(x) (void)(x) +#define xTraceRegisterString(x) ((void)(x), (traceString)0) /* Comma operator in parenthesis is used to avoid "unused variable" compiler warnings and return 0 in a single statement */ +#define vTracePrint(chn, ...) (void)(chn) +#define vTracePrintF(chn, fmt, ...) (void)(chn), (void)(fmt) /* Comma operator is used to avoid "unused variable" compiler warnings in a single statement */ +#define vTraceVPrintF(chn, formatStr, vl) (void)(chn), (void)(formatStr), (void)(vl) /* Comma operator is used to avoid "unused variable" compiler warnings in a single statement */ +#define vTraceInstanceFinishedNow() +#define vTraceInstanceFinishedNext() +#define vTraceStoreISRBegin(x) (void)(x) +#define vTraceStoreISREnd(x) (void)(x) +#define xTraceSetISRProperties(a, b) ((void)(a), (void)(b), (traceHandle)0) /* Comma operator in parenthesis is used to avoid "unused variable" compiler warnings and return 0 in a single statement */ +#define vTraceStoreKernelObjectName(a, b) (void)(a), (void)(b) /* Comma operator is used to avoid "unused variable" compiler warnings in a single statement */ +#define xTraceRegisterChannelFormat(eventLabel, formatStr) ((void)(eventLabel), (void)(formatStr), 0) /* Comma operator in parenthesis is used to avoid "unused variable" compiler warnings and return 0 in a single statement */ +#define vTraceChannelPrint(label) (void)(label) +#define vTraceUBData(label, ...) (void)(label) + +#define vTraceSetFilterGroup(x) (void)(x) +#define vTraceSetFilterMask(x) (void)(x) + +#define prvTraceSetReadyEventsEnabled(status) (void)(status) + +#define vTraceExcludeTask(handle) (void)(handle) + +#define uiTraceStart() (1) +#define vTraceStart() +#define vTraceStop() + +#ifndef vTraceSetRecorderDataBuffer +#define vTraceSetRecorderDataBuffer(pRecorderData) /* No (void) here - ignore parameter since undefined symbol if custom allocation is not used */ +#endif + +#define vTraceConsoleChannelPrintF(fmt, ...) (void)(fmt) + +#ifndef TRC_ALLOC_CUSTOM_BUFFER +#define TRC_ALLOC_CUSTOM_BUFFER(bufname) +#endif + +#define xTraceIsRecordingEnabled() (0) + +#define vTraceSetStopHook(x) (void)(x) + +#endif /*(TRC_USE_TRACEALYZER_RECORDER == 1)*/ + +#ifdef __cplusplus +} +#endif + +#endif /* TRC_RECORDER_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/TraceRecorder/streamports/Jlink_RTT/include/trcStreamingPort.h b/TSM_PicoW_Sensor/McuLib/TraceRecorder/streamports/Jlink_RTT/include/trcStreamingPort.h new file mode 100644 index 0000000..b88d5be --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/TraceRecorder/streamports/Jlink_RTT/include/trcStreamingPort.h @@ -0,0 +1,195 @@ +/******************************************************************************* + * Trace Recorder Library for Tracealyzer v3.3.0 + * Percepio AB, www.percepio.com + * + * trcStreamingPort.h + * + * The interface definitions for trace streaming ("stream ports"). + * This "stream port" sets up the recorder to use SEGGER RTT as streaming channel. + * + * Note that this stream port is more complex than the typical case, since + * the J-Link interface uses a separate RAM buffer in SEGGER_RTT.c, instead + * of the default buffer included in the recorder core. The other stream ports + * offer more typical examples of how to define a custom streaming interface. + * + * Terms of Use + * This file is part of the trace recorder library (RECORDER), which is the + * intellectual property of Percepio AB (PERCEPIO) and provided under a + * license as follows. + * The RECORDER may be used free of charge for the purpose of recording data + * intended for analysis in PERCEPIO products. It may not be used or modified + * for other purposes without explicit permission from PERCEPIO. + * You may distribute the RECORDER in its original source code form, assuming + * this text (terms of use, disclaimer, copyright notice) is unchanged. You are + * allowed to distribute the RECORDER with minor modifications intended for + * configuration or porting of the RECORDER, e.g., to allow using it on a + * specific processor, processor family or with a specific communication + * interface. Any such modifications should be documented directly below + * this comment block. + * + * Disclaimer + * The RECORDER is being delivered to you AS IS and PERCEPIO makes no warranty + * as to its use or performance. PERCEPIO does not and cannot warrant the + * performance or results you may obtain by using the RECORDER or documentation. + * PERCEPIO make no warranties, express or implied, as to noninfringement of + * third party rights, merchantability, or fitness for any particular purpose. + * In no event will PERCEPIO, its technology partners, or distributors be liable + * to you for any consequential, incidental or special damages, including any + * lost profits or lost savings, even if a representative of PERCEPIO has been + * advised of the possibility of such damages, or for any claim by any third + * party. Some jurisdictions do not allow the exclusion or limitation of + * incidental, consequential or special damages, or the exclusion of implied + * warranties or limitations on how long an implied warranty may last, so the + * above limitations may not apply to you. + * + * Tabs are used for indent in this file (1 tab = 4 spaces) + * + * Copyright Percepio AB, 2017. + * www.percepio.com + ******************************************************************************/ + +#ifndef TRC_STREAMING_PORT_H +#define TRC_STREAMING_PORT_H + +#ifdef __cplusplus +extern "C" { +#endif + + +/******************************************************************************* + * Configuration Macro: TRC_CFG_RTT_BUFFER_SIZE_UP + * + * Defines the size of the "up" RTT buffer (target -> host) to use for writing + * the trace data, for RTT buffer 1 or higher. + * + * This setting is ignored for RTT buffer 0, which can't be reconfigured + * in runtime and therefore hard-coded to use the defines in SEGGER_RTT_Conf.h. + * + * Default buffer size for Tracealyzer is 5000 bytes. + * + * If you have a stand-alone J-Link probe, the can be decreased to around 1 KB. + * But integrated J-Link OB interfaces are slower and needs about 5-10 KB, + * depending on the amount of data produced. + ******************************************************************************/ +#define TRC_CFG_RTT_BUFFER_SIZE_UP 1024 + +/******************************************************************************* + * Configuration Macro: TRC_CFG_RTT_BUFFER_SIZE_DOWN + * + * Defines the size of the "down" RTT buffer (host -> target) to use for reading + * commands from Tracealyzer, for RTT buffer 1 or higher. + * + * Default buffer size for Tracealyzer is 32 bytes. + * + * This setting is ignored for RTT buffer 0, which can't be reconfigured + * in runtime and therefore hard-coded to use the defines in SEGGER_RTT_Conf.h. + ******************************************************************************/ +#define TRC_CFG_RTT_BUFFER_SIZE_DOWN 32 + +/******************************************************************************* + * Configuration Macro: TRC_CFG_RTT_UP_BUFFER_INDEX + * + * Defines the RTT buffer to use for writing the trace data. Make sure that + * the PC application has the same setting (File->Settings). + * + * Default: 1 + * + * We don't recommend using RTT buffer 0, since mainly intended for terminals. + * If you prefer to use buffer 0, it must be configured in SEGGER_RTT_Conf.h. + ******************************************************************************/ +#define TRC_CFG_RTT_UP_BUFFER_INDEX 2 /* << EST */ + +/******************************************************************************* + * Configuration Macro: TRC_CFG_RTT_DOWN_BUFFER_INDEX + * + * Defines the RTT buffer to use for reading the trace data. Make sure that + * the PC application has the same setting (File->Settings). + * + * Default: 1 + * + * We don't recommend using RTT buffer 0, since mainly intended for terminals. + * If you prefer to use buffer 0, it must be configured in SEGGER_RTT_Conf.h. + ******************************************************************************/ +#define TRC_CFG_RTT_DOWN_BUFFER_INDEX 2 /* << EST */ +/******************************************************************************* + * TRC_CFG_RTT_MODE + * This stream port for J-Link streaming relies on SEGGER RTT, that contains an + * internal RAM buffer read by the J-Link probes during execution. + * + * Possible values: + * - SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL (default) + * - SEGGER_RTT_MODE_NO_BLOCK_SKIP + * + * We recommend using SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL, to ensure you get a + * complete and valid trace. This may however cause blocking if your streaming + * interface isn't fast enough, which may disturb the real-time behavior. + * We therefore recommend to try SEGGER_RTT_MODE_NO_BLOCK_SKIP as well. + * In this mode, Tracealyzer will report lost events if the transfer is not + * fast enough. In that case, try increasing the size of the "up buffer". + ******************************************************************************/ +#define TRC_CFG_RTT_MODE SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL + +#include "SEGGER_RTT_Conf.h" +#include "SEGGER_RTT.h" + +#if (TRC_CFG_RTT_UP_BUFFER_INDEX >= SEGGER_RTT_MAX_NUM_UP_BUFFERS) +#error "TRC_CFG_RTT_UP_BUFFER_INDEX must be smaller than SEGGER_RTT_MAX_NUM_UP_BUFFERS" +#endif + +#if (TRC_CFG_RTT_DOWN_BUFFER_INDEX >= SEGGER_RTT_MAX_NUM_DOWN_BUFFERS) +#error "TRC_CFG_RTT_DOWN_BUFFER_INDEX must be smaller than SEGGER_RTT_MAX_NUM_DOWN_BUFFERS" +#endif + +/* If index is defined as 0, the internal RTT buffers will be used instead of this. */ +#if TRC_CFG_RTT_UP_BUFFER_INDEX == 0 +#define TRC_RTT_ALLOC_UP() static char* _TzTraceData = NULL; /* Not actually used. Ignore allocation method. */ +#define TRC_STREAM_PORT_MALLOC() /* Static allocation. Not used. */ +#else +#if TRC_CFG_RECORDER_BUFFER_ALLOCATION == TRC_RECORDER_BUFFER_ALLOCATION_STATIC +#define TRC_RTT_ALLOC_UP() char _TzTraceData[TRC_CFG_RTT_BUFFER_SIZE_UP]; /* Static allocation */ +#define TRC_STREAM_PORT_MALLOC() /* Static allocation. Not used. */ +#endif +#if TRC_CFG_RECORDER_BUFFER_ALLOCATION == TRC_RECORDER_BUFFER_ALLOCATION_DYNAMIC +#define TRC_RTT_ALLOC_UP() char* _TzTraceData = NULL; /* Dynamic allocation */ +#define TRC_STREAM_PORT_MALLOC() _TzTraceData = TRC_PORT_MALLOC(TRC_CFG_RTT_BUFFER_SIZE_UP); +#endif +#if TRC_CFG_RECORDER_BUFFER_ALLOCATION == TRC_RECORDER_BUFFER_ALLOCATION_CUSTOM +#define TRC_RTT_ALLOC_UP() char* _TzTraceData = NULL; /* Custom allocation, user needs to call vTraceSetRecorderDataBuffer before vTraceEnable, to assign this */ +#define TRC_STREAM_PORT_MALLOC() /* Not used in custom mode */ +#endif +#endif + +/* Down-buffer. If index is defined as 0, the internal RTT buffers will be used instead of this. */ \ +#if TRC_CFG_RTT_DOWN_BUFFER_INDEX == 0 +#define TRC_RTT_ALLOC_DOWN() static char* _TzCtrlData = NULL; /* Not actually used. Ignore allocation method. */ +#else +#define TRC_RTT_ALLOC_DOWN() static char _TzCtrlData[TRC_CFG_RTT_BUFFER_SIZE_DOWN]; /* Always static allocation, since usually small. */ +#endif + +#define TRC_STREAM_PORT_ALLOCATE_FIELDS() \ + TRC_RTT_ALLOC_UP() /* Macro that will result in proper UP buffer allocation */ \ + TRC_RTT_ALLOC_DOWN() /* Macro that will result in proper DOWN buffer allocation */ + +int32_t readFromRTT(void* ptrData, uint32_t size, int32_t* ptrBytesRead); + +int32_t writeToRTT(void* ptrData, uint32_t size, int32_t* ptrBytesWritten); + + +#define TRC_STREAM_PORT_INIT() \ + TRC_STREAM_PORT_MALLOC(); /*Dynamic allocation or empty if static */ \ + SEGGER_RTT_ConfigUpBuffer(TRC_CFG_RTT_UP_BUFFER_INDEX, "TzData", _TzTraceData, TRC_CFG_RTT_BUFFER_SIZE_UP, TRC_CFG_RTT_MODE ); \ + SEGGER_RTT_ConfigDownBuffer(TRC_CFG_RTT_DOWN_BUFFER_INDEX, "TzCtrl", _TzCtrlData, TRC_CFG_RTT_BUFFER_SIZE_DOWN, TRC_CFG_RTT_MODE); + +/* Important for the J-Link port, in most other ports this can be skipped (default is 1) */ +#define TRC_STREAM_PORT_USE_INTERNAL_BUFFER 0 + +#define TRC_STREAM_PORT_WRITE_DATA(_ptrData, _size, _ptrBytesWritten) writeToRTT(_ptrData, _size, _ptrBytesWritten) + +#define TRC_STREAM_PORT_READ_DATA(_ptrData, _size, _ptrBytesRead) readFromRTT(_ptrData, _size, _ptrBytesRead) + +#ifdef __cplusplus +} +#endif + +#endif /* TRC_STREAMING_PORT_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/TraceRecorder/tracealyzer_readme.txt b/TSM_PicoW_Sensor/McuLib/TraceRecorder/tracealyzer_readme.txt new file mode 100644 index 0000000..a3184be --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/TraceRecorder/tracealyzer_readme.txt @@ -0,0 +1,419 @@ +------------------------------------------------------------------------------- + Tracealyzer Recorder Library for FreeRTOS +------------------------------------------------------------------------------- + +Tracealyzer is a sophisticated tool for tracing and visualization +of FreeRTOS-based software systems. + +Tracealyzer gives an unprecedented insight into the runtime behavior, which +speeds up debugging, validation and optimization. + +This, the Trace Recorder Library, is the target-side part of Tracealyzer, that +performs the actual tracing. The resulting data can then be viewed in the +Tracealyzer PC application, found at https://percepio.com/tracealyzer + +To learn more, see these links. + + - Getting Started (videos etc): https://percepio.com/gettingstarted + + - FAQ: https://percepio.com/category/faq + +In case you have any questions, don't hesitate to contact support@percepio.com + +Tracealyzer supports FreeRTOS v7.3 and newer, including Amazon FreeRTOS. + +------------------------------------------------------------------------------- + +Changes, v4.3.11 -> v4.4.1 +- Updates to the USB CDC streamport + +------------------------------------------------------------------------------- + +Changes, v4.3.10 -> v4.3.11 +- Adapted for new Task Notify changes + +------------------------------------------------------------------------------- + +Changes, v4.3.8 -> v4.3.10 +- Fixed accidental C99 reliance + +------------------------------------------------------------------------------- + +Changes, v4.3.7 -> v4.3.8 +- Modified how FreeRTOS versions are configured in the trace library. +- traceQUEUE_SET_SEND() was added. +- Now informs users of FreeRTOS v10.3.X that the trace point traceQUEUE_SEND in + prvNotifyQueueSetContainer() should be changed to traceQUEUE_SET_SEND. + +------------------------------------------------------------------------------- + +Changes, v4.3.5 -> v4.3.7 +- Fixed issue where ISR naming would not always work. +- Fixed "errno" issue with certain compilers when using lwip streaming port. +- Recorder now makes sure all streaming trace header info is successfully sent + before moving on. +- Recorder warns if TRC_CFG_PAGED_EVENT_BUFFER_PAGE_COUNT > 128 since code + isn't designed for that. +- Made sure uiTraceSystemState is always declared in snapshot recorder. + +------------------------------------------------------------------------------- + +Changes, v4.3.1 -> v4.3.5 +- A previously removed define is no longer used when configSUPPORT_STATIC_ALLOCATION is 1 + +------------------------------------------------------------------------------- + +Changes, v4.3.0 -> v4.3.1 +- Name string no longer has to have unique address when calling xTraceSetISRProperties() + +------------------------------------------------------------------------------- + +Changes, v4.2.12 -> v4.3.0 +- Improved Streaming stability in regards to starting/stopping. +- Added support for STACK usage reports. +- Added vTraceVPrintF() that accepts a va_list as argument. + +------------------------------------------------------------------------------- + +Changes, v4.2.2 -> v4.2.12 + +- Changed a call to vTracePrintF() into vTracePrint(). + +------------------------------------------------------------------------------- + +Changes, v4.2.1 -> v4.2.2 + +- TRC_STREAM_PORT_WRITE_DATA() no longer has to deal with null pointers. Better + for custom StreamPort implementations. + +------------------------------------------------------------------------------- + +Changes, v4.1.7 -> v4.2.1 + +- Added support for initial heap usage at trace start in Streaming mode. +- Fixed bug regarding failed malloc calls in Streaming mode. +- Added support for tracing failed malloc calls in Snapshot mode. +- Better way of setting initial task "(startup)" in Streaming mode. + +------------------------------------------------------------------------------- + +Changes, v4.1.5 -> v4.1.7 + +- vQueueSendToFront() and vQueueSendToFrontFromISR() are now traced properly in + Snaphot mode. + +------------------------------------------------------------------------------- + +Changes, v4.1.4 -> v4.1.5 + +- Fixed a bug in the ITM stream port, that required Port 0 to be enabled. +- Added missing include of stdio.h (needed by vTraceConsoleChannelPrintF). +- Moved standard includes from trcRecorder.h into the .c files needing them. + +------------------------------------------------------------------------------- + +Changes, v4.1.2 -> v4.1.4 + +- Fixed a compile error when certain FreeRTOS settings were used +- Disabled filter support for FreeRTOS v7.3 since it uses "char" for object id + +------------------------------------------------------------------------------- + +Changes, v4.1.0 -> v4.1.2 + +- Added vTraceConsoleChannelPrintF(...) + +------------------------------------------------------------------------------- + +Changes, v4.0.3 -> v4.1.0 + +- Improved performance of User Events +- Fixed handling of format strings ending with '%' +- Improved handling of creative user configuration macros + +------------------------------------------------------------------------------- + +Changes, v4.0.2 -> v4.0.3 + +- Minor fix for TCP/IP stream port. +- Corrected default RTT mode setting. + +------------------------------------------------------------------------------- + +Changes, v4.0.1 -> v4.0.2 + +- Memory allocation trace events now ignore filters. + +------------------------------------------------------------------------------- + +Changes, v4.0.0 -> v4.0.1 + +- Minor fixes to default values. + +------------------------------------------------------------------------------- + +Changes, v3.3.0 -> v4.0.0 + +- Fixed some issues with filters. + +------------------------------------------------------------------------------- + +Changes, v3.2.0 -> v3.3.0 + +- Added support for FreeRTOS v10, including the new object types Message Buffer + and Stream Buffer. + +- Improved the object-level filtering to also support Timer, Event Group, + Message Buffer and Stream Buffer objects. + +- Fixed a few remaining build problems with older FreeRTOS versions (v7.x). + +- vTraceStoreISRBegin now reports an error on invalid handles, i.e., if the + initialization of the handle (xTraceSetISRProperties) had not been made. + +------------------------------------------------------------------------------- + +Changes, v3.1.2 -> v3.2.0 + +- Added new filtering system - that works in both snapshot and streaming mode. + Filtering was previously not supported in streaming mode, but can be very + useful for slower streaming interfaces. By exluding irrelevant events, the + amount of data produced can be reduced a lot. + + * New functions vTraceSetFilterGroup and vTraceSetFilterMask allows for + excluding all events from specific objects (like a semaphore or queue). + + * Added new "generic" filters (preprocessor level) to trcConfig.h, that + exclude all events of a particular types. + - TRC_CFG_INCLUDE_NOTIFY_EVENTS + - TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS + - TRC_CFG_INCLUDE_PEND_FUNC_CALL_EVENTS + - TRC_CFG_INCLUDE_TIMER_EVENTS + + * Upgraded some previous filters from "Snapshot only" to the Common API + and thereby moved them from trcSnapshotConfig.h to trcConfig.h. + - TRC_CFG_SCHEDULING_ONLY + - TRC_CFG_INCLUDE_MEMMANG_EVENTS + - TRC_CFG_INCLUDE_USER_EVENTS + - TRC_CFG_INCLUDE_ISR_TRACING + - TRC_CFG_INCLUDE_READY_EVENTS + - TRC_CFG_INCLUDE_OSTICK_EVENTS + + * Removed the old filter system from trcSnapshotRecorder.c. + +- Improved streaming interface - Now only two (2) macros are needed to be + defined in most cases, read and write. This makes it a lot easier to make + custom stream ports. + + * Many definitions that were identical in most stream ports, have been + replaced by default definitions in the recorder core. If needed, they + can be overriden by custom definitions in trcStreamingPort.h. + + * Stream ports are now assumed to use recorder's internal event buffer. + Other stream ports that writes directly to the streaming interface + (like J-Link) should define TRC_STREAM_PORT_USE_INTERNAL_BUFFER + as zero (0) to make it work correctly. + + * Macro TRC_STREAM_PORT_PERIODIC_SEND_DATA has been replaced by + TRC_STREAM_PORT_WRITE_DATA. Together with TRC_STREAM_PORT_READ_DATA, + this is all that is necessary for a typical stream port. + + * Return values from the stream port macros READ_DATA and WRITE_DATA are + now checked. Expects 0 on success, anything else produces a warning + that can be retrived using xTraceGetLastError() and also seen in + Tracealyzer if a trace was produced. + + * Stream ports should no longer call prvPagedEventBufferInit explicitly + (e.g. in TRC_STREAM_PORT_ON_TRACE_BEGIN). This is now called + automatically if TRC_STREAM_PORT_USE_INTERNAL_BUFFER == 1. + + * Macros TRC_STREAM_PORT_ON_TRACE_BEGIN and TRC_STREAM_PORT_ON_TRACE_END + are now unused by default and don't need to be defined. + You can however use them to hook in some own function at these events. + +- Added two new stream ports + + * TCPIP-Win32: allows for testing the streaming on Windows ports of your + RTOS, using Winsock. + + * File: example of streaming to a local file system (tested on Windows, + but easy to modify). + +- Added support for FreeRTOS v9.0.1 + + * Replaced FreeRTOS version code TRC_FREERTOS_VERSION_9_X with + - TRC_FREERTOS_VERSION_9_0_0 + - TRC_FREERTOS_VERSION_9_0_1 + + * Using TRC_FREERTOS_VERSION_9_X is no longer allowed. + +- Added additional events for xQueuePeek, for blocking and timeouts events. + +- Added event for traceTIMER_EXPIRED, showing when the timer callback + function is called. + +- Improved diagnostics in streaming mode, in case of errors in the recorder. + + * Added prvTraceWarning() - registers a "warning" error code, without + stopping the recorder. Called if READ_DATA or WRITE_DATA returns a + non-zero value, and in several other cases where the recorder + configuration is incorrect (e.g., too small symbol table). + + * Added several new warning codes (PSF_WARNING_XYZ), corresponding to the + issues detected by prvCheckRecorderStatus. + + * Fixed duplicate definitions of warning messages, so the warnings reported + to Tracealyzer are the same as those provided in xTraceGetLastError(). + + * Added better explainations of warning/error messages in the body of + xTraceGetLastError (in streaming mode). + +- Added xTraceIsRecordingEnabled() to Common API. + +- Added "unofficial" hardware port for Altera Nios-II. + This is a user contribition, not yet verified by Percerpio. + +- Fixed bug in vTraceEnable - option TRC_START_AWAIT_HOST was ignored if already initialized. + +- Fixed a few remaining compiler warnings. + +- Changed order of some settings in trcConfig.h - moved advanced stuff to the + bottom. + +- Removed SEGGER_RTT_Printf.c from the J-Link stream port since not required + for Tracealyzer. + +------------------------------------------------------------------------------- + +Changes, v3.1.1 -> v3.1.2 +- Fixed two bugs related to User Events, one in vTracePrintF and other in vTracePrint. + +- Fixed a build problem related to a single reference of the old FreeRTOS type "xTaskHandle", in trcKernelPort.c. + Changed to "TaskHandle_t", unless if using an older FreeRTOS kernel or the "compatibility mode". + +- Removed traceCREATE_MUTEX hook for FreeRTOS v9 or later (no longer required) + +- Updated the User Manual regarding snapshot trace via IAR Embedded Workbench. + +- Renamed vTraceGetTraceBuffer to xTraceGetTraceBuffer, since returning a pointer. + +------------------------------------------------------------------------------- + +Changes, v3.1.0 -> v3.1.1 + +After the major changes in the v3.1.0 trace recorder library, this update +corrects a number of minor issues. Only minor functional improvements. + +- You can now use TRC_ALLOC_CUSTOM_BUFFER to declare a trace buffer on a custom + location (using linker directives). + The related function vTraceSetRecorderDataBuffer has been promoted to the + Common API (previously only supported in snapshot mode, but custom allocation + is now generally supported also in streaming mode). + +- Removed TRC_CFG_USE_LINKER_PRAGMA. No longer necessary thanks to the custom + allocation mode. + +- Added support for timestamping from custom periodic timers, required for + accurate timestamping on Cortex-M0/M0+ devices when using tickless idle. + Only for streaming mode so far. See TRC_CUSTOM_TIMER_INCR / DECR. + +- ARM Cortex-M port: Made sure the DWT unit is initialized properly, in case + the debugger doesn't handle this. + +- ARM Cortex-M port: Added possibility to use Systick timestamping also on + Cortex-M3/M4/M7 devices (that otherwise use DWT timestamping by default). + To use this option, define the macro TRC_CFG_ARM_CM_USE_SYSTICK. + +- J-Link streaming: The default RTT buffer has been changed from 0 to 1. + +- J-Link streaming: The RTT buffer settings for buffer 1 and higher, are now + found in trcStreamingPort.h. Note: These settings don't apply to buffer 0. + +- vTracePrint has been optimized for better performance in string logging. + +- Minor performance improvement related to symbol table transfer in streaming mode. + +- Timer names now registered also in streaming mode. + +- Timer start and stop event are now traced. + +- Implemented support for queue registry (traceQUEUE_REGISTRY_ADD) also for streaming. + +- Fixed a bug related to repeated calls of vTraceEnable. + +- Fixed a bug where task-switches seemed to occur even though the scheduler was disabled. + +- Renamed HARDWARE_PORT_TEXAS_INSTRUMENTS_TMS570_RM48, added prefix TRC. + +- Fixed several language issues in the comments and documentation. + +- Fixed several minor issues and warnings from different compilers + (including PowerPC/gcc) and configurations. + +------------------------------------------------------------------------------- + +Changes, v3.0.9 -> v3.1.0 + +- Merge of previously separated snapshot and streaming recorders into a single + recorder supporting both streaming and snapshot as different modes. + +- New common API for supporting both streaming and snapshot modes. + +- New integration guide, see the User Manual. + +- Major improvement of API documentation in source files and User Manual. + +- New concept of "stream ports", giving a better structure defining streaming + interfaces, and restructured the J-Link and TCP/IP streaming as stream ports. + +- Added a stream port for USB CDC connections, with STM32 as example. + Since Tracealyzer now can receive serial data on Windows COM ports, this is + really easy to use. + +- Added a warning (#error) for cases where FreeRTOS tickless idle mode is used + together with timestamping using SysTick or other periodic interrupt timers, + Tracing with tickless idle requires an independent time source to correctly + capture the length of the idle periods. + +- Major changes in the recorder API. Important examples are: + + * Some configuration macros have changed names, e.g. for "hardware port". + Make sure to remove any old "trcConfig.h" files if upgrading from an + earlier version! + + * Recorder configuration in trcConfig.h has been minimized and now only + includes the important settings that are independent of recorder mode. + Advanced settings for each mode are found in trcSnapshotConfig.h and + trcStreamingConfig.h. + + * vTraceEnable replaces Trace_Init and vTraceInitTraceData, as well as + vTraceStart and uiTraceStart. + + * vTraceStop now part of the common API and thereby available also in + streaming. And since vTraceEnable can start the streaming directly + you have the option control the tracing from target, e.g., for + streaming to a device file system. + + * vTraceStoreKernelObjectName from old streaming recorder has been replaced + by vTraceSetQueueName, vTraceSetSemaphoreName, etc. + + * vTraceSetISRProperties now returns a "traceHandle" that should be passed as + parameter to vTraceStoreISRBegin and vTraceStoreISREnd. + + * xTraceRegisterString has replaced the old functions xTraceOpenLabel and + vTraceStoreUserEventChannelName. This now returns a "traceString" for use + as "channel" parameter in vTracePrintF, and in other places where strings + are stored. + + * Removed vTraceStoreISREndManual and vTraceStoreISREndAuto, use + vTraceStoreISREnd instead. + + * Renamed the functions for saving User Events in a separate buffer: + - xTraceRegisterChannelFormat -> xTraceRegisterUBChannel + - vTraceChannelPrintF -> vTraceUBData + - vTraceChannelUserEvent -> vTraceUBEvent + + +------------------------------------------------------------------------------- +Copyright Percepio AB, 2018. + diff --git a/TSM_PicoW_Sensor/McuLib/TraceRecorder/trcKernelPort.c b/TSM_PicoW_Sensor/McuLib/TraceRecorder/trcKernelPort.c new file mode 100644 index 0000000..3fbfa38 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/TraceRecorder/trcKernelPort.c @@ -0,0 +1,1088 @@ +/******************************************************************************* + * Trace Recorder Library for Tracealyzer v4.4.1 + * Percepio AB, www.percepio.com + * + * trcKernelPort.c + * + * The FreeRTOS-specific parts of the trace recorder + * + * Terms of Use + * This file is part of the trace recorder library (RECORDER), which is the + * intellectual property of Percepio AB (PERCEPIO) and provided under a + * license as follows. + * The RECORDER may be used free of charge for the purpose of recording data + * intended for analysis in PERCEPIO products. It may not be used or modified + * for other purposes without explicit permission from PERCEPIO. + * You may distribute the RECORDER in its original source code form, assuming + * this text (terms of use, disclaimer, copyright notice) is unchanged. You are + * allowed to distribute the RECORDER with minor modifications intended for + * configuration or porting of the RECORDER, e.g., to allow using it on a + * specific processor, processor family or with a specific communication + * interface. Any such modifications should be documented directly below + * this comment block. + * + * Disclaimer + * The RECORDER is being delivered to you AS IS and PERCEPIO makes no warranty + * as to its use or performance. PERCEPIO does not and cannot warrant the + * performance or results you may obtain by using the RECORDER or documentation. + * PERCEPIO make no warranties, express or implied, as to noninfringement of + * third party rights, merchantability, or fitness for any particular purpose. + * In no event will PERCEPIO, its technology partners, or distributors be liable + * to you for any consequential, incidental or special damages, including any + * lost profits or lost savings, even if a representative of PERCEPIO has been + * advised of the possibility of such damages, or for any claim by any third + * party. Some jurisdictions do not allow the exclusion or limitation of + * incidental, consequential or special damages, or the exclusion of implied + * warranties or limitations on how long an implied warranty may last, so the + * above limitations may not apply to you. + * + * Tabs are used for indent in this file (1 tab = 4 spaces) + * + * Copyright Percepio AB, 2018. + * www.percepio.com + ******************************************************************************/ + +#include "FreeRTOS.h" +#if configUSE_PERCEPIO_TRACE_HOOKS /* << EST: FreeRTOS using Percepio Trace */ + +#if (!defined(TRC_USE_TRACEALYZER_RECORDER) && configUSE_TRACE_FACILITY == 1) +#error Trace Recorder: You need to include trcRecorder.h at the end of your FreeRTOSConfig.h! +#endif + +#if (defined(TRC_USE_TRACEALYZER_RECORDER) && TRC_USE_TRACEALYZER_RECORDER == 1) + +#ifndef TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS + /* TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS is missing in trcConfig.h. */ +#error "TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS must be defined in trcConfig.h." +#endif + +#ifndef TRC_CFG_INCLUDE_TIMER_EVENTS + /* TRC_CFG_INCLUDE_TIMER_EVENTS is missing in trcConfig.h. */ +#error "TRC_CFG_INCLUDE_TIMER_EVENTS must be defined in trcConfig.h." +#endif + +#ifndef TRC_CFG_INCLUDE_PEND_FUNC_CALL_EVENTS + /* TRC_CFG_INCLUDE_PEND_FUNC_CALL_EVENTS is missing in trcConfig.h. */ +#error "TRC_CFG_INCLUDE_PEND_FUNC_CALL_EVENTS must be defined in trcConfig.h." +#endif + +#ifndef TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS + /* TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS is missing in trcConfig.h. Define this as 1 if using FreeRTOS v10 or later and like to trace stream buffer or message buffer events, otherwise 0. */ +#error "TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS must be defined in trcConfig.h." +#endif + +#if (configUSE_TICKLESS_IDLE != 0 && (TRC_HWTC_TYPE == TRC_OS_TIMER_INCR || TRC_HWTC_TYPE == TRC_OS_TIMER_DECR)) + /* + The below error message is to alert you on the following issue: + + The hardware port selected in trcConfig.h uses the operating system timer for the + timestamping, i.e., the periodic interrupt timer that drives the OS tick interrupt. + + When using "tickless idle" mode, the recorder needs an independent time source in + order to correctly record the durations of the idle times. Otherwise, the trace may appear + to have a different length than in reality, and the reported CPU load is also affected. + + You may override this warning by defining the TRC_CFG_ACKNOWLEDGE_TICKLESS_IDLE_WARNING + macro in your trcConfig.h file. But then the time scale may be incorrect during + tickless idle periods. + + To get this correct, override the default timestamping by setting TRC_CFG_HARDWARE_PORT + in trcConfig.h to TRC_HARDWARE_PORT_APPLICATION_DEFINED and define the HWTC macros + accordingly, using a free running counter or an independent periodic interrupt timer. + See trcHardwarePort.h for details. + + For ARM Cortex-M3, M4 and M7 MCUs this is not an issue, since the recorder uses the + DWT cycle counter for timestamping in these cases. + */ + + #ifndef TRC_CFG_ACKNOWLEDGE_TICKLESS_IDLE_WARNING + #error Trace Recorder: This timestamping mode is not recommended with Tickless Idle. + #endif +#endif /* (configUSE_TICKLESS_IDLE != 0 && (TRC_HWTC_TYPE == TRC_OS_TIMER_INCR || TRC_HWTC_TYPE == TRC_OS_TIMER_DECR)) */ + +#include "task.h" +#include "queue.h" + +#if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) || (defined(TRC_CFG_ENABLE_STACK_MONITOR) && (TRC_CFG_ENABLE_STACK_MONITOR == 1) && (TRC_CFG_SCHEDULING_ONLY == 0)) + +static TaskType HandleTzCtrl = NULL; /* TzCtrl task TCB */ + +#if defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION == 1) + +#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0) +static StackType_t stackTzCtrl[TRC_CFG_CTRL_TASK_STACK_SIZE]; +static StaticTask_t tcbTzCtrl; +#else +#error "configSUPPORT_STATIC_ALLOCATION not supported before FreeRTOS v9" +#endif + +#endif /* defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION == 1) */ + + +/* The TzCtrl task - receives commands from Tracealyzer (start/stop) */ +static portTASK_FUNCTION(TzCtrl, pvParameters); + +#if defined(TRC_CFG_ENABLE_STACK_MONITOR) && (TRC_CFG_ENABLE_STACK_MONITOR == 1) && (TRC_CFG_SCHEDULING_ONLY == 0) +void prvReportStackUsage(void); +#else /* defined(TRC_CFG_ENABLE_STACK_MONITOR) && (TRC_CFG_ENABLE_STACK_MONITOR == 1) && (TRC_CFG_SCHEDULING_ONLY == 0) */ +#define prvReportStackUsage() +#endif /* defined(TRC_CFG_ENABLE_STACK_MONITOR) && (TRC_CFG_ENABLE_STACK_MONITOR == 1) && (TRC_CFG_SCHEDULING_ONLY == 0) */ + +#endif /* (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) || (defined(TRC_CFG_ENABLE_STACK_MONITOR) && (TRC_CFG_ENABLE_STACK_MONITOR == 1) && (TRC_CFG_SCHEDULING_ONLY == 0)) */ + +#if (TRC_CFG_INCLUDE_TIMER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X) +/* If the project does not include the FreeRTOS timers, TRC_CFG_INCLUDE_TIMER_EVENTS must be set to 0 */ +#include "timers.h" +#endif /* (TRC_CFG_INCLUDE_TIMER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X) */ + +#if (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X) +/* If the project does not include the FreeRTOS event groups, TRC_CFG_INCLUDE_TIMER_EVENTS must be set to 0 */ +#include "event_groups.h" +#endif /* (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X) */ + +#if (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) +/* If the project does not include the FreeRTOS stream buffers, TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS must be set to 0 */ +#include "stream_buffer.h" +#endif /* (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */ + +#if (TRC_CFG_ACKNOWLEDGE_QUEUE_SET_SEND != TRC_ACKNOWLEDGED) && (TRC_CFG_FREERTOS_VERSION == TRC_FREERTOS_VERSION_10_3_0 || TRC_CFG_FREERTOS_VERSION == TRC_FREERTOS_VERSION_10_3_1) && (configUSE_QUEUE_SETS == 1) +#error "When using FreeRTOS v10.3.0 or v10.3.1, please make sure that the trace point in prvNotifyQueueSetContainer() in queue.c is renamed from traceQUEUE_SEND to traceQUEUE_SET_SEND in order to tell them apart from other traceQUEUE_SEND trace points. Then set TRC_CFG_ACKNOWLEDGE_QUEUE_SET_SEND in trcConfig.h to TRC_ACKNOWLEDGED to get rid of this error." +#endif /* (TRC_CFG_ACKNOWLEDGE_QUEUE_SET_SEND != TRC_ACKNOWLEDGED) && (TRC_CFG_FREERTOS_VERSION == TRC_FREERTOS_VERSION_10_3_0 || TRC_CFG_FREERTOS_VERSION == TRC_FREERTOS_VERSION_10_3_1) && (configUSE_QUEUE_SETS == 1) */ + +uint32_t prvTraceGetQueueNumber(void* handle); + +#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_8_X_X) + +extern unsigned char ucQueueGetQueueNumber( xQueueHandle pxQueue ); +extern void vQueueSetQueueNumber( xQueueHandle pxQueue, unsigned char ucQueueNumber ); +extern unsigned char ucQueueGetQueueType( xQueueHandle pxQueue ); + +uint32_t prvTraceGetQueueNumber(void* handle) +{ + return (uint32_t)ucQueueGetQueueNumber(handle); +} +#else +uint32_t prvTraceGetQueueNumber(void* handle) +{ + return (uint32_t)uxQueueGetQueueNumber(handle); +} +#endif /* (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_8_X_X) */ + +uint8_t prvTraceGetQueueType(void* handle) +{ + // This is either declared in header file in FreeRTOS 8 and later, or as extern above + return ucQueueGetQueueType(handle); +} + +/* Tasks */ +uint16_t prvTraceGetTaskNumberLow16(void* handle) +{ + return TRACE_GET_LOW16(uxTaskGetTaskNumber(handle)); +} + +uint16_t prvTraceGetTaskNumberHigh16(void* handle) +{ + return TRACE_GET_HIGH16(uxTaskGetTaskNumber(handle)); +} + +void prvTraceSetTaskNumberLow16(void* handle, uint16_t value) +{ + vTaskSetTaskNumber(handle, TRACE_SET_LOW16(uxTaskGetTaskNumber(handle), value)); +} + +void prvTraceSetTaskNumberHigh16(void* handle, uint16_t value) +{ + vTaskSetTaskNumber(handle, TRACE_SET_HIGH16(uxTaskGetTaskNumber(handle), value)); +} + +uint16_t prvTraceGetQueueNumberLow16(void* handle) +{ + return TRACE_GET_LOW16(prvTraceGetQueueNumber(handle)); +} + +uint16_t prvTraceGetQueueNumberHigh16(void* handle) +{ + return TRACE_GET_HIGH16(prvTraceGetQueueNumber(handle)); +} + +void prvTraceSetQueueNumberLow16(void* handle, uint16_t value) +{ + vQueueSetQueueNumber(handle, TRACE_SET_LOW16(prvTraceGetQueueNumber(handle), value)); +} + +void prvTraceSetQueueNumberHigh16(void* handle, uint16_t value) +{ + vQueueSetQueueNumber(handle, TRACE_SET_HIGH16(prvTraceGetQueueNumber(handle), value)); +} + +#if (TRC_CFG_INCLUDE_TIMER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) + +uint16_t prvTraceGetTimerNumberLow16(void* handle) +{ + return TRACE_GET_LOW16(uxTimerGetTimerNumber(handle)); +} + +uint16_t prvTraceGetTimerNumberHigh16(void* handle) +{ + return TRACE_GET_HIGH16(uxTimerGetTimerNumber(handle)); +} + +void prvTraceSetTimerNumberLow16(void* handle, uint16_t value) +{ + vTimerSetTimerNumber(handle, TRACE_SET_LOW16(uxTimerGetTimerNumber(handle), value)); +} + +void prvTraceSetTimerNumberHigh16(void* handle, uint16_t value) +{ + vTimerSetTimerNumber(handle, TRACE_SET_HIGH16(uxTimerGetTimerNumber(handle), value)); +} +#endif /* (TRC_CFG_INCLUDE_TIMER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */ + +#if (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) + +uint16_t prvTraceGetEventGroupNumberLow16(void* handle) +{ + return TRACE_GET_LOW16(uxEventGroupGetNumber(handle)); +} + +uint16_t prvTraceGetEventGroupNumberHigh16(void* handle) +{ + return TRACE_GET_HIGH16(uxEventGroupGetNumber(handle)); +} + +void prvTraceSetEventGroupNumberLow16(void* handle, uint16_t value) +{ + vEventGroupSetNumber(handle, TRACE_SET_LOW16(uxEventGroupGetNumber(handle), value)); +} + +void prvTraceSetEventGroupNumberHigh16(void* handle, uint16_t value) +{ + vEventGroupSetNumber(handle, TRACE_SET_HIGH16(uxEventGroupGetNumber(handle), value)); +} +#endif /* (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */ + +#if (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) + +uint16_t prvTraceGetStreamBufferNumberLow16(void* handle) +{ + return TRACE_GET_LOW16(uxStreamBufferGetStreamBufferNumber(handle)); +} + +uint16_t prvTraceGetStreamBufferNumberHigh16(void* handle) +{ + return TRACE_GET_HIGH16(uxStreamBufferGetStreamBufferNumber(handle)); +} + +void prvTraceSetStreamBufferNumberLow16(void* handle, uint16_t value) +{ + vStreamBufferSetStreamBufferNumber(handle, TRACE_SET_LOW16(uxStreamBufferGetStreamBufferNumber(handle), value)); +} + +void prvTraceSetStreamBufferNumberHigh16(void* handle, uint16_t value) +{ + vStreamBufferSetStreamBufferNumber(handle, TRACE_SET_HIGH16(uxStreamBufferGetStreamBufferNumber(handle), value)); +} +#endif /* (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */ + + +#if (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_ARM_CORTEX_A9) + +#define CS_TYPE_NONE 0 +#define CS_TYPE_TASK 1 +#define CS_TYPE_ISR_MASK_CHANGED 2 +#define CS_TYPE_ISR_MASK_NOT_CHANGED 3 + +#define CS_TYPE_INVALID 0xFFFFFFFF + +int cortex_a9_r5_enter_critical(void) +{ + uint32_t cs_type = CS_TYPE_INVALID; + + if ((prvGetCPSR() & 0x001F) == 0x13) // CSPR (ASPR) mode = SVC + { + /* Executing in an ISR other than the context-switch (where interrupts might have been enabled, motivating a critical section). */ + if (ulPortSetInterruptMask() == pdTRUE) + { + cs_type = CS_TYPE_ISR_MASK_NOT_CHANGED; + } + else + { + cs_type = CS_TYPE_ISR_MASK_CHANGED; + } + } + else if (uiTraceSystemState == TRC_STATE_IN_TASKSWITCH) + { + // In the context-switch code. All interrupts are already masked here, so don't modify the mask. + cs_type = CS_TYPE_NONE; + } + else if (uiTraceSystemState != TRC_STATE_IN_TASKSWITCH) + { + // Not within ISR or task-switch context, use a regular critical section. + vPortEnterCritical(); + cs_type = CS_TYPE_TASK; + } + + return cs_type; +} + +void cortex_a9_r5_exit_critical(int cs_type) +{ + switch (cs_type) + { + case CS_TYPE_TASK: + vPortExitCritical(); + break; + + case CS_TYPE_ISR_MASK_CHANGED: + vPortClearInterruptMask(pdFALSE); // pdFALSE means it will reset the IRQ mask. + break; + + case CS_TYPE_ISR_MASK_NOT_CHANGED: + case CS_TYPE_NONE: + // No action in these two cases. + break; + + default: + // Error, should not be possible; + for (;;); + } +} +#endif + +#if defined(TRC_CFG_ENABLE_STACK_MONITOR) && (TRC_CFG_ENABLE_STACK_MONITOR == 1) && (TRC_CFG_SCHEDULING_ONLY == 0) + +typedef struct { + void* tcb; + uint32_t uiPreviousLowMark; +} TaskStackMonitorEntry_t; + +TaskStackMonitorEntry_t tasksInStackMonitor[TRC_CFG_STACK_MONITOR_MAX_TASKS] = { { NULL } }; + +int tasksNotIncluded = 0; + +void prvAddTaskToStackMonitor(void* task) +{ + int i; + int foundEmptySlot = 0; + + // find an empty slot + for (i = 0; i < TRC_CFG_STACK_MONITOR_MAX_TASKS; i++) + { + if (tasksInStackMonitor[i].tcb == NULL) + { + tasksInStackMonitor[i].tcb = task; + tasksInStackMonitor[i].uiPreviousLowMark = 0xFFFFFFFF; + foundEmptySlot = 1; + break; + } + } + + if (foundEmptySlot == 0) + { + tasksNotIncluded++; + } +} + +void prvRemoveTaskFromStackMonitor(void* task) +{ + int i; + + for (i = 0; i < TRC_CFG_STACK_MONITOR_MAX_TASKS; i++) + { + if (tasksInStackMonitor[i].tcb == task) + { + tasksInStackMonitor[i].tcb = NULL; + tasksInStackMonitor[i].uiPreviousLowMark = 0; + } + } +} + +void prvReportStackUsage() +{ + static int i = 0; /* Static index used to loop over the monitored tasks */ + int count = 0; /* The number of generated reports */ + int initial = i; /* Used to make sure we break if we are back at the inital value */ + + do + { + /* Check the current spot */ + if (tasksInStackMonitor[i].tcb != NULL) + { + /* Get the amount of unused stack */ + uint32_t unusedStackSpace = uxTaskGetStackHighWaterMark((TaskType)tasksInStackMonitor[i].tcb); + + /* Store for later use */ + if (tasksInStackMonitor[i].uiPreviousLowMark > unusedStackSpace) + tasksInStackMonitor[i].uiPreviousLowMark = unusedStackSpace; + +#if TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_SNAPSHOT + prvTraceStoreKernelCallWithParam(TRACE_UNUSED_STACK, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(tasksInStackMonitor[i].tcb), tasksInStackMonitor[i].uiPreviousLowMark); +#else /* TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_SNAPSHOT */ + prvTraceStoreEvent2(PSF_EVENT_UNUSED_STACK, (uint32_t)tasksInStackMonitor[i].tcb, tasksInStackMonitor[i].uiPreviousLowMark); +#endif /* TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_SNAPSHOT */ + + count++; + } + + i = (i + 1) % TRC_CFG_STACK_MONITOR_MAX_TASKS; // Move i beyond this task + } while (count < TRC_CFG_STACK_MONITOR_MAX_REPORTS && i != initial); +} +#endif /* defined(TRC_CFG_ENABLE_STACK_MONITOR) && (TRC_CFG_ENABLE_STACK_MONITOR == 1) && (TRC_CFG_SCHEDULING_ONLY == 0) */ + +#if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) + +static void* pCurrentTCB = NULL; + +/* Monitored by TzCtrl task, that give warnings as User Events */ +extern volatile uint32_t NoRoomForSymbol; +extern volatile uint32_t NoRoomForObjectData; +extern volatile uint32_t LongestSymbolName; +extern volatile uint32_t MaxBytesTruncated; + +/* User Event Channel for giving warnings regarding NoRoomForSymbol etc. */ +traceString trcWarningChannel; + +#define TRC_PORT_MALLOC(size) pvPortMalloc(size) + +TRC_STREAM_PORT_ALLOCATE_FIELDS() + +/* Called by TzCtrl task periodically (Normally every 100 ms) */ +static void prvCheckRecorderStatus(void); + +extern void prvTraceWarning(int errCode); + +/******************************************************************************* + * vTraceEnable + * + * Function that enables the tracing and creates the control task. It will halt + * execution until a Start command has been received if haltUntilStart is true. + * + ******************************************************************************/ +void vTraceEnable(int startOption) +{ + int32_t bytes = 0; + int32_t status; + extern uint32_t RecorderEnabled; + TracealyzerCommandType msg; + + /* Only do this first time...*/ + if (HandleTzCtrl == NULL) + { + TRC_STREAM_PORT_INIT(); + + /* The #WFR channel means "Warnings from Recorder" and + * is used to store warnings and errors from the recorder. + * The abbreviation #WFR is used instead of the longer full name, + * to avoid truncation by small slots in the symbol table. + * This is translated in Tracealyzer and shown as the full name, + * "Warnings from Recorder". + * + * Note: Requires that TRC_CFG_INCLUDE_USER_EVENTS is 1. */ + + trcWarningChannel = xTraceRegisterString("#WFR"); + + /* Creates the TzCtrl task - receives trace commands (start, stop, ...) */ + #if defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION == 1) + HandleTzCtrl = xTaskCreateStatic(TzCtrl, STRING_CAST("TzCtrl"), TRC_CFG_CTRL_TASK_STACK_SIZE, NULL, TRC_CFG_CTRL_TASK_PRIORITY, stackTzCtrl, &tcbTzCtrl); + #else + xTaskCreate( TzCtrl, STRING_CAST("TzCtrl"), TRC_CFG_CTRL_TASK_STACK_SIZE, NULL, TRC_CFG_CTRL_TASK_PRIORITY, &HandleTzCtrl ); + #endif + + if (HandleTzCtrl == NULL) + { + prvTraceError(PSF_ERROR_TZCTRLTASK_NOT_CREATED); + } + } + + if (startOption == TRC_START_AWAIT_HOST) + { + /* We keep trying to read commands until the recorder has been started */ + do + { + bytes = 0; + + status = TRC_STREAM_PORT_READ_DATA(&msg, sizeof(TracealyzerCommandType), (int32_t*)&bytes); + + if (status != 0) + { + prvTraceWarning(PSF_WARNING_STREAM_PORT_READ); + } + + if ((status == 0) && (bytes == sizeof(TracealyzerCommandType))) + { + if (prvIsValidCommand(&msg)) + { + if (msg.cmdCode == CMD_SET_ACTIVE && msg.param1 == 1) + { + /* On start, init and reset the timestamping */ + TRC_PORT_SPECIFIC_INIT(); + } + + prvProcessCommand(&msg); + } + } + } + while (RecorderEnabled == 0); + } + else if (startOption == TRC_START) + { + /* We start streaming directly - this assumes that the interface is ready! */ + TRC_PORT_SPECIFIC_INIT(); + + msg.cmdCode = CMD_SET_ACTIVE; + msg.param1 = 1; + prvProcessCommand(&msg); + } + else + { + /* On TRC_INIT */ + TRC_PORT_SPECIFIC_INIT(); + } +} + +#if (TRC_CFG_SCHEDULING_ONLY == 0) +/******************************************************************************* + * vTraceSetQueueName(void* object, const char* name) + * + * Parameter object: pointer to the Queue that shall be named + * Parameter name: the name to set (const string literal) + * + * Sets a name for Queue objects for display in Tracealyzer. + ******************************************************************************/ +void vTraceSetQueueName(void* object, const char* name) +{ + vTraceStoreKernelObjectName(object, name); +} + +/******************************************************************************* + * vTraceSetSemaphoreName(void* object, const char* name) + * + * Parameter object: pointer to the Semaphore that shall be named + * Parameter name: the name to set (const string literal) + * + * Sets a name for Semaphore objects for display in Tracealyzer. + ******************************************************************************/ +void vTraceSetSemaphoreName(void* object, const char* name) +{ + vTraceStoreKernelObjectName(object, name); +} + +/******************************************************************************* + * vTraceSetMutexName(void* object, const char* name) + * + * Parameter object: pointer to the Mutex that shall be named + * Parameter name: the name to set (const string literal) + * + * Sets a name for Mutex objects for display in Tracealyzer. + ******************************************************************************/ +void vTraceSetMutexName(void* object, const char* name) +{ + vTraceStoreKernelObjectName(object, name); +} + +#if (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X) +/******************************************************************************* +* vTraceSetEventGroupName(void* object, const char* name) +* +* Parameter object: pointer to the vTraceSetEventGroupName that shall be named +* Parameter name: the name to set (const string literal) +* +* Sets a name for EventGroup objects for display in Tracealyzer. +******************************************************************************/ +void vTraceSetEventGroupName(void* object, const char* name) +{ + vTraceStoreKernelObjectName(object, name); +} +#endif /* (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X) */ + +#if (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) +/******************************************************************************* +* vTraceSetStreamBufferName(void* object, const char* name) +* +* Parameter object: pointer to the StreamBuffer that shall be named +* Parameter name: the name to set (const string literal) +* +* Sets a name for StreamBuffer objects for display in Tracealyzer. +******************************************************************************/ +void vTraceSetStreamBufferName(void* object, const char* name) +{ + vTraceStoreKernelObjectName(object, name); +} + +/******************************************************************************* +* vTraceSetMessageBufferName(void* object, const char* name) +* +* Parameter object: pointer to the MessageBuffer that shall be named +* Parameter name: the name to set (const string literal) +* +* Sets a name for MessageBuffer objects for display in Tracealyzer. +******************************************************************************/ +void vTraceSetMessageBufferName(void* object, const char* name) +{ + vTraceStoreKernelObjectName(object, name); +} +#endif /* (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */ + +#endif /* (TRC_CFG_SCHEDULING_ONLY == 0) */ + +/******************************************************************************* + * prvGetCurrentTaskHandle + * + * Function that returns the handle to the currently executing task. + * + ******************************************************************************/ +void* prvTraceGetCurrentTaskHandle(void) +{ + return xTaskGetCurrentTaskHandle(); +} + +/******************************************************************************* + * prvIsNewTCB + * + * Tells if this task is already executing, or if there has been a task-switch. + * Assumed to be called within a trace hook in kernel context. + ******************************************************************************/ +uint32_t prvIsNewTCB(void* pNewTCB) +{ + if (pCurrentTCB != pNewTCB) + { + pCurrentTCB = pNewTCB; + return 1; + } + return 0; +} + +/******************************************************************************* + * prvTraceIsSchedulerSuspended + * + * Returns true if the RTOS scheduler currently is disabled, thus preventing any + * task-switches from occurring. Only called from vTraceStoreISREnd. + ******************************************************************************/ +unsigned char prvTraceIsSchedulerSuspended(void) +{ + /* Assumed to be available in FreeRTOS. According to the FreeRTOS docs, + INCLUDE_xTaskGetSchedulerState or configUSE_TIMERS must be set to 1 in + FreeRTOSConfig.h for this function to be available. */ + + return xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED; +} + +/******************************************************************************* + * prvCheckRecorderStatus + * + * Called by TzCtrl task periodically (every 100 ms - seems reasonable). + * Checks a number of diagnostic variables and give warnings as user events, + * in most cases including a suggested solution. + ******************************************************************************/ +static void prvCheckRecorderStatus(void) +{ +#if defined(TRC_CFG_ENABLE_STACK_MONITOR) && (TRC_CFG_ENABLE_STACK_MONITOR == 1) && (TRC_CFG_SCHEDULING_ONLY == 0) + if (tasksNotIncluded > 0) + { + prvTraceWarning(PSF_WARNING_STACKMON_NO_SLOTS); + tasksNotIncluded = 0; + } +#endif /* defined(TRC_CFG_ENABLE_STACK_MONITOR) && (TRC_CFG_ENABLE_STACK_MONITOR == 1) && (TRC_CFG_SCHEDULING_ONLY == 0) */ + + if (NoRoomForSymbol > 0) + { + prvTraceWarning(PSF_WARNING_SYMBOL_TABLE_SLOTS); + NoRoomForSymbol = 0; + } + + if (NoRoomForObjectData > 0) + { + prvTraceWarning(PSF_WARNING_OBJECT_DATA_SLOTS); + NoRoomForObjectData = 0; + } + + if (LongestSymbolName > (TRC_CFG_SYMBOL_MAX_LENGTH)) + { + prvTraceWarning(PSF_WARNING_SYMBOL_MAX_LENGTH); + LongestSymbolName = 0; + } + + if (MaxBytesTruncated > 0) + { + prvTraceWarning(PSF_WARNING_STRING_TOO_LONG); + MaxBytesTruncated = 0; + } +} + +/******************************************************************************* + * TzCtrl + * + * Task for sending the trace data from the internal buffer to the stream + * interface (assuming TRC_STREAM_PORT_USE_INTERNAL_BUFFER == 1) and for + * receiving commands from Tracealyzer. Also does some diagnostics. + ******************************************************************************/ +static portTASK_FUNCTION( TzCtrl, pvParameters ) +{ + TracealyzerCommandType msg; + int32_t bytes = 0; + int32_t status = 0; + (void)pvParameters; + + while (1) + { + do + { + /* Listen for new commands */ + bytes = 0; + status = TRC_STREAM_PORT_READ_DATA(&msg, sizeof(TracealyzerCommandType), (int32_t*)&bytes); + + if (status != 0) + { + /* The connection has failed, stop tracing */ + vTraceStop(); + } + + if ((status == 0) && (bytes == sizeof(TracealyzerCommandType))) + { + if (prvIsValidCommand(&msg)) + { + prvProcessCommand(&msg); /* Start or Stop currently... */ + } + } + +/* If the internal buffer is disabled, the COMMIT macro instead sends the data directly + from the "event functions" (using TRC_STREAM_PORT_WRITE_DATA). */ +#if (TRC_STREAM_PORT_USE_INTERNAL_BUFFER == 1) + /* If there is a buffer page, this sends it to the streaming interface using TRC_STREAM_PORT_WRITE_DATA. */ + bytes = prvPagedEventBufferTransfer(); +#endif + + /* If there was data sent or received (bytes != 0), loop around and repeat, if there is more data to send or receive. + Otherwise, step out of this loop and sleep for a while. */ + + } while (bytes != 0); + + if (xTraceIsRecordingEnabled()) + { + prvCheckRecorderStatus(); + prvReportStackUsage(); + } + + vTaskDelay(TRC_CFG_CTRL_TASK_DELAY); + } +} + +#endif /*(TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING)*/ + + +#if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_SNAPSHOT) + +/* Internal flag to tell the context of tracePEND_FUNC_CALL_FROM_ISR */ +int uiInEventGroupSetBitsFromISR = 0; + +/****************************************************************************** + * TraceQueueClassTable + * Translates a FreeRTOS QueueType into trace objects classes (TRACE_CLASS_). + * Has one entry for each QueueType, gives TRACE_CLASS ID. + ******************************************************************************/ +traceObjectClass TraceQueueClassTable[5] = { + TRACE_CLASS_QUEUE, + TRACE_CLASS_MUTEX, + TRACE_CLASS_SEMAPHORE, + TRACE_CLASS_SEMAPHORE, + TRACE_CLASS_MUTEX +}; + +#if (TRC_CFG_SCHEDULING_ONLY == 0) +/******************************************************************************* + * vTraceSetQueueName(void* object, const char* name) + * + * Parameter object: pointer to the Queue that shall be named + * Parameter name: the name to set (const string literal) + * + * Sets a name for Queue objects for display in Tracealyzer. + ******************************************************************************/ +void vTraceSetQueueName(void* object, const char* name) +{ + prvTraceSetObjectName(TRACE_CLASS_QUEUE, TRACE_GET_OBJECT_NUMBER(QUEUE, object), name); +} + +/******************************************************************************* + * vTraceSetSemaphoreName(void* object, const char* name) + * + * Parameter object: pointer to the Semaphore that shall be named + * Parameter name: the name to set (const string literal) + * + * Sets a name for Semaphore objects for display in Tracealyzer. + ******************************************************************************/ +void vTraceSetSemaphoreName(void* object, const char* name) +{ + prvTraceSetObjectName(TRACE_CLASS_SEMAPHORE, TRACE_GET_OBJECT_NUMBER(QUEUE, object), name); +} + +/******************************************************************************* + * vTraceSetMutexName(void* object, const char* name) + * + * Parameter object: pointer to the Mutex that shall be named + * Parameter name: the name to set (const string literal) + * + * Sets a name for Semaphore objects for display in Tracealyzer. + ******************************************************************************/ +void vTraceSetMutexName(void* object, const char* name) +{ + prvTraceSetObjectName(TRACE_CLASS_MUTEX, TRACE_GET_OBJECT_NUMBER(QUEUE, object), name); +} + +#if (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X) +/******************************************************************************* +* vTraceSetEventGroupName(void* object, const char* name) +* +* Parameter object: pointer to the EventGroup that shall be named +* Parameter name: the name to set (const string literal) +* +* Sets a name for EventGroup objects for display in Tracealyzer. +******************************************************************************/ +void vTraceSetEventGroupName(void* object, const char* name) +{ + prvTraceSetObjectName(TRACE_CLASS_EVENTGROUP, TRACE_GET_OBJECT_NUMBER(EVENTGROUP, object), name); +} +#endif /* (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X) */ + +#if (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) +/******************************************************************************* +* vTraceSetStreamBufferName(void* object, const char* name) +* +* Parameter object: pointer to the StreamBuffer that shall be named +* Parameter name: the name to set (const string literal) +* +* Sets a name for StreamBuffer objects for display in Tracealyzer. +******************************************************************************/ +void vTraceSetStreamBufferName(void* object, const char* name) +{ + prvTraceSetObjectName(TRACE_CLASS_STREAMBUFFER, TRACE_GET_OBJECT_NUMBER(STREAMBUFFER, object), name); +} + +/******************************************************************************* +* vTraceSetMessageBufferName(void* object, const char* name) +* +* Parameter object: pointer to the MessageBuffer that shall be named +* Parameter name: the name to set (const string literal) +* +* Sets a name for MessageBuffer objects for display in Tracealyzer. +******************************************************************************/ +void vTraceSetMessageBufferName(void* object, const char* name) +{ + prvTraceSetObjectName(TRACE_CLASS_MESSAGEBUFFER, TRACE_GET_OBJECT_NUMBER(STREAMBUFFER, object), name); +} +#endif /* (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */ + +#endif /* (TRC_CFG_SCHEDULING_ONLY == 0) */ + +void* prvTraceGetCurrentTaskHandle() +{ + return xTaskGetCurrentTaskHandle(); +} + +/****************************************************************************** +* vTraceEnable(int startOption) - snapshot mode +* +* Initializes and optionally starts the trace, depending on the start option. +* To use the trace recorder, the startup must call vTraceEnable before any RTOS +* calls are made (including "create" calls). Three start options are provided: +* +* TRC_START: Starts the tracing directly. In snapshot mode this allows for +* starting the trace at any point in your code, assuming vTraceEnable(TRC_INIT) +* has been called in the startup. +* Can also be used for streaming without Tracealyzer control, e.g. to a local +* flash file system (assuming such a "stream port", see trcStreamingPort.h). +* +* TRC_INIT: Initializes the trace recorder, but does not start the tracing. +* In snapshot mode, this must be followed by a vTraceEnable(TRC_START) sometime +* later. +* +* Usage examples, in snapshot mode: +* +* Snapshot trace, from startup: +* +* vTraceEnable(TRC_START); +* +* +* Snapshot trace, from a later point: +* +* vTraceEnable(TRC_INIT); +* +* ... +* vTraceEnable(TRC_START); // e.g., in task context, at some relevant event +* +* +* Note: See other implementation of vTraceEnable in trcStreamingRecorder.c +******************************************************************************/ +void vTraceEnable(int startOption) +{ + prvTraceInitTraceData(); + + if (startOption == TRC_START) + { + vTraceStart(); + } + else if (startOption == TRC_START_AWAIT_HOST) + { + prvTraceError("vTraceEnable(TRC_START_AWAIT_HOST) not allowed in Snapshot mode"); + } + else if (startOption != TRC_INIT) + { + prvTraceError("Unexpected argument to vTraceEnable (snapshot mode)"); + } + +#if defined(TRC_CFG_ENABLE_STACK_MONITOR) && (TRC_CFG_ENABLE_STACK_MONITOR == 1) && (TRC_CFG_SCHEDULING_ONLY == 0) + /* Creates the TzCtrl task - reports unsed stack */ + if (HandleTzCtrl == NULL) + { +#if defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION == 1) + HandleTzCtrl = xTaskCreateStatic(TzCtrl, STRING_CAST("TzCtrl"), TRC_CFG_CTRL_TASK_STACK_SIZE, NULL, TRC_CFG_CTRL_TASK_PRIORITY, stackTzCtrl, &tcbTzCtrl); +#else /* defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION == 1) */ + xTaskCreate(TzCtrl, STRING_CAST("TzCtrl"), TRC_CFG_CTRL_TASK_STACK_SIZE, NULL, TRC_CFG_CTRL_TASK_PRIORITY, &HandleTzCtrl); +#endif /* defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION == 1) */ + } + +#endif /* defined(TRC_CFG_ENABLE_STACK_MONITOR) && (TRC_CFG_ENABLE_STACK_MONITOR == 1) && (TRC_CFG_SCHEDULING_ONLY == 0) */ +} + +/******************************************************************************* +* TzCtrl +* +* Task for sending the trace data from the internal buffer to the stream +* interface (assuming TRC_STREAM_PORT_USE_INTERNAL_BUFFER == 1) and for +* receiving commands from Tracealyzer. Also does some diagnostics. +******************************************************************************/ +#if defined(TRC_CFG_ENABLE_STACK_MONITOR) && (TRC_CFG_ENABLE_STACK_MONITOR == 1) && (TRC_CFG_SCHEDULING_ONLY == 0) +static portTASK_FUNCTION(TzCtrl, pvParameters) +{ + (void)pvParameters; + + while (1) + { + if (xTraceIsRecordingEnabled()) + { + prvReportStackUsage(); + } + + vTaskDelay(TRC_CFG_CTRL_TASK_DELAY); + } +} +#endif + +/* Initialization of the object property table */ +void vTraceInitObjectPropertyTable() +{ + RecorderDataPtr->ObjectPropertyTable.NumberOfObjectClasses = TRACE_NCLASSES; + RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[0] = TRC_CFG_NQUEUE; + RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[1] = TRC_CFG_NSEMAPHORE; + RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[2] = TRC_CFG_NMUTEX; + RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[3] = TRC_CFG_NTASK; + RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[4] = TRC_CFG_NISR; + RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[5] = TRC_CFG_NTIMER; + RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[6] = TRC_CFG_NEVENTGROUP; + RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[7] = TRC_CFG_NSTREAMBUFFER; + RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[8] = TRC_CFG_NMESSAGEBUFFER; + RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[0] = TRC_CFG_NAME_LEN_QUEUE; + RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[1] = TRC_CFG_NAME_LEN_SEMAPHORE; + RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[2] = TRC_CFG_NAME_LEN_MUTEX; + RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[3] = TRC_CFG_NAME_LEN_TASK; + RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[4] = TRC_CFG_NAME_LEN_ISR; + RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[5] = TRC_CFG_NAME_LEN_TIMER; + RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[6] = TRC_CFG_NAME_LEN_EVENTGROUP; + RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[7] = TRC_CFG_NAME_LEN_STREAMBUFFER; + RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[8] = TRC_CFG_NAME_LEN_MESSAGEBUFFER; + RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[0] = PropertyTableSizeQueue; + RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[1] = PropertyTableSizeSemaphore; + RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[2] = PropertyTableSizeMutex; + RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[3] = PropertyTableSizeTask; + RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[4] = PropertyTableSizeISR; + RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[5] = PropertyTableSizeTimer; + RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[6] = PropertyTableSizeEventGroup; + RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[7] = PropertyTableSizeStreamBuffer; + RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[8] = PropertyTableSizeMessageBuffer; + RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[0] = StartIndexQueue; + RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[1] = StartIndexSemaphore; + RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[2] = StartIndexMutex; + RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[3] = StartIndexTask; + RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[4] = StartIndexISR; + RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[5] = StartIndexTimer; + RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[6] = StartIndexEventGroup; + RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[7] = StartIndexStreamBuffer; + RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[8] = StartIndexMessageBuffer; + RecorderDataPtr->ObjectPropertyTable.ObjectPropertyTableSizeInBytes = TRACE_OBJECT_TABLE_SIZE; +} + +/* Initialization of the handle mechanism, see e.g, prvTraceGetObjectHandle */ +void vTraceInitObjectHandleStack() +{ + objectHandleStacks.indexOfNextAvailableHandle[0] = objectHandleStacks.lowestIndexOfClass[0] = 0; + objectHandleStacks.indexOfNextAvailableHandle[1] = objectHandleStacks.lowestIndexOfClass[1] = (TRC_CFG_NQUEUE); + objectHandleStacks.indexOfNextAvailableHandle[2] = objectHandleStacks.lowestIndexOfClass[2] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE); + objectHandleStacks.indexOfNextAvailableHandle[3] = objectHandleStacks.lowestIndexOfClass[3] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX); + objectHandleStacks.indexOfNextAvailableHandle[4] = objectHandleStacks.lowestIndexOfClass[4] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) + (TRC_CFG_NTASK); + objectHandleStacks.indexOfNextAvailableHandle[5] = objectHandleStacks.lowestIndexOfClass[5] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) + (TRC_CFG_NTASK) + (TRC_CFG_NISR); + objectHandleStacks.indexOfNextAvailableHandle[6] = objectHandleStacks.lowestIndexOfClass[6] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) + (TRC_CFG_NTASK) + (TRC_CFG_NISR) + (TRC_CFG_NTIMER); + objectHandleStacks.indexOfNextAvailableHandle[7] = objectHandleStacks.lowestIndexOfClass[7] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) + (TRC_CFG_NTASK) + (TRC_CFG_NISR) + (TRC_CFG_NTIMER) + (TRC_CFG_NEVENTGROUP); + objectHandleStacks.indexOfNextAvailableHandle[8] = objectHandleStacks.lowestIndexOfClass[8] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) + (TRC_CFG_NTASK) + (TRC_CFG_NISR) + (TRC_CFG_NTIMER) + (TRC_CFG_NEVENTGROUP) + (TRC_CFG_NSTREAMBUFFER); + + objectHandleStacks.highestIndexOfClass[0] = (TRC_CFG_NQUEUE) - 1; + objectHandleStacks.highestIndexOfClass[1] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) - 1; + objectHandleStacks.highestIndexOfClass[2] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) - 1; + objectHandleStacks.highestIndexOfClass[3] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) + (TRC_CFG_NTASK) - 1; + objectHandleStacks.highestIndexOfClass[4] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) + (TRC_CFG_NTASK) + (TRC_CFG_NISR) - 1; + objectHandleStacks.highestIndexOfClass[5] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) + (TRC_CFG_NTASK) + (TRC_CFG_NISR) + (TRC_CFG_NTIMER) - 1; + objectHandleStacks.highestIndexOfClass[6] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) + (TRC_CFG_NTASK) + (TRC_CFG_NISR) + (TRC_CFG_NTIMER) + (TRC_CFG_NEVENTGROUP) - 1; + objectHandleStacks.highestIndexOfClass[7] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) + (TRC_CFG_NTASK) + (TRC_CFG_NISR) + (TRC_CFG_NTIMER) + (TRC_CFG_NEVENTGROUP) + (TRC_CFG_NSTREAMBUFFER) - 1; + objectHandleStacks.highestIndexOfClass[8] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) + (TRC_CFG_NTASK) + (TRC_CFG_NISR) + (TRC_CFG_NTIMER) + (TRC_CFG_NEVENTGROUP) + (TRC_CFG_NSTREAMBUFFER) + (TRC_CFG_NMESSAGEBUFFER) - 1; +} + +/* Returns the "Not enough handles" error message for this object class */ +const char* pszTraceGetErrorNotEnoughHandles(traceObjectClass objectclass) +{ + switch(objectclass) + { + case TRACE_CLASS_TASK: + return "Not enough TASK handles - increase TRC_CFG_NTASK in trcSnapshotConfig.h"; + case TRACE_CLASS_ISR: + return "Not enough ISR handles - increase TRC_CFG_NISR in trcSnapshotConfig.h"; + case TRACE_CLASS_SEMAPHORE: + return "Not enough SEMAPHORE handles - increase TRC_CFG_NSEMAPHORE in trcSnapshotConfig.h"; + case TRACE_CLASS_MUTEX: + return "Not enough MUTEX handles - increase TRC_CFG_NMUTEX in trcSnapshotConfig.h"; + case TRACE_CLASS_QUEUE: + return "Not enough QUEUE handles - increase TRC_CFG_NQUEUE in trcSnapshotConfig.h"; + case TRACE_CLASS_TIMER: + return "Not enough TIMER handles - increase TRC_CFG_NTIMER in trcSnapshotConfig.h"; + case TRACE_CLASS_EVENTGROUP: + return "Not enough EVENTGROUP handles - increase TRC_CFG_NEVENTGROUP in trcSnapshotConfig.h"; + case TRACE_CLASS_STREAMBUFFER: + return "Not enough STREAMBUFFER handles - increase TRC_CFG_NSTREAMBUFFER in trcSnapshotConfig.h"; + case TRACE_CLASS_MESSAGEBUFFER: + return "Not enough MESSAGEBUFFER handles - increase TRC_CFG_NMESSAGEBUFFER in trcSnapshotConfig.h"; + default: + return "pszTraceGetErrorHandles: Invalid objectclass!"; + } +} + +/******************************************************************************* + * prvTraceIsSchedulerSuspended + * + * Returns true if the RTOS scheduler currently is disabled, thus preventing any + * task-switches from occurring. Only called from vTraceStoreISREnd. + ******************************************************************************/ +#if (TRC_CFG_INCLUDE_ISR_TRACING == 1) +unsigned char prvTraceIsSchedulerSuspended(void) +{ + /* Assumed to be available in FreeRTOS. According to the FreeRTOS docs, + INCLUDE_xTaskGetSchedulerState or configUSE_TIMERS must be set to 1 in + FreeRTOSConfig.h for this function to be available. */ + + return xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED; +} +#endif + +#endif /* Snapshot mode */ + +#endif /*(TRC_USE_TRACEALYZER_RECORDER == 1)*/ + +#endif /* configUSE_PERCEPIO_TRACE_HOOKS */ /* << EST: FreeRTOS using Percepio Trace */ + + diff --git a/TSM_PicoW_Sensor/McuLib/TraceRecorder/trcSnapshotRecorder.c b/TSM_PicoW_Sensor/McuLib/TraceRecorder/trcSnapshotRecorder.c new file mode 100644 index 0000000..d5dcc68 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/TraceRecorder/trcSnapshotRecorder.c @@ -0,0 +1,3103 @@ +/******************************************************************************* + * Trace Recorder Library for Tracealyzer v3.3.0 + * Percepio AB, www.percepio.com + * + * trcSnapshotRecorder.c + * + * The generic core of the trace recorder's snapshot mode. + * + * Terms of Use + * This file is part of the trace recorder library (RECORDER), which is the + * intellectual property of Percepio AB (PERCEPIO) and provided under a + * license as follows. + * The RECORDER may be used free of charge for the purpose of recording data + * intended for analysis in PERCEPIO products. It may not be used or modified + * for other purposes without explicit permission from PERCEPIO. + * You may distribute the RECORDER in its original source code form, assuming + * this text (terms of use, disclaimer, copyright notice) is unchanged. You are + * allowed to distribute the RECORDER with minor modifications intended for + * configuration or porting of the RECORDER, e.g., to allow using it on a + * specific processor, processor family or with a specific communication + * interface. Any such modifications should be documented directly below + * this comment block. + * + * Disclaimer + * The RECORDER is being delivered to you AS IS and PERCEPIO makes no warranty + * as to its use or performance. PERCEPIO does not and cannot warrant the + * performance or results you may obtain by using the RECORDER or documentation. + * PERCEPIO make no warranties, express or implied, as to noninfringement of + * third party rights, merchantability, or fitness for any particular purpose. + * In no event will PERCEPIO, its technology partners, or distributors be liable + * to you for any consequential, incidental or special damages, including any + * lost profits or lost savings, even if a representative of PERCEPIO has been + * advised of the possibility of such damages, or for any claim by any third + * party. Some jurisdictions do not allow the exclusion or limitation of + * incidental, consequential or special damages, or the exclusion of implied + * warranties or limitations on how long an implied warranty may last, so the + * above limitations may not apply to you. + * + * Tabs are used for indent in this file (1 tab = 4 spaces) + * + * Copyright Percepio AB, 2017. + * www.percepio.com + ******************************************************************************/ + +#include "trcRecorder.h" + +#if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_SNAPSHOT) + +#if (TRC_USE_TRACEALYZER_RECORDER == 1) + +#include +#include + #ifndef __HIWARE__ /* << EST */ +#include +#endif + +#if ((TRC_HWTC_TYPE == TRC_CUSTOM_TIMER_INCR) || (TRC_HWTC_TYPE == TRC_CUSTOM_TIMER_DECR)) + #error "CUSTOM timestamping mode is not (yet) supported in snapshot mode!" +#endif + +/* DO NOT CHANGE */ +#define TRACE_MINOR_VERSION 5 +#if (TRC_CFG_INCLUDE_ISR_TRACING == 1) +static traceHandle isrstack[TRC_CFG_MAX_ISR_NESTING]; +int32_t isPendingContextSwitch = 0; +#endif /* (TRC_CFG_INCLUDE_ISR_TRACING == 1) */ + +#if !defined TRC_CFG_INCLUDE_READY_EVENTS || TRC_CFG_INCLUDE_READY_EVENTS == 1 +static int readyEventsEnabled = 1; +#endif /*!defined TRC_CFG_INCLUDE_READY_EVENTS || TRC_CFG_INCLUDE_READY_EVENTS == 1*/ + +/******************************************************************************* + * uiTraceTickCount + * + * This variable is should be updated by the Kernel tick interrupt. This does + * not need to be modified when developing a new timer port. It is preferred to + * keep any timer port changes in the HWTC macro definitions, which typically + * give sufficient flexibility. + ******************************************************************************/ +uint32_t uiTraceTickCount = 0; + +uint32_t trace_disable_timestamp = 0; + +static uint32_t last_timestamp = 0; + +/* Flag that shows if inside a critical section of the recorder */ +volatile int recorder_busy = 0; + +/* Holds the value set by vTraceSetFrequency */ +uint32_t timestampFrequency = 0; + +/* The last error message of the recorder. NULL if no error message. */ +const char* traceErrorMessage = NULL; + +int8_t nISRactive = 0; + +traceHandle handle_of_last_logged_task = 0; + +/* Called when the recorder is stopped, set by vTraceSetStopHook. */ +TRACE_STOP_HOOK vTraceStopHookPtr = (TRACE_STOP_HOOK)0; + +uint16_t CurrentFilterMask = 0xFFFF; + +uint16_t CurrentFilterGroup = FilterGroup0; + +extern int8_t nISRactive; + +extern traceHandle handle_of_last_logged_task; + +/*************** Private Functions *******************************************/ +static void prvStrncpy(char* dst, const char* src, uint32_t maxLength); +static uint8_t prvTraceGetObjectState(uint8_t objectclass, traceHandle id); +static void prvTraceGetChecksum(const char *pname, uint8_t* pcrc, uint8_t* plength); +static void* prvTraceNextFreeEventBufferSlot(void); +static uint16_t prvTraceGetDTS(uint16_t param_maxDTS); +static traceString prvTraceOpenSymbol(const char* name, traceString userEventChannel); +static void prvTraceUpdateCounters(void); + +void vTraceStoreMemMangEvent(uint32_t ecode, uint32_t address, int32_t signed_size); + +#if (TRC_CFG_SNAPSHOT_MODE == TRC_SNAPSHOT_MODE_RING_BUFFER) +static void prvCheckDataToBeOverwrittenForMultiEntryEvents(uint8_t nEntries); +#endif + +static traceString prvTraceCreateSymbolTableEntry(const char* name, + uint8_t crc6, + uint8_t len, + traceString channel); + +static traceString prvTraceLookupSymbolTableEntry(const char* name, + uint8_t crc6, + uint8_t len, + traceString channel); + + +#if (TRC_CFG_INCLUDE_ISR_TRACING == 0) +/* ISR tracing is turned off */ +void prvTraceIncreaseISRActive(void); +void prvTraceDecreaseISRActive(void); +#endif /*(TRC_CFG_INCLUDE_ISR_TRACING == 0)*/ + +#if (TRC_CFG_USE_16BIT_OBJECT_HANDLES == 1) +static uint8_t prvTraceGet8BitHandle(traceHandle handle); +#else +#define prvTraceGet8BitHandle(x) ((uint8_t)x) +#endif + + +#if (TRC_CFG_INCLUDE_MEMMANG_EVENTS == 1) && (TRC_CFG_SCHEDULING_ONLY == 0) +static uint32_t heapMemUsage = 0; +#endif + +#if (TRC_CFG_SCHEDULING_ONLY == 0) +static uint32_t prvTraceGetParam(uint32_t, uint32_t); +#endif + +/******************************************************************************* + * prvTraceInitTraceData + * + * Allocates and initializes the recorder data structure, based on the constants + * in trcConfig.h. This allows for allocating the data on the heap, instead of + * using a static declaration. + ******************************************************************************/ +void prvTraceInitTraceData(void); + +/******************************************************************************* + * prvTracePortGetTimeStamp + * + * Returns the current time based on the HWTC macros which provide a hardware + * isolation layer towards the hardware timer/counter. + * + * The HWTC macros and prvTracePortGetTimeStamp is the main porting issue + * or the trace recorder library. Typically you should not need to change + * the code of prvTracePortGetTimeStamp if using the HWTC macros. + * + ******************************************************************************/ +void prvTracePortGetTimeStamp(uint32_t *puiTimestamp); + +static void prvTraceTaskInstanceFinish(int8_t direct); + +#if ((TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1)) +static void vTracePrintF_Helper(traceString eventLabel, const char* formatStr, va_list vl); + +#if (TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER == 1) +static void vTraceUBData_Helper(traceUBChannel channelPair, va_list vl); +static void prvTraceUBHelper1(traceUBChannel channel, traceString eventLabel, traceString formatLabel, va_list vl); +static void prvTraceUBHelper2(traceUBChannel channel, uint32_t* data, uint32_t noOfSlots); +#endif /*(TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER == 1)*/ +#endif /* ((TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1)) */ + +/********* Public Functions **************************************************/ + +uint16_t uiIndexOfObject(traceHandle objecthandle, uint8_t objectclass); + +/******************************************************************************* + * prvTraceError + * + * Called by various parts in the recorder. Stops the recorder and stores a + * pointer to an error message, which is printed by the monitor task. + ******************************************************************************/ +void prvTraceError(const char* msg); + +/****************************************************************************** +* vTraceEnable(int startOption) - snapshot mode +* +* Initializes and optionally starts the trace, depending on the start option. +* To use the trace recorder, the startup must call vTraceEnable before any RTOS +* calls are made (including "create" calls). Three start options are provided: +* +* TRC_START: Starts the tracing directly. In snapshot mode this allows for +* starting the trace at any point in your code, assuming vTraceEnable(TRC_INIT) +* has been called in the startup. +* Can also be used for streaming without Tracealyzer control, e.g. to a local +* flash file system (assuming such a "stream port", see trcStreamingPort.h). +* +* TRC_INIT: Initializes the trace recorder, but does not start the tracing. +* In snapshot mode, this must be followed by a vTraceEnable(TRC_START) sometime +* later. +* +* Usage examples, in snapshot mode: +* +* Snapshot trace, from startup: +* +* vTraceEnable(TRC_START); +* +* +* Snapshot trace, from a later point: +* +* vTraceEnable(TRC_INIT); +* +* ... +* vTraceEnable(TRC_START); // e.g., in task context, at some relevant event +* +* +* Note: See other implementation of vTraceEnable in trcStreamingRecorder.c +******************************************************************************/ +void vTraceEnable(int startOption) +{ + prvTraceInitTraceData(); + + if (startOption == TRC_START) + { + vTraceStart(); + } + else if (startOption == TRC_START_AWAIT_HOST) + { + prvTraceError("vTraceEnable(TRC_START_AWAIT_HOST) not allowed in Snapshot mode"); + } + else if (startOption != TRC_INIT) + { + prvTraceError("Unexpected argument to vTraceEnable (snapshot mode)"); + } +} + +/******************************************************************************* + * vTraceSetRecorderDataBuffer + * + * If custom allocation is used, this function must be called so the recorder + * library knows where to save the trace data. + ******************************************************************************/ +#if (TRC_CFG_RECORDER_BUFFER_ALLOCATION == TRC_RECORDER_BUFFER_ALLOCATION_CUSTOM) +void vTraceSetRecorderDataBuffer(void* pRecorderData) +{ + TRACE_ASSERT(pRecorderData != NULL, "vTraceSetRecorderDataBuffer, pRecorderData == NULL", TRC_UNUSED); + RecorderDataPtr = pRecorderData; +} +#endif + +/******************************************************************************* + * vTraceSetStopHook + * + * Sets a function to be called when the recorder is stopped. This can be used + * to save the trace to a file system, if available. This is only implemented + * for snapshot mode. + ******************************************************************************/ +void vTraceSetStopHook(TRACE_STOP_HOOK stopHookFunction) +{ + vTraceStopHookPtr = stopHookFunction; +} + +/******************************************************************************* + * vTraceClear + * + * Resets the recorder. Only necessary if a restart is desired - this is not + * needed in the startup initialization. + ******************************************************************************/ +void vTraceClear(void) +{ + TRACE_ALLOC_CRITICAL_SECTION(); + trcCRITICAL_SECTION_BEGIN(); + RecorderDataPtr->absTimeLastEventSecond = 0; + RecorderDataPtr->absTimeLastEvent = 0; + RecorderDataPtr->nextFreeIndex = 0; + RecorderDataPtr->numEvents = 0; + RecorderDataPtr->bufferIsFull = 0; + traceErrorMessage = NULL; + RecorderDataPtr->internalErrorOccured = 0; + (void)memset(RecorderDataPtr->eventData, 0, RecorderDataPtr->maxEvents * 4); + handle_of_last_logged_task = 0; + trcCRITICAL_SECTION_END(); +} + +/******************************************************************************* + * uiTraceStart + * + * Starts the recorder. The recorder will not be started if an error has been + * indicated using prvTraceError, e.g. if any of the Nx constants in trcConfig.h + * has a too small value (TRC_CFG_NTASK, TRC_CFG_NQUEUE, etc). + * + * Returns 1 if the recorder was started successfully. + * Returns 0 if the recorder start was prevented due to a previous internal + * error. In that case, check xTraceGetLastError to get the error message. + * Any error message is also presented when opening a trace file. + * + * This function is obsolete, but has been saved for backwards compatibility. + * We recommend using vTraceEnable instead. + ******************************************************************************/ +uint32_t uiTraceStart(void) +{ + traceHandle handle; + TRACE_ALLOC_CRITICAL_SECTION(); + + handle = 0; + + if (RecorderDataPtr == NULL) + { + prvTraceError("RecorderDataPtr is NULL. Call vTraceInitTraceData() before starting trace."); + return 0; + } + + if (RecorderDataPtr->recorderActive == 1) + return 1; /* Already running */ + + if (traceErrorMessage == NULL) + { + trcCRITICAL_SECTION_BEGIN(); + RecorderDataPtr->recorderActive = 1; + + handle = TRACE_GET_TASK_NUMBER(TRACE_GET_CURRENT_TASK()); + if (handle == 0) + { + /* This occurs if the scheduler is not yet started. + This creates a dummy "(startup)" task entry internally in the + recorder */ + handle = prvTraceGetObjectHandle(TRACE_CLASS_TASK); + prvTraceSetObjectName(TRACE_CLASS_TASK, handle, "(startup)"); + + prvTraceSetPriorityProperty(TRACE_CLASS_TASK, handle, 0); + } + + prvTraceStoreTaskswitch(handle); /* Register the currently running task */ + trcCRITICAL_SECTION_END(); + } + return RecorderDataPtr->recorderActive; +} + +/******************************************************************************* + * vTraceStart + * + * Starts the recorder. The recorder will not be started if an error has been + * indicated using prvTraceError, e.g. if any of the Nx constants in trcConfig.h + * has a too small value (TRC_CFG_NTASK, TRC_CFG_NQUEUE, etc). + * + * This function is obsolete, but has been saved for backwards compatibility. + * We recommend using vTraceEnable instead. + ******************************************************************************/ +void vTraceStart(void) +{ + (void)uiTraceStart(); +} + +/******************************************************************************* + * vTraceStop + * + * Stops the recorder. The recording can be resumed by calling vTraceStart. + * This does not reset the recorder. Use vTraceClear if that is desired. + ******************************************************************************/ +void vTraceStop(void) +{ + if (RecorderDataPtr != NULL) + { + RecorderDataPtr->recorderActive = 0; + } + + if (vTraceStopHookPtr != (TRACE_STOP_HOOK)0) + { + (*vTraceStopHookPtr)(); /* An application call-back function. */ + } +} + +/******************************************************************************* +* xTraceIsRecordingEnabled +* Returns true (1) if the recorder is enabled (i.e. is recording), otherwise 0. +******************************************************************************/ +int xTraceIsRecordingEnabled(void) +{ + if (RecorderDataPtr != NULL) + { + return (int)RecorderDataPtr->recorderActive; + } + else + { + return 0; + } +} + +/******************************************************************************* + * xTraceGetLastError + * + * Gives the last error message, if any. NULL if no error message is stored. + * Any error message is also presented when opening a trace file. + ******************************************************************************/ +const char* xTraceGetLastError(void) +{ + return traceErrorMessage; +} + +/******************************************************************************* +* vTraceClearError +* +* Removes any previous error message generated by recorder calling prvTraceError. +* By calling this function, it may be possible to start/restart the trace +* despite errors in the recorder, but there is no guarantee that the trace +* recorder will work correctly in that case, depending on the type of error. +******************************************************************************/ +void vTraceClearError(void) +{ + traceErrorMessage = NULL; + if (RecorderDataPtr != NULL) + { + RecorderDataPtr->internalErrorOccured = 0; + } +} + +/******************************************************************************* + * xTraceGetTraceBuffer + * + * Returns a pointer to the recorder data structure. Use this together with + * uiTraceGetTraceBufferSize if you wish to implement an own store/upload + * solution, e.g., in case a debugger connection is not available for uploading + * the data. + ******************************************************************************/ +void* xTraceGetTraceBuffer(void) +{ + return RecorderDataPtr; +} + +/******************************************************************************* + * uiTraceGetTraceBufferSize + * + * Gets the size of the recorder data structure. For use together with + * vTraceGetTraceBuffer if you wish to implement an own store/upload solution, + * e.g., in case a debugger connection is not available for uploading the data. + ******************************************************************************/ +uint32_t uiTraceGetTraceBufferSize(void) +{ + return sizeof(RecorderDataType); +} + +/****************************************************************************** + * prvTraceTaskInstanceFinish + * + * Private common function for the vTraceTaskInstanceFinishXXX functions. + *****************************************************************************/ +static void prvTraceTaskInstanceFinish(int8_t direct) +{ + TaskInstanceStatusEvent* tis; + uint8_t dts45; + + TRACE_ALLOC_CRITICAL_SECTION(); + + trcCRITICAL_SECTION_BEGIN(); + if (RecorderDataPtr->recorderActive && handle_of_last_logged_task) + { + dts45 = (uint8_t)prvTraceGetDTS(0xFF); + tis = (TaskInstanceStatusEvent*) prvTraceNextFreeEventBufferSlot(); + if (tis != NULL) + { + if (direct == 0) + tis->type = TASK_INSTANCE_FINISHED_NEXT_KSE; + else + tis->type = TASK_INSTANCE_FINISHED_DIRECT; + + tis->dts = dts45; + prvTraceUpdateCounters(); + } + } + trcCRITICAL_SECTION_END(); +} + +/****************************************************************************** + * vTraceInstanceFinishedNext(void) + * + * Marks the current task instance as finished on the next kernel call. + * + * If that kernel call is blocking, the instance ends after the blocking event + * and the corresponding return event is then the start of the next instance. + * If the kernel call is not blocking, the viewer instead splits the current + * fragment right before the kernel call, which makes this call the first event + * of the next instance. + * + * See also TRC_CFG_USE_IMPLICIT_IFE_RULES in trcConfig.h + * + * Example: + * + * while(1) + * { + * xQueueReceive(CommandQueue, &command, timeoutDuration); + * processCommand(command); + * vTraceInstanceFinishedNext(); + * } + *****************************************************************************/ +void vTraceInstanceFinishedNext(void) +{ + prvTraceTaskInstanceFinish(0); +} + +/****************************************************************************** + * vTraceInstanceFinishedNow(void) + * + * Marks the current task instance as finished at this very instant. + * This makes the viewer to splits the current fragment at this point and begin + * a new actor instance. + * + * See also TRC_CFG_USE_IMPLICIT_IFE_RULES in trcConfig.h + * + * Example: + * + * This example will generate two instances for each loop iteration. + * The first instance ends at vTraceInstanceFinishedNow(), while the second + * instance ends at the next xQueueReceive call. + * + * while (1) + * { + * xQueueReceive(CommandQueue, &command, timeoutDuration); + * ProcessCommand(command); + * vTraceInstanceFinishedNow(); + * DoSometingElse(); + * vTraceInstanceFinishedNext(); + * } + *****************************************************************************/ +void vTraceInstanceFinishedNow(void) +{ + prvTraceTaskInstanceFinish(1); +} + +/******************************************************************************* + * Interrupt recording functions + ******************************************************************************/ + +#if (TRC_CFG_INCLUDE_ISR_TRACING == 1) + +/******************************************************************************* + * xTraceSetISRProperties + * + * Stores a name and priority level for an Interrupt Service Routine, to allow + * for better visualization. Returns a traceHandle used by vTraceStoreISRBegin. + * + * Example: + * #define PRIO_ISR_TIMER1 3 // the hardware priority of the interrupt + * ... + * traceHandle Timer1Handle = xTraceSetISRProperties("ISRTimer1", PRIO_ISR_TIMER1); + * ... + * void ISR_handler() + * { + * vTraceStoreISRBegin(Timer1Handle); + * ... + * vTraceStoreISREnd(0); + * } + ******************************************************************************/ + traceHandle xTraceSetISRProperties(const char* name, uint8_t priority) +{ + static traceHandle handle = 0; + handle++; + TRACE_ASSERT(handle <= RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[TRACE_CLASS_ISR], "xTraceSetISRProperties: Invalid value for handle", 0); + TRACE_ASSERT(name != NULL, "xTraceSetISRProperties: name == NULL", 0); + + prvTraceSetObjectName(TRACE_CLASS_ISR, handle, name); + prvTraceSetPriorityProperty(TRACE_CLASS_ISR, handle, priority); + + return handle; +} + +/******************************************************************************* + * vTraceStoreISRBegin + * + * Registers the beginning of an Interrupt Service Routine, using a traceHandle + * provided by xTraceSetISRProperties. + * + * Example: + * #define PRIO_ISR_TIMER1 3 // the hardware priority of the interrupt + * ... + * traceHandle Timer1Handle = xTraceSetISRProperties("ISRTimer1", PRIO_ISR_TIMER1); + * ... + * void ISR_handler() + * { + * vTraceStoreISRBegin(Timer1Handle); + * ... + * vTraceStoreISREnd(0); + * } + ******************************************************************************/ +void vTraceStoreISRBegin(traceHandle handle) +{ + TRACE_ALLOC_CRITICAL_SECTION(); + + if (recorder_busy) + { + /************************************************************************* + * This occurs if an ISR calls a trace function, preempting a previous + * trace call that is being processed in a different ISR or task. + * If this occurs, there is probably a problem in the definition of the + * recorder's internal critical sections (TRACE_ENTER_CRITICAL_SECTION and + * TRACE_EXIT_CRITICAL_SECTION). They must disable the RTOS tick interrupt + * and any other ISRs that calls the trace recorder directly or via + * traced kernel functions. The ARM port disables all interrupts using the + * PRIMASK register to avoid this issue. + *************************************************************************/ + prvTraceError("vTraceStoreISRBegin - recorder busy! See code comment."); + return; + } + trcCRITICAL_SECTION_BEGIN(); + + if (RecorderDataPtr->recorderActive && handle_of_last_logged_task) + { + uint16_t dts4; + + TRACE_ASSERT(handle != 0, "vTraceStoreISRBegin: Invalid ISR handle (NULL)", TRC_UNUSED); + TRACE_ASSERT(handle <= RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[TRACE_CLASS_ISR], "vTraceStoreISRBegin: Invalid ISR handle (> NISR)", TRC_UNUSED); + + dts4 = (uint16_t)prvTraceGetDTS(0xFFFF); + + if (RecorderDataPtr->recorderActive) /* Need to repeat this check! */ + { + if (nISRactive < TRC_CFG_MAX_ISR_NESTING) + { + TSEvent* ts; + uint8_t hnd8 = prvTraceGet8BitHandle(handle); + isrstack[nISRactive] = handle; + nISRactive++; + ts = (TSEvent*)prvTraceNextFreeEventBufferSlot(); + if (ts != NULL) + { + ts->type = TS_ISR_BEGIN; + ts->dts = dts4; + ts->objHandle = hnd8; + prvTraceUpdateCounters(); + } + } + else + { + /* This should not occur unless something is very wrong */ + prvTraceError("Too many nested interrupts!"); + } + } + } + trcCRITICAL_SECTION_END(); +} + +/******************************************************************************* + * vTraceStoreISREnd + * + * Registers the end of an Interrupt Service Routine. + * + * The parameter pendingISR indicates if the interrupt has requested a + * task-switch (= 1), e.g., by signaling a semaphore. Otherwise (= 0) the + * interrupt is assumed to return to the previous context. + * + * Example: + * #define PRIO_OF_ISR_TIMER1 3 // the hardware priority of the interrupt + * traceHandle traceHandleIsrTimer1 = 0; // The ID set by the recorder + * ... + * traceHandleIsrTimer1 = xTraceSetISRProperties("ISRTimer1", PRIO_OF_ISR_TIMER1); + * ... + * void ISR_handler() + * { + * vTraceStoreISRBegin(traceHandleIsrTimer1); + * ... + * vTraceStoreISREnd(0); + * } + ******************************************************************************/ +void vTraceStoreISREnd(int pendingISR) +{ + TSEvent* ts; + uint16_t dts5; + uint8_t hnd8 = 0, type = 0; + + TRACE_ALLOC_CRITICAL_SECTION(); + + if (! RecorderDataPtr->recorderActive || ! handle_of_last_logged_task) + { + return; + } + + if (recorder_busy) + { + /************************************************************************* + * This occurs if an ISR calls a trace function, preempting a previous + * trace call that is being processed in a different ISR or task. + * If this occurs, there is probably a problem in the definition of the + * recorder's internal critical sections (TRACE_ENTER_CRITICAL_SECTION and + * TRACE_EXIT_CRITICAL_SECTION). They must disable the RTOS tick interrupt + * and any other ISRs that calls the trace recorder directly or via + * traced kernel functions. The ARM port disables all interrupts using the + * PRIMASK register to avoid this issue. + *************************************************************************/ + prvTraceError("vTraceStoreISREnd - recorder busy! See code comment."); + return; + } + + if (nISRactive == 0) + { + prvTraceError("Unmatched call to vTraceStoreISREnd (nISRactive == 0, expected > 0)"); + return; + } + + trcCRITICAL_SECTION_BEGIN(); + isPendingContextSwitch |= pendingISR; /* Is there a pending context switch right now? */ + nISRactive--; + if (nISRactive > 0) + { + /* Return to another ISR */ + type = TS_ISR_RESUME; + hnd8 = prvTraceGet8BitHandle(isrstack[nISRactive - 1]); /* isrstack[nISRactive] is the handle of the ISR we're currently exiting. isrstack[nISRactive - 1] is the handle of the ISR that was executing previously. */ + } + else if ((isPendingContextSwitch == 0) || (prvTraceIsSchedulerSuspended())) + { + /* Return to interrupted task, if no context switch will occur in between. */ + type = TS_TASK_RESUME; + hnd8 = prvTraceGet8BitHandle(handle_of_last_logged_task); + } + + if (type != 0) + { + dts5 = (uint16_t)prvTraceGetDTS(0xFFFF); + ts = (TSEvent*)prvTraceNextFreeEventBufferSlot(); + if (ts != NULL) + { + ts->type = type; + ts->objHandle = hnd8; + ts->dts = dts5; + prvTraceUpdateCounters(); + } + } + + trcCRITICAL_SECTION_END(); +} + +#else + +/* ISR tracing is turned off */ +void prvTraceIncreaseISRActive(void) +{ + if (RecorderDataPtr->recorderActive && handle_of_last_logged_task) + nISRactive++; +} + +void prvTraceDecreaseISRActive(void) +{ + if (RecorderDataPtr->recorderActive && handle_of_last_logged_task) + nISRactive--; +} +#endif /* (TRC_CFG_INCLUDE_ISR_TRACING == 1)*/ + + +/********************************************************************************/ +/* User Event functions */ +/********************************************************************************/ + +#define MAX_ARG_SIZE (4+32) + +#if ((TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1)) +static uint8_t writeInt8(void * buffer, uint8_t i, uint8_t value) +{ + TRACE_ASSERT(buffer != NULL, "writeInt8: buffer == NULL", 0); + + if (i >= MAX_ARG_SIZE) + { + return 255; + } + + ((uint8_t*)buffer)[i] = value; + + if (i + 1 > MAX_ARG_SIZE) + { + return 255; + } + + return ((uint8_t) (i + 1)); +} +#endif + +#if ((TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1)) +static uint8_t writeInt16(void * buffer, uint8_t i, uint16_t value) +{ + TRACE_ASSERT(buffer != NULL, "writeInt16: buffer == NULL", 0); + + /* Align to multiple of 2 */ + while ((i % 2) != 0) + { + if (i >= MAX_ARG_SIZE) + { + return 255; + } + + ((uint8_t*)buffer)[i] = 0; + i++; + } + + if (i + 2 > MAX_ARG_SIZE) + { + return 255; + } + + ((uint16_t*)buffer)[i/2] = value; + + return ((uint8_t) (i + 2)); +} +#endif + +#if ((TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1)) +static uint8_t writeInt32(void * buffer, uint8_t i, uint32_t value) +{ + TRACE_ASSERT(buffer != NULL, "writeInt32: buffer == NULL", 0); + + /* A 32 bit value should begin at an even 4-byte address */ + while ((i % 4) != 0) + { + if (i >= MAX_ARG_SIZE) + { + return 255; + } + + ((uint8_t*)buffer)[i] = 0; + i++; + } + + if (i + 4 > MAX_ARG_SIZE) + { + return 255; + } + + ((uint32_t*)buffer)[i/4] = value; + + return ((uint8_t) (i + 4)); +} +#endif + +#if ((TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1) && (TRC_CFG_INCLUDE_FLOAT_SUPPORT)) +static uint8_t writeFloat(void * buffer, uint8_t i, float value) +{ + TRACE_ASSERT(buffer != NULL, "writeFloat: buffer == NULL", 0); + + /* A 32 bit value should begin at an even 4-byte address */ + while ((i % 4) != 0) + { + if (i >= MAX_ARG_SIZE) + { + return 255; + } + + ((uint8_t*)buffer)[i] = 0; + i++; + } + + if (i + 4 > MAX_ARG_SIZE) + { + return 255; + } + + ((float*)buffer)[i/4] = value; + + return i + 4; +} +#endif + +#if ((TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1) && (TRC_CFG_INCLUDE_FLOAT_SUPPORT)) +static uint8_t writeDouble(void * buffer, uint8_t i, double value) +{ + uint32_t * dest; + uint32_t * src = (uint32_t*)&value; + + TRACE_ASSERT(buffer != NULL, "writeDouble: buffer == NULL", 0); + + /* The double is written as two 32 bit values, and should begin at an even + 4-byte address (to avoid having to align with 8 byte) */ + while (i % 4 != 0) + { + if (i >= MAX_ARG_SIZE) + { + return 255; + } + + ((uint8_t*)buffer)[i] = 0; + i++; + } + + if (i + 8 > MAX_ARG_SIZE) + { + return 255; + } + + dest = &(((uint32_t *)buffer)[i/4]); + + dest[0] = src[0]; + dest[1] = src[1]; + + return i + 8; +} +#endif + +/******************************************************************************* + * prvTraceUserEventFormat + * + * Parses the format string and stores the arguments in the buffer. + ******************************************************************************/ +#if ((TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1)) +static uint8_t prvTraceUserEventFormat(const char* formatStr, va_list vl, uint8_t* buffer, uint8_t byteOffset) +{ + uint16_t formatStrIndex = 0; + uint8_t argCounter = 0; + uint8_t i = byteOffset; + + while (formatStr[formatStrIndex] != '\0') + { + if (formatStr[formatStrIndex] == '%') + { + argCounter++; + + if (argCounter > 15) + { + prvTraceError("vTracePrintF - Too many arguments, max 15 allowed!"); + return 0; + } + + formatStrIndex++; + + while ((formatStr[formatStrIndex] >= '0' && formatStr[formatStrIndex] <= '9') || formatStr[formatStrIndex] == '#' || formatStr[formatStrIndex] == '.') + formatStrIndex++; + + if (formatStr[formatStrIndex] != '\0') + { + switch (formatStr[formatStrIndex]) + { + case 'd': i = writeInt32( buffer, + i, + (uint32_t)va_arg(vl, uint32_t)); + break; + case 'x': + case 'X': + case 'u': i = writeInt32( buffer, + i, + (uint32_t)va_arg(vl, uint32_t)); + break; + case 's': i = writeInt16( buffer, + i, + xTraceRegisterString((char*)va_arg(vl, char*))); + break; + +#if (TRC_CFG_INCLUDE_FLOAT_SUPPORT) + /* Yes, "double" as type also in the float + case. This since "float" is promoted into "double" + by the va_arg stuff. */ + case 'f': i = writeFloat( buffer, + i, + (float)va_arg(vl, double)); + break; +#else + /* No support for floats, but attempt to store a float user event + avoid a possible crash due to float reference. Instead store the + data on uint_32 format (will not be displayed anyway). This is just + to keep va_arg and i consistent. */ + + case 'f': i = writeInt32( buffer, + i, + (uint32_t)va_arg(vl, double)); + break; +#endif + case 'l': + formatStrIndex++; + switch (formatStr[formatStrIndex]) + { +#if (TRC_CFG_INCLUDE_FLOAT_SUPPORT) + case 'f': i = writeDouble(buffer, + i, + (double)va_arg(vl, double)); + break; +#else + /* No support for floats, but attempt to store a float user event + avoid a possible crash due to float reference. Instead store the + data on uint_32 format (will not be displayed anyway). This is just + to keep va_arg and i consistent. */ + case 'f': i = writeInt32( buffer, /* In this case, the value will not be shown anyway */ + i, + (uint32_t)va_arg(vl, double)); + + i = writeInt32( buffer, /* Do it twice, to write in total 8 bytes */ + i, + (uint32_t)va_arg(vl, double)); + break; +#endif + + } + break; + case 'h': + formatStrIndex++; + switch (formatStr[formatStrIndex]) + { + case 'd': i = writeInt16( buffer, + i, + (uint16_t)va_arg(vl, uint32_t)); + break; + case 'u': i = writeInt16( buffer, + i, + (uint16_t)va_arg(vl, uint32_t)); + break; + } + break; + case 'b': + formatStrIndex++; + switch (formatStr[formatStrIndex]) + { + case 'd': i = writeInt8( buffer, + i, + (uint8_t)va_arg(vl, uint32_t)); + break; + + case 'u': i = writeInt8( buffer, + i, + (uint8_t)va_arg(vl, uint32_t)); + break; + } + break; + } + } + else + break; + } + formatStrIndex++; + if (i == 255) + { + prvTraceError("vTracePrintF - Too large arguments, max 32 byte allowed!"); + return 0; + } + } + return (uint8_t)(i+3)/4; +} +#endif + +/******************************************************************************* + * prvTraceClearChannelBuffer + * + * Clears a number of items in the channel buffer, starting from nextSlotToWrite. + ******************************************************************************/ +#if ((TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1) && (TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER == 1)) +static void prvTraceClearChannelBuffer(uint32_t count) +{ + uint32_t slots; + + TRACE_ASSERT(TRC_CFG_SEPARATE_USER_EVENT_BUFFER_SIZE >= count, + "prvTraceClearChannelBuffer: TRC_CFG_SEPARATE_USER_EVENT_BUFFER_SIZE is too small to handle this event.", TRC_UNUSED); + + /* Check if we're close to the end of the buffer */ + if (RecorderDataPtr->userEventBuffer.nextSlotToWrite + count > TRC_CFG_SEPARATE_USER_EVENT_BUFFER_SIZE) + { + slots = TRC_CFG_SEPARATE_USER_EVENT_BUFFER_SIZE - RecorderDataPtr->userEventBuffer.nextSlotToWrite; /* Number of slots before end of buffer */ + (void)memset(&RecorderDataPtr->userEventBuffer.channelBuffer[RecorderDataPtr->userEventBuffer.nextSlotToWrite], 0, slots); + (void)memset(&RecorderDataPtr->userEventBuffer.channelBuffer[0], 0, (count - slots)); + } + else + (void)memset(&RecorderDataPtr->userEventBuffer.channelBuffer[RecorderDataPtr->userEventBuffer.nextSlotToWrite], 0, count); +} +#endif + +/******************************************************************************* + * prvTraceCopyToDataBuffer + * + * Copies a number of items to the data buffer, starting from nextSlotToWrite. + ******************************************************************************/ +#if ((TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1) && (TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER == 1)) +static void prvTraceCopyToDataBuffer(uint32_t* data, uint32_t count) +{ + uint32_t slots; + + TRACE_ASSERT(data != NULL, + "prvTraceCopyToDataBuffer: data == NULL.", TRC_UNUSED); + TRACE_ASSERT(count <= TRC_CFG_SEPARATE_USER_EVENT_BUFFER_SIZE, + "prvTraceCopyToDataBuffer: TRC_CFG_SEPARATE_USER_EVENT_BUFFER_SIZE is too small to handle this event.", TRC_UNUSED); + /* Check if we're close to the end of the buffer */ + if (RecorderDataPtr->userEventBuffer.nextSlotToWrite + count > TRC_CFG_SEPARATE_USER_EVENT_BUFFER_SIZE) + { + slots = TRC_CFG_SEPARATE_USER_EVENT_BUFFER_SIZE - RecorderDataPtr->userEventBuffer.nextSlotToWrite; /* Number of slots before end of buffer */ + (void)memcpy(&RecorderDataPtr->userEventBuffer.dataBuffer[RecorderDataPtr->userEventBuffer.nextSlotToWrite * 4], data, slots * 4); + (void)memcpy(&RecorderDataPtr->userEventBuffer.dataBuffer[0], data + slots, (count - slots) * 4); + } + else + { + (void)memcpy(&RecorderDataPtr->userEventBuffer.dataBuffer[RecorderDataPtr->userEventBuffer.nextSlotToWrite * 4], data, count * 4); + } +} +#endif + +/******************************************************************************* + * prvTraceUBHelper1 + * + * Calls on prvTraceUserEventFormat() to do the actual formatting, then goes on + * to the next helper function. + ******************************************************************************/ +#if ((TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1) && (TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER == 1)) +static void prvTraceUBHelper1(traceUBChannel channel, traceString eventLabel, traceString formatLabel, va_list vl) +{ + uint32_t data[(3 + MAX_ARG_SIZE) / 4]; + uint8_t byteOffset = 4; /* Need room for timestamp */ + uint8_t noOfSlots; + + if (channel == 0) + { + /* We are dealing with an unknown channel format pair */ + byteOffset = (uint8_t)(byteOffset + 4); /* Also need room for channel and format */ + ((uint16_t*)data)[2] = eventLabel; + ((uint16_t*)data)[3] = formatLabel; + } + + noOfSlots = prvTraceUserEventFormat((char*)&(RecorderDataPtr->SymbolTable.symbytes[formatLabel+4]), vl, (uint8_t*)data, byteOffset); + + prvTraceUBHelper2(channel, data, noOfSlots); +} +#endif + +/******************************************************************************* + * prvTraceUBHelper2 + * + * This function simply copies the data buffer to the actual user event buffer. + ******************************************************************************/ +#if ((TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1) && (TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER == 1)) +static void prvTraceUBHelper2(traceUBChannel channel, uint32_t* data, uint32_t noOfSlots) +{ + static uint32_t old_timestamp = 0; + uint32_t old_nextSlotToWrite = 0; + + TRACE_ALLOC_CRITICAL_SECTION(); + + TRACE_ASSERT(TRC_CFG_SEPARATE_USER_EVENT_BUFFER_SIZE >= noOfSlots, "prvTraceUBHelper2: TRC_CFG_SEPARATE_USER_EVENT_BUFFER_SIZE is too small to handle this event.", TRC_UNUSED); + + trcCRITICAL_SECTION_BEGIN(); + /* Store the timestamp */ + prvTracePortGetTimeStamp(data); + + if (*data < old_timestamp) + { + RecorderDataPtr->userEventBuffer.wraparoundCounter++; + } + + old_timestamp = *data; + + /* Start by erasing any information in the channel buffer */ + prvTraceClearChannelBuffer(noOfSlots); + + prvTraceCopyToDataBuffer(data, noOfSlots); /* Will wrap around the data if necessary */ + + old_nextSlotToWrite = RecorderDataPtr->userEventBuffer.nextSlotToWrite; /* Save the index that we want to write the channel data at when we're done */ + RecorderDataPtr->userEventBuffer.nextSlotToWrite = (RecorderDataPtr->userEventBuffer.nextSlotToWrite + noOfSlots) % TRC_CFG_SEPARATE_USER_EVENT_BUFFER_SIZE; /* Make sure we never end up outside the buffer */ + + /* Write to the channel buffer to indicate that this user event is ready to be used */ + if (channel != 0) + { + RecorderDataPtr->userEventBuffer.channelBuffer[old_nextSlotToWrite] = channel; + } + else + { + /* 0xFF indicates that this is not a normal channel id */ + RecorderDataPtr->userEventBuffer.channelBuffer[old_nextSlotToWrite] = (traceUBChannel)0xFF; + } + trcCRITICAL_SECTION_END(); +} +#endif + +/******************************************************************************* + * xTraceRegisterUBChannel + * + * Registers a channel for Separated User Events, i.e., those stored in the + * separate user event buffer. + * + * Note: Only available if TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER is enabled in + * trcSnapshotConfig.h + ******************************************************************************/ +#if ((TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1) && (TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER == 1)) +traceUBChannel xTraceRegisterUBChannel(traceString channel, traceString formatStr) +{ + uint8_t i; + traceUBChannel retVal = 0; + + TRACE_ALLOC_CRITICAL_SECTION(); + + TRACE_ASSERT(formatStr != 0, "xTraceRegisterChannelFormat: formatStr == 0", (traceUBChannel)0); + + trcCRITICAL_SECTION_BEGIN(); + for (i = 1; i <= TRC_CFG_UB_CHANNELS; i++) /* Size of the channels buffer is TRC_CFG_UB_CHANNELS + 1. Index 0 is unused. */ + { + if(RecorderDataPtr->userEventBuffer.channels[i].name == 0 && RecorderDataPtr->userEventBuffer.channels[i].defaultFormat == 0) + { + /* Found empty slot */ + RecorderDataPtr->userEventBuffer.channels[i].name = channel; + RecorderDataPtr->userEventBuffer.channels[i].defaultFormat = formatStr; + retVal = (traceUBChannel)i; + break; + } + + if (RecorderDataPtr->userEventBuffer.channels[i].name == channel && RecorderDataPtr->userEventBuffer.channels[i].defaultFormat == formatStr) + { + /* Found a match */ + retVal = (traceUBChannel)i; + break; + } + } + trcCRITICAL_SECTION_END(); + + return retVal; +} +#endif + +/****************************************************************************** + * vTraceUBData + * + * Slightly faster version of vTracePrintF() due to no lookups. + * + * Note: This is only available if TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER is + * enabled in trcSnapshotConfig.h + ******************************************************************************/ +#if ((TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1) && (TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER == 1)) +void vTraceUBData(traceUBChannel channelPair, ...) +{ + va_list vl; + + TRACE_ASSERT(channelPair != 0, "vTraceUBData: Not a valid traceUBChannel!", TRC_UNUSED); + + va_start(vl, channelPair); + vTraceUBData_Helper(channelPair, vl); + va_end(vl); +} +#endif + +/* Extracts the channel name and format string from the traceUBChannel, then calls prvTraceUBHelper1. */ +#if ((TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1) && (TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER == 1)) +void vTraceUBData_Helper(traceUBChannel channelPair, va_list vl) +{ + traceString channel; + traceString formatStr; + + TRACE_ASSERT(channelPair != 0, "vTraceUBData_Helper: channelPair == 0", TRC_UNUSED); + TRACE_ASSERT(channelPair <= TRC_CFG_UB_CHANNELS, "vTraceUBData_Helper: ", TRC_UNUSED); + + channel = RecorderDataPtr->userEventBuffer.channels[channelPair].name; + formatStr = RecorderDataPtr->userEventBuffer.channels[channelPair].defaultFormat; + + prvTraceUBHelper1(channelPair, channel, formatStr, vl); +} +#endif + +/****************************************************************************** + * vTraceUBEvent + * + * Slightly faster version of ... due to no lookups. + ******************************************************************************/ +#if ((TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1) && (TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER == 1)) +void vTraceUBEvent(traceUBChannel channelPair) +{ + uint32_t data[(3 + MAX_ARG_SIZE) / 4]; + + TRACE_ASSERT(channelPair != 0, "vTraceUBEvent: channelPair == 0", TRC_UNUSED); + TRACE_ASSERT(channelPair <= TRC_CFG_UB_CHANNELS, "vTraceUBEvent: ", TRC_UNUSED); + + prvTraceUBHelper2(channelPair, data, 1); /* Only need one slot for timestamp */ +} +#endif + +/****************************************************************************** + * vTracePrintF + * + * Generates User Event with formatted text and data, similar to a "printf". + * It is very fast compared to a normal "printf" since this function only + * stores the arguments. The actual formatting is done + * on the host PC when the trace is displayed in the viewer tool. + * + * User Event labels are created using xTraceRegisterString. + * Example: + * + * traceString adc_uechannel = xTraceRegisterString("ADC User Events"); + * ... + * vTracePrintF(adc_uechannel, + * "ADC channel %d: %lf volts", + * ch, (double)adc_reading/(double)scale); + * + * This can be combined into one line, if desired, but this is slower: + * + * vTracePrintF(xTraceRegisterString("ADC User Events"), + * "ADC channel %d: %lf volts", + * ch, (double)adc_reading/(double)scale); + * + * Calling xTraceRegisterString multiple times will not create duplicate entries, but + * it is of course faster to just do it once, and then keep the handle for later + * use. If you don't have any data arguments, only a text label/string, it is + * better to use vTracePrint - it is faster. + * + * Format specifiers supported: + * %d - 32 bit signed integer + * %u - 32 bit unsigned integer + * %f - 32 bit float + * %s - string (is copied to the recorder symbol table) + * %hd - 16 bit signed integer + * %hu - 16 bit unsigned integer + * %bd - 8 bit signed integer + * %bu - 8 bit unsigned integer + * %lf - double-precision float (Note! See below...) + * + * Up to 15 data arguments are allowed, with a total size of maximum 32 byte. + * In case this is exceeded, the user event is changed into an error message. + * + * The data is stored in trace buffer, and is packed to allow storing multiple + * smaller data entries in the same 4-byte record, e.g., four 8-bit values. + * A string requires two bytes, as the symbol table is limited to 64K. Storing + * a double (%lf) uses two records, so this is quite costly. Use float (%f) + * unless the higher precision is really necessary. + * + * Note that the double-precision float (%lf) assumes a 64 bit double + * representation. This does not seem to be the case on e.g. PIC24 and PIC32. + * Before using a %lf argument on a 16-bit MCU, please verify that + * "sizeof(double)" actually gives 8 as expected. If not, use %f instead. + ******************************************************************************/ +#if ((TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1)) +void vTracePrintF(traceString eventLabel, const char* formatStr, ...) +{ + va_list vl; + + va_start(vl, formatStr); + vTracePrintF_Helper(eventLabel, formatStr, vl); + va_end(vl); +} +#endif + +#if ((TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1)) +void vTracePrintF_Helper(traceString eventLabel, const char* formatStr, va_list vl) +{ +#if (TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER == 0) + uint32_t noOfSlots; + UserEvent* ue1; + uint32_t tempDataBuffer[(3 + MAX_ARG_SIZE) / 4]; + TRACE_ALLOC_CRITICAL_SECTION(); + + TRACE_ASSERT(formatStr != NULL, "vTracePrintF_Helper: formatStr == NULL", TRC_UNUSED); + + trcCRITICAL_SECTION_BEGIN(); + + if (RecorderDataPtr->recorderActive && handle_of_last_logged_task) + { + /* First, write the "primary" user event entry in the local buffer, but + let the event type be "EVENT_BEING_WRITTEN" for now...*/ + + ue1 = (UserEvent*)(&tempDataBuffer[0]); + + ue1->type = EVENT_BEING_WRITTEN; /* Update this as the last step */ + + noOfSlots = prvTraceUserEventFormat(formatStr, vl, (uint8_t*)tempDataBuffer, 4); + + /* Store the format string, with a reference to the channel symbol */ + ue1->payload = prvTraceOpenSymbol(formatStr, eventLabel); + + ue1->dts = (uint8_t)prvTraceGetDTS(0xFF); + + /* prvTraceGetDTS might stop the recorder in some cases... */ + if (RecorderDataPtr->recorderActive) + { + + /* If the data does not fit in the remaining main buffer, wrap around to + 0 if allowed, otherwise stop the recorder and quit). */ + if (RecorderDataPtr->nextFreeIndex + noOfSlots > RecorderDataPtr->maxEvents) + { + #if (TRC_CFG_SNAPSHOT_MODE == TRC_SNAPSHOT_MODE_RING_BUFFER) + (void)memset(& RecorderDataPtr->eventData[RecorderDataPtr->nextFreeIndex * 4], + 0, + (RecorderDataPtr->maxEvents - RecorderDataPtr->nextFreeIndex)*4); + RecorderDataPtr->nextFreeIndex = 0; + RecorderDataPtr->bufferIsFull = 1; + #else + + /* Stop recorder, since the event data will not fit in the + buffer and not circular buffer in this case... */ + vTraceStop(); + #endif + } + + /* Check if recorder has been stopped (i.e., vTraceStop above) */ + if (RecorderDataPtr->recorderActive) + { + /* Check that the buffer to be overwritten does not contain any user + events that would be partially overwritten. If so, they must be "killed" + by replacing the user event and following data with NULL events (i.e., + using a memset to zero).*/ + #if (TRC_CFG_SNAPSHOT_MODE == TRC_SNAPSHOT_MODE_RING_BUFFER) + prvCheckDataToBeOverwrittenForMultiEntryEvents((uint8_t)noOfSlots); + #endif + /* Copy the local buffer to the main buffer */ + (void)memcpy(& RecorderDataPtr->eventData[RecorderDataPtr->nextFreeIndex * 4], + tempDataBuffer, + noOfSlots * 4); + + /* Update the event type, i.e., number of data entries following the + main USER_EVENT entry (Note: important that this is after the memcpy, + but within the critical section!)*/ + RecorderDataPtr->eventData[RecorderDataPtr->nextFreeIndex * 4] = + (uint8_t) ( USER_EVENT + noOfSlots - 1 ); + + /* Update the main buffer event index (already checked that it fits in + the buffer, so no need to check for wrapping)*/ + + RecorderDataPtr->nextFreeIndex += noOfSlots; + RecorderDataPtr->numEvents += noOfSlots; + + if (RecorderDataPtr->nextFreeIndex >= TRC_CFG_EVENT_BUFFER_SIZE) + { + #if (TRC_CFG_SNAPSHOT_MODE == TRC_SNAPSHOT_MODE_RING_BUFFER) + /* We have reached the end, but this is a ring buffer. Start from the beginning again. */ + RecorderDataPtr->bufferIsFull = 1; + RecorderDataPtr->nextFreeIndex = 0; + #else + /* We have reached the end so we stop. */ + vTraceStop(); + #endif + } + } + + #if (TRC_CFG_SNAPSHOT_MODE == TRC_SNAPSHOT_MODE_RING_BUFFER) + /* Make sure the next entry is cleared correctly */ + prvCheckDataToBeOverwrittenForMultiEntryEvents(1); + #endif + + } + } + trcCRITICAL_SECTION_END(); + +#elif (TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER == 1) + /* Use the separate user event buffer */ + traceString formatLabel; + traceUBChannel channel; + + if (RecorderDataPtr->recorderActive && handle_of_last_logged_task) + { + formatLabel = xTraceRegisterString(formatStr); + + channel = xTraceRegisterUBChannel(eventLabel, formatLabel); + + prvTraceUBHelper1(channel, eventLabel, formatLabel, vl); + } +#endif +} +#endif + +/****************************************************************************** + * vTracePrint + * + * Basic user event + * + * Generates a User Event with a text label. The label is created/looked up + * in the symbol table using xTraceRegisterString. + ******************************************************************************/ +#if ((TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1)) +void vTracePrint(traceString chn, const char* str) +{ +#if (TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER == 0) + UserEvent* ue; + uint8_t dts1; + TRACE_ALLOC_CRITICAL_SECTION(); + + trcCRITICAL_SECTION_BEGIN(); + if (RecorderDataPtr->recorderActive && handle_of_last_logged_task) + { + dts1 = (uint8_t)prvTraceGetDTS(0xFF); + ue = (UserEvent*) prvTraceNextFreeEventBufferSlot(); + if (ue != NULL) + { + ue->dts = dts1; + ue->type = USER_EVENT; + ue->payload = prvTraceOpenSymbol(str, chn); + prvTraceUpdateCounters(); + } + } + trcCRITICAL_SECTION_END(); + +#elif (TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER == 1) + traceUBChannel channel; + uint32_t noOfSlots = 1; + uint32_t tempDataBuffer[(3 + MAX_ARG_SIZE) / 4]; + if (RecorderDataPtr->recorderActive && handle_of_last_logged_task) + { + traceString trcStr = prvTraceOpenSymbol(str, chn); + channel = xTraceRegisterUBChannel(chn, trcStr); + + if (channel == 0) + { + /* We are dealing with an unknown channel format pair */ + noOfSlots++; /* Also need room for channel and format */ + ((uint16_t*)tempDataBuffer)[2] = chn; + ((uint16_t*)tempDataBuffer)[3] = trcStr; + } + + prvTraceUBHelper2(channel, tempDataBuffer, noOfSlots); + } +#endif +} +#endif + +/******************************************************************************* + * xTraceRegisterString + * + * Register strings in the recorder, e.g. for names of user event channels. + * + * Example: + * myEventHandle = xTraceRegisterString("MyUserEvent"); + * ... + * vTracePrintF(myEventHandle, "My value is: %d", myValue); + ******************************************************************************/ +#if ((TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1)) +traceString xTraceRegisterString(const char* label) +{ + TRACE_ASSERT(label != NULL, "xTraceRegisterString: label == NULL", (traceString)0); + + return prvTraceOpenSymbol(label, 0); +} +#endif + + +#if ((!defined TRC_CFG_INCLUDE_READY_EVENTS) || (TRC_CFG_INCLUDE_READY_EVENTS == 1)) + +void prvTraceSetReadyEventsEnabled(int status) +{ + readyEventsEnabled = status; +} + +/******************************************************************************* + * prvTraceStoreTaskReady + * + * This function stores a ready state for the task handle sent in as parameter. + ******************************************************************************/ +void prvTraceStoreTaskReady(traceHandle handle) +{ + uint16_t dts3; + TREvent* tr; + uint8_t hnd8; + + TRACE_ALLOC_CRITICAL_SECTION(); + + if (handle == 0) + { + /* On FreeRTOS v7.3.0, this occurs when creating tasks due to a bad + placement of the trace macro. In that case, the events are ignored. */ + return; + } + + if (! readyEventsEnabled) + { + /* When creating tasks, ready events are also created. If creating + a "hidden" (not traced) task, we must therefore disable recording + of ready events to avoid an undesired ready event... */ + return; + } + + TRACE_ASSERT(handle <= TRC_CFG_NTASK, "prvTraceStoreTaskReady: Invalid value for handle", TRC_UNUSED); + + if (recorder_busy) + { + /************************************************************************* + * This occurs if an ISR calls a trace function, preempting a previous + * trace call that is being processed in a different ISR or task. + * If this occurs, there is probably a problem in the definition of the + * recorder's internal critical sections (TRACE_ENTER_CRITICAL_SECTION and + * TRACE_EXIT_CRITICAL_SECTION). They must disable the RTOS tick interrupt + * and any other ISRs that calls the trace recorder directly or via + * traced kernel functions. The ARM port disables all interrupts using the + * PRIMASK register to avoid this issue. + *************************************************************************/ + prvTraceError("Recorder busy - high priority ISR using syscall? (1)"); + return; + } + + trcCRITICAL_SECTION_BEGIN(); + if (RecorderDataPtr->recorderActive) /* Need to repeat this check! */ + { + dts3 = (uint16_t)prvTraceGetDTS(0xFFFF); + hnd8 = prvTraceGet8BitHandle(handle); + tr = (TREvent*)prvTraceNextFreeEventBufferSlot(); + if (tr != NULL) + { + tr->type = DIV_TASK_READY; + tr->dts = dts3; + tr->objHandle = hnd8; + prvTraceUpdateCounters(); + } + } + trcCRITICAL_SECTION_END(); +} +#endif + +/******************************************************************************* + * prvTraceStoreLowPower + * + * This function stores a low power state. + ******************************************************************************/ +void prvTraceStoreLowPower(uint32_t flag) +{ + uint16_t dts; + LPEvent* lp; + TRACE_ALLOC_CRITICAL_SECTION(); + + TRACE_ASSERT(flag <= 1, "prvTraceStoreLowPower: Invalid flag value", TRC_UNUSED); + + if (recorder_busy) + { + /************************************************************************* + * This occurs if an ISR calls a trace function, preempting a previous + * trace call that is being processed in a different ISR or task. + * If this occurs, there is probably a problem in the definition of the + * recorder's internal critical sections (TRACE_ENTER_CRITICAL_SECTION and + * TRACE_EXIT_CRITICAL_SECTION). They must disable the RTOS tick interrupt + * and any other ISRs that calls the trace recorder directly or via + * traced kernel functions. The ARM port disables all interrupts using the + * PRIMASK register to avoid this issue. + *************************************************************************/ + prvTraceError("Recorder busy - high priority ISR using syscall? (1)"); + return; + } + + trcCRITICAL_SECTION_BEGIN(); + if (RecorderDataPtr->recorderActive) + { + dts = (uint16_t)prvTraceGetDTS(0xFFFF); + lp = (LPEvent*)prvTraceNextFreeEventBufferSlot(); + if (lp != NULL) + { + lp->type = (uint8_t) (LOW_POWER_BEGIN + ( uint8_t ) flag); /* BEGIN or END depending on flag */ + lp->dts = dts; + prvTraceUpdateCounters(); + } + } + trcCRITICAL_SECTION_END(); +} + +/******************************************************************************* + * vTraceStoreMemMangEvent + * + * This function stores malloc and free events. Each call requires two records, + * for size and address respectively. The event code parameter (ecode) is applied + * to the first record (size) and the following address record gets event + * code "ecode + 1", so make sure this is respected in the event code table. + * Note: On "free" calls, the signed_size parameter should be negative. + ******************************************************************************/ +#if (TRC_CFG_INCLUDE_MEMMANG_EVENTS == 1) +#if (TRC_CFG_SCHEDULING_ONLY == 0) +void vTraceStoreMemMangEvent(uint32_t ecode, uint32_t address, int32_t signed_size) +{ + uint8_t dts1; + MemEventSize * ms; + MemEventAddr * ma; + uint16_t size_low; + uint16_t addr_low; + uint8_t addr_high; + uint32_t size; + TRACE_ALLOC_CRITICAL_SECTION(); + + if (RecorderDataPtr == NULL) + { + /* Occurs in vTraceInitTraceData, if using dynamic allocation. */ + return; + } + + if (signed_size < 0) + size = (uint32_t)(- signed_size); + else + size = (uint32_t)(signed_size); + + trcCRITICAL_SECTION_BEGIN(); + + heapMemUsage = heapMemUsage + (uint32_t)signed_size; + + if (RecorderDataPtr->recorderActive) + { + dts1 = (uint8_t)prvTraceGetDTS(0xFF); + size_low = (uint16_t)prvTraceGetParam(0xFFFF, size); + ms = (MemEventSize *)prvTraceNextFreeEventBufferSlot(); + + if (ms != NULL) + { + ms->dts = dts1; + ms->type = NULL_EVENT; /* Updated when all events are written */ + ms->size = size_low; + prvTraceUpdateCounters(); + + /* Storing a second record with address (signals "failed" if null) */ + #if (TRC_CFG_HEAP_SIZE_BELOW_16M) + /* If the heap address range is within 16 MB, i.e., the upper 8 bits + of addresses are constant, this optimization avoids storing an extra + event record by ignoring the upper 8 bit of the address */ + addr_low = address & 0xFFFF; + addr_high = (address >> 16) & 0xFF; + #else + /* The whole 32 bit address is stored using a second event record + for the upper 16 bit */ + addr_low = (uint16_t)prvTraceGetParam(0xFFFF, address); + addr_high = 0; + #endif + + ma = (MemEventAddr *) prvTraceNextFreeEventBufferSlot(); + if (ma != NULL) + { + ma->addr_low = addr_low; + ma->addr_high = addr_high; + ma->type = (uint8_t) (ecode + 1); /* Note this! */ + ms->type = (uint8_t) ecode; + prvTraceUpdateCounters(); + RecorderDataPtr->heapMemUsage = heapMemUsage; + } + } + } + trcCRITICAL_SECTION_END(); +} +#endif /* TRC_CFG_SCHEDULING_ONLY */ +#endif + +/******************************************************************************* + * prvTraceStoreKernelCall + * + * This is the main integration point for storing kernel calls, and + * is called by the hooks in trcKernelHooks.h (see trcKernelPort.h for event codes). + ******************************************************************************/ +#if (TRC_CFG_SCHEDULING_ONLY == 0) +void prvTraceStoreKernelCall(uint32_t ecode, traceObjectClass objectClass, uint32_t objectNumber) +{ + KernelCall * kse; + uint16_t dts1; + uint8_t hnd8; + TRACE_ALLOC_CRITICAL_SECTION(); + + TRACE_ASSERT(ecode < 0xFF, "prvTraceStoreKernelCall: ecode >= 0xFF", TRC_UNUSED); + TRACE_ASSERT(objectClass < TRACE_NCLASSES, "prvTraceStoreKernelCall: objectClass >= TRACE_NCLASSES", TRC_UNUSED); + TRACE_ASSERT(objectNumber <= RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[objectClass], "prvTraceStoreKernelCall: Invalid value for objectNumber", TRC_UNUSED); + + if (recorder_busy) + { + /************************************************************************* + * This occurs if an ISR calls a trace function, preempting a previous + * trace call that is being processed in a different ISR or task. + * If this occurs, there is probably a problem in the definition of the + * recorder's internal critical sections (TRACE_ENTER_CRITICAL_SECTION and + * TRACE_EXIT_CRITICAL_SECTION). They must disable the RTOS tick interrupt + * and any other ISRs that calls the trace recorder directly or via + * traced kernel functions. The ARM port disables all interrupts using the + * PRIMASK register to avoid this issue. + *************************************************************************/ + prvTraceError("Recorder busy - high priority ISR using syscall? (2)"); + return; + } + + if (handle_of_last_logged_task == 0) + { + return; + } + + trcCRITICAL_SECTION_BEGIN(); + if (RecorderDataPtr->recorderActive) + { + dts1 = (uint16_t)prvTraceGetDTS(0xFFFF); + hnd8 = prvTraceGet8BitHandle((traceHandle)objectNumber); + kse = (KernelCall*) prvTraceNextFreeEventBufferSlot(); + if (kse != NULL) + { + kse->dts = dts1; + kse->type = (uint8_t)ecode; + kse->objHandle = hnd8; + prvTraceUpdateCounters(); + } + } + trcCRITICAL_SECTION_END(); +} +#endif /* TRC_CFG_SCHEDULING_ONLY */ + +/******************************************************************************* + * prvTraceStoreKernelCallWithParam + * + * Used for storing kernel calls with a handle and a numeric parameter. If the + * numeric parameter does not fit in one byte, and extra XPS event is inserted + * before the kernel call event containing the three upper bytes. + ******************************************************************************/ +#if (TRC_CFG_SCHEDULING_ONLY == 0) +void prvTraceStoreKernelCallWithParam(uint32_t evtcode, + traceObjectClass objectClass, + uint32_t objectNumber, + uint32_t param) +{ + KernelCallWithParamAndHandle * kse; + uint8_t dts2; + uint8_t hnd8; + uint8_t p8; + TRACE_ALLOC_CRITICAL_SECTION(); + + TRACE_ASSERT(evtcode < 0xFF, "prvTraceStoreKernelCallWithParam: evtcode >= 0xFF", TRC_UNUSED); + TRACE_ASSERT(objectClass < TRACE_NCLASSES, "prvTraceStoreKernelCallWithParam: objectClass >= TRACE_NCLASSES", TRC_UNUSED); + TRACE_ASSERT(objectNumber <= RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[objectClass], "prvTraceStoreKernelCallWithParam: Invalid value for objectNumber", TRC_UNUSED); + + if (recorder_busy) + { + /************************************************************************* + * This occurs if an ISR calls a trace function, preempting a previous + * trace call that is being processed in a different ISR or task. + * If this occurs, there is probably a problem in the definition of the + * recorder's internal critical sections (TRACE_ENTER_CRITICAL_SECTION and + * TRACE_EXIT_CRITICAL_SECTION). They must disable the RTOS tick interrupt + * and any other ISRs that calls the trace recorder directly or via + * traced kernel functions. The ARM port disables all interrupts using the + * PRIMASK register to avoid this issue. + *************************************************************************/ + prvTraceError("Recorder busy - high priority ISR using syscall? (3)"); + return; + } + + trcCRITICAL_SECTION_BEGIN(); + if (RecorderDataPtr->recorderActive && handle_of_last_logged_task) + { + dts2 = (uint8_t)prvTraceGetDTS(0xFF); + p8 = (uint8_t) prvTraceGetParam(0xFF, param); + hnd8 = prvTraceGet8BitHandle((traceHandle)objectNumber); + kse = (KernelCallWithParamAndHandle*) prvTraceNextFreeEventBufferSlot(); + if (kse != NULL) + { + kse->dts = dts2; + kse->type = (uint8_t)evtcode; + kse->objHandle = hnd8; + kse->param = p8; + prvTraceUpdateCounters(); + } + } + trcCRITICAL_SECTION_END(); +} +#endif /* TRC_CFG_SCHEDULING_ONLY */ + + +/******************************************************************************* + * prvTraceGetParam + * + * Used for storing extra bytes for kernel calls with numeric parameters. + * + * May only be called within a critical section! + ******************************************************************************/ +#if (TRC_CFG_SCHEDULING_ONLY == 0) +static uint32_t prvTraceGetParam(uint32_t param_max, uint32_t param) +{ + XPSEvent* xps; + + TRACE_ASSERT(param_max == 0xFF || param_max == 0xFFFF, + "prvTraceGetParam: Invalid value for param_max", param); + + if (param <= param_max) + { + return param; + } + else + { + xps = (XPSEvent*) prvTraceNextFreeEventBufferSlot(); + if (xps != NULL) + { + xps->type = DIV_XPS; + xps->xps_8 = (uint8_t)((param & (0xFF00 & ~param_max)) >> 8); + xps->xps_16 = (uint16_t)((param & (0xFFFF0000 & ~param_max)) >> 16); + prvTraceUpdateCounters(); + } + + return param & param_max; + } +} +#endif + +/******************************************************************************* + * prvTraceStoreKernelCallWithNumericParamOnly + * + * Used for storing kernel calls with numeric parameters only. This is + * only used for traceTASK_DELAY and traceDELAY_UNTIL at the moment. + ******************************************************************************/ +#if (TRC_CFG_SCHEDULING_ONLY == 0) +void prvTraceStoreKernelCallWithNumericParamOnly(uint32_t evtcode, uint32_t param) +{ + KernelCallWithParam16 * kse; + uint8_t dts6; + uint16_t restParam; + TRACE_ALLOC_CRITICAL_SECTION(); + + restParam = 0; + + TRACE_ASSERT(evtcode < 0xFF, "prvTraceStoreKernelCallWithNumericParamOnly: Invalid value for evtcode", TRC_UNUSED); + + if (recorder_busy) + { + /************************************************************************* + * This occurs if an ISR calls a trace function, preempting a previous + * trace call that is being processed in a different ISR or task. + * If this occurs, there is probably a problem in the definition of the + * recorder's internal critical sections (TRACE_ENTER_CRITICAL_SECTION and + * TRACE_EXIT_CRITICAL_SECTION). They must disable the RTOS tick interrupt + * and any other ISRs that calls the trace recorder directly or via + * traced kernel functions. The ARM port disables all interrupts using the + * PRIMASK register to avoid this issue. + *************************************************************************/ + prvTraceError("Recorder busy - high priority ISR using syscall? (4)"); + return; + } + + trcCRITICAL_SECTION_BEGIN(); + if (RecorderDataPtr->recorderActive && handle_of_last_logged_task) + { + dts6 = (uint8_t)prvTraceGetDTS(0xFF); + restParam = (uint16_t)prvTraceGetParam(0xFFFF, param); + kse = (KernelCallWithParam16*) prvTraceNextFreeEventBufferSlot(); + if (kse != NULL) + { + kse->dts = dts6; + kse->type = (uint8_t)evtcode; + kse->param = restParam; + prvTraceUpdateCounters(); + } + } + trcCRITICAL_SECTION_END(); +} +#endif /* TRC_CFG_SCHEDULING_ONLY */ + +/******************************************************************************* + * prvTraceStoreTaskswitch + * Called by the scheduler from the SWITCHED_OUT hook, and by uiTraceStart. + * At this point interrupts are assumed to be disabled! + ******************************************************************************/ +void prvTraceStoreTaskswitch(traceHandle task_handle) +{ + uint16_t dts3; + TSEvent* ts; + uint8_t hnd8; +#if (TRC_CFG_INCLUDE_ISR_TRACING == 1) + extern int32_t isPendingContextSwitch; +#endif + trcSR_ALLOC_CRITICAL_SECTION_ON_CORTEX_M_ONLY(); + + TRACE_ASSERT(task_handle <= TRC_CFG_NTASK, + "prvTraceStoreTaskswitch: Invalid value for task_handle", TRC_UNUSED); + + trcCRITICAL_SECTION_BEGIN_ON_CORTEX_M_ONLY(); + + if ((task_handle != handle_of_last_logged_task) && (RecorderDataPtr->recorderActive)) + { +#if (TRC_CFG_INCLUDE_ISR_TRACING == 1) + isPendingContextSwitch = 0; +#endif + + dts3 = (uint16_t)prvTraceGetDTS(0xFFFF); + handle_of_last_logged_task = task_handle; + hnd8 = prvTraceGet8BitHandle(handle_of_last_logged_task); + ts = (TSEvent*)prvTraceNextFreeEventBufferSlot(); + + if (ts != NULL) + { + if (prvTraceGetObjectState(TRACE_CLASS_TASK, + handle_of_last_logged_task) == TASK_STATE_INSTANCE_ACTIVE) + { + ts->type = TS_TASK_RESUME; + } + else + { + ts->type = TS_TASK_BEGIN; + } + + ts->dts = dts3; + ts->objHandle = hnd8; + + prvTraceSetObjectState(TRACE_CLASS_TASK, + handle_of_last_logged_task, + TASK_STATE_INSTANCE_ACTIVE); + + prvTraceUpdateCounters(); + } + } + + trcCRITICAL_SECTION_END_ON_CORTEX_M_ONLY(); +} + +/******************************************************************************* + * prvTraceStoreObjectNameOnCloseEvent + * + * Updates the symbol table with the name of this object from the dynamic + * objects table and stores a "close" event, holding the mapping between handle + * and name (a symbol table handle). The stored name-handle mapping is thus the + * "old" one, valid up until this point. + ******************************************************************************/ +void prvTraceStoreObjectNameOnCloseEvent(uint8_t evtcode, traceHandle handle, + traceObjectClass objectclass) +{ + ObjCloseNameEvent * ce; + const char * name; + traceString idx; + + TRACE_ASSERT(objectclass < TRACE_NCLASSES, + "prvTraceStoreObjectNameOnCloseEvent: objectclass >= TRACE_NCLASSES", TRC_UNUSED); + TRACE_ASSERT(handle <= RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[objectclass], + "prvTraceStoreObjectNameOnCloseEvent: Invalid value for handle", TRC_UNUSED); + + if (RecorderDataPtr->recorderActive) + { + uint8_t hnd8 = prvTraceGet8BitHandle(handle); + name = TRACE_PROPERTY_NAME_GET(objectclass, handle); + idx = prvTraceOpenSymbol(name, 0); + + // Interrupt disable not necessary, already done in trcHooks.h macro + ce = (ObjCloseNameEvent*) prvTraceNextFreeEventBufferSlot(); + if (ce != NULL) + { + ce->type = (uint8_t) evtcode; + ce->objHandle = hnd8; + ce->symbolIndex = idx; + prvTraceUpdateCounters(); + } + } +} + +void prvTraceStoreObjectPropertiesOnCloseEvent(uint8_t evtcode, traceHandle handle, + traceObjectClass objectclass) +{ + ObjClosePropEvent * pe; + + TRACE_ASSERT(objectclass < TRACE_NCLASSES, + "prvTraceStoreObjectPropertiesOnCloseEvent: objectclass >= TRACE_NCLASSES", TRC_UNUSED); + TRACE_ASSERT(handle <= RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[objectclass], + "prvTraceStoreObjectPropertiesOnCloseEvent: Invalid value for handle", TRC_UNUSED); + + if (RecorderDataPtr->recorderActive) + { + // Interrupt disable not necessary, already done in trcHooks.h macro + pe = (ObjClosePropEvent*) prvTraceNextFreeEventBufferSlot(); + if (pe != NULL) + { + if (objectclass == TRACE_CLASS_TASK) + { + pe->arg1 = TRACE_PROPERTY_ACTOR_PRIORITY(objectclass, handle); + } + else + { + pe->arg1 = TRACE_PROPERTY_OBJECT_STATE(objectclass, handle); + } + pe->type = evtcode; + prvTraceUpdateCounters(); + } + } +} + +void prvTraceSetPriorityProperty(uint8_t objectclass, traceHandle id, uint8_t value) +{ + TRACE_ASSERT(objectclass < TRACE_NCLASSES, + "prvTraceSetPriorityProperty: objectclass >= TRACE_NCLASSES", TRC_UNUSED); + TRACE_ASSERT(id <= RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[objectclass], + "prvTraceSetPriorityProperty: Invalid value for id", TRC_UNUSED); + + TRACE_PROPERTY_ACTOR_PRIORITY(objectclass, id) = value; +} + +uint8_t prvTraceGetPriorityProperty(uint8_t objectclass, traceHandle id) +{ + TRACE_ASSERT(objectclass < TRACE_NCLASSES, + "prvTraceGetPriorityProperty: objectclass >= TRACE_NCLASSES", 0); + TRACE_ASSERT(id <= RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[objectclass], + "prvTraceGetPriorityProperty: Invalid value for id", 0); + + return TRACE_PROPERTY_ACTOR_PRIORITY(objectclass, id); +} + +void prvTraceSetObjectState(uint8_t objectclass, traceHandle id, uint8_t value) +{ + TRACE_ASSERT(objectclass < TRACE_NCLASSES, + "prvTraceSetObjectState: objectclass >= TRACE_NCLASSES", TRC_UNUSED); + TRACE_ASSERT(id <= RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[objectclass], + "prvTraceSetObjectState: Invalid value for id", TRC_UNUSED); + + TRACE_PROPERTY_OBJECT_STATE(objectclass, id) = value; +} + +uint8_t prvTraceGetObjectState(uint8_t objectclass, traceHandle id) +{ + TRACE_ASSERT(objectclass < TRACE_NCLASSES, + "prvTraceGetObjectState: objectclass >= TRACE_NCLASSES", 0); + TRACE_ASSERT(id <= RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[objectclass], + "prvTraceGetObjectState: Invalid value for id", 0); + + return TRACE_PROPERTY_OBJECT_STATE(objectclass, id); +} + +void prvTraceSetTaskInstanceFinished(traceHandle handle) +{ + TRACE_ASSERT(handle <= RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[TRACE_CLASS_TASK], + "prvTraceSetTaskInstanceFinished: Invalid value for handle", TRC_UNUSED); + +#if (TRC_CFG_USE_IMPLICIT_IFE_RULES == 1) + TRACE_PROPERTY_OBJECT_STATE(TRACE_CLASS_TASK, handle) = 0; +#endif +} + +/******************************************************************************* + * Static data initializations + ******************************************************************************/ + +/* A set of stacks that keeps track of available object handles for each class. +The stacks are empty initially, meaning that allocation of new handles will be +based on a counter (for each object class). Any delete operation will +return the handle to the corresponding stack, for reuse on the next allocate.*/ +objectHandleStackType objectHandleStacks = { { 0 }, { 0 }, { 0 }, { 0 }, { 0 } }; + +/* Initial TRC_HWTC_COUNT value, for detecting if the time-stamping source is +enabled. If using the OS periodic timer for time-stamping, this might not +have been configured on the earliest events during the startup. */ +uint32_t init_hwtc_count; + +/******************************************************************************* + * RecorderData + * + * The main data structure in snapshot mode, when using the default static memory + * allocation (TRC_RECORDER_BUFFER_ALLOCATION_STATIC). The recorder uses a pointer + * RecorderDataPtr to access the data, to also allow for dynamic or custom data + * allocation (see TRC_CFG_RECORDER_BUFFER_ALLOCATION). + ******************************************************************************/ +#if (TRC_CFG_RECORDER_BUFFER_ALLOCATION == TRC_RECORDER_BUFFER_ALLOCATION_STATIC) +RecorderDataType RecorderData; +#endif + +/******************************************************************************* + * RecorderDataPtr + * + * Pointer to the main data structure, when in snapshot mode. + ******************************************************************************/ +RecorderDataType* RecorderDataPtr = NULL; + +/* This version of the function dynamically allocates the trace data */ +void prvTraceInitTraceData() +{ + + if (RecorderDataPtr == NULL) + { +#if (TRC_CFG_RECORDER_BUFFER_ALLOCATION == TRC_RECORDER_BUFFER_ALLOCATION_STATIC) + RecorderDataPtr = &RecorderData; +#elif (TRC_CFG_RECORDER_BUFFER_ALLOCATION == TRC_RECORDER_BUFFER_ALLOCATION_DYNAMIC) + RecorderDataPtr = (RecorderDataType*)TRACE_MALLOC(sizeof(RecorderDataType)); + if (! RecorderDataPtr) + { + prvTraceError("Failed allocating recorder buffer!"); + return; + } +#elif (TRC_CFG_RECORDER_BUFFER_ALLOCATION == TRC_RECORDER_BUFFER_ALLOCATION_CUSTOM) + if (! RecorderDataPtr) + { + prvTraceError("Recorder data pointer not set! Use vTraceSetRecorderDataBuffer()."); + return; + } +#endif + } + else + { + if (RecorderDataPtr->startmarker0 == 1) + { + /* Already initialized */ + return; + } + } + + init_hwtc_count = TRC_HWTC_COUNT; + + (void)memset(RecorderDataPtr, 0, sizeof(RecorderDataType)); + + RecorderDataPtr->version = TRACE_KERNEL_VERSION; + RecorderDataPtr->minor_version = TRACE_MINOR_VERSION; + RecorderDataPtr->irq_priority_order = TRC_IRQ_PRIORITY_ORDER; + RecorderDataPtr->filesize = sizeof(RecorderDataType); + RecorderDataPtr->maxEvents = TRC_CFG_EVENT_BUFFER_SIZE; + RecorderDataPtr->debugMarker0 = (int32_t) 0xF0F0F0F0; + RecorderDataPtr->isUsing16bitHandles = TRC_CFG_USE_16BIT_OBJECT_HANDLES; + RecorderDataPtr->isrTailchainingThreshold = TRC_CFG_ISR_TAILCHAINING_THRESHOLD; + + /* This function is kernel specific */ + vTraceInitObjectPropertyTable(); + + RecorderDataPtr->debugMarker1 = (int32_t)0xF1F1F1F1; + RecorderDataPtr->SymbolTable.symTableSize = TRC_CFG_SYMBOL_TABLE_SIZE; + RecorderDataPtr->SymbolTable.nextFreeSymbolIndex = 1; +#if (TRC_CFG_INCLUDE_FLOAT_SUPPORT == 1) + RecorderDataPtr->exampleFloatEncoding = 1.0f; /* otherwise already zero */ +#endif + RecorderDataPtr->debugMarker2 = (int32_t)0xF2F2F2F2; +#if 0 + prvStrncpy(RecorderDataPtr->systemInfo, "Trace Recorder Demo", 80); +#else /* << EST */ + prvStrncpy(RecorderDataPtr->systemInfo, TRC_CFG_TRACE_DESCRIPTION, TRC_CFG_TRACE_DESCRIPTION_MAX_LENGTH); /* << EST */ +#endif + RecorderDataPtr->debugMarker3 = (int32_t)0xF3F3F3F3; + RecorderDataPtr->endmarker0 = 0x0A; + RecorderDataPtr->endmarker1 = 0x0B; + RecorderDataPtr->endmarker2 = 0x0C; + RecorderDataPtr->endmarker3 = 0x0D; + RecorderDataPtr->endmarker4 = 0x71; + RecorderDataPtr->endmarker5 = 0x72; + RecorderDataPtr->endmarker6 = 0x73; + RecorderDataPtr->endmarker7 = 0x74; + RecorderDataPtr->endmarker8 = 0xF1; + RecorderDataPtr->endmarker9 = 0xF2; + RecorderDataPtr->endmarker10 = 0xF3; + RecorderDataPtr->endmarker11 = 0xF4; + +#if TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER + RecorderDataPtr->userEventBuffer.bufferID = 1; + RecorderDataPtr->userEventBuffer.version = 0; + RecorderDataPtr->userEventBuffer.numberOfSlots = TRC_CFG_SEPARATE_USER_EVENT_BUFFER_SIZE; + RecorderDataPtr->userEventBuffer.numberOfChannels = TRC_CFG_UB_CHANNELS + 1; +#endif + + /* Kernel specific initialization of the objectHandleStacks variable */ + vTraceInitObjectHandleStack(); + + + /* Finally, the 12-byte "start markers" are initialized, allowing for + Tracealyzer to find the trace data in a larger RAM dump. + + The start and end markers must be unique, but without proper precautions there + might be a risk of accidental duplicates of the start/end markers, e.g., due to + compiler optimizations. + + The below initialization of the start marker is therefore made in reverse order + and the fields are volatile to ensure this assignment order. This to avoid any + chance of accidental duplicates of this elsewhere in memory. + + Moreover, the fields are set byte-by-byte to avoid endian issues.*/ + + RecorderDataPtr->startmarker11 = 0xF4; + RecorderDataPtr->startmarker10 = 0xF3; + RecorderDataPtr->startmarker9 = 0xF2; + RecorderDataPtr->startmarker8 = 0xF1; + RecorderDataPtr->startmarker7 = 0x74; + RecorderDataPtr->startmarker6 = 0x73; + RecorderDataPtr->startmarker5 = 0x72; + RecorderDataPtr->startmarker4 = 0x71; + RecorderDataPtr->startmarker3 = 0x04; + RecorderDataPtr->startmarker2 = 0x03; + RecorderDataPtr->startmarker1 = 0x02; + RecorderDataPtr->startmarker0 = 0x01; + + +#ifdef TRC_PORT_SPECIFIC_INIT + TRC_PORT_SPECIFIC_INIT(); +#endif +} + + +void* prvTraceNextFreeEventBufferSlot(void) +{ + if (! RecorderDataPtr->recorderActive) + { + /* If an XTS or XPS event prior to the main event has filled the buffer + before saving the main event, and store mode is "stop when full". */ + return NULL; + } + + if (RecorderDataPtr->nextFreeIndex >= TRC_CFG_EVENT_BUFFER_SIZE) + { + prvTraceError("Attempt to index outside event buffer!"); + return NULL; + } + return (void*)(&RecorderDataPtr->eventData[RecorderDataPtr->nextFreeIndex*4]); +} + +uint16_t uiIndexOfObject(traceHandle objecthandle, uint8_t objectclass) +{ + TRACE_ASSERT(objectclass < TRACE_NCLASSES, + "uiIndexOfObject: Invalid value for objectclass", 0); + TRACE_ASSERT(objecthandle > 0 && objecthandle <= RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[objectclass], + "uiIndexOfObject: Invalid value for objecthandle", 0); + + if ((objectclass < TRACE_NCLASSES) && (objecthandle > 0) && + (objecthandle <= RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[objectclass])) + { + return (uint16_t)(RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[objectclass] + + (RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[objectclass] * (objecthandle-1))); + } + + prvTraceError("Object table lookup with invalid object handle or object class!"); + return 0; +} + +traceHandle prvTraceGetObjectHandle(traceObjectClass objectclass) +{ + traceHandle handle; + static int indexOfHandle; + + TRACE_ALLOC_CRITICAL_SECTION(); + + TRACE_ASSERT(objectclass < TRACE_NCLASSES, + "prvTraceGetObjectHandle: Invalid value for objectclass", (traceHandle)0); + + trcCRITICAL_SECTION_BEGIN(); + indexOfHandle = objectHandleStacks.indexOfNextAvailableHandle[objectclass]; + if (objectHandleStacks.objectHandles[indexOfHandle] == 0) + { + /* Zero is used to indicate a never before used handle, i.e., + new slots in the handle stack. The handle slot needs to + be initialized here (starts at 1). */ + objectHandleStacks.objectHandles[indexOfHandle] = + (traceHandle)(1 + indexOfHandle - + objectHandleStacks.lowestIndexOfClass[objectclass]); + } + + handle = objectHandleStacks.objectHandles[indexOfHandle]; + + if (objectHandleStacks.indexOfNextAvailableHandle[objectclass] + > objectHandleStacks.highestIndexOfClass[objectclass]) + { + prvTraceError(pszTraceGetErrorNotEnoughHandles(objectclass)); + handle = 0; + } + else + { + int hndCount; + objectHandleStacks.indexOfNextAvailableHandle[objectclass]++; + + hndCount = objectHandleStacks.indexOfNextAvailableHandle[objectclass] - + objectHandleStacks.lowestIndexOfClass[objectclass]; + + if (hndCount > + objectHandleStacks.handleCountWaterMarksOfClass[objectclass]) + { + objectHandleStacks.handleCountWaterMarksOfClass[objectclass] = + (traceHandle)hndCount; + } + } + trcCRITICAL_SECTION_END(); + + return handle; +} + +void prvTraceFreeObjectHandle(traceObjectClass objectclass, traceHandle handle) +{ + int indexOfHandle; + + TRACE_ASSERT(objectclass < TRACE_NCLASSES, + "prvTraceFreeObjectHandle: Invalid value for objectclass", TRC_UNUSED); + TRACE_ASSERT(handle > 0 && handle <= RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[objectclass], + "prvTraceFreeObjectHandle: Invalid value for handle", TRC_UNUSED); + + /* Check that there is room to push the handle on the stack */ + if ((objectHandleStacks.indexOfNextAvailableHandle[objectclass] - 1) < + objectHandleStacks.lowestIndexOfClass[objectclass]) + { + /* Error */ + prvTraceError("Attempt to free more handles than allocated!"); + } + else + { + objectHandleStacks.indexOfNextAvailableHandle[objectclass]--; + indexOfHandle = objectHandleStacks.indexOfNextAvailableHandle[objectclass]; + objectHandleStacks.objectHandles[indexOfHandle] = handle; + } +} + +/******************************************************************************* + * prvMarkObjectAsUsed + * + * Sets an "is used flag" on object creation, using the first byte of the name + * field. This allows for counting the number of used Object Table slots, even + * if no names have been set. + ******************************************************************************/ +void prvMarkObjectAsUsed(traceObjectClass objectclass, traceHandle handle) +{ + uint16_t idx = uiIndexOfObject(handle, objectclass); + RecorderDataPtr->ObjectPropertyTable.objbytes[idx] = 1; +} + +/******************************************************************************* + * prvStrncpy + * + * Private string copy function, to improve portability between compilers. + ******************************************************************************/ +static void prvStrncpy(char* dst, const char* src, uint32_t maxLength) +{ + uint32_t i; + for (i = 0; i < maxLength; i++) + { + dst[i] = src[i]; + if (src[i] == 0) + break; + } +} + +/******************************************************************************* + * prvTraceSetObjectName + * + * Registers the names of queues, semaphores and other kernel objects in the + * recorder's Object Property Table, at the given handle and object class. + ******************************************************************************/ +void prvTraceSetObjectName(traceObjectClass objectclass, + traceHandle handle, + const char* name) +{ + static uint16_t idx; + + TRACE_ASSERT(name != NULL, "prvTraceSetObjectName: name == NULL", TRC_UNUSED); + + if (objectclass >= TRACE_NCLASSES) + { + prvTraceError("Illegal object class in prvTraceSetObjectName"); + return; + } + + if (handle == 0) + { + prvTraceError("Illegal handle (0) in prvTraceSetObjectName."); + return; + } + + if (handle > RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[objectclass]) + { + /* ERROR */ + prvTraceError(pszTraceGetErrorNotEnoughHandles(objectclass)); + } + else + { + idx = uiIndexOfObject(handle, objectclass); + + if (traceErrorMessage == NULL) + { + prvStrncpy((char*)&(RecorderDataPtr->ObjectPropertyTable.objbytes[idx]), + name, + RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[ objectclass ]); + } + } +} + +traceString prvTraceOpenSymbol(const char* name, traceString userEventChannel) +{ + uint16_t result; + uint8_t len; + uint8_t crc; + TRACE_ALLOC_CRITICAL_SECTION(); + + len = 0; + crc = 0; + + TRACE_ASSERT(name != NULL, "prvTraceOpenSymbol: name == NULL", (traceString)0); + + prvTraceGetChecksum(name, &crc, &len); + + trcCRITICAL_SECTION_BEGIN(); + result = prvTraceLookupSymbolTableEntry(name, crc, len, userEventChannel); + if (!result) + { + result = prvTraceCreateSymbolTableEntry(name, crc, len, userEventChannel); + } + trcCRITICAL_SECTION_END(); + + return result; +} + + +/****************************************************************************** +* vTraceSetFrequency +* +* Registers the clock rate of the time source for the event timestamping. +* This is normally not required, but if the default value (TRC_HWTC_FREQ_HZ) +* should be incorrect for your setup, you can override it using this function. +* +* Must be called prior to vTraceEnable, and the time source is assumed to +* have a fixed clock frequency after the startup. +* +* Note that, in snapshot mode, the value is divided by the TRC_HWTC_DIVISOR. +* This is a software "prescaler" that is also applied on the timestamps. +*****************************************************************************/ +void vTraceSetFrequency(uint32_t frequency) +{ + timestampFrequency = frequency; +} + +/******************************************************************************* + * Supporting functions + ******************************************************************************/ + +/******************************************************************************* + * prvTraceError + * + * Called by various parts in the recorder. Stops the recorder and stores a + * pointer to an error message, which is printed by the monitor task. + * If you are not using the monitor task, you may use xTraceGetLastError() + * from your application to check if the recorder is OK. + * + * Note: If a recorder error is registered before vTraceStart is called, the + * trace start will be aborted. This can occur if any of the Nxxxx constants + * (e.g., TRC_CFG_NTASK) in trcConfig.h is too small. + ******************************************************************************/ +void prvTraceError(const char* msg) +{ + /* Stop the recorder */ + if (RecorderDataPtr != NULL) + { + vTraceStop(); + } + + /* If first error only... */ + if (traceErrorMessage == NULL) + { + traceErrorMessage = (char*)(intptr_t) msg; + if (RecorderDataPtr != NULL) + { + prvStrncpy(RecorderDataPtr->systemInfo, traceErrorMessage, 80); + RecorderDataPtr->internalErrorOccured = 1; + } + } +} + +void vTraceSetFilterMask(uint16_t filterMask) +{ + CurrentFilterMask = filterMask; +} + +void vTraceSetFilterGroup(uint16_t filterGroup) +{ + CurrentFilterGroup = filterGroup; +} + +/****************************************************************************** + * prvCheckDataToBeOverwrittenForMultiEntryEvents + * + * This checks if the next event to be overwritten is a multi-entry user event, + * i.e., a USER_EVENT followed by data entries. + * Such data entries do not have an event code at byte 0, as other events. + * All 4 bytes are user data, so the first byte of such data events must + * not be interpreted as type field. The number of data entries following + * a USER_EVENT is given in the event code of the USER_EVENT. + * Therefore, when overwriting a USER_EVENT (when using in ring-buffer mode) + * any data entries following must be replaced with NULL events (code 0). + * + * This is assumed to execute within a critical section... + *****************************************************************************/ + +#if (TRC_CFG_SNAPSHOT_MODE == TRC_SNAPSHOT_MODE_RING_BUFFER) +void prvCheckDataToBeOverwrittenForMultiEntryEvents(uint8_t nofEntriesToCheck) +{ + /* Generic "int" type is desired - should be 16 bit variable on 16 bit HW */ + unsigned int i = 0; + unsigned int e = 0; + + TRACE_ASSERT(nofEntriesToCheck != 0, + "prvCheckDataToBeOverwrittenForMultiEntryEvents: nofEntriesToCheck == 0", TRC_UNUSED); + + while (i < nofEntriesToCheck) + { + e = RecorderDataPtr->nextFreeIndex + i; + if ((RecorderDataPtr->eventData[e*4] > USER_EVENT) && + (RecorderDataPtr->eventData[e*4] < USER_EVENT + 16)) + { + uint8_t nDataEvents = (uint8_t)(RecorderDataPtr->eventData[e*4] - USER_EVENT); + if ((e + nDataEvents) < RecorderDataPtr->maxEvents) + { + (void)memset(& RecorderDataPtr->eventData[e*4], 0, (size_t) (4 + 4 * nDataEvents)); + } + } + else if (RecorderDataPtr->eventData[e*4] == DIV_XPS) + { + if ((e + 1) < RecorderDataPtr->maxEvents) + { + /* Clear 8 bytes */ + (void)memset(& RecorderDataPtr->eventData[e*4], 0, 4 + 4); + } + else + { + /* Clear 8 bytes, 4 first and 4 last */ + (void)memset(& RecorderDataPtr->eventData[0], 0, 4); + (void)memset(& RecorderDataPtr->eventData[e*4], 0, 4); + } + } + i++; + } +} +#endif + +/******************************************************************************* + * prvTraceUpdateCounters + * + * Updates the index of the event buffer. + ******************************************************************************/ +void prvTraceUpdateCounters(void) +{ + if (RecorderDataPtr->recorderActive == 0) + { + return; + } + + RecorderDataPtr->numEvents++; + + RecorderDataPtr->nextFreeIndex++; + + if (RecorderDataPtr->nextFreeIndex >= TRC_CFG_EVENT_BUFFER_SIZE) + { +#if (TRC_CFG_SNAPSHOT_MODE == TRC_SNAPSHOT_MODE_RING_BUFFER) + RecorderDataPtr->bufferIsFull = 1; + RecorderDataPtr->nextFreeIndex = 0; + { + void McuPercepio_OnTraceWrap(void); /* prototype */ + + McuPercepio_OnTraceWrap(); + } +#else + vTraceStop(); +#endif + } + +#if (TRC_CFG_SNAPSHOT_MODE == TRC_SNAPSHOT_MODE_RING_BUFFER) + prvCheckDataToBeOverwrittenForMultiEntryEvents(1); +#endif +} + +/****************************************************************************** + * prvTraceGetDTS + * + * Returns a differential timestamp (DTS), i.e., the time since + * last event, and creates an XTS event if the DTS does not fit in the + * number of bits given. The XTS event holds the MSB bytes of the DTS. + * + * The parameter param_maxDTS should be 0xFF for 8-bit dts or 0xFFFF for + * events with 16-bit dts fields. + *****************************************************************************/ +uint16_t prvTraceGetDTS(uint16_t param_maxDTS) +{ + static uint32_t old_timestamp = 0; + XTSEvent* xts = 0; + uint32_t dts = 0; + uint32_t timestamp = 0; + + TRACE_ASSERT(param_maxDTS == 0xFF || param_maxDTS == 0xFFFF, "prvTraceGetDTS: Invalid value for param_maxDTS", 0); + + + if (RecorderDataPtr->frequency == 0) + { + if (timestampFrequency != 0) + { + /* If to override default TRC_HWTC_FREQ_HZ value with value set by vTraceSetFrequency */ + RecorderDataPtr->frequency = timestampFrequency / TRC_HWTC_DIVISOR; + } + else if (init_hwtc_count != TRC_HWTC_COUNT) + { + /* If using default value and timer has been started. + Note: If the default frequency value set here would be incorrect, e.g., + if the timer has actually not been configured yet, override this + with vTraceSetFrequency. + */ + RecorderDataPtr->frequency = TRC_HWTC_FREQ_HZ / TRC_HWTC_DIVISOR; + } + /* If no override (vTraceSetFrequency) and timer inactive -> no action */ + } + + /************************************************************************** + * The below statements read the timestamp from the timer port module. + * If necessary, whole seconds are extracted using division while the rest + * comes from the modulo operation. + **************************************************************************/ + + prvTracePortGetTimeStamp(×tamp); + + /*************************************************************************** + * Since dts is unsigned the result will be correct even if timestamp has + * wrapped around. + ***************************************************************************/ + dts = timestamp - old_timestamp; + old_timestamp = timestamp; + + if (RecorderDataPtr->frequency > 0) + { + /* Check if dts > 1 second */ + if (dts > RecorderDataPtr->frequency) + { + /* More than 1 second has passed */ + RecorderDataPtr->absTimeLastEventSecond += dts / RecorderDataPtr->frequency; + /* The part that is not an entire second is added to absTimeLastEvent */ + RecorderDataPtr->absTimeLastEvent += dts % RecorderDataPtr->frequency; + } + else + { + RecorderDataPtr->absTimeLastEvent += dts; + } + + /* Check if absTimeLastEvent >= 1 second */ + if (RecorderDataPtr->absTimeLastEvent >= RecorderDataPtr->frequency) + { + /* RecorderDataPtr->absTimeLastEvent is more than or equal to 1 second, but always less than 2 seconds */ + RecorderDataPtr->absTimeLastEventSecond++; + RecorderDataPtr->absTimeLastEvent -= RecorderDataPtr->frequency; + /* RecorderDataPtr->absTimeLastEvent is now less than 1 second */ + } + } + else + { + /* Special case if the recorder has not yet started (frequency may be uninitialized, i.e., zero) */ + RecorderDataPtr->absTimeLastEvent = timestamp; + } + + /* If the dts (time since last event) does not fit in event->dts (only 8 or 16 bits) */ + if (dts > param_maxDTS) + { + /* Create an XTS event (eXtended TimeStamp) containing the higher dts bits*/ + xts = (XTSEvent*) prvTraceNextFreeEventBufferSlot(); + + if (xts != NULL) + { + if (param_maxDTS == 0xFFFF) + { + xts->type = XTS16; + xts->xts_16 = (uint16_t)((dts / 0x10000) & 0xFFFF); + xts->xts_8 = 0; + } + else if (param_maxDTS == 0xFF) + { + xts->type = XTS8; + xts->xts_16 = (uint16_t)((dts / 0x100) & 0xFFFF); + xts->xts_8 = (uint8_t)((dts / 0x1000000) & 0xFF); + } + else + { + prvTraceError("Bad param_maxDTS in prvTraceGetDTS"); + } + prvTraceUpdateCounters(); + } + } + + return (uint16_t)dts & param_maxDTS; +} + +/******************************************************************************* + * prvTraceLookupSymbolTableEntry + * + * Find an entry in the symbol table, return 0 if not present. + * + * The strings are stored in a byte pool, with four bytes of "meta-data" for + * every string. + * byte 0-1: index of next entry with same checksum (for fast lookup). + * byte 2-3: reference to a symbol table entry, a label for vTracePrintF + * format strings only (the handle of the destination channel). + * byte 4..(4 + length): the string (object name or user event label), with + * zero-termination + ******************************************************************************/ +traceString prvTraceLookupSymbolTableEntry(const char* name, + uint8_t crc6, + uint8_t len, + traceString chn) +{ + uint16_t i = RecorderDataPtr->SymbolTable.latestEntryOfChecksum[ crc6 ]; + + TRACE_ASSERT(name != NULL, "prvTraceLookupSymbolTableEntry: name == NULL", (traceString)0); + TRACE_ASSERT(len != 0, "prvTraceLookupSymbolTableEntry: len == 0", (traceString)0); + + while (i != 0) + { + if (RecorderDataPtr->SymbolTable.symbytes[i + 2] == (chn & 0x00FF)) + { + if (RecorderDataPtr->SymbolTable.symbytes[i + 3] == (chn / 0x100)) + { + if (RecorderDataPtr->SymbolTable.symbytes[i + 4 + len] == '\0') + { + if (strncmp((char*)(& RecorderDataPtr->SymbolTable.symbytes[i + 4]), name, len) == 0) + { + break; /* found */ + } + } + } + } + i = (uint16_t)(RecorderDataPtr->SymbolTable.symbytes[i] + (RecorderDataPtr->SymbolTable.symbytes[i + 1] * 0x100)); + } + return i; +} + +/******************************************************************************* + * prvTraceCreateSymbolTableEntry + * + * Creates an entry in the symbol table, independent if it exists already. + * + * The strings are stored in a byte pool, with four bytes of "meta-data" for + * every string. + * byte 0-1: index of next entry with same checksum (for fast lookup). + * byte 2-3: reference to a symbol table entry, a label for vTracePrintF + * format strings only (the handle of the destination channel). + * byte 4..(4 + length): the string (object name or user event label), with + * zero-termination + ******************************************************************************/ +uint16_t prvTraceCreateSymbolTableEntry(const char* name, + uint8_t crc6, + uint8_t len, + traceString channel) +{ + uint16_t ret = 0; + + TRACE_ASSERT(name != NULL, "prvTraceCreateSymbolTableEntry: name == NULL", 0); + TRACE_ASSERT(len != 0, "prvTraceCreateSymbolTableEntry: len == 0", 0); + + if (RecorderDataPtr->SymbolTable.nextFreeSymbolIndex + len + 4 >= TRC_CFG_SYMBOL_TABLE_SIZE) + { + prvTraceError("Symbol table full. Increase TRC_CFG_SYMBOL_TABLE_SIZE in trcConfig.h"); + ret = 0; + } + else + { + + RecorderDataPtr->SymbolTable.symbytes + [ RecorderDataPtr->SymbolTable.nextFreeSymbolIndex] = + (uint8_t)(RecorderDataPtr->SymbolTable.latestEntryOfChecksum[ crc6 ] & 0x00FF); + + RecorderDataPtr->SymbolTable.symbytes + [ RecorderDataPtr->SymbolTable.nextFreeSymbolIndex + 1] = + (uint8_t)(RecorderDataPtr->SymbolTable.latestEntryOfChecksum[ crc6 ] / 0x100); + + RecorderDataPtr->SymbolTable.symbytes + [ RecorderDataPtr->SymbolTable.nextFreeSymbolIndex + 2] = + (uint8_t)(channel & 0x00FF); + + RecorderDataPtr->SymbolTable.symbytes + [ RecorderDataPtr->SymbolTable.nextFreeSymbolIndex + 3] = + (uint8_t)(channel / 0x100); + + /* set name (bytes 4...4+len-1) */ + prvStrncpy((char*)&(RecorderDataPtr->SymbolTable.symbytes + [ RecorderDataPtr->SymbolTable.nextFreeSymbolIndex + 4]), name, len); + + /* Set zero termination (at offset 4+len) */ + RecorderDataPtr->SymbolTable.symbytes + [RecorderDataPtr->SymbolTable.nextFreeSymbolIndex + 4 + len] = '\0'; + + /* store index of entry (for return value, and as head of LL[crc6]) */ + RecorderDataPtr->SymbolTable.latestEntryOfChecksum + [ crc6 ] = (uint16_t)RecorderDataPtr->SymbolTable.nextFreeSymbolIndex; + + RecorderDataPtr->SymbolTable.nextFreeSymbolIndex += (uint32_t) (len + 5); + + ret = (uint16_t)(RecorderDataPtr->SymbolTable.nextFreeSymbolIndex - (uint8_t)(len + 5)); + } + + return ret; +} + + +/******************************************************************************* + * prvTraceGetChecksum + * + * Calculates a simple 6-bit checksum from a string, used to index the string + * for fast symbol table lookup. + ******************************************************************************/ +void prvTraceGetChecksum(const char *pname, uint8_t* pcrc, uint8_t* plength) +{ + unsigned char c; + int length = 1; /* Should be 1 to account for '\0' */ + int crc = 0; + + TRACE_ASSERT(pname != NULL, "prvTraceGetChecksum: pname == NULL", TRC_UNUSED); + TRACE_ASSERT(pcrc != NULL, "prvTraceGetChecksum: pcrc == NULL", TRC_UNUSED); + TRACE_ASSERT(plength != NULL, "prvTraceGetChecksum: plength == NULL", TRC_UNUSED); + + if (pname != (const char *) 0) + { + for (; (c = (unsigned char) *pname++) != '\0';) + { + crc += c; + length++; + } + } + *pcrc = (uint8_t)(crc & 0x3F); + *plength = (uint8_t)length; +} + +#if (TRC_CFG_USE_16BIT_OBJECT_HANDLES == 1) + +static void prvTraceStoreXID(traceHandle handle); + +/****************************************************************************** + * prvTraceStoreXID + * + * Stores an XID (eXtended IDentifier) event. + * This is used if an object/task handle is larger than 255. + * The parameter "handle" is the full (16 bit) handle, assumed to be 256 or + * larger. Handles below 256 should not use this function. + * + * NOTE: this function MUST be called from within a critical section. + *****************************************************************************/ +static void prvTraceStoreXID(traceHandle handle) +{ + XPSEvent* xid; + + TRACE_ASSERT(handle >= 256, "prvTraceStoreXID: Handle < 256", TRC_UNUSED); + + xid = (XPSEvent*)prvTraceNextFreeEventBufferSlot(); + + if (xid != NULL) + { + xid->type = XID; + + /* This function is (only) used when traceHandle is 16 bit... */ + xid->xps_16 = handle; + + prvTraceUpdateCounters(); + } +} + +static uint8_t prvTraceGet8BitHandle(traceHandle handle) +{ + if (handle > 255) + { + prvTraceStoreXID(handle); + /* The full handle (16 bit) is stored in the XID event. + This code (255) is used instead of zero (which is an error code).*/ + return 255; + } + return (uint8_t)(handle & 0xFF); +} +#endif /*(TRC_CFG_USE_16BIT_OBJECT_HANDLES == 1)*/ + + +/* If using DWT timestamping (default on ARM Cortex-M3, M4 and M7), make sure the DWT unit is initialized. */ +#ifndef TRC_CFG_ARM_CM_USE_SYSTICK +#if ((TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_ARM_Cortex_M) && (defined (__CORTEX_M) && (__CORTEX_M >= 0x03))) +void prvTraceInitCortexM() +{ + /* Ensure that the DWT registers are unlocked and can be modified. */ + TRC_REG_ITM_LOCKACCESS = TRC_ITM_LOCKACCESS_UNLOCK; + + /* Make sure DWT is enabled, if supported */ + TRC_REG_DEMCR |= TRC_DEMCR_TRCENA; + + do{ + /* Verify that DWT is supported */ + if (TRC_REG_DEMCR == 0) + { + /* This function is called on Cortex-M3, M4 and M7 devices to initialize + the DWT unit, assumed present. The DWT cycle counter is used for timestamping. + + If the below error is produced, the DWT unit does not seem to be available. + + In that case, define the macro TRC_CFG_ARM_CM_USE_SYSTICK in your build + to use SysTick timestamping instead, or define your own timestamping by + setting TRC_CFG_HARDWARE_PORT to TRC_HARDWARE_PORT_APPLICATION_DEFINED + and make the necessary definitions, as explained in trcHardwarePort.h.*/ + + prvTraceError("DWT unit not available, see code comment."); + break; + } + + /* Verify that DWT_CYCCNT is supported */ + if (TRC_REG_DWT_CTRL & TRC_DWT_CTRL_NOCYCCNT) + { + /* This function is called on Cortex-M3, M4 and M7 devices to initialize + the DWT unit, assumed present. The DWT cycle counter is used for timestamping. + + If the below error is produced, the cycle counter does not seem to be available. + + In that case, define the macro TRC_CFG_ARM_CM_USE_SYSTICK in your build + to use SysTick timestamping instead, or define your own timestamping by + setting TRC_CFG_HARDWARE_PORT to TRC_HARDWARE_PORT_APPLICATION_DEFINED + and make the necessary definitions, as explained in trcHardwarePort.h.*/ + + prvTraceError("DWT_CYCCNT not available, see code comment."); + break; + } + + /* Reset the cycle counter */ + TRC_REG_DWT_CYCCNT = 0; + + /* Enable the cycle counter */ + TRC_REG_DWT_CTRL |= TRC_DWT_CTRL_CYCCNTENA; + + }while(0); /* breaks above jump here */ +} +#endif +#endif + +/****************************************************************************** + * prvTracePortGetTimeStamp + * + * Returns the current time based on the HWTC macros which provide a hardware + * isolation layer towards the hardware timer/counter. + * + * The HWTC macros and prvTracePortGetTimeStamp is the main porting issue + * or the trace recorder library. Typically you should not need to change + * the code of prvTracePortGetTimeStamp if using the HWTC macros. + * + ******************************************************************************/ +void prvTracePortGetTimeStamp(uint32_t *pTimestamp) +{ + static uint32_t last_hwtc_count = 0; + uint32_t hwtc_count = 0; + +#if TRC_HWTC_TYPE == TRC_OS_TIMER_INCR || TRC_HWTC_TYPE == TRC_OS_TIMER_DECR + /* systick based timer */ + static uint32_t last_traceTickCount = 0; + uint32_t traceTickCount = 0; +#else /*TRC_HWTC_TYPE == TRC_OS_TIMER_INCR || TRC_HWTC_TYPE == TRC_OS_TIMER_DECR*/ + /* Free running timer */ + static uint32_t last_hwtc_rest = 0; + uint32_t diff = 0; + uint32_t diff_scaled = 0; +#endif /*TRC_HWTC_TYPE == TRC_OS_TIMER_INCR || TRC_HWTC_TYPE == TRC_OS_TIMER_DECR*/ + + if (trace_disable_timestamp == 1) + { + if (pTimestamp) + *pTimestamp = last_timestamp; + return; + } + + /* Retrieve TRC_HWTC_COUNT only once since the same value should be used all throughout this function. */ +#if (TRC_HWTC_TYPE == TRC_OS_TIMER_INCR || TRC_HWTC_TYPE == TRC_FREE_RUNNING_32BIT_INCR) + /* Get the increasing tick count */ + hwtc_count = TRC_HWTC_COUNT; +#elif (TRC_HWTC_TYPE == TRC_OS_TIMER_DECR || TRC_HWTC_TYPE == TRC_FREE_RUNNING_32BIT_DECR) + /* Convert decreasing tick count into increasing tick count */ + hwtc_count = TRC_HWTC_PERIOD - TRC_HWTC_COUNT; +#else + #error "TRC_HWTC_TYPE has unexpected value" +#endif + +#if (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_Win32) + /* The Win32 port uses ulGetRunTimeCounterValue for timestamping, which in turn + uses QueryPerformanceCounter. That function is not always reliable when used over + multiple threads. We must therefore handle rare cases where the timestamp is less + than the previous. In practice, this should "never" roll over since the + performance counter is 64 bit wide. */ + + if (last_hwtc_count > hwtc_count) + { + hwtc_count = last_hwtc_count; + } +#endif + +#if (TRC_HWTC_TYPE == TRC_OS_TIMER_INCR || TRC_HWTC_TYPE == TRC_OS_TIMER_DECR) + /* Timestamping is based on a timer that wraps at TRC_HWTC_PERIOD */ + if (last_traceTickCount - uiTraceTickCount - 1 < 0x80000000) + { + /* This means last_traceTickCount is higher than uiTraceTickCount, + so we have previously compensated for a missed tick. + Therefore we use the last stored value because that is more accurate. */ + traceTickCount = last_traceTickCount; + } + else + { + /* Business as usual */ + traceTickCount = uiTraceTickCount; + } + + /* Check for overflow. May occur if the update of uiTraceTickCount has been + delayed due to disabled interrupts. */ + if (traceTickCount == last_traceTickCount && hwtc_count < last_hwtc_count) + { + /* A trace tick has occurred but not been executed by the kernel, so we compensate manually. */ + traceTickCount++; + } + + /* Check if the return address is OK, then we perform the calculation. */ + if (pTimestamp) + { + /* Get timestamp from trace ticks. Scale down the period to avoid unwanted overflows. */ + last_timestamp = traceTickCount * (TRC_HWTC_PERIOD / TRC_HWTC_DIVISOR); + /* Increase timestamp by (hwtc_count + "lost hardware ticks from scaling down period") / TRC_HWTC_DIVISOR. */ + last_timestamp += (hwtc_count + traceTickCount * (TRC_HWTC_PERIOD % TRC_HWTC_DIVISOR)) / TRC_HWTC_DIVISOR; + } + /* Store the previous value */ + last_traceTickCount = traceTickCount; + +#else /*(TRC_HWTC_TYPE == TRC_OS_TIMER_INCR || TRC_HWTC_TYPE == TRC_OS_TIMER_DECR)*/ + + /* Timestamping is based on a free running timer */ + /* This part handles free running clocks that can be scaled down to avoid too large DTS values. + Without this, the scaled timestamp will incorrectly wrap at (2^32 / TRC_HWTC_DIVISOR) ticks. + The scaled timestamp returned from this function is supposed to go from 0 -> 2^32, which in real time would represent (0 -> 2^32 * TRC_HWTC_DIVISOR) ticks. */ + + /* First we see how long time has passed since the last timestamp call, and we also add the ticks that was lost when we scaled down the last time. */ + diff = (hwtc_count - last_hwtc_count) + last_hwtc_rest; + + /* Scale down the diff */ + diff_scaled = diff / TRC_HWTC_DIVISOR; + + /* Find out how many ticks were lost when scaling down, so we can add them the next time */ + last_hwtc_rest = diff % TRC_HWTC_DIVISOR; + + /* We increase the scaled timestamp by the scaled amount */ + last_timestamp += diff_scaled; +#endif /*(TRC_HWTC_TYPE == TRC_OS_TIMER_INCR || TRC_HWTC_TYPE == TRC_OS_TIMER_DECR)*/ + + /* Is anyone interested in the results? */ + if (pTimestamp) + *pTimestamp = last_timestamp; + + /* Store the previous value */ + last_hwtc_count = hwtc_count; +} + +#endif /*(TRC_USE_TRACEALYZER_RECORDER == 1)*/ + +#endif /*(TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_SNAPSHOT)*/ + diff --git a/TSM_PicoW_Sensor/McuLib/TraceRecorder/trcStreamingPort.c b/TSM_PicoW_Sensor/McuLib/TraceRecorder/trcStreamingPort.c new file mode 100644 index 0000000..024831f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/TraceRecorder/trcStreamingPort.c @@ -0,0 +1,46 @@ + +#include "trcRecorder.h" + +#if (TRC_USE_TRACEALYZER_RECORDER == 1) +#if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) + +int32_t readFromRTT(void* ptrData, uint32_t size, int32_t* ptrBytesRead) +{ + uint32_t bytesRead = 0; + + if (SEGGER_RTT_HASDATA(TRC_CFG_RTT_DOWN_BUFFER_INDEX)) + { + bytesRead = SEGGER_RTT_Read(TRC_CFG_RTT_DOWN_BUFFER_INDEX, (char*)ptrData, size); + + if (ptrBytesRead != NULL) + *ptrBytesRead = (int32_t)bytesRead; + + if (bytesRead != size) + { + return -1; + } + + } + + return 0; +} + +int32_t writeToRTT(void* ptrData, uint32_t size, int32_t* ptrBytesWritten) +{ + uint32_t bytesWritten = SEGGER_RTT_Write(TRC_CFG_RTT_UP_BUFFER_INDEX, (const char*)ptrData, size); + + if (ptrBytesWritten != NULL) + *ptrBytesWritten = (int32_t)bytesWritten; + + if (bytesWritten != size) + { + return -1; + } + + return 0; +} + +#endif +#endif + + diff --git a/TSM_PicoW_Sensor/McuLib/TraceRecorder/trcStreamingRecorder.c b/TSM_PicoW_Sensor/McuLib/TraceRecorder/trcStreamingRecorder.c new file mode 100644 index 0000000..56abc3a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/TraceRecorder/trcStreamingRecorder.c @@ -0,0 +1,2043 @@ +/******************************************************************************* + * Trace Recorder Library for Tracealyzer v4.4.1 + * Percepio AB, www.percepio.com + * + * trcStreamingRecorder.c + * + * The generic core of the trace recorder's streaming mode. + * + * Terms of Use + * This file is part of the trace recorder library (RECORDER), which is the + * intellectual property of Percepio AB (PERCEPIO) and provided under a + * license as follows. + * The RECORDER may be used free of charge for the purpose of recording data + * intended for analysis in PERCEPIO products. It may not be used or modified + * for other purposes without explicit permission from PERCEPIO. + * You may distribute the RECORDER in its original source code form, assuming + * this text (terms of use, disclaimer, copyright notice) is unchanged. You are + * allowed to distribute the RECORDER with minor modifications intended for + * configuration or porting of the RECORDER, e.g., to allow using it on a + * specific processor, processor family or with a specific communication + * interface. Any such modifications should be documented directly below + * this comment block. + * + * Disclaimer + * The RECORDER is being delivered to you AS IS and PERCEPIO makes no warranty + * as to its use or performance. PERCEPIO does not and cannot warrant the + * performance or results you may obtain by using the RECORDER or documentation. + * PERCEPIO make no warranties, express or implied, as to noninfringement of + * third party rights, merchantability, or fitness for any particular purpose. + * In no event will PERCEPIO, its technology partners, or distributors be liable + * to you for any consequential, incidental or special damages, including any + * lost profits or lost savings, even if a representative of PERCEPIO has been + * advised of the possibility of such damages, or for any claim by any third + * party. Some jurisdictions do not allow the exclusion or limitation of + * incidental, consequential or special damages, or the exclusion of implied + * warranties or limitations on how long an implied warranty may last, so the + * above limitations may not apply to you. + * + * Tabs are used for indent in this file (1 tab = 4 spaces) + * + * Copyright Percepio AB, 2018. + * www.percepio.com + ******************************************************************************/ + +#include "trcRecorder.h" + +#if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) + +#if (TRC_USE_TRACEALYZER_RECORDER == 1) + +#include +#include +#include + +#include "trcExtensions.h" + +uint32_t trcHeapCounter = 0; + +typedef struct{ + uint16_t EventID; + uint16_t EventCount; + uint32_t TS; +} BaseEvent; + +typedef struct{ + BaseEvent base; + uint32_t param1; +} EventWithParam_1; + +typedef struct{ + BaseEvent base; + uint32_t param1; + uint32_t param2; +} EventWithParam_2; + +typedef struct{ + BaseEvent base; + uint32_t param1; + uint32_t param2; + uint32_t param3; +} EventWithParam_3; + +typedef struct{ + BaseEvent base; + uint32_t param1; + uint32_t param2; + uint32_t param3; + uint32_t param4; +} EventWithParam_4; + +typedef struct{ + BaseEvent base; + uint32_t param1; + uint32_t param2; + uint32_t param3; + uint32_t param4; + uint32_t param5; +} EventWithParam_5; + +/* Used in event functions with variable number of parameters. */ +typedef struct +{ + BaseEvent base; + uint32_t data[15]; /* maximum payload size */ +} largestEventType; + +typedef struct{ + uint32_t psf; + uint16_t version; + uint16_t platform; + uint32_t options; + uint32_t heapCounter; + uint16_t symbolSize; + uint16_t symbolCount; + uint16_t objectDataSize; + uint16_t objectDataCount; +} PSFHeaderInfo; + + +/* The size of each slot in the Symbol Table */ +#define SYMBOL_TABLE_SLOT_SIZE (sizeof(uint32_t) + (((TRC_CFG_SYMBOL_MAX_LENGTH)+(sizeof(uint32_t)-1))/sizeof(uint32_t))*sizeof(uint32_t)) + +#define OBJECT_DATA_SLOT_SIZE (sizeof(uint32_t) + sizeof(uint32_t)) + +/* The total size of the Symbol Table */ +#define SYMBOL_TABLE_BUFFER_SIZE ((TRC_CFG_SYMBOL_TABLE_SLOTS) * SYMBOL_TABLE_SLOT_SIZE) + +/* The total size of the Object Data Table */ +#define OBJECT_DATA_TABLE_BUFFER_SIZE ((TRC_CFG_OBJECT_DATA_SLOTS) * OBJECT_DATA_SLOT_SIZE) + +#if (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_COUNT > 128) +#error "TRC_CFG_PAGED_EVENT_BUFFER_PAGE_COUNT cannot be larger than 128" +#endif /* (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_COUNT > 128) */ + +/* The Symbol Table type - just a byte array */ +typedef struct{ + union + { + uint32_t pSymbolTableBufferUINT32[SYMBOL_TABLE_BUFFER_SIZE / sizeof(uint32_t)]; + uint8_t pSymbolTableBufferUINT8[SYMBOL_TABLE_BUFFER_SIZE]; + } SymbolTableBuffer; +} SymbolTable; + +/* The Object Data Table type - just a byte array */ +typedef struct{ + union + { + uint32_t pObjectDataTableBufferUINT32[OBJECT_DATA_TABLE_BUFFER_SIZE / sizeof(uint32_t)]; + uint8_t pObjectDataTableBufferUINT8[OBJECT_DATA_TABLE_BUFFER_SIZE]; + } ObjectDataTableBuffer; +} ObjectDataTable; + +typedef struct{ + uint16_t Status; /* 16 bit to avoid implicit padding (warnings) */ + uint16_t BytesRemaining; + char* WritePointer; +} PageType; + +/* Code used for "task address" when no task has started, to indicate "(startup)". + * This value was used since NULL/0 was already reserved for the idle task. */ +#define HANDLE_NO_TASK 2 + +/* The status codes for the pages of the internal trace buffer. */ +#define PAGE_STATUS_FREE 0 +#define PAGE_STATUS_WRITE 1 +#define PAGE_STATUS_READ 2 + +/* Calls prvTraceError if the _assert condition is false. For void functions, +where no return value is to be provided. */ +#define PSF_ASSERT_VOID(_assert, _err) if (! (_assert)){ prvTraceError(_err); return; } + +/* Calls prvTraceError if the _assert condition is false. For non-void functions, +where a return value is to be provided. */ +#define PSF_ASSERT_RET(_assert, _err, _return) if (! (_assert)){ prvTraceError(_err); return _return; } + +/* Part of the PSF format - encodes the number of 32-bit params in an event */ +#define PARAM_COUNT(n) ((n & 0xF) << 12) + +/* We skip the slot for PSF_ERROR_NONE so error code 1 is the first bit */ +#define GET_ERROR_WARNING_FLAG(errCode) (ErrorAndWarningFlags & (1 << ((errCode) - 1))) +#define SET_ERROR_WARNING_FLAG(errCode) (ErrorAndWarningFlags |= (1 << ((errCode) - 1))) + +/* Used for flags indicating if a certain error or warning has occurred */ +static uint32_t ErrorAndWarningFlags = 0; + +/* The Symbol Table instance - keeps names of tasks and other named objects. */ +static SymbolTable symbolTable = { { { 0 } } }; + +/* This points to the first unused entry in the symbol table. */ +static uint32_t firstFreeSymbolTableIndex = 0; + +/* The Object Data Table instance - keeps initial priorities of tasks. */ +static ObjectDataTable objectDataTable = { { { 0 } } }; + +/* This points to the first unused entry in the object data table. */ +static uint32_t firstFreeObjectDataTableIndex = 0; + +/* Keeps track of ISR nesting */ +static uint32_t ISR_stack[TRC_CFG_MAX_ISR_NESTING]; + +/* Keeps track of ISR nesting */ +static int8_t ISR_stack_index = -1; + +/* Any error that occurred in the recorder (also creates User Event) */ +static int errorCode = PSF_ERROR_NONE; + +/* Counts the number of trace sessions (not yet used) */ +static uint32_t SessionCounter = 0u; + +/* Master switch for recording (0 => Disabled, 1 => Enabled) */ +uint32_t RecorderEnabled = 0u; + +/* Used to determine endian of data (big/little) */ +static uint32_t PSFEndianessIdentifier = 0x50534600; + +/* Used to interpret the data format */ +static uint16_t FormatVersion = 0x0006; + +/* The number of events stored. Used as event sequence number. */ +static uint32_t eventCounter = 0; + +/* Remembers if an earlier ISR in a sequence of adjacent ISRs has triggered a task switch. +In that case, vTraceStoreISREnd does not store a return to the previously executing task. */ +int32_t isPendingContextSwitch = 0; + +uint32_t uiTraceTickCount = 0; +uint32_t timestampFrequency = 0; +uint32_t DroppedEventCounter = 0; +uint32_t TotalBytesRemaining_LowWaterMark = (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_COUNT) * (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_SIZE); +uint32_t TotalBytesRemaining = (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_COUNT) * (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_SIZE); + +PageType PageInfo[TRC_CFG_PAGED_EVENT_BUFFER_PAGE_COUNT]; + +char* EventBuffer = NULL; + +PSFExtensionInfoType PSFExtensionInfo = TRC_EXTENSION_INFO; + +/******************************************************************************* + * NoRoomForSymbol + * + * Incremented on prvTraceSaveSymbol if no room for saving the symbol name. This + * is used for storing the names of: + * - Tasks + * - Named ISRs (xTraceSetISRProperties) + * - Named kernel objects (vTraceStoreKernelObjectName) + * - User event channels (xTraceRegisterString) + * + * This variable should be zero. If not, it shows the number of missing slots so + * far. In that case, increment SYMBOL_TABLE_SLOTS with (at least) this value. + ******************************************************************************/ +volatile uint32_t NoRoomForSymbol = 0; + +/******************************************************************************* + * NoRoomForObjectData + * + * Incremented on prvTraceSaveObjectData if no room for saving the object data, + * i.e., the base priorities of tasks. There must be one slot for each task. + * If not, this variable will show the difference. + * + * This variable should be zero. If not, it shows the number of missing slots so + * far. In that case, increment OBJECT_DATA_SLOTS with (at least) this value. + ******************************************************************************/ +volatile uint32_t NoRoomForObjectData = 0; + +/******************************************************************************* + * LongestSymbolName + * + * Updated in prvTraceSaveSymbol. Should not exceed TRC_CFG_SYMBOL_MAX_LENGTH, + * otherwise symbol names will be truncated. In that case, set + * TRC_CFG_SYMBOL_MAX_LENGTH to (at least) this value. + ******************************************************************************/ +volatile uint32_t LongestSymbolName = 0; + +/******************************************************************************* + * MaxBytesTruncated + * + * Set in prvTraceStoreStringEvent if the total data payload exceeds 60 bytes, + * including data arguments and the string. For user events, that is 52 bytes + * for string and data arguments. In that is exceeded, the event is truncated + * (usually only the string, unless more than 15 parameters) and this variable + * holds the maximum number of truncated bytes, from any event. + ******************************************************************************/ +volatile uint32_t MaxBytesTruncated = 0; + +uint16_t CurrentFilterMask = 0xFFFF; + +uint16_t CurrentFilterGroup = FilterGroup0; + +volatile uint32_t uiTraceSystemState = TRC_STATE_IN_STARTUP; + +/* Internal common function for storing string events */ +static void prvTraceStoreStringEventHelper( int nArgs, + uint16_t eventID, + traceString userEvtChannel, + int len, + const char* str, + va_list vl); + +/* Not static to avoid warnings from SysGCC/PPC */ +void prvTraceStoreSimpleStringEventHelper(uint16_t eventID, + traceString userEvtChannel, + const char* str); + +/* Stores the header information on Start */ +static void prvTraceStoreHeader(void); + +/* Stores the Start Event */ +static void prvTraceStoreStartEvent(void); + +/* Stores the symbol table on Start */ +static void prvTraceStoreSymbolTable(void); + +/* Stores the object table on Start */ +static void prvTraceStoreObjectDataTable(void); + +/* Store the Timestamp Config on Start */ +static void prvTraceStoreTSConfig(void); + +/* Store information about trace library extensions. */ +static void prvTraceStoreExtensionInfo(void); + +/* Internal function for starting/stopping the recorder. */ +static void prvSetRecorderEnabled(uint32_t isEnabled); + +/* Mark the page read as complete. */ +static void prvPageReadComplete(int pageIndex); + +/* Retrieve a buffer page to write to. */ +static int prvAllocateBufferPage(int prevPage); + +/* Get the current buffer page index (return value) and the number +of valid bytes in the buffer page (bytesUsed). */ +static int prvGetBufferPage(int32_t* bytesUsed); + +/* Performs timestamping using definitions in trcHardwarePort.h */ +static uint32_t prvGetTimestamp32(void); + +/* Returns the string associated with the error code */ +static const char* prvTraceGetError(int errCode); + +/* Signal an error. */ +void prvTraceError(int errCode); + +/* Signal a warning (does not stop the recorder). */ +void prvTraceWarning(int errCode); + +/****************************************************************************** + * vTraceInstanceFinishedNow + * + * Creates an event that ends the current task instance at this very instant. + * This makes the viewer to splits the current fragment at this point and begin + * a new actor instance, even if no task-switch has occurred. + *****************************************************************************/ +void vTraceInstanceFinishedNow(void) +{ + prvTraceStoreEvent0(PSF_EVENT_IFE_DIRECT); +} + +/****************************************************************************** + * vTraceInstanceFinishedNext + * + * Marks the current "task instance" as finished on the next kernel call. + * + * If that kernel call is blocking, the instance ends after the blocking event + * and the corresponding return event is then the start of the next instance. + * If the kernel call is not blocking, the viewer instead splits the current + * fragment right before the kernel call, which makes this call the first event + * of the next instance. + *****************************************************************************/ +void vTraceInstanceFinishedNext(void) +{ + prvTraceStoreEvent0(PSF_EVENT_IFE_NEXT); +} + +/******************************************************************************* + * vTraceStoreKernelObjectName + * + * Parameter object: pointer to the Event Group that shall be named + * Parameter name: the name to set (const string literal) + * + * Sets a name for a kernel object for display in Tracealyzer. + ******************************************************************************/ +void vTraceStoreKernelObjectName(void* object, const char* name) +{ + uint16_t eventID = PSF_EVENT_OBJ_NAME; + + PSF_ASSERT_VOID(eventID < 4096, PSF_ERROR_EVENT_CODE_TOO_LARGE); + + /* Always save in symbol table, in case the recording has not yet started */ + prvTraceSaveObjectSymbol(object, name); + + prvTraceStoreStringEvent(1, eventID, name, object); +} + + +/****************************************************************************** +* vTraceSetFrequency +* +* Registers the clock rate of the time source for the event timestamping. +* This is normally not required, but if the default value (TRC_HWTC_FREQ_HZ) +* should be incorrect for your setup, you can override it using this function. +* +* Must be called prior to vTraceEnable, and the time source is assumed to +* have a fixed clock frequency after the startup. +*****************************************************************************/ +void vTraceSetFrequency(uint32_t frequency) +{ + timestampFrequency = frequency; +} + +#if (TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1) + +/******************************************************************************* +* xTraceRegisterString +* +* Stores a name for a user event channel, returns the handle. +******************************************************************************/ +traceString xTraceRegisterString(const char* name) +{ + traceString str; + uint16_t eventID = PSF_EVENT_OBJ_NAME; + + str = prvTraceSaveSymbol(name); + + PSF_ASSERT_RET(eventID < 4096, PSF_ERROR_EVENT_CODE_TOO_LARGE, str); + + /* Always save in symbol table, if the recording has not yet started */ + prvTraceStoreStringEvent(1, eventID, (const char*)name, str); + + return str; +} + +/****************************************************************************** + * vTracePrint + * + * Generates "User Events", with unformatted text. + * + * User Events can be used for very efficient application logging, and are shown + * as yellow labels in the main trace view. + * + * You may group User Events into User Event Channels. The yellow User Event + * labels shows the logged string, preceded by the channel name within + * brackets. For example: + * + * "[MyChannel] Hello World!" + * + * The User Event Channels are shown in the View Filter, which makes it easy to + * select what User Events you wish to display. User Event Channels are created + * using xTraceRegisterString(). + * + * Example: + * + * traceString chn = xTraceRegisterString("MyChannel"); + * ... + * vTracePrint(chn, "Hello World!"); + * + ******************************************************************************/ +void vTracePrint(traceString chn, const char* str) +{ + uint16_t eventID = PSF_EVENT_USER_EVENT; + PSF_ASSERT_VOID(eventID < 4096, PSF_ERROR_EVENT_CODE_TOO_LARGE); + + prvTraceStoreSimpleStringEventHelper(eventID, chn, str); +} + +/******************************************************************************* +* vTraceConsoleChannelPrintF +* +* Wrapper for vTracePrint, using the default channel. Can be used as a drop-in +* replacement for printf and similar functions, e.g. in a debug logging macro. +* +* Example: +* +* // Old: #define LogString debug_console_printf +* +* // New, log to Tracealyzer instead: +* #define LogString vTraceConsoleChannelPrintF +* ... +* LogString("My value is: %d", myValue); +******************************************************************************/ +void vTraceConsoleChannelPrintF(const char* fmt, ...) +{ + va_list vl; + char tempBuf[60]; + static traceString consoleChannel = NULL; + + if (consoleChannel == NULL) + consoleChannel = xTraceRegisterString("Debug Console"); + + va_start(vl, fmt); + vsnprintf(tempBuf, 60, fmt, vl); + vTracePrint(consoleChannel, tempBuf); + va_end(vl); +} + +/****************************************************************************** + * vTracePrintF + * + * Generates "User Events", with formatted text and data, similar to a "printf". + * It is very fast since the actual formatting is done on the host side when the + * trace is displayed. + * + * User Events can be used for very efficient application logging, and are shown + * as yellow labels in the main trace view. + * An advantage of User Events is that data can be plotted in the "User Event + * Signal Plot" view, visualizing any data you log as User Events, discrete + * states or control system signals (e.g. system inputs or outputs). + * + * You may group User Events into User Event Channels. The yellow User Event + * labels show the logged string, preceded by the channel name within brackets. + * + * Example: + * + * "[MyChannel] Hello World!" + * + * The User Event Channels are shown in the View Filter, which makes it easy to + * select what User Events you wish to display. User Event Channels are created + * using xTraceRegisterString(). + * + * Example: + * + * traceString adc_uechannel = xTraceRegisterString("ADC User Events"); + * ... + * vTracePrintF(adc_uechannel, + * "ADC channel %d: %d volts", + * ch, adc_reading); + * + * All data arguments are assumed to be 32 bit wide. The following formats are + * supported: + * %d - signed integer. The following width and padding format is supported: "%05d" -> "-0042" and "%5d" -> " -42" + * %u - unsigned integer. The following width and padding format is supported: "%05u" -> "00042" and "%5u" -> " 42" + * %X - hexadecimal (uppercase). The following width and padding format is supported: "%04X" -> "002A" and "%4X" -> " 2A" + * %x - hexadecimal (lowercase). The following width and padding format is supported: "%04x" -> "002a" and "%4x" -> " 2a" + * %s - string (currently, this must be an earlier stored symbol name) + * + * Up to 15 data arguments are allowed, with a total size of maximum 60 byte + * including 8 byte for the base event fields and the format string. So with + * one data argument, the maximum string length is 48 chars. If this is exceeded + * the string is truncated (4 bytes at a time). + * + ******************************************************************************/ +void vTracePrintF(traceString chn, const char* fmt, ...) +{ + va_list vl; + + va_start(vl, fmt); + vTraceVPrintF(chn, fmt, vl); + va_end(vl); +} + +/****************************************************************************** + * vTraceVPrintF + * + * vTracePrintF variant that accepts a va_list. + * See vTracePrintF documentation for further details. + * + ******************************************************************************/ +void vTraceVPrintF(traceString chn, const char* fmt, va_list vl) +{ + int i = 0; + int nArgs = 0; + int eventID = PSF_EVENT_USER_EVENT; + + /* Count the number of arguments in the format string (e.g., %d) */ + for (i = 0; (fmt[i] != 0) && (i < 52); i++) + { + if (fmt[i] == '%') + { + if (fmt[i + 1] == 0) + { + /* Found end of string, let for loop detect it */ + continue; + } + + if (fmt[i + 1] != '%') + { + nArgs++; /* Found an argument */ + } + + i++; /* Move past format specifier or non-argument '%' */ + } + } + + if (chn != NULL) + { + /* Make room for the channel */ + nArgs++; + } + eventID += nArgs; + + PSF_ASSERT_VOID(eventID < 4096, PSF_ERROR_EVENT_CODE_TOO_LARGE); + + prvTraceStoreStringEventHelper(nArgs, (uint16_t)eventID, chn, i, fmt, vl); +} +#endif /* (TRC_CFG_SCHEDULING_ONLY == 0) && (TRC_CFG_INCLUDE_USER_EVENTS == 1) */ + +/******************************************************************************* + * xTraceSetISRProperties + * + * Stores a name and priority level for an Interrupt Service Routine, to allow + * for better visualization. Returns a traceHandle used by vTraceStoreISRBegin. + * + * Example: + * #define PRIO_ISR_TIMER1 3 // the hardware priority of the interrupt + * ... + * traceHandle Timer1Handle = xTraceSetISRProperties("ISRTimer1", PRIO_ISR_TIMER1); + * ... + * void ISR_handler() + * { + * vTraceStoreISRBegin(Timer1Handle); + * ... + * vTraceStoreISREnd(0); + * } + * + ******************************************************************************/ +traceHandle xTraceSetISRProperties(const char* name, uint8_t priority) +{ + traceHandle isrHandle; + uint16_t eventID = PSF_EVENT_DEFINE_ISR; + + /* Always save in symbol table, in case the recording has not yet started */ + isrHandle = prvTraceSaveSymbol(name); + + /* Save object data in object data table */ + prvTraceSaveObjectData((void*)isrHandle, priority); + + PSF_ASSERT_RET(eventID < 4096, PSF_ERROR_EVENT_CODE_TOO_LARGE, isrHandle); + + prvTraceStoreStringEvent(2, eventID, name, isrHandle, priority); + + return isrHandle; +} + +/******************************************************************************* + * vTraceStoreISRBegin + * + * Registers the beginning of an Interrupt Service Routine, using a traceHandle + * provided by xTraceSetISRProperties. + * + * Example: + * #define PRIO_ISR_TIMER1 3 // the hardware priority of the interrupt + * ... + * traceHandle Timer1Handle = xTraceSetISRProperties("ISRTimer1", PRIO_ISR_TIMER1); + * ... + * void ISR_handler() + * { + * vTraceStoreISRBegin(Timer1Handle); + * ... + * vTraceStoreISREnd(0); + * } + * + ******************************************************************************/ +void vTraceStoreISRBegin(traceHandle handle) +{ + TRACE_ALLOC_CRITICAL_SECTION(); + + TRACE_ENTER_CRITICAL_SECTION(); + + /* We are at the start of a possible ISR chain. + No context switches should have been triggered now. */ + if (ISR_stack_index == -1) + isPendingContextSwitch = 0; + + if (ISR_stack_index < (TRC_CFG_MAX_ISR_NESTING) - 1) + { + ISR_stack_index++; + ISR_stack[ISR_stack_index] = (uint32_t)handle; +#if (TRC_CFG_INCLUDE_ISR_TRACING == 1) + prvTraceStoreEvent1(PSF_EVENT_ISR_BEGIN, (uint32_t)handle); +#endif + TRACE_EXIT_CRITICAL_SECTION(); + } + else + { + TRACE_EXIT_CRITICAL_SECTION(); + prvTraceError(PSF_ERROR_ISR_NESTING_OVERFLOW); + } +} + +/******************************************************************************* + * vTraceStoreISREnd + * + * Registers the end of an Interrupt Service Routine. + * + * The parameter pendingISR indicates if the interrupt has requested a + * task-switch (= 1), e.g., by signaling a semaphore. Otherwise (= 0) the + * interrupt is assumed to return to the previous context. + * + * Example: + * #define PRIO_OF_ISR_TIMER1 3 // the hardware priority of the interrupt + * traceHandle traceHandleIsrTimer1 = 0; // The ID set by the recorder + * ... + * traceHandleIsrTimer1 = xTraceSetISRProperties("ISRTimer1", PRIO_OF_ISR_TIMER1); + * ... + * void ISR_handler() + * { + * vTraceStoreISRBegin(traceHandleIsrTimer1); + * ... + * vTraceStoreISREnd(0); + * } + * + ******************************************************************************/ +void vTraceStoreISREnd(int isTaskSwitchRequired) +{ + TRACE_ALLOC_CRITICAL_SECTION(); + + TRACE_ENTER_CRITICAL_SECTION(); + + (void)ISR_stack; + + /* Is there a pending task-switch? (perhaps from an earlier ISR) */ + isPendingContextSwitch |= isTaskSwitchRequired; + + if (ISR_stack_index > 0) + { + ISR_stack_index--; + +#if (TRC_CFG_INCLUDE_ISR_TRACING == 1) + /* Store return to interrupted ISR (if nested ISRs)*/ + prvTraceStoreEvent1(PSF_EVENT_ISR_RESUME, (uint32_t)ISR_stack[ISR_stack_index]); +#endif + } + else + { + ISR_stack_index--; + + /* Store return to interrupted task, if no context switch will occur in between. */ + if ((isPendingContextSwitch == 0) || (prvTraceIsSchedulerSuspended())) + { +#if (TRC_CFG_INCLUDE_ISR_TRACING == 1) +#if 1 /* << EST: avoid gcc warning "cast from function call of type 'void *' to non-matching type 'long unsigned int' [-Wbad-function-cast]" */ + void *t; + t = TRACE_GET_CURRENT_TASK(); + + prvTraceStoreEvent1(PSF_EVENT_TS_RESUME, (uint32_t)t); +#else + prvTraceStoreEvent1(PSF_EVENT_TS_RESUME, (uint32_t)TRACE_GET_CURRENT_TASK()); +#endif +#endif + } + } + + TRACE_EXIT_CRITICAL_SECTION(); +} + +/******************************************************************************* + * xTraceGetLastError + * + * Returns the last error or warning, as a string, or NULL if none. + *****************************************************************************/ +const char* xTraceGetLastError(void) +{ + return prvTraceGetError(errorCode); +} + +/******************************************************************************* + * vTraceClearError + * + * Clears any errors. + *****************************************************************************/ +void vTraceClearError(void) +{ + NoRoomForSymbol = 0; + LongestSymbolName = 0; + NoRoomForObjectData = 0; + MaxBytesTruncated = 0; + errorCode = PSF_ERROR_NONE; +} + +/******************************************************************************* + * vTraceStop + * + * Stops the tracing. + *****************************************************************************/ +void vTraceStop(void) +{ + prvSetRecorderEnabled(0); +} + +/******************************************************************************* + * vTraceSetRecorderDataBuffer + * + * If custom allocation is used, this function must be called so the recorder + * library knows where to save the trace data. + ******************************************************************************/ +#if (TRC_CFG_RECORDER_BUFFER_ALLOCATION == TRC_RECORDER_BUFFER_ALLOCATION_CUSTOM) + +extern char* _TzTraceData; + +void vTraceSetRecorderDataBuffer(void* pRecorderData) +{ + _TzTraceData = pRecorderData; +} +#endif + + +/******************************************************************************* +* xTraceIsRecordingEnabled +* Returns true (1) if the recorder is enabled (i.e. is recording), otherwise 0. +******************************************************************************/ +int xTraceIsRecordingEnabled(void) +{ + return (int)RecorderEnabled; +} + +void vTraceSetFilterMask(uint16_t filterMask) +{ + CurrentFilterMask = filterMask; +} + +void vTraceSetFilterGroup(uint16_t filterGroup) +{ + CurrentFilterGroup = filterGroup; +} + + +/******************************************************************************/ +/*** INTERNAL FUNCTIONS *******************************************************/ +/******************************************************************************/ + +/* Internal function for starting/stopping the recorder. */ +static void prvSetRecorderEnabled(uint32_t isEnabled) +{ + TRACE_ALLOC_CRITICAL_SECTION(); + + if (RecorderEnabled == isEnabled) + { + return; + } + + TRACE_ENTER_CRITICAL_SECTION(); + + if (isEnabled) + { + TRC_STREAM_PORT_ON_TRACE_BEGIN(); + + #if (TRC_STREAM_PORT_USE_INTERNAL_BUFFER == 1) + prvPagedEventBufferInit(_TzTraceData); + #endif + + eventCounter = 0; + ISR_stack_index = -1; + prvTraceStoreHeader(); + prvTraceStoreSymbolTable(); + prvTraceStoreObjectDataTable(); + prvTraceStoreExtensionInfo(); + prvTraceStoreStartEvent(); + prvTraceStoreTSConfig(); + } + else + { + TRC_STREAM_PORT_ON_TRACE_END(); + } + + RecorderEnabled = isEnabled; + + TRACE_EXIT_CRITICAL_SECTION(); +} + +static void prvTraceStoreStartEvent() +{ + void* currentTask; + + TRACE_ALLOC_CRITICAL_SECTION(); + + TRACE_ENTER_CRITICAL_SECTION(); + + if (uiTraceSystemState == TRC_STATE_IN_STARTUP) + { + currentTask = (void*)HANDLE_NO_TASK; + } + else + { + currentTask = TRACE_GET_CURRENT_TASK(); + } + + eventCounter++; + + { + TRC_STREAM_PORT_ALLOCATE_EVENT_BLOCKING(EventWithParam_3, pxEvent, sizeof(EventWithParam_3)); + if (pxEvent != NULL) + { + pxEvent->base.EventID = PSF_EVENT_TRACE_START | PARAM_COUNT(3); + pxEvent->base.EventCount = (uint16_t)eventCounter; + pxEvent->base.TS = prvGetTimestamp32(); + pxEvent->param1 = (uint32_t)TRACE_GET_OS_TICKS(); + pxEvent->param2 = (uint32_t)currentTask; + pxEvent->param3 = SessionCounter++; + TRC_STREAM_PORT_COMMIT_EVENT_BLOCKING(pxEvent, sizeof(EventWithParam_3)); + } + } + + TRACE_EXIT_CRITICAL_SECTION(); +} + +/* Store the Timestamp Config event */ +static void prvTraceStoreTSConfig(void) +{ + /* If not overridden using vTraceSetFrequency, use default value */ + if (timestampFrequency == 0) + { + timestampFrequency = TRC_HWTC_FREQ_HZ; + } + + eventCounter++; + + + { +#if (TRC_HWTC_TYPE == TRC_CUSTOM_TIMER_INCR || TRC_HWTC_TYPE == TRC_CUSTOM_TIMER_DECR) + + TRC_STREAM_PORT_ALLOCATE_EVENT_BLOCKING(EventWithParam_5, event, sizeof(EventWithParam_5)); + if (event != NULL) + { + event->base.EventID = PSF_EVENT_TS_CONFIG | (uint16_t)PARAM_COUNT(5); + event->base.EventCount = (uint16_t)eventCounter; + event->base.TS = prvGetTimestamp32(); + + event->param1 = (uint32_t)timestampFrequency; + event->param2 = (uint32_t)(TRACE_TICK_RATE_HZ); + event->param3 = (uint32_t)(TRC_HWTC_TYPE); + event->param4 = (uint32_t)(TRC_CFG_ISR_TAILCHAINING_THRESHOLD); + event->param5 = (uint32_t)(TRC_HWTC_PERIOD); + TRC_STREAM_PORT_COMMIT_EVENT_BLOCKING(event, (uint32_t)sizeof(EventWithParam_5)); + } +#else + TRC_STREAM_PORT_ALLOCATE_EVENT_BLOCKING(EventWithParam_4, event, sizeof(EventWithParam_4)); + if (event != NULL) + { + event->base.EventID = PSF_EVENT_TS_CONFIG | (uint16_t)PARAM_COUNT(4); + event->base.EventCount = (uint16_t)eventCounter; + event->base.TS = prvGetTimestamp32(); + + event->param1 = (uint32_t)timestampFrequency; + event->param2 = (uint32_t)(TRACE_TICK_RATE_HZ); + event->param3 = (uint32_t)(TRC_HWTC_TYPE); + event->param4 = (uint32_t)(TRC_CFG_ISR_TAILCHAINING_THRESHOLD); + TRC_STREAM_PORT_COMMIT_EVENT_BLOCKING(event, (uint32_t)sizeof(EventWithParam_4)); + } +#endif + + } +} + +/* Stores the symbol table on Start */ +static void prvTraceStoreSymbolTable(void) +{ + uint32_t i = 0; + uint32_t j = 0; + TRACE_ALLOC_CRITICAL_SECTION(); + + TRACE_ENTER_CRITICAL_SECTION(); + + { + for (i = 0; i < (sizeof(SymbolTable) / sizeof(uint32_t)); i += (SYMBOL_TABLE_SLOT_SIZE / sizeof(uint32_t))) + { + TRC_STREAM_PORT_ALLOCATE_EVENT_BLOCKING(uint32_t, data, SYMBOL_TABLE_SLOT_SIZE); + + for (j = 0; j < (SYMBOL_TABLE_SLOT_SIZE / sizeof(uint32_t)); j++) + { + data[j] = symbolTable.SymbolTableBuffer.pSymbolTableBufferUINT32[i+j]; + } + + TRC_STREAM_PORT_COMMIT_EVENT_BLOCKING(data, SYMBOL_TABLE_SLOT_SIZE); + } + } + TRACE_EXIT_CRITICAL_SECTION(); +} + +/* Stores the object table on Start */ +static void prvTraceStoreObjectDataTable(void) +{ + uint32_t i = 0; + uint32_t j = 0; + TRACE_ALLOC_CRITICAL_SECTION(); + + TRACE_ENTER_CRITICAL_SECTION(); + + { + for (i = 0; i < (sizeof(ObjectDataTable) / sizeof(uint32_t)); i += (OBJECT_DATA_SLOT_SIZE / sizeof(uint32_t))) + { + TRC_STREAM_PORT_ALLOCATE_EVENT_BLOCKING(uint32_t, data, OBJECT_DATA_SLOT_SIZE); + + for (j = 0; j < (OBJECT_DATA_SLOT_SIZE / sizeof(uint32_t)); j++) + { + data[j] = objectDataTable.ObjectDataTableBuffer.pObjectDataTableBufferUINT32[i+j]; + } + + TRC_STREAM_PORT_COMMIT_EVENT_BLOCKING(data, OBJECT_DATA_SLOT_SIZE); + } + } + TRACE_EXIT_CRITICAL_SECTION(); +} + +/* Stores the header information on Start */ +static void prvTraceStoreHeader(void) +{ + TRACE_ALLOC_CRITICAL_SECTION(); + + TRACE_ENTER_CRITICAL_SECTION(); + + { + TRC_STREAM_PORT_ALLOCATE_EVENT_BLOCKING(PSFHeaderInfo, header, sizeof(PSFHeaderInfo)); + header->psf = PSFEndianessIdentifier; + header->version = FormatVersion; + header->platform = TRACE_KERNEL_VERSION; + header->options = 0; + header->heapCounter = trcHeapCounter; + /* Lowest bit used for TRC_IRQ_PRIORITY_ORDER */ + header->options = header->options | (TRC_IRQ_PRIORITY_ORDER << 0); + header->symbolSize = SYMBOL_TABLE_SLOT_SIZE; + header->symbolCount = (TRC_CFG_SYMBOL_TABLE_SLOTS); + header->objectDataSize = 8; + header->objectDataCount = (TRC_CFG_OBJECT_DATA_SLOTS); + TRC_STREAM_PORT_COMMIT_EVENT_BLOCKING(header, sizeof(PSFHeaderInfo)); + } + TRACE_EXIT_CRITICAL_SECTION(); +} + +/* Stores the header information on Start */ +static void prvTraceStoreExtensionInfo(void) +{ + TRACE_ALLOC_CRITICAL_SECTION(); + + TRACE_ENTER_CRITICAL_SECTION(); + + { + TRC_STREAM_PORT_ALLOCATE_EVENT_BLOCKING(PSFExtensionInfoType, extinfo, sizeof(PSFExtensionInfoType)); + memcpy(extinfo, &PSFExtensionInfo, sizeof(PSFExtensionInfoType)); + TRC_STREAM_PORT_COMMIT_EVENT_BLOCKING(extinfo, sizeof(PSFExtensionInfoType)); + } + TRACE_EXIT_CRITICAL_SECTION(); +} + +/* Returns the error or warning, as a string, or NULL if none. */ +static const char* prvTraceGetError(int errCode) +{ + /* Note: the error messages are short, in order to fit in a User Event. + Instead, the users can read more in the below comments.*/ + + switch (errCode) + { + + case PSF_WARNING_SYMBOL_TABLE_SLOTS: + /* There was not enough symbol table slots for storing symbol names. + The number of missing slots is counted by NoRoomForSymbol. Inspect this + variable and increase TRC_CFG_SYMBOL_TABLE_SLOTS by at least that value. */ + + return "Exceeded SYMBOL_TABLE_SLOTS (see prvTraceGetError)"; + + case PSF_WARNING_SYMBOL_MAX_LENGTH: + /* A symbol name exceeded TRC_CFG_SYMBOL_MAX_LENGTH in length. + Make sure the symbol names are at most TRC_CFG_SYMBOL_MAX_LENGTH, + or inspect LongestSymbolName and increase TRC_CFG_SYMBOL_MAX_LENGTH + to at least this value. */ + + return "Exceeded SYMBOL_MAX_LENGTH (see prvTraceGetError)"; + + case PSF_WARNING_OBJECT_DATA_SLOTS: + /* There was not enough symbol object table slots for storing object + properties, such as task priorites. The number of missing slots is + counted by NoRoomForObjectData. Inspect this variable and increase + TRC_CFG_OBJECT_DATA_SLOTS by at least that value. */ + + return "Exceeded OBJECT_DATA_SLOTS (see prvTraceGetError)"; + + case PSF_WARNING_STRING_TOO_LONG: + /* Some string argument was longer than the maximum payload size + and has been truncated by "MaxBytesTruncated" bytes. + + This may happen for the following functions: + - vTracePrint + - vTracePrintF + - vTraceStoreKernelObjectName + - xTraceRegisterString + - vTraceSetISRProperties + + A PSF event may store maximum 60 bytes payload, including data + arguments and string characters. For User Events, also the User + Event Channel (4 bytes) must be squeezed in, if a channel is + specified (can be NULL). */ + + return "String too long (see prvTraceGetError)"; + + case PSF_WARNING_STREAM_PORT_READ: + /* TRC_STREAM_PORT_READ_DATA is expected to return 0 when completed successfully. + This means there is an error in the communication with host/Tracealyzer. */ + + return "TRC_STREAM_PORT_READ_DATA returned error (!= 0)."; + + case PSF_WARNING_STREAM_PORT_WRITE: + /* TRC_STREAM_PORT_WRITE_DATA is expected to return 0 when completed successfully. + This means there is an error in the communication with host/Tracealyzer. */ + + return "TRC_STREAM_PORT_WRITE_DATA returned error (!= 0)."; + + case PSF_WARNING_STACKMON_NO_SLOTS: + /* TRC_CFG_STACK_MONITOR_MAX_TASKS is too small to monitor all tasks. */ + + return "TRC_CFG_STACK_MONITOR_MAX_TASKS too small!"; + + case PSF_WARNING_STREAM_PORT_INITIAL_BLOCKING: + /* Blocking occurred during vTraceEnable. This happens if the trace buffer is + smaller than the initial transmission (trace header, object table, and symbol table). */ + + return "Blocking in vTraceEnable (see xTraceGetLastError)"; + + case PSF_ERROR_EVENT_CODE_TOO_LARGE: + /* The highest allowed event code is 4095, anything higher is an unexpected error. + Please contact support@percepio.com for assistance.*/ + + return "Invalid event code (see prvTraceGetError)"; + + case PSF_ERROR_ISR_NESTING_OVERFLOW: + /* Nesting of ISR trace calls exceeded the limit (TRC_CFG_MAX_ISR_NESTING). + If this is unlikely, make sure that you call vTraceStoreISRExit in the end + of all ISR handlers. Or increase TRC_CFG_MAX_ISR_NESTING. */ + + return "Exceeded ISR nesting (see prvTraceGetError)"; + + case PSF_ERROR_DWT_NOT_SUPPORTED: + /* On ARM Cortex-M only - failed to initialize DWT Cycle Counter since not supported by this chip. + DWT timestamping is selected automatically for ART Cortex-M3, M4 and higher, based on the __CORTEX_M + macro normally set by ARM's CMSIS library, since typically available. You can however select + SysTick timestamping instead by defining adding "#define TRC_CFG_ARM_CM_USE_SYSTICK".*/ + + return "DWT not supported (see prvTraceGetError)"; + + case PSF_ERROR_DWT_CYCCNT_NOT_SUPPORTED: + /* On ARM Cortex-M only - failed to initialize DWT Cycle Counter since not supported by this chip. + DWT timestamping is selected automatically for ART Cortex-M3, M4 and higher, based on the __CORTEX_M + macro normally set by ARM's CMSIS library, since typically available. You can however select + SysTick timestamping instead by defining adding "#define TRC_CFG_ARM_CM_USE_SYSTICK".*/ + + return "DWT_CYCCNT not supported (see prvTraceGetError)"; + + case PSF_ERROR_TZCTRLTASK_NOT_CREATED: + /* vTraceEnable failed creating the trace control task (TzCtrl) - incorrect parameters (priority?) + or insufficient heap size? */ + return "Could not create TzCtrl (see prvTraceGetError)"; + + case PSF_ERROR_STREAM_PORT_WRITE: + /* TRC_STREAM_PORT_WRITE_DATA is expected to return 0 when completed successfully. + This means there is an error in the communication with host/Tracealyzer. */ + return "TRC_STREAM_PORT_WRITE_DATA returned error (!= 0)."; + } + + return NULL; +} + +/* Store an event with zero parameters (event ID only) */ +void prvTraceStoreEvent0(uint16_t eventID) +{ + TRACE_ALLOC_CRITICAL_SECTION(); + + PSF_ASSERT_VOID(eventID < 4096, PSF_ERROR_EVENT_CODE_TOO_LARGE); + + TRACE_ENTER_CRITICAL_SECTION(); + + if (RecorderEnabled) + { + eventCounter++; + + { + TRC_STREAM_PORT_ALLOCATE_EVENT(BaseEvent, event, sizeof(BaseEvent)); + if (event != NULL) + { + event->EventID = eventID | PARAM_COUNT(0); + event->EventCount = (uint16_t)eventCounter; + event->TS = prvGetTimestamp32(); + TRC_STREAM_PORT_COMMIT_EVENT(event, sizeof(BaseEvent)); + } + } + } + TRACE_EXIT_CRITICAL_SECTION(); +} + +/* Store an event with one 32-bit parameter (pointer address or an int) */ +void prvTraceStoreEvent1(uint16_t eventID, uint32_t param1) +{ + TRACE_ALLOC_CRITICAL_SECTION(); + + PSF_ASSERT_VOID(eventID < 4096, PSF_ERROR_EVENT_CODE_TOO_LARGE); + + TRACE_ENTER_CRITICAL_SECTION(); + + if (RecorderEnabled) + { + eventCounter++; + + { + TRC_STREAM_PORT_ALLOCATE_EVENT(EventWithParam_1, event, sizeof(EventWithParam_1)); + if (event != NULL) + { + event->base.EventID = eventID | PARAM_COUNT(1); + event->base.EventCount = (uint16_t)eventCounter; + event->base.TS = prvGetTimestamp32(); + event->param1 = (uint32_t)param1; + TRC_STREAM_PORT_COMMIT_EVENT(event, sizeof(EventWithParam_1)); + } + } + } + TRACE_EXIT_CRITICAL_SECTION(); +} + +/* Store an event with two 32-bit parameters */ +void prvTraceStoreEvent2(uint16_t eventID, uint32_t param1, uint32_t param2) +{ + TRACE_ALLOC_CRITICAL_SECTION(); + + PSF_ASSERT_VOID(eventID < 4096, PSF_ERROR_EVENT_CODE_TOO_LARGE); + + TRACE_ENTER_CRITICAL_SECTION(); + + if (RecorderEnabled) + { + eventCounter++; + + { + TRC_STREAM_PORT_ALLOCATE_EVENT(EventWithParam_2, event, sizeof(EventWithParam_2)); + if (event != NULL) + { + event->base.EventID = eventID | PARAM_COUNT(2); + event->base.EventCount = (uint16_t)eventCounter; + event->base.TS = prvGetTimestamp32(); + event->param1 = (uint32_t)param1; + event->param2 = param2; + TRC_STREAM_PORT_COMMIT_EVENT(event, sizeof(EventWithParam_2)); + } + } + } + TRACE_EXIT_CRITICAL_SECTION(); +} + +/* Store an event with three 32-bit parameters */ +void prvTraceStoreEvent3( uint16_t eventID, + uint32_t param1, + uint32_t param2, + uint32_t param3) +{ + TRACE_ALLOC_CRITICAL_SECTION(); + + PSF_ASSERT_VOID(eventID < 4096, PSF_ERROR_EVENT_CODE_TOO_LARGE); + + TRACE_ENTER_CRITICAL_SECTION(); + + if (RecorderEnabled) + { + eventCounter++; + + { + TRC_STREAM_PORT_ALLOCATE_EVENT(EventWithParam_3, event, sizeof(EventWithParam_3)); + if (event != NULL) + { + event->base.EventID = eventID | PARAM_COUNT(3); + event->base.EventCount = (uint16_t)eventCounter; + event->base.TS = prvGetTimestamp32(); + event->param1 = (uint32_t)param1; + event->param2 = param2; + event->param3 = param3; + TRC_STREAM_PORT_COMMIT_EVENT(event, sizeof(EventWithParam_3)); + } + } + } + TRACE_EXIT_CRITICAL_SECTION(); +} + +/* Stores an event with 32-bit integer parameters */ +void prvTraceStoreEvent(int nParam, uint16_t eventID, ...) +{ + va_list vl; + int i; + TRACE_ALLOC_CRITICAL_SECTION(); + + PSF_ASSERT_VOID(eventID < 4096, PSF_ERROR_EVENT_CODE_TOO_LARGE); + + TRACE_ENTER_CRITICAL_SECTION(); + + if (RecorderEnabled) + { + int eventSize = (int)sizeof(BaseEvent) + nParam * (int)sizeof(uint32_t); + + eventCounter++; + + { + TRC_STREAM_PORT_ALLOCATE_DYNAMIC_EVENT(largestEventType, event, eventSize); + if (event != NULL) + { + event->base.EventID = eventID | (uint16_t)PARAM_COUNT(nParam); + event->base.EventCount = (uint16_t)eventCounter; + event->base.TS = prvGetTimestamp32(); + + va_start(vl, eventID); + for (i = 0; i < nParam; i++) + { + uint32_t* tmp = (uint32_t*) &(event->data[i]); + *tmp = va_arg(vl, uint32_t); + } + va_end(vl); + + TRC_STREAM_PORT_COMMIT_EVENT(event, (uint32_t)eventSize); + } + } + } + TRACE_EXIT_CRITICAL_SECTION(); +} + +/* Stories an event with a string and 32-bit integer parameters */ +void prvTraceStoreStringEvent(int nArgs, uint16_t eventID, const char* str, ...) +{ + int len; + va_list vl; + + for (len = 0; (str[len] != 0) && (len < 52); len++); /* empty loop */ + + va_start(vl, str); + prvTraceStoreStringEventHelper(nArgs, eventID, NULL, len, str, vl); + va_end(vl); +} + +/* Internal common function for storing string events */ +static void prvTraceStoreStringEventHelper(int nArgs, + uint16_t eventID, + traceString userEvtChannel, + int len, + const char* str, + va_list vl) +{ + int nWords; + int nStrWords; + int i; + int offset = 0; + TRACE_ALLOC_CRITICAL_SECTION(); + + /* The string length in multiples of 32 bit words (+1 for null character) */ + nStrWords = (len+1+3)/4; + + offset = nArgs * 4; + + /* The total number of 32-bit words needed for the whole payload */ + nWords = nStrWords + nArgs; + + if (nWords > 15) /* if attempting to store more than 60 byte (= max) */ + { + /* Truncate event if too large. The string characters are stored + last, so usually only the string is truncated, unless there a lot + of parameters... */ + + /* Diagnostics ... */ + uint32_t bytesTruncated = (uint32_t)(nWords - 15) * 4; + + if (bytesTruncated > MaxBytesTruncated) + { + MaxBytesTruncated = bytesTruncated; + } + + nWords = 15; + len = 15 * 4 - offset; + } + + TRACE_ENTER_CRITICAL_SECTION(); + + if (RecorderEnabled) + { + int eventSize = (int)sizeof(BaseEvent) + nWords * (int)sizeof(uint32_t); + + eventCounter++; + + { + TRC_STREAM_PORT_ALLOCATE_DYNAMIC_EVENT(largestEventType, event, eventSize); + if (event != NULL) + { + uint32_t* data32; + uint8_t* data8; + event->base.EventID = (eventID) | (uint16_t)PARAM_COUNT(nWords); + event->base.EventCount = (uint16_t)eventCounter; + event->base.TS = prvGetTimestamp32(); + + /* 32-bit write-pointer for the data argument */ + data32 = (uint32_t*) &(event->data[0]); + + for (i = 0; i < nArgs; i++) + { + if ((userEvtChannel != NULL) && (i == 0)) + { + /* First, add the User Event Channel if not NULL */ + data32[i] = (uint32_t)userEvtChannel; + } + else + { + /* Add data arguments... */ + data32[i] = va_arg(vl, uint32_t); + } + } + data8 = (uint8_t*)&(event->data[0]); + for (i = 0; i < len; i++) + { + data8[offset + i] = str[i]; + } + + if (len < (15 * 4 - offset)) + data8[offset + len] = 0; /* Only truncate if we don't fill up the buffer completely */ + TRC_STREAM_PORT_COMMIT_EVENT(event, (uint32_t)eventSize); + } + } + } + + TRACE_EXIT_CRITICAL_SECTION(); +} + +/* Internal common function for storing string events without additional arguments */ +void prvTraceStoreSimpleStringEventHelper(uint16_t eventID, + traceString userEvtChannel, + const char* str) +{ + int len; + int nWords; + int nStrWords; + int i; + int nArgs = 0; + int offset = 0; + TRACE_ALLOC_CRITICAL_SECTION(); + + for (len = 0; (str[len] != 0) && (len < 52); len++); /* empty loop */ + + /* The string length in multiples of 32 bit words (+1 for null character) */ + nStrWords = (len+1+3)/4; + + /* If a user event channel is specified, add in the list */ + if (userEvtChannel) + { + nArgs++; + eventID++; + } + + offset = nArgs * 4; + + /* The total number of 32-bit words needed for the whole payload */ + nWords = nStrWords + nArgs; + + if (nWords > 15) /* if attempting to store more than 60 byte (= max) */ + { + /* Truncate event if too large. The string characters are stored + last, so usually only the string is truncated, unless there a lot + of parameters... */ + + /* Diagnostics ... */ + uint32_t bytesTruncated = (uint32_t)(nWords - 15) * 4; + + if (bytesTruncated > MaxBytesTruncated) + { + MaxBytesTruncated = bytesTruncated; + } + + nWords = 15; + len = 15 * 4 - offset; + } + + TRACE_ENTER_CRITICAL_SECTION(); + + if (RecorderEnabled) + { + int eventSize = (int)sizeof(BaseEvent) + nWords * (int)sizeof(uint32_t); + + eventCounter++; + + { + TRC_STREAM_PORT_ALLOCATE_DYNAMIC_EVENT(largestEventType, event, eventSize); + if (event != NULL) + { + uint32_t* data32; + uint8_t* data8; + event->base.EventID = (eventID) | (uint16_t)PARAM_COUNT(nWords); + event->base.EventCount = (uint16_t)eventCounter; + event->base.TS = prvGetTimestamp32(); + + /* 32-bit write-pointer for the data argument */ + data32 = (uint32_t*) &(event->data[0]); + + if (userEvtChannel != NULL) + { + /* First, add the User Event Channel if not NULL */ + data32[0] = (uint32_t)userEvtChannel; + } + + data8 = (uint8_t*) &(event->data[0]); + for (i = 0; i < len; i++) + { + data8[offset + i] = str[i]; + } + + if (len < (15 * 4 - offset)) + data8[offset + len] = 0; /* Only truncate if we don't fill up the buffer completely */ + TRC_STREAM_PORT_COMMIT_EVENT(event, (uint32_t)eventSize); + } + } + } + + TRACE_EXIT_CRITICAL_SECTION(); +} + +/* Saves a symbol name in the symbol table and returns the slot address */ +void* prvTraceSaveSymbol(const char *name) +{ + void* retVal = 0; + TRACE_ALLOC_CRITICAL_SECTION(); + + TRACE_ENTER_CRITICAL_SECTION(); + if (firstFreeSymbolTableIndex < SYMBOL_TABLE_BUFFER_SIZE) + { + /* The address to the available symbol table slot is the address we use */ + retVal = &symbolTable.SymbolTableBuffer.pSymbolTableBufferUINT8[firstFreeSymbolTableIndex]; + prvTraceSaveObjectSymbol(retVal, name); + } + TRACE_EXIT_CRITICAL_SECTION(); + + return retVal; +} + +/* Saves a string in the symbol table for an object (task name etc.) */ +void prvTraceSaveObjectSymbol(void* address, const char *name) +{ + uint32_t i; + uint8_t *ptrSymbol; + TRACE_ALLOC_CRITICAL_SECTION(); + + TRACE_ENTER_CRITICAL_SECTION(); + + /* We do not look for previous entries -> changing a registered string is no longer possible */ + if (firstFreeSymbolTableIndex < SYMBOL_TABLE_BUFFER_SIZE) + { + /* We access the symbol table via the union member pSymbolTableBufferUINT32 to avoid strict-aliasing issues */ + symbolTable.SymbolTableBuffer.pSymbolTableBufferUINT32[firstFreeSymbolTableIndex / sizeof(uint32_t)] = (uint32_t)address; + + /* We access the symbol table via the union member pSymbolTableBufferUINT8 to avoid strict-aliasing issues */ + ptrSymbol = &symbolTable.SymbolTableBuffer.pSymbolTableBufferUINT8[firstFreeSymbolTableIndex + sizeof(uint32_t)]; + for (i = 0; i < (TRC_CFG_SYMBOL_MAX_LENGTH); i++) + { + ptrSymbol[i] = (uint8_t)name[i]; /* We do this first to ensure we also get the 0 termination, if there is one */ + + if (name[i] == 0) + break; + } + + /* Check the length of "name", if longer than SYMBOL_MAX_LENGTH */ + while ((name[i] != 0) && i < 128) + { + i++; + } + + /* Remember the longest symbol name, for diagnostic purposes */ + if (i > LongestSymbolName) + { + LongestSymbolName = i; + } + + firstFreeSymbolTableIndex += SYMBOL_TABLE_SLOT_SIZE; + } + else + { + NoRoomForSymbol++; + } + + TRACE_EXIT_CRITICAL_SECTION(); +} + +/* Deletes a symbol name (task name etc.) from symbol table */ +void prvTraceDeleteSymbol(void *address) +{ + uint32_t i, j; + uint32_t *ptr, *lastEntryPtr; + TRACE_ALLOC_CRITICAL_SECTION(); + + TRACE_ENTER_CRITICAL_SECTION(); + + for (i = 0; i < firstFreeSymbolTableIndex; i += SYMBOL_TABLE_SLOT_SIZE) + { + /* We access the symbol table via the union member pSymbolTableBufferUINT32 to avoid strict-aliasing issues */ + ptr = &symbolTable.SymbolTableBuffer.pSymbolTableBufferUINT32[i / sizeof(uint32_t)]; + if (*ptr == (uint32_t)address) + { + /* See if we have another entry in the table, and that this isn't already the last entry */ + if (firstFreeSymbolTableIndex > SYMBOL_TABLE_SLOT_SIZE && i != (firstFreeSymbolTableIndex - SYMBOL_TABLE_SLOT_SIZE)) + { + /* Another entry is available, get pointer to the last one */ + /* We access the symbol table via the union member pSymbolTableBufferUINT32 to avoid strict-aliasing issues */ + lastEntryPtr = &symbolTable.SymbolTableBuffer.pSymbolTableBufferUINT32[(firstFreeSymbolTableIndex - SYMBOL_TABLE_SLOT_SIZE) / sizeof(uint32_t)]; + + /* Copy last entry to this position */ + for (j = 0; j < (SYMBOL_TABLE_SLOT_SIZE) / sizeof(uint32_t); j++) + { + ptr[j] = lastEntryPtr[j]; + } + + /* For good measure we also zero out the original position */ + *lastEntryPtr = 0; + } + else + *ptr = 0; /* No other entry found, or this is the last entry */ + + /* Lower index */ + firstFreeSymbolTableIndex -= SYMBOL_TABLE_SLOT_SIZE; + + break; + } + } + + TRACE_EXIT_CRITICAL_SECTION(); +} + +/* Saves an object data entry (current task priority) in object data table */ +void prvTraceSaveObjectData(const void *address, uint32_t data) +{ + uint32_t i; + uint32_t foundSlot; + uint32_t *ptr; + TRACE_ALLOC_CRITICAL_SECTION(); + + TRACE_ENTER_CRITICAL_SECTION(); + + foundSlot = firstFreeObjectDataTableIndex; + + /* First look for previous entries using this address */ + for (i = 0; i < firstFreeObjectDataTableIndex; i += OBJECT_DATA_SLOT_SIZE) + { + /* We access the data table via the union member pObjectDataTableBufferUINT32 to avoid strict-aliasing issues */ + ptr = &objectDataTable.ObjectDataTableBuffer.pObjectDataTableBufferUINT32[i / sizeof(uint32_t)]; + if (*ptr == (uint32_t)address) + { + foundSlot = i; + break; + } + } + + if (foundSlot < OBJECT_DATA_TABLE_BUFFER_SIZE) + { + /* We access the data table via the union member pObjectDataTableBufferUINT32 to avoid strict-aliasing issues */ + objectDataTable.ObjectDataTableBuffer.pObjectDataTableBufferUINT32[foundSlot / sizeof(uint32_t)] = (uint32_t)address; + objectDataTable.ObjectDataTableBuffer.pObjectDataTableBufferUINT32[foundSlot / sizeof(uint32_t) + 1] = data; + + /* Is this the last entry in the object data table? */ + if (foundSlot == firstFreeObjectDataTableIndex) + { + firstFreeObjectDataTableIndex += OBJECT_DATA_SLOT_SIZE; + } + } + else + { + NoRoomForObjectData++; + } + + TRACE_EXIT_CRITICAL_SECTION(); +} + +/* Removes an object data entry (task base priority) from object data table */ +void prvTraceDeleteObjectData(void *address) +{ + uint32_t i, j; + uint32_t *ptr, *lastEntryPtr; + TRACE_ALLOC_CRITICAL_SECTION(); + + TRACE_ENTER_CRITICAL_SECTION(); + + for (i = 0; i < firstFreeObjectDataTableIndex; i += OBJECT_DATA_SLOT_SIZE) + { + /* We access the data table via the union member pObjectDataTableBufferUINT32 to avoid strict-aliasing issues */ + ptr = &objectDataTable.ObjectDataTableBuffer.pObjectDataTableBufferUINT32[i / sizeof(uint32_t)]; + if (*ptr == (uint32_t)address) + { + /* See if we have another entry in the table, and that this isn't already the last entry */ + if (firstFreeObjectDataTableIndex > OBJECT_DATA_SLOT_SIZE && i != (firstFreeObjectDataTableIndex - OBJECT_DATA_SLOT_SIZE)) + { + /* Another entry is available, get pointer to the last one */ + /* We access the data table via the union member pObjectDataTableBufferUINT32 to avoid strict-aliasing issues */ + lastEntryPtr = &objectDataTable.ObjectDataTableBuffer.pObjectDataTableBufferUINT32[(firstFreeObjectDataTableIndex - OBJECT_DATA_SLOT_SIZE) / sizeof(uint32_t)]; + + /* Copy last entry to this position */ + for (j = 0; j < (OBJECT_DATA_SLOT_SIZE) / sizeof(uint32_t); j++) + { + ptr[j] = lastEntryPtr[j]; + } + + /* For good measure we also zero out the original position */ + *lastEntryPtr = 0; + } + else + *ptr = 0; /* No other entry found, or this is the last entry */ + + /* Lower index */ + firstFreeObjectDataTableIndex -= OBJECT_DATA_SLOT_SIZE; + + break; + } + } + + TRACE_EXIT_CRITICAL_SECTION(); +} + +/* Checks if the provided command is a valid command */ +int prvIsValidCommand(TracealyzerCommandType* cmd) +{ + uint16_t checksum = (uint16_t)(0xFFFF - ( cmd->cmdCode + + cmd->param1 + + cmd->param2 + + cmd->param3 + + cmd->param4 + + cmd->param5)); + + if (cmd->checksumMSB != (unsigned char)(checksum >> 8)) + return 0; + + if (cmd->checksumLSB != (unsigned char)(checksum & 0xFF)) + return 0; + + if (cmd->cmdCode > CMD_LAST_COMMAND) + return 0; + + return 1; +} + +/* Executed the received command (Start or Stop) */ +void prvProcessCommand(TracealyzerCommandType* cmd) +{ + switch(cmd->cmdCode) + { + case CMD_SET_ACTIVE: + prvSetRecorderEnabled(cmd->param1); + break; + default: + break; + } +} + +/* Called on warnings, when the recording can continue. */ +void prvTraceWarning(int errCode) +{ + if (GET_ERROR_WARNING_FLAG(errCode) == 0) + { + /* Will never reach this point more than once per warning type, since we verify if ErrorAndWarningFlags[errCode] has already been set */ + SET_ERROR_WARNING_FLAG(errCode); + + prvTraceStoreSimpleStringEventHelper(PSF_EVENT_USER_EVENT, trcWarningChannel, prvTraceGetError(errCode)); + } +} + +/* Called on critical errors in the recorder. Stops the recorder! */ +void prvTraceError(int errCode) +{ + if (errorCode == PSF_ERROR_NONE) + { + /* Will never reach this point more than once, since we verify if errorCode has already been set */ + errorCode = errCode; + SET_ERROR_WARNING_FLAG(errorCode); + + prvTraceStoreSimpleStringEventHelper(PSF_EVENT_USER_EVENT, trcWarningChannel, prvTraceGetError(errorCode)); + prvTraceStoreSimpleStringEventHelper(PSF_EVENT_USER_EVENT, trcWarningChannel, "Recorder stopped in prvTraceError()"); + + prvSetRecorderEnabled(0); + } +} + +/* If using DWT timestamping (default on ARM Cortex-M3, M4 and M7), make sure the DWT unit is initialized. */ +#ifndef TRC_CFG_ARM_CM_USE_SYSTICK +#if ((TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_ARM_Cortex_M) && (defined (__CORTEX_M) && (__CORTEX_M >= 0x03))) + +void prvTraceInitCortexM() +{ + /* Make sure the DWT registers are unlocked, in case the debugger doesn't do this. */ + TRC_REG_ITM_LOCKACCESS = TRC_ITM_LOCKACCESS_UNLOCK; + + /* Make sure DWT is enabled is enabled, if supported */ + TRC_REG_DEMCR |= TRC_DEMCR_TRCENA; + + do + { + /* Verify that DWT is supported */ + if (TRC_REG_DEMCR == 0) + { + /* This function is called on Cortex-M3, M4 and M7 devices to initialize + the DWT unit, assumed present. The DWT cycle counter is used for timestamping. + + If the below error is produced, the DWT unit does not seem to be available. + + In that case, define the macro TRC_CFG_ARM_CM_USE_SYSTICK in your build + to use SysTick timestamping instead, or define your own timestamping by + setting TRC_CFG_HARDWARE_PORT to TRC_HARDWARE_PORT_APPLICATION_DEFINED + and make the necessary definitions, as explained in trcHardwarePort.h.*/ + + prvTraceError(PSF_ERROR_DWT_NOT_SUPPORTED); + break; + } + + /* Verify that DWT_CYCCNT is supported */ + if (TRC_REG_DWT_CTRL & TRC_DWT_CTRL_NOCYCCNT) + { + /* This function is called on Cortex-M3, M4 and M7 devices to initialize + the DWT unit, assumed present. The DWT cycle counter is used for timestamping. + + If the below error is produced, the cycle counter does not seem to be available. + + In that case, define the macro TRC_CFG_ARM_CM_USE_SYSTICK in your build + to use SysTick timestamping instead, or define your own timestamping by + setting TRC_CFG_HARDWARE_PORT to TRC_HARDWARE_PORT_APPLICATION_DEFINED + and make the necessary definitions, as explained in trcHardwarePort.h.*/ + + prvTraceError(PSF_ERROR_DWT_CYCCNT_NOT_SUPPORTED); + break; + } + + /* Reset the cycle counter */ + TRC_REG_DWT_CYCCNT = 0; + + /* Enable the cycle counter */ + TRC_REG_DWT_CTRL |= TRC_DWT_CTRL_CYCCNTENA; + + } while(0); /* breaks above jump here */ +} +#endif +#endif + +/* Performs timestamping using definitions in trcHardwarePort.h */ +static uint32_t prvGetTimestamp32(void) +{ +#if ((TRC_HWTC_TYPE == TRC_FREE_RUNNING_32BIT_INCR) || (TRC_HWTC_TYPE == TRC_FREE_RUNNING_32BIT_DECR)) + return TRC_HWTC_COUNT; +#endif + +#if ((TRC_HWTC_TYPE == TRC_CUSTOM_TIMER_INCR) || (TRC_HWTC_TYPE == TRC_CUSTOM_TIMER_DECR)) + return TRC_HWTC_COUNT; +#endif + +#if ((TRC_HWTC_TYPE == TRC_OS_TIMER_INCR) || (TRC_HWTC_TYPE == TRC_OS_TIMER_DECR)) + uint32_t ticks = TRACE_GET_OS_TICKS(); + return ((TRC_HWTC_COUNT) & 0x00FFFFFFU) + ((ticks & 0x000000FFU) << 24); +#endif +} + +/* Retrieve a buffer page to write to. */ +static int prvAllocateBufferPage(int prevPage) +{ + int index; + int count = 0; + + index = (prevPage + 1) % (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_COUNT); + + while((PageInfo[index].Status != PAGE_STATUS_FREE) && (count ++ < (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_COUNT))) + { + index = (index + 1) % (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_COUNT); + } + + if (PageInfo[index].Status == PAGE_STATUS_FREE) + { + return index; + } + + return -1; +} + +/* Mark the page read as complete. */ +static void prvPageReadComplete(int pageIndex) +{ + TRACE_ALLOC_CRITICAL_SECTION(); + + TRACE_ENTER_CRITICAL_SECTION(); + PageInfo[pageIndex].BytesRemaining = (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_SIZE); + PageInfo[pageIndex].WritePointer = &EventBuffer[pageIndex * (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_SIZE)]; + PageInfo[pageIndex].Status = PAGE_STATUS_FREE; + + TotalBytesRemaining += (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_SIZE); + + TRACE_EXIT_CRITICAL_SECTION(); +} + +/* Get the current buffer page index and remaining number of bytes. */ +static int prvGetBufferPage(int32_t* bytesUsed) +{ + static int8_t lastPage = -1; + int count = 0; + int8_t index = (int8_t) ((lastPage + 1) % (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_COUNT)); + + while((PageInfo[index].Status != PAGE_STATUS_READ) && (count++ < (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_COUNT))) + { + index = (int8_t)((index + 1) % (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_COUNT)); + } + + if (PageInfo[index].Status == PAGE_STATUS_READ) + { + *bytesUsed = (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_SIZE) - PageInfo[index].BytesRemaining; + lastPage = index; + return index; + } + + *bytesUsed = 0; + + return -1; +} + +/******************************************************************************* + * uint32_t prvPagedEventBufferTransfer(void) + * + * Transfers one buffer page of trace data, if a full page is available, using + * the macro TRC_STREAM_PORT_WRITE_DATA as defined in trcStreamingPort.h. + * + * This function is intended to be called the periodic TzCtrl task with a suitable + * delay (e.g. 10-100 ms). + * + * Returns the number of bytes sent. If non-zero, it is good to call this + * again, in order to send any additional data waiting in the buffer. + * If zero, wait a while before calling again. + * + * In case of errors from the streaming interface, it registers a warning + * (PSF_WARNING_STREAM_PORT_WRITE) provided by xTraceGetLastError(). + * + *******************************************************************************/ +uint32_t prvPagedEventBufferTransfer(void) +{ + int8_t pageToTransfer = -1; + int32_t bytesTransferredTotal = 0; + int32_t bytesTransferredNow = 0; + int32_t bytesToTransfer; + + pageToTransfer = (int8_t)prvGetBufferPage(&bytesToTransfer); + + /* bytesToTransfer now contains the number of "valid" bytes in the buffer page, that should be transmitted. + There might be some unused junk bytes in the end, that must be ignored. */ + + if (pageToTransfer > -1) + { + while (1) /* Keep going until we have transferred all that we intended to */ + { + if (TRC_STREAM_PORT_WRITE_DATA( + &EventBuffer[pageToTransfer * (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_SIZE) + bytesTransferredTotal], + (uint32_t)(bytesToTransfer - bytesTransferredTotal), + &bytesTransferredNow) == 0) + { + /* Write was successful. Update the number of transferred bytes. */ + bytesTransferredTotal += bytesTransferredNow; + + if (bytesTransferredTotal == bytesToTransfer) + { + /* All bytes have been transferred. Mark the buffer page as "Read Complete" (so it can be written to) and return OK. */ + prvPageReadComplete(pageToTransfer); + return (uint32_t)bytesTransferredTotal; + } + } + else + { + /* Some error from the streaming interface... */ + vTraceStop(); + return 0; + } + } + } + return 0; +} + +/******************************************************************************* + * void* prvPagedEventBufferGetWritePointer(int sizeOfEvent) + * + * Returns a pointer to an available location in the buffer able to store the + * requested size. + * + * Return value: The pointer. + * + * Parameters: + * - sizeOfEvent: The size of the event that is to be placed in the buffer. + * +*******************************************************************************/ +void* prvPagedEventBufferGetWritePointer(int sizeOfEvent) +{ + void* ret; + static int currentWritePage = -1; + + if (currentWritePage == -1) + { + currentWritePage = prvAllocateBufferPage(currentWritePage); + if (currentWritePage == -1) + { + DroppedEventCounter++; + return NULL; + } + } + + if (PageInfo[currentWritePage].BytesRemaining - sizeOfEvent < 0) + { + PageInfo[currentWritePage].Status = PAGE_STATUS_READ; + + TotalBytesRemaining -= PageInfo[currentWritePage].BytesRemaining; // Last trailing bytes + + if (TotalBytesRemaining < TotalBytesRemaining_LowWaterMark) + TotalBytesRemaining_LowWaterMark = TotalBytesRemaining; + + currentWritePage = prvAllocateBufferPage(currentWritePage); + if (currentWritePage == -1) + { + DroppedEventCounter++; + return NULL; + } + } + ret = PageInfo[currentWritePage].WritePointer; + PageInfo[currentWritePage].WritePointer += sizeOfEvent; + PageInfo[currentWritePage].BytesRemaining = (uint16_t)(PageInfo[currentWritePage].BytesRemaining -sizeOfEvent); + + TotalBytesRemaining = (TotalBytesRemaining-(uint16_t)sizeOfEvent); + + if (TotalBytesRemaining < TotalBytesRemaining_LowWaterMark) + TotalBytesRemaining_LowWaterMark = TotalBytesRemaining; + + return ret; +} + +/******************************************************************************* + * void prvPagedEventBufferInit(char* buffer) + * + * Assigns the buffer to use and initializes the PageInfo structure. + * + * Return value: void + * + * Parameters: + * - char* buffer: pointer to the trace data buffer, allocated by the caller. + * +*******************************************************************************/ +void prvPagedEventBufferInit(char* buffer) +{ + int i; + TRACE_ALLOC_CRITICAL_SECTION(); + + EventBuffer = buffer; + + TRACE_ENTER_CRITICAL_SECTION(); + for (i = 0; i < (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_COUNT); i++) + { + PageInfo[i].BytesRemaining = (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_SIZE); + PageInfo[i].WritePointer = &EventBuffer[i * (TRC_CFG_PAGED_EVENT_BUFFER_PAGE_SIZE)]; + PageInfo[i].Status = PAGE_STATUS_FREE; + } + TRACE_EXIT_CRITICAL_SECTION(); + +} + +#endif /*(TRC_USE_TRACEALYZER_RECORDER == 1)*/ + +#endif /*(TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING)*/ + diff --git a/TSM_PicoW_Sensor/McuLib/config/C11config.h b/TSM_PicoW_Sensor/McuLib/config/C11config.h new file mode 100644 index 0000000..a215bfc --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/C11config.h @@ -0,0 +1,87 @@ +/** + * \file + * \brief Configuration header file for SDK_BitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SDK Bit I/O module. + */ + +#ifndef __C11_CONFIG_H +#define __C11_CONFIG_H + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_MCUXPRESSO_2_0 + #include "pin_mux.h" /* include pin muxing header file */ + + #if defined(BOARD_INITPINS_C11_PIN) + #define C11_CONFIG_PIN_NUMBER BOARD_INITPINS_C11_PIN + #endif + #if defined(BOARD_INITPINS_C11_GPIO) + #define C11_CONFIG_GPIO_NAME BOARD_INITPINS_C11_GPIO + #endif + #if defined(BOARD_INITPINS_C11_PORT) + #define C11_CONFIG_PORT_NAME BOARD_INITPINS_C11_PORT + #endif +#endif + +#ifndef C11_CONFIG_PORT_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define C11_CONFIG_PORT_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define C11_CONFIG_PORT_NAME 0 + #else /* name from properties */ + #define C11_CONFIG_PORT_NAME PORTA + #endif + /*!< name of PORT, is pointer to PORT_Type */ +#endif + +#ifndef C11_CONFIG_GPIO_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define C11_CONFIG_GPIO_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define C11_CONFIG_GPIO_NAME GPIO + #elif McuLib_CONFIG_CPU_IS_KINETIS && McuLib_CONFIG_IS_KINETIS_KE + #define C11_CONFIG_GPIO_NAME 0 + #elif McuLib_CONFIG_CPU_IS_MCX + #define C11_CONFIG_GPIO_NAME GPIO0 + #else /* name from properties */ + #define C11_CONFIG_GPIO_NAME GPIOA + #endif + /*!< name of GPIO, is pointer to GPIO_Type, not used for S32K SDK */ +#endif + +#ifndef C11_CONFIG_PIN_NUMBER + #define C11_CONFIG_PIN_NUMBER 0u + /*!< number of pin, type unsigned integer */ +#endif + +#ifndef C11_CONFIG_PIN_SYMBOL + #define C11_CONFIG_PIN_SYMBOL LED_RED + /*!< symbolic name for pin, used for NXP SDK V1.3 */ +#endif + +#ifndef C11_CONFIG_INIT_PIN_VALUE + #define C11_CONFIG_INIT_PIN_VALUE 0 + /*!< 0: Pin data is initialized with 0 (low); 1: pin value is initialized with 1 (high) */ +#endif + +/* different types of pin direction settings */ +#define C11_CONFIG_INIT_PIN_DIRECTION_NONE (0) +#define C11_CONFIG_INIT_PIN_DIRECTION_INPUT (1) +#define C11_CONFIG_INIT_PIN_DIRECTION_OUTPUT (2) + +#ifndef C11_CONFIG_INIT_PIN_DIRECTION + #define C11_CONFIG_INIT_PIN_DIRECTION C11_CONFIG_INIT_PIN_DIRECTION_OUTPUT +#endif + +#ifndef C11_CONFIG_DO_PIN_MUXING + #define C11_CONFIG_DO_PIN_MUXING 0 + /*!< 1: perform pin muxing in Init(), 0: do not do pin muxing */ +#endif + +#ifndef C11_CONFIG_PULL_RESISTOR + #define C11_CONFIG_PULL_RESISTOR 0 + /*!< pull resistor setting. 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ +#endif + +#endif /* __C11_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/C21config.h b/TSM_PicoW_Sensor/McuLib/config/C21config.h new file mode 100644 index 0000000..5ed4a74 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/C21config.h @@ -0,0 +1,87 @@ +/** + * \file + * \brief Configuration header file for SDK_BitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SDK Bit I/O module. + */ + +#ifndef __C21_CONFIG_H +#define __C21_CONFIG_H + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_MCUXPRESSO_2_0 + #include "pin_mux.h" /* include pin muxing header file */ + + #if defined(BOARD_INITPINS_C21_PIN) + #define C21_CONFIG_PIN_NUMBER BOARD_INITPINS_C21_PIN + #endif + #if defined(BOARD_INITPINS_C21_GPIO) + #define C21_CONFIG_GPIO_NAME BOARD_INITPINS_C21_GPIO + #endif + #if defined(BOARD_INITPINS_C21_PORT) + #define C21_CONFIG_PORT_NAME BOARD_INITPINS_C21_PORT + #endif +#endif + +#ifndef C21_CONFIG_PORT_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define C21_CONFIG_PORT_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define C21_CONFIG_PORT_NAME 0 + #else /* name from properties */ + #define C21_CONFIG_PORT_NAME PORTA + #endif + /*!< name of PORT, is pointer to PORT_Type */ +#endif + +#ifndef C21_CONFIG_GPIO_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define C21_CONFIG_GPIO_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define C21_CONFIG_GPIO_NAME GPIO + #elif McuLib_CONFIG_CPU_IS_KINETIS && McuLib_CONFIG_IS_KINETIS_KE + #define C21_CONFIG_GPIO_NAME 0 + #elif McuLib_CONFIG_CPU_IS_MCX + #define C21_CONFIG_GPIO_NAME GPIO0 + #else /* name from properties */ + #define C21_CONFIG_GPIO_NAME GPIOA + #endif + /*!< name of GPIO, is pointer to GPIO_Type, not used for S32K SDK */ +#endif + +#ifndef C21_CONFIG_PIN_NUMBER + #define C21_CONFIG_PIN_NUMBER 0u + /*!< number of pin, type unsigned integer */ +#endif + +#ifndef C21_CONFIG_PIN_SYMBOL + #define C21_CONFIG_PIN_SYMBOL LED_RED + /*!< symbolic name for pin, used for NXP SDK V1.3 */ +#endif + +#ifndef C21_CONFIG_INIT_PIN_VALUE + #define C21_CONFIG_INIT_PIN_VALUE 0 + /*!< 0: Pin data is initialized with 0 (low); 1: pin value is initialized with 1 (high) */ +#endif + +/* different types of pin direction settings */ +#define C21_CONFIG_INIT_PIN_DIRECTION_NONE (0) +#define C21_CONFIG_INIT_PIN_DIRECTION_INPUT (1) +#define C21_CONFIG_INIT_PIN_DIRECTION_OUTPUT (2) + +#ifndef C21_CONFIG_INIT_PIN_DIRECTION + #define C21_CONFIG_INIT_PIN_DIRECTION C21_CONFIG_INIT_PIN_DIRECTION_OUTPUT +#endif + +#ifndef C21_CONFIG_DO_PIN_MUXING + #define C21_CONFIG_DO_PIN_MUXING 0 + /*!< 1: perform pin muxing in Init(), 0: do not do pin muxing */ +#endif + +#ifndef C21_CONFIG_PULL_RESISTOR + #define C21_CONFIG_PULL_RESISTOR 0 + /*!< pull resistor setting. 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ +#endif + +#endif /* __C21_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/CDC1config.h b/TSM_PicoW_Sensor/McuLib/config/CDC1config.h new file mode 100644 index 0000000..00a8a20 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/CDC1config.h @@ -0,0 +1,24 @@ +/** + * \file + * \brief Configuration header file for USB CDC + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the USB CDC module. + */ + +#ifndef __CDC1_CONFIG_H +#define __CDC1_CONFIG_H + + +#ifndef CDC1_CONFIG_USE_TIMEOUT + #define CDC1_CONFIG_USE_TIMEOUT 1 + /*!< 1: Use timeout; 0: do not use timeout */ +#endif + +#ifndef CDC1_CONFIG_APP_TASK_TIMEOUT_MS + #define CDC1_CONFIG_APP_TASK_TIMEOUT_MS 20 + /*!< App Task timeout in milliseconds, 0 to disable timeout */ +#endif + +#endif /* __CDC1_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/Clock1config.h b/TSM_PicoW_Sensor/McuLib/config/Clock1config.h new file mode 100644 index 0000000..e84b452 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/Clock1config.h @@ -0,0 +1,87 @@ +/** + * \file + * \brief Configuration header file for SDK_BitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SDK Bit I/O module. + */ + +#ifndef __Clock1_CONFIG_H +#define __Clock1_CONFIG_H + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_MCUXPRESSO_2_0 + #include "pin_mux.h" /* include pin muxing header file */ + + #if defined(BOARD_INITPINS_Clock1_PIN) + #define Clock1_CONFIG_PIN_NUMBER BOARD_INITPINS_Clock1_PIN + #endif + #if defined(BOARD_INITPINS_Clock1_GPIO) + #define Clock1_CONFIG_GPIO_NAME BOARD_INITPINS_Clock1_GPIO + #endif + #if defined(BOARD_INITPINS_Clock1_PORT) + #define Clock1_CONFIG_PORT_NAME BOARD_INITPINS_Clock1_PORT + #endif +#endif + +#ifndef Clock1_CONFIG_PORT_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define Clock1_CONFIG_PORT_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define Clock1_CONFIG_PORT_NAME 0 + #else /* name from properties */ + #define Clock1_CONFIG_PORT_NAME PORTA + #endif + /*!< name of PORT, is pointer to PORT_Type */ +#endif + +#ifndef Clock1_CONFIG_GPIO_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define Clock1_CONFIG_GPIO_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define Clock1_CONFIG_GPIO_NAME GPIO + #elif McuLib_CONFIG_CPU_IS_KINETIS && McuLib_CONFIG_IS_KINETIS_KE + #define Clock1_CONFIG_GPIO_NAME 0 + #elif McuLib_CONFIG_CPU_IS_MCX + #define Clock1_CONFIG_GPIO_NAME GPIO0 + #else /* name from properties */ + #define Clock1_CONFIG_GPIO_NAME GPIOA + #endif + /*!< name of GPIO, is pointer to GPIO_Type, not used for S32K SDK */ +#endif + +#ifndef Clock1_CONFIG_PIN_NUMBER + #define Clock1_CONFIG_PIN_NUMBER 0u + /*!< number of pin, type unsigned integer */ +#endif + +#ifndef Clock1_CONFIG_PIN_SYMBOL + #define Clock1_CONFIG_PIN_SYMBOL LED_RED + /*!< symbolic name for pin, used for NXP SDK V1.3 */ +#endif + +#ifndef Clock1_CONFIG_INIT_PIN_VALUE + #define Clock1_CONFIG_INIT_PIN_VALUE 0 + /*!< 0: Pin data is initialized with 0 (low); 1: pin value is initialized with 1 (high) */ +#endif + +/* different types of pin direction settings */ +#define Clock1_CONFIG_INIT_PIN_DIRECTION_NONE (0) +#define Clock1_CONFIG_INIT_PIN_DIRECTION_INPUT (1) +#define Clock1_CONFIG_INIT_PIN_DIRECTION_OUTPUT (2) + +#ifndef Clock1_CONFIG_INIT_PIN_DIRECTION + #define Clock1_CONFIG_INIT_PIN_DIRECTION Clock1_CONFIG_INIT_PIN_DIRECTION_OUTPUT +#endif + +#ifndef Clock1_CONFIG_DO_PIN_MUXING + #define Clock1_CONFIG_DO_PIN_MUXING 0 + /*!< 1: perform pin muxing in Init(), 0: do not do pin muxing */ +#endif + +#ifndef Clock1_CONFIG_PULL_RESISTOR + #define Clock1_CONFIG_PULL_RESISTOR 0 + /*!< pull resistor setting. 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ +#endif + +#endif /* __Clock1_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/DQ1config.h b/TSM_PicoW_Sensor/McuLib/config/DQ1config.h new file mode 100644 index 0000000..b33f1bf --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/DQ1config.h @@ -0,0 +1,87 @@ +/** + * \file + * \brief Configuration header file for SDK_BitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SDK Bit I/O module. + */ + +#ifndef __DQ1_CONFIG_H +#define __DQ1_CONFIG_H + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_MCUXPRESSO_2_0 + #include "pin_mux.h" /* include pin muxing header file */ + + #if defined(BOARD_INITPINS_DQ1_PIN) + #define DQ1_CONFIG_PIN_NUMBER BOARD_INITPINS_DQ1_PIN + #endif + #if defined(BOARD_INITPINS_DQ1_GPIO) + #define DQ1_CONFIG_GPIO_NAME BOARD_INITPINS_DQ1_GPIO + #endif + #if defined(BOARD_INITPINS_DQ1_PORT) + #define DQ1_CONFIG_PORT_NAME BOARD_INITPINS_DQ1_PORT + #endif +#endif + +#ifndef DQ1_CONFIG_PORT_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define DQ1_CONFIG_PORT_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define DQ1_CONFIG_PORT_NAME 0 + #else /* name from properties */ + #define DQ1_CONFIG_PORT_NAME PORTA + #endif + /*!< name of PORT, is pointer to PORT_Type */ +#endif + +#ifndef DQ1_CONFIG_GPIO_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define DQ1_CONFIG_GPIO_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define DQ1_CONFIG_GPIO_NAME GPIO + #elif McuLib_CONFIG_CPU_IS_KINETIS && McuLib_CONFIG_IS_KINETIS_KE + #define DQ1_CONFIG_GPIO_NAME 0 + #elif McuLib_CONFIG_CPU_IS_MCX + #define DQ1_CONFIG_GPIO_NAME GPIO0 + #else /* name from properties */ + #define DQ1_CONFIG_GPIO_NAME GPIOA + #endif + /*!< name of GPIO, is pointer to GPIO_Type, not used for S32K SDK */ +#endif + +#ifndef DQ1_CONFIG_PIN_NUMBER + #define DQ1_CONFIG_PIN_NUMBER 0u + /*!< number of pin, type unsigned integer */ +#endif + +#ifndef DQ1_CONFIG_PIN_SYMBOL + #define DQ1_CONFIG_PIN_SYMBOL OneWireData + /*!< symbolic name for pin, used for NXP SDK V1.3 */ +#endif + +#ifndef DQ1_CONFIG_INIT_PIN_VALUE + #define DQ1_CONFIG_INIT_PIN_VALUE 0 + /*!< 0: Pin data is initialized with 0 (low); 1: pin value is initialized with 1 (high) */ +#endif + +/* different types of pin direction settings */ +#define DQ1_CONFIG_INIT_PIN_DIRECTION_NONE (0) +#define DQ1_CONFIG_INIT_PIN_DIRECTION_INPUT (1) +#define DQ1_CONFIG_INIT_PIN_DIRECTION_OUTPUT (2) + +#ifndef DQ1_CONFIG_INIT_PIN_DIRECTION + #define DQ1_CONFIG_INIT_PIN_DIRECTION DQ1_CONFIG_INIT_PIN_DIRECTION_INPUT +#endif + +#ifndef DQ1_CONFIG_DO_PIN_MUXING + #define DQ1_CONFIG_DO_PIN_MUXING 0 + /*!< 1: perform pin muxing in Init(), 0: do not do pin muxing */ +#endif + +#ifndef DQ1_CONFIG_PULL_RESISTOR + #define DQ1_CONFIG_PULL_RESISTOR 0 + /*!< pull resistor setting. 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ +#endif + +#endif /* __DQ1_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/DbgRd1config.h b/TSM_PicoW_Sensor/McuLib/config/DbgRd1config.h new file mode 100644 index 0000000..c3fa3a2 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/DbgRd1config.h @@ -0,0 +1,87 @@ +/** + * \file + * \brief Configuration header file for SDK_BitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SDK Bit I/O module. + */ + +#ifndef __DbgRd1_CONFIG_H +#define __DbgRd1_CONFIG_H + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_MCUXPRESSO_2_0 + #include "pin_mux.h" /* include pin muxing header file */ + + #if defined(BOARD_INITPINS_DbgRd1_PIN) + #define DbgRd1_CONFIG_PIN_NUMBER BOARD_INITPINS_DbgRd1_PIN + #endif + #if defined(BOARD_INITPINS_DbgRd1_GPIO) + #define DbgRd1_CONFIG_GPIO_NAME BOARD_INITPINS_DbgRd1_GPIO + #endif + #if defined(BOARD_INITPINS_DbgRd1_PORT) + #define DbgRd1_CONFIG_PORT_NAME BOARD_INITPINS_DbgRd1_PORT + #endif +#endif + +#ifndef DbgRd1_CONFIG_PORT_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define DbgRd1_CONFIG_PORT_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define DbgRd1_CONFIG_PORT_NAME 0 + #else /* name from properties */ + #define DbgRd1_CONFIG_PORT_NAME PORTA + #endif + /*!< name of PORT, is pointer to PORT_Type */ +#endif + +#ifndef DbgRd1_CONFIG_GPIO_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define DbgRd1_CONFIG_GPIO_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define DbgRd1_CONFIG_GPIO_NAME GPIO + #elif McuLib_CONFIG_CPU_IS_KINETIS && McuLib_CONFIG_IS_KINETIS_KE + #define DbgRd1_CONFIG_GPIO_NAME 0 + #elif McuLib_CONFIG_CPU_IS_MCX + #define DbgRd1_CONFIG_GPIO_NAME GPIO0 + #else /* name from properties */ + #define DbgRd1_CONFIG_GPIO_NAME GPIOA + #endif + /*!< name of GPIO, is pointer to GPIO_Type, not used for S32K SDK */ +#endif + +#ifndef DbgRd1_CONFIG_PIN_NUMBER + #define DbgRd1_CONFIG_PIN_NUMBER 1u + /*!< number of pin, type unsigned integer */ +#endif + +#ifndef DbgRd1_CONFIG_PIN_SYMBOL + #define DbgRd1_CONFIG_PIN_SYMBOL OneWireDbgRead + /*!< symbolic name for pin, used for NXP SDK V1.3 */ +#endif + +#ifndef DbgRd1_CONFIG_INIT_PIN_VALUE + #define DbgRd1_CONFIG_INIT_PIN_VALUE 0 + /*!< 0: Pin data is initialized with 0 (low); 1: pin value is initialized with 1 (high) */ +#endif + +/* different types of pin direction settings */ +#define DbgRd1_CONFIG_INIT_PIN_DIRECTION_NONE (0) +#define DbgRd1_CONFIG_INIT_PIN_DIRECTION_INPUT (1) +#define DbgRd1_CONFIG_INIT_PIN_DIRECTION_OUTPUT (2) + +#ifndef DbgRd1_CONFIG_INIT_PIN_DIRECTION + #define DbgRd1_CONFIG_INIT_PIN_DIRECTION DbgRd1_CONFIG_INIT_PIN_DIRECTION_OUTPUT +#endif + +#ifndef DbgRd1_CONFIG_DO_PIN_MUXING + #define DbgRd1_CONFIG_DO_PIN_MUXING 0 + /*!< 1: perform pin muxing in Init(), 0: do not do pin muxing */ +#endif + +#ifndef DbgRd1_CONFIG_PULL_RESISTOR + #define DbgRd1_CONFIG_PULL_RESISTOR 0 + /*!< pull resistor setting. 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ +#endif + +#endif /* __DbgRd1_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/Input1config.h b/TSM_PicoW_Sensor/McuLib/config/Input1config.h new file mode 100644 index 0000000..067f17d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/Input1config.h @@ -0,0 +1,87 @@ +/** + * \file + * \brief Configuration header file for SDK_BitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SDK Bit I/O module. + */ + +#ifndef __Input1_CONFIG_H +#define __Input1_CONFIG_H + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_MCUXPRESSO_2_0 + #include "pin_mux.h" /* include pin muxing header file */ + + #if defined(BOARD_INITPINS_Input1_PIN) + #define Input1_CONFIG_PIN_NUMBER BOARD_INITPINS_Input1_PIN + #endif + #if defined(BOARD_INITPINS_Input1_GPIO) + #define Input1_CONFIG_GPIO_NAME BOARD_INITPINS_Input1_GPIO + #endif + #if defined(BOARD_INITPINS_Input1_PORT) + #define Input1_CONFIG_PORT_NAME BOARD_INITPINS_Input1_PORT + #endif +#endif + +#ifndef Input1_CONFIG_PORT_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define Input1_CONFIG_PORT_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define Input1_CONFIG_PORT_NAME 0 + #else /* name from properties */ + #define Input1_CONFIG_PORT_NAME PORTA + #endif + /*!< name of PORT, is pointer to PORT_Type */ +#endif + +#ifndef Input1_CONFIG_GPIO_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define Input1_CONFIG_GPIO_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define Input1_CONFIG_GPIO_NAME GPIO + #elif McuLib_CONFIG_CPU_IS_KINETIS && McuLib_CONFIG_IS_KINETIS_KE + #define Input1_CONFIG_GPIO_NAME 0 + #elif McuLib_CONFIG_CPU_IS_MCX + #define Input1_CONFIG_GPIO_NAME GPIO0 + #else /* name from properties */ + #define Input1_CONFIG_GPIO_NAME GPIOA + #endif + /*!< name of GPIO, is pointer to GPIO_Type, not used for S32K SDK */ +#endif + +#ifndef Input1_CONFIG_PIN_NUMBER + #define Input1_CONFIG_PIN_NUMBER 0u + /*!< number of pin, type unsigned integer */ +#endif + +#ifndef Input1_CONFIG_PIN_SYMBOL + #define Input1_CONFIG_PIN_SYMBOL LED_RED + /*!< symbolic name for pin, used for NXP SDK V1.3 */ +#endif + +#ifndef Input1_CONFIG_INIT_PIN_VALUE + #define Input1_CONFIG_INIT_PIN_VALUE 0 + /*!< 0: Pin data is initialized with 0 (low); 1: pin value is initialized with 1 (high) */ +#endif + +/* different types of pin direction settings */ +#define Input1_CONFIG_INIT_PIN_DIRECTION_NONE (0) +#define Input1_CONFIG_INIT_PIN_DIRECTION_INPUT (1) +#define Input1_CONFIG_INIT_PIN_DIRECTION_OUTPUT (2) + +#ifndef Input1_CONFIG_INIT_PIN_DIRECTION + #define Input1_CONFIG_INIT_PIN_DIRECTION Input1_CONFIG_INIT_PIN_DIRECTION_INPUT +#endif + +#ifndef Input1_CONFIG_DO_PIN_MUXING + #define Input1_CONFIG_DO_PIN_MUXING 0 + /*!< 1: perform pin muxing in Init(), 0: do not do pin muxing */ +#endif + +#ifndef Input1_CONFIG_PULL_RESISTOR + #define Input1_CONFIG_PULL_RESISTOR 0 + /*!< pull resistor setting. 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ +#endif + +#endif /* __Input1_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/InputRB1config.h b/TSM_PicoW_Sensor/McuLib/config/InputRB1config.h new file mode 100644 index 0000000..7f85981 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/InputRB1config.h @@ -0,0 +1,25 @@ +/** + * \file + * \brief Configuration header file for RingBuffer. + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Ring Buffer module. + */ + +#ifndef __InputRB1_CONFIG_H +#define __InputRB1_CONFIG_H + +#ifndef InputRB1_CONFIG_REENTRANT + #define InputRB1_CONFIG_REENTRANT 1 /* 1: reentrant implementation; 0: non-reentrant implementation */ +#endif + +#ifndef InputRB1_CONFIG_BUF_SIZE + #define InputRB1_CONFIG_BUF_SIZE 10 /* number of elements in the buffer */ +#endif + +#ifndef InputRB1_CONFIG_ELEM_SIZE + #define InputRB1_CONFIG_ELEM_SIZE 1 /* size of a single element in bytes */ +#endif + +#endif /* __InputRB1_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuArmToolsconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuArmToolsconfig.h new file mode 100644 index 0000000..6e63c46 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuArmToolsconfig.h @@ -0,0 +1,45 @@ +/** + * \file + * \brief Configuration header file for Kinetis Tools (or ARM in general) + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the ARM Tools module. + */ + +#ifndef __McuArmTools_CONFIG_H +#define __McuArmTools_CONFIG_H + +#if !defined(McuArmTools_CONFIG_PARSE_COMMAND_ENABLED) + #define McuArmTools_CONFIG_PARSE_COMMAND_ENABLED (1) + /*!< 1: shell support enabled, 0: otherwise */ +#endif + +#if McuLib_CONFIG_NXP_SDK_2_0_USED + /* will include system header file in the implementation file */ +#elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_KINETIS_1_3 + /* will include system header file in the implementation file */ +#elif McuLib_CONFIG_CPU_IS_ARM_CORTEX_M + /* include here the low level CMSIS header files, e.g. with */ + #if McuLib_CONFIG_CPU_IS_STM32 + #include "stm32f3xx_hal.h" /* header file for STM32F303K8 */ + #elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_NORDIC_NRF5 + #include "nrf.h" + #endif +#endif + +#ifndef McuArmTools_CONFIG_STACK_CHECK_PATTERN + #define McuArmTools_CONFIG_STACK_CHECK_PATTERN (0xdeadbeef) + /*!< Byte pattern on stack, to mark it is 'unused' */ +#endif + +/* The two symbols below shall be set by the linker script file to mark top and bottom of stack. Note that the two addresses need to be 32bit aligned! */ +#ifndef McuArmTools_CONFIG_LINKER_SYMBOL_STACK_TOP + #define McuArmTools_CONFIG_LINKER_SYMBOL_STACK_TOP _vStackTop +#endif + +#ifndef McuArmTools_CONFIG_LINKER_SYMBOL_STACK_BASE + #define McuArmTools_CONFIG_LINKER_SYMBOL_STACK_BASE _vStackBase +#endif + +#endif /* __McuArmTools_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuBitIOconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuBitIOconfig.h new file mode 100644 index 0000000..28e47ff --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuBitIOconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GenericBitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Generic Bit I/O module. + */ + +#ifndef __McuBitIO_CONFIG_H +#define __McuBitIO_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuBitIO_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuButtonconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuButtonconfig.h new file mode 100644 index 0000000..c6e9d79 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuButtonconfig.h @@ -0,0 +1,30 @@ +/*! + * Copyright (c) 2019, Erich Styger + * All rights reserved. + * + * Configuration header file for McuButton + * + * SPDX-License-Identifier: BSD-3-Clause + * \file + * \brief Configuration items for the McuButton module. + */ + +#ifndef MCUBUTTON_CONFIG_H_ +#define MCUBUTTON_CONFIG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "McuLibconfig.h" + +#ifndef MCUBUTTON_CONFIG_USE_FREERTOS_HEAP + #define MCUBUTTON_CONFIG_USE_FREERTOS_HEAP (McuLib_CONFIG_SDK_USE_FREERTOS) + /*!< 1: use FreeRTOS Heap (default), 0: use stdlib malloc() and free() */ +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MCUBUTTON_CONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuCoverageconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuCoverageconfig.h new file mode 100644 index 0000000..471741f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuCoverageconfig.h @@ -0,0 +1,22 @@ +/*! + * Copyright (c) 2024, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * + * \brief Configuration header file for the McuCoverage module. + */ + +#ifndef MCUCOVERAGECONFIG_H_ +#define MCUCOVERAGECONFIG_H_ + +#ifndef McuCoverage_CONFIG_IS_ENABLED + #define McuCoverage_CONFIG_IS_ENABLED (0) + /*!< 1: Module is enabled; 0: Module is disabled, not adding anything to the application code */ +#endif + +#ifndef McuCoverage_CONFIG_USE_FREESTANDING + #define McuCoverage_CONFIG_USE_FREESTANDING (0 && McuCoverage_CONFIG_IS_ENABLED) + /*!< 1: Implementation using a freestanding environment; 0: No freestanding environment */ +#endif + +#endif /* MCUCOVERAGECONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuCriticalSectionconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuCriticalSectionconfig.h new file mode 100644 index 0000000..ffa2f55 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuCriticalSectionconfig.h @@ -0,0 +1,27 @@ +/** + * \file + * \brief Configuration header file for CriticalSection + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the CriticalSection module. + */ + +#ifndef __McuCriticalSection_CONFIG_H +#define __McuCriticalSection_CONFIG_H + +/* select ONE of the following implementation methods: */ +#ifndef McuCriticalSection_CONFIG_USE_RTOS_CRITICAL_SECTION + #define McuCriticalSection_CONFIG_USE_RTOS_CRITICAL_SECTION 0 /* 1: use FreeRTOS critical section; 0: don't use FreeRTOS critical sections */ +#endif + +#ifndef McuCriticalSection_CONFIG_USE_CUSTOM_CRITICAL_SECTION + #define McuCriticalSection_CONFIG_USE_CUSTOM_CRITICAL_SECTION 1 /* 1: Custom implementation (supported for GNU and ARM!); 0: don't use custom implementation */ +#endif + +#ifndef McuCriticalSection_CONFIG_USE_PEX_DEFAULT + #define McuCriticalSection_CONFIG_USE_PEX_DEFAULT 0 /* 1: use Processor Expert default; 0: use alternative implementation */ +#endif + +#endif /* __McuCriticalSection_CONFIG_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/config/McuDS18B20config.h b/TSM_PicoW_Sensor/McuLib/config/McuDS18B20config.h new file mode 100644 index 0000000..0375bad --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuDS18B20config.h @@ -0,0 +1,37 @@ +/** + * \file + * \brief Configuration header file for DS18B20 + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the DS128B20 1-Wire temperature sensor. + */ + +#ifndef __McuDS18B20_CONFIG_H +#define __McuDS18B20_CONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define McuDS18B20_CONFIG_NUMBER_OF_SENSORS (1) + /*!< Number of devices (1-n) */ + +#define McuDS18B20_CONFIG_MULTIPLE_BUS_DEVICES (0) + /*!< 1: there are multiple devices on the bus, need to use ROM code to address them; 0: single device on the 1-Wire bus */ + +#ifndef McuDS18B20_CONFIG_READ_AUTO + #define McuDS18B20_CONFIG_READ_AUTO (1) + /*!< 1: automatic mode, temperature is read from sensor during StartConversion(). 0: Call ReadTemperature() after starting a conversion */ +#endif + +#if !defined(McuDS18B20_CONFIG_PARSE_COMMAND_ENABLED) + #define McuDS18B20_CONFIG_PARSE_COMMAND_ENABLED (1) + /*!< 1: shell support enabled, 0: otherwise */ +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __McuDS18B20_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuDebounceconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuDebounceconfig.h new file mode 100644 index 0000000..312bdb7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuDebounceconfig.h @@ -0,0 +1,25 @@ +/*! + * Copyright (c) 2019, Erich Styger + * All rights reserved. + * + * Configuration header file for McuDebounce + * + * SPDX-License-Identifier: BSD-3-Clause + * \file + * \brief Configuration items for the McuDebounce module. + */ + +#ifndef MCUDEBOUNCE_CONFIG_H_ +#define MCUDEBOUNCE_CONFIG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* no configuration settings yet */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MCUDEBOUNCE_CONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuEE24config.h b/TSM_PicoW_Sensor/McuLib/config/McuEE24config.h new file mode 100644 index 0000000..4e2d9be --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuEE24config.h @@ -0,0 +1,74 @@ +/** + * \file + * \brief Configuration header file for 24AA_EEPROM + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings the External I2C EEPROM module. + */ + +#ifndef __McuEE24_CONFIG_H +#define __McuEE24_CONFIG_H + +/* actual device */ +#ifndef McuEE24_CONFIG_DEVICE_ID + #define McuEE24_CONFIG_DEVICE_ID 8 + /*!< Supported Device IDs: 8 (24AA08, 24LC08), 16 (24AA16, 24LC16), 32 (24AA32, 24LC32), 256 (24AA256, 24LC256, 24FC256), 512 (24AA512, 24LC512, 24FC256) or 1025 (24AA1025, 24LC1025, 24FC1025) */ +#endif + +#ifndef McuEE24_CONFIG_HAS_WP_PIN + #define McuEE24_CONFIG_HAS_WP_PIN (1) + /*!<< 1: Write Protect Pin available. 0: no Write Protect pin */ +#endif + +#ifndef McuEE24_CONFIG_DEVICE_I2C_ADDRESS_BITS + #define McuEE24_CONFIG_DEVICE_I2C_ADDRESS_BITS (0) + /* Address bits for I2C address, usually formed by the A0, A1 and A3 pins. Admissible range: 0..7 */ +#endif + +#ifndef McuEE24_CONFIG_BLOCK_BUF_SIZE + #define McuEE24_CONFIG_BLOCK_BUF_SIZE (32) + /*!< buffer used for block read/write. Max is 128. Keep it small to reduce stack consumption. */ +#endif + +#ifndef McuEE24_CONFIG_DO_ACKNOWLEDGE_POLLING + #define McuEE24_CONFIG_DO_ACKNOWLEDGE_POLLING (1) + /*!< 1: Perform acknowledge polling in the driver. 0: no acknowledge polling */ +#endif + +#ifndef McuEE24_CONFIG_PAGE_WRITE_TIME_MS + #define McuEE24_CONFIG_PAGE_WRITE_TIME_MS (5) + /*!< Page Write Time as per data sheet, used with McuEE24_CONFIG_DO_ACKNOWLEDGE_POLLING */ +#endif + +#ifndef McuEE24_CONFIG_ACK_POLLING_TIME_US + #define McuEE24_CONFIG_ACK_POLLING_TIME_US (100) + /*!< Acknowledge polling time in the I2C driver, used with McuEE24_CONFIG_DO_ACKNOWLEDGE_POLLING */ +#endif + +#ifndef McuEE24_CONFIG_USE_TIMEOUT + #define McuEE24_CONFIG_USE_TIMEOUT (1) + /*!< 1: use timeout, 0: do not use timeout */ +#endif + +#ifndef McuEE24_CONFIG_TIMEOUT_BYTE_MS + #define McuEE24_CONFIG_TIMEOUT_BYTE_MS (10) + /*!< number of milli seconds for timeout using byte write */ +#endif + +#ifndef McuEE24_CONFIG_TIMEOUT_BLOCK_MS + #define McuEE24_CONFIG_TIMEOUT_BLOCK_MS (60) + /*!< number of milliseconds for timeout using for block write */ +#endif + +#ifndef McuEE24_CONFIG_USE_SHELL + #define McuEE24_CONFIG_USE_SHELL (1) + /*!< 1: use shell, 0: do not use shell */ +#endif + +#ifndef McuEE24_CONFIG_USE_UTILITY + #define McuEE24_CONFIG_USE_UTILITY (1) + /*!< 1: use utility module, 0: do not use utility module */ +#endif + +#endif /* __McuEE24_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuESP32config.h b/TSM_PicoW_Sensor/McuLib/config/McuESP32config.h new file mode 100644 index 0000000..3da69fc --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuESP32config.h @@ -0,0 +1,78 @@ +/*! + * Copyright (c) 2021, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * \file + * \brief Configuration items for the McuESP32 module. + */ + +#ifndef MCUESP32CONFIG_H_ +#define MCUESP32CONFIG_H_ + +#ifndef McuESP32_CONFIG_USE_USB_CDC + #define McuESP32_CONFIG_USE_USB_CDC (0) + /*!< 1: using USB CDC gateway for programming; 0: do not use USB CDC */ +#endif + +#ifndef McuESP32_CONFIG_USE_CTRL_PINS + #define McuESP32_CONFIG_USE_CTRL_PINS (0) + /*!< 1: Using RST and BL signals to load software; 0: only using the UART */ +#endif + +#ifndef McuESP32_CONFIG_VERBOSE_CONTROL_SIGNALS + #define McuESP32_CONFIG_VERBOSE_CONTROL_SIGNALS (0 && McuESP32_CONFIG_USE_CTRL_PINS) + /* if status of control signals shall be printed on McuLog channel */ +#endif + +#if McuESP32_CONFIG_USE_CTRL_PINS + /* control signal pin definition */ + #ifndef McuESP32_CONFIG_EN_GPIO + #define McuESP32_CONFIG_EN_GPIO GPIOA + #endif + #ifndef McuESP32_CONFIG_EN_PORT + #define McuESP32_CONFIG_EN_PORT PORTA + #endif + #ifndef McuESP32_CONFIG_EN_PIN + #define McuESP32_CONFIG_EN_PIN 12 + #endif + + #ifndef McuESP32_CONFIG_RST_GPIO + #define McuESP32_CONFIG_RST_GPIO GPIOA + #endif + #ifndef McuESP32_CONFIG_RST_PORT + #define McuESP32_CONFIG_RST_PORT PORTA + #endif + #ifndef McuESP32_CONFIG_RST_PIN + #define McuESP32_CONFIG_RST_PIN 5 + #endif +#endif + +#include "McuShellUartconfig.h" + +/* UART used with ESP32: assign one of the McuShell UART to enable it */ +#ifndef McuESP32_CONFIG_SHELL_UART + #define McuESP32_CONFIG_SHELL_UART McuShellUart_CONFIG_UART_NONE +#endif + +/* UART connection to the ESP32 */ +#if (McuESP32_CONFIG_SHELL_UART==McuShellUart_CONFIG_UART_K22FX512_UART1_E1_E0) \ + || (McuESP32_CONFIG_SHELL_UART==McuShellUart_CONFIG_UART_K22FN512_UART1_E1_E0) + #include "fsl_uart.h" + #define McuESP32_CONFIG_UART_DEVICE UART1 + #define McuESP32_CONFIG_UART_SET_UART_CLOCK() /* nothing needed */ + #define McuESP32_CONFIG_UART_WRITE_BLOCKING UART_WriteBlocking + #define McuESP32_CONFIG_UART_GET_FLAGS UART_GetStatusFlags + #define McuESP32_CONFIG_UART_HW_RX_READY_FLAGS (kUART_RxDataRegFullFlag|kUART_RxOverrunFlag) + #define McuESP32_CONFIG_UART_READ_BYTE UART_ReadByte + #define McuESP32_CONFIG_UART_CONFIG_STRUCT uart_config_t + #define McuESP32_CONFIG_UART_GET_DEFAULT_CONFIG UART_GetDefaultConfig + #define McuESP32_CONFIG_UART_ENABLE_INTERRUPTS UART_EnableInterrupts + #define McuESP32_CONFIG_UART_ENABLE_INTERRUPT_FLAGS (kUART_RxDataRegFullInterruptEnable | kUART_RxOverrunInterruptEnable) + #define McuESP32_CONFIG_UART_IRQ_NUMBER UART1_RX_TX_IRQn + #define McuESP32_CONFIG_UART_INIT UART_Init + #define McuESP32_CONFIG_UART_GET_CLOCK_FREQ_SELECT kCLOCK_CoreSysClk + #define McuESP32_CONFIG_UART_IRQ_HANDLER UART1_RX_TX_IRQHandler + #define McuESP32_CONFIG_UART_BAUDRATE 115200 +#endif + +#endif /* MCUESP32CONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuEventsconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuEventsconfig.h new file mode 100644 index 0000000..d6181c1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuEventsconfig.h @@ -0,0 +1,31 @@ +/** + * \file + * \brief Configuration header file for SimpleEvents + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SimpleEvents module. + */ + +#ifndef __McuEvents_CONFIG_H +#define __McuEvents_CONFIG_H + +#ifndef McuEvents_CONFIG_USE_EVENT_HANDLER + #define McuEvents_CONFIG_USE_EVENT_HANDLER (1) + /*!< 1: Use Event handler; 0: Do not use Event Handler */ +#endif + +#ifndef McuEvents_CONFIG_EVENT_HANDLER_NAME + #define McuEvents_CONFIG_EVENT_HANDLER_NAME McuEvents_AppHandleEvent + /*!< Name of event handler, of type 'void FunctionName(uint8_t event)' */ +#endif + +/*! List of events */ +#define McuEvents_INIT /* Example event */ 0 + +#ifndef McuEvents_CONFIG_NOF_EVENTS + #define McuEvents_CONFIG_NOF_EVENTS 1 + /*!< Number of events supported */ +#endif + +#endif /* __McuEvents_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuExtRTCconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuExtRTCconfig.h new file mode 100644 index 0000000..1aea329 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuExtRTCconfig.h @@ -0,0 +1,32 @@ +/** + * \file + * \brief Configuration header file for external I2C RTC devices + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings the External I2C RTC module. + */ + +#ifndef __McuExtRTC_CONFIG_H +#define __McuExtRTC_CONFIG_H + +#ifndef McuExtRTC_CONFIG_DEVICE + #define McuExtRTC_CONFIG_DEVICE 3232 /* DS1307, DS3231, DS3232 or DS1342 */ +#endif + +/* I2C address of the device on the bus: */ +#ifndef McuExtRTC_CONFIG_DEVICE_ADDRESS + #if McuExtRTC_CONFIG_DEVICE==3231 + #define McuExtRTC_CONFIG_DEVICE_ADDRESS 0x68 /* I2C DS3232 device address */ + #elif McuExtRTC_CONFIG_DEVICE==3232 + #define McuExtRTC_CONFIG_DEVICE_ADDRESS 0x68 /* I2C DS3232 device address */ + #elif McuExtRTC_CONFIG_DEVICE==1307 + #define McuExtRTC_CONFIG_DEVICE_ADDRESS 0x68 /* I2C DS1307 device address */ + #elif McuExtRTC_CONFIG_DEVICE==1342 + #define McuExtRTC_CONFIG_DEVICE_ADDRESS 0x68 /* I2C DS1342 device address */ + #else + #error "Unknown device" + #endif +#endif + +#endif /* __McuExtRTC_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuFXOS8700config.h b/TSM_PicoW_Sensor/McuLib/config/McuFXOS8700config.h new file mode 100644 index 0000000..c63de06 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuFXOS8700config.h @@ -0,0 +1,42 @@ +/** + * \file + * \brief Configuration header file for FXOS8700CQ accelerometer + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the FXOS8700CQ module. + */ + +#ifndef __McuFXOS8700_CONFIG_H +#define __McuFXOS8700_CONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(McuFXOS8700_CONFIG_I2C_DEVICE_ADDRESS) + #define McuFXOS8700_CONFIG_I2C_DEVICE_ADDRESS (0x1E) + /*!< I2C 7bit device address */ + /* SDA0 SDA1 + 0x1E low low + 0x1D high low + 0x1C low high + 0x1F high high + */ +#endif + +#if !defined(McuFXOS8700_CONFIG_TEMP_OFFSET) + #define McuFXOS8700_CONFIG_TEMP_OFFSET (24) + /*!< die temperature offset for real temperature calculation */ +#endif + +#if !defined(McuFXOS8700_CONFIG_PARSE_COMMAND_ENABLED) + #define McuFXOS8700_CONFIG_PARSE_COMMAND_ENABLED 1 + /*!< 1: shell support enabled, 0: otherwise */ +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __McuFXOS8700_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuFlashconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuFlashconfig.h new file mode 100644 index 0000000..78a951c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuFlashconfig.h @@ -0,0 +1,40 @@ +/*! + * Copyright (c) 2021, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * \file + * \brief Configuration items for the McuFlash module. + */ + +#ifndef MCUFLASHCONFIG_H_ +#define MCUFLASHCONFIG_H_ + +#include "McuLib.h" + +#ifndef McuFlash_CONFIG_IS_ENABLED + #define McuFlash_CONFIG_IS_ENABLED (0) + /*!< if the module MucFlash is enabled or not: 1: enabled; 0: disabled */ +#endif + +#ifndef McuFlash_CONFIG_LOGGING_TRACE + #define McuFlash_CONFIG_LOGGING_TRACE (0) + /*!< 1: extra trace logging: 0: no extra trace logging */ +#endif + +#ifndef McuFlash_CONFIG_FLASH_BLOCK_SIZE +#if McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC845 + #define McuFlash_CONFIG_FLASH_BLOCK_SIZE (0x400) +#elif McuLib_CONFIG_CPU_IS_LPC55xx + #define McuFlash_CONFIG_FLASH_BLOCK_SIZE (0x200) +#elif McuLib_CONFIG_CPU_IS_KINETIS + #define McuFlash_CONFIG_FLASH_BLOCK_SIZE (0x800) +#elif McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_RP2040 + #include "hardware/flash.h" + #define McuFlash_CONFIG_FLASH_BLOCK_SIZE (0x1000) /* size of block which can be erased, 4K on RP2040 */ +#else /* default */ + #define McuFlash_CONFIG_FLASH_BLOCK_SIZE (0x400) +#endif + /*!< size of a flash page, FLASH_GetProperty(&s_flashDriver, kFLASH_PropertyPflash0SectorSize, &pflashSectorSize) */ +#endif + +#endif /* MCUFLASHCONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuFontDisplayconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuFontDisplayconfig.h new file mode 100644 index 0000000..356208c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuFontDisplayconfig.h @@ -0,0 +1,14 @@ +/** + * \file + * \brief Configuration header file for FontDisplay + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Font Display module. + */ +#ifndef __McuFontDisplay_CONFIG_H +#define __McuFontDisplay_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontDisplay_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuGDisplaySSD1306config.h b/TSM_PicoW_Sensor/McuLib/config/McuGDisplaySSD1306config.h new file mode 100644 index 0000000..43df59a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuGDisplaySSD1306config.h @@ -0,0 +1,80 @@ +/** + * \file + * \brief Configuration header file for GDisplay + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the GDisplay module. + */ + +#ifndef __McuGDisplaySSD1306_CONFIG_H +#define __McuGDisplaySSD1306_CONFIG_H + +#ifndef McuGDisplaySSD1306_CONFIG_DISPLAY_MODULE_NAME + #define McuGDisplaySSD1306_CONFIG_DISPLAY_MODULE_NAME McuSSD1306 + /*!< Symbol name used for module */ +#endif + +#ifndef McuGDisplaySSD1306_CONFIG_DISPLAY_HEADER_FILE + #define McuGDisplaySSD1306_CONFIG_DISPLAY_HEADER_FILE "McuSSD1306.h" + /*!< Header file to be included as interface to the display */ +#endif +#include McuGDisplaySSD1306_CONFIG_DISPLAY_HEADER_FILE /* include LCD interface */ + +#ifndef McuGDisplaySSD1306_CONFIG_USE_WINDOW_CAPABILITY + #define McuGDisplaySSD1306_CONFIG_USE_WINDOW_CAPABILITY (0) + /*!< 1: Use display window capability; 0: No display window capability */ +#endif + +#ifndef McuGDisplaySSD1306_CONFIG_USE_DOUBLE_BUFFER + #define McuGDisplaySSD1306_CONFIG_USE_DOUBLE_BUFFER (1) + /*!< 1: Use double-buffering for display memory in RAM; 0: No display double-buffering */ +#endif + +#if McuGDisplaySSD1306_CONFIG_USE_WINDOW_CAPABILITY + #define McuGDisplaySSD1306_CONFIG_FCT_NAME_OPENWINDOW McuSSD1306_OpenWindow + #define McuGDisplaySSD1306_CONFIG_FCT_NAME_WRITEPIXEL McuSSD1306_WritePixel + #define McuGDisplaySSD1306_CONFIG_FCT_NAME_CLOSEWINDOW McuSSD1306_CloseWindow +#else + #define McuGDisplaySSD1306_CONFIG_FCT_NAME_PUTPIXEL McuSSD1306_PutPixel +#endif +#if McuGDisplaySSD1306_CONFIG_USE_DOUBLE_BUFFER + #define McuGDisplaySSD1306_CONFIG_FCT_NAME_CLEAR_BUFFER McuSSD1306_ClearBuffer +#endif + +#ifndef McuGDisplaySSD1306_CONFIG_USE_DISPLAY_MEMORY_WRITE + #define McuGDisplaySSD1306_CONFIG_USE_DISPLAY_MEMORY_WRITE (0) + /*!< 1: Use display memory write; 0: Do not use display memory write */ +#endif + +#ifndef McuGDisplaySSD1306_CONFIG_INVERTED_PIXEL_COLOR + #define McuGDisplaySSD1306_CONFIG_INVERTED_PIXEL_COLOR (0) + /*!< 1: Invert pixel color; 0: Do not invert pixel color */ +#endif + +#ifndef McuGDisplaySSD1306_CONFIG_NOF_BITS_PER_PIXEL + #define McuGDisplaySSD1306_CONFIG_NOF_BITS_PER_PIXEL (1) + /*!< Number of bits per pixel */ +#endif + +#ifndef McuGDisplaySSD1306_CONFIG_CLEAR_DISPLAY_IN_INIT + #define McuGDisplaySSD1306_CONFIG_CLEAR_DISPLAY_IN_INIT (0) + /*!< 1: clear display during Init(); 0: do not clear display. */ +#endif + +#ifndef McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING + #define McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING (0) + #define McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING_OnGet OnGetDisplay + #define McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING_OnGive OnGiveDisplay + /*!< 1: Share display and generate OnGetDisplay() and OnGiveDisplay() events. 0: do not share display */ +#endif +/* prototypes */ +extern void McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING_OnGet(void); /* called at the start of display critical section */ +extern void McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING_OnGive(void); /* called at the end of the display critical section */ + +#ifndef McuGDisplaySSD1306_CONFIG_USE_MUTEX + #define McuGDisplaySSD1306_CONFIG_USE_MUTEX (0) + /*!< 1: use RTOS mutex for mutual access to display. 0: do not use mutex */ +#endif + +#endif /* __McuGDisplaySSD1306_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuGFontconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuGFontconfig.h new file mode 100644 index 0000000..d7be80b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuGFontconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuGFont_CONFIG_H +#define __McuGFont_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuGFont_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuGPIOconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuGPIOconfig.h new file mode 100644 index 0000000..8e4f4c7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuGPIOconfig.h @@ -0,0 +1,29 @@ +/*! + * Copyright (c) 2019, Erich Styger + * All rights reserved. + * + * \file + * \brief Configuration header file for McuGPIO + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MCUGPIO_CONFIG_H_ +#define MCUGPIO_CONFIG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "McuLibconfig.h" + +#ifndef MCUGPIO_CONFIG_USE_FREERTOS_HEAP + #define MCUGPIO_CONFIG_USE_FREERTOS_HEAP (McuLib_CONFIG_SDK_USE_FREERTOS) + /*!< 1: use FreeRTOS Heap (default), 0: use stdlib malloc() and free() */ +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MCUGPIOCONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuGenericI2Cconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuGenericI2Cconfig.h new file mode 100644 index 0000000..6fb2655 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuGenericI2Cconfig.h @@ -0,0 +1,97 @@ +/** + * \file + * \brief Configuration header file for GenericI2C + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Generic I2C module. + */ + +#ifndef __McuGenericI2C_CONFIG_H +#define __McuGenericI2C_CONFIG_H + +#include "McuLibconfig.h" + +#if !defined(McuGenericI2C_CONFIG_USE_ON_REQUEST_BUS_EVENT) + #define McuGenericI2C_CONFIG_USE_ON_REQUEST_BUS_EVENT (0) + /*!< 1: generate user events for requesting bus; 0: no user events */ + #define McuGenericI2C_CONFIG_ON_REQUEST_BUS_EVENT McuGenericI2C_OnRequestBus + void McuGenericI2C_CONFIG_ON_REQUEST_BUS_EVENT(void); /* prototype */ +#endif + +#if !defined(McuGenericI2C_CONFIG_USE_ON_RELEASE_BUS_EVENT) + #define McuGenericI2C_CONFIG_USE_ON_RELEASE_BUS_EVENT (0) + /*!< 1: generate user events for releasing bus; 0: no user events */ + #define McuGenericI2C_CONFIG_ON_RELEASE_BUS_EVENT McuGenericI2C_OnReleaseBus + void McuGenericI2C_CONFIG_ON_RELEASE_BUS_EVENT(void); /* prototype */ +#endif + +#if !defined(McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT) + #define McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT (0) + /*!< 1: generate user events for errors; 0: no error events */ + #define McuGenericI2C_CONFIG_ON_ERROR_EVENT McuGenericI2C_OnError + void McuGenericI2C_CONFIG_ON_ERROR_EVENT(void); /* prototype */ +#endif + +#if !defined(McuGenericI2C_CONFIG_USE_MUTEX) + #define McuGenericI2C_CONFIG_USE_MUTEX (0 && McuLib_CONFIG_SDK_USE_FREERTOS) + /*!< 1: Use a mutex to protect access to the bus; 0: no mutex used */ +#endif + +#if !defined(McuGenericI2C_CONFIG_USE_TIMEOUT) + #define McuGenericI2C_CONFIG_USE_TIMEOUT (0) + /*!< 1: Use a timeout in case problems; 0: do not use a timeout */ +#endif + +#if !defined(McuGenericI2C_CONFIG_TIMEOUT_US) + #define McuGenericI2C_CONFIG_TIMEOUT_US ((uint32_t)500) /* number of microseconds as specified in properties used for timeout */ +#endif + +#if !defined(McuGenericI2C_CONFIG_WRITE_BUFFER_SIZE) + #define McuGenericI2C_CONFIG_WRITE_BUFFER_SIZE (32) + /*!< Size of the write buffer size which defines the maximum block size which can be sent */ +#endif + +#if !defined(McuGenericI2C_CONFIG_SUPPORT_STOP_NO_START) + #define McuGenericI2C_CONFIG_SUPPORT_STOP_NO_START (0) + /*!< 1: send a STOP condition without sending a new START condition. Currently only supported for the GenericSWI2C component. 0: send a STOP for every START */ +#endif + +/* configuration of function names used for low level I2C functions */ +#ifndef McuGenericI2C_CONFIG_INTERFACE_HEADER_FILE + #define McuGenericI2C_CONFIG_INTERFACE_HEADER_FILE "McuGenericSWI2C.h" +#endif +#include McuGenericI2C_CONFIG_INTERFACE_HEADER_FILE /* interface of low level I2C driver */ + +#ifndef McuGenericI2C_CONFIG_RECV_BLOCK + #define McuGenericI2C_CONFIG_RECV_BLOCK McuGenericSWI2C_RecvBlock +#endif + +#ifndef McuGenericI2C_CONFIG_SEND_BLOCK + #define McuGenericI2C_CONFIG_SEND_BLOCK McuGenericSWI2C_SendBlock +#endif + +#if McuGenericI2C_CONFIG_SUPPORT_STOP_NO_START + #ifndef McuGenericI2C_CONFIG_SEND_BLOCK_CONTINUE + #define McuGenericI2C_CONFIG_SEND_BLOCK_CONTINUE McuGenericSWI2C_SendBlockContinue + #endif +#endif + +#ifndef McuGenericI2C_CONFIG_SEND_STOP + #define McuGenericI2C_CONFIG_SEND_STOP McuGenericSWI2C_SendStop +#endif + +#ifndef McuGenericI2C_CONFIG_SELECT_SLAVE + #define McuGenericI2C_CONFIG_SELECT_SLAVE McuGenericSWI2C_SelectSlave +#endif + +#ifndef McuGenericI2C_CONFIG_RECV_BLOCK_CUSTOM + #define McuGenericI2C_CONFIG_RECV_BLOCK_CUSTOM McuGenericSWI2C_RecvBlockCustom +#endif + +#ifndef McuGenericI2C_CONFIG_RECV_BLOCK_CUSTOM_AVAILABLE + #define McuGenericI2C_CONFIG_RECV_BLOCK_CUSTOM_AVAILABLE (defined(McuGenericSWI2C_RECVBLOCKCUSTOM_AVAILABLE) && (McuGenericSWI2C_RECVBLOCKCUSTOM_AVAILABLE)) +#endif + + +#endif /* __McuGenericI2C_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuGenericSWI2Cconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuGenericSWI2Cconfig.h new file mode 100644 index 0000000..af94f0f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuGenericSWI2Cconfig.h @@ -0,0 +1,33 @@ +/** + * \file + * \brief Configuration header file for GenericSWI2C + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the software (bit-banging) I2C module. + */ + +#ifndef __McuGenericSWI2C_CONFIG_H +#define __McuGenericSWI2C_CONFIG_H + +#ifndef McuGenericSWI2C_CONFIG_TIMEOUT_COUNTER_VALUE + #define McuGenericSWI2C_CONFIG_TIMEOUT_COUNTER_VALUE (65535) + /*!< Timeout counter value waiting for a SDA or CLK line change. The higher the value, the longer the timeout */ +#endif + +#ifndef McuGenericSWI2C_CONFIG_DELAY_NS + #define McuGenericSWI2C_CONFIG_DELAY_NS (1250) + /*!< delay time in ns */ +#endif + +#ifndef McuGenericSWI2C_CONFIG_NOF_TRIALS + #define McuGenericSWI2C_CONFIG_NOF_TRIALS (256) + /*!< number of trials */ +#endif + +#ifndef McuGenericSWI2C_CONFIG_DO_YIELD + #define McuGenericSWI2C_CONFIG_DO_YIELD (0) + /*!< 1: if RTOS present, do a yield. 0: do not yield during waiting */ +#endif + +#endif /* __McuGenericSWI2C_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuGenericSWSPIconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuGenericSWSPIconfig.h new file mode 100644 index 0000000..e394921 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuGenericSWSPIconfig.h @@ -0,0 +1,25 @@ +/** + * \file + * \brief Configuration header file for GenericSWSPI + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the software (bit-banging) SPI module. + */ + +#ifndef __McuGenericSWSPI_CONFIG_H +#define __McuGenericSWSPI_CONFIG_H + +#ifndef McuGenericSWSPI_CONFIG_CLOCK_POLARITY + #define McuGenericSWSPI_CONFIG_CLOCK_POLARITY 0 + /*!< 0: clock is low if idle; 1: clock is high if idle */ +#endif + +#ifndef McuGenericSWSPI_CONFIG_CLOCK_EDGE + #define McuGenericSWSPI_CONFIG_CLOCK_EDGE 0 + /*!< 0: data is shifted on falling clock edge; 1: data is shifted on rising clock edge */ +#endif + + +#endif /* __McuGenericSWSPI_CONFIG_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/config/McuHardFaultconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuHardFaultconfig.h new file mode 100644 index 0000000..aaa25b0 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuHardFaultconfig.h @@ -0,0 +1,29 @@ +/** + * \file + * \brief Configuration header file for HardFault + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the HardFault module. + */ + +#ifndef __McuHardFault_CONFIG_H +#define __McuHardFault_CONFIG_H + +#include "McuLib.h" /* SDK and API used */ + +#define McuHardFault_CONFIG_SETTING_HAS_ACTLR (1 || (McuLib_CPU_IS_ARM_CORTEX_M && McuLib_CONFIG_CORTEX_M>=3)) + /*!< 1: Cortex-M3, M4 have Auxiliary Control Register, ACTLR register */ + +#ifndef McuHardFault_CONFIG_SETTING_DISABLE_WRITE_BUFFER + #define McuHardFault_CONFIG_SETTING_DISABLE_WRITE_BUFFER (0 && McuHardFault_CONFIG_SETTING_HAS_ACTLR) + /*!< 1: disable write buffer in ACTLR register */ +#endif + +#ifndef McuHardFault_CONFIG_SETTING_SEMIHOSTING + #define McuHardFault_CONFIG_SETTING_SEMIHOSTING (1) + /*!< 1: do not stop in handler with semihosting and no debugger attached. 0: semihosting hardfault will stop target */ +#endif + + +#endif /* __McuHardFault_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuI2CSpyconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuI2CSpyconfig.h new file mode 100644 index 0000000..652cff5 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuI2CSpyconfig.h @@ -0,0 +1,14 @@ +/** + * \file + * \brief Configuration header file for I2CSpy. + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the I2CSpy module. + */ + +#ifndef __McuI2CSpy_CONFIG_H +#define __McuI2CSpy_CONFIG_H + + +#endif /* __McuI2CSpy_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuI2cLibconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuI2cLibconfig.h new file mode 100644 index 0000000..f517782 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuI2cLibconfig.h @@ -0,0 +1,379 @@ +/*! + * Copyright (c) 2020-2022, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * \file + * \brief Configuration items for the McuI2cLib module. + */ + +#ifndef I2CLIBCONFIG_H_ +#define I2CLIBCONFIG_H_ + +#include "McuLib.h" + +#ifndef McuLib_CONFIG_MCUI2CLIB_ENABLED + #define McuLib_CONFIG_MCUI2CLIB_ENABLED (0) + /*!< 1: enable module, 0: disable module */ +#endif + +#if McuLib_CONFIG_MCUI2CLIB_ENABLED + +#define MCUI2CLIB_CONFIG_HW_TEMPLATE_NONE (0) /* default, initialization value */ +#define MCUI2CLIB_CONFIG_HW_TEMPLATE_LPC55S69_I2C_FC1 (1) /* LPC55S69 with I2C bus on FC1 */ +#define MCUI2CLIB_CONFIG_HW_TEMPLATE_LPC55S69_I2C_FC4 (2) /* LPC55S69 with I2C bus on FC4 */ +/* other configurations are by CPU */ + +#ifndef MCUI2CLIB_CONFIG_HW_TEMPLATE_USED + #define MCUI2CLIB_CONFIG_HW_TEMPLATE_USED MCUI2CLIB_CONFIG_HW_TEMPLATE_NONE +#endif + +#if McuLib_CONFIG_CPU_IS_LPC + #if McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC845 /* LPC845-BRK */ + #define MCUI2CLIB_CONFIG_SCL_GPIO GPIO + #define MCUI2CLIB_CONFIG_SCL_GPIO_PORT 0 + #define MCUI2CLIB_CONFIG_SCL_GPIO_PIN 10 + + #define MCUI2CLIB_CONFIG_SDA_GPIO GPIO + #define MCUI2CLIB_CONFIG_SDA_GPIO_PORT 0 + #define MCUI2CLIB_CONFIG_SDA_GPIO_PIN 11 + + #define MCUI2CLIB_CONFIG_I2C_MASTER_BASEADDR I2C0 + #define MCUI2CLIB_CONFIG_I2C_MASTER_CLK_FREQ 12000000 /* using kI2C0_Clk_From_MainClk */ + + #ifndef MCUI2CLIB_CONFIG_MUX_I2C_PINS + #define MCUI2CLIB_CONFIG_MUX_I2C_PINS() \ + CLOCK_EnableClock(kCLOCK_Swm); \ + SWM_SetFixedPinSelect(SWM0, kSWM_I2C0_SDA, true); /* I2C0_SDA connect to P0_11 */ \ + SWM_SetFixedPinSelect(SWM0, kSWM_I2C0_SCL, true); /* I2C0_SCL connect to P0_10 */ \ + CLOCK_DisableClock(kCLOCK_Swm); + #endif + + #ifndef MCUI2CLIB_CONFIG_CLOCK_SELECT + #define MCUI2CLIB_CONFIG_CLOCK_SELECT() CLOCK_Select(kI2C0_Clk_From_MainClk); /* Select the main clock as source clock of I2C0. */ + #endif + + #elif McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC55S16 + /* using SCL/SDA on J18 connector + * SCL: FC1_RTS_SCL_SSEL1, MCU pin 72, PIO0_14 + * SDA: FC1_CTS_SDA_SSEL0, MCU pin 71, PIO0_13 + */ + #define MCUI2CLIB_CONFIG_SCL_GPIO GPIO + #define MCUI2CLIB_CONFIG_SCL_GPIO_PORT 0 + #define MCUI2CLIB_CONFIG_SCL_GPIO_PIN 14u + #define MCUI2CLIB_CONFIG_SCL_IOCON_PIO_FUNC PIO0_14_FUNC_ALT1 + #define MCUI2CLIB_CONFIG_SCL_IOCON_PIO_DIGIMODE PIO0_14_DIGIMODE_DIGITAL + + #define MCUI2CLIB_CONFIG_SDA_GPIO GPIO + #define MCUI2CLIB_CONFIG_SDA_GPIO_PORT 0 + #define MCUI2CLIB_CONFIG_SDA_GPIO_PIN 13u + #define MCUI2CLIB_CONFIG_SDA_IOCON_PIO_FUNC PIO0_13_FUNC_ALT1 + #define MCUI2CLIB_CONFIG_SDA_IOCON_PIO_DIGIMODE PIO0_13_DIGIMODE_DIGITAL + + #define MCUI2CLIB_CONFIG_I2C_MASTER_BASEADDR I2C1 /* matching the used FLEXCOM1 */ + #define MCUI2CLIB_CONFIG_I2C_MASTER_CLK_FREQ 12000000 + + #ifndef MCUI2CLIB_CONFIG_MUX_I2C_PINS + #define MCUI2CLIB_CONFIG_MUX_I2C_PINS() \ + CLOCK_EnableClock(kCLOCK_Iocon); \ + IOCON->PIO[MCUI2CLIB_CONFIG_SCL_GPIO_PORT][MCUI2CLIB_CONFIG_SCL_GPIO_PIN] = ((IOCON->PIO[MCUI2CLIB_CONFIG_SCL_GPIO_PORT][MCUI2CLIB_CONFIG_SCL_GPIO_PIN] & \ + /* Mask bits to zero which are setting */ \ + (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) \ + /* Selects pin function. */ \ + | IOCON_PIO_FUNC(MCUI2CLIB_CONFIG_SCL_IOCON_PIO_FUNC) \ + /* Select Digital mode. */ \ + | IOCON_PIO_DIGIMODE(MCUI2CLIB_CONFIG_SCL_IOCON_PIO_DIGIMODE)); \ + IOCON->PIO[MCUI2CLIB_CONFIG_SDA_GPIO_PORT][MCUI2CLIB_CONFIG_SDA_GPIO_PIN] = ((IOCON->PIO[MCUI2CLIB_CONFIG_SDA_GPIO_PORT][MCUI2CLIB_CONFIG_SDA_GPIO_PIN] & \ + /* Mask bits to zero which are setting */ \ + (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) \ + /* Selects pin function. */ \ + | IOCON_PIO_FUNC(MCUI2CLIB_CONFIG_SDA_IOCON_PIO_FUNC) \ + /* Select Digital mode. */ \ + | IOCON_PIO_DIGIMODE(MCUI2CLIB_CONFIG_SDA_IOCON_PIO_DIGIMODE)); + #endif + + #ifndef MCUI2CLIB_CONFIG_CLOCK_SELECT + #define MCUI2CLIB_CONFIG_CLOCK_SELECT() CLOCK_AttachClk(kFRO12M_to_FLEXCOMM1); /* attach 12 MHz clock to FLEXCOMM1 (I2C master) */ + #endif + + #elif McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC55S69 + + #if MCUI2CLIB_CONFIG_HW_TEMPLATE_USED==MCUI2CLIB_CONFIG_HW_TEMPLATE_NONE + #error "please select hardware used" + #elif MCUI2CLIB_CONFIG_HW_TEMPLATE_USED==MCUI2CLIB_CONFIG_HW_TEMPLATE_LPC55S69_I2C_FC1 + /* using SCL/SDA on the Arduino header + * SDA: FC1_I2C_SDA, MCU pin 71, PIO0_13 + * SCL: FC1_I2C_SCL, MCU pin 72, PIO0_14 + */ + + /* following values are copied from pin_mux.h */ + /*! + * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */ + #define MCUI2CLIB_PIO0_13_DIGIMODE_DIGITAL 0x01u + /*! + * @brief Selects pin function.: Alternative connection 1. */ + #define MCUI2CLIB_PIO0_13_FUNC_ALT1 0x01u + /*! + * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */ + #define MCUI2CLIB_PIO0_14_DIGIMODE_DIGITAL 0x01u + /*! + * @brief Selects pin function.: Alternative connection 1. */ + #define MCUI2CLIB_PIO0_14_FUNC_ALT1 0x01u + + + #define MCUI2CLIB_CONFIG_SCL_GPIO GPIO + #define MCUI2CLIB_CONFIG_SCL_GPIO_PORT 0 + #define MCUI2CLIB_CONFIG_SCL_GPIO_PIN 14u + #define MCUI2CLIB_CONFIG_SCL_IOCON_PIO_FUNC MCUI2CLIB_PIO0_14_FUNC_ALT1 + #define MCUI2CLIB_CONFIG_SCL_IOCON_PIO_DIGIMODE MCUI2CLIB_PIO0_14_DIGIMODE_DIGITAL + + #define MCUI2CLIB_CONFIG_SDA_GPIO GPIO + #define MCUI2CLIB_CONFIG_SDA_GPIO_PORT 0 + #define MCUI2CLIB_CONFIG_SDA_GPIO_PIN 13u + #define MCUI2CLIB_CONFIG_SDA_IOCON_PIO_FUNC MCUI2CLIB_PIO0_13_FUNC_ALT1 + #define MCUI2CLIB_CONFIG_SDA_IOCON_PIO_DIGIMODE MCUI2CLIB_PIO0_13_DIGIMODE_DIGITAL + + #define MCUI2CLIB_CONFIG_I2C_MASTER_BASEADDR I2C1 /* matching the used FLEXCOM1 */ + #define MCUI2CLIB_CONFIG_I2C_MASTER_CLK_FREQ 12000000 + + + #ifndef MCUI2CLIB_CONFIG_MUX_I2C_PINS + #define MCUI2CLIB_CONFIG_MUX_I2C_PINS() \ + CLOCK_EnableClock(kCLOCK_Iocon); \ + IOCON->PIO[MCUI2CLIB_CONFIG_SCL_GPIO_PORT][MCUI2CLIB_CONFIG_SCL_GPIO_PIN] = ((IOCON->PIO[MCUI2CLIB_CONFIG_SCL_GPIO_PORT][MCUI2CLIB_CONFIG_SCL_GPIO_PIN] & \ + /* Mask bits to zero which are setting */ \ + (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) \ + /* Selects pin function. */ \ + | IOCON_PIO_FUNC(MCUI2CLIB_CONFIG_SCL_IOCON_PIO_FUNC) \ + /* Select Digital mode. */ \ + | IOCON_PIO_DIGIMODE(MCUI2CLIB_CONFIG_SCL_IOCON_PIO_DIGIMODE)); \ + IOCON->PIO[MCUI2CLIB_CONFIG_SDA_GPIO_PORT][MCUI2CLIB_CONFIG_SDA_GPIO_PIN] = ((IOCON->PIO[MCUI2CLIB_CONFIG_SDA_GPIO_PORT][MCUI2CLIB_CONFIG_SDA_GPIO_PIN] & \ + /* Mask bits to zero which are setting */ \ + (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) \ + /* Selects pin function. */ \ + | IOCON_PIO_FUNC(MCUI2CLIB_CONFIG_SDA_IOCON_PIO_FUNC) \ + /* Select Digital mode. */ \ + | IOCON_PIO_DIGIMODE(MCUI2CLIB_CONFIG_SDA_IOCON_PIO_DIGIMODE)); + #endif + + #ifndef MCUI2CLIB_CONFIG_CLOCK_SELECT + #define MCUI2CLIB_CONFIG_CLOCK_SELECT() CLOCK_AttachClk(kFRO12M_to_FLEXCOMM1); /* attach 12 MHz clock to FLEXCOMM1 (I2C master) */ + #endif + + #elif MCUI2CLIB_CONFIG_HW_TEMPLATE_USED==MCUI2CLIB_CONFIG_HW_TEMPLATE_LPC55S69_I2C_FC4 + /* using SCL/SDA on the Mikro Bus connector + * SDA: FC4_I2C_SDA_ARD, MCU pin 30, PIO1_21 + * SCL: FC4_I2C_SCL_ARD, MCU pin 4, PIO1_20 + */ + #define MCUI2CLIB_CONFIG_SCL_GPIO GPIO + #define MCUI2CLIB_CONFIG_SCL_GPIO_PORT 1 + #define MCUI2CLIB_CONFIG_SCL_GPIO_PIN 20u + #define MCUI2CLIB_CONFIG_SCL_IOCON_PIO_FUNC PIO1_20_FUNC_ALT5 + #define MCUI2CLIB_CONFIG_SCL_IOCON_PIO_DIGIMODE PIO1_20_DIGIMODE_DIGITAL + + #define MCUI2CLIB_CONFIG_SDA_GPIO GPIO + #define MCUI2CLIB_CONFIG_SDA_GPIO_PORT 1 + #define MCUI2CLIB_CONFIG_SDA_GPIO_PIN 21u + #define MCUI2CLIB_CONFIG_SDA_IOCON_PIO_FUNC PIO1_21_FUNC_ALT5 + #define MCUI2CLIB_CONFIG_SDA_IOCON_PIO_DIGIMODE PIO1_21_DIGIMODE_DIGITAL + + #define MCUI2CLIB_CONFIG_I2C_MASTER_BASEADDR I2C4 /* matching the used FLEXCOM4 */ + #define MCUI2CLIB_CONFIG_I2C_MASTER_CLK_FREQ 12000000 + + + #ifndef MCUI2CLIB_CONFIG_MUX_I2C_PINS + #define MCUI2CLIB_CONFIG_MUX_I2C_PINS() \ + CLOCK_EnableClock(kCLOCK_Iocon); \ + IOCON->PIO[MCUI2CLIB_CONFIG_SCL_GPIO_PORT][MCUI2CLIB_CONFIG_SCL_GPIO_PIN] = ((IOCON->PIO[MCUI2CLIB_CONFIG_SCL_GPIO_PORT][MCUI2CLIB_CONFIG_SCL_GPIO_PIN] & \ + /* Mask bits to zero which are setting */ \ + (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) \ + /* Selects pin function. */ \ + | IOCON_PIO_FUNC(MCUI2CLIB_CONFIG_SCL_IOCON_PIO_FUNC) \ + /* Select Digital mode. */ \ + | IOCON_PIO_DIGIMODE(MCUI2CLIB_CONFIG_SCL_IOCON_PIO_DIGIMODE)); \ + IOCON->PIO[MCUI2CLIB_CONFIG_SDA_GPIO_PORT][MCUI2CLIB_CONFIG_SDA_GPIO_PIN] = ((IOCON->PIO[MCUI2CLIB_CONFIG_SDA_GPIO_PORT][MCUI2CLIB_CONFIG_SDA_GPIO_PIN] & \ + /* Mask bits to zero which are setting */ \ + (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) \ + /* Selects pin function. */ \ + | IOCON_PIO_FUNC(MCUI2CLIB_CONFIG_SDA_IOCON_PIO_FUNC) \ + /* Select Digital mode. */ \ + | IOCON_PIO_DIGIMODE(MCUI2CLIB_CONFIG_SDA_IOCON_PIO_DIGIMODE)); + #endif + + #ifndef MCUI2CLIB_CONFIG_CLOCK_SELECT + #define MCUI2CLIB_CONFIG_CLOCK_SELECT() CLOCK_AttachClk(kFRO12M_to_FLEXCOMM4); /* attach 12 MHz clock to FLEXCOMM4 (I2C master) */ + #endif + + #endif /* MCUI2CLIB_CONFIG_HW_TEMPLATE_USED */ + + #endif /* LPC variants */ +#elif McuLib_CONFIG_CPU_IS_RPxxxx + + #ifndef MCUI2CLIB_CONFIG_I2C_DEVICE + #define MCUI2CLIB_CONFIG_I2C_DEVICE i2c0 + #endif + #ifndef MCUI2CLIB_CONFIG_SDA_GPIO_PIN + #define MCUI2CLIB_CONFIG_SDA_GPIO_PIN 16u + #endif + #ifndef MCUI2CLIB_CONFIG_SCL_GPIO_PIN + #define MCUI2CLIB_CONFIG_SCL_GPIO_PIN 17u + #endif + + #ifndef MCUI2CLIB_CONFIG_TIMEOUT_BYTE_US + #define MCUI2CLIB_CONFIG_TIMEOUT_BYTE_US (10000) + #endif + +#elif McuLib_CONFIG_CPU_IS_ESP32 + + #ifndef MCUI2CLIB_CONFIG_I2C_DEVICE + #define MCUI2CLIB_CONFIG_I2C_DEVICE I2C_NUM_0 + #endif + #ifndef MCUI2CLIB_CONFIG_SDA_GPIO_PIN + #define MCUI2CLIB_CONFIG_SDA_GPIO_PIN 18u + #endif + #ifndef MCUI2CLIB_CONFIG_SCL_GPIO_PIN + #define MCUI2CLIB_CONFIG_SCL_GPIO_PIN 19u + #endif + + #ifndef MCUI2CLIB_CONFIG_TIMEOUT_BYTE_US + #define MCUI2CLIB_CONFIG_TIMEOUT_BYTE_US (10000) + #endif + + #ifndef MCUI2CLIB_I2C_MASTER_TX_BUF_DISABLE + #define MCUI2CLIB_I2C_MASTER_TX_BUF_DISABLE 0 /*!< I2C master doesn't need buffer */ + #endif + #ifndef MCUI2CLIB_I2C_MASTER_RX_BUF_DISABLE + #define MCUI2CLIB_I2C_MASTER_RX_BUF_DISABLE 0 /*!< I2C master doesn't need buffer */ + #endif + #ifndef MCUI2CLIB_I2C_MASTER_TIMEOUT_MS + #define MCUI2CLIB_I2C_MASTER_TIMEOUT_MS 1000 + #endif + +#elif McuLib_CONFIG_CPU_IS_KINETIS /* K22FN512 and K22FX512 */ + /* set of predefined pin configurations for Kinetis devices: only one can be active! */ + #ifndef MCUI2CLIB_CONFIG_USE_PORTB_B0_B1 + #define MCUI2CLIB_CONFIG_USE_PORTB_B0_B1 (0) + /*!< 1: using SCL PTB0, SDA PTB1 */ + #endif + #ifndef MCUI2CLIB_CONFIG_USE_PORTB_B2_B3 + #define MCUI2CLIB_CONFIG_USE_PORTB_B2_B3 (0) + /*!< 1: using SCL PTB2, SDA PTB3 */ + #endif + #ifndef MCUI2CLIB_CONFIG_USE_PORTD_D2_D3 + #define MCUI2CLIB_CONFIG_USE_PORTD_D2_D3 (0) + /*!< 1: SCL PTD2, SDA PTD3 */ + #endif + #ifndef MCUI2CLIB_CONFIG_USE_PORTE_E0_E1 + #define MCUI2CLIB_CONFIG_USE_PORTE_E0_E1 (0) + /*!< 1: SDA PTE0, SCL PTE1 */ + #endif + + #if MCUI2CLIB_CONFIG_USE_PORTE_E0_E1 + #define MCUI2CLIB_CONFIG_SCL_GPIO GPIOE + #define MCUI2CLIB_CONFIG_SCL_GPIO_PORT PORTE + #define MCUI2CLIB_CONFIG_SCL_GPIO_PIN 1u + + #define MCUI2CLIB_CONFIG_SDA_GPIO GPIOE + #define MCUI2CLIB_CONFIG_SDA_GPIO_PORT PORTE + #define MCUI2CLIB_CONFIG_SDA_GPIO_PIN 0u + + #define MCUI2CLIB_CONFIG_I2C_MASTER_BASEADDR I2C1 + #define MCUI2CLIB_CONFIG_I2C_MASTER_CLK_SRC I2C1_CLK_SRC + + #define MCUI2CLIB_CONFIG_SCL_GPIO_MUXING kPORT_MuxAlt6 + #define MCUI2CLIB_CONFIG_SDA_GPIO_MUXING kPORT_MuxAlt6 + #elif MCUI2CLIB_CONFIG_USE_PORTD_D2_D3 + #define MCUI2CLIB_CONFIG_SCL_GPIO GPIOD + #define MCUI2CLIB_CONFIG_SCL_GPIO_PORT PORTD + #define MCUI2CLIB_CONFIG_SCL_GPIO_PIN 2u + + #define MCUI2CLIB_CONFIG_SDA_GPIO GPIOD + #define MCUI2CLIB_CONFIG_SDA_GPIO_PORT PORTD + #define MCUI2CLIB_CONFIG_SDA_GPIO_PIN 3u + + #define MCUI2CLIB_CONFIG_I2C_MASTER_BASEADDR I2C0 + #define MCUI2CLIB_CONFIG_I2C_MASTER_CLK_SRC I2C0_CLK_SRC + + #define MCUI2CLIB_CONFIG_SCL_GPIO_MUXING kPORT_MuxAlt7 + #define MCUI2CLIB_CONFIG_SDA_GPIO_MUXING kPORT_MuxAlt7 + + #elif MCUI2CLIB_CONFIG_USE_PORTB_B0_B1 + #define MCUI2CLIB_CONFIG_SCL_GPIO GPIOB + #define MCUI2CLIB_CONFIG_SCL_GPIO_PORT PORTB + #define MCUI2CLIB_CONFIG_SCL_GPIO_PIN 0u + + #define MCUI2CLIB_CONFIG_SDA_GPIO GPIOB + #define MCUI2CLIB_CONFIG_SDA_GPIO_PORT PORTB + #define MCUI2CLIB_CONFIG_SDA_GPIO_PIN 1u + + #define MCUI2CLIB_CONFIG_I2C_MASTER_BASEADDR I2C0 + #define MCUI2CLIB_CONFIG_I2C_MASTER_CLK_SRC I2C0_CLK_SRC + + #define MCUI2CLIB_CONFIG_SCL_GPIO_MUXING kPORT_MuxAlt2 + #define MCUI2CLIB_CONFIG_SDA_GPIO_MUXING kPORT_MuxAlt2 + #elif MCUI2CLIB_CONFIG_USE_PORTB_B2_B3 + #define MCUI2CLIB_CONFIG_SCL_GPIO GPIOB + #define MCUI2CLIB_CONFIG_SCL_GPIO_PORT PORTB + #define MCUI2CLIB_CONFIG_SCL_GPIO_PIN 2u + + #define MCUI2CLIB_CONFIG_SDA_GPIO GPIOB + #define MCUI2CLIB_CONFIG_SDA_GPIO_PORT PORTB + #define MCUI2CLIB_CONFIG_SDA_GPIO_PIN 3u + + #define MCUI2CLIB_CONFIG_I2C_MASTER_BASEADDR I2C0 + #define MCUI2CLIB_CONFIG_I2C_MASTER_CLK_SRC I2C0_CLK_SRC + + #define MCUI2CLIB_CONFIG_SCL_GPIO_MUXING kPORT_MuxAlt2 + #define MCUI2CLIB_CONFIG_SDA_GPIO_MUXING kPORT_MuxAlt2 + #endif + + #define MCUI2CLIB_CONFIG_I2C_MASTER_CLK_FREQ CLOCK_GetFreq(MCUI2CLIB_CONFIG_I2C_MASTER_CLK_SRC) + + #ifndef MCUI2CLIB_CONFIG_MUX_I2C_PINS + #define MCUI2CLIB_CONFIG_MUX_I2C_PINS() \ + /* clock enable has to be done outside (e.g. in Pins tool or in platform.c) */ \ + /* I2C SCL Pin */ \ + PORT_SetPinMux(MCUI2CLIB_CONFIG_SCL_GPIO_PORT, MCUI2CLIB_CONFIG_SCL_GPIO_PIN, MCUI2CLIB_CONFIG_SCL_GPIO_MUXING); \ + MCUI2CLIB_CONFIG_SCL_GPIO_PORT->PCR[MCUI2CLIB_CONFIG_SCL_GPIO_PIN] = ((MCUI2CLIB_CONFIG_SCL_GPIO_PORT->PCR[MCUI2CLIB_CONFIG_SCL_GPIO_PIN] & \ + /* Mask bits to zero which are setting */ \ + (~(PORT_PCR_PE_MASK | PORT_PCR_ODE_MASK | PORT_PCR_ISF_MASK))) \ + /* Pull Enable: Internal pullup or pulldown resistor is enabled on the corresponding pin. */ \ + | (uint32_t)(PORT_PCR_PE_MASK) \ + /* Open Drain Enable: Open drain output is enabled on the corresponding pin, if the pin is \ + * configured as a digital output. */ \ + | PORT_PCR_ODE(kPORT_OpenDrainEnable)); \ + /* I2C SDA Pin */ \ + PORT_SetPinMux(MCUI2CLIB_CONFIG_SDA_GPIO_PORT, MCUI2CLIB_CONFIG_SDA_GPIO_PIN, MCUI2CLIB_CONFIG_SDA_GPIO_MUXING); \ + MCUI2CLIB_CONFIG_SDA_GPIO_PORT->PCR[MCUI2CLIB_CONFIG_SDA_GPIO_PIN] = ((MCUI2CLIB_CONFIG_SDA_GPIO_PORT->PCR[MCUI2CLIB_CONFIG_SDA_GPIO_PIN] & \ + /* Mask bits to zero which are setting */ \ + (~(PORT_PCR_PE_MASK | PORT_PCR_ODE_MASK | PORT_PCR_ISF_MASK))) \ + /* Pull Enable: Internal pullup or pulldown resistor is enabled on the corresponding pin. */ \ + | (uint32_t)(PORT_PCR_PE_MASK) \ + /* Open Drain Enable: Open drain output is enabled on the corresponding pin, if the pin is \ + * configured as a digital output. */ \ + | PORT_PCR_ODE(kPORT_OpenDrainEnable)); + #endif + + #ifndef MCUI2CLIB_CONFIG_CLOCK_SELECT + #define MCUI2CLIB_CONFIG_CLOCK_SELECT() /* NOTE: needs to be done in clocks tool or outside in the platform code */ + #endif + +#endif /* which CPU used */ + +#ifndef MCUI2CLIB_CONFIG_I2C_RELEASE_BUS + #define MCUI2CLIB_CONFIG_I2C_RELEASE_BUS (1 && !McuLib_CONFIG_CPU_IS_ESP32) + /*!< if I2C Bus release shall be implemented and done at bus initialization. Not yet implemented for ESP32 */ +#endif + +#ifndef MCUI2CLIB_CONFIG_I2C_BAUDRATE + #define MCUI2CLIB_CONFIG_I2C_BAUDRATE 400000U /* the desired I2C SCL clock frequency */ +#endif +#ifndef MCUI2CLIB_CONFIG_ADD_DELAY + #define MCUI2CLIB_CONFIG_ADD_DELAY (1) /* needed for FXOS sensor? As well for RTC: otherwise the address is not on the bus? */ +#endif +#ifndef MCUI2CLIB_CONFIG_ADD_DELAY_US + #define MCUI2CLIB_CONFIG_ADD_DELAY_US (10) /* added delay in microseconds */ +#endif + +#endif /* McuLib_CONFIG_MCUI2CLIB_ENABLED */ + +#endif /* I2CLIBCONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuINA260config.h b/TSM_PicoW_Sensor/McuLib/config/McuINA260config.h new file mode 100644 index 0000000..545f5f3 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuINA260config.h @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2023, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef McuINA260_CONFIG_H_ +#define McuINA260_CONFIG_H_ + +#ifndef McuINA260_CONFIG_PARSE_COMMAND_ENABLED + #define McuINA260_CONFIG_PARSE_COMMAND_ENABLED (1) + /*!< If shell parser is enabled (1) or not (0). */ +#endif + +#ifndef McuINA260_CONFIG_I2C_ADDRESS + #define McuINA260_CONFIG_I2C_ADDRESS (0x40) + /*! I2C address of the sensor, default 0x40 */ +#endif + +#endif /* McuINA260_CONFIG_H_ */ \ No newline at end of file diff --git a/TSM_PicoW_Sensor/McuLib/config/McuIOconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuIOconfig.h new file mode 100644 index 0000000..d4240dd --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuIOconfig.h @@ -0,0 +1,32 @@ +/*! + * Copyright (c) 2024, Erich Styger + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * \file + * \brief Configuration header file for the McuIO module. + */ + +#ifndef __MCU_IO_CONFIG_H__ +#define __MCU_IO_CONFIG_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef MCUIO_CONFIG_USE_FREERTOS_HEAP + #define MCUIO_CONFIG_USE_FREERTOS_HEAP (McuLib_CONFIG_SDK_USE_FREERTOS) + /*!< 1: use FreeRTOS heap for memory allocation (default); 0: using normal malloc() and free() */ +#endif + +#ifndef MCUIO_CONFIG_USE_FREERTOS_QUEUE + #define MCUIO_CONFIG_USE_FREERTOS_QUEUE (McuLib_CONFIG_SDK_USE_FREERTOS) + /*!< 1: use FreeRTOS queue for buffer management allocation (default); 0: using bare-metal ring buffer */ +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* __MCU_IO_CONFIG_H__ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuLC709203Fconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuLC709203Fconfig.h new file mode 100644 index 0000000..acc16d1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuLC709203Fconfig.h @@ -0,0 +1,32 @@ +/*! + * Copyright (c) 2019, Erich Styger + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * \file + * \brief Configuration header file for the LC709203 battery gauge I2C sensor. + */ + +#ifndef SOURCES_MCULC709203FCONFIG_H_ +#define SOURCES_MCULC709203FCONFIG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef MCULC709203F_CONFIG_USE_THERMISTOR + #define MCULC709203F_CONFIG_USE_THERMISTOR (0) + /*!< 1: using Thermistor in battery. 0: using I2C mode */ +#endif + +#ifndef MCULC_CONFIG_BLOCK_ON_I2C_ERROR + #define MCULC_CONFIG_BLOCK_ON_I2C_ERROR (1) + /*!< if it should block on error and wait for the watchdog */ +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* SOURCES_MCULC709203FCONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuLEDconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuLEDconfig.h new file mode 100644 index 0000000..4d30e18 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuLEDconfig.h @@ -0,0 +1,28 @@ +/*! + * Copyright (c) 2019, Erich Styger + * All rights reserved. + * \file + * \brief Configuration header file for McuLED. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MCULED_CONFIG_H_ +#define MCULED_CONFIG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "McuLibconfig.h" + +#ifndef MCULED_CONFIG_USE_FREERTOS_HEAP + #define MCULED_CONFIG_USE_FREERTOS_HEAP (McuLib_CONFIG_SDK_USE_FREERTOS) + /*!< 1: use FreeRTOS Heap (default), 0: use stdlib malloc() and free() */ +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MCULEDCONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuLibconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuLibconfig.h new file mode 100644 index 0000000..ae42766 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuLibconfig.h @@ -0,0 +1,259 @@ +/*! + * \file + * \brief Configuration header file for McuLibConfig. + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the McuLibConfig module. + */ + +#ifndef __McuLib_CONFIG_H +#define __McuLib_CONFIG_H + +/* identification of CPU/core used. __CORTEX_M is defined in CMSIS-Core. + Otherwise CPU Family is set automatically by Processor Expert: detected: Kinetis (supported: "Kinetis", "S32K", "HCS08") +*/ +#if defined(__CORTEX_M) + #define McuLib_CPU_IS_ARM_CORTEX_M (1) +#else + #define McuLib_CPU_IS_ARM_CORTEX_M (0) +#endif + +#ifndef McuLib_CONFIG_CPU_IS_ARM_CORTEX_M + #define McuLib_CONFIG_CPU_IS_ARM_CORTEX_M (1 || McuLib_CPU_IS_ARM_CORTEX_M) + /*!< 1: ARM Cortex-M family, 0 otherwise */ +#endif +#ifndef McuLib_CONFIG_CPU_IS_S32K + #define McuLib_CONFIG_CPU_IS_S32K (0 && McuLib_CONFIG_CPU_IS_ARM_CORTEX_M) + /*!< 1: NXP S32K CPU family, 0: otherwise */ +#endif +#ifndef McuLib_CONFIG_CPU_IS_LPC + #define McuLib_CONFIG_CPU_IS_LPC (0 && McuLib_CONFIG_CPU_IS_ARM_CORTEX_M) + /*!< 1: NXP LPC CPU family, 0: otherwise */ +#endif +#ifndef McuLib_CONFIG_CPU_IS_LPC55xx + #define McuLib_CONFIG_CPU_IS_LP55Cxx (0 && McuLib_CONFIG_CPU_IS_ARM_CORTEX_M && McuLib_CONFIG_CPU_IS_LPC) + /*!< 1: NXP LPC55xx CPU family, 0: otherwise */ +#endif +#ifndef McuLib_CONFIG_CPU_IS_MCXA + #define McuLib_CONFIG_CPU_IS_MCXA (0 && McuLib_CONFIG_CPU_IS_ARM_CORTEX_M) + /*!< 1: NXP MCXA CPU family (Cortex M33 without FPU and DSP instructions), 0: otherwise */ +#endif +#ifndef McuLib_CONFIG_CPU_IS_MCXC + #define McuLib_CONFIG_CPU_IS_MCXC (0 && McuLib_CONFIG_CPU_IS_ARM_CORTEX_M) + /*!< 1: NXP MCXC CPU family (Cortex M33), 0: otherwise */ +#endif +#ifndef McuLib_CONFIG_CPU_IS_MCXN + #define McuLib_CONFIG_CPU_IS_MCXN (0 && McuLib_CONFIG_CPU_IS_ARM_CORTEX_M) + /*!< 1: NXP MCXN CPU family (Dual-Core Cortex M33 with FPU and DSP instructions), 0: otherwise */ +#endif +#ifndef McuLib_CONFIG_CPU_IS_MCX + #define McuLib_CONFIG_CPU_IS_MCX (1 && McuLib_CONFIG_CPU_IS_ARM_CORTEX_M && (McuLib_CONFIG_CPU_IS_MCXA || McuLib_CONFIG_CPU_IS_MCXC || McuLib_CONFIG_CPU_IS_MCXN)) + /*!< 1: NXP MCX CPU family (Cortex M33 for A, N, W and L, Cortex M0+ on C), 0: otherwise */ +#endif +#ifndef McuLib_CONFIG_CPU_IS_STM32 + #define McuLib_CONFIG_CPU_IS_STM32 (0 && McuLib_CONFIG_CPU_IS_ARM_CORTEX_M) + /*!< 1: STM32 ARM Cortex CPU family, 0: otherwise */ +#endif +#ifndef McuLib_CONFIG_CPU_IS_IMXRT + #define McuLib_CONFIG_CPU_IS_IMXRT (0 && McuLib_CONFIG_CPU_IS_ARM_CORTEX_M) + /*!< 1: NXP i.Mx RT CPU family, 0: otherwise */ +#endif +#ifndef McuLib_CONFIG_CPU_IS_NORDIC_NRF + #define McuLib_CONFIG_CPU_IS_NORDIC_NRF (0 && McuLib_CONFIG_CPU_IS_ARM_CORTEX_M) + /*!< 1: Nordic nRF, 0: otherwise */ +#endif +#ifndef McuLib_CONFIG_CPU_IS_HCS08 + #define McuLib_CONFIG_CPU_IS_HCS08 (0 && !McuLib_CONFIG_CPU_IS_ARM_CORTEX_M) + /*!< 1: HCS08 CPU family, 0: otherwise */ +#endif +#ifndef McuLib_CONFIG_CPU_IS_RISC_V + #define McuLib_CONFIG_CPU_IS_RISC_V (0 && !McuLib_CONFIG_CPU_IS_ARM_CORTEX_M) + /*!< 1: RISC-V CPU family, 0: otherwise */ +#endif +#ifndef McuLib_CONFIG_CPU_IS_RISC_V_RV32M1_RI5CY + #define McuLib_CONFIG_CPU_IS_RISC_V_RV32M1_RI5CY (1 && McuLib_CONFIG_CPU_IS_RISC_V) + /*!< 1: VEGA Board: RISC-V RV32M1 RI5CY, 0: other core */ +#endif +#if !defined(McuLib_CONFIG_CPU_IS_ESP32) && !defined(McuLib_CONFIG_CPU_IS_IMXRT) /* i.MX could check on __XTENSA__ in fsl_common.h */ + #ifndef __XTENSA__ + #define __XTENSA__ 0 + #endif + #define McuLib_CONFIG_CPU_IS_ESP32 (__XTENSA__) + /*!< 1: ESP32 CPU family, 0: otherwise. The ESP32 compiler defines __XTENSA__ with a value of 1 */ +#endif +#ifndef McuLib_CONFIG_CPU_IS_RPxxxx + #define McuLib_CONFIG_CPU_IS_RPxxxx (0) /* Raspberry Pi RP, e.g. RP2040 */ +#endif + +#ifndef McuLib_CONFIG_CPU_IS_KINETIS + #define McuLib_CONFIG_CPU_IS_KINETIS (1 && McuLib_CONFIG_CPU_IS_ARM_CORTEX_M \ + && !(McuLib_CONFIG_CPU_IS_LPC) \ + && !(McuLib_CONFIG_CPU_IS_LPC55xx) \ + && !(McuLib_CONFIG_CPU_IS_IMXRT) \ + && !(McuLib_CONFIG_CPU_IS_STM32) \ + && !(McuLib_CONFIG_CPU_IS_NORDIC_NRF) \ + && !(McuLib_CONFIG_CPU_IS_S32K)) + /*!< 1: NXP Kinetis CPU family, 0: otherwise */ +#endif + + + +/* define to identify the CPU variant better */ +#define McuLib_CONFIG_CPU_VARIANT_DEFAULT (0) +#define McuLib_CONFIG_CPU_VARIANT_NXP_K02FN (1) +#define McuLib_CONFIG_CPU_VARIANT_NXP_K22FN (2) +#define McuLib_CONFIG_CPU_VARIANT_NXP_K22FX (3) +#define McuLib_CONFIG_CPU_VARIANT_NXP_KE02 (4) +#define McuLib_CONFIG_CPU_VARIANT_NXP_LPC804 (5) +#define McuLib_CONFIG_CPU_VARIANT_NXP_LPC845 (6) +#define McuLib_CONFIG_CPU_VARIANT_NXP_LPC54608 (7) +#define McuLib_CONFIG_CPU_VARIANT_NXP_LPC55S16 (8) +#define McuLib_CONFIG_CPU_VARIANT_NXP_LPC55S69 (9) +#define McuLib_CONFIG_CPU_VARIANT_NXP_IMXRT1064 (10) +#define McuLib_CONFIG_CPU_VARIANT_RP2040 (11) +#define McuLib_CONFIG_CPU_VARIANT_NXP_K64FN (12) + +#ifndef McuLib_CONFIG_CPU_VARIANT + #define McuLib_CONFIG_CPU_VARIANT McuLib_CONFIG_CPU_VARIANT_DEFAULT +#endif + +#if McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_DEFAULT + #error "Please specify the LPC CPU variant used" +#endif + +#ifndef McuLib_CONFIG_IS_KINETIS_KE + #define McuLib_CONFIG_IS_KINETIS_KE (McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_KE02) +#endif + +/* identification of Cortex-M core. __FPU_USED can be defined in CMSIS-Core */ +#ifndef McuLib_CONFIG_CORTEX_M + #define McuLib_CONFIG_CORTEX_M (4) + /*!< 0: Cortex-M0, 3: M3, 4: M4, 7: M7, 33: M33, -1 otherwise */ +#endif +#if (1 && !defined(McuLib_CONFIG_FPU_PRESENT) && McuLib_CONFIG_CORTEX_M!=0) || (defined(__FPU_PRESENT) && (__FPU_PRESENT==1)) /* __FPU_PRESENT can be defined in CMSIS-Core */ + #define McuLib_CONFIG_FPU_PRESENT (1) +#else + #define McuLib_CONFIG_FPU_PRESENT (0) +#endif + /*!< 1: floating point unit present, 0: otherwise */ +#if (1 && !defined(McuLib_CONFIG_FPU_USED) && McuLib_CONFIG_CORTEX_M!=0) || (defined(__FPU_USED) && (__FPU_USED==1)) /* __FPU_USED can be defined in CMSIS-Core */ + #define McuLib_CONFIG_FPU_USED (1) +#else + #define McuLib_CONFIG_FPU_USED (0) +#endif + /*!< 1: using floating point unit, 0: otherwise */ + +/* macro for little and big endianess. ARM is little endian */ +#define McuLib_CONFIG_CPU_IS_LITTLE_ENDIAN (McuLib_CONFIG_CPU_IS_ARM_CORTEX_M) + +/* Identifiers used to identify the SDK */ +#define McuLib_CONFIG_SDK_GENERIC (0) + /*!< using a generic API/SDK */ +#define McuLib_CONFIG_SDK_PROCESSOR_EXPERT (1) + /*!< using Processor Expert SDK */ +#define McuLib_CONFIG_SDK_KINETIS_1_3 (2) + /*!< using NXP Kinetis SDK V1.3 */ +#define McuLib_CONFIG_SDK_KINETIS_2_0 (3) + /*!< using NXP Kinetis SDK V2.0 */ +#define McuLib_CONFIG_SDK_MCUXPRESSO_2_0 (4) + /*!< using NXP MCUXpresso SDK V2.x, same as Kinetis SDK v2.0 */ +#define McuLib_CONFIG_SDK_S32K (5) + /*!< SDK for S32K */ +#define McuLib_CONFIG_SDK_NORDIC_NRF5 (6) + /*!< Nordic nRF5 SDK */ +#define McuLib_CONFIG_SDK_RPI_PICO (7) + /*!< Raspberry Pi Pico SDK */ +#define McuLib_CONFIG_SDK_LINUX (8) + /*!< Linux SDK, e.g. Raspberry Pi */ + +#ifndef McuLib_CONFIG_SDK_VERSION_MAJOR + #define McuLib_CONFIG_SDK_VERSION_MAJOR (2) + /*!< SDK major version number */ +#endif + +#ifndef McuLib_CONFIG_SDK_VERSION_MINOR + #define McuLib_CONFIG_SDK_VERSION_MINOR (5) + /*!< SDK minor version number */ +#endif + +#ifndef McuLib_CONFIG_SDK_VERSION_BUILD + #define McuLib_CONFIG_SDK_VERSION_BUILD (0) + /*!< SDK build version number */ +#endif + +#ifndef McuLib_CONFIG_SDK_VERSION + #define McuLib_CONFIG_SDK_VERSION (McuLib_CONFIG_SDK_VERSION_MAJOR*100)+(McuLib_CONFIG_SDK_VERSION_MINOR*10)+McuLib_CONFIG_SDK_VERSION_BUILD + /*!< Builds a single number with the SDK version (major, minor, build), e.g. 250 for 2.5.0 */ +#endif + +/* specify the SDK and API used */ +#ifndef McuLib_CONFIG_SDK_VERSION_USED +#if McuLib_CONFIG_CPU_IS_ESP32 + #define McuLib_CONFIG_SDK_VERSION_USED McuLib_CONFIG_SDK_GENERIC + /*!< identify the version of SDK/API used. For ESP32 we are using a generic SDK (actually the IDF one) */ +#elif McuLib_CONFIG_CPU_IS_STM32 + #define McuLib_CONFIG_SDK_VERSION_USED McuLib_CONFIG_SDK_GENERIC + /*!< identify the version of SDK/API used. For STM32 we are using a generic SDK (actually the CubeMX one) */ +#else + #define McuLib_CONFIG_SDK_VERSION_USED McuLib_CONFIG_SDK_PROCESSOR_EXPERT + /*!< identify the version of SDK/API used */ +#endif +#endif + + +/* ***************** Middleware Configuration *******************/ +/* Configuration macro if FreeRTOS is used */ +#ifndef McuLib_CONFIG_SDK_USE_FREERTOS + #define McuLib_CONFIG_SDK_USE_FREERTOS (1) + /*!< 1: Use FreeRTOS; 0: no FreeRTOS used */ +#endif + +/* FatFS */ +#ifndef McuLib_CONFIG_SDK_USE_FAT_FS + #define McuLib_CONFIG_SDK_USE_FAT_FS (0) + /*!< 1: Use FatFS; 0: no FatFS used */ +#endif +/* ***************************************************************/ + +/* special macro to identify a set of SDKs used */ +#define McuLib_CONFIG_NXP_SDK_USED ( (McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_KINETIS_1_3) \ + || (McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_KINETIS_2_0) \ + || (McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_MCUXPRESSO_2_0) \ + || (McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_S32K) \ + ) + /*!< Using one of the Freescale/NXP SDKs */ + +#define McuLib_CONFIG_NXP_SDK_2_0_USED ( (McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_KINETIS_2_0) \ + || (McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_MCUXPRESSO_2_0) \ + ) + /*!< Using Freescale/NXP SDK V2.0 */ + +#define McuLib_CONFIG_PEX_SDK_USED (McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_PROCESSOR_EXPERT) + /*!< Using Processor Expert API */ + +/* Compiler identification: */ +#define McuLib_CONFIG_COMPILER_GNU (0) +#define McuLib_CONFIG_COMPILER_IAR (1) +#define McuLib_CONFIG_COMPILER_KEIL (2) +#define McuLib_CONFIG_COMPILER_HIWARE (3) +#define McuLib_CONFIG_COMPILER_METROWERKS (4) + +#ifndef McuLib_CONFIG_COMPILER + #if defined(__GNUC__) + #define McuLib_CONFIG_COMPILER McuLib_CONFIG_COMPILER_GNU + #elif defined(__HIWARE__) + #define McuLib_CONFIG_COMPILER McuLib_CONFIG_COMPILER_HIWARE + #elif defined(__IAR_SYSTEMS_ICC__) + #define McuLib_CONFIG_COMPILER McuLib_CONFIG_COMPILER_IAR + #elif defined(__CC_ARM) + #define McuLib_CONFIG_COMPILER McuLib_CONFIG_COMPILER_KEIL + #elif defined(__MWERKS__) + #define McuLib_CONFIG_COMPILER McuLib_CONFIG_COMPILER_METROWERKS + #else + #warning "a compiler needs to be defined!" + #endif +#endif + +#endif /* __McuLib_CONFIG_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/config/McuLogconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuLogconfig.h new file mode 100644 index 0000000..fa06e8b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuLogconfig.h @@ -0,0 +1,89 @@ +/*! + * Copyright (c) 2020, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * \file + * \brief Configuration header file for the McuLog module. + */ + +#ifndef MCULOGCONFIG_H_ +#define MCULOGCONFIG_H_ + +#include "McuLib.h" + +#ifndef McuLog_CONFIG_IS_ENABLED + #define McuLog_CONFIG_IS_ENABLED (1) + /*!< 1: Logging is enabled; 0: Logging is disabled, not adding anything to the application code */ +#endif + +#ifndef McuLog_CONFIG_DEFAULT_LEVEL + #define McuLog_CONFIG_DEFAULT_LEVEL (McuLog_TRACE) + /*!< one of McuLog_Levels_e */ +#endif + +#ifndef McuLog_CONFIG_USE_MUTEX + #define McuLog_CONFIG_USE_MUTEX (1 && McuLib_CONFIG_SDK_USE_FREERTOS) + /*!< 1: use a RTOS mutex for the logging module; 0: do not use a mutex */ +#endif + +#ifndef McuLog_CONFIG_USE_COLOR + #define McuLog_CONFIG_USE_COLOR (1) + /*!< 1: use use ANSI color for terminal, 0: do not use color */ +#endif + +#ifndef McuLog_CONFIG_USE_PRINTF_STYLE + #define McuLog_CONFIG_USE_PRINTF_STYLE (1) + /*!< 1: use printf open argument list for printing */ +#endif + +#ifndef McuLog_CONFIG_USE_FILE + #define McuLog_CONFIG_USE_FILE (0) + /*!< 1: use use file for logging, 0: do not use file */ +#endif + +#ifndef McuLog_CONFIG_NOF_CONSOLE_LOGGER + #define McuLog_CONFIG_NOF_CONSOLE_LOGGER (1) + /*!< Number of console loggers */ +#endif + +#ifndef McuLog_CONFIG_LOG_TIMESTAMP_DATE + #define McuLog_CONFIG_LOG_TIMESTAMP_DATE (1) + /*!< 1: add date to time stamp, 0: do not date for time stamp */ +#endif + +#ifndef McuLog_CONFIG_LOG_TIMESTAMP_TIME + #define McuLog_CONFIG_LOG_TIMESTAMP_TIME (1) + /*!< 1: add time to time stamp, 0: do not time for time stamp */ +#endif + +#ifndef McuLog_CONFIG_LOG_STRIP_FILENAME_PATH + #define McuLog_CONFIG_LOG_STRIP_FILENAME_PATH (1) + /*!< 1: strip path from file name, 0: keep file name untouched */ +#endif + +#ifndef McuLog_CONFIG_USE_RTT_CONSOLE + #define McuLog_CONFIG_USE_RTT_CONSOLE (0) + /*!< 1: use SEGGER RTT console output, 0: do not use SEGGER RTT */ +#endif + +#ifndef McuLog_CONFIG_USE_RTT_DATA_LOGGER + #define McuLog_CONFIG_USE_RTT_DATA_LOGGER (0) + /*!< 1: use SEGGER RTT Logger (Channel 1), 0: do not use SEGGER RTT Logger */ +#endif + +#ifndef McuLog_CONFIG_RTT_DATA_LOGGER_BUFFER_SIZE + #define McuLog_CONFIG_RTT_DATA_LOGGER_BUFFER_SIZE (256) + /*!< Buffer size in bytes for the RTT data logger channel */ +#endif + +#ifndef McuLog_CONFIG_RTT_DATA_LOGGER_CHANNEL_MODE + #define McuLog_CONFIG_RTT_DATA_LOGGER_CHANNEL_MODE (SEGGER_RTT_MODE_NO_BLOCK_SKIP) + /*!< RTT channel mode to be used */ +#endif + +#ifndef McuLog_CONFIG_PARSE_COMMAND_ENABLED + #define McuLog_CONFIG_PARSE_COMMAND_ENABLED (1 && McuLog_CONFIG_IS_ENABLED) + /*! < 1: shell command line parser enabled; 0: not enabled */ +#endif + +#endif /* MCULOGCONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuOneWireconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuOneWireconfig.h new file mode 100644 index 0000000..e7a117b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuOneWireconfig.h @@ -0,0 +1,67 @@ +/** + * \file + * \brief Configuration header file for 1-Wire. + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the 1-Wire module. + */ + +#ifndef __McuOneWire_CONFIG_H +#define __McuOneWire_CONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* protocol timing in micro seconds */ +/* write */ +#define McuOneWire_CONFIG_A_WRITE_1_LOW_TIME 6 /* A: standard 6 us, low time to write one bit */ +#define McuOneWire_CONFIG_B_WRITE_1_HIGH_TIME 64 /* B: standard 64 us, high time after writing one bit (A) */ +#define McuOneWire_CONFIG_C_WRITE_0_LOW_TIME 60 /* C: standard 60 us, Low time writing zero bit */ +#define McuOneWire_CONFIG_D_WRITE_0_HIGH_TIME 10 /* D: standard 10 us, High time after writing zero bit (C) */ +/* read */ +#define McuOneWire_CONFIG_A_READ_LOW_TIME 6 /* Low time to start read */ +#define McuOneWire_CONFIG_E_BEFORE_READ_DELAY_TIME 3 /* E: standard 9 us, wait time after starting read (when to read bit) */ +#define McuOneWire_CONFIG_F_AFTER_READ_DELAY_TIME 55 /* F: standard 55 us, wait time after reading bit (E) */ +/* reset */ +#define McuOneWire_CONFIG_H_RESET_TIME 480 /* H: standard 480 us, reset low time */ +#define McuOneWire_CONFIG_I_RESET_RESPONSE_TIME 70 /* I: standard 70 us, wait time after reset low time (H) until read response */ +#define McuOneWire_CONFIG_J_RESET_WAIT_TIME 410 /* J: standard 410 us, wait time after reading presence (I) */ + +#define McuOneWire_CONFIG_SLOT_TIME 100 + +#define McuOneWire_CONFIG_DEBUG_READ_PIN_ENABLED (1) + /*!< 1: Toggle extra GPIO pin during 1-wire read access; 0: no debug */ + +#if McuOneWire_CONFIG_DEBUG_READ_PIN_ENABLED + #include "DbgRd1.h" /* SDK and API used */ + #define McuOneWire_CONFIG_DEBUG_READ_PIN_INIT DbgRd1_Init() + #define McuOneWire_CONFIG_DEBUG_READ_PIN_DEINIT DbgRd1_Deinit() + #define McuOneWire_CONFIG_DEBUG_READ_PIN_TOGGLE DbgRd1_NegVal() +#endif + +#ifndef McuOneWire_CONFIG_WRITE_PIN + #define McuOneWire_CONFIG_WRITE_PIN (0) + /*!< 1: using dedicated write pin; 0: using single pin for read/write */ +#endif + +#if McuOneWire_CONFIG_WRITE_PIN + #include "WritePin.h" + #define McuOneWire_CONFIG_WRITE_PIN_INIT WritePin_Init() + #define McuOneWire_CONFIG_WRITE_PIN_DEINIT WritePin_Deinit() + #define McuOneWire_CONFIG_WRITE_PIN_LOW WritePin_ClrVal() + #define McuOneWire_CONFIG_WRITE_PIN_HIGH WritePin_SetVal() + #define McuOneWire_CONFIG_WRITE_PIN_SET_OUTPUT WritePin_SetOutput() +#endif + +#if !defined(McuOneWire_CONFIG_PARSE_COMMAND_ENABLED) + #define McuOneWire_CONFIG_PARSE_COMMAND_ENABLED (1) + /*!< 1: shell support enabled, 0: otherwise */ +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __McuOneWire_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuPCF85063A_config.h b/TSM_PicoW_Sensor/McuLib/config/McuPCF85063A_config.h new file mode 100644 index 0000000..901b118 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuPCF85063A_config.h @@ -0,0 +1,13 @@ +/*! + * Copyright (c) 2023, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * \file + * \brief Configuration header file for the PCF85063A realtime clock. + */ + +#ifndef MCUPCF85063A_CONFIG_H_ +#define MCUPCF85063A_CONFIG_H_ + + +#endif /* MCUPCF85063A_CONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuPidFloatconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuPidFloatconfig.h new file mode 100644 index 0000000..0f9cd34 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuPidFloatconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for a PID component with floats. + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the PID_Float module. + */ + +#ifndef __McuPidFloat_CONFIG_H +#define __McuPidFloat_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuPidFloat_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuPidIntconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuPidIntconfig.h new file mode 100644 index 0000000..8e65a79 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuPidIntconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for PID_Int component. + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the PID for integer module. + */ + +#ifndef __McuPidInt_CONFIG_H +#define __McuPidInt_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuPidInt_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuQuadCounterconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuQuadCounterconfig.h new file mode 100644 index 0000000..144ead6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuQuadCounterconfig.h @@ -0,0 +1,23 @@ +/** + * \file + * \brief Configuration header file for QuadCounter component. + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the quadrature counter module. + */ + +#ifndef __McuQuadCounter_CONFIG_H +#define __McuQuadCounter_CONFIG_H + +#ifndef McuQuadCounter_CONFIG_USE_ERROR_CORRECTION + #define McuQuadCounter_CONFIG_USE_ERROR_CORRECTION (0) + /*!< 1: Use error correction, 0: not using error correction */ +#endif + +#ifndef McuQuadCounter_CONFIG_COUNT_ERRORS + #define McuQuadCounter_CONFIG_COUNT_ERRORS (1) + /*!< 1: count errors, 0: do not count errors */ +#endif + +#endif /* __McuQuadCounter_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuRBconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuRBconfig.h new file mode 100644 index 0000000..31ff9e6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuRBconfig.h @@ -0,0 +1,20 @@ +/** + * \file + * \brief Configuration header file for a RingBuffer. + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the ring buffer module. + */ + +#ifndef MCURBCONFIG_H_ +#define MCURBCONFIG_H_ + +#include "McuLibconfig.h" + +#ifndef MCURB_CONFIG_USE_FREERTOS_HEAP + #define MCURB_CONFIG_USE_FREERTOS_HEAP (McuLib_CONFIG_SDK_USE_FREERTOS) + /*!< 1: use FreeRTOS Heap (default), 0: use stdlib malloc() and free() */ +#endif + +#endif /* MCURBCONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuRTOSconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuRTOSconfig.h new file mode 100644 index 0000000..df1b33a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuRTOSconfig.h @@ -0,0 +1,179 @@ +/** + * \file + * \brief Configuration header file for FreeRTOS component. + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the FreeRTOS module. + */ + #ifndef __McuRTOS_CONFIG_H +#define __McuRTOS_CONFIG_H + +#include "McuLib.h" /* SDK and API used */ + +/* -------------------------------------------------------------------- */ +/* Macros to identify the compiler used: */ +#define configCOMPILER_ARM_GCC 1 /* GNU ARM gcc compiler */ +#define configCOMPILER_ARM_IAR 2 /* IAR ARM compiler */ +#define configCOMPILER_ARM_FSL 3 /* Legacy Freescale ARM compiler */ +#define configCOMPILER_ARM_KEIL 4 /* ARM/Keil compiler */ +#define configCOMPILER_S08_FSL 5 /* Freescale HCS08 compiler */ +#define configCOMPILER_S12_FSL 6 /* Freescale HCS12(X) compiler */ +#define configCOMPILER_CF1_FSL 7 /* Freescale ColdFire V1 compiler */ +#define configCOMPILER_CF2_FSL 8 /* Freescale ColdFire V2 compiler */ +#define configCOMPILER_DSC_FSL 9 /* Freescale DSC compiler */ + +#define configCOMPILER configCOMPILER_ARM_GCC +/* -------------------------------------------------------------------- */ +/* CPU family identification */ +#define configCPU_FAMILY_S08 1 /* S08 core */ +#define configCPU_FAMILY_S12 2 /* S12(X) core */ +#define configCPU_FAMILY_CF1 3 /* ColdFire V1 core */ +#define configCPU_FAMILY_CF2 4 /* ColdFire V2 core */ +#define configCPU_FAMILY_DSC 5 /* 56800/DSC */ +#define configCPU_FAMILY_ARM_M0P 6 /* ARM Cortex-M0+ */ +#define configCPU_FAMILY_ARM_M3 7 /* ARM Cortex-M3 */ +#define configCPU_FAMILY_ARM_M4 8 /* ARM Cortex-M4 */ +#define configCPU_FAMILY_ARM_M4F 9 /* ARM Cortex-M4F (with floating point unit) */ +#define configCPU_FAMILY_ARM_M7 10 /* ARM Cortex-M7 */ +#define configCPU_FAMILY_ARM_M7F 11 /* ARM Cortex-M7F (with floating point unit) */ +#define configCPU_FAMILY_ARM_M33 12 /* ARM Cortex-M33 */ +#define configCPU_FAMILY_ARM_M33F 13 /* ARM Cortex-M33F (with floating point unit) */ +#define configCPU_FAMILY_RISC_V 14 /* RISC-V */ + +/* Macros to identify set of core families */ +#define configCPU_FAMILY_IS_ARM_M0(fam) ((fam)==configCPU_FAMILY_ARM_M0P) +#define configCPU_FAMILY_IS_ARM_M3(fam) ((fam)==configCPU_FAMILY_ARM_M3) +#define configCPU_FAMILY_IS_ARM_M4(fam) (((fam)==configCPU_FAMILY_ARM_M4) || ((fam)==configCPU_FAMILY_ARM_M4F)) +#define configCPU_FAMILY_IS_ARM_M7(fam) (((fam)==configCPU_FAMILY_ARM_M7) || ((fam)==configCPU_FAMILY_ARM_M7F)) +#define configCPU_FAMILY_IS_ARM_M4_M7(fam) (configCPU_FAMILY_IS_ARM_M4(fam) || configCPU_FAMILY_IS_ARM_M7(fam)) +#define configCPU_FAMILY_IS_ARM_M33(fam) (((fam)==configCPU_FAMILY_ARM_M33) || ((fam)==configCPU_FAMILY_ARM_M33F)) +#define configCPU_FAMILY_IS_ARM_FPU(fam) (((fam)==configCPU_FAMILY_ARM_M4F) || ((fam)==configCPU_FAMILY_ARM_M7F) || ((fam)==configCPU_FAMILY_ARM_M33F)) +#define configCPU_FAMILY_IS_ARM(fam) (configCPU_FAMILY_IS_ARM_M0(fam) || configCPU_FAMILY_IS_ARM_M4(fam) || configCPU_FAMILY_IS_ARM_M7(fam) || configCPU_FAMILY_IS_ARM_M33(fam)) + +#if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M + /* determine core based on library configuration */ + #if McuLib_CONFIG_CORTEX_M==0 + #define configCPU_FAMILY configCPU_FAMILY_ARM_M0P + #elif McuLib_CONFIG_CORTEX_M==3 + #define configCPU_FAMILY configCPU_FAMILY_ARM_M3 + #elif McuLib_CONFIG_CORTEX_M==4 && McuLib_CONFIG_FPU_PRESENT + #define configCPU_FAMILY configCPU_FAMILY_ARM_M4F + #elif McuLib_CONFIG_CORTEX_M==4 + #define configCPU_FAMILY configCPU_FAMILY_ARM_M4 + #elif McuLib_CONFIG_CORTEX_M==7 && McuLib_CONFIG_FPU_PRESENT + #define configCPU_FAMILY configCPU_FAMILY_ARM_M7F + #elif McuLib_CONFIG_CORTEX_M==7 + #define configCPU_FAMILY configCPU_FAMILY_ARM_M7 + #elif McuLib_CONFIG_CORTEX_M==33 && McuLib_CONFIG_FPU_PRESENT + #define configCPU_FAMILY configCPU_FAMILY_ARM_M33F + #elif McuLib_CONFIG_CORTEX_M==33 + #define configCPU_FAMILY configCPU_FAMILY_ARM_M33 + #else + #error "unsupported configuaration!" + #endif +#elif McuLib_CONFIG_CPU_IS_RISC_V + #define configCPU_FAMILY configCPU_FAMILY_RISC_V +#else /* default CPU family */ + #define configCPU_FAMILY configCPU_FAMILY_ARM_M4F +#endif + +#ifndef configENABLE_MPU + #define configENABLE_MPU (0 && (configCPU_FAMILY_IS_ARM_M4(configCPU_FAMILY)||configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY))) + /*!< 1: enable MPU support; 0: MPU support is disabled */ +#endif + +#ifndef configENABLE_FPU + #define configENABLE_FPU (1 && McuLib_CONFIG_FPU_PRESENT) + /*!< 1: enable FPU support; 0: FPU support is disabled */ +#endif + +#ifndef configENABLE_TRUSTZONE + #define configENABLE_TRUSTZONE (0 && configCPU_FAMILY_IS_ARM_M33(configCPU_FAMILY)) + /*!< 1: enable ARM TrustZone support; 0: TrustZone support is disabled */ +#endif + +/*----------------------------------------------------------- + * GDB backtrace handler support + * See http://interactive.freertos.org/entries/23468301-Tasks-backtrace-switcher-viewer-snippet-for-debugger-gcc-gdb-ARM-Cortex-M3-MPU-port-Eclipse-support- + *----------------------------------------------------------*/ +#ifndef configGDB_HELPER + #define configGDB_HELPER (0 && configCPU_FAMILY_IS_ARM(configCPU_FAMILY) && (configCOMPILER==configCOMPILER_ARM_GCC)) + /*!< 1: enable special GDB stack backtrace debug helper; 0: disabled */ +#endif + +#ifndef configLTO_HELPER + #define configLTO_HELPER (1 && configCPU_FAMILY_IS_ARM(configCPU_FAMILY) && (configCOMPILER==configCOMPILER_ARM_GCC)) + /*!< 1: enable special GNU Link Time Optimizer (-lto) debug helper code; 0: disabled */ +#endif + +#ifndef configHEAP_SCHEME_IDENTIFICATION + #define configHEAP_SCHEME_IDENTIFICATION (1 && configCPU_FAMILY_IS_ARM(configCPU_FAMILY)) + /*!< 1: use constant freeRTOSMemoryScheme to identify memory scheme; 0: no constant used */ +#endif + +#ifndef configUSE_TOP_USED_PRIORITY + #define configUSE_TOP_USED_PRIORITY (1 && configCPU_FAMILY_IS_ARM(configCPU_FAMILY)) + /*!< 1: Makes sure uxTopUsedPriority is present (needed for SEGGER and OpenOCD thread aware debugging); 0: no special reference to uxTopUsedPriority */ +#endif + +#ifndef configLINKER_HEAP_BASE_SYMBOL +#if McuLib_CONFIG_NXP_SDK_USED + #define configLINKER_HEAP_BASE_SYMBOL _pvHeapStart +#else + #define configLINKER_HEAP_BASE_SYMBOL __HeapBase +#endif + /*!< Linker symbol used to denote the base address of the heap, used for heap memory scheme 6 (newlib). (KDS: __HeapBase, MCUXpresso: _pvHeapStart) */ +#endif + +#ifndef configLINKER_HEAP_LIMIT_SYMBOL +#if McuLib_CONFIG_NXP_SDK_USED + #define configLINKER_HEAP_LIMIT_SYMBOL _pvHeapLimit +#else + #define configLINKER_HEAP_LIMIT_SYMBOL __HeapLimit +#endif + /*!< Linker symbol used to denote the limit address of the heap, used for heap memory scheme 6 (newlib). (KDS: __HeapLimit, MCUXpresso: _pvHeapLimit) */ +#endif + +#ifndef configLINKER_HEAP_SIZE_SYMBOL +#if McuLib_CONFIG_NXP_SDK_USED + #define configLINKER_HEAP_SIZE_SYMBOL _HeapSize +#else + #define configLINKER_HEAP_SIZE_SYMBOL __heap_size +#endif + /*!< Linker symbol used to denote the size of the heap, used for heap memory scheme 6 (newlib). (KDS: __heap_size, MCUXpresso: _HeapSize) */ +#endif + +#ifndef configUSE_SHELL + #define configUSE_SHELL (1) + /*!< 1: enable Shell and command line support; 0: disabled */ +#endif + +#ifndef configRESET_MSP + #define configRESET_MSP (1) + /*!< 1: reset MSP at scheduler start (Cortex M3/M4/M7 only); 0: do not reset MSP */ +#endif + +/*----------------------------------------------------------- + * FreeRTOS Trace hook support + *----------------------------------------------------------- */ +#ifndef configUSE_PERCEPIO_TRACE_HOOKS + #define configUSE_PERCEPIO_TRACE_HOOKS 0 /* 1: Percepio Trace hooks, 0: not using Percepio Trace hooks */ +#endif +#define configUSE_TRACE_HOOKS configUSE_PERCEPIO_TRACE_HOOKS /* legacy configUSE_TRACE_HOOKS should not be used any more */ + +#ifndef configUSE_SEGGER_SYSTEM_VIEWER_HOOKS + #define configUSE_SEGGER_SYSTEM_VIEWER_HOOKS 0 /* 1: Segger System Viewer hooks, 0: not using Segger System Viewer hooks */ +#endif + +#ifndef configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS + #define configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS (1 && configUSE_SEGGER_SYSTEM_VIEWER_HOOKS) + /*!< 1: Generate heap events for Segger SystemView, 0: not generate heap events */ +#endif + +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_PERCEPIO_TRACE_HOOKS + #error "only one trace method can be active!" +#endif +/*----------------------------------------------------------- */ + +#endif /* __McuRTOS_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuRTTconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuRTTconfig.h new file mode 100644 index 0000000..2339ef6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuRTTconfig.h @@ -0,0 +1,91 @@ +/** + * \file + * \brief Configuration header file for Segger RTT. + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Segger RTT Module. + */ + +#ifndef __McuRTT_CONFIG_H +#define __McuRTT_CONFIG_H + +#include "McuLib.h" /* SDK and API used */ + +#ifndef RTT_USE_ASM + #define RTT_USE_ASM (0) + /*!< 1: use assembly version of low level buffer routines; 0: use C version */ +#endif + +#ifndef McuRTT_CONFIG_PROVIDE_SYSCALLS + #define McuRTT_CONFIG_PROVIDE_SYSCALLS (0) + /*!< 1: RTT library implements SysCalls; 0: no Syscalls implemented */ +#endif + +#ifndef McuRTT_CONFIG_BLOCKING_SEND + #define McuRTT_CONFIG_BLOCKING_SEND (0) + /*!< 1: using blocking call for stdio calls; 0: do not using blocking calls */ +#endif + +#ifndef McuRTT_CONFIG_BLOCKING_SEND_TIMEOUT_MS + #define McuRTT_CONFIG_BLOCKING_SEND_TIMEOUT_MS (0) + /*!< Timeout value for blocking calls for sending. Use zero for no timeout */ +#endif + +#ifndef McuRTT_CONFIG_BLOCKING_SEND_WAIT_MS + #define McuRTT_CONFIG_BLOCKING_SEND_WAIT_MS (0) + /*!< Waiting time during blocking send. Use zero for no waiting time */ +#endif + +#ifndef McuRTT_CONFIG_RTT_BUFFER_SIZE_UP + #define McuRTT_CONFIG_RTT_BUFFER_SIZE_UP (512) + /*!< Size of the up (Tx on the target side) buffer in bytes */ +#endif + +#ifndef McuRTT_CONFIG_RTT_BUFFER_SIZE_DOWN + #define McuRTT_CONFIG_RTT_BUFFER_SIZE_DOWN (64) + /*!< Size of the down (Rx on the target side) buffer in bytes */ +#endif + +#ifndef McuRTT_CONFIG_RTT_BUFFER_SIZE_PRINTF + #define McuRTT_CONFIG_RTT_BUFFER_SIZE_PRINTF (64) + /*!< Size of the buffer for RTT printf() in bytes */ +#endif + +#ifndef McuRTT_CONFIG_RTT_UP_BUFFER_MODE + #define McuRTT_CONFIG_RTT_UP_BUFFER_MODE (SEGGER_RTT_MODE_NO_BLOCK_SKIP) + /*!< Up buffer mode: SEGGER_RTT_MODE_NO_BLOCK_SKIP, SEGGER_RTT_MODE_NO_BLOCK_TRIM or SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL */ +#endif + +#ifndef McuRTT_CONFIG_RTT_DOWN_BUFFER_MODE + #define McuRTT_CONFIG_RTT_DOWN_BUFFER_MODE (SEGGER_RTT_MODE_NO_BLOCK_SKIP) + /*!< Up buffer mode: SEGGER_RTT_MODE_NO_BLOCK_SKIP, SEGGER_RTT_MODE_NO_BLOCK_TRIM or SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL */ +#endif + +#ifndef McuRTT_CONFIG_RTT_MAX_NUM_UP_BUFFERS + #define McuRTT_CONFIG_RTT_MAX_NUM_UP_BUFFERS (3) + /*!< Max. number of up-buffers (T->H) available on this target (Default: 3) */ +#endif + +#ifndef McuRTT_CONFIG_RTT_MAX_NUM_DOWN_BUFFERS + #define McuRTT_CONFIG_RTT_MAX_NUM_DOWN_BUFFERS (3) + /*!< Max. number of down-buffers (H->T) available on this target (Default: 3) */ +#endif + +#if McuLib_CONFIG_SDK_USE_FREERTOS + #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY configMAX_SYSCALL_INTERRUPT_PRIORITY /* Interrupts at this level and below will be blocked (valid values 1-15) */ +#else + #define SEGGER_RTT_LOCK_INTERRUPT_LEVEL (3) /* Interrupts at this level and below will be blocked (valid values 1-15 for Kinetis) */ + #define SEGGER_RTT_PRIO_BITS 4 /* NXP Kinetis M4(F) has 4 interrupt priority bits */ + #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (SEGGER_RTT_LOCK_INTERRUPT_LEVEL<<(8-SEGGER_RTT_PRIO_BITS)) +#endif + +/* channel0 settings */ +#define SEGGER_RTT_CHANNEL_0_ENABLED (1) /* 1: initialize channel; 0: do not initialize channel */ +#define SEGGER_RTT_CHANNEL_0_NAME "Terminal" +#define SEGGER_RTT_CHANNEL_0_BUFFER_SIZE_UP (McuRTT_CONFIG_RTT_BUFFER_SIZE_UP) +#define SEGGER_RTT_CHANNEL_0_BUFFER_SIZE_DOWN (McuRTT_CONFIG_RTT_BUFFER_SIZE_DOWN) +#define SEGGER_RTT_CHANNEL_0_MODE_UP SEGGER_RTT_MODE_NO_BLOCK_SKIP +#define SEGGER_RTT_CHANNEL_0_MODE_DOWN SEGGER_RTT_MODE_NO_BLOCK_SKIP + +#endif /* __McuRTT_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuRingbufferconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuRingbufferconfig.h new file mode 100644 index 0000000..458b821 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuRingbufferconfig.h @@ -0,0 +1,25 @@ +/** + * \file + * \brief Configuration header file for RingBuffer. + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Ring Buffer module. + */ + +#ifndef __McuRingbuffer_CONFIG_H +#define __McuRingbuffer_CONFIG_H + +#ifndef McuRingbuffer_CONFIG_REENTRANT + #define McuRingbuffer_CONFIG_REENTRANT 1 /* 1: reentrant implementation; 0: non-reentrant implementation */ +#endif + +#ifndef McuRingbuffer_CONFIG_BUF_SIZE + #define McuRingbuffer_CONFIG_BUF_SIZE 64 /* number of elements in the buffer */ +#endif + +#ifndef McuRingbuffer_CONFIG_ELEM_SIZE + #define McuRingbuffer_CONFIG_ELEM_SIZE 1 /* size of a single element in bytes */ +#endif + +#endif /* __McuRingbuffer_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuSDEPconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuSDEPconfig.h new file mode 100644 index 0000000..27dd34b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuSDEPconfig.h @@ -0,0 +1,49 @@ +/*! + * Copyright (c) 2024, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * \file + * \brief \brief Configuration items for the McuSDEP module. + */ + +#ifndef MCUDEPCONFIG_H_ +#define MCUDEPCONFIG_H_ + +#include "McuLib.h" + +#ifndef McuSDEP_CONFIG_IS_ENABLED + #define McuSDEP_CONFIG_IS_ENABLED (0 && McuLib_CONFIG_SDK_USE_FREERTOS) + /*!< If the SDEP module is enabled or not. */ +#endif + +#ifndef McuSDEP_CONFIG_USE_FRAMING + #define McuSDEP_CONFIG_USE_FRAMING (0) + /* if using SDEP messages with a framing, useful for shared SDEP and SDEP communication */ +#endif + +#ifndef McuSDEP_CONFIG_MSG_FRAMING_START + #define McuSDEP_CONFIG_MSG_FRAMING_START '@' /* marker to start an SDEP message */ + /*!< used if McuSDEP_CONFIG_USE_FRAMING is enabled, used as starting frame */ +#endif + +#ifndef McuSDEP_CONFIG_MSG_FRAMING_END + #define McuSDEP_CONFIG_MSG_FRAMING_END '\n' /* marker to end a SDEP message */ + /*!< used if McuSDEP_CONFIG_USE_FRAMING is enabled, used as ending frame */ +#endif + +#ifndef McuSDEP_CONFIG_RX_BUFFER_SIZE + #define McuSDEP_CONFIG_RX_BUFFER_SIZE (64) + /* size of the buffer for the incoming SDEP data */ +#endif + +#ifndef McuSDEP_CONFIG_SHELL_TO_SDEP_QUEUE_LENGTH + #define McuSDEP_CONFIG_SHELL_TO_SDEP_QUEUE_LENGTH (128) + /*!< Size of buffer of data sent by shell to SDEP */ +#endif + +#ifndef McuSDEP_CONFIG_USE_FREERTOS + #define McuSDEP_CONFIG_USE_FREERTOS (McuLib_CONFIG_SDK_USE_FREERTOS) + /*!< If FreeRTOS (Queues) shall be used or not */ +#endif + +#endif /* MCUDEPCONFIG_H_ */ \ No newline at end of file diff --git a/TSM_PicoW_Sensor/McuLib/config/McuSDKBitIOconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuSDKBitIOconfig.h new file mode 100644 index 0000000..fc4f948 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuSDKBitIOconfig.h @@ -0,0 +1,17 @@ +/** + * \file + * \brief Configuration header file for SDK_BitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SDK Bit I/O module. + */ + +#ifndef __McuSDKBitIO_CONFIG_H +#define __McuSDKBitIO_CONFIG_H + +#ifndef McuSDKBitIO_CONFIG_DO_PIN_MUXING + #define McuSDKBitIO_CONFIG_DO_PIN_MUXING 0 /* 1: perform pin muxing in Init(), 0: do not do pin muxing */ +#endif + +#endif /* __McuSDKBitIO_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuSHT31config.h b/TSM_PicoW_Sensor/McuLib/config/McuSHT31config.h new file mode 100644 index 0000000..ef4b167 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuSHT31config.h @@ -0,0 +1,27 @@ +/*! + * Copyright (c) 2019, Erich Styger + * All rights reserved. + * \file + * \brief Configuration header file for McuSHT31 sensor from Sensirion. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MCUSHT31_CONFIG_H_ +#define MCUSHT31_CONFIG_H_ + +#ifndef MCUSHT31_CONFIG_PARSE_COMMAND_ENABLED + #define MCUSHT31_CONFIG_PARSE_COMMAND_ENABLED (1) +#endif + +#ifndef McuSHT31_CONFIG_I2C_ADDR + #define McuSHT31_CONFIG_I2C_ADDR (0x44) /* default I2C address with ADDR pin pulled LOW (default on Adafruit board) */ + //#define McuSHT31_I2C_ADDR (0x45) /* I2C address with ADDR pin pulled HIGH: pull ADR pin to VIN */ +#endif + +#ifndef McuSHT31_CONFIG_READ_WAIT_MS + #define McuSHT31_CONFIG_READ_WAIT_MS (25) + /*!< SHT31 needs a wait time for sampling the data */ +#endif + +#endif /* MCUSHT31_CONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuSHT40config.h b/TSM_PicoW_Sensor/McuLib/config/McuSHT40config.h new file mode 100644 index 0000000..e53950c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuSHT40config.h @@ -0,0 +1,28 @@ +/*! + * Copyright (c) 2019, 2022 Erich Styger + * All rights reserved. + * \file + * \brief Configuration header file for McuSHT40 (Sensirion SHT40 sensor). + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MCUSHT40_CONFIG_H_ +#define MCUSHT40_CONFIG_H_ + +/* + SHT40-AD1B base RH&T accur., 0x44 I2C addr. + SHT40-BD1B base RH&T accur., 0x45 I2C addr. + SHT41-AD1B Intermed. RH&T accur., 0x44 I2C addr. + SHT45-AD1B ±1.5 %RH, ±0.1°C accur., 0x44 I2C addr. + */ +#ifndef McuSHT40_CONFIG_I2C_ADDR + #define McuSHT40_CONFIG_I2C_ADDR (0x44) /* I2C address of the sensor */ +#endif + + +#ifndef MCUSHT40_CONFIG_PARSE_COMMAND_ENABLED + #define MCUSHT40_CONFIG_PARSE_COMMAND_ENABLED (1) +#endif + +#endif /* MCUSHT40_CONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuSPIconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuSPIconfig.h new file mode 100644 index 0000000..df47002 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuSPIconfig.h @@ -0,0 +1,176 @@ +/*! + * Copyright (c) 2022, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * \file + * \brief Configuration items for the McuSPI module. + */ + +#ifndef MCUSPICONFIG_H_ +#define MCUSPICONFIG_H_ + +/* different hardware pre-configurations */ +#define MCUSPI_CONFIG_HW_TEMPLATE_NONE 0 +#define MCUSPI_CONFIG_HW_TEMPLATE_KINETIS_K22_SPI0 1 +#define MCUSPI_CONFIG_HW_TEMPLATE_KINETIS_K22_SPI1 2 +#define MCUSPI_CONFIG_HW_TEMPLATE_LPC55S16_FC3 3 +#define MCUSPI_CONFIG_HW_TEMPLATE_LPC55S59_FC8 4 +#define MCUSPI_CONFIG_HW_TEMPLATE_RP2040_SPI0 5 +#define MCUSPI_CONFIG_HW_TEMPLATE_RP2040_SPI1 6 +#define MCUSPI_CONFIG_HW_TEMPLATE_ESP32_SPI3 7 + +/* NOTE: Pin muxing for the MISO/MOSI/CLK has to be done in the pins tool! */ + +#ifndef MCUSPI_CONFIG_USE_CS + #define MCUSPI_CONFIG_USE_CS (1) + /*!< 1: use and initialize CS pin; 0: CS pin is handled by the application */ +#endif + +#ifndef MCUSPI_CONFIG_HW_TEMPLATE + #define MCUSPI_CONFIG_HW_TEMPLATE MCUSPI_CONFIG_HW_TEMPLATE_NONE +#endif + +#if MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_KINETIS_K22_SPI0 + #define MCUSPI_CONFIG_HW_SPI_MASTER SPI0 + #define MCUSPI_CONFIG_HW_SPI_MASTER_CLK_SRC DSPI0_CLK_SRC + #define MCUSPI_CONFIG_HW_SPI_MASTER_CLK_FREQ CLOCK_GetFreq(DSPI0_CLK_SRC) + #define MCUSPI_CONFIG_HW_SPI_MASTER_PCS_FOR_INIT kDSPI_Pcs1 + #define MCUSPI_CONFIG_HW_SPI_MASTER_PCS_FOR_TRANSFER kDSPI_MasterPcs1 /* note that this is actually not used: the CS pin below is used instead */ + + #define MCUSPI_CONFIG_HW_CS_GPIO GPIOD + #define MCUSPI_CONFIG_HW_CS_PORT PORTD + #define MCUSPI_CONFIG_HW_CS_PIN 4 + + #ifndef MCUSPI_CONFIG_HW_CS_INIT + #define MCUSPI_CONFIG_HW_CS_INIT() \ + CLOCK_EnableClock(kCLOCK_PortD); + #endif + +#elif MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_KINETIS_K22_SPI1 + #define MCUSPI_CONFIG_HW_SPI_MASTER SPI1 + #define MCUSPI_CONFIG_HW_SPI_MASTER_CLK_SRC DSPI1_CLK_SRC + #define MCUSPI_CONFIG_HW_SPI_MASTER_CLK_FREQ CLOCK_GetFreq(DSPI1_CLK_SRC) + #define MCUSPI_CONFIG_HW_SPI_MASTER_PCS_FOR_INIT kDSPI_Pcs1 + #define MCUSPI_CONFIG_HW_SPI_MASTER_PCS_FOR_TRANSFER kDSPI_MasterPcs1 /* note that this is actually not used: the CS pin below is used instead */ + + #define MCUSPI_CONFIG_HW_CS_GPIO GPIOB + #define MCUSPI_CONFIG_HW_CS_PORT PORTB + #define MCUSPI_CONFIG_HW_CS_PIN 18 + + #ifndef MCUSPI_CONFIG_HW_CS_INIT + #define MCUSPI_CONFIG_HW_CS_INIT() \ + CLOCK_EnableClock(kCLOCK_PortB); + #endif + +#elif MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_LPC55S16_FC3 + /* FC3_SPI_SCK, P0_6 + * FC3_SPI_SSEL0, P0_4 + * FC3_SPI_MOSI, P0_3 + * FC3_SPI_MISO, P0_2 + */ + #define MCUSPI_CONFIG_HW_SPI_MASTER SPI3 + #define MCUSPI_CONFIG_HW_SPI_MASTER_IRQ FLEXCOMM3_IRQn + #define MCUSPI_CONFIG_HW_SPI_MASTER_CLK_SRC kCLOCK_Flexcomm3 + #define MCUSPI_CONFIG_HW_SPI_MASTER_CLK_FREQ CLOCK_GetFlexCommClkFreq(3U) + #define MCUSPI_CONFIG_HW_SPI_SSEL 1 + #define MCUSPI_CONFIG_HW_SPI_SPOL kSPI_SpolActiveAllLow + + #define MCUSPI_CONFIG_HW_SPI_INIT() \ + CLOCK_AttachClk(kFRO12M_to_FLEXCOMM7); /* attach 12 MHz clock to SPI3 */ \ + RESET_PeripheralReset(kFC7_RST_SHIFT_RSTn); /* reset FLEXCOMM for SPI */ + + #define MCUSPI_CONFIG_HW_CS_GPIO GPIO + #define MCUSPI_CONFIG_HW_CS_PORT 0 + #define MCUSPI_CONFIG_HW_CS_PIN 4 + + #ifndef MCUSPI_CONFIG_HW_CS_INIT + #define MCUSPI_CONFIG_HW_CS_INIT() /* nothing */ + #endif + +#elif MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_LPC55S59_FC8 + #define MCUSPI_CONFIG_HW_SPI_MASTER SPI8 + #define MCUSPI_CONFIG_HW_SPI_MASTER_IRQ FLEXCOMM8_IRQn + #define MCUSPI_CONFIG_HW_SPI_MASTER_CLK_SRC kCLOCK_Flexcomm8 + #define MCUSPI_CONFIG_HW_SPI_MASTER_CLK_FREQ CLOCK_GetFlexCommClkFreq(8U) + #define MCUSPI_CONFIG_HW_SPI_SSEL 1 + #define MCUSPI_CONFIG_HW_SPI_SPOL kSPI_SpolActiveAllLow + + #define MCUSPI_CONFIG_HW_SPI_INIT() \ + CLOCK_AttachClk(kFRO12M_to_FLEXCOMM8); /* attach 12 MHz clock to SPI8 */ \ + RESET_PeripheralReset(kFC8_RST_SHIFT_RSTn); /* reset FLEXCOMM for SPI */ + + #define MCUSPI_CONFIG_HW_CS_GPIO GPIO + #define MCUSPI_CONFIG_HW_CS_PORT 0 + #define MCUSPI_CONFIG_HW_CS_PIN 4 + + #ifndef MCUSPI_CONFIG_HW_CS_INIT + #define MCUSPI_CONFIG_HW_CS_INIT() /* nothing */ + #endif + +#elif MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_RP2040_SPI0 + #ifndef MCUSPI_CONFIG_HW_SCLK_PIN + #define MCUSPI_CONFIG_HW_SCLK_PIN (18) /* SPI0_SCK */ + #endif + #ifndef MCUSPI_CONFIG_HW_MOSI_PIN + #define MCUSPI_CONFIG_HW_MOSI_PIN (19) /* SPI0_TX */ + #endif + #ifndef MCUSPI_CONFIG_HW_MISO_PIN + #define MCUSPI_CONFIG_HW_MISO_PIN (16) /* SPI0_RX */ + #endif + #ifndef MCUSPI_CONFIG_HW_CS_PIN + #define MCUSPI_CONFIG_HW_CS_PIN (17) /* SPI0_CSn */ + #endif + #ifndef MCUSPI_CONFIG_HW_SPI_INIT + #define MCUSPI_CONFIG_HW_SPI_INIT() /* nothing */ + #endif + #ifndef MCUSPI_CONFIG_HW_CS_INIT + #define MCUSPI_CONFIG_HW_CS_INIT() /* nothing */ + #endif + +#elif MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_RP2040_SPI1 + #ifndef MCUSPI_CONFIG_HW_SCLK_PIN + #define MCUSPI_CONFIG_HW_SCLK_PIN (10) /* SPI1_SCK */ + #endif + #ifndef MCUSPI_CONFIG_HW_MOSI_PIN + #define MCUSPI_CONFIG_HW_MOSI_PIN (11) /* SPI1_TX */ + #endif + #ifndef MCUSPI_CONFIG_HW_MISO_PIN + #define MCUSPI_CONFIG_HW_MISO_PIN (12) /* SPI1_RX */ + #endif + #ifndef MCUSPI_CONFIG_HW_CS_PIN + #define MCUSPI_CONFIG_HW_CS_PIN (13) /* SPI1_CSn */ + #endif + #ifndef MCUSPI_CONFIG_HW_SPI_INIT + #define MCUSPI_CONFIG_HW_SPI_INIT() /* nothing */ + #endif + #ifndef MCUSPI_CONFIG_HW_CS_INIT + #define MCUSPI_CONFIG_HW_CS_INIT() /* nothing */ + #endif + +#elif MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_ESP32_SPI3 + /* SPI3, commonly referred as VSPI */ + #ifndef MCUSPI_CONFIG_HW_SCLK_PIN + #define MCUSPI_CONFIG_HW_SCLK_PIN (GPIO_NUM_18) /* VSPI, IO18 */ + #endif + #ifndef MCUSPI_CONFIG_HW_MOSI_PIN + #define MCUSPI_CONFIG_HW_MOSI_PIN (GPIO_NUM_23) /* VSPI, IO23 */ + #endif + #ifndef MCUSPI_CONFIG_HW_MISO_PIN + #define MCUSPI_CONFIG_HW_MISO_PIN (GPIO_NUM_19) /* VSPI, IO19 */ + #endif + #ifndef MCUSPI_CONFIG_HW_CS_PIN + #define MCUSPI_CONFIG_HW_CS_PIN (GPIO_NUM_5) /* VSPI, IO5 */ + #endif + #ifndef MCUSPI_CONFIG_HW_SPI_INIT + #define MCUSPI_CONFIG_HW_SPI_INIT() /* nothing */ + #endif + #ifndef MCUSPI_CONFIG_HW_CS_INIT + #define MCUSPI_CONFIG_HW_CS_INIT() /* nothing */ + #endif +#endif /* MCUSPI_CONFIG_HW_TEMPLATE */ + +#ifndef MCUSPI_CONFIG_TRANSFER_BAUDRATE + #define MCUSPI_CONFIG_TRANSFER_BAUDRATE 500000U /*! Transfer baudrate - 500k */ +#endif + +#endif /* MCUSPICONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuSSD1306config.h b/TSM_PicoW_Sensor/McuLib/config/McuSSD1306config.h new file mode 100644 index 0000000..9d3ef5b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuSSD1306config.h @@ -0,0 +1,103 @@ +/** + * \file + * \brief Application configuration file for SSD1306 display driver + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is a configuration header file to configure the module McuSSD1306 (SSD1306). + * You can configure the defines directly in this file or with the compiler -D option. + */ + +#ifndef __McuSSD1306_CONFIG_H +#define __McuSSD1306_CONFIG_H + +#ifndef McuSSD1306_CONFIG_I2C_HEADER_FILE + #define McuSSD1306_CONFIG_I2C_HEADER_FILE "McuGenericI2C.h" + /*!< Header file to be included for the SPI driver */ +#endif + +/* Which display is used: only one of the two options below can be enabled: */ +#define McuSSD1306_CONFIG_SSD1306_SIZE_TYPE (12864) + /*!< either 12864 (128x64) or 12832 (128x32) */ + +#ifndef McuSSD1306_CONFIG_SSD1306_HAS_RST + #define McuSSD1306_CONFIG_SSD1306_HAS_RST (0) + #define McuSSD1306_CONFIG_SSD1306_RESET_LOW() Reset_ClrVal() /* RESET signal low (reset is low active) */ + #define McuSSD1306_CONFIG_SSD1306_RESET_HIGH() Reset_SetVal() /* RESET signal high */ + #define McuSSD1306_CONFIG_RESET_HEADER_FILE "ResetPin.h" +#endif +#if McuSSD1306_CONFIG_SSD1306_HAS_RST + #include McuSSD1306_CONFIG_RESET_HEADER_FILE /* reset pin interface */ +#endif + +#ifndef McuSSD1306_CONFIG_SSD1306_EXTERNAL + #define McuSSD1306_CONFIG_SSD1306_EXTERNAL (0) + /*!< set to 1 if external vcc is connected, otherwise 0 if internal dc/dc converter is used */ +#endif +#ifndef McuSSD1306_CONFIG_SSD1306_I2C_ADDR + #define McuSSD1306_CONFIG_SSD1306_I2C_ADDR (60) + /*!< I2C 7bit (unshifted) device address, usually 0x3C (60) (0b11'1100) or 0x3D (61) (0b11'1101) */ +#endif + +#ifndef McuSSD1306_CONFIG_SSD1306_DRIVER_TYPE + #define McuSSD1306_CONFIG_SSD1306_DRIVER_TYPE (1306) + /*!< Either 1306 for SSD1306 or 1106 for SH1106 */ +#endif + +#ifndef McuSSD1306_CONFIG_SSD1306_START_COLUMN_OFFSET + #define McuSSD1306_CONFIG_SSD1306_START_COLUMN_OFFSET (0) + /*!< Some SH1106 displays need a start column of 2 instead of the default 0 */ +#endif + +#ifndef McuSSD1306_CONFIG_SSD1306_I2C_DELAY_US + #define McuSSD1306_CONFIG_SSD1306_I2C_DELAY_US (0) + /*!< I2C transaction delay in us */ +#endif + +#ifndef McuSSD1306_CONFIG_DYNAMIC_DISPLAY_ORIENTATION + #define McuSSD1306_CONFIG_DYNAMIC_DISPLAY_ORIENTATION (0) + /*!< 1: Use SetDisplayOrientation() to change display orientation at runtime; 0: fixed display orientation */ +#endif + +/* display orientation types used in macro below: */ +#define McuSSD1306_CONFIG_ORIENTATION_PORTRAIT 0 +#define McuSSD1306_CONFIG_ORIENTATION_PORTRAIT180 1 +#define McuSSD1306_CONFIG_ORIENTATION_LANDSCAPE 2 +#define McuSSD1306_CONFIG_ORIENTATION_LANDSCAPE180 3 + +#ifndef McuSSD1306_CONFIG_FIXED_DISPLAY_ORIENTATION + #define McuSSD1306_CONFIG_FIXED_DISPLAY_ORIENTATION McuSSD1306_CONFIG_ORIENTATION_LANDSCAPE + /*!< Fixed display orientation setting, one of: + McuSSD1306_CONFIG_ORIENTATION_PORTRAIT + McuSSD1306_CONFIG_ORIENTATION_PORTRAIT180 + McuSSD1306_CONFIG_ORIENTATION_LANDSCAPE + McuSSD1306_CONFIG_ORIENTATION_LANDSCAPE180 + */ +#endif + +#ifndef McuSSD1306_CONFIG_INITIALIZE_IN_INIT + #define McuSSD1306_CONFIG_INITIALIZE_IN_INIT (1) + /*!< 1: Initialize LCD during PE_low_level_init(); 0: Do not initialize during PE_low_level_init() */ +#endif + +#ifndef McuSSD1306_CONFIG_CLEAR_DISPLAY_IN_INIT + #define McuSSD1306_CONFIG_CLEAR_DISPLAY_IN_INIT (0) + /*!< 1: Clear display at the end of Init(); 0: Do not clear display at the end of Init() */ +#endif + +#ifndef McuSSD1306_CONFIG_INIT_DELAY_MS + #define McuSSD1306_CONFIG_INIT_DELAY_MS (100) + /*!< Additional delay (milliseconds) in Init(). Use zero for no delay. */ +#endif + +#ifndef McuSSD1306_CONFIG_USE_I2C_BLOCK_TRANSFER + #define McuSSD1306_CONFIG_USE_I2C_BLOCK_TRANSFER (1) + /*!< 1: use I2C Block transfer for better performance. 0: disabled, e.g. for slower displays */ +#endif + +#ifndef McuSSD1306_CONFIG_USE_RAM_BUFFER + #define McuSSD1306_CONFIG_USE_RAM_BUFFER (1) + /*!< 1: Use RAM Buffer for display memory; 0: Do not use RAM buffer (write directly to display) */ +#endif + +#endif /* __McuSSD1306_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuST7735_config.h b/TSM_PicoW_Sensor/McuLib/config/McuST7735_config.h new file mode 100644 index 0000000..4dd50c3 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuST7735_config.h @@ -0,0 +1,75 @@ +/*! + * Copyright (c) 2023, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * \file + * \brief Configuration items for the ST7735 display driver. + */ + +#ifndef MCUST7735_CONFIG_H_ +#define MCUST7735_CONFIG_H_ + +/* different display types supported */ +#define MCUST7735_TYPE_128X128 (1) +#define MCUST7735_TYPE_160X80 (2) +#define MCUST7735_TYPE_160X128 (3) + +#ifndef McuST7735_CONFIG_DISPLAY_TYPE + #define McuST7735_CONFIG_DISPLAY_TYPE MCUST7735_TYPE_128X128 +#endif + +#ifndef McuST7735_CONFIG_IS_ENABLED + #define McuST7735_CONFIG_IS_ENABLED (0) + /*!< 1: driver is enabled. 0: driver is not enabled */ +#endif + +/* CS pin */ +#ifndef McuST7735_CONFIG_CS_PIN_GPIO + #define McuST7735_CONFIG_CS_PIN_GPIO GPIOB + /*!< GPIO for CS Pin */ +#endif + +#ifndef McuST7735_CONFIG_CS_PIN_PORT + #define McuST7735_CONFIG_CS_PIN_PORT PORTB + /*!< PORT for CS Pin */ +#endif + +#ifndef McuST7735_CONFIG_CS_PIN_NUMBER + #define McuST7735_CONFIG_CS_PIN_NUMBER 0 + /*!< Pin number of the CS Pin */ +#endif + +/* DC pin */ +#ifndef McuST7735_CONFIG_DC_PIN_GPIO + #define McuST7735_CONFIG_DC_PIN_GPIO GPIOB + /*!< GPIO for DC Pin */ +#endif + +#ifndef McuST7735_CONFIG_DC_PIN_PORT + #define McuST7735_CONFIG_DC_PIN_PORT PORTB + /*!< PORT for DC Pin */ +#endif + +#ifndef McuST7735_CONFIG_DC_PIN_NUMBER + #define McuST7735_CONFIG_DC_PIN_NUMBER 1 + /*!< Pin number of the DC Pin */ +#endif + +/* RESET pin */ +#ifndef McuST7735_CONFIG_RESET_PIN_GPIO + #define McuST7735_CONFIG_RESET_PIN_GPIO GPIOB + /*!< GPIO for CS Pin */ +#endif + +#ifndef McuST7735_CONFIG_RESET_PIN_PORT + #define McuST7735_CONFIG_RESET_PIN_PORT PORTB + /*!< PORT for CS Pin */ +#endif + +#ifndef McuST7735_CONFIG_RESET_PIN_NUMBER + #define McuST7735_CONFIG_RESET_PIN_NUMBER 2 + /*!< Pin number of the CSN Pin */ +#endif + + +#endif /* MCUST7735_CONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuSTM32HALI2Cconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuSTM32HALI2Cconfig.h new file mode 100644 index 0000000..af07d12 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuSTM32HALI2Cconfig.h @@ -0,0 +1,18 @@ +/** + * \file + * \brief Configuration header file for STM32CubeI2C. + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the software (bit-banging) I2C module. + */ + +#ifndef __McuSTM32HALI2C_CONFIG_H +#define __McuSTM32HALI2C_CONFIG_H + + +/* specify HAL header file for your device: */ +#include "stm32f3xx_hal.h" +#include "stm32f3xx_hal_i2c.h" + +#endif /* __McuSTM32HALI2C_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuSWOconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuSWOconfig.h new file mode 100644 index 0000000..4ea571b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuSWOconfig.h @@ -0,0 +1,57 @@ +/*! + * Copyright (c) 2021-2023, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * \file + * \brief Configuration items for the McuSWO module. + */ + +#ifndef MCUSWOCONFIG_H_ +#define MCUSWOCONFIG_H_ + +#ifndef McuSWO_CONFIG_HAS_SWO + #define McuSWO_CONFIG_HAS_SWO (0) + /*!< 1: MCU has SWO; 0: MCUS does not have SWO */ +#endif + +#ifndef McuSWO_CONFIG_SPEED_BAUD + #define McuSWO_CONFIG_SPEED_BAUD (96000000) + /*!< baud of SWO data. Note that the J-Link can consume up to 400 kHz. */ +#endif + +#ifndef McuSWO_CONFIG_TERMINAL_CHANNEL + #define McuSWO_CONFIG_TERMINAL_CHANNEL (0) + /*!< default SWO channel/stimulus for terminal */ +#endif + +#ifndef McuSWO_CONFIG_DO_MUXING + #define McuSWO_CONFIG_DO_MUXING (1) + /*! if SWO pin muxing shall be done inside McuSWO_Init(). Otherwise pin muxing is responsible of the application */ +#endif + +#ifndef McuSWO_CONFIG_DO_CLOCKING + #define McuSWO_CONFIG_DO_CLOCKING (1) + /*! if SWO clocking shall be configured inside McuSWO_Init(). Otherwise pin muxing is responsible of the application */ +#endif + +#ifndef McuSWO_CONFIG_DO_SWO_INIT + #define McuSWO_CONFIG_DO_SWO_INIT (1) + /*! if SWO/ITM device shall be initialized inside McuSWO_Init(). Otherwise it needs to be done in the application or in the debugger. */ +#endif + +#ifndef McuSWO_CONFIG_RETARGET_STDIO + #define McuSWO_CONFIG_RETARGET_STDIO (0) + /*! 1: implement hooks to re-target stdin (e.g. scanf()) input and stdout (printf()) output. */ +#endif + +#ifndef McuSWO_CONFIG_PC_SAMPLING + #define McuSWO_CONFIG_PC_SAMPLING (0) + /*!< if SWO PC sampling is turned on */ +#endif + +#ifndef McuSWO_CONFIG_SHELL_ENABLED + #define McuSWO_CONFIG_SHELL_ENABLED (1) + /*!< 1: Shell support enabled; 0: no command line shell */ +#endif + +#endif /* MCUSWOCONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuSemihost_config.h b/TSM_PicoW_Sensor/McuLib/config/McuSemihost_config.h new file mode 100644 index 0000000..ab69c69 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuSemihost_config.h @@ -0,0 +1,89 @@ +/*! + * Copyright (c) 2023, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * \file + * \brief Configuration items for the McuSemihost module. + */ + +#ifndef MCUSEMIHOST_CONFIG_H_ +#define MCUSEMIHOST_CONFIG_H_ + +#include "McuLib.h" + +#ifndef McuSemihost_CONFIG_IS_ENABLED + #define McuSemihost_CONFIG_IS_ENABLED (McuLib_CONFIG_CPU_IS_ARM_CORTEX_M) + /* 1 if module is enabled, only for ARM Cortex-M; 0 otherwise */ +#endif + +#define McuSemihost_DEBUG_CONNECTION_GENERIC (0) /*!< generic debug probe */ +#define McuSemihost_DEBUG_CONNECTION_LINKSERVER (1) /*!< NXP Linkserver debug probe */ +#define McuSemihost_DEBUG_CONNECTION_SEGGER (2) /*!< SEGGER J-Link debug probe */ +#define McuSemihost_DEBUG_CONNECTION_PEMICRO (3) /*!< P&E Multilink debug probe */ +#define McuSemihost_DEBUG_CONNECTION_PYOCD (4) /*!< PyOCD debug probe */ + +#ifndef McuSemihost_CONFIG_DEBUG_CONNECTION + #define McuSemihost_CONFIG_DEBUG_CONNECTION McuSemihost_DEBUG_CONNECTION_GENERIC +#endif + +#ifndef McuSemihost_CONFIG_INIT_STDIO_HANDLES + #define McuSemihost_CONFIG_INIT_STDIO_HANDLES (0) + /*!< if standard I/O handles (stdin, stdout, stderr) shall be initialized (1) or not (0): Note that McuRdiMon initializes the handles too! */ +#endif + +/* certain functionality is not implemented depending on the debug connection */ +#ifndef McuSemihost_CONFIG_HAS_SYS_RENAME + /* SEGGER does not allow it for security reason, PyOCD reports 'unimplemented request' */ + #define McuSemihost_CONFIG_HAS_SYS_RENAME (!( McuSemihost_CONFIG_DEBUG_CONNECTION==McuSemihost_DEBUG_CONNECTION_SEGGER \ + || McuSemihost_CONFIG_DEBUG_CONNECTION==McuSemihost_DEBUG_CONNECTION_LINKSERVER \ + || McuSemihost_CONFIG_DEBUG_CONNECTION==McuSemihost_DEBUG_CONNECTION_PYOC \ + ) \ + ) +#endif + +#ifndef McuSemihost_CONFIG_HAS_SYS_REMOVE + /* SEGGER does not allow it for security reason, PyOCD reports 'unimplemented request' */ + #define McuSemihost_CONFIG_HAS_SYS_REMOVE (!(McuSemihost_CONFIG_DEBUG_CONNECTION==McuSemihost_DEBUG_CONNECTION_SEGGER || McuSemihost_CONFIG_DEBUG_CONNECTION==McuSemihost_DEBUG_CONNECTION_PYOCD)) +#endif + +#ifndef McuSemihost_CONFIG_HAS_SYS_TMPNAME + /* SEGGER does not allow it for security reason, PyOCD reports 'unimplemented request' */ + #define McuSemihost_CONFIG_HAS_SYS_TMPNAME (!(McuSemihost_CONFIG_DEBUG_CONNECTION==McuSemihost_DEBUG_CONNECTION_SEGGER || McuSemihost_CONFIG_DEBUG_CONNECTION==McuSemihost_DEBUG_CONNECTION_PYOCD)) +#endif + +#ifndef McuSemihost_CONFIG_USE_BUFFERED_IO + #define McuSemihost_CONFIG_USE_BUFFERED_IO (1) + /*!< if std I/O shall use a buffer and only write on buffer end or after a '\n' or based on McuSemihost_CONFIG_BUFFER_IO_FLUSH */ +#endif + +#ifndef McuSemihost_CONFIG_BUFFER_IO_SIZE + #define McuSemihost_CONFIG_BUFFER_IO_SIZE (64) + /*!< size in bytes for I/O buffer */ +#endif + +#ifndef McuSemihost_CONFIG_BUFFER_IO_FLUSH + #define McuSemihost_CONFIG_BUFFER_IO_FLUSH (0) + /*!< 1: I/O buffer is written buffer is full or with McuSemihost_StdIOFlush(); 0: I/O buffer is written after a '\n' */ +#endif + +#ifndef McuSemihost_CONFIG_LOG_ENABLED + #define McuSemihost_CONFIG_LOG_ENABLED (0) + /*!< 1: Logging semihost activities with McuLog; 0: Logging disabled */ +#endif + +#ifndef McuSemihost_CONFIG_RETARGET_STDLIB + #define McuSemihost_CONFIG_RETARGET_STDLIB (0) + /*!< 1: stdlib retargeting for; 0: no retargeting */ +#endif + +#ifndef McuSemihost_CONFIG_CUT_FILENAME_PREFIX + #define McuSemihost_CONFIG_CUT_FILENAME_PREFIX (0) + /*!< 1: cut file name previx specified in McuSemihost_CONFIG_CUT_FILENAME_PREFIX_STR; 0: prefix cutting with */ +#endif + +#ifndef McuSemihost_CONFIG_CUT_FILENAME_PREFIX_STR + #define McuSemihost_CONFIG_CUT_FILENAME_PREFIX_STR "" + /*!< String to be removed as prefix (start) of the file name used. Useful for semihosting in DevContainers */ +#endif + +#endif /* MCUSEMIHOST_CONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuShellCdcDeviceconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuShellCdcDeviceconfig.h new file mode 100644 index 0000000..dc09e4e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuShellCdcDeviceconfig.h @@ -0,0 +1,39 @@ +/*! + * Copyright (c) 2024, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * \file + * \brief \brief Configuration items for the McuShellCdcDevice module. + */ + +#ifndef MCUSHELLCDCDEVICECONFIG_H_ +#define MCUSHELLCDCDEVICECONFIG_H_ + +#include "McuLib.h" + +#ifndef McuShellCdcDevice_CONFIG_IS_ENABLED + #define McuShellCdcDevice_CONFIG_IS_ENABLED (0) + /*!< if module is enabled or not */ +#endif + +#ifndef McuShellCdcDevice_CONFIG_RX_BUFFER_SIZE + #define McuShellCdcDevice_CONFIG_RX_BUFFER_SIZE (McuShell_CONFIG_DEFAULT_SHELL_BUFFER_SIZE) + /*!< default receiving buffer size */ +#endif + +#ifndef McuShellCdcDevice_CONFIG_USE_FREERTOS + #define McuShellCdcDevice_CONFIG_USE_FREERTOS (McuLib_CONFIG_SDK_USE_FREERTOS) + /*!< If FreeRTOS (Queues) shall be used or not */ +#endif + +#ifndef McuShellCdcDevice_CONFIG_PROCESS_WAIT_TIME_MS + #define McuShellCdcDevice_CONFIG_PROCESS_WAIT_TIME_MS (5) + /*!< Processing wait time for the USB CDC device task, in milli-seconds */ +#endif + +#ifndef McuShellCdcDevice_CONFIG_PROCESS_PRIORITY + #define McuShellCdcDevice_CONFIG_PROCESS_PRIORITY (configMAX_PRIORITIES-1) + /*!< FreeRTOS task priority for processing task */ +#endif + +#endif \ No newline at end of file diff --git a/TSM_PicoW_Sensor/McuLib/config/McuShellUartconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuShellUartconfig.h new file mode 100644 index 0000000..45e553f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuShellUartconfig.h @@ -0,0 +1,284 @@ +/*! + * Copyright (c) 2020-2024, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * \file + * \brief \brief Configuration items for the McuShellUart module. + */ + +#ifndef MCUSHELLUARTCONFIG_H_ +#define MCUSHELLUARTCONFIG_H_ + +/* supported UART implementation: */ +#define McuShellUart_CONFIG_UART_NONE (0) +/* LPC845 */ +#define McuShellUart_CONFIG_UART_LPC845_USART0 (1) /* Rx on pin 20 (PIO0_24), Tx on pin 19 (PIO0_25) */ +/* Kinetis K22FX */ +#define McuShellUart_CONFIG_UART_K22FX512_UART0_A1_A2 (2) /* Rx on PTA1 (pin 27), Tx on PTA2 (pin 28) */ +#define McuShellUart_CONFIG_UART_K22FX512_UART1_E1_E0 (3) /* Rx on PTE1 (pin 2), Tx on PTE2 (pin 1) */ +/* Kinetis K22FN */ +#define McuShellUart_CONFIG_UART_K22FN512_LPUART0_C3_C4 (4) /* PTC3: Rx, (pin 46), PTC4: Tx (pin 49) (OpenSDA UART on tinyK22) */ +#define McuShellUart_CONFIG_UART_K22FN512_UART0_B16_B17 (5) /* PTB16 (Rx), PTB17 (Tx) */ +#define McuShellUart_CONFIG_UART_K22FN512_UART1_E1_E0 (6) /* PTE1 (Rx), PTE0 (Tx) (OpenSDA UART on FRDM-K22F) */ +/* Kinetis K64FN1M */ +#define McuShellUart_CONFIG_UART_K64FN1M_UART0_B16_B17 (7) /* PTB16 (Rx), PTB17 (Tx) */ +/* LPC55S16 */ +#define McuShellUart_CONFIG_UART_LPC55S16_USART0 (8) /* FlexComm0, pin 92 (Rx) and pin 94 (Tx) */ +#define McuShellUart_CONFIG_UART_LPC55S16_USART2 (9) /* FlexComm2, pin 3 (Rx) and pin 27 (Tx) */ +/* LPC55S69 */ +#define McuShellUart_CONFIG_UART_LPC55S69_USART0 (10) /* FlexComm0, P0_29, pin92 (Rx) and P0_30, pin94 (Tx) */ +/* RP2040 */ +#define McuShellUart_CONFIG_UART_RP2040_UART1_GPIO4_GPIO5 (11) /* UART1 with Tx on GPIO4 and Rx on GPIO5 */ + +/* default UART used */ +#ifndef McuShellUart_CONFIG_UART + #define McuShellUart_CONFIG_UART McuShellUart_CONFIG_UART_NONE +#endif + +#ifndef McuShellUart_CONFIG_DO_MUXING + #define McuShellUart_CONFIG_DO_PIN_MUXING (1) + /*!< 1: Do the pin muxing in the Init(); 0: no pin muxing is done in the Init() */ +#endif + +/* UART configuration items */ +#if McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_NONE + /* no UART used */ +#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_LPC845_USART0 + #include "fsl_usart.h" + #include "fsl_swm.h" + #define McuShellUart_CONFIG_UART_DEVICE USART0 + #define McuShellUart_CONFIG_UART_SET_UART_CLOCK() CLOCK_Select(kUART0_Clk_From_MainClk) /* Select the main clock as source clock of USART0. */ + #define McuShellUart_CONFIG_UART_WRITE_BLOCKING USART_WriteBlocking + #define McuShellUart_CONFIG_UART_GET_FLAGS USART_GetStatusFlags + #define McuShellUart_CONFIG_UART_HW_RX_READY_FLAGS (kUSART_RxReady|kUSART_HardwareOverrunFlag) + #define McuShellUart_CONFIG_UART_READ_BYTE USART_ReadByte + #define McuShellUart_CONFIG_UART_CONFIG_STRUCT usart_config_t + #define McuShellUart_CONFIG_UART_GET_DEFAULT_CONFIG USART_GetDefaultConfig + #define McuShellUart_CONFIG_UART_ENABLE_INTERRUPTS USART_EnableInterrupts + #define McuShellUart_CONFIG_UART_ENABLE_INTERRUPT_FLAGS (kUSART_RxReadyInterruptEnable | kUSART_HardwareOverRunInterruptEnable) + #define McuShellUart_CONFIG_UART_IRQ_NUMBER USART0_IRQn + #define McuShellUart_CONFIG_UART_INIT USART_Init + #ifndef McuShellUart_CONFIG_UART_GET_CLOCK_FREQ_SELECT + #define McuShellUart_CONFIG_UART_GET_CLOCK_FREQ_SELECT kCLOCK_MainClk + #endif + #define McuShellUart_CONFIG_UART_IRQ_HANDLER USART0_IRQHandler + #define McuShellUART_CONFIG_CLEAR_STATUS_FLAGS USART_ClearStatusFlags + #define McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS (0) /* no extra flags to clear */ + #define McuShellUart_CONFIG_HAS_FIFO (0) +#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_LPC55S16_USART0 + #include "fsl_usart.h" + #include "fsl_iocon.h" + #define McuShellUart_CONFIG_UART_DEVICE USART0 + #define McuShellUart_CONFIG_UART_SET_UART_CLOCK() CLOCK_AttachClk(kFRO12M_to_FLEXCOMM0) + #define McuShellUart_CONFIG_UART_WRITE_BLOCKING USART_WriteBlocking + #define McuShellUart_CONFIG_UART_GET_FLAGS USART_GetStatusFlags + #define McuShellUart_CONFIG_UART_HW_RX_READY_FLAGS (kUSART_RxFifoNotEmptyFlag | kUSART_RxError) + #define McuShellUart_CONFIG_UART_READ_BYTE USART_ReadByte + #define McuShellUart_CONFIG_UART_CONFIG_STRUCT usart_config_t + #define McuShellUart_CONFIG_UART_GET_DEFAULT_CONFIG USART_GetDefaultConfig + #define McuShellUart_CONFIG_UART_ENABLE_INTERRUPTS USART_EnableInterrupts + #define McuShellUart_CONFIG_UART_ENABLE_INTERRUPT_FLAGS (kUSART_RxLevelInterruptEnable | kUSART_RxErrorInterruptEnable) + #define McuShellUart_CONFIG_UART_IRQ_NUMBER FLEXCOMM0_IRQn + #define McuShellUart_CONFIG_UART_INIT USART_Init + #ifndef McuShellUart_CONFIG_UART_GET_CLOCK_FREQ_SELECT + #define McuShellUart_CONFIG_UART_GET_CLOCK_FREQ_SELECT kCLOCK_Fro12M + #endif + #define McuShellUart_CONFIG_UART_IRQ_HANDLER FLEXCOMM0_IRQHandler + #define McuShellUART_CONFIG_CLEAR_STATUS_FLAGS USART_ClearStatusFlags + #define McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS (0) /* no extra flags to clear */ + #define McuShellUart_CONFIG_HAS_FIFO (0) /* not sure? */ +#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_LPC55S16_USART2 + #include "fsl_usart.h" + #include "fsl_iocon.h" + + #define McuShellUart_CONFIG_UART_DEVICE USART2 + #define McuShellUart_CONFIG_UART_SET_UART_CLOCK() CLOCK_AttachClk(kFRO12M_to_FLEXCOMM2) + #define McuShellUart_CONFIG_UART_WRITE_BLOCKING USART_WriteBlocking + #define McuShellUart_CONFIG_UART_GET_FLAGS USART_GetStatusFlags + #define McuShellUart_CONFIG_UART_HW_RX_READY_FLAGS (kUSART_RxFifoNotEmptyFlag | kUSART_RxError) + #define McuShellUart_CONFIG_UART_READ_BYTE USART_ReadByte + #define McuShellUart_CONFIG_UART_CONFIG_STRUCT usart_config_t + #define McuShellUart_CONFIG_UART_GET_DEFAULT_CONFIG USART_GetDefaultConfig + #define McuShellUart_CONFIG_UART_ENABLE_INTERRUPTS USART_EnableInterrupts + #define McuShellUart_CONFIG_UART_ENABLE_INTERRUPT_FLAGS (kUSART_RxLevelInterruptEnable | kUSART_RxErrorInterruptEnable) + #define McuShellUart_CONFIG_UART_IRQ_NUMBER FLEXCOMM2_IRQn + #define McuShellUart_CONFIG_UART_INIT USART_Init + #ifndef McuShellUart_CONFIG_UART_GET_CLOCK_FREQ_SELECT + #define McuShellUart_CONFIG_UART_GET_CLOCK_FREQ_SELECT kCLOCK_Fro12M + #endif + #define McuShellUart_CONFIG_UART_IRQ_HANDLER FLEXCOMM2_IRQHandler + #define McuShellUART_CONFIG_CLEAR_STATUS_FLAGS USART_ClearStatusFlags + #define McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS (0) /* no extra flags to clear */ + #define McuShellUart_CONFIG_HAS_FIFO (0) /* not sure? */ +#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_LPC55S69_USART0 + #include "fsl_usart.h" + #include "fsl_iocon.h" + #define McuShellUart_CONFIG_UART_DEVICE USART0 + #define McuShellUart_CONFIG_UART_SET_UART_CLOCK() CLOCK_AttachClk(kFRO12M_to_FLEXCOMM0) + #define McuShellUart_CONFIG_UART_WRITE_BLOCKING USART_WriteBlocking + #define McuShellUart_CONFIG_UART_GET_FLAGS USART_GetStatusFlags + #define McuShellUart_CONFIG_UART_HW_RX_READY_FLAGS (kUSART_RxFifoNotEmptyFlag | kUSART_RxError) + #define McuShellUart_CONFIG_UART_READ_BYTE USART_ReadByte + #define McuShellUart_CONFIG_UART_CONFIG_STRUCT usart_config_t + #define McuShellUart_CONFIG_UART_GET_DEFAULT_CONFIG USART_GetDefaultConfig + #define McuShellUart_CONFIG_UART_ENABLE_INTERRUPTS USART_EnableInterrupts + #define McuShellUart_CONFIG_UART_ENABLE_INTERRUPT_FLAGS (kUSART_RxLevelInterruptEnable | kUSART_RxErrorInterruptEnable) + #define McuShellUart_CONFIG_UART_IRQ_NUMBER FLEXCOMM0_IRQn + #define McuShellUart_CONFIG_UART_INIT USART_Init + #ifndef McuShellUart_CONFIG_UART_GET_CLOCK_FREQ_SELECT + #define McuShellUart_CONFIG_UART_GET_CLOCK_FREQ_SELECT kCLOCK_Fro12M + #endif + #define McuShellUart_CONFIG_UART_IRQ_HANDLER FLEXCOMM0_IRQHandler + #define McuShellUART_CONFIG_CLEAR_STATUS_FLAGS USART_ClearStatusFlags + #define McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS (0) /* no extra flags to clear */ + #define McuShellUart_CONFIG_HAS_FIFO (0) /* not sure? */ +#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K22FX512_UART0_A1_A2 + /* UART0 on K22FX512 */ + #include "fsl_uart.h" + #include "fsl_port.h" + #define McuShellUart_CONFIG_UART_DEVICE UART0 + #define McuShellUart_CONFIG_UART_SET_UART_CLOCK() /* nothing needed */ + #define McuShellUart_CONFIG_UART_WRITE_BLOCKING UART_WriteBlocking + #define McuShellUart_CONFIG_UART_GET_FLAGS UART_GetStatusFlags + #define McuShellUart_CONFIG_UART_HW_RX_READY_FLAGS (kUART_RxDataRegFullFlag|kUART_RxOverrunFlag) + #define McuShellUart_CONFIG_UART_READ_BYTE UART_ReadByte + #define McuShellUart_CONFIG_UART_CONFIG_STRUCT uart_config_t + #define McuShellUart_CONFIG_UART_GET_DEFAULT_CONFIG UART_GetDefaultConfig + #define McuShellUart_CONFIG_UART_ENABLE_INTERRUPTS UART_EnableInterrupts + #define McuShellUart_CONFIG_UART_ENABLE_INTERRUPT_FLAGS (kUART_RxDataRegFullInterruptEnable | kUART_RxOverrunInterruptEnable) + #define McuShellUart_CONFIG_UART_IRQ_NUMBER UART0_RX_TX_IRQn + #define McuShellUart_CONFIG_UART_INIT UART_Init + #ifndef McuShellUart_CONFIG_UART_GET_CLOCK_FREQ_SELECT + #define McuShellUart_CONFIG_UART_GET_CLOCK_FREQ_SELECT kCLOCK_CoreSysClk + #endif + #define McuShellUart_CONFIG_UART_IRQ_HANDLER UART0_RX_TX_IRQHandler + #define McuShellUART_CONFIG_CLEAR_STATUS_FLAGS UART_ClearStatusFlags + #define McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS (kUART_RxOverrunFlag|kUART_RxFifoOverflowFlag) + #define McuShellUart_CONFIG_HAS_FIFO (1) +#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K22FN512_UART0_B16_B17 + #include "fsl_uart.h" + #include "fsl_port.h" + #define McuShellUart_CONFIG_UART_DEVICE UART0 + #define McuShellUart_CONFIG_UART_SET_UART_CLOCK() /* nothing needed */ + #define McuShellUart_CONFIG_UART_WRITE_BLOCKING UART_WriteBlocking + #define McuShellUart_CONFIG_UART_GET_FLAGS UART_GetStatusFlags + #define McuShellUart_CONFIG_UART_HW_RX_READY_FLAGS (kUART_RxDataRegFullFlag|kUART_RxOverrunFlag) + #define McuShellUart_CONFIG_UART_READ_BYTE UART_ReadByte + #define McuShellUart_CONFIG_UART_CONFIG_STRUCT uart_config_t + #define McuShellUart_CONFIG_UART_GET_DEFAULT_CONFIG UART_GetDefaultConfig + #define McuShellUart_CONFIG_UART_ENABLE_INTERRUPTS UART_EnableInterrupts + #define McuShellUart_CONFIG_UART_ENABLE_INTERRUPT_FLAGS (kUART_RxDataRegFullInterruptEnable | kUART_RxOverrunInterruptEnable) + #define McuShellUart_CONFIG_UART_IRQ_NUMBER UART0_RX_TX_IRQn + #define McuShellUart_CONFIG_UART_INIT UART_Init + #ifndef McuShellUart_CONFIG_UART_GET_CLOCK_FREQ_SELECT + #define McuShellUart_CONFIG_UART_GET_CLOCK_FREQ_SELECT kCLOCK_CoreSysClk + #endif + #define McuShellUart_CONFIG_UART_IRQ_HANDLER UART0_RX_TX_IRQHandler + #define McuShellUART_CONFIG_CLEAR_STATUS_FLAGS UART_ClearStatusFlags + #define McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS (kUART_RxOverrunFlag|kUART_RxFifoOverflowFlag) + #define McuShellUart_CONFIG_HAS_FIFO (1) +#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K22FN512_UART1_E1_E0 + /* UART1 on K22FN512. Mux the pins using the pins muxing tool */ + #include "fsl_uart.h" + #include "fsl_port.h" + #define McuShellUart_CONFIG_UART_DEVICE UART1 + #define McuShellUart_CONFIG_UART_SET_UART_CLOCK() /* nothing needed */ + #define McuShellUart_CONFIG_UART_WRITE_BLOCKING UART_WriteBlocking + #define McuShellUart_CONFIG_UART_GET_FLAGS UART_GetStatusFlags + #define McuShellUart_CONFIG_UART_HW_RX_READY_FLAGS (kUART_RxDataRegFullFlag|kUART_RxOverrunFlag) + #define McuShellUart_CONFIG_UART_READ_BYTE UART_ReadByte + #define McuShellUart_CONFIG_UART_CONFIG_STRUCT uart_config_t + #define McuShellUart_CONFIG_UART_GET_DEFAULT_CONFIG UART_GetDefaultConfig + #define McuShellUart_CONFIG_UART_ENABLE_INTERRUPTS UART_EnableInterrupts + #define McuShellUart_CONFIG_UART_ENABLE_INTERRUPT_FLAGS (kUART_RxDataRegFullInterruptEnable | kUART_RxOverrunInterruptEnable) + #define McuShellUart_CONFIG_UART_IRQ_NUMBER UART1_RX_TX_IRQn + #define McuShellUart_CONFIG_UART_INIT UART_Init + #ifndef McuShellUart_CONFIG_UART_GET_CLOCK_FREQ_SELECT + #define McuShellUart_CONFIG_UART_GET_CLOCK_FREQ_SELECT kCLOCK_CoreSysClk + #endif + #define McuShellUart_CONFIG_UART_IRQ_HANDLER UART1_RX_TX_IRQHandler + #define McuShellUART_CONFIG_CLEAR_STATUS_FLAGS UART_ClearStatusFlags + #define McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS (kUART_RxOverrunFlag|kUART_RxFifoOverflowFlag) + #define McuShellUart_CONFIG_HAS_FIFO (1) +#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K22FN512_LPUART0_C3_C4 + /* LPUART on K22FN512 */ + #include "fsl_lpuart.h" + #include "fsl_port.h" + #define McuShellUart_CONFIG_UART_DEVICE LPUART0 +/*! LPUARTSRC - LPUART clock source select + * 0b00..Clock disabled + * 0b01..MCGFLLCLK , or MCGPLLCLK , or IRC48M clock as selected by SOPT2[PLLFLLSEL]. + * 0b10..OSCERCLK clock + * 0b11..MCGIRCLK clock + */ + #define SIM_LPUART_CLK_SEL_PLLFLLSEL_CLK 1U /*!< LPUART clock select: PLLFLLSEL output clock */ + #define McuShellUart_CONFIG_UART_SET_UART_CLOCK() CLOCK_SetLpuartClock(SIM_LPUART_CLK_SEL_PLLFLLSEL_CLK) + #define McuShellUart_CONFIG_UART_WRITE_BLOCKING LPUART_WriteBlocking + #define McuShellUart_CONFIG_UART_GET_FLAGS LPUART_GetStatusFlags + #define McuShellUart_CONFIG_UART_HW_RX_READY_FLAGS (kLPUART_RxDataRegFullFlag|kLPUART_RxOverrunFlag) + #define McuShellUart_CONFIG_UART_READ_BYTE LPUART_ReadByte + #define McuShellUart_CONFIG_UART_CONFIG_STRUCT lpuart_config_t + #define McuShellUart_CONFIG_UART_GET_DEFAULT_CONFIG LPUART_GetDefaultConfig + #define McuShellUart_CONFIG_UART_ENABLE_INTERRUPTS LPUART_EnableInterrupts + #define McuShellUart_CONFIG_UART_ENABLE_INTERRUPT_FLAGS (kLPUART_RxDataRegFullInterruptEnable) + #define McuShellUart_CONFIG_UART_IRQ_NUMBER LPUART0_IRQn + #define McuShellUart_CONFIG_UART_INIT LPUART_Init + #ifndef McuShellUart_CONFIG_UART_GET_CLOCK_FREQ_SELECT + #define McuShellUart_CONFIG_UART_GET_CLOCK_FREQ_SELECT /* kCLOCK_Osc0ErClkUndiv */ kCLOCK_PllFllSelClk /* has to match Clocks setting! */ + #endif + #define McuShellUart_CONFIG_UART_IRQ_HANDLER LPUART0_IRQHandler + #define McuShellUART_CONFIG_CLEAR_STATUS_FLAGS LPUART_ClearStatusFlags + #define McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS (0) /* no extra flags to clear */ + #define McuShellUart_CONFIG_HAS_FIFO (0) +#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K64FN1M_UART0_B16_B17 + #include "fsl_uart.h" + #include "fsl_port.h" + #define McuShellUart_CONFIG_UART_DEVICE UART0 + #define McuShellUart_CONFIG_UART_SET_UART_CLOCK() /* nothing needed */ + #define McuShellUart_CONFIG_UART_WRITE_BLOCKING UART_WriteBlocking + #define McuShellUart_CONFIG_UART_GET_FLAGS UART_GetStatusFlags + #define McuShellUart_CONFIG_UART_HW_RX_READY_FLAGS (kUART_RxDataRegFullFlag|kUART_RxOverrunFlag) + #define McuShellUart_CONFIG_UART_READ_BYTE UART_ReadByte + #define McuShellUart_CONFIG_UART_CONFIG_STRUCT uart_config_t + #define McuShellUart_CONFIG_UART_GET_DEFAULT_CONFIG UART_GetDefaultConfig + #define McuShellUart_CONFIG_UART_ENABLE_INTERRUPTS UART_EnableInterrupts + #define McuShellUart_CONFIG_UART_ENABLE_INTERRUPT_FLAGS (kUART_RxDataRegFullInterruptEnable | kUART_RxOverrunInterruptEnable) + #define McuShellUart_CONFIG_UART_IRQ_NUMBER UART0_RX_TX_IRQn + #define McuShellUart_CONFIG_UART_INIT UART_Init + #ifndef McuShellUart_CONFIG_UART_GET_CLOCK_FREQ_SELECT + #define McuShellUart_CONFIG_UART_GET_CLOCK_FREQ_SELECT kCLOCK_CoreSysClk + #endif + #define McuShellUart_CONFIG_UART_IRQ_HANDLER UART0_RX_TX_IRQHandler + #define McuShellUART_CONFIG_CLEAR_STATUS_FLAGS UART_ClearStatusFlags + #define McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS (kUART_RxOverrunFlag|kUART_RxFifoOverflowFlag) + #define McuShellUart_CONFIG_HAS_FIFO (1) +#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_RP2040_UART1_GPIO4_GPIO5 + #define McuShellUart_CONFIG_UART_SET_UART_CLOCK() /* nothing needed */ + #define McuShellUart_CONFIG_UART_WRITE_BLOCKING RP_WriteBlocking + + #define McuShellUart_CONFIG_UART_DEVICE uart1 + #define McuShellUart_CONFIG_DATA_BITS 8 + #define McuShellUart_CONFIG_STOP_BITS 1 + #define McuShellUart_CONFIG_PARITY UART_PARITY_NONE + + #define McuShellUart_CONFIG_UART_TX_PIN 4 + #define McuShellUart_CONFIG_UART_RX_PIN 5 + +#else + /* you have to put your configuration here */ +#endif + +#ifndef McuShellUart_CONFIG_UART_RX_QUEUE_LENGTH + #define McuShellUart_CONFIG_UART_RX_QUEUE_LENGTH (McuShell_CONFIG_DEFAULT_SHELL_BUFFER_SIZE) +#endif + +#ifndef McuShellUart_CONFIG_UART_BAUDRATE + #define McuShellUart_CONFIG_UART_BAUDRATE 115200 +#endif + +#ifndef McuShellUart_CONFIG_USE_FREERTOS + #define McuShellUart_CONFIG_USE_FREERTOS (McuLib_CONFIG_SDK_USE_FREERTOS) + /*!< If FreeRTOS (Queues) shall be used or not */ +#endif + +#endif /* MCUSHELLUARTCONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuShellconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuShellconfig.h new file mode 100644 index 0000000..36cfa76 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuShellconfig.h @@ -0,0 +1,136 @@ +/** + * \file + * \brief Configuration header file for Shell + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Shell module. + */ + +#ifndef __McuShell_CONFIG_H +#define __McuShell_CONFIG_H + +#ifndef McuShell_CONFIG_BLOCKING_SEND_ENABLED + #define McuShell_CONFIG_BLOCKING_SEND_ENABLED (1) + /*!< 1: Sending is blocking (with an optional timeout); 0: Do not block on sending */ +#endif + +#ifndef McuShell_CONFIG_BLOCKING_SEND_TIMEOUT_MS + #define McuShell_CONFIG_BLOCKING_SEND_TIMEOUT_MS (20) + /*!< Total blocking time (timeout) in milliseconds, uses 0 for blocking without a timeout */ +#endif + +#ifndef McuShell_CONFIG_BLOCKING_SEND_TIMEOUT_WAIT_MS + #define McuShell_CONFIG_BLOCKING_SEND_TIMEOUT_WAIT_MS (5) + /*!< waiting time during blocking, use 0 (zero) for polling */ +#endif + +#ifndef McuShell_CONFIG_BLOCKING_SEND_RTOS_WAIT + #define McuShell_CONFIG_BLOCKING_SEND_RTOS_WAIT (1) + /*!< 1: Use WaitmsOS() instead of Waitms(); 0: Use Waitms() instead of WaitOSms() */ +#endif + +#ifndef McuShell_CONFIG_USE_MUTEX + #define McuShell_CONFIG_USE_MUTEX (0) + /*!< 1: use RTOS mutex; 0: do not use RTOS mutex */ +#endif + +#ifndef McuShell_CONFIG_DEFAULT_SHELL_BUFFER_SIZE + #define McuShell_CONFIG_DEFAULT_SHELL_BUFFER_SIZE (48) + /*!< default buffer size for shell command parsing */ +#endif + +#ifndef McuShell_CONFIG_DEFAULT_SERIAL + #define McuShell_CONFIG_DEFAULT_SERIAL (0) + /*!< 1: the shell implements its own StdIO which is returned by GetStdio(); 0: The shell does not implement its own standard I/O */ +#endif + +#if McuShell_CONFIG_DEFAULT_SERIAL + #ifndef McuShell_CONFIG_DEFAULT_SERIAL_INCLUDE + #define McuShell_CONFIG_DEFAULT_SERIAL_INCLUDE "McuSerial.h" + /*!< Include for the functions below */ + #endif + + #ifndef McuShell_CONFIG_DEFAULT_SERIAL_RECEIVE_FCT_NAME + #define McuShell_CONFIG_DEFAULT_SERIAL_RECEIVE_FCT_NAME McuSerial_RecvChar + /*!< Function name to read a character and returning ERR_OK if it was successful */ + #endif + + #ifndef McuShell_CONFIG_DEFAULT_SERIAL_SEND_FCT_NAME + #define McuShell_CONFIG_DEFAULT_SERIAL_SEND_FCT_NAME McuSerial_SendChar + /*!< Function name to send a character and returning ERR_OK if it was successful */ + #endif + + #ifndef McuShell_CONFIG_DEFAULT_SERIAL_RXAVAIL_FCT_NAME + #define McuShell_CONFIG_DEFAULT_SERIAL_RXAVAIL_FCT_NAME McuSerial_GetCharsInRxBuf + /*!< Function name to check if there is anything available to receive and returns TRUE, otherwise FALSE */ + #endif +#endif + +#ifndef McuShell_CONFIG_PROMPT_STRING + #define McuShell_CONFIG_PROMPT_STRING "CMD> " +#endif + +#ifndef McuShell_CONFIG_PROJECT_NAME_STRING + #define McuShell_CONFIG_PROJECT_NAME_STRING "My Project Name" +#endif + +#ifndef McuShell_CONFIG_MULTI_CMD_ENABLED + #define McuShell_CONFIG_MULTI_CMD_ENABLED (0) /* 1: enabled, 0: disabled */ +#endif + +#ifndef McuShell_CONFIG_MULTI_CMD_SIZE + #define McuShell_CONFIG_MULTI_CMD_SIZE (32) /* max size of each command */ +#endif + +#ifndef McuShell_CONFIG_MULTI_CMD_CHAR + #define McuShell_CONFIG_MULTI_CMD_CHAR ';' /* separation character */ +#endif + +#ifndef McuShell_CONFIG_HISTORY_ENABLED + #define McuShell_CONFIG_HISTORY_ENABLED (0) + /*!< 1: history enabled with and ; 0: no history functionality */ +#endif + +#ifndef McuShell_CONFIG_HISTORY_NOF_ITEMS + #define McuShell_CONFIG_HISTORY_NOF_ITEMS (5) + /*!< number of items in the history */ +#endif + +#ifndef McuShell_CONFIG_HISTORY_ITEM_LENGTH + #define McuShell_CONFIG_HISTORY_ITEM_LENGTH (32) + /*!< length of a history item */ +#endif + +#ifndef McuShell_CONFIG_HISTORY_CHAR_PREV + #define McuShell_CONFIG_HISTORY_CHAR_PREV '\e' + /*!< character to go to previous item in history */ +#endif + +#ifndef McuShell_CONFIG_HISTORY_CHAR_NEXT + #define McuShell_CONFIG_HISTORY_CHAR_NEXT '\t' + /*!< character to go to next item in history */ +#endif + +#ifndef McuShell_CONFIG_ECHO_ENABLED + #define McuShell_CONFIG_ECHO_ENABLED (0) + /*!< 1: shell implements local echo; 0: no echo functionality + Note that echo needs to be enabled in each I/O too (io->echoEnabled) */ +#endif + +#ifndef McuShell_CONFIG_STATUS_COLON_POS + #define McuShell_CONFIG_STATUS_COLON_POS (13) + /*!< position of the ':' after the item string for the 'status' command */ +#endif + +#ifndef McuShell_CONFIG_HELP_SEMICOLON_POS + #define McuShell_CONFIG_HELP_SEMICOLON_POS (26) + /*!< position of the ';' after the command string for the 'help' command */ +#endif + +#ifndef McuShell_CONFIG_SILENT_PREFIX_CHAR + #define McuShell_CONFIG_SILENT_PREFIX_CHAR '#' + /*!< With this char as first character in the cmd, printing is silent. Use a space to disable it */ +#endif + +#endif /* __McuShell_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuTimeDateconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuTimeDateconfig.h new file mode 100644 index 0000000..b661ee0 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuTimeDateconfig.h @@ -0,0 +1,147 @@ +/** + * \file + * \brief Configuration header file for GenericTimeDate + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the generic timc/date module. + */ + +#ifndef __McuTimeDate_CONFIG_H +#define __McuTimeDate_CONFIG_H + +#ifndef McuTimeDate_CONFIG_PARSE_COMMAND_ENABLED + #define McuTimeDate_CONFIG_PARSE_COMMAND_ENABLED (1) + /*!< set to 1 if method ParseCommand() is present, 0 otherwise */ +#endif + +#ifndef McuTimeDate_CONFIG_INIT_IN_PE_LOWLEVEL_INIT + #define McuTimeDate_CONFIG_INIT_IN_PE_LOWLEVEL_INIT (1) + /*!< 1: call Init() during Processor Expert LowLevelInit(), 0: application needs to call Init() */ +#endif + +/* ******************** settings for software RTC ********************************** */ +#ifndef McuTimeDate_CONFIG_USE_SOFTWARE_RTC + #define McuTimeDate_CONFIG_USE_SOFTWARE_RTC (1) + /*!< set to 1 if using software RTC, 0 otherwise */ +#endif + +/* RTC Initialization options during Init() */ +#define McuTimeDate_INIT_SOFTWARE_RTC_FROM_DEFAULTS 0 /* init software RTC from default values */ +#define McuTimeDate_INIT_SOFTWARE_RTC_FROM_INTERNAL_RTC 1 /* init software RTC from internal RTC values */ +#define McuTimeDate_INIT_SOFTWARE_RTC_FROM_EXTERNAL_RTC 2 /* init software RTC from external RTC values */ + +#ifndef McuTimeDate_CONFIG_INIT_SOFTWARE_RTC_METHOD + #define McuTimeDate_CONFIG_INIT_SOFTWARE_RTC_METHOD McuTimeDate_INIT_SOFTWARE_RTC_FROM_DEFAULTS + /*!< which method to use during Init() */ +#endif + +/* ****************** settings for internal hardware RTC *************************** */ + +#ifndef McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC + #define McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC (0) + /*!< set to 1 if using internal HW RTC, 0 otherwise */ +#endif + +#if McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC + #ifndef McuTimeDate_CONFIG_RTC_PERIPHERAL + #define McuTimeDate_CONFIG_RTC_PERIPHERAL ((RTC_Type *)RTC_BASE) + /*!< Peripheral used by SDK to access RTC */ + #endif +#endif + +/* ****************** settings for external hardware RTC *************************** */ +#ifndef McuTimeDate_CONFIG_USE_EXTERNAL_HW_RTC + #define McuTimeDate_CONFIG_USE_EXTERNAL_HW_RTC (0) + /*!< set to 1 if using external HW RTC driver, 0 otherwise */ +#endif + +/* ********************************************************************************* */ +/* SetTime() and SetDate() configuration */ +#ifndef McuTimeDate_CONFIG_SET_TIME_DATE_METHOD_USES_SOFTWARE_RTC + #define McuTimeDate_CONFIG_SET_TIME_DATE_METHOD_USES_SOFTWARE_RTC (1) + /*!< 1: SetTime() and SetDate() write to software RTC. 0: do not use software RTC in SetTime() and SetDate() */ +#endif + +#ifndef McuTimeDate_CONFIG_SET_TIME_DATE_METHOD_USES_INTERNAL_RTC + #define McuTimeDate_CONFIG_SET_TIME_DATE_METHOD_USES_INTERNAL_RTC (0) + /*!< 1: SetTime() and SetDate() write to internal RTC. 0: do not use internal RTC in SetTime() and SetDate() */ +#endif + +#ifndef McuTimeDate_CONFIG_SET_TIME_DATE_METHOD_USES_EXTERNAL_RTC + #define McuTimeDate_CONFIG_SET_TIME_DATE_METHOD_USES_EXTERNAL_RTC (1) + /*!< 1: SetTime() and SetDate() write to external RTC. 0: do not use external RTC in SetTime() and SetDate() */ +#endif + +/* ********************************************************************************* */ +/* GetTime() and GetDate() configuration options: */ +#define McuTimeDate_GET_TIME_DATE_METHOD_SOFTWARE_RTC 1 /* use software RTC */ +#define McuTimeDate_GET_TIME_DATE_METHOD_INTERNAL_RTC 2 /* use internal RTC */ +#define McuTimeDate_GET_TIME_DATE_METHOD_EXTERNAL_RTC 3 /* use external RTC */ + +#ifndef McuTimeDate_CONFIG_USE_GET_TIME_DATE_METHOD + #define McuTimeDate_CONFIG_USE_GET_TIME_DATE_METHOD McuTimeDate_GET_TIME_DATE_METHOD_SOFTWARE_RTC /* specifies method to get time and date */ + /*!< specifies method to get time and date */ +#endif + +/* default time and date format strings */ +#ifndef McuTimeDate_CONFIG_DEFAULT_TIME_FORMAT_STR + #define McuTimeDate_CONFIG_DEFAULT_TIME_FORMAT_STR "hh:mm:ss,cc" +#endif +#ifndef McuTimeDate_CONFIG_DEFAULT_DATE_FORMAT_STR + #define McuTimeDate_CONFIG_DEFAULT_DATE_FORMAT_STR "dd.mm.yyyy" +#endif + +#ifndef McuTimeDate_CONFIG_TICK_TIME_MS + #define McuTimeDate_CONFIG_TICK_TIME_MS \ + (1000/1000) /* Period in milliseconds as defined in RTOS component properties, at which McuTimeDate_AddTick() is called */ +#endif + +/* date/time defaults: */ + +/* default time/date values */ +#ifndef McuTimeDate_CONFIG_DEFAULT_INITIAL_TIME_HOUR + #define McuTimeDate_CONFIG_DEFAULT_INITIAL_TIME_HOUR 17 +#endif +#ifndef McuTimeDate_CONFIG_DEFAULT_INITIAL_TIME_MIN + #define McuTimeDate_CONFIG_DEFAULT_INITIAL_TIME_MIN 51 +#endif +#ifndef McuTimeDate_CONFIG_DEFAULT_INITIAL_TIME_SEC + #define McuTimeDate_CONFIG_DEFAULT_INITIAL_TIME_SEC 31 +#endif +#ifndef McuTimeDate_CONFIG_DEFAULT_INITIAL_DATE_YEAR + #define McuTimeDate_CONFIG_DEFAULT_INITIAL_DATE_YEAR 2019 +#endif +#ifndef McuTimeDate_CONFIG_DEFAULT_INITIAL_DATE_MONTH + #define McuTimeDate_CONFIG_DEFAULT_INITIAL_DATE_MONTH 8 +#endif +#ifndef McuTimeDate_CONFIG_DEFAULT_INITIAL_DATE_DAY + #define McuTimeDate_CONFIG_DEFAULT_INITIAL_DATE_DAY 1 +#endif + +/* interface to external RTC */ +#ifndef McuTimeDate_CONFIG_EXT_RTC_HEADER_FILE_NAME + #define McuTimeDate_CONFIG_EXT_RTC_HEADER_FILE_NAME "McuExtRTC.h" +#endif + +#ifndef McuTimeDate_CONFIG_EXT_RTC_GET_TIME_FCT + #define McuTimeDate_CONFIG_EXT_RTC_GET_TIME_FCT McuExtRTC_GetTime + /*!< function to get the external RTC time */ +#endif + +#ifndef McuTimeDate_CONFIG_EXT_RTC_SET_TIME_FCT + #define McuTimeDate_CONFIG_EXT_RTC_SET_TIME_FCT McuExtRTC_SetTime + /*!< function to set the external RTC time */ +#endif + +#ifndef McuTimeDate_CONFIG_EXT_RTC_GET_DATE_FCT + #define McuTimeDate_CONFIG_EXT_RTC_GET_DATE_FCT McuExtRTC_GetDate + /*!< function to get the external RTC date */ +#endif + +#ifndef McuTimeDate_CONFIG_EXT_RTC_SET_DATE_FCT + #define McuTimeDate_CONFIG_EXT_RTC_SET_DATE_FCT McuExtRTC_SetDate + /*!< function to get the external RTC date */ +#endif + +#endif /* __McuTimeDate_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuTimeoutconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuTimeoutconfig.h new file mode 100644 index 0000000..8163035 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuTimeoutconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for Timeout + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Timeout module. + */ + +#ifndef __McuTimeout_CONFIG_H +#define __McuTimeout_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuTimeout_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuTriggerconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuTriggerconfig.h new file mode 100644 index 0000000..abbc546 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuTriggerconfig.h @@ -0,0 +1,22 @@ +/** + * \file + * \brief Application configuration file for Trigger module + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is a configuration header file to configure the module McuTrigger. + * You can configure the defines directly in this file or with the compiler -D option. + */ + +#ifndef __McuTrigger_CONFIG_H +#define __McuTrigger_CONFIG_H + +/* no configuration supported yet */ +/*! Definition of triggers */ +#define McuTrigger_KEY1_PRESS /* key pressed, used by the KEY bean. Format is '__PRESS' */ 0 +#define McuTrigger_EXAMPLE /* example trigger */ 1 + +#define McuTrigger_CONFIG_TICK_PERIOD_MS \ + (1000/1000) /* Period in milliseconds as defined in RTOS component properties, at which McuTrigger._AddTick() is called */ + +#endif /* __McuTrigger_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuULN2003config.h b/TSM_PicoW_Sensor/McuLib/config/McuULN2003config.h new file mode 100644 index 0000000..4f626f9 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuULN2003config.h @@ -0,0 +1,34 @@ +/*! + * Copyright (c) 2019, Erich Styger + * + * Configuration header file for ULN2003 stepper motor driver + * + * SPDX-License-Identifier: BSD-3-Clause + * \file + * \brief Configuration items for the McuULN2003 darlington array module. + */ + +#ifndef MCUULN2003_CONFIG_H_ +#define MCUULN2003_CONFIG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "McuLibconfig.h" + +#ifndef MCUULN2003_CONFIG_USE_FREERTOS_HEAP + #define MCUULN2003_CONFIG_USE_FREERTOS_HEAP (McuLib_CONFIG_SDK_USE_FREERTOS) + /*!< 1: use FreeRTOS Heap (default), 0: use stdlib malloc() and free() */ +#endif + +#ifndef McuULN2003_CONFIG_USE_ACCELERATION + #define McuULN2003_CONFIG_USE_ACCELERATION (0) + /*!< 1: stepper motor uses acceleration table; 0: no acceleration table used */ +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MCUULN2003_CONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuUSBconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuUSBconfig.h new file mode 100644 index 0000000..ff26647 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuUSBconfig.h @@ -0,0 +1,16 @@ +/** + * \file + * \brief Configuration header file for FSL_USB + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Freescale (now NXP) USB Stack module. + */ + +#ifndef __McuUSB_CONFIG_H +#define __McuUSB_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuUSB_CONFIG_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/config/McuUart485config.h b/TSM_PicoW_Sensor/McuLib/config/McuUart485config.h new file mode 100644 index 0000000..b50e7c7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuUart485config.h @@ -0,0 +1,261 @@ +/*! + * Copyright (c) 2020-2023, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * \file + * \brief Configuration items for the McuUart485 module. + */ + +#ifndef MCUUART485CONFIG_H_ +#define MCUUART485CONFIG_H_ + +#include "McuLib.h" + +#ifndef McuUart485_CONFIG_USE_RS_485 + #define McuUart485_CONFIG_USE_RS_485 (0) + /*!< by default, this module is disabled */ +#endif + +#ifndef McuUart485_CONFIG_USE_MODBUS + #define McuUart485_CONFIG_USE_MODBUS (0) + /*!< if using the Modbus protocol */ +#endif + +#ifndef McuUart485_CONFIG_USE_LOGGER + #define McuUart485_CONFIG_USE_LOGGER (0) + /*!< if using a logger in the interrupt RX routine. 0: disabled; 1: enabled */ +#endif + +#ifndef McuUart485_CONFIG_LOGGER_CALLBACK_NAME + #define McuUart485_CONFIG_LOGGER_CALLBACK_NAME McuRTT_SendChar + /*!< function name to be called to write a char from the logger inside the Rx interrupt */ +#endif +extern uint8_t McuUart485_CONFIG_LOGGER_CALLBACK_NAME(uint8_t ch); /* prototype of logger function callback */ + +#if McuUart485_CONFIG_USE_RS_485 +/* UART configuration items */ +#if McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC845 + #include "fsl_usart.h" + + #ifndef McuUart485_CONFIG_UART_PARITY + #define McuUart485_CONFIG_UART_PARITY kUSART_ParityDisabled /* or kUSART_ParityEven or kUSART_ParityOdd */ + #endif + + #define McuUart485_CONFIG_UART_DEVICE USART1 + #define McuUart485_CONFIG_UART_SET_UART_CLOCK() CLOCK_Select(kUART1_Clk_From_MainClk) /* Select the main clock as source clock of USART0. */ + #define McuUart485_CONFIG_UART_WRITE_BLOCKING USART_WriteBlocking + #define McuUart485_CONFIG_UART_GET_FLAGS USART_GetStatusFlags + #define McuUart485_CONFIG_UART_HW_RX_READY_FLAGS (kUSART_RxReady|kUSART_HardwareOverrunFlag) + #define McuUart485_CONFIG_UART_READ_BYTE USART_ReadByte + #define McuUart485_CONFIG_UART_CONFIG_STRUCT usart_config_t + #define McuUart485_CONFIG_UART_GET_DEFAULT_CONFIG USART_GetDefaultConfig + #define McuUart485_CONFIG_UART_ENABLE_INTERRUPTS USART_EnableInterrupts + #define McuUart485_CONFIG_UART_ENABLE_INTERRUPT_FLAGS (kUSART_RxReadyInterruptEnable | kUSART_HardwareOverRunInterruptEnable) + #define McuUart485_CONFIG_UART_IRQ_NUMBER USART1_IRQn + #define McuUart485_CONFIG_UART_INIT USART_Init + #define McuUart485_CONFIG_UART_GET_CLOCK_FREQ_SELECT kCLOCK_MainClk + #define McuUart485_CONFIG_UART_IRQ_HANDLER USART1_IRQHandler + #define McuUart485_CONFIG_CLEAR_STATUS_FLAGS USART_ClearStatusFlags + +#elif McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC55S69 + /* using FlexComm1, on LPC55S69-EVK this is on pin 40 (Rx, FC1_RXD_SDA_MOSI_DATA, PIO1_10) and pin 93 (Rx, FC1_TXD_SCL_MISO_WS, PIO1_11) */ + #include "fsl_usart.h" + + #ifndef McuUart485_CONFIG_UART_PARITY + #define McuUart485_CONFIG_UART_PARITY kUSART_ParityDisabled /* or kUSART_ParityEven or kUSART_ParityOdd */ + #endif + + #define McuUart485_CONFIG_UART_DEVICE USART1 + #define McuUart485_CONFIG_UART_SET_UART_CLOCK() CLOCK_AttachClk(kFRO12M_to_FLEXCOMM1) + #define McuUart485_CONFIG_UART_WRITE_BLOCKING USART_WriteBlocking + #define McuUart485_CONFIG_UART_GET_FLAGS USART_GetStatusFlags + #define McuUart485_CONFIG_UART_HW_RX_READY_FLAGS (kUSART_RxFifoNotEmptyFlag | kUSART_RxError) + #define McuUart485_CONFIG_UART_READ_BYTE USART_ReadByte + #define McuUart485_CONFIG_UART_CONFIG_STRUCT usart_config_t + #define McuUart485_CONFIG_UART_GET_DEFAULT_CONFIG USART_GetDefaultConfig + #define McuUart485_CONFIG_UART_ENABLE_INTERRUPTS USART_EnableInterrupts + #define McuUart485_CONFIG_UART_ENABLE_INTERRUPT_FLAGS (kUSART_RxLevelInterruptEnable | kUSART_RxErrorInterruptEnable) + #define McuUart485_CONFIG_UART_IRQ_NUMBER FLEXCOMM1_IRQn + #define McuUart485_CONFIG_UART_INIT USART_Init + #define McuUart485_CONFIG_UART_GET_CLOCK_FREQ_SELECT kCLOCK_Fro12M + #define McuUart485_CONFIG_UART_IRQ_HANDLER FLEXCOMM1_IRQHandler + #define McuUart485_CONFIG_CLEAR_STATUS_FLAGS USART_ClearStatusFlags + +#elif McuLib_CONFIG_CPU_IS_KINETIS + #ifndef McuUart485_CONFIG_UART_PARITY + #define McuUart485_CONFIG_UART_PARITY kUART_ParityDisabled /* or kUART_ParityEven or kUART_ParityOdd */ + #endif + + #if McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_K22FX + #include "fsl_uart.h" + #define McuUart485_CONFIG_UART_DEVICE UART0 + #define McuUart485_CONFIG_UART_SET_UART_CLOCK() /* nothing needed */ + #define McuUart485_CONFIG_UART_WRITE_BLOCKING UART_WriteBlocking + #define McuUart485_CONFIG_UART_GET_FLAGS UART_GetStatusFlags + #define McuUart485_CONFIG_UART_HW_RX_READY_FLAGS (kUART_RxDataRegFullFlag|kUART_RxOverrunFlag) + #define McuUart485_CONFIG_UART_READ_BYTE UART_ReadByte + #define McuUart485_CONFIG_UART_CONFIG_STRUCT uart_config_t + #define McuUart485_CONFIG_UART_GET_DEFAULT_CONFIG UART_GetDefaultConfig + #define McuUart485_CONFIG_UART_ENABLE_INTERRUPTS UART_EnableInterrupts + #define McuUart485_CONFIG_UART_ENABLE_INTERRUPT_FLAGS (kUART_RxDataRegFullInterruptEnable | kUART_RxOverrunInterruptEnable) + #define McuUart485_CONFIG_UART_IRQ_NUMBER UART0_RX_TX_IRQn + #define McuUart485_CONFIG_UART_INIT UART_Init + #define McuUart485_CONFIG_UART_GET_CLOCK_FREQ_SELECT kCLOCK_MainClk + #define McuUart485_CONFIG_UART_IRQ_HANDLER UART0_RX_TX_IRQHandler + #define McuUart485_CONFIG_CLEAR_STATUS_FLAGS UART_ClearStatusFlags + #elif McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_K02FN + #include "fsl_uart.h" + #define McuUart485_CONFIG_UART_DEVICE UART1 + #define McuUart485_CONFIG_UART_SET_UART_CLOCK() /* nothing needed */ + #define McuUart485_CONFIG_UART_WRITE_BLOCKING UART_WriteBlocking + #define McuUart485_CONFIG_UART_GET_FLAGS UART_GetStatusFlags + #define McuUart485_CONFIG_UART_HW_RX_READY_FLAGS (kUART_RxDataRegFullFlag|kUART_RxOverrunFlag) + #define McuUart485_CONFIG_UART_READ_BYTE UART_ReadByte + #define McuUart485_CONFIG_UART_CONFIG_STRUCT uart_config_t + #define McuUart485_CONFIG_UART_GET_DEFAULT_CONFIG UART_GetDefaultConfig + #define McuUart485_CONFIG_UART_ENABLE_INTERRUPTS UART_EnableInterrupts + #define McuUart485_CONFIG_UART_ENABLE_INTERRUPT_FLAGS (kUART_RxDataRegFullInterruptEnable | kUART_RxOverrunInterruptEnable | kUART_RxFifoOverflowInterruptEnable) + #define McuUart485_CONFIG_UART_IRQ_NUMBER UART1_RX_TX_IRQn + #define McuUart485_CONFIG_UART_INIT UART_Init + #define McuUart485_CONFIG_UART_GET_CLOCK_FREQ_SELECT kCLOCK_McgFllClk + #define McuUart485_CONFIG_UART_IRQ_HANDLER UART1_RX_TX_IRQHandler + #define McuUart485_CONFIG_CLEAR_STATUS_FLAGS UART_ClearStatusFlags + #elif McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_K22FN + #include "fsl_uart.h" + #define McuUart485_CONFIG_UART_DEVICE UART0 + #define McuUart485_CONFIG_UART_SET_UART_CLOCK() /* nothing needed */ + #define McuUart485_CONFIG_UART_WRITE_BLOCKING UART_WriteBlocking + #define McuUart485_CONFIG_UART_GET_FLAGS UART_GetStatusFlags + #define McuUart485_CONFIG_UART_HW_RX_READY_FLAGS (kUART_RxDataRegFullFlag|kUART_RxOverrunFlag) + #define McuUart485_CONFIG_UART_READ_BYTE UART_ReadByte + #define McuUart485_CONFIG_UART_CONFIG_STRUCT uart_config_t + #define McuUart485_CONFIG_UART_GET_DEFAULT_CONFIG UART_GetDefaultConfig + #define McuUart485_CONFIG_UART_ENABLE_INTERRUPTS UART_EnableInterrupts + #define McuUart485_CONFIG_UART_ENABLE_INTERRUPT_FLAGS (kUART_RxDataRegFullInterruptEnable | kUART_RxOverrunInterruptEnable | kUART_RxFifoOverflowInterruptEnable) + #define McuUart485_CONFIG_UART_IRQ_NUMBER UART0_RX_TX_IRQn + #define McuUart485_CONFIG_UART_INIT UART_Init + #define McuUart485_CONFIG_UART_GET_CLOCK_FREQ_SELECT kCLOCK_PllFllSelClk + #define McuUart485_CONFIG_UART_IRQ_HANDLER UART0_RX_TX_IRQHandler + #define McuUart485_CONFIG_CLEAR_STATUS_FLAGS UART_ClearStatusFlags + #endif + +#elif McuLib_CONFIG_CPU_IS_ESP32 + #include "driver/uart.h" + #ifndef McuUart485_CONFIG_UART_DEVICE + #define McuUart485_CONFIG_UART_DEVICE UART_NUM_2 + #endif + #ifndef McuUart485_CONFIG_TXD_PIN + #define McuUart485_CONFIG_TXD_PIN GPIO_NUM_4 + #endif + #ifndef McuUart485_CONFIG_RXD_PIN + #define McuUart485_CONFIG_RXD_PIN GPIO_NUM_5 + #endif + #ifndef McuUart485_CONFIG_RTS_PIN + #define McuUart485_CONFIG_RTS_PIN GPIO_NUM_23 /* RTS, ~RE for RS485, managed by UART */ + #endif + #ifndef McuUart485_CONFIG_CTS_PIN + #define McuUart485_CONFIG_CTS_PIN (/*GPIO_NUM_26*//*not used*/) /* CTS, DE for RS485, but not used! RE/DE must be wired together on the hardware */ + #endif + +#elif McuLib_CONFIG_CPU_IS_RPxxxx + #include "hardware/uart.h" + #ifndef McuUart485_CONFIG_UART_DEVICE + #define McuUart485_CONFIG_UART_DEVICE uart1 + #endif + #ifndef McuUart485_CONFIG_TXD_PIN + #define McuUart485_CONFIG_TXD_PIN (4u) + #endif + #ifndef McuUart485_CONFIG_RXD_PIN + #define McuUart485_CONFIG_RXD_PIN (5u) + #endif + #ifndef McuUart485_CONFIG_RTS_PIN + #define McuUart485_CONFIG_RTS_PIN (3u) /* RTS, ~RE for RS485 */ + #endif + #ifndef McuUart485_CONFIG_CTS_PIN + #define McuUart485_CONFIG_CTS_PIN (3u) /* CTS, DE for RS485! */ + #endif + #ifndef McuUart485_CONFIG_UART_WRITE_BLOCKING + #define McuUart485_CONFIG_UART_WRITE_BLOCKING uart_write_blocking + #endif + #ifndef McuUart485_CONFIG_UART_PARITY + #define McuUart485_CONFIG_UART_PARITY UART_PARITY_NONE /* UART_PARITY_NONE, UART_PARITY_EVEN, UART_PARITY_ODD */ + #endif + #ifndef McuUart485_CONFIG_UART_READ_BYTE + #define McuUart485_CONFIG_UART_READ_BYTE uart_getc + #endif +#else + /* you have to put your configuration here */ +#endif + +#if McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC845 + #define McuUart485_CONFIG_HAS_FIFO (0) /* no FIFO support on LPC845 */ +#elif McuLib_CONFIG_CPU_IS_KINETIS + #define McuUart485_CONFIG_HAS_FIFO (1) /* UART0 on Kinetis has FIFO */ +#elif McuLib_CONFIG_CPU_IS_ESP32 + #define McuUart485_CONFIG_HAS_FIFO (0) /* no FIFO support on ESP32 */ +#endif + +#ifndef McuUart485_CONFIG_UART_RX_QUEUE_LENGTH + #define McuUart485_CONFIG_UART_RX_QUEUE_LENGTH (3*1024) + /*!< Queue length to buffer incoming data and messages */ +#endif + +#ifndef McuUart485_CONFIG_UART_RESPONSE_QUEUE_LENGTH + #define McuUart485_CONFIG_UART_RESPONSE_QUEUE_LENGTH (96) + /*!< Queue length to check the OK from the other side */ +#endif + +#ifndef McuUart485_CONFIG_UART_BAUDRATE + #define McuUart485_CONFIG_UART_BAUDRATE 115200 +#endif + +#ifndef McuUart485_CONFIG_USE_HW_OE_RTS + #if McuLib_CONFIG_CPU_IS_KINETIS + #define McuUart485_CONFIG_USE_HW_OE_RTS (1) /* 1: Use e.g. on LPC845 OESEL (Output Enable Selection) feature. Note that the pin has to be configured in the PinMuxing as RTS! */ + #elif McuLib_CONFIG_CPU_IS_ESP32 + #define McuUart485_CONFIG_USE_HW_OE_RTS (1) /* on ESP32, the transceiver is controlled by the UART directly with the RTS pin */ + #elif McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC845 + #define McuUart485_CONFIG_USE_HW_OE_RTS (1) /* 1: Use e.g. on LPC845 OESEL (Output Enable Selection) feature. Note that the pin has to be configured in the PinMuxing as RTS! */ + #elif McuLib_CONFIG_CPU_IS_LPC55xx + #define McuUart485_CONFIG_USE_HW_OE_RTS (0) /* if using the RTS function of the UART or not */ + #elif McuLib_CONFIG_CPU_IS_RPxxxx + #define McuUart485_CONFIG_USE_HW_OE_RTS (0) /* on RP2040, need to control RE/DE pin manually */ + #endif +#endif + +#if !McuUart485_CONFIG_USE_HW_OE_RTS + /* RTS pin to enable Tx mode on transceiver (HIGH active) */ + #if McuLib_CONFIG_CPU_IS_KINETIS /* default for Kinetis */ + #ifndef McuUart485_CONFIG_TX_EN_GPIO + #define McuUart485_CONFIG_TX_EN_GPIO GPIOC + #endif + #ifndef McuUart485_CONFIG_TX_EN_PORT + #define McuUart485_CONFIG_TX_EN_PORT PORTC + #endif + #ifndef McuUart485_CONFIG_TX_EN_PIN + #define McuUart485_CONFIG_TX_EN_PIN 2U + #endif + #elif McuLib_CONFIG_CPU_IS_LPC55xx + /* default: pin 92 on LPC55S69-EVK, routed as FC1_I2C_SCL */ + #ifndef McuUart485_CONFIG_TX_EN_GPIO + #define McuUart485_CONFIG_TX_EN_GPIO GPIO + #endif + #ifndef McuUart485_CONFIG_TX_EN_PORT + #define McuUart485_CONFIG_TX_EN_PORT 0 + #endif + #ifndef McuUart485_CONFIG_TX_EN_PIN + #define McuUart485_CONFIG_TX_EN_PIN 14U + #endif + #elif McuLib_CONFIG_CPU_IS_ESP32 /* default for ESP32 */ + #ifndef McuUart485_CONFIG_RE_PIN + #define McuUart485_CONFIG_RE_PIN (McuUart485_CONFIG_CTS_PIN) /* ~DE_ESP32 pin: DE (Data Enable) is low active */ + #endif + #elif McuLib_CONFIG_CPU_IS_RPxxxx + #ifndef McuUart485_CONFIG_RE_PIN + #define McuUart485_CONFIG_TX_EN_PIN (McuUart485_CONFIG_CTS_PIN) /* ~DE_ESP32 pin: DE (Data Enable) is low active */ + #endif + #endif +#endif +#endif /* McuUart485_CONFIG_USE_RS_485 */ + +#endif /* MCUUART485CONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuUtilityconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuUtilityconfig.h new file mode 100644 index 0000000..11ce2a2 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuUtilityconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for Utility + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Utility module. + */ + +#ifndef __McuUtility_CONFIG_H +#define __McuUtility_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuUtility_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuW25Q128config.h b/TSM_PicoW_Sensor/McuLib/config/McuW25Q128config.h new file mode 100644 index 0000000..98dcea2 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuW25Q128config.h @@ -0,0 +1,31 @@ +/*! + * Copyright (c) 2022, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * \file + * \brief Configuration items for the McuW25Q128 Winbond Flash module. + */ + +#ifndef MCUW25Q128CONFIG_H_ +#define MCUW25Q128CONFIG_H_ + +#ifndef MCUW25Q128_CONFIG_ENABLED + #define MCUW25Q128_CONFIG_ENABLED (0) + /*!< By default, the module is disabled. Enable it with 1 */ +#endif + +#ifndef MCUW25Q128_CONFIG_SIZE_KBYTES + #define MCUW25Q128_CONFIG_SIZE_KBYTES (16*1024) + /*!< Size in KBytes. By default it uses the 128MBit (16 MByte) version */ +#endif + +#if MCUW25Q128_CONFIG_ENABLED +#include "McuSPI.h" + +/* W25Q128 chip select is LOW active */ +#define McuW25_CONFIG_CS_ENABLE() McuSPI_SetCS_Low() +#define McuW25_CONFIG_CS_DISABLE() McuSPI_SetCS_High() + +#endif /* MCUW25Q128_CONFIG_ENABLED */ + +#endif /* MCUW25Q128CONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuWaitconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuWaitconfig.h new file mode 100644 index 0000000..0708ffe --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuWaitconfig.h @@ -0,0 +1,39 @@ +/** + * \file + * \brief Configuration header file for Wait + * Copyright (c) 2020-2024, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the busy waiting module. + */ + +#ifndef __McuWait_CONFIG_H +#define __McuWait_CONFIG_H + +#include "McuLib.h" /* include library configuration */ + +#ifndef McuWait_CONFIG_USE_CYCLE_COUNTER + #define McuWait_CONFIG_USE_CYCLE_COUNTER (1 && (McuLib_CONFIG_CPU_IS_ARM_CORTEX_M && McuLib_CONFIG_CORTEX_M>=3)) + /*!< 1: Use hardware cycle counter (if present, only on Cortex-M3 or higher), 0: not using hardware cycle counter */ +#endif + +#ifndef McuWait_CONFIG_NOF_CYCLES_FOR_NOP_MUL + #define McuWait_CONFIG_NOF_CYCLES_FOR_NOP_MUL (1) + /*!< by default, use a single cycle for a NOP instruction. Some devices like the LPC804 need more. This factor gets it multiplied, see McuWait_CONFIG_NOF_CYCLES_FOR_NOP_DIV. */ +#endif + +#ifndef McuWait_CONFIG_NOF_CYCLES_FOR_NOP_DIV + #define McuWait_CONFIG_NOF_CYCLES_FOR_NOP_DIV (1) + /*!< by default, use a single cycle for a NOP instruction. Some devices like the LPC804 need more. This factor gets it divided, see McuWait_CONFIG_NOF_CYCLES_FOR_NOP_MUL. */ +#endif + +#ifndef McuWait_CONFIG_USE_RTOS_WAIT + #define McuWait_CONFIG_USE_RTOS_WAIT (1 && McuLib_CONFIG_SDK_USE_FREERTOS) + /*!< 1: Use RTOS wait if RTOS is present; 0: use normal busy waiting */ +#endif + +#if McuWait_CONFIG_USE_CYCLE_COUNTER + #include "McuArmTools.h" /* include Cortex utility functions */ +#endif + +#endif /* __McuWait_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuWatchdog_config.h b/TSM_PicoW_Sensor/McuLib/config/McuWatchdog_config.h new file mode 100644 index 0000000..6f75ee8 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuWatchdog_config.h @@ -0,0 +1,42 @@ +/*! + * Copyright (c) 2023, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * \file + * \brief Configuration items for the McuWatchdog module. + */ + +#ifndef MCUWATCHDOG_CONFIG_H_ +#define MCUWATCHDOG_CONFIG_H_ + +#ifndef McuWatchdog_CONFIG_USE_WATCHDOG + #define McuWatchdog_CONFIG_USE_WATCHDOG (0) + /*!< if using the McuWatchdog module */ +#endif + +#ifndef McuWatchdog_CONFIG_HEALT_CHECK_TIME_SEC + #define McuWatchdog_CONFIG_HEALT_CHECK_TIME_SEC (5) /*!< interval for checking health */ +#endif + +#ifndef McuWatchdog_CONFIG_TIMEOUT_MS + #define McuWatchdog_CONFIG_TIMEOUT_MS (1000) /*!< number of ms for hardware watchdog timer */ +#endif + +#ifndef McuWatchdog_CONFIG_DISABLED_FOR_DEBUG + #define McuWatchdog_CONFIG_DISABLED_FOR_DEBUG (0) /* set to 1 for easier debugging, set to 0 for production code! */ +#endif +#ifndef McuWatchdog_CONFIG_REPORT_TIME_VALUES + #define McuWatchdog_CONFIG_REPORT_TIME_VALUES (0) /* 1: report time values during safety check, useful for debugging */ +#endif + +#ifndef McuWatchdog_CONFIG_REPORT_ID_INCLUDE_FILE + #define McuWatchdog_CONFIG_REPORT_ID_INCLUDE_FILE "McuWatchdog_IDs.inc" + /*!< file with watchdog IDs (enumeration values) with McuWatchdog_REPORT_IDS macro */ +#endif + +#ifndef McuWatchdog_CONFIG_REPORT_ID_INCLUDE_HEADER_FILE + #define McuWatchdog_CONFIG_REPORT_ID_INCLUDE_HEADER_FILE "platform.h" + /*!< header file which is used for the watchdog IDs */ +#endif + +#endif /* MCUWATCHDOG_CONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuX12_017config.h b/TSM_PicoW_Sensor/McuLib/config/McuX12_017config.h new file mode 100644 index 0000000..1edc755 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuX12_017config.h @@ -0,0 +1,34 @@ +/*! + * Copyright (c) 2019, Erich Styger + * \file + * \brief Configuration header file for X12.017 quad-stepper motor driver. + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#ifndef MCU_X12_017_CONFIG_H_ +#define MCU_X12_017_CONFIG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "McuLibconfig.h" + +#ifndef McuX12_017_CONFIG_USE_FREERTOS_HEAP + #define McuX12_017_CONFIG_USE_FREERTOS_HEAP (McuLib_CONFIG_SDK_USE_FREERTOS) + /*!< 1: use FreeRTOS Heap (default), 0: use stdlib malloc() and free() */ +#endif + +#ifndef McuX12_017_CONFIG_QUAD_DRIVER + #define McuX12_017_CONFIG_QUAD_DRIVER (1) + /*!< 1: Quad driver version; 0: Dual driver version */ +#endif + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MCU_X12_017_CONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/config/McuXFormatconfig.h b/TSM_PicoW_Sensor/McuLib/config/McuXFormatconfig.h new file mode 100644 index 0000000..5b719cf --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/McuXFormatconfig.h @@ -0,0 +1,78 @@ +/** + * \file + * \brief Configuration header file for XFormat + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the XFormat module. + */ +#ifndef __McuXFormat_CONFIG_H +#define __McuXFormat_CONFIG_H + +#ifndef McuXFormat_CONFIG_XCFG_FORMAT_FLOAT + #define XCFG_FORMAT_FLOAT 1 /* 1: enable, 0: disable floating format (component property) */ +#endif + +#ifndef McuXFormat_CONFIG_XCFG_FORMAT_FLOAT + #define XCFG_FORMAT_STATIC /* static */ /* used for the buffer. WARNING: using 'static' makes it non-reentrant! */ +#endif + +/** + * MSVC use in x64 model IL32P64 architecture so the largest integer + * is not a standard C integer. + */ +#if defined(_MSC_VER) && defined(_M_AMD64) +#define LONG long long +#define XCFG_FORMAT_LONG_ARE_LONGLONG +#endif + +/** + * SDCC support only float and for now do not support long long + */ +#ifdef __SDCC +#define DOUBLE float +#ifndef XCFG_FORMAT_LONGLONG + #define XCFG_FORMAT_LONGLONG 0 +#endif +#endif + +/** + * Define internal parameters as volatile for 8 bit cpu define + * XCFG_FORMAT_STATIC=static to reduce stack usage. + */ +#ifndef XCFG_FORMAT_STATIC + #define XCFG_FORMAT_STATIC +#endif + +/** + * Define XCFG_FORMAT_FLOAT=0 to remove floating point support + */ +#ifndef XCFG_FORMAT_FLOAT + #define XCFG_FORMAT_FLOAT 0 +#endif + +/** + * Detect support for va_copy this macro must be called for example + * in x86_64 machine to adjust the stack frame when an argument of va_list + * is passed over functions. + */ +#ifndef XCFG_FORMAT_VA_COPY +#if defined(__GNUC__) && defined(__x86_64__) + #define XCFG_FORMAT_VA_COPY 1 +#endif + +#ifndef XCFG_FORMAT_VA_COPY + #define XCFG_FORMAT_VA_COPY 0 +#endif + +#endif + +/** + * Define to 0 to support long long type (prefix ll) + */ +#ifndef XCFG_FORMAT_LONGLONG + #define XCFG_FORMAT_LONGLONG 0 +#endif + + +#endif /* __McuXFormat_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/Output1config.h b/TSM_PicoW_Sensor/McuLib/config/Output1config.h new file mode 100644 index 0000000..2d076a4 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/Output1config.h @@ -0,0 +1,87 @@ +/** + * \file + * \brief Configuration header file for SDK_BitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SDK Bit I/O module. + */ + +#ifndef __Output1_CONFIG_H +#define __Output1_CONFIG_H + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_MCUXPRESSO_2_0 + #include "pin_mux.h" /* include pin muxing header file */ + + #if defined(BOARD_INITPINS_Output1_PIN) + #define Output1_CONFIG_PIN_NUMBER BOARD_INITPINS_Output1_PIN + #endif + #if defined(BOARD_INITPINS_Output1_GPIO) + #define Output1_CONFIG_GPIO_NAME BOARD_INITPINS_Output1_GPIO + #endif + #if defined(BOARD_INITPINS_Output1_PORT) + #define Output1_CONFIG_PORT_NAME BOARD_INITPINS_Output1_PORT + #endif +#endif + +#ifndef Output1_CONFIG_PORT_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define Output1_CONFIG_PORT_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define Output1_CONFIG_PORT_NAME 0 + #else /* name from properties */ + #define Output1_CONFIG_PORT_NAME PORTA + #endif + /*!< name of PORT, is pointer to PORT_Type */ +#endif + +#ifndef Output1_CONFIG_GPIO_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define Output1_CONFIG_GPIO_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define Output1_CONFIG_GPIO_NAME GPIO + #elif McuLib_CONFIG_CPU_IS_KINETIS && McuLib_CONFIG_IS_KINETIS_KE + #define Output1_CONFIG_GPIO_NAME 0 + #elif McuLib_CONFIG_CPU_IS_MCX + #define Output1_CONFIG_GPIO_NAME GPIO0 + #else /* name from properties */ + #define Output1_CONFIG_GPIO_NAME GPIOA + #endif + /*!< name of GPIO, is pointer to GPIO_Type, not used for S32K SDK */ +#endif + +#ifndef Output1_CONFIG_PIN_NUMBER + #define Output1_CONFIG_PIN_NUMBER 0u + /*!< number of pin, type unsigned integer */ +#endif + +#ifndef Output1_CONFIG_PIN_SYMBOL + #define Output1_CONFIG_PIN_SYMBOL LED_RED + /*!< symbolic name for pin, used for NXP SDK V1.3 */ +#endif + +#ifndef Output1_CONFIG_INIT_PIN_VALUE + #define Output1_CONFIG_INIT_PIN_VALUE 0 + /*!< 0: Pin data is initialized with 0 (low); 1: pin value is initialized with 1 (high) */ +#endif + +/* different types of pin direction settings */ +#define Output1_CONFIG_INIT_PIN_DIRECTION_NONE (0) +#define Output1_CONFIG_INIT_PIN_DIRECTION_INPUT (1) +#define Output1_CONFIG_INIT_PIN_DIRECTION_OUTPUT (2) + +#ifndef Output1_CONFIG_INIT_PIN_DIRECTION + #define Output1_CONFIG_INIT_PIN_DIRECTION Output1_CONFIG_INIT_PIN_DIRECTION_INPUT +#endif + +#ifndef Output1_CONFIG_DO_PIN_MUXING + #define Output1_CONFIG_DO_PIN_MUXING 0 + /*!< 1: perform pin muxing in Init(), 0: do not do pin muxing */ +#endif + +#ifndef Output1_CONFIG_PULL_RESISTOR + #define Output1_CONFIG_PULL_RESISTOR 0 + /*!< pull resistor setting. 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ +#endif + +#endif /* __Output1_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/SCL1config.h b/TSM_PicoW_Sensor/McuLib/config/SCL1config.h new file mode 100644 index 0000000..7f8fb15 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/SCL1config.h @@ -0,0 +1,87 @@ +/** + * \file + * \brief Configuration header file for SDK_BitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SDK Bit I/O module. + */ + +#ifndef __SCL1_CONFIG_H +#define __SCL1_CONFIG_H + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_MCUXPRESSO_2_0 + #include "pin_mux.h" /* include pin muxing header file */ + + #if defined(BOARD_INITPINS_SCL1_PIN) + #define SCL1_CONFIG_PIN_NUMBER BOARD_INITPINS_SCL1_PIN + #endif + #if defined(BOARD_INITPINS_SCL1_GPIO) + #define SCL1_CONFIG_GPIO_NAME BOARD_INITPINS_SCL1_GPIO + #endif + #if defined(BOARD_INITPINS_SCL1_PORT) + #define SCL1_CONFIG_PORT_NAME BOARD_INITPINS_SCL1_PORT + #endif +#endif + +#ifndef SCL1_CONFIG_PORT_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define SCL1_CONFIG_PORT_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define SCL1_CONFIG_PORT_NAME 0 + #else /* name from properties */ + #define SCL1_CONFIG_PORT_NAME PORTA + #endif + /*!< name of PORT, is pointer to PORT_Type */ +#endif + +#ifndef SCL1_CONFIG_GPIO_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define SCL1_CONFIG_GPIO_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define SCL1_CONFIG_GPIO_NAME GPIO + #elif McuLib_CONFIG_CPU_IS_KINETIS && McuLib_CONFIG_IS_KINETIS_KE + #define SCL1_CONFIG_GPIO_NAME 0 + #elif McuLib_CONFIG_CPU_IS_MCX + #define SCL1_CONFIG_GPIO_NAME GPIO0 + #else /* name from properties */ + #define SCL1_CONFIG_GPIO_NAME GPIOA + #endif + /*!< name of GPIO, is pointer to GPIO_Type, not used for S32K SDK */ +#endif + +#ifndef SCL1_CONFIG_PIN_NUMBER + #define SCL1_CONFIG_PIN_NUMBER 0u + /*!< number of pin, type unsigned integer */ +#endif + +#ifndef SCL1_CONFIG_PIN_SYMBOL + #define SCL1_CONFIG_PIN_SYMBOL I2C_SCL + /*!< symbolic name for pin, used for NXP SDK V1.3 */ +#endif + +#ifndef SCL1_CONFIG_INIT_PIN_VALUE + #define SCL1_CONFIG_INIT_PIN_VALUE 0 + /*!< 0: Pin data is initialized with 0 (low); 1: pin value is initialized with 1 (high) */ +#endif + +/* different types of pin direction settings */ +#define SCL1_CONFIG_INIT_PIN_DIRECTION_NONE (0) +#define SCL1_CONFIG_INIT_PIN_DIRECTION_INPUT (1) +#define SCL1_CONFIG_INIT_PIN_DIRECTION_OUTPUT (2) + +#ifndef SCL1_CONFIG_INIT_PIN_DIRECTION + #define SCL1_CONFIG_INIT_PIN_DIRECTION SCL1_CONFIG_INIT_PIN_DIRECTION_INPUT +#endif + +#ifndef SCL1_CONFIG_DO_PIN_MUXING + #define SCL1_CONFIG_DO_PIN_MUXING 0 + /*!< 1: perform pin muxing in Init(), 0: do not do pin muxing */ +#endif + +#ifndef SCL1_CONFIG_PULL_RESISTOR + #define SCL1_CONFIG_PULL_RESISTOR 0 + /*!< pull resistor setting. 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ +#endif + +#endif /* __SCL1_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/SDA1config.h b/TSM_PicoW_Sensor/McuLib/config/SDA1config.h new file mode 100644 index 0000000..7d549b7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/SDA1config.h @@ -0,0 +1,87 @@ +/** + * \file + * \brief Configuration header file for SDK_BitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SDK Bit I/O module. + */ + +#ifndef __SDA1_CONFIG_H +#define __SDA1_CONFIG_H + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_MCUXPRESSO_2_0 + #include "pin_mux.h" /* include pin muxing header file */ + + #if defined(BOARD_INITPINS_SDA1_PIN) + #define SDA1_CONFIG_PIN_NUMBER BOARD_INITPINS_SDA1_PIN + #endif + #if defined(BOARD_INITPINS_SDA1_GPIO) + #define SDA1_CONFIG_GPIO_NAME BOARD_INITPINS_SDA1_GPIO + #endif + #if defined(BOARD_INITPINS_SDA1_PORT) + #define SDA1_CONFIG_PORT_NAME BOARD_INITPINS_SDA1_PORT + #endif +#endif + +#ifndef SDA1_CONFIG_PORT_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define SDA1_CONFIG_PORT_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define SDA1_CONFIG_PORT_NAME 0 + #else /* name from properties */ + #define SDA1_CONFIG_PORT_NAME PORTA + #endif + /*!< name of PORT, is pointer to PORT_Type */ +#endif + +#ifndef SDA1_CONFIG_GPIO_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define SDA1_CONFIG_GPIO_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define SDA1_CONFIG_GPIO_NAME GPIO + #elif McuLib_CONFIG_CPU_IS_KINETIS && McuLib_CONFIG_IS_KINETIS_KE + #define SDA1_CONFIG_GPIO_NAME 0 + #elif McuLib_CONFIG_CPU_IS_MCX + #define SDA1_CONFIG_GPIO_NAME GPIO0 + #else /* name from properties */ + #define SDA1_CONFIG_GPIO_NAME GPIOA + #endif + /*!< name of GPIO, is pointer to GPIO_Type, not used for S32K SDK */ +#endif + +#ifndef SDA1_CONFIG_PIN_NUMBER + #define SDA1_CONFIG_PIN_NUMBER 0u + /*!< number of pin, type unsigned integer */ +#endif + +#ifndef SDA1_CONFIG_PIN_SYMBOL + #define SDA1_CONFIG_PIN_SYMBOL I2C_SDA + /*!< symbolic name for pin, used for NXP SDK V1.3 */ +#endif + +#ifndef SDA1_CONFIG_INIT_PIN_VALUE + #define SDA1_CONFIG_INIT_PIN_VALUE 0 + /*!< 0: Pin data is initialized with 0 (low); 1: pin value is initialized with 1 (high) */ +#endif + +/* different types of pin direction settings */ +#define SDA1_CONFIG_INIT_PIN_DIRECTION_NONE (0) +#define SDA1_CONFIG_INIT_PIN_DIRECTION_INPUT (1) +#define SDA1_CONFIG_INIT_PIN_DIRECTION_OUTPUT (2) + +#ifndef SDA1_CONFIG_INIT_PIN_DIRECTION + #define SDA1_CONFIG_INIT_PIN_DIRECTION SDA1_CONFIG_INIT_PIN_DIRECTION_INPUT +#endif + +#ifndef SDA1_CONFIG_DO_PIN_MUXING + #define SDA1_CONFIG_DO_PIN_MUXING 0 + /*!< 1: perform pin muxing in Init(), 0: do not do pin muxing */ +#endif + +#ifndef SDA1_CONFIG_PULL_RESISTOR + #define SDA1_CONFIG_PULL_RESISTOR 0 + /*!< pull resistor setting. 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ +#endif + +#endif /* __SDA1_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/WPpin1config.h b/TSM_PicoW_Sensor/McuLib/config/WPpin1config.h new file mode 100644 index 0000000..2869136 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/WPpin1config.h @@ -0,0 +1,87 @@ +/** + * \file + * \brief Configuration header file for SDK_BitIO + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the SDK Bit I/O module. + */ + +#ifndef __WPpin1_CONFIG_H +#define __WPpin1_CONFIG_H + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_MCUXPRESSO_2_0 + #include "pin_mux.h" /* include pin muxing header file */ + + #if defined(BOARD_INITPINS_WPpin1_PIN) + #define WPpin1_CONFIG_PIN_NUMBER BOARD_INITPINS_WPpin1_PIN + #endif + #if defined(BOARD_INITPINS_WPpin1_GPIO) + #define WPpin1_CONFIG_GPIO_NAME BOARD_INITPINS_WPpin1_GPIO + #endif + #if defined(BOARD_INITPINS_WPpin1_PORT) + #define WPpin1_CONFIG_PORT_NAME BOARD_INITPINS_WPpin1_PORT + #endif +#endif + +#ifndef WPpin1_CONFIG_PORT_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define WPpin1_CONFIG_PORT_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define WPpin1_CONFIG_PORT_NAME 0 + #else /* name from properties */ + #define WPpin1_CONFIG_PORT_NAME PORTA + #endif + /*!< name of PORT, is pointer to PORT_Type */ +#endif + +#ifndef WPpin1_CONFIG_GPIO_NAME + #if McuLib_CONFIG_CPU_IS_IMXRT + #define WPpin1_CONFIG_GPIO_NAME GPIO1 + #elif McuLib_CONFIG_CPU_IS_LPC + #define WPpin1_CONFIG_GPIO_NAME GPIO + #elif McuLib_CONFIG_CPU_IS_KINETIS && McuLib_CONFIG_IS_KINETIS_KE + #define WPpin1_CONFIG_GPIO_NAME 0 + #elif McuLib_CONFIG_CPU_IS_MCX + #define WPpin1_CONFIG_GPIO_NAME GPIO0 + #else /* name from properties */ + #define WPpin1_CONFIG_GPIO_NAME GPIOA + #endif + /*!< name of GPIO, is pointer to GPIO_Type, not used for S32K SDK */ +#endif + +#ifndef WPpin1_CONFIG_PIN_NUMBER + #define WPpin1_CONFIG_PIN_NUMBER 0u + /*!< number of pin, type unsigned integer */ +#endif + +#ifndef WPpin1_CONFIG_PIN_SYMBOL + #define WPpin1_CONFIG_PIN_SYMBOL WP_24AA + /*!< symbolic name for pin, used for NXP SDK V1.3 */ +#endif + +#ifndef WPpin1_CONFIG_INIT_PIN_VALUE + #define WPpin1_CONFIG_INIT_PIN_VALUE 0 + /*!< 0: Pin data is initialized with 0 (low); 1: pin value is initialized with 1 (high) */ +#endif + +/* different types of pin direction settings */ +#define WPpin1_CONFIG_INIT_PIN_DIRECTION_NONE (0) +#define WPpin1_CONFIG_INIT_PIN_DIRECTION_INPUT (1) +#define WPpin1_CONFIG_INIT_PIN_DIRECTION_OUTPUT (2) + +#ifndef WPpin1_CONFIG_INIT_PIN_DIRECTION + #define WPpin1_CONFIG_INIT_PIN_DIRECTION WPpin1_CONFIG_INIT_PIN_DIRECTION_OUTPUT +#endif + +#ifndef WPpin1_CONFIG_DO_PIN_MUXING + #define WPpin1_CONFIG_DO_PIN_MUXING 0 + /*!< 1: perform pin muxing in Init(), 0: do not do pin muxing */ +#endif + +#ifndef WPpin1_CONFIG_PULL_RESISTOR + #define WPpin1_CONFIG_PULL_RESISTOR 0 + /*!< pull resistor setting. 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ +#endif + +#endif /* __WPpin1_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour08Boldconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour08Boldconfig.h new file mode 100644 index 0000000..3c34c88 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour08Boldconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontCour08Bold_CONFIG_H +#define __McuFontCour08Bold_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontCour08Bold_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour08Normalconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour08Normalconfig.h new file mode 100644 index 0000000..a3d0711 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour08Normalconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontCour08Normal_CONFIG_H +#define __McuFontCour08Normal_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontCour08Normal_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour10Boldconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour10Boldconfig.h new file mode 100644 index 0000000..05895ed --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour10Boldconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontCour10Bold_CONFIG_H +#define __McuFontCour10Bold_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontCour10Bold_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour10Normalconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour10Normalconfig.h new file mode 100644 index 0000000..b0f445e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour10Normalconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontCour10Normal_CONFIG_H +#define __McuFontCour10Normal_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontCour10Normal_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour12Boldconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour12Boldconfig.h new file mode 100644 index 0000000..ced55e4 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour12Boldconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontCour12Bold_CONFIG_H +#define __McuFontCour12Bold_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontCour12Bold_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour12Normalconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour12Normalconfig.h new file mode 100644 index 0000000..e07ed49 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour12Normalconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontCour12Normal_CONFIG_H +#define __McuFontCour12Normal_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontCour12Normal_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour14Boldconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour14Boldconfig.h new file mode 100644 index 0000000..45ce846 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour14Boldconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontCour14Bold_CONFIG_H +#define __McuFontCour14Bold_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontCour14Bold_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour14Normalconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour14Normalconfig.h new file mode 100644 index 0000000..a7ec0d1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour14Normalconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontCour14Normal_CONFIG_H +#define __McuFontCour14Normal_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontCour14Normal_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour18Boldconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour18Boldconfig.h new file mode 100644 index 0000000..5eee2a6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour18Boldconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontCour18Bold_CONFIG_H +#define __McuFontCour18Bold_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontCour18Bold_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour18Normalconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour18Normalconfig.h new file mode 100644 index 0000000..b35d09e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour18Normalconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontCour18Normal_CONFIG_H +#define __McuFontCour18Normal_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontCour18Normal_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour24Boldconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour24Boldconfig.h new file mode 100644 index 0000000..f49d321 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour24Boldconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontCour24Bold_CONFIG_H +#define __McuFontCour24Bold_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontCour24Bold_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour24Normalconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour24Normalconfig.h new file mode 100644 index 0000000..e5f25e9 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontCour24Normalconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontCour24Normal_CONFIG_H +#define __McuFontCour24Normal_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontCour24Normal_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv08Boldconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv08Boldconfig.h new file mode 100644 index 0000000..064aa11 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv08Boldconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontHelv08Bold_CONFIG_H +#define __McuFontHelv08Bold_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontHelv08Bold_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv08Normalconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv08Normalconfig.h new file mode 100644 index 0000000..b97dbfc --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv08Normalconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontHelv08Normal_CONFIG_H +#define __McuFontHelv08Normal_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontHelv08Normal_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv10Boldconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv10Boldconfig.h new file mode 100644 index 0000000..c855e71 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv10Boldconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontHelv10Bold_CONFIG_H +#define __McuFontHelv10Bold_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontHelv10Bold_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv10Normalconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv10Normalconfig.h new file mode 100644 index 0000000..f505c54 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv10Normalconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontHelv10Normal_CONFIG_H +#define __McuFontHelv10Normal_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontHelv10Normal_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv12Boldconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv12Boldconfig.h new file mode 100644 index 0000000..c3a1620 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv12Boldconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontHelv12Bold_CONFIG_H +#define __McuFontHelv12Bold_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontHelv12Bold_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv12Normalconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv12Normalconfig.h new file mode 100644 index 0000000..ee5f699 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv12Normalconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontHelv12Normal_CONFIG_H +#define __McuFontHelv12Normal_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontHelv12Normal_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv14Boldconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv14Boldconfig.h new file mode 100644 index 0000000..d041b0c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv14Boldconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontHelv14Bold_CONFIG_H +#define __McuFontHelv14Bold_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontHelv14Bold_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv14Normalconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv14Normalconfig.h new file mode 100644 index 0000000..9f3e04f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv14Normalconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontHelv14Normal_CONFIG_H +#define __McuFontHelv14Normal_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontHelv14Normal_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv18Boldconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv18Boldconfig.h new file mode 100644 index 0000000..13b391d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv18Boldconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontHelv18Bold_CONFIG_H +#define __McuFontHelv18Bold_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontHelv18Bold_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv18Normalconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv18Normalconfig.h new file mode 100644 index 0000000..7e67b4b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv18Normalconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontHelv18Normal_CONFIG_H +#define __McuFontHelv18Normal_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontHelv18Normal_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv24Boldconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv24Boldconfig.h new file mode 100644 index 0000000..c992fbb --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv24Boldconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontHelv24Bold_CONFIG_H +#define __McuFontHelv24Bold_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontHelv24Bold_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv24Normalconfig.h b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv24Normalconfig.h new file mode 100644 index 0000000..df5500c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/config/fonts/McuFontHelv24Normalconfig.h @@ -0,0 +1,15 @@ +/** + * \file + * \brief Configuration header file for GFont + * Copyright (c) 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the Graphical Font module. + */ + +#ifndef __McuFontHelv24Normal_CONFIG_H +#define __McuFontHelv24Normal_CONFIG_H + +/* no configuration supported yet */ + +#endif /* __McuFontHelv24Normal_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour08Bold.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour08Bold.c new file mode 100644 index 0000000..7ad957e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour08Bold.c @@ -0,0 +1,2362 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour08Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour08Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 8 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour08Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour08Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour08Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour08Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour08Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontCour08Bold_Deinit(void); +** Init - void McuFontCour08Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour08Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour08Bold_module McuFontCour08Bold module documentation +** @{ +*/ + +/* MODULE McuFontCour08Bold. */ + +#include "McuFontCour08Bold.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontCour08Bold_FBBy 11 + +static const uint8_t courB08L1_0x00_BMP[] = { + 0xAA, + 0x00, + 0x82, + 0x00, + 0xAA +}; + +static const uint8_t courB08L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t courB08L1_0x21_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x00, + 0xC0 +}; + +static const uint8_t courB08L1_0x22_BMP[] = { + 0xA0, + 0xA0, + 0xA0 +}; + +static const uint8_t courB08L1_0x23_BMP[] = { + 0x50, + 0x50, + 0xF8, + 0x50, + 0x50, + 0xF8, + 0x50, + 0x50 +}; + +static const uint8_t courB08L1_0x24_BMP[] = { + 0x20, + 0x78, + 0xC8, + 0xF0, + 0x78, + 0x18, + 0xD8, + 0xF0, + 0x20 +}; + +static const uint8_t courB08L1_0x25_BMP[] = { + 0xE0, + 0xA8, + 0xF0, + 0x20, + 0x78, + 0xA8, + 0x38 +}; + +static const uint8_t courB08L1_0x26_BMP[] = { + 0x38, + 0x60, + 0x30, + 0x7C, + 0xD8, + 0x7C +}; + +static const uint8_t courB08L1_0x27_BMP[] = { + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t courB08L1_0x28_BMP[] = { + 0x20, + 0x40, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x40, + 0x20 +}; + +static const uint8_t courB08L1_0x29_BMP[] = { + 0x80, + 0x40, + 0x60, + 0x60, + 0x60, + 0x60, + 0x40, + 0x80 +}; + +static const uint8_t courB08L1_0x2A_BMP[] = { + 0x20, + 0xF0, + 0x60, + 0x90 +}; + +static const uint8_t courB08L1_0x2B_BMP[] = { + 0x20, + 0x20, + 0xF8, + 0x20, + 0x20 +}; + +static const uint8_t courB08L1_0x2C_BMP[] = { + 0x60, + 0x40, + 0x80 +}; + +static const uint8_t courB08L1_0x2D_BMP[] = { + 0xF8 +}; + +static const uint8_t courB08L1_0x2E_BMP[] = { + 0xC0 +}; + +static const uint8_t courB08L1_0x2F_BMP[] = { + 0x10, + 0x10, + 0x20, + 0x20, + 0x40, + 0x40, + 0x80, + 0x80 +}; + +static const uint8_t courB08L1_0x30_BMP[] = { + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t courB08L1_0x31_BMP[] = { + 0x30, + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30, + 0xFC +}; + +static const uint8_t courB08L1_0x32_BMP[] = { + 0x70, + 0xD8, + 0x18, + 0x30, + 0x60, + 0xD8, + 0xF8 +}; + +static const uint8_t courB08L1_0x33_BMP[] = { + 0x70, + 0xD8, + 0x18, + 0x70, + 0x18, + 0xD8, + 0x70 +}; + +static const uint8_t courB08L1_0x34_BMP[] = { + 0x18, + 0x38, + 0x58, + 0xD8, + 0xFC, + 0x18, + 0x18 +}; + +static const uint8_t courB08L1_0x35_BMP[] = { + 0xF8, + 0xC0, + 0xF0, + 0xD8, + 0x18, + 0x98, + 0xF0 +}; + +static const uint8_t courB08L1_0x36_BMP[] = { + 0x70, + 0xD8, + 0xC0, + 0xF0, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t courB08L1_0x37_BMP[] = { + 0xF8, + 0xD8, + 0x18, + 0x30, + 0x30, + 0x60, + 0x60 +}; + +static const uint8_t courB08L1_0x38_BMP[] = { + 0x70, + 0xD8, + 0xD8, + 0x70, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t courB08L1_0x39_BMP[] = { + 0x70, + 0xD8, + 0xD8, + 0x78, + 0x18, + 0xD8, + 0x70 +}; + +static const uint8_t courB08L1_0x3A_BMP[] = { + 0xC0, + 0x00, + 0x00, + 0xC0 +}; + +static const uint8_t courB08L1_0x3B_BMP[] = { + 0x60, + 0x00, + 0x00, + 0x60, + 0x40, + 0x80 +}; + +static const uint8_t courB08L1_0x3C_BMP[] = { + 0x30, + 0x60, + 0xC0, + 0x60, + 0x30 +}; + +static const uint8_t courB08L1_0x3D_BMP[] = { + 0xF0, + 0x00, + 0xF0 +}; + +static const uint8_t courB08L1_0x3E_BMP[] = { + 0xC0, + 0x60, + 0x30, + 0x60, + 0xC0 +}; + +static const uint8_t courB08L1_0x3F_BMP[] = { + 0x70, + 0x98, + 0x30, + 0x60, + 0x00, + 0x60 +}; + +static const uint8_t courB08L1_0x40_BMP[] = { + 0x70, + 0xC8, + 0x98, + 0xA8, + 0xA8, + 0x9C, + 0xC0, + 0x70 +}; + +static const uint8_t courB08L1_0x41_BMP[] = { + 0x78, + 0x38, + 0x28, + 0x7C, + 0x6C, + 0xEE +}; + +static const uint8_t courB08L1_0x42_BMP[] = { + 0xF8, + 0x6C, + 0x78, + 0x6C, + 0x6C, + 0xF8 +}; + +static const uint8_t courB08L1_0x43_BMP[] = { + 0x78, + 0xD8, + 0xC0, + 0xC0, + 0xD8, + 0x70 +}; + +static const uint8_t courB08L1_0x44_BMP[] = { + 0xF8, + 0x6C, + 0x6C, + 0x6C, + 0x6C, + 0xF8 +}; + +static const uint8_t courB08L1_0x45_BMP[] = { + 0xFC, + 0x60, + 0x78, + 0x60, + 0x6C, + 0xFC +}; + +static const uint8_t courB08L1_0x46_BMP[] = { + 0xFC, + 0x60, + 0x78, + 0x60, + 0x60, + 0xF0 +}; + +static const uint8_t courB08L1_0x47_BMP[] = { + 0x70, + 0xD8, + 0xC0, + 0xF8, + 0xD8, + 0x78 +}; + +static const uint8_t courB08L1_0x48_BMP[] = { + 0xEE, + 0x6C, + 0x7C, + 0x6C, + 0x6C, + 0xEE +}; + +static const uint8_t courB08L1_0x49_BMP[] = { + 0xF0, + 0x60, + 0x60, + 0x60, + 0x60, + 0xF0 +}; + +static const uint8_t courB08L1_0x4A_BMP[] = { + 0x3C, + 0x18, + 0x18, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t courB08L1_0x4B_BMP[] = { + 0xEC, + 0x68, + 0x70, + 0x78, + 0x6C, + 0xF6 +}; + +static const uint8_t courB08L1_0x4C_BMP[] = { + 0xF0, + 0x60, + 0x60, + 0x60, + 0x6C, + 0xFC +}; + +static const uint8_t courB08L1_0x4D_BMP[] = { + 0xC4, + 0x6C, + 0x6C, + 0x7C, + 0x54, + 0xD4 +}; + +static const uint8_t courB08L1_0x4E_BMP[] = { + 0xEE, + 0x74, + 0x74, + 0x6C, + 0x6C, + 0xE4 +}; + +static const uint8_t courB08L1_0x4F_BMP[] = { + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t courB08L1_0x50_BMP[] = { + 0xF8, + 0x6C, + 0x6C, + 0x78, + 0x60, + 0xF0 +}; + +static const uint8_t courB08L1_0x51_BMP[] = { + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x70, + 0x18 +}; + +static const uint8_t courB08L1_0x52_BMP[] = { + 0xF8, + 0x6C, + 0x6C, + 0x78, + 0x6C, + 0xF6 +}; + +static const uint8_t courB08L1_0x53_BMP[] = { + 0x78, + 0xC8, + 0xF0, + 0x38, + 0x98, + 0xF0 +}; + +static const uint8_t courB08L1_0x54_BMP[] = { + 0xFC, + 0xB4, + 0x30, + 0x30, + 0x30, + 0x78 +}; + +static const uint8_t courB08L1_0x55_BMP[] = { + 0xEE, + 0x6C, + 0x6C, + 0x6C, + 0x6C, + 0x38 +}; + +static const uint8_t courB08L1_0x56_BMP[] = { + 0xEE, + 0x6C, + 0x28, + 0x38, + 0x38, + 0x10 +}; + +static const uint8_t courB08L1_0x57_BMP[] = { + 0xD6, + 0x54, + 0x54, + 0x7C, + 0x38, + 0x28 +}; + +static const uint8_t courB08L1_0x58_BMP[] = { + 0xCC, + 0x78, + 0x30, + 0x30, + 0x78, + 0xCC +}; + +static const uint8_t courB08L1_0x59_BMP[] = { + 0xE6, + 0x66, + 0x3C, + 0x18, + 0x18, + 0x3C +}; + +static const uint8_t courB08L1_0x5A_BMP[] = { + 0xF8, + 0xD8, + 0x30, + 0x60, + 0xD8, + 0xF8 +}; + +static const uint8_t courB08L1_0x5B_BMP[] = { + 0xE0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xE0 +}; + +static const uint8_t courB08L1_0x5C_BMP[] = { + 0x80, + 0x80, + 0x40, + 0x40, + 0x20, + 0x20, + 0x10, + 0x10 +}; + +static const uint8_t courB08L1_0x5D_BMP[] = { + 0xE0, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0xE0 +}; + +static const uint8_t courB08L1_0x5E_BMP[] = { + 0x20, + 0x70, + 0xD8 +}; + +static const uint8_t courB08L1_0x5F_BMP[] = { + 0xFC +}; + +static const uint8_t courB08L1_0x60_BMP[] = { + 0x80, + 0x40 +}; + +static const uint8_t courB08L1_0x61_BMP[] = { + 0x70, + 0xD8, + 0x78, + 0xD8, + 0xFC +}; + +static const uint8_t courB08L1_0x62_BMP[] = { + 0xE0, + 0x60, + 0x78, + 0x6C, + 0x6C, + 0x6C, + 0xF8 +}; + +static const uint8_t courB08L1_0x63_BMP[] = { + 0x70, + 0xD8, + 0xC0, + 0xD8, + 0x70 +}; + +static const uint8_t courB08L1_0x64_BMP[] = { + 0x38, + 0x18, + 0x78, + 0xD8, + 0xD8, + 0xD8, + 0x7C +}; + +static const uint8_t courB08L1_0x65_BMP[] = { + 0x70, + 0xD8, + 0xF8, + 0xC0, + 0x78 +}; + +static const uint8_t courB08L1_0x66_BMP[] = { + 0x38, + 0x60, + 0xF8, + 0x60, + 0x60, + 0x60, + 0xF8 +}; + +static const uint8_t courB08L1_0x67_BMP[] = { + 0x6C, + 0xD8, + 0xD8, + 0xD8, + 0x78, + 0x18, + 0xF0 +}; + +static const uint8_t courB08L1_0x68_BMP[] = { + 0xE0, + 0x60, + 0x78, + 0x6C, + 0x6C, + 0x6C, + 0x6C +}; + +static const uint8_t courB08L1_0x69_BMP[] = { + 0x30, + 0x00, + 0xF0, + 0x30, + 0x30, + 0x30, + 0xFC +}; + +static const uint8_t courB08L1_0x6A_BMP[] = { + 0x30, + 0x00, + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xE0 +}; + +static const uint8_t courB08L1_0x6B_BMP[] = { + 0xE0, + 0x60, + 0x6C, + 0x78, + 0x70, + 0x78, + 0x6E +}; + +static const uint8_t courB08L1_0x6C_BMP[] = { + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xFC +}; + +static const uint8_t courB08L1_0x6D_BMP[] = { + 0xF8, + 0x7C, + 0x54, + 0x54, + 0x54 +}; + +static const uint8_t courB08L1_0x6E_BMP[] = { + 0xD8, + 0x6C, + 0x6C, + 0x6C, + 0x6C +}; + +static const uint8_t courB08L1_0x6F_BMP[] = { + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t courB08L1_0x70_BMP[] = { + 0xF8, + 0x6C, + 0x6C, + 0x6C, + 0x78, + 0x60, + 0xF0 +}; + +static const uint8_t courB08L1_0x71_BMP[] = { + 0x6C, + 0xD8, + 0xD8, + 0xD8, + 0x78, + 0x18, + 0x3C +}; + +static const uint8_t courB08L1_0x72_BMP[] = { + 0xDC, + 0x74, + 0x60, + 0x60, + 0xF0 +}; + +static const uint8_t courB08L1_0x73_BMP[] = { + 0x78, + 0xE0, + 0x78, + 0x1C, + 0xF8 +}; + +static const uint8_t courB08L1_0x74_BMP[] = { + 0x60, + 0x60, + 0xF8, + 0x60, + 0x60, + 0x6C, + 0x38 +}; + +static const uint8_t courB08L1_0x75_BMP[] = { + 0xEC, + 0x6C, + 0x6C, + 0x6C, + 0x3E +}; + +static const uint8_t courB08L1_0x76_BMP[] = { + 0xEC, + 0x6C, + 0x38, + 0x38, + 0x10 +}; + +static const uint8_t courB08L1_0x77_BMP[] = { + 0xD6, + 0x54, + 0x7C, + 0x3C, + 0x28 +}; + +static const uint8_t courB08L1_0x78_BMP[] = { + 0xEC, + 0x78, + 0x30, + 0x78, + 0xDC +}; + +static const uint8_t courB08L1_0x79_BMP[] = { + 0xEE, + 0x6C, + 0x6C, + 0x28, + 0x38, + 0x30, + 0xE0 +}; + +static const uint8_t courB08L1_0x7A_BMP[] = { + 0xF8, + 0xB0, + 0x60, + 0xD8, + 0xF8 +}; + +static const uint8_t courB08L1_0x7B_BMP[] = { + 0x30, + 0x60, + 0x60, + 0xC0, + 0x60, + 0x60, + 0x60, + 0x30 +}; + +static const uint8_t courB08L1_0x7C_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t courB08L1_0x7D_BMP[] = { + 0xC0, + 0x60, + 0x60, + 0x30, + 0x60, + 0x60, + 0x60, + 0xC0 +}; + +static const uint8_t courB08L1_0x7E_BMP[] = { + 0x68, + 0xB0 +}; + +static const uint8_t courB08L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t courB08L1_0xA1_BMP[] = { + 0xC0, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t courB08L1_0xA2_BMP[] = { + 0x20, + 0x20, + 0x78, + 0xC8, + 0xC0, + 0x78, + 0x20, + 0x20 +}; + +static const uint8_t courB08L1_0xA3_BMP[] = { + 0x38, + 0x68, + 0x20, + 0xF8, + 0x20, + 0x64, + 0xF8 +}; + +static const uint8_t courB08L1_0xA4_BMP[] = { + 0x88, + 0x70, + 0x50, + 0x70, + 0x88 +}; + +static const uint8_t courB08L1_0xA5_BMP[] = { + 0xCC, + 0x48, + 0xFC, + 0x30, + 0xFC, + 0x30, + 0x78 +}; + +static const uint8_t courB08L1_0xA6_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t courB08L1_0xA7_BMP[] = { + 0x78, + 0x48, + 0x60, + 0x90, + 0x48, + 0x30, + 0x90, + 0xF0 +}; + +static const uint8_t courB08L1_0xA8_BMP[] = { + 0xA0 +}; + +static const uint8_t courB08L1_0xA9_BMP[] = { + 0x30, + 0x48, + 0xB4, + 0xA4, + 0xB4, + 0x48, + 0x30 +}; + +static const uint8_t courB08L1_0xAA_BMP[] = { + 0xE0, + 0x10, + 0xD0, + 0x00, + 0xF0 +}; + +static const uint8_t courB08L1_0xAB_BMP[] = { + 0x36, + 0x6C, + 0xD8, + 0x6C, + 0x36 +}; + +static const uint8_t courB08L1_0xAC_BMP[] = { + 0xF8, + 0x08, + 0x08 +}; + +static const uint8_t courB08L1_0xAD_BMP[] = { + 0xF8 +}; + +static const uint8_t courB08L1_0xAE_BMP[] = { + 0x38, + 0x44, + 0xBA, + 0xB2, + 0xAA, + 0x44, + 0x38 +}; + +static const uint8_t courB08L1_0xAF_BMP[] = { + 0xF0 +}; + +static const uint8_t courB08L1_0xB0_BMP[] = { + 0x60, + 0x90, + 0x60 +}; + +static const uint8_t courB08L1_0xB1_BMP[] = { + 0x20, + 0x20, + 0xF8, + 0x20, + 0x00, + 0xF8 +}; + +static const uint8_t courB08L1_0xB2_BMP[] = { + 0x60, + 0xA0, + 0x40, + 0xE0 +}; + +static const uint8_t courB08L1_0xB3_BMP[] = { + 0xE0, + 0x40, + 0x20, + 0xC0 +}; + +static const uint8_t courB08L1_0xB4_BMP[] = { + 0x40, + 0x80 +}; + +static const uint8_t courB08L1_0xB5_BMP[] = { + 0xEC, + 0x6C, + 0x6C, + 0x6C, + 0x7E, + 0x40, + 0x40 +}; + +static const uint8_t courB08L1_0xB6_BMP[] = { + 0x7C, + 0xA8, + 0xA8, + 0x68, + 0x28, + 0x28, + 0x28, + 0x6C +}; + +static const uint8_t courB08L1_0xB7_BMP[] = { + 0xC0 +}; + +static const uint8_t courB08L1_0xB8_BMP[] = { + 0x40, + 0x20, + 0xC0 +}; + +static const uint8_t courB08L1_0xB9_BMP[] = { + 0xC0, + 0x40, + 0x40, + 0xE0 +}; + +static const uint8_t courB08L1_0xBA_BMP[] = { + 0x60, + 0x90, + 0x60, + 0x00, + 0xF0 +}; + +static const uint8_t courB08L1_0xBB_BMP[] = { + 0xD8, + 0x6C, + 0x36, + 0x6C, + 0xD8 +}; + +static const uint8_t courB08L1_0xBC_BMP[] = { + 0xC0, + 0x44, + 0x48, + 0xF4, + 0x2C, + 0x5E, + 0x04 +}; + +static const uint8_t courB08L1_0xBD_BMP[] = { + 0xC0, + 0x44, + 0x48, + 0xF6, + 0x2A, + 0x44, + 0x0E +}; + +static const uint8_t courB08L1_0xBE_BMP[] = { + 0xE0, + 0x44, + 0x28, + 0xD4, + 0x2C, + 0x5E, + 0x04 +}; + +static const uint8_t courB08L1_0xBF_BMP[] = { + 0x30, + 0x00, + 0x30, + 0x30, + 0x60, + 0xC8, + 0x70 +}; + +static const uint8_t courB08L1_0xC0_BMP[] = { + 0x20, + 0x10, + 0x00, + 0x78, + 0x38, + 0x28, + 0x7C, + 0x6C, + 0xEE +}; + +static const uint8_t courB08L1_0xC1_BMP[] = { + 0x10, + 0x20, + 0x00, + 0x78, + 0x38, + 0x28, + 0x7C, + 0x6C, + 0xEE +}; + +static const uint8_t courB08L1_0xC2_BMP[] = { + 0x10, + 0x28, + 0x00, + 0x78, + 0x38, + 0x28, + 0x7C, + 0x6C, + 0xEE +}; + +static const uint8_t courB08L1_0xC3_BMP[] = { + 0x34, + 0x48, + 0x00, + 0x78, + 0x38, + 0x28, + 0x7C, + 0x6C, + 0xEE +}; + +static const uint8_t courB08L1_0xC4_BMP[] = { + 0x28, + 0x00, + 0x78, + 0x38, + 0x28, + 0x7C, + 0x6C, + 0xEE +}; + +static const uint8_t courB08L1_0xC5_BMP[] = { + 0x30, + 0x48, + 0x30, + 0x78, + 0x38, + 0x28, + 0x7C, + 0x6C, + 0xEE +}; + +static const uint8_t courB08L1_0xC6_BMP[] = { + 0x7E, + 0x3A, + 0x6C, + 0x78, + 0xDA, + 0xDE +}; + +static const uint8_t courB08L1_0xC7_BMP[] = { + 0x78, + 0xD8, + 0xC0, + 0xC0, + 0xD8, + 0x70, + 0x10, + 0x60 +}; + +static const uint8_t courB08L1_0xC8_BMP[] = { + 0x20, + 0x10, + 0x00, + 0xFC, + 0x64, + 0x78, + 0x60, + 0x6C, + 0xFC +}; + +static const uint8_t courB08L1_0xC9_BMP[] = { + 0x10, + 0x20, + 0x00, + 0xFC, + 0x64, + 0x78, + 0x60, + 0x6C, + 0xFC +}; + +static const uint8_t courB08L1_0xCA_BMP[] = { + 0x20, + 0x50, + 0x00, + 0xFC, + 0x64, + 0x78, + 0x60, + 0x6C, + 0xFC +}; + +static const uint8_t courB08L1_0xCB_BMP[] = { + 0x50, + 0x00, + 0xFC, + 0x64, + 0x78, + 0x60, + 0x6C, + 0xFC +}; + +static const uint8_t courB08L1_0xCC_BMP[] = { + 0x40, + 0x20, + 0x00, + 0xF0, + 0x60, + 0x60, + 0x60, + 0x60, + 0xF0 +}; + +static const uint8_t courB08L1_0xCD_BMP[] = { + 0x20, + 0x40, + 0x00, + 0xF0, + 0x60, + 0x60, + 0x60, + 0x60, + 0xF0 +}; + +static const uint8_t courB08L1_0xCE_BMP[] = { + 0x40, + 0xA0, + 0x00, + 0xF0, + 0x60, + 0x60, + 0x60, + 0x60, + 0xF0 +}; + +static const uint8_t courB08L1_0xCF_BMP[] = { + 0xA0, + 0x00, + 0xF0, + 0x60, + 0x60, + 0x60, + 0x60, + 0xF0 +}; + +static const uint8_t courB08L1_0xD0_BMP[] = { + 0xF8, + 0x6C, + 0xF4, + 0x64, + 0x6C, + 0xF8 +}; + +static const uint8_t courB08L1_0xD1_BMP[] = { + 0x34, + 0x48, + 0x00, + 0xEE, + 0x64, + 0x74, + 0x7C, + 0x6C, + 0xEC +}; + +static const uint8_t courB08L1_0xD2_BMP[] = { + 0x40, + 0x20, + 0x00, + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t courB08L1_0xD3_BMP[] = { + 0x20, + 0x40, + 0x00, + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t courB08L1_0xD4_BMP[] = { + 0x20, + 0x50, + 0x00, + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t courB08L1_0xD5_BMP[] = { + 0x68, + 0x90, + 0x00, + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t courB08L1_0xD6_BMP[] = { + 0x50, + 0x00, + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t courB08L1_0xD7_BMP[] = { + 0x88, + 0x50, + 0x20, + 0x50, + 0x88 +}; + +static const uint8_t courB08L1_0xD8_BMP[] = { + 0x3A, + 0x6C, + 0x7C, + 0x6C, + 0x6C, + 0xB8 +}; + +static const uint8_t courB08L1_0xD9_BMP[] = { + 0x20, + 0x10, + 0x00, + 0xEE, + 0x6C, + 0x6C, + 0x6C, + 0x6C, + 0x38 +}; + +static const uint8_t courB08L1_0xDA_BMP[] = { + 0x08, + 0x10, + 0x00, + 0xEE, + 0x6C, + 0x6C, + 0x6C, + 0x6C, + 0x38 +}; + +static const uint8_t courB08L1_0xDB_BMP[] = { + 0x10, + 0x28, + 0x00, + 0xEE, + 0x6C, + 0x6C, + 0x6C, + 0x6C, + 0x38 +}; + +static const uint8_t courB08L1_0xDC_BMP[] = { + 0x28, + 0x00, + 0xEE, + 0x6C, + 0x6C, + 0x6C, + 0x6C, + 0x38 +}; + +static const uint8_t courB08L1_0xDD_BMP[] = { + 0x04, + 0x08, + 0x00, + 0xE6, + 0x66, + 0x3C, + 0x18, + 0x18, + 0x3C +}; + +static const uint8_t courB08L1_0xDE_BMP[] = { + 0xE0, + 0x78, + 0x6C, + 0x6C, + 0x78, + 0xE0 +}; + +static const uint8_t courB08L1_0xDF_BMP[] = { + 0x38, + 0x68, + 0x7C, + 0x66, + 0x66, + 0xEC +}; + +static const uint8_t courB08L1_0xE0_BMP[] = { + 0x20, + 0x10, + 0x00, + 0x70, + 0x98, + 0x78, + 0xD8, + 0xFC +}; + +static const uint8_t courB08L1_0xE1_BMP[] = { + 0x10, + 0x20, + 0x00, + 0x70, + 0x98, + 0x78, + 0xD8, + 0xFC +}; + +static const uint8_t courB08L1_0xE2_BMP[] = { + 0x20, + 0x50, + 0x00, + 0x70, + 0x98, + 0x78, + 0xD8, + 0xFC +}; + +static const uint8_t courB08L1_0xE3_BMP[] = { + 0x68, + 0x90, + 0x00, + 0x70, + 0x98, + 0x78, + 0xD8, + 0xFC +}; + +static const uint8_t courB08L1_0xE4_BMP[] = { + 0x50, + 0x00, + 0x70, + 0x98, + 0x78, + 0xD8, + 0xFC +}; + +static const uint8_t courB08L1_0xE5_BMP[] = { + 0x30, + 0x48, + 0x30, + 0x00, + 0x70, + 0x98, + 0x78, + 0xD8, + 0xFC +}; + +static const uint8_t courB08L1_0xE6_BMP[] = { + 0x6C, + 0xB4, + 0x7C, + 0xB0, + 0xDC +}; + +static const uint8_t courB08L1_0xE7_BMP[] = { + 0x70, + 0xD8, + 0xC0, + 0xD8, + 0x70, + 0x10, + 0x60 +}; + +static const uint8_t courB08L1_0xE8_BMP[] = { + 0x40, + 0x20, + 0x00, + 0x70, + 0xD8, + 0xF8, + 0xC0, + 0x78 +}; + +static const uint8_t courB08L1_0xE9_BMP[] = { + 0x20, + 0x40, + 0x00, + 0x70, + 0xD8, + 0xF8, + 0xC0, + 0x78 +}; + +static const uint8_t courB08L1_0xEA_BMP[] = { + 0x20, + 0x50, + 0x00, + 0x70, + 0xD8, + 0xF8, + 0xC0, + 0x78 +}; + +static const uint8_t courB08L1_0xEB_BMP[] = { + 0x50, + 0x00, + 0x70, + 0xD8, + 0xF8, + 0xC0, + 0x78 +}; + +static const uint8_t courB08L1_0xEC_BMP[] = { + 0x20, + 0x10, + 0x00, + 0x70, + 0x30, + 0x30, + 0x30, + 0xFC +}; + +static const uint8_t courB08L1_0xED_BMP[] = { + 0x10, + 0x20, + 0x00, + 0x70, + 0x30, + 0x30, + 0x30, + 0xFC +}; + +static const uint8_t courB08L1_0xEE_BMP[] = { + 0x20, + 0x50, + 0x00, + 0x70, + 0x30, + 0x30, + 0x30, + 0xFC +}; + +static const uint8_t courB08L1_0xEF_BMP[] = { + 0x50, + 0x00, + 0x70, + 0x30, + 0x30, + 0x30, + 0xFC +}; + +static const uint8_t courB08L1_0xF0_BMP[] = { + 0xD0, + 0x60, + 0xB0, + 0x78, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t courB08L1_0xF1_BMP[] = { + 0x34, + 0x48, + 0x00, + 0xD8, + 0x6C, + 0x6C, + 0x6C, + 0x6E +}; + +static const uint8_t courB08L1_0xF2_BMP[] = { + 0x40, + 0x20, + 0x00, + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t courB08L1_0xF3_BMP[] = { + 0x20, + 0x40, + 0x00, + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t courB08L1_0xF4_BMP[] = { + 0x20, + 0x50, + 0x00, + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t courB08L1_0xF5_BMP[] = { + 0x68, + 0x90, + 0x00, + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t courB08L1_0xF6_BMP[] = { + 0x50, + 0x00, + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t courB08L1_0xF7_BMP[] = { + 0x20, + 0x00, + 0xF8, + 0x00, + 0x20 +}; + +static const uint8_t courB08L1_0xF8_BMP[] = { + 0x08, + 0x70, + 0xD8, + 0xF8, + 0xD8, + 0x70, + 0x80 +}; + +static const uint8_t courB08L1_0xF9_BMP[] = { + 0x20, + 0x10, + 0x00, + 0xEC, + 0x6C, + 0x6C, + 0x6C, + 0x3E +}; + +static const uint8_t courB08L1_0xFA_BMP[] = { + 0x10, + 0x20, + 0x00, + 0xEC, + 0x6C, + 0x6C, + 0x6C, + 0x3E +}; + +static const uint8_t courB08L1_0xFB_BMP[] = { + 0x10, + 0x28, + 0x00, + 0xEC, + 0x6C, + 0x6C, + 0x6C, + 0x3E +}; + +static const uint8_t courB08L1_0xFC_BMP[] = { + 0x28, + 0x00, + 0xEC, + 0x6C, + 0x6C, + 0x6C, + 0x3E +}; + +static const uint8_t courB08L1_0xFD_BMP[] = { + 0x08, + 0x10, + 0x00, + 0xEE, + 0x6C, + 0x6C, + 0x28, + 0x38, + 0x30, + 0xF0 +}; + +static const uint8_t courB08L1_0xFE_BMP[] = { + 0xE0, + 0x60, + 0x78, + 0x6C, + 0x6C, + 0x6C, + 0x78, + 0x60, + 0xF0 +}; + +static const uint8_t courB08L1_0xFF_BMP[] = { + 0x28, + 0x00, + 0xEE, + 0x6C, + 0x6C, + 0x28, + 0x38, + 0x30, + 0xF0 +}; + +static const GFONT_CharInfo FontBMP[] = { + {6, 7, 5, -1, 0, courB08L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {6, 1, 1, 0, 0, courB08L1_0x20_BMP}, + {6, 2, 6, 1, 0, courB08L1_0x21_BMP}, + {6, 3, 3, 1, 3, courB08L1_0x22_BMP}, + {6, 5, 8, 0, -1, courB08L1_0x23_BMP}, + {6, 5, 9, 0, -1, courB08L1_0x24_BMP}, + {6, 5, 7, 0, 0, courB08L1_0x25_BMP}, + {6, 6, 6, -1, 0, courB08L1_0x26_BMP}, + {6, 1, 3, 2, 3, courB08L1_0x27_BMP}, + {6, 3, 8, 1, -1, courB08L1_0x28_BMP}, + {6, 3, 8, 1, -1, courB08L1_0x29_BMP}, + {6, 4, 4, 0, 3, courB08L1_0x2A_BMP}, + {6, 5, 5, 0, 1, courB08L1_0x2B_BMP}, + {6, 3, 3, 1, -2, courB08L1_0x2C_BMP}, + {6, 5, 1, 0, 3, courB08L1_0x2D_BMP}, + {6, 2, 1, 1, 0, courB08L1_0x2E_BMP}, + {6, 4, 8, 1, -1, courB08L1_0x2F_BMP}, + {6, 5, 7, 0, 0, courB08L1_0x30_BMP}, + {6, 6, 7, 0, 0, courB08L1_0x31_BMP}, + {6, 5, 7, 0, 0, courB08L1_0x32_BMP}, + {6, 5, 7, 0, 0, courB08L1_0x33_BMP}, + {6, 6, 7, 0, 0, courB08L1_0x34_BMP}, + {6, 5, 7, 0, 0, courB08L1_0x35_BMP}, + {6, 5, 7, 0, 0, courB08L1_0x36_BMP}, + {6, 5, 7, 0, 0, courB08L1_0x37_BMP}, + {6, 5, 7, 0, 0, courB08L1_0x38_BMP}, + {6, 5, 7, 0, 0, courB08L1_0x39_BMP}, + {6, 2, 4, 1, 0, courB08L1_0x3A_BMP}, + {6, 3, 6, 0, -2, courB08L1_0x3B_BMP}, + {6, 4, 5, 0, 1, courB08L1_0x3C_BMP}, + {6, 4, 3, 0, 2, courB08L1_0x3D_BMP}, + {6, 4, 5, 1, 1, courB08L1_0x3E_BMP}, + {6, 5, 6, 0, 0, courB08L1_0x3F_BMP}, + {6, 6, 8, 0, -1, courB08L1_0x40_BMP}, + {6, 7, 6, -1, 0, courB08L1_0x41_BMP}, + {6, 6, 6, -1, 0, courB08L1_0x42_BMP}, + {6, 5, 6, 0, 0, courB08L1_0x43_BMP}, + {6, 6, 6, -1, 0, courB08L1_0x44_BMP}, + {6, 6, 6, -1, 0, courB08L1_0x45_BMP}, + {6, 6, 6, -1, 0, courB08L1_0x46_BMP}, + {6, 5, 6, 0, 0, courB08L1_0x47_BMP}, + {6, 7, 6, -1, 0, courB08L1_0x48_BMP}, + {6, 4, 6, 0, 0, courB08L1_0x49_BMP}, + {6, 6, 6, -1, 0, courB08L1_0x4A_BMP}, + {6, 7, 6, -1, 0, courB08L1_0x4B_BMP}, + {6, 6, 6, -1, 0, courB08L1_0x4C_BMP}, + {6, 6, 6, -1, 0, courB08L1_0x4D_BMP}, + {6, 7, 6, -1, 0, courB08L1_0x4E_BMP}, + {6, 5, 6, 0, 0, courB08L1_0x4F_BMP}, + {6, 6, 6, -1, 0, courB08L1_0x50_BMP}, + {6, 5, 7, 0, -1, courB08L1_0x51_BMP}, + {6, 7, 6, -1, 0, courB08L1_0x52_BMP}, + {6, 5, 6, 0, 0, courB08L1_0x53_BMP}, + {6, 6, 6, -1, 0, courB08L1_0x54_BMP}, + {6, 7, 6, -1, 0, courB08L1_0x55_BMP}, + {6, 7, 6, -1, 0, courB08L1_0x56_BMP}, + {6, 7, 6, -1, 0, courB08L1_0x57_BMP}, + {6, 6, 6, 0, 0, courB08L1_0x58_BMP}, + {6, 7, 6, -1, 0, courB08L1_0x59_BMP}, + {6, 5, 6, 0, 0, courB08L1_0x5A_BMP}, + {6, 3, 8, 1, -1, courB08L1_0x5B_BMP}, + {6, 4, 8, 0, -1, courB08L1_0x5C_BMP}, + {6, 3, 8, 1, -1, courB08L1_0x5D_BMP}, + {6, 5, 3, 0, 4, courB08L1_0x5E_BMP}, + {6, 6, 1, 0, -2, courB08L1_0x5F_BMP}, + {6, 2, 2, 2, 6, courB08L1_0x60_BMP}, + {6, 6, 5, 0, 0, courB08L1_0x61_BMP}, + {6, 6, 7, -1, 0, courB08L1_0x62_BMP}, + {6, 5, 5, 0, 0, courB08L1_0x63_BMP}, + {6, 6, 7, 0, 0, courB08L1_0x64_BMP}, + {6, 5, 5, 0, 0, courB08L1_0x65_BMP}, + {6, 5, 7, 0, 0, courB08L1_0x66_BMP}, + {6, 6, 7, 0, -2, courB08L1_0x67_BMP}, + {6, 6, 7, -1, 0, courB08L1_0x68_BMP}, + {6, 6, 7, 0, 0, courB08L1_0x69_BMP}, + {6, 4, 9, 0, -2, courB08L1_0x6A_BMP}, + {6, 7, 7, -1, 0, courB08L1_0x6B_BMP}, + {6, 6, 7, 0, 0, courB08L1_0x6C_BMP}, + {6, 6, 5, -1, 0, courB08L1_0x6D_BMP}, + {6, 6, 5, -1, 0, courB08L1_0x6E_BMP}, + {6, 5, 5, 0, 0, courB08L1_0x6F_BMP}, + {6, 6, 7, -1, -2, courB08L1_0x70_BMP}, + {6, 6, 7, 0, -2, courB08L1_0x71_BMP}, + {6, 6, 5, 0, 0, courB08L1_0x72_BMP}, + {6, 6, 5, 0, 0, courB08L1_0x73_BMP}, + {6, 6, 7, 0, 0, courB08L1_0x74_BMP}, + {6, 7, 5, -1, 0, courB08L1_0x75_BMP}, + {6, 6, 5, -1, 0, courB08L1_0x76_BMP}, + {6, 7, 5, -1, 0, courB08L1_0x77_BMP}, + {6, 6, 5, 0, 0, courB08L1_0x78_BMP}, + {6, 7, 7, -1, -2, courB08L1_0x79_BMP}, + {6, 5, 5, 0, 0, courB08L1_0x7A_BMP}, + {6, 4, 8, 1, -1, courB08L1_0x7B_BMP}, + {6, 1, 7, 2, -1, courB08L1_0x7C_BMP}, + {6, 4, 8, 0, -1, courB08L1_0x7D_BMP}, + {6, 5, 2, 0, 3, courB08L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {6, 1, 1, 0, 0, courB08L1_0xA0_BMP}, + {6, 2, 7, 1, -2, courB08L1_0xA1_BMP}, + {6, 5, 8, 0, -1, courB08L1_0xA2_BMP}, + {6, 6, 7, 0, 0, courB08L1_0xA3_BMP}, + {6, 5, 5, 0, 1, courB08L1_0xA4_BMP}, + {6, 6, 7, 0, 0, courB08L1_0xA5_BMP}, + {6, 1, 9, 2, -2, courB08L1_0xA6_BMP}, + {6, 5, 8, 0, -1, courB08L1_0xA7_BMP}, + {6, 3, 1, 1, 5, courB08L1_0xA8_BMP}, + {6, 6, 7, 0, 0, courB08L1_0xA9_BMP}, + {6, 4, 5, 1, 2, courB08L1_0xAA_BMP}, + {6, 7, 5, -1, 0, courB08L1_0xAB_BMP}, + {6, 5, 3, 0, 2, courB08L1_0xAC_BMP}, + {6, 5, 1, 0, 3, courB08L1_0xAD_BMP}, + {6, 7, 7, 0, 0, courB08L1_0xAE_BMP}, + {6, 4, 1, 0, 5, courB08L1_0xAF_BMP}, + {6, 4, 3, 0, 4, courB08L1_0xB0_BMP}, + {6, 5, 6, 0, 0, courB08L1_0xB1_BMP}, + {6, 3, 4, 1, 3, courB08L1_0xB2_BMP}, + {6, 3, 4, 1, 3, courB08L1_0xB3_BMP}, + {6, 2, 2, 2, 5, courB08L1_0xB4_BMP}, + {6, 7, 7, -1, -2, courB08L1_0xB5_BMP}, + {6, 6, 8, 0, -1, courB08L1_0xB6_BMP}, + {6, 2, 1, 1, 3, courB08L1_0xB7_BMP}, + {6, 3, 3, 1, -2, courB08L1_0xB8_BMP}, + {6, 3, 4, 1, 3, courB08L1_0xB9_BMP}, + {6, 4, 5, 1, 2, courB08L1_0xBA_BMP}, + {6, 7, 5, -1, 0, courB08L1_0xBB_BMP}, + {6, 7, 7, -1, 0, courB08L1_0xBC_BMP}, + {6, 7, 7, -1, 0, courB08L1_0xBD_BMP}, + {6, 7, 7, -1, 0, courB08L1_0xBE_BMP}, + {6, 5, 7, 0, -2, courB08L1_0xBF_BMP}, + {6, 7, 9, -1, 0, courB08L1_0xC0_BMP}, + {6, 7, 9, -1, 0, courB08L1_0xC1_BMP}, + {6, 7, 9, -1, 0, courB08L1_0xC2_BMP}, + {6, 7, 9, -1, 0, courB08L1_0xC3_BMP}, + {6, 7, 8, -1, 0, courB08L1_0xC4_BMP}, + {6, 7, 9, -1, 0, courB08L1_0xC5_BMP}, + {6, 7, 6, -1, 0, courB08L1_0xC6_BMP}, + {6, 5, 8, 0, -2, courB08L1_0xC7_BMP}, + {6, 6, 9, -1, 0, courB08L1_0xC8_BMP}, + {6, 6, 9, -1, 0, courB08L1_0xC9_BMP}, + {6, 6, 9, -1, 0, courB08L1_0xCA_BMP}, + {6, 6, 8, -1, 0, courB08L1_0xCB_BMP}, + {6, 4, 9, 0, 0, courB08L1_0xCC_BMP}, + {6, 4, 9, 0, 0, courB08L1_0xCD_BMP}, + {6, 4, 9, 0, 0, courB08L1_0xCE_BMP}, + {6, 4, 8, 0, 0, courB08L1_0xCF_BMP}, + {6, 6, 6, -1, 0, courB08L1_0xD0_BMP}, + {6, 7, 9, -1, 0, courB08L1_0xD1_BMP}, + {6, 5, 9, 0, 0, courB08L1_0xD2_BMP}, + {6, 5, 9, 0, 0, courB08L1_0xD3_BMP}, + {6, 5, 9, 0, 0, courB08L1_0xD4_BMP}, + {6, 5, 9, 0, 0, courB08L1_0xD5_BMP}, + {6, 5, 8, 0, 0, courB08L1_0xD6_BMP}, + {6, 5, 5, 0, 1, courB08L1_0xD7_BMP}, + {6, 7, 6, -1, 0, courB08L1_0xD8_BMP}, + {6, 7, 9, -1, 0, courB08L1_0xD9_BMP}, + {6, 7, 9, -1, 0, courB08L1_0xDA_BMP}, + {6, 7, 9, -1, 0, courB08L1_0xDB_BMP}, + {6, 7, 8, -1, 0, courB08L1_0xDC_BMP}, + {6, 7, 9, -1, 0, courB08L1_0xDD_BMP}, + {6, 6, 6, -1, 0, courB08L1_0xDE_BMP}, + {6, 7, 6, -1, 0, courB08L1_0xDF_BMP}, + {6, 6, 8, 0, 0, courB08L1_0xE0_BMP}, + {6, 6, 8, 0, 0, courB08L1_0xE1_BMP}, + {6, 6, 8, 0, 0, courB08L1_0xE2_BMP}, + {6, 6, 8, 0, 0, courB08L1_0xE3_BMP}, + {6, 6, 7, 0, 0, courB08L1_0xE4_BMP}, + {6, 6, 9, 0, 0, courB08L1_0xE5_BMP}, + {6, 6, 5, -1, 0, courB08L1_0xE6_BMP}, + {6, 5, 7, 0, -2, courB08L1_0xE7_BMP}, + {6, 5, 8, 0, 0, courB08L1_0xE8_BMP}, + {6, 5, 8, 0, 0, courB08L1_0xE9_BMP}, + {6, 5, 8, 0, 0, courB08L1_0xEA_BMP}, + {6, 5, 7, 0, 0, courB08L1_0xEB_BMP}, + {6, 6, 8, 0, 0, courB08L1_0xEC_BMP}, + {6, 6, 8, 0, 0, courB08L1_0xED_BMP}, + {6, 6, 8, 0, 0, courB08L1_0xEE_BMP}, + {6, 6, 7, 0, 0, courB08L1_0xEF_BMP}, + {6, 5, 8, 0, 0, courB08L1_0xF0_BMP}, + {6, 7, 8, -1, 0, courB08L1_0xF1_BMP}, + {6, 5, 8, 0, 0, courB08L1_0xF2_BMP}, + {6, 5, 8, 0, 0, courB08L1_0xF3_BMP}, + {6, 5, 8, 0, 0, courB08L1_0xF4_BMP}, + {6, 5, 8, 0, 0, courB08L1_0xF5_BMP}, + {6, 5, 7, 0, 0, courB08L1_0xF6_BMP}, + {6, 5, 5, 0, 1, courB08L1_0xF7_BMP}, + {6, 5, 7, 0, -1, courB08L1_0xF8_BMP}, + {6, 7, 8, -1, 0, courB08L1_0xF9_BMP}, + {6, 7, 8, -1, 0, courB08L1_0xFA_BMP}, + {6, 7, 8, -1, 0, courB08L1_0xFB_BMP}, + {6, 7, 7, -1, 0, courB08L1_0xFC_BMP}, + {6, 7, 10, -1, -2, courB08L1_0xFD_BMP}, + {6, 6, 9, -1, -2, courB08L1_0xFE_BMP}, + {6, 7, 9, -1, -2, courB08L1_0xFF_BMP} +}; + + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontCour08Bold_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontCour08Bold_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontCour08Bold_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontCour08Bold_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontCour08Bold_GetFontChar, + McuFontCour08Bold_FBBy, + McuFontCour08Bold_GetUnderlineBoxHeight(), + McuFontCour08Bold_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour08Bold_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour08Bold_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour08Bold_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour08Bold_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontCour08Bold. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour08Bold.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour08Bold.h new file mode 100644 index 0000000..fd04a37 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour08Bold.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour08Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour08Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 8 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour08Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour08Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour08Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour08Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour08Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontCour08Bold_Deinit(void); +** Init - void McuFontCour08Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour08Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour08Bold_module McuFontCour08Bold module documentation +** @{ +*/ + + +#ifndef __McuFontCour08Bold_H +#define __McuFontCour08Bold_H + +/* MODULE McuFontCour08Bold. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontCour08Boldconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontCour08Bold_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontCour08Bold_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontCour08Bold_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontCour08Bold_GetLineSpaceHeight() \ + 1 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontCour08Bold_GetUnderlineBoxHeight() \ + 3 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontCour08Bold_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontCour08Bold_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontCour08Bold. */ + +#endif +/* ifndef __McuFontCour08Bold_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour08Normal.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour08Normal.c new file mode 100644 index 0000000..e1064fb --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour08Normal.c @@ -0,0 +1,2370 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour08Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour08Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 8 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour08Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour08Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour08Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour08Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour08Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontCour08Normal_Deinit(void); +** Init - void McuFontCour08Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour08Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour08Normal_module McuFontCour08Normal module documentation +** @{ +*/ + +/* MODULE McuFontCour08Normal. */ + +#include "McuFontCour08Normal.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontCour08Normal_FBBy 11 + +static const uint8_t courR08L1_0x00_BMP[] = { + 0xA8, + 0x00, + 0x88, + 0x00, + 0xA8 +}; + +static const uint8_t courR08L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t courR08L1_0x21_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x00, + 0x80 +}; + +static const uint8_t courR08L1_0x22_BMP[] = { + 0xA0, + 0xA0, + 0xA0 +}; + +static const uint8_t courR08L1_0x23_BMP[] = { + 0x50, + 0x50, + 0xF8, + 0x50, + 0x50, + 0xF8, + 0x50, + 0x50 +}; + +static const uint8_t courR08L1_0x24_BMP[] = { + 0x20, + 0x70, + 0x80, + 0x60, + 0x10, + 0x90, + 0x60, + 0x20 +}; + +static const uint8_t courR08L1_0x25_BMP[] = { + 0xE0, + 0xA4, + 0xC8, + 0x30, + 0x5C, + 0x94, + 0x18 +}; + +static const uint8_t courR08L1_0x26_BMP[] = { + 0x30, + 0x40, + 0x60, + 0x94, + 0x88, + 0x74 +}; + +static const uint8_t courR08L1_0x27_BMP[] = { + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t courR08L1_0x28_BMP[] = { + 0x20, + 0x40, + 0x40, + 0x80, + 0x80, + 0x80, + 0x40, + 0x40, + 0x20 +}; + +static const uint8_t courR08L1_0x29_BMP[] = { + 0x80, + 0x40, + 0x40, + 0x20, + 0x20, + 0x20, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t courR08L1_0x2A_BMP[] = { + 0x20, + 0xD8, + 0x20, + 0x50 +}; + +static const uint8_t courR08L1_0x2B_BMP[] = { + 0x20, + 0x20, + 0xF8, + 0x20, + 0x20 +}; + +static const uint8_t courR08L1_0x2C_BMP[] = { + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t courR08L1_0x2D_BMP[] = { + 0xF0 +}; + +static const uint8_t courR08L1_0x2E_BMP[] = { + 0x80, + 0x80 +}; + +static const uint8_t courR08L1_0x2F_BMP[] = { + 0x04, + 0x08, + 0x10, + 0x10, + 0x20, + 0x20, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t courR08L1_0x30_BMP[] = { + 0x60, + 0x90, + 0x90, + 0x90, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0x31_BMP[] = { + 0x20, + 0xE0, + 0x20, + 0x20, + 0x20, + 0x20, + 0xF0 +}; + +static const uint8_t courR08L1_0x32_BMP[] = { + 0x60, + 0x90, + 0x10, + 0x20, + 0x40, + 0x80, + 0xF0 +}; + +static const uint8_t courR08L1_0x33_BMP[] = { + 0x60, + 0x90, + 0x10, + 0x60, + 0x10, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0x34_BMP[] = { + 0x10, + 0x30, + 0x50, + 0x90, + 0xF8, + 0x10, + 0x10 +}; + +static const uint8_t courR08L1_0x35_BMP[] = { + 0xF0, + 0x80, + 0x80, + 0xE0, + 0x10, + 0x10, + 0xE0 +}; + +static const uint8_t courR08L1_0x36_BMP[] = { + 0x70, + 0x80, + 0x80, + 0xE0, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0x37_BMP[] = { + 0xF0, + 0x90, + 0x10, + 0x20, + 0x20, + 0x40, + 0x40 +}; + +static const uint8_t courR08L1_0x38_BMP[] = { + 0x60, + 0x90, + 0x90, + 0x60, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0x39_BMP[] = { + 0x60, + 0x90, + 0x90, + 0x70, + 0x10, + 0x10, + 0xE0 +}; + +static const uint8_t courR08L1_0x3A_BMP[] = { + 0x80, + 0x80, + 0x00, + 0x80, + 0x80 +}; + +static const uint8_t courR08L1_0x3B_BMP[] = { + 0x40, + 0x40, + 0x00, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t courR08L1_0x3C_BMP[] = { + 0x20, + 0x40, + 0x80, + 0x40, + 0x20 +}; + +static const uint8_t courR08L1_0x3D_BMP[] = { + 0xF0, + 0x00, + 0xF0 +}; + +static const uint8_t courR08L1_0x3E_BMP[] = { + 0x80, + 0x40, + 0x20, + 0x40, + 0x80 +}; + +static const uint8_t courR08L1_0x3F_BMP[] = { + 0x60, + 0x90, + 0x20, + 0x40, + 0x00, + 0x40 +}; + +static const uint8_t courR08L1_0x40_BMP[] = { + 0x38, + 0x44, + 0x9C, + 0xA8, + 0xA8, + 0x9C, + 0x40, + 0x38 +}; + +static const uint8_t courR08L1_0x41_BMP[] = { + 0x70, + 0x28, + 0x48, + 0x78, + 0x48, + 0xCC +}; + +static const uint8_t courR08L1_0x42_BMP[] = { + 0xF0, + 0x48, + 0x70, + 0x48, + 0x48, + 0xF0 +}; + +static const uint8_t courR08L1_0x43_BMP[] = { + 0x60, + 0x90, + 0x80, + 0x80, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0x44_BMP[] = { + 0xF0, + 0x48, + 0x48, + 0x48, + 0x48, + 0xF0 +}; + +static const uint8_t courR08L1_0x45_BMP[] = { + 0xF8, + 0x48, + 0x70, + 0x40, + 0x48, + 0xF8 +}; + +static const uint8_t courR08L1_0x46_BMP[] = { + 0xF8, + 0x48, + 0x70, + 0x50, + 0x40, + 0xE0 +}; + +static const uint8_t courR08L1_0x47_BMP[] = { + 0x60, + 0x90, + 0x80, + 0xB0, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0x48_BMP[] = { + 0xCC, + 0x48, + 0x78, + 0x48, + 0x48, + 0xCC +}; + +static const uint8_t courR08L1_0x49_BMP[] = { + 0xF8, + 0x20, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR08L1_0x4A_BMP[] = { + 0x78, + 0x10, + 0x10, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0x4B_BMP[] = { + 0xD8, + 0x50, + 0x60, + 0x50, + 0x48, + 0xE4 +}; + +static const uint8_t courR08L1_0x4C_BMP[] = { + 0xE0, + 0x40, + 0x40, + 0x40, + 0x48, + 0xF8 +}; + +static const uint8_t courR08L1_0x4D_BMP[] = { + 0x88, + 0xD8, + 0xA8, + 0xA8, + 0x88, + 0xD8 +}; + +static const uint8_t courR08L1_0x4E_BMP[] = { + 0xDC, + 0x48, + 0x68, + 0x58, + 0x48, + 0xC8 +}; + +static const uint8_t courR08L1_0x4F_BMP[] = { + 0x60, + 0x90, + 0x90, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0x50_BMP[] = { + 0xF0, + 0x48, + 0x48, + 0x70, + 0x40, + 0xE0 +}; + +static const uint8_t courR08L1_0x51_BMP[] = { + 0x60, + 0x90, + 0x90, + 0x90, + 0x90, + 0x60, + 0x70 +}; + +static const uint8_t courR08L1_0x52_BMP[] = { + 0xF0, + 0x48, + 0x48, + 0x70, + 0x48, + 0xE4 +}; + +static const uint8_t courR08L1_0x53_BMP[] = { + 0x70, + 0x80, + 0x60, + 0x10, + 0x90, + 0xE0 +}; + +static const uint8_t courR08L1_0x54_BMP[] = { + 0xF8, + 0xA8, + 0x20, + 0x20, + 0x20, + 0x70 +}; + +static const uint8_t courR08L1_0x55_BMP[] = { + 0xCC, + 0x48, + 0x48, + 0x48, + 0x48, + 0x30 +}; + +static const uint8_t courR08L1_0x56_BMP[] = { + 0xDC, + 0x88, + 0x50, + 0x50, + 0x50, + 0x20 +}; + +static const uint8_t courR08L1_0x57_BMP[] = { + 0xDC, + 0x88, + 0xA8, + 0xA8, + 0x50, + 0x50 +}; + +static const uint8_t courR08L1_0x58_BMP[] = { + 0xD8, + 0x50, + 0x20, + 0x20, + 0x50, + 0xD8 +}; + +static const uint8_t courR08L1_0x59_BMP[] = { + 0xD8, + 0x88, + 0x50, + 0x20, + 0x20, + 0x70 +}; + +static const uint8_t courR08L1_0x5A_BMP[] = { + 0xF0, + 0x90, + 0x20, + 0x40, + 0x90, + 0xF0 +}; + +static const uint8_t courR08L1_0x5B_BMP[] = { + 0xC0, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0xC0 +}; + +static const uint8_t courR08L1_0x5C_BMP[] = { + 0x80, + 0x80, + 0x40, + 0x40, + 0x20, + 0x20, + 0x10, + 0x10, + 0x08 +}; + +static const uint8_t courR08L1_0x5D_BMP[] = { + 0xC0, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0xC0 +}; + +static const uint8_t courR08L1_0x5E_BMP[] = { + 0x20, + 0x50, + 0x88 +}; + +static const uint8_t courR08L1_0x5F_BMP[] = { + 0xFC +}; + +static const uint8_t courR08L1_0x60_BMP[] = { + 0x80, + 0x40 +}; + +static const uint8_t courR08L1_0x61_BMP[] = { + 0x60, + 0x10, + 0x70, + 0x90, + 0x68 +}; + +static const uint8_t courR08L1_0x62_BMP[] = { + 0xC0, + 0x40, + 0x70, + 0x48, + 0x48, + 0x48, + 0xF0 +}; + +static const uint8_t courR08L1_0x63_BMP[] = { + 0x60, + 0x90, + 0x80, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0x64_BMP[] = { + 0x30, + 0x10, + 0x70, + 0x90, + 0x90, + 0x90, + 0x68 +}; + +static const uint8_t courR08L1_0x65_BMP[] = { + 0x60, + 0x90, + 0xE0, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0x66_BMP[] = { + 0x30, + 0x40, + 0xF0, + 0x40, + 0x40, + 0x40, + 0xF0 +}; + +static const uint8_t courR08L1_0x67_BMP[] = { + 0x68, + 0x90, + 0x90, + 0x90, + 0x70, + 0x10, + 0xE0 +}; + +static const uint8_t courR08L1_0x68_BMP[] = { + 0xC0, + 0x40, + 0x70, + 0x48, + 0x48, + 0x48, + 0xEC +}; + +static const uint8_t courR08L1_0x69_BMP[] = { + 0x20, + 0x00, + 0x60, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR08L1_0x6A_BMP[] = { + 0x20, + 0x00, + 0xE0, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xC0 +}; + +static const uint8_t courR08L1_0x6B_BMP[] = { + 0xC0, + 0x40, + 0x58, + 0x50, + 0x60, + 0x50, + 0xD8 +}; + +static const uint8_t courR08L1_0x6C_BMP[] = { + 0x60, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR08L1_0x6D_BMP[] = { + 0xD0, + 0xA8, + 0xA8, + 0xA8, + 0xAC +}; + +static const uint8_t courR08L1_0x6E_BMP[] = { + 0xB0, + 0x48, + 0x48, + 0x48, + 0xEC +}; + +static const uint8_t courR08L1_0x6F_BMP[] = { + 0x60, + 0x90, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0x70_BMP[] = { + 0xB0, + 0x48, + 0x48, + 0x48, + 0x70, + 0x40, + 0xF0 +}; + +static const uint8_t courR08L1_0x71_BMP[] = { + 0x68, + 0x90, + 0x90, + 0x90, + 0x70, + 0x10, + 0x38 +}; + +static const uint8_t courR08L1_0x72_BMP[] = { + 0xB8, + 0x40, + 0x40, + 0x40, + 0xF0 +}; + +static const uint8_t courR08L1_0x73_BMP[] = { + 0x70, + 0x80, + 0x60, + 0x10, + 0xE0 +}; + +static const uint8_t courR08L1_0x74_BMP[] = { + 0x40, + 0x40, + 0xF0, + 0x40, + 0x40, + 0x48, + 0x30 +}; + +static const uint8_t courR08L1_0x75_BMP[] = { + 0xD8, + 0x48, + 0x48, + 0x48, + 0x34 +}; + +static const uint8_t courR08L1_0x76_BMP[] = { + 0xCC, + 0x44, + 0x28, + 0x28, + 0x10 +}; + +static const uint8_t courR08L1_0x77_BMP[] = { + 0xAC, + 0xA8, + 0xA8, + 0x50, + 0x50 +}; + +static const uint8_t courR08L1_0x78_BMP[] = { + 0xD8, + 0x50, + 0x20, + 0x50, + 0xD8 +}; + +static const uint8_t courR08L1_0x79_BMP[] = { + 0xD8, + 0x48, + 0x48, + 0x48, + 0x30, + 0x20, + 0xC0 +}; + +static const uint8_t courR08L1_0x7A_BMP[] = { + 0xF0, + 0x20, + 0x40, + 0x90, + 0xF0 +}; + +static const uint8_t courR08L1_0x7B_BMP[] = { + 0x20, + 0x40, + 0x40, + 0x40, + 0x80, + 0x40, + 0x40, + 0x40, + 0x20 +}; + +static const uint8_t courR08L1_0x7C_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t courR08L1_0x7D_BMP[] = { + 0x80, + 0x40, + 0x40, + 0x40, + 0x20, + 0x40, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t courR08L1_0x7E_BMP[] = { + 0x50, + 0xA0 +}; + +static const uint8_t courR08L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t courR08L1_0xA1_BMP[] = { + 0x80, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t courR08L1_0xA2_BMP[] = { + 0x20, + 0x20, + 0x70, + 0x80, + 0x80, + 0x70, + 0x20, + 0x20 +}; + +static const uint8_t courR08L1_0xA3_BMP[] = { + 0x38, + 0x40, + 0xF8, + 0x20, + 0x20, + 0x44, + 0xFC +}; + +static const uint8_t courR08L1_0xA4_BMP[] = { + 0x88, + 0x70, + 0x50, + 0x70, + 0x88 +}; + +static const uint8_t courR08L1_0xA5_BMP[] = { + 0x88, + 0x50, + 0xF8, + 0x20, + 0xF8, + 0x20, + 0x70 +}; + +static const uint8_t courR08L1_0xA6_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x00, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t courR08L1_0xA7_BMP[] = { + 0x70, + 0x80, + 0x60, + 0x90, + 0x90, + 0x60, + 0x10, + 0xE0 +}; + +static const uint8_t courR08L1_0xA8_BMP[] = { + 0xA0 +}; + +static const uint8_t courR08L1_0xA9_BMP[] = { + 0x30, + 0x48, + 0xB4, + 0xA4, + 0xB4, + 0x48, + 0x30 +}; + +static const uint8_t courR08L1_0xAA_BMP[] = { + 0xE0, + 0x10, + 0xD0, + 0x00, + 0xF0 +}; + +static const uint8_t courR08L1_0xAB_BMP[] = { + 0x6C, + 0xD8, + 0x6C +}; + +static const uint8_t courR08L1_0xAC_BMP[] = { + 0xF8, + 0x08, + 0x08 +}; + +static const uint8_t courR08L1_0xAD_BMP[] = { + 0xF0 +}; + +static const uint8_t courR08L1_0xAE_BMP[] = { + 0x30, + 0x48, + 0xBC, + 0xB4, + 0xAC, + 0x48, + 0x30 +}; + +static const uint8_t courR08L1_0xAF_BMP[] = { + 0xF0 +}; + +static const uint8_t courR08L1_0xB0_BMP[] = { + 0x60, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0xB1_BMP[] = { + 0x20, + 0x20, + 0xF8, + 0x20, + 0x00, + 0xF8 +}; + +static const uint8_t courR08L1_0xB2_BMP[] = { + 0x60, + 0xA0, + 0x40, + 0xE0 +}; + +static const uint8_t courR08L1_0xB3_BMP[] = { + 0xE0, + 0x40, + 0x20, + 0xC0 +}; + +static const uint8_t courR08L1_0xB4_BMP[] = { + 0x40, + 0x80 +}; + +static const uint8_t courR08L1_0xB5_BMP[] = { + 0xD8, + 0x48, + 0x48, + 0x48, + 0x74, + 0x40, + 0x40 +}; + +static const uint8_t courR08L1_0xB6_BMP[] = { + 0x7C, + 0xA8, + 0xA8, + 0x68, + 0x28, + 0x28, + 0x28, + 0x6C +}; + +static const uint8_t courR08L1_0xB7_BMP[] = { + 0x80, + 0x80 +}; + +static const uint8_t courR08L1_0xB8_BMP[] = { + 0x40, + 0x20, + 0xC0 +}; + +static const uint8_t courR08L1_0xB9_BMP[] = { + 0xC0, + 0x40, + 0x40, + 0xE0 +}; + +static const uint8_t courR08L1_0xBA_BMP[] = { + 0x60, + 0x90, + 0x60, + 0x00, + 0xF0 +}; + +static const uint8_t courR08L1_0xBB_BMP[] = { + 0xD8, + 0x6C, + 0xD8 +}; + +static const uint8_t courR08L1_0xBC_BMP[] = { + 0xC0, + 0x44, + 0x48, + 0xF4, + 0x2C, + 0x5C, + 0x84 +}; + +static const uint8_t courR08L1_0xBD_BMP[] = { + 0xC0, + 0x44, + 0x48, + 0xFC, + 0x34, + 0x48, + 0x9C +}; + +static const uint8_t courR08L1_0xBE_BMP[] = { + 0xE0, + 0x44, + 0x28, + 0xD4, + 0x2C, + 0x5C, + 0x84 +}; + +static const uint8_t courR08L1_0xBF_BMP[] = { + 0x20, + 0x00, + 0x20, + 0x20, + 0x40, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0xC0_BMP[] = { + 0x20, + 0x10, + 0x00, + 0x70, + 0x28, + 0x48, + 0x78, + 0x48, + 0xCC +}; + +static const uint8_t courR08L1_0xC1_BMP[] = { + 0x10, + 0x20, + 0x00, + 0x70, + 0x28, + 0x48, + 0x78, + 0x48, + 0xCC +}; + +static const uint8_t courR08L1_0xC2_BMP[] = { + 0x20, + 0x50, + 0x00, + 0x70, + 0x28, + 0x48, + 0x78, + 0x48, + 0xCC +}; + +static const uint8_t courR08L1_0xC3_BMP[] = { + 0x28, + 0x50, + 0x00, + 0x70, + 0x28, + 0x48, + 0x78, + 0x48, + 0xCC +}; + +static const uint8_t courR08L1_0xC4_BMP[] = { + 0x50, + 0x00, + 0x70, + 0x28, + 0x48, + 0x78, + 0x48, + 0xCC +}; + +static const uint8_t courR08L1_0xC5_BMP[] = { + 0x10, + 0x28, + 0x10, + 0x70, + 0x28, + 0x48, + 0x78, + 0x48, + 0xCC +}; + +static const uint8_t courR08L1_0xC6_BMP[] = { + 0x7C, + 0x30, + 0x5C, + 0x70, + 0x90, + 0x9C +}; + +static const uint8_t courR08L1_0xC7_BMP[] = { + 0x60, + 0x90, + 0x80, + 0x80, + 0x90, + 0x60, + 0x20, + 0xC0 +}; + +static const uint8_t courR08L1_0xC8_BMP[] = { + 0x20, + 0x10, + 0x00, + 0xF8, + 0x48, + 0x70, + 0x40, + 0x48, + 0xF8 +}; + +static const uint8_t courR08L1_0xC9_BMP[] = { + 0x10, + 0x20, + 0x00, + 0xF8, + 0x48, + 0x70, + 0x40, + 0x48, + 0xF8 +}; + +static const uint8_t courR08L1_0xCA_BMP[] = { + 0x20, + 0x50, + 0x00, + 0xF8, + 0x48, + 0x70, + 0x40, + 0x48, + 0xF8 +}; + +static const uint8_t courR08L1_0xCB_BMP[] = { + 0x50, + 0x00, + 0xF8, + 0x48, + 0x70, + 0x40, + 0x48, + 0xF8 +}; + +static const uint8_t courR08L1_0xCC_BMP[] = { + 0x40, + 0x20, + 0x00, + 0xF8, + 0x20, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR08L1_0xCD_BMP[] = { + 0x10, + 0x20, + 0x00, + 0xF8, + 0x20, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR08L1_0xCE_BMP[] = { + 0x20, + 0x50, + 0x00, + 0xF8, + 0x20, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR08L1_0xCF_BMP[] = { + 0x50, + 0x00, + 0xF8, + 0x20, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR08L1_0xD0_BMP[] = { + 0xF0, + 0x48, + 0xE8, + 0x48, + 0x48, + 0xF0 +}; + +static const uint8_t courR08L1_0xD1_BMP[] = { + 0x28, + 0x50, + 0x00, + 0xDC, + 0x48, + 0x68, + 0x58, + 0x48, + 0xC8 +}; + +static const uint8_t courR08L1_0xD2_BMP[] = { + 0x40, + 0x20, + 0x00, + 0x60, + 0x90, + 0x90, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0xD3_BMP[] = { + 0x20, + 0x40, + 0x00, + 0x60, + 0x90, + 0x90, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0xD4_BMP[] = { + 0x20, + 0x50, + 0x00, + 0x60, + 0x90, + 0x90, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0xD5_BMP[] = { + 0x50, + 0xA0, + 0x00, + 0x60, + 0x90, + 0x90, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0xD6_BMP[] = { + 0xA0, + 0x00, + 0x60, + 0x90, + 0x90, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0xD7_BMP[] = { + 0x88, + 0x50, + 0x20, + 0x50, + 0x88 +}; + +static const uint8_t courR08L1_0xD8_BMP[] = { + 0x34, + 0x48, + 0x58, + 0x68, + 0x48, + 0xB0 +}; + +static const uint8_t courR08L1_0xD9_BMP[] = { + 0x20, + 0x10, + 0x00, + 0xCC, + 0x48, + 0x48, + 0x48, + 0x48, + 0x30 +}; + +static const uint8_t courR08L1_0xDA_BMP[] = { + 0x10, + 0x20, + 0x00, + 0xCC, + 0x48, + 0x48, + 0x48, + 0x48, + 0x30 +}; + +static const uint8_t courR08L1_0xDB_BMP[] = { + 0x10, + 0x28, + 0x00, + 0xCC, + 0x48, + 0x48, + 0x48, + 0x48, + 0x30 +}; + +static const uint8_t courR08L1_0xDC_BMP[] = { + 0x50, + 0x00, + 0xCC, + 0x48, + 0x48, + 0x48, + 0x48, + 0x30 +}; + +static const uint8_t courR08L1_0xDD_BMP[] = { + 0x10, + 0x20, + 0x00, + 0xD8, + 0x88, + 0x50, + 0x20, + 0x20, + 0x70 +}; + +static const uint8_t courR08L1_0xDE_BMP[] = { + 0xC0, + 0x70, + 0x48, + 0x70, + 0x40, + 0xE0 +}; + +static const uint8_t courR08L1_0xDF_BMP[] = { + 0x30, + 0x48, + 0x58, + 0x44, + 0x54, + 0xC8 +}; + +static const uint8_t courR08L1_0xE0_BMP[] = { + 0x40, + 0x20, + 0x00, + 0x60, + 0x10, + 0x70, + 0x90, + 0x68 +}; + +static const uint8_t courR08L1_0xE1_BMP[] = { + 0x10, + 0x20, + 0x00, + 0x60, + 0x10, + 0x70, + 0x90, + 0x68 +}; + +static const uint8_t courR08L1_0xE2_BMP[] = { + 0x20, + 0x50, + 0x00, + 0x60, + 0x10, + 0x70, + 0x90, + 0x68 +}; + +static const uint8_t courR08L1_0xE3_BMP[] = { + 0x50, + 0xA0, + 0x00, + 0x60, + 0x10, + 0x70, + 0x90, + 0x68 +}; + +static const uint8_t courR08L1_0xE4_BMP[] = { + 0x50, + 0x00, + 0x60, + 0x10, + 0x70, + 0x90, + 0x68 +}; + +static const uint8_t courR08L1_0xE5_BMP[] = { + 0x20, + 0x50, + 0x20, + 0x00, + 0x60, + 0x10, + 0x70, + 0x90, + 0x68 +}; + +static const uint8_t courR08L1_0xE6_BMP[] = { + 0x6C, + 0x94, + 0x7C, + 0x90, + 0xEC +}; + +static const uint8_t courR08L1_0xE7_BMP[] = { + 0x60, + 0x90, + 0x80, + 0x90, + 0x60, + 0x20, + 0xC0 +}; + +static const uint8_t courR08L1_0xE8_BMP[] = { + 0x40, + 0x20, + 0x00, + 0x60, + 0x90, + 0xF0, + 0x80, + 0x70 +}; + +static const uint8_t courR08L1_0xE9_BMP[] = { + 0x20, + 0x40, + 0x00, + 0x60, + 0x90, + 0xF0, + 0x80, + 0x70 +}; + +static const uint8_t courR08L1_0xEA_BMP[] = { + 0x40, + 0xA0, + 0x00, + 0x60, + 0x90, + 0xF0, + 0x80, + 0x70 +}; + +static const uint8_t courR08L1_0xEB_BMP[] = { + 0xA0, + 0x00, + 0x60, + 0x90, + 0xF0, + 0x80, + 0x70 +}; + +static const uint8_t courR08L1_0xEC_BMP[] = { + 0x40, + 0x20, + 0x00, + 0x60, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR08L1_0xED_BMP[] = { + 0x10, + 0x20, + 0x00, + 0x60, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR08L1_0xEE_BMP[] = { + 0x20, + 0x50, + 0x00, + 0x60, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR08L1_0xEF_BMP[] = { + 0x50, + 0x00, + 0x60, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR08L1_0xF0_BMP[] = { + 0xD0, + 0x60, + 0xA0, + 0x70, + 0x90, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0xF1_BMP[] = { + 0x28, + 0x50, + 0x00, + 0xB0, + 0x48, + 0x48, + 0x48, + 0xEC +}; + +static const uint8_t courR08L1_0xF2_BMP[] = { + 0x40, + 0x20, + 0x00, + 0x60, + 0x90, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0xF3_BMP[] = { + 0x10, + 0x20, + 0x00, + 0x60, + 0x90, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0xF4_BMP[] = { + 0x40, + 0xA0, + 0x00, + 0x60, + 0x90, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0xF5_BMP[] = { + 0x50, + 0xA0, + 0x00, + 0x60, + 0x90, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0xF6_BMP[] = { + 0xA0, + 0x00, + 0x60, + 0x90, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t courR08L1_0xF7_BMP[] = { + 0x20, + 0x00, + 0xF8, + 0x00, + 0x20 +}; + +static const uint8_t courR08L1_0xF8_BMP[] = { + 0x04, + 0x38, + 0x58, + 0x68, + 0x48, + 0xB0 +}; + +static const uint8_t courR08L1_0xF9_BMP[] = { + 0x20, + 0x10, + 0x00, + 0xD8, + 0x48, + 0x48, + 0x48, + 0x34 +}; + +static const uint8_t courR08L1_0xFA_BMP[] = { + 0x10, + 0x20, + 0x00, + 0xD8, + 0x48, + 0x48, + 0x48, + 0x34 +}; + +static const uint8_t courR08L1_0xFB_BMP[] = { + 0x20, + 0x50, + 0x00, + 0xD8, + 0x48, + 0x48, + 0x48, + 0x34 +}; + +static const uint8_t courR08L1_0xFC_BMP[] = { + 0x50, + 0x00, + 0xD8, + 0x48, + 0x48, + 0x48, + 0x34 +}; + +static const uint8_t courR08L1_0xFD_BMP[] = { + 0x10, + 0x20, + 0x00, + 0xD8, + 0x48, + 0x48, + 0x48, + 0x30, + 0x20, + 0xC0 +}; + +static const uint8_t courR08L1_0xFE_BMP[] = { + 0xC0, + 0x40, + 0x70, + 0x48, + 0x48, + 0x48, + 0x70, + 0x40, + 0xE0 +}; + +static const uint8_t courR08L1_0xFF_BMP[] = { + 0x50, + 0x00, + 0xD8, + 0x48, + 0x48, + 0x48, + 0x30, + 0x20, + 0xC0 +}; + +static const GFONT_CharInfo FontBMP[] = { + {6, 5, 5, 0, 0, courR08L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {6, 1, 1, 0, 0, courR08L1_0x20_BMP}, + {6, 1, 7, 2, 0, courR08L1_0x21_BMP}, + {6, 3, 3, 1, 4, courR08L1_0x22_BMP}, + {6, 5, 8, 1, -1, courR08L1_0x23_BMP}, + {6, 4, 8, 1, -1, courR08L1_0x24_BMP}, + {6, 6, 7, 0, 0, courR08L1_0x25_BMP}, + {6, 6, 6, 0, 0, courR08L1_0x26_BMP}, + {6, 1, 3, 2, 4, courR08L1_0x27_BMP}, + {6, 3, 9, 2, -2, courR08L1_0x28_BMP}, + {6, 3, 9, 1, -2, courR08L1_0x29_BMP}, + {6, 5, 4, 0, 3, courR08L1_0x2A_BMP}, + {6, 5, 5, 0, 1, courR08L1_0x2B_BMP}, + {6, 2, 3, 1, -2, courR08L1_0x2C_BMP}, + {6, 4, 1, 1, 3, courR08L1_0x2D_BMP}, + {6, 1, 2, 2, 0, courR08L1_0x2E_BMP}, + {6, 6, 9, 0, -1, courR08L1_0x2F_BMP}, + {6, 4, 7, 1, 0, courR08L1_0x30_BMP}, + {6, 4, 7, 1, 0, courR08L1_0x31_BMP}, + {6, 4, 7, 1, 0, courR08L1_0x32_BMP}, + {6, 4, 7, 1, 0, courR08L1_0x33_BMP}, + {6, 5, 7, 0, 0, courR08L1_0x34_BMP}, + {6, 4, 7, 1, 0, courR08L1_0x35_BMP}, + {6, 4, 7, 1, 0, courR08L1_0x36_BMP}, + {6, 4, 7, 1, 0, courR08L1_0x37_BMP}, + {6, 4, 7, 1, 0, courR08L1_0x38_BMP}, + {6, 4, 7, 1, 0, courR08L1_0x39_BMP}, + {6, 1, 5, 2, 0, courR08L1_0x3A_BMP}, + {6, 2, 6, 1, -2, courR08L1_0x3B_BMP}, + {6, 3, 5, 1, 1, courR08L1_0x3C_BMP}, + {6, 4, 3, 1, 2, courR08L1_0x3D_BMP}, + {6, 3, 5, 2, 1, courR08L1_0x3E_BMP}, + {6, 4, 6, 1, 0, courR08L1_0x3F_BMP}, + {6, 6, 8, 0, -1, courR08L1_0x40_BMP}, + {6, 6, 6, 0, 0, courR08L1_0x41_BMP}, + {6, 5, 6, 0, 0, courR08L1_0x42_BMP}, + {6, 4, 6, 1, 0, courR08L1_0x43_BMP}, + {6, 5, 6, 0, 0, courR08L1_0x44_BMP}, + {6, 5, 6, 0, 0, courR08L1_0x45_BMP}, + {6, 5, 6, 0, 0, courR08L1_0x46_BMP}, + {6, 4, 6, 1, 0, courR08L1_0x47_BMP}, + {6, 6, 6, 0, 0, courR08L1_0x48_BMP}, + {6, 5, 6, 1, 0, courR08L1_0x49_BMP}, + {6, 5, 6, 1, 0, courR08L1_0x4A_BMP}, + {6, 6, 6, 0, 0, courR08L1_0x4B_BMP}, + {6, 5, 6, 1, 0, courR08L1_0x4C_BMP}, + {6, 5, 6, 1, 0, courR08L1_0x4D_BMP}, + {6, 6, 6, 0, 0, courR08L1_0x4E_BMP}, + {6, 4, 6, 1, 0, courR08L1_0x4F_BMP}, + {6, 5, 6, 1, 0, courR08L1_0x50_BMP}, + {6, 4, 7, 1, -1, courR08L1_0x51_BMP}, + {6, 6, 6, 0, 0, courR08L1_0x52_BMP}, + {6, 4, 6, 1, 0, courR08L1_0x53_BMP}, + {6, 5, 6, 0, 0, courR08L1_0x54_BMP}, + {6, 6, 6, 0, 0, courR08L1_0x55_BMP}, + {6, 6, 6, 0, 0, courR08L1_0x56_BMP}, + {6, 6, 6, 0, 0, courR08L1_0x57_BMP}, + {6, 5, 6, 1, 0, courR08L1_0x58_BMP}, + {6, 5, 6, 1, 0, courR08L1_0x59_BMP}, + {6, 4, 6, 1, 0, courR08L1_0x5A_BMP}, + {6, 2, 9, 2, -2, courR08L1_0x5B_BMP}, + {6, 5, 9, 1, -1, courR08L1_0x5C_BMP}, + {6, 2, 9, 2, -2, courR08L1_0x5D_BMP}, + {6, 5, 3, 1, 4, courR08L1_0x5E_BMP}, + {6, 6, 1, 0, -2, courR08L1_0x5F_BMP}, + {6, 2, 2, 1, 6, courR08L1_0x60_BMP}, + {6, 5, 5, 0, 0, courR08L1_0x61_BMP}, + {6, 5, 7, 0, 0, courR08L1_0x62_BMP}, + {6, 4, 5, 1, 0, courR08L1_0x63_BMP}, + {6, 5, 7, 1, 0, courR08L1_0x64_BMP}, + {6, 4, 5, 1, 0, courR08L1_0x65_BMP}, + {6, 4, 7, 1, 0, courR08L1_0x66_BMP}, + {6, 5, 7, 1, -2, courR08L1_0x67_BMP}, + {6, 6, 7, 0, 0, courR08L1_0x68_BMP}, + {6, 5, 7, 1, 0, courR08L1_0x69_BMP}, + {6, 3, 9, 1, -2, courR08L1_0x6A_BMP}, + {6, 5, 7, 0, 0, courR08L1_0x6B_BMP}, + {6, 5, 7, 1, 0, courR08L1_0x6C_BMP}, + {6, 6, 5, 0, 0, courR08L1_0x6D_BMP}, + {6, 6, 5, 0, 0, courR08L1_0x6E_BMP}, + {6, 4, 5, 1, 0, courR08L1_0x6F_BMP}, + {6, 5, 7, 0, -2, courR08L1_0x70_BMP}, + {6, 5, 7, 1, -2, courR08L1_0x71_BMP}, + {6, 5, 5, 1, 0, courR08L1_0x72_BMP}, + {6, 4, 5, 1, 0, courR08L1_0x73_BMP}, + {6, 5, 7, 1, 0, courR08L1_0x74_BMP}, + {6, 6, 5, 0, 0, courR08L1_0x75_BMP}, + {6, 6, 5, 0, 0, courR08L1_0x76_BMP}, + {6, 6, 5, 0, 0, courR08L1_0x77_BMP}, + {6, 5, 5, 0, 0, courR08L1_0x78_BMP}, + {6, 5, 7, 0, -2, courR08L1_0x79_BMP}, + {6, 4, 5, 1, 0, courR08L1_0x7A_BMP}, + {6, 3, 9, 2, -2, courR08L1_0x7B_BMP}, + {6, 1, 9, 2, -2, courR08L1_0x7C_BMP}, + {6, 3, 9, 2, -2, courR08L1_0x7D_BMP}, + {6, 4, 2, 1, 3, courR08L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {6, 1, 1, 0, 0, courR08L1_0xA0_BMP}, + {6, 1, 7, 2, -2, courR08L1_0xA1_BMP}, + {6, 4, 8, 1, -1, courR08L1_0xA2_BMP}, + {6, 6, 7, 0, 0, courR08L1_0xA3_BMP}, + {6, 5, 5, 0, 1, courR08L1_0xA4_BMP}, + {6, 5, 7, 0, 0, courR08L1_0xA5_BMP}, + {6, 1, 9, 2, -2, courR08L1_0xA6_BMP}, + {6, 4, 8, 1, -1, courR08L1_0xA7_BMP}, + {6, 3, 1, 2, 5, courR08L1_0xA8_BMP}, + {6, 6, 7, 0, 0, courR08L1_0xA9_BMP}, + {6, 4, 5, 1, 1, courR08L1_0xAA_BMP}, + {6, 6, 3, 0, 1, courR08L1_0xAB_BMP}, + {6, 5, 3, 0, 2, courR08L1_0xAC_BMP}, + {6, 4, 1, 1, 3, courR08L1_0xAD_BMP}, + {6, 6, 7, 0, 0, courR08L1_0xAE_BMP}, + {6, 4, 1, 1, 5, courR08L1_0xAF_BMP}, + {6, 4, 3, 1, 4, courR08L1_0xB0_BMP}, + {6, 5, 6, 0, 0, courR08L1_0xB1_BMP}, + {6, 3, 4, 2, 3, courR08L1_0xB2_BMP}, + {6, 3, 4, 2, 3, courR08L1_0xB3_BMP}, + {6, 2, 2, 2, 5, courR08L1_0xB4_BMP}, + {6, 6, 7, 0, -2, courR08L1_0xB5_BMP}, + {6, 6, 8, 0, -1, courR08L1_0xB6_BMP}, + {6, 1, 2, 2, 2, courR08L1_0xB7_BMP}, + {6, 3, 3, 1, -2, courR08L1_0xB8_BMP}, + {6, 3, 4, 2, 3, courR08L1_0xB9_BMP}, + {6, 4, 5, 1, 1, courR08L1_0xBA_BMP}, + {6, 6, 3, 1, 1, courR08L1_0xBB_BMP}, + {6, 6, 7, 0, 0, courR08L1_0xBC_BMP}, + {6, 6, 7, 0, 0, courR08L1_0xBD_BMP}, + {6, 6, 7, 0, 0, courR08L1_0xBE_BMP}, + {6, 4, 7, 0, -2, courR08L1_0xBF_BMP}, + {6, 6, 9, 0, 0, courR08L1_0xC0_BMP}, + {6, 6, 9, 0, 0, courR08L1_0xC1_BMP}, + {6, 6, 9, 0, 0, courR08L1_0xC2_BMP}, + {6, 6, 9, 0, 0, courR08L1_0xC3_BMP}, + {6, 6, 8, 0, 0, courR08L1_0xC4_BMP}, + {6, 6, 9, 0, 0, courR08L1_0xC5_BMP}, + {6, 6, 6, 0, 0, courR08L1_0xC6_BMP}, + {6, 4, 8, 1, -2, courR08L1_0xC7_BMP}, + {6, 5, 9, 0, 0, courR08L1_0xC8_BMP}, + {6, 5, 9, 0, 0, courR08L1_0xC9_BMP}, + {6, 5, 9, 0, 0, courR08L1_0xCA_BMP}, + {6, 5, 8, 0, 0, courR08L1_0xCB_BMP}, + {6, 5, 9, 0, 0, courR08L1_0xCC_BMP}, + {6, 5, 9, 0, 0, courR08L1_0xCD_BMP}, + {6, 5, 9, 0, 0, courR08L1_0xCE_BMP}, + {6, 5, 8, 0, 0, courR08L1_0xCF_BMP}, + {6, 5, 6, 0, 0, courR08L1_0xD0_BMP}, + {6, 6, 9, 0, 0, courR08L1_0xD1_BMP}, + {6, 4, 9, 1, 0, courR08L1_0xD2_BMP}, + {6, 4, 9, 1, 0, courR08L1_0xD3_BMP}, + {6, 4, 9, 1, 0, courR08L1_0xD4_BMP}, + {6, 4, 9, 1, 0, courR08L1_0xD5_BMP}, + {6, 4, 8, 1, 0, courR08L1_0xD6_BMP}, + {6, 5, 5, 0, 1, courR08L1_0xD7_BMP}, + {6, 6, 6, 0, 0, courR08L1_0xD8_BMP}, + {6, 6, 9, 0, 0, courR08L1_0xD9_BMP}, + {6, 6, 9, 0, 0, courR08L1_0xDA_BMP}, + {6, 6, 9, 0, 0, courR08L1_0xDB_BMP}, + {6, 6, 8, 0, 0, courR08L1_0xDC_BMP}, + {6, 5, 9, 0, 0, courR08L1_0xDD_BMP}, + {6, 5, 6, 0, 0, courR08L1_0xDE_BMP}, + {6, 6, 6, 0, 0, courR08L1_0xDF_BMP}, + {6, 5, 8, 0, 0, courR08L1_0xE0_BMP}, + {6, 5, 8, 0, 0, courR08L1_0xE1_BMP}, + {6, 5, 8, 0, 0, courR08L1_0xE2_BMP}, + {6, 5, 8, 0, 0, courR08L1_0xE3_BMP}, + {6, 5, 7, 0, 0, courR08L1_0xE4_BMP}, + {6, 5, 9, 0, 0, courR08L1_0xE5_BMP}, + {6, 6, 5, 0, 0, courR08L1_0xE6_BMP}, + {6, 4, 7, 1, -2, courR08L1_0xE7_BMP}, + {6, 4, 8, 1, 0, courR08L1_0xE8_BMP}, + {6, 4, 8, 1, 0, courR08L1_0xE9_BMP}, + {6, 4, 8, 1, 0, courR08L1_0xEA_BMP}, + {6, 4, 7, 1, 0, courR08L1_0xEB_BMP}, + {6, 5, 8, 0, 0, courR08L1_0xEC_BMP}, + {6, 5, 8, 0, 0, courR08L1_0xED_BMP}, + {6, 5, 8, 0, 0, courR08L1_0xEE_BMP}, + {6, 5, 7, 0, 0, courR08L1_0xEF_BMP}, + {6, 4, 8, 1, 0, courR08L1_0xF0_BMP}, + {6, 6, 8, 0, 0, courR08L1_0xF1_BMP}, + {6, 4, 8, 1, 0, courR08L1_0xF2_BMP}, + {6, 4, 8, 1, 0, courR08L1_0xF3_BMP}, + {6, 4, 8, 1, 0, courR08L1_0xF4_BMP}, + {6, 4, 8, 1, 0, courR08L1_0xF5_BMP}, + {6, 4, 7, 1, 0, courR08L1_0xF6_BMP}, + {6, 5, 5, 0, 1, courR08L1_0xF7_BMP}, + {6, 6, 6, 0, 0, courR08L1_0xF8_BMP}, + {6, 6, 8, 0, 0, courR08L1_0xF9_BMP}, + {6, 6, 8, 0, 0, courR08L1_0xFA_BMP}, + {6, 6, 8, 0, 0, courR08L1_0xFB_BMP}, + {6, 6, 7, 0, 0, courR08L1_0xFC_BMP}, + {6, 5, 10, 0, -2, courR08L1_0xFD_BMP}, + {6, 5, 9, 0, -2, courR08L1_0xFE_BMP}, + {6, 5, 9, 0, -2, courR08L1_0xFF_BMP} +}; + + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontCour08Normal_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontCour08Normal_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontCour08Normal_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontCour08Normal_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontCour08Normal_GetFontChar, + McuFontCour08Normal_FBBy, + McuFontCour08Normal_GetUnderlineBoxHeight(), + McuFontCour08Normal_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour08Normal_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour08Normal_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour08Normal_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour08Normal_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontCour08Normal. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour08Normal.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour08Normal.h new file mode 100644 index 0000000..88e2db7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour08Normal.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour08Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour08Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 8 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour08Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour08Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour08Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour08Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour08Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontCour08Normal_Deinit(void); +** Init - void McuFontCour08Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour08Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour08Normal_module McuFontCour08Normal module documentation +** @{ +*/ + + +#ifndef __McuFontCour08Normal_H +#define __McuFontCour08Normal_H + +/* MODULE McuFontCour08Normal. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontCour08Normalconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontCour08Normal_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontCour08Normal_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontCour08Normal_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontCour08Normal_GetLineSpaceHeight() \ + 1 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontCour08Normal_GetUnderlineBoxHeight() \ + 3 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontCour08Normal_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontCour08Normal_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontCour08Normal. */ + +#endif +/* ifndef __McuFontCour08Normal_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour10Bold.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour10Bold.c new file mode 100644 index 0000000..bf1b256 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour10Bold.c @@ -0,0 +1,2831 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour10Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour10Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 10 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour10Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour10Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour10Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour10Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour10Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontCour10Bold_Deinit(void); +** Init - void McuFontCour10Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour10Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour10Bold_module McuFontCour10Bold module documentation +** @{ +*/ + +/* MODULE McuFontCour10Bold. */ + +#include "McuFontCour10Bold.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontCour10Bold_FBBy 14 + +static const uint8_t courB10L1_0x00_BMP[] = { + 0xAA, 0x80, + 0x00, 0x00, + 0x80, 0x80, + 0x00, 0x00, + 0x80, 0x80, + 0x00, 0x00, + 0x80, 0x80, + 0x00, 0x00, + 0xAA, 0x80 +}; + +static const uint8_t courB10L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t courB10L1_0x21_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x80, + 0x00, + 0xC0, + 0xC0 +}; + +static const uint8_t courB10L1_0x22_BMP[] = { + 0xD8, + 0xD8, + 0xD8, + 0x48 +}; + +static const uint8_t courB10L1_0x23_BMP[] = { + 0x28, + 0x28, + 0x28, + 0xFE, + 0x28, + 0x28, + 0xFE, + 0x28, + 0x28, + 0x28, + 0x28 +}; + +static const uint8_t courB10L1_0x24_BMP[] = { + 0x30, + 0x30, + 0x7C, + 0xCC, + 0xC0, + 0xF0, + 0x3C, + 0x0C, + 0xCC, + 0xF8, + 0x30, + 0x30 +}; + +static const uint8_t courB10L1_0x25_BMP[] = { + 0x60, + 0x90, + 0x92, + 0x6C, + 0x10, + 0x60, + 0x98, + 0x24, + 0x24, + 0x18 +}; + +static const uint8_t courB10L1_0x26_BMP[] = { + 0x38, + 0x60, + 0x60, + 0x30, + 0x7A, + 0xCC, + 0xCC, + 0x76 +}; + +static const uint8_t courB10L1_0x27_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0x40 +}; + +static const uint8_t courB10L1_0x28_BMP[] = { + 0x30, + 0x60, + 0x60, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x60, + 0x60, + 0x30 +}; + +static const uint8_t courB10L1_0x29_BMP[] = { + 0xC0, + 0x60, + 0x60, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x60, + 0x60, + 0xC0 +}; + +static const uint8_t courB10L1_0x2A_BMP[] = { + 0x20, + 0xA8, + 0xF8, + 0x70, + 0xD8 +}; + +static const uint8_t courB10L1_0x2B_BMP[] = { + 0x10, + 0x10, + 0x10, + 0xFE, + 0x10, + 0x10, + 0x10 +}; + +static const uint8_t courB10L1_0x2C_BMP[] = { + 0x60, + 0x60, + 0xC0, + 0x80 +}; + +static const uint8_t courB10L1_0x2D_BMP[] = { + 0xFC +}; + +static const uint8_t courB10L1_0x2E_BMP[] = { + 0xC0, + 0xC0 +}; + +static const uint8_t courB10L1_0x2F_BMP[] = { + 0x06, + 0x06, + 0x0C, + 0x0C, + 0x18, + 0x18, + 0x30, + 0x30, + 0x60, + 0x60, + 0xC0, + 0xC0 +}; + +static const uint8_t courB10L1_0x30_BMP[] = { + 0x38, + 0x6C, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0x6C, + 0x38 +}; + +static const uint8_t courB10L1_0x31_BMP[] = { + 0x30, + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xFC +}; + +static const uint8_t courB10L1_0x32_BMP[] = { + 0x78, + 0xCC, + 0xCC, + 0x0C, + 0x0C, + 0x18, + 0x30, + 0x60, + 0xC0, + 0xFC +}; + +static const uint8_t courB10L1_0x33_BMP[] = { + 0x78, + 0xCC, + 0x0C, + 0x0C, + 0x38, + 0x0C, + 0x0C, + 0x0C, + 0xCC, + 0x78 +}; + +static const uint8_t courB10L1_0x34_BMP[] = { + 0x0C, + 0x1C, + 0x3C, + 0x2C, + 0x4C, + 0xCC, + 0x8C, + 0xFE, + 0x0C, + 0x1E +}; + +static const uint8_t courB10L1_0x35_BMP[] = { + 0xFC, + 0xC0, + 0xC0, + 0xF8, + 0xCC, + 0x0C, + 0x0C, + 0x0C, + 0xCC, + 0x78 +}; + +static const uint8_t courB10L1_0x36_BMP[] = { + 0x3C, + 0x60, + 0xC0, + 0xD8, + 0xEC, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0x78 +}; + +static const uint8_t courB10L1_0x37_BMP[] = { + 0xFC, + 0x8C, + 0x0C, + 0x18, + 0x18, + 0x18, + 0x18, + 0x30, + 0x30, + 0x30 +}; + +static const uint8_t courB10L1_0x38_BMP[] = { + 0x78, + 0xCC, + 0xCC, + 0xCC, + 0x78, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0x78 +}; + +static const uint8_t courB10L1_0x39_BMP[] = { + 0x78, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0x7C, + 0x0C, + 0x18, + 0xF0 +}; + +static const uint8_t courB10L1_0x3A_BMP[] = { + 0xC0, + 0xC0, + 0x00, + 0x00, + 0x00, + 0xC0, + 0xC0 +}; + +static const uint8_t courB10L1_0x3B_BMP[] = { + 0x60, + 0x60, + 0x00, + 0x00, + 0x00, + 0x60, + 0x60, + 0xC0, + 0x80 +}; + +static const uint8_t courB10L1_0x3C_BMP[] = { + 0x07, + 0x1C, + 0x70, + 0xC0, + 0x70, + 0x1C, + 0x07 +}; + +static const uint8_t courB10L1_0x3D_BMP[] = { + 0xFE, + 0x00, + 0x00, + 0xFE +}; + +static const uint8_t courB10L1_0x3E_BMP[] = { + 0xE0, + 0x38, + 0x0E, + 0x03, + 0x0E, + 0x38, + 0xE0 +}; + +static const uint8_t courB10L1_0x3F_BMP[] = { + 0xF8, + 0xCC, + 0x8C, + 0x0C, + 0x38, + 0x30, + 0x00, + 0x30, + 0x30 +}; + +static const uint8_t courB10L1_0x40_BMP[] = { + 0x78, + 0xC4, + 0x9C, + 0xB4, + 0xA4, + 0xB4, + 0x9E, + 0xC0, + 0x78 +}; + +static const uint8_t courB10L1_0x41_BMP[] = { + 0x7C, 0x00, + 0x1C, 0x00, + 0x36, 0x00, + 0x36, 0x00, + 0x22, 0x00, + 0x63, 0x00, + 0x7F, 0x00, + 0x63, 0x00, + 0xF7, 0x80 +}; + +static const uint8_t courB10L1_0x42_BMP[] = { + 0xFE, + 0x63, + 0x63, + 0x63, + 0x7E, + 0x63, + 0x63, + 0x63, + 0xFE +}; + +static const uint8_t courB10L1_0x43_BMP[] = { + 0x3A, + 0x66, + 0xC6, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x66, + 0x3C +}; + +static const uint8_t courB10L1_0x44_BMP[] = { + 0xFC, + 0x66, + 0x63, + 0x63, + 0x63, + 0x63, + 0x63, + 0x66, + 0xFC +}; + +static const uint8_t courB10L1_0x45_BMP[] = { + 0xFF, + 0x63, + 0x63, + 0x68, + 0x78, + 0x68, + 0x63, + 0x63, + 0xFF +}; + +static const uint8_t courB10L1_0x46_BMP[] = { + 0xFF, + 0x63, + 0x63, + 0x68, + 0x78, + 0x68, + 0x60, + 0x60, + 0xF8 +}; + +static const uint8_t courB10L1_0x47_BMP[] = { + 0x3D, 0x00, + 0x67, 0x00, + 0xC3, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xCF, 0x80, + 0xC3, 0x00, + 0x63, 0x00, + 0x3F, 0x00 +}; + +static const uint8_t courB10L1_0x48_BMP[] = { + 0xF7, 0x80, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x7F, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0xF7, 0x80 +}; + +static const uint8_t courB10L1_0x49_BMP[] = { + 0xFC, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xFC +}; + +static const uint8_t courB10L1_0x4A_BMP[] = { + 0x1F, 0x80, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0xC6, 0x00, + 0xC6, 0x00, + 0xC6, 0x00, + 0x7C, 0x00 +}; + +static const uint8_t courB10L1_0x4B_BMP[] = { + 0xF7, 0x00, + 0x66, 0x00, + 0x6C, 0x00, + 0x78, 0x00, + 0x7C, 0x00, + 0x66, 0x00, + 0x66, 0x00, + 0x63, 0x00, + 0xF3, 0x80 +}; + +static const uint8_t courB10L1_0x4C_BMP[] = { + 0xF8, + 0x60, + 0x60, + 0x60, + 0x60, + 0x63, + 0x63, + 0x63, + 0xFF +}; + +static const uint8_t courB10L1_0x4D_BMP[] = { + 0xE3, 0x80, + 0x63, 0x00, + 0x77, 0x00, + 0x77, 0x00, + 0x6B, 0x00, + 0x6B, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0xF7, 0x80 +}; + +static const uint8_t courB10L1_0x4E_BMP[] = { + 0xE7, 0x80, + 0x63, 0x00, + 0x73, 0x00, + 0x73, 0x00, + 0x6B, 0x00, + 0x6B, 0x00, + 0x67, 0x00, + 0x67, 0x00, + 0xF3, 0x00 +}; + +static const uint8_t courB10L1_0x4F_BMP[] = { + 0x3C, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t courB10L1_0x50_BMP[] = { + 0xFE, + 0x63, + 0x63, + 0x63, + 0x66, + 0x7C, + 0x60, + 0x60, + 0xF8 +}; + +static const uint8_t courB10L1_0x51_BMP[] = { + 0x3C, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C, + 0x19, + 0x6E +}; + +static const uint8_t courB10L1_0x52_BMP[] = { + 0xFE, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x66, 0x00, + 0x7C, 0x00, + 0x66, 0x00, + 0x63, 0x00, + 0xF3, 0x80 +}; + +static const uint8_t courB10L1_0x53_BMP[] = { + 0x7A, + 0xCE, + 0xC6, + 0xE0, + 0x7C, + 0x0E, + 0xC6, + 0xE6, + 0xBC +}; + +static const uint8_t courB10L1_0x54_BMP[] = { + 0xFF, + 0xDB, + 0xDB, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x3C +}; + +static const uint8_t courB10L1_0x55_BMP[] = { + 0xF7, 0x80, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courB10L1_0x56_BMP[] = { + 0xF7, 0x80, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x36, 0x00, + 0x36, 0x00, + 0x36, 0x00, + 0x1C, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t courB10L1_0x57_BMP[] = { + 0xF7, 0x80, + 0x63, 0x00, + 0x6B, 0x00, + 0x6B, 0x00, + 0x6B, 0x00, + 0x77, 0x00, + 0x77, 0x00, + 0x63, 0x00, + 0x63, 0x00 +}; + +static const uint8_t courB10L1_0x58_BMP[] = { + 0xE7, + 0x66, + 0x66, + 0x3C, + 0x18, + 0x3C, + 0x66, + 0x66, + 0xE7 +}; + +static const uint8_t courB10L1_0x59_BMP[] = { + 0xF3, 0xC0, + 0x61, 0x80, + 0x33, 0x00, + 0x33, 0x00, + 0x1E, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x3F, 0x00 +}; + +static const uint8_t courB10L1_0x5A_BMP[] = { + 0xFE, + 0xC6, + 0xCC, + 0x18, + 0x18, + 0x30, + 0x66, + 0xC6, + 0xFE +}; + +static const uint8_t courB10L1_0x5B_BMP[] = { + 0xF0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xF0 +}; + +static const uint8_t courB10L1_0x5C_BMP[] = { + 0xC0, + 0xC0, + 0x60, + 0x60, + 0x30, + 0x30, + 0x18, + 0x18, + 0x0C, + 0x0C, + 0x06, + 0x06 +}; + +static const uint8_t courB10L1_0x5D_BMP[] = { + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xF0 +}; + +static const uint8_t courB10L1_0x5E_BMP[] = { + 0x20, + 0x70, + 0xD8, + 0x88 +}; + +static const uint8_t courB10L1_0x5F_BMP[] = { + 0xFF, 0x80 +}; + +static const uint8_t courB10L1_0x60_BMP[] = { + 0xC0, + 0x60 +}; + +static const uint8_t courB10L1_0x61_BMP[] = { + 0x7C, + 0x06, + 0x06, + 0x7E, + 0xC6, + 0xCE, + 0x77 +}; + +static const uint8_t courB10L1_0x62_BMP[] = { + 0xE0, + 0x60, + 0x60, + 0x6E, + 0x73, + 0x63, + 0x63, + 0x63, + 0x73, + 0xEE +}; + +static const uint8_t courB10L1_0x63_BMP[] = { + 0x3D, + 0x67, + 0xC3, + 0xC0, + 0xC0, + 0x63, + 0x3E +}; + +static const uint8_t courB10L1_0x64_BMP[] = { + 0x0E, + 0x06, + 0x06, + 0x76, + 0xCE, + 0xC6, + 0xC6, + 0xC6, + 0xCE, + 0x77 +}; + +static const uint8_t courB10L1_0x65_BMP[] = { + 0x3C, + 0x66, + 0xC3, + 0xFF, + 0xC0, + 0x67, + 0x3E +}; + +static const uint8_t courB10L1_0x66_BMP[] = { + 0x1E, + 0x30, + 0x30, + 0xFC, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xFC +}; + +static const uint8_t courB10L1_0x67_BMP[] = { + 0x77, + 0xCE, + 0xC6, + 0xC6, + 0xC6, + 0xCE, + 0x76, + 0x06, + 0x06, + 0x7C +}; + +static const uint8_t courB10L1_0x68_BMP[] = { + 0xE0, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0x6E, 0x00, + 0x73, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0xF7, 0x80 +}; + +static const uint8_t courB10L1_0x69_BMP[] = { + 0x30, + 0x30, + 0x00, + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xFC +}; + +static const uint8_t courB10L1_0x6A_BMP[] = { + 0x18, + 0x18, + 0x00, + 0x78, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xF0 +}; + +static const uint8_t courB10L1_0x6B_BMP[] = { + 0xE0, + 0x60, + 0x60, + 0x67, + 0x6C, + 0x78, + 0x78, + 0x6C, + 0x66, + 0xE7 +}; + +static const uint8_t courB10L1_0x6C_BMP[] = { + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xFC +}; + +static const uint8_t courB10L1_0x6D_BMP[] = { + 0xDF, 0x00, + 0x6D, 0x80, + 0x6D, 0x80, + 0x6D, 0x80, + 0x6D, 0x80, + 0x6D, 0x80, + 0xED, 0x80 +}; + +static const uint8_t courB10L1_0x6E_BMP[] = { + 0xEE, 0x00, + 0x73, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0xF7, 0x80 +}; + +static const uint8_t courB10L1_0x6F_BMP[] = { + 0x3C, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t courB10L1_0x70_BMP[] = { + 0xEE, + 0x73, + 0x63, + 0x63, + 0x63, + 0x73, + 0x6E, + 0x60, + 0x60, + 0xF0 +}; + +static const uint8_t courB10L1_0x71_BMP[] = { + 0x77, + 0xCE, + 0xC6, + 0xC6, + 0xC6, + 0xCE, + 0x76, + 0x06, + 0x06, + 0x0F +}; + +static const uint8_t courB10L1_0x72_BMP[] = { + 0xEE, + 0x70, + 0x60, + 0x60, + 0x60, + 0x60, + 0xFC +}; + +static const uint8_t courB10L1_0x73_BMP[] = { + 0x7E, + 0xC6, + 0xC0, + 0x7C, + 0x06, + 0xC6, + 0xFC +}; + +static const uint8_t courB10L1_0x74_BMP[] = { + 0x60, + 0x60, + 0xFC, + 0x60, + 0x60, + 0x60, + 0x60, + 0x66, + 0x3C +}; + +static const uint8_t courB10L1_0x75_BMP[] = { + 0xE7, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x67, 0x00, + 0x3B, 0x80 +}; + +static const uint8_t courB10L1_0x76_BMP[] = { + 0xF7, 0x80, + 0x63, 0x00, + 0x63, 0x00, + 0x36, 0x00, + 0x36, 0x00, + 0x1C, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t courB10L1_0x77_BMP[] = { + 0xE1, 0xC0, + 0x6D, 0x80, + 0x6D, 0x80, + 0x6D, 0x80, + 0x2D, 0x00, + 0x33, 0x00, + 0x33, 0x00 +}; + +static const uint8_t courB10L1_0x78_BMP[] = { + 0xE7, + 0x66, + 0x3C, + 0x18, + 0x3C, + 0x66, + 0xE7 +}; + +static const uint8_t courB10L1_0x79_BMP[] = { + 0xE3, 0x80, + 0x63, 0x00, + 0x63, 0x00, + 0x36, 0x00, + 0x36, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x7C, 0x00 +}; + +static const uint8_t courB10L1_0x7A_BMP[] = { + 0xFC, + 0x8C, + 0x18, + 0x30, + 0x60, + 0xC4, + 0xFC +}; + +static const uint8_t courB10L1_0x7B_BMP[] = { + 0x30, + 0x60, + 0x60, + 0x60, + 0x60, + 0xC0, + 0x60, + 0x60, + 0x60, + 0x60, + 0x30 +}; + +static const uint8_t courB10L1_0x7C_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t courB10L1_0x7D_BMP[] = { + 0xC0, + 0x60, + 0x60, + 0x60, + 0x60, + 0x30, + 0x60, + 0x60, + 0x60, + 0x60, + 0xC0 +}; + +static const uint8_t courB10L1_0x7E_BMP[] = { + 0x64, + 0xFC, + 0x98 +}; + +static const uint8_t courB10L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t courB10L1_0xA1_BMP[] = { + 0xC0, + 0xC0, + 0x00, + 0x80, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t courB10L1_0xA2_BMP[] = { + 0x30, + 0x30, + 0x7C, + 0xCC, + 0xC0, + 0xC0, + 0xCC, + 0x78, + 0x30, + 0x30 +}; + +static const uint8_t courB10L1_0xA3_BMP[] = { + 0x3C, + 0x66, + 0x60, + 0x60, + 0xF8, + 0x60, + 0x60, + 0x66, + 0xFC +}; + +static const uint8_t courB10L1_0xA4_BMP[] = { + 0xC6, + 0x7C, + 0xC6, + 0xC6, + 0x7C, + 0xC6 +}; + +static const uint8_t courB10L1_0xA5_BMP[] = { + 0xF3, 0xC0, + 0x61, 0x80, + 0x33, 0x00, + 0x1E, 0x00, + 0x3F, 0x00, + 0x0C, 0x00, + 0x3F, 0x00, + 0x0C, 0x00, + 0x3F, 0x00 +}; + +static const uint8_t courB10L1_0xA6_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t courB10L1_0xA7_BMP[] = { + 0x3E, + 0x62, + 0x60, + 0xF0, + 0x8C, + 0xE3, + 0x39, + 0x0F, + 0x06, + 0x46, + 0x7C +}; + +static const uint8_t courB10L1_0xA8_BMP[] = { + 0x90, + 0x90 +}; + +static const uint8_t courB10L1_0xA9_BMP[] = { + 0x1C, 0x00, + 0x63, 0x00, + 0xCD, 0x80, + 0xD1, 0x80, + 0xD1, 0x80, + 0xCD, 0x80, + 0x63, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t courB10L1_0xAA_BMP[] = { + 0x70, + 0x18, + 0x78, + 0xD8, + 0x68, + 0x00, + 0xF8 +}; + +static const uint8_t courB10L1_0xAB_BMP[] = { + 0x36, + 0x6C, + 0xD8, + 0x6C, + 0x36 +}; + +static const uint8_t courB10L1_0xAC_BMP[] = { + 0xFE, + 0x02, + 0x02 +}; + +static const uint8_t courB10L1_0xAD_BMP[] = { + 0xFC +}; + +static const uint8_t courB10L1_0xAE_BMP[] = { + 0x3E, 0x00, + 0x63, 0x00, + 0xD9, 0x80, + 0xD5, 0x80, + 0xD9, 0x80, + 0xD5, 0x80, + 0x63, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courB10L1_0xAF_BMP[] = { + 0xF0 +}; + +static const uint8_t courB10L1_0xB0_BMP[] = { + 0x60, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t courB10L1_0xB1_BMP[] = { + 0x10, + 0x10, + 0xFE, + 0x10, + 0x10, + 0x00, + 0xFE +}; + +static const uint8_t courB10L1_0xB2_BMP[] = { + 0x70, + 0x98, + 0x18, + 0x30, + 0x60, + 0xF8 +}; + +static const uint8_t courB10L1_0xB3_BMP[] = { + 0x70, + 0x98, + 0x30, + 0x18, + 0x98, + 0x70 +}; + +static const uint8_t courB10L1_0xB4_BMP[] = { + 0x60, + 0xC0 +}; + +static const uint8_t courB10L1_0xB5_BMP[] = { + 0xE7, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x67, 0x00, + 0x7B, 0x80, + 0x60, 0x00, + 0x60, 0x00, + 0x60, 0x00 +}; + +static const uint8_t courB10L1_0xB6_BMP[] = { + 0x7E, + 0xD4, + 0x94, + 0x94, + 0xD4, + 0x74, + 0x14, + 0x14, + 0x14, + 0x14, + 0x7E +}; + +static const uint8_t courB10L1_0xB7_BMP[] = { + 0xC0, + 0xC0 +}; + +static const uint8_t courB10L1_0xB8_BMP[] = { + 0x40, + 0x60, + 0x20, + 0xE0 +}; + +static const uint8_t courB10L1_0xB9_BMP[] = { + 0x60, + 0xE0, + 0x60, + 0x60, + 0x60, + 0xF0 +}; + +static const uint8_t courB10L1_0xBA_BMP[] = { + 0x70, + 0xD8, + 0x88, + 0xD8, + 0x70, + 0x00, + 0xF8 +}; + +static const uint8_t courB10L1_0xBB_BMP[] = { + 0xD8, + 0x6C, + 0x36, + 0x6C, + 0xD8 +}; + +static const uint8_t courB10L1_0xBC_BMP[] = { + 0x60, 0x00, + 0xE0, 0x80, + 0x61, 0x00, + 0x62, 0x00, + 0x65, 0x00, + 0xFB, 0x00, + 0x17, 0x00, + 0x2B, 0x00, + 0x4F, 0x80, + 0x83, 0x00 +}; + +static const uint8_t courB10L1_0xBD_BMP[] = { + 0x60, 0x00, + 0xE0, 0x80, + 0x61, 0x00, + 0x62, 0x00, + 0x67, 0x00, + 0xFD, 0x80, + 0x11, 0x80, + 0x23, 0x00, + 0x46, 0x00, + 0x0F, 0x80 +}; + +static const uint8_t courB10L1_0xBE_BMP[] = { + 0x70, 0x00, + 0x98, 0x40, + 0x30, 0x80, + 0x19, 0x00, + 0x9A, 0x80, + 0x75, 0x80, + 0x0B, 0x80, + 0x15, 0x80, + 0x27, 0xC0, + 0x41, 0x80 +}; + +static const uint8_t courB10L1_0xBF_BMP[] = { + 0x30, + 0x30, + 0x00, + 0x30, + 0x70, + 0xC0, + 0xC4, + 0xCC, + 0x7C +}; + +static const uint8_t courB10L1_0xC0_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x7C, 0x00, + 0x1C, 0x00, + 0x36, 0x00, + 0x36, 0x00, + 0x22, 0x00, + 0x63, 0x00, + 0x7F, 0x00, + 0x63, 0x00, + 0xF7, 0x80 +}; + +static const uint8_t courB10L1_0xC1_BMP[] = { + 0x0C, 0x00, + 0x18, 0x00, + 0x00, 0x00, + 0x7C, 0x00, + 0x1C, 0x00, + 0x36, 0x00, + 0x36, 0x00, + 0x22, 0x00, + 0x63, 0x00, + 0x7F, 0x00, + 0x63, 0x00, + 0xF7, 0x80 +}; + +static const uint8_t courB10L1_0xC2_BMP[] = { + 0x1C, 0x00, + 0x36, 0x00, + 0x00, 0x00, + 0x7C, 0x00, + 0x1C, 0x00, + 0x36, 0x00, + 0x36, 0x00, + 0x22, 0x00, + 0x63, 0x00, + 0x7F, 0x00, + 0x63, 0x00, + 0xF7, 0x80 +}; + +static const uint8_t courB10L1_0xC3_BMP[] = { + 0x1A, 0x00, + 0x2C, 0x00, + 0x00, 0x00, + 0x7C, 0x00, + 0x1C, 0x00, + 0x36, 0x00, + 0x36, 0x00, + 0x22, 0x00, + 0x63, 0x00, + 0x7F, 0x00, + 0x63, 0x00, + 0xF7, 0x80 +}; + +static const uint8_t courB10L1_0xC4_BMP[] = { + 0x24, 0x00, + 0x24, 0x00, + 0x00, 0x00, + 0x7C, 0x00, + 0x1C, 0x00, + 0x36, 0x00, + 0x36, 0x00, + 0x22, 0x00, + 0x63, 0x00, + 0x7F, 0x00, + 0x63, 0x00, + 0xF7, 0x80 +}; + +static const uint8_t courB10L1_0xC5_BMP[] = { + 0x18, 0x00, + 0x24, 0x00, + 0x18, 0x00, + 0x7E, 0x00, + 0x1C, 0x00, + 0x36, 0x00, + 0x36, 0x00, + 0x22, 0x00, + 0x63, 0x00, + 0x7F, 0x00, + 0x63, 0x00, + 0xF7, 0x80 +}; + +static const uint8_t courB10L1_0xC6_BMP[] = { + 0x3F, 0x80, + 0x1C, 0x80, + 0x1C, 0x00, + 0x3D, 0x00, + 0x2F, 0x00, + 0x6D, 0x00, + 0x7C, 0x00, + 0x4C, 0x80, + 0xDF, 0x80 +}; + +static const uint8_t courB10L1_0xC7_BMP[] = { + 0x3A, + 0x6E, + 0xC6, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x66, + 0x3C, + 0x10, + 0x18, + 0x08, + 0x38 +}; + +static const uint8_t courB10L1_0xC8_BMP[] = { + 0x18, + 0x0C, + 0x00, + 0xFF, + 0x63, + 0x63, + 0x68, + 0x78, + 0x68, + 0x63, + 0x63, + 0xFF +}; + +static const uint8_t courB10L1_0xC9_BMP[] = { + 0x0C, + 0x18, + 0x00, + 0xFF, + 0x63, + 0x63, + 0x68, + 0x78, + 0x68, + 0x63, + 0x63, + 0xFF +}; + +static const uint8_t courB10L1_0xCA_BMP[] = { + 0x1C, + 0x36, + 0x00, + 0xFF, + 0x63, + 0x63, + 0x68, + 0x78, + 0x68, + 0x63, + 0x63, + 0xFF +}; + +static const uint8_t courB10L1_0xCB_BMP[] = { + 0x24, + 0x24, + 0x00, + 0xFF, + 0x63, + 0x63, + 0x68, + 0x78, + 0x68, + 0x63, + 0x63, + 0xFF +}; + +static const uint8_t courB10L1_0xCC_BMP[] = { + 0x60, + 0x30, + 0x00, + 0xFC, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xFC +}; + +static const uint8_t courB10L1_0xCD_BMP[] = { + 0x18, + 0x30, + 0x00, + 0xFC, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xFC +}; + +static const uint8_t courB10L1_0xCE_BMP[] = { + 0x38, + 0x6C, + 0x00, + 0xFC, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xFC +}; + +static const uint8_t courB10L1_0xCF_BMP[] = { + 0x48, + 0x48, + 0x00, + 0xFC, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xFC +}; + +static const uint8_t courB10L1_0xD0_BMP[] = { + 0xFC, + 0x66, + 0x63, + 0x63, + 0xF3, + 0x63, + 0x63, + 0x66, + 0xFC +}; + +static const uint8_t courB10L1_0xD1_BMP[] = { + 0x1A, 0x00, + 0x2C, 0x00, + 0x00, 0x00, + 0xE7, 0x80, + 0x63, 0x00, + 0x73, 0x00, + 0x73, 0x00, + 0x6B, 0x00, + 0x6B, 0x00, + 0x67, 0x00, + 0x67, 0x00, + 0xF3, 0x00 +}; + +static const uint8_t courB10L1_0xD2_BMP[] = { + 0x30, + 0x18, + 0x00, + 0x3C, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t courB10L1_0xD3_BMP[] = { + 0x0C, + 0x18, + 0x00, + 0x3C, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t courB10L1_0xD4_BMP[] = { + 0x38, + 0x6C, + 0x00, + 0x3C, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t courB10L1_0xD5_BMP[] = { + 0x34, + 0x58, + 0x00, + 0x3C, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t courB10L1_0xD6_BMP[] = { + 0x24, + 0x24, + 0x00, + 0x3C, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t courB10L1_0xD7_BMP[] = { + 0x84, + 0xCC, + 0x78, + 0x30, + 0x78, + 0xCC, + 0x84 +}; + +static const uint8_t courB10L1_0xD8_BMP[] = { + 0x01, + 0x3E, + 0x66, + 0xCB, + 0xCB, + 0xD3, + 0xD3, + 0xE3, + 0x66, + 0xBC +}; + +static const uint8_t courB10L1_0xD9_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xF7, 0x80, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courB10L1_0xDA_BMP[] = { + 0x0C, 0x00, + 0x18, 0x00, + 0x00, 0x00, + 0xF7, 0x80, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courB10L1_0xDB_BMP[] = { + 0x1C, 0x00, + 0x36, 0x00, + 0x00, 0x00, + 0xF7, 0x80, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courB10L1_0xDC_BMP[] = { + 0x12, 0x00, + 0x12, 0x00, + 0x00, 0x00, + 0xF7, 0x80, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courB10L1_0xDD_BMP[] = { + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xF3, 0xC0, + 0x61, 0x80, + 0x33, 0x00, + 0x33, 0x00, + 0x1E, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x3F, 0x00 +}; + +static const uint8_t courB10L1_0xDE_BMP[] = { + 0xF0, + 0x60, + 0x7E, + 0x63, + 0x63, + 0x66, + 0x7C, + 0x60, + 0xF0 +}; + +static const uint8_t courB10L1_0xDF_BMP[] = { + 0x3C, + 0x66, + 0x66, + 0x6C, + 0x66, + 0x63, + 0x63, + 0x6B, + 0xEE +}; + +static const uint8_t courB10L1_0xE0_BMP[] = { + 0x30, + 0x18, + 0x00, + 0x7C, + 0x06, + 0x06, + 0x7E, + 0xC6, + 0xCE, + 0x77 +}; + +static const uint8_t courB10L1_0xE1_BMP[] = { + 0x0C, + 0x18, + 0x00, + 0x7C, + 0x06, + 0x06, + 0x7E, + 0xC6, + 0xCE, + 0x77 +}; + +static const uint8_t courB10L1_0xE2_BMP[] = { + 0x38, + 0x6C, + 0x00, + 0x7C, + 0x06, + 0x06, + 0x7E, + 0xC6, + 0xCE, + 0x77 +}; + +static const uint8_t courB10L1_0xE3_BMP[] = { + 0x34, + 0x58, + 0x00, + 0x7C, + 0x06, + 0x06, + 0x7E, + 0xC6, + 0xCE, + 0x77 +}; + +static const uint8_t courB10L1_0xE4_BMP[] = { + 0x24, + 0x24, + 0x00, + 0x7C, + 0x06, + 0x06, + 0x7E, + 0xC6, + 0xCE, + 0x77 +}; + +static const uint8_t courB10L1_0xE5_BMP[] = { + 0x18, + 0x24, + 0x18, + 0x7C, + 0x06, + 0x06, + 0x7E, + 0xC6, + 0xCE, + 0x77 +}; + +static const uint8_t courB10L1_0xE6_BMP[] = { + 0x77, 0x00, + 0x1D, 0x80, + 0x08, 0x80, + 0x7F, 0x80, + 0xC8, 0x00, + 0xCD, 0x80, + 0x77, 0x00 +}; + +static const uint8_t courB10L1_0xE7_BMP[] = { + 0x3D, + 0x67, + 0xC3, + 0xC0, + 0xC0, + 0x63, + 0x3E, + 0x10, + 0x18, + 0x08, + 0x38 +}; + +static const uint8_t courB10L1_0xE8_BMP[] = { + 0x30, + 0x18, + 0x00, + 0x3C, + 0x66, + 0xC3, + 0xFF, + 0xC0, + 0x67, + 0x3E +}; + +static const uint8_t courB10L1_0xE9_BMP[] = { + 0x0C, + 0x18, + 0x00, + 0x3C, + 0x66, + 0xC3, + 0xFF, + 0xC0, + 0x67, + 0x3E +}; + +static const uint8_t courB10L1_0xEA_BMP[] = { + 0x1C, + 0x36, + 0x00, + 0x3C, + 0x66, + 0xC3, + 0xFF, + 0xC0, + 0x67, + 0x3E +}; + +static const uint8_t courB10L1_0xEB_BMP[] = { + 0x24, + 0x24, + 0x00, + 0x3C, + 0x66, + 0xC3, + 0xFF, + 0xC0, + 0x67, + 0x3E +}; + +static const uint8_t courB10L1_0xEC_BMP[] = { + 0x60, + 0x30, + 0x00, + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xFC +}; + +static const uint8_t courB10L1_0xED_BMP[] = { + 0x18, + 0x30, + 0x00, + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xFC +}; + +static const uint8_t courB10L1_0xEE_BMP[] = { + 0x70, + 0xD8, + 0x00, + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xFC +}; + +static const uint8_t courB10L1_0xEF_BMP[] = { + 0x48, + 0x48, + 0x00, + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xFC +}; + +static const uint8_t courB10L1_0xF0_BMP[] = { + 0xEC, + 0x38, + 0xCC, + 0x3E, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t courB10L1_0xF1_BMP[] = { + 0x1A, 0x00, + 0x2C, 0x00, + 0x00, 0x00, + 0xEE, 0x00, + 0x73, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0xF7, 0x80 +}; + +static const uint8_t courB10L1_0xF2_BMP[] = { + 0x30, + 0x18, + 0x00, + 0x3C, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t courB10L1_0xF3_BMP[] = { + 0x0C, + 0x18, + 0x00, + 0x3C, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t courB10L1_0xF4_BMP[] = { + 0x1C, + 0x36, + 0x00, + 0x3C, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t courB10L1_0xF5_BMP[] = { + 0x34, + 0x58, + 0x00, + 0x3C, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t courB10L1_0xF6_BMP[] = { + 0x24, + 0x24, + 0x00, + 0x3C, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t courB10L1_0xF7_BMP[] = { + 0x18, + 0x18, + 0x00, + 0xFF, + 0x00, + 0x18, + 0x18 +}; + +static const uint8_t courB10L1_0xF8_BMP[] = { + 0x3D, + 0x66, + 0xCF, + 0xDB, + 0xF3, + 0x66, + 0xBC +}; + +static const uint8_t courB10L1_0xF9_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xE7, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x67, 0x00, + 0x3B, 0x80 +}; + +static const uint8_t courB10L1_0xFA_BMP[] = { + 0x0C, 0x00, + 0x18, 0x00, + 0x00, 0x00, + 0xE7, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x67, 0x00, + 0x3B, 0x80 +}; + +static const uint8_t courB10L1_0xFB_BMP[] = { + 0x1C, 0x00, + 0x36, 0x00, + 0x00, 0x00, + 0xE7, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x67, 0x00, + 0x3B, 0x80 +}; + +static const uint8_t courB10L1_0xFC_BMP[] = { + 0x24, 0x00, + 0x24, 0x00, + 0x00, 0x00, + 0xE7, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x67, 0x00, + 0x3B, 0x80 +}; + +static const uint8_t courB10L1_0xFD_BMP[] = { + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xE3, 0x80, + 0x63, 0x00, + 0x63, 0x00, + 0x36, 0x00, + 0x36, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x7C, 0x00 +}; + +static const uint8_t courB10L1_0xFE_BMP[] = { + 0xE0, + 0x60, + 0x6E, + 0x73, + 0x63, + 0x63, + 0x63, + 0x73, + 0x6E, + 0x60, + 0x60, + 0xF0 +}; + +static const uint8_t courB10L1_0xFF_BMP[] = { + 0x12, 0x00, + 0x12, 0x00, + 0x00, 0x00, + 0xE3, 0x80, + 0x63, 0x00, + 0x63, 0x00, + 0x36, 0x00, + 0x36, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x7C, 0x00 +}; + +static const GFONT_CharInfo FontBMP[] = { + {9, 9, 9, 0, 0, courB10L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {9, 1, 1, 0, 0, courB10L1_0x20_BMP}, + {9, 2, 9, 3, 0, courB10L1_0x21_BMP}, + {9, 5, 4, 2, 6, courB10L1_0x22_BMP}, + {9, 7, 11, 1, -1, courB10L1_0x23_BMP}, + {9, 6, 12, 1, -1, courB10L1_0x24_BMP}, + {9, 7, 10, 1, 0, courB10L1_0x25_BMP}, + {9, 7, 8, 1, 0, courB10L1_0x26_BMP}, + {9, 2, 4, 3, 5, courB10L1_0x27_BMP}, + {9, 4, 11, 2, -2, courB10L1_0x28_BMP}, + {9, 4, 11, 2, -2, courB10L1_0x29_BMP}, + {9, 5, 5, 2, 4, courB10L1_0x2A_BMP}, + {9, 7, 7, 1, 1, courB10L1_0x2B_BMP}, + {9, 3, 4, 2, -2, courB10L1_0x2C_BMP}, + {9, 6, 1, 1, 4, courB10L1_0x2D_BMP}, + {9, 2, 2, 3, 0, courB10L1_0x2E_BMP}, + {9, 7, 12, 0, -2, courB10L1_0x2F_BMP}, + {9, 7, 10, 1, 0, courB10L1_0x30_BMP}, + {9, 6, 10, 2, 0, courB10L1_0x31_BMP}, + {9, 6, 10, 1, 0, courB10L1_0x32_BMP}, + {9, 6, 10, 1, 0, courB10L1_0x33_BMP}, + {9, 7, 10, 1, 0, courB10L1_0x34_BMP}, + {9, 6, 10, 1, 0, courB10L1_0x35_BMP}, + {9, 6, 10, 1, 0, courB10L1_0x36_BMP}, + {9, 6, 10, 1, 0, courB10L1_0x37_BMP}, + {9, 6, 10, 1, 0, courB10L1_0x38_BMP}, + {9, 6, 10, 1, 0, courB10L1_0x39_BMP}, + {9, 2, 7, 3, 0, courB10L1_0x3A_BMP}, + {9, 3, 9, 2, -2, courB10L1_0x3B_BMP}, + {9, 8, 7, 0, 1, courB10L1_0x3C_BMP}, + {9, 7, 4, 1, 2, courB10L1_0x3D_BMP}, + {9, 8, 7, 1, 1, courB10L1_0x3E_BMP}, + {9, 6, 9, 1, 0, courB10L1_0x3F_BMP}, + {9, 7, 9, 1, 0, courB10L1_0x40_BMP}, + {9, 9, 9, 0, 0, courB10L1_0x41_BMP}, + {9, 8, 9, 0, 0, courB10L1_0x42_BMP}, + {9, 7, 9, 1, 0, courB10L1_0x43_BMP}, + {9, 8, 9, 0, 0, courB10L1_0x44_BMP}, + {9, 8, 9, 0, 0, courB10L1_0x45_BMP}, + {9, 8, 9, 0, 0, courB10L1_0x46_BMP}, + {9, 9, 9, 0, 0, courB10L1_0x47_BMP}, + {9, 9, 9, 0, 0, courB10L1_0x48_BMP}, + {9, 6, 9, 1, 0, courB10L1_0x49_BMP}, + {9, 9, 9, 0, 0, courB10L1_0x4A_BMP}, + {9, 9, 9, 0, 0, courB10L1_0x4B_BMP}, + {9, 8, 9, 0, 0, courB10L1_0x4C_BMP}, + {9, 9, 9, 0, 0, courB10L1_0x4D_BMP}, + {9, 9, 9, 0, 0, courB10L1_0x4E_BMP}, + {9, 8, 9, 0, 0, courB10L1_0x4F_BMP}, + {9, 8, 9, 0, 0, courB10L1_0x50_BMP}, + {9, 8, 11, 0, -2, courB10L1_0x51_BMP}, + {9, 9, 9, 0, 0, courB10L1_0x52_BMP}, + {9, 7, 9, 1, 0, courB10L1_0x53_BMP}, + {9, 8, 9, 0, 0, courB10L1_0x54_BMP}, + {9, 9, 9, 0, 0, courB10L1_0x55_BMP}, + {9, 9, 9, 0, 0, courB10L1_0x56_BMP}, + {9, 9, 9, 0, 0, courB10L1_0x57_BMP}, + {9, 8, 9, 0, 0, courB10L1_0x58_BMP}, + {9, 10, 9, -1, 0, courB10L1_0x59_BMP}, + {9, 7, 9, 1, 0, courB10L1_0x5A_BMP}, + {9, 4, 11, 2, -2, courB10L1_0x5B_BMP}, + {9, 7, 12, 1, -2, courB10L1_0x5C_BMP}, + {9, 4, 11, 2, -2, courB10L1_0x5D_BMP}, + {9, 5, 4, 2, 5, courB10L1_0x5E_BMP}, + {9, 9, 1, 0, -2, courB10L1_0x5F_BMP}, + {9, 3, 2, 2, 7, courB10L1_0x60_BMP}, + {9, 8, 7, 0, 0, courB10L1_0x61_BMP}, + {9, 8, 10, 0, 0, courB10L1_0x62_BMP}, + {9, 8, 7, 0, 0, courB10L1_0x63_BMP}, + {9, 8, 10, 0, 0, courB10L1_0x64_BMP}, + {9, 8, 7, 0, 0, courB10L1_0x65_BMP}, + {9, 7, 10, 1, 0, courB10L1_0x66_BMP}, + {9, 8, 10, 0, -3, courB10L1_0x67_BMP}, + {9, 9, 10, 0, 0, courB10L1_0x68_BMP}, + {9, 6, 10, 1, 0, courB10L1_0x69_BMP}, + {9, 5, 13, 1, -3, courB10L1_0x6A_BMP}, + {9, 8, 10, 0, 0, courB10L1_0x6B_BMP}, + {9, 6, 10, 1, 0, courB10L1_0x6C_BMP}, + {9, 9, 7, 0, 0, courB10L1_0x6D_BMP}, + {9, 9, 7, 0, 0, courB10L1_0x6E_BMP}, + {9, 8, 7, 0, 0, courB10L1_0x6F_BMP}, + {9, 8, 10, 0, -3, courB10L1_0x70_BMP}, + {9, 8, 10, 0, -3, courB10L1_0x71_BMP}, + {9, 7, 7, 1, 0, courB10L1_0x72_BMP}, + {9, 7, 7, 1, 0, courB10L1_0x73_BMP}, + {9, 7, 9, 1, 0, courB10L1_0x74_BMP}, + {9, 9, 7, 0, 0, courB10L1_0x75_BMP}, + {9, 9, 7, 0, 0, courB10L1_0x76_BMP}, + {9, 10, 7, -1, 0, courB10L1_0x77_BMP}, + {9, 8, 7, 0, 0, courB10L1_0x78_BMP}, + {9, 9, 10, 0, -3, courB10L1_0x79_BMP}, + {9, 6, 7, 1, 0, courB10L1_0x7A_BMP}, + {9, 4, 11, 2, -2, courB10L1_0x7B_BMP}, + {9, 2, 11, 3, -2, courB10L1_0x7C_BMP}, + {9, 4, 11, 2, -2, courB10L1_0x7D_BMP}, + {9, 6, 3, 1, 3, courB10L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {9, 1, 1, 0, 0, courB10L1_0xA0_BMP}, + {9, 2, 9, 3, -2, courB10L1_0xA1_BMP}, + {9, 6, 10, 1, -1, courB10L1_0xA2_BMP}, + {9, 7, 9, 1, 0, courB10L1_0xA3_BMP}, + {9, 7, 6, 1, 1, courB10L1_0xA4_BMP}, + {9, 10, 9, 0, 0, courB10L1_0xA5_BMP}, + {9, 2, 11, 3, -2, courB10L1_0xA6_BMP}, + {9, 8, 11, 0, -1, courB10L1_0xA7_BMP}, + {9, 4, 2, 2, 8, courB10L1_0xA8_BMP}, + {9, 9, 8, 0, 1, courB10L1_0xA9_BMP}, + {9, 5, 7, 2, 2, courB10L1_0xAA_BMP}, + {9, 7, 5, 1, 1, courB10L1_0xAB_BMP}, + {9, 7, 3, 1, 2, courB10L1_0xAC_BMP}, + {9, 6, 1, 1, 4, courB10L1_0xAD_BMP}, + {9, 9, 8, 0, 1, courB10L1_0xAE_BMP}, + {9, 4, 1, 2, 8, courB10L1_0xAF_BMP}, + {9, 4, 4, 2, 5, courB10L1_0xB0_BMP}, + {9, 7, 7, 1, 1, courB10L1_0xB1_BMP}, + {9, 5, 6, 2, 4, courB10L1_0xB2_BMP}, + {9, 5, 6, 2, 4, courB10L1_0xB3_BMP}, + {9, 3, 2, 3, 7, courB10L1_0xB4_BMP}, + {9, 9, 10, 0, -3, courB10L1_0xB5_BMP}, + {9, 7, 11, 1, -1, courB10L1_0xB6_BMP}, + {9, 2, 2, 3, 3, courB10L1_0xB7_BMP}, + {9, 3, 4, 2, -3, courB10L1_0xB8_BMP}, + {9, 4, 6, 3, 4, courB10L1_0xB9_BMP}, + {9, 5, 7, 2, 2, courB10L1_0xBA_BMP}, + {9, 7, 5, 1, 1, courB10L1_0xBB_BMP}, + {9, 9, 10, 0, 0, courB10L1_0xBC_BMP}, + {9, 9, 10, 0, 0, courB10L1_0xBD_BMP}, + {9, 10, 10, -1, 0, courB10L1_0xBE_BMP}, + {9, 6, 9, 1, -2, courB10L1_0xBF_BMP}, + {9, 9, 12, 0, 0, courB10L1_0xC0_BMP}, + {9, 9, 12, 0, 0, courB10L1_0xC1_BMP}, + {9, 9, 12, 0, 0, courB10L1_0xC2_BMP}, + {9, 9, 12, 0, 0, courB10L1_0xC3_BMP}, + {9, 9, 12, 0, 0, courB10L1_0xC4_BMP}, + {9, 9, 12, 0, 0, courB10L1_0xC5_BMP}, + {9, 9, 9, 0, 0, courB10L1_0xC6_BMP}, + {9, 7, 13, 1, -4, courB10L1_0xC7_BMP}, + {9, 8, 12, 0, 0, courB10L1_0xC8_BMP}, + {9, 8, 12, 0, 0, courB10L1_0xC9_BMP}, + {9, 8, 12, 0, 0, courB10L1_0xCA_BMP}, + {9, 8, 12, 0, 0, courB10L1_0xCB_BMP}, + {9, 6, 12, 1, 0, courB10L1_0xCC_BMP}, + {9, 6, 12, 1, 0, courB10L1_0xCD_BMP}, + {9, 6, 12, 1, 0, courB10L1_0xCE_BMP}, + {9, 6, 12, 1, 0, courB10L1_0xCF_BMP}, + {9, 8, 9, 0, 0, courB10L1_0xD0_BMP}, + {9, 9, 12, 0, 0, courB10L1_0xD1_BMP}, + {9, 8, 12, 0, 0, courB10L1_0xD2_BMP}, + {9, 8, 12, 0, 0, courB10L1_0xD3_BMP}, + {9, 8, 12, 0, 0, courB10L1_0xD4_BMP}, + {9, 8, 12, 0, 0, courB10L1_0xD5_BMP}, + {9, 8, 12, 0, 0, courB10L1_0xD6_BMP}, + {9, 6, 7, 1, 1, courB10L1_0xD7_BMP}, + {9, 8, 10, 0, 0, courB10L1_0xD8_BMP}, + {9, 9, 12, 0, 0, courB10L1_0xD9_BMP}, + {9, 9, 12, 0, 0, courB10L1_0xDA_BMP}, + {9, 9, 12, 0, 0, courB10L1_0xDB_BMP}, + {9, 9, 12, 0, 0, courB10L1_0xDC_BMP}, + {9, 10, 12, -1, 0, courB10L1_0xDD_BMP}, + {9, 8, 9, 0, 0, courB10L1_0xDE_BMP}, + {9, 8, 9, 0, 0, courB10L1_0xDF_BMP}, + {9, 8, 10, 0, 0, courB10L1_0xE0_BMP}, + {9, 8, 10, 0, 0, courB10L1_0xE1_BMP}, + {9, 8, 10, 0, 0, courB10L1_0xE2_BMP}, + {9, 8, 10, 0, 0, courB10L1_0xE3_BMP}, + {9, 8, 10, 0, 0, courB10L1_0xE4_BMP}, + {9, 8, 10, 0, 0, courB10L1_0xE5_BMP}, + {9, 9, 7, 0, 0, courB10L1_0xE6_BMP}, + {9, 8, 11, 0, -4, courB10L1_0xE7_BMP}, + {9, 8, 10, 0, 0, courB10L1_0xE8_BMP}, + {9, 8, 10, 0, 0, courB10L1_0xE9_BMP}, + {9, 8, 10, 0, 0, courB10L1_0xEA_BMP}, + {9, 8, 10, 0, 0, courB10L1_0xEB_BMP}, + {9, 6, 10, 1, 0, courB10L1_0xEC_BMP}, + {9, 6, 10, 1, 0, courB10L1_0xED_BMP}, + {9, 6, 10, 1, 0, courB10L1_0xEE_BMP}, + {9, 6, 10, 1, 0, courB10L1_0xEF_BMP}, + {9, 8, 10, 0, 0, courB10L1_0xF0_BMP}, + {9, 9, 10, 0, 0, courB10L1_0xF1_BMP}, + {9, 8, 10, 0, 0, courB10L1_0xF2_BMP}, + {9, 8, 10, 0, 0, courB10L1_0xF3_BMP}, + {9, 8, 10, 0, 0, courB10L1_0xF4_BMP}, + {9, 8, 10, 0, 0, courB10L1_0xF5_BMP}, + {9, 8, 10, 0, 0, courB10L1_0xF6_BMP}, + {9, 8, 7, 0, 1, courB10L1_0xF7_BMP}, + {9, 8, 7, 0, 0, courB10L1_0xF8_BMP}, + {9, 9, 10, 0, 0, courB10L1_0xF9_BMP}, + {9, 9, 10, 0, 0, courB10L1_0xFA_BMP}, + {9, 9, 10, 0, 0, courB10L1_0xFB_BMP}, + {9, 9, 10, 0, 0, courB10L1_0xFC_BMP}, + {9, 9, 13, 0, -3, courB10L1_0xFD_BMP}, + {9, 8, 12, 0, -3, courB10L1_0xFE_BMP}, + {9, 9, 13, 0, -3, courB10L1_0xFF_BMP} +}; + + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontCour10Bold_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontCour10Bold_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontCour10Bold_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontCour10Bold_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontCour10Bold_GetFontChar, + McuFontCour10Bold_FBBy, + McuFontCour10Bold_GetUnderlineBoxHeight(), + McuFontCour10Bold_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour10Bold_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour10Bold_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour10Bold_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour10Bold_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontCour10Bold. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour10Bold.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour10Bold.h new file mode 100644 index 0000000..9cd2606 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour10Bold.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour10Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour10Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 10 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour10Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour10Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour10Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour10Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour10Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontCour10Bold_Deinit(void); +** Init - void McuFontCour10Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour10Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour10Bold_module McuFontCour10Bold module documentation +** @{ +*/ + + +#ifndef __McuFontCour10Bold_H +#define __McuFontCour10Bold_H + +/* MODULE McuFontCour10Bold. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontCour10Boldconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontCour10Bold_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontCour10Bold_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontCour10Bold_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontCour10Bold_GetLineSpaceHeight() \ + 1 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontCour10Bold_GetUnderlineBoxHeight() \ + 3 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontCour10Bold_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontCour10Bold_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontCour10Bold. */ + +#endif +/* ifndef __McuFontCour10Bold_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour10Normal.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour10Normal.c new file mode 100644 index 0000000..7b040ae --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour10Normal.c @@ -0,0 +1,2823 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour10Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour10Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 10 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour10Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour10Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour10Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour10Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour10Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontCour10Normal_Deinit(void); +** Init - void McuFontCour10Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour10Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour10Normal_module McuFontCour10Normal module documentation +** @{ +*/ + +/* MODULE McuFontCour10Normal. */ + +#include "McuFontCour10Normal.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontCour10Normal_FBBy 14 + +static const uint8_t courR10L1_0x00_BMP[] = { + 0xAA, + 0x00, + 0x82, + 0x00, + 0x82, + 0x00, + 0x82, + 0x00, + 0xAA +}; + +static const uint8_t courR10L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t courR10L1_0x21_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x00, + 0x80, + 0x80 +}; + +static const uint8_t courR10L1_0x22_BMP[] = { + 0x90, + 0x90, + 0x90, + 0x90 +}; + +static const uint8_t courR10L1_0x23_BMP[] = { + 0x50, + 0x50, + 0x50, + 0xF8, + 0x50, + 0x50, + 0xF8, + 0x50, + 0x50, + 0x50 +}; + +static const uint8_t courR10L1_0x24_BMP[] = { + 0x20, + 0x20, + 0x78, + 0x88, + 0x80, + 0xC0, + 0x30, + 0x08, + 0x88, + 0xF0, + 0x20, + 0x20, + 0x20 +}; + +static const uint8_t courR10L1_0x25_BMP[] = { + 0x60, + 0x90, + 0x90, + 0x73, + 0x0C, + 0x30, + 0xCC, + 0x12, + 0x12, + 0x0C +}; + +static const uint8_t courR10L1_0x26_BMP[] = { + 0x38, + 0x40, + 0x40, + 0x40, + 0xA8, + 0x90, + 0x98, + 0x64 +}; + +static const uint8_t courR10L1_0x27_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t courR10L1_0x28_BMP[] = { + 0x20, + 0x40, + 0x40, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x40, + 0x40, + 0x20 +}; + +static const uint8_t courR10L1_0x29_BMP[] = { + 0x80, + 0x40, + 0x40, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t courR10L1_0x2A_BMP[] = { + 0x20, + 0x20, + 0xF8, + 0x20, + 0x50, + 0x88 +}; + +static const uint8_t courR10L1_0x2B_BMP[] = { + 0x10, + 0x10, + 0x10, + 0xFE, + 0x10, + 0x10, + 0x10 +}; + +static const uint8_t courR10L1_0x2C_BMP[] = { + 0x60, + 0x60, + 0xC0, + 0x80 +}; + +static const uint8_t courR10L1_0x2D_BMP[] = { + 0xFC +}; + +static const uint8_t courR10L1_0x2E_BMP[] = { + 0xC0, + 0xC0 +}; + +static const uint8_t courR10L1_0x2F_BMP[] = { + 0x04, + 0x08, + 0x08, + 0x10, + 0x10, + 0x20, + 0x20, + 0x40, + 0x40, + 0x80, + 0x80 +}; + +static const uint8_t courR10L1_0x30_BMP[] = { + 0x30, + 0x48, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x48, + 0x30 +}; + +static const uint8_t courR10L1_0x31_BMP[] = { + 0x20, + 0x60, + 0xA0, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR10L1_0x32_BMP[] = { + 0x70, + 0x88, + 0x88, + 0x08, + 0x10, + 0x20, + 0x40, + 0x80, + 0x88, + 0xF8 +}; + +static const uint8_t courR10L1_0x33_BMP[] = { + 0x38, + 0x44, + 0x04, + 0x04, + 0x18, + 0x04, + 0x04, + 0x04, + 0x84, + 0x78 +}; + +static const uint8_t courR10L1_0x34_BMP[] = { + 0x18, + 0x28, + 0x28, + 0x48, + 0x48, + 0x88, + 0x88, + 0xFC, + 0x08, + 0x1C +}; + +static const uint8_t courR10L1_0x35_BMP[] = { + 0x7C, + 0x40, + 0x40, + 0x40, + 0x78, + 0x04, + 0x04, + 0x04, + 0x84, + 0x78 +}; + +static const uint8_t courR10L1_0x36_BMP[] = { + 0x38, + 0x40, + 0x80, + 0x80, + 0xB8, + 0xC4, + 0x84, + 0x84, + 0x44, + 0x38 +}; + +static const uint8_t courR10L1_0x37_BMP[] = { + 0xFC, + 0x84, + 0x04, + 0x08, + 0x08, + 0x08, + 0x10, + 0x10, + 0x10, + 0x10 +}; + +static const uint8_t courR10L1_0x38_BMP[] = { + 0x70, + 0x88, + 0x88, + 0x88, + 0x70, + 0x88, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t courR10L1_0x39_BMP[] = { + 0x70, + 0x88, + 0x84, + 0x84, + 0x8C, + 0x74, + 0x04, + 0x04, + 0x08, + 0x70 +}; + +static const uint8_t courR10L1_0x3A_BMP[] = { + 0xC0, + 0xC0, + 0x00, + 0x00, + 0x00, + 0xC0, + 0xC0 +}; + +static const uint8_t courR10L1_0x3B_BMP[] = { + 0x60, + 0x60, + 0x00, + 0x00, + 0x00, + 0x60, + 0x60, + 0xC0, + 0x80 +}; + +static const uint8_t courR10L1_0x3C_BMP[] = { + 0x06, + 0x18, + 0x60, + 0x80, + 0x60, + 0x18, + 0x06 +}; + +static const uint8_t courR10L1_0x3D_BMP[] = { + 0xFE, + 0x00, + 0xFE +}; + +static const uint8_t courR10L1_0x3E_BMP[] = { + 0xC0, + 0x30, + 0x0C, + 0x02, + 0x0C, + 0x30, + 0xC0 +}; + +static const uint8_t courR10L1_0x3F_BMP[] = { + 0x70, + 0x88, + 0x08, + 0x08, + 0x30, + 0x20, + 0x00, + 0x20, + 0x20 +}; + +static const uint8_t courR10L1_0x40_BMP[] = { + 0x38, + 0x44, + 0x84, + 0x9C, + 0xA4, + 0xA4, + 0x9E, + 0x80, + 0x40, + 0x38 +}; + +static const uint8_t courR10L1_0x41_BMP[] = { + 0x38, 0x00, + 0x08, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x3E, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0xF7, 0x80 +}; + +static const uint8_t courR10L1_0x42_BMP[] = { + 0xFC, + 0x42, + 0x42, + 0x42, + 0x7C, + 0x42, + 0x42, + 0x42, + 0xFC +}; + +static const uint8_t courR10L1_0x43_BMP[] = { + 0x3A, + 0x46, + 0x82, + 0x80, + 0x80, + 0x80, + 0x80, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0x44_BMP[] = { + 0xFC, + 0x42, + 0x41, + 0x41, + 0x41, + 0x41, + 0x41, + 0x42, + 0xFC +}; + +static const uint8_t courR10L1_0x45_BMP[] = { + 0xFE, + 0x42, + 0x42, + 0x48, + 0x78, + 0x48, + 0x42, + 0x42, + 0xFE +}; + +static const uint8_t courR10L1_0x46_BMP[] = { + 0xFE, + 0x42, + 0x42, + 0x48, + 0x78, + 0x48, + 0x40, + 0x40, + 0xF0 +}; + +static const uint8_t courR10L1_0x47_BMP[] = { + 0x3A, + 0x46, + 0x82, + 0x80, + 0x80, + 0x8F, + 0x82, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0x48_BMP[] = { + 0xE7, + 0x42, + 0x42, + 0x42, + 0x7E, + 0x42, + 0x42, + 0x42, + 0xE7 +}; + +static const uint8_t courR10L1_0x49_BMP[] = { + 0xF8, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR10L1_0x4A_BMP[] = { + 0x3E, + 0x08, + 0x08, + 0x08, + 0x08, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t courR10L1_0x4B_BMP[] = { + 0xEE, + 0x44, + 0x48, + 0x50, + 0x70, + 0x48, + 0x44, + 0x44, + 0xE3 +}; + +static const uint8_t courR10L1_0x4C_BMP[] = { + 0xF8, + 0x20, + 0x20, + 0x20, + 0x20, + 0x21, + 0x21, + 0x21, + 0xFF +}; + +static const uint8_t courR10L1_0x4D_BMP[] = { + 0xE3, 0x80, + 0x63, 0x00, + 0x55, 0x00, + 0x55, 0x00, + 0x49, 0x00, + 0x49, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0xE3, 0x80 +}; + +static const uint8_t courR10L1_0x4E_BMP[] = { + 0xE7, + 0x62, + 0x52, + 0x52, + 0x4A, + 0x4A, + 0x46, + 0x46, + 0xE2 +}; + +static const uint8_t courR10L1_0x4F_BMP[] = { + 0x3C, + 0x42, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0x50_BMP[] = { + 0xFC, + 0x42, + 0x42, + 0x42, + 0x42, + 0x7C, + 0x40, + 0x40, + 0xF0 +}; + +static const uint8_t courR10L1_0x51_BMP[] = { + 0x3C, + 0x42, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C, + 0x31, + 0x5E +}; + +static const uint8_t courR10L1_0x52_BMP[] = { + 0xFC, + 0x42, + 0x42, + 0x42, + 0x44, + 0x78, + 0x44, + 0x42, + 0xE1 +}; + +static const uint8_t courR10L1_0x53_BMP[] = { + 0x74, + 0x8C, + 0x84, + 0x80, + 0x78, + 0x04, + 0x84, + 0xC4, + 0xB8 +}; + +static const uint8_t courR10L1_0x54_BMP[] = { + 0xFE, + 0x92, + 0x92, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x7C +}; + +static const uint8_t courR10L1_0x55_BMP[] = { + 0xE7, + 0x42, + 0x42, + 0x42, + 0x42, + 0x42, + 0x42, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0x56_BMP[] = { + 0xE3, 0x80, + 0x41, 0x00, + 0x41, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x08, 0x00, + 0x08, 0x00 +}; + +static const uint8_t courR10L1_0x57_BMP[] = { + 0xE3, 0x80, + 0x41, 0x00, + 0x49, 0x00, + 0x49, 0x00, + 0x55, 0x00, + 0x55, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x22, 0x00 +}; + +static const uint8_t courR10L1_0x58_BMP[] = { + 0xE7, + 0x42, + 0x24, + 0x24, + 0x18, + 0x24, + 0x24, + 0x42, + 0xE7 +}; + +static const uint8_t courR10L1_0x59_BMP[] = { + 0xEE, + 0x44, + 0x44, + 0x28, + 0x28, + 0x10, + 0x10, + 0x10, + 0x7C +}; + +static const uint8_t courR10L1_0x5A_BMP[] = { + 0xFC, + 0x84, + 0x88, + 0x10, + 0x20, + 0x20, + 0x44, + 0x84, + 0xFC +}; + +static const uint8_t courR10L1_0x5B_BMP[] = { + 0xE0, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0xE0 +}; + +static const uint8_t courR10L1_0x5C_BMP[] = { + 0x80, + 0x40, + 0x40, + 0x20, + 0x20, + 0x10, + 0x10, + 0x08, + 0x08, + 0x04, + 0x04 +}; + +static const uint8_t courR10L1_0x5D_BMP[] = { + 0xE0, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xE0 +}; + +static const uint8_t courR10L1_0x5E_BMP[] = { + 0x20, + 0x50, + 0x50, + 0x88, + 0x88 +}; + +static const uint8_t courR10L1_0x5F_BMP[] = { + 0xFF, 0x80 +}; + +static const uint8_t courR10L1_0x60_BMP[] = { + 0xC0, + 0x30 +}; + +static const uint8_t courR10L1_0x61_BMP[] = { + 0x78, + 0x84, + 0x04, + 0x7C, + 0x84, + 0x84, + 0x7A +}; + +static const uint8_t courR10L1_0x62_BMP[] = { + 0xC0, + 0x40, + 0x40, + 0x5C, + 0x62, + 0x41, + 0x41, + 0x41, + 0x62, + 0xDC +}; + +static const uint8_t courR10L1_0x63_BMP[] = { + 0x3A, + 0x46, + 0x82, + 0x80, + 0x80, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0x64_BMP[] = { + 0x06, + 0x02, + 0x02, + 0x3A, + 0x46, + 0x82, + 0x82, + 0x82, + 0x46, + 0x3B +}; + +static const uint8_t courR10L1_0x65_BMP[] = { + 0x38, + 0x44, + 0x82, + 0xFE, + 0x80, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0x66_BMP[] = { + 0x1E, + 0x20, + 0x20, + 0xFC, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR10L1_0x67_BMP[] = { + 0x3B, + 0x46, + 0x82, + 0x82, + 0x82, + 0x46, + 0x3A, + 0x02, + 0x04, + 0x78 +}; + +static const uint8_t courR10L1_0x68_BMP[] = { + 0xC0, + 0x40, + 0x40, + 0x5C, + 0x62, + 0x42, + 0x42, + 0x42, + 0x42, + 0xE7 +}; + +static const uint8_t courR10L1_0x69_BMP[] = { + 0x20, + 0x20, + 0x00, + 0xE0, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR10L1_0x6A_BMP[] = { + 0x08, + 0x08, + 0x00, + 0xF8, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x10, + 0xE0 +}; + +static const uint8_t courR10L1_0x6B_BMP[] = { + 0xC0, + 0x40, + 0x40, + 0x4E, + 0x48, + 0x50, + 0x60, + 0x50, + 0x48, + 0xCE +}; + +static const uint8_t courR10L1_0x6C_BMP[] = { + 0xE0, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR10L1_0x6D_BMP[] = { + 0xDB, 0x00, + 0x6D, 0x00, + 0x49, 0x00, + 0x49, 0x00, + 0x49, 0x00, + 0x49, 0x00, + 0xED, 0x80 +}; + +static const uint8_t courR10L1_0x6E_BMP[] = { + 0xDC, + 0x62, + 0x42, + 0x42, + 0x42, + 0x42, + 0xE7 +}; + +static const uint8_t courR10L1_0x6F_BMP[] = { + 0x3C, + 0x42, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0x70_BMP[] = { + 0xDC, + 0x62, + 0x41, + 0x41, + 0x41, + 0x62, + 0x5C, + 0x40, + 0x40, + 0xF0 +}; + +static const uint8_t courR10L1_0x71_BMP[] = { + 0x3B, + 0x46, + 0x82, + 0x82, + 0x82, + 0x46, + 0x3A, + 0x02, + 0x02, + 0x0F +}; + +static const uint8_t courR10L1_0x72_BMP[] = { + 0xCC, + 0x52, + 0x60, + 0x40, + 0x40, + 0x40, + 0xF8 +}; + +static const uint8_t courR10L1_0x73_BMP[] = { + 0x7C, + 0x84, + 0x80, + 0x78, + 0x04, + 0x84, + 0xF8 +}; + +static const uint8_t courR10L1_0x74_BMP[] = { + 0x20, + 0x20, + 0xFC, + 0x20, + 0x20, + 0x20, + 0x20, + 0x22, + 0x1C +}; + +static const uint8_t courR10L1_0x75_BMP[] = { + 0xC6, + 0x42, + 0x42, + 0x42, + 0x42, + 0x46, + 0x3B +}; + +static const uint8_t courR10L1_0x76_BMP[] = { + 0xE7, + 0x42, + 0x42, + 0x24, + 0x24, + 0x18, + 0x18 +}; + +static const uint8_t courR10L1_0x77_BMP[] = { + 0xE3, 0x80, + 0x41, 0x00, + 0x49, 0x00, + 0x49, 0x00, + 0x2A, 0x00, + 0x36, 0x00, + 0x22, 0x00 +}; + +static const uint8_t courR10L1_0x78_BMP[] = { + 0xEE, + 0x44, + 0x28, + 0x10, + 0x28, + 0x44, + 0xEE +}; + +static const uint8_t courR10L1_0x79_BMP[] = { + 0xE7, + 0x42, + 0x42, + 0x24, + 0x24, + 0x18, + 0x08, + 0x10, + 0x10, + 0x78 +}; + +static const uint8_t courR10L1_0x7A_BMP[] = { + 0xF8, + 0x88, + 0x10, + 0x20, + 0x40, + 0x88, + 0xF8 +}; + +static const uint8_t courR10L1_0x7B_BMP[] = { + 0x20, + 0x40, + 0x40, + 0x40, + 0x40, + 0x80, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x20 +}; + +static const uint8_t courR10L1_0x7C_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t courR10L1_0x7D_BMP[] = { + 0x80, + 0x40, + 0x40, + 0x40, + 0x40, + 0x20, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t courR10L1_0x7E_BMP[] = { + 0x64, + 0x98 +}; + +static const uint8_t courR10L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t courR10L1_0xA1_BMP[] = { + 0x80, + 0x80, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t courR10L1_0xA2_BMP[] = { + 0x20, + 0x20, + 0x78, + 0x88, + 0x80, + 0x88, + 0x70, + 0x20, + 0x20 +}; + +static const uint8_t courR10L1_0xA3_BMP[] = { + 0x18, + 0x24, + 0x20, + 0x20, + 0x78, + 0x20, + 0x20, + 0x42, + 0xFC +}; + +static const uint8_t courR10L1_0xA4_BMP[] = { + 0xB4, + 0x48, + 0x84, + 0x84, + 0x48, + 0xB4 +}; + +static const uint8_t courR10L1_0xA5_BMP[] = { + 0xEE, + 0x44, + 0x44, + 0x28, + 0x7C, + 0x10, + 0x7C, + 0x10, + 0x38 +}; + +static const uint8_t courR10L1_0xA6_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x00, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t courR10L1_0xA7_BMP[] = { + 0x3C, + 0x44, + 0x40, + 0xF0, + 0x88, + 0x44, + 0x3C, + 0x08, + 0x88, + 0xF0 +}; + +static const uint8_t courR10L1_0xA8_BMP[] = { + 0xD8 +}; + +static const uint8_t courR10L1_0xA9_BMP[] = { + 0x3C, + 0x42, + 0x99, + 0xA5, + 0xA1, + 0xA5, + 0x99, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0xAA_BMP[] = { + 0xC0, + 0x20, + 0xE0, + 0xB0, + 0x00, + 0xF0 +}; + +static const uint8_t courR10L1_0xAB_BMP[] = { + 0x11, + 0x22, + 0x44, + 0xCC, + 0x44, + 0x22, + 0x11 +}; + +static const uint8_t courR10L1_0xAC_BMP[] = { + 0xFE, + 0x02, + 0x02 +}; + +static const uint8_t courR10L1_0xAD_BMP[] = { + 0xFC +}; + +static const uint8_t courR10L1_0xAE_BMP[] = { + 0x3C, + 0x42, + 0xB9, + 0xA5, + 0xB9, + 0xA9, + 0xA5, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0xAF_BMP[] = { + 0xF0 +}; + +static const uint8_t courR10L1_0xB0_BMP[] = { + 0x60, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t courR10L1_0xB1_BMP[] = { + 0x10, + 0x10, + 0xFE, + 0x10, + 0x10, + 0x00, + 0xFE +}; + +static const uint8_t courR10L1_0xB2_BMP[] = { + 0x60, + 0x90, + 0x10, + 0x20, + 0x40, + 0xF0 +}; + +static const uint8_t courR10L1_0xB3_BMP[] = { + 0x60, + 0x90, + 0x60, + 0x10, + 0x90, + 0x60 +}; + +static const uint8_t courR10L1_0xB4_BMP[] = { + 0x30, + 0xC0 +}; + +static const uint8_t courR10L1_0xB5_BMP[] = { + 0xC6, + 0x42, + 0x42, + 0x42, + 0x42, + 0x46, + 0x7B, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t courR10L1_0xB6_BMP[] = { + 0x7E, + 0x94, + 0x94, + 0x94, + 0x74, + 0x14, + 0x14, + 0x14, + 0x14, + 0x3E +}; + +static const uint8_t courR10L1_0xB7_BMP[] = { + 0xC0, + 0xC0 +}; + +static const uint8_t courR10L1_0xB8_BMP[] = { + 0x40, + 0x20, + 0xE0 +}; + +static const uint8_t courR10L1_0xB9_BMP[] = { + 0x40, + 0xC0, + 0x40, + 0x40, + 0x40, + 0xE0 +}; + +static const uint8_t courR10L1_0xBA_BMP[] = { + 0x60, + 0x90, + 0x90, + 0x60, + 0x00, + 0xF0 +}; + +static const uint8_t courR10L1_0xBB_BMP[] = { + 0x88, + 0x44, + 0x22, + 0x33, + 0x22, + 0x44, + 0x88 +}; + +static const uint8_t courR10L1_0xBC_BMP[] = { + 0x40, 0x00, + 0xC1, 0x00, + 0x42, 0x00, + 0x44, 0x00, + 0x44, 0x80, + 0xE9, 0x80, + 0x12, 0x80, + 0x14, 0x80, + 0x27, 0xC0, + 0x40, 0x80 +}; + +static const uint8_t courR10L1_0xBD_BMP[] = { + 0x40, 0x00, + 0xC1, 0x00, + 0x42, 0x00, + 0x44, 0x00, + 0x45, 0x80, + 0xEA, 0x40, + 0x10, 0x40, + 0x10, 0x80, + 0x21, 0x00, + 0x43, 0xC0 +}; + +static const uint8_t courR10L1_0xBE_BMP[] = { + 0x60, 0x00, + 0x91, 0x00, + 0x62, 0x00, + 0x14, 0x00, + 0x94, 0x80, + 0x69, 0x80, + 0x12, 0x80, + 0x14, 0x80, + 0x27, 0xC0, + 0x40, 0x80 +}; + +static const uint8_t courR10L1_0xBF_BMP[] = { + 0x20, + 0x20, + 0x00, + 0x20, + 0x60, + 0x80, + 0x80, + 0x88, + 0x70 +}; + +static const uint8_t courR10L1_0xC0_BMP[] = { + 0x30, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x38, 0x00, + 0x08, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x3E, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0xF7, 0x80 +}; + +static const uint8_t courR10L1_0xC1_BMP[] = { + 0x0C, 0x00, + 0x30, 0x00, + 0x00, 0x00, + 0x38, 0x00, + 0x08, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x3E, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0xF7, 0x80 +}; + +static const uint8_t courR10L1_0xC2_BMP[] = { + 0x08, 0x00, + 0x14, 0x00, + 0x00, 0x00, + 0x38, 0x00, + 0x08, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x3E, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0xF7, 0x80 +}; + +static const uint8_t courR10L1_0xC3_BMP[] = { + 0x1A, 0x00, + 0x2C, 0x00, + 0x00, 0x00, + 0x38, 0x00, + 0x08, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x3E, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0xF7, 0x80 +}; + +static const uint8_t courR10L1_0xC4_BMP[] = { + 0x36, 0x00, + 0x00, 0x00, + 0x38, 0x00, + 0x08, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x3E, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0xF7, 0x80 +}; + +static const uint8_t courR10L1_0xC5_BMP[] = { + 0x18, 0x00, + 0x24, 0x00, + 0x18, 0x00, + 0x38, 0x00, + 0x08, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x3E, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0xF7, 0x80 +}; + +static const uint8_t courR10L1_0xC6_BMP[] = { + 0x1F, 0x80, + 0x0C, 0x80, + 0x14, 0x00, + 0x14, 0x80, + 0x27, 0x80, + 0x3C, 0x80, + 0x44, 0x00, + 0x44, 0x80, + 0xEF, 0x80 +}; + +static const uint8_t courR10L1_0xC7_BMP[] = { + 0x3A, + 0x46, + 0x82, + 0x80, + 0x80, + 0x80, + 0x80, + 0x42, + 0x3C, + 0x10, + 0x08, + 0x38 +}; + +static const uint8_t courR10L1_0xC8_BMP[] = { + 0x60, + 0x18, + 0x00, + 0xFE, + 0x42, + 0x42, + 0x48, + 0x78, + 0x48, + 0x42, + 0x42, + 0xFE +}; + +static const uint8_t courR10L1_0xC9_BMP[] = { + 0x0C, + 0x30, + 0x00, + 0xFE, + 0x42, + 0x42, + 0x48, + 0x78, + 0x48, + 0x42, + 0x42, + 0xFE +}; + +static const uint8_t courR10L1_0xCA_BMP[] = { + 0x10, + 0x28, + 0x00, + 0xFE, + 0x42, + 0x42, + 0x48, + 0x78, + 0x48, + 0x42, + 0x42, + 0xFE +}; + +static const uint8_t courR10L1_0xCB_BMP[] = { + 0x6C, + 0x00, + 0xFE, + 0x42, + 0x42, + 0x48, + 0x78, + 0x48, + 0x42, + 0x42, + 0xFE +}; + +static const uint8_t courR10L1_0xCC_BMP[] = { + 0xC0, + 0x30, + 0x00, + 0xF8, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR10L1_0xCD_BMP[] = { + 0x18, + 0x60, + 0x00, + 0xF8, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR10L1_0xCE_BMP[] = { + 0x20, + 0x50, + 0x00, + 0xF8, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR10L1_0xCF_BMP[] = { + 0xD8, + 0x00, + 0xF8, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR10L1_0xD0_BMP[] = { + 0xFC, + 0x42, + 0x41, + 0x41, + 0xF1, + 0x41, + 0x41, + 0x42, + 0xFC +}; + +static const uint8_t courR10L1_0xD1_BMP[] = { + 0x1A, + 0x2C, + 0x00, + 0xE7, + 0x62, + 0x52, + 0x52, + 0x4A, + 0x4A, + 0x46, + 0x46, + 0xE2 +}; + +static const uint8_t courR10L1_0xD2_BMP[] = { + 0x30, + 0x0C, + 0x00, + 0x3C, + 0x42, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0xD3_BMP[] = { + 0x0C, + 0x30, + 0x00, + 0x3C, + 0x42, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0xD4_BMP[] = { + 0x10, + 0x28, + 0x00, + 0x3C, + 0x42, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0xD5_BMP[] = { + 0x1A, + 0x2C, + 0x00, + 0x3C, + 0x42, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0xD6_BMP[] = { + 0x66, + 0x00, + 0x3C, + 0x42, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0xD7_BMP[] = { + 0x82, + 0x44, + 0x28, + 0x10, + 0x28, + 0x44, + 0x82 +}; + +static const uint8_t courR10L1_0xD8_BMP[] = { + 0x1E, 0x80, + 0x21, 0x00, + 0x42, 0x80, + 0x44, 0x80, + 0x48, 0x80, + 0x50, 0x80, + 0x20, 0x80, + 0x61, 0x00, + 0x9E, 0x00 +}; + +static const uint8_t courR10L1_0xD9_BMP[] = { + 0x30, + 0x0C, + 0x00, + 0xE7, + 0x42, + 0x42, + 0x42, + 0x42, + 0x42, + 0x42, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0xDA_BMP[] = { + 0x0C, + 0x30, + 0x00, + 0xE7, + 0x42, + 0x42, + 0x42, + 0x42, + 0x42, + 0x42, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0xDB_BMP[] = { + 0x10, + 0x28, + 0x00, + 0xE7, + 0x42, + 0x42, + 0x42, + 0x42, + 0x42, + 0x42, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0xDC_BMP[] = { + 0x66, + 0x00, + 0xE7, + 0x42, + 0x42, + 0x42, + 0x42, + 0x42, + 0x42, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0xDD_BMP[] = { + 0x0C, + 0x30, + 0x00, + 0xEE, + 0x44, + 0x44, + 0x28, + 0x28, + 0x10, + 0x10, + 0x10, + 0x7C +}; + +static const uint8_t courR10L1_0xDE_BMP[] = { + 0xE0, + 0x40, + 0x7C, + 0x42, + 0x42, + 0x42, + 0x7C, + 0x40, + 0xE0 +}; + +static const uint8_t courR10L1_0xDF_BMP[] = { + 0x38, + 0x44, + 0x44, + 0x58, + 0x44, + 0x42, + 0x42, + 0x52, + 0xCC +}; + +static const uint8_t courR10L1_0xE0_BMP[] = { + 0x60, + 0x18, + 0x00, + 0x78, + 0x84, + 0x04, + 0x7C, + 0x84, + 0x8C, + 0x76 +}; + +static const uint8_t courR10L1_0xE1_BMP[] = { + 0x18, + 0x60, + 0x00, + 0x78, + 0x84, + 0x04, + 0x7C, + 0x84, + 0x8C, + 0x76 +}; + +static const uint8_t courR10L1_0xE2_BMP[] = { + 0x10, + 0x28, + 0x00, + 0x78, + 0x84, + 0x04, + 0x7C, + 0x84, + 0x8C, + 0x76 +}; + +static const uint8_t courR10L1_0xE3_BMP[] = { + 0x34, + 0x58, + 0x00, + 0x78, + 0x84, + 0x04, + 0x7C, + 0x84, + 0x8C, + 0x76 +}; + +static const uint8_t courR10L1_0xE4_BMP[] = { + 0x6C, + 0x00, + 0x78, + 0x84, + 0x04, + 0x7C, + 0x84, + 0x8C, + 0x76 +}; + +static const uint8_t courR10L1_0xE5_BMP[] = { + 0x30, + 0x48, + 0x30, + 0x78, + 0x84, + 0x04, + 0x7C, + 0x84, + 0x8C, + 0x76 +}; + +static const uint8_t courR10L1_0xE6_BMP[] = { + 0x76, + 0x89, + 0x09, + 0x7F, + 0x88, + 0x89, + 0x76 +}; + +static const uint8_t courR10L1_0xE7_BMP[] = { + 0x3A, + 0x46, + 0x82, + 0x80, + 0x80, + 0x42, + 0x3C, + 0x10, + 0x08, + 0x38 +}; + +static const uint8_t courR10L1_0xE8_BMP[] = { + 0x60, + 0x18, + 0x00, + 0x38, + 0x44, + 0x82, + 0xFE, + 0x80, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0xE9_BMP[] = { + 0x0C, + 0x30, + 0x00, + 0x38, + 0x44, + 0x82, + 0xFE, + 0x80, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0xEA_BMP[] = { + 0x10, + 0x28, + 0x00, + 0x38, + 0x44, + 0x82, + 0xFE, + 0x80, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0xEB_BMP[] = { + 0x6C, + 0x00, + 0x38, + 0x44, + 0x82, + 0xFE, + 0x80, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0xEC_BMP[] = { + 0xC0, + 0x30, + 0x00, + 0xE0, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR10L1_0xED_BMP[] = { + 0x30, + 0xC0, + 0x00, + 0xE0, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR10L1_0xEE_BMP[] = { + 0x20, + 0x50, + 0x00, + 0xE0, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR10L1_0xEF_BMP[] = { + 0xD8, + 0x00, + 0xE0, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR10L1_0xF0_BMP[] = { + 0x02, + 0xE4, + 0x18, + 0x28, + 0x44, + 0x3C, + 0x42, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0xF1_BMP[] = { + 0x1A, + 0x2C, + 0x00, + 0xDC, + 0x62, + 0x42, + 0x42, + 0x42, + 0x42, + 0xE7 +}; + +static const uint8_t courR10L1_0xF2_BMP[] = { + 0x30, + 0x0C, + 0x00, + 0x3C, + 0x42, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0xF3_BMP[] = { + 0x0C, + 0x30, + 0x00, + 0x3C, + 0x42, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0xF4_BMP[] = { + 0x10, + 0x28, + 0x00, + 0x3C, + 0x42, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0xF5_BMP[] = { + 0x1A, + 0x2C, + 0x00, + 0x3C, + 0x42, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0xF6_BMP[] = { + 0x6C, + 0x00, + 0x3C, + 0x42, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t courR10L1_0xF7_BMP[] = { + 0x18, + 0x18, + 0x00, + 0xFF, + 0x00, + 0x18, + 0x18 +}; + +static const uint8_t courR10L1_0xF8_BMP[] = { + 0x3D, + 0x46, + 0x89, + 0x91, + 0xA1, + 0x42, + 0xBC +}; + +static const uint8_t courR10L1_0xF9_BMP[] = { + 0x30, + 0x0C, + 0x00, + 0xC6, + 0x42, + 0x42, + 0x42, + 0x42, + 0x46, + 0x3B +}; + +static const uint8_t courR10L1_0xFA_BMP[] = { + 0x0C, + 0x30, + 0x00, + 0xC6, + 0x42, + 0x42, + 0x42, + 0x42, + 0x46, + 0x3B +}; + +static const uint8_t courR10L1_0xFB_BMP[] = { + 0x10, + 0x28, + 0x00, + 0xC6, + 0x42, + 0x42, + 0x42, + 0x42, + 0x46, + 0x3B +}; + +static const uint8_t courR10L1_0xFC_BMP[] = { + 0x6C, + 0x00, + 0xC6, + 0x42, + 0x42, + 0x42, + 0x42, + 0x46, + 0x3B +}; + +static const uint8_t courR10L1_0xFD_BMP[] = { + 0x06, + 0x18, + 0x00, + 0xE7, + 0x42, + 0x42, + 0x24, + 0x24, + 0x18, + 0x08, + 0x10, + 0x10, + 0x78 +}; + +static const uint8_t courR10L1_0xFE_BMP[] = { + 0xC0, + 0x40, + 0x5C, + 0x62, + 0x41, + 0x41, + 0x41, + 0x62, + 0x5C, + 0x40, + 0x40, + 0xF0 +}; + +static const uint8_t courR10L1_0xFF_BMP[] = { + 0x36, + 0x00, + 0xE7, + 0x42, + 0x42, + 0x24, + 0x24, + 0x18, + 0x08, + 0x10, + 0x10, + 0x78 +}; + +static const GFONT_CharInfo FontBMP[] = { + {9, 7, 9, 0, 0, courR10L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {9, 1, 1, 0, 0, courR10L1_0x20_BMP}, + {9, 1, 9, 3, 0, courR10L1_0x21_BMP}, + {9, 4, 4, 2, 6, courR10L1_0x22_BMP}, + {9, 5, 10, 2, -1, courR10L1_0x23_BMP}, + {9, 5, 13, 2, -2, courR10L1_0x24_BMP}, + {9, 8, 10, 0, 0, courR10L1_0x25_BMP}, + {9, 6, 8, 1, 0, courR10L1_0x26_BMP}, + {9, 1, 4, 3, 5, courR10L1_0x27_BMP}, + {9, 3, 12, 3, -2, courR10L1_0x28_BMP}, + {9, 3, 12, 2, -2, courR10L1_0x29_BMP}, + {9, 5, 6, 1, 3, courR10L1_0x2A_BMP}, + {9, 7, 7, 1, 1, courR10L1_0x2B_BMP}, + {9, 3, 4, 2, -2, courR10L1_0x2C_BMP}, + {9, 6, 1, 1, 4, courR10L1_0x2D_BMP}, + {9, 2, 2, 3, 0, courR10L1_0x2E_BMP}, + {9, 6, 11, 1, -1, courR10L1_0x2F_BMP}, + {9, 6, 10, 1, 0, courR10L1_0x30_BMP}, + {9, 5, 10, 1, 0, courR10L1_0x31_BMP}, + {9, 5, 10, 1, 0, courR10L1_0x32_BMP}, + {9, 6, 10, 1, 0, courR10L1_0x33_BMP}, + {9, 6, 10, 1, 0, courR10L1_0x34_BMP}, + {9, 6, 10, 1, 0, courR10L1_0x35_BMP}, + {9, 6, 10, 1, 0, courR10L1_0x36_BMP}, + {9, 6, 10, 1, 0, courR10L1_0x37_BMP}, + {9, 5, 10, 2, 0, courR10L1_0x38_BMP}, + {9, 6, 10, 1, 0, courR10L1_0x39_BMP}, + {9, 2, 7, 3, 0, courR10L1_0x3A_BMP}, + {9, 3, 9, 2, -2, courR10L1_0x3B_BMP}, + {9, 7, 7, 0, 1, courR10L1_0x3C_BMP}, + {9, 7, 3, 1, 3, courR10L1_0x3D_BMP}, + {9, 7, 7, 1, 1, courR10L1_0x3E_BMP}, + {9, 5, 9, 1, 0, courR10L1_0x3F_BMP}, + {9, 7, 10, 1, -1, courR10L1_0x40_BMP}, + {9, 9, 9, -1, 0, courR10L1_0x41_BMP}, + {9, 7, 9, 0, 0, courR10L1_0x42_BMP}, + {9, 7, 9, 1, 0, courR10L1_0x43_BMP}, + {9, 8, 9, 0, 0, courR10L1_0x44_BMP}, + {9, 7, 9, 1, 0, courR10L1_0x45_BMP}, + {9, 7, 9, 1, 0, courR10L1_0x46_BMP}, + {9, 8, 9, 0, 0, courR10L1_0x47_BMP}, + {9, 8, 9, 0, 0, courR10L1_0x48_BMP}, + {9, 5, 9, 2, 0, courR10L1_0x49_BMP}, + {9, 7, 9, 1, 0, courR10L1_0x4A_BMP}, + {9, 8, 9, 0, 0, courR10L1_0x4B_BMP}, + {9, 8, 9, 0, 0, courR10L1_0x4C_BMP}, + {9, 9, 9, 0, 0, courR10L1_0x4D_BMP}, + {9, 8, 9, 0, 0, courR10L1_0x4E_BMP}, + {9, 8, 9, 0, 0, courR10L1_0x4F_BMP}, + {9, 7, 9, 1, 0, courR10L1_0x50_BMP}, + {9, 8, 11, 0, -2, courR10L1_0x51_BMP}, + {9, 8, 9, 0, 0, courR10L1_0x52_BMP}, + {9, 6, 9, 1, 0, courR10L1_0x53_BMP}, + {9, 7, 9, 1, 0, courR10L1_0x54_BMP}, + {9, 8, 9, 0, 0, courR10L1_0x55_BMP}, + {9, 9, 9, 0, 0, courR10L1_0x56_BMP}, + {9, 9, 9, 0, 0, courR10L1_0x57_BMP}, + {9, 8, 9, 0, 0, courR10L1_0x58_BMP}, + {9, 7, 9, 0, 0, courR10L1_0x59_BMP}, + {9, 6, 9, 1, 0, courR10L1_0x5A_BMP}, + {9, 3, 12, 3, -2, courR10L1_0x5B_BMP}, + {9, 6, 11, 1, -1, courR10L1_0x5C_BMP}, + {9, 3, 12, 2, -2, courR10L1_0x5D_BMP}, + {9, 5, 5, 2, 4, courR10L1_0x5E_BMP}, + {9, 9, 1, 0, -3, courR10L1_0x5F_BMP}, + {9, 4, 2, 2, 8, courR10L1_0x60_BMP}, + {9, 7, 7, 1, 0, courR10L1_0x61_BMP}, + {9, 8, 10, 0, 0, courR10L1_0x62_BMP}, + {9, 7, 7, 1, 0, courR10L1_0x63_BMP}, + {9, 8, 10, 0, 0, courR10L1_0x64_BMP}, + {9, 7, 7, 1, 0, courR10L1_0x65_BMP}, + {9, 7, 10, 1, 0, courR10L1_0x66_BMP}, + {9, 8, 10, 0, -3, courR10L1_0x67_BMP}, + {9, 8, 10, 0, 0, courR10L1_0x68_BMP}, + {9, 5, 10, 2, 0, courR10L1_0x69_BMP}, + {9, 5, 13, 1, -3, courR10L1_0x6A_BMP}, + {9, 7, 10, 1, 0, courR10L1_0x6B_BMP}, + {9, 5, 10, 2, 0, courR10L1_0x6C_BMP}, + {9, 9, 7, 0, 0, courR10L1_0x6D_BMP}, + {9, 8, 7, 0, 0, courR10L1_0x6E_BMP}, + {9, 8, 7, 0, 0, courR10L1_0x6F_BMP}, + {9, 8, 10, 0, -3, courR10L1_0x70_BMP}, + {9, 8, 10, 0, -3, courR10L1_0x71_BMP}, + {9, 7, 7, 1, 0, courR10L1_0x72_BMP}, + {9, 6, 7, 1, 0, courR10L1_0x73_BMP}, + {9, 7, 9, 0, 0, courR10L1_0x74_BMP}, + {9, 8, 7, 0, 0, courR10L1_0x75_BMP}, + {9, 8, 7, 0, 0, courR10L1_0x76_BMP}, + {9, 9, 7, 0, 0, courR10L1_0x77_BMP}, + {9, 7, 7, 0, 0, courR10L1_0x78_BMP}, + {9, 8, 10, 0, -3, courR10L1_0x79_BMP}, + {9, 5, 7, 2, 0, courR10L1_0x7A_BMP}, + {9, 3, 12, 2, -2, courR10L1_0x7B_BMP}, + {9, 1, 11, 3, -2, courR10L1_0x7C_BMP}, + {9, 3, 12, 2, -2, courR10L1_0x7D_BMP}, + {9, 6, 2, 1, 3, courR10L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {9, 1, 1, 0, 0, courR10L1_0xA0_BMP}, + {9, 1, 9, 4, -2, courR10L1_0xA1_BMP}, + {9, 5, 9, 2, 0, courR10L1_0xA2_BMP}, + {9, 7, 9, 1, 0, courR10L1_0xA3_BMP}, + {9, 6, 6, 1, 1, courR10L1_0xA4_BMP}, + {9, 7, 9, 1, 0, courR10L1_0xA5_BMP}, + {9, 1, 11, 3, -2, courR10L1_0xA6_BMP}, + {9, 6, 10, 1, -1, courR10L1_0xA7_BMP}, + {9, 5, 1, 2, 8, courR10L1_0xA8_BMP}, + {9, 8, 9, 0, 0, courR10L1_0xA9_BMP}, + {9, 4, 6, 2, 3, courR10L1_0xAA_BMP}, + {9, 8, 7, 0, 0, courR10L1_0xAB_BMP}, + {9, 7, 3, 1, 3, courR10L1_0xAC_BMP}, + {9, 6, 1, 1, 4, courR10L1_0xAD_BMP}, + {9, 8, 9, 0, 0, courR10L1_0xAE_BMP}, + {9, 4, 1, 2, 8, courR10L1_0xAF_BMP}, + {9, 4, 4, 2, 6, courR10L1_0xB0_BMP}, + {9, 7, 7, 1, 1, courR10L1_0xB1_BMP}, + {9, 4, 6, 2, 4, courR10L1_0xB2_BMP}, + {9, 4, 6, 2, 4, courR10L1_0xB3_BMP}, + {9, 4, 2, 2, 8, courR10L1_0xB4_BMP}, + {9, 8, 10, 0, -3, courR10L1_0xB5_BMP}, + {9, 7, 10, 1, -1, courR10L1_0xB6_BMP}, + {9, 2, 2, 3, 3, courR10L1_0xB7_BMP}, + {9, 3, 3, 2, -3, courR10L1_0xB8_BMP}, + {9, 3, 6, 3, 4, courR10L1_0xB9_BMP}, + {9, 4, 6, 2, 3, courR10L1_0xBA_BMP}, + {9, 8, 7, 0, 0, courR10L1_0xBB_BMP}, + {9, 10, 10, -1, 0, courR10L1_0xBC_BMP}, + {9, 10, 10, -1, 0, courR10L1_0xBD_BMP}, + {9, 10, 10, -1, 0, courR10L1_0xBE_BMP}, + {9, 5, 9, 2, -2, courR10L1_0xBF_BMP}, + {9, 9, 12, 0, 0, courR10L1_0xC0_BMP}, + {9, 9, 12, 0, 0, courR10L1_0xC1_BMP}, + {9, 9, 12, 0, 0, courR10L1_0xC2_BMP}, + {9, 9, 12, 0, 0, courR10L1_0xC3_BMP}, + {9, 9, 11, 0, 0, courR10L1_0xC4_BMP}, + {9, 9, 12, 0, 0, courR10L1_0xC5_BMP}, + {9, 9, 9, -1, 0, courR10L1_0xC6_BMP}, + {9, 7, 12, 1, -3, courR10L1_0xC7_BMP}, + {9, 7, 12, 1, 0, courR10L1_0xC8_BMP}, + {9, 7, 12, 1, 0, courR10L1_0xC9_BMP}, + {9, 7, 12, 1, 0, courR10L1_0xCA_BMP}, + {9, 7, 11, 1, 0, courR10L1_0xCB_BMP}, + {9, 5, 12, 2, 0, courR10L1_0xCC_BMP}, + {9, 5, 12, 2, 0, courR10L1_0xCD_BMP}, + {9, 5, 12, 2, 0, courR10L1_0xCE_BMP}, + {9, 5, 11, 2, 0, courR10L1_0xCF_BMP}, + {9, 8, 9, 0, 0, courR10L1_0xD0_BMP}, + {9, 8, 12, 0, 0, courR10L1_0xD1_BMP}, + {9, 8, 12, 0, 0, courR10L1_0xD2_BMP}, + {9, 8, 12, 0, 0, courR10L1_0xD3_BMP}, + {9, 8, 12, 0, 0, courR10L1_0xD4_BMP}, + {9, 8, 12, 0, 0, courR10L1_0xD5_BMP}, + {9, 8, 11, 0, 0, courR10L1_0xD6_BMP}, + {9, 7, 7, 1, 1, courR10L1_0xD7_BMP}, + {9, 9, 9, -1, 0, courR10L1_0xD8_BMP}, + {9, 8, 12, 0, 0, courR10L1_0xD9_BMP}, + {9, 8, 12, 0, 0, courR10L1_0xDA_BMP}, + {9, 8, 12, 0, 0, courR10L1_0xDB_BMP}, + {9, 8, 11, 0, 0, courR10L1_0xDC_BMP}, + {9, 7, 12, 1, 0, courR10L1_0xDD_BMP}, + {9, 7, 9, 0, 0, courR10L1_0xDE_BMP}, + {9, 7, 9, 0, 0, courR10L1_0xDF_BMP}, + {9, 7, 10, 1, 0, courR10L1_0xE0_BMP}, + {9, 7, 10, 1, 0, courR10L1_0xE1_BMP}, + {9, 7, 10, 1, 0, courR10L1_0xE2_BMP}, + {9, 7, 10, 1, 0, courR10L1_0xE3_BMP}, + {9, 7, 9, 1, 0, courR10L1_0xE4_BMP}, + {9, 7, 10, 1, 0, courR10L1_0xE5_BMP}, + {9, 8, 7, 0, 0, courR10L1_0xE6_BMP}, + {9, 7, 10, 1, -3, courR10L1_0xE7_BMP}, + {9, 7, 10, 1, 0, courR10L1_0xE8_BMP}, + {9, 7, 10, 1, 0, courR10L1_0xE9_BMP}, + {9, 7, 10, 1, 0, courR10L1_0xEA_BMP}, + {9, 7, 9, 1, 0, courR10L1_0xEB_BMP}, + {9, 5, 10, 2, 0, courR10L1_0xEC_BMP}, + {9, 5, 10, 2, 0, courR10L1_0xED_BMP}, + {9, 5, 10, 2, 0, courR10L1_0xEE_BMP}, + {9, 5, 9, 2, 0, courR10L1_0xEF_BMP}, + {9, 8, 12, 0, 0, courR10L1_0xF0_BMP}, + {9, 8, 10, 0, 0, courR10L1_0xF1_BMP}, + {9, 8, 10, 0, 0, courR10L1_0xF2_BMP}, + {9, 8, 10, 0, 0, courR10L1_0xF3_BMP}, + {9, 8, 10, 0, 0, courR10L1_0xF4_BMP}, + {9, 8, 10, 0, 0, courR10L1_0xF5_BMP}, + {9, 8, 9, 0, 0, courR10L1_0xF6_BMP}, + {9, 8, 7, 0, 1, courR10L1_0xF7_BMP}, + {9, 8, 7, 0, 0, courR10L1_0xF8_BMP}, + {9, 8, 10, 0, 0, courR10L1_0xF9_BMP}, + {9, 8, 10, 0, 0, courR10L1_0xFA_BMP}, + {9, 8, 10, 0, 0, courR10L1_0xFB_BMP}, + {9, 8, 9, 0, 0, courR10L1_0xFC_BMP}, + {9, 8, 13, 0, -3, courR10L1_0xFD_BMP}, + {9, 8, 12, 0, -3, courR10L1_0xFE_BMP}, + {9, 8, 12, 0, -3, courR10L1_0xFF_BMP} +}; + + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontCour10Normal_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontCour10Normal_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontCour10Normal_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontCour10Normal_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontCour10Normal_GetFontChar, + McuFontCour10Normal_FBBy, + McuFontCour10Normal_GetUnderlineBoxHeight(), + McuFontCour10Normal_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour10Normal_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour10Normal_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour10Normal_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour10Normal_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontCour10Normal. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour10Normal.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour10Normal.h new file mode 100644 index 0000000..df0c364 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour10Normal.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour10Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour10Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 10 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour10Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour10Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour10Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour10Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour10Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontCour10Normal_Deinit(void); +** Init - void McuFontCour10Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour10Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour10Normal_module McuFontCour10Normal module documentation +** @{ +*/ + + +#ifndef __McuFontCour10Normal_H +#define __McuFontCour10Normal_H + +/* MODULE McuFontCour10Normal. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontCour10Normalconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontCour10Normal_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontCour10Normal_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontCour10Normal_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontCour10Normal_GetLineSpaceHeight() \ + 1 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontCour10Normal_GetUnderlineBoxHeight() \ + 3 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontCour10Normal_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontCour10Normal_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontCour10Normal. */ + +#endif +/* ifndef __McuFontCour10Normal_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour12Bold.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour12Bold.c new file mode 100644 index 0000000..94a556b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour12Bold.c @@ -0,0 +1,3014 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour12Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour12Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 12 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour12Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour12Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour12Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour12Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour12Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontCour12Bold_Deinit(void); +** Init - void McuFontCour12Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour12Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour12Bold_module McuFontCour12Bold module documentation +** @{ +*/ + +/* MODULE McuFontCour12Bold. */ + +#include "McuFontCour12Bold.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontCour12Bold_FBBy 17 + +static const uint8_t courB12L1_0x00_BMP[] = { + 0xAA, 0x80, + 0x00, 0x00, + 0x80, 0x80, + 0x00, 0x00, + 0x80, 0x80, + 0x00, 0x00, + 0x80, 0x80, + 0x00, 0x00, + 0xAA, 0x80 +}; + +static const uint8_t courB12L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t courB12L1_0x21_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x00, + 0xC0, + 0xC0 +}; + +static const uint8_t courB12L1_0x22_BMP[] = { + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0xCC +}; + +static const uint8_t courB12L1_0x23_BMP[] = { + 0x36, 0x00, + 0x36, 0x00, + 0x36, 0x00, + 0x36, 0x00, + 0xFF, 0x80, + 0x36, 0x00, + 0x36, 0x00, + 0xFF, 0x80, + 0x36, 0x00, + 0x36, 0x00, + 0x36, 0x00, + 0x36, 0x00 +}; + +static const uint8_t courB12L1_0x24_BMP[] = { + 0x18, + 0x18, + 0x7E, + 0xC6, + 0xC0, + 0xE0, + 0x7C, + 0x0E, + 0x06, + 0xC6, + 0xFC, + 0x30, + 0x30 +}; + +static const uint8_t courB12L1_0x25_BMP[] = { + 0x78, + 0xCC, + 0xCC, + 0x78, + 0x07, + 0x3C, + 0xE0, + 0x1E, + 0x33, + 0x33, + 0x1E +}; + +static const uint8_t courB12L1_0x26_BMP[] = { + 0x38, + 0x6C, + 0x60, + 0x30, + 0x76, + 0xDE, + 0xCC, + 0xCC, + 0x7E +}; + +static const uint8_t courB12L1_0x27_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t courB12L1_0x28_BMP[] = { + 0x30, + 0x60, + 0x60, + 0x60, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x60, + 0x60, + 0x60, + 0x30 +}; + +static const uint8_t courB12L1_0x29_BMP[] = { + 0xC0, + 0x60, + 0x60, + 0x60, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x60, + 0x60, + 0x60, + 0xC0 +}; + +static const uint8_t courB12L1_0x2A_BMP[] = { + 0x18, + 0x18, + 0xFF, + 0x3C, + 0x3C, + 0x66 +}; + +static const uint8_t courB12L1_0x2B_BMP[] = { + 0x18, + 0x18, + 0x18, + 0xFF, + 0xFF, + 0x18, + 0x18, + 0x18 +}; + +static const uint8_t courB12L1_0x2C_BMP[] = { + 0xE0, + 0xE0, + 0x60, + 0xC0, + 0x80 +}; + +static const uint8_t courB12L1_0x2D_BMP[] = { + 0xFE, + 0xFE +}; + +static const uint8_t courB12L1_0x2E_BMP[] = { + 0xE0, + 0xE0 +}; + +static const uint8_t courB12L1_0x2F_BMP[] = { + 0x06, + 0x06, + 0x0C, + 0x0C, + 0x0C, + 0x18, + 0x18, + 0x30, + 0x30, + 0x30, + 0x60, + 0x60, + 0xC0, + 0xC0 +}; + +static const uint8_t courB12L1_0x30_BMP[] = { + 0x3C, + 0x66, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x66, + 0x3C +}; + +static const uint8_t courB12L1_0x31_BMP[] = { + 0x18, + 0x78, + 0xD8, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF +}; + +static const uint8_t courB12L1_0x32_BMP[] = { + 0x78, + 0xCC, + 0x86, + 0x06, + 0x06, + 0x0C, + 0x18, + 0x30, + 0x60, + 0xC6, + 0xFE +}; + +static const uint8_t courB12L1_0x33_BMP[] = { + 0x78, + 0xCC, + 0x86, + 0x0C, + 0x38, + 0x0C, + 0x06, + 0x06, + 0x86, + 0xCC, + 0x78 +}; + +static const uint8_t courB12L1_0x34_BMP[] = { + 0x06, + 0x0E, + 0x1E, + 0x36, + 0x66, + 0x46, + 0xC6, + 0xFF, + 0x06, + 0x06, + 0x1F +}; + +static const uint8_t courB12L1_0x35_BMP[] = { + 0xFE, + 0xC0, + 0xC0, + 0xC0, + 0xFC, + 0xC6, + 0x06, + 0x06, + 0x06, + 0xCC, + 0xF8 +}; + +static const uint8_t courB12L1_0x36_BMP[] = { + 0x1E, + 0x70, + 0x60, + 0xC0, + 0xDC, + 0xE6, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t courB12L1_0x37_BMP[] = { + 0xFE, + 0xC6, + 0x06, + 0x0C, + 0x0C, + 0x18, + 0x18, + 0x18, + 0x30, + 0x30, + 0x30 +}; + +static const uint8_t courB12L1_0x38_BMP[] = { + 0x38, + 0x6C, + 0xC6, + 0x44, + 0x38, + 0x6C, + 0xC6, + 0xC6, + 0xC6, + 0x6C, + 0x38 +}; + +static const uint8_t courB12L1_0x39_BMP[] = { + 0x3C, + 0x66, + 0xC3, + 0xC3, + 0x67, + 0x3B, + 0x03, + 0x03, + 0x06, + 0x0E, + 0x78 +}; + +static const uint8_t courB12L1_0x3A_BMP[] = { + 0xE0, + 0xE0, + 0x00, + 0x00, + 0x00, + 0xE0, + 0xE0 +}; + +static const uint8_t courB12L1_0x3B_BMP[] = { + 0xE0, + 0xE0, + 0x00, + 0x00, + 0x00, + 0xE0, + 0xE0, + 0x60, + 0xC0, + 0x80 +}; + +static const uint8_t courB12L1_0x3C_BMP[] = { + 0x01, 0x80, + 0x07, 0x80, + 0x1E, 0x00, + 0x78, 0x00, + 0xE0, 0x00, + 0x78, 0x00, + 0x1E, 0x00, + 0x07, 0x80, + 0x01, 0x80 +}; + +static const uint8_t courB12L1_0x3D_BMP[] = { + 0xFF, 0x80, + 0xFF, 0x80, + 0x00, 0x00, + 0xFF, 0x80, + 0xFF, 0x80 +}; + +static const uint8_t courB12L1_0x3E_BMP[] = { + 0xC0, 0x00, + 0xF0, 0x00, + 0x3C, 0x00, + 0x0F, 0x00, + 0x03, 0x80, + 0x0F, 0x00, + 0x3C, 0x00, + 0xF0, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t courB12L1_0x3F_BMP[] = { + 0x7C, + 0xC6, + 0xC6, + 0x06, + 0x1C, + 0x30, + 0x30, + 0x00, + 0x30, + 0x30 +}; + +static const uint8_t courB12L1_0x40_BMP[] = { + 0x3E, 0x00, + 0x63, 0x00, + 0xC1, 0x80, + 0xDD, 0x80, + 0xB2, 0x80, + 0xB2, 0x80, + 0xB2, 0x80, + 0xB2, 0x80, + 0xDF, 0x00, + 0xC0, 0x00, + 0x63, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courB12L1_0x41_BMP[] = { + 0x3C, 0x00, + 0x0C, 0x00, + 0x1E, 0x00, + 0x12, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x3F, 0x00, + 0x61, 0x80, + 0x61, 0x80, + 0xF3, 0xC0 +}; + +static const uint8_t courB12L1_0x42_BMP[] = { + 0xFE, 0x00, + 0x63, 0x00, + 0x61, 0x80, + 0x63, 0x00, + 0x7E, 0x00, + 0x63, 0x00, + 0x61, 0x80, + 0x61, 0x80, + 0x63, 0x00, + 0xFE, 0x00 +}; + +static const uint8_t courB12L1_0x43_BMP[] = { + 0x1E, 0x80, + 0x73, 0x80, + 0x61, 0x80, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0x61, 0x80, + 0x73, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t courB12L1_0x44_BMP[] = { + 0xFC, 0x00, + 0x67, 0x00, + 0x63, 0x00, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x63, 0x00, + 0x67, 0x00, + 0xFC, 0x00 +}; + +static const uint8_t courB12L1_0x45_BMP[] = { + 0xFF, + 0x63, + 0x60, + 0x64, + 0x7C, + 0x64, + 0x60, + 0x63, + 0x63, + 0xFF +}; + +static const uint8_t courB12L1_0x46_BMP[] = { + 0xFF, + 0x63, + 0x60, + 0x64, + 0x7C, + 0x64, + 0x60, + 0x60, + 0x60, + 0xF8 +}; + +static const uint8_t courB12L1_0x47_BMP[] = { + 0x1E, 0x80, + 0x73, 0x80, + 0x61, 0x80, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC7, 0xC0, + 0xC1, 0x80, + 0x61, 0x80, + 0x71, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t courB12L1_0x48_BMP[] = { + 0xF7, 0x80, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x7F, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0xF7, 0x80 +}; + +static const uint8_t courB12L1_0x49_BMP[] = { + 0xFF, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF +}; + +static const uint8_t courB12L1_0x4A_BMP[] = { + 0x3F, 0x80, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0xC6, 0x00, + 0xC6, 0x00, + 0xC6, 0x00, + 0x7C, 0x00 +}; + +static const uint8_t courB12L1_0x4B_BMP[] = { + 0xF7, 0x80, + 0x63, 0x00, + 0x66, 0x00, + 0x6C, 0x00, + 0x78, 0x00, + 0x7C, 0x00, + 0x66, 0x00, + 0x66, 0x00, + 0x63, 0x00, + 0xFB, 0x80 +}; + +static const uint8_t courB12L1_0x4C_BMP[] = { + 0xFC, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x31, 0x80, + 0x31, 0x80, + 0x31, 0x80, + 0xFF, 0x80 +}; + +static const uint8_t courB12L1_0x4D_BMP[] = { + 0xE1, 0xC0, + 0x61, 0x80, + 0x73, 0x80, + 0x73, 0x80, + 0x7F, 0x80, + 0x6D, 0x80, + 0x6D, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0xF3, 0xC0 +}; + +static const uint8_t courB12L1_0x4E_BMP[] = { + 0xF7, 0xC0, + 0x71, 0x80, + 0x79, 0x80, + 0x69, 0x80, + 0x6D, 0x80, + 0x6D, 0x80, + 0x65, 0x80, + 0x67, 0x80, + 0x63, 0x80, + 0xFB, 0x80 +}; + +static const uint8_t courB12L1_0x4F_BMP[] = { + 0x3E, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x00, + 0x63, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courB12L1_0x50_BMP[] = { + 0xFE, 0x00, + 0x63, 0x00, + 0x61, 0x80, + 0x61, 0x80, + 0x63, 0x00, + 0x7E, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0xFC, 0x00 +}; + +static const uint8_t courB12L1_0x51_BMP[] = { + 0x3E, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x00, + 0x63, 0x00, + 0x3E, 0x00, + 0x19, 0x80, + 0x3F, 0x00 +}; + +static const uint8_t courB12L1_0x52_BMP[] = { + 0xFC, 0x00, + 0x66, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x66, 0x00, + 0x7C, 0x00, + 0x66, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0xFB, 0x80 +}; + +static const uint8_t courB12L1_0x53_BMP[] = { + 0x3D, + 0x67, + 0xC3, + 0xE0, + 0x78, + 0x1E, + 0x07, + 0xC3, + 0xE6, + 0xBC +}; + +static const uint8_t courB12L1_0x54_BMP[] = { + 0xFF, + 0x99, + 0x99, + 0x99, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x7E +}; + +static const uint8_t courB12L1_0x55_BMP[] = { + 0xF3, 0xC0, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x33, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t courB12L1_0x56_BMP[] = { + 0xF3, 0xC0, + 0x61, 0x80, + 0x61, 0x80, + 0x33, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x0C, 0x00, + 0x0C, 0x00 +}; + +static const uint8_t courB12L1_0x57_BMP[] = { + 0xF3, 0xC0, + 0x61, 0x80, + 0x6D, 0x80, + 0x6D, 0x80, + 0x6D, 0x80, + 0x3F, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x33, 0x00 +}; + +static const uint8_t courB12L1_0x58_BMP[] = { + 0xF3, 0xC0, + 0x61, 0x80, + 0x33, 0x00, + 0x1E, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x1E, 0x00, + 0x33, 0x00, + 0x61, 0x80, + 0xF3, 0xC0 +}; + +static const uint8_t courB12L1_0x59_BMP[] = { + 0xF3, 0xC0, + 0x61, 0x80, + 0x33, 0x00, + 0x33, 0x00, + 0x1E, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x3F, 0x00 +}; + +static const uint8_t courB12L1_0x5A_BMP[] = { + 0xFE, + 0xC6, + 0xCC, + 0x1C, + 0x18, + 0x30, + 0x70, + 0x66, + 0xC6, + 0xFE +}; + +static const uint8_t courB12L1_0x5B_BMP[] = { + 0xF0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xF0 +}; + +static const uint8_t courB12L1_0x5C_BMP[] = { + 0xC0, + 0xC0, + 0x60, + 0x60, + 0x60, + 0x30, + 0x30, + 0x38, + 0x18, + 0x18, + 0x0C, + 0x0C, + 0x06, + 0x06 +}; + +static const uint8_t courB12L1_0x5D_BMP[] = { + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xF0 +}; + +static const uint8_t courB12L1_0x5E_BMP[] = { + 0x18, + 0x3C, + 0x66, + 0xC3 +}; + +static const uint8_t courB12L1_0x5F_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB12L1_0x60_BMP[] = { + 0xC0, + 0x60, + 0x30 +}; + +static const uint8_t courB12L1_0x61_BMP[] = { + 0x3C, + 0x66, + 0x06, + 0x7E, + 0xC6, + 0xC6, + 0x7B +}; + +static const uint8_t courB12L1_0x62_BMP[] = { + 0xE0, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0x6E, 0x00, + 0x73, 0x00, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x73, 0x00, + 0xEE, 0x00 +}; + +static const uint8_t courB12L1_0x63_BMP[] = { + 0x3D, + 0x67, + 0xC3, + 0xC0, + 0xC0, + 0x63, + 0x3E +}; + +static const uint8_t courB12L1_0x64_BMP[] = { + 0x07, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x3B, 0x00, + 0x67, 0x00, + 0xC3, 0x00, + 0xC3, 0x00, + 0xC3, 0x00, + 0x67, 0x00, + 0x3B, 0x80 +}; + +static const uint8_t courB12L1_0x65_BMP[] = { + 0x3C, + 0x66, + 0xC3, + 0xFF, + 0xC0, + 0x63, + 0x3E +}; + +static const uint8_t courB12L1_0x66_BMP[] = { + 0x1E, + 0x33, + 0x30, + 0x30, + 0xFE, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xFE +}; + +static const uint8_t courB12L1_0x67_BMP[] = { + 0x3B, 0x80, + 0x67, 0x00, + 0xC3, 0x00, + 0xC3, 0x00, + 0xC3, 0x00, + 0x67, 0x00, + 0x3B, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courB12L1_0x68_BMP[] = { + 0xE0, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0x6E, 0x00, + 0x73, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0xF7, 0x80 +}; + +static const uint8_t courB12L1_0x69_BMP[] = { + 0x18, + 0x18, + 0x00, + 0x78, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF +}; + +static const uint8_t courB12L1_0x6A_BMP[] = { + 0x18, + 0x18, + 0x00, + 0xFC, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0xF8 +}; + +static const uint8_t courB12L1_0x6B_BMP[] = { + 0xE0, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0x6F, 0x80, + 0x66, 0x00, + 0x6C, 0x00, + 0x78, 0x00, + 0x6C, 0x00, + 0x66, 0x00, + 0xEF, 0x80 +}; + +static const uint8_t courB12L1_0x6C_BMP[] = { + 0x78, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF +}; + +static const uint8_t courB12L1_0x6D_BMP[] = { + 0xED, 0x80, + 0x7F, 0x80, + 0x6D, 0x80, + 0x6D, 0x80, + 0x6D, 0x80, + 0x6D, 0x80, + 0xED, 0xC0 +}; + +static const uint8_t courB12L1_0x6E_BMP[] = { + 0xEE, 0x00, + 0x73, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0xF7, 0x80 +}; + +static const uint8_t courB12L1_0x6F_BMP[] = { + 0x3C, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t courB12L1_0x70_BMP[] = { + 0xEE, 0x00, + 0x73, 0x00, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x73, 0x00, + 0x6E, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0xF8, 0x00 +}; + +static const uint8_t courB12L1_0x71_BMP[] = { + 0x3B, 0x80, + 0x67, 0x00, + 0xC3, 0x00, + 0xC3, 0x00, + 0xC3, 0x00, + 0x67, 0x00, + 0x3B, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x0F, 0x80 +}; + +static const uint8_t courB12L1_0x72_BMP[] = { + 0xF7, 0x00, + 0x39, 0x80, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0xFE, 0x00 +}; + +static const uint8_t courB12L1_0x73_BMP[] = { + 0x7E, + 0xC6, + 0xE0, + 0x7C, + 0x0E, + 0xC6, + 0xFC +}; + +static const uint8_t courB12L1_0x74_BMP[] = { + 0x30, 0x00, + 0x30, 0x00, + 0xFF, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x31, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t courB12L1_0x75_BMP[] = { + 0xE7, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x67, 0x00, + 0x3B, 0x80 +}; + +static const uint8_t courB12L1_0x76_BMP[] = { + 0xF3, 0xC0, + 0x61, 0x80, + 0x33, 0x00, + 0x33, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x0C, 0x00 +}; + +static const uint8_t courB12L1_0x77_BMP[] = { + 0xF3, 0xC0, + 0x61, 0x80, + 0x6D, 0x80, + 0x2D, 0x00, + 0x3F, 0x00, + 0x33, 0x00, + 0x33, 0x00 +}; + +static const uint8_t courB12L1_0x78_BMP[] = { + 0xE7, + 0x66, + 0x3C, + 0x18, + 0x3C, + 0x66, + 0xE7 +}; + +static const uint8_t courB12L1_0x79_BMP[] = { + 0xF3, 0xC0, + 0x61, 0x80, + 0x33, 0x00, + 0x33, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x0C, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x7C, 0x00 +}; + +static const uint8_t courB12L1_0x7A_BMP[] = { + 0xFE, + 0xCC, + 0x18, + 0x30, + 0x60, + 0xC6, + 0xFE +}; + +static const uint8_t courB12L1_0x7B_BMP[] = { + 0x30, + 0x60, + 0x60, + 0x60, + 0x60, + 0x40, + 0xC0, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x30 +}; + +static const uint8_t courB12L1_0x7C_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t courB12L1_0x7D_BMP[] = { + 0xC0, + 0x60, + 0x60, + 0x60, + 0x60, + 0x20, + 0x30, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0xC0 +}; + +static const uint8_t courB12L1_0x7E_BMP[] = { + 0x70, + 0xDB, + 0x0E +}; + +static const uint8_t courB12L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t courB12L1_0xA1_BMP[] = { + 0xC0, + 0xC0, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t courB12L1_0xA2_BMP[] = { + 0x18, + 0x18, + 0x3E, + 0x66, + 0xC0, + 0xC0, + 0x66, + 0x3C, + 0x18, + 0x18 +}; + +static const uint8_t courB12L1_0xA3_BMP[] = { + 0x1E, + 0x33, + 0x30, + 0x30, + 0xFC, + 0xFC, + 0x30, + 0x33, + 0xE3, + 0xFE +}; + +static const uint8_t courB12L1_0xA4_BMP[] = { + 0xC3, + 0x7E, + 0x66, + 0x42, + 0x66, + 0x7E, + 0xC3 +}; + +static const uint8_t courB12L1_0xA5_BMP[] = { + 0xF3, 0xC0, + 0x61, 0x80, + 0x33, 0x00, + 0x33, 0x00, + 0x1E, 0x00, + 0x3F, 0x00, + 0x0C, 0x00, + 0x3F, 0x00, + 0x0C, 0x00, + 0x3F, 0x00 +}; + +static const uint8_t courB12L1_0xA6_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t courB12L1_0xA7_BMP[] = { + 0x1F, 0x80, + 0x31, 0x80, + 0x31, 0x80, + 0x78, 0x00, + 0xCE, 0x00, + 0xC3, 0x80, + 0x70, 0xC0, + 0x1C, 0xC0, + 0x07, 0x80, + 0x63, 0x00, + 0x63, 0x00, + 0x7E, 0x00 +}; + +static const uint8_t courB12L1_0xA8_BMP[] = { + 0xD8, + 0xD8 +}; + +static const uint8_t courB12L1_0xA9_BMP[] = { + 0x0C, 0x00, + 0x3F, 0x00, + 0x61, 0x80, + 0x4E, 0x80, + 0xD8, 0xC0, + 0xD8, 0xC0, + 0x4E, 0x80, + 0x61, 0x80, + 0x3F, 0x00, + 0x0C, 0x00 +}; + +static const uint8_t courB12L1_0xAA_BMP[] = { + 0x78, + 0x0C, + 0x7C, + 0xCC, + 0x7C, + 0x00, + 0xFC +}; + +static const uint8_t courB12L1_0xAB_BMP[] = { + 0x19, 0x80, + 0x33, 0x00, + 0x66, 0x00, + 0xCC, 0x00, + 0x66, 0x00, + 0x33, 0x00, + 0x19, 0x80 +}; + +static const uint8_t courB12L1_0xAC_BMP[] = { + 0xFF, + 0xFF, + 0x03, + 0x03, + 0x03 +}; + +static const uint8_t courB12L1_0xAD_BMP[] = { + 0xFE, + 0xFE +}; + +static const uint8_t courB12L1_0xAE_BMP[] = { + 0x0C, 0x00, + 0x3F, 0x00, + 0x61, 0x80, + 0x5C, 0x80, + 0xD6, 0xC0, + 0xDC, 0xC0, + 0x52, 0x80, + 0x61, 0x80, + 0x3F, 0x00, + 0x0C, 0x00 +}; + +static const uint8_t courB12L1_0xAF_BMP[] = { + 0xF8 +}; + +static const uint8_t courB12L1_0xB0_BMP[] = { + 0x70, + 0xD8, + 0x88, + 0xD8, + 0x70 +}; + +static const uint8_t courB12L1_0xB1_BMP[] = { + 0x18, + 0x18, + 0xFF, + 0xFF, + 0x18, + 0x18, + 0x00, + 0xFF, + 0xFF +}; + +static const uint8_t courB12L1_0xB2_BMP[] = { + 0x70, + 0xD8, + 0x30, + 0x60, + 0xC8, + 0xF8 +}; + +static const uint8_t courB12L1_0xB3_BMP[] = { + 0x70, + 0xD8, + 0x30, + 0x18, + 0xD8, + 0x70 +}; + +static const uint8_t courB12L1_0xB4_BMP[] = { + 0x30, + 0x60, + 0xC0 +}; + +static const uint8_t courB12L1_0xB5_BMP[] = { + 0xE7, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x67, 0x00, + 0x7B, 0x80, + 0x60, 0x00, + 0x60, 0x00, + 0x60, 0x00 +}; + +static const uint8_t courB12L1_0xB6_BMP[] = { + 0x3F, 0x80, + 0x5B, 0x00, + 0xDB, 0x00, + 0xDB, 0x00, + 0xDB, 0x00, + 0x5B, 0x00, + 0x3B, 0x00, + 0x1B, 0x00, + 0x1B, 0x00, + 0x1B, 0x00, + 0x1B, 0x00, + 0x3F, 0x80 +}; + +static const uint8_t courB12L1_0xB7_BMP[] = { + 0xE0, + 0xE0 +}; + +static const uint8_t courB12L1_0xB8_BMP[] = { + 0x20, + 0x60, + 0x30, + 0xF0 +}; + +static const uint8_t courB12L1_0xB9_BMP[] = { + 0x30, + 0xF0, + 0x30, + 0x30, + 0x30, + 0xFC +}; + +static const uint8_t courB12L1_0xBA_BMP[] = { + 0x78, + 0xCC, + 0xCC, + 0xCC, + 0x78, + 0x00, + 0xFC +}; + +static const uint8_t courB12L1_0xBB_BMP[] = { + 0xCC, 0x00, + 0x66, 0x00, + 0x33, 0x00, + 0x19, 0x80, + 0x33, 0x00, + 0x66, 0x00, + 0xCC, 0x00 +}; + +static const uint8_t courB12L1_0xBC_BMP[] = { + 0x20, 0x00, + 0xE1, 0x00, + 0x63, 0x00, + 0x62, 0x00, + 0x66, 0x00, + 0xFC, 0x80, + 0x19, 0x80, + 0x13, 0x80, + 0x36, 0x80, + 0x6F, 0xC0, + 0x41, 0x80 +}; + +static const uint8_t courB12L1_0xBD_BMP[] = { + 0x20, 0x00, + 0xE0, 0x80, + 0x61, 0x80, + 0x63, 0x00, + 0x66, 0x00, + 0xFF, 0x80, + 0x0A, 0xC0, + 0x19, 0x80, + 0x33, 0x00, + 0x66, 0x40, + 0x47, 0xC0 +}; + +static const uint8_t courB12L1_0xBE_BMP[] = { + 0x70, 0x00, + 0xD8, 0x80, + 0x31, 0x80, + 0x1B, 0x00, + 0xDA, 0x00, + 0x76, 0x40, + 0x0C, 0xC0, + 0x09, 0xC0, + 0x1B, 0x40, + 0x37, 0xE0, + 0x20, 0xC0 +}; + +static const uint8_t courB12L1_0xBF_BMP[] = { + 0x18, + 0x18, + 0x00, + 0x18, + 0x18, + 0x70, + 0xC0, + 0xC6, + 0xC6, + 0x7C +}; + +static const uint8_t courB12L1_0xC0_BMP[] = { + 0x30, 0x00, + 0x18, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x3C, 0x00, + 0x0C, 0x00, + 0x1E, 0x00, + 0x12, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x3F, 0x00, + 0x61, 0x80, + 0x61, 0x80, + 0xF3, 0xC0 +}; + +static const uint8_t courB12L1_0xC1_BMP[] = { + 0x06, 0x00, + 0x0C, 0x00, + 0x18, 0x00, + 0x00, 0x00, + 0x3C, 0x00, + 0x0C, 0x00, + 0x1E, 0x00, + 0x12, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x3F, 0x00, + 0x61, 0x80, + 0x61, 0x80, + 0xF3, 0xC0 +}; + +static const uint8_t courB12L1_0xC2_BMP[] = { + 0x0C, 0x00, + 0x1E, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0x3C, 0x00, + 0x0C, 0x00, + 0x1E, 0x00, + 0x12, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x3F, 0x00, + 0x61, 0x80, + 0x61, 0x80, + 0xF3, 0xC0 +}; + +static const uint8_t courB12L1_0xC3_BMP[] = { + 0x3B, 0x00, + 0x6E, 0x00, + 0x00, 0x00, + 0x3C, 0x00, + 0x0C, 0x00, + 0x1E, 0x00, + 0x12, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x3F, 0x00, + 0x61, 0x80, + 0x61, 0x80, + 0xF3, 0xC0 +}; + +static const uint8_t courB12L1_0xC4_BMP[] = { + 0x36, 0x00, + 0x36, 0x00, + 0x00, 0x00, + 0x3C, 0x00, + 0x0C, 0x00, + 0x1E, 0x00, + 0x12, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x3F, 0x00, + 0x61, 0x80, + 0x61, 0x80, + 0xF3, 0xC0 +}; + +static const uint8_t courB12L1_0xC5_BMP[] = { + 0x1C, 0x00, + 0x36, 0x00, + 0x36, 0x00, + 0x1C, 0x00, + 0x3C, 0x00, + 0x0C, 0x00, + 0x1E, 0x00, + 0x12, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x3F, 0x00, + 0x61, 0x80, + 0x61, 0x80, + 0xF3, 0xC0 +}; + +static const uint8_t courB12L1_0xC6_BMP[] = { + 0x7F, 0xC0, + 0x3C, 0xC0, + 0x2C, 0x00, + 0x2D, 0x00, + 0x6F, 0x00, + 0x4D, 0x00, + 0x7C, 0x00, + 0x4C, 0xC0, + 0xCC, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB12L1_0xC7_BMP[] = { + 0x1E, 0x80, + 0x73, 0x80, + 0x61, 0x80, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0x61, 0x80, + 0x73, 0x80, + 0x1E, 0x00, + 0x18, 0x00, + 0x0C, 0x00, + 0x3C, 0x00 +}; + +static const uint8_t courB12L1_0xC8_BMP[] = { + 0x30, + 0x18, + 0x0C, + 0x00, + 0xFF, + 0x63, + 0x60, + 0x64, + 0x7C, + 0x64, + 0x60, + 0x63, + 0x63, + 0xFF +}; + +static const uint8_t courB12L1_0xC9_BMP[] = { + 0x06, + 0x0C, + 0x18, + 0x00, + 0xFF, + 0x63, + 0x60, + 0x64, + 0x7C, + 0x64, + 0x60, + 0x63, + 0x63, + 0xFF +}; + +static const uint8_t courB12L1_0xCA_BMP[] = { + 0x18, + 0x3C, + 0x66, + 0x00, + 0xFF, + 0x63, + 0x60, + 0x64, + 0x7C, + 0x64, + 0x60, + 0x63, + 0x63, + 0xFF +}; + +static const uint8_t courB12L1_0xCB_BMP[] = { + 0x36, + 0x36, + 0x00, + 0xFF, + 0x63, + 0x60, + 0x64, + 0x7C, + 0x64, + 0x60, + 0x63, + 0x63, + 0xFF +}; + +static const uint8_t courB12L1_0xCC_BMP[] = { + 0x30, + 0x18, + 0x0C, + 0x00, + 0xFF, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF +}; + +static const uint8_t courB12L1_0xCD_BMP[] = { + 0x0C, + 0x18, + 0x30, + 0x00, + 0xFF, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF +}; + +static const uint8_t courB12L1_0xCE_BMP[] = { + 0x18, + 0x3C, + 0x66, + 0x00, + 0xFF, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF +}; + +static const uint8_t courB12L1_0xCF_BMP[] = { + 0x36, + 0x36, + 0x00, + 0xFF, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF +}; + +static const uint8_t courB12L1_0xD0_BMP[] = { + 0xFC, 0x00, + 0x67, 0x00, + 0x63, 0x00, + 0x61, 0x80, + 0xF9, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x63, 0x00, + 0x67, 0x00, + 0xFC, 0x00 +}; + +static const uint8_t courB12L1_0xD1_BMP[] = { + 0x3B, 0x00, + 0x6E, 0x00, + 0x00, 0x00, + 0xF7, 0xC0, + 0x71, 0x80, + 0x79, 0x80, + 0x69, 0x80, + 0x6D, 0x80, + 0x6D, 0x80, + 0x65, 0x80, + 0x67, 0x80, + 0x63, 0x80, + 0xFB, 0x80 +}; + +static const uint8_t courB12L1_0xD2_BMP[] = { + 0x30, 0x00, + 0x18, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x3E, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x00, + 0x63, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courB12L1_0xD3_BMP[] = { + 0x06, 0x00, + 0x0C, 0x00, + 0x18, 0x00, + 0x00, 0x00, + 0x3E, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x00, + 0x63, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courB12L1_0xD4_BMP[] = { + 0x0C, 0x00, + 0x1E, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0x3E, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x00, + 0x63, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courB12L1_0xD5_BMP[] = { + 0x3B, 0x00, + 0x6E, 0x00, + 0x00, 0x00, + 0x3E, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x00, + 0x63, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courB12L1_0xD6_BMP[] = { + 0x36, 0x00, + 0x36, 0x00, + 0x00, 0x00, + 0x3E, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x00, + 0x63, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courB12L1_0xD7_BMP[] = { + 0xE3, + 0x76, + 0x3C, + 0x18, + 0x3C, + 0x6E, + 0xC7 +}; + +static const uint8_t courB12L1_0xD8_BMP[] = { + 0x00, 0x80, + 0x3F, 0x80, + 0x63, 0x00, + 0x67, 0x00, + 0xC5, 0x80, + 0xCD, 0x80, + 0xD9, 0x80, + 0xD1, 0x80, + 0x73, 0x00, + 0x63, 0x00, + 0xFE, 0x00, + 0x80, 0x00 +}; + +static const uint8_t courB12L1_0xD9_BMP[] = { + 0x30, 0x00, + 0x18, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xF3, 0xC0, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x33, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t courB12L1_0xDA_BMP[] = { + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xF3, 0xC0, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x33, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t courB12L1_0xDB_BMP[] = { + 0x0C, 0x00, + 0x1E, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0xF3, 0xC0, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x33, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t courB12L1_0xDC_BMP[] = { + 0x1B, 0x00, + 0x1B, 0x00, + 0x00, 0x00, + 0xF3, 0xC0, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x33, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t courB12L1_0xDD_BMP[] = { + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xF3, 0xC0, + 0x61, 0x80, + 0x33, 0x00, + 0x33, 0x00, + 0x1E, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x3F, 0x00 +}; + +static const uint8_t courB12L1_0xDE_BMP[] = { + 0xF0, 0x00, + 0x60, 0x00, + 0x7E, 0x00, + 0x63, 0x00, + 0x61, 0x80, + 0x63, 0x00, + 0x7E, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0xF0, 0x00 +}; + +static const uint8_t courB12L1_0xDF_BMP[] = { + 0x3C, + 0x66, + 0x66, + 0x64, + 0x6C, + 0x66, + 0x63, + 0x63, + 0x63, + 0x7A, + 0xEC +}; + +static const uint8_t courB12L1_0xE0_BMP[] = { + 0x30, + 0x18, + 0x0C, + 0x00, + 0x3C, + 0x66, + 0x06, + 0x7E, + 0xC6, + 0xC6, + 0x7B +}; + +static const uint8_t courB12L1_0xE1_BMP[] = { + 0x06, + 0x0C, + 0x18, + 0x00, + 0x3C, + 0x66, + 0x06, + 0x7E, + 0xC6, + 0xC6, + 0x7B +}; + +static const uint8_t courB12L1_0xE2_BMP[] = { + 0x18, + 0x3C, + 0x66, + 0x00, + 0x3C, + 0x66, + 0x06, + 0x7E, + 0xC6, + 0xC6, + 0x7B +}; + +static const uint8_t courB12L1_0xE3_BMP[] = { + 0x3B, + 0x6E, + 0x00, + 0x3C, + 0x66, + 0x06, + 0x7E, + 0xC6, + 0xC6, + 0x7B +}; + +static const uint8_t courB12L1_0xE4_BMP[] = { + 0x36, + 0x36, + 0x00, + 0x3C, + 0x66, + 0x06, + 0x7E, + 0xC6, + 0xC6, + 0x7B +}; + +static const uint8_t courB12L1_0xE5_BMP[] = { + 0x1C, + 0x36, + 0x36, + 0x1C, + 0x00, + 0x3C, + 0x66, + 0x06, + 0x7E, + 0xC6, + 0xC6, + 0x7B +}; + +static const uint8_t courB12L1_0xE6_BMP[] = { + 0x3B, 0x80, + 0x6C, 0xC0, + 0x0C, 0xC0, + 0x7F, 0xC0, + 0xCC, 0x00, + 0xCC, 0xC0, + 0x77, 0x80 +}; + +static const uint8_t courB12L1_0xE7_BMP[] = { + 0x3D, + 0x67, + 0xC3, + 0xC0, + 0xC0, + 0xE3, + 0x7E, + 0x18, + 0x0C, + 0x3C +}; + +static const uint8_t courB12L1_0xE8_BMP[] = { + 0x30, + 0x18, + 0x0C, + 0x00, + 0x3C, + 0x66, + 0xC3, + 0xFF, + 0xC0, + 0x63, + 0x3E +}; + +static const uint8_t courB12L1_0xE9_BMP[] = { + 0x06, + 0x0C, + 0x18, + 0x00, + 0x3C, + 0x66, + 0xC3, + 0xFF, + 0xC0, + 0x63, + 0x3E +}; + +static const uint8_t courB12L1_0xEA_BMP[] = { + 0x18, + 0x3C, + 0x66, + 0x00, + 0x3C, + 0x66, + 0xC3, + 0xFF, + 0xC0, + 0x63, + 0x3E +}; + +static const uint8_t courB12L1_0xEB_BMP[] = { + 0x36, + 0x36, + 0x00, + 0x3C, + 0x66, + 0xC3, + 0xFF, + 0xC0, + 0x63, + 0x3E +}; + +static const uint8_t courB12L1_0xEC_BMP[] = { + 0x60, + 0x30, + 0x18, + 0x00, + 0x78, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF +}; + +static const uint8_t courB12L1_0xED_BMP[] = { + 0x06, + 0x0C, + 0x18, + 0x00, + 0x78, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF +}; + +static const uint8_t courB12L1_0xEE_BMP[] = { + 0x18, + 0x3C, + 0x66, + 0x00, + 0x78, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF +}; + +static const uint8_t courB12L1_0xEF_BMP[] = { + 0x6C, + 0x6C, + 0x00, + 0x78, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF +}; + +static const uint8_t courB12L1_0xF0_BMP[] = { + 0xE0, + 0x76, + 0x1C, + 0x3C, + 0xC6, + 0x3E, + 0x67, + 0xE3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t courB12L1_0xF1_BMP[] = { + 0x3B, 0x00, + 0x6E, 0x00, + 0x00, 0x00, + 0xEE, 0x00, + 0x73, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0xF7, 0x80 +}; + +static const uint8_t courB12L1_0xF2_BMP[] = { + 0x30, + 0x18, + 0x0C, + 0x00, + 0x3C, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t courB12L1_0xF3_BMP[] = { + 0x0C, + 0x18, + 0x30, + 0x00, + 0x3C, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t courB12L1_0xF4_BMP[] = { + 0x18, + 0x3C, + 0x66, + 0x00, + 0x3C, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t courB12L1_0xF5_BMP[] = { + 0x3B, + 0x6E, + 0x00, + 0x3C, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t courB12L1_0xF6_BMP[] = { + 0x6C, + 0x6C, + 0x00, + 0x3C, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t courB12L1_0xF7_BMP[] = { + 0x18, + 0x18, + 0x00, + 0xFF, + 0xFF, + 0x00, + 0x18, + 0x18 +}; + +static const uint8_t courB12L1_0xF8_BMP[] = { + 0x03, + 0x3F, + 0x66, + 0xCF, + 0xDB, + 0xF3, + 0x66, + 0xFC, + 0xC0 +}; + +static const uint8_t courB12L1_0xF9_BMP[] = { + 0x30, 0x00, + 0x18, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xE7, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x67, 0x00, + 0x3B, 0x80 +}; + +static const uint8_t courB12L1_0xFA_BMP[] = { + 0x0C, 0x00, + 0x18, 0x00, + 0x30, 0x00, + 0x00, 0x00, + 0xE7, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x67, 0x00, + 0x3B, 0x80 +}; + +static const uint8_t courB12L1_0xFB_BMP[] = { + 0x18, 0x00, + 0x3C, 0x00, + 0x66, 0x00, + 0x00, 0x00, + 0xE7, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x67, 0x00, + 0x3B, 0x80 +}; + +static const uint8_t courB12L1_0xFC_BMP[] = { + 0x36, 0x00, + 0x36, 0x00, + 0x00, 0x00, + 0xE7, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x67, 0x00, + 0x3B, 0x80 +}; + +static const uint8_t courB12L1_0xFD_BMP[] = { + 0x06, 0x00, + 0x0C, 0x00, + 0x18, 0x00, + 0x00, 0x00, + 0xF3, 0xC0, + 0x61, 0x80, + 0x33, 0x00, + 0x33, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x0C, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x7C, 0x00 +}; + +static const uint8_t courB12L1_0xFE_BMP[] = { + 0xE0, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0x6E, 0x00, + 0x73, 0x00, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x73, 0x00, + 0x6E, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0xF8, 0x00 +}; + +static const uint8_t courB12L1_0xFF_BMP[] = { + 0x36, 0x00, + 0x36, 0x00, + 0x00, 0x00, + 0xF3, 0xC0, + 0x61, 0x80, + 0x33, 0x00, + 0x33, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x18, 0x00, + 0x7C, 0x00 +}; + +static const GFONT_CharInfo FontBMP[] = { + {10, 9, 9, 0, 0, courB12L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {10, 1, 1, 0, 0, courB12L1_0x20_BMP}, + {10, 2, 11, 3, 0, courB12L1_0x21_BMP}, + {10, 6, 5, 2, 6, courB12L1_0x22_BMP}, + {10, 9, 12, 0, -1, courB12L1_0x23_BMP}, + {10, 7, 13, 1, -1, courB12L1_0x24_BMP}, + {10, 8, 11, 1, 0, courB12L1_0x25_BMP}, + {10, 7, 9, 1, 0, courB12L1_0x26_BMP}, + {10, 2, 5, 4, 6, courB12L1_0x27_BMP}, + {10, 4, 13, 3, -2, courB12L1_0x28_BMP}, + {10, 4, 13, 2, -2, courB12L1_0x29_BMP}, + {10, 8, 6, 1, 5, courB12L1_0x2A_BMP}, + {10, 8, 8, 1, 1, courB12L1_0x2B_BMP}, + {10, 3, 5, 3, -3, courB12L1_0x2C_BMP}, + {10, 7, 2, 1, 4, courB12L1_0x2D_BMP}, + {10, 3, 2, 3, 0, courB12L1_0x2E_BMP}, + {10, 7, 14, 1, -2, courB12L1_0x2F_BMP}, + {10, 8, 11, 1, 0, courB12L1_0x30_BMP}, + {10, 8, 11, 1, 0, courB12L1_0x31_BMP}, + {10, 7, 11, 1, 0, courB12L1_0x32_BMP}, + {10, 7, 11, 1, 0, courB12L1_0x33_BMP}, + {10, 8, 11, 1, 0, courB12L1_0x34_BMP}, + {10, 7, 11, 1, 0, courB12L1_0x35_BMP}, + {10, 8, 11, 1, 0, courB12L1_0x36_BMP}, + {10, 7, 11, 1, 0, courB12L1_0x37_BMP}, + {10, 7, 11, 1, 0, courB12L1_0x38_BMP}, + {10, 8, 11, 1, 0, courB12L1_0x39_BMP}, + {10, 3, 7, 3, 0, courB12L1_0x3A_BMP}, + {10, 3, 10, 3, -3, courB12L1_0x3B_BMP}, + {10, 9, 9, 1, 0, courB12L1_0x3C_BMP}, + {10, 9, 5, 0, 2, courB12L1_0x3D_BMP}, + {10, 9, 9, 0, 0, courB12L1_0x3E_BMP}, + {10, 7, 10, 1, 0, courB12L1_0x3F_BMP}, + {10, 9, 12, 0, -1, courB12L1_0x40_BMP}, + {10, 10, 10, 0, 0, courB12L1_0x41_BMP}, + {10, 9, 10, 0, 0, courB12L1_0x42_BMP}, + {10, 9, 10, 0, 0, courB12L1_0x43_BMP}, + {10, 9, 10, 0, 0, courB12L1_0x44_BMP}, + {10, 8, 10, 1, 0, courB12L1_0x45_BMP}, + {10, 8, 10, 1, 0, courB12L1_0x46_BMP}, + {10, 10, 10, 0, 0, courB12L1_0x47_BMP}, + {10, 9, 10, 0, 0, courB12L1_0x48_BMP}, + {10, 8, 10, 1, 0, courB12L1_0x49_BMP}, + {10, 9, 10, 0, 0, courB12L1_0x4A_BMP}, + {10, 9, 10, 0, 0, courB12L1_0x4B_BMP}, + {10, 9, 10, 0, 0, courB12L1_0x4C_BMP}, + {10, 10, 10, 0, 0, courB12L1_0x4D_BMP}, + {10, 10, 10, 0, 0, courB12L1_0x4E_BMP}, + {10, 9, 10, 0, 0, courB12L1_0x4F_BMP}, + {10, 9, 10, 0, 0, courB12L1_0x50_BMP}, + {10, 9, 12, 0, -2, courB12L1_0x51_BMP}, + {10, 9, 10, 0, 0, courB12L1_0x52_BMP}, + {10, 8, 10, 1, 0, courB12L1_0x53_BMP}, + {10, 8, 10, 1, 0, courB12L1_0x54_BMP}, + {10, 10, 10, 0, 0, courB12L1_0x55_BMP}, + {10, 10, 10, 0, 0, courB12L1_0x56_BMP}, + {10, 10, 10, 0, 0, courB12L1_0x57_BMP}, + {10, 10, 10, 0, 0, courB12L1_0x58_BMP}, + {10, 10, 10, 0, 0, courB12L1_0x59_BMP}, + {10, 7, 10, 1, 0, courB12L1_0x5A_BMP}, + {10, 4, 13, 3, -2, courB12L1_0x5B_BMP}, + {10, 7, 14, 1, -2, courB12L1_0x5C_BMP}, + {10, 4, 13, 2, -2, courB12L1_0x5D_BMP}, + {10, 8, 4, 1, 7, courB12L1_0x5E_BMP}, + {10, 10, 2, 0, -3, courB12L1_0x5F_BMP}, + {10, 4, 3, 2, 8, courB12L1_0x60_BMP}, + {10, 8, 7, 1, 0, courB12L1_0x61_BMP}, + {10, 9, 11, 0, 0, courB12L1_0x62_BMP}, + {10, 8, 7, 0, 0, courB12L1_0x63_BMP}, + {10, 9, 11, 0, 0, courB12L1_0x64_BMP}, + {10, 8, 7, 1, 0, courB12L1_0x65_BMP}, + {10, 8, 11, 1, 0, courB12L1_0x66_BMP}, + {10, 9, 10, 0, -3, courB12L1_0x67_BMP}, + {10, 9, 11, 0, 0, courB12L1_0x68_BMP}, + {10, 8, 10, 1, 0, courB12L1_0x69_BMP}, + {10, 6, 13, 1, -3, courB12L1_0x6A_BMP}, + {10, 9, 11, 0, 0, courB12L1_0x6B_BMP}, + {10, 8, 11, 1, 0, courB12L1_0x6C_BMP}, + {10, 10, 7, 0, 0, courB12L1_0x6D_BMP}, + {10, 9, 7, 0, 0, courB12L1_0x6E_BMP}, + {10, 8, 7, 1, 0, courB12L1_0x6F_BMP}, + {10, 9, 10, 0, -3, courB12L1_0x70_BMP}, + {10, 9, 10, 0, -3, courB12L1_0x71_BMP}, + {10, 9, 7, 0, 0, courB12L1_0x72_BMP}, + {10, 7, 7, 1, 0, courB12L1_0x73_BMP}, + {10, 9, 9, 0, 0, courB12L1_0x74_BMP}, + {10, 9, 7, 0, 0, courB12L1_0x75_BMP}, + {10, 10, 7, 0, 0, courB12L1_0x76_BMP}, + {10, 10, 7, 0, 0, courB12L1_0x77_BMP}, + {10, 8, 7, 1, 0, courB12L1_0x78_BMP}, + {10, 10, 10, 0, -3, courB12L1_0x79_BMP}, + {10, 7, 7, 1, 0, courB12L1_0x7A_BMP}, + {10, 4, 13, 3, -2, courB12L1_0x7B_BMP}, + {10, 2, 13, 4, -2, courB12L1_0x7C_BMP}, + {10, 4, 13, 3, -2, courB12L1_0x7D_BMP}, + {10, 8, 3, 1, 3, courB12L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {10, 1, 1, 0, 0, courB12L1_0xA0_BMP}, + {10, 2, 10, 4, -3, courB12L1_0xA1_BMP}, + {10, 7, 10, 1, 0, courB12L1_0xA2_BMP}, + {10, 8, 10, 1, 0, courB12L1_0xA3_BMP}, + {10, 8, 7, 1, 1, courB12L1_0xA4_BMP}, + {10, 10, 10, 0, 0, courB12L1_0xA5_BMP}, + {10, 2, 13, 4, -2, courB12L1_0xA6_BMP}, + {10, 10, 12, 0, -1, courB12L1_0xA7_BMP}, + {10, 5, 2, 3, 8, courB12L1_0xA8_BMP}, + {10, 10, 10, 0, 0, courB12L1_0xA9_BMP}, + {10, 6, 7, 2, 3, courB12L1_0xAA_BMP}, + {10, 9, 7, 0, 0, courB12L1_0xAB_BMP}, + {10, 8, 5, 1, 2, courB12L1_0xAC_BMP}, + {10, 7, 2, 1, 4, courB12L1_0xAD_BMP}, + {10, 10, 10, 0, 0, courB12L1_0xAE_BMP}, + {10, 5, 1, 2, 9, courB12L1_0xAF_BMP}, + {10, 5, 5, 2, 6, courB12L1_0xB0_BMP}, + {10, 8, 9, 1, 0, courB12L1_0xB1_BMP}, + {10, 5, 6, 2, 5, courB12L1_0xB2_BMP}, + {10, 5, 6, 2, 5, courB12L1_0xB3_BMP}, + {10, 4, 3, 3, 8, courB12L1_0xB4_BMP}, + {10, 9, 10, 0, -3, courB12L1_0xB5_BMP}, + {10, 9, 12, 0, -1, courB12L1_0xB6_BMP}, + {10, 3, 2, 3, 4, courB12L1_0xB7_BMP}, + {10, 4, 4, 3, -3, courB12L1_0xB8_BMP}, + {10, 6, 6, 2, 5, courB12L1_0xB9_BMP}, + {10, 6, 7, 2, 3, courB12L1_0xBA_BMP}, + {10, 9, 7, 0, 0, courB12L1_0xBB_BMP}, + {10, 10, 11, 0, 0, courB12L1_0xBC_BMP}, + {10, 10, 11, 0, 0, courB12L1_0xBD_BMP}, + {10, 11, 11, 0, 0, courB12L1_0xBE_BMP}, + {10, 7, 10, 1, -3, courB12L1_0xBF_BMP}, + {10, 10, 14, 0, 0, courB12L1_0xC0_BMP}, + {10, 10, 14, 0, 0, courB12L1_0xC1_BMP}, + {10, 10, 14, 0, 0, courB12L1_0xC2_BMP}, + {10, 10, 13, 0, 0, courB12L1_0xC3_BMP}, + {10, 10, 13, 0, 0, courB12L1_0xC4_BMP}, + {10, 10, 14, 0, 0, courB12L1_0xC5_BMP}, + {10, 10, 10, 0, 0, courB12L1_0xC6_BMP}, + {10, 9, 13, 0, -3, courB12L1_0xC7_BMP}, + {10, 8, 14, 1, 0, courB12L1_0xC8_BMP}, + {10, 8, 14, 1, 0, courB12L1_0xC9_BMP}, + {10, 8, 14, 1, 0, courB12L1_0xCA_BMP}, + {10, 8, 13, 1, 0, courB12L1_0xCB_BMP}, + {10, 8, 14, 1, 0, courB12L1_0xCC_BMP}, + {10, 8, 14, 1, 0, courB12L1_0xCD_BMP}, + {10, 8, 14, 1, 0, courB12L1_0xCE_BMP}, + {10, 8, 13, 1, 0, courB12L1_0xCF_BMP}, + {10, 9, 10, 0, 0, courB12L1_0xD0_BMP}, + {10, 10, 13, 0, 0, courB12L1_0xD1_BMP}, + {10, 9, 14, 0, 0, courB12L1_0xD2_BMP}, + {10, 9, 14, 0, 0, courB12L1_0xD3_BMP}, + {10, 9, 14, 0, 0, courB12L1_0xD4_BMP}, + {10, 9, 13, 0, 0, courB12L1_0xD5_BMP}, + {10, 9, 13, 0, 0, courB12L1_0xD6_BMP}, + {10, 8, 7, 1, 1, courB12L1_0xD7_BMP}, + {10, 9, 12, 0, -1, courB12L1_0xD8_BMP}, + {10, 10, 14, 0, 0, courB12L1_0xD9_BMP}, + {10, 10, 14, 0, 0, courB12L1_0xDA_BMP}, + {10, 10, 14, 0, 0, courB12L1_0xDB_BMP}, + {10, 10, 13, 0, 0, courB12L1_0xDC_BMP}, + {10, 10, 14, 0, 0, courB12L1_0xDD_BMP}, + {10, 9, 10, 0, 0, courB12L1_0xDE_BMP}, + {10, 8, 11, 0, 0, courB12L1_0xDF_BMP}, + {10, 8, 11, 1, 0, courB12L1_0xE0_BMP}, + {10, 8, 11, 1, 0, courB12L1_0xE1_BMP}, + {10, 8, 11, 1, 0, courB12L1_0xE2_BMP}, + {10, 8, 10, 1, 0, courB12L1_0xE3_BMP}, + {10, 8, 10, 1, 0, courB12L1_0xE4_BMP}, + {10, 8, 12, 1, 0, courB12L1_0xE5_BMP}, + {10, 10, 7, -1, 0, courB12L1_0xE6_BMP}, + {10, 8, 10, 1, -3, courB12L1_0xE7_BMP}, + {10, 8, 11, 1, 0, courB12L1_0xE8_BMP}, + {10, 8, 11, 1, 0, courB12L1_0xE9_BMP}, + {10, 8, 11, 1, 0, courB12L1_0xEA_BMP}, + {10, 8, 10, 1, 0, courB12L1_0xEB_BMP}, + {10, 8, 11, 1, 0, courB12L1_0xEC_BMP}, + {10, 8, 11, 1, 0, courB12L1_0xED_BMP}, + {10, 8, 11, 1, 0, courB12L1_0xEE_BMP}, + {10, 8, 10, 1, 0, courB12L1_0xEF_BMP}, + {10, 8, 12, 1, 0, courB12L1_0xF0_BMP}, + {10, 9, 10, 0, 0, courB12L1_0xF1_BMP}, + {10, 8, 11, 1, 0, courB12L1_0xF2_BMP}, + {10, 8, 11, 1, 0, courB12L1_0xF3_BMP}, + {10, 8, 11, 1, 0, courB12L1_0xF4_BMP}, + {10, 8, 10, 1, 0, courB12L1_0xF5_BMP}, + {10, 8, 10, 1, 0, courB12L1_0xF6_BMP}, + {10, 8, 8, 1, 1, courB12L1_0xF7_BMP}, + {10, 8, 9, 1, -1, courB12L1_0xF8_BMP}, + {10, 9, 11, 0, 0, courB12L1_0xF9_BMP}, + {10, 9, 11, 0, 0, courB12L1_0xFA_BMP}, + {10, 9, 11, 0, 0, courB12L1_0xFB_BMP}, + {10, 9, 10, 0, 0, courB12L1_0xFC_BMP}, + {10, 10, 14, 0, -3, courB12L1_0xFD_BMP}, + {10, 9, 14, 0, -3, courB12L1_0xFE_BMP}, + {10, 10, 13, 0, -3, courB12L1_0xFF_BMP} +}; + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontCour12Bold_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontCour12Bold_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontCour12Bold_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontCour12Bold_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontCour12Bold_GetFontChar, + McuFontCour12Bold_FBBy, + McuFontCour12Bold_GetUnderlineBoxHeight(), + McuFontCour12Bold_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour12Bold_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour12Bold_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour12Bold_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour12Bold_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontCour12Bold. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour12Bold.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour12Bold.h new file mode 100644 index 0000000..ed48184 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour12Bold.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour12Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour12Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 12 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour12Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour12Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour12Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour12Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour12Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontCour12Bold_Deinit(void); +** Init - void McuFontCour12Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour12Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour12Bold_module McuFontCour12Bold module documentation +** @{ +*/ + + +#ifndef __McuFontCour12Bold_H +#define __McuFontCour12Bold_H + +/* MODULE McuFontCour12Bold. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontCour12Boldconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontCour12Bold_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontCour12Bold_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontCour12Bold_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontCour12Bold_GetLineSpaceHeight() \ + 1 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontCour12Bold_GetUnderlineBoxHeight() \ + 5 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontCour12Bold_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontCour12Bold_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontCour12Bold. */ + +#endif +/* ifndef __McuFontCour12Bold_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour12Normal.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour12Normal.c new file mode 100644 index 0000000..d04e7e5 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour12Normal.c @@ -0,0 +1,2994 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour12Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour12Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 12 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour12Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour12Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour12Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour12Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour12Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontCour12Normal_Deinit(void); +** Init - void McuFontCour12Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour12Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour12Normal_module McuFontCour12Normal module documentation +** @{ +*/ + +/* MODULE McuFontCour12Normal. */ + +#include "McuFontCour12Normal.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontCour12Normal_FBBy 17 + +static const uint8_t courR12L1_0x00_BMP[] = { + 0xAA, + 0x00, + 0x82, + 0x00, + 0x82, + 0x00, + 0x82, + 0x00, + 0xAA +}; + +static const uint8_t courR12L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t courR12L1_0x21_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x00, + 0x80, + 0x80 +}; + +static const uint8_t courR12L1_0x22_BMP[] = { + 0x90, + 0x90, + 0x90, + 0x90, + 0x90 +}; + +static const uint8_t courR12L1_0x23_BMP[] = { + 0x28, + 0x28, + 0x28, + 0x28, + 0xFE, + 0x28, + 0x28, + 0xFE, + 0x28, + 0x28, + 0x28, + 0x28 +}; + +static const uint8_t courR12L1_0x24_BMP[] = { + 0x20, + 0x20, + 0x78, + 0x88, + 0x80, + 0x80, + 0x70, + 0x08, + 0x08, + 0x88, + 0xF0, + 0x20, + 0x20 +}; + +static const uint8_t courR12L1_0x25_BMP[] = { + 0x70, + 0x88, + 0x88, + 0x70, + 0x06, + 0x38, + 0xC0, + 0x1C, + 0x22, + 0x22, + 0x1C +}; + +static const uint8_t courR12L1_0x26_BMP[] = { + 0x30, + 0x48, + 0x40, + 0x20, + 0x64, + 0x94, + 0x88, + 0x88, + 0x74 +}; + +static const uint8_t courR12L1_0x27_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t courR12L1_0x28_BMP[] = { + 0x20, + 0x40, + 0x40, + 0x40, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x40, + 0x40, + 0x40, + 0x20 +}; + +static const uint8_t courR12L1_0x29_BMP[] = { + 0x80, + 0x40, + 0x40, + 0x40, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x40, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t courR12L1_0x2A_BMP[] = { + 0x10, + 0x10, + 0xFE, + 0x38, + 0x28, + 0x44 +}; + +static const uint8_t courR12L1_0x2B_BMP[] = { + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE, + 0x10, + 0x10, + 0x10, + 0x10 +}; + +static const uint8_t courR12L1_0x2C_BMP[] = { + 0x60, + 0x60, + 0x40, + 0x80 +}; + +static const uint8_t courR12L1_0x2D_BMP[] = { + 0xFE +}; + +static const uint8_t courR12L1_0x2E_BMP[] = { + 0xC0, + 0xC0 +}; + +static const uint8_t courR12L1_0x2F_BMP[] = { + 0x04, + 0x04, + 0x08, + 0x08, + 0x10, + 0x10, + 0x10, + 0x20, + 0x20, + 0x40, + 0x40, + 0x80, + 0x80 +}; + +static const uint8_t courR12L1_0x30_BMP[] = { + 0x38, + 0x44, + 0x44, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x44, + 0x44, + 0x38 +}; + +static const uint8_t courR12L1_0x31_BMP[] = { + 0x10, + 0x30, + 0xD0, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR12L1_0x32_BMP[] = { + 0x38, + 0x44, + 0x82, + 0x02, + 0x02, + 0x04, + 0x08, + 0x10, + 0x20, + 0x42, + 0xFE +}; + +static const uint8_t courR12L1_0x33_BMP[] = { + 0x38, + 0x44, + 0x82, + 0x04, + 0x18, + 0x04, + 0x02, + 0x02, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t courR12L1_0x34_BMP[] = { + 0x0C, + 0x0C, + 0x14, + 0x24, + 0x24, + 0x44, + 0x84, + 0xFE, + 0x04, + 0x04, + 0x1E +}; + +static const uint8_t courR12L1_0x35_BMP[] = { + 0x7E, + 0x40, + 0x40, + 0x40, + 0x78, + 0x44, + 0x02, + 0x02, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t courR12L1_0x36_BMP[] = { + 0x1C, + 0x60, + 0x40, + 0x80, + 0xB8, + 0xC4, + 0x82, + 0x82, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t courR12L1_0x37_BMP[] = { + 0xFC, + 0x84, + 0x04, + 0x08, + 0x08, + 0x08, + 0x10, + 0x10, + 0x10, + 0x20, + 0x20 +}; + +static const uint8_t courR12L1_0x38_BMP[] = { + 0x30, + 0x48, + 0x84, + 0x84, + 0x78, + 0x48, + 0x84, + 0x84, + 0x84, + 0x48, + 0x30 +}; + +static const uint8_t courR12L1_0x39_BMP[] = { + 0x38, + 0x44, + 0x82, + 0x82, + 0x46, + 0x3A, + 0x02, + 0x02, + 0x04, + 0x0C, + 0x70 +}; + +static const uint8_t courR12L1_0x3A_BMP[] = { + 0xC0, + 0xC0, + 0x00, + 0x00, + 0x00, + 0xC0, + 0xC0 +}; + +static const uint8_t courR12L1_0x3B_BMP[] = { + 0x60, + 0x60, + 0x00, + 0x00, + 0x00, + 0x60, + 0x60, + 0x40, + 0x80 +}; + +static const uint8_t courR12L1_0x3C_BMP[] = { + 0x01, + 0x06, + 0x18, + 0x60, + 0x80, + 0x60, + 0x18, + 0x06, + 0x01 +}; + +static const uint8_t courR12L1_0x3D_BMP[] = { + 0xFF, + 0x00, + 0x00, + 0xFF +}; + +static const uint8_t courR12L1_0x3E_BMP[] = { + 0x80, + 0x60, + 0x18, + 0x06, + 0x01, + 0x06, + 0x18, + 0x60, + 0x80 +}; + +static const uint8_t courR12L1_0x3F_BMP[] = { + 0x78, + 0x84, + 0x84, + 0x04, + 0x18, + 0x20, + 0x20, + 0x00, + 0x20, + 0x20 +}; + +static const uint8_t courR12L1_0x40_BMP[] = { + 0x3E, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x9C, 0x80, + 0xA4, 0x80, + 0xA4, 0x80, + 0xA4, 0x80, + 0x9F, 0x00, + 0x40, 0x00, + 0x41, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courR12L1_0x41_BMP[] = { + 0x78, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x3E, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0xE3, 0x80 +}; + +static const uint8_t courR12L1_0x42_BMP[] = { + 0xFC, + 0x42, + 0x41, + 0x42, + 0x7C, + 0x42, + 0x41, + 0x41, + 0x42, + 0xFC +}; + +static const uint8_t courR12L1_0x43_BMP[] = { + 0x1D, + 0x63, + 0x41, + 0x80, + 0x80, + 0x80, + 0x80, + 0x41, + 0x63, + 0x1C +}; + +static const uint8_t courR12L1_0x44_BMP[] = { + 0xF8, + 0x46, + 0x42, + 0x41, + 0x41, + 0x41, + 0x41, + 0x42, + 0x46, + 0xF8 +}; + +static const uint8_t courR12L1_0x45_BMP[] = { + 0xFE, + 0x42, + 0x42, + 0x48, + 0x78, + 0x48, + 0x40, + 0x42, + 0x42, + 0xFE +}; + +static const uint8_t courR12L1_0x46_BMP[] = { + 0xFE, + 0x42, + 0x42, + 0x48, + 0x78, + 0x48, + 0x40, + 0x40, + 0x40, + 0xF0 +}; + +static const uint8_t courR12L1_0x47_BMP[] = { + 0x1D, 0x00, + 0x63, 0x00, + 0x41, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x87, 0x80, + 0x81, 0x00, + 0x41, 0x00, + 0x61, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t courR12L1_0x48_BMP[] = { + 0xE7, + 0x42, + 0x42, + 0x42, + 0x7E, + 0x42, + 0x42, + 0x42, + 0x42, + 0xE7 +}; + +static const uint8_t courR12L1_0x49_BMP[] = { + 0xFE, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR12L1_0x4A_BMP[] = { + 0x3F, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t courR12L1_0x4B_BMP[] = { + 0xF7, + 0x42, + 0x44, + 0x48, + 0x50, + 0x78, + 0x44, + 0x44, + 0x42, + 0xF3 +}; + +static const uint8_t courR12L1_0x4C_BMP[] = { + 0xF8, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x21, + 0x21, + 0x21, + 0xFF +}; + +static const uint8_t courR12L1_0x4D_BMP[] = { + 0xC1, 0x80, + 0x63, 0x00, + 0x63, 0x00, + 0x55, 0x00, + 0x55, 0x00, + 0x49, 0x00, + 0x49, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0xE3, 0x80 +}; + +static const uint8_t courR12L1_0x4E_BMP[] = { + 0xE7, 0x80, + 0x61, 0x00, + 0x51, 0x00, + 0x51, 0x00, + 0x49, 0x00, + 0x49, 0x00, + 0x45, 0x00, + 0x45, 0x00, + 0x43, 0x00, + 0xF3, 0x00 +}; + +static const uint8_t courR12L1_0x4F_BMP[] = { + 0x3C, + 0x42, + 0x42, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x42, + 0x3C +}; + +static const uint8_t courR12L1_0x50_BMP[] = { + 0xFC, + 0x42, + 0x41, + 0x41, + 0x42, + 0x7C, + 0x40, + 0x40, + 0x40, + 0xF8 +}; + +static const uint8_t courR12L1_0x51_BMP[] = { + 0x3C, + 0x42, + 0x42, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x42, + 0x3C, + 0x11, + 0x2E +}; + +static const uint8_t courR12L1_0x52_BMP[] = { + 0xF8, + 0x44, + 0x42, + 0x42, + 0x44, + 0x78, + 0x44, + 0x42, + 0x42, + 0xF3 +}; + +static const uint8_t courR12L1_0x53_BMP[] = { + 0x3A, + 0x46, + 0x82, + 0x80, + 0x70, + 0x0C, + 0x02, + 0x82, + 0xC4, + 0xB8 +}; + +static const uint8_t courR12L1_0x54_BMP[] = { + 0xFE, + 0x92, + 0x92, + 0x92, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x7C +}; + +static const uint8_t courR12L1_0x55_BMP[] = { + 0xF7, 0x80, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x22, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t courR12L1_0x56_BMP[] = { + 0xE3, 0x80, + 0x41, 0x00, + 0x41, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x08, 0x00, + 0x08, 0x00 +}; + +static const uint8_t courR12L1_0x57_BMP[] = { + 0xF7, 0x80, + 0x41, 0x00, + 0x49, 0x00, + 0x49, 0x00, + 0x55, 0x00, + 0x55, 0x00, + 0x55, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x22, 0x00 +}; + +static const uint8_t courR12L1_0x58_BMP[] = { + 0xE3, 0x80, + 0x41, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x41, 0x00, + 0xE3, 0x80 +}; + +static const uint8_t courR12L1_0x59_BMP[] = { + 0xE3, 0x80, + 0x41, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courR12L1_0x5A_BMP[] = { + 0xFE, + 0x82, + 0x84, + 0x08, + 0x10, + 0x10, + 0x20, + 0x42, + 0x82, + 0xFE +}; + +static const uint8_t courR12L1_0x5B_BMP[] = { + 0xE0, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0xE0 +}; + +static const uint8_t courR12L1_0x5C_BMP[] = { + 0x80, + 0x80, + 0x40, + 0x40, + 0x20, + 0x20, + 0x20, + 0x10, + 0x10, + 0x08, + 0x08, + 0x04, + 0x04 +}; + +static const uint8_t courR12L1_0x5D_BMP[] = { + 0xE0, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xE0 +}; + +static const uint8_t courR12L1_0x5E_BMP[] = { + 0x10, + 0x28, + 0x44, + 0x82 +}; + +static const uint8_t courR12L1_0x5F_BMP[] = { + 0xFF, 0xC0 +}; + +static const uint8_t courR12L1_0x60_BMP[] = { + 0x80, + 0x40, + 0x20 +}; + +static const uint8_t courR12L1_0x61_BMP[] = { + 0x38, + 0x44, + 0x04, + 0x7C, + 0x84, + 0x84, + 0x7A +}; + +static const uint8_t courR12L1_0x62_BMP[] = { + 0xC0, + 0x40, + 0x40, + 0x5C, + 0x62, + 0x41, + 0x41, + 0x41, + 0x62, + 0xDC +}; + +static const uint8_t courR12L1_0x63_BMP[] = { + 0x3A, + 0x46, + 0x82, + 0x80, + 0x80, + 0x42, + 0x3C +}; + +static const uint8_t courR12L1_0x64_BMP[] = { + 0x06, + 0x02, + 0x02, + 0x3A, + 0x46, + 0x82, + 0x82, + 0x82, + 0x46, + 0x3B +}; + +static const uint8_t courR12L1_0x65_BMP[] = { + 0x38, + 0x44, + 0x82, + 0xFE, + 0x80, + 0x42, + 0x3C +}; + +static const uint8_t courR12L1_0x66_BMP[] = { + 0x1C, + 0x22, + 0x20, + 0xFC, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xFC +}; + +static const uint8_t courR12L1_0x67_BMP[] = { + 0x3B, + 0x46, + 0x82, + 0x82, + 0x82, + 0x46, + 0x3A, + 0x02, + 0x02, + 0x3C +}; + +static const uint8_t courR12L1_0x68_BMP[] = { + 0xC0, + 0x40, + 0x40, + 0x5C, + 0x62, + 0x42, + 0x42, + 0x42, + 0x42, + 0xE7 +}; + +static const uint8_t courR12L1_0x69_BMP[] = { + 0x10, + 0x10, + 0x00, + 0x70, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR12L1_0x6A_BMP[] = { + 0x10, + 0x10, + 0x00, + 0xF8, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0xF0 +}; + +static const uint8_t courR12L1_0x6B_BMP[] = { + 0xC0, + 0x40, + 0x40, + 0x4F, + 0x44, + 0x48, + 0x70, + 0x48, + 0x44, + 0xCF +}; + +static const uint8_t courR12L1_0x6C_BMP[] = { + 0x70, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR12L1_0x6D_BMP[] = { + 0xDB, 0x00, + 0x6D, 0x00, + 0x49, 0x00, + 0x49, 0x00, + 0x49, 0x00, + 0x49, 0x00, + 0xED, 0x80 +}; + +static const uint8_t courR12L1_0x6E_BMP[] = { + 0xDC, + 0x62, + 0x42, + 0x42, + 0x42, + 0x42, + 0xE7 +}; + +static const uint8_t courR12L1_0x6F_BMP[] = { + 0x38, + 0x44, + 0x82, + 0x82, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t courR12L1_0x70_BMP[] = { + 0xDC, + 0x62, + 0x41, + 0x41, + 0x41, + 0x62, + 0x5C, + 0x40, + 0x40, + 0xF0 +}; + +static const uint8_t courR12L1_0x71_BMP[] = { + 0x3B, + 0x46, + 0x82, + 0x82, + 0x82, + 0x46, + 0x3A, + 0x02, + 0x02, + 0x0F +}; + +static const uint8_t courR12L1_0x72_BMP[] = { + 0xEE, + 0x31, + 0x20, + 0x20, + 0x20, + 0x20, + 0xFC +}; + +static const uint8_t courR12L1_0x73_BMP[] = { + 0x7C, + 0x84, + 0x80, + 0x78, + 0x04, + 0x84, + 0xF8 +}; + +static const uint8_t courR12L1_0x74_BMP[] = { + 0x20, + 0x20, + 0xFE, + 0x20, + 0x20, + 0x20, + 0x20, + 0x21, + 0x1E +}; + +static const uint8_t courR12L1_0x75_BMP[] = { + 0xC6, + 0x42, + 0x42, + 0x42, + 0x42, + 0x46, + 0x3B +}; + +static const uint8_t courR12L1_0x76_BMP[] = { + 0xF7, 0x80, + 0x41, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x08, 0x00 +}; + +static const uint8_t courR12L1_0x77_BMP[] = { + 0xE3, 0x80, + 0x41, 0x00, + 0x49, 0x00, + 0x2A, 0x00, + 0x2A, 0x00, + 0x36, 0x00, + 0x22, 0x00 +}; + +static const uint8_t courR12L1_0x78_BMP[] = { + 0xEE, + 0x44, + 0x28, + 0x10, + 0x28, + 0x44, + 0xEE +}; + +static const uint8_t courR12L1_0x79_BMP[] = { + 0xE3, 0x80, + 0x41, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x10, 0x00, + 0x78, 0x00 +}; + +static const uint8_t courR12L1_0x7A_BMP[] = { + 0xFC, + 0x88, + 0x10, + 0x20, + 0x40, + 0x84, + 0xFC +}; + +static const uint8_t courR12L1_0x7B_BMP[] = { + 0x20, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x80, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x20 +}; + +static const uint8_t courR12L1_0x7C_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t courR12L1_0x7D_BMP[] = { + 0x80, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x20, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t courR12L1_0x7E_BMP[] = { + 0x60, + 0x92, + 0x0C +}; + +static const uint8_t courR12L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t courR12L1_0xA1_BMP[] = { + 0x80, + 0x80, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t courR12L1_0xA2_BMP[] = { + 0x20, + 0x20, + 0x78, + 0x88, + 0x80, + 0x80, + 0x88, + 0x70, + 0x20, + 0x20 +}; + +static const uint8_t courR12L1_0xA3_BMP[] = { + 0x1C, + 0x22, + 0x20, + 0x20, + 0xF8, + 0x20, + 0x20, + 0x20, + 0x41, + 0xFF +}; + +static const uint8_t courR12L1_0xA4_BMP[] = { + 0x82, + 0x7C, + 0x44, + 0x44, + 0x44, + 0x7C, + 0x82 +}; + +static const uint8_t courR12L1_0xA5_BMP[] = { + 0xE3, 0x80, + 0x41, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x3E, 0x00, + 0x08, 0x00, + 0x3E, 0x00, + 0x08, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courR12L1_0xA6_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x00, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t courR12L1_0xA7_BMP[] = { + 0x1F, 0x00, + 0x21, 0x00, + 0x21, 0x00, + 0x70, 0x00, + 0x8C, 0x00, + 0x83, 0x00, + 0x60, 0x80, + 0x18, 0x80, + 0x07, 0x00, + 0x42, 0x00, + 0x42, 0x00, + 0x7C, 0x00 +}; + +static const uint8_t courR12L1_0xA8_BMP[] = { + 0x90, + 0x90 +}; + +static const uint8_t courR12L1_0xA9_BMP[] = { + 0x1E, 0x00, + 0x21, 0x00, + 0x40, 0x80, + 0x8E, 0x40, + 0x90, 0x40, + 0x90, 0x40, + 0x8E, 0x40, + 0x40, 0x80, + 0x21, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t courR12L1_0xAA_BMP[] = { + 0x70, + 0x08, + 0x78, + 0x88, + 0x78, + 0x00, + 0xF8 +}; + +static const uint8_t courR12L1_0xAB_BMP[] = { + 0x12, + 0x24, + 0x48, + 0x90, + 0x48, + 0x24, + 0x12 +}; + +static const uint8_t courR12L1_0xAC_BMP[] = { + 0xFE, + 0x02, + 0x02, + 0x02 +}; + +static const uint8_t courR12L1_0xAD_BMP[] = { + 0xFE +}; + +static const uint8_t courR12L1_0xAE_BMP[] = { + 0x1E, 0x00, + 0x21, 0x00, + 0x40, 0x80, + 0x9C, 0x40, + 0x92, 0x40, + 0x9C, 0x40, + 0x92, 0x40, + 0x40, 0x80, + 0x21, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t courR12L1_0xAF_BMP[] = { + 0xF8 +}; + +static const uint8_t courR12L1_0xB0_BMP[] = { + 0x70, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t courR12L1_0xB1_BMP[] = { + 0x10, + 0x10, + 0x10, + 0xFE, + 0x10, + 0x10, + 0x10, + 0x00, + 0xFE +}; + +static const uint8_t courR12L1_0xB2_BMP[] = { + 0x60, + 0x90, + 0x20, + 0x40, + 0x90, + 0xF0 +}; + +static const uint8_t courR12L1_0xB3_BMP[] = { + 0x60, + 0x90, + 0x20, + 0x10, + 0x90, + 0x60 +}; + +static const uint8_t courR12L1_0xB4_BMP[] = { + 0x20, + 0x40, + 0x80 +}; + +static const uint8_t courR12L1_0xB5_BMP[] = { + 0xC6, + 0x42, + 0x42, + 0x42, + 0x42, + 0x46, + 0x7B, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t courR12L1_0xB6_BMP[] = { + 0x3E, + 0x54, + 0x94, + 0x94, + 0x94, + 0x54, + 0x34, + 0x14, + 0x14, + 0x14, + 0x14, + 0x3E +}; + +static const uint8_t courR12L1_0xB7_BMP[] = { + 0xC0, + 0xC0 +}; + +static const uint8_t courR12L1_0xB8_BMP[] = { + 0x40, + 0x40, + 0x20, + 0xE0 +}; + +static const uint8_t courR12L1_0xB9_BMP[] = { + 0x20, + 0xE0, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR12L1_0xBA_BMP[] = { + 0x70, + 0x88, + 0x88, + 0x88, + 0x70, + 0x00, + 0xF8 +}; + +static const uint8_t courR12L1_0xBB_BMP[] = { + 0x90, + 0x48, + 0x24, + 0x12, + 0x24, + 0x48, + 0x90 +}; + +static const uint8_t courR12L1_0xBC_BMP[] = { + 0x20, 0x00, + 0xE0, 0x40, + 0x20, 0x80, + 0x21, 0x00, + 0x22, 0x00, + 0xFC, 0x80, + 0x09, 0x80, + 0x12, 0x80, + 0x24, 0x80, + 0x47, 0xC0, + 0x00, 0x80 +}; + +static const uint8_t courR12L1_0xBD_BMP[] = { + 0x20, 0x00, + 0xE0, 0x40, + 0x20, 0x80, + 0x21, 0x00, + 0x22, 0x00, + 0xFD, 0x80, + 0x0A, 0x40, + 0x10, 0x80, + 0x21, 0x00, + 0x42, 0x40, + 0x03, 0xC0 +}; + +static const uint8_t courR12L1_0xBE_BMP[] = { + 0x60, 0x00, + 0x90, 0x40, + 0x20, 0x80, + 0x11, 0x00, + 0x92, 0x00, + 0x64, 0x80, + 0x09, 0x80, + 0x12, 0x80, + 0x24, 0x80, + 0x47, 0xC0, + 0x00, 0x80 +}; + +static const uint8_t courR12L1_0xBF_BMP[] = { + 0x10, + 0x10, + 0x00, + 0x10, + 0x10, + 0x60, + 0x80, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t courR12L1_0xC0_BMP[] = { + 0x20, 0x00, + 0x10, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0x78, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x3E, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0xE3, 0x80 +}; + +static const uint8_t courR12L1_0xC1_BMP[] = { + 0x04, 0x00, + 0x08, 0x00, + 0x10, 0x00, + 0x00, 0x00, + 0x78, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x3E, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0xE3, 0x80 +}; + +static const uint8_t courR12L1_0xC2_BMP[] = { + 0x08, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x00, 0x00, + 0x78, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x3E, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0xE3, 0x80 +}; + +static const uint8_t courR12L1_0xC3_BMP[] = { + 0x32, 0x00, + 0x4C, 0x00, + 0x00, 0x00, + 0x78, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x3E, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0xE3, 0x80 +}; + +static const uint8_t courR12L1_0xC4_BMP[] = { + 0x24, 0x00, + 0x24, 0x00, + 0x00, 0x00, + 0x78, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x3E, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0xE3, 0x80 +}; + +static const uint8_t courR12L1_0xC5_BMP[] = { + 0x18, 0x00, + 0x24, 0x00, + 0x24, 0x00, + 0x18, 0x00, + 0x78, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x3E, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0xE3, 0x80 +}; + +static const uint8_t courR12L1_0xC6_BMP[] = { + 0x7F, 0x80, + 0x28, 0x80, + 0x28, 0x80, + 0x4A, 0x00, + 0x4E, 0x00, + 0x7A, 0x00, + 0x48, 0x80, + 0x88, 0x80, + 0x88, 0x80, + 0xDF, 0x80 +}; + +static const uint8_t courR12L1_0xC7_BMP[] = { + 0x1D, + 0x63, + 0x41, + 0x80, + 0x80, + 0x80, + 0x80, + 0x41, + 0x63, + 0x1C, + 0x10, + 0x08, + 0x38 +}; + +static const uint8_t courR12L1_0xC8_BMP[] = { + 0x20, + 0x10, + 0x08, + 0x00, + 0xFE, + 0x42, + 0x42, + 0x48, + 0x78, + 0x48, + 0x40, + 0x42, + 0x42, + 0xFE +}; + +static const uint8_t courR12L1_0xC9_BMP[] = { + 0x04, + 0x08, + 0x10, + 0x00, + 0xFE, + 0x42, + 0x42, + 0x48, + 0x78, + 0x48, + 0x40, + 0x42, + 0x42, + 0xFE +}; + +static const uint8_t courR12L1_0xCA_BMP[] = { + 0x10, + 0x28, + 0x44, + 0x00, + 0xFE, + 0x42, + 0x42, + 0x48, + 0x78, + 0x48, + 0x40, + 0x42, + 0x42, + 0xFE +}; + +static const uint8_t courR12L1_0xCB_BMP[] = { + 0x24, + 0x24, + 0x00, + 0xFE, + 0x42, + 0x42, + 0x48, + 0x78, + 0x48, + 0x40, + 0x42, + 0x42, + 0xFE +}; + +static const uint8_t courR12L1_0xCC_BMP[] = { + 0x20, + 0x10, + 0x08, + 0x00, + 0xFE, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR12L1_0xCD_BMP[] = { + 0x08, + 0x10, + 0x20, + 0x00, + 0xFE, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR12L1_0xCE_BMP[] = { + 0x10, + 0x28, + 0x44, + 0x00, + 0xFE, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR12L1_0xCF_BMP[] = { + 0x44, + 0x44, + 0x00, + 0xFE, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR12L1_0xD0_BMP[] = { + 0xF8, + 0x46, + 0x42, + 0x41, + 0xF1, + 0x41, + 0x41, + 0x42, + 0x46, + 0xF8 +}; + +static const uint8_t courR12L1_0xD1_BMP[] = { + 0x19, 0x00, + 0x26, 0x00, + 0x00, 0x00, + 0xE7, 0x80, + 0x61, 0x00, + 0x51, 0x00, + 0x51, 0x00, + 0x49, 0x00, + 0x49, 0x00, + 0x45, 0x00, + 0x45, 0x00, + 0x43, 0x00, + 0xF3, 0x00 +}; + +static const uint8_t courR12L1_0xD2_BMP[] = { + 0x20, + 0x10, + 0x08, + 0x00, + 0x3C, + 0x42, + 0x42, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x42, + 0x3C +}; + +static const uint8_t courR12L1_0xD3_BMP[] = { + 0x04, + 0x08, + 0x10, + 0x00, + 0x3C, + 0x42, + 0x42, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x42, + 0x3C +}; + +static const uint8_t courR12L1_0xD4_BMP[] = { + 0x08, + 0x14, + 0x22, + 0x00, + 0x3C, + 0x42, + 0x42, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x42, + 0x3C +}; + +static const uint8_t courR12L1_0xD5_BMP[] = { + 0x32, + 0x4C, + 0x00, + 0x3C, + 0x42, + 0x42, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x42, + 0x3C +}; + +static const uint8_t courR12L1_0xD6_BMP[] = { + 0x24, + 0x24, + 0x00, + 0x3C, + 0x42, + 0x42, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x42, + 0x3C +}; + +static const uint8_t courR12L1_0xD7_BMP[] = { + 0x82, + 0x44, + 0x28, + 0x10, + 0x28, + 0x44, + 0x82 +}; + +static const uint8_t courR12L1_0xD8_BMP[] = { + 0x3D, + 0x42, + 0x42, + 0x85, + 0x89, + 0x91, + 0xA1, + 0x42, + 0x42, + 0xBC +}; + +static const uint8_t courR12L1_0xD9_BMP[] = { + 0x10, 0x00, + 0x08, 0x00, + 0x04, 0x00, + 0x00, 0x00, + 0xF7, 0x80, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x22, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t courR12L1_0xDA_BMP[] = { + 0x02, 0x00, + 0x04, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0xF7, 0x80, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x22, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t courR12L1_0xDB_BMP[] = { + 0x08, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x00, 0x00, + 0xF7, 0x80, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x22, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t courR12L1_0xDC_BMP[] = { + 0x22, 0x00, + 0x22, 0x00, + 0x00, 0x00, + 0xF7, 0x80, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x22, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t courR12L1_0xDD_BMP[] = { + 0x02, 0x00, + 0x04, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0xE3, 0x80, + 0x41, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courR12L1_0xDE_BMP[] = { + 0xE0, + 0x40, + 0x7C, + 0x42, + 0x41, + 0x42, + 0x7C, + 0x40, + 0x40, + 0xE0 +}; + +static const uint8_t courR12L1_0xDF_BMP[] = { + 0x38, + 0x44, + 0x44, + 0x48, + 0x58, + 0x44, + 0x42, + 0x42, + 0x42, + 0x52, + 0xCC +}; + +static const uint8_t courR12L1_0xE0_BMP[] = { + 0x20, + 0x10, + 0x08, + 0x00, + 0x38, + 0x44, + 0x04, + 0x7C, + 0x84, + 0x84, + 0x7A +}; + +static const uint8_t courR12L1_0xE1_BMP[] = { + 0x04, + 0x08, + 0x10, + 0x00, + 0x38, + 0x44, + 0x04, + 0x7C, + 0x84, + 0x84, + 0x7A +}; + +static const uint8_t courR12L1_0xE2_BMP[] = { + 0x10, + 0x28, + 0x44, + 0x00, + 0x38, + 0x44, + 0x04, + 0x7C, + 0x84, + 0x84, + 0x7A +}; + +static const uint8_t courR12L1_0xE3_BMP[] = { + 0x32, + 0x4C, + 0x00, + 0x38, + 0x44, + 0x04, + 0x7C, + 0x84, + 0x84, + 0x7A +}; + +static const uint8_t courR12L1_0xE4_BMP[] = { + 0x24, + 0x24, + 0x00, + 0x38, + 0x44, + 0x04, + 0x7C, + 0x84, + 0x84, + 0x7A +}; + +static const uint8_t courR12L1_0xE5_BMP[] = { + 0x18, + 0x24, + 0x24, + 0x18, + 0x00, + 0x38, + 0x44, + 0x04, + 0x7C, + 0x84, + 0x84, + 0x7A +}; + +static const uint8_t courR12L1_0xE6_BMP[] = { + 0x37, 0x00, + 0x48, 0x80, + 0x08, 0x80, + 0x7F, 0x80, + 0x88, 0x00, + 0x88, 0x80, + 0x77, 0x00 +}; + +static const uint8_t courR12L1_0xE7_BMP[] = { + 0x3A, + 0x46, + 0x82, + 0x80, + 0x80, + 0x42, + 0x3C, + 0x10, + 0x08, + 0x38 +}; + +static const uint8_t courR12L1_0xE8_BMP[] = { + 0x20, + 0x10, + 0x08, + 0x00, + 0x38, + 0x44, + 0x82, + 0xFE, + 0x80, + 0x42, + 0x3C +}; + +static const uint8_t courR12L1_0xE9_BMP[] = { + 0x04, + 0x08, + 0x10, + 0x00, + 0x38, + 0x44, + 0x82, + 0xFE, + 0x80, + 0x42, + 0x3C +}; + +static const uint8_t courR12L1_0xEA_BMP[] = { + 0x10, + 0x28, + 0x44, + 0x00, + 0x38, + 0x44, + 0x82, + 0xFE, + 0x80, + 0x42, + 0x3C +}; + +static const uint8_t courR12L1_0xEB_BMP[] = { + 0x24, + 0x24, + 0x00, + 0x38, + 0x44, + 0x82, + 0xFE, + 0x80, + 0x42, + 0x3C +}; + +static const uint8_t courR12L1_0xEC_BMP[] = { + 0x20, + 0x10, + 0x08, + 0x00, + 0x70, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR12L1_0xED_BMP[] = { + 0x08, + 0x10, + 0x20, + 0x00, + 0x70, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR12L1_0xEE_BMP[] = { + 0x10, + 0x28, + 0x44, + 0x00, + 0x70, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR12L1_0xEF_BMP[] = { + 0x48, + 0x48, + 0x00, + 0x70, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR12L1_0xF0_BMP[] = { + 0xE6, + 0x18, + 0x68, + 0x04, + 0x3C, + 0x42, + 0x82, + 0x82, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t courR12L1_0xF1_BMP[] = { + 0x32, + 0x4C, + 0x00, + 0xDC, + 0x62, + 0x42, + 0x42, + 0x42, + 0x42, + 0xE7 +}; + +static const uint8_t courR12L1_0xF2_BMP[] = { + 0x20, + 0x10, + 0x08, + 0x00, + 0x38, + 0x44, + 0x82, + 0x82, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t courR12L1_0xF3_BMP[] = { + 0x08, + 0x10, + 0x20, + 0x00, + 0x38, + 0x44, + 0x82, + 0x82, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t courR12L1_0xF4_BMP[] = { + 0x10, + 0x28, + 0x44, + 0x00, + 0x38, + 0x44, + 0x82, + 0x82, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t courR12L1_0xF5_BMP[] = { + 0x32, + 0x4C, + 0x00, + 0x38, + 0x44, + 0x82, + 0x82, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t courR12L1_0xF6_BMP[] = { + 0x44, + 0x44, + 0x00, + 0x38, + 0x44, + 0x82, + 0x82, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t courR12L1_0xF7_BMP[] = { + 0x18, + 0x18, + 0x00, + 0xFF, + 0x00, + 0x18, + 0x18 +}; + +static const uint8_t courR12L1_0xF8_BMP[] = { + 0x02, + 0x3A, + 0x44, + 0x8A, + 0x92, + 0xA2, + 0x44, + 0xB8, + 0x80 +}; + +static const uint8_t courR12L1_0xF9_BMP[] = { + 0x20, + 0x10, + 0x08, + 0x00, + 0xC6, + 0x42, + 0x42, + 0x42, + 0x42, + 0x46, + 0x3B +}; + +static const uint8_t courR12L1_0xFA_BMP[] = { + 0x04, + 0x08, + 0x10, + 0x00, + 0xC6, + 0x42, + 0x42, + 0x42, + 0x42, + 0x46, + 0x3B +}; + +static const uint8_t courR12L1_0xFB_BMP[] = { + 0x10, + 0x28, + 0x44, + 0x00, + 0xC6, + 0x42, + 0x42, + 0x42, + 0x42, + 0x46, + 0x3B +}; + +static const uint8_t courR12L1_0xFC_BMP[] = { + 0x24, + 0x24, + 0x00, + 0xC6, + 0x42, + 0x42, + 0x42, + 0x42, + 0x46, + 0x3B +}; + +static const uint8_t courR12L1_0xFD_BMP[] = { + 0x02, 0x00, + 0x04, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0xE3, 0x80, + 0x41, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x10, 0x00, + 0x78, 0x00 +}; + +static const uint8_t courR12L1_0xFE_BMP[] = { + 0xC0, + 0x40, + 0x40, + 0x40, + 0x5C, + 0x62, + 0x41, + 0x41, + 0x41, + 0x62, + 0x5C, + 0x40, + 0x40, + 0xF0 +}; + +static const uint8_t courR12L1_0xFF_BMP[] = { + 0x12, 0x00, + 0x12, 0x00, + 0x00, 0x00, + 0xE3, 0x80, + 0x41, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x10, 0x00, + 0x78, 0x00 +}; + +static const GFONT_CharInfo FontBMP[] = { + {10, 7, 9, 1, 0, courR12L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {10, 1, 1, 0, 0, courR12L1_0x20_BMP}, + {10, 1, 11, 4, 0, courR12L1_0x21_BMP}, + {10, 4, 5, 3, 6, courR12L1_0x22_BMP}, + {10, 7, 12, 1, -1, courR12L1_0x23_BMP}, + {10, 5, 13, 2, -1, courR12L1_0x24_BMP}, + {10, 7, 11, 1, 0, courR12L1_0x25_BMP}, + {10, 6, 9, 1, 0, courR12L1_0x26_BMP}, + {10, 1, 5, 4, 6, courR12L1_0x27_BMP}, + {10, 3, 13, 4, -2, courR12L1_0x28_BMP}, + {10, 3, 13, 2, -2, courR12L1_0x29_BMP}, + {10, 7, 6, 1, 5, courR12L1_0x2A_BMP}, + {10, 7, 9, 1, 0, courR12L1_0x2B_BMP}, + {10, 3, 4, 2, -2, courR12L1_0x2C_BMP}, + {10, 7, 1, 1, 4, courR12L1_0x2D_BMP}, + {10, 2, 2, 3, 0, courR12L1_0x2E_BMP}, + {10, 6, 13, 2, -2, courR12L1_0x2F_BMP}, + {10, 7, 11, 1, 0, courR12L1_0x30_BMP}, + {10, 7, 11, 1, 0, courR12L1_0x31_BMP}, + {10, 7, 11, 1, 0, courR12L1_0x32_BMP}, + {10, 7, 11, 1, 0, courR12L1_0x33_BMP}, + {10, 7, 11, 1, 0, courR12L1_0x34_BMP}, + {10, 7, 11, 1, 0, courR12L1_0x35_BMP}, + {10, 7, 11, 2, 0, courR12L1_0x36_BMP}, + {10, 6, 11, 1, 0, courR12L1_0x37_BMP}, + {10, 6, 11, 2, 0, courR12L1_0x38_BMP}, + {10, 7, 11, 1, 0, courR12L1_0x39_BMP}, + {10, 2, 7, 3, 0, courR12L1_0x3A_BMP}, + {10, 3, 9, 2, -2, courR12L1_0x3B_BMP}, + {10, 8, 9, 1, 0, courR12L1_0x3C_BMP}, + {10, 8, 4, 1, 3, courR12L1_0x3D_BMP}, + {10, 8, 9, 1, 0, courR12L1_0x3E_BMP}, + {10, 6, 10, 2, 0, courR12L1_0x3F_BMP}, + {10, 9, 12, 0, -1, courR12L1_0x40_BMP}, + {10, 9, 10, 0, 0, courR12L1_0x41_BMP}, + {10, 8, 10, 1, 0, courR12L1_0x42_BMP}, + {10, 8, 10, 1, 0, courR12L1_0x43_BMP}, + {10, 8, 10, 1, 0, courR12L1_0x44_BMP}, + {10, 7, 10, 1, 0, courR12L1_0x45_BMP}, + {10, 7, 10, 1, 0, courR12L1_0x46_BMP}, + {10, 9, 10, 1, 0, courR12L1_0x47_BMP}, + {10, 8, 10, 1, 0, courR12L1_0x48_BMP}, + {10, 7, 10, 1, 0, courR12L1_0x49_BMP}, + {10, 8, 10, 1, 0, courR12L1_0x4A_BMP}, + {10, 8, 10, 1, 0, courR12L1_0x4B_BMP}, + {10, 8, 10, 1, 0, courR12L1_0x4C_BMP}, + {10, 9, 10, 0, 0, courR12L1_0x4D_BMP}, + {10, 9, 10, 0, 0, courR12L1_0x4E_BMP}, + {10, 8, 10, 1, 0, courR12L1_0x4F_BMP}, + {10, 8, 10, 1, 0, courR12L1_0x50_BMP}, + {10, 8, 12, 1, -2, courR12L1_0x51_BMP}, + {10, 8, 10, 1, 0, courR12L1_0x52_BMP}, + {10, 7, 10, 1, 0, courR12L1_0x53_BMP}, + {10, 7, 10, 1, 0, courR12L1_0x54_BMP}, + {10, 9, 10, 0, 0, courR12L1_0x55_BMP}, + {10, 9, 10, 0, 0, courR12L1_0x56_BMP}, + {10, 9, 10, 0, 0, courR12L1_0x57_BMP}, + {10, 9, 10, 0, 0, courR12L1_0x58_BMP}, + {10, 9, 10, 0, 0, courR12L1_0x59_BMP}, + {10, 7, 10, 1, 0, courR12L1_0x5A_BMP}, + {10, 3, 13, 4, -2, courR12L1_0x5B_BMP}, + {10, 6, 13, 2, -2, courR12L1_0x5C_BMP}, + {10, 3, 13, 2, -2, courR12L1_0x5D_BMP}, + {10, 7, 4, 1, 7, courR12L1_0x5E_BMP}, + {10, 10, 1, 0, -3, courR12L1_0x5F_BMP}, + {10, 3, 3, 2, 8, courR12L1_0x60_BMP}, + {10, 7, 7, 1, 0, courR12L1_0x61_BMP}, + {10, 8, 10, 0, 0, courR12L1_0x62_BMP}, + {10, 7, 7, 1, 0, courR12L1_0x63_BMP}, + {10, 8, 10, 1, 0, courR12L1_0x64_BMP}, + {10, 7, 7, 1, 0, courR12L1_0x65_BMP}, + {10, 7, 10, 2, 0, courR12L1_0x66_BMP}, + {10, 8, 10, 1, -3, courR12L1_0x67_BMP}, + {10, 8, 10, 1, 0, courR12L1_0x68_BMP}, + {10, 7, 10, 1, 0, courR12L1_0x69_BMP}, + {10, 5, 13, 2, -3, courR12L1_0x6A_BMP}, + {10, 8, 10, 1, 0, courR12L1_0x6B_BMP}, + {10, 7, 10, 1, 0, courR12L1_0x6C_BMP}, + {10, 9, 7, 0, 0, courR12L1_0x6D_BMP}, + {10, 8, 7, 1, 0, courR12L1_0x6E_BMP}, + {10, 7, 7, 1, 0, courR12L1_0x6F_BMP}, + {10, 8, 10, 1, -3, courR12L1_0x70_BMP}, + {10, 8, 10, 1, -3, courR12L1_0x71_BMP}, + {10, 8, 7, 1, 0, courR12L1_0x72_BMP}, + {10, 6, 7, 2, 0, courR12L1_0x73_BMP}, + {10, 8, 9, 0, 0, courR12L1_0x74_BMP}, + {10, 8, 7, 1, 0, courR12L1_0x75_BMP}, + {10, 9, 7, 0, 0, courR12L1_0x76_BMP}, + {10, 9, 7, 0, 0, courR12L1_0x77_BMP}, + {10, 7, 7, 1, 0, courR12L1_0x78_BMP}, + {10, 9, 10, 0, -3, courR12L1_0x79_BMP}, + {10, 6, 7, 2, 0, courR12L1_0x7A_BMP}, + {10, 3, 13, 3, -2, courR12L1_0x7B_BMP}, + {10, 1, 12, 4, -2, courR12L1_0x7C_BMP}, + {10, 3, 13, 3, -2, courR12L1_0x7D_BMP}, + {10, 7, 3, 1, 3, courR12L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {10, 1, 1, 0, 0, courR12L1_0xA0_BMP}, + {10, 1, 10, 4, -3, courR12L1_0xA1_BMP}, + {10, 5, 10, 2, 0, courR12L1_0xA2_BMP}, + {10, 8, 10, 1, 0, courR12L1_0xA3_BMP}, + {10, 7, 7, 1, 1, courR12L1_0xA4_BMP}, + {10, 9, 10, 0, 0, courR12L1_0xA5_BMP}, + {10, 1, 12, 4, -2, courR12L1_0xA6_BMP}, + {10, 9, 12, 0, -1, courR12L1_0xA7_BMP}, + {10, 4, 2, 3, 8, courR12L1_0xA8_BMP}, + {10, 10, 10, 0, 0, courR12L1_0xA9_BMP}, + {10, 5, 7, 2, 3, courR12L1_0xAA_BMP}, + {10, 7, 7, 1, 0, courR12L1_0xAB_BMP}, + {10, 7, 4, 1, 2, courR12L1_0xAC_BMP}, + {10, 7, 1, 1, 4, courR12L1_0xAD_BMP}, + {10, 10, 10, 0, 0, courR12L1_0xAE_BMP}, + {10, 5, 1, 2, 8, courR12L1_0xAF_BMP}, + {10, 5, 5, 2, 6, courR12L1_0xB0_BMP}, + {10, 7, 9, 1, 0, courR12L1_0xB1_BMP}, + {10, 4, 6, 2, 5, courR12L1_0xB2_BMP}, + {10, 4, 6, 3, 5, courR12L1_0xB3_BMP}, + {10, 3, 3, 4, 8, courR12L1_0xB4_BMP}, + {10, 8, 10, 1, -3, courR12L1_0xB5_BMP}, + {10, 7, 12, 1, -1, courR12L1_0xB6_BMP}, + {10, 2, 2, 4, 4, courR12L1_0xB7_BMP}, + {10, 3, 4, 3, -3, courR12L1_0xB8_BMP}, + {10, 5, 6, 2, 5, courR12L1_0xB9_BMP}, + {10, 5, 7, 2, 3, courR12L1_0xBA_BMP}, + {10, 7, 7, 1, 0, courR12L1_0xBB_BMP}, + {10, 10, 11, 0, 0, courR12L1_0xBC_BMP}, + {10, 10, 11, 0, 0, courR12L1_0xBD_BMP}, + {10, 10, 11, 0, 0, courR12L1_0xBE_BMP}, + {10, 6, 10, 1, -3, courR12L1_0xBF_BMP}, + {10, 9, 14, 0, 0, courR12L1_0xC0_BMP}, + {10, 9, 14, 0, 0, courR12L1_0xC1_BMP}, + {10, 9, 14, 0, 0, courR12L1_0xC2_BMP}, + {10, 9, 13, 0, 0, courR12L1_0xC3_BMP}, + {10, 9, 13, 0, 0, courR12L1_0xC4_BMP}, + {10, 9, 14, 0, 0, courR12L1_0xC5_BMP}, + {10, 9, 10, 0, 0, courR12L1_0xC6_BMP}, + {10, 8, 13, 1, -3, courR12L1_0xC7_BMP}, + {10, 7, 14, 1, 0, courR12L1_0xC8_BMP}, + {10, 7, 14, 1, 0, courR12L1_0xC9_BMP}, + {10, 7, 14, 1, 0, courR12L1_0xCA_BMP}, + {10, 7, 13, 1, 0, courR12L1_0xCB_BMP}, + {10, 7, 14, 1, 0, courR12L1_0xCC_BMP}, + {10, 7, 14, 1, 0, courR12L1_0xCD_BMP}, + {10, 7, 14, 1, 0, courR12L1_0xCE_BMP}, + {10, 7, 13, 1, 0, courR12L1_0xCF_BMP}, + {10, 8, 10, 1, 0, courR12L1_0xD0_BMP}, + {10, 9, 13, 0, 0, courR12L1_0xD1_BMP}, + {10, 8, 14, 1, 0, courR12L1_0xD2_BMP}, + {10, 8, 14, 1, 0, courR12L1_0xD3_BMP}, + {10, 8, 14, 1, 0, courR12L1_0xD4_BMP}, + {10, 8, 13, 1, 0, courR12L1_0xD5_BMP}, + {10, 8, 13, 1, 0, courR12L1_0xD6_BMP}, + {10, 7, 7, 1, 1, courR12L1_0xD7_BMP}, + {10, 8, 10, 1, 0, courR12L1_0xD8_BMP}, + {10, 9, 14, 0, 0, courR12L1_0xD9_BMP}, + {10, 9, 14, 0, 0, courR12L1_0xDA_BMP}, + {10, 9, 14, 0, 0, courR12L1_0xDB_BMP}, + {10, 9, 13, 0, 0, courR12L1_0xDC_BMP}, + {10, 9, 14, 0, 0, courR12L1_0xDD_BMP}, + {10, 8, 10, 1, 0, courR12L1_0xDE_BMP}, + {10, 7, 11, 1, 0, courR12L1_0xDF_BMP}, + {10, 7, 11, 1, 0, courR12L1_0xE0_BMP}, + {10, 7, 11, 1, 0, courR12L1_0xE1_BMP}, + {10, 7, 11, 1, 0, courR12L1_0xE2_BMP}, + {10, 7, 10, 1, 0, courR12L1_0xE3_BMP}, + {10, 7, 10, 1, 0, courR12L1_0xE4_BMP}, + {10, 7, 12, 1, 0, courR12L1_0xE5_BMP}, + {10, 9, 7, 0, 0, courR12L1_0xE6_BMP}, + {10, 7, 10, 1, -3, courR12L1_0xE7_BMP}, + {10, 7, 11, 1, 0, courR12L1_0xE8_BMP}, + {10, 7, 11, 1, 0, courR12L1_0xE9_BMP}, + {10, 7, 11, 1, 0, courR12L1_0xEA_BMP}, + {10, 7, 10, 1, 0, courR12L1_0xEB_BMP}, + {10, 7, 11, 1, 0, courR12L1_0xEC_BMP}, + {10, 7, 11, 1, 0, courR12L1_0xED_BMP}, + {10, 7, 11, 1, 0, courR12L1_0xEE_BMP}, + {10, 7, 10, 1, 0, courR12L1_0xEF_BMP}, + {10, 7, 11, 1, 0, courR12L1_0xF0_BMP}, + {10, 8, 10, 1, 0, courR12L1_0xF1_BMP}, + {10, 7, 11, 1, 0, courR12L1_0xF2_BMP}, + {10, 7, 11, 1, 0, courR12L1_0xF3_BMP}, + {10, 7, 11, 1, 0, courR12L1_0xF4_BMP}, + {10, 7, 10, 1, 0, courR12L1_0xF5_BMP}, + {10, 7, 10, 1, 0, courR12L1_0xF6_BMP}, + {10, 8, 7, 1, 1, courR12L1_0xF7_BMP}, + {10, 7, 9, 1, -1, courR12L1_0xF8_BMP}, + {10, 8, 11, 1, 0, courR12L1_0xF9_BMP}, + {10, 8, 11, 1, 0, courR12L1_0xFA_BMP}, + {10, 8, 11, 1, 0, courR12L1_0xFB_BMP}, + {10, 8, 10, 1, 0, courR12L1_0xFC_BMP}, + {10, 9, 14, 0, -3, courR12L1_0xFD_BMP}, + {10, 8, 14, 1, -3, courR12L1_0xFE_BMP}, + {10, 9, 13, 0, -3, courR12L1_0xFF_BMP} +}; + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontCour12Normal_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontCour12Normal_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontCour12Normal_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontCour12Normal_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontCour12Normal_GetFontChar, + McuFontCour12Normal_FBBy, + McuFontCour12Normal_GetUnderlineBoxHeight(), + McuFontCour12Normal_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour12Normal_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour12Normal_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour12Normal_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour12Normal_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontCour12Normal. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour12Normal.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour12Normal.h new file mode 100644 index 0000000..e03595d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour12Normal.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour12Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour12Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 12 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour12Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour12Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour12Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour12Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour12Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontCour12Normal_Deinit(void); +** Init - void McuFontCour12Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour12Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour12Normal_module McuFontCour12Normal module documentation +** @{ +*/ + + +#ifndef __McuFontCour12Normal_H +#define __McuFontCour12Normal_H + +/* MODULE McuFontCour12Normal. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontCour12Normalconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontCour12Normal_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontCour12Normal_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontCour12Normal_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontCour12Normal_GetLineSpaceHeight() \ + 1 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontCour12Normal_GetUnderlineBoxHeight() \ + 5 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontCour12Normal_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontCour12Normal_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontCour12Normal. */ + +#endif +/* ifndef __McuFontCour12Normal_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour14Bold.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour14Bold.c new file mode 100644 index 0000000..962c2d4 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour14Bold.c @@ -0,0 +1,3282 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour14Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour14Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 14 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour14Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour14Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour14Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour14Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour14Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontCour14Bold_Deinit(void); +** Init - void McuFontCour14Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour14Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour14Bold_module McuFontCour14Bold module documentation +** @{ +*/ + +/* MODULE McuFontCour14Bold. */ + +#include "McuFontCour14Bold.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontCour14Bold_FBBy 20 + +static const uint8_t courB14L1_0x00_BMP[] = { + 0xAA, 0x80, + 0x00, 0x00, + 0x80, 0x80, + 0x00, 0x00, + 0x80, 0x80, + 0x00, 0x00, + 0x80, 0x80, + 0x00, 0x00, + 0x80, 0x80, + 0x00, 0x00, + 0xAA, 0x80 +}; + +static const uint8_t courB14L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t courB14L1_0x21_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xC0, + 0xC0, + 0xC0, + 0x00, + 0xC0, + 0xC0 +}; + +static const uint8_t courB14L1_0x22_BMP[] = { + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0x88, + 0x88 +}; + +static const uint8_t courB14L1_0x23_BMP[] = { + 0x36, + 0x36, + 0x36, + 0x36, + 0xFF, + 0xFF, + 0x6C, + 0x6C, + 0xFF, + 0xFF, + 0x6C, + 0x6C, + 0x6C, + 0x6C +}; + +static const uint8_t courB14L1_0x24_BMP[] = { + 0x18, + 0x18, + 0x3F, + 0x7F, + 0xC3, + 0xC0, + 0xF0, + 0x7E, + 0x0F, + 0x03, + 0xC7, + 0xFE, + 0xFC, + 0x18, + 0x18 +}; + +static const uint8_t courB14L1_0x25_BMP[] = { + 0x70, + 0xD8, + 0x88, + 0xD8, + 0x73, + 0x0E, + 0x78, + 0xCE, + 0x1B, + 0x11, + 0x1B, + 0x0E +}; + +static const uint8_t courB14L1_0x26_BMP[] = { + 0x3C, + 0x7E, + 0x66, + 0x60, + 0x30, + 0x7B, + 0xFF, + 0xCE, + 0xFF, + 0x7B +}; + +static const uint8_t courB14L1_0x27_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x80, + 0x80 +}; + +static const uint8_t courB14L1_0x28_BMP[] = { + 0x30, + 0x30, + 0x60, + 0x60, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x60, + 0x60, + 0x30, + 0x30 +}; + +static const uint8_t courB14L1_0x29_BMP[] = { + 0xC0, + 0xC0, + 0x60, + 0x60, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x60, + 0x60, + 0xC0, + 0xC0 +}; + +static const uint8_t courB14L1_0x2A_BMP[] = { + 0x18, + 0x18, + 0xFF, + 0xFF, + 0x18, + 0x7E, + 0xE7, + 0x42 +}; + +static const uint8_t courB14L1_0x2B_BMP[] = { + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00 +}; + +static const uint8_t courB14L1_0x2C_BMP[] = { + 0x30, + 0x30, + 0x60, + 0x40, + 0x80 +}; + +static const uint8_t courB14L1_0x2D_BMP[] = { + 0xFF, + 0xFF +}; + +static const uint8_t courB14L1_0x2E_BMP[] = { + 0xC0, + 0xC0 +}; + +static const uint8_t courB14L1_0x2F_BMP[] = { + 0x01, 0x80, + 0x01, 0x80, + 0x03, 0x00, + 0x03, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0xC0, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t courB14L1_0x30_BMP[] = { + 0x3C, + 0x7E, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x7E, + 0x3C +}; + +static const uint8_t courB14L1_0x31_BMP[] = { + 0x18, + 0xF8, + 0xF8, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF, + 0xFF +}; + +static const uint8_t courB14L1_0x32_BMP[] = { + 0x3C, + 0x7E, + 0xC7, + 0xC3, + 0x03, + 0x07, + 0x0E, + 0x1C, + 0x38, + 0x70, + 0xFF, + 0xFF +}; + +static const uint8_t courB14L1_0x33_BMP[] = { + 0x3C, + 0x7E, + 0x66, + 0x06, + 0x0E, + 0x3C, + 0x3E, + 0x07, + 0x03, + 0xC7, + 0xFE, + 0x7C +}; + +static const uint8_t courB14L1_0x34_BMP[] = { + 0x0E, + 0x1E, + 0x3E, + 0x36, + 0x66, + 0x66, + 0xC6, + 0xFF, + 0xFF, + 0x06, + 0x1F, + 0x1F +}; + +static const uint8_t courB14L1_0x35_BMP[] = { + 0x7F, + 0x7F, + 0x60, + 0x60, + 0x7E, + 0x7F, + 0x67, + 0x03, + 0x03, + 0xC7, + 0xFE, + 0x7C +}; + +static const uint8_t courB14L1_0x36_BMP[] = { + 0x0F, + 0x3F, + 0x70, + 0x60, + 0xDC, + 0xFE, + 0xE7, + 0xC3, + 0xC3, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t courB14L1_0x37_BMP[] = { + 0xFF, + 0xFF, + 0xC3, + 0x06, + 0x06, + 0x06, + 0x0C, + 0x0C, + 0x0C, + 0x18, + 0x18, + 0x18 +}; + +static const uint8_t courB14L1_0x38_BMP[] = { + 0x3C, + 0x7E, + 0xE7, + 0xC3, + 0x66, + 0x3C, + 0x7E, + 0xE7, + 0xC3, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t courB14L1_0x39_BMP[] = { + 0x3C, + 0x7E, + 0xC3, + 0xC3, + 0xC3, + 0xC7, + 0x7F, + 0x3B, + 0x03, + 0x06, + 0xFE, + 0xF8 +}; + +static const uint8_t courB14L1_0x3A_BMP[] = { + 0xC0, + 0xC0, + 0x00, + 0x00, + 0x00, + 0x00, + 0xC0, + 0xC0 +}; + +static const uint8_t courB14L1_0x3B_BMP[] = { + 0x30, + 0x30, + 0x00, + 0x00, + 0x00, + 0x00, + 0x30, + 0x30, + 0x60, + 0x40, + 0x80 +}; + +static const uint8_t courB14L1_0x3C_BMP[] = { + 0x01, 0x80, + 0x07, 0x80, + 0x1E, 0x00, + 0x78, 0x00, + 0xE0, 0x00, + 0x78, 0x00, + 0x1E, 0x00, + 0x07, 0x80, + 0x01, 0x80 +}; + +static const uint8_t courB14L1_0x3D_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB14L1_0x3E_BMP[] = { + 0xC0, 0x00, + 0xF0, 0x00, + 0x3C, 0x00, + 0x0F, 0x00, + 0x03, 0x80, + 0x0F, 0x00, + 0x3C, 0x00, + 0xF0, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t courB14L1_0x3F_BMP[] = { + 0x7C, + 0xFE, + 0xC6, + 0x06, + 0x0E, + 0x3C, + 0x30, + 0x30, + 0x00, + 0x30, + 0x30 +}; + +static const uint8_t courB14L1_0x40_BMP[] = { + 0x3C, 0x00, + 0x66, 0x00, + 0xC3, 0x00, + 0xCF, 0x00, + 0xDB, 0x00, + 0xDB, 0x00, + 0xDB, 0x00, + 0xDB, 0x00, + 0xCF, 0x80, + 0xC0, 0x00, + 0xC0, 0x00, + 0x63, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courB14L1_0x41_BMP[] = { + 0x3E, 0x00, + 0x3F, 0x00, + 0x0F, 0x00, + 0x19, 0x80, + 0x19, 0x80, + 0x19, 0x80, + 0x3F, 0xC0, + 0x3F, 0xC0, + 0x30, 0xC0, + 0xF9, 0xF0, + 0xF9, 0xF0 +}; + +static const uint8_t courB14L1_0x42_BMP[] = { + 0xFE, 0x00, + 0xFF, 0x00, + 0x31, 0x80, + 0x31, 0x80, + 0x3F, 0x00, + 0x3F, 0x80, + 0x30, 0xC0, + 0x30, 0xC0, + 0x30, 0xC0, + 0xFF, 0x80, + 0xFF, 0x00 +}; + +static const uint8_t courB14L1_0x43_BMP[] = { + 0x1E, 0xC0, + 0x7F, 0xC0, + 0x71, 0xC0, + 0xE0, 0xC0, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xE0, 0x00, + 0x70, 0xC0, + 0x7F, 0xC0, + 0x1F, 0x00 +}; + +static const uint8_t courB14L1_0x44_BMP[] = { + 0xFE, 0x00, + 0xFF, 0x80, + 0x63, 0x80, + 0x61, 0xC0, + 0x60, 0xC0, + 0x60, 0xC0, + 0x60, 0xC0, + 0x61, 0xC0, + 0x63, 0x80, + 0xFF, 0x80, + 0xFE, 0x00 +}; + +static const uint8_t courB14L1_0x45_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x30, 0xC0, + 0x36, 0xC0, + 0x3E, 0x00, + 0x3E, 0x00, + 0x36, 0x00, + 0x30, 0xC0, + 0x30, 0xC0, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB14L1_0x46_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x30, 0xC0, + 0x36, 0xC0, + 0x3E, 0x00, + 0x3E, 0x00, + 0x36, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0xFE, 0x00, + 0xFE, 0x00 +}; + +static const uint8_t courB14L1_0x47_BMP[] = { + 0x1E, 0xC0, + 0x7F, 0xC0, + 0x71, 0xC0, + 0xE0, 0xC0, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC7, 0xE0, + 0xE7, 0xE0, + 0x70, 0xC0, + 0x7F, 0xC0, + 0x1F, 0x80 +}; + +static const uint8_t courB14L1_0x48_BMP[] = { + 0xF3, 0xC0, + 0xF3, 0xC0, + 0x61, 0x80, + 0x61, 0x80, + 0x7F, 0x80, + 0x7F, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0xF3, 0xC0, + 0xF3, 0xC0 +}; + +static const uint8_t courB14L1_0x49_BMP[] = { + 0xFF, + 0xFF, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF, + 0xFF +}; + +static const uint8_t courB14L1_0x4A_BMP[] = { + 0x1F, 0xC0, + 0x1F, 0xC0, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0xC3, 0x00, + 0xC3, 0x00, + 0xC3, 0x00, + 0xFE, 0x00, + 0x3C, 0x00 +}; + +static const uint8_t courB14L1_0x4B_BMP[] = { + 0xF7, 0xC0, + 0xF7, 0xC0, + 0x63, 0x00, + 0x66, 0x00, + 0x6C, 0x00, + 0x7C, 0x00, + 0x7E, 0x00, + 0x67, 0x00, + 0x63, 0x80, + 0xF9, 0xE0, + 0xF9, 0xE0 +}; + +static const uint8_t courB14L1_0x4C_BMP[] = { + 0xFC, 0x00, + 0xFC, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0xC0, + 0x30, 0xC0, + 0x30, 0xC0, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB14L1_0x4D_BMP[] = { + 0xE1, 0xC0, + 0xE1, 0xC0, + 0x73, 0x80, + 0x73, 0x80, + 0x7F, 0x80, + 0x6D, 0x80, + 0x6D, 0x80, + 0x6D, 0x80, + 0x61, 0x80, + 0xF3, 0xC0, + 0xF3, 0xC0 +}; + +static const uint8_t courB14L1_0x4E_BMP[] = { + 0xE7, 0xC0, + 0xF7, 0xC0, + 0x71, 0x80, + 0x79, 0x80, + 0x69, 0x80, + 0x6D, 0x80, + 0x65, 0x80, + 0x67, 0x80, + 0x63, 0x80, + 0xFB, 0x80, + 0xF9, 0x80 +}; + +static const uint8_t courB14L1_0x4F_BMP[] = { + 0x1E, 0x00, + 0x7F, 0x80, + 0x73, 0x80, + 0xE1, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x73, 0x80, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t courB14L1_0x50_BMP[] = { + 0xFF, 0x00, + 0xFF, 0x80, + 0x61, 0xC0, + 0x60, 0xC0, + 0x61, 0xC0, + 0x7F, 0x80, + 0x7F, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0xFC, 0x00, + 0xFC, 0x00 +}; + +static const uint8_t courB14L1_0x51_BMP[] = { + 0x1E, 0x00, + 0x7F, 0x80, + 0x73, 0x80, + 0xE1, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x73, 0x80, + 0x7F, 0x80, + 0x1E, 0x40, + 0x3F, 0xC0, + 0x33, 0x80 +}; + +static const uint8_t courB14L1_0x52_BMP[] = { + 0xFF, 0x00, + 0xFF, 0x80, + 0x61, 0xC0, + 0x60, 0xC0, + 0x61, 0xC0, + 0x7F, 0x80, + 0x7F, 0x00, + 0x63, 0x80, + 0x61, 0xC0, + 0xFC, 0xE0, + 0xFC, 0xE0 +}; + +static const uint8_t courB14L1_0x53_BMP[] = { + 0x3D, 0x80, + 0xFF, 0x80, + 0xC3, 0x80, + 0xC1, 0x80, + 0xF8, 0x00, + 0x7F, 0x00, + 0x0F, 0x80, + 0xC1, 0x80, + 0xE1, 0x80, + 0xFF, 0x00, + 0xDE, 0x00 +}; + +static const uint8_t courB14L1_0x54_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xCC, 0xC0, + 0xCC, 0xC0, + 0xCC, 0xC0, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x7F, 0x80, + 0x7F, 0x80 +}; + +static const uint8_t courB14L1_0x55_BMP[] = { + 0xF7, 0xC0, + 0xF7, 0xC0, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x73, 0x80, + 0x3F, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t courB14L1_0x56_BMP[] = { + 0xF9, 0xF0, + 0xF9, 0xF0, + 0x60, 0x60, + 0x60, 0x60, + 0x30, 0xC0, + 0x30, 0xC0, + 0x19, 0x80, + 0x19, 0x80, + 0x0F, 0x00, + 0x0F, 0x00, + 0x06, 0x00 +}; + +static const uint8_t courB14L1_0x57_BMP[] = { + 0xF9, 0xF0, + 0xF9, 0xF0, + 0x60, 0x60, + 0x66, 0x60, + 0x66, 0x60, + 0x6F, 0x60, + 0x6F, 0x60, + 0x39, 0xC0, + 0x39, 0xC0, + 0x30, 0xC0, + 0x30, 0xC0 +}; + +static const uint8_t courB14L1_0x58_BMP[] = { + 0xF3, 0xC0, + 0xF3, 0xC0, + 0x61, 0x80, + 0x33, 0x00, + 0x1E, 0x00, + 0x0C, 0x00, + 0x1E, 0x00, + 0x33, 0x00, + 0x61, 0x80, + 0xF3, 0xC0, + 0xF3, 0xC0 +}; + +static const uint8_t courB14L1_0x59_BMP[] = { + 0xF3, 0xC0, + 0xF3, 0xC0, + 0x61, 0x80, + 0x33, 0x00, + 0x3F, 0x00, + 0x1E, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x3F, 0x00, + 0x3F, 0x00 +}; + +static const uint8_t courB14L1_0x5A_BMP[] = { + 0xFF, + 0xFF, + 0xC7, + 0xCE, + 0x0C, + 0x18, + 0x30, + 0x73, + 0xE3, + 0xFF, + 0xFF +}; + +static const uint8_t courB14L1_0x5B_BMP[] = { + 0xF0, + 0xF0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xF0, + 0xF0 +}; + +static const uint8_t courB14L1_0x5C_BMP[] = { + 0xC0, 0x00, + 0xC0, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x01, 0x80, + 0x01, 0x80 +}; + +static const uint8_t courB14L1_0x5D_BMP[] = { + 0xF0, + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xF0, + 0xF0 +}; + +static const uint8_t courB14L1_0x5E_BMP[] = { + 0x18, + 0x3C, + 0x3C, + 0x66, + 0x66, + 0xC3, + 0xC3 +}; + +static const uint8_t courB14L1_0x5F_BMP[] = { + 0xFF, 0xE0, + 0xFF, 0xE0 +}; + +static const uint8_t courB14L1_0x60_BMP[] = { + 0xC0, + 0x60, + 0x30 +}; + +static const uint8_t courB14L1_0x61_BMP[] = { + 0x3F, 0x00, + 0x7F, 0x80, + 0x61, 0x80, + 0x01, 0x80, + 0x7F, 0x80, + 0xFF, 0x80, + 0xC1, 0x80, + 0xFF, 0xC0, + 0x7D, 0xC0 +}; + +static const uint8_t courB14L1_0x62_BMP[] = { + 0xE0, 0x00, + 0xE0, 0x00, + 0x60, 0x00, + 0x6F, 0x00, + 0x7F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0x60, 0xC0, + 0x60, 0xC0, + 0x71, 0xC0, + 0xFF, 0x80, + 0xEF, 0x00 +}; + +static const uint8_t courB14L1_0x63_BMP[] = { + 0x3D, 0x80, + 0x7F, 0x80, + 0xE3, 0x80, + 0xC1, 0x80, + 0xC0, 0x00, + 0xC0, 0x00, + 0xE1, 0xC0, + 0x7F, 0xC0, + 0x3F, 0x00 +}; + +static const uint8_t courB14L1_0x64_BMP[] = { + 0x03, 0x80, + 0x03, 0x80, + 0x01, 0x80, + 0x3D, 0x80, + 0x7F, 0x80, + 0xE3, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xE3, 0x80, + 0x7F, 0xC0, + 0x3D, 0xC0 +}; + +static const uint8_t courB14L1_0x65_BMP[] = { + 0x1E, 0x00, + 0x7F, 0x80, + 0xE1, 0xC0, + 0xC0, 0xC0, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xE0, 0x00, + 0x7F, 0xC0, + 0x1F, 0xC0 +}; + +static const uint8_t courB14L1_0x66_BMP[] = { + 0x1F, 0x80, + 0x3F, 0x80, + 0x30, 0x00, + 0xFF, 0x00, + 0xFF, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0xFF, 0x00, + 0xFF, 0x00 +}; + +static const uint8_t courB14L1_0x67_BMP[] = { + 0x3D, 0xC0, + 0x7F, 0xC0, + 0xE3, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xE3, 0x80, + 0x7F, 0x80, + 0x3D, 0x80, + 0x01, 0x80, + 0x03, 0x80, + 0x3F, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courB14L1_0x68_BMP[] = { + 0xE0, 0x00, + 0xE0, 0x00, + 0x60, 0x00, + 0x6F, 0x00, + 0x7F, 0x80, + 0x71, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0xF3, 0xC0, + 0xF3, 0xC0 +}; + +static const uint8_t courB14L1_0x69_BMP[] = { + 0x18, + 0x18, + 0x00, + 0xF8, + 0xF8, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF, + 0xFF +}; + +static const uint8_t courB14L1_0x6A_BMP[] = { + 0x0C, + 0x0C, + 0x00, + 0xFE, + 0xFE, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x0E, + 0xFC, + 0xF8 +}; + +static const uint8_t courB14L1_0x6B_BMP[] = { + 0xE0, 0x00, + 0xE0, 0x00, + 0x60, 0x00, + 0x67, 0x80, + 0x67, 0x80, + 0x6E, 0x00, + 0x7C, 0x00, + 0x7C, 0x00, + 0x6E, 0x00, + 0x67, 0x00, + 0xE3, 0xC0, + 0xE3, 0xC0 +}; + +static const uint8_t courB14L1_0x6C_BMP[] = { + 0xF8, + 0xF8, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF, + 0xFF +}; + +static const uint8_t courB14L1_0x6D_BMP[] = { + 0xED, 0xC0, + 0xFF, 0xE0, + 0x77, 0x60, + 0x66, 0x60, + 0x66, 0x60, + 0x66, 0x60, + 0x66, 0x60, + 0xF7, 0x70, + 0xF7, 0x70 +}; + +static const uint8_t courB14L1_0x6E_BMP[] = { + 0xEF, 0x00, + 0xFF, 0x80, + 0x71, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0xF3, 0xC0, + 0xF3, 0xC0 +}; + +static const uint8_t courB14L1_0x6F_BMP[] = { + 0x1E, 0x00, + 0x7F, 0x80, + 0xE1, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t courB14L1_0x70_BMP[] = { + 0xEF, 0x00, + 0xFF, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0x60, 0xC0, + 0x60, 0xC0, + 0x71, 0xC0, + 0x7F, 0x80, + 0x6F, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0xF8, 0x00, + 0xF8, 0x00 +}; + +static const uint8_t courB14L1_0x71_BMP[] = { + 0x3D, 0xC0, + 0x7F, 0xC0, + 0xE3, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xE3, 0x80, + 0x7F, 0x80, + 0x3D, 0x80, + 0x01, 0x80, + 0x01, 0x80, + 0x07, 0xC0, + 0x07, 0xC0 +}; + +static const uint8_t courB14L1_0x72_BMP[] = { + 0xF3, 0x80, + 0xFF, 0xC0, + 0x3C, 0xC0, + 0x38, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0xFF, 0x00, + 0xFF, 0x00 +}; + +static const uint8_t courB14L1_0x73_BMP[] = { + 0x7F, + 0xFF, + 0xC3, + 0xF0, + 0x7E, + 0x1F, + 0xC3, + 0xFF, + 0xFE +}; + +static const uint8_t courB14L1_0x74_BMP[] = { + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0xFF, 0x00, + 0xFF, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0xC0, + 0x3F, 0xC0, + 0x1F, 0x00 +}; + +static const uint8_t courB14L1_0x75_BMP[] = { + 0xE7, 0x80, + 0xE7, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x63, 0x80, + 0x7F, 0xC0, + 0x3D, 0xC0 +}; + +static const uint8_t courB14L1_0x76_BMP[] = { + 0xF3, 0xC0, + 0xF3, 0xC0, + 0x61, 0x80, + 0x61, 0x80, + 0x33, 0x00, + 0x33, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x0C, 0x00 +}; + +static const uint8_t courB14L1_0x77_BMP[] = { + 0xF1, 0xE0, + 0xF1, 0xE0, + 0x64, 0xC0, + 0x6E, 0xC0, + 0x6E, 0xC0, + 0x7B, 0xC0, + 0x3B, 0x80, + 0x31, 0x80, + 0x31, 0x80 +}; + +static const uint8_t courB14L1_0x78_BMP[] = { + 0xFB, 0xE0, + 0xFB, 0xE0, + 0x31, 0x80, + 0x1B, 0x00, + 0x0E, 0x00, + 0x1B, 0x00, + 0x31, 0x80, + 0xFB, 0xE0, + 0xFB, 0xE0 +}; + +static const uint8_t courB14L1_0x79_BMP[] = { + 0xF3, 0xC0, + 0xF3, 0xC0, + 0x61, 0x80, + 0x61, 0x80, + 0x33, 0x00, + 0x33, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x0C, 0x00, + 0x18, 0x00, + 0x38, 0x00, + 0xFC, 0x00, + 0xFC, 0x00 +}; + +static const uint8_t courB14L1_0x7A_BMP[] = { + 0xFF, + 0xFF, + 0xC6, + 0x0C, + 0x18, + 0x30, + 0x63, + 0xFF, + 0xFF +}; + +static const uint8_t courB14L1_0x7B_BMP[] = { + 0x30, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0xC0, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x30 +}; + +static const uint8_t courB14L1_0x7C_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t courB14L1_0x7D_BMP[] = { + 0xC0, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x30, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0xC0 +}; + +static const uint8_t courB14L1_0x7E_BMP[] = { + 0x73, + 0xFF, + 0xDE +}; + +static const uint8_t courB14L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t courB14L1_0xA1_BMP[] = { + 0xC0, + 0xC0, + 0x00, + 0xC0, + 0xC0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t courB14L1_0xA2_BMP[] = { + 0x18, + 0x18, + 0x18, + 0x3F, + 0x7F, + 0xE3, + 0xC0, + 0xC0, + 0xE3, + 0x7F, + 0x3E, + 0x18, + 0x18 +}; + +static const uint8_t courB14L1_0xA3_BMP[] = { + 0x3E, 0x00, + 0x7F, 0x00, + 0x63, 0x00, + 0x60, 0x00, + 0x30, 0x00, + 0xFC, 0x00, + 0xFC, 0x00, + 0x30, 0x00, + 0x60, 0xC0, + 0xFF, 0xC0, + 0xFF, 0x80 +}; + +static const uint8_t courB14L1_0xA4_BMP[] = { + 0xC3, + 0xFF, + 0x7E, + 0xC3, + 0xC3, + 0xC3, + 0x7E, + 0xFF, + 0xC3 +}; + +static const uint8_t courB14L1_0xA5_BMP[] = { + 0xF3, 0xC0, + 0xF3, 0xC0, + 0x61, 0x80, + 0x33, 0x00, + 0x1E, 0x00, + 0x3F, 0x00, + 0x0C, 0x00, + 0x3F, 0x00, + 0x0C, 0x00, + 0x3F, 0x00, + 0x3F, 0x00 +}; + +static const uint8_t courB14L1_0xA6_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x00, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t courB14L1_0xA7_BMP[] = { + 0x3F, + 0x73, + 0x63, + 0x60, + 0xF8, + 0xDE, + 0xC7, + 0xE3, + 0x7B, + 0x1F, + 0x06, + 0xC6, + 0xCE, + 0xFC +}; + +static const uint8_t courB14L1_0xA8_BMP[] = { + 0xCC, + 0xCC +}; + +static const uint8_t courB14L1_0xA9_BMP[] = { + 0x0E, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x6E, 0xC0, + 0xDB, 0x60, + 0xD8, 0x60, + 0xD8, 0x60, + 0xDB, 0x60, + 0x6E, 0xC0, + 0x71, 0xC0, + 0x3F, 0x80, + 0x0E, 0x00 +}; + +static const uint8_t courB14L1_0xAA_BMP[] = { + 0x70, + 0x18, + 0x78, + 0xD8, + 0xD8, + 0x6C, + 0x00, + 0xFC +}; + +static const uint8_t courB14L1_0xAB_BMP[] = { + 0x19, 0x80, + 0x33, 0x00, + 0x66, 0x00, + 0xCC, 0x00, + 0x66, 0x00, + 0x33, 0x00, + 0x19, 0x80 +}; + +static const uint8_t courB14L1_0xAC_BMP[] = { + 0xFF, 0x80, + 0xFF, 0x80, + 0x01, 0x80, + 0x01, 0x80 +}; + +static const uint8_t courB14L1_0xAD_BMP[] = { + 0xFF, + 0xFF +}; + +static const uint8_t courB14L1_0xAE_BMP[] = { + 0x0E, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x7E, 0xC0, + 0xDB, 0x60, + 0xDB, 0x60, + 0xDE, 0x60, + 0xDF, 0x60, + 0x7B, 0xE0, + 0x70, 0xC0, + 0x3F, 0x80, + 0x0E, 0x00 +}; + +static const uint8_t courB14L1_0xAF_BMP[] = { + 0xF8, + 0xF8 +}; + +static const uint8_t courB14L1_0xB0_BMP[] = { + 0x70, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t courB14L1_0xB1_BMP[] = { + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x0C, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB14L1_0xB2_BMP[] = { + 0x78, + 0xCC, + 0x0C, + 0x18, + 0x30, + 0x64, + 0xFC +}; + +static const uint8_t courB14L1_0xB3_BMP[] = { + 0x78, + 0xCC, + 0x0C, + 0x38, + 0x0C, + 0xCC, + 0x78 +}; + +static const uint8_t courB14L1_0xB4_BMP[] = { + 0x30, + 0x60, + 0xC0 +}; + +static const uint8_t courB14L1_0xB5_BMP[] = { + 0xE7, 0x80, + 0xE7, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x63, 0x80, + 0x7F, 0xC0, + 0x7D, 0xC0, + 0x60, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0x60, 0x00 +}; + +static const uint8_t courB14L1_0xB6_BMP[] = { + 0x3F, + 0x6A, + 0xCA, + 0xCA, + 0xCA, + 0x6A, + 0x3A, + 0x0A, + 0x0A, + 0x0A, + 0x0A, + 0x0A, + 0x0A, + 0x3B +}; + +static const uint8_t courB14L1_0xB7_BMP[] = { + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t courB14L1_0xB8_BMP[] = { + 0x40, + 0x60, + 0x30, + 0xF0, + 0xE0 +}; + +static const uint8_t courB14L1_0xB9_BMP[] = { + 0x30, + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30, + 0xFC +}; + +static const uint8_t courB14L1_0xBA_BMP[] = { + 0x78, + 0xCC, + 0x84, + 0x84, + 0xCC, + 0x78, + 0x00, + 0xFC +}; + +static const uint8_t courB14L1_0xBB_BMP[] = { + 0xCC, 0x00, + 0x66, 0x00, + 0x33, 0x00, + 0x19, 0x80, + 0x33, 0x00, + 0x66, 0x00, + 0xCC, 0x00 +}; + +static const uint8_t courB14L1_0xBC_BMP[] = { + 0x30, 0x00, + 0xF0, 0x20, + 0x30, 0x60, + 0x30, 0xC0, + 0x31, 0x80, + 0x33, 0x40, + 0xFE, 0xC0, + 0x0D, 0xC0, + 0x1A, 0xC0, + 0x34, 0xC0, + 0x67, 0xE0, + 0x40, 0xC0 +}; + +static const uint8_t courB14L1_0xBD_BMP[] = { + 0x30, 0x00, + 0xF0, 0x20, + 0x30, 0x60, + 0x30, 0xC0, + 0x31, 0x80, + 0x33, 0xC0, + 0xFF, 0x60, + 0x0C, 0x60, + 0x18, 0xC0, + 0x31, 0x80, + 0x63, 0x20, + 0x47, 0xE0 +}; + +static const uint8_t courB14L1_0xBE_BMP[] = { + 0x78, 0x00, + 0xCC, 0x20, + 0x0C, 0x60, + 0x38, 0xC0, + 0x0D, 0x80, + 0xCF, 0x40, + 0x7E, 0xC0, + 0x0D, 0xC0, + 0x1A, 0xC0, + 0x34, 0xC0, + 0x67, 0xE0, + 0x40, 0xC0 +}; + +static const uint8_t courB14L1_0xBF_BMP[] = { + 0x18, + 0x18, + 0x00, + 0x18, + 0x18, + 0x18, + 0x78, + 0xE0, + 0xC0, + 0xC6, + 0xFE, + 0x7C +}; + +static const uint8_t courB14L1_0xC0_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0x3E, 0x00, + 0x3F, 0x00, + 0x0F, 0x00, + 0x0F, 0x00, + 0x19, 0x80, + 0x19, 0x80, + 0x3F, 0xC0, + 0x3F, 0xC0, + 0x30, 0xC0, + 0xF9, 0xF0, + 0xF9, 0xF0 +}; + +static const uint8_t courB14L1_0xC1_BMP[] = { + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x3E, 0x00, + 0x3F, 0x00, + 0x0F, 0x00, + 0x0F, 0x00, + 0x19, 0x80, + 0x19, 0x80, + 0x3F, 0xC0, + 0x3F, 0xC0, + 0x30, 0xC0, + 0xF9, 0xF0, + 0xF9, 0xF0 +}; + +static const uint8_t courB14L1_0xC2_BMP[] = { + 0x06, 0x00, + 0x0F, 0x00, + 0x19, 0x80, + 0x00, 0x00, + 0x3E, 0x00, + 0x3F, 0x00, + 0x0F, 0x00, + 0x0F, 0x00, + 0x19, 0x80, + 0x19, 0x80, + 0x3F, 0xC0, + 0x3F, 0xC0, + 0x30, 0xC0, + 0xF9, 0xF0, + 0xF9, 0xF0 +}; + +static const uint8_t courB14L1_0xC3_BMP[] = { + 0x1D, 0x80, + 0x37, 0x00, + 0x00, 0x00, + 0x3E, 0x00, + 0x3F, 0x00, + 0x0F, 0x00, + 0x0F, 0x00, + 0x19, 0x80, + 0x19, 0x80, + 0x3F, 0xC0, + 0x3F, 0xC0, + 0x30, 0xC0, + 0xF9, 0xF0, + 0xF9, 0xF0 +}; + +static const uint8_t courB14L1_0xC4_BMP[] = { + 0x19, 0x80, + 0x19, 0x80, + 0x00, 0x00, + 0x3E, 0x00, + 0x3F, 0x00, + 0x0F, 0x00, + 0x0F, 0x00, + 0x19, 0x80, + 0x19, 0x80, + 0x3F, 0xC0, + 0x3F, 0xC0, + 0x30, 0xC0, + 0xF9, 0xF0, + 0xF9, 0xF0 +}; + +static const uint8_t courB14L1_0xC5_BMP[] = { + 0x06, 0x00, + 0x09, 0x00, + 0x09, 0x00, + 0x06, 0x00, + 0x3E, 0x00, + 0x3F, 0x00, + 0x0F, 0x00, + 0x0F, 0x00, + 0x19, 0x80, + 0x19, 0x80, + 0x3F, 0xC0, + 0x3F, 0xC0, + 0x30, 0xC0, + 0xF9, 0xF0, + 0xF9, 0xF0 +}; + +static const uint8_t courB14L1_0xC6_BMP[] = { + 0x3F, 0xE0, + 0x3F, 0xE0, + 0x1E, 0x60, + 0x36, 0x00, + 0x37, 0xC0, + 0x27, 0xC0, + 0x7E, 0x00, + 0x7E, 0x00, + 0x66, 0x60, + 0xEF, 0xE0, + 0xEF, 0xE0 +}; + +static const uint8_t courB14L1_0xC7_BMP[] = { + 0x1E, 0xC0, + 0x7F, 0xC0, + 0x61, 0xC0, + 0xC0, 0xC0, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0x60, 0xC0, + 0x7F, 0xC0, + 0x3F, 0x00, + 0x08, 0x00, + 0x0C, 0x00, + 0x02, 0x00, + 0x1E, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t courB14L1_0xC8_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x30, 0xC0, + 0x36, 0xC0, + 0x3E, 0x00, + 0x3E, 0x00, + 0x36, 0x00, + 0x30, 0xC0, + 0x30, 0xC0, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB14L1_0xC9_BMP[] = { + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x30, 0xC0, + 0x36, 0xC0, + 0x3E, 0x00, + 0x3E, 0x00, + 0x36, 0x00, + 0x30, 0xC0, + 0x30, 0xC0, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB14L1_0xCA_BMP[] = { + 0x0C, 0x00, + 0x1E, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x30, 0xC0, + 0x36, 0xC0, + 0x3E, 0x00, + 0x3E, 0x00, + 0x36, 0x00, + 0x30, 0xC0, + 0x30, 0xC0, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB14L1_0xCB_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x30, 0xC0, + 0x36, 0xC0, + 0x3E, 0x00, + 0x3E, 0x00, + 0x36, 0x00, + 0x30, 0xC0, + 0x30, 0xC0, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB14L1_0xCC_BMP[] = { + 0x60, + 0x30, + 0x18, + 0x00, + 0xFF, + 0xFF, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF, + 0xFF +}; + +static const uint8_t courB14L1_0xCD_BMP[] = { + 0x06, + 0x0C, + 0x18, + 0x00, + 0xFF, + 0xFF, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF, + 0xFF +}; + +static const uint8_t courB14L1_0xCE_BMP[] = { + 0x18, + 0x3C, + 0x66, + 0x00, + 0xFF, + 0xFF, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF, + 0xFF +}; + +static const uint8_t courB14L1_0xCF_BMP[] = { + 0x66, + 0x66, + 0x00, + 0xFF, + 0xFF, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF, + 0xFF +}; + +static const uint8_t courB14L1_0xD0_BMP[] = { + 0xFE, 0x00, + 0xFF, 0x80, + 0x61, 0x80, + 0x60, 0xC0, + 0xF8, 0xC0, + 0xF8, 0xC0, + 0x60, 0xC0, + 0x60, 0xC0, + 0x61, 0x80, + 0xFF, 0x80, + 0xFE, 0x00 +}; + +static const uint8_t courB14L1_0xD1_BMP[] = { + 0x3B, 0x00, + 0x6E, 0x00, + 0x00, 0x00, + 0xE7, 0xC0, + 0xF7, 0xC0, + 0x71, 0x80, + 0x79, 0x80, + 0x69, 0x80, + 0x6D, 0x80, + 0x65, 0x80, + 0x67, 0x80, + 0x63, 0x80, + 0xFB, 0x80, + 0xF9, 0x80 +}; + +static const uint8_t courB14L1_0xD2_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x7F, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0x61, 0x80, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t courB14L1_0xD3_BMP[] = { + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x7F, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0x61, 0x80, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t courB14L1_0xD4_BMP[] = { + 0x0C, 0x00, + 0x1E, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x7F, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0x61, 0x80, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t courB14L1_0xD5_BMP[] = { + 0x3B, 0x00, + 0x6E, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x7F, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0x61, 0x80, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t courB14L1_0xD6_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x7F, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0x61, 0x80, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t courB14L1_0xD7_BMP[] = { + 0x40, 0x80, + 0xE1, 0xC0, + 0x73, 0x80, + 0x37, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x3B, 0x00, + 0x73, 0x80, + 0xE1, 0xC0, + 0x40, 0x80 +}; + +static const uint8_t courB14L1_0xD8_BMP[] = { + 0x00, 0x30, + 0x0F, 0x60, + 0x3F, 0xC0, + 0x31, 0xC0, + 0x63, 0x60, + 0x66, 0x60, + 0x66, 0x60, + 0x6C, 0x60, + 0x78, 0x60, + 0x30, 0xC0, + 0x3F, 0xC0, + 0x6F, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t courB14L1_0xD9_BMP[] = { + 0x30, 0x00, + 0x18, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xFB, 0xC0, + 0xFB, 0xC0, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x73, 0x80, + 0x3F, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t courB14L1_0xDA_BMP[] = { + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xFB, 0xC0, + 0xFB, 0xC0, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x73, 0x80, + 0x3F, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t courB14L1_0xDB_BMP[] = { + 0x0C, 0x00, + 0x1E, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0xFB, 0xC0, + 0xFB, 0xC0, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x73, 0x80, + 0x3F, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t courB14L1_0xDC_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0xFB, 0xC0, + 0xFB, 0xC0, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x73, 0x80, + 0x3F, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t courB14L1_0xDD_BMP[] = { + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xF3, 0xC0, + 0xF3, 0xC0, + 0x61, 0x80, + 0x33, 0x00, + 0x3F, 0x00, + 0x1E, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x3F, 0x00, + 0x3F, 0x00 +}; + +static const uint8_t courB14L1_0xDE_BMP[] = { + 0xF0, 0x00, + 0xE0, 0x00, + 0x7F, 0x00, + 0x7F, 0x80, + 0x61, 0xC0, + 0x60, 0xC0, + 0x61, 0xC0, + 0x7F, 0x80, + 0x7F, 0x00, + 0xE0, 0x00, + 0xF0, 0x00 +}; + +static const uint8_t courB14L1_0xDF_BMP[] = { + 0x3C, 0x00, + 0x7E, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x67, 0x00, + 0x6E, 0x00, + 0x67, 0x00, + 0x61, 0x80, + 0x61, 0x80, + 0x69, 0x80, + 0xEF, 0x80, + 0xE7, 0x00 +}; + +static const uint8_t courB14L1_0xE0_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0x3F, 0x00, + 0x7F, 0x80, + 0x61, 0x80, + 0x01, 0x80, + 0x7F, 0x80, + 0xFF, 0x80, + 0xC1, 0x80, + 0xFF, 0xC0, + 0x7D, 0xC0 +}; + +static const uint8_t courB14L1_0xE1_BMP[] = { + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x3F, 0x00, + 0x7F, 0x80, + 0x61, 0x80, + 0x01, 0x80, + 0x7F, 0x80, + 0xFF, 0x80, + 0xC1, 0x80, + 0xFF, 0xC0, + 0x7D, 0xC0 +}; + +static const uint8_t courB14L1_0xE2_BMP[] = { + 0x0C, 0x00, + 0x1E, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0x3F, 0x00, + 0x7F, 0x80, + 0x61, 0x80, + 0x01, 0x80, + 0x7F, 0x80, + 0xFF, 0x80, + 0xC1, 0x80, + 0xFF, 0xC0, + 0x7D, 0xC0 +}; + +static const uint8_t courB14L1_0xE3_BMP[] = { + 0x3B, 0x00, + 0x6E, 0x00, + 0x00, 0x00, + 0x3F, 0x00, + 0x7F, 0x80, + 0x61, 0x80, + 0x01, 0x80, + 0x7F, 0x80, + 0xFF, 0x80, + 0xC1, 0x80, + 0xFF, 0xC0, + 0x7D, 0xC0 +}; + +static const uint8_t courB14L1_0xE4_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0x3F, 0x00, + 0x7F, 0x80, + 0x61, 0x80, + 0x01, 0x80, + 0x7F, 0x80, + 0xFF, 0x80, + 0xC1, 0x80, + 0xFF, 0xC0, + 0x7D, 0xC0 +}; + +static const uint8_t courB14L1_0xE5_BMP[] = { + 0x0C, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x3F, 0x00, + 0x7F, 0x80, + 0x61, 0x80, + 0x01, 0x80, + 0x7F, 0x80, + 0xFF, 0x80, + 0xC1, 0x80, + 0xFF, 0xC0, + 0x7D, 0xC0 +}; + +static const uint8_t courB14L1_0xE6_BMP[] = { + 0x7B, 0x80, + 0xFF, 0xC0, + 0xCC, 0xC0, + 0x0C, 0xC0, + 0x7F, 0xC0, + 0xFF, 0xC0, + 0xCC, 0x00, + 0xFF, 0xC0, + 0x7B, 0x80 +}; + +static const uint8_t courB14L1_0xE7_BMP[] = { + 0x3D, 0x80, + 0x7F, 0x80, + 0xE3, 0x80, + 0xC1, 0x80, + 0xC0, 0x00, + 0xC0, 0x00, + 0xE1, 0xC0, + 0x7F, 0xC0, + 0x3F, 0x00, + 0x08, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x1E, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t courB14L1_0xE8_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x7F, 0x80, + 0xE1, 0xC0, + 0xC0, 0xC0, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xE0, 0x00, + 0x7F, 0xC0, + 0x1F, 0xC0 +}; + +static const uint8_t courB14L1_0xE9_BMP[] = { + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x7F, 0x80, + 0xE1, 0xC0, + 0xC0, 0xC0, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xE0, 0x00, + 0x7F, 0xC0, + 0x1F, 0xC0 +}; + +static const uint8_t courB14L1_0xEA_BMP[] = { + 0x0C, 0x00, + 0x1E, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x7F, 0x80, + 0xE1, 0xC0, + 0xC0, 0xC0, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xE0, 0x00, + 0x7F, 0xC0, + 0x1F, 0xC0 +}; + +static const uint8_t courB14L1_0xEB_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x7F, 0x80, + 0xE1, 0xC0, + 0xC0, 0xC0, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xE0, 0x00, + 0x7F, 0xC0, + 0x1F, 0xC0 +}; + +static const uint8_t courB14L1_0xEC_BMP[] = { + 0x30, + 0x18, + 0x0C, + 0x00, + 0xF8, + 0xF8, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF, + 0xFF +}; + +static const uint8_t courB14L1_0xED_BMP[] = { + 0x0C, + 0x18, + 0x30, + 0x00, + 0xF8, + 0xF8, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF, + 0xFF +}; + +static const uint8_t courB14L1_0xEE_BMP[] = { + 0x18, + 0x3C, + 0x66, + 0x00, + 0xF8, + 0xF8, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF, + 0xFF +}; + +static const uint8_t courB14L1_0xEF_BMP[] = { + 0xCC, + 0xCC, + 0x00, + 0xF8, + 0xF8, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF, + 0xFF +}; + +static const uint8_t courB14L1_0xF0_BMP[] = { + 0xE1, 0x80, + 0xFB, 0x80, + 0x3E, 0x00, + 0x77, 0x00, + 0xC3, 0x80, + 0x3F, 0x80, + 0x61, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t courB14L1_0xF1_BMP[] = { + 0x3B, 0x00, + 0x6E, 0x00, + 0x00, 0x00, + 0xEF, 0x00, + 0xFF, 0x80, + 0x71, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0xF3, 0xC0, + 0xF3, 0xC0 +}; + +static const uint8_t courB14L1_0xF2_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x7F, 0x80, + 0xE1, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t courB14L1_0xF3_BMP[] = { + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x7F, 0x80, + 0xE1, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t courB14L1_0xF4_BMP[] = { + 0x0C, 0x00, + 0x1E, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x7F, 0x80, + 0xE1, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t courB14L1_0xF5_BMP[] = { + 0x3B, 0x00, + 0x6E, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x7F, 0x80, + 0xE1, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t courB14L1_0xF6_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x7F, 0x80, + 0xE1, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t courB14L1_0xF7_BMP[] = { + 0x0C, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0x0C, 0x00, + 0x0C, 0x00 +}; + +static const uint8_t courB14L1_0xF8_BMP[] = { + 0x00, 0x30, + 0x0F, 0x60, + 0x3F, 0xC0, + 0x71, 0xE0, + 0x63, 0x60, + 0x66, 0x60, + 0x6C, 0x60, + 0x78, 0xE0, + 0x3F, 0xC0, + 0x6F, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t courB14L1_0xF9_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0xE7, 0x80, + 0xE7, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x63, 0x80, + 0x7F, 0xC0, + 0x3D, 0xC0 +}; + +static const uint8_t courB14L1_0xFA_BMP[] = { + 0x06, 0x00, + 0x0C, 0x00, + 0x18, 0x00, + 0x00, 0x00, + 0xE7, 0x80, + 0xE7, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x63, 0x80, + 0x7F, 0xC0, + 0x3D, 0xC0 +}; + +static const uint8_t courB14L1_0xFB_BMP[] = { + 0x0C, 0x00, + 0x1E, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0xE7, 0x80, + 0xE7, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x63, 0x80, + 0x7F, 0xC0, + 0x3D, 0xC0 +}; + +static const uint8_t courB14L1_0xFC_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0xE7, 0x80, + 0xE7, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x63, 0x80, + 0x7F, 0xC0, + 0x3D, 0xC0 +}; + +static const uint8_t courB14L1_0xFD_BMP[] = { + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xF3, 0xC0, + 0xF3, 0xC0, + 0x61, 0x80, + 0x61, 0x80, + 0x33, 0x00, + 0x33, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x0C, 0x00, + 0x18, 0x00, + 0x38, 0x00, + 0xFC, 0x00, + 0xFC, 0x00 +}; + +static const uint8_t courB14L1_0xFE_BMP[] = { + 0xE0, 0x00, + 0xE0, 0x00, + 0x60, 0x00, + 0x6F, 0x00, + 0x7F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0x60, 0xC0, + 0x60, 0xC0, + 0x71, 0xC0, + 0x7F, 0x80, + 0x6F, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0xF8, 0x00, + 0xF8, 0x00 +}; + +static const uint8_t courB14L1_0xFF_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0xF3, 0xC0, + 0xF3, 0xC0, + 0x61, 0x80, + 0x61, 0x80, + 0x33, 0x00, + 0x33, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x0C, 0x00, + 0x18, 0x00, + 0x38, 0x00, + 0xFC, 0x00, + 0xFC, 0x00 +}; + +static const GFONT_CharInfo FontBMP[] = { + {11, 9, 11, 0, 0, courB14L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {11, 1, 1, 0, 0, courB14L1_0x20_BMP}, + {11, 3, 12, 4, 0, courB14L1_0x21_BMP}, + {11, 6, 6, 2, 6, courB14L1_0x22_BMP}, + {11, 8, 14, 1, -1, courB14L1_0x23_BMP}, + {11, 8, 15, 1, -2, courB14L1_0x24_BMP}, + {11, 8, 12, 1, 0, courB14L1_0x25_BMP}, + {11, 8, 10, 1, 0, courB14L1_0x26_BMP}, + {11, 2, 6, 4, 6, courB14L1_0x27_BMP}, + {11, 4, 15, 4, -3, courB14L1_0x28_BMP}, + {11, 4, 15, 2, -3, courB14L1_0x29_BMP}, + {11, 8, 8, 1, 4, courB14L1_0x2A_BMP}, + {11, 10, 10, 0, 0, courB14L1_0x2B_BMP}, + {11, 4, 5, 2, -3, courB14L1_0x2C_BMP}, + {11, 8, 2, 1, 4, courB14L1_0x2D_BMP}, + {11, 2, 2, 4, 0, courB14L1_0x2E_BMP}, + {11, 9, 16, 0, -3, courB14L1_0x2F_BMP}, + {11, 8, 12, 1, 0, courB14L1_0x30_BMP}, + {11, 8, 12, 1, 0, courB14L1_0x31_BMP}, + {11, 8, 12, 1, 0, courB14L1_0x32_BMP}, + {11, 8, 12, 1, 0, courB14L1_0x33_BMP}, + {11, 8, 12, 1, 0, courB14L1_0x34_BMP}, + {11, 8, 12, 1, 0, courB14L1_0x35_BMP}, + {11, 8, 12, 1, 0, courB14L1_0x36_BMP}, + {11, 8, 12, 1, 0, courB14L1_0x37_BMP}, + {11, 8, 12, 1, 0, courB14L1_0x38_BMP}, + {11, 8, 12, 1, 0, courB14L1_0x39_BMP}, + {11, 2, 8, 4, 0, courB14L1_0x3A_BMP}, + {11, 4, 11, 2, -3, courB14L1_0x3B_BMP}, + {11, 9, 9, 1, 1, courB14L1_0x3C_BMP}, + {11, 10, 6, 0, 2, courB14L1_0x3D_BMP}, + {11, 9, 9, 1, 1, courB14L1_0x3E_BMP}, + {11, 7, 11, 2, 0, courB14L1_0x3F_BMP}, + {11, 9, 13, 1, -1, courB14L1_0x40_BMP}, + {11, 12, 11, -1, 0, courB14L1_0x41_BMP}, + {11, 10, 11, 0, 0, courB14L1_0x42_BMP}, + {11, 10, 11, 0, 0, courB14L1_0x43_BMP}, + {11, 10, 11, 0, 0, courB14L1_0x44_BMP}, + {11, 10, 11, 0, 0, courB14L1_0x45_BMP}, + {11, 10, 11, 0, 0, courB14L1_0x46_BMP}, + {11, 11, 11, 0, 0, courB14L1_0x47_BMP}, + {11, 10, 11, 0, 0, courB14L1_0x48_BMP}, + {11, 8, 11, 1, 0, courB14L1_0x49_BMP}, + {11, 10, 11, 0, 0, courB14L1_0x4A_BMP}, + {11, 11, 11, 0, 0, courB14L1_0x4B_BMP}, + {11, 10, 11, 0, 0, courB14L1_0x4C_BMP}, + {11, 10, 11, 0, 0, courB14L1_0x4D_BMP}, + {11, 10, 11, 0, 0, courB14L1_0x4E_BMP}, + {11, 10, 11, 0, 0, courB14L1_0x4F_BMP}, + {11, 10, 11, 0, 0, courB14L1_0x50_BMP}, + {11, 10, 13, 0, -2, courB14L1_0x51_BMP}, + {11, 11, 11, 0, 0, courB14L1_0x52_BMP}, + {11, 9, 11, 1, 0, courB14L1_0x53_BMP}, + {11, 10, 11, 0, 0, courB14L1_0x54_BMP}, + {11, 10, 11, 0, 0, courB14L1_0x55_BMP}, + {11, 12, 11, -1, 0, courB14L1_0x56_BMP}, + {11, 12, 11, -1, 0, courB14L1_0x57_BMP}, + {11, 10, 11, 0, 0, courB14L1_0x58_BMP}, + {11, 10, 11, 0, 0, courB14L1_0x59_BMP}, + {11, 8, 11, 1, 0, courB14L1_0x5A_BMP}, + {11, 4, 15, 4, -3, courB14L1_0x5B_BMP}, + {11, 9, 16, 1, -3, courB14L1_0x5C_BMP}, + {11, 4, 15, 2, -3, courB14L1_0x5D_BMP}, + {11, 8, 7, 1, 5, courB14L1_0x5E_BMP}, + {11, 11, 2, 0, -4, courB14L1_0x5F_BMP}, + {11, 4, 3, 3, 9, courB14L1_0x60_BMP}, + {11, 10, 9, 0, 0, courB14L1_0x61_BMP}, + {11, 10, 12, 0, 0, courB14L1_0x62_BMP}, + {11, 10, 9, 0, 0, courB14L1_0x63_BMP}, + {11, 10, 12, 0, 0, courB14L1_0x64_BMP}, + {11, 10, 9, 0, 0, courB14L1_0x65_BMP}, + {11, 9, 12, 1, 0, courB14L1_0x66_BMP}, + {11, 10, 13, 0, -4, courB14L1_0x67_BMP}, + {11, 10, 12, 0, 0, courB14L1_0x68_BMP}, + {11, 8, 12, 1, 0, courB14L1_0x69_BMP}, + {11, 7, 16, 1, -4, courB14L1_0x6A_BMP}, + {11, 10, 12, 0, 0, courB14L1_0x6B_BMP}, + {11, 8, 12, 1, 0, courB14L1_0x6C_BMP}, + {11, 12, 9, -1, 0, courB14L1_0x6D_BMP}, + {11, 10, 9, 0, 0, courB14L1_0x6E_BMP}, + {11, 10, 9, 0, 0, courB14L1_0x6F_BMP}, + {11, 10, 13, 0, -4, courB14L1_0x70_BMP}, + {11, 10, 13, 0, -4, courB14L1_0x71_BMP}, + {11, 10, 9, 0, 0, courB14L1_0x72_BMP}, + {11, 8, 9, 1, 0, courB14L1_0x73_BMP}, + {11, 10, 12, 0, 0, courB14L1_0x74_BMP}, + {11, 10, 9, 0, 0, courB14L1_0x75_BMP}, + {11, 10, 9, 0, 0, courB14L1_0x76_BMP}, + {11, 11, 9, 0, 0, courB14L1_0x77_BMP}, + {11, 11, 9, 0, 0, courB14L1_0x78_BMP}, + {11, 10, 13, 0, -4, courB14L1_0x79_BMP}, + {11, 8, 9, 1, 0, courB14L1_0x7A_BMP}, + {11, 4, 15, 3, -3, courB14L1_0x7B_BMP}, + {11, 2, 14, 4, -3, courB14L1_0x7C_BMP}, + {11, 4, 15, 3, -3, courB14L1_0x7D_BMP}, + {11, 8, 3, 1, 4, courB14L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {11, 1, 1, 0, 0, courB14L1_0xA0_BMP}, + {11, 3, 12, 4, -4, courB14L1_0xA1_BMP}, + {11, 8, 13, 1, 0, courB14L1_0xA2_BMP}, + {11, 10, 11, 0, 0, courB14L1_0xA3_BMP}, + {11, 8, 9, 1, 1, courB14L1_0xA4_BMP}, + {11, 10, 11, 0, 0, courB14L1_0xA5_BMP}, + {11, 2, 16, 4, -3, courB14L1_0xA6_BMP}, + {11, 8, 14, 1, -2, courB14L1_0xA7_BMP}, + {11, 6, 2, 2, 9, courB14L1_0xA8_BMP}, + {11, 11, 12, 0, 0, courB14L1_0xA9_BMP}, + {11, 6, 8, 2, 3, courB14L1_0xAA_BMP}, + {11, 9, 7, 0, 1, courB14L1_0xAB_BMP}, + {11, 9, 4, 1, 4, courB14L1_0xAC_BMP}, + {11, 8, 2, 1, 4, courB14L1_0xAD_BMP}, + {11, 11, 12, 0, 0, courB14L1_0xAE_BMP}, + {11, 5, 2, 2, 9, courB14L1_0xAF_BMP}, + {11, 5, 5, 2, 6, courB14L1_0xB0_BMP}, + {11, 10, 10, 0, 0, courB14L1_0xB1_BMP}, + {11, 6, 7, 2, 5, courB14L1_0xB2_BMP}, + {11, 6, 7, 2, 5, courB14L1_0xB3_BMP}, + {11, 4, 3, 4, 9, courB14L1_0xB4_BMP}, + {11, 10, 13, 0, -4, courB14L1_0xB5_BMP}, + {11, 8, 14, 1, -2, courB14L1_0xB6_BMP}, + {11, 2, 3, 4, 3, courB14L1_0xB7_BMP}, + {11, 4, 5, 3, -4, courB14L1_0xB8_BMP}, + {11, 6, 7, 2, 5, courB14L1_0xB9_BMP}, + {11, 6, 8, 2, 3, courB14L1_0xBA_BMP}, + {11, 9, 7, 1, 1, courB14L1_0xBB_BMP}, + {11, 11, 12, 0, 0, courB14L1_0xBC_BMP}, + {11, 11, 12, 0, 0, courB14L1_0xBD_BMP}, + {11, 11, 12, 0, 0, courB14L1_0xBE_BMP}, + {11, 7, 12, 2, -4, courB14L1_0xBF_BMP}, + {11, 12, 15, -1, 0, courB14L1_0xC0_BMP}, + {11, 12, 15, -1, 0, courB14L1_0xC1_BMP}, + {11, 12, 15, -1, 0, courB14L1_0xC2_BMP}, + {11, 12, 14, -1, 0, courB14L1_0xC3_BMP}, + {11, 12, 14, -1, 0, courB14L1_0xC4_BMP}, + {11, 12, 15, -1, 0, courB14L1_0xC5_BMP}, + {11, 11, 11, 0, 0, courB14L1_0xC6_BMP}, + {11, 10, 16, 0, -5, courB14L1_0xC7_BMP}, + {11, 10, 15, 0, 0, courB14L1_0xC8_BMP}, + {11, 10, 15, 0, 0, courB14L1_0xC9_BMP}, + {11, 10, 15, 0, 0, courB14L1_0xCA_BMP}, + {11, 10, 14, 0, 0, courB14L1_0xCB_BMP}, + {11, 8, 15, 1, 0, courB14L1_0xCC_BMP}, + {11, 8, 15, 1, 0, courB14L1_0xCD_BMP}, + {11, 8, 15, 1, 0, courB14L1_0xCE_BMP}, + {11, 8, 14, 1, 0, courB14L1_0xCF_BMP}, + {11, 10, 11, 0, 0, courB14L1_0xD0_BMP}, + {11, 10, 14, 0, 0, courB14L1_0xD1_BMP}, + {11, 10, 15, 0, 0, courB14L1_0xD2_BMP}, + {11, 10, 15, 0, 0, courB14L1_0xD3_BMP}, + {11, 10, 15, 0, 0, courB14L1_0xD4_BMP}, + {11, 10, 14, 0, 0, courB14L1_0xD5_BMP}, + {11, 10, 14, 0, 0, courB14L1_0xD6_BMP}, + {11, 10, 10, 0, 0, courB14L1_0xD7_BMP}, + {11, 12, 13, -1, -1, courB14L1_0xD8_BMP}, + {11, 10, 15, 0, 0, courB14L1_0xD9_BMP}, + {11, 10, 15, 0, 0, courB14L1_0xDA_BMP}, + {11, 10, 15, 0, 0, courB14L1_0xDB_BMP}, + {11, 10, 14, 0, 0, courB14L1_0xDC_BMP}, + {11, 10, 15, 0, 0, courB14L1_0xDD_BMP}, + {11, 10, 11, 0, 0, courB14L1_0xDE_BMP}, + {11, 9, 12, 1, 0, courB14L1_0xDF_BMP}, + {11, 10, 13, 0, 0, courB14L1_0xE0_BMP}, + {11, 10, 13, 0, 0, courB14L1_0xE1_BMP}, + {11, 10, 13, 0, 0, courB14L1_0xE2_BMP}, + {11, 10, 12, 0, 0, courB14L1_0xE3_BMP}, + {11, 10, 12, 0, 0, courB14L1_0xE4_BMP}, + {11, 10, 14, 0, 0, courB14L1_0xE5_BMP}, + {11, 10, 9, 0, 0, courB14L1_0xE6_BMP}, + {11, 10, 14, 0, -5, courB14L1_0xE7_BMP}, + {11, 10, 13, 0, 0, courB14L1_0xE8_BMP}, + {11, 10, 13, 0, 0, courB14L1_0xE9_BMP}, + {11, 10, 13, 0, 0, courB14L1_0xEA_BMP}, + {11, 10, 12, 0, 0, courB14L1_0xEB_BMP}, + {11, 8, 13, 1, 0, courB14L1_0xEC_BMP}, + {11, 8, 13, 1, 0, courB14L1_0xED_BMP}, + {11, 8, 13, 1, 0, courB14L1_0xEE_BMP}, + {11, 8, 12, 1, 0, courB14L1_0xEF_BMP}, + {11, 10, 13, 0, 0, courB14L1_0xF0_BMP}, + {11, 10, 12, 0, 0, courB14L1_0xF1_BMP}, + {11, 10, 13, 0, 0, courB14L1_0xF2_BMP}, + {11, 10, 13, 0, 0, courB14L1_0xF3_BMP}, + {11, 10, 13, 0, 0, courB14L1_0xF4_BMP}, + {11, 10, 12, 0, 0, courB14L1_0xF5_BMP}, + {11, 10, 12, 0, 0, courB14L1_0xF6_BMP}, + {11, 10, 10, 0, 0, courB14L1_0xF7_BMP}, + {11, 12, 11, -1, -1, courB14L1_0xF8_BMP}, + {11, 10, 13, 0, 0, courB14L1_0xF9_BMP}, + {11, 10, 13, 0, 0, courB14L1_0xFA_BMP}, + {11, 10, 13, 0, 0, courB14L1_0xFB_BMP}, + {11, 10, 12, 0, 0, courB14L1_0xFC_BMP}, + {11, 10, 17, 0, -4, courB14L1_0xFD_BMP}, + {11, 10, 16, 0, -4, courB14L1_0xFE_BMP}, + {11, 10, 16, 0, -4, courB14L1_0xFF_BMP} +}; + + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontCour14Bold_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontCour14Bold_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontCour14Bold_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontCour14Bold_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontCour14Bold_GetFontChar, + McuFontCour14Bold_FBBy, + McuFontCour14Bold_GetUnderlineBoxHeight(), + McuFontCour14Bold_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour14Bold_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour14Bold_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour14Bold_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour14Bold_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontCour14Bold. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour14Bold.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour14Bold.h new file mode 100644 index 0000000..747f16b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour14Bold.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour14Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour14Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 14 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour14Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour14Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour14Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour14Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour14Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontCour14Bold_Deinit(void); +** Init - void McuFontCour14Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour14Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour14Bold_module McuFontCour14Bold module documentation +** @{ +*/ + + +#ifndef __McuFontCour14Bold_H +#define __McuFontCour14Bold_H + +/* MODULE McuFontCour14Bold. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontCour14Boldconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontCour14Bold_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontCour14Bold_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontCour14Bold_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontCour14Bold_GetLineSpaceHeight() \ + 1 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontCour14Bold_GetUnderlineBoxHeight() \ + 7 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontCour14Bold_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontCour14Bold_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontCour14Bold. */ + +#endif +/* ifndef __McuFontCour14Bold_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour14Normal.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour14Normal.c new file mode 100644 index 0000000..38d56e9 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour14Normal.c @@ -0,0 +1,3198 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour14Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour14Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 14 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour14Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour14Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour14Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour14Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour14Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontCour14Normal_Deinit(void); +** Init - void McuFontCour14Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour14Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour14Normal_module McuFontCour14Normal module documentation +** @{ +*/ + +/* MODULE McuFontCour14Normal. */ + +#include "McuFontCour14Normal.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontCour14Normal_FBBy 20 + +static const uint8_t courR14L1_0x00_BMP[] = { + 0xAA, 0x80, + 0x00, 0x00, + 0x80, 0x80, + 0x00, 0x00, + 0x80, 0x80, + 0x00, 0x00, + 0x80, 0x80, + 0x00, 0x00, + 0x80, 0x80, + 0x00, 0x00, + 0xAA, 0x80 +}; + +static const uint8_t courR14L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t courR14L1_0x21_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x40, + 0x40, + 0x00, + 0x00, + 0xC0, + 0xC0 +}; + +static const uint8_t courR14L1_0x22_BMP[] = { + 0xCC, + 0xCC, + 0xCC, + 0x44, + 0x44 +}; + +static const uint8_t courR14L1_0x23_BMP[] = { + 0x12, + 0x12, + 0x12, + 0x12, + 0x12, + 0x7F, + 0x24, + 0x24, + 0x24, + 0xFE, + 0x24, + 0x24, + 0x24, + 0x24, + 0x24 +}; + +static const uint8_t courR14L1_0x24_BMP[] = { + 0x10, + 0x10, + 0x74, + 0x8C, + 0x84, + 0x80, + 0x60, + 0x18, + 0x04, + 0x84, + 0xC4, + 0xB8, + 0x10, + 0x10, + 0x10 +}; + +static const uint8_t courR14L1_0x25_BMP[] = { + 0x38, 0x00, + 0x44, 0x00, + 0x44, 0x00, + 0x44, 0x00, + 0x39, 0x80, + 0x0E, 0x00, + 0x30, 0x00, + 0xCE, 0x00, + 0x11, 0x00, + 0x11, 0x00, + 0x11, 0x00, + 0x0E, 0x00 +}; + +static const uint8_t courR14L1_0x26_BMP[] = { + 0x38, + 0x40, + 0x40, + 0x40, + 0x20, + 0x74, + 0x88, + 0x88, + 0x98, + 0x66 +}; + +static const uint8_t courR14L1_0x27_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0x40, + 0x40 +}; + +static const uint8_t courR14L1_0x28_BMP[] = { + 0x20, + 0x40, + 0x40, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x40, + 0x40, + 0x20 +}; + +static const uint8_t courR14L1_0x29_BMP[] = { + 0x80, + 0x40, + 0x40, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t courR14L1_0x2A_BMP[] = { + 0x10, + 0x10, + 0x10, + 0xFE, + 0x10, + 0x28, + 0x44, + 0x44 +}; + +static const uint8_t courR14L1_0x2B_BMP[] = { + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0xFF, 0x80, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00 +}; + +static const uint8_t courR14L1_0x2C_BMP[] = { + 0x30, + 0x30, + 0x60, + 0x40, + 0x80 +}; + +static const uint8_t courR14L1_0x2D_BMP[] = { + 0xFF +}; + +static const uint8_t courR14L1_0x2E_BMP[] = { + 0xC0, + 0xC0 +}; + +static const uint8_t courR14L1_0x2F_BMP[] = { + 0x01, + 0x01, + 0x02, + 0x02, + 0x04, + 0x04, + 0x08, + 0x08, + 0x10, + 0x10, + 0x20, + 0x20, + 0x40, + 0x40, + 0x80, + 0x80 +}; + +static const uint8_t courR14L1_0x30_BMP[] = { + 0x38, + 0x44, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t courR14L1_0x31_BMP[] = { + 0x30, + 0xD0, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR14L1_0x32_BMP[] = { + 0x1C, + 0x22, + 0x41, + 0x41, + 0x01, + 0x02, + 0x04, + 0x08, + 0x10, + 0x21, + 0x41, + 0xFF +}; + +static const uint8_t courR14L1_0x33_BMP[] = { + 0x78, + 0x84, + 0x02, + 0x02, + 0x04, + 0x38, + 0x04, + 0x02, + 0x02, + 0x02, + 0x84, + 0x78 +}; + +static const uint8_t courR14L1_0x34_BMP[] = { + 0x0C, + 0x14, + 0x14, + 0x24, + 0x24, + 0x44, + 0x44, + 0x84, + 0xFE, + 0x04, + 0x04, + 0x1E +}; + +static const uint8_t courR14L1_0x35_BMP[] = { + 0x7E, + 0x40, + 0x40, + 0x40, + 0x5C, + 0x62, + 0x01, + 0x01, + 0x01, + 0x01, + 0xC2, + 0x3C +}; + +static const uint8_t courR14L1_0x36_BMP[] = { + 0x1C, + 0x60, + 0x40, + 0x80, + 0x80, + 0xB8, + 0xC4, + 0x82, + 0x82, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t courR14L1_0x37_BMP[] = { + 0xFE, + 0x82, + 0x02, + 0x02, + 0x04, + 0x04, + 0x04, + 0x04, + 0x08, + 0x08, + 0x08, + 0x08 +}; + +static const uint8_t courR14L1_0x38_BMP[] = { + 0x38, + 0x44, + 0x82, + 0x82, + 0x44, + 0x38, + 0x44, + 0x82, + 0x82, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t courR14L1_0x39_BMP[] = { + 0x38, + 0x44, + 0x82, + 0x82, + 0x82, + 0x46, + 0x3A, + 0x02, + 0x02, + 0x04, + 0x0C, + 0x70 +}; + +static const uint8_t courR14L1_0x3A_BMP[] = { + 0xC0, + 0xC0, + 0x00, + 0x00, + 0x00, + 0x00, + 0xC0, + 0xC0 +}; + +static const uint8_t courR14L1_0x3B_BMP[] = { + 0x30, + 0x30, + 0x00, + 0x00, + 0x00, + 0x00, + 0x30, + 0x30, + 0x60, + 0x40, + 0x80 +}; + +static const uint8_t courR14L1_0x3C_BMP[] = { + 0x00, 0xC0, + 0x03, 0x00, + 0x0C, 0x00, + 0x30, 0x00, + 0xC0, 0x00, + 0x30, 0x00, + 0x0C, 0x00, + 0x03, 0x00, + 0x00, 0xC0 +}; + +static const uint8_t courR14L1_0x3D_BMP[] = { + 0xFF, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0x80 +}; + +static const uint8_t courR14L1_0x3E_BMP[] = { + 0xC0, 0x00, + 0x30, 0x00, + 0x0C, 0x00, + 0x03, 0x00, + 0x00, 0xC0, + 0x03, 0x00, + 0x0C, 0x00, + 0x30, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t courR14L1_0x3F_BMP[] = { + 0x7C, + 0x82, + 0x82, + 0x02, + 0x02, + 0x1C, + 0x10, + 0x10, + 0x00, + 0x18, + 0x18 +}; + +static const uint8_t courR14L1_0x40_BMP[] = { + 0x38, + 0x44, + 0x82, + 0x82, + 0x8E, + 0x92, + 0x92, + 0x92, + 0x8F, + 0x80, + 0x80, + 0x43, + 0x3C +}; + +static const uint8_t courR14L1_0x41_BMP[] = { + 0x3C, 0x00, + 0x04, 0x00, + 0x0A, 0x00, + 0x0A, 0x00, + 0x11, 0x00, + 0x11, 0x00, + 0x20, 0x80, + 0x3F, 0x80, + 0x40, 0x40, + 0x40, 0x40, + 0xF1, 0xE0 +}; + +static const uint8_t courR14L1_0x42_BMP[] = { + 0xFC, 0x00, + 0x42, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x42, 0x00, + 0x7E, 0x00, + 0x41, 0x00, + 0x40, 0x80, + 0x40, 0x80, + 0x41, 0x00, + 0xFE, 0x00 +}; + +static const uint8_t courR14L1_0x43_BMP[] = { + 0x1E, 0x80, + 0x61, 0x80, + 0x40, 0x80, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x40, 0x80, + 0x61, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t courR14L1_0x44_BMP[] = { + 0xFC, 0x00, + 0x43, 0x00, + 0x41, 0x00, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x41, 0x00, + 0x43, 0x00, + 0xFC, 0x00 +}; + +static const uint8_t courR14L1_0x45_BMP[] = { + 0xFF, + 0x41, + 0x41, + 0x41, + 0x48, + 0x78, + 0x48, + 0x41, + 0x41, + 0x41, + 0xFF +}; + +static const uint8_t courR14L1_0x46_BMP[] = { + 0xFF, + 0x41, + 0x41, + 0x41, + 0x48, + 0x78, + 0x48, + 0x40, + 0x40, + 0x40, + 0xF0 +}; + +static const uint8_t courR14L1_0x47_BMP[] = { + 0x1E, 0x80, + 0x61, 0x80, + 0x40, 0x80, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x83, 0xC0, + 0x80, 0x80, + 0x40, 0x80, + 0x61, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t courR14L1_0x48_BMP[] = { + 0xE3, 0x80, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x7F, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0xE3, 0x80 +}; + +static const uint8_t courR14L1_0x49_BMP[] = { + 0xFE, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR14L1_0x4A_BMP[] = { + 0x1F, 0x80, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x82, 0x00, + 0x82, 0x00, + 0x82, 0x00, + 0x44, 0x00, + 0x38, 0x00 +}; + +static const uint8_t courR14L1_0x4B_BMP[] = { + 0xF3, 0xC0, + 0x41, 0x00, + 0x42, 0x00, + 0x44, 0x00, + 0x48, 0x00, + 0x58, 0x00, + 0x64, 0x00, + 0x42, 0x00, + 0x42, 0x00, + 0x41, 0x00, + 0xF1, 0xC0 +}; + +static const uint8_t courR14L1_0x4C_BMP[] = { + 0xF8, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x80, + 0x20, 0x80, + 0x20, 0x80, + 0xFF, 0x80 +}; + +static const uint8_t courR14L1_0x4D_BMP[] = { + 0xE0, 0xE0, + 0x60, 0xC0, + 0x51, 0x40, + 0x51, 0x40, + 0x4A, 0x40, + 0x4A, 0x40, + 0x44, 0x40, + 0x44, 0x40, + 0x40, 0x40, + 0x40, 0x40, + 0xF1, 0xE0 +}; + +static const uint8_t courR14L1_0x4E_BMP[] = { + 0xE7, 0x80, + 0x61, 0x00, + 0x51, 0x00, + 0x51, 0x00, + 0x49, 0x00, + 0x49, 0x00, + 0x45, 0x00, + 0x45, 0x00, + 0x43, 0x00, + 0x43, 0x00, + 0xF1, 0x00 +}; + +static const uint8_t courR14L1_0x4F_BMP[] = { + 0x1C, 0x00, + 0x63, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x41, 0x00, + 0x63, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t courR14L1_0x50_BMP[] = { + 0xFE, 0x00, + 0x41, 0x00, + 0x40, 0x80, + 0x40, 0x80, + 0x41, 0x00, + 0x7E, 0x00, + 0x40, 0x00, + 0x40, 0x00, + 0x40, 0x00, + 0x40, 0x00, + 0xF8, 0x00 +}; + +static const uint8_t courR14L1_0x51_BMP[] = { + 0x1C, 0x00, + 0x63, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x41, 0x00, + 0x63, 0x00, + 0x1C, 0x00, + 0x38, 0x80, + 0x47, 0x00 +}; + +static const uint8_t courR14L1_0x52_BMP[] = { + 0xFE, 0x00, + 0x41, 0x00, + 0x40, 0x80, + 0x40, 0x80, + 0x41, 0x00, + 0x7E, 0x00, + 0x44, 0x00, + 0x42, 0x00, + 0x42, 0x00, + 0x41, 0x00, + 0xF0, 0xC0 +}; + +static const uint8_t courR14L1_0x53_BMP[] = { + 0x3D, + 0x43, + 0x81, + 0x80, + 0x40, + 0x3C, + 0x02, + 0x01, + 0x81, + 0xC2, + 0xBC +}; + +static const uint8_t courR14L1_0x54_BMP[] = { + 0xFF, 0x80, + 0x88, 0x80, + 0x88, 0x80, + 0x88, 0x80, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courR14L1_0x55_BMP[] = { + 0xF3, 0xC0, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x21, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t courR14L1_0x56_BMP[] = { + 0xF1, 0xE0, + 0x40, 0x40, + 0x40, 0x40, + 0x20, 0x80, + 0x20, 0x80, + 0x11, 0x00, + 0x11, 0x00, + 0x0A, 0x00, + 0x0A, 0x00, + 0x04, 0x00, + 0x04, 0x00 +}; + +static const uint8_t courR14L1_0x57_BMP[] = { + 0xF1, 0xE0, + 0x40, 0x40, + 0x44, 0x40, + 0x44, 0x40, + 0x44, 0x40, + 0x2A, 0x80, + 0x2A, 0x80, + 0x2A, 0x80, + 0x2A, 0x80, + 0x11, 0x00, + 0x11, 0x00 +}; + +static const uint8_t courR14L1_0x58_BMP[] = { + 0xE3, 0x80, + 0x41, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x08, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x41, 0x00, + 0xE3, 0x80 +}; + +static const uint8_t courR14L1_0x59_BMP[] = { + 0xE3, 0x80, + 0x41, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courR14L1_0x5A_BMP[] = { + 0xFE, + 0x82, + 0x82, + 0x04, + 0x08, + 0x10, + 0x20, + 0x40, + 0x82, + 0x82, + 0xFE +}; + +static const uint8_t courR14L1_0x5B_BMP[] = { + 0xE0, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0xE0 +}; + +static const uint8_t courR14L1_0x5C_BMP[] = { + 0x80, + 0x80, + 0x40, + 0x40, + 0x20, + 0x20, + 0x10, + 0x10, + 0x08, + 0x08, + 0x04, + 0x04, + 0x02, + 0x02, + 0x01, + 0x01 +}; + +static const uint8_t courR14L1_0x5D_BMP[] = { + 0xE0, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xE0 +}; + +static const uint8_t courR14L1_0x5E_BMP[] = { + 0x10, + 0x28, + 0x44, + 0x82 +}; + +static const uint8_t courR14L1_0x5F_BMP[] = { + 0xFF, 0xE0 +}; + +static const uint8_t courR14L1_0x60_BMP[] = { + 0x80, + 0x40, + 0x20 +}; + +static const uint8_t courR14L1_0x61_BMP[] = { + 0x3C, 0x00, + 0x42, 0x00, + 0x02, 0x00, + 0x7E, 0x00, + 0x82, 0x00, + 0x82, 0x00, + 0x86, 0x00, + 0x7B, 0x80 +}; + +static const uint8_t courR14L1_0x62_BMP[] = { + 0xC0, 0x00, + 0x40, 0x00, + 0x40, 0x00, + 0x40, 0x00, + 0x5E, 0x00, + 0x61, 0x00, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x61, 0x00, + 0xDE, 0x00 +}; + +static const uint8_t courR14L1_0x63_BMP[] = { + 0x3D, + 0x43, + 0x81, + 0x80, + 0x80, + 0x80, + 0x43, + 0x3C +}; + +static const uint8_t courR14L1_0x64_BMP[] = { + 0x03, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x3D, 0x00, + 0x43, 0x00, + 0x81, 0x00, + 0x81, 0x00, + 0x81, 0x00, + 0x81, 0x00, + 0x43, 0x00, + 0x3D, 0x80 +}; + +static const uint8_t courR14L1_0x65_BMP[] = { + 0x3C, + 0x42, + 0x81, + 0xFF, + 0x80, + 0x80, + 0x43, + 0x3C +}; + +static const uint8_t courR14L1_0x66_BMP[] = { + 0x0F, + 0x10, + 0x20, + 0x20, + 0xFE, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xFE +}; + +static const uint8_t courR14L1_0x67_BMP[] = { + 0x3D, 0x80, + 0x43, 0x00, + 0x81, 0x00, + 0x81, 0x00, + 0x81, 0x00, + 0x81, 0x00, + 0x43, 0x00, + 0x3D, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x02, 0x00, + 0x7C, 0x00 +}; + +static const uint8_t courR14L1_0x68_BMP[] = { + 0xC0, 0x00, + 0x40, 0x00, + 0x40, 0x00, + 0x40, 0x00, + 0x5E, 0x00, + 0x61, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0xE3, 0x80 +}; + +static const uint8_t courR14L1_0x69_BMP[] = { + 0x10, + 0x10, + 0x00, + 0x70, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR14L1_0x6A_BMP[] = { + 0x08, + 0x08, + 0x00, + 0xFC, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x08, + 0xF0 +}; + +static const uint8_t courR14L1_0x6B_BMP[] = { + 0xC0, 0x00, + 0x40, 0x00, + 0x40, 0x00, + 0x40, 0x00, + 0x4F, 0x00, + 0x44, 0x00, + 0x48, 0x00, + 0x70, 0x00, + 0x48, 0x00, + 0x44, 0x00, + 0x42, 0x00, + 0xC7, 0x80 +}; + +static const uint8_t courR14L1_0x6C_BMP[] = { + 0xF0, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR14L1_0x6D_BMP[] = { + 0xD9, 0x80, + 0x66, 0x40, + 0x44, 0x40, + 0x44, 0x40, + 0x44, 0x40, + 0x44, 0x40, + 0x44, 0x40, + 0xE6, 0x60 +}; + +static const uint8_t courR14L1_0x6E_BMP[] = { + 0xDE, 0x00, + 0x61, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0xE3, 0x80 +}; + +static const uint8_t courR14L1_0x6F_BMP[] = { + 0x3C, + 0x42, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t courR14L1_0x70_BMP[] = { + 0xDE, 0x00, + 0x61, 0x00, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x61, 0x00, + 0x5E, 0x00, + 0x40, 0x00, + 0x40, 0x00, + 0x40, 0x00, + 0xF0, 0x00 +}; + +static const uint8_t courR14L1_0x71_BMP[] = { + 0x3D, 0x80, + 0x43, 0x00, + 0x81, 0x00, + 0x81, 0x00, + 0x81, 0x00, + 0x81, 0x00, + 0x43, 0x00, + 0x3D, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x07, 0x80 +}; + +static const uint8_t courR14L1_0x72_BMP[] = { + 0xEE, + 0x31, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xFE +}; + +static const uint8_t courR14L1_0x73_BMP[] = { + 0x7A, + 0x86, + 0x82, + 0x70, + 0x0C, + 0x82, + 0xC2, + 0xBC +}; + +static const uint8_t courR14L1_0x74_BMP[] = { + 0x20, + 0x20, + 0x20, + 0xFE, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x21, + 0x1E +}; + +static const uint8_t courR14L1_0x75_BMP[] = { + 0xC3, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x43, 0x00, + 0x3D, 0x80 +}; + +static const uint8_t courR14L1_0x76_BMP[] = { + 0xE3, 0x80, + 0x41, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x08, 0x00, + 0x08, 0x00 +}; + +static const uint8_t courR14L1_0x77_BMP[] = { + 0xE3, 0x80, + 0x41, 0x00, + 0x49, 0x00, + 0x49, 0x00, + 0x55, 0x00, + 0x55, 0x00, + 0x22, 0x00, + 0x22, 0x00 +}; + +static const uint8_t courR14L1_0x78_BMP[] = { + 0xE7, + 0x42, + 0x24, + 0x18, + 0x18, + 0x24, + 0x42, + 0xE7 +}; + +static const uint8_t courR14L1_0x79_BMP[] = { + 0xE3, 0x80, + 0x41, 0x00, + 0x41, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0xF8, 0x00 +}; + +static const uint8_t courR14L1_0x7A_BMP[] = { + 0xFE, + 0x82, + 0x84, + 0x08, + 0x10, + 0x22, + 0x42, + 0xFE +}; + +static const uint8_t courR14L1_0x7B_BMP[] = { + 0x18, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xC0, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x18 +}; + +static const uint8_t courR14L1_0x7C_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t courR14L1_0x7D_BMP[] = { + 0xC0, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x18, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xC0 +}; + +static const uint8_t courR14L1_0x7E_BMP[] = { + 0x60, + 0x99, + 0x06 +}; + +static const uint8_t courR14L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t courR14L1_0xA1_BMP[] = { + 0xC0, + 0xC0, + 0x00, + 0x00, + 0x80, + 0x80, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t courR14L1_0xA2_BMP[] = { + 0x10, + 0x10, + 0x10, + 0x3C, + 0x44, + 0x84, + 0x80, + 0x80, + 0x44, + 0x38, + 0x10, + 0x10 +}; + +static const uint8_t courR14L1_0xA3_BMP[] = { + 0x1C, + 0x22, + 0x20, + 0x20, + 0x10, + 0xFC, + 0x10, + 0x20, + 0x21, + 0x41, + 0x7E +}; + +static const uint8_t courR14L1_0xA4_BMP[] = { + 0x84, + 0x78, + 0x84, + 0x84, + 0x84, + 0x78, + 0x84 +}; + +static const uint8_t courR14L1_0xA5_BMP[] = { + 0xE3, 0x80, + 0x41, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x7F, 0x00, + 0x08, 0x00, + 0x7F, 0x00, + 0x08, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courR14L1_0xA6_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x00, + 0x00, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t courR14L1_0xA7_BMP[] = { + 0x3E, + 0x42, + 0x42, + 0x40, + 0x70, + 0x8C, + 0x82, + 0x62, + 0x1C, + 0x06, + 0x82, + 0x82, + 0x84, + 0xFC +}; + +static const uint8_t courR14L1_0xA8_BMP[] = { + 0x90, + 0x90 +}; + +static const uint8_t courR14L1_0xA9_BMP[] = { + 0x1F, 0x00, + 0x60, 0xC0, + 0x4F, 0x40, + 0x91, 0x20, + 0xA0, 0x20, + 0xA0, 0x20, + 0xA0, 0x20, + 0x91, 0x20, + 0x4E, 0x40, + 0x60, 0xC0, + 0x1F, 0x00 +}; + +static const uint8_t courR14L1_0xAA_BMP[] = { + 0x70, + 0x08, + 0x78, + 0x88, + 0x98, + 0xEC, + 0x00, + 0xFC +}; + +static const uint8_t courR14L1_0xAB_BMP[] = { + 0x18, 0xC0, + 0x31, 0x80, + 0x63, 0x00, + 0xC6, 0x00, + 0xC6, 0x00, + 0x63, 0x00, + 0x31, 0x80, + 0x18, 0xC0 +}; + +static const uint8_t courR14L1_0xAC_BMP[] = { + 0xFF, 0x80, + 0x00, 0x80, + 0x00, 0x80, + 0x00, 0x80 +}; + +static const uint8_t courR14L1_0xAD_BMP[] = { + 0xFF +}; + +static const uint8_t courR14L1_0xAE_BMP[] = { + 0x1F, 0x00, + 0x60, 0xC0, + 0x5E, 0x40, + 0x91, 0x20, + 0x91, 0x20, + 0x9E, 0x20, + 0x94, 0x20, + 0x92, 0x20, + 0x51, 0x40, + 0x60, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t courR14L1_0xAF_BMP[] = { + 0xF8 +}; + +static const uint8_t courR14L1_0xB0_BMP[] = { + 0x70, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t courR14L1_0xB1_BMP[] = { + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0xFF, 0x80, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0xFF, 0x80 +}; + +static const uint8_t courR14L1_0xB2_BMP[] = { + 0x70, + 0x88, + 0x08, + 0x10, + 0x20, + 0x40, + 0xF8 +}; + +static const uint8_t courR14L1_0xB3_BMP[] = { + 0x70, + 0x88, + 0x08, + 0x30, + 0x08, + 0x88, + 0x70 +}; + +static const uint8_t courR14L1_0xB4_BMP[] = { + 0x20, + 0x40, + 0x80 +}; + +static const uint8_t courR14L1_0xB5_BMP[] = { + 0xC3, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x43, 0x00, + 0x7D, 0x80, + 0x40, 0x00, + 0x40, 0x00, + 0x40, 0x00, + 0x40, 0x00 +}; + +static const uint8_t courR14L1_0xB6_BMP[] = { + 0x3F, + 0x4A, + 0x8A, + 0x8A, + 0x8A, + 0x4A, + 0x3A, + 0x0A, + 0x0A, + 0x0A, + 0x0A, + 0x0A, + 0x0A, + 0x3B +}; + +static const uint8_t courR14L1_0xB7_BMP[] = { + 0xC0, + 0xC0 +}; + +static const uint8_t courR14L1_0xB8_BMP[] = { + 0x40, + 0x20, + 0xC0 +}; + +static const uint8_t courR14L1_0xB9_BMP[] = { + 0x20, + 0xE0, + 0x20, + 0x20, + 0x20, + 0x20, + 0xF8 +}; + +static const uint8_t courR14L1_0xBA_BMP[] = { + 0x78, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78, + 0x00, + 0xFC +}; + +static const uint8_t courR14L1_0xBB_BMP[] = { + 0xC6, 0x00, + 0x63, 0x00, + 0x31, 0x80, + 0x18, 0xC0, + 0x18, 0xC0, + 0x31, 0x80, + 0x63, 0x00, + 0xC6, 0x00 +}; + +static const uint8_t courR14L1_0xBC_BMP[] = { + 0x20, 0x00, + 0xE0, 0x40, + 0x20, 0x80, + 0x21, 0x00, + 0x21, 0x00, + 0x22, 0x40, + 0xFC, 0xC0, + 0x09, 0x40, + 0x0A, 0x40, + 0x13, 0xE0, + 0x20, 0x40, + 0x00, 0xE0 +}; + +static const uint8_t courR14L1_0xBD_BMP[] = { + 0x20, 0x00, + 0xE0, 0x40, + 0x20, 0x80, + 0x21, 0x00, + 0x21, 0x00, + 0x22, 0xC0, + 0xFD, 0x20, + 0x08, 0x20, + 0x08, 0x40, + 0x10, 0x80, + 0x21, 0x00, + 0x03, 0xE0 +}; + +static const uint8_t courR14L1_0xBE_BMP[] = { + 0x70, 0x00, + 0x88, 0x40, + 0x08, 0x80, + 0x31, 0x00, + 0x09, 0x00, + 0x8A, 0x40, + 0x74, 0xC0, + 0x09, 0x40, + 0x0A, 0x40, + 0x13, 0xE0, + 0x20, 0x40, + 0x00, 0xE0 +}; + +static const uint8_t courR14L1_0xBF_BMP[] = { + 0x18, + 0x18, + 0x00, + 0x10, + 0x10, + 0x70, + 0x80, + 0x80, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t courR14L1_0xC0_BMP[] = { + 0x10, 0x00, + 0x08, 0x00, + 0x04, 0x00, + 0x00, 0x00, + 0x3C, 0x00, + 0x04, 0x00, + 0x0A, 0x00, + 0x0A, 0x00, + 0x11, 0x00, + 0x11, 0x00, + 0x20, 0x80, + 0x3F, 0x80, + 0x40, 0x40, + 0x40, 0x40, + 0xF1, 0xE0 +}; + +static const uint8_t courR14L1_0xC1_BMP[] = { + 0x01, 0x00, + 0x02, 0x00, + 0x04, 0x00, + 0x00, 0x00, + 0x3C, 0x00, + 0x04, 0x00, + 0x0A, 0x00, + 0x0A, 0x00, + 0x11, 0x00, + 0x11, 0x00, + 0x20, 0x80, + 0x3F, 0x80, + 0x40, 0x40, + 0x40, 0x40, + 0xF1, 0xE0 +}; + +static const uint8_t courR14L1_0xC2_BMP[] = { + 0x0C, 0x00, + 0x12, 0x00, + 0x21, 0x00, + 0x00, 0x00, + 0x3C, 0x00, + 0x04, 0x00, + 0x0A, 0x00, + 0x0A, 0x00, + 0x11, 0x00, + 0x11, 0x00, + 0x20, 0x80, + 0x3F, 0x80, + 0x40, 0x40, + 0x40, 0x40, + 0xF1, 0xE0 +}; + +static const uint8_t courR14L1_0xC3_BMP[] = { + 0x19, 0x00, + 0x26, 0x00, + 0x00, 0x00, + 0x3C, 0x00, + 0x04, 0x00, + 0x0A, 0x00, + 0x0A, 0x00, + 0x11, 0x00, + 0x11, 0x00, + 0x20, 0x80, + 0x3F, 0x80, + 0x40, 0x40, + 0x40, 0x40, + 0xF1, 0xE0 +}; + +static const uint8_t courR14L1_0xC4_BMP[] = { + 0x12, 0x00, + 0x12, 0x00, + 0x00, 0x00, + 0x3C, 0x00, + 0x04, 0x00, + 0x0A, 0x00, + 0x0A, 0x00, + 0x11, 0x00, + 0x11, 0x00, + 0x20, 0x80, + 0x3F, 0x80, + 0x40, 0x40, + 0x40, 0x40, + 0xF1, 0xE0 +}; + +static const uint8_t courR14L1_0xC5_BMP[] = { + 0x0C, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x0C, 0x00, + 0x3C, 0x00, + 0x04, 0x00, + 0x0A, 0x00, + 0x0A, 0x00, + 0x11, 0x00, + 0x11, 0x00, + 0x20, 0x80, + 0x3F, 0x80, + 0x40, 0x40, + 0x40, 0x40, + 0xF1, 0xE0 +}; + +static const uint8_t courR14L1_0xC6_BMP[] = { + 0x1F, 0xE0, + 0x06, 0x20, + 0x0A, 0x20, + 0x0A, 0x00, + 0x12, 0x40, + 0x13, 0xC0, + 0x3E, 0x40, + 0x22, 0x00, + 0x42, 0x20, + 0x42, 0x20, + 0xE7, 0xE0 +}; + +static const uint8_t courR14L1_0xC7_BMP[] = { + 0x1E, 0x80, + 0x61, 0x80, + 0x40, 0x80, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x40, 0x80, + 0x61, 0x00, + 0x1E, 0x00, + 0x08, 0x00, + 0x04, 0x00, + 0x18, 0x00 +}; + +static const uint8_t courR14L1_0xC8_BMP[] = { + 0x20, + 0x10, + 0x08, + 0x00, + 0xFF, + 0x41, + 0x41, + 0x41, + 0x48, + 0x78, + 0x48, + 0x41, + 0x41, + 0x41, + 0xFF +}; + +static const uint8_t courR14L1_0xC9_BMP[] = { + 0x04, + 0x08, + 0x10, + 0x00, + 0xFF, + 0x41, + 0x41, + 0x41, + 0x48, + 0x78, + 0x48, + 0x41, + 0x41, + 0x41, + 0xFF +}; + +static const uint8_t courR14L1_0xCA_BMP[] = { + 0x18, + 0x24, + 0x42, + 0x00, + 0xFF, + 0x41, + 0x41, + 0x41, + 0x48, + 0x78, + 0x48, + 0x41, + 0x41, + 0x41, + 0xFF +}; + +static const uint8_t courR14L1_0xCB_BMP[] = { + 0x24, + 0x24, + 0x00, + 0xFF, + 0x41, + 0x41, + 0x41, + 0x48, + 0x78, + 0x48, + 0x41, + 0x41, + 0x41, + 0xFF +}; + +static const uint8_t courR14L1_0xCC_BMP[] = { + 0x20, + 0x10, + 0x08, + 0x00, + 0xFE, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR14L1_0xCD_BMP[] = { + 0x08, + 0x10, + 0x20, + 0x00, + 0xFE, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR14L1_0xCE_BMP[] = { + 0x18, + 0x24, + 0x42, + 0x00, + 0xFE, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR14L1_0xCF_BMP[] = { + 0x24, + 0x24, + 0x00, + 0xFE, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR14L1_0xD0_BMP[] = { + 0xFC, + 0x42, + 0x41, + 0x41, + 0x41, + 0xF1, + 0x41, + 0x41, + 0x41, + 0x42, + 0xFC +}; + +static const uint8_t courR14L1_0xD1_BMP[] = { + 0x19, 0x00, + 0x26, 0x00, + 0x00, 0x00, + 0xE7, 0x80, + 0x61, 0x00, + 0x51, 0x00, + 0x51, 0x00, + 0x49, 0x00, + 0x49, 0x00, + 0x45, 0x00, + 0x45, 0x00, + 0x43, 0x00, + 0x43, 0x00, + 0xF1, 0x00 +}; + +static const uint8_t courR14L1_0xD2_BMP[] = { + 0x10, 0x00, + 0x08, 0x00, + 0x04, 0x00, + 0x00, 0x00, + 0x1C, 0x00, + 0x63, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x41, 0x00, + 0x63, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t courR14L1_0xD3_BMP[] = { + 0x04, 0x00, + 0x08, 0x00, + 0x10, 0x00, + 0x00, 0x00, + 0x1C, 0x00, + 0x63, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x41, 0x00, + 0x63, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t courR14L1_0xD4_BMP[] = { + 0x0C, 0x00, + 0x12, 0x00, + 0x21, 0x00, + 0x00, 0x00, + 0x1C, 0x00, + 0x63, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x41, 0x00, + 0x63, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t courR14L1_0xD5_BMP[] = { + 0x19, 0x00, + 0x26, 0x00, + 0x00, 0x00, + 0x1C, 0x00, + 0x63, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x41, 0x00, + 0x63, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t courR14L1_0xD6_BMP[] = { + 0x12, 0x00, + 0x12, 0x00, + 0x00, 0x00, + 0x1C, 0x00, + 0x63, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x41, 0x00, + 0x63, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t courR14L1_0xD7_BMP[] = { + 0x80, 0x80, + 0x41, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x08, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x41, 0x00, + 0x80, 0x80 +}; + +static const uint8_t courR14L1_0xD8_BMP[] = { + 0x0E, 0x20, + 0x31, 0xC0, + 0x20, 0x80, + 0x41, 0x40, + 0x42, 0x40, + 0x44, 0x40, + 0x48, 0x40, + 0x50, 0x40, + 0x20, 0x80, + 0x71, 0x80, + 0x8E, 0x00 +}; + +static const uint8_t courR14L1_0xD9_BMP[] = { + 0x10, 0x00, + 0x08, 0x00, + 0x04, 0x00, + 0x00, 0x00, + 0xF3, 0xC0, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x21, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t courR14L1_0xDA_BMP[] = { + 0x02, 0x00, + 0x04, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0xF3, 0xC0, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x21, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t courR14L1_0xDB_BMP[] = { + 0x0C, 0x00, + 0x12, 0x00, + 0x21, 0x00, + 0x00, 0x00, + 0xF3, 0xC0, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x21, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t courR14L1_0xDC_BMP[] = { + 0x12, 0x00, + 0x12, 0x00, + 0x00, 0x00, + 0xF3, 0xC0, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x21, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t courR14L1_0xDD_BMP[] = { + 0x02, 0x00, + 0x04, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0xE3, 0x80, + 0x41, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courR14L1_0xDE_BMP[] = { + 0xE0, 0x00, + 0x40, 0x00, + 0x7E, 0x00, + 0x41, 0x00, + 0x40, 0x80, + 0x40, 0x80, + 0x41, 0x00, + 0x7E, 0x00, + 0x40, 0x00, + 0x40, 0x00, + 0xE0, 0x00 +}; + +static const uint8_t courR14L1_0xDF_BMP[] = { + 0x3C, + 0x42, + 0x42, + 0x44, + 0x58, + 0x46, + 0x41, + 0x41, + 0x41, + 0x49, + 0xE6 +}; + +static const uint8_t courR14L1_0xE0_BMP[] = { + 0x20, 0x00, + 0x10, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0x3C, 0x00, + 0x42, 0x00, + 0x02, 0x00, + 0x7E, 0x00, + 0x82, 0x00, + 0x82, 0x00, + 0x86, 0x00, + 0x7B, 0x80 +}; + +static const uint8_t courR14L1_0xE1_BMP[] = { + 0x04, 0x00, + 0x08, 0x00, + 0x10, 0x00, + 0x00, 0x00, + 0x3C, 0x00, + 0x42, 0x00, + 0x02, 0x00, + 0x7E, 0x00, + 0x82, 0x00, + 0x82, 0x00, + 0x86, 0x00, + 0x7B, 0x80 +}; + +static const uint8_t courR14L1_0xE2_BMP[] = { + 0x18, 0x00, + 0x24, 0x00, + 0x42, 0x00, + 0x00, 0x00, + 0x3C, 0x00, + 0x42, 0x00, + 0x02, 0x00, + 0x7E, 0x00, + 0x82, 0x00, + 0x82, 0x00, + 0x86, 0x00, + 0x7B, 0x80 +}; + +static const uint8_t courR14L1_0xE3_BMP[] = { + 0x32, 0x00, + 0x4C, 0x00, + 0x00, 0x00, + 0x3C, 0x00, + 0x42, 0x00, + 0x02, 0x00, + 0x7E, 0x00, + 0x82, 0x00, + 0x82, 0x00, + 0x86, 0x00, + 0x7B, 0x80 +}; + +static const uint8_t courR14L1_0xE4_BMP[] = { + 0x24, 0x00, + 0x24, 0x00, + 0x00, 0x00, + 0x3C, 0x00, + 0x42, 0x00, + 0x02, 0x00, + 0x7E, 0x00, + 0x82, 0x00, + 0x82, 0x00, + 0x86, 0x00, + 0x7B, 0x80 +}; + +static const uint8_t courR14L1_0xE5_BMP[] = { + 0x18, 0x00, + 0x24, 0x00, + 0x24, 0x00, + 0x18, 0x00, + 0x00, 0x00, + 0x3C, 0x00, + 0x42, 0x00, + 0x02, 0x00, + 0x7E, 0x00, + 0x82, 0x00, + 0x82, 0x00, + 0x86, 0x00, + 0x7B, 0x80 +}; + +static const uint8_t courR14L1_0xE6_BMP[] = { + 0x71, 0x80, + 0x8A, 0x40, + 0x04, 0x20, + 0x7F, 0xE0, + 0x84, 0x00, + 0x84, 0x00, + 0x8A, 0x20, + 0x71, 0xC0 +}; + +static const uint8_t courR14L1_0xE7_BMP[] = { + 0x3D, + 0x43, + 0x81, + 0x80, + 0x80, + 0x80, + 0x43, + 0x3C, + 0x10, + 0x08, + 0x30 +}; + +static const uint8_t courR14L1_0xE8_BMP[] = { + 0x20, + 0x10, + 0x08, + 0x00, + 0x3C, + 0x42, + 0x81, + 0xFF, + 0x80, + 0x80, + 0x43, + 0x3C +}; + +static const uint8_t courR14L1_0xE9_BMP[] = { + 0x02, + 0x04, + 0x08, + 0x00, + 0x3C, + 0x42, + 0x81, + 0xFF, + 0x80, + 0x80, + 0x43, + 0x3C +}; + +static const uint8_t courR14L1_0xEA_BMP[] = { + 0x18, + 0x24, + 0x42, + 0x00, + 0x3C, + 0x42, + 0x81, + 0xFF, + 0x80, + 0x80, + 0x43, + 0x3C +}; + +static const uint8_t courR14L1_0xEB_BMP[] = { + 0x24, + 0x24, + 0x00, + 0x3C, + 0x42, + 0x81, + 0xFF, + 0x80, + 0x80, + 0x43, + 0x3C +}; + +static const uint8_t courR14L1_0xEC_BMP[] = { + 0x20, + 0x10, + 0x08, + 0x00, + 0x70, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR14L1_0xED_BMP[] = { + 0x08, + 0x10, + 0x20, + 0x00, + 0x70, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR14L1_0xEE_BMP[] = { + 0x30, + 0x48, + 0x84, + 0x00, + 0x70, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR14L1_0xEF_BMP[] = { + 0x48, + 0x48, + 0x00, + 0x70, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR14L1_0xF0_BMP[] = { + 0x72, + 0x8C, + 0x34, + 0x42, + 0x3E, + 0x43, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t courR14L1_0xF1_BMP[] = { + 0x32, 0x00, + 0x4C, 0x00, + 0x00, 0x00, + 0xDE, 0x00, + 0x61, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0xE3, 0x80 +}; + +static const uint8_t courR14L1_0xF2_BMP[] = { + 0x20, + 0x10, + 0x08, + 0x00, + 0x3C, + 0x42, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t courR14L1_0xF3_BMP[] = { + 0x04, + 0x08, + 0x10, + 0x00, + 0x3C, + 0x42, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t courR14L1_0xF4_BMP[] = { + 0x18, + 0x24, + 0x42, + 0x00, + 0x3C, + 0x42, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t courR14L1_0xF5_BMP[] = { + 0x32, + 0x4C, + 0x00, + 0x3C, + 0x42, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t courR14L1_0xF6_BMP[] = { + 0x24, + 0x24, + 0x00, + 0x3C, + 0x42, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t courR14L1_0xF7_BMP[] = { + 0x18, + 0x18, + 0x00, + 0x00, + 0xFF, + 0x00, + 0x00, + 0x18, + 0x18 +}; + +static const uint8_t courR14L1_0xF8_BMP[] = { + 0x3D, + 0x42, + 0x85, + 0x89, + 0x91, + 0xA1, + 0x42, + 0xBC +}; + +static const uint8_t courR14L1_0xF9_BMP[] = { + 0x20, 0x00, + 0x10, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0xC3, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x43, 0x00, + 0x3D, 0x80 +}; + +static const uint8_t courR14L1_0xFA_BMP[] = { + 0x02, 0x00, + 0x04, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0xC3, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x43, 0x00, + 0x3D, 0x80 +}; + +static const uint8_t courR14L1_0xFB_BMP[] = { + 0x18, 0x00, + 0x24, 0x00, + 0x42, 0x00, + 0x00, 0x00, + 0xC3, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x43, 0x00, + 0x3D, 0x80 +}; + +static const uint8_t courR14L1_0xFC_BMP[] = { + 0x24, 0x00, + 0x24, 0x00, + 0x00, 0x00, + 0xC3, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x43, 0x00, + 0x3D, 0x80 +}; + +static const uint8_t courR14L1_0xFD_BMP[] = { + 0x02, 0x00, + 0x04, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0xE3, 0x80, + 0x41, 0x00, + 0x41, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0xF8, 0x00 +}; + +static const uint8_t courR14L1_0xFE_BMP[] = { + 0xC0, 0x00, + 0x40, 0x00, + 0x40, 0x00, + 0x40, 0x00, + 0x5E, 0x00, + 0x61, 0x00, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x61, 0x00, + 0x5E, 0x00, + 0x40, 0x00, + 0x40, 0x00, + 0x40, 0x00, + 0xF0, 0x00 +}; + +static const uint8_t courR14L1_0xFF_BMP[] = { + 0x24, 0x00, + 0x24, 0x00, + 0x00, 0x00, + 0xE3, 0x80, + 0x41, 0x00, + 0x41, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0xF8, 0x00 +}; + +static const GFONT_CharInfo FontBMP[] = { + {11, 9, 11, 1, 0, courR14L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {11, 1, 1, 0, 0, courR14L1_0x20_BMP}, + {11, 2, 12, 4, 0, courR14L1_0x21_BMP}, + {11, 6, 5, 3, 7, courR14L1_0x22_BMP}, + {11, 8, 15, 1, -2, courR14L1_0x23_BMP}, + {11, 6, 15, 2, -2, courR14L1_0x24_BMP}, + {11, 9, 12, 1, 0, courR14L1_0x25_BMP}, + {11, 7, 10, 2, 0, courR14L1_0x26_BMP}, + {11, 2, 5, 4, 7, courR14L1_0x27_BMP}, + {11, 3, 14, 5, -2, courR14L1_0x28_BMP}, + {11, 3, 14, 3, -2, courR14L1_0x29_BMP}, + {11, 7, 8, 2, 4, courR14L1_0x2A_BMP}, + {11, 9, 9, 1, 1, courR14L1_0x2B_BMP}, + {11, 4, 5, 3, -3, courR14L1_0x2C_BMP}, + {11, 8, 1, 1, 5, courR14L1_0x2D_BMP}, + {11, 2, 2, 4, 0, courR14L1_0x2E_BMP}, + {11, 8, 16, 1, -3, courR14L1_0x2F_BMP}, + {11, 7, 12, 2, 0, courR14L1_0x30_BMP}, + {11, 7, 12, 2, 0, courR14L1_0x31_BMP}, + {11, 8, 12, 1, 0, courR14L1_0x32_BMP}, + {11, 7, 12, 2, 0, courR14L1_0x33_BMP}, + {11, 7, 12, 2, 0, courR14L1_0x34_BMP}, + {11, 8, 12, 1, 0, courR14L1_0x35_BMP}, + {11, 7, 12, 2, 0, courR14L1_0x36_BMP}, + {11, 7, 12, 2, 0, courR14L1_0x37_BMP}, + {11, 7, 12, 2, 0, courR14L1_0x38_BMP}, + {11, 7, 12, 2, 0, courR14L1_0x39_BMP}, + {11, 2, 8, 4, 0, courR14L1_0x3A_BMP}, + {11, 4, 11, 2, -3, courR14L1_0x3B_BMP}, + {11, 10, 9, 0, 1, courR14L1_0x3C_BMP}, + {11, 9, 4, 1, 3, courR14L1_0x3D_BMP}, + {11, 10, 9, 0, 1, courR14L1_0x3E_BMP}, + {11, 7, 11, 2, 0, courR14L1_0x3F_BMP}, + {11, 8, 13, 2, -1, courR14L1_0x40_BMP}, + {11, 11, 11, 0, 0, courR14L1_0x41_BMP}, + {11, 9, 11, 1, 0, courR14L1_0x42_BMP}, + {11, 9, 11, 1, 0, courR14L1_0x43_BMP}, + {11, 9, 11, 1, 0, courR14L1_0x44_BMP}, + {11, 8, 11, 1, 0, courR14L1_0x45_BMP}, + {11, 8, 11, 1, 0, courR14L1_0x46_BMP}, + {11, 10, 11, 1, 0, courR14L1_0x47_BMP}, + {11, 9, 11, 1, 0, courR14L1_0x48_BMP}, + {11, 7, 11, 2, 0, courR14L1_0x49_BMP}, + {11, 9, 11, 1, 0, courR14L1_0x4A_BMP}, + {11, 10, 11, 1, 0, courR14L1_0x4B_BMP}, + {11, 9, 11, 1, 0, courR14L1_0x4C_BMP}, + {11, 11, 11, 0, 0, courR14L1_0x4D_BMP}, + {11, 9, 11, 1, 0, courR14L1_0x4E_BMP}, + {11, 9, 11, 1, 0, courR14L1_0x4F_BMP}, + {11, 9, 11, 1, 0, courR14L1_0x50_BMP}, + {11, 9, 13, 1, -2, courR14L1_0x51_BMP}, + {11, 10, 11, 1, 0, courR14L1_0x52_BMP}, + {11, 8, 11, 1, 0, courR14L1_0x53_BMP}, + {11, 9, 11, 1, 0, courR14L1_0x54_BMP}, + {11, 10, 11, 0, 0, courR14L1_0x55_BMP}, + {11, 11, 11, 0, 0, courR14L1_0x56_BMP}, + {11, 11, 11, 0, 0, courR14L1_0x57_BMP}, + {11, 9, 11, 1, 0, courR14L1_0x58_BMP}, + {11, 9, 11, 1, 0, courR14L1_0x59_BMP}, + {11, 7, 11, 2, 0, courR14L1_0x5A_BMP}, + {11, 3, 15, 5, -3, courR14L1_0x5B_BMP}, + {11, 8, 16, 2, -3, courR14L1_0x5C_BMP}, + {11, 3, 15, 3, -3, courR14L1_0x5D_BMP}, + {11, 7, 4, 2, 8, courR14L1_0x5E_BMP}, + {11, 11, 1, 0, -4, courR14L1_0x5F_BMP}, + {11, 3, 3, 4, 9, courR14L1_0x60_BMP}, + {11, 9, 8, 1, 0, courR14L1_0x61_BMP}, + {11, 9, 12, 1, 0, courR14L1_0x62_BMP}, + {11, 8, 8, 1, 0, courR14L1_0x63_BMP}, + {11, 9, 12, 1, 0, courR14L1_0x64_BMP}, + {11, 8, 8, 1, 0, courR14L1_0x65_BMP}, + {11, 8, 12, 2, 0, courR14L1_0x66_BMP}, + {11, 9, 12, 1, -4, courR14L1_0x67_BMP}, + {11, 9, 12, 1, 0, courR14L1_0x68_BMP}, + {11, 7, 11, 2, 0, courR14L1_0x69_BMP}, + {11, 6, 15, 2, -4, courR14L1_0x6A_BMP}, + {11, 9, 12, 1, 0, courR14L1_0x6B_BMP}, + {11, 7, 12, 2, 0, courR14L1_0x6C_BMP}, + {11, 11, 8, 0, 0, courR14L1_0x6D_BMP}, + {11, 9, 8, 1, 0, courR14L1_0x6E_BMP}, + {11, 8, 8, 1, 0, courR14L1_0x6F_BMP}, + {11, 9, 12, 1, -4, courR14L1_0x70_BMP}, + {11, 9, 12, 1, -4, courR14L1_0x71_BMP}, + {11, 8, 8, 1, 0, courR14L1_0x72_BMP}, + {11, 7, 8, 2, 0, courR14L1_0x73_BMP}, + {11, 8, 11, 2, 0, courR14L1_0x74_BMP}, + {11, 9, 8, 1, 0, courR14L1_0x75_BMP}, + {11, 9, 8, 1, 0, courR14L1_0x76_BMP}, + {11, 9, 8, 1, 0, courR14L1_0x77_BMP}, + {11, 8, 8, 1, 0, courR14L1_0x78_BMP}, + {11, 9, 12, 1, -4, courR14L1_0x79_BMP}, + {11, 7, 8, 2, 0, courR14L1_0x7A_BMP}, + {11, 5, 15, 3, -3, courR14L1_0x7B_BMP}, + {11, 1, 15, 5, -3, courR14L1_0x7C_BMP}, + {11, 5, 15, 3, -3, courR14L1_0x7D_BMP}, + {11, 8, 3, 1, 4, courR14L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {11, 1, 1, 0, 0, courR14L1_0xA0_BMP}, + {11, 2, 12, 4, -4, courR14L1_0xA1_BMP}, + {11, 6, 12, 2, 0, courR14L1_0xA2_BMP}, + {11, 8, 11, 2, 0, courR14L1_0xA3_BMP}, + {11, 6, 7, 2, 2, courR14L1_0xA4_BMP}, + {11, 9, 11, 1, 0, courR14L1_0xA5_BMP}, + {11, 1, 15, 5, -3, courR14L1_0xA6_BMP}, + {11, 7, 14, 2, -2, courR14L1_0xA7_BMP}, + {11, 4, 2, 3, 10, courR14L1_0xA8_BMP}, + {11, 11, 11, 0, 0, courR14L1_0xA9_BMP}, + {11, 6, 8, 2, 3, courR14L1_0xAA_BMP}, + {11, 10, 8, 1, 0, courR14L1_0xAB_BMP}, + {11, 9, 4, 1, 3, courR14L1_0xAC_BMP}, + {11, 8, 1, 1, 5, courR14L1_0xAD_BMP}, + {11, 11, 11, 0, 0, courR14L1_0xAE_BMP}, + {11, 5, 1, 3, 10, courR14L1_0xAF_BMP}, + {11, 5, 5, 3, 6, courR14L1_0xB0_BMP}, + {11, 9, 9, 1, 1, courR14L1_0xB1_BMP}, + {11, 5, 7, 3, 5, courR14L1_0xB2_BMP}, + {11, 5, 7, 3, 5, courR14L1_0xB3_BMP}, + {11, 3, 3, 4, 9, courR14L1_0xB4_BMP}, + {11, 9, 12, 1, -4, courR14L1_0xB5_BMP}, + {11, 8, 14, 1, -2, courR14L1_0xB6_BMP}, + {11, 2, 2, 4, 5, courR14L1_0xB7_BMP}, + {11, 3, 3, 4, -3, courR14L1_0xB8_BMP}, + {11, 5, 7, 3, 5, courR14L1_0xB9_BMP}, + {11, 6, 8, 2, 3, courR14L1_0xBA_BMP}, + {11, 10, 8, 0, 0, courR14L1_0xBB_BMP}, + {11, 11, 12, 0, 0, courR14L1_0xBC_BMP}, + {11, 11, 12, 0, 0, courR14L1_0xBD_BMP}, + {11, 11, 12, 0, 0, courR14L1_0xBE_BMP}, + {11, 6, 11, 2, -3, courR14L1_0xBF_BMP}, + {11, 11, 15, 0, 0, courR14L1_0xC0_BMP}, + {11, 11, 15, 0, 0, courR14L1_0xC1_BMP}, + {11, 11, 15, 0, 0, courR14L1_0xC2_BMP}, + {11, 11, 14, 0, 0, courR14L1_0xC3_BMP}, + {11, 11, 14, 0, 0, courR14L1_0xC4_BMP}, + {11, 11, 15, 0, 0, courR14L1_0xC5_BMP}, + {11, 11, 11, -1, 0, courR14L1_0xC6_BMP}, + {11, 9, 14, 1, -3, courR14L1_0xC7_BMP}, + {11, 8, 15, 1, 0, courR14L1_0xC8_BMP}, + {11, 8, 15, 1, 0, courR14L1_0xC9_BMP}, + {11, 8, 15, 1, 0, courR14L1_0xCA_BMP}, + {11, 8, 14, 1, 0, courR14L1_0xCB_BMP}, + {11, 7, 15, 2, 0, courR14L1_0xCC_BMP}, + {11, 7, 15, 2, 0, courR14L1_0xCD_BMP}, + {11, 7, 15, 2, 0, courR14L1_0xCE_BMP}, + {11, 7, 14, 2, 0, courR14L1_0xCF_BMP}, + {11, 8, 11, 1, 0, courR14L1_0xD0_BMP}, + {11, 9, 14, 1, 0, courR14L1_0xD1_BMP}, + {11, 9, 15, 1, 0, courR14L1_0xD2_BMP}, + {11, 9, 15, 1, 0, courR14L1_0xD3_BMP}, + {11, 9, 15, 1, 0, courR14L1_0xD4_BMP}, + {11, 9, 14, 1, 0, courR14L1_0xD5_BMP}, + {11, 9, 14, 1, 0, courR14L1_0xD6_BMP}, + {11, 9, 9, 1, 1, courR14L1_0xD7_BMP}, + {11, 11, 11, 0, 0, courR14L1_0xD8_BMP}, + {11, 10, 15, 0, 0, courR14L1_0xD9_BMP}, + {11, 10, 15, 0, 0, courR14L1_0xDA_BMP}, + {11, 10, 15, 0, 0, courR14L1_0xDB_BMP}, + {11, 10, 14, 0, 0, courR14L1_0xDC_BMP}, + {11, 9, 15, 1, 0, courR14L1_0xDD_BMP}, + {11, 9, 11, 1, 0, courR14L1_0xDE_BMP}, + {11, 8, 11, 1, 0, courR14L1_0xDF_BMP}, + {11, 9, 12, 1, 0, courR14L1_0xE0_BMP}, + {11, 9, 12, 1, 0, courR14L1_0xE1_BMP}, + {11, 9, 12, 1, 0, courR14L1_0xE2_BMP}, + {11, 9, 11, 1, 0, courR14L1_0xE3_BMP}, + {11, 9, 11, 1, 0, courR14L1_0xE4_BMP}, + {11, 9, 13, 1, 0, courR14L1_0xE5_BMP}, + {11, 11, 8, 0, 0, courR14L1_0xE6_BMP}, + {11, 8, 11, 1, -3, courR14L1_0xE7_BMP}, + {11, 8, 12, 1, 0, courR14L1_0xE8_BMP}, + {11, 8, 12, 1, 0, courR14L1_0xE9_BMP}, + {11, 8, 12, 1, 0, courR14L1_0xEA_BMP}, + {11, 8, 11, 1, 0, courR14L1_0xEB_BMP}, + {11, 7, 12, 2, 0, courR14L1_0xEC_BMP}, + {11, 7, 12, 2, 0, courR14L1_0xED_BMP}, + {11, 7, 12, 2, 0, courR14L1_0xEE_BMP}, + {11, 7, 11, 2, 0, courR14L1_0xEF_BMP}, + {11, 8, 12, 1, 0, courR14L1_0xF0_BMP}, + {11, 9, 11, 1, 0, courR14L1_0xF1_BMP}, + {11, 8, 12, 1, 0, courR14L1_0xF2_BMP}, + {11, 8, 12, 1, 0, courR14L1_0xF3_BMP}, + {11, 8, 12, 1, 0, courR14L1_0xF4_BMP}, + {11, 8, 11, 1, 0, courR14L1_0xF5_BMP}, + {11, 8, 11, 1, 0, courR14L1_0xF6_BMP}, + {11, 8, 9, 1, 1, courR14L1_0xF7_BMP}, + {11, 8, 8, 1, 0, courR14L1_0xF8_BMP}, + {11, 9, 12, 1, 0, courR14L1_0xF9_BMP}, + {11, 9, 12, 1, 0, courR14L1_0xFA_BMP}, + {11, 9, 12, 1, 0, courR14L1_0xFB_BMP}, + {11, 9, 11, 1, 0, courR14L1_0xFC_BMP}, + {11, 9, 16, 1, -4, courR14L1_0xFD_BMP}, + {11, 9, 16, 1, -4, courR14L1_0xFE_BMP}, + {11, 9, 15, 1, -4, courR14L1_0xFF_BMP} +}; + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontCour14Normal_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontCour14Normal_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontCour14Normal_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontCour14Normal_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontCour14Normal_GetFontChar, + McuFontCour14Normal_FBBy, + McuFontCour14Normal_GetUnderlineBoxHeight(), + McuFontCour14Normal_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour14Normal_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour14Normal_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour14Normal_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour14Normal_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontCour14Normal. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour14Normal.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour14Normal.h new file mode 100644 index 0000000..56614a1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour14Normal.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour14Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour14Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 14 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour14Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour14Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour14Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour14Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour14Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontCour14Normal_Deinit(void); +** Init - void McuFontCour14Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour14Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour14Normal_module McuFontCour14Normal module documentation +** @{ +*/ + + +#ifndef __McuFontCour14Normal_H +#define __McuFontCour14Normal_H + +/* MODULE McuFontCour14Normal. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontCour14Normalconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontCour14Normal_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontCour14Normal_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontCour14Normal_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontCour14Normal_GetLineSpaceHeight() \ + 1 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontCour14Normal_GetUnderlineBoxHeight() \ + 7 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontCour14Normal_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontCour14Normal_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontCour14Normal. */ + +#endif +/* ifndef __McuFontCour14Normal_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour18Bold.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour18Bold.c new file mode 100644 index 0000000..a68dfce --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour18Bold.c @@ -0,0 +1,3931 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour18Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour18Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 18 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour18Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour18Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour18Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour18Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour18Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontCour18Bold_Deinit(void); +** Init - void McuFontCour18Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour18Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour18Bold_module McuFontCour18Bold module documentation +** @{ +*/ + +/* MODULE McuFontCour18Bold. */ + +#include "McuFontCour18Bold.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontCour18Bold_FBBy 25 + +static const uint8_t courB18L1_0x00_BMP[] = { + 0xAA, 0xA8, + 0x00, 0x00, + 0x80, 0x08, + 0x00, 0x00, + 0x80, 0x08, + 0x00, 0x00, + 0x80, 0x08, + 0x00, 0x00, + 0x80, 0x08, + 0x00, 0x00, + 0x80, 0x08, + 0x00, 0x00, + 0x80, 0x08, + 0x00, 0x00, + 0xAA, 0xA8 +}; + +static const uint8_t courB18L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t courB18L1_0x21_BMP[] = { + 0x60, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x00, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t courB18L1_0x22_BMP[] = { + 0xEE, + 0xEE, + 0xEE, + 0xEE, + 0x44, + 0x44, + 0x44 +}; + +static const uint8_t courB18L1_0x23_BMP[] = { + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x7F, 0xF0, + 0x7F, 0xF0, + 0x19, 0x80, + 0x19, 0x80, + 0x19, 0x80, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0x33, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x33, 0x00 +}; + +static const uint8_t courB18L1_0x24_BMP[] = { + 0x0C, 0x00, + 0x0C, 0x00, + 0x3D, 0x80, + 0x7F, 0x80, + 0xC3, 0x80, + 0xC1, 0x80, + 0xC0, 0x00, + 0xE0, 0x00, + 0x7E, 0x00, + 0x1F, 0x80, + 0x01, 0xC0, + 0x00, 0xC0, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0xFF, 0x80, + 0xDF, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00 +}; + +static const uint8_t courB18L1_0x25_BMP[] = { + 0x3C, 0x00, + 0x66, 0x00, + 0xC3, 0x00, + 0xC3, 0x00, + 0x66, 0x00, + 0x3C, 0x00, + 0x01, 0xC0, + 0x0F, 0x00, + 0x38, 0x00, + 0xE7, 0x80, + 0x0C, 0xC0, + 0x18, 0x60, + 0x18, 0x60, + 0x0C, 0xC0, + 0x07, 0x80 +}; + +static const uint8_t courB18L1_0x26_BMP[] = { + 0x1E, 0x00, + 0x3F, 0x00, + 0x63, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0x30, 0x00, + 0x38, 0x00, + 0x7C, 0xC0, + 0x6F, 0xC0, + 0xC7, 0x80, + 0xC3, 0x00, + 0xC7, 0x80, + 0xFF, 0xE0, + 0x7C, 0xE0 +}; + +static const uint8_t courB18L1_0x27_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0x40, + 0x40 +}; + +static const uint8_t courB18L1_0x28_BMP[] = { + 0x18, + 0x38, + 0x30, + 0x60, + 0x60, + 0x60, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x60, + 0x60, + 0x60, + 0x30, + 0x38, + 0x18 +}; + +static const uint8_t courB18L1_0x29_BMP[] = { + 0xC0, + 0xE0, + 0x60, + 0x30, + 0x30, + 0x30, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x30, + 0x30, + 0x30, + 0x60, + 0xE0, + 0xC0 +}; + +static const uint8_t courB18L1_0x2A_BMP[] = { + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0xCC, 0xC0, + 0xFF, 0xC0, + 0x3F, 0x00, + 0x0C, 0x00, + 0x3F, 0x00, + 0x33, 0x00, + 0x73, 0x80, + 0x61, 0x80 +}; + +static const uint8_t courB18L1_0x2B_BMP[] = { + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00 +}; + +static const uint8_t courB18L1_0x2C_BMP[] = { + 0x38, + 0x38, + 0x70, + 0x60, + 0xC0, + 0x80 +}; + +static const uint8_t courB18L1_0x2D_BMP[] = { + 0xFF, 0xE0, + 0xFF, 0xE0 +}; + +static const uint8_t courB18L1_0x2E_BMP[] = { + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t courB18L1_0x2F_BMP[] = { + 0x00, 0x60, + 0x00, 0x60, + 0x00, 0xC0, + 0x00, 0xC0, + 0x01, 0x80, + 0x01, 0x80, + 0x03, 0x00, + 0x03, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0xC0, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t courB18L1_0x30_BMP[] = { + 0x1E, 0x00, + 0x7F, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0x61, 0x80, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t courB18L1_0x31_BMP[] = { + 0x1C, 0x00, + 0xFC, 0x00, + 0xFC, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB18L1_0x32_BMP[] = { + 0x1F, 0x80, + 0x3F, 0xC0, + 0x70, 0xE0, + 0x60, 0x60, + 0x60, 0x60, + 0x00, 0x60, + 0x00, 0xE0, + 0x01, 0xC0, + 0x03, 0x80, + 0x07, 0x00, + 0x0E, 0x00, + 0x1C, 0x00, + 0x38, 0x00, + 0x70, 0x00, + 0xFF, 0xE0, + 0xFF, 0xE0 +}; + +static const uint8_t courB18L1_0x33_BMP[] = { + 0x1F, 0x80, + 0x3F, 0xC0, + 0x70, 0xE0, + 0x60, 0x60, + 0x00, 0x60, + 0x00, 0xE0, + 0x01, 0xC0, + 0x0F, 0x80, + 0x0F, 0xC0, + 0x00, 0xE0, + 0x00, 0x60, + 0x00, 0x60, + 0xC0, 0x60, + 0xE0, 0xE0, + 0x7F, 0xC0, + 0x3F, 0x80 +}; + +static const uint8_t courB18L1_0x34_BMP[] = { + 0x03, 0x80, + 0x07, 0x80, + 0x0F, 0x80, + 0x0D, 0x80, + 0x19, 0x80, + 0x19, 0x80, + 0x31, 0x80, + 0x31, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0x01, 0x80, + 0x01, 0x80, + 0x0F, 0xE0, + 0x0F, 0xE0 +}; + +static const uint8_t courB18L1_0x35_BMP[] = { + 0x7F, 0xC0, + 0x7F, 0xC0, + 0x60, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0x6F, 0x00, + 0x7F, 0xC0, + 0x71, 0xC0, + 0x00, 0xE0, + 0x00, 0x60, + 0x00, 0x60, + 0x00, 0x60, + 0xC0, 0xE0, + 0xE1, 0xC0, + 0x7F, 0xC0, + 0x3F, 0x00 +}; + +static const uint8_t courB18L1_0x36_BMP[] = { + 0x07, 0xC0, + 0x1F, 0xC0, + 0x3C, 0x00, + 0x70, 0x00, + 0x60, 0x00, + 0xE0, 0x00, + 0xDF, 0x00, + 0xFF, 0x80, + 0xE1, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xE0, 0xC0, + 0x71, 0xC0, + 0x7F, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t courB18L1_0x37_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xC0, 0xC0, + 0x00, 0xC0, + 0x01, 0x80, + 0x01, 0x80, + 0x01, 0x80, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00 +}; + +static const uint8_t courB18L1_0x38_BMP[] = { + 0x1E, 0x00, + 0x7F, 0x80, + 0xE1, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0x61, 0x80, + 0x3F, 0x00, + 0x7F, 0x80, + 0xE1, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x7F, 0x80, + 0x3F, 0x00 +}; + +static const uint8_t courB18L1_0x39_BMP[] = { + 0x1E, 0x00, + 0x7F, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0xE3, 0xC0, + 0x7E, 0xC0, + 0x3C, 0xC0, + 0x00, 0xC0, + 0x01, 0x80, + 0x03, 0x80, + 0xFF, 0x00, + 0xFC, 0x00 +}; + +static const uint8_t courB18L1_0x3A_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t courB18L1_0x3B_BMP[] = { + 0x38, + 0x38, + 0x38, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x38, + 0x38, + 0x70, + 0x60, + 0xC0, + 0x80 +}; + +static const uint8_t courB18L1_0x3C_BMP[] = { + 0x00, 0x38, + 0x00, 0xF0, + 0x03, 0xC0, + 0x0F, 0x00, + 0x3C, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0x3C, 0x00, + 0x0F, 0x00, + 0x03, 0xC0, + 0x00, 0xF0, + 0x00, 0x38 +}; + +static const uint8_t courB18L1_0x3D_BMP[] = { + 0xFF, 0xF0, + 0xFF, 0xF0, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0 +}; + +static const uint8_t courB18L1_0x3E_BMP[] = { + 0xE0, 0x00, + 0x78, 0x00, + 0x1E, 0x00, + 0x07, 0x80, + 0x01, 0xE0, + 0x00, 0x78, + 0x00, 0x78, + 0x01, 0xE0, + 0x07, 0x80, + 0x1E, 0x00, + 0x78, 0x00, + 0xE0, 0x00 +}; + +static const uint8_t courB18L1_0x3F_BMP[] = { + 0x7E, 0x00, + 0xFF, 0x00, + 0xC3, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x01, 0x80, + 0x03, 0x80, + 0x0F, 0x00, + 0x1C, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x00, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x18, 0x00 +}; + +static const uint8_t courB18L1_0x40_BMP[] = { + 0x1C, 0x00, + 0x7F, 0x00, + 0x63, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC7, 0x80, + 0xCF, 0x80, + 0xDD, 0x80, + 0xD9, 0x80, + 0xD9, 0x80, + 0xDD, 0x80, + 0xCF, 0xC0, + 0xC7, 0xC0, + 0xC0, 0x00, + 0xC0, 0x00, + 0x61, 0x80, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t courB18L1_0x41_BMP[] = { + 0x3F, 0x00, + 0x3F, 0x00, + 0x07, 0x80, + 0x07, 0x80, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x1C, 0xE0, + 0x18, 0x60, + 0x18, 0x60, + 0x3F, 0xF0, + 0x3F, 0xF0, + 0x70, 0x38, + 0x60, 0x18, + 0xFC, 0xFC, + 0xFC, 0xFC +}; + +static const uint8_t courB18L1_0x42_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xE0, + 0x30, 0x70, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x70, + 0x3F, 0xE0, + 0x3F, 0xF0, + 0x30, 0x38, + 0x30, 0x18, + 0x30, 0x18, + 0x30, 0x18, + 0x30, 0x38, + 0xFF, 0xF0, + 0xFF, 0xE0 +}; + +static const uint8_t courB18L1_0x43_BMP[] = { + 0x0F, 0xB0, + 0x3F, 0xF0, + 0x70, 0x70, + 0x60, 0x30, + 0xE0, 0x30, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xE0, 0x00, + 0x60, 0x00, + 0x70, 0x30, + 0x3F, 0xF0, + 0x0F, 0xC0 +}; + +static const uint8_t courB18L1_0x44_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xF0, + 0x30, 0x38, + 0x30, 0x18, + 0x30, 0x1C, + 0x30, 0x0C, + 0x30, 0x0C, + 0x30, 0x0C, + 0x30, 0x0C, + 0x30, 0x0C, + 0x30, 0x0C, + 0x30, 0x18, + 0x30, 0x38, + 0xFF, 0xF0, + 0xFF, 0xE0 +}; + +static const uint8_t courB18L1_0x45_BMP[] = { + 0xFF, 0xF0, + 0xFF, 0xF0, + 0x30, 0x30, + 0x30, 0x30, + 0x31, 0xB0, + 0x31, 0x80, + 0x3F, 0x80, + 0x3F, 0x80, + 0x31, 0x80, + 0x31, 0x80, + 0x30, 0x18, + 0x30, 0x18, + 0x30, 0x18, + 0xFF, 0xF8, + 0xFF, 0xF8 +}; + +static const uint8_t courB18L1_0x46_BMP[] = { + 0xFF, 0xF8, + 0xFF, 0xF8, + 0x30, 0x18, + 0x30, 0x18, + 0x31, 0x98, + 0x31, 0x80, + 0x3F, 0x80, + 0x3F, 0x80, + 0x31, 0x80, + 0x31, 0x80, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0xFF, 0x00, + 0xFF, 0x00 +}; + +static const uint8_t courB18L1_0x47_BMP[] = { + 0x0F, 0xD8, + 0x3F, 0xF8, + 0x70, 0x38, + 0x60, 0x18, + 0xE0, 0x18, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC1, 0xF8, + 0xC1, 0xF8, + 0xE0, 0x18, + 0x60, 0x18, + 0x70, 0x38, + 0x3F, 0xF0, + 0x0F, 0xC0 +}; + +static const uint8_t courB18L1_0x48_BMP[] = { + 0xFC, 0xFC, + 0xFC, 0xFC, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x3F, 0xF0, + 0x3F, 0xF0, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0xFC, 0xFC, + 0xFC, 0xFC +}; + +static const uint8_t courB18L1_0x49_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB18L1_0x4A_BMP[] = { + 0x1F, 0xF8, + 0x1F, 0xF8, + 0x00, 0xC0, + 0x00, 0xC0, + 0x00, 0xC0, + 0x00, 0xC0, + 0x00, 0xC0, + 0x00, 0xC0, + 0x00, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x7F, 0x80, + 0x3F, 0x00 +}; + +static const uint8_t courB18L1_0x4B_BMP[] = { + 0xFC, 0xF8, + 0xFC, 0xF8, + 0x30, 0xE0, + 0x31, 0xC0, + 0x33, 0x80, + 0x37, 0x00, + 0x3E, 0x00, + 0x3F, 0x00, + 0x3B, 0x80, + 0x31, 0xC0, + 0x30, 0xE0, + 0x30, 0x60, + 0x30, 0x70, + 0xFC, 0x3C, + 0xFC, 0x3C +}; + +static const uint8_t courB18L1_0x4C_BMP[] = { + 0xFF, 0x00, + 0xFF, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x18, 0x30, + 0x18, 0x30, + 0x18, 0x30, + 0xFF, 0xF0, + 0xFF, 0xF0 +}; + +static const uint8_t courB18L1_0x4D_BMP[] = { + 0xF0, 0x3C, + 0xF0, 0x3C, + 0x78, 0x78, + 0x78, 0x78, + 0x6C, 0xD8, + 0x6C, 0xD8, + 0x6C, 0xD8, + 0x67, 0x98, + 0x63, 0x18, + 0x63, 0x18, + 0x60, 0x18, + 0x60, 0x18, + 0x60, 0x18, + 0xF8, 0x7C, + 0xF8, 0x7C +}; + +static const uint8_t courB18L1_0x4E_BMP[] = { + 0xF0, 0xF8, + 0xF0, 0xF8, + 0x78, 0x30, + 0x78, 0x30, + 0x6C, 0x30, + 0x6C, 0x30, + 0x66, 0x30, + 0x66, 0x30, + 0x63, 0x30, + 0x63, 0x30, + 0x61, 0xB0, + 0x61, 0xB0, + 0x60, 0xF0, + 0xF8, 0xF0, + 0xF8, 0x70 +}; + +static const uint8_t courB18L1_0x4F_BMP[] = { + 0x0F, 0x80, + 0x3F, 0xE0, + 0x70, 0x70, + 0x60, 0x30, + 0xE0, 0x38, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xE0, 0x38, + 0x60, 0x30, + 0x70, 0x70, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t courB18L1_0x50_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xF0, + 0x30, 0x38, + 0x30, 0x18, + 0x30, 0x18, + 0x30, 0x18, + 0x30, 0x18, + 0x30, 0x38, + 0x3F, 0xF0, + 0x3F, 0xC0, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0xFF, 0x00, + 0xFF, 0x00 +}; + +static const uint8_t courB18L1_0x51_BMP[] = { + 0x0F, 0x80, + 0x3F, 0xE0, + 0x70, 0x70, + 0x60, 0x30, + 0xE0, 0x38, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xE0, 0x38, + 0x60, 0x30, + 0x70, 0x70, + 0x3F, 0xE0, + 0x0F, 0x80, + 0x0E, 0x18, + 0x3F, 0xF8, + 0x39, 0xE0 +}; + +static const uint8_t courB18L1_0x52_BMP[] = { + 0xFF, 0x80, + 0xFF, 0xE0, + 0x30, 0x70, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x70, + 0x3F, 0xE0, + 0x3F, 0x80, + 0x31, 0xC0, + 0x30, 0xE0, + 0x30, 0x60, + 0x30, 0x70, + 0xFC, 0x3C, + 0xFC, 0x3C +}; + +static const uint8_t courB18L1_0x53_BMP[] = { + 0x1F, 0xB0, + 0x3F, 0xF0, + 0x70, 0x70, + 0x60, 0x30, + 0x60, 0x30, + 0x70, 0x00, + 0x3E, 0x00, + 0x1F, 0xC0, + 0x03, 0xE0, + 0x00, 0x70, + 0xC0, 0x30, + 0xC0, 0x30, + 0xE0, 0x70, + 0xFF, 0xE0, + 0xDF, 0xC0 +}; + +static const uint8_t courB18L1_0x54_BMP[] = { + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xC6, 0x30, + 0xC6, 0x30, + 0xC6, 0x30, + 0xC6, 0x30, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x3F, 0xC0, + 0x3F, 0xC0 +}; + +static const uint8_t courB18L1_0x55_BMP[] = { + 0xF8, 0xF8, + 0xF8, 0xF8, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x30, 0x60, + 0x3F, 0xE0, + 0x1F, 0xC0 +}; + +static const uint8_t courB18L1_0x56_BMP[] = { + 0xF8, 0x7C, + 0xF8, 0x7C, + 0x60, 0x18, + 0x60, 0x18, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x18, 0x60, + 0x18, 0x60, + 0x18, 0x60, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x07, 0x80, + 0x07, 0x80, + 0x07, 0x80 +}; + +static const uint8_t courB18L1_0x57_BMP[] = { + 0xF8, 0x7C, + 0xF8, 0x7C, + 0x60, 0x18, + 0x63, 0x18, + 0x63, 0x18, + 0x67, 0x98, + 0x67, 0x98, + 0x6F, 0xD8, + 0x6C, 0xD8, + 0x6C, 0xD8, + 0x3C, 0xF0, + 0x38, 0x70, + 0x38, 0x70, + 0x38, 0x70, + 0x38, 0x70 +}; + +static const uint8_t courB18L1_0x58_BMP[] = { + 0xFC, 0xFC, + 0xFC, 0xFC, + 0x70, 0x38, + 0x38, 0x70, + 0x1C, 0xE0, + 0x0F, 0xC0, + 0x07, 0x80, + 0x03, 0x00, + 0x07, 0x80, + 0x0C, 0xC0, + 0x1C, 0xE0, + 0x38, 0x70, + 0x70, 0x38, + 0xFC, 0xFC, + 0xFC, 0xFC +}; + +static const uint8_t courB18L1_0x59_BMP[] = { + 0xFC, 0xFC, + 0xFC, 0xFC, + 0x70, 0x38, + 0x38, 0x70, + 0x18, 0x60, + 0x0C, 0xC0, + 0x0F, 0xC0, + 0x07, 0x80, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x1F, 0xE0, + 0x1F, 0xE0 +}; + +static const uint8_t courB18L1_0x5A_BMP[] = { + 0xFF, 0xE0, + 0xFF, 0xE0, + 0xC0, 0xE0, + 0xC1, 0xC0, + 0xC3, 0x80, + 0x03, 0x00, + 0x07, 0x00, + 0x0E, 0x00, + 0x1C, 0x00, + 0x18, 0x00, + 0x38, 0x60, + 0x70, 0x60, + 0xE0, 0x60, + 0xFF, 0xE0, + 0xFF, 0xE0 +}; + +static const uint8_t courB18L1_0x5B_BMP[] = { + 0xF8, + 0xF8, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xF8, + 0xF8 +}; + +static const uint8_t courB18L1_0x5C_BMP[] = { + 0xC0, 0x00, + 0xC0, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x01, 0x80, + 0x01, 0x80, + 0x00, 0xC0, + 0x00, 0xC0, + 0x00, 0x60, + 0x00, 0x60 +}; + +static const uint8_t courB18L1_0x5D_BMP[] = { + 0xF8, + 0xF8, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xF8, + 0xF8 +}; + +static const uint8_t courB18L1_0x5E_BMP[] = { + 0x18, + 0x18, + 0x3C, + 0x3C, + 0x66, + 0x66, + 0xC3, + 0xC3 +}; + +static const uint8_t courB18L1_0x5F_BMP[] = { + 0xFF, 0xFE, + 0xFF, 0xFE +}; + +static const uint8_t courB18L1_0x60_BMP[] = { + 0xC0, + 0x60, + 0x30, + 0x18 +}; + +static const uint8_t courB18L1_0x61_BMP[] = { + 0x3F, 0x00, + 0x7F, 0x80, + 0x61, 0xC0, + 0x00, 0xC0, + 0x1F, 0xC0, + 0x7F, 0xC0, + 0xE0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0xFF, 0xF0, + 0x7E, 0xF0 +}; + +static const uint8_t courB18L1_0x62_BMP[] = { + 0xF0, 0x00, + 0xF0, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x37, 0xC0, + 0x3F, 0xF0, + 0x3C, 0x70, + 0x38, 0x38, + 0x30, 0x18, + 0x30, 0x18, + 0x30, 0x18, + 0x38, 0x38, + 0x3C, 0x70, + 0xFF, 0xF0, + 0xF7, 0xC0 +}; + +static const uint8_t courB18L1_0x63_BMP[] = { + 0x1F, 0xB0, + 0x7F, 0xF0, + 0x70, 0xF0, + 0xE0, 0x70, + 0xC0, 0x30, + 0xC0, 0x00, + 0xC0, 0x00, + 0xE0, 0x00, + 0x70, 0x70, + 0x7F, 0xF0, + 0x1F, 0xC0 +}; + +static const uint8_t courB18L1_0x64_BMP[] = { + 0x01, 0xE0, + 0x01, 0xE0, + 0x00, 0x60, + 0x00, 0x60, + 0x00, 0x60, + 0x1F, 0x60, + 0x7F, 0xE0, + 0x71, 0xE0, + 0xE0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0xE0, + 0x71, 0xE0, + 0x7F, 0xF8, + 0x1F, 0x78 +}; + +static const uint8_t courB18L1_0x65_BMP[] = { + 0x1F, 0x80, + 0x7F, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xC0, 0x30, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xE0, 0x00, + 0x70, 0x70, + 0x7F, 0xF0, + 0x1F, 0xC0 +}; + +static const uint8_t courB18L1_0x66_BMP[] = { + 0x07, 0xE0, + 0x0F, 0xE0, + 0x1C, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x18, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB18L1_0x67_BMP[] = { + 0x1F, 0x78, + 0x7F, 0xF8, + 0x71, 0xE0, + 0xE0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0xE0, + 0x71, 0xE0, + 0x7F, 0xE0, + 0x1F, 0x60, + 0x00, 0x60, + 0x00, 0x60, + 0x00, 0xE0, + 0x3F, 0xC0, + 0x3F, 0x80 +}; + +static const uint8_t courB18L1_0x68_BMP[] = { + 0xF0, 0x00, + 0xF0, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x37, 0xC0, + 0x3F, 0xE0, + 0x3C, 0x70, + 0x38, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0xFC, 0xFC, + 0xFC, 0xFC +}; + +static const uint8_t courB18L1_0x69_BMP[] = { + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x7C, 0x00, + 0x7C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB18L1_0x6A_BMP[] = { + 0x0E, + 0x0E, + 0x0E, + 0x00, + 0x00, + 0xFF, + 0xFF, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x07, + 0xFE, + 0xFC +}; + +static const uint8_t courB18L1_0x6B_BMP[] = { + 0xF0, 0x00, + 0xF0, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x31, 0xE0, + 0x31, 0xE0, + 0x33, 0x80, + 0x37, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x37, 0x00, + 0x33, 0x80, + 0x31, 0xC0, + 0xF1, 0xF8, + 0xF1, 0xF8 +}; + +static const uint8_t courB18L1_0x6C_BMP[] = { + 0x7C, 0x00, + 0x7C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB18L1_0x6D_BMP[] = { + 0xEF, 0x78, + 0xFF, 0xFC, + 0x39, 0xCC, + 0x31, 0x8C, + 0x31, 0x8C, + 0x31, 0x8C, + 0x31, 0x8C, + 0x31, 0x8C, + 0x31, 0x8C, + 0xF9, 0xEF, + 0xF9, 0xEF +}; + +static const uint8_t courB18L1_0x6E_BMP[] = { + 0xF3, 0xC0, + 0xF7, 0xE0, + 0x3C, 0x70, + 0x38, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0xFC, 0xFC, + 0xFC, 0xFC +}; + +static const uint8_t courB18L1_0x6F_BMP[] = { + 0x1F, 0x80, + 0x7F, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xC0, 0x30, + 0xC0, 0x30, + 0xC0, 0x30, + 0xE0, 0x70, + 0x70, 0xE0, + 0x7F, 0xE0, + 0x1F, 0x80 +}; + +static const uint8_t courB18L1_0x70_BMP[] = { + 0xF7, 0xC0, + 0xFF, 0xF0, + 0x3C, 0x70, + 0x38, 0x38, + 0x30, 0x18, + 0x30, 0x18, + 0x30, 0x18, + 0x38, 0x38, + 0x3C, 0x70, + 0x3F, 0xF0, + 0x37, 0xC0, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0xFE, 0x00, + 0xFE, 0x00 +}; + +static const uint8_t courB18L1_0x71_BMP[] = { + 0x1F, 0x78, + 0x7F, 0xF8, + 0x71, 0xE0, + 0xE0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0xE0, + 0x71, 0xE0, + 0x7F, 0xE0, + 0x1F, 0x60, + 0x00, 0x60, + 0x00, 0x60, + 0x00, 0x60, + 0x03, 0xF8, + 0x03, 0xF8 +}; + +static const uint8_t courB18L1_0x72_BMP[] = { + 0x79, 0xE0, + 0x7F, 0xF0, + 0x1E, 0x30, + 0x1C, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB18L1_0x73_BMP[] = { + 0x3E, 0xC0, + 0x7F, 0xC0, + 0xE1, 0xC0, + 0xE0, 0xC0, + 0x7C, 0x00, + 0x1F, 0x00, + 0x07, 0xC0, + 0xC0, 0xE0, + 0xE0, 0xE0, + 0xFF, 0xC0, + 0xDF, 0x80 +}; + +static const uint8_t courB18L1_0x74_BMP[] = { + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x38, 0xE0, + 0x1F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t courB18L1_0x75_BMP[] = { + 0xF0, 0xF0, + 0xF0, 0xF0, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x38, 0x70, + 0x1F, 0xFC, + 0x0F, 0xBC +}; + +static const uint8_t courB18L1_0x76_BMP[] = { + 0xFC, 0xFC, + 0xFC, 0xFC, + 0x30, 0x30, + 0x30, 0x30, + 0x18, 0x60, + 0x18, 0x60, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x07, 0x80, + 0x07, 0x80, + 0x03, 0x00 +}; + +static const uint8_t courB18L1_0x77_BMP[] = { + 0xF8, 0x7C, + 0xF8, 0x7C, + 0x63, 0x18, + 0x63, 0x18, + 0x33, 0x30, + 0x37, 0xB0, + 0x37, 0xB0, + 0x3C, 0xF0, + 0x1C, 0xE0, + 0x18, 0x60, + 0x18, 0x60 +}; + +static const uint8_t courB18L1_0x78_BMP[] = { + 0xF9, 0xF0, + 0xF9, 0xF0, + 0x30, 0xC0, + 0x19, 0x80, + 0x0F, 0x00, + 0x06, 0x00, + 0x0F, 0x00, + 0x19, 0x80, + 0x30, 0xC0, + 0xF9, 0xF0, + 0xF9, 0xF0 +}; + +static const uint8_t courB18L1_0x79_BMP[] = { + 0xF9, 0xF0, + 0xF9, 0xF0, + 0x60, 0x60, + 0x70, 0xE0, + 0x30, 0xC0, + 0x39, 0xC0, + 0x19, 0x80, + 0x1B, 0x80, + 0x0F, 0x00, + 0x0F, 0x00, + 0x06, 0x00, + 0x0E, 0x00, + 0x0C, 0x00, + 0x1C, 0x00, + 0xFE, 0x00, + 0xFE, 0x00 +}; + +static const uint8_t courB18L1_0x7A_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xC3, 0x80, + 0xC7, 0x00, + 0x0E, 0x00, + 0x1C, 0x00, + 0x38, 0x00, + 0x70, 0xC0, + 0xE0, 0xC0, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB18L1_0x7B_BMP[] = { + 0x0E, + 0x18, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x70, + 0xE0, + 0x70, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x18, + 0x0E +}; + +static const uint8_t courB18L1_0x7C_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t courB18L1_0x7D_BMP[] = { + 0xE0, + 0x30, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x1C, + 0x0E, + 0x1C, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x30, + 0xE0 +}; + +static const uint8_t courB18L1_0x7E_BMP[] = { + 0x3C, 0x30, + 0x7E, 0x70, + 0xE7, 0xE0, + 0xC3, 0xC0 +}; + +static const uint8_t courB18L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t courB18L1_0xA1_BMP[] = { + 0x60, + 0x60, + 0x60, + 0x00, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0x60 +}; + +static const uint8_t courB18L1_0xA2_BMP[] = { + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x3D, 0x80, + 0x7F, 0x80, + 0xE3, 0x80, + 0xC1, 0x80, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xE1, 0x80, + 0x7F, 0x80, + 0x3F, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00 +}; + +static const uint8_t courB18L1_0xA3_BMP[] = { + 0x0F, 0x80, + 0x1F, 0xC0, + 0x38, 0xC0, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0xFF, 0x00, + 0xFF, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x38, 0x00, + 0x70, 0x30, + 0xFF, 0xF0, + 0xFF, 0xE0 +}; + +static const uint8_t courB18L1_0xA4_BMP[] = { + 0xC0, 0xC0, + 0xFF, 0xC0, + 0x7F, 0x80, + 0xE1, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x7F, 0x80, + 0xFF, 0xC0, + 0xC0, 0xC0 +}; + +static const uint8_t courB18L1_0xA5_BMP[] = { + 0xF9, 0xF0, + 0xF9, 0xF0, + 0x70, 0xE0, + 0x30, 0xC0, + 0x39, 0xC0, + 0x19, 0x80, + 0x0F, 0x00, + 0x0F, 0x00, + 0x3F, 0xC0, + 0x06, 0x00, + 0x3F, 0xC0, + 0x06, 0x00, + 0x06, 0x00, + 0x3F, 0xC0, + 0x3F, 0xC0 +}; + +static const uint8_t courB18L1_0xA6_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x00, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t courB18L1_0xA7_BMP[] = { + 0x0F, 0xE0, + 0x1F, 0xE0, + 0x38, 0x60, + 0x30, 0x60, + 0x38, 0x00, + 0x7E, 0x00, + 0xCF, 0x80, + 0xC3, 0xE0, + 0xF0, 0xF0, + 0x7C, 0x30, + 0x1F, 0x30, + 0x07, 0xF0, + 0x01, 0xE0, + 0x00, 0xC0, + 0x60, 0xC0, + 0x61, 0xC0, + 0x7F, 0x80, + 0x7F, 0x00 +}; + +static const uint8_t courB18L1_0xA8_BMP[] = { + 0xC6, + 0xC6, + 0xC6 +}; + +static const uint8_t courB18L1_0xA9_BMP[] = { + 0x07, 0x80, + 0x1F, 0xE0, + 0x38, 0x70, + 0x67, 0x98, + 0x6F, 0xD8, + 0xDC, 0xCC, + 0xD8, 0x0C, + 0xD8, 0x0C, + 0xDC, 0xCC, + 0x6F, 0xD8, + 0x67, 0x98, + 0x38, 0x70, + 0x1F, 0xE0, + 0x07, 0x80 +}; + +static const uint8_t courB18L1_0xAA_BMP[] = { + 0x3C, + 0x66, + 0x06, + 0x7E, + 0xC6, + 0xC6, + 0xCF, + 0x7B, + 0x00, + 0xFF, + 0xFF +}; + +static const uint8_t courB18L1_0xAB_BMP[] = { + 0x0E, 0x38, + 0x1C, 0x70, + 0x38, 0xE0, + 0x71, 0xC0, + 0xE3, 0x80, + 0x71, 0xC0, + 0x38, 0xE0, + 0x1C, 0x70, + 0x0E, 0x38 +}; + +static const uint8_t courB18L1_0xAC_BMP[] = { + 0xFF, 0xF0, + 0xFF, 0xF0, + 0x00, 0x30, + 0x00, 0x30, + 0x00, 0x30, + 0x00, 0x30 +}; + +static const uint8_t courB18L1_0xAD_BMP[] = { + 0xFF, 0xE0, + 0xFF, 0xE0 +}; + +static const uint8_t courB18L1_0xAE_BMP[] = { + 0x07, 0x80, + 0x1F, 0xE0, + 0x38, 0x70, + 0x6F, 0x98, + 0x6F, 0xD8, + 0xCC, 0xCC, + 0xCC, 0xCC, + 0xCF, 0x8C, + 0xCD, 0x8C, + 0x6C, 0xD8, + 0x6C, 0xD8, + 0x38, 0x70, + 0x1F, 0xE0, + 0x07, 0x80 +}; + +static const uint8_t courB18L1_0xAF_BMP[] = { + 0xFE, + 0xFE +}; + +static const uint8_t courB18L1_0xB0_BMP[] = { + 0x3C, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t courB18L1_0xB1_BMP[] = { + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0 +}; + +static const uint8_t courB18L1_0xB2_BMP[] = { + 0x7C, + 0xC6, + 0xC6, + 0x0C, + 0x18, + 0x30, + 0x60, + 0xC6, + 0xFE +}; + +static const uint8_t courB18L1_0xB3_BMP[] = { + 0x7C, + 0xC6, + 0xC6, + 0x0C, + 0x3C, + 0x06, + 0xC6, + 0xC6, + 0x7C +}; + +static const uint8_t courB18L1_0xB4_BMP[] = { + 0x1C, + 0x38, + 0x70, + 0xE0 +}; + +static const uint8_t courB18L1_0xB5_BMP[] = { + 0xF0, 0xF0, + 0xF0, 0xF0, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x38, 0x70, + 0x3F, 0xFC, + 0x3F, 0xBC, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00 +}; + +static const uint8_t courB18L1_0xB6_BMP[] = { + 0x1F, 0xF0, + 0x7F, 0xF0, + 0xE6, 0xC0, + 0xE6, 0xC0, + 0xE6, 0xC0, + 0xE6, 0xC0, + 0xE6, 0xC0, + 0x7E, 0xC0, + 0x1E, 0xC0, + 0x06, 0xC0, + 0x06, 0xC0, + 0x06, 0xC0, + 0x06, 0xC0, + 0x06, 0xC0, + 0x06, 0xC0, + 0x06, 0xC0, + 0x3E, 0xF0, + 0x3E, 0xF0 +}; + +static const uint8_t courB18L1_0xB7_BMP[] = { + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t courB18L1_0xB8_BMP[] = { + 0x30, + 0x30, + 0x78, + 0x18, + 0xF8, + 0x70 +}; + +static const uint8_t courB18L1_0xB9_BMP[] = { + 0x18, + 0xF8, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF +}; + +static const uint8_t courB18L1_0xBA_BMP[] = { + 0x3C, + 0x7E, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0x7E, + 0x3C, + 0x00, + 0xFF, + 0xFF +}; + +static const uint8_t courB18L1_0xBB_BMP[] = { + 0xE3, 0x80, + 0x71, 0xC0, + 0x38, 0xE0, + 0x1C, 0x70, + 0x0E, 0x38, + 0x1C, 0x70, + 0x38, 0xE0, + 0x71, 0xC0, + 0xE3, 0x80 +}; + +static const uint8_t courB18L1_0xBC_BMP[] = { + 0x18, 0x00, + 0xF8, 0x01, + 0x18, 0x03, + 0x18, 0x06, + 0x18, 0x0C, + 0x18, 0x18, + 0x18, 0x30, + 0x18, 0x64, + 0xFF, 0xCC, + 0x01, 0x9C, + 0x03, 0x2C, + 0x06, 0x4C, + 0x0C, 0x8C, + 0x18, 0xFE, + 0x30, 0x0C, + 0x20, 0x1E +}; + +static const uint8_t courB18L1_0xBD_BMP[] = { + 0x18, 0x00, + 0xF8, 0x01, + 0x18, 0x03, + 0x18, 0x06, + 0x18, 0x0C, + 0x18, 0x18, + 0x18, 0x30, + 0x18, 0x7E, + 0xFF, 0xF3, + 0x01, 0xA3, + 0x03, 0x06, + 0x06, 0x0C, + 0x0C, 0x18, + 0x18, 0x30, + 0x30, 0x63, + 0x20, 0x7F +}; + +static const uint8_t courB18L1_0xBE_BMP[] = { + 0x7C, 0x00, + 0xC6, 0x02, + 0xC6, 0x06, + 0x0C, 0x0C, + 0x3C, 0x18, + 0x06, 0x30, + 0xC6, 0x60, + 0xC6, 0xC8, + 0x7D, 0x98, + 0x03, 0x38, + 0x06, 0x58, + 0x0C, 0x98, + 0x19, 0x18, + 0x31, 0xFC, + 0x60, 0x18, + 0x40, 0x3C +}; + +static const uint8_t courB18L1_0xBF_BMP[] = { + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x1C, 0x00, + 0x78, 0x00, + 0xE0, 0x00, + 0xC0, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xE1, 0x80, + 0x7F, 0x80, + 0x3F, 0x00 +}; + +static const uint8_t courB18L1_0xC0_BMP[] = { + 0x38, 0x00, + 0x1C, 0x00, + 0x0E, 0x00, + 0x07, 0x00, + 0x00, 0x00, + 0x3F, 0x00, + 0x3F, 0x00, + 0x07, 0x80, + 0x07, 0x80, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x1C, 0xE0, + 0x18, 0x60, + 0x18, 0x60, + 0x3F, 0xF0, + 0x3F, 0xF0, + 0x70, 0x38, + 0x60, 0x18, + 0xFC, 0xFC, + 0xFC, 0xFC +}; + +static const uint8_t courB18L1_0xC1_BMP[] = { + 0x00, 0xE0, + 0x01, 0xC0, + 0x03, 0x80, + 0x07, 0x00, + 0x00, 0x00, + 0x3F, 0x00, + 0x3F, 0x00, + 0x07, 0x80, + 0x07, 0x80, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x1C, 0xE0, + 0x18, 0x60, + 0x18, 0x60, + 0x3F, 0xF0, + 0x3F, 0xF0, + 0x70, 0x38, + 0x60, 0x18, + 0xFC, 0xFC, + 0xFC, 0xFC +}; + +static const uint8_t courB18L1_0xC2_BMP[] = { + 0x06, 0x00, + 0x0F, 0x00, + 0x1F, 0x80, + 0x39, 0xC0, + 0x70, 0xE0, + 0x00, 0x00, + 0x3F, 0x00, + 0x3F, 0x00, + 0x07, 0x80, + 0x07, 0x80, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x1C, 0xE0, + 0x18, 0x60, + 0x18, 0x60, + 0x3F, 0xF0, + 0x3F, 0xF0, + 0x70, 0x38, + 0x60, 0x18, + 0xFC, 0xFC, + 0xFC, 0xFC +}; + +static const uint8_t courB18L1_0xC3_BMP[] = { + 0x0E, 0x60, + 0x1F, 0xC0, + 0x33, 0x80, + 0x00, 0x00, + 0x3F, 0x00, + 0x3F, 0x00, + 0x07, 0x80, + 0x07, 0x80, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x1C, 0xE0, + 0x18, 0x60, + 0x18, 0x60, + 0x3F, 0xF0, + 0x3F, 0xF0, + 0x70, 0x38, + 0x60, 0x18, + 0xFC, 0xFC, + 0xFC, 0xFC +}; + +static const uint8_t courB18L1_0xC4_BMP[] = { + 0x18, 0xC0, + 0x18, 0xC0, + 0x18, 0xC0, + 0x00, 0x00, + 0x3F, 0x00, + 0x3F, 0x00, + 0x07, 0x80, + 0x07, 0x80, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x1C, 0xE0, + 0x18, 0x60, + 0x18, 0x60, + 0x3F, 0xF0, + 0x3F, 0xF0, + 0x70, 0x38, + 0x60, 0x18, + 0xFC, 0xFC, + 0xFC, 0xFC +}; + +static const uint8_t courB18L1_0xC5_BMP[] = { + 0x07, 0x00, + 0x0D, 0x80, + 0x08, 0x80, + 0x0D, 0x80, + 0x07, 0x00, + 0x3F, 0x00, + 0x3F, 0x00, + 0x07, 0x80, + 0x07, 0x80, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x1C, 0xE0, + 0x18, 0x60, + 0x18, 0x60, + 0x3F, 0xF0, + 0x3F, 0xF0, + 0x70, 0x38, + 0x60, 0x18, + 0xFC, 0xFC, + 0xFC, 0xFC +}; + +static const uint8_t courB18L1_0xC6_BMP[] = { + 0x0F, 0xFE, + 0x0F, 0xFE, + 0x03, 0x86, + 0x07, 0x86, + 0x07, 0x80, + 0x0D, 0x98, + 0x09, 0xF8, + 0x19, 0xF8, + 0x1F, 0x98, + 0x3F, 0x80, + 0x31, 0x80, + 0x61, 0x86, + 0x61, 0x86, + 0xF7, 0xFE, + 0xF7, 0xFE +}; + +static const uint8_t courB18L1_0xC7_BMP[] = { + 0x0F, 0xB0, + 0x3F, 0xF0, + 0x70, 0x70, + 0x60, 0x30, + 0xE0, 0x30, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xE0, 0x00, + 0x60, 0x10, + 0x70, 0x30, + 0x3F, 0xE0, + 0x0F, 0xC0, + 0x06, 0x00, + 0x0F, 0x00, + 0x03, 0x00, + 0x1F, 0x00, + 0x0E, 0x00 +}; + +static const uint8_t courB18L1_0xC8_BMP[] = { + 0x38, 0x00, + 0x1C, 0x00, + 0x0E, 0x00, + 0x07, 0x00, + 0x00, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0x30, 0x30, + 0x30, 0x30, + 0x31, 0xB0, + 0x31, 0x80, + 0x3F, 0x80, + 0x3F, 0x80, + 0x31, 0x80, + 0x31, 0x80, + 0x30, 0x18, + 0x30, 0x18, + 0x30, 0x18, + 0xFF, 0xF8, + 0xFF, 0xF8 +}; + +static const uint8_t courB18L1_0xC9_BMP[] = { + 0x00, 0xE0, + 0x01, 0xC0, + 0x03, 0x80, + 0x07, 0x00, + 0x00, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0x30, 0x30, + 0x30, 0x30, + 0x31, 0xB0, + 0x31, 0x80, + 0x3F, 0x80, + 0x3F, 0x80, + 0x31, 0x80, + 0x31, 0x80, + 0x30, 0x18, + 0x30, 0x18, + 0x30, 0x18, + 0xFF, 0xF8, + 0xFF, 0xF8 +}; + +static const uint8_t courB18L1_0xCA_BMP[] = { + 0x03, 0x00, + 0x07, 0x80, + 0x0F, 0xC0, + 0x1C, 0xE0, + 0x38, 0x70, + 0x00, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0x30, 0x30, + 0x30, 0x30, + 0x31, 0xB0, + 0x31, 0x80, + 0x3F, 0x80, + 0x3F, 0x80, + 0x31, 0x80, + 0x31, 0x80, + 0x30, 0x18, + 0x30, 0x18, + 0x30, 0x18, + 0xFF, 0xF8, + 0xFF, 0xF8 +}; + +static const uint8_t courB18L1_0xCB_BMP[] = { + 0x18, 0xC0, + 0x18, 0xC0, + 0x18, 0xC0, + 0x00, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0x30, 0x30, + 0x30, 0x30, + 0x31, 0xB0, + 0x31, 0x80, + 0x3F, 0x80, + 0x3F, 0x80, + 0x31, 0x80, + 0x31, 0x80, + 0x30, 0x18, + 0x30, 0x18, + 0x30, 0x18, + 0xFF, 0xF8, + 0xFF, 0xF8 +}; + +static const uint8_t courB18L1_0xCC_BMP[] = { + 0x70, 0x00, + 0x38, 0x00, + 0x1C, 0x00, + 0x0E, 0x00, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB18L1_0xCD_BMP[] = { + 0x03, 0x80, + 0x07, 0x00, + 0x0E, 0x00, + 0x1C, 0x00, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB18L1_0xCE_BMP[] = { + 0x0C, 0x00, + 0x1E, 0x00, + 0x3F, 0x00, + 0x73, 0x80, + 0xE1, 0xC0, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB18L1_0xCF_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB18L1_0xD0_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xF0, + 0x30, 0x38, + 0x30, 0x18, + 0x30, 0x1C, + 0x30, 0x0C, + 0xFE, 0x0C, + 0xFE, 0x0C, + 0x30, 0x0C, + 0x30, 0x0C, + 0x30, 0x0C, + 0x30, 0x18, + 0x30, 0x38, + 0xFF, 0xF0, + 0xFF, 0xE0 +}; + +static const uint8_t courB18L1_0xD1_BMP[] = { + 0x0E, 0x60, + 0x1F, 0xC0, + 0x33, 0x80, + 0x00, 0x00, + 0xF0, 0xF8, + 0xF0, 0xF8, + 0x78, 0x30, + 0x78, 0x30, + 0x6C, 0x30, + 0x6C, 0x30, + 0x66, 0x30, + 0x66, 0x30, + 0x63, 0x30, + 0x63, 0x30, + 0x61, 0xB0, + 0x61, 0xB0, + 0x60, 0xF0, + 0xF8, 0xF0, + 0xF8, 0x70 +}; + +static const uint8_t courB18L1_0xD2_BMP[] = { + 0x1C, 0x00, + 0x0E, 0x00, + 0x07, 0x00, + 0x03, 0x80, + 0x00, 0x00, + 0x0F, 0x80, + 0x3F, 0xE0, + 0x70, 0x70, + 0x60, 0x30, + 0xE0, 0x38, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xE0, 0x38, + 0x60, 0x30, + 0x70, 0x70, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t courB18L1_0xD3_BMP[] = { + 0x00, 0xE0, + 0x01, 0xC0, + 0x03, 0x80, + 0x07, 0x00, + 0x00, 0x00, + 0x0F, 0x80, + 0x3F, 0xE0, + 0x70, 0x70, + 0x60, 0x30, + 0xE0, 0x38, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xE0, 0x38, + 0x60, 0x30, + 0x70, 0x70, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t courB18L1_0xD4_BMP[] = { + 0x03, 0x00, + 0x07, 0x80, + 0x0F, 0xC0, + 0x1C, 0xE0, + 0x38, 0x70, + 0x00, 0x00, + 0x0F, 0x80, + 0x3F, 0xE0, + 0x70, 0x70, + 0x60, 0x30, + 0xE0, 0x38, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xE0, 0x38, + 0x60, 0x30, + 0x70, 0x70, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t courB18L1_0xD5_BMP[] = { + 0x0E, 0x60, + 0x1F, 0xC0, + 0x33, 0x80, + 0x00, 0x00, + 0x0F, 0x80, + 0x3F, 0xE0, + 0x70, 0x70, + 0x60, 0x30, + 0xE0, 0x38, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xE0, 0x38, + 0x60, 0x30, + 0x70, 0x70, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t courB18L1_0xD6_BMP[] = { + 0x18, 0xC0, + 0x18, 0xC0, + 0x18, 0xC0, + 0x00, 0x00, + 0x0F, 0x80, + 0x3F, 0xE0, + 0x70, 0x70, + 0x60, 0x30, + 0xE0, 0x38, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xE0, 0x38, + 0x60, 0x30, + 0x70, 0x70, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t courB18L1_0xD7_BMP[] = { + 0x40, 0x20, + 0xE0, 0x70, + 0x70, 0xE0, + 0x39, 0xC0, + 0x1F, 0x80, + 0x0F, 0x00, + 0x0F, 0x00, + 0x1F, 0x80, + 0x39, 0xC0, + 0x70, 0xE0, + 0xE0, 0x70, + 0x40, 0x20 +}; + +static const uint8_t courB18L1_0xD8_BMP[] = { + 0x00, 0x18, + 0x00, 0x30, + 0x0F, 0xE0, + 0x3F, 0xE0, + 0x70, 0x70, + 0x60, 0xF0, + 0xE1, 0xB8, + 0xC1, 0x18, + 0xC3, 0x18, + 0xC6, 0x18, + 0xC4, 0x18, + 0xCC, 0x18, + 0xE8, 0x38, + 0x78, 0x30, + 0x70, 0x70, + 0x3F, 0xE0, + 0x6F, 0x80, + 0xC0, 0x00 +}; + +static const uint8_t courB18L1_0xD9_BMP[] = { + 0x38, 0x00, + 0x1C, 0x00, + 0x0E, 0x00, + 0x07, 0x00, + 0x00, 0x00, + 0xF8, 0xF8, + 0xF8, 0xF8, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x30, 0x60, + 0x3F, 0xE0, + 0x1F, 0xC0 +}; + +static const uint8_t courB18L1_0xDA_BMP[] = { + 0x00, 0xE0, + 0x01, 0xC0, + 0x03, 0x80, + 0x07, 0x00, + 0x00, 0x00, + 0xF8, 0xF8, + 0xF8, 0xF8, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x30, 0x60, + 0x3F, 0xE0, + 0x1F, 0xC0 +}; + +static const uint8_t courB18L1_0xDB_BMP[] = { + 0x03, 0x00, + 0x07, 0x80, + 0x0F, 0xC0, + 0x1C, 0xE0, + 0x38, 0x70, + 0x00, 0x00, + 0xF8, 0xF8, + 0xF8, 0xF8, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x30, 0x60, + 0x3F, 0xE0, + 0x1F, 0xC0 +}; + +static const uint8_t courB18L1_0xDC_BMP[] = { + 0x18, 0xC0, + 0x18, 0xC0, + 0x18, 0xC0, + 0x00, 0x00, + 0xF8, 0xF8, + 0xF8, 0xF8, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x60, 0x30, + 0x30, 0x60, + 0x3F, 0xE0, + 0x1F, 0xC0 +}; + +static const uint8_t courB18L1_0xDD_BMP[] = { + 0x00, 0xE0, + 0x01, 0xC0, + 0x03, 0x80, + 0x07, 0x00, + 0x00, 0x00, + 0xFC, 0xFC, + 0xFC, 0xFC, + 0x70, 0x38, + 0x38, 0x70, + 0x18, 0x60, + 0x0C, 0xC0, + 0x0F, 0xC0, + 0x07, 0x80, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x1F, 0xE0, + 0x1F, 0xE0 +}; + +static const uint8_t courB18L1_0xDE_BMP[] = { + 0xFC, 0x00, + 0xFC, 0x00, + 0x30, 0x00, + 0x3F, 0xC0, + 0x3F, 0xF0, + 0x30, 0x38, + 0x30, 0x18, + 0x30, 0x18, + 0x30, 0x18, + 0x30, 0x38, + 0x3F, 0xF0, + 0x3F, 0xC0, + 0x30, 0x00, + 0xFC, 0x00, + 0xFC, 0x00 +}; + +static const uint8_t courB18L1_0xDF_BMP[] = { + 0x0F, 0x00, + 0x1F, 0x80, + 0x39, 0xC0, + 0x30, 0xC0, + 0x30, 0xC0, + 0x31, 0xC0, + 0x37, 0x80, + 0x37, 0xC0, + 0x30, 0xE0, + 0x30, 0x70, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x33, 0x70, + 0xFB, 0xE0, + 0xF9, 0xC0 +}; + +static const uint8_t courB18L1_0xE0_BMP[] = { + 0x70, 0x00, + 0x38, 0x00, + 0x1C, 0x00, + 0x0E, 0x00, + 0x00, 0x00, + 0x3F, 0x00, + 0x7F, 0x80, + 0x61, 0xC0, + 0x00, 0xC0, + 0x1F, 0xC0, + 0x7F, 0xC0, + 0xE0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0xFF, 0xF0, + 0x7E, 0xF0 +}; + +static const uint8_t courB18L1_0xE1_BMP[] = { + 0x01, 0xC0, + 0x03, 0x80, + 0x07, 0x00, + 0x0E, 0x00, + 0x00, 0x00, + 0x3F, 0x00, + 0x7F, 0x80, + 0x61, 0xC0, + 0x00, 0xC0, + 0x1F, 0xC0, + 0x7F, 0xC0, + 0xE0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0xFF, 0xF0, + 0x7E, 0xF0 +}; + +static const uint8_t courB18L1_0xE2_BMP[] = { + 0x0E, 0x00, + 0x1F, 0x00, + 0x3B, 0x80, + 0x71, 0xC0, + 0x00, 0x00, + 0x3F, 0x00, + 0x7F, 0x80, + 0x61, 0xC0, + 0x00, 0xC0, + 0x1F, 0xC0, + 0x7F, 0xC0, + 0xE0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0xFF, 0xF0, + 0x7E, 0xF0 +}; + +static const uint8_t courB18L1_0xE3_BMP[] = { + 0x1C, 0xC0, + 0x3F, 0x80, + 0x67, 0x00, + 0x00, 0x00, + 0x3F, 0x00, + 0x7F, 0x80, + 0x61, 0xC0, + 0x00, 0xC0, + 0x1F, 0xC0, + 0x7F, 0xC0, + 0xE0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0xFF, 0xF0, + 0x7E, 0xF0 +}; + +static const uint8_t courB18L1_0xE4_BMP[] = { + 0x31, 0x80, + 0x31, 0x80, + 0x31, 0x80, + 0x00, 0x00, + 0x3F, 0x00, + 0x7F, 0x80, + 0x61, 0xC0, + 0x00, 0xC0, + 0x1F, 0xC0, + 0x7F, 0xC0, + 0xE0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0xFF, 0xF0, + 0x7E, 0xF0 +}; + +static const uint8_t courB18L1_0xE5_BMP[] = { + 0x0E, 0x00, + 0x1B, 0x00, + 0x11, 0x00, + 0x1B, 0x00, + 0x0E, 0x00, + 0x3F, 0x00, + 0x7F, 0x80, + 0x61, 0xC0, + 0x00, 0xC0, + 0x1F, 0xC0, + 0x7F, 0xC0, + 0xE0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0xFF, 0xF0, + 0x7E, 0xF0 +}; + +static const uint8_t courB18L1_0xE6_BMP[] = { + 0x3C, 0xF0, + 0x7F, 0xF8, + 0x67, 0x9C, + 0x03, 0x0C, + 0x1F, 0x0C, + 0x7F, 0xFC, + 0xE3, 0xFC, + 0xC3, 0x00, + 0xC7, 0x8C, + 0xFF, 0xFC, + 0x7C, 0xF0 +}; + +static const uint8_t courB18L1_0xE7_BMP[] = { + 0x1F, 0x60, + 0x7F, 0xE0, + 0x70, 0xE0, + 0xE0, 0x60, + 0xC0, 0x60, + 0xC0, 0x00, + 0xC0, 0x00, + 0xE0, 0x00, + 0x70, 0x60, + 0x7F, 0xE0, + 0x1F, 0xC0, + 0x06, 0x00, + 0x0F, 0x00, + 0x03, 0x00, + 0x1F, 0x00, + 0x0E, 0x00 +}; + +static const uint8_t courB18L1_0xE8_BMP[] = { + 0x38, 0x00, + 0x1C, 0x00, + 0x0E, 0x00, + 0x07, 0x00, + 0x00, 0x00, + 0x1F, 0x80, + 0x7F, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xC0, 0x30, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xE0, 0x00, + 0x70, 0x70, + 0x7F, 0xF0, + 0x1F, 0xC0 +}; + +static const uint8_t courB18L1_0xE9_BMP[] = { + 0x01, 0xC0, + 0x03, 0x80, + 0x07, 0x00, + 0x0E, 0x00, + 0x00, 0x00, + 0x1F, 0x80, + 0x7F, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xC0, 0x30, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xE0, 0x00, + 0x70, 0x70, + 0x7F, 0xF0, + 0x1F, 0xC0 +}; + +static const uint8_t courB18L1_0xEA_BMP[] = { + 0x07, 0x00, + 0x0F, 0x80, + 0x1D, 0xC0, + 0x38, 0xE0, + 0x00, 0x00, + 0x1F, 0x80, + 0x7F, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xC0, 0x30, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xE0, 0x00, + 0x70, 0x70, + 0x7F, 0xF0, + 0x1F, 0xC0 +}; + +static const uint8_t courB18L1_0xEB_BMP[] = { + 0x31, 0x80, + 0x31, 0x80, + 0x31, 0x80, + 0x00, 0x00, + 0x1F, 0x80, + 0x7F, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xC0, 0x30, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xE0, 0x00, + 0x70, 0x70, + 0x7F, 0xF0, + 0x1F, 0xC0 +}; + +static const uint8_t courB18L1_0xEC_BMP[] = { + 0xE0, 0x00, + 0x70, 0x00, + 0x38, 0x00, + 0x1C, 0x00, + 0x00, 0x00, + 0x7C, 0x00, + 0x7C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB18L1_0xED_BMP[] = { + 0x03, 0x80, + 0x07, 0x00, + 0x0E, 0x00, + 0x1C, 0x00, + 0x00, 0x00, + 0x7C, 0x00, + 0x7C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB18L1_0xEE_BMP[] = { + 0x1C, 0x00, + 0x3E, 0x00, + 0x77, 0x00, + 0xE3, 0x80, + 0x00, 0x00, + 0x7C, 0x00, + 0x7C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB18L1_0xEF_BMP[] = { + 0x63, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x00, 0x00, + 0x7C, 0x00, + 0x7C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB18L1_0xF0_BMP[] = { + 0xF0, 0x00, + 0xFC, 0x70, + 0x0F, 0xF0, + 0x1F, 0x80, + 0x7D, 0xC0, + 0x70, 0xE0, + 0x0F, 0xF0, + 0x3F, 0xF0, + 0x38, 0x78, + 0x70, 0x38, + 0x60, 0x18, + 0x60, 0x18, + 0x60, 0x18, + 0x70, 0x38, + 0x38, 0x70, + 0x3F, 0xF0, + 0x0F, 0xC0 +}; + +static const uint8_t courB18L1_0xF1_BMP[] = { + 0x0E, 0x60, + 0x1F, 0xC0, + 0x33, 0x80, + 0x00, 0x00, + 0xF3, 0xC0, + 0xF7, 0xE0, + 0x3C, 0x70, + 0x38, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0xFC, 0xFC, + 0xFC, 0xFC +}; + +static const uint8_t courB18L1_0xF2_BMP[] = { + 0x38, 0x00, + 0x1C, 0x00, + 0x0E, 0x00, + 0x07, 0x00, + 0x00, 0x00, + 0x1F, 0x80, + 0x7F, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xC0, 0x30, + 0xC0, 0x30, + 0xC0, 0x30, + 0xE0, 0x70, + 0x70, 0xE0, + 0x7F, 0xE0, + 0x1F, 0x80 +}; + +static const uint8_t courB18L1_0xF3_BMP[] = { + 0x01, 0xC0, + 0x03, 0x80, + 0x07, 0x00, + 0x0E, 0x00, + 0x00, 0x00, + 0x1F, 0x80, + 0x7F, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xC0, 0x30, + 0xC0, 0x30, + 0xC0, 0x30, + 0xE0, 0x70, + 0x70, 0xE0, + 0x7F, 0xE0, + 0x1F, 0x80 +}; + +static const uint8_t courB18L1_0xF4_BMP[] = { + 0x0E, 0x00, + 0x1F, 0x00, + 0x3B, 0x80, + 0x71, 0xC0, + 0x00, 0x00, + 0x1F, 0x80, + 0x7F, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xC0, 0x30, + 0xC0, 0x30, + 0xC0, 0x30, + 0xE0, 0x70, + 0x70, 0xE0, + 0x7F, 0xE0, + 0x1F, 0x80 +}; + +static const uint8_t courB18L1_0xF5_BMP[] = { + 0x1C, 0xC0, + 0x3F, 0x80, + 0x67, 0x00, + 0x00, 0x00, + 0x1F, 0x80, + 0x7F, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xC0, 0x30, + 0xC0, 0x30, + 0xC0, 0x30, + 0xE0, 0x70, + 0x70, 0xE0, + 0x7F, 0xE0, + 0x1F, 0x80 +}; + +static const uint8_t courB18L1_0xF6_BMP[] = { + 0x31, 0x80, + 0x31, 0x80, + 0x31, 0x80, + 0x00, 0x00, + 0x1F, 0x80, + 0x7F, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xC0, 0x30, + 0xC0, 0x30, + 0xC0, 0x30, + 0xE0, 0x70, + 0x70, 0xE0, + 0x7F, 0xE0, + 0x1F, 0x80 +}; + +static const uint8_t courB18L1_0xF7_BMP[] = { + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xF8, + 0xFF, 0xF8, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00 +}; + +static const uint8_t courB18L1_0xF8_BMP[] = { + 0x00, 0x0C, + 0x0F, 0xD8, + 0x3F, 0xF0, + 0x38, 0x70, + 0x70, 0xD8, + 0x61, 0x98, + 0x63, 0x18, + 0x66, 0x18, + 0x6C, 0x38, + 0x38, 0x70, + 0x3F, 0xF0, + 0x3F, 0xC0, + 0x60, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t courB18L1_0xF9_BMP[] = { + 0x38, 0x00, + 0x1C, 0x00, + 0x0E, 0x00, + 0x07, 0x00, + 0x00, 0x00, + 0xF0, 0xF0, + 0xF0, 0xF0, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x38, 0x70, + 0x1F, 0xFC, + 0x0F, 0xBC +}; + +static const uint8_t courB18L1_0xFA_BMP[] = { + 0x01, 0xC0, + 0x03, 0x80, + 0x07, 0x00, + 0x0E, 0x00, + 0x00, 0x00, + 0xF0, 0xF0, + 0xF0, 0xF0, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x38, 0x70, + 0x1F, 0xFC, + 0x0F, 0xBC +}; + +static const uint8_t courB18L1_0xFB_BMP[] = { + 0x07, 0x00, + 0x0F, 0x80, + 0x1D, 0xC0, + 0x38, 0xE0, + 0x00, 0x00, + 0xF0, 0xF0, + 0xF0, 0xF0, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x38, 0x70, + 0x1F, 0xFC, + 0x0F, 0xBC +}; + +static const uint8_t courB18L1_0xFC_BMP[] = { + 0x18, 0xC0, + 0x18, 0xC0, + 0x18, 0xC0, + 0x00, 0x00, + 0xF0, 0xF0, + 0xF0, 0xF0, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x38, 0x70, + 0x1F, 0xFC, + 0x0F, 0xBC +}; + +static const uint8_t courB18L1_0xFD_BMP[] = { + 0x00, 0xE0, + 0x01, 0xC0, + 0x03, 0x80, + 0x07, 0x00, + 0x00, 0x00, + 0xF9, 0xF0, + 0xF9, 0xF0, + 0x60, 0x60, + 0x70, 0xE0, + 0x30, 0xC0, + 0x39, 0xC0, + 0x19, 0x80, + 0x1B, 0x80, + 0x0F, 0x00, + 0x0F, 0x00, + 0x06, 0x00, + 0x0E, 0x00, + 0x0C, 0x00, + 0x1C, 0x00, + 0xFE, 0x00, + 0xFE, 0x00 +}; + +static const uint8_t courB18L1_0xFE_BMP[] = { + 0xF0, 0x00, + 0xF0, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x37, 0xC0, + 0x3F, 0xF0, + 0x3C, 0x70, + 0x38, 0x38, + 0x30, 0x18, + 0x30, 0x18, + 0x30, 0x18, + 0x38, 0x38, + 0x3C, 0x70, + 0x3F, 0xF0, + 0x37, 0xC0, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0xFE, 0x00, + 0xFE, 0x00 +}; + +static const uint8_t courB18L1_0xFF_BMP[] = { + 0x31, 0x80, + 0x31, 0x80, + 0x31, 0x80, + 0x00, 0x00, + 0xF9, 0xF0, + 0xF9, 0xF0, + 0x60, 0x60, + 0x70, 0xE0, + 0x30, 0xC0, + 0x39, 0xC0, + 0x19, 0x80, + 0x1B, 0x80, + 0x0F, 0x00, + 0x0F, 0x00, + 0x06, 0x00, + 0x0E, 0x00, + 0x0C, 0x00, + 0x1C, 0x00, + 0xFE, 0x00, + 0xFE, 0x00 +}; + +static const GFONT_CharInfo FontBMP[] = { + {15, 13, 15, 0, 0, courB18L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {15, 1, 1, 0, 0, courB18L1_0x20_BMP}, + {15, 4, 16, 5, 0, courB18L1_0x21_BMP}, + {15, 7, 7, 3, 9, courB18L1_0x22_BMP}, + {15, 12, 19, 1, -2, courB18L1_0x23_BMP}, + {15, 10, 20, 2, -3, courB18L1_0x24_BMP}, + {15, 11, 15, 2, 0, courB18L1_0x25_BMP}, + {15, 11, 14, 2, 0, courB18L1_0x26_BMP}, + {15, 3, 7, 5, 8, courB18L1_0x27_BMP}, + {15, 5, 20, 6, -4, courB18L1_0x28_BMP}, + {15, 5, 20, 3, -4, courB18L1_0x29_BMP}, + {15, 10, 11, 2, 5, courB18L1_0x2A_BMP}, + {15, 12, 12, 1, 1, courB18L1_0x2B_BMP}, + {15, 5, 6, 4, -3, courB18L1_0x2C_BMP}, + {15, 11, 2, 2, 6, courB18L1_0x2D_BMP}, + {15, 3, 3, 5, 0, courB18L1_0x2E_BMP}, + {15, 11, 20, 2, -3, courB18L1_0x2F_BMP}, + {15, 10, 16, 2, 0, courB18L1_0x30_BMP}, + {15, 10, 16, 2, 0, courB18L1_0x31_BMP}, + {15, 11, 16, 1, 0, courB18L1_0x32_BMP}, + {15, 11, 16, 1, 0, courB18L1_0x33_BMP}, + {15, 11, 16, 1, 0, courB18L1_0x34_BMP}, + {15, 11, 16, 2, 0, courB18L1_0x35_BMP}, + {15, 10, 16, 2, 0, courB18L1_0x36_BMP}, + {15, 10, 16, 2, 0, courB18L1_0x37_BMP}, + {15, 10, 16, 2, 0, courB18L1_0x38_BMP}, + {15, 10, 16, 3, 0, courB18L1_0x39_BMP}, + {15, 3, 11, 5, 0, courB18L1_0x3A_BMP}, + {15, 5, 14, 3, -3, courB18L1_0x3B_BMP}, + {15, 13, 12, 1, 1, courB18L1_0x3C_BMP}, + {15, 12, 6, 1, 4, courB18L1_0x3D_BMP}, + {15, 13, 12, 1, 1, courB18L1_0x3E_BMP}, + {15, 9, 15, 3, 0, courB18L1_0x3F_BMP}, + {15, 10, 18, 2, -2, courB18L1_0x40_BMP}, + {15, 14, 15, 0, 0, courB18L1_0x41_BMP}, + {15, 13, 15, 1, 0, courB18L1_0x42_BMP}, + {15, 12, 15, 1, 0, courB18L1_0x43_BMP}, + {15, 14, 15, 0, 0, courB18L1_0x44_BMP}, + {15, 13, 15, 1, 0, courB18L1_0x45_BMP}, + {15, 13, 15, 1, 0, courB18L1_0x46_BMP}, + {15, 13, 15, 1, 0, courB18L1_0x47_BMP}, + {15, 14, 15, 0, 0, courB18L1_0x48_BMP}, + {15, 10, 15, 2, 0, courB18L1_0x49_BMP}, + {15, 13, 15, 1, 0, courB18L1_0x4A_BMP}, + {15, 14, 15, 0, 0, courB18L1_0x4B_BMP}, + {15, 12, 15, 1, 0, courB18L1_0x4C_BMP}, + {15, 14, 15, 0, 0, courB18L1_0x4D_BMP}, + {15, 13, 15, 1, 0, courB18L1_0x4E_BMP}, + {15, 13, 15, 1, 0, courB18L1_0x4F_BMP}, + {15, 13, 15, 1, 0, courB18L1_0x50_BMP}, + {15, 13, 18, 1, -3, courB18L1_0x51_BMP}, + {15, 14, 15, 0, 0, courB18L1_0x52_BMP}, + {15, 12, 15, 1, 0, courB18L1_0x53_BMP}, + {15, 12, 15, 1, 0, courB18L1_0x54_BMP}, + {15, 13, 15, 1, 0, courB18L1_0x55_BMP}, + {15, 14, 15, 0, 0, courB18L1_0x56_BMP}, + {15, 14, 15, 0, 0, courB18L1_0x57_BMP}, + {15, 14, 15, 0, 0, courB18L1_0x58_BMP}, + {15, 14, 15, 0, 0, courB18L1_0x59_BMP}, + {15, 11, 15, 2, 0, courB18L1_0x5A_BMP}, + {15, 5, 20, 6, -4, courB18L1_0x5B_BMP}, + {15, 11, 20, 2, -3, courB18L1_0x5C_BMP}, + {15, 5, 20, 3, -4, courB18L1_0x5D_BMP}, + {15, 8, 8, 3, 8, courB18L1_0x5E_BMP}, + {15, 15, 2, 0, -4, courB18L1_0x5F_BMP}, + {15, 5, 4, 4, 11, courB18L1_0x60_BMP}, + {15, 12, 11, 1, 0, courB18L1_0x61_BMP}, + {15, 13, 16, 1, 0, courB18L1_0x62_BMP}, + {15, 12, 11, 1, 0, courB18L1_0x63_BMP}, + {15, 13, 16, 1, 0, courB18L1_0x64_BMP}, + {15, 12, 11, 1, 0, courB18L1_0x65_BMP}, + {15, 11, 16, 2, 0, courB18L1_0x66_BMP}, + {15, 13, 16, 1, -5, courB18L1_0x67_BMP}, + {15, 14, 16, 0, 0, courB18L1_0x68_BMP}, + {15, 10, 16, 2, 0, courB18L1_0x69_BMP}, + {15, 8, 21, 2, -5, courB18L1_0x6A_BMP}, + {15, 13, 16, 1, 0, courB18L1_0x6B_BMP}, + {15, 10, 16, 2, 0, courB18L1_0x6C_BMP}, + {15, 16, 11, 0, 0, courB18L1_0x6D_BMP}, + {15, 14, 11, 0, 0, courB18L1_0x6E_BMP}, + {15, 12, 11, 1, 0, courB18L1_0x6F_BMP}, + {15, 13, 16, 0, -5, courB18L1_0x70_BMP}, + {15, 13, 16, 1, -5, courB18L1_0x71_BMP}, + {15, 12, 11, 1, 0, courB18L1_0x72_BMP}, + {15, 11, 11, 2, 0, courB18L1_0x73_BMP}, + {15, 11, 15, 1, 0, courB18L1_0x74_BMP}, + {15, 14, 11, 0, 0, courB18L1_0x75_BMP}, + {15, 14, 11, 0, 0, courB18L1_0x76_BMP}, + {15, 14, 11, 0, 0, courB18L1_0x77_BMP}, + {15, 12, 11, 1, 0, courB18L1_0x78_BMP}, + {15, 12, 16, 1, -5, courB18L1_0x79_BMP}, + {15, 10, 11, 2, 0, courB18L1_0x7A_BMP}, + {15, 7, 20, 4, -4, courB18L1_0x7B_BMP}, + {15, 2, 18, 6, -2, courB18L1_0x7C_BMP}, + {15, 7, 20, 3, -4, courB18L1_0x7D_BMP}, + {15, 12, 4, 1, 5, courB18L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {15, 1, 1, 0, 0, courB18L1_0xA0_BMP}, + {15, 4, 16, 4, -5, courB18L1_0xA1_BMP}, + {15, 9, 16, 2, 0, courB18L1_0xA2_BMP}, + {15, 12, 15, 1, 0, courB18L1_0xA3_BMP}, + {15, 10, 11, 2, 2, courB18L1_0xA4_BMP}, + {15, 12, 15, 1, 0, courB18L1_0xA5_BMP}, + {15, 2, 18, 6, -2, courB18L1_0xA6_BMP}, + {15, 12, 18, 1, -2, courB18L1_0xA7_BMP}, + {15, 7, 3, 3, 12, courB18L1_0xA8_BMP}, + {15, 14, 14, 0, 1, courB18L1_0xA9_BMP}, + {15, 8, 11, 3, 4, courB18L1_0xAA_BMP}, + {15, 13, 9, 1, 1, courB18L1_0xAB_BMP}, + {15, 12, 6, 1, 4, courB18L1_0xAC_BMP}, + {15, 11, 2, 2, 6, courB18L1_0xAD_BMP}, + {15, 14, 14, 0, 1, courB18L1_0xAE_BMP}, + {15, 7, 2, 3, 13, courB18L1_0xAF_BMP}, + {15, 8, 7, 3, 9, courB18L1_0xB0_BMP}, + {15, 12, 14, 1, 0, courB18L1_0xB1_BMP}, + {15, 7, 9, 4, 7, courB18L1_0xB2_BMP}, + {15, 7, 9, 4, 7, courB18L1_0xB3_BMP}, + {15, 6, 4, 4, 12, courB18L1_0xB4_BMP}, + {15, 14, 16, 0, -5, courB18L1_0xB5_BMP}, + {15, 12, 18, 1, -2, courB18L1_0xB6_BMP}, + {15, 3, 3, 5, 6, courB18L1_0xB7_BMP}, + {15, 5, 6, 4, -5, courB18L1_0xB8_BMP}, + {15, 8, 9, 3, 7, courB18L1_0xB9_BMP}, + {15, 8, 11, 3, 4, courB18L1_0xBA_BMP}, + {15, 13, 9, 1, 1, courB18L1_0xBB_BMP}, + {15, 16, 16, -1, 0, courB18L1_0xBC_BMP}, + {15, 16, 16, -1, 0, courB18L1_0xBD_BMP}, + {15, 15, 16, 0, 0, courB18L1_0xBE_BMP}, + {15, 9, 15, 2, -4, courB18L1_0xBF_BMP}, + {15, 14, 20, 0, 0, courB18L1_0xC0_BMP}, + {15, 14, 20, 0, 0, courB18L1_0xC1_BMP}, + {15, 14, 21, 0, 0, courB18L1_0xC2_BMP}, + {15, 14, 19, 0, 0, courB18L1_0xC3_BMP}, + {15, 14, 19, 0, 0, courB18L1_0xC4_BMP}, + {15, 14, 20, 0, 0, courB18L1_0xC5_BMP}, + {15, 15, 15, 0, 0, courB18L1_0xC6_BMP}, + {15, 12, 20, 1, -5, courB18L1_0xC7_BMP}, + {15, 13, 20, 1, 0, courB18L1_0xC8_BMP}, + {15, 13, 20, 1, 0, courB18L1_0xC9_BMP}, + {15, 13, 21, 1, 0, courB18L1_0xCA_BMP}, + {15, 13, 19, 1, 0, courB18L1_0xCB_BMP}, + {15, 10, 20, 2, 0, courB18L1_0xCC_BMP}, + {15, 10, 20, 2, 0, courB18L1_0xCD_BMP}, + {15, 10, 21, 2, 0, courB18L1_0xCE_BMP}, + {15, 10, 19, 2, 0, courB18L1_0xCF_BMP}, + {15, 14, 15, 0, 0, courB18L1_0xD0_BMP}, + {15, 13, 19, 1, 0, courB18L1_0xD1_BMP}, + {15, 13, 20, 1, 0, courB18L1_0xD2_BMP}, + {15, 13, 20, 1, 0, courB18L1_0xD3_BMP}, + {15, 13, 21, 1, 0, courB18L1_0xD4_BMP}, + {15, 13, 19, 1, 0, courB18L1_0xD5_BMP}, + {15, 13, 19, 1, 0, courB18L1_0xD6_BMP}, + {15, 12, 12, 1, 1, courB18L1_0xD7_BMP}, + {15, 13, 18, 1, -1, courB18L1_0xD8_BMP}, + {15, 13, 20, 1, 0, courB18L1_0xD9_BMP}, + {15, 13, 20, 1, 0, courB18L1_0xDA_BMP}, + {15, 13, 21, 1, 0, courB18L1_0xDB_BMP}, + {15, 13, 19, 1, 0, courB18L1_0xDC_BMP}, + {15, 14, 20, 0, 0, courB18L1_0xDD_BMP}, + {15, 13, 15, 1, 0, courB18L1_0xDE_BMP}, + {15, 12, 16, 1, 0, courB18L1_0xDF_BMP}, + {15, 12, 16, 1, 0, courB18L1_0xE0_BMP}, + {15, 12, 16, 1, 0, courB18L1_0xE1_BMP}, + {15, 12, 16, 1, 0, courB18L1_0xE2_BMP}, + {15, 12, 15, 1, 0, courB18L1_0xE3_BMP}, + {15, 12, 15, 1, 0, courB18L1_0xE4_BMP}, + {15, 12, 16, 1, 0, courB18L1_0xE5_BMP}, + {15, 14, 11, 0, 0, courB18L1_0xE6_BMP}, + {15, 11, 16, 1, -5, courB18L1_0xE7_BMP}, + {15, 12, 16, 1, 0, courB18L1_0xE8_BMP}, + {15, 12, 16, 1, 0, courB18L1_0xE9_BMP}, + {15, 12, 16, 1, 0, courB18L1_0xEA_BMP}, + {15, 12, 15, 1, 0, courB18L1_0xEB_BMP}, + {15, 10, 16, 2, 0, courB18L1_0xEC_BMP}, + {15, 10, 16, 2, 0, courB18L1_0xED_BMP}, + {15, 10, 16, 2, 0, courB18L1_0xEE_BMP}, + {15, 10, 15, 2, 0, courB18L1_0xEF_BMP}, + {15, 13, 17, 0, 0, courB18L1_0xF0_BMP}, + {15, 14, 15, 0, 0, courB18L1_0xF1_BMP}, + {15, 12, 16, 1, 0, courB18L1_0xF2_BMP}, + {15, 12, 16, 1, 0, courB18L1_0xF3_BMP}, + {15, 12, 16, 1, 0, courB18L1_0xF4_BMP}, + {15, 12, 15, 1, 0, courB18L1_0xF5_BMP}, + {15, 12, 15, 1, 0, courB18L1_0xF6_BMP}, + {15, 13, 12, 0, 1, courB18L1_0xF7_BMP}, + {15, 14, 14, 0, -2, courB18L1_0xF8_BMP}, + {15, 14, 16, 0, 0, courB18L1_0xF9_BMP}, + {15, 14, 16, 0, 0, courB18L1_0xFA_BMP}, + {15, 14, 16, 0, 0, courB18L1_0xFB_BMP}, + {15, 14, 15, 0, 0, courB18L1_0xFC_BMP}, + {15, 12, 21, 1, -5, courB18L1_0xFD_BMP}, + {15, 13, 21, 1, -5, courB18L1_0xFE_BMP}, + {15, 12, 20, 1, -5, courB18L1_0xFF_BMP} +}; + + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontCour18Bold_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontCour18Bold_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontCour18Bold_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontCour18Bold_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontCour18Bold_GetFontChar, + McuFontCour18Bold_FBBy, + McuFontCour18Bold_GetUnderlineBoxHeight(), + McuFontCour18Bold_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour18Bold_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour18Bold_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour18Bold_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour18Bold_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontCour18Bold. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour18Bold.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour18Bold.h new file mode 100644 index 0000000..3f423fa --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour18Bold.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour18Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour18Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 18 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour18Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour18Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour18Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour18Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour18Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontCour18Bold_Deinit(void); +** Init - void McuFontCour18Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour18Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour18Bold_module McuFontCour18Bold module documentation +** @{ +*/ + + +#ifndef __McuFontCour18Bold_H +#define __McuFontCour18Bold_H + +/* MODULE McuFontCour18Bold. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontCour18Boldconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontCour18Bold_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontCour18Bold_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontCour18Bold_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontCour18Bold_GetLineSpaceHeight() \ + 2 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontCour18Bold_GetUnderlineBoxHeight() \ + 8 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontCour18Bold_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontCour18Bold_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontCour18Bold. */ + +#endif +/* ifndef __McuFontCour18Bold_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour18Normal.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour18Normal.c new file mode 100644 index 0000000..b465da8 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour18Normal.c @@ -0,0 +1,3802 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour18Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour18Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 18 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour18Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour18Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour18Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour18Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour18Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontCour18Normal_Deinit(void); +** Init - void McuFontCour18Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour18Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour18Normal_module McuFontCour18Normal module documentation +** @{ +*/ + +/* MODULE McuFontCour18Normal. */ + +#include "McuFontCour18Normal.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontCour18Normal_FBBy 25 + +static const uint8_t courR18L1_0x00_BMP[] = { + 0xAA, 0xA8, + 0x00, 0x00, + 0x80, 0x08, + 0x00, 0x00, + 0x80, 0x08, + 0x00, 0x00, + 0x80, 0x08, + 0x00, 0x00, + 0x80, 0x08, + 0x00, 0x00, + 0x80, 0x08, + 0x00, 0x00, + 0xAA, 0xA8 +}; + +static const uint8_t courR18L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t courR18L1_0x21_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x80, + 0x80, + 0x80, + 0x00, + 0x00, + 0x00, + 0xC0, + 0xC0 +}; + +static const uint8_t courR18L1_0x22_BMP[] = { + 0xE7, + 0xE7, + 0xE7, + 0xE7, + 0x42, + 0x42, + 0x42 +}; + +static const uint8_t courR18L1_0x23_BMP[] = { + 0x09, 0x00, + 0x09, 0x00, + 0x09, 0x00, + 0x09, 0x00, + 0x09, 0x00, + 0x09, 0x00, + 0x7F, 0xC0, + 0x12, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0xFF, 0x80, + 0x12, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x12, 0x00 +}; + +static const uint8_t courR18L1_0x24_BMP[] = { + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x1E, 0x80, + 0x21, 0x80, + 0x40, 0x80, + 0x40, 0x00, + 0x40, 0x00, + 0x20, 0x00, + 0x1E, 0x00, + 0x01, 0x00, + 0x00, 0x80, + 0x00, 0x80, + 0x80, 0x80, + 0xC1, 0x00, + 0xBE, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00 +}; + +static const uint8_t courR18L1_0x25_BMP[] = { + 0x1C, 0x00, + 0x22, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x22, 0x00, + 0x1C, 0x70, + 0x03, 0x80, + 0x1C, 0x00, + 0xE1, 0xC0, + 0x02, 0x20, + 0x04, 0x10, + 0x04, 0x10, + 0x04, 0x10, + 0x02, 0x20, + 0x01, 0xC0 +}; + +static const uint8_t courR18L1_0x26_BMP[] = { + 0x1D, 0x00, + 0x26, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x10, 0x00, + 0x30, 0x00, + 0x49, 0x80, + 0x89, 0x00, + 0x86, 0x00, + 0x82, 0x00, + 0x83, 0x00, + 0x45, 0x00, + 0x38, 0xC0 +}; + +static const uint8_t courR18L1_0x27_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0x40, + 0x40 +}; + +static const uint8_t courR18L1_0x28_BMP[] = { + 0x10, + 0x20, + 0x20, + 0x40, + 0x40, + 0x40, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x40, + 0x40, + 0x40, + 0x20, + 0x20, + 0x10 +}; + +static const uint8_t courR18L1_0x29_BMP[] = { + 0x80, + 0x40, + 0x40, + 0x20, + 0x20, + 0x20, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x20, + 0x20, + 0x20, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t courR18L1_0x2A_BMP[] = { + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0xC9, 0x80, + 0x7F, 0x00, + 0x1C, 0x00, + 0x36, 0x00, + 0x63, 0x00, + 0xC1, 0x80 +}; + +static const uint8_t courR18L1_0x2B_BMP[] = { + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0xFF, 0xE0, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00 +}; + +static const uint8_t courR18L1_0x2C_BMP[] = { + 0x38, + 0x38, + 0x70, + 0x60, + 0xC0, + 0x80 +}; + +static const uint8_t courR18L1_0x2D_BMP[] = { + 0xFF, 0xC0 +}; + +static const uint8_t courR18L1_0x2E_BMP[] = { + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t courR18L1_0x2F_BMP[] = { + 0x00, 0x80, + 0x00, 0x80, + 0x01, 0x00, + 0x01, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x40, 0x00, + 0x40, 0x00, + 0x80, 0x00, + 0x80, 0x00 +}; + +static const uint8_t courR18L1_0x30_BMP[] = { + 0x1C, 0x00, + 0x63, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x41, 0x00, + 0x63, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t courR18L1_0x31_BMP[] = { + 0x18, 0x00, + 0xE8, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0xFF, 0x80 +}; + +static const uint8_t courR18L1_0x32_BMP[] = { + 0x1E, 0x00, + 0x61, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x00, 0x80, + 0x00, 0x80, + 0x01, 0x00, + 0x02, 0x00, + 0x04, 0x00, + 0x08, 0x00, + 0x10, 0x00, + 0x20, 0x00, + 0x40, 0x00, + 0x80, 0x40, + 0xFF, 0xC0 +}; + +static const uint8_t courR18L1_0x33_BMP[] = { + 0x3E, 0x00, + 0x41, 0x80, + 0x00, 0x80, + 0x00, 0x80, + 0x00, 0x80, + 0x01, 0x00, + 0x1E, 0x00, + 0x01, 0x80, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x40, + 0x80, 0x40, + 0x61, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t courR18L1_0x34_BMP[] = { + 0x03, 0x00, + 0x05, 0x00, + 0x09, 0x00, + 0x09, 0x00, + 0x11, 0x00, + 0x21, 0x00, + 0x21, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x81, 0x00, + 0xFF, 0xC0, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x0F, 0xC0 +}; + +static const uint8_t courR18L1_0x35_BMP[] = { + 0x7F, 0x80, + 0x40, 0x00, + 0x40, 0x00, + 0x40, 0x00, + 0x40, 0x00, + 0x5E, 0x00, + 0x61, 0x80, + 0x00, 0x80, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x80, + 0xC1, 0x80, + 0x3E, 0x00 +}; + +static const uint8_t courR18L1_0x36_BMP[] = { + 0x0F, 0x00, + 0x30, 0x00, + 0x60, 0x00, + 0x40, 0x00, + 0x80, 0x00, + 0x9E, 0x00, + 0xA1, 0x00, + 0xC0, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x40, 0x80, + 0x61, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t courR18L1_0x37_BMP[] = { + 0xFF, 0x80, + 0x80, 0x80, + 0x81, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00 +}; + +static const uint8_t courR18L1_0x38_BMP[] = { + 0x1E, 0x00, + 0x21, 0x00, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x21, 0x00, + 0x3F, 0x00, + 0x40, 0x80, + 0x80, 0x40, + 0x80, 0x40, + 0x80, 0x40, + 0x40, 0x80, + 0x61, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t courR18L1_0x39_BMP[] = { + 0x1C, 0x00, + 0x63, 0x00, + 0xC1, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x41, 0x80, + 0x62, 0x80, + 0x1C, 0x80, + 0x00, 0x80, + 0x00, 0x80, + 0x01, 0x00, + 0x01, 0x00, + 0x06, 0x00, + 0xF8, 0x00 +}; + +static const uint8_t courR18L1_0x3A_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t courR18L1_0x3B_BMP[] = { + 0x38, + 0x38, + 0x38, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x38, + 0x38, + 0x70, + 0x60, + 0xC0, + 0x80 +}; + +static const uint8_t courR18L1_0x3C_BMP[] = { + 0x00, 0x60, + 0x01, 0x80, + 0x06, 0x00, + 0x18, 0x00, + 0x60, 0x00, + 0xC0, 0x00, + 0x60, 0x00, + 0x18, 0x00, + 0x06, 0x00, + 0x01, 0x80, + 0x00, 0x60 +}; + +static const uint8_t courR18L1_0x3D_BMP[] = { + 0xFF, 0xF0, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xF0 +}; + +static const uint8_t courR18L1_0x3E_BMP[] = { + 0xC0, 0x00, + 0x30, 0x00, + 0x0C, 0x00, + 0x03, 0x00, + 0x00, 0xC0, + 0x00, 0x60, + 0x00, 0xC0, + 0x03, 0x00, + 0x0C, 0x00, + 0x30, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t courR18L1_0x3F_BMP[] = { + 0x7C, + 0x82, + 0x81, + 0x01, + 0x01, + 0x01, + 0x02, + 0x0C, + 0x10, + 0x10, + 0x00, + 0x00, + 0x18, + 0x18 +}; + +static const uint8_t courR18L1_0x40_BMP[] = { + 0x1E, 0x00, + 0x61, 0x00, + 0x40, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x83, 0x80, + 0x84, 0x80, + 0x88, 0x80, + 0x88, 0x80, + 0x88, 0x80, + 0x88, 0x80, + 0x84, 0x80, + 0x83, 0xC0, + 0x80, 0x00, + 0x80, 0x00, + 0x40, 0x00, + 0x61, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t courR18L1_0x41_BMP[] = { + 0x3F, 0x00, + 0x05, 0x00, + 0x08, 0x80, + 0x08, 0x80, + 0x08, 0x80, + 0x10, 0x40, + 0x10, 0x40, + 0x10, 0x40, + 0x3F, 0xE0, + 0x20, 0x20, + 0x20, 0x20, + 0x40, 0x10, + 0x40, 0x10, + 0xF0, 0x78 +}; + +static const uint8_t courR18L1_0x42_BMP[] = { + 0xFF, 0xC0, + 0x20, 0x20, + 0x20, 0x10, + 0x20, 0x10, + 0x20, 0x10, + 0x20, 0x20, + 0x3F, 0xC0, + 0x20, 0x20, + 0x20, 0x10, + 0x20, 0x10, + 0x20, 0x10, + 0x20, 0x10, + 0x20, 0x20, + 0xFF, 0xC0 +}; + +static const uint8_t courR18L1_0x43_BMP[] = { + 0x0F, 0x20, + 0x30, 0xA0, + 0x60, 0x60, + 0x40, 0x20, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x40, 0x20, + 0x60, 0x60, + 0x30, 0xC0, + 0x0F, 0x00 +}; + +static const uint8_t courR18L1_0x44_BMP[] = { + 0xFF, 0x80, + 0x40, 0x60, + 0x40, 0x20, + 0x40, 0x10, + 0x40, 0x10, + 0x40, 0x10, + 0x40, 0x10, + 0x40, 0x10, + 0x40, 0x10, + 0x40, 0x10, + 0x40, 0x10, + 0x40, 0x20, + 0x40, 0x60, + 0xFF, 0x80 +}; + +static const uint8_t courR18L1_0x45_BMP[] = { + 0xFF, 0xE0, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x22, 0x00, + 0x22, 0x00, + 0x3E, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x20, 0x10, + 0x20, 0x10, + 0x20, 0x10, + 0x20, 0x10, + 0xFF, 0xF0 +}; + +static const uint8_t courR18L1_0x46_BMP[] = { + 0xFF, 0xE0, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x22, 0x00, + 0x22, 0x00, + 0x3E, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0xFE, 0x00 +}; + +static const uint8_t courR18L1_0x47_BMP[] = { + 0x0F, 0x20, + 0x30, 0xA0, + 0x60, 0x60, + 0x40, 0x20, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x83, 0xF0, + 0x80, 0x20, + 0x40, 0x20, + 0x60, 0x20, + 0x30, 0x40, + 0x0F, 0x80 +}; + +static const uint8_t courR18L1_0x48_BMP[] = { + 0xF8, 0xF8, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x3F, 0xE0, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0xF8, 0xF8 +}; + +static const uint8_t courR18L1_0x49_BMP[] = { + 0xFF, 0x80, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0xFF, 0x80 +}; + +static const uint8_t courR18L1_0x4A_BMP[] = { + 0x1F, 0xF0, + 0x00, 0x80, + 0x00, 0x80, + 0x00, 0x80, + 0x00, 0x80, + 0x00, 0x80, + 0x00, 0x80, + 0x00, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x81, 0x00, + 0x43, 0x00, + 0x3C, 0x00 +}; + +static const uint8_t courR18L1_0x4B_BMP[] = { + 0xF8, 0xF0, + 0x20, 0x40, + 0x20, 0x80, + 0x21, 0x00, + 0x22, 0x00, + 0x24, 0x00, + 0x2C, 0x00, + 0x32, 0x00, + 0x21, 0x00, + 0x20, 0x80, + 0x20, 0x40, + 0x20, 0x40, + 0x20, 0x20, + 0xF8, 0x78 +}; + +static const uint8_t courR18L1_0x4C_BMP[] = { + 0xFE, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x10, + 0x10, 0x10, + 0x10, 0x10, + 0x10, 0x10, + 0xFF, 0xF0 +}; + +static const uint8_t courR18L1_0x4D_BMP[] = { + 0xE0, 0x38, + 0x60, 0x30, + 0x60, 0x30, + 0x50, 0x50, + 0x50, 0x50, + 0x48, 0x90, + 0x48, 0x90, + 0x45, 0x10, + 0x47, 0x10, + 0x40, 0x10, + 0x40, 0x10, + 0x40, 0x10, + 0x40, 0x10, + 0xF0, 0x78 +}; + +static const uint8_t courR18L1_0x4E_BMP[] = { + 0xF0, 0xFC, + 0x30, 0x10, + 0x28, 0x10, + 0x24, 0x10, + 0x24, 0x10, + 0x22, 0x10, + 0x22, 0x10, + 0x21, 0x10, + 0x21, 0x10, + 0x20, 0x90, + 0x20, 0x90, + 0x20, 0x50, + 0x20, 0x30, + 0xFC, 0x30 +}; + +static const uint8_t courR18L1_0x4F_BMP[] = { + 0x0F, 0x80, + 0x30, 0x60, + 0x60, 0x30, + 0x40, 0x10, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x40, 0x10, + 0x60, 0x30, + 0x30, 0x60, + 0x0F, 0x80 +}; + +static const uint8_t courR18L1_0x50_BMP[] = { + 0xFF, 0x80, + 0x20, 0x40, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x40, + 0x3F, 0x80, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0xFE, 0x00 +}; + +static const uint8_t courR18L1_0x51_BMP[] = { + 0x0F, 0x80, + 0x30, 0x60, + 0x60, 0x30, + 0x40, 0x10, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x40, 0x10, + 0x60, 0x30, + 0x30, 0x60, + 0x0F, 0x80, + 0x06, 0x30, + 0x1B, 0xC0 +}; + +static const uint8_t courR18L1_0x52_BMP[] = { + 0xFF, 0x80, + 0x20, 0x40, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x40, + 0x3F, 0x80, + 0x21, 0x00, + 0x20, 0x80, + 0x20, 0x40, + 0x20, 0x40, + 0x20, 0x20, + 0xF8, 0x38 +}; + +static const uint8_t courR18L1_0x53_BMP[] = { + 0x1E, 0x40, + 0x61, 0x40, + 0x80, 0xC0, + 0x80, 0x40, + 0x80, 0x00, + 0x60, 0x00, + 0x1E, 0x00, + 0x01, 0x80, + 0x00, 0x40, + 0x00, 0x40, + 0x80, 0x40, + 0xC0, 0x40, + 0xA0, 0x80, + 0x9F, 0x00 +}; + +static const uint8_t courR18L1_0x54_BMP[] = { + 0xFF, 0xE0, + 0x84, 0x20, + 0x84, 0x20, + 0x84, 0x20, + 0x84, 0x20, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x3F, 0x80 +}; + +static const uint8_t courR18L1_0x55_BMP[] = { + 0xF9, 0xF0, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x20, 0x40, + 0x1F, 0x80 +}; + +static const uint8_t courR18L1_0x56_BMP[] = { + 0xF8, 0xF8, + 0x40, 0x10, + 0x40, 0x10, + 0x20, 0x20, + 0x20, 0x20, + 0x10, 0x40, + 0x10, 0x40, + 0x10, 0x40, + 0x08, 0x80, + 0x08, 0x80, + 0x08, 0x80, + 0x05, 0x00, + 0x07, 0x00, + 0x02, 0x00 +}; + +static const uint8_t courR18L1_0x57_BMP[] = { + 0xF8, 0xF8, + 0x40, 0x10, + 0x40, 0x10, + 0x42, 0x10, + 0x42, 0x10, + 0x45, 0x10, + 0x45, 0x10, + 0x25, 0x20, + 0x28, 0xA0, + 0x28, 0xA0, + 0x28, 0xA0, + 0x30, 0x60, + 0x30, 0x60, + 0x30, 0x60 +}; + +static const uint8_t courR18L1_0x58_BMP[] = { + 0xF8, 0xF8, + 0x20, 0x20, + 0x10, 0x40, + 0x10, 0x40, + 0x08, 0x80, + 0x05, 0x00, + 0x02, 0x00, + 0x05, 0x00, + 0x08, 0x80, + 0x08, 0x80, + 0x10, 0x40, + 0x20, 0x20, + 0x20, 0x20, + 0xF8, 0xF8 +}; + +static const uint8_t courR18L1_0x59_BMP[] = { + 0xF0, 0x78, + 0x20, 0x20, + 0x10, 0x40, + 0x10, 0x40, + 0x08, 0x80, + 0x08, 0x80, + 0x05, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x1F, 0xC0 +}; + +static const uint8_t courR18L1_0x5A_BMP[] = { + 0xFF, 0xC0, + 0x80, 0x40, + 0x80, 0x80, + 0x81, 0x00, + 0x82, 0x00, + 0x02, 0x00, + 0x04, 0x00, + 0x08, 0x00, + 0x10, 0x00, + 0x10, 0x40, + 0x20, 0x40, + 0x40, 0x40, + 0x80, 0x40, + 0xFF, 0xC0 +}; + +static const uint8_t courR18L1_0x5B_BMP[] = { + 0xE0, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0xE0 +}; + +static const uint8_t courR18L1_0x5C_BMP[] = { + 0x80, 0x00, + 0x80, 0x00, + 0x40, 0x00, + 0x40, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x00, 0x80, + 0x00, 0x80 +}; + +static const uint8_t courR18L1_0x5D_BMP[] = { + 0xE0, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xE0 +}; + +static const uint8_t courR18L1_0x5E_BMP[] = { + 0x08, 0x00, + 0x1C, 0x00, + 0x22, 0x00, + 0x41, 0x00, + 0x80, 0x80 +}; + +static const uint8_t courR18L1_0x5F_BMP[] = { + 0xFF, 0xFE +}; + +static const uint8_t courR18L1_0x60_BMP[] = { + 0xC0, + 0x60, + 0x30, + 0x18 +}; + +static const uint8_t courR18L1_0x61_BMP[] = { + 0x3E, 0x00, + 0x41, 0x00, + 0x00, 0x80, + 0x00, 0x80, + 0x3E, 0x80, + 0x41, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x41, 0x80, + 0x3E, 0xE0 +}; + +static const uint8_t courR18L1_0x62_BMP[] = { + 0xE0, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x27, 0xC0, + 0x28, 0x30, + 0x30, 0x10, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x30, 0x10, + 0x28, 0x30, + 0xE7, 0xC0 +}; + +static const uint8_t courR18L1_0x63_BMP[] = { + 0x1F, 0x40, + 0x60, 0xC0, + 0x40, 0x40, + 0x80, 0x40, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x40, 0x60, + 0x60, 0xC0, + 0x1F, 0x00 +}; + +static const uint8_t courR18L1_0x64_BMP[] = { + 0x00, 0xE0, + 0x00, 0x20, + 0x00, 0x20, + 0x00, 0x20, + 0x1F, 0x20, + 0x60, 0xA0, + 0x40, 0x60, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x40, 0x60, + 0x60, 0xA0, + 0x1F, 0x38 +}; + +static const uint8_t courR18L1_0x65_BMP[] = { + 0x1F, 0x00, + 0x60, 0xC0, + 0x40, 0x40, + 0x80, 0x20, + 0x80, 0x20, + 0xFF, 0xE0, + 0x80, 0x00, + 0x80, 0x00, + 0x40, 0x00, + 0x60, 0x60, + 0x1F, 0x80 +}; + +static const uint8_t courR18L1_0x66_BMP[] = { + 0x0F, 0x80, + 0x18, 0x40, + 0x10, 0x00, + 0x10, 0x00, + 0xFF, 0x80, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0xFF, 0x80 +}; + +static const uint8_t courR18L1_0x67_BMP[] = { + 0x1F, 0x38, + 0x60, 0xA0, + 0x40, 0x60, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x40, 0x60, + 0x60, 0xA0, + 0x1F, 0x20, + 0x00, 0x20, + 0x00, 0x20, + 0x00, 0x40, + 0x00, 0xC0, + 0x3F, 0x00 +}; + +static const uint8_t courR18L1_0x68_BMP[] = { + 0xE0, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x27, 0x80, + 0x28, 0x40, + 0x30, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0xF8, 0xF8 +}; + +static const uint8_t courR18L1_0x69_BMP[] = { + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x78, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0xFF, 0x80 +}; + +static const uint8_t courR18L1_0x6A_BMP[] = { + 0x02, + 0x02, + 0x02, + 0x00, + 0x00, + 0xFF, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x01, + 0x02, + 0x06, + 0xF8 +}; + +static const uint8_t courR18L1_0x6B_BMP[] = { + 0xE0, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x23, 0xC0, + 0x21, 0x00, + 0x22, 0x00, + 0x24, 0x00, + 0x28, 0x00, + 0x38, 0x00, + 0x24, 0x00, + 0x22, 0x00, + 0x21, 0x00, + 0x20, 0x80, + 0xE1, 0xE0 +}; + +static const uint8_t courR18L1_0x6C_BMP[] = { + 0x7C, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0xFF, 0xE0 +}; + +static const uint8_t courR18L1_0x6D_BMP[] = { + 0xEE, 0x70, + 0x31, 0x88, + 0x21, 0x08, + 0x21, 0x08, + 0x21, 0x08, + 0x21, 0x08, + 0x21, 0x08, + 0x21, 0x08, + 0x21, 0x08, + 0x21, 0x08, + 0xF9, 0x8C +}; + +static const uint8_t courR18L1_0x6E_BMP[] = { + 0xE7, 0x80, + 0x28, 0x40, + 0x30, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0xF8, 0xF8 +}; + +static const uint8_t courR18L1_0x6F_BMP[] = { + 0x1F, 0x00, + 0x60, 0xC0, + 0x40, 0x40, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x40, 0x40, + 0x60, 0xC0, + 0x1F, 0x00 +}; + +static const uint8_t courR18L1_0x70_BMP[] = { + 0xE7, 0xC0, + 0x28, 0x30, + 0x30, 0x10, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x30, 0x10, + 0x28, 0x30, + 0x27, 0xC0, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0xFC, 0x00 +}; + +static const uint8_t courR18L1_0x71_BMP[] = { + 0x1F, 0x38, + 0x60, 0xA0, + 0x40, 0x60, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x40, 0x60, + 0x60, 0xA0, + 0x1F, 0x20, + 0x00, 0x20, + 0x00, 0x20, + 0x00, 0x20, + 0x00, 0x20, + 0x01, 0xF8 +}; + +static const uint8_t courR18L1_0x72_BMP[] = { + 0x71, 0xC0, + 0x16, 0x20, + 0x18, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0xFF, 0x80 +}; + +static const uint8_t courR18L1_0x73_BMP[] = { + 0x3E, 0x80, + 0x41, 0x80, + 0x40, 0x80, + 0x40, 0x00, + 0x38, 0x00, + 0x07, 0x00, + 0x00, 0x80, + 0x00, 0x80, + 0x80, 0x80, + 0xC1, 0x00, + 0xBE, 0x00 +}; + +static const uint8_t courR18L1_0x74_BMP[] = { + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0xFF, 0x80, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x10, 0xC0, + 0x0F, 0x00 +}; + +static const uint8_t courR18L1_0x75_BMP[] = { + 0xE0, 0xE0, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x60, + 0x10, 0xA0, + 0x0F, 0x30 +}; + +static const uint8_t courR18L1_0x76_BMP[] = { + 0xF8, 0xF8, + 0x20, 0x20, + 0x20, 0x20, + 0x10, 0x40, + 0x10, 0x40, + 0x10, 0x40, + 0x08, 0x80, + 0x08, 0x80, + 0x05, 0x00, + 0x07, 0x00, + 0x02, 0x00 +}; + +static const uint8_t courR18L1_0x77_BMP[] = { + 0xF0, 0x78, + 0x40, 0x10, + 0x40, 0x10, + 0x42, 0x10, + 0x22, 0x20, + 0x25, 0x20, + 0x25, 0x20, + 0x25, 0x20, + 0x15, 0x40, + 0x18, 0xC0, + 0x18, 0xC0 +}; + +static const uint8_t courR18L1_0x78_BMP[] = { + 0xF1, 0xE0, + 0x40, 0x40, + 0x20, 0x80, + 0x11, 0x00, + 0x0A, 0x00, + 0x04, 0x00, + 0x0A, 0x00, + 0x11, 0x00, + 0x20, 0x80, + 0x40, 0x40, + 0xF1, 0xE0 +}; + +static const uint8_t courR18L1_0x79_BMP[] = { + 0xF0, 0xF0, + 0x40, 0x20, + 0x40, 0x20, + 0x20, 0x40, + 0x20, 0x40, + 0x20, 0x80, + 0x10, 0x80, + 0x11, 0x00, + 0x09, 0x00, + 0x0A, 0x00, + 0x06, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0xFE, 0x00 +}; + +static const uint8_t courR18L1_0x7A_BMP[] = { + 0xFF, 0x80, + 0x80, 0x80, + 0x81, 0x00, + 0x02, 0x00, + 0x04, 0x00, + 0x08, 0x00, + 0x10, 0x00, + 0x20, 0x00, + 0x40, 0x80, + 0x80, 0x80, + 0xFF, 0x80 +}; + +static const uint8_t courR18L1_0x7B_BMP[] = { + 0x18, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xC0, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x18 +}; + +static const uint8_t courR18L1_0x7C_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t courR18L1_0x7D_BMP[] = { + 0xC0, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x18, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xC0 +}; + +static const uint8_t courR18L1_0x7E_BMP[] = { + 0x3C, 0x30, + 0x66, 0x60, + 0xC3, 0xC0 +}; + +static const uint8_t courR18L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t courR18L1_0xA1_BMP[] = { + 0xC0, + 0xC0, + 0x00, + 0x00, + 0x00, + 0x80, + 0x80, + 0x80, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t courR18L1_0xA2_BMP[] = { + 0x08, + 0x08, + 0x08, + 0x08, + 0x1D, + 0x63, + 0x41, + 0x80, + 0x80, + 0x80, + 0x40, + 0x63, + 0x1C, + 0x08, + 0x08, + 0x08 +}; + +static const uint8_t courR18L1_0xA3_BMP[] = { + 0x0E, 0x00, + 0x11, 0x80, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0xFE, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x20, 0x40, + 0x40, 0x40, + 0xFF, 0x80 +}; + +static const uint8_t courR18L1_0xA4_BMP[] = { + 0x80, 0x40, + 0x5E, 0x80, + 0x21, 0x00, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x21, 0x00, + 0x5E, 0x80, + 0x80, 0x40 +}; + +static const uint8_t courR18L1_0xA5_BMP[] = { + 0xF1, 0xE0, + 0x40, 0x40, + 0x20, 0x80, + 0x20, 0x80, + 0x11, 0x00, + 0x11, 0x00, + 0x0A, 0x00, + 0x7F, 0xC0, + 0x04, 0x00, + 0x04, 0x00, + 0x7F, 0xC0, + 0x04, 0x00, + 0x04, 0x00, + 0x3F, 0x80 +}; + +static const uint8_t courR18L1_0xA6_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x00, + 0x00, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t courR18L1_0xA7_BMP[] = { + 0x0F, 0xC0, + 0x10, 0x40, + 0x20, 0x40, + 0x20, 0x40, + 0x20, 0x00, + 0x70, 0x00, + 0x8C, 0x00, + 0x82, 0x00, + 0x41, 0x00, + 0x20, 0x80, + 0x10, 0x40, + 0x0C, 0x40, + 0x03, 0x80, + 0x01, 0x00, + 0x81, 0x00, + 0x81, 0x00, + 0x82, 0x00, + 0xFC, 0x00 +}; + +static const uint8_t courR18L1_0xA8_BMP[] = { + 0xC6, + 0xC6 +}; + +static const uint8_t courR18L1_0xA9_BMP[] = { + 0x0F, 0x80, + 0x30, 0x60, + 0x40, 0x10, + 0x46, 0x90, + 0x89, 0x88, + 0x90, 0x88, + 0x90, 0x08, + 0x90, 0x08, + 0x88, 0x88, + 0x47, 0x10, + 0x40, 0x10, + 0x30, 0x60, + 0x0F, 0x80 +}; + +static const uint8_t courR18L1_0xAA_BMP[] = { + 0x78, + 0x84, + 0x3C, + 0x44, + 0x84, + 0x8C, + 0x76, + 0x00, + 0xFE +}; + +static const uint8_t courR18L1_0xAB_BMP[] = { + 0x06, 0x30, + 0x0C, 0x60, + 0x18, 0xC0, + 0x31, 0x80, + 0x63, 0x00, + 0xC6, 0x00, + 0x63, 0x00, + 0x31, 0x80, + 0x18, 0xC0, + 0x0C, 0x60, + 0x06, 0x30 +}; + +static const uint8_t courR18L1_0xAC_BMP[] = { + 0xFF, 0xE0, + 0x00, 0x20, + 0x00, 0x20, + 0x00, 0x20 +}; + +static const uint8_t courR18L1_0xAD_BMP[] = { + 0xFF, 0xC0 +}; + +static const uint8_t courR18L1_0xAE_BMP[] = { + 0x0F, 0x80, + 0x30, 0x60, + 0x40, 0x10, + 0x4F, 0x10, + 0x88, 0x88, + 0x88, 0x88, + 0x8F, 0x08, + 0x89, 0x08, + 0x88, 0x88, + 0x48, 0x90, + 0x40, 0x10, + 0x30, 0x60, + 0x0F, 0x80 +}; + +static const uint8_t courR18L1_0xAF_BMP[] = { + 0xFE +}; + +static const uint8_t courR18L1_0xB0_BMP[] = { + 0x38, + 0x44, + 0x82, + 0x82, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t courR18L1_0xB1_BMP[] = { + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0xFF, 0xE0, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x00, 0x00, + 0xFF, 0xE0 +}; + +static const uint8_t courR18L1_0xB2_BMP[] = { + 0x38, + 0x44, + 0x84, + 0x04, + 0x08, + 0x10, + 0x20, + 0x44, + 0xFC +}; + +static const uint8_t courR18L1_0xB3_BMP[] = { + 0x78, + 0x84, + 0x04, + 0x08, + 0x38, + 0x04, + 0x04, + 0x84, + 0x78 +}; + +static const uint8_t courR18L1_0xB4_BMP[] = { + 0x18, + 0x30, + 0x60, + 0xC0 +}; + +static const uint8_t courR18L1_0xB5_BMP[] = { + 0xE0, 0xE0, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x60, + 0x30, 0xA0, + 0x2F, 0x30, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00 +}; + +static const uint8_t courR18L1_0xB6_BMP[] = { + 0x1F, 0xE0, + 0x64, 0x80, + 0xC4, 0x80, + 0xC4, 0x80, + 0xC4, 0x80, + 0xC4, 0x80, + 0xC4, 0x80, + 0x64, 0x80, + 0x1C, 0x80, + 0x04, 0x80, + 0x04, 0x80, + 0x04, 0x80, + 0x04, 0x80, + 0x04, 0x80, + 0x04, 0x80, + 0x04, 0x80, + 0x04, 0x80, + 0x3C, 0xE0 +}; + +static const uint8_t courR18L1_0xB7_BMP[] = { + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t courR18L1_0xB8_BMP[] = { + 0x20, + 0x20, + 0x10, + 0x90, + 0x60 +}; + +static const uint8_t courR18L1_0xB9_BMP[] = { + 0x30, + 0xD0, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR18L1_0xBA_BMP[] = { + 0x38, + 0x44, + 0x82, + 0x82, + 0x82, + 0x44, + 0x38, + 0x00, + 0xFE +}; + +static const uint8_t courR18L1_0xBB_BMP[] = { + 0xC6, 0x00, + 0x63, 0x00, + 0x31, 0x80, + 0x18, 0xC0, + 0x0C, 0x60, + 0x06, 0x30, + 0x0C, 0x60, + 0x18, 0xC0, + 0x31, 0x80, + 0x63, 0x00, + 0xC6, 0x00 +}; + +static const uint8_t courR18L1_0xBC_BMP[] = { + 0x30, 0x00, + 0xD0, 0x00, + 0x10, 0x08, + 0x10, 0x10, + 0x10, 0x20, + 0x10, 0x20, + 0x10, 0x40, + 0x10, 0x98, + 0xFF, 0x28, + 0x02, 0x48, + 0x04, 0x48, + 0x04, 0x88, + 0x09, 0x08, + 0x11, 0xFC, + 0x00, 0x08, + 0x00, 0x1C +}; + +static const uint8_t courR18L1_0xBD_BMP[] = { + 0x30, 0x00, + 0xD0, 0x00, + 0x10, 0x08, + 0x10, 0x10, + 0x10, 0x20, + 0x10, 0x20, + 0x10, 0x40, + 0x10, 0xB8, + 0xFF, 0x44, + 0x02, 0x84, + 0x04, 0x04, + 0x04, 0x08, + 0x08, 0x10, + 0x10, 0x20, + 0x00, 0x44, + 0x00, 0xFC +}; + +static const uint8_t courR18L1_0xBE_BMP[] = { + 0x78, 0x00, + 0x84, 0x00, + 0x04, 0x08, + 0x08, 0x10, + 0x38, 0x20, + 0x04, 0x20, + 0x04, 0x40, + 0x84, 0x98, + 0x79, 0x28, + 0x02, 0x48, + 0x04, 0x48, + 0x04, 0x88, + 0x09, 0x08, + 0x11, 0xFC, + 0x00, 0x08, + 0x00, 0x1C +}; + +static const uint8_t courR18L1_0xBF_BMP[] = { + 0x18, + 0x18, + 0x00, + 0x00, + 0x08, + 0x08, + 0x30, + 0x40, + 0x80, + 0x80, + 0x80, + 0x81, + 0x41, + 0x3E +}; + +static const uint8_t courR18L1_0xC0_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x03, 0x00, + 0x00, 0x00, + 0x3F, 0x00, + 0x05, 0x00, + 0x08, 0x80, + 0x08, 0x80, + 0x08, 0x80, + 0x10, 0x40, + 0x10, 0x40, + 0x10, 0x40, + 0x3F, 0xE0, + 0x20, 0x20, + 0x20, 0x20, + 0x40, 0x10, + 0x40, 0x10, + 0xF0, 0x78 +}; + +static const uint8_t courR18L1_0xC1_BMP[] = { + 0x00, 0xC0, + 0x01, 0x80, + 0x03, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0x3F, 0x00, + 0x05, 0x00, + 0x08, 0x80, + 0x08, 0x80, + 0x08, 0x80, + 0x10, 0x40, + 0x10, 0x40, + 0x10, 0x40, + 0x3F, 0xE0, + 0x20, 0x20, + 0x20, 0x20, + 0x40, 0x10, + 0x40, 0x10, + 0xF0, 0x78 +}; + +static const uint8_t courR18L1_0xC2_BMP[] = { + 0x06, 0x00, + 0x0F, 0x00, + 0x19, 0x80, + 0x30, 0xC0, + 0x00, 0x00, + 0x3F, 0x00, + 0x05, 0x00, + 0x08, 0x80, + 0x08, 0x80, + 0x08, 0x80, + 0x10, 0x40, + 0x10, 0x40, + 0x10, 0x40, + 0x3F, 0xE0, + 0x20, 0x20, + 0x20, 0x20, + 0x40, 0x10, + 0x40, 0x10, + 0xF0, 0x78 +}; + +static const uint8_t courR18L1_0xC3_BMP[] = { + 0x1C, 0x40, + 0x36, 0xC0, + 0x23, 0x80, + 0x00, 0x00, + 0x3F, 0x00, + 0x05, 0x00, + 0x08, 0x80, + 0x08, 0x80, + 0x08, 0x80, + 0x10, 0x40, + 0x10, 0x40, + 0x10, 0x40, + 0x3F, 0xE0, + 0x20, 0x20, + 0x20, 0x20, + 0x40, 0x10, + 0x40, 0x10, + 0xF0, 0x78 +}; + +static const uint8_t courR18L1_0xC4_BMP[] = { + 0x18, 0xC0, + 0x18, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0x3F, 0x00, + 0x05, 0x00, + 0x08, 0x80, + 0x08, 0x80, + 0x08, 0x80, + 0x10, 0x40, + 0x10, 0x40, + 0x10, 0x40, + 0x3F, 0xE0, + 0x20, 0x20, + 0x20, 0x20, + 0x40, 0x10, + 0x40, 0x10, + 0xF0, 0x78 +}; + +static const uint8_t courR18L1_0xC5_BMP[] = { + 0x07, 0x00, + 0x08, 0x80, + 0x08, 0x80, + 0x08, 0x80, + 0x07, 0x00, + 0x3F, 0x00, + 0x05, 0x00, + 0x08, 0x80, + 0x08, 0x80, + 0x08, 0x80, + 0x10, 0x40, + 0x10, 0x40, + 0x10, 0x40, + 0x3F, 0xE0, + 0x20, 0x20, + 0x20, 0x20, + 0x40, 0x10, + 0x40, 0x10, + 0xF0, 0x78 +}; + +static const uint8_t courR18L1_0xC6_BMP[] = { + 0x0F, 0xFE, + 0x02, 0x82, + 0x04, 0x82, + 0x04, 0x82, + 0x04, 0x88, + 0x08, 0x88, + 0x08, 0xF8, + 0x08, 0x88, + 0x1F, 0x88, + 0x10, 0x82, + 0x10, 0x82, + 0x20, 0x82, + 0x20, 0x82, + 0xF3, 0xFE +}; + +static const uint8_t courR18L1_0xC7_BMP[] = { + 0x0F, 0x20, + 0x30, 0xE0, + 0x60, 0x60, + 0x40, 0x20, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x40, 0x20, + 0x60, 0x60, + 0x30, 0xC0, + 0x0F, 0x00, + 0x04, 0x00, + 0x02, 0x00, + 0x12, 0x00, + 0x0C, 0x00 +}; + +static const uint8_t courR18L1_0xC8_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x03, 0x00, + 0x00, 0x00, + 0xFF, 0xE0, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x22, 0x00, + 0x22, 0x00, + 0x3E, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x20, 0x10, + 0x20, 0x10, + 0x20, 0x10, + 0x20, 0x10, + 0xFF, 0xF0 +}; + +static const uint8_t courR18L1_0xC9_BMP[] = { + 0x00, 0xC0, + 0x01, 0x80, + 0x03, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0xFF, 0xE0, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x22, 0x00, + 0x22, 0x00, + 0x3E, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x20, 0x10, + 0x20, 0x10, + 0x20, 0x10, + 0x20, 0x10, + 0xFF, 0xF0 +}; + +static const uint8_t courR18L1_0xCA_BMP[] = { + 0x06, 0x00, + 0x0F, 0x00, + 0x19, 0x80, + 0x30, 0xC0, + 0x00, 0x00, + 0xFF, 0xE0, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x22, 0x00, + 0x22, 0x00, + 0x3E, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x20, 0x10, + 0x20, 0x10, + 0x20, 0x10, + 0x20, 0x10, + 0xFF, 0xF0 +}; + +static const uint8_t courR18L1_0xCB_BMP[] = { + 0x19, 0x80, + 0x19, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xE0, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x22, 0x00, + 0x22, 0x00, + 0x3E, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x20, 0x10, + 0x20, 0x10, + 0x20, 0x10, + 0x20, 0x10, + 0xFF, 0xF0 +}; + +static const uint8_t courR18L1_0xCC_BMP[] = { + 0x60, 0x00, + 0x30, 0x00, + 0x18, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xFF, 0x80, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0xFF, 0x80 +}; + +static const uint8_t courR18L1_0xCD_BMP[] = { + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x18, 0x00, + 0x00, 0x00, + 0xFF, 0x80, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0xFF, 0x80 +}; + +static const uint8_t courR18L1_0xCE_BMP[] = { + 0x18, 0x00, + 0x3C, 0x00, + 0x66, 0x00, + 0xC3, 0x00, + 0x00, 0x00, + 0xFF, 0x80, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0xFF, 0x80 +}; + +static const uint8_t courR18L1_0xCF_BMP[] = { + 0x63, 0x00, + 0x63, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0x80, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0xFF, 0x80 +}; + +static const uint8_t courR18L1_0xD0_BMP[] = { + 0x7F, 0xC0, + 0x20, 0x30, + 0x20, 0x10, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0xFC, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x10, + 0x20, 0x30, + 0x7F, 0xC0 +}; + +static const uint8_t courR18L1_0xD1_BMP[] = { + 0x0E, 0x20, + 0x1B, 0x60, + 0x11, 0xC0, + 0x00, 0x00, + 0xF0, 0xFC, + 0x30, 0x10, + 0x28, 0x10, + 0x24, 0x10, + 0x24, 0x10, + 0x22, 0x10, + 0x22, 0x10, + 0x21, 0x10, + 0x21, 0x10, + 0x20, 0x90, + 0x20, 0x90, + 0x20, 0x50, + 0x20, 0x30, + 0xFC, 0x30 +}; + +static const uint8_t courR18L1_0xD2_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x03, 0x00, + 0x00, 0x00, + 0x0F, 0x80, + 0x30, 0x60, + 0x60, 0x30, + 0x40, 0x10, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x40, 0x10, + 0x60, 0x30, + 0x30, 0x60, + 0x0F, 0x80 +}; + +static const uint8_t courR18L1_0xD3_BMP[] = { + 0x00, 0x60, + 0x00, 0xC0, + 0x01, 0x80, + 0x03, 0x00, + 0x00, 0x00, + 0x0F, 0x80, + 0x30, 0x60, + 0x60, 0x30, + 0x40, 0x10, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x40, 0x10, + 0x60, 0x30, + 0x30, 0x60, + 0x0F, 0x80 +}; + +static const uint8_t courR18L1_0xD4_BMP[] = { + 0x03, 0x00, + 0x07, 0x80, + 0x0C, 0xC0, + 0x18, 0x60, + 0x00, 0x00, + 0x0F, 0x80, + 0x30, 0x60, + 0x60, 0x30, + 0x40, 0x10, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x40, 0x10, + 0x60, 0x30, + 0x30, 0x60, + 0x0F, 0x80 +}; + +static const uint8_t courR18L1_0xD5_BMP[] = { + 0x0E, 0x20, + 0x1B, 0x60, + 0x11, 0xC0, + 0x00, 0x00, + 0x0F, 0x80, + 0x30, 0x60, + 0x60, 0x30, + 0x40, 0x10, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x40, 0x10, + 0x60, 0x30, + 0x30, 0x60, + 0x0F, 0x80 +}; + +static const uint8_t courR18L1_0xD6_BMP[] = { + 0x18, 0xC0, + 0x18, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0x80, + 0x30, 0x60, + 0x60, 0x30, + 0x40, 0x10, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x80, 0x08, + 0x40, 0x10, + 0x60, 0x30, + 0x30, 0x60, + 0x0F, 0x80 +}; + +static const uint8_t courR18L1_0xD7_BMP[] = { + 0x80, 0x20, + 0x40, 0x40, + 0x20, 0x80, + 0x11, 0x00, + 0x0A, 0x00, + 0x04, 0x00, + 0x0A, 0x00, + 0x11, 0x00, + 0x20, 0x80, + 0x40, 0x40, + 0x80, 0x20 +}; + +static const uint8_t courR18L1_0xD8_BMP[] = { + 0x00, 0x04, + 0x07, 0xC8, + 0x18, 0x30, + 0x30, 0x30, + 0x20, 0x48, + 0x40, 0x88, + 0x40, 0x88, + 0x41, 0x08, + 0x42, 0x08, + 0x44, 0x08, + 0x48, 0x08, + 0x30, 0x10, + 0x30, 0x30, + 0x58, 0x60, + 0x87, 0x80 +}; + +static const uint8_t courR18L1_0xD9_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x03, 0x00, + 0x00, 0x00, + 0xF9, 0xF0, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x20, 0x40, + 0x1F, 0x80 +}; + +static const uint8_t courR18L1_0xDA_BMP[] = { + 0x00, 0xC0, + 0x01, 0x80, + 0x03, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0xF9, 0xF0, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x20, 0x40, + 0x1F, 0x80 +}; + +static const uint8_t courR18L1_0xDB_BMP[] = { + 0x06, 0x00, + 0x0F, 0x00, + 0x19, 0x80, + 0x30, 0xC0, + 0x00, 0x00, + 0xF9, 0xF0, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x20, 0x40, + 0x1F, 0x80 +}; + +static const uint8_t courR18L1_0xDC_BMP[] = { + 0x19, 0x80, + 0x19, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0xF9, 0xF0, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x20, 0x40, + 0x1F, 0x80 +}; + +static const uint8_t courR18L1_0xDD_BMP[] = { + 0x00, 0xC0, + 0x01, 0x80, + 0x03, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0xF0, 0x78, + 0x20, 0x20, + 0x10, 0x40, + 0x10, 0x40, + 0x08, 0x80, + 0x08, 0x80, + 0x05, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x1F, 0xC0 +}; + +static const uint8_t courR18L1_0xDE_BMP[] = { + 0xF8, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x3F, 0x80, + 0x20, 0x40, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x40, + 0x3F, 0x80, + 0x20, 0x00, + 0x20, 0x00, + 0xF8, 0x00 +}; + +static const uint8_t courR18L1_0xDF_BMP[] = { + 0x0E, 0x00, + 0x11, 0x00, + 0x20, 0x80, + 0x20, 0x80, + 0x20, 0x80, + 0x20, 0x80, + 0x21, 0x00, + 0x27, 0x00, + 0x20, 0xC0, + 0x20, 0x40, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x24, 0x20, + 0x24, 0x40, + 0xF3, 0x80 +}; + +static const uint8_t courR18L1_0xE0_BMP[] = { + 0x30, 0x00, + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x61, 0x00, + 0x00, 0x80, + 0x00, 0x80, + 0x00, 0x80, + 0x3F, 0x80, + 0x40, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x81, 0x80, + 0x7E, 0xE0 +}; + +static const uint8_t courR18L1_0xE1_BMP[] = { + 0x01, 0x80, + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x61, 0x00, + 0x00, 0x80, + 0x00, 0x80, + 0x00, 0x80, + 0x3F, 0x80, + 0x40, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x81, 0x80, + 0x7E, 0xE0 +}; + +static const uint8_t courR18L1_0xE2_BMP[] = { + 0x0C, 0x00, + 0x1E, 0x00, + 0x33, 0x00, + 0x61, 0x80, + 0x00, 0x00, + 0x1E, 0x00, + 0x61, 0x00, + 0x00, 0x80, + 0x00, 0x80, + 0x00, 0x80, + 0x3F, 0x80, + 0x40, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x81, 0x80, + 0x7E, 0xE0 +}; + +static const uint8_t courR18L1_0xE3_BMP[] = { + 0x38, 0x80, + 0x6D, 0x80, + 0x47, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x61, 0x00, + 0x00, 0x80, + 0x00, 0x80, + 0x00, 0x80, + 0x3F, 0x80, + 0x40, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x81, 0x80, + 0x7E, 0xE0 +}; + +static const uint8_t courR18L1_0xE4_BMP[] = { + 0x31, 0x80, + 0x31, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x61, 0x00, + 0x00, 0x80, + 0x00, 0x80, + 0x00, 0x80, + 0x3F, 0x80, + 0x40, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x81, 0x80, + 0x7E, 0xE0 +}; + +static const uint8_t courR18L1_0xE5_BMP[] = { + 0x0E, 0x00, + 0x11, 0x00, + 0x11, 0x00, + 0x11, 0x00, + 0x0E, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x61, 0x00, + 0x00, 0x80, + 0x00, 0x80, + 0x00, 0x80, + 0x3F, 0x80, + 0x40, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x81, 0x80, + 0x7E, 0xE0 +}; + +static const uint8_t courR18L1_0xE6_BMP[] = { + 0x1C, 0x70, + 0x62, 0x8C, + 0x41, 0x04, + 0x01, 0x02, + 0x01, 0x02, + 0x3F, 0xFE, + 0x41, 0x00, + 0x81, 0x00, + 0x81, 0x02, + 0x82, 0x84, + 0x7C, 0x78 +}; + +static const uint8_t courR18L1_0xE7_BMP[] = { + 0x1F, 0x40, + 0x60, 0xC0, + 0x40, 0x40, + 0x80, 0x40, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x40, 0x60, + 0x60, 0xC0, + 0x1F, 0x00, + 0x04, 0x00, + 0x02, 0x00, + 0x12, 0x00, + 0x0C, 0x00 +}; + +static const uint8_t courR18L1_0xE8_BMP[] = { + 0x30, 0x00, + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0x1F, 0x00, + 0x60, 0xC0, + 0x40, 0x40, + 0x80, 0x20, + 0x80, 0x20, + 0xFF, 0xE0, + 0x80, 0x00, + 0x80, 0x00, + 0x40, 0x00, + 0x60, 0x60, + 0x1F, 0x80 +}; + +static const uint8_t courR18L1_0xE9_BMP[] = { + 0x01, 0x80, + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x1F, 0x00, + 0x60, 0xC0, + 0x40, 0x40, + 0x80, 0x20, + 0x80, 0x20, + 0xFF, 0xE0, + 0x80, 0x00, + 0x80, 0x00, + 0x40, 0x00, + 0x60, 0x60, + 0x1F, 0x80 +}; + +static const uint8_t courR18L1_0xEA_BMP[] = { + 0x0C, 0x00, + 0x1E, 0x00, + 0x33, 0x00, + 0x61, 0x80, + 0x00, 0x00, + 0x1F, 0x00, + 0x60, 0xC0, + 0x40, 0x40, + 0x80, 0x20, + 0x80, 0x20, + 0xFF, 0xE0, + 0x80, 0x00, + 0x80, 0x00, + 0x40, 0x00, + 0x60, 0x60, + 0x1F, 0x80 +}; + +static const uint8_t courR18L1_0xEB_BMP[] = { + 0x31, 0x80, + 0x31, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x1F, 0x00, + 0x60, 0xC0, + 0x40, 0x40, + 0x80, 0x20, + 0x80, 0x20, + 0xFF, 0xE0, + 0x80, 0x00, + 0x80, 0x00, + 0x40, 0x00, + 0x60, 0x60, + 0x1F, 0x80 +}; + +static const uint8_t courR18L1_0xEC_BMP[] = { + 0x60, 0x00, + 0x30, 0x00, + 0x18, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x78, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0xFF, 0x80 +}; + +static const uint8_t courR18L1_0xED_BMP[] = { + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x18, 0x00, + 0x00, 0x00, + 0x78, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0xFF, 0x80 +}; + +static const uint8_t courR18L1_0xEE_BMP[] = { + 0x18, 0x00, + 0x3C, 0x00, + 0x66, 0x00, + 0xC3, 0x00, + 0x00, 0x00, + 0x78, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0xFF, 0x80 +}; + +static const uint8_t courR18L1_0xEF_BMP[] = { + 0x63, 0x00, + 0x63, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x78, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0xFF, 0x80 +}; + +static const uint8_t courR18L1_0xF0_BMP[] = { + 0x7C, 0xC0, + 0x87, 0x00, + 0x0D, 0x00, + 0x30, 0x80, + 0x00, 0x40, + 0x0F, 0xE0, + 0x30, 0x60, + 0x20, 0x30, + 0x40, 0x10, + 0x40, 0x10, + 0x40, 0x10, + 0x40, 0x10, + 0x40, 0x10, + 0x20, 0x20, + 0x30, 0x60, + 0x0F, 0x80 +}; + +static const uint8_t courR18L1_0xF1_BMP[] = { + 0x1C, 0x40, + 0x36, 0xC0, + 0x23, 0x80, + 0x00, 0x00, + 0xE7, 0x80, + 0x28, 0x40, + 0x30, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0xF8, 0xF8 +}; + +static const uint8_t courR18L1_0xF2_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x03, 0x00, + 0x00, 0x00, + 0x1F, 0x00, + 0x60, 0xC0, + 0x40, 0x40, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x40, 0x40, + 0x60, 0xC0, + 0x1F, 0x00 +}; + +static const uint8_t courR18L1_0xF3_BMP[] = { + 0x01, 0x80, + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x1F, 0x00, + 0x60, 0xC0, + 0x40, 0x40, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x40, 0x40, + 0x60, 0xC0, + 0x1F, 0x00 +}; + +static const uint8_t courR18L1_0xF4_BMP[] = { + 0x0C, 0x00, + 0x1E, 0x00, + 0x33, 0x00, + 0x61, 0x80, + 0x00, 0x00, + 0x1F, 0x00, + 0x60, 0xC0, + 0x40, 0x40, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x40, 0x40, + 0x60, 0xC0, + 0x1F, 0x00 +}; + +static const uint8_t courR18L1_0xF5_BMP[] = { + 0x1C, 0x40, + 0x36, 0xC0, + 0x23, 0x80, + 0x00, 0x00, + 0x1F, 0x00, + 0x60, 0xC0, + 0x40, 0x40, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x40, 0x40, + 0x60, 0xC0, + 0x1F, 0x00 +}; + +static const uint8_t courR18L1_0xF6_BMP[] = { + 0x31, 0x80, + 0x31, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x1F, 0x00, + 0x60, 0xC0, + 0x40, 0x40, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x40, 0x40, + 0x60, 0xC0, + 0x1F, 0x00 +}; + +static const uint8_t courR18L1_0xF7_BMP[] = { + 0x0E, 0x00, + 0x0E, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xE0, + 0x00, 0x00, + 0x00, 0x00, + 0x0E, 0x00, + 0x0E, 0x00 +}; + +static const uint8_t courR18L1_0xF8_BMP[] = { + 0x00, 0x10, + 0x0F, 0xA0, + 0x30, 0x40, + 0x20, 0xA0, + 0x41, 0x10, + 0x42, 0x10, + 0x44, 0x10, + 0x48, 0x10, + 0x50, 0x10, + 0x20, 0x20, + 0x50, 0x60, + 0x8F, 0x80 +}; + +static const uint8_t courR18L1_0xF9_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x03, 0x00, + 0x00, 0x00, + 0xE0, 0xE0, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x60, + 0x10, 0xA0, + 0x0F, 0x30 +}; + +static const uint8_t courR18L1_0xFA_BMP[] = { + 0x00, 0xC0, + 0x01, 0x80, + 0x03, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0xE0, 0xE0, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x60, + 0x10, 0xA0, + 0x0F, 0x30 +}; + +static const uint8_t courR18L1_0xFB_BMP[] = { + 0x06, 0x00, + 0x0F, 0x00, + 0x19, 0x80, + 0x30, 0xC0, + 0x00, 0x00, + 0xE0, 0xE0, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x60, + 0x10, 0xA0, + 0x0F, 0x30 +}; + +static const uint8_t courR18L1_0xFC_BMP[] = { + 0x19, 0x80, + 0x19, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0xE0, 0xE0, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x60, + 0x10, 0xA0, + 0x0F, 0x30 +}; + +static const uint8_t courR18L1_0xFD_BMP[] = { + 0x00, 0xC0, + 0x01, 0x80, + 0x03, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0xF0, 0xF0, + 0x40, 0x20, + 0x40, 0x20, + 0x20, 0x40, + 0x20, 0x40, + 0x20, 0x80, + 0x10, 0x80, + 0x11, 0x00, + 0x09, 0x00, + 0x0A, 0x00, + 0x06, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0xFE, 0x00 +}; + +static const uint8_t courR18L1_0xFE_BMP[] = { + 0xE0, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x27, 0xC0, + 0x38, 0x30, + 0x30, 0x10, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x30, 0x10, + 0x38, 0x30, + 0x27, 0xC0, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0xFC, 0x00 +}; + +static const uint8_t courR18L1_0xFF_BMP[] = { + 0x19, 0x80, + 0x19, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0xF0, 0xF0, + 0x40, 0x20, + 0x40, 0x20, + 0x20, 0x40, + 0x20, 0x40, + 0x20, 0x80, + 0x10, 0x80, + 0x11, 0x00, + 0x09, 0x00, + 0x0A, 0x00, + 0x06, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0xFE, 0x00 +}; + +static const GFONT_CharInfo FontBMP[] = { + {15, 13, 13, 1, 0, courR18L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {15, 1, 1, 0, 0, courR18L1_0x20_BMP}, + {15, 2, 16, 6, 0, courR18L1_0x21_BMP}, + {15, 8, 7, 3, 9, courR18L1_0x22_BMP}, + {15, 10, 17, 2, -1, courR18L1_0x23_BMP}, + {15, 9, 20, 3, -3, courR18L1_0x24_BMP}, + {15, 12, 16, 1, 0, courR18L1_0x25_BMP}, + {15, 10, 13, 2, 0, courR18L1_0x26_BMP}, + {15, 3, 7, 6, 8, courR18L1_0x27_BMP}, + {15, 4, 19, 7, -3, courR18L1_0x28_BMP}, + {15, 4, 19, 3, -3, courR18L1_0x29_BMP}, + {15, 9, 9, 3, 7, courR18L1_0x2A_BMP}, + {15, 11, 11, 2, 2, courR18L1_0x2B_BMP}, + {15, 5, 6, 4, -3, courR18L1_0x2C_BMP}, + {15, 10, 1, 2, 7, courR18L1_0x2D_BMP}, + {15, 3, 3, 6, 0, courR18L1_0x2E_BMP}, + {15, 9, 18, 3, -2, courR18L1_0x2F_BMP}, + {15, 9, 15, 3, 0, courR18L1_0x30_BMP}, + {15, 9, 15, 3, 0, courR18L1_0x31_BMP}, + {15, 10, 15, 2, 0, courR18L1_0x32_BMP}, + {15, 10, 15, 2, 0, courR18L1_0x33_BMP}, + {15, 10, 15, 2, 0, courR18L1_0x34_BMP}, + {15, 10, 15, 2, 0, courR18L1_0x35_BMP}, + {15, 9, 15, 3, 0, courR18L1_0x36_BMP}, + {15, 9, 15, 2, 0, courR18L1_0x37_BMP}, + {15, 10, 15, 2, 0, courR18L1_0x38_BMP}, + {15, 9, 15, 3, 0, courR18L1_0x39_BMP}, + {15, 3, 11, 6, 0, courR18L1_0x3A_BMP}, + {15, 5, 14, 4, -3, courR18L1_0x3B_BMP}, + {15, 11, 11, 1, 2, courR18L1_0x3C_BMP}, + {15, 12, 4, 1, 5, courR18L1_0x3D_BMP}, + {15, 11, 11, 2, 2, courR18L1_0x3E_BMP}, + {15, 8, 14, 3, 0, courR18L1_0x3F_BMP}, + {15, 10, 18, 2, -2, courR18L1_0x40_BMP}, + {15, 13, 14, 1, 0, courR18L1_0x41_BMP}, + {15, 12, 14, 1, 0, courR18L1_0x42_BMP}, + {15, 11, 14, 2, 0, courR18L1_0x43_BMP}, + {15, 12, 14, 1, 0, courR18L1_0x44_BMP}, + {15, 12, 14, 1, 0, courR18L1_0x45_BMP}, + {15, 11, 14, 2, 0, courR18L1_0x46_BMP}, + {15, 12, 14, 1, 0, courR18L1_0x47_BMP}, + {15, 13, 14, 1, 0, courR18L1_0x48_BMP}, + {15, 9, 14, 3, 0, courR18L1_0x49_BMP}, + {15, 12, 14, 2, 0, courR18L1_0x4A_BMP}, + {15, 13, 14, 1, 0, courR18L1_0x4B_BMP}, + {15, 12, 14, 1, 0, courR18L1_0x4C_BMP}, + {15, 13, 14, 1, 0, courR18L1_0x4D_BMP}, + {15, 14, 14, 0, 0, courR18L1_0x4E_BMP}, + {15, 13, 14, 1, 0, courR18L1_0x4F_BMP}, + {15, 11, 14, 2, 0, courR18L1_0x50_BMP}, + {15, 13, 16, 1, -2, courR18L1_0x51_BMP}, + {15, 13, 14, 1, 0, courR18L1_0x52_BMP}, + {15, 10, 14, 2, 0, courR18L1_0x53_BMP}, + {15, 11, 14, 2, 0, courR18L1_0x54_BMP}, + {15, 12, 14, 1, 0, courR18L1_0x55_BMP}, + {15, 13, 14, 1, 0, courR18L1_0x56_BMP}, + {15, 13, 14, 1, 0, courR18L1_0x57_BMP}, + {15, 13, 14, 1, 0, courR18L1_0x58_BMP}, + {15, 13, 14, 1, 0, courR18L1_0x59_BMP}, + {15, 10, 14, 2, 0, courR18L1_0x5A_BMP}, + {15, 3, 19, 7, -3, courR18L1_0x5B_BMP}, + {15, 9, 18, 3, -2, courR18L1_0x5C_BMP}, + {15, 3, 19, 5, -3, courR18L1_0x5D_BMP}, + {15, 9, 5, 3, 11, courR18L1_0x5E_BMP}, + {15, 15, 1, 0, -5, courR18L1_0x5F_BMP}, + {15, 5, 4, 4, 12, courR18L1_0x60_BMP}, + {15, 11, 11, 2, 0, courR18L1_0x61_BMP}, + {15, 13, 15, 1, 0, courR18L1_0x62_BMP}, + {15, 11, 11, 2, 0, courR18L1_0x63_BMP}, + {15, 13, 15, 1, 0, courR18L1_0x64_BMP}, + {15, 11, 11, 2, 0, courR18L1_0x65_BMP}, + {15, 10, 15, 3, 0, courR18L1_0x66_BMP}, + {15, 13, 16, 1, -5, courR18L1_0x67_BMP}, + {15, 13, 15, 1, 0, courR18L1_0x68_BMP}, + {15, 9, 16, 3, 0, courR18L1_0x69_BMP}, + {15, 8, 21, 3, -5, courR18L1_0x6A_BMP}, + {15, 11, 15, 2, 0, courR18L1_0x6B_BMP}, + {15, 11, 15, 2, 0, courR18L1_0x6C_BMP}, + {15, 14, 11, 0, 0, courR18L1_0x6D_BMP}, + {15, 13, 11, 1, 0, courR18L1_0x6E_BMP}, + {15, 11, 11, 2, 0, courR18L1_0x6F_BMP}, + {15, 13, 16, 1, -5, courR18L1_0x70_BMP}, + {15, 13, 16, 1, -5, courR18L1_0x71_BMP}, + {15, 11, 11, 2, 0, courR18L1_0x72_BMP}, + {15, 9, 11, 3, 0, courR18L1_0x73_BMP}, + {15, 10, 15, 2, 0, courR18L1_0x74_BMP}, + {15, 12, 11, 1, 0, courR18L1_0x75_BMP}, + {15, 13, 11, 1, 0, courR18L1_0x76_BMP}, + {15, 13, 11, 1, 0, courR18L1_0x77_BMP}, + {15, 11, 11, 2, 0, courR18L1_0x78_BMP}, + {15, 12, 16, 1, -5, courR18L1_0x79_BMP}, + {15, 9, 11, 3, 0, courR18L1_0x7A_BMP}, + {15, 5, 19, 5, -3, courR18L1_0x7B_BMP}, + {15, 1, 17, 7, -3, courR18L1_0x7C_BMP}, + {15, 5, 19, 5, -3, courR18L1_0x7D_BMP}, + {15, 12, 3, 1, 6, courR18L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {15, 1, 1, 0, 0, courR18L1_0xA0_BMP}, + {15, 2, 16, 6, -5, courR18L1_0xA1_BMP}, + {15, 8, 16, 3, 0, courR18L1_0xA2_BMP}, + {15, 10, 14, 2, 0, courR18L1_0xA3_BMP}, + {15, 10, 10, 2, 2, courR18L1_0xA4_BMP}, + {15, 11, 14, 2, 0, courR18L1_0xA5_BMP}, + {15, 1, 19, 7, -3, courR18L1_0xA6_BMP}, + {15, 10, 18, 2, -2, courR18L1_0xA7_BMP}, + {15, 7, 2, 4, 12, courR18L1_0xA8_BMP}, + {15, 13, 13, 1, 1, courR18L1_0xA9_BMP}, + {15, 7, 9, 4, 5, courR18L1_0xAA_BMP}, + {15, 12, 11, 1, 0, courR18L1_0xAB_BMP}, + {15, 11, 4, 2, 5, courR18L1_0xAC_BMP}, + {15, 10, 1, 2, 7, courR18L1_0xAD_BMP}, + {15, 13, 13, 1, 1, courR18L1_0xAE_BMP}, + {15, 7, 1, 4, 12, courR18L1_0xAF_BMP}, + {15, 7, 7, 4, 9, courR18L1_0xB0_BMP}, + {15, 11, 13, 2, 1, courR18L1_0xB1_BMP}, + {15, 6, 9, 4, 7, courR18L1_0xB2_BMP}, + {15, 6, 9, 4, 7, courR18L1_0xB3_BMP}, + {15, 5, 4, 5, 12, courR18L1_0xB4_BMP}, + {15, 12, 16, 1, -5, courR18L1_0xB5_BMP}, + {15, 11, 18, 2, -2, courR18L1_0xB6_BMP}, + {15, 3, 3, 6, 6, courR18L1_0xB7_BMP}, + {15, 4, 5, 5, -4, courR18L1_0xB8_BMP}, + {15, 7, 9, 4, 7, courR18L1_0xB9_BMP}, + {15, 7, 9, 4, 5, courR18L1_0xBA_BMP}, + {15, 12, 11, 1, 0, courR18L1_0xBB_BMP}, + {15, 14, 16, 0, 0, courR18L1_0xBC_BMP}, + {15, 14, 16, 0, 0, courR18L1_0xBD_BMP}, + {15, 14, 16, 0, 0, courR18L1_0xBE_BMP}, + {15, 8, 14, 3, -3, courR18L1_0xBF_BMP}, + {15, 13, 19, 1, 0, courR18L1_0xC0_BMP}, + {15, 13, 19, 1, 0, courR18L1_0xC1_BMP}, + {15, 13, 19, 1, 0, courR18L1_0xC2_BMP}, + {15, 13, 18, 1, 0, courR18L1_0xC3_BMP}, + {15, 13, 18, 1, 0, courR18L1_0xC4_BMP}, + {15, 13, 19, 1, 0, courR18L1_0xC5_BMP}, + {15, 15, 14, -1, 0, courR18L1_0xC6_BMP}, + {15, 11, 18, 2, -4, courR18L1_0xC7_BMP}, + {15, 12, 19, 1, 0, courR18L1_0xC8_BMP}, + {15, 12, 19, 1, 0, courR18L1_0xC9_BMP}, + {15, 12, 19, 1, 0, courR18L1_0xCA_BMP}, + {15, 12, 18, 1, 0, courR18L1_0xCB_BMP}, + {15, 9, 19, 3, 0, courR18L1_0xCC_BMP}, + {15, 9, 19, 3, 0, courR18L1_0xCD_BMP}, + {15, 9, 19, 3, 0, courR18L1_0xCE_BMP}, + {15, 9, 18, 3, 0, courR18L1_0xCF_BMP}, + {15, 13, 14, 0, 0, courR18L1_0xD0_BMP}, + {15, 14, 18, 0, 0, courR18L1_0xD1_BMP}, + {15, 13, 19, 1, 0, courR18L1_0xD2_BMP}, + {15, 13, 19, 1, 0, courR18L1_0xD3_BMP}, + {15, 13, 19, 1, 0, courR18L1_0xD4_BMP}, + {15, 13, 18, 1, 0, courR18L1_0xD5_BMP}, + {15, 13, 18, 1, 0, courR18L1_0xD6_BMP}, + {15, 11, 11, 2, 2, courR18L1_0xD7_BMP}, + {15, 14, 15, 0, 0, courR18L1_0xD8_BMP}, + {15, 12, 19, 1, 0, courR18L1_0xD9_BMP}, + {15, 12, 19, 1, 0, courR18L1_0xDA_BMP}, + {15, 12, 19, 1, 0, courR18L1_0xDB_BMP}, + {15, 12, 18, 1, 0, courR18L1_0xDC_BMP}, + {15, 13, 19, 1, 0, courR18L1_0xDD_BMP}, + {15, 11, 14, 2, 0, courR18L1_0xDE_BMP}, + {15, 11, 16, 2, 0, courR18L1_0xDF_BMP}, + {15, 11, 16, 2, 0, courR18L1_0xE0_BMP}, + {15, 11, 16, 2, 0, courR18L1_0xE1_BMP}, + {15, 11, 16, 2, 0, courR18L1_0xE2_BMP}, + {15, 11, 15, 2, 0, courR18L1_0xE3_BMP}, + {15, 11, 15, 2, 0, courR18L1_0xE4_BMP}, + {15, 11, 17, 2, 0, courR18L1_0xE5_BMP}, + {15, 15, 11, 0, 0, courR18L1_0xE6_BMP}, + {15, 11, 15, 2, -4, courR18L1_0xE7_BMP}, + {15, 11, 16, 2, 0, courR18L1_0xE8_BMP}, + {15, 11, 16, 2, 0, courR18L1_0xE9_BMP}, + {15, 11, 16, 2, 0, courR18L1_0xEA_BMP}, + {15, 11, 15, 2, 0, courR18L1_0xEB_BMP}, + {15, 9, 16, 3, 0, courR18L1_0xEC_BMP}, + {15, 9, 16, 3, 0, courR18L1_0xED_BMP}, + {15, 9, 16, 3, 0, courR18L1_0xEE_BMP}, + {15, 9, 15, 3, 0, courR18L1_0xEF_BMP}, + {15, 12, 16, 1, 0, courR18L1_0xF0_BMP}, + {15, 13, 15, 1, 0, courR18L1_0xF1_BMP}, + {15, 11, 16, 2, 0, courR18L1_0xF2_BMP}, + {15, 11, 16, 2, 0, courR18L1_0xF3_BMP}, + {15, 11, 16, 2, 0, courR18L1_0xF4_BMP}, + {15, 11, 15, 2, 0, courR18L1_0xF5_BMP}, + {15, 11, 15, 2, 0, courR18L1_0xF6_BMP}, + {15, 11, 9, 2, 3, courR18L1_0xF7_BMP}, + {15, 12, 12, 1, 0, courR18L1_0xF8_BMP}, + {15, 12, 16, 1, 0, courR18L1_0xF9_BMP}, + {15, 12, 16, 1, 0, courR18L1_0xFA_BMP}, + {15, 12, 16, 1, 0, courR18L1_0xFB_BMP}, + {15, 12, 15, 1, 0, courR18L1_0xFC_BMP}, + {15, 12, 21, 1, -5, courR18L1_0xFD_BMP}, + {15, 13, 21, 1, -5, courR18L1_0xFE_BMP}, + {15, 12, 20, 1, -5, courR18L1_0xFF_BMP} +}; + + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontCour18Normal_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontCour18Normal_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontCour18Normal_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontCour18Normal_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontCour18Normal_GetFontChar, + McuFontCour18Normal_FBBy, + McuFontCour18Normal_GetUnderlineBoxHeight(), + McuFontCour18Normal_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour18Normal_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour18Normal_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour18Normal_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour18Normal_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontCour18Normal. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour18Normal.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour18Normal.h new file mode 100644 index 0000000..7a651a6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour18Normal.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour18Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour18Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 18 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour18Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour18Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour18Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour18Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour18Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontCour18Normal_Deinit(void); +** Init - void McuFontCour18Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour18Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour18Normal_module McuFontCour18Normal module documentation +** @{ +*/ + + +#ifndef __McuFontCour18Normal_H +#define __McuFontCour18Normal_H + +/* MODULE McuFontCour18Normal. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontCour18Normalconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontCour18Normal_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontCour18Normal_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontCour18Normal_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontCour18Normal_GetLineSpaceHeight() \ + 2 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontCour18Normal_GetUnderlineBoxHeight() \ + 8 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontCour18Normal_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontCour18Normal_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontCour18Normal. */ + +#endif +/* ifndef __McuFontCour18Normal_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour24Bold.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour24Bold.c new file mode 100644 index 0000000..bd0675d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour24Bold.c @@ -0,0 +1,4887 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour24Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour24Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 24 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour24Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour24Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour24Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour24Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour24Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontCour24Bold_Deinit(void); +** Init - void McuFontCour24Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour24Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour24Bold_module McuFontCour24Bold module documentation +** @{ +*/ + +/* MODULE McuFontCour24Bold. */ + +#include "McuFontCour24Bold.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontCour24Bold_FBBy 34 + +static const uint8_t courB24L1_0x00_BMP[] = { + 0xAA, 0xAA, 0x80, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, + 0xAA, 0xAA, 0x80 +}; + +static const uint8_t courB24L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t courB24L1_0x21_BMP[] = { + 0x70, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x20, + 0x00, + 0x00, + 0x70, + 0xF8, + 0x70 +}; + +static const uint8_t courB24L1_0x22_BMP[] = { + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0x41, 0x00 +}; + +static const uint8_t courB24L1_0x23_BMP[] = { + 0x0E, 0x38, + 0x0E, 0x38, + 0x0E, 0x38, + 0x0E, 0x38, + 0x0E, 0x38, + 0x0E, 0x38, + 0x0E, 0x38, + 0x0E, 0x38, + 0x7F, 0xFE, + 0x7F, 0xFE, + 0x7F, 0xFE, + 0x1C, 0x70, + 0x1C, 0x70, + 0x1C, 0x70, + 0x1C, 0x70, + 0xFF, 0xFC, + 0xFF, 0xFC, + 0xFF, 0xFC, + 0x38, 0xE0, + 0x38, 0xE0, + 0x38, 0xE0, + 0x38, 0xE0, + 0x38, 0xE0, + 0x38, 0xE0, + 0x38, 0xE0, + 0x38, 0xE0 +}; + +static const uint8_t courB24L1_0x24_BMP[] = { + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x0F, 0xD8, + 0x3F, 0xF8, + 0x7F, 0xF8, + 0xF0, 0x78, + 0xE0, 0x38, + 0xE0, 0x38, + 0xF0, 0x00, + 0xFE, 0x00, + 0x7F, 0xC0, + 0x3F, 0xF0, + 0x07, 0xF8, + 0x00, 0xFC, + 0x00, 0x3C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xF0, 0x3C, + 0xFF, 0xF8, + 0xFF, 0xF0, + 0xE7, 0x80, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00 +}; + +static const uint8_t courB24L1_0x25_BMP[] = { + 0x1F, 0x00, + 0x3F, 0x80, + 0x31, 0x80, + 0x60, 0xC0, + 0x60, 0xC0, + 0x60, 0xC0, + 0x71, 0xC2, + 0x3F, 0x8E, + 0x1F, 0x3E, + 0x00, 0xF8, + 0x03, 0xE0, + 0x1F, 0x00, + 0xFC, 0xF8, + 0xF1, 0xFC, + 0xC3, 0x8E, + 0x03, 0x06, + 0x03, 0x06, + 0x03, 0x06, + 0x01, 0x8C, + 0x01, 0xFC, + 0x00, 0xF8 +}; + +static const uint8_t courB24L1_0x26_BMP[] = { + 0x07, 0xA0, + 0x1F, 0xE0, + 0x3F, 0xE0, + 0x3C, 0x60, + 0x38, 0x00, + 0x38, 0x00, + 0x3C, 0x00, + 0x1C, 0x00, + 0x1E, 0x00, + 0x7F, 0x3C, + 0x7F, 0xBC, + 0xF3, 0xBC, + 0xE1, 0xF0, + 0xE0, 0xF0, + 0xE0, 0xF0, + 0xFF, 0xFC, + 0x7F, 0xBC, + 0x3F, 0x3C +}; + +static const uint8_t courB24L1_0x27_BMP[] = { + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t courB24L1_0x28_BMP[] = { + 0x0E, + 0x0E, + 0x1E, + 0x3C, + 0x38, + 0x38, + 0x78, + 0x70, + 0x70, + 0xF0, + 0xF0, + 0xF0, + 0xE0, + 0xE0, + 0xF0, + 0xF0, + 0xF0, + 0x70, + 0x70, + 0x78, + 0x38, + 0x3C, + 0x1C, + 0x1E, + 0x0E, + 0x0E +}; + +static const uint8_t courB24L1_0x29_BMP[] = { + 0xE0, + 0xE0, + 0xF0, + 0x78, + 0x38, + 0x38, + 0x3C, + 0x1C, + 0x1C, + 0x1E, + 0x1E, + 0x1E, + 0x0E, + 0x0E, + 0x1E, + 0x1E, + 0x1E, + 0x1C, + 0x1C, + 0x3C, + 0x38, + 0x78, + 0x70, + 0xF0, + 0xE0, + 0xE0 +}; + +static const uint8_t courB24L1_0x2A_BMP[] = { + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x63, 0x8C, + 0xFB, 0xBE, + 0x7F, 0xFC, + 0x1F, 0xF0, + 0x0F, 0xE0, + 0x0F, 0xE0, + 0x1E, 0xF0, + 0x3C, 0x78, + 0x78, 0x3C, + 0x30, 0x18 +}; + +static const uint8_t courB24L1_0x2B_BMP[] = { + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00 +}; + +static const uint8_t courB24L1_0x2C_BMP[] = { + 0x1E, + 0x1E, + 0x3C, + 0x3C, + 0x38, + 0x70, + 0x70, + 0xE0, + 0xE0, + 0xC0 +}; + +static const uint8_t courB24L1_0x2D_BMP[] = { + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xFF, 0xFE +}; + +static const uint8_t courB24L1_0x2E_BMP[] = { + 0x70, + 0xF8, + 0xF8, + 0x70 +}; + +static const uint8_t courB24L1_0x2F_BMP[] = { + 0x00, 0x38, + 0x00, 0x38, + 0x00, 0x78, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0xE0, + 0x00, 0xE0, + 0x01, 0xE0, + 0x01, 0xC0, + 0x01, 0xC0, + 0x03, 0x80, + 0x03, 0x80, + 0x07, 0x80, + 0x07, 0x00, + 0x0F, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x3C, 0x00, + 0x38, 0x00, + 0x38, 0x00, + 0x70, 0x00, + 0x70, 0x00, + 0xF0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00 +}; + +static const uint8_t courB24L1_0x30_BMP[] = { + 0x0F, 0x80, + 0x3F, 0xE0, + 0x7F, 0xF0, + 0x70, 0x70, + 0xF0, 0x78, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xF0, 0x78, + 0x70, 0x70, + 0x7F, 0xF0, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t courB24L1_0x31_BMP[] = { + 0x03, 0x00, + 0x0F, 0x00, + 0x7F, 0x00, + 0xFF, 0x00, + 0xFF, 0x00, + 0x67, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0xFF, 0xF8, + 0xFF, 0xF8, + 0xFF, 0xF8 +}; + +static const uint8_t courB24L1_0x32_BMP[] = { + 0x07, 0xC0, + 0x1F, 0xF0, + 0x3F, 0xF8, + 0x78, 0x3C, + 0x70, 0x1C, + 0x70, 0x1C, + 0x70, 0x1C, + 0x00, 0x1C, + 0x00, 0x38, + 0x00, 0x78, + 0x00, 0xF0, + 0x01, 0xE0, + 0x03, 0xC0, + 0x07, 0x80, + 0x0F, 0x00, + 0x1E, 0x00, + 0x3C, 0x00, + 0x78, 0x00, + 0xFF, 0xFC, + 0xFF, 0xFC, + 0xFF, 0xFC +}; + +static const uint8_t courB24L1_0x33_BMP[] = { + 0x07, 0xE0, + 0x1F, 0xF0, + 0x7F, 0xF8, + 0x78, 0x3C, + 0x70, 0x1C, + 0x00, 0x1C, + 0x00, 0x1C, + 0x00, 0x3C, + 0x07, 0xF8, + 0x07, 0xF0, + 0x07, 0xF8, + 0x00, 0x7C, + 0x00, 0x1C, + 0x00, 0x0E, + 0x00, 0x0E, + 0x00, 0x0E, + 0x00, 0x1E, + 0xE0, 0x3C, + 0xFF, 0xFC, + 0xFF, 0xF8, + 0x3F, 0xE0 +}; + +static const uint8_t courB24L1_0x34_BMP[] = { + 0x00, 0xF0, + 0x01, 0xF0, + 0x01, 0xF0, + 0x03, 0xF0, + 0x07, 0xF0, + 0x07, 0x70, + 0x0F, 0x70, + 0x0E, 0x70, + 0x1E, 0x70, + 0x1C, 0x70, + 0x38, 0x70, + 0x78, 0x70, + 0x70, 0x70, + 0xFF, 0xFC, + 0xFF, 0xFC, + 0xFF, 0xFC, + 0x00, 0x70, + 0x00, 0x70, + 0x03, 0xFC, + 0x03, 0xFC, + 0x03, 0xFC +}; + +static const uint8_t courB24L1_0x35_BMP[] = { + 0x3F, 0xFC, + 0x3F, 0xFC, + 0x3F, 0xFC, + 0x38, 0x00, + 0x38, 0x00, + 0x38, 0x00, + 0x38, 0x00, + 0x3F, 0xE0, + 0x3F, 0xF8, + 0x3F, 0xFC, + 0x38, 0x7C, + 0x00, 0x1E, + 0x00, 0x0E, + 0x00, 0x0E, + 0x00, 0x0E, + 0x00, 0x0E, + 0x40, 0x1E, + 0xF0, 0x3C, + 0xFF, 0xF8, + 0x7F, 0xF8, + 0x1F, 0xE0 +}; + +static const uint8_t courB24L1_0x36_BMP[] = { + 0x01, 0xF8, + 0x07, 0xF8, + 0x0F, 0xF8, + 0x1F, 0x00, + 0x3C, 0x00, + 0x78, 0x00, + 0x70, 0x00, + 0x70, 0x00, + 0xE3, 0xC0, + 0xEF, 0xF0, + 0xFF, 0xF0, + 0xF8, 0x78, + 0xF0, 0x3C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xF0, 0x1C, + 0x70, 0x3C, + 0x78, 0x78, + 0x7F, 0xF8, + 0x3F, 0xF0, + 0x0F, 0xC0 +}; + +static const uint8_t courB24L1_0x37_BMP[] = { + 0xFF, 0xFC, + 0xFF, 0xFC, + 0xFF, 0xFC, + 0xE0, 0x3C, + 0xE0, 0x38, + 0xE0, 0x38, + 0x00, 0x38, + 0x00, 0x78, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0xF0, + 0x00, 0xE0, + 0x00, 0xE0, + 0x01, 0xE0, + 0x01, 0xC0, + 0x01, 0xC0, + 0x03, 0xC0, + 0x03, 0x80, + 0x07, 0x80, + 0x07, 0x00, + 0x07, 0x00 +}; + +static const uint8_t courB24L1_0x38_BMP[] = { + 0x0F, 0x80, + 0x3F, 0xE0, + 0x7F, 0xF0, + 0x70, 0x70, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0x70, 0x70, + 0x7F, 0xF0, + 0x3F, 0xE0, + 0x3F, 0xF0, + 0x7C, 0xF8, + 0xF0, 0x3C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xF8, 0x7C, + 0x7F, 0xF8, + 0x3F, 0xF0, + 0x0F, 0xC0 +}; + +static const uint8_t courB24L1_0x39_BMP[] = { + 0x0F, 0x80, + 0x3F, 0xE0, + 0x7F, 0xF0, + 0x78, 0xF0, + 0xF0, 0x78, + 0xE0, 0x38, + 0xE0, 0x3C, + 0xE0, 0x3C, + 0xE0, 0x3C, + 0xF0, 0x7C, + 0x78, 0xFC, + 0x3F, 0xDC, + 0x3F, 0x9C, + 0x0F, 0x3C, + 0x00, 0x38, + 0x00, 0x78, + 0x00, 0x70, + 0x61, 0xF0, + 0xFF, 0xE0, + 0xFF, 0x80, + 0x7E, 0x00 +}; + +static const uint8_t courB24L1_0x3A_BMP[] = { + 0x70, + 0xF8, + 0xF8, + 0x70, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x70, + 0xF8, + 0xF8, + 0x70 +}; + +static const uint8_t courB24L1_0x3B_BMP[] = { + 0x0E, + 0x1F, + 0x1F, + 0x0E, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1E, + 0x1E, + 0x3C, + 0x38, + 0x78, + 0x70, + 0xE0, + 0xE0, + 0xC0 +}; + +static const uint8_t courB24L1_0x3C_BMP[] = { + 0x00, 0x01, 0xC0, + 0x00, 0x03, 0xC0, + 0x00, 0x0F, 0xC0, + 0x00, 0x3F, 0x80, + 0x00, 0xFE, 0x00, + 0x01, 0xF8, 0x00, + 0x07, 0xE0, 0x00, + 0x1F, 0x80, 0x00, + 0x7F, 0x00, 0x00, + 0xFC, 0x00, 0x00, + 0x7F, 0x00, 0x00, + 0x1F, 0x80, 0x00, + 0x07, 0xE0, 0x00, + 0x01, 0xF8, 0x00, + 0x00, 0xFE, 0x00, + 0x00, 0x3F, 0x80, + 0x00, 0x0F, 0xC0, + 0x00, 0x03, 0xC0, + 0x00, 0x01, 0xC0 +}; + +static const uint8_t courB24L1_0x3D_BMP[] = { + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80 +}; + +static const uint8_t courB24L1_0x3E_BMP[] = { + 0xE0, 0x00, 0x00, + 0xF0, 0x00, 0x00, + 0xFC, 0x00, 0x00, + 0x7F, 0x00, 0x00, + 0x1F, 0xC0, 0x00, + 0x07, 0xE0, 0x00, + 0x01, 0xF8, 0x00, + 0x00, 0x7E, 0x00, + 0x00, 0x3F, 0x80, + 0x00, 0x0F, 0xC0, + 0x00, 0x3F, 0x80, + 0x00, 0x7E, 0x00, + 0x01, 0xF8, 0x00, + 0x07, 0xE0, 0x00, + 0x1F, 0xC0, 0x00, + 0x7F, 0x00, 0x00, + 0xFC, 0x00, 0x00, + 0xF0, 0x00, 0x00, + 0xE0, 0x00, 0x00 +}; + +static const uint8_t courB24L1_0x3F_BMP[] = { + 0x1F, 0xC0, + 0x7F, 0xE0, + 0xFF, 0xF0, + 0xE0, 0xF8, + 0xE0, 0x38, + 0xE0, 0x38, + 0x00, 0x38, + 0x00, 0x78, + 0x00, 0xF0, + 0x03, 0xF0, + 0x07, 0xC0, + 0x07, 0x80, + 0x07, 0x00, + 0x07, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0x00, + 0x0F, 0x80, + 0x07, 0x00 +}; + +static const uint8_t courB24L1_0x40_BMP[] = { + 0x0F, 0xC0, + 0x1F, 0xE0, + 0x38, 0x70, + 0x70, 0x30, + 0x60, 0x30, + 0xE0, 0x30, + 0xC0, 0x30, + 0xC1, 0xF0, + 0xC7, 0xF0, + 0xC6, 0x30, + 0xCC, 0x30, + 0xCC, 0x30, + 0xCC, 0x30, + 0xCE, 0x30, + 0xC7, 0xFC, + 0xC3, 0xBC, + 0xC0, 0x00, + 0xE0, 0x00, + 0x60, 0x00, + 0x70, 0x30, + 0x38, 0x70, + 0x1F, 0xE0, + 0x0F, 0xC0 +}; + +static const uint8_t courB24L1_0x41_BMP[] = { + 0x1F, 0xF0, 0x00, + 0x1F, 0xF8, 0x00, + 0x1F, 0xF8, 0x00, + 0x01, 0xDC, 0x00, + 0x01, 0xDC, 0x00, + 0x01, 0xDC, 0x00, + 0x03, 0x8E, 0x00, + 0x03, 0x8E, 0x00, + 0x03, 0x8E, 0x00, + 0x07, 0x07, 0x00, + 0x07, 0x07, 0x00, + 0x07, 0x07, 0x00, + 0x0F, 0xFF, 0x80, + 0x0F, 0xFF, 0x80, + 0x1F, 0xFF, 0xC0, + 0x1C, 0x01, 0xC0, + 0x1C, 0x01, 0xC0, + 0xFF, 0x8F, 0xF8, + 0xFF, 0x8F, 0xF8, + 0xFF, 0x8F, 0xF8 +}; + +static const uint8_t courB24L1_0x42_BMP[] = { + 0xFF, 0xF8, 0x00, + 0xFF, 0xFE, 0x00, + 0xFF, 0xFF, 0x00, + 0x1C, 0x07, 0x80, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0x1C, 0x07, 0x80, + 0x1F, 0xFF, 0x00, + 0x1F, 0xFC, 0x00, + 0x1F, 0xFE, 0x00, + 0x1C, 0x0F, 0x80, + 0x1C, 0x03, 0xC0, + 0x1C, 0x01, 0xC0, + 0x1C, 0x01, 0xC0, + 0x1C, 0x01, 0xC0, + 0x1C, 0x03, 0xC0, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFC, 0x00 +}; + +static const uint8_t courB24L1_0x43_BMP[] = { + 0x03, 0xF9, 0x80, + 0x0F, 0xFF, 0x80, + 0x1F, 0xFF, 0x80, + 0x3E, 0x0F, 0x80, + 0x78, 0x07, 0x80, + 0x70, 0x03, 0x80, + 0xF0, 0x03, 0x80, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xF0, 0x00, 0x00, + 0x78, 0x03, 0x80, + 0x7C, 0x07, 0xC0, + 0x3F, 0xFF, 0x80, + 0x1F, 0xFF, 0x00, + 0x07, 0xFC, 0x00 +}; + +static const uint8_t courB24L1_0x44_BMP[] = { + 0xFF, 0xE0, 0x00, + 0xFF, 0xF8, 0x00, + 0xFF, 0xFC, 0x00, + 0x38, 0x3E, 0x00, + 0x38, 0x0F, 0x00, + 0x38, 0x07, 0x00, + 0x38, 0x07, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x07, 0x80, + 0x38, 0x07, 0x00, + 0x38, 0x1F, 0x00, + 0xFF, 0xFE, 0x00, + 0xFF, 0xFC, 0x00, + 0xFF, 0xF0, 0x00 +}; + +static const uint8_t courB24L1_0x45_BMP[] = { + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x77, 0x00, + 0x1C, 0x70, 0x00, + 0x1F, 0xF0, 0x00, + 0x1F, 0xF0, 0x00, + 0x1F, 0xF0, 0x00, + 0x1C, 0x70, 0x00, + 0x1C, 0x70, 0x00, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80 +}; + +static const uint8_t courB24L1_0x46_BMP[] = { + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0x1C, 0x73, 0x80, + 0x1C, 0x70, 0x00, + 0x1F, 0xF0, 0x00, + 0x1F, 0xF0, 0x00, + 0x1F, 0xF0, 0x00, + 0x1C, 0x70, 0x00, + 0x1C, 0x70, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0xFF, 0xE0, 0x00, + 0xFF, 0xE0, 0x00, + 0xFF, 0xE0, 0x00 +}; + +static const uint8_t courB24L1_0x47_BMP[] = { + 0x03, 0xF3, 0x00, + 0x0F, 0xFF, 0x00, + 0x1F, 0xFF, 0x00, + 0x3C, 0x0F, 0x00, + 0x78, 0x07, 0x00, + 0x70, 0x07, 0x00, + 0xF0, 0x07, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0xFF, 0x80, + 0xE0, 0xFF, 0x80, + 0xE0, 0xFF, 0x80, + 0xF0, 0x07, 0x00, + 0x70, 0x07, 0x00, + 0x7C, 0x0F, 0x00, + 0x3F, 0xFF, 0x00, + 0x1F, 0xFE, 0x00, + 0x07, 0xF8, 0x00 +}; + +static const uint8_t courB24L1_0x48_BMP[] = { + 0xFF, 0x7F, 0x80, + 0xFF, 0x7F, 0x80, + 0xFF, 0x7F, 0x80, + 0x38, 0x0E, 0x00, + 0x38, 0x0E, 0x00, + 0x38, 0x0E, 0x00, + 0x38, 0x0E, 0x00, + 0x38, 0x0E, 0x00, + 0x3F, 0xFE, 0x00, + 0x3F, 0xFE, 0x00, + 0x3F, 0xFE, 0x00, + 0x38, 0x0E, 0x00, + 0x38, 0x0E, 0x00, + 0x38, 0x0E, 0x00, + 0x38, 0x0E, 0x00, + 0x38, 0x0E, 0x00, + 0x38, 0x0E, 0x00, + 0xFF, 0x7F, 0x80, + 0xFF, 0x7F, 0x80, + 0xFF, 0x7F, 0x80 +}; + +static const uint8_t courB24L1_0x49_BMP[] = { + 0xFF, 0xF8, + 0xFF, 0xF8, + 0xFF, 0xF8, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0xFF, 0xF8, + 0xFF, 0xF8, + 0xFF, 0xF8 +}; + +static const uint8_t courB24L1_0x4A_BMP[] = { + 0x07, 0xFF, 0x80, + 0x07, 0xFF, 0x80, + 0x07, 0xFF, 0x80, + 0x00, 0x38, 0x00, + 0x00, 0x38, 0x00, + 0x00, 0x38, 0x00, + 0x00, 0x38, 0x00, + 0x00, 0x38, 0x00, + 0x00, 0x38, 0x00, + 0x00, 0x38, 0x00, + 0xE0, 0x38, 0x00, + 0xE0, 0x38, 0x00, + 0xE0, 0x38, 0x00, + 0xE0, 0x38, 0x00, + 0xE0, 0x38, 0x00, + 0xE0, 0x78, 0x00, + 0xF0, 0xF0, 0x00, + 0xFF, 0xF0, 0x00, + 0x7F, 0xE0, 0x00, + 0x1F, 0x80, 0x00 +}; + +static const uint8_t courB24L1_0x4B_BMP[] = { + 0xFF, 0x9F, 0xC0, + 0xFF, 0x9F, 0xC0, + 0xFF, 0x9F, 0xC0, + 0x1C, 0x0F, 0x00, + 0x1C, 0x1E, 0x00, + 0x1C, 0x3C, 0x00, + 0x1C, 0x78, 0x00, + 0x1C, 0xF0, 0x00, + 0x1F, 0xE0, 0x00, + 0x1F, 0xF0, 0x00, + 0x1F, 0xF8, 0x00, + 0x1E, 0x7C, 0x00, + 0x1C, 0x3C, 0x00, + 0x1C, 0x1E, 0x00, + 0x1C, 0x0E, 0x00, + 0x1C, 0x0F, 0x00, + 0x1C, 0x07, 0x00, + 0xFF, 0x87, 0xE0, + 0xFF, 0x87, 0xE0, + 0xFF, 0x87, 0xE0 +}; + +static const uint8_t courB24L1_0x4C_BMP[] = { + 0xFF, 0xE0, 0x00, + 0xFF, 0xE0, 0x00, + 0xFF, 0xE0, 0x00, + 0x0E, 0x00, 0x00, + 0x0E, 0x00, 0x00, + 0x0E, 0x00, 0x00, + 0x0E, 0x00, 0x00, + 0x0E, 0x00, 0x00, + 0x0E, 0x00, 0x00, + 0x0E, 0x00, 0x00, + 0x0E, 0x00, 0x00, + 0x0E, 0x03, 0x80, + 0x0E, 0x03, 0x80, + 0x0E, 0x03, 0x80, + 0x0E, 0x03, 0x80, + 0x0E, 0x03, 0x80, + 0x0E, 0x03, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80 +}; + +static const uint8_t courB24L1_0x4D_BMP[] = { + 0xFC, 0x01, 0xF8, + 0xFC, 0x01, 0xF8, + 0xFE, 0x03, 0xF8, + 0x3E, 0x03, 0xE0, + 0x3F, 0x07, 0xE0, + 0x3F, 0x07, 0xE0, + 0x3B, 0x8E, 0xE0, + 0x3B, 0x8E, 0xE0, + 0x3B, 0xDE, 0xE0, + 0x39, 0xDC, 0xE0, + 0x39, 0xDC, 0xE0, + 0x38, 0xF8, 0xE0, + 0x38, 0xF8, 0xE0, + 0x38, 0xF8, 0xE0, + 0x38, 0x70, 0xE0, + 0x38, 0x70, 0xE0, + 0x38, 0x00, 0xE0, + 0xFF, 0x07, 0xF8, + 0xFF, 0x07, 0xF8, + 0xFF, 0x07, 0xF8 +}; + +static const uint8_t courB24L1_0x4E_BMP[] = { + 0xF8, 0x1F, 0xE0, + 0xFC, 0x1F, 0xE0, + 0xFE, 0x1F, 0xE0, + 0x3E, 0x03, 0x80, + 0x3F, 0x03, 0x80, + 0x3F, 0x03, 0x80, + 0x3B, 0x83, 0x80, + 0x3B, 0xC3, 0x80, + 0x39, 0xC3, 0x80, + 0x39, 0xE3, 0x80, + 0x38, 0xF3, 0x80, + 0x38, 0x73, 0x80, + 0x38, 0x7B, 0x80, + 0x38, 0x3B, 0x80, + 0x38, 0x1F, 0x80, + 0x38, 0x1F, 0x80, + 0x38, 0x0F, 0x80, + 0xFF, 0x07, 0x80, + 0xFF, 0x07, 0x80, + 0xFF, 0x03, 0x80 +}; + +static const uint8_t courB24L1_0x4F_BMP[] = { + 0x03, 0xF0, 0x00, + 0x0F, 0xFC, 0x00, + 0x1F, 0xFE, 0x00, + 0x3C, 0x0F, 0x00, + 0x78, 0x07, 0x80, + 0x70, 0x03, 0x80, + 0xF0, 0x03, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xF0, 0x03, 0xC0, + 0x70, 0x03, 0x80, + 0x78, 0x07, 0x80, + 0x3C, 0x0F, 0x00, + 0x1F, 0xFE, 0x00, + 0x0F, 0xFC, 0x00, + 0x03, 0xF0, 0x00 +}; + +static const uint8_t courB24L1_0x50_BMP[] = { + 0xFF, 0xF8, 0x00, + 0xFF, 0xFE, 0x00, + 0xFF, 0xFF, 0x00, + 0x1C, 0x0F, 0x00, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0x1C, 0x07, 0x80, + 0x1C, 0x0F, 0x00, + 0x1F, 0xFE, 0x00, + 0x1F, 0xFC, 0x00, + 0x1F, 0xF0, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0xFF, 0xE0, 0x00, + 0xFF, 0xE0, 0x00, + 0xFF, 0xE0, 0x00 +}; + +static const uint8_t courB24L1_0x51_BMP[] = { + 0x03, 0xF0, 0x00, + 0x0F, 0xF8, 0x00, + 0x1F, 0xFE, 0x00, + 0x3C, 0x0F, 0x00, + 0x78, 0x07, 0x80, + 0x70, 0x03, 0x80, + 0xF0, 0x03, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0x70, 0x03, 0x80, + 0x78, 0x07, 0x80, + 0x3C, 0x0F, 0x00, + 0x1F, 0xFE, 0x00, + 0x0F, 0xFC, 0x00, + 0x07, 0xF0, 0x00, + 0x0E, 0x00, 0x00, + 0x1F, 0xE1, 0xC0, + 0x3F, 0xFF, 0xC0, + 0x3F, 0xFF, 0xC0, + 0x38, 0x3F, 0x00 +}; + +static const uint8_t courB24L1_0x52_BMP[] = { + 0xFF, 0xF8, 0x00, + 0xFF, 0xFE, 0x00, + 0xFF, 0xFF, 0x00, + 0x1C, 0x0F, 0x00, + 0x1C, 0x07, 0x80, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0x1C, 0x07, 0x80, + 0x1C, 0x0F, 0x00, + 0x1F, 0xFE, 0x00, + 0x1F, 0xFC, 0x00, + 0x1F, 0xF8, 0x00, + 0x1C, 0x3C, 0x00, + 0x1C, 0x1E, 0x00, + 0x1C, 0x0F, 0x00, + 0x1C, 0x07, 0x80, + 0x1C, 0x03, 0xC0, + 0xFF, 0x83, 0xF0, + 0xFF, 0x81, 0xF0, + 0xFF, 0x81, 0xF0 +}; + +static const uint8_t courB24L1_0x53_BMP[] = { + 0x0F, 0xCC, + 0x3F, 0xFC, + 0x7F, 0xFC, + 0xF0, 0x7C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xF0, 0x1C, + 0xF8, 0x00, + 0x7F, 0x00, + 0x3F, 0xE0, + 0x0F, 0xF8, + 0x01, 0xFC, + 0x00, 0x3E, + 0xE0, 0x1E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xF0, 0x1E, + 0xFF, 0xFC, + 0xFF, 0xF8, + 0xE7, 0xE0 +}; + +static const uint8_t courB24L1_0x54_BMP[] = { + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xE1, 0xC3, 0x80, + 0xE1, 0xC3, 0x80, + 0xE1, 0xC3, 0x80, + 0xE1, 0xC3, 0x80, + 0xE1, 0xC3, 0x80, + 0xE1, 0xC3, 0x80, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x3F, 0xFE, 0x00, + 0x3F, 0xFE, 0x00, + 0x3F, 0xFE, 0x00 +}; + +static const uint8_t courB24L1_0x55_BMP[] = { + 0xFF, 0x1F, 0xE0, + 0xFF, 0x1F, 0xE0, + 0xFF, 0x1F, 0xE0, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x1C, 0x07, 0x00, + 0x1F, 0x1F, 0x00, + 0x0F, 0xFE, 0x00, + 0x07, 0xFC, 0x00, + 0x01, 0xF0, 0x00 +}; + +static const uint8_t courB24L1_0x56_BMP[] = { + 0xFF, 0x8F, 0xF8, + 0xFF, 0x8F, 0xF8, + 0xFF, 0x8F, 0xF8, + 0x1C, 0x01, 0xC0, + 0x1C, 0x01, 0xC0, + 0x1E, 0x03, 0xC0, + 0x0E, 0x03, 0x80, + 0x0E, 0x03, 0x80, + 0x07, 0x07, 0x00, + 0x07, 0x07, 0x00, + 0x07, 0x8F, 0x00, + 0x03, 0x8E, 0x00, + 0x03, 0x8E, 0x00, + 0x03, 0xDE, 0x00, + 0x01, 0xDC, 0x00, + 0x01, 0xDC, 0x00, + 0x00, 0xF8, 0x00, + 0x00, 0xF8, 0x00, + 0x00, 0xF8, 0x00, + 0x00, 0x70, 0x00 +}; + +static const uint8_t courB24L1_0x57_BMP[] = { + 0xFF, 0x1F, 0xE0, + 0xFF, 0x1F, 0xE0, + 0xFF, 0x1F, 0xE0, + 0x70, 0x01, 0xC0, + 0x70, 0x01, 0xC0, + 0x70, 0xE1, 0xC0, + 0x70, 0xE1, 0xC0, + 0x71, 0xF1, 0xC0, + 0x39, 0xF3, 0x80, + 0x39, 0xF3, 0x80, + 0x3B, 0xBB, 0x80, + 0x3B, 0xBB, 0x80, + 0x3B, 0xBB, 0x80, + 0x3F, 0x1F, 0x80, + 0x3F, 0x1F, 0x80, + 0x1E, 0x0F, 0x00, + 0x1E, 0x0F, 0x00, + 0x1E, 0x0F, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00 +}; + +static const uint8_t courB24L1_0x58_BMP[] = { + 0xFF, 0x1F, 0xE0, + 0xFF, 0x1F, 0xE0, + 0xFF, 0x1F, 0xE0, + 0x3C, 0x07, 0x80, + 0x1E, 0x0F, 0x00, + 0x0F, 0x1E, 0x00, + 0x07, 0xBC, 0x00, + 0x03, 0xF8, 0x00, + 0x01, 0xF0, 0x00, + 0x00, 0xE0, 0x00, + 0x01, 0xF0, 0x00, + 0x03, 0xF8, 0x00, + 0x07, 0xBC, 0x00, + 0x0F, 0x1E, 0x00, + 0x0E, 0x0E, 0x00, + 0x1E, 0x0F, 0x00, + 0x3C, 0x07, 0x80, + 0xFF, 0x1F, 0xE0, + 0xFF, 0x1F, 0xE0, + 0xFF, 0x1F, 0xE0 +}; + +static const uint8_t courB24L1_0x59_BMP[] = { + 0xFF, 0x1F, 0xE0, + 0xFF, 0x1F, 0xE0, + 0xFF, 0x1F, 0xE0, + 0x3C, 0x07, 0x80, + 0x0E, 0x0E, 0x00, + 0x0F, 0x1E, 0x00, + 0x07, 0x1C, 0x00, + 0x07, 0xBC, 0x00, + 0x03, 0xF8, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x0F, 0xFE, 0x00, + 0x0F, 0xFE, 0x00, + 0x0F, 0xFE, 0x00 +}; + +static const uint8_t courB24L1_0x5A_BMP[] = { + 0x7F, 0xFC, + 0x7F, 0xFC, + 0x7F, 0xFC, + 0x70, 0x3C, + 0x70, 0x38, + 0x70, 0x78, + 0x70, 0xF0, + 0x71, 0xE0, + 0x01, 0xC0, + 0x03, 0xC0, + 0x07, 0x80, + 0x0F, 0x00, + 0x0E, 0x0E, + 0x1E, 0x0E, + 0x3C, 0x0E, + 0x78, 0x0E, + 0x70, 0x0E, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xFF, 0xFE +}; + +static const uint8_t courB24L1_0x5B_BMP[] = { + 0xFE, + 0xFE, + 0xFE, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xFE, + 0xFE, + 0xFE +}; + +static const uint8_t courB24L1_0x5C_BMP[] = { + 0xE0, 0x00, + 0xE0, 0x00, + 0xF0, 0x00, + 0x70, 0x00, + 0x70, 0x00, + 0x38, 0x00, + 0x38, 0x00, + 0x3C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0F, 0x00, + 0x07, 0x00, + 0x07, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x01, 0xC0, + 0x01, 0xC0, + 0x01, 0xE0, + 0x00, 0xE0, + 0x00, 0xE0, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0x78, + 0x00, 0x38, + 0x00, 0x38 +}; + +static const uint8_t courB24L1_0x5D_BMP[] = { + 0xFE, + 0xFE, + 0xFE, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0xFE, + 0xFE, + 0xFE +}; + +static const uint8_t courB24L1_0x5E_BMP[] = { + 0x02, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x0F, 0x80, + 0x1F, 0xC0, + 0x3D, 0xE0, + 0x38, 0xE0, + 0x78, 0xF0, + 0xF0, 0x78, + 0xE0, 0x38, + 0xE0, 0x38 +}; + +static const uint8_t courB24L1_0x5F_BMP[] = { + 0xFF, 0xFF, 0xF0, + 0xFF, 0xFF, 0xF0, + 0xFF, 0xFF, 0xF0 +}; + +static const uint8_t courB24L1_0x60_BMP[] = { + 0xC0, + 0xE0, + 0x70, + 0x38, + 0x1C, + 0x0C +}; + +static const uint8_t courB24L1_0x61_BMP[] = { + 0x1F, 0xE0, + 0x7F, 0xF8, + 0x7F, 0xFC, + 0x70, 0x3C, + 0x00, 0x1C, + 0x00, 0x1C, + 0x0F, 0xFC, + 0x7F, 0xFC, + 0x7F, 0xFC, + 0xF0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x7C, + 0xFF, 0xFF, + 0x7F, 0xDF, + 0x3F, 0x9F +}; + +static const uint8_t courB24L1_0x62_BMP[] = { + 0xFC, 0x00, 0x00, + 0xFC, 0x00, 0x00, + 0xFC, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x7C, 0x00, + 0x1D, 0xFF, 0x00, + 0x1F, 0xFF, 0x80, + 0x1F, 0x87, 0xC0, + 0x1E, 0x01, 0xC0, + 0x1E, 0x01, 0xE0, + 0x1C, 0x00, 0xE0, + 0x1C, 0x00, 0xE0, + 0x1C, 0x00, 0xE0, + 0x1C, 0x00, 0xE0, + 0x1E, 0x01, 0xC0, + 0x1F, 0x03, 0xC0, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x00, + 0xFC, 0xFE, 0x00 +}; + +static const uint8_t courB24L1_0x63_BMP[] = { + 0x07, 0xE6, + 0x1F, 0xFE, + 0x3F, 0xFE, + 0x7C, 0x3E, + 0x70, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xF0, 0x06, + 0x78, 0x0F, + 0x7F, 0xFE, + 0x3F, 0xFC, + 0x0F, 0xF0 +}; + +static const uint8_t courB24L1_0x64_BMP[] = { + 0x00, 0x3F, 0x00, + 0x00, 0x3F, 0x00, + 0x00, 0x3F, 0x00, + 0x00, 0x07, 0x00, + 0x00, 0x07, 0x00, + 0x00, 0x07, 0x00, + 0x07, 0xE7, 0x00, + 0x1F, 0xFF, 0x00, + 0x3F, 0xFF, 0x00, + 0x7C, 0x3F, 0x00, + 0x70, 0x0F, 0x00, + 0xF0, 0x0F, 0x00, + 0xE0, 0x07, 0x00, + 0xE0, 0x07, 0x00, + 0xE0, 0x07, 0x00, + 0xE0, 0x07, 0x00, + 0x70, 0x0F, 0x00, + 0x7C, 0x3F, 0x00, + 0x3F, 0xFF, 0xE0, + 0x1F, 0xF7, 0xE0, + 0x07, 0xE7, 0xE0 +}; + +static const uint8_t courB24L1_0x65_BMP[] = { + 0x03, 0xF0, 0x00, + 0x0F, 0xFC, 0x00, + 0x1F, 0xFE, 0x00, + 0x3E, 0x1F, 0x00, + 0x78, 0x07, 0x80, + 0x70, 0x03, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xF0, 0x00, 0x00, + 0x78, 0x00, 0x00, + 0x7E, 0x03, 0x80, + 0x3F, 0xFF, 0xC0, + 0x1F, 0xFF, 0x80, + 0x07, 0xFE, 0x00 +}; + +static const uint8_t courB24L1_0x66_BMP[] = { + 0x01, 0xFF, + 0x07, 0xFF, + 0x07, 0xFF, + 0x0F, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0xFF, 0xFC, + 0xFF, 0xFC, + 0xFF, 0xFC, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0xFF, 0xFC, + 0xFF, 0xFC, + 0xFF, 0xFC +}; + +static const uint8_t courB24L1_0x67_BMP[] = { + 0x07, 0xCF, 0xC0, + 0x1F, 0xFF, 0xC0, + 0x3F, 0xFF, 0xC0, + 0x7C, 0x7E, 0x00, + 0x70, 0x1E, 0x00, + 0xF0, 0x1E, 0x00, + 0xE0, 0x0E, 0x00, + 0xE0, 0x0E, 0x00, + 0xE0, 0x0E, 0x00, + 0xF0, 0x1E, 0x00, + 0x70, 0x1E, 0x00, + 0x78, 0x7E, 0x00, + 0x3F, 0xFE, 0x00, + 0x1F, 0xEE, 0x00, + 0x0F, 0xCE, 0x00, + 0x00, 0x0E, 0x00, + 0x00, 0x0E, 0x00, + 0x00, 0x1E, 0x00, + 0x00, 0x3C, 0x00, + 0x1F, 0xFC, 0x00, + 0x1F, 0xF8, 0x00, + 0x1F, 0xE0, 0x00 +}; + +static const uint8_t courB24L1_0x68_BMP[] = { + 0xFC, 0x00, 0x00, + 0xFC, 0x00, 0x00, + 0xFC, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0xF8, 0x00, + 0x1D, 0xFC, 0x00, + 0x1F, 0xFE, 0x00, + 0x1F, 0x0F, 0x00, + 0x1E, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x7F, 0x1F, 0xC0, + 0x7F, 0x1F, 0xC0, + 0x7F, 0x1F, 0xC0 +}; + +static const uint8_t courB24L1_0x69_BMP[] = { + 0x07, 0x80, + 0x07, 0x80, + 0x07, 0x80, + 0x07, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x7F, 0x80, + 0x7F, 0x80, + 0x7F, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xFF, 0xFE +}; + +static const uint8_t courB24L1_0x6A_BMP[] = { + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0xF0, + 0xFF, 0xE0, + 0xFF, 0xC0, + 0xFF, 0x80 +}; + +static const uint8_t courB24L1_0x6B_BMP[] = { + 0xFC, 0x00, 0x00, + 0xFC, 0x00, 0x00, + 0xFC, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0xFF, 0x00, + 0x1C, 0xFF, 0x00, + 0x1C, 0xFF, 0x00, + 0x1C, 0x78, 0x00, + 0x1C, 0xF0, 0x00, + 0x1D, 0xE0, 0x00, + 0x1F, 0xC0, 0x00, + 0x1F, 0xC0, 0x00, + 0x1F, 0xE0, 0x00, + 0x1D, 0xF0, 0x00, + 0x1C, 0xF8, 0x00, + 0x1C, 0x7C, 0x00, + 0xFC, 0x3F, 0x80, + 0xFC, 0x3F, 0x80, + 0xFC, 0x3F, 0x80 +}; + +static const uint8_t courB24L1_0x6C_BMP[] = { + 0x7F, 0x80, + 0x7F, 0x80, + 0x7F, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xFF, 0xFE +}; + +static const uint8_t courB24L1_0x6D_BMP[] = { + 0xF3, 0x8F, 0x00, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0xC0, + 0x78, 0xF1, 0xC0, + 0x70, 0xE1, 0xC0, + 0x70, 0xE1, 0xC0, + 0x70, 0xE1, 0xC0, + 0x70, 0xE1, 0xC0, + 0x70, 0xE1, 0xC0, + 0x70, 0xE1, 0xC0, + 0x70, 0xE1, 0xC0, + 0x70, 0xE1, 0xC0, + 0xFC, 0xF9, 0xF0, + 0xFC, 0xF9, 0xF0, + 0xFC, 0xF9, 0xF0 +}; + +static const uint8_t courB24L1_0x6E_BMP[] = { + 0xF9, 0xF0, 0x00, + 0xFB, 0xF8, 0x00, + 0xFF, 0xFC, 0x00, + 0x3E, 0x1E, 0x00, + 0x3C, 0x0E, 0x00, + 0x38, 0x0E, 0x00, + 0x38, 0x0E, 0x00, + 0x38, 0x0E, 0x00, + 0x38, 0x0E, 0x00, + 0x38, 0x0E, 0x00, + 0x38, 0x0E, 0x00, + 0x38, 0x0E, 0x00, + 0xFE, 0x3F, 0x80, + 0xFE, 0x3F, 0x80, + 0xFE, 0x3F, 0x80 +}; + +static const uint8_t courB24L1_0x6F_BMP[] = { + 0x07, 0xF0, 0x00, + 0x1F, 0xFC, 0x00, + 0x3F, 0xFE, 0x00, + 0x78, 0x0F, 0x00, + 0x70, 0x07, 0x00, + 0xF0, 0x07, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xF0, 0x07, 0x80, + 0x70, 0x07, 0x00, + 0x78, 0x0F, 0x00, + 0x3F, 0xFE, 0x00, + 0x1F, 0xFC, 0x00, + 0x07, 0xF0, 0x00 +}; + +static const uint8_t courB24L1_0x70_BMP[] = { + 0xFC, 0x7C, 0x00, + 0xFD, 0xFF, 0x00, + 0xFF, 0xFF, 0x80, + 0x1F, 0x03, 0xC0, + 0x1E, 0x01, 0xE0, + 0x1C, 0x00, 0xE0, + 0x1C, 0x00, 0xE0, + 0x1C, 0x00, 0xE0, + 0x1C, 0x00, 0xE0, + 0x1C, 0x01, 0xE0, + 0x1E, 0x01, 0xC0, + 0x1F, 0x07, 0xC0, + 0x1F, 0xFF, 0x80, + 0x1D, 0xFE, 0x00, + 0x1C, 0x78, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0xFF, 0xC0, 0x00, + 0xFF, 0xC0, 0x00, + 0xFF, 0xC0, 0x00 +}; + +static const uint8_t courB24L1_0x71_BMP[] = { + 0x07, 0xE7, 0xE0, + 0x1F, 0xFF, 0xE0, + 0x3F, 0xFF, 0xE0, + 0x7C, 0x3F, 0x00, + 0x70, 0x0F, 0x00, + 0xF0, 0x0F, 0x00, + 0xE0, 0x07, 0x00, + 0xE0, 0x07, 0x00, + 0xE0, 0x07, 0x00, + 0xF0, 0x0F, 0x00, + 0x70, 0x0F, 0x00, + 0x7C, 0x3F, 0x00, + 0x3F, 0xFF, 0x00, + 0x1F, 0xF7, 0x00, + 0x07, 0xC7, 0x00, + 0x00, 0x07, 0x00, + 0x00, 0x07, 0x00, + 0x00, 0x07, 0x00, + 0x00, 0x07, 0x00, + 0x00, 0x7F, 0xE0, + 0x00, 0x7F, 0xE0, + 0x00, 0x7F, 0xE0 +}; + +static const uint8_t courB24L1_0x72_BMP[] = { + 0x7E, 0x3E, 0x00, + 0x7E, 0xFF, 0x00, + 0x7F, 0xFF, 0x80, + 0x0F, 0xC7, 0x00, + 0x0F, 0x02, 0x00, + 0x0F, 0x00, 0x00, + 0x0E, 0x00, 0x00, + 0x0E, 0x00, 0x00, + 0x0E, 0x00, 0x00, + 0x0E, 0x00, 0x00, + 0x0E, 0x00, 0x00, + 0x0E, 0x00, 0x00, + 0xFF, 0xFC, 0x00, + 0xFF, 0xFC, 0x00, + 0xFF, 0xFC, 0x00 +}; + +static const uint8_t courB24L1_0x73_BMP[] = { + 0x0F, 0xEC, + 0x3F, 0xFC, + 0x3F, 0xFC, + 0x78, 0x3C, + 0x70, 0x1C, + 0x78, 0x00, + 0x7F, 0xC0, + 0x3F, 0xF8, + 0x0F, 0xFC, + 0xE0, 0x3E, + 0xE0, 0x0E, + 0xF8, 0x1E, + 0xFF, 0xFC, + 0xFF, 0xF8, + 0xE7, 0xE0 +}; + +static const uint8_t courB24L1_0x74_BMP[] = { + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0xFF, 0xFC, + 0xFF, 0xFC, + 0xFF, 0xFC, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x06, + 0x1E, 0x1F, + 0x1F, 0xFF, + 0x0F, 0xFE, + 0x03, 0xF0 +}; + +static const uint8_t courB24L1_0x75_BMP[] = { + 0xFC, 0x3F, 0x00, + 0xFC, 0x3F, 0x00, + 0xFC, 0x3F, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1E, 0x1F, 0x00, + 0x1F, 0xFF, 0xC0, + 0x0F, 0xFF, 0xC0, + 0x07, 0xF7, 0xC0 +}; + +static const uint8_t courB24L1_0x76_BMP[] = { + 0xFF, 0x1F, 0xE0, + 0xFF, 0x1F, 0xE0, + 0xFF, 0x1F, 0xE0, + 0x3C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1E, 0x0E, 0x00, + 0x0E, 0x0E, 0x00, + 0x0F, 0x1C, 0x00, + 0x07, 0x1C, 0x00, + 0x07, 0xB8, 0x00, + 0x03, 0xB8, 0x00, + 0x03, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xE0, 0x00, + 0x00, 0xE0, 0x00 +}; + +static const uint8_t courB24L1_0x77_BMP[] = { + 0xFE, 0x0F, 0xE0, + 0xFE, 0x0F, 0xE0, + 0xFE, 0x0F, 0xE0, + 0x38, 0xE3, 0x80, + 0x38, 0xE3, 0x80, + 0x39, 0xF3, 0x80, + 0x3D, 0xF7, 0x80, + 0x1D, 0xF7, 0x00, + 0x1F, 0xBF, 0x00, + 0x1F, 0x1F, 0x00, + 0x1F, 0x1F, 0x00, + 0x0F, 0x1E, 0x00, + 0x0E, 0x0E, 0x00, + 0x0E, 0x0E, 0x00, + 0x0E, 0x0E, 0x00 +}; + +static const uint8_t courB24L1_0x78_BMP[] = { + 0xFE, 0x3F, 0x80, + 0xFE, 0x3F, 0x80, + 0xFE, 0x3F, 0x80, + 0x3C, 0x1C, 0x00, + 0x1E, 0x38, 0x00, + 0x0F, 0x70, 0x00, + 0x07, 0xE0, 0x00, + 0x03, 0xE0, 0x00, + 0x03, 0xF0, 0x00, + 0x07, 0x78, 0x00, + 0x0E, 0x3C, 0x00, + 0x1C, 0x1E, 0x00, + 0xFE, 0x3F, 0x80, + 0xFE, 0x3F, 0x80, + 0xFE, 0x3F, 0x80 +}; + +static const uint8_t courB24L1_0x79_BMP[] = { + 0xFF, 0x1F, 0xE0, + 0xFF, 0x1F, 0xE0, + 0xFF, 0x1F, 0xE0, + 0x3C, 0x03, 0x80, + 0x1C, 0x07, 0x00, + 0x1E, 0x07, 0x00, + 0x0E, 0x0E, 0x00, + 0x0F, 0x0E, 0x00, + 0x07, 0x1C, 0x00, + 0x07, 0x9C, 0x00, + 0x03, 0xB8, 0x00, + 0x03, 0xF8, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x03, 0x80, 0x00, + 0x7F, 0xF0, 0x00, + 0x7F, 0xF0, 0x00, + 0x7F, 0xF0, 0x00 +}; + +static const uint8_t courB24L1_0x7A_BMP[] = { + 0xFF, 0xF8, + 0xFF, 0xF8, + 0xFF, 0xF8, + 0xE0, 0xF0, + 0xE1, 0xE0, + 0xE3, 0xC0, + 0x07, 0x80, + 0x0F, 0x00, + 0x1E, 0x00, + 0x3C, 0x00, + 0x78, 0x38, + 0xF0, 0x38, + 0xFF, 0xF8, + 0xFF, 0xF8, + 0xFF, 0xF8 +}; + +static const uint8_t courB24L1_0x7B_BMP[] = { + 0x07, 0x80, + 0x0F, 0x80, + 0x0F, 0x80, + 0x1E, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x3C, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xFC, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1F, 0x80, + 0x0F, 0x80, + 0x07, 0x80 +}; + +static const uint8_t courB24L1_0x7C_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t courB24L1_0x7D_BMP[] = { + 0xF0, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0x3C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1E, 0x00, + 0x0F, 0x80, + 0x0F, 0x80, + 0x1F, 0x80, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0xFC, 0x00, + 0xF8, 0x00, + 0xF0, 0x00 +}; + +static const uint8_t courB24L1_0x7E_BMP[] = { + 0x0C, 0x00, + 0x3F, 0x0E, + 0x7F, 0x8E, + 0xF7, 0xDE, + 0xE3, 0xFC, + 0xE1, 0xF8, + 0x00, 0x60 +}; + +static const uint8_t courB24L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t courB24L1_0xA1_BMP[] = { + 0x70, + 0xF8, + 0xF8, + 0x70, + 0x00, + 0x00, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0x70, + 0x20 +}; + +static const uint8_t courB24L1_0xA2_BMP[] = { + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x0F, 0xD8, + 0x3F, 0xF8, + 0x7F, 0xF8, + 0x78, 0x78, + 0xF0, 0x38, + 0xE0, 0x38, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xF0, 0x38, + 0x78, 0x78, + 0x7F, 0xF8, + 0x3F, 0xF0, + 0x0F, 0xC0, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00 +}; + +static const uint8_t courB24L1_0xA3_BMP[] = { + 0x03, 0xE0, + 0x07, 0xF0, + 0x0F, 0xF8, + 0x1E, 0x38, + 0x1C, 0x38, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x0E, 0x00, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x02, + 0x1E, 0x07, + 0x7F, 0xFF, + 0x7F, 0xFF, + 0x7F, 0xFE +}; + +static const uint8_t courB24L1_0xA4_BMP[] = { + 0xE0, 0x0E, + 0xF7, 0xDE, + 0xFF, 0xFE, + 0x7F, 0xFC, + 0x3C, 0x78, + 0x78, 0x3C, + 0x70, 0x1C, + 0x70, 0x1C, + 0x70, 0x1C, + 0x78, 0x3C, + 0x3C, 0x78, + 0x7F, 0xFC, + 0xFF, 0xFE, + 0xF7, 0xDE, + 0xE0, 0x0E +}; + +static const uint8_t courB24L1_0xA5_BMP[] = { + 0xFE, 0x3F, 0x80, + 0xFE, 0x3F, 0x80, + 0xFE, 0x3F, 0x80, + 0x38, 0x0E, 0x00, + 0x1C, 0x1C, 0x00, + 0x1E, 0x3C, 0x00, + 0x0E, 0x38, 0x00, + 0x0F, 0x78, 0x00, + 0x07, 0x70, 0x00, + 0x03, 0xE0, 0x00, + 0x1F, 0xFC, 0x00, + 0x1F, 0xFC, 0x00, + 0x01, 0xC0, 0x00, + 0x1F, 0xFC, 0x00, + 0x1F, 0xFC, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x1F, 0xFC, 0x00, + 0x1F, 0xFC, 0x00, + 0x1F, 0xFC, 0x00 +}; + +static const uint8_t courB24L1_0xA6_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0x00, + 0x00, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t courB24L1_0xA7_BMP[] = { + 0x01, 0xFE, + 0x07, 0xFE, + 0x0F, 0xFE, + 0x1C, 0x06, + 0x18, 0x06, + 0x18, 0x06, + 0x3C, 0x00, + 0x7F, 0x00, + 0xE7, 0x80, + 0xC1, 0xE0, + 0x60, 0xF0, + 0x70, 0x3C, + 0x3C, 0x0E, + 0x0F, 0x06, + 0x07, 0x83, + 0x01, 0xE7, + 0x00, 0xFE, + 0x00, 0x3C, + 0x30, 0x18, + 0x30, 0x18, + 0x30, 0x38, + 0x3F, 0xF0, + 0x3F, 0xE0, + 0x3F, 0x80 +}; + +static const uint8_t courB24L1_0xA8_BMP[] = { + 0x60, 0xC0, + 0xF1, 0xE0, + 0xF1, 0xE0, + 0x60, 0xC0 +}; + +static const uint8_t courB24L1_0xA9_BMP[] = { + 0x00, 0xFC, 0x00, + 0x03, 0xFF, 0x00, + 0x0F, 0xFF, 0xC0, + 0x1E, 0x03, 0xE0, + 0x38, 0x60, 0xE0, + 0x71, 0xF6, 0x70, + 0x73, 0xFE, 0x70, + 0xE7, 0x9E, 0x38, + 0xE7, 0x0E, 0x38, + 0xCE, 0x0E, 0x38, + 0xCE, 0x00, 0x38, + 0xCE, 0x00, 0x38, + 0xCE, 0x06, 0x38, + 0xE7, 0x0F, 0x78, + 0xE7, 0xFE, 0x70, + 0x73, 0xFC, 0xF0, + 0x78, 0xF1, 0xE0, + 0x3E, 0x07, 0xC0, + 0x1F, 0xFF, 0x00, + 0x07, 0xFC, 0x00 +}; + +static const uint8_t courB24L1_0xAA_BMP[] = { + 0x1F, 0x00, + 0x7F, 0x80, + 0x61, 0x80, + 0x01, 0x80, + 0x3F, 0x80, + 0x7F, 0x80, + 0xE1, 0x80, + 0xC1, 0x80, + 0xC3, 0x80, + 0xFF, 0xE0, + 0x7D, 0xE0, + 0x00, 0x00, + 0xFF, 0xE0, + 0xFF, 0xE0 +}; + +static const uint8_t courB24L1_0xAB_BMP[] = { + 0x03, 0x06, + 0x07, 0x0E, + 0x0E, 0x1C, + 0x1C, 0x38, + 0x38, 0x70, + 0x70, 0xE0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0x70, 0xE0, + 0x38, 0x70, + 0x1C, 0x38, + 0x0E, 0x1C, + 0x07, 0x0E, + 0x03, 0x06 +}; + +static const uint8_t courB24L1_0xAC_BMP[] = { + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0x00, 0x07, + 0x00, 0x07, + 0x00, 0x07, + 0x00, 0x07, + 0x00, 0x07 +}; + +static const uint8_t courB24L1_0xAD_BMP[] = { + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xFF, 0xFE +}; + +static const uint8_t courB24L1_0xAE_BMP[] = { + 0x01, 0xF8, 0x00, + 0x07, 0xFE, 0x00, + 0x1F, 0xFF, 0x80, + 0x3C, 0x03, 0xC0, + 0x3B, 0xF1, 0xE0, + 0x73, 0xFC, 0xE0, + 0x73, 0xFE, 0xF0, + 0xE3, 0x9E, 0x70, + 0xE3, 0x8E, 0x78, + 0xE3, 0x8E, 0x38, + 0xE3, 0xFE, 0x38, + 0xE3, 0xFC, 0x38, + 0xE3, 0xB8, 0x38, + 0xF3, 0xBC, 0x78, + 0x73, 0x9E, 0x70, + 0x7B, 0x8F, 0xF0, + 0x3C, 0x03, 0xE0, + 0x1F, 0xFF, 0xC0, + 0x0F, 0xFF, 0x00, + 0x03, 0xFC, 0x00 +}; + +static const uint8_t courB24L1_0xAF_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t courB24L1_0xB0_BMP[] = { + 0x1C, 0x00, + 0x77, 0x00, + 0xC1, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0xC1, 0x80, + 0x77, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t courB24L1_0xB1_BMP[] = { + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80 +}; + +static const uint8_t courB24L1_0xB2_BMP[] = { + 0x3C, + 0x7E, + 0xE7, + 0xC3, + 0x03, + 0x07, + 0x0E, + 0x0C, + 0x18, + 0x38, + 0x70, + 0xE1, + 0xFF, + 0xFF +}; + +static const uint8_t courB24L1_0xB3_BMP[] = { + 0x3E, 0x00, + 0x7F, 0x00, + 0x63, 0x00, + 0x03, 0x00, + 0x07, 0x00, + 0x1E, 0x00, + 0x1F, 0x00, + 0x03, 0x80, + 0x01, 0x80, + 0x01, 0x80, + 0xC1, 0x80, + 0xE3, 0x00, + 0x7F, 0x00, + 0x3C, 0x00 +}; + +static const uint8_t courB24L1_0xB4_BMP[] = { + 0x06, + 0x0F, + 0x3E, + 0x78, + 0xE0, + 0x40 +}; + +static const uint8_t courB24L1_0xB5_BMP[] = { + 0xFC, 0x3F, 0x00, + 0xFC, 0x3F, 0x00, + 0xFC, 0x3F, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x0F, 0x00, + 0x1E, 0x1F, 0x00, + 0x1F, 0xFF, 0xC0, + 0x1F, 0xF7, 0xC0, + 0x1D, 0xE7, 0xC0, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00 +}; + +static const uint8_t courB24L1_0xB6_BMP[] = { + 0x0F, 0xFE, + 0x3F, 0xFE, + 0x7B, 0x18, + 0xF3, 0x18, + 0xE3, 0x18, + 0xE3, 0x18, + 0xE3, 0x18, + 0xE3, 0x18, + 0xE3, 0x18, + 0x73, 0x18, + 0x3F, 0x18, + 0x1F, 0x18, + 0x03, 0x18, + 0x03, 0x18, + 0x03, 0x18, + 0x03, 0x18, + 0x03, 0x18, + 0x03, 0x18, + 0x03, 0x18, + 0x03, 0x18, + 0x03, 0x18, + 0x1F, 0x3E, + 0x1F, 0x3E, + 0x1F, 0x3E +}; + +static const uint8_t courB24L1_0xB7_BMP[] = { + 0x70, + 0xF8, + 0xF8, + 0x70 +}; + +static const uint8_t courB24L1_0xB8_BMP[] = { + 0x30, + 0x30, + 0x30, + 0x18, + 0xF8, + 0xF8, + 0x70 +}; + +static const uint8_t courB24L1_0xB9_BMP[] = { + 0x38, + 0xF8, + 0xD8, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF, + 0xFF +}; + +static const uint8_t courB24L1_0xBA_BMP[] = { + 0x0E, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0xE0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0xE0, + 0x71, 0xC0, + 0x3F, 0x80, + 0x0E, 0x00, + 0x00, 0x00, + 0xFF, 0xE0, + 0xFF, 0xE0 +}; + +static const uint8_t courB24L1_0xBB_BMP[] = { + 0xC1, 0x80, + 0xE1, 0xC0, + 0x70, 0xE0, + 0x38, 0x70, + 0x1C, 0x38, + 0x0E, 0x1C, + 0x07, 0x0E, + 0x07, 0x0E, + 0x0E, 0x1C, + 0x1C, 0x38, + 0x38, 0x70, + 0x70, 0xE0, + 0xE1, 0xC0, + 0xC1, 0x80 +}; + +static const uint8_t courB24L1_0xBC_BMP[] = { + 0x38, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xD8, 0x00, 0x80, + 0x18, 0x01, 0xC0, + 0x18, 0x01, 0x80, + 0x18, 0x03, 0x00, + 0x18, 0x06, 0x00, + 0x18, 0x0C, 0x00, + 0x18, 0x1C, 0xC0, + 0x18, 0x19, 0xC0, + 0xFF, 0x33, 0xC0, + 0xFF, 0x72, 0xC0, + 0x00, 0x66, 0xC0, + 0x00, 0xCE, 0xC0, + 0x01, 0x8C, 0xC0, + 0x03, 0x9F, 0xE0, + 0x07, 0x1F, 0xE0, + 0x02, 0x00, 0xC0, + 0x00, 0x01, 0xE0, + 0x00, 0x01, 0xE0 +}; + +static const uint8_t courB24L1_0xBD_BMP[] = { + 0x38, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xD8, 0x02, 0x00, + 0x18, 0x07, 0x00, + 0x18, 0x0E, 0x00, + 0x18, 0x0C, 0x00, + 0x18, 0x18, 0x00, + 0x18, 0x38, 0x00, + 0x18, 0x70, 0x00, + 0x18, 0x67, 0x80, + 0xFE, 0xEF, 0xC0, + 0xFF, 0xDC, 0xE0, + 0x01, 0x98, 0x60, + 0x03, 0x00, 0xE0, + 0x07, 0x01, 0xC0, + 0x0E, 0x07, 0x80, + 0x04, 0x0E, 0x00, + 0x00, 0x1C, 0x60, + 0x00, 0x1F, 0xE0, + 0x00, 0x1F, 0xE0 +}; + +static const uint8_t courB24L1_0xBE_BMP[] = { + 0x3E, 0x00, 0x00, + 0x7F, 0x00, 0x00, + 0x63, 0x00, 0x00, + 0x03, 0x01, 0x00, + 0x03, 0x03, 0x80, + 0x1E, 0x07, 0x00, + 0x1F, 0x06, 0x00, + 0x03, 0x8E, 0x00, + 0x01, 0x9C, 0x00, + 0xC3, 0x98, 0xC0, + 0xE3, 0x31, 0xC0, + 0x7F, 0x73, 0xC0, + 0x1C, 0x62, 0xC0, + 0x00, 0xC6, 0xC0, + 0x01, 0xCE, 0xC0, + 0x03, 0x8C, 0xC0, + 0x07, 0x1F, 0xE0, + 0x02, 0x1F, 0xE0, + 0x00, 0x00, 0xC0, + 0x00, 0x03, 0xE0, + 0x00, 0x03, 0xE0 +}; + +static const uint8_t courB24L1_0xBF_BMP[] = { + 0x07, 0x00, + 0x0F, 0x80, + 0x0F, 0x80, + 0x07, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x1F, 0x00, + 0x3F, 0x00, + 0x7C, 0x00, + 0xF0, 0x00, + 0xE0, 0x00, + 0xE0, 0x38, + 0xE0, 0x38, + 0xF0, 0x38, + 0x7F, 0xF8, + 0x3F, 0xF8, + 0x1F, 0xE0 +}; + +static const uint8_t courB24L1_0xC0_BMP[] = { + 0x03, 0x00, 0x00, + 0x07, 0x80, 0x00, + 0x01, 0xE0, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, + 0x1F, 0xF0, 0x00, + 0x1F, 0xF8, 0x00, + 0x1F, 0xF8, 0x00, + 0x01, 0xFC, 0x00, + 0x01, 0xDC, 0x00, + 0x01, 0xDC, 0x00, + 0x03, 0xDE, 0x00, + 0x03, 0x8E, 0x00, + 0x03, 0x8E, 0x00, + 0x07, 0x07, 0x00, + 0x07, 0x07, 0x00, + 0x07, 0x07, 0x00, + 0x0F, 0xFF, 0x80, + 0x0F, 0xFF, 0x80, + 0x1F, 0xFF, 0xC0, + 0x1C, 0x01, 0xC0, + 0x1C, 0x01, 0xC0, + 0xFF, 0x8F, 0xF8, + 0xFF, 0x8F, 0xF8, + 0xFF, 0x8F, 0xF8 +}; + +static const uint8_t courB24L1_0xC1_BMP[] = { + 0x00, 0x03, 0x00, + 0x00, 0x0F, 0x00, + 0x00, 0x1E, 0x00, + 0x00, 0x78, 0x00, + 0x00, 0x60, 0x00, + 0x00, 0x00, 0x00, + 0x1F, 0xF0, 0x00, + 0x1F, 0xF8, 0x00, + 0x1F, 0xF8, 0x00, + 0x01, 0xFC, 0x00, + 0x01, 0xDC, 0x00, + 0x01, 0xDC, 0x00, + 0x03, 0xDE, 0x00, + 0x03, 0x8E, 0x00, + 0x03, 0x8E, 0x00, + 0x07, 0x07, 0x00, + 0x07, 0x07, 0x00, + 0x07, 0x07, 0x00, + 0x0F, 0xFF, 0x80, + 0x0F, 0xFF, 0x80, + 0x1F, 0xFF, 0xC0, + 0x1C, 0x01, 0xC0, + 0x1C, 0x01, 0xC0, + 0xFF, 0x8F, 0xF8, + 0xFF, 0x8F, 0xF8, + 0xFF, 0x8F, 0xF8 +}; + +static const uint8_t courB24L1_0xC2_BMP[] = { + 0x00, 0x40, 0x00, + 0x00, 0xE0, 0x00, + 0x03, 0xB8, 0x00, + 0x07, 0x1C, 0x00, + 0x0E, 0x0E, 0x00, + 0x00, 0x00, 0x00, + 0x1F, 0xF0, 0x00, + 0x1F, 0xF8, 0x00, + 0x1F, 0xF8, 0x00, + 0x01, 0xFC, 0x00, + 0x01, 0xDC, 0x00, + 0x01, 0xDC, 0x00, + 0x03, 0xDE, 0x00, + 0x03, 0x8E, 0x00, + 0x03, 0x8E, 0x00, + 0x07, 0x07, 0x00, + 0x07, 0x07, 0x00, + 0x07, 0x07, 0x00, + 0x0F, 0xFF, 0x80, + 0x0F, 0xFF, 0x80, + 0x1F, 0xFF, 0xC0, + 0x1C, 0x01, 0xC0, + 0x1C, 0x01, 0xC0, + 0xFF, 0x8F, 0xF8, + 0xFF, 0x8F, 0xF8, + 0xFF, 0x8F, 0xF8 +}; + +static const uint8_t courB24L1_0xC3_BMP[] = { + 0x03, 0x86, 0x00, + 0x07, 0xE6, 0x00, + 0x06, 0x76, 0x00, + 0x06, 0x1C, 0x00, + 0x00, 0x00, 0x00, + 0x1F, 0xF0, 0x00, + 0x1F, 0xF8, 0x00, + 0x1F, 0xF8, 0x00, + 0x01, 0xFC, 0x00, + 0x01, 0xDC, 0x00, + 0x01, 0xDC, 0x00, + 0x03, 0xDE, 0x00, + 0x03, 0x8E, 0x00, + 0x03, 0x8E, 0x00, + 0x07, 0x07, 0x00, + 0x07, 0x07, 0x00, + 0x07, 0x07, 0x00, + 0x0F, 0xFF, 0x80, + 0x0F, 0xFF, 0x80, + 0x1F, 0xFF, 0xC0, + 0x1C, 0x01, 0xC0, + 0x1C, 0x01, 0xC0, + 0xFF, 0x8F, 0xF8, + 0xFF, 0x8F, 0xF8, + 0xFF, 0x8F, 0xF8 +}; + +static const uint8_t courB24L1_0xC4_BMP[] = { + 0x0C, 0x18, 0x00, + 0x1E, 0x3C, 0x00, + 0x1E, 0x3C, 0x00, + 0x0C, 0x18, 0x00, + 0x00, 0x00, 0x00, + 0x1F, 0xF0, 0x00, + 0x1F, 0xF8, 0x00, + 0x1F, 0xF8, 0x00, + 0x01, 0xFC, 0x00, + 0x01, 0xDC, 0x00, + 0x01, 0xDC, 0x00, + 0x03, 0xDE, 0x00, + 0x03, 0x8E, 0x00, + 0x03, 0x8E, 0x00, + 0x07, 0x07, 0x00, + 0x07, 0x07, 0x00, + 0x07, 0x07, 0x00, + 0x0F, 0xFF, 0x80, + 0x0F, 0xFF, 0x80, + 0x1F, 0xFF, 0xC0, + 0x1C, 0x01, 0xC0, + 0x1C, 0x01, 0xC0, + 0xFF, 0x8F, 0xF8, + 0xFF, 0x8F, 0xF8, + 0xFF, 0x8F, 0xF8 +}; + +static const uint8_t courB24L1_0xC5_BMP[] = { + 0x00, 0xF0, 0x00, + 0x01, 0x98, 0x00, + 0x01, 0x08, 0x00, + 0x01, 0x98, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0x00, 0x00, + 0x1F, 0xF0, 0x00, + 0x1F, 0xF8, 0x00, + 0x1F, 0xF8, 0x00, + 0x01, 0xFC, 0x00, + 0x01, 0xDC, 0x00, + 0x01, 0xDC, 0x00, + 0x03, 0xDE, 0x00, + 0x03, 0x8E, 0x00, + 0x03, 0x8E, 0x00, + 0x07, 0x07, 0x00, + 0x07, 0x07, 0x00, + 0x07, 0x07, 0x00, + 0x0F, 0xFF, 0x80, + 0x0F, 0xFF, 0x80, + 0x1F, 0xFF, 0xC0, + 0x1C, 0x01, 0xC0, + 0x1C, 0x01, 0xC0, + 0xFF, 0x8F, 0xF8, + 0xFF, 0x8F, 0xF8, + 0xFF, 0x8F, 0xF8 +}; + +static const uint8_t courB24L1_0xC6_BMP[] = { + 0x1F, 0xFF, 0xE0, + 0x1F, 0xFF, 0xE0, + 0x1F, 0xFF, 0xE0, + 0x07, 0x70, 0xE0, + 0x07, 0x70, 0xE0, + 0x06, 0x70, 0xE0, + 0x0E, 0x70, 0xE0, + 0x0E, 0x73, 0x00, + 0x0E, 0x73, 0x00, + 0x0E, 0x7F, 0x00, + 0x1C, 0x7F, 0x00, + 0x1C, 0x73, 0x00, + 0x1F, 0xF3, 0x00, + 0x1F, 0xF3, 0x00, + 0x38, 0x70, 0x70, + 0x38, 0x70, 0x70, + 0x38, 0x70, 0x70, + 0xFF, 0xFF, 0xF0, + 0xFF, 0xFF, 0xF0, + 0xFF, 0xFF, 0xF0 +}; + +static const uint8_t courB24L1_0xC7_BMP[] = { + 0x03, 0xE3, 0x00, + 0x0F, 0xFF, 0x00, + 0x1F, 0xFF, 0x00, + 0x3E, 0x1F, 0x00, + 0x78, 0x0F, 0x00, + 0x70, 0x07, 0x00, + 0xF0, 0x07, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xF0, 0x00, 0x00, + 0x70, 0x01, 0x00, + 0x78, 0x03, 0x80, + 0x3E, 0x0F, 0x80, + 0x3F, 0xFF, 0x00, + 0x0F, 0xFE, 0x00, + 0x03, 0xF8, 0x00, + 0x00, 0xC0, 0x00, + 0x00, 0xC0, 0x00, + 0x00, 0xE0, 0x00, + 0x04, 0x70, 0x00, + 0x07, 0xF0, 0x00, + 0x03, 0xE0, 0x00 +}; + +static const uint8_t courB24L1_0xC8_BMP[] = { + 0x03, 0x00, 0x00, + 0x07, 0x80, 0x00, + 0x01, 0xE0, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x77, 0x00, + 0x1C, 0x70, 0x00, + 0x1F, 0xF0, 0x00, + 0x1F, 0xF0, 0x00, + 0x1F, 0xF0, 0x00, + 0x1C, 0x70, 0x00, + 0x1C, 0x70, 0x00, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80 +}; + +static const uint8_t courB24L1_0xC9_BMP[] = { + 0x00, 0x0C, 0x00, + 0x00, 0x3C, 0x00, + 0x00, 0x78, 0x00, + 0x01, 0xE0, 0x00, + 0x01, 0x80, 0x00, + 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x77, 0x00, + 0x1C, 0x70, 0x00, + 0x1F, 0xF0, 0x00, + 0x1F, 0xF0, 0x00, + 0x1F, 0xF0, 0x00, + 0x1C, 0x70, 0x00, + 0x1C, 0x70, 0x00, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80 +}; + +static const uint8_t courB24L1_0xCA_BMP[] = { + 0x00, 0x80, 0x00, + 0x01, 0xC0, 0x00, + 0x07, 0x70, 0x00, + 0x0E, 0x38, 0x00, + 0x1C, 0x1C, 0x00, + 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x77, 0x00, + 0x1C, 0x70, 0x00, + 0x1F, 0xF0, 0x00, + 0x1F, 0xF0, 0x00, + 0x1F, 0xF0, 0x00, + 0x1C, 0x70, 0x00, + 0x1C, 0x70, 0x00, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80 +}; + +static const uint8_t courB24L1_0xCB_BMP[] = { + 0x06, 0x0C, 0x00, + 0x0F, 0x1E, 0x00, + 0x0F, 0x1E, 0x00, + 0x06, 0x0C, 0x00, + 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x77, 0x00, + 0x1C, 0x70, 0x00, + 0x1F, 0xF0, 0x00, + 0x1F, 0xF0, 0x00, + 0x1F, 0xF0, 0x00, + 0x1C, 0x70, 0x00, + 0x1C, 0x70, 0x00, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80 +}; + +static const uint8_t courB24L1_0xCC_BMP[] = { + 0x18, 0x00, + 0x3C, 0x00, + 0x0F, 0x00, + 0x07, 0x80, + 0x01, 0x80, + 0x00, 0x00, + 0xFF, 0xF8, + 0xFF, 0xF8, + 0xFF, 0xF8, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0xFF, 0xF8, + 0xFF, 0xF8, + 0xFF, 0xF8 +}; + +static const uint8_t courB24L1_0xCD_BMP[] = { + 0x00, 0x30, + 0x00, 0xF0, + 0x01, 0xE0, + 0x07, 0x80, + 0x06, 0x00, + 0x00, 0x00, + 0xFF, 0xF8, + 0xFF, 0xF8, + 0xFF, 0xF8, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0xFF, 0xF8, + 0xFF, 0xF8, + 0xFF, 0xF8 +}; + +static const uint8_t courB24L1_0xCE_BMP[] = { + 0x02, 0x00, + 0x07, 0x00, + 0x1D, 0xC0, + 0x38, 0xE0, + 0x70, 0x70, + 0x00, 0x00, + 0xFF, 0xF8, + 0xFF, 0xF8, + 0xFF, 0xF8, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0xFF, 0xF8, + 0xFF, 0xF8, + 0xFF, 0xF8 +}; + +static const uint8_t courB24L1_0xCF_BMP[] = { + 0x30, 0x60, + 0x78, 0xF0, + 0x78, 0xF0, + 0x30, 0x60, + 0x00, 0x00, + 0xFF, 0xF8, + 0xFF, 0xF8, + 0xFF, 0xF8, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0xFF, 0xF8, + 0xFF, 0xF8, + 0xFF, 0xF8 +}; + +static const uint8_t courB24L1_0xD0_BMP[] = { + 0xFF, 0xE0, 0x00, + 0xFF, 0xF8, 0x00, + 0xFF, 0xFC, 0x00, + 0x38, 0x3E, 0x00, + 0x38, 0x0F, 0x00, + 0x38, 0x07, 0x00, + 0x38, 0x07, 0x00, + 0x38, 0x03, 0x80, + 0xFF, 0x83, 0x80, + 0xFF, 0x83, 0x80, + 0xFF, 0x83, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x07, 0x00, + 0x38, 0x07, 0x00, + 0x38, 0x1E, 0x00, + 0xFF, 0xFE, 0x00, + 0xFF, 0xFC, 0x00, + 0xFF, 0xF0, 0x00 +}; + +static const uint8_t courB24L1_0xD1_BMP[] = { + 0x03, 0x86, 0x00, + 0x07, 0xE6, 0x00, + 0x06, 0x76, 0x00, + 0x06, 0x1C, 0x00, + 0x00, 0x00, 0x00, + 0xFC, 0x1F, 0xF0, + 0xFE, 0x1F, 0xF0, + 0xFF, 0x1F, 0xF0, + 0x1F, 0x01, 0xC0, + 0x1F, 0x81, 0xC0, + 0x1F, 0x81, 0xC0, + 0x1D, 0xC1, 0xC0, + 0x1D, 0xE1, 0xC0, + 0x1C, 0xE1, 0xC0, + 0x1C, 0xF1, 0xC0, + 0x1C, 0x79, 0xC0, + 0x1C, 0x39, 0xC0, + 0x1C, 0x3D, 0xC0, + 0x1C, 0x1D, 0xC0, + 0x1C, 0x0F, 0xC0, + 0x1C, 0x0F, 0xC0, + 0x1C, 0x07, 0xC0, + 0x7F, 0xC7, 0xC0, + 0x7F, 0xC3, 0xC0, + 0x7F, 0xC1, 0xC0 +}; + +static const uint8_t courB24L1_0xD2_BMP[] = { + 0x06, 0x00, 0x00, + 0x0F, 0x00, 0x00, + 0x03, 0xC0, 0x00, + 0x01, 0xE0, 0x00, + 0x00, 0x60, 0x00, + 0x00, 0x00, 0x00, + 0x07, 0xF0, 0x00, + 0x0F, 0xFC, 0x00, + 0x1F, 0xFC, 0x00, + 0x3C, 0x1E, 0x00, + 0x78, 0x0F, 0x00, + 0x70, 0x07, 0x00, + 0x70, 0x07, 0x00, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0x70, 0x07, 0x00, + 0x78, 0x07, 0x00, + 0x38, 0x0E, 0x00, + 0x3E, 0x3E, 0x00, + 0x1F, 0xFC, 0x00, + 0x0F, 0xF8, 0x00, + 0x03, 0xE0, 0x00 +}; + +static const uint8_t courB24L1_0xD3_BMP[] = { + 0x00, 0x18, 0x00, + 0x00, 0x78, 0x00, + 0x00, 0xF0, 0x00, + 0x03, 0xC0, 0x00, + 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x07, 0xF0, 0x00, + 0x0F, 0xFC, 0x00, + 0x1F, 0xFC, 0x00, + 0x3C, 0x1E, 0x00, + 0x78, 0x0F, 0x00, + 0x70, 0x07, 0x00, + 0x70, 0x07, 0x00, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0x70, 0x07, 0x00, + 0x78, 0x07, 0x00, + 0x38, 0x0E, 0x00, + 0x3E, 0x3E, 0x00, + 0x1F, 0xFC, 0x00, + 0x0F, 0xF8, 0x00, + 0x03, 0xE0, 0x00 +}; + +static const uint8_t courB24L1_0xD4_BMP[] = { + 0x00, 0x80, 0x00, + 0x01, 0xC0, 0x00, + 0x07, 0x70, 0x00, + 0x0E, 0x38, 0x00, + 0x1C, 0x1C, 0x00, + 0x00, 0x00, 0x00, + 0x07, 0xF0, 0x00, + 0x0F, 0xFC, 0x00, + 0x1F, 0xFC, 0x00, + 0x3C, 0x1E, 0x00, + 0x78, 0x0F, 0x00, + 0x70, 0x07, 0x00, + 0x70, 0x07, 0x00, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0x70, 0x07, 0x00, + 0x78, 0x07, 0x00, + 0x38, 0x0E, 0x00, + 0x3E, 0x3E, 0x00, + 0x1F, 0xFC, 0x00, + 0x0F, 0xF8, 0x00, + 0x03, 0xE0, 0x00 +}; + +static const uint8_t courB24L1_0xD5_BMP[] = { + 0x07, 0x0C, 0x00, + 0x0F, 0xCC, 0x00, + 0x0C, 0xEC, 0x00, + 0x0C, 0x38, 0x00, + 0x00, 0x00, 0x00, + 0x07, 0xF0, 0x00, + 0x0F, 0xFC, 0x00, + 0x1F, 0xFC, 0x00, + 0x3C, 0x1E, 0x00, + 0x78, 0x0F, 0x00, + 0x70, 0x07, 0x00, + 0x70, 0x07, 0x00, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0x70, 0x07, 0x00, + 0x78, 0x07, 0x00, + 0x38, 0x0E, 0x00, + 0x3E, 0x3E, 0x00, + 0x1F, 0xFC, 0x00, + 0x0F, 0xF8, 0x00, + 0x03, 0xE0, 0x00 +}; + +static const uint8_t courB24L1_0xD6_BMP[] = { + 0x0C, 0x18, 0x00, + 0x1E, 0x3C, 0x00, + 0x1E, 0x3C, 0x00, + 0x0C, 0x18, 0x00, + 0x00, 0x00, 0x00, + 0x07, 0xF0, 0x00, + 0x0F, 0xFC, 0x00, + 0x1F, 0xFC, 0x00, + 0x3C, 0x1E, 0x00, + 0x78, 0x0F, 0x00, + 0x70, 0x07, 0x00, + 0x70, 0x07, 0x00, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0x70, 0x07, 0x00, + 0x78, 0x07, 0x00, + 0x38, 0x0E, 0x00, + 0x3E, 0x3E, 0x00, + 0x1F, 0xFC, 0x00, + 0x0F, 0xF8, 0x00, + 0x03, 0xE0, 0x00 +}; + +static const uint8_t courB24L1_0xD7_BMP[] = { + 0xE0, 0x0E, + 0xF0, 0x1E, + 0xF8, 0x3E, + 0x78, 0x3C, + 0x3C, 0x78, + 0x1E, 0xF0, + 0x0F, 0xE0, + 0x07, 0xC0, + 0x07, 0xC0, + 0x0F, 0xE0, + 0x1E, 0xF0, + 0x3C, 0x78, + 0x78, 0x3C, + 0xF8, 0x3E, + 0xF0, 0x1E, + 0xE0, 0x0E +}; + +static const uint8_t courB24L1_0xD8_BMP[] = { + 0x00, 0x03, 0x80, + 0x03, 0xE3, 0x80, + 0x0F, 0xFF, 0x80, + 0x1F, 0xFF, 0x00, + 0x3E, 0x3E, 0x00, + 0x38, 0x1E, 0x00, + 0x78, 0x3F, 0x00, + 0x70, 0x7F, 0x00, + 0xE0, 0x7B, 0x80, + 0xE0, 0xF3, 0x80, + 0xE1, 0xE3, 0x80, + 0xE1, 0xC3, 0x80, + 0xE3, 0xC3, 0x80, + 0xE7, 0x83, 0x80, + 0xFF, 0x07, 0x80, + 0x7E, 0x07, 0x00, + 0x7E, 0x0F, 0x00, + 0x3C, 0x1E, 0x00, + 0x7F, 0xFC, 0x00, + 0x7F, 0xF8, 0x00, + 0xF7, 0xF0, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00 +}; + +static const uint8_t courB24L1_0xD9_BMP[] = { + 0x03, 0x00, 0x00, + 0x07, 0x80, 0x00, + 0x01, 0xE0, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, + 0xFF, 0x1F, 0xE0, + 0xFF, 0x1F, 0xE0, + 0xFF, 0x1F, 0xE0, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x1C, 0x07, 0x80, + 0x1F, 0x1F, 0x00, + 0x0F, 0xFE, 0x00, + 0x07, 0xFC, 0x00, + 0x01, 0xF8, 0x00 +}; + +static const uint8_t courB24L1_0xDA_BMP[] = { + 0x00, 0x1C, 0x00, + 0x00, 0x3C, 0x00, + 0x00, 0xF0, 0x00, + 0x01, 0xE0, 0x00, + 0x01, 0x80, 0x00, + 0x00, 0x00, 0x00, + 0xFF, 0x1F, 0xE0, + 0xFF, 0x1F, 0xE0, + 0xFF, 0x1F, 0xE0, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x1C, 0x07, 0x80, + 0x1F, 0x1F, 0x00, + 0x0F, 0xFE, 0x00, + 0x07, 0xFC, 0x00, + 0x01, 0xF8, 0x00 +}; + +static const uint8_t courB24L1_0xDB_BMP[] = { + 0x00, 0x40, 0x00, + 0x00, 0xE0, 0x00, + 0x03, 0xB8, 0x00, + 0x07, 0x1C, 0x00, + 0x0E, 0x0E, 0x00, + 0x00, 0x00, 0x00, + 0xFF, 0x1F, 0xE0, + 0xFF, 0x1F, 0xE0, + 0xFF, 0x1F, 0xE0, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x1C, 0x07, 0x80, + 0x1F, 0x1F, 0x00, + 0x0F, 0xFE, 0x00, + 0x07, 0xFC, 0x00, + 0x01, 0xF8, 0x00 +}; + +static const uint8_t courB24L1_0xDC_BMP[] = { + 0x06, 0x0C, 0x00, + 0x0F, 0x1E, 0x00, + 0x0F, 0x1E, 0x00, + 0x06, 0x0C, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0xFF, 0xBF, 0xE0, + 0xFF, 0xBF, 0xE0, + 0xFF, 0xBF, 0xE0, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x1C, 0x07, 0x80, + 0x1F, 0x1F, 0x00, + 0x0F, 0xFE, 0x00, + 0x07, 0xFC, 0x00, + 0x01, 0xF8, 0x00 +}; + +static const uint8_t courB24L1_0xDD_BMP[] = { + 0x00, 0x18, 0x00, + 0x00, 0x78, 0x00, + 0x00, 0xF0, 0x00, + 0x03, 0xC0, 0x00, + 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0xFE, 0x3F, 0x80, + 0xFE, 0x3F, 0x80, + 0xFE, 0x3F, 0x80, + 0x3C, 0x1E, 0x00, + 0x1C, 0x1C, 0x00, + 0x1E, 0x3C, 0x00, + 0x0E, 0x38, 0x00, + 0x0F, 0x78, 0x00, + 0x07, 0xF0, 0x00, + 0x03, 0xE0, 0x00, + 0x03, 0xE0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x1F, 0xFC, 0x00, + 0x1F, 0xFC, 0x00, + 0x1F, 0xFC, 0x00 +}; + +static const uint8_t courB24L1_0xDE_BMP[] = { + 0xFF, 0x80, 0x00, + 0xFF, 0x80, 0x00, + 0xFF, 0x80, 0x00, + 0x1C, 0x00, 0x00, + 0x1F, 0xF8, 0x00, + 0x1F, 0xFE, 0x00, + 0x1F, 0xFF, 0x00, + 0x1C, 0x0F, 0x80, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0xC0, + 0x1C, 0x03, 0xC0, + 0x1C, 0x03, 0x80, + 0x1C, 0x0F, 0x80, + 0x1F, 0xFF, 0x00, + 0x1F, 0xFE, 0x00, + 0x1F, 0xF8, 0x00, + 0x1C, 0x00, 0x00, + 0xFF, 0x80, 0x00, + 0xFF, 0x80, 0x00, + 0xFF, 0x80, 0x00 +}; + +static const uint8_t courB24L1_0xDF_BMP[] = { + 0x03, 0xE0, 0x00, + 0x07, 0xF0, 0x00, + 0x0F, 0xF8, 0x00, + 0x1E, 0x3C, 0x00, + 0x1C, 0x1C, 0x00, + 0x1C, 0x1C, 0x00, + 0x1C, 0x1C, 0x00, + 0x1C, 0x3C, 0x00, + 0x1D, 0xF8, 0x00, + 0x1D, 0xF8, 0x00, + 0x1D, 0xFE, 0x00, + 0x1C, 0x1F, 0x00, + 0x1C, 0x0F, 0x00, + 0x1C, 0x07, 0x80, + 0x1C, 0x03, 0x80, + 0x1C, 0x03, 0x80, + 0x1D, 0xC3, 0x80, + 0x1D, 0xC3, 0x80, + 0xFF, 0xFF, 0x00, + 0xFE, 0xFF, 0x00, + 0xFE, 0x7E, 0x00, + 0x00, 0x18, 0x00 +}; + +static const uint8_t courB24L1_0xE0_BMP[] = { + 0x18, 0x00, 0x00, + 0x3C, 0x00, 0x00, + 0x0F, 0x00, 0x00, + 0x07, 0x80, 0x00, + 0x01, 0x80, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x0F, 0xE0, 0x00, + 0x3F, 0xF0, 0x00, + 0x3F, 0xF8, 0x00, + 0x38, 0x3C, 0x00, + 0x00, 0x1C, 0x00, + 0x00, 0x1C, 0x00, + 0x0F, 0xFC, 0x00, + 0x3F, 0xFC, 0x00, + 0x7F, 0xFC, 0x00, + 0x78, 0x1C, 0x00, + 0xF0, 0x1C, 0x00, + 0xE0, 0x7C, 0x00, + 0xFF, 0xFF, 0x80, + 0x7F, 0xFF, 0x80, + 0x3F, 0x9F, 0x80 +}; + +static const uint8_t courB24L1_0xE1_BMP[] = { + 0x00, 0x20, 0x00, + 0x00, 0x70, 0x00, + 0x00, 0xF0, 0x00, + 0x03, 0xC0, 0x00, + 0x07, 0x80, 0x00, + 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x0F, 0xE0, 0x00, + 0x3F, 0xF0, 0x00, + 0x3F, 0xF8, 0x00, + 0x38, 0x3C, 0x00, + 0x00, 0x1C, 0x00, + 0x00, 0x1C, 0x00, + 0x0F, 0xFC, 0x00, + 0x3F, 0xFC, 0x00, + 0x7F, 0xFC, 0x00, + 0x78, 0x1C, 0x00, + 0xE0, 0x3C, 0x00, + 0xE0, 0x7C, 0x00, + 0xFF, 0xFF, 0x80, + 0x7F, 0xDF, 0x80, + 0x3F, 0x9F, 0x80 +}; + +static const uint8_t courB24L1_0xE2_BMP[] = { + 0x00, 0x80, 0x00, + 0x01, 0xC0, 0x00, + 0x07, 0x70, 0x00, + 0x0E, 0x38, 0x00, + 0x1C, 0x1C, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x07, 0xE0, 0x00, + 0x3F, 0xF0, 0x00, + 0x3F, 0xF8, 0x00, + 0x3C, 0x3C, 0x00, + 0x00, 0x1C, 0x00, + 0x00, 0x1C, 0x00, + 0x0F, 0xFC, 0x00, + 0x3F, 0xFC, 0x00, + 0x7F, 0xFC, 0x00, + 0x78, 0x1C, 0x00, + 0xF0, 0x1C, 0x00, + 0xE0, 0x3C, 0x00, + 0xFF, 0xFF, 0x80, + 0x7F, 0xFF, 0x80, + 0x3F, 0x9F, 0x80 +}; + +static const uint8_t courB24L1_0xE3_BMP[] = { + 0x0E, 0x18, 0x00, + 0x1F, 0x98, 0x00, + 0x19, 0xF8, 0x00, + 0x18, 0x70, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x0F, 0xE0, 0x00, + 0x3F, 0xF0, 0x00, + 0x3F, 0xF8, 0x00, + 0x38, 0x3C, 0x00, + 0x00, 0x1C, 0x00, + 0x00, 0x1C, 0x00, + 0x0F, 0xFC, 0x00, + 0x3F, 0xFC, 0x00, + 0x7F, 0xFC, 0x00, + 0x78, 0x1C, 0x00, + 0xF0, 0x1C, 0x00, + 0xE0, 0x7C, 0x00, + 0xFF, 0xFF, 0x80, + 0x7F, 0xDF, 0x80, + 0x3F, 0x9F, 0x80 +}; + +static const uint8_t courB24L1_0xE4_BMP[] = { + 0x0C, 0x18, 0x00, + 0x1E, 0x3C, 0x00, + 0x1E, 0x3C, 0x00, + 0x0C, 0x18, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x0F, 0xE0, 0x00, + 0x3F, 0xF0, 0x00, + 0x3F, 0xF8, 0x00, + 0x38, 0x3C, 0x00, + 0x00, 0x1C, 0x00, + 0x00, 0x1C, 0x00, + 0x0F, 0xFC, 0x00, + 0x3F, 0xFC, 0x00, + 0x7F, 0xFC, 0x00, + 0x78, 0x1C, 0x00, + 0xF0, 0x1C, 0x00, + 0xE0, 0x7C, 0x00, + 0xFF, 0xFF, 0x80, + 0x7F, 0xDF, 0x80, + 0x3F, 0x9F, 0x80 +}; + +static const uint8_t courB24L1_0xE5_BMP[] = { + 0x03, 0xC0, 0x00, + 0x06, 0x60, 0x00, + 0x04, 0x20, 0x00, + 0x06, 0x60, 0x00, + 0x03, 0xC0, 0x00, + 0x00, 0x00, 0x00, + 0x0F, 0xE0, 0x00, + 0x3F, 0xF0, 0x00, + 0x3F, 0xF8, 0x00, + 0x38, 0x3C, 0x00, + 0x00, 0x1C, 0x00, + 0x00, 0x1C, 0x00, + 0x0F, 0xFC, 0x00, + 0x3F, 0xFC, 0x00, + 0x7F, 0xFC, 0x00, + 0x78, 0x1C, 0x00, + 0xF0, 0x1C, 0x00, + 0xE0, 0x7C, 0x00, + 0xFF, 0xFF, 0x80, + 0x7F, 0xDF, 0x80, + 0x3F, 0x9F, 0x80 +}; + +static const uint8_t courB24L1_0xE6_BMP[] = { + 0x0F, 0x87, 0x00, + 0x3F, 0xFF, 0xC0, + 0x3F, 0xFF, 0xC0, + 0x38, 0xFD, 0xE0, + 0x00, 0x70, 0x70, + 0x03, 0xF0, 0x70, + 0x1F, 0xFF, 0xF0, + 0x7F, 0xFF, 0xF0, + 0xFF, 0xFF, 0xF0, + 0xF0, 0x70, 0x00, + 0xE0, 0x78, 0x00, + 0xF1, 0xF8, 0x70, + 0x7F, 0xFF, 0xF0, + 0x3F, 0xFF, 0xF0, + 0x1F, 0x27, 0x80 +}; + +static const uint8_t courB24L1_0xE7_BMP[] = { + 0x07, 0xE6, + 0x1F, 0xFE, + 0x3F, 0xFE, + 0x7C, 0x3E, + 0x70, 0x0E, + 0xF0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xF0, 0x06, + 0x7C, 0x0F, + 0x3F, 0xFE, + 0x1F, 0xFC, + 0x07, 0xF0, + 0x01, 0x80, + 0x01, 0x80, + 0x01, 0xC0, + 0x08, 0xE0, + 0x0F, 0xC0, + 0x03, 0x80 +}; + +static const uint8_t courB24L1_0xE8_BMP[] = { + 0x06, 0x00, + 0x0F, 0x00, + 0x03, 0xC0, + 0x01, 0xE0, + 0x00, 0x60, + 0x00, 0x00, + 0x07, 0xE0, + 0x1F, 0xF8, + 0x3F, 0xFC, + 0x7C, 0x3E, + 0x70, 0x0E, + 0xF0, 0x0F, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xE0, 0x00, + 0x70, 0x00, + 0x7C, 0x0F, + 0x3F, 0xFF, + 0x1F, 0xFE, + 0x07, 0xF0 +}; + +static const uint8_t courB24L1_0xE9_BMP[] = { + 0x00, 0x10, + 0x00, 0x38, + 0x00, 0x78, + 0x01, 0xE0, + 0x03, 0xC0, + 0x03, 0x00, + 0x00, 0x00, + 0x07, 0xE0, + 0x1F, 0xF8, + 0x3F, 0xFC, + 0x7C, 0x3E, + 0x70, 0x0E, + 0xF0, 0x0F, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xE0, 0x00, + 0x70, 0x00, + 0x7C, 0x0E, + 0x3F, 0xFF, + 0x1F, 0xFE, + 0x07, 0xF0 +}; + +static const uint8_t courB24L1_0xEA_BMP[] = { + 0x00, 0x80, + 0x01, 0xC0, + 0x07, 0x70, + 0x0E, 0x38, + 0x1C, 0x1C, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0xE0, + 0x1F, 0xF8, + 0x3F, 0xFC, + 0x7C, 0x3E, + 0x70, 0x0E, + 0xF0, 0x0F, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xE0, 0x00, + 0x70, 0x00, + 0x7C, 0x1F, + 0x3F, 0xFF, + 0x1F, 0xFF, + 0x07, 0xF0 +}; + +static const uint8_t courB24L1_0xEB_BMP[] = { + 0x0C, 0x18, + 0x1E, 0x3C, + 0x1E, 0x3C, + 0x0C, 0x18, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0xE0, + 0x1F, 0xF8, + 0x3F, 0xFC, + 0x7C, 0x3E, + 0x70, 0x0E, + 0xF0, 0x0F, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xE0, 0x00, + 0x70, 0x00, + 0x7C, 0x1F, + 0x3F, 0xFF, + 0x1F, 0xFF, + 0x07, 0xF0 +}; + +static const uint8_t courB24L1_0xEC_BMP[] = { + 0x18, 0x00, + 0x3C, 0x00, + 0x0F, 0x00, + 0x07, 0x80, + 0x01, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x7F, 0x80, + 0x7F, 0x80, + 0x7F, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xFF, 0xFE +}; + +static const uint8_t courB24L1_0xED_BMP[] = { + 0x00, 0x80, + 0x01, 0xC0, + 0x03, 0xC0, + 0x0F, 0x00, + 0x1E, 0x00, + 0x18, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x7F, 0x80, + 0x7F, 0x80, + 0x7F, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xFF, 0xFE +}; + +static const uint8_t courB24L1_0xEE_BMP[] = { + 0x02, 0x00, + 0x07, 0x00, + 0x1D, 0xC0, + 0x38, 0xE0, + 0x70, 0x70, + 0x00, 0x00, + 0x00, 0x00, + 0x7F, 0x80, + 0x7F, 0x80, + 0x7F, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xFF, 0xFE +}; + +static const uint8_t courB24L1_0xEF_BMP[] = { + 0x30, 0x60, + 0x78, 0xF0, + 0x78, 0xF0, + 0x30, 0x60, + 0x00, 0x00, + 0x00, 0x00, + 0x7F, 0x80, + 0x7F, 0x80, + 0x7F, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xFF, 0xFE +}; + +static const uint8_t courB24L1_0xF0_BMP[] = { + 0x7E, 0x0E, + 0xFF, 0xBF, + 0xFF, 0xFC, + 0x03, 0xF0, + 0x0F, 0xF0, + 0x7F, 0xF8, + 0x7C, 0x38, + 0x70, 0x3C, + 0x07, 0xDC, + 0x1F, 0xFE, + 0x7F, 0xFE, + 0x78, 0x1E, + 0xF0, 0x0F, + 0xE0, 0x07, + 0xE0, 0x07, + 0xE0, 0x0F, + 0xF0, 0x0F, + 0xF8, 0x3E, + 0x7F, 0xFC, + 0x3F, 0xF8, + 0x1F, 0xE0 +}; + +static const uint8_t courB24L1_0xF1_BMP[] = { + 0x0E, 0x18, 0x00, + 0x1F, 0x98, 0x00, + 0x19, 0xF8, 0x00, + 0x18, 0x70, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0xF9, 0xF0, 0x00, + 0xFB, 0xFC, 0x00, + 0xFF, 0xFE, 0x00, + 0x3C, 0x1E, 0x00, + 0x38, 0x0E, 0x00, + 0x38, 0x0E, 0x00, + 0x38, 0x0E, 0x00, + 0x38, 0x0E, 0x00, + 0x38, 0x0E, 0x00, + 0x38, 0x0E, 0x00, + 0x38, 0x0E, 0x00, + 0x38, 0x0E, 0x00, + 0xFE, 0x3F, 0x80, + 0xFE, 0x3F, 0x80, + 0xFE, 0x3F, 0x80 +}; + +static const uint8_t courB24L1_0xF2_BMP[] = { + 0x06, 0x00, 0x00, + 0x0F, 0x00, 0x00, + 0x03, 0xC0, 0x00, + 0x01, 0xE0, 0x00, + 0x00, 0x60, 0x00, + 0x00, 0x00, 0x00, + 0x07, 0xF0, 0x00, + 0x0F, 0xF8, 0x00, + 0x3F, 0xFE, 0x00, + 0x3C, 0x1E, 0x00, + 0x78, 0x0F, 0x00, + 0xF0, 0x07, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xF0, 0x07, 0x80, + 0x78, 0x0F, 0x00, + 0x7C, 0x1F, 0x00, + 0x3F, 0xFE, 0x00, + 0x1F, 0xFC, 0x00, + 0x07, 0xF0, 0x00 +}; + +static const uint8_t courB24L1_0xF3_BMP[] = { + 0x00, 0x10, 0x00, + 0x00, 0x38, 0x00, + 0x00, 0x78, 0x00, + 0x01, 0xE0, 0x00, + 0x03, 0xC0, 0x00, + 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x07, 0xF0, 0x00, + 0x0F, 0xF8, 0x00, + 0x3F, 0xFE, 0x00, + 0x3C, 0x1E, 0x00, + 0x78, 0x0F, 0x00, + 0xF0, 0x07, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xF0, 0x07, 0x80, + 0x78, 0x0F, 0x00, + 0x7C, 0x1F, 0x00, + 0x3F, 0xFE, 0x00, + 0x1F, 0xFC, 0x00, + 0x07, 0xF0, 0x00 +}; + +static const uint8_t courB24L1_0xF4_BMP[] = { + 0x00, 0x80, 0x00, + 0x01, 0xC0, 0x00, + 0x07, 0x70, 0x00, + 0x0E, 0x38, 0x00, + 0x1C, 0x1C, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x07, 0xF0, 0x00, + 0x0F, 0xF8, 0x00, + 0x3F, 0xFE, 0x00, + 0x3C, 0x1E, 0x00, + 0x78, 0x0F, 0x00, + 0xF0, 0x07, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xF0, 0x07, 0x80, + 0x78, 0x0F, 0x00, + 0x7C, 0x1F, 0x00, + 0x3F, 0xFE, 0x00, + 0x1F, 0xFC, 0x00, + 0x07, 0xF0, 0x00 +}; + +static const uint8_t courB24L1_0xF5_BMP[] = { + 0x07, 0x0C, 0x00, + 0x0F, 0xCC, 0x00, + 0x0C, 0xFC, 0x00, + 0x0C, 0x38, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x07, 0xF0, 0x00, + 0x0F, 0xF8, 0x00, + 0x3F, 0xFE, 0x00, + 0x3C, 0x1E, 0x00, + 0x78, 0x0F, 0x00, + 0xF0, 0x07, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xF0, 0x07, 0x80, + 0x78, 0x0F, 0x00, + 0x7C, 0x1F, 0x00, + 0x3F, 0xFE, 0x00, + 0x1F, 0xFC, 0x00, + 0x07, 0xF0, 0x00 +}; + +static const uint8_t courB24L1_0xF6_BMP[] = { + 0x0C, 0x18, 0x00, + 0x1E, 0x3C, 0x00, + 0x1E, 0x3C, 0x00, + 0x0C, 0x18, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x07, 0xF0, 0x00, + 0x0F, 0xF8, 0x00, + 0x3F, 0xFE, 0x00, + 0x3C, 0x1E, 0x00, + 0x78, 0x0F, 0x00, + 0xF0, 0x07, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xF0, 0x07, 0x80, + 0x78, 0x0F, 0x00, + 0x7C, 0x1F, 0x00, + 0x3F, 0xFE, 0x00, + 0x1F, 0xFC, 0x00, + 0x07, 0xF0, 0x00 +}; + +static const uint8_t courB24L1_0xF7_BMP[] = { + 0x03, 0x80, + 0x07, 0xC0, + 0x07, 0xC0, + 0x03, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0x00, 0x00, + 0x00, 0x00, + 0x03, 0x80, + 0x07, 0xC0, + 0x07, 0xC0, + 0x03, 0x80 +}; + +static const uint8_t courB24L1_0xF8_BMP[] = { + 0x00, 0x03, 0x80, + 0x03, 0xE3, 0x80, + 0x0F, 0xFF, 0x80, + 0x3F, 0xFF, 0x00, + 0x3E, 0x3E, 0x00, + 0x78, 0x3F, 0x00, + 0x70, 0x7F, 0x00, + 0xE0, 0xF3, 0x80, + 0xE1, 0xE3, 0x80, + 0xE3, 0xC3, 0x80, + 0xE7, 0x83, 0x80, + 0x7F, 0x07, 0x00, + 0x7E, 0x1F, 0x00, + 0x3F, 0xFE, 0x00, + 0x7F, 0xFC, 0x00, + 0xF7, 0xF0, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00 +}; + +static const uint8_t courB24L1_0xF9_BMP[] = { + 0x03, 0x00, 0x00, + 0x07, 0x80, 0x00, + 0x01, 0xE0, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0xFC, 0x3F, 0x00, + 0xFC, 0x3F, 0x00, + 0xFC, 0x3F, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x0F, 0x00, + 0x1C, 0x1F, 0x00, + 0x1F, 0xFF, 0xC0, + 0x0F, 0xF7, 0xC0, + 0x07, 0xE7, 0xC0 +}; + +static const uint8_t courB24L1_0xFA_BMP[] = { + 0x00, 0x08, 0x00, + 0x00, 0x1C, 0x00, + 0x00, 0x3C, 0x00, + 0x00, 0xF0, 0x00, + 0x01, 0xE0, 0x00, + 0x01, 0x80, 0x00, + 0x00, 0x00, 0x00, + 0xFC, 0x3F, 0x00, + 0xFC, 0x3F, 0x00, + 0xFC, 0x3F, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x0F, 0x00, + 0x1C, 0x1F, 0x00, + 0x1F, 0xFF, 0xC0, + 0x0F, 0xF7, 0xC0, + 0x07, 0xE7, 0xC0 +}; + +static const uint8_t courB24L1_0xFB_BMP[] = { + 0x00, 0x80, 0x00, + 0x01, 0xC0, 0x00, + 0x07, 0x70, 0x00, + 0x0E, 0x38, 0x00, + 0x1C, 0x1C, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0xFC, 0x3F, 0x00, + 0xFC, 0x3F, 0x00, + 0xFC, 0x3F, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x0F, 0x00, + 0x1C, 0x1F, 0x00, + 0x1F, 0xFF, 0xC0, + 0x0F, 0xF7, 0xC0, + 0x07, 0xE7, 0xC0 +}; + +static const uint8_t courB24L1_0xFC_BMP[] = { + 0x0C, 0x18, 0x00, + 0x1E, 0x3C, 0x00, + 0x1E, 0x3C, 0x00, + 0x0C, 0x18, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0xFC, 0x3F, 0x00, + 0xFC, 0x3F, 0x00, + 0xFC, 0x3F, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1C, 0x0F, 0x00, + 0x1C, 0x1F, 0x00, + 0x1F, 0xFF, 0xC0, + 0x0F, 0xF7, 0xC0, + 0x07, 0xE7, 0xC0 +}; + +static const uint8_t courB24L1_0xFD_BMP[] = { + 0x00, 0x10, 0x00, + 0x00, 0x38, 0x00, + 0x00, 0x78, 0x00, + 0x01, 0xE0, 0x00, + 0x03, 0xC0, 0x00, + 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0xFE, 0x3F, 0x80, + 0xFE, 0x3F, 0x80, + 0xFE, 0x3F, 0x80, + 0x78, 0x0F, 0x00, + 0x38, 0x0E, 0x00, + 0x3C, 0x1E, 0x00, + 0x1C, 0x1C, 0x00, + 0x1E, 0x3C, 0x00, + 0x0E, 0x38, 0x00, + 0x0F, 0x78, 0x00, + 0x07, 0x70, 0x00, + 0x07, 0xF0, 0x00, + 0x03, 0xE0, 0x00, + 0x03, 0xE0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x03, 0x80, 0x00, + 0x03, 0x80, 0x00, + 0x07, 0x00, 0x00, + 0xFF, 0xE0, 0x00, + 0xFF, 0xE0, 0x00, + 0xFF, 0xE0, 0x00 +}; + +static const uint8_t courB24L1_0xFE_BMP[] = { + 0xFC, 0x00, 0x00, + 0xFC, 0x00, 0x00, + 0xFC, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0xFC, 0x00, + 0x1F, 0xFF, 0x00, + 0x1F, 0xFF, 0x80, + 0x1F, 0x87, 0xC0, + 0x1F, 0x03, 0xC0, + 0x1E, 0x01, 0xE0, + 0x1C, 0x00, 0xE0, + 0x1C, 0x00, 0xE0, + 0x1C, 0x00, 0xE0, + 0x1E, 0x01, 0xE0, + 0x1E, 0x01, 0xC0, + 0x1F, 0x87, 0xC0, + 0x1F, 0xFF, 0x80, + 0x1F, 0xFF, 0x00, + 0x1C, 0xFC, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0xFF, 0xC0, 0x00, + 0xFF, 0xC0, 0x00, + 0xFF, 0xC0, 0x00 +}; + +static const uint8_t courB24L1_0xFF_BMP[] = { + 0x06, 0x0C, 0x00, + 0x0F, 0x1E, 0x00, + 0x0F, 0x1E, 0x00, + 0x06, 0x0C, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0xFE, 0x3F, 0x80, + 0xFE, 0x3F, 0x80, + 0xFE, 0x3F, 0x80, + 0x78, 0x0F, 0x00, + 0x38, 0x0E, 0x00, + 0x3C, 0x1E, 0x00, + 0x1C, 0x1C, 0x00, + 0x1E, 0x3C, 0x00, + 0x0E, 0x38, 0x00, + 0x0F, 0x78, 0x00, + 0x07, 0x70, 0x00, + 0x07, 0xF0, 0x00, + 0x03, 0xE0, 0x00, + 0x03, 0xE0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x03, 0x80, 0x00, + 0x03, 0x80, 0x00, + 0x07, 0x00, 0x00, + 0xFF, 0xE0, 0x00, + 0xFF, 0xE0, 0x00, + 0xFF, 0xE0, 0x00 +}; + +static const GFONT_CharInfo FontBMP[] = { + {20, 17, 19, 1, 0, courB24L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {20, 1, 1, 0, 0, courB24L1_0x20_BMP}, + {20, 5, 21, 7, 0, courB24L1_0x21_BMP}, + {20, 9, 10, 5, 10, courB24L1_0x22_BMP}, + {20, 15, 26, 2, -3, courB24L1_0x23_BMP}, + {20, 14, 27, 3, -4, courB24L1_0x24_BMP}, + {20, 15, 21, 2, 0, courB24L1_0x25_BMP}, + {20, 14, 18, 2, 0, courB24L1_0x26_BMP}, + {20, 4, 11, 8, 10, courB24L1_0x27_BMP}, + {20, 7, 26, 8, -5, courB24L1_0x28_BMP}, + {20, 7, 26, 4, -5, courB24L1_0x29_BMP}, + {20, 15, 14, 3, 7, courB24L1_0x2A_BMP}, + {20, 17, 17, 1, 1, courB24L1_0x2B_BMP}, + {20, 7, 10, 5, -5, courB24L1_0x2C_BMP}, + {20, 15, 3, 2, 8, courB24L1_0x2D_BMP}, + {20, 5, 4, 7, 0, courB24L1_0x2E_BMP}, + {20, 13, 27, 3, -4, courB24L1_0x2F_BMP}, + {20, 13, 21, 3, 0, courB24L1_0x30_BMP}, + {20, 13, 21, 4, 0, courB24L1_0x31_BMP}, + {20, 14, 21, 2, 0, courB24L1_0x32_BMP}, + {20, 15, 21, 2, 0, courB24L1_0x33_BMP}, + {20, 14, 21, 2, 0, courB24L1_0x34_BMP}, + {20, 15, 21, 2, 0, courB24L1_0x35_BMP}, + {20, 14, 21, 3, 0, courB24L1_0x36_BMP}, + {20, 14, 21, 2, 0, courB24L1_0x37_BMP}, + {20, 14, 21, 3, 0, courB24L1_0x38_BMP}, + {20, 14, 21, 3, 0, courB24L1_0x39_BMP}, + {20, 5, 15, 7, 0, courB24L1_0x3A_BMP}, + {20, 8, 19, 5, -4, courB24L1_0x3B_BMP}, + {20, 18, 19, 0, 0, courB24L1_0x3C_BMP}, + {20, 17, 9, 1, 5, courB24L1_0x3D_BMP}, + {20, 18, 19, 1, 0, courB24L1_0x3E_BMP}, + {20, 13, 20, 3, 0, courB24L1_0x3F_BMP}, + {20, 14, 23, 3, -2, courB24L1_0x40_BMP}, + {20, 21, 20, -1, 0, courB24L1_0x41_BMP}, + {20, 18, 20, 1, 0, courB24L1_0x42_BMP}, + {20, 18, 20, 1, 0, courB24L1_0x43_BMP}, + {20, 17, 20, 1, 0, courB24L1_0x44_BMP}, + {20, 17, 20, 1, 0, courB24L1_0x45_BMP}, + {20, 17, 20, 1, 0, courB24L1_0x46_BMP}, + {20, 17, 20, 2, 0, courB24L1_0x47_BMP}, + {20, 17, 20, 1, 0, courB24L1_0x48_BMP}, + {20, 13, 20, 3, 0, courB24L1_0x49_BMP}, + {20, 17, 20, 2, 0, courB24L1_0x4A_BMP}, + {20, 19, 20, 1, 0, courB24L1_0x4B_BMP}, + {20, 17, 20, 1, 0, courB24L1_0x4C_BMP}, + {20, 21, 20, -1, 0, courB24L1_0x4D_BMP}, + {20, 19, 20, 0, 0, courB24L1_0x4E_BMP}, + {20, 18, 20, 1, 0, courB24L1_0x4F_BMP}, + {20, 17, 20, 1, 0, courB24L1_0x50_BMP}, + {20, 18, 25, 1, -5, courB24L1_0x51_BMP}, + {20, 20, 20, 1, 0, courB24L1_0x52_BMP}, + {20, 15, 20, 2, 0, courB24L1_0x53_BMP}, + {20, 17, 20, 1, 0, courB24L1_0x54_BMP}, + {20, 19, 20, 0, 0, courB24L1_0x55_BMP}, + {20, 21, 20, -1, 0, courB24L1_0x56_BMP}, + {20, 19, 20, 0, 0, courB24L1_0x57_BMP}, + {20, 19, 20, 0, 0, courB24L1_0x58_BMP}, + {20, 19, 20, 0, 0, courB24L1_0x59_BMP}, + {20, 15, 20, 2, 0, courB24L1_0x5A_BMP}, + {20, 7, 26, 8, -5, courB24L1_0x5B_BMP}, + {20, 13, 27, 3, -4, courB24L1_0x5C_BMP}, + {20, 7, 26, 4, -5, courB24L1_0x5D_BMP}, + {20, 13, 11, 3, 11, courB24L1_0x5E_BMP}, + {20, 20, 3, 0, -7, courB24L1_0x5F_BMP}, + {20, 6, 6, 6, 16, courB24L1_0x60_BMP}, + {20, 16, 15, 2, 0, courB24L1_0x61_BMP}, + {20, 19, 21, 0, 0, courB24L1_0x62_BMP}, + {20, 16, 15, 2, 0, courB24L1_0x63_BMP}, + {20, 19, 21, 1, 0, courB24L1_0x64_BMP}, + {20, 18, 15, 1, 0, courB24L1_0x65_BMP}, + {20, 16, 21, 3, 0, courB24L1_0x66_BMP}, + {20, 18, 22, 1, -7, courB24L1_0x67_BMP}, + {20, 18, 21, 1, 0, courB24L1_0x68_BMP}, + {20, 15, 21, 3, 0, courB24L1_0x69_BMP}, + {20, 12, 28, 3, -7, courB24L1_0x6A_BMP}, + {20, 17, 21, 1, 0, courB24L1_0x6B_BMP}, + {20, 15, 21, 3, 0, courB24L1_0x6C_BMP}, + {20, 20, 15, 1, 0, courB24L1_0x6D_BMP}, + {20, 17, 15, 2, 0, courB24L1_0x6E_BMP}, + {20, 17, 15, 2, 0, courB24L1_0x6F_BMP}, + {20, 19, 22, 0, -7, courB24L1_0x70_BMP}, + {20, 19, 22, 1, -7, courB24L1_0x71_BMP}, + {20, 17, 15, 2, 0, courB24L1_0x72_BMP}, + {20, 15, 15, 3, 0, courB24L1_0x73_BMP}, + {20, 16, 20, 2, 0, courB24L1_0x74_BMP}, + {20, 18, 15, 1, 0, courB24L1_0x75_BMP}, + {20, 19, 15, 0, 0, courB24L1_0x76_BMP}, + {20, 19, 15, 0, 0, courB24L1_0x77_BMP}, + {20, 17, 15, 1, 0, courB24L1_0x78_BMP}, + {20, 19, 22, 1, -7, courB24L1_0x79_BMP}, + {20, 13, 15, 4, 0, courB24L1_0x7A_BMP}, + {20, 9, 26, 5, -5, courB24L1_0x7B_BMP}, + {20, 3, 26, 8, -5, courB24L1_0x7C_BMP}, + {20, 9, 26, 5, -5, courB24L1_0x7D_BMP}, + {20, 15, 7, 2, 6, courB24L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {20, 1, 1, 0, 0, courB24L1_0xA0_BMP}, + {20, 5, 21, 7, -7, courB24L1_0xA1_BMP}, + {20, 13, 23, 3, -1, courB24L1_0xA2_BMP}, + {20, 16, 20, 1, 0, courB24L1_0xA3_BMP}, + {20, 15, 15, 2, 2, courB24L1_0xA4_BMP}, + {20, 17, 20, 1, 0, courB24L1_0xA5_BMP}, + {20, 3, 26, 8, -5, courB24L1_0xA6_BMP}, + {20, 16, 24, 2, -3, courB24L1_0xA7_BMP}, + {20, 11, 4, 4, 17, courB24L1_0xA8_BMP}, + {20, 21, 20, -1, 0, courB24L1_0xA9_BMP}, + {20, 11, 14, 4, 6, courB24L1_0xAA_BMP}, + {20, 15, 14, 1, 0, courB24L1_0xAB_BMP}, + {20, 16, 8, 2, 5, courB24L1_0xAC_BMP}, + {20, 15, 3, 2, 8, courB24L1_0xAD_BMP}, + {20, 21, 20, -1, 0, courB24L1_0xAE_BMP}, + {20, 10, 2, 5, 17, courB24L1_0xAF_BMP}, + {20, 9, 9, 5, 11, courB24L1_0xB0_BMP}, + {20, 17, 18, 1, 0, courB24L1_0xB1_BMP}, + {20, 8, 14, 5, 7, courB24L1_0xB2_BMP}, + {20, 9, 14, 5, 7, courB24L1_0xB3_BMP}, + {20, 8, 6, 6, 15, courB24L1_0xB4_BMP}, + {20, 18, 22, 1, -7, courB24L1_0xB5_BMP}, + {20, 15, 24, 2, -3, courB24L1_0xB6_BMP}, + {20, 5, 4, 7, 8, courB24L1_0xB7_BMP}, + {20, 5, 7, 6, -6, courB24L1_0xB8_BMP}, + {20, 8, 13, 6, 7, courB24L1_0xB9_BMP}, + {20, 11, 14, 4, 6, courB24L1_0xBA_BMP}, + {20, 15, 14, 2, 0, courB24L1_0xBB_BMP}, + {20, 19, 20, 0, 0, courB24L1_0xBC_BMP}, + {20, 19, 20, 0, 0, courB24L1_0xBD_BMP}, + {20, 19, 21, 0, 0, courB24L1_0xBE_BMP}, + {20, 13, 21, 3, -6, courB24L1_0xBF_BMP}, + {20, 21, 26, -1, 0, courB24L1_0xC0_BMP}, + {20, 21, 26, -1, 0, courB24L1_0xC1_BMP}, + {20, 21, 26, -1, 0, courB24L1_0xC2_BMP}, + {20, 21, 25, -1, 0, courB24L1_0xC3_BMP}, + {20, 21, 25, -1, 0, courB24L1_0xC4_BMP}, + {20, 21, 26, -1, 0, courB24L1_0xC5_BMP}, + {20, 20, 20, 0, 0, courB24L1_0xC6_BMP}, + {20, 17, 26, 1, -6, courB24L1_0xC7_BMP}, + {20, 17, 26, 1, 0, courB24L1_0xC8_BMP}, + {20, 17, 26, 1, 0, courB24L1_0xC9_BMP}, + {20, 17, 26, 1, 0, courB24L1_0xCA_BMP}, + {20, 17, 25, 1, 0, courB24L1_0xCB_BMP}, + {20, 13, 26, 3, 0, courB24L1_0xCC_BMP}, + {20, 13, 26, 3, 0, courB24L1_0xCD_BMP}, + {20, 13, 26, 3, 0, courB24L1_0xCE_BMP}, + {20, 13, 25, 3, 0, courB24L1_0xCF_BMP}, + {20, 17, 20, 2, 0, courB24L1_0xD0_BMP}, + {20, 20, 25, -1, 0, courB24L1_0xD1_BMP}, + {20, 17, 26, 1, 0, courB24L1_0xD2_BMP}, + {20, 17, 26, 1, 0, courB24L1_0xD3_BMP}, + {20, 17, 26, 1, 0, courB24L1_0xD4_BMP}, + {20, 17, 25, 1, 0, courB24L1_0xD5_BMP}, + {20, 17, 25, 1, 0, courB24L1_0xD6_BMP}, + {20, 15, 16, 2, 0, courB24L1_0xD7_BMP}, + {20, 17, 23, 1, -2, courB24L1_0xD8_BMP}, + {20, 19, 26, 0, 0, courB24L1_0xD9_BMP}, + {20, 19, 26, 0, 0, courB24L1_0xDA_BMP}, + {20, 19, 26, 0, 0, courB24L1_0xDB_BMP}, + {20, 19, 26, 0, 0, courB24L1_0xDC_BMP}, + {20, 17, 26, 1, 0, courB24L1_0xDD_BMP}, + {20, 18, 20, 1, 0, courB24L1_0xDE_BMP}, + {20, 17, 22, 0, -1, courB24L1_0xDF_BMP}, + {20, 17, 22, 2, 0, courB24L1_0xE0_BMP}, + {20, 17, 22, 2, 0, courB24L1_0xE1_BMP}, + {20, 17, 22, 1, 0, courB24L1_0xE2_BMP}, + {20, 17, 21, 1, 0, courB24L1_0xE3_BMP}, + {20, 17, 21, 2, 0, courB24L1_0xE4_BMP}, + {20, 17, 21, 1, 0, courB24L1_0xE5_BMP}, + {20, 20, 15, -1, 0, courB24L1_0xE6_BMP}, + {20, 16, 21, 2, -6, courB24L1_0xE7_BMP}, + {20, 16, 21, 1, 0, courB24L1_0xE8_BMP}, + {20, 16, 22, 1, 0, courB24L1_0xE9_BMP}, + {20, 16, 22, 1, 0, courB24L1_0xEA_BMP}, + {20, 16, 21, 1, 0, courB24L1_0xEB_BMP}, + {20, 15, 22, 2, 0, courB24L1_0xEC_BMP}, + {20, 15, 23, 2, 0, courB24L1_0xED_BMP}, + {20, 15, 22, 2, 0, courB24L1_0xEE_BMP}, + {20, 15, 21, 2, 0, courB24L1_0xEF_BMP}, + {20, 16, 21, 2, 0, courB24L1_0xF0_BMP}, + {20, 17, 21, 1, 0, courB24L1_0xF1_BMP}, + {20, 17, 21, 1, 0, courB24L1_0xF2_BMP}, + {20, 17, 22, 1, 0, courB24L1_0xF3_BMP}, + {20, 17, 22, 1, 0, courB24L1_0xF4_BMP}, + {20, 17, 21, 1, 0, courB24L1_0xF5_BMP}, + {20, 17, 21, 1, 0, courB24L1_0xF6_BMP}, + {20, 15, 15, 2, 2, courB24L1_0xF7_BMP}, + {20, 17, 18, 1, -2, courB24L1_0xF8_BMP}, + {20, 18, 22, 0, 0, courB24L1_0xF9_BMP}, + {20, 18, 22, 0, 0, courB24L1_0xFA_BMP}, + {20, 18, 22, 0, 0, courB24L1_0xFB_BMP}, + {20, 18, 21, 0, 0, courB24L1_0xFC_BMP}, + {20, 17, 29, 1, -7, courB24L1_0xFD_BMP}, + {20, 19, 28, 0, -7, courB24L1_0xFE_BMP}, + {20, 17, 28, 1, -7, courB24L1_0xFF_BMP} +}; + + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontCour24Bold_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontCour24Bold_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontCour24Bold_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontCour24Bold_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontCour24Bold_GetFontChar, + McuFontCour24Bold_FBBy, + McuFontCour24Bold_GetUnderlineBoxHeight(), + McuFontCour24Bold_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour24Bold_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour24Bold_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour24Bold_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour24Bold_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontCour24Bold. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour24Bold.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour24Bold.h new file mode 100644 index 0000000..f98dc9d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour24Bold.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour24Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour24Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 24 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour24Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour24Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour24Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour24Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour24Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontCour24Bold_Deinit(void); +** Init - void McuFontCour24Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour24Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour24Bold_module McuFontCour24Bold module documentation +** @{ +*/ + + +#ifndef __McuFontCour24Bold_H +#define __McuFontCour24Bold_H + +/* MODULE McuFontCour24Bold. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontCour24Boldconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontCour24Bold_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontCour24Bold_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontCour24Bold_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontCour24Bold_GetLineSpaceHeight() \ + 3 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontCour24Bold_GetUnderlineBoxHeight() \ + 11 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontCour24Bold_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontCour24Bold_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontCour24Bold. */ + +#endif +/* ifndef __McuFontCour24Bold_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour24Normal.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour24Normal.c new file mode 100644 index 0000000..60e8cee --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour24Normal.c @@ -0,0 +1,4715 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour24Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour24Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 24 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour24Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour24Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour24Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour24Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour24Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontCour24Normal_Deinit(void); +** Init - void McuFontCour24Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour24Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour24Normal_module McuFontCour24Normal module documentation +** @{ +*/ + +/* MODULE McuFontCour24Normal. */ + +#include "McuFontCour24Normal.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontCour24Normal_FBBy 34 + +static const uint8_t courR24L1_0x00_BMP[] = { + 0xAA, 0xAA, + 0x00, 0x00, + 0x80, 0x02, + 0x00, 0x00, + 0x80, 0x02, + 0x00, 0x00, + 0x80, 0x02, + 0x00, 0x00, + 0x80, 0x02, + 0x00, 0x00, + 0x80, 0x02, + 0x00, 0x00, + 0x80, 0x02, + 0x00, 0x00, + 0x80, 0x02, + 0x00, 0x00, + 0x80, 0x02, + 0x00, 0x00, + 0xAA, 0xAA +}; + +static const uint8_t courR24L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t courR24L1_0x21_BMP[] = { + 0x20, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x70, + 0xF8, + 0x70 +}; + +static const uint8_t courR24L1_0x22_BMP[] = { + 0xF1, 0xE0, + 0xF1, 0xE0, + 0xF1, 0xE0, + 0xF1, 0xE0, + 0xF1, 0xE0, + 0x60, 0xC0, + 0x60, 0xC0, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80 +}; + +static const uint8_t courR24L1_0x23_BMP[] = { + 0x04, 0x40, + 0x04, 0x40, + 0x04, 0x40, + 0x04, 0x40, + 0x0C, 0xC0, + 0x08, 0x80, + 0x08, 0x80, + 0x08, 0x80, + 0x7F, 0xF8, + 0x08, 0x80, + 0x08, 0x80, + 0x08, 0x80, + 0x08, 0x80, + 0x08, 0x80, + 0xFF, 0xF0, + 0x08, 0x80, + 0x08, 0x80, + 0x08, 0x80, + 0x09, 0x80, + 0x11, 0x00, + 0x11, 0x00, + 0x11, 0x00, + 0x11, 0x00 +}; + +static const uint8_t courR24L1_0x24_BMP[] = { + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x1F, 0x20, + 0x71, 0xE0, + 0x40, 0x60, + 0x80, 0x20, + 0x80, 0x00, + 0xC0, 0x00, + 0x60, 0x00, + 0x3C, 0x00, + 0x07, 0x80, + 0x00, 0xE0, + 0x00, 0x30, + 0x00, 0x10, + 0x00, 0x10, + 0x80, 0x30, + 0xC0, 0x60, + 0xF1, 0xC0, + 0x9F, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00 +}; + +static const uint8_t courR24L1_0x25_BMP[] = { + 0x1E, 0x00, + 0x33, 0x00, + 0x61, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x61, 0x80, + 0x33, 0x00, + 0x1E, 0x0E, + 0x00, 0x70, + 0x03, 0x80, + 0x1C, 0x00, + 0xE0, 0x00, + 0x01, 0xE0, + 0x03, 0x30, + 0x06, 0x18, + 0x04, 0x08, + 0x04, 0x08, + 0x06, 0x18, + 0x03, 0x30, + 0x01, 0xE0 +}; + +static const uint8_t courR24L1_0x26_BMP[] = { + 0x0F, 0xC0, + 0x19, 0x80, + 0x30, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x30, 0x00, + 0x10, 0x00, + 0x18, 0x00, + 0x3C, 0x00, + 0x64, 0x30, + 0x46, 0x60, + 0xC2, 0x40, + 0x83, 0x40, + 0xC1, 0xC0, + 0x41, 0x80, + 0x63, 0xC0, + 0x3E, 0x70 +}; + +static const uint8_t courR24L1_0x27_BMP[] = { + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t courR24L1_0x28_BMP[] = { + 0x08, + 0x18, + 0x10, + 0x30, + 0x20, + 0x60, + 0x60, + 0x40, + 0x40, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x40, + 0x40, + 0x60, + 0x60, + 0x20, + 0x30, + 0x10, + 0x18, + 0x08 +}; + +static const uint8_t courR24L1_0x29_BMP[] = { + 0x80, + 0xC0, + 0x40, + 0x60, + 0x20, + 0x30, + 0x30, + 0x10, + 0x10, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x10, + 0x10, + 0x30, + 0x30, + 0x20, + 0x60, + 0x40, + 0xC0, + 0x80 +}; + +static const uint8_t courR24L1_0x2A_BMP[] = { + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x84, 0x20, + 0xF5, 0xE0, + 0x1F, 0x00, + 0x0E, 0x00, + 0x0A, 0x00, + 0x1B, 0x00, + 0x31, 0x80, + 0x20, 0x80, + 0x60, 0xC0 +}; + +static const uint8_t courR24L1_0x2B_BMP[] = { + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0xFF, 0xFE, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00 +}; + +static const uint8_t courR24L1_0x2C_BMP[] = { + 0x3C, + 0x3C, + 0x78, + 0x78, + 0x60, + 0xE0, + 0xC0, + 0xC0, + 0x80 +}; + +static const uint8_t courR24L1_0x2D_BMP[] = { + 0xFF, 0xFE +}; + +static const uint8_t courR24L1_0x2E_BMP[] = { + 0x70, + 0xF8, + 0xF8, + 0x70 +}; + +static const uint8_t courR24L1_0x2F_BMP[] = { + 0x00, 0x20, + 0x00, 0x60, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0xC0, + 0x00, 0x80, + 0x01, 0x80, + 0x01, 0x00, + 0x03, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x06, 0x00, + 0x04, 0x00, + 0x0C, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x18, 0x00, + 0x10, 0x00, + 0x30, 0x00, + 0x20, 0x00, + 0x60, 0x00, + 0x40, 0x00, + 0x40, 0x00, + 0xC0, 0x00, + 0x80, 0x00 +}; + +static const uint8_t courR24L1_0x30_BMP[] = { + 0x1F, 0x00, + 0x31, 0x80, + 0x60, 0xC0, + 0x40, 0x40, + 0x40, 0x40, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0xC0, 0x60, + 0x40, 0x40, + 0x40, 0x40, + 0x60, 0xC0, + 0x31, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t courR24L1_0x31_BMP[] = { + 0x0C, 0x00, + 0x3C, 0x00, + 0xE4, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0xFF, 0xE0 +}; + +static const uint8_t courR24L1_0x32_BMP[] = { + 0x0F, 0xC0, + 0x30, 0x60, + 0x60, 0x10, + 0x40, 0x10, + 0x40, 0x10, + 0x00, 0x10, + 0x00, 0x30, + 0x00, 0x20, + 0x00, 0x60, + 0x00, 0xC0, + 0x01, 0x80, + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x18, 0x00, + 0x30, 0x00, + 0x60, 0x00, + 0xC0, 0x00, + 0x80, 0x08, + 0xFF, 0xF8 +}; + +static const uint8_t courR24L1_0x33_BMP[] = { + 0x0F, 0x80, + 0x38, 0xE0, + 0x60, 0x30, + 0x00, 0x10, + 0x00, 0x10, + 0x00, 0x10, + 0x00, 0x10, + 0x00, 0x20, + 0x00, 0x40, + 0x07, 0x80, + 0x00, 0x60, + 0x00, 0x10, + 0x00, 0x08, + 0x00, 0x08, + 0x00, 0x08, + 0x00, 0x08, + 0x00, 0x18, + 0xC0, 0x30, + 0x70, 0xE0, + 0x1F, 0x80 +}; + +static const uint8_t courR24L1_0x34_BMP[] = { + 0x00, 0xC0, + 0x01, 0x40, + 0x01, 0x40, + 0x02, 0x40, + 0x06, 0x40, + 0x04, 0x40, + 0x08, 0x40, + 0x18, 0x40, + 0x10, 0x40, + 0x20, 0x40, + 0x60, 0x40, + 0x40, 0x40, + 0x80, 0x40, + 0xFF, 0xF8, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x40, + 0x03, 0xF8 +}; + +static const uint8_t courR24L1_0x35_BMP[] = { + 0x3F, 0xF0, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x20, 0x00, + 0x27, 0x80, + 0x3C, 0xE0, + 0x20, 0x30, + 0x00, 0x10, + 0x00, 0x18, + 0x00, 0x08, + 0x00, 0x08, + 0x00, 0x08, + 0x00, 0x18, + 0xC0, 0x10, + 0x60, 0x30, + 0x38, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t courR24L1_0x36_BMP[] = { + 0x07, 0xC0, + 0x1C, 0x20, + 0x30, 0x00, + 0x20, 0x00, + 0x60, 0x00, + 0x40, 0x00, + 0xC0, 0x00, + 0x8F, 0x80, + 0xB8, 0xE0, + 0xA0, 0x20, + 0xC0, 0x30, + 0xC0, 0x10, + 0xC0, 0x10, + 0xC0, 0x10, + 0xC0, 0x10, + 0x40, 0x10, + 0x60, 0x30, + 0x20, 0x20, + 0x38, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t courR24L1_0x37_BMP[] = { + 0xFF, 0xE0, + 0x80, 0x20, + 0x80, 0x20, + 0x00, 0x60, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0xC0, + 0x00, 0x80, + 0x00, 0x80, + 0x01, 0x80, + 0x01, 0x00, + 0x01, 0x00, + 0x03, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x06, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00 +}; + +static const uint8_t courR24L1_0x38_BMP[] = { + 0x1F, 0x00, + 0x60, 0xC0, + 0x40, 0x40, + 0xC0, 0x60, + 0x80, 0x20, + 0x80, 0x20, + 0xC0, 0x60, + 0x40, 0x40, + 0x31, 0x80, + 0x1F, 0x00, + 0x71, 0xC0, + 0x40, 0x40, + 0xC0, 0x60, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0xC0, 0x60, + 0x40, 0x40, + 0x71, 0xC0, + 0x1F, 0x00 +}; + +static const uint8_t courR24L1_0x39_BMP[] = { + 0x1F, 0x00, + 0x70, 0xC0, + 0x40, 0x60, + 0xC0, 0x20, + 0x80, 0x30, + 0x80, 0x30, + 0x80, 0x30, + 0x80, 0x30, + 0xC0, 0x50, + 0x40, 0xD0, + 0x73, 0x90, + 0x1E, 0x10, + 0x00, 0x20, + 0x00, 0x20, + 0x00, 0x20, + 0x00, 0x40, + 0x00, 0xC0, + 0x01, 0x80, + 0x0E, 0x00, + 0x78, 0x00 +}; + +static const uint8_t courR24L1_0x3A_BMP[] = { + 0x70, + 0xF8, + 0xF8, + 0x70, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x70, + 0xF8, + 0xF8, + 0x70 +}; + +static const uint8_t courR24L1_0x3B_BMP[] = { + 0x1C, + 0x3E, + 0x3E, + 0x1C, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x3C, + 0x3C, + 0x78, + 0x70, + 0x70, + 0xE0, + 0xC0, + 0xC0, + 0x80 +}; + +static const uint8_t courR24L1_0x3C_BMP[] = { + 0x00, 0x02, + 0x00, 0x0E, + 0x00, 0x38, + 0x00, 0xE0, + 0x03, 0x80, + 0x06, 0x00, + 0x1C, 0x00, + 0x70, 0x00, + 0xC0, 0x00, + 0x70, 0x00, + 0x1C, 0x00, + 0x06, 0x00, + 0x03, 0x80, + 0x00, 0xE0, + 0x00, 0x38, + 0x00, 0x0E, + 0x00, 0x02 +}; + +static const uint8_t courR24L1_0x3D_BMP[] = { + 0xFF, 0xFE, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xFE +}; + +static const uint8_t courR24L1_0x3E_BMP[] = { + 0x80, 0x00, + 0xE0, 0x00, + 0x38, 0x00, + 0x0E, 0x00, + 0x03, 0x80, + 0x00, 0xC0, + 0x00, 0x70, + 0x00, 0x1C, + 0x00, 0x06, + 0x00, 0x1C, + 0x00, 0x70, + 0x00, 0xC0, + 0x03, 0x80, + 0x0E, 0x00, + 0x38, 0x00, + 0xE0, 0x00, + 0x80, 0x00 +}; + +static const uint8_t courR24L1_0x3F_BMP[] = { + 0x3F, 0x00, + 0xE1, 0xC0, + 0x80, 0x40, + 0x80, 0x40, + 0x00, 0x60, + 0x00, 0x20, + 0x00, 0x60, + 0x00, 0x40, + 0x01, 0xC0, + 0x07, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0E, 0x00, + 0x1F, 0x00, + 0x0E, 0x00 +}; + +static const uint8_t courR24L1_0x40_BMP[] = { + 0x0F, 0x80, + 0x18, 0xC0, + 0x30, 0x40, + 0x60, 0x60, + 0x40, 0x20, + 0xC0, 0x20, + 0x80, 0x20, + 0x80, 0xE0, + 0x83, 0xA0, + 0x86, 0x20, + 0x84, 0x20, + 0x84, 0x20, + 0x84, 0x20, + 0x86, 0x20, + 0x83, 0x20, + 0x81, 0xF0, + 0x80, 0x00, + 0xC0, 0x00, + 0x40, 0x00, + 0x60, 0x00, + 0x30, 0x00, + 0x18, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t courR24L1_0x41_BMP[] = { + 0x1F, 0xE0, 0x00, + 0x00, 0xA0, 0x00, + 0x00, 0xA0, 0x00, + 0x01, 0x10, 0x00, + 0x01, 0x10, 0x00, + 0x01, 0x10, 0x00, + 0x02, 0x08, 0x00, + 0x02, 0x08, 0x00, + 0x02, 0x08, 0x00, + 0x04, 0x04, 0x00, + 0x04, 0x04, 0x00, + 0x04, 0x04, 0x00, + 0x0F, 0xFE, 0x00, + 0x08, 0x02, 0x00, + 0x08, 0x02, 0x00, + 0x10, 0x01, 0x00, + 0x10, 0x01, 0x00, + 0x30, 0x01, 0x80, + 0xFE, 0x0F, 0xE0 +}; + +static const uint8_t courR24L1_0x42_BMP[] = { + 0xFF, 0xF0, + 0x10, 0x0C, + 0x10, 0x04, + 0x10, 0x06, + 0x10, 0x02, + 0x10, 0x02, + 0x10, 0x06, + 0x10, 0x04, + 0x10, 0x0C, + 0x1F, 0xF8, + 0x10, 0x06, + 0x10, 0x02, + 0x10, 0x03, + 0x10, 0x01, + 0x10, 0x01, + 0x10, 0x03, + 0x10, 0x02, + 0x10, 0x06, + 0xFF, 0xF8 +}; + +static const uint8_t courR24L1_0x43_BMP[] = { + 0x07, 0xC4, + 0x1C, 0x74, + 0x20, 0x0C, + 0x60, 0x04, + 0x40, 0x04, + 0xC0, 0x04, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0xC0, 0x00, + 0x40, 0x00, + 0x60, 0x04, + 0x20, 0x1C, + 0x1C, 0x70, + 0x07, 0xC0 +}; + +static const uint8_t courR24L1_0x44_BMP[] = { + 0xFF, 0xC0, + 0x20, 0x70, + 0x20, 0x18, + 0x20, 0x0C, + 0x20, 0x04, + 0x20, 0x06, + 0x20, 0x02, + 0x20, 0x02, + 0x20, 0x02, + 0x20, 0x02, + 0x20, 0x02, + 0x20, 0x02, + 0x20, 0x02, + 0x20, 0x06, + 0x20, 0x04, + 0x20, 0x0C, + 0x20, 0x18, + 0x20, 0x70, + 0xFF, 0xC0 +}; + +static const uint8_t courR24L1_0x45_BMP[] = { + 0xFF, 0xFC, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x44, + 0x10, 0x40, + 0x10, 0x40, + 0x1F, 0xC0, + 0x10, 0x40, + 0x10, 0x40, + 0x10, 0x40, + 0x10, 0x00, + 0x10, 0x02, + 0x10, 0x02, + 0x10, 0x02, + 0x10, 0x02, + 0x10, 0x02, + 0xFF, 0xFE +}; + +static const uint8_t courR24L1_0x46_BMP[] = { + 0xFF, 0xFE, + 0x10, 0x02, + 0x10, 0x02, + 0x10, 0x02, + 0x10, 0x02, + 0x10, 0x42, + 0x10, 0x40, + 0x10, 0x40, + 0x1F, 0xC0, + 0x10, 0x40, + 0x10, 0x40, + 0x10, 0x40, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0xFF, 0x80 +}; + +static const uint8_t courR24L1_0x47_BMP[] = { + 0x07, 0xC4, + 0x1C, 0x74, + 0x30, 0x0C, + 0x60, 0x04, + 0x40, 0x04, + 0xC0, 0x04, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0xFE, + 0x80, 0x04, + 0xC0, 0x04, + 0x40, 0x04, + 0x60, 0x04, + 0x30, 0x04, + 0x1C, 0x1C, + 0x07, 0xF0 +}; + +static const uint8_t courR24L1_0x48_BMP[] = { + 0xFC, 0x7E, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x3F, 0xF8, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0xFC, 0x7E +}; + +static const uint8_t courR24L1_0x49_BMP[] = { + 0xFF, 0xE0, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0xFF, 0xE0 +}; + +static const uint8_t courR24L1_0x4A_BMP[] = { + 0x0F, 0xFE, + 0x00, 0x20, + 0x00, 0x20, + 0x00, 0x20, + 0x00, 0x20, + 0x00, 0x20, + 0x00, 0x20, + 0x00, 0x20, + 0x00, 0x20, + 0x00, 0x20, + 0x00, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0xC0, 0x60, + 0x40, 0x40, + 0x61, 0xC0, + 0x1F, 0x00 +}; + +static const uint8_t courR24L1_0x4B_BMP[] = { + 0xFE, 0x1F, 0x80, + 0x10, 0x04, 0x00, + 0x10, 0x0C, 0x00, + 0x10, 0x08, 0x00, + 0x10, 0x10, 0x00, + 0x10, 0x30, 0x00, + 0x10, 0x40, 0x00, + 0x10, 0xC0, 0x00, + 0x13, 0x80, 0x00, + 0x1C, 0xC0, 0x00, + 0x10, 0x20, 0x00, + 0x10, 0x30, 0x00, + 0x10, 0x10, 0x00, + 0x10, 0x18, 0x00, + 0x10, 0x08, 0x00, + 0x10, 0x08, 0x00, + 0x10, 0x0C, 0x00, + 0x10, 0x04, 0x00, + 0xFE, 0x07, 0x80 +}; + +static const uint8_t courR24L1_0x4C_BMP[] = { + 0xFF, 0x80, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x02, + 0x08, 0x02, + 0x08, 0x02, + 0x08, 0x02, + 0x08, 0x02, + 0x08, 0x02, + 0xFF, 0xFE +}; + +static const uint8_t courR24L1_0x4D_BMP[] = { + 0xF8, 0x03, 0xE0, + 0x28, 0x02, 0x80, + 0x28, 0x02, 0x80, + 0x24, 0x04, 0x80, + 0x24, 0x04, 0x80, + 0x22, 0x08, 0x80, + 0x22, 0x08, 0x80, + 0x21, 0x10, 0x80, + 0x21, 0x10, 0x80, + 0x21, 0x10, 0x80, + 0x20, 0xA0, 0x80, + 0x20, 0xA0, 0x80, + 0x20, 0x40, 0x80, + 0x20, 0x40, 0x80, + 0x20, 0x00, 0x80, + 0x20, 0x00, 0x80, + 0x20, 0x00, 0x80, + 0x20, 0x00, 0x80, + 0xFE, 0x07, 0xE0 +}; + +static const uint8_t courR24L1_0x4E_BMP[] = { + 0xF8, 0x1F, 0xC0, + 0x1C, 0x01, 0x00, + 0x14, 0x01, 0x00, + 0x12, 0x01, 0x00, + 0x12, 0x01, 0x00, + 0x11, 0x01, 0x00, + 0x10, 0x81, 0x00, + 0x10, 0x81, 0x00, + 0x10, 0x41, 0x00, + 0x10, 0x41, 0x00, + 0x10, 0x21, 0x00, + 0x10, 0x21, 0x00, + 0x10, 0x11, 0x00, + 0x10, 0x11, 0x00, + 0x10, 0x09, 0x00, + 0x10, 0x09, 0x00, + 0x10, 0x05, 0x00, + 0x10, 0x07, 0x00, + 0x7F, 0x03, 0x00 +}; + +static const uint8_t courR24L1_0x4F_BMP[] = { + 0x07, 0xC0, + 0x18, 0x30, + 0x30, 0x18, + 0x60, 0x0C, + 0x40, 0x04, + 0xC0, 0x06, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0xC0, 0x06, + 0x40, 0x04, + 0x60, 0x0C, + 0x30, 0x18, + 0x18, 0x30, + 0x07, 0xC0 +}; + +static const uint8_t courR24L1_0x50_BMP[] = { + 0xFF, 0xE0, + 0x10, 0x38, + 0x10, 0x04, + 0x10, 0x06, + 0x10, 0x02, + 0x10, 0x02, + 0x10, 0x02, + 0x10, 0x06, + 0x10, 0x04, + 0x10, 0x38, + 0x1F, 0xE0, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0xFF, 0xC0 +}; + +static const uint8_t courR24L1_0x51_BMP[] = { + 0x07, 0xC0, + 0x1C, 0x70, + 0x30, 0x18, + 0x60, 0x0C, + 0x40, 0x04, + 0xC0, 0x06, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0xC0, 0x06, + 0x40, 0x04, + 0x60, 0x0C, + 0x38, 0x38, + 0x0C, 0x60, + 0x07, 0xC0, + 0x02, 0x00, + 0x0F, 0xC6, + 0x18, 0x7C +}; + +static const uint8_t courR24L1_0x52_BMP[] = { + 0xFF, 0xE0, 0x00, + 0x10, 0x38, 0x00, + 0x10, 0x04, 0x00, + 0x10, 0x06, 0x00, + 0x10, 0x02, 0x00, + 0x10, 0x02, 0x00, + 0x10, 0x06, 0x00, + 0x10, 0x04, 0x00, + 0x10, 0x18, 0x00, + 0x1F, 0xE0, 0x00, + 0x10, 0x60, 0x00, + 0x10, 0x30, 0x00, + 0x10, 0x18, 0x00, + 0x10, 0x0C, 0x00, + 0x10, 0x04, 0x00, + 0x10, 0x06, 0x00, + 0x10, 0x02, 0x00, + 0x10, 0x03, 0x00, + 0xFE, 0x01, 0xC0 +}; + +static const uint8_t courR24L1_0x53_BMP[] = { + 0x0F, 0x90, + 0x38, 0xD0, + 0x60, 0x30, + 0x40, 0x30, + 0x40, 0x10, + 0x40, 0x10, + 0x40, 0x00, + 0x60, 0x00, + 0x38, 0x00, + 0x0F, 0x00, + 0x01, 0xC0, + 0x00, 0x60, + 0x00, 0x30, + 0x80, 0x10, + 0x80, 0x10, + 0xC0, 0x10, + 0xE0, 0x30, + 0xB8, 0xE0, + 0x8F, 0x80 +}; + +static const uint8_t courR24L1_0x54_BMP[] = { + 0xFF, 0xFE, + 0x81, 0x02, + 0x81, 0x02, + 0x81, 0x02, + 0x81, 0x02, + 0x81, 0x02, + 0x81, 0x02, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x3F, 0xF8 +}; + +static const uint8_t courR24L1_0x55_BMP[] = { + 0xFE, 0x3F, 0x80, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x30, 0x06, 0x00, + 0x10, 0x04, 0x00, + 0x18, 0x0C, 0x00, + 0x0E, 0x38, 0x00, + 0x03, 0xE0, 0x00 +}; + +static const uint8_t courR24L1_0x56_BMP[] = { + 0xFE, 0x0F, 0xE0, + 0x30, 0x01, 0x80, + 0x10, 0x01, 0x00, + 0x10, 0x01, 0x00, + 0x18, 0x03, 0x00, + 0x08, 0x02, 0x00, + 0x08, 0x02, 0x00, + 0x0C, 0x06, 0x00, + 0x04, 0x04, 0x00, + 0x04, 0x04, 0x00, + 0x06, 0x0C, 0x00, + 0x02, 0x08, 0x00, + 0x03, 0x18, 0x00, + 0x01, 0x10, 0x00, + 0x01, 0x10, 0x00, + 0x00, 0xA0, 0x00, + 0x00, 0xA0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0x40, 0x00 +}; + +static const uint8_t courR24L1_0x57_BMP[] = { + 0xFC, 0x1F, 0x80, + 0x40, 0x01, 0x00, + 0x40, 0x01, 0x00, + 0x40, 0x01, 0x00, + 0x40, 0x01, 0x00, + 0x61, 0xC3, 0x00, + 0x21, 0x42, 0x00, + 0x21, 0x42, 0x00, + 0x22, 0x22, 0x00, + 0x22, 0x22, 0x00, + 0x22, 0x22, 0x00, + 0x22, 0x22, 0x00, + 0x26, 0x32, 0x00, + 0x24, 0x12, 0x00, + 0x34, 0x16, 0x00, + 0x14, 0x14, 0x00, + 0x14, 0x14, 0x00, + 0x18, 0x0C, 0x00, + 0x18, 0x0C, 0x00 +}; + +static const uint8_t courR24L1_0x58_BMP[] = { + 0x7C, 0x1F, 0x00, + 0x30, 0x06, 0x00, + 0x10, 0x04, 0x00, + 0x18, 0x0C, 0x00, + 0x08, 0x08, 0x00, + 0x04, 0x10, 0x00, + 0x02, 0x20, 0x00, + 0x03, 0x60, 0x00, + 0x01, 0xC0, 0x00, + 0x00, 0x80, 0x00, + 0x01, 0xC0, 0x00, + 0x02, 0x20, 0x00, + 0x04, 0x10, 0x00, + 0x0C, 0x18, 0x00, + 0x08, 0x08, 0x00, + 0x10, 0x04, 0x00, + 0x30, 0x06, 0x00, + 0x60, 0x03, 0x00, + 0xFC, 0x1F, 0x80 +}; + +static const uint8_t courR24L1_0x59_BMP[] = { + 0xF8, 0x3E, + 0x60, 0x0C, + 0x30, 0x18, + 0x10, 0x10, + 0x18, 0x30, + 0x08, 0x20, + 0x04, 0x40, + 0x06, 0xC0, + 0x02, 0x80, + 0x03, 0x80, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x1F, 0xF0 +}; + +static const uint8_t courR24L1_0x5A_BMP[] = { + 0x7F, 0xF0, + 0x40, 0x10, + 0x40, 0x30, + 0x40, 0x20, + 0x40, 0x60, + 0x40, 0xC0, + 0x00, 0x80, + 0x01, 0x80, + 0x03, 0x00, + 0x06, 0x00, + 0x04, 0x00, + 0x0C, 0x00, + 0x18, 0x08, + 0x10, 0x08, + 0x30, 0x08, + 0x60, 0x08, + 0x40, 0x08, + 0xC0, 0x08, + 0xFF, 0xF8 +}; + +static const uint8_t courR24L1_0x5B_BMP[] = { + 0xF8, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0xF8 +}; + +static const uint8_t courR24L1_0x5C_BMP[] = { + 0x80, 0x00, + 0xC0, 0x00, + 0x40, 0x00, + 0x40, 0x00, + 0x60, 0x00, + 0x20, 0x00, + 0x30, 0x00, + 0x10, 0x00, + 0x18, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x0C, 0x00, + 0x04, 0x00, + 0x06, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x03, 0x00, + 0x01, 0x00, + 0x01, 0x80, + 0x00, 0x80, + 0x00, 0xC0, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x60, + 0x00, 0x20 +}; + +static const uint8_t courR24L1_0x5D_BMP[] = { + 0xF8, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0x08, + 0xF8 +}; + +static const uint8_t courR24L1_0x5E_BMP[] = { + 0x04, 0x00, + 0x0E, 0x00, + 0x1B, 0x00, + 0x11, 0x00, + 0x31, 0x80, + 0x60, 0xC0, + 0x40, 0x40, + 0xC0, 0x60, + 0x80, 0x20 +}; + +static const uint8_t courR24L1_0x5F_BMP[] = { + 0xFF, 0xFF, 0xE0 +}; + +static const uint8_t courR24L1_0x60_BMP[] = { + 0xC0, + 0x60, + 0x30, + 0x18, + 0x0C +}; + +static const uint8_t courR24L1_0x61_BMP[] = { + 0x0F, 0x80, + 0x38, 0xE0, + 0x00, 0x20, + 0x00, 0x30, + 0x00, 0x10, + 0x00, 0x10, + 0x1F, 0xF0, + 0x70, 0x30, + 0xC0, 0x10, + 0x80, 0x10, + 0x80, 0x10, + 0x80, 0x30, + 0xC0, 0xF0, + 0x7F, 0x9E +}; + +static const uint8_t courR24L1_0x62_BMP[] = { + 0xF0, 0x00, 0x00, + 0x10, 0x00, 0x00, + 0x10, 0x00, 0x00, + 0x10, 0x00, 0x00, + 0x10, 0x00, 0x00, + 0x10, 0x00, 0x00, + 0x11, 0xF8, 0x00, + 0x17, 0x0E, 0x00, + 0x14, 0x03, 0x00, + 0x18, 0x01, 0x00, + 0x18, 0x01, 0x80, + 0x10, 0x00, 0x80, + 0x10, 0x00, 0x80, + 0x10, 0x00, 0x80, + 0x10, 0x00, 0x80, + 0x18, 0x01, 0x80, + 0x18, 0x01, 0x00, + 0x14, 0x03, 0x00, + 0x17, 0x0E, 0x00, + 0xF1, 0xF8, 0x00 +}; + +static const uint8_t courR24L1_0x63_BMP[] = { + 0x0F, 0x88, + 0x38, 0xF8, + 0x60, 0x18, + 0x40, 0x08, + 0xC0, 0x08, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0xC0, 0x00, + 0x40, 0x0C, + 0x60, 0x18, + 0x38, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t courR24L1_0x64_BMP[] = { + 0x00, 0x3C, 0x00, + 0x00, 0x04, 0x00, + 0x00, 0x04, 0x00, + 0x00, 0x04, 0x00, + 0x00, 0x04, 0x00, + 0x00, 0x04, 0x00, + 0x0F, 0xC4, 0x00, + 0x38, 0x74, 0x00, + 0x60, 0x14, 0x00, + 0x40, 0x0C, 0x00, + 0xC0, 0x0C, 0x00, + 0x80, 0x04, 0x00, + 0x80, 0x04, 0x00, + 0x80, 0x04, 0x00, + 0x80, 0x04, 0x00, + 0xC0, 0x0C, 0x00, + 0x40, 0x0C, 0x00, + 0x60, 0x14, 0x00, + 0x38, 0x74, 0x00, + 0x0F, 0xC7, 0x80 +}; + +static const uint8_t courR24L1_0x65_BMP[] = { + 0x0F, 0xC0, + 0x38, 0x70, + 0x60, 0x18, + 0x40, 0x08, + 0xC0, 0x0C, + 0x80, 0x04, + 0xFF, 0xFC, + 0x80, 0x00, + 0x80, 0x00, + 0xC0, 0x00, + 0x40, 0x00, + 0x60, 0x0C, + 0x38, 0x38, + 0x0F, 0xE0 +}; + +static const uint8_t courR24L1_0x66_BMP[] = { + 0x03, 0xE0, + 0x06, 0x18, + 0x04, 0x00, + 0x0C, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0xFF, 0xF0, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0xFF, 0xF0 +}; + +static const uint8_t courR24L1_0x67_BMP[] = { + 0x0F, 0xC7, 0x80, + 0x38, 0x74, 0x00, + 0x60, 0x14, 0x00, + 0x40, 0x0C, 0x00, + 0xC0, 0x0C, 0x00, + 0x80, 0x04, 0x00, + 0x80, 0x04, 0x00, + 0x80, 0x04, 0x00, + 0x80, 0x04, 0x00, + 0xC0, 0x0C, 0x00, + 0x40, 0x0C, 0x00, + 0x60, 0x14, 0x00, + 0x38, 0x74, 0x00, + 0x0F, 0xC4, 0x00, + 0x00, 0x04, 0x00, + 0x00, 0x04, 0x00, + 0x00, 0x0C, 0x00, + 0x00, 0x08, 0x00, + 0x00, 0x38, 0x00, + 0x0F, 0xE0, 0x00 +}; + +static const uint8_t courR24L1_0x68_BMP[] = { + 0xF0, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x11, 0xE0, + 0x17, 0x38, + 0x14, 0x08, + 0x18, 0x0C, + 0x18, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x7C, 0x1F +}; + +static const uint8_t courR24L1_0x69_BMP[] = { + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x7E, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0xFF, 0xF8 +}; + +static const uint8_t courR24L1_0x6A_BMP[] = { + 0x01, 0x80, + 0x01, 0x80, + 0x01, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xC0, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0xC0, + 0x00, 0x80, + 0x03, 0x80, + 0xFE, 0x00 +}; + +static const uint8_t courR24L1_0x6B_BMP[] = { + 0xF0, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0xFC, + 0x10, 0x30, + 0x10, 0x60, + 0x10, 0xC0, + 0x11, 0x80, + 0x13, 0x00, + 0x1E, 0x00, + 0x13, 0x00, + 0x11, 0x80, + 0x10, 0xC0, + 0x10, 0x60, + 0x10, 0x30, + 0x10, 0x18, + 0xF0, 0x3E +}; + +static const uint8_t courR24L1_0x6C_BMP[] = { + 0x7E, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0xFF, 0xF8 +}; + +static const uint8_t courR24L1_0x6D_BMP[] = { + 0xE7, 0x0E, 0x00, + 0x29, 0x93, 0x00, + 0x30, 0xE1, 0x80, + 0x30, 0x60, 0x80, + 0x20, 0x40, 0x80, + 0x20, 0x40, 0x80, + 0x20, 0x40, 0x80, + 0x20, 0x40, 0x80, + 0x20, 0x40, 0x80, + 0x20, 0x40, 0x80, + 0x20, 0x40, 0x80, + 0x20, 0x40, 0x80, + 0x20, 0x40, 0x80, + 0xF8, 0x70, 0xE0 +}; + +static const uint8_t courR24L1_0x6E_BMP[] = { + 0xE3, 0xC0, + 0x2E, 0x70, + 0x28, 0x10, + 0x30, 0x18, + 0x30, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0xF8, 0x3E +}; + +static const uint8_t courR24L1_0x6F_BMP[] = { + 0x0F, 0xE0, + 0x38, 0x38, + 0x60, 0x0C, + 0x40, 0x04, + 0xC0, 0x06, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0xC0, 0x06, + 0x40, 0x04, + 0x60, 0x0C, + 0x38, 0x38, + 0x0F, 0xE0 +}; + +static const uint8_t courR24L1_0x70_BMP[] = { + 0x01, 0xF8, 0x00, + 0xF7, 0x0E, 0x00, + 0x14, 0x03, 0x00, + 0x18, 0x01, 0x00, + 0x18, 0x01, 0x80, + 0x10, 0x00, 0x80, + 0x10, 0x00, 0x80, + 0x10, 0x00, 0x80, + 0x10, 0x00, 0x80, + 0x18, 0x01, 0x80, + 0x18, 0x01, 0x00, + 0x14, 0x03, 0x00, + 0x17, 0x0E, 0x00, + 0x11, 0xF8, 0x00, + 0x10, 0x00, 0x00, + 0x10, 0x00, 0x00, + 0x10, 0x00, 0x00, + 0x10, 0x00, 0x00, + 0x10, 0x00, 0x00, + 0xFF, 0x00, 0x00 +}; + +static const uint8_t courR24L1_0x71_BMP[] = { + 0x0F, 0xC0, 0x00, + 0x38, 0x77, 0x80, + 0x60, 0x1C, 0x00, + 0x40, 0x0C, 0x00, + 0xC0, 0x0C, 0x00, + 0x80, 0x04, 0x00, + 0x80, 0x04, 0x00, + 0x80, 0x04, 0x00, + 0x80, 0x04, 0x00, + 0xC0, 0x0C, 0x00, + 0x40, 0x0C, 0x00, + 0x60, 0x1C, 0x00, + 0x38, 0x74, 0x00, + 0x0F, 0xC4, 0x00, + 0x00, 0x04, 0x00, + 0x00, 0x04, 0x00, + 0x00, 0x04, 0x00, + 0x00, 0x04, 0x00, + 0x00, 0x04, 0x00, + 0x00, 0x7F, 0x80 +}; + +static const uint8_t courR24L1_0x72_BMP[] = { + 0x78, 0x7C, + 0x09, 0xC6, + 0x0B, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0xFF, 0xF0 +}; + +static const uint8_t courR24L1_0x73_BMP[] = { + 0x0F, 0x90, + 0x38, 0xF0, + 0x60, 0x30, + 0x40, 0x10, + 0x60, 0x00, + 0x38, 0x00, + 0x0F, 0x80, + 0x00, 0xE0, + 0x00, 0x30, + 0x80, 0x18, + 0x80, 0x18, + 0xC0, 0x30, + 0xF8, 0xE0, + 0x8F, 0x80 +}; + +static const uint8_t courR24L1_0x74_BMP[] = { + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0xFF, 0xF0, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x18, 0x0C, + 0x0C, 0x38, + 0x07, 0xE0 +}; + +static const uint8_t courR24L1_0x75_BMP[] = { + 0xF0, 0x3C, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x0C, + 0x18, 0x0C, + 0x0C, 0x34, + 0x07, 0xE7 +}; + +static const uint8_t courR24L1_0x76_BMP[] = { + 0xFC, 0x1F, 0x80, + 0x30, 0x06, 0x00, + 0x10, 0x04, 0x00, + 0x10, 0x04, 0x00, + 0x18, 0x0C, 0x00, + 0x08, 0x08, 0x00, + 0x0C, 0x18, 0x00, + 0x04, 0x10, 0x00, + 0x04, 0x10, 0x00, + 0x06, 0x30, 0x00, + 0x02, 0x20, 0x00, + 0x03, 0x60, 0x00, + 0x01, 0x40, 0x00, + 0x01, 0xC0, 0x00 +}; + +static const uint8_t courR24L1_0x77_BMP[] = { + 0xF8, 0x0F, 0x80, + 0x60, 0x03, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x21, 0xC2, 0x00, + 0x21, 0x42, 0x00, + 0x31, 0x46, 0x00, + 0x13, 0x64, 0x00, + 0x12, 0x24, 0x00, + 0x12, 0x24, 0x00, + 0x16, 0x34, 0x00, + 0x1C, 0x1C, 0x00, + 0x08, 0x08, 0x00, + 0x08, 0x08, 0x00 +}; + +static const uint8_t courR24L1_0x78_BMP[] = { + 0xF8, 0x3E, + 0x60, 0x0C, + 0x30, 0x18, + 0x18, 0x30, + 0x0C, 0x60, + 0x06, 0xC0, + 0x03, 0x80, + 0x03, 0x80, + 0x06, 0xC0, + 0x0C, 0x60, + 0x18, 0x30, + 0x30, 0x18, + 0x60, 0x0C, + 0xF8, 0x3E +}; + +static const uint8_t courR24L1_0x79_BMP[] = { + 0xF8, 0x3E, + 0x40, 0x04, + 0x60, 0x0C, + 0x20, 0x08, + 0x30, 0x18, + 0x10, 0x10, + 0x18, 0x30, + 0x08, 0x20, + 0x0C, 0x60, + 0x04, 0x40, + 0x06, 0xC0, + 0x02, 0x80, + 0x03, 0x80, + 0x01, 0x00, + 0x03, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x06, 0x00, + 0x04, 0x00, + 0xFF, 0x80 +}; + +static const uint8_t courR24L1_0x7A_BMP[] = { + 0xFF, 0xE0, + 0x80, 0x60, + 0x80, 0xC0, + 0x81, 0x80, + 0x03, 0x00, + 0x06, 0x00, + 0x04, 0x00, + 0x0C, 0x00, + 0x18, 0x00, + 0x30, 0x00, + 0x60, 0x20, + 0x40, 0x20, + 0xC0, 0x20, + 0xFF, 0xE0 +}; + +static const uint8_t courR24L1_0x7B_BMP[] = { + 0x06, + 0x0C, + 0x18, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x30, + 0x60, + 0xE0, + 0x30, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x18, + 0x0E +}; + +static const uint8_t courR24L1_0x7C_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t courR24L1_0x7D_BMP[] = { + 0xC0, + 0x60, + 0x30, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x18, + 0x0C, + 0x0E, + 0x18, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x30, + 0xE0 +}; + +static const uint8_t courR24L1_0x7E_BMP[] = { + 0x18, 0x00, + 0x7C, 0x08, + 0xC7, 0x18, + 0x81, 0xB0, + 0x00, 0xE0 +}; + +static const uint8_t courR24L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t courR24L1_0xA1_BMP[] = { + 0x70, + 0xF8, + 0x70, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x20 +}; + +static const uint8_t courR24L1_0xA2_BMP[] = { + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x1F, 0x80, + 0x30, 0xE0, + 0x60, 0x20, + 0xC0, 0x20, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0xC0, 0x00, + 0x60, 0x20, + 0x30, 0xE0, + 0x1F, 0x80, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00 +}; + +static const uint8_t courR24L1_0xA3_BMP[] = { + 0x03, 0xE0, + 0x0C, 0x30, + 0x08, 0x18, + 0x18, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x18, 0x00, + 0x08, 0x00, + 0xFF, 0x80, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x18, 0x00, + 0x10, 0x04, + 0x30, 0x0C, + 0x7F, 0xF8 +}; + +static const uint8_t courR24L1_0xA4_BMP[] = { + 0xC0, 0x18, + 0x6F, 0xB0, + 0x38, 0xE0, + 0x20, 0x20, + 0x60, 0x30, + 0x40, 0x10, + 0x40, 0x10, + 0x40, 0x10, + 0x60, 0x30, + 0x20, 0x20, + 0x38, 0xE0, + 0x6F, 0xB0, + 0xC0, 0x18 +}; + +static const uint8_t courR24L1_0xA5_BMP[] = { + 0xF8, 0x3E, + 0x60, 0x0C, + 0x30, 0x18, + 0x10, 0x10, + 0x18, 0x30, + 0x08, 0x20, + 0x0C, 0x60, + 0x06, 0xC0, + 0x02, 0x80, + 0x03, 0x80, + 0x3F, 0xF8, + 0x01, 0x00, + 0x01, 0x00, + 0x3F, 0xF8, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x1F, 0xF0 +}; + +static const uint8_t courR24L1_0xA6_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x00, + 0x00, + 0x00, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t courR24L1_0xA7_BMP[] = { + 0x07, 0xF8, + 0x1C, 0x08, + 0x10, 0x08, + 0x10, 0x08, + 0x10, 0x00, + 0x18, 0x00, + 0x7C, 0x00, + 0xC6, 0x00, + 0x83, 0x00, + 0x81, 0xC0, + 0xC0, 0x60, + 0x70, 0x38, + 0x18, 0x0C, + 0x0C, 0x04, + 0x07, 0x04, + 0x01, 0x84, + 0x00, 0xFC, + 0x00, 0x60, + 0x00, 0x20, + 0x40, 0x20, + 0x40, 0x20, + 0x40, 0xE0, + 0x7F, 0x80 +}; + +static const uint8_t courR24L1_0xA8_BMP[] = { + 0x61, 0x80, + 0xF3, 0xC0, + 0x61, 0x80 +}; + +static const uint8_t courR24L1_0xA9_BMP[] = { + 0x01, 0xF0, 0x00, + 0x07, 0x1C, 0x00, + 0x1C, 0x07, 0x00, + 0x30, 0x01, 0x80, + 0x21, 0xE8, 0x80, + 0x63, 0x18, 0xC0, + 0x46, 0x08, 0x40, + 0xCC, 0x08, 0x60, + 0x88, 0x00, 0x20, + 0x88, 0x00, 0x20, + 0x88, 0x00, 0x20, + 0x8C, 0x00, 0x20, + 0xC6, 0x0C, 0x60, + 0x43, 0x18, 0x40, + 0x61, 0xF0, 0xC0, + 0x30, 0x01, 0x80, + 0x18, 0x03, 0x00, + 0x0F, 0x1E, 0x00, + 0x01, 0xF0, 0x00 +}; + +static const uint8_t courR24L1_0xAA_BMP[] = { + 0x3C, 0x00, + 0x66, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x7E, 0x00, + 0xC6, 0x00, + 0x82, 0x00, + 0xCE, 0x00, + 0x7B, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0x80 +}; + +static const uint8_t courR24L1_0xAB_BMP[] = { + 0x01, 0x83, + 0x03, 0x06, + 0x06, 0x0C, + 0x0C, 0x18, + 0x18, 0x30, + 0x30, 0x60, + 0x60, 0xC0, + 0xE1, 0xC0, + 0x60, 0xC0, + 0x30, 0x60, + 0x18, 0x30, + 0x0C, 0x18, + 0x06, 0x0C, + 0x03, 0x06 +}; + +static const uint8_t courR24L1_0xAC_BMP[] = { + 0xFF, 0xFC, + 0x00, 0x04, + 0x00, 0x04, + 0x00, 0x04, + 0x00, 0x04, + 0x00, 0x04 +}; + +static const uint8_t courR24L1_0xAD_BMP[] = { + 0xFF, 0xFE +}; + +static const uint8_t courR24L1_0xAE_BMP[] = { + 0x03, 0xF8, 0x00, + 0x0E, 0x0E, 0x00, + 0x18, 0x03, 0x00, + 0x30, 0x01, 0x80, + 0x67, 0xE0, 0xC0, + 0x42, 0x30, 0x40, + 0xC2, 0x18, 0x60, + 0x82, 0x08, 0x20, + 0x82, 0x08, 0x20, + 0x82, 0x18, 0x20, + 0x82, 0x30, 0x20, + 0x83, 0xE0, 0x20, + 0xC2, 0x30, 0x60, + 0x42, 0x18, 0x40, + 0x67, 0x0C, 0xC0, + 0x30, 0x01, 0x80, + 0x18, 0x03, 0x00, + 0x0E, 0x0E, 0x00, + 0x03, 0xF8, 0x00 +}; + +static const uint8_t courR24L1_0xAF_BMP[] = { + 0xFF, 0x80, + 0xFF, 0x80 +}; + +static const uint8_t courR24L1_0xB0_BMP[] = { + 0x3E, 0x00, + 0x63, 0x00, + 0x41, 0x00, + 0xC1, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0xC1, 0x80, + 0x41, 0x00, + 0x63, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t courR24L1_0xB1_BMP[] = { + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0xFF, 0xFE, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xFE +}; + +static const uint8_t courR24L1_0xB2_BMP[] = { + 0x3C, + 0x66, + 0x43, + 0xC1, + 0x03, + 0x02, + 0x06, + 0x0C, + 0x18, + 0x10, + 0x30, + 0x60, + 0xC1, + 0xFF +}; + +static const uint8_t courR24L1_0xB3_BMP[] = { + 0x3C, + 0x66, + 0xC3, + 0x01, + 0x01, + 0x06, + 0x1C, + 0x06, + 0x03, + 0x01, + 0x01, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t courR24L1_0xB4_BMP[] = { + 0x0C, + 0x18, + 0x30, + 0x60, + 0xC0 +}; + +static const uint8_t courR24L1_0xB5_BMP[] = { + 0xF0, 0x3C, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x18, 0x0C, + 0x18, 0x1C, + 0x1C, 0x34, + 0x17, 0xE7, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00 +}; + +static const uint8_t courR24L1_0xB6_BMP[] = { + 0x0F, 0xFE, + 0x39, 0x10, + 0x71, 0x10, + 0x61, 0x10, + 0xE1, 0x10, + 0xC1, 0x10, + 0xC1, 0x10, + 0xE1, 0x10, + 0x61, 0x10, + 0x71, 0x10, + 0x3D, 0x10, + 0x0F, 0x10, + 0x01, 0x10, + 0x01, 0x10, + 0x01, 0x10, + 0x01, 0x10, + 0x01, 0x10, + 0x01, 0x10, + 0x01, 0x10, + 0x01, 0x10, + 0x01, 0x10, + 0x01, 0x10, + 0x1F, 0xBE +}; + +static const uint8_t courR24L1_0xB7_BMP[] = { + 0x70, + 0xF8, + 0xF8, + 0x70 +}; + +static const uint8_t courR24L1_0xB8_BMP[] = { + 0x20, + 0x20, + 0x30, + 0x98, + 0xF0 +}; + +static const uint8_t courR24L1_0xB9_BMP[] = { + 0x70, + 0xD0, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0xFE +}; + +static const uint8_t courR24L1_0xBA_BMP[] = { + 0x1C, 0x00, + 0x77, 0x00, + 0x41, 0x00, + 0xC1, 0x80, + 0x80, 0x80, + 0xC1, 0x80, + 0x41, 0x00, + 0x77, 0x00, + 0x1C, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0x80 +}; + +static const uint8_t courR24L1_0xBB_BMP[] = { + 0xC1, 0x80, + 0x60, 0xC0, + 0x30, 0x60, + 0x18, 0x30, + 0x0C, 0x18, + 0x06, 0x0C, + 0x03, 0x06, + 0x03, 0x87, + 0x03, 0x06, + 0x06, 0x0C, + 0x0C, 0x18, + 0x18, 0x30, + 0x30, 0x60, + 0x60, 0xC0 +}; + +static const uint8_t courR24L1_0xBC_BMP[] = { + 0x30, 0x00, 0xC0, + 0xF0, 0x00, 0x80, + 0x10, 0x01, 0x80, + 0x10, 0x03, 0x00, + 0x10, 0x02, 0x00, + 0x10, 0x06, 0x00, + 0x10, 0x0C, 0x00, + 0x10, 0x08, 0x00, + 0x10, 0x18, 0x00, + 0x10, 0x30, 0x00, + 0x10, 0x23, 0x00, + 0x10, 0x67, 0x00, + 0xFE, 0xC5, 0x00, + 0x00, 0x8D, 0x00, + 0x01, 0x99, 0x00, + 0x03, 0x11, 0x00, + 0x02, 0x31, 0x00, + 0x06, 0x3F, 0x80, + 0x0C, 0x01, 0x00, + 0x08, 0x01, 0x00, + 0x18, 0x07, 0x80 +}; + +static const uint8_t courR24L1_0xBD_BMP[] = { + 0x30, 0x00, 0x80, + 0xF0, 0x01, 0x80, + 0x10, 0x03, 0x00, + 0x10, 0x06, 0x00, + 0x10, 0x04, 0x00, + 0x10, 0x0C, 0x00, + 0x10, 0x18, 0x00, + 0x10, 0x10, 0x00, + 0x10, 0x30, 0x00, + 0x10, 0x60, 0x00, + 0x10, 0x47, 0x80, + 0x10, 0xCC, 0xC0, + 0xFD, 0x98, 0x40, + 0x03, 0x00, 0xC0, + 0x02, 0x00, 0x80, + 0x06, 0x01, 0x80, + 0x0C, 0x07, 0x00, + 0x08, 0x0C, 0x00, + 0x18, 0x18, 0x00, + 0x30, 0x30, 0x00, + 0x60, 0x3F, 0xC0 +}; + +static const uint8_t courR24L1_0xBE_BMP[] = { + 0x3C, 0x00, 0x00, + 0x66, 0x00, 0x60, + 0x03, 0x00, 0xC0, + 0x03, 0x01, 0x80, + 0x06, 0x03, 0x00, + 0x1C, 0x06, 0x00, + 0x06, 0x0C, 0x00, + 0x03, 0x08, 0x00, + 0x01, 0x18, 0x00, + 0x01, 0x30, 0x00, + 0xC3, 0x21, 0x80, + 0x66, 0x63, 0x80, + 0x3C, 0xC2, 0x80, + 0x01, 0x86, 0x80, + 0x01, 0x0C, 0x80, + 0x03, 0x08, 0x80, + 0x06, 0x18, 0x80, + 0x0C, 0x1F, 0xC0, + 0x18, 0x00, 0x80, + 0x30, 0x00, 0x80, + 0x00, 0x03, 0xC0 +}; + +static const uint8_t courR24L1_0xBF_BMP[] = { + 0x0E, 0x00, + 0x1F, 0x00, + 0x0E, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x0C, 0x00, + 0x18, 0x00, + 0x70, 0x00, + 0x40, 0x00, + 0xC0, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0xC0, 0x20, + 0x60, 0x20, + 0x31, 0xE0, + 0x1F, 0x00 +}; + +static const uint8_t courR24L1_0xC0_BMP[] = { + 0x06, 0x00, 0x00, + 0x03, 0x00, 0x00, + 0x01, 0x80, 0x00, + 0x00, 0xC0, 0x00, + 0x00, 0x60, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x1F, 0xE0, 0x00, + 0x00, 0xA0, 0x00, + 0x01, 0xB0, 0x00, + 0x01, 0x10, 0x00, + 0x01, 0x10, 0x00, + 0x03, 0x18, 0x00, + 0x02, 0x08, 0x00, + 0x02, 0x08, 0x00, + 0x06, 0x0C, 0x00, + 0x04, 0x04, 0x00, + 0x04, 0x04, 0x00, + 0x0C, 0x06, 0x00, + 0x0F, 0xFE, 0x00, + 0x08, 0x02, 0x00, + 0x18, 0x03, 0x00, + 0x10, 0x01, 0x00, + 0x10, 0x01, 0x00, + 0x30, 0x01, 0x80, + 0xFE, 0x0F, 0xE0 +}; + +static const uint8_t courR24L1_0xC1_BMP[] = { + 0x00, 0x0C, 0x00, + 0x00, 0x18, 0x00, + 0x00, 0x30, 0x00, + 0x00, 0x60, 0x00, + 0x00, 0xC0, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x1F, 0xE0, 0x00, + 0x00, 0xA0, 0x00, + 0x01, 0xB0, 0x00, + 0x01, 0x10, 0x00, + 0x01, 0x10, 0x00, + 0x03, 0x18, 0x00, + 0x02, 0x08, 0x00, + 0x02, 0x08, 0x00, + 0x06, 0x0C, 0x00, + 0x04, 0x04, 0x00, + 0x04, 0x04, 0x00, + 0x0C, 0x06, 0x00, + 0x0F, 0xFE, 0x00, + 0x08, 0x02, 0x00, + 0x18, 0x03, 0x00, + 0x10, 0x01, 0x00, + 0x10, 0x01, 0x00, + 0x30, 0x01, 0x80, + 0xFE, 0x0F, 0xE0 +}; + +static const uint8_t courR24L1_0xC2_BMP[] = { + 0x00, 0x40, 0x00, + 0x00, 0xE0, 0x00, + 0x01, 0xB0, 0x00, + 0x03, 0x18, 0x00, + 0x06, 0x0C, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x1F, 0xE0, 0x00, + 0x00, 0xA0, 0x00, + 0x01, 0xB0, 0x00, + 0x01, 0x10, 0x00, + 0x01, 0x10, 0x00, + 0x03, 0x18, 0x00, + 0x02, 0x08, 0x00, + 0x02, 0x08, 0x00, + 0x06, 0x0C, 0x00, + 0x04, 0x04, 0x00, + 0x04, 0x04, 0x00, + 0x0C, 0x06, 0x00, + 0x0F, 0xFE, 0x00, + 0x08, 0x02, 0x00, + 0x18, 0x03, 0x00, + 0x10, 0x01, 0x00, + 0x10, 0x01, 0x00, + 0x30, 0x01, 0x80, + 0xFE, 0x0F, 0xE0 +}; + +static const uint8_t courR24L1_0xC3_BMP[] = { + 0x03, 0x84, 0x00, + 0x06, 0xEC, 0x00, + 0x04, 0x38, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x1F, 0xE0, 0x00, + 0x00, 0xA0, 0x00, + 0x01, 0xB0, 0x00, + 0x01, 0x10, 0x00, + 0x01, 0x10, 0x00, + 0x03, 0x18, 0x00, + 0x02, 0x08, 0x00, + 0x02, 0x08, 0x00, + 0x06, 0x0C, 0x00, + 0x04, 0x04, 0x00, + 0x04, 0x04, 0x00, + 0x0C, 0x06, 0x00, + 0x0F, 0xFE, 0x00, + 0x08, 0x02, 0x00, + 0x18, 0x03, 0x00, + 0x10, 0x01, 0x00, + 0x10, 0x01, 0x00, + 0x30, 0x01, 0x80, + 0xFE, 0x0F, 0xE0 +}; + +static const uint8_t courR24L1_0xC4_BMP[] = { + 0x06, 0x0C, 0x00, + 0x0F, 0x1E, 0x00, + 0x06, 0x0C, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x1F, 0xE0, 0x00, + 0x00, 0xA0, 0x00, + 0x01, 0xB0, 0x00, + 0x01, 0x10, 0x00, + 0x01, 0x10, 0x00, + 0x03, 0x18, 0x00, + 0x02, 0x08, 0x00, + 0x02, 0x08, 0x00, + 0x06, 0x0C, 0x00, + 0x04, 0x04, 0x00, + 0x04, 0x04, 0x00, + 0x0C, 0x06, 0x00, + 0x0F, 0xFE, 0x00, + 0x08, 0x02, 0x00, + 0x18, 0x03, 0x00, + 0x10, 0x01, 0x00, + 0x10, 0x01, 0x00, + 0x30, 0x01, 0x80, + 0xFE, 0x0F, 0xE0 +}; + +static const uint8_t courR24L1_0xC5_BMP[] = { + 0x00, 0xE0, 0x00, + 0x01, 0xB0, 0x00, + 0x01, 0x10, 0x00, + 0x01, 0x10, 0x00, + 0x01, 0xB0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0x00, 0x00, + 0x1F, 0xE0, 0x00, + 0x00, 0xA0, 0x00, + 0x01, 0xB0, 0x00, + 0x01, 0x10, 0x00, + 0x01, 0x10, 0x00, + 0x03, 0x18, 0x00, + 0x02, 0x08, 0x00, + 0x02, 0x08, 0x00, + 0x06, 0x0C, 0x00, + 0x04, 0x04, 0x00, + 0x04, 0x04, 0x00, + 0x0C, 0x06, 0x00, + 0x0F, 0xFE, 0x00, + 0x08, 0x02, 0x00, + 0x18, 0x03, 0x00, + 0x10, 0x01, 0x00, + 0x10, 0x01, 0x00, + 0x30, 0x01, 0x80, + 0xFE, 0x0F, 0xE0 +}; + +static const uint8_t courR24L1_0xC6_BMP[] = { + 0x1F, 0xFF, 0x80, + 0x02, 0x40, 0x80, + 0x02, 0x40, 0x80, + 0x06, 0x40, 0x80, + 0x04, 0x40, 0x80, + 0x04, 0x40, 0x80, + 0x04, 0x40, 0x00, + 0x0C, 0x44, 0x00, + 0x08, 0x44, 0x00, + 0x08, 0x7C, 0x00, + 0x08, 0x44, 0x00, + 0x18, 0x44, 0x00, + 0x1F, 0xC0, 0x00, + 0x10, 0x40, 0x00, + 0x30, 0x40, 0x40, + 0x20, 0x40, 0x40, + 0x20, 0x40, 0x40, + 0x20, 0x40, 0x40, + 0xFB, 0xFF, 0xC0 +}; + +static const uint8_t courR24L1_0xC7_BMP[] = { + 0x07, 0xC4, + 0x1C, 0x74, + 0x30, 0x0C, + 0x60, 0x0C, + 0x40, 0x04, + 0xC0, 0x04, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0xC0, 0x00, + 0x40, 0x02, + 0x60, 0x04, + 0x30, 0x1C, + 0x1C, 0x70, + 0x07, 0xC0, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x80, + 0x04, 0xC0, + 0x07, 0x80 +}; + +static const uint8_t courR24L1_0xC8_BMP[] = { + 0x0C, 0x00, + 0x06, 0x00, + 0x03, 0x00, + 0x01, 0x80, + 0x00, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xFC, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x40, + 0x10, 0x40, + 0x10, 0x40, + 0x1F, 0xC0, + 0x10, 0x40, + 0x10, 0x40, + 0x10, 0x00, + 0x10, 0x02, + 0x10, 0x02, + 0x10, 0x02, + 0x10, 0x02, + 0x10, 0x02, + 0xFF, 0xFE +}; + +static const uint8_t courR24L1_0xC9_BMP[] = { + 0x00, 0x30, + 0x00, 0x60, + 0x00, 0xC0, + 0x01, 0x80, + 0x03, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xFC, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x40, + 0x10, 0x40, + 0x10, 0x40, + 0x1F, 0xC0, + 0x10, 0x40, + 0x10, 0x40, + 0x10, 0x00, + 0x10, 0x02, + 0x10, 0x02, + 0x10, 0x02, + 0x10, 0x02, + 0x10, 0x02, + 0xFF, 0xFE +}; + +static const uint8_t courR24L1_0xCA_BMP[] = { + 0x00, 0x80, + 0x01, 0xC0, + 0x03, 0x60, + 0x06, 0x30, + 0x0C, 0x18, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xFC, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x40, + 0x10, 0x40, + 0x10, 0x40, + 0x1F, 0xC0, + 0x10, 0x40, + 0x10, 0x40, + 0x10, 0x00, + 0x10, 0x02, + 0x10, 0x02, + 0x10, 0x02, + 0x10, 0x02, + 0x10, 0x02, + 0xFF, 0xFE +}; + +static const uint8_t courR24L1_0xCB_BMP[] = { + 0x0C, 0x30, + 0x1E, 0x78, + 0x0C, 0x30, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xFC, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x40, + 0x10, 0x40, + 0x10, 0x40, + 0x1F, 0xC0, + 0x10, 0x40, + 0x10, 0x40, + 0x10, 0x00, + 0x10, 0x02, + 0x10, 0x02, + 0x10, 0x02, + 0x10, 0x02, + 0x10, 0x02, + 0xFF, 0xFE +}; + +static const uint8_t courR24L1_0xCC_BMP[] = { + 0x30, 0x00, + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x03, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xE0, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0xFF, 0xE0 +}; + +static const uint8_t courR24L1_0xCD_BMP[] = { + 0x00, 0xC0, + 0x01, 0x80, + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xE0, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0xFF, 0xE0 +}; + +static const uint8_t courR24L1_0xCE_BMP[] = { + 0x04, 0x00, + 0x0E, 0x00, + 0x1B, 0x00, + 0x31, 0x80, + 0x60, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xE0, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0xFF, 0xE0 +}; + +static const uint8_t courR24L1_0xCF_BMP[] = { + 0x60, 0xC0, + 0xF1, 0xE0, + 0x60, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xE0, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0xFF, 0xE0 +}; + +static const uint8_t courR24L1_0xD0_BMP[] = { + 0xFF, 0xC0, + 0x20, 0x70, + 0x20, 0x18, + 0x20, 0x0C, + 0x20, 0x04, + 0x20, 0x06, + 0x20, 0x02, + 0x20, 0x02, + 0x20, 0x02, + 0xFE, 0x02, + 0x20, 0x02, + 0x20, 0x02, + 0x20, 0x02, + 0x20, 0x06, + 0x20, 0x04, + 0x20, 0x0C, + 0x20, 0x18, + 0x20, 0x70, + 0xFF, 0xC0 +}; + +static const uint8_t courR24L1_0xD1_BMP[] = { + 0x03, 0x84, 0x00, + 0x06, 0xEC, 0x00, + 0x04, 0x38, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0xF8, 0x1F, 0xC0, + 0x1C, 0x01, 0x00, + 0x14, 0x01, 0x00, + 0x16, 0x01, 0x00, + 0x12, 0x01, 0x00, + 0x13, 0x01, 0x00, + 0x11, 0x81, 0x00, + 0x10, 0x81, 0x00, + 0x10, 0xC1, 0x00, + 0x10, 0x41, 0x00, + 0x10, 0x61, 0x00, + 0x10, 0x21, 0x00, + 0x10, 0x31, 0x00, + 0x10, 0x19, 0x00, + 0x10, 0x09, 0x00, + 0x10, 0x0D, 0x00, + 0x10, 0x05, 0x00, + 0x10, 0x07, 0x00, + 0x7F, 0x03, 0x00 +}; + +static const uint8_t courR24L1_0xD2_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x03, 0x00, + 0x01, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0xC0, + 0x1C, 0x70, + 0x30, 0x18, + 0x60, 0x0C, + 0x40, 0x04, + 0xC0, 0x06, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0xC0, 0x06, + 0x40, 0x04, + 0x60, 0x0C, + 0x20, 0x08, + 0x30, 0x18, + 0x1C, 0x70, + 0x07, 0xC0 +}; + +static const uint8_t courR24L1_0xD3_BMP[] = { + 0x00, 0x18, + 0x00, 0x30, + 0x00, 0x60, + 0x00, 0xC0, + 0x01, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0xC0, + 0x1C, 0x70, + 0x30, 0x18, + 0x60, 0x0C, + 0x40, 0x04, + 0xC0, 0x06, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0xC0, 0x06, + 0x40, 0x04, + 0x60, 0x0C, + 0x20, 0x08, + 0x30, 0x18, + 0x1C, 0x70, + 0x07, 0xC0 +}; + +static const uint8_t courR24L1_0xD4_BMP[] = { + 0x01, 0x00, + 0x03, 0x80, + 0x06, 0xC0, + 0x0C, 0x60, + 0x18, 0x30, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0xC0, + 0x1C, 0x70, + 0x30, 0x18, + 0x60, 0x0C, + 0x40, 0x04, + 0xC0, 0x06, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0xC0, 0x06, + 0x40, 0x04, + 0x60, 0x0C, + 0x20, 0x08, + 0x30, 0x18, + 0x1C, 0x70, + 0x07, 0xC0 +}; + +static const uint8_t courR24L1_0xD5_BMP[] = { + 0x0E, 0x10, + 0x1B, 0xB0, + 0x10, 0xE0, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0xC0, + 0x1C, 0x70, + 0x30, 0x18, + 0x60, 0x0C, + 0x40, 0x04, + 0xC0, 0x06, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0xC0, 0x06, + 0x40, 0x04, + 0x60, 0x0C, + 0x20, 0x08, + 0x30, 0x18, + 0x1C, 0x70, + 0x07, 0xC0 +}; + +static const uint8_t courR24L1_0xD6_BMP[] = { + 0x30, 0x30, + 0x78, 0x78, + 0x30, 0x30, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0xC0, + 0x1C, 0x70, + 0x30, 0x18, + 0x60, 0x0C, + 0x40, 0x04, + 0xC0, 0x06, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0xC0, 0x06, + 0x40, 0x04, + 0x60, 0x0C, + 0x20, 0x08, + 0x30, 0x18, + 0x1C, 0x70, + 0x07, 0xC0 +}; + +static const uint8_t courR24L1_0xD7_BMP[] = { + 0x80, 0x08, + 0xC0, 0x18, + 0x60, 0x30, + 0x30, 0x60, + 0x18, 0xC0, + 0x0D, 0x80, + 0x07, 0x00, + 0x07, 0x00, + 0x0D, 0x80, + 0x18, 0xC0, + 0x30, 0x60, + 0x60, 0x30, + 0xC0, 0x18, + 0x80, 0x08 +}; + +static const uint8_t courR24L1_0xD8_BMP[] = { + 0x00, 0x01, + 0x07, 0xC3, + 0x1C, 0x76, + 0x30, 0x1C, + 0x20, 0x18, + 0x60, 0x3C, + 0x40, 0x24, + 0xC0, 0x66, + 0x80, 0xC2, + 0x81, 0x82, + 0x81, 0x02, + 0x83, 0x02, + 0x86, 0x02, + 0xCC, 0x06, + 0x48, 0x04, + 0x78, 0x0C, + 0x30, 0x08, + 0x30, 0x18, + 0x7C, 0x30, + 0xC7, 0xE0, + 0x80, 0x00 +}; + +static const uint8_t courR24L1_0xD9_BMP[] = { + 0x06, 0x00, 0x00, + 0x03, 0x00, 0x00, + 0x01, 0x80, 0x00, + 0x00, 0xC0, 0x00, + 0x00, 0x60, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0xFE, 0x3F, 0x80, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x30, 0x06, 0x00, + 0x10, 0x04, 0x00, + 0x18, 0x0C, 0x00, + 0x0E, 0x38, 0x00, + 0x03, 0xE0, 0x00 +}; + +static const uint8_t courR24L1_0xDA_BMP[] = { + 0x00, 0x18, 0x00, + 0x00, 0x30, 0x00, + 0x00, 0x60, 0x00, + 0x00, 0xC0, 0x00, + 0x01, 0x80, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0xFE, 0x3F, 0x80, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x30, 0x06, 0x00, + 0x10, 0x04, 0x00, + 0x18, 0x0C, 0x00, + 0x0E, 0x38, 0x00, + 0x03, 0xE0, 0x00 +}; + +static const uint8_t courR24L1_0xDB_BMP[] = { + 0x00, 0x80, 0x00, + 0x01, 0xC0, 0x00, + 0x03, 0x60, 0x00, + 0x06, 0x30, 0x00, + 0x0C, 0x18, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0xFE, 0x3F, 0x80, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x30, 0x06, 0x00, + 0x10, 0x04, 0x00, + 0x18, 0x0C, 0x00, + 0x0E, 0x38, 0x00, + 0x03, 0xE0, 0x00 +}; + +static const uint8_t courR24L1_0xDC_BMP[] = { + 0x0C, 0x18, 0x00, + 0x1E, 0x3C, 0x00, + 0x0C, 0x18, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0xFE, 0x3F, 0x80, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, + 0x30, 0x06, 0x00, + 0x10, 0x04, 0x00, + 0x18, 0x0C, 0x00, + 0x0E, 0x38, 0x00, + 0x03, 0xE0, 0x00 +}; + +static const uint8_t courR24L1_0xDD_BMP[] = { + 0x00, 0x30, + 0x00, 0x60, + 0x00, 0xC0, + 0x01, 0x80, + 0x03, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xF8, 0x3E, + 0x60, 0x0C, + 0x30, 0x18, + 0x10, 0x10, + 0x18, 0x30, + 0x08, 0x20, + 0x0C, 0x60, + 0x06, 0xC0, + 0x02, 0x80, + 0x03, 0x80, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x00, + 0x1F, 0xF0 +}; + +static const uint8_t courR24L1_0xDE_BMP[] = { + 0xFE, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x1F, 0xE0, + 0x10, 0x3C, + 0x10, 0x06, + 0x10, 0x02, + 0x10, 0x03, + 0x10, 0x03, + 0x10, 0x02, + 0x10, 0x06, + 0x10, 0x3C, + 0x1F, 0xE0, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0x10, 0x00, + 0xFE, 0x00 +}; + +static const uint8_t courR24L1_0xDF_BMP[] = { + 0x07, 0xC0, + 0x0C, 0x60, + 0x08, 0x20, + 0x18, 0x30, + 0x10, 0x10, + 0x10, 0x10, + 0x10, 0x10, + 0x10, 0x30, + 0x10, 0x60, + 0x11, 0xC0, + 0x10, 0x70, + 0x10, 0x18, + 0x10, 0x04, + 0x10, 0x06, + 0x10, 0x02, + 0x10, 0x02, + 0x10, 0x02, + 0x11, 0x06, + 0x11, 0x04, + 0x11, 0x8C, + 0xF8, 0xF8 +}; + +static const uint8_t courR24L1_0xE0_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x03, 0x00, + 0x01, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0x80, + 0x38, 0xE0, + 0x00, 0x20, + 0x00, 0x30, + 0x00, 0x10, + 0x00, 0x10, + 0x1F, 0xF0, + 0x70, 0x30, + 0xC0, 0x10, + 0x80, 0x10, + 0x80, 0x10, + 0x80, 0x30, + 0xC0, 0xF0, + 0x7F, 0x9E +}; + +static const uint8_t courR24L1_0xE1_BMP[] = { + 0x00, 0x60, + 0x00, 0xC0, + 0x01, 0x80, + 0x03, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0x80, + 0x38, 0xE0, + 0x00, 0x20, + 0x00, 0x30, + 0x00, 0x10, + 0x00, 0x10, + 0x1F, 0xF0, + 0x70, 0x30, + 0xC0, 0x10, + 0x80, 0x10, + 0x80, 0x10, + 0x80, 0x30, + 0xC0, 0xF0, + 0x7F, 0x9E +}; + +static const uint8_t courR24L1_0xE2_BMP[] = { + 0x01, 0x00, + 0x03, 0x80, + 0x06, 0xC0, + 0x0C, 0x60, + 0x18, 0x30, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0x80, + 0x38, 0xE0, + 0x00, 0x20, + 0x00, 0x30, + 0x00, 0x10, + 0x00, 0x10, + 0x1F, 0xF0, + 0x70, 0x30, + 0xC0, 0x10, + 0x80, 0x10, + 0x80, 0x10, + 0x80, 0x30, + 0xC0, 0xF0, + 0x7F, 0x9E +}; + +static const uint8_t courR24L1_0xE3_BMP[] = { + 0x0E, 0x10, + 0x1B, 0xB0, + 0x10, 0xE0, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0x80, + 0x38, 0xE0, + 0x00, 0x20, + 0x00, 0x30, + 0x00, 0x10, + 0x00, 0x10, + 0x1F, 0xF0, + 0x70, 0x30, + 0xC0, 0x10, + 0x80, 0x10, + 0x80, 0x10, + 0x80, 0x30, + 0xC0, 0xF0, + 0x7F, 0x9E +}; + +static const uint8_t courR24L1_0xE4_BMP[] = { + 0x30, 0xC0, + 0x79, 0xE0, + 0x30, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0x80, + 0x38, 0xE0, + 0x00, 0x20, + 0x00, 0x30, + 0x00, 0x10, + 0x00, 0x10, + 0x1F, 0xF0, + 0x70, 0x30, + 0xC0, 0x10, + 0x80, 0x10, + 0x80, 0x10, + 0x80, 0x30, + 0xC0, 0xF0, + 0x7F, 0x9E +}; + +static const uint8_t courR24L1_0xE5_BMP[] = { + 0x07, 0x00, + 0x0D, 0x80, + 0x08, 0x80, + 0x08, 0x80, + 0x0D, 0x80, + 0x07, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0x80, + 0x38, 0xE0, + 0x00, 0x20, + 0x00, 0x30, + 0x00, 0x10, + 0x00, 0x10, + 0x1F, 0xF0, + 0x70, 0x30, + 0xC0, 0x10, + 0x80, 0x10, + 0x80, 0x10, + 0x80, 0x30, + 0xC0, 0xF0, + 0x7F, 0x9E +}; + +static const uint8_t courR24L1_0xE6_BMP[] = { + 0x1F, 0x0F, 0x80, + 0x71, 0x98, 0xC0, + 0x00, 0xF0, 0x40, + 0x00, 0x60, 0x60, + 0x00, 0x60, 0x20, + 0x1E, 0x40, 0x20, + 0x73, 0xFF, 0xE0, + 0xC0, 0xC0, 0x00, + 0x80, 0x40, 0x00, + 0x80, 0x60, 0x00, + 0x80, 0xE0, 0x00, + 0xC1, 0x50, 0x60, + 0x63, 0x58, 0xC0, + 0x3E, 0x4F, 0x80 +}; + +static const uint8_t courR24L1_0xE7_BMP[] = { + 0x0F, 0xC8, + 0x38, 0x68, + 0x60, 0x18, + 0x40, 0x18, + 0xC0, 0x08, + 0x80, 0x08, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0xC0, 0x00, + 0x40, 0x04, + 0x60, 0x1C, + 0x38, 0x70, + 0x0F, 0xC0, + 0x02, 0x00, + 0x02, 0x00, + 0x03, 0x00, + 0x09, 0x80, + 0x0F, 0x00 +}; + +static const uint8_t courR24L1_0xE8_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x03, 0x00, + 0x01, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0xC0, + 0x38, 0x70, + 0x60, 0x18, + 0x40, 0x08, + 0xC0, 0x0C, + 0x80, 0x04, + 0xFF, 0xFC, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0xC0, 0x00, + 0x60, 0x0C, + 0x38, 0x38, + 0x0F, 0xE0 +}; + +static const uint8_t courR24L1_0xE9_BMP[] = { + 0x00, 0x30, + 0x00, 0x60, + 0x00, 0xC0, + 0x01, 0x80, + 0x03, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0xC0, + 0x38, 0x70, + 0x60, 0x18, + 0x40, 0x08, + 0xC0, 0x0C, + 0x80, 0x04, + 0xFF, 0xFC, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0xC0, 0x00, + 0x60, 0x0C, + 0x38, 0x38, + 0x0F, 0xE0 +}; + +static const uint8_t courR24L1_0xEA_BMP[] = { + 0x01, 0x00, + 0x03, 0x80, + 0x06, 0xC0, + 0x0C, 0x60, + 0x18, 0x30, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0xC0, + 0x38, 0x70, + 0x60, 0x18, + 0x40, 0x08, + 0xC0, 0x0C, + 0x80, 0x04, + 0xFF, 0xFC, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0xC0, 0x00, + 0x60, 0x0C, + 0x38, 0x38, + 0x0F, 0xE0 +}; + +static const uint8_t courR24L1_0xEB_BMP[] = { + 0x30, 0x60, + 0x78, 0xF0, + 0x30, 0x60, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0xC0, + 0x38, 0x70, + 0x60, 0x18, + 0x40, 0x08, + 0xC0, 0x0C, + 0x80, 0x04, + 0xFF, 0xFC, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0xC0, 0x00, + 0x60, 0x0C, + 0x38, 0x38, + 0x0F, 0xE0 +}; + +static const uint8_t courR24L1_0xEC_BMP[] = { + 0x30, 0x00, + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x03, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x7E, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0xFF, 0xF8 +}; + +static const uint8_t courR24L1_0xED_BMP[] = { + 0x00, 0xC0, + 0x01, 0x80, + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x7E, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0xFF, 0xF8 +}; + +static const uint8_t courR24L1_0xEE_BMP[] = { + 0x04, 0x00, + 0x0E, 0x00, + 0x1B, 0x00, + 0x31, 0x80, + 0x60, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0x7E, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0xFF, 0xF8 +}; + +static const uint8_t courR24L1_0xEF_BMP[] = { + 0x61, 0x80, + 0xF3, 0xC0, + 0x61, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x7E, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0xFF, 0xF8 +}; + +static const uint8_t courR24L1_0xF0_BMP[] = { + 0x7C, 0x0C, + 0x4F, 0x38, + 0x01, 0xE0, + 0x03, 0xC0, + 0x0E, 0x60, + 0x38, 0x30, + 0x20, 0x18, + 0x00, 0x0C, + 0x0F, 0xE4, + 0x38, 0x36, + 0x60, 0x0E, + 0xC0, 0x06, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0xC0, 0x06, + 0x40, 0x04, + 0x60, 0x0C, + 0x18, 0x38, + 0x0F, 0xE0 +}; + +static const uint8_t courR24L1_0xF1_BMP[] = { + 0x0E, 0x10, + 0x1B, 0xB0, + 0x10, 0xE0, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xE3, 0xC0, + 0x2E, 0x70, + 0x38, 0x10, + 0x30, 0x18, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0x20, 0x08, + 0xF8, 0x3E +}; + +static const uint8_t courR24L1_0xF2_BMP[] = { + 0x0C, 0x00, + 0x06, 0x00, + 0x03, 0x00, + 0x01, 0x80, + 0x00, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0xE0, + 0x38, 0x38, + 0x60, 0x0C, + 0x40, 0x04, + 0xC0, 0x06, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0xC0, 0x06, + 0x40, 0x04, + 0x60, 0x0C, + 0x38, 0x38, + 0x0F, 0xE0 +}; + +static const uint8_t courR24L1_0xF3_BMP[] = { + 0x00, 0x30, + 0x00, 0x60, + 0x00, 0xC0, + 0x01, 0x80, + 0x03, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0xE0, + 0x38, 0x38, + 0x60, 0x0C, + 0x40, 0x04, + 0xC0, 0x06, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0xC0, 0x06, + 0x40, 0x04, + 0x60, 0x0C, + 0x38, 0x38, + 0x0F, 0xE0 +}; + +static const uint8_t courR24L1_0xF4_BMP[] = { + 0x01, 0x80, + 0x03, 0xC0, + 0x06, 0x60, + 0x0C, 0x30, + 0x18, 0x18, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0xE0, + 0x38, 0x38, + 0x60, 0x0C, + 0x40, 0x04, + 0xC0, 0x06, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0xC0, 0x06, + 0x40, 0x04, + 0x60, 0x0C, + 0x38, 0x38, + 0x0F, 0xE0 +}; + +static const uint8_t courR24L1_0xF5_BMP[] = { + 0x0E, 0x10, + 0x1B, 0xB0, + 0x10, 0xE0, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0xE0, + 0x38, 0x38, + 0x60, 0x0C, + 0x40, 0x04, + 0xC0, 0x06, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0xC0, 0x06, + 0x40, 0x04, + 0x60, 0x0C, + 0x38, 0x38, + 0x0F, 0xE0 +}; + +static const uint8_t courR24L1_0xF6_BMP[] = { + 0x18, 0x60, + 0x3C, 0xF0, + 0x18, 0x60, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0xE0, + 0x38, 0x38, + 0x60, 0x0C, + 0x40, 0x04, + 0xC0, 0x06, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0x80, 0x02, + 0xC0, 0x06, + 0x40, 0x04, + 0x60, 0x0C, + 0x38, 0x38, + 0x0F, 0xE0 +}; + +static const uint8_t courR24L1_0xF7_BMP[] = { + 0x03, 0x00, + 0x07, 0x80, + 0x03, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xFC, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x03, 0x00, + 0x07, 0x80, + 0x03, 0x00 +}; + +static const uint8_t courR24L1_0xF8_BMP[] = { + 0x00, 0x02, + 0x07, 0xE6, + 0x1C, 0x3C, + 0x30, 0x18, + 0x40, 0x34, + 0xC0, 0x66, + 0x80, 0xC2, + 0x81, 0x82, + 0x83, 0x02, + 0x86, 0x02, + 0xCC, 0x06, + 0x58, 0x04, + 0x70, 0x18, + 0x78, 0x70, + 0xCF, 0xC0, + 0x80, 0x00 +}; + +static const uint8_t courR24L1_0xF9_BMP[] = { + 0x0C, 0x00, + 0x06, 0x00, + 0x03, 0x00, + 0x01, 0x80, + 0x00, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xF0, 0x3C, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x0C, + 0x18, 0x1C, + 0x0C, 0x34, + 0x07, 0xE7 +}; + +static const uint8_t courR24L1_0xFA_BMP[] = { + 0x00, 0x30, + 0x00, 0x60, + 0x00, 0xC0, + 0x01, 0x80, + 0x03, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xF0, 0x3C, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x0C, + 0x18, 0x1C, + 0x0C, 0x34, + 0x07, 0xE7 +}; + +static const uint8_t courR24L1_0xFB_BMP[] = { + 0x00, 0x80, + 0x01, 0xC0, + 0x03, 0x60, + 0x06, 0x30, + 0x0C, 0x18, + 0x00, 0x00, + 0x00, 0x00, + 0xF0, 0x3C, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x0C, + 0x18, 0x1C, + 0x0C, 0x34, + 0x07, 0xE7 +}; + +static const uint8_t courR24L1_0xFC_BMP[] = { + 0x18, 0x30, + 0x3C, 0x78, + 0x18, 0x30, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xF0, 0x3C, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x04, + 0x10, 0x0C, + 0x18, 0x1C, + 0x0C, 0x34, + 0x07, 0xE7 +}; + +static const uint8_t courR24L1_0xFD_BMP[] = { + 0x00, 0x30, + 0x00, 0x60, + 0x00, 0xC0, + 0x01, 0x80, + 0x03, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xF8, 0x3E, + 0x40, 0x04, + 0x60, 0x0C, + 0x20, 0x08, + 0x30, 0x18, + 0x10, 0x10, + 0x18, 0x30, + 0x08, 0x20, + 0x0C, 0x60, + 0x04, 0x40, + 0x06, 0xC0, + 0x02, 0x80, + 0x03, 0x80, + 0x01, 0x00, + 0x03, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x06, 0x00, + 0x04, 0x00, + 0x7F, 0x80 +}; + +static const uint8_t courR24L1_0xFE_BMP[] = { + 0xF0, 0x00, 0x00, + 0x10, 0x00, 0x00, + 0x10, 0x00, 0x00, + 0x10, 0x00, 0x00, + 0x10, 0x00, 0x00, + 0x10, 0x00, 0x00, + 0x10, 0x00, 0x00, + 0x11, 0xF8, 0x00, + 0x17, 0x0E, 0x00, + 0x1C, 0x03, 0x00, + 0x18, 0x01, 0x00, + 0x18, 0x01, 0x80, + 0x10, 0x00, 0x80, + 0x10, 0x00, 0x80, + 0x10, 0x00, 0x80, + 0x10, 0x00, 0x80, + 0x18, 0x01, 0x80, + 0x18, 0x01, 0x00, + 0x1C, 0x03, 0x00, + 0x17, 0x0E, 0x00, + 0x11, 0xF8, 0x00, + 0x10, 0x00, 0x00, + 0x10, 0x00, 0x00, + 0x10, 0x00, 0x00, + 0x10, 0x00, 0x00, + 0x10, 0x00, 0x00, + 0xFF, 0x00, 0x00 +}; + +static const uint8_t courR24L1_0xFF_BMP[] = { + 0x18, 0x18, + 0x3C, 0x3C, + 0x18, 0x18, + 0x00, 0x00, + 0x00, 0x00, + 0xF8, 0x3E, + 0x40, 0x04, + 0x60, 0x0C, + 0x20, 0x08, + 0x30, 0x18, + 0x10, 0x10, + 0x18, 0x30, + 0x08, 0x20, + 0x0C, 0x60, + 0x04, 0x40, + 0x06, 0xC0, + 0x02, 0x80, + 0x03, 0x80, + 0x01, 0x00, + 0x03, 0x00, + 0x02, 0x00, + 0x02, 0x00, + 0x06, 0x00, + 0x04, 0x00, + 0x7F, 0x80 +}; + +static const GFONT_CharInfo FontBMP[] = { + {20, 15, 19, 2, 0, courR24L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {20, 1, 1, 0, 0, courR24L1_0x20_BMP}, + {20, 5, 21, 8, 0, courR24L1_0x21_BMP}, + {20, 11, 10, 4, 10, courR24L1_0x22_BMP}, + {20, 13, 23, 3, -2, courR24L1_0x23_BMP}, + {20, 12, 25, 4, -3, courR24L1_0x24_BMP}, + {20, 15, 20, 3, 0, courR24L1_0x25_BMP}, + {20, 12, 17, 3, 0, courR24L1_0x26_BMP}, + {20, 4, 11, 8, 10, courR24L1_0x27_BMP}, + {20, 5, 25, 9, -4, courR24L1_0x28_BMP}, + {20, 5, 25, 5, -4, courR24L1_0x29_BMP}, + {20, 11, 13, 4, 8, courR24L1_0x2A_BMP}, + {20, 15, 17, 2, 1, courR24L1_0x2B_BMP}, + {20, 6, 9, 5, -4, courR24L1_0x2C_BMP}, + {20, 15, 1, 2, 9, courR24L1_0x2D_BMP}, + {20, 5, 4, 7, 0, courR24L1_0x2E_BMP}, + {20, 11, 25, 4, -3, courR24L1_0x2F_BMP}, + {20, 11, 20, 4, 0, courR24L1_0x30_BMP}, + {20, 11, 20, 4, 0, courR24L1_0x31_BMP}, + {20, 13, 20, 3, 0, courR24L1_0x32_BMP}, + {20, 13, 20, 3, 0, courR24L1_0x33_BMP}, + {20, 13, 20, 3, 0, courR24L1_0x34_BMP}, + {20, 13, 20, 3, 0, courR24L1_0x35_BMP}, + {20, 12, 20, 4, 0, courR24L1_0x36_BMP}, + {20, 11, 20, 4, 0, courR24L1_0x37_BMP}, + {20, 11, 20, 4, 0, courR24L1_0x38_BMP}, + {20, 12, 20, 4, 0, courR24L1_0x39_BMP}, + {20, 5, 14, 7, 0, courR24L1_0x3A_BMP}, + {20, 7, 18, 5, -4, courR24L1_0x3B_BMP}, + {20, 15, 17, 2, 1, courR24L1_0x3C_BMP}, + {20, 15, 6, 2, 6, courR24L1_0x3D_BMP}, + {20, 15, 17, 2, 1, courR24L1_0x3E_BMP}, + {20, 11, 19, 4, 0, courR24L1_0x3F_BMP}, + {20, 12, 23, 3, -2, courR24L1_0x40_BMP}, + {20, 19, 19, 0, 0, courR24L1_0x41_BMP}, + {20, 16, 19, 1, 0, courR24L1_0x42_BMP}, + {20, 14, 19, 2, 0, courR24L1_0x43_BMP}, + {20, 15, 19, 1, 0, courR24L1_0x44_BMP}, + {20, 15, 19, 1, 0, courR24L1_0x45_BMP}, + {20, 15, 19, 1, 0, courR24L1_0x46_BMP}, + {20, 15, 19, 2, 0, courR24L1_0x47_BMP}, + {20, 15, 19, 2, 0, courR24L1_0x48_BMP}, + {20, 11, 19, 4, 0, courR24L1_0x49_BMP}, + {20, 15, 19, 3, 0, courR24L1_0x4A_BMP}, + {20, 17, 19, 1, 0, courR24L1_0x4B_BMP}, + {20, 15, 19, 2, 0, courR24L1_0x4C_BMP}, + {20, 19, 19, 0, 0, courR24L1_0x4D_BMP}, + {20, 18, 19, 0, 0, courR24L1_0x4E_BMP}, + {20, 15, 19, 2, 0, courR24L1_0x4F_BMP}, + {20, 15, 19, 1, 0, courR24L1_0x50_BMP}, + {20, 15, 22, 2, -3, courR24L1_0x51_BMP}, + {20, 18, 19, 1, 0, courR24L1_0x52_BMP}, + {20, 12, 19, 3, 0, courR24L1_0x53_BMP}, + {20, 15, 19, 2, 0, courR24L1_0x54_BMP}, + {20, 17, 19, 1, 0, courR24L1_0x55_BMP}, + {20, 19, 19, 0, 0, courR24L1_0x56_BMP}, + {20, 17, 19, 1, 0, courR24L1_0x57_BMP}, + {20, 17, 19, 1, 0, courR24L1_0x58_BMP}, + {20, 15, 19, 2, 0, courR24L1_0x59_BMP}, + {20, 13, 19, 3, 0, courR24L1_0x5A_BMP}, + {20, 5, 24, 9, -4, courR24L1_0x5B_BMP}, + {20, 11, 25, 4, -3, courR24L1_0x5C_BMP}, + {20, 5, 24, 5, -4, courR24L1_0x5D_BMP}, + {20, 11, 9, 4, 12, courR24L1_0x5E_BMP}, + {20, 19, 1, 0, -6, courR24L1_0x5F_BMP}, + {20, 6, 5, 4, 17, courR24L1_0x60_BMP}, + {20, 15, 14, 2, 0, courR24L1_0x61_BMP}, + {20, 17, 20, 0, 0, courR24L1_0x62_BMP}, + {20, 14, 14, 3, 0, courR24L1_0x63_BMP}, + {20, 17, 20, 2, 0, courR24L1_0x64_BMP}, + {20, 14, 14, 2, 0, courR24L1_0x65_BMP}, + {20, 13, 20, 3, 0, courR24L1_0x66_BMP}, + {20, 17, 20, 2, -6, courR24L1_0x67_BMP}, + {20, 16, 20, 1, 0, courR24L1_0x68_BMP}, + {20, 13, 20, 3, 0, courR24L1_0x69_BMP}, + {20, 10, 26, 4, -6, courR24L1_0x6A_BMP}, + {20, 15, 20, 2, 0, courR24L1_0x6B_BMP}, + {20, 13, 20, 3, 0, courR24L1_0x6C_BMP}, + {20, 19, 14, 0, 0, courR24L1_0x6D_BMP}, + {20, 15, 14, 2, 0, courR24L1_0x6E_BMP}, + {20, 15, 14, 2, 0, courR24L1_0x6F_BMP}, + {20, 17, 20, 0, -6, courR24L1_0x70_BMP}, + {20, 17, 20, 2, -6, courR24L1_0x71_BMP}, + {20, 15, 14, 3, 0, courR24L1_0x72_BMP}, + {20, 13, 14, 3, 0, courR24L1_0x73_BMP}, + {20, 14, 19, 2, 0, courR24L1_0x74_BMP}, + {20, 16, 14, 1, 0, courR24L1_0x75_BMP}, + {20, 17, 14, 1, 0, courR24L1_0x76_BMP}, + {20, 17, 14, 1, 0, courR24L1_0x77_BMP}, + {20, 15, 14, 2, 0, courR24L1_0x78_BMP}, + {20, 15, 20, 2, -6, courR24L1_0x79_BMP}, + {20, 11, 14, 4, 0, courR24L1_0x7A_BMP}, + {20, 7, 25, 6, -4, courR24L1_0x7B_BMP}, + {20, 1, 25, 9, -4, courR24L1_0x7C_BMP}, + {20, 7, 25, 6, -4, courR24L1_0x7D_BMP}, + {20, 13, 5, 3, 7, courR24L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {20, 1, 1, 0, 0, courR24L1_0xA0_BMP}, + {20, 5, 20, 7, -6, courR24L1_0xA1_BMP}, + {20, 11, 20, 4, 0, courR24L1_0xA2_BMP}, + {20, 14, 19, 2, 0, courR24L1_0xA3_BMP}, + {20, 13, 13, 3, 3, courR24L1_0xA4_BMP}, + {20, 15, 19, 2, 0, courR24L1_0xA5_BMP}, + {20, 1, 25, 9, -4, courR24L1_0xA6_BMP}, + {20, 14, 23, 3, -2, courR24L1_0xA7_BMP}, + {20, 10, 3, 5, 17, courR24L1_0xA8_BMP}, + {20, 19, 19, 0, 0, courR24L1_0xA9_BMP}, + {20, 9, 12, 5, 7, courR24L1_0xAA_BMP}, + {20, 16, 14, 2, 0, courR24L1_0xAB_BMP}, + {20, 14, 6, 3, 6, courR24L1_0xAC_BMP}, + {20, 15, 1, 2, 9, courR24L1_0xAD_BMP}, + {20, 19, 19, 0, 0, courR24L1_0xAE_BMP}, + {20, 9, 2, 5, 17, courR24L1_0xAF_BMP}, + {20, 9, 10, 5, 11, courR24L1_0xB0_BMP}, + {20, 15, 16, 2, 1, courR24L1_0xB1_BMP}, + {20, 8, 14, 5, 7, courR24L1_0xB2_BMP}, + {20, 8, 14, 6, 7, courR24L1_0xB3_BMP}, + {20, 6, 5, 9, 17, courR24L1_0xB4_BMP}, + {20, 16, 20, 1, -6, courR24L1_0xB5_BMP}, + {20, 15, 23, 2, -2, courR24L1_0xB6_BMP}, + {20, 5, 4, 7, 7, courR24L1_0xB7_BMP}, + {20, 5, 5, 7, -5, courR24L1_0xB8_BMP}, + {20, 7, 14, 6, 7, courR24L1_0xB9_BMP}, + {20, 9, 12, 5, 7, courR24L1_0xBA_BMP}, + {20, 16, 14, 2, 0, courR24L1_0xBB_BMP}, + {20, 18, 21, 1, 0, courR24L1_0xBC_BMP}, + {20, 18, 21, 1, 0, courR24L1_0xBD_BMP}, + {20, 19, 21, 0, 0, courR24L1_0xBE_BMP}, + {20, 11, 20, 4, -6, courR24L1_0xBF_BMP}, + {20, 19, 26, 0, 0, courR24L1_0xC0_BMP}, + {20, 19, 26, 0, 0, courR24L1_0xC1_BMP}, + {20, 19, 26, 0, 0, courR24L1_0xC2_BMP}, + {20, 19, 24, 0, 0, courR24L1_0xC3_BMP}, + {20, 19, 24, 0, 0, courR24L1_0xC4_BMP}, + {20, 19, 26, 0, 0, courR24L1_0xC5_BMP}, + {20, 18, 19, 1, 0, courR24L1_0xC6_BMP}, + {20, 15, 24, 2, -5, courR24L1_0xC7_BMP}, + {20, 15, 26, 1, 0, courR24L1_0xC8_BMP}, + {20, 15, 26, 1, 0, courR24L1_0xC9_BMP}, + {20, 15, 26, 1, 0, courR24L1_0xCA_BMP}, + {20, 15, 24, 1, 0, courR24L1_0xCB_BMP}, + {20, 11, 26, 4, 0, courR24L1_0xCC_BMP}, + {20, 11, 26, 4, 0, courR24L1_0xCD_BMP}, + {20, 11, 26, 4, 0, courR24L1_0xCE_BMP}, + {20, 11, 24, 4, 0, courR24L1_0xCF_BMP}, + {20, 15, 19, 1, 0, courR24L1_0xD0_BMP}, + {20, 18, 24, 0, 0, courR24L1_0xD1_BMP}, + {20, 15, 26, 2, 0, courR24L1_0xD2_BMP}, + {20, 15, 26, 2, 0, courR24L1_0xD3_BMP}, + {20, 15, 26, 2, 0, courR24L1_0xD4_BMP}, + {20, 15, 24, 2, 0, courR24L1_0xD5_BMP}, + {20, 15, 24, 2, 0, courR24L1_0xD6_BMP}, + {20, 13, 14, 3, 1, courR24L1_0xD7_BMP}, + {20, 16, 21, 2, -1, courR24L1_0xD8_BMP}, + {20, 17, 26, 1, 0, courR24L1_0xD9_BMP}, + {20, 17, 26, 1, 0, courR24L1_0xDA_BMP}, + {20, 17, 26, 1, 0, courR24L1_0xDB_BMP}, + {20, 17, 24, 1, 0, courR24L1_0xDC_BMP}, + {20, 15, 26, 2, 0, courR24L1_0xDD_BMP}, + {20, 16, 19, 1, 0, courR24L1_0xDE_BMP}, + {20, 15, 21, 1, 0, courR24L1_0xDF_BMP}, + {20, 15, 22, 2, 0, courR24L1_0xE0_BMP}, + {20, 15, 22, 2, 0, courR24L1_0xE1_BMP}, + {20, 15, 22, 2, 0, courR24L1_0xE2_BMP}, + {20, 15, 20, 2, 0, courR24L1_0xE3_BMP}, + {20, 15, 20, 2, 0, courR24L1_0xE4_BMP}, + {20, 15, 23, 2, 0, courR24L1_0xE5_BMP}, + {20, 19, 14, 0, 0, courR24L1_0xE6_BMP}, + {20, 14, 19, 3, -5, courR24L1_0xE7_BMP}, + {20, 14, 22, 2, 0, courR24L1_0xE8_BMP}, + {20, 14, 22, 2, 0, courR24L1_0xE9_BMP}, + {20, 14, 22, 2, 0, courR24L1_0xEA_BMP}, + {20, 14, 20, 2, 0, courR24L1_0xEB_BMP}, + {20, 13, 22, 3, 0, courR24L1_0xEC_BMP}, + {20, 13, 22, 3, 0, courR24L1_0xED_BMP}, + {20, 13, 21, 3, 0, courR24L1_0xEE_BMP}, + {20, 13, 20, 3, 0, courR24L1_0xEF_BMP}, + {20, 15, 20, 2, 0, courR24L1_0xF0_BMP}, + {20, 15, 20, 2, 0, courR24L1_0xF1_BMP}, + {20, 15, 22, 2, 0, courR24L1_0xF2_BMP}, + {20, 15, 22, 2, 0, courR24L1_0xF3_BMP}, + {20, 15, 22, 2, 0, courR24L1_0xF4_BMP}, + {20, 15, 20, 2, 0, courR24L1_0xF5_BMP}, + {20, 15, 20, 2, 0, courR24L1_0xF6_BMP}, + {20, 14, 16, 2, 1, courR24L1_0xF7_BMP}, + {20, 15, 16, 2, -1, courR24L1_0xF8_BMP}, + {20, 16, 22, 1, 0, courR24L1_0xF9_BMP}, + {20, 16, 22, 1, 0, courR24L1_0xFA_BMP}, + {20, 16, 21, 1, 0, courR24L1_0xFB_BMP}, + {20, 16, 20, 1, 0, courR24L1_0xFC_BMP}, + {20, 15, 28, 2, -6, courR24L1_0xFD_BMP}, + {20, 17, 27, 0, -6, courR24L1_0xFE_BMP}, + {20, 15, 25, 2, -6, courR24L1_0xFF_BMP} +}; + + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontCour24Normal_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontCour24Normal_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontCour24Normal_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontCour24Normal_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontCour24Normal_GetFontChar, + McuFontCour24Normal_FBBy, + McuFontCour24Normal_GetUnderlineBoxHeight(), + McuFontCour24Normal_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour24Normal_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontCour24Normal_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour24Normal_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontCour24Normal_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontCour24Normal. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour24Normal.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour24Normal.h new file mode 100644 index 0000000..bf5b42f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontCour24Normal.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontCour24Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontCour24Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Cour +** Size : 24 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontCour24Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontCour24Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontCour24Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontCour24Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontCour24Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontCour24Normal_Deinit(void); +** Init - void McuFontCour24Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontCour24Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontCour24Normal_module McuFontCour24Normal module documentation +** @{ +*/ + + +#ifndef __McuFontCour24Normal_H +#define __McuFontCour24Normal_H + +/* MODULE McuFontCour24Normal. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontCour24Normalconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontCour24Normal_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontCour24Normal_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontCour24Normal_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontCour24Normal_GetLineSpaceHeight() \ + 3 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontCour24Normal_GetUnderlineBoxHeight() \ + 11 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontCour24Normal_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontCour24Normal_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontCour24Normal. */ + +#endif +/* ifndef __McuFontCour24Normal_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv08Bold.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv08Bold.c new file mode 100644 index 0000000..92cc15e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv08Bold.c @@ -0,0 +1,2582 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv08Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv08Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 8 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv08Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv08Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv08Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv08Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv08Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv08Bold_Deinit(void); +** Init - void McuFontHelv08Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv08Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv08Bold_module McuFontHelv08Bold module documentation +** @{ +*/ + +/* MODULE McuFontHelv08Bold. */ + +#include "McuFontHelv08Bold.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontHelv08Bold_FBBy 12 + +static const uint8_t helvB08L1_0x00_BMP[] = { + 0xA8, + 0x00, + 0x88, + 0x00, + 0x88, + 0x00, + 0xA8 +}; + +static const uint8_t helvB08L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t helvB08L1_0x21_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x80, + 0x80, + 0x00, + 0xC0 +}; + +static const uint8_t helvB08L1_0x22_BMP[] = { + 0xA0, + 0xA0, + 0xA0 +}; + +static const uint8_t helvB08L1_0x23_BMP[] = { + 0x28, + 0x28, + 0x7E, + 0x28, + 0xFC, + 0x50, + 0x50 +}; + +static const uint8_t helvB08L1_0x24_BMP[] = { + 0x20, + 0x70, + 0xA8, + 0xE0, + 0x70, + 0x38, + 0x28, + 0xA8, + 0x70, + 0x20 +}; + +static const uint8_t helvB08L1_0x25_BMP[] = { + 0x62, + 0xB4, + 0x68, + 0x10, + 0x10, + 0x2C, + 0x56, + 0x8C +}; + +static const uint8_t helvB08L1_0x26_BMP[] = { + 0x70, + 0xD8, + 0xD8, + 0x70, + 0xDE, + 0xCC, + 0xDC, + 0x76 +}; + +static const uint8_t helvB08L1_0x27_BMP[] = { + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvB08L1_0x28_BMP[] = { + 0x20, + 0x60, + 0x40, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x40, + 0x60, + 0x20 +}; + +static const uint8_t helvB08L1_0x29_BMP[] = { + 0x80, + 0xC0, + 0x40, + 0x60, + 0x60, + 0x60, + 0x60, + 0x40, + 0xC0, + 0x80 +}; + +static const uint8_t helvB08L1_0x2A_BMP[] = { + 0xA0, + 0x40, + 0xA0 +}; + +static const uint8_t helvB08L1_0x2B_BMP[] = { + 0x30, + 0x30, + 0xFC, + 0x30, + 0x30 +}; + +static const uint8_t helvB08L1_0x2C_BMP[] = { + 0xC0, + 0xC0, + 0x40, + 0x80 +}; + +static const uint8_t helvB08L1_0x2D_BMP[] = { + 0xF0 +}; + +static const uint8_t helvB08L1_0x2E_BMP[] = { + 0xC0, + 0xC0 +}; + +static const uint8_t helvB08L1_0x2F_BMP[] = { + 0x10, + 0x10, + 0x20, + 0x20, + 0x40, + 0x40, + 0x80, + 0x80 +}; + +static const uint8_t helvB08L1_0x30_BMP[] = { + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t helvB08L1_0x31_BMP[] = { + 0x60, + 0xE0, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvB08L1_0x32_BMP[] = { + 0x70, + 0xD8, + 0x18, + 0x18, + 0x30, + 0x60, + 0xC0, + 0xF8 +}; + +static const uint8_t helvB08L1_0x33_BMP[] = { + 0x70, + 0xD8, + 0x18, + 0x30, + 0x18, + 0x18, + 0xD8, + 0x70 +}; + +static const uint8_t helvB08L1_0x34_BMP[] = { + 0x08, + 0x18, + 0x38, + 0x58, + 0x98, + 0xFC, + 0x18, + 0x18 +}; + +static const uint8_t helvB08L1_0x35_BMP[] = { + 0xF8, + 0xC0, + 0xC0, + 0xF0, + 0x18, + 0x98, + 0xD8, + 0x70 +}; + +static const uint8_t helvB08L1_0x36_BMP[] = { + 0x70, + 0xD8, + 0xC0, + 0xF0, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t helvB08L1_0x37_BMP[] = { + 0xF8, + 0x18, + 0x18, + 0x30, + 0x30, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvB08L1_0x38_BMP[] = { + 0x70, + 0xD8, + 0xD8, + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t helvB08L1_0x39_BMP[] = { + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0x78, + 0x18, + 0xD8, + 0x70 +}; + +static const uint8_t helvB08L1_0x3A_BMP[] = { + 0xC0, + 0xC0, + 0x00, + 0x00, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB08L1_0x3B_BMP[] = { + 0xC0, + 0xC0, + 0x00, + 0x00, + 0xC0, + 0xC0, + 0x40, + 0x80 +}; + +static const uint8_t helvB08L1_0x3C_BMP[] = { + 0x30, + 0x60, + 0xC0, + 0x60, + 0x30 +}; + +static const uint8_t helvB08L1_0x3D_BMP[] = { + 0xF8, + 0x00, + 0xF8 +}; + +static const uint8_t helvB08L1_0x3E_BMP[] = { + 0xC0, + 0x60, + 0x30, + 0x60, + 0xC0 +}; + +static const uint8_t helvB08L1_0x3F_BMP[] = { + 0x70, + 0xD8, + 0x18, + 0x30, + 0x60, + 0x60, + 0x00, + 0x60 +}; + +static const uint8_t helvB08L1_0x40_BMP[] = { + 0x1F, 0x00, + 0x60, 0x80, + 0x4D, 0x40, + 0x92, 0x40, + 0xA2, 0x40, + 0xA4, 0x80, + 0x9B, 0x00, + 0x40, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvB08L1_0x41_BMP[] = { + 0x38, + 0x38, + 0x6C, + 0x6C, + 0x6C, + 0xFE, + 0xC6, + 0xC6 +}; + +static const uint8_t helvB08L1_0x42_BMP[] = { + 0xF8, + 0xCC, + 0xCC, + 0xF8, + 0xCC, + 0xCC, + 0xCC, + 0xF8 +}; + +static const uint8_t helvB08L1_0x43_BMP[] = { + 0x3C, + 0x66, + 0xC2, + 0xC0, + 0xC0, + 0xC2, + 0x66, + 0x3C +}; + +static const uint8_t helvB08L1_0x44_BMP[] = { + 0xF0, + 0xD8, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0xD8, + 0xF0 +}; + +static const uint8_t helvB08L1_0x45_BMP[] = { + 0xF8, + 0xC0, + 0xC0, + 0xF8, + 0xC0, + 0xC0, + 0xC0, + 0xF8 +}; + +static const uint8_t helvB08L1_0x46_BMP[] = { + 0xF8, + 0xC0, + 0xC0, + 0xF0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB08L1_0x47_BMP[] = { + 0x3C, + 0x66, + 0xC2, + 0xC0, + 0xCE, + 0xC6, + 0x66, + 0x3A +}; + +static const uint8_t helvB08L1_0x48_BMP[] = { + 0xCC, + 0xCC, + 0xCC, + 0xFC, + 0xCC, + 0xCC, + 0xCC, + 0xCC +}; + +static const uint8_t helvB08L1_0x49_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB08L1_0x4A_BMP[] = { + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0xD8, + 0x70 +}; + +static const uint8_t helvB08L1_0x4B_BMP[] = { + 0xCC, + 0xD8, + 0xF0, + 0xE0, + 0xF0, + 0xD8, + 0xCC, + 0xC6 +}; + +static const uint8_t helvB08L1_0x4C_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xF8 +}; + +static const uint8_t helvB08L1_0x4D_BMP[] = { + 0xC1, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xF7, 0x80, + 0xD5, 0x80, + 0xDD, 0x80, + 0xC9, 0x80, + 0xC9, 0x80 +}; + +static const uint8_t helvB08L1_0x4E_BMP[] = { + 0xC6, + 0xE6, + 0xE6, + 0xD6, + 0xD6, + 0xCE, + 0xCE, + 0xC6 +}; + +static const uint8_t helvB08L1_0x4F_BMP[] = { + 0x38, + 0x6C, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0x6C, + 0x38 +}; + +static const uint8_t helvB08L1_0x50_BMP[] = { + 0xF8, + 0xCC, + 0xCC, + 0xCC, + 0xF8, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB08L1_0x51_BMP[] = { + 0x38, + 0x6C, + 0xC6, + 0xC6, + 0xC6, + 0xD6, + 0x6C, + 0x3C, + 0x02 +}; + +static const uint8_t helvB08L1_0x52_BMP[] = { + 0xF8, + 0xCC, + 0xCC, + 0xCC, + 0xF8, + 0xCC, + 0xCC, + 0xCC +}; + +static const uint8_t helvB08L1_0x53_BMP[] = { + 0x78, + 0xCC, + 0xE0, + 0x78, + 0x1C, + 0x8C, + 0xCC, + 0x78 +}; + +static const uint8_t helvB08L1_0x54_BMP[] = { + 0xFC, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30 +}; + +static const uint8_t helvB08L1_0x55_BMP[] = { + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0x78 +}; + +static const uint8_t helvB08L1_0x56_BMP[] = { + 0xC6, + 0xC6, + 0x6C, + 0x6C, + 0x6C, + 0x38, + 0x38, + 0x10 +}; + +static const uint8_t helvB08L1_0x57_BMP[] = { + 0xCC, 0xC0, + 0xCC, 0xC0, + 0xCC, 0xC0, + 0x6D, 0x80, + 0x6D, 0x80, + 0x7F, 0x80, + 0x33, 0x00, + 0x33, 0x00 +}; + +static const uint8_t helvB08L1_0x58_BMP[] = { + 0xC6, + 0xC6, + 0x6C, + 0x38, + 0x38, + 0x6C, + 0xC6, + 0xC6 +}; + +static const uint8_t helvB08L1_0x59_BMP[] = { + 0xC3, + 0xC3, + 0x66, + 0x66, + 0x3C, + 0x18, + 0x18, + 0x18 +}; + +static const uint8_t helvB08L1_0x5A_BMP[] = { + 0xFC, + 0x0C, + 0x18, + 0x30, + 0x70, + 0x60, + 0xC0, + 0xFC +}; + +static const uint8_t helvB08L1_0x5B_BMP[] = { + 0xE0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xE0 +}; + +static const uint8_t helvB08L1_0x5C_BMP[] = { + 0x80, + 0x80, + 0x40, + 0x40, + 0x20, + 0x20, + 0x10, + 0x10 +}; + +static const uint8_t helvB08L1_0x5D_BMP[] = { + 0xE0, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0xE0 +}; + +static const uint8_t helvB08L1_0x5E_BMP[] = { + 0x60, + 0xF0, + 0x90, + 0x90 +}; + +static const uint8_t helvB08L1_0x5F_BMP[] = { + 0xFC +}; + +static const uint8_t helvB08L1_0x60_BMP[] = { + 0x80, + 0x40 +}; + +static const uint8_t helvB08L1_0x61_BMP[] = { + 0x70, + 0x98, + 0x78, + 0xD8, + 0xD8, + 0x6C +}; + +static const uint8_t helvB08L1_0x62_BMP[] = { + 0xC0, + 0xC0, + 0xF0, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0xF0 +}; + +static const uint8_t helvB08L1_0x63_BMP[] = { + 0x70, + 0xD0, + 0xC0, + 0xC0, + 0xD0, + 0x70 +}; + +static const uint8_t helvB08L1_0x64_BMP[] = { + 0x18, + 0x18, + 0x78, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x78 +}; + +static const uint8_t helvB08L1_0x65_BMP[] = { + 0x70, + 0xD8, + 0xF8, + 0xC0, + 0xD8, + 0x70 +}; + +static const uint8_t helvB08L1_0x66_BMP[] = { + 0x38, + 0x60, + 0xF0, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvB08L1_0x67_BMP[] = { + 0x68, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x78, + 0x18, + 0x70 +}; + +static const uint8_t helvB08L1_0x68_BMP[] = { + 0xC0, + 0xC0, + 0xF0, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0xD8 +}; + +static const uint8_t helvB08L1_0x69_BMP[] = { + 0xC0, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB08L1_0x6A_BMP[] = { + 0x60, + 0x00, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0xC0 +}; + +static const uint8_t helvB08L1_0x6B_BMP[] = { + 0xC0, + 0xC0, + 0xD8, + 0xF0, + 0xE0, + 0xF0, + 0xD8, + 0xCC +}; + +static const uint8_t helvB08L1_0x6C_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB08L1_0x6D_BMP[] = { + 0xB6, + 0xDB, + 0xDB, + 0xDB, + 0xDB, + 0xDB +}; + +static const uint8_t helvB08L1_0x6E_BMP[] = { + 0xB0, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0xD8 +}; + +static const uint8_t helvB08L1_0x6F_BMP[] = { + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t helvB08L1_0x70_BMP[] = { + 0xB0, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0xF0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB08L1_0x71_BMP[] = { + 0x68, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x78, + 0x18, + 0x18 +}; + +static const uint8_t helvB08L1_0x72_BMP[] = { + 0xB0, + 0xE0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB08L1_0x73_BMP[] = { + 0x70, + 0xD8, + 0x70, + 0x18, + 0xD8, + 0x70 +}; + +static const uint8_t helvB08L1_0x74_BMP[] = { + 0x60, + 0x60, + 0xF0, + 0x60, + 0x60, + 0x60, + 0x60, + 0x30 +}; + +static const uint8_t helvB08L1_0x75_BMP[] = { + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x68 +}; + +static const uint8_t helvB08L1_0x76_BMP[] = { + 0xD8, + 0xD8, + 0xD8, + 0x50, + 0x70, + 0x20 +}; + +static const uint8_t helvB08L1_0x77_BMP[] = { + 0xD6, + 0xD6, + 0xD6, + 0x6C, + 0x6C, + 0x6C +}; + +static const uint8_t helvB08L1_0x78_BMP[] = { + 0xCC, + 0x78, + 0x30, + 0x78, + 0xCC, + 0xCC +}; + +static const uint8_t helvB08L1_0x79_BMP[] = { + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x78, + 0x30, + 0x30, + 0x60 +}; + +static const uint8_t helvB08L1_0x7A_BMP[] = { + 0xF8, + 0x18, + 0x30, + 0x60, + 0xC0, + 0xF8 +}; + +static const uint8_t helvB08L1_0x7B_BMP[] = { + 0x30, + 0x60, + 0x60, + 0x60, + 0xC0, + 0x60, + 0x60, + 0x60, + 0x60, + 0x30 +}; + +static const uint8_t helvB08L1_0x7C_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvB08L1_0x7D_BMP[] = { + 0xC0, + 0x60, + 0x60, + 0x60, + 0x30, + 0x60, + 0x60, + 0x60, + 0x60, + 0xC0 +}; + +static const uint8_t helvB08L1_0x7E_BMP[] = { + 0x68, + 0xB0 +}; + +static const uint8_t helvB08L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t helvB08L1_0xA1_BMP[] = { + 0xC0, + 0x00, + 0x40, + 0x40, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB08L1_0xA2_BMP[] = { + 0x10, + 0x70, + 0xD8, + 0xA0, + 0xA0, + 0xD8, + 0x70, + 0x40 +}; + +static const uint8_t helvB08L1_0xA3_BMP[] = { + 0x38, + 0x68, + 0x60, + 0xF0, + 0x60, + 0x60, + 0x68, + 0xD8 +}; + +static const uint8_t helvB08L1_0xA4_BMP[] = { + 0x84, + 0x78, + 0x48, + 0x48, + 0x78, + 0x84 +}; + +static const uint8_t helvB08L1_0xA5_BMP[] = { + 0x84, + 0x84, + 0xCC, + 0x48, + 0xFC, + 0x30, + 0xFC, + 0x30 +}; + +static const uint8_t helvB08L1_0xA6_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x00, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvB08L1_0xA7_BMP[] = { + 0x70, + 0xC8, + 0xE0, + 0x70, + 0x98, + 0xC8, + 0x70, + 0x38, + 0x98, + 0x70 +}; + +static const uint8_t helvB08L1_0xA8_BMP[] = { + 0xA0 +}; + +static const uint8_t helvB08L1_0xA9_BMP[] = { + 0x3C, + 0x42, + 0x99, + 0xA5, + 0xA1, + 0x9D, + 0x42, + 0x3C +}; + +static const uint8_t helvB08L1_0xAA_BMP[] = { + 0xE0, + 0x20, + 0xA0, + 0x00, + 0xE0 +}; + +static const uint8_t helvB08L1_0xAB_BMP[] = { + 0x6C, + 0xD8, + 0x6C +}; + +static const uint8_t helvB08L1_0xAC_BMP[] = { + 0xF8, + 0x08, + 0x08 +}; + +static const uint8_t helvB08L1_0xAD_BMP[] = { + 0xF0 +}; + +static const uint8_t helvB08L1_0xAE_BMP[] = { + 0x3C, + 0x42, + 0xBD, + 0xA5, + 0xB9, + 0xA5, + 0x42, + 0x3C +}; + +static const uint8_t helvB08L1_0xAF_BMP[] = { + 0xE0 +}; + +static const uint8_t helvB08L1_0xB0_BMP[] = { + 0x60, + 0xA0, + 0xC0 +}; + +static const uint8_t helvB08L1_0xB1_BMP[] = { + 0x30, + 0x30, + 0xFC, + 0x30, + 0x30, + 0x00, + 0xFC +}; + +static const uint8_t helvB08L1_0xB2_BMP[] = { + 0x60, + 0xA0, + 0x40, + 0xE0 +}; + +static const uint8_t helvB08L1_0xB3_BMP[] = { + 0xE0, + 0x40, + 0x20, + 0xC0 +}; + +static const uint8_t helvB08L1_0xB4_BMP[] = { + 0x40, + 0x80 +}; + +static const uint8_t helvB08L1_0xB5_BMP[] = { + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0xE8, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB08L1_0xB6_BMP[] = { + 0x7C, + 0xE8, + 0xE8, + 0xE8, + 0x68, + 0x28, + 0x28, + 0x28, + 0x28, + 0x28 +}; + +static const uint8_t helvB08L1_0xB7_BMP[] = { + 0xC0 +}; + +static const uint8_t helvB08L1_0xB8_BMP[] = { + 0x40, + 0xC0 +}; + +static const uint8_t helvB08L1_0xB9_BMP[] = { + 0x40, + 0xC0, + 0x40, + 0x40 +}; + +static const uint8_t helvB08L1_0xBA_BMP[] = { + 0xE0, + 0xA0, + 0xE0, + 0x00, + 0xE0 +}; + +static const uint8_t helvB08L1_0xBB_BMP[] = { + 0xD8, + 0x6C, + 0xD8 +}; + +static const uint8_t helvB08L1_0xBC_BMP[] = { + 0x44, + 0xC4, + 0x48, + 0x48, + 0x12, + 0x26, + 0x2F, + 0x42 +}; + +static const uint8_t helvB08L1_0xBD_BMP[] = { + 0x44, + 0xC4, + 0x48, + 0x48, + 0x16, + 0x2A, + 0x24, + 0x4E +}; + +static const uint8_t helvB08L1_0xBE_BMP[] = { + 0xE4, + 0x44, + 0x28, + 0xC8, + 0x12, + 0x26, + 0x2F, + 0x42 +}; + +static const uint8_t helvB08L1_0xBF_BMP[] = { + 0x30, + 0x00, + 0x30, + 0x30, + 0x60, + 0xC0, + 0xD8, + 0x70 +}; + +static const uint8_t helvB08L1_0xC0_BMP[] = { + 0x20, + 0x10, + 0x00, + 0x38, + 0x38, + 0x6C, + 0x6C, + 0x6C, + 0xFE, + 0xC6, + 0xC6 +}; + +static const uint8_t helvB08L1_0xC1_BMP[] = { + 0x08, + 0x10, + 0x00, + 0x38, + 0x38, + 0x6C, + 0x6C, + 0x6C, + 0xFE, + 0xC6, + 0xC6 +}; + +static const uint8_t helvB08L1_0xC2_BMP[] = { + 0x10, + 0x28, + 0x00, + 0x38, + 0x38, + 0x6C, + 0x6C, + 0x6C, + 0xFE, + 0xC6, + 0xC6 +}; + +static const uint8_t helvB08L1_0xC3_BMP[] = { + 0x14, + 0x28, + 0x00, + 0x38, + 0x38, + 0x6C, + 0x6C, + 0x6C, + 0xFE, + 0xC6, + 0xC6 +}; + +static const uint8_t helvB08L1_0xC4_BMP[] = { + 0x28, + 0x00, + 0x38, + 0x38, + 0x6C, + 0x6C, + 0x6C, + 0xFE, + 0xC6, + 0xC6 +}; + +static const uint8_t helvB08L1_0xC5_BMP[] = { + 0x10, + 0x28, + 0x10, + 0x38, + 0x38, + 0x6C, + 0x6C, + 0x6C, + 0xFE, + 0xC6, + 0xC6 +}; + +static const uint8_t helvB08L1_0xC6_BMP[] = { + 0x3F, 0x80, + 0x3C, 0x00, + 0x6C, 0x00, + 0x6F, 0x80, + 0x6C, 0x00, + 0xFC, 0x00, + 0xCC, 0x00, + 0xCF, 0x80 +}; + +static const uint8_t helvB08L1_0xC7_BMP[] = { + 0x3C, + 0x66, + 0xC2, + 0xC0, + 0xC0, + 0xC2, + 0x66, + 0x3C, + 0x10, + 0x30 +}; + +static const uint8_t helvB08L1_0xC8_BMP[] = { + 0x40, + 0x20, + 0x00, + 0xF8, + 0xC0, + 0xC0, + 0xF8, + 0xC0, + 0xC0, + 0xC0, + 0xF8 +}; + +static const uint8_t helvB08L1_0xC9_BMP[] = { + 0x10, + 0x20, + 0x00, + 0xF8, + 0xC0, + 0xC0, + 0xF8, + 0xC0, + 0xC0, + 0xC0, + 0xF8 +}; + +static const uint8_t helvB08L1_0xCA_BMP[] = { + 0x20, + 0x50, + 0x00, + 0xF8, + 0xC0, + 0xC0, + 0xF8, + 0xC0, + 0xC0, + 0xC0, + 0xF8 +}; + +static const uint8_t helvB08L1_0xCB_BMP[] = { + 0x50, + 0x00, + 0xF8, + 0xC0, + 0xC0, + 0xF8, + 0xC0, + 0xC0, + 0xC0, + 0xF8 +}; + +static const uint8_t helvB08L1_0xCC_BMP[] = { + 0x80, + 0x40, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB08L1_0xCD_BMP[] = { + 0x40, + 0x80, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB08L1_0xCE_BMP[] = { + 0x40, + 0xA0, + 0x00, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvB08L1_0xCF_BMP[] = { + 0x90, + 0x00, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvB08L1_0xD0_BMP[] = { + 0x78, + 0x6C, + 0x66, + 0xF6, + 0x66, + 0x66, + 0x6C, + 0x78 +}; + +static const uint8_t helvB08L1_0xD1_BMP[] = { + 0x14, + 0x28, + 0x00, + 0xC6, + 0xE6, + 0xE6, + 0xD6, + 0xD6, + 0xCE, + 0xCE, + 0xC6 +}; + +static const uint8_t helvB08L1_0xD2_BMP[] = { + 0x10, + 0x08, + 0x00, + 0x38, + 0x6C, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0x6C, + 0x38 +}; + +static const uint8_t helvB08L1_0xD3_BMP[] = { + 0x08, + 0x10, + 0x00, + 0x38, + 0x6C, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0x6C, + 0x38 +}; + +static const uint8_t helvB08L1_0xD4_BMP[] = { + 0x10, + 0x28, + 0x00, + 0x38, + 0x6C, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0x6C, + 0x38 +}; + +static const uint8_t helvB08L1_0xD5_BMP[] = { + 0x14, + 0x28, + 0x00, + 0x38, + 0x6C, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0x6C, + 0x38 +}; + +static const uint8_t helvB08L1_0xD6_BMP[] = { + 0x28, + 0x00, + 0x38, + 0x6C, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0x6C, + 0x38 +}; + +static const uint8_t helvB08L1_0xD7_BMP[] = { + 0xCC, + 0x78, + 0x30, + 0x78, + 0xCC +}; + +static const uint8_t helvB08L1_0xD8_BMP[] = { + 0x3A, + 0x6C, + 0xCE, + 0xD6, + 0xD6, + 0xE6, + 0x6C, + 0xB8 +}; + +static const uint8_t helvB08L1_0xD9_BMP[] = { + 0x20, + 0x10, + 0x00, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0x78 +}; + +static const uint8_t helvB08L1_0xDA_BMP[] = { + 0x08, + 0x10, + 0x00, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0x78 +}; + +static const uint8_t helvB08L1_0xDB_BMP[] = { + 0x20, + 0x50, + 0x00, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0x78 +}; + +static const uint8_t helvB08L1_0xDC_BMP[] = { + 0x48, + 0x00, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0x78 +}; + +static const uint8_t helvB08L1_0xDD_BMP[] = { + 0x04, + 0x08, + 0x00, + 0xC3, + 0xC3, + 0x66, + 0x66, + 0x3C, + 0x18, + 0x18, + 0x18 +}; + +static const uint8_t helvB08L1_0xDE_BMP[] = { + 0xC0, + 0xF8, + 0xCC, + 0xCC, + 0xCC, + 0xF8, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB08L1_0xDF_BMP[] = { + 0x70, + 0xC8, + 0xC8, + 0xD0, + 0xC8, + 0xC8, + 0xC8, + 0xD0 +}; + +static const uint8_t helvB08L1_0xE0_BMP[] = { + 0x20, + 0x10, + 0x00, + 0x70, + 0x98, + 0x78, + 0xD8, + 0xD8, + 0x6C +}; + +static const uint8_t helvB08L1_0xE1_BMP[] = { + 0x10, + 0x20, + 0x00, + 0x70, + 0x98, + 0x78, + 0xD8, + 0xD8, + 0x6C +}; + +static const uint8_t helvB08L1_0xE2_BMP[] = { + 0x20, + 0x50, + 0x00, + 0x70, + 0x98, + 0x78, + 0xD8, + 0xD8, + 0x6C +}; + +static const uint8_t helvB08L1_0xE3_BMP[] = { + 0x28, + 0x50, + 0x00, + 0x70, + 0x98, + 0x78, + 0xD8, + 0xD8, + 0x6C +}; + +static const uint8_t helvB08L1_0xE4_BMP[] = { + 0x50, + 0x00, + 0x70, + 0x98, + 0x78, + 0xD8, + 0xD8, + 0x6C +}; + +static const uint8_t helvB08L1_0xE5_BMP[] = { + 0x20, + 0x50, + 0x20, + 0x70, + 0x98, + 0x78, + 0xD8, + 0xD8, + 0x6C +}; + +static const uint8_t helvB08L1_0xE6_BMP[] = { + 0x7E, + 0x9B, + 0x7F, + 0xD8, + 0xDB, + 0x6E +}; + +static const uint8_t helvB08L1_0xE7_BMP[] = { + 0x70, + 0xD0, + 0xC0, + 0xC0, + 0xD0, + 0x70, + 0x20, + 0x60 +}; + +static const uint8_t helvB08L1_0xE8_BMP[] = { + 0x40, + 0x20, + 0x00, + 0x70, + 0xD8, + 0xF8, + 0xC0, + 0xD8, + 0x70 +}; + +static const uint8_t helvB08L1_0xE9_BMP[] = { + 0x10, + 0x20, + 0x00, + 0x70, + 0xD8, + 0xF8, + 0xC0, + 0xD8, + 0x70 +}; + +static const uint8_t helvB08L1_0xEA_BMP[] = { + 0x20, + 0x50, + 0x00, + 0x70, + 0xD8, + 0xF8, + 0xC0, + 0xD8, + 0x70 +}; + +static const uint8_t helvB08L1_0xEB_BMP[] = { + 0x50, + 0x00, + 0x70, + 0xD8, + 0xF8, + 0xC0, + 0xD8, + 0x70 +}; + +static const uint8_t helvB08L1_0xEC_BMP[] = { + 0x80, + 0x40, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB08L1_0xED_BMP[] = { + 0x40, + 0x80, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB08L1_0xEE_BMP[] = { + 0x40, + 0xA0, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB08L1_0xEF_BMP[] = { + 0xA0, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB08L1_0xF0_BMP[] = { + 0x50, + 0x60, + 0xA0, + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t helvB08L1_0xF1_BMP[] = { + 0x50, + 0xA0, + 0x00, + 0xB0, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0xD8 +}; + +static const uint8_t helvB08L1_0xF2_BMP[] = { + 0x40, + 0x20, + 0x00, + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t helvB08L1_0xF3_BMP[] = { + 0x10, + 0x20, + 0x00, + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t helvB08L1_0xF4_BMP[] = { + 0x20, + 0x50, + 0x00, + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t helvB08L1_0xF5_BMP[] = { + 0x50, + 0xA0, + 0x00, + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t helvB08L1_0xF6_BMP[] = { + 0x50, + 0x00, + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x70 +}; + +static const uint8_t helvB08L1_0xF7_BMP[] = { + 0x30, + 0x00, + 0xFC, + 0x00, + 0x30 +}; + +static const uint8_t helvB08L1_0xF8_BMP[] = { + 0x3A, + 0x6C, + 0x7C, + 0x6C, + 0x6C, + 0xB8 +}; + +static const uint8_t helvB08L1_0xF9_BMP[] = { + 0x40, + 0x20, + 0x00, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x68 +}; + +static const uint8_t helvB08L1_0xFA_BMP[] = { + 0x10, + 0x20, + 0x00, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x68 +}; + +static const uint8_t helvB08L1_0xFB_BMP[] = { + 0x20, + 0x50, + 0x00, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x68 +}; + +static const uint8_t helvB08L1_0xFC_BMP[] = { + 0x50, + 0x00, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x68 +}; + +static const uint8_t helvB08L1_0xFD_BMP[] = { + 0x10, + 0x20, + 0x00, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x78, + 0x30, + 0x30, + 0x60 +}; + +static const uint8_t helvB08L1_0xFE_BMP[] = { + 0xC0, + 0xC0, + 0xF0, + 0xD8, + 0xC8, + 0xC8, + 0xD8, + 0xF0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB08L1_0xFF_BMP[] = { + 0x50, + 0x00, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x78, + 0x30, + 0x30, + 0x60 +}; + +static const GFONT_CharInfo FontBMP[] = { + {7, 5, 7, 0, 0, helvB08L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {3, 1, 1, 0, 0, helvB08L1_0x20_BMP}, + {4, 2, 8, 1, 0, helvB08L1_0x21_BMP}, + {5, 3, 3, 1, 5, helvB08L1_0x22_BMP}, + {6, 7, 7, -1, 0, helvB08L1_0x23_BMP}, + {6, 5, 10, 0, -1, helvB08L1_0x24_BMP}, + {8, 7, 8, 0, 0, helvB08L1_0x25_BMP}, + {8, 7, 8, 0, 0, helvB08L1_0x26_BMP}, + {3, 1, 3, 1, 5, helvB08L1_0x27_BMP}, + {4, 3, 10, 0, -2, helvB08L1_0x28_BMP}, + {4, 3, 10, 0, -2, helvB08L1_0x29_BMP}, + {4, 3, 3, 0, 5, helvB08L1_0x2A_BMP}, + {6, 6, 5, 0, 1, helvB08L1_0x2B_BMP}, + {3, 2, 4, 0, -2, helvB08L1_0x2C_BMP}, + {5, 4, 1, 0, 3, helvB08L1_0x2D_BMP}, + {3, 2, 2, 0, 0, helvB08L1_0x2E_BMP}, + {4, 4, 8, 0, 0, helvB08L1_0x2F_BMP}, + {6, 5, 8, 0, 0, helvB08L1_0x30_BMP}, + {6, 3, 8, 1, 0, helvB08L1_0x31_BMP}, + {6, 5, 8, 0, 0, helvB08L1_0x32_BMP}, + {6, 5, 8, 0, 0, helvB08L1_0x33_BMP}, + {6, 6, 8, 0, 0, helvB08L1_0x34_BMP}, + {6, 5, 8, 0, 0, helvB08L1_0x35_BMP}, + {6, 5, 8, 0, 0, helvB08L1_0x36_BMP}, + {6, 5, 8, 0, 0, helvB08L1_0x37_BMP}, + {6, 5, 8, 0, 0, helvB08L1_0x38_BMP}, + {6, 5, 8, 0, 0, helvB08L1_0x39_BMP}, + {3, 2, 6, 0, 0, helvB08L1_0x3A_BMP}, + {3, 2, 8, 0, -2, helvB08L1_0x3B_BMP}, + {5, 4, 5, 0, 1, helvB08L1_0x3C_BMP}, + {6, 5, 3, 0, 2, helvB08L1_0x3D_BMP}, + {5, 4, 5, 0, 1, helvB08L1_0x3E_BMP}, + {6, 5, 8, 0, 0, helvB08L1_0x3F_BMP}, + {11, 10, 9, 0, -1, helvB08L1_0x40_BMP}, + {8, 7, 8, 0, 0, helvB08L1_0x41_BMP}, + {7, 6, 8, 0, 0, helvB08L1_0x42_BMP}, + {8, 7, 8, 0, 0, helvB08L1_0x43_BMP}, + {7, 6, 8, 0, 0, helvB08L1_0x44_BMP}, + {6, 5, 8, 0, 0, helvB08L1_0x45_BMP}, + {6, 5, 8, 0, 0, helvB08L1_0x46_BMP}, + {8, 7, 8, 0, 0, helvB08L1_0x47_BMP}, + {7, 6, 8, 0, 0, helvB08L1_0x48_BMP}, + {3, 2, 8, 0, 0, helvB08L1_0x49_BMP}, + {6, 5, 8, 0, 0, helvB08L1_0x4A_BMP}, + {7, 7, 8, 0, 0, helvB08L1_0x4B_BMP}, + {6, 5, 8, 0, 0, helvB08L1_0x4C_BMP}, + {10, 9, 8, 0, 0, helvB08L1_0x4D_BMP}, + {8, 7, 8, 0, 0, helvB08L1_0x4E_BMP}, + {8, 7, 8, 0, 0, helvB08L1_0x4F_BMP}, + {7, 6, 8, 0, 0, helvB08L1_0x50_BMP}, + {8, 7, 9, 0, -1, helvB08L1_0x51_BMP}, + {7, 6, 8, 0, 0, helvB08L1_0x52_BMP}, + {7, 6, 8, 0, 0, helvB08L1_0x53_BMP}, + {7, 6, 8, 0, 0, helvB08L1_0x54_BMP}, + {7, 6, 8, 0, 0, helvB08L1_0x55_BMP}, + {8, 7, 8, 0, 0, helvB08L1_0x56_BMP}, + {11, 10, 8, 0, 0, helvB08L1_0x57_BMP}, + {8, 7, 8, 0, 0, helvB08L1_0x58_BMP}, + {9, 8, 8, 0, 0, helvB08L1_0x59_BMP}, + {7, 6, 8, 0, 0, helvB08L1_0x5A_BMP}, + {4, 3, 10, 0, -2, helvB08L1_0x5B_BMP}, + {4, 4, 8, 0, 0, helvB08L1_0x5C_BMP}, + {4, 3, 10, 0, -2, helvB08L1_0x5D_BMP}, + {5, 4, 4, 0, 4, helvB08L1_0x5E_BMP}, + {6, 6, 1, 0, -2, helvB08L1_0x5F_BMP}, + {3, 2, 2, 0, 7, helvB08L1_0x60_BMP}, + {6, 6, 6, 0, 0, helvB08L1_0x61_BMP}, + {6, 5, 8, 0, 0, helvB08L1_0x62_BMP}, + {5, 4, 6, 0, 0, helvB08L1_0x63_BMP}, + {6, 5, 8, 0, 0, helvB08L1_0x64_BMP}, + {6, 5, 6, 0, 0, helvB08L1_0x65_BMP}, + {4, 5, 8, -1, 0, helvB08L1_0x66_BMP}, + {6, 5, 8, 0, -2, helvB08L1_0x67_BMP}, + {6, 5, 8, 0, 0, helvB08L1_0x68_BMP}, + {3, 2, 8, 0, 0, helvB08L1_0x69_BMP}, + {3, 3, 10, -1, -2, helvB08L1_0x6A_BMP}, + {6, 6, 8, 0, 0, helvB08L1_0x6B_BMP}, + {3, 2, 8, 0, 0, helvB08L1_0x6C_BMP}, + {9, 8, 6, 0, 0, helvB08L1_0x6D_BMP}, + {6, 5, 6, 0, 0, helvB08L1_0x6E_BMP}, + {6, 5, 6, 0, 0, helvB08L1_0x6F_BMP}, + {6, 5, 8, 0, -2, helvB08L1_0x70_BMP}, + {6, 5, 8, 0, -2, helvB08L1_0x71_BMP}, + {4, 4, 6, 0, 0, helvB08L1_0x72_BMP}, + {6, 5, 6, 0, 0, helvB08L1_0x73_BMP}, + {4, 4, 8, -1, 0, helvB08L1_0x74_BMP}, + {6, 5, 6, 0, 0, helvB08L1_0x75_BMP}, + {6, 5, 6, 0, 0, helvB08L1_0x76_BMP}, + {8, 7, 6, 0, 0, helvB08L1_0x77_BMP}, + {7, 6, 6, 0, 0, helvB08L1_0x78_BMP}, + {6, 5, 8, 0, -2, helvB08L1_0x79_BMP}, + {6, 5, 6, 0, 0, helvB08L1_0x7A_BMP}, + {5, 4, 10, 0, -2, helvB08L1_0x7B_BMP}, + {3, 1, 10, 1, -2, helvB08L1_0x7C_BMP}, + {5, 4, 10, 0, -2, helvB08L1_0x7D_BMP}, + {6, 5, 2, 0, 3, helvB08L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {3, 1, 1, 0, 0, helvB08L1_0xA0_BMP}, + {4, 2, 8, 1, -2, helvB08L1_0xA1_BMP}, + {6, 5, 8, 0, -1, helvB08L1_0xA2_BMP}, + {6, 5, 8, 0, 0, helvB08L1_0xA3_BMP}, + {6, 6, 6, 0, 1, helvB08L1_0xA4_BMP}, + {7, 6, 8, 0, 0, helvB08L1_0xA5_BMP}, + {3, 1, 10, 1, -2, helvB08L1_0xA6_BMP}, + {6, 5, 10, 0, -2, helvB08L1_0xA7_BMP}, + {3, 3, 1, 0, 7, helvB08L1_0xA8_BMP}, + {10, 8, 8, 1, 0, helvB08L1_0xA9_BMP}, + {5, 3, 5, 1, 3, helvB08L1_0xAA_BMP}, + {7, 6, 3, 0, 1, helvB08L1_0xAB_BMP}, + {7, 5, 3, 1, 2, helvB08L1_0xAC_BMP}, + {5, 4, 1, 0, 3, helvB08L1_0xAD_BMP}, + {10, 8, 8, 1, 0, helvB08L1_0xAE_BMP}, + {3, 3, 1, 0, 7, helvB08L1_0xAF_BMP}, + {4, 3, 3, 0, 5, helvB08L1_0xB0_BMP}, + {6, 6, 7, 0, 0, helvB08L1_0xB1_BMP}, + {3, 3, 4, 0, 4, helvB08L1_0xB2_BMP}, + {3, 3, 4, 0, 4, helvB08L1_0xB3_BMP}, + {3, 2, 2, 0, 7, helvB08L1_0xB4_BMP}, + {6, 5, 8, 0, -2, helvB08L1_0xB5_BMP}, + {6, 6, 10, 0, -2, helvB08L1_0xB6_BMP}, + {3, 2, 1, 0, 3, helvB08L1_0xB7_BMP}, + {3, 2, 2, 0, -2, helvB08L1_0xB8_BMP}, + {3, 2, 4, 0, 4, helvB08L1_0xB9_BMP}, + {5, 3, 5, 1, 3, helvB08L1_0xBA_BMP}, + {7, 6, 3, 0, 1, helvB08L1_0xBB_BMP}, + {9, 8, 8, 0, 0, helvB08L1_0xBC_BMP}, + {9, 7, 8, 0, 0, helvB08L1_0xBD_BMP}, + {9, 8, 8, 0, 0, helvB08L1_0xBE_BMP}, + {6, 5, 8, 0, -2, helvB08L1_0xBF_BMP}, + {8, 7, 11, 0, 0, helvB08L1_0xC0_BMP}, + {8, 7, 11, 0, 0, helvB08L1_0xC1_BMP}, + {8, 7, 11, 0, 0, helvB08L1_0xC2_BMP}, + {8, 7, 11, 0, 0, helvB08L1_0xC3_BMP}, + {8, 7, 10, 0, 0, helvB08L1_0xC4_BMP}, + {8, 7, 11, 0, 0, helvB08L1_0xC5_BMP}, + {10, 9, 8, 0, 0, helvB08L1_0xC6_BMP}, + {8, 7, 10, 0, -2, helvB08L1_0xC7_BMP}, + {6, 5, 11, 0, 0, helvB08L1_0xC8_BMP}, + {6, 5, 11, 0, 0, helvB08L1_0xC9_BMP}, + {6, 5, 11, 0, 0, helvB08L1_0xCA_BMP}, + {6, 5, 10, 0, 0, helvB08L1_0xCB_BMP}, + {3, 2, 11, 0, 0, helvB08L1_0xCC_BMP}, + {3, 2, 11, 0, 0, helvB08L1_0xCD_BMP}, + {3, 3, 11, -1, 0, helvB08L1_0xCE_BMP}, + {3, 4, 10, -1, 0, helvB08L1_0xCF_BMP}, + {7, 7, 8, -1, 0, helvB08L1_0xD0_BMP}, + {8, 7, 11, 0, 0, helvB08L1_0xD1_BMP}, + {8, 7, 11, 0, 0, helvB08L1_0xD2_BMP}, + {8, 7, 11, 0, 0, helvB08L1_0xD3_BMP}, + {8, 7, 11, 0, 0, helvB08L1_0xD4_BMP}, + {8, 7, 11, 0, 0, helvB08L1_0xD5_BMP}, + {8, 7, 10, 0, 0, helvB08L1_0xD6_BMP}, + {6, 6, 5, 0, 1, helvB08L1_0xD7_BMP}, + {8, 7, 8, 0, 0, helvB08L1_0xD8_BMP}, + {7, 6, 11, 0, 0, helvB08L1_0xD9_BMP}, + {7, 6, 11, 0, 0, helvB08L1_0xDA_BMP}, + {7, 6, 11, 0, 0, helvB08L1_0xDB_BMP}, + {7, 6, 10, 0, 0, helvB08L1_0xDC_BMP}, + {9, 8, 11, 0, 0, helvB08L1_0xDD_BMP}, + {7, 6, 8, 0, 0, helvB08L1_0xDE_BMP}, + {6, 5, 8, 0, 0, helvB08L1_0xDF_BMP}, + {6, 6, 9, 0, 0, helvB08L1_0xE0_BMP}, + {6, 6, 9, 0, 0, helvB08L1_0xE1_BMP}, + {6, 6, 9, 0, 0, helvB08L1_0xE2_BMP}, + {6, 6, 9, 0, 0, helvB08L1_0xE3_BMP}, + {6, 6, 8, 0, 0, helvB08L1_0xE4_BMP}, + {6, 6, 9, 0, 0, helvB08L1_0xE5_BMP}, + {9, 8, 6, 0, 0, helvB08L1_0xE6_BMP}, + {5, 4, 8, 0, -2, helvB08L1_0xE7_BMP}, + {6, 5, 9, 0, 0, helvB08L1_0xE8_BMP}, + {6, 5, 9, 0, 0, helvB08L1_0xE9_BMP}, + {6, 5, 9, 0, 0, helvB08L1_0xEA_BMP}, + {6, 5, 8, 0, 0, helvB08L1_0xEB_BMP}, + {3, 2, 9, 0, 0, helvB08L1_0xEC_BMP}, + {3, 2, 9, 0, 0, helvB08L1_0xED_BMP}, + {3, 3, 9, 0, 0, helvB08L1_0xEE_BMP}, + {3, 3, 8, 0, 0, helvB08L1_0xEF_BMP}, + {6, 5, 9, 0, 0, helvB08L1_0xF0_BMP}, + {6, 5, 9, 0, 0, helvB08L1_0xF1_BMP}, + {6, 5, 9, 0, 0, helvB08L1_0xF2_BMP}, + {6, 5, 9, 0, 0, helvB08L1_0xF3_BMP}, + {6, 5, 9, 0, 0, helvB08L1_0xF4_BMP}, + {6, 5, 9, 0, 0, helvB08L1_0xF5_BMP}, + {6, 5, 8, 0, 0, helvB08L1_0xF6_BMP}, + {6, 6, 5, 0, 1, helvB08L1_0xF7_BMP}, + {6, 7, 6, -1, 0, helvB08L1_0xF8_BMP}, + {6, 5, 9, 0, 0, helvB08L1_0xF9_BMP}, + {6, 5, 9, 0, 0, helvB08L1_0xFA_BMP}, + {6, 5, 9, 0, 0, helvB08L1_0xFB_BMP}, + {6, 5, 8, 0, 0, helvB08L1_0xFC_BMP}, + {6, 5, 11, 0, -2, helvB08L1_0xFD_BMP}, + {6, 5, 10, 0, -2, helvB08L1_0xFE_BMP}, + {6, 5, 10, 0, -2, helvB08L1_0xFF_BMP} +}; + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontHelv08Bold_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontHelv08Bold_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontHelv08Bold_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontHelv08Bold_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontHelv08Bold_GetFontChar, + McuFontHelv08Bold_FBBy, + McuFontHelv08Bold_GetUnderlineBoxHeight(), + McuFontHelv08Bold_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv08Bold_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv08Bold_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv08Bold_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv08Bold_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontHelv08Bold. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv08Bold.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv08Bold.h new file mode 100644 index 0000000..f1d1f6e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv08Bold.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv08Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv08Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 8 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv08Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv08Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv08Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv08Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv08Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv08Bold_Deinit(void); +** Init - void McuFontHelv08Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv08Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv08Bold_module McuFontHelv08Bold module documentation +** @{ +*/ + + +#ifndef __McuFontHelv08Bold_H +#define __McuFontHelv08Bold_H + +/* MODULE McuFontHelv08Bold. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontHelv08Boldconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontHelv08Bold_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontHelv08Bold_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontHelv08Bold_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontHelv08Bold_GetLineSpaceHeight() \ + 2 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontHelv08Bold_GetUnderlineBoxHeight() \ + 2 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontHelv08Bold_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontHelv08Bold_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontHelv08Bold. */ + +#endif +/* ifndef __McuFontHelv08Bold_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv08Normal.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv08Normal.c new file mode 100644 index 0000000..b2de8f0 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv08Normal.c @@ -0,0 +1,2585 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv08Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv08Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 8 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv08Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv08Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv08Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv08Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv08Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv08Normal_Deinit(void); +** Init - void McuFontHelv08Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv08Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv08Normal_module McuFontHelv08Normal module documentation +** @{ +*/ + +/* MODULE McuFontHelv08Normal. */ + +#include "McuFontHelv08Normal.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontHelv08Normal_FBBy 12 + +static const uint8_t helvR08L1_0x00_BMP[] = { + 0xA8, + 0x00, + 0x88, + 0x00, + 0x88, + 0x00, + 0xA8 +}; + +static const uint8_t helvR08L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t helvR08L1_0x21_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x00, + 0x80 +}; + +static const uint8_t helvR08L1_0x22_BMP[] = { + 0xA0, + 0xA0 +}; + +static const uint8_t helvR08L1_0x23_BMP[] = { + 0x28, + 0x28, + 0x7C, + 0x28, + 0xF8, + 0x50, + 0x50 +}; + +static const uint8_t helvR08L1_0x24_BMP[] = { + 0x20, + 0x70, + 0xA8, + 0xA0, + 0x70, + 0x28, + 0x28, + 0xA8, + 0x70, + 0x20 +}; + +static const uint8_t helvR08L1_0x25_BMP[] = { + 0x64, + 0x94, + 0x68, + 0x08, + 0x10, + 0x16, + 0x29, + 0x26 +}; + +static const uint8_t helvR08L1_0x26_BMP[] = { + 0x60, + 0x90, + 0x90, + 0x60, + 0x94, + 0x88, + 0x98, + 0x64 +}; + +static const uint8_t helvR08L1_0x27_BMP[] = { + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0x28_BMP[] = { + 0x20, + 0x40, + 0x40, + 0x80, + 0x80, + 0x80, + 0x80, + 0x40, + 0x40, + 0x20 +}; + +static const uint8_t helvR08L1_0x29_BMP[] = { + 0x80, + 0x40, + 0x40, + 0x20, + 0x20, + 0x20, + 0x20, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t helvR08L1_0x2A_BMP[] = { + 0xA0, + 0x40, + 0xA0 +}; + +static const uint8_t helvR08L1_0x2B_BMP[] = { + 0x20, + 0x20, + 0xF8, + 0x20, + 0x20 +}; + +static const uint8_t helvR08L1_0x2C_BMP[] = { + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t helvR08L1_0x2D_BMP[] = { + 0xE0 +}; + +static const uint8_t helvR08L1_0x2E_BMP[] = { + 0x80 +}; + +static const uint8_t helvR08L1_0x2F_BMP[] = { + 0x20, + 0x20, + 0x40, + 0x40, + 0x40, + 0x40, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0x30_BMP[] = { + 0x70, + 0x88, + 0x88, + 0x88, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0x31_BMP[] = { + 0x40, + 0xC0, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR08L1_0x32_BMP[] = { + 0x70, + 0x88, + 0x08, + 0x08, + 0x30, + 0x40, + 0x80, + 0xF8 +}; + +static const uint8_t helvR08L1_0x33_BMP[] = { + 0x70, + 0x88, + 0x08, + 0x30, + 0x08, + 0x08, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0x34_BMP[] = { + 0x10, + 0x30, + 0x50, + 0x50, + 0x90, + 0xF8, + 0x10, + 0x10 +}; + +static const uint8_t helvR08L1_0x35_BMP[] = { + 0x78, + 0x40, + 0x40, + 0x70, + 0x08, + 0x08, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0x36_BMP[] = { + 0x70, + 0x88, + 0x80, + 0xF0, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0x37_BMP[] = { + 0xF8, + 0x08, + 0x10, + 0x20, + 0x20, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR08L1_0x38_BMP[] = { + 0x70, + 0x88, + 0x88, + 0x70, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0x39_BMP[] = { + 0x70, + 0x88, + 0x88, + 0x88, + 0x78, + 0x08, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0x3A_BMP[] = { + 0x80, + 0x00, + 0x00, + 0x00, + 0x00, + 0x80 +}; + +static const uint8_t helvR08L1_0x3B_BMP[] = { + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t helvR08L1_0x3C_BMP[] = { + 0x20, + 0x40, + 0x80, + 0x40, + 0x20 +}; + +static const uint8_t helvR08L1_0x3D_BMP[] = { + 0xF0, + 0x00, + 0xF0 +}; + +static const uint8_t helvR08L1_0x3E_BMP[] = { + 0x80, + 0x40, + 0x20, + 0x40, + 0x80 +}; + +static const uint8_t helvR08L1_0x3F_BMP[] = { + 0x60, + 0x90, + 0x10, + 0x20, + 0x40, + 0x40, + 0x00, + 0x40 +}; + +static const uint8_t helvR08L1_0x40_BMP[] = { + 0x1F, 0x00, + 0x20, 0x80, + 0x4D, 0x40, + 0x92, 0x40, + 0xA2, 0x40, + 0xA4, 0x80, + 0x9B, 0x00, + 0x40, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvR08L1_0x41_BMP[] = { + 0x10, + 0x10, + 0x28, + 0x28, + 0x44, + 0x7C, + 0x82, + 0x82 +}; + +static const uint8_t helvR08L1_0x42_BMP[] = { + 0xF0, + 0x88, + 0x88, + 0xF0, + 0x88, + 0x88, + 0x88, + 0xF0 +}; + +static const uint8_t helvR08L1_0x43_BMP[] = { + 0x78, + 0x84, + 0x80, + 0x80, + 0x80, + 0x80, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0x44_BMP[] = { + 0xF0, + 0x88, + 0x84, + 0x84, + 0x84, + 0x84, + 0x88, + 0xF0 +}; + +static const uint8_t helvR08L1_0x45_BMP[] = { + 0xF8, + 0x80, + 0x80, + 0xF8, + 0x80, + 0x80, + 0x80, + 0xF8 +}; + +static const uint8_t helvR08L1_0x46_BMP[] = { + 0xF8, + 0x80, + 0x80, + 0xF0, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0x47_BMP[] = { + 0x78, + 0x84, + 0x80, + 0x80, + 0x8C, + 0x84, + 0x84, + 0x7C +}; + +static const uint8_t helvR08L1_0x48_BMP[] = { + 0x84, + 0x84, + 0x84, + 0xFC, + 0x84, + 0x84, + 0x84, + 0x84 +}; + +static const uint8_t helvR08L1_0x49_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0x4A_BMP[] = { + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x90, + 0x60 +}; + +static const uint8_t helvR08L1_0x4B_BMP[] = { + 0x88, + 0x90, + 0xA0, + 0xE0, + 0x90, + 0x90, + 0x88, + 0x88 +}; + +static const uint8_t helvR08L1_0x4C_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0xF0 +}; + +static const uint8_t helvR08L1_0x4D_BMP[] = { + 0x82, + 0xC6, + 0xC6, + 0xAA, + 0xAA, + 0x92, + 0x92, + 0x92 +}; + +static const uint8_t helvR08L1_0x4E_BMP[] = { + 0xC4, + 0xC4, + 0xA4, + 0xA4, + 0x94, + 0x94, + 0x8C, + 0x8C +}; + +static const uint8_t helvR08L1_0x4F_BMP[] = { + 0x78, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0x50_BMP[] = { + 0xF0, + 0x88, + 0x88, + 0xF0, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0x51_BMP[] = { + 0x78, + 0x84, + 0x84, + 0x84, + 0x84, + 0x94, + 0x8C, + 0x7C, + 0x02 +}; + +static const uint8_t helvR08L1_0x52_BMP[] = { + 0xF0, + 0x88, + 0x88, + 0xF0, + 0x88, + 0x88, + 0x88, + 0x88 +}; + +static const uint8_t helvR08L1_0x53_BMP[] = { + 0x70, + 0x88, + 0x80, + 0x70, + 0x08, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0x54_BMP[] = { + 0xF8, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20 +}; + +static const uint8_t helvR08L1_0x55_BMP[] = { + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0x56_BMP[] = { + 0x82, + 0x82, + 0x44, + 0x44, + 0x44, + 0x28, + 0x28, + 0x10 +}; + +static const uint8_t helvR08L1_0x57_BMP[] = { + 0x88, 0x80, + 0x88, 0x80, + 0x49, 0x00, + 0x49, 0x00, + 0x55, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x22, 0x00 +}; + +static const uint8_t helvR08L1_0x58_BMP[] = { + 0x88, + 0x88, + 0x50, + 0x20, + 0x50, + 0x50, + 0x88, + 0x88 +}; + +static const uint8_t helvR08L1_0x59_BMP[] = { + 0x82, + 0x44, + 0x44, + 0x28, + 0x28, + 0x10, + 0x10, + 0x10 +}; + +static const uint8_t helvR08L1_0x5A_BMP[] = { + 0xF8, + 0x08, + 0x10, + 0x20, + 0x20, + 0x40, + 0x80, + 0xF8 +}; + +static const uint8_t helvR08L1_0x5B_BMP[] = { + 0xC0, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0xC0 +}; + +static const uint8_t helvR08L1_0x5C_BMP[] = { + 0x80, + 0x80, + 0x40, + 0x40, + 0x40, + 0x40, + 0x20, + 0x20 +}; + +static const uint8_t helvR08L1_0x5D_BMP[] = { + 0xC0, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0xC0 +}; + +static const uint8_t helvR08L1_0x5E_BMP[] = { + 0x20, + 0x20, + 0x50, + 0x50, + 0x88 +}; + +static const uint8_t helvR08L1_0x5F_BMP[] = { + 0xFC +}; + +static const uint8_t helvR08L1_0x60_BMP[] = { + 0x80, + 0x40 +}; + +static const uint8_t helvR08L1_0x61_BMP[] = { + 0xE0, + 0x10, + 0x70, + 0x90, + 0x90, + 0x68 +}; + +static const uint8_t helvR08L1_0x62_BMP[] = { + 0x80, + 0x80, + 0xB0, + 0xC8, + 0x88, + 0x88, + 0xC8, + 0xB0 +}; + +static const uint8_t helvR08L1_0x63_BMP[] = { + 0x60, + 0x90, + 0x80, + 0x80, + 0x90, + 0x60 +}; + +static const uint8_t helvR08L1_0x64_BMP[] = { + 0x08, + 0x08, + 0x68, + 0x98, + 0x88, + 0x88, + 0x98, + 0x68 +}; + +static const uint8_t helvR08L1_0x65_BMP[] = { + 0x60, + 0x90, + 0xF0, + 0x80, + 0x90, + 0x60 +}; + +static const uint8_t helvR08L1_0x66_BMP[] = { + 0x30, + 0x40, + 0xE0, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR08L1_0x67_BMP[] = { + 0x68, + 0x98, + 0x88, + 0x88, + 0x98, + 0x68, + 0x08, + 0x70 +}; + +static const uint8_t helvR08L1_0x68_BMP[] = { + 0x80, + 0x80, + 0xB0, + 0xC8, + 0x88, + 0x88, + 0x88, + 0x88 +}; + +static const uint8_t helvR08L1_0x69_BMP[] = { + 0x80, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0x6A_BMP[] = { + 0x40, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t helvR08L1_0x6B_BMP[] = { + 0x80, + 0x80, + 0x90, + 0xA0, + 0xC0, + 0xA0, + 0x90, + 0x90 +}; + +static const uint8_t helvR08L1_0x6C_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0x6D_BMP[] = { + 0xEC, + 0x92, + 0x92, + 0x92, + 0x92, + 0x92 +}; + +static const uint8_t helvR08L1_0x6E_BMP[] = { + 0xB0, + 0xC8, + 0x88, + 0x88, + 0x88, + 0x88 +}; + +static const uint8_t helvR08L1_0x6F_BMP[] = { + 0x70, + 0x88, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0x70_BMP[] = { + 0xB0, + 0xC8, + 0x88, + 0x88, + 0xC8, + 0xB0, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0x71_BMP[] = { + 0x68, + 0x98, + 0x88, + 0x88, + 0x98, + 0x68, + 0x08, + 0x08 +}; + +static const uint8_t helvR08L1_0x72_BMP[] = { + 0xA0, + 0xC0, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0x73_BMP[] = { + 0x60, + 0x90, + 0x60, + 0x10, + 0x90, + 0x60 +}; + +static const uint8_t helvR08L1_0x74_BMP[] = { + 0x40, + 0x40, + 0xE0, + 0x40, + 0x40, + 0x40, + 0x40, + 0x60 +}; + +static const uint8_t helvR08L1_0x75_BMP[] = { + 0x90, + 0x90, + 0x90, + 0x90, + 0x90, + 0x70 +}; + +static const uint8_t helvR08L1_0x76_BMP[] = { + 0x88, + 0x88, + 0x50, + 0x50, + 0x20, + 0x20 +}; + +static const uint8_t helvR08L1_0x77_BMP[] = { + 0x92, + 0x92, + 0x54, + 0x54, + 0x28, + 0x28 +}; + +static const uint8_t helvR08L1_0x78_BMP[] = { + 0x88, + 0x50, + 0x20, + 0x50, + 0x88, + 0x88 +}; + +static const uint8_t helvR08L1_0x79_BMP[] = { + 0x48, + 0x48, + 0x50, + 0x50, + 0x30, + 0x20, + 0x20, + 0xC0 +}; + +static const uint8_t helvR08L1_0x7A_BMP[] = { + 0xF0, + 0x10, + 0x20, + 0x40, + 0x80, + 0xF0 +}; + +static const uint8_t helvR08L1_0x7B_BMP[] = { + 0x20, + 0x40, + 0x40, + 0x40, + 0x80, + 0x40, + 0x40, + 0x40, + 0x40, + 0x20 +}; + +static const uint8_t helvR08L1_0x7C_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0x7D_BMP[] = { + 0x80, + 0x40, + 0x40, + 0x40, + 0x20, + 0x40, + 0x40, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t helvR08L1_0x7E_BMP[] = { + 0x64, + 0x98 +}; + +static const uint8_t helvR08L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t helvR08L1_0xA1_BMP[] = { + 0x80, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0xA2_BMP[] = { + 0x10, + 0x70, + 0xA8, + 0xA0, + 0xA0, + 0xA8, + 0x70, + 0x40 +}; + +static const uint8_t helvR08L1_0xA3_BMP[] = { + 0x30, + 0x48, + 0x40, + 0xE0, + 0x40, + 0x40, + 0x48, + 0xB0 +}; + +static const uint8_t helvR08L1_0xA4_BMP[] = { + 0x90, + 0x60, + 0x90, + 0x90, + 0x60, + 0x90 +}; + +static const uint8_t helvR08L1_0xA5_BMP[] = { + 0x88, + 0x88, + 0x88, + 0x50, + 0xF8, + 0x20, + 0xF8, + 0x20 +}; + +static const uint8_t helvR08L1_0xA6_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x00, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0xA7_BMP[] = { + 0x70, + 0x88, + 0xC0, + 0x70, + 0x98, + 0xC8, + 0x70, + 0x18, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0xA8_BMP[] = { + 0xA0 +}; + +static const uint8_t helvR08L1_0xA9_BMP[] = { + 0x38, + 0x44, + 0x9A, + 0xA2, + 0x9A, + 0x44, + 0x38 +}; + +static const uint8_t helvR08L1_0xAA_BMP[] = { + 0xE0, + 0x20, + 0xA0, + 0x00, + 0xE0 +}; + +static const uint8_t helvR08L1_0xAB_BMP[] = { + 0x28, + 0x50, + 0xA0, + 0x50, + 0x28 +}; + +static const uint8_t helvR08L1_0xAC_BMP[] = { + 0xF8, + 0x08, + 0x08 +}; + +static const uint8_t helvR08L1_0xAD_BMP[] = { + 0xE0 +}; + +static const uint8_t helvR08L1_0xAE_BMP[] = { + 0x38, + 0x44, + 0xBA, + 0xB2, + 0xAA, + 0x44, + 0x38 +}; + +static const uint8_t helvR08L1_0xAF_BMP[] = { + 0xE0 +}; + +static const uint8_t helvR08L1_0xB0_BMP[] = { + 0x60, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t helvR08L1_0xB1_BMP[] = { + 0x20, + 0x20, + 0xF8, + 0x20, + 0x20, + 0x00, + 0xF8 +}; + +static const uint8_t helvR08L1_0xB2_BMP[] = { + 0x60, + 0xA0, + 0x40, + 0xE0 +}; + +static const uint8_t helvR08L1_0xB3_BMP[] = { + 0xE0, + 0x40, + 0x20, + 0xC0 +}; + +static const uint8_t helvR08L1_0xB4_BMP[] = { + 0x40, + 0x80 +}; + +static const uint8_t helvR08L1_0xB5_BMP[] = { + 0x90, + 0x90, + 0x90, + 0x90, + 0x90, + 0xF0, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0xB6_BMP[] = { + 0x7C, + 0xE8, + 0xE8, + 0xE8, + 0x68, + 0x28, + 0x28, + 0x28, + 0x28, + 0x28 +}; + +static const uint8_t helvR08L1_0xB7_BMP[] = { + 0xC0 +}; + +static const uint8_t helvR08L1_0xB8_BMP[] = { + 0x40, + 0xC0 +}; + +static const uint8_t helvR08L1_0xB9_BMP[] = { + 0x40, + 0xC0, + 0x40, + 0x40 +}; + +static const uint8_t helvR08L1_0xBA_BMP[] = { + 0xE0, + 0xA0, + 0xE0, + 0x00, + 0xE0 +}; + +static const uint8_t helvR08L1_0xBB_BMP[] = { + 0xA0, + 0x50, + 0x28, + 0x50, + 0xA0 +}; + +static const uint8_t helvR08L1_0xBC_BMP[] = { + 0x44, 0x00, + 0xC4, 0x00, + 0x48, 0x00, + 0x48, 0x00, + 0x11, 0x00, + 0x13, 0x00, + 0x27, 0x80, + 0x21, 0x00 +}; + +static const uint8_t helvR08L1_0xBD_BMP[] = { + 0x44, + 0xC4, + 0x48, + 0x48, + 0x13, + 0x15, + 0x22, + 0x27 +}; + +static const uint8_t helvR08L1_0xBE_BMP[] = { + 0xE0, 0x00, + 0x44, 0x00, + 0x24, 0x00, + 0xC8, 0x00, + 0x09, 0x00, + 0x13, 0x00, + 0x17, 0x80, + 0x21, 0x00 +}; + +static const uint8_t helvR08L1_0xBF_BMP[] = { + 0x20, + 0x00, + 0x20, + 0x20, + 0x40, + 0x80, + 0x90, + 0x60 +}; + +static const uint8_t helvR08L1_0xC0_BMP[] = { + 0x20, + 0x10, + 0x00, + 0x10, + 0x10, + 0x28, + 0x28, + 0x44, + 0x7C, + 0x82, + 0x82 +}; + +static const uint8_t helvR08L1_0xC1_BMP[] = { + 0x08, + 0x10, + 0x00, + 0x10, + 0x10, + 0x28, + 0x28, + 0x44, + 0x7C, + 0x82, + 0x82 +}; + +static const uint8_t helvR08L1_0xC2_BMP[] = { + 0x10, + 0x28, + 0x00, + 0x10, + 0x10, + 0x28, + 0x28, + 0x44, + 0x7C, + 0x82, + 0x82 +}; + +static const uint8_t helvR08L1_0xC3_BMP[] = { + 0x14, + 0x28, + 0x00, + 0x10, + 0x10, + 0x28, + 0x28, + 0x44, + 0x7C, + 0x82, + 0x82 +}; + +static const uint8_t helvR08L1_0xC4_BMP[] = { + 0x28, + 0x00, + 0x10, + 0x10, + 0x28, + 0x28, + 0x44, + 0x7C, + 0x82, + 0x82 +}; + +static const uint8_t helvR08L1_0xC5_BMP[] = { + 0x10, + 0x28, + 0x10, + 0x10, + 0x10, + 0x28, + 0x28, + 0x44, + 0x7C, + 0x82, + 0x82 +}; + +static const uint8_t helvR08L1_0xC6_BMP[] = { + 0x1F, 0x80, + 0x18, 0x00, + 0x28, 0x00, + 0x2F, 0x80, + 0x48, 0x00, + 0x78, 0x00, + 0x88, 0x00, + 0x8F, 0x80 +}; + +static const uint8_t helvR08L1_0xC7_BMP[] = { + 0x78, + 0x84, + 0x80, + 0x80, + 0x80, + 0x80, + 0x84, + 0x78, + 0x10, + 0x30 +}; + +static const uint8_t helvR08L1_0xC8_BMP[] = { + 0x40, + 0x20, + 0x00, + 0xF8, + 0x80, + 0x80, + 0xF8, + 0x80, + 0x80, + 0x80, + 0xF8 +}; + +static const uint8_t helvR08L1_0xC9_BMP[] = { + 0x10, + 0x20, + 0x00, + 0xF8, + 0x80, + 0x80, + 0xF8, + 0x80, + 0x80, + 0x80, + 0xF8 +}; + +static const uint8_t helvR08L1_0xCA_BMP[] = { + 0x20, + 0x50, + 0x00, + 0xF8, + 0x80, + 0x80, + 0xF8, + 0x80, + 0x80, + 0x80, + 0xF8 +}; + +static const uint8_t helvR08L1_0xCB_BMP[] = { + 0x50, + 0x00, + 0xF8, + 0x80, + 0x80, + 0xF8, + 0x80, + 0x80, + 0x80, + 0xF8 +}; + +static const uint8_t helvR08L1_0xCC_BMP[] = { + 0x80, + 0x40, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR08L1_0xCD_BMP[] = { + 0x40, + 0x80, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0xCE_BMP[] = { + 0x40, + 0xA0, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR08L1_0xCF_BMP[] = { + 0xA0, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR08L1_0xD0_BMP[] = { + 0x78, + 0x44, + 0x42, + 0xF2, + 0x42, + 0x42, + 0x44, + 0x78 +}; + +static const uint8_t helvR08L1_0xD1_BMP[] = { + 0x28, + 0x50, + 0x00, + 0xC4, + 0xC4, + 0xA4, + 0xA4, + 0x94, + 0x94, + 0x8C, + 0x8C +}; + +static const uint8_t helvR08L1_0xD2_BMP[] = { + 0x20, + 0x10, + 0x00, + 0x78, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0xD3_BMP[] = { + 0x08, + 0x10, + 0x00, + 0x78, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0xD4_BMP[] = { + 0x20, + 0x50, + 0x00, + 0x78, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0xD5_BMP[] = { + 0x28, + 0x50, + 0x00, + 0x78, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0xD6_BMP[] = { + 0x48, + 0x00, + 0x78, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0xD7_BMP[] = { + 0x88, + 0x50, + 0x20, + 0x50, + 0x88 +}; + +static const uint8_t helvR08L1_0xD8_BMP[] = { + 0x04, + 0x78, + 0x8C, + 0x94, + 0x94, + 0xA4, + 0xA4, + 0xC4, + 0x78, + 0x80 +}; + +static const uint8_t helvR08L1_0xD9_BMP[] = { + 0x20, + 0x10, + 0x00, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0xDA_BMP[] = { + 0x08, + 0x10, + 0x00, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0xDB_BMP[] = { + 0x20, + 0x50, + 0x00, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0xDC_BMP[] = { + 0x48, + 0x00, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0xDD_BMP[] = { + 0x08, + 0x10, + 0x00, + 0x82, + 0x44, + 0x44, + 0x28, + 0x28, + 0x10, + 0x10, + 0x10 +}; + +static const uint8_t helvR08L1_0xDE_BMP[] = { + 0x80, + 0x80, + 0xF0, + 0x88, + 0x88, + 0xF0, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0xDF_BMP[] = { + 0x60, + 0x90, + 0x90, + 0xA0, + 0x90, + 0x90, + 0x90, + 0xA0 +}; + +static const uint8_t helvR08L1_0xE0_BMP[] = { + 0x40, + 0x20, + 0x00, + 0xE0, + 0x10, + 0x70, + 0x90, + 0x90, + 0x68 +}; + +static const uint8_t helvR08L1_0xE1_BMP[] = { + 0x20, + 0x40, + 0x00, + 0xE0, + 0x10, + 0x70, + 0x90, + 0x90, + 0x68 +}; + +static const uint8_t helvR08L1_0xE2_BMP[] = { + 0x20, + 0x50, + 0x00, + 0xE0, + 0x10, + 0x70, + 0x90, + 0x90, + 0x68 +}; + +static const uint8_t helvR08L1_0xE3_BMP[] = { + 0x50, + 0xA0, + 0x00, + 0xE0, + 0x10, + 0x70, + 0x90, + 0x90, + 0x68 +}; + +static const uint8_t helvR08L1_0xE4_BMP[] = { + 0x50, + 0x00, + 0xE0, + 0x10, + 0x70, + 0x90, + 0x90, + 0x68 +}; + +static const uint8_t helvR08L1_0xE5_BMP[] = { + 0x20, + 0x50, + 0x20, + 0xE0, + 0x10, + 0x70, + 0x90, + 0x90, + 0x68 +}; + +static const uint8_t helvR08L1_0xE6_BMP[] = { + 0xEC, + 0x12, + 0x7E, + 0x90, + 0x92, + 0x6C +}; + +static const uint8_t helvR08L1_0xE7_BMP[] = { + 0x60, + 0x90, + 0x80, + 0x80, + 0x90, + 0x60, + 0x20, + 0x60 +}; + +static const uint8_t helvR08L1_0xE8_BMP[] = { + 0x40, + 0x20, + 0x00, + 0x60, + 0x90, + 0xF0, + 0x80, + 0x90, + 0x60 +}; + +static const uint8_t helvR08L1_0xE9_BMP[] = { + 0x20, + 0x40, + 0x00, + 0x60, + 0x90, + 0xF0, + 0x80, + 0x90, + 0x60 +}; + +static const uint8_t helvR08L1_0xEA_BMP[] = { + 0x40, + 0xA0, + 0x00, + 0x60, + 0x90, + 0xF0, + 0x80, + 0x90, + 0x60 +}; + +static const uint8_t helvR08L1_0xEB_BMP[] = { + 0xA0, + 0x00, + 0x60, + 0x90, + 0xF0, + 0x80, + 0x90, + 0x60 +}; + +static const uint8_t helvR08L1_0xEC_BMP[] = { + 0x80, + 0x40, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR08L1_0xED_BMP[] = { + 0x40, + 0x80, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0xEE_BMP[] = { + 0x40, + 0xA0, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR08L1_0xEF_BMP[] = { + 0xA0, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR08L1_0xF0_BMP[] = { + 0x40, + 0x78, + 0x90, + 0x78, + 0x88, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0xF1_BMP[] = { + 0x50, + 0xA0, + 0x00, + 0xE0, + 0x90, + 0x90, + 0x90, + 0x90, + 0x90 +}; + +static const uint8_t helvR08L1_0xF2_BMP[] = { + 0x40, + 0x20, + 0x00, + 0x70, + 0x88, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0xF3_BMP[] = { + 0x10, + 0x20, + 0x00, + 0x70, + 0x88, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0xF4_BMP[] = { + 0x20, + 0x50, + 0x00, + 0x70, + 0x88, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0xF5_BMP[] = { + 0x28, + 0x50, + 0x00, + 0x70, + 0x88, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0xF6_BMP[] = { + 0x50, + 0x00, + 0x70, + 0x88, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0xF7_BMP[] = { + 0x20, + 0x00, + 0xF8, + 0x00, + 0x20 +}; + +static const uint8_t helvR08L1_0xF8_BMP[] = { + 0x3A, + 0x4C, + 0x54, + 0x64, + 0x44, + 0xB8 +}; + +static const uint8_t helvR08L1_0xF9_BMP[] = { + 0x40, + 0x20, + 0x00, + 0x90, + 0x90, + 0x90, + 0x90, + 0x90, + 0x70 +}; + +static const uint8_t helvR08L1_0xFA_BMP[] = { + 0x10, + 0x20, + 0x00, + 0x90, + 0x90, + 0x90, + 0x90, + 0x90, + 0x70 +}; + +static const uint8_t helvR08L1_0xFB_BMP[] = { + 0x40, + 0xA0, + 0x00, + 0x90, + 0x90, + 0x90, + 0x90, + 0x90, + 0x70 +}; + +static const uint8_t helvR08L1_0xFC_BMP[] = { + 0xA0, + 0x00, + 0x90, + 0x90, + 0x90, + 0x90, + 0x90, + 0x70 +}; + +static const uint8_t helvR08L1_0xFD_BMP[] = { + 0x08, + 0x10, + 0x00, + 0x48, + 0x48, + 0x50, + 0x50, + 0x30, + 0x20, + 0x20, + 0xC0 +}; + +static const uint8_t helvR08L1_0xFE_BMP[] = { + 0x80, + 0x80, + 0xB0, + 0xC8, + 0x88, + 0x88, + 0xC8, + 0xB0, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0xFF_BMP[] = { + 0x50, + 0x00, + 0x48, + 0x48, + 0x50, + 0x50, + 0x30, + 0x20, + 0x20, + 0xC0 +}; + +static const GFONT_CharInfo FontBMP[] = { + {8, 5, 7, 1, 0, helvR08L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {3, 1, 1, 0, 0, helvR08L1_0x20_BMP}, + {3, 1, 8, 1, 0, helvR08L1_0x21_BMP}, + {4, 3, 2, 1, 6, helvR08L1_0x22_BMP}, + {6, 6, 7, 0, 0, helvR08L1_0x23_BMP}, + {6, 5, 10, 0, -1, helvR08L1_0x24_BMP}, + {9, 8, 8, 0, 0, helvR08L1_0x25_BMP}, + {8, 6, 8, 1, 0, helvR08L1_0x26_BMP}, + {2, 1, 2, 0, 6, helvR08L1_0x27_BMP}, + {4, 3, 10, 0, -2, helvR08L1_0x28_BMP}, + {4, 3, 10, 1, -2, helvR08L1_0x29_BMP}, + {4, 3, 3, 0, 5, helvR08L1_0x2A_BMP}, + {6, 5, 5, 0, 1, helvR08L1_0x2B_BMP}, + {3, 2, 3, 0, -2, helvR08L1_0x2C_BMP}, + {4, 3, 1, 0, 3, helvR08L1_0x2D_BMP}, + {3, 1, 1, 1, 0, helvR08L1_0x2E_BMP}, + {3, 3, 8, 0, 0, helvR08L1_0x2F_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x30_BMP}, + {6, 2, 8, 1, 0, helvR08L1_0x31_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x32_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x33_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x34_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x35_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x36_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x37_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x38_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x39_BMP}, + {3, 1, 6, 1, 0, helvR08L1_0x3A_BMP}, + {3, 2, 8, 0, -2, helvR08L1_0x3B_BMP}, + {6, 3, 5, 1, 1, helvR08L1_0x3C_BMP}, + {5, 4, 3, 0, 2, helvR08L1_0x3D_BMP}, + {6, 3, 5, 1, 1, helvR08L1_0x3E_BMP}, + {6, 4, 8, 1, 0, helvR08L1_0x3F_BMP}, + {11, 10, 9, 0, -1, helvR08L1_0x40_BMP}, + {7, 7, 8, 0, 0, helvR08L1_0x41_BMP}, + {7, 5, 8, 1, 0, helvR08L1_0x42_BMP}, + {8, 6, 8, 1, 0, helvR08L1_0x43_BMP}, + {8, 6, 8, 1, 0, helvR08L1_0x44_BMP}, + {7, 5, 8, 1, 0, helvR08L1_0x45_BMP}, + {6, 5, 8, 1, 0, helvR08L1_0x46_BMP}, + {8, 6, 8, 1, 0, helvR08L1_0x47_BMP}, + {8, 6, 8, 1, 0, helvR08L1_0x48_BMP}, + {3, 1, 8, 1, 0, helvR08L1_0x49_BMP}, + {5, 4, 8, 0, 0, helvR08L1_0x4A_BMP}, + {7, 5, 8, 1, 0, helvR08L1_0x4B_BMP}, + {6, 4, 8, 1, 0, helvR08L1_0x4C_BMP}, + {9, 7, 8, 1, 0, helvR08L1_0x4D_BMP}, + {8, 6, 8, 1, 0, helvR08L1_0x4E_BMP}, + {8, 6, 8, 1, 0, helvR08L1_0x4F_BMP}, + {7, 5, 8, 1, 0, helvR08L1_0x50_BMP}, + {8, 7, 9, 1, -1, helvR08L1_0x51_BMP}, + {7, 5, 8, 1, 0, helvR08L1_0x52_BMP}, + {7, 5, 8, 1, 0, helvR08L1_0x53_BMP}, + {5, 5, 8, 0, 0, helvR08L1_0x54_BMP}, + {8, 6, 8, 1, 0, helvR08L1_0x55_BMP}, + {7, 7, 8, 0, 0, helvR08L1_0x56_BMP}, + {9, 9, 8, 0, 0, helvR08L1_0x57_BMP}, + {7, 5, 8, 1, 0, helvR08L1_0x58_BMP}, + {7, 7, 8, 0, 0, helvR08L1_0x59_BMP}, + {7, 5, 8, 1, 0, helvR08L1_0x5A_BMP}, + {3, 2, 10, 1, -2, helvR08L1_0x5B_BMP}, + {3, 3, 8, 0, 0, helvR08L1_0x5C_BMP}, + {3, 2, 10, 0, -2, helvR08L1_0x5D_BMP}, + {6, 5, 5, 0, 3, helvR08L1_0x5E_BMP}, + {6, 6, 1, 0, -2, helvR08L1_0x5F_BMP}, + {3, 2, 2, 0, 7, helvR08L1_0x60_BMP}, + {5, 5, 6, 0, 0, helvR08L1_0x61_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x62_BMP}, + {5, 4, 6, 0, 0, helvR08L1_0x63_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x64_BMP}, + {5, 4, 6, 0, 0, helvR08L1_0x65_BMP}, + {4, 4, 8, 0, 0, helvR08L1_0x66_BMP}, + {6, 5, 8, 0, -2, helvR08L1_0x67_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x68_BMP}, + {2, 1, 8, 0, 0, helvR08L1_0x69_BMP}, + {2, 2, 10, -1, -2, helvR08L1_0x6A_BMP}, + {5, 4, 8, 0, 0, helvR08L1_0x6B_BMP}, + {2, 1, 8, 0, 0, helvR08L1_0x6C_BMP}, + {8, 7, 6, 0, 0, helvR08L1_0x6D_BMP}, + {6, 5, 6, 0, 0, helvR08L1_0x6E_BMP}, + {6, 5, 6, 0, 0, helvR08L1_0x6F_BMP}, + {6, 5, 8, 0, -2, helvR08L1_0x70_BMP}, + {6, 5, 8, 0, -2, helvR08L1_0x71_BMP}, + {4, 3, 6, 0, 0, helvR08L1_0x72_BMP}, + {5, 4, 6, 0, 0, helvR08L1_0x73_BMP}, + {4, 3, 8, 0, 0, helvR08L1_0x74_BMP}, + {5, 4, 6, 0, 0, helvR08L1_0x75_BMP}, + {6, 5, 6, 0, 0, helvR08L1_0x76_BMP}, + {8, 7, 6, 0, 0, helvR08L1_0x77_BMP}, + {6, 5, 6, 0, 0, helvR08L1_0x78_BMP}, + {5, 5, 8, -1, -2, helvR08L1_0x79_BMP}, + {5, 4, 6, 0, 0, helvR08L1_0x7A_BMP}, + {3, 3, 10, 0, -2, helvR08L1_0x7B_BMP}, + {3, 1, 10, 1, -2, helvR08L1_0x7C_BMP}, + {3, 3, 10, 0, -2, helvR08L1_0x7D_BMP}, + {7, 6, 2, 0, 3, helvR08L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {3, 1, 1, 0, 0, helvR08L1_0xA0_BMP}, + {3, 1, 8, 1, -2, helvR08L1_0xA1_BMP}, + {6, 5, 8, 1, -1, helvR08L1_0xA2_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0xA3_BMP}, + {5, 4, 6, 0, 1, helvR08L1_0xA4_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0xA5_BMP}, + {3, 1, 10, 1, -2, helvR08L1_0xA6_BMP}, + {6, 5, 10, 0, -2, helvR08L1_0xA7_BMP}, + {3, 3, 1, 0, 7, helvR08L1_0xA8_BMP}, + {9, 7, 7, 1, 0, helvR08L1_0xA9_BMP}, + {4, 3, 5, 0, 3, helvR08L1_0xAA_BMP}, + {6, 5, 5, 0, 0, helvR08L1_0xAB_BMP}, + {7, 5, 3, 1, 2, helvR08L1_0xAC_BMP}, + {4, 3, 1, 0, 3, helvR08L1_0xAD_BMP}, + {9, 7, 7, 1, 0, helvR08L1_0xAE_BMP}, + {3, 3, 1, 0, 7, helvR08L1_0xAF_BMP}, + {4, 4, 4, 0, 4, helvR08L1_0xB0_BMP}, + {6, 5, 7, 0, 0, helvR08L1_0xB1_BMP}, + {3, 3, 4, 0, 4, helvR08L1_0xB2_BMP}, + {3, 3, 4, 0, 4, helvR08L1_0xB3_BMP}, + {3, 2, 2, 0, 7, helvR08L1_0xB4_BMP}, + {5, 4, 8, 0, -2, helvR08L1_0xB5_BMP}, + {6, 6, 10, 0, -2, helvR08L1_0xB6_BMP}, + {3, 2, 1, 0, 3, helvR08L1_0xB7_BMP}, + {3, 2, 2, 0, -2, helvR08L1_0xB8_BMP}, + {3, 2, 4, 0, 4, helvR08L1_0xB9_BMP}, + {4, 3, 5, 0, 3, helvR08L1_0xBA_BMP}, + {6, 5, 5, 0, 0, helvR08L1_0xBB_BMP}, + {9, 9, 8, 0, 0, helvR08L1_0xBC_BMP}, + {9, 8, 8, 0, 0, helvR08L1_0xBD_BMP}, + {9, 9, 8, 0, 0, helvR08L1_0xBE_BMP}, + {6, 4, 8, 1, -2, helvR08L1_0xBF_BMP}, + {7, 7, 11, 0, 0, helvR08L1_0xC0_BMP}, + {7, 7, 11, 0, 0, helvR08L1_0xC1_BMP}, + {7, 7, 11, 0, 0, helvR08L1_0xC2_BMP}, + {7, 7, 11, 0, 0, helvR08L1_0xC3_BMP}, + {7, 7, 10, 0, 0, helvR08L1_0xC4_BMP}, + {7, 7, 11, 0, 0, helvR08L1_0xC5_BMP}, + {10, 9, 8, 0, 0, helvR08L1_0xC6_BMP}, + {8, 6, 10, 1, -2, helvR08L1_0xC7_BMP}, + {7, 5, 11, 1, 0, helvR08L1_0xC8_BMP}, + {7, 5, 11, 1, 0, helvR08L1_0xC9_BMP}, + {7, 5, 11, 1, 0, helvR08L1_0xCA_BMP}, + {7, 5, 10, 1, 0, helvR08L1_0xCB_BMP}, + {3, 2, 11, 0, 0, helvR08L1_0xCC_BMP}, + {3, 2, 11, 1, 0, helvR08L1_0xCD_BMP}, + {3, 3, 11, 0, 0, helvR08L1_0xCE_BMP}, + {3, 3, 10, 0, 0, helvR08L1_0xCF_BMP}, + {8, 7, 8, 0, 0, helvR08L1_0xD0_BMP}, + {8, 6, 11, 1, 0, helvR08L1_0xD1_BMP}, + {8, 6, 11, 1, 0, helvR08L1_0xD2_BMP}, + {8, 6, 11, 1, 0, helvR08L1_0xD3_BMP}, + {8, 6, 11, 1, 0, helvR08L1_0xD4_BMP}, + {8, 6, 11, 1, 0, helvR08L1_0xD5_BMP}, + {8, 6, 10, 1, 0, helvR08L1_0xD6_BMP}, + {6, 5, 5, 0, 1, helvR08L1_0xD7_BMP}, + {8, 6, 10, 1, -1, helvR08L1_0xD8_BMP}, + {8, 6, 11, 1, 0, helvR08L1_0xD9_BMP}, + {8, 6, 11, 1, 0, helvR08L1_0xDA_BMP}, + {8, 6, 11, 1, 0, helvR08L1_0xDB_BMP}, + {8, 6, 10, 1, 0, helvR08L1_0xDC_BMP}, + {7, 7, 11, 0, 0, helvR08L1_0xDD_BMP}, + {7, 5, 8, 1, 0, helvR08L1_0xDE_BMP}, + {5, 4, 8, 0, 0, helvR08L1_0xDF_BMP}, + {5, 5, 9, 0, 0, helvR08L1_0xE0_BMP}, + {5, 5, 9, 0, 0, helvR08L1_0xE1_BMP}, + {5, 5, 9, 0, 0, helvR08L1_0xE2_BMP}, + {5, 5, 9, 0, 0, helvR08L1_0xE3_BMP}, + {5, 5, 8, 0, 0, helvR08L1_0xE4_BMP}, + {5, 5, 9, 0, 0, helvR08L1_0xE5_BMP}, + {8, 7, 6, 0, 0, helvR08L1_0xE6_BMP}, + {5, 4, 8, 0, -2, helvR08L1_0xE7_BMP}, + {5, 4, 9, 0, 0, helvR08L1_0xE8_BMP}, + {5, 4, 9, 0, 0, helvR08L1_0xE9_BMP}, + {5, 4, 9, 0, 0, helvR08L1_0xEA_BMP}, + {5, 4, 8, 0, 0, helvR08L1_0xEB_BMP}, + {2, 2, 9, -1, 0, helvR08L1_0xEC_BMP}, + {2, 2, 9, 0, 0, helvR08L1_0xED_BMP}, + {2, 3, 9, -1, 0, helvR08L1_0xEE_BMP}, + {2, 3, 8, -1, 0, helvR08L1_0xEF_BMP}, + {6, 5, 9, 0, 0, helvR08L1_0xF0_BMP}, + {5, 4, 9, 0, 0, helvR08L1_0xF1_BMP}, + {6, 5, 9, 0, 0, helvR08L1_0xF2_BMP}, + {6, 5, 9, 0, 0, helvR08L1_0xF3_BMP}, + {6, 5, 9, 0, 0, helvR08L1_0xF4_BMP}, + {6, 5, 9, 0, 0, helvR08L1_0xF5_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0xF6_BMP}, + {6, 5, 5, 0, 1, helvR08L1_0xF7_BMP}, + {6, 7, 6, -1, 0, helvR08L1_0xF8_BMP}, + {5, 4, 9, 0, 0, helvR08L1_0xF9_BMP}, + {5, 4, 9, 0, 0, helvR08L1_0xFA_BMP}, + {5, 4, 9, 0, 0, helvR08L1_0xFB_BMP}, + {5, 4, 8, 0, 0, helvR08L1_0xFC_BMP}, + {5, 5, 11, -1, -2, helvR08L1_0xFD_BMP}, + {6, 5, 10, 0, -2, helvR08L1_0xFE_BMP}, + {5, 5, 10, -1, -2, helvR08L1_0xFF_BMP} +}; + + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontHelv08Normal_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontHelv08Normal_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontHelv08Normal_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontHelv08Normal_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontHelv08Normal_GetFontChar, + McuFontHelv08Normal_FBBy, + McuFontHelv08Normal_GetUnderlineBoxHeight(), + McuFontHelv08Normal_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv08Normal_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv08Normal_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv08Normal_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv08Normal_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontHelv08Normal. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv08Normal.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv08Normal.h new file mode 100644 index 0000000..e962745 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv08Normal.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv08Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv08Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 8 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv08Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv08Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv08Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv08Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv08Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv08Normal_Deinit(void); +** Init - void McuFontHelv08Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv08Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv08Normal_module McuFontHelv08Normal module documentation +** @{ +*/ + + +#ifndef __McuFontHelv08Normal_H +#define __McuFontHelv08Normal_H + +/* MODULE McuFontHelv08Normal. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontHelv08Normalconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontHelv08Normal_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontHelv08Normal_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontHelv08Normal_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontHelv08Normal_GetLineSpaceHeight() \ + 2 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontHelv08Normal_GetUnderlineBoxHeight() \ + 2 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontHelv08Normal_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontHelv08Normal_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontHelv08Normal. */ + +#endif +/* ifndef __McuFontHelv08Normal_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv10Bold.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv10Bold.c new file mode 100644 index 0000000..43b8a3d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv10Bold.c @@ -0,0 +1,3062 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv10Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv10Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 10 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv10Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv10Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv10Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv10Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv10Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv10Bold_Deinit(void); +** Init - void McuFontHelv10Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv10Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv10Bold_module McuFontHelv10Bold module documentation +** @{ +*/ + +/* MODULE McuFontHelv10Bold. */ + +#include "McuFontHelv10Bold.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontHelv10Bold_FBBy 16 + +static const uint8_t helvB10L1_0x00_BMP[] = { + 0xAA, + 0x00, + 0x82, + 0x00, + 0x82, + 0x00, + 0x82, + 0x00, + 0x82, + 0x00, + 0xAA +}; + +static const uint8_t helvB10L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t helvB10L1_0x21_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x80, + 0x80, + 0x00, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB10L1_0x22_BMP[] = { + 0xD8, + 0xD8, + 0x90 +}; + +static const uint8_t helvB10L1_0x23_BMP[] = { + 0x1B, 0x00, + 0x1B, 0x00, + 0x1B, 0x00, + 0x7F, 0x80, + 0x36, 0x00, + 0x36, 0x00, + 0xFF, 0x00, + 0x6C, 0x00, + 0x6C, 0x00, + 0x6C, 0x00 +}; + +static const uint8_t helvB10L1_0x24_BMP[] = { + 0x10, + 0x7C, + 0xD6, + 0xD6, + 0xD0, + 0xF0, + 0x78, + 0x1C, + 0x16, + 0xD6, + 0xD6, + 0x7C, + 0x10, + 0x10 +}; + +static const uint8_t helvB10L1_0x25_BMP[] = { + 0x78, 0x40, + 0xCC, 0xC0, + 0xCD, 0x80, + 0x79, 0x00, + 0x03, 0x00, + 0x06, 0x00, + 0x04, 0x00, + 0x0D, 0xE0, + 0x0B, 0x30, + 0x1B, 0x30, + 0x11, 0xE0 +}; + +static const uint8_t helvB10L1_0x26_BMP[] = { + 0x38, 0x00, + 0x6C, 0x00, + 0x6C, 0x00, + 0x38, 0x00, + 0x73, 0x00, + 0xFB, 0x00, + 0xCE, 0x00, + 0xC6, 0x00, + 0xCF, 0x00, + 0x7D, 0x80 +}; + +static const uint8_t helvB10L1_0x27_BMP[] = { + 0xC0, + 0xC0, + 0x80 +}; + +static const uint8_t helvB10L1_0x28_BMP[] = { + 0x30, + 0x60, + 0x60, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x60, + 0x60, + 0x30 +}; + +static const uint8_t helvB10L1_0x29_BMP[] = { + 0xC0, + 0x60, + 0x60, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x60, + 0x60, + 0xC0 +}; + +static const uint8_t helvB10L1_0x2A_BMP[] = { + 0x20, + 0xF8, + 0x70, + 0xD8 +}; + +static const uint8_t helvB10L1_0x2B_BMP[] = { + 0x18, + 0x18, + 0x18, + 0xFF, + 0x18, + 0x18, + 0x18 +}; + +static const uint8_t helvB10L1_0x2C_BMP[] = { + 0x60, + 0x60, + 0xC0 +}; + +static const uint8_t helvB10L1_0x2D_BMP[] = { + 0xE0 +}; + +static const uint8_t helvB10L1_0x2E_BMP[] = { + 0xC0, + 0xC0 +}; + +static const uint8_t helvB10L1_0x2F_BMP[] = { + 0x10, + 0x10, + 0x30, + 0x20, + 0x20, + 0x60, + 0x40, + 0x40, + 0xC0, + 0x80, + 0x80 +}; + +static const uint8_t helvB10L1_0x30_BMP[] = { + 0x38, + 0x6C, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0x6C, + 0x38 +}; + +static const uint8_t helvB10L1_0x31_BMP[] = { + 0x30, + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30 +}; + +static const uint8_t helvB10L1_0x32_BMP[] = { + 0x7C, + 0xC6, + 0xC6, + 0x06, + 0x0E, + 0x0C, + 0x18, + 0x30, + 0x60, + 0xC0, + 0xFE +}; + +static const uint8_t helvB10L1_0x33_BMP[] = { + 0x7C, + 0xC6, + 0xC6, + 0x06, + 0x06, + 0x3C, + 0x06, + 0x06, + 0xC6, + 0xC6, + 0x7C +}; + +static const uint8_t helvB10L1_0x34_BMP[] = { + 0x06, + 0x0E, + 0x1E, + 0x36, + 0x66, + 0xC6, + 0xC6, + 0xFF, + 0x06, + 0x06, + 0x06 +}; + +static const uint8_t helvB10L1_0x35_BMP[] = { + 0x7E, + 0x60, + 0x60, + 0xC0, + 0xFC, + 0x0E, + 0x06, + 0x06, + 0xC6, + 0xCC, + 0x78 +}; + +static const uint8_t helvB10L1_0x36_BMP[] = { + 0x3C, + 0x66, + 0x66, + 0xC0, + 0xDC, + 0xE6, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0x7C +}; + +static const uint8_t helvB10L1_0x37_BMP[] = { + 0xFE, + 0x06, + 0x0C, + 0x0C, + 0x18, + 0x18, + 0x30, + 0x30, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvB10L1_0x38_BMP[] = { + 0x7C, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0x7C, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0x7C +}; + +static const uint8_t helvB10L1_0x39_BMP[] = { + 0x7C, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0x7E, + 0x06, + 0xC6, + 0xCC, + 0x78 +}; + +static const uint8_t helvB10L1_0x3A_BMP[] = { + 0xC0, + 0xC0, + 0x00, + 0x00, + 0x00, + 0x00, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB10L1_0x3B_BMP[] = { + 0x60, + 0x60, + 0x00, + 0x00, + 0x00, + 0x00, + 0x60, + 0x60, + 0xC0 +}; + +static const uint8_t helvB10L1_0x3C_BMP[] = { + 0x1C, + 0x70, + 0xC0, + 0x70, + 0x1C +}; + +static const uint8_t helvB10L1_0x3D_BMP[] = { + 0xFE, + 0x00, + 0xFE +}; + +static const uint8_t helvB10L1_0x3E_BMP[] = { + 0xE0, + 0x38, + 0x0C, + 0x38, + 0xE0 +}; + +static const uint8_t helvB10L1_0x3F_BMP[] = { + 0x7C, + 0xC6, + 0xC6, + 0x06, + 0x0C, + 0x18, + 0x30, + 0x30, + 0x00, + 0x30, + 0x30 +}; + +static const uint8_t helvB10L1_0x40_BMP[] = { + 0x0F, 0x80, + 0x38, 0xE0, + 0x70, 0x70, + 0x66, 0xB0, + 0xCD, 0x98, + 0xD9, 0x98, + 0xDB, 0x18, + 0xDB, 0x30, + 0xCE, 0xE0, + 0x60, 0x00, + 0x31, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t helvB10L1_0x41_BMP[] = { + 0x0C, 0x00, + 0x0C, 0x00, + 0x1E, 0x00, + 0x12, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x61, 0x80, + 0x7F, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0 +}; + +static const uint8_t helvB10L1_0x42_BMP[] = { + 0xFE, + 0xC7, + 0xC3, + 0xC3, + 0xC6, + 0xFC, + 0xC6, + 0xC3, + 0xC3, + 0xC7, + 0xFE +}; + +static const uint8_t helvB10L1_0x43_BMP[] = { + 0x1F, 0x00, + 0x7B, 0x80, + 0x60, 0x80, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0x60, 0x80, + 0x7B, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t helvB10L1_0x44_BMP[] = { + 0xFC, 0x00, + 0xC7, 0x00, + 0xC3, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC3, 0x00, + 0xC7, 0x00, + 0xFC, 0x00 +}; + +static const uint8_t helvB10L1_0x45_BMP[] = { + 0xFE, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xFE, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xFE +}; + +static const uint8_t helvB10L1_0x46_BMP[] = { + 0xFE, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xFC, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB10L1_0x47_BMP[] = { + 0x1F, 0x00, + 0x7B, 0x80, + 0x60, 0x80, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC7, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x61, 0x80, + 0x7B, 0x80, + 0x1E, 0x80 +}; + +static const uint8_t helvB10L1_0x48_BMP[] = { + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xFF, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3 +}; + +static const uint8_t helvB10L1_0x49_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB10L1_0x4A_BMP[] = { + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0xC6, + 0xC6, + 0xEE, + 0x7C +}; + +static const uint8_t helvB10L1_0x4B_BMP[] = { + 0xC3, 0x00, + 0xC6, 0x00, + 0xCC, 0x00, + 0xD8, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xD8, 0x00, + 0xCC, 0x00, + 0xC6, 0x00, + 0xC3, 0x00, + 0xC1, 0x80 +}; + +static const uint8_t helvB10L1_0x4C_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xFE +}; + +static const uint8_t helvB10L1_0x4D_BMP[] = { + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xF1, 0xE0, + 0xD1, 0x60, + 0xD1, 0x60, + 0xDB, 0x60, + 0xCA, 0x60, + 0xCE, 0x60, + 0xC4, 0x60 +}; + +static const uint8_t helvB10L1_0x4E_BMP[] = { + 0xC1, 0x80, + 0xE1, 0x80, + 0xE1, 0x80, + 0xD1, 0x80, + 0xD9, 0x80, + 0xC9, 0x80, + 0xCD, 0x80, + 0xC5, 0x80, + 0xC3, 0x80, + 0xC3, 0x80, + 0xC1, 0x80 +}; + +static const uint8_t helvB10L1_0x4F_BMP[] = { + 0x1E, 0x00, + 0x73, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0x61, 0x80, + 0x73, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvB10L1_0x50_BMP[] = { + 0xFE, + 0xC7, + 0xC3, + 0xC3, + 0xC7, + 0xFE, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB10L1_0x51_BMP[] = { + 0x1E, 0x00, + 0x73, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC6, 0xC0, + 0x63, 0x80, + 0x73, 0x80, + 0x1E, 0xC0 +}; + +static const uint8_t helvB10L1_0x52_BMP[] = { + 0xFE, 0x00, + 0xC7, 0x00, + 0xC3, 0x00, + 0xC3, 0x00, + 0xC6, 0x00, + 0xFE, 0x00, + 0xC7, 0x00, + 0xC3, 0x00, + 0xC3, 0x00, + 0xC3, 0x00, + 0xC1, 0x80 +}; + +static const uint8_t helvB10L1_0x53_BMP[] = { + 0x7E, + 0xE7, + 0xC3, + 0xE0, + 0x78, + 0x1E, + 0x07, + 0x03, + 0xC3, + 0xEE, + 0x7C +}; + +static const uint8_t helvB10L1_0x54_BMP[] = { + 0xFF, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18 +}; + +static const uint8_t helvB10L1_0x55_BMP[] = { + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvB10L1_0x56_BMP[] = { + 0xC0, 0xC0, + 0xC0, 0xC0, + 0x61, 0x80, + 0x61, 0x80, + 0x73, 0x80, + 0x33, 0x00, + 0x33, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x0C, 0x00, + 0x0C, 0x00 +}; + +static const uint8_t helvB10L1_0x57_BMP[] = { + 0xC3, 0x0C, + 0xC3, 0x0C, + 0xC3, 0x0C, + 0x67, 0x98, + 0x64, 0x98, + 0x64, 0x98, + 0x6C, 0xD8, + 0x2C, 0xD0, + 0x38, 0x70, + 0x18, 0x60, + 0x18, 0x60 +}; + +static const uint8_t helvB10L1_0x58_BMP[] = { + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x00, + 0x36, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x36, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0xC1, 0x80, + 0xC1, 0x80 +}; + +static const uint8_t helvB10L1_0x59_BMP[] = { + 0xC0, 0xC0, + 0x61, 0x80, + 0x61, 0x80, + 0x33, 0x00, + 0x33, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00 +}; + +static const uint8_t helvB10L1_0x5A_BMP[] = { + 0xFF, + 0x03, + 0x06, + 0x0C, + 0x1C, + 0x18, + 0x30, + 0x70, + 0x60, + 0xC0, + 0xFF +}; + +static const uint8_t helvB10L1_0x5B_BMP[] = { + 0xF0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xF0 +}; + +static const uint8_t helvB10L1_0x5C_BMP[] = { + 0x80, + 0x80, + 0xC0, + 0x40, + 0x40, + 0x60, + 0x20, + 0x20, + 0x30, + 0x10, + 0x10 +}; + +static const uint8_t helvB10L1_0x5D_BMP[] = { + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xF0 +}; + +static const uint8_t helvB10L1_0x5E_BMP[] = { + 0x30, + 0x78, + 0x48, + 0xCC, + 0xCC +}; + +static const uint8_t helvB10L1_0x5F_BMP[] = { + 0xFF +}; + +static const uint8_t helvB10L1_0x60_BMP[] = { + 0xC0, + 0x60 +}; + +static const uint8_t helvB10L1_0x61_BMP[] = { + 0x78, + 0xCC, + 0x0C, + 0x7C, + 0xCC, + 0xCC, + 0xDC, + 0x76 +}; + +static const uint8_t helvB10L1_0x62_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xD8, + 0xEC, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xEC, + 0xD8 +}; + +static const uint8_t helvB10L1_0x63_BMP[] = { + 0x38, + 0x6C, + 0xCC, + 0xC0, + 0xC0, + 0xCC, + 0x6C, + 0x38 +}; + +static const uint8_t helvB10L1_0x64_BMP[] = { + 0x06, + 0x06, + 0x06, + 0x36, + 0x6E, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0x6E, + 0x36 +}; + +static const uint8_t helvB10L1_0x65_BMP[] = { + 0x78, + 0xCC, + 0xCC, + 0xFC, + 0xC0, + 0xC0, + 0xEC, + 0x78 +}; + +static const uint8_t helvB10L1_0x66_BMP[] = { + 0x38, + 0x60, + 0x60, + 0xF0, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvB10L1_0x67_BMP[] = { + 0x3A, + 0x6E, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0x6E, + 0x36, + 0x06, + 0xCE, + 0x7C +}; + +static const uint8_t helvB10L1_0x68_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xDC, + 0xEE, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6 +}; + +static const uint8_t helvB10L1_0x69_BMP[] = { + 0xC0, + 0xC0, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB10L1_0x6A_BMP[] = { + 0x60, + 0x60, + 0x00, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0xE0, + 0xC0 +}; + +static const uint8_t helvB10L1_0x6B_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xCC, + 0xD8, + 0xF0, + 0xF0, + 0xD8, + 0xD8, + 0xCC, + 0xCC +}; + +static const uint8_t helvB10L1_0x6C_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB10L1_0x6D_BMP[] = { + 0xDB, 0x80, + 0xEE, 0xC0, + 0xCC, 0xC0, + 0xCC, 0xC0, + 0xCC, 0xC0, + 0xCC, 0xC0, + 0xCC, 0xC0, + 0xCC, 0xC0 +}; + +static const uint8_t helvB10L1_0x6E_BMP[] = { + 0xDC, + 0xEE, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6 +}; + +static const uint8_t helvB10L1_0x6F_BMP[] = { + 0x38, + 0x6C, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0x6C, + 0x38 +}; + +static const uint8_t helvB10L1_0x70_BMP[] = { + 0xD8, + 0xEC, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xEC, + 0xD8, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB10L1_0x71_BMP[] = { + 0x36, + 0x6E, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0x6E, + 0x36, + 0x06, + 0x06, + 0x06 +}; + +static const uint8_t helvB10L1_0x72_BMP[] = { + 0xD8, + 0xF8, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB10L1_0x73_BMP[] = { + 0x78, + 0xCC, + 0xE0, + 0x78, + 0x1C, + 0x0C, + 0xEC, + 0x78 +}; + +static const uint8_t helvB10L1_0x74_BMP[] = { + 0x60, + 0x60, + 0xF8, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x68, + 0x30 +}; + +static const uint8_t helvB10L1_0x75_BMP[] = { + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xEE, + 0x76 +}; + +static const uint8_t helvB10L1_0x76_BMP[] = { + 0xC3, + 0xC3, + 0x66, + 0x66, + 0x24, + 0x3C, + 0x18, + 0x18 +}; + +static const uint8_t helvB10L1_0x77_BMP[] = { + 0xCC, 0xC0, + 0xCC, 0xC0, + 0xCC, 0xC0, + 0x6D, 0x80, + 0x6D, 0x80, + 0x33, 0x00, + 0x33, 0x00, + 0x33, 0x00 +}; + +static const uint8_t helvB10L1_0x78_BMP[] = { + 0xC6, + 0xC6, + 0x6C, + 0x38, + 0x38, + 0x6C, + 0xC6, + 0xC6 +}; + +static const uint8_t helvB10L1_0x79_BMP[] = { + 0xC3, + 0xC3, + 0x66, + 0x66, + 0x24, + 0x3C, + 0x18, + 0x18, + 0x18, + 0x30, + 0x70 +}; + +static const uint8_t helvB10L1_0x7A_BMP[] = { + 0xFC, + 0x0C, + 0x18, + 0x30, + 0x30, + 0x60, + 0xC0, + 0xFC +}; + +static const uint8_t helvB10L1_0x7B_BMP[] = { + 0x18, + 0x30, + 0x30, + 0x30, + 0x30, + 0x60, + 0xC0, + 0x60, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x18 +}; + +static const uint8_t helvB10L1_0x7C_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvB10L1_0x7D_BMP[] = { + 0xC0, + 0x60, + 0x60, + 0x60, + 0x60, + 0x30, + 0x18, + 0x30, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0xC0 +}; + +static const uint8_t helvB10L1_0x7E_BMP[] = { + 0x72, + 0xDE, + 0x8C +}; + +static const uint8_t helvB10L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t helvB10L1_0xA1_BMP[] = { + 0xC0, + 0xC0, + 0x00, + 0x40, + 0x40, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB10L1_0xA2_BMP[] = { + 0x04, + 0x3C, + 0x6E, + 0xC8, + 0xD0, + 0xD0, + 0xE6, + 0x66, + 0x7C, + 0x40 +}; + +static const uint8_t helvB10L1_0xA3_BMP[] = { + 0x3C, + 0x66, + 0x66, + 0x60, + 0xFC, + 0x30, + 0x30, + 0x30, + 0x60, + 0xFB, + 0xDE +}; + +static const uint8_t helvB10L1_0xA4_BMP[] = { + 0x82, + 0x7C, + 0x6C, + 0x6C, + 0x6C, + 0x7C, + 0x82 +}; + +static const uint8_t helvB10L1_0xA5_BMP[] = { + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x66, + 0x3C, + 0x7E, + 0x18, + 0x7E, + 0x18, + 0x18 +}; + +static const uint8_t helvB10L1_0xA6_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x00, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvB10L1_0xA7_BMP[] = { + 0x78, + 0xCC, + 0xCC, + 0xE0, + 0x78, + 0xDC, + 0xCC, + 0xCC, + 0xEC, + 0x78, + 0x1C, + 0xCC, + 0xCC, + 0x78 +}; + +static const uint8_t helvB10L1_0xA8_BMP[] = { + 0xD8, + 0xD8 +}; + +static const uint8_t helvB10L1_0xA9_BMP[] = { + 0x1E, 0x00, + 0x61, 0x80, + 0x4C, 0x80, + 0xD2, 0xC0, + 0x90, 0x40, + 0x90, 0x40, + 0x90, 0x40, + 0x92, 0x40, + 0x4C, 0x80, + 0x61, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvB10L1_0xAA_BMP[] = { + 0x70, + 0x90, + 0x70, + 0xD0, + 0xF8, + 0x00, + 0xF8 +}; + +static const uint8_t helvB10L1_0xAB_BMP[] = { + 0x36, + 0x6C, + 0xD8, + 0x6C, + 0x36 +}; + +static const uint8_t helvB10L1_0xAC_BMP[] = { + 0xFE, + 0xFE, + 0x02, + 0x02 +}; + +static const uint8_t helvB10L1_0xAD_BMP[] = { + 0xE0 +}; + +static const uint8_t helvB10L1_0xAE_BMP[] = { + 0x1E, 0x00, + 0x61, 0x80, + 0x5C, 0x80, + 0x92, 0x40, + 0x92, 0x40, + 0x9C, 0x40, + 0x92, 0x40, + 0x92, 0x40, + 0x52, 0x80, + 0x61, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvB10L1_0xAF_BMP[] = { + 0xF8 +}; + +static const uint8_t helvB10L1_0xB0_BMP[] = { + 0x60, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t helvB10L1_0xB1_BMP[] = { + 0x18, + 0x18, + 0x18, + 0xFF, + 0x18, + 0x18, + 0x18, + 0x00, + 0xFF +}; + +static const uint8_t helvB10L1_0xB2_BMP[] = { + 0x60, + 0xB0, + 0x30, + 0x60, + 0xC0, + 0xF0 +}; + +static const uint8_t helvB10L1_0xB3_BMP[] = { + 0x60, + 0xB0, + 0x60, + 0x30, + 0xB0, + 0x60 +}; + +static const uint8_t helvB10L1_0xB4_BMP[] = { + 0x60, + 0xC0 +}; + +static const uint8_t helvB10L1_0xB5_BMP[] = { + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xEE, + 0xF6, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB10L1_0xB6_BMP[] = { + 0x3F, + 0x7A, + 0xFA, + 0xFA, + 0xFA, + 0x7A, + 0x3A, + 0x0A, + 0x0A, + 0x0A, + 0x0A, + 0x0A, + 0x0A, + 0x0A +}; + +static const uint8_t helvB10L1_0xB7_BMP[] = { + 0xC0, + 0xC0 +}; + +static const uint8_t helvB10L1_0xB8_BMP[] = { + 0x18, + 0xD8, + 0x70 +}; + +static const uint8_t helvB10L1_0xB9_BMP[] = { + 0x60, + 0xE0, + 0x60, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvB10L1_0xBA_BMP[] = { + 0x70, + 0xD8, + 0xD8, + 0xD8, + 0x70, + 0x00, + 0xF8 +}; + +static const uint8_t helvB10L1_0xBB_BMP[] = { + 0xD8, + 0x6C, + 0x36, + 0x6C, + 0xD8 +}; + +static const uint8_t helvB10L1_0xBC_BMP[] = { + 0x61, 0x80, + 0xE1, 0x80, + 0x63, 0x00, + 0x63, 0x00, + 0x66, 0x00, + 0x66, 0x20, + 0x06, 0x60, + 0x0C, 0xE0, + 0x0D, 0x60, + 0x19, 0xF0, + 0x18, 0x60 +}; + +static const uint8_t helvB10L1_0xBD_BMP[] = { + 0x61, 0x80, + 0xE1, 0x80, + 0x63, 0x00, + 0x63, 0x00, + 0x66, 0x00, + 0x66, 0xC0, + 0x07, 0x60, + 0x0C, 0x60, + 0x0C, 0xC0, + 0x19, 0x80, + 0x19, 0xE0 +}; + +static const uint8_t helvB10L1_0xBE_BMP[] = { + 0x61, 0x80, + 0xB1, 0x80, + 0x63, 0x00, + 0x33, 0x00, + 0xB6, 0x00, + 0x66, 0x20, + 0x06, 0x60, + 0x0C, 0xE0, + 0x0D, 0x60, + 0x19, 0xF0, + 0x18, 0x60 +}; + +static const uint8_t helvB10L1_0xBF_BMP[] = { + 0x18, + 0x18, + 0x00, + 0x18, + 0x18, + 0x30, + 0x60, + 0xC0, + 0xC6, + 0xC6, + 0x7C +}; + +static const uint8_t helvB10L1_0xC0_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x1E, 0x00, + 0x12, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x61, 0x80, + 0x7F, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0 +}; + +static const uint8_t helvB10L1_0xC1_BMP[] = { + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x1E, 0x00, + 0x12, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x61, 0x80, + 0x7F, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0 +}; + +static const uint8_t helvB10L1_0xC2_BMP[] = { + 0x0E, 0x00, + 0x1B, 0x00, + 0x00, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x1E, 0x00, + 0x12, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x61, 0x80, + 0x7F, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0 +}; + +static const uint8_t helvB10L1_0xC3_BMP[] = { + 0x0D, 0x00, + 0x16, 0x00, + 0x00, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x1E, 0x00, + 0x12, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x61, 0x80, + 0x7F, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0 +}; + +static const uint8_t helvB10L1_0xC4_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x1E, 0x00, + 0x12, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x61, 0x80, + 0x7F, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0 +}; + +static const uint8_t helvB10L1_0xC5_BMP[] = { + 0x0C, 0x00, + 0x12, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x1E, 0x00, + 0x12, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x61, 0x80, + 0x7F, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0 +}; + +static const uint8_t helvB10L1_0xC6_BMP[] = { + 0x0F, 0xFC, + 0x0F, 0x00, + 0x1B, 0x00, + 0x13, 0x00, + 0x33, 0x00, + 0x33, 0xF8, + 0x63, 0x00, + 0x7F, 0x00, + 0x63, 0x00, + 0xC3, 0x00, + 0xC3, 0xFC +}; + +static const uint8_t helvB10L1_0xC7_BMP[] = { + 0x1F, 0x00, + 0x7B, 0x80, + 0x60, 0x80, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0x60, 0x80, + 0x7B, 0x80, + 0x1F, 0x00, + 0x06, 0x00, + 0x36, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t helvB10L1_0xC8_BMP[] = { + 0x30, + 0x18, + 0x00, + 0xFE, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xFE, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xFE +}; + +static const uint8_t helvB10L1_0xC9_BMP[] = { + 0x0C, + 0x18, + 0x00, + 0xFE, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xFE, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xFE +}; + +static const uint8_t helvB10L1_0xCA_BMP[] = { + 0x1C, + 0x36, + 0x00, + 0xFE, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xFE, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xFE +}; + +static const uint8_t helvB10L1_0xCB_BMP[] = { + 0x6C, + 0x6C, + 0x00, + 0xFE, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xFE, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xFE +}; + +static const uint8_t helvB10L1_0xCC_BMP[] = { + 0xC0, + 0x60, + 0x00, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvB10L1_0xCD_BMP[] = { + 0x60, + 0xC0, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB10L1_0xCE_BMP[] = { + 0x70, + 0xD8, + 0x00, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvB10L1_0xCF_BMP[] = { + 0xD8, + 0xD8, + 0x00, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvB10L1_0xD0_BMP[] = { + 0x7E, 0x00, + 0x63, 0x80, + 0x61, 0x80, + 0x60, 0xC0, + 0x60, 0xC0, + 0xF8, 0xC0, + 0x60, 0xC0, + 0x60, 0xC0, + 0x61, 0x80, + 0x63, 0x80, + 0x7E, 0x00 +}; + +static const uint8_t helvB10L1_0xD1_BMP[] = { + 0x1A, 0x00, + 0x2C, 0x00, + 0x00, 0x00, + 0xC1, 0x80, + 0xE1, 0x80, + 0xE1, 0x80, + 0xD1, 0x80, + 0xD9, 0x80, + 0xC9, 0x80, + 0xCD, 0x80, + 0xC5, 0x80, + 0xC3, 0x80, + 0xC3, 0x80, + 0xC1, 0x80 +}; + +static const uint8_t helvB10L1_0xD2_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x73, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0x61, 0x80, + 0x73, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvB10L1_0xD3_BMP[] = { + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x73, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0x61, 0x80, + 0x73, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvB10L1_0xD4_BMP[] = { + 0x0E, 0x00, + 0x1B, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x73, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0x61, 0x80, + 0x73, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvB10L1_0xD5_BMP[] = { + 0x0D, 0x00, + 0x16, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x73, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0x61, 0x80, + 0x73, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvB10L1_0xD6_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x73, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0x61, 0x80, + 0x73, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvB10L1_0xD7_BMP[] = { + 0xC3, + 0x66, + 0x3C, + 0x18, + 0x3C, + 0x66, + 0xC3 +}; + +static const uint8_t helvB10L1_0xD8_BMP[] = { + 0x0F, 0x30, + 0x39, 0xE0, + 0x30, 0xC0, + 0x61, 0xE0, + 0x63, 0x60, + 0x66, 0x60, + 0x6C, 0x60, + 0x78, 0x60, + 0x30, 0xC0, + 0x79, 0xC0, + 0xCF, 0x00 +}; + +static const uint8_t helvB10L1_0xD9_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvB10L1_0xDA_BMP[] = { + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvB10L1_0xDB_BMP[] = { + 0x1C, 0x00, + 0x36, 0x00, + 0x00, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvB10L1_0xDC_BMP[] = { + 0x63, 0x00, + 0x63, 0x00, + 0x00, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvB10L1_0xDD_BMP[] = { + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xC0, 0xC0, + 0x61, 0x80, + 0x61, 0x80, + 0x33, 0x00, + 0x33, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00 +}; + +static const uint8_t helvB10L1_0xDE_BMP[] = { + 0xC0, + 0xC0, + 0xFE, + 0xC7, + 0xC3, + 0xC3, + 0xC7, + 0xFE, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB10L1_0xDF_BMP[] = { + 0x78, + 0xCC, + 0xCC, + 0xCC, + 0xD8, + 0xD8, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0xD8 +}; + +static const uint8_t helvB10L1_0xE0_BMP[] = { + 0x30, + 0x18, + 0x00, + 0x78, + 0xCC, + 0x0C, + 0x7C, + 0xCC, + 0xCC, + 0xDC, + 0x76 +}; + +static const uint8_t helvB10L1_0xE1_BMP[] = { + 0x18, + 0x30, + 0x00, + 0x78, + 0xCC, + 0x0C, + 0x7C, + 0xCC, + 0xCC, + 0xDC, + 0x76 +}; + +static const uint8_t helvB10L1_0xE2_BMP[] = { + 0x38, + 0x6C, + 0x00, + 0x78, + 0xCC, + 0x0C, + 0x7C, + 0xCC, + 0xCC, + 0xDC, + 0x76 +}; + +static const uint8_t helvB10L1_0xE3_BMP[] = { + 0x34, + 0x58, + 0x00, + 0x78, + 0xCC, + 0x0C, + 0x7C, + 0xCC, + 0xCC, + 0xDC, + 0x76 +}; + +static const uint8_t helvB10L1_0xE4_BMP[] = { + 0x6C, + 0x6C, + 0x00, + 0x78, + 0xCC, + 0x0C, + 0x7C, + 0xCC, + 0xCC, + 0xDC, + 0x76 +}; + +static const uint8_t helvB10L1_0xE5_BMP[] = { + 0x30, + 0x48, + 0x30, + 0x78, + 0xCC, + 0x0C, + 0x7C, + 0xCC, + 0xCC, + 0xDC, + 0x76 +}; + +static const uint8_t helvB10L1_0xE6_BMP[] = { + 0x7B, 0xC0, + 0xCE, 0x60, + 0x0C, 0x60, + 0x7F, 0xE0, + 0xCC, 0x00, + 0xCC, 0x00, + 0xDE, 0x60, + 0x77, 0xC0 +}; + +static const uint8_t helvB10L1_0xE7_BMP[] = { + 0x3C, + 0x66, + 0xC6, + 0xC0, + 0xC0, + 0xC6, + 0x66, + 0x3C, + 0x18, + 0x58, + 0x70 +}; + +static const uint8_t helvB10L1_0xE8_BMP[] = { + 0x60, + 0x30, + 0x00, + 0x78, + 0xCC, + 0xCC, + 0xFC, + 0xC0, + 0xC0, + 0xEC, + 0x78 +}; + +static const uint8_t helvB10L1_0xE9_BMP[] = { + 0x18, + 0x30, + 0x00, + 0x78, + 0xCC, + 0xCC, + 0xFC, + 0xC0, + 0xC0, + 0xEC, + 0x78 +}; + +static const uint8_t helvB10L1_0xEA_BMP[] = { + 0x38, + 0x6C, + 0x00, + 0x78, + 0xCC, + 0xCC, + 0xFC, + 0xC0, + 0xC0, + 0xEC, + 0x78 +}; + +static const uint8_t helvB10L1_0xEB_BMP[] = { + 0x6C, + 0x6C, + 0x00, + 0x78, + 0xCC, + 0xCC, + 0xFC, + 0xC0, + 0xC0, + 0xEC, + 0x78 +}; + +static const uint8_t helvB10L1_0xEC_BMP[] = { + 0xC0, + 0x60, + 0x00, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvB10L1_0xED_BMP[] = { + 0x60, + 0xC0, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB10L1_0xEE_BMP[] = { + 0x70, + 0xD8, + 0x00, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvB10L1_0xEF_BMP[] = { + 0xD8, + 0xD8, + 0x00, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvB10L1_0xF0_BMP[] = { + 0x6C, + 0x38, + 0x48, + 0x3C, + 0x6C, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0x6C, + 0x38 +}; + +static const uint8_t helvB10L1_0xF1_BMP[] = { + 0x34, + 0x58, + 0x00, + 0xDC, + 0xEE, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6 +}; + +static const uint8_t helvB10L1_0xF2_BMP[] = { + 0x30, + 0x18, + 0x00, + 0x38, + 0x6C, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0x6C, + 0x38 +}; + +static const uint8_t helvB10L1_0xF3_BMP[] = { + 0x18, + 0x30, + 0x00, + 0x38, + 0x6C, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0x6C, + 0x38 +}; + +static const uint8_t helvB10L1_0xF4_BMP[] = { + 0x38, + 0x6C, + 0x00, + 0x38, + 0x6C, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0x6C, + 0x38 +}; + +static const uint8_t helvB10L1_0xF5_BMP[] = { + 0x34, + 0x58, + 0x00, + 0x38, + 0x6C, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0x6C, + 0x38 +}; + +static const uint8_t helvB10L1_0xF6_BMP[] = { + 0x6C, + 0x6C, + 0x00, + 0x38, + 0x6C, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0x6C, + 0x38 +}; + +static const uint8_t helvB10L1_0xF7_BMP[] = { + 0x18, + 0x18, + 0x00, + 0xFF, + 0x00, + 0x18, + 0x18 +}; + +static const uint8_t helvB10L1_0xF8_BMP[] = { + 0x3A, + 0x6C, + 0xCE, + 0xD6, + 0xD6, + 0xE6, + 0x6C, + 0xB8 +}; + +static const uint8_t helvB10L1_0xF9_BMP[] = { + 0x30, + 0x18, + 0x00, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xEE, + 0x76 +}; + +static const uint8_t helvB10L1_0xFA_BMP[] = { + 0x0C, + 0x18, + 0x00, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xEE, + 0x76 +}; + +static const uint8_t helvB10L1_0xFB_BMP[] = { + 0x38, + 0x6C, + 0x00, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xEE, + 0x76 +}; + +static const uint8_t helvB10L1_0xFC_BMP[] = { + 0x6C, + 0x6C, + 0x00, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xEE, + 0x76 +}; + +static const uint8_t helvB10L1_0xFD_BMP[] = { + 0x0C, + 0x18, + 0x00, + 0xC3, + 0xC3, + 0x66, + 0x66, + 0x24, + 0x3C, + 0x18, + 0x18, + 0x18, + 0x30, + 0x70 +}; + +static const uint8_t helvB10L1_0xFE_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xD8, + 0xEC, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xEC, + 0xD8, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB10L1_0xFF_BMP[] = { + 0x36, + 0x36, + 0x00, + 0xC3, + 0xC3, + 0x66, + 0x66, + 0x24, + 0x3C, + 0x18, + 0x18, + 0x18, + 0x30, + 0x70 +}; + +static const GFONT_CharInfo FontBMP[] = { + {10, 7, 11, 1, 0, helvB10L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {4, 1, 1, 0, 0, helvB10L1_0x20_BMP}, + {4, 2, 11, 1, 0, helvB10L1_0x21_BMP}, + {7, 5, 3, 1, 8, helvB10L1_0x22_BMP}, + {9, 9, 10, 0, 0, helvB10L1_0x23_BMP}, + {8, 7, 14, 0, -2, helvB10L1_0x24_BMP}, + {13, 12, 11, 0, 0, helvB10L1_0x25_BMP}, + {11, 9, 10, 1, 0, helvB10L1_0x26_BMP}, + {4, 2, 3, 1, 8, helvB10L1_0x27_BMP}, + {5, 4, 14, 1, -3, helvB10L1_0x28_BMP}, + {5, 4, 14, 0, -3, helvB10L1_0x29_BMP}, + {6, 5, 4, 0, 7, helvB10L1_0x2A_BMP}, + {9, 8, 7, 0, 1, helvB10L1_0x2B_BMP}, + {4, 3, 3, 0, -1, helvB10L1_0x2C_BMP}, + {4, 3, 1, 0, 4, helvB10L1_0x2D_BMP}, + {4, 2, 2, 1, 0, helvB10L1_0x2E_BMP}, + {4, 4, 11, 0, 0, helvB10L1_0x2F_BMP}, + {8, 7, 11, 0, 0, helvB10L1_0x30_BMP}, + {8, 4, 11, 1, 0, helvB10L1_0x31_BMP}, + {8, 7, 11, 0, 0, helvB10L1_0x32_BMP}, + {8, 7, 11, 0, 0, helvB10L1_0x33_BMP}, + {8, 8, 11, 0, 0, helvB10L1_0x34_BMP}, + {8, 7, 11, 0, 0, helvB10L1_0x35_BMP}, + {8, 7, 11, 0, 0, helvB10L1_0x36_BMP}, + {8, 7, 11, 0, 0, helvB10L1_0x37_BMP}, + {8, 7, 11, 0, 0, helvB10L1_0x38_BMP}, + {8, 7, 11, 0, 0, helvB10L1_0x39_BMP}, + {5, 2, 8, 2, 0, helvB10L1_0x3A_BMP}, + {5, 3, 9, 1, -1, helvB10L1_0x3B_BMP}, + {8, 6, 5, 1, 2, helvB10L1_0x3C_BMP}, + {9, 7, 3, 1, 3, helvB10L1_0x3D_BMP}, + {8, 6, 5, 1, 2, helvB10L1_0x3E_BMP}, + {9, 7, 11, 1, 0, helvB10L1_0x3F_BMP}, + {14, 13, 12, 0, -1, helvB10L1_0x40_BMP}, + {10, 10, 11, 0, 0, helvB10L1_0x41_BMP}, + {10, 8, 11, 1, 0, helvB10L1_0x42_BMP}, + {11, 9, 11, 1, 0, helvB10L1_0x43_BMP}, + {11, 9, 11, 1, 0, helvB10L1_0x44_BMP}, + {9, 7, 11, 1, 0, helvB10L1_0x45_BMP}, + {9, 7, 11, 1, 0, helvB10L1_0x46_BMP}, + {11, 9, 11, 1, 0, helvB10L1_0x47_BMP}, + {10, 8, 11, 1, 0, helvB10L1_0x48_BMP}, + {4, 2, 11, 1, 0, helvB10L1_0x49_BMP}, + {8, 7, 11, 0, 0, helvB10L1_0x4A_BMP}, + {10, 9, 11, 1, 0, helvB10L1_0x4B_BMP}, + {8, 7, 11, 1, 0, helvB10L1_0x4C_BMP}, + {13, 11, 11, 1, 0, helvB10L1_0x4D_BMP}, + {11, 9, 11, 1, 0, helvB10L1_0x4E_BMP}, + {12, 10, 11, 1, 0, helvB10L1_0x4F_BMP}, + {10, 8, 11, 1, 0, helvB10L1_0x50_BMP}, + {12, 10, 11, 1, 0, helvB10L1_0x51_BMP}, + {11, 9, 11, 1, 0, helvB10L1_0x52_BMP}, + {10, 8, 11, 1, 0, helvB10L1_0x53_BMP}, + {8, 8, 11, 0, 0, helvB10L1_0x54_BMP}, + {11, 9, 11, 1, 0, helvB10L1_0x55_BMP}, + {10, 10, 11, 0, 0, helvB10L1_0x56_BMP}, + {14, 14, 11, 0, 0, helvB10L1_0x57_BMP}, + {9, 9, 11, 0, 0, helvB10L1_0x58_BMP}, + {10, 10, 11, 0, 0, helvB10L1_0x59_BMP}, + {9, 8, 11, 0, 0, helvB10L1_0x5A_BMP}, + {5, 4, 14, 1, -3, helvB10L1_0x5B_BMP}, + {4, 4, 11, 0, 0, helvB10L1_0x5C_BMP}, + {5, 4, 14, 0, -3, helvB10L1_0x5D_BMP}, + {8, 6, 5, 1, 6, helvB10L1_0x5E_BMP}, + {8, 8, 1, 0, -3, helvB10L1_0x5F_BMP}, + {5, 3, 2, 1, 9, helvB10L1_0x60_BMP}, + {8, 7, 8, 1, 0, helvB10L1_0x61_BMP}, + {9, 7, 11, 1, 0, helvB10L1_0x62_BMP}, + {8, 6, 8, 1, 0, helvB10L1_0x63_BMP}, + {9, 7, 11, 1, 0, helvB10L1_0x64_BMP}, + {8, 6, 8, 1, 0, helvB10L1_0x65_BMP}, + {4, 5, 11, 0, 0, helvB10L1_0x66_BMP}, + {9, 7, 11, 1, -3, helvB10L1_0x67_BMP}, + {9, 7, 11, 1, 0, helvB10L1_0x68_BMP}, + {4, 2, 11, 1, 0, helvB10L1_0x69_BMP}, + {4, 3, 14, 0, -3, helvB10L1_0x6A_BMP}, + {8, 6, 11, 1, 0, helvB10L1_0x6B_BMP}, + {4, 2, 11, 1, 0, helvB10L1_0x6C_BMP}, + {12, 10, 8, 1, 0, helvB10L1_0x6D_BMP}, + {9, 7, 8, 1, 0, helvB10L1_0x6E_BMP}, + {9, 7, 8, 1, 0, helvB10L1_0x6F_BMP}, + {9, 7, 11, 1, -3, helvB10L1_0x70_BMP}, + {9, 7, 11, 1, -3, helvB10L1_0x71_BMP}, + {6, 5, 8, 1, 0, helvB10L1_0x72_BMP}, + {8, 6, 8, 1, 0, helvB10L1_0x73_BMP}, + {5, 5, 10, 0, 0, helvB10L1_0x74_BMP}, + {9, 7, 8, 1, 0, helvB10L1_0x75_BMP}, + {8, 8, 8, 0, 0, helvB10L1_0x76_BMP}, + {10, 10, 8, 0, 0, helvB10L1_0x77_BMP}, + {7, 7, 8, 0, 0, helvB10L1_0x78_BMP}, + {8, 8, 11, 0, -3, helvB10L1_0x79_BMP}, + {6, 6, 8, 0, 0, helvB10L1_0x7A_BMP}, + {6, 5, 14, 0, -3, helvB10L1_0x7B_BMP}, + {4, 1, 14, 2, -3, helvB10L1_0x7C_BMP}, + {6, 5, 14, 1, -3, helvB10L1_0x7D_BMP}, + {9, 7, 3, 1, 3, helvB10L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {4, 1, 1, 0, 0, helvB10L1_0xA0_BMP}, + {4, 2, 11, 1, -3, helvB10L1_0xA1_BMP}, + {8, 7, 10, 0, -1, helvB10L1_0xA2_BMP}, + {8, 8, 11, 0, 0, helvB10L1_0xA3_BMP}, + {8, 7, 7, 0, 2, helvB10L1_0xA4_BMP}, + {9, 8, 11, 0, 0, helvB10L1_0xA5_BMP}, + {4, 1, 14, 2, -3, helvB10L1_0xA6_BMP}, + {8, 6, 14, 1, -3, helvB10L1_0xA7_BMP}, + {5, 5, 2, 0, 9, helvB10L1_0xA8_BMP}, + {12, 10, 11, 1, 0, helvB10L1_0xA9_BMP}, + {6, 5, 7, 0, 4, helvB10L1_0xAA_BMP}, + {9, 7, 5, 1, 2, helvB10L1_0xAB_BMP}, + {9, 7, 4, 1, 2, helvB10L1_0xAC_BMP}, + {4, 3, 1, 0, 4, helvB10L1_0xAD_BMP}, + {12, 10, 11, 1, 0, helvB10L1_0xAE_BMP}, + {5, 5, 1, 0, 9, helvB10L1_0xAF_BMP}, + {6, 4, 4, 1, 7, helvB10L1_0xB0_BMP}, + {9, 8, 9, 0, 0, helvB10L1_0xB1_BMP}, + {5, 4, 6, 0, 5, helvB10L1_0xB2_BMP}, + {5, 4, 6, 0, 5, helvB10L1_0xB3_BMP}, + {5, 3, 2, 1, 9, helvB10L1_0xB4_BMP}, + {9, 7, 11, 1, -3, helvB10L1_0xB5_BMP}, + {8, 8, 14, 0, -3, helvB10L1_0xB6_BMP}, + {4, 2, 2, 1, 3, helvB10L1_0xB7_BMP}, + {5, 5, 3, 0, -3, helvB10L1_0xB8_BMP}, + {4, 3, 6, 0, 5, helvB10L1_0xB9_BMP}, + {6, 5, 7, 0, 4, helvB10L1_0xBA_BMP}, + {9, 7, 5, 1, 2, helvB10L1_0xBB_BMP}, + {12, 12, 11, 0, 0, helvB10L1_0xBC_BMP}, + {12, 11, 11, 0, 0, helvB10L1_0xBD_BMP}, + {12, 12, 11, 0, 0, helvB10L1_0xBE_BMP}, + {9, 7, 11, 1, -3, helvB10L1_0xBF_BMP}, + {10, 10, 14, 0, 0, helvB10L1_0xC0_BMP}, + {10, 10, 14, 0, 0, helvB10L1_0xC1_BMP}, + {10, 10, 14, 0, 0, helvB10L1_0xC2_BMP}, + {10, 10, 14, 0, 0, helvB10L1_0xC3_BMP}, + {10, 10, 14, 0, 0, helvB10L1_0xC4_BMP}, + {10, 10, 14, 0, 0, helvB10L1_0xC5_BMP}, + {15, 14, 11, 0, 0, helvB10L1_0xC6_BMP}, + {11, 9, 14, 1, -3, helvB10L1_0xC7_BMP}, + {9, 7, 14, 1, 0, helvB10L1_0xC8_BMP}, + {9, 7, 14, 1, 0, helvB10L1_0xC9_BMP}, + {9, 7, 14, 1, 0, helvB10L1_0xCA_BMP}, + {9, 7, 14, 1, 0, helvB10L1_0xCB_BMP}, + {4, 3, 14, 0, 0, helvB10L1_0xCC_BMP}, + {4, 3, 14, 1, 0, helvB10L1_0xCD_BMP}, + {4, 5, 14, 0, 0, helvB10L1_0xCE_BMP}, + {4, 5, 14, 0, 0, helvB10L1_0xCF_BMP}, + {11, 10, 11, 0, 0, helvB10L1_0xD0_BMP}, + {11, 9, 14, 1, 0, helvB10L1_0xD1_BMP}, + {12, 10, 14, 1, 0, helvB10L1_0xD2_BMP}, + {12, 10, 14, 1, 0, helvB10L1_0xD3_BMP}, + {12, 10, 14, 1, 0, helvB10L1_0xD4_BMP}, + {12, 10, 14, 1, 0, helvB10L1_0xD5_BMP}, + {12, 10, 14, 1, 0, helvB10L1_0xD6_BMP}, + {9, 8, 7, 0, 1, helvB10L1_0xD7_BMP}, + {12, 12, 11, 0, 0, helvB10L1_0xD8_BMP}, + {11, 9, 14, 1, 0, helvB10L1_0xD9_BMP}, + {11, 9, 14, 1, 0, helvB10L1_0xDA_BMP}, + {11, 9, 14, 1, 0, helvB10L1_0xDB_BMP}, + {11, 9, 14, 1, 0, helvB10L1_0xDC_BMP}, + {10, 10, 14, 0, 0, helvB10L1_0xDD_BMP}, + {10, 8, 11, 1, 0, helvB10L1_0xDE_BMP}, + {8, 6, 11, 1, 0, helvB10L1_0xDF_BMP}, + {8, 7, 11, 1, 0, helvB10L1_0xE0_BMP}, + {8, 7, 11, 1, 0, helvB10L1_0xE1_BMP}, + {8, 7, 11, 1, 0, helvB10L1_0xE2_BMP}, + {8, 7, 11, 1, 0, helvB10L1_0xE3_BMP}, + {8, 7, 11, 1, 0, helvB10L1_0xE4_BMP}, + {8, 7, 11, 1, 0, helvB10L1_0xE5_BMP}, + {13, 11, 8, 1, 0, helvB10L1_0xE6_BMP}, + {9, 7, 11, 1, -3, helvB10L1_0xE7_BMP}, + {8, 6, 11, 1, 0, helvB10L1_0xE8_BMP}, + {8, 6, 11, 1, 0, helvB10L1_0xE9_BMP}, + {8, 6, 11, 1, 0, helvB10L1_0xEA_BMP}, + {8, 6, 11, 1, 0, helvB10L1_0xEB_BMP}, + {4, 3, 11, 0, 0, helvB10L1_0xEC_BMP}, + {4, 3, 11, 1, 0, helvB10L1_0xED_BMP}, + {4, 5, 11, 0, 0, helvB10L1_0xEE_BMP}, + {4, 5, 11, 0, 0, helvB10L1_0xEF_BMP}, + {9, 7, 11, 1, 0, helvB10L1_0xF0_BMP}, + {9, 7, 11, 1, 0, helvB10L1_0xF1_BMP}, + {9, 7, 11, 1, 0, helvB10L1_0xF2_BMP}, + {9, 7, 11, 1, 0, helvB10L1_0xF3_BMP}, + {9, 7, 11, 1, 0, helvB10L1_0xF4_BMP}, + {9, 7, 11, 1, 0, helvB10L1_0xF5_BMP}, + {9, 7, 11, 1, 0, helvB10L1_0xF6_BMP}, + {9, 8, 7, 0, 1, helvB10L1_0xF7_BMP}, + {9, 7, 8, 1, 0, helvB10L1_0xF8_BMP}, + {9, 7, 11, 1, 0, helvB10L1_0xF9_BMP}, + {9, 7, 11, 1, 0, helvB10L1_0xFA_BMP}, + {9, 7, 11, 1, 0, helvB10L1_0xFB_BMP}, + {9, 7, 11, 1, 0, helvB10L1_0xFC_BMP}, + {8, 8, 14, 0, -3, helvB10L1_0xFD_BMP}, + {9, 7, 14, 1, -3, helvB10L1_0xFE_BMP}, + {8, 8, 14, 0, -3, helvB10L1_0xFF_BMP} +}; + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontHelv10Bold_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontHelv10Bold_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontHelv10Bold_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontHelv10Bold_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontHelv10Bold_GetFontChar, + McuFontHelv10Bold_FBBy, + McuFontHelv10Bold_GetUnderlineBoxHeight(), + McuFontHelv10Bold_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv10Bold_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv10Bold_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv10Bold_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv10Bold_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontHelv10Bold. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv10Bold.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv10Bold.h new file mode 100644 index 0000000..c6998b4 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv10Bold.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv10Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv10Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 10 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv10Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv10Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv10Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv10Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv10Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv10Bold_Deinit(void); +** Init - void McuFontHelv10Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv10Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv10Bold_module McuFontHelv10Bold module documentation +** @{ +*/ + + +#ifndef __McuFontHelv10Bold_H +#define __McuFontHelv10Bold_H + +/* MODULE McuFontHelv10Bold. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontHelv10Boldconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontHelv10Bold_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontHelv10Bold_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontHelv10Bold_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontHelv10Bold_GetLineSpaceHeight() \ + 2 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontHelv10Bold_GetUnderlineBoxHeight() \ + 2 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontHelv10Bold_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontHelv10Bold_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontHelv10Bold. */ + +#endif +/* ifndef __McuFontHelv10Bold_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv10Normal.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv10Normal.c new file mode 100644 index 0000000..8b5b600 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv10Normal.c @@ -0,0 +1,3059 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv10Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv10Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 10 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv10Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv10Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv10Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv10Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv10Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv10Normal_Deinit(void); +** Init - void McuFontHelv10Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv10Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv10Normal_module McuFontHelv10Normal module documentation +** @{ +*/ + +/* MODULE McuFontHelv10Normal. */ + +#include "McuFontHelv10Normal.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontHelv10Normal_FBBy 16 + +static const uint8_t helvR10L1_0x00_BMP[] = { + 0xAA, + 0x00, + 0x82, + 0x00, + 0x82, + 0x00, + 0x82, + 0x00, + 0x82, + 0x00, + 0xAA +}; + +static const uint8_t helvR10L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t helvR10L1_0x21_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x00, + 0x80, + 0x80 +}; + +static const uint8_t helvR10L1_0x22_BMP[] = { + 0xA0, + 0xA0, + 0xA0 +}; + +static const uint8_t helvR10L1_0x23_BMP[] = { + 0x14, + 0x14, + 0x14, + 0x7E, + 0x28, + 0x28, + 0xFC, + 0x50, + 0x50, + 0x50 +}; + +static const uint8_t helvR10L1_0x24_BMP[] = { + 0x10, + 0x7C, + 0x92, + 0x92, + 0x90, + 0x50, + 0x38, + 0x14, + 0x12, + 0x92, + 0x92, + 0x7C, + 0x10, + 0x10 +}; + +static const uint8_t helvR10L1_0x25_BMP[] = { + 0x70, 0x80, + 0x89, 0x00, + 0x89, 0x00, + 0x72, 0x00, + 0x02, 0x00, + 0x04, 0x00, + 0x08, 0x00, + 0x09, 0xC0, + 0x12, 0x20, + 0x12, 0x20, + 0x21, 0xC0 +}; + +static const uint8_t helvR10L1_0x26_BMP[] = { + 0x30, + 0x48, + 0x48, + 0x30, + 0x20, + 0x52, + 0x8A, + 0x84, + 0x8A, + 0x71 +}; + +static const uint8_t helvR10L1_0x27_BMP[] = { + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR10L1_0x28_BMP[] = { + 0x20, + 0x40, + 0x40, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x40, + 0x40, + 0x20 +}; + +static const uint8_t helvR10L1_0x29_BMP[] = { + 0x80, + 0x40, + 0x40, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t helvR10L1_0x2A_BMP[] = { + 0x20, + 0xA8, + 0x70, + 0xA8, + 0x20 +}; + +static const uint8_t helvR10L1_0x2B_BMP[] = { + 0x10, + 0x10, + 0x10, + 0xFE, + 0x10, + 0x10, + 0x10 +}; + +static const uint8_t helvR10L1_0x2C_BMP[] = { + 0x40, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t helvR10L1_0x2D_BMP[] = { + 0xE0 +}; + +static const uint8_t helvR10L1_0x2E_BMP[] = { + 0x80, + 0x80 +}; + +static const uint8_t helvR10L1_0x2F_BMP[] = { + 0x10, + 0x10, + 0x20, + 0x20, + 0x20, + 0x40, + 0x40, + 0x40, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR10L1_0x30_BMP[] = { + 0x78, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR10L1_0x31_BMP[] = { + 0x20, + 0xE0, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20 +}; + +static const uint8_t helvR10L1_0x32_BMP[] = { + 0x78, + 0x84, + 0x84, + 0x04, + 0x08, + 0x10, + 0x20, + 0x40, + 0x80, + 0x80, + 0xFC +}; + +static const uint8_t helvR10L1_0x33_BMP[] = { + 0x78, + 0x84, + 0x84, + 0x04, + 0x04, + 0x38, + 0x04, + 0x04, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR10L1_0x34_BMP[] = { + 0x04, + 0x0C, + 0x14, + 0x24, + 0x44, + 0x84, + 0x84, + 0xFE, + 0x04, + 0x04, + 0x04 +}; + +static const uint8_t helvR10L1_0x35_BMP[] = { + 0xFC, + 0x80, + 0x80, + 0x80, + 0xF8, + 0x04, + 0x04, + 0x04, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR10L1_0x36_BMP[] = { + 0x78, + 0x84, + 0x80, + 0x80, + 0xB8, + 0xC4, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR10L1_0x37_BMP[] = { + 0xFC, + 0x04, + 0x08, + 0x08, + 0x10, + 0x10, + 0x20, + 0x20, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR10L1_0x38_BMP[] = { + 0x78, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR10L1_0x39_BMP[] = { + 0x78, + 0x84, + 0x84, + 0x84, + 0x84, + 0x7C, + 0x04, + 0x04, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR10L1_0x3A_BMP[] = { + 0x80, + 0x80, + 0x00, + 0x00, + 0x00, + 0x00, + 0x80, + 0x80 +}; + +static const uint8_t helvR10L1_0x3B_BMP[] = { + 0x40, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t helvR10L1_0x3C_BMP[] = { + 0x0C, + 0x30, + 0xC0, + 0x30, + 0x0C +}; + +static const uint8_t helvR10L1_0x3D_BMP[] = { + 0xFC, + 0x00, + 0xFC +}; + +static const uint8_t helvR10L1_0x3E_BMP[] = { + 0xC0, + 0x30, + 0x0C, + 0x30, + 0xC0 +}; + +static const uint8_t helvR10L1_0x3F_BMP[] = { + 0x30, + 0xCC, + 0x84, + 0x84, + 0x04, + 0x08, + 0x10, + 0x20, + 0x00, + 0x20, + 0x20 +}; + +static const uint8_t helvR10L1_0x40_BMP[] = { + 0x0F, 0x00, + 0x30, 0xC0, + 0x40, 0x20, + 0x46, 0xA0, + 0x89, 0x20, + 0x91, 0x20, + 0x91, 0x20, + 0x93, 0x40, + 0x8D, 0x80, + 0x40, 0x00, + 0x60, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t helvR10L1_0x41_BMP[] = { + 0x08, 0x00, + 0x1C, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x41, 0x00, + 0x7F, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x80, 0x80 +}; + +static const uint8_t helvR10L1_0x42_BMP[] = { + 0xFC, + 0x86, + 0x82, + 0x82, + 0x84, + 0xF8, + 0x84, + 0x82, + 0x82, + 0x86, + 0xFC +}; + +static const uint8_t helvR10L1_0x43_BMP[] = { + 0x1C, + 0x63, + 0x41, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x41, + 0x63, + 0x1C +}; + +static const uint8_t helvR10L1_0x44_BMP[] = { + 0xF8, + 0x86, + 0x82, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x82, + 0x86, + 0xF8 +}; + +static const uint8_t helvR10L1_0x45_BMP[] = { + 0xFE, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFC, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFE +}; + +static const uint8_t helvR10L1_0x46_BMP[] = { + 0xFE, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFC, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR10L1_0x47_BMP[] = { + 0x1E, 0x00, + 0x61, 0x80, + 0x40, 0x80, + 0x80, 0x00, + 0x80, 0x00, + 0x87, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x40, 0x80, + 0x63, 0x80, + 0x1C, 0x80 +}; + +static const uint8_t helvR10L1_0x48_BMP[] = { + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0xFF, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81 +}; + +static const uint8_t helvR10L1_0x49_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR10L1_0x4A_BMP[] = { + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR10L1_0x4B_BMP[] = { + 0x82, + 0x84, + 0x88, + 0x90, + 0xA0, + 0xE0, + 0x90, + 0x88, + 0x84, + 0x82, + 0x81 +}; + +static const uint8_t helvR10L1_0x4C_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFC +}; + +static const uint8_t helvR10L1_0x4D_BMP[] = { + 0x80, 0x20, + 0xC0, 0x60, + 0xC0, 0x60, + 0xA0, 0xA0, + 0xA0, 0xA0, + 0x91, 0x20, + 0x91, 0x20, + 0x8A, 0x20, + 0x8A, 0x20, + 0x84, 0x20, + 0x84, 0x20 +}; + +static const uint8_t helvR10L1_0x4E_BMP[] = { + 0xC1, + 0xA1, + 0xA1, + 0x91, + 0x91, + 0x89, + 0x89, + 0x85, + 0x85, + 0x83, + 0x83 +}; + +static const uint8_t helvR10L1_0x4F_BMP[] = { + 0x1C, 0x00, + 0x63, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x41, 0x00, + 0x63, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t helvR10L1_0x50_BMP[] = { + 0xFC, + 0x86, + 0x82, + 0x82, + 0x86, + 0xFC, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR10L1_0x51_BMP[] = { + 0x1C, 0x00, + 0x63, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x88, 0x80, + 0x84, 0x80, + 0x43, 0x00, + 0x63, 0x00, + 0x1C, 0x80 +}; + +static const uint8_t helvR10L1_0x52_BMP[] = { + 0xFE, + 0x83, + 0x81, + 0x81, + 0x82, + 0xFC, + 0x82, + 0x81, + 0x81, + 0x81, + 0x81 +}; + +static const uint8_t helvR10L1_0x53_BMP[] = { + 0x38, + 0xC6, + 0x82, + 0x80, + 0x60, + 0x18, + 0x06, + 0x02, + 0x82, + 0xC6, + 0x38 +}; + +static const uint8_t helvR10L1_0x54_BMP[] = { + 0xFF, 0x80, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00 +}; + +static const uint8_t helvR10L1_0x55_BMP[] = { + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t helvR10L1_0x56_BMP[] = { + 0x80, 0x80, + 0x80, 0x80, + 0x41, 0x00, + 0x41, 0x00, + 0x63, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x08, 0x00, + 0x08, 0x00 +}; + +static const uint8_t helvR10L1_0x57_BMP[] = { + 0x82, 0x08, + 0x82, 0x08, + 0x85, 0x08, + 0x45, 0x10, + 0x45, 0x10, + 0x45, 0x10, + 0x28, 0xA0, + 0x28, 0xA0, + 0x28, 0xA0, + 0x10, 0x40, + 0x10, 0x40 +}; + +static const uint8_t helvR10L1_0x58_BMP[] = { + 0x80, 0x80, + 0x41, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x80, 0x80 +}; + +static const uint8_t helvR10L1_0x59_BMP[] = { + 0x80, 0x80, + 0xC1, 0x80, + 0x41, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x1C, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00 +}; + +static const uint8_t helvR10L1_0x5A_BMP[] = { + 0xFE, + 0x02, + 0x04, + 0x08, + 0x18, + 0x10, + 0x20, + 0x60, + 0x40, + 0x80, + 0xFE +}; + +static const uint8_t helvR10L1_0x5B_BMP[] = { + 0xE0, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0xE0 +}; + +static const uint8_t helvR10L1_0x5C_BMP[] = { + 0x80, + 0x80, + 0x40, + 0x40, + 0x40, + 0x20, + 0x20, + 0x20, + 0x10, + 0x10, + 0x10 +}; + +static const uint8_t helvR10L1_0x5D_BMP[] = { + 0xE0, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xE0 +}; + +static const uint8_t helvR10L1_0x5E_BMP[] = { + 0x20, + 0x50, + 0x50, + 0x88, + 0x88 +}; + +static const uint8_t helvR10L1_0x5F_BMP[] = { + 0xFF +}; + +static const uint8_t helvR10L1_0x60_BMP[] = { + 0x80, + 0x40 +}; + +static const uint8_t helvR10L1_0x61_BMP[] = { + 0x78, + 0xCC, + 0x04, + 0x7C, + 0xC4, + 0x84, + 0xCC, + 0x76 +}; + +static const uint8_t helvR10L1_0x62_BMP[] = { + 0x80, + 0x80, + 0x80, + 0xB8, + 0xCC, + 0x84, + 0x84, + 0x84, + 0x84, + 0xCC, + 0xB8 +}; + +static const uint8_t helvR10L1_0x63_BMP[] = { + 0x78, + 0xCC, + 0x80, + 0x80, + 0x80, + 0x84, + 0xCC, + 0x78 +}; + +static const uint8_t helvR10L1_0x64_BMP[] = { + 0x04, + 0x04, + 0x04, + 0x74, + 0xCC, + 0x84, + 0x84, + 0x84, + 0x84, + 0xCC, + 0x74 +}; + +static const uint8_t helvR10L1_0x65_BMP[] = { + 0x78, + 0xCC, + 0x84, + 0xFC, + 0x80, + 0x80, + 0xCC, + 0x78 +}; + +static const uint8_t helvR10L1_0x66_BMP[] = { + 0x30, + 0x40, + 0x40, + 0xE0, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR10L1_0x67_BMP[] = { + 0x74, + 0xCC, + 0x84, + 0x84, + 0x84, + 0x84, + 0xCC, + 0x74, + 0x04, + 0xCC, + 0x78 +}; + +static const uint8_t helvR10L1_0x68_BMP[] = { + 0x80, + 0x80, + 0x80, + 0xB8, + 0xCC, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84 +}; + +static const uint8_t helvR10L1_0x69_BMP[] = { + 0x80, + 0x80, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR10L1_0x6A_BMP[] = { + 0x20, + 0x20, + 0x00, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xC0 +}; + +static const uint8_t helvR10L1_0x6B_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x88, + 0x90, + 0xA0, + 0xC0, + 0xA0, + 0x90, + 0x88, + 0x84 +}; + +static const uint8_t helvR10L1_0x6C_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR10L1_0x6D_BMP[] = { + 0xB3, 0x00, + 0xCC, 0x80, + 0x88, 0x80, + 0x88, 0x80, + 0x88, 0x80, + 0x88, 0x80, + 0x88, 0x80, + 0x88, 0x80 +}; + +static const uint8_t helvR10L1_0x6E_BMP[] = { + 0xB8, + 0xCC, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84 +}; + +static const uint8_t helvR10L1_0x6F_BMP[] = { + 0x78, + 0xCC, + 0x84, + 0x84, + 0x84, + 0x84, + 0xCC, + 0x78 +}; + +static const uint8_t helvR10L1_0x70_BMP[] = { + 0xB8, + 0xCC, + 0x84, + 0x84, + 0x84, + 0x84, + 0xCC, + 0xB8, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR10L1_0x71_BMP[] = { + 0x74, + 0xCC, + 0x84, + 0x84, + 0x84, + 0x84, + 0xCC, + 0x74, + 0x04, + 0x04, + 0x04 +}; + +static const uint8_t helvR10L1_0x72_BMP[] = { + 0xB0, + 0xC0, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR10L1_0x73_BMP[] = { + 0x70, + 0x88, + 0xC0, + 0x70, + 0x18, + 0x08, + 0x88, + 0x70 +}; + +static const uint8_t helvR10L1_0x74_BMP[] = { + 0x40, + 0x40, + 0xE0, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x30 +}; + +static const uint8_t helvR10L1_0x75_BMP[] = { + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0xCC, + 0x74 +}; + +static const uint8_t helvR10L1_0x76_BMP[] = { + 0x82, + 0x82, + 0x44, + 0x44, + 0x44, + 0x28, + 0x28, + 0x10 +}; + +static const uint8_t helvR10L1_0x77_BMP[] = { + 0x88, 0x80, + 0x88, 0x80, + 0x88, 0x80, + 0x49, 0x00, + 0x49, 0x00, + 0x55, 0x00, + 0x22, 0x00, + 0x22, 0x00 +}; + +static const uint8_t helvR10L1_0x78_BMP[] = { + 0xC6, + 0x44, + 0x28, + 0x10, + 0x10, + 0x28, + 0x44, + 0xC6 +}; + +static const uint8_t helvR10L1_0x79_BMP[] = { + 0x82, + 0xC2, + 0x44, + 0x44, + 0x24, + 0x28, + 0x18, + 0x10, + 0x10, + 0x30, + 0x60 +}; + +static const uint8_t helvR10L1_0x7A_BMP[] = { + 0xFC, + 0x04, + 0x08, + 0x10, + 0x20, + 0x40, + 0x80, + 0xFC +}; + +static const uint8_t helvR10L1_0x7B_BMP[] = { + 0x18, + 0x20, + 0x20, + 0x20, + 0x20, + 0x40, + 0x80, + 0x40, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x18 +}; + +static const uint8_t helvR10L1_0x7C_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR10L1_0x7D_BMP[] = { + 0xC0, + 0x20, + 0x20, + 0x20, + 0x20, + 0x10, + 0x08, + 0x10, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xC0 +}; + +static const uint8_t helvR10L1_0x7E_BMP[] = { + 0x64, + 0xB4, + 0x98 +}; + +static const uint8_t helvR10L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t helvR10L1_0xA1_BMP[] = { + 0x80, + 0x80, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR10L1_0xA2_BMP[] = { + 0x04, + 0x78, + 0xCC, + 0x90, + 0x90, + 0xA0, + 0xA4, + 0xCC, + 0x78, + 0x80 +}; + +static const uint8_t helvR10L1_0xA3_BMP[] = { + 0x38, + 0x44, + 0x40, + 0x40, + 0xF8, + 0x20, + 0x20, + 0x20, + 0x40, + 0x62, + 0xDC +}; + +static const uint8_t helvR10L1_0xA4_BMP[] = { + 0x84, + 0x78, + 0x48, + 0x48, + 0x78, + 0x84 +}; + +static const uint8_t helvR10L1_0xA5_BMP[] = { + 0x82, + 0x82, + 0x82, + 0x44, + 0x44, + 0x28, + 0xFE, + 0x10, + 0xFE, + 0x10, + 0x10 +}; + +static const uint8_t helvR10L1_0xA6_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x00, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR10L1_0xA7_BMP[] = { + 0x70, + 0xD8, + 0x88, + 0xC0, + 0x70, + 0x98, + 0x88, + 0x88, + 0xC8, + 0x70, + 0x18, + 0x88, + 0xD8, + 0x70 +}; + +static const uint8_t helvR10L1_0xA8_BMP[] = { + 0xD8 +}; + +static const uint8_t helvR10L1_0xA9_BMP[] = { + 0x1E, 0x00, + 0x61, 0x80, + 0x5C, 0x80, + 0xA2, 0xC0, + 0xA2, 0x40, + 0xA0, 0x40, + 0xA2, 0x40, + 0x9C, 0x40, + 0x40, 0x80, + 0x61, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvR10L1_0xAA_BMP[] = { + 0xE0, + 0x10, + 0x70, + 0x90, + 0xD0, + 0x00, + 0xF0 +}; + +static const uint8_t helvR10L1_0xAB_BMP[] = { + 0x24, + 0x48, + 0x90, + 0x48, + 0x24 +}; + +static const uint8_t helvR10L1_0xAC_BMP[] = { + 0xFE, + 0x02, + 0x02, + 0x02 +}; + +static const uint8_t helvR10L1_0xAD_BMP[] = { + 0xE0 +}; + +static const uint8_t helvR10L1_0xAE_BMP[] = { + 0x1E, 0x00, + 0x61, 0x80, + 0x5C, 0x80, + 0x92, 0x40, + 0x92, 0x40, + 0x9C, 0x40, + 0x92, 0x40, + 0x92, 0x40, + 0x40, 0x80, + 0x61, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvR10L1_0xAF_BMP[] = { + 0xF0 +}; + +static const uint8_t helvR10L1_0xB0_BMP[] = { + 0x60, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t helvR10L1_0xB1_BMP[] = { + 0x10, + 0x10, + 0x10, + 0xFE, + 0x10, + 0x10, + 0x10, + 0x00, + 0xFE +}; + +static const uint8_t helvR10L1_0xB2_BMP[] = { + 0x60, + 0x90, + 0x10, + 0x20, + 0x40, + 0xF0 +}; + +static const uint8_t helvR10L1_0xB3_BMP[] = { + 0x60, + 0x90, + 0x20, + 0x10, + 0x90, + 0x60 +}; + +static const uint8_t helvR10L1_0xB4_BMP[] = { + 0x40, + 0x80 +}; + +static const uint8_t helvR10L1_0xB5_BMP[] = { + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0xCC, + 0xB4, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR10L1_0xB6_BMP[] = { + 0x3E, + 0x74, + 0xF4, + 0xF4, + 0xF4, + 0x74, + 0x34, + 0x14, + 0x14, + 0x14, + 0x14, + 0x14, + 0x14, + 0x14 +}; + +static const uint8_t helvR10L1_0xB7_BMP[] = { + 0xC0 +}; + +static const uint8_t helvR10L1_0xB8_BMP[] = { + 0x20, + 0x90, + 0x60 +}; + +static const uint8_t helvR10L1_0xB9_BMP[] = { + 0x40, + 0xC0, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR10L1_0xBA_BMP[] = { + 0x60, + 0x90, + 0x90, + 0x90, + 0x60, + 0x00, + 0xF0 +}; + +static const uint8_t helvR10L1_0xBB_BMP[] = { + 0x90, + 0x48, + 0x24, + 0x48, + 0x90 +}; + +static const uint8_t helvR10L1_0xBC_BMP[] = { + 0x42, 0x00, + 0xC2, 0x00, + 0x44, 0x00, + 0x44, 0x00, + 0x48, 0x00, + 0x48, 0x80, + 0x09, 0x80, + 0x12, 0x80, + 0x14, 0x80, + 0x27, 0xC0, + 0x20, 0x80 +}; + +static const uint8_t helvR10L1_0xBD_BMP[] = { + 0x42, 0x00, + 0xC2, 0x00, + 0x44, 0x00, + 0x44, 0x00, + 0x48, 0x00, + 0x4B, 0x00, + 0x14, 0x80, + 0x10, 0x80, + 0x11, 0x00, + 0x22, 0x00, + 0x27, 0x80 +}; + +static const uint8_t helvR10L1_0xBE_BMP[] = { + 0x61, 0x00, + 0x91, 0x00, + 0x22, 0x00, + 0x12, 0x00, + 0x94, 0x00, + 0x64, 0x40, + 0x04, 0xC0, + 0x09, 0x40, + 0x0A, 0x40, + 0x13, 0xE0, + 0x10, 0x40 +}; + +static const uint8_t helvR10L1_0xBF_BMP[] = { + 0x10, + 0x10, + 0x00, + 0x10, + 0x20, + 0x40, + 0x80, + 0x84, + 0x84, + 0xCC, + 0x30 +}; + +static const uint8_t helvR10L1_0xC0_BMP[] = { + 0x10, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0x08, 0x00, + 0x1C, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x41, 0x00, + 0x7F, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x80, 0x80 +}; + +static const uint8_t helvR10L1_0xC1_BMP[] = { + 0x04, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0x08, 0x00, + 0x1C, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x41, 0x00, + 0x7F, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x80, 0x80 +}; + +static const uint8_t helvR10L1_0xC2_BMP[] = { + 0x0C, 0x00, + 0x12, 0x00, + 0x00, 0x00, + 0x08, 0x00, + 0x1C, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x41, 0x00, + 0x7F, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x80, 0x80 +}; + +static const uint8_t helvR10L1_0xC3_BMP[] = { + 0x1A, 0x00, + 0x2C, 0x00, + 0x00, 0x00, + 0x08, 0x00, + 0x1C, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x41, 0x00, + 0x7F, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x80, 0x80 +}; + +static const uint8_t helvR10L1_0xC4_BMP[] = { + 0x36, 0x00, + 0x00, 0x00, + 0x08, 0x00, + 0x1C, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x41, 0x00, + 0x7F, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x80, 0x80 +}; + +static const uint8_t helvR10L1_0xC5_BMP[] = { + 0x0C, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x14, 0x00, + 0x14, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x41, 0x00, + 0x7F, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x80, 0x80 +}; + +static const uint8_t helvR10L1_0xC6_BMP[] = { + 0x1F, 0xF0, + 0x12, 0x00, + 0x12, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x23, 0xF0, + 0x7E, 0x00, + 0x42, 0x00, + 0x42, 0x00, + 0x82, 0x00, + 0x83, 0xF0 +}; + +static const uint8_t helvR10L1_0xC7_BMP[] = { + 0x1C, + 0x63, + 0x41, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x41, + 0x63, + 0x1C, + 0x08, + 0x24, + 0x18 +}; + +static const uint8_t helvR10L1_0xC8_BMP[] = { + 0x20, + 0x10, + 0x00, + 0xFE, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFC, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFE +}; + +static const uint8_t helvR10L1_0xC9_BMP[] = { + 0x08, + 0x10, + 0x00, + 0xFE, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFC, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFE +}; + +static const uint8_t helvR10L1_0xCA_BMP[] = { + 0x18, + 0x24, + 0x00, + 0xFE, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFC, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFE +}; + +static const uint8_t helvR10L1_0xCB_BMP[] = { + 0x6C, + 0x00, + 0xFE, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFC, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFE +}; + +static const uint8_t helvR10L1_0xCC_BMP[] = { + 0x80, + 0x40, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR10L1_0xCD_BMP[] = { + 0x40, + 0x80, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR10L1_0xCE_BMP[] = { + 0x60, + 0x90, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR10L1_0xCF_BMP[] = { + 0xD8, + 0x00, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20 +}; + +static const uint8_t helvR10L1_0xD0_BMP[] = { + 0x7C, 0x00, + 0x43, 0x00, + 0x41, 0x00, + 0x40, 0x80, + 0x40, 0x80, + 0xF0, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x41, 0x00, + 0x43, 0x00, + 0x7C, 0x00 +}; + +static const uint8_t helvR10L1_0xD1_BMP[] = { + 0x1A, + 0x2C, + 0x00, + 0xC1, + 0xA1, + 0xA1, + 0x91, + 0x91, + 0x89, + 0x89, + 0x85, + 0x85, + 0x83, + 0x83 +}; + +static const uint8_t helvR10L1_0xD2_BMP[] = { + 0x10, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0x1C, 0x00, + 0x63, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x41, 0x00, + 0x63, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t helvR10L1_0xD3_BMP[] = { + 0x04, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0x1C, 0x00, + 0x63, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x41, 0x00, + 0x63, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t helvR10L1_0xD4_BMP[] = { + 0x0C, 0x00, + 0x12, 0x00, + 0x00, 0x00, + 0x1C, 0x00, + 0x63, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x41, 0x00, + 0x63, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t helvR10L1_0xD5_BMP[] = { + 0x1A, 0x00, + 0x2C, 0x00, + 0x00, 0x00, + 0x1C, 0x00, + 0x63, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x41, 0x00, + 0x63, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t helvR10L1_0xD6_BMP[] = { + 0x33, 0x00, + 0x00, 0x00, + 0x1C, 0x00, + 0x63, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x41, 0x00, + 0x63, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t helvR10L1_0xD7_BMP[] = { + 0x82, + 0x44, + 0x28, + 0x10, + 0x28, + 0x44, + 0x82 +}; + +static const uint8_t helvR10L1_0xD8_BMP[] = { + 0x0E, 0x20, + 0x31, 0xC0, + 0x20, 0x80, + 0x41, 0x40, + 0x42, 0x40, + 0x44, 0x40, + 0x48, 0x40, + 0x50, 0x40, + 0x20, 0x80, + 0x71, 0x80, + 0x8E, 0x00 +}; + +static const uint8_t helvR10L1_0xD9_BMP[] = { + 0x10, + 0x08, + 0x00, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t helvR10L1_0xDA_BMP[] = { + 0x04, + 0x08, + 0x00, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t helvR10L1_0xDB_BMP[] = { + 0x18, + 0x24, + 0x00, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t helvR10L1_0xDC_BMP[] = { + 0x66, + 0x00, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x42, + 0x3C +}; + +static const uint8_t helvR10L1_0xDD_BMP[] = { + 0x04, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0x80, 0x80, + 0xC1, 0x80, + 0x41, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x1C, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00 +}; + +static const uint8_t helvR10L1_0xDE_BMP[] = { + 0x80, + 0x80, + 0xFC, + 0x86, + 0x82, + 0x82, + 0x86, + 0xFC, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR10L1_0xDF_BMP[] = { + 0x70, + 0x88, + 0x88, + 0x88, + 0xB0, + 0x90, + 0x88, + 0x88, + 0x88, + 0x88, + 0xB0 +}; + +static const uint8_t helvR10L1_0xE0_BMP[] = { + 0x20, + 0x10, + 0x00, + 0x78, + 0xCC, + 0x04, + 0x7C, + 0xC4, + 0x84, + 0xCC, + 0x76 +}; + +static const uint8_t helvR10L1_0xE1_BMP[] = { + 0x10, + 0x20, + 0x00, + 0x78, + 0xCC, + 0x04, + 0x7C, + 0xC4, + 0x84, + 0xCC, + 0x76 +}; + +static const uint8_t helvR10L1_0xE2_BMP[] = { + 0x30, + 0x48, + 0x00, + 0x78, + 0xCC, + 0x04, + 0x7C, + 0xC4, + 0x84, + 0xCC, + 0x76 +}; + +static const uint8_t helvR10L1_0xE3_BMP[] = { + 0x34, + 0x58, + 0x00, + 0x78, + 0xCC, + 0x04, + 0x7C, + 0xC4, + 0x84, + 0xCC, + 0x76 +}; + +static const uint8_t helvR10L1_0xE4_BMP[] = { + 0x48, + 0x48, + 0x00, + 0x78, + 0xCC, + 0x04, + 0x7C, + 0xC4, + 0x84, + 0xCC, + 0x76 +}; + +static const uint8_t helvR10L1_0xE5_BMP[] = { + 0x30, + 0x48, + 0x30, + 0x00, + 0x78, + 0xCC, + 0x04, + 0x7C, + 0xC4, + 0x84, + 0xCC, + 0x76 +}; + +static const uint8_t helvR10L1_0xE6_BMP[] = { + 0x7B, 0xC0, + 0xC6, 0x60, + 0x04, 0x20, + 0x7F, 0xE0, + 0xC4, 0x00, + 0x84, 0x00, + 0xCE, 0x60, + 0x7B, 0xC0 +}; + +static const uint8_t helvR10L1_0xE7_BMP[] = { + 0x78, + 0xCC, + 0x80, + 0x80, + 0x80, + 0x84, + 0xCC, + 0x78, + 0x10, + 0x48, + 0x30 +}; + +static const uint8_t helvR10L1_0xE8_BMP[] = { + 0x20, + 0x10, + 0x00, + 0x78, + 0xCC, + 0x84, + 0xFC, + 0x80, + 0x80, + 0xCC, + 0x78 +}; + +static const uint8_t helvR10L1_0xE9_BMP[] = { + 0x10, + 0x20, + 0x00, + 0x78, + 0xCC, + 0x84, + 0xFC, + 0x80, + 0x80, + 0xCC, + 0x78 +}; + +static const uint8_t helvR10L1_0xEA_BMP[] = { + 0x30, + 0x48, + 0x00, + 0x78, + 0xCC, + 0x84, + 0xFC, + 0x80, + 0x80, + 0xCC, + 0x78 +}; + +static const uint8_t helvR10L1_0xEB_BMP[] = { + 0x48, + 0x48, + 0x00, + 0x78, + 0xCC, + 0x84, + 0xFC, + 0x80, + 0x80, + 0xCC, + 0x78 +}; + +static const uint8_t helvR10L1_0xEC_BMP[] = { + 0x80, + 0x40, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR10L1_0xED_BMP[] = { + 0x40, + 0x80, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR10L1_0xEE_BMP[] = { + 0x60, + 0x90, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR10L1_0xEF_BMP[] = { + 0xA0, + 0xA0, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR10L1_0xF0_BMP[] = { + 0xD8, + 0x70, + 0x90, + 0x78, + 0xCC, + 0x84, + 0x84, + 0x84, + 0x84, + 0xCC, + 0x78 +}; + +static const uint8_t helvR10L1_0xF1_BMP[] = { + 0x68, + 0xB0, + 0x00, + 0xB8, + 0xCC, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84 +}; + +static const uint8_t helvR10L1_0xF2_BMP[] = { + 0x20, + 0x10, + 0x00, + 0x78, + 0xCC, + 0x84, + 0x84, + 0x84, + 0x84, + 0xCC, + 0x78 +}; + +static const uint8_t helvR10L1_0xF3_BMP[] = { + 0x10, + 0x20, + 0x00, + 0x78, + 0xCC, + 0x84, + 0x84, + 0x84, + 0x84, + 0xCC, + 0x78 +}; + +static const uint8_t helvR10L1_0xF4_BMP[] = { + 0x30, + 0x48, + 0x00, + 0x78, + 0xCC, + 0x84, + 0x84, + 0x84, + 0x84, + 0xCC, + 0x78 +}; + +static const uint8_t helvR10L1_0xF5_BMP[] = { + 0x68, + 0xB0, + 0x00, + 0x78, + 0xCC, + 0x84, + 0x84, + 0x84, + 0x84, + 0xCC, + 0x78 +}; + +static const uint8_t helvR10L1_0xF6_BMP[] = { + 0x48, + 0x48, + 0x00, + 0x78, + 0xCC, + 0x84, + 0x84, + 0x84, + 0x84, + 0xCC, + 0x78 +}; + +static const uint8_t helvR10L1_0xF7_BMP[] = { + 0x10, + 0x10, + 0x00, + 0xFE, + 0x00, + 0x10, + 0x10 +}; + +static const uint8_t helvR10L1_0xF8_BMP[] = { + 0x3D, + 0x62, + 0x46, + 0x4A, + 0x52, + 0x62, + 0x46, + 0xBC +}; + +static const uint8_t helvR10L1_0xF9_BMP[] = { + 0x20, + 0x10, + 0x00, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0xCC, + 0x74 +}; + +static const uint8_t helvR10L1_0xFA_BMP[] = { + 0x10, + 0x20, + 0x00, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0xCC, + 0x74 +}; + +static const uint8_t helvR10L1_0xFB_BMP[] = { + 0x30, + 0x48, + 0x00, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0xCC, + 0x74 +}; + +static const uint8_t helvR10L1_0xFC_BMP[] = { + 0x48, + 0x48, + 0x00, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0xCC, + 0x74 +}; + +static const uint8_t helvR10L1_0xFD_BMP[] = { + 0x08, + 0x10, + 0x00, + 0x82, + 0xC2, + 0x44, + 0x44, + 0x24, + 0x28, + 0x18, + 0x10, + 0x10, + 0x30, + 0x60 +}; + +static const uint8_t helvR10L1_0xFE_BMP[] = { + 0x80, + 0x80, + 0x80, + 0xB8, + 0xCC, + 0x84, + 0x84, + 0x84, + 0x84, + 0xCC, + 0xB8, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR10L1_0xFF_BMP[] = { + 0x24, + 0x24, + 0x00, + 0x82, + 0xC2, + 0x44, + 0x44, + 0x24, + 0x28, + 0x18, + 0x10, + 0x10, + 0x30, + 0x60 +}; + +static const GFONT_CharInfo FontBMP[] = { + {10, 7, 11, 1, 0, helvR10L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {4, 1, 1, 0, 0, helvR10L1_0x20_BMP}, + {4, 1, 11, 2, 0, helvR10L1_0x21_BMP}, + {5, 3, 3, 1, 8, helvR10L1_0x22_BMP}, + {8, 7, 10, 0, 0, helvR10L1_0x23_BMP}, + {8, 7, 14, 0, -2, helvR10L1_0x24_BMP}, + {12, 11, 11, 0, 0, helvR10L1_0x25_BMP}, + {10, 8, 10, 1, 0, helvR10L1_0x26_BMP}, + {3, 1, 3, 1, 8, helvR10L1_0x27_BMP}, + {5, 3, 14, 1, -3, helvR10L1_0x28_BMP}, + {5, 3, 14, 1, -3, helvR10L1_0x29_BMP}, + {7, 5, 5, 1, 6, helvR10L1_0x2A_BMP}, + {9, 7, 7, 1, 1, helvR10L1_0x2B_BMP}, + {3, 2, 4, 0, -2, helvR10L1_0x2C_BMP}, + {4, 3, 1, 0, 4, helvR10L1_0x2D_BMP}, + {3, 1, 2, 1, 0, helvR10L1_0x2E_BMP}, + {4, 4, 11, 0, 0, helvR10L1_0x2F_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0x30_BMP}, + {8, 3, 11, 2, 0, helvR10L1_0x31_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0x32_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0x33_BMP}, + {8, 7, 11, 1, 0, helvR10L1_0x34_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0x35_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0x36_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0x37_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0x38_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0x39_BMP}, + {3, 1, 8, 1, 0, helvR10L1_0x3A_BMP}, + {4, 2, 10, 0, -2, helvR10L1_0x3B_BMP}, + {8, 6, 5, 1, 2, helvR10L1_0x3C_BMP}, + {9, 6, 3, 1, 3, helvR10L1_0x3D_BMP}, + {8, 6, 5, 1, 2, helvR10L1_0x3E_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0x3F_BMP}, + {13, 11, 12, 1, -1, helvR10L1_0x40_BMP}, + {9, 9, 11, 0, 0, helvR10L1_0x41_BMP}, + {9, 7, 11, 1, 0, helvR10L1_0x42_BMP}, + {10, 8, 11, 1, 0, helvR10L1_0x43_BMP}, + {10, 8, 11, 1, 0, helvR10L1_0x44_BMP}, + {9, 7, 11, 1, 0, helvR10L1_0x45_BMP}, + {8, 7, 11, 1, 0, helvR10L1_0x46_BMP}, + {11, 9, 11, 1, 0, helvR10L1_0x47_BMP}, + {10, 8, 11, 1, 0, helvR10L1_0x48_BMP}, + {4, 1, 11, 2, 0, helvR10L1_0x49_BMP}, + {7, 6, 11, 0, 0, helvR10L1_0x4A_BMP}, + {9, 8, 11, 1, 0, helvR10L1_0x4B_BMP}, + {8, 6, 11, 2, 0, helvR10L1_0x4C_BMP}, + {12, 11, 11, 0, 0, helvR10L1_0x4D_BMP}, + {10, 8, 11, 1, 0, helvR10L1_0x4E_BMP}, + {11, 9, 11, 1, 0, helvR10L1_0x4F_BMP}, + {9, 7, 11, 1, 0, helvR10L1_0x50_BMP}, + {11, 9, 11, 1, 0, helvR10L1_0x51_BMP}, + {10, 8, 11, 1, 0, helvR10L1_0x52_BMP}, + {9, 7, 11, 1, 0, helvR10L1_0x53_BMP}, + {9, 9, 11, 0, 0, helvR10L1_0x54_BMP}, + {10, 8, 11, 1, 0, helvR10L1_0x55_BMP}, + {9, 9, 11, 0, 0, helvR10L1_0x56_BMP}, + {13, 13, 11, 0, 0, helvR10L1_0x57_BMP}, + {9, 9, 11, 0, 0, helvR10L1_0x58_BMP}, + {9, 9, 11, 0, 0, helvR10L1_0x59_BMP}, + {9, 7, 11, 1, 0, helvR10L1_0x5A_BMP}, + {4, 3, 14, 1, -3, helvR10L1_0x5B_BMP}, + {4, 4, 11, 0, 0, helvR10L1_0x5C_BMP}, + {4, 3, 14, 0, -3, helvR10L1_0x5D_BMP}, + {7, 5, 5, 1, 6, helvR10L1_0x5E_BMP}, + {8, 8, 1, 0, -3, helvR10L1_0x5F_BMP}, + {5, 2, 2, 1, 9, helvR10L1_0x60_BMP}, + {8, 7, 8, 1, 0, helvR10L1_0x61_BMP}, + {7, 6, 11, 1, 0, helvR10L1_0x62_BMP}, + {7, 6, 8, 1, 0, helvR10L1_0x63_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0x64_BMP}, + {8, 6, 8, 1, 0, helvR10L1_0x65_BMP}, + {4, 4, 11, 0, 0, helvR10L1_0x66_BMP}, + {8, 6, 11, 1, -3, helvR10L1_0x67_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0x68_BMP}, + {3, 1, 11, 1, 0, helvR10L1_0x69_BMP}, + {3, 3, 14, -1, -3, helvR10L1_0x6A_BMP}, + {7, 6, 11, 1, 0, helvR10L1_0x6B_BMP}, + {3, 1, 11, 1, 0, helvR10L1_0x6C_BMP}, + {11, 9, 8, 1, 0, helvR10L1_0x6D_BMP}, + {8, 6, 8, 1, 0, helvR10L1_0x6E_BMP}, + {8, 6, 8, 1, 0, helvR10L1_0x6F_BMP}, + {8, 6, 11, 1, -3, helvR10L1_0x70_BMP}, + {8, 6, 11, 1, -3, helvR10L1_0x71_BMP}, + {5, 4, 8, 1, 0, helvR10L1_0x72_BMP}, + {7, 5, 8, 1, 0, helvR10L1_0x73_BMP}, + {4, 4, 10, 0, 0, helvR10L1_0x74_BMP}, + {7, 6, 8, 1, 0, helvR10L1_0x75_BMP}, + {7, 7, 8, 0, 0, helvR10L1_0x76_BMP}, + {10, 9, 8, 0, 0, helvR10L1_0x77_BMP}, + {7, 7, 8, 0, 0, helvR10L1_0x78_BMP}, + {7, 7, 11, 0, -3, helvR10L1_0x79_BMP}, + {7, 6, 8, 0, 0, helvR10L1_0x7A_BMP}, + {5, 5, 14, 0, -3, helvR10L1_0x7B_BMP}, + {3, 1, 14, 1, -3, helvR10L1_0x7C_BMP}, + {5, 5, 14, 0, -3, helvR10L1_0x7D_BMP}, + {8, 6, 3, 1, 3, helvR10L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {4, 1, 1, 0, 0, helvR10L1_0xA0_BMP}, + {4, 1, 11, 1, -3, helvR10L1_0xA1_BMP}, + {8, 6, 10, 1, -1, helvR10L1_0xA2_BMP}, + {8, 7, 11, 0, 0, helvR10L1_0xA3_BMP}, + {8, 6, 6, 1, 2, helvR10L1_0xA4_BMP}, + {7, 7, 11, 0, 0, helvR10L1_0xA5_BMP}, + {3, 1, 14, 1, -3, helvR10L1_0xA6_BMP}, + {8, 5, 14, 2, -3, helvR10L1_0xA7_BMP}, + {5, 5, 1, 0, 9, helvR10L1_0xA8_BMP}, + {12, 10, 11, 1, 0, helvR10L1_0xA9_BMP}, + {6, 4, 7, 1, 4, helvR10L1_0xAA_BMP}, + {8, 6, 5, 1, 2, helvR10L1_0xAB_BMP}, + {9, 7, 4, 1, 2, helvR10L1_0xAC_BMP}, + {4, 3, 1, 0, 4, helvR10L1_0xAD_BMP}, + {12, 10, 11, 1, 0, helvR10L1_0xAE_BMP}, + {4, 4, 1, 0, 9, helvR10L1_0xAF_BMP}, + {6, 4, 4, 1, 7, helvR10L1_0xB0_BMP}, + {9, 7, 9, 1, 0, helvR10L1_0xB1_BMP}, + {5, 4, 6, 0, 5, helvR10L1_0xB2_BMP}, + {5, 4, 6, 0, 5, helvR10L1_0xB3_BMP}, + {5, 2, 2, 2, 9, helvR10L1_0xB4_BMP}, + {8, 6, 11, 1, -3, helvR10L1_0xB5_BMP}, + {8, 7, 14, 0, -3, helvR10L1_0xB6_BMP}, + {4, 2, 1, 1, 4, helvR10L1_0xB7_BMP}, + {5, 4, 3, 0, -3, helvR10L1_0xB8_BMP}, + {5, 2, 6, 1, 5, helvR10L1_0xB9_BMP}, + {6, 4, 7, 1, 4, helvR10L1_0xBA_BMP}, + {8, 6, 5, 1, 2, helvR10L1_0xBB_BMP}, + {12, 10, 11, 1, 0, helvR10L1_0xBC_BMP}, + {12, 9, 11, 1, 0, helvR10L1_0xBD_BMP}, + {12, 11, 11, 0, 0, helvR10L1_0xBE_BMP}, + {8, 6, 11, 1, -3, helvR10L1_0xBF_BMP}, + {9, 9, 14, 0, 0, helvR10L1_0xC0_BMP}, + {9, 9, 14, 0, 0, helvR10L1_0xC1_BMP}, + {9, 9, 14, 0, 0, helvR10L1_0xC2_BMP}, + {9, 9, 14, 0, 0, helvR10L1_0xC3_BMP}, + {9, 9, 13, 0, 0, helvR10L1_0xC4_BMP}, + {9, 9, 14, 0, 0, helvR10L1_0xC5_BMP}, + {14, 12, 11, 1, 0, helvR10L1_0xC6_BMP}, + {10, 8, 14, 1, -3, helvR10L1_0xC7_BMP}, + {9, 7, 14, 1, 0, helvR10L1_0xC8_BMP}, + {9, 7, 14, 1, 0, helvR10L1_0xC9_BMP}, + {9, 7, 14, 1, 0, helvR10L1_0xCA_BMP}, + {9, 7, 13, 1, 0, helvR10L1_0xCB_BMP}, + {4, 2, 14, 1, 0, helvR10L1_0xCC_BMP}, + {4, 2, 14, 2, 0, helvR10L1_0xCD_BMP}, + {4, 4, 14, 1, 0, helvR10L1_0xCE_BMP}, + {4, 5, 13, 0, 0, helvR10L1_0xCF_BMP}, + {10, 9, 11, 0, 0, helvR10L1_0xD0_BMP}, + {10, 8, 14, 1, 0, helvR10L1_0xD1_BMP}, + {11, 9, 14, 1, 0, helvR10L1_0xD2_BMP}, + {11, 9, 14, 1, 0, helvR10L1_0xD3_BMP}, + {11, 9, 14, 1, 0, helvR10L1_0xD4_BMP}, + {11, 9, 14, 1, 0, helvR10L1_0xD5_BMP}, + {11, 9, 13, 1, 0, helvR10L1_0xD6_BMP}, + {9, 7, 7, 1, 1, helvR10L1_0xD7_BMP}, + {11, 11, 11, 0, 0, helvR10L1_0xD8_BMP}, + {10, 8, 14, 1, 0, helvR10L1_0xD9_BMP}, + {10, 8, 14, 1, 0, helvR10L1_0xDA_BMP}, + {10, 8, 14, 1, 0, helvR10L1_0xDB_BMP}, + {10, 8, 13, 1, 0, helvR10L1_0xDC_BMP}, + {9, 9, 14, 0, 0, helvR10L1_0xDD_BMP}, + {9, 7, 11, 1, 0, helvR10L1_0xDE_BMP}, + {7, 5, 11, 1, 0, helvR10L1_0xDF_BMP}, + {8, 7, 11, 1, 0, helvR10L1_0xE0_BMP}, + {8, 7, 11, 1, 0, helvR10L1_0xE1_BMP}, + {8, 7, 11, 1, 0, helvR10L1_0xE2_BMP}, + {8, 7, 11, 1, 0, helvR10L1_0xE3_BMP}, + {8, 7, 11, 1, 0, helvR10L1_0xE4_BMP}, + {8, 7, 12, 1, 0, helvR10L1_0xE5_BMP}, + {13, 11, 8, 1, 0, helvR10L1_0xE6_BMP}, + {8, 6, 11, 1, -3, helvR10L1_0xE7_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0xE8_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0xE9_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0xEA_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0xEB_BMP}, + {3, 2, 11, 1, 0, helvR10L1_0xEC_BMP}, + {3, 2, 11, 1, 0, helvR10L1_0xED_BMP}, + {3, 4, 11, 0, 0, helvR10L1_0xEE_BMP}, + {3, 3, 11, 0, 0, helvR10L1_0xEF_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0xF0_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0xF1_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0xF2_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0xF3_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0xF4_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0xF5_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0xF6_BMP}, + {9, 7, 7, 1, 1, helvR10L1_0xF7_BMP}, + {8, 8, 8, 0, 0, helvR10L1_0xF8_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0xF9_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0xFA_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0xFB_BMP}, + {8, 6, 11, 1, 0, helvR10L1_0xFC_BMP}, + {7, 7, 14, 0, -3, helvR10L1_0xFD_BMP}, + {8, 6, 14, 1, -3, helvR10L1_0xFE_BMP}, + {7, 7, 14, 0, -3, helvR10L1_0xFF_BMP} +}; + + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontHelv10Normal_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontHelv10Normal_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontHelv10Normal_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontHelv10Normal_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontHelv10Normal_GetFontChar, + McuFontHelv10Normal_FBBy, + McuFontHelv10Normal_GetUnderlineBoxHeight(), + McuFontHelv10Normal_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv10Normal_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv10Normal_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv10Normal_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv10Normal_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontHelv10Normal. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv10Normal.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv10Normal.h new file mode 100644 index 0000000..8b18a80 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv10Normal.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv10Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv10Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 10 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv10Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv10Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv10Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv10Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv10Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv10Normal_Deinit(void); +** Init - void McuFontHelv10Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv10Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv10Normal_module McuFontHelv10Normal module documentation +** @{ +*/ + + +#ifndef __McuFontHelv10Normal_H +#define __McuFontHelv10Normal_H + +/* MODULE McuFontHelv10Normal. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontHelv10Normalconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontHelv10Normal_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontHelv10Normal_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontHelv10Normal_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontHelv10Normal_GetLineSpaceHeight() \ + 2 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontHelv10Normal_GetUnderlineBoxHeight() \ + 3 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontHelv10Normal_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontHelv10Normal_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontHelv10Normal. */ + +#endif +/* ifndef __McuFontHelv10Normal_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv12Bold.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv12Bold.c new file mode 100644 index 0000000..8fc4d6d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv12Bold.c @@ -0,0 +1,3301 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv12Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv12Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 12 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv12Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv12Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv12Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv12Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv12Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv12Bold_Deinit(void); +** Init - void McuFontHelv12Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv12Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv12Bold_module McuFontHelv12Bold module documentation +** @{ +*/ + +/* MODULE McuFontHelv12Bold. */ + +#include "McuFontHelv12Bold.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontHelv12Bold_FBBy 18 + +static const uint8_t helvB12L1_0x00_BMP[] = { + 0xAA, 0x80, + 0x00, 0x00, + 0x80, 0x80, + 0x00, 0x00, + 0x80, 0x80, + 0x00, 0x00, + 0x80, 0x80, + 0x00, 0x00, + 0x80, 0x80, + 0x00, 0x00, + 0xAA, 0x80 +}; + +static const uint8_t helvB12L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t helvB12L1_0x21_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x80, + 0x80, + 0x80, + 0x00, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB12L1_0x22_BMP[] = { + 0xD8, + 0xD8, + 0xD8, + 0x48 +}; + +static const uint8_t helvB12L1_0x23_BMP[] = { + 0x1B, 0x00, + 0x1B, 0x00, + 0x1B, 0x00, + 0x7F, 0x80, + 0x7F, 0x80, + 0x36, 0x00, + 0x36, 0x00, + 0xFF, 0x00, + 0xFF, 0x00, + 0x6C, 0x00, + 0x6C, 0x00, + 0x6C, 0x00 +}; + +static const uint8_t helvB12L1_0x24_BMP[] = { + 0x10, + 0x7C, + 0xFE, + 0xD6, + 0xD0, + 0xF0, + 0x78, + 0x3C, + 0x1E, + 0x16, + 0xD6, + 0xFE, + 0x7C, + 0x10 +}; + +static const uint8_t helvB12L1_0x25_BMP[] = { + 0x30, 0x40, + 0x78, 0x80, + 0xCC, 0x80, + 0xCD, 0x00, + 0x79, 0x00, + 0x32, 0x00, + 0x02, 0x60, + 0x04, 0xF0, + 0x05, 0x98, + 0x09, 0x98, + 0x08, 0xF0, + 0x10, 0x60 +}; + +static const uint8_t helvB12L1_0x26_BMP[] = { + 0x3C, 0x00, + 0x7E, 0x00, + 0x66, 0x00, + 0x66, 0x00, + 0x3C, 0x00, + 0x38, 0xC0, + 0x7D, 0xC0, + 0xCF, 0x80, + 0xC7, 0x00, + 0xC7, 0x00, + 0x7F, 0x80, + 0x39, 0xC0 +}; + +static const uint8_t helvB12L1_0x27_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0x40 +}; + +static const uint8_t helvB12L1_0x28_BMP[] = { + 0x30, + 0x70, + 0x60, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x60, + 0x70, + 0x30 +}; + +static const uint8_t helvB12L1_0x29_BMP[] = { + 0xC0, + 0xE0, + 0x60, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x60, + 0xE0, + 0xC0 +}; + +static const uint8_t helvB12L1_0x2A_BMP[] = { + 0x20, + 0xA8, + 0x70, + 0x70, + 0x88 +}; + +static const uint8_t helvB12L1_0x2B_BMP[] = { + 0x18, + 0x18, + 0x18, + 0xFF, + 0xFF, + 0x18, + 0x18, + 0x18 +}; + +static const uint8_t helvB12L1_0x2C_BMP[] = { + 0xC0, + 0xC0, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t helvB12L1_0x2D_BMP[] = { + 0xF0, + 0xF0 +}; + +static const uint8_t helvB12L1_0x2E_BMP[] = { + 0xC0, + 0xC0 +}; + +static const uint8_t helvB12L1_0x2F_BMP[] = { + 0x10, + 0x10, + 0x30, + 0x20, + 0x20, + 0x60, + 0x40, + 0x40, + 0xC0, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvB12L1_0x30_BMP[] = { + 0x3C, + 0x7E, + 0xE7, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t helvB12L1_0x31_BMP[] = { + 0x08, + 0x18, + 0xF8, + 0xF8, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18 +}; + +static const uint8_t helvB12L1_0x32_BMP[] = { + 0x3C, + 0x7E, + 0xE7, + 0xC3, + 0xC3, + 0x07, + 0x0E, + 0x1C, + 0x38, + 0x70, + 0xFF, + 0xFF +}; + +static const uint8_t helvB12L1_0x33_BMP[] = { + 0x3C, + 0x7E, + 0xE7, + 0xC3, + 0x07, + 0x1E, + 0x1E, + 0x07, + 0xC3, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t helvB12L1_0x34_BMP[] = { + 0x0E, + 0x1E, + 0x36, + 0x36, + 0x66, + 0x66, + 0xC6, + 0xFF, + 0xFF, + 0x06, + 0x06, + 0x06 +}; + +static const uint8_t helvB12L1_0x35_BMP[] = { + 0x3F, + 0x3F, + 0x30, + 0x30, + 0x7C, + 0x7E, + 0x47, + 0x03, + 0x03, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t helvB12L1_0x36_BMP[] = { + 0x3C, + 0x7E, + 0xE7, + 0xC0, + 0xDC, + 0xFE, + 0xE7, + 0xC3, + 0xC3, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t helvB12L1_0x37_BMP[] = { + 0xFF, + 0xFF, + 0x06, + 0x06, + 0x0C, + 0x0C, + 0x18, + 0x18, + 0x18, + 0x30, + 0x30, + 0x30 +}; + +static const uint8_t helvB12L1_0x38_BMP[] = { + 0x3C, + 0x7E, + 0xE7, + 0xC3, + 0x66, + 0x3C, + 0x7E, + 0xE7, + 0xC3, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t helvB12L1_0x39_BMP[] = { + 0x3C, + 0x7E, + 0xE7, + 0xC3, + 0xC3, + 0xE7, + 0x7F, + 0x3B, + 0x03, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t helvB12L1_0x3A_BMP[] = { + 0xC0, + 0xC0, + 0x00, + 0x00, + 0x00, + 0x00, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB12L1_0x3B_BMP[] = { + 0xC0, + 0xC0, + 0x00, + 0x00, + 0x00, + 0x00, + 0xC0, + 0xC0, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t helvB12L1_0x3C_BMP[] = { + 0x03, + 0x0F, + 0x3C, + 0xE0, + 0xE0, + 0x3C, + 0x0F, + 0x03 +}; + +static const uint8_t helvB12L1_0x3D_BMP[] = { + 0xFF, + 0xFF, + 0x00, + 0x00, + 0xFF, + 0xFF +}; + +static const uint8_t helvB12L1_0x3E_BMP[] = { + 0xC0, + 0xF0, + 0x3C, + 0x07, + 0x07, + 0x3C, + 0xF0, + 0xC0 +}; + +static const uint8_t helvB12L1_0x3F_BMP[] = { + 0x7C, + 0xFE, + 0xC6, + 0xC6, + 0x06, + 0x0E, + 0x0C, + 0x18, + 0x18, + 0x00, + 0x18, + 0x18 +}; + +static const uint8_t helvB12L1_0x40_BMP[] = { + 0x0F, 0xC0, + 0x38, 0x60, + 0x60, 0x10, + 0x47, 0xD8, + 0xCC, 0x48, + 0x88, 0xC8, + 0x98, 0xC8, + 0x98, 0x88, + 0x99, 0x98, + 0xC9, 0x90, + 0x46, 0x60, + 0x60, 0x00, + 0x38, 0xC0, + 0x0F, 0x80 +}; + +static const uint8_t helvB12L1_0x41_BMP[] = { + 0x0E, 0x00, + 0x0E, 0x00, + 0x1F, 0x00, + 0x1B, 0x00, + 0x3B, 0x80, + 0x31, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0x7F, 0xC0, + 0xFF, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60 +}; + +static const uint8_t helvB12L1_0x42_BMP[] = { + 0xFE, 0x00, + 0xFF, 0x00, + 0xC3, 0x80, + 0xC1, 0x80, + 0xC3, 0x80, + 0xFF, 0x00, + 0xFF, 0x00, + 0xC3, 0x80, + 0xC1, 0x80, + 0xC3, 0x80, + 0xFF, 0x00, + 0xFE, 0x00 +}; + +static const uint8_t helvB12L1_0x43_BMP[] = { + 0x1F, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xE0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xE0, 0x00, + 0x60, 0xC0, + 0x71, 0xC0, + 0x3F, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t helvB12L1_0x44_BMP[] = { + 0xFC, 0x00, + 0xFF, 0x00, + 0xC3, 0x80, + 0xC1, 0x80, + 0xC1, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0xC1, 0x80, + 0xC3, 0x80, + 0xFF, 0x00, + 0xFC, 0x00 +}; + +static const uint8_t helvB12L1_0x45_BMP[] = { + 0xFF, + 0xFF, + 0xC0, + 0xC0, + 0xC0, + 0xFE, + 0xFE, + 0xC0, + 0xC0, + 0xC0, + 0xFF, + 0xFF +}; + +static const uint8_t helvB12L1_0x46_BMP[] = { + 0xFF, + 0xFF, + 0xC0, + 0xC0, + 0xC0, + 0xFE, + 0xFE, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB12L1_0x47_BMP[] = { + 0x1F, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xE0, 0x00, + 0xC0, 0x00, + 0xC3, 0xC0, + 0xE3, 0xC0, + 0x60, 0xC0, + 0x71, 0xC0, + 0x3F, 0xC0, + 0x1E, 0xC0 +}; + +static const uint8_t helvB12L1_0x48_BMP[] = { + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0 +}; + +static const uint8_t helvB12L1_0x49_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB12L1_0x4A_BMP[] = { + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0x06, + 0xC6, + 0xC6, + 0xFE, + 0x7C +}; + +static const uint8_t helvB12L1_0x4B_BMP[] = { + 0xC1, 0xC0, + 0xC3, 0x80, + 0xC7, 0x00, + 0xCE, 0x00, + 0xDC, 0x00, + 0xF8, 0x00, + 0xFC, 0x00, + 0xCE, 0x00, + 0xC7, 0x00, + 0xC3, 0x80, + 0xC1, 0xC0, + 0xC0, 0xE0 +}; + +static const uint8_t helvB12L1_0x4C_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xFF, + 0xFF +}; + +static const uint8_t helvB12L1_0x4D_BMP[] = { + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xF1, 0xE0, + 0xF1, 0xE0, + 0xD1, 0x60, + 0xDB, 0x60, + 0xDB, 0x60, + 0xCA, 0x60, + 0xCE, 0x60, + 0xCE, 0x60, + 0xC4, 0x60 +}; + +static const uint8_t helvB12L1_0x4E_BMP[] = { + 0xE0, 0xC0, + 0xF0, 0xC0, + 0xF0, 0xC0, + 0xD8, 0xC0, + 0xD8, 0xC0, + 0xCC, 0xC0, + 0xCC, 0xC0, + 0xC6, 0xC0, + 0xC6, 0xC0, + 0xC3, 0xC0, + 0xC3, 0xC0, + 0xC1, 0xC0 +}; + +static const uint8_t helvB12L1_0x4F_BMP[] = { + 0x1F, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xE0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0xE0, + 0x60, 0xC0, + 0x71, 0xC0, + 0x3F, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t helvB12L1_0x50_BMP[] = { + 0xFE, 0x00, + 0xFF, 0x00, + 0xC3, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC3, 0x80, + 0xFF, 0x00, + 0xFE, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t helvB12L1_0x51_BMP[] = { + 0x1F, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xE0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE2, 0x60, + 0x67, 0xC0, + 0x73, 0xC0, + 0x3F, 0x80, + 0x1F, 0xC0, + 0x00, 0x80 +}; + +static const uint8_t helvB12L1_0x52_BMP[] = { + 0xFF, 0x00, + 0xFF, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC3, 0x80, + 0xFF, 0x00, + 0xFF, 0x00, + 0xC3, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0xC0, + 0xC1, 0xC0 +}; + +static const uint8_t helvB12L1_0x53_BMP[] = { + 0x3E, 0x00, + 0x7F, 0x00, + 0xE3, 0x80, + 0xC1, 0x80, + 0xF0, 0x00, + 0x7E, 0x00, + 0x1F, 0x00, + 0x03, 0x80, + 0xC1, 0x80, + 0xE3, 0x80, + 0x7F, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvB12L1_0x54_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00 +}; + +static const uint8_t helvB12L1_0x55_BMP[] = { + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x7F, 0x80, + 0x3F, 0x00 +}; + +static const uint8_t helvB12L1_0x56_BMP[] = { + 0xC0, 0xC0, + 0xC0, 0xC0, + 0x61, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0x33, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x0C, 0x00, + 0x0C, 0x00 +}; + +static const uint8_t helvB12L1_0x57_BMP[] = { + 0xC3, 0x0C, + 0xC3, 0x0C, + 0xC3, 0x0C, + 0x63, 0x18, + 0x67, 0x98, + 0x67, 0x98, + 0x34, 0xB0, + 0x3C, 0xF0, + 0x3C, 0xF0, + 0x18, 0x60, + 0x18, 0x60, + 0x18, 0x60 +}; + +static const uint8_t helvB12L1_0x58_BMP[] = { + 0xC1, 0x80, + 0xE3, 0x80, + 0x63, 0x00, + 0x36, 0x00, + 0x3E, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x3E, 0x00, + 0x36, 0x00, + 0x63, 0x00, + 0xE3, 0x80, + 0xC1, 0x80 +}; + +static const uint8_t helvB12L1_0x59_BMP[] = { + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x61, 0x80, + 0x33, 0x00, + 0x33, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00 +}; + +static const uint8_t helvB12L1_0x5A_BMP[] = { + 0xFF, + 0xFF, + 0x07, + 0x06, + 0x0C, + 0x1C, + 0x38, + 0x30, + 0x60, + 0xE0, + 0xFF, + 0xFF +}; + +static const uint8_t helvB12L1_0x5B_BMP[] = { + 0xF0, + 0xF0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xF0, + 0xF0 +}; + +static const uint8_t helvB12L1_0x5C_BMP[] = { + 0x80, + 0x80, + 0xC0, + 0x40, + 0x40, + 0x60, + 0x20, + 0x20, + 0x30, + 0x10, + 0x10, + 0x10 +}; + +static const uint8_t helvB12L1_0x5D_BMP[] = { + 0xF0, + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xF0, + 0xF0 +}; + +static const uint8_t helvB12L1_0x5E_BMP[] = { + 0x18, + 0x18, + 0x3C, + 0x66, + 0x66, + 0xC3, + 0xC3 +}; + +static const uint8_t helvB12L1_0x5F_BMP[] = { + 0xFF, 0x80 +}; + +static const uint8_t helvB12L1_0x60_BMP[] = { + 0x80, + 0xC0, + 0x20 +}; + +static const uint8_t helvB12L1_0x61_BMP[] = { + 0x7C, + 0xFE, + 0xC6, + 0x0E, + 0x7E, + 0xE6, + 0xC6, + 0xFE, + 0x77 +}; + +static const uint8_t helvB12L1_0x62_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xDC, + 0xFE, + 0xE7, + 0xC3, + 0xC3, + 0xC3, + 0xE7, + 0xFE, + 0xDC +}; + +static const uint8_t helvB12L1_0x63_BMP[] = { + 0x3C, + 0x7E, + 0xE7, + 0xC0, + 0xC0, + 0xC0, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t helvB12L1_0x64_BMP[] = { + 0x03, + 0x03, + 0x03, + 0x3F, + 0x7F, + 0xE7, + 0xC3, + 0xC3, + 0xC3, + 0xE7, + 0x7F, + 0x3B +}; + +static const uint8_t helvB12L1_0x65_BMP[] = { + 0x3C, + 0x7E, + 0xC3, + 0xFF, + 0xFF, + 0xC0, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t helvB12L1_0x66_BMP[] = { + 0x30, + 0x70, + 0x60, + 0xF0, + 0xF0, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvB12L1_0x67_BMP[] = { + 0x3B, + 0x7F, + 0xE7, + 0xC3, + 0xC3, + 0xC3, + 0xE7, + 0x7F, + 0x3B, + 0x03, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t helvB12L1_0x68_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xDE, + 0xFF, + 0xE3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3 +}; + +static const uint8_t helvB12L1_0x69_BMP[] = { + 0xC0, + 0xC0, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB12L1_0x6A_BMP[] = { + 0x60, + 0x60, + 0x00, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0xE0, + 0xC0 +}; + +static const uint8_t helvB12L1_0x6B_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC7, + 0xCE, + 0xDC, + 0xF8, + 0xFC, + 0xEC, + 0xCE, + 0xC6, + 0xC7 +}; + +static const uint8_t helvB12L1_0x6C_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB12L1_0x6D_BMP[] = { + 0xDE, 0xE0, + 0xFF, 0xF0, + 0xE7, 0x30, + 0xC6, 0x30, + 0xC6, 0x30, + 0xC6, 0x30, + 0xC6, 0x30, + 0xC6, 0x30, + 0xC6, 0x30 +}; + +static const uint8_t helvB12L1_0x6E_BMP[] = { + 0xDE, + 0xFF, + 0xE3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3 +}; + +static const uint8_t helvB12L1_0x6F_BMP[] = { + 0x3C, + 0x7E, + 0xE7, + 0xC3, + 0xC3, + 0xC3, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t helvB12L1_0x70_BMP[] = { + 0xDC, + 0xFE, + 0xE7, + 0xC3, + 0xC3, + 0xC3, + 0xE7, + 0xFE, + 0xDC, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB12L1_0x71_BMP[] = { + 0x3B, + 0x7F, + 0xE7, + 0xC3, + 0xC3, + 0xC3, + 0xE7, + 0x7F, + 0x3B, + 0x03, + 0x03, + 0x03, + 0x03 +}; + +static const uint8_t helvB12L1_0x72_BMP[] = { + 0xD8, + 0xF8, + 0xE0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB12L1_0x73_BMP[] = { + 0x7C, + 0xFE, + 0xC6, + 0xF0, + 0x7C, + 0x0E, + 0xC6, + 0xFE, + 0x7C +}; + +static const uint8_t helvB12L1_0x74_BMP[] = { + 0x60, + 0x60, + 0xF0, + 0xF0, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x70, + 0x30 +}; + +static const uint8_t helvB12L1_0x75_BMP[] = { + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC7, + 0xFF, + 0x7B +}; + +static const uint8_t helvB12L1_0x76_BMP[] = { + 0xC3, + 0xC3, + 0x66, + 0x66, + 0x66, + 0x3C, + 0x3C, + 0x18, + 0x18 +}; + +static const uint8_t helvB12L1_0x77_BMP[] = { + 0xC6, 0x30, + 0xC6, 0x30, + 0x66, 0x60, + 0x66, 0x60, + 0x6F, 0x60, + 0x3F, 0xC0, + 0x39, 0xC0, + 0x19, 0x80, + 0x19, 0x80 +}; + +static const uint8_t helvB12L1_0x78_BMP[] = { + 0xC6, + 0xC6, + 0x6C, + 0x7C, + 0x38, + 0x7C, + 0x6C, + 0xC6, + 0xC6 +}; + +static const uint8_t helvB12L1_0x79_BMP[] = { + 0xC3, + 0xC3, + 0x63, + 0x66, + 0x36, + 0x36, + 0x3C, + 0x1C, + 0x18, + 0x18, + 0x18, + 0x70, + 0x60 +}; + +static const uint8_t helvB12L1_0x7A_BMP[] = { + 0xFE, + 0xFE, + 0x0E, + 0x1C, + 0x18, + 0x38, + 0x70, + 0xFE, + 0xFE +}; + +static const uint8_t helvB12L1_0x7B_BMP[] = { + 0x30, + 0x70, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0xC0, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x70, + 0x30 +}; + +static const uint8_t helvB12L1_0x7C_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvB12L1_0x7D_BMP[] = { + 0xC0, + 0xE0, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x30, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0xE0, + 0xC0 +}; + +static const uint8_t helvB12L1_0x7E_BMP[] = { + 0x71, + 0x99, + 0x8E +}; + +static const uint8_t helvB12L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t helvB12L1_0xA1_BMP[] = { + 0xC0, + 0xC0, + 0x00, + 0x40, + 0x40, + 0x40, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB12L1_0xA2_BMP[] = { + 0x04, + 0x3C, + 0x7E, + 0xEF, + 0xC8, + 0xD8, + 0xD0, + 0xF7, + 0x7E, + 0x3C, + 0x20 +}; + +static const uint8_t helvB12L1_0xA3_BMP[] = { + 0x1C, + 0x3E, + 0x63, + 0x63, + 0x60, + 0x30, + 0x7C, + 0x30, + 0x30, + 0x20, + 0x7F, + 0xFF +}; + +static const uint8_t helvB12L1_0xA4_BMP[] = { + 0xBA, + 0x7C, + 0xC6, + 0xC6, + 0xC6, + 0x7C, + 0xBA +}; + +static const uint8_t helvB12L1_0xA5_BMP[] = { + 0xC3, + 0xC3, + 0x66, + 0x66, + 0x3C, + 0x18, + 0x7E, + 0x18, + 0x7E, + 0x18, + 0x18, + 0x18 +}; + +static const uint8_t helvB12L1_0xA6_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x00, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvB12L1_0xA7_BMP[] = { + 0x3C, + 0x7E, + 0x66, + 0x60, + 0x78, + 0x7E, + 0xC7, + 0xC3, + 0xF3, + 0x7E, + 0x1E, + 0x06, + 0x66, + 0x7E, + 0x3C +}; + +static const uint8_t helvB12L1_0xA8_BMP[] = { + 0xD8, + 0xD8 +}; + +static const uint8_t helvB12L1_0xA9_BMP[] = { + 0x0F, 0x00, + 0x39, 0xC0, + 0x60, 0x60, + 0x4F, 0x20, + 0xD9, 0xB0, + 0x90, 0x10, + 0x90, 0x10, + 0xD9, 0xB0, + 0x4F, 0x20, + 0x60, 0x20, + 0x39, 0xC0, + 0x0F, 0x00 +}; + +static const uint8_t helvB12L1_0xAA_BMP[] = { + 0x60, + 0x90, + 0x70, + 0x90, + 0x78, + 0x00, + 0xF8 +}; + +static const uint8_t helvB12L1_0xAB_BMP[] = { + 0x33, + 0x66, + 0xCC, + 0xCC, + 0x66, + 0x33 +}; + +static const uint8_t helvB12L1_0xAC_BMP[] = { + 0xFF, + 0xFF, + 0x03, + 0x03, + 0x03 +}; + +static const uint8_t helvB12L1_0xAD_BMP[] = { + 0xF0, + 0xF0 +}; + +static const uint8_t helvB12L1_0xAE_BMP[] = { + 0x0F, 0x00, + 0x39, 0xC0, + 0x60, 0x60, + 0x5F, 0x20, + 0xD9, 0xB0, + 0x99, 0x90, + 0x9E, 0x10, + 0xDB, 0x30, + 0x5B, 0x20, + 0x60, 0x60, + 0x39, 0xC0, + 0x0F, 0x00 +}; + +static const uint8_t helvB12L1_0xAF_BMP[] = { + 0xF8 +}; + +static const uint8_t helvB12L1_0xB0_BMP[] = { + 0x60, + 0x90, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t helvB12L1_0xB1_BMP[] = { + 0x18, + 0x18, + 0x18, + 0xFF, + 0xFF, + 0x18, + 0x18, + 0x18, + 0x00, + 0xFF, + 0xFF +}; + +static const uint8_t helvB12L1_0xB2_BMP[] = { + 0x70, + 0xD8, + 0xD8, + 0x30, + 0x60, + 0xF8, + 0xF8 +}; + +static const uint8_t helvB12L1_0xB3_BMP[] = { + 0x70, + 0xD8, + 0x18, + 0x30, + 0x18, + 0xD8, + 0x70 +}; + +static const uint8_t helvB12L1_0xB4_BMP[] = { + 0x20, + 0x60, + 0x80 +}; + +static const uint8_t helvB12L1_0xB5_BMP[] = { + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC7, + 0xFF, + 0xFB, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB12L1_0xB6_BMP[] = { + 0x7F, + 0xF2, + 0xF2, + 0xF2, + 0xF2, + 0xF2, + 0x72, + 0x12, + 0x12, + 0x12, + 0x12, + 0x12, + 0x12, + 0x12, + 0x12 +}; + +static const uint8_t helvB12L1_0xB7_BMP[] = { + 0xC0, + 0xC0 +}; + +static const uint8_t helvB12L1_0xB8_BMP[] = { + 0x20, + 0x30, + 0x98, + 0x70 +}; + +static const uint8_t helvB12L1_0xB9_BMP[] = { + 0x30, + 0xF0, + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30 +}; + +static const uint8_t helvB12L1_0xBA_BMP[] = { + 0x70, + 0xD8, + 0x88, + 0xD8, + 0x70, + 0x00, + 0xF8 +}; + +static const uint8_t helvB12L1_0xBB_BMP[] = { + 0xCC, + 0x66, + 0x33, + 0x33, + 0x66, + 0xCC +}; + +static const uint8_t helvB12L1_0xBC_BMP[] = { + 0x30, 0xC0, + 0xF0, 0x80, + 0xF1, 0x80, + 0x31, 0x00, + 0x33, 0x30, + 0x32, 0x70, + 0x36, 0xF0, + 0x04, 0xB0, + 0x0D, 0xB0, + 0x09, 0xF8, + 0x18, 0x30, + 0x10, 0x30 +}; + +static const uint8_t helvB12L1_0xBD_BMP[] = { + 0x30, 0x80, + 0xF1, 0x80, + 0xF1, 0x00, + 0x33, 0x00, + 0x32, 0x00, + 0x36, 0xE0, + 0x35, 0xB0, + 0x0D, 0xB0, + 0x08, 0x60, + 0x18, 0xC0, + 0x11, 0xF0, + 0x31, 0xF0 +}; + +static const uint8_t helvB12L1_0xBE_BMP[] = { + 0x70, 0x40, + 0xD8, 0xC0, + 0x18, 0x80, + 0x31, 0x80, + 0x19, 0x30, + 0xDB, 0x70, + 0x72, 0xF0, + 0x06, 0xB0, + 0x05, 0xB0, + 0x0D, 0xF8, + 0x08, 0x30, + 0x18, 0x30 +}; + +static const uint8_t helvB12L1_0xBF_BMP[] = { + 0x30, + 0x30, + 0x00, + 0x30, + 0x30, + 0x60, + 0xE0, + 0xC0, + 0xC6, + 0xC6, + 0xFE, + 0x7C +}; + +static const uint8_t helvB12L1_0xC0_BMP[] = { + 0x10, 0x00, + 0x18, 0x00, + 0x04, 0x00, + 0x00, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x1F, 0x00, + 0x1B, 0x00, + 0x3B, 0x80, + 0x31, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0x7F, 0xC0, + 0xFF, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60 +}; + +static const uint8_t helvB12L1_0xC1_BMP[] = { + 0x02, 0x00, + 0x06, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x1F, 0x00, + 0x1B, 0x00, + 0x3B, 0x80, + 0x31, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0x7F, 0xC0, + 0xFF, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60 +}; + +static const uint8_t helvB12L1_0xC2_BMP[] = { + 0x04, 0x00, + 0x0E, 0x00, + 0x11, 0x00, + 0x00, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x1F, 0x00, + 0x1B, 0x00, + 0x3B, 0x80, + 0x31, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0x7F, 0xC0, + 0xFF, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60 +}; + +static const uint8_t helvB12L1_0xC3_BMP[] = { + 0x0E, 0x80, + 0x17, 0x00, + 0x00, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x1F, 0x00, + 0x1B, 0x00, + 0x3B, 0x80, + 0x31, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0x7F, 0xC0, + 0xFF, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60 +}; + +static const uint8_t helvB12L1_0xC4_BMP[] = { + 0x31, 0x80, + 0x31, 0x80, + 0x00, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x1F, 0x00, + 0x1B, 0x00, + 0x3B, 0x80, + 0x31, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0x7F, 0xC0, + 0xFF, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60 +}; + +static const uint8_t helvB12L1_0xC5_BMP[] = { + 0x0C, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x0C, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x1F, 0x00, + 0x1B, 0x00, + 0x3B, 0x80, + 0x31, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0x7F, 0xC0, + 0xFF, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60 +}; + +static const uint8_t helvB12L1_0xC6_BMP[] = { + 0x1F, 0xFC, + 0x1F, 0xFC, + 0x1B, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x33, 0xF8, + 0x63, 0xF8, + 0x7F, 0x00, + 0x7F, 0x00, + 0xC3, 0x00, + 0xC3, 0xFC, + 0xC3, 0xFC +}; + +static const uint8_t helvB12L1_0xC7_BMP[] = { + 0x1F, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xE0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xE0, 0x00, + 0x60, 0xC0, + 0x71, 0xC0, + 0x3F, 0x80, + 0x1F, 0x00, + 0x04, 0x00, + 0x06, 0x00, + 0x13, 0x00, + 0x0E, 0x00 +}; + +static const uint8_t helvB12L1_0xC8_BMP[] = { + 0x20, + 0x30, + 0x08, + 0x00, + 0xFF, + 0xFF, + 0xC0, + 0xC0, + 0xC0, + 0xFE, + 0xFE, + 0xC0, + 0xC0, + 0xC0, + 0xFF, + 0xFF +}; + +static const uint8_t helvB12L1_0xC9_BMP[] = { + 0x04, + 0x0C, + 0x10, + 0x00, + 0xFF, + 0xFF, + 0xC0, + 0xC0, + 0xC0, + 0xFE, + 0xFE, + 0xC0, + 0xC0, + 0xC0, + 0xFF, + 0xFF +}; + +static const uint8_t helvB12L1_0xCA_BMP[] = { + 0x08, + 0x1C, + 0x22, + 0x00, + 0xFF, + 0xFF, + 0xC0, + 0xC0, + 0xC0, + 0xFE, + 0xFE, + 0xC0, + 0xC0, + 0xC0, + 0xFF, + 0xFF +}; + +static const uint8_t helvB12L1_0xCB_BMP[] = { + 0x66, + 0x66, + 0x00, + 0xFF, + 0xFF, + 0xC0, + 0xC0, + 0xC0, + 0xFE, + 0xFE, + 0xC0, + 0xC0, + 0xC0, + 0xFF, + 0xFF +}; + +static const uint8_t helvB12L1_0xCC_BMP[] = { + 0x80, + 0xC0, + 0x20, + 0x00, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvB12L1_0xCD_BMP[] = { + 0x20, + 0x60, + 0x80, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB12L1_0xCE_BMP[] = { + 0x20, + 0x70, + 0x88, + 0x00, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvB12L1_0xCF_BMP[] = { + 0xCC, + 0xCC, + 0x00, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30 +}; + +static const uint8_t helvB12L1_0xD0_BMP[] = { + 0x3F, 0x00, + 0x3F, 0xC0, + 0x30, 0xE0, + 0x30, 0x60, + 0x30, 0x70, + 0xFC, 0x30, + 0xFC, 0x30, + 0x30, 0x70, + 0x30, 0x60, + 0x30, 0xE0, + 0x3F, 0xC0, + 0x3F, 0x00 +}; + +static const uint8_t helvB12L1_0xD1_BMP[] = { + 0x1D, 0x00, + 0x2E, 0x00, + 0x00, 0x00, + 0xE0, 0xC0, + 0xF0, 0xC0, + 0xF0, 0xC0, + 0xD8, 0xC0, + 0xD8, 0xC0, + 0xCC, 0xC0, + 0xCC, 0xC0, + 0xC6, 0xC0, + 0xC6, 0xC0, + 0xC3, 0xC0, + 0xC3, 0xC0, + 0xC1, 0xC0 +}; + +static const uint8_t helvB12L1_0xD2_BMP[] = { + 0x08, 0x00, + 0x0C, 0x00, + 0x02, 0x00, + 0x00, 0x00, + 0x1F, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xE0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0xE0, + 0x60, 0xC0, + 0x71, 0xC0, + 0x3F, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t helvB12L1_0xD3_BMP[] = { + 0x01, 0x00, + 0x03, 0x00, + 0x04, 0x00, + 0x00, 0x00, + 0x1F, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xE0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0xE0, + 0x60, 0xC0, + 0x71, 0xC0, + 0x3F, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t helvB12L1_0xD4_BMP[] = { + 0x04, 0x00, + 0x0E, 0x00, + 0x11, 0x00, + 0x00, 0x00, + 0x1F, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xE0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0xE0, + 0x60, 0xC0, + 0x71, 0xC0, + 0x3F, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t helvB12L1_0xD5_BMP[] = { + 0x0E, 0x80, + 0x17, 0x00, + 0x00, 0x00, + 0x1F, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xE0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0xE0, + 0x60, 0xC0, + 0x71, 0xC0, + 0x3F, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t helvB12L1_0xD6_BMP[] = { + 0x19, 0x80, + 0x19, 0x80, + 0x00, 0x00, + 0x1F, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xE0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0xE0, + 0x60, 0xC0, + 0x71, 0xC0, + 0x3F, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t helvB12L1_0xD7_BMP[] = { + 0x41, 0x00, + 0xE3, 0x80, + 0x77, 0x00, + 0x3E, 0x00, + 0x1C, 0x00, + 0x3E, 0x00, + 0x77, 0x00, + 0xE3, 0x80, + 0x41, 0x00 +}; + +static const uint8_t helvB12L1_0xD8_BMP[] = { + 0x1F, 0x20, + 0x3F, 0xC0, + 0x70, 0xC0, + 0x61, 0xC0, + 0xE3, 0x60, + 0xC6, 0x60, + 0xCC, 0x60, + 0xD8, 0xE0, + 0x70, 0xC0, + 0x61, 0xC0, + 0x7F, 0x80, + 0x9F, 0x00 +}; + +static const uint8_t helvB12L1_0xD9_BMP[] = { + 0x10, 0x00, + 0x18, 0x00, + 0x04, 0x00, + 0x00, 0x00, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x7F, 0x80, + 0x3F, 0x00 +}; + +static const uint8_t helvB12L1_0xDA_BMP[] = { + 0x02, 0x00, + 0x06, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x7F, 0x80, + 0x3F, 0x00 +}; + +static const uint8_t helvB12L1_0xDB_BMP[] = { + 0x04, 0x00, + 0x0E, 0x00, + 0x11, 0x00, + 0x00, 0x00, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x7F, 0x80, + 0x3F, 0x00 +}; + +static const uint8_t helvB12L1_0xDC_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x7F, 0x80, + 0x3F, 0x00 +}; + +static const uint8_t helvB12L1_0xDD_BMP[] = { + 0x02, 0x00, + 0x06, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x61, 0x80, + 0x33, 0x00, + 0x33, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00 +}; + +static const uint8_t helvB12L1_0xDE_BMP[] = { + 0xC0, 0x00, + 0xFE, 0x00, + 0xFF, 0x00, + 0xC3, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC3, 0x80, + 0xFF, 0x00, + 0xFE, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t helvB12L1_0xDF_BMP[] = { + 0x7C, + 0xFE, + 0xC6, + 0xC6, + 0xDC, + 0xDE, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xDE, + 0xDC +}; + +static const uint8_t helvB12L1_0xE0_BMP[] = { + 0x20, + 0x30, + 0x08, + 0x00, + 0x7C, + 0xFE, + 0xC6, + 0x0E, + 0x7E, + 0xE6, + 0xC6, + 0xFE, + 0x77 +}; + +static const uint8_t helvB12L1_0xE1_BMP[] = { + 0x04, + 0x0C, + 0x10, + 0x00, + 0x7C, + 0xFE, + 0xC6, + 0x0E, + 0x7E, + 0xE6, + 0xC6, + 0xFE, + 0x77 +}; + +static const uint8_t helvB12L1_0xE2_BMP[] = { + 0x10, + 0x38, + 0x44, + 0x00, + 0x7C, + 0xFE, + 0xC6, + 0x0E, + 0x7E, + 0xE6, + 0xC6, + 0xFE, + 0x77 +}; + +static const uint8_t helvB12L1_0xE3_BMP[] = { + 0x3A, + 0x5C, + 0x00, + 0x7C, + 0xFE, + 0xC6, + 0x0E, + 0x7E, + 0xE6, + 0xC6, + 0xFE, + 0x77 +}; + +static const uint8_t helvB12L1_0xE4_BMP[] = { + 0x6C, + 0x6C, + 0x00, + 0x7C, + 0xFE, + 0xC6, + 0x0E, + 0x7E, + 0xE6, + 0xC6, + 0xFE, + 0x77 +}; + +static const uint8_t helvB12L1_0xE5_BMP[] = { + 0x18, + 0x24, + 0x24, + 0x18, + 0x7C, + 0xFE, + 0xC6, + 0x0E, + 0x7E, + 0xE6, + 0xC6, + 0xFE, + 0x77 +}; + +static const uint8_t helvB12L1_0xE6_BMP[] = { + 0x7D, 0xE0, + 0xFF, 0xF0, + 0xC6, 0x18, + 0x0F, 0xF8, + 0x7F, 0xF8, + 0xE6, 0x00, + 0xCF, 0x38, + 0xFF, 0xF0, + 0x79, 0xE0 +}; + +static const uint8_t helvB12L1_0xE7_BMP[] = { + 0x3C, + 0x7E, + 0xE7, + 0xC0, + 0xC0, + 0xC0, + 0xE7, + 0x7E, + 0x3C, + 0x10, + 0x18, + 0x4C, + 0x38 +}; + +static const uint8_t helvB12L1_0xE8_BMP[] = { + 0x20, + 0x30, + 0x08, + 0x00, + 0x3C, + 0x7E, + 0xC3, + 0xFF, + 0xFF, + 0xC0, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t helvB12L1_0xE9_BMP[] = { + 0x04, + 0x0C, + 0x10, + 0x00, + 0x3C, + 0x7E, + 0xC3, + 0xFF, + 0xFF, + 0xC0, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t helvB12L1_0xEA_BMP[] = { + 0x08, + 0x1C, + 0x22, + 0x00, + 0x3C, + 0x7E, + 0xC3, + 0xFF, + 0xFF, + 0xC0, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t helvB12L1_0xEB_BMP[] = { + 0x36, + 0x36, + 0x00, + 0x3C, + 0x7E, + 0xC3, + 0xFF, + 0xFF, + 0xC0, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t helvB12L1_0xEC_BMP[] = { + 0x80, + 0xC0, + 0x20, + 0x00, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvB12L1_0xED_BMP[] = { + 0x20, + 0x60, + 0x80, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB12L1_0xEE_BMP[] = { + 0x20, + 0x70, + 0x88, + 0x00, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvB12L1_0xEF_BMP[] = { + 0xD8, + 0xD8, + 0x00, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvB12L1_0xF0_BMP[] = { + 0x60, + 0x7C, + 0xF8, + 0x1C, + 0x7E, + 0xE7, + 0xC3, + 0xC3, + 0xC3, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t helvB12L1_0xF1_BMP[] = { + 0x3A, + 0x5C, + 0x00, + 0xDE, + 0xFF, + 0xE3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3 +}; + +static const uint8_t helvB12L1_0xF2_BMP[] = { + 0x20, + 0x30, + 0x08, + 0x00, + 0x3C, + 0x7E, + 0xE7, + 0xC3, + 0xC3, + 0xC3, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t helvB12L1_0xF3_BMP[] = { + 0x08, + 0x18, + 0x20, + 0x00, + 0x3C, + 0x7E, + 0xE7, + 0xC3, + 0xC3, + 0xC3, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t helvB12L1_0xF4_BMP[] = { + 0x10, + 0x38, + 0x44, + 0x00, + 0x3C, + 0x7E, + 0xE7, + 0xC3, + 0xC3, + 0xC3, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t helvB12L1_0xF5_BMP[] = { + 0x3A, + 0x5C, + 0x00, + 0x3C, + 0x7E, + 0xE7, + 0xC3, + 0xC3, + 0xC3, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t helvB12L1_0xF6_BMP[] = { + 0x6C, + 0x6C, + 0x00, + 0x3C, + 0x7E, + 0xE7, + 0xC3, + 0xC3, + 0xC3, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t helvB12L1_0xF7_BMP[] = { + 0x18, + 0x18, + 0x00, + 0xFF, + 0xFF, + 0x00, + 0x18, + 0x18 +}; + +static const uint8_t helvB12L1_0xF8_BMP[] = { + 0x3D, + 0x7F, + 0xE7, + 0xCF, + 0xDB, + 0xF3, + 0xE7, + 0xFE, + 0xBC +}; + +static const uint8_t helvB12L1_0xF9_BMP[] = { + 0x20, + 0x30, + 0x08, + 0x00, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC7, + 0xFF, + 0x7B +}; + +static const uint8_t helvB12L1_0xFA_BMP[] = { + 0x08, + 0x18, + 0x20, + 0x00, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC7, + 0xFF, + 0x7B +}; + +static const uint8_t helvB12L1_0xFB_BMP[] = { + 0x10, + 0x38, + 0x44, + 0x00, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC7, + 0xFF, + 0x7B +}; + +static const uint8_t helvB12L1_0xFC_BMP[] = { + 0x6C, + 0x6C, + 0x00, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC7, + 0xFF, + 0x7B +}; + +static const uint8_t helvB12L1_0xFD_BMP[] = { + 0x04, + 0x0C, + 0x10, + 0x00, + 0xC3, + 0xC3, + 0x63, + 0x66, + 0x36, + 0x36, + 0x3C, + 0x1C, + 0x18, + 0x18, + 0x18, + 0x70, + 0x60 +}; + +static const uint8_t helvB12L1_0xFE_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xDC, + 0xFE, + 0xE7, + 0xC3, + 0xC3, + 0xC3, + 0xE7, + 0xFE, + 0xDC, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB12L1_0xFF_BMP[] = { + 0x36, + 0x36, + 0x00, + 0xC3, + 0xC3, + 0x63, + 0x66, + 0x36, + 0x36, + 0x3C, + 0x1C, + 0x18, + 0x18, + 0x18, + 0x70, + 0x60 +}; + +static const GFONT_CharInfo FontBMP[] = { + {12, 9, 11, 1, 0, helvB12L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {5, 1, 1, 0, 0, helvB12L1_0x20_BMP}, + {6, 2, 12, 2, 0, helvB12L1_0x21_BMP}, + {8, 5, 4, 1, 8, helvB12L1_0x22_BMP}, + {9, 9, 12, 0, 0, helvB12L1_0x23_BMP}, + {9, 7, 14, 1, -1, helvB12L1_0x24_BMP}, + {14, 13, 12, 0, 0, helvB12L1_0x25_BMP}, + {12, 10, 12, 1, 0, helvB12L1_0x26_BMP}, + {4, 2, 4, 1, 8, helvB12L1_0x27_BMP}, + {6, 4, 15, 1, -3, helvB12L1_0x28_BMP}, + {6, 4, 15, 0, -3, helvB12L1_0x29_BMP}, + {6, 5, 5, 0, 7, helvB12L1_0x2A_BMP}, + {10, 8, 8, 1, 0, helvB12L1_0x2B_BMP}, + {4, 2, 5, 1, -3, helvB12L1_0x2C_BMP}, + {5, 4, 2, 0, 3, helvB12L1_0x2D_BMP}, + {4, 2, 2, 1, 0, helvB12L1_0x2E_BMP}, + {5, 4, 12, 0, 0, helvB12L1_0x2F_BMP}, + {9, 8, 12, 0, 0, helvB12L1_0x30_BMP}, + {9, 5, 12, 1, 0, helvB12L1_0x31_BMP}, + {9, 8, 12, 0, 0, helvB12L1_0x32_BMP}, + {9, 8, 12, 0, 0, helvB12L1_0x33_BMP}, + {9, 8, 12, 0, 0, helvB12L1_0x34_BMP}, + {9, 8, 12, 0, 0, helvB12L1_0x35_BMP}, + {9, 8, 12, 0, 0, helvB12L1_0x36_BMP}, + {9, 8, 12, 0, 0, helvB12L1_0x37_BMP}, + {9, 8, 12, 0, 0, helvB12L1_0x38_BMP}, + {9, 8, 12, 0, 0, helvB12L1_0x39_BMP}, + {5, 2, 8, 2, 0, helvB12L1_0x3A_BMP}, + {5, 2, 11, 2, -3, helvB12L1_0x3B_BMP}, + {10, 8, 8, 1, 0, helvB12L1_0x3C_BMP}, + {10, 8, 6, 1, 1, helvB12L1_0x3D_BMP}, + {10, 8, 8, 1, 0, helvB12L1_0x3E_BMP}, + {10, 7, 12, 1, 0, helvB12L1_0x3F_BMP}, + {16, 13, 14, 1, -2, helvB12L1_0x40_BMP}, + {12, 11, 12, 0, 0, helvB12L1_0x41_BMP}, + {11, 9, 12, 1, 0, helvB12L1_0x42_BMP}, + {12, 10, 12, 1, 0, helvB12L1_0x43_BMP}, + {12, 10, 12, 1, 0, helvB12L1_0x44_BMP}, + {10, 8, 12, 1, 0, helvB12L1_0x45_BMP}, + {10, 8, 12, 1, 0, helvB12L1_0x46_BMP}, + {12, 10, 12, 1, 0, helvB12L1_0x47_BMP}, + {12, 10, 12, 1, 0, helvB12L1_0x48_BMP}, + {4, 2, 12, 1, 0, helvB12L1_0x49_BMP}, + {9, 7, 12, 1, 0, helvB12L1_0x4A_BMP}, + {12, 11, 12, 1, 0, helvB12L1_0x4B_BMP}, + {10, 8, 12, 1, 0, helvB12L1_0x4C_BMP}, + {13, 11, 12, 1, 0, helvB12L1_0x4D_BMP}, + {12, 10, 12, 1, 0, helvB12L1_0x4E_BMP}, + {13, 11, 12, 1, 0, helvB12L1_0x4F_BMP}, + {11, 9, 12, 1, 0, helvB12L1_0x50_BMP}, + {13, 11, 13, 1, -1, helvB12L1_0x51_BMP}, + {12, 10, 12, 1, 0, helvB12L1_0x52_BMP}, + {11, 9, 12, 1, 0, helvB12L1_0x53_BMP}, + {10, 10, 12, 0, 0, helvB12L1_0x54_BMP}, + {12, 10, 12, 1, 0, helvB12L1_0x55_BMP}, + {11, 10, 12, 0, 0, helvB12L1_0x56_BMP}, + {15, 14, 12, 0, 0, helvB12L1_0x57_BMP}, + {11, 9, 12, 1, 0, helvB12L1_0x58_BMP}, + {11, 10, 12, 0, 0, helvB12L1_0x59_BMP}, + {10, 8, 12, 1, 0, helvB12L1_0x5A_BMP}, + {6, 4, 15, 1, -3, helvB12L1_0x5B_BMP}, + {5, 4, 12, 0, 0, helvB12L1_0x5C_BMP}, + {6, 4, 15, 0, -3, helvB12L1_0x5D_BMP}, + {10, 8, 7, 1, 5, helvB12L1_0x5E_BMP}, + {9, 9, 1, 0, -3, helvB12L1_0x5F_BMP}, + {6, 3, 3, 2, 10, helvB12L1_0x60_BMP}, + {9, 8, 9, 1, 0, helvB12L1_0x61_BMP}, + {10, 8, 12, 1, 0, helvB12L1_0x62_BMP}, + {9, 8, 9, 1, 0, helvB12L1_0x63_BMP}, + {10, 8, 12, 1, 0, helvB12L1_0x64_BMP}, + {10, 8, 9, 1, 0, helvB12L1_0x65_BMP}, + {6, 4, 12, 1, 0, helvB12L1_0x66_BMP}, + {10, 8, 13, 1, -4, helvB12L1_0x67_BMP}, + {10, 8, 12, 1, 0, helvB12L1_0x68_BMP}, + {4, 2, 12, 1, 0, helvB12L1_0x69_BMP}, + {5, 3, 16, 1, -4, helvB12L1_0x6A_BMP}, + {9, 8, 12, 1, 0, helvB12L1_0x6B_BMP}, + {4, 2, 12, 1, 0, helvB12L1_0x6C_BMP}, + {14, 12, 9, 1, 0, helvB12L1_0x6D_BMP}, + {10, 8, 9, 1, 0, helvB12L1_0x6E_BMP}, + {10, 8, 9, 1, 0, helvB12L1_0x6F_BMP}, + {10, 8, 13, 1, -4, helvB12L1_0x70_BMP}, + {10, 8, 13, 1, -4, helvB12L1_0x71_BMP}, + {6, 5, 9, 1, 0, helvB12L1_0x72_BMP}, + {9, 7, 9, 1, 0, helvB12L1_0x73_BMP}, + {6, 4, 11, 1, 0, helvB12L1_0x74_BMP}, + {10, 8, 9, 1, 0, helvB12L1_0x75_BMP}, + {9, 8, 9, 0, 0, helvB12L1_0x76_BMP}, + {13, 12, 9, 0, 0, helvB12L1_0x77_BMP}, + {9, 7, 9, 1, 0, helvB12L1_0x78_BMP}, + {9, 8, 13, 0, -4, helvB12L1_0x79_BMP}, + {8, 7, 9, 0, 0, helvB12L1_0x7A_BMP}, + {6, 4, 15, 1, -3, helvB12L1_0x7B_BMP}, + {4, 1, 16, 1, -4, helvB12L1_0x7C_BMP}, + {6, 4, 15, 1, -3, helvB12L1_0x7D_BMP}, + {10, 8, 3, 1, 3, helvB12L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {5, 1, 1, 0, 0, helvB12L1_0xA0_BMP}, + {6, 2, 12, 1, -3, helvB12L1_0xA1_BMP}, + {9, 8, 11, 0, -1, helvB12L1_0xA2_BMP}, + {9, 8, 12, 0, 0, helvB12L1_0xA3_BMP}, + {9, 7, 7, 1, 2, helvB12L1_0xA4_BMP}, + {9, 8, 12, 0, 0, helvB12L1_0xA5_BMP}, + {5, 1, 16, 2, -4, helvB12L1_0xA6_BMP}, + {9, 8, 15, 0, -3, helvB12L1_0xA7_BMP}, + {6, 5, 2, 0, 10, helvB12L1_0xA8_BMP}, + {12, 12, 12, 0, 0, helvB12L1_0xA9_BMP}, + {6, 5, 7, 1, 5, helvB12L1_0xAA_BMP}, + {9, 8, 6, 0, 2, helvB12L1_0xAB_BMP}, + {10, 8, 5, 0, 2, helvB12L1_0xAC_BMP}, + {5, 4, 2, 0, 3, helvB12L1_0xAD_BMP}, + {12, 12, 12, 0, 0, helvB12L1_0xAE_BMP}, + {6, 5, 1, 0, 10, helvB12L1_0xAF_BMP}, + {7, 4, 5, 1, 7, helvB12L1_0xB0_BMP}, + {10, 8, 11, 1, 0, helvB12L1_0xB1_BMP}, + {6, 5, 7, 0, 5, helvB12L1_0xB2_BMP}, + {6, 5, 7, 0, 5, helvB12L1_0xB3_BMP}, + {6, 3, 3, 1, 10, helvB12L1_0xB4_BMP}, + {10, 8, 12, 1, -3, helvB12L1_0xB5_BMP}, + {9, 8, 15, 0, -3, helvB12L1_0xB6_BMP}, + {5, 2, 2, 1, 4, helvB12L1_0xB7_BMP}, + {6, 5, 4, 0, -4, helvB12L1_0xB8_BMP}, + {6, 4, 7, 1, 5, helvB12L1_0xB9_BMP}, + {6, 5, 7, 0, 5, helvB12L1_0xBA_BMP}, + {9, 8, 6, 1, 2, helvB12L1_0xBB_BMP}, + {14, 13, 12, 1, 0, helvB12L1_0xBC_BMP}, + {14, 12, 12, 0, 0, helvB12L1_0xBD_BMP}, + {14, 13, 12, 0, 0, helvB12L1_0xBE_BMP}, + {10, 7, 12, 1, -3, helvB12L1_0xBF_BMP}, + {12, 11, 16, 0, 0, helvB12L1_0xC0_BMP}, + {12, 11, 16, 0, 0, helvB12L1_0xC1_BMP}, + {12, 11, 16, 0, 0, helvB12L1_0xC2_BMP}, + {12, 11, 15, 0, 0, helvB12L1_0xC3_BMP}, + {12, 11, 15, 0, 0, helvB12L1_0xC4_BMP}, + {12, 11, 16, 0, 0, helvB12L1_0xC5_BMP}, + {15, 14, 12, 0, 0, helvB12L1_0xC6_BMP}, + {12, 10, 16, 1, -4, helvB12L1_0xC7_BMP}, + {10, 8, 16, 1, 0, helvB12L1_0xC8_BMP}, + {10, 8, 16, 1, 0, helvB12L1_0xC9_BMP}, + {10, 8, 16, 1, 0, helvB12L1_0xCA_BMP}, + {10, 8, 15, 1, 0, helvB12L1_0xCB_BMP}, + {4, 3, 16, 0, 0, helvB12L1_0xCC_BMP}, + {4, 3, 16, 1, 0, helvB12L1_0xCD_BMP}, + {4, 5, 16, 0, 0, helvB12L1_0xCE_BMP}, + {4, 6, 15, -1, 0, helvB12L1_0xCF_BMP}, + {12, 12, 12, 0, 0, helvB12L1_0xD0_BMP}, + {12, 10, 15, 1, 0, helvB12L1_0xD1_BMP}, + {13, 11, 16, 1, 0, helvB12L1_0xD2_BMP}, + {13, 11, 16, 1, 0, helvB12L1_0xD3_BMP}, + {13, 11, 16, 1, 0, helvB12L1_0xD4_BMP}, + {13, 11, 15, 1, 0, helvB12L1_0xD5_BMP}, + {13, 11, 15, 1, 0, helvB12L1_0xD6_BMP}, + {10, 9, 9, 0, 0, helvB12L1_0xD7_BMP}, + {13, 11, 12, 1, 0, helvB12L1_0xD8_BMP}, + {12, 10, 16, 1, 0, helvB12L1_0xD9_BMP}, + {12, 10, 16, 1, 0, helvB12L1_0xDA_BMP}, + {12, 10, 16, 1, 0, helvB12L1_0xDB_BMP}, + {12, 10, 15, 1, 0, helvB12L1_0xDC_BMP}, + {11, 10, 16, 0, 0, helvB12L1_0xDD_BMP}, + {11, 9, 12, 1, 0, helvB12L1_0xDE_BMP}, + {10, 8, 12, 1, 0, helvB12L1_0xDF_BMP}, + {9, 8, 13, 1, 0, helvB12L1_0xE0_BMP}, + {9, 8, 13, 1, 0, helvB12L1_0xE1_BMP}, + {9, 8, 13, 1, 0, helvB12L1_0xE2_BMP}, + {9, 8, 12, 1, 0, helvB12L1_0xE3_BMP}, + {9, 8, 12, 1, 0, helvB12L1_0xE4_BMP}, + {9, 8, 13, 1, 0, helvB12L1_0xE5_BMP}, + {15, 13, 9, 1, 0, helvB12L1_0xE6_BMP}, + {9, 8, 13, 1, -4, helvB12L1_0xE7_BMP}, + {10, 8, 13, 1, 0, helvB12L1_0xE8_BMP}, + {10, 8, 13, 1, 0, helvB12L1_0xE9_BMP}, + {10, 8, 13, 1, 0, helvB12L1_0xEA_BMP}, + {10, 8, 12, 1, 0, helvB12L1_0xEB_BMP}, + {4, 3, 13, 0, 0, helvB12L1_0xEC_BMP}, + {4, 3, 13, 1, 0, helvB12L1_0xED_BMP}, + {4, 5, 13, 0, 0, helvB12L1_0xEE_BMP}, + {4, 5, 12, 0, 0, helvB12L1_0xEF_BMP}, + {10, 8, 12, 1, 0, helvB12L1_0xF0_BMP}, + {10, 8, 12, 1, 0, helvB12L1_0xF1_BMP}, + {10, 8, 13, 1, 0, helvB12L1_0xF2_BMP}, + {10, 8, 13, 1, 0, helvB12L1_0xF3_BMP}, + {10, 8, 13, 1, 0, helvB12L1_0xF4_BMP}, + {10, 8, 12, 1, 0, helvB12L1_0xF5_BMP}, + {10, 8, 12, 1, 0, helvB12L1_0xF6_BMP}, + {10, 8, 8, 1, 0, helvB12L1_0xF7_BMP}, + {10, 8, 9, 1, 0, helvB12L1_0xF8_BMP}, + {10, 8, 13, 1, 0, helvB12L1_0xF9_BMP}, + {10, 8, 13, 1, 0, helvB12L1_0xFA_BMP}, + {10, 8, 13, 1, 0, helvB12L1_0xFB_BMP}, + {10, 8, 12, 1, 0, helvB12L1_0xFC_BMP}, + {9, 8, 17, 0, -4, helvB12L1_0xFD_BMP}, + {10, 8, 16, 1, -4, helvB12L1_0xFE_BMP}, + {9, 8, 16, 0, -4, helvB12L1_0xFF_BMP} +}; + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontHelv12Bold_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontHelv12Bold_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontHelv12Bold_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontHelv12Bold_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontHelv12Bold_GetFontChar, + McuFontHelv12Bold_FBBy, + McuFontHelv12Bold_GetUnderlineBoxHeight(), + McuFontHelv12Bold_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv12Bold_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv12Bold_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv12Bold_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv12Bold_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontHelv12Bold. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv12Bold.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv12Bold.h new file mode 100644 index 0000000..74179bb --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv12Bold.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv12Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv12Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 12 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv12Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv12Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv12Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv12Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv12Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv12Bold_Deinit(void); +** Init - void McuFontHelv12Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv12Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv12Bold_module McuFontHelv12Bold module documentation +** @{ +*/ + + +#ifndef __McuFontHelv12Bold_H +#define __McuFontHelv12Bold_H + +/* MODULE McuFontHelv12Bold. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontHelv12Boldconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontHelv12Bold_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontHelv12Bold_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontHelv12Bold_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontHelv12Bold_GetLineSpaceHeight() \ + 2 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontHelv12Bold_GetUnderlineBoxHeight() \ + 3 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontHelv12Bold_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontHelv12Bold_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontHelv12Bold. */ + +#endif +/* ifndef __McuFontHelv12Bold_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv12Normal.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv12Normal.c new file mode 100644 index 0000000..1dba74f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv12Normal.c @@ -0,0 +1,3306 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv12Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv12Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 12 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv12Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv12Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv12Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv12Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv12Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv12Normal_Deinit(void); +** Init - void McuFontHelv12Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv12Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv12Normal_module McuFontHelv12Normal module documentation +** @{ +*/ + +/* MODULE McuFontHelv12Normal. */ + +#include "McuFontHelv12Normal.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontHelv12Normal_FBBy 18 + +static const uint8_t helvR12L1_0x00_BMP[] = { + 0xAA, 0x80, + 0x00, 0x00, + 0x80, 0x80, + 0x00, 0x00, + 0x80, 0x80, + 0x00, 0x00, + 0x80, 0x80, + 0x00, 0x00, + 0x80, 0x80, + 0x00, 0x00, + 0xAA, 0x80 +}; + +static const uint8_t helvR12L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t helvR12L1_0x21_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x00, + 0x80, + 0x80 +}; + +static const uint8_t helvR12L1_0x22_BMP[] = { + 0x90, + 0x90, + 0x90, + 0x90 +}; + +static const uint8_t helvR12L1_0x23_BMP[] = { + 0x12, + 0x12, + 0x12, + 0x7F, + 0x24, + 0x24, + 0x24, + 0xFE, + 0x48, + 0x48, + 0x48 +}; + +static const uint8_t helvR12L1_0x24_BMP[] = { + 0x10, + 0x7C, + 0x92, + 0x92, + 0x90, + 0x50, + 0x30, + 0x18, + 0x14, + 0x12, + 0x92, + 0x92, + 0x7C, + 0x10, + 0x10 +}; + +static const uint8_t helvR12L1_0x25_BMP[] = { + 0x70, 0x40, + 0x88, 0x80, + 0x88, 0x80, + 0x89, 0x00, + 0x72, 0x00, + 0x02, 0x00, + 0x04, 0x00, + 0x04, 0xE0, + 0x09, 0x10, + 0x11, 0x10, + 0x11, 0x10, + 0x20, 0xE0 +}; + +static const uint8_t helvR12L1_0x26_BMP[] = { + 0x18, 0x00, + 0x24, 0x00, + 0x42, 0x00, + 0x42, 0x00, + 0x24, 0x00, + 0x18, 0x00, + 0x29, 0x00, + 0x45, 0x00, + 0x82, 0x00, + 0x83, 0x00, + 0x44, 0x80, + 0x38, 0x40 +}; + +static const uint8_t helvR12L1_0x27_BMP[] = { + 0xC0, + 0xC0, + 0x40, + 0x40 +}; + +static const uint8_t helvR12L1_0x28_BMP[] = { + 0x20, + 0x40, + 0x40, + 0x40, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x40, + 0x40, + 0x40, + 0x20 +}; + +static const uint8_t helvR12L1_0x29_BMP[] = { + 0x80, + 0x40, + 0x40, + 0x40, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x40, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t helvR12L1_0x2A_BMP[] = { + 0x20, + 0xA8, + 0x70, + 0x50, + 0x88 +}; + +static const uint8_t helvR12L1_0x2B_BMP[] = { + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0xFF, 0x80, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00 +}; + +static const uint8_t helvR12L1_0x2C_BMP[] = { + 0x40, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t helvR12L1_0x2D_BMP[] = { + 0xF0 +}; + +static const uint8_t helvR12L1_0x2E_BMP[] = { + 0x80, + 0x80 +}; + +static const uint8_t helvR12L1_0x2F_BMP[] = { + 0x10, + 0x10, + 0x20, + 0x20, + 0x20, + 0x20, + 0x40, + 0x40, + 0x40, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR12L1_0x30_BMP[] = { + 0x38, + 0x44, + 0x44, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x44, + 0x44, + 0x38 +}; + +static const uint8_t helvR12L1_0x31_BMP[] = { + 0x20, + 0x20, + 0x60, + 0xA0, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20 +}; + +static const uint8_t helvR12L1_0x32_BMP[] = { + 0x38, + 0x44, + 0x82, + 0x82, + 0x02, + 0x04, + 0x08, + 0x30, + 0x40, + 0x80, + 0x80, + 0xFE +}; + +static const uint8_t helvR12L1_0x33_BMP[] = { + 0x38, + 0x44, + 0x82, + 0x82, + 0x04, + 0x38, + 0x04, + 0x02, + 0x82, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t helvR12L1_0x34_BMP[] = { + 0x0C, + 0x14, + 0x14, + 0x24, + 0x24, + 0x44, + 0x44, + 0x84, + 0xFF, + 0x04, + 0x04, + 0x04 +}; + +static const uint8_t helvR12L1_0x35_BMP[] = { + 0x3E, + 0x20, + 0x20, + 0x40, + 0x78, + 0x44, + 0x02, + 0x02, + 0x02, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t helvR12L1_0x36_BMP[] = { + 0x3C, + 0x42, + 0x82, + 0x80, + 0xB8, + 0xC4, + 0x82, + 0x82, + 0x82, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t helvR12L1_0x37_BMP[] = { + 0xFF, + 0x01, + 0x02, + 0x04, + 0x04, + 0x08, + 0x08, + 0x10, + 0x10, + 0x10, + 0x20, + 0x20 +}; + +static const uint8_t helvR12L1_0x38_BMP[] = { + 0x38, + 0x44, + 0x82, + 0x82, + 0x44, + 0x38, + 0x44, + 0x82, + 0x82, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t helvR12L1_0x39_BMP[] = { + 0x38, + 0x44, + 0x82, + 0x82, + 0x82, + 0x82, + 0x46, + 0x3A, + 0x02, + 0x82, + 0x84, + 0x78 +}; + +static const uint8_t helvR12L1_0x3A_BMP[] = { + 0x80, + 0x80, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x80, + 0x80 +}; + +static const uint8_t helvR12L1_0x3B_BMP[] = { + 0x40, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t helvR12L1_0x3C_BMP[] = { + 0x01, 0x80, + 0x06, 0x00, + 0x18, 0x00, + 0x60, 0x00, + 0x80, 0x00, + 0x60, 0x00, + 0x18, 0x00, + 0x06, 0x00, + 0x01, 0x80 +}; + +static const uint8_t helvR12L1_0x3D_BMP[] = { + 0xFF, + 0x00, + 0x00, + 0xFF +}; + +static const uint8_t helvR12L1_0x3E_BMP[] = { + 0xC0, 0x00, + 0x30, 0x00, + 0x0C, 0x00, + 0x03, 0x00, + 0x00, 0x80, + 0x03, 0x00, + 0x0C, 0x00, + 0x30, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t helvR12L1_0x3F_BMP[] = { + 0x38, + 0x44, + 0x82, + 0x82, + 0x02, + 0x04, + 0x08, + 0x10, + 0x10, + 0x00, + 0x10, + 0x10 +}; + +static const uint8_t helvR12L1_0x40_BMP[] = { + 0x07, 0x80, + 0x18, 0x60, + 0x20, 0x10, + 0x43, 0xD0, + 0x4C, 0x48, + 0x88, 0x48, + 0x90, 0x88, + 0x90, 0x88, + 0x90, 0x90, + 0x99, 0x90, + 0x4E, 0x60, + 0x40, 0x00, + 0x30, 0x60, + 0x0F, 0x80 +}; + +static const uint8_t helvR12L1_0x41_BMP[] = { + 0x0C, 0x00, + 0x0C, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x21, 0x00, + 0x21, 0x00, + 0x7F, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x80, 0x40, + 0x80, 0x40 +}; + +static const uint8_t helvR12L1_0x42_BMP[] = { + 0xFC, 0x00, + 0x82, 0x00, + 0x81, 0x00, + 0x81, 0x00, + 0x82, 0x00, + 0xFE, 0x00, + 0x81, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x81, 0x00, + 0xFE, 0x00 +}; + +static const uint8_t helvR12L1_0x43_BMP[] = { + 0x0F, 0x00, + 0x30, 0x80, + 0x40, 0x40, + 0x40, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x40, 0x00, + 0x40, 0x40, + 0x30, 0x80, + 0x0F, 0x00 +}; + +static const uint8_t helvR12L1_0x44_BMP[] = { + 0xFC, 0x00, + 0x83, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x40, + 0x80, 0x40, + 0x80, 0x40, + 0x80, 0x40, + 0x80, 0x80, + 0x80, 0x80, + 0x83, 0x00, + 0xFC, 0x00 +}; + +static const uint8_t helvR12L1_0x45_BMP[] = { + 0xFF, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFF, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFF +}; + +static const uint8_t helvR12L1_0x46_BMP[] = { + 0xFE, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFE, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR12L1_0x47_BMP[] = { + 0x0E, 0x00, + 0x31, 0x80, + 0x40, 0x40, + 0x40, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x87, 0xC0, + 0x80, 0x40, + 0x40, 0x40, + 0x40, 0xC0, + 0x31, 0x40, + 0x0E, 0x40 +}; + +static const uint8_t helvR12L1_0x48_BMP[] = { + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0xFF, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80 +}; + +static const uint8_t helvR12L1_0x49_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR12L1_0x4A_BMP[] = { + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x04, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR12L1_0x4B_BMP[] = { + 0x81, + 0x82, + 0x84, + 0x88, + 0x90, + 0xB0, + 0xC8, + 0x88, + 0x84, + 0x82, + 0x82, + 0x81 +}; + +static const uint8_t helvR12L1_0x4C_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFE +}; + +static const uint8_t helvR12L1_0x4D_BMP[] = { + 0x80, 0x20, + 0xC0, 0x60, + 0xC0, 0x60, + 0xA0, 0xA0, + 0xA0, 0xA0, + 0xA0, 0xA0, + 0x91, 0x20, + 0x91, 0x20, + 0x91, 0x20, + 0x8A, 0x20, + 0x8A, 0x20, + 0x84, 0x20 +}; + +static const uint8_t helvR12L1_0x4E_BMP[] = { + 0x80, 0x80, + 0xC0, 0x80, + 0xA0, 0x80, + 0xA0, 0x80, + 0x90, 0x80, + 0x88, 0x80, + 0x88, 0x80, + 0x84, 0x80, + 0x82, 0x80, + 0x82, 0x80, + 0x81, 0x80, + 0x80, 0x80 +}; + +static const uint8_t helvR12L1_0x4F_BMP[] = { + 0x0E, 0x00, + 0x31, 0x80, + 0x40, 0x40, + 0x40, 0x40, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x40, 0x40, + 0x40, 0x40, + 0x31, 0x80, + 0x0E, 0x00 +}; + +static const uint8_t helvR12L1_0x50_BMP[] = { + 0xFC, + 0x82, + 0x81, + 0x81, + 0x82, + 0xFC, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR12L1_0x51_BMP[] = { + 0x0E, 0x00, + 0x31, 0x80, + 0x40, 0x40, + 0x40, 0x40, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x40, 0x40, + 0x42, 0x40, + 0x31, 0x80, + 0x0E, 0x80, + 0x00, 0x40 +}; + +static const uint8_t helvR12L1_0x52_BMP[] = { + 0xFC, 0x00, + 0x82, 0x00, + 0x81, 0x00, + 0x81, 0x00, + 0x82, 0x00, + 0xFC, 0x00, + 0x82, 0x00, + 0x81, 0x00, + 0x81, 0x00, + 0x81, 0x00, + 0x81, 0x00, + 0x80, 0x80 +}; + +static const uint8_t helvR12L1_0x53_BMP[] = { + 0x3E, 0x00, + 0x41, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x40, 0x00, + 0x30, 0x00, + 0x0E, 0x00, + 0x01, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x41, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvR12L1_0x54_BMP[] = { + 0xFF, 0x80, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00 +}; + +static const uint8_t helvR12L1_0x55_BMP[] = { + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x41, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvR12L1_0x56_BMP[] = { + 0x80, 0x40, + 0x80, 0x40, + 0x40, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x21, 0x00, + 0x21, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x0C, 0x00, + 0x0C, 0x00 +}; + +static const uint8_t helvR12L1_0x57_BMP[] = { + 0x82, 0x08, + 0x82, 0x08, + 0x82, 0x08, + 0x45, 0x10, + 0x45, 0x10, + 0x45, 0x10, + 0x28, 0xA0, + 0x28, 0xA0, + 0x28, 0xA0, + 0x10, 0x40, + 0x10, 0x40, + 0x10, 0x40 +}; + +static const uint8_t helvR12L1_0x58_BMP[] = { + 0x81, + 0x42, + 0x42, + 0x24, + 0x24, + 0x18, + 0x18, + 0x24, + 0x24, + 0x42, + 0x42, + 0x81 +}; + +static const uint8_t helvR12L1_0x59_BMP[] = { + 0x80, 0x80, + 0x41, 0x00, + 0x41, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x1C, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00 +}; + +static const uint8_t helvR12L1_0x5A_BMP[] = { + 0x7F, 0x80, + 0x01, 0x00, + 0x03, 0x00, + 0x02, 0x00, + 0x04, 0x00, + 0x0C, 0x00, + 0x08, 0x00, + 0x10, 0x00, + 0x30, 0x00, + 0x20, 0x00, + 0x40, 0x00, + 0xFF, 0x80 +}; + +static const uint8_t helvR12L1_0x5B_BMP[] = { + 0xE0, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0xE0 +}; + +static const uint8_t helvR12L1_0x5C_BMP[] = { + 0x80, + 0x80, + 0x40, + 0x40, + 0x40, + 0x40, + 0x20, + 0x20, + 0x20, + 0x10, + 0x10, + 0x10 +}; + +static const uint8_t helvR12L1_0x5D_BMP[] = { + 0xE0, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xE0 +}; + +static const uint8_t helvR12L1_0x5E_BMP[] = { + 0x10, + 0x28, + 0x28, + 0x44, + 0x44, + 0x82, + 0x82 +}; + +static const uint8_t helvR12L1_0x5F_BMP[] = { + 0xFF, 0x80 +}; + +static const uint8_t helvR12L1_0x60_BMP[] = { + 0x80, + 0xC0, + 0x20 +}; + +static const uint8_t helvR12L1_0x61_BMP[] = { + 0x7C, + 0x82, + 0x02, + 0x06, + 0x7A, + 0x82, + 0x82, + 0x86, + 0x7B +}; + +static const uint8_t helvR12L1_0x62_BMP[] = { + 0x80, + 0x80, + 0x80, + 0xB8, + 0xC4, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0xC4, + 0xB8 +}; + +static const uint8_t helvR12L1_0x63_BMP[] = { + 0x38, + 0x44, + 0x82, + 0x80, + 0x80, + 0x80, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t helvR12L1_0x64_BMP[] = { + 0x02, + 0x02, + 0x02, + 0x3A, + 0x46, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x46, + 0x3A +}; + +static const uint8_t helvR12L1_0x65_BMP[] = { + 0x38, + 0x44, + 0x82, + 0x82, + 0xFE, + 0x80, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t helvR12L1_0x66_BMP[] = { + 0x30, + 0x40, + 0x40, + 0xF0, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR12L1_0x67_BMP[] = { + 0x3A, + 0x46, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x46, + 0x3A, + 0x02, + 0x82, + 0x84, + 0x78 +}; + +static const uint8_t helvR12L1_0x68_BMP[] = { + 0x80, + 0x80, + 0x80, + 0xBC, + 0xC2, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82 +}; + +static const uint8_t helvR12L1_0x69_BMP[] = { + 0x80, + 0x80, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR12L1_0x6A_BMP[] = { + 0x20, + 0x20, + 0x00, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0xC0 +}; + +static const uint8_t helvR12L1_0x6B_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x84, + 0x88, + 0x90, + 0xA0, + 0xE0, + 0x90, + 0x88, + 0x84, + 0x82 +}; + +static const uint8_t helvR12L1_0x6C_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR12L1_0x6D_BMP[] = { + 0xB9, 0xC0, + 0xC6, 0x20, + 0x84, 0x20, + 0x84, 0x20, + 0x84, 0x20, + 0x84, 0x20, + 0x84, 0x20, + 0x84, 0x20, + 0x84, 0x20 +}; + +static const uint8_t helvR12L1_0x6E_BMP[] = { + 0xBC, + 0xC2, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82 +}; + +static const uint8_t helvR12L1_0x6F_BMP[] = { + 0x38, + 0x44, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t helvR12L1_0x70_BMP[] = { + 0xB8, + 0xC4, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0xC4, + 0xB8, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR12L1_0x71_BMP[] = { + 0x3A, + 0x46, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x46, + 0x3A, + 0x02, + 0x02, + 0x02, + 0x02 +}; + +static const uint8_t helvR12L1_0x72_BMP[] = { + 0xB0, + 0xC0, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR12L1_0x73_BMP[] = { + 0x78, + 0x84, + 0x84, + 0xC0, + 0x30, + 0x0C, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR12L1_0x74_BMP[] = { + 0x40, + 0x40, + 0xF0, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x30 +}; + +static const uint8_t helvR12L1_0x75_BMP[] = { + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x86, + 0x7A +}; + +static const uint8_t helvR12L1_0x76_BMP[] = { + 0x82, + 0x82, + 0x44, + 0x44, + 0x44, + 0x28, + 0x28, + 0x38, + 0x10 +}; + +static const uint8_t helvR12L1_0x77_BMP[] = { + 0x84, 0x20, + 0x84, 0x20, + 0x44, 0x40, + 0x4E, 0x40, + 0x4A, 0x40, + 0x2A, 0x80, + 0x2A, 0x80, + 0x11, 0x00, + 0x11, 0x00 +}; + +static const uint8_t helvR12L1_0x78_BMP[] = { + 0x82, + 0x44, + 0x44, + 0x28, + 0x10, + 0x28, + 0x44, + 0x44, + 0x82 +}; + +static const uint8_t helvR12L1_0x79_BMP[] = { + 0x82, + 0x82, + 0x44, + 0x44, + 0x28, + 0x28, + 0x38, + 0x10, + 0x10, + 0x20, + 0x20, + 0xC0 +}; + +static const uint8_t helvR12L1_0x7A_BMP[] = { + 0xFC, + 0x04, + 0x08, + 0x10, + 0x20, + 0x20, + 0x40, + 0x80, + 0xFC +}; + +static const uint8_t helvR12L1_0x7B_BMP[] = { + 0x20, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x80, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x20 +}; + +static const uint8_t helvR12L1_0x7C_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR12L1_0x7D_BMP[] = { + 0x80, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x20, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t helvR12L1_0x7E_BMP[] = { + 0x71, + 0x8E +}; + +static const uint8_t helvR12L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t helvR12L1_0xA1_BMP[] = { + 0x80, + 0x80, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR12L1_0xA2_BMP[] = { + 0x04, + 0x04, + 0x38, + 0x4C, + 0x8A, + 0x90, + 0x90, + 0x90, + 0xA2, + 0x64, + 0x38, + 0x40, + 0x40 +}; + +static const uint8_t helvR12L1_0xA3_BMP[] = { + 0x0E, + 0x11, + 0x21, + 0x20, + 0x20, + 0x10, + 0x7E, + 0x08, + 0x10, + 0x20, + 0x79, + 0x86 +}; + +static const uint8_t helvR12L1_0xA4_BMP[] = { + 0xBD, + 0x66, + 0x42, + 0x42, + 0x42, + 0x66, + 0xBD +}; + +static const uint8_t helvR12L1_0xA5_BMP[] = { + 0x80, 0x80, + 0x41, 0x00, + 0x41, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x7F, 0x00, + 0x08, 0x00, + 0x7F, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00 +}; + +static const uint8_t helvR12L1_0xA6_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x00, + 0x00, + 0x00, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR12L1_0xA7_BMP[] = { + 0x38, + 0x44, + 0x46, + 0x60, + 0x98, + 0x8C, + 0x86, + 0xC2, + 0x62, + 0x32, + 0x1C, + 0x04, + 0xC4, + 0x44, + 0x38 +}; + +static const uint8_t helvR12L1_0xA8_BMP[] = { + 0xA0, + 0xA0 +}; + +static const uint8_t helvR12L1_0xA9_BMP[] = { + 0x0F, 0x00, + 0x30, 0xC0, + 0x47, 0x20, + 0x48, 0xA0, + 0x90, 0x10, + 0x90, 0x10, + 0x90, 0x10, + 0x90, 0x10, + 0x48, 0xA0, + 0x47, 0x20, + 0x30, 0xC0, + 0x0F, 0x00 +}; + +static const uint8_t helvR12L1_0xAA_BMP[] = { + 0x60, + 0x90, + 0x70, + 0x90, + 0x78, + 0x00, + 0xF8 +}; + +static const uint8_t helvR12L1_0xAB_BMP[] = { + 0x24, + 0x48, + 0x90, + 0x90, + 0x48, + 0x24 +}; + +static const uint8_t helvR12L1_0xAC_BMP[] = { + 0xFF, + 0x01, + 0x01, + 0x01, + 0x01 +}; + +static const uint8_t helvR12L1_0xAD_BMP[] = { + 0xF0 +}; + +static const uint8_t helvR12L1_0xAE_BMP[] = { + 0x0F, 0x00, + 0x30, 0xC0, + 0x40, 0x20, + 0x4F, 0x20, + 0x88, 0x90, + 0x88, 0x90, + 0x8F, 0x10, + 0x8A, 0x10, + 0x49, 0x20, + 0x48, 0xA0, + 0x30, 0xC0, + 0x0F, 0x00 +}; + +static const uint8_t helvR12L1_0xAF_BMP[] = { + 0xF8 +}; + +static const uint8_t helvR12L1_0xB0_BMP[] = { + 0x70, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t helvR12L1_0xB1_BMP[] = { + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0xFF, 0x80, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0xFF, 0x80 +}; + +static const uint8_t helvR12L1_0xB2_BMP[] = { + 0x70, + 0x88, + 0x88, + 0x10, + 0x60, + 0x80, + 0xF8 +}; + +static const uint8_t helvR12L1_0xB3_BMP[] = { + 0x70, + 0x88, + 0x08, + 0x30, + 0x08, + 0x88, + 0x70 +}; + +static const uint8_t helvR12L1_0xB4_BMP[] = { + 0x20, + 0x60, + 0x80 +}; + +static const uint8_t helvR12L1_0xB5_BMP[] = { + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x86, + 0xFA, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR12L1_0xB6_BMP[] = { + 0x3E, + 0x74, + 0xF4, + 0xF4, + 0xF4, + 0xF4, + 0x74, + 0x34, + 0x14, + 0x14, + 0x14, + 0x14, + 0x14, + 0x14, + 0x14 +}; + +static const uint8_t helvR12L1_0xB7_BMP[] = { + 0x80, + 0x80 +}; + +static const uint8_t helvR12L1_0xB8_BMP[] = { + 0x20, + 0x20, + 0x90, + 0x60 +}; + +static const uint8_t helvR12L1_0xB9_BMP[] = { + 0x20, + 0xE0, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20 +}; + +static const uint8_t helvR12L1_0xBA_BMP[] = { + 0x60, + 0x90, + 0x90, + 0x90, + 0x60, + 0x00, + 0xF0 +}; + +static const uint8_t helvR12L1_0xBB_BMP[] = { + 0x90, + 0x48, + 0x24, + 0x24, + 0x48, + 0x90 +}; + +static const uint8_t helvR12L1_0xBC_BMP[] = { + 0x20, 0x40, + 0xE0, 0x80, + 0x20, 0x80, + 0x21, 0x00, + 0x22, 0x00, + 0x22, 0x20, + 0x24, 0x60, + 0x04, 0xA0, + 0x09, 0x20, + 0x11, 0xF0, + 0x10, 0x20, + 0x20, 0x20 +}; + +static const uint8_t helvR12L1_0xBD_BMP[] = { + 0x00, 0x40, + 0x20, 0x80, + 0xE0, 0x80, + 0x21, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x24, 0xE0, + 0x25, 0x10, + 0x09, 0x10, + 0x08, 0x20, + 0x10, 0xC0, + 0x21, 0x00, + 0x21, 0xF0 +}; + +static const uint8_t helvR12L1_0xBE_BMP[] = { + 0x70, 0x40, + 0x88, 0x40, + 0x08, 0x80, + 0x30, 0x80, + 0x09, 0x00, + 0x89, 0x10, + 0x72, 0x30, + 0x02, 0x50, + 0x04, 0x90, + 0x04, 0xF8, + 0x08, 0x10, + 0x08, 0x10 +}; + +static const uint8_t helvR12L1_0xBF_BMP[] = { + 0x10, + 0x10, + 0x00, + 0x10, + 0x10, + 0x20, + 0x40, + 0x80, + 0x82, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t helvR12L1_0xC0_BMP[] = { + 0x10, 0x00, + 0x18, 0x00, + 0x04, 0x00, + 0x00, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x21, 0x00, + 0x21, 0x00, + 0x7F, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x80, 0x40, + 0x80, 0x40 +}; + +static const uint8_t helvR12L1_0xC1_BMP[] = { + 0x02, 0x00, + 0x06, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x21, 0x00, + 0x21, 0x00, + 0x7F, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x80, 0x40, + 0x80, 0x40 +}; + +static const uint8_t helvR12L1_0xC2_BMP[] = { + 0x04, 0x00, + 0x0E, 0x00, + 0x11, 0x00, + 0x00, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x21, 0x00, + 0x21, 0x00, + 0x7F, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x80, 0x40, + 0x80, 0x40 +}; + +static const uint8_t helvR12L1_0xC3_BMP[] = { + 0x1A, 0x00, + 0x2C, 0x00, + 0x00, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x21, 0x00, + 0x21, 0x00, + 0x7F, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x80, 0x40, + 0x80, 0x40 +}; + +static const uint8_t helvR12L1_0xC4_BMP[] = { + 0x12, 0x00, + 0x12, 0x00, + 0x00, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x21, 0x00, + 0x21, 0x00, + 0x7F, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x80, 0x40, + 0x80, 0x40 +}; + +static const uint8_t helvR12L1_0xC5_BMP[] = { + 0x0C, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0x21, 0x00, + 0x21, 0x00, + 0x7F, 0x80, + 0x40, 0x80, + 0x40, 0x80, + 0x80, 0x40, + 0x80, 0x40 +}; + +static const uint8_t helvR12L1_0xC6_BMP[] = { + 0x07, 0xFC, + 0x09, 0x00, + 0x09, 0x00, + 0x11, 0x00, + 0x11, 0x00, + 0x21, 0xFC, + 0x21, 0x00, + 0x7F, 0x00, + 0x41, 0x00, + 0x41, 0x00, + 0x81, 0x00, + 0x81, 0xFC +}; + +static const uint8_t helvR12L1_0xC7_BMP[] = { + 0x0F, 0x00, + 0x30, 0x80, + 0x40, 0x40, + 0x40, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x40, 0x00, + 0x40, 0x40, + 0x30, 0x80, + 0x0F, 0x00, + 0x04, 0x00, + 0x04, 0x00, + 0x12, 0x00, + 0x0C, 0x00 +}; + +static const uint8_t helvR12L1_0xC8_BMP[] = { + 0x20, + 0x30, + 0x08, + 0x00, + 0xFF, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFF, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFF +}; + +static const uint8_t helvR12L1_0xC9_BMP[] = { + 0x04, + 0x0C, + 0x10, + 0x00, + 0xFF, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFF, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFF +}; + +static const uint8_t helvR12L1_0xCA_BMP[] = { + 0x10, + 0x38, + 0x44, + 0x00, + 0xFF, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFF, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFF +}; + +static const uint8_t helvR12L1_0xCB_BMP[] = { + 0x24, + 0x24, + 0x00, + 0xFF, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFF, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0xFF +}; + +static const uint8_t helvR12L1_0xCC_BMP[] = { + 0x80, + 0xC0, + 0x20, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR12L1_0xCD_BMP[] = { + 0x20, + 0x60, + 0x80, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR12L1_0xCE_BMP[] = { + 0x20, + 0x70, + 0x88, + 0x00, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20 +}; + +static const uint8_t helvR12L1_0xCF_BMP[] = { + 0xA0, + 0xA0, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR12L1_0xD0_BMP[] = { + 0x3F, 0x00, + 0x20, 0xC0, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0x10, + 0xF8, 0x10, + 0x20, 0x10, + 0x20, 0x10, + 0x20, 0x20, + 0x20, 0x20, + 0x20, 0xC0, + 0x3F, 0x00 +}; + +static const uint8_t helvR12L1_0xD1_BMP[] = { + 0x1A, 0x00, + 0x2C, 0x00, + 0x00, 0x00, + 0x80, 0x80, + 0xC0, 0x80, + 0xA0, 0x80, + 0xA0, 0x80, + 0x90, 0x80, + 0x88, 0x80, + 0x88, 0x80, + 0x84, 0x80, + 0x82, 0x80, + 0x82, 0x80, + 0x81, 0x80, + 0x80, 0x80 +}; + +static const uint8_t helvR12L1_0xD2_BMP[] = { + 0x08, 0x00, + 0x0C, 0x00, + 0x02, 0x00, + 0x00, 0x00, + 0x0E, 0x00, + 0x31, 0x80, + 0x40, 0x40, + 0x40, 0x40, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x40, 0x40, + 0x40, 0x40, + 0x31, 0x80, + 0x0E, 0x00 +}; + +static const uint8_t helvR12L1_0xD3_BMP[] = { + 0x01, 0x00, + 0x03, 0x00, + 0x04, 0x00, + 0x00, 0x00, + 0x0E, 0x00, + 0x31, 0x80, + 0x40, 0x40, + 0x40, 0x40, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x40, 0x40, + 0x40, 0x40, + 0x31, 0x80, + 0x0E, 0x00 +}; + +static const uint8_t helvR12L1_0xD4_BMP[] = { + 0x04, 0x00, + 0x0E, 0x00, + 0x11, 0x00, + 0x00, 0x00, + 0x0E, 0x00, + 0x31, 0x80, + 0x40, 0x40, + 0x40, 0x40, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x40, 0x40, + 0x40, 0x40, + 0x31, 0x80, + 0x0E, 0x00 +}; + +static const uint8_t helvR12L1_0xD5_BMP[] = { + 0x0D, 0x00, + 0x16, 0x00, + 0x00, 0x00, + 0x0E, 0x00, + 0x31, 0x80, + 0x40, 0x40, + 0x40, 0x40, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x40, 0x40, + 0x40, 0x40, + 0x31, 0x80, + 0x0E, 0x00 +}; + +static const uint8_t helvR12L1_0xD6_BMP[] = { + 0x11, 0x00, + 0x11, 0x00, + 0x00, 0x00, + 0x0E, 0x00, + 0x31, 0x80, + 0x40, 0x40, + 0x40, 0x40, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x80, 0x20, + 0x40, 0x40, + 0x40, 0x40, + 0x31, 0x80, + 0x0E, 0x00 +}; + +static const uint8_t helvR12L1_0xD7_BMP[] = { + 0x81, + 0x42, + 0x24, + 0x18, + 0x18, + 0x24, + 0x42, + 0x81 +}; + +static const uint8_t helvR12L1_0xD8_BMP[] = { + 0x00, 0x40, + 0x0E, 0x80, + 0x31, 0x80, + 0x41, 0x40, + 0x42, 0x40, + 0x82, 0x20, + 0x84, 0x20, + 0x84, 0x20, + 0x88, 0x20, + 0x48, 0x40, + 0x50, 0x40, + 0x31, 0x80, + 0x2E, 0x00, + 0x40, 0x00 +}; + +static const uint8_t helvR12L1_0xD9_BMP[] = { + 0x20, 0x00, + 0x30, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x41, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvR12L1_0xDA_BMP[] = { + 0x02, 0x00, + 0x06, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x41, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvR12L1_0xDB_BMP[] = { + 0x08, 0x00, + 0x1C, 0x00, + 0x22, 0x00, + 0x00, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x41, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvR12L1_0xDC_BMP[] = { + 0x22, 0x00, + 0x22, 0x00, + 0x00, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x41, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvR12L1_0xDD_BMP[] = { + 0x02, 0x00, + 0x06, 0x00, + 0x08, 0x00, + 0x00, 0x00, + 0x80, 0x80, + 0x41, 0x00, + 0x41, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x14, 0x00, + 0x1C, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00, + 0x08, 0x00 +}; + +static const uint8_t helvR12L1_0xDE_BMP[] = { + 0x80, + 0x80, + 0xFC, + 0x82, + 0x81, + 0x81, + 0x82, + 0xFC, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR12L1_0xDF_BMP[] = { + 0x78, + 0x84, + 0x82, + 0x82, + 0x84, + 0xBC, + 0x86, + 0x82, + 0x82, + 0x82, + 0x84, + 0xB8 +}; + +static const uint8_t helvR12L1_0xE0_BMP[] = { + 0x20, + 0x30, + 0x08, + 0x00, + 0x7C, + 0x82, + 0x02, + 0x06, + 0x7A, + 0x82, + 0x82, + 0x86, + 0x7B +}; + +static const uint8_t helvR12L1_0xE1_BMP[] = { + 0x04, + 0x0C, + 0x10, + 0x00, + 0x7C, + 0x82, + 0x02, + 0x06, + 0x7A, + 0x82, + 0x82, + 0x86, + 0x7B +}; + +static const uint8_t helvR12L1_0xE2_BMP[] = { + 0x10, + 0x38, + 0x44, + 0x00, + 0x7C, + 0x82, + 0x02, + 0x06, + 0x7A, + 0x82, + 0x82, + 0x86, + 0x7B +}; + +static const uint8_t helvR12L1_0xE3_BMP[] = { + 0x34, + 0x58, + 0x00, + 0x7C, + 0x82, + 0x02, + 0x06, + 0x7A, + 0x82, + 0x82, + 0x86, + 0x7B +}; + +static const uint8_t helvR12L1_0xE4_BMP[] = { + 0x28, + 0x28, + 0x00, + 0x7C, + 0x82, + 0x02, + 0x06, + 0x7A, + 0x82, + 0x82, + 0x86, + 0x7B +}; + +static const uint8_t helvR12L1_0xE5_BMP[] = { + 0x10, + 0x28, + 0x10, + 0x00, + 0x7C, + 0x82, + 0x02, + 0x06, + 0x7A, + 0x82, + 0x82, + 0x86, + 0x7B +}; + +static const uint8_t helvR12L1_0xE6_BMP[] = { + 0x7C, 0xE0, + 0x83, 0x10, + 0x02, 0x08, + 0x06, 0x08, + 0x7B, 0xF8, + 0x82, 0x00, + 0x82, 0x08, + 0x87, 0x10, + 0x78, 0xE0 +}; + +static const uint8_t helvR12L1_0xE7_BMP[] = { + 0x38, + 0x44, + 0x82, + 0x80, + 0x80, + 0x80, + 0x82, + 0x44, + 0x38, + 0x10, + 0x10, + 0x48, + 0x30 +}; + +static const uint8_t helvR12L1_0xE8_BMP[] = { + 0x40, + 0x60, + 0x10, + 0x00, + 0x38, + 0x44, + 0x82, + 0x82, + 0xFE, + 0x80, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t helvR12L1_0xE9_BMP[] = { + 0x08, + 0x18, + 0x20, + 0x00, + 0x38, + 0x44, + 0x82, + 0x82, + 0xFE, + 0x80, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t helvR12L1_0xEA_BMP[] = { + 0x10, + 0x38, + 0x44, + 0x00, + 0x38, + 0x44, + 0x82, + 0x82, + 0xFE, + 0x80, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t helvR12L1_0xEB_BMP[] = { + 0x28, + 0x28, + 0x00, + 0x38, + 0x44, + 0x82, + 0x82, + 0xFE, + 0x80, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t helvR12L1_0xEC_BMP[] = { + 0x80, + 0xC0, + 0x20, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR12L1_0xED_BMP[] = { + 0x20, + 0x60, + 0x80, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR12L1_0xEE_BMP[] = { + 0x20, + 0x70, + 0x88, + 0x00, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20 +}; + +static const uint8_t helvR12L1_0xEF_BMP[] = { + 0xA0, + 0xA0, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR12L1_0xF0_BMP[] = { + 0x48, + 0x30, + 0x58, + 0x3C, + 0x44, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t helvR12L1_0xF1_BMP[] = { + 0x34, + 0x58, + 0x00, + 0xBC, + 0xC2, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82 +}; + +static const uint8_t helvR12L1_0xF2_BMP[] = { + 0x20, + 0x30, + 0x08, + 0x00, + 0x38, + 0x44, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t helvR12L1_0xF3_BMP[] = { + 0x08, + 0x18, + 0x20, + 0x00, + 0x38, + 0x44, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t helvR12L1_0xF4_BMP[] = { + 0x10, + 0x38, + 0x44, + 0x00, + 0x38, + 0x44, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t helvR12L1_0xF5_BMP[] = { + 0x34, + 0x58, + 0x00, + 0x38, + 0x44, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t helvR12L1_0xF6_BMP[] = { + 0x28, + 0x28, + 0x00, + 0x38, + 0x44, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x44, + 0x38 +}; + +static const uint8_t helvR12L1_0xF7_BMP[] = { + 0x10, + 0x10, + 0x00, + 0x00, + 0xFE, + 0x00, + 0x00, + 0x10, + 0x10 +}; + +static const uint8_t helvR12L1_0xF8_BMP[] = { + 0x02, + 0x3C, + 0x44, + 0x8A, + 0x92, + 0x92, + 0xA2, + 0xA2, + 0x44, + 0xB8 +}; + +static const uint8_t helvR12L1_0xF9_BMP[] = { + 0x20, + 0x30, + 0x08, + 0x00, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x86, + 0x7A +}; + +static const uint8_t helvR12L1_0xFA_BMP[] = { + 0x04, + 0x0C, + 0x10, + 0x00, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x86, + 0x7A +}; + +static const uint8_t helvR12L1_0xFB_BMP[] = { + 0x10, + 0x38, + 0x44, + 0x00, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x86, + 0x7A +}; + +static const uint8_t helvR12L1_0xFC_BMP[] = { + 0x28, + 0x28, + 0x00, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0x86, + 0x7A +}; + +static const uint8_t helvR12L1_0xFD_BMP[] = { + 0x08, + 0x18, + 0x20, + 0x00, + 0x82, + 0x82, + 0x44, + 0x44, + 0x28, + 0x28, + 0x38, + 0x10, + 0x10, + 0x20, + 0x20, + 0xC0 +}; + +static const uint8_t helvR12L1_0xFE_BMP[] = { + 0x80, + 0x80, + 0x80, + 0xB8, + 0xC4, + 0x82, + 0x82, + 0x82, + 0x82, + 0x82, + 0xC4, + 0xB8, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR12L1_0xFF_BMP[] = { + 0x28, + 0x28, + 0x00, + 0x82, + 0x82, + 0x44, + 0x44, + 0x28, + 0x28, + 0x38, + 0x10, + 0x10, + 0x20, + 0x20, + 0xC0 +}; + +static const GFONT_CharInfo FontBMP[] = { + {12, 9, 11, 1, 0, helvR12L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {5, 1, 1, 0, 0, helvR12L1_0x20_BMP}, + {5, 1, 12, 2, 0, helvR12L1_0x21_BMP}, + {6, 4, 4, 1, 8, helvR12L1_0x22_BMP}, + {9, 8, 11, 0, 0, helvR12L1_0x23_BMP}, + {9, 7, 15, 1, -2, helvR12L1_0x24_BMP}, + {14, 12, 12, 0, 0, helvR12L1_0x25_BMP}, + {11, 10, 12, 0, 0, helvR12L1_0x26_BMP}, + {3, 2, 4, 0, 8, helvR12L1_0x27_BMP}, + {6, 3, 16, 1, -4, helvR12L1_0x28_BMP}, + {6, 3, 16, 1, -4, helvR12L1_0x29_BMP}, + {6, 5, 5, 0, 7, helvR12L1_0x2A_BMP}, + {10, 9, 9, 0, 0, helvR12L1_0x2B_BMP}, + {4, 2, 4, 1, -2, helvR12L1_0x2C_BMP}, + {5, 4, 1, 0, 4, helvR12L1_0x2D_BMP}, + {4, 1, 2, 2, 0, helvR12L1_0x2E_BMP}, + {5, 4, 12, 0, 0, helvR12L1_0x2F_BMP}, + {9, 7, 12, 1, 0, helvR12L1_0x30_BMP}, + {9, 3, 12, 3, 0, helvR12L1_0x31_BMP}, + {9, 7, 12, 1, 0, helvR12L1_0x32_BMP}, + {9, 7, 12, 1, 0, helvR12L1_0x33_BMP}, + {9, 8, 12, 0, 0, helvR12L1_0x34_BMP}, + {9, 7, 12, 1, 0, helvR12L1_0x35_BMP}, + {9, 7, 12, 1, 0, helvR12L1_0x36_BMP}, + {9, 8, 12, 0, 0, helvR12L1_0x37_BMP}, + {9, 7, 12, 1, 0, helvR12L1_0x38_BMP}, + {9, 7, 12, 1, 0, helvR12L1_0x39_BMP}, + {4, 1, 9, 2, 0, helvR12L1_0x3A_BMP}, + {4, 2, 11, 1, -2, helvR12L1_0x3B_BMP}, + {10, 9, 9, 0, 0, helvR12L1_0x3C_BMP}, + {10, 8, 4, 0, 2, helvR12L1_0x3D_BMP}, + {10, 9, 9, 1, 0, helvR12L1_0x3E_BMP}, + {9, 7, 12, 1, 0, helvR12L1_0x3F_BMP}, + {17, 13, 14, 1, -2, helvR12L1_0x40_BMP}, + {11, 10, 12, 0, 0, helvR12L1_0x41_BMP}, + {11, 9, 12, 1, 0, helvR12L1_0x42_BMP}, + {12, 10, 12, 1, 0, helvR12L1_0x43_BMP}, + {12, 10, 12, 1, 0, helvR12L1_0x44_BMP}, + {11, 8, 12, 1, 0, helvR12L1_0x45_BMP}, + {10, 7, 12, 1, 0, helvR12L1_0x46_BMP}, + {13, 10, 12, 1, 0, helvR12L1_0x47_BMP}, + {12, 9, 12, 1, 0, helvR12L1_0x48_BMP}, + {4, 1, 12, 1, 0, helvR12L1_0x49_BMP}, + {8, 6, 12, 0, 0, helvR12L1_0x4A_BMP}, + {11, 8, 12, 1, 0, helvR12L1_0x4B_BMP}, + {9, 7, 12, 1, 0, helvR12L1_0x4C_BMP}, + {13, 11, 12, 1, 0, helvR12L1_0x4D_BMP}, + {12, 9, 12, 1, 0, helvR12L1_0x4E_BMP}, + {13, 11, 12, 1, 0, helvR12L1_0x4F_BMP}, + {11, 8, 12, 2, 0, helvR12L1_0x50_BMP}, + {13, 11, 13, 1, -1, helvR12L1_0x51_BMP}, + {12, 9, 12, 2, 0, helvR12L1_0x52_BMP}, + {11, 9, 12, 1, 0, helvR12L1_0x53_BMP}, + {10, 9, 12, 0, 0, helvR12L1_0x54_BMP}, + {12, 9, 12, 1, 0, helvR12L1_0x55_BMP}, + {11, 10, 12, 0, 0, helvR12L1_0x56_BMP}, + {15, 13, 12, 1, 0, helvR12L1_0x57_BMP}, + {11, 8, 12, 1, 0, helvR12L1_0x58_BMP}, + {11, 9, 12, 1, 0, helvR12L1_0x59_BMP}, + {10, 9, 12, 0, 0, helvR12L1_0x5A_BMP}, + {5, 3, 15, 1, -3, helvR12L1_0x5B_BMP}, + {5, 4, 12, 0, 0, helvR12L1_0x5C_BMP}, + {5, 3, 15, 0, -3, helvR12L1_0x5D_BMP}, + {8, 7, 7, 0, 5, helvR12L1_0x5E_BMP}, + {9, 9, 1, 0, -3, helvR12L1_0x5F_BMP}, + {6, 3, 3, 0, 10, helvR12L1_0x60_BMP}, + {9, 8, 9, 1, 0, helvR12L1_0x61_BMP}, + {9, 7, 12, 1, 0, helvR12L1_0x62_BMP}, + {8, 7, 9, 1, 0, helvR12L1_0x63_BMP}, + {9, 7, 12, 1, 0, helvR12L1_0x64_BMP}, + {9, 7, 9, 1, 0, helvR12L1_0x65_BMP}, + {5, 4, 12, 1, 0, helvR12L1_0x66_BMP}, + {9, 7, 13, 1, -4, helvR12L1_0x67_BMP}, + {9, 7, 12, 1, 0, helvR12L1_0x68_BMP}, + {3, 1, 12, 1, 0, helvR12L1_0x69_BMP}, + {4, 3, 16, -1, -4, helvR12L1_0x6A_BMP}, + {8, 7, 12, 0, 0, helvR12L1_0x6B_BMP}, + {3, 1, 12, 1, 0, helvR12L1_0x6C_BMP}, + {14, 11, 9, 2, 0, helvR12L1_0x6D_BMP}, + {9, 7, 9, 1, 0, helvR12L1_0x6E_BMP}, + {9, 7, 9, 1, 0, helvR12L1_0x6F_BMP}, + {9, 7, 13, 1, -4, helvR12L1_0x70_BMP}, + {9, 7, 13, 1, -4, helvR12L1_0x71_BMP}, + {5, 4, 9, 1, 0, helvR12L1_0x72_BMP}, + {8, 6, 9, 1, 0, helvR12L1_0x73_BMP}, + {5, 4, 11, 1, 0, helvR12L1_0x74_BMP}, + {9, 7, 9, 1, 0, helvR12L1_0x75_BMP}, + {8, 7, 9, 0, 0, helvR12L1_0x76_BMP}, + {12, 11, 9, 0, 0, helvR12L1_0x77_BMP}, + {8, 7, 9, 0, 0, helvR12L1_0x78_BMP}, + {8, 7, 12, 0, -3, helvR12L1_0x79_BMP}, + {8, 6, 9, 1, 0, helvR12L1_0x7A_BMP}, + {6, 3, 16, 1, -4, helvR12L1_0x7B_BMP}, + {4, 1, 16, 1, -4, helvR12L1_0x7C_BMP}, + {6, 3, 16, 1, -4, helvR12L1_0x7D_BMP}, + {10, 8, 2, 1, 4, helvR12L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {5, 1, 1, 0, 0, helvR12L1_0xA0_BMP}, + {6, 1, 12, 2, -3, helvR12L1_0xA1_BMP}, + {9, 7, 13, 1, -2, helvR12L1_0xA2_BMP}, + {9, 8, 12, 0, 0, helvR12L1_0xA3_BMP}, + {9, 8, 7, 0, 3, helvR12L1_0xA4_BMP}, + {9, 9, 12, 0, 0, helvR12L1_0xA5_BMP}, + {4, 1, 16, 1, -4, helvR12L1_0xA6_BMP}, + {9, 7, 15, 1, -3, helvR12L1_0xA7_BMP}, + {5, 3, 2, 1, 10, helvR12L1_0xA8_BMP}, + {12, 12, 12, 0, 0, helvR12L1_0xA9_BMP}, + {6, 5, 7, 1, 5, helvR12L1_0xAA_BMP}, + {9, 6, 6, 1, 2, helvR12L1_0xAB_BMP}, + {10, 8, 5, 0, 1, helvR12L1_0xAC_BMP}, + {5, 4, 1, 0, 4, helvR12L1_0xAD_BMP}, + {12, 12, 12, 0, 0, helvR12L1_0xAE_BMP}, + {6, 5, 1, 0, 10, helvR12L1_0xAF_BMP}, + {7, 5, 5, 1, 7, helvR12L1_0xB0_BMP}, + {10, 9, 11, 0, 0, helvR12L1_0xB1_BMP}, + {6, 5, 7, 0, 5, helvR12L1_0xB2_BMP}, + {6, 5, 7, 0, 5, helvR12L1_0xB3_BMP}, + {6, 3, 3, 1, 10, helvR12L1_0xB4_BMP}, + {9, 7, 13, 1, -4, helvR12L1_0xB5_BMP}, + {9, 7, 15, 1, -3, helvR12L1_0xB6_BMP}, + {5, 1, 2, 2, 4, helvR12L1_0xB7_BMP}, + {6, 4, 4, 0, -4, helvR12L1_0xB8_BMP}, + {6, 3, 7, 0, 5, helvR12L1_0xB9_BMP}, + {6, 4, 7, 1, 5, helvR12L1_0xBA_BMP}, + {9, 6, 6, 1, 2, helvR12L1_0xBB_BMP}, + {14, 12, 12, 0, 0, helvR12L1_0xBC_BMP}, + {14, 12, 13, 0, 0, helvR12L1_0xBD_BMP}, + {14, 13, 12, 0, 0, helvR12L1_0xBE_BMP}, + {10, 7, 12, 1, -3, helvR12L1_0xBF_BMP}, + {11, 10, 16, 0, 0, helvR12L1_0xC0_BMP}, + {11, 10, 16, 0, 0, helvR12L1_0xC1_BMP}, + {11, 10, 16, 0, 0, helvR12L1_0xC2_BMP}, + {11, 10, 15, 0, 0, helvR12L1_0xC3_BMP}, + {11, 10, 15, 0, 0, helvR12L1_0xC4_BMP}, + {11, 10, 15, 0, 0, helvR12L1_0xC5_BMP}, + {16, 14, 12, 0, 0, helvR12L1_0xC6_BMP}, + {12, 10, 16, 1, -4, helvR12L1_0xC7_BMP}, + {11, 8, 16, 1, 0, helvR12L1_0xC8_BMP}, + {11, 8, 16, 1, 0, helvR12L1_0xC9_BMP}, + {11, 8, 16, 1, 0, helvR12L1_0xCA_BMP}, + {11, 8, 15, 1, 0, helvR12L1_0xCB_BMP}, + {4, 3, 16, 0, 0, helvR12L1_0xCC_BMP}, + {4, 3, 16, 0, 0, helvR12L1_0xCD_BMP}, + {4, 5, 16, -1, 0, helvR12L1_0xCE_BMP}, + {4, 3, 15, 0, 0, helvR12L1_0xCF_BMP}, + {12, 12, 12, 0, 0, helvR12L1_0xD0_BMP}, + {12, 9, 15, 1, 0, helvR12L1_0xD1_BMP}, + {13, 11, 16, 1, 0, helvR12L1_0xD2_BMP}, + {13, 11, 16, 1, 0, helvR12L1_0xD3_BMP}, + {13, 11, 16, 1, 0, helvR12L1_0xD4_BMP}, + {13, 11, 15, 1, 0, helvR12L1_0xD5_BMP}, + {13, 11, 15, 1, 0, helvR12L1_0xD6_BMP}, + {10, 8, 8, 1, 0, helvR12L1_0xD7_BMP}, + {13, 11, 14, 1, -1, helvR12L1_0xD8_BMP}, + {12, 9, 16, 1, 0, helvR12L1_0xD9_BMP}, + {12, 9, 16, 1, 0, helvR12L1_0xDA_BMP}, + {12, 9, 16, 1, 0, helvR12L1_0xDB_BMP}, + {12, 9, 15, 1, 0, helvR12L1_0xDC_BMP}, + {11, 9, 16, 1, 0, helvR12L1_0xDD_BMP}, + {11, 8, 12, 2, 0, helvR12L1_0xDE_BMP}, + {10, 7, 12, 2, 0, helvR12L1_0xDF_BMP}, + {9, 8, 13, 1, 0, helvR12L1_0xE0_BMP}, + {9, 8, 13, 1, 0, helvR12L1_0xE1_BMP}, + {9, 8, 13, 1, 0, helvR12L1_0xE2_BMP}, + {9, 8, 12, 1, 0, helvR12L1_0xE3_BMP}, + {9, 8, 12, 1, 0, helvR12L1_0xE4_BMP}, + {9, 8, 13, 1, 0, helvR12L1_0xE5_BMP}, + {15, 13, 9, 1, 0, helvR12L1_0xE6_BMP}, + {8, 7, 13, 1, -4, helvR12L1_0xE7_BMP}, + {9, 7, 13, 1, 0, helvR12L1_0xE8_BMP}, + {9, 7, 13, 1, 0, helvR12L1_0xE9_BMP}, + {9, 7, 13, 1, 0, helvR12L1_0xEA_BMP}, + {9, 7, 12, 1, 0, helvR12L1_0xEB_BMP}, + {4, 3, 13, 1, 0, helvR12L1_0xEC_BMP}, + {4, 3, 13, 1, 0, helvR12L1_0xED_BMP}, + {4, 5, 13, 0, 0, helvR12L1_0xEE_BMP}, + {4, 3, 12, 1, 0, helvR12L1_0xEF_BMP}, + {9, 7, 12, 1, 0, helvR12L1_0xF0_BMP}, + {9, 7, 12, 1, 0, helvR12L1_0xF1_BMP}, + {9, 7, 13, 1, 0, helvR12L1_0xF2_BMP}, + {9, 7, 13, 1, 0, helvR12L1_0xF3_BMP}, + {9, 7, 13, 1, 0, helvR12L1_0xF4_BMP}, + {9, 7, 12, 1, 0, helvR12L1_0xF5_BMP}, + {9, 7, 12, 1, 0, helvR12L1_0xF6_BMP}, + {10, 7, 9, 1, 0, helvR12L1_0xF7_BMP}, + {10, 7, 10, 1, 0, helvR12L1_0xF8_BMP}, + {9, 7, 13, 1, 0, helvR12L1_0xF9_BMP}, + {9, 7, 13, 1, 0, helvR12L1_0xFA_BMP}, + {9, 7, 13, 1, 0, helvR12L1_0xFB_BMP}, + {9, 7, 12, 1, 0, helvR12L1_0xFC_BMP}, + {8, 7, 16, 0, -3, helvR12L1_0xFD_BMP}, + {9, 7, 16, 1, -4, helvR12L1_0xFE_BMP}, + {8, 7, 15, 0, -3, helvR12L1_0xFF_BMP} +}; + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontHelv12Normal_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontHelv12Normal_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontHelv12Normal_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontHelv12Normal_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontHelv12Normal_GetFontChar, + McuFontHelv12Normal_FBBy, + McuFontHelv12Normal_GetUnderlineBoxHeight(), + McuFontHelv12Normal_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv12Normal_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv12Normal_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv12Normal_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv12Normal_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontHelv12Normal. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv12Normal.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv12Normal.h new file mode 100644 index 0000000..022f0ae --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv12Normal.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv12Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv12Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 12 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv12Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv12Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv12Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv12Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv12Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv12Normal_Deinit(void); +** Init - void McuFontHelv12Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv12Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv12Normal_module McuFontHelv12Normal module documentation +** @{ +*/ + + +#ifndef __McuFontHelv12Normal_H +#define __McuFontHelv12Normal_H + +/* MODULE McuFontHelv12Normal. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontHelv12Normalconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontHelv12Normal_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontHelv12Normal_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontHelv12Normal_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontHelv12Normal_GetLineSpaceHeight() \ + 2 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontHelv12Normal_GetUnderlineBoxHeight() \ + 4 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontHelv12Normal_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontHelv12Normal_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontHelv12Normal. */ + +#endif +/* ifndef __McuFontHelv12Normal_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv14Bold.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv14Bold.c new file mode 100644 index 0000000..bbbba53 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv14Bold.c @@ -0,0 +1,3602 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv14Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv14Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 14 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv14Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv14Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv14Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv14Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv14Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv14Bold_Deinit(void); +** Init - void McuFontHelv14Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv14Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv14Bold_module McuFontHelv14Bold module documentation +** @{ +*/ + +/* MODULE McuFontHelv14Bold. */ + +#include "McuFontHelv14Bold.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontHelv14Bold_FBBy 21 + +static const uint8_t helvB14L1_0x00_BMP[] = { + 0xAA, 0xA0, + 0x00, 0x00, + 0x80, 0x20, + 0x00, 0x00, + 0x80, 0x20, + 0x00, 0x00, + 0x80, 0x20, + 0x00, 0x00, + 0x80, 0x20, + 0x00, 0x00, + 0x80, 0x20, + 0x00, 0x00, + 0xAA, 0xA0 +}; + +static const uint8_t helvB14L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t helvB14L1_0x21_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xC0, + 0xC0, + 0x00, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvB14L1_0x22_BMP[] = { + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x90 +}; + +static const uint8_t helvB14L1_0x23_BMP[] = { + 0x0D, 0x80, + 0x0D, 0x80, + 0x0D, 0x80, + 0x7F, 0xE0, + 0x7F, 0xE0, + 0x1B, 0x00, + 0x1B, 0x00, + 0x1B, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x36, 0x00, + 0x36, 0x00, + 0x36, 0x00 +}; + +static const uint8_t helvB14L1_0x24_BMP[] = { + 0x04, 0x00, + 0x3F, 0x00, + 0x7F, 0x80, + 0xE5, 0x80, + 0xE4, 0x00, + 0xE4, 0x00, + 0x7C, 0x00, + 0x3F, 0x00, + 0x0F, 0x80, + 0x09, 0xC0, + 0xE9, 0xC0, + 0xE9, 0xC0, + 0x7F, 0x80, + 0x3F, 0x00, + 0x08, 0x00, + 0x08, 0x00 +}; + +static const uint8_t helvB14L1_0x25_BMP[] = { + 0x78, 0x60, + 0xFC, 0x60, + 0xCC, 0xC0, + 0xCC, 0x80, + 0xFD, 0x80, + 0x7B, 0x00, + 0x02, 0x00, + 0x06, 0xF0, + 0x0D, 0xF8, + 0x09, 0x98, + 0x19, 0x98, + 0x31, 0xF8, + 0x30, 0xF0 +}; + +static const uint8_t helvB14L1_0x26_BMP[] = { + 0x1E, 0x00, + 0x3F, 0x00, + 0x73, 0x80, + 0x61, 0x80, + 0x73, 0x00, + 0x3E, 0x00, + 0x1C, 0x60, + 0x7E, 0x60, + 0xE7, 0xE0, + 0xC3, 0xC0, + 0xC1, 0xC0, + 0xE3, 0xE0, + 0x7F, 0x70, + 0x3E, 0x38 +}; + +static const uint8_t helvB14L1_0x27_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x80 +}; + +static const uint8_t helvB14L1_0x28_BMP[] = { + 0x1C, + 0x38, + 0x30, + 0x70, + 0x60, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0x60, + 0x70, + 0x30, + 0x38, + 0x1C +}; + +static const uint8_t helvB14L1_0x29_BMP[] = { + 0xE0, + 0x70, + 0x30, + 0x38, + 0x18, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x18, + 0x38, + 0x30, + 0x70, + 0xE0 +}; + +static const uint8_t helvB14L1_0x2A_BMP[] = { + 0x10, + 0xD6, + 0x7C, + 0x38, + 0x6C, + 0x44 +}; + +static const uint8_t helvB14L1_0x2B_BMP[] = { + 0x18, + 0x18, + 0x18, + 0xFF, + 0xFF, + 0x18, + 0x18, + 0x18 +}; + +static const uint8_t helvB14L1_0x2C_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0x60, + 0xC0, + 0x80 +}; + +static const uint8_t helvB14L1_0x2D_BMP[] = { + 0xF8, + 0xF8, + 0xF8 +}; + +static const uint8_t helvB14L1_0x2E_BMP[] = { + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvB14L1_0x2F_BMP[] = { + 0x18, + 0x18, + 0x18, + 0x38, + 0x30, + 0x30, + 0x30, + 0x70, + 0x60, + 0x60, + 0xE0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB14L1_0x30_BMP[] = { + 0x1C, 0x00, + 0x7F, 0x00, + 0x77, 0x00, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0x77, 0x00, + 0x7F, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t helvB14L1_0x31_BMP[] = { + 0x1C, + 0x3C, + 0xFC, + 0xFC, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C +}; + +static const uint8_t helvB14L1_0x32_BMP[] = { + 0x3E, 0x00, + 0x7F, 0x00, + 0xE3, 0x80, + 0xE3, 0x80, + 0x03, 0x80, + 0x07, 0x00, + 0x1F, 0x00, + 0x3E, 0x00, + 0x78, 0x00, + 0x70, 0x00, + 0xE0, 0x00, + 0xFF, 0x80, + 0xFF, 0x80 +}; + +static const uint8_t helvB14L1_0x33_BMP[] = { + 0x3E, 0x00, + 0x7F, 0x00, + 0xE7, 0x00, + 0xE3, 0x00, + 0x07, 0x00, + 0x1E, 0x00, + 0x1F, 0x00, + 0x07, 0x80, + 0x03, 0x80, + 0xE3, 0x80, + 0xE7, 0x80, + 0x7F, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvB14L1_0x34_BMP[] = { + 0x07, 0x00, + 0x0F, 0x00, + 0x1F, 0x00, + 0x3F, 0x00, + 0x37, 0x00, + 0x77, 0x00, + 0x67, 0x00, + 0xE7, 0x00, + 0xFF, 0x80, + 0xFF, 0x80, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00 +}; + +static const uint8_t helvB14L1_0x35_BMP[] = { + 0xFF, 0x00, + 0xFF, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFE, 0x00, + 0xFF, 0x00, + 0xE7, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0xE3, 0x80, + 0xE7, 0x80, + 0xFF, 0x00, + 0x7E, 0x00 +}; + +static const uint8_t helvB14L1_0x36_BMP[] = { + 0x3F, 0x00, + 0x7F, 0x80, + 0x71, 0x80, + 0xE0, 0x00, + 0xEE, 0x00, + 0xFF, 0x00, + 0xF3, 0x80, + 0xE1, 0x80, + 0xE1, 0x80, + 0xE1, 0x80, + 0xF3, 0x80, + 0x7F, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvB14L1_0x37_BMP[] = { + 0xFF, 0x80, + 0xFF, 0x80, + 0x03, 0x80, + 0x07, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x38, 0x00, + 0x38, 0x00, + 0x70, 0x00, + 0x70, 0x00, + 0x70, 0x00 +}; + +static const uint8_t helvB14L1_0x38_BMP[] = { + 0x3E, 0x00, + 0x7F, 0x00, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0x7F, 0x00, + 0x3E, 0x00, + 0x77, 0x00, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0x7F, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvB14L1_0x39_BMP[] = { + 0x3E, 0x00, + 0x7F, 0x00, + 0xE7, 0x80, + 0xC3, 0x80, + 0xC3, 0x80, + 0xC3, 0x80, + 0xE7, 0x80, + 0x7F, 0x80, + 0x3B, 0x80, + 0x03, 0x80, + 0xC7, 0x00, + 0xFF, 0x00, + 0x7E, 0x00 +}; + +static const uint8_t helvB14L1_0x3A_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0x00, + 0x00, + 0x00, + 0x00, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvB14L1_0x3B_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0x00, + 0x00, + 0x00, + 0x00, + 0xE0, + 0xE0, + 0xE0, + 0x60, + 0xC0, + 0x80 +}; + +static const uint8_t helvB14L1_0x3C_BMP[] = { + 0x03, 0x80, + 0x0F, 0x80, + 0x3E, 0x00, + 0x78, 0x00, + 0xE0, 0x00, + 0x78, 0x00, + 0x3E, 0x00, + 0x0F, 0x80, + 0x03, 0x80 +}; + +static const uint8_t helvB14L1_0x3D_BMP[] = { + 0xFF, 0x80, + 0xFF, 0x80, + 0x00, 0x00, + 0xFF, 0x80, + 0xFF, 0x80 +}; + +static const uint8_t helvB14L1_0x3E_BMP[] = { + 0xE0, 0x00, + 0xF8, 0x00, + 0x3E, 0x00, + 0x0F, 0x00, + 0x03, 0x80, + 0x0F, 0x00, + 0x3E, 0x00, + 0xF8, 0x00, + 0xE0, 0x00 +}; + +static const uint8_t helvB14L1_0x3F_BMP[] = { + 0x7E, + 0xFF, + 0xE7, + 0xE7, + 0x0E, + 0x1E, + 0x1C, + 0x38, + 0x38, + 0x38, + 0x00, + 0x38, + 0x38, + 0x38 +}; + +static const uint8_t helvB14L1_0x40_BMP[] = { + 0x07, 0xF0, + 0x1F, 0xFC, + 0x3C, 0x1E, + 0x70, 0x06, + 0x63, 0xB7, + 0xE7, 0xF3, + 0xC6, 0x63, + 0xCC, 0x63, + 0xCC, 0xC3, + 0xCC, 0xC6, + 0xCC, 0xC6, + 0xEF, 0xFC, + 0xE7, 0xB8, + 0x70, 0x00, + 0x3C, 0x00, + 0x1F, 0xF0, + 0x07, 0xF0 +}; + +static const uint8_t helvB14L1_0x41_BMP[] = { + 0x0F, 0x00, + 0x0F, 0x00, + 0x1F, 0x80, + 0x19, 0x80, + 0x19, 0x80, + 0x39, 0xC0, + 0x39, 0xC0, + 0x30, 0xC0, + 0x70, 0xE0, + 0x7F, 0xE0, + 0x7F, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70 +}; + +static const uint8_t helvB14L1_0x42_BMP[] = { + 0xFE, 0x00, + 0xFF, 0x80, + 0xE3, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE3, 0x80, + 0xFF, 0x80, + 0xFF, 0xC0, + 0xE1, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE1, 0xE0, + 0xFF, 0xC0, + 0xFF, 0x00 +}; + +static const uint8_t helvB14L1_0x43_BMP[] = { + 0x0F, 0x80, + 0x3F, 0xE0, + 0x78, 0xE0, + 0x70, 0x70, + 0xF0, 0x70, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xF0, 0x70, + 0x70, 0x70, + 0x78, 0xE0, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t helvB14L1_0x44_BMP[] = { + 0xFF, 0x00, + 0xFF, 0xC0, + 0xE1, 0xE0, + 0xE0, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0xE0, + 0xE1, 0xE0, + 0xFF, 0xC0, + 0xFF, 0x00 +}; + +static const uint8_t helvB14L1_0x45_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0x80, + 0xFF, 0x80, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t helvB14L1_0x46_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0x80, + 0xFF, 0x80, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00 +}; + +static const uint8_t helvB14L1_0x47_BMP[] = { + 0x0F, 0x80, + 0x3F, 0xE0, + 0x78, 0xE0, + 0x70, 0x70, + 0xF0, 0x70, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE3, 0xF0, + 0xE3, 0xF0, + 0xF0, 0x70, + 0x70, 0x70, + 0x78, 0xF0, + 0x3F, 0xF0, + 0x1F, 0xB0 +}; + +static const uint8_t helvB14L1_0x48_BMP[] = { + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70 +}; + +static const uint8_t helvB14L1_0x49_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvB14L1_0x4A_BMP[] = { + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xF7, 0x80, + 0x7F, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvB14L1_0x4B_BMP[] = { + 0xE0, 0xF0, + 0xE1, 0xE0, + 0xE3, 0xC0, + 0xE7, 0x80, + 0xEF, 0x00, + 0xFE, 0x00, + 0xFC, 0x00, + 0xFE, 0x00, + 0xEF, 0x00, + 0xE7, 0x80, + 0xE3, 0xC0, + 0xE1, 0xE0, + 0xE0, 0xF0, + 0xE0, 0x78 +}; + +static const uint8_t helvB14L1_0x4C_BMP[] = { + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0x80, + 0xFF, 0x80 +}; + +static const uint8_t helvB14L1_0x4D_BMP[] = { + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xF0, 0x3C, + 0xF0, 0x3C, + 0xF8, 0x7C, + 0xF8, 0x7C, + 0xF8, 0x7C, + 0xEC, 0xDC, + 0xEC, 0xDC, + 0xEC, 0xDC, + 0xE7, 0x9C, + 0xE7, 0x9C, + 0xE3, 0x1C, + 0xE3, 0x1C +}; + +static const uint8_t helvB14L1_0x4E_BMP[] = { + 0xE0, 0x70, + 0xF0, 0x70, + 0xF0, 0x70, + 0xF8, 0x70, + 0xFC, 0x70, + 0xEC, 0x70, + 0xEE, 0x70, + 0xE6, 0x70, + 0xE7, 0x70, + 0xE3, 0x70, + 0xE1, 0xF0, + 0xE1, 0xF0, + 0xE0, 0xF0, + 0xE0, 0x70 +}; + +static const uint8_t helvB14L1_0x4F_BMP[] = { + 0x0F, 0x80, + 0x3F, 0xE0, + 0x78, 0xF0, + 0x70, 0x70, + 0xF0, 0x78, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xF0, 0x78, + 0x70, 0x70, + 0x78, 0xF0, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t helvB14L1_0x50_BMP[] = { + 0xFF, 0x00, + 0xFF, 0xC0, + 0xE1, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE1, 0xE0, + 0xFF, 0xC0, + 0xFF, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00 +}; + +static const uint8_t helvB14L1_0x51_BMP[] = { + 0x0F, 0x80, + 0x3F, 0xE0, + 0x78, 0xF0, + 0x70, 0x70, + 0xF0, 0x78, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xF3, 0x78, + 0x73, 0xF0, + 0x79, 0xF0, + 0x3F, 0xE0, + 0x0F, 0xF0, + 0x00, 0x30 +}; + +static const uint8_t helvB14L1_0x52_BMP[] = { + 0xFF, 0x00, + 0xFF, 0xC0, + 0xE1, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE1, 0xE0, + 0xFF, 0xC0, + 0xFF, 0x80, + 0xE1, 0xC0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xF0 +}; + +static const uint8_t helvB14L1_0x53_BMP[] = { + 0x3F, 0x80, + 0x7F, 0xC0, + 0xF1, 0xE0, + 0xE0, 0xE0, + 0xF0, 0x00, + 0x7E, 0x00, + 0x3F, 0x80, + 0x0F, 0xC0, + 0x01, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xF1, 0xE0, + 0x7F, 0xC0, + 0x3F, 0x80 +}; + +static const uint8_t helvB14L1_0x54_BMP[] = { + 0xFF, 0xE0, + 0xFF, 0xE0, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00 +}; + +static const uint8_t helvB14L1_0x55_BMP[] = { + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0x70, 0xE0, + 0x7F, 0xE0, + 0x1F, 0x80 +}; + +static const uint8_t helvB14L1_0x56_BMP[] = { + 0xE0, 0x38, + 0xE0, 0x38, + 0x70, 0x70, + 0x70, 0x70, + 0x30, 0x60, + 0x38, 0xE0, + 0x38, 0xE0, + 0x1D, 0xC0, + 0x1D, 0xC0, + 0x0D, 0x80, + 0x0F, 0x80, + 0x0F, 0x80, + 0x07, 0x00, + 0x07, 0x00 +}; + +static const uint8_t helvB14L1_0x57_BMP[] = { + 0xE3, 0x8E, + 0xE3, 0x8E, + 0xE3, 0x8E, + 0xE3, 0x8E, + 0x73, 0x9C, + 0x73, 0x9C, + 0x73, 0x9C, + 0x76, 0xDC, + 0x36, 0xD8, + 0x36, 0xD8, + 0x3E, 0xF8, + 0x1C, 0x70, + 0x1C, 0x70, + 0x1C, 0x70 +}; + +static const uint8_t helvB14L1_0x58_BMP[] = { + 0xE0, 0x70, + 0xE0, 0x70, + 0x70, 0xE0, + 0x79, 0xE0, + 0x19, 0x80, + 0x1F, 0x80, + 0x0F, 0x00, + 0x1F, 0x80, + 0x19, 0x80, + 0x39, 0xC0, + 0x70, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70 +}; + +static const uint8_t helvB14L1_0x59_BMP[] = { + 0xE0, 0x38, + 0xE0, 0x38, + 0x70, 0x70, + 0x38, 0xE0, + 0x38, 0xE0, + 0x1D, 0xC0, + 0x1D, 0xC0, + 0x0F, 0x80, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00 +}; + +static const uint8_t helvB14L1_0x5A_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x01, 0xC0, + 0x03, 0x80, + 0x07, 0x00, + 0x07, 0x00, + 0x0E, 0x00, + 0x1C, 0x00, + 0x38, 0x00, + 0x38, 0x00, + 0x70, 0x00, + 0xE0, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t helvB14L1_0x5B_BMP[] = { + 0xF8, + 0xF8, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xF8, + 0xF8 +}; + +static const uint8_t helvB14L1_0x5C_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xE0, + 0x60, + 0x60, + 0x60, + 0x70, + 0x30, + 0x30, + 0x38, + 0x18, + 0x18, + 0x18 +}; + +static const uint8_t helvB14L1_0x5D_BMP[] = { + 0xF8, + 0xF8, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0xF8, + 0xF8 +}; + +static const uint8_t helvB14L1_0x5E_BMP[] = { + 0x0C, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x33, 0x00, + 0x73, 0x80, + 0x61, 0x80, + 0xE1, 0xC0 +}; + +static const uint8_t helvB14L1_0x5F_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t helvB14L1_0x60_BMP[] = { + 0xE0, + 0x70, + 0x38 +}; + +static const uint8_t helvB14L1_0x61_BMP[] = { + 0x3E, 0x00, + 0x7F, 0x00, + 0x63, 0x80, + 0x07, 0x80, + 0x3F, 0x80, + 0x7B, 0x80, + 0xE3, 0x80, + 0xE7, 0x80, + 0xFB, 0x80, + 0x7B, 0xC0 +}; + +static const uint8_t helvB14L1_0x62_BMP[] = { + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xEF, 0x00, + 0xFF, 0x80, + 0xF3, 0x80, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xF3, 0x80, + 0xFF, 0x80, + 0xEF, 0x00 +}; + +static const uint8_t helvB14L1_0x63_BMP[] = { + 0x1E, 0x00, + 0x7F, 0x80, + 0x73, 0x80, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0x73, 0x80, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvB14L1_0x64_BMP[] = { + 0x01, 0xC0, + 0x01, 0xC0, + 0x01, 0xC0, + 0x01, 0xC0, + 0x3D, 0xC0, + 0x7F, 0xC0, + 0x73, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0x73, 0xC0, + 0x7F, 0xC0, + 0x3D, 0xC0 +}; + +static const uint8_t helvB14L1_0x65_BMP[] = { + 0x1E, 0x00, + 0x7F, 0x00, + 0x73, 0x80, + 0xE1, 0x80, + 0xFF, 0x80, + 0xFF, 0x80, + 0xE0, 0x00, + 0x73, 0x80, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvB14L1_0x66_BMP[] = { + 0x1E, + 0x3E, + 0x38, + 0x38, + 0xFE, + 0xFE, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38 +}; + +static const uint8_t helvB14L1_0x67_BMP[] = { + 0x3D, 0xC0, + 0x7F, 0xC0, + 0x73, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0x73, 0xC0, + 0x7F, 0xC0, + 0x3D, 0xC0, + 0x01, 0xC0, + 0x73, 0x80, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvB14L1_0x68_BMP[] = { + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xEF, 0x00, + 0xFF, 0x80, + 0xF3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80 +}; + +static const uint8_t helvB14L1_0x69_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0x00, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvB14L1_0x6A_BMP[] = { + 0x38, + 0x38, + 0x38, + 0x00, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0xF8, + 0xF0 +}; + +static const uint8_t helvB14L1_0x6B_BMP[] = { + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE7, 0x00, + 0xEE, 0x00, + 0xFC, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xFC, 0x00, + 0xEE, 0x00, + 0xE7, 0x00, + 0xE7, 0x80, + 0xE3, 0x80 +}; + +static const uint8_t helvB14L1_0x6C_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvB14L1_0x6D_BMP[] = { + 0xEF, 0x3C, + 0xFF, 0xFE, + 0xF3, 0xCE, + 0xE3, 0x8E, + 0xE3, 0x8E, + 0xE3, 0x8E, + 0xE3, 0x8E, + 0xE3, 0x8E, + 0xE3, 0x8E, + 0xE3, 0x8E +}; + +static const uint8_t helvB14L1_0x6E_BMP[] = { + 0xEF, 0x00, + 0xFF, 0x80, + 0xF3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80 +}; + +static const uint8_t helvB14L1_0x6F_BMP[] = { + 0x1E, 0x00, + 0x7F, 0x80, + 0x73, 0x80, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0x73, 0x80, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvB14L1_0x70_BMP[] = { + 0xEF, 0x00, + 0xFF, 0x80, + 0xF3, 0x80, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xF3, 0x80, + 0xFF, 0x80, + 0xEF, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00 +}; + +static const uint8_t helvB14L1_0x71_BMP[] = { + 0x3D, 0xC0, + 0x7F, 0xC0, + 0x73, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0x73, 0xC0, + 0x7F, 0xC0, + 0x3D, 0xC0, + 0x01, 0xC0, + 0x01, 0xC0, + 0x01, 0xC0, + 0x01, 0xC0 +}; + +static const uint8_t helvB14L1_0x72_BMP[] = { + 0xEC, + 0xFC, + 0xFC, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvB14L1_0x73_BMP[] = { + 0x3F, 0x00, + 0x7F, 0x80, + 0xE3, 0x80, + 0xE0, 0x00, + 0xFF, 0x00, + 0x3F, 0x80, + 0x03, 0x80, + 0xE3, 0x80, + 0xFF, 0x00, + 0x7E, 0x00 +}; + +static const uint8_t helvB14L1_0x74_BMP[] = { + 0x70, + 0x70, + 0x70, + 0xFC, + 0xFC, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x7C, + 0x3C +}; + +static const uint8_t helvB14L1_0x75_BMP[] = { + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE7, 0x80, + 0xFF, 0x80, + 0x7B, 0x80 +}; + +static const uint8_t helvB14L1_0x76_BMP[] = { + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0x77, 0x00, + 0x77, 0x00, + 0x77, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x1C, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t helvB14L1_0x77_BMP[] = { + 0xE3, 0x8E, + 0xE3, 0x8E, + 0xE3, 0x8E, + 0x73, 0x9C, + 0x77, 0xDC, + 0x76, 0xDC, + 0x3E, 0xF8, + 0x3C, 0x78, + 0x1C, 0x70, + 0x1C, 0x70 +}; + +static const uint8_t helvB14L1_0x78_BMP[] = { + 0xE3, 0x80, + 0xE3, 0x80, + 0x77, 0x00, + 0x3E, 0x00, + 0x1C, 0x00, + 0x3E, 0x00, + 0x77, 0x00, + 0x77, 0x00, + 0xE3, 0x80, + 0xE3, 0x80 +}; + +static const uint8_t helvB14L1_0x79_BMP[] = { + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0x77, 0x00, + 0x77, 0x00, + 0x77, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x18, 0x00, + 0x78, 0x00, + 0x70, 0x00 +}; + +static const uint8_t helvB14L1_0x7A_BMP[] = { + 0xFF, + 0xFF, + 0x07, + 0x0E, + 0x1C, + 0x38, + 0x70, + 0xE0, + 0xFF, + 0xFF +}; + +static const uint8_t helvB14L1_0x7B_BMP[] = { + 0x0E, + 0x1C, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x70, + 0xE0, + 0x70, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x1C, + 0x0E +}; + +static const uint8_t helvB14L1_0x7C_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB14L1_0x7D_BMP[] = { + 0xE0, + 0x70, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x1C, + 0x0E, + 0x1C, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x70, + 0xE0 +}; + +static const uint8_t helvB14L1_0x7E_BMP[] = { + 0x79, 0x80, + 0xFF, 0x80, + 0xCF, 0x00 +}; + +static const uint8_t helvB14L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t helvB14L1_0xA1_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0x00, + 0x60, + 0x60, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvB14L1_0xA2_BMP[] = { + 0x02, + 0x02, + 0x3E, + 0x7F, + 0xE7, + 0xC8, + 0xC8, + 0xD0, + 0xD0, + 0xE3, + 0x7F, + 0x7E, + 0x40, + 0x40 +}; + +static const uint8_t helvB14L1_0xA3_BMP[] = { + 0x1F, 0x00, + 0x3F, 0xC0, + 0x71, 0xC0, + 0x70, 0x00, + 0x70, 0x00, + 0x38, 0x00, + 0x7F, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x38, 0x00, + 0x70, 0xC0, + 0xFF, 0xC0, + 0xEF, 0x80 +}; + +static const uint8_t helvB14L1_0xA4_BMP[] = { + 0xC1, 0x80, + 0xFF, 0x80, + 0x77, 0x00, + 0x63, 0x00, + 0x63, 0x00, + 0x77, 0x00, + 0xFF, 0x80, + 0xC1, 0x80 +}; + +static const uint8_t helvB14L1_0xA5_BMP[] = { + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0x77, 0x00, + 0x77, 0x00, + 0x3E, 0x00, + 0xFF, 0x80, + 0x1C, 0x00, + 0xFF, 0x80, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t helvB14L1_0xA6_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x00, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB14L1_0xA7_BMP[] = { + 0x3E, 0x00, + 0x7F, 0x00, + 0xE3, 0x80, + 0xE3, 0x80, + 0xF0, 0x00, + 0x7C, 0x00, + 0xFE, 0x00, + 0xC7, 0x00, + 0xC3, 0x80, + 0xE1, 0x80, + 0x71, 0x80, + 0x3F, 0x80, + 0x0F, 0x00, + 0x07, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0x7F, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvB14L1_0xA8_BMP[] = { + 0xD8, + 0xD8 +}; + +static const uint8_t helvB14L1_0xA9_BMP[] = { + 0x0F, 0xC0, + 0x38, 0x70, + 0x60, 0x18, + 0xC7, 0x8C, + 0xCF, 0xCC, + 0x98, 0xC4, + 0x98, 0x04, + 0x98, 0x04, + 0x98, 0x44, + 0xCF, 0xCC, + 0xC7, 0x8C, + 0x60, 0x18, + 0x38, 0x70, + 0x0F, 0xC0 +}; + +static const uint8_t helvB14L1_0xAA_BMP[] = { + 0x78, + 0x8C, + 0x7C, + 0xCC, + 0xCC, + 0x74, + 0x00, + 0xFC, + 0xFC +}; + +static const uint8_t helvB14L1_0xAB_BMP[] = { + 0x1D, 0xC0, + 0x3B, 0x80, + 0x77, 0x00, + 0xEE, 0x00, + 0xEE, 0x00, + 0x77, 0x00, + 0x3B, 0x80, + 0x1D, 0xC0 +}; + +static const uint8_t helvB14L1_0xAC_BMP[] = { + 0xFF, 0x80, + 0xFF, 0x80, + 0x01, 0x80, + 0x01, 0x80, + 0x01, 0x80 +}; + +static const uint8_t helvB14L1_0xAD_BMP[] = { + 0xF8, + 0xF8, + 0xF8 +}; + +static const uint8_t helvB14L1_0xAE_BMP[] = { + 0x0F, 0x80, + 0x30, 0x60, + 0x60, 0x10, + 0x5F, 0x90, + 0x99, 0xC8, + 0x98, 0xC8, + 0x99, 0xC8, + 0x9F, 0x08, + 0x99, 0x88, + 0x99, 0x88, + 0x58, 0xD0, + 0x60, 0x30, + 0x38, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t helvB14L1_0xAF_BMP[] = { + 0xF8, + 0xF8 +}; + +static const uint8_t helvB14L1_0xB0_BMP[] = { + 0x78, + 0xFC, + 0xCC, + 0xCC, + 0xFC, + 0x78 +}; + +static const uint8_t helvB14L1_0xB1_BMP[] = { + 0x1C, 0x00, + 0x1C, 0x00, + 0xFF, 0x80, + 0xFF, 0x80, + 0x1C, 0x00, + 0x1C, 0x00, + 0x00, 0x00, + 0xFF, 0x80, + 0xFF, 0x80 +}; + +static const uint8_t helvB14L1_0xB2_BMP[] = { + 0x78, + 0xFC, + 0xCC, + 0x1C, + 0x78, + 0xE0, + 0xFC, + 0xFC +}; + +static const uint8_t helvB14L1_0xB3_BMP[] = { + 0x78, + 0xFC, + 0xCC, + 0x38, + 0x3C, + 0xCC, + 0xFC, + 0x78 +}; + +static const uint8_t helvB14L1_0xB4_BMP[] = { + 0x38, + 0x70, + 0xE0 +}; + +static const uint8_t helvB14L1_0xB5_BMP[] = { + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE7, 0x80, + 0xFF, 0x80, + 0xFB, 0x80, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00 +}; + +static const uint8_t helvB14L1_0xB6_BMP[] = { + 0x3F, 0x80, + 0x7B, 0x00, + 0xFB, 0x00, + 0xFB, 0x00, + 0xFB, 0x00, + 0xFB, 0x00, + 0xFB, 0x00, + 0x7B, 0x00, + 0x3B, 0x00, + 0x1B, 0x00, + 0x1B, 0x00, + 0x1B, 0x00, + 0x1B, 0x00, + 0x1B, 0x00, + 0x1B, 0x00, + 0x1B, 0x00, + 0x1B, 0x00, + 0x1B, 0x00 +}; + +static const uint8_t helvB14L1_0xB7_BMP[] = { + 0xC0, + 0xC0 +}; + +static const uint8_t helvB14L1_0xB8_BMP[] = { + 0x60, + 0x70, + 0x18, + 0xF8, + 0xF0 +}; + +static const uint8_t helvB14L1_0xB9_BMP[] = { + 0x30, + 0xF0, + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30 +}; + +static const uint8_t helvB14L1_0xBA_BMP[] = { + 0x78, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0x78, + 0x00, + 0xFC, + 0xFC +}; + +static const uint8_t helvB14L1_0xBB_BMP[] = { + 0xEE, 0x00, + 0x77, 0x00, + 0x3B, 0x80, + 0x1D, 0xC0, + 0x1D, 0xC0, + 0x3B, 0x80, + 0x77, 0x00, + 0xEE, 0x00 +}; + +static const uint8_t helvB14L1_0xBC_BMP[] = { + 0x30, 0x60, + 0xF0, 0x60, + 0xF0, 0xC0, + 0x30, 0xC0, + 0x31, 0x80, + 0x31, 0x98, + 0x33, 0x38, + 0x36, 0x38, + 0x06, 0x78, + 0x0C, 0xD8, + 0x0C, 0xFC, + 0x18, 0x18, + 0x18, 0x18 +}; + +static const uint8_t helvB14L1_0xBD_BMP[] = { + 0x30, 0x60, + 0xF0, 0x60, + 0xF0, 0xC0, + 0x30, 0xC0, + 0x31, 0x80, + 0x31, 0xBC, + 0x33, 0x7E, + 0x36, 0x66, + 0x06, 0x0E, + 0x0C, 0x3C, + 0x0C, 0x70, + 0x18, 0x7E, + 0x18, 0x7E +}; + +static const uint8_t helvB14L1_0xBE_BMP[] = { + 0x78, 0x30, + 0xFC, 0x30, + 0xCC, 0x60, + 0x38, 0x60, + 0x3C, 0xC0, + 0xCC, 0xD8, + 0xFD, 0xB8, + 0x7B, 0x38, + 0x03, 0x78, + 0x06, 0xD8, + 0x06, 0xFC, + 0x0C, 0x18, + 0x0C, 0x18 +}; + +static const uint8_t helvB14L1_0xBF_BMP[] = { + 0x1C, + 0x1C, + 0x1C, + 0x00, + 0x1C, + 0x1C, + 0x1C, + 0x38, + 0x78, + 0x70, + 0xE7, + 0xE7, + 0xFF, + 0x7E +}; + +static const uint8_t helvB14L1_0xC0_BMP[] = { + 0x38, 0x00, + 0x1C, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0x0F, 0x00, + 0x0F, 0x00, + 0x1F, 0x80, + 0x19, 0x80, + 0x19, 0x80, + 0x39, 0xC0, + 0x39, 0xC0, + 0x30, 0xC0, + 0x70, 0xE0, + 0x7F, 0xE0, + 0x7F, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70 +}; + +static const uint8_t helvB14L1_0xC1_BMP[] = { + 0x01, 0xC0, + 0x03, 0x80, + 0x06, 0x00, + 0x00, 0x00, + 0x0F, 0x00, + 0x0F, 0x00, + 0x1F, 0x80, + 0x19, 0x80, + 0x19, 0x80, + 0x39, 0xC0, + 0x39, 0xC0, + 0x30, 0xC0, + 0x70, 0xE0, + 0x7F, 0xE0, + 0x7F, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70 +}; + +static const uint8_t helvB14L1_0xC2_BMP[] = { + 0x07, 0x00, + 0x0F, 0x80, + 0x1D, 0xC0, + 0x00, 0x00, + 0x0F, 0x00, + 0x0F, 0x00, + 0x1F, 0x80, + 0x19, 0x80, + 0x19, 0x80, + 0x39, 0xC0, + 0x39, 0xC0, + 0x30, 0xC0, + 0x70, 0xE0, + 0x7F, 0xE0, + 0x7F, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70 +}; + +static const uint8_t helvB14L1_0xC3_BMP[] = { + 0x0E, 0x20, + 0x1F, 0xC0, + 0x23, 0x80, + 0x00, 0x00, + 0x0F, 0x00, + 0x0F, 0x00, + 0x1F, 0x80, + 0x19, 0x80, + 0x19, 0x80, + 0x39, 0xC0, + 0x39, 0xC0, + 0x30, 0xC0, + 0x70, 0xE0, + 0x7F, 0xE0, + 0x7F, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70 +}; + +static const uint8_t helvB14L1_0xC4_BMP[] = { + 0x19, 0x80, + 0x19, 0x80, + 0x19, 0x80, + 0x00, 0x00, + 0x0F, 0x00, + 0x0F, 0x00, + 0x1F, 0x80, + 0x19, 0x80, + 0x19, 0x80, + 0x39, 0xC0, + 0x39, 0xC0, + 0x30, 0xC0, + 0x70, 0xE0, + 0x7F, 0xE0, + 0x7F, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70 +}; + +static const uint8_t helvB14L1_0xC5_BMP[] = { + 0x0F, 0x00, + 0x19, 0x80, + 0x19, 0x80, + 0x0F, 0x00, + 0x0F, 0x00, + 0x0F, 0x00, + 0x1F, 0x80, + 0x19, 0x80, + 0x19, 0x80, + 0x39, 0xC0, + 0x39, 0xC0, + 0x30, 0xC0, + 0x70, 0xE0, + 0x7F, 0xE0, + 0x7F, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70 +}; + +static const uint8_t helvB14L1_0xC6_BMP[] = { + 0x0F, 0xFF, + 0x0F, 0xFF, + 0x1F, 0x80, + 0x1B, 0x80, + 0x3B, 0x80, + 0x3B, 0x80, + 0x33, 0xFE, + 0x73, 0xFE, + 0x73, 0x80, + 0x7F, 0x80, + 0xFF, 0x80, + 0xE3, 0x80, + 0xE3, 0xFF, + 0xE3, 0xFF +}; + +static const uint8_t helvB14L1_0xC7_BMP[] = { + 0x0F, 0x80, + 0x3F, 0xE0, + 0x78, 0xE0, + 0x70, 0x70, + 0xF0, 0x70, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xF0, 0x70, + 0x70, 0x70, + 0x78, 0xE0, + 0x3F, 0xE0, + 0x0F, 0x80, + 0x0C, 0x00, + 0x0E, 0x00, + 0x03, 0x00, + 0x1F, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t helvB14L1_0xC8_BMP[] = { + 0x38, 0x00, + 0x1C, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0x80, + 0xFF, 0x80, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t helvB14L1_0xC9_BMP[] = { + 0x03, 0x80, + 0x07, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0x80, + 0xFF, 0x80, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t helvB14L1_0xCA_BMP[] = { + 0x0E, 0x00, + 0x1F, 0x00, + 0x3B, 0x80, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0x80, + 0xFF, 0x80, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t helvB14L1_0xCB_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0x80, + 0xFF, 0x80, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t helvB14L1_0xCC_BMP[] = { + 0xE0, + 0x70, + 0x18, + 0x00, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38 +}; + +static const uint8_t helvB14L1_0xCD_BMP[] = { + 0x38, + 0x70, + 0xC0, + 0x00, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvB14L1_0xCE_BMP[] = { + 0x38, + 0x7C, + 0xEE, + 0x00, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38 +}; + +static const uint8_t helvB14L1_0xCF_BMP[] = { + 0xCC, + 0xCC, + 0xCC, + 0x00, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70 +}; + +static const uint8_t helvB14L1_0xD0_BMP[] = { + 0x3F, 0xC0, + 0x3F, 0xF0, + 0x38, 0x78, + 0x38, 0x38, + 0x38, 0x1C, + 0x38, 0x1C, + 0xFF, 0x1C, + 0xFF, 0x1C, + 0x38, 0x1C, + 0x38, 0x1C, + 0x38, 0x38, + 0x38, 0x78, + 0x3F, 0xF0, + 0x3F, 0xC0 +}; + +static const uint8_t helvB14L1_0xD1_BMP[] = { + 0x0E, 0x20, + 0x1F, 0xC0, + 0x23, 0x80, + 0x00, 0x00, + 0xE0, 0x70, + 0xF0, 0x70, + 0xF0, 0x70, + 0xF8, 0x70, + 0xFC, 0x70, + 0xEC, 0x70, + 0xEE, 0x70, + 0xE6, 0x70, + 0xE7, 0x70, + 0xE3, 0x70, + 0xE1, 0xF0, + 0xE1, 0xF0, + 0xE0, 0xF0, + 0xE0, 0x70 +}; + +static const uint8_t helvB14L1_0xD2_BMP[] = { + 0x1C, 0x00, + 0x0E, 0x00, + 0x03, 0x00, + 0x00, 0x00, + 0x0F, 0x80, + 0x3F, 0xE0, + 0x78, 0xF0, + 0x70, 0x70, + 0xF0, 0x78, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xF0, 0x78, + 0x70, 0x70, + 0x78, 0xF0, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t helvB14L1_0xD3_BMP[] = { + 0x01, 0xC0, + 0x03, 0x80, + 0x06, 0x00, + 0x00, 0x00, + 0x0F, 0x80, + 0x3F, 0xE0, + 0x78, 0xF0, + 0x70, 0x70, + 0xF0, 0x78, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xF0, 0x78, + 0x70, 0x70, + 0x78, 0xF0, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t helvB14L1_0xD4_BMP[] = { + 0x07, 0x00, + 0x0F, 0x80, + 0x1D, 0xC0, + 0x00, 0x00, + 0x0F, 0x80, + 0x3F, 0xE0, + 0x78, 0xF0, + 0x70, 0x70, + 0xF0, 0x78, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xF0, 0x78, + 0x70, 0x70, + 0x78, 0xF0, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t helvB14L1_0xD5_BMP[] = { + 0x07, 0x10, + 0x0F, 0xE0, + 0x11, 0xC0, + 0x00, 0x00, + 0x0F, 0x80, + 0x3F, 0xE0, + 0x78, 0xF0, + 0x70, 0x70, + 0xF0, 0x78, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xF0, 0x78, + 0x70, 0x70, + 0x78, 0xF0, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t helvB14L1_0xD6_BMP[] = { + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x00, 0x00, + 0x0F, 0x80, + 0x3F, 0xE0, + 0x78, 0xF0, + 0x70, 0x70, + 0xF0, 0x78, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xF0, 0x78, + 0x70, 0x70, + 0x78, 0xF0, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t helvB14L1_0xD7_BMP[] = { + 0xE1, 0xC0, + 0x73, 0x80, + 0x3F, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x3F, 0x00, + 0x73, 0x80, + 0xE1, 0xC0 +}; + +static const uint8_t helvB14L1_0xD8_BMP[] = { + 0x07, 0xC6, + 0x1F, 0xFC, + 0x3C, 0x38, + 0x38, 0x78, + 0x78, 0xDC, + 0x71, 0x9C, + 0x71, 0x1C, + 0x73, 0x1C, + 0x76, 0x1C, + 0x7C, 0x3C, + 0x38, 0x38, + 0x3C, 0x78, + 0x7F, 0xF0, + 0xC7, 0xC0 +}; + +static const uint8_t helvB14L1_0xD9_BMP[] = { + 0x1C, 0x00, + 0x0E, 0x00, + 0x03, 0x00, + 0x00, 0x00, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0x70, 0xE0, + 0x7F, 0xE0, + 0x1F, 0x80 +}; + +static const uint8_t helvB14L1_0xDA_BMP[] = { + 0x01, 0xC0, + 0x03, 0x80, + 0x06, 0x00, + 0x00, 0x00, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0x70, 0xE0, + 0x7F, 0xE0, + 0x1F, 0x80 +}; + +static const uint8_t helvB14L1_0xDB_BMP[] = { + 0x07, 0x00, + 0x0F, 0x80, + 0x1D, 0xC0, + 0x00, 0x00, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0x70, 0xE0, + 0x7F, 0xE0, + 0x1F, 0x80 +}; + +static const uint8_t helvB14L1_0xDC_BMP[] = { + 0x19, 0x80, + 0x19, 0x80, + 0x19, 0x80, + 0x00, 0x00, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0x70, 0xE0, + 0x7F, 0xE0, + 0x1F, 0x80 +}; + +static const uint8_t helvB14L1_0xDD_BMP[] = { + 0x01, 0xC0, + 0x03, 0x80, + 0x06, 0x00, + 0x00, 0x00, + 0xE0, 0x38, + 0xE0, 0x38, + 0x70, 0x70, + 0x38, 0xE0, + 0x38, 0xE0, + 0x1D, 0xC0, + 0x1D, 0xC0, + 0x0F, 0x80, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00 +}; + +static const uint8_t helvB14L1_0xDE_BMP[] = { + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0x00, + 0xFF, 0xC0, + 0xE1, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE1, 0xE0, + 0xFF, 0xC0, + 0xFF, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00 +}; + +static const uint8_t helvB14L1_0xDF_BMP[] = { + 0x3C, + 0x7E, + 0xE7, + 0xE7, + 0xE7, + 0xE7, + 0xEE, + 0xEE, + 0xE7, + 0xE7, + 0xE7, + 0xE7, + 0xEF, + 0xEE +}; + +static const uint8_t helvB14L1_0xE0_BMP[] = { + 0x70, 0x00, + 0x38, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x3E, 0x00, + 0x7F, 0x00, + 0x73, 0x80, + 0x07, 0x80, + 0x3F, 0x80, + 0x7B, 0x80, + 0xE3, 0x80, + 0xE7, 0x80, + 0xFB, 0x80, + 0x7B, 0xC0 +}; + +static const uint8_t helvB14L1_0xE1_BMP[] = { + 0x03, 0x80, + 0x07, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x3E, 0x00, + 0x7F, 0x00, + 0x73, 0x80, + 0x07, 0x80, + 0x3F, 0x80, + 0x7B, 0x80, + 0xE3, 0x80, + 0xE7, 0x80, + 0xFB, 0x80, + 0x7B, 0xC0 +}; + +static const uint8_t helvB14L1_0xE2_BMP[] = { + 0x1C, 0x00, + 0x3E, 0x00, + 0x77, 0x00, + 0x00, 0x00, + 0x3E, 0x00, + 0x7F, 0x00, + 0x73, 0x80, + 0x07, 0x80, + 0x3F, 0x80, + 0x7B, 0x80, + 0xE3, 0x80, + 0xE7, 0x80, + 0xFB, 0x80, + 0x7B, 0xC0 +}; + +static const uint8_t helvB14L1_0xE3_BMP[] = { + 0x3B, 0x00, + 0x7F, 0x00, + 0x6E, 0x00, + 0x00, 0x00, + 0x3E, 0x00, + 0x7F, 0x00, + 0x73, 0x80, + 0x07, 0x80, + 0x3F, 0x80, + 0x7B, 0x80, + 0xE3, 0x80, + 0xE7, 0x80, + 0xFB, 0x80, + 0x7B, 0xC0 +}; + +static const uint8_t helvB14L1_0xE4_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0x3E, 0x00, + 0x7F, 0x00, + 0x73, 0x80, + 0x07, 0x80, + 0x3F, 0x80, + 0x7B, 0x80, + 0xE3, 0x80, + 0xE7, 0x80, + 0xFB, 0x80, + 0x7B, 0xC0 +}; + +static const uint8_t helvB14L1_0xE5_BMP[] = { + 0x3C, 0x00, + 0x66, 0x00, + 0x66, 0x00, + 0x3C, 0x00, + 0x3E, 0x00, + 0x7F, 0x00, + 0x73, 0x80, + 0x07, 0x80, + 0x3F, 0x80, + 0x7B, 0x80, + 0xE3, 0x80, + 0xE7, 0x80, + 0xFB, 0x80, + 0x7B, 0xC0 +}; + +static const uint8_t helvB14L1_0xE6_BMP[] = { + 0x3D, 0xF0, + 0x7F, 0xF8, + 0x67, 0x1C, + 0x0F, 0x1C, + 0x3F, 0xFC, + 0x77, 0x00, + 0xE7, 0x00, + 0xEF, 0x9C, + 0xFF, 0xFC, + 0x79, 0xF0 +}; + +static const uint8_t helvB14L1_0xE7_BMP[] = { + 0x1E, 0x00, + 0x7F, 0x80, + 0x73, 0x80, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0x73, 0x80, + 0x7F, 0x80, + 0x1E, 0x00, + 0x18, 0x00, + 0x1C, 0x00, + 0x06, 0x00, + 0x3E, 0x00, + 0x3C, 0x00 +}; + +static const uint8_t helvB14L1_0xE8_BMP[] = { + 0x70, 0x00, + 0x38, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x7F, 0x00, + 0x73, 0x80, + 0xE1, 0x80, + 0xFF, 0x80, + 0xFF, 0x80, + 0xE0, 0x00, + 0x73, 0x80, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvB14L1_0xE9_BMP[] = { + 0x03, 0x80, + 0x07, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x7F, 0x00, + 0x73, 0x80, + 0xE1, 0x80, + 0xFF, 0x80, + 0xFF, 0x80, + 0xE0, 0x00, + 0x73, 0x80, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvB14L1_0xEA_BMP[] = { + 0x1C, 0x00, + 0x3E, 0x00, + 0x77, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x7F, 0x00, + 0x73, 0x80, + 0xE1, 0x80, + 0xFF, 0x80, + 0xFF, 0x80, + 0xE0, 0x00, + 0x73, 0x80, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvB14L1_0xEB_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x7F, 0x00, + 0x73, 0x80, + 0xE1, 0x80, + 0xFF, 0x80, + 0xFF, 0x80, + 0xE0, 0x00, + 0x73, 0x80, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvB14L1_0xEC_BMP[] = { + 0xE0, + 0x70, + 0x18, + 0x00, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38 +}; + +static const uint8_t helvB14L1_0xED_BMP[] = { + 0x38, + 0x70, + 0xC0, + 0x00, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvB14L1_0xEE_BMP[] = { + 0x38, + 0x7C, + 0xEE, + 0x00, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38 +}; + +static const uint8_t helvB14L1_0xEF_BMP[] = { + 0xD8, + 0xD8, + 0xD8, + 0x00, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70 +}; + +static const uint8_t helvB14L1_0xF0_BMP[] = { + 0x60, 0x00, + 0x37, 0x00, + 0x3C, 0x00, + 0x66, 0x00, + 0x1F, 0x00, + 0x7F, 0x80, + 0x73, 0x80, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0x73, 0x80, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvB14L1_0xF1_BMP[] = { + 0x3B, 0x00, + 0x7F, 0x00, + 0x6E, 0x00, + 0x00, 0x00, + 0xEF, 0x00, + 0xFF, 0x80, + 0xF3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80 +}; + +static const uint8_t helvB14L1_0xF2_BMP[] = { + 0x70, 0x00, + 0x38, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x7F, 0x80, + 0x73, 0x80, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0x73, 0x80, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvB14L1_0xF3_BMP[] = { + 0x03, 0x80, + 0x07, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x7F, 0x80, + 0x73, 0x80, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0x73, 0x80, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvB14L1_0xF4_BMP[] = { + 0x1C, 0x00, + 0x3E, 0x00, + 0x77, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x7F, 0x80, + 0x73, 0x80, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0x73, 0x80, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvB14L1_0xF5_BMP[] = { + 0x3B, 0x00, + 0x7F, 0x00, + 0x6E, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x7F, 0x80, + 0x73, 0x80, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0x73, 0x80, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvB14L1_0xF6_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x7F, 0x80, + 0x73, 0x80, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0x73, 0x80, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvB14L1_0xF7_BMP[] = { + 0x1C, 0x00, + 0x1C, 0x00, + 0x00, 0x00, + 0xFF, 0x80, + 0xFF, 0x80, + 0x00, 0x00, + 0x1C, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t helvB14L1_0xF8_BMP[] = { + 0x0F, 0x30, + 0x3F, 0xE0, + 0x39, 0xC0, + 0x73, 0xE0, + 0x77, 0xE0, + 0x7E, 0xE0, + 0x7C, 0xE0, + 0x39, 0xC0, + 0x7F, 0xC0, + 0xCF, 0x00 +}; + +static const uint8_t helvB14L1_0xF9_BMP[] = { + 0x70, 0x00, + 0x38, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE7, 0x80, + 0xFF, 0x80, + 0x7B, 0x80 +}; + +static const uint8_t helvB14L1_0xFA_BMP[] = { + 0x03, 0x80, + 0x07, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE7, 0x80, + 0xFF, 0x80, + 0x7B, 0x80 +}; + +static const uint8_t helvB14L1_0xFB_BMP[] = { + 0x1C, 0x00, + 0x3E, 0x00, + 0x77, 0x00, + 0x00, 0x00, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE7, 0x80, + 0xFF, 0x80, + 0x7B, 0x80 +}; + +static const uint8_t helvB14L1_0xFC_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE7, 0x80, + 0xFF, 0x80, + 0x7B, 0x80 +}; + +static const uint8_t helvB14L1_0xFD_BMP[] = { + 0x07, 0x00, + 0x0E, 0x00, + 0x18, 0x00, + 0x00, 0x00, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0x77, 0x00, + 0x77, 0x00, + 0x77, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x18, 0x00, + 0x78, 0x00, + 0x70, 0x00 +}; + +static const uint8_t helvB14L1_0xFE_BMP[] = { + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xEF, 0x00, + 0xFF, 0x80, + 0xF3, 0x80, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xF3, 0x80, + 0xFF, 0x80, + 0xEF, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00 +}; + +static const uint8_t helvB14L1_0xFF_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0x77, 0x00, + 0x77, 0x00, + 0x77, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x18, 0x00, + 0x78, 0x00, + 0x70, 0x00 +}; + +static const GFONT_CharInfo FontBMP[] = { + {14, 11, 13, 1, 0, helvB14L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {5, 1, 1, 0, 0, helvB14L1_0x20_BMP}, + {5, 3, 14, 1, 0, helvB14L1_0x21_BMP}, + {7, 5, 5, 1, 9, helvB14L1_0x22_BMP}, + {11, 11, 13, 0, 0, helvB14L1_0x23_BMP}, + {10, 10, 16, 0, -2, helvB14L1_0x24_BMP}, + {16, 13, 13, 1, 0, helvB14L1_0x25_BMP}, + {14, 13, 14, 1, 0, helvB14L1_0x26_BMP}, + {4, 2, 5, 1, 9, helvB14L1_0x27_BMP}, + {7, 6, 18, 1, -4, helvB14L1_0x28_BMP}, + {7, 6, 18, 0, -4, helvB14L1_0x29_BMP}, + {9, 7, 6, 1, 8, helvB14L1_0x2A_BMP}, + {11, 8, 8, 1, 1, helvB14L1_0x2B_BMP}, + {5, 3, 6, 1, -3, helvB14L1_0x2C_BMP}, + {6, 5, 3, 0, 4, helvB14L1_0x2D_BMP}, + {5, 3, 3, 1, 0, helvB14L1_0x2E_BMP}, + {5, 5, 14, 0, 0, helvB14L1_0x2F_BMP}, + {10, 9, 13, 0, 0, helvB14L1_0x30_BMP}, + {10, 6, 13, 1, 0, helvB14L1_0x31_BMP}, + {10, 9, 13, 0, 0, helvB14L1_0x32_BMP}, + {10, 9, 13, 0, 0, helvB14L1_0x33_BMP}, + {10, 9, 13, 0, 0, helvB14L1_0x34_BMP}, + {10, 9, 13, 0, 0, helvB14L1_0x35_BMP}, + {10, 9, 13, 0, 0, helvB14L1_0x36_BMP}, + {10, 9, 13, 0, 0, helvB14L1_0x37_BMP}, + {10, 9, 13, 0, 0, helvB14L1_0x38_BMP}, + {10, 9, 13, 0, 0, helvB14L1_0x39_BMP}, + {6, 3, 10, 1, 0, helvB14L1_0x3A_BMP}, + {6, 3, 13, 1, -3, helvB14L1_0x3B_BMP}, + {11, 9, 9, 1, 0, helvB14L1_0x3C_BMP}, + {11, 9, 5, 1, 3, helvB14L1_0x3D_BMP}, + {11, 9, 9, 1, 0, helvB14L1_0x3E_BMP}, + {10, 8, 14, 1, 0, helvB14L1_0x3F_BMP}, + {18, 16, 17, 1, -3, helvB14L1_0x40_BMP}, + {14, 12, 14, 1, 0, helvB14L1_0x41_BMP}, + {14, 11, 14, 2, 0, helvB14L1_0x42_BMP}, + {14, 12, 14, 1, 0, helvB14L1_0x43_BMP}, + {14, 12, 14, 1, 0, helvB14L1_0x44_BMP}, + {13, 10, 14, 2, 0, helvB14L1_0x45_BMP}, + {12, 10, 14, 1, 0, helvB14L1_0x46_BMP}, + {15, 12, 14, 1, 0, helvB14L1_0x47_BMP}, + {14, 12, 14, 1, 0, helvB14L1_0x48_BMP}, + {5, 3, 14, 1, 0, helvB14L1_0x49_BMP}, + {10, 9, 14, 0, 0, helvB14L1_0x4A_BMP}, + {14, 13, 14, 1, 0, helvB14L1_0x4B_BMP}, + {11, 9, 14, 1, 0, helvB14L1_0x4C_BMP}, + {16, 14, 14, 1, 0, helvB14L1_0x4D_BMP}, + {14, 12, 14, 1, 0, helvB14L1_0x4E_BMP}, + {15, 13, 14, 1, 0, helvB14L1_0x4F_BMP}, + {13, 11, 14, 1, 0, helvB14L1_0x50_BMP}, + {15, 13, 15, 1, -1, helvB14L1_0x51_BMP}, + {14, 12, 14, 1, 0, helvB14L1_0x52_BMP}, + {13, 11, 14, 1, 0, helvB14L1_0x53_BMP}, + {11, 11, 14, 0, 0, helvB14L1_0x54_BMP}, + {14, 12, 14, 1, 0, helvB14L1_0x55_BMP}, + {13, 13, 14, 0, 0, helvB14L1_0x56_BMP}, + {17, 15, 14, 1, 0, helvB14L1_0x57_BMP}, + {12, 12, 14, 0, 0, helvB14L1_0x58_BMP}, + {13, 13, 14, 0, 0, helvB14L1_0x59_BMP}, + {12, 10, 14, 1, 0, helvB14L1_0x5A_BMP}, + {6, 5, 18, 1, -4, helvB14L1_0x5B_BMP}, + {5, 5, 14, 0, 0, helvB14L1_0x5C_BMP}, + {6, 5, 18, 0, -4, helvB14L1_0x5D_BMP}, + {10, 10, 7, 0, 6, helvB14L1_0x5E_BMP}, + {10, 10, 2, 0, -4, helvB14L1_0x5F_BMP}, + {5, 5, 3, 0, 11, helvB14L1_0x60_BMP}, + {11, 10, 10, 1, 0, helvB14L1_0x61_BMP}, + {12, 10, 14, 1, 0, helvB14L1_0x62_BMP}, + {11, 9, 10, 1, 0, helvB14L1_0x63_BMP}, + {12, 10, 14, 1, 0, helvB14L1_0x64_BMP}, + {11, 9, 10, 1, 0, helvB14L1_0x65_BMP}, + {7, 7, 14, 0, 0, helvB14L1_0x66_BMP}, + {12, 10, 14, 1, -4, helvB14L1_0x67_BMP}, + {11, 9, 14, 1, 0, helvB14L1_0x68_BMP}, + {5, 3, 14, 1, 0, helvB14L1_0x69_BMP}, + {5, 5, 18, -1, -4, helvB14L1_0x6A_BMP}, + {10, 9, 14, 1, 0, helvB14L1_0x6B_BMP}, + {5, 3, 14, 1, 0, helvB14L1_0x6C_BMP}, + {17, 15, 10, 1, 0, helvB14L1_0x6D_BMP}, + {11, 9, 10, 1, 0, helvB14L1_0x6E_BMP}, + {12, 10, 10, 1, 0, helvB14L1_0x6F_BMP}, + {12, 10, 14, 1, -4, helvB14L1_0x70_BMP}, + {12, 10, 14, 1, -4, helvB14L1_0x71_BMP}, + {7, 6, 10, 1, 0, helvB14L1_0x72_BMP}, + {11, 9, 10, 1, 0, helvB14L1_0x73_BMP}, + {6, 6, 13, 0, 0, helvB14L1_0x74_BMP}, + {11, 9, 10, 1, 0, helvB14L1_0x75_BMP}, + {9, 9, 10, 0, 0, helvB14L1_0x76_BMP}, + {15, 15, 10, 0, 0, helvB14L1_0x77_BMP}, + {11, 9, 10, 1, 0, helvB14L1_0x78_BMP}, + {11, 9, 14, 1, -4, helvB14L1_0x79_BMP}, + {10, 8, 10, 1, 0, helvB14L1_0x7A_BMP}, + {8, 7, 18, 1, -4, helvB14L1_0x7B_BMP}, + {5, 2, 18, 1, -4, helvB14L1_0x7C_BMP}, + {8, 7, 18, 0, -4, helvB14L1_0x7D_BMP}, + {11, 9, 3, 1, 4, helvB14L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {5, 1, 1, 0, 0, helvB14L1_0xA0_BMP}, + {6, 3, 14, 2, -4, helvB14L1_0xA1_BMP}, + {10, 8, 14, 1, -2, helvB14L1_0xA2_BMP}, + {11, 10, 13, 0, 0, helvB14L1_0xA3_BMP}, + {11, 9, 8, 1, 2, helvB14L1_0xA4_BMP}, + {10, 9, 13, 0, 0, helvB14L1_0xA5_BMP}, + {5, 2, 18, 1, -4, helvB14L1_0xA6_BMP}, + {10, 9, 18, 0, -4, helvB14L1_0xA7_BMP}, + {7, 5, 2, 1, 12, helvB14L1_0xA8_BMP}, + {15, 14, 14, 1, 0, helvB14L1_0xA9_BMP}, + {8, 6, 9, 1, 5, helvB14L1_0xAA_BMP}, + {11, 10, 8, 0, 1, helvB14L1_0xAB_BMP}, + {11, 9, 5, 1, 3, helvB14L1_0xAC_BMP}, + {6, 5, 3, 0, 4, helvB14L1_0xAD_BMP}, + {15, 13, 14, 1, 0, helvB14L1_0xAE_BMP}, + {7, 5, 2, 1, 12, helvB14L1_0xAF_BMP}, + {7, 6, 6, 0, 7, helvB14L1_0xB0_BMP}, + {11, 9, 9, 1, 0, helvB14L1_0xB1_BMP}, + {6, 6, 8, 0, 5, helvB14L1_0xB2_BMP}, + {6, 6, 8, 0, 5, helvB14L1_0xB3_BMP}, + {5, 5, 3, 0, 11, helvB14L1_0xB4_BMP}, + {11, 9, 14, 1, -4, helvB14L1_0xB5_BMP}, + {10, 9, 18, 0, -4, helvB14L1_0xB6_BMP}, + {5, 2, 2, 1, 6, helvB14L1_0xB7_BMP}, + {7, 5, 5, 1, -5, helvB14L1_0xB8_BMP}, + {6, 4, 8, 0, 5, helvB14L1_0xB9_BMP}, + {8, 6, 9, 1, 5, helvB14L1_0xBA_BMP}, + {11, 10, 8, 0, 1, helvB14L1_0xBB_BMP}, + {15, 14, 13, 0, 0, helvB14L1_0xBC_BMP}, + {15, 15, 13, 0, 0, helvB14L1_0xBD_BMP}, + {15, 14, 13, 0, 0, helvB14L1_0xBE_BMP}, + {10, 8, 14, 1, -4, helvB14L1_0xBF_BMP}, + {14, 12, 18, 1, 0, helvB14L1_0xC0_BMP}, + {14, 12, 18, 1, 0, helvB14L1_0xC1_BMP}, + {14, 12, 18, 1, 0, helvB14L1_0xC2_BMP}, + {14, 12, 18, 1, 0, helvB14L1_0xC3_BMP}, + {14, 12, 18, 1, 0, helvB14L1_0xC4_BMP}, + {14, 12, 18, 1, 0, helvB14L1_0xC5_BMP}, + {18, 16, 14, 1, 0, helvB14L1_0xC6_BMP}, + {14, 12, 19, 1, -5, helvB14L1_0xC7_BMP}, + {13, 10, 18, 2, 0, helvB14L1_0xC8_BMP}, + {13, 10, 18, 2, 0, helvB14L1_0xC9_BMP}, + {13, 10, 18, 2, 0, helvB14L1_0xCA_BMP}, + {13, 10, 18, 2, 0, helvB14L1_0xCB_BMP}, + {5, 5, 18, -1, 0, helvB14L1_0xCC_BMP}, + {5, 5, 18, 1, 0, helvB14L1_0xCD_BMP}, + {5, 7, 18, -1, 0, helvB14L1_0xCE_BMP}, + {5, 6, 18, 0, 0, helvB14L1_0xCF_BMP}, + {14, 14, 14, -1, 0, helvB14L1_0xD0_BMP}, + {14, 12, 18, 1, 0, helvB14L1_0xD1_BMP}, + {15, 13, 18, 1, 0, helvB14L1_0xD2_BMP}, + {15, 13, 18, 1, 0, helvB14L1_0xD3_BMP}, + {15, 13, 18, 1, 0, helvB14L1_0xD4_BMP}, + {15, 13, 18, 1, 0, helvB14L1_0xD5_BMP}, + {15, 13, 18, 1, 0, helvB14L1_0xD6_BMP}, + {11, 10, 8, 0, 1, helvB14L1_0xD7_BMP}, + {15, 15, 14, 0, 0, helvB14L1_0xD8_BMP}, + {14, 12, 18, 1, 0, helvB14L1_0xD9_BMP}, + {14, 12, 18, 1, 0, helvB14L1_0xDA_BMP}, + {14, 12, 18, 1, 0, helvB14L1_0xDB_BMP}, + {14, 12, 18, 1, 0, helvB14L1_0xDC_BMP}, + {13, 13, 18, 0, 0, helvB14L1_0xDD_BMP}, + {13, 11, 14, 1, 0, helvB14L1_0xDE_BMP}, + {10, 8, 14, 1, 0, helvB14L1_0xDF_BMP}, + {11, 10, 14, 1, 0, helvB14L1_0xE0_BMP}, + {11, 10, 14, 1, 0, helvB14L1_0xE1_BMP}, + {11, 10, 14, 1, 0, helvB14L1_0xE2_BMP}, + {11, 10, 14, 1, 0, helvB14L1_0xE3_BMP}, + {11, 10, 14, 1, 0, helvB14L1_0xE4_BMP}, + {11, 10, 14, 1, 0, helvB14L1_0xE5_BMP}, + {16, 14, 10, 1, 0, helvB14L1_0xE6_BMP}, + {10, 9, 15, 1, -5, helvB14L1_0xE7_BMP}, + {11, 9, 14, 1, 0, helvB14L1_0xE8_BMP}, + {11, 9, 14, 1, 0, helvB14L1_0xE9_BMP}, + {11, 9, 14, 1, 0, helvB14L1_0xEA_BMP}, + {11, 9, 14, 1, 0, helvB14L1_0xEB_BMP}, + {5, 5, 14, -1, 0, helvB14L1_0xEC_BMP}, + {5, 5, 14, 1, 0, helvB14L1_0xED_BMP}, + {5, 7, 14, -1, 0, helvB14L1_0xEE_BMP}, + {5, 5, 14, 0, 0, helvB14L1_0xEF_BMP}, + {12, 10, 14, 1, 0, helvB14L1_0xF0_BMP}, + {11, 9, 14, 1, 0, helvB14L1_0xF1_BMP}, + {12, 10, 14, 1, 0, helvB14L1_0xF2_BMP}, + {12, 10, 14, 1, 0, helvB14L1_0xF3_BMP}, + {12, 10, 14, 1, 0, helvB14L1_0xF4_BMP}, + {12, 10, 14, 1, 0, helvB14L1_0xF5_BMP}, + {12, 10, 14, 1, 0, helvB14L1_0xF6_BMP}, + {11, 9, 8, 1, 1, helvB14L1_0xF7_BMP}, + {12, 12, 10, 0, 0, helvB14L1_0xF8_BMP}, + {11, 9, 14, 1, 0, helvB14L1_0xF9_BMP}, + {11, 9, 14, 1, 0, helvB14L1_0xFA_BMP}, + {11, 9, 14, 1, 0, helvB14L1_0xFB_BMP}, + {11, 9, 14, 1, 0, helvB14L1_0xFC_BMP}, + {11, 9, 18, 1, -4, helvB14L1_0xFD_BMP}, + {12, 10, 18, 1, -4, helvB14L1_0xFE_BMP}, + {11, 9, 18, 1, -4, helvB14L1_0xFF_BMP} +}; + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontHelv14Bold_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontHelv14Bold_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontHelv14Bold_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontHelv14Bold_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontHelv14Bold_GetFontChar, + McuFontHelv14Bold_FBBy, + McuFontHelv14Bold_GetUnderlineBoxHeight(), + McuFontHelv14Bold_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv14Bold_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv14Bold_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv14Bold_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv14Bold_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontHelv14Bold. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv14Bold.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv14Bold.h new file mode 100644 index 0000000..6c7f2dd --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv14Bold.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv14Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv14Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 14 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv14Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv14Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv14Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv14Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv14Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv14Bold_Deinit(void); +** Init - void McuFontHelv14Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv14Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv14Bold_module McuFontHelv14Bold module documentation +** @{ +*/ + + +#ifndef __McuFontHelv14Bold_H +#define __McuFontHelv14Bold_H + +/* MODULE McuFontHelv14Bold. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontHelv14Boldconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontHelv14Bold_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontHelv14Bold_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontHelv14Bold_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontHelv14Bold_GetLineSpaceHeight() \ + 2 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontHelv14Bold_GetUnderlineBoxHeight() \ + 4 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontHelv14Bold_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontHelv14Bold_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontHelv14Bold. */ + +#endif +/* ifndef __McuFontHelv14Bold_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv14Normal.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv14Normal.c new file mode 100644 index 0000000..3e14ca5 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv14Normal.c @@ -0,0 +1,3583 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv14Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv14Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 14 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv14Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv14Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv14Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv14Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv14Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv14Normal_Deinit(void); +** Init - void McuFontHelv14Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv14Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv14Normal_module McuFontHelv14Normal module documentation +** @{ +*/ + +/* MODULE McuFontHelv14Normal. */ + +#include "McuFontHelv14Normal.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontHelv14Normal_FBBy 21 + +static const uint8_t helvR14L1_0x00_BMP[] = { + 0xAA, 0xA0, + 0x00, 0x00, + 0x80, 0x20, + 0x00, 0x00, + 0x80, 0x20, + 0x00, 0x00, + 0x80, 0x20, + 0x00, 0x00, + 0x80, 0x20, + 0x00, 0x00, + 0x80, 0x20, + 0x00, 0x00, + 0xAA, 0xA0 +}; + +static const uint8_t helvR14L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t helvR14L1_0x21_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x80, + 0x80, + 0x00, + 0x00, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR14L1_0x22_BMP[] = { + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0xD8 +}; + +static const uint8_t helvR14L1_0x23_BMP[] = { + 0x09, 0x00, + 0x09, 0x00, + 0x09, 0x00, + 0x7F, 0xC0, + 0x7F, 0xC0, + 0x12, 0x00, + 0x12, 0x00, + 0x12, 0x00, + 0xFF, 0x80, + 0xFF, 0x80, + 0x24, 0x00, + 0x24, 0x00, + 0x24, 0x00 +}; + +static const uint8_t helvR14L1_0x24_BMP[] = { + 0x08, 0x00, + 0x3E, 0x00, + 0x7F, 0x00, + 0xCB, 0x00, + 0xC8, 0x00, + 0xE8, 0x00, + 0x78, 0x00, + 0x3E, 0x00, + 0x0F, 0x00, + 0x09, 0x80, + 0xC9, 0x80, + 0xEB, 0x80, + 0x7F, 0x00, + 0x3E, 0x00, + 0x08, 0x00, + 0x08, 0x00 +}; + +static const uint8_t helvR14L1_0x25_BMP[] = { + 0x78, 0x60, + 0xCC, 0xC0, + 0xCC, 0xC0, + 0xCD, 0x80, + 0xCD, 0x80, + 0x7B, 0x00, + 0x03, 0x00, + 0x06, 0x78, + 0x06, 0xCC, + 0x0C, 0xCC, + 0x0C, 0xCC, + 0x18, 0xCC, + 0x18, 0x78 +}; + +static const uint8_t helvR14L1_0x26_BMP[] = { + 0x3C, 0x00, + 0x7E, 0x00, + 0x66, 0x00, + 0x66, 0x00, + 0x3C, 0x00, + 0x7C, 0x00, + 0xEE, 0xC0, + 0xC6, 0xC0, + 0xC3, 0xC0, + 0xC3, 0x80, + 0xE7, 0xC0, + 0x7E, 0xE0, + 0x3C, 0x70 +}; + +static const uint8_t helvR14L1_0x27_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR14L1_0x28_BMP[] = { + 0x10, + 0x30, + 0x60, + 0x60, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x60, + 0x60, + 0x30, + 0x10 +}; + +static const uint8_t helvR14L1_0x29_BMP[] = { + 0x80, + 0xC0, + 0x60, + 0x60, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x60, + 0x60, + 0xC0, + 0x80 +}; + +static const uint8_t helvR14L1_0x2A_BMP[] = { + 0x20, + 0xA8, + 0xF8, + 0x20, + 0xF8, + 0xA8, + 0x20 +}; + +static const uint8_t helvR14L1_0x2B_BMP[] = { + 0x18, + 0x18, + 0x18, + 0x18, + 0xFF, + 0xFF, + 0x18, + 0x18, + 0x18, + 0x18 +}; + +static const uint8_t helvR14L1_0x2C_BMP[] = { + 0xC0, + 0xC0, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t helvR14L1_0x2D_BMP[] = { + 0xF8 +}; + +static const uint8_t helvR14L1_0x2E_BMP[] = { + 0xC0, + 0xC0 +}; + +static const uint8_t helvR14L1_0x2F_BMP[] = { + 0x18, + 0x18, + 0x18, + 0x18, + 0x30, + 0x30, + 0x30, + 0x60, + 0x60, + 0x60, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR14L1_0x30_BMP[] = { + 0x3C, + 0x7E, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x7E, + 0x3C +}; + +static const uint8_t helvR14L1_0x31_BMP[] = { + 0x18, + 0xF8, + 0xF8, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18 +}; + +static const uint8_t helvR14L1_0x32_BMP[] = { + 0x3C, + 0xFE, + 0xC3, + 0x03, + 0x07, + 0x0E, + 0x1C, + 0x38, + 0x70, + 0xE0, + 0xC0, + 0xFF, + 0xFF +}; + +static const uint8_t helvR14L1_0x33_BMP[] = { + 0x3E, + 0x7F, + 0xC3, + 0xC3, + 0x06, + 0x1C, + 0x1E, + 0x07, + 0x03, + 0xC3, + 0xC7, + 0x7E, + 0x3C +}; + +static const uint8_t helvR14L1_0x34_BMP[] = { + 0x03, 0x00, + 0x07, 0x00, + 0x0F, 0x00, + 0x1B, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x63, 0x00, + 0xC3, 0x00, + 0xFF, 0x80, + 0xFF, 0x80, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00 +}; + +static const uint8_t helvR14L1_0x35_BMP[] = { + 0xFE, + 0xFE, + 0xC0, + 0xC0, + 0xFC, + 0xFE, + 0xC7, + 0x03, + 0x03, + 0xC3, + 0xC7, + 0xFE, + 0x7C +}; + +static const uint8_t helvR14L1_0x36_BMP[] = { + 0x3C, + 0x7F, + 0x63, + 0xC0, + 0xC0, + 0xDC, + 0xFE, + 0xC3, + 0xC3, + 0xC3, + 0xE3, + 0x7E, + 0x3C +}; + +static const uint8_t helvR14L1_0x37_BMP[] = { + 0xFF, + 0xFF, + 0x03, + 0x06, + 0x0C, + 0x0C, + 0x18, + 0x18, + 0x30, + 0x30, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvR14L1_0x38_BMP[] = { + 0x3C, + 0x7E, + 0xE7, + 0xC3, + 0xC3, + 0x66, + 0x7E, + 0xE7, + 0xC3, + 0xC3, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t helvR14L1_0x39_BMP[] = { + 0x3C, + 0x7E, + 0xC7, + 0xC3, + 0xC3, + 0xC3, + 0x7F, + 0x3B, + 0x03, + 0x03, + 0xC6, + 0xFE, + 0x7C +}; + +static const uint8_t helvR14L1_0x3A_BMP[] = { + 0xC0, + 0xC0, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR14L1_0x3B_BMP[] = { + 0xC0, + 0xC0, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xC0, + 0xC0, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t helvR14L1_0x3C_BMP[] = { + 0x03, + 0x0F, + 0x3C, + 0x70, + 0xC0, + 0x70, + 0x3C, + 0x0F, + 0x03 +}; + +static const uint8_t helvR14L1_0x3D_BMP[] = { + 0xFE, + 0xFE, + 0x00, + 0xFE, + 0xFE +}; + +static const uint8_t helvR14L1_0x3E_BMP[] = { + 0xC0, + 0xF0, + 0x3C, + 0x0E, + 0x03, + 0x0E, + 0x3C, + 0xF0, + 0xC0 +}; + +static const uint8_t helvR14L1_0x3F_BMP[] = { + 0x7C, + 0xFE, + 0xC6, + 0xC6, + 0x0E, + 0x1C, + 0x38, + 0x30, + 0x30, + 0x30, + 0x00, + 0x00, + 0x30, + 0x30 +}; + +static const uint8_t helvR14L1_0x40_BMP[] = { + 0x03, 0xF0, + 0x0F, 0xFC, + 0x1C, 0x0E, + 0x30, 0x06, + 0x63, 0xD3, + 0x67, 0x73, + 0xC6, 0x33, + 0xCC, 0x63, + 0xCC, 0x66, + 0xCC, 0x66, + 0xCC, 0xCC, + 0xCF, 0xF8, + 0x67, 0x70, + 0x70, 0x00, + 0x38, 0x00, + 0x1F, 0xF0, + 0x07, 0xE0 +}; + +static const uint8_t helvR14L1_0x41_BMP[] = { + 0x06, 0x00, + 0x06, 0x00, + 0x0F, 0x00, + 0x0F, 0x00, + 0x19, 0x80, + 0x19, 0x80, + 0x30, 0xC0, + 0x30, 0xC0, + 0x3F, 0xC0, + 0x7F, 0xE0, + 0x60, 0x60, + 0x60, 0x60, + 0xC0, 0x30, + 0xC0, 0x30 +}; + +static const uint8_t helvR14L1_0x42_BMP[] = { + 0xFF, 0x00, + 0xFF, 0x80, + 0xC1, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0x80, + 0xFF, 0x80, + 0xFF, 0xC0, + 0xC0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0xE0, + 0xFF, 0xC0, + 0xFF, 0x80 +}; + +static const uint8_t helvR14L1_0x43_BMP[] = { + 0x0F, 0x80, + 0x3F, 0xE0, + 0x70, 0x70, + 0x60, 0x30, + 0xE0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xE0, 0x00, + 0x60, 0x30, + 0x70, 0x70, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t helvR14L1_0x44_BMP[] = { + 0xFF, 0x80, + 0xFF, 0xC0, + 0xC0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x30, + 0xC0, 0x30, + 0xC0, 0x30, + 0xC0, 0x30, + 0xC0, 0x30, + 0xC0, 0x30, + 0xC0, 0x60, + 0xC0, 0xE0, + 0xFF, 0xC0, + 0xFF, 0x80 +}; + +static const uint8_t helvR14L1_0x45_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0x80, + 0xFF, 0x80, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t helvR14L1_0x46_BMP[] = { + 0xFF, 0x80, + 0xFF, 0x80, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0x00, + 0xFF, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t helvR14L1_0x47_BMP[] = { + 0x0F, 0xC0, + 0x3F, 0xF0, + 0x70, 0x38, + 0x60, 0x18, + 0xE0, 0x18, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0xF8, + 0xC0, 0xF8, + 0xE0, 0x18, + 0x60, 0x18, + 0x70, 0x38, + 0x3F, 0xF8, + 0x0F, 0xD8 +}; + +static const uint8_t helvR14L1_0x48_BMP[] = { + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60 +}; + +static const uint8_t helvR14L1_0x49_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR14L1_0x4A_BMP[] = { + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0x03, + 0xC3, + 0xC3, + 0xE7, + 0x7E, + 0x3C +}; + +static const uint8_t helvR14L1_0x4B_BMP[] = { + 0xC0, 0xE0, + 0xC1, 0xC0, + 0xC3, 0x80, + 0xC7, 0x00, + 0xCE, 0x00, + 0xDC, 0x00, + 0xF8, 0x00, + 0xFC, 0x00, + 0xCE, 0x00, + 0xC7, 0x00, + 0xC3, 0x80, + 0xC1, 0xC0, + 0xC0, 0xE0, + 0xC0, 0x70 +}; + +static const uint8_t helvR14L1_0x4C_BMP[] = { + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0x80, + 0xFF, 0x80 +}; + +static const uint8_t helvR14L1_0x4D_BMP[] = { + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xF0, 0x3C, + 0xF0, 0x3C, + 0xD8, 0x6C, + 0xD8, 0x6C, + 0xCC, 0xCC, + 0xCC, 0xCC, + 0xC4, 0x8C, + 0xC7, 0x8C, + 0xC3, 0x0C, + 0xC3, 0x0C +}; + +static const uint8_t helvR14L1_0x4E_BMP[] = { + 0xC0, 0x60, + 0xE0, 0x60, + 0xF0, 0x60, + 0xF0, 0x60, + 0xD8, 0x60, + 0xCC, 0x60, + 0xCC, 0x60, + 0xC6, 0x60, + 0xC6, 0x60, + 0xC3, 0x60, + 0xC1, 0xE0, + 0xC1, 0xE0, + 0xC0, 0xE0, + 0xC0, 0x60 +}; + +static const uint8_t helvR14L1_0x4F_BMP[] = { + 0x0F, 0x80, + 0x3F, 0xE0, + 0x70, 0x70, + 0x60, 0x30, + 0xE0, 0x38, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xE0, 0x38, + 0x60, 0x30, + 0x70, 0x70, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t helvR14L1_0x50_BMP[] = { + 0xFF, 0x00, + 0xFF, 0x80, + 0xC1, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0xFF, 0x80, + 0xFF, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t helvR14L1_0x51_BMP[] = { + 0x0F, 0x80, + 0x3F, 0xE0, + 0x70, 0x70, + 0x60, 0x30, + 0xE0, 0x38, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xE1, 0xB8, + 0x61, 0xB0, + 0x70, 0xF0, + 0x3F, 0xE0, + 0x0F, 0xB0, + 0x00, 0x30 +}; + +static const uint8_t helvR14L1_0x52_BMP[] = { + 0xFF, 0x80, + 0xFF, 0xC0, + 0xC0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0xE0, + 0xFF, 0xC0, + 0xFF, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60 +}; + +static const uint8_t helvR14L1_0x53_BMP[] = { + 0x1E, 0x00, + 0x7F, 0x80, + 0xE1, 0xC0, + 0xC0, 0xC0, + 0xE0, 0x00, + 0x7C, 0x00, + 0x1F, 0x00, + 0x03, 0x80, + 0x01, 0xC0, + 0x00, 0xC0, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x7F, 0x80, + 0x3F, 0x00 +}; + +static const uint8_t helvR14L1_0x54_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00 +}; + +static const uint8_t helvR14L1_0x55_BMP[] = { + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0x60, 0xC0, + 0x7F, 0xC0, + 0x1F, 0x00 +}; + +static const uint8_t helvR14L1_0x56_BMP[] = { + 0xC0, 0x30, + 0xC0, 0x30, + 0x60, 0x60, + 0x60, 0x60, + 0x60, 0x60, + 0x30, 0xC0, + 0x30, 0xC0, + 0x30, 0xC0, + 0x19, 0x80, + 0x19, 0x80, + 0x19, 0x80, + 0x0F, 0x00, + 0x0F, 0x00, + 0x06, 0x00 +}; + +static const uint8_t helvR14L1_0x57_BMP[] = { + 0xC1, 0x83, + 0xC1, 0x83, + 0xC1, 0x83, + 0xC3, 0xC3, + 0x63, 0xC6, + 0x62, 0x46, + 0x66, 0x66, + 0x66, 0x66, + 0x36, 0x6C, + 0x36, 0x6C, + 0x34, 0x2C, + 0x1C, 0x38, + 0x18, 0x18, + 0x18, 0x18 +}; + +static const uint8_t helvR14L1_0x58_BMP[] = { + 0xC0, 0x60, + 0xC0, 0x60, + 0x60, 0xC0, + 0x71, 0xC0, + 0x31, 0x80, + 0x1B, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x1B, 0x00, + 0x31, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xC0, 0x60, + 0xC0, 0x60 +}; + +static const uint8_t helvR14L1_0x59_BMP[] = { + 0xC0, 0x30, + 0xC0, 0x30, + 0x60, 0x60, + 0x60, 0x60, + 0x30, 0xC0, + 0x39, 0xC0, + 0x19, 0x80, + 0x0F, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00 +}; + +static const uint8_t helvR14L1_0x5A_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x00, 0xC0, + 0x01, 0x80, + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x1C, 0x00, + 0x18, 0x00, + 0x30, 0x00, + 0x60, 0x00, + 0xC0, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t helvR14L1_0x5B_BMP[] = { + 0xF0, + 0xF0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xF0, + 0xF0 +}; + +static const uint8_t helvR14L1_0x5C_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0x60, + 0x60, + 0x60, + 0x30, + 0x30, + 0x30, + 0x30, + 0x18, + 0x18, + 0x18, + 0x18 +}; + +static const uint8_t helvR14L1_0x5D_BMP[] = { + 0xF0, + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xF0, + 0xF0 +}; + +static const uint8_t helvR14L1_0x5E_BMP[] = { + 0x10, + 0x38, + 0x6C, + 0x6C, + 0xC6, + 0xC6 +}; + +static const uint8_t helvR14L1_0x5F_BMP[] = { + 0xFF, 0xE0, + 0xFF, 0xE0 +}; + +static const uint8_t helvR14L1_0x60_BMP[] = { + 0xC0, + 0x60, + 0x30 +}; + +static const uint8_t helvR14L1_0x61_BMP[] = { + 0x7E, 0x00, + 0xE7, 0x00, + 0xC3, 0x00, + 0x07, 0x00, + 0x7F, 0x00, + 0xE3, 0x00, + 0xC3, 0x00, + 0xC3, 0x00, + 0xE7, 0x80, + 0x79, 0x80 +}; + +static const uint8_t helvR14L1_0x62_BMP[] = { + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xDE, 0x00, + 0xFF, 0x00, + 0xE3, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xE3, 0x00, + 0xFF, 0x00, + 0xDE, 0x00 +}; + +static const uint8_t helvR14L1_0x63_BMP[] = { + 0x3E, + 0x7F, + 0x63, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x63, + 0x7F, + 0x3E +}; + +static const uint8_t helvR14L1_0x64_BMP[] = { + 0x01, 0x80, + 0x01, 0x80, + 0x01, 0x80, + 0x01, 0x80, + 0x3D, 0x80, + 0x7F, 0x80, + 0x63, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x80, + 0x7F, 0x80, + 0x3D, 0x80 +}; + +static const uint8_t helvR14L1_0x65_BMP[] = { + 0x3C, + 0x7E, + 0xC3, + 0xC3, + 0xFF, + 0xC0, + 0xC0, + 0xE3, + 0x7F, + 0x3C +}; + +static const uint8_t helvR14L1_0x66_BMP[] = { + 0x1C, + 0x3C, + 0x30, + 0x30, + 0xFC, + 0xFC, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30 +}; + +static const uint8_t helvR14L1_0x67_BMP[] = { + 0x3D, 0x80, + 0x7F, 0x80, + 0x61, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x80, + 0x7F, 0x80, + 0x3D, 0x80, + 0x01, 0x80, + 0x63, 0x00, + 0x7F, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t helvR14L1_0x68_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xDE, + 0xFF, + 0xE3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3 +}; + +static const uint8_t helvR14L1_0x69_BMP[] = { + 0xC0, + 0xC0, + 0x00, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR14L1_0x6A_BMP[] = { + 0x30, + 0x30, + 0x00, + 0x00, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xF0, + 0xE0 +}; + +static const uint8_t helvR14L1_0x6B_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC6, + 0xCC, + 0xD8, + 0xF0, + 0xF8, + 0xD8, + 0xCC, + 0xCE, + 0xC6, + 0xC7 +}; + +static const uint8_t helvR14L1_0x6C_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR14L1_0x6D_BMP[] = { + 0xDE, 0x78, + 0xFF, 0xFC, + 0xE3, 0x8C, + 0xC3, 0x0C, + 0xC3, 0x0C, + 0xC3, 0x0C, + 0xC3, 0x0C, + 0xC3, 0x0C, + 0xC3, 0x0C, + 0xC3, 0x0C +}; + +static const uint8_t helvR14L1_0x6E_BMP[] = { + 0xDE, + 0xFF, + 0xE3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3 +}; + +static const uint8_t helvR14L1_0x6F_BMP[] = { + 0x3E, 0x00, + 0x7F, 0x00, + 0x63, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x00, + 0x7F, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvR14L1_0x70_BMP[] = { + 0xDE, 0x00, + 0xFF, 0x00, + 0xE3, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xE3, 0x00, + 0xFF, 0x00, + 0xDE, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t helvR14L1_0x71_BMP[] = { + 0x3D, 0x80, + 0x7F, 0x80, + 0x63, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x80, + 0x7F, 0x80, + 0x3D, 0x80, + 0x01, 0x80, + 0x01, 0x80, + 0x01, 0x80, + 0x01, 0x80 +}; + +static const uint8_t helvR14L1_0x72_BMP[] = { + 0xD8, + 0xD8, + 0xE0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR14L1_0x73_BMP[] = { + 0x3C, + 0x7E, + 0xC6, + 0xC0, + 0xFC, + 0x3E, + 0x06, + 0xC6, + 0xFC, + 0x78 +}; + +static const uint8_t helvR14L1_0x74_BMP[] = { + 0x30, + 0x30, + 0x30, + 0xFC, + 0xFC, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x3C, + 0x1C +}; + +static const uint8_t helvR14L1_0x75_BMP[] = { + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC7, + 0xFF, + 0x7B +}; + +static const uint8_t helvR14L1_0x76_BMP[] = { + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x66, + 0x66, + 0x24, + 0x3C, + 0x18, + 0x18 +}; + +static const uint8_t helvR14L1_0x77_BMP[] = { + 0xC6, 0x30, + 0xC6, 0x30, + 0xC6, 0x30, + 0x66, 0x60, + 0x66, 0x60, + 0x69, 0x60, + 0x29, 0x40, + 0x39, 0xC0, + 0x19, 0x80, + 0x19, 0x80 +}; + +static const uint8_t helvR14L1_0x78_BMP[] = { + 0xC3, + 0xE7, + 0x66, + 0x3C, + 0x18, + 0x18, + 0x3C, + 0x66, + 0xE7, + 0xC3 +}; + +static const uint8_t helvR14L1_0x79_BMP[] = { + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x66, + 0x66, + 0x24, + 0x3C, + 0x18, + 0x18, + 0x18, + 0x18, + 0x70, + 0x70 +}; + +static const uint8_t helvR14L1_0x7A_BMP[] = { + 0xFE, + 0xFE, + 0x06, + 0x0C, + 0x18, + 0x30, + 0x60, + 0xC0, + 0xFE, + 0xFE +}; + +static const uint8_t helvR14L1_0x7B_BMP[] = { + 0x0C, + 0x18, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x60, + 0xC0, + 0x60, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x18, + 0x0C +}; + +static const uint8_t helvR14L1_0x7C_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR14L1_0x7D_BMP[] = { + 0xC0, + 0x60, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x18, + 0x0C, + 0x18, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x60, + 0xC0 +}; + +static const uint8_t helvR14L1_0x7E_BMP[] = { + 0x73, + 0xFF, + 0xCE +}; + +static const uint8_t helvR14L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t helvR14L1_0xA1_BMP[] = { + 0xC0, + 0xC0, + 0x00, + 0x00, + 0x40, + 0x40, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR14L1_0xA2_BMP[] = { + 0x04, + 0x04, + 0x3E, + 0x7F, + 0x6B, + 0xC8, + 0xC8, + 0xC8, + 0xC8, + 0x6B, + 0x7F, + 0x3E, + 0x10, + 0x10 +}; + +static const uint8_t helvR14L1_0xA3_BMP[] = { + 0x1E, 0x00, + 0x3F, 0x00, + 0x61, 0x80, + 0x61, 0x80, + 0x60, 0x00, + 0x30, 0x00, + 0x7E, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x30, 0x00, + 0x60, 0x80, + 0xFF, 0x80, + 0xDF, 0x00 +}; + +static const uint8_t helvR14L1_0xA4_BMP[] = { + 0xC3, + 0xFF, + 0x66, + 0x66, + 0x66, + 0xFF, + 0xC3 +}; + +static const uint8_t helvR14L1_0xA5_BMP[] = { + 0xC3, + 0xC3, + 0x66, + 0x66, + 0x66, + 0x3C, + 0xFF, + 0x18, + 0xFF, + 0x18, + 0x18, + 0x18, + 0x18 +}; + +static const uint8_t helvR14L1_0xA6_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x00, + 0x00, + 0x00, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR14L1_0xA7_BMP[] = { + 0x3C, + 0x7E, + 0xC3, + 0xC3, + 0xF0, + 0x7C, + 0x6E, + 0xC7, + 0xC3, + 0xE3, + 0x73, + 0x3E, + 0x0E, + 0x07, + 0xC3, + 0xC3, + 0x7E, + 0x3C +}; + +static const uint8_t helvR14L1_0xA8_BMP[] = { + 0xD8, + 0xD8 +}; + +static const uint8_t helvR14L1_0xA9_BMP[] = { + 0x0F, 0x80, + 0x30, 0x60, + 0x40, 0x10, + 0x47, 0x10, + 0x88, 0x88, + 0x90, 0x88, + 0x90, 0x08, + 0x90, 0x08, + 0x90, 0x08, + 0x88, 0x88, + 0x47, 0x10, + 0x40, 0x10, + 0x30, 0x60, + 0x0F, 0x80 +}; + +static const uint8_t helvR14L1_0xAA_BMP[] = { + 0x70, + 0x98, + 0x38, + 0x48, + 0xD8, + 0x68, + 0x00, + 0xF8 +}; + +static const uint8_t helvR14L1_0xAB_BMP[] = { + 0x36, + 0x6C, + 0xD8, + 0xD8, + 0x6C, + 0x36 +}; + +static const uint8_t helvR14L1_0xAC_BMP[] = { + 0xFF, 0x80, + 0xFF, 0x80, + 0x01, 0x80, + 0x01, 0x80, + 0x01, 0x80 +}; + +static const uint8_t helvR14L1_0xAD_BMP[] = { + 0xF8 +}; + +static const uint8_t helvR14L1_0xAE_BMP[] = { + 0x0F, 0x80, + 0x30, 0x60, + 0x40, 0x10, + 0x4F, 0x90, + 0x88, 0x48, + 0x88, 0x48, + 0x88, 0x48, + 0x8F, 0x88, + 0x89, 0x08, + 0x88, 0x88, + 0x48, 0x50, + 0x40, 0x10, + 0x30, 0x60, + 0x0F, 0x80 +}; + +static const uint8_t helvR14L1_0xAF_BMP[] = { + 0xF8 +}; + +static const uint8_t helvR14L1_0xB0_BMP[] = { + 0x70, + 0xD8, + 0x88, + 0xD8, + 0x70 +}; + +static const uint8_t helvR14L1_0xB1_BMP[] = { + 0x18, + 0x18, + 0x18, + 0xFF, + 0xFF, + 0x18, + 0x18, + 0x18, + 0x00, + 0xFF, + 0xFF +}; + +static const uint8_t helvR14L1_0xB2_BMP[] = { + 0x70, + 0xF8, + 0x98, + 0x18, + 0x30, + 0x60, + 0xF8, + 0xF8 +}; + +static const uint8_t helvR14L1_0xB3_BMP[] = { + 0x70, + 0xF8, + 0x98, + 0x30, + 0x30, + 0x98, + 0xF8, + 0x70 +}; + +static const uint8_t helvR14L1_0xB4_BMP[] = { + 0x30, + 0x60, + 0xC0 +}; + +static const uint8_t helvR14L1_0xB5_BMP[] = { + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xE7, + 0xFF, + 0xDB, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR14L1_0xB6_BMP[] = { + 0x3F, + 0x72, + 0xF2, + 0xF2, + 0xF2, + 0xF2, + 0xF2, + 0x72, + 0x32, + 0x12, + 0x12, + 0x12, + 0x12, + 0x12, + 0x12, + 0x12, + 0x12, + 0x12 +}; + +static const uint8_t helvR14L1_0xB7_BMP[] = { + 0xC0, + 0xC0 +}; + +static const uint8_t helvR14L1_0xB8_BMP[] = { + 0x60, + 0x70, + 0x18, + 0xD8, + 0xF0 +}; + +static const uint8_t helvR14L1_0xB9_BMP[] = { + 0x30, + 0xF0, + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30 +}; + +static const uint8_t helvR14L1_0xBA_BMP[] = { + 0x70, + 0xD8, + 0x88, + 0x88, + 0xD8, + 0x70, + 0x00, + 0xF8 +}; + +static const uint8_t helvR14L1_0xBB_BMP[] = { + 0xD8, + 0x6C, + 0x36, + 0x36, + 0x6C, + 0xD8 +}; + +static const uint8_t helvR14L1_0xBC_BMP[] = { + 0x30, 0x30, + 0xF0, 0x30, + 0xF0, 0x60, + 0x30, 0xC0, + 0x30, 0xC0, + 0x31, 0x88, + 0x31, 0x18, + 0x33, 0x38, + 0x06, 0x78, + 0x06, 0xD8, + 0x0C, 0xFC, + 0x18, 0x18, + 0x18, 0x18 +}; + +static const uint8_t helvR14L1_0xBD_BMP[] = { + 0x30, 0x30, + 0xF0, 0x30, + 0xF0, 0x60, + 0x30, 0xC0, + 0x30, 0xC0, + 0x31, 0xB8, + 0x31, 0x7C, + 0x33, 0x4C, + 0x06, 0x0C, + 0x06, 0x18, + 0x0C, 0x30, + 0x18, 0x7C, + 0x18, 0x7C +}; + +static const uint8_t helvR14L1_0xBE_BMP[] = { + 0x70, 0x30, + 0xF8, 0x30, + 0x98, 0x60, + 0x30, 0xC0, + 0x30, 0xC0, + 0x99, 0x88, + 0xF9, 0x18, + 0x73, 0x38, + 0x06, 0x78, + 0x06, 0xD8, + 0x0C, 0xFC, + 0x18, 0x18, + 0x18, 0x18 +}; + +static const uint8_t helvR14L1_0xBF_BMP[] = { + 0x18, + 0x18, + 0x00, + 0x00, + 0x18, + 0x18, + 0x18, + 0x38, + 0x70, + 0xE0, + 0xC6, + 0xC6, + 0xFE, + 0x7C +}; + +static const uint8_t helvR14L1_0xC0_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x0F, 0x00, + 0x0F, 0x00, + 0x19, 0x80, + 0x19, 0x80, + 0x30, 0xC0, + 0x30, 0xC0, + 0x3F, 0xC0, + 0x7F, 0xE0, + 0x60, 0x60, + 0x60, 0x60, + 0xC0, 0x30, + 0xC0, 0x30 +}; + +static const uint8_t helvR14L1_0xC1_BMP[] = { + 0x01, 0x80, + 0x03, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x0F, 0x00, + 0x0F, 0x00, + 0x19, 0x80, + 0x19, 0x80, + 0x30, 0xC0, + 0x30, 0xC0, + 0x3F, 0xC0, + 0x7F, 0xE0, + 0x60, 0x60, + 0x60, 0x60, + 0xC0, 0x30, + 0xC0, 0x30 +}; + +static const uint8_t helvR14L1_0xC2_BMP[] = { + 0x06, 0x00, + 0x0F, 0x00, + 0x19, 0x80, + 0x00, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x0F, 0x00, + 0x0F, 0x00, + 0x19, 0x80, + 0x19, 0x80, + 0x30, 0xC0, + 0x30, 0xC0, + 0x3F, 0xC0, + 0x7F, 0xE0, + 0x60, 0x60, + 0x60, 0x60, + 0xC0, 0x30, + 0xC0, 0x30 +}; + +static const uint8_t helvR14L1_0xC3_BMP[] = { + 0x0C, 0x80, + 0x16, 0x80, + 0x13, 0x00, + 0x00, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x0F, 0x00, + 0x0F, 0x00, + 0x19, 0x80, + 0x19, 0x80, + 0x30, 0xC0, + 0x30, 0xC0, + 0x3F, 0xC0, + 0x7F, 0xE0, + 0x60, 0x60, + 0x60, 0x60, + 0xC0, 0x30, + 0xC0, 0x30 +}; + +static const uint8_t helvR14L1_0xC4_BMP[] = { + 0x19, 0x80, + 0x19, 0x80, + 0x00, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x0F, 0x00, + 0x0F, 0x00, + 0x19, 0x80, + 0x19, 0x80, + 0x30, 0xC0, + 0x30, 0xC0, + 0x3F, 0xC0, + 0x7F, 0xE0, + 0x60, 0x60, + 0x60, 0x60, + 0xC0, 0x30, + 0xC0, 0x30 +}; + +static const uint8_t helvR14L1_0xC5_BMP[] = { + 0x06, 0x00, + 0x09, 0x00, + 0x09, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x0F, 0x00, + 0x0F, 0x00, + 0x19, 0x80, + 0x19, 0x80, + 0x30, 0xC0, + 0x30, 0xC0, + 0x3F, 0xC0, + 0x7F, 0xE0, + 0x60, 0x60, + 0x60, 0x60, + 0xC0, 0x30, + 0xC0, 0x30 +}; + +static const uint8_t helvR14L1_0xC6_BMP[] = { + 0x07, 0xFF, + 0x07, 0xFF, + 0x0D, 0x80, + 0x0D, 0x80, + 0x19, 0x80, + 0x19, 0x80, + 0x31, 0xFE, + 0x31, 0xFE, + 0x3F, 0x80, + 0x7F, 0x80, + 0x61, 0x80, + 0x61, 0x80, + 0xC1, 0xFF, + 0xC1, 0xFF +}; + +static const uint8_t helvR14L1_0xC7_BMP[] = { + 0x0F, 0x80, + 0x3F, 0xE0, + 0x70, 0x70, + 0x60, 0x30, + 0xE0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xE0, 0x00, + 0x60, 0x30, + 0x70, 0x70, + 0x3F, 0xE0, + 0x0F, 0x80, + 0x06, 0x00, + 0x03, 0x00, + 0x1B, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t helvR14L1_0xC8_BMP[] = { + 0x30, 0x00, + 0x18, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0x80, + 0xFF, 0x80, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t helvR14L1_0xC9_BMP[] = { + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0x80, + 0xFF, 0x80, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t helvR14L1_0xCA_BMP[] = { + 0x0C, 0x00, + 0x1E, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0x80, + 0xFF, 0x80, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t helvR14L1_0xCB_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0x80, + 0xFF, 0x80, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t helvR14L1_0xCC_BMP[] = { + 0xC0, + 0x60, + 0x30, + 0x00, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30 +}; + +static const uint8_t helvR14L1_0xCD_BMP[] = { + 0x30, + 0x60, + 0xC0, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR14L1_0xCE_BMP[] = { + 0x30, + 0x78, + 0x84, + 0x00, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30 +}; + +static const uint8_t helvR14L1_0xCF_BMP[] = { + 0xCC, + 0xCC, + 0x00, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30 +}; + +static const uint8_t helvR14L1_0xD0_BMP[] = { + 0x3F, 0xE0, + 0x3F, 0xF0, + 0x30, 0x38, + 0x30, 0x18, + 0x30, 0x0C, + 0x30, 0x0C, + 0xFE, 0x0C, + 0xFE, 0x0C, + 0x30, 0x0C, + 0x30, 0x0C, + 0x30, 0x18, + 0x30, 0x38, + 0x3F, 0xF0, + 0x3F, 0xE0 +}; + +static const uint8_t helvR14L1_0xD1_BMP[] = { + 0x0C, 0x80, + 0x16, 0x80, + 0x13, 0x00, + 0x00, 0x00, + 0xC0, 0x60, + 0xE0, 0x60, + 0xF0, 0x60, + 0xF0, 0x60, + 0xD8, 0x60, + 0xCC, 0x60, + 0xCC, 0x60, + 0xC6, 0x60, + 0xC6, 0x60, + 0xC3, 0x60, + 0xC1, 0xE0, + 0xC1, 0xE0, + 0xC0, 0xE0, + 0xC0, 0x60 +}; + +static const uint8_t helvR14L1_0xD2_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0x0F, 0x80, + 0x3F, 0xE0, + 0x70, 0x70, + 0x60, 0x30, + 0xE0, 0x38, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xE0, 0x38, + 0x60, 0x30, + 0x70, 0x70, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t helvR14L1_0xD3_BMP[] = { + 0x01, 0x80, + 0x03, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0x0F, 0x80, + 0x3F, 0xE0, + 0x70, 0x70, + 0x60, 0x30, + 0xE0, 0x38, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xE0, 0x38, + 0x60, 0x30, + 0x70, 0x70, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t helvR14L1_0xD4_BMP[] = { + 0x03, 0x00, + 0x07, 0x80, + 0x0C, 0xC0, + 0x00, 0x00, + 0x0F, 0x80, + 0x3F, 0xE0, + 0x70, 0x70, + 0x60, 0x30, + 0xE0, 0x38, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xE0, 0x38, + 0x60, 0x30, + 0x70, 0x70, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t helvR14L1_0xD5_BMP[] = { + 0x06, 0x40, + 0x0B, 0x40, + 0x09, 0x80, + 0x00, 0x00, + 0x0F, 0x80, + 0x3F, 0xE0, + 0x70, 0x70, + 0x60, 0x30, + 0xE0, 0x38, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xE0, 0x38, + 0x60, 0x30, + 0x70, 0x70, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t helvR14L1_0xD6_BMP[] = { + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x00, 0x00, + 0x0F, 0x80, + 0x3F, 0xE0, + 0x70, 0x70, + 0x60, 0x30, + 0xE0, 0x38, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xE0, 0x38, + 0x60, 0x30, + 0x70, 0x70, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t helvR14L1_0xD7_BMP[] = { + 0xC0, 0xC0, + 0x61, 0x80, + 0x33, 0x00, + 0x1E, 0x00, + 0x0C, 0x00, + 0x1E, 0x00, + 0x33, 0x00, + 0x61, 0x80, + 0xC0, 0xC0 +}; + +static const uint8_t helvR14L1_0xD8_BMP[] = { + 0x07, 0xCC, + 0x1F, 0xF8, + 0x38, 0x30, + 0x30, 0x78, + 0x70, 0xDC, + 0x61, 0x8C, + 0x63, 0x0C, + 0x62, 0x0C, + 0x66, 0x0C, + 0x6C, 0x1C, + 0x38, 0x18, + 0x38, 0x38, + 0x6F, 0xF0, + 0xC7, 0xC0 +}; + +static const uint8_t helvR14L1_0xD9_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0x60, 0xC0, + 0x7F, 0xC0, + 0x1F, 0x00 +}; + +static const uint8_t helvR14L1_0xDA_BMP[] = { + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0x60, 0xC0, + 0x7F, 0xC0, + 0x1F, 0x00 +}; + +static const uint8_t helvR14L1_0xDB_BMP[] = { + 0x06, 0x00, + 0x0F, 0x00, + 0x19, 0x80, + 0x00, 0x00, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0x60, 0xC0, + 0x7F, 0xC0, + 0x1F, 0x00 +}; + +static const uint8_t helvR14L1_0xDC_BMP[] = { + 0x31, 0x80, + 0x31, 0x80, + 0x00, 0x00, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0x60, 0xC0, + 0x7F, 0xC0, + 0x1F, 0x00 +}; + +static const uint8_t helvR14L1_0xDD_BMP[] = { + 0x01, 0x80, + 0x03, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0xC0, 0x30, + 0xC0, 0x30, + 0x60, 0x60, + 0x60, 0x60, + 0x30, 0xC0, + 0x39, 0xC0, + 0x19, 0x80, + 0x0F, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00 +}; + +static const uint8_t helvR14L1_0xDE_BMP[] = { + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0x00, + 0xFF, 0x80, + 0xC1, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0xFF, 0x80, + 0xFF, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t helvR14L1_0xDF_BMP[] = { + 0x38, + 0x7C, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xDC, + 0xDC, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xDE, + 0xDC +}; + +static const uint8_t helvR14L1_0xE0_BMP[] = { + 0x30, 0x00, + 0x18, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x7E, 0x00, + 0xE7, 0x00, + 0xC3, 0x00, + 0x07, 0x00, + 0x7F, 0x00, + 0xE3, 0x00, + 0xC3, 0x00, + 0xC3, 0x00, + 0xE7, 0x80, + 0x79, 0x80 +}; + +static const uint8_t helvR14L1_0xE1_BMP[] = { + 0x0C, 0x00, + 0x18, 0x00, + 0x30, 0x00, + 0x00, 0x00, + 0x7E, 0x00, + 0xE7, 0x00, + 0xC3, 0x00, + 0x07, 0x00, + 0x7F, 0x00, + 0xE3, 0x00, + 0xC3, 0x00, + 0xC3, 0x00, + 0xE7, 0x80, + 0x79, 0x80 +}; + +static const uint8_t helvR14L1_0xE2_BMP[] = { + 0x18, 0x00, + 0x3C, 0x00, + 0x66, 0x00, + 0x00, 0x00, + 0x7E, 0x00, + 0xE7, 0x00, + 0xC3, 0x00, + 0x07, 0x00, + 0x7F, 0x00, + 0xE3, 0x00, + 0xC3, 0x00, + 0xC3, 0x00, + 0xE7, 0x80, + 0x79, 0x80 +}; + +static const uint8_t helvR14L1_0xE3_BMP[] = { + 0x32, 0x00, + 0x5A, 0x00, + 0x4C, 0x00, + 0x00, 0x00, + 0x7E, 0x00, + 0xE7, 0x00, + 0xC3, 0x00, + 0x07, 0x00, + 0x7F, 0x00, + 0xE3, 0x00, + 0xC3, 0x00, + 0xC3, 0x00, + 0xE7, 0x80, + 0x79, 0x80 +}; + +static const uint8_t helvR14L1_0xE4_BMP[] = { + 0x66, 0x00, + 0x66, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x7E, 0x00, + 0xE7, 0x00, + 0xC3, 0x00, + 0x07, 0x00, + 0x7F, 0x00, + 0xE3, 0x00, + 0xC3, 0x00, + 0xC3, 0x00, + 0xE7, 0x80, + 0x79, 0x80 +}; + +static const uint8_t helvR14L1_0xE5_BMP[] = { + 0x18, 0x00, + 0x24, 0x00, + 0x24, 0x00, + 0x18, 0x00, + 0x7E, 0x00, + 0xE7, 0x00, + 0xC3, 0x00, + 0x07, 0x00, + 0x7F, 0x00, + 0xE3, 0x00, + 0xC3, 0x00, + 0xC3, 0x00, + 0xE7, 0x80, + 0x79, 0x80 +}; + +static const uint8_t helvR14L1_0xE6_BMP[] = { + 0x7E, 0xF0, + 0xE7, 0xF8, + 0xC3, 0x0C, + 0x07, 0x0C, + 0x7F, 0xFC, + 0xE3, 0x00, + 0xC3, 0x00, + 0xC3, 0x8C, + 0xE7, 0xFC, + 0x7A, 0xF0 +}; + +static const uint8_t helvR14L1_0xE7_BMP[] = { + 0x3E, + 0x7F, + 0x63, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x63, + 0x7F, + 0x3E, + 0x18, + 0x0C, + 0x6C, + 0x78 +}; + +static const uint8_t helvR14L1_0xE8_BMP[] = { + 0x30, + 0x18, + 0x0C, + 0x00, + 0x3C, + 0x7E, + 0xC3, + 0xC3, + 0xFF, + 0xC0, + 0xC0, + 0xE3, + 0x7F, + 0x3C +}; + +static const uint8_t helvR14L1_0xE9_BMP[] = { + 0x0C, + 0x18, + 0x30, + 0x00, + 0x3C, + 0x7E, + 0xC3, + 0xC3, + 0xFF, + 0xC0, + 0xC0, + 0xE3, + 0x7F, + 0x3C +}; + +static const uint8_t helvR14L1_0xEA_BMP[] = { + 0x18, + 0x3C, + 0x66, + 0x00, + 0x3C, + 0x7E, + 0xC3, + 0xC3, + 0xFF, + 0xC0, + 0xC0, + 0xE3, + 0x7F, + 0x3C +}; + +static const uint8_t helvR14L1_0xEB_BMP[] = { + 0x66, + 0x66, + 0x00, + 0x00, + 0x3C, + 0x7E, + 0xC3, + 0xC3, + 0xFF, + 0xC0, + 0xC0, + 0xE3, + 0x7F, + 0x3C +}; + +static const uint8_t helvR14L1_0xEC_BMP[] = { + 0xC0, + 0x60, + 0x30, + 0x00, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvR14L1_0xED_BMP[] = { + 0x30, + 0x60, + 0xC0, + 0x00, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvR14L1_0xEE_BMP[] = { + 0x30, + 0x78, + 0xCC, + 0x00, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30 +}; + +static const uint8_t helvR14L1_0xEF_BMP[] = { + 0xD8, + 0xD8, + 0x00, + 0x00, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvR14L1_0xF0_BMP[] = { + 0x60, 0x00, + 0x36, 0x00, + 0x38, 0x00, + 0x4C, 0x00, + 0x3E, 0x00, + 0x7F, 0x00, + 0x63, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x00, + 0x7F, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvR14L1_0xF1_BMP[] = { + 0x32, + 0x5A, + 0x4C, + 0x00, + 0xDE, + 0xFF, + 0xE3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3 +}; + +static const uint8_t helvR14L1_0xF2_BMP[] = { + 0x30, 0x00, + 0x18, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x3E, 0x00, + 0x7F, 0x00, + 0x63, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x00, + 0x7F, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvR14L1_0xF3_BMP[] = { + 0x06, 0x00, + 0x0C, 0x00, + 0x18, 0x00, + 0x00, 0x00, + 0x3E, 0x00, + 0x7F, 0x00, + 0x63, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x00, + 0x7F, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvR14L1_0xF4_BMP[] = { + 0x18, 0x00, + 0x3C, 0x00, + 0x66, 0x00, + 0x00, 0x00, + 0x3E, 0x00, + 0x7F, 0x00, + 0x63, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x00, + 0x7F, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvR14L1_0xF5_BMP[] = { + 0x32, 0x00, + 0x5A, 0x00, + 0x4C, 0x00, + 0x00, 0x00, + 0x3E, 0x00, + 0x7F, 0x00, + 0x63, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x00, + 0x7F, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvR14L1_0xF6_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x3E, 0x00, + 0x7F, 0x00, + 0x63, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x00, + 0x7F, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvR14L1_0xF7_BMP[] = { + 0x18, + 0x18, + 0x00, + 0xFF, + 0xFF, + 0x00, + 0x18, + 0x18 +}; + +static const uint8_t helvR14L1_0xF8_BMP[] = { + 0x0E, 0x60, + 0x3F, 0xC0, + 0x31, 0x80, + 0x63, 0xC0, + 0x66, 0xC0, + 0x6C, 0xC0, + 0x78, 0xC0, + 0x31, 0x80, + 0x7F, 0x80, + 0xCE, 0x00 +}; + +static const uint8_t helvR14L1_0xF9_BMP[] = { + 0x30, + 0x18, + 0x0C, + 0x00, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC7, + 0xFF, + 0x7B +}; + +static const uint8_t helvR14L1_0xFA_BMP[] = { + 0x06, + 0x0C, + 0x18, + 0x00, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC7, + 0xFF, + 0x7B +}; + +static const uint8_t helvR14L1_0xFB_BMP[] = { + 0x18, + 0x3C, + 0x66, + 0x00, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC7, + 0xFF, + 0x7B +}; + +static const uint8_t helvR14L1_0xFC_BMP[] = { + 0x66, + 0x66, + 0x00, + 0x00, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC3, + 0xC7, + 0xFF, + 0x7B +}; + +static const uint8_t helvR14L1_0xFD_BMP[] = { + 0x06, + 0x0C, + 0x18, + 0x00, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x66, + 0x66, + 0x24, + 0x3C, + 0x18, + 0x18, + 0x18, + 0x18, + 0x70, + 0x70 +}; + +static const uint8_t helvR14L1_0xFE_BMP[] = { + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xDE, 0x00, + 0xFF, 0x00, + 0xE3, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xE3, 0x00, + 0xFF, 0x00, + 0xDE, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t helvR14L1_0xFF_BMP[] = { + 0x66, + 0x66, + 0x00, + 0x00, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x66, + 0x66, + 0x24, + 0x3C, + 0x18, + 0x18, + 0x18, + 0x18, + 0x70, + 0x70 +}; + +static const GFONT_CharInfo FontBMP[] = { + {14, 11, 13, 1, 0, helvR14L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {5, 1, 1, 0, 0, helvR14L1_0x20_BMP}, + {6, 2, 14, 2, 0, helvR14L1_0x21_BMP}, + {5, 5, 5, 0, 9, helvR14L1_0x22_BMP}, + {10, 10, 13, 0, 0, helvR14L1_0x23_BMP}, + {10, 9, 16, 1, -2, helvR14L1_0x24_BMP}, + {16, 14, 13, 1, 0, helvR14L1_0x25_BMP}, + {13, 12, 13, 1, 0, helvR14L1_0x26_BMP}, + {3, 1, 5, 1, 9, helvR14L1_0x27_BMP}, + {6, 4, 18, 0, -4, helvR14L1_0x28_BMP}, + {6, 4, 18, 1, -4, helvR14L1_0x29_BMP}, + {7, 5, 7, 1, 7, helvR14L1_0x2A_BMP}, + {10, 8, 10, 1, 0, helvR14L1_0x2B_BMP}, + {5, 2, 5, 1, -3, helvR14L1_0x2C_BMP}, + {6, 5, 1, 0, 5, helvR14L1_0x2D_BMP}, + {5, 2, 2, 1, 0, helvR14L1_0x2E_BMP}, + {5, 5, 14, 0, 0, helvR14L1_0x2F_BMP}, + {10, 8, 13, 1, 0, helvR14L1_0x30_BMP}, + {10, 5, 13, 2, 0, helvR14L1_0x31_BMP}, + {10, 8, 13, 1, 0, helvR14L1_0x32_BMP}, + {10, 8, 13, 1, 0, helvR14L1_0x33_BMP}, + {10, 9, 13, 0, 0, helvR14L1_0x34_BMP}, + {10, 8, 13, 1, 0, helvR14L1_0x35_BMP}, + {10, 8, 13, 1, 0, helvR14L1_0x36_BMP}, + {10, 8, 13, 1, 0, helvR14L1_0x37_BMP}, + {10, 8, 13, 1, 0, helvR14L1_0x38_BMP}, + {10, 8, 13, 1, 0, helvR14L1_0x39_BMP}, + {5, 2, 10, 1, 0, helvR14L1_0x3A_BMP}, + {5, 2, 13, 1, -3, helvR14L1_0x3B_BMP}, + {10, 8, 9, 1, 0, helvR14L1_0x3C_BMP}, + {11, 7, 5, 2, 2, helvR14L1_0x3D_BMP}, + {10, 8, 9, 1, 0, helvR14L1_0x3E_BMP}, + {10, 7, 14, 1, 0, helvR14L1_0x3F_BMP}, + {18, 16, 17, 1, -3, helvR14L1_0x40_BMP}, + {13, 12, 14, 0, 0, helvR14L1_0x41_BMP}, + {13, 11, 14, 1, 0, helvR14L1_0x42_BMP}, + {14, 12, 14, 1, 0, helvR14L1_0x43_BMP}, + {14, 12, 14, 1, 0, helvR14L1_0x44_BMP}, + {13, 10, 14, 2, 0, helvR14L1_0x45_BMP}, + {12, 9, 14, 2, 0, helvR14L1_0x46_BMP}, + {15, 13, 14, 1, 0, helvR14L1_0x47_BMP}, + {14, 11, 14, 1, 0, helvR14L1_0x48_BMP}, + {6, 2, 14, 2, 0, helvR14L1_0x49_BMP}, + {10, 8, 14, 0, 0, helvR14L1_0x4A_BMP}, + {13, 12, 14, 2, 0, helvR14L1_0x4B_BMP}, + {11, 9, 14, 1, 0, helvR14L1_0x4C_BMP}, + {16, 14, 14, 1, 0, helvR14L1_0x4D_BMP}, + {14, 11, 14, 1, 0, helvR14L1_0x4E_BMP}, + {15, 13, 14, 1, 0, helvR14L1_0x4F_BMP}, + {13, 10, 14, 2, 0, helvR14L1_0x50_BMP}, + {15, 13, 15, 1, -1, helvR14L1_0x51_BMP}, + {14, 11, 14, 1, 0, helvR14L1_0x52_BMP}, + {13, 10, 14, 1, 0, helvR14L1_0x53_BMP}, + {12, 10, 14, 1, 0, helvR14L1_0x54_BMP}, + {14, 11, 14, 1, 0, helvR14L1_0x55_BMP}, + {13, 12, 14, 0, 0, helvR14L1_0x56_BMP}, + {18, 16, 14, 1, 0, helvR14L1_0x57_BMP}, + {13, 11, 14, 1, 0, helvR14L1_0x58_BMP}, + {13, 12, 14, 0, 0, helvR14L1_0x59_BMP}, + {12, 10, 14, 1, 0, helvR14L1_0x5A_BMP}, + {5, 4, 18, 0, -4, helvR14L1_0x5B_BMP}, + {5, 5, 14, 0, 0, helvR14L1_0x5C_BMP}, + {5, 4, 18, 0, -4, helvR14L1_0x5D_BMP}, + {9, 7, 6, 1, 7, helvR14L1_0x5E_BMP}, + {11, 11, 2, 0, -4, helvR14L1_0x5F_BMP}, + {4, 4, 3, 0, 11, helvR14L1_0x60_BMP}, + {11, 9, 10, 1, 0, helvR14L1_0x61_BMP}, + {11, 9, 14, 1, 0, helvR14L1_0x62_BMP}, + {10, 8, 10, 1, 0, helvR14L1_0x63_BMP}, + {11, 9, 14, 1, 0, helvR14L1_0x64_BMP}, + {10, 8, 10, 1, 0, helvR14L1_0x65_BMP}, + {6, 6, 14, 0, 0, helvR14L1_0x66_BMP}, + {11, 9, 14, 1, -4, helvR14L1_0x67_BMP}, + {10, 8, 14, 1, 0, helvR14L1_0x68_BMP}, + {4, 2, 14, 1, 0, helvR14L1_0x69_BMP}, + {4, 4, 18, -1, -4, helvR14L1_0x6A_BMP}, + {9, 8, 14, 1, 0, helvR14L1_0x6B_BMP}, + {4, 2, 14, 1, 0, helvR14L1_0x6C_BMP}, + {16, 14, 10, 1, 0, helvR14L1_0x6D_BMP}, + {10, 8, 10, 1, 0, helvR14L1_0x6E_BMP}, + {11, 9, 10, 1, 0, helvR14L1_0x6F_BMP}, + {11, 9, 14, 1, -4, helvR14L1_0x70_BMP}, + {11, 9, 14, 1, -4, helvR14L1_0x71_BMP}, + {6, 5, 10, 1, 0, helvR14L1_0x72_BMP}, + {9, 7, 10, 1, 0, helvR14L1_0x73_BMP}, + {6, 6, 13, 0, 0, helvR14L1_0x74_BMP}, + {10, 8, 10, 1, 0, helvR14L1_0x75_BMP}, + {10, 8, 10, 1, 0, helvR14L1_0x76_BMP}, + {14, 12, 10, 1, 0, helvR14L1_0x77_BMP}, + {10, 8, 10, 1, 0, helvR14L1_0x78_BMP}, + {10, 8, 14, 1, -4, helvR14L1_0x79_BMP}, + {9, 7, 10, 1, 0, helvR14L1_0x7A_BMP}, + {6, 6, 18, -1, -4, helvR14L1_0x7B_BMP}, + {5, 2, 18, 1, -4, helvR14L1_0x7C_BMP}, + {6, 6, 18, 0, -4, helvR14L1_0x7D_BMP}, + {10, 8, 3, 1, 4, helvR14L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {5, 1, 1, 0, 0, helvR14L1_0xA0_BMP}, + {6, 2, 14, 2, -4, helvR14L1_0xA1_BMP}, + {10, 8, 14, 1, -2, helvR14L1_0xA2_BMP}, + {10, 9, 13, 0, 0, helvR14L1_0xA3_BMP}, + {10, 8, 7, 1, 3, helvR14L1_0xA4_BMP}, + {10, 8, 13, 1, 0, helvR14L1_0xA5_BMP}, + {5, 2, 18, 1, -4, helvR14L1_0xA6_BMP}, + {10, 8, 18, 1, -4, helvR14L1_0xA7_BMP}, + {6, 5, 2, 0, 12, helvR14L1_0xA8_BMP}, + {15, 13, 14, 1, 0, helvR14L1_0xA9_BMP}, + {7, 5, 8, 1, 6, helvR14L1_0xAA_BMP}, + {9, 7, 6, 1, 2, helvR14L1_0xAB_BMP}, + {11, 9, 5, 1, 3, helvR14L1_0xAC_BMP}, + {6, 5, 1, 0, 5, helvR14L1_0xAD_BMP}, + {14, 13, 14, 0, 0, helvR14L1_0xAE_BMP}, + {5, 5, 1, 0, 12, helvR14L1_0xAF_BMP}, + {7, 5, 5, 1, 8, helvR14L1_0xB0_BMP}, + {10, 8, 11, 1, 0, helvR14L1_0xB1_BMP}, + {6, 5, 8, 0, 5, helvR14L1_0xB2_BMP}, + {6, 5, 8, 0, 5, helvR14L1_0xB3_BMP}, + {4, 4, 3, 0, 11, helvR14L1_0xB4_BMP}, + {10, 8, 14, 1, -4, helvR14L1_0xB5_BMP}, + {10, 8, 18, 1, -4, helvR14L1_0xB6_BMP}, + {4, 2, 2, 1, 4, helvR14L1_0xB7_BMP}, + {5, 5, 5, 0, -4, helvR14L1_0xB8_BMP}, + {6, 4, 8, 0, 5, helvR14L1_0xB9_BMP}, + {7, 5, 8, 1, 6, helvR14L1_0xBA_BMP}, + {9, 7, 6, 1, 2, helvR14L1_0xBB_BMP}, + {15, 14, 13, 0, 0, helvR14L1_0xBC_BMP}, + {15, 14, 13, 0, 0, helvR14L1_0xBD_BMP}, + {15, 14, 13, 0, 0, helvR14L1_0xBE_BMP}, + {10, 7, 14, 1, -4, helvR14L1_0xBF_BMP}, + {13, 12, 18, 0, 0, helvR14L1_0xC0_BMP}, + {13, 12, 18, 0, 0, helvR14L1_0xC1_BMP}, + {13, 12, 18, 0, 0, helvR14L1_0xC2_BMP}, + {13, 12, 18, 0, 0, helvR14L1_0xC3_BMP}, + {13, 12, 17, 0, 0, helvR14L1_0xC4_BMP}, + {13, 12, 17, 0, 0, helvR14L1_0xC5_BMP}, + {18, 16, 14, 1, 0, helvR14L1_0xC6_BMP}, + {14, 12, 18, 1, -4, helvR14L1_0xC7_BMP}, + {13, 10, 18, 2, 0, helvR14L1_0xC8_BMP}, + {13, 10, 18, 2, 0, helvR14L1_0xC9_BMP}, + {13, 10, 18, 2, 0, helvR14L1_0xCA_BMP}, + {13, 10, 17, 2, 0, helvR14L1_0xCB_BMP}, + {6, 4, 18, 0, 0, helvR14L1_0xCC_BMP}, + {6, 4, 18, 2, 0, helvR14L1_0xCD_BMP}, + {6, 6, 18, 0, 0, helvR14L1_0xCE_BMP}, + {6, 6, 17, 0, 0, helvR14L1_0xCF_BMP}, + {14, 14, 14, -1, 0, helvR14L1_0xD0_BMP}, + {14, 11, 18, 1, 0, helvR14L1_0xD1_BMP}, + {15, 13, 18, 1, 0, helvR14L1_0xD2_BMP}, + {15, 13, 18, 1, 0, helvR14L1_0xD3_BMP}, + {15, 13, 18, 1, 0, helvR14L1_0xD4_BMP}, + {15, 13, 18, 1, 0, helvR14L1_0xD5_BMP}, + {15, 13, 17, 1, 0, helvR14L1_0xD6_BMP}, + {10, 10, 9, 0, 0, helvR14L1_0xD7_BMP}, + {15, 14, 14, 0, 0, helvR14L1_0xD8_BMP}, + {14, 11, 18, 1, 0, helvR14L1_0xD9_BMP}, + {14, 11, 18, 1, 0, helvR14L1_0xDA_BMP}, + {14, 11, 18, 1, 0, helvR14L1_0xDB_BMP}, + {14, 11, 17, 1, 0, helvR14L1_0xDC_BMP}, + {13, 12, 18, 0, 0, helvR14L1_0xDD_BMP}, + {12, 10, 14, 1, 0, helvR14L1_0xDE_BMP}, + {9, 7, 14, 1, 0, helvR14L1_0xDF_BMP}, + {11, 9, 14, 1, 0, helvR14L1_0xE0_BMP}, + {11, 9, 14, 1, 0, helvR14L1_0xE1_BMP}, + {11, 9, 14, 1, 0, helvR14L1_0xE2_BMP}, + {11, 9, 14, 1, 0, helvR14L1_0xE3_BMP}, + {11, 9, 14, 1, 0, helvR14L1_0xE4_BMP}, + {11, 9, 14, 1, 0, helvR14L1_0xE5_BMP}, + {17, 14, 10, 2, 0, helvR14L1_0xE6_BMP}, + {10, 8, 14, 1, -4, helvR14L1_0xE7_BMP}, + {10, 8, 14, 1, 0, helvR14L1_0xE8_BMP}, + {10, 8, 14, 1, 0, helvR14L1_0xE9_BMP}, + {10, 8, 14, 1, 0, helvR14L1_0xEA_BMP}, + {10, 8, 14, 1, 0, helvR14L1_0xEB_BMP}, + {4, 4, 14, 0, 0, helvR14L1_0xEC_BMP}, + {4, 4, 14, 0, 0, helvR14L1_0xED_BMP}, + {4, 6, 14, -1, 0, helvR14L1_0xEE_BMP}, + {4, 5, 14, 0, 0, helvR14L1_0xEF_BMP}, + {11, 9, 14, 1, 0, helvR14L1_0xF0_BMP}, + {10, 8, 14, 1, 0, helvR14L1_0xF1_BMP}, + {11, 9, 14, 1, 0, helvR14L1_0xF2_BMP}, + {11, 9, 14, 1, 0, helvR14L1_0xF3_BMP}, + {11, 9, 14, 1, 0, helvR14L1_0xF4_BMP}, + {11, 9, 14, 1, 0, helvR14L1_0xF5_BMP}, + {11, 9, 14, 1, 0, helvR14L1_0xF6_BMP}, + {10, 8, 8, 1, 1, helvR14L1_0xF7_BMP}, + {11, 11, 10, 0, 0, helvR14L1_0xF8_BMP}, + {10, 8, 14, 1, 0, helvR14L1_0xF9_BMP}, + {10, 8, 14, 1, 0, helvR14L1_0xFA_BMP}, + {10, 8, 14, 1, 0, helvR14L1_0xFB_BMP}, + {10, 8, 14, 1, 0, helvR14L1_0xFC_BMP}, + {10, 8, 18, 1, -4, helvR14L1_0xFD_BMP}, + {11, 9, 18, 1, -4, helvR14L1_0xFE_BMP}, + {10, 8, 18, 1, -4, helvR14L1_0xFF_BMP} +}; + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontHelv14Normal_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontHelv14Normal_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontHelv14Normal_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontHelv14Normal_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontHelv14Normal_GetFontChar, + McuFontHelv14Normal_FBBy, + McuFontHelv14Normal_GetUnderlineBoxHeight(), + McuFontHelv14Normal_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv14Normal_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv14Normal_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv14Normal_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv14Normal_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontHelv14Normal. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv14Normal.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv14Normal.h new file mode 100644 index 0000000..e1840b7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv14Normal.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv14Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv14Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 14 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv14Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv14Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv14Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv14Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv14Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv14Normal_Deinit(void); +** Init - void McuFontHelv14Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv14Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv14Normal_module McuFontHelv14Normal module documentation +** @{ +*/ + + +#ifndef __McuFontHelv14Normal_H +#define __McuFontHelv14Normal_H + +/* MODULE McuFontHelv14Normal. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontHelv14Normalconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontHelv14Normal_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontHelv14Normal_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontHelv14Normal_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontHelv14Normal_GetLineSpaceHeight() \ + 2 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontHelv14Normal_GetUnderlineBoxHeight() \ + 5 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontHelv14Normal_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontHelv14Normal_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontHelv14Normal. */ + +#endif +/* ifndef __McuFontHelv14Normal_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv18Bold.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv18Bold.c new file mode 100644 index 0000000..9f4aac3 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv18Bold.c @@ -0,0 +1,4444 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv18Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv18Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 18 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv18Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv18Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv18Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv18Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv18Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv18Bold_Deinit(void); +** Init - void McuFontHelv18Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv18Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv18Bold_module McuFontHelv18Bold module documentation +** @{ +*/ + +/* MODULE McuFontHelv18Bold. */ + +#include "McuFontHelv18Bold.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontHelv18Bold_FBBy 27 + +static const uint8_t helvB18L1_0x00_BMP[] = { + 0xAA, 0xAA, + 0x00, 0x00, + 0x80, 0x02, + 0x00, 0x00, + 0x80, 0x02, + 0x00, 0x00, + 0x80, 0x02, + 0x00, 0x00, + 0x80, 0x02, + 0x00, 0x00, + 0x80, 0x02, + 0x00, 0x00, + 0x80, 0x02, + 0x00, 0x00, + 0x80, 0x02, + 0x00, 0x00, + 0x80, 0x02, + 0x00, 0x00, + 0xAA, 0xAA +}; + +static const uint8_t helvB18L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t helvB18L1_0x21_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xC0, + 0xC0, + 0xC0, + 0x00, + 0x00, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvB18L1_0x22_BMP[] = { + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0xD8, + 0x90 +}; + +static const uint8_t helvB18L1_0x23_BMP[] = { + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x7F, 0xF0, + 0x7F, 0xF0, + 0x19, 0x80, + 0x19, 0x80, + 0x19, 0x80, + 0x19, 0x80, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0x33, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x33, 0x00, + 0x33, 0x00 +}; + +static const uint8_t helvB18L1_0x24_BMP[] = { + 0x06, 0x00, + 0x3F, 0x80, + 0x7F, 0xE0, + 0xF6, 0xE0, + 0xE6, 0x70, + 0xE6, 0x70, + 0xF6, 0x00, + 0x7E, 0x00, + 0x3E, 0x00, + 0x0F, 0x00, + 0x07, 0xC0, + 0x07, 0xE0, + 0x06, 0xF0, + 0xE6, 0x70, + 0xE6, 0x70, + 0xE6, 0x70, + 0xF6, 0xF0, + 0x7F, 0xE0, + 0x1F, 0xC0, + 0x06, 0x00, + 0x06, 0x00 +}; + +static const uint8_t helvB18L1_0x25_BMP[] = { + 0x00, 0x07, 0x00, + 0x3E, 0x07, 0x00, + 0x7F, 0x0E, 0x00, + 0xE3, 0x8E, 0x00, + 0xC1, 0x9C, 0x00, + 0xC1, 0x9C, 0x00, + 0xE3, 0xB8, 0x00, + 0x7F, 0x38, 0x00, + 0x3E, 0x70, 0x00, + 0x00, 0x70, 0x00, + 0x00, 0xE3, 0xE0, + 0x00, 0xE7, 0xF0, + 0x01, 0xCE, 0x38, + 0x01, 0xCC, 0x18, + 0x03, 0x8C, 0x18, + 0x03, 0x8E, 0x38, + 0x07, 0x07, 0xF0, + 0x07, 0x03, 0xE0 +}; + +static const uint8_t helvB18L1_0x26_BMP[] = { + 0x0F, 0x80, + 0x1F, 0xC0, + 0x3D, 0xE0, + 0x38, 0xE0, + 0x38, 0xE0, + 0x38, 0xE0, + 0x1D, 0xC0, + 0x0F, 0x80, + 0x1F, 0x00, + 0x3F, 0x9C, + 0x7B, 0xDC, + 0x71, 0xFC, + 0xE0, 0xF8, + 0xE0, 0x70, + 0xE0, 0xF8, + 0xF1, 0xFC, + 0x7F, 0xCE, + 0x1F, 0x87 +}; + +static const uint8_t helvB18L1_0x27_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x80 +}; + +static const uint8_t helvB18L1_0x28_BMP[] = { + 0x0C, + 0x1C, + 0x38, + 0x38, + 0x70, + 0x70, + 0x60, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0x60, + 0x70, + 0x70, + 0x38, + 0x38, + 0x1C, + 0x0C +}; + +static const uint8_t helvB18L1_0x29_BMP[] = { + 0xC0, + 0xE0, + 0x70, + 0x70, + 0x38, + 0x38, + 0x18, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x18, + 0x38, + 0x38, + 0x70, + 0x70, + 0xE0, + 0xC0 +}; + +static const uint8_t helvB18L1_0x2A_BMP[] = { + 0x18, + 0x18, + 0xDB, + 0xFF, + 0x3C, + 0x66, + 0x66 +}; + +static const uint8_t helvB18L1_0x2B_BMP[] = { + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00 +}; + +static const uint8_t helvB18L1_0x2C_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0x60, + 0x60, + 0xC0 +}; + +static const uint8_t helvB18L1_0x2D_BMP[] = { + 0xFE, + 0xFE, + 0xFE +}; + +static const uint8_t helvB18L1_0x2E_BMP[] = { + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvB18L1_0x2F_BMP[] = { + 0x06, + 0x06, + 0x06, + 0x0C, + 0x0C, + 0x0C, + 0x18, + 0x18, + 0x18, + 0x18, + 0x30, + 0x30, + 0x30, + 0x60, + 0x60, + 0x60, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB18L1_0x30_BMP[] = { + 0x1F, 0x80, + 0x3F, 0xC0, + 0x79, 0xE0, + 0x70, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0x70, 0xE0, + 0x70, 0xE0, + 0x79, 0xE0, + 0x3F, 0xC0, + 0x1F, 0x80 +}; + +static const uint8_t helvB18L1_0x31_BMP[] = { + 0x0E, + 0x0E, + 0x1E, + 0xFE, + 0xFE, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E +}; + +static const uint8_t helvB18L1_0x32_BMP[] = { + 0x1F, 0x00, + 0x7F, 0xC0, + 0x71, 0xE0, + 0xE0, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0x00, 0x70, + 0x00, 0xE0, + 0x01, 0xE0, + 0x03, 0xC0, + 0x07, 0x80, + 0x1F, 0x00, + 0x3C, 0x00, + 0x78, 0x00, + 0xF0, 0x00, + 0xE0, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0 +}; + +static const uint8_t helvB18L1_0x33_BMP[] = { + 0x1F, 0x00, + 0x7F, 0xC0, + 0x71, 0xC0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0x00, 0xE0, + 0x01, 0xC0, + 0x0F, 0x80, + 0x0F, 0xE0, + 0x00, 0xE0, + 0x00, 0x70, + 0x00, 0x70, + 0xE0, 0x70, + 0xE0, 0xF0, + 0x71, 0xE0, + 0x7F, 0xE0, + 0x1F, 0x80 +}; + +static const uint8_t helvB18L1_0x34_BMP[] = { + 0x01, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x07, 0xC0, + 0x07, 0xC0, + 0x0D, 0xC0, + 0x1D, 0xC0, + 0x19, 0xC0, + 0x31, 0xC0, + 0x71, 0xC0, + 0x61, 0xC0, + 0xE1, 0xC0, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0x01, 0xC0, + 0x01, 0xC0, + 0x01, 0xC0, + 0x01, 0xC0 +}; + +static const uint8_t helvB18L1_0x35_BMP[] = { + 0x7F, 0xE0, + 0x7F, 0xE0, + 0x70, 0x00, + 0x70, 0x00, + 0x70, 0x00, + 0x70, 0x00, + 0x7F, 0x80, + 0x7F, 0xC0, + 0x71, 0xE0, + 0x00, 0xE0, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0x70, + 0xE0, 0x70, + 0xE0, 0xF0, + 0xF1, 0xE0, + 0x7F, 0xC0, + 0x1F, 0x80 +}; + +static const uint8_t helvB18L1_0x36_BMP[] = { + 0x0F, 0x80, + 0x3F, 0xE0, + 0x78, 0xE0, + 0x70, 0x70, + 0xE0, 0x70, + 0xE0, 0x00, + 0xE0, 0x00, + 0xEF, 0x00, + 0xFF, 0xC0, + 0xF9, 0xE0, + 0xF0, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0x70, 0xE0, + 0x79, 0xE0, + 0x3F, 0xC0, + 0x1F, 0x80 +}; + +static const uint8_t helvB18L1_0x37_BMP[] = { + 0xFF, 0xF0, + 0xFF, 0xF0, + 0x00, 0xF0, + 0x00, 0xE0, + 0x01, 0xC0, + 0x01, 0xC0, + 0x03, 0x80, + 0x03, 0x80, + 0x07, 0x00, + 0x07, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x1E, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x3C, 0x00, + 0x38, 0x00, + 0x38, 0x00 +}; + +static const uint8_t helvB18L1_0x38_BMP[] = { + 0x0F, 0x00, + 0x3F, 0xC0, + 0x39, 0xC0, + 0x70, 0xE0, + 0x70, 0xE0, + 0x70, 0xE0, + 0x70, 0xE0, + 0x39, 0xC0, + 0x1F, 0x80, + 0x3F, 0xC0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0x70, 0xE0, + 0x7F, 0xE0, + 0x1F, 0x80 +}; + +static const uint8_t helvB18L1_0x39_BMP[] = { + 0x1F, 0x80, + 0x7F, 0xC0, + 0x79, 0xE0, + 0xF0, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xF0, 0xF0, + 0x79, 0xF0, + 0x7F, 0xF0, + 0x1F, 0x70, + 0x00, 0x70, + 0x00, 0x70, + 0xE0, 0xE0, + 0xF3, 0xE0, + 0x7F, 0xC0, + 0x1F, 0x00 +}; + +static const uint8_t helvB18L1_0x3A_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvB18L1_0x3B_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xE0, + 0xE0, + 0xE0, + 0x60, + 0x60, + 0xC0 +}; + +static const uint8_t helvB18L1_0x3C_BMP[] = { + 0x00, 0x38, + 0x00, 0xF8, + 0x03, 0xE0, + 0x0F, 0x80, + 0x3E, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0x3E, 0x00, + 0x0F, 0x80, + 0x03, 0xE0, + 0x00, 0xF8, + 0x00, 0x38 +}; + +static const uint8_t helvB18L1_0x3D_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t helvB18L1_0x3E_BMP[] = { + 0xE0, 0x00, + 0xF8, 0x00, + 0x3E, 0x00, + 0x0F, 0x80, + 0x03, 0xE0, + 0x00, 0x78, + 0x00, 0x78, + 0x03, 0xE0, + 0x0F, 0x80, + 0x3E, 0x00, + 0xF8, 0x00, + 0xE0, 0x00 +}; + +static const uint8_t helvB18L1_0x3F_BMP[] = { + 0x1F, 0x80, + 0x7F, 0xC0, + 0x79, 0xE0, + 0xF0, 0xE0, + 0xE0, 0xE0, + 0xE1, 0xE0, + 0x01, 0xC0, + 0x03, 0xC0, + 0x07, 0x80, + 0x07, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00 +}; + +static const uint8_t helvB18L1_0x40_BMP[] = { + 0x01, 0xFF, 0x00, + 0x07, 0xFF, 0xC0, + 0x0F, 0x81, 0xF0, + 0x1E, 0x00, 0x78, + 0x3C, 0x00, 0x38, + 0x78, 0x7D, 0x9C, + 0x70, 0xFF, 0x9C, + 0xF1, 0xC7, 0x1C, + 0xE3, 0x87, 0x1C, + 0xE3, 0x0E, 0x1C, + 0xE7, 0x0E, 0x38, + 0xE7, 0x0C, 0x38, + 0xE7, 0x1C, 0x70, + 0xE7, 0x1C, 0x70, + 0xE3, 0x9D, 0xE0, + 0xF3, 0xFF, 0xC0, + 0x71, 0xF7, 0x00, + 0x78, 0x00, 0x00, + 0x3C, 0x00, 0x00, + 0x1F, 0x07, 0x00, + 0x0F, 0xFF, 0x00, + 0x03, 0xFC, 0x00 +}; + +static const uint8_t helvB18L1_0x41_BMP[] = { + 0x03, 0xC0, + 0x03, 0xC0, + 0x07, 0xE0, + 0x07, 0xE0, + 0x0E, 0x60, + 0x0E, 0x70, + 0x0E, 0x70, + 0x1C, 0x38, + 0x1C, 0x38, + 0x1C, 0x38, + 0x38, 0x1C, + 0x38, 0x1C, + 0x3F, 0xFC, + 0x7F, 0xFE, + 0x70, 0x0E, + 0x70, 0x0E, + 0xE0, 0x07, + 0xE0, 0x07, + 0xE0, 0x07 +}; + +static const uint8_t helvB18L1_0x42_BMP[] = { + 0xFF, 0xE0, + 0xFF, 0xF8, + 0xE0, 0x78, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x38, + 0xFF, 0xF0, + 0xFF, 0xF8, + 0xE0, 0x1C, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x1E, + 0xE0, 0x7C, + 0xFF, 0xF8, + 0xFF, 0xE0 +}; + +static const uint8_t helvB18L1_0x43_BMP[] = { + 0x07, 0xF0, + 0x1F, 0xFC, + 0x3E, 0x3E, + 0x78, 0x0F, + 0x70, 0x07, + 0xF0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xF0, 0x07, + 0x70, 0x07, + 0x78, 0x0F, + 0x3E, 0x3E, + 0x1F, 0xFC, + 0x07, 0xF0 +}; + +static const uint8_t helvB18L1_0x44_BMP[] = { + 0xFF, 0xE0, + 0xFF, 0xF8, + 0xE0, 0x7C, + 0xE0, 0x1E, + 0xE0, 0x0E, + 0xE0, 0x0F, + 0xE0, 0x07, + 0xE0, 0x07, + 0xE0, 0x07, + 0xE0, 0x07, + 0xE0, 0x07, + 0xE0, 0x07, + 0xE0, 0x07, + 0xE0, 0x0F, + 0xE0, 0x0E, + 0xE0, 0x1E, + 0xE0, 0x7C, + 0xFF, 0xF8, + 0xFF, 0xE0 +}; + +static const uint8_t helvB18L1_0x45_BMP[] = { + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0xF8, + 0xFF, 0xF8 +}; + +static const uint8_t helvB18L1_0x46_BMP[] = { + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00 +}; + +static const uint8_t helvB18L1_0x47_BMP[] = { + 0x07, 0xF0, 0x00, + 0x1F, 0xFC, 0x00, + 0x3E, 0x3E, 0x00, + 0x78, 0x0F, 0x00, + 0x70, 0x07, 0x00, + 0xF0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x7F, 0x80, + 0xE0, 0x7F, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xF0, 0x03, 0x80, + 0x70, 0x07, 0x80, + 0x78, 0x0F, 0x80, + 0x3E, 0x3F, 0x80, + 0x1F, 0xFB, 0x80, + 0x07, 0xF3, 0x80 +}; + +static const uint8_t helvB18L1_0x48_BMP[] = { + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E +}; + +static const uint8_t helvB18L1_0x49_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvB18L1_0x4A_BMP[] = { + 0x00, 0xE0, + 0x00, 0xE0, + 0x00, 0xE0, + 0x00, 0xE0, + 0x00, 0xE0, + 0x00, 0xE0, + 0x00, 0xE0, + 0x00, 0xE0, + 0x00, 0xE0, + 0x00, 0xE0, + 0x00, 0xE0, + 0x00, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0x71, 0xE0, + 0x7F, 0xC0, + 0x3F, 0x80 +}; + +static const uint8_t helvB18L1_0x4B_BMP[] = { + 0xE0, 0x3C, + 0xE0, 0x78, + 0xE0, 0xF0, + 0xE1, 0xE0, + 0xE3, 0xC0, + 0xE7, 0x80, + 0xEF, 0x00, + 0xFE, 0x00, + 0xFE, 0x00, + 0xFF, 0x00, + 0xF7, 0x80, + 0xE3, 0x80, + 0xE1, 0xC0, + 0xE1, 0xE0, + 0xE0, 0xE0, + 0xE0, 0x70, + 0xE0, 0x78, + 0xE0, 0x38, + 0xE0, 0x3C +}; + +static const uint8_t helvB18L1_0x4C_BMP[] = { + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0 +}; + +static const uint8_t helvB18L1_0x4D_BMP[] = { + 0xE0, 0x00, 0xE0, + 0xF0, 0x01, 0xE0, + 0xF0, 0x01, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xFC, 0x07, 0xE0, + 0xEC, 0x06, 0xE0, + 0xEE, 0x0E, 0xE0, + 0xE6, 0x0C, 0xE0, + 0xE7, 0x1C, 0xE0, + 0xE7, 0x1C, 0xE0, + 0xE3, 0x18, 0xE0, + 0xE3, 0xB8, 0xE0, + 0xE3, 0xB8, 0xE0, + 0xE1, 0xF0, 0xE0, + 0xE1, 0xF0, 0xE0, + 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0 +}; + +static const uint8_t helvB18L1_0x4E_BMP[] = { + 0xE0, 0x0E, + 0xF0, 0x0E, + 0xF0, 0x0E, + 0xF8, 0x0E, + 0xF8, 0x0E, + 0xFC, 0x0E, + 0xEE, 0x0E, + 0xEE, 0x0E, + 0xE7, 0x0E, + 0xE3, 0x8E, + 0xE3, 0x8E, + 0xE1, 0xCE, + 0xE0, 0xCE, + 0xE0, 0xEE, + 0xE0, 0x7E, + 0xE0, 0x3E, + 0xE0, 0x3E, + 0xE0, 0x1E, + 0xE0, 0x0E +}; + +static const uint8_t helvB18L1_0x4F_BMP[] = { + 0x07, 0xF0, 0x00, + 0x1F, 0xFC, 0x00, + 0x3E, 0x3E, 0x00, + 0x78, 0x0F, 0x00, + 0x70, 0x07, 0x00, + 0xF0, 0x07, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xF0, 0x07, 0x80, + 0x70, 0x07, 0x00, + 0x78, 0x0F, 0x00, + 0x3E, 0x3E, 0x00, + 0x1F, 0xFC, 0x00, + 0x07, 0xF0, 0x00 +}; + +static const uint8_t helvB18L1_0x50_BMP[] = { + 0xFF, 0xE0, + 0xFF, 0xF8, + 0xE0, 0x38, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x38, + 0xFF, 0xF8, + 0xFF, 0xF0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00 +}; + +static const uint8_t helvB18L1_0x51_BMP[] = { + 0x07, 0xF0, 0x00, + 0x1F, 0xFC, 0x00, + 0x3E, 0x3E, 0x00, + 0x78, 0x0F, 0x00, + 0x70, 0x07, 0x00, + 0xF0, 0x07, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xF0, 0x27, 0x80, + 0x70, 0x77, 0x00, + 0x78, 0x3F, 0x00, + 0x3E, 0x1E, 0x00, + 0x1F, 0xFE, 0x00, + 0x07, 0xF7, 0x00, + 0x00, 0x02, 0x00 +}; + +static const uint8_t helvB18L1_0x52_BMP[] = { + 0xFF, 0xE0, + 0xFF, 0xF8, + 0xE0, 0x38, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x38, + 0xFF, 0xF8, + 0xFF, 0xF0, + 0xE0, 0x78, + 0xE0, 0x38, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C +}; + +static const uint8_t helvB18L1_0x53_BMP[] = { + 0x0F, 0xC0, + 0x3F, 0xF0, + 0x78, 0xF8, + 0xF0, 0x38, + 0xE0, 0x38, + 0xE0, 0x00, + 0xF0, 0x00, + 0x7C, 0x00, + 0x3F, 0xC0, + 0x07, 0xF0, + 0x00, 0xF8, + 0x00, 0x3C, + 0x00, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x3C, + 0xF8, 0xF8, + 0x7F, 0xF0, + 0x1F, 0xC0 +}; + +static const uint8_t helvB18L1_0x54_BMP[] = { + 0xFF, 0xFE, + 0xFF, 0xFE, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80 +}; + +static const uint8_t helvB18L1_0x55_BMP[] = { + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xF0, 0x1E, + 0x70, 0x1C, + 0x7C, 0x7C, + 0x3F, 0xF8, + 0x0F, 0xE0 +}; + +static const uint8_t helvB18L1_0x56_BMP[] = { + 0xE0, 0x07, + 0xE0, 0x07, + 0xF0, 0x0F, + 0x70, 0x0E, + 0x78, 0x1E, + 0x38, 0x1C, + 0x38, 0x1C, + 0x3C, 0x3C, + 0x1C, 0x38, + 0x1C, 0x38, + 0x1E, 0x78, + 0x0E, 0x70, + 0x0E, 0x70, + 0x0E, 0x70, + 0x07, 0xE0, + 0x07, 0xE0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0 +}; + +static const uint8_t helvB18L1_0x57_BMP[] = { + 0xE0, 0x70, 0x38, + 0xE0, 0x70, 0x38, + 0xE0, 0x70, 0x38, + 0xE0, 0x70, 0x38, + 0x70, 0xF8, 0x70, + 0x70, 0xF8, 0x70, + 0x70, 0xD8, 0x70, + 0x71, 0xDC, 0x70, + 0x31, 0xDC, 0x60, + 0x39, 0xDC, 0xE0, + 0x39, 0x8C, 0xE0, + 0x3B, 0x8E, 0xE0, + 0x1B, 0x8E, 0xC0, + 0x1B, 0x8E, 0xC0, + 0x1F, 0x07, 0xC0, + 0x1F, 0x07, 0xC0, + 0x0E, 0x03, 0x80, + 0x0E, 0x03, 0x80, + 0x0E, 0x03, 0x80 +}; + +static const uint8_t helvB18L1_0x58_BMP[] = { + 0xE0, 0x07, + 0xF0, 0x0F, + 0x78, 0x1E, + 0x38, 0x1C, + 0x1C, 0x38, + 0x0E, 0x70, + 0x0F, 0xF0, + 0x07, 0xE0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x07, 0xE0, + 0x0F, 0xF0, + 0x0E, 0x70, + 0x1C, 0x38, + 0x3C, 0x3C, + 0x38, 0x1C, + 0x70, 0x0E, + 0xF0, 0x0F, + 0xE0, 0x07 +}; + +static const uint8_t helvB18L1_0x59_BMP[] = { + 0xE0, 0x0E, + 0xF0, 0x0E, + 0x70, 0x1C, + 0x78, 0x1C, + 0x38, 0x38, + 0x3C, 0x38, + 0x1C, 0x70, + 0x1C, 0x70, + 0x0E, 0xE0, + 0x0E, 0xE0, + 0x07, 0xC0, + 0x07, 0xC0, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80 +}; + +static const uint8_t helvB18L1_0x5A_BMP[] = { + 0xFF, 0xFC, + 0xFF, 0xFC, + 0x00, 0x3C, + 0x00, 0x78, + 0x00, 0xF0, + 0x01, 0xE0, + 0x01, 0xE0, + 0x03, 0xC0, + 0x07, 0x80, + 0x07, 0x80, + 0x0F, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x3C, 0x00, + 0x38, 0x00, + 0x78, 0x00, + 0xF0, 0x00, + 0xFF, 0xFC, + 0xFF, 0xFC +}; + +static const uint8_t helvB18L1_0x5B_BMP[] = { + 0xF8, + 0xF8, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xF8, + 0xF8 +}; + +static const uint8_t helvB18L1_0x5C_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0x60, + 0x60, + 0x60, + 0x30, + 0x30, + 0x30, + 0x30, + 0x18, + 0x18, + 0x18, + 0x0C, + 0x0C, + 0x0C, + 0x06, + 0x06, + 0x06 +}; + +static const uint8_t helvB18L1_0x5D_BMP[] = { + 0xF8, + 0xF8, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0xF8, + 0xF8 +}; + +static const uint8_t helvB18L1_0x5E_BMP[] = { + 0x0E, 0x00, + 0x0E, 0x00, + 0x1F, 0x00, + 0x1B, 0x00, + 0x3B, 0x80, + 0x71, 0xC0, + 0x71, 0xC0, + 0xE0, 0xE0, + 0xE0, 0xE0 +}; + +static const uint8_t helvB18L1_0x5F_BMP[] = { + 0xFF, 0xFC, + 0xFF, 0xFC +}; + +static const uint8_t helvB18L1_0x60_BMP[] = { + 0xE0, + 0x70, + 0x38, + 0x1C +}; + +static const uint8_t helvB18L1_0x61_BMP[] = { + 0x1F, 0x80, + 0x3F, 0xC0, + 0x71, 0xE0, + 0x70, 0xE0, + 0x00, 0xE0, + 0x07, 0xE0, + 0x3F, 0xE0, + 0x7C, 0xE0, + 0xF0, 0xE0, + 0xE0, 0xE0, + 0xE1, 0xE0, + 0xF3, 0xE0, + 0x7F, 0xF0, + 0x3E, 0x70 +}; + +static const uint8_t helvB18L1_0x62_BMP[] = { + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xEF, 0x80, + 0xFF, 0xC0, + 0xF9, 0xE0, + 0xF0, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xF0, 0xE0, + 0xF9, 0xE0, + 0xFF, 0xC0, + 0xEF, 0x80 +}; + +static const uint8_t helvB18L1_0x63_BMP[] = { + 0x1F, 0x80, + 0x3F, 0xC0, + 0x79, 0xE0, + 0x70, 0xE0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0x70, 0xE0, + 0x79, 0xE0, + 0x3F, 0xC0, + 0x1F, 0x80 +}; + +static const uint8_t helvB18L1_0x64_BMP[] = { + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0x70, + 0x1F, 0x70, + 0x3F, 0xF0, + 0x79, 0xF0, + 0x70, 0xF0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0x70, 0xF0, + 0x79, 0xF0, + 0x3F, 0xF0, + 0x1F, 0x70 +}; + +static const uint8_t helvB18L1_0x65_BMP[] = { + 0x0F, 0x00, + 0x3F, 0xC0, + 0x79, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xE0, 0x00, + 0xE0, 0x00, + 0x70, 0x70, + 0x78, 0xF0, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t helvB18L1_0x66_BMP[] = { + 0x1E, + 0x3E, + 0x38, + 0x38, + 0x38, + 0xFE, + 0xFE, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38 +}; + +static const uint8_t helvB18L1_0x67_BMP[] = { + 0x1F, 0x70, + 0x3F, 0xF0, + 0x79, 0xF0, + 0x70, 0xF0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0x70, 0xF0, + 0x79, 0xF0, + 0x3F, 0xF0, + 0x1F, 0x70, + 0x00, 0x70, + 0xE0, 0x70, + 0xF0, 0xE0, + 0x7F, 0xE0, + 0x1F, 0x80 +}; + +static const uint8_t helvB18L1_0x68_BMP[] = { + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xEF, 0x00, + 0xFF, 0xC0, + 0xF1, 0xC0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0 +}; + +static const uint8_t helvB18L1_0x69_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0x00, + 0x00, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvB18L1_0x6A_BMP[] = { + 0x38, + 0x38, + 0x38, + 0x00, + 0x00, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0xF8, + 0xF0 +}; + +static const uint8_t helvB18L1_0x6B_BMP[] = { + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE1, 0xC0, + 0xE3, 0xC0, + 0xE7, 0x80, + 0xEF, 0x00, + 0xFE, 0x00, + 0xFC, 0x00, + 0xFE, 0x00, + 0xEF, 0x00, + 0xE7, 0x00, + 0xE7, 0x80, + 0xE3, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xE0, + 0xE0, 0xE0 +}; + +static const uint8_t helvB18L1_0x6C_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvB18L1_0x6D_BMP[] = { + 0xEF, 0x3E, 0x00, + 0xFF, 0xFF, 0x00, + 0xF3, 0xE7, 0x80, + 0xE1, 0xC3, 0x80, + 0xE1, 0xC3, 0x80, + 0xE1, 0xC3, 0x80, + 0xE1, 0xC3, 0x80, + 0xE1, 0xC3, 0x80, + 0xE1, 0xC3, 0x80, + 0xE1, 0xC3, 0x80, + 0xE1, 0xC3, 0x80, + 0xE1, 0xC3, 0x80, + 0xE1, 0xC3, 0x80, + 0xE1, 0xC3, 0x80 +}; + +static const uint8_t helvB18L1_0x6E_BMP[] = { + 0xEF, 0x80, + 0xFF, 0xC0, + 0xF1, 0xC0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0 +}; + +static const uint8_t helvB18L1_0x6F_BMP[] = { + 0x0F, 0x00, + 0x3F, 0xC0, + 0x79, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0x70, 0xE0, + 0x79, 0xE0, + 0x3F, 0xC0, + 0x0F, 0x00 +}; + +static const uint8_t helvB18L1_0x70_BMP[] = { + 0xEF, 0x80, + 0xFF, 0xC0, + 0xF9, 0xE0, + 0xF0, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xF0, 0xE0, + 0xF9, 0xE0, + 0xFF, 0xC0, + 0xEF, 0x80, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00 +}; + +static const uint8_t helvB18L1_0x71_BMP[] = { + 0x1F, 0x70, + 0x3F, 0xF0, + 0x79, 0xF0, + 0x70, 0xF0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0x70, 0xF0, + 0x79, 0xF0, + 0x3F, 0xF0, + 0x1F, 0x70, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0x70 +}; + +static const uint8_t helvB18L1_0x72_BMP[] = { + 0xEE, + 0xFE, + 0xFE, + 0xF0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvB18L1_0x73_BMP[] = { + 0x3F, 0x00, + 0x7F, 0x80, + 0xF3, 0xC0, + 0xE1, 0xC0, + 0xE0, 0x00, + 0xFC, 0x00, + 0x7F, 0x80, + 0x0F, 0xC0, + 0x01, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xF1, 0xE0, + 0x7F, 0xC0, + 0x3F, 0x80 +}; + +static const uint8_t helvB18L1_0x74_BMP[] = { + 0x38, + 0x38, + 0x38, + 0x38, + 0xFE, + 0xFE, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x3E, + 0x1E +}; + +static const uint8_t helvB18L1_0x75_BMP[] = { + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE1, 0xE0, + 0x73, 0xE0, + 0x7E, 0xE0, + 0x1C, 0xE0 +}; + +static const uint8_t helvB18L1_0x76_BMP[] = { + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0x70, 0xE0, + 0x70, 0xE0, + 0x70, 0xE0, + 0x39, 0xC0, + 0x39, 0xC0, + 0x39, 0xC0, + 0x1F, 0x80, + 0x1F, 0x80, + 0x0F, 0x00, + 0x0F, 0x00, + 0x0F, 0x00 +}; + +static const uint8_t helvB18L1_0x77_BMP[] = { + 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, + 0x60, 0xE0, 0xC0, + 0x71, 0xF1, 0xC0, + 0x71, 0xF1, 0xC0, + 0x31, 0xB1, 0x80, + 0x33, 0xB9, 0x80, + 0x3B, 0xBB, 0x80, + 0x1B, 0x1B, 0x00, + 0x1F, 0x1F, 0x00, + 0x1F, 0x1F, 0x00, + 0x0E, 0x0E, 0x00, + 0x0E, 0x0E, 0x00, + 0x0E, 0x0E, 0x00 +}; + +static const uint8_t helvB18L1_0x78_BMP[] = { + 0xE0, 0xE0, + 0xF1, 0xE0, + 0x71, 0xC0, + 0x3B, 0x80, + 0x3F, 0x80, + 0x1F, 0x00, + 0x0E, 0x00, + 0x1F, 0x00, + 0x1F, 0x00, + 0x3B, 0x80, + 0x7B, 0xC0, + 0x71, 0xC0, + 0xF1, 0xE0, + 0xE0, 0xE0 +}; + +static const uint8_t helvB18L1_0x79_BMP[] = { + 0xE0, 0x38, + 0xE0, 0x38, + 0x70, 0x38, + 0x78, 0x70, + 0x38, 0x70, + 0x3C, 0xF0, + 0x1C, 0xE0, + 0x1C, 0xE0, + 0x0F, 0xC0, + 0x0F, 0xC0, + 0x07, 0xC0, + 0x07, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x07, 0x00, + 0x07, 0x00, + 0x0E, 0x00, + 0x3E, 0x00, + 0x3C, 0x00 +}; + +static const uint8_t helvB18L1_0x7A_BMP[] = { + 0xFF, 0xE0, + 0xFF, 0xE0, + 0x01, 0xC0, + 0x03, 0x80, + 0x07, 0x80, + 0x0F, 0x00, + 0x0E, 0x00, + 0x1E, 0x00, + 0x3C, 0x00, + 0x38, 0x00, + 0x70, 0x00, + 0xF0, 0x00, + 0xFF, 0xE0, + 0xFF, 0xE0 +}; + +static const uint8_t helvB18L1_0x7B_BMP[] = { + 0x0E, + 0x1C, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x70, + 0xE0, + 0xE0, + 0x70, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x1C, + 0x0E +}; + +static const uint8_t helvB18L1_0x7C_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB18L1_0x7D_BMP[] = { + 0xE0, + 0x70, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x1C, + 0x0E, + 0x0E, + 0x1C, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x70, + 0xE0 +}; + +static const uint8_t helvB18L1_0x7E_BMP[] = { + 0x78, 0xE0, + 0xFE, 0xE0, + 0xEF, 0xE0, + 0xE3, 0xC0 +}; + +static const uint8_t helvB18L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t helvB18L1_0xA1_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0x00, + 0x00, + 0x60, + 0x60, + 0x60, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvB18L1_0xA2_BMP[] = { + 0x01, 0x80, + 0x01, 0x80, + 0x1F, 0x80, + 0x3F, 0xC0, + 0x7B, 0xE0, + 0x73, 0x60, + 0xE3, 0x00, + 0xE6, 0x00, + 0xE6, 0x00, + 0xE6, 0x00, + 0xE6, 0x00, + 0xEC, 0x00, + 0xEC, 0xE0, + 0x7D, 0xE0, + 0x7F, 0xC0, + 0x3F, 0x80, + 0x18, 0x00, + 0x18, 0x00 +}; + +static const uint8_t helvB18L1_0xA3_BMP[] = { + 0x1F, 0x80, + 0x3F, 0xC0, + 0x70, 0xE0, + 0x70, 0xE0, + 0x70, 0x00, + 0x78, 0x00, + 0x38, 0x00, + 0x1C, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x38, 0x00, + 0x38, 0x00, + 0x7F, 0x38, + 0xFF, 0xF8, + 0xF1, 0xF0 +}; + +static const uint8_t helvB18L1_0xA4_BMP[] = { + 0xC0, 0x30, + 0xEF, 0x70, + 0x7F, 0xE0, + 0x39, 0xC0, + 0x70, 0xE0, + 0x70, 0xE0, + 0x70, 0xE0, + 0x70, 0xE0, + 0x39, 0xC0, + 0x7F, 0xE0, + 0xEF, 0x70, + 0xC0, 0x30 +}; + +static const uint8_t helvB18L1_0xA5_BMP[] = { + 0xE0, 0x38, + 0xE0, 0x38, + 0x70, 0x70, + 0x70, 0x70, + 0x38, 0xE0, + 0x38, 0xE0, + 0x1D, 0xC0, + 0x1D, 0xC0, + 0x7F, 0xF0, + 0x7F, 0xF0, + 0x07, 0x00, + 0x7F, 0xF0, + 0x7F, 0xF0, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00 +}; + +static const uint8_t helvB18L1_0xA6_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x00, + 0x00, + 0x00, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB18L1_0xA7_BMP[] = { + 0x1F, 0x80, + 0x3F, 0xC0, + 0x79, 0xE0, + 0x70, 0xE0, + 0x78, 0xE0, + 0x3C, 0x00, + 0x1E, 0x00, + 0x7F, 0x00, + 0xF7, 0x80, + 0xE3, 0xC0, + 0xE1, 0xE0, + 0xE0, 0xE0, + 0x70, 0x70, + 0x78, 0x70, + 0x3C, 0x70, + 0x1E, 0xE0, + 0x0F, 0xC0, + 0x07, 0x80, + 0x03, 0xC0, + 0x71, 0xE0, + 0x70, 0xE0, + 0x79, 0xE0, + 0x3F, 0xC0, + 0x1F, 0x80 +}; + +static const uint8_t helvB18L1_0xA8_BMP[] = { + 0xEE, + 0xEE +}; + +static const uint8_t helvB18L1_0xA9_BMP[] = { + 0x01, 0xF0, 0x00, + 0x0F, 0xFE, 0x00, + 0x1E, 0x0F, 0x00, + 0x38, 0x03, 0x80, + 0x70, 0x01, 0xC0, + 0x61, 0xF0, 0xC0, + 0xE3, 0xB8, 0xE0, + 0xC6, 0x0C, 0x60, + 0xC6, 0x00, 0x60, + 0xC6, 0x00, 0x60, + 0xC6, 0x00, 0x60, + 0xC6, 0x0C, 0x60, + 0xE3, 0xB8, 0xE0, + 0x61, 0xF0, 0xC0, + 0x70, 0x01, 0xC0, + 0x38, 0x03, 0x80, + 0x1E, 0x0F, 0x00, + 0x0F, 0xFE, 0x00, + 0x01, 0xF0, 0x00 +}; + +static const uint8_t helvB18L1_0xAA_BMP[] = { + 0x7C, + 0xFE, + 0xC6, + 0x1E, + 0x7E, + 0xE6, + 0xC6, + 0xFF, + 0x7B, + 0x00, + 0xFF, + 0xFF +}; + +static const uint8_t helvB18L1_0xAB_BMP[] = { + 0x1D, 0xC0, + 0x3B, 0x80, + 0x77, 0x00, + 0xEE, 0x00, + 0xEE, 0x00, + 0x77, 0x00, + 0x3B, 0x80, + 0x1D, 0xC0 +}; + +static const uint8_t helvB18L1_0xAC_BMP[] = { + 0xFF, 0xF0, + 0xFF, 0xF0, + 0x00, 0x30, + 0x00, 0x30, + 0x00, 0x30, + 0x00, 0x30, + 0x00, 0x30 +}; + +static const uint8_t helvB18L1_0xAD_BMP[] = { + 0xFE, + 0xFE, + 0xFE +}; + +static const uint8_t helvB18L1_0xAE_BMP[] = { + 0x03, 0xF8, 0x00, + 0x0F, 0xFE, 0x00, + 0x1C, 0x0F, 0x00, + 0x38, 0x03, 0x80, + 0x73, 0xF9, 0xC0, + 0x63, 0x1C, 0xC0, + 0xE3, 0x0C, 0xE0, + 0xC3, 0x0C, 0x60, + 0xC3, 0x18, 0x60, + 0xC3, 0xF0, 0x60, + 0xC3, 0x30, 0x60, + 0xC3, 0x18, 0x60, + 0xE3, 0x18, 0x60, + 0x63, 0x0C, 0xE0, + 0x70, 0x00, 0xC0, + 0x38, 0x01, 0xC0, + 0x1E, 0x03, 0x80, + 0x0F, 0xFE, 0x00, + 0x03, 0xF8, 0x00 +}; + +static const uint8_t helvB18L1_0xAF_BMP[] = { + 0xFE, + 0xFE +}; + +static const uint8_t helvB18L1_0xB0_BMP[] = { + 0x3C, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t helvB18L1_0xB1_BMP[] = { + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x00, 0x00, + 0xFF, 0xE0, + 0xFF, 0xE0 +}; + +static const uint8_t helvB18L1_0xB2_BMP[] = { + 0x78, + 0xFC, + 0xCC, + 0x0C, + 0x1C, + 0x78, + 0xE0, + 0xC0, + 0xFC, + 0xFC +}; + +static const uint8_t helvB18L1_0xB3_BMP[] = { + 0x78, + 0xFC, + 0xCC, + 0x0C, + 0x38, + 0x38, + 0x0C, + 0xCC, + 0xFC, + 0x78 +}; + +static const uint8_t helvB18L1_0xB4_BMP[] = { + 0x1C, + 0x38, + 0x70, + 0xE0 +}; + +static const uint8_t helvB18L1_0xB5_BMP[] = { + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE1, 0xE0, + 0xF3, 0xE0, + 0xFE, 0xE0, + 0xEC, 0xE0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00 +}; + +static const uint8_t helvB18L1_0xB6_BMP[] = { + 0x0F, 0xE0, + 0x3F, 0xE0, + 0x7C, 0xC0, + 0x7C, 0xC0, + 0xFC, 0xC0, + 0xFC, 0xC0, + 0xFC, 0xC0, + 0xFC, 0xC0, + 0xFC, 0xC0, + 0x7C, 0xC0, + 0x7C, 0xC0, + 0x3C, 0xC0, + 0x1C, 0xC0, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x0C, 0xC0 +}; + +static const uint8_t helvB18L1_0xB7_BMP[] = { + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvB18L1_0xB8_BMP[] = { + 0x70, + 0x78, + 0x1C, + 0x1C, + 0xFC, + 0x78 +}; + +static const uint8_t helvB18L1_0xB9_BMP[] = { + 0x30, + 0x30, + 0xF0, + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30 +}; + +static const uint8_t helvB18L1_0xBA_BMP[] = { + 0x3C, + 0x7E, + 0xE7, + 0xC3, + 0xC3, + 0xC3, + 0xE7, + 0x7E, + 0x3C, + 0x00, + 0xFF, + 0xFF +}; + +static const uint8_t helvB18L1_0xBB_BMP[] = { + 0xEE, 0x00, + 0x77, 0x00, + 0x3B, 0x80, + 0x1D, 0xC0, + 0x1D, 0xC0, + 0x3B, 0x80, + 0x77, 0x00, + 0xEE, 0x00 +}; + +static const uint8_t helvB18L1_0xBC_BMP[] = { + 0x30, 0x18, 0x00, + 0x30, 0x18, 0x00, + 0xF0, 0x30, 0x00, + 0xF0, 0x30, 0x00, + 0x30, 0x60, 0x00, + 0x30, 0x60, 0x00, + 0x30, 0xC0, 0x00, + 0x30, 0xC0, 0x00, + 0x31, 0x86, 0x00, + 0x31, 0x8E, 0x00, + 0x03, 0x1E, 0x00, + 0x03, 0x1E, 0x00, + 0x06, 0x36, 0x00, + 0x06, 0x66, 0x00, + 0x0C, 0x7F, 0x80, + 0x0C, 0x7F, 0x80, + 0x18, 0x06, 0x00, + 0x18, 0x06, 0x00 +}; + +static const uint8_t helvB18L1_0xBD_BMP[] = { + 0x30, 0x18, + 0x30, 0x18, + 0xF0, 0x30, + 0xF0, 0x30, + 0x30, 0x60, + 0x30, 0x60, + 0x30, 0xC0, + 0x30, 0xC0, + 0x31, 0x9E, + 0x31, 0xBF, + 0x03, 0x33, + 0x03, 0x03, + 0x06, 0x07, + 0x06, 0x1E, + 0x0C, 0x38, + 0x0C, 0x30, + 0x18, 0x3F, + 0x18, 0x3F +}; + +static const uint8_t helvB18L1_0xBE_BMP[] = { + 0x78, 0x18, 0x00, + 0xFC, 0x18, 0x00, + 0xCC, 0x30, 0x00, + 0x0C, 0x30, 0x00, + 0x38, 0x60, 0x00, + 0x38, 0x60, 0x00, + 0x0C, 0xC0, 0x00, + 0xCC, 0xC0, 0x00, + 0xFD, 0x86, 0x00, + 0x79, 0x8E, 0x00, + 0x03, 0x1E, 0x00, + 0x03, 0x1E, 0x00, + 0x06, 0x36, 0x00, + 0x06, 0x66, 0x00, + 0x0C, 0x7F, 0x80, + 0x0C, 0x7F, 0x80, + 0x18, 0x06, 0x00, + 0x18, 0x06, 0x00 +}; + +static const uint8_t helvB18L1_0xBF_BMP[] = { + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x1C, 0x00, + 0x3C, 0x00, + 0x78, 0x00, + 0x70, 0x00, + 0xF0, 0xE0, + 0xE0, 0xE0, + 0xE1, 0xE0, + 0xF3, 0xC0, + 0x7F, 0xC0, + 0x3F, 0x00 +}; + +static const uint8_t helvB18L1_0xC0_BMP[] = { + 0x0E, 0x00, + 0x07, 0x00, + 0x03, 0x80, + 0x01, 0xC0, + 0x00, 0x00, + 0x03, 0xC0, + 0x03, 0xC0, + 0x07, 0xE0, + 0x07, 0xE0, + 0x0E, 0x60, + 0x0E, 0x70, + 0x0E, 0x70, + 0x1C, 0x38, + 0x1C, 0x38, + 0x1C, 0x38, + 0x38, 0x1C, + 0x38, 0x1C, + 0x3F, 0xFC, + 0x7F, 0xFE, + 0x70, 0x0E, + 0x70, 0x0E, + 0xE0, 0x07, + 0xE0, 0x07, + 0xE0, 0x07 +}; + +static const uint8_t helvB18L1_0xC1_BMP[] = { + 0x00, 0x70, + 0x00, 0xE0, + 0x01, 0xC0, + 0x03, 0x80, + 0x00, 0x00, + 0x03, 0xC0, + 0x03, 0xC0, + 0x07, 0xE0, + 0x07, 0xE0, + 0x0E, 0x60, + 0x0E, 0x70, + 0x0E, 0x70, + 0x1C, 0x38, + 0x1C, 0x38, + 0x1C, 0x38, + 0x38, 0x1C, + 0x38, 0x1C, + 0x3F, 0xFC, + 0x7F, 0xFE, + 0x70, 0x0E, + 0x70, 0x0E, + 0xE0, 0x07, + 0xE0, 0x07, + 0xE0, 0x07 +}; + +static const uint8_t helvB18L1_0xC2_BMP[] = { + 0x01, 0xC0, + 0x03, 0xE0, + 0x07, 0x70, + 0x0E, 0x38, + 0x00, 0x00, + 0x03, 0xC0, + 0x03, 0xC0, + 0x07, 0xE0, + 0x07, 0xE0, + 0x0E, 0x60, + 0x0E, 0x70, + 0x0E, 0x70, + 0x1C, 0x38, + 0x1C, 0x38, + 0x1C, 0x38, + 0x38, 0x1C, + 0x38, 0x1C, + 0x3F, 0xFC, + 0x7F, 0xFE, + 0x70, 0x0E, + 0x70, 0x0E, + 0xE0, 0x07, + 0xE0, 0x07, + 0xE0, 0x07 +}; + +static const uint8_t helvB18L1_0xC3_BMP[] = { + 0x07, 0x98, + 0x0F, 0xF8, + 0x0C, 0xF0, + 0x00, 0x00, + 0x03, 0xC0, + 0x03, 0xC0, + 0x07, 0xE0, + 0x07, 0xE0, + 0x0E, 0x60, + 0x0E, 0x70, + 0x0E, 0x70, + 0x1C, 0x38, + 0x1C, 0x38, + 0x1C, 0x38, + 0x38, 0x1C, + 0x38, 0x1C, + 0x3F, 0xFC, + 0x7F, 0xFE, + 0x70, 0x0E, + 0x70, 0x0E, + 0xE0, 0x07, + 0xE0, 0x07, + 0xE0, 0x07 +}; + +static const uint8_t helvB18L1_0xC4_BMP[] = { + 0x0E, 0x70, + 0x0E, 0x70, + 0x00, 0x00, + 0x00, 0x00, + 0x03, 0xC0, + 0x03, 0xC0, + 0x07, 0xE0, + 0x07, 0xE0, + 0x0E, 0x60, + 0x0E, 0x70, + 0x0E, 0x70, + 0x1C, 0x38, + 0x1C, 0x38, + 0x1C, 0x38, + 0x38, 0x1C, + 0x38, 0x1C, + 0x3F, 0xFC, + 0x7F, 0xFE, + 0x70, 0x0E, + 0x70, 0x0E, + 0xE0, 0x07, + 0xE0, 0x07, + 0xE0, 0x07 +}; + +static const uint8_t helvB18L1_0xC5_BMP[] = { + 0x03, 0xC0, + 0x06, 0x60, + 0x04, 0x20, + 0x06, 0x60, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x07, 0xE0, + 0x07, 0xE0, + 0x0E, 0x60, + 0x0E, 0x70, + 0x0E, 0x70, + 0x1C, 0x38, + 0x1C, 0x38, + 0x1C, 0x38, + 0x38, 0x1C, + 0x38, 0x1C, + 0x3F, 0xFC, + 0x7F, 0xFE, + 0x70, 0x0E, + 0x70, 0x0E, + 0xE0, 0x07, + 0xE0, 0x07, + 0xE0, 0x07 +}; + +static const uint8_t helvB18L1_0xC6_BMP[] = { + 0x03, 0xFF, 0xF8, + 0x03, 0xFF, 0xF8, + 0x07, 0x70, 0x00, + 0x07, 0x70, 0x00, + 0x0E, 0x70, 0x00, + 0x0E, 0x70, 0x00, + 0x0E, 0x70, 0x00, + 0x1C, 0x70, 0x00, + 0x1C, 0x7F, 0xF0, + 0x1C, 0x7F, 0xF0, + 0x38, 0x70, 0x00, + 0x38, 0x70, 0x00, + 0x3F, 0xF0, 0x00, + 0x7F, 0xF0, 0x00, + 0x70, 0x70, 0x00, + 0x70, 0x70, 0x00, + 0xE0, 0x70, 0x00, + 0xE0, 0x7F, 0xFC, + 0xE0, 0x7F, 0xFC +}; + +static const uint8_t helvB18L1_0xC7_BMP[] = { + 0x07, 0xF0, + 0x1F, 0xFC, + 0x3E, 0x3E, + 0x78, 0x0F, + 0x70, 0x07, + 0xF0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xF0, 0x07, + 0x70, 0x07, + 0x78, 0x0F, + 0x3E, 0x3E, + 0x1F, 0xFC, + 0x07, 0xF0, + 0x03, 0xC0, + 0x00, 0xE0, + 0x00, 0xE0, + 0x07, 0xE0, + 0x03, 0xC0 +}; + +static const uint8_t helvB18L1_0xC8_BMP[] = { + 0x38, 0x00, + 0x1C, 0x00, + 0x0E, 0x00, + 0x07, 0x00, + 0x00, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0xF8, + 0xFF, 0xF8 +}; + +static const uint8_t helvB18L1_0xC9_BMP[] = { + 0x01, 0xC0, + 0x03, 0x80, + 0x07, 0x00, + 0x0E, 0x00, + 0x00, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0xF8, + 0xFF, 0xF8 +}; + +static const uint8_t helvB18L1_0xCA_BMP[] = { + 0x07, 0x00, + 0x0F, 0x80, + 0x1D, 0xC0, + 0x38, 0xE0, + 0x00, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0xF8, + 0xFF, 0xF8 +}; + +static const uint8_t helvB18L1_0xCB_BMP[] = { + 0x38, 0xE0, + 0x38, 0xE0, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0xF8, + 0xFF, 0xF8 +}; + +static const uint8_t helvB18L1_0xCC_BMP[] = { + 0xE0, + 0x70, + 0x38, + 0x1C, + 0x00, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38 +}; + +static const uint8_t helvB18L1_0xCD_BMP[] = { + 0x1C, + 0x38, + 0x70, + 0xE0, + 0x00, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70 +}; + +static const uint8_t helvB18L1_0xCE_BMP[] = { + 0x1C, 0x00, + 0x3E, 0x00, + 0x77, 0x00, + 0xE3, 0x80, + 0x00, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t helvB18L1_0xCF_BMP[] = { + 0xEE, + 0xEE, + 0x00, + 0x00, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38 +}; + +static const uint8_t helvB18L1_0xD0_BMP[] = { + 0x1F, 0xFC, 0x00, + 0x1F, 0xFF, 0x00, + 0x1C, 0x0F, 0x80, + 0x1C, 0x03, 0xC0, + 0x1C, 0x01, 0xC0, + 0x1C, 0x01, 0xE0, + 0x1C, 0x00, 0xE0, + 0x1C, 0x00, 0xE0, + 0xFF, 0xC0, 0xE0, + 0xFF, 0xC0, 0xE0, + 0x1C, 0x00, 0xE0, + 0x1C, 0x00, 0xE0, + 0x1C, 0x00, 0xE0, + 0x1C, 0x01, 0xE0, + 0x1C, 0x01, 0xC0, + 0x1C, 0x03, 0xC0, + 0x1C, 0x0F, 0x80, + 0x1F, 0xFF, 0x00, + 0x1F, 0xFC, 0x00 +}; + +static const uint8_t helvB18L1_0xD1_BMP[] = { + 0x0F, 0x30, + 0x1F, 0xF0, + 0x19, 0xE0, + 0x00, 0x00, + 0xE0, 0x0E, + 0xF0, 0x0E, + 0xF0, 0x0E, + 0xF8, 0x0E, + 0xF8, 0x0E, + 0xFC, 0x0E, + 0xEE, 0x0E, + 0xEE, 0x0E, + 0xE7, 0x0E, + 0xE3, 0x8E, + 0xE3, 0x8E, + 0xE1, 0xCE, + 0xE0, 0xCE, + 0xE0, 0xEE, + 0xE0, 0x7E, + 0xE0, 0x3E, + 0xE0, 0x3E, + 0xE0, 0x1E, + 0xE0, 0x0E +}; + +static const uint8_t helvB18L1_0xD2_BMP[] = { + 0x0E, 0x00, 0x00, + 0x07, 0x00, 0x00, + 0x03, 0x80, 0x00, + 0x01, 0xC0, 0x00, + 0x00, 0x00, 0x00, + 0x07, 0xF0, 0x00, + 0x1F, 0xFC, 0x00, + 0x3E, 0x3E, 0x00, + 0x78, 0x0F, 0x00, + 0x70, 0x07, 0x00, + 0xF0, 0x07, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xF0, 0x07, 0x80, + 0x70, 0x07, 0x00, + 0x78, 0x0F, 0x00, + 0x3E, 0x3E, 0x00, + 0x1F, 0xFC, 0x00, + 0x07, 0xF0, 0x00 +}; + +static const uint8_t helvB18L1_0xD3_BMP[] = { + 0x00, 0x38, 0x00, + 0x00, 0x70, 0x00, + 0x00, 0xE0, 0x00, + 0x01, 0xC0, 0x00, + 0x00, 0x00, 0x00, + 0x07, 0xF0, 0x00, + 0x1F, 0xFC, 0x00, + 0x3E, 0x3E, 0x00, + 0x78, 0x0F, 0x00, + 0x70, 0x07, 0x00, + 0xF0, 0x07, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xF0, 0x07, 0x80, + 0x70, 0x07, 0x00, + 0x78, 0x0F, 0x00, + 0x3E, 0x3E, 0x00, + 0x1F, 0xFC, 0x00, + 0x07, 0xF0, 0x00 +}; + +static const uint8_t helvB18L1_0xD4_BMP[] = { + 0x01, 0xC0, 0x00, + 0x03, 0xE0, 0x00, + 0x07, 0x70, 0x00, + 0x0E, 0x38, 0x00, + 0x00, 0x00, 0x00, + 0x07, 0xF0, 0x00, + 0x1F, 0xFC, 0x00, + 0x3E, 0x3E, 0x00, + 0x78, 0x0F, 0x00, + 0x70, 0x07, 0x00, + 0xF0, 0x07, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xF0, 0x07, 0x80, + 0x70, 0x07, 0x00, + 0x78, 0x0F, 0x00, + 0x3E, 0x3E, 0x00, + 0x1F, 0xFC, 0x00, + 0x07, 0xF0, 0x00 +}; + +static const uint8_t helvB18L1_0xD5_BMP[] = { + 0x07, 0x98, 0x00, + 0x0F, 0xF8, 0x00, + 0x0C, 0xF0, 0x00, + 0x00, 0x00, 0x00, + 0x07, 0xF0, 0x00, + 0x1F, 0xFC, 0x00, + 0x3E, 0x3E, 0x00, + 0x78, 0x0F, 0x00, + 0x70, 0x07, 0x00, + 0xF0, 0x07, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xF0, 0x07, 0x80, + 0x70, 0x07, 0x00, + 0x78, 0x0F, 0x00, + 0x3E, 0x3E, 0x00, + 0x1F, 0xFC, 0x00, + 0x07, 0xF0, 0x00 +}; + +static const uint8_t helvB18L1_0xD6_BMP[] = { + 0x0E, 0x38, 0x00, + 0x0E, 0x38, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x07, 0xF0, 0x00, + 0x1F, 0xFC, 0x00, + 0x3E, 0x3E, 0x00, + 0x78, 0x0F, 0x00, + 0x70, 0x07, 0x00, + 0xF0, 0x07, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xF0, 0x07, 0x80, + 0x70, 0x07, 0x00, + 0x78, 0x0F, 0x00, + 0x3E, 0x3E, 0x00, + 0x1F, 0xFC, 0x00, + 0x07, 0xF0, 0x00 +}; + +static const uint8_t helvB18L1_0xD7_BMP[] = { + 0x40, 0x20, + 0xE0, 0x70, + 0x70, 0xE0, + 0x39, 0xC0, + 0x1F, 0x80, + 0x0F, 0x00, + 0x0F, 0x00, + 0x1F, 0x80, + 0x39, 0xC0, + 0x70, 0xE0, + 0xE0, 0x70, + 0x40, 0x20 +}; + +static const uint8_t helvB18L1_0xD8_BMP[] = { + 0x03, 0xF8, 0x60, + 0x0F, 0xFE, 0xE0, + 0x1F, 0x1F, 0xC0, + 0x3C, 0x03, 0x80, + 0x38, 0x07, 0x80, + 0x78, 0x0F, 0xC0, + 0x70, 0x1D, 0xC0, + 0x70, 0x39, 0xC0, + 0x70, 0x71, 0xC0, + 0x70, 0xE1, 0xC0, + 0x71, 0xC1, 0xC0, + 0x73, 0x81, 0xC0, + 0x77, 0x01, 0xC0, + 0x7E, 0x03, 0xC0, + 0x3C, 0x03, 0x80, + 0x3C, 0x07, 0x80, + 0x7F, 0x1F, 0x00, + 0xEF, 0xFE, 0x00, + 0xC3, 0xF8, 0x00 +}; + +static const uint8_t helvB18L1_0xD9_BMP[] = { + 0x0E, 0x00, + 0x07, 0x00, + 0x03, 0x80, + 0x01, 0xC0, + 0x00, 0x00, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xF0, 0x1E, + 0x70, 0x1C, + 0x7C, 0x7C, + 0x3F, 0xF8, + 0x0F, 0xE0 +}; + +static const uint8_t helvB18L1_0xDA_BMP[] = { + 0x00, 0x70, + 0x00, 0xE0, + 0x01, 0xC0, + 0x03, 0x80, + 0x00, 0x00, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xF0, 0x1E, + 0x70, 0x1C, + 0x7C, 0x7C, + 0x3F, 0xF8, + 0x0F, 0xE0 +}; + +static const uint8_t helvB18L1_0xDB_BMP[] = { + 0x03, 0x80, + 0x07, 0xC0, + 0x0E, 0xE0, + 0x1C, 0x70, + 0x00, 0x00, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xF0, 0x1E, + 0x70, 0x1C, + 0x7C, 0x7C, + 0x3F, 0xF8, + 0x0F, 0xE0 +}; + +static const uint8_t helvB18L1_0xDC_BMP[] = { + 0x1C, 0x70, + 0x1C, 0x70, + 0x00, 0x00, + 0x00, 0x00, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xF0, 0x1E, + 0x70, 0x1C, + 0x7C, 0x7C, + 0x3F, 0xF8, + 0x0F, 0xE0 +}; + +static const uint8_t helvB18L1_0xDD_BMP[] = { + 0x00, 0x70, + 0x00, 0xE0, + 0x01, 0xC0, + 0x03, 0x80, + 0x00, 0x00, + 0xE0, 0x0E, + 0xF0, 0x1E, + 0x70, 0x1C, + 0x78, 0x3C, + 0x38, 0x38, + 0x3C, 0x78, + 0x1C, 0x70, + 0x1E, 0xF0, + 0x0E, 0xE0, + 0x0F, 0xE0, + 0x07, 0xC0, + 0x07, 0xC0, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80 +}; + +static const uint8_t helvB18L1_0xDE_BMP[] = { + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0xE0, + 0xFF, 0xF8, + 0xE0, 0x38, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x38, + 0xFF, 0xF8, + 0xFF, 0xF0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00 +}; + +static const uint8_t helvB18L1_0xDF_BMP[] = { + 0x1E, 0x00, + 0x7F, 0x80, + 0xF3, 0x80, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE3, 0x80, + 0xEF, 0x00, + 0xEF, 0x80, + 0xE3, 0xC0, + 0xE1, 0xC0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE1, 0xC0, + 0xEF, 0xC0, + 0xEF, 0x80 +}; + +static const uint8_t helvB18L1_0xE0_BMP[] = { + 0x1C, 0x00, + 0x0E, 0x00, + 0x07, 0x00, + 0x03, 0x80, + 0x00, 0x00, + 0x1F, 0x80, + 0x3F, 0xC0, + 0x71, 0xE0, + 0x70, 0xE0, + 0x00, 0xE0, + 0x07, 0xE0, + 0x3F, 0xE0, + 0x7C, 0xE0, + 0xF0, 0xE0, + 0xE0, 0xE0, + 0xE1, 0xE0, + 0xF3, 0xE0, + 0x7F, 0xF0, + 0x3E, 0x70 +}; + +static const uint8_t helvB18L1_0xE1_BMP[] = { + 0x01, 0xC0, + 0x03, 0x80, + 0x07, 0x00, + 0x0E, 0x00, + 0x00, 0x00, + 0x1F, 0x80, + 0x3F, 0xC0, + 0x71, 0xE0, + 0x70, 0xE0, + 0x00, 0xE0, + 0x07, 0xE0, + 0x3F, 0xE0, + 0x7C, 0xE0, + 0xF0, 0xE0, + 0xE0, 0xE0, + 0xE1, 0xE0, + 0xF3, 0xE0, + 0x7F, 0xF0, + 0x3E, 0x70 +}; + +static const uint8_t helvB18L1_0xE2_BMP[] = { + 0x07, 0x00, + 0x0F, 0x80, + 0x1D, 0xC0, + 0x38, 0xE0, + 0x00, 0x00, + 0x1F, 0x80, + 0x3F, 0xC0, + 0x71, 0xE0, + 0x70, 0xE0, + 0x00, 0xE0, + 0x07, 0xE0, + 0x3F, 0xE0, + 0x7C, 0xE0, + 0xF0, 0xE0, + 0xE0, 0xE0, + 0xE1, 0xE0, + 0xF3, 0xE0, + 0x7F, 0xF0, + 0x3E, 0x70 +}; + +static const uint8_t helvB18L1_0xE3_BMP[] = { + 0x3C, 0xC0, + 0x7F, 0xC0, + 0x67, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x1F, 0x80, + 0x3F, 0xC0, + 0x71, 0xE0, + 0x70, 0xE0, + 0x00, 0xE0, + 0x07, 0xE0, + 0x3F, 0xE0, + 0x7C, 0xE0, + 0xF0, 0xE0, + 0xE0, 0xE0, + 0xE1, 0xE0, + 0xF3, 0xE0, + 0x7F, 0xF0, + 0x3E, 0x70 +}; + +static const uint8_t helvB18L1_0xE4_BMP[] = { + 0x39, 0xC0, + 0x39, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0x1F, 0x80, + 0x3F, 0xC0, + 0x71, 0xE0, + 0x70, 0xE0, + 0x00, 0xE0, + 0x07, 0xE0, + 0x3F, 0xE0, + 0x7C, 0xE0, + 0xF0, 0xE0, + 0xE0, 0xE0, + 0xE1, 0xE0, + 0xF3, 0xE0, + 0x7F, 0xF0, + 0x3E, 0x70 +}; + +static const uint8_t helvB18L1_0xE5_BMP[] = { + 0x07, 0x00, + 0x0D, 0x80, + 0x08, 0x80, + 0x0D, 0x80, + 0x07, 0x00, + 0x1F, 0x80, + 0x3F, 0xC0, + 0x71, 0xE0, + 0x70, 0xE0, + 0x00, 0xE0, + 0x07, 0xE0, + 0x3F, 0xE0, + 0x7C, 0xE0, + 0xF0, 0xE0, + 0xE0, 0xE0, + 0xE1, 0xE0, + 0xF3, 0xE0, + 0x7F, 0xF0, + 0x3E, 0x70 +}; + +static const uint8_t helvB18L1_0xE6_BMP[] = { + 0x1F, 0x8F, 0x00, + 0x3F, 0xFF, 0xC0, + 0x71, 0xF9, 0xE0, + 0x70, 0xF0, 0xE0, + 0x00, 0xE0, 0x70, + 0x07, 0xE0, 0x70, + 0x3F, 0xFF, 0xF0, + 0x7C, 0xFF, 0xF0, + 0xF0, 0xE0, 0x00, + 0xE0, 0xE0, 0x00, + 0xE1, 0xF0, 0x70, + 0xF3, 0xF8, 0xF0, + 0x7F, 0x3F, 0xE0, + 0x3E, 0x0F, 0x80 +}; + +static const uint8_t helvB18L1_0xE7_BMP[] = { + 0x1F, 0x80, + 0x3F, 0xC0, + 0x79, 0xE0, + 0x70, 0xE0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0x70, 0xE0, + 0x79, 0xE0, + 0x3F, 0xC0, + 0x1F, 0x80, + 0x1E, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x3F, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t helvB18L1_0xE8_BMP[] = { + 0x1C, 0x00, + 0x0E, 0x00, + 0x07, 0x00, + 0x03, 0x80, + 0x00, 0x00, + 0x0F, 0x00, + 0x3F, 0xC0, + 0x79, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xE0, 0x00, + 0xE0, 0x00, + 0x70, 0x70, + 0x78, 0xF0, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t helvB18L1_0xE9_BMP[] = { + 0x03, 0x80, + 0x07, 0x00, + 0x0E, 0x00, + 0x1C, 0x00, + 0x00, 0x00, + 0x0F, 0x00, + 0x3F, 0xC0, + 0x79, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xE0, 0x00, + 0xE0, 0x00, + 0x70, 0x70, + 0x78, 0xF0, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t helvB18L1_0xEA_BMP[] = { + 0x07, 0x00, + 0x0F, 0x80, + 0x1D, 0xC0, + 0x38, 0xE0, + 0x00, 0x00, + 0x0F, 0x00, + 0x3F, 0xC0, + 0x79, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xE0, 0x00, + 0xE0, 0x00, + 0x70, 0x70, + 0x78, 0xF0, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t helvB18L1_0xEB_BMP[] = { + 0x39, 0xC0, + 0x39, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0x00, + 0x3F, 0xC0, + 0x79, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xE0, 0x00, + 0xE0, 0x00, + 0x70, 0x70, + 0x78, 0xF0, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t helvB18L1_0xEC_BMP[] = { + 0xE0, + 0x70, + 0x38, + 0x1C, + 0x00, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38 +}; + +static const uint8_t helvB18L1_0xED_BMP[] = { + 0x1C, + 0x38, + 0x70, + 0xE0, + 0x00, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70 +}; + +static const uint8_t helvB18L1_0xEE_BMP[] = { + 0x1C, 0x00, + 0x3E, 0x00, + 0x77, 0x00, + 0xE3, 0x80, + 0x00, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t helvB18L1_0xEF_BMP[] = { + 0xEE, + 0xEE, + 0x00, + 0x00, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38 +}; + +static const uint8_t helvB18L1_0xF0_BMP[] = { + 0x70, 0x00, + 0x1D, 0xC0, + 0x07, 0x00, + 0x1F, 0x00, + 0x61, 0x80, + 0x0F, 0xC0, + 0x3F, 0xC0, + 0x79, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0x70, 0xE0, + 0x79, 0xE0, + 0x3F, 0xC0, + 0x0F, 0x00 +}; + +static const uint8_t helvB18L1_0xF1_BMP[] = { + 0x3C, 0xC0, + 0x7F, 0xC0, + 0x67, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0xEF, 0x80, + 0xFF, 0xC0, + 0xF1, 0xC0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0 +}; + +static const uint8_t helvB18L1_0xF2_BMP[] = { + 0x1C, 0x00, + 0x0E, 0x00, + 0x07, 0x00, + 0x03, 0x80, + 0x00, 0x00, + 0x0F, 0x00, + 0x3F, 0xC0, + 0x79, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0x70, 0xE0, + 0x79, 0xE0, + 0x3F, 0xC0, + 0x0F, 0x00 +}; + +static const uint8_t helvB18L1_0xF3_BMP[] = { + 0x03, 0x80, + 0x07, 0x00, + 0x0E, 0x00, + 0x1C, 0x00, + 0x00, 0x00, + 0x0F, 0x00, + 0x3F, 0xC0, + 0x79, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0x70, 0xE0, + 0x79, 0xE0, + 0x3F, 0xC0, + 0x0F, 0x00 +}; + +static const uint8_t helvB18L1_0xF4_BMP[] = { + 0x0E, 0x00, + 0x1F, 0x00, + 0x3B, 0x80, + 0x71, 0xC0, + 0x00, 0x00, + 0x0F, 0x00, + 0x3F, 0xC0, + 0x79, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0x70, 0xE0, + 0x79, 0xE0, + 0x3F, 0xC0, + 0x0F, 0x00 +}; + +static const uint8_t helvB18L1_0xF5_BMP[] = { + 0x3C, 0xC0, + 0x7F, 0xC0, + 0x67, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0x00, + 0x3F, 0xC0, + 0x79, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0x70, 0xE0, + 0x79, 0xE0, + 0x3F, 0xC0, + 0x0F, 0x00 +}; + +static const uint8_t helvB18L1_0xF6_BMP[] = { + 0x39, 0xC0, + 0x39, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0x00, + 0x3F, 0xC0, + 0x79, 0xE0, + 0x70, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0x70, 0xE0, + 0x79, 0xE0, + 0x3F, 0xC0, + 0x0F, 0x00 +}; + +static const uint8_t helvB18L1_0xF7_BMP[] = { + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0x00, 0x00, + 0x00, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00 +}; + +static const uint8_t helvB18L1_0xF8_BMP[] = { + 0x07, 0x8C, + 0x1F, 0xFC, + 0x3C, 0xF8, + 0x38, 0x70, + 0x70, 0xF8, + 0x71, 0xF8, + 0x73, 0xB8, + 0x77, 0x38, + 0x7E, 0x38, + 0x7C, 0x38, + 0x38, 0x70, + 0x7C, 0xF0, + 0xFF, 0xE0, + 0xC7, 0x80 +}; + +static const uint8_t helvB18L1_0xF9_BMP[] = { + 0x38, 0x00, + 0x1C, 0x00, + 0x0E, 0x00, + 0x07, 0x00, + 0x00, 0x00, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE1, 0xE0, + 0x73, 0xE0, + 0x7E, 0xE0, + 0x1C, 0xE0 +}; + +static const uint8_t helvB18L1_0xFA_BMP[] = { + 0x03, 0x80, + 0x07, 0x00, + 0x0E, 0x00, + 0x1C, 0x00, + 0x00, 0x00, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE1, 0xE0, + 0x73, 0xE0, + 0x7E, 0xE0, + 0x1C, 0xE0 +}; + +static const uint8_t helvB18L1_0xFB_BMP[] = { + 0x0E, 0x00, + 0x1F, 0x00, + 0x3B, 0x80, + 0x71, 0xC0, + 0x00, 0x00, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE1, 0xE0, + 0x73, 0xE0, + 0x7E, 0xE0, + 0x1C, 0xE0 +}; + +static const uint8_t helvB18L1_0xFC_BMP[] = { + 0x39, 0xC0, + 0x39, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xE0, + 0xE1, 0xE0, + 0x73, 0xE0, + 0x7E, 0xE0, + 0x1C, 0xE0 +}; + +static const uint8_t helvB18L1_0xFD_BMP[] = { + 0x00, 0xE0, + 0x01, 0xC0, + 0x03, 0x80, + 0x07, 0x00, + 0x00, 0x00, + 0xE0, 0x38, + 0xE0, 0x38, + 0x70, 0x38, + 0x78, 0x70, + 0x38, 0x70, + 0x3C, 0xF0, + 0x1C, 0xE0, + 0x1C, 0xE0, + 0x0F, 0xC0, + 0x0F, 0xC0, + 0x07, 0xC0, + 0x07, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x07, 0x00, + 0x07, 0x00, + 0x0E, 0x00, + 0x3E, 0x00, + 0x3C, 0x00 +}; + +static const uint8_t helvB18L1_0xFE_BMP[] = { + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xEF, 0x80, + 0xFF, 0xC0, + 0xF9, 0xE0, + 0xF0, 0xE0, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0xF0, 0xE0, + 0xF9, 0xE0, + 0xFF, 0xC0, + 0xEF, 0x80, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00 +}; + +static const uint8_t helvB18L1_0xFF_BMP[] = { + 0x1C, 0xE0, + 0x1C, 0xE0, + 0x00, 0x00, + 0x00, 0x00, + 0xE0, 0x38, + 0xE0, 0x38, + 0x70, 0x38, + 0x78, 0x70, + 0x38, 0x70, + 0x3C, 0xF0, + 0x1C, 0xE0, + 0x1C, 0xE0, + 0x0F, 0xC0, + 0x0F, 0xC0, + 0x07, 0xC0, + 0x07, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x07, 0x00, + 0x07, 0x00, + 0x0E, 0x00, + 0x3E, 0x00, + 0x3C, 0x00 +}; + +static const GFONT_CharInfo FontBMP[] = { + {19, 15, 19, 2, 0, helvB18L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {6, 1, 1, 0, 0, helvB18L1_0x20_BMP}, + {7, 3, 19, 2, 0, helvB18L1_0x21_BMP}, + {9, 5, 6, 2, 13, helvB18L1_0x22_BMP}, + {14, 12, 18, 1, 0, helvB18L1_0x23_BMP}, + {13, 12, 21, 0, -2, helvB18L1_0x24_BMP}, + {22, 21, 18, 0, 0, helvB18L1_0x25_BMP}, + {18, 16, 18, 1, 0, helvB18L1_0x26_BMP}, + {6, 2, 6, 2, 13, helvB18L1_0x27_BMP}, + {8, 6, 24, 1, -5, helvB18L1_0x28_BMP}, + {8, 6, 24, 1, -5, helvB18L1_0x29_BMP}, + {10, 8, 7, 1, 12, helvB18L1_0x2A_BMP}, + {15, 12, 12, 1, 1, helvB18L1_0x2B_BMP}, + {7, 3, 6, 2, -3, helvB18L1_0x2C_BMP}, + {8, 7, 3, 0, 6, helvB18L1_0x2D_BMP}, + {7, 3, 3, 2, 0, helvB18L1_0x2E_BMP}, + {8, 7, 19, 1, 0, helvB18L1_0x2F_BMP}, + {13, 12, 18, 0, 0, helvB18L1_0x30_BMP}, + {13, 7, 18, 2, 0, helvB18L1_0x31_BMP}, + {13, 12, 18, 0, 0, helvB18L1_0x32_BMP}, + {13, 12, 18, 0, 0, helvB18L1_0x33_BMP}, + {13, 12, 18, 0, 0, helvB18L1_0x34_BMP}, + {13, 12, 18, 0, 0, helvB18L1_0x35_BMP}, + {13, 12, 18, 0, 0, helvB18L1_0x36_BMP}, + {13, 12, 18, 0, 0, helvB18L1_0x37_BMP}, + {13, 12, 18, 0, 0, helvB18L1_0x38_BMP}, + {13, 12, 18, 0, 0, helvB18L1_0x39_BMP}, + {7, 3, 14, 2, 0, helvB18L1_0x3A_BMP}, + {7, 3, 17, 2, -3, helvB18L1_0x3B_BMP}, + {15, 13, 12, 0, 1, helvB18L1_0x3C_BMP}, + {14, 10, 5, 2, 5, helvB18L1_0x3D_BMP}, + {14, 13, 12, 1, 1, helvB18L1_0x3E_BMP}, + {15, 11, 19, 2, 0, helvB18L1_0x3F_BMP}, + {24, 22, 22, 1, -4, helvB18L1_0x40_BMP}, + {18, 16, 19, 1, 0, helvB18L1_0x41_BMP}, + {18, 15, 19, 2, 0, helvB18L1_0x42_BMP}, + {18, 16, 19, 1, 0, helvB18L1_0x43_BMP}, + {19, 16, 19, 2, 0, helvB18L1_0x44_BMP}, + {16, 13, 19, 2, 0, helvB18L1_0x45_BMP}, + {15, 12, 19, 2, 0, helvB18L1_0x46_BMP}, + {19, 17, 19, 1, 0, helvB18L1_0x47_BMP}, + {19, 15, 19, 2, 0, helvB18L1_0x48_BMP}, + {7, 3, 19, 2, 0, helvB18L1_0x49_BMP}, + {14, 11, 19, 1, 0, helvB18L1_0x4A_BMP}, + {18, 14, 19, 2, 0, helvB18L1_0x4B_BMP}, + {15, 12, 19, 2, 0, helvB18L1_0x4C_BMP}, + {23, 19, 19, 2, 0, helvB18L1_0x4D_BMP}, + {19, 15, 19, 2, 0, helvB18L1_0x4E_BMP}, + {19, 17, 19, 1, 0, helvB18L1_0x4F_BMP}, + {17, 14, 19, 2, 0, helvB18L1_0x50_BMP}, + {19, 17, 20, 1, -1, helvB18L1_0x51_BMP}, + {17, 14, 19, 2, 0, helvB18L1_0x52_BMP}, + {17, 14, 19, 2, 0, helvB18L1_0x53_BMP}, + {15, 15, 19, 0, 0, helvB18L1_0x54_BMP}, + {19, 15, 19, 2, 0, helvB18L1_0x55_BMP}, + {18, 16, 19, 1, 0, helvB18L1_0x56_BMP}, + {23, 21, 19, 1, 0, helvB18L1_0x57_BMP}, + {18, 16, 19, 1, 0, helvB18L1_0x58_BMP}, + {17, 15, 19, 1, 0, helvB18L1_0x59_BMP}, + {16, 14, 19, 1, 0, helvB18L1_0x5A_BMP}, + {8, 5, 24, 1, -5, helvB18L1_0x5B_BMP}, + {8, 7, 19, 0, 0, helvB18L1_0x5C_BMP}, + {8, 5, 24, 2, -5, helvB18L1_0x5D_BMP}, + {14, 11, 9, 1, 10, helvB18L1_0x5E_BMP}, + {14, 14, 2, 0, -5, helvB18L1_0x5F_BMP}, + {8, 6, 4, 1, 15, helvB18L1_0x60_BMP}, + {14, 12, 14, 1, 0, helvB18L1_0x61_BMP}, + {15, 12, 19, 2, 0, helvB18L1_0x62_BMP}, + {13, 11, 14, 1, 0, helvB18L1_0x63_BMP}, + {15, 12, 19, 1, 0, helvB18L1_0x64_BMP}, + {14, 12, 14, 1, 0, helvB18L1_0x65_BMP}, + {9, 7, 19, 1, 0, helvB18L1_0x66_BMP}, + {15, 12, 19, 1, -5, helvB18L1_0x67_BMP}, + {15, 11, 19, 2, 0, helvB18L1_0x68_BMP}, + {7, 3, 19, 2, 0, helvB18L1_0x69_BMP}, + {7, 5, 24, 0, -5, helvB18L1_0x6A_BMP}, + {14, 11, 19, 2, 0, helvB18L1_0x6B_BMP}, + {7, 3, 19, 2, 0, helvB18L1_0x6C_BMP}, + {21, 17, 14, 2, 0, helvB18L1_0x6D_BMP}, + {15, 11, 14, 2, 0, helvB18L1_0x6E_BMP}, + {14, 12, 14, 1, 0, helvB18L1_0x6F_BMP}, + {15, 12, 19, 2, -5, helvB18L1_0x70_BMP}, + {15, 12, 19, 1, -5, helvB18L1_0x71_BMP}, + {10, 7, 14, 2, 0, helvB18L1_0x72_BMP}, + {13, 11, 14, 1, 0, helvB18L1_0x73_BMP}, + {9, 7, 18, 1, 0, helvB18L1_0x74_BMP}, + {15, 11, 14, 2, 0, helvB18L1_0x75_BMP}, + {14, 12, 14, 1, 0, helvB18L1_0x76_BMP}, + {19, 19, 14, 0, 0, helvB18L1_0x77_BMP}, + {13, 11, 14, 1, 0, helvB18L1_0x78_BMP}, + {15, 13, 19, 1, -5, helvB18L1_0x79_BMP}, + {13, 11, 14, 1, 0, helvB18L1_0x7A_BMP}, + {10, 7, 24, 1, -5, helvB18L1_0x7B_BMP}, + {7, 2, 24, 3, -5, helvB18L1_0x7C_BMP}, + {10, 7, 24, 2, -5, helvB18L1_0x7D_BMP}, + {14, 11, 4, 1, 5, helvB18L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {6, 1, 1, 0, 0, helvB18L1_0xA0_BMP}, + {7, 3, 19, 2, -5, helvB18L1_0xA1_BMP}, + {14, 11, 18, 1, -2, helvB18L1_0xA2_BMP}, + {14, 13, 18, 1, 0, helvB18L1_0xA3_BMP}, + {14, 12, 12, 1, 3, helvB18L1_0xA4_BMP}, + {14, 13, 18, 0, 0, helvB18L1_0xA5_BMP}, + {7, 2, 24, 3, -5, helvB18L1_0xA6_BMP}, + {14, 12, 24, 1, -5, helvB18L1_0xA7_BMP}, + {9, 7, 2, 1, 16, helvB18L1_0xA8_BMP}, + {19, 19, 19, 0, 0, helvB18L1_0xA9_BMP}, + {10, 8, 12, 1, 7, helvB18L1_0xAA_BMP}, + {13, 10, 8, 1, 3, helvB18L1_0xAB_BMP}, + {15, 12, 7, 1, 4, helvB18L1_0xAC_BMP}, + {8, 7, 3, 0, 6, helvB18L1_0xAD_BMP}, + {19, 19, 19, 0, 0, helvB18L1_0xAE_BMP}, + {9, 7, 2, 1, 17, helvB18L1_0xAF_BMP}, + {9, 8, 7, 0, 11, helvB18L1_0xB0_BMP}, + {15, 11, 13, 2, 0, helvB18L1_0xB1_BMP}, + {7, 6, 10, 0, 8, helvB18L1_0xB2_BMP}, + {7, 6, 10, 0, 8, helvB18L1_0xB3_BMP}, + {8, 6, 4, 1, 15, helvB18L1_0xB4_BMP}, + {15, 11, 19, 2, -5, helvB18L1_0xB5_BMP}, + {13, 11, 24, 1, -5, helvB18L1_0xB6_BMP}, + {7, 3, 3, 2, 6, helvB18L1_0xB7_BMP}, + {8, 6, 6, 1, -5, helvB18L1_0xB8_BMP}, + {7, 4, 10, 1, 8, helvB18L1_0xB9_BMP}, + {10, 8, 12, 1, 7, helvB18L1_0xBA_BMP}, + {13, 10, 8, 1, 3, helvB18L1_0xBB_BMP}, + {19, 17, 18, 1, 0, helvB18L1_0xBC_BMP}, + {19, 16, 18, 1, 0, helvB18L1_0xBD_BMP}, + {19, 17, 18, 1, 0, helvB18L1_0xBE_BMP}, + {15, 11, 19, 2, -5, helvB18L1_0xBF_BMP}, + {18, 16, 24, 1, 0, helvB18L1_0xC0_BMP}, + {18, 16, 24, 1, 0, helvB18L1_0xC1_BMP}, + {18, 16, 24, 1, 0, helvB18L1_0xC2_BMP}, + {18, 16, 23, 1, 0, helvB18L1_0xC3_BMP}, + {18, 16, 23, 1, 0, helvB18L1_0xC4_BMP}, + {18, 16, 24, 1, 0, helvB18L1_0xC5_BMP}, + {24, 22, 19, 1, 0, helvB18L1_0xC6_BMP}, + {18, 16, 24, 1, -5, helvB18L1_0xC7_BMP}, + {16, 13, 24, 2, 0, helvB18L1_0xC8_BMP}, + {16, 13, 24, 2, 0, helvB18L1_0xC9_BMP}, + {16, 13, 24, 2, 0, helvB18L1_0xCA_BMP}, + {16, 13, 23, 2, 0, helvB18L1_0xCB_BMP}, + {7, 6, 24, 0, 0, helvB18L1_0xCC_BMP}, + {7, 6, 24, 1, 0, helvB18L1_0xCD_BMP}, + {7, 9, 24, -1, 0, helvB18L1_0xCE_BMP}, + {7, 7, 23, 0, 0, helvB18L1_0xCF_BMP}, + {19, 19, 19, -1, 0, helvB18L1_0xD0_BMP}, + {19, 15, 23, 2, 0, helvB18L1_0xD1_BMP}, + {19, 17, 24, 1, 0, helvB18L1_0xD2_BMP}, + {19, 17, 24, 1, 0, helvB18L1_0xD3_BMP}, + {19, 17, 24, 1, 0, helvB18L1_0xD4_BMP}, + {19, 17, 23, 1, 0, helvB18L1_0xD5_BMP}, + {19, 17, 23, 1, 0, helvB18L1_0xD6_BMP}, + {15, 12, 12, 1, 1, helvB18L1_0xD7_BMP}, + {19, 19, 19, 0, 0, helvB18L1_0xD8_BMP}, + {19, 15, 24, 2, 0, helvB18L1_0xD9_BMP}, + {19, 15, 24, 2, 0, helvB18L1_0xDA_BMP}, + {19, 15, 24, 2, 0, helvB18L1_0xDB_BMP}, + {19, 15, 23, 2, 0, helvB18L1_0xDC_BMP}, + {17, 15, 24, 1, 0, helvB18L1_0xDD_BMP}, + {17, 14, 19, 2, 0, helvB18L1_0xDE_BMP}, + {14, 11, 19, 2, 0, helvB18L1_0xDF_BMP}, + {14, 12, 19, 1, 0, helvB18L1_0xE0_BMP}, + {14, 12, 19, 1, 0, helvB18L1_0xE1_BMP}, + {14, 12, 19, 1, 0, helvB18L1_0xE2_BMP}, + {14, 12, 19, 1, 0, helvB18L1_0xE3_BMP}, + {14, 12, 18, 1, 0, helvB18L1_0xE4_BMP}, + {14, 12, 19, 1, 0, helvB18L1_0xE5_BMP}, + {22, 20, 14, 1, 0, helvB18L1_0xE6_BMP}, + {13, 11, 19, 1, -5, helvB18L1_0xE7_BMP}, + {14, 12, 19, 1, 0, helvB18L1_0xE8_BMP}, + {14, 12, 19, 1, 0, helvB18L1_0xE9_BMP}, + {14, 12, 19, 1, 0, helvB18L1_0xEA_BMP}, + {14, 12, 18, 1, 0, helvB18L1_0xEB_BMP}, + {7, 6, 19, 0, 0, helvB18L1_0xEC_BMP}, + {7, 6, 19, 1, 0, helvB18L1_0xED_BMP}, + {7, 9, 19, -1, 0, helvB18L1_0xEE_BMP}, + {7, 7, 18, 0, 0, helvB18L1_0xEF_BMP}, + {14, 12, 19, 1, 0, helvB18L1_0xF0_BMP}, + {15, 11, 19, 2, 0, helvB18L1_0xF1_BMP}, + {14, 12, 19, 1, 0, helvB18L1_0xF2_BMP}, + {14, 12, 19, 1, 0, helvB18L1_0xF3_BMP}, + {14, 12, 19, 1, 0, helvB18L1_0xF4_BMP}, + {14, 12, 19, 1, 0, helvB18L1_0xF5_BMP}, + {14, 12, 18, 1, 0, helvB18L1_0xF6_BMP}, + {15, 11, 12, 2, 1, helvB18L1_0xF7_BMP}, + {14, 14, 14, 0, 0, helvB18L1_0xF8_BMP}, + {15, 11, 19, 2, 0, helvB18L1_0xF9_BMP}, + {15, 11, 19, 2, 0, helvB18L1_0xFA_BMP}, + {15, 11, 19, 2, 0, helvB18L1_0xFB_BMP}, + {15, 11, 18, 2, 0, helvB18L1_0xFC_BMP}, + {15, 13, 24, 1, -5, helvB18L1_0xFD_BMP}, + {15, 12, 24, 2, -5, helvB18L1_0xFE_BMP}, + {15, 13, 23, 1, -5, helvB18L1_0xFF_BMP} +}; + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontHelv18Bold_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontHelv18Bold_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontHelv18Bold_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontHelv18Bold_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontHelv18Bold_GetFontChar, + McuFontHelv18Bold_FBBy, + McuFontHelv18Bold_GetUnderlineBoxHeight(), + McuFontHelv18Bold_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv18Bold_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv18Bold_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv18Bold_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv18Bold_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontHelv18Bold. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv18Bold.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv18Bold.h new file mode 100644 index 0000000..61c8221 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv18Bold.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv18Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv18Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 18 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv18Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv18Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv18Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv18Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv18Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv18Bold_Deinit(void); +** Init - void McuFontHelv18Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv18Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv18Bold_module McuFontHelv18Bold module documentation +** @{ +*/ + + +#ifndef __McuFontHelv18Bold_H +#define __McuFontHelv18Bold_H + +/* MODULE McuFontHelv18Bold. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontHelv18Boldconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontHelv18Bold_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontHelv18Bold_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontHelv18Bold_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontHelv18Bold_GetLineSpaceHeight() \ + 3 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontHelv18Bold_GetUnderlineBoxHeight() \ + 5 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontHelv18Bold_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontHelv18Bold_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontHelv18Bold. */ + +#endif +/* ifndef __McuFontHelv18Bold_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv18Normal.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv18Normal.c new file mode 100644 index 0000000..8648bb9 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv18Normal.c @@ -0,0 +1,4440 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv18Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv18Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 18 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv18Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv18Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv18Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv18Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv18Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv18Normal_Deinit(void); +** Init - void McuFontHelv18Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv18Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv18Normal_module McuFontHelv18Normal module documentation +** @{ +*/ + +/* MODULE McuFontHelv18Normal. */ + +#include "McuFontHelv18Normal.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontHelv18Normal_FBBy 27 + +static const uint8_t helvR18L1_0x00_BMP[] = { + 0xAA, 0xA8, + 0x00, 0x00, + 0x80, 0x08, + 0x00, 0x00, + 0x80, 0x08, + 0x00, 0x00, + 0x80, 0x08, + 0x00, 0x00, + 0x80, 0x08, + 0x00, 0x00, + 0x80, 0x08, + 0x00, 0x00, + 0x80, 0x08, + 0x00, 0x00, + 0x80, 0x08, + 0x00, 0x00, + 0x80, 0x08, + 0x00, 0x00, + 0xAA, 0xA8 +}; + +static const uint8_t helvR18L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t helvR18L1_0x21_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x80, + 0x80, + 0x00, + 0x00, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR18L1_0x22_BMP[] = { + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0xCC, + 0x44 +}; + +static const uint8_t helvR18L1_0x23_BMP[] = { + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x0C, 0xC0, + 0x19, 0x80, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0x19, 0x80, + 0x19, 0x80, + 0x33, 0x00, + 0x33, 0x00, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0x33, 0x00, + 0x33, 0x00, + 0x66, 0x00, + 0x66, 0x00, + 0x66, 0x00 +}; + +static const uint8_t helvR18L1_0x24_BMP[] = { + 0x06, 0x00, + 0x06, 0x00, + 0x1F, 0x80, + 0x3F, 0xC0, + 0x76, 0xE0, + 0x66, 0x60, + 0x66, 0x60, + 0x66, 0x00, + 0x76, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x0F, 0x80, + 0x07, 0xC0, + 0x06, 0xE0, + 0x06, 0x60, + 0xC6, 0x60, + 0xC6, 0x60, + 0xE6, 0xE0, + 0x7F, 0xC0, + 0x3F, 0x80, + 0x06, 0x00, + 0x06, 0x00 +}; + +static const uint8_t helvR18L1_0x25_BMP[] = { + 0x00, 0x06, 0x00, + 0x3C, 0x0C, 0x00, + 0x7E, 0x0C, 0x00, + 0xC3, 0x18, 0x00, + 0xC3, 0x18, 0x00, + 0xC3, 0x30, 0x00, + 0xC3, 0x30, 0x00, + 0x7E, 0x60, 0x00, + 0x3C, 0x60, 0x00, + 0x00, 0xC0, 0x00, + 0x00, 0xC7, 0x80, + 0x01, 0x8F, 0xC0, + 0x01, 0x98, 0x60, + 0x03, 0x18, 0x60, + 0x03, 0x18, 0x60, + 0x06, 0x18, 0x60, + 0x06, 0x0F, 0xC0, + 0x04, 0x07, 0x80 +}; + +static const uint8_t helvR18L1_0x26_BMP[] = { + 0x0F, 0x00, + 0x1F, 0x80, + 0x39, 0xC0, + 0x30, 0xC0, + 0x30, 0xC0, + 0x30, 0xC0, + 0x19, 0x80, + 0x0F, 0x00, + 0x1E, 0x00, + 0x3F, 0x18, + 0x73, 0x98, + 0x61, 0xD8, + 0xC0, 0xF0, + 0xC0, 0x60, + 0xC0, 0xF0, + 0xE1, 0xD8, + 0x7F, 0x9C, + 0x1E, 0x00 +}; + +static const uint8_t helvR18L1_0x27_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x40 +}; + +static const uint8_t helvR18L1_0x28_BMP[] = { + 0x18, + 0x18, + 0x30, + 0x30, + 0x60, + 0x60, + 0x60, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x60, + 0x60, + 0x60, + 0x30, + 0x30, + 0x18, + 0x18 +}; + +static const uint8_t helvR18L1_0x29_BMP[] = { + 0xC0, + 0xC0, + 0x60, + 0x60, + 0x30, + 0x30, + 0x30, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x30, + 0x30, + 0x30, + 0x60, + 0x60, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR18L1_0x2A_BMP[] = { + 0x10, + 0x10, + 0xD6, + 0x7C, + 0x38, + 0x6C, + 0x44 +}; + +static const uint8_t helvR18L1_0x2B_BMP[] = { + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00 +}; + +static const uint8_t helvR18L1_0x2C_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t helvR18L1_0x2D_BMP[] = { + 0xFC, + 0xFC +}; + +static const uint8_t helvR18L1_0x2E_BMP[] = { + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR18L1_0x2F_BMP[] = { + 0x06, + 0x04, + 0x0C, + 0x0C, + 0x08, + 0x18, + 0x18, + 0x10, + 0x10, + 0x30, + 0x30, + 0x20, + 0x60, + 0x60, + 0x40, + 0xC0, + 0xC0, + 0x80, + 0x80 +}; + +static const uint8_t helvR18L1_0x30_BMP[] = { + 0x1F, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0x60, 0xC0, + 0xE0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0xE0, + 0x60, 0xC0, + 0x60, 0xC0, + 0x71, 0xC0, + 0x3F, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t helvR18L1_0x31_BMP[] = { + 0x0C, + 0x0C, + 0x1C, + 0xFC, + 0xFC, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0x0C, + 0x0C +}; + +static const uint8_t helvR18L1_0x32_BMP[] = { + 0x1E, 0x00, + 0x7F, 0x80, + 0x61, 0xC0, + 0xC0, 0xC0, + 0xC0, 0x60, + 0xC0, 0x60, + 0x00, 0xE0, + 0x00, 0xC0, + 0x01, 0xC0, + 0x03, 0x80, + 0x0F, 0x00, + 0x1C, 0x00, + 0x38, 0x00, + 0x70, 0x00, + 0xE0, 0x00, + 0xC0, 0x00, + 0xFF, 0xE0, + 0xFF, 0xE0 +}; + +static const uint8_t helvR18L1_0x33_BMP[] = { + 0x1F, 0x00, + 0x7F, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0x00, 0xC0, + 0x01, 0x80, + 0x0F, 0x00, + 0x0F, 0xC0, + 0x00, 0xC0, + 0x00, 0x60, + 0x00, 0x60, + 0xC0, 0x60, + 0xC0, 0xC0, + 0x61, 0xC0, + 0x7F, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t helvR18L1_0x34_BMP[] = { + 0x01, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x07, 0x80, + 0x0F, 0x80, + 0x0D, 0x80, + 0x19, 0x80, + 0x39, 0x80, + 0x31, 0x80, + 0x61, 0x80, + 0xE1, 0x80, + 0xC1, 0x80, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0x01, 0x80, + 0x01, 0x80, + 0x01, 0x80, + 0x01, 0x80 +}; + +static const uint8_t helvR18L1_0x35_BMP[] = { + 0x7F, 0xC0, + 0x7F, 0xC0, + 0x60, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0x7E, 0x00, + 0x7F, 0x80, + 0x71, 0xC0, + 0x00, 0xC0, + 0x00, 0xE0, + 0x00, 0x60, + 0x00, 0x60, + 0xC0, 0xE0, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvR18L1_0x36_BMP[] = { + 0x0F, 0x00, + 0x3F, 0xC0, + 0x70, 0xC0, + 0x60, 0x60, + 0xE0, 0x60, + 0xC0, 0x00, + 0xC0, 0x00, + 0xCF, 0x00, + 0xDF, 0x80, + 0xF1, 0xC0, + 0xE0, 0xC0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0xE0, + 0x71, 0xC0, + 0x7F, 0xC0, + 0x1F, 0x00 +}; + +static const uint8_t helvR18L1_0x37_BMP[] = { + 0xFF, 0xE0, + 0xFF, 0xE0, + 0x00, 0xE0, + 0x00, 0xC0, + 0x01, 0x80, + 0x01, 0x80, + 0x03, 0x00, + 0x03, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x1C, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x38, 0x00, + 0x30, 0x00, + 0x30, 0x00 +}; + +static const uint8_t helvR18L1_0x38_BMP[] = { + 0x0E, 0x00, + 0x3F, 0x80, + 0x31, 0x80, + 0x60, 0xC0, + 0x60, 0xC0, + 0x60, 0xC0, + 0x31, 0x80, + 0x1F, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0x60, 0xC0, + 0x7F, 0xC0, + 0x1F, 0x00 +}; + +static const uint8_t helvR18L1_0x39_BMP[] = { + 0x1F, 0x00, + 0x7F, 0xC0, + 0x71, 0xC0, + 0xE0, 0xC0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0xE0, + 0x71, 0xE0, + 0x7F, 0x60, + 0x1E, 0x60, + 0x00, 0x60, + 0x00, 0xE0, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x7F, 0x80, + 0x1E, 0x00 +}; + +static const uint8_t helvR18L1_0x3A_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR18L1_0x3B_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t helvR18L1_0x3C_BMP[] = { + 0x00, 0x30, + 0x00, 0xF0, + 0x03, 0xC0, + 0x0F, 0x00, + 0x3C, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0x3C, 0x00, + 0x0F, 0x00, + 0x03, 0xC0, + 0x00, 0xF0, + 0x00, 0x30 +}; + +static const uint8_t helvR18L1_0x3D_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t helvR18L1_0x3E_BMP[] = { + 0xC0, 0x00, + 0xF0, 0x00, + 0x3C, 0x00, + 0x0F, 0x00, + 0x03, 0xC0, + 0x00, 0x70, + 0x00, 0x70, + 0x03, 0xC0, + 0x0F, 0x00, + 0x3C, 0x00, + 0xF0, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t helvR18L1_0x3F_BMP[] = { + 0x1F, 0x00, + 0x7F, 0x80, + 0x71, 0xC0, + 0xE0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0x01, 0x80, + 0x03, 0x80, + 0x07, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00 +}; + +static const uint8_t helvR18L1_0x40_BMP[] = { + 0x00, 0xFF, 0x00, + 0x03, 0xFF, 0xC0, + 0x0F, 0x01, 0xE0, + 0x1C, 0x00, 0x70, + 0x38, 0x00, 0x18, + 0x30, 0x00, 0x18, + 0x60, 0x73, 0x0C, + 0x60, 0xFB, 0x0C, + 0xC1, 0xC7, 0x0C, + 0xC3, 0x86, 0x0C, + 0xC3, 0x06, 0x0C, + 0xC6, 0x06, 0x0C, + 0xC6, 0x0C, 0x1C, + 0xC6, 0x0C, 0x18, + 0xC6, 0x0C, 0x38, + 0xE7, 0x1C, 0x70, + 0x63, 0xF7, 0xE0, + 0x71, 0xE3, 0x80, + 0x38, 0x00, 0x00, + 0x1C, 0x00, 0x00, + 0x0F, 0x03, 0x00, + 0x07, 0xFF, 0x00, + 0x00, 0xFC, 0x00 +}; + +static const uint8_t helvR18L1_0x41_BMP[] = { + 0x03, 0x80, + 0x03, 0x80, + 0x06, 0xC0, + 0x06, 0xC0, + 0x0C, 0x40, + 0x0C, 0x60, + 0x0C, 0x60, + 0x18, 0x30, + 0x18, 0x30, + 0x18, 0x30, + 0x30, 0x18, + 0x3F, 0xF8, + 0x3F, 0xF8, + 0x60, 0x0C, + 0x60, 0x0C, + 0x60, 0x0C, + 0xC0, 0x06, + 0xC0, 0x06, + 0xC0, 0x06 +}; + +static const uint8_t helvR18L1_0x42_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xF0, + 0xC0, 0x70, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x30, + 0xFF, 0xE0, + 0xFF, 0xF0, + 0xC0, 0x18, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x1C, + 0xC0, 0x78, + 0xFF, 0xF0, + 0xFF, 0xC0 +}; + +static const uint8_t helvR18L1_0x43_BMP[] = { + 0x07, 0xE0, + 0x1F, 0xF8, + 0x3C, 0x3C, + 0x70, 0x0E, + 0x60, 0x06, + 0xE0, 0x06, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xE0, 0x06, + 0x60, 0x06, + 0x70, 0x0E, + 0x3C, 0x3C, + 0x1F, 0xF8, + 0x07, 0xE0 +}; + +static const uint8_t helvR18L1_0x44_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xF0, + 0xC0, 0x78, + 0xC0, 0x1C, + 0xC0, 0x0C, + 0xC0, 0x0E, + 0xC0, 0x06, + 0xC0, 0x06, + 0xC0, 0x06, + 0xC0, 0x06, + 0xC0, 0x06, + 0xC0, 0x06, + 0xC0, 0x06, + 0xC0, 0x0E, + 0xC0, 0x0C, + 0xC0, 0x1C, + 0xC0, 0x78, + 0xFF, 0xF0, + 0xFF, 0xC0 +}; + +static const uint8_t helvR18L1_0x45_BMP[] = { + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0 +}; + +static const uint8_t helvR18L1_0x46_BMP[] = { + 0xFF, 0xE0, + 0xFF, 0xE0, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t helvR18L1_0x47_BMP[] = { + 0x07, 0xE0, + 0x1F, 0xF8, + 0x3C, 0x3C, + 0x70, 0x0E, + 0x60, 0x06, + 0xE0, 0x06, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x7F, + 0xC0, 0x7F, + 0xC0, 0x03, + 0xC0, 0x03, + 0xE0, 0x03, + 0x60, 0x07, + 0x70, 0x0F, + 0x3C, 0x3F, + 0x1F, 0xFB, + 0x07, 0xE3 +}; + +static const uint8_t helvR18L1_0x48_BMP[] = { + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xFF, 0xFC, + 0xFF, 0xFC, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C +}; + +static const uint8_t helvR18L1_0x49_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR18L1_0x4A_BMP[] = { + 0x00, 0xC0, + 0x00, 0xC0, + 0x00, 0xC0, + 0x00, 0xC0, + 0x00, 0xC0, + 0x00, 0xC0, + 0x00, 0xC0, + 0x00, 0xC0, + 0x00, 0xC0, + 0x00, 0xC0, + 0x00, 0xC0, + 0x00, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0x61, 0x80, + 0x7F, 0x80, + 0x3F, 0x00 +}; + +static const uint8_t helvR18L1_0x4B_BMP[] = { + 0xC0, 0x38, + 0xC0, 0x70, + 0xC0, 0xE0, + 0xC1, 0xC0, + 0xC3, 0x80, + 0xC7, 0x00, + 0xCE, 0x00, + 0xDC, 0x00, + 0xFC, 0x00, + 0xFE, 0x00, + 0xE7, 0x00, + 0xC3, 0x80, + 0xC1, 0x80, + 0xC1, 0xC0, + 0xC0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x70, + 0xC0, 0x38, + 0xC0, 0x18 +}; + +static const uint8_t helvR18L1_0x4C_BMP[] = { + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0xE0, + 0xFF, 0xE0 +}; + +static const uint8_t helvR18L1_0x4D_BMP[] = { + 0xC0, 0x01, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xF0, 0x07, 0x80, + 0xF0, 0x07, 0x80, + 0xD8, 0x0D, 0x80, + 0xD8, 0x0D, 0x80, + 0xD8, 0x0D, 0x80, + 0xCC, 0x19, 0x80, + 0xCC, 0x19, 0x80, + 0xCC, 0x19, 0x80, + 0xC6, 0x31, 0x80, + 0xC6, 0x31, 0x80, + 0xC6, 0x31, 0x80, + 0xC3, 0x61, 0x80, + 0xC3, 0x61, 0x80, + 0xC3, 0x61, 0x80, + 0xC1, 0xC1, 0x80, + 0xC1, 0xC1, 0x80 +}; + +static const uint8_t helvR18L1_0x4E_BMP[] = { + 0xE0, 0x0C, + 0xF0, 0x0C, + 0xF0, 0x0C, + 0xD8, 0x0C, + 0xDC, 0x0C, + 0xCC, 0x0C, + 0xCE, 0x0C, + 0xC6, 0x0C, + 0xC7, 0x0C, + 0xC3, 0x0C, + 0xC3, 0x8C, + 0xC1, 0x8C, + 0xC1, 0xCC, + 0xC0, 0xCC, + 0xC0, 0xEC, + 0xC0, 0x6C, + 0xC0, 0x3C, + 0xC0, 0x3C, + 0xC0, 0x1C +}; + +static const uint8_t helvR18L1_0x4F_BMP[] = { + 0x07, 0xE0, + 0x1F, 0xF8, + 0x3C, 0x3C, + 0x70, 0x0E, + 0x60, 0x06, + 0xE0, 0x07, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xE0, 0x07, + 0x60, 0x06, + 0x70, 0x0E, + 0x3C, 0x3C, + 0x1F, 0xF8, + 0x07, 0xE0 +}; + +static const uint8_t helvR18L1_0x50_BMP[] = { + 0xFF, 0xE0, + 0xFF, 0xF0, + 0xC0, 0x30, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x30, + 0xFF, 0xF0, + 0xFF, 0xE0, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t helvR18L1_0x51_BMP[] = { + 0x07, 0xE0, + 0x1F, 0xF8, + 0x3C, 0x3C, + 0x70, 0x0E, + 0x60, 0x06, + 0xE0, 0x07, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xE0, 0x07, + 0x60, 0xE6, + 0x70, 0x7E, + 0x3C, 0x1C, + 0x1F, 0xFE, + 0x07, 0xE7 +}; + +static const uint8_t helvR18L1_0x52_BMP[] = { + 0xFF, 0xE0, + 0xFF, 0xF0, + 0xC0, 0x30, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x30, + 0xFF, 0xF0, + 0xFF, 0xE0, + 0xC0, 0x70, + 0xC0, 0x30, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18 +}; + +static const uint8_t helvR18L1_0x53_BMP[] = { + 0x0F, 0x80, + 0x3F, 0xE0, + 0x60, 0x60, + 0xC0, 0x30, + 0xC0, 0x30, + 0xC0, 0x00, + 0xE0, 0x00, + 0x7C, 0x00, + 0x3F, 0x80, + 0x07, 0xE0, + 0x00, 0xF0, + 0x00, 0x38, + 0x00, 0x18, + 0x00, 0x18, + 0xC0, 0x18, + 0xC0, 0x38, + 0xF0, 0x70, + 0x7F, 0xE0, + 0x1F, 0x80 +}; + +static const uint8_t helvR18L1_0x54_BMP[] = { + 0xFF, 0xFC, + 0xFF, 0xFC, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00 +}; + +static const uint8_t helvR18L1_0x55_BMP[] = { + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0x60, 0x18, + 0x70, 0x38, + 0x3F, 0xF0, + 0x0F, 0xC0 +}; + +static const uint8_t helvR18L1_0x56_BMP[] = { + 0xC0, 0x06, + 0xC0, 0x06, + 0xE0, 0x0E, + 0x60, 0x0C, + 0x70, 0x1C, + 0x30, 0x18, + 0x30, 0x18, + 0x38, 0x38, + 0x18, 0x30, + 0x18, 0x30, + 0x1C, 0x70, + 0x0C, 0x60, + 0x0C, 0x60, + 0x0E, 0xE0, + 0x06, 0xC0, + 0x06, 0xC0, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80 +}; + +static const uint8_t helvR18L1_0x57_BMP[] = { + 0xC0, 0x60, 0x30, + 0xC0, 0x60, 0x30, + 0xC0, 0x60, 0x30, + 0xC0, 0xF0, 0x30, + 0x60, 0xF0, 0x60, + 0x61, 0x98, 0x60, + 0x61, 0x98, 0x60, + 0x61, 0x98, 0x60, + 0x61, 0x98, 0x60, + 0x31, 0x98, 0xC0, + 0x33, 0x0C, 0xC0, + 0x33, 0x0C, 0xC0, + 0x33, 0x0C, 0xC0, + 0x1B, 0x0D, 0x80, + 0x1B, 0x0D, 0x80, + 0x1E, 0x07, 0x80, + 0x0E, 0x07, 0x00, + 0x0C, 0x03, 0x00, + 0x0C, 0x03, 0x00 +}; + +static const uint8_t helvR18L1_0x58_BMP[] = { + 0xC0, 0x06, + 0xE0, 0x0E, + 0x70, 0x1C, + 0x30, 0x18, + 0x18, 0x30, + 0x1C, 0x70, + 0x0E, 0xE0, + 0x07, 0xC0, + 0x03, 0x80, + 0x03, 0x80, + 0x07, 0xC0, + 0x0E, 0xE0, + 0x0C, 0x60, + 0x1C, 0x70, + 0x38, 0x38, + 0x30, 0x18, + 0x60, 0x0C, + 0xE0, 0x0E, + 0xC0, 0x06 +}; + +static const uint8_t helvR18L1_0x59_BMP[] = { + 0xC0, 0x0C, + 0xE0, 0x1C, + 0x60, 0x18, + 0x70, 0x38, + 0x30, 0x30, + 0x38, 0x70, + 0x18, 0x60, + 0x1C, 0xE0, + 0x0C, 0xC0, + 0x0F, 0xC0, + 0x07, 0x80, + 0x07, 0x80, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00 +}; + +static const uint8_t helvR18L1_0x5A_BMP[] = { + 0xFF, 0xF8, + 0xFF, 0xF8, + 0x00, 0x38, + 0x00, 0x70, + 0x00, 0xE0, + 0x01, 0xC0, + 0x01, 0xC0, + 0x03, 0x80, + 0x07, 0x00, + 0x07, 0x00, + 0x0E, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x38, 0x00, + 0x70, 0x00, + 0x70, 0x00, + 0xE0, 0x00, + 0xFF, 0xF8, + 0xFF, 0xF8 +}; + +static const uint8_t helvR18L1_0x5B_BMP[] = { + 0xF0, + 0xF0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xF0, + 0xF0 +}; + +static const uint8_t helvR18L1_0x5C_BMP[] = { + 0xC0, + 0x40, + 0x40, + 0x60, + 0x20, + 0x20, + 0x30, + 0x10, + 0x10, + 0x10, + 0x18, + 0x08, + 0x08, + 0x0C, + 0x04, + 0x04, + 0x06, + 0x02, + 0x03 +}; + +static const uint8_t helvR18L1_0x5D_BMP[] = { + 0xF0, + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xF0, + 0xF0 +}; + +static const uint8_t helvR18L1_0x5E_BMP[] = { + 0x0C, 0x00, + 0x0C, 0x00, + 0x1E, 0x00, + 0x12, 0x00, + 0x33, 0x00, + 0x61, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0 +}; + +static const uint8_t helvR18L1_0x5F_BMP[] = { + 0xFF, 0xFC, + 0xFF, 0xFC +}; + +static const uint8_t helvR18L1_0x60_BMP[] = { + 0xC0, + 0x60, + 0x30, + 0x18 +}; + +static const uint8_t helvR18L1_0x61_BMP[] = { + 0x1F, 0x00, + 0x3F, 0x80, + 0x61, 0xC0, + 0x60, 0xC0, + 0x00, 0xC0, + 0x07, 0xC0, + 0x3F, 0xC0, + 0x78, 0xC0, + 0xE0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0xE3, 0xC0, + 0x7E, 0xE0, + 0x3C, 0x60 +}; + +static const uint8_t helvR18L1_0x62_BMP[] = { + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xCF, 0x00, + 0xDF, 0x80, + 0xF1, 0xC0, + 0xE0, 0xC0, + 0xC0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0xE0, + 0xE0, 0xC0, + 0xF1, 0xC0, + 0xDF, 0x80, + 0xCF, 0x00 +}; + +static const uint8_t helvR18L1_0x63_BMP[] = { + 0x1F, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xE0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xE0, 0x00, + 0x60, 0xC0, + 0x71, 0xC0, + 0x3F, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t helvR18L1_0x64_BMP[] = { + 0x00, 0x60, + 0x00, 0x60, + 0x00, 0x60, + 0x00, 0x60, + 0x00, 0x60, + 0x1E, 0x60, + 0x3F, 0x60, + 0x71, 0xE0, + 0x60, 0xE0, + 0xE0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0x60, + 0x60, 0xE0, + 0x71, 0xE0, + 0x3F, 0x60, + 0x1E, 0x60 +}; + +static const uint8_t helvR18L1_0x65_BMP[] = { + 0x0E, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0xC0, 0x00, + 0xC0, 0x00, + 0x60, 0x60, + 0x70, 0xE0, + 0x3F, 0xC0, + 0x0F, 0x00 +}; + +static const uint8_t helvR18L1_0x66_BMP[] = { + 0x1C, + 0x3C, + 0x30, + 0x30, + 0x30, + 0xFC, + 0xFC, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30 +}; + +static const uint8_t helvR18L1_0x67_BMP[] = { + 0x1E, 0x60, + 0x3F, 0x60, + 0x71, 0xE0, + 0x60, 0xE0, + 0xE0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0x60, + 0x60, 0xE0, + 0x71, 0xE0, + 0x3F, 0x60, + 0x1E, 0x60, + 0x00, 0x60, + 0xC0, 0x60, + 0xE0, 0xC0, + 0x7F, 0xC0, + 0x1F, 0x00 +}; + +static const uint8_t helvR18L1_0x68_BMP[] = { + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xCE, 0x00, + 0xDF, 0x80, + 0xF1, 0x80, + 0xE0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0 +}; + +static const uint8_t helvR18L1_0x69_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0x00, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR18L1_0x6A_BMP[] = { + 0x30, + 0x30, + 0x30, + 0x00, + 0x00, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0xF0, + 0xE0 +}; + +static const uint8_t helvR18L1_0x6B_BMP[] = { + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC1, 0x80, + 0xC3, 0x80, + 0xC7, 0x00, + 0xCE, 0x00, + 0xDC, 0x00, + 0xF8, 0x00, + 0xFC, 0x00, + 0xCE, 0x00, + 0xC6, 0x00, + 0xC7, 0x00, + 0xC3, 0x80, + 0xC1, 0x80, + 0xC1, 0xC0, + 0xC0, 0xC0 +}; + +static const uint8_t helvR18L1_0x6C_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR18L1_0x6D_BMP[] = { + 0xCE, 0x3C, + 0xFF, 0x7E, + 0xE3, 0xC7, + 0xC1, 0x83, + 0xC1, 0x83, + 0xC1, 0x83, + 0xC1, 0x83, + 0xC1, 0x83, + 0xC1, 0x83, + 0xC1, 0x83, + 0xC1, 0x83, + 0xC1, 0x83, + 0xC1, 0x83, + 0xC1, 0x83 +}; + +static const uint8_t helvR18L1_0x6E_BMP[] = { + 0xCE, 0x00, + 0xDF, 0x80, + 0xF1, 0x80, + 0xE0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0 +}; + +static const uint8_t helvR18L1_0x6F_BMP[] = { + 0x1F, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xE0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0xE0, + 0x60, 0xC0, + 0x71, 0xC0, + 0x3F, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t helvR18L1_0x70_BMP[] = { + 0xCF, 0x00, + 0xDF, 0x80, + 0xF1, 0xC0, + 0xE0, 0xC0, + 0xC0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0xE0, + 0xE0, 0xC0, + 0xF1, 0xC0, + 0xDF, 0x80, + 0xCF, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t helvR18L1_0x71_BMP[] = { + 0x1E, 0x60, + 0x3F, 0x60, + 0x71, 0xE0, + 0x60, 0xE0, + 0xE0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0x60, + 0x60, 0xE0, + 0x71, 0xE0, + 0x3F, 0x60, + 0x1E, 0x60, + 0x00, 0x60, + 0x00, 0x60, + 0x00, 0x60, + 0x00, 0x60, + 0x00, 0x60 +}; + +static const uint8_t helvR18L1_0x72_BMP[] = { + 0xCC, + 0xDC, + 0xF8, + 0xF0, + 0xE0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR18L1_0x73_BMP[] = { + 0x3F, 0x00, + 0x7F, 0x80, + 0xE1, 0xC0, + 0xC0, 0xC0, + 0xC0, 0x00, + 0xF8, 0x00, + 0x7F, 0x00, + 0x0F, 0x80, + 0x01, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x7F, 0x80, + 0x3F, 0x00 +}; + +static const uint8_t helvR18L1_0x74_BMP[] = { + 0x30, + 0x30, + 0x30, + 0x30, + 0xFC, + 0xFC, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x3C, + 0x1C +}; + +static const uint8_t helvR18L1_0x75_BMP[] = { + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0x63, 0xC0, + 0x7E, 0xC0, + 0x1C, 0xC0 +}; + +static const uint8_t helvR18L1_0x76_BMP[] = { + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0x60, 0xC0, + 0x60, 0xC0, + 0x71, 0xC0, + 0x31, 0x80, + 0x31, 0x80, + 0x1B, 0x00, + 0x1B, 0x00, + 0x1B, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00 +}; + +static const uint8_t helvR18L1_0x77_BMP[] = { + 0xC0, 0xC0, 0xC0, + 0xC0, 0xC0, 0xC0, + 0x61, 0xE1, 0x80, + 0x61, 0xE1, 0x80, + 0x61, 0xE1, 0x80, + 0x31, 0x23, 0x00, + 0x33, 0x33, 0x00, + 0x33, 0x33, 0x00, + 0x1B, 0x36, 0x00, + 0x1A, 0x16, 0x00, + 0x1E, 0x1E, 0x00, + 0x0E, 0x1C, 0x00, + 0x0C, 0x0C, 0x00, + 0x0C, 0x0C, 0x00 +}; + +static const uint8_t helvR18L1_0x78_BMP[] = { + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x61, 0x80, + 0x33, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x0C, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x33, 0x00, + 0x73, 0x80, + 0x61, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0 +}; + +static const uint8_t helvR18L1_0x79_BMP[] = { + 0xC0, 0x30, + 0xC0, 0x30, + 0x60, 0x30, + 0x70, 0x60, + 0x30, 0x60, + 0x38, 0xE0, + 0x18, 0xC0, + 0x18, 0xC0, + 0x0D, 0x80, + 0x0D, 0x80, + 0x07, 0x80, + 0x07, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x3C, 0x00, + 0x38, 0x00 +}; + +static const uint8_t helvR18L1_0x7A_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x01, 0x80, + 0x03, 0x00, + 0x07, 0x00, + 0x0E, 0x00, + 0x0C, 0x00, + 0x1C, 0x00, + 0x38, 0x00, + 0x30, 0x00, + 0x60, 0x00, + 0xE0, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t helvR18L1_0x7B_BMP[] = { + 0x0C, + 0x18, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x60, + 0xC0, + 0xC0, + 0x60, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x18, + 0x0C +}; + +static const uint8_t helvR18L1_0x7C_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR18L1_0x7D_BMP[] = { + 0xC0, + 0x60, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x18, + 0x0C, + 0x0C, + 0x18, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x60, + 0xC0 +}; + +static const uint8_t helvR18L1_0x7E_BMP[] = { + 0x70, 0xC0, + 0xFC, 0xC0, + 0xCF, 0xC0, + 0xC3, 0x80 +}; + +static const uint8_t helvR18L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t helvR18L1_0xA1_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0x00, + 0x00, + 0x40, + 0x40, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR18L1_0xA2_BMP[] = { + 0x01, 0x80, + 0x01, 0x80, + 0x1F, 0x00, + 0x3F, 0x80, + 0x73, 0xC0, + 0x66, 0xC0, + 0xC6, 0x00, + 0xCC, 0x00, + 0xCC, 0x00, + 0xCC, 0x00, + 0xD8, 0x00, + 0xD8, 0x00, + 0xD8, 0xC0, + 0x71, 0xC0, + 0x7F, 0x80, + 0x3F, 0x00, + 0x60, 0x00, + 0x60, 0x00 +}; + +static const uint8_t helvR18L1_0xA3_BMP[] = { + 0x1F, 0x80, + 0x3F, 0xE0, + 0x70, 0x70, + 0x60, 0x30, + 0x60, 0x00, + 0x70, 0x00, + 0x30, 0x00, + 0x18, 0x00, + 0xFF, 0x80, + 0xFF, 0x80, + 0x18, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x67, 0x30, + 0xFF, 0xF0, + 0xF0, 0xE0 +}; + +static const uint8_t helvR18L1_0xA4_BMP[] = { + 0xC0, 0x60, + 0xEE, 0xE0, + 0x7F, 0xC0, + 0x31, 0x80, + 0x60, 0xC0, + 0x60, 0xC0, + 0x60, 0xC0, + 0x60, 0xC0, + 0x31, 0x80, + 0x7F, 0xC0, + 0xEE, 0xE0, + 0xC0, 0x60 +}; + +static const uint8_t helvR18L1_0xA5_BMP[] = { + 0xE0, 0x1C, + 0x60, 0x18, + 0x70, 0x38, + 0x30, 0x30, + 0x38, 0x70, + 0x18, 0x60, + 0x1C, 0xE0, + 0x0C, 0xC0, + 0x3F, 0xF0, + 0x3F, 0xF0, + 0x03, 0x00, + 0x3F, 0xF0, + 0x3F, 0xF0, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00 +}; + +static const uint8_t helvR18L1_0xA6_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x00, + 0x00, + 0x00, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR18L1_0xA7_BMP[] = { + 0x1F, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0x70, 0xC0, + 0x38, 0x00, + 0x1C, 0x00, + 0x7E, 0x00, + 0xE7, 0x00, + 0xC3, 0x80, + 0xC1, 0xC0, + 0xC0, 0xC0, + 0x60, 0x60, + 0x70, 0x60, + 0x38, 0x60, + 0x1C, 0xC0, + 0x0F, 0x80, + 0x07, 0x00, + 0x03, 0x80, + 0x61, 0xC0, + 0x60, 0xC0, + 0x71, 0xC0, + 0x3F, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t helvR18L1_0xA8_BMP[] = { + 0xCC, + 0xCC +}; + +static const uint8_t helvR18L1_0xA9_BMP[] = { + 0x03, 0xF8, 0x00, + 0x0E, 0x0E, 0x00, + 0x30, 0x01, 0x80, + 0x60, 0x00, 0xC0, + 0x41, 0xF0, 0x40, + 0xC3, 0x18, 0x60, + 0x86, 0x0C, 0x20, + 0x84, 0x00, 0x20, + 0x84, 0x00, 0x20, + 0x84, 0x00, 0x20, + 0x84, 0x00, 0x20, + 0x86, 0x0C, 0x20, + 0xC3, 0x18, 0x60, + 0x41, 0xF0, 0x40, + 0x60, 0x00, 0xC0, + 0x30, 0x01, 0x80, + 0x18, 0x03, 0x00, + 0x0E, 0x0E, 0x00, + 0x03, 0xF8, 0x00 +}; + +static const uint8_t helvR18L1_0xAA_BMP[] = { + 0x78, + 0xCC, + 0xCC, + 0x1C, + 0x6C, + 0xCC, + 0xCC, + 0xDC, + 0x76, + 0x00, + 0xFE, + 0xFE +}; + +static const uint8_t helvR18L1_0xAB_BMP[] = { + 0x19, 0x80, + 0x33, 0x00, + 0x66, 0x00, + 0xCC, 0x00, + 0xCC, 0x00, + 0x66, 0x00, + 0x33, 0x00, + 0x19, 0x80 +}; + +static const uint8_t helvR18L1_0xAC_BMP[] = { + 0xFF, 0xF8, + 0xFF, 0xF8, + 0x00, 0x18, + 0x00, 0x18, + 0x00, 0x18, + 0x00, 0x18, + 0x00, 0x18, + 0x00, 0x18 +}; + +static const uint8_t helvR18L1_0xAD_BMP[] = { + 0xFC, + 0xFC +}; + +static const uint8_t helvR18L1_0xAE_BMP[] = { + 0x07, 0xF8, 0x00, + 0x1C, 0x0E, 0x00, + 0x30, 0x03, 0x00, + 0x60, 0x01, 0x80, + 0x43, 0xF0, 0x80, + 0xC2, 0x18, 0xC0, + 0x82, 0x08, 0x40, + 0x82, 0x08, 0x40, + 0x82, 0x08, 0x40, + 0x82, 0x10, 0x40, + 0x83, 0xF0, 0x40, + 0x82, 0x20, 0x40, + 0x82, 0x10, 0x40, + 0xC2, 0x10, 0xC0, + 0x42, 0x08, 0x80, + 0x60, 0x01, 0x80, + 0x30, 0x03, 0x00, + 0x1C, 0x0E, 0x00, + 0x07, 0xF8, 0x00 +}; + +static const uint8_t helvR18L1_0xAF_BMP[] = { + 0xFC, + 0xFC +}; + +static const uint8_t helvR18L1_0xB0_BMP[] = { + 0x3C, + 0x66, + 0xC3, + 0xC3, + 0xC3, + 0x66, + 0x3C +}; + +static const uint8_t helvR18L1_0xB1_BMP[] = { + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0 +}; + +static const uint8_t helvR18L1_0xB2_BMP[] = { + 0x3C, + 0x7E, + 0xC6, + 0x06, + 0x0C, + 0x18, + 0x30, + 0x60, + 0xFE, + 0xFE +}; + +static const uint8_t helvR18L1_0xB3_BMP[] = { + 0x7C, + 0xFE, + 0xC6, + 0x06, + 0x3C, + 0x3C, + 0x06, + 0xC6, + 0xFE, + 0x7C +}; + +static const uint8_t helvR18L1_0xB4_BMP[] = { + 0x18, + 0x30, + 0x60, + 0xC0 +}; + +static const uint8_t helvR18L1_0xB5_BMP[] = { + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0xE3, 0xC0, + 0xFE, 0xC0, + 0xDC, 0xC0, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t helvR18L1_0xB6_BMP[] = { + 0x1F, 0xC0, + 0x7F, 0xC0, + 0x7D, 0x80, + 0xFD, 0x80, + 0xFD, 0x80, + 0xFD, 0x80, + 0xFD, 0x80, + 0xFD, 0x80, + 0xFD, 0x80, + 0x7D, 0x80, + 0x7D, 0x80, + 0x3D, 0x80, + 0x0D, 0x80, + 0x0D, 0x80, + 0x0D, 0x80, + 0x0D, 0x80, + 0x0D, 0x80, + 0x0D, 0x80, + 0x0D, 0x80, + 0x0D, 0x80, + 0x0D, 0x80, + 0x0D, 0x80, + 0x0D, 0x80, + 0x0D, 0x80 +}; + +static const uint8_t helvR18L1_0xB7_BMP[] = { + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR18L1_0xB8_BMP[] = { + 0x60, + 0x70, + 0x18, + 0x18, + 0xF8, + 0x70 +}; + +static const uint8_t helvR18L1_0xB9_BMP[] = { + 0x30, + 0x30, + 0xF0, + 0xF0, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30 +}; + +static const uint8_t helvR18L1_0xBA_BMP[] = { + 0x38, + 0x6C, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0xC6, + 0x6C, + 0x38, + 0x00, + 0xFE, + 0xFE +}; + +static const uint8_t helvR18L1_0xBB_BMP[] = { + 0xCC, 0x00, + 0x66, 0x00, + 0x33, 0x00, + 0x19, 0x80, + 0x19, 0x80, + 0x33, 0x00, + 0x66, 0x00, + 0xCC, 0x00 +}; + +static const uint8_t helvR18L1_0xBC_BMP[] = { + 0x30, 0x18, 0x00, + 0x30, 0x18, 0x00, + 0xF0, 0x30, 0x00, + 0xF0, 0x30, 0x00, + 0x30, 0x60, 0x00, + 0x30, 0x60, 0x00, + 0x30, 0xC0, 0x00, + 0x30, 0xC0, 0x00, + 0x31, 0x83, 0x00, + 0x31, 0x87, 0x00, + 0x03, 0x0F, 0x00, + 0x03, 0x0F, 0x00, + 0x06, 0x1B, 0x00, + 0x06, 0x33, 0x00, + 0x0C, 0x7F, 0xC0, + 0x0C, 0x7F, 0xC0, + 0x18, 0x03, 0x00, + 0x18, 0x03, 0x00 +}; + +static const uint8_t helvR18L1_0xBD_BMP[] = { + 0x30, 0x18, 0x00, + 0x30, 0x18, 0x00, + 0xF0, 0x30, 0x00, + 0xF0, 0x30, 0x00, + 0x30, 0x60, 0x00, + 0x30, 0x60, 0x00, + 0x30, 0xC0, 0x00, + 0x30, 0xC0, 0x00, + 0x31, 0x87, 0x80, + 0x31, 0x8F, 0xC0, + 0x03, 0x18, 0xC0, + 0x03, 0x00, 0xC0, + 0x06, 0x01, 0x80, + 0x06, 0x03, 0x00, + 0x0C, 0x06, 0x00, + 0x0C, 0x0C, 0x00, + 0x18, 0x1F, 0xC0, + 0x18, 0x1F, 0xC0 +}; + +static const uint8_t helvR18L1_0xBE_BMP[] = { + 0x7C, 0x0C, 0x00, + 0xFE, 0x0C, 0x00, + 0xC6, 0x18, 0x00, + 0x06, 0x18, 0x00, + 0x3C, 0x30, 0x00, + 0x3C, 0x30, 0x00, + 0x06, 0x60, 0x00, + 0xC6, 0x60, 0x00, + 0xFE, 0xC1, 0x80, + 0x7C, 0xC3, 0x80, + 0x01, 0x87, 0x80, + 0x01, 0x87, 0x80, + 0x03, 0x0D, 0x80, + 0x03, 0x19, 0x80, + 0x06, 0x3F, 0xE0, + 0x06, 0x3F, 0xE0, + 0x0C, 0x01, 0x80, + 0x0C, 0x01, 0x80 +}; + +static const uint8_t helvR18L1_0xBF_BMP[] = { + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x18, 0x00, + 0x38, 0x00, + 0x70, 0x00, + 0x60, 0x00, + 0xE0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0xE3, 0x80, + 0x7F, 0x80, + 0x3E, 0x00 +}; + +static const uint8_t helvR18L1_0xC0_BMP[] = { + 0x0C, 0x00, + 0x06, 0x00, + 0x03, 0x00, + 0x01, 0x80, + 0x00, 0x00, + 0x03, 0x80, + 0x03, 0x80, + 0x06, 0xC0, + 0x06, 0xC0, + 0x0C, 0x40, + 0x0C, 0x60, + 0x0C, 0x60, + 0x18, 0x30, + 0x18, 0x30, + 0x18, 0x30, + 0x30, 0x18, + 0x3F, 0xF8, + 0x3F, 0xF8, + 0x60, 0x0C, + 0x60, 0x0C, + 0x60, 0x0C, + 0xC0, 0x06, + 0xC0, 0x06, + 0xC0, 0x06 +}; + +static const uint8_t helvR18L1_0xC1_BMP[] = { + 0x00, 0x60, + 0x00, 0xC0, + 0x01, 0x80, + 0x03, 0x00, + 0x00, 0x00, + 0x03, 0x80, + 0x03, 0x80, + 0x06, 0xC0, + 0x06, 0xC0, + 0x0C, 0x40, + 0x0C, 0x60, + 0x0C, 0x60, + 0x18, 0x30, + 0x18, 0x30, + 0x18, 0x30, + 0x30, 0x18, + 0x3F, 0xF8, + 0x3F, 0xF8, + 0x60, 0x0C, + 0x60, 0x0C, + 0x60, 0x0C, + 0xC0, 0x06, + 0xC0, 0x06, + 0xC0, 0x06 +}; + +static const uint8_t helvR18L1_0xC2_BMP[] = { + 0x01, 0x80, + 0x03, 0xC0, + 0x06, 0x60, + 0x0C, 0x30, + 0x00, 0x00, + 0x03, 0x80, + 0x03, 0x80, + 0x06, 0xC0, + 0x06, 0xC0, + 0x0C, 0x40, + 0x0C, 0x60, + 0x0C, 0x60, + 0x18, 0x30, + 0x18, 0x30, + 0x18, 0x30, + 0x30, 0x18, + 0x3F, 0xF8, + 0x3F, 0xF8, + 0x60, 0x0C, + 0x60, 0x0C, + 0x60, 0x0C, + 0xC0, 0x06, + 0xC0, 0x06, + 0xC0, 0x06 +}; + +static const uint8_t helvR18L1_0xC3_BMP[] = { + 0x07, 0x10, + 0x0D, 0xB0, + 0x08, 0xE0, + 0x00, 0x00, + 0x03, 0x80, + 0x03, 0x80, + 0x06, 0xC0, + 0x06, 0xC0, + 0x0C, 0x40, + 0x0C, 0x60, + 0x0C, 0x60, + 0x18, 0x30, + 0x18, 0x30, + 0x18, 0x30, + 0x30, 0x18, + 0x3F, 0xF8, + 0x3F, 0xF8, + 0x60, 0x0C, + 0x60, 0x0C, + 0x60, 0x0C, + 0xC0, 0x06, + 0xC0, 0x06, + 0xC0, 0x06 +}; + +static const uint8_t helvR18L1_0xC4_BMP[] = { + 0x0C, 0x60, + 0x0C, 0x60, + 0x00, 0x00, + 0x00, 0x00, + 0x03, 0x80, + 0x03, 0x80, + 0x06, 0xC0, + 0x06, 0xC0, + 0x0C, 0x40, + 0x0C, 0x60, + 0x0C, 0x60, + 0x18, 0x30, + 0x18, 0x30, + 0x18, 0x30, + 0x30, 0x18, + 0x3F, 0xF8, + 0x3F, 0xF8, + 0x60, 0x0C, + 0x60, 0x0C, + 0x60, 0x0C, + 0xC0, 0x06, + 0xC0, 0x06, + 0xC0, 0x06 +}; + +static const uint8_t helvR18L1_0xC5_BMP[] = { + 0x03, 0x80, + 0x04, 0x40, + 0x04, 0x40, + 0x03, 0x80, + 0x00, 0x00, + 0x03, 0x80, + 0x03, 0x80, + 0x06, 0xC0, + 0x06, 0xC0, + 0x0C, 0x40, + 0x0C, 0x60, + 0x0C, 0x60, + 0x18, 0x30, + 0x18, 0x30, + 0x18, 0x30, + 0x30, 0x18, + 0x3F, 0xF8, + 0x3F, 0xF8, + 0x60, 0x0C, + 0x60, 0x0C, + 0x60, 0x0C, + 0xC0, 0x06, + 0xC0, 0x06, + 0xC0, 0x06 +}; + +static const uint8_t helvR18L1_0xC6_BMP[] = { + 0x03, 0xFF, 0xF8, + 0x03, 0xFF, 0xF8, + 0x06, 0x60, 0x00, + 0x06, 0x60, 0x00, + 0x0C, 0x60, 0x00, + 0x0C, 0x60, 0x00, + 0x0C, 0x60, 0x00, + 0x18, 0x60, 0x00, + 0x18, 0x7F, 0xF8, + 0x18, 0x7F, 0xF8, + 0x30, 0x60, 0x00, + 0x3F, 0xE0, 0x00, + 0x3F, 0xE0, 0x00, + 0x60, 0x60, 0x00, + 0x60, 0x60, 0x00, + 0x60, 0x60, 0x00, + 0xC0, 0x60, 0x00, + 0xC0, 0x7F, 0xF8, + 0xC0, 0x7F, 0xF8 +}; + +static const uint8_t helvR18L1_0xC7_BMP[] = { + 0x07, 0xE0, + 0x1F, 0xF8, + 0x3C, 0x3C, + 0x70, 0x0E, + 0x60, 0x06, + 0xE0, 0x06, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xE0, 0x06, + 0x60, 0x06, + 0x70, 0x0E, + 0x3C, 0x3C, + 0x1F, 0xF8, + 0x07, 0xE0, + 0x01, 0x80, + 0x00, 0xC0, + 0x00, 0xC0, + 0x07, 0xC0, + 0x03, 0x80 +}; + +static const uint8_t helvR18L1_0xC8_BMP[] = { + 0x30, 0x00, + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0 +}; + +static const uint8_t helvR18L1_0xC9_BMP[] = { + 0x01, 0x80, + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0 +}; + +static const uint8_t helvR18L1_0xCA_BMP[] = { + 0x06, 0x00, + 0x0F, 0x00, + 0x19, 0x80, + 0x30, 0xC0, + 0x00, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0 +}; + +static const uint8_t helvR18L1_0xCB_BMP[] = { + 0x18, 0xC0, + 0x18, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0 +}; + +static const uint8_t helvR18L1_0xCC_BMP[] = { + 0xC0, + 0x60, + 0x30, + 0x18, + 0x00, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30 +}; + +static const uint8_t helvR18L1_0xCD_BMP[] = { + 0x18, + 0x30, + 0x60, + 0xC0, + 0x00, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvR18L1_0xCE_BMP[] = { + 0x18, + 0x3C, + 0x66, + 0xC3, + 0x00, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18 +}; + +static const uint8_t helvR18L1_0xCF_BMP[] = { + 0xCC, + 0xCC, + 0x00, + 0x00, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30 +}; + +static const uint8_t helvR18L1_0xD0_BMP[] = { + 0x1F, 0xF8, 0x00, + 0x1F, 0xFE, 0x00, + 0x18, 0x0F, 0x00, + 0x18, 0x03, 0x80, + 0x18, 0x01, 0x80, + 0x18, 0x01, 0xC0, + 0x18, 0x00, 0xC0, + 0x18, 0x00, 0xC0, + 0xFF, 0x80, 0xC0, + 0xFF, 0x80, 0xC0, + 0x18, 0x00, 0xC0, + 0x18, 0x00, 0xC0, + 0x18, 0x00, 0xC0, + 0x18, 0x01, 0xC0, + 0x18, 0x01, 0x80, + 0x18, 0x03, 0x80, + 0x18, 0x0F, 0x00, + 0x1F, 0xFE, 0x00, + 0x1F, 0xF8, 0x00 +}; + +static const uint8_t helvR18L1_0xD1_BMP[] = { + 0x0E, 0x20, + 0x1B, 0x60, + 0x11, 0xC0, + 0x00, 0x00, + 0xE0, 0x0C, + 0xF0, 0x0C, + 0xF0, 0x0C, + 0xD8, 0x0C, + 0xDC, 0x0C, + 0xCC, 0x0C, + 0xCE, 0x0C, + 0xC6, 0x0C, + 0xC7, 0x0C, + 0xC3, 0x0C, + 0xC3, 0x8C, + 0xC1, 0x8C, + 0xC1, 0xCC, + 0xC0, 0xCC, + 0xC0, 0xEC, + 0xC0, 0x6C, + 0xC0, 0x3C, + 0xC0, 0x3C, + 0xC0, 0x1C +}; + +static const uint8_t helvR18L1_0xD2_BMP[] = { + 0x0C, 0x00, + 0x06, 0x00, + 0x03, 0x00, + 0x01, 0x80, + 0x00, 0x00, + 0x07, 0xE0, + 0x1F, 0xF8, + 0x3C, 0x3C, + 0x70, 0x0E, + 0x60, 0x06, + 0xE0, 0x07, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xE0, 0x07, + 0x60, 0x06, + 0x70, 0x0E, + 0x3C, 0x3C, + 0x1F, 0xF8, + 0x07, 0xE0 +}; + +static const uint8_t helvR18L1_0xD3_BMP[] = { + 0x00, 0x30, + 0x00, 0x60, + 0x00, 0xC0, + 0x01, 0x80, + 0x00, 0x00, + 0x07, 0xE0, + 0x1F, 0xF8, + 0x3C, 0x3C, + 0x70, 0x0E, + 0x60, 0x06, + 0xE0, 0x07, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xE0, 0x07, + 0x60, 0x06, + 0x70, 0x0E, + 0x3C, 0x3C, + 0x1F, 0xF8, + 0x07, 0xE0 +}; + +static const uint8_t helvR18L1_0xD4_BMP[] = { + 0x00, 0xC0, + 0x01, 0xE0, + 0x03, 0x30, + 0x06, 0x18, + 0x00, 0x00, + 0x07, 0xE0, + 0x1F, 0xF8, + 0x3C, 0x3C, + 0x70, 0x0E, + 0x60, 0x06, + 0xE0, 0x07, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xE0, 0x07, + 0x60, 0x06, + 0x70, 0x0E, + 0x3C, 0x3C, + 0x1F, 0xF8, + 0x07, 0xE0 +}; + +static const uint8_t helvR18L1_0xD5_BMP[] = { + 0x03, 0x88, + 0x06, 0xD8, + 0x04, 0x70, + 0x00, 0x00, + 0x07, 0xE0, + 0x1F, 0xF8, + 0x3C, 0x3C, + 0x70, 0x0E, + 0x60, 0x06, + 0xE0, 0x07, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xE0, 0x07, + 0x60, 0x06, + 0x70, 0x0E, + 0x3C, 0x3C, + 0x1F, 0xF8, + 0x07, 0xE0 +}; + +static const uint8_t helvR18L1_0xD6_BMP[] = { + 0x06, 0x30, + 0x06, 0x30, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0xE0, + 0x1F, 0xF8, + 0x3C, 0x3C, + 0x70, 0x0E, + 0x60, 0x06, + 0xE0, 0x07, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xC0, 0x03, + 0xE0, 0x07, + 0x60, 0x06, + 0x70, 0x0E, + 0x3C, 0x3C, + 0x1F, 0xF8, + 0x07, 0xE0 +}; + +static const uint8_t helvR18L1_0xD7_BMP[] = { + 0xC0, 0x18, + 0x60, 0x30, + 0x30, 0x60, + 0x18, 0xC0, + 0x0D, 0x80, + 0x07, 0x00, + 0x07, 0x00, + 0x0D, 0x80, + 0x18, 0xC0, + 0x30, 0x60, + 0x60, 0x30, + 0xC0, 0x18 +}; + +static const uint8_t helvR18L1_0xD8_BMP[] = { + 0x03, 0xF0, 0xC0, + 0x0F, 0xFD, 0xC0, + 0x1E, 0x1F, 0x80, + 0x38, 0x07, 0x00, + 0x30, 0x0F, 0x00, + 0x70, 0x1D, 0x80, + 0x60, 0x39, 0x80, + 0x60, 0x71, 0x80, + 0x60, 0xE1, 0x80, + 0x61, 0xC1, 0x80, + 0x63, 0x81, 0x80, + 0x67, 0x01, 0x80, + 0x6E, 0x01, 0x80, + 0x7C, 0x03, 0x80, + 0x38, 0x03, 0x00, + 0x38, 0x07, 0x00, + 0x7E, 0x1E, 0x00, + 0xEF, 0xFC, 0x00, + 0xC3, 0xF0, 0x00 +}; + +static const uint8_t helvR18L1_0xD9_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x03, 0x00, + 0x00, 0x00, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0x60, 0x18, + 0x70, 0x38, + 0x3F, 0xF0, + 0x0F, 0xC0 +}; + +static const uint8_t helvR18L1_0xDA_BMP[] = { + 0x00, 0x60, + 0x00, 0xC0, + 0x01, 0x80, + 0x03, 0x00, + 0x00, 0x00, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0x60, 0x18, + 0x70, 0x38, + 0x3F, 0xF0, + 0x0F, 0xC0 +}; + +static const uint8_t helvR18L1_0xDB_BMP[] = { + 0x03, 0x00, + 0x07, 0x80, + 0x0C, 0xC0, + 0x18, 0x60, + 0x00, 0x00, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0x60, 0x18, + 0x70, 0x38, + 0x3F, 0xF0, + 0x0F, 0xC0 +}; + +static const uint8_t helvR18L1_0xDC_BMP[] = { + 0x18, 0xC0, + 0x18, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0xC0, 0x0C, + 0x60, 0x18, + 0x70, 0x38, + 0x3F, 0xF0, + 0x0F, 0xC0 +}; + +static const uint8_t helvR18L1_0xDD_BMP[] = { + 0x00, 0x60, + 0x00, 0xC0, + 0x01, 0x80, + 0x03, 0x00, + 0x00, 0x00, + 0xC0, 0x0C, + 0xE0, 0x1C, + 0x60, 0x18, + 0x70, 0x38, + 0x30, 0x30, + 0x38, 0x70, + 0x18, 0x60, + 0x1C, 0xE0, + 0x0C, 0xC0, + 0x0F, 0xC0, + 0x07, 0x80, + 0x07, 0x80, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00 +}; + +static const uint8_t helvR18L1_0xDE_BMP[] = { + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xFF, 0xE0, + 0xFF, 0xF0, + 0xC0, 0x30, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x18, + 0xC0, 0x30, + 0xFF, 0xF0, + 0xFF, 0xE0, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t helvR18L1_0xDF_BMP[] = { + 0x1C, 0x00, + 0x7F, 0x00, + 0xE3, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC3, 0x00, + 0xC7, 0x00, + 0xCE, 0x00, + 0xCF, 0x00, + 0xC3, 0x80, + 0xC1, 0x80, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0x80, + 0xC3, 0x80, + 0xCF, 0x00, + 0xCE, 0x00 +}; + +static const uint8_t helvR18L1_0xE0_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x03, 0x00, + 0x00, 0x00, + 0x1F, 0x00, + 0x3F, 0x80, + 0x61, 0xC0, + 0x60, 0xC0, + 0x00, 0xC0, + 0x07, 0xC0, + 0x3F, 0xC0, + 0x78, 0xC0, + 0xE0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0xE3, 0xC0, + 0x7E, 0xE0, + 0x3C, 0x60 +}; + +static const uint8_t helvR18L1_0xE1_BMP[] = { + 0x01, 0x80, + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x00, 0x00, + 0x1F, 0x00, + 0x3F, 0x80, + 0x61, 0xC0, + 0x60, 0xC0, + 0x00, 0xC0, + 0x07, 0xC0, + 0x3F, 0xC0, + 0x78, 0xC0, + 0xE0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0xE3, 0xC0, + 0x7E, 0xE0, + 0x3C, 0x60 +}; + +static const uint8_t helvR18L1_0xE2_BMP[] = { + 0x0C, 0x00, + 0x1E, 0x00, + 0x33, 0x00, + 0x61, 0x80, + 0x00, 0x00, + 0x1F, 0x00, + 0x3F, 0x80, + 0x61, 0xC0, + 0x60, 0xC0, + 0x00, 0xC0, + 0x07, 0xC0, + 0x3F, 0xC0, + 0x78, 0xC0, + 0xE0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0xE3, 0xC0, + 0x7E, 0xE0, + 0x3C, 0x60 +}; + +static const uint8_t helvR18L1_0xE3_BMP[] = { + 0x1C, 0x40, + 0x36, 0xC0, + 0x23, 0x80, + 0x00, 0x00, + 0x1F, 0x00, + 0x3F, 0x80, + 0x61, 0xC0, + 0x60, 0xC0, + 0x00, 0xC0, + 0x07, 0xC0, + 0x3F, 0xC0, + 0x78, 0xC0, + 0xE0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0xE3, 0xC0, + 0x7E, 0xE0, + 0x3C, 0x60 +}; + +static const uint8_t helvR18L1_0xE4_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x1F, 0x00, + 0x3F, 0x80, + 0x61, 0xC0, + 0x60, 0xC0, + 0x00, 0xC0, + 0x07, 0xC0, + 0x3F, 0xC0, + 0x78, 0xC0, + 0xE0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0xE3, 0xC0, + 0x7E, 0xE0, + 0x3C, 0x60 +}; + +static const uint8_t helvR18L1_0xE5_BMP[] = { + 0x06, 0x00, + 0x09, 0x00, + 0x09, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0x1F, 0x00, + 0x3F, 0x80, + 0x61, 0xC0, + 0x60, 0xC0, + 0x00, 0xC0, + 0x07, 0xC0, + 0x3F, 0xC0, + 0x78, 0xC0, + 0xE0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0xE3, 0xC0, + 0x7E, 0xE0, + 0x3C, 0x60 +}; + +static const uint8_t helvR18L1_0xE6_BMP[] = { + 0x1F, 0x0E, 0x00, + 0x3F, 0xBF, 0x80, + 0x61, 0xF1, 0xC0, + 0x60, 0xE0, 0xC0, + 0x00, 0xC0, 0x60, + 0x07, 0xC0, 0x60, + 0x3F, 0xFF, 0xE0, + 0x78, 0xFF, 0xE0, + 0xE0, 0xC0, 0x00, + 0xC0, 0xC0, 0x00, + 0xC1, 0xE0, 0x60, + 0xE3, 0xF0, 0xE0, + 0x7E, 0x3F, 0xC0, + 0x3C, 0x0F, 0x00 +}; + +static const uint8_t helvR18L1_0xE7_BMP[] = { + 0x1F, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xE0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xE0, 0x00, + 0x60, 0xC0, + 0x71, 0xC0, + 0x3F, 0x80, + 0x1F, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x3E, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t helvR18L1_0xE8_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x03, 0x00, + 0x00, 0x00, + 0x0E, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0xC0, 0x00, + 0xC0, 0x00, + 0x60, 0x60, + 0x70, 0xE0, + 0x3F, 0xC0, + 0x0F, 0x00 +}; + +static const uint8_t helvR18L1_0xE9_BMP[] = { + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x18, 0x00, + 0x00, 0x00, + 0x0E, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0xC0, 0x00, + 0xC0, 0x00, + 0x60, 0x60, + 0x70, 0xE0, + 0x3F, 0xC0, + 0x0F, 0x00 +}; + +static const uint8_t helvR18L1_0xEA_BMP[] = { + 0x0C, 0x00, + 0x1E, 0x00, + 0x33, 0x00, + 0x61, 0x80, + 0x00, 0x00, + 0x0E, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0xC0, 0x00, + 0xC0, 0x00, + 0x60, 0x60, + 0x70, 0xE0, + 0x3F, 0xC0, + 0x0F, 0x00 +}; + +static const uint8_t helvR18L1_0xEB_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0E, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0xC0, 0x00, + 0xC0, 0x00, + 0x60, 0x60, + 0x70, 0xE0, + 0x3F, 0xC0, + 0x0F, 0x00 +}; + +static const uint8_t helvR18L1_0xEC_BMP[] = { + 0xC0, + 0x60, + 0x30, + 0x18, + 0x00, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30 +}; + +static const uint8_t helvR18L1_0xED_BMP[] = { + 0x18, + 0x30, + 0x60, + 0xC0, + 0x00, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60, + 0x60 +}; + +static const uint8_t helvR18L1_0xEE_BMP[] = { + 0x18, + 0x3C, + 0x66, + 0xC3, + 0x00, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18 +}; + +static const uint8_t helvR18L1_0xEF_BMP[] = { + 0xCC, + 0xCC, + 0x00, + 0x00, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30, + 0x30 +}; + +static const uint8_t helvR18L1_0xF0_BMP[] = { + 0x60, 0x00, + 0x39, 0x80, + 0x0E, 0x00, + 0x1E, 0x00, + 0x63, 0x00, + 0x1F, 0x80, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xE0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0xE0, + 0x60, 0xC0, + 0x71, 0xC0, + 0x3F, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t helvR18L1_0xF1_BMP[] = { + 0x38, 0x80, + 0x6D, 0x80, + 0x47, 0x00, + 0x00, 0x00, + 0xCE, 0x00, + 0xDF, 0x80, + 0xF1, 0x80, + 0xE0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0 +}; + +static const uint8_t helvR18L1_0xF2_BMP[] = { + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x03, 0x00, + 0x00, 0x00, + 0x1F, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xE0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0xE0, + 0x60, 0xC0, + 0x71, 0xC0, + 0x3F, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t helvR18L1_0xF3_BMP[] = { + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x18, 0x00, + 0x00, 0x00, + 0x1F, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xE0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0xE0, + 0x60, 0xC0, + 0x71, 0xC0, + 0x3F, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t helvR18L1_0xF4_BMP[] = { + 0x0C, 0x00, + 0x1E, 0x00, + 0x33, 0x00, + 0x61, 0x80, + 0x00, 0x00, + 0x1F, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xE0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0xE0, + 0x60, 0xC0, + 0x71, 0xC0, + 0x3F, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t helvR18L1_0xF5_BMP[] = { + 0x1C, 0x40, + 0x36, 0xC0, + 0x23, 0x80, + 0x00, 0x00, + 0x1F, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xE0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0xE0, + 0x60, 0xC0, + 0x71, 0xC0, + 0x3F, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t helvR18L1_0xF6_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x1F, 0x00, + 0x3F, 0x80, + 0x71, 0xC0, + 0x60, 0xC0, + 0xE0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xE0, 0xE0, + 0x60, 0xC0, + 0x71, 0xC0, + 0x3F, 0x80, + 0x1F, 0x00 +}; + +static const uint8_t helvR18L1_0xF7_BMP[] = { + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xF0, + 0xFF, 0xF0, + 0x00, 0x00, + 0x00, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00 +}; + +static const uint8_t helvR18L1_0xF8_BMP[] = { + 0x0F, 0x98, + 0x1F, 0xF8, + 0x38, 0x70, + 0x30, 0xE0, + 0x71, 0xF0, + 0x63, 0xB0, + 0x63, 0x30, + 0x66, 0x30, + 0x6C, 0x30, + 0x7C, 0x70, + 0x38, 0x60, + 0x70, 0xE0, + 0xFF, 0xC0, + 0xCF, 0x80 +}; + +static const uint8_t helvR18L1_0xF9_BMP[] = { + 0x30, 0x00, + 0x18, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0x63, 0xC0, + 0x7E, 0xC0, + 0x1C, 0xC0 +}; + +static const uint8_t helvR18L1_0xFA_BMP[] = { + 0x03, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x18, 0x00, + 0x00, 0x00, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0x63, 0xC0, + 0x7E, 0xC0, + 0x1C, 0xC0 +}; + +static const uint8_t helvR18L1_0xFB_BMP[] = { + 0x0C, 0x00, + 0x1E, 0x00, + 0x33, 0x00, + 0x61, 0x80, + 0x00, 0x00, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0x63, 0xC0, + 0x7E, 0xC0, + 0x1C, 0xC0 +}; + +static const uint8_t helvR18L1_0xFC_BMP[] = { + 0x33, 0x00, + 0x33, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC1, 0xC0, + 0x63, 0xC0, + 0x7E, 0xC0, + 0x1C, 0xC0 +}; + +static const uint8_t helvR18L1_0xFD_BMP[] = { + 0x00, 0xC0, + 0x01, 0x80, + 0x03, 0x00, + 0x06, 0x00, + 0x00, 0x00, + 0xC0, 0x30, + 0xC0, 0x30, + 0x60, 0x30, + 0x70, 0x60, + 0x30, 0x60, + 0x38, 0xE0, + 0x18, 0xC0, + 0x18, 0xC0, + 0x0D, 0x80, + 0x0D, 0x80, + 0x07, 0x80, + 0x07, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x3C, 0x00, + 0x38, 0x00 +}; + +static const uint8_t helvR18L1_0xFE_BMP[] = { + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xCF, 0x00, + 0xDF, 0x80, + 0xF1, 0xC0, + 0xE0, 0xC0, + 0xC0, 0xE0, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0x60, + 0xC0, 0xE0, + 0xE0, 0xC0, + 0xF1, 0xC0, + 0xDF, 0x80, + 0xCF, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t helvR18L1_0xFF_BMP[] = { + 0x19, 0x80, + 0x19, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0xC0, 0x30, + 0xC0, 0x30, + 0x60, 0x30, + 0x70, 0x60, + 0x30, 0x60, + 0x38, 0xE0, + 0x18, 0xC0, + 0x18, 0xC0, + 0x0D, 0x80, + 0x0D, 0x80, + 0x07, 0x80, + 0x07, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x3C, 0x00, + 0x38, 0x00 +}; + +static const GFONT_CharInfo FontBMP[] = { + {18, 13, 19, 2, 0, helvR18L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {6, 1, 1, 0, 0, helvR18L1_0x20_BMP}, + {6, 2, 19, 2, 0, helvR18L1_0x21_BMP}, + {8, 6, 6, 1, 13, helvR18L1_0x22_BMP}, + {14, 11, 17, 2, 0, helvR18L1_0x23_BMP}, + {13, 11, 22, 1, -2, helvR18L1_0x24_BMP}, + {22, 19, 18, 1, 0, helvR18L1_0x25_BMP}, + {17, 14, 18, 2, 0, helvR18L1_0x26_BMP}, + {6, 2, 6, 2, 13, helvR18L1_0x27_BMP}, + {8, 5, 24, 2, -5, helvR18L1_0x28_BMP}, + {8, 5, 24, 1, -5, helvR18L1_0x29_BMP}, + {10, 7, 7, 1, 12, helvR18L1_0x2A_BMP}, + {14, 12, 12, 1, 1, helvR18L1_0x2B_BMP}, + {6, 2, 6, 2, -3, helvR18L1_0x2C_BMP}, + {8, 6, 2, 1, 6, helvR18L1_0x2D_BMP}, + {6, 2, 3, 2, 0, helvR18L1_0x2E_BMP}, + {7, 7, 19, 0, 0, helvR18L1_0x2F_BMP}, + {13, 11, 18, 1, 0, helvR18L1_0x30_BMP}, + {13, 6, 18, 2, 0, helvR18L1_0x31_BMP}, + {13, 11, 18, 1, 0, helvR18L1_0x32_BMP}, + {13, 11, 18, 1, 0, helvR18L1_0x33_BMP}, + {13, 11, 18, 1, 0, helvR18L1_0x34_BMP}, + {13, 11, 18, 1, 0, helvR18L1_0x35_BMP}, + {13, 11, 18, 1, 0, helvR18L1_0x36_BMP}, + {13, 11, 18, 1, 0, helvR18L1_0x37_BMP}, + {13, 11, 18, 1, 0, helvR18L1_0x38_BMP}, + {13, 11, 18, 1, 0, helvR18L1_0x39_BMP}, + {6, 2, 14, 2, 0, helvR18L1_0x3A_BMP}, + {6, 2, 17, 2, -3, helvR18L1_0x3B_BMP}, + {15, 12, 12, 1, 1, helvR18L1_0x3C_BMP}, + {15, 10, 5, 2, 5, helvR18L1_0x3D_BMP}, + {15, 12, 12, 1, 1, helvR18L1_0x3E_BMP}, + {12, 10, 19, 1, 0, helvR18L1_0x3F_BMP}, + {25, 22, 23, 2, -4, helvR18L1_0x40_BMP}, + {17, 15, 19, 1, 0, helvR18L1_0x41_BMP}, + {17, 14, 19, 2, 0, helvR18L1_0x42_BMP}, + {18, 15, 19, 1, 0, helvR18L1_0x43_BMP}, + {18, 15, 19, 2, 0, helvR18L1_0x44_BMP}, + {16, 12, 19, 2, 0, helvR18L1_0x45_BMP}, + {14, 11, 19, 2, 0, helvR18L1_0x46_BMP}, + {19, 16, 19, 1, 0, helvR18L1_0x47_BMP}, + {18, 14, 19, 2, 0, helvR18L1_0x48_BMP}, + {8, 2, 19, 3, 0, helvR18L1_0x49_BMP}, + {13, 10, 19, 1, 0, helvR18L1_0x4A_BMP}, + {18, 13, 19, 3, 0, helvR18L1_0x4B_BMP}, + {14, 11, 19, 2, 0, helvR18L1_0x4C_BMP}, + {21, 17, 19, 2, 0, helvR18L1_0x4D_BMP}, + {18, 14, 19, 2, 0, helvR18L1_0x4E_BMP}, + {18, 16, 19, 1, 0, helvR18L1_0x4F_BMP}, + {16, 13, 19, 2, 0, helvR18L1_0x50_BMP}, + {18, 16, 19, 1, 0, helvR18L1_0x51_BMP}, + {17, 13, 19, 2, 0, helvR18L1_0x52_BMP}, + {16, 13, 19, 2, 0, helvR18L1_0x53_BMP}, + {16, 14, 19, 1, 0, helvR18L1_0x54_BMP}, + {18, 14, 19, 2, 0, helvR18L1_0x55_BMP}, + {17, 15, 19, 1, 0, helvR18L1_0x56_BMP}, + {22, 20, 19, 1, 0, helvR18L1_0x57_BMP}, + {17, 15, 19, 1, 0, helvR18L1_0x58_BMP}, + {16, 14, 19, 1, 0, helvR18L1_0x59_BMP}, + {15, 13, 19, 1, 0, helvR18L1_0x5A_BMP}, + {7, 4, 24, 2, -5, helvR18L1_0x5B_BMP}, + {7, 8, 19, 0, 0, helvR18L1_0x5C_BMP}, + {7, 4, 24, 1, -5, helvR18L1_0x5D_BMP}, + {12, 10, 9, 1, 10, helvR18L1_0x5E_BMP}, + {14, 14, 2, 0, -5, helvR18L1_0x5F_BMP}, + {7, 5, 4, 1, 15, helvR18L1_0x60_BMP}, + {13, 11, 14, 1, 0, helvR18L1_0x61_BMP}, + {14, 11, 19, 2, 0, helvR18L1_0x62_BMP}, + {12, 10, 14, 1, 0, helvR18L1_0x63_BMP}, + {14, 11, 19, 1, 0, helvR18L1_0x64_BMP}, + {13, 11, 14, 1, 0, helvR18L1_0x65_BMP}, + {8, 6, 19, 1, 0, helvR18L1_0x66_BMP}, + {14, 11, 19, 1, -5, helvR18L1_0x67_BMP}, + {13, 10, 19, 2, 0, helvR18L1_0x68_BMP}, + {6, 2, 19, 2, 0, helvR18L1_0x69_BMP}, + {6, 4, 24, 0, -5, helvR18L1_0x6A_BMP}, + {12, 10, 19, 2, 0, helvR18L1_0x6B_BMP}, + {6, 2, 19, 2, 0, helvR18L1_0x6C_BMP}, + {20, 16, 14, 2, 0, helvR18L1_0x6D_BMP}, + {14, 10, 14, 2, 0, helvR18L1_0x6E_BMP}, + {13, 11, 14, 1, 0, helvR18L1_0x6F_BMP}, + {14, 11, 19, 2, -5, helvR18L1_0x70_BMP}, + {14, 11, 19, 1, -5, helvR18L1_0x71_BMP}, + {9, 6, 14, 2, 0, helvR18L1_0x72_BMP}, + {12, 10, 14, 1, 0, helvR18L1_0x73_BMP}, + {8, 6, 18, 1, 0, helvR18L1_0x74_BMP}, + {14, 10, 14, 2, 0, helvR18L1_0x75_BMP}, + {13, 11, 14, 1, 0, helvR18L1_0x76_BMP}, + {18, 18, 14, 0, 0, helvR18L1_0x77_BMP}, + {12, 10, 14, 1, 0, helvR18L1_0x78_BMP}, + {13, 12, 19, 0, -5, helvR18L1_0x79_BMP}, + {12, 10, 14, 1, 0, helvR18L1_0x7A_BMP}, + {8, 6, 24, 1, -5, helvR18L1_0x7B_BMP}, + {6, 1, 24, 2, -5, helvR18L1_0x7C_BMP}, + {8, 6, 24, 1, -5, helvR18L1_0x7D_BMP}, + {14, 10, 4, 2, 5, helvR18L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {6, 1, 1, 0, 0, helvR18L1_0xA0_BMP}, + {6, 2, 19, 2, -5, helvR18L1_0xA1_BMP}, + {13, 10, 18, 1, -2, helvR18L1_0xA2_BMP}, + {14, 12, 18, 1, 0, helvR18L1_0xA3_BMP}, + {13, 11, 12, 1, 3, helvR18L1_0xA4_BMP}, + {14, 14, 18, 0, 0, helvR18L1_0xA5_BMP}, + {6, 2, 24, 2, -5, helvR18L1_0xA6_BMP}, + {13, 11, 24, 1, -5, helvR18L1_0xA7_BMP}, + {8, 6, 2, 1, 16, helvR18L1_0xA8_BMP}, + {19, 19, 19, 1, 0, helvR18L1_0xA9_BMP}, + {9, 7, 12, 1, 7, helvR18L1_0xAA_BMP}, + {14, 9, 8, 2, 3, helvR18L1_0xAB_BMP}, + {15, 13, 8, 1, 2, helvR18L1_0xAC_BMP}, + {8, 6, 2, 1, 6, helvR18L1_0xAD_BMP}, + {19, 18, 19, 1, 0, helvR18L1_0xAE_BMP}, + {8, 6, 2, 1, 16, helvR18L1_0xAF_BMP}, + {9, 8, 7, 0, 11, helvR18L1_0xB0_BMP}, + {14, 12, 13, 1, 0, helvR18L1_0xB1_BMP}, + {7, 7, 10, 0, 8, helvR18L1_0xB2_BMP}, + {7, 7, 10, 0, 8, helvR18L1_0xB3_BMP}, + {7, 5, 4, 1, 15, helvR18L1_0xB4_BMP}, + {14, 10, 19, 2, -5, helvR18L1_0xB5_BMP}, + {12, 10, 24, 1, -5, helvR18L1_0xB6_BMP}, + {6, 2, 3, 2, 6, helvR18L1_0xB7_BMP}, + {7, 5, 6, 1, -5, helvR18L1_0xB8_BMP}, + {7, 4, 10, 0, 8, helvR18L1_0xB9_BMP}, + {9, 7, 12, 1, 7, helvR18L1_0xBA_BMP}, + {14, 9, 8, 3, 3, helvR18L1_0xBB_BMP}, + {19, 18, 18, 1, 0, helvR18L1_0xBC_BMP}, + {19, 18, 18, 1, 0, helvR18L1_0xBD_BMP}, + {19, 19, 18, 0, 0, helvR18L1_0xBE_BMP}, + {12, 10, 19, 1, -5, helvR18L1_0xBF_BMP}, + {17, 15, 24, 1, 0, helvR18L1_0xC0_BMP}, + {17, 15, 24, 1, 0, helvR18L1_0xC1_BMP}, + {17, 15, 24, 1, 0, helvR18L1_0xC2_BMP}, + {17, 15, 23, 1, 0, helvR18L1_0xC3_BMP}, + {17, 15, 23, 1, 0, helvR18L1_0xC4_BMP}, + {17, 15, 24, 1, 0, helvR18L1_0xC5_BMP}, + {23, 21, 19, 1, 0, helvR18L1_0xC6_BMP}, + {18, 15, 24, 1, -5, helvR18L1_0xC7_BMP}, + {16, 12, 24, 2, 0, helvR18L1_0xC8_BMP}, + {16, 12, 24, 2, 0, helvR18L1_0xC9_BMP}, + {16, 12, 24, 2, 0, helvR18L1_0xCA_BMP}, + {16, 12, 23, 2, 0, helvR18L1_0xCB_BMP}, + {8, 5, 24, 1, 0, helvR18L1_0xCC_BMP}, + {8, 5, 24, 2, 0, helvR18L1_0xCD_BMP}, + {8, 8, 24, 0, 0, helvR18L1_0xCE_BMP}, + {8, 6, 23, 1, 0, helvR18L1_0xCF_BMP}, + {18, 18, 19, -1, 0, helvR18L1_0xD0_BMP}, + {18, 14, 23, 2, 0, helvR18L1_0xD1_BMP}, + {18, 16, 24, 1, 0, helvR18L1_0xD2_BMP}, + {18, 16, 24, 1, 0, helvR18L1_0xD3_BMP}, + {18, 16, 24, 1, 0, helvR18L1_0xD4_BMP}, + {18, 16, 23, 1, 0, helvR18L1_0xD5_BMP}, + {18, 16, 23, 1, 0, helvR18L1_0xD6_BMP}, + {14, 13, 12, 0, 1, helvR18L1_0xD7_BMP}, + {18, 18, 19, 0, 0, helvR18L1_0xD8_BMP}, + {18, 14, 24, 2, 0, helvR18L1_0xD9_BMP}, + {18, 14, 24, 2, 0, helvR18L1_0xDA_BMP}, + {18, 14, 24, 2, 0, helvR18L1_0xDB_BMP}, + {18, 14, 23, 2, 0, helvR18L1_0xDC_BMP}, + {16, 14, 24, 1, 0, helvR18L1_0xDD_BMP}, + {16, 13, 19, 2, 0, helvR18L1_0xDE_BMP}, + {15, 10, 19, 3, 0, helvR18L1_0xDF_BMP}, + {13, 11, 19, 1, 0, helvR18L1_0xE0_BMP}, + {13, 11, 19, 1, 0, helvR18L1_0xE1_BMP}, + {13, 11, 19, 1, 0, helvR18L1_0xE2_BMP}, + {13, 11, 18, 1, 0, helvR18L1_0xE3_BMP}, + {13, 11, 18, 1, 0, helvR18L1_0xE4_BMP}, + {13, 11, 19, 1, 0, helvR18L1_0xE5_BMP}, + {21, 19, 14, 1, 0, helvR18L1_0xE6_BMP}, + {12, 10, 19, 1, -5, helvR18L1_0xE7_BMP}, + {13, 11, 19, 1, 0, helvR18L1_0xE8_BMP}, + {13, 11, 19, 1, 0, helvR18L1_0xE9_BMP}, + {13, 11, 19, 1, 0, helvR18L1_0xEA_BMP}, + {13, 11, 18, 1, 0, helvR18L1_0xEB_BMP}, + {6, 5, 19, 0, 0, helvR18L1_0xEC_BMP}, + {6, 5, 19, 1, 0, helvR18L1_0xED_BMP}, + {6, 8, 19, -1, 0, helvR18L1_0xEE_BMP}, + {6, 6, 18, 0, 0, helvR18L1_0xEF_BMP}, + {13, 11, 19, 1, 0, helvR18L1_0xF0_BMP}, + {14, 10, 18, 2, 0, helvR18L1_0xF1_BMP}, + {13, 11, 19, 1, 0, helvR18L1_0xF2_BMP}, + {13, 11, 19, 1, 0, helvR18L1_0xF3_BMP}, + {13, 11, 19, 1, 0, helvR18L1_0xF4_BMP}, + {13, 11, 18, 1, 0, helvR18L1_0xF5_BMP}, + {13, 11, 18, 1, 0, helvR18L1_0xF6_BMP}, + {14, 12, 12, 1, 1, helvR18L1_0xF7_BMP}, + {13, 13, 14, 0, 0, helvR18L1_0xF8_BMP}, + {14, 10, 19, 2, 0, helvR18L1_0xF9_BMP}, + {14, 10, 19, 2, 0, helvR18L1_0xFA_BMP}, + {14, 10, 19, 2, 0, helvR18L1_0xFB_BMP}, + {14, 10, 18, 2, 0, helvR18L1_0xFC_BMP}, + {13, 12, 24, 0, -5, helvR18L1_0xFD_BMP}, + {14, 11, 24, 2, -5, helvR18L1_0xFE_BMP}, + {13, 12, 23, 0, -5, helvR18L1_0xFF_BMP} +}; + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontHelv18Normal_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontHelv18Normal_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontHelv18Normal_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontHelv18Normal_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontHelv18Normal_GetFontChar, + McuFontHelv18Normal_FBBy, + McuFontHelv18Normal_GetUnderlineBoxHeight(), + McuFontHelv18Normal_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv18Normal_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv18Normal_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv18Normal_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv18Normal_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontHelv18Normal. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv18Normal.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv18Normal.h new file mode 100644 index 0000000..96fac70 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv18Normal.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv18Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv18Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 18 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv18Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv18Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv18Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv18Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv18Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv18Normal_Deinit(void); +** Init - void McuFontHelv18Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv18Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv18Normal_module McuFontHelv18Normal module documentation +** @{ +*/ + + +#ifndef __McuFontHelv18Normal_H +#define __McuFontHelv18Normal_H + +/* MODULE McuFontHelv18Normal. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontHelv18Normalconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontHelv18Normal_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontHelv18Normal_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontHelv18Normal_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontHelv18Normal_GetLineSpaceHeight() \ + 3 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontHelv18Normal_GetUnderlineBoxHeight() \ + 5 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontHelv18Normal_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontHelv18Normal_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontHelv18Normal. */ + +#endif +/* ifndef __McuFontHelv18Normal_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv24Bold.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv24Bold.c new file mode 100644 index 0000000..765d590 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv24Bold.c @@ -0,0 +1,5519 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv24Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv24Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 24 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv24Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv24Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv24Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv24Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv24Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv24Bold_Deinit(void); +** Init - void McuFontHelv24Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv24Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv24Bold_module McuFontHelv24Bold module documentation +** @{ +*/ + +/* MODULE McuFontHelv24Bold. */ + +#include "McuFontHelv24Bold.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontHelv24Bold_FBBy 35 + +static const uint8_t helvB24L1_0x00_BMP[] = { + 0xAA, 0xAA, 0xA0, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x20, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x20, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x20, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x20, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x20, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x20, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x20, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x20, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x20, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x20, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x20, + 0x00, 0x00, 0x00, + 0xAA, 0xAA, 0xA0 +}; + +static const uint8_t helvB24L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t helvB24L1_0x21_BMP[] = { + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x00, + 0x00, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8 +}; + +static const uint8_t helvB24L1_0x22_BMP[] = { + 0xF1, 0xE0, + 0xF1, 0xE0, + 0xF1, 0xE0, + 0xF1, 0xE0, + 0xF1, 0xE0, + 0xF1, 0xE0, + 0xF1, 0xE0, + 0x60, 0xC0, + 0x60, 0xC0 +}; + +static const uint8_t helvB24L1_0x23_BMP[] = { + 0x03, 0xC7, 0x00, + 0x03, 0xC7, 0x00, + 0x03, 0x8F, 0x00, + 0x03, 0x8F, 0x00, + 0x07, 0x8F, 0x00, + 0x07, 0x8E, 0x00, + 0x07, 0x8E, 0x00, + 0x7F, 0xFF, 0xC0, + 0x7F, 0xFF, 0xC0, + 0x7F, 0xFF, 0xC0, + 0x7F, 0xFF, 0xC0, + 0x0F, 0x1C, 0x00, + 0x0E, 0x1C, 0x00, + 0x0E, 0x1C, 0x00, + 0x0E, 0x3C, 0x00, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0x1C, 0x78, 0x00, + 0x3C, 0x78, 0x00, + 0x3C, 0x70, 0x00, + 0x3C, 0x70, 0x00, + 0x38, 0xF0, 0x00, + 0x38, 0xF0, 0x00 +}; + +static const uint8_t helvB24L1_0x24_BMP[] = { + 0x01, 0x80, + 0x01, 0x80, + 0x0F, 0xF0, + 0x3F, 0xFC, + 0x7F, 0xFE, + 0xFD, 0xBE, + 0xF9, 0x9F, + 0xF1, 0x9F, + 0xF1, 0x8F, + 0xF9, 0x80, + 0xFF, 0x80, + 0x7F, 0xC0, + 0x3F, 0xF0, + 0x0F, 0xFC, + 0x01, 0xFE, + 0x01, 0xFF, + 0x01, 0x9F, + 0x01, 0x8F, + 0xF1, 0x8F, + 0xF1, 0x9F, + 0xF9, 0x9F, + 0x7F, 0xFE, + 0x7F, 0xFE, + 0x3F, 0xF8, + 0x07, 0xE0, + 0x01, 0x80, + 0x01, 0x80, + 0x01, 0x80 +}; + +static const uint8_t helvB24L1_0x25_BMP[] = { + 0x0E, 0x00, 0x30, 0x00, + 0x3F, 0x80, 0x70, 0x00, + 0x7F, 0xC0, 0x60, 0x00, + 0x71, 0xC0, 0xE0, 0x00, + 0xE0, 0xE0, 0xC0, 0x00, + 0xE0, 0xE1, 0xC0, 0x00, + 0xE0, 0xE3, 0x80, 0x00, + 0xE0, 0xE3, 0x80, 0x00, + 0x71, 0xC7, 0x00, 0x00, + 0x7F, 0xC6, 0x00, 0x00, + 0x3F, 0x8E, 0x00, 0x00, + 0x0E, 0x0C, 0x1C, 0x00, + 0x00, 0x1C, 0x7F, 0x00, + 0x00, 0x18, 0xFF, 0x80, + 0x00, 0x38, 0xE3, 0x80, + 0x00, 0x31, 0xC1, 0xC0, + 0x00, 0x71, 0xC1, 0xC0, + 0x00, 0x61, 0xC1, 0xC0, + 0x00, 0xE1, 0xC1, 0xC0, + 0x01, 0xC0, 0xE3, 0x80, + 0x01, 0xC0, 0xFF, 0x80, + 0x03, 0x80, 0x7F, 0x00, + 0x03, 0x00, 0x1C, 0x00 +}; + +static const uint8_t helvB24L1_0x26_BMP[] = { + 0x03, 0xE0, 0x00, + 0x0F, 0xF8, 0x00, + 0x1F, 0xFC, 0x00, + 0x1F, 0xFC, 0x00, + 0x1E, 0x3C, 0x00, + 0x3E, 0x3C, 0x00, + 0x3E, 0x3C, 0x00, + 0x1F, 0x3C, 0x00, + 0x1F, 0xF8, 0x00, + 0x0F, 0xF8, 0x00, + 0x0F, 0xF0, 0x00, + 0x0F, 0xE0, 0x00, + 0x3F, 0xF1, 0xE0, + 0x7F, 0xF1, 0xE0, + 0x7C, 0xF9, 0xC0, + 0xF8, 0xFF, 0xC0, + 0xF0, 0x7F, 0xC0, + 0xF0, 0x3F, 0x80, + 0xF0, 0x1F, 0x00, + 0xF8, 0x0F, 0x80, + 0xFC, 0x3F, 0xC0, + 0x7F, 0xFF, 0xE0, + 0x7F, 0xFB, 0xE0, + 0x1F, 0xF1, 0xF0, + 0x07, 0xC0, 0x00 +}; + +static const uint8_t helvB24L1_0x27_BMP[] = { + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0x60, + 0x60 +}; + +static const uint8_t helvB24L1_0x28_BMP[] = { + 0x07, + 0x0F, + 0x1E, + 0x1E, + 0x3C, + 0x3C, + 0x38, + 0x78, + 0x78, + 0x78, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF8, + 0x78, + 0x78, + 0x78, + 0x78, + 0x3C, + 0x3C, + 0x1C, + 0x1E, + 0x0E, + 0x0F, + 0x07 +}; + +static const uint8_t helvB24L1_0x29_BMP[] = { + 0xE0, + 0xF0, + 0x78, + 0x78, + 0x3C, + 0x3C, + 0x1C, + 0x1E, + 0x1E, + 0x1E, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x1F, + 0x1E, + 0x1E, + 0x1E, + 0x1C, + 0x3C, + 0x3C, + 0x38, + 0x78, + 0x70, + 0xF0, + 0xE0 +}; + +static const uint8_t helvB24L1_0x2A_BMP[] = { + 0x0C, 0x00, + 0x0C, 0x00, + 0x4C, 0x80, + 0xED, 0xC0, + 0xFF, 0xC0, + 0x7F, 0x80, + 0x1E, 0x00, + 0x3F, 0x00, + 0x7F, 0x80, + 0x73, 0x80, + 0x21, 0x00 +}; + +static const uint8_t helvB24L1_0x2B_BMP[] = { + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0 +}; + +static const uint8_t helvB24L1_0x2C_BMP[] = { + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0x18, + 0x18, + 0x38, + 0x70, + 0xE0, + 0x80 +}; + +static const uint8_t helvB24L1_0x2D_BMP[] = { + 0xFF, 0x80, + 0xFF, 0x80, + 0xFF, 0x80, + 0xFF, 0x80, + 0xFF, 0x80 +}; + +static const uint8_t helvB24L1_0x2E_BMP[] = { + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8 +}; + +static const uint8_t helvB24L1_0x2F_BMP[] = { + 0x03, + 0x03, + 0x03, + 0x03, + 0x06, + 0x06, + 0x06, + 0x0E, + 0x0C, + 0x0C, + 0x0C, + 0x1C, + 0x18, + 0x18, + 0x18, + 0x30, + 0x30, + 0x30, + 0x70, + 0x60, + 0x60, + 0x60, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvB24L1_0x30_BMP[] = { + 0x0F, 0xE0, + 0x1F, 0xF0, + 0x3F, 0xF8, + 0x7F, 0xFC, + 0x7C, 0x7C, + 0xF8, 0x3E, + 0xF8, 0x3E, + 0xF8, 0x3E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF8, 0x3E, + 0xF8, 0x3E, + 0xF8, 0x3E, + 0x7C, 0x7C, + 0x7F, 0xFC, + 0x3F, 0xF8, + 0x1F, 0xF0, + 0x0F, 0xE0 +}; + +static const uint8_t helvB24L1_0x31_BMP[] = { + 0x01, 0xC0, + 0x03, 0xC0, + 0x07, 0xC0, + 0x1F, 0xC0, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0 +}; + +static const uint8_t helvB24L1_0x32_BMP[] = { + 0x0F, 0xE0, + 0x3F, 0xF8, + 0x7F, 0xFC, + 0x7F, 0xFE, + 0xFC, 0x7E, + 0xF8, 0x3F, + 0xF8, 0x1F, + 0xF0, 0x1F, + 0xF0, 0x1F, + 0x00, 0x3F, + 0x00, 0x3E, + 0x00, 0x7E, + 0x00, 0xFC, + 0x01, 0xF8, + 0x07, 0xF0, + 0x0F, 0xE0, + 0x1F, 0x80, + 0x3F, 0x00, + 0x7E, 0x00, + 0xFC, 0x00, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF +}; + +static const uint8_t helvB24L1_0x33_BMP[] = { + 0x0F, 0xE0, + 0x3F, 0xF8, + 0x7F, 0xFC, + 0x7F, 0xFC, + 0xF8, 0x3E, + 0xF0, 0x3E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0x00, 0x3E, + 0x00, 0x7C, + 0x03, 0xF8, + 0x03, 0xF0, + 0x03, 0xFC, + 0x00, 0x7E, + 0x00, 0x3F, + 0x00, 0x1F, + 0xF0, 0x1F, + 0xF0, 0x1F, + 0xF0, 0x3F, + 0xF8, 0x3E, + 0x7F, 0xFE, + 0x7F, 0xFC, + 0x3F, 0xF8, + 0x0F, 0xE0 +}; + +static const uint8_t helvB24L1_0x34_BMP[] = { + 0x00, 0xF8, + 0x00, 0xF8, + 0x01, 0xF8, + 0x03, 0xF8, + 0x03, 0xF8, + 0x07, 0xF8, + 0x0F, 0x78, + 0x0E, 0x78, + 0x1E, 0x78, + 0x1C, 0x78, + 0x3C, 0x78, + 0x78, 0x78, + 0x70, 0x78, + 0xF0, 0x78, + 0xE0, 0x78, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0x00, 0x78, + 0x00, 0x78, + 0x00, 0x78, + 0x00, 0x78, + 0x00, 0x78 +}; + +static const uint8_t helvB24L1_0x35_BMP[] = { + 0x3F, 0xFC, + 0x3F, 0xFC, + 0x3F, 0xFC, + 0x3F, 0xFC, + 0x38, 0x00, + 0x78, 0x00, + 0x78, 0x00, + 0x78, 0x00, + 0x7B, 0xE0, + 0x7F, 0xF8, + 0x7F, 0xFC, + 0x7F, 0xFC, + 0x78, 0x7E, + 0x00, 0x3E, + 0x00, 0x3E, + 0x00, 0x1E, + 0x00, 0x1E, + 0xF0, 0x3E, + 0xF0, 0x3E, + 0xF8, 0x7C, + 0x7F, 0xFC, + 0x7F, 0xF8, + 0x3F, 0xF0, + 0x0F, 0xC0 +}; + +static const uint8_t helvB24L1_0x36_BMP[] = { + 0x07, 0xE0, + 0x1F, 0xF8, + 0x3F, 0xFC, + 0x3F, 0xFE, + 0x7C, 0x3E, + 0x78, 0x1E, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF3, 0xE0, + 0xF7, 0xF8, + 0xFF, 0xFC, + 0xFF, 0xFC, + 0xFC, 0x7E, + 0xF8, 0x3E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF8, 0x3E, + 0x7C, 0x7C, + 0x7F, 0xFC, + 0x3F, 0xF8, + 0x1F, 0xF0, + 0x07, 0xC0 +}; + +static const uint8_t helvB24L1_0x37_BMP[] = { + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0x00, 0x1E, + 0x00, 0x3E, + 0x00, 0x3C, + 0x00, 0x78, + 0x00, 0xF8, + 0x00, 0xF0, + 0x01, 0xF0, + 0x01, 0xE0, + 0x03, 0xE0, + 0x03, 0xC0, + 0x07, 0xC0, + 0x07, 0xC0, + 0x07, 0x80, + 0x0F, 0x80, + 0x0F, 0x80, + 0x0F, 0x80, + 0x1F, 0x00, + 0x1F, 0x00, + 0x1F, 0x00, + 0x1F, 0x00 +}; + +static const uint8_t helvB24L1_0x38_BMP[] = { + 0x07, 0xF0, 0x00, + 0x1F, 0xFC, 0x00, + 0x3F, 0xFE, 0x00, + 0x3E, 0x3E, 0x00, + 0x7C, 0x1F, 0x00, + 0x78, 0x0F, 0x00, + 0x78, 0x0F, 0x00, + 0x78, 0x0F, 0x00, + 0x7C, 0x1F, 0x00, + 0x3E, 0x3E, 0x00, + 0x1F, 0xFC, 0x00, + 0x1F, 0xFC, 0x00, + 0x3F, 0xFE, 0x00, + 0x7C, 0x1F, 0x00, + 0xF8, 0x0F, 0x80, + 0xF0, 0x07, 0x80, + 0xF0, 0x07, 0x80, + 0xF0, 0x07, 0x80, + 0xF8, 0x0F, 0x80, + 0x7E, 0x3F, 0x00, + 0x7F, 0xFE, 0x00, + 0x3F, 0xFE, 0x00, + 0x1F, 0xFC, 0x00, + 0x07, 0xF0, 0x00 +}; + +static const uint8_t helvB24L1_0x39_BMP[] = { + 0x07, 0xC0, + 0x1F, 0xF0, + 0x3F, 0xF8, + 0x7F, 0xFC, + 0x7C, 0x7C, + 0xF8, 0x3E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF8, 0x3E, + 0xFC, 0x7E, + 0x7F, 0xFE, + 0x7F, 0xFE, + 0x3F, 0xDE, + 0x07, 0x9E, + 0x00, 0x1E, + 0x00, 0x1E, + 0xF0, 0x3C, + 0xF8, 0x7C, + 0x7F, 0xF8, + 0x7F, 0xF8, + 0x1F, 0xF0, + 0x07, 0xC0 +}; + +static const uint8_t helvB24L1_0x3A_BMP[] = { + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8 +}; + +static const uint8_t helvB24L1_0x3B_BMP[] = { + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0x18, + 0x18, + 0x38, + 0x70, + 0xE0, + 0x80 +}; + +static const uint8_t helvB24L1_0x3C_BMP[] = { + 0x00, 0x03, + 0x00, 0x1F, + 0x00, 0x7F, + 0x03, 0xFF, + 0x0F, 0xFE, + 0x7F, 0xF8, + 0xFF, 0xC0, + 0xFE, 0x00, + 0xFE, 0x00, + 0xFF, 0xC0, + 0x7F, 0xF0, + 0x0F, 0xFE, + 0x03, 0xFF, + 0x00, 0x7F, + 0x00, 0x1F, + 0x00, 0x03 +}; + +static const uint8_t helvB24L1_0x3D_BMP[] = { + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xFF, 0xFE +}; + +static const uint8_t helvB24L1_0x3E_BMP[] = { + 0xC0, 0x00, + 0xF0, 0x00, + 0xFE, 0x00, + 0xFF, 0xC0, + 0x7F, 0xF0, + 0x1F, 0xFE, + 0x03, 0xFF, + 0x00, 0x7F, + 0x00, 0x7F, + 0x03, 0xFF, + 0x1F, 0xFE, + 0x7F, 0xF0, + 0xFF, 0xC0, + 0xFE, 0x00, + 0xF0, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t helvB24L1_0x3F_BMP[] = { + 0x0F, 0xE0, + 0x3F, 0xF8, + 0x7F, 0xFC, + 0x7F, 0xFE, + 0xFC, 0x7E, + 0xF8, 0x3F, + 0xF8, 0x1F, + 0xF0, 0x1F, + 0xF0, 0x1F, + 0x00, 0x3F, + 0x00, 0x7E, + 0x00, 0xFE, + 0x01, 0xFC, + 0x01, 0xF8, + 0x03, 0xE0, + 0x03, 0xC0, + 0x07, 0xC0, + 0x07, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0xC0, + 0x07, 0xC0, + 0x07, 0xC0, + 0x07, 0xC0, + 0x07, 0xC0 +}; + +static const uint8_t helvB24L1_0x40_BMP[] = { + 0x00, 0x0F, 0xE0, 0x00, + 0x00, 0x7F, 0xFC, 0x00, + 0x01, 0xFF, 0xFE, 0x00, + 0x03, 0xF0, 0x3F, 0x80, + 0x07, 0xC0, 0x07, 0xC0, + 0x0F, 0x00, 0x03, 0xC0, + 0x1E, 0x00, 0x01, 0xE0, + 0x1C, 0x00, 0x00, 0xF0, + 0x3C, 0x07, 0xDC, 0x70, + 0x38, 0x1F, 0xFC, 0x70, + 0x70, 0x3C, 0xFC, 0x38, + 0x70, 0x78, 0x78, 0x38, + 0xF0, 0xF0, 0x38, 0x38, + 0xE0, 0xE0, 0x38, 0x38, + 0xE1, 0xE0, 0x38, 0x38, + 0xE1, 0xC0, 0x70, 0x78, + 0xE1, 0xC0, 0x70, 0x70, + 0xE1, 0xC0, 0x70, 0x70, + 0xE1, 0xE0, 0xF0, 0xE0, + 0xF1, 0xE1, 0xF1, 0xE0, + 0x70, 0xFF, 0xFF, 0xC0, + 0x78, 0x7F, 0x3F, 0x80, + 0x38, 0x3E, 0x1E, 0x00, + 0x3C, 0x00, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x00, + 0x0F, 0x80, 0x00, 0x00, + 0x0F, 0xF0, 0x3C, 0x00, + 0x03, 0xFF, 0xFC, 0x00, + 0x01, 0xFF, 0xFC, 0x00, + 0x00, 0x7F, 0xE0, 0x00 +}; + +static const uint8_t helvB24L1_0x41_BMP[] = { + 0x00, 0xFC, 0x00, + 0x00, 0xFC, 0x00, + 0x01, 0xFE, 0x00, + 0x01, 0xFE, 0x00, + 0x01, 0xFE, 0x00, + 0x03, 0xFF, 0x00, + 0x03, 0xFF, 0x00, + 0x03, 0xFF, 0x00, + 0x07, 0xCF, 0x80, + 0x07, 0xCF, 0x80, + 0x07, 0xCF, 0x80, + 0x0F, 0x87, 0x80, + 0x0F, 0x87, 0xC0, + 0x0F, 0x87, 0xC0, + 0x1F, 0x03, 0xC0, + 0x1F, 0x03, 0xE0, + 0x1F, 0xFF, 0xE0, + 0x1F, 0xFF, 0xE0, + 0x3F, 0xFF, 0xF0, + 0x3F, 0xFF, 0xF0, + 0x3E, 0x01, 0xF0, + 0x7C, 0x00, 0xF8, + 0x7C, 0x00, 0xF8, + 0xFC, 0x00, 0xFC, + 0xF8, 0x00, 0x7C +}; + +static const uint8_t helvB24L1_0x42_BMP[] = { + 0xFF, 0xFC, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xF8, 0x0F, 0xC0, + 0xF8, 0x07, 0xC0, + 0xF8, 0x07, 0xC0, + 0xF8, 0x07, 0xC0, + 0xF8, 0x07, 0xC0, + 0xF8, 0x0F, 0x80, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0xC0, + 0xF8, 0x07, 0xC0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x07, 0xE0, + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFE, 0x00 +}; + +static const uint8_t helvB24L1_0x43_BMP[] = { + 0x01, 0xFE, 0x00, + 0x07, 0xFF, 0x80, + 0x0F, 0xFF, 0xC0, + 0x1F, 0xFF, 0xE0, + 0x3F, 0x87, 0xF0, + 0x3E, 0x01, 0xF0, + 0x7C, 0x01, 0xF8, + 0x7C, 0x00, 0xF8, + 0x7C, 0x00, 0xF8, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0x7C, 0x00, 0xF8, + 0x7C, 0x00, 0xF8, + 0x7E, 0x01, 0xF8, + 0x3E, 0x01, 0xF0, + 0x3F, 0x87, 0xF0, + 0x1F, 0xFF, 0xE0, + 0x0F, 0xFF, 0xC0, + 0x07, 0xFF, 0x80, + 0x01, 0xFE, 0x00 +}; + +static const uint8_t helvB24L1_0x44_BMP[] = { + 0xFF, 0xF8, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0xC0, + 0xF8, 0x0F, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xF0, + 0xF8, 0x01, 0xF0, + 0xF8, 0x01, 0xF8, + 0xF8, 0x00, 0xF8, + 0xF8, 0x00, 0xF8, + 0xF8, 0x00, 0xF8, + 0xF8, 0x00, 0xF8, + 0xF8, 0x00, 0xF8, + 0xF8, 0x00, 0xF8, + 0xF8, 0x00, 0xF8, + 0xF8, 0x01, 0xF8, + 0xF8, 0x01, 0xF0, + 0xF8, 0x03, 0xF0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x0F, 0xE0, + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x00, + 0xFF, 0xF8, 0x00 +}; + +static const uint8_t helvB24L1_0x45_BMP[] = { + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xC0 +}; + +static const uint8_t helvB24L1_0x46_BMP[] = { + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00 +}; + +static const uint8_t helvB24L1_0x47_BMP[] = { + 0x00, 0xFF, 0x00, + 0x03, 0xFF, 0xC0, + 0x0F, 0xFF, 0xE0, + 0x1F, 0xFF, 0xF0, + 0x1F, 0xC3, 0xF8, + 0x3F, 0x00, 0xF8, + 0x7E, 0x00, 0x7C, + 0x7C, 0x00, 0x7C, + 0xFC, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x0F, 0xFC, + 0xF8, 0x0F, 0xFC, + 0xF8, 0x0F, 0xFC, + 0xF8, 0x0F, 0xFC, + 0xFC, 0x00, 0x7C, + 0x7C, 0x00, 0x7C, + 0x7E, 0x00, 0x7C, + 0x7E, 0x00, 0xFC, + 0x3F, 0x83, 0xFC, + 0x3F, 0xFF, 0xFC, + 0x1F, 0xFF, 0xDC, + 0x07, 0xFF, 0x9C, + 0x03, 0xFE, 0x1C +}; + +static const uint8_t helvB24L1_0x48_BMP[] = { + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xFF, 0xFF, 0xE0, + 0xFF, 0xFF, 0xE0, + 0xFF, 0xFF, 0xE0, + 0xFF, 0xFF, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0 +}; + +static const uint8_t helvB24L1_0x49_BMP[] = { + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8 +}; + +static const uint8_t helvB24L1_0x4A_BMP[] = { + 0x00, 0x3E, + 0x00, 0x3E, + 0x00, 0x3E, + 0x00, 0x3E, + 0x00, 0x3E, + 0x00, 0x3E, + 0x00, 0x3E, + 0x00, 0x3E, + 0x00, 0x3E, + 0x00, 0x3E, + 0x00, 0x3E, + 0x00, 0x3E, + 0x00, 0x3E, + 0x00, 0x3E, + 0x00, 0x3E, + 0xF8, 0x3E, + 0xF8, 0x3E, + 0xF8, 0x3E, + 0xF8, 0x3E, + 0xF8, 0x3E, + 0xFC, 0x7E, + 0xFF, 0xFC, + 0x7F, 0xFC, + 0x3F, 0xF8, + 0x0F, 0xE0 +}; + +static const uint8_t helvB24L1_0x4B_BMP[] = { + 0xF8, 0x07, 0xE0, + 0xF8, 0x07, 0xE0, + 0xF8, 0x0F, 0xC0, + 0xF8, 0x1F, 0x80, + 0xF8, 0x3F, 0x00, + 0xF8, 0x7E, 0x00, + 0xF8, 0xFC, 0x00, + 0xF8, 0xF8, 0x00, + 0xF9, 0xF8, 0x00, + 0xFB, 0xF0, 0x00, + 0xFF, 0xE0, 0x00, + 0xFF, 0xE0, 0x00, + 0xFF, 0xF0, 0x00, + 0xFF, 0xF0, 0x00, + 0xFF, 0xF8, 0x00, + 0xFC, 0xFC, 0x00, + 0xF8, 0x7E, 0x00, + 0xF8, 0x7E, 0x00, + 0xF8, 0x3F, 0x00, + 0xF8, 0x1F, 0x80, + 0xF8, 0x0F, 0x80, + 0xF8, 0x0F, 0xC0, + 0xF8, 0x07, 0xE0, + 0xF8, 0x03, 0xF0, + 0xF8, 0x03, 0xF0 +}; + +static const uint8_t helvB24L1_0x4C_BMP[] = { + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF +}; + +static const uint8_t helvB24L1_0x4D_BMP[] = { + 0xFE, 0x00, 0xFE, + 0xFE, 0x00, 0xFE, + 0xFF, 0x01, 0xFE, + 0xFF, 0x01, 0xFE, + 0xFF, 0x01, 0xFE, + 0xFF, 0x01, 0xFE, + 0xFF, 0x83, 0xFE, + 0xFF, 0x83, 0xFE, + 0xFB, 0x83, 0xBE, + 0xFB, 0x83, 0xBE, + 0xFB, 0xC7, 0xBE, + 0xFB, 0xC7, 0xBE, + 0xFB, 0xC7, 0xBE, + 0xF9, 0xC7, 0x3E, + 0xF9, 0xEF, 0x3E, + 0xF9, 0xEF, 0x3E, + 0xF9, 0xEF, 0x3E, + 0xF9, 0xEF, 0x3E, + 0xF8, 0xEE, 0x3E, + 0xF8, 0xFE, 0x3E, + 0xF8, 0xFE, 0x3E, + 0xF8, 0xFE, 0x3E, + 0xF8, 0x7C, 0x3E, + 0xF8, 0x7C, 0x3E, + 0xF8, 0x7C, 0x3E +}; + +static const uint8_t helvB24L1_0x4E_BMP[] = { + 0xF8, 0x03, 0xE0, + 0xFC, 0x03, 0xE0, + 0xFC, 0x03, 0xE0, + 0xFE, 0x03, 0xE0, + 0xFE, 0x03, 0xE0, + 0xFF, 0x03, 0xE0, + 0xFF, 0x03, 0xE0, + 0xFF, 0x83, 0xE0, + 0xFF, 0xC3, 0xE0, + 0xFB, 0xC3, 0xE0, + 0xFB, 0xE3, 0xE0, + 0xF9, 0xE3, 0xE0, + 0xF9, 0xF3, 0xE0, + 0xF8, 0xF3, 0xE0, + 0xF8, 0xFB, 0xE0, + 0xF8, 0x7B, 0xE0, + 0xF8, 0x3F, 0xE0, + 0xF8, 0x3F, 0xE0, + 0xF8, 0x1F, 0xE0, + 0xF8, 0x1F, 0xE0, + 0xF8, 0x0F, 0xE0, + 0xF8, 0x0F, 0xE0, + 0xF8, 0x07, 0xE0, + 0xF8, 0x07, 0xE0, + 0xF8, 0x03, 0xE0 +}; + +static const uint8_t helvB24L1_0x4F_BMP[] = { + 0x01, 0xFF, 0x00, + 0x07, 0xFF, 0xC0, + 0x0F, 0xFF, 0xE0, + 0x1F, 0xFF, 0xF0, + 0x3F, 0xC7, 0xF8, + 0x3F, 0x01, 0xF8, + 0x7E, 0x00, 0xFC, + 0x7C, 0x00, 0x7C, + 0x7C, 0x00, 0x7C, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0x7C, 0x00, 0x7C, + 0x7C, 0x00, 0x7C, + 0x7E, 0x00, 0xFC, + 0x3F, 0x01, 0xF8, + 0x3F, 0xC7, 0xF8, + 0x1F, 0xFF, 0xF0, + 0x0F, 0xFF, 0xE0, + 0x07, 0xFF, 0xC0, + 0x01, 0xFF, 0x00 +}; + +static const uint8_t helvB24L1_0x50_BMP[] = { + 0xFF, 0xF8, 0x00, + 0xFF, 0xFE, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x80, + 0xF8, 0x1F, 0x80, + 0xF8, 0x0F, 0xC0, + 0xF8, 0x07, 0xC0, + 0xF8, 0x07, 0xC0, + 0xF8, 0x07, 0xC0, + 0xF8, 0x07, 0xC0, + 0xF8, 0x0F, 0xC0, + 0xF8, 0x1F, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFC, 0x00, + 0xFF, 0xF0, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00 +}; + +static const uint8_t helvB24L1_0x51_BMP[] = { + 0x01, 0xFF, 0x00, + 0x07, 0xFF, 0xC0, + 0x0F, 0xFF, 0xE0, + 0x1F, 0xFF, 0xF0, + 0x3F, 0xC7, 0xF8, + 0x3F, 0x01, 0xF8, + 0x7E, 0x00, 0xFC, + 0x7C, 0x00, 0x7C, + 0xFC, 0x00, 0x7E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x02, 0x3E, + 0xFC, 0x07, 0x3E, + 0x7C, 0x0F, 0xBC, + 0x7E, 0x0F, 0xFC, + 0x3F, 0x07, 0xF8, + 0x3F, 0xC3, 0xF0, + 0x1F, 0xFF, 0xF8, + 0x0F, 0xFF, 0xFC, + 0x07, 0xFF, 0xFE, + 0x01, 0xFF, 0x3C, + 0x00, 0x00, 0x18 +}; + +static const uint8_t helvB24L1_0x52_BMP[] = { + 0xFF, 0xFE, 0x00, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xC0, + 0xF8, 0x07, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x07, 0xC0, + 0xF8, 0x0F, 0xC0, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x80, + 0xF8, 0x0F, 0xC0, + 0xF8, 0x07, 0xC0, + 0xF8, 0x07, 0xC0, + 0xF8, 0x07, 0xC0, + 0xF8, 0x07, 0xC0, + 0xF8, 0x07, 0xC0, + 0xF8, 0x07, 0xC0, + 0xF8, 0x07, 0xC0, + 0xF8, 0x07, 0xE0, + 0xF8, 0x03, 0xE0 +}; + +static const uint8_t helvB24L1_0x53_BMP[] = { + 0x03, 0xF8, 0x00, + 0x0F, 0xFE, 0x00, + 0x1F, 0xFF, 0x00, + 0x3F, 0xFF, 0x80, + 0x3E, 0x1F, 0x80, + 0x7C, 0x07, 0xC0, + 0x78, 0x07, 0xC0, + 0x78, 0x03, 0xC0, + 0x7C, 0x00, 0x00, + 0x7F, 0x00, 0x00, + 0x3F, 0xF0, 0x00, + 0x3F, 0xFE, 0x00, + 0x1F, 0xFF, 0x80, + 0x03, 0xFF, 0xC0, + 0x00, 0x3F, 0xC0, + 0x00, 0x07, 0xE0, + 0x00, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0x7C, 0x03, 0xE0, + 0x7E, 0x0F, 0xC0, + 0x3F, 0xFF, 0xC0, + 0x1F, 0xFF, 0x80, + 0x0F, 0xFF, 0x00, + 0x03, 0xF8, 0x00 +}; + +static const uint8_t helvB24L1_0x54_BMP[] = { + 0xFF, 0xFF, 0xE0, + 0xFF, 0xFF, 0xE0, + 0xFF, 0xFF, 0xE0, + 0xFF, 0xFF, 0xE0, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00 +}; + +static const uint8_t helvB24L1_0x55_BMP[] = { + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xFC, 0x07, 0xE0, + 0x7F, 0x1F, 0xC0, + 0x7F, 0xFF, 0xC0, + 0x3F, 0xFF, 0x80, + 0x1F, 0xFF, 0x00, + 0x07, 0xFC, 0x00 +}; + +static const uint8_t helvB24L1_0x56_BMP[] = { + 0xF8, 0x01, 0xF0, + 0xF8, 0x01, 0xF0, + 0x7C, 0x03, 0xE0, + 0x7C, 0x03, 0xE0, + 0x7C, 0x03, 0xE0, + 0x3C, 0x03, 0xC0, + 0x3E, 0x07, 0xC0, + 0x3E, 0x07, 0xC0, + 0x1E, 0x07, 0x80, + 0x1F, 0x0F, 0x80, + 0x1F, 0x0F, 0x80, + 0x0F, 0x0F, 0x00, + 0x0F, 0x0F, 0x00, + 0x0F, 0x0F, 0x00, + 0x07, 0x9E, 0x00, + 0x07, 0x9E, 0x00, + 0x07, 0x9E, 0x00, + 0x07, 0xFE, 0x00, + 0x03, 0xFC, 0x00, + 0x03, 0xFC, 0x00, + 0x03, 0xFC, 0x00, + 0x01, 0xF8, 0x00, + 0x01, 0xF8, 0x00, + 0x01, 0xF8, 0x00, + 0x00, 0xF0, 0x00 +}; + +static const uint8_t helvB24L1_0x57_BMP[] = { + 0xF8, 0x1F, 0x81, 0xF8, + 0xF8, 0x1F, 0x81, 0xF8, + 0x78, 0x1F, 0x81, 0xF0, + 0x78, 0x1F, 0x81, 0xF0, + 0x78, 0x1F, 0x81, 0xF0, + 0x7C, 0x3F, 0xC3, 0xE0, + 0x7C, 0x3F, 0xC3, 0xE0, + 0x7C, 0x3F, 0xC3, 0xE0, + 0x3C, 0x3F, 0xC3, 0xE0, + 0x3C, 0x39, 0xC3, 0xC0, + 0x3E, 0x79, 0xE3, 0xC0, + 0x3E, 0x79, 0xE7, 0xC0, + 0x1E, 0x79, 0xE7, 0xC0, + 0x1E, 0x79, 0xE7, 0x80, + 0x1E, 0x70, 0xE7, 0x80, + 0x1E, 0x70, 0xE7, 0x80, + 0x0F, 0xF0, 0xFF, 0x00, + 0x0F, 0xF0, 0xFF, 0x00, + 0x0F, 0xF0, 0xFF, 0x00, + 0x0F, 0xE0, 0x7F, 0x00, + 0x07, 0xE0, 0x7E, 0x00, + 0x07, 0xE0, 0x7E, 0x00, + 0x07, 0xE0, 0x7E, 0x00, + 0x03, 0xC0, 0x3C, 0x00, + 0x03, 0xC0, 0x3C, 0x00 +}; + +static const uint8_t helvB24L1_0x58_BMP[] = { + 0xFC, 0x03, 0xE0, + 0x7E, 0x07, 0xE0, + 0x7E, 0x07, 0xC0, + 0x3F, 0x0F, 0xC0, + 0x1F, 0x0F, 0x80, + 0x1F, 0x9F, 0x00, + 0x0F, 0x9F, 0x00, + 0x0F, 0xBE, 0x00, + 0x07, 0xFE, 0x00, + 0x07, 0xFC, 0x00, + 0x03, 0xFC, 0x00, + 0x03, 0xF8, 0x00, + 0x01, 0xF8, 0x00, + 0x03, 0xF8, 0x00, + 0x03, 0xFC, 0x00, + 0x07, 0xFC, 0x00, + 0x07, 0xFE, 0x00, + 0x0F, 0xBF, 0x00, + 0x1F, 0x9F, 0x00, + 0x1F, 0x1F, 0x80, + 0x3F, 0x0F, 0x80, + 0x3E, 0x0F, 0xC0, + 0x7E, 0x07, 0xC0, + 0xFC, 0x07, 0xE0, + 0xFC, 0x03, 0xF0 +}; + +static const uint8_t helvB24L1_0x59_BMP[] = { + 0xFC, 0x03, 0xF0, + 0xFC, 0x03, 0xE0, + 0x7E, 0x07, 0xE0, + 0x3E, 0x07, 0xC0, + 0x3F, 0x0F, 0xC0, + 0x3F, 0x0F, 0x80, + 0x1F, 0x0F, 0x80, + 0x1F, 0x9F, 0x00, + 0x0F, 0x9F, 0x00, + 0x0F, 0xFE, 0x00, + 0x07, 0xFE, 0x00, + 0x07, 0xFC, 0x00, + 0x03, 0xFC, 0x00, + 0x03, 0xF8, 0x00, + 0x03, 0xF8, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00 +}; + +static const uint8_t helvB24L1_0x5A_BMP[] = { + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0x00, 0x0F, 0x80, + 0x00, 0x1F, 0x80, + 0x00, 0x3F, 0x00, + 0x00, 0x7E, 0x00, + 0x00, 0x7C, 0x00, + 0x00, 0xFC, 0x00, + 0x01, 0xF8, 0x00, + 0x03, 0xF0, 0x00, + 0x03, 0xF0, 0x00, + 0x07, 0xE0, 0x00, + 0x0F, 0xC0, 0x00, + 0x0F, 0x80, 0x00, + 0x1F, 0x80, 0x00, + 0x3F, 0x00, 0x00, + 0x7E, 0x00, 0x00, + 0x7E, 0x00, 0x00, + 0xFC, 0x00, 0x00, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80 +}; + +static const uint8_t helvB24L1_0x5B_BMP[] = { + 0xFF, + 0xFF, + 0xFF, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xFF, + 0xFF, + 0xFF +}; + +static const uint8_t helvB24L1_0x5C_BMP[] = { + 0xC0, 0x00, + 0xC0, 0x00, + 0xE0, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0x70, 0x00, + 0x70, 0x00, + 0x30, 0x00, + 0x38, 0x00, + 0x38, 0x00, + 0x18, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x06, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x03, 0x00, + 0x03, 0x80, + 0x03, 0x80, + 0x01, 0x80, + 0x01, 0x80 +}; + +static const uint8_t helvB24L1_0x5D_BMP[] = { + 0xFF, + 0xFF, + 0xFF, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0x0F, + 0xFF, + 0xFF, + 0xFF +}; + +static const uint8_t helvB24L1_0x5E_BMP[] = { + 0x07, 0x80, + 0x0F, 0xC0, + 0x0F, 0xC0, + 0x0F, 0xC0, + 0x1F, 0xE0, + 0x1F, 0xE0, + 0x3C, 0xF0, + 0x3C, 0xF0, + 0x38, 0x70, + 0x78, 0x78, + 0x78, 0x78, + 0x70, 0x3C, + 0xF0, 0x3C, + 0xF0, 0x3C +}; + +static const uint8_t helvB24L1_0x5F_BMP[] = { + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xC0 +}; + +static const uint8_t helvB24L1_0x60_BMP[] = { + 0xE0, + 0xF0, + 0x70, + 0x78, + 0x38 +}; + +static const uint8_t helvB24L1_0x61_BMP[] = { + 0x0F, 0xF0, + 0x3F, 0xFC, + 0x7F, 0xFC, + 0x7C, 0x3E, + 0xF8, 0x1E, + 0xF8, 0x1E, + 0x00, 0xFE, + 0x0F, 0xFE, + 0x3F, 0xFE, + 0x7F, 0x1E, + 0xF8, 0x1E, + 0xF8, 0x1E, + 0xF0, 0x3E, + 0xF8, 0x7E, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0x7F, 0xDE, + 0x3F, 0x1E +}; + +static const uint8_t helvB24L1_0x62_BMP[] = { + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF3, 0xF0, + 0xF7, 0xFC, + 0xFF, 0xFC, + 0xFF, 0xFE, + 0xFC, 0x3E, + 0xF8, 0x1F, + 0xF0, 0x1F, + 0xF0, 0x0F, + 0xF0, 0x0F, + 0xF0, 0x0F, + 0xF0, 0x0F, + 0xF0, 0x1F, + 0xF0, 0x1F, + 0xF8, 0x3E, + 0xFF, 0xFE, + 0xFF, 0xFC, + 0xF7, 0xF8, + 0xF1, 0xF0 +}; + +static const uint8_t helvB24L1_0x63_BMP[] = { + 0x07, 0xE0, + 0x1F, 0xF8, + 0x3F, 0xFC, + 0x3F, 0xFC, + 0x7C, 0x3E, + 0x78, 0x3E, + 0xF0, 0x1E, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x1E, + 0xF8, 0x1E, + 0x7C, 0x3E, + 0x7F, 0xFC, + 0x3F, 0xF8, + 0x1F, 0xF8, + 0x07, 0xE0 +}; + +static const uint8_t helvB24L1_0x64_BMP[] = { + 0x00, 0x0F, + 0x00, 0x0F, + 0x00, 0x0F, + 0x00, 0x0F, + 0x00, 0x0F, + 0x00, 0x0F, + 0x00, 0x0F, + 0x0F, 0xCF, + 0x1F, 0xEF, + 0x3F, 0xFF, + 0x7F, 0xFF, + 0x7C, 0x3F, + 0xF8, 0x1F, + 0xF0, 0x0F, + 0xF0, 0x0F, + 0xF0, 0x0F, + 0xF0, 0x0F, + 0xF0, 0x0F, + 0xF0, 0x0F, + 0xF8, 0x1F, + 0x7C, 0x3F, + 0x7F, 0xFF, + 0x3F, 0xEF, + 0x1F, 0xEF, + 0x0F, 0x8F +}; + +static const uint8_t helvB24L1_0x65_BMP[] = { + 0x07, 0xE0, + 0x1F, 0xF8, + 0x3F, 0xFC, + 0x7F, 0xFE, + 0x7C, 0x3E, + 0xF8, 0x1F, + 0xF0, 0x1F, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF8, 0x1E, + 0x7C, 0x3E, + 0x7F, 0xFC, + 0x3F, 0xFC, + 0x1F, 0xF0, + 0x07, 0xC0 +}; + +static const uint8_t helvB24L1_0x66_BMP[] = { + 0x07, 0xC0, + 0x0F, 0xC0, + 0x1F, 0xC0, + 0x1F, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t helvB24L1_0x67_BMP[] = { + 0x0F, 0xCF, + 0x1F, 0xEF, + 0x3F, 0xFF, + 0x7F, 0xFF, + 0x7C, 0x3F, + 0xF8, 0x1F, + 0xF8, 0x1F, + 0xF0, 0x0F, + 0xF0, 0x0F, + 0xF0, 0x0F, + 0xF0, 0x0F, + 0xF8, 0x1F, + 0xF8, 0x1F, + 0x7C, 0x3F, + 0x7F, 0xFF, + 0x3F, 0xFF, + 0x1F, 0xEF, + 0x0F, 0xCF, + 0x00, 0x0F, + 0xF8, 0x1F, + 0xF8, 0x1F, + 0x7E, 0x7E, + 0x7F, 0xFE, + 0x3F, 0xFC, + 0x0F, 0xF0 +}; + +static const uint8_t helvB24L1_0x68_BMP[] = { + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF1, 0xE0, + 0xF7, 0xF8, + 0xFF, 0xFC, + 0xFF, 0xFC, + 0xFC, 0x3E, + 0xF8, 0x1E, + 0xF8, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E +}; + +static const uint8_t helvB24L1_0x69_BMP[] = { + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0x00, + 0x00, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0 +}; + +static const uint8_t helvB24L1_0x6A_BMP[] = { + 0x3C, + 0x3C, + 0x3C, + 0x3C, + 0x00, + 0x00, + 0x3C, + 0x3C, + 0x3C, + 0x3C, + 0x3C, + 0x3C, + 0x3C, + 0x3C, + 0x3C, + 0x3C, + 0x3C, + 0x3C, + 0x3C, + 0x3C, + 0x3C, + 0x3C, + 0x3C, + 0x3C, + 0x3C, + 0x3C, + 0x3C, + 0x3C, + 0xFC, + 0xFC, + 0xF8, + 0xF8 +}; + +static const uint8_t helvB24L1_0x6B_BMP[] = { + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x3E, + 0xF0, 0x7C, + 0xF0, 0xF8, + 0xF1, 0xF0, + 0xF3, 0xE0, + 0xF7, 0xC0, + 0xFF, 0x80, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xFF, 0xE0, + 0xFF, 0xE0, + 0xF9, 0xF0, + 0xF1, 0xF0, + 0xF0, 0xF8, + 0xF0, 0x78, + 0xF0, 0x7C, + 0xF0, 0x3E, + 0xF0, 0x3E +}; + +static const uint8_t helvB24L1_0x6C_BMP[] = { + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0 +}; + +static const uint8_t helvB24L1_0x6D_BMP[] = { + 0xF1, 0xE0, 0xF8, + 0xF7, 0xFB, 0xFE, + 0xFF, 0xFF, 0xFE, + 0xFF, 0xFF, 0xFF, + 0xFC, 0x7F, 0x1F, + 0xF8, 0x3E, 0x0F, + 0xF0, 0x3C, 0x0F, + 0xF0, 0x3C, 0x0F, + 0xF0, 0x3C, 0x0F, + 0xF0, 0x3C, 0x0F, + 0xF0, 0x3C, 0x0F, + 0xF0, 0x3C, 0x0F, + 0xF0, 0x3C, 0x0F, + 0xF0, 0x3C, 0x0F, + 0xF0, 0x3C, 0x0F, + 0xF0, 0x3C, 0x0F, + 0xF0, 0x3C, 0x0F, + 0xF0, 0x3C, 0x0F +}; + +static const uint8_t helvB24L1_0x6E_BMP[] = { + 0xF1, 0xF0, + 0xF7, 0xFC, + 0xFF, 0xFC, + 0xFF, 0xFE, + 0xFC, 0x3E, + 0xF8, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E +}; + +static const uint8_t helvB24L1_0x6F_BMP[] = { + 0x07, 0xF0, 0x00, + 0x1F, 0xFC, 0x00, + 0x3F, 0xFE, 0x00, + 0x7F, 0xFF, 0x00, + 0x7C, 0x1F, 0x00, + 0xF8, 0x0F, 0x80, + 0xF8, 0x0F, 0x80, + 0xF0, 0x07, 0x80, + 0xF0, 0x07, 0x80, + 0xF0, 0x07, 0x80, + 0xF0, 0x07, 0x80, + 0xF8, 0x0F, 0x80, + 0xF8, 0x0F, 0x80, + 0x7C, 0x1F, 0x00, + 0x7F, 0xFF, 0x00, + 0x3F, 0xFE, 0x00, + 0x1F, 0xFC, 0x00, + 0x07, 0xF0, 0x00 +}; + +static const uint8_t helvB24L1_0x70_BMP[] = { + 0xF1, 0xF0, + 0xF7, 0xF8, + 0xFF, 0xFC, + 0xFF, 0xFE, + 0xFC, 0x3E, + 0xF8, 0x1F, + 0xF8, 0x1F, + 0xF0, 0x0F, + 0xF0, 0x0F, + 0xF0, 0x0F, + 0xF0, 0x0F, + 0xF8, 0x1F, + 0xF8, 0x1F, + 0xFC, 0x3E, + 0xFF, 0xFE, + 0xFF, 0xFC, + 0xF7, 0xF8, + 0xF1, 0xF0, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00 +}; + +static const uint8_t helvB24L1_0x71_BMP[] = { + 0x07, 0xCF, + 0x1F, 0xEF, + 0x3F, 0xFF, + 0x7F, 0xFF, + 0x7C, 0x3F, + 0xF8, 0x1F, + 0xF0, 0x0F, + 0xF0, 0x0F, + 0xF0, 0x0F, + 0xF0, 0x0F, + 0xF0, 0x0F, + 0xF0, 0x0F, + 0xF8, 0x1F, + 0x7C, 0x3F, + 0x7F, 0xFF, + 0x3F, 0xFF, + 0x3F, 0xEF, + 0x0F, 0xCF, + 0x00, 0x0F, + 0x00, 0x0F, + 0x00, 0x0F, + 0x00, 0x0F, + 0x00, 0x0F, + 0x00, 0x0F, + 0x00, 0x0F +}; + +static const uint8_t helvB24L1_0x72_BMP[] = { + 0xF0, 0xC0, + 0xF3, 0xC0, + 0xF7, 0xC0, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xFC, 0x00, + 0xF8, 0x00, + 0xF8, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00 +}; + +static const uint8_t helvB24L1_0x73_BMP[] = { + 0x07, 0xF0, + 0x1F, 0xFC, + 0x3F, 0xFE, + 0x7C, 0x3E, + 0x78, 0x1F, + 0x78, 0x1F, + 0x7C, 0x00, + 0x7F, 0xC0, + 0x3F, 0xF8, + 0x0F, 0xFE, + 0x03, 0xFF, + 0x00, 0x3F, + 0xF8, 0x0F, + 0xF8, 0x0F, + 0x7C, 0x1F, + 0x7F, 0xFE, + 0x3F, 0xFC, + 0x0F, 0xF0 +}; + +static const uint8_t helvB24L1_0x74_BMP[] = { + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0xFF, 0x80, + 0xFF, 0x80, + 0xFF, 0x80, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3F, 0x80, + 0x3F, 0x80, + 0x1F, 0x80, + 0x0F, 0x80 +}; + +static const uint8_t helvB24L1_0x75_BMP[] = { + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF8, 0x3E, + 0xF8, 0x7E, + 0xFF, 0xFE, + 0x7F, 0xFE, + 0x7F, 0xDE, + 0x1F, 0x1E +}; + +static const uint8_t helvB24L1_0x76_BMP[] = { + 0xF8, 0x0F, 0x80, + 0xF8, 0x0F, 0x80, + 0x7C, 0x1F, 0x00, + 0x7C, 0x1F, 0x00, + 0x3C, 0x1E, 0x00, + 0x3C, 0x1E, 0x00, + 0x3E, 0x3E, 0x00, + 0x1E, 0x3C, 0x00, + 0x1E, 0x3C, 0x00, + 0x1E, 0x3C, 0x00, + 0x0F, 0x78, 0x00, + 0x0F, 0x78, 0x00, + 0x0F, 0x78, 0x00, + 0x07, 0xF0, 0x00, + 0x07, 0xF0, 0x00, + 0x07, 0xF0, 0x00, + 0x03, 0xE0, 0x00, + 0x03, 0xE0, 0x00 +}; + +static const uint8_t helvB24L1_0x77_BMP[] = { + 0xF8, 0x3E, 0x0F, 0x80, + 0xF8, 0x3E, 0x0F, 0x80, + 0x78, 0x3E, 0x0F, 0x00, + 0x7C, 0x3E, 0x1F, 0x00, + 0x7C, 0x7F, 0x1F, 0x00, + 0x3C, 0x7F, 0x1E, 0x00, + 0x3C, 0x7F, 0x1E, 0x00, + 0x3C, 0x77, 0x1E, 0x00, + 0x3C, 0xF7, 0x9E, 0x00, + 0x1E, 0xE3, 0xBC, 0x00, + 0x1E, 0xE3, 0xBC, 0x00, + 0x1E, 0xE3, 0xBC, 0x00, + 0x1F, 0xE3, 0xFC, 0x00, + 0x0F, 0xC1, 0xF8, 0x00, + 0x0F, 0xC1, 0xF8, 0x00, + 0x0F, 0xC1, 0xF8, 0x00, + 0x07, 0x80, 0xF0, 0x00, + 0x07, 0x80, 0xF0, 0x00 +}; + +static const uint8_t helvB24L1_0x78_BMP[] = { + 0xF8, 0x1F, + 0xFC, 0x3F, + 0x7C, 0x3E, + 0x3E, 0x7C, + 0x3E, 0x78, + 0x1F, 0xF8, + 0x0F, 0xF0, + 0x07, 0xE0, + 0x03, 0xC0, + 0x07, 0xE0, + 0x0F, 0xE0, + 0x0F, 0xF0, + 0x1F, 0xF8, + 0x3E, 0x78, + 0x3E, 0x7C, + 0x7C, 0x3E, + 0xFC, 0x3F, + 0xF8, 0x1F +}; + +static const uint8_t helvB24L1_0x79_BMP[] = { + 0xF8, 0x1F, + 0xF8, 0x1F, + 0xF8, 0x1E, + 0x78, 0x3E, + 0x7C, 0x3E, + 0x7C, 0x3C, + 0x3C, 0x3C, + 0x3E, 0x7C, + 0x3E, 0x78, + 0x1E, 0x78, + 0x1E, 0x78, + 0x1F, 0xF0, + 0x0F, 0xF0, + 0x0F, 0xF0, + 0x0F, 0xE0, + 0x07, 0xE0, + 0x07, 0xE0, + 0x07, 0xC0, + 0x07, 0xC0, + 0x07, 0xC0, + 0x0F, 0x80, + 0x3F, 0x80, + 0x3F, 0x00, + 0x3F, 0x00, + 0x3C, 0x00 +}; + +static const uint8_t helvB24L1_0x7A_BMP[] = { + 0xFF, 0xFC, + 0xFF, 0xFC, + 0xFF, 0xFC, + 0xFF, 0xFC, + 0x00, 0xF8, + 0x01, 0xF0, + 0x03, 0xF0, + 0x07, 0xE0, + 0x0F, 0xC0, + 0x1F, 0x80, + 0x1F, 0x00, + 0x3E, 0x00, + 0x7C, 0x00, + 0xF8, 0x00, + 0xFF, 0xFC, + 0xFF, 0xFC, + 0xFF, 0xFC, + 0xFF, 0xFC +}; + +static const uint8_t helvB24L1_0x7B_BMP[] = { + 0x0F, 0x80, + 0x1F, 0x80, + 0x3F, 0x80, + 0x3E, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x7C, 0x00, + 0x78, 0x00, + 0xE0, 0x00, + 0x78, 0x00, + 0x7C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3C, 0x00, + 0x3F, 0x80, + 0x1F, 0x80, + 0x0F, 0x80 +}; + +static const uint8_t helvB24L1_0x7C_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvB24L1_0x7D_BMP[] = { + 0xF8, 0x00, + 0xFC, 0x00, + 0xFE, 0x00, + 0x3E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1F, 0x00, + 0x0F, 0x00, + 0x03, 0x80, + 0x0F, 0x00, + 0x1F, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0xFE, 0x00, + 0xFC, 0x00, + 0xF8, 0x00 +}; + +static const uint8_t helvB24L1_0x7E_BMP[] = { + 0x38, 0x00, + 0x7E, 0x0C, + 0xFF, 0x9C, + 0xE7, 0xFC, + 0xC1, 0xF8, + 0x00, 0x70 +}; + +static const uint8_t helvB24L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t helvB24L1_0xA1_BMP[] = { + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0x00, + 0x00, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8 +}; + +static const uint8_t helvB24L1_0xA2_BMP[] = { + 0x00, 0x20, + 0x00, 0x20, + 0x00, 0x60, + 0x07, 0xF0, + 0x1F, 0xF8, + 0x3F, 0xFC, + 0x7F, 0xFC, + 0x7C, 0xBE, + 0xF8, 0x9E, + 0xF9, 0x9E, + 0xF1, 0x80, + 0xF1, 0x80, + 0xF3, 0x00, + 0xF3, 0x00, + 0xF3, 0x1E, + 0xFA, 0x1E, + 0x7E, 0x3E, + 0x7F, 0xFC, + 0x3F, 0xF8, + 0x1F, 0xF0, + 0x0F, 0xC0, + 0x0C, 0x00, + 0x08, 0x00, + 0x08, 0x00 +}; + +static const uint8_t helvB24L1_0xA3_BMP[] = { + 0x03, 0xF0, 0x00, + 0x1F, 0xFC, 0x00, + 0x3F, 0xFE, 0x00, + 0x3F, 0xFF, 0x00, + 0x7E, 0x1F, 0x00, + 0x7C, 0x0F, 0x80, + 0x7C, 0x0F, 0x80, + 0x7C, 0x07, 0x80, + 0x7C, 0x00, 0x00, + 0x7E, 0x00, 0x00, + 0x3E, 0x00, 0x00, + 0xFF, 0xF0, 0x00, + 0xFF, 0xF0, 0x00, + 0x1F, 0x00, 0x00, + 0x0F, 0x00, 0x00, + 0x0F, 0x00, 0x00, + 0x0F, 0x00, 0x00, + 0x1F, 0x00, 0x00, + 0x1E, 0x00, 0x00, + 0x3D, 0xE3, 0x00, + 0x7F, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x00, + 0x60, 0x7E, 0x00 +}; + +static const uint8_t helvB24L1_0xA4_BMP[] = { + 0xE0, 0x0E, + 0xF7, 0xDE, + 0xFF, 0xFE, + 0x7F, 0xFC, + 0x3C, 0x78, + 0x78, 0x3C, + 0x70, 0x1C, + 0x70, 0x1C, + 0x70, 0x1C, + 0x78, 0x3C, + 0x3C, 0x78, + 0x7F, 0xFC, + 0xFF, 0xFE, + 0xF7, 0xDE, + 0xE0, 0x0E +}; + +static const uint8_t helvB24L1_0xA5_BMP[] = { + 0xF8, 0x07, 0xC0, + 0xF8, 0x07, 0xC0, + 0x7C, 0x0F, 0x80, + 0x3C, 0x0F, 0x00, + 0x1E, 0x1E, 0x00, + 0x1E, 0x1E, 0x00, + 0x0F, 0x3C, 0x00, + 0x0F, 0x3C, 0x00, + 0x07, 0xF8, 0x00, + 0x07, 0xF8, 0x00, + 0x03, 0xF0, 0x00, + 0x01, 0xE0, 0x00, + 0x3F, 0xFF, 0x00, + 0x3F, 0xFF, 0x00, + 0x01, 0xE0, 0x00, + 0x01, 0xE0, 0x00, + 0x3F, 0xFF, 0x00, + 0x3F, 0xFF, 0x00, + 0x01, 0xE0, 0x00, + 0x01, 0xE0, 0x00, + 0x01, 0xE0, 0x00, + 0x01, 0xE0, 0x00, + 0x01, 0xE0, 0x00, + 0x01, 0xE0, 0x00 +}; + +static const uint8_t helvB24L1_0xA6_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvB24L1_0xA7_BMP[] = { + 0x0F, 0xF0, + 0x1F, 0xF8, + 0x3F, 0xF8, + 0x7E, 0x7C, + 0x7C, 0x3C, + 0x7C, 0x3C, + 0x7E, 0x00, + 0x7F, 0x00, + 0x3F, 0xC0, + 0x1F, 0xE0, + 0x3F, 0xF8, + 0x7F, 0xFC, + 0x71, 0xFE, + 0xF0, 0xFF, + 0xF0, 0x3F, + 0xF8, 0x1F, + 0xFC, 0x0F, + 0x7F, 0x0F, + 0x7F, 0x9F, + 0x3F, 0xFE, + 0x1F, 0xF8, + 0x07, 0xFC, + 0x01, 0xFE, + 0x00, 0x7E, + 0x00, 0x3E, + 0x78, 0x1E, + 0x78, 0x1E, + 0x7C, 0x3E, + 0x3F, 0xFC, + 0x3F, 0xFC, + 0x1F, 0xF8, + 0x07, 0xE0 +}; + +static const uint8_t helvB24L1_0xA8_BMP[] = { + 0xF3, 0xC0, + 0xF3, 0xC0, + 0xF3, 0xC0, + 0xF3, 0xC0 +}; + +static const uint8_t helvB24L1_0xA9_BMP[] = { + 0x00, 0x7F, 0x80, 0x00, + 0x03, 0xFF, 0xE0, 0x00, + 0x07, 0x80, 0xF8, 0x00, + 0x1F, 0x00, 0x3C, 0x00, + 0x1C, 0x00, 0x0E, 0x00, + 0x38, 0x00, 0x07, 0x00, + 0x70, 0x3F, 0x03, 0x00, + 0x70, 0x7F, 0x83, 0x80, + 0xE0, 0xF3, 0xC1, 0x80, + 0xE1, 0xC0, 0xE1, 0xC0, + 0xC1, 0xC0, 0xE0, 0xC0, + 0xC3, 0x80, 0x00, 0xC0, + 0xC3, 0x80, 0x00, 0xC0, + 0xC3, 0x80, 0x00, 0xC0, + 0xC3, 0x80, 0x00, 0xC0, + 0xC1, 0xC0, 0xE0, 0xC0, + 0xE1, 0xC0, 0xE1, 0xC0, + 0xE0, 0xF3, 0xC3, 0x80, + 0x60, 0x7F, 0x83, 0x80, + 0x70, 0x3F, 0x07, 0x00, + 0x38, 0x00, 0x0E, 0x00, + 0x1E, 0x00, 0x3C, 0x00, + 0x0F, 0x80, 0xF8, 0x00, + 0x07, 0xFF, 0xE0, 0x00, + 0x01, 0xFF, 0x80, 0x00 +}; + +static const uint8_t helvB24L1_0xAA_BMP[] = { + 0x3E, 0x00, + 0x7F, 0x00, + 0xE3, 0x80, + 0xC3, 0x80, + 0x1F, 0x80, + 0x7F, 0x80, + 0xF3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0xFF, 0x80, + 0x7B, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0x80, + 0xFF, 0x80, + 0xFF, 0x80 +}; + +static const uint8_t helvB24L1_0xAB_BMP[] = { + 0x08, 0x10, + 0x18, 0x30, + 0x38, 0x70, + 0x78, 0xF0, + 0xF1, 0xE0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xF1, 0xE0, + 0xF9, 0xF0, + 0x78, 0xF0, + 0x38, 0x70, + 0x18, 0x30, + 0x08, 0x10 +}; + +static const uint8_t helvB24L1_0xAC_BMP[] = { + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0x00, 0x0F, + 0x00, 0x0F, + 0x00, 0x0F, + 0x00, 0x0F, + 0x00, 0x0F, + 0x00, 0x0F +}; + +static const uint8_t helvB24L1_0xAD_BMP[] = { + 0xFF, 0x80, + 0xFF, 0x80, + 0xFF, 0x80, + 0xFF, 0x80, + 0xFF, 0x80 +}; + +static const uint8_t helvB24L1_0xAE_BMP[] = { + 0x00, 0xFF, 0x80, 0x00, + 0x03, 0xFF, 0xE0, 0x00, + 0x07, 0x80, 0xF8, 0x00, + 0x1E, 0x00, 0x3C, 0x00, + 0x1C, 0x00, 0x0E, 0x00, + 0x38, 0xFF, 0x87, 0x00, + 0x70, 0xFF, 0xC3, 0x00, + 0x70, 0xE1, 0xE3, 0x80, + 0xE0, 0xE0, 0xE1, 0x80, + 0xE0, 0xE0, 0xE1, 0x80, + 0xC0, 0xE0, 0xE1, 0xC0, + 0xC0, 0xE1, 0xC1, 0xC0, + 0xC0, 0xFF, 0x81, 0xC0, + 0xC0, 0xFF, 0x01, 0xC0, + 0xC0, 0xE3, 0x81, 0xC0, + 0xC0, 0xE3, 0xC1, 0xC0, + 0xE0, 0xE1, 0xC1, 0x80, + 0xE0, 0xE0, 0xE3, 0x80, + 0x70, 0xE0, 0xF3, 0x80, + 0x70, 0xE0, 0x77, 0x00, + 0x38, 0x00, 0x0E, 0x00, + 0x1E, 0x00, 0x1C, 0x00, + 0x0F, 0x80, 0x78, 0x00, + 0x07, 0xFF, 0xE0, 0x00, + 0x01, 0xFF, 0x80, 0x00 +}; + +static const uint8_t helvB24L1_0xAF_BMP[] = { + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t helvB24L1_0xB0_BMP[] = { + 0x3E, 0x00, + 0x7F, 0x00, + 0x63, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x63, 0x00, + 0x7F, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvB24L1_0xB1_BMP[] = { + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF +}; + +static const uint8_t helvB24L1_0xB2_BMP[] = { + 0x3F, 0x00, + 0x7F, 0x80, + 0xF3, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0x01, 0xC0, + 0x03, 0xC0, + 0x07, 0x80, + 0x0F, 0x00, + 0x3E, 0x00, + 0x78, 0x00, + 0x70, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t helvB24L1_0xB3_BMP[] = { + 0x1E, 0x00, + 0x7F, 0x80, + 0xF3, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0x03, 0xC0, + 0x0F, 0x80, + 0x0F, 0x80, + 0x03, 0xC0, + 0x01, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xF3, 0xC0, + 0x7F, 0x80, + 0x3E, 0x00 +}; + +static const uint8_t helvB24L1_0xB4_BMP[] = { + 0x3C, + 0x78, + 0x70, + 0xE0, + 0xE0 +}; + +static const uint8_t helvB24L1_0xB5_BMP[] = { + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF8, 0x3E, + 0xF8, 0x7E, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xFF, 0xDE, + 0xF7, 0x9E, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00 +}; + +static const uint8_t helvB24L1_0xB6_BMP[] = { + 0x0F, 0xFF, 0x80, + 0x1F, 0xFF, 0x80, + 0x3F, 0x8C, 0x00, + 0x7F, 0x8C, 0x00, + 0x7F, 0x8C, 0x00, + 0xFF, 0x8C, 0x00, + 0xFF, 0x8C, 0x00, + 0xFF, 0x8C, 0x00, + 0xFF, 0x8C, 0x00, + 0xFF, 0x8C, 0x00, + 0x7F, 0x8C, 0x00, + 0x7F, 0x8C, 0x00, + 0x3F, 0x8C, 0x00, + 0x3F, 0x8C, 0x00, + 0x0F, 0x8C, 0x00, + 0x01, 0x8C, 0x00, + 0x01, 0x8C, 0x00, + 0x01, 0x8C, 0x00, + 0x01, 0x8C, 0x00, + 0x01, 0x8C, 0x00, + 0x01, 0x8C, 0x00, + 0x01, 0x8C, 0x00, + 0x01, 0x8C, 0x00, + 0x01, 0x8C, 0x00, + 0x01, 0x8C, 0x00, + 0x01, 0x8C, 0x00, + 0x01, 0x8C, 0x00, + 0x01, 0x8C, 0x00, + 0x01, 0x8C, 0x00, + 0x01, 0x8C, 0x00, + 0x01, 0x8C, 0x00 +}; + +static const uint8_t helvB24L1_0xB7_BMP[] = { + 0x60, + 0xF0, + 0xF0, + 0xF0, + 0x60 +}; + +static const uint8_t helvB24L1_0xB8_BMP[] = { + 0x30, + 0x30, + 0x30, + 0x7C, + 0x1E, + 0x0E, + 0xFC, + 0xF8 +}; + +static const uint8_t helvB24L1_0xB9_BMP[] = { + 0x1C, + 0x3C, + 0xFC, + 0xFC, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C +}; + +static const uint8_t helvB24L1_0xBA_BMP[] = { + 0x3F, 0x00, + 0x7F, 0x80, + 0x73, 0x80, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xC0, + 0x73, 0x80, + 0x7F, 0x80, + 0x3F, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t helvB24L1_0xBB_BMP[] = { + 0x81, 0x00, + 0xC1, 0x80, + 0xE1, 0xC0, + 0xF1, 0xE0, + 0x78, 0xF0, + 0x38, 0x70, + 0x38, 0x70, + 0x78, 0xF0, + 0xF1, 0xE0, + 0xE1, 0xC0, + 0xC1, 0x80, + 0x81, 0x00 +}; + +static const uint8_t helvB24L1_0xBC_BMP[] = { + 0x00, 0x00, 0x38, 0x00, + 0x06, 0x00, 0x70, 0x00, + 0x1E, 0x00, 0x70, 0x00, + 0xFE, 0x00, 0xE0, 0x00, + 0xFE, 0x01, 0xC0, 0x00, + 0x0E, 0x01, 0xC0, 0x00, + 0x0E, 0x03, 0x80, 0x00, + 0x0E, 0x03, 0x80, 0x00, + 0x0E, 0x07, 0x00, 0x00, + 0x0E, 0x07, 0x00, 0x00, + 0x0E, 0x0E, 0x07, 0x00, + 0x0E, 0x1C, 0x0F, 0x00, + 0x0E, 0x1C, 0x1F, 0x00, + 0x0E, 0x38, 0x1F, 0x00, + 0x00, 0x38, 0x37, 0x00, + 0x00, 0x70, 0x67, 0x00, + 0x00, 0x70, 0xE7, 0x00, + 0x00, 0xE0, 0xC7, 0x00, + 0x01, 0xC1, 0x87, 0x00, + 0x01, 0xC1, 0xFF, 0xC0, + 0x03, 0x81, 0xFF, 0xC0, + 0x03, 0x80, 0x07, 0x00, + 0x07, 0x00, 0x07, 0x00, + 0x07, 0x00, 0x07, 0x00 +}; + +static const uint8_t helvB24L1_0xBD_BMP[] = { + 0x00, 0x00, 0xE0, 0x00, + 0x0C, 0x01, 0xC0, 0x00, + 0x1C, 0x01, 0xC0, 0x00, + 0xFC, 0x03, 0x80, 0x00, + 0xFC, 0x03, 0x80, 0x00, + 0x1C, 0x07, 0x00, 0x00, + 0x1C, 0x0E, 0x00, 0x00, + 0x1C, 0x0E, 0x00, 0x00, + 0x1C, 0x1C, 0x00, 0x00, + 0x1C, 0x1C, 0x00, 0x00, + 0x1C, 0x38, 0x7E, 0x00, + 0x1C, 0x30, 0xFF, 0x00, + 0x1C, 0x71, 0xE7, 0x80, + 0x1C, 0xE1, 0xC3, 0x80, + 0x00, 0xE1, 0xC3, 0x80, + 0x01, 0xC0, 0x07, 0x80, + 0x01, 0xC0, 0x0F, 0x00, + 0x03, 0x80, 0x1E, 0x00, + 0x07, 0x00, 0x3C, 0x00, + 0x07, 0x00, 0x78, 0x00, + 0x0E, 0x00, 0xF0, 0x00, + 0x0E, 0x01, 0xFF, 0x80, + 0x1C, 0x01, 0xFF, 0x80, + 0x1C, 0x01, 0xFF, 0x80 +}; + +static const uint8_t helvB24L1_0xBE_BMP[] = { + 0x3F, 0x00, 0x1C, 0x00, + 0x7F, 0x80, 0x38, 0x00, + 0xF3, 0xC0, 0x38, 0x00, + 0xE1, 0xC0, 0x70, 0x00, + 0xE1, 0xC0, 0xE0, 0x00, + 0x03, 0xC0, 0xE0, 0x00, + 0x0F, 0x81, 0xC0, 0x00, + 0x0F, 0x81, 0xC0, 0x00, + 0x0F, 0xC3, 0x80, 0x00, + 0x01, 0xC7, 0x00, 0x00, + 0xE1, 0xC7, 0x0E, 0x00, + 0xE1, 0xCE, 0x1E, 0x00, + 0xF3, 0xCE, 0x1E, 0x00, + 0x7F, 0x9C, 0x3E, 0x00, + 0x3F, 0x1C, 0x7E, 0x00, + 0x00, 0x38, 0xEE, 0x00, + 0x00, 0x70, 0xCE, 0x00, + 0x00, 0x71, 0x8E, 0x00, + 0x00, 0xE3, 0x8E, 0x00, + 0x00, 0xE3, 0xFF, 0x80, + 0x01, 0xC3, 0xFF, 0x80, + 0x01, 0xC0, 0x0E, 0x00, + 0x03, 0x80, 0x0E, 0x00, + 0x03, 0x80, 0x0E, 0x00 +}; + +static const uint8_t helvB24L1_0xBF_BMP[] = { + 0x03, 0xE0, + 0x03, 0xE0, + 0x03, 0xE0, + 0x03, 0xE0, + 0x00, 0x00, + 0x00, 0x00, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x07, 0xC0, + 0x1F, 0x80, + 0x3F, 0x80, + 0x7F, 0x00, + 0x7E, 0x00, + 0xFC, 0x00, + 0xF8, 0x0F, + 0xF8, 0x0F, + 0xF8, 0x0F, + 0xFC, 0x1F, + 0x7E, 0x7F, + 0x7F, 0xFE, + 0x3F, 0xFE, + 0x3F, 0xFC, + 0x0F, 0xF0 +}; + +static const uint8_t helvB24L1_0xC0_BMP[] = { + 0x03, 0xC0, 0x00, + 0x01, 0xE0, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0x78, 0x00, + 0x00, 0x3C, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0xFC, 0x00, + 0x00, 0xFC, 0x00, + 0x01, 0xFE, 0x00, + 0x01, 0xFE, 0x00, + 0x01, 0xFE, 0x00, + 0x03, 0xFF, 0x00, + 0x03, 0xFF, 0x00, + 0x03, 0xFF, 0x00, + 0x07, 0xCF, 0x80, + 0x07, 0xCF, 0x80, + 0x07, 0xCF, 0x80, + 0x0F, 0x87, 0x80, + 0x0F, 0x87, 0xC0, + 0x0F, 0x87, 0xC0, + 0x1F, 0x03, 0xC0, + 0x1F, 0x03, 0xE0, + 0x1F, 0xFF, 0xE0, + 0x1F, 0xFF, 0xE0, + 0x3F, 0xFF, 0xF0, + 0x3F, 0xFF, 0xF0, + 0x3E, 0x01, 0xF0, + 0x7C, 0x00, 0xF8, + 0x7C, 0x00, 0xF8, + 0xFC, 0x00, 0xFC, + 0xF8, 0x00, 0x7C +}; + +static const uint8_t helvB24L1_0xC1_BMP[] = { + 0x00, 0x0F, 0x00, + 0x00, 0x1E, 0x00, + 0x00, 0x3C, 0x00, + 0x00, 0x78, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0xFC, 0x00, + 0x00, 0xFC, 0x00, + 0x01, 0xFE, 0x00, + 0x01, 0xFE, 0x00, + 0x01, 0xFE, 0x00, + 0x03, 0xFF, 0x00, + 0x03, 0xFF, 0x00, + 0x03, 0xFF, 0x00, + 0x07, 0xCF, 0x80, + 0x07, 0xCF, 0x80, + 0x07, 0xCF, 0x80, + 0x0F, 0x87, 0x80, + 0x0F, 0x87, 0xC0, + 0x0F, 0x87, 0xC0, + 0x1F, 0x03, 0xC0, + 0x1F, 0x03, 0xE0, + 0x1F, 0xFF, 0xE0, + 0x1F, 0xFF, 0xE0, + 0x3F, 0xFF, 0xF0, + 0x3F, 0xFF, 0xF0, + 0x3E, 0x01, 0xF0, + 0x7C, 0x00, 0xF8, + 0x7C, 0x00, 0xF8, + 0xFC, 0x00, 0xFC, + 0xF8, 0x00, 0x7C +}; + +static const uint8_t helvB24L1_0xC2_BMP[] = { + 0x00, 0x30, 0x00, + 0x00, 0x78, 0x00, + 0x00, 0xFC, 0x00, + 0x01, 0xCE, 0x00, + 0x03, 0x87, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0xFC, 0x00, + 0x00, 0xFC, 0x00, + 0x01, 0xFE, 0x00, + 0x01, 0xFE, 0x00, + 0x01, 0xFE, 0x00, + 0x03, 0xFF, 0x00, + 0x03, 0xFF, 0x00, + 0x03, 0xFF, 0x00, + 0x07, 0xCF, 0x80, + 0x07, 0xCF, 0x80, + 0x07, 0xCF, 0x80, + 0x0F, 0x87, 0x80, + 0x0F, 0x87, 0xC0, + 0x0F, 0x87, 0xC0, + 0x1F, 0x03, 0xC0, + 0x1F, 0x03, 0xE0, + 0x1F, 0xFF, 0xE0, + 0x1F, 0xFF, 0xE0, + 0x3F, 0xFF, 0xF0, + 0x3F, 0xFF, 0xF0, + 0x3E, 0x01, 0xF0, + 0x7C, 0x00, 0xF8, + 0x7C, 0x00, 0xF8, + 0xFC, 0x00, 0xFC, + 0xF8, 0x00, 0x7C +}; + +static const uint8_t helvB24L1_0xC3_BMP[] = { + 0x00, 0xF1, 0x80, + 0x01, 0xFF, 0x80, + 0x03, 0xFF, 0x00, + 0x03, 0x1E, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0xFC, 0x00, + 0x00, 0xFC, 0x00, + 0x01, 0xFE, 0x00, + 0x01, 0xFE, 0x00, + 0x01, 0xFE, 0x00, + 0x03, 0xFF, 0x00, + 0x03, 0xFF, 0x00, + 0x03, 0xFF, 0x00, + 0x07, 0xCF, 0x80, + 0x07, 0xCF, 0x80, + 0x07, 0xCF, 0x80, + 0x0F, 0x87, 0x80, + 0x0F, 0x87, 0xC0, + 0x0F, 0x87, 0xC0, + 0x1F, 0x03, 0xC0, + 0x1F, 0x03, 0xE0, + 0x1F, 0xFF, 0xE0, + 0x1F, 0xFF, 0xE0, + 0x3F, 0xFF, 0xF0, + 0x3F, 0xFF, 0xF0, + 0x3E, 0x01, 0xF0, + 0x7C, 0x00, 0xF8, + 0x7C, 0x00, 0xF8, + 0xFC, 0x00, 0xFC, + 0xF8, 0x00, 0x7C +}; + +static const uint8_t helvB24L1_0xC4_BMP[] = { + 0x03, 0xCF, 0x00, + 0x03, 0xCF, 0x00, + 0x03, 0xCF, 0x00, + 0x03, 0xCF, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0xFC, 0x00, + 0x00, 0xFC, 0x00, + 0x01, 0xFE, 0x00, + 0x01, 0xFE, 0x00, + 0x01, 0xFE, 0x00, + 0x03, 0xFF, 0x00, + 0x03, 0xFF, 0x00, + 0x03, 0xFF, 0x00, + 0x07, 0xCF, 0x80, + 0x07, 0xCF, 0x80, + 0x07, 0xCF, 0x80, + 0x0F, 0x87, 0x80, + 0x0F, 0x87, 0xC0, + 0x0F, 0x87, 0xC0, + 0x1F, 0x03, 0xC0, + 0x1F, 0x03, 0xE0, + 0x1F, 0xFF, 0xE0, + 0x1F, 0xFF, 0xE0, + 0x3F, 0xFF, 0xF0, + 0x3F, 0xFF, 0xF0, + 0x3E, 0x01, 0xF0, + 0x7C, 0x00, 0xF8, + 0x7C, 0x00, 0xF8, + 0xFC, 0x00, 0xFC, + 0xF8, 0x00, 0x7C +}; + +static const uint8_t helvB24L1_0xC5_BMP[] = { + 0x00, 0x78, 0x00, + 0x00, 0xCC, 0x00, + 0x00, 0x84, 0x00, + 0x00, 0x84, 0x00, + 0x00, 0xCC, 0x00, + 0x00, 0x78, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0xFC, 0x00, + 0x01, 0xFE, 0x00, + 0x01, 0xFE, 0x00, + 0x01, 0xFE, 0x00, + 0x03, 0xFF, 0x00, + 0x03, 0xFF, 0x00, + 0x03, 0xFF, 0x00, + 0x07, 0xCF, 0x80, + 0x07, 0xCF, 0x80, + 0x07, 0xCF, 0x80, + 0x0F, 0x87, 0x80, + 0x0F, 0x87, 0xC0, + 0x0F, 0x87, 0xC0, + 0x1F, 0x03, 0xC0, + 0x1F, 0x03, 0xE0, + 0x1F, 0xFF, 0xE0, + 0x1F, 0xFF, 0xE0, + 0x3F, 0xFF, 0xF0, + 0x3F, 0xFF, 0xF0, + 0x3E, 0x01, 0xF0, + 0x7C, 0x00, 0xF8, + 0x7C, 0x00, 0xF8, + 0xFC, 0x00, 0xFC, + 0xF8, 0x00, 0x7C +}; + +static const uint8_t helvB24L1_0xC6_BMP[] = { + 0x00, 0xFF, 0xFF, 0xFC, + 0x00, 0xFF, 0xFF, 0xFC, + 0x00, 0xFF, 0xFF, 0xFC, + 0x01, 0xFF, 0xFF, 0xFC, + 0x01, 0xF3, 0xC0, 0x00, + 0x01, 0xE3, 0xC0, 0x00, + 0x03, 0xE3, 0xC0, 0x00, + 0x03, 0xE3, 0xC0, 0x00, + 0x03, 0xC3, 0xC0, 0x00, + 0x07, 0xC3, 0xC0, 0x00, + 0x07, 0xC3, 0xC0, 0x00, + 0x07, 0xC3, 0xFF, 0xF8, + 0x0F, 0x83, 0xFF, 0xF8, + 0x0F, 0x83, 0xFF, 0xF8, + 0x0F, 0x83, 0xFF, 0xF8, + 0x1F, 0x03, 0xC0, 0x00, + 0x1F, 0xFF, 0xC0, 0x00, + 0x1F, 0xFF, 0xC0, 0x00, + 0x3F, 0xFF, 0xC0, 0x00, + 0x3F, 0xFF, 0xC0, 0x00, + 0x3E, 0x03, 0xC0, 0x00, + 0x7C, 0x03, 0xFF, 0xFE, + 0x7C, 0x03, 0xFF, 0xFE, + 0xF8, 0x03, 0xFF, 0xFE, + 0xF8, 0x03, 0xFF, 0xFE +}; + +static const uint8_t helvB24L1_0xC7_BMP[] = { + 0x01, 0xFE, 0x00, + 0x07, 0xFF, 0x80, + 0x0F, 0xFF, 0xC0, + 0x1F, 0xFF, 0xE0, + 0x3F, 0x87, 0xF0, + 0x3E, 0x01, 0xF0, + 0x7C, 0x01, 0xF0, + 0x7C, 0x00, 0xF8, + 0x7C, 0x00, 0xF8, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0x7C, 0x00, 0xF8, + 0x7C, 0x00, 0xF8, + 0x7E, 0x01, 0xF8, + 0x3E, 0x01, 0xF0, + 0x3F, 0x87, 0xF0, + 0x1F, 0xFF, 0xE0, + 0x0F, 0xFF, 0xC0, + 0x07, 0xFF, 0x80, + 0x01, 0xFC, 0x00, + 0x00, 0x60, 0x00, + 0x00, 0x60, 0x00, + 0x00, 0xF8, 0x00, + 0x00, 0x1C, 0x00, + 0x00, 0x1C, 0x00, + 0x01, 0xF8, 0x00, + 0x01, 0xF0, 0x00 +}; + +static const uint8_t helvB24L1_0xC8_BMP[] = { + 0x1E, 0x00, 0x00, + 0x0F, 0x00, 0x00, + 0x07, 0x80, 0x00, + 0x03, 0xC0, 0x00, + 0x01, 0xE0, 0x00, + 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xC0 +}; + +static const uint8_t helvB24L1_0xC9_BMP[] = { + 0x00, 0x78, 0x00, + 0x00, 0xF0, 0x00, + 0x01, 0xE0, 0x00, + 0x03, 0xC0, 0x00, + 0x07, 0x80, 0x00, + 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xC0 +}; + +static const uint8_t helvB24L1_0xCA_BMP[] = { + 0x00, 0xC0, 0x00, + 0x01, 0xE0, 0x00, + 0x03, 0xF0, 0x00, + 0x07, 0x38, 0x00, + 0x0E, 0x1C, 0x00, + 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xC0 +}; + +static const uint8_t helvB24L1_0xCB_BMP[] = { + 0x1E, 0x3C, 0x00, + 0x1E, 0x3C, 0x00, + 0x1E, 0x3C, 0x00, + 0x1E, 0x3C, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xC0 +}; + +static const uint8_t helvB24L1_0xCC_BMP[] = { + 0xF0, + 0x78, + 0x3C, + 0x1E, + 0x0F, + 0x00, + 0x3E, + 0x3E, + 0x3E, + 0x3E, + 0x3E, + 0x3E, + 0x3E, + 0x3E, + 0x3E, + 0x3E, + 0x3E, + 0x3E, + 0x3E, + 0x3E, + 0x3E, + 0x3E, + 0x3E, + 0x3E, + 0x3E, + 0x3E, + 0x3E, + 0x3E, + 0x3E, + 0x3E, + 0x3E +}; + +static const uint8_t helvB24L1_0xCD_BMP[] = { + 0x0F, + 0x1E, + 0x3C, + 0x78, + 0xF0, + 0x00, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8, + 0xF8 +}; + +static const uint8_t helvB24L1_0xCE_BMP[] = { + 0x0C, 0x00, + 0x1E, 0x00, + 0x3F, 0x00, + 0x73, 0x80, + 0xE1, 0xC0, + 0x00, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvB24L1_0xCF_BMP[] = { + 0xF3, 0xC0, + 0xF3, 0xC0, + 0xF3, 0xC0, + 0xF3, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvB24L1_0xD0_BMP[] = { + 0x1F, 0xFF, 0x80, + 0x1F, 0xFF, 0xE0, + 0x1F, 0xFF, 0xF0, + 0x1F, 0xFF, 0xF8, + 0x1F, 0x07, 0xF8, + 0x1F, 0x00, 0xFC, + 0x1F, 0x00, 0xFC, + 0x1F, 0x00, 0x7C, + 0x1F, 0x00, 0x7E, + 0x1F, 0x00, 0x3E, + 0x1F, 0x00, 0x3E, + 0xFF, 0xF0, 0x3E, + 0xFF, 0xF0, 0x3E, + 0xFF, 0xF0, 0x3E, + 0x1F, 0x00, 0x3E, + 0x1F, 0x00, 0x3E, + 0x1F, 0x00, 0x7C, + 0x1F, 0x00, 0x7C, + 0x1F, 0x00, 0x7C, + 0x1F, 0x00, 0xF8, + 0x1F, 0x03, 0xF8, + 0x1F, 0xFF, 0xF0, + 0x1F, 0xFF, 0xF0, + 0x1F, 0xFF, 0xC0, + 0x1F, 0xFF, 0x80 +}; + +static const uint8_t helvB24L1_0xD1_BMP[] = { + 0x03, 0xC6, 0x00, + 0x07, 0xFE, 0x00, + 0x0F, 0xFC, 0x00, + 0x0C, 0x78, 0x00, + 0x00, 0x00, 0x00, + 0xF8, 0x03, 0xE0, + 0xFC, 0x03, 0xE0, + 0xFC, 0x03, 0xE0, + 0xFE, 0x03, 0xE0, + 0xFE, 0x03, 0xE0, + 0xFF, 0x03, 0xE0, + 0xFF, 0x03, 0xE0, + 0xFF, 0x83, 0xE0, + 0xFF, 0xC3, 0xE0, + 0xFB, 0xC3, 0xE0, + 0xFB, 0xE3, 0xE0, + 0xF9, 0xE3, 0xE0, + 0xF9, 0xF3, 0xE0, + 0xF8, 0xF3, 0xE0, + 0xF8, 0xFB, 0xE0, + 0xF8, 0x7B, 0xE0, + 0xF8, 0x3F, 0xE0, + 0xF8, 0x3F, 0xE0, + 0xF8, 0x1F, 0xE0, + 0xF8, 0x1F, 0xE0, + 0xF8, 0x0F, 0xE0, + 0xF8, 0x0F, 0xE0, + 0xF8, 0x07, 0xE0, + 0xF8, 0x07, 0xE0, + 0xF8, 0x03, 0xE0 +}; + +static const uint8_t helvB24L1_0xD2_BMP[] = { + 0x01, 0xE0, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0x78, 0x00, + 0x00, 0x3C, 0x00, + 0x00, 0x1E, 0x00, + 0x00, 0x00, 0x00, + 0x01, 0xFF, 0x00, + 0x07, 0xFF, 0xC0, + 0x0F, 0xFF, 0xE0, + 0x1F, 0xFF, 0xF0, + 0x3F, 0xC7, 0xF8, + 0x3F, 0x01, 0xF8, + 0x7E, 0x00, 0xFC, + 0x7C, 0x00, 0x7C, + 0x7C, 0x00, 0x7C, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0x7C, 0x00, 0x7C, + 0x7C, 0x00, 0x7C, + 0x7E, 0x00, 0xFC, + 0x3F, 0x01, 0xF8, + 0x3F, 0xC7, 0xF8, + 0x1F, 0xFF, 0xF0, + 0x0F, 0xFF, 0xE0, + 0x07, 0xFF, 0xC0, + 0x01, 0xFF, 0x00 +}; + +static const uint8_t helvB24L1_0xD3_BMP[] = { + 0x00, 0x07, 0x80, + 0x00, 0x0F, 0x00, + 0x00, 0x1E, 0x00, + 0x00, 0x3C, 0x00, + 0x00, 0x78, 0x00, + 0x00, 0x00, 0x00, + 0x01, 0xFF, 0x00, + 0x07, 0xFF, 0xC0, + 0x0F, 0xFF, 0xE0, + 0x1F, 0xFF, 0xF0, + 0x3F, 0xC7, 0xF8, + 0x3F, 0x01, 0xF8, + 0x7E, 0x00, 0xFC, + 0x7C, 0x00, 0x7C, + 0x7C, 0x00, 0x7C, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0x7C, 0x00, 0x7C, + 0x7C, 0x00, 0x7C, + 0x7E, 0x00, 0xFC, + 0x3F, 0x01, 0xF8, + 0x3F, 0xC7, 0xF8, + 0x1F, 0xFF, 0xF0, + 0x0F, 0xFF, 0xE0, + 0x07, 0xFF, 0xC0, + 0x01, 0xFF, 0x00 +}; + +static const uint8_t helvB24L1_0xD4_BMP[] = { + 0x00, 0x18, 0x00, + 0x00, 0x3C, 0x00, + 0x00, 0x7E, 0x00, + 0x00, 0xE7, 0x00, + 0x01, 0xC3, 0x80, + 0x00, 0x00, 0x00, + 0x01, 0xFF, 0x00, + 0x07, 0xFF, 0xC0, + 0x0F, 0xFF, 0xE0, + 0x1F, 0xFF, 0xF0, + 0x3F, 0xC7, 0xF8, + 0x3F, 0x01, 0xF8, + 0x7E, 0x00, 0xFC, + 0x7C, 0x00, 0x7C, + 0x7C, 0x00, 0x7C, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0x7C, 0x00, 0x7C, + 0x7C, 0x00, 0x7C, + 0x7E, 0x00, 0xFC, + 0x3F, 0x01, 0xF8, + 0x3F, 0xC7, 0xF8, + 0x1F, 0xFF, 0xF0, + 0x0F, 0xFF, 0xE0, + 0x07, 0xFF, 0xC0, + 0x01, 0xFF, 0x00 +}; + +static const uint8_t helvB24L1_0xD5_BMP[] = { + 0x00, 0x78, 0xC0, + 0x00, 0xFF, 0xC0, + 0x01, 0xFF, 0x80, + 0x01, 0x8F, 0x00, + 0x00, 0x00, 0x00, + 0x01, 0xFF, 0x00, + 0x07, 0xFF, 0xC0, + 0x0F, 0xFF, 0xE0, + 0x1F, 0xFF, 0xF0, + 0x3F, 0xC7, 0xF8, + 0x3F, 0x01, 0xF8, + 0x7E, 0x00, 0xFC, + 0x7C, 0x00, 0x7C, + 0x7C, 0x00, 0x7C, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0x7C, 0x00, 0x7C, + 0x7C, 0x00, 0x7C, + 0x7E, 0x00, 0xFC, + 0x3F, 0x01, 0xF8, + 0x3F, 0xC7, 0xF8, + 0x1F, 0xFF, 0xF0, + 0x0F, 0xFF, 0xE0, + 0x07, 0xFF, 0xC0, + 0x01, 0xFF, 0x00 +}; + +static const uint8_t helvB24L1_0xD6_BMP[] = { + 0x01, 0xE7, 0x80, + 0x01, 0xE7, 0x80, + 0x01, 0xE7, 0x80, + 0x01, 0xE7, 0x80, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x01, 0xFF, 0x00, + 0x07, 0xFF, 0xC0, + 0x0F, 0xFF, 0xE0, + 0x1F, 0xFF, 0xF0, + 0x3F, 0xC7, 0xF8, + 0x3F, 0x01, 0xF8, + 0x7E, 0x00, 0xFC, + 0x7C, 0x00, 0x7C, + 0x7C, 0x00, 0x7C, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x3E, + 0x7C, 0x00, 0x7C, + 0x7C, 0x00, 0x7C, + 0x7E, 0x00, 0xFC, + 0x3F, 0x01, 0xF8, + 0x3F, 0xC7, 0xF8, + 0x1F, 0xFF, 0xF0, + 0x0F, 0xFF, 0xE0, + 0x07, 0xFF, 0xC0, + 0x01, 0xFF, 0x00 +}; + +static const uint8_t helvB24L1_0xD7_BMP[] = { + 0x20, 0x08, + 0x70, 0x1C, + 0xF8, 0x3E, + 0xFC, 0x7E, + 0x7E, 0xFC, + 0x3F, 0xF8, + 0x1F, 0xF0, + 0x0F, 0xE0, + 0x0F, 0xE0, + 0x1F, 0xF0, + 0x3F, 0xF8, + 0x7E, 0xFC, + 0xFC, 0x7E, + 0xF8, 0x3E, + 0x70, 0x1C, + 0x20, 0x08 +}; + +static const uint8_t helvB24L1_0xD8_BMP[] = { + 0x01, 0xFF, 0x07, + 0x07, 0xFF, 0xCE, + 0x0F, 0xFF, 0xFC, + 0x1F, 0xFF, 0xF8, + 0x3F, 0xC7, 0xF8, + 0x3F, 0x00, 0xF8, + 0x7E, 0x01, 0xFC, + 0x7C, 0x03, 0xFC, + 0x7C, 0x07, 0xBC, + 0xF8, 0x07, 0x3E, + 0xF8, 0x0E, 0x3E, + 0xF8, 0x1C, 0x3E, + 0xF8, 0x38, 0x3E, + 0xF8, 0x70, 0x3E, + 0xF8, 0xE0, 0x3E, + 0xF8, 0xE0, 0x3E, + 0x7D, 0xC0, 0x7C, + 0x7F, 0x80, 0x7C, + 0x7F, 0x00, 0xFC, + 0x3F, 0x01, 0xF8, + 0x3F, 0xC7, 0xF8, + 0x3F, 0xFF, 0xF0, + 0x3F, 0xFF, 0xE0, + 0x77, 0xFF, 0xC0, + 0xE1, 0xFF, 0x00 +}; + +static const uint8_t helvB24L1_0xD9_BMP[] = { + 0x07, 0x80, 0x00, + 0x03, 0xC0, 0x00, + 0x01, 0xE0, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0x78, 0x00, + 0x00, 0x00, 0x00, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xFC, 0x07, 0xE0, + 0x7F, 0x1F, 0xC0, + 0x7F, 0xFF, 0xC0, + 0x3F, 0xFF, 0x80, + 0x1F, 0xFF, 0x00, + 0x07, 0xFC, 0x00 +}; + +static const uint8_t helvB24L1_0xDA_BMP[] = { + 0x00, 0x1E, 0x00, + 0x00, 0x3C, 0x00, + 0x00, 0x78, 0x00, + 0x00, 0xF0, 0x00, + 0x01, 0xE0, 0x00, + 0x00, 0x00, 0x00, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xFC, 0x07, 0xE0, + 0x7F, 0x1F, 0xC0, + 0x7F, 0xFF, 0xC0, + 0x3F, 0xFF, 0x80, + 0x1F, 0xFF, 0x00, + 0x07, 0xFC, 0x00 +}; + +static const uint8_t helvB24L1_0xDB_BMP[] = { + 0x00, 0x60, 0x00, + 0x00, 0xF0, 0x00, + 0x01, 0xF8, 0x00, + 0x03, 0x9C, 0x00, + 0x07, 0x0E, 0x00, + 0x00, 0x00, 0x00, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xFC, 0x07, 0xE0, + 0x7F, 0x1F, 0xC0, + 0x7F, 0xFF, 0xC0, + 0x3F, 0xFF, 0x80, + 0x1F, 0xFF, 0x00, + 0x07, 0xFC, 0x00 +}; + +static const uint8_t helvB24L1_0xDC_BMP[] = { + 0x0F, 0x1E, 0x00, + 0x0F, 0x1E, 0x00, + 0x0F, 0x1E, 0x00, + 0x0F, 0x1E, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xF8, 0x03, 0xE0, + 0xFC, 0x07, 0xE0, + 0x7F, 0x1F, 0xC0, + 0x7F, 0xFF, 0xC0, + 0x3F, 0xFF, 0x80, + 0x1F, 0xFF, 0x00, + 0x07, 0xFC, 0x00 +}; + +static const uint8_t helvB24L1_0xDD_BMP[] = { + 0x00, 0x1E, 0x00, + 0x00, 0x3C, 0x00, + 0x00, 0x78, 0x00, + 0x00, 0xF0, 0x00, + 0x01, 0xE0, 0x00, + 0x00, 0x00, 0x00, + 0xFC, 0x03, 0xF0, + 0xFC, 0x03, 0xF0, + 0x7E, 0x07, 0xE0, + 0x3E, 0x07, 0xC0, + 0x3F, 0x0F, 0xC0, + 0x3F, 0x0F, 0x80, + 0x1F, 0x0F, 0x80, + 0x1F, 0x9F, 0x00, + 0x0F, 0x9F, 0x00, + 0x0F, 0xFE, 0x00, + 0x07, 0xFE, 0x00, + 0x07, 0xFC, 0x00, + 0x03, 0xFC, 0x00, + 0x03, 0xF8, 0x00, + 0x03, 0xF8, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00 +}; + +static const uint8_t helvB24L1_0xDE_BMP[] = { + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xFF, 0xF8, 0x00, + 0xFF, 0xFE, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x80, + 0xF8, 0x1F, 0x80, + 0xF8, 0x0F, 0xC0, + 0xF8, 0x07, 0xC0, + 0xF8, 0x07, 0xC0, + 0xF8, 0x07, 0xC0, + 0xF8, 0x07, 0xC0, + 0xF8, 0x0F, 0xC0, + 0xF8, 0x1F, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFE, 0x00, + 0xFF, 0xFC, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00 +}; + +static const uint8_t helvB24L1_0xDF_BMP[] = { + 0x0F, 0xC0, 0x00, + 0x3F, 0xF0, 0x00, + 0x7F, 0xFC, 0x00, + 0xFF, 0xFC, 0x00, + 0xF8, 0x7E, 0x00, + 0xF8, 0x3E, 0x00, + 0xF0, 0x3E, 0x00, + 0xF0, 0x3E, 0x00, + 0xF0, 0x7C, 0x00, + 0xF0, 0xFC, 0x00, + 0xF1, 0xF8, 0x00, + 0xF1, 0xFC, 0x00, + 0xF1, 0xFE, 0x00, + 0xF0, 0x7F, 0x00, + 0xF0, 0x1F, 0x00, + 0xF0, 0x1F, 0x80, + 0xF0, 0x0F, 0x80, + 0xF0, 0x0F, 0x80, + 0xF0, 0x0F, 0x80, + 0xF0, 0x1F, 0x80, + 0xF0, 0x3F, 0x00, + 0xF1, 0xFF, 0x00, + 0xF1, 0xFE, 0x00, + 0xF1, 0xFC, 0x00, + 0xF1, 0xF0, 0x00 +}; + +static const uint8_t helvB24L1_0xE0_BMP[] = { + 0x0F, 0x00, + 0x07, 0x80, + 0x03, 0x80, + 0x01, 0xC0, + 0x00, 0xE0, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0xF0, + 0x3F, 0xFC, + 0x7F, 0xFC, + 0x7C, 0x3E, + 0xF8, 0x1E, + 0xF8, 0x1E, + 0x01, 0xFE, + 0x0F, 0xFE, + 0x3F, 0xFE, + 0x7F, 0x1E, + 0xF8, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x3E, + 0xF8, 0x7E, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0x7F, 0xDE, + 0x3F, 0x1E +}; + +static const uint8_t helvB24L1_0xE1_BMP[] = { + 0x00, 0x78, + 0x00, 0xF0, + 0x00, 0xE0, + 0x01, 0xC0, + 0x03, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0xF0, + 0x3F, 0xFC, + 0x7F, 0xFC, + 0x7C, 0x3E, + 0xF8, 0x1E, + 0xF8, 0x1E, + 0x01, 0xFE, + 0x0F, 0xFE, + 0x3F, 0xFE, + 0x7F, 0x1E, + 0xF8, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x3E, + 0xF8, 0x7E, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0x7F, 0xDE, + 0x3F, 0x1E +}; + +static const uint8_t helvB24L1_0xE2_BMP[] = { + 0x01, 0x80, + 0x03, 0xC0, + 0x07, 0xE0, + 0x0E, 0x70, + 0x1C, 0x38, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0xF0, + 0x3F, 0xFC, + 0x7F, 0xFC, + 0x7C, 0x3E, + 0xF8, 0x1E, + 0xF8, 0x1E, + 0x01, 0xFE, + 0x0F, 0xFE, + 0x3F, 0xFE, + 0x7F, 0x1E, + 0xF8, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x3E, + 0xF8, 0x7E, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0x7F, 0xDE, + 0x3F, 0x1E +}; + +static const uint8_t helvB24L1_0xE3_BMP[] = { + 0x07, 0x8C, + 0x0F, 0xFC, + 0x1F, 0xF8, + 0x18, 0xF0, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0xF0, + 0x3F, 0xFC, + 0x7F, 0xFC, + 0x7C, 0x3E, + 0xF8, 0x1E, + 0xF8, 0x1E, + 0x01, 0xFE, + 0x0F, 0xFE, + 0x3F, 0xFE, + 0x7F, 0x1E, + 0xF8, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x3E, + 0xF8, 0x7E, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0x7F, 0xDE, + 0x3F, 0x1E +}; + +static const uint8_t helvB24L1_0xE4_BMP[] = { + 0x1E, 0x78, + 0x1E, 0x78, + 0x1E, 0x78, + 0x1E, 0x78, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0xF0, + 0x3F, 0xFC, + 0x7F, 0xFC, + 0x7C, 0x3E, + 0xF8, 0x1E, + 0xF8, 0x1E, + 0x01, 0xFE, + 0x0F, 0xFE, + 0x3F, 0xFE, + 0x7F, 0x1E, + 0xF8, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x3E, + 0xF8, 0x7E, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0x7F, 0xDE, + 0x3F, 0x1E +}; + +static const uint8_t helvB24L1_0xE5_BMP[] = { + 0x03, 0xC0, + 0x06, 0x60, + 0x04, 0x20, + 0x04, 0x20, + 0x06, 0x60, + 0x03, 0xC0, + 0x00, 0x00, + 0x0F, 0xF0, + 0x3F, 0xFC, + 0x7F, 0xFC, + 0x7C, 0x3E, + 0xF8, 0x1E, + 0xF8, 0x1E, + 0x01, 0xFE, + 0x0F, 0xFE, + 0x3F, 0xFE, + 0x7F, 0x1E, + 0xF8, 0x1E, + 0xF8, 0x1E, + 0xF0, 0x3E, + 0xF8, 0x7E, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0x7F, 0xDE, + 0x3F, 0x1E +}; + +static const uint8_t helvB24L1_0xE6_BMP[] = { + 0x07, 0xE0, 0xF8, 0x00, + 0x1F, 0xFB, 0xFE, 0x00, + 0x3F, 0xFF, 0xFF, 0x00, + 0x3F, 0xFF, 0xFF, 0x00, + 0x7C, 0x3F, 0x0F, 0x80, + 0x78, 0x1E, 0x07, 0x80, + 0x78, 0x1E, 0x07, 0xC0, + 0x00, 0x3E, 0x07, 0xC0, + 0x07, 0xFF, 0xFF, 0xC0, + 0x3F, 0xFF, 0xFF, 0xC0, + 0x7F, 0xFF, 0xFF, 0xC0, + 0x7C, 0x1E, 0x00, 0x00, + 0xF8, 0x1E, 0x00, 0x00, + 0xF8, 0x1E, 0x07, 0xC0, + 0xFC, 0x3F, 0x0F, 0xC0, + 0xFF, 0xFF, 0xFF, 0x80, + 0x7F, 0xF7, 0xFF, 0x00, + 0x3F, 0xE3, 0xFE, 0x00, + 0x0F, 0x81, 0xF8, 0x00 +}; + +static const uint8_t helvB24L1_0xE7_BMP[] = { + 0x07, 0xE0, + 0x1F, 0xF8, + 0x3F, 0xFC, + 0x3F, 0xFC, + 0x7C, 0x3E, + 0x78, 0x1E, + 0xF8, 0x1E, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF8, 0x1E, + 0xF8, 0x1E, + 0x7C, 0x3E, + 0x7F, 0xFC, + 0x3F, 0xF8, + 0x1F, 0xF8, + 0x07, 0xE0, + 0x03, 0x00, + 0x03, 0x00, + 0x07, 0xC0, + 0x00, 0xE0, + 0x00, 0xE0, + 0x0F, 0xC0, + 0x0F, 0x80 +}; + +static const uint8_t helvB24L1_0xE8_BMP[] = { + 0x0F, 0x00, + 0x07, 0x80, + 0x03, 0x80, + 0x01, 0xC0, + 0x00, 0xE0, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0xE0, + 0x1F, 0xF8, + 0x3F, 0xFC, + 0x7F, 0xFE, + 0x7C, 0x3E, + 0xF8, 0x1E, + 0xF0, 0x1F, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF8, 0x1E, + 0x7C, 0x3E, + 0x7F, 0xFE, + 0x3F, 0xFC, + 0x1F, 0xF0, + 0x07, 0xC0 +}; + +static const uint8_t helvB24L1_0xE9_BMP[] = { + 0x00, 0x78, + 0x00, 0xF0, + 0x00, 0xE0, + 0x01, 0xC0, + 0x03, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0xE0, + 0x1F, 0xF8, + 0x3F, 0xFC, + 0x7F, 0xFE, + 0x7C, 0x3E, + 0xF8, 0x1E, + 0xF0, 0x1F, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF8, 0x1E, + 0x7C, 0x3E, + 0x7F, 0xFE, + 0x3F, 0xFC, + 0x1F, 0xF0, + 0x07, 0xC0 +}; + +static const uint8_t helvB24L1_0xEA_BMP[] = { + 0x01, 0x80, + 0x03, 0xC0, + 0x07, 0xE0, + 0x0E, 0x70, + 0x1C, 0x38, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0xE0, + 0x1F, 0xF8, + 0x3F, 0xFC, + 0x7F, 0xFE, + 0x7C, 0x3E, + 0xF8, 0x1E, + 0xF0, 0x1F, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF8, 0x1E, + 0x7C, 0x3E, + 0x7F, 0xFE, + 0x3F, 0xFC, + 0x1F, 0xF0, + 0x07, 0xC0 +}; + +static const uint8_t helvB24L1_0xEB_BMP[] = { + 0x1E, 0x78, + 0x1E, 0x78, + 0x1E, 0x78, + 0x1E, 0x78, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0xE0, + 0x1F, 0xF8, + 0x3F, 0xFC, + 0x7F, 0xFE, + 0x7C, 0x3E, + 0xF8, 0x1E, + 0xF0, 0x1F, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF8, 0x1E, + 0x7C, 0x3E, + 0x7F, 0xFE, + 0x3F, 0xFC, + 0x1F, 0xF0, + 0x07, 0xC0 +}; + +static const uint8_t helvB24L1_0xEC_BMP[] = { + 0xF0, + 0x78, + 0x38, + 0x1C, + 0x0E, + 0x00, + 0x00, + 0x1E, + 0x1E, + 0x1E, + 0x1E, + 0x1E, + 0x1E, + 0x1E, + 0x1E, + 0x1E, + 0x1E, + 0x1E, + 0x1E, + 0x1E, + 0x1E, + 0x1E, + 0x1E, + 0x1E, + 0x1E +}; + +static const uint8_t helvB24L1_0xED_BMP[] = { + 0x3C, + 0x38, + 0x70, + 0x70, + 0xE0, + 0x00, + 0x00, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0, + 0xF0 +}; + +static const uint8_t helvB24L1_0xEE_BMP[] = { + 0x0C, 0x00, + 0x1E, 0x00, + 0x3F, 0x00, + 0x73, 0x80, + 0xE1, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t helvB24L1_0xEF_BMP[] = { + 0xF3, 0xC0, + 0xF3, 0xC0, + 0xF3, 0xC0, + 0xF3, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00, + 0x1E, 0x00 +}; + +static const uint8_t helvB24L1_0xF0_BMP[] = { + 0x30, 0x00, 0x00, + 0x78, 0x20, 0x00, + 0x7C, 0xF0, 0x00, + 0x3F, 0xE0, 0x00, + 0x1F, 0xC0, 0x00, + 0x3F, 0xE0, 0x00, + 0x73, 0xF0, 0x00, + 0x21, 0xF8, 0x00, + 0x07, 0xFC, 0x00, + 0x1F, 0xFE, 0x00, + 0x3F, 0xFE, 0x00, + 0x7F, 0xFF, 0x00, + 0x7C, 0x1F, 0x00, + 0xF8, 0x0F, 0x80, + 0xF8, 0x0F, 0x80, + 0xF0, 0x07, 0x80, + 0xF0, 0x07, 0x80, + 0xF0, 0x07, 0x80, + 0xF8, 0x0F, 0x80, + 0xF8, 0x0F, 0x80, + 0xFC, 0x1F, 0x80, + 0x7E, 0x3F, 0x00, + 0x7F, 0xFF, 0x00, + 0x3F, 0xFE, 0x00, + 0x1F, 0xFC, 0x00, + 0x07, 0xF0, 0x00 +}; + +static const uint8_t helvB24L1_0xF1_BMP[] = { + 0x0F, 0x18, + 0x1F, 0xF8, + 0x3F, 0xF0, + 0x31, 0xE0, + 0x00, 0x00, + 0x00, 0x00, + 0xF3, 0xF0, + 0xF7, 0xF8, + 0xFF, 0xFC, + 0xFF, 0xFE, + 0xFC, 0x3E, + 0xF8, 0x3E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E +}; + +static const uint8_t helvB24L1_0xF2_BMP[] = { + 0x07, 0x80, 0x00, + 0x03, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xE0, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x07, 0xF0, 0x00, + 0x1F, 0xFC, 0x00, + 0x3F, 0xFE, 0x00, + 0x7F, 0xFF, 0x00, + 0x7C, 0x1F, 0x00, + 0xF8, 0x0F, 0x80, + 0xF8, 0x0F, 0x80, + 0xF0, 0x07, 0x80, + 0xF0, 0x07, 0x80, + 0xF0, 0x07, 0x80, + 0xF0, 0x07, 0x80, + 0xF8, 0x0F, 0x80, + 0xF8, 0x0F, 0x80, + 0x7C, 0x1F, 0x00, + 0x7F, 0xFF, 0x00, + 0x3F, 0xFE, 0x00, + 0x1F, 0xFC, 0x00, + 0x07, 0xF0, 0x00 +}; + +static const uint8_t helvB24L1_0xF3_BMP[] = { + 0x00, 0x78, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0xE0, 0x00, + 0x01, 0xC0, 0x00, + 0x03, 0xC0, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x07, 0xF0, 0x00, + 0x1F, 0xFC, 0x00, + 0x3F, 0xFE, 0x00, + 0x7F, 0xFF, 0x00, + 0x7C, 0x1F, 0x00, + 0xF8, 0x0F, 0x80, + 0xF8, 0x0F, 0x80, + 0xF0, 0x07, 0x80, + 0xF0, 0x07, 0x80, + 0xF0, 0x07, 0x80, + 0xF0, 0x07, 0x80, + 0xF8, 0x0F, 0x80, + 0xF8, 0x0F, 0x80, + 0x7C, 0x1F, 0x00, + 0x7F, 0xFF, 0x00, + 0x3F, 0xFE, 0x00, + 0x1F, 0xFC, 0x00, + 0x07, 0xF0, 0x00 +}; + +static const uint8_t helvB24L1_0xF4_BMP[] = { + 0x00, 0xC0, 0x00, + 0x01, 0xE0, 0x00, + 0x03, 0xF0, 0x00, + 0x07, 0x38, 0x00, + 0x0E, 0x1C, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x07, 0xF0, 0x00, + 0x1F, 0xFC, 0x00, + 0x3F, 0xFE, 0x00, + 0x7F, 0xFF, 0x00, + 0x7C, 0x1F, 0x00, + 0xF8, 0x0F, 0x80, + 0xF8, 0x0F, 0x80, + 0xF0, 0x07, 0x80, + 0xF0, 0x07, 0x80, + 0xF0, 0x07, 0x80, + 0xF0, 0x07, 0x80, + 0xF8, 0x0F, 0x80, + 0xF8, 0x0F, 0x80, + 0x7C, 0x1F, 0x00, + 0x7F, 0xFF, 0x00, + 0x3F, 0xFE, 0x00, + 0x1F, 0xFC, 0x00, + 0x07, 0xF0, 0x00 +}; + +static const uint8_t helvB24L1_0xF5_BMP[] = { + 0x07, 0x8C, 0x00, + 0x0F, 0xFC, 0x00, + 0x1F, 0xF8, 0x00, + 0x18, 0xF0, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x07, 0xF0, 0x00, + 0x1F, 0xFC, 0x00, + 0x3F, 0xFE, 0x00, + 0x7F, 0xFF, 0x00, + 0x7C, 0x1F, 0x00, + 0xF8, 0x0F, 0x80, + 0xF8, 0x0F, 0x80, + 0xF0, 0x07, 0x80, + 0xF0, 0x07, 0x80, + 0xF0, 0x07, 0x80, + 0xF0, 0x07, 0x80, + 0xF8, 0x0F, 0x80, + 0xF8, 0x0F, 0x80, + 0x7C, 0x1F, 0x00, + 0x7F, 0xFF, 0x00, + 0x3F, 0xFE, 0x00, + 0x1F, 0xFC, 0x00, + 0x07, 0xF0, 0x00 +}; + +static const uint8_t helvB24L1_0xF6_BMP[] = { + 0x1E, 0x3C, 0x00, + 0x1E, 0x3C, 0x00, + 0x1E, 0x3C, 0x00, + 0x1E, 0x3C, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x07, 0xF0, 0x00, + 0x1F, 0xFC, 0x00, + 0x3F, 0xFE, 0x00, + 0x7F, 0xFF, 0x00, + 0x7C, 0x1F, 0x00, + 0xF8, 0x0F, 0x80, + 0xF8, 0x0F, 0x80, + 0xF0, 0x07, 0x80, + 0xF0, 0x07, 0x80, + 0xF0, 0x07, 0x80, + 0xF0, 0x07, 0x80, + 0xF8, 0x0F, 0x80, + 0xF8, 0x0F, 0x80, + 0x7C, 0x1F, 0x00, + 0x7F, 0xFF, 0x00, + 0x3F, 0xFE, 0x00, + 0x1F, 0xFC, 0x00, + 0x07, 0xF0, 0x00 +}; + +static const uint8_t helvB24L1_0xF7_BMP[] = { + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0x00, 0x00, + 0x00, 0x00, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0, + 0x03, 0xC0 +}; + +static const uint8_t helvB24L1_0xF8_BMP[] = { + 0x01, 0xFC, 0x38, + 0x07, 0xFF, 0x70, + 0x0F, 0xFF, 0xE0, + 0x1F, 0xFF, 0xC0, + 0x1F, 0x8F, 0xC0, + 0x3E, 0x07, 0xE0, + 0x3E, 0x0F, 0xE0, + 0x3C, 0x1D, 0xE0, + 0x3C, 0x39, 0xE0, + 0x3C, 0x71, 0xE0, + 0x3E, 0xE3, 0xE0, + 0x3F, 0x83, 0xE0, + 0x3F, 0x07, 0xE0, + 0x1F, 0x8F, 0xC0, + 0x1F, 0xFF, 0xC0, + 0x3F, 0xFF, 0x80, + 0x77, 0xFF, 0x00, + 0xE1, 0xFC, 0x00 +}; + +static const uint8_t helvB24L1_0xF9_BMP[] = { + 0x1E, 0x00, + 0x0F, 0x00, + 0x07, 0x00, + 0x03, 0x80, + 0x01, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF8, 0x3E, + 0xF8, 0x7E, + 0xFF, 0xFE, + 0x7F, 0xFE, + 0x7F, 0xDE, + 0x1F, 0x1E +}; + +static const uint8_t helvB24L1_0xFA_BMP[] = { + 0x00, 0xF0, + 0x01, 0xE0, + 0x01, 0xC0, + 0x03, 0x80, + 0x07, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF8, 0x3E, + 0xF8, 0x7E, + 0xFF, 0xFE, + 0x7F, 0xFE, + 0x7F, 0xDE, + 0x1F, 0x1E +}; + +static const uint8_t helvB24L1_0xFB_BMP[] = { + 0x03, 0x00, + 0x07, 0x80, + 0x0F, 0xC0, + 0x1C, 0xE0, + 0x38, 0x70, + 0x00, 0x00, + 0x00, 0x00, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF8, 0x3E, + 0xF8, 0x7E, + 0xFF, 0xFE, + 0x7F, 0xFE, + 0x7F, 0xDE, + 0x1F, 0x1E +}; + +static const uint8_t helvB24L1_0xFC_BMP[] = { + 0x3C, 0x78, + 0x3C, 0x78, + 0x3C, 0x78, + 0x3C, 0x78, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0xF8, 0x3E, + 0xF8, 0x7E, + 0xFF, 0xFE, + 0x7F, 0xFE, + 0x7F, 0xDE, + 0x1F, 0x1E +}; + +static const uint8_t helvB24L1_0xFD_BMP[] = { + 0x00, 0x78, + 0x00, 0xF0, + 0x01, 0xE0, + 0x01, 0xC0, + 0x03, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0xF8, 0x1F, + 0xF8, 0x1F, + 0xF8, 0x1F, + 0x78, 0x1E, + 0x7C, 0x3E, + 0x7C, 0x3C, + 0x3C, 0x3C, + 0x3C, 0x3C, + 0x3E, 0x78, + 0x3E, 0x78, + 0x1E, 0x78, + 0x1F, 0xF0, + 0x1F, 0xF0, + 0x0F, 0xF0, + 0x0F, 0xE0, + 0x07, 0xE0, + 0x07, 0xE0, + 0x07, 0xC0, + 0x07, 0xC0, + 0x07, 0xC0, + 0x0F, 0x80, + 0x3F, 0x80, + 0x3F, 0x00, + 0x3F, 0x00, + 0x3C, 0x00 +}; + +static const uint8_t helvB24L1_0xFE_BMP[] = { + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF3, 0xF0, + 0xF7, 0xFC, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xFC, 0x3F, + 0xF8, 0x1F, + 0xF8, 0x1F, + 0xF0, 0x0F, + 0xF0, 0x0F, + 0xF0, 0x0F, + 0xF0, 0x0F, + 0xF8, 0x1F, + 0xF8, 0x1F, + 0xFC, 0x3E, + 0xFF, 0xFE, + 0xFF, 0xFC, + 0xF7, 0xF8, + 0xF1, 0xF0, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xF0, 0x00 +}; + +static const uint8_t helvB24L1_0xFF_BMP[] = { + 0x1E, 0x78, + 0x1E, 0x78, + 0x1E, 0x78, + 0x1E, 0x78, + 0x00, 0x00, + 0x00, 0x00, + 0xF8, 0x1F, + 0xF8, 0x1F, + 0xF8, 0x1F, + 0x78, 0x3E, + 0x7C, 0x3E, + 0x7C, 0x3C, + 0x7C, 0x3C, + 0x3E, 0x7C, + 0x3E, 0x78, + 0x3E, 0x78, + 0x1E, 0x78, + 0x1F, 0xF0, + 0x1F, 0xF0, + 0x0F, 0xF0, + 0x0F, 0xE0, + 0x07, 0xE0, + 0x07, 0xE0, + 0x07, 0xC0, + 0x07, 0xC0, + 0x07, 0xC0, + 0x0F, 0x80, + 0x3F, 0x80, + 0x3F, 0x00, + 0x3F, 0x00, + 0x3C, 0x00 +}; + +static const GFONT_CharInfo FontBMP[] = { + {23, 19, 25, 2, 0, helvB24L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {9, 1, 1, 0, 0, helvB24L1_0x20_BMP}, + {11, 5, 25, 3, 0, helvB24L1_0x21_BMP}, + {16, 11, 9, 2, 16, helvB24L1_0x22_BMP}, + {19, 18, 25, 0, -1, helvB24L1_0x23_BMP}, + {18, 16, 28, 1, -3, helvB24L1_0x24_BMP}, + {29, 26, 23, 1, 0, helvB24L1_0x25_BMP}, + {24, 20, 25, 2, 0, helvB24L1_0x26_BMP}, + {8, 4, 9, 2, 16, helvB24L1_0x27_BMP}, + {11, 8, 31, 1, -6, helvB24L1_0x28_BMP}, + {11, 8, 31, 1, -6, helvB24L1_0x29_BMP}, + {13, 10, 11, 1, 13, helvB24L1_0x2A_BMP}, + {19, 16, 16, 1, 0, helvB24L1_0x2B_BMP}, + {9, 5, 11, 2, -6, helvB24L1_0x2C_BMP}, + {11, 9, 5, 1, 7, helvB24L1_0x2D_BMP}, + {9, 5, 5, 2, 0, helvB24L1_0x2E_BMP}, + {9, 8, 25, 0, 0, helvB24L1_0x2F_BMP}, + {18, 15, 24, 1, 0, helvB24L1_0x30_BMP}, + {18, 10, 23, 2, 0, helvB24L1_0x31_BMP}, + {18, 16, 24, 1, 0, helvB24L1_0x32_BMP}, + {18, 16, 24, 1, 0, helvB24L1_0x33_BMP}, + {18, 16, 24, 1, 0, helvB24L1_0x34_BMP}, + {18, 15, 24, 1, 0, helvB24L1_0x35_BMP}, + {18, 15, 24, 1, 0, helvB24L1_0x36_BMP}, + {18, 16, 24, 1, 0, helvB24L1_0x37_BMP}, + {18, 17, 24, 0, 0, helvB24L1_0x38_BMP}, + {18, 15, 24, 1, 0, helvB24L1_0x39_BMP}, + {11, 5, 17, 3, 0, helvB24L1_0x3A_BMP}, + {11, 5, 23, 3, -6, helvB24L1_0x3B_BMP}, + {19, 16, 16, 1, 0, helvB24L1_0x3C_BMP}, + {19, 15, 12, 2, 2, helvB24L1_0x3D_BMP}, + {19, 16, 16, 1, 0, helvB24L1_0x3E_BMP}, + {20, 16, 25, 2, 0, helvB24L1_0x3F_BMP}, + {33, 29, 30, 1, -5, helvB24L1_0x40_BMP}, + {23, 22, 25, 0, 0, helvB24L1_0x41_BMP}, + {24, 19, 25, 3, 0, helvB24L1_0x42_BMP}, + {24, 21, 25, 1, 0, helvB24L1_0x43_BMP}, + {24, 21, 25, 2, 0, helvB24L1_0x44_BMP}, + {22, 18, 25, 2, 0, helvB24L1_0x45_BMP}, + {20, 16, 25, 2, 0, helvB24L1_0x46_BMP}, + {25, 22, 25, 1, 0, helvB24L1_0x47_BMP}, + {23, 19, 25, 2, 0, helvB24L1_0x48_BMP}, + {9, 5, 25, 2, 0, helvB24L1_0x49_BMP}, + {18, 15, 25, 1, 0, helvB24L1_0x4A_BMP}, + {24, 20, 25, 2, 0, helvB24L1_0x4B_BMP}, + {20, 16, 25, 2, 0, helvB24L1_0x4C_BMP}, + {27, 23, 25, 2, 0, helvB24L1_0x4D_BMP}, + {24, 19, 25, 2, 0, helvB24L1_0x4E_BMP}, + {25, 23, 25, 1, 0, helvB24L1_0x4F_BMP}, + {22, 18, 25, 2, 0, helvB24L1_0x50_BMP}, + {26, 23, 26, 1, -1, helvB24L1_0x51_BMP}, + {24, 19, 25, 2, 0, helvB24L1_0x52_BMP}, + {22, 19, 25, 1, 0, helvB24L1_0x53_BMP}, + {20, 19, 25, 0, 0, helvB24L1_0x54_BMP}, + {24, 19, 25, 2, 0, helvB24L1_0x55_BMP}, + {22, 20, 25, 1, 0, helvB24L1_0x56_BMP}, + {31, 29, 25, 1, 0, helvB24L1_0x57_BMP}, + {22, 20, 25, 1, 0, helvB24L1_0x58_BMP}, + {22, 20, 25, 1, 0, helvB24L1_0x59_BMP}, + {20, 17, 25, 1, 0, helvB24L1_0x5A_BMP}, + {11, 8, 31, 2, -6, helvB24L1_0x5B_BMP}, + {9, 9, 25, 0, 0, helvB24L1_0x5C_BMP}, + {11, 8, 31, 0, -6, helvB24L1_0x5D_BMP}, + {19, 14, 14, 2, 9, helvB24L1_0x5E_BMP}, + {18, 18, 2, 0, -6, helvB24L1_0x5F_BMP}, + {11, 5, 5, 2, 20, helvB24L1_0x60_BMP}, + {18, 15, 18, 1, 0, helvB24L1_0x61_BMP}, + {20, 16, 25, 2, 0, helvB24L1_0x62_BMP}, + {18, 15, 18, 1, 0, helvB24L1_0x63_BMP}, + {20, 16, 25, 1, 0, helvB24L1_0x64_BMP}, + {18, 16, 18, 1, 0, helvB24L1_0x65_BMP}, + {11, 10, 25, 0, 0, helvB24L1_0x66_BMP}, + {20, 16, 25, 1, -7, helvB24L1_0x67_BMP}, + {20, 15, 25, 2, 0, helvB24L1_0x68_BMP}, + {9, 4, 25, 2, 0, helvB24L1_0x69_BMP}, + {9, 6, 32, 0, -7, helvB24L1_0x6A_BMP}, + {19, 15, 25, 2, 0, helvB24L1_0x6B_BMP}, + {9, 4, 25, 2, 0, helvB24L1_0x6C_BMP}, + {30, 24, 18, 2, 0, helvB24L1_0x6D_BMP}, + {20, 15, 18, 2, 0, helvB24L1_0x6E_BMP}, + {20, 17, 18, 1, 0, helvB24L1_0x6F_BMP}, + {20, 16, 25, 2, -7, helvB24L1_0x70_BMP}, + {20, 16, 25, 1, -7, helvB24L1_0x71_BMP}, + {13, 10, 18, 2, 0, helvB24L1_0x72_BMP}, + {19, 16, 18, 1, 0, helvB24L1_0x73_BMP}, + {11, 9, 22, 1, 0, helvB24L1_0x74_BMP}, + {20, 15, 18, 2, 0, helvB24L1_0x75_BMP}, + {19, 17, 18, 0, 0, helvB24L1_0x76_BMP}, + {26, 25, 18, 0, 0, helvB24L1_0x77_BMP}, + {19, 16, 18, 1, 0, helvB24L1_0x78_BMP}, + {19, 16, 25, 1, -7, helvB24L1_0x79_BMP}, + {17, 14, 18, 1, 0, helvB24L1_0x7A_BMP}, + {13, 9, 32, 2, -7, helvB24L1_0x7B_BMP}, + {9, 3, 31, 3, -6, helvB24L1_0x7C_BMP}, + {13, 9, 32, 2, -7, helvB24L1_0x7D_BMP}, + {19, 14, 6, 2, 5, helvB24L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {9, 1, 1, 0, 0, helvB24L1_0xA0_BMP}, + {11, 5, 24, 2, -6, helvB24L1_0xA1_BMP}, + {18, 15, 24, 1, -3, helvB24L1_0xA2_BMP}, + {18, 17, 24, 0, 0, helvB24L1_0xA3_BMP}, + {18, 15, 15, 1, 4, helvB24L1_0xA4_BMP}, + {18, 18, 24, 0, 0, helvB24L1_0xA5_BMP}, + {9, 3, 31, 3, -6, helvB24L1_0xA6_BMP}, + {18, 16, 32, 1, -7, helvB24L1_0xA7_BMP}, + {11, 10, 4, 0, 21, helvB24L1_0xA8_BMP}, + {24, 26, 25, 0, 0, helvB24L1_0xA9_BMP}, + {12, 9, 16, 1, 9, helvB24L1_0xAA_BMP}, + {18, 12, 13, 3, 2, helvB24L1_0xAB_BMP}, + {19, 16, 10, 1, 4, helvB24L1_0xAC_BMP}, + {11, 9, 5, 1, 7, helvB24L1_0xAD_BMP}, + {24, 26, 25, 0, 0, helvB24L1_0xAE_BMP}, + {11, 10, 3, 0, 21, helvB24L1_0xAF_BMP}, + {13, 9, 10, 2, 14, helvB24L1_0xB0_BMP}, + {19, 16, 22, 1, 0, helvB24L1_0xB1_BMP}, + {11, 10, 15, 0, 9, helvB24L1_0xB2_BMP}, + {11, 10, 15, 0, 9, helvB24L1_0xB3_BMP}, + {11, 6, 5, 4, 20, helvB24L1_0xB4_BMP}, + {20, 15, 25, 2, -7, helvB24L1_0xB5_BMP}, + {18, 17, 31, 0, -6, helvB24L1_0xB6_BMP}, + {9, 4, 5, 2, 11, helvB24L1_0xB7_BMP}, + {11, 7, 8, 2, -7, helvB24L1_0xB8_BMP}, + {11, 6, 15, 2, 9, helvB24L1_0xB9_BMP}, + {12, 10, 16, 1, 9, helvB24L1_0xBA_BMP}, + {18, 12, 12, 3, 3, helvB24L1_0xBB_BMP}, + {28, 26, 24, 0, 0, helvB24L1_0xBC_BMP}, + {28, 25, 24, 1, 0, helvB24L1_0xBD_BMP}, + {27, 25, 24, 1, 0, helvB24L1_0xBE_BMP}, + {20, 16, 24, 1, -6, helvB24L1_0xBF_BMP}, + {23, 22, 31, 0, 0, helvB24L1_0xC0_BMP}, + {23, 22, 31, 0, 0, helvB24L1_0xC1_BMP}, + {23, 22, 31, 0, 0, helvB24L1_0xC2_BMP}, + {23, 22, 30, 0, 0, helvB24L1_0xC3_BMP}, + {23, 22, 31, 0, 0, helvB24L1_0xC4_BMP}, + {23, 22, 31, 0, 0, helvB24L1_0xC5_BMP}, + {32, 31, 25, 0, 0, helvB24L1_0xC6_BMP}, + {23, 21, 32, 1, -7, helvB24L1_0xC7_BMP}, + {22, 18, 31, 2, 0, helvB24L1_0xC8_BMP}, + {22, 18, 31, 2, 0, helvB24L1_0xC9_BMP}, + {22, 18, 31, 2, 0, helvB24L1_0xCA_BMP}, + {22, 18, 31, 2, 0, helvB24L1_0xCB_BMP}, + {9, 8, 31, 0, 0, helvB24L1_0xCC_BMP}, + {9, 8, 31, 2, 0, helvB24L1_0xCD_BMP}, + {9, 10, 31, 0, 0, helvB24L1_0xCE_BMP}, + {9, 10, 31, 0, 0, helvB24L1_0xCF_BMP}, + {23, 23, 25, -1, 0, helvB24L1_0xD0_BMP}, + {24, 19, 30, 2, 0, helvB24L1_0xD1_BMP}, + {25, 23, 31, 1, 0, helvB24L1_0xD2_BMP}, + {25, 23, 31, 1, 0, helvB24L1_0xD3_BMP}, + {25, 23, 31, 1, 0, helvB24L1_0xD4_BMP}, + {25, 23, 30, 1, 0, helvB24L1_0xD5_BMP}, + {25, 23, 31, 1, 0, helvB24L1_0xD6_BMP}, + {19, 15, 16, 2, 0, helvB24L1_0xD7_BMP}, + {25, 24, 25, 1, 0, helvB24L1_0xD8_BMP}, + {24, 19, 31, 2, 0, helvB24L1_0xD9_BMP}, + {24, 19, 31, 2, 0, helvB24L1_0xDA_BMP}, + {24, 19, 31, 2, 0, helvB24L1_0xDB_BMP}, + {24, 19, 31, 2, 0, helvB24L1_0xDC_BMP}, + {22, 20, 31, 1, 0, helvB24L1_0xDD_BMP}, + {22, 18, 25, 2, 0, helvB24L1_0xDE_BMP}, + {20, 17, 25, 2, 0, helvB24L1_0xDF_BMP}, + {18, 15, 25, 1, 0, helvB24L1_0xE0_BMP}, + {18, 15, 25, 1, 0, helvB24L1_0xE1_BMP}, + {18, 15, 25, 1, 0, helvB24L1_0xE2_BMP}, + {18, 15, 24, 1, 0, helvB24L1_0xE3_BMP}, + {18, 15, 24, 1, 0, helvB24L1_0xE4_BMP}, + {18, 15, 25, 1, 0, helvB24L1_0xE5_BMP}, + {29, 26, 19, 1, 0, helvB24L1_0xE6_BMP}, + {18, 15, 25, 1, -7, helvB24L1_0xE7_BMP}, + {18, 16, 25, 1, 0, helvB24L1_0xE8_BMP}, + {18, 16, 25, 1, 0, helvB24L1_0xE9_BMP}, + {18, 16, 25, 1, 0, helvB24L1_0xEA_BMP}, + {18, 16, 24, 1, 0, helvB24L1_0xEB_BMP}, + {9, 7, 25, 1, 0, helvB24L1_0xEC_BMP}, + {9, 6, 25, 2, 0, helvB24L1_0xED_BMP}, + {9, 10, 25, -1, 0, helvB24L1_0xEE_BMP}, + {9, 10, 24, -1, 0, helvB24L1_0xEF_BMP}, + {20, 17, 26, 1, 0, helvB24L1_0xF0_BMP}, + {20, 15, 24, 2, 0, helvB24L1_0xF1_BMP}, + {20, 17, 25, 1, 0, helvB24L1_0xF2_BMP}, + {20, 17, 25, 1, 0, helvB24L1_0xF3_BMP}, + {20, 17, 25, 1, 0, helvB24L1_0xF4_BMP}, + {20, 17, 24, 1, 0, helvB24L1_0xF5_BMP}, + {20, 17, 24, 1, 0, helvB24L1_0xF6_BMP}, + {19, 16, 16, 1, 0, helvB24L1_0xF7_BMP}, + {20, 21, 18, -1, 0, helvB24L1_0xF8_BMP}, + {20, 15, 25, 2, 0, helvB24L1_0xF9_BMP}, + {20, 15, 25, 2, 0, helvB24L1_0xFA_BMP}, + {20, 15, 25, 2, 0, helvB24L1_0xFB_BMP}, + {20, 15, 25, 2, 0, helvB24L1_0xFC_BMP}, + {19, 16, 32, 1, -7, helvB24L1_0xFD_BMP}, + {20, 16, 32, 2, -7, helvB24L1_0xFE_BMP}, + {19, 16, 31, 1, -7, helvB24L1_0xFF_BMP} +}; + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontHelv24Bold_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontHelv24Bold_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontHelv24Bold_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontHelv24Bold_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontHelv24Bold_GetFontChar, + McuFontHelv24Bold_FBBy, + McuFontHelv24Bold_GetUnderlineBoxHeight(), + McuFontHelv24Bold_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv24Bold_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv24Bold_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv24Bold_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv24Bold_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontHelv24Bold. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv24Bold.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv24Bold.h new file mode 100644 index 0000000..36cc57a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv24Bold.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv24Bold.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv24Bold +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 24 +** Style : bold +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv24Bold_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv24Bold_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv24Bold_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv24Bold_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv24Bold_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv24Bold_Deinit(void); +** Init - void McuFontHelv24Bold_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv24Bold.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv24Bold_module McuFontHelv24Bold module documentation +** @{ +*/ + + +#ifndef __McuFontHelv24Bold_H +#define __McuFontHelv24Bold_H + +/* MODULE McuFontHelv24Bold. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontHelv24Boldconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontHelv24Bold_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontHelv24Bold_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontHelv24Bold_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontHelv24Bold_GetLineSpaceHeight() \ + 3 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontHelv24Bold_GetUnderlineBoxHeight() \ + 7 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontHelv24Bold_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontHelv24Bold_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontHelv24Bold. */ + +#endif +/* ifndef __McuFontHelv24Bold_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv24Normal.c b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv24Normal.c new file mode 100644 index 0000000..11009d9 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv24Normal.c @@ -0,0 +1,5473 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv24Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv24Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 24 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv24Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv24Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv24Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv24Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv24Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv24Normal_Deinit(void); +** Init - void McuFontHelv24Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv24Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv24Normal_module McuFontHelv24Normal module documentation +** @{ +*/ + +/* MODULE McuFontHelv24Normal. */ + +#include "McuFontHelv24Normal.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuFontHelv24Normal_FBBy 35 + +static const uint8_t helvR24L1_0x00_BMP[] = { + 0xAA, 0xAA, 0x80, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, + 0xAA, 0xAA, 0x80 +}; + +static const uint8_t helvR24L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t helvR24L1_0x21_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0x40, + 0x40, + 0x00, + 0x00, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvR24L1_0x22_BMP[] = { + 0xE7, + 0xE7, + 0xE7, + 0xE7, + 0xE7, + 0xE7, + 0x42, + 0x42 +}; + +static const uint8_t helvR24L1_0x23_BMP[] = { + 0x03, 0x87, 0x00, + 0x03, 0x87, 0x00, + 0x03, 0x06, 0x00, + 0x03, 0x06, 0x00, + 0x07, 0x0E, 0x00, + 0x07, 0x0E, 0x00, + 0x7F, 0xFF, 0x80, + 0x7F, 0xFF, 0x80, + 0x7F, 0xFF, 0x80, + 0x0E, 0x1C, 0x00, + 0x0E, 0x1C, 0x00, + 0x0C, 0x18, 0x00, + 0x1C, 0x38, 0x00, + 0x1C, 0x38, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0x38, 0x70, 0x00, + 0x38, 0x70, 0x00, + 0x30, 0x60, 0x00, + 0x30, 0x60, 0x00, + 0x70, 0xE0, 0x00, + 0x70, 0xE0, 0x00 +}; + +static const uint8_t helvR24L1_0x24_BMP[] = { + 0x01, 0x80, + 0x01, 0x80, + 0x01, 0x80, + 0x0F, 0xF0, + 0x1F, 0xF8, + 0x3D, 0xBC, + 0x71, 0x8E, + 0x71, 0x8E, + 0xE1, 0x8E, + 0xE1, 0x80, + 0xE1, 0x80, + 0x71, 0x80, + 0x7D, 0x80, + 0x3F, 0xC0, + 0x1F, 0xF0, + 0x07, 0xFC, + 0x01, 0xFE, + 0x01, 0x9E, + 0x01, 0x8F, + 0x01, 0x87, + 0xE1, 0x87, + 0xE1, 0x87, + 0x71, 0x8E, + 0x71, 0x8E, + 0x3D, 0xBC, + 0x3F, 0xF8, + 0x0F, 0xF0, + 0x01, 0x80, + 0x01, 0x80, + 0x01, 0x80, + 0x01, 0x80 +}; + +static const uint8_t helvR24L1_0x25_BMP[] = { + 0x00, 0x00, 0x30, 0x00, + 0x1F, 0x00, 0x70, 0x00, + 0x7F, 0x80, 0x60, 0x00, + 0x73, 0xC0, 0xE0, 0x00, + 0xE0, 0xC0, 0xC0, 0x00, + 0xC0, 0xE1, 0xC0, 0x00, + 0xC0, 0xE1, 0x80, 0x00, + 0xC0, 0xE3, 0x80, 0x00, + 0xE0, 0xC3, 0x00, 0x00, + 0x73, 0xC7, 0x00, 0x00, + 0x7F, 0x86, 0x00, 0x00, + 0x1F, 0x0E, 0x00, 0x00, + 0x00, 0x0C, 0x00, 0x00, + 0x00, 0x1C, 0x3E, 0x00, + 0x00, 0x18, 0x7F, 0x80, + 0x00, 0x38, 0xF3, 0x80, + 0x00, 0x30, 0xC1, 0xC0, + 0x00, 0x71, 0xC0, 0xC0, + 0x00, 0x61, 0xC0, 0xC0, + 0x00, 0xE1, 0xC0, 0xC0, + 0x00, 0xC0, 0xC1, 0xC0, + 0x01, 0xC0, 0xE3, 0x80, + 0x01, 0x80, 0x7F, 0x80, + 0x03, 0x80, 0x3E, 0x00 +}; + +static const uint8_t helvR24L1_0x26_BMP[] = { + 0x07, 0xC0, 0x00, + 0x0F, 0xE0, 0x00, + 0x1E, 0x70, 0x00, + 0x3C, 0x38, 0x00, + 0x38, 0x38, 0x00, + 0x38, 0x38, 0x00, + 0x3C, 0x70, 0x00, + 0x1E, 0xF0, 0x00, + 0x0F, 0xE0, 0x00, + 0x07, 0xC0, 0x00, + 0x0F, 0x80, 0x00, + 0x3F, 0xC0, 0x00, + 0x79, 0xC7, 0x00, + 0x70, 0xE7, 0x00, + 0xE0, 0xF6, 0x00, + 0xE0, 0x7E, 0x00, + 0xE0, 0x3C, 0x00, + 0xE0, 0x1C, 0x00, + 0xF0, 0x3E, 0x00, + 0x78, 0x7F, 0x00, + 0x7F, 0xF7, 0x80, + 0x3F, 0xE3, 0xC0, + 0x0F, 0x00, 0x00 +}; + +static const uint8_t helvR24L1_0x27_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0x40 +}; + +static const uint8_t helvR24L1_0x28_BMP[] = { + 0x06, + 0x0C, + 0x0C, + 0x18, + 0x18, + 0x38, + 0x30, + 0x70, + 0x70, + 0x70, + 0x60, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0x60, + 0x70, + 0x70, + 0x70, + 0x30, + 0x38, + 0x18, + 0x18, + 0x0C, + 0x0C, + 0x06 +}; + +static const uint8_t helvR24L1_0x29_BMP[] = { + 0xC0, + 0x60, + 0x60, + 0x30, + 0x30, + 0x38, + 0x18, + 0x1C, + 0x1C, + 0x1C, + 0x0C, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0E, + 0x0C, + 0x0C, + 0x1C, + 0x1C, + 0x18, + 0x18, + 0x38, + 0x30, + 0x70, + 0x60, + 0x60, + 0xC0 +}; + +static const uint8_t helvR24L1_0x2A_BMP[] = { + 0x0C, 0x00, + 0x0C, 0x00, + 0x4C, 0x80, + 0xED, 0xC0, + 0x7F, 0x80, + 0x3F, 0x00, + 0x1E, 0x00, + 0x3F, 0x00, + 0x73, 0x80, + 0xE1, 0xC0, + 0x40, 0x80 +}; + +static const uint8_t helvR24L1_0x2B_BMP[] = { + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00 +}; + +static const uint8_t helvR24L1_0x2C_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0x20, + 0x60, + 0x60, + 0xC0, + 0x80 +}; + +static const uint8_t helvR24L1_0x2D_BMP[] = { + 0xFF, + 0xFF +}; + +static const uint8_t helvR24L1_0x2E_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvR24L1_0x2F_BMP[] = { + 0x01, 0x80, + 0x01, 0x80, + 0x01, 0x80, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x08, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0xC0, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t helvR24L1_0x30_BMP[] = { + 0x07, 0xC0, + 0x1F, 0xF0, + 0x3F, 0xF8, + 0x3C, 0x78, + 0x78, 0x3C, + 0x70, 0x1C, + 0x70, 0x1C, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0x70, 0x1C, + 0x70, 0x1C, + 0x70, 0x3C, + 0x3C, 0x78, + 0x3F, 0xF8, + 0x1F, 0xF0, + 0x07, 0xC0 +}; + +static const uint8_t helvR24L1_0x31_BMP[] = { + 0x03, + 0x07, + 0x07, + 0x0F, + 0x3F, + 0xFF, + 0xFF, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07, + 0x07 +}; + +static const uint8_t helvR24L1_0x32_BMP[] = { + 0x07, 0xC0, + 0x1F, 0xF0, + 0x3F, 0xF8, + 0x78, 0x3C, + 0x70, 0x1C, + 0xF0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0x00, 0x0E, + 0x00, 0x1C, + 0x00, 0x3C, + 0x00, 0x78, + 0x00, 0xF0, + 0x03, 0xE0, + 0x07, 0xC0, + 0x1F, 0x00, + 0x3C, 0x00, + 0x78, 0x00, + 0x70, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xFF, 0xFE +}; + +static const uint8_t helvR24L1_0x33_BMP[] = { + 0x07, 0xC0, + 0x1F, 0xF0, + 0x3F, 0xF8, + 0x38, 0x38, + 0x70, 0x1C, + 0x70, 0x1C, + 0x70, 0x1C, + 0x70, 0x1C, + 0x00, 0x1C, + 0x00, 0x38, + 0x03, 0xF8, + 0x03, 0xF0, + 0x03, 0xF8, + 0x00, 0x3C, + 0x00, 0x1E, + 0x00, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0x70, 0x1C, + 0x78, 0x3C, + 0x3F, 0xF8, + 0x1F, 0xF0, + 0x07, 0xC0 +}; + +static const uint8_t helvR24L1_0x34_BMP[] = { + 0x00, 0x18, + 0x00, 0x38, + 0x00, 0x78, + 0x00, 0x78, + 0x00, 0xF8, + 0x01, 0xF8, + 0x03, 0xB8, + 0x03, 0xB8, + 0x07, 0x38, + 0x0E, 0x38, + 0x0E, 0x38, + 0x1C, 0x38, + 0x38, 0x38, + 0x38, 0x38, + 0x70, 0x38, + 0xE0, 0x38, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0x00, 0x38, + 0x00, 0x38, + 0x00, 0x38, + 0x00, 0x38, + 0x00, 0x38 +}; + +static const uint8_t helvR24L1_0x35_BMP[] = { + 0x3F, 0xFC, + 0x3F, 0xFC, + 0x3F, 0xFC, + 0x38, 0x00, + 0x38, 0x00, + 0x38, 0x00, + 0x70, 0x00, + 0x70, 0x00, + 0x77, 0xC0, + 0x7F, 0xF0, + 0x7F, 0xF8, + 0x78, 0x7C, + 0x70, 0x1C, + 0x00, 0x1E, + 0x00, 0x0E, + 0x00, 0x0E, + 0x00, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x1E, + 0xF0, 0x1C, + 0x78, 0x7C, + 0x7F, 0xF8, + 0x3F, 0xF0, + 0x0F, 0x80 +}; + +static const uint8_t helvR24L1_0x36_BMP[] = { + 0x03, 0xC0, + 0x0F, 0xF0, + 0x1F, 0xF8, + 0x3C, 0x38, + 0x38, 0x1C, + 0x70, 0x1C, + 0x70, 0x00, + 0x70, 0x00, + 0x60, 0x00, + 0xE3, 0xC0, + 0xEF, 0xF0, + 0xFF, 0xF8, + 0xF8, 0x3C, + 0xF0, 0x1C, + 0xF0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0x60, 0x0E, + 0x70, 0x0E, + 0x70, 0x1C, + 0x38, 0x3C, + 0x3F, 0xF8, + 0x1F, 0xF0, + 0x07, 0xC0 +}; + +static const uint8_t helvR24L1_0x37_BMP[] = { + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0x00, 0x0E, + 0x00, 0x1C, + 0x00, 0x18, + 0x00, 0x38, + 0x00, 0x70, + 0x00, 0x70, + 0x00, 0xE0, + 0x00, 0xE0, + 0x01, 0xC0, + 0x01, 0xC0, + 0x03, 0x80, + 0x03, 0x80, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t helvR24L1_0x38_BMP[] = { + 0x07, 0xC0, + 0x1F, 0xF0, + 0x3F, 0xF8, + 0x38, 0x3C, + 0x70, 0x1C, + 0x70, 0x1C, + 0x70, 0x1C, + 0x70, 0x1C, + 0x78, 0x3C, + 0x3C, 0x78, + 0x1F, 0xF0, + 0x0F, 0xE0, + 0x3F, 0xF8, + 0x78, 0x3C, + 0x70, 0x1C, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xF0, 0x1C, + 0x78, 0x3C, + 0x3F, 0xF8, + 0x1F, 0xF0, + 0x07, 0xC0 +}; + +static const uint8_t helvR24L1_0x39_BMP[] = { + 0x07, 0xC0, + 0x1F, 0xF0, + 0x3F, 0xF8, + 0x78, 0x7C, + 0x70, 0x3C, + 0xF0, 0x1C, + 0xE0, 0x1E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x1E, + 0xE0, 0x1E, + 0x70, 0x3E, + 0x7F, 0xFE, + 0x3F, 0xEE, + 0x0F, 0xCE, + 0x00, 0x0E, + 0x00, 0x1C, + 0xE0, 0x1C, + 0xF0, 0x3C, + 0x78, 0x78, + 0x3F, 0xF0, + 0x3F, 0xE0, + 0x0F, 0x80 +}; + +static const uint8_t helvR24L1_0x3A_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvR24L1_0x3B_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0x20, + 0x60, + 0x60, + 0xC0, + 0x80 +}; + +static const uint8_t helvR24L1_0x3C_BMP[] = { + 0x00, 0x03, + 0x00, 0x0F, + 0x00, 0x3F, + 0x01, 0xFC, + 0x07, 0xE0, + 0x1F, 0x80, + 0xFE, 0x00, + 0xF0, 0x00, + 0xF0, 0x00, + 0xFE, 0x00, + 0x1F, 0x80, + 0x07, 0xE0, + 0x01, 0xFC, + 0x00, 0x7F, + 0x00, 0x0F, + 0x00, 0x03 +}; + +static const uint8_t helvR24L1_0x3D_BMP[] = { + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xFF, 0xFE +}; + +static const uint8_t helvR24L1_0x3E_BMP[] = { + 0xC0, 0x00, + 0xF0, 0x00, + 0xFE, 0x00, + 0x3F, 0x80, + 0x07, 0xE0, + 0x01, 0xF8, + 0x00, 0x7F, + 0x00, 0x0F, + 0x00, 0x0F, + 0x00, 0x7F, + 0x01, 0xF8, + 0x07, 0xE0, + 0x3F, 0x80, + 0xFE, 0x00, + 0xF0, 0x00, + 0xC0, 0x00 +}; + +static const uint8_t helvR24L1_0x3F_BMP[] = { + 0x07, 0xC0, + 0x1F, 0xF0, + 0x3F, 0xF8, + 0x78, 0x38, + 0x70, 0x1C, + 0xF0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0x00, 0x1C, + 0x00, 0x38, + 0x00, 0x38, + 0x00, 0x70, + 0x00, 0xE0, + 0x01, 0xE0, + 0x01, 0xC0, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80 +}; + +static const uint8_t helvR24L1_0x40_BMP[] = { + 0x00, 0x07, 0xC0, 0x00, + 0x00, 0x3F, 0xF8, 0x00, + 0x00, 0xFF, 0xFE, 0x00, + 0x03, 0xF0, 0x3F, 0x80, + 0x07, 0xC0, 0x07, 0xC0, + 0x0F, 0x00, 0x03, 0xE0, + 0x1E, 0x00, 0x01, 0xE0, + 0x1C, 0x00, 0x00, 0xF0, + 0x38, 0x0F, 0x8C, 0x70, + 0x38, 0x1F, 0xDC, 0x38, + 0x70, 0x3C, 0xFC, 0x38, + 0x70, 0x70, 0x7C, 0x38, + 0x60, 0xE0, 0x38, 0x18, + 0xE0, 0xE0, 0x38, 0x18, + 0xE1, 0xE0, 0x38, 0x18, + 0xE1, 0xC0, 0x70, 0x38, + 0xE1, 0xC0, 0x70, 0x38, + 0xE1, 0xC0, 0x70, 0x70, + 0xE1, 0xC0, 0xE0, 0x70, + 0xE1, 0xE0, 0xE0, 0xE0, + 0x70, 0xF3, 0xF3, 0xC0, + 0x70, 0xFF, 0x7F, 0x80, + 0x78, 0x3E, 0x7F, 0x00, + 0x3C, 0x00, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0x00, + 0x0F, 0x80, 0x00, 0x00, + 0x03, 0xE0, 0x78, 0x00, + 0x01, 0xFF, 0xF8, 0x00, + 0x00, 0x7F, 0xE0, 0x00 +}; + +static const uint8_t helvR24L1_0x41_BMP[] = { + 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0xF8, 0x00, + 0x01, 0xF8, 0x00, + 0x01, 0xF8, 0x00, + 0x03, 0x9C, 0x00, + 0x03, 0x9C, 0x00, + 0x03, 0x9C, 0x00, + 0x07, 0x9E, 0x00, + 0x07, 0x0E, 0x00, + 0x07, 0x0E, 0x00, + 0x0F, 0x0F, 0x00, + 0x0F, 0x0F, 0x00, + 0x0E, 0x07, 0x00, + 0x1E, 0x07, 0x80, + 0x1F, 0xFF, 0x80, + 0x1F, 0xFF, 0x80, + 0x3F, 0xFF, 0xC0, + 0x3C, 0x03, 0xC0, + 0x38, 0x01, 0xC0, + 0x78, 0x01, 0xE0, + 0x78, 0x01, 0xE0, + 0x70, 0x00, 0xE0, + 0xF0, 0x00, 0xF0, + 0xF0, 0x00, 0xF0 +}; + +static const uint8_t helvR24L1_0x42_BMP[] = { + 0xFF, 0xF0, 0x00, + 0xFF, 0xFC, 0x00, + 0xFF, 0xFE, 0x00, + 0xE0, 0x3E, 0x00, + 0xE0, 0x0F, 0x00, + 0xE0, 0x0F, 0x00, + 0xE0, 0x07, 0x00, + 0xE0, 0x07, 0x00, + 0xE0, 0x0F, 0x00, + 0xE0, 0x0E, 0x00, + 0xE0, 0x3E, 0x00, + 0xFF, 0xFC, 0x00, + 0xFF, 0xFC, 0x00, + 0xFF, 0xFE, 0x00, + 0xE0, 0x1F, 0x00, + 0xE0, 0x07, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x07, 0x80, + 0xE0, 0x0F, 0x00, + 0xFF, 0xFE, 0x00, + 0xFF, 0xFE, 0x00, + 0xFF, 0xF8, 0x00 +}; + +static const uint8_t helvR24L1_0x43_BMP[] = { + 0x01, 0xFC, 0x00, + 0x07, 0xFF, 0x00, + 0x0F, 0xFF, 0x80, + 0x1F, 0x07, 0xC0, + 0x3C, 0x01, 0xE0, + 0x38, 0x00, 0xE0, + 0x70, 0x00, 0xF0, + 0x70, 0x00, 0x70, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x70, + 0xF0, 0x00, 0x70, + 0x70, 0x00, 0xF0, + 0x78, 0x00, 0xE0, + 0x3C, 0x01, 0xE0, + 0x3F, 0x07, 0xC0, + 0x1F, 0xFF, 0x80, + 0x07, 0xFE, 0x00, + 0x01, 0xF8, 0x00 +}; + +static const uint8_t helvR24L1_0x44_BMP[] = { + 0xFF, 0xF0, 0x00, + 0xFF, 0xFC, 0x00, + 0xFF, 0xFE, 0x00, + 0xE0, 0x1F, 0x00, + 0xE0, 0x0F, 0x00, + 0xE0, 0x07, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x03, 0xC0, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x07, 0x80, + 0xE0, 0x0F, 0x00, + 0xE0, 0x1E, 0x00, + 0xFF, 0xFE, 0x00, + 0xFF, 0xFC, 0x00, + 0xFF, 0xF0, 0x00 +}; + +static const uint8_t helvR24L1_0x45_BMP[] = { + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80 +}; + +static const uint8_t helvR24L1_0x46_BMP[] = { + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0xFC, + 0xFF, 0xFC, + 0xFF, 0xFC, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00 +}; + +static const uint8_t helvR24L1_0x47_BMP[] = { + 0x00, 0xFE, 0x00, + 0x03, 0xFF, 0x80, + 0x0F, 0xFF, 0xC0, + 0x1F, 0x83, 0xF0, + 0x3E, 0x00, 0xF0, + 0x3C, 0x00, 0x78, + 0x78, 0x00, 0x38, + 0x70, 0x00, 0x38, + 0xF0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x0F, 0xFC, + 0xE0, 0x0F, 0xFC, + 0xE0, 0x0F, 0xFC, + 0xE0, 0x00, 0x1C, + 0xF0, 0x00, 0x1C, + 0x70, 0x00, 0x1C, + 0x78, 0x00, 0x3C, + 0x38, 0x00, 0x3C, + 0x3C, 0x00, 0xFC, + 0x1F, 0x01, 0xFC, + 0x0F, 0xFF, 0xDC, + 0x07, 0xFF, 0x1C, + 0x01, 0xFC, 0x1C +}; + +static const uint8_t helvR24L1_0x48_BMP[] = { + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0 +}; + +static const uint8_t helvR24L1_0x49_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvR24L1_0x4A_BMP[] = { + 0x00, 0x38, + 0x00, 0x38, + 0x00, 0x38, + 0x00, 0x38, + 0x00, 0x38, + 0x00, 0x38, + 0x00, 0x38, + 0x00, 0x38, + 0x00, 0x38, + 0x00, 0x38, + 0x00, 0x38, + 0x00, 0x38, + 0x00, 0x38, + 0x00, 0x38, + 0x00, 0x38, + 0x00, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xF0, 0x78, + 0x78, 0xF0, + 0x7F, 0xF0, + 0x3F, 0xE0, + 0x1F, 0x80 +}; + +static const uint8_t helvR24L1_0x4B_BMP[] = { + 0xE0, 0x03, 0xC0, + 0xE0, 0x07, 0x80, + 0xE0, 0x0F, 0x00, + 0xE0, 0x1E, 0x00, + 0xE0, 0x3C, 0x00, + 0xE0, 0x78, 0x00, + 0xE0, 0xF0, 0x00, + 0xE1, 0xE0, 0x00, + 0xE3, 0xC0, 0x00, + 0xE7, 0xC0, 0x00, + 0xEF, 0x80, 0x00, + 0xFF, 0xC0, 0x00, + 0xFF, 0xC0, 0x00, + 0xF9, 0xE0, 0x00, + 0xF0, 0xF0, 0x00, + 0xE0, 0x70, 0x00, + 0xE0, 0x78, 0x00, + 0xE0, 0x3C, 0x00, + 0xE0, 0x1C, 0x00, + 0xE0, 0x1E, 0x00, + 0xE0, 0x0F, 0x00, + 0xE0, 0x07, 0x80, + 0xE0, 0x03, 0xC0, + 0xE0, 0x03, 0xE0, + 0xE0, 0x01, 0xF0 +}; + +static const uint8_t helvR24L1_0x4C_BMP[] = { + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xFF, 0xFC, + 0xFF, 0xFC, + 0xFF, 0xFC +}; + +static const uint8_t helvR24L1_0x4D_BMP[] = { + 0xF0, 0x00, 0x78, + 0xF0, 0x00, 0x78, + 0xF8, 0x00, 0xF8, + 0xF8, 0x00, 0xF8, + 0xFC, 0x01, 0xF8, + 0xFC, 0x01, 0xF8, + 0xFC, 0x01, 0xF8, + 0xEC, 0x01, 0xB8, + 0xEE, 0x03, 0xB8, + 0xEE, 0x03, 0xB8, + 0xE6, 0x03, 0x38, + 0xE7, 0x07, 0x38, + 0xE7, 0x07, 0x38, + 0xE3, 0x06, 0x38, + 0xE3, 0x8E, 0x38, + 0xE3, 0x8E, 0x38, + 0xE3, 0x8E, 0x38, + 0xE1, 0x8C, 0x38, + 0xE1, 0xDC, 0x38, + 0xE1, 0xDC, 0x38, + 0xE0, 0xD8, 0x38, + 0xE0, 0xF8, 0x38, + 0xE0, 0xF8, 0x38, + 0xE0, 0x70, 0x38, + 0xE0, 0x70, 0x38 +}; + +static const uint8_t helvR24L1_0x4E_BMP[] = { + 0xF0, 0x00, 0xE0, + 0xF0, 0x00, 0xE0, + 0xF8, 0x00, 0xE0, + 0xFC, 0x00, 0xE0, + 0xFC, 0x00, 0xE0, + 0xFE, 0x00, 0xE0, + 0xEF, 0x00, 0xE0, + 0xE7, 0x00, 0xE0, + 0xE7, 0x80, 0xE0, + 0xE3, 0xC0, 0xE0, + 0xE3, 0xC0, 0xE0, + 0xE1, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, + 0xE0, 0xF0, 0xE0, + 0xE0, 0x78, 0xE0, + 0xE0, 0x38, 0xE0, + 0xE0, 0x3C, 0xE0, + 0xE0, 0x1C, 0xE0, + 0xE0, 0x1E, 0xE0, + 0xE0, 0x0F, 0xE0, + 0xE0, 0x07, 0xE0, + 0xE0, 0x07, 0xE0, + 0xE0, 0x03, 0xE0, + 0xE0, 0x01, 0xE0, + 0xE0, 0x01, 0xE0 +}; + +static const uint8_t helvR24L1_0x4F_BMP[] = { + 0x00, 0xFE, 0x00, + 0x03, 0xFF, 0x80, + 0x0F, 0xEF, 0xE0, + 0x1F, 0x01, 0xF0, + 0x3E, 0x00, 0xF8, + 0x3C, 0x00, 0x78, + 0x78, 0x00, 0x3C, + 0x70, 0x00, 0x1C, + 0xF0, 0x00, 0x1E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xF0, 0x00, 0x1E, + 0xF0, 0x00, 0x1E, + 0x78, 0x00, 0x3C, + 0x3C, 0x00, 0x78, + 0x3E, 0x00, 0xF8, + 0x1F, 0x01, 0xF0, + 0x0F, 0xEF, 0xE0, + 0x03, 0xFF, 0x80, + 0x00, 0xFE, 0x00 +}; + +static const uint8_t helvR24L1_0x50_BMP[] = { + 0xFF, 0xF8, 0x00, + 0xFF, 0xFE, 0x00, + 0xFF, 0xFF, 0x00, + 0xE0, 0x0F, 0x00, + 0xE0, 0x07, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x07, 0x80, + 0xE0, 0x0F, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFE, 0x00, + 0xFF, 0xF8, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00 +}; + +static const uint8_t helvR24L1_0x51_BMP[] = { + 0x00, 0xFE, 0x00, + 0x03, 0xFF, 0x80, + 0x0F, 0xEF, 0xE0, + 0x1F, 0x01, 0xF0, + 0x3E, 0x00, 0xF8, + 0x3C, 0x00, 0x78, + 0x78, 0x00, 0x3C, + 0x70, 0x00, 0x1C, + 0xF0, 0x00, 0x1E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xF0, 0x00, 0x1E, + 0xF0, 0x02, 0x1E, + 0x78, 0x07, 0x3C, + 0x3C, 0x07, 0xB8, + 0x3E, 0x03, 0xF8, + 0x1F, 0x01, 0xF0, + 0x0F, 0xEF, 0xF8, + 0x03, 0xFF, 0xBC, + 0x00, 0xFE, 0x1E, + 0x00, 0x00, 0x0C +}; + +static const uint8_t helvR24L1_0x52_BMP[] = { + 0xFF, 0xFC, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x80, + 0xE0, 0x07, 0x80, + 0xE0, 0x03, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x03, 0xC0, + 0xE0, 0x03, 0x80, + 0xE0, 0x0F, 0x80, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFE, 0x00, + 0xFF, 0xFF, 0x00, + 0xE0, 0x0F, 0x80, + 0xE0, 0x07, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0xC0, + 0xE0, 0x03, 0xC0, + 0xE0, 0x03, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xE0 +}; + +static const uint8_t helvR24L1_0x53_BMP[] = { + 0x03, 0xF8, 0x00, + 0x0F, 0xFE, 0x00, + 0x1F, 0xFF, 0x00, + 0x3C, 0x0F, 0x80, + 0x38, 0x03, 0xC0, + 0x70, 0x01, 0xC0, + 0x70, 0x01, 0xC0, + 0x70, 0x00, 0x00, + 0x78, 0x00, 0x00, + 0x7C, 0x00, 0x00, + 0x3F, 0xC0, 0x00, + 0x1F, 0xF8, 0x00, + 0x07, 0xFF, 0x00, + 0x00, 0x7F, 0x80, + 0x00, 0x0F, 0xC0, + 0x00, 0x01, 0xE0, + 0x00, 0x00, 0xE0, + 0xE0, 0x00, 0xE0, + 0xF0, 0x00, 0xE0, + 0x70, 0x01, 0xE0, + 0x78, 0x01, 0xC0, + 0x3E, 0x07, 0xC0, + 0x3F, 0xFF, 0x80, + 0x0F, 0xFE, 0x00, + 0x03, 0xF8, 0x00 +}; + +static const uint8_t helvR24L1_0x54_BMP[] = { + 0xFF, 0xFF, 0xE0, + 0xFF, 0xFF, 0xE0, + 0xFF, 0xFF, 0xE0, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00 +}; + +static const uint8_t helvR24L1_0x55_BMP[] = { + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xF0, 0x03, 0xC0, + 0x78, 0x07, 0x80, + 0x7C, 0x0F, 0x80, + 0x3F, 0xFF, 0x00, + 0x1F, 0xFE, 0x00, + 0x03, 0xF0, 0x00 +}; + +static const uint8_t helvR24L1_0x56_BMP[] = { + 0xF0, 0x01, 0xE0, + 0xF0, 0x01, 0xE0, + 0xF0, 0x01, 0xE0, + 0x70, 0x01, 0xC0, + 0x78, 0x03, 0xC0, + 0x78, 0x03, 0xC0, + 0x38, 0x03, 0x80, + 0x38, 0x03, 0x80, + 0x3C, 0x07, 0x80, + 0x1C, 0x07, 0x00, + 0x1C, 0x07, 0x00, + 0x1E, 0x0F, 0x00, + 0x0E, 0x0E, 0x00, + 0x0E, 0x0E, 0x00, + 0x0F, 0x0E, 0x00, + 0x07, 0x1C, 0x00, + 0x07, 0x1C, 0x00, + 0x07, 0x9C, 0x00, + 0x03, 0xB8, 0x00, + 0x03, 0xB8, 0x00, + 0x03, 0xB8, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00 +}; + +static const uint8_t helvR24L1_0x57_BMP[] = { + 0xF0, 0x07, 0x00, 0x78, + 0xF0, 0x07, 0x00, 0x78, + 0xF0, 0x0F, 0x80, 0x78, + 0x70, 0x0F, 0x80, 0x70, + 0x70, 0x0F, 0x80, 0x70, + 0x78, 0x1D, 0xC0, 0xF0, + 0x78, 0x1D, 0xC0, 0xF0, + 0x38, 0x1D, 0xC0, 0xE0, + 0x38, 0x1D, 0xC0, 0xE0, + 0x38, 0x38, 0xE0, 0xE0, + 0x3C, 0x38, 0xE1, 0xE0, + 0x1C, 0x38, 0xE1, 0xC0, + 0x1C, 0x30, 0xE1, 0xC0, + 0x1C, 0x70, 0x71, 0xC0, + 0x1C, 0x70, 0x71, 0xC0, + 0x0E, 0x70, 0x73, 0x80, + 0x0E, 0xE0, 0x3B, 0x80, + 0x0E, 0xE0, 0x3B, 0x80, + 0x0E, 0xE0, 0x3B, 0x80, + 0x07, 0xE0, 0x3F, 0x80, + 0x07, 0xC0, 0x1F, 0x00, + 0x07, 0xC0, 0x1F, 0x00, + 0x07, 0xC0, 0x1F, 0x00, + 0x03, 0x80, 0x0E, 0x00, + 0x03, 0x80, 0x0E, 0x00 +}; + +static const uint8_t helvR24L1_0x58_BMP[] = { + 0xF8, 0x00, 0xF0, + 0x78, 0x01, 0xE0, + 0x3C, 0x03, 0xC0, + 0x1C, 0x03, 0xC0, + 0x1E, 0x07, 0x80, + 0x0F, 0x07, 0x00, + 0x0F, 0x0F, 0x00, + 0x07, 0x9E, 0x00, + 0x03, 0x9C, 0x00, + 0x03, 0xFC, 0x00, + 0x01, 0xF8, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, + 0x01, 0xF8, 0x00, + 0x01, 0xF8, 0x00, + 0x03, 0x9C, 0x00, + 0x07, 0x9E, 0x00, + 0x07, 0x0E, 0x00, + 0x0F, 0x0F, 0x00, + 0x1E, 0x07, 0x80, + 0x1E, 0x07, 0x80, + 0x3C, 0x03, 0xC0, + 0x78, 0x01, 0xE0, + 0x78, 0x01, 0xE0, + 0xF0, 0x00, 0xF0 +}; + +static const uint8_t helvR24L1_0x59_BMP[] = { + 0xF0, 0x00, 0x78, + 0x78, 0x00, 0xF0, + 0x78, 0x00, 0xE0, + 0x3C, 0x01, 0xE0, + 0x1C, 0x01, 0xC0, + 0x1E, 0x03, 0xC0, + 0x0E, 0x07, 0x80, + 0x0F, 0x07, 0x80, + 0x07, 0x8F, 0x00, + 0x03, 0x8E, 0x00, + 0x03, 0xDE, 0x00, + 0x01, 0xDC, 0x00, + 0x01, 0xFC, 0x00, + 0x00, 0xF8, 0x00, + 0x00, 0xF8, 0x00, + 0x00, 0x70, 0x00, + 0x00, 0x70, 0x00, + 0x00, 0x70, 0x00, + 0x00, 0x70, 0x00, + 0x00, 0x70, 0x00, + 0x00, 0x70, 0x00, + 0x00, 0x70, 0x00, + 0x00, 0x70, 0x00, + 0x00, 0x70, 0x00, + 0x00, 0x70, 0x00 +}; + +static const uint8_t helvR24L1_0x5A_BMP[] = { + 0x7F, 0xFF, 0xC0, + 0x7F, 0xFF, 0xC0, + 0x7F, 0xFF, 0xC0, + 0x00, 0x07, 0x80, + 0x00, 0x0F, 0x80, + 0x00, 0x0F, 0x00, + 0x00, 0x1E, 0x00, + 0x00, 0x3C, 0x00, + 0x00, 0x3C, 0x00, + 0x00, 0x78, 0x00, + 0x00, 0xF0, 0x00, + 0x01, 0xE0, 0x00, + 0x01, 0xE0, 0x00, + 0x03, 0xC0, 0x00, + 0x07, 0x80, 0x00, + 0x07, 0x80, 0x00, + 0x0F, 0x00, 0x00, + 0x1E, 0x00, 0x00, + 0x3C, 0x00, 0x00, + 0x3C, 0x00, 0x00, + 0x78, 0x00, 0x00, + 0xF0, 0x00, 0x00, + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xC0 +}; + +static const uint8_t helvR24L1_0x5B_BMP[] = { + 0xFC, + 0xFC, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xFC, + 0xFC +}; + +static const uint8_t helvR24L1_0x5C_BMP[] = { + 0xC0, 0x00, + 0xC0, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0x60, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x30, 0x00, + 0x10, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x18, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x0C, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x06, 0x00, + 0x02, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x03, 0x00, + 0x01, 0x80, + 0x01, 0x80 +}; + +static const uint8_t helvR24L1_0x5D_BMP[] = { + 0xFC, + 0xFC, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0xFC, + 0xFC +}; + +static const uint8_t helvR24L1_0x5E_BMP[] = { + 0x06, 0x00, + 0x0F, 0x00, + 0x0F, 0x00, + 0x1F, 0x80, + 0x19, 0x80, + 0x19, 0x80, + 0x39, 0xC0, + 0x30, 0xC0, + 0x70, 0xE0, + 0x60, 0x60, + 0x60, 0x60, + 0xE0, 0x70, + 0xC0, 0x30 +}; + +static const uint8_t helvR24L1_0x5F_BMP[] = { + 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xC0 +}; + +static const uint8_t helvR24L1_0x60_BMP[] = { + 0xE0, + 0xF0, + 0x70, + 0x38, + 0x1C +}; + +static const uint8_t helvR24L1_0x61_BMP[] = { + 0x0F, 0xE0, + 0x3F, 0xF8, + 0x3C, 0x78, + 0x70, 0x3C, + 0x70, 0x1C, + 0x00, 0x1C, + 0x00, 0x3C, + 0x01, 0xFC, + 0x1F, 0xFC, + 0x7E, 0x1C, + 0x78, 0x1C, + 0xF0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x3C, + 0xE0, 0x7C, + 0x79, 0xFE, + 0x7F, 0xDF, + 0x3F, 0x8F +}; + +static const uint8_t helvR24L1_0x62_BMP[] = { + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE3, 0xE0, + 0xEF, 0xF0, + 0xFF, 0xF8, + 0xF8, 0x3C, + 0xF0, 0x1C, + 0xF0, 0x1E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xF0, 0x1E, + 0xF0, 0x1C, + 0xFC, 0x3C, + 0xFF, 0xF8, + 0xEF, 0xF0, + 0xE7, 0xE0 +}; + +static const uint8_t helvR24L1_0x63_BMP[] = { + 0x07, 0xC0, + 0x1F, 0xF0, + 0x3F, 0xF8, + 0x38, 0x3C, + 0x70, 0x1C, + 0x70, 0x1C, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0x70, 0x1C, + 0x78, 0x38, + 0x3F, 0xF8, + 0x1F, 0xF0, + 0x07, 0xC0 +}; + +static const uint8_t helvR24L1_0x64_BMP[] = { + 0x00, 0x0E, + 0x00, 0x0E, + 0x00, 0x0E, + 0x00, 0x0E, + 0x00, 0x0E, + 0x00, 0x0E, + 0x00, 0x0E, + 0x07, 0xCE, + 0x1F, 0xEE, + 0x3F, 0xFE, + 0x7C, 0x3E, + 0x70, 0x1E, + 0xF0, 0x1E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xF0, 0x1E, + 0xF0, 0x1E, + 0x78, 0x3E, + 0x7F, 0xFE, + 0x3F, 0xEE, + 0x0F, 0xCE +}; + +static const uint8_t helvR24L1_0x65_BMP[] = { + 0x07, 0xC0, + 0x1F, 0xF0, + 0x3F, 0xF8, + 0x78, 0x3C, + 0x70, 0x1C, + 0xF0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xE0, 0x00, + 0xE0, 0x00, + 0xF0, 0x0E, + 0x70, 0x1E, + 0x78, 0x3C, + 0x3F, 0xF8, + 0x1F, 0xF0, + 0x07, 0xC0 +}; + +static const uint8_t helvR24L1_0x66_BMP[] = { + 0x0F, + 0x1F, + 0x3C, + 0x38, + 0x38, + 0x38, + 0x38, + 0xFF, + 0xFF, + 0xFF, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38 +}; + +static const uint8_t helvR24L1_0x67_BMP[] = { + 0x07, 0xCE, + 0x1F, 0xEE, + 0x3F, 0xFE, + 0x7C, 0x3E, + 0x70, 0x1E, + 0xF0, 0x1E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xF0, 0x1E, + 0x70, 0x3E, + 0x78, 0x3E, + 0x3F, 0xFE, + 0x1F, 0xEE, + 0x07, 0x8E, + 0x00, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x1C, + 0xF0, 0x1C, + 0x7C, 0x78, + 0x3F, 0xF8, + 0x1F, 0xE0 +}; + +static const uint8_t helvR24L1_0x68_BMP[] = { + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE3, 0xE0, + 0xEF, 0xF0, + 0xFF, 0xF8, + 0xF8, 0x3C, + 0xF0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C +}; + +static const uint8_t helvR24L1_0x69_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0x00, + 0x00, + 0x00, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvR24L1_0x6A_BMP[] = { + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x00, + 0x00, + 0x00, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x3C, + 0xFC, + 0xF8 +}; + +static const uint8_t helvR24L1_0x6B_BMP[] = { + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x78, + 0xE0, 0xF0, + 0xE1, 0xE0, + 0xE3, 0xC0, + 0xE7, 0x80, + 0xEF, 0x00, + 0xFF, 0x00, + 0xFF, 0x00, + 0xFB, 0x80, + 0xF3, 0xC0, + 0xE1, 0xC0, + 0xE1, 0xE0, + 0xE0, 0xE0, + 0xE0, 0xF0, + 0xE0, 0x78, + 0xE0, 0x38, + 0xE0, 0x3C, + 0xE0, 0x1E +}; + +static const uint8_t helvR24L1_0x6C_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvR24L1_0x6D_BMP[] = { + 0xE3, 0xC0, 0xF0, + 0xEF, 0xF3, 0xFC, + 0xFF, 0xF7, 0xFC, + 0xF8, 0x7E, 0x1E, + 0xF0, 0x3C, 0x0E, + 0xE0, 0x38, 0x0E, + 0xE0, 0x38, 0x0E, + 0xE0, 0x38, 0x0E, + 0xE0, 0x38, 0x0E, + 0xE0, 0x38, 0x0E, + 0xE0, 0x38, 0x0E, + 0xE0, 0x38, 0x0E, + 0xE0, 0x38, 0x0E, + 0xE0, 0x38, 0x0E, + 0xE0, 0x38, 0x0E, + 0xE0, 0x38, 0x0E, + 0xE0, 0x38, 0x0E, + 0xE0, 0x38, 0x0E +}; + +static const uint8_t helvR24L1_0x6E_BMP[] = { + 0xE3, 0xE0, + 0xEF, 0xF8, + 0xFF, 0xF8, + 0xF8, 0x3C, + 0xF0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C +}; + +static const uint8_t helvR24L1_0x6F_BMP[] = { + 0x07, 0xC0, + 0x1F, 0xF0, + 0x3F, 0xF8, + 0x78, 0x3C, + 0x70, 0x1C, + 0xF0, 0x1E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xF0, 0x1E, + 0x70, 0x1C, + 0x78, 0x3C, + 0x3F, 0xF8, + 0x1F, 0xF0, + 0x07, 0xC0 +}; + +static const uint8_t helvR24L1_0x70_BMP[] = { + 0x03, 0xC0, + 0xEF, 0xF0, + 0xFF, 0xF8, + 0xF8, 0x3C, + 0xF0, 0x1C, + 0xF0, 0x1E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xF0, 0x1E, + 0xF0, 0x1C, + 0xF8, 0x3C, + 0xFF, 0xF8, + 0xEF, 0xF0, + 0xE7, 0xE0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00 +}; + +static const uint8_t helvR24L1_0x71_BMP[] = { + 0x07, 0xC0, + 0x1F, 0xEE, + 0x3F, 0xFE, + 0x7C, 0x3E, + 0x70, 0x1E, + 0xF0, 0x1E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xF0, 0x1E, + 0x70, 0x1E, + 0x78, 0x3E, + 0x3F, 0xFE, + 0x1F, 0xEE, + 0x0F, 0xCE, + 0x00, 0x0E, + 0x00, 0x0E, + 0x00, 0x0E, + 0x00, 0x0E, + 0x00, 0x0E, + 0x00, 0x0E, + 0x00, 0x0E +}; + +static const uint8_t helvR24L1_0x72_BMP[] = { + 0xE7, + 0xEF, + 0xFF, + 0xFC, + 0xF0, + 0xF0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvR24L1_0x73_BMP[] = { + 0x0F, 0x80, + 0x3F, 0xE0, + 0x7F, 0xE0, + 0x70, 0xF0, + 0xE0, 0x70, + 0xE0, 0x00, + 0x70, 0x00, + 0x7E, 0x00, + 0x3F, 0xC0, + 0x07, 0xF0, + 0x00, 0xF0, + 0x00, 0x78, + 0xE0, 0x38, + 0xE0, 0x38, + 0xF0, 0x70, + 0x7F, 0xF0, + 0x7F, 0xE0, + 0x1F, 0x80 +}; + +static const uint8_t helvR24L1_0x74_BMP[] = { + 0x38, + 0x38, + 0x38, + 0x38, + 0xFF, + 0xFF, + 0xFF, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x3C, + 0x3F, + 0x1F +}; + +static const uint8_t helvR24L1_0x75_BMP[] = { + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x3C, + 0xF0, 0x7C, + 0x7F, 0xFC, + 0x7F, 0xDC, + 0x1F, 0x1C +}; + +static const uint8_t helvR24L1_0x76_BMP[] = { + 0xE0, 0x0E, + 0xE0, 0x0E, + 0x70, 0x1C, + 0x70, 0x1C, + 0x70, 0x1C, + 0x38, 0x38, + 0x38, 0x38, + 0x38, 0x38, + 0x1C, 0x70, + 0x1C, 0x70, + 0x1C, 0x70, + 0x0E, 0xE0, + 0x0E, 0xE0, + 0x0E, 0xE0, + 0x07, 0xC0, + 0x07, 0xC0, + 0x03, 0x80, + 0x03, 0x80 +}; + +static const uint8_t helvR24L1_0x77_BMP[] = { + 0xE0, 0x38, 0x0E, + 0xE0, 0x38, 0x0E, + 0x70, 0x7C, 0x1C, + 0x70, 0x7C, 0x1C, + 0x70, 0x6C, 0x1C, + 0x38, 0xEE, 0x1C, + 0x38, 0xEE, 0x38, + 0x38, 0xEE, 0x38, + 0x38, 0xC6, 0x38, + 0x18, 0xC6, 0x30, + 0x1D, 0xC7, 0x70, + 0x1D, 0xC7, 0x70, + 0x1D, 0xC7, 0x70, + 0x0D, 0x83, 0x60, + 0x0F, 0x83, 0xE0, + 0x0F, 0x83, 0xE0, + 0x07, 0x01, 0xC0, + 0x07, 0x01, 0xC0 +}; + +static const uint8_t helvR24L1_0x78_BMP[] = { + 0xF0, 0x1E, + 0x78, 0x1C, + 0x38, 0x38, + 0x3C, 0x70, + 0x1C, 0x70, + 0x0E, 0xE0, + 0x0F, 0xE0, + 0x07, 0xC0, + 0x03, 0x80, + 0x07, 0xC0, + 0x07, 0xC0, + 0x0F, 0xE0, + 0x1E, 0xE0, + 0x1C, 0x70, + 0x38, 0x78, + 0x38, 0x38, + 0x70, 0x1C, + 0xF0, 0x1E +}; + +static const uint8_t helvR24L1_0x79_BMP[] = { + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xF0, 0x38, + 0x70, 0x38, + 0x70, 0x38, + 0x70, 0x70, + 0x38, 0x70, + 0x38, 0x70, + 0x38, 0xE0, + 0x3C, 0xE0, + 0x1C, 0xE0, + 0x1D, 0xC0, + 0x1D, 0xC0, + 0x0F, 0xC0, + 0x0F, 0x80, + 0x0F, 0x80, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x1C, 0x00, + 0x7C, 0x00, + 0x78, 0x00, + 0x70, 0x00 +}; + +static const uint8_t helvR24L1_0x7A_BMP[] = { + 0x7F, 0xF8, + 0x7F, 0xF8, + 0x7F, 0xF8, + 0x00, 0x78, + 0x00, 0xF0, + 0x00, 0xE0, + 0x01, 0xC0, + 0x03, 0xC0, + 0x07, 0x80, + 0x07, 0x00, + 0x0E, 0x00, + 0x1C, 0x00, + 0x3C, 0x00, + 0x78, 0x00, + 0x70, 0x00, + 0xFF, 0xFC, + 0xFF, 0xFC, + 0xFF, 0xFC +}; + +static const uint8_t helvR24L1_0x7B_BMP[] = { + 0x0F, + 0x1F, + 0x1C, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x38, + 0x38, + 0x70, + 0xE0, + 0xE0, + 0x70, + 0x38, + 0x38, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x1C, + 0x1F, + 0x0F +}; + +static const uint8_t helvR24L1_0x7C_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR24L1_0x7D_BMP[] = { + 0xF0, + 0xF8, + 0x38, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x1C, + 0x1C, + 0x0E, + 0x07, + 0x07, + 0x0E, + 0x1C, + 0x1C, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x38, + 0xF8, + 0xF0 +}; + +static const uint8_t helvR24L1_0x7E_BMP[] = { + 0x18, 0x00, + 0x7C, 0x0C, + 0x7F, 0x0C, + 0xC7, 0xDC, + 0xC1, 0xF8, + 0x00, 0xF0 +}; + +static const uint8_t helvR24L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t helvR24L1_0xA1_BMP[] = { + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0x00, + 0x00, + 0x40, + 0x40, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0, + 0xE0 +}; + +static const uint8_t helvR24L1_0xA2_BMP[] = { + 0x00, 0x20, + 0x00, 0x60, + 0x00, 0x40, + 0x07, 0xE0, + 0x1F, 0xF0, + 0x3C, 0xF8, + 0x78, 0xBC, + 0x70, 0x9C, + 0x70, 0x9C, + 0xE1, 0x80, + 0xE1, 0x00, + 0xE1, 0x00, + 0xE3, 0x00, + 0xE3, 0x00, + 0xE2, 0x0C, + 0xE2, 0x1C, + 0x76, 0x1C, + 0x7C, 0x3C, + 0x3C, 0x78, + 0x1F, 0xF0, + 0x0F, 0xE0, + 0x08, 0x00, + 0x18, 0x00, + 0x10, 0x00, + 0x10, 0x00 +}; + +static const uint8_t helvR24L1_0xA3_BMP[] = { + 0x03, 0xC0, + 0x0F, 0xF8, + 0x1F, 0xFC, + 0x3C, 0x3C, + 0x78, 0x1E, + 0x70, 0x0E, + 0x70, 0x0E, + 0x70, 0x00, + 0x70, 0x00, + 0x38, 0x00, + 0x38, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0, + 0x0C, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x0C, 0x00, + 0x1C, 0x00, + 0x18, 0x00, + 0x38, 0x00, + 0x73, 0x86, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0x60, 0x7C +}; + +static const uint8_t helvR24L1_0xA4_BMP[] = { + 0xE6, 0x30, + 0xFF, 0xF0, + 0x7F, 0xF0, + 0x70, 0xE0, + 0x60, 0x60, + 0xE0, 0x70, + 0xE0, 0x70, + 0xE0, 0x70, + 0x60, 0x60, + 0x70, 0xE0, + 0x7F, 0xF0, + 0xFF, 0xF0, + 0xE6, 0x30 +}; + +static const uint8_t helvR24L1_0xA5_BMP[] = { + 0xE0, 0x07, + 0xE0, 0x07, + 0x70, 0x0E, + 0x70, 0x0E, + 0x38, 0x1C, + 0x38, 0x1C, + 0x1C, 0x38, + 0x1C, 0x38, + 0x0E, 0x70, + 0x0E, 0x70, + 0x07, 0xE0, + 0x7F, 0xFE, + 0x7F, 0xFE, + 0x7F, 0xFE, + 0x01, 0xC0, + 0x01, 0xC0, + 0x7F, 0xFE, + 0x7F, 0xFE, + 0x7F, 0xFE, + 0x01, 0xC0, + 0x01, 0xC0, + 0x01, 0xC0, + 0x01, 0xC0, + 0x01, 0xC0 +}; + +static const uint8_t helvR24L1_0xA6_BMP[] = { + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0, + 0xC0 +}; + +static const uint8_t helvR24L1_0xA7_BMP[] = { + 0x03, 0xC0, + 0x0F, 0xF0, + 0x1F, 0xF8, + 0x1C, 0x78, + 0x38, 0x3C, + 0x38, 0x1C, + 0x38, 0x1C, + 0x3C, 0x00, + 0x1E, 0x00, + 0x1F, 0x80, + 0x3F, 0xE0, + 0x71, 0xF0, + 0xE0, 0xF8, + 0xE0, 0x7C, + 0xE0, 0x1C, + 0xE0, 0x1E, + 0x70, 0x0E, + 0x7C, 0x0E, + 0x3E, 0x0E, + 0x1F, 0x1C, + 0x0F, 0x9C, + 0x03, 0xF8, + 0x01, 0xF0, + 0x00, 0xF0, + 0x00, 0x78, + 0x70, 0x38, + 0x70, 0x38, + 0x78, 0x38, + 0x38, 0x70, + 0x3F, 0xF0, + 0x1F, 0xE0, + 0x07, 0x80 +}; + +static const uint8_t helvR24L1_0xA8_BMP[] = { + 0xE7, + 0xE7, + 0xE7 +}; + +static const uint8_t helvR24L1_0xA9_BMP[] = { + 0x00, 0xFE, 0x00, + 0x03, 0xFF, 0x80, + 0x07, 0x01, 0xE0, + 0x0C, 0x00, 0x70, + 0x18, 0x00, 0x18, + 0x30, 0x7E, 0x0C, + 0x60, 0xFF, 0x86, + 0x61, 0xC1, 0xC6, + 0xC3, 0x80, 0xC3, + 0xC3, 0x00, 0x03, + 0xC7, 0x00, 0x03, + 0x86, 0x00, 0x01, + 0x86, 0x00, 0x01, + 0x86, 0x00, 0x01, + 0x86, 0x00, 0x01, + 0xC7, 0x00, 0x03, + 0xC3, 0x80, 0xC3, + 0x61, 0xE1, 0xC6, + 0x60, 0xFF, 0x86, + 0x30, 0x3E, 0x0C, + 0x18, 0x00, 0x18, + 0x1C, 0x00, 0x38, + 0x07, 0x01, 0xE0, + 0x03, 0xFF, 0x80, + 0x00, 0xFE, 0x00 +}; + +static const uint8_t helvR24L1_0xAA_BMP[] = { + 0x3F, 0x00, + 0x77, 0x80, + 0x61, 0x80, + 0x01, 0x80, + 0x07, 0x80, + 0x7F, 0x80, + 0xE1, 0x80, + 0xC1, 0x80, + 0xC3, 0x80, + 0xE7, 0x80, + 0x7D, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t helvR24L1_0xAB_BMP[] = { + 0x1C, 0x70, + 0x38, 0xE0, + 0x71, 0xC0, + 0xE3, 0x80, + 0xC3, 0x00, + 0xE3, 0x80, + 0x71, 0xC0, + 0x38, 0xE0, + 0x1C, 0x70 +}; + +static const uint8_t helvR24L1_0xAC_BMP[] = { + 0xFF, 0xFF, + 0xFF, 0xFF, + 0xFF, 0xFF, + 0x00, 0x07, + 0x00, 0x07, + 0x00, 0x07, + 0x00, 0x07, + 0x00, 0x07, + 0x00, 0x07 +}; + +static const uint8_t helvR24L1_0xAD_BMP[] = { + 0xFF, + 0xFF +}; + +static const uint8_t helvR24L1_0xAE_BMP[] = { + 0x00, 0x7E, 0x00, + 0x03, 0xFF, 0x80, + 0x07, 0x01, 0xE0, + 0x0C, 0x00, 0x70, + 0x18, 0x00, 0x18, + 0x30, 0x00, 0x0C, + 0x61, 0xFF, 0x06, + 0x61, 0xFF, 0x86, + 0xC1, 0x81, 0xC3, + 0xC1, 0x80, 0xC3, + 0xC1, 0x80, 0xC3, + 0x81, 0x81, 0x81, + 0x81, 0xFF, 0x01, + 0x81, 0xFC, 0x01, + 0x81, 0x8E, 0x01, + 0xC1, 0x86, 0x03, + 0xC1, 0x83, 0x03, + 0x61, 0x81, 0x86, + 0x61, 0x81, 0xC6, + 0x30, 0x00, 0x0C, + 0x18, 0x00, 0x18, + 0x1C, 0x00, 0x38, + 0x07, 0x01, 0xE0, + 0x03, 0xFF, 0x80, + 0x00, 0x7E, 0x00 +}; + +static const uint8_t helvR24L1_0xAF_BMP[] = { + 0xFF, 0x80, + 0xFF, 0x80 +}; + +static const uint8_t helvR24L1_0xB0_BMP[] = { + 0x3E, 0x00, + 0x7F, 0x00, + 0xE3, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xE3, 0x80, + 0x7F, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvR24L1_0xB1_BMP[] = { + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80 +}; + +static const uint8_t helvR24L1_0xB2_BMP[] = { + 0x1E, 0x00, + 0x7F, 0x00, + 0x63, 0x00, + 0xC1, 0x80, + 0xC1, 0x80, + 0x01, 0x80, + 0x03, 0x00, + 0x07, 0x00, + 0x1E, 0x00, + 0x38, 0x00, + 0x70, 0x00, + 0xE0, 0x00, + 0xC0, 0x00, + 0xFF, 0x80, + 0xFF, 0x80 +}; + +static const uint8_t helvR24L1_0xB3_BMP[] = { + 0x3E, 0x00, + 0x7F, 0x00, + 0xE3, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0x03, 0x80, + 0x0F, 0x00, + 0x0F, 0x00, + 0x03, 0x80, + 0x01, 0x80, + 0xC1, 0x80, + 0xC1, 0x80, + 0xE3, 0x80, + 0x7F, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvR24L1_0xB4_BMP[] = { + 0x1E, + 0x3C, + 0x38, + 0x70, + 0xE0 +}; + +static const uint8_t helvR24L1_0xB5_BMP[] = { + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x3C, + 0xF0, 0x7C, + 0xFF, 0xFC, + 0xFF, 0xDC, + 0xFF, 0x1C, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00 +}; + +static const uint8_t helvR24L1_0xB6_BMP[] = { + 0x07, 0xFF, + 0x1F, 0xFF, + 0x3F, 0x8C, + 0x3F, 0x8C, + 0x7F, 0x8C, + 0x7F, 0x8C, + 0xFF, 0x8C, + 0xFF, 0x8C, + 0xFF, 0x8C, + 0xFF, 0x8C, + 0x7F, 0x8C, + 0x7F, 0x8C, + 0x3F, 0x8C, + 0x3F, 0x8C, + 0x1F, 0x8C, + 0x03, 0x8C, + 0x01, 0x8C, + 0x01, 0x8C, + 0x01, 0x8C, + 0x01, 0x8C, + 0x01, 0x8C, + 0x01, 0x8C, + 0x01, 0x8C, + 0x01, 0x8C, + 0x01, 0x8C, + 0x01, 0x8C, + 0x01, 0x8C, + 0x01, 0x8C, + 0x01, 0x8C, + 0x01, 0x8C +}; + +static const uint8_t helvR24L1_0xB7_BMP[] = { + 0x60, + 0xF0, + 0xF0, + 0x60 +}; + +static const uint8_t helvR24L1_0xB8_BMP[] = { + 0x18, + 0x18, + 0x3C, + 0x0E, + 0x06, + 0xCE, + 0x7C +}; + +static const uint8_t helvR24L1_0xB9_BMP[] = { + 0x18, + 0x38, + 0xF8, + 0xF8, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18, + 0x18 +}; + +static const uint8_t helvR24L1_0xBA_BMP[] = { + 0x1E, 0x00, + 0x7F, 0x80, + 0x61, 0x80, + 0xE1, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xC0, 0xC0, + 0xE1, 0xC0, + 0x61, 0x80, + 0x7F, 0x80, + 0x1E, 0x00, + 0x00, 0x00, + 0xFF, 0xC0, + 0xFF, 0xC0 +}; + +static const uint8_t helvR24L1_0xBB_BMP[] = { + 0xE3, 0x80, + 0x71, 0xC0, + 0x38, 0xE0, + 0x1C, 0x70, + 0x0C, 0x30, + 0x1C, 0x70, + 0x38, 0xE0, + 0x71, 0xC0, + 0xE3, 0x80 +}; + +static const uint8_t helvR24L1_0xBC_BMP[] = { + 0x00, 0x00, 0x30, 0x00, + 0x18, 0x00, 0x70, 0x00, + 0x38, 0x00, 0x60, 0x00, + 0xF8, 0x00, 0xE0, 0x00, + 0xF8, 0x01, 0xC0, 0x00, + 0x18, 0x01, 0x80, 0x00, + 0x18, 0x03, 0x80, 0x00, + 0x18, 0x03, 0x00, 0x00, + 0x18, 0x07, 0x00, 0x00, + 0x18, 0x0E, 0x00, 0x00, + 0x18, 0x0C, 0x00, 0x00, + 0x18, 0x1C, 0x06, 0x00, + 0x18, 0x18, 0x0E, 0x00, + 0x18, 0x38, 0x1E, 0x00, + 0x18, 0x70, 0x3E, 0x00, + 0x18, 0x60, 0x76, 0x00, + 0x00, 0xE0, 0x66, 0x00, + 0x01, 0xC0, 0xC6, 0x00, + 0x01, 0x81, 0xC6, 0x00, + 0x03, 0x83, 0x86, 0x00, + 0x03, 0x03, 0xFF, 0x80, + 0x07, 0x03, 0xFF, 0x80, + 0x06, 0x00, 0x06, 0x00, + 0x0E, 0x00, 0x06, 0x00, + 0x0C, 0x00, 0x06, 0x00 +}; + +static const uint8_t helvR24L1_0xBD_BMP[] = { + 0x00, 0x00, 0x60, 0x00, + 0x18, 0x00, 0xE0, 0x00, + 0x38, 0x00, 0xC0, 0x00, + 0xF8, 0x01, 0x80, 0x00, + 0xF8, 0x03, 0x80, 0x00, + 0x18, 0x03, 0x00, 0x00, + 0x18, 0x06, 0x00, 0x00, + 0x18, 0x0E, 0x00, 0x00, + 0x18, 0x0C, 0x00, 0x00, + 0x18, 0x1C, 0x00, 0x00, + 0x18, 0x18, 0x00, 0x00, + 0x18, 0x38, 0x3C, 0x00, + 0x18, 0x30, 0xFF, 0x00, + 0x18, 0x70, 0xC3, 0x80, + 0x18, 0x61, 0x81, 0x80, + 0x18, 0xC1, 0x81, 0x80, + 0x01, 0xC0, 0x03, 0x80, + 0x01, 0x80, 0x07, 0x00, + 0x03, 0x80, 0x0E, 0x00, + 0x03, 0x00, 0x3C, 0x00, + 0x06, 0x00, 0x70, 0x00, + 0x0E, 0x00, 0xE0, 0x00, + 0x0C, 0x01, 0xC0, 0x00, + 0x1C, 0x01, 0xFF, 0x80, + 0x18, 0x01, 0xFF, 0x80 +}; + +static const uint8_t helvR24L1_0xBE_BMP[] = { + 0x3E, 0x00, 0x0E, 0x00, + 0x7F, 0x00, 0x0C, 0x00, + 0x63, 0x80, 0x18, 0x00, + 0xC1, 0x80, 0x38, 0x00, + 0xC1, 0x80, 0x30, 0x00, + 0x03, 0x80, 0x60, 0x00, + 0x0F, 0x00, 0xE0, 0x00, + 0x0F, 0x80, 0xC0, 0x00, + 0x01, 0xC1, 0x80, 0x00, + 0x00, 0xC3, 0x80, 0x00, + 0xC0, 0xC3, 0x06, 0x00, + 0xC0, 0xC7, 0x0E, 0x00, + 0x61, 0xCE, 0x1E, 0x00, + 0x7F, 0x8C, 0x3E, 0x00, + 0x1E, 0x18, 0x76, 0x00, + 0x00, 0x38, 0x66, 0x00, + 0x00, 0x30, 0xC6, 0x00, + 0x00, 0x61, 0xC6, 0x00, + 0x00, 0xE3, 0x86, 0x00, + 0x01, 0xC3, 0xFF, 0x80, + 0x01, 0x83, 0xFF, 0x80, + 0x03, 0x00, 0x06, 0x00, + 0x07, 0x00, 0x06, 0x00, + 0x06, 0x00, 0x06, 0x00 +}; + +static const uint8_t helvR24L1_0xBF_BMP[] = { + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x07, 0x80, + 0x07, 0x00, + 0x0F, 0x00, + 0x1E, 0x00, + 0x3C, 0x00, + 0x78, 0x00, + 0x70, 0x00, + 0xF0, 0x00, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xF0, 0x3C, + 0x78, 0x78, + 0x7F, 0xF0, + 0x3F, 0xE0, + 0x07, 0x80 +}; + +static const uint8_t helvR24L1_0xC0_BMP[] = { + 0x03, 0xC0, 0x00, + 0x01, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0x70, 0x00, + 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, + 0x01, 0xF8, 0x00, + 0x01, 0xF8, 0x00, + 0x03, 0xFC, 0x00, + 0x03, 0x9C, 0x00, + 0x03, 0x9C, 0x00, + 0x07, 0x9E, 0x00, + 0x07, 0x0E, 0x00, + 0x07, 0x0E, 0x00, + 0x0F, 0x0F, 0x00, + 0x0E, 0x0F, 0x00, + 0x0E, 0x07, 0x00, + 0x1E, 0x07, 0x80, + 0x1F, 0xFF, 0x80, + 0x1F, 0xFF, 0x80, + 0x3F, 0xFF, 0xC0, + 0x3C, 0x03, 0xC0, + 0x38, 0x01, 0xC0, + 0x78, 0x01, 0xE0, + 0x78, 0x01, 0xE0, + 0x70, 0x00, 0xE0, + 0xF0, 0x00, 0xF0, + 0xF0, 0x00, 0xF0 +}; + +static const uint8_t helvR24L1_0xC1_BMP[] = { + 0x00, 0x3C, 0x00, + 0x00, 0x78, 0x00, + 0x00, 0x70, 0x00, + 0x00, 0xE0, 0x00, + 0x01, 0xC0, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, + 0x01, 0xF8, 0x00, + 0x01, 0xF8, 0x00, + 0x03, 0xFC, 0x00, + 0x03, 0x9C, 0x00, + 0x03, 0x9C, 0x00, + 0x07, 0x9E, 0x00, + 0x07, 0x0E, 0x00, + 0x07, 0x0E, 0x00, + 0x0F, 0x0F, 0x00, + 0x0F, 0x0F, 0x00, + 0x0E, 0x07, 0x00, + 0x1E, 0x07, 0x80, + 0x1F, 0xFF, 0x80, + 0x1F, 0xFF, 0x80, + 0x3F, 0xFF, 0xC0, + 0x3C, 0x03, 0xC0, + 0x78, 0x01, 0xC0, + 0x78, 0x01, 0xE0, + 0x78, 0x01, 0xE0, + 0x70, 0x00, 0xE0, + 0xF0, 0x00, 0xF0, + 0xF0, 0x00, 0xF0 +}; + +static const uint8_t helvR24L1_0xC2_BMP[] = { + 0x00, 0x40, 0x00, + 0x00, 0xE0, 0x00, + 0x01, 0xF0, 0x00, + 0x03, 0xB8, 0x00, + 0x07, 0x1C, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, + 0x01, 0xF8, 0x00, + 0x01, 0xF8, 0x00, + 0x03, 0xFC, 0x00, + 0x03, 0x9C, 0x00, + 0x03, 0x9C, 0x00, + 0x07, 0x9E, 0x00, + 0x07, 0x0E, 0x00, + 0x07, 0x0E, 0x00, + 0x0F, 0x0F, 0x00, + 0x0F, 0x0F, 0x00, + 0x0E, 0x07, 0x00, + 0x1E, 0x07, 0x80, + 0x1F, 0xFF, 0x80, + 0x1F, 0xFF, 0x80, + 0x3F, 0xFF, 0xC0, + 0x3C, 0x03, 0xC0, + 0x38, 0x01, 0xC0, + 0x78, 0x01, 0xE0, + 0x78, 0x01, 0xE0, + 0x70, 0x00, 0xE0, + 0xF0, 0x00, 0xF0, + 0xF0, 0x00, 0xF0 +}; + +static const uint8_t helvR24L1_0xC3_BMP[] = { + 0x01, 0xC6, 0x00, + 0x03, 0xFE, 0x00, + 0x07, 0xFC, 0x00, + 0x06, 0x38, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, + 0x01, 0xF8, 0x00, + 0x01, 0xF8, 0x00, + 0x03, 0xFC, 0x00, + 0x03, 0x9C, 0x00, + 0x03, 0x9C, 0x00, + 0x07, 0x9E, 0x00, + 0x07, 0x0E, 0x00, + 0x07, 0x0E, 0x00, + 0x0F, 0x0F, 0x00, + 0x0F, 0x0F, 0x00, + 0x0E, 0x07, 0x00, + 0x1E, 0x07, 0x80, + 0x1F, 0xFF, 0x80, + 0x1F, 0xFF, 0x80, + 0x3F, 0xFF, 0xC0, + 0x3C, 0x03, 0xC0, + 0x38, 0x01, 0xC0, + 0x78, 0x01, 0xE0, + 0x78, 0x01, 0xE0, + 0x70, 0x00, 0xE0, + 0xF0, 0x00, 0xF0, + 0xF0, 0x00, 0xF0 +}; + +static const uint8_t helvR24L1_0xC4_BMP[] = { + 0x03, 0x9C, 0x00, + 0x03, 0x9C, 0x00, + 0x03, 0x9C, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, + 0x01, 0xF8, 0x00, + 0x01, 0xF8, 0x00, + 0x03, 0xFC, 0x00, + 0x03, 0x9C, 0x00, + 0x03, 0x9C, 0x00, + 0x07, 0x9E, 0x00, + 0x07, 0x0E, 0x00, + 0x07, 0x0E, 0x00, + 0x0F, 0x0F, 0x00, + 0x0F, 0x0F, 0x00, + 0x0E, 0x07, 0x00, + 0x1E, 0x07, 0x80, + 0x1F, 0xFF, 0x80, + 0x1F, 0xFF, 0x80, + 0x3F, 0xFF, 0xC0, + 0x3C, 0x03, 0xC0, + 0x38, 0x01, 0xC0, + 0x78, 0x01, 0xE0, + 0x78, 0x01, 0xE0, + 0x70, 0x00, 0xE0, + 0xF0, 0x00, 0xF0, + 0xF0, 0x00, 0xF0 +}; + +static const uint8_t helvR24L1_0xC5_BMP[] = { + 0x00, 0xF0, 0x00, + 0x01, 0x98, 0x00, + 0x01, 0x08, 0x00, + 0x01, 0x08, 0x00, + 0x01, 0x98, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, + 0x01, 0xF8, 0x00, + 0x01, 0xF8, 0x00, + 0x03, 0xFC, 0x00, + 0x03, 0x9C, 0x00, + 0x03, 0x9C, 0x00, + 0x07, 0x9E, 0x00, + 0x07, 0x0E, 0x00, + 0x07, 0x0E, 0x00, + 0x0F, 0x0F, 0x00, + 0x0E, 0x0F, 0x00, + 0x0E, 0x07, 0x00, + 0x1E, 0x07, 0x80, + 0x1F, 0xFF, 0x80, + 0x1F, 0xFF, 0x80, + 0x3F, 0xFF, 0xC0, + 0x3C, 0x03, 0xC0, + 0x38, 0x01, 0xC0, + 0x78, 0x01, 0xE0, + 0x78, 0x01, 0xE0, + 0x70, 0x00, 0xE0, + 0xF0, 0x00, 0xF0, + 0xF0, 0x00, 0xF0 +}; + +static const uint8_t helvR24L1_0xC6_BMP[] = { + 0x00, 0x7F, 0xFF, 0xF8, + 0x00, 0x7F, 0xFF, 0xF8, + 0x00, 0xFF, 0xFF, 0xF8, + 0x00, 0xE3, 0x80, 0x00, + 0x01, 0xC3, 0x80, 0x00, + 0x01, 0xC3, 0x80, 0x00, + 0x03, 0xC3, 0x80, 0x00, + 0x03, 0x83, 0x80, 0x00, + 0x03, 0x83, 0x80, 0x00, + 0x07, 0x83, 0x80, 0x00, + 0x07, 0x03, 0x80, 0x00, + 0x07, 0x03, 0xFF, 0xF0, + 0x0F, 0x03, 0xFF, 0xF0, + 0x0E, 0x03, 0xFF, 0xF0, + 0x1E, 0x03, 0x80, 0x00, + 0x1F, 0xFF, 0x80, 0x00, + 0x1F, 0xFF, 0x80, 0x00, + 0x3F, 0xFF, 0x80, 0x00, + 0x38, 0x03, 0x80, 0x00, + 0x78, 0x03, 0x80, 0x00, + 0x78, 0x03, 0x80, 0x00, + 0x70, 0x03, 0x80, 0x00, + 0xF0, 0x03, 0xFF, 0xF8, + 0xE0, 0x03, 0xFF, 0xF8, + 0xE0, 0x03, 0xFF, 0xF8 +}; + +static const uint8_t helvR24L1_0xC7_BMP[] = { + 0x01, 0xF8, 0x00, + 0x07, 0xFE, 0x00, + 0x0F, 0xFF, 0x80, + 0x1F, 0x07, 0x80, + 0x3C, 0x03, 0xC0, + 0x78, 0x01, 0xE0, + 0x70, 0x00, 0xE0, + 0x70, 0x00, 0xE0, + 0xF0, 0x00, 0x00, + 0xF0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xF0, 0x00, 0x70, + 0xF0, 0x00, 0x70, + 0x70, 0x00, 0xF0, + 0x70, 0x00, 0xE0, + 0x78, 0x01, 0xE0, + 0x3C, 0x03, 0xC0, + 0x1F, 0x07, 0xC0, + 0x0F, 0xFF, 0x80, + 0x07, 0xFE, 0x00, + 0x01, 0xF8, 0x00, + 0x00, 0x60, 0x00, + 0x00, 0x60, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0x38, 0x00, + 0x00, 0x18, 0x00, + 0x03, 0x38, 0x00, + 0x01, 0xF0, 0x00 +}; + +static const uint8_t helvR24L1_0xC8_BMP[] = { + 0x0F, 0x00, 0x00, + 0x07, 0x80, 0x00, + 0x03, 0x80, 0x00, + 0x01, 0xC0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80 +}; + +static const uint8_t helvR24L1_0xC9_BMP[] = { + 0x00, 0x78, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0xE0, 0x00, + 0x01, 0xC0, 0x00, + 0x03, 0x80, 0x00, + 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80 +}; + +static const uint8_t helvR24L1_0xCA_BMP[] = { + 0x00, 0x80, 0x00, + 0x01, 0xC0, 0x00, + 0x03, 0xE0, 0x00, + 0x07, 0x70, 0x00, + 0x0E, 0x38, 0x00, + 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80 +}; + +static const uint8_t helvR24L1_0xCB_BMP[] = { + 0x1C, 0x38, 0x00, + 0x1C, 0x38, 0x00, + 0x1C, 0x38, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80, + 0xFF, 0xFF, 0x80 +}; + +static const uint8_t helvR24L1_0xCC_BMP[] = { + 0xF0, + 0x78, + 0x38, + 0x1C, + 0x0E, + 0x00, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C +}; + +static const uint8_t helvR24L1_0xCD_BMP[] = { + 0x1E, + 0x3C, + 0x38, + 0x70, + 0xE0, + 0x00, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70 +}; + +static const uint8_t helvR24L1_0xCE_BMP[] = { + 0x08, 0x00, + 0x1C, 0x00, + 0x3E, 0x00, + 0x77, 0x00, + 0xE3, 0x80, + 0x00, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t helvR24L1_0xCF_BMP[] = { + 0xE3, 0x80, + 0xE3, 0x80, + 0xE3, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t helvR24L1_0xD0_BMP[] = { + 0x1F, 0xFE, 0x00, + 0x1F, 0xFF, 0x80, + 0x1F, 0xFF, 0xC0, + 0x1C, 0x03, 0xE0, + 0x1C, 0x00, 0xE0, + 0x1C, 0x00, 0xF0, + 0x1C, 0x00, 0x70, + 0x1C, 0x00, 0x70, + 0x1C, 0x00, 0x38, + 0x1C, 0x00, 0x38, + 0x1C, 0x00, 0x38, + 0xFF, 0xC0, 0x38, + 0xFF, 0xC0, 0x38, + 0x1C, 0x00, 0x38, + 0x1C, 0x00, 0x38, + 0x1C, 0x00, 0x38, + 0x1C, 0x00, 0x78, + 0x1C, 0x00, 0x70, + 0x1C, 0x00, 0x70, + 0x1C, 0x00, 0xF0, + 0x1C, 0x00, 0xE0, + 0x1C, 0x03, 0xC0, + 0x1F, 0xFF, 0xC0, + 0x1F, 0xFF, 0x80, + 0x1F, 0xFE, 0x00 +}; + +static const uint8_t helvR24L1_0xD1_BMP[] = { + 0x01, 0xC6, 0x00, + 0x03, 0xFE, 0x00, + 0x07, 0xFC, 0x00, + 0x06, 0x38, 0x00, + 0x00, 0x00, 0x00, + 0xF0, 0x00, 0xE0, + 0xF8, 0x00, 0xE0, + 0xF8, 0x00, 0xE0, + 0xFC, 0x00, 0xE0, + 0xFC, 0x00, 0xE0, + 0xFE, 0x00, 0xE0, + 0xEF, 0x00, 0xE0, + 0xE7, 0x00, 0xE0, + 0xE7, 0x80, 0xE0, + 0xE3, 0xC0, 0xE0, + 0xE3, 0xC0, 0xE0, + 0xE1, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, + 0xE0, 0xF0, 0xE0, + 0xE0, 0x78, 0xE0, + 0xE0, 0x38, 0xE0, + 0xE0, 0x3C, 0xE0, + 0xE0, 0x1C, 0xE0, + 0xE0, 0x1E, 0xE0, + 0xE0, 0x0F, 0xE0, + 0xE0, 0x07, 0xE0, + 0xE0, 0x07, 0xE0, + 0xE0, 0x03, 0xE0, + 0xE0, 0x01, 0xE0, + 0xE0, 0x01, 0xE0 +}; + +static const uint8_t helvR24L1_0xD2_BMP[] = { + 0x00, 0xF0, 0x00, + 0x00, 0x78, 0x00, + 0x00, 0x38, 0x00, + 0x00, 0x1C, 0x00, + 0x00, 0x0E, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0xFE, 0x00, + 0x03, 0xFF, 0x80, + 0x0F, 0xFF, 0xE0, + 0x1F, 0x01, 0xF0, + 0x3E, 0x00, 0xF8, + 0x3C, 0x00, 0x78, + 0x78, 0x00, 0x3C, + 0x70, 0x00, 0x1C, + 0x70, 0x00, 0x1C, + 0xF0, 0x00, 0x1E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xF0, 0x00, 0x1E, + 0xF0, 0x00, 0x1E, + 0x70, 0x00, 0x1C, + 0x78, 0x00, 0x3C, + 0x3C, 0x00, 0x78, + 0x3E, 0x00, 0xF8, + 0x1F, 0x01, 0xF0, + 0x0F, 0xFF, 0xE0, + 0x03, 0xFF, 0x80, + 0x00, 0xFE, 0x00 +}; + +static const uint8_t helvR24L1_0xD3_BMP[] = { + 0x00, 0x0F, 0x00, + 0x00, 0x1E, 0x00, + 0x00, 0x1C, 0x00, + 0x00, 0x38, 0x00, + 0x00, 0x70, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0xFE, 0x00, + 0x03, 0xFF, 0x80, + 0x0F, 0xFF, 0xE0, + 0x1F, 0x01, 0xF0, + 0x3E, 0x00, 0xF8, + 0x3C, 0x00, 0x78, + 0x78, 0x00, 0x3C, + 0x70, 0x00, 0x1C, + 0x70, 0x00, 0x1C, + 0xF0, 0x00, 0x1E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xF0, 0x00, 0x1E, + 0xF0, 0x00, 0x1E, + 0x70, 0x00, 0x1C, + 0x78, 0x00, 0x3C, + 0x3C, 0x00, 0x78, + 0x3E, 0x00, 0xF8, + 0x1F, 0x01, 0xF0, + 0x0F, 0xFF, 0xE0, + 0x03, 0xFF, 0x80, + 0x00, 0xFE, 0x00 +}; + +static const uint8_t helvR24L1_0xD4_BMP[] = { + 0x00, 0x10, 0x00, + 0x00, 0x38, 0x00, + 0x00, 0x7C, 0x00, + 0x00, 0xEE, 0x00, + 0x01, 0xC7, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0xFE, 0x00, + 0x03, 0xFF, 0x80, + 0x0F, 0xFF, 0xE0, + 0x1F, 0x01, 0xF0, + 0x3E, 0x00, 0xF8, + 0x3C, 0x00, 0x78, + 0x78, 0x00, 0x3C, + 0x70, 0x00, 0x1C, + 0x70, 0x00, 0x1C, + 0xF0, 0x00, 0x1E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xF0, 0x00, 0x1E, + 0xF0, 0x00, 0x1E, + 0x70, 0x00, 0x1C, + 0x78, 0x00, 0x3C, + 0x3C, 0x00, 0x78, + 0x3E, 0x00, 0xF8, + 0x1F, 0x01, 0xF0, + 0x0F, 0xFF, 0xE0, + 0x03, 0xFF, 0x80, + 0x00, 0xFE, 0x00 +}; + +static const uint8_t helvR24L1_0xD5_BMP[] = { + 0x00, 0x71, 0x80, + 0x00, 0xFF, 0x80, + 0x01, 0xFF, 0x00, + 0x01, 0x8E, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0xFE, 0x00, + 0x03, 0xFF, 0x80, + 0x0F, 0xFF, 0xE0, + 0x1F, 0x01, 0xF0, + 0x3E, 0x00, 0xF8, + 0x3C, 0x00, 0x78, + 0x78, 0x00, 0x3C, + 0x70, 0x00, 0x1C, + 0x70, 0x00, 0x1C, + 0xF0, 0x00, 0x1E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xF0, 0x00, 0x1E, + 0xF0, 0x00, 0x1E, + 0x70, 0x00, 0x1C, + 0x78, 0x00, 0x3C, + 0x3C, 0x00, 0x78, + 0x3E, 0x00, 0xF8, + 0x1F, 0x01, 0xF0, + 0x0F, 0xFF, 0xE0, + 0x03, 0xFF, 0x80, + 0x00, 0xFE, 0x00 +}; + +static const uint8_t helvR24L1_0xD6_BMP[] = { + 0x01, 0xC3, 0x80, + 0x01, 0xC3, 0x80, + 0x01, 0xC3, 0x80, + 0x00, 0x00, 0x00, + 0x00, 0xFE, 0x00, + 0x03, 0xFF, 0x80, + 0x0F, 0xFF, 0xE0, + 0x1F, 0x01, 0xF0, + 0x3E, 0x00, 0xF8, + 0x3C, 0x00, 0x78, + 0x78, 0x00, 0x3C, + 0x70, 0x00, 0x1C, + 0x70, 0x00, 0x1C, + 0xF0, 0x00, 0x1E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xE0, 0x00, 0x0E, + 0xF0, 0x00, 0x1E, + 0xF0, 0x00, 0x1E, + 0x70, 0x00, 0x1C, + 0x78, 0x00, 0x3C, + 0x3C, 0x00, 0x78, + 0x3E, 0x00, 0xF8, + 0x1F, 0x01, 0xF0, + 0x0F, 0xFF, 0xE0, + 0x03, 0xFF, 0x80, + 0x00, 0xFE, 0x00 +}; + +static const uint8_t helvR24L1_0xD7_BMP[] = { + 0x40, 0x04, + 0xE0, 0x0E, + 0xF0, 0x1E, + 0x78, 0x3C, + 0x3C, 0x78, + 0x1F, 0xF0, + 0x0F, 0xE0, + 0x07, 0xC0, + 0x07, 0xC0, + 0x0F, 0xE0, + 0x1E, 0xF0, + 0x3C, 0x78, + 0x78, 0x3C, + 0xF0, 0x1E, + 0x60, 0x0C +}; + +static const uint8_t helvR24L1_0xD8_BMP[] = { + 0x00, 0xFE, 0x06, + 0x03, 0xFF, 0x8C, + 0x0F, 0xFF, 0xF8, + 0x1F, 0x01, 0xF0, + 0x3E, 0x00, 0xF8, + 0x3C, 0x00, 0xF8, + 0x78, 0x01, 0xBC, + 0x70, 0x03, 0x1C, + 0x70, 0x06, 0x1C, + 0xF0, 0x06, 0x1E, + 0xE0, 0x0C, 0x0E, + 0xE0, 0x18, 0x0E, + 0xE0, 0x30, 0x0E, + 0xE0, 0x60, 0x0E, + 0xE0, 0xC0, 0x0E, + 0xE1, 0x80, 0x1E, + 0xF3, 0x00, 0x1E, + 0x76, 0x00, 0x1C, + 0x7C, 0x00, 0x3C, + 0x3C, 0x00, 0x78, + 0x3E, 0x00, 0xF8, + 0x3F, 0x01, 0xF0, + 0x6F, 0xFF, 0xE0, + 0xC3, 0xFF, 0x80, + 0x00, 0xFE, 0x00 +}; + +static const uint8_t helvR24L1_0xD9_BMP[] = { + 0x07, 0x80, 0x00, + 0x03, 0xC0, 0x00, + 0x01, 0xC0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0x70, 0x00, + 0x00, 0x00, 0x00, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xF0, 0x03, 0xC0, + 0x78, 0x07, 0x80, + 0x7C, 0x0F, 0x80, + 0x3F, 0xFF, 0x00, + 0x1F, 0xFE, 0x00, + 0x03, 0xF0, 0x00 +}; + +static const uint8_t helvR24L1_0xDA_BMP[] = { + 0x00, 0x78, 0x00, + 0x00, 0xF0, 0x00, + 0x00, 0xE0, 0x00, + 0x01, 0xC0, 0x00, + 0x03, 0x80, 0x00, + 0x00, 0x00, 0x00, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xF0, 0x03, 0xC0, + 0x78, 0x07, 0x80, + 0x7C, 0x0F, 0x80, + 0x3F, 0xFF, 0x00, + 0x1F, 0xFE, 0x00, + 0x03, 0xF0, 0x00 +}; + +static const uint8_t helvR24L1_0xDB_BMP[] = { + 0x00, 0x40, 0x00, + 0x00, 0xE0, 0x00, + 0x01, 0xF0, 0x00, + 0x03, 0xB8, 0x00, + 0x07, 0x1C, 0x00, + 0x00, 0x00, 0x00, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xF0, 0x03, 0xC0, + 0x78, 0x07, 0x80, + 0x7C, 0x0F, 0x80, + 0x3F, 0xFF, 0x00, + 0x1F, 0xFE, 0x00, + 0x03, 0xF0, 0x00 +}; + +static const uint8_t helvR24L1_0xDC_BMP[] = { + 0x0E, 0x1C, 0x00, + 0x0E, 0x1C, 0x00, + 0x0E, 0x1C, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xE0, 0x01, 0xC0, + 0xF0, 0x03, 0xC0, + 0x78, 0x07, 0x80, + 0x7C, 0x0F, 0x80, + 0x3F, 0xFF, 0x00, + 0x1F, 0xFE, 0x00, + 0x03, 0xF0, 0x00 +}; + +static const uint8_t helvR24L1_0xDD_BMP[] = { + 0x00, 0x3C, 0x00, + 0x00, 0x78, 0x00, + 0x00, 0x70, 0x00, + 0x00, 0xE0, 0x00, + 0x01, 0xC0, 0x00, + 0x00, 0x00, 0x00, + 0xE0, 0x00, 0xE0, + 0xF0, 0x01, 0xE0, + 0x70, 0x01, 0xC0, + 0x78, 0x03, 0xC0, + 0x38, 0x03, 0x80, + 0x3C, 0x07, 0x80, + 0x1C, 0x0F, 0x00, + 0x1E, 0x0F, 0x00, + 0x0F, 0x1E, 0x00, + 0x07, 0x1C, 0x00, + 0x07, 0xBC, 0x00, + 0x03, 0xB8, 0x00, + 0x03, 0xF8, 0x00, + 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00, + 0x00, 0xE0, 0x00 +}; + +static const uint8_t helvR24L1_0xDE_BMP[] = { + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xFF, 0xF8, 0x00, + 0xFF, 0xFE, 0x00, + 0xFF, 0xFF, 0x00, + 0xE0, 0x0F, 0x00, + 0xE0, 0x07, 0x00, + 0xE0, 0x07, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x03, 0x80, + 0xE0, 0x07, 0x80, + 0xE0, 0x07, 0x00, + 0xE0, 0x0F, 0x00, + 0xFF, 0xFE, 0x00, + 0xFF, 0xFC, 0x00, + 0xFF, 0xF8, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00, + 0xE0, 0x00, 0x00 +}; + +static const uint8_t helvR24L1_0xDF_BMP[] = { + 0x0F, 0x80, + 0x3F, 0xE0, + 0x7F, 0xF0, + 0x78, 0xF0, + 0xF0, 0x78, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x38, + 0xE0, 0x78, + 0xE0, 0xF0, + 0xE3, 0xE0, + 0xE3, 0xE0, + 0xE3, 0xF0, + 0xE0, 0x78, + 0xE0, 0x3C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x38, + 0xE0, 0x78, + 0xE7, 0xF0, + 0xE7, 0xE0, + 0xE7, 0x80 +}; + +static const uint8_t helvR24L1_0xE0_BMP[] = { + 0x0F, 0x00, + 0x07, 0x80, + 0x03, 0x80, + 0x01, 0xC0, + 0x00, 0xE0, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0xE0, + 0x3F, 0xF8, + 0x3C, 0x7C, + 0x70, 0x1C, + 0x70, 0x1C, + 0x00, 0x1C, + 0x00, 0x1C, + 0x00, 0xFC, + 0x1F, 0xFC, + 0x7F, 0x9C, + 0x78, 0x1C, + 0xF0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x3C, + 0xE0, 0x7C, + 0x79, 0xFC, + 0x7F, 0xDF, + 0x3F, 0x8F +}; + +static const uint8_t helvR24L1_0xE1_BMP[] = { + 0x00, 0xF0, + 0x01, 0xE0, + 0x01, 0xC0, + 0x03, 0x80, + 0x07, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0xE0, + 0x3F, 0xF8, + 0x3C, 0x7C, + 0x70, 0x1C, + 0x70, 0x1C, + 0x00, 0x1C, + 0x00, 0x1C, + 0x00, 0xFC, + 0x1F, 0xFC, + 0x7F, 0x9C, + 0x78, 0x1C, + 0xF0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x3C, + 0xE0, 0x7C, + 0x78, 0xFC, + 0x7F, 0xDF, + 0x3F, 0x8F +}; + +static const uint8_t helvR24L1_0xE2_BMP[] = { + 0x01, 0x00, + 0x03, 0x80, + 0x07, 0xC0, + 0x0E, 0xE0, + 0x1C, 0x70, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0xE0, + 0x3F, 0xF8, + 0x3C, 0x7C, + 0x70, 0x1C, + 0x70, 0x1C, + 0x00, 0x1C, + 0x00, 0x1C, + 0x00, 0xFC, + 0x1F, 0xFC, + 0x7F, 0x9C, + 0x78, 0x1C, + 0xF0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x3C, + 0xE0, 0x7C, + 0x78, 0xFC, + 0x7F, 0xDF, + 0x3F, 0x8F +}; + +static const uint8_t helvR24L1_0xE3_BMP[] = { + 0x07, 0x18, + 0x0F, 0xF8, + 0x1F, 0xF0, + 0x18, 0xE0, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0xE0, + 0x3F, 0xF8, + 0x3C, 0x7C, + 0x70, 0x1C, + 0x70, 0x1C, + 0x00, 0x1C, + 0x00, 0x1C, + 0x00, 0xFC, + 0x1F, 0xFC, + 0x7F, 0x9C, + 0x78, 0x1C, + 0xF0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x3C, + 0xE0, 0x7C, + 0x78, 0xFC, + 0x7F, 0xDF, + 0x3F, 0x8F +}; + +static const uint8_t helvR24L1_0xE4_BMP[] = { + 0x0E, 0x70, + 0x0E, 0x70, + 0x0E, 0x70, + 0x00, 0x00, + 0x00, 0x00, + 0x0F, 0xE0, + 0x3F, 0xF8, + 0x3C, 0xFC, + 0x70, 0x1C, + 0x70, 0x1C, + 0x00, 0x1C, + 0x00, 0x1C, + 0x00, 0xFC, + 0x1F, 0xFC, + 0x7F, 0x9C, + 0x78, 0x1C, + 0xF0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x3C, + 0xE0, 0x7C, + 0x79, 0xFC, + 0x7F, 0xDF, + 0x3F, 0x8F +}; + +static const uint8_t helvR24L1_0xE5_BMP[] = { + 0x03, 0x80, + 0x06, 0xC0, + 0x04, 0x40, + 0x04, 0x40, + 0x06, 0xC0, + 0x03, 0x80, + 0x00, 0x00, + 0x0F, 0xE0, + 0x3F, 0xF8, + 0x3C, 0x7C, + 0x70, 0x1C, + 0x70, 0x1C, + 0x00, 0x1C, + 0x00, 0x1C, + 0x00, 0xFC, + 0x1F, 0xFC, + 0x7F, 0x9C, + 0x78, 0x1C, + 0xF0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x3C, + 0xE0, 0x7C, + 0x78, 0xFC, + 0x7F, 0xDF, + 0x3F, 0x8F +}; + +static const uint8_t helvR24L1_0xE6_BMP[] = { + 0x07, 0xC0, 0xF8, 0x00, + 0x1F, 0xF1, 0xFE, 0x00, + 0x3C, 0x7F, 0x8F, 0x00, + 0x70, 0x3E, 0x03, 0x80, + 0x70, 0x1E, 0x03, 0x80, + 0x00, 0x1C, 0x01, 0xC0, + 0x00, 0x1C, 0x01, 0xC0, + 0x00, 0xFC, 0x01, 0xC0, + 0x0F, 0xFF, 0xFF, 0xC0, + 0x3F, 0xFF, 0xFF, 0xC0, + 0x7E, 0x1F, 0xFF, 0xC0, + 0xF0, 0x1C, 0x00, 0x00, + 0xE0, 0x1C, 0x01, 0xC0, + 0xE0, 0x1E, 0x01, 0xC0, + 0xE0, 0x7E, 0x03, 0x80, + 0xF8, 0xF7, 0x8F, 0x00, + 0x7F, 0xE7, 0xFF, 0x00, + 0x3F, 0x81, 0xFC, 0x00 +}; + +static const uint8_t helvR24L1_0xE7_BMP[] = { + 0x07, 0xC0, + 0x1F, 0xF0, + 0x3F, 0xF8, + 0x38, 0x38, + 0x70, 0x1C, + 0x70, 0x1C, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0x70, 0x38, + 0x78, 0x78, + 0x3F, 0xF0, + 0x1F, 0xE0, + 0x07, 0x80, + 0x03, 0x00, + 0x03, 0x00, + 0x07, 0x80, + 0x01, 0xC0, + 0x00, 0xC0, + 0x19, 0xC0, + 0x0F, 0x80 +}; + +static const uint8_t helvR24L1_0xE8_BMP[] = { + 0x1E, 0x00, + 0x0F, 0x00, + 0x07, 0x00, + 0x03, 0x80, + 0x01, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0xC0, + 0x1F, 0xF0, + 0x3E, 0x78, + 0x78, 0x1C, + 0x70, 0x1C, + 0xF0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x0E, + 0x70, 0x0E, + 0x78, 0x1C, + 0x3C, 0x7C, + 0x1F, 0xF0, + 0x0F, 0xE0 +}; + +static const uint8_t helvR24L1_0xE9_BMP[] = { + 0x01, 0xE0, + 0x03, 0xC0, + 0x03, 0x80, + 0x07, 0x00, + 0x0E, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0xC0, + 0x1F, 0xF0, + 0x3C, 0x78, + 0x78, 0x1C, + 0x70, 0x1C, + 0xF0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x0E, + 0x70, 0x0E, + 0x78, 0x1C, + 0x3C, 0x7C, + 0x1F, 0xF0, + 0x0F, 0xE0 +}; + +static const uint8_t helvR24L1_0xEA_BMP[] = { + 0x01, 0x00, + 0x03, 0x80, + 0x07, 0xC0, + 0x0E, 0xE0, + 0x1C, 0x70, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0xC0, + 0x1F, 0xF0, + 0x3C, 0x78, + 0x78, 0x1C, + 0x70, 0x1C, + 0xF0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x0E, + 0x70, 0x0E, + 0x78, 0x1C, + 0x3C, 0x7C, + 0x1F, 0xF0, + 0x07, 0xC0 +}; + +static const uint8_t helvR24L1_0xEB_BMP[] = { + 0x1C, 0x70, + 0x1C, 0x70, + 0x1C, 0x70, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0xC0, + 0x1F, 0xF0, + 0x3C, 0x78, + 0x78, 0x1C, + 0x70, 0x1C, + 0xF0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x0E, + 0x70, 0x0E, + 0x78, 0x1C, + 0x3C, 0x7C, + 0x1F, 0xF0, + 0x07, 0xC0 +}; + +static const uint8_t helvR24L1_0xEC_BMP[] = { + 0xF0, + 0x78, + 0x38, + 0x1C, + 0x0E, + 0x00, + 0x00, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C, + 0x1C +}; + +static const uint8_t helvR24L1_0xED_BMP[] = { + 0x1E, + 0x3C, + 0x38, + 0x70, + 0xE0, + 0x00, + 0x00, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70, + 0x70 +}; + +static const uint8_t helvR24L1_0xEE_BMP[] = { + 0x08, 0x00, + 0x1C, 0x00, + 0x3E, 0x00, + 0x77, 0x00, + 0xE3, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00, + 0x1C, 0x00 +}; + +static const uint8_t helvR24L1_0xEF_BMP[] = { + 0xE7, + 0xE7, + 0xE7, + 0x00, + 0x00, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38, + 0x38 +}; + +static const uint8_t helvR24L1_0xF0_BMP[] = { + 0x78, 0x40, + 0x3C, 0xE0, + 0x1F, 0xC0, + 0x0F, 0x80, + 0x1F, 0x80, + 0x3B, 0xC0, + 0x11, 0xE0, + 0x07, 0xF0, + 0x1F, 0xF8, + 0x3F, 0xF8, + 0x78, 0x3C, + 0x70, 0x1C, + 0x70, 0x1C, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0x70, 0x1C, + 0x70, 0x1C, + 0x78, 0x3C, + 0x3F, 0xF8, + 0x1F, 0xF0, + 0x07, 0xC0 +}; + +static const uint8_t helvR24L1_0xF1_BMP[] = { + 0x0E, 0x30, + 0x1F, 0xF0, + 0x3F, 0xE0, + 0x31, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0x03, 0xC0, + 0xEF, 0xF0, + 0xFF, 0xF8, + 0xF8, 0x3C, + 0xF0, 0x1C, + 0xF0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C +}; + +static const uint8_t helvR24L1_0xF2_BMP[] = { + 0x1E, 0x00, + 0x0F, 0x00, + 0x07, 0x00, + 0x03, 0x80, + 0x01, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0xC0, + 0x1F, 0xF0, + 0x3F, 0xF8, + 0x78, 0x3C, + 0x70, 0x1C, + 0x70, 0x1C, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0x70, 0x1C, + 0x70, 0x1C, + 0x78, 0x3C, + 0x3F, 0xF8, + 0x1F, 0xF0, + 0x07, 0xC0 +}; + +static const uint8_t helvR24L1_0xF3_BMP[] = { + 0x01, 0xE0, + 0x03, 0xC0, + 0x03, 0x80, + 0x07, 0x00, + 0x0E, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0xC0, + 0x1F, 0xF0, + 0x3F, 0xF8, + 0x78, 0x3C, + 0x70, 0x1C, + 0x70, 0x1C, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0x70, 0x1C, + 0x70, 0x1C, + 0x78, 0x3C, + 0x3F, 0xF8, + 0x1F, 0xF0, + 0x07, 0xC0 +}; + +static const uint8_t helvR24L1_0xF4_BMP[] = { + 0x01, 0x00, + 0x03, 0x80, + 0x07, 0xC0, + 0x0E, 0xE0, + 0x1C, 0x70, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0xC0, + 0x1F, 0xF0, + 0x3F, 0xF8, + 0x78, 0x3C, + 0x70, 0x1C, + 0x70, 0x1C, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0x70, 0x1C, + 0x70, 0x1C, + 0x78, 0x3C, + 0x3F, 0xF8, + 0x1F, 0xF0, + 0x07, 0xC0 +}; + +static const uint8_t helvR24L1_0xF5_BMP[] = { + 0x0E, 0x30, + 0x1F, 0xF0, + 0x3F, 0xE0, + 0x31, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0xC0, + 0x1F, 0xF0, + 0x3F, 0xF8, + 0x78, 0x3C, + 0x70, 0x1C, + 0x70, 0x1C, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0x70, 0x1C, + 0x70, 0x1C, + 0x78, 0x3C, + 0x3F, 0xF8, + 0x1F, 0xF0, + 0x07, 0xC0 +}; + +static const uint8_t helvR24L1_0xF6_BMP[] = { + 0x1C, 0x70, + 0x1C, 0x70, + 0x1C, 0x70, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0xC0, + 0x1F, 0xF0, + 0x3F, 0xF8, + 0x78, 0x3C, + 0x70, 0x1C, + 0x70, 0x1C, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0x70, 0x1C, + 0x70, 0x1C, + 0x78, 0x3C, + 0x3F, 0xF8, + 0x1F, 0xF0, + 0x07, 0xC0 +}; + +static const uint8_t helvR24L1_0xF7_BMP[] = { + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0xFF, 0xFE, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x03, 0x80, + 0x03, 0x80, + 0x03, 0x80 +}; + +static const uint8_t helvR24L1_0xF8_BMP[] = { + 0x07, 0xC3, + 0x1F, 0xF6, + 0x3F, 0xFC, + 0x78, 0x78, + 0x70, 0x1C, + 0x70, 0x3C, + 0xE0, 0x6E, + 0xE0, 0xCE, + 0xE1, 0x8E, + 0xE3, 0x0E, + 0xE6, 0x0E, + 0xEC, 0x0E, + 0x78, 0x1C, + 0x70, 0x1C, + 0x38, 0x3C, + 0x7F, 0xF8, + 0xDF, 0xF0, + 0x87, 0xC0 +}; + +static const uint8_t helvR24L1_0xF9_BMP[] = { + 0x1E, 0x00, + 0x0F, 0x00, + 0x07, 0x00, + 0x03, 0x80, + 0x01, 0xC0, + 0x00, 0x00, + 0x00, 0x00, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x3C, + 0xE0, 0x3C, + 0xF0, 0xFC, + 0x7F, 0xFC, + 0x3F, 0xDC, + 0x0F, 0x00 +}; + +static const uint8_t helvR24L1_0xFA_BMP[] = { + 0x01, 0xE0, + 0x03, 0xC0, + 0x03, 0x80, + 0x07, 0x00, + 0x0E, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x3C, + 0xE0, 0x3C, + 0xF0, 0xFC, + 0x7F, 0xFC, + 0x3F, 0xDC, + 0x0F, 0x00 +}; + +static const uint8_t helvR24L1_0xFB_BMP[] = { + 0x01, 0x00, + 0x03, 0x80, + 0x07, 0xC0, + 0x0E, 0xE0, + 0x1C, 0x70, + 0x00, 0x00, + 0x00, 0x00, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x3C, + 0xE0, 0x3C, + 0xF0, 0xFC, + 0x7F, 0xFC, + 0x3F, 0xDC, + 0x0F, 0x00 +}; + +static const uint8_t helvR24L1_0xFC_BMP[] = { + 0x1C, 0xE0, + 0x1C, 0xE0, + 0x1C, 0xE0, + 0x00, 0x00, + 0x00, 0x00, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x3C, + 0xE0, 0x3C, + 0xF0, 0xFC, + 0x7F, 0xFC, + 0x3F, 0xDC, + 0x0F, 0x00 +}; + +static const uint8_t helvR24L1_0xFD_BMP[] = { + 0x00, 0xF0, + 0x01, 0xE0, + 0x01, 0xC0, + 0x03, 0x80, + 0x07, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x3C, + 0x70, 0x38, + 0x70, 0x38, + 0x70, 0x38, + 0x78, 0x70, + 0x38, 0x70, + 0x38, 0xF0, + 0x3C, 0xE0, + 0x1C, 0xE0, + 0x1D, 0xC0, + 0x1D, 0xC0, + 0x0F, 0xC0, + 0x0F, 0x80, + 0x0F, 0x80, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x1E, 0x00, + 0x7C, 0x00, + 0x7C, 0x00, + 0x70, 0x00 +}; + +static const uint8_t helvR24L1_0xFE_BMP[] = { + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE7, 0xE0, + 0xEF, 0xF0, + 0xFF, 0xF8, + 0xF8, 0x3C, + 0xF0, 0x1C, + 0xF0, 0x1E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xE0, 0x0E, + 0xF0, 0x1C, + 0xF0, 0x1C, + 0xF8, 0x3C, + 0xFF, 0xF8, + 0xEF, 0xF0, + 0xE3, 0xC0, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00, + 0xE0, 0x00 +}; + +static const uint8_t helvR24L1_0xFF_BMP[] = { + 0x1C, 0x70, + 0x1C, 0x70, + 0x1C, 0x70, + 0x00, 0x00, + 0x00, 0x00, + 0xE0, 0x1C, + 0xE0, 0x1C, + 0xE0, 0x3C, + 0x70, 0x38, + 0x70, 0x38, + 0x70, 0x78, + 0x78, 0x70, + 0x38, 0x70, + 0x38, 0xF0, + 0x3C, 0xE0, + 0x1C, 0xE0, + 0x1D, 0xC0, + 0x1D, 0xC0, + 0x0F, 0xC0, + 0x0F, 0x80, + 0x0F, 0x80, + 0x07, 0x00, + 0x07, 0x00, + 0x07, 0x00, + 0x0E, 0x00, + 0x0E, 0x00, + 0x1E, 0x00, + 0x7C, 0x00, + 0x7C, 0x00, + 0x70, 0x00 +}; + +static const GFONT_CharInfo FontBMP[] = { + {24, 17, 25, 3, 0, helvR24L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {9, 1, 1, 0, 0, helvR24L1_0x20_BMP}, + {9, 3, 25, 4, 0, helvR24L1_0x21_BMP}, + {12, 8, 8, 2, 15, helvR24L1_0x22_BMP}, + {19, 17, 23, 1, 0, helvR24L1_0x23_BMP}, + {18, 16, 31, 1, -4, helvR24L1_0x24_BMP}, + {29, 26, 24, 1, 0, helvR24L1_0x25_BMP}, + {22, 18, 23, 2, 0, helvR24L1_0x26_BMP}, + {6, 3, 8, 2, 15, helvR24L1_0x27_BMP}, + {11, 7, 31, 2, -7, helvR24L1_0x28_BMP}, + {11, 7, 31, 1, -7, helvR24L1_0x29_BMP}, + {13, 10, 11, 1, 15, helvR24L1_0x2A_BMP}, + {19, 17, 16, 1, 1, helvR24L1_0x2B_BMP}, + {9, 3, 9, 3, -5, helvR24L1_0x2C_BMP}, + {11, 8, 2, 1, 8, helvR24L1_0x2D_BMP}, + {9, 3, 4, 3, 0, helvR24L1_0x2E_BMP}, + {9, 9, 24, 0, 0, helvR24L1_0x2F_BMP}, + {18, 15, 24, 1, 0, helvR24L1_0x30_BMP}, + {18, 8, 24, 3, 0, helvR24L1_0x31_BMP}, + {18, 15, 24, 1, 0, helvR24L1_0x32_BMP}, + {18, 15, 24, 1, 0, helvR24L1_0x33_BMP}, + {18, 16, 24, 0, 0, helvR24L1_0x34_BMP}, + {18, 15, 24, 1, 0, helvR24L1_0x35_BMP}, + {18, 15, 24, 1, 0, helvR24L1_0x36_BMP}, + {18, 15, 24, 1, 0, helvR24L1_0x37_BMP}, + {18, 15, 24, 1, 0, helvR24L1_0x38_BMP}, + {18, 15, 24, 1, 0, helvR24L1_0x39_BMP}, + {9, 3, 18, 4, 0, helvR24L1_0x3A_BMP}, + {9, 3, 22, 4, -5, helvR24L1_0x3B_BMP}, + {19, 16, 16, 2, 0, helvR24L1_0x3C_BMP}, + {19, 15, 9, 2, 4, helvR24L1_0x3D_BMP}, + {19, 16, 16, 1, 0, helvR24L1_0x3E_BMP}, + {18, 14, 25, 2, 0, helvR24L1_0x3F_BMP}, + {34, 29, 30, 1, -5, helvR24L1_0x40_BMP}, + {22, 20, 25, 1, 0, helvR24L1_0x41_BMP}, + {22, 17, 25, 3, 0, helvR24L1_0x42_BMP}, + {24, 20, 25, 2, 0, helvR24L1_0x43_BMP}, + {24, 18, 25, 3, 0, helvR24L1_0x44_BMP}, + {22, 17, 25, 3, 0, helvR24L1_0x45_BMP}, + {20, 16, 25, 3, 0, helvR24L1_0x46_BMP}, + {25, 22, 25, 1, 0, helvR24L1_0x47_BMP}, + {24, 18, 25, 3, 0, helvR24L1_0x48_BMP}, + {9, 3, 25, 3, 0, helvR24L1_0x49_BMP}, + {16, 13, 25, 1, 0, helvR24L1_0x4A_BMP}, + {22, 20, 25, 3, 0, helvR24L1_0x4B_BMP}, + {18, 14, 25, 3, 0, helvR24L1_0x4C_BMP}, + {27, 21, 25, 3, 0, helvR24L1_0x4D_BMP}, + {24, 19, 25, 2, 0, helvR24L1_0x4E_BMP}, + {25, 23, 25, 1, 0, helvR24L1_0x4F_BMP}, + {22, 17, 25, 3, 0, helvR24L1_0x50_BMP}, + {26, 23, 26, 1, -1, helvR24L1_0x51_BMP}, + {24, 19, 25, 3, 0, helvR24L1_0x52_BMP}, + {22, 19, 25, 1, 0, helvR24L1_0x53_BMP}, + {20, 19, 25, 0, 0, helvR24L1_0x54_BMP}, + {24, 18, 25, 3, 0, helvR24L1_0x55_BMP}, + {22, 19, 25, 1, 0, helvR24L1_0x56_BMP}, + {31, 29, 25, 1, 0, helvR24L1_0x57_BMP}, + {22, 20, 25, 1, 0, helvR24L1_0x58_BMP}, + {22, 21, 25, 0, 0, helvR24L1_0x59_BMP}, + {20, 18, 25, 1, 0, helvR24L1_0x5A_BMP}, + {9, 6, 32, 2, -7, helvR24L1_0x5B_BMP}, + {9, 9, 24, 0, 0, helvR24L1_0x5C_BMP}, + {9, 6, 32, 1, -7, helvR24L1_0x5D_BMP}, + {16, 12, 13, 1, 11, helvR24L1_0x5E_BMP}, + {18, 18, 2, 0, -6, helvR24L1_0x5F_BMP}, + {11, 6, 5, 1, 20, helvR24L1_0x60_BMP}, + {18, 16, 18, 1, 0, helvR24L1_0x61_BMP}, + {18, 15, 25, 2, 0, helvR24L1_0x62_BMP}, + {16, 14, 18, 1, 0, helvR24L1_0x63_BMP}, + {18, 15, 25, 1, 0, helvR24L1_0x64_BMP}, + {18, 15, 18, 2, 0, helvR24L1_0x65_BMP}, + {9, 8, 25, 1, 0, helvR24L1_0x66_BMP}, + {18, 15, 25, 1, -7, helvR24L1_0x67_BMP}, + {18, 14, 25, 2, 0, helvR24L1_0x68_BMP}, + {7, 3, 25, 2, 0, helvR24L1_0x69_BMP}, + {7, 6, 32, -1, -7, helvR24L1_0x6A_BMP}, + {16, 15, 25, 1, 0, helvR24L1_0x6B_BMP}, + {7, 3, 25, 2, 0, helvR24L1_0x6C_BMP}, + {27, 23, 18, 2, 0, helvR24L1_0x6D_BMP}, + {18, 14, 18, 2, 0, helvR24L1_0x6E_BMP}, + {18, 15, 18, 1, 0, helvR24L1_0x6F_BMP}, + {18, 15, 25, 2, -7, helvR24L1_0x70_BMP}, + {18, 15, 25, 1, -7, helvR24L1_0x71_BMP}, + {11, 8, 18, 2, 0, helvR24L1_0x72_BMP}, + {16, 13, 18, 2, 0, helvR24L1_0x73_BMP}, + {9, 8, 22, 1, 0, helvR24L1_0x74_BMP}, + {18, 14, 18, 2, 0, helvR24L1_0x75_BMP}, + {16, 15, 18, 0, 0, helvR24L1_0x76_BMP}, + {23, 23, 18, 0, 0, helvR24L1_0x77_BMP}, + {16, 15, 18, 0, 0, helvR24L1_0x78_BMP}, + {16, 14, 25, 1, -7, helvR24L1_0x79_BMP}, + {16, 14, 18, 1, 0, helvR24L1_0x7A_BMP}, + {11, 8, 32, 1, -7, helvR24L1_0x7B_BMP}, + {9, 2, 31, 3, -7, helvR24L1_0x7C_BMP}, + {11, 8, 32, 1, -7, helvR24L1_0x7D_BMP}, + {19, 14, 6, 2, 9, helvR24L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {9, 1, 1, 0, 0, helvR24L1_0xA0_BMP}, + {11, 3, 25, 4, -7, helvR24L1_0xA1_BMP}, + {19, 14, 25, 2, -4, helvR24L1_0xA2_BMP}, + {19, 15, 24, 1, 0, helvR24L1_0xA3_BMP}, + {18, 12, 13, 3, 5, helvR24L1_0xA4_BMP}, + {18, 16, 24, 1, 0, helvR24L1_0xA5_BMP}, + {9, 2, 32, 3, -7, helvR24L1_0xA6_BMP}, + {18, 15, 32, 1, -7, helvR24L1_0xA7_BMP}, + {11, 8, 3, 1, 22, helvR24L1_0xA8_BMP}, + {25, 24, 25, 0, 0, helvR24L1_0xA9_BMP}, + {12, 10, 15, 1, 10, helvR24L1_0xAA_BMP}, + {18, 12, 9, 3, 5, helvR24L1_0xAB_BMP}, + {19, 16, 9, 1, 3, helvR24L1_0xAC_BMP}, + {11, 8, 2, 1, 8, helvR24L1_0xAD_BMP}, + {25, 24, 25, 0, 0, helvR24L1_0xAE_BMP}, + {11, 9, 2, 1, 22, helvR24L1_0xAF_BMP}, + {13, 9, 9, 2, 15, helvR24L1_0xB0_BMP}, + {19, 17, 21, 1, 0, helvR24L1_0xB1_BMP}, + {11, 9, 15, 1, 9, helvR24L1_0xB2_BMP}, + {11, 9, 15, 1, 9, helvR24L1_0xB3_BMP}, + {11, 7, 5, 3, 22, helvR24L1_0xB4_BMP}, + {19, 14, 24, 2, -6, helvR24L1_0xB5_BMP}, + {17, 16, 30, 1, -5, helvR24L1_0xB6_BMP}, + {9, 4, 4, 3, 11, helvR24L1_0xB7_BMP}, + {11, 7, 7, 2, -7, helvR24L1_0xB8_BMP}, + {11, 5, 15, 2, 9, helvR24L1_0xB9_BMP}, + {12, 10, 15, 1, 10, helvR24L1_0xBA_BMP}, + {18, 12, 9, 3, 5, helvR24L1_0xBB_BMP}, + {28, 25, 25, 1, 0, helvR24L1_0xBC_BMP}, + {28, 25, 25, 1, 0, helvR24L1_0xBD_BMP}, + {28, 25, 24, 1, 0, helvR24L1_0xBE_BMP}, + {19, 14, 25, 3, -7, helvR24L1_0xBF_BMP}, + {22, 20, 31, 1, 0, helvR24L1_0xC0_BMP}, + {22, 20, 31, 1, 0, helvR24L1_0xC1_BMP}, + {22, 20, 31, 1, 0, helvR24L1_0xC2_BMP}, + {22, 20, 30, 1, 0, helvR24L1_0xC3_BMP}, + {22, 20, 30, 1, 0, helvR24L1_0xC4_BMP}, + {22, 20, 31, 1, 0, helvR24L1_0xC5_BMP}, + {32, 29, 25, 1, 0, helvR24L1_0xC6_BMP}, + {23, 20, 32, 2, -7, helvR24L1_0xC7_BMP}, + {22, 17, 31, 3, 0, helvR24L1_0xC8_BMP}, + {22, 17, 31, 3, 0, helvR24L1_0xC9_BMP}, + {22, 17, 31, 3, 0, helvR24L1_0xCA_BMP}, + {22, 17, 30, 3, 0, helvR24L1_0xCB_BMP}, + {9, 7, 31, 0, 0, helvR24L1_0xCC_BMP}, + {9, 7, 31, 2, 0, helvR24L1_0xCD_BMP}, + {9, 9, 31, 0, 0, helvR24L1_0xCE_BMP}, + {9, 9, 30, 0, 0, helvR24L1_0xCF_BMP}, + {23, 21, 25, 0, 0, helvR24L1_0xD0_BMP}, + {24, 19, 30, 2, 0, helvR24L1_0xD1_BMP}, + {25, 23, 31, 1, 0, helvR24L1_0xD2_BMP}, + {25, 23, 31, 1, 0, helvR24L1_0xD3_BMP}, + {25, 23, 31, 1, 0, helvR24L1_0xD4_BMP}, + {25, 23, 30, 1, 0, helvR24L1_0xD5_BMP}, + {25, 23, 29, 1, 0, helvR24L1_0xD6_BMP}, + {19, 15, 15, 2, 1, helvR24L1_0xD7_BMP}, + {25, 23, 25, 1, 0, helvR24L1_0xD8_BMP}, + {24, 18, 31, 3, 0, helvR24L1_0xD9_BMP}, + {24, 18, 31, 3, 0, helvR24L1_0xDA_BMP}, + {24, 18, 31, 3, 0, helvR24L1_0xDB_BMP}, + {24, 18, 30, 3, 0, helvR24L1_0xDC_BMP}, + {22, 19, 31, 1, 0, helvR24L1_0xDD_BMP}, + {22, 17, 25, 3, 0, helvR24L1_0xDE_BMP}, + {20, 14, 25, 4, 0, helvR24L1_0xDF_BMP}, + {18, 16, 25, 1, 0, helvR24L1_0xE0_BMP}, + {18, 16, 25, 1, 0, helvR24L1_0xE1_BMP}, + {18, 16, 25, 1, 0, helvR24L1_0xE2_BMP}, + {18, 16, 24, 1, 0, helvR24L1_0xE3_BMP}, + {18, 16, 23, 1, 0, helvR24L1_0xE4_BMP}, + {18, 16, 25, 1, 0, helvR24L1_0xE5_BMP}, + {29, 26, 18, 1, 0, helvR24L1_0xE6_BMP}, + {17, 14, 25, 1, -7, helvR24L1_0xE7_BMP}, + {18, 15, 25, 1, 0, helvR24L1_0xE8_BMP}, + {18, 15, 25, 1, 0, helvR24L1_0xE9_BMP}, + {18, 15, 25, 1, 0, helvR24L1_0xEA_BMP}, + {18, 15, 23, 1, 0, helvR24L1_0xEB_BMP}, + {9, 7, 25, 0, 0, helvR24L1_0xEC_BMP}, + {9, 7, 25, 2, 0, helvR24L1_0xED_BMP}, + {9, 9, 25, 0, 0, helvR24L1_0xEE_BMP}, + {9, 8, 23, 1, 0, helvR24L1_0xEF_BMP}, + {19, 15, 25, 1, 0, helvR24L1_0xF0_BMP}, + {18, 14, 24, 2, 0, helvR24L1_0xF1_BMP}, + {19, 15, 25, 1, 0, helvR24L1_0xF2_BMP}, + {19, 15, 25, 1, 0, helvR24L1_0xF3_BMP}, + {19, 15, 25, 1, 0, helvR24L1_0xF4_BMP}, + {19, 15, 24, 1, 0, helvR24L1_0xF5_BMP}, + {19, 15, 23, 1, 0, helvR24L1_0xF6_BMP}, + {19, 15, 15, 2, 1, helvR24L1_0xF7_BMP}, + {19, 16, 18, 2, 0, helvR24L1_0xF8_BMP}, + {19, 14, 25, 2, 0, helvR24L1_0xF9_BMP}, + {19, 14, 25, 2, 0, helvR24L1_0xFA_BMP}, + {19, 14, 25, 2, 0, helvR24L1_0xFB_BMP}, + {19, 14, 23, 2, 0, helvR24L1_0xFC_BMP}, + {17, 14, 32, 1, -7, helvR24L1_0xFD_BMP}, + {19, 15, 31, 2, -6, helvR24L1_0xFE_BMP}, + {17, 14, 30, 1, -7, helvR24L1_0xFF_BMP} +}; + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuFontHelv24Normal_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuFontHelv24Normal_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuFontHelv24Normal_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuFontHelv24Normal_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuFontHelv24Normal_GetFontChar, + McuFontHelv24Normal_FBBy, + McuFontHelv24Normal_GetUnderlineBoxHeight(), + McuFontHelv24Normal_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv24Normal_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuFontHelv24Normal_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv24Normal_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontHelv24Normal_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontHelv24Normal. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv24Normal.h b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv24Normal.h new file mode 100644 index 0000000..6638864 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/fonts/McuFontHelv24Normal.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontHelv24Normal.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuFontHelv24Normal +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 24 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuFontHelv24Normal_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuFontHelv24Normal_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuFontHelv24Normal_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuFontHelv24Normal_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuFontHelv24Normal_GetLineSpaceHeight(void); +** Deinit - void McuFontHelv24Normal_Deinit(void); +** Init - void McuFontHelv24Normal_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontHelv24Normal.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuFontHelv24Normal_module McuFontHelv24Normal module documentation +** @{ +*/ + + +#ifndef __McuFontHelv24Normal_H +#define __McuFontHelv24Normal_H + +/* MODULE McuFontHelv24Normal. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontHelv24Normalconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuFontHelv24Normal_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuFontHelv24Normal_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuFontHelv24Normal_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuFontHelv24Normal_GetLineSpaceHeight() \ + 3 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuFontHelv24Normal_GetUnderlineBoxHeight() \ + 7 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontHelv24Normal_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontHelv24Normal_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontHelv24Normal. */ + +#endif +/* ifndef __McuFontHelv24Normal_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/info.txt b/TSM_PicoW_Sensor/McuLib/info.txt new file mode 100644 index 0000000..00d6f52 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/info.txt @@ -0,0 +1,92 @@ +Repository and more details: https://github.com/ErichStyger/McuOnEclipseLibrary + +For CMake based build systems, templates are provided: +- ESP32: ESP32_CMakeLists.txt +- Raspberry Pi Pico (RP2040): RP2040_CMakeLists.txt + +This folder contains all the library sources: +- config: application specific configuration files +- src: source files + +Middleware and dedicated driver folders: +- FatFS: port of the ElmChan FatFS system +- fonts: graphical LCD fonts, used by McuFontDisplay +- FreeRTOS: FreeRTOS realtime operating system, optimized and tuned for Segger SystemView and Percepio Trace +- HDD44780: Driver for HD44780 LCDs with up to 4 lines (https://mcuoneclipse.com/2012/12/22/hd44780-2x16-character-display-for-kinetis-and-freedom-board/) +- rdimon: Semihosting retargeting with file I/O support +- SEGGER_RTT: Segger Realtime Terminal Library (https://www.segger.com/products/debug-probes/j-link/technology/real-time-transfer/about-real-time-transfer/) +- SEGGER_SysView: Segger Systemview Library for tracing FreeRTOS (https://www.segger.com/products/development-tools/systemview/) +- TraceRecorder: Percipio Tracealyzer library for FreeRTOS (https://percepio.com/tz/) +- LittlevGL: GUI library (https://littlevgl.com/) +- littleFS: littleFS transactional and high-integrity file system (https://github.com/littlefs-project/littlefs) +- minIni: a minimal INI file parser: https://www.compuphase.com/minini.htm +- Modbus: Modbus implementation, Heidelberg Energy Control EV charger + +Components of the McuOnEclipse (in alphabetical order) inside the 'src' Folder: +- C11, C21: subdrivers of McuQuadCounter +- Clock1: subdriver of McuGenericSWSPI +- DbgRd1: subdriver of McuOneWire +- DQ1: subdriver of McuOneWire +- Input1: subdriver of McuGenericSWSPI +- InputRB1: subdriver of McuOneWire +- McuArmTools: various ARM Cortex utilities +- McuButton: Push button driver +- McuCRC_*: CRC generation and calculation +- McuCriticalSection: critical section handling +- McuDebounce: Debouncing for McuButton +- McuDS18B20: Driver for the DS18B20 One-Wire temperature sensor library +- McuEE24: Driver for EEproms of type 24AA and 24LC. Supports 24AA08, 24LC08, 24AA16, 24LC16, 24AA32, 24LC32, 24AA256, 24LC256, 24FC256, 24AA512, 24LC512, 24FC256, 24AA1025, 24LC1025, 24FC1025 +- McuESP32: Interfacing with ESP32 from a MCU, including USB-CDC, monitor and bootloader interface +- McuEvents: event handling using a bit array +- McuExtRTC: driver for external I2C realtime clock (RTC). Supports DS1307, DS3231, DS3232 and DS1342 +- McuFontDisplay: Font rendering for graphical displays +- McuFXOS8700: Driver for the NXP FXOS8700 accelerometer/magnetometer +- McuGDisplay: Driver for graphical displays +- McuGenericI2C: Generic I2C driver using hardware I2C or software I2C +- McuGenericSWI2C: Software (bit banging) I2C driver +- McuGenericSWSPI: Software (bit banging) SPI driver +- McuGFont: Graphical font library driver. Several fonts are available in the 'fonts' subfolder +- McuGPIO: Generic GPIO pin driver +- McuHardfault: ARM Cortex-M hardfault handler +- McuI2cLib: Generic and portable I2C library using hardware I2C +- McuI2CSpy: I2C sniffing utility +- McuINA260: Driver for the Texas Instruments INA260 I2C power/voltage/current sensor +- McuIO: Generic buffered input/output driver +- McuLC709203F: Driver for the LC709203F battery/charing monitor device +- McuLED: generic LED driver for multiple LEDs +- McuLib: Configuration of the McuOnEclipse Library +- McuLog: Message and logging driver over UART, USB and RTT +- McuOneWire: 1-Wire communication driver +- McuPercepio: Configuration and interface to the Percepio Trace library +- McuPidFloat: Generic PID control loop using floating point values +- McuPidInt: Generic PID control loop using integer values +- McuQuadCounter: Quadrature Counter library +- McuRingBuffer: Generic Ring Buffer implementation +- McuRTOS: wrapper for FreeRTOS +- McuRTT: wrapper for Segger RTT +- McuSemihost: Low level semihosting for multiple debug probes, including file I/O +- McuSharpMemoryDisplay: Driver for the Sharp Memory displays +- McuShell: Driver for a command line shell +- McuShellCdcDevice: USB CDC driver for McuShell +- McuShellUart: UART driver for the McuShell +- McuSHT31: Driver for the Sensirion SHT31 temperature/humidity sensor +- McuSHT40: Driver for the Sensirion SHT40 temperature/humidity sensor +- McuSSD1306: display driver for SSD1306 and SH1106 +- McuST7735: display driver for ST7735 based displays +- McuSTM32HALI2C: low level I2C driver using STM32 CubeMX HAL +- McuSPI: Hardware SPI abstraction and interface to the SPI bus +- McuSWO: SWO (ARM Single Wire Output) library and command line support +- McuTimeDate: Realtime clock implementation for software, hardware and external I2C RTC +- McuTimeout: generic driver for timeout handling +- McuTrigger: generic interrupt callback handling +- McuULN2003: stepper motor driver using the ULN2003 +- McuUtility: various safe string manipulation and other utility functions +- McuWait: Realtime synchronization waiting routines +- McuWatchdog: COP/Watchdog timer module +- McuW28Q128: driver for the Winbond W28Q128 serial flash (https://mcuoneclipse.com/2019/01/06/driver-and-shell-for-winbond-w25q128-16mbyte-serial-flash-device/) +- McuX12_017: stepper motor driver for the X12.017 device +- McuXFormat: tiny formatting and printing, similar to sprintf +- Output1: subdriver of McuGenericSWSPI +- SCL1, SDA1: subdrivers for McuGenericSWI2C +- WPpin1: Write Protect pin for McuEE24 + diff --git a/TSM_PicoW_Sensor/McuLib/littleFS/DESIGN.md b/TSM_PicoW_Sensor/McuLib/littleFS/DESIGN.md new file mode 100644 index 0000000..9c9703a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/littleFS/DESIGN.md @@ -0,0 +1,2173 @@ +## The design of littlefs + +A little fail-safe filesystem designed for microcontrollers. + +``` + | | | .---._____ + .-----. | | +--|o |---| littlefs | +--| |---| | + '-----' '----------' + | | | +``` + +littlefs was originally built as an experiment to learn about filesystem design +in the context of microcontrollers. The question was: How would you build a +filesystem that is resilient to power-loss and flash wear without using +unbounded memory? + +This document covers the high-level design of littlefs, how it is different +than other filesystems, and the design decisions that got us here. For the +low-level details covering every bit on disk, check out [SPEC.md](SPEC.md). + +## The problem + +The embedded systems littlefs targets are usually 32-bit microcontrollers with +around 32 KiB of RAM and 512 KiB of ROM. These are often paired with SPI NOR +flash chips with about 4 MiB of flash storage. These devices are too small for +Linux and most existing filesystems, requiring code written specifically with +size in mind. + +Flash itself is an interesting piece of technology with its own quirks and +nuance. Unlike other forms of storage, writing to flash requires two +operations: erasing and programming. Programming (setting bits to 0) is +relatively cheap and can be very granular. Erasing however (setting bits to 1), +requires an expensive and destructive operation which gives flash its name. +[Wikipedia][wikipedia-flash] has more information on how exactly flash works. + +To make the situation more annoying, it's very common for these embedded +systems to lose power at any time. Usually, microcontroller code is simple and +reactive, with no concept of a shutdown routine. This presents a big challenge +for persistent storage, where an unlucky power loss can corrupt the storage and +leave a device unrecoverable. + +This leaves us with three major requirements for an embedded filesystem. + +1. **Power-loss resilience** - On these systems, power can be lost at any time. + If a power loss corrupts any persistent data structures, this can cause the + device to become unrecoverable. An embedded filesystem must be designed to + recover from a power loss during any write operation. + +1. **Wear leveling** - Writing to flash is destructive. If a filesystem + repeatedly writes to the same block, eventually that block will wear out. + Filesystems that don't take wear into account can easily burn through blocks + used to store frequently updated metadata and cause a device's early death. + +1. **Bounded RAM/ROM** - If the above requirements weren't enough, these + systems also have very limited amounts of memory. This prevents many + existing filesystem designs, which can lean on relatively large amounts of + RAM to temporarily store filesystem metadata. + + For ROM, this means we need to keep our design simple and reuse code paths + where possible. For RAM we have a stronger requirement, all RAM usage is + bounded. This means RAM usage does not grow as the filesystem changes in + size or number of files. This creates a unique challenge as even presumably + simple operations, such as traversing the filesystem, become surprisingly + difficult. + +## Existing designs? + +So, what's already out there? There are, of course, many different filesystems, +however they often share and borrow feature from each other. If we look at +power-loss resilience and wear leveling, we can narrow these down to a handful +of designs. + +1. First we have the non-resilient, block based filesystems, such as [FAT] and + [ext2]. These are the earliest filesystem designs and often the most simple. + Here storage is divided into blocks, with each file being stored in a + collection of blocks. Without modifications, these filesystems are not + power-loss resilient, so updating a file is a simple as rewriting the blocks + in place. + + ``` + .--------. + | root | + | | + | | + '--------' + .-' '-. + v v + .--------. .--------. + | A | | B | + | | | | + | | | | + '--------' '--------' + .-' .-' '-. + v v v + .--------. .--------. .--------. + | C | | D | | E | + | | | | | | + | | | | | | + '--------' '--------' '--------' + ``` + + Because of their simplicity, these filesystems are usually both the fastest + and smallest. However the lack of power resilience is not great, and the + binding relationship of storage location and data removes the filesystem's + ability to manage wear. + +2. In a completely different direction, we have logging filesystems, such as + [JFFS], [YAFFS], and [SPIFFS], storage location is not bound to a piece of + data, instead the entire storage is used for a circular log which is + appended with every change made to the filesystem. Writing appends new + changes, while reading requires traversing the log to reconstruct a file. + Some logging filesystems cache files to avoid the read cost, but this comes + at a tradeoff of RAM. + + ``` + v + .--------.--------.--------.--------.--------.--------.--------.--------. + | C | new B | new A | | A | B | + | | | |-> | | | + | | | | | | | + '--------'--------'--------'--------'--------'--------'--------'--------' + ``` + + Logging filesystem are beautifully elegant. With a checksum, we can easily + detect power-loss and fall back to the previous state by ignoring failed + appends. And if that wasn't good enough, their cyclic nature means that + logging filesystems distribute wear across storage perfectly. + + The main downside is performance. If we look at garbage collection, the + process of cleaning up outdated data from the end of the log, I've yet to + see a pure logging filesystem that does not have one of these two costs: + + 1. _O(n²)_ runtime + 2. _O(n)_ RAM + + SPIFFS is a very interesting case here, as it uses the fact that repeated + programs to NOR flash is both atomic and masking. This is a very neat + solution, however it limits the type of storage you can support. + +3. Perhaps the most common type of filesystem, a journaling filesystem is the + offspring that happens when you mate a block based filesystem with a logging + filesystem. [ext4] and [NTFS] are good examples. Here, we take a normal + block based filesystem and add a bounded log where we note every change + before it occurs. + + ``` + journal + .--------.--------. + .--------. | C'| D'| | E'| + | root |-->| | |-> | | + | | | | | | | + | | '--------'--------' + '--------' + .-' '-. + v v + .--------. .--------. + | A | | B | + | | | | + | | | | + '--------' '--------' + .-' .-' '-. + v v v + .--------. .--------. .--------. + | C | | D | | E | + | | | | | | + | | | | | | + '--------' '--------' '--------' + ``` + + + This sort of filesystem takes the best from both worlds. Performance can be + as fast as a block based filesystem (though updating the journal does have + a small cost), and atomic updates to the journal allow the filesystem to + recover in the event of a power loss. + + Unfortunately, journaling filesystems have a couple of problems. They are + fairly complex, since there are effectively two filesystems running in + parallel, which comes with a code size cost. They also offer no protection + against wear because of the strong relationship between storage location + and data. + +4. Last but not least we have copy-on-write (COW) filesystems, such as + [btrfs] and [ZFS]. These are very similar to other block based filesystems, + but instead of updating block inplace, all updates are performed by creating + a copy with the changes and replacing any references to the old block with + our new block. This recursively pushes all of our problems upwards until we + reach the root of our filesystem, which is often stored in a very small log. + + ``` + .--------. .--------. + | root | write |new root| + | | ==> | | + | | | | + '--------' '--------' + .-' '-. | '-. + | .-------|------------------' v + v v v .--------. + .--------. .--------. | new B | + | A | | B | | | + | | | | | | + | | | | '--------' + '--------' '--------' .-' | + .-' .-' '-. .------------|------' + | | | | v + v v v v .--------. + .--------. .--------. .--------. | new D | + | C | | D | | E | | | + | | | | | | | | + | | | | | | '--------' + '--------' '--------' '--------' + ``` + + COW filesystems are interesting. They offer very similar performance to + block based filesystems while managing to pull off atomic updates without + storing data changes directly in a log. They even disassociate the storage + location of data, which creates an opportunity for wear leveling. + + Well, almost. The unbounded upwards movement of updates causes some + problems. Because updates to a COW filesystem don't stop until they've + reached the root, an update can cascade into a larger set of writes than + would be needed for the original data. On top of this, the upward motion + focuses these writes into the block, which can wear out much earlier than + the rest of the filesystem. + +## littlefs + +So what does littlefs do? + +If we look at existing filesystems, there are two interesting design patterns +that stand out, but each have their own set of problems. Logging, which +provides independent atomicity, has poor runtime performance. And COW data +structures, which perform well, push the atomicity problem upwards. + +Can we work around these limitations? + +Consider logging. It has either a _O(n²)_ runtime or _O(n)_ RAM cost. We +can't avoid these costs, _but_ if we put an upper bound on the size we can at +least prevent the theoretical cost from becoming problem. This relies on the +super secret computer science hack where you can pretend any algorithmic +complexity is _O(1)_ by bounding the input. + +In the case of COW data structures, we can try twisting the definition a bit. +Let's say that our COW structure doesn't copy after a single write, but instead +copies after _n_ writes. This doesn't change most COW properties (assuming you +can write atomically!), but what it does do is prevent the upward motion of +wear. This sort of copy-on-bounded-writes (CObW) still focuses wear, but at +each level we divide the propagation of wear by _n_. With a sufficiently +large _n_ (> branching factor) wear propagation is no longer a problem. + +See where this is going? Separate, logging and COW are imperfect solutions and +have weaknesses that limit their usefulness. But if we merge the two they can +mutually solve each other's limitations. + +This is the idea behind littlefs. At the sub-block level, littlefs is built +out of small, two block logs that provide atomic updates to metadata anywhere +on the filesystem. At the super-block level, littlefs is a CObW tree of blocks +that can be evicted on demand. + +``` + root + .--------.--------. + | A'| B'| | + | | |-> | + | | | | + '--------'--------' + .----' '--------------. + A v B v + .--------.--------. .--------.--------. + | C'| D'| | | E'|new| | + | | |-> | | | E'|-> | + | | | | | | | | + '--------'--------' '--------'--------' + .-' '--. | '------------------. + v v .-' v +.--------. .--------. v .--------. +| C | | D | .--------. write | new E | +| | | | | E | ==> | | +| | | | | | | | +'--------' '--------' | | '--------' + '--------' .-' | + .-' '-. .-------------|------' + v v v v + .--------. .--------. .--------. + | F | | G | | new F | + | | | | | | + | | | | | | + '--------' '--------' '--------' +``` + +There are still some minor issues. Small logs can be expensive in terms of +storage, in the worst case a small log costs 4x the size of the original data. +CObW structures require an efficient block allocator since allocation occurs +every _n_ writes. And there is still the challenge of keeping the RAM usage +constant. + +## Metadata pairs + +Metadata pairs are the backbone of littlefs. These are small, two block logs +that allow atomic updates anywhere in the filesystem. + +Why two blocks? Well, logs work by appending entries to a circular buffer +stored on disk. But remember that flash has limited write granularity. We can +incrementally program new data onto erased blocks, but we need to erase a full +block at a time. This means that in order for our circular buffer to work, we +need more than one block. + +We could make our logs larger than two blocks, but the next challenge is how +do we store references to these logs? Because the blocks themselves are erased +during writes, using a data structure to track these blocks is complicated. +The simple solution here is to store a two block addresses for every metadata +pair. This has the added advantage that we can change out blocks in the +metadata pair independently, and we don't reduce our block granularity for +other operations. + +In order to determine which metadata block is the most recent, we store a +revision count that we compare using [sequence arithmetic][wikipedia-sna] +(very handy for avoiding problems with integer overflow). Conveniently, this +revision count also gives us a rough idea of how many erases have occurred on +the block. + +``` +metadata pair pointer: {block 0, block 1} + | '--------------------. + '-. | +disk v v +.--------.--------.--------.--------.--------.--------.--------.--------. +| | |metadata| |metadata| | +| | |block 0 | |block 1 | | +| | | | | | | +'--------'--------'--------'--------'--------'--------'--------'--------' + '--. .----' + v v + metadata pair .----------------.----------------. + | revision 11 | revision 12 | + block 1 is |----------------|----------------| + most recent | A | A'' | + |----------------|----------------| + | checksum | checksum | + |----------------|----------------| + | B | A''' | <- most recent A + |----------------|----------------| + | A'' | checksum | + |----------------|----------------| + | checksum | | | + |----------------| v | + '----------------'----------------' +``` + +So how do we atomically update our metadata pairs? Atomicity (a type of +power-loss resilience) requires two parts: redundancy and error detection. +Error detection can be provided with a checksum, and in littlefs's case we +use a 32-bit [CRC][wikipedia-crc]. Maintaining redundancy, on the other hand, +requires multiple stages. + +1. If our block is not full and the program size is small enough to let us + append more entries, we can simply append the entries to the log. Because + we don't overwrite the original entries (remember rewriting flash requires + an erase), we still have the original entries if we lose power during the + append. + + ``` + commit A + .----------------.----------------. .----------------.----------------. + | revision 1 | revision 0 | => | revision 1 | revision 0 | + |----------------|----------------| |----------------|----------------| + | | | | | A | | + | v | | |----------------| | + | | | | checksum | | + | | | |----------------| | + | | | | | | | + | | | | v | | + | | | | | | + | | | | | | + | | | | | | + | | | | | | + '----------------'----------------' '----------------'----------------' + ``` + + Note that littlefs doesn't maintain a checksum for each entry. Many logging + filesystems do this, but it limits what you can update in a single atomic + operation. What we can do instead is group multiple entries into a commit + that shares a single checksum. This lets us update multiple unrelated pieces + of metadata as long as they reside on the same metadata pair. + + ``` + commit B and A' + .----------------.----------------. .----------------.----------------. + | revision 1 | revision 0 | => | revision 1 | revision 0 | + |----------------|----------------| |----------------|----------------| + | A | | | A | | + |----------------| | |----------------| | + | checksum | | | checksum | | + |----------------| | |----------------| | + | | | | | B | | + | v | | |----------------| | + | | | | A' | | + | | | |----------------| | + | | | | checksum | | + | | | |----------------| | + '----------------'----------------' '----------------'----------------' + ``` + +2. If our block _is_ full of entries, we need to somehow remove outdated + entries to make space for new ones. This process is called garbage + collection, but because littlefs has multiple garbage collectors, we + also call this specific case compaction. + + Compared to other filesystems, littlefs's garbage collector is relatively + simple. We want to avoid RAM consumption, so we use a sort of brute force + solution where for each entry we check to see if a newer entry has been + written. If the entry is the most recent we append it to our new block. This + is where having two blocks becomes important, if we lose power we still have + everything in our original block. + + During this compaction step we also erase the metadata block and increment + the revision count. Because we can commit multiple entries at once, we can + write all of these changes to the second block without worrying about power + loss. It's only when the commit's checksum is written that the compacted + entries and revision count become committed and readable. + + ``` + commit B', need to compact + .----------------.----------------. .----------------.----------------. + | revision 1 | revision 0 | => | revision 1 | revision 2 | + |----------------|----------------| |----------------|----------------| + | A | | | A | A' | + |----------------| | |----------------|----------------| + | checksum | | | checksum | B' | + |----------------| | |----------------|----------------| + | B | | | B | checksum | + |----------------| | |----------------|----------------| + | A' | | | A' | | | + |----------------| | |----------------| v | + | checksum | | | checksum | | + |----------------| | |----------------| | + '----------------'----------------' '----------------'----------------' + ``` + +3. If our block is full of entries _and_ we can't find any garbage, then what? + At this point, most logging filesystems would return an error indicating no + more space is available, but because we have small logs, overflowing a log + isn't really an error condition. + + Instead, we split our original metadata pair into two metadata pairs, each + containing half of the entries, connected by a tail pointer. Instead of + increasing the size of the log and dealing with the scalability issues + associated with larger logs, we form a linked list of small bounded logs. + This is a tradeoff as this approach does use more storage space, but at the + benefit of improved scalability. + + Despite writing to two metadata pairs, we can still maintain power + resilience during this split step by first preparing the new metadata pair, + and then inserting the tail pointer during the commit to the original + metadata pair. + + ``` + commit C and D, need to split + .----------------.----------------. .----------------.----------------. + | revision 1 | revision 2 | => | revision 3 | revision 2 | + |----------------|----------------| |----------------|----------------| + | A | A' | | A' | A' | + |----------------|----------------| |----------------|----------------| + | checksum | B' | | B' | B' | + |----------------|----------------| |----------------|----------------| + | B | checksum | | tail ---------------------. + |----------------|----------------| |----------------|----------------| | + | A' | | | | checksum | | | + |----------------| v | |----------------| | | + | checksum | | | | | | | + |----------------| | | v | | | + '----------------'----------------' '----------------'----------------' | + .----------------.---------' + v v + .----------------.----------------. + | revision 1 | revision 0 | + |----------------|----------------| + | C | | + |----------------| | + | D | | + |----------------| | + | checksum | | + |----------------| | + | | | | + | v | | + | | | + | | | + '----------------'----------------' + ``` + +There is another complexity the crops up when dealing with small logs. The +amortized runtime cost of garbage collection is not only dependent on its +one time cost (_O(n²)_ for littlefs), but also depends on how often +garbage collection occurs. + +Consider two extremes: + +1. Log is empty, garbage collection occurs once every _n_ updates +2. Log is full, garbage collection occurs **every** update + +Clearly we need to be more aggressive than waiting for our metadata pair to +be full. As the metadata pair approaches fullness the frequency of compactions +grows very rapidly. + +Looking at the problem generically, consider a log with ![n] bytes for each +entry, ![d] dynamic entries (entries that are outdated during garbage +collection), and ![s] static entries (entries that need to be copied during +garbage collection). If we look at the amortized runtime complexity of updating +this log we get this formula: + +![cost = n + n (s / d+1)][metadata-formula1] + +If we let ![r] be the ratio of static space to the size of our log in bytes, we +find an alternative representation of the number of static and dynamic entries: + +![s = r (size/n)][metadata-formula2] + +![d = (1 - r) (size/n)][metadata-formula3] + +Substituting these in for ![d] and ![s] gives us a nice formula for the cost of +updating an entry given how full the log is: + +![cost = n + n (r (size/n) / ((1-r) (size/n) + 1))][metadata-formula4] + +Assuming 100 byte entries in a 4 KiB log, we can graph this using the entry +size to find a multiplicative cost: + +![Metadata pair update cost graph][metadata-cost-graph] + +So at 50% usage, we're seeing an average of 2x cost per update, and at 75% +usage, we're already at an average of 4x cost per update. + +To avoid this exponential growth, instead of waiting for our metadata pair +to be full, we split the metadata pair once we exceed 50% capacity. We do this +lazily, waiting until we need to compact before checking if we fit in our 50% +limit. This limits the overhead of garbage collection to 2x the runtime cost, +giving us an amortized runtime complexity of _O(1)_. + +--- + +If we look at metadata pairs and linked-lists of metadata pairs at a high +level, they have fairly nice runtime costs. Assuming _n_ metadata pairs, +each containing _m_ metadata entries, the _lookup_ cost for a specific +entry has a worst case runtime complexity of _O(nm)_. For _updating_ a specific +entry, the worst case complexity is _O(nm²)_, with an amortized complexity +of only _O(nm)_. + +However, splitting at 50% capacity does mean that in the best case our +metadata pairs will only be 1/2 full. If we include the overhead of the second +block in our metadata pair, each metadata entry has an effective storage cost +of 4x the original size. I imagine users would not be happy if they found +that they can only use a quarter of their original storage. Metadata pairs +provide a mechanism for performing atomic updates, but we need a separate +mechanism for storing the bulk of our data. + +## CTZ skip-lists + +Metadata pairs provide efficient atomic updates but unfortunately have a large +storage cost. But we can work around this storage cost by only using the +metadata pairs to store references to more dense, copy-on-write (COW) data +structures. + +[Copy-on-write data structures][wikipedia-cow], also called purely functional +data structures, are a category of data structures where the underlying +elements are immutable. Making changes to the data requires creating new +elements containing a copy of the updated data and replacing any references +with references to the new elements. Generally, the performance of a COW data +structure depends on how many old elements can be reused after replacing parts +of the data. + +littlefs has several requirements of its COW structures. They need to be +efficient to read and write, but most frustrating, they need to be traversable +with a constant amount of RAM. Notably this rules out +[B-trees][wikipedia-B-tree], which can not be traversed with constant RAM, and +[B+-trees][wikipedia-B+-tree], which are not possible to update with COW +operations. + +--- + +So, what can we do? First let's consider storing files in a simple COW +linked-list. Appending a block, which is the basis for writing files, means we +have to update the last block to point to our new block. This requires a COW +operation, which means we need to update the second-to-last block, and then the +third-to-last, and so on until we've copied out the entire file. + +``` +A linked-list +.--------. .--------. .--------. .--------. .--------. .--------. +| data 0 |->| data 1 |->| data 2 |->| data 4 |->| data 5 |->| data 6 | +| | | | | | | | | | | | +| | | | | | | | | | | | +'--------' '--------' '--------' '--------' '--------' '--------' +``` + +To avoid a full copy during appends, we can store the data backwards. Appending +blocks just requires adding the new block and no other blocks need to be +updated. If we update a block in the middle, we still need to copy the +following blocks, but can reuse any blocks before it. Since most file writes +are linear, this design gambles that appends are the most common type of data +update. + +``` +A backwards linked-list +.--------. .--------. .--------. .--------. .--------. .--------. +| data 0 |<-| data 1 |<-| data 2 |<-| data 4 |<-| data 5 |<-| data 6 | +| | | | | | | | | | | | +| | | | | | | | | | | | +'--------' '--------' '--------' '--------' '--------' '--------' +``` + +However, a backwards linked-list does have a rather glaring problem. Iterating +over a file _in order_ has a runtime cost of _O(n²)_. A quadratic runtime +just to read a file! That's awful. + +Fortunately we can do better. Instead of a singly linked list, littlefs +uses a multilayered linked-list often called a +[skip-list][wikipedia-skip-list]. However, unlike the most common type of +skip-list, littlefs's skip-lists are strictly deterministic built around some +interesting properties of the count-trailing-zeros (CTZ) instruction. + +The rules CTZ skip-lists follow are that for every _n_‍th block where _n_ +is divisible by 2‍_ˣ_, that block contains a pointer to block +_n_-2‍_ˣ_. This means that each block contains anywhere from 1 to +log₂_n_ pointers that skip to different preceding elements of the +skip-list. + +The name comes from heavy use of the [CTZ instruction][wikipedia-ctz], which +lets us calculate the power-of-two factors efficiently. For a given block _n_, +that block contains ctz(_n_)+1 pointers. + +``` +A backwards CTZ skip-list +.--------. .--------. .--------. .--------. .--------. .--------. +| data 0 |<-| data 1 |<-| data 2 |<-| data 3 |<-| data 4 |<-| data 5 | +| |<-| |--| |<-| |--| | | | +| |<-| |--| |--| |--| | | | +'--------' '--------' '--------' '--------' '--------' '--------' +``` + +The additional pointers let us navigate the data-structure on disk much more +efficiently than in a singly linked list. + +Consider a path from data block 5 to data block 1. You can see how data block 3 +was completely skipped: +``` +.--------. .--------. .--------. .--------. .--------. .--------. +| data 0 | | data 1 |<-| data 2 | | data 3 | | data 4 |<-| data 5 | +| | | | | |<-| |--| | | | +| | | | | | | | | | | | +'--------' '--------' '--------' '--------' '--------' '--------' +``` + +The path to data block 0 is even faster, requiring only two jumps: +``` +.--------. .--------. .--------. .--------. .--------. .--------. +| data 0 | | data 1 | | data 2 | | data 3 | | data 4 |<-| data 5 | +| | | | | | | | | | | | +| |<-| |--| |--| |--| | | | +'--------' '--------' '--------' '--------' '--------' '--------' +``` + +We can find the runtime complexity by looking at the path to any block from +the block containing the most pointers. Every step along the path divides +the search space for the block in half, giving us a runtime of _O(log n)_. +To get _to_ the block with the most pointers, we can perform the same steps +backwards, which puts the runtime at _O(2 log n)_ = _O(log n)_. An interesting +note is that this optimal path occurs naturally if we greedily choose the +pointer that covers the most distance without passing our target. + +So now we have a [COW] data structure that is cheap to append with a runtime +of _O(1)_, and can be read with a worst case runtime of _O(n log n)_. Given +that this runtime is also divided by the amount of data we can store in a +block, this cost is fairly reasonable. + +--- + +This is a new data structure, so we still have several questions. What is the +storage overhead? Can the number of pointers exceed the size of a block? How do +we store a CTZ skip-list in our metadata pairs? + +To find the storage overhead, we can look at the data structure as multiple +linked-lists. Each linked-list skips twice as many blocks as the previous, +or from another perspective, each linked-list uses half as much storage as +the previous. As we approach infinity, the storage overhead forms a geometric +series. Solving this tells us that on average our storage overhead is only +2 pointers per block. + +![lim,n->inf((1/n)sum,i,0->n(ctz(i)+1)) = sum,i,0->inf(1/2^i) = 2][ctz-formula1] + +Because our file size is limited the word width we use to store sizes, we can +also solve for the maximum number of pointers we would ever need to store in a +block. If we set the overhead of pointers equal to the block size, we get the +following equation. Note that both a smaller block size (![B][bigB]) and larger +word width (![w]) result in more storage overhead. + +![B = (w/8)ceil(log2(2^w / (B-2w/8)))][ctz-formula2] + +Solving the equation for ![B][bigB] gives us the minimum block size for some +common word widths: + +1. 32-bit CTZ skip-list => minimum block size of 104 bytes +2. 64-bit CTZ skip-list => minimum block size of 448 bytes + +littlefs uses a 32-bit word width, so our blocks can only overflow with +pointers if they are smaller than 104 bytes. This is an easy requirement, as +in practice, most block sizes start at 512 bytes. As long as our block size +is larger than 104 bytes, we can avoid the extra logic needed to handle +pointer overflow. + +This last question is how do we store CTZ skip-lists? We need a pointer to the +head block, the size of the skip-list, the index of the head block, and our +offset in the head block. But it's worth noting that each size maps to a unique +index + offset pair. So in theory we can store only a single pointer and size. + +However, calculating the index + offset pair from the size is a bit +complicated. We can start with a summation that loops through all of the blocks +up until our given size. Let ![B][bigB] be the block size in bytes, ![w] be the +word width in bits, ![n] be the index of the block in the skip-list, and +![N][bigN] be the file size in bytes: + +![N = sum,i,0->n(B-(w/8)(ctz(i)+1))][ctz-formula3] + +This works quite well, but requires _O(n)_ to compute, which brings the full +runtime of reading a file up to _O(n² log n)_. Fortunately, that summation +doesn't need to touch the disk, so the practical impact is minimal. + +However, despite the integration of a bitwise operation, we can actually reduce +this equation to a _O(1)_ form. While browsing the amazing resource that is +the [On-Line Encyclopedia of Integer Sequences (OEIS)][oeis], I managed to find +[A001511], which matches the iteration of the CTZ instruction, +and [A005187], which matches its partial summation. Much to my +surprise, these both result from simple equations, leading us to a rather +unintuitive property that ties together two seemingly unrelated bitwise +instructions: + +![sum,i,0->n(ctz(i)+1) = 2n-popcount(n)][ctz-formula4] + +where: + +1. ctz(![x]) = the number of trailing bits that are 0 in ![x] +2. popcount(![x]) = the number of bits that are 1 in ![x] + +Initial tests of this surprising property seem to hold. As ![n] approaches +infinity, we end up with an average overhead of 2 pointers, which matches our +assumption from earlier. During iteration, the popcount function seems to +handle deviations from this average. Of course, just to make sure I wrote a +quick script that verified this property for all 32-bit integers. + +Now we can substitute into our original equation to find a more efficient +equation for file size: + +![N = Bn - (w/8)(2n-popcount(n))][ctz-formula5] + +Unfortunately, the popcount function is non-injective, so we can't solve this +equation for our index. But what we can do is solve for an ![n'] index that +is greater than ![n] with error bounded by the range of the popcount function. +We can repeatedly substitute ![n'] into the original equation until the error +is smaller than our integer resolution. As it turns out, we only need to +perform this substitution once, which gives us this formula for our index: + +![n = floor((N-(w/8)popcount(N/(B-2w/8))) / (B-2w/8))][ctz-formula6] + +Now that we have our index ![n], we can just plug it back into the above +equation to find the offset. We run into a bit of a problem with integer +overflow, but we can avoid this by rearranging the equation a bit: + +![off = N - (B-2w/8)n - (w/8)popcount(n)][ctz-formula7] + +Our solution requires quite a bit of math, but computers are very good at math. +Now we can find both our block index and offset from a size in _O(1)_, letting +us store CTZ skip-lists with only a pointer and size. + +CTZ skip-lists give us a COW data structure that is easily traversable in +_O(n)_, can be appended in _O(1)_, and can be read in _O(n log n)_. All of +these operations work in a bounded amount of RAM and require only two words of +storage overhead per block. In combination with metadata pairs, CTZ skip-lists +provide power resilience and compact storage of data. + +``` + .--------. + .|metadata| + || | + || | + |'--------' + '----|---' + v +.--------. .--------. .--------. .--------. +| data 0 |<-| data 1 |<-| data 2 |<-| data 3 | +| |<-| |--| | | | +| | | | | | | | +'--------' '--------' '--------' '--------' + +write data to disk, create copies +=> + .--------. + .|metadata| + || | + || | + |'--------' + '----|---' + v +.--------. .--------. .--------. .--------. +| data 0 |<-| data 1 |<-| data 2 |<-| data 3 | +| |<-| |--| | | | +| | | | | | | | +'--------' '--------' '--------' '--------' + ^ ^ ^ + | | | .--------. .--------. .--------. .--------. + | | '----| new |<-| new |<-| new |<-| new | + | '----------------| data 2 |<-| data 3 |--| data 4 | | data 5 | + '------------------| |--| |--| | | | + '--------' '--------' '--------' '--------' + +commit to metadata pair +=> + .--------. + .|new | + ||metadata| + || | + |'--------' + '----|---' + | +.--------. .--------. .--------. .--------. | +| data 0 |<-| data 1 |<-| data 2 |<-| data 3 | | +| |<-| |--| | | | | +| | | | | | | | | +'--------' '--------' '--------' '--------' | + ^ ^ ^ v + | | | .--------. .--------. .--------. .--------. + | | '----| new |<-| new |<-| new |<-| new | + | '----------------| data 2 |<-| data 3 |--| data 4 | | data 5 | + '------------------| |--| |--| | | | + '--------' '--------' '--------' '--------' +``` + +## The block allocator + +So we now have the framework for an atomic, wear leveling filesystem. Small two +block metadata pairs provide atomic updates, while CTZ skip-lists provide +compact storage of data in COW blocks. + +But now we need to look at the [elephant] in the room. Where do all these +blocks come from? + +Deciding which block to use next is the responsibility of the block allocator. +In filesystem design, block allocation is often a second-class citizen, but in +a COW filesystem its role becomes much more important as it is needed for +nearly every write to the filesystem. + +Normally, block allocation involves some sort of free list or bitmap stored on +the filesystem that is updated with free blocks. However, with power +resilience, keeping these structures consistent becomes difficult. It doesn't +help that any mistake in updating these structures can result in lost blocks +that are impossible to recover. + +littlefs takes a cautious approach. Instead of trusting a free list on disk, +littlefs relies on the fact that the filesystem on disk is a mirror image of +the free blocks on the disk. The block allocator operates much like a garbage +collector in a scripting language, scanning for unused blocks on demand. + +``` + .----. + |root| + | | + '----' + v-------' '-------v +.----. . . .----. +| A | . . | B | +| | . . | | +'----' . . '----' +. . . . v--' '------------v---------v +. . . .----. . .----. .----. +. . . | C | . | D | | E | +. . . | | . | | | | +. . . '----' . '----' '----' +. . . . . . . . . . +.----.----.----.----.----.----.----.----.----.----.----.----. +| A | |root| C | B | | D | | E | | +| | | | | | | | | | | +'----'----'----'----'----'----'----'----'----'----'----'----' + ^ ^ ^ ^ ^ + '-------------------'----'-------------------'----'-- free blocks +``` + +While this approach may sound complicated, the decision to not maintain a free +list greatly simplifies the overall design of littlefs. Unlike programming +languages, there are only a handful of data structures we need to traverse. +And block deallocation, which occurs nearly as often as block allocation, +is simply a noop. This "drop it on the floor" strategy greatly reduces the +complexity of managing on disk data structures, especially when handling +high-risk error conditions. + +--- + +Our block allocator needs to find free blocks efficiently. You could traverse +through every block on storage and check each one against our filesystem tree; +however, the runtime would be abhorrent. We need to somehow collect multiple +blocks per traversal. + +Looking at existing designs, some larger filesystems that use a similar "drop +it on the floor" strategy store a bitmap of the entire storage in [RAM]. This +works well because bitmaps are surprisingly compact. We can't use the same +strategy here, as it violates our constant RAM requirement, but we may be able +to modify the idea into a workable solution. + +``` +.----.----.----.----.----.----.----.----.----.----.----.----. +| A | |root| C | B | | D | | E | | +| | | | | | | | | | | +'----'----'----'----'----'----'----'----'----'----'----'----' + 1 0 1 1 1 0 0 1 0 1 0 0 + \---------------------------+----------------------------/ + v + bitmap: 0xb94 (0b101110010100) +``` + +The block allocator in littlefs is a compromise between a disk-sized bitmap and +a brute force traversal. Instead of a bitmap the size of storage, we keep track +of a small, fixed-size bitmap called the lookahead buffer. During block +allocation, we take blocks from the lookahead buffer. If the lookahead buffer +is empty, we scan the filesystem for more free blocks, populating our lookahead +buffer. In each scan we use an increasing offset, circling the storage as +blocks are allocated. + +Here's what it might look like to allocate 4 blocks on a decently busy +filesystem with a 32 bit lookahead and a total of 128 blocks (512 KiB +of storage if blocks are 4 KiB): +``` +boot... lookahead: + fs blocks: fffff9fffffffffeffffffffffff0000 +scanning... lookahead: fffff9ff + fs blocks: fffff9fffffffffeffffffffffff0000 +alloc = 21 lookahead: fffffdff + fs blocks: fffffdfffffffffeffffffffffff0000 +alloc = 22 lookahead: ffffffff + fs blocks: fffffffffffffffeffffffffffff0000 +scanning... lookahead: fffffffe + fs blocks: fffffffffffffffeffffffffffff0000 +alloc = 63 lookahead: ffffffff + fs blocks: ffffffffffffffffffffffffffff0000 +scanning... lookahead: ffffffff + fs blocks: ffffffffffffffffffffffffffff0000 +scanning... lookahead: ffffffff + fs blocks: ffffffffffffffffffffffffffff0000 +scanning... lookahead: ffff0000 + fs blocks: ffffffffffffffffffffffffffff0000 +alloc = 112 lookahead: ffff8000 + fs blocks: ffffffffffffffffffffffffffff8000 +``` + +This lookahead approach has a runtime complexity of _O(n²)_ to completely +scan storage; however, bitmaps are surprisingly compact, and in practice only +one or two passes are usually needed to find free blocks. Additionally, the +performance of the allocator can be optimized by adjusting the block size or +size of the lookahead buffer, trading either write granularity or RAM for +allocator performance. + +## Wear leveling + +The block allocator has a secondary role: wear leveling. + +Wear leveling is the process of distributing wear across all blocks in the +storage to prevent the filesystem from experiencing an early death due to +wear on a single block in the storage. + +littlefs has two methods of protecting against wear: +1. Detection and recovery from bad blocks +2. Evenly distributing wear across dynamic blocks + +--- + +Recovery from bad blocks doesn't actually have anything to do with the block +allocator itself. Instead, it relies on the ability of the filesystem to detect +and evict bad blocks when they occur. + +In littlefs, it is fairly straightforward to detect bad blocks at write time. +All writes must be sourced by some form of data in RAM, so immediately after we +write to a block, we can read the data back and verify that it was written +correctly. If we find that the data on disk does not match the copy we have in +RAM, a write error has occurred and we most likely have a bad block. + +Once we detect a bad block, we need to recover from it. In the case of write +errors, we have a copy of the corrupted data in RAM, so all we need to do is +evict the bad block, allocate a new, hopefully good block, and repeat the write +that previously failed. + +The actual act of evicting the bad block and replacing it with a new block is +left up to the filesystem's copy-on-bounded-writes (CObW) data structures. One +property of CObW data structures is that any block can be replaced during a +COW operation. The bounded-writes part is normally triggered by a counter, but +nothing prevents us from triggering a COW operation as soon as we find a bad +block. + +``` + .----. + |root| + | | + '----' + v--' '----------------------v +.----. .----. +| A | | B | +| | | | +'----' '----' +. . v---' . +. . .----. . +. . | C | . +. . | | . +. . '----' . +. . . . . +.----.----.----.----.----.----.----.----.----.----. +| A |root| | C | B | | +| | | | | | | +'----'----'----'----'----'----'----'----'----'----' + +update C +=> + .----. + |root| + | | + '----' + v--' '----------------------v +.----. .----. +| A | | B | +| | | | +'----' '----' +. . v---' . +. . .----. . +. . |bad | . +. . |blck| . +. . '----' . +. . . . . +.----.----.----.----.----.----.----.----.----.----. +| A |root| |bad | B | | +| | | |blck| | | +'----'----'----'----'----'----'----'----'----'----' + +oh no! bad block! relocate C +=> + .----. + |root| + | | + '----' + v--' '----------------------v +.----. .----. +| A | | B | +| | | | +'----' '----' +. . v---' . +. . .----. . +. . |bad | . +. . |blck| . +. . '----' . +. . . . . +.----.----.----.----.----.----.----.----.----.----. +| A |root| |bad | B |bad | | +| | | |blck| |blck| | +'----'----'----'----'----'----'----'----'----'----' + ---------> +oh no! bad block! relocate C +=> + .----. + |root| + | | + '----' + v--' '----------------------v +.----. .----. +| A | | B | +| | | | +'----' '----' +. . v---' . +. . .----. . .----. +. . |bad | . | C' | +. . |blck| . | | +. . '----' . '----' +. . . . . . . +.----.----.----.----.----.----.----.----.----.----. +| A |root| |bad | B |bad | C' | | +| | | |blck| |blck| | | +'----'----'----'----'----'----'----'----'----'----' + --------------> +successfully relocated C, update B +=> + .----. + |root| + | | + '----' + v--' '----------------------v +.----. .----. +| A | |bad | +| | |blck| +'----' '----' +. . v---' . +. . .----. . .----. +. . |bad | . | C' | +. . |blck| . | | +. . '----' . '----' +. . . . . . . +.----.----.----.----.----.----.----.----.----.----. +| A |root| |bad |bad |bad | C' | | +| | | |blck|blck|blck| | | +'----'----'----'----'----'----'----'----'----'----' + +oh no! bad block! relocate B +=> + .----. + |root| + | | + '----' + v--' '----------------------v +.----. .----. .----. +| A | |bad | |bad | +| | |blck| |blck| +'----' '----' '----' +. . v---' . . . +. . .----. . .----. . +. . |bad | . | C' | . +. . |blck| . | | . +. . '----' . '----' . +. . . . . . . . +.----.----.----.----.----.----.----.----.----.----. +| A |root| |bad |bad |bad | C' |bad | +| | | |blck|blck|blck| |blck| +'----'----'----'----'----'----'----'----'----'----' + --------------> +oh no! bad block! relocate B +=> + .----. + |root| + | | + '----' + v--' '----------------------v +.----. .----. .----. +| A | | B' | |bad | +| | | | |blck| +'----' '----' '----' +. . . | . .---' . +. . . '--------------v-------------v +. . . . .----. . .----. +. . . . |bad | . | C' | +. . . . |blck| . | | +. . . . '----' . '----' +. . . . . . . . . +.----.----.----.----.----.----.----.----.----.----. +| A |root| B' | |bad |bad |bad | C' |bad | +| | | | |blck|blck|blck| |blck| +'----'----'----'----'----'----'----'----'----'----' +------------> ------------------ +successfully relocated B, update root +=> + .----. + |root| + | | + '----' + v--' '--v +.----. .----. +| A | | B' | +| | | | +'----' '----' +. . . '---------------------------v +. . . . .----. +. . . . | C' | +. . . . | | +. . . . '----' +. . . . . . +.----.----.----.----.----.----.----.----.----.----. +| A |root| B' | |bad |bad |bad | C' |bad | +| | | | |blck|blck|blck| |blck| +'----'----'----'----'----'----'----'----'----'----' +``` + +We may find that the new block is also bad, but hopefully after repeating this +cycle we'll eventually find a new block where a write succeeds. If we don't, +that means that all blocks in our storage are bad, and we've reached the end of +our device's usable life. At this point, littlefs will return an "out of space" +error. This is technically true, as there are no more good blocks, but as an +added benefit it also matches the error condition expected by users of +dynamically sized data. + +--- + +Read errors, on the other hand, are quite a bit more complicated. We don't have +a copy of the data lingering around in RAM, so we need a way to reconstruct the +original data even after it has been corrupted. One such mechanism for this is +[error-correction-codes (ECC)][wikipedia-ecc]. + +ECC is an extension to the idea of a checksum. Where a checksum such as CRC can +detect that an error has occurred in the data, ECC can detect and actually +correct some amount of errors. However, there is a limit to how many errors ECC +can detect: the [Hamming bound][wikipedia-hamming-bound]. As the number of +errors approaches the Hamming bound, we may still be able to detect errors, but +can no longer fix the data. If we've reached this point the block is +unrecoverable. + +littlefs by itself does **not** provide ECC. The block nature and relatively +large footprint of ECC does not work well with the dynamically sized data of +filesystems, correcting errors without RAM is complicated, and ECC fits better +with the geometry of block devices. In fact, several NOR flash chips have extra +storage intended for ECC, and many NAND chips can even calculate ECC on the +chip itself. + +In littlefs, ECC is entirely optional. Read errors can instead be prevented +proactively by wear leveling. But it's important to note that ECC can be used +at the block device level to modestly extend the life of a device. littlefs +respects any errors reported by the block device, allowing a block device to +provide additional aggressive error detection. + +--- + +To avoid read errors, we need to be proactive, as opposed to reactive as we +were with write errors. + +One way to do this is to detect when the number of errors in a block exceeds +some threshold, but is still recoverable. With ECC we can do this at write +time, and treat the error as a write error, evicting the block before fatal +read errors have a chance to develop. + +A different, more generic strategy, is to proactively distribute wear across +all blocks in the storage, with the hope that no single block fails before the +rest of storage is approaching the end of its usable life. This is called +wear leveling. + +Generally, wear leveling algorithms fall into one of two categories: + +1. [Dynamic wear leveling][wikipedia-dynamic-wear-leveling], where we + distribute wear over "dynamic" blocks. The can be accomplished by + only considering unused blocks. + +2. [Static wear leveling][wikipedia-static-wear-leveling], where we + distribute wear over both "dynamic" and "static" blocks. To make this work, + we need to consider all blocks, including blocks that already contain data. + +As a tradeoff for code size and complexity, littlefs (currently) only provides +dynamic wear leveling. This is a best effort solution. Wear is not distributed +perfectly, but it is distributed among the free blocks and greatly extends the +life of a device. + +On top of this, littlefs uses a statistical wear leveling algorithm. What this +means is that we don’t actively track wear, instead we rely on a uniform +distribution of wear across storage to approximate a dynamic wear leveling +algorithm. Despite the long name, this is actually a simplification of dynamic +wear leveling. + +The uniform distribution of wear is left up to the block allocator, which +creates a uniform distribution in two parts. The easy part is when the device +is powered, in which case we allocate the blocks linearly, circling the device. +The harder part is what to do when the device loses power. We can't just +restart the allocator at the beginning of storage, as this would bias the wear. +Instead, we start the allocator as a random offset every time we mount the +filesystem. As long as this random offset is uniform, the combined allocation +pattern is also a uniform distribution. + +![Cumulative wear distribution graph][wear-distribution-graph] + +Initially, this approach to wear leveling looks like it creates a difficult +dependency on a power-independent random number generator, which must return +different random numbers on each boot. However, the filesystem is in a +relatively unique situation in that it is sitting on top of a large of amount +of entropy that persists across power loss. + +We can actually use the data on disk to directly drive our random number +generator. In practice, this is implemented by xoring the checksums of each +metadata pair, which is already calculated to fetch and mount the filesystem. + +``` + .--------. \ probably random + .|metadata| | ^ + || | +-> crc ----------------------> xor + || | | ^ + |'--------' / | + '---|--|-' | + .-' '-------------------------. | + | | | + | .--------------> xor ------------> xor + | | ^ | ^ + v crc crc v crc + .--------. \ ^ .--------. \ ^ .--------. \ ^ + .|metadata|-|--|-->|metadata| | | .|metadata| | | + || | +--' || | +--' || | +--' + || | | || | | || | | + |'--------' / |'--------' / |'--------' / + '---|--|-' '----|---' '---|--|-' + .-' '-. | .-' '-. + v v v v v +.--------. .--------. .--------. .--------. .--------. +| data | | data | | data | | data | | data | +| | | | | | | | | | +| | | | | | | | | | +'--------' '--------' '--------' '--------' '--------' +``` + +Note that this random number generator is not perfect. It only returns unique +random numbers when the filesystem is modified. This is exactly what we want +for distributing wear in the allocator, but means this random number generator +is not useful for general use. + +--- + +Together, bad block detection and dynamic wear leveling provide a best effort +solution for avoiding the early death of a filesystem due to wear. Importantly, +littlefs's wear leveling algorithm provides a key feature: You can increase the +life of a device simply by increasing the size of storage. And if more +aggressive wear leveling is desired, you can always combine littlefs with a +[flash translation layer (FTL)][wikipedia-ftl] to get a small power resilient +filesystem with static wear leveling. + +## Files + +Now that we have our building blocks out of the way, we can start looking at +our filesystem as a whole. + +The first step: How do we actually store our files? + +We've determined that CTZ skip-lists are pretty good at storing data compactly, +so following the precedent found in other filesystems we could give each file +a skip-list stored in a metadata pair that acts as an inode for the file. + + +``` + .--------. + .|metadata| + || | + || | + |'--------' + '----|---' + v +.--------. .--------. .--------. .--------. +| data 0 |<-| data 1 |<-| data 2 |<-| data 3 | +| |<-| |--| | | | +| | | | | | | | +'--------' '--------' '--------' '--------' +``` + +However, this doesn't work well when files are small, which is common for +embedded systems. Compared to PCs, _all_ data in an embedded system is small. + +Consider a small 4-byte file. With a two block metadata-pair and one block for +the CTZ skip-list, we find ourselves using a full 3 blocks. On most NOR flash +with 4 KiB blocks, this is 12 KiB of overhead. A ridiculous 3072x increase. + +``` +file stored as inode, 4 bytes costs ~12 KiB + + .----------------. \ +.| revision | | +||----------------| \ | +|| skiplist ---. +- metadata | +||----------------| | / 4x8 bytes | +|| checksum | | 32 bytes | +||----------------| | | +|| | | | +- metadata pair +|| v | | | 2x4 KiB +|| | | | 8 KiB +|| | | | +|| | | | +|| | | | +|'----------------' | | +'----------------' | / + .--------' + v + .----------------. \ \ + | data | +- data | + |----------------| / 4 bytes | + | | | + | | | + | | | + | | +- data block + | | | 4 KiB + | | | + | | | + | | | + | | | + | | | + '----------------' / +``` + +We can make several improvements. First, instead of giving each file its own +metadata pair, we can store multiple files in a single metadata pair. One way +to do this is to directly associate a directory with a metadata pair (or a +linked list of metadata pairs). This makes it easy for multiple files to share +the directory's metadata pair for logging and reduces the collective storage +overhead. + +The strict binding of metadata pairs and directories also gives users +direct control over storage utilization depending on how they organize their +directories. + +``` +multiple files stored in metadata pair, 4 bytes costs ~4 KiB + + .----------------. + .| revision | + ||----------------| + || A name | + || A skiplist -----. + ||----------------| | \ + || B name | | +- metadata + || B skiplist ---. | | 4x8 bytes + ||----------------| | | / 32 bytes + || checksum | | | + ||----------------| | | + || | | | | + || v | | | + |'----------------' | | + '----------------' | | + .----------------' | + v v +.----------------. .----------------. \ \ +| A data | | B data | +- data | +| | |----------------| / 4 bytes | +| | | | | +| | | | | +| | | | | +| | | | + data block +| | | | | 4 KiB +| | | | | +|----------------| | | | +| | | | | +| | | | | +| | | | | +'----------------' '----------------' / +``` + +The second improvement we can make is noticing that for very small files, our +attempts to use CTZ skip-lists for compact storage backfires. Metadata pairs +have a ~4x storage cost, so if our file is smaller than 1/4 the block size, +there's actually no benefit in storing our file outside of our metadata pair. + +In this case, we can store the file directly in our directory's metadata pair. +We call this an inline file, and it allows a directory to store many small +files quite efficiently. Our previous 4 byte file now only takes up a +theoretical 16 bytes on disk. + +``` +inline files stored in metadata pair, 4 bytes costs ~16 bytes + + .----------------. +.| revision | +||----------------| +|| A name | +|| A skiplist ---. +||----------------| | \ +|| B name | | +- data +|| B data | | | 4x4 bytes +||----------------| | / 16 bytes +|| checksum | | +||----------------| | +|| | | | +|| v | | +|'----------------' | +'----------------' | + .---------' + v + .----------------. + | A data | + | | + | | + | | + | | + | | + | | + | | + |----------------| + | | + | | + | | + '----------------' +``` + +Once the file exceeds 1/4 the block size, we switch to a CTZ skip-list. This +means that our files never use more than 4x storage overhead, decreasing as +the file grows in size. + +![File storage cost graph][file-cost-graph] + +## Directories + +Now we just need directories to store our files. As mentioned above we want +a strict binding of directories and metadata pairs, but there are a few +complications we need to sort out. + +On their own, each directory is a linked-list of metadata pairs. This lets us +store an unlimited number of files in each directory, and we don't need to +worry about the runtime complexity of unbounded logs. We can store other +directory pointers in our metadata pairs, which gives us a directory tree, much +like what you find on other filesystems. + +``` + .--------. + .| root | + || | + || | + |'--------' + '---|--|-' + .-' '-------------------------. + v v + .--------. .--------. .--------. + .| dir A |------->| dir A | .| dir B | + || | || | || | + || | || | || | + |'--------' |'--------' |'--------' + '---|--|-' '----|---' '---|--|-' + .-' '-. | .-' '-. + v v v v v +.--------. .--------. .--------. .--------. .--------. +| file C | | file D | | file E | | file F | | file G | +| | | | | | | | | | +| | | | | | | | | | +'--------' '--------' '--------' '--------' '--------' +``` + +The main complication is, once again, traversal with a constant amount of +[RAM]. The directory tree is a tree, and the unfortunate fact is you can't +traverse a tree with constant RAM. + +Fortunately, the elements of our tree are metadata pairs, so unlike CTZ +skip-lists, we're not limited to strict COW operations. One thing we can do is +thread a linked-list through our tree, explicitly enabling cheap traversal +over the entire filesystem. + +``` + .--------. + .| root |-. + || | | + .-------|| |-' + | |'--------' + | '---|--|-' + | .-' '-------------------------. + | v v + | .--------. .--------. .--------. + '->| dir A |------->| dir A |------->| dir B | + || | || | || | + || | || | || | + |'--------' |'--------' |'--------' + '---|--|-' '----|---' '---|--|-' + .-' '-. | .-' '-. + v v v v v +.--------. .--------. .--------. .--------. .--------. +| file C | | file D | | file E | | file F | | file G | +| | | | | | | | | | +| | | | | | | | | | +'--------' '--------' '--------' '--------' '--------' +``` + +Unfortunately, not sticking to pure COW operations creates some problems. Now, +whenever we want to manipulate the directory tree, multiple pointers need to be +updated. If you're familiar with designing atomic data structures this should +set off a bunch of red flags. + +To work around this, our threaded linked-list has a bit of leeway. Instead of +only containing metadata pairs found in our filesystem, it is allowed to +contain metadata pairs that have no parent because of a power loss. These are +called orphaned metadata pairs. + +With the possibility of orphans, we can build power loss resilient operations +that maintain a filesystem tree threaded with a linked-list for traversal. + +Adding a directory to our tree: + +``` + .--------. + .| root |-. + || | | +.-------|| |-' +| |'--------' +| '---|--|-' +| .-' '-. +| v v +| .--------. .--------. +'->| dir A |->| dir C | + || | || | + || | || | + |'--------' |'--------' + '--------' '--------' + +allocate dir B +=> + .--------. + .| root |-. + || | | +.-------|| |-' +| |'--------' +| '---|--|-' +| .-' '-. +| v v +| .--------. .--------. +'->| dir A |--->| dir C | + || | .->| | + || | | || | + |'--------' | |'--------' + '--------' | '--------' + | + .--------. | + .| dir B |-' + || | + || | + |'--------' + '--------' + +insert dir B into threaded linked-list, creating an orphan +=> + .--------. + .| root |-. + || | | +.-------|| |-' +| |'--------' +| '---|--|-' +| .-' '-------------. +| v v +| .--------. .--------. .--------. +'->| dir A |->| dir B |->| dir C | + || | || orphan!| || | + || | || | || | + |'--------' |'--------' |'--------' + '--------' '--------' '--------' + +add dir B to parent directory +=> + .--------. + .| root |-. + || | | +.-------------|| |-' +| |'--------' +| '--|-|-|-' +| .------' | '-------. +| v v v +| .--------. .--------. .--------. +'->| dir A |->| dir B |->| dir C | + || | || | || | + || | || | || | + |'--------' |'--------' |'--------' + '--------' '--------' '--------' +``` + +Removing a directory: + +``` + .--------. + .| root |-. + || | | +.-------------|| |-' +| |'--------' +| '--|-|-|-' +| .------' | '-------. +| v v v +| .--------. .--------. .--------. +'->| dir A |->| dir B |->| dir C | + || | || | || | + || | || | || | + |'--------' |'--------' |'--------' + '--------' '--------' '--------' + +remove dir B from parent directory, creating an orphan +=> + .--------. + .| root |-. + || | | +.-------|| |-' +| |'--------' +| '---|--|-' +| .-' '-------------. +| v v +| .--------. .--------. .--------. +'->| dir A |->| dir B |->| dir C | + || | || orphan!| || | + || | || | || | + |'--------' |'--------' |'--------' + '--------' '--------' '--------' + +remove dir B from threaded linked-list, returning dir B to free blocks +=> + .--------. + .| root |-. + || | | +.-------|| |-' +| |'--------' +| '---|--|-' +| .-' '-. +| v v +| .--------. .--------. +'->| dir A |->| dir C | + || | || | + || | || | + |'--------' |'--------' + '--------' '--------' +``` + +In addition to normal directory tree operations, we can use orphans to evict +blocks in a metadata pair when the block goes bad or exceeds its allocated +erases. If we lose power while evicting a metadata block we may end up with +a situation where the filesystem references the replacement block while the +threaded linked-list still contains the evicted block. We call this a +half-orphan. + +``` + .--------. + .| root |-. + || | | +.-------------|| |-' +| |'--------' +| '--|-|-|-' +| .------' | '-------. +| v v v +| .--------. .--------. .--------. +'->| dir A |->| dir B |->| dir C | + || | || | || | + || | || | || | + |'--------' |'--------' |'--------' + '--------' '--------' '--------' + +try to write to dir B +=> + .--------. + .| root |-. + || | | +.----------------|| |-' +| |'--------' +| '-|-||-|-' +| .--------' || '-----. +| v |v v +| .--------. .--------. .--------. +'->| dir A |---->| dir B |->| dir C | + || |-. | | || | + || | | | | || | + |'--------' | '--------' |'--------' + '--------' | v '--------' + | .--------. + '->| dir B | + | bad | + | block! | + '--------' + +oh no! bad block detected, allocate replacement +=> + .--------. + .| root |-. + || | | +.----------------|| |-' +| |'--------' +| '-|-||-|-' +| .--------' || '-------. +| v |v v +| .--------. .--------. .--------. +'->| dir A |---->| dir B |--->| dir C | + || |-. | | .->| | + || | | | | | || | + |'--------' | '--------' | |'--------' + '--------' | v | '--------' + | .--------. | + '->| dir B | | + | bad | | + | block! | | + '--------' | + | + .--------. | + | dir B |--' + | | + | | + '--------' + +insert replacement in threaded linked-list, creating a half-orphan +=> + .--------. + .| root |-. + || | | +.----------------|| |-' +| |'--------' +| '-|-||-|-' +| .--------' || '-------. +| v |v v +| .--------. .--------. .--------. +'->| dir A |---->| dir B |--->| dir C | + || |-. | | .->| | + || | | | | | || | + |'--------' | '--------' | |'--------' + '--------' | v | '--------' + | .--------. | + | | dir B | | + | | bad | | + | | block! | | + | '--------' | + | | + | .--------. | + '->| dir B |--' + | half | + | orphan!| + '--------' + +fix reference in parent directory +=> + .--------. + .| root |-. + || | | +.-------------|| |-' +| |'--------' +| '--|-|-|-' +| .------' | '-------. +| v v v +| .--------. .--------. .--------. +'->| dir A |->| dir B |->| dir C | + || | || | || | + || | || | || | + |'--------' |'--------' |'--------' + '--------' '--------' '--------' +``` + +Finding orphans and half-orphans is expensive, requiring a _O(n²)_ +comparison of every metadata pair with every directory entry. But the tradeoff +is a power resilient filesystem that works with only a bounded amount of RAM. +Fortunately, we only need to check for orphans on the first allocation after +boot, and a read-only littlefs can ignore the threaded linked-list entirely. + +If we only had some sort of global state, then we could also store a flag and +avoid searching for orphans unless we knew we were specifically interrupted +while manipulating the directory tree (foreshadowing!). + +## The move problem + +We have one last challenge: the move problem. Phrasing the problem is simple: + +How do you atomically move a file between two directories? + +In littlefs we can atomically commit to directories, but we can't create +an atomic commit that spans multiple directories. The filesystem must go +through a minimum of two distinct states to complete a move. + +To make matters worse, file moves are a common form of synchronization for +filesystems. As a filesystem designed for power-loss, it's important we get +atomic moves right. + +So what can we do? + +- We definitely can't just let power-loss result in duplicated or lost files. + This could easily break users' code and would only reveal itself in extreme + cases. We were only able to be lazy about the threaded linked-list because + it isn't user facing and we can handle the corner cases internally. + +- Some filesystems propagate COW operations up the tree until a common parent + is found. Unfortunately this interacts poorly with our threaded tree and + brings back the issue of upward propagation of wear. + +- In a previous version of littlefs we tried to solve this problem by going + back and forth between the source and destination, marking and unmarking the + file as moving in order to make the move atomic from the user perspective. + This worked, but not well. Finding failed moves was expensive and required + a unique identifier for each file. + +In the end, solving the move problem required creating a new mechanism for +sharing knowledge between multiple metadata pairs. In littlefs this led to the +introduction of a mechanism called "global state". + +--- + +Global state is a small set of state that can be updated from _any_ metadata +pair. Combining global state with metadata pairs' ability to update multiple +entries in one commit gives us a powerful tool for crafting complex atomic +operations. + +How does global state work? + +Global state exists as a set of deltas that are distributed across the metadata +pairs in the filesystem. The actual global state can be built out of these +deltas by xoring together all of the deltas in the filesystem. + +``` + .--------. .--------. .--------. .--------. .--------. +.| |->| gdelta |->| |->| gdelta |->| gdelta | +|| | || 0x23 | || | || 0xff | || 0xce | +|| | || | || | || | || | +|'--------' |'--------' |'--------' |'--------' |'--------' +'--------' '----|---' '--------' '----|---' '----|---' + v v v + 0x00 --> xor ------------------> xor ------> xor --> gstate 0x12 +``` + +To update the global state from a metadata pair, we take the global state we +know and xor it with both our changes and any existing delta in the metadata +pair. Committing this new delta to the metadata pair commits the changes to +the filesystem's global state. + +``` + .--------. .--------. .--------. .--------. .--------. +.| |->| gdelta |->| |->| gdelta |->| gdelta | +|| | || 0x23 | || | || 0xff | || 0xce | +|| | || | || | || | || | +|'--------' |'--------' |'--------' |'--------' |'--------' +'--------' '----|---' '--------' '--|---|-' '----|---' + v v | v + 0x00 --> xor ----------------> xor -|------> xor --> gstate = 0x12 + | | + | | +change gstate to 0xab --> xor <------------|--------------------------' +=> | v + '------------> xor + | + v + .--------. .--------. .--------. .--------. .--------. +.| |->| gdelta |->| |->| gdelta |->| gdelta | +|| | || 0x23 | || | || 0x46 | || 0xce | +|| | || | || | || | || | +|'--------' |'--------' |'--------' |'--------' |'--------' +'--------' '----|---' '--------' '----|---' '----|---' + v v v + 0x00 --> xor ------------------> xor ------> xor --> gstate = 0xab +``` + +To make this efficient, we always keep a copy of the global state in RAM. We +only need to iterate over our metadata pairs and build the global state when +the filesystem is mounted. + +You may have noticed that global state is very expensive. We keep a copy in +RAM and a delta in an unbounded number of metadata pairs. Even if we reset +the global state to its initial value, we can't easily clean up the deltas on +disk. For this reason, it's very important that we keep the size of global +state bounded and extremely small. But, even with a strict budget, global +state is incredibly valuable. + +--- + +Now we can solve the move problem. We can create global state describing our +move atomically with the creation of the new file, and we can clear this move +state atomically with the removal of the old file. + +``` + .--------. gstate = no move + .| root |-. + || | | +.-------------|| |-' +| |'--------' +| '--|-|-|-' +| .------' | '-------. +| v v v +| .--------. .--------. .--------. +'->| dir A |->| dir B |->| dir C | + || | || | || | + || | || | || | + |'--------' |'--------' |'--------' + '----|---' '--------' '--------' + v + .--------. + | file D | + | | + | | + '--------' + +begin move, add reference in dir C, change gstate to have move +=> + .--------. gstate = moving file D in dir A (m1) + .| root |-. + || | | +.-------------|| |-' +| |'--------' +| '--|-|-|-' +| .------' | '-------. +| v v v +| .--------. .--------. .--------. +'->| dir A |->| dir B |->| dir C | + || | || | || gdelta | + || | || | || =m1 | + |'--------' |'--------' |'--------' + '----|---' '--------' '----|---' + | .----------------' + v v + .--------. + | file D | + | | + | | + '--------' + +complete move, remove reference in dir A, change gstate to no move +=> + .--------. gstate = no move (m1^~m1) + .| root |-. + || | | +.-------------|| |-' +| |'--------' +| '--|-|-|-' +| .------' | '-------. +| v v v +| .--------. .--------. .--------. +'->| dir A |->| dir B |->| dir C | + || gdelta | || | || gdelta | + || =~m1 | || | || =m1 | + |'--------' |'--------' |'--------' + '--------' '--------' '----|---' + v + .--------. + | file D | + | | + | | + '--------' +``` + + +If, after building our global state during mount, we find information +describing an ongoing move, we know we lost power during a move and the file +is duplicated in both the source and destination directories. If this happens, +we can resolve the move using the information in the global state to remove +one of the files. + +``` + .--------. gstate = moving file D in dir A (m1) + .| root |-. ^ + || |------------> xor +.---------------|| |-' ^ +| |'--------' | +| '--|-|-|-' | +| .--------' | '---------. | +| | | | | +| | .----------> xor --------> xor +| v | v ^ v ^ +| .--------. | .--------. | .--------. | +'->| dir A |-|->| dir B |-|->| dir C | | + || |-' || |-' || gdelta |-' + || | || | || =m1 | + |'--------' |'--------' |'--------' + '----|---' '--------' '----|---' + | .---------------------' + v v + .--------. + | file D | + | | + | | + '--------' +``` + +We can also move directories the same way we move files. There is the threaded +linked-list to consider, but leaving the threaded linked-list unchanged works +fine as the order doesn't really matter. + +``` + .--------. gstate = no move (m1^~m1) + .| root |-. + || | | +.-------------|| |-' +| |'--------' +| '--|-|-|-' +| .------' | '-------. +| v v v +| .--------. .--------. .--------. +'->| dir A |->| dir B |->| dir C | + || gdelta | || | || gdelta | + || =~m1 | || | || =m1 | + |'--------' |'--------' |'--------' + '--------' '--------' '----|---' + v + .--------. + | file D | + | | + | | + '--------' + +begin move, add reference in dir C, change gstate to have move +=> + .--------. gstate = moving dir B in root (m1^~m1^m2) + .| root |-. + || | | +.--------------|| |-' +| |'--------' +| '--|-|-|-' +| .-------' | '----------. +| v | v +| .--------. | .--------. +'->| dir A |-. | .->| dir C | + || gdelta | | | | || gdelta | + || =~m1 | | | | || =m1^m2 | + |'--------' | | | |'--------' + '--------' | | | '---|--|-' + | | .-------' | + | v v | v + | .--------. | .--------. + '->| dir B |-' | file D | + || | | | + || | | | + |'--------' '--------' + '--------' + +complete move, remove reference in root, change gstate to no move +=> + .--------. gstate = no move (m1^~m1^m2^~m2) + .| root |-. + || gdelta | | +.-----------|| =~m2 |-' +| |'--------' +| '---|--|-' +| .-----' '-----. +| v v +| .--------. .--------. +'->| dir A |-. .->| dir C | + || gdelta | | | || gdelta | + || =~m1 | | '-|| =m1^m2 |-------. + |'--------' | |'--------' | + '--------' | '---|--|-' | + | .-' '-. | + | v v | + | .--------. .--------. | + '->| dir B |--| file D |-' + || | | | + || | | | + |'--------' '--------' + '--------' +``` + +Global state gives us a powerful tool we can use to solve the move problem. +And the result is surprisingly performant, only needing the minimum number +of states and using the same number of commits as a naive move. Additionally, +global state gives us a bit of persistent state we can use for some other +small improvements. + +## Conclusion + +And that's littlefs, thanks for reading! + + +[wikipedia-flash]: https://en.wikipedia.org/wiki/Flash_memory +[wikipedia-sna]: https://en.wikipedia.org/wiki/Serial_number_arithmetic +[wikipedia-crc]: https://en.wikipedia.org/wiki/Cyclic_redundancy_check +[wikipedia-cow]: https://en.wikipedia.org/wiki/Copy-on-write +[wikipedia-B-tree]: https://en.wikipedia.org/wiki/B-tree +[wikipedia-B+-tree]: https://en.wikipedia.org/wiki/B%2B_tree +[wikipedia-skip-list]: https://en.wikipedia.org/wiki/Skip_list +[wikipedia-ctz]: https://en.wikipedia.org/wiki/Count_trailing_zeros +[wikipedia-ecc]: https://en.wikipedia.org/wiki/Error_correction_code +[wikipedia-hamming-bound]: https://en.wikipedia.org/wiki/Hamming_bound +[wikipedia-dynamic-wear-leveling]: https://en.wikipedia.org/wiki/Wear_leveling#Dynamic_wear_leveling +[wikipedia-static-wear-leveling]: https://en.wikipedia.org/wiki/Wear_leveling#Static_wear_leveling +[wikipedia-ftl]: https://en.wikipedia.org/wiki/Flash_translation_layer + +[oeis]: https://oeis.org +[A001511]: https://oeis.org/A001511 +[A005187]: https://oeis.org/A005187 + +[fat]: https://en.wikipedia.org/wiki/Design_of_the_FAT_file_system +[ext2]: http://e2fsprogs.sourceforge.net/ext2intro.html +[jffs]: https://www.sourceware.org/jffs2/jffs2-html +[yaffs]: https://yaffs.net/documents/how-yaffs-works +[spiffs]: https://github.com/pellepl/spiffs/blob/master/docs/TECH_SPEC +[ext4]: https://ext4.wiki.kernel.org/index.php/Ext4_Design +[ntfs]: https://en.wikipedia.org/wiki/NTFS +[btrfs]: https://btrfs.wiki.kernel.org/index.php/Btrfs_design +[zfs]: https://en.wikipedia.org/wiki/ZFS + +[cow]: https://upload.wikimedia.org/wikipedia/commons/0/0c/Cow_female_black_white.jpg +[elephant]: https://upload.wikimedia.org/wikipedia/commons/3/37/African_Bush_Elephant.jpg +[ram]: https://upload.wikimedia.org/wikipedia/commons/9/97/New_Mexico_Bighorn_Sheep.JPG + +[metadata-formula1]: https://latex.codecogs.com/svg.latex?cost%20%3D%20n%20+%20n%20%5Cfrac%7Bs%7D%7Bd+1%7D +[metadata-formula2]: https://latex.codecogs.com/svg.latex?s%20%3D%20r%20%5Cfrac%7Bsize%7D%7Bn%7D +[metadata-formula3]: https://latex.codecogs.com/svg.latex?d%20%3D%20%281-r%29%20%5Cfrac%7Bsize%7D%7Bn%7D +[metadata-formula4]: https://latex.codecogs.com/svg.latex?cost%20%3D%20n%20+%20n%20%5Cfrac%7Br%5Cfrac%7Bsize%7D%7Bn%7D%7D%7B%281-r%29%5Cfrac%7Bsize%7D%7Bn%7D+1%7D + +[ctz-formula1]: https://latex.codecogs.com/svg.latex?%5Clim_%7Bn%5Cto%5Cinfty%7D%5Cfrac%7B1%7D%7Bn%7D%5Csum_%7Bi%3D0%7D%5E%7Bn%7D%5Cleft%28%5Ctext%7Bctz%7D%28i%29+1%5Cright%29%20%3D%20%5Csum_%7Bi%3D0%7D%5Cfrac%7B1%7D%7B2%5Ei%7D%20%3D%202 +[ctz-formula2]: https://latex.codecogs.com/svg.latex?B%20%3D%20%5Cfrac%7Bw%7D%7B8%7D%5Cleft%5Clceil%5Clog_2%5Cleft%28%5Cfrac%7B2%5Ew%7D%7BB-2%5Cfrac%7Bw%7D%7B8%7D%7D%5Cright%29%5Cright%5Crceil +[ctz-formula3]: https://latex.codecogs.com/svg.latex?N%20%3D%20%5Csum_i%5En%5Cleft%5BB-%5Cfrac%7Bw%7D%7B8%7D%5Cleft%28%5Ctext%7Bctz%7D%28i%29+1%5Cright%29%5Cright%5D +[ctz-formula4]: https://latex.codecogs.com/svg.latex?%5Csum_i%5En%5Cleft%28%5Ctext%7Bctz%7D%28i%29+1%5Cright%29%20%3D%202n-%5Ctext%7Bpopcount%7D%28n%29 +[ctz-formula5]: https://latex.codecogs.com/svg.latex?N%20%3D%20Bn%20-%20%5Cfrac%7Bw%7D%7B8%7D%5Cleft%282n-%5Ctext%7Bpopcount%7D%28n%29%5Cright%29 +[ctz-formula6]: https://latex.codecogs.com/svg.latex?n%20%3D%20%5Cleft%5Clfloor%5Cfrac%7BN-%5Cfrac%7Bw%7D%7B8%7D%5Cleft%28%5Ctext%7Bpopcount%7D%5Cleft%28%5Cfrac%7BN%7D%7BB-2%5Cfrac%7Bw%7D%7B8%7D%7D-1%5Cright%29+2%5Cright%29%7D%7BB-2%5Cfrac%7Bw%7D%7B8%7D%7D%5Cright%5Crfloor +[ctz-formula7]: https://latex.codecogs.com/svg.latex?%5Cmathit%7Boff%7D%20%3D%20N%20-%20%5Cleft%28B-2%5Cfrac%7Bw%7D%7B8%7D%5Cright%29n%20-%20%5Cfrac%7Bw%7D%7B8%7D%5Ctext%7Bpopcount%7D%28n%29 + +[bigB]: https://latex.codecogs.com/svg.latex?B +[d]: https://latex.codecogs.com/svg.latex?d +[m]: https://latex.codecogs.com/svg.latex?m +[bigN]: https://latex.codecogs.com/svg.latex?N +[n]: https://latex.codecogs.com/svg.latex?n +[n']: https://latex.codecogs.com/svg.latex?n%27 +[r]: https://latex.codecogs.com/svg.latex?r +[s]: https://latex.codecogs.com/svg.latex?s +[w]: https://latex.codecogs.com/svg.latex?w +[x]: https://latex.codecogs.com/svg.latex?x + +[metadata-cost-graph]: https://raw.githubusercontent.com/geky/littlefs/gh-images/metadata-cost.svg?sanitize=true +[wear-distribution-graph]: https://raw.githubusercontent.com/geky/littlefs/gh-images/wear-distribution.svg?sanitize=true +[file-cost-graph]: https://raw.githubusercontent.com/geky/littlefs/gh-images/file-cost.svg?sanitize=true diff --git a/TSM_PicoW_Sensor/McuLib/littleFS/LICENSE.md b/TSM_PicoW_Sensor/McuLib/littleFS/LICENSE.md new file mode 100644 index 0000000..e6c3a7b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/littleFS/LICENSE.md @@ -0,0 +1,25 @@ +Copyright (c) 2022, The littlefs authors. +Copyright (c) 2017, Arm Limited. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. +- Neither the name of ARM nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/TSM_PicoW_Sensor/McuLib/littleFS/McuLittleFS.c b/TSM_PicoW_Sensor/McuLib/littleFS/McuLittleFS.c new file mode 100644 index 0000000..9a0c93e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/littleFS/McuLittleFS.c @@ -0,0 +1,953 @@ +/* + * Copyright (c) 2022, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuLittleFS.h" +#include "McuLittleFSconfig.h" +#include "McuLittleFSBlockDevice.h" +#include "McuShell.h" +#include "McuTimeDate.h" +#include "littleFS/lfs.h" +#if McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE==McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE_WINBOND_W25Q128 + #include "McuW25Q128.h" +#elif McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE==McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE_MCU_FLASH + #include "McuFlash.h" +#endif + +/* variables used by the file system */ +static bool McuLFS_isMounted = FALSE; +static lfs_t McuLFS_lfs; + +#if LITTLEFS_CONFIG_THREAD_SAFE + static SemaphoreHandle_t fileSystemAccessMutex; +#endif + +bool McuLFS_IsMounted(void) { + return McuLFS_isMounted; +} + +#if LITTLEFS_CONFIG_THREAD_SAFE +static int McuLittleFS_lock(const struct lfs_config *c) { + if (xSemaphoreTakeRecursive(fileSystemAccessMutex, portMAX_DELAY)== pdTRUE) { + return 0; /* ok */ + } + return -1; /* failed */ +} + +static int McuLittleFS_unlock(const struct lfs_config *c) { + if (xSemaphoreGiveRecursive(fileSystemAccessMutex) == pdTRUE) { + return 0; /* ok */ + } + return -1; /* failed */ +} +#endif /* LITTLEFS_CONFIG_THREAD_SAFE */ + +/* configuration of the file system is provided by this struct */ +static const struct lfs_config McuLFS_cfg = { + .context = NULL, + /* block device operations */ + .read = McuLittleFS_block_device_read, + .prog = McuLittleFS_block_device_prog, + .erase = McuLittleFS_block_device_erase, + .sync = McuLittleFS_block_device_sync, + /* block device configuration */ + .read_size = McuLittleFS_CONFIG_FILESYSTEM_READ_BUFFER_SIZE, + .prog_size = McuLittleFS_CONFIG_FILESYSTEM_PROG_BUFFER_SIZE, + .block_size = McuLittleFS_CONFIG_BLOCK_SIZE, + .block_count = McuLittleFS_CONFIG_BLOCK_COUNT, + .cache_size = McuLittleFS_CONFIG_FILESYSTEM_CACHE_SIZE, + .lookahead_size = McuLittleFS_CONFIG_FILESYSTEM_LOOKAHEAD_SIZE, + .block_cycles = 500, +#if LITTLEFS_CONFIG_THREAD_SAFE + .lock = McuLittleFS_lock, + .unlock = McuLittleFS_unlock, +#endif +}; + +const struct lfs_config *McuLFS_get_config(void) { + return &McuLFS_cfg; +} + +lfs_t *McuLFS_get_lfs(void) { + return &McuLFS_lfs; +} + +/*----------------------------------------------------------------------- + * Get a string from the file + * (ported from FatFS function: f_gets()) + *-----------------------------------------------------------------------*/ + +char* McuLFS_gets ( + char* buff, /* Pointer to the string buffer to read */ + int len, /* Size of string buffer (characters) */ + lfs_file_t* fp /* Pointer to the file object */ +) +{ + int n = 0; + char c, *p = buff; + unsigned char s[2]; + uint32_t rc; + + while (n < len - 1) { /* Read characters until buffer gets filled */ + rc = lfs_file_read(&McuLFS_lfs,fp,s,1); + if (rc != 1) break; + c = s[0]; + + if (c == '\r') continue; /* Strip '\r' */ + *p++ = c; + n++; + if (c == '\n') break; /* Break on EOL */ + } + *p = 0; + return n ? buff : 0; /* When no data read (eof or error), return with error. */ +} + +/*-----------------------------------------------------------------------* + * Put a character to the file + * (ported from FatFS) + *-----------------------------------------------------------------------*/ + +typedef struct putbuff { + lfs_file_t* fp ; + int idx, nchr; + unsigned char buf[64]; +} putbuff; + + +static void putc_bfd (putbuff* pb, char c) { + uint32_t bw; + int32_t i; + + if (c == '\n') { /* LF -> CRLF conversion */ + putc_bfd(pb, '\r'); + } + + i = pb->idx; /* Buffer write index (-1:error) */ + if (i < 0) { + return; + } + pb->buf[i++] = (unsigned char)c; + + if (i >= (int)(sizeof pb->buf) - 3) { /* Write buffered characters to the file */ + bw = lfs_file_write(&McuLFS_lfs,pb->fp, pb->buf,(uint32_t)i); + i = (bw == (uint32_t)i) ? 0 : -1; + } + pb->idx = i; + pb->nchr++; +} + +/*-----------------------------------------------------------------------*/ +/* Put a string to the file + * (ported from FatFS function: f_puts()) */ +/*-----------------------------------------------------------------------*/ + +int McuLFS_puts ( + const char* str, /* Pointer to the string to be output */ + lfs_file_t* fp /* Pointer to the file object */ +) +{ + putbuff pb; + uint32_t nw; + + pb.fp = fp; /* Initialize output buffer */ + pb.nchr = pb.idx = 0; + + while (*str) { /* Put the string */ + putc_bfd(&pb, *str++); + } + nw = lfs_file_write(&McuLFS_lfs,pb.fp, pb.buf, (uint32_t)pb.idx); + + if ( pb.idx >= 0 /* Flush buffered characters to the file */ + && nw>=0 + && (uint32_t)pb.idx == nw) + { + return pb.nchr; + } + return -1; +} + +uint8_t McuLFS_Format(McuShell_ConstStdIOType *io) { + int res; + + if (McuLFS_isMounted) { + if (io != NULL) { + McuShell_SendStr((const uint8_t *)"File system is mounted, unmount it first.\r\n",io->stdErr); + } + return ERR_FAILED; + } + if (io != NULL) { + McuShell_SendStr((const uint8_t *)"Formatting ...", io->stdOut); + } + res = lfs_format(&McuLFS_lfs, &McuLFS_cfg); + if (res == LFS_ERR_OK) { + if (io != NULL) { + McuShell_SendStr((const uint8_t *)" done.\r\n", io->stdOut); + } + return ERR_OK; + } else { + if (io != NULL) { + McuShell_SendStr((const uint8_t *)" FAILED!\r\n", io->stdErr); + } + return ERR_FAILED; + } +} + +uint8_t McuLFS_Mount(McuShell_ConstStdIOType *io) { + int res; + + if (McuLFS_isMounted) { + if (io != NULL) { + McuShell_SendStr((const uint8_t *)"File system is already mounted.\r\n", io->stdErr); + } + return ERR_FAILED; + } + if (io != NULL) { + McuShell_SendStr((const uint8_t *)"Mounting ...", io->stdOut); + } + res = lfs_mount(&McuLFS_lfs, &McuLFS_cfg); + if (res == LFS_ERR_OK) { + if (io != NULL) { + McuShell_SendStr((const uint8_t *)" done.\r\n", io->stdOut); + } + McuLFS_isMounted = TRUE; + return ERR_OK; + } else { + if (io != NULL) { + McuShell_SendStr((const uint8_t *)" FAILED! Did you format the device?\r\n", io->stdErr); + } + return ERR_FAILED; + } +} + +uint8_t McuLFS_Unmount(McuShell_ConstStdIOType *io) { + int res; + + if (!McuLFS_isMounted) { + if (io != NULL) { + McuShell_SendStr((const uint8_t *)"File system is already unmounted.\r\n", io->stdErr); + } + return ERR_FAILED; + } + if (io != NULL) { + McuShell_SendStr((const uint8_t *)"Unmounting ...", io->stdOut); + } + res = lfs_unmount(&McuLFS_lfs); + if (res == LFS_ERR_OK) { + if (io != NULL) { + McuShell_SendStr((const uint8_t *)" done.\r\n", io->stdOut); + } + McuLFS_isMounted = FALSE; + return ERR_OK; + } else { + if (io != NULL) { + McuShell_SendStr((const uint8_t *)" FAILED!\r\n", io->stdErr); + } + return ERR_FAILED; + } +} + +uint8_t McuLFS_Dir(const char *path, McuShell_ConstStdIOType *io) { + int res; + lfs_dir_t dir; + struct lfs_info info; + + if (io == NULL) { + return ERR_FAILED; /* listing a directory without an I/O channel does not make any sense */ + } + + if (!McuLFS_isMounted) { + McuShell_SendStr((const uint8_t *)"File system is not mounted, mount it first.\r\n", io->stdErr); + return ERR_FAILED; + } + if (path == NULL) { + path = "/"; /* default path */ + } + res = lfs_dir_open(&McuLFS_lfs, &dir, path); + if (res != LFS_ERR_OK) { + McuShell_SendStr((const uint8_t *)"FAILED lfs_dir_open()!\r\n", io->stdErr); + return ERR_FAILED; + } + for(;;) { + res = lfs_dir_read(&McuLFS_lfs, &dir, &info); + if (res < 0) { + McuShell_SendStr((const uint8_t *)"FAILED lfs_dir_read()!\r\n", io->stdErr); + return ERR_FAILED; + } + if (res == 0) { /* no more files */ + break; + } + switch (info.type) { + case LFS_TYPE_REG: + McuShell_SendStr((const uint8_t *)"reg ", io->stdOut); + break; + case LFS_TYPE_DIR: + McuShell_SendStr((const uint8_t *)"dir ", io->stdOut); + break; + default: + McuShell_SendStr((const uint8_t *)"? ", io->stdOut); + break; + } + static const char *prefixes[] = { "", "K", "M", "G" }; /* prefixes for kilo, mega and giga */ + unsigned char buf[12]; + + for (int i = sizeof(prefixes) / sizeof(prefixes[0]) - 1; i >= 0; i--) { + if (info.size >= (1 << 10 * i) - 1) { + McuUtility_Num32sToStrFormatted(buf, sizeof(buf), (unsigned int)(info.size >> 10 * i), ' ', 4 - (i != 0)); + McuUtility_strcat(buf, sizeof(buf), (const unsigned char*)prefixes[i]); + McuUtility_chcat(buf, sizeof(buf), ' '); + McuShell_SendStr(buf, io->stdOut); + break; + } + } /* for */ + McuShell_SendStr((const uint8_t *)info.name, io->stdOut); + McuShell_SendStr((const uint8_t *)"\r\n", io->stdOut); + } /* for */ + res = lfs_dir_close(&McuLFS_lfs, &dir); + if (res != LFS_ERR_OK) { + McuShell_SendStr((const uint8_t *)"FAILED lfs_dir_close()!\r\n", io->stdErr); + return ERR_FAILED; + } + return ERR_OK; +} + +/* + * Prints a list of Files and Directories of a given path + * If path == NULL, the Files and Direcotries of the root-directory are printed + * The First two characters of every line determin if its a File (F:) or a Directory (D:) + */ +uint8_t McuLFS_FileList(const char *path, McuShell_ConstStdIOType *io) { + int res; + lfs_dir_t dir; + struct lfs_info info; + + if (io == NULL) { + return ERR_FAILED; /* listing a directory without an I/O channel does not make any sense */ + } + if (!McuLFS_isMounted) { + McuShell_SendStr((const uint8_t *)"File system is not mounted, mount it first.\r\n", io->stdErr); + return ERR_FAILED; + } + if (path == NULL) { + path = "/"; /* default path */ + } + res = lfs_dir_open(&McuLFS_lfs, &dir, path); + if (res != LFS_ERR_OK) { + McuShell_SendStr((const uint8_t *)"FAILED lfs_dir_open()!\r\n", io->stdErr); + return ERR_FAILED; + } + for(;;) { + res = lfs_dir_read(&McuLFS_lfs, &dir, &info); + if (res < 0) { + McuShell_SendStr((const uint8_t *)"FAILED lfs_dir_read()!\r\n", io->stdErr); + return ERR_FAILED; + } + if (res == 0) { /* no more files */ + break; + } + + if(!(McuUtility_strcmp(info.name,".") == 0 || McuUtility_strcmp(info.name,"..") == 0 )) { + switch (info.type) { + case LFS_TYPE_REG: + McuShell_SendStr((const uint8_t *)"F:", io->stdOut); + break; + case LFS_TYPE_DIR: + McuShell_SendStr((const uint8_t *)"D:", io->stdOut); + break; + default: + McuShell_SendStr((const uint8_t *)"?:", io->stdOut); + break; + } + McuShell_SendStr((const uint8_t *)info.name, io->stdOut); + McuShell_SendStr((const uint8_t *)"\r\n", io->stdOut); + } + + } /* for */ + res = lfs_dir_close(&McuLFS_lfs, &dir); + if (res != LFS_ERR_OK) { + McuShell_SendStr((const uint8_t *)"FAILED lfs_dir_close()!\r\n", io->stdErr); + return ERR_FAILED; + } + return ERR_OK; +} + +uint8_t McuLFS_CopyFile(const char *srcPath, const char *dstPath,McuShell_ConstStdIOType *io) { + lfs_file_t fsrc, fdst; + int result, nofBytesRead; + uint8_t buffer[32]; /* copy buffer */ + uint8_t res = ERR_OK; + + if (!McuLFS_isMounted) { + if (io != NULL) { + McuShell_SendStr((const uint8_t *)"ERROR: File system is not mounted.\r\n", io->stdErr); + } + return ERR_FAILED; + } + + /* open source file */ + result = lfs_file_open(&McuLFS_lfs, &fsrc, srcPath, LFS_O_RDONLY); + if (result < 0) { + McuShell_SendStr((const unsigned char*) "*** Failed opening source file!\r\n",io->stdErr); + return ERR_FAILED; + } + /* create destination file */ + result = lfs_file_open(&McuLFS_lfs, &fdst, dstPath, LFS_O_WRONLY | LFS_O_CREAT); + if (result < 0) { + (void) lfs_file_close(&McuLFS_lfs, &fsrc); + McuShell_SendStr((const unsigned char*) "*** Failed opening destination file!\r\n", io->stdErr); + return ERR_FAILED; + } + /* now copy source to destination */ + for (;;) { + nofBytesRead = lfs_file_read(&McuLFS_lfs, &fsrc, buffer, sizeof(buffer)); + if (nofBytesRead < 0) { + McuShell_SendStr((const unsigned char*) "*** Failed reading source file!\r\n",io->stdErr); + res = ERR_FAILED; + break; + } + if (nofBytesRead == 0) { /* end of file */ + break; + } + result = lfs_file_write(&McuLFS_lfs, &fdst, buffer, nofBytesRead); + if (result < 0) { + McuShell_SendStr((const unsigned char*) "*** Failed writing destination file!\r\n", io->stdErr); + res = ERR_FAILED; + break; + } + } /* for */ + /* close all files */ + result = lfs_file_close(&McuLFS_lfs, &fsrc); + if (result < 0) { + McuShell_SendStr((const unsigned char*) "*** Failed closing source file!\r\n", io->stdErr); + res = ERR_FAILED; + } + result = lfs_file_close(&McuLFS_lfs, &fdst); + if (result < 0) { + McuShell_SendStr((const unsigned char*) "*** Failed closing destination file!\r\n", io->stdErr); + res = ERR_FAILED; + } + return res; +} + +uint8_t McuLFS_MoveFile(const char *srcPath, const char *dstPath,McuShell_ConstStdIOType *io) { + if (!McuLFS_isMounted) { + if (io != NULL) { + McuShell_SendStr((const uint8_t *)"ERROR: File system is not mounted.\r\n", io->stdErr); + } + return ERR_FAILED; + } + if (lfs_rename(&McuLFS_lfs, srcPath, dstPath) < 0) { + if (io != NULL) { + McuShell_SendStr((const uint8_t *)"ERROR: failed renaming file or directory.\r\n",io->stdErr); + } + return ERR_FAILED; + } + return ERR_OK; +} + +/* + * Used to read out data from Files for SDEP communication + */ +uint8_t McuLFS_ReadFile(lfs_file_t* file, bool readFromBeginning, size_t nofBytes, McuShell_ConstStdIOType *io) { + static int32_t filePos; + size_t fileSize; + uint8_t buf[1024]; + + if( nofBytes > 1024) { + nofBytes = 1024; + } + if(readFromBeginning) { + lfs_file_rewind(&McuLFS_lfs,file); + filePos = 0; + } else { + lfs_file_seek(&McuLFS_lfs,file, filePos,LFS_SEEK_SET); + } + + fileSize = lfs_file_size(&McuLFS_lfs, file); + filePos = lfs_file_tell(&McuLFS_lfs, file); + fileSize = fileSize - filePos; + + if (fileSize < 0) { + return ERR_FAILED; + } + + if(fileSize > nofBytes) { + if (lfs_file_read(&McuLFS_lfs, file, buf, nofBytes) < 0) { + return ERR_FAILED; + } + McuShell_SendData(buf,nofBytes,io->stdErr); + filePos = filePos + nofBytes; + return ERR_OK; + } else { + if (lfs_file_read(&McuLFS_lfs, file, buf, fileSize) < 0) { + return ERR_FAILED; + } + McuShell_SendData(buf,fileSize,io->stdErr); + filePos = filePos + fileSize; + return ERR_PARAM_SIZE; //EOF + } +} + + +uint8_t McuLFS_openFile(lfs_file_t* file, uint8_t* filename) { + if (lfs_file_open(&McuLFS_lfs, file, (const char*)filename, LFS_O_RDWR | LFS_O_CREAT| LFS_O_APPEND) < 0) { + return ERR_FAILED; + } + return ERR_OK; +} + +uint8_t McuLFS_closeFile(lfs_file_t* file) { + if(lfs_file_close(&McuLFS_lfs, file) == 0) { + return ERR_OK; + } else { + return ERR_FAILED; + } +} + +uint8_t McuLFS_writeLine(lfs_file_t* file, uint8_t* line) { + uint8_t lineBuf[200]; + McuUtility_strcpy(lineBuf, sizeof(lineBuf), line); + McuUtility_strcat(lineBuf, sizeof(lineBuf), (unsigned char*)"\r\n"); + + if (lfs_file_write(&McuLFS_lfs, file, lineBuf, McuUtility_strlen((char*)lineBuf)) < 0) { + lfs_file_close(&McuLFS_lfs, file); + return ERR_FAILED; + } + return ERR_OK; +} + +uint8_t McuLFS_readLine(lfs_file_t* file, uint8_t* lineBuf, size_t bufSize, uint8_t* nofReadChars) { + lineBuf[0] = '\0'; + uint8_t ch; + *nofReadChars = 0; + + while(lfs_file_read(&McuLFS_lfs, file, &ch, 1) != 0 && ch != '\n') { + (*nofReadChars)++; + McuUtility_chcat(lineBuf,200,ch); + } + McuUtility_chcat(lineBuf,200,ch); + return ERR_OK; +} + +/* Function for the Shell PrintHex command */ +static uint8_t readFromFile(void *hndl, uint32_t addr, uint8_t *buf, size_t bufSize) { + lfs_file_t *fp; + + fp = (lfs_file_t*)hndl; + if (lfs_file_read(&McuLFS_lfs, fp, buf, bufSize) < 0) { + return ERR_FAILED; + } + return ERR_OK; +} + +uint8_t McuLFS_PrintFile(const char *filePath, McuShell_ConstStdIOType *io, bool inHex) { + lfs_file_t file; + uint8_t res = ERR_OK; + int32_t fileSize; + int result; + + if (io == NULL) { + return ERR_FAILED; /* printing a file without an I/O channel does not make any sense */ + } + if (!McuLFS_isMounted) { + if (io != NULL) { + McuShell_SendStr((const uint8_t *)"ERROR: File system is not mounted.\r\n", io->stdErr); + } + return ERR_FAILED; + } + result = lfs_file_open(&McuLFS_lfs, &file, filePath, LFS_O_RDONLY); + if (result < 0) { + if (io != NULL) { + McuShell_SendStr((const uint8_t *)"ERROR: Failed opening file.\r\n", io->stdErr); + } + return ERR_FAILED; + } + fileSize = lfs_file_size(&McuLFS_lfs, &file); + if (fileSize < 0) { + if (io != NULL) { + McuShell_SendStr((const uint8_t *)"ERROR: getting file size\r\n", io->stdErr); + (void) lfs_file_close(&McuLFS_lfs, &file); + } + return ERR_FAILED; + } + if (inHex) { + res = McuShell_PrintMemory(&file, 0, fileSize-1, 4, 16, readFromFile, io); + if (res != ERR_OK) + { + McuShell_SendStr((const uint8_t *)"ERROR while calling PrintMemory()\r\n", io->stdErr); + } + } else { + uint8_t ch; + + while(fileSize>0) { + if (lfs_file_read(&McuLFS_lfs, &file, &ch, sizeof(ch)) < 0) { + break; /* error case */ + } + McuShell_SendCh(ch, io->stdOut); /* print character */ + fileSize--; + } + } + (void) lfs_file_close(&McuLFS_lfs, &file); + return res; +} + +static uint8_t McuLFS_CatBinaryTextDataToFile(const char *filePath, McuShell_ConstStdIOType *io, const unsigned char *p) { + lfs_file_t file; + int result; + + if (io == NULL) { + return ERR_FAILED; /* printing a file without an I/O channel does not make any sense */ + } + if (!McuLFS_isMounted) { + if (io != NULL) { + McuShell_SendStr((const uint8_t *)"ERROR: File system is not mounted.\r\n", io->stdErr); + } + return ERR_FAILED; + } + result = lfs_file_open(&McuLFS_lfs, &file, filePath, LFS_O_RDWR | LFS_O_CREAT| LFS_O_APPEND); + if (result < 0) { + if (io != NULL) { + McuShell_SendStr((const uint8_t *)"ERROR: Failed opening file.\r\n", io->stdErr); + } + return ERR_FAILED; + } + result = lfs_file_seek(&McuLFS_lfs, &file, 0, LFS_SEEK_END); + if (result < 0) { + if (io != NULL) { + McuShell_SendStr((const uint8_t *)"ERROR: Failed opening file.\r\n", io->stdErr); + } + (void)lfs_file_close(&McuLFS_lfs, &file); + return ERR_FAILED; + } + for(;;) { /* breaks */ + int32_t v; + uint8_t ch, res; + + res = McuUtility_xatoi(&p, &v); + if (res!=ERR_OK) { + break; + } + ch = v; /* just one byte */ + if (lfs_file_write(&McuLFS_lfs, &file, &ch, sizeof(ch)) < 0) { + if (io != NULL) { + McuShell_SendStr((const uint8_t *)"ERROR: Failed writing to file.\r\n", io->stdErr); + } + break; + } + } + (void)lfs_file_close(&McuLFS_lfs, &file); + return ERR_OK; +} + +uint8_t McuLFS_RemoveFile(const char *filePath, McuShell_ConstStdIOType *io) { + int result; + + if (!McuLFS_isMounted) { + if (io != NULL) { + McuShell_SendStr((const uint8_t *)"ERROR: File system is not mounted.\r\n", io->stdErr); + } + return ERR_FAILED; + } + result = lfs_remove(&McuLFS_lfs, filePath); + if (result < 0) { + if (io != NULL) { + McuShell_SendStr((const uint8_t *)"ERROR: Failed removing file.\r\n", io->stdErr); + } + return ERR_FAILED; + } + return ERR_OK; +} + +lfs_t* McuLFS_GetFileSystem(void) { + return &McuLFS_lfs; +} + +uint8_t McuLFS_RunBenchmark(const McuShell_ConstStdIOType *io) { + lfs_file_t file; + uint32_t i; + uint8_t read_buf[10]; + TIMEREC time, startTime; + int32_t start_mseconds, mseconds; + + if (!McuLFS_isMounted) { + if (io!=NULL) { + McuShell_SendStr((const unsigned char*)"ERROR: File system is not mounted.\r\n", io->stdErr); + } + return ERR_FAILED; + } + /* write benchmark */ + McuShell_SendStr((const unsigned char*)"Benchmark: write/copy/read a 100kB file:\r\n", io->stdOut); + McuShell_SendStr((const unsigned char*)"Delete existing benchmark files...\r\n", io->stdOut); + (void)McuLFS_RemoveFile((const char*)"./bench.txt", io); + (void)McuLFS_RemoveFile((const char*)"./copy.txt", io); + + McuShell_SendStr((const unsigned char*)"Create benchmark file...\r\n", io->stdOut); + (void)McuTimeDate_GetTime(&startTime); + if (lfs_file_open(&McuLFS_lfs, &file, "./bench.txt", LFS_O_WRONLY | LFS_O_CREAT)<0) { + McuShell_SendStr((const unsigned char*)"*** Failed creating benchmark file!\r\n", io->stdErr); + return ERR_FAILED; + } + for(i=0;i<10240;i++) { + if (lfs_file_write(&McuLFS_lfs, &file, "benchmark ", sizeof("benchmark ")-1)<0) { + McuShell_SendStr((const unsigned char*)"*** Failed writing file!\r\n", io->stdErr); + (void)lfs_file_close(&McuLFS_lfs, &file); + return ERR_FAILED; + } + } + (void)lfs_file_close(&McuLFS_lfs, &file); + (void)McuTimeDate_GetTime(&time); + start_mseconds = startTime.Hour*60*60*1000 + startTime.Min*60*1000 + startTime.Sec*1000 +#if TmDt1_HAS_SEC100_IN_TIMEREC + + startTime.Sec100*10 +#endif + ; + mseconds = time.Hour*60*60*1000 + time.Min*60*1000 + time.Sec*1000 +#if TmDt1_HAS_SEC100_IN_TIMEREC + + time.Sec100*10 +#endif + - start_mseconds; + McuShell_SendNum32s(mseconds, io->stdOut); + McuShell_SendStr((const unsigned char*)" ms for writing (", io->stdOut); + McuShell_SendNum32s((100*1000)/mseconds, io->stdOut); + McuShell_SendStr((const unsigned char*)" kB/s)\r\n", io->stdOut); + + /* read benchmark */ + McuShell_SendStr((const unsigned char*)"Read 100kB benchmark file...\r\n", io->stdOut); + (void)McuTimeDate_GetTime(&startTime); + if (lfs_file_open(&McuLFS_lfs, &file, "./bench.txt", LFS_O_RDONLY)<0) { + McuShell_SendStr((const unsigned char*)"*** Failed opening benchmark file!\r\n", io->stdErr); + return ERR_FAILED; + } + for(i=0;i<10240;i++) { + if (lfs_file_read(&McuLFS_lfs, &file, &read_buf[0], sizeof(read_buf))<0) { + McuShell_SendStr((const unsigned char*)"*** Failed reading file!\r\n", io->stdErr); + (void)lfs_file_close(&McuLFS_lfs, &file); + return ERR_FAILED; + } + } + (void)lfs_file_close(&McuLFS_lfs, &file); + (void)McuTimeDate_GetTime(&time); + start_mseconds = startTime.Hour*60*60*1000 + startTime.Min*60*1000 + startTime.Sec*1000 +#if TmDt1_HAS_SEC100_IN_TIMEREC + + startTime.Sec100*10 +#endif + ; + mseconds = time.Hour*60*60*1000 + time.Min*60*1000 + time.Sec*1000 +#if TmDt1_HAS_SEC100_IN_TIMEREC + + time.Sec100*10 +#endif + - start_mseconds; + McuShell_SendNum32s(mseconds, io->stdOut); + McuShell_SendStr((const unsigned char*)" ms for reading (", io->stdOut); + McuShell_SendNum32s((100*1000)/mseconds, io->stdOut); + McuShell_SendStr((const unsigned char*)" kB/s)\r\n", io->stdOut); + + /* copy benchmark */ + McuShell_SendStr((const unsigned char*)"Copy 100kB file...\r\n", io->stdOut); + (void)McuTimeDate_GetTime(&startTime); + (void)McuLFS_CopyFile((const char*)"./bench.txt", (const char*)"./copy.txt", io); + (void)McuTimeDate_GetTime(&time); + start_mseconds = startTime.Hour*60*60*1000 + startTime.Min*60*1000 + startTime.Sec*1000 +#if TmDt1_HAS_SEC100_IN_TIMEREC + + startTime.Sec100*10 +#endif + ; + mseconds = time.Hour*60*60*1000 + time.Min*60*1000 + time.Sec*1000 +#if TmDt1_HAS_SEC100_IN_TIMEREC + + time.Sec100*10 +#endif + - start_mseconds; + McuShell_SendNum32s(mseconds, io->stdOut); + McuShell_SendStr((const unsigned char*)" ms for copy (", io->stdOut); + McuShell_SendNum32s((100*1000)/mseconds, io->stdOut); + McuShell_SendStr((const unsigned char*)" kB/s)\r\n", io->stdOut); + McuShell_SendStr((const unsigned char*)"done!\r\n", io->stdOut); + return ERR_OK; +} + +static uint8_t McuLFS_PrintStatus(McuShell_ConstStdIOType *io) { + uint8_t buf[32]; + + McuShell_SendStatusStr((const unsigned char*) "McuLittleFS", (const unsigned char*) "McuLittleFS status\r\n", io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (const uint8_t *)"0x"); + McuUtility_strcatNum32Hex(buf, sizeof(buf), LFS_VERSION); + McuUtility_strcat(buf, sizeof(buf), (const uint8_t *)", disk "); + McuUtility_strcatNum32Hex(buf, sizeof(buf), LFS_DISK_VERSION); + McuUtility_strcat(buf, sizeof(buf), (const uint8_t *)"\r\n"); + McuShell_SendStatusStr((const unsigned char*)" version", buf, io->stdOut); + +#if McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE==McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE_GENERIC + McuShell_SendStatusStr((const unsigned char*)" memory", (const unsigned char*)"Generic\r\n", io->stdOut); +#elif McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE==McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE_WINBOND_W25Q128 + McuShell_SendStatusStr((const unsigned char*)" memory", (const unsigned char*)"Winbond W25Q128\r\n", io->stdOut); +#elif McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE==McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE_MCU_FLASH + McuShell_SendStatusStr((const unsigned char*)" memory", (const unsigned char*)"MCU Flash\r\n", io->stdOut); +#else + #error "unknown type" +#endif + + McuShell_SendStatusStr((const unsigned char*) " mounted", McuLFS_isMounted ? (const uint8_t *)"yes\r\n" : (const uint8_t *)"no\r\n", io->stdOut); + + McuUtility_Num32uToStr(buf, sizeof(buf), McuLFS_cfg.block_size); + McuUtility_strcat(buf, sizeof(buf), (const uint8_t *)"\r\n"); + McuShell_SendStatusStr((const unsigned char*)" block_size", buf, io->stdOut); + + McuUtility_Num32uToStr(buf, sizeof(buf), McuLFS_cfg.block_count); + McuUtility_strcat(buf, sizeof(buf), (const uint8_t *)"\r\n"); + McuShell_SendStatusStr((const unsigned char*)" block_count", buf, io->stdOut); + + McuUtility_Num32uToStr(buf, sizeof(buf), McuLittleFS_CONFIG_BLOCK_OFFSET); + McuUtility_strcat(buf, sizeof(buf), (const uint8_t *)"\r\n"); + McuShell_SendStatusStr((const unsigned char*)" blockoffset", buf, io->stdOut); + + McuUtility_Num32uToStr(buf, sizeof(buf), McuLFS_cfg.block_count * McuLFS_cfg.block_size); + McuUtility_strcat(buf, sizeof(buf), (const uint8_t *)" bytes\r\n"); + McuShell_SendStatusStr((const unsigned char*)" space", buf, io->stdOut); + + McuUtility_Num32uToStr(buf, sizeof(buf), McuLFS_cfg.read_size); + McuUtility_strcat(buf, sizeof(buf), (const uint8_t *)"\r\n"); + McuShell_SendStatusStr((const unsigned char*)" read_size", buf, io->stdOut); + + McuUtility_Num32uToStr(buf, sizeof(buf), McuLFS_cfg.prog_size); + McuUtility_strcat(buf, sizeof(buf), (const uint8_t *)"\r\n"); + McuShell_SendStatusStr((const unsigned char*)" prog_size", buf, io->stdOut); + + McuUtility_Num32uToStr(buf, sizeof(buf), McuLFS_cfg.lookahead_size); + McuUtility_strcat(buf, sizeof(buf), (const uint8_t *)"\r\n"); + McuShell_SendStatusStr((const unsigned char*)" lookahead", buf, io->stdOut); + return ERR_OK; +} + +uint8_t McuLFS_ParseCommand(const unsigned char* cmd, bool *handled,const McuShell_StdIOType *io) { + unsigned char fileNameSrc[McuLittleFS_CONFIG_FILE_NAME_SIZE], fileNameDst[McuLittleFS_CONFIG_FILE_NAME_SIZE]; + size_t lenRead; + const unsigned char *p; + + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP) == 0|| McuUtility_strcmp((char*)cmd, "McuLittleFS help") == 0) { + McuShell_SendHelpStr((unsigned char*) "McuLittleFS", (const unsigned char*) "Group of FileSystem (LittleFS) commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*) " help|status", (const unsigned char*) "Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*) " format",(const unsigned char*) "Format the file system\r\n",io->stdOut); + McuShell_SendHelpStr((unsigned char*) " mount",(const unsigned char*) "Mount the file system\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*) " unmount",(const unsigned char*) "Unmount the file system\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*) " ls",(const unsigned char*) "List directory and files of root\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*) " ls ",(const unsigned char*) "List directory and files of dir (ex. /Samples)\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*) " rm ",(const unsigned char*) "Remove a file\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*) " mv ",(const unsigned char*) "Rename a file\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*) " cp ",(const unsigned char*) "Copy a file\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*) " mkdir ",(const unsigned char*) "Create a directory\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*) " bincat ",(const unsigned char*) "Add hex numbers as binary data to a file. If file does not exist, it gets created\r\n",io->stdOut); + McuShell_SendHelpStr((unsigned char*) " printhex ",(const unsigned char*) "Print the file data in hexadecimal format\r\n",io->stdOut); + McuShell_SendHelpStr((unsigned char*) " printtxt ",(const unsigned char*) "Print the file data in text format\r\n",io->stdOut); + McuShell_SendHelpStr((unsigned char*) " benchmark",(const unsigned char*) "Run a benchmark to measure performance\r\n",io->stdOut); + *handled = TRUE; + return ERR_OK; + } else if (McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS) == 0|| McuUtility_strcmp((char*)cmd, "McuLittleFS status") == 0) { + *handled = TRUE; + return McuLFS_PrintStatus(io); + } else if (McuUtility_strcmp((char*)cmd, "McuLittleFS format") == 0) { + *handled = TRUE; + return McuLFS_Format(io); + } else if (McuUtility_strcmp((char*)cmd, "McuLittleFS mount") == 0) { + *handled = TRUE; + return McuLFS_Mount(io); + } else if (McuUtility_strcmp((char*)cmd, "McuLittleFS unmount") == 0) { + *handled = TRUE; + return McuLFS_Unmount(io); + } else if (McuUtility_strcmp((char*)cmd, "McuLittleFS ls") == 0) { + *handled = TRUE; + return McuLFS_Dir(NULL, io); + } else if (McuUtility_strncmp((char* )cmd, "McuLittleFS ls ", sizeof("McuLittleFS ls ") - 1) == 0) { + *handled = TRUE; + if ((McuUtility_ReadEscapedName(cmd + sizeof("McuLittleFS ls ") - 1,fileNameSrc, sizeof(fileNameSrc), &lenRead, NULL, NULL) == ERR_OK)) { + return McuLFS_Dir((const char*)fileNameSrc, io); + } + return ERR_FAILED; + } else if (McuUtility_strcmp((char*)cmd, "McuLittleFS benchmark") == 0) { + *handled = TRUE; + return McuLFS_RunBenchmark(io); + } else if (McuUtility_strncmp((char* )cmd, "McuLittleFS printhex ", sizeof("McuLittleFS printhex ") - 1) == 0) { + *handled = TRUE; + if ((McuUtility_ReadEscapedName(cmd + sizeof("McuLittleFS printhex ") - 1,fileNameSrc, sizeof(fileNameSrc), &lenRead, NULL, NULL) == ERR_OK)) { + return McuLFS_PrintFile((const char*)fileNameSrc, io, TRUE); + } + return ERR_FAILED; + } else if (McuUtility_strncmp((char* )cmd, "McuLittleFS printtxt ", sizeof("McuLittleFS printtxt ") - 1) == 0) { + *handled = TRUE; + if ((McuUtility_ReadEscapedName(cmd + sizeof("McuLittleFS printtxt ") - 1,fileNameSrc, sizeof(fileNameSrc), &lenRead, NULL, NULL) == ERR_OK)) { + return McuLFS_PrintFile((const char*)fileNameSrc, io, FALSE); + } + return ERR_FAILED; + } else if (McuUtility_strncmp((char*)cmd, "McuLittleFS rm ", sizeof("McuLittleFS rm ")-1) == 0) { + *handled = TRUE; + if ((McuUtility_ReadEscapedName(cmd + sizeof("McuLittleFS rm ") - 1, fileNameSrc, sizeof(fileNameSrc), &lenRead, NULL, NULL) == ERR_OK)) { + return McuLFS_RemoveFile((const char*)fileNameSrc, io); + } + return ERR_FAILED; + } else if (McuUtility_strncmp((char*)cmd, "McuLittleFS mv ", sizeof("McuLittleFS mv ")-1) == 0) { + *handled = TRUE; + if ((McuUtility_ReadEscapedName(cmd + sizeof("McuLittleFS mv ") - 1, fileNameSrc, sizeof(fileNameSrc), &lenRead, NULL, NULL) == ERR_OK) + && *(cmd + sizeof("McuLittleFS mv ") - 1 + lenRead) == ' ' + && (McuUtility_ReadEscapedName(cmd + sizeof("McuLittleFS mv ") - 1 + lenRead + 1, fileNameDst,sizeof(fileNameDst), NULL, NULL, NULL) == ERR_OK)) + { + return McuLFS_MoveFile((const char*)fileNameSrc, (const char*)fileNameDst, io); + } + return ERR_FAILED; + } else if (McuUtility_strncmp((char*)cmd, "McuLittleFS cp ", sizeof("McuLittleFS cp ")-1) == 0) { + *handled = TRUE; + if ((McuUtility_ReadEscapedName(cmd + sizeof("McuLittleFS cp ") - 1, fileNameSrc, sizeof(fileNameSrc), &lenRead, NULL, NULL) == ERR_OK) + && *(cmd + sizeof("McuLittleFS cp ") - 1 + lenRead) == ' ' + && (McuUtility_ReadEscapedName(cmd + sizeof("McuLittleFS cp ") - 1 + lenRead + 1, fileNameDst,sizeof(fileNameDst), NULL, NULL, NULL) == ERR_OK)) + { + return McuLFS_CopyFile((const char*)fileNameSrc, (const char*)fileNameDst, io); + } + return ERR_FAILED; + } else if (McuUtility_strncmp((char*)cmd, "McuLittleFS bincat ", sizeof("McuLittleFS bincat ")-1) == 0) { + *handled = TRUE; + p = cmd + sizeof("McuLittleFS bincat ") - 1; + if ((McuUtility_ReadEscapedName(p, fileNameSrc, sizeof(fileNameSrc), &lenRead, NULL, NULL) == ERR_OK)) { + p += lenRead; + return McuLFS_CatBinaryTextDataToFile((const char*)fileNameSrc, io, p); + } + return ERR_FAILED; + } else if (McuUtility_strncmp((char*)cmd, "McuLittleFS mkdir ", sizeof("McuLittleFS mkdir ")-1) == 0) { + *handled = TRUE; + p = cmd + sizeof("McuLittleFS mkdir ") - 1; + if ((McuUtility_ReadEscapedName(p, fileNameSrc, sizeof(fileNameSrc), &lenRead, NULL, NULL) == ERR_OK)) { + if (lfs_mkdir(&McuLFS_lfs, (const char*)fileNameSrc)!=0) { + return ERR_FAILED; + } + return ERR_OK; + } + return ERR_FAILED; + } + return ERR_OK; +} + +#if LITTLEFS_CONFIG_THREAD_SAFE +void McuLFS_GetFileAccessSemaphore(SemaphoreHandle_t *mutex) { + *mutex = fileSystemAccessMutex; +} +#endif + +void McuLFS_Deinit(void) { +#if LITTLEFS_CONFIG_THREAD_SAFE + vSemaphoreDelete(fileSystemAccessMutex); + fileSystemAccessMutex = NULL; +#endif +} + +void McuLFS_Init(void) { +#if LITTLEFS_CONFIG_THREAD_SAFE + fileSystemAccessMutex = xSemaphoreCreateRecursiveMutex(); + if (fileSystemAccessMutex == NULL) { + for(;;) {} /* Error */ + } + vQueueAddToRegistry(fileSystemAccessMutex, "littleFSmutex"); + xSemaphoreGiveRecursive(fileSystemAccessMutex); + if (McuLittleFS_block_device_init() != ERR_OK) { + for(;;) {} /* Error */ + } +#endif +} diff --git a/TSM_PicoW_Sensor/McuLib/littleFS/McuLittleFS.h b/TSM_PicoW_Sensor/McuLib/littleFS/McuLittleFS.h new file mode 100644 index 0000000..c82e68e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/littleFS/McuLittleFS.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2022, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MCULITTLEFS_H_ +#define MCULITTLEFS_H_ + +#include "littleFS/McuLittleFSBlockDeviceconfig.h" +#include "McuShell.h" +#include "littleFS/lfs.h" +#include "McuRTOS.h" + +bool McuLFS_IsMounted(void); + +lfs_t* McuLFS_GetFileSystem(void); +uint8_t McuLFS_ParseCommand(const unsigned char* cmd, bool *handled, const McuShell_StdIOType *io); +#if LITTLEFS_CONFIG_THREAD_SAFE + void McuLFS_GetFileAccessMutex(SemaphoreHandle_t* mutex); +#endif + +uint8_t McuLFS_ReadFile(lfs_file_t* file, bool readFromBeginning, size_t nofBytes, McuShell_ConstStdIOType *io); +uint8_t McuLFS_FileList(const char *path, McuShell_ConstStdIOType *io); +uint8_t McuLFS_RemoveFile(const char *filePath, McuShell_ConstStdIOType *io); +uint8_t McuLFS_MoveFile(const char *srcPath, const char *dstPath,McuShell_ConstStdIOType *io); + +uint8_t McuLFS_Mount(McuShell_ConstStdIOType *io); +uint8_t McuLFS_Unmount(McuShell_ConstStdIOType *io); +uint8_t McuLFS_Format(McuShell_ConstStdIOType *io); + +uint8_t McuLFS_openFile(lfs_file_t* file,uint8_t* filename); +uint8_t McuLFS_closeFile(lfs_file_t* file); +uint8_t McuLFS_writeLine(lfs_file_t* file,uint8_t* line); +uint8_t McuLFS_readLine(lfs_file_t* file,uint8_t* lineBuf,size_t bufSize,uint8_t* nofReadChars); + +/* Functions ported from FatFS (Used by MiniIni) */ +char* McuLFS_gets (char* buff,int len, lfs_file_t* fp); +int McuLFS_putc (char c, lfs_file_t* fp); +int McuLFS_puts (const char* str, lfs_file_t* fp); + +const struct lfs_config *McuLFS_get_config(void); +lfs_t *McuLFS_get_lfs(void); + +void McuLFS_Deinit(void); +void McuLFS_Init(void); + +#endif /* MCULITTLEFS_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/littleFS/McuLittleFSBlockDevice.c b/TSM_PicoW_Sensor/McuLib/littleFS/McuLittleFSBlockDevice.c new file mode 100644 index 0000000..4d95537 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/littleFS/McuLittleFSBlockDevice.c @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2022, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuLib.h" /* for error codes */ +#include "McuLittleFSBlockDevice.h" +#include "McuLittleFSconfig.h" +#include "littleFS/lfs.h" + +/* pre-configured memory devices */ +#if McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE==McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE_WINBOND_W25Q128 + #include "McuW25Q128.h" +#elif McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE==McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE_MCU_FLASH + #include "McuFlash.h" +#endif + +int McuLittleFS_block_device_read(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, void *buffer, lfs_size_t size) { + uint8_t res; + +#if McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE==McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE_GENERIC + res = ERR_FAILED; /* NYI */ +#elif McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE==McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE_WINBOND_W25Q128 + res = McuW25_Read((block+McuLittleFS_CONFIG_BLOCK_OFFSET) * c->block_size + off, buffer, size); +#elif McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE==McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE_MCU_FLASH + res = McuFlash_Read((void*)((block+McuLittleFS_CONFIG_BLOCK_OFFSET) * c->block_size + off), buffer, size); +#endif + if (res != ERR_OK) { + return LFS_ERR_IO; + } + return LFS_ERR_OK; +} + +int McuLittleFS_block_device_prog(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, const void *buffer, lfs_size_t size) { + uint8_t res; + +#if McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE==McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE_GENERIC + res = ERR_FAILED; /* NYI */ +#elif McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE==McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE_WINBOND_W25Q128 + res = McuW25_ProgramPage((block+McuLittleFS_CONFIG_BLOCK_OFFSET) * c->block_size + off, buffer, size); +#elif McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE==McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE_MCU_FLASH + res = McuFlash_Program((void*)((block+McuLittleFS_CONFIG_BLOCK_OFFSET) * c->block_size + off), buffer, size); +#endif + if (res != ERR_OK) { + return LFS_ERR_IO; + } + return LFS_ERR_OK; +} + +int McuLittleFS_block_device_erase(const struct lfs_config *c, lfs_block_t block) { + uint8_t res; + +#if McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE==McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE_GENERIC + res = ERR_FAILED; /* NYI */ +#elif McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE==McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE_WINBOND_W25Q128 + res = McuW25_EraseSector4K((block+McuLittleFS_CONFIG_BLOCK_OFFSET) * c->block_size); +#elif McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE==McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE_MCU_FLASH + res = McuFlash_Erase((void*)((block+McuLittleFS_CONFIG_BLOCK_OFFSET) * c->block_size), c->block_size); +#endif + if (res != ERR_OK) { + return LFS_ERR_IO; + } + return LFS_ERR_OK; +} + +int McuLittleFS_block_device_sync(const struct lfs_config *c) { + return LFS_ERR_OK; +} + +int McuLittleFS_block_device_deinit(void) { + return LFS_ERR_OK; +} + +int McuLittleFS_block_device_init(void) { + return LFS_ERR_OK; +} diff --git a/TSM_PicoW_Sensor/McuLib/littleFS/McuLittleFSBlockDevice.h b/TSM_PicoW_Sensor/McuLib/littleFS/McuLittleFSBlockDevice.h new file mode 100644 index 0000000..afec7fe --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/littleFS/McuLittleFSBlockDevice.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2022, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + + +#ifndef MCULITTLEFSBLOCKDEVICE_H_ +#define MCULITTLEFSBLOCKDEVICE_H_ + +#include +#include "littleFS/lfs.h" +#include "littleFS/McuLittleFSBlockDeviceconfig.h" + +int McuLittleFS_block_device_read(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, void *buffer, lfs_size_t size); + +int McuLittleFS_block_device_prog(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, const void *buffer, lfs_size_t size); + +int McuLittleFS_block_device_erase(const struct lfs_config *c, lfs_block_t block); + +int McuLittleFS_block_device_sync(const struct lfs_config *c); + +int McuLittleFS_block_device_deinit(void); + +int McuLittleFS_block_device_init(void); + +#endif /* MCULITTLEFSBLOCKDEVICE_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/littleFS/McuLittleFSBlockDeviceconfig.h b/TSM_PicoW_Sensor/McuLib/littleFS/McuLittleFSBlockDeviceconfig.h new file mode 100644 index 0000000..c680b2b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/littleFS/McuLittleFSBlockDeviceconfig.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2022, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + + +#ifndef LITTLEFS_MCULITTLEFSBLOCKDEVICECONFIG_H_ +#define LITTLEFS_MCULITTLEFSBLOCKDEVICECONFIG_H_ + +/* supported block device types */ +#define McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE_GENERIC 0 /* dummy, generic implementation */ +#define McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE_WINBOND_W25Q128 1 /* using WinBond W25Q128 external SPI FLASH */ +#define McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE_MCU_FLASH 2 /* using McuFlash blocks */ + +#ifndef McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE + #define McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE McuLittleFSBlockDevice_CONFIG_MEMORY_TYPE_GENERIC + /* | + | | | | + '--------'--------' + .----' '--------------. + A v B v + .--------.--------. .--------.--------. + | C'| D'| | | E'|new| | + | | |-> | | | E'|-> | + | | | | | | | | + '--------'--------' '--------'--------' + .-' '--. | '------------------. + v v .-' v +.--------. .--------. v .--------. +| C | | D | .--------. write | new E | +| | | | | E | ==> | | +| | | | | | | | +'--------' '--------' | | '--------' + '--------' .-' | + .-' '-. .-------------|------' + v v v v + .--------. .--------. .--------. + | F | | G | | new F | + | | | | | | + | | | | | | + '--------' '--------' '--------' +``` + +More details on how littlefs works can be found in [DESIGN.md](DESIGN.md) and +[SPEC.md](SPEC.md). + +- [DESIGN.md](DESIGN.md) - A fully detailed dive into how littlefs works. + I would suggest reading it as the tradeoffs at work are quite interesting. + +- [SPEC.md](SPEC.md) - The on-disk specification of littlefs with all the + nitty-gritty details. May be useful for tooling development. + +## Testing + +The littlefs comes with a test suite designed to run on a PC using the +[emulated block device](bd/lfs_testbd.h) found in the `bd` directory. +The tests assume a Linux environment and can be started with make: + +``` bash +make test +``` + +## License + +The littlefs is provided under the [BSD-3-Clause] license. See +[LICENSE.md](LICENSE.md) for more information. Contributions to this project +are accepted under the same license. + +Individual files contain the following tag instead of the full license text. + + SPDX-License-Identifier: BSD-3-Clause + +This enables machine processing of license information based on the SPDX +License Identifiers that are here available: http://spdx.org/licenses/ + +## Related projects + +- [littlefs-fuse] - A [FUSE] wrapper for littlefs. The project allows you to + mount littlefs directly on a Linux machine. Can be useful for debugging + littlefs if you have an SD card handy. + +- [littlefs-js] - A javascript wrapper for littlefs. I'm not sure why you would + want this, but it is handy for demos. You can see it in action + [here][littlefs-js-demo]. + +- [littlefs-python] - A Python wrapper for littlefs. The project allows you + to create images of the filesystem on your PC. Check if littlefs will fit + your needs, create images for a later download to the target memory or + inspect the content of a binary image of the target memory. + +- [littlefs2-rust] - A Rust wrapper for littlefs. This project allows you + to use littlefs in a Rust-friendly API, reaping the benefits of Rust's memory + safety and other guarantees. + +- [nim-littlefs] - A Nim wrapper and API for littlefs. Includes a fuse + implementation based on [littlefs-fuse] + +- [chamelon] - A pure-OCaml implementation of (most of) littlefs, designed for + use with the MirageOS library operating system project. It is interoperable + with the reference implementation, with some caveats. + +- [littlefs-disk-img-viewer] - A memory-efficient web application for viewing + littlefs disk images in your web browser. + +- [mklfs] - A command line tool for creating littlefs images. Used in the Lua + RTOS ecosystem. + +- [mklittlefs] - A command line tool for creating littlefs images. Used in the + ESP8266 and RP2040 ecosystem. + +- [pico-littlefs-usb] - An interface for littlefs that emulates a FAT12 + filesystem over USB. Allows mounting littlefs on a host PC without additional + drivers. + +- [Mbed OS] - The easiest way to get started with littlefs is to jump into Mbed + which already has block device drivers for most forms of embedded storage. + littlefs is available in Mbed OS as the [LittleFileSystem] class. + +- [SPIFFS] - Another excellent embedded filesystem for NOR flash. As a more + traditional logging filesystem with full static wear-leveling, SPIFFS will + likely outperform littlefs on small memories such as the internal flash on + microcontrollers. + +- [Dhara] - An interesting NAND flash translation layer designed for small + MCUs. It offers static wear-leveling and power-resilience with only a fixed + _O(|address|)_ pointer structure stored on each block and in RAM. + +- [ChaN's FatFs] - A lightweight reimplementation of the infamous FAT filesystem + for microcontroller-scale devices. Due to limitations of FAT it can't provide + power-loss resilience, but it does allow easy interop with PCs. + +[BSD-3-Clause]: https://spdx.org/licenses/BSD-3-Clause.html +[littlefs-fuse]: https://github.com/geky/littlefs-fuse +[FUSE]: https://github.com/libfuse/libfuse +[littlefs-js]: https://github.com/geky/littlefs-js +[littlefs-js-demo]:http://littlefs.geky.net/demo.html +[littlefs-python]: https://pypi.org/project/littlefs-python/ +[littlefs2-rust]: https://crates.io/crates/littlefs2 +[nim-littlefs]: https://github.com/Graveflo/nim-littlefs +[chamelon]: https://github.com/yomimono/chamelon +[littlefs-disk-img-viewer]: https://github.com/tniessen/littlefs-disk-img-viewer +[mklfs]: https://github.com/whitecatboard/Lua-RTOS-ESP32/tree/master/components/mklfs/src +[mklittlefs]: https://github.com/earlephilhower/mklittlefs +[pico-littlefs-usb]: https://github.com/oyama/pico-littlefs-usb +[Mbed OS]: https://github.com/armmbed/mbed-os +[LittleFileSystem]: https://os.mbed.com/docs/mbed-os/latest/apis/littlefilesystem.html +[SPIFFS]: https://github.com/pellepl/spiffs +[Dhara]: https://github.com/dlbeer/dhara +[ChaN's FatFs]: http://elm-chan.org/fsw/ff/00index_e.html diff --git a/TSM_PicoW_Sensor/McuLib/littleFS/SPEC.md b/TSM_PicoW_Sensor/McuLib/littleFS/SPEC.md new file mode 100644 index 0000000..6682c74 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/littleFS/SPEC.md @@ -0,0 +1,867 @@ +## littlefs technical specification + +This is the technical specification of the little filesystem with on-disk +version lfs2.1. This document covers the technical details of how the littlefs +is stored on disk for introspection and tooling. This document assumes you are +familiar with the design of the littlefs, for more info on how littlefs works +check out [DESIGN.md](DESIGN.md). + +``` + | | | .---._____ + .-----. | | +--|o |---| littlefs | +--| |---| | + '-----' '----------' + | | | +``` + +## Some quick notes + +- littlefs is a block-based filesystem. The disk is divided into an array of + evenly sized blocks that are used as the logical unit of storage. + +- Block pointers are stored in 32 bits, with the special value `0xffffffff` + representing a null block address. + +- In addition to the logical block size (which usually matches the erase + block size), littlefs also uses a program block size and read block size. + These determine the alignment of block device operations, but don't need + to be consistent for portability. + +- By default, all values in littlefs are stored in little-endian byte order. + +## Directories / Metadata pairs + +Metadata pairs form the backbone of littlefs and provide a system for +distributed atomic updates. Even the superblock is stored in a metadata pair. + +As their name suggests, a metadata pair is stored in two blocks, with one block +providing a backup during erase cycles in case power is lost. These two blocks +are not necessarily sequential and may be anywhere on disk, so a "pointer" to a +metadata pair is stored as two block pointers. + +On top of this, each metadata block behaves as an appendable log, containing a +variable number of commits. Commits can be appended to the metadata log in +order to update the metadata without requiring an erase cycles. Note that +successive commits may supersede the metadata in previous commits. Only the +most recent metadata should be considered valid. + +The high-level layout of a metadata block is fairly simple: + +``` + .---------------------------------------. +.-| revision count | entries | \ +| |-------------------+ | | +| | | | +| | | +-- 1st commit +| | | | +| | +-------------------| | +| | | CRC | / +| |-------------------+-------------------| +| | entries | \ +| | | | +| | | +-- 2nd commit +| | +-------------------+--------------| | +| | | CRC | padding | / +| |----+-------------------+--------------| +| | entries | \ +| | | | +| | | +-- 3rd commit +| | +-------------------+---------| | +| | | CRC | | / +| |---------+-------------------+ | +| | unwritten storage | more commits +| | | | +| | | v +| | | +| | | +| '---------------------------------------' +'---------------------------------------' +``` + +Each metadata block contains a 32-bit revision count followed by a number of +commits. Each commit contains a variable number of metadata entries followed +by a 32-bit CRC. + +Note also that entries aren't necessarily word-aligned. This allows us to +store metadata more compactly, however we can only write to addresses that are +aligned to our program block size. This means each commit may have padding for +alignment. + +Metadata block fields: + +1. **Revision count (32-bits)** - Incremented every erase cycle. If both blocks + contain valid commits, only the block with the most recent revision count + should be used. Sequence comparison must be used to avoid issues with + integer overflow. + +2. **CRC (32-bits)** - Detects corruption from power-loss or other write + issues. Uses a CRC-32 with a polynomial of `0x04c11db7` initialized + with `0xffffffff`. + +Entries themselves are stored as a 32-bit tag followed by a variable length +blob of data. But exactly how these tags are stored is a little bit tricky. + +Metadata blocks support both forward and backward iteration. In order to do +this without duplicating the space for each tag, neighboring entries have their +tags XORed together, starting with `0xffffffff`. + +``` + Forward iteration Backward iteration + +.-------------------. 0xffffffff .-------------------. +| revision count | | | revision count | +|-------------------| v |-------------------| +| tag ~A |---> xor -> tag A | tag ~A |---> xor -> 0xffffffff +|-------------------| | |-------------------| ^ +| data A | | | data A | | +| | | | | | +| | | | | | +|-------------------| v |-------------------| | +| tag AxB |---> xor -> tag B | tag AxB |---> xor -> tag A +|-------------------| | |-------------------| ^ +| data B | | | data B | | +| | | | | | +| | | | | | +|-------------------| v |-------------------| | +| tag BxC |---> xor -> tag C | tag BxC |---> xor -> tag B +|-------------------| |-------------------| ^ +| data C | | data C | | +| | | | tag C +| | | | +| | | | +'-------------------' '-------------------' +``` + +Here's a more complete example of metadata block containing 4 entries: + +``` + .---------------------------------------. +.-| revision count | tag ~A | \ +| |-------------------+-------------------| | +| | data A | | +| | | | +| |-------------------+-------------------| | +| | tag AxB | data B | <--. | +| |-------------------+ | | | +| | | | +-- 1st commit +| | +-------------------+---------| | | +| | | tag BxC | | <-.| | +| |---------+-------------------+ | || | +| | data C | || | +| | | || | +| |-------------------+-------------------| || | +| | tag CxCRC | CRC | || / +| |-------------------+-------------------| || +| | tag CRCxA' | data A' | || \ +| |-------------------+ | || | +| | | || | +| | +-------------------+----| || +-- 2nd commit +| | | tag CRCxA' | | || | +| |--------------+-------------------+----| || | +| | CRC | padding | || / +| |--------------+----+-------------------| || +| | tag CRCxA'' | data A'' | <---. \ +| |-------------------+ | ||| | +| | | ||| | +| | +-------------------+---------| ||| | +| | | tag A''xD | | < ||| | +| |---------+-------------------+ | |||| +-- 3rd commit +| | data D | |||| | +| | +---------| |||| | +| | | tag Dx| |||| | +| |---------+-------------------+---------| |||| | +| |CRC | CRC | | |||| / +| |---------+-------------------+ | |||| +| | unwritten storage | |||| more commits +| | | |||| | +| | | |||| v +| | | |||| +| | | |||| +| '---------------------------------------' |||| +'---------------------------------------' |||'- most recent A + ||'-- most recent B + |'--- most recent C + '---- most recent D +``` + +Two things to note before we get into the details around tag encoding: + +1. Each tag contains a valid bit used to indicate if the tag and containing + commit is valid. After XORing, this bit should always be zero. + + At the end of each commit, the valid bit of the previous tag is XORed + with the lowest bit in the type field of the CRC tag. This allows + the CRC tag to force the next commit to fail the valid bit test if it + has not yet been written to. + +2. The valid bit alone is not enough info to know if the next commit has been + erased. We don't know the order bits will be programmed in a program block, + so it's possible that the next commit had an attempted program that left the + valid bit unchanged. + + To ensure we only ever program erased bytes, each commit can contain an + optional forward-CRC (FCRC). An FCRC contains a checksum of some amount of + bytes in the next commit at the time it was erased. + + ``` + .-------------------. \ \ + | revision count | | | + |-------------------| | | + | metadata | | | + | | +---. +-- current commit + | | | | | + |-------------------| | | | + | FCRC ---|-. | | + |-------------------| / | | | + | CRC -----|-' / + |-------------------| | + | padding | | padding (does't need CRC) + | | | + |-------------------| \ | \ + | erased? | +-' | + | | | | +-- next commit + | v | / | + | | / + | | + '-------------------' + ``` + + If the FCRC is missing or the checksum does not match, we must assume a + commit was attempted but failed due to power-loss. + + Note that end-of-block commits do not need an FCRC. + +## Metadata tags + +So in littlefs, 32-bit tags describe every type of metadata. And this means +_every_ type of metadata, including file entries, directory fields, and +global state. Even the CRCs used to mark the end of commits get their own tag. + +Because of this, the tag format contains some densely packed information. Note +that there are multiple levels of types which break down into more info: + +``` +[---- 32 ----] +[1|-- 11 --|-- 10 --|-- 10 --] + ^. ^ . ^ ^- length + |. | . '------------ id + |. '-----.------------------ type (type3) + '.-----------.------------------ valid bit + [-3-|-- 8 --] + ^ ^- chunk + '------- type (type1) +``` + + +Before we go further, there's one important thing to note. These tags are +**not** stored in little-endian. Tags stored in commits are actually stored +in big-endian (and is the only thing in littlefs stored in big-endian). This +little bit of craziness comes from the fact that the valid bit must be the +first bit in a commit, and when converted to little-endian, the valid bit finds +itself in byte 4. We could restructure the tag to store the valid bit lower, +but, because none of the fields are byte-aligned, this would be more +complicated than just storing the tag in big-endian. + +Another thing to note is that both the tags `0x00000000` and `0xffffffff` are +invalid and can be used for null values. + +Metadata tag fields: + +1. **Valid bit (1-bit)** - Indicates if the tag is valid. + +2. **Type3 (11-bits)** - Type of the tag. This field is broken down further + into a 3-bit abstract type and an 8-bit chunk field. Note that the value + `0x000` is invalid and not assigned a type. + + 1. **Type1 (3-bits)** - Abstract type of the tag. Groups the tags into + 8 categories that facilitate bitmasked lookups. + + 2. **Chunk (8-bits)** - Chunk field used for various purposes by the different + abstract types. type1+chunk+id form a unique identifier for each tag in the + metadata block. + +3. **Id (10-bits)** - File id associated with the tag. Each file in a metadata + block gets a unique id which is used to associate tags with that file. The + special value `0x3ff` is used for any tags that are not associated with a + file, such as directory and global metadata. + +4. **Length (10-bits)** - Length of the data in bytes. The special value + `0x3ff` indicates that this tag has been deleted. + +## Metadata types + +What follows is an exhaustive list of metadata in littlefs. + +--- +#### `0x401` LFS_TYPE_CREATE + +Creates a new file with this id. Note that files in a metadata block +don't necessarily need a create tag. All a create does is move over any +files using this id. In this sense a create is similar to insertion into +an imaginary array of files. + +The create and delete tags allow littlefs to keep files in a directory +ordered alphabetically by filename. + +--- +#### `0x4ff` LFS_TYPE_DELETE + +Deletes the file with this id. An inverse to create, this tag moves over +any files neighboring this id similar to a deletion from an imaginary +array of files. + +--- +#### `0x0xx` LFS_TYPE_NAME + +Associates the id with a file name and file type. + +The data contains the file name stored as an ASCII string (may be expanded to +UTF8 in the future). + +The chunk field in this tag indicates an 8-bit file type which can be one of +the following. + +Currently, the name tag must precede any other tags associated with the id and +can not be reassigned without deleting the file. + +Layout of the name tag: + +``` + tag data +[-- 32 --][--- variable length ---] +[1| 3| 8 | 10 | 10 ][--- (size * 8) ---] + ^ ^ ^ ^ ^- size ^- file name + | | | '------ id + | | '----------- file type + | '-------------- type1 (0x0) + '----------------- valid bit +``` + +Name fields: + +1. **file type (8-bits)** - Type of the file. + +2. **file name** - File name stored as an ASCII string. + +--- +#### `0x001` LFS_TYPE_REG + +Initializes the id + name as a regular file. + +How each file is stored depends on its struct tag, which is described below. + +--- +#### `0x002` LFS_TYPE_DIR + +Initializes the id + name as a directory. + +Directories in littlefs are stored on disk as a linked-list of metadata pairs, +each pair containing any number of files in alphabetical order. A pointer to +the directory is stored in the struct tag, which is described below. + +--- +#### `0x0ff` LFS_TYPE_SUPERBLOCK + +Initializes the id as a superblock entry. + +The superblock entry is a special entry used to store format-time configuration +and identify the filesystem. + +The name is a bit of a misnomer. While the superblock entry serves the same +purpose as a superblock found in other filesystems, in littlefs the superblock +does not get a dedicated block. Instead, the superblock entry is duplicated +across a linked-list of metadata pairs rooted on the blocks 0 and 1. The last +metadata pair doubles as the root directory of the filesystem. + +``` + .--------. .--------. .--------. .--------. .--------. +.| super |->| super |->| super |->| super |->| file B | +|| block | || block | || block | || block | || file C | +|| | || | || | || file A | || file D | +|'--------' |'--------' |'--------' |'--------' |'--------' +'--------' '--------' '--------' '--------' '--------' + +\----------------+----------------/ \----------+----------/ + superblock pairs root directory +``` + +The filesystem starts with only the root directory. The superblock metadata +pairs grow every time the root pair is compacted in order to prolong the +life of the device exponentially. + +The contents of the superblock entry are stored in a name tag with the +superblock type and an inline-struct tag. The name tag contains the magic +string "littlefs", while the inline-struct tag contains version and +configuration information. + +Layout of the superblock name tag and inline-struct tag: + +``` + tag data +[-- 32 --][-- 32 --|-- 32 --] +[1|- 11 -| 10 | 10 ][--- 64 ---] + ^ ^ ^ ^- size (8) ^- magic string ("littlefs") + | | '------ id (0) + | '------------ type (0x0ff) + '----------------- valid bit + + tag data +[-- 32 --][-- 32 --|-- 32 --|-- 32 --] +[1|- 11 -| 10 | 10 ][-- 32 --|-- 32 --|-- 32 --] + ^ ^ ^ ^ ^- version ^- block size ^- block count + | | | | [-- 32 --|-- 32 --|-- 32 --] + | | | | [-- 32 --|-- 32 --|-- 32 --] + | | | | ^- name max ^- file max ^- attr max + | | | '- size (24) + | | '------ id (0) + | '------------ type (0x201) + '----------------- valid bit +``` + +Superblock fields: + +1. **Magic string (8-bytes)** - Magic string indicating the presence of + littlefs on the device. Must be the string "littlefs". + +2. **Version (32-bits)** - The version of littlefs at format time. The version + is encoded in a 32-bit value with the upper 16-bits containing the major + version, and the lower 16-bits containing the minor version. + + This specification describes version 2.0 (`0x00020000`). + +3. **Block size (32-bits)** - Size of the logical block size used by the + filesystem in bytes. + +4. **Block count (32-bits)** - Number of blocks in the filesystem. + +5. **Name max (32-bits)** - Maximum size of file names in bytes. + +6. **File max (32-bits)** - Maximum size of files in bytes. + +7. **Attr max (32-bits)** - Maximum size of file attributes in bytes. + +The superblock must always be the first entry (id 0) in the metadata pair, and +the name tag must always be the first tag in the metadata pair. This makes it +so that the magic string "littlefs" will always reside at offset=8 in a valid +littlefs superblock. + +--- +#### `0x2xx` LFS_TYPE_STRUCT + +Associates the id with an on-disk data structure. + +The exact layout of the data depends on the data structure type stored in the +chunk field and can be one of the following. + +Any type of struct supersedes all other structs associated with the id. For +example, appending a ctz-struct replaces an inline-struct on the same file. + +--- +#### `0x200` LFS_TYPE_DIRSTRUCT + +Gives the id a directory data structure. + +Directories in littlefs are stored on disk as a linked-list of metadata pairs, +each pair containing any number of files in alphabetical order. + +``` + | + v + .--------. .--------. .--------. .--------. .--------. .--------. +.| file A |->| file D |->| file G |->| file I |->| file J |->| file M | +|| file B | || file E | || file H | || | || file K | || file N | +|| file C | || file F | || | || | || file L | || | +|'--------' |'--------' |'--------' |'--------' |'--------' |'--------' +'--------' '--------' '--------' '--------' '--------' '--------' +``` + +The dir-struct tag contains only the pointer to the first metadata-pair in the +directory. The directory size is not known without traversing the directory. + +The pointer to the next metadata-pair in the directory is stored in a tail tag, +which is described below. + +Layout of the dir-struct tag: + +``` + tag data +[-- 32 --][-- 32 --|-- 32 --] +[1|- 11 -| 10 | 10 ][--- 64 ---] + ^ ^ ^ ^- size (8) ^- metadata pair + | | '------ id + | '------------ type (0x200) + '----------------- valid bit +``` + +Dir-struct fields: + +1. **Metadata pair (8-bytes)** - Pointer to the first metadata-pair + in the directory. + +--- +#### `0x201` LFS_TYPE_INLINESTRUCT + +Gives the id an inline data structure. + +Inline structs store small files that can fit in the metadata pair. In this +case, the file data is stored directly in the tag's data area. + +Layout of the inline-struct tag: + +``` + tag data +[-- 32 --][--- variable length ---] +[1|- 11 -| 10 | 10 ][--- (size * 8) ---] + ^ ^ ^ ^- size ^- inline data + | | '------ id + | '------------ type (0x201) + '----------------- valid bit +``` + +Inline-struct fields: + +1. **Inline data** - File data stored directly in the metadata-pair. + +--- +#### `0x202` LFS_TYPE_CTZSTRUCT + +Gives the id a CTZ skip-list data structure. + +CTZ skip-lists store files that can not fit in the metadata pair. These files +are stored in a skip-list in reverse, with a pointer to the head of the +skip-list. Note that the head of the skip-list and the file size is enough +information to read the file. + +How exactly CTZ skip-lists work is a bit complicated. A full explanation can be +found in the [DESIGN.md](DESIGN.md#ctz-skip-lists). + +A quick summary: For every _n_‍th block where _n_ is divisible by +2‍_ˣ_, that block contains a pointer to block _n_-2‍_ˣ_. +These pointers are stored in increasing order of _x_ in each block of the file +before the actual data. + +``` + | + v +.--------. .--------. .--------. .--------. .--------. .--------. +| A |<-| D |<-| G |<-| J |<-| M |<-| P | +| B |<-| E |--| H |<-| K |--| N | | Q | +| C |<-| F |--| I |--| L |--| O | | | +'--------' '--------' '--------' '--------' '--------' '--------' + block 0 block 1 block 2 block 3 block 4 block 5 + 1 skip 2 skips 1 skip 3 skips 1 skip +``` + +Note that the maximum number of pointers in a block is bounded by the maximum +file size divided by the block size. With 32 bits for file size, this results +in a minimum block size of 104 bytes. + +Layout of the CTZ-struct tag: + +``` + tag data +[-- 32 --][-- 32 --|-- 32 --] +[1|- 11 -| 10 | 10 ][-- 32 --|-- 32 --] + ^ ^ ^ ^ ^ ^- file size + | | | | '-------------------- file head + | | | '- size (8) + | | '------ id + | '------------ type (0x202) + '----------------- valid bit +``` + +CTZ-struct fields: + +1. **File head (32-bits)** - Pointer to the block that is the head of the + file's CTZ skip-list. + +2. **File size (32-bits)** - Size of the file in bytes. + +--- +#### `0x3xx` LFS_TYPE_USERATTR + +Attaches a user attribute to an id. + +littlefs has a concept of "user attributes". These are small user-provided +attributes that can be used to store things like timestamps, hashes, +permissions, etc. + +Each user attribute is uniquely identified by an 8-bit type which is stored in +the chunk field, and the user attribute itself can be found in the tag's data. + +There are currently no standard user attributes and a portable littlefs +implementation should work with any user attributes missing. + +Layout of the user-attr tag: + +``` + tag data +[-- 32 --][--- variable length ---] +[1| 3| 8 | 10 | 10 ][--- (size * 8) ---] + ^ ^ ^ ^ ^- size ^- attr data + | | | '------ id + | | '----------- attr type + | '-------------- type1 (0x3) + '----------------- valid bit +``` + +User-attr fields: + +1. **Attr type (8-bits)** - Type of the user attributes. + +2. **Attr data** - The data associated with the user attribute. + +--- +#### `0x6xx` LFS_TYPE_TAIL + +Provides the tail pointer for the metadata pair itself. + +The metadata pair's tail pointer is used in littlefs for a linked-list +containing all metadata pairs. The chunk field contains the type of the tail, +which indicates if the following metadata pair is a part of the directory +(hard-tail) or only used to traverse the filesystem (soft-tail). + +``` + .--------. + .| dir A |-. + ||softtail| | +.--------| |-' +| |'--------' +| '---|--|-' +| .-' '-------------. +| v v +| .--------. .--------. .--------. +'->| dir B |->| dir B |->| dir C | + ||hardtail| ||softtail| || | + || | || | || | + |'--------' |'--------' |'--------' + '--------' '--------' '--------' +``` + +Currently any type supersedes any other preceding tails in the metadata pair, +but this may change if additional metadata pair state is added. + +A note about the metadata pair linked-list: Normally, this linked-list contains +every metadata pair in the filesystem. However, there are some operations that +can cause this linked-list to become out of sync if a power-loss were to occur. +When this happens, littlefs sets the "sync" flag in the global state. How +exactly this flag is stored is described below. + +When the sync flag is set: + +1. The linked-list may contain an orphaned directory that has been removed in + the filesystem. +2. The linked-list may contain a metadata pair with a bad block that has been + replaced in the filesystem. + +If the sync flag is set, the threaded linked-list must be checked for these +errors before it can be used reliably. Note that the threaded linked-list can +be ignored if littlefs is mounted read-only. + +Layout of the tail tag: + +``` + tag data +[-- 32 --][-- 32 --|-- 32 --] +[1| 3| 8 | 10 | 10 ][--- 64 ---] + ^ ^ ^ ^ ^- size (8) ^- metadata pair + | | | '------ id + | | '---------- tail type + | '------------- type1 (0x6) + '---------------- valid bit +``` + +Tail fields: + +1. **Tail type (8-bits)** - Type of the tail pointer. + +2. **Metadata pair (8-bytes)** - Pointer to the next metadata-pair. + +--- +#### `0x600` LFS_TYPE_SOFTTAIL + +Provides a tail pointer that points to the next metadata pair in the +filesystem. + +In this case, the next metadata pair is not a part of our current directory +and should only be followed when traversing the entire filesystem. + +--- +#### `0x601` LFS_TYPE_HARDTAIL + +Provides a tail pointer that points to the next metadata pair in the +directory. + +In this case, the next metadata pair belongs to the current directory. Note +that because directories in littlefs are sorted alphabetically, the next +metadata pair should only contain filenames greater than any filename in the +current pair. + +--- +#### `0x7xx` LFS_TYPE_GSTATE + +Provides delta bits for global state entries. + +littlefs has a concept of "global state". This is a small set of state that +can be updated by a commit to _any_ metadata pair in the filesystem. + +The way this works is that the global state is stored as a set of deltas +distributed across the filesystem such that the global state can be found by +the xor-sum of these deltas. + +``` + .--------. .--------. .--------. .--------. .--------. +.| |->| gdelta |->| |->| gdelta |->| gdelta | +|| | || 0x23 | || | || 0xff | || 0xce | +|| | || | || | || | || | +|'--------' |'--------' |'--------' |'--------' |'--------' +'--------' '----|---' '--------' '----|---' '----|---' + v v v + 0x00 --> xor ------------------> xor ------> xor --> gstate = 0x12 +``` + +Note that storing globals this way is very expensive in terms of storage usage, +so any global state should be kept very small. + +The size and format of each piece of global state depends on the type, which +is stored in the chunk field. Currently, the only global state is move state, +which is outlined below. + +--- +#### `0x7ff` LFS_TYPE_MOVESTATE + +Provides delta bits for the global move state. + +The move state in littlefs is used to store info about operations that could +cause to filesystem to go out of sync if the power is lost. The operations +where this could occur is moves of files between metadata pairs and any +operation that changes metadata pairs on the threaded linked-list. + +In the case of moves, the move state contains a tag + metadata pair describing +the source of the ongoing move. If this tag is non-zero, that means that power +was lost during a move, and the file exists in two different locations. If this +happens, the source of the move should be considered deleted, and the move +should be completed (the source should be deleted) before any other write +operations to the filesystem. + +In the case of operations to the threaded linked-list, a single "sync" bit is +used to indicate that a modification is ongoing. If this sync flag is set, the +threaded linked-list will need to be checked for errors before it can be used +reliably. The exact cases to check for are described above in the tail tag. + +Layout of the move state: + +``` + tag data +[-- 32 --][-- 32 --|-- 32 --|-- 32 --] +[1|- 11 -| 10 | 10 ][1|- 11 -| 10 | 10 |--- 64 ---] + ^ ^ ^ ^ ^ ^ ^ ^- padding (0) ^- metadata pair + | | | | | | '------ move id + | | | | | '------------ move type + | | | | '----------------- sync bit + | | | | + | | | '- size (12) + | | '------ id (0x3ff) + | '------------ type (0x7ff) + '----------------- valid bit +``` + +Move state fields: + +1. **Sync bit (1-bit)** - Indicates if the metadata pair threaded linked-list + is in-sync. If set, the threaded linked-list should be checked for errors. + +2. **Move type (11-bits)** - Type of move being performed. Must be either + `0x000`, indicating no move, or `0x4ff` indicating the source file should + be deleted. + +3. **Move id (10-bits)** - The file id being moved. + +4. **Metadata pair (8-bytes)** - Pointer to the metadata-pair containing + the move. + +--- +#### `0x5xx` LFS_TYPE_CRC + +Last but not least, the CRC tag marks the end of a commit and provides a +checksum for any commits to the metadata block. + +The first 32-bits of the data contain a CRC-32 with a polynomial of +`0x04c11db7` initialized with `0xffffffff`. This CRC provides a checksum for +all metadata since the previous CRC tag, including the CRC tag itself. For +the first commit, this includes the revision count for the metadata block. + +However, the size of the data is not limited to 32-bits. The data field may +larger to pad the commit to the next program-aligned boundary. + +In addition, the CRC tag's chunk field contains a set of flags which can +change the behaviour of commits. Currently the only flag in use is the lowest +bit, which determines the expected state of the valid bit for any following +tags. This is used to guarantee that unwritten storage in a metadata block +will be detected as invalid. + +Layout of the CRC tag: + +``` + tag data +[-- 32 --][-- 32 --|--- variable length ---] +[1| 3| 8 | 10 | 10 ][-- 32 --|--- (size * 8 - 32) ---] + ^ ^ ^ ^ ^ ^- crc ^- padding + | | | | '- size + | | | '------ id (0x3ff) + | | '----------- valid state + | '-------------- type1 (0x5) + '----------------- valid bit +``` + +CRC fields: + +1. **Valid state (1-bit)** - Indicates the expected value of the valid bit for + any tags in the next commit. + +2. **CRC (32-bits)** - CRC-32 with a polynomial of `0x04c11db7` initialized + with `0xffffffff`. + +3. **Padding** - Padding to the next program-aligned boundary. No guarantees + are made about the contents. + +--- +#### `0x5ff` LFS_TYPE_FCRC + +Added in lfs2.1, the optional FCRC tag contains a checksum of some amount of +bytes in the next commit at the time it was erased. This allows us to ensure +that we only ever program erased bytes, even if a previous commit failed due +to power-loss. + +When programming a commit, the FCRC size must be at least as large as the +program block size. However, the program block is not saved on disk, and can +change between mounts, so the FCRC size on disk may be different than the +current program block size. + +If the FCRC is missing or the checksum does not match, we must assume a +commit was attempted but failed due to power-loss. + +Layout of the FCRC tag: + +``` + tag data +[-- 32 --][-- 32 --|-- 32 --] +[1|- 11 -| 10 | 10 ][-- 32 --|-- 32 --] + ^ ^ ^ ^ ^- fcrc size ^- fcrc + | | | '- size (8) + | | '------ id (0x3ff) + | '------------ type (0x5ff) + '----------------- valid bit +``` + +FCRC fields: + +1. **FCRC size (32-bits)** - Number of bytes after this commit's CRC tag's + padding to include in the FCRC. + +2. **FCRC (32-bits)** - CRC of the bytes after this commit's CRC tag's padding + when erased. Like the CRC tag, this uses a CRC-32 with a polynomial of + `0x04c11db7` initialized with `0xffffffff`. + +--- diff --git a/TSM_PicoW_Sensor/McuLib/littleFS/lfs.c b/TSM_PicoW_Sensor/McuLib/littleFS/lfs.c new file mode 100644 index 0000000..3a9b6fb --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/littleFS/lfs.c @@ -0,0 +1,6465 @@ +/* + * The little filesystem + * + * Copyright (c) 2022, The littlefs authors. + * Copyright (c) 2017, Arm Limited. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + */ +#include "lfs.h" +#include "lfs_util.h" + +#include "lfs_config.h" /* << EST */ +#if LITTLEFS_CONFIG_ENABLED /* << EST */ + +// some constants used throughout the code +#define LFS_BLOCK_NULL ((lfs_block_t)-1) +#define LFS_BLOCK_INLINE ((lfs_block_t)-2) + +enum { + LFS_OK_RELOCATED = 1, + LFS_OK_DROPPED = 2, + LFS_OK_ORPHANED = 3, +}; + +enum { + LFS_CMP_EQ = 0, + LFS_CMP_LT = 1, + LFS_CMP_GT = 2, +}; + + +/// Caching block device operations /// + +static inline void lfs_cache_drop(lfs_t *lfs, lfs_cache_t *rcache) { + // do not zero, cheaper if cache is readonly or only going to be + // written with identical data (during relocates) + (void)lfs; + rcache->block = LFS_BLOCK_NULL; +} + +static inline void lfs_cache_zero(lfs_t *lfs, lfs_cache_t *pcache) { + // zero to avoid information leak + memset(pcache->buffer, 0xff, lfs->cfg->cache_size); + pcache->block = LFS_BLOCK_NULL; +} + +static int lfs_bd_read(lfs_t *lfs, + const lfs_cache_t *pcache, lfs_cache_t *rcache, lfs_size_t hint, + lfs_block_t block, lfs_off_t off, + void *buffer, lfs_size_t size) { + uint8_t *data = buffer; + if (off+size > lfs->cfg->block_size + || (lfs->block_count && block >= lfs->block_count)) { + return LFS_ERR_CORRUPT; + } + + while (size > 0) { + lfs_size_t diff = size; + + if (pcache && block == pcache->block && + off < pcache->off + pcache->size) { + if (off >= pcache->off) { + // is already in pcache? + diff = lfs_min(diff, pcache->size - (off-pcache->off)); + memcpy(data, &pcache->buffer[off-pcache->off], diff); + + data += diff; + off += diff; + size -= diff; + continue; + } + + // pcache takes priority + diff = lfs_min(diff, pcache->off-off); + } + + if (block == rcache->block && + off < rcache->off + rcache->size) { + if (off >= rcache->off) { + // is already in rcache? + diff = lfs_min(diff, rcache->size - (off-rcache->off)); + memcpy(data, &rcache->buffer[off-rcache->off], diff); + + data += diff; + off += diff; + size -= diff; + continue; + } + + // rcache takes priority + diff = lfs_min(diff, rcache->off-off); + } + + if (size >= hint && off % lfs->cfg->read_size == 0 && + size >= lfs->cfg->read_size) { + // bypass cache? + diff = lfs_aligndown(diff, lfs->cfg->read_size); + int err = lfs->cfg->read(lfs->cfg, block, off, data, diff); + if (err) { + return err; + } + + data += diff; + off += diff; + size -= diff; + continue; + } + + // load to cache, first condition can no longer fail + LFS_ASSERT(!lfs->block_count || block < lfs->block_count); + rcache->block = block; + rcache->off = lfs_aligndown(off, lfs->cfg->read_size); + rcache->size = lfs_min( + lfs_min( + lfs_alignup(off+hint, lfs->cfg->read_size), + lfs->cfg->block_size) + - rcache->off, + lfs->cfg->cache_size); + int err = lfs->cfg->read(lfs->cfg, rcache->block, + rcache->off, rcache->buffer, rcache->size); + LFS_ASSERT(err <= 0); + if (err) { + return err; + } + } + + return 0; +} + +static int lfs_bd_cmp(lfs_t *lfs, + const lfs_cache_t *pcache, lfs_cache_t *rcache, lfs_size_t hint, + lfs_block_t block, lfs_off_t off, + const void *buffer, lfs_size_t size) { + const uint8_t *data = buffer; + lfs_size_t diff = 0; + + for (lfs_off_t i = 0; i < size; i += diff) { + uint8_t dat[8]; + + diff = lfs_min(size-i, sizeof(dat)); + int err = lfs_bd_read(lfs, + pcache, rcache, hint-i, + block, off+i, &dat, diff); + if (err) { + return err; + } + + int res = memcmp(dat, data + i, diff); + if (res) { + return res < 0 ? LFS_CMP_LT : LFS_CMP_GT; + } + } + + return LFS_CMP_EQ; +} + +static int lfs_bd_crc(lfs_t *lfs, + const lfs_cache_t *pcache, lfs_cache_t *rcache, lfs_size_t hint, + lfs_block_t block, lfs_off_t off, lfs_size_t size, uint32_t *crc) { + lfs_size_t diff = 0; + + for (lfs_off_t i = 0; i < size; i += diff) { + uint8_t dat[8]; + diff = lfs_min(size-i, sizeof(dat)); + int err = lfs_bd_read(lfs, + pcache, rcache, hint-i, + block, off+i, &dat, diff); + if (err) { + return err; + } + + *crc = lfs_crc(*crc, &dat, diff); + } + + return 0; +} + +#ifndef LFS_READONLY +static int lfs_bd_flush(lfs_t *lfs, + lfs_cache_t *pcache, lfs_cache_t *rcache, bool validate) { + if (pcache->block != LFS_BLOCK_NULL && pcache->block != LFS_BLOCK_INLINE) { + LFS_ASSERT(pcache->block < lfs->block_count); + lfs_size_t diff = lfs_alignup(pcache->size, lfs->cfg->prog_size); + int err = lfs->cfg->prog(lfs->cfg, pcache->block, + pcache->off, pcache->buffer, diff); + LFS_ASSERT(err <= 0); + if (err) { + return err; + } + + if (validate) { + // check data on disk + lfs_cache_drop(lfs, rcache); + int res = lfs_bd_cmp(lfs, + NULL, rcache, diff, + pcache->block, pcache->off, pcache->buffer, diff); + if (res < 0) { + return res; + } + + if (res != LFS_CMP_EQ) { + return LFS_ERR_CORRUPT; + } + } + + lfs_cache_zero(lfs, pcache); + } + + return 0; +} +#endif + +#ifndef LFS_READONLY +static int lfs_bd_sync(lfs_t *lfs, + lfs_cache_t *pcache, lfs_cache_t *rcache, bool validate) { + lfs_cache_drop(lfs, rcache); + + int err = lfs_bd_flush(lfs, pcache, rcache, validate); + if (err) { + return err; + } + + err = lfs->cfg->sync(lfs->cfg); + LFS_ASSERT(err <= 0); + return err; +} +#endif + +#ifndef LFS_READONLY +static int lfs_bd_prog(lfs_t *lfs, + lfs_cache_t *pcache, lfs_cache_t *rcache, bool validate, + lfs_block_t block, lfs_off_t off, + const void *buffer, lfs_size_t size) { + const uint8_t *data = buffer; + LFS_ASSERT(block == LFS_BLOCK_INLINE || block < lfs->block_count); + LFS_ASSERT(off + size <= lfs->cfg->block_size); + + while (size > 0) { + if (block == pcache->block && + off >= pcache->off && + off < pcache->off + lfs->cfg->cache_size) { + // already fits in pcache? + lfs_size_t diff = lfs_min(size, + lfs->cfg->cache_size - (off-pcache->off)); + memcpy(&pcache->buffer[off-pcache->off], data, diff); + + data += diff; + off += diff; + size -= diff; + + pcache->size = lfs_max(pcache->size, off - pcache->off); + if (pcache->size == lfs->cfg->cache_size) { + // eagerly flush out pcache if we fill up + int err = lfs_bd_flush(lfs, pcache, rcache, validate); + if (err) { + return err; + } + } + + continue; + } + + // pcache must have been flushed, either by programming and + // entire block or manually flushing the pcache + LFS_ASSERT(pcache->block == LFS_BLOCK_NULL); + + // prepare pcache, first condition can no longer fail + pcache->block = block; + pcache->off = lfs_aligndown(off, lfs->cfg->prog_size); + pcache->size = 0; + } + + return 0; +} +#endif + +#ifndef LFS_READONLY +static int lfs_bd_erase(lfs_t *lfs, lfs_block_t block) { + LFS_ASSERT(block < lfs->block_count); + int err = lfs->cfg->erase(lfs->cfg, block); + LFS_ASSERT(err <= 0); + return err; +} +#endif + + +/// Small type-level utilities /// +// operations on block pairs +static inline void lfs_pair_swap(lfs_block_t pair[2]) { + lfs_block_t t = pair[0]; + pair[0] = pair[1]; + pair[1] = t; +} + +static inline bool lfs_pair_isnull(const lfs_block_t pair[2]) { + return pair[0] == LFS_BLOCK_NULL || pair[1] == LFS_BLOCK_NULL; +} + +static inline int lfs_pair_cmp( + const lfs_block_t paira[2], + const lfs_block_t pairb[2]) { + return !(paira[0] == pairb[0] || paira[1] == pairb[1] || + paira[0] == pairb[1] || paira[1] == pairb[0]); +} + +static inline bool lfs_pair_issync( + const lfs_block_t paira[2], + const lfs_block_t pairb[2]) { + return (paira[0] == pairb[0] && paira[1] == pairb[1]) || + (paira[0] == pairb[1] && paira[1] == pairb[0]); +} + +static inline void lfs_pair_fromle32(lfs_block_t pair[2]) { + pair[0] = lfs_fromle32(pair[0]); + pair[1] = lfs_fromle32(pair[1]); +} + +#ifndef LFS_READONLY +static inline void lfs_pair_tole32(lfs_block_t pair[2]) { + pair[0] = lfs_tole32(pair[0]); + pair[1] = lfs_tole32(pair[1]); +} +#endif + +// operations on 32-bit entry tags +typedef uint32_t lfs_tag_t; +typedef int32_t lfs_stag_t; + +#define LFS_MKTAG(type, id, size) \ + (((lfs_tag_t)(type) << 20) | ((lfs_tag_t)(id) << 10) | (lfs_tag_t)(size)) + +#define LFS_MKTAG_IF(cond, type, id, size) \ + ((cond) ? LFS_MKTAG(type, id, size) : LFS_MKTAG(LFS_FROM_NOOP, 0, 0)) + +#define LFS_MKTAG_IF_ELSE(cond, type1, id1, size1, type2, id2, size2) \ + ((cond) ? LFS_MKTAG(type1, id1, size1) : LFS_MKTAG(type2, id2, size2)) + +static inline bool lfs_tag_isvalid(lfs_tag_t tag) { + return !(tag & 0x80000000); +} + +static inline bool lfs_tag_isdelete(lfs_tag_t tag) { + return ((int32_t)(tag << 22) >> 22) == -1; +} + +static inline uint16_t lfs_tag_type1(lfs_tag_t tag) { + return (tag & 0x70000000) >> 20; +} + +static inline uint16_t lfs_tag_type2(lfs_tag_t tag) { + return (tag & 0x78000000) >> 20; +} + +static inline uint16_t lfs_tag_type3(lfs_tag_t tag) { + return (tag & 0x7ff00000) >> 20; +} + +static inline uint8_t lfs_tag_chunk(lfs_tag_t tag) { + return (tag & 0x0ff00000) >> 20; +} + +static inline int8_t lfs_tag_splice(lfs_tag_t tag) { + return (int8_t)lfs_tag_chunk(tag); +} + +static inline uint16_t lfs_tag_id(lfs_tag_t tag) { + return (tag & 0x000ffc00) >> 10; +} + +static inline lfs_size_t lfs_tag_size(lfs_tag_t tag) { + return tag & 0x000003ff; +} + +static inline lfs_size_t lfs_tag_dsize(lfs_tag_t tag) { + return sizeof(tag) + lfs_tag_size(tag + lfs_tag_isdelete(tag)); +} + +// operations on attributes in attribute lists +struct lfs_mattr { + lfs_tag_t tag; + const void *buffer; +}; + +struct lfs_diskoff { + lfs_block_t block; + lfs_off_t off; +}; + +#define LFS_MKATTRS(...) \ + (struct lfs_mattr[]){__VA_ARGS__}, \ + sizeof((struct lfs_mattr[]){__VA_ARGS__}) / sizeof(struct lfs_mattr) + +// operations on global state +static inline void lfs_gstate_xor(lfs_gstate_t *a, const lfs_gstate_t *b) { + for (int i = 0; i < 3; i++) { + ((uint32_t*)a)[i] ^= ((const uint32_t*)b)[i]; + } +} + +static inline bool lfs_gstate_iszero(const lfs_gstate_t *a) { + for (int i = 0; i < 3; i++) { + if (((uint32_t*)a)[i] != 0) { + return false; + } + } + return true; +} + +#ifndef LFS_READONLY +static inline bool lfs_gstate_hasorphans(const lfs_gstate_t *a) { + return lfs_tag_size(a->tag); +} + +static inline uint8_t lfs_gstate_getorphans(const lfs_gstate_t *a) { + return lfs_tag_size(a->tag) & 0x1ff; +} + +static inline bool lfs_gstate_hasmove(const lfs_gstate_t *a) { + return lfs_tag_type1(a->tag); +} +#endif + +static inline bool lfs_gstate_needssuperblock(const lfs_gstate_t *a) { + return lfs_tag_size(a->tag) >> 9; +} + +static inline bool lfs_gstate_hasmovehere(const lfs_gstate_t *a, + const lfs_block_t *pair) { + return lfs_tag_type1(a->tag) && lfs_pair_cmp(a->pair, pair) == 0; +} + +static inline void lfs_gstate_fromle32(lfs_gstate_t *a) { + a->tag = lfs_fromle32(a->tag); + a->pair[0] = lfs_fromle32(a->pair[0]); + a->pair[1] = lfs_fromle32(a->pair[1]); +} + +#ifndef LFS_READONLY +static inline void lfs_gstate_tole32(lfs_gstate_t *a) { + a->tag = lfs_tole32(a->tag); + a->pair[0] = lfs_tole32(a->pair[0]); + a->pair[1] = lfs_tole32(a->pair[1]); +} +#endif + +// operations on forward-CRCs used to track erased state +struct lfs_fcrc { + lfs_size_t size; + uint32_t crc; +}; + +static void lfs_fcrc_fromle32(struct lfs_fcrc *fcrc) { + fcrc->size = lfs_fromle32(fcrc->size); + fcrc->crc = lfs_fromle32(fcrc->crc); +} + +#ifndef LFS_READONLY +static void lfs_fcrc_tole32(struct lfs_fcrc *fcrc) { + fcrc->size = lfs_tole32(fcrc->size); + fcrc->crc = lfs_tole32(fcrc->crc); +} +#endif + +// other endianness operations +static void lfs_ctz_fromle32(struct lfs_ctz *ctz) { + ctz->head = lfs_fromle32(ctz->head); + ctz->size = lfs_fromle32(ctz->size); +} + +#ifndef LFS_READONLY +static void lfs_ctz_tole32(struct lfs_ctz *ctz) { + ctz->head = lfs_tole32(ctz->head); + ctz->size = lfs_tole32(ctz->size); +} +#endif + +static inline void lfs_superblock_fromle32(lfs_superblock_t *superblock) { + superblock->version = lfs_fromle32(superblock->version); + superblock->block_size = lfs_fromle32(superblock->block_size); + superblock->block_count = lfs_fromle32(superblock->block_count); + superblock->name_max = lfs_fromle32(superblock->name_max); + superblock->file_max = lfs_fromle32(superblock->file_max); + superblock->attr_max = lfs_fromle32(superblock->attr_max); +} + +#ifndef LFS_READONLY +static inline void lfs_superblock_tole32(lfs_superblock_t *superblock) { + superblock->version = lfs_tole32(superblock->version); + superblock->block_size = lfs_tole32(superblock->block_size); + superblock->block_count = lfs_tole32(superblock->block_count); + superblock->name_max = lfs_tole32(superblock->name_max); + superblock->file_max = lfs_tole32(superblock->file_max); + superblock->attr_max = lfs_tole32(superblock->attr_max); +} +#endif + +#ifndef LFS_NO_ASSERT +static bool lfs_mlist_isopen(struct lfs_mlist *head, + struct lfs_mlist *node) { + for (struct lfs_mlist **p = &head; *p; p = &(*p)->next) { + if (*p == (struct lfs_mlist*)node) { + return true; + } + } + + return false; +} +#endif + +static void lfs_mlist_remove(lfs_t *lfs, struct lfs_mlist *mlist) { + for (struct lfs_mlist **p = &lfs->mlist; *p; p = &(*p)->next) { + if (*p == mlist) { + *p = (*p)->next; + break; + } + } +} + +static void lfs_mlist_append(lfs_t *lfs, struct lfs_mlist *mlist) { + mlist->next = lfs->mlist; + lfs->mlist = mlist; +} + +// some other filesystem operations +static uint32_t lfs_fs_disk_version(lfs_t *lfs) { + (void)lfs; +#ifdef LFS_MULTIVERSION + if (lfs->cfg->disk_version) { + return lfs->cfg->disk_version; + } else +#endif + { + return LFS_DISK_VERSION; + } +} + +static uint16_t lfs_fs_disk_version_major(lfs_t *lfs) { + return 0xffff & (lfs_fs_disk_version(lfs) >> 16); + +} + +static uint16_t lfs_fs_disk_version_minor(lfs_t *lfs) { + return 0xffff & (lfs_fs_disk_version(lfs) >> 0); +} + + +/// Internal operations predeclared here /// +#ifndef LFS_READONLY +static int lfs_dir_commit(lfs_t *lfs, lfs_mdir_t *dir, + const struct lfs_mattr *attrs, int attrcount); +static int lfs_dir_compact(lfs_t *lfs, + lfs_mdir_t *dir, const struct lfs_mattr *attrs, int attrcount, + lfs_mdir_t *source, uint16_t begin, uint16_t end); +static lfs_ssize_t lfs_file_flushedwrite(lfs_t *lfs, lfs_file_t *file, + const void *buffer, lfs_size_t size); +static lfs_ssize_t lfs_file_write_(lfs_t *lfs, lfs_file_t *file, + const void *buffer, lfs_size_t size); +static int lfs_file_sync_(lfs_t *lfs, lfs_file_t *file); +static int lfs_file_outline(lfs_t *lfs, lfs_file_t *file); +static int lfs_file_flush(lfs_t *lfs, lfs_file_t *file); + +static int lfs_fs_deorphan(lfs_t *lfs, bool powerloss); +static int lfs_fs_preporphans(lfs_t *lfs, int8_t orphans); +static void lfs_fs_prepmove(lfs_t *lfs, + uint16_t id, const lfs_block_t pair[2]); +static int lfs_fs_pred(lfs_t *lfs, const lfs_block_t dir[2], + lfs_mdir_t *pdir); +static lfs_stag_t lfs_fs_parent(lfs_t *lfs, const lfs_block_t dir[2], + lfs_mdir_t *parent); +static int lfs_fs_forceconsistency(lfs_t *lfs); +#endif + +static void lfs_fs_prepsuperblock(lfs_t *lfs, bool needssuperblock); + +#ifdef LFS_MIGRATE +static int lfs1_traverse(lfs_t *lfs, + int (*cb)(void*, lfs_block_t), void *data); +#endif + +static int lfs_dir_rewind_(lfs_t *lfs, lfs_dir_t *dir); + +static lfs_ssize_t lfs_file_flushedread(lfs_t *lfs, lfs_file_t *file, + void *buffer, lfs_size_t size); +static lfs_ssize_t lfs_file_read_(lfs_t *lfs, lfs_file_t *file, + void *buffer, lfs_size_t size); +static int lfs_file_close_(lfs_t *lfs, lfs_file_t *file); +static lfs_soff_t lfs_file_size_(lfs_t *lfs, lfs_file_t *file); + +static lfs_ssize_t lfs_fs_size_(lfs_t *lfs); +static int lfs_fs_traverse_(lfs_t *lfs, + int (*cb)(void *data, lfs_block_t block), void *data, + bool includeorphans); + +static int lfs_deinit(lfs_t *lfs); +static int lfs_unmount_(lfs_t *lfs); + + +/// Block allocator /// + +// allocations should call this when all allocated blocks are committed to +// the filesystem +// +// after a checkpoint, the block allocator may realloc any untracked blocks +static void lfs_alloc_ckpoint(lfs_t *lfs) { + lfs->lookahead.ckpoint = lfs->block_count; +} + +// drop the lookahead buffer, this is done during mounting and failed +// traversals in order to avoid invalid lookahead state +static void lfs_alloc_drop(lfs_t *lfs) { + lfs->lookahead.size = 0; + lfs->lookahead.next = 0; + lfs_alloc_ckpoint(lfs); +} + +#ifndef LFS_READONLY +static int lfs_alloc_lookahead(void *p, lfs_block_t block) { + lfs_t *lfs = (lfs_t*)p; + lfs_block_t off = ((block - lfs->lookahead.start) + + lfs->block_count) % lfs->block_count; + + if (off < lfs->lookahead.size) { + lfs->lookahead.buffer[off / 8] |= 1U << (off % 8); + } + + return 0; +} +#endif + +#ifndef LFS_READONLY +static int lfs_alloc_scan(lfs_t *lfs) { + // move lookahead buffer to the first unused block + // + // note we limit the lookahead buffer to at most the amount of blocks + // checkpointed, this prevents the math in lfs_alloc from underflowing + lfs->lookahead.start = (lfs->lookahead.start + lfs->lookahead.next) + % lfs->block_count; + lfs->lookahead.next = 0; + lfs->lookahead.size = lfs_min( + 8*lfs->cfg->lookahead_size, + lfs->lookahead.ckpoint); + + // find mask of free blocks from tree + memset(lfs->lookahead.buffer, 0, lfs->cfg->lookahead_size); + int err = lfs_fs_traverse_(lfs, lfs_alloc_lookahead, lfs, true); + if (err) { + lfs_alloc_drop(lfs); + return err; + } + + return 0; +} +#endif + +#ifndef LFS_READONLY +static int lfs_alloc(lfs_t *lfs, lfs_block_t *block) { + while (true) { + // scan our lookahead buffer for free blocks + while (lfs->lookahead.next < lfs->lookahead.size) { + if (!(lfs->lookahead.buffer[lfs->lookahead.next / 8] + & (1U << (lfs->lookahead.next % 8)))) { + // found a free block + *block = (lfs->lookahead.start + lfs->lookahead.next) + % lfs->block_count; + + // eagerly find next free block to maximize how many blocks + // lfs_alloc_ckpoint makes available for scanning + while (true) { + lfs->lookahead.next += 1; + lfs->lookahead.ckpoint -= 1; + + if (lfs->lookahead.next >= lfs->lookahead.size + || !(lfs->lookahead.buffer[lfs->lookahead.next / 8] + & (1U << (lfs->lookahead.next % 8)))) { + return 0; + } + } + } + + lfs->lookahead.next += 1; + lfs->lookahead.ckpoint -= 1; + } + + // In order to keep our block allocator from spinning forever when our + // filesystem is full, we mark points where there are no in-flight + // allocations with a checkpoint before starting a set of allocations. + // + // If we've looked at all blocks since the last checkpoint, we report + // the filesystem as out of storage. + // + if (lfs->lookahead.ckpoint <= 0) { + LFS_ERROR("No more free space 0x%"PRIx32, + (lfs->lookahead.start + lfs->lookahead.next) + % lfs->block_count); + return LFS_ERR_NOSPC; + } + + // No blocks in our lookahead buffer, we need to scan the filesystem for + // unused blocks in the next lookahead window. + int err = lfs_alloc_scan(lfs); + if(err) { + return err; + } + } +} +#endif + +/// Metadata pair and directory operations /// +static lfs_stag_t lfs_dir_getslice(lfs_t *lfs, const lfs_mdir_t *dir, + lfs_tag_t gmask, lfs_tag_t gtag, + lfs_off_t goff, void *gbuffer, lfs_size_t gsize) { + lfs_off_t off = dir->off; + lfs_tag_t ntag = dir->etag; + lfs_stag_t gdiff = 0; + + // synthetic moves + if (lfs_gstate_hasmovehere(&lfs->gdisk, dir->pair) && + lfs_tag_id(gmask) != 0) { + if (lfs_tag_id(lfs->gdisk.tag) == lfs_tag_id(gtag)) { + return LFS_ERR_NOENT; + } else if (lfs_tag_id(lfs->gdisk.tag) < lfs_tag_id(gtag)) { + gdiff -= LFS_MKTAG(0, 1, 0); + } + } + + // iterate over dir block backwards (for faster lookups) + while (off >= sizeof(lfs_tag_t) + lfs_tag_dsize(ntag)) { + off -= lfs_tag_dsize(ntag); + lfs_tag_t tag = ntag; + int err = lfs_bd_read(lfs, + NULL, &lfs->rcache, sizeof(ntag), + dir->pair[0], off, &ntag, sizeof(ntag)); + if (err) { + return err; + } + + ntag = (lfs_frombe32(ntag) ^ tag) & 0x7fffffff; + + if (lfs_tag_id(gmask) != 0 && + lfs_tag_type1(tag) == LFS_TYPE_SPLICE && + lfs_tag_id(tag) <= lfs_tag_id(gtag - gdiff)) { + if (tag == (LFS_MKTAG(LFS_TYPE_CREATE, 0, 0) | + (LFS_MKTAG(0, 0x3ff, 0) & (gtag - gdiff)))) { + // found where we were created + return LFS_ERR_NOENT; + } + + // move around splices + gdiff += LFS_MKTAG(0, lfs_tag_splice(tag), 0); + } + + if ((gmask & tag) == (gmask & (gtag - gdiff))) { + if (lfs_tag_isdelete(tag)) { + return LFS_ERR_NOENT; + } + + lfs_size_t diff = lfs_min(lfs_tag_size(tag), gsize); + err = lfs_bd_read(lfs, + NULL, &lfs->rcache, diff, + dir->pair[0], off+sizeof(tag)+goff, gbuffer, diff); + if (err) { + return err; + } + + memset((uint8_t*)gbuffer + diff, 0, gsize - diff); + + return tag + gdiff; + } + } + + return LFS_ERR_NOENT; +} + +static lfs_stag_t lfs_dir_get(lfs_t *lfs, const lfs_mdir_t *dir, + lfs_tag_t gmask, lfs_tag_t gtag, void *buffer) { + return lfs_dir_getslice(lfs, dir, + gmask, gtag, + 0, buffer, lfs_tag_size(gtag)); +} + +static int lfs_dir_getread(lfs_t *lfs, const lfs_mdir_t *dir, + const lfs_cache_t *pcache, lfs_cache_t *rcache, lfs_size_t hint, + lfs_tag_t gmask, lfs_tag_t gtag, + lfs_off_t off, void *buffer, lfs_size_t size) { + uint8_t *data = buffer; + if (off+size > lfs->cfg->block_size) { + return LFS_ERR_CORRUPT; + } + + while (size > 0) { + lfs_size_t diff = size; + + if (pcache && pcache->block == LFS_BLOCK_INLINE && + off < pcache->off + pcache->size) { + if (off >= pcache->off) { + // is already in pcache? + diff = lfs_min(diff, pcache->size - (off-pcache->off)); + memcpy(data, &pcache->buffer[off-pcache->off], diff); + + data += diff; + off += diff; + size -= diff; + continue; + } + + // pcache takes priority + diff = lfs_min(diff, pcache->off-off); + } + + if (rcache->block == LFS_BLOCK_INLINE && + off < rcache->off + rcache->size) { + if (off >= rcache->off) { + // is already in rcache? + diff = lfs_min(diff, rcache->size - (off-rcache->off)); + memcpy(data, &rcache->buffer[off-rcache->off], diff); + + data += diff; + off += diff; + size -= diff; + continue; + } + + // rcache takes priority + diff = lfs_min(diff, rcache->off-off); + } + + // load to cache, first condition can no longer fail + rcache->block = LFS_BLOCK_INLINE; + rcache->off = lfs_aligndown(off, lfs->cfg->read_size); + rcache->size = lfs_min(lfs_alignup(off+hint, lfs->cfg->read_size), + lfs->cfg->cache_size); + int err = lfs_dir_getslice(lfs, dir, gmask, gtag, + rcache->off, rcache->buffer, rcache->size); + if (err < 0) { + return err; + } + } + + return 0; +} + +#ifndef LFS_READONLY +static int lfs_dir_traverse_filter(void *p, + lfs_tag_t tag, const void *buffer) { + lfs_tag_t *filtertag = p; + (void)buffer; + + // which mask depends on unique bit in tag structure + uint32_t mask = (tag & LFS_MKTAG(0x100, 0, 0)) + ? LFS_MKTAG(0x7ff, 0x3ff, 0) + : LFS_MKTAG(0x700, 0x3ff, 0); + + // check for redundancy + if ((mask & tag) == (mask & *filtertag) || + lfs_tag_isdelete(*filtertag) || + (LFS_MKTAG(0x7ff, 0x3ff, 0) & tag) == ( + LFS_MKTAG(LFS_TYPE_DELETE, 0, 0) | + (LFS_MKTAG(0, 0x3ff, 0) & *filtertag))) { + *filtertag = LFS_MKTAG(LFS_FROM_NOOP, 0, 0); + return true; + } + + // check if we need to adjust for created/deleted tags + if (lfs_tag_type1(tag) == LFS_TYPE_SPLICE && + lfs_tag_id(tag) <= lfs_tag_id(*filtertag)) { + *filtertag += LFS_MKTAG(0, lfs_tag_splice(tag), 0); + } + + return false; +} +#endif + +#ifndef LFS_READONLY +// maximum recursive depth of lfs_dir_traverse, the deepest call: +// +// traverse with commit +// '-> traverse with move +// '-> traverse with filter +// +#define LFS_DIR_TRAVERSE_DEPTH 3 + +struct lfs_dir_traverse { + const lfs_mdir_t *dir; + lfs_off_t off; + lfs_tag_t ptag; + const struct lfs_mattr *attrs; + int attrcount; + + lfs_tag_t tmask; + lfs_tag_t ttag; + uint16_t begin; + uint16_t end; + int16_t diff; + + int (*cb)(void *data, lfs_tag_t tag, const void *buffer); + void *data; + + lfs_tag_t tag; + const void *buffer; + struct lfs_diskoff disk; +}; + +static int lfs_dir_traverse(lfs_t *lfs, + const lfs_mdir_t *dir, lfs_off_t off, lfs_tag_t ptag, + const struct lfs_mattr *attrs, int attrcount, + lfs_tag_t tmask, lfs_tag_t ttag, + uint16_t begin, uint16_t end, int16_t diff, + int (*cb)(void *data, lfs_tag_t tag, const void *buffer), void *data) { + // This function in inherently recursive, but bounded. To allow tool-based + // analysis without unnecessary code-cost we use an explicit stack + struct lfs_dir_traverse stack[LFS_DIR_TRAVERSE_DEPTH-1]; + unsigned sp = 0; + int res; + + // iterate over directory and attrs + lfs_tag_t tag; + const void *buffer; + struct lfs_diskoff disk = {0}; + while (true) { + { + if (off+lfs_tag_dsize(ptag) < dir->off) { + off += lfs_tag_dsize(ptag); + int err = lfs_bd_read(lfs, + NULL, &lfs->rcache, sizeof(tag), + dir->pair[0], off, &tag, sizeof(tag)); + if (err) { + return err; + } + + tag = (lfs_frombe32(tag) ^ ptag) | 0x80000000; + disk.block = dir->pair[0]; + disk.off = off+sizeof(lfs_tag_t); + buffer = &disk; + ptag = tag; + } else if (attrcount > 0) { + tag = attrs[0].tag; + buffer = attrs[0].buffer; + attrs += 1; + attrcount -= 1; + } else { + // finished traversal, pop from stack? + res = 0; + break; + } + + // do we need to filter? + lfs_tag_t mask = LFS_MKTAG(0x7ff, 0, 0); + if ((mask & tmask & tag) != (mask & tmask & ttag)) { + continue; + } + + if (lfs_tag_id(tmask) != 0) { + LFS_ASSERT(sp < LFS_DIR_TRAVERSE_DEPTH); + // recurse, scan for duplicates, and update tag based on + // creates/deletes + stack[sp] = (struct lfs_dir_traverse){ + .dir = dir, + .off = off, + .ptag = ptag, + .attrs = attrs, + .attrcount = attrcount, + .tmask = tmask, + .ttag = ttag, + .begin = begin, + .end = end, + .diff = diff, + .cb = cb, + .data = data, + .tag = tag, + .buffer = buffer, + .disk = disk, + }; + sp += 1; + + tmask = 0; + ttag = 0; + begin = 0; + end = 0; + diff = 0; + cb = lfs_dir_traverse_filter; + data = &stack[sp-1].tag; + continue; + } + } + +popped: + // in filter range? + if (lfs_tag_id(tmask) != 0 && + !(lfs_tag_id(tag) >= begin && lfs_tag_id(tag) < end)) { + continue; + } + + // handle special cases for mcu-side operations + if (lfs_tag_type3(tag) == LFS_FROM_NOOP) { + // do nothing + } else if (lfs_tag_type3(tag) == LFS_FROM_MOVE) { + // Without this condition, lfs_dir_traverse can exhibit an + // extremely expensive O(n^3) of nested loops when renaming. + // This happens because lfs_dir_traverse tries to filter tags by + // the tags in the source directory, triggering a second + // lfs_dir_traverse with its own filter operation. + // + // traverse with commit + // '-> traverse with filter + // '-> traverse with move + // '-> traverse with filter + // + // However we don't actually care about filtering the second set of + // tags, since duplicate tags have no effect when filtering. + // + // This check skips this unnecessary recursive filtering explicitly, + // reducing this runtime from O(n^3) to O(n^2). + if (cb == lfs_dir_traverse_filter) { + continue; + } + + // recurse into move + stack[sp] = (struct lfs_dir_traverse){ + .dir = dir, + .off = off, + .ptag = ptag, + .attrs = attrs, + .attrcount = attrcount, + .tmask = tmask, + .ttag = ttag, + .begin = begin, + .end = end, + .diff = diff, + .cb = cb, + .data = data, + .tag = LFS_MKTAG(LFS_FROM_NOOP, 0, 0), + }; + sp += 1; + + uint16_t fromid = lfs_tag_size(tag); + uint16_t toid = lfs_tag_id(tag); + dir = buffer; + off = 0; + ptag = 0xffffffff; + attrs = NULL; + attrcount = 0; + tmask = LFS_MKTAG(0x600, 0x3ff, 0); + ttag = LFS_MKTAG(LFS_TYPE_STRUCT, 0, 0); + begin = fromid; + end = fromid+1; + diff = toid-fromid+diff; + } else if (lfs_tag_type3(tag) == LFS_FROM_USERATTRS) { + for (unsigned i = 0; i < lfs_tag_size(tag); i++) { + const struct lfs_attr *a = buffer; + res = cb(data, LFS_MKTAG(LFS_TYPE_USERATTR + a[i].type, + lfs_tag_id(tag) + diff, a[i].size), a[i].buffer); + if (res < 0) { + return res; + } + + if (res) { + break; + } + } + } else { + res = cb(data, tag + LFS_MKTAG(0, diff, 0), buffer); + if (res < 0) { + return res; + } + + if (res) { + break; + } + } + } + + if (sp > 0) { + // pop from the stack and return, fortunately all pops share + // a destination + dir = stack[sp-1].dir; + off = stack[sp-1].off; + ptag = stack[sp-1].ptag; + attrs = stack[sp-1].attrs; + attrcount = stack[sp-1].attrcount; + tmask = stack[sp-1].tmask; + ttag = stack[sp-1].ttag; + begin = stack[sp-1].begin; + end = stack[sp-1].end; + diff = stack[sp-1].diff; + cb = stack[sp-1].cb; + data = stack[sp-1].data; + tag = stack[sp-1].tag; + buffer = stack[sp-1].buffer; + disk = stack[sp-1].disk; + sp -= 1; + goto popped; + } else { + return res; + } +} +#endif + +static lfs_stag_t lfs_dir_fetchmatch(lfs_t *lfs, + lfs_mdir_t *dir, const lfs_block_t pair[2], + lfs_tag_t fmask, lfs_tag_t ftag, uint16_t *id, + int (*cb)(void *data, lfs_tag_t tag, const void *buffer), void *data) { + // we can find tag very efficiently during a fetch, since we're already + // scanning the entire directory + lfs_stag_t besttag = -1; + + // if either block address is invalid we return LFS_ERR_CORRUPT here, + // otherwise later writes to the pair could fail + if (lfs->block_count + && (pair[0] >= lfs->block_count || pair[1] >= lfs->block_count)) { + return LFS_ERR_CORRUPT; + } + + // find the block with the most recent revision + uint32_t revs[2] = {0, 0}; + int r = 0; + for (int i = 0; i < 2; i++) { + int err = lfs_bd_read(lfs, + NULL, &lfs->rcache, sizeof(revs[i]), + pair[i], 0, &revs[i], sizeof(revs[i])); + revs[i] = lfs_fromle32(revs[i]); + if (err && err != LFS_ERR_CORRUPT) { + return err; + } + + if (err != LFS_ERR_CORRUPT && + lfs_scmp(revs[i], revs[(i+1)%2]) > 0) { + r = i; + } + } + + dir->pair[0] = pair[(r+0)%2]; + dir->pair[1] = pair[(r+1)%2]; + dir->rev = revs[(r+0)%2]; + dir->off = 0; // nonzero = found some commits + + // now scan tags to fetch the actual dir and find possible match + for (int i = 0; i < 2; i++) { + lfs_off_t off = 0; + lfs_tag_t ptag = 0xffffffff; + + uint16_t tempcount = 0; + lfs_block_t temptail[2] = {LFS_BLOCK_NULL, LFS_BLOCK_NULL}; + bool tempsplit = false; + lfs_stag_t tempbesttag = besttag; + + // assume not erased until proven otherwise + bool maybeerased = false; + bool hasfcrc = false; + struct lfs_fcrc fcrc; + + dir->rev = lfs_tole32(dir->rev); + uint32_t crc = lfs_crc(0xffffffff, &dir->rev, sizeof(dir->rev)); + dir->rev = lfs_fromle32(dir->rev); + + while (true) { + // extract next tag + lfs_tag_t tag; + off += lfs_tag_dsize(ptag); + int err = lfs_bd_read(lfs, + NULL, &lfs->rcache, lfs->cfg->block_size, + dir->pair[0], off, &tag, sizeof(tag)); + if (err) { + if (err == LFS_ERR_CORRUPT) { + // can't continue? + break; + } + return err; + } + + crc = lfs_crc(crc, &tag, sizeof(tag)); + tag = lfs_frombe32(tag) ^ ptag; + + // next commit not yet programmed? + if (!lfs_tag_isvalid(tag)) { + // we only might be erased if the last tag was a crc + maybeerased = (lfs_tag_type2(ptag) == LFS_TYPE_CCRC); + break; + // out of range? + } else if (off + lfs_tag_dsize(tag) > lfs->cfg->block_size) { + break; + } + + ptag = tag; + + if (lfs_tag_type2(tag) == LFS_TYPE_CCRC) { + // check the crc attr + uint32_t dcrc; + err = lfs_bd_read(lfs, + NULL, &lfs->rcache, lfs->cfg->block_size, + dir->pair[0], off+sizeof(tag), &dcrc, sizeof(dcrc)); + if (err) { + if (err == LFS_ERR_CORRUPT) { + break; + } + return err; + } + dcrc = lfs_fromle32(dcrc); + + if (crc != dcrc) { + break; + } + + // reset the next bit if we need to + ptag ^= (lfs_tag_t)(lfs_tag_chunk(tag) & 1U) << 31; + + // toss our crc into the filesystem seed for + // pseudorandom numbers, note we use another crc here + // as a collection function because it is sufficiently + // random and convenient + lfs->seed = lfs_crc(lfs->seed, &crc, sizeof(crc)); + + // update with what's found so far + besttag = tempbesttag; + dir->off = off + lfs_tag_dsize(tag); + dir->etag = ptag; + dir->count = tempcount; + dir->tail[0] = temptail[0]; + dir->tail[1] = temptail[1]; + dir->split = tempsplit; + + // reset crc, hasfcrc + crc = 0xffffffff; + continue; + } + + // crc the entry first, hopefully leaving it in the cache + err = lfs_bd_crc(lfs, + NULL, &lfs->rcache, lfs->cfg->block_size, + dir->pair[0], off+sizeof(tag), + lfs_tag_dsize(tag)-sizeof(tag), &crc); + if (err) { + if (err == LFS_ERR_CORRUPT) { + break; + } + return err; + } + + // directory modification tags? + if (lfs_tag_type1(tag) == LFS_TYPE_NAME) { + // increase count of files if necessary + if (lfs_tag_id(tag) >= tempcount) { + tempcount = lfs_tag_id(tag) + 1; + } + } else if (lfs_tag_type1(tag) == LFS_TYPE_SPLICE) { + tempcount += lfs_tag_splice(tag); + + if (tag == (LFS_MKTAG(LFS_TYPE_DELETE, 0, 0) | + (LFS_MKTAG(0, 0x3ff, 0) & tempbesttag))) { + tempbesttag |= 0x80000000; + } else if (tempbesttag != -1 && + lfs_tag_id(tag) <= lfs_tag_id(tempbesttag)) { + tempbesttag += LFS_MKTAG(0, lfs_tag_splice(tag), 0); + } + } else if (lfs_tag_type1(tag) == LFS_TYPE_TAIL) { + tempsplit = (lfs_tag_chunk(tag) & 1); + + err = lfs_bd_read(lfs, + NULL, &lfs->rcache, lfs->cfg->block_size, + dir->pair[0], off+sizeof(tag), &temptail, 8); + if (err) { + if (err == LFS_ERR_CORRUPT) { + break; + } + return err; + } + lfs_pair_fromle32(temptail); + } else if (lfs_tag_type3(tag) == LFS_TYPE_FCRC) { + err = lfs_bd_read(lfs, + NULL, &lfs->rcache, lfs->cfg->block_size, + dir->pair[0], off+sizeof(tag), + &fcrc, sizeof(fcrc)); + if (err) { + if (err == LFS_ERR_CORRUPT) { + break; + } + } + + lfs_fcrc_fromle32(&fcrc); + hasfcrc = true; + } + + // found a match for our fetcher? + if ((fmask & tag) == (fmask & ftag)) { + int res = cb(data, tag, &(struct lfs_diskoff){ + dir->pair[0], off+sizeof(tag)}); + if (res < 0) { + if (res == LFS_ERR_CORRUPT) { + break; + } + return res; + } + + if (res == LFS_CMP_EQ) { + // found a match + tempbesttag = tag; + } else if ((LFS_MKTAG(0x7ff, 0x3ff, 0) & tag) == + (LFS_MKTAG(0x7ff, 0x3ff, 0) & tempbesttag)) { + // found an identical tag, but contents didn't match + // this must mean that our besttag has been overwritten + tempbesttag = -1; + } else if (res == LFS_CMP_GT && + lfs_tag_id(tag) <= lfs_tag_id(tempbesttag)) { + // found a greater match, keep track to keep things sorted + tempbesttag = tag | 0x80000000; + } + } + } + + // found no valid commits? + if (dir->off == 0) { + // try the other block? + lfs_pair_swap(dir->pair); + dir->rev = revs[(r+1)%2]; + continue; + } + + // did we end on a valid commit? we may have an erased block + dir->erased = false; + if (maybeerased && dir->off % lfs->cfg->prog_size == 0) { + #ifdef LFS_MULTIVERSION + // note versions < lfs2.1 did not have fcrc tags, if + // we're < lfs2.1 treat missing fcrc as erased data + // + // we don't strictly need to do this, but otherwise writing + // to lfs2.0 disks becomes very inefficient + if (lfs_fs_disk_version(lfs) < 0x00020001) { + dir->erased = true; + + } else + #endif + if (hasfcrc) { + // check for an fcrc matching the next prog's erased state, if + // this failed most likely a previous prog was interrupted, we + // need a new erase + uint32_t fcrc_ = 0xffffffff; + int err = lfs_bd_crc(lfs, + NULL, &lfs->rcache, lfs->cfg->block_size, + dir->pair[0], dir->off, fcrc.size, &fcrc_); + if (err && err != LFS_ERR_CORRUPT) { + return err; + } + + // found beginning of erased part? + dir->erased = (fcrc_ == fcrc.crc); + } + } + + // synthetic move + if (lfs_gstate_hasmovehere(&lfs->gdisk, dir->pair)) { + if (lfs_tag_id(lfs->gdisk.tag) == lfs_tag_id(besttag)) { + besttag |= 0x80000000; + } else if (besttag != -1 && + lfs_tag_id(lfs->gdisk.tag) < lfs_tag_id(besttag)) { + besttag -= LFS_MKTAG(0, 1, 0); + } + } + + // found tag? or found best id? + if (id) { + *id = lfs_min(lfs_tag_id(besttag), dir->count); + } + + if (lfs_tag_isvalid(besttag)) { + return besttag; + } else if (lfs_tag_id(besttag) < dir->count) { + return LFS_ERR_NOENT; + } else { + return 0; + } + } + + LFS_ERROR("Corrupted dir pair at {0x%"PRIx32", 0x%"PRIx32"}", + dir->pair[0], dir->pair[1]); + return LFS_ERR_CORRUPT; +} + +static int lfs_dir_fetch(lfs_t *lfs, + lfs_mdir_t *dir, const lfs_block_t pair[2]) { + // note, mask=-1, tag=-1 can never match a tag since this + // pattern has the invalid bit set + return (int)lfs_dir_fetchmatch(lfs, dir, pair, + (lfs_tag_t)-1, (lfs_tag_t)-1, NULL, NULL, NULL); +} + +static int lfs_dir_getgstate(lfs_t *lfs, const lfs_mdir_t *dir, + lfs_gstate_t *gstate) { + lfs_gstate_t temp; + lfs_stag_t res = lfs_dir_get(lfs, dir, LFS_MKTAG(0x7ff, 0, 0), + LFS_MKTAG(LFS_TYPE_MOVESTATE, 0, sizeof(temp)), &temp); + if (res < 0 && res != LFS_ERR_NOENT) { + return res; + } + + if (res != LFS_ERR_NOENT) { + // xor together to find resulting gstate + lfs_gstate_fromle32(&temp); + lfs_gstate_xor(gstate, &temp); + } + + return 0; +} + +static int lfs_dir_getinfo(lfs_t *lfs, lfs_mdir_t *dir, + uint16_t id, struct lfs_info *info) { + if (id == 0x3ff) { + // special case for root + strcpy(info->name, "/"); + info->type = LFS_TYPE_DIR; + return 0; + } + + lfs_stag_t tag = lfs_dir_get(lfs, dir, LFS_MKTAG(0x780, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_NAME, id, lfs->name_max+1), info->name); + if (tag < 0) { + return (int)tag; + } + + info->type = lfs_tag_type3(tag); + + struct lfs_ctz ctz; + tag = lfs_dir_get(lfs, dir, LFS_MKTAG(0x700, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_STRUCT, id, sizeof(ctz)), &ctz); + if (tag < 0) { + return (int)tag; + } + lfs_ctz_fromle32(&ctz); + + if (lfs_tag_type3(tag) == LFS_TYPE_CTZSTRUCT) { + info->size = ctz.size; + } else if (lfs_tag_type3(tag) == LFS_TYPE_INLINESTRUCT) { + info->size = lfs_tag_size(tag); + } + + return 0; +} + +struct lfs_dir_find_match { + lfs_t *lfs; + const void *name; + lfs_size_t size; +}; + +static int lfs_dir_find_match(void *data, + lfs_tag_t tag, const void *buffer) { + struct lfs_dir_find_match *name = data; + lfs_t *lfs = name->lfs; + const struct lfs_diskoff *disk = buffer; + + // compare with disk + lfs_size_t diff = lfs_min(name->size, lfs_tag_size(tag)); + int res = lfs_bd_cmp(lfs, + NULL, &lfs->rcache, diff, + disk->block, disk->off, name->name, diff); + if (res != LFS_CMP_EQ) { + return res; + } + + // only equal if our size is still the same + if (name->size != lfs_tag_size(tag)) { + return (name->size < lfs_tag_size(tag)) ? LFS_CMP_LT : LFS_CMP_GT; + } + + // found a match! + return LFS_CMP_EQ; +} + +static lfs_stag_t lfs_dir_find(lfs_t *lfs, lfs_mdir_t *dir, + const char **path, uint16_t *id) { + // we reduce path to a single name if we can find it + const char *name = *path; + if (id) { + *id = 0x3ff; + } + + // default to root dir + lfs_stag_t tag = LFS_MKTAG(LFS_TYPE_DIR, 0x3ff, 0); + dir->tail[0] = lfs->root[0]; + dir->tail[1] = lfs->root[1]; + + while (true) { +nextname: + // skip slashes + name += strspn(name, "/"); + lfs_size_t namelen = strcspn(name, "/"); + + // skip '.' and root '..' + if ((namelen == 1 && memcmp(name, ".", 1) == 0) || + (namelen == 2 && memcmp(name, "..", 2) == 0)) { + name += namelen; + goto nextname; + } + + // skip if matched by '..' in name + const char *suffix = name + namelen; + lfs_size_t sufflen; + int depth = 1; + while (true) { + suffix += strspn(suffix, "/"); + sufflen = strcspn(suffix, "/"); + if (sufflen == 0) { + break; + } + + if (sufflen == 2 && memcmp(suffix, "..", 2) == 0) { + depth -= 1; + if (depth == 0) { + name = suffix + sufflen; + goto nextname; + } + } else { + depth += 1; + } + + suffix += sufflen; + } + + // found path + if (name[0] == '\0') { + return tag; + } + + // update what we've found so far + *path = name; + + // only continue if we hit a directory + if (lfs_tag_type3(tag) != LFS_TYPE_DIR) { + return LFS_ERR_NOTDIR; + } + + // grab the entry data + if (lfs_tag_id(tag) != 0x3ff) { + lfs_stag_t res = lfs_dir_get(lfs, dir, LFS_MKTAG(0x700, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_STRUCT, lfs_tag_id(tag), 8), dir->tail); + if (res < 0) { + return res; + } + lfs_pair_fromle32(dir->tail); + } + + // find entry matching name + while (true) { + tag = lfs_dir_fetchmatch(lfs, dir, dir->tail, + LFS_MKTAG(0x780, 0, 0), + LFS_MKTAG(LFS_TYPE_NAME, 0, namelen), + // are we last name? + (strchr(name, '/') == NULL) ? id : NULL, + lfs_dir_find_match, &(struct lfs_dir_find_match){ + lfs, name, namelen}); + if (tag < 0) { + return tag; + } + + if (tag) { + break; + } + + if (!dir->split) { + return LFS_ERR_NOENT; + } + } + + // to next name + name += namelen; + } +} + +// commit logic +struct lfs_commit { + lfs_block_t block; + lfs_off_t off; + lfs_tag_t ptag; + uint32_t crc; + + lfs_off_t begin; + lfs_off_t end; +}; + +#ifndef LFS_READONLY +static int lfs_dir_commitprog(lfs_t *lfs, struct lfs_commit *commit, + const void *buffer, lfs_size_t size) { + int err = lfs_bd_prog(lfs, + &lfs->pcache, &lfs->rcache, false, + commit->block, commit->off , + (const uint8_t*)buffer, size); + if (err) { + return err; + } + + commit->crc = lfs_crc(commit->crc, buffer, size); + commit->off += size; + return 0; +} +#endif + +#ifndef LFS_READONLY +static int lfs_dir_commitattr(lfs_t *lfs, struct lfs_commit *commit, + lfs_tag_t tag, const void *buffer) { + // check if we fit + lfs_size_t dsize = lfs_tag_dsize(tag); + if (commit->off + dsize > commit->end) { + return LFS_ERR_NOSPC; + } + + // write out tag + lfs_tag_t ntag = lfs_tobe32((tag & 0x7fffffff) ^ commit->ptag); + int err = lfs_dir_commitprog(lfs, commit, &ntag, sizeof(ntag)); + if (err) { + return err; + } + + if (!(tag & 0x80000000)) { + // from memory + err = lfs_dir_commitprog(lfs, commit, buffer, dsize-sizeof(tag)); + if (err) { + return err; + } + } else { + // from disk + const struct lfs_diskoff *disk = buffer; + for (lfs_off_t i = 0; i < dsize-sizeof(tag); i++) { + // rely on caching to make this efficient + uint8_t dat; + err = lfs_bd_read(lfs, + NULL, &lfs->rcache, dsize-sizeof(tag)-i, + disk->block, disk->off+i, &dat, 1); + if (err) { + return err; + } + + err = lfs_dir_commitprog(lfs, commit, &dat, 1); + if (err) { + return err; + } + } + } + + commit->ptag = tag & 0x7fffffff; + return 0; +} +#endif + +#ifndef LFS_READONLY + +static int lfs_dir_commitcrc(lfs_t *lfs, struct lfs_commit *commit) { + // align to program units + // + // this gets a bit complex as we have two types of crcs: + // - 5-word crc with fcrc to check following prog (middle of block) + // - 2-word crc with no following prog (end of block) + const lfs_off_t end = lfs_alignup( + lfs_min(commit->off + 5*sizeof(uint32_t), lfs->cfg->block_size), + lfs->cfg->prog_size); + + lfs_off_t off1 = 0; + uint32_t crc1 = 0; + + // create crc tags to fill up remainder of commit, note that + // padding is not crced, which lets fetches skip padding but + // makes committing a bit more complicated + while (commit->off < end) { + lfs_off_t noff = ( + lfs_min(end - (commit->off+sizeof(lfs_tag_t)), 0x3fe) + + (commit->off+sizeof(lfs_tag_t))); + // too large for crc tag? need padding commits + if (noff < end) { + noff = lfs_min(noff, end - 5*sizeof(uint32_t)); + } + + // space for fcrc? + uint8_t eperturb = (uint8_t)-1; + if (noff >= end && noff <= lfs->cfg->block_size - lfs->cfg->prog_size) { + // first read the leading byte, this always contains a bit + // we can perturb to avoid writes that don't change the fcrc + int err = lfs_bd_read(lfs, + NULL, &lfs->rcache, lfs->cfg->prog_size, + commit->block, noff, &eperturb, 1); + if (err && err != LFS_ERR_CORRUPT) { + return err; + } + + #ifdef LFS_MULTIVERSION + // unfortunately fcrcs break mdir fetching < lfs2.1, so only write + // these if we're a >= lfs2.1 filesystem + if (lfs_fs_disk_version(lfs) <= 0x00020000) { + // don't write fcrc + } else + #endif + { + // find the expected fcrc, don't bother avoiding a reread + // of the eperturb, it should still be in our cache + struct lfs_fcrc fcrc = { + .size = lfs->cfg->prog_size, + .crc = 0xffffffff + }; + err = lfs_bd_crc(lfs, + NULL, &lfs->rcache, lfs->cfg->prog_size, + commit->block, noff, fcrc.size, &fcrc.crc); + if (err && err != LFS_ERR_CORRUPT) { + return err; + } + + lfs_fcrc_tole32(&fcrc); + err = lfs_dir_commitattr(lfs, commit, + LFS_MKTAG(LFS_TYPE_FCRC, 0x3ff, sizeof(struct lfs_fcrc)), + &fcrc); + if (err) { + return err; + } + } + } + + // build commit crc + struct { + lfs_tag_t tag; + uint32_t crc; + } ccrc; + lfs_tag_t ntag = LFS_MKTAG( + LFS_TYPE_CCRC + (((uint8_t)~eperturb) >> 7), 0x3ff, + noff - (commit->off+sizeof(lfs_tag_t))); + ccrc.tag = lfs_tobe32(ntag ^ commit->ptag); + commit->crc = lfs_crc(commit->crc, &ccrc.tag, sizeof(lfs_tag_t)); + ccrc.crc = lfs_tole32(commit->crc); + + int err = lfs_bd_prog(lfs, + &lfs->pcache, &lfs->rcache, false, + commit->block, commit->off, &ccrc, sizeof(ccrc)); + if (err) { + return err; + } + + // keep track of non-padding checksum to verify + if (off1 == 0) { + off1 = commit->off + sizeof(lfs_tag_t); + crc1 = commit->crc; + } + + commit->off = noff; + // perturb valid bit? + commit->ptag = ntag ^ ((0x80UL & ~eperturb) << 24); + // reset crc for next commit + commit->crc = 0xffffffff; + + // manually flush here since we don't prog the padding, this confuses + // the caching layer + if (noff >= end || noff >= lfs->pcache.off + lfs->cfg->cache_size) { + // flush buffers + int err = lfs_bd_sync(lfs, &lfs->pcache, &lfs->rcache, false); + if (err) { + return err; + } + } + } + + // successful commit, check checksums to make sure + // + // note that we don't need to check padding commits, worst + // case if they are corrupted we would have had to compact anyways + lfs_off_t off = commit->begin; + uint32_t crc = 0xffffffff; + int err = lfs_bd_crc(lfs, + NULL, &lfs->rcache, off1+sizeof(uint32_t), + commit->block, off, off1-off, &crc); + if (err) { + return err; + } + + // check non-padding commits against known crc + if (crc != crc1) { + return LFS_ERR_CORRUPT; + } + + // make sure to check crc in case we happen to pick + // up an unrelated crc (frozen block?) + err = lfs_bd_crc(lfs, + NULL, &lfs->rcache, sizeof(uint32_t), + commit->block, off1, sizeof(uint32_t), &crc); + if (err) { + return err; + } + + if (crc != 0) { + return LFS_ERR_CORRUPT; + } + + return 0; +} +#endif + +#ifndef LFS_READONLY +static int lfs_dir_alloc(lfs_t *lfs, lfs_mdir_t *dir) { + // allocate pair of dir blocks (backwards, so we write block 1 first) + for (int i = 0; i < 2; i++) { + int err = lfs_alloc(lfs, &dir->pair[(i+1)%2]); + if (err) { + return err; + } + } + + // zero for reproducibility in case initial block is unreadable + dir->rev = 0; + + // rather than clobbering one of the blocks we just pretend + // the revision may be valid + int err = lfs_bd_read(lfs, + NULL, &lfs->rcache, sizeof(dir->rev), + dir->pair[0], 0, &dir->rev, sizeof(dir->rev)); + dir->rev = lfs_fromle32(dir->rev); + if (err && err != LFS_ERR_CORRUPT) { + return err; + } + + // to make sure we don't immediately evict, align the new revision count + // to our block_cycles modulus, see lfs_dir_compact for why our modulus + // is tweaked this way + if (lfs->cfg->block_cycles > 0) { + dir->rev = lfs_alignup(dir->rev, ((lfs->cfg->block_cycles+1)|1)); + } + + // set defaults + dir->off = sizeof(dir->rev); + dir->etag = 0xffffffff; + dir->count = 0; + dir->tail[0] = LFS_BLOCK_NULL; + dir->tail[1] = LFS_BLOCK_NULL; + dir->erased = false; + dir->split = false; + + // don't write out yet, let caller take care of that + return 0; +} +#endif + +#ifndef LFS_READONLY +static int lfs_dir_drop(lfs_t *lfs, lfs_mdir_t *dir, lfs_mdir_t *tail) { + // steal state + int err = lfs_dir_getgstate(lfs, tail, &lfs->gdelta); + if (err) { + return err; + } + + // steal tail + lfs_pair_tole32(tail->tail); + err = lfs_dir_commit(lfs, dir, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_TAIL + tail->split, 0x3ff, 8), tail->tail})); + lfs_pair_fromle32(tail->tail); + if (err) { + return err; + } + + return 0; +} +#endif + +#ifndef LFS_READONLY +static int lfs_dir_split(lfs_t *lfs, + lfs_mdir_t *dir, const struct lfs_mattr *attrs, int attrcount, + lfs_mdir_t *source, uint16_t split, uint16_t end) { + // create tail metadata pair + lfs_mdir_t tail; + int err = lfs_dir_alloc(lfs, &tail); + if (err) { + return err; + } + + tail.split = dir->split; + tail.tail[0] = dir->tail[0]; + tail.tail[1] = dir->tail[1]; + + // note we don't care about LFS_OK_RELOCATED + int res = lfs_dir_compact(lfs, &tail, attrs, attrcount, source, split, end); + if (res < 0) { + return res; + } + + dir->tail[0] = tail.pair[0]; + dir->tail[1] = tail.pair[1]; + dir->split = true; + + // update root if needed + if (lfs_pair_cmp(dir->pair, lfs->root) == 0 && split == 0) { + lfs->root[0] = tail.pair[0]; + lfs->root[1] = tail.pair[1]; + } + + return 0; +} +#endif + +#ifndef LFS_READONLY +static int lfs_dir_commit_size(void *p, lfs_tag_t tag, const void *buffer) { + lfs_size_t *size = p; + (void)buffer; + + *size += lfs_tag_dsize(tag); + return 0; +} +#endif + +#ifndef LFS_READONLY +struct lfs_dir_commit_commit { + lfs_t *lfs; + struct lfs_commit *commit; +}; +#endif + +#ifndef LFS_READONLY +static int lfs_dir_commit_commit(void *p, lfs_tag_t tag, const void *buffer) { + struct lfs_dir_commit_commit *commit = p; + return lfs_dir_commitattr(commit->lfs, commit->commit, tag, buffer); +} +#endif + +#ifndef LFS_READONLY +static bool lfs_dir_needsrelocation(lfs_t *lfs, lfs_mdir_t *dir) { + // If our revision count == n * block_cycles, we should force a relocation, + // this is how littlefs wear-levels at the metadata-pair level. Note that we + // actually use (block_cycles+1)|1, this is to avoid two corner cases: + // 1. block_cycles = 1, which would prevent relocations from terminating + // 2. block_cycles = 2n, which, due to aliasing, would only ever relocate + // one metadata block in the pair, effectively making this useless + return (lfs->cfg->block_cycles > 0 + && ((dir->rev + 1) % ((lfs->cfg->block_cycles+1)|1) == 0)); +} +#endif + +#ifndef LFS_READONLY +static int lfs_dir_compact(lfs_t *lfs, + lfs_mdir_t *dir, const struct lfs_mattr *attrs, int attrcount, + lfs_mdir_t *source, uint16_t begin, uint16_t end) { + // save some state in case block is bad + bool relocated = false; + bool tired = lfs_dir_needsrelocation(lfs, dir); + + // increment revision count + dir->rev += 1; + + // do not proactively relocate blocks during migrations, this + // can cause a number of failure states such: clobbering the + // v1 superblock if we relocate root, and invalidating directory + // pointers if we relocate the head of a directory. On top of + // this, relocations increase the overall complexity of + // lfs_migration, which is already a delicate operation. +#ifdef LFS_MIGRATE + if (lfs->lfs1) { + tired = false; + } +#endif + + if (tired && lfs_pair_cmp(dir->pair, (const lfs_block_t[2]){0, 1}) != 0) { + // we're writing too much, time to relocate + goto relocate; + } + + // begin loop to commit compaction to blocks until a compact sticks + while (true) { + { + // setup commit state + struct lfs_commit commit = { + .block = dir->pair[1], + .off = 0, + .ptag = 0xffffffff, + .crc = 0xffffffff, + + .begin = 0, + .end = (lfs->cfg->metadata_max ? + lfs->cfg->metadata_max : lfs->cfg->block_size) - 8, + }; + + // erase block to write to + int err = lfs_bd_erase(lfs, dir->pair[1]); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + + // write out header + dir->rev = lfs_tole32(dir->rev); + err = lfs_dir_commitprog(lfs, &commit, + &dir->rev, sizeof(dir->rev)); + dir->rev = lfs_fromle32(dir->rev); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + + // traverse the directory, this time writing out all unique tags + err = lfs_dir_traverse(lfs, + source, 0, 0xffffffff, attrs, attrcount, + LFS_MKTAG(0x400, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_NAME, 0, 0), + begin, end, -begin, + lfs_dir_commit_commit, &(struct lfs_dir_commit_commit){ + lfs, &commit}); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + + // commit tail, which may be new after last size check + if (!lfs_pair_isnull(dir->tail)) { + lfs_pair_tole32(dir->tail); + err = lfs_dir_commitattr(lfs, &commit, + LFS_MKTAG(LFS_TYPE_TAIL + dir->split, 0x3ff, 8), + dir->tail); + lfs_pair_fromle32(dir->tail); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + } + + // bring over gstate? + lfs_gstate_t delta = {0}; + if (!relocated) { + lfs_gstate_xor(&delta, &lfs->gdisk); + lfs_gstate_xor(&delta, &lfs->gstate); + } + lfs_gstate_xor(&delta, &lfs->gdelta); + delta.tag &= ~LFS_MKTAG(0, 0, 0x3ff); + + err = lfs_dir_getgstate(lfs, dir, &delta); + if (err) { + return err; + } + + if (!lfs_gstate_iszero(&delta)) { + lfs_gstate_tole32(&delta); + err = lfs_dir_commitattr(lfs, &commit, + LFS_MKTAG(LFS_TYPE_MOVESTATE, 0x3ff, + sizeof(delta)), &delta); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + } + + // complete commit with crc + err = lfs_dir_commitcrc(lfs, &commit); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + + // successful compaction, swap dir pair to indicate most recent + LFS_ASSERT(commit.off % lfs->cfg->prog_size == 0); + lfs_pair_swap(dir->pair); + dir->count = end - begin; + dir->off = commit.off; + dir->etag = commit.ptag; + // update gstate + lfs->gdelta = (lfs_gstate_t){0}; + if (!relocated) { + lfs->gdisk = lfs->gstate; + } + } + break; + +relocate: + // commit was corrupted, drop caches and prepare to relocate block + relocated = true; + lfs_cache_drop(lfs, &lfs->pcache); + if (!tired) { + LFS_DEBUG("Bad block at 0x%"PRIx32, dir->pair[1]); + } + + // can't relocate superblock, filesystem is now frozen + if (lfs_pair_cmp(dir->pair, (const lfs_block_t[2]){0, 1}) == 0) { + LFS_WARN("Superblock 0x%"PRIx32" has become unwritable", + dir->pair[1]); + return LFS_ERR_NOSPC; + } + + // relocate half of pair + int err = lfs_alloc(lfs, &dir->pair[1]); + if (err && (err != LFS_ERR_NOSPC || !tired)) { + return err; + } + + tired = false; + continue; + } + + return relocated ? LFS_OK_RELOCATED : 0; +} +#endif + +#ifndef LFS_READONLY +static int lfs_dir_splittingcompact(lfs_t *lfs, lfs_mdir_t *dir, + const struct lfs_mattr *attrs, int attrcount, + lfs_mdir_t *source, uint16_t begin, uint16_t end) { + while (true) { + // find size of first split, we do this by halving the split until + // the metadata is guaranteed to fit + // + // Note that this isn't a true binary search, we never increase the + // split size. This may result in poorly distributed metadata but isn't + // worth the extra code size or performance hit to fix. + lfs_size_t split = begin; + while (end - split > 1) { + lfs_size_t size = 0; + int err = lfs_dir_traverse(lfs, + source, 0, 0xffffffff, attrs, attrcount, + LFS_MKTAG(0x400, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_NAME, 0, 0), + split, end, -split, + lfs_dir_commit_size, &size); + if (err) { + return err; + } + + // space is complicated, we need room for: + // + // - tail: 4+2*4 = 12 bytes + // - gstate: 4+3*4 = 16 bytes + // - move delete: 4 = 4 bytes + // - crc: 4+4 = 8 bytes + // total = 40 bytes + // + // And we cap at half a block to avoid degenerate cases with + // nearly-full metadata blocks. + // + if (end - split < 0xff + && size <= lfs_min( + lfs->cfg->block_size - 40, + lfs_alignup( + (lfs->cfg->metadata_max + ? lfs->cfg->metadata_max + : lfs->cfg->block_size)/2, + lfs->cfg->prog_size))) { + break; + } + + split = split + ((end - split) / 2); + } + + if (split == begin) { + // no split needed + break; + } + + // split into two metadata pairs and continue + int err = lfs_dir_split(lfs, dir, attrs, attrcount, + source, split, end); + if (err && err != LFS_ERR_NOSPC) { + return err; + } + + if (err) { + // we can't allocate a new block, try to compact with degraded + // performance + LFS_WARN("Unable to split {0x%"PRIx32", 0x%"PRIx32"}", + dir->pair[0], dir->pair[1]); + break; + } else { + end = split; + } + } + + if (lfs_dir_needsrelocation(lfs, dir) + && lfs_pair_cmp(dir->pair, (const lfs_block_t[2]){0, 1}) == 0) { + // oh no! we're writing too much to the superblock, + // should we expand? + lfs_ssize_t size = lfs_fs_size_(lfs); + if (size < 0) { + return size; + } + + // littlefs cannot reclaim expanded superblocks, so expand cautiously + // + // if our filesystem is more than ~88% full, don't expand, this is + // somewhat arbitrary + if (lfs->block_count - size > lfs->block_count/8) { + LFS_DEBUG("Expanding superblock at rev %"PRIu32, dir->rev); + int err = lfs_dir_split(lfs, dir, attrs, attrcount, + source, begin, end); + if (err && err != LFS_ERR_NOSPC) { + return err; + } + + if (err) { + // welp, we tried, if we ran out of space there's not much + // we can do, we'll error later if we've become frozen + LFS_WARN("Unable to expand superblock"); + } else { + // duplicate the superblock entry into the new superblock + end = 1; + } + } + } + + return lfs_dir_compact(lfs, dir, attrs, attrcount, source, begin, end); +} +#endif + +#ifndef LFS_READONLY +static int lfs_dir_relocatingcommit(lfs_t *lfs, lfs_mdir_t *dir, + const lfs_block_t pair[2], + const struct lfs_mattr *attrs, int attrcount, + lfs_mdir_t *pdir) { + int state = 0; + + // calculate changes to the directory + bool hasdelete = false; + for (int i = 0; i < attrcount; i++) { + if (lfs_tag_type3(attrs[i].tag) == LFS_TYPE_CREATE) { + dir->count += 1; + } else if (lfs_tag_type3(attrs[i].tag) == LFS_TYPE_DELETE) { + LFS_ASSERT(dir->count > 0); + dir->count -= 1; + hasdelete = true; + } else if (lfs_tag_type1(attrs[i].tag) == LFS_TYPE_TAIL) { + dir->tail[0] = ((lfs_block_t*)attrs[i].buffer)[0]; + dir->tail[1] = ((lfs_block_t*)attrs[i].buffer)[1]; + dir->split = (lfs_tag_chunk(attrs[i].tag) & 1); + lfs_pair_fromle32(dir->tail); + } + } + + // should we actually drop the directory block? + if (hasdelete && dir->count == 0) { + LFS_ASSERT(pdir); + int err = lfs_fs_pred(lfs, dir->pair, pdir); + if (err && err != LFS_ERR_NOENT) { + return err; + } + + if (err != LFS_ERR_NOENT && pdir->split) { + state = LFS_OK_DROPPED; + goto fixmlist; + } + } + + if (dir->erased) { + // try to commit + struct lfs_commit commit = { + .block = dir->pair[0], + .off = dir->off, + .ptag = dir->etag, + .crc = 0xffffffff, + + .begin = dir->off, + .end = (lfs->cfg->metadata_max ? + lfs->cfg->metadata_max : lfs->cfg->block_size) - 8, + }; + + // traverse attrs that need to be written out + lfs_pair_tole32(dir->tail); + int err = lfs_dir_traverse(lfs, + dir, dir->off, dir->etag, attrs, attrcount, + 0, 0, 0, 0, 0, + lfs_dir_commit_commit, &(struct lfs_dir_commit_commit){ + lfs, &commit}); + lfs_pair_fromle32(dir->tail); + if (err) { + if (err == LFS_ERR_NOSPC || err == LFS_ERR_CORRUPT) { + goto compact; + } + return err; + } + + // commit any global diffs if we have any + lfs_gstate_t delta = {0}; + lfs_gstate_xor(&delta, &lfs->gstate); + lfs_gstate_xor(&delta, &lfs->gdisk); + lfs_gstate_xor(&delta, &lfs->gdelta); + delta.tag &= ~LFS_MKTAG(0, 0, 0x3ff); + if (!lfs_gstate_iszero(&delta)) { + err = lfs_dir_getgstate(lfs, dir, &delta); + if (err) { + return err; + } + + lfs_gstate_tole32(&delta); + err = lfs_dir_commitattr(lfs, &commit, + LFS_MKTAG(LFS_TYPE_MOVESTATE, 0x3ff, + sizeof(delta)), &delta); + if (err) { + if (err == LFS_ERR_NOSPC || err == LFS_ERR_CORRUPT) { + goto compact; + } + return err; + } + } + + // finalize commit with the crc + err = lfs_dir_commitcrc(lfs, &commit); + if (err) { + if (err == LFS_ERR_NOSPC || err == LFS_ERR_CORRUPT) { + goto compact; + } + return err; + } + + // successful commit, update dir + LFS_ASSERT(commit.off % lfs->cfg->prog_size == 0); + dir->off = commit.off; + dir->etag = commit.ptag; + // and update gstate + lfs->gdisk = lfs->gstate; + lfs->gdelta = (lfs_gstate_t){0}; + + goto fixmlist; + } + +compact: + // fall back to compaction + lfs_cache_drop(lfs, &lfs->pcache); + + state = lfs_dir_splittingcompact(lfs, dir, attrs, attrcount, + dir, 0, dir->count); + if (state < 0) { + return state; + } + + goto fixmlist; + +fixmlist:; + // this complicated bit of logic is for fixing up any active + // metadata-pairs that we may have affected + // + // note we have to make two passes since the mdir passed to + // lfs_dir_commit could also be in this list, and even then + // we need to copy the pair so they don't get clobbered if we refetch + // our mdir. + lfs_block_t oldpair[2] = {pair[0], pair[1]}; + for (struct lfs_mlist *d = lfs->mlist; d; d = d->next) { + if (lfs_pair_cmp(d->m.pair, oldpair) == 0) { + d->m = *dir; + if (d->m.pair != pair) { + for (int i = 0; i < attrcount; i++) { + if (lfs_tag_type3(attrs[i].tag) == LFS_TYPE_DELETE && + d->id == lfs_tag_id(attrs[i].tag)) { + d->m.pair[0] = LFS_BLOCK_NULL; + d->m.pair[1] = LFS_BLOCK_NULL; + } else if (lfs_tag_type3(attrs[i].tag) == LFS_TYPE_DELETE && + d->id > lfs_tag_id(attrs[i].tag)) { + d->id -= 1; + if (d->type == LFS_TYPE_DIR) { + ((lfs_dir_t*)d)->pos -= 1; + } + } else if (lfs_tag_type3(attrs[i].tag) == LFS_TYPE_CREATE && + d->id >= lfs_tag_id(attrs[i].tag)) { + d->id += 1; + if (d->type == LFS_TYPE_DIR) { + ((lfs_dir_t*)d)->pos += 1; + } + } + } + } + + while (d->id >= d->m.count && d->m.split) { + // we split and id is on tail now + if (lfs_pair_cmp(d->m.tail, lfs->root) != 0) { + d->id -= d->m.count; + } + int err = lfs_dir_fetch(lfs, &d->m, d->m.tail); + if (err) { + return err; + } + } + } + } + + return state; +} +#endif + +#ifndef LFS_READONLY +static int lfs_dir_orphaningcommit(lfs_t *lfs, lfs_mdir_t *dir, + const struct lfs_mattr *attrs, int attrcount) { + // check for any inline files that aren't RAM backed and + // forcefully evict them, needed for filesystem consistency + for (lfs_file_t *f = (lfs_file_t*)lfs->mlist; f; f = f->next) { + if (dir != &f->m && lfs_pair_cmp(f->m.pair, dir->pair) == 0 && + f->type == LFS_TYPE_REG && (f->flags & LFS_F_INLINE) && + f->ctz.size > lfs->cfg->cache_size) { + int err = lfs_file_outline(lfs, f); + if (err) { + return err; + } + + err = lfs_file_flush(lfs, f); + if (err) { + return err; + } + } + } + + lfs_block_t lpair[2] = {dir->pair[0], dir->pair[1]}; + lfs_mdir_t ldir = *dir; + lfs_mdir_t pdir; + int state = lfs_dir_relocatingcommit(lfs, &ldir, dir->pair, + attrs, attrcount, &pdir); + if (state < 0) { + return state; + } + + // update if we're not in mlist, note we may have already been + // updated if we are in mlist + if (lfs_pair_cmp(dir->pair, lpair) == 0) { + *dir = ldir; + } + + // commit was successful, but may require other changes in the + // filesystem, these would normally be tail recursive, but we have + // flattened them here avoid unbounded stack usage + + // need to drop? + if (state == LFS_OK_DROPPED) { + // steal state + int err = lfs_dir_getgstate(lfs, dir, &lfs->gdelta); + if (err) { + return err; + } + + // steal tail, note that this can't create a recursive drop + lpair[0] = pdir.pair[0]; + lpair[1] = pdir.pair[1]; + lfs_pair_tole32(dir->tail); + state = lfs_dir_relocatingcommit(lfs, &pdir, lpair, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_TAIL + dir->split, 0x3ff, 8), + dir->tail}), + NULL); + lfs_pair_fromle32(dir->tail); + if (state < 0) { + return state; + } + + ldir = pdir; + } + + // need to relocate? + bool orphans = false; + while (state == LFS_OK_RELOCATED) { + LFS_DEBUG("Relocating {0x%"PRIx32", 0x%"PRIx32"} " + "-> {0x%"PRIx32", 0x%"PRIx32"}", + lpair[0], lpair[1], ldir.pair[0], ldir.pair[1]); + state = 0; + + // update internal root + if (lfs_pair_cmp(lpair, lfs->root) == 0) { + lfs->root[0] = ldir.pair[0]; + lfs->root[1] = ldir.pair[1]; + } + + // update internally tracked dirs + for (struct lfs_mlist *d = lfs->mlist; d; d = d->next) { + if (lfs_pair_cmp(lpair, d->m.pair) == 0) { + d->m.pair[0] = ldir.pair[0]; + d->m.pair[1] = ldir.pair[1]; + } + + if (d->type == LFS_TYPE_DIR && + lfs_pair_cmp(lpair, ((lfs_dir_t*)d)->head) == 0) { + ((lfs_dir_t*)d)->head[0] = ldir.pair[0]; + ((lfs_dir_t*)d)->head[1] = ldir.pair[1]; + } + } + + // find parent + lfs_stag_t tag = lfs_fs_parent(lfs, lpair, &pdir); + if (tag < 0 && tag != LFS_ERR_NOENT) { + return tag; + } + + bool hasparent = (tag != LFS_ERR_NOENT); + if (tag != LFS_ERR_NOENT) { + // note that if we have a parent, we must have a pred, so this will + // always create an orphan + int err = lfs_fs_preporphans(lfs, +1); + if (err) { + return err; + } + + // fix pending move in this pair? this looks like an optimization but + // is in fact _required_ since relocating may outdate the move. + uint16_t moveid = 0x3ff; + if (lfs_gstate_hasmovehere(&lfs->gstate, pdir.pair)) { + moveid = lfs_tag_id(lfs->gstate.tag); + LFS_DEBUG("Fixing move while relocating " + "{0x%"PRIx32", 0x%"PRIx32"} 0x%"PRIx16"\n", + pdir.pair[0], pdir.pair[1], moveid); + lfs_fs_prepmove(lfs, 0x3ff, NULL); + if (moveid < lfs_tag_id(tag)) { + tag -= LFS_MKTAG(0, 1, 0); + } + } + + lfs_block_t ppair[2] = {pdir.pair[0], pdir.pair[1]}; + lfs_pair_tole32(ldir.pair); + state = lfs_dir_relocatingcommit(lfs, &pdir, ppair, LFS_MKATTRS( + {LFS_MKTAG_IF(moveid != 0x3ff, + LFS_TYPE_DELETE, moveid, 0), NULL}, + {tag, ldir.pair}), + NULL); + lfs_pair_fromle32(ldir.pair); + if (state < 0) { + return state; + } + + if (state == LFS_OK_RELOCATED) { + lpair[0] = ppair[0]; + lpair[1] = ppair[1]; + ldir = pdir; + orphans = true; + continue; + } + } + + // find pred + int err = lfs_fs_pred(lfs, lpair, &pdir); + if (err && err != LFS_ERR_NOENT) { + return err; + } + LFS_ASSERT(!(hasparent && err == LFS_ERR_NOENT)); + + // if we can't find dir, it must be new + if (err != LFS_ERR_NOENT) { + if (lfs_gstate_hasorphans(&lfs->gstate)) { + // next step, clean up orphans + err = lfs_fs_preporphans(lfs, -hasparent); + if (err) { + return err; + } + } + + // fix pending move in this pair? this looks like an optimization + // but is in fact _required_ since relocating may outdate the move. + uint16_t moveid = 0x3ff; + if (lfs_gstate_hasmovehere(&lfs->gstate, pdir.pair)) { + moveid = lfs_tag_id(lfs->gstate.tag); + LFS_DEBUG("Fixing move while relocating " + "{0x%"PRIx32", 0x%"PRIx32"} 0x%"PRIx16"\n", + pdir.pair[0], pdir.pair[1], moveid); + lfs_fs_prepmove(lfs, 0x3ff, NULL); + } + + // replace bad pair, either we clean up desync, or no desync occured + lpair[0] = pdir.pair[0]; + lpair[1] = pdir.pair[1]; + lfs_pair_tole32(ldir.pair); + state = lfs_dir_relocatingcommit(lfs, &pdir, lpair, LFS_MKATTRS( + {LFS_MKTAG_IF(moveid != 0x3ff, + LFS_TYPE_DELETE, moveid, 0), NULL}, + {LFS_MKTAG(LFS_TYPE_TAIL + pdir.split, 0x3ff, 8), + ldir.pair}), + NULL); + lfs_pair_fromle32(ldir.pair); + if (state < 0) { + return state; + } + + ldir = pdir; + } + } + + return orphans ? LFS_OK_ORPHANED : 0; +} +#endif + +#ifndef LFS_READONLY +static int lfs_dir_commit(lfs_t *lfs, lfs_mdir_t *dir, + const struct lfs_mattr *attrs, int attrcount) { + int orphans = lfs_dir_orphaningcommit(lfs, dir, attrs, attrcount); + if (orphans < 0) { + return orphans; + } + + if (orphans) { + // make sure we've removed all orphans, this is a noop if there + // are none, but if we had nested blocks failures we may have + // created some + int err = lfs_fs_deorphan(lfs, false); + if (err) { + return err; + } + } + + return 0; +} +#endif + + +/// Top level directory operations /// +#ifndef LFS_READONLY +static int lfs_mkdir_(lfs_t *lfs, const char *path) { + // deorphan if we haven't yet, needed at most once after poweron + int err = lfs_fs_forceconsistency(lfs); + if (err) { + return err; + } + + struct lfs_mlist cwd; + cwd.next = lfs->mlist; + uint16_t id; + err = lfs_dir_find(lfs, &cwd.m, &path, &id); + if (!(err == LFS_ERR_NOENT && id != 0x3ff)) { + return (err < 0) ? err : LFS_ERR_EXIST; + } + + // check that name fits + lfs_size_t nlen = strlen(path); + if (nlen > lfs->name_max) { + return LFS_ERR_NAMETOOLONG; + } + + // build up new directory + lfs_alloc_ckpoint(lfs); + lfs_mdir_t dir; + err = lfs_dir_alloc(lfs, &dir); + if (err) { + return err; + } + + // find end of list + lfs_mdir_t pred = cwd.m; + while (pred.split) { + err = lfs_dir_fetch(lfs, &pred, pred.tail); + if (err) { + return err; + } + } + + // setup dir + lfs_pair_tole32(pred.tail); + err = lfs_dir_commit(lfs, &dir, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_SOFTTAIL, 0x3ff, 8), pred.tail})); + lfs_pair_fromle32(pred.tail); + if (err) { + return err; + } + + // current block not end of list? + if (cwd.m.split) { + // update tails, this creates a desync + err = lfs_fs_preporphans(lfs, +1); + if (err) { + return err; + } + + // it's possible our predecessor has to be relocated, and if + // our parent is our predecessor's predecessor, this could have + // caused our parent to go out of date, fortunately we can hook + // ourselves into littlefs to catch this + cwd.type = 0; + cwd.id = 0; + lfs->mlist = &cwd; + + lfs_pair_tole32(dir.pair); + err = lfs_dir_commit(lfs, &pred, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_SOFTTAIL, 0x3ff, 8), dir.pair})); + lfs_pair_fromle32(dir.pair); + if (err) { + lfs->mlist = cwd.next; + return err; + } + + lfs->mlist = cwd.next; + err = lfs_fs_preporphans(lfs, -1); + if (err) { + return err; + } + } + + // now insert into our parent block + lfs_pair_tole32(dir.pair); + err = lfs_dir_commit(lfs, &cwd.m, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_CREATE, id, 0), NULL}, + {LFS_MKTAG(LFS_TYPE_DIR, id, nlen), path}, + {LFS_MKTAG(LFS_TYPE_DIRSTRUCT, id, 8), dir.pair}, + {LFS_MKTAG_IF(!cwd.m.split, + LFS_TYPE_SOFTTAIL, 0x3ff, 8), dir.pair})); + lfs_pair_fromle32(dir.pair); + if (err) { + return err; + } + + return 0; +} +#endif + +static int lfs_dir_open_(lfs_t *lfs, lfs_dir_t *dir, const char *path) { + lfs_stag_t tag = lfs_dir_find(lfs, &dir->m, &path, NULL); + if (tag < 0) { + return tag; + } + + if (lfs_tag_type3(tag) != LFS_TYPE_DIR) { + return LFS_ERR_NOTDIR; + } + + lfs_block_t pair[2]; + if (lfs_tag_id(tag) == 0x3ff) { + // handle root dir separately + pair[0] = lfs->root[0]; + pair[1] = lfs->root[1]; + } else { + // get dir pair from parent + lfs_stag_t res = lfs_dir_get(lfs, &dir->m, LFS_MKTAG(0x700, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_STRUCT, lfs_tag_id(tag), 8), pair); + if (res < 0) { + return res; + } + lfs_pair_fromle32(pair); + } + + // fetch first pair + int err = lfs_dir_fetch(lfs, &dir->m, pair); + if (err) { + return err; + } + + // setup entry + dir->head[0] = dir->m.pair[0]; + dir->head[1] = dir->m.pair[1]; + dir->id = 0; + dir->pos = 0; + + // add to list of mdirs + dir->type = LFS_TYPE_DIR; + lfs_mlist_append(lfs, (struct lfs_mlist *)dir); + + return 0; +} + +static int lfs_dir_close_(lfs_t *lfs, lfs_dir_t *dir) { + // remove from list of mdirs + lfs_mlist_remove(lfs, (struct lfs_mlist *)dir); + + return 0; +} + +static int lfs_dir_read_(lfs_t *lfs, lfs_dir_t *dir, struct lfs_info *info) { + memset(info, 0, sizeof(*info)); + + // special offset for '.' and '..' + if (dir->pos == 0) { + info->type = LFS_TYPE_DIR; + strcpy(info->name, "."); + dir->pos += 1; + return true; + } else if (dir->pos == 1) { + info->type = LFS_TYPE_DIR; + strcpy(info->name, ".."); + dir->pos += 1; + return true; + } + + while (true) { + if (dir->id == dir->m.count) { + if (!dir->m.split) { + return false; + } + + int err = lfs_dir_fetch(lfs, &dir->m, dir->m.tail); + if (err) { + return err; + } + + dir->id = 0; + } + + int err = lfs_dir_getinfo(lfs, &dir->m, dir->id, info); + if (err && err != LFS_ERR_NOENT) { + return err; + } + + dir->id += 1; + if (err != LFS_ERR_NOENT) { + break; + } + } + + dir->pos += 1; + return true; +} + +static int lfs_dir_seek_(lfs_t *lfs, lfs_dir_t *dir, lfs_off_t off) { + // simply walk from head dir + int err = lfs_dir_rewind_(lfs, dir); + if (err) { + return err; + } + + // first two for ./.. + dir->pos = lfs_min(2, off); + off -= dir->pos; + + // skip superblock entry + dir->id = (off > 0 && lfs_pair_cmp(dir->head, lfs->root) == 0); + + while (off > 0) { + if (dir->id == dir->m.count) { + if (!dir->m.split) { + return LFS_ERR_INVAL; + } + + err = lfs_dir_fetch(lfs, &dir->m, dir->m.tail); + if (err) { + return err; + } + + dir->id = 0; + } + + int diff = lfs_min(dir->m.count - dir->id, off); + dir->id += diff; + dir->pos += diff; + off -= diff; + } + + return 0; +} + +static lfs_soff_t lfs_dir_tell_(lfs_t *lfs, lfs_dir_t *dir) { + (void)lfs; + return dir->pos; +} + +static int lfs_dir_rewind_(lfs_t *lfs, lfs_dir_t *dir) { + // reload the head dir + int err = lfs_dir_fetch(lfs, &dir->m, dir->head); + if (err) { + return err; + } + + dir->id = 0; + dir->pos = 0; + return 0; +} + + +/// File index list operations /// +static int lfs_ctz_index(lfs_t *lfs, lfs_off_t *off) { + lfs_off_t size = *off; + lfs_off_t b = lfs->cfg->block_size - 2*4; + lfs_off_t i = size / b; + if (i == 0) { + return 0; + } + + i = (size - 4*(lfs_popc(i-1)+2)) / b; + *off = size - b*i - 4*lfs_popc(i); + return i; +} + +static int lfs_ctz_find(lfs_t *lfs, + const lfs_cache_t *pcache, lfs_cache_t *rcache, + lfs_block_t head, lfs_size_t size, + lfs_size_t pos, lfs_block_t *block, lfs_off_t *off) { + if (size == 0) { + *block = LFS_BLOCK_NULL; + *off = 0; + return 0; + } + + lfs_off_t current = lfs_ctz_index(lfs, &(lfs_off_t){size-1}); + lfs_off_t target = lfs_ctz_index(lfs, &pos); + + while (current > target) { + lfs_size_t skip = lfs_min( + lfs_npw2(current-target+1) - 1, + lfs_ctz(current)); + + int err = lfs_bd_read(lfs, + pcache, rcache, sizeof(head), + head, 4*skip, &head, sizeof(head)); + head = lfs_fromle32(head); + if (err) { + return err; + } + + current -= 1 << skip; + } + + *block = head; + *off = pos; + return 0; +} + +#ifndef LFS_READONLY +static int lfs_ctz_extend(lfs_t *lfs, + lfs_cache_t *pcache, lfs_cache_t *rcache, + lfs_block_t head, lfs_size_t size, + lfs_block_t *block, lfs_off_t *off) { + while (true) { + // go ahead and grab a block + lfs_block_t nblock; + int err = lfs_alloc(lfs, &nblock); + if (err) { + return err; + } + + { + err = lfs_bd_erase(lfs, nblock); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + + if (size == 0) { + *block = nblock; + *off = 0; + return 0; + } + + lfs_size_t noff = size - 1; + lfs_off_t index = lfs_ctz_index(lfs, &noff); + noff = noff + 1; + + // just copy out the last block if it is incomplete + if (noff != lfs->cfg->block_size) { + for (lfs_off_t i = 0; i < noff; i++) { + uint8_t data; + err = lfs_bd_read(lfs, + NULL, rcache, noff-i, + head, i, &data, 1); + if (err) { + return err; + } + + err = lfs_bd_prog(lfs, + pcache, rcache, true, + nblock, i, &data, 1); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + } + + *block = nblock; + *off = noff; + return 0; + } + + // append block + index += 1; + lfs_size_t skips = lfs_ctz(index) + 1; + lfs_block_t nhead = head; + for (lfs_off_t i = 0; i < skips; i++) { + nhead = lfs_tole32(nhead); + err = lfs_bd_prog(lfs, pcache, rcache, true, + nblock, 4*i, &nhead, 4); + nhead = lfs_fromle32(nhead); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + + if (i != skips-1) { + err = lfs_bd_read(lfs, + NULL, rcache, sizeof(nhead), + nhead, 4*i, &nhead, sizeof(nhead)); + nhead = lfs_fromle32(nhead); + if (err) { + return err; + } + } + } + + *block = nblock; + *off = 4*skips; + return 0; + } + +relocate: + LFS_DEBUG("Bad block at 0x%"PRIx32, nblock); + + // just clear cache and try a new block + lfs_cache_drop(lfs, pcache); + } +} +#endif + +static int lfs_ctz_traverse(lfs_t *lfs, + const lfs_cache_t *pcache, lfs_cache_t *rcache, + lfs_block_t head, lfs_size_t size, + int (*cb)(void*, lfs_block_t), void *data) { + if (size == 0) { + return 0; + } + + lfs_off_t index = lfs_ctz_index(lfs, &(lfs_off_t){size-1}); + + while (true) { + int err = cb(data, head); + if (err) { + return err; + } + + if (index == 0) { + return 0; + } + + lfs_block_t heads[2]; + int count = 2 - (index & 1); + err = lfs_bd_read(lfs, + pcache, rcache, count*sizeof(head), + head, 0, &heads, count*sizeof(head)); + heads[0] = lfs_fromle32(heads[0]); + heads[1] = lfs_fromle32(heads[1]); + if (err) { + return err; + } + + for (int i = 0; i < count-1; i++) { + err = cb(data, heads[i]); + if (err) { + return err; + } + } + + head = heads[count-1]; + index -= count; + } +} + + +/// Top level file operations /// +static int lfs_file_opencfg_(lfs_t *lfs, lfs_file_t *file, + const char *path, int flags, + const struct lfs_file_config *cfg) { +#ifndef LFS_READONLY + // deorphan if we haven't yet, needed at most once after poweron + if ((flags & LFS_O_WRONLY) == LFS_O_WRONLY) { + int err = lfs_fs_forceconsistency(lfs); + if (err) { + return err; + } + } +#else + LFS_ASSERT((flags & LFS_O_RDONLY) == LFS_O_RDONLY); +#endif + + // setup simple file details + int err; + file->cfg = cfg; + file->flags = flags; + file->pos = 0; + file->off = 0; + file->cache.buffer = NULL; + + // allocate entry for file if it doesn't exist + lfs_stag_t tag = lfs_dir_find(lfs, &file->m, &path, &file->id); + if (tag < 0 && !(tag == LFS_ERR_NOENT && file->id != 0x3ff)) { + err = tag; + goto cleanup; + } + + // get id, add to list of mdirs to catch update changes + file->type = LFS_TYPE_REG; + lfs_mlist_append(lfs, (struct lfs_mlist *)file); + +#ifdef LFS_READONLY + if (tag == LFS_ERR_NOENT) { + err = LFS_ERR_NOENT; + goto cleanup; +#else + if (tag == LFS_ERR_NOENT) { + if (!(flags & LFS_O_CREAT)) { + err = LFS_ERR_NOENT; + goto cleanup; + } + + // check that name fits + lfs_size_t nlen = strlen(path); + if (nlen > lfs->name_max) { + err = LFS_ERR_NAMETOOLONG; + goto cleanup; + } + + // get next slot and create entry to remember name + err = lfs_dir_commit(lfs, &file->m, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_CREATE, file->id, 0), NULL}, + {LFS_MKTAG(LFS_TYPE_REG, file->id, nlen), path}, + {LFS_MKTAG(LFS_TYPE_INLINESTRUCT, file->id, 0), NULL})); + + // it may happen that the file name doesn't fit in the metadata blocks, e.g., a 256 byte file name will + // not fit in a 128 byte block. + err = (err == LFS_ERR_NOSPC) ? LFS_ERR_NAMETOOLONG : err; + if (err) { + goto cleanup; + } + + tag = LFS_MKTAG(LFS_TYPE_INLINESTRUCT, 0, 0); + } else if (flags & LFS_O_EXCL) { + err = LFS_ERR_EXIST; + goto cleanup; +#endif + } else if (lfs_tag_type3(tag) != LFS_TYPE_REG) { + err = LFS_ERR_ISDIR; + goto cleanup; +#ifndef LFS_READONLY + } else if (flags & LFS_O_TRUNC) { + // truncate if requested + tag = LFS_MKTAG(LFS_TYPE_INLINESTRUCT, file->id, 0); + file->flags |= LFS_F_DIRTY; +#endif + } else { + // try to load what's on disk, if it's inlined we'll fix it later + tag = lfs_dir_get(lfs, &file->m, LFS_MKTAG(0x700, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_STRUCT, file->id, 8), &file->ctz); + if (tag < 0) { + err = tag; + goto cleanup; + } + lfs_ctz_fromle32(&file->ctz); + } + + // fetch attrs + for (unsigned i = 0; i < file->cfg->attr_count; i++) { + // if opened for read / read-write operations + if ((file->flags & LFS_O_RDONLY) == LFS_O_RDONLY) { + lfs_stag_t res = lfs_dir_get(lfs, &file->m, + LFS_MKTAG(0x7ff, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_USERATTR + file->cfg->attrs[i].type, + file->id, file->cfg->attrs[i].size), + file->cfg->attrs[i].buffer); + if (res < 0 && res != LFS_ERR_NOENT) { + err = res; + goto cleanup; + } + } + +#ifndef LFS_READONLY + // if opened for write / read-write operations + if ((file->flags & LFS_O_WRONLY) == LFS_O_WRONLY) { + if (file->cfg->attrs[i].size > lfs->attr_max) { + err = LFS_ERR_NOSPC; + goto cleanup; + } + + file->flags |= LFS_F_DIRTY; + } +#endif + } + + // allocate buffer if needed + if (file->cfg->buffer) { + file->cache.buffer = file->cfg->buffer; + } else { + file->cache.buffer = lfs_malloc(lfs->cfg->cache_size); + if (!file->cache.buffer) { + err = LFS_ERR_NOMEM; + goto cleanup; + } + } + + // zero to avoid information leak + lfs_cache_zero(lfs, &file->cache); + + if (lfs_tag_type3(tag) == LFS_TYPE_INLINESTRUCT) { + // load inline files + file->ctz.head = LFS_BLOCK_INLINE; + file->ctz.size = lfs_tag_size(tag); + file->flags |= LFS_F_INLINE; + file->cache.block = file->ctz.head; + file->cache.off = 0; + file->cache.size = lfs->cfg->cache_size; + + // don't always read (may be new/trunc file) + if (file->ctz.size > 0) { + lfs_stag_t res = lfs_dir_get(lfs, &file->m, + LFS_MKTAG(0x700, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_STRUCT, file->id, + lfs_min(file->cache.size, 0x3fe)), + file->cache.buffer); + if (res < 0) { + err = res; + goto cleanup; + } + } + } + + return 0; + +cleanup: + // clean up lingering resources +#ifndef LFS_READONLY + file->flags |= LFS_F_ERRED; +#endif + lfs_file_close_(lfs, file); + return err; +} + +#ifndef LFS_NO_MALLOC +static int lfs_file_open_(lfs_t *lfs, lfs_file_t *file, + const char *path, int flags) { + static const struct lfs_file_config defaults = {0}; + int err = lfs_file_opencfg_(lfs, file, path, flags, &defaults); + return err; +} +#endif + +static int lfs_file_close_(lfs_t *lfs, lfs_file_t *file) { +#ifndef LFS_READONLY + int err = lfs_file_sync_(lfs, file); +#else + int err = 0; +#endif + + // remove from list of mdirs + lfs_mlist_remove(lfs, (struct lfs_mlist*)file); + + // clean up memory + if (!file->cfg->buffer) { + lfs_free(file->cache.buffer); + } + + return err; +} + + +#ifndef LFS_READONLY +static int lfs_file_relocate(lfs_t *lfs, lfs_file_t *file) { + while (true) { + // just relocate what exists into new block + lfs_block_t nblock; + int err = lfs_alloc(lfs, &nblock); + if (err) { + return err; + } + + err = lfs_bd_erase(lfs, nblock); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + + // either read from dirty cache or disk + for (lfs_off_t i = 0; i < file->off; i++) { + uint8_t data; + if (file->flags & LFS_F_INLINE) { + err = lfs_dir_getread(lfs, &file->m, + // note we evict inline files before they can be dirty + NULL, &file->cache, file->off-i, + LFS_MKTAG(0xfff, 0x1ff, 0), + LFS_MKTAG(LFS_TYPE_INLINESTRUCT, file->id, 0), + i, &data, 1); + if (err) { + return err; + } + } else { + err = lfs_bd_read(lfs, + &file->cache, &lfs->rcache, file->off-i, + file->block, i, &data, 1); + if (err) { + return err; + } + } + + err = lfs_bd_prog(lfs, + &lfs->pcache, &lfs->rcache, true, + nblock, i, &data, 1); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + } + + // copy over new state of file + memcpy(file->cache.buffer, lfs->pcache.buffer, lfs->cfg->cache_size); + file->cache.block = lfs->pcache.block; + file->cache.off = lfs->pcache.off; + file->cache.size = lfs->pcache.size; + lfs_cache_zero(lfs, &lfs->pcache); + + file->block = nblock; + file->flags |= LFS_F_WRITING; + return 0; + +relocate: + LFS_DEBUG("Bad block at 0x%"PRIx32, nblock); + + // just clear cache and try a new block + lfs_cache_drop(lfs, &lfs->pcache); + } +} +#endif + +#ifndef LFS_READONLY +static int lfs_file_outline(lfs_t *lfs, lfs_file_t *file) { + file->off = file->pos; + lfs_alloc_ckpoint(lfs); + int err = lfs_file_relocate(lfs, file); + if (err) { + return err; + } + + file->flags &= ~LFS_F_INLINE; + return 0; +} +#endif + +static int lfs_file_flush(lfs_t *lfs, lfs_file_t *file) { + if (file->flags & LFS_F_READING) { + if (!(file->flags & LFS_F_INLINE)) { + lfs_cache_drop(lfs, &file->cache); + } + file->flags &= ~LFS_F_READING; + } + +#ifndef LFS_READONLY + if (file->flags & LFS_F_WRITING) { + lfs_off_t pos = file->pos; + + if (!(file->flags & LFS_F_INLINE)) { + // copy over anything after current branch + lfs_file_t orig = { + .ctz.head = file->ctz.head, + .ctz.size = file->ctz.size, + .flags = LFS_O_RDONLY, + .pos = file->pos, + .cache = lfs->rcache, + }; + lfs_cache_drop(lfs, &lfs->rcache); + + while (file->pos < file->ctz.size) { + // copy over a byte at a time, leave it up to caching + // to make this efficient + uint8_t data; + lfs_ssize_t res = lfs_file_flushedread(lfs, &orig, &data, 1); + if (res < 0) { + return res; + } + + res = lfs_file_flushedwrite(lfs, file, &data, 1); + if (res < 0) { + return res; + } + + // keep our reference to the rcache in sync + if (lfs->rcache.block != LFS_BLOCK_NULL) { + lfs_cache_drop(lfs, &orig.cache); + lfs_cache_drop(lfs, &lfs->rcache); + } + } + + // write out what we have + while (true) { + int err = lfs_bd_flush(lfs, &file->cache, &lfs->rcache, true); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + + break; + +relocate: + LFS_DEBUG("Bad block at 0x%"PRIx32, file->block); + err = lfs_file_relocate(lfs, file); + if (err) { + return err; + } + } + } else { + file->pos = lfs_max(file->pos, file->ctz.size); + } + + // actual file updates + file->ctz.head = file->block; + file->ctz.size = file->pos; + file->flags &= ~LFS_F_WRITING; + file->flags |= LFS_F_DIRTY; + + file->pos = pos; + } +#endif + + return 0; +} + +#ifndef LFS_READONLY +static int lfs_file_sync_(lfs_t *lfs, lfs_file_t *file) { + if (file->flags & LFS_F_ERRED) { + // it's not safe to do anything if our file errored + return 0; + } + + int err = lfs_file_flush(lfs, file); + if (err) { + file->flags |= LFS_F_ERRED; + return err; + } + + + if ((file->flags & LFS_F_DIRTY) && + !lfs_pair_isnull(file->m.pair)) { + // before we commit metadata, we need sync the disk to make sure + // data writes don't complete after metadata writes + if (!(file->flags & LFS_F_INLINE)) { + err = lfs_bd_sync(lfs, &lfs->pcache, &lfs->rcache, false); + if (err) { + return err; + } + } + + // update dir entry + uint16_t type; + const void *buffer; + lfs_size_t size; + struct lfs_ctz ctz; + if (file->flags & LFS_F_INLINE) { + // inline the whole file + type = LFS_TYPE_INLINESTRUCT; + buffer = file->cache.buffer; + size = file->ctz.size; + } else { + // update the ctz reference + type = LFS_TYPE_CTZSTRUCT; + // copy ctz so alloc will work during a relocate + ctz = file->ctz; + lfs_ctz_tole32(&ctz); + buffer = &ctz; + size = sizeof(ctz); + } + + // commit file data and attributes + err = lfs_dir_commit(lfs, &file->m, LFS_MKATTRS( + {LFS_MKTAG(type, file->id, size), buffer}, + {LFS_MKTAG(LFS_FROM_USERATTRS, file->id, + file->cfg->attr_count), file->cfg->attrs})); + if (err) { + file->flags |= LFS_F_ERRED; + return err; + } + + file->flags &= ~LFS_F_DIRTY; + } + + return 0; +} +#endif + +static lfs_ssize_t lfs_file_flushedread(lfs_t *lfs, lfs_file_t *file, + void *buffer, lfs_size_t size) { + uint8_t *data = buffer; + lfs_size_t nsize = size; + + if (file->pos >= file->ctz.size) { + // eof if past end + return 0; + } + + size = lfs_min(size, file->ctz.size - file->pos); + nsize = size; + + while (nsize > 0) { + // check if we need a new block + if (!(file->flags & LFS_F_READING) || + file->off == lfs->cfg->block_size) { + if (!(file->flags & LFS_F_INLINE)) { + int err = lfs_ctz_find(lfs, NULL, &file->cache, + file->ctz.head, file->ctz.size, + file->pos, &file->block, &file->off); + if (err) { + return err; + } + } else { + file->block = LFS_BLOCK_INLINE; + file->off = file->pos; + } + + file->flags |= LFS_F_READING; + } + + // read as much as we can in current block + lfs_size_t diff = lfs_min(nsize, lfs->cfg->block_size - file->off); + if (file->flags & LFS_F_INLINE) { + int err = lfs_dir_getread(lfs, &file->m, + NULL, &file->cache, lfs->cfg->block_size, + LFS_MKTAG(0xfff, 0x1ff, 0), + LFS_MKTAG(LFS_TYPE_INLINESTRUCT, file->id, 0), + file->off, data, diff); + if (err) { + return err; + } + } else { + int err = lfs_bd_read(lfs, + NULL, &file->cache, lfs->cfg->block_size, + file->block, file->off, data, diff); + if (err) { + return err; + } + } + + file->pos += diff; + file->off += diff; + data += diff; + nsize -= diff; + } + + return size; +} + +static lfs_ssize_t lfs_file_read_(lfs_t *lfs, lfs_file_t *file, + void *buffer, lfs_size_t size) { + LFS_ASSERT((file->flags & LFS_O_RDONLY) == LFS_O_RDONLY); + +#ifndef LFS_READONLY + if (file->flags & LFS_F_WRITING) { + // flush out any writes + int err = lfs_file_flush(lfs, file); + if (err) { + return err; + } + } +#endif + + return lfs_file_flushedread(lfs, file, buffer, size); +} + + +#ifndef LFS_READONLY +static lfs_ssize_t lfs_file_flushedwrite(lfs_t *lfs, lfs_file_t *file, + const void *buffer, lfs_size_t size) { + const uint8_t *data = buffer; + lfs_size_t nsize = size; + + if ((file->flags & LFS_F_INLINE) && + lfs_max(file->pos+nsize, file->ctz.size) > lfs->inline_max) { + // inline file doesn't fit anymore + int err = lfs_file_outline(lfs, file); + if (err) { + file->flags |= LFS_F_ERRED; + return err; + } + } + + while (nsize > 0) { + // check if we need a new block + if (!(file->flags & LFS_F_WRITING) || + file->off == lfs->cfg->block_size) { + if (!(file->flags & LFS_F_INLINE)) { + if (!(file->flags & LFS_F_WRITING) && file->pos > 0) { + // find out which block we're extending from + int err = lfs_ctz_find(lfs, NULL, &file->cache, + file->ctz.head, file->ctz.size, + file->pos-1, &file->block, &(lfs_off_t){0}); + if (err) { + file->flags |= LFS_F_ERRED; + return err; + } + + // mark cache as dirty since we may have read data into it + lfs_cache_zero(lfs, &file->cache); + } + + // extend file with new blocks + lfs_alloc_ckpoint(lfs); + int err = lfs_ctz_extend(lfs, &file->cache, &lfs->rcache, + file->block, file->pos, + &file->block, &file->off); + if (err) { + file->flags |= LFS_F_ERRED; + return err; + } + } else { + file->block = LFS_BLOCK_INLINE; + file->off = file->pos; + } + + file->flags |= LFS_F_WRITING; + } + + // program as much as we can in current block + lfs_size_t diff = lfs_min(nsize, lfs->cfg->block_size - file->off); + while (true) { + int err = lfs_bd_prog(lfs, &file->cache, &lfs->rcache, true, + file->block, file->off, data, diff); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + file->flags |= LFS_F_ERRED; + return err; + } + + break; +relocate: + err = lfs_file_relocate(lfs, file); + if (err) { + file->flags |= LFS_F_ERRED; + return err; + } + } + + file->pos += diff; + file->off += diff; + data += diff; + nsize -= diff; + + lfs_alloc_ckpoint(lfs); + } + + return size; +} + +static lfs_ssize_t lfs_file_write_(lfs_t *lfs, lfs_file_t *file, + const void *buffer, lfs_size_t size) { + LFS_ASSERT((file->flags & LFS_O_WRONLY) == LFS_O_WRONLY); + + if (file->flags & LFS_F_READING) { + // drop any reads + int err = lfs_file_flush(lfs, file); + if (err) { + return err; + } + } + + if ((file->flags & LFS_O_APPEND) && file->pos < file->ctz.size) { + file->pos = file->ctz.size; + } + + if (file->pos + size > lfs->file_max) { + // Larger than file limit? + return LFS_ERR_FBIG; + } + + if (!(file->flags & LFS_F_WRITING) && file->pos > file->ctz.size) { + // fill with zeros + lfs_off_t pos = file->pos; + file->pos = file->ctz.size; + + while (file->pos < pos) { + lfs_ssize_t res = lfs_file_flushedwrite(lfs, file, &(uint8_t){0}, 1); + if (res < 0) { + return res; + } + } + } + + lfs_ssize_t nsize = lfs_file_flushedwrite(lfs, file, buffer, size); + if (nsize < 0) { + return nsize; + } + + file->flags &= ~LFS_F_ERRED; + return nsize; +} +#endif + +static lfs_soff_t lfs_file_seek_(lfs_t *lfs, lfs_file_t *file, + lfs_soff_t off, int whence) { + // find new pos + lfs_off_t npos = file->pos; + if (whence == LFS_SEEK_SET) { + npos = off; + } else if (whence == LFS_SEEK_CUR) { + if ((lfs_soff_t)file->pos + off < 0) { + return LFS_ERR_INVAL; + } else { + npos = file->pos + off; + } + } else if (whence == LFS_SEEK_END) { + lfs_soff_t res = lfs_file_size_(lfs, file) + off; + if (res < 0) { + return LFS_ERR_INVAL; + } else { + npos = res; + } + } + + if (npos > lfs->file_max) { + // file position out of range + return LFS_ERR_INVAL; + } + + if (file->pos == npos) { + // noop - position has not changed + return npos; + } + + // if we're only reading and our new offset is still in the file's cache + // we can avoid flushing and needing to reread the data + if ( +#ifndef LFS_READONLY + !(file->flags & LFS_F_WRITING) +#else + true +#endif + ) { + int oindex = lfs_ctz_index(lfs, &(lfs_off_t){file->pos}); + lfs_off_t noff = npos; + int nindex = lfs_ctz_index(lfs, &noff); + if (oindex == nindex + && noff >= file->cache.off + && noff < file->cache.off + file->cache.size) { + file->pos = npos; + file->off = noff; + return npos; + } + } + + // write out everything beforehand, may be noop if rdonly + int err = lfs_file_flush(lfs, file); + if (err) { + return err; + } + + // update pos + file->pos = npos; + return npos; +} + +#ifndef LFS_READONLY +static int lfs_file_truncate_(lfs_t *lfs, lfs_file_t *file, lfs_off_t size) { + LFS_ASSERT((file->flags & LFS_O_WRONLY) == LFS_O_WRONLY); + + if (size > LFS_FILE_MAX) { + return LFS_ERR_INVAL; + } + + lfs_off_t pos = file->pos; + lfs_off_t oldsize = lfs_file_size_(lfs, file); + if (size < oldsize) { + // revert to inline file? + if (size <= lfs->inline_max) { + // flush+seek to head + lfs_soff_t res = lfs_file_seek_(lfs, file, 0, LFS_SEEK_SET); + if (res < 0) { + return (int)res; + } + + // read our data into rcache temporarily + lfs_cache_drop(lfs, &lfs->rcache); + res = lfs_file_flushedread(lfs, file, + lfs->rcache.buffer, size); + if (res < 0) { + return (int)res; + } + + file->ctz.head = LFS_BLOCK_INLINE; + file->ctz.size = size; + file->flags |= LFS_F_DIRTY | LFS_F_READING | LFS_F_INLINE; + file->cache.block = file->ctz.head; + file->cache.off = 0; + file->cache.size = lfs->cfg->cache_size; + memcpy(file->cache.buffer, lfs->rcache.buffer, size); + + } else { + // need to flush since directly changing metadata + int err = lfs_file_flush(lfs, file); + if (err) { + return err; + } + + // lookup new head in ctz skip list + err = lfs_ctz_find(lfs, NULL, &file->cache, + file->ctz.head, file->ctz.size, + size-1, &file->block, &(lfs_off_t){0}); + if (err) { + return err; + } + + // need to set pos/block/off consistently so seeking back to + // the old position does not get confused + file->pos = size; + file->ctz.head = file->block; + file->ctz.size = size; + file->flags |= LFS_F_DIRTY | LFS_F_READING; + } + } else if (size > oldsize) { + // flush+seek if not already at end + lfs_soff_t res = lfs_file_seek_(lfs, file, 0, LFS_SEEK_END); + if (res < 0) { + return (int)res; + } + + // fill with zeros + while (file->pos < size) { + res = lfs_file_write_(lfs, file, &(uint8_t){0}, 1); + if (res < 0) { + return (int)res; + } + } + } + + // restore pos + lfs_soff_t res = lfs_file_seek_(lfs, file, pos, LFS_SEEK_SET); + if (res < 0) { + return (int)res; + } + + return 0; +} +#endif + +static lfs_soff_t lfs_file_tell_(lfs_t *lfs, lfs_file_t *file) { + (void)lfs; + return file->pos; +} + +static int lfs_file_rewind_(lfs_t *lfs, lfs_file_t *file) { + lfs_soff_t res = lfs_file_seek_(lfs, file, 0, LFS_SEEK_SET); + if (res < 0) { + return (int)res; + } + + return 0; +} + +static lfs_soff_t lfs_file_size_(lfs_t *lfs, lfs_file_t *file) { + (void)lfs; + +#ifndef LFS_READONLY + if (file->flags & LFS_F_WRITING) { + return lfs_max(file->pos, file->ctz.size); + } +#endif + + return file->ctz.size; +} + + +/// General fs operations /// +static int lfs_stat_(lfs_t *lfs, const char *path, struct lfs_info *info) { + lfs_mdir_t cwd; + lfs_stag_t tag = lfs_dir_find(lfs, &cwd, &path, NULL); + if (tag < 0) { + return (int)tag; + } + + return lfs_dir_getinfo(lfs, &cwd, lfs_tag_id(tag), info); +} + +#ifndef LFS_READONLY +static int lfs_remove_(lfs_t *lfs, const char *path) { + // deorphan if we haven't yet, needed at most once after poweron + int err = lfs_fs_forceconsistency(lfs); + if (err) { + return err; + } + + lfs_mdir_t cwd; + lfs_stag_t tag = lfs_dir_find(lfs, &cwd, &path, NULL); + if (tag < 0 || lfs_tag_id(tag) == 0x3ff) { + return (tag < 0) ? (int)tag : LFS_ERR_INVAL; + } + + struct lfs_mlist dir; + dir.next = lfs->mlist; + if (lfs_tag_type3(tag) == LFS_TYPE_DIR) { + // must be empty before removal + lfs_block_t pair[2]; + lfs_stag_t res = lfs_dir_get(lfs, &cwd, LFS_MKTAG(0x700, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_STRUCT, lfs_tag_id(tag), 8), pair); + if (res < 0) { + return (int)res; + } + lfs_pair_fromle32(pair); + + err = lfs_dir_fetch(lfs, &dir.m, pair); + if (err) { + return err; + } + + if (dir.m.count > 0 || dir.m.split) { + return LFS_ERR_NOTEMPTY; + } + + // mark fs as orphaned + err = lfs_fs_preporphans(lfs, +1); + if (err) { + return err; + } + + // I know it's crazy but yes, dir can be changed by our parent's + // commit (if predecessor is child) + dir.type = 0; + dir.id = 0; + lfs->mlist = &dir; + } + + // delete the entry + err = lfs_dir_commit(lfs, &cwd, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_DELETE, lfs_tag_id(tag), 0), NULL})); + if (err) { + lfs->mlist = dir.next; + return err; + } + + lfs->mlist = dir.next; + if (lfs_tag_type3(tag) == LFS_TYPE_DIR) { + // fix orphan + err = lfs_fs_preporphans(lfs, -1); + if (err) { + return err; + } + + err = lfs_fs_pred(lfs, dir.m.pair, &cwd); + if (err) { + return err; + } + + err = lfs_dir_drop(lfs, &cwd, &dir.m); + if (err) { + return err; + } + } + + return 0; +} +#endif + +#ifndef LFS_READONLY +static int lfs_rename_(lfs_t *lfs, const char *oldpath, const char *newpath) { + // deorphan if we haven't yet, needed at most once after poweron + int err = lfs_fs_forceconsistency(lfs); + if (err) { + return err; + } + + // find old entry + lfs_mdir_t oldcwd; + lfs_stag_t oldtag = lfs_dir_find(lfs, &oldcwd, &oldpath, NULL); + if (oldtag < 0 || lfs_tag_id(oldtag) == 0x3ff) { + return (oldtag < 0) ? (int)oldtag : LFS_ERR_INVAL; + } + + // find new entry + lfs_mdir_t newcwd; + uint16_t newid; + lfs_stag_t prevtag = lfs_dir_find(lfs, &newcwd, &newpath, &newid); + if ((prevtag < 0 || lfs_tag_id(prevtag) == 0x3ff) && + !(prevtag == LFS_ERR_NOENT && newid != 0x3ff)) { + return (prevtag < 0) ? (int)prevtag : LFS_ERR_INVAL; + } + + // if we're in the same pair there's a few special cases... + bool samepair = (lfs_pair_cmp(oldcwd.pair, newcwd.pair) == 0); + uint16_t newoldid = lfs_tag_id(oldtag); + + struct lfs_mlist prevdir; + prevdir.next = lfs->mlist; + if (prevtag == LFS_ERR_NOENT) { + // check that name fits + lfs_size_t nlen = strlen(newpath); + if (nlen > lfs->name_max) { + return LFS_ERR_NAMETOOLONG; + } + + // there is a small chance we are being renamed in the same + // directory/ to an id less than our old id, the global update + // to handle this is a bit messy + if (samepair && newid <= newoldid) { + newoldid += 1; + } + } else if (lfs_tag_type3(prevtag) != lfs_tag_type3(oldtag)) { + return (lfs_tag_type3(prevtag) == LFS_TYPE_DIR) + ? LFS_ERR_ISDIR + : LFS_ERR_NOTDIR; + } else if (samepair && newid == newoldid) { + // we're renaming to ourselves?? + return 0; + } else if (lfs_tag_type3(prevtag) == LFS_TYPE_DIR) { + // must be empty before removal + lfs_block_t prevpair[2]; + lfs_stag_t res = lfs_dir_get(lfs, &newcwd, LFS_MKTAG(0x700, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_STRUCT, newid, 8), prevpair); + if (res < 0) { + return (int)res; + } + lfs_pair_fromle32(prevpair); + + // must be empty before removal + err = lfs_dir_fetch(lfs, &prevdir.m, prevpair); + if (err) { + return err; + } + + if (prevdir.m.count > 0 || prevdir.m.split) { + return LFS_ERR_NOTEMPTY; + } + + // mark fs as orphaned + err = lfs_fs_preporphans(lfs, +1); + if (err) { + return err; + } + + // I know it's crazy but yes, dir can be changed by our parent's + // commit (if predecessor is child) + prevdir.type = 0; + prevdir.id = 0; + lfs->mlist = &prevdir; + } + + if (!samepair) { + lfs_fs_prepmove(lfs, newoldid, oldcwd.pair); + } + + // move over all attributes + err = lfs_dir_commit(lfs, &newcwd, LFS_MKATTRS( + {LFS_MKTAG_IF(prevtag != LFS_ERR_NOENT, + LFS_TYPE_DELETE, newid, 0), NULL}, + {LFS_MKTAG(LFS_TYPE_CREATE, newid, 0), NULL}, + {LFS_MKTAG(lfs_tag_type3(oldtag), newid, strlen(newpath)), newpath}, + {LFS_MKTAG(LFS_FROM_MOVE, newid, lfs_tag_id(oldtag)), &oldcwd}, + {LFS_MKTAG_IF(samepair, + LFS_TYPE_DELETE, newoldid, 0), NULL})); + if (err) { + lfs->mlist = prevdir.next; + return err; + } + + // let commit clean up after move (if we're different! otherwise move + // logic already fixed it for us) + if (!samepair && lfs_gstate_hasmove(&lfs->gstate)) { + // prep gstate and delete move id + lfs_fs_prepmove(lfs, 0x3ff, NULL); + err = lfs_dir_commit(lfs, &oldcwd, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_DELETE, lfs_tag_id(oldtag), 0), NULL})); + if (err) { + lfs->mlist = prevdir.next; + return err; + } + } + + lfs->mlist = prevdir.next; + if (prevtag != LFS_ERR_NOENT + && lfs_tag_type3(prevtag) == LFS_TYPE_DIR) { + // fix orphan + err = lfs_fs_preporphans(lfs, -1); + if (err) { + return err; + } + + err = lfs_fs_pred(lfs, prevdir.m.pair, &newcwd); + if (err) { + return err; + } + + err = lfs_dir_drop(lfs, &newcwd, &prevdir.m); + if (err) { + return err; + } + } + + return 0; +} +#endif + +static lfs_ssize_t lfs_getattr_(lfs_t *lfs, const char *path, + uint8_t type, void *buffer, lfs_size_t size) { + lfs_mdir_t cwd; + lfs_stag_t tag = lfs_dir_find(lfs, &cwd, &path, NULL); + if (tag < 0) { + return tag; + } + + uint16_t id = lfs_tag_id(tag); + if (id == 0x3ff) { + // special case for root + id = 0; + int err = lfs_dir_fetch(lfs, &cwd, lfs->root); + if (err) { + return err; + } + } + + tag = lfs_dir_get(lfs, &cwd, LFS_MKTAG(0x7ff, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_USERATTR + type, + id, lfs_min(size, lfs->attr_max)), + buffer); + if (tag < 0) { + if (tag == LFS_ERR_NOENT) { + return LFS_ERR_NOATTR; + } + + return tag; + } + + return lfs_tag_size(tag); +} + +#ifndef LFS_READONLY +static int lfs_commitattr(lfs_t *lfs, const char *path, + uint8_t type, const void *buffer, lfs_size_t size) { + lfs_mdir_t cwd; + lfs_stag_t tag = lfs_dir_find(lfs, &cwd, &path, NULL); + if (tag < 0) { + return tag; + } + + uint16_t id = lfs_tag_id(tag); + if (id == 0x3ff) { + // special case for root + id = 0; + int err = lfs_dir_fetch(lfs, &cwd, lfs->root); + if (err) { + return err; + } + } + + return lfs_dir_commit(lfs, &cwd, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_USERATTR + type, id, size), buffer})); +} +#endif + +#ifndef LFS_READONLY +static int lfs_setattr_(lfs_t *lfs, const char *path, + uint8_t type, const void *buffer, lfs_size_t size) { + if (size > lfs->attr_max) { + return LFS_ERR_NOSPC; + } + + return lfs_commitattr(lfs, path, type, buffer, size); +} +#endif + +#ifndef LFS_READONLY +static int lfs_removeattr_(lfs_t *lfs, const char *path, uint8_t type) { + return lfs_commitattr(lfs, path, type, NULL, 0x3ff); +} +#endif + + +/// Filesystem operations /// + +// compile time checks, see lfs.h for why these limits exist +#if LFS_NAME_MAX > 1022 +#error "Invalid LFS_NAME_MAX, must be <= 1022" +#endif + +#if LFS_FILE_MAX > 2147483647 +#error "Invalid LFS_FILE_MAX, must be <= 2147483647" +#endif + +#if LFS_ATTR_MAX > 1022 +#error "Invalid LFS_ATTR_MAX, must be <= 1022" +#endif + +// common filesystem initialization +static int lfs_init(lfs_t *lfs, const struct lfs_config *cfg) { + lfs->cfg = cfg; + lfs->block_count = cfg->block_count; // May be 0 + int err = 0; + +#ifdef LFS_MULTIVERSION + // this driver only supports minor version < current minor version + LFS_ASSERT(!lfs->cfg->disk_version || ( + (0xffff & (lfs->cfg->disk_version >> 16)) + == LFS_DISK_VERSION_MAJOR + && (0xffff & (lfs->cfg->disk_version >> 0)) + <= LFS_DISK_VERSION_MINOR)); +#endif + + // check that bool is a truthy-preserving type + // + // note the most common reason for this failure is a before-c99 compiler, + // which littlefs currently does not support + LFS_ASSERT((bool)0x80000000); + + // validate that the lfs-cfg sizes were initiated properly before + // performing any arithmetic logics with them + LFS_ASSERT(lfs->cfg->read_size != 0); + LFS_ASSERT(lfs->cfg->prog_size != 0); + LFS_ASSERT(lfs->cfg->cache_size != 0); + + // check that block size is a multiple of cache size is a multiple + // of prog and read sizes + LFS_ASSERT(lfs->cfg->cache_size % lfs->cfg->read_size == 0); + LFS_ASSERT(lfs->cfg->cache_size % lfs->cfg->prog_size == 0); + LFS_ASSERT(lfs->cfg->block_size % lfs->cfg->cache_size == 0); + + // check that the block size is large enough to fit all ctz pointers + LFS_ASSERT(lfs->cfg->block_size >= 128); + // this is the exact calculation for all ctz pointers, if this fails + // and the simpler assert above does not, math must be broken + LFS_ASSERT(4*lfs_npw2(0xffffffff / (lfs->cfg->block_size-2*4)) + <= lfs->cfg->block_size); + + // block_cycles = 0 is no longer supported. + // + // block_cycles is the number of erase cycles before littlefs evicts + // metadata logs as a part of wear leveling. Suggested values are in the + // range of 100-1000, or set block_cycles to -1 to disable block-level + // wear-leveling. + LFS_ASSERT(lfs->cfg->block_cycles != 0); + + // check that compact_thresh makes sense + // + // metadata can't be compacted below block_size/2, and metadata can't + // exceed a block_size + LFS_ASSERT(lfs->cfg->compact_thresh == 0 + || lfs->cfg->compact_thresh >= lfs->cfg->block_size/2); + LFS_ASSERT(lfs->cfg->compact_thresh == (lfs_size_t)-1 + || lfs->cfg->compact_thresh <= lfs->cfg->block_size); + + // setup read cache + if (lfs->cfg->read_buffer) { + lfs->rcache.buffer = lfs->cfg->read_buffer; + } else { + lfs->rcache.buffer = lfs_malloc(lfs->cfg->cache_size); + if (!lfs->rcache.buffer) { + err = LFS_ERR_NOMEM; + goto cleanup; + } + } + + // setup program cache + if (lfs->cfg->prog_buffer) { + lfs->pcache.buffer = lfs->cfg->prog_buffer; + } else { + lfs->pcache.buffer = lfs_malloc(lfs->cfg->cache_size); + if (!lfs->pcache.buffer) { + err = LFS_ERR_NOMEM; + goto cleanup; + } + } + + // zero to avoid information leaks + lfs_cache_zero(lfs, &lfs->rcache); + lfs_cache_zero(lfs, &lfs->pcache); + + // setup lookahead buffer, note mount finishes initializing this after + // we establish a decent pseudo-random seed + LFS_ASSERT(lfs->cfg->lookahead_size > 0); + if (lfs->cfg->lookahead_buffer) { + lfs->lookahead.buffer = lfs->cfg->lookahead_buffer; + } else { + lfs->lookahead.buffer = lfs_malloc(lfs->cfg->lookahead_size); + if (!lfs->lookahead.buffer) { + err = LFS_ERR_NOMEM; + goto cleanup; + } + } + + // check that the size limits are sane + LFS_ASSERT(lfs->cfg->name_max <= LFS_NAME_MAX); + lfs->name_max = lfs->cfg->name_max; + if (!lfs->name_max) { + lfs->name_max = LFS_NAME_MAX; + } + + LFS_ASSERT(lfs->cfg->file_max <= LFS_FILE_MAX); + lfs->file_max = lfs->cfg->file_max; + if (!lfs->file_max) { + lfs->file_max = LFS_FILE_MAX; + } + + LFS_ASSERT(lfs->cfg->attr_max <= LFS_ATTR_MAX); + lfs->attr_max = lfs->cfg->attr_max; + if (!lfs->attr_max) { + lfs->attr_max = LFS_ATTR_MAX; + } + + LFS_ASSERT(lfs->cfg->metadata_max <= lfs->cfg->block_size); + + LFS_ASSERT(lfs->cfg->inline_max == (lfs_size_t)-1 + || lfs->cfg->inline_max <= lfs->cfg->cache_size); + LFS_ASSERT(lfs->cfg->inline_max == (lfs_size_t)-1 + || lfs->cfg->inline_max <= lfs->attr_max); + LFS_ASSERT(lfs->cfg->inline_max == (lfs_size_t)-1 + || lfs->cfg->inline_max <= ((lfs->cfg->metadata_max) + ? lfs->cfg->metadata_max + : lfs->cfg->block_size)/8); + lfs->inline_max = lfs->cfg->inline_max; + if (lfs->inline_max == (lfs_size_t)-1) { + lfs->inline_max = 0; + } else if (lfs->inline_max == 0) { + lfs->inline_max = lfs_min( + lfs->cfg->cache_size, + lfs_min( + lfs->attr_max, + ((lfs->cfg->metadata_max) + ? lfs->cfg->metadata_max + : lfs->cfg->block_size)/8)); + } + + // setup default state + lfs->root[0] = LFS_BLOCK_NULL; + lfs->root[1] = LFS_BLOCK_NULL; + lfs->mlist = NULL; + lfs->seed = 0; + lfs->gdisk = (lfs_gstate_t){0}; + lfs->gstate = (lfs_gstate_t){0}; + lfs->gdelta = (lfs_gstate_t){0}; +#ifdef LFS_MIGRATE + lfs->lfs1 = NULL; +#endif + + return 0; + +cleanup: + lfs_deinit(lfs); + return err; +} + +static int lfs_deinit(lfs_t *lfs) { + // free allocated memory + if (!lfs->cfg->read_buffer) { + lfs_free(lfs->rcache.buffer); + } + + if (!lfs->cfg->prog_buffer) { + lfs_free(lfs->pcache.buffer); + } + + if (!lfs->cfg->lookahead_buffer) { + lfs_free(lfs->lookahead.buffer); + } + + return 0; +} + + + +#ifndef LFS_READONLY +static int lfs_format_(lfs_t *lfs, const struct lfs_config *cfg) { + int err = 0; + { + err = lfs_init(lfs, cfg); + if (err) { + return err; + } + + LFS_ASSERT(cfg->block_count != 0); + + // create free lookahead + memset(lfs->lookahead.buffer, 0, lfs->cfg->lookahead_size); + lfs->lookahead.start = 0; + lfs->lookahead.size = lfs_min(8*lfs->cfg->lookahead_size, + lfs->block_count); + lfs->lookahead.next = 0; + lfs_alloc_ckpoint(lfs); + + // create root dir + lfs_mdir_t root; + err = lfs_dir_alloc(lfs, &root); + if (err) { + goto cleanup; + } + + // write one superblock + lfs_superblock_t superblock = { + .version = lfs_fs_disk_version(lfs), + .block_size = lfs->cfg->block_size, + .block_count = lfs->block_count, + .name_max = lfs->name_max, + .file_max = lfs->file_max, + .attr_max = lfs->attr_max, + }; + + lfs_superblock_tole32(&superblock); + err = lfs_dir_commit(lfs, &root, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_CREATE, 0, 0), NULL}, + {LFS_MKTAG(LFS_TYPE_SUPERBLOCK, 0, 8), "littlefs"}, + {LFS_MKTAG(LFS_TYPE_INLINESTRUCT, 0, sizeof(superblock)), + &superblock})); + if (err) { + goto cleanup; + } + + // force compaction to prevent accidentally mounting any + // older version of littlefs that may live on disk + root.erased = false; + err = lfs_dir_commit(lfs, &root, NULL, 0); + if (err) { + goto cleanup; + } + + // sanity check that fetch works + err = lfs_dir_fetch(lfs, &root, (const lfs_block_t[2]){0, 1}); + if (err) { + goto cleanup; + } + } + +cleanup: + lfs_deinit(lfs); + return err; + +} +#endif + +static int lfs_mount_(lfs_t *lfs, const struct lfs_config *cfg) { + int err = lfs_init(lfs, cfg); + if (err) { + return err; + } + + // scan directory blocks for superblock and any global updates + lfs_mdir_t dir = {.tail = {0, 1}}; + lfs_block_t tortoise[2] = {LFS_BLOCK_NULL, LFS_BLOCK_NULL}; + lfs_size_t tortoise_i = 1; + lfs_size_t tortoise_period = 1; + while (!lfs_pair_isnull(dir.tail)) { + // detect cycles with Brent's algorithm + if (lfs_pair_issync(dir.tail, tortoise)) { + LFS_WARN("Cycle detected in tail list"); + err = LFS_ERR_CORRUPT; + goto cleanup; + } + if (tortoise_i == tortoise_period) { + tortoise[0] = dir.tail[0]; + tortoise[1] = dir.tail[1]; + tortoise_i = 0; + tortoise_period *= 2; + } + tortoise_i += 1; + + // fetch next block in tail list + lfs_stag_t tag = lfs_dir_fetchmatch(lfs, &dir, dir.tail, + LFS_MKTAG(0x7ff, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_SUPERBLOCK, 0, 8), + NULL, + lfs_dir_find_match, &(struct lfs_dir_find_match){ + lfs, "littlefs", 8}); + if (tag < 0) { + err = tag; + goto cleanup; + } + + // has superblock? + if (tag && !lfs_tag_isdelete(tag)) { + // update root + lfs->root[0] = dir.pair[0]; + lfs->root[1] = dir.pair[1]; + + // grab superblock + lfs_superblock_t superblock; + tag = lfs_dir_get(lfs, &dir, LFS_MKTAG(0x7ff, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_INLINESTRUCT, 0, sizeof(superblock)), + &superblock); + if (tag < 0) { + err = tag; + goto cleanup; + } + lfs_superblock_fromle32(&superblock); + + // check version + uint16_t major_version = (0xffff & (superblock.version >> 16)); + uint16_t minor_version = (0xffff & (superblock.version >> 0)); + if (major_version != lfs_fs_disk_version_major(lfs) + || minor_version > lfs_fs_disk_version_minor(lfs)) { + LFS_ERROR("Invalid version " + "v%"PRIu16".%"PRIu16" != v%"PRIu16".%"PRIu16, + major_version, + minor_version, + lfs_fs_disk_version_major(lfs), + lfs_fs_disk_version_minor(lfs)); + err = LFS_ERR_INVAL; + goto cleanup; + } + + // found older minor version? set an in-device only bit in the + // gstate so we know we need to rewrite the superblock before + // the first write + bool needssuperblock = false; + if (minor_version < lfs_fs_disk_version_minor(lfs)) { + LFS_DEBUG("Found older minor version " + "v%"PRIu16".%"PRIu16" < v%"PRIu16".%"PRIu16, + major_version, + minor_version, + lfs_fs_disk_version_major(lfs), + lfs_fs_disk_version_minor(lfs)); + needssuperblock = true; + } + // note this bit is reserved on disk, so fetching more gstate + // will not interfere here + lfs_fs_prepsuperblock(lfs, needssuperblock); + + // check superblock configuration + if (superblock.name_max) { + if (superblock.name_max > lfs->name_max) { + LFS_ERROR("Unsupported name_max (%"PRIu32" > %"PRIu32")", + superblock.name_max, lfs->name_max); + err = LFS_ERR_INVAL; + goto cleanup; + } + + lfs->name_max = superblock.name_max; + } + + if (superblock.file_max) { + if (superblock.file_max > lfs->file_max) { + LFS_ERROR("Unsupported file_max (%"PRIu32" > %"PRIu32")", + superblock.file_max, lfs->file_max); + err = LFS_ERR_INVAL; + goto cleanup; + } + + lfs->file_max = superblock.file_max; + } + + if (superblock.attr_max) { + if (superblock.attr_max > lfs->attr_max) { + LFS_ERROR("Unsupported attr_max (%"PRIu32" > %"PRIu32")", + superblock.attr_max, lfs->attr_max); + err = LFS_ERR_INVAL; + goto cleanup; + } + + lfs->attr_max = superblock.attr_max; + + // we also need to update inline_max in case attr_max changed + lfs->inline_max = lfs_min(lfs->inline_max, lfs->attr_max); + } + + // this is where we get the block_count from disk if block_count=0 + if (lfs->cfg->block_count + && superblock.block_count != lfs->cfg->block_count) { + LFS_ERROR("Invalid block count (%"PRIu32" != %"PRIu32")", + superblock.block_count, lfs->cfg->block_count); + err = LFS_ERR_INVAL; + goto cleanup; + } + + lfs->block_count = superblock.block_count; + + if (superblock.block_size != lfs->cfg->block_size) { + LFS_ERROR("Invalid block size (%"PRIu32" != %"PRIu32")", + superblock.block_size, lfs->cfg->block_size); + err = LFS_ERR_INVAL; + goto cleanup; + } + } + + // has gstate? + err = lfs_dir_getgstate(lfs, &dir, &lfs->gstate); + if (err) { + goto cleanup; + } + } + + // update littlefs with gstate + if (!lfs_gstate_iszero(&lfs->gstate)) { + LFS_DEBUG("Found pending gstate 0x%08"PRIx32"%08"PRIx32"%08"PRIx32, + lfs->gstate.tag, + lfs->gstate.pair[0], + lfs->gstate.pair[1]); + } + lfs->gstate.tag += !lfs_tag_isvalid(lfs->gstate.tag); + lfs->gdisk = lfs->gstate; + + // setup free lookahead, to distribute allocations uniformly across + // boots, we start the allocator at a random location + lfs->lookahead.start = lfs->seed % lfs->block_count; + lfs_alloc_drop(lfs); + + return 0; + +cleanup: + lfs_unmount_(lfs); + return err; +} + +static int lfs_unmount_(lfs_t *lfs) { + return lfs_deinit(lfs); +} + + +/// Filesystem filesystem operations /// +static int lfs_fs_stat_(lfs_t *lfs, struct lfs_fsinfo *fsinfo) { + // if the superblock is up-to-date, we must be on the most recent + // minor version of littlefs + if (!lfs_gstate_needssuperblock(&lfs->gstate)) { + fsinfo->disk_version = lfs_fs_disk_version(lfs); + + // otherwise we need to read the minor version on disk + } else { + // fetch the superblock + lfs_mdir_t dir; + int err = lfs_dir_fetch(lfs, &dir, lfs->root); + if (err) { + return err; + } + + lfs_superblock_t superblock; + lfs_stag_t tag = lfs_dir_get(lfs, &dir, LFS_MKTAG(0x7ff, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_INLINESTRUCT, 0, sizeof(superblock)), + &superblock); + if (tag < 0) { + return tag; + } + lfs_superblock_fromle32(&superblock); + + // read the on-disk version + fsinfo->disk_version = superblock.version; + } + + // filesystem geometry + fsinfo->block_size = lfs->cfg->block_size; + fsinfo->block_count = lfs->block_count; + + // other on-disk configuration, we cache all of these for internal use + fsinfo->name_max = lfs->name_max; + fsinfo->file_max = lfs->file_max; + fsinfo->attr_max = lfs->attr_max; + + return 0; +} + +int lfs_fs_traverse_(lfs_t *lfs, + int (*cb)(void *data, lfs_block_t block), void *data, + bool includeorphans) { + // iterate over metadata pairs + lfs_mdir_t dir = {.tail = {0, 1}}; + +#ifdef LFS_MIGRATE + // also consider v1 blocks during migration + if (lfs->lfs1) { + int err = lfs1_traverse(lfs, cb, data); + if (err) { + return err; + } + + dir.tail[0] = lfs->root[0]; + dir.tail[1] = lfs->root[1]; + } +#endif + + lfs_block_t tortoise[2] = {LFS_BLOCK_NULL, LFS_BLOCK_NULL}; + lfs_size_t tortoise_i = 1; + lfs_size_t tortoise_period = 1; + while (!lfs_pair_isnull(dir.tail)) { + // detect cycles with Brent's algorithm + if (lfs_pair_issync(dir.tail, tortoise)) { + LFS_WARN("Cycle detected in tail list"); + return LFS_ERR_CORRUPT; + } + if (tortoise_i == tortoise_period) { + tortoise[0] = dir.tail[0]; + tortoise[1] = dir.tail[1]; + tortoise_i = 0; + tortoise_period *= 2; + } + tortoise_i += 1; + + for (int i = 0; i < 2; i++) { + int err = cb(data, dir.tail[i]); + if (err) { + return err; + } + } + + // iterate through ids in directory + int err = lfs_dir_fetch(lfs, &dir, dir.tail); + if (err) { + return err; + } + + for (uint16_t id = 0; id < dir.count; id++) { + struct lfs_ctz ctz; + lfs_stag_t tag = lfs_dir_get(lfs, &dir, LFS_MKTAG(0x700, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_STRUCT, id, sizeof(ctz)), &ctz); + if (tag < 0) { + if (tag == LFS_ERR_NOENT) { + continue; + } + return tag; + } + lfs_ctz_fromle32(&ctz); + + if (lfs_tag_type3(tag) == LFS_TYPE_CTZSTRUCT) { + err = lfs_ctz_traverse(lfs, NULL, &lfs->rcache, + ctz.head, ctz.size, cb, data); + if (err) { + return err; + } + } else if (includeorphans && + lfs_tag_type3(tag) == LFS_TYPE_DIRSTRUCT) { + for (int i = 0; i < 2; i++) { + err = cb(data, (&ctz.head)[i]); + if (err) { + return err; + } + } + } + } + } + +#ifndef LFS_READONLY + // iterate over any open files + for (lfs_file_t *f = (lfs_file_t*)lfs->mlist; f; f = f->next) { + if (f->type != LFS_TYPE_REG) { + continue; + } + + if ((f->flags & LFS_F_DIRTY) && !(f->flags & LFS_F_INLINE)) { + int err = lfs_ctz_traverse(lfs, &f->cache, &lfs->rcache, + f->ctz.head, f->ctz.size, cb, data); + if (err) { + return err; + } + } + + if ((f->flags & LFS_F_WRITING) && !(f->flags & LFS_F_INLINE)) { + int err = lfs_ctz_traverse(lfs, &f->cache, &lfs->rcache, + f->block, f->pos, cb, data); + if (err) { + return err; + } + } + } +#endif + + return 0; +} + +#ifndef LFS_READONLY +static int lfs_fs_pred(lfs_t *lfs, + const lfs_block_t pair[2], lfs_mdir_t *pdir) { + // iterate over all directory directory entries + pdir->tail[0] = 0; + pdir->tail[1] = 1; + lfs_block_t tortoise[2] = {LFS_BLOCK_NULL, LFS_BLOCK_NULL}; + lfs_size_t tortoise_i = 1; + lfs_size_t tortoise_period = 1; + while (!lfs_pair_isnull(pdir->tail)) { + // detect cycles with Brent's algorithm + if (lfs_pair_issync(pdir->tail, tortoise)) { + LFS_WARN("Cycle detected in tail list"); + return LFS_ERR_CORRUPT; + } + if (tortoise_i == tortoise_period) { + tortoise[0] = pdir->tail[0]; + tortoise[1] = pdir->tail[1]; + tortoise_i = 0; + tortoise_period *= 2; + } + tortoise_i += 1; + + if (lfs_pair_cmp(pdir->tail, pair) == 0) { + return 0; + } + + int err = lfs_dir_fetch(lfs, pdir, pdir->tail); + if (err) { + return err; + } + } + + return LFS_ERR_NOENT; +} +#endif + +#ifndef LFS_READONLY +struct lfs_fs_parent_match { + lfs_t *lfs; + const lfs_block_t pair[2]; +}; +#endif + +#ifndef LFS_READONLY +static int lfs_fs_parent_match(void *data, + lfs_tag_t tag, const void *buffer) { + struct lfs_fs_parent_match *find = data; + lfs_t *lfs = find->lfs; + const struct lfs_diskoff *disk = buffer; + (void)tag; + + lfs_block_t child[2]; + int err = lfs_bd_read(lfs, + &lfs->pcache, &lfs->rcache, lfs->cfg->block_size, + disk->block, disk->off, &child, sizeof(child)); + if (err) { + return err; + } + + lfs_pair_fromle32(child); + return (lfs_pair_cmp(child, find->pair) == 0) ? LFS_CMP_EQ : LFS_CMP_LT; +} +#endif + +#ifndef LFS_READONLY +static lfs_stag_t lfs_fs_parent(lfs_t *lfs, const lfs_block_t pair[2], + lfs_mdir_t *parent) { + // use fetchmatch with callback to find pairs + parent->tail[0] = 0; + parent->tail[1] = 1; + lfs_block_t tortoise[2] = {LFS_BLOCK_NULL, LFS_BLOCK_NULL}; + lfs_size_t tortoise_i = 1; + lfs_size_t tortoise_period = 1; + while (!lfs_pair_isnull(parent->tail)) { + // detect cycles with Brent's algorithm + if (lfs_pair_issync(parent->tail, tortoise)) { + LFS_WARN("Cycle detected in tail list"); + return LFS_ERR_CORRUPT; + } + if (tortoise_i == tortoise_period) { + tortoise[0] = parent->tail[0]; + tortoise[1] = parent->tail[1]; + tortoise_i = 0; + tortoise_period *= 2; + } + tortoise_i += 1; + + lfs_stag_t tag = lfs_dir_fetchmatch(lfs, parent, parent->tail, + LFS_MKTAG(0x7ff, 0, 0x3ff), + LFS_MKTAG(LFS_TYPE_DIRSTRUCT, 0, 8), + NULL, + lfs_fs_parent_match, &(struct lfs_fs_parent_match){ + lfs, {pair[0], pair[1]}}); + if (tag && tag != LFS_ERR_NOENT) { + return tag; + } + } + + return LFS_ERR_NOENT; +} +#endif + +static void lfs_fs_prepsuperblock(lfs_t *lfs, bool needssuperblock) { + lfs->gstate.tag = (lfs->gstate.tag & ~LFS_MKTAG(0, 0, 0x200)) + | (uint32_t)needssuperblock << 9; +} + +#ifndef LFS_READONLY +static int lfs_fs_preporphans(lfs_t *lfs, int8_t orphans) { + LFS_ASSERT(lfs_tag_size(lfs->gstate.tag) > 0x000 || orphans >= 0); + LFS_ASSERT(lfs_tag_size(lfs->gstate.tag) < 0x1ff || orphans <= 0); + lfs->gstate.tag += orphans; + lfs->gstate.tag = ((lfs->gstate.tag & ~LFS_MKTAG(0x800, 0, 0)) | + ((uint32_t)lfs_gstate_hasorphans(&lfs->gstate) << 31)); + + return 0; +} +#endif + +#ifndef LFS_READONLY +static void lfs_fs_prepmove(lfs_t *lfs, + uint16_t id, const lfs_block_t pair[2]) { + lfs->gstate.tag = ((lfs->gstate.tag & ~LFS_MKTAG(0x7ff, 0x3ff, 0)) | + ((id != 0x3ff) ? LFS_MKTAG(LFS_TYPE_DELETE, id, 0) : 0)); + lfs->gstate.pair[0] = (id != 0x3ff) ? pair[0] : 0; + lfs->gstate.pair[1] = (id != 0x3ff) ? pair[1] : 0; +} +#endif + +#ifndef LFS_READONLY +static int lfs_fs_desuperblock(lfs_t *lfs) { + if (!lfs_gstate_needssuperblock(&lfs->gstate)) { + return 0; + } + + LFS_DEBUG("Rewriting superblock {0x%"PRIx32", 0x%"PRIx32"}", + lfs->root[0], + lfs->root[1]); + + lfs_mdir_t root; + int err = lfs_dir_fetch(lfs, &root, lfs->root); + if (err) { + return err; + } + + // write a new superblock + lfs_superblock_t superblock = { + .version = lfs_fs_disk_version(lfs), + .block_size = lfs->cfg->block_size, + .block_count = lfs->block_count, + .name_max = lfs->name_max, + .file_max = lfs->file_max, + .attr_max = lfs->attr_max, + }; + + lfs_superblock_tole32(&superblock); + err = lfs_dir_commit(lfs, &root, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_INLINESTRUCT, 0, sizeof(superblock)), + &superblock})); + if (err) { + return err; + } + + lfs_fs_prepsuperblock(lfs, false); + return 0; +} +#endif + +#ifndef LFS_READONLY +static int lfs_fs_demove(lfs_t *lfs) { + if (!lfs_gstate_hasmove(&lfs->gdisk)) { + return 0; + } + + // Fix bad moves + LFS_DEBUG("Fixing move {0x%"PRIx32", 0x%"PRIx32"} 0x%"PRIx16, + lfs->gdisk.pair[0], + lfs->gdisk.pair[1], + lfs_tag_id(lfs->gdisk.tag)); + + // no other gstate is supported at this time, so if we found something else + // something most likely went wrong in gstate calculation + LFS_ASSERT(lfs_tag_type3(lfs->gdisk.tag) == LFS_TYPE_DELETE); + + // fetch and delete the moved entry + lfs_mdir_t movedir; + int err = lfs_dir_fetch(lfs, &movedir, lfs->gdisk.pair); + if (err) { + return err; + } + + // prep gstate and delete move id + uint16_t moveid = lfs_tag_id(lfs->gdisk.tag); + lfs_fs_prepmove(lfs, 0x3ff, NULL); + err = lfs_dir_commit(lfs, &movedir, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_DELETE, moveid, 0), NULL})); + if (err) { + return err; + } + + return 0; +} +#endif + +#ifndef LFS_READONLY +static int lfs_fs_deorphan(lfs_t *lfs, bool powerloss) { + if (!lfs_gstate_hasorphans(&lfs->gstate)) { + return 0; + } + + // Check for orphans in two separate passes: + // - 1 for half-orphans (relocations) + // - 2 for full-orphans (removes/renames) + // + // Two separate passes are needed as half-orphans can contain outdated + // references to full-orphans, effectively hiding them from the deorphan + // search. + // + int pass = 0; + while (pass < 2) { + // Fix any orphans + lfs_mdir_t pdir = {.split = true, .tail = {0, 1}}; + lfs_mdir_t dir; + bool moreorphans = false; + + // iterate over all directory directory entries + while (!lfs_pair_isnull(pdir.tail)) { + int err = lfs_dir_fetch(lfs, &dir, pdir.tail); + if (err) { + return err; + } + + // check head blocks for orphans + if (!pdir.split) { + // check if we have a parent + lfs_mdir_t parent; + lfs_stag_t tag = lfs_fs_parent(lfs, pdir.tail, &parent); + if (tag < 0 && tag != LFS_ERR_NOENT) { + return tag; + } + + if (pass == 0 && tag != LFS_ERR_NOENT) { + lfs_block_t pair[2]; + lfs_stag_t state = lfs_dir_get(lfs, &parent, + LFS_MKTAG(0x7ff, 0x3ff, 0), tag, pair); + if (state < 0) { + return state; + } + lfs_pair_fromle32(pair); + + if (!lfs_pair_issync(pair, pdir.tail)) { + // we have desynced + LFS_DEBUG("Fixing half-orphan " + "{0x%"PRIx32", 0x%"PRIx32"} " + "-> {0x%"PRIx32", 0x%"PRIx32"}", + pdir.tail[0], pdir.tail[1], pair[0], pair[1]); + + // fix pending move in this pair? this looks like an + // optimization but is in fact _required_ since + // relocating may outdate the move. + uint16_t moveid = 0x3ff; + if (lfs_gstate_hasmovehere(&lfs->gstate, pdir.pair)) { + moveid = lfs_tag_id(lfs->gstate.tag); + LFS_DEBUG("Fixing move while fixing orphans " + "{0x%"PRIx32", 0x%"PRIx32"} 0x%"PRIx16"\n", + pdir.pair[0], pdir.pair[1], moveid); + lfs_fs_prepmove(lfs, 0x3ff, NULL); + } + + lfs_pair_tole32(pair); + state = lfs_dir_orphaningcommit(lfs, &pdir, LFS_MKATTRS( + {LFS_MKTAG_IF(moveid != 0x3ff, + LFS_TYPE_DELETE, moveid, 0), NULL}, + {LFS_MKTAG(LFS_TYPE_SOFTTAIL, 0x3ff, 8), + pair})); + lfs_pair_fromle32(pair); + if (state < 0) { + return state; + } + + // did our commit create more orphans? + if (state == LFS_OK_ORPHANED) { + moreorphans = true; + } + + // refetch tail + continue; + } + } + + // note we only check for full orphans if we may have had a + // power-loss, otherwise orphans are created intentionally + // during operations such as lfs_mkdir + if (pass == 1 && tag == LFS_ERR_NOENT && powerloss) { + // we are an orphan + LFS_DEBUG("Fixing orphan {0x%"PRIx32", 0x%"PRIx32"}", + pdir.tail[0], pdir.tail[1]); + + // steal state + err = lfs_dir_getgstate(lfs, &dir, &lfs->gdelta); + if (err) { + return err; + } + + // steal tail + lfs_pair_tole32(dir.tail); + int state = lfs_dir_orphaningcommit(lfs, &pdir, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_TAIL + dir.split, 0x3ff, 8), + dir.tail})); + lfs_pair_fromle32(dir.tail); + if (state < 0) { + return state; + } + + // did our commit create more orphans? + if (state == LFS_OK_ORPHANED) { + moreorphans = true; + } + + // refetch tail + continue; + } + } + + pdir = dir; + } + + pass = moreorphans ? 0 : pass+1; + } + + // mark orphans as fixed + return lfs_fs_preporphans(lfs, -lfs_gstate_getorphans(&lfs->gstate)); +} +#endif + +#ifndef LFS_READONLY +static int lfs_fs_forceconsistency(lfs_t *lfs) { + int err = lfs_fs_desuperblock(lfs); + if (err) { + return err; + } + + err = lfs_fs_demove(lfs); + if (err) { + return err; + } + + err = lfs_fs_deorphan(lfs, true); + if (err) { + return err; + } + + return 0; +} +#endif + +#ifndef LFS_READONLY +static int lfs_fs_mkconsistent_(lfs_t *lfs) { + // lfs_fs_forceconsistency does most of the work here + int err = lfs_fs_forceconsistency(lfs); + if (err) { + return err; + } + + // do we have any pending gstate? + lfs_gstate_t delta = {0}; + lfs_gstate_xor(&delta, &lfs->gdisk); + lfs_gstate_xor(&delta, &lfs->gstate); + if (!lfs_gstate_iszero(&delta)) { + // lfs_dir_commit will implicitly write out any pending gstate + lfs_mdir_t root; + err = lfs_dir_fetch(lfs, &root, lfs->root); + if (err) { + return err; + } + + err = lfs_dir_commit(lfs, &root, NULL, 0); + if (err) { + return err; + } + } + + return 0; +} +#endif + +static int lfs_fs_size_count(void *p, lfs_block_t block) { + (void)block; + lfs_size_t *size = p; + *size += 1; + return 0; +} + +static lfs_ssize_t lfs_fs_size_(lfs_t *lfs) { + lfs_size_t size = 0; + int err = lfs_fs_traverse_(lfs, lfs_fs_size_count, &size, false); + if (err) { + return err; + } + + return size; +} + +// explicit garbage collection +#ifndef LFS_READONLY +static int lfs_fs_gc_(lfs_t *lfs) { + // force consistency, even if we're not necessarily going to write, + // because this function is supposed to take care of janitorial work + // isn't it? + int err = lfs_fs_forceconsistency(lfs); + if (err) { + return err; + } + + // try to compact metadata pairs, note we can't really accomplish + // anything if compact_thresh doesn't at least leave a prog_size + // available + if (lfs->cfg->compact_thresh + < lfs->cfg->block_size - lfs->cfg->prog_size) { + // iterate over all mdirs + lfs_mdir_t mdir = {.tail = {0, 1}}; + while (!lfs_pair_isnull(mdir.tail)) { + err = lfs_dir_fetch(lfs, &mdir, mdir.tail); + if (err) { + return err; + } + + // not erased? exceeds our compaction threshold? + if (!mdir.erased || ((lfs->cfg->compact_thresh == 0) + ? mdir.off > lfs->cfg->block_size - lfs->cfg->block_size/8 + : mdir.off > lfs->cfg->compact_thresh)) { + // the easiest way to trigger a compaction is to mark + // the mdir as unerased and add an empty commit + mdir.erased = false; + err = lfs_dir_commit(lfs, &mdir, NULL, 0); + if (err) { + return err; + } + } + } + } + + // try to populate the lookahead buffer, unless it's already full + if (lfs->lookahead.size < 8*lfs->cfg->lookahead_size) { + err = lfs_alloc_scan(lfs); + if (err) { + return err; + } + } + + return 0; +} +#endif + +#ifndef LFS_READONLY +static int lfs_fs_grow_(lfs_t *lfs, lfs_size_t block_count) { + // shrinking is not supported + LFS_ASSERT(block_count >= lfs->block_count); + + if (block_count > lfs->block_count) { + lfs->block_count = block_count; + + // fetch the root + lfs_mdir_t root; + int err = lfs_dir_fetch(lfs, &root, lfs->root); + if (err) { + return err; + } + + // update the superblock + lfs_superblock_t superblock; + lfs_stag_t tag = lfs_dir_get(lfs, &root, LFS_MKTAG(0x7ff, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_INLINESTRUCT, 0, sizeof(superblock)), + &superblock); + if (tag < 0) { + return tag; + } + lfs_superblock_fromle32(&superblock); + + superblock.block_count = lfs->block_count; + + lfs_superblock_tole32(&superblock); + err = lfs_dir_commit(lfs, &root, LFS_MKATTRS( + {tag, &superblock})); + if (err) { + return err; + } + } + + return 0; +} +#endif + +#ifdef LFS_MIGRATE +////// Migration from littelfs v1 below this ////// + +/// Version info /// + +// Software library version +// Major (top-nibble), incremented on backwards incompatible changes +// Minor (bottom-nibble), incremented on feature additions +#define LFS1_VERSION 0x00010007 +#define LFS1_VERSION_MAJOR (0xffff & (LFS1_VERSION >> 16)) +#define LFS1_VERSION_MINOR (0xffff & (LFS1_VERSION >> 0)) + +// Version of On-disk data structures +// Major (top-nibble), incremented on backwards incompatible changes +// Minor (bottom-nibble), incremented on feature additions +#define LFS1_DISK_VERSION 0x00010001 +#define LFS1_DISK_VERSION_MAJOR (0xffff & (LFS1_DISK_VERSION >> 16)) +#define LFS1_DISK_VERSION_MINOR (0xffff & (LFS1_DISK_VERSION >> 0)) + + +/// v1 Definitions /// + +// File types +enum lfs1_type { + LFS1_TYPE_REG = 0x11, + LFS1_TYPE_DIR = 0x22, + LFS1_TYPE_SUPERBLOCK = 0x2e, +}; + +typedef struct lfs1 { + lfs_block_t root[2]; +} lfs1_t; + +typedef struct lfs1_entry { + lfs_off_t off; + + struct lfs1_disk_entry { + uint8_t type; + uint8_t elen; + uint8_t alen; + uint8_t nlen; + union { + struct { + lfs_block_t head; + lfs_size_t size; + } file; + lfs_block_t dir[2]; + } u; + } d; +} lfs1_entry_t; + +typedef struct lfs1_dir { + struct lfs1_dir *next; + lfs_block_t pair[2]; + lfs_off_t off; + + lfs_block_t head[2]; + lfs_off_t pos; + + struct lfs1_disk_dir { + uint32_t rev; + lfs_size_t size; + lfs_block_t tail[2]; + } d; +} lfs1_dir_t; + +typedef struct lfs1_superblock { + lfs_off_t off; + + struct lfs1_disk_superblock { + uint8_t type; + uint8_t elen; + uint8_t alen; + uint8_t nlen; + lfs_block_t root[2]; + uint32_t block_size; + uint32_t block_count; + uint32_t version; + char magic[8]; + } d; +} lfs1_superblock_t; + + +/// Low-level wrappers v1->v2 /// +static void lfs1_crc(uint32_t *crc, const void *buffer, size_t size) { + *crc = lfs_crc(*crc, buffer, size); +} + +static int lfs1_bd_read(lfs_t *lfs, lfs_block_t block, + lfs_off_t off, void *buffer, lfs_size_t size) { + // if we ever do more than writes to alternating pairs, + // this may need to consider pcache + return lfs_bd_read(lfs, &lfs->pcache, &lfs->rcache, size, + block, off, buffer, size); +} + +static int lfs1_bd_crc(lfs_t *lfs, lfs_block_t block, + lfs_off_t off, lfs_size_t size, uint32_t *crc) { + for (lfs_off_t i = 0; i < size; i++) { + uint8_t c; + int err = lfs1_bd_read(lfs, block, off+i, &c, 1); + if (err) { + return err; + } + + lfs1_crc(crc, &c, 1); + } + + return 0; +} + + +/// Endian swapping functions /// +static void lfs1_dir_fromle32(struct lfs1_disk_dir *d) { + d->rev = lfs_fromle32(d->rev); + d->size = lfs_fromle32(d->size); + d->tail[0] = lfs_fromle32(d->tail[0]); + d->tail[1] = lfs_fromle32(d->tail[1]); +} + +static void lfs1_dir_tole32(struct lfs1_disk_dir *d) { + d->rev = lfs_tole32(d->rev); + d->size = lfs_tole32(d->size); + d->tail[0] = lfs_tole32(d->tail[0]); + d->tail[1] = lfs_tole32(d->tail[1]); +} + +static void lfs1_entry_fromle32(struct lfs1_disk_entry *d) { + d->u.dir[0] = lfs_fromle32(d->u.dir[0]); + d->u.dir[1] = lfs_fromle32(d->u.dir[1]); +} + +static void lfs1_entry_tole32(struct lfs1_disk_entry *d) { + d->u.dir[0] = lfs_tole32(d->u.dir[0]); + d->u.dir[1] = lfs_tole32(d->u.dir[1]); +} + +static void lfs1_superblock_fromle32(struct lfs1_disk_superblock *d) { + d->root[0] = lfs_fromle32(d->root[0]); + d->root[1] = lfs_fromle32(d->root[1]); + d->block_size = lfs_fromle32(d->block_size); + d->block_count = lfs_fromle32(d->block_count); + d->version = lfs_fromle32(d->version); +} + + +///// Metadata pair and directory operations /// +static inline lfs_size_t lfs1_entry_size(const lfs1_entry_t *entry) { + return 4 + entry->d.elen + entry->d.alen + entry->d.nlen; +} + +static int lfs1_dir_fetch(lfs_t *lfs, + lfs1_dir_t *dir, const lfs_block_t pair[2]) { + // copy out pair, otherwise may be aliasing dir + const lfs_block_t tpair[2] = {pair[0], pair[1]}; + bool valid = false; + + // check both blocks for the most recent revision + for (int i = 0; i < 2; i++) { + struct lfs1_disk_dir test; + int err = lfs1_bd_read(lfs, tpair[i], 0, &test, sizeof(test)); + lfs1_dir_fromle32(&test); + if (err) { + if (err == LFS_ERR_CORRUPT) { + continue; + } + return err; + } + + if (valid && lfs_scmp(test.rev, dir->d.rev) < 0) { + continue; + } + + if ((0x7fffffff & test.size) < sizeof(test)+4 || + (0x7fffffff & test.size) > lfs->cfg->block_size) { + continue; + } + + uint32_t crc = 0xffffffff; + lfs1_dir_tole32(&test); + lfs1_crc(&crc, &test, sizeof(test)); + lfs1_dir_fromle32(&test); + err = lfs1_bd_crc(lfs, tpair[i], sizeof(test), + (0x7fffffff & test.size) - sizeof(test), &crc); + if (err) { + if (err == LFS_ERR_CORRUPT) { + continue; + } + return err; + } + + if (crc != 0) { + continue; + } + + valid = true; + + // setup dir in case it's valid + dir->pair[0] = tpair[(i+0) % 2]; + dir->pair[1] = tpair[(i+1) % 2]; + dir->off = sizeof(dir->d); + dir->d = test; + } + + if (!valid) { + LFS_ERROR("Corrupted dir pair at {0x%"PRIx32", 0x%"PRIx32"}", + tpair[0], tpair[1]); + return LFS_ERR_CORRUPT; + } + + return 0; +} + +static int lfs1_dir_next(lfs_t *lfs, lfs1_dir_t *dir, lfs1_entry_t *entry) { + while (dir->off + sizeof(entry->d) > (0x7fffffff & dir->d.size)-4) { + if (!(0x80000000 & dir->d.size)) { + entry->off = dir->off; + return LFS_ERR_NOENT; + } + + int err = lfs1_dir_fetch(lfs, dir, dir->d.tail); + if (err) { + return err; + } + + dir->off = sizeof(dir->d); + dir->pos += sizeof(dir->d) + 4; + } + + int err = lfs1_bd_read(lfs, dir->pair[0], dir->off, + &entry->d, sizeof(entry->d)); + lfs1_entry_fromle32(&entry->d); + if (err) { + return err; + } + + entry->off = dir->off; + dir->off += lfs1_entry_size(entry); + dir->pos += lfs1_entry_size(entry); + return 0; +} + +/// littlefs v1 specific operations /// +int lfs1_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data) { + if (lfs_pair_isnull(lfs->lfs1->root)) { + return 0; + } + + // iterate over metadata pairs + lfs1_dir_t dir; + lfs1_entry_t entry; + lfs_block_t cwd[2] = {0, 1}; + + while (true) { + for (int i = 0; i < 2; i++) { + int err = cb(data, cwd[i]); + if (err) { + return err; + } + } + + int err = lfs1_dir_fetch(lfs, &dir, cwd); + if (err) { + return err; + } + + // iterate over contents + while (dir.off + sizeof(entry.d) <= (0x7fffffff & dir.d.size)-4) { + err = lfs1_bd_read(lfs, dir.pair[0], dir.off, + &entry.d, sizeof(entry.d)); + lfs1_entry_fromle32(&entry.d); + if (err) { + return err; + } + + dir.off += lfs1_entry_size(&entry); + if ((0x70 & entry.d.type) == (0x70 & LFS1_TYPE_REG)) { + err = lfs_ctz_traverse(lfs, NULL, &lfs->rcache, + entry.d.u.file.head, entry.d.u.file.size, cb, data); + if (err) { + return err; + } + } + } + + // we also need to check if we contain a threaded v2 directory + lfs_mdir_t dir2 = {.split=true, .tail={cwd[0], cwd[1]}}; + while (dir2.split) { + err = lfs_dir_fetch(lfs, &dir2, dir2.tail); + if (err) { + break; + } + + for (int i = 0; i < 2; i++) { + err = cb(data, dir2.pair[i]); + if (err) { + return err; + } + } + } + + cwd[0] = dir.d.tail[0]; + cwd[1] = dir.d.tail[1]; + + if (lfs_pair_isnull(cwd)) { + break; + } + } + + return 0; +} + +static int lfs1_moved(lfs_t *lfs, const void *e) { + if (lfs_pair_isnull(lfs->lfs1->root)) { + return 0; + } + + // skip superblock + lfs1_dir_t cwd; + int err = lfs1_dir_fetch(lfs, &cwd, (const lfs_block_t[2]){0, 1}); + if (err) { + return err; + } + + // iterate over all directory directory entries + lfs1_entry_t entry; + while (!lfs_pair_isnull(cwd.d.tail)) { + err = lfs1_dir_fetch(lfs, &cwd, cwd.d.tail); + if (err) { + return err; + } + + while (true) { + err = lfs1_dir_next(lfs, &cwd, &entry); + if (err && err != LFS_ERR_NOENT) { + return err; + } + + if (err == LFS_ERR_NOENT) { + break; + } + + if (!(0x80 & entry.d.type) && + memcmp(&entry.d.u, e, sizeof(entry.d.u)) == 0) { + return true; + } + } + } + + return false; +} + +/// Filesystem operations /// +static int lfs1_mount(lfs_t *lfs, struct lfs1 *lfs1, + const struct lfs_config *cfg) { + int err = 0; + { + err = lfs_init(lfs, cfg); + if (err) { + return err; + } + + lfs->lfs1 = lfs1; + lfs->lfs1->root[0] = LFS_BLOCK_NULL; + lfs->lfs1->root[1] = LFS_BLOCK_NULL; + + // setup free lookahead + lfs->lookahead.start = 0; + lfs->lookahead.size = 0; + lfs->lookahead.next = 0; + lfs_alloc_ckpoint(lfs); + + // load superblock + lfs1_dir_t dir; + lfs1_superblock_t superblock; + err = lfs1_dir_fetch(lfs, &dir, (const lfs_block_t[2]){0, 1}); + if (err && err != LFS_ERR_CORRUPT) { + goto cleanup; + } + + if (!err) { + err = lfs1_bd_read(lfs, dir.pair[0], sizeof(dir.d), + &superblock.d, sizeof(superblock.d)); + lfs1_superblock_fromle32(&superblock.d); + if (err) { + goto cleanup; + } + + lfs->lfs1->root[0] = superblock.d.root[0]; + lfs->lfs1->root[1] = superblock.d.root[1]; + } + + if (err || memcmp(superblock.d.magic, "littlefs", 8) != 0) { + LFS_ERROR("Invalid superblock at {0x%"PRIx32", 0x%"PRIx32"}", + 0, 1); + err = LFS_ERR_CORRUPT; + goto cleanup; + } + + uint16_t major_version = (0xffff & (superblock.d.version >> 16)); + uint16_t minor_version = (0xffff & (superblock.d.version >> 0)); + if ((major_version != LFS1_DISK_VERSION_MAJOR || + minor_version > LFS1_DISK_VERSION_MINOR)) { + LFS_ERROR("Invalid version v%d.%d", major_version, minor_version); + err = LFS_ERR_INVAL; + goto cleanup; + } + + return 0; + } + +cleanup: + lfs_deinit(lfs); + return err; +} + +static int lfs1_unmount(lfs_t *lfs) { + return lfs_deinit(lfs); +} + +/// v1 migration /// +static int lfs_migrate_(lfs_t *lfs, const struct lfs_config *cfg) { + struct lfs1 lfs1; + + // Indeterminate filesystem size not allowed for migration. + LFS_ASSERT(cfg->block_count != 0); + + int err = lfs1_mount(lfs, &lfs1, cfg); + if (err) { + return err; + } + + { + // iterate through each directory, copying over entries + // into new directory + lfs1_dir_t dir1; + lfs_mdir_t dir2; + dir1.d.tail[0] = lfs->lfs1->root[0]; + dir1.d.tail[1] = lfs->lfs1->root[1]; + while (!lfs_pair_isnull(dir1.d.tail)) { + // iterate old dir + err = lfs1_dir_fetch(lfs, &dir1, dir1.d.tail); + if (err) { + goto cleanup; + } + + // create new dir and bind as temporary pretend root + err = lfs_dir_alloc(lfs, &dir2); + if (err) { + goto cleanup; + } + + dir2.rev = dir1.d.rev; + dir1.head[0] = dir1.pair[0]; + dir1.head[1] = dir1.pair[1]; + lfs->root[0] = dir2.pair[0]; + lfs->root[1] = dir2.pair[1]; + + err = lfs_dir_commit(lfs, &dir2, NULL, 0); + if (err) { + goto cleanup; + } + + while (true) { + lfs1_entry_t entry1; + err = lfs1_dir_next(lfs, &dir1, &entry1); + if (err && err != LFS_ERR_NOENT) { + goto cleanup; + } + + if (err == LFS_ERR_NOENT) { + break; + } + + // check that entry has not been moved + if (entry1.d.type & 0x80) { + int moved = lfs1_moved(lfs, &entry1.d.u); + if (moved < 0) { + err = moved; + goto cleanup; + } + + if (moved) { + continue; + } + + entry1.d.type &= ~0x80; + } + + // also fetch name + char name[LFS_NAME_MAX+1]; + memset(name, 0, sizeof(name)); + err = lfs1_bd_read(lfs, dir1.pair[0], + entry1.off + 4+entry1.d.elen+entry1.d.alen, + name, entry1.d.nlen); + if (err) { + goto cleanup; + } + + bool isdir = (entry1.d.type == LFS1_TYPE_DIR); + + // create entry in new dir + err = lfs_dir_fetch(lfs, &dir2, lfs->root); + if (err) { + goto cleanup; + } + + uint16_t id; + err = lfs_dir_find(lfs, &dir2, &(const char*){name}, &id); + if (!(err == LFS_ERR_NOENT && id != 0x3ff)) { + err = (err < 0) ? err : LFS_ERR_EXIST; + goto cleanup; + } + + lfs1_entry_tole32(&entry1.d); + err = lfs_dir_commit(lfs, &dir2, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_CREATE, id, 0), NULL}, + {LFS_MKTAG_IF_ELSE(isdir, + LFS_TYPE_DIR, id, entry1.d.nlen, + LFS_TYPE_REG, id, entry1.d.nlen), + name}, + {LFS_MKTAG_IF_ELSE(isdir, + LFS_TYPE_DIRSTRUCT, id, sizeof(entry1.d.u), + LFS_TYPE_CTZSTRUCT, id, sizeof(entry1.d.u)), + &entry1.d.u})); + lfs1_entry_fromle32(&entry1.d); + if (err) { + goto cleanup; + } + } + + if (!lfs_pair_isnull(dir1.d.tail)) { + // find last block and update tail to thread into fs + err = lfs_dir_fetch(lfs, &dir2, lfs->root); + if (err) { + goto cleanup; + } + + while (dir2.split) { + err = lfs_dir_fetch(lfs, &dir2, dir2.tail); + if (err) { + goto cleanup; + } + } + + lfs_pair_tole32(dir2.pair); + err = lfs_dir_commit(lfs, &dir2, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_SOFTTAIL, 0x3ff, 8), dir1.d.tail})); + lfs_pair_fromle32(dir2.pair); + if (err) { + goto cleanup; + } + } + + // Copy over first block to thread into fs. Unfortunately + // if this fails there is not much we can do. + LFS_DEBUG("Migrating {0x%"PRIx32", 0x%"PRIx32"} " + "-> {0x%"PRIx32", 0x%"PRIx32"}", + lfs->root[0], lfs->root[1], dir1.head[0], dir1.head[1]); + + err = lfs_bd_erase(lfs, dir1.head[1]); + if (err) { + goto cleanup; + } + + err = lfs_dir_fetch(lfs, &dir2, lfs->root); + if (err) { + goto cleanup; + } + + for (lfs_off_t i = 0; i < dir2.off; i++) { + uint8_t dat; + err = lfs_bd_read(lfs, + NULL, &lfs->rcache, dir2.off, + dir2.pair[0], i, &dat, 1); + if (err) { + goto cleanup; + } + + err = lfs_bd_prog(lfs, + &lfs->pcache, &lfs->rcache, true, + dir1.head[1], i, &dat, 1); + if (err) { + goto cleanup; + } + } + + err = lfs_bd_flush(lfs, &lfs->pcache, &lfs->rcache, true); + if (err) { + goto cleanup; + } + } + + // Create new superblock. This marks a successful migration! + err = lfs1_dir_fetch(lfs, &dir1, (const lfs_block_t[2]){0, 1}); + if (err) { + goto cleanup; + } + + dir2.pair[0] = dir1.pair[0]; + dir2.pair[1] = dir1.pair[1]; + dir2.rev = dir1.d.rev; + dir2.off = sizeof(dir2.rev); + dir2.etag = 0xffffffff; + dir2.count = 0; + dir2.tail[0] = lfs->lfs1->root[0]; + dir2.tail[1] = lfs->lfs1->root[1]; + dir2.erased = false; + dir2.split = true; + + lfs_superblock_t superblock = { + .version = LFS_DISK_VERSION, + .block_size = lfs->cfg->block_size, + .block_count = lfs->cfg->block_count, + .name_max = lfs->name_max, + .file_max = lfs->file_max, + .attr_max = lfs->attr_max, + }; + + lfs_superblock_tole32(&superblock); + err = lfs_dir_commit(lfs, &dir2, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_CREATE, 0, 0), NULL}, + {LFS_MKTAG(LFS_TYPE_SUPERBLOCK, 0, 8), "littlefs"}, + {LFS_MKTAG(LFS_TYPE_INLINESTRUCT, 0, sizeof(superblock)), + &superblock})); + if (err) { + goto cleanup; + } + + // sanity check that fetch works + err = lfs_dir_fetch(lfs, &dir2, (const lfs_block_t[2]){0, 1}); + if (err) { + goto cleanup; + } + + // force compaction to prevent accidentally mounting v1 + dir2.erased = false; + err = lfs_dir_commit(lfs, &dir2, NULL, 0); + if (err) { + goto cleanup; + } + } + +cleanup: + lfs1_unmount(lfs); + return err; +} + +#endif + + +/// Public API wrappers /// + +// Here we can add tracing/thread safety easily + +// Thread-safe wrappers if enabled +#ifdef LFS_THREADSAFE +#define LFS_LOCK(cfg) cfg->lock(cfg) +#define LFS_UNLOCK(cfg) cfg->unlock(cfg) +#else +#define LFS_LOCK(cfg) ((void)cfg, 0) +#define LFS_UNLOCK(cfg) ((void)cfg) +#endif + +// Public API +#ifndef LFS_READONLY +int lfs_format(lfs_t *lfs, const struct lfs_config *cfg) { + int err = LFS_LOCK(cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_format(%p, %p {.context=%p, " + ".read=%p, .prog=%p, .erase=%p, .sync=%p, " + ".read_size=%"PRIu32", .prog_size=%"PRIu32", " + ".block_size=%"PRIu32", .block_count=%"PRIu32", " + ".block_cycles=%"PRIu32", .cache_size=%"PRIu32", " + ".lookahead_size=%"PRIu32", .read_buffer=%p, " + ".prog_buffer=%p, .lookahead_buffer=%p, " + ".name_max=%"PRIu32", .file_max=%"PRIu32", " + ".attr_max=%"PRIu32"})", + (void*)lfs, (void*)cfg, cfg->context, + (void*)(uintptr_t)cfg->read, (void*)(uintptr_t)cfg->prog, + (void*)(uintptr_t)cfg->erase, (void*)(uintptr_t)cfg->sync, + cfg->read_size, cfg->prog_size, cfg->block_size, cfg->block_count, + cfg->block_cycles, cfg->cache_size, cfg->lookahead_size, + cfg->read_buffer, cfg->prog_buffer, cfg->lookahead_buffer, + cfg->name_max, cfg->file_max, cfg->attr_max); + + err = lfs_format_(lfs, cfg); + + LFS_TRACE("lfs_format -> %d", err); + LFS_UNLOCK(cfg); + return err; +} +#endif + +int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) { + int err = LFS_LOCK(cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_mount(%p, %p {.context=%p, " + ".read=%p, .prog=%p, .erase=%p, .sync=%p, " + ".read_size=%"PRIu32", .prog_size=%"PRIu32", " + ".block_size=%"PRIu32", .block_count=%"PRIu32", " + ".block_cycles=%"PRIu32", .cache_size=%"PRIu32", " + ".lookahead_size=%"PRIu32", .read_buffer=%p, " + ".prog_buffer=%p, .lookahead_buffer=%p, " + ".name_max=%"PRIu32", .file_max=%"PRIu32", " + ".attr_max=%"PRIu32"})", + (void*)lfs, (void*)cfg, cfg->context, + (void*)(uintptr_t)cfg->read, (void*)(uintptr_t)cfg->prog, + (void*)(uintptr_t)cfg->erase, (void*)(uintptr_t)cfg->sync, + cfg->read_size, cfg->prog_size, cfg->block_size, cfg->block_count, + cfg->block_cycles, cfg->cache_size, cfg->lookahead_size, + cfg->read_buffer, cfg->prog_buffer, cfg->lookahead_buffer, + cfg->name_max, cfg->file_max, cfg->attr_max); + + err = lfs_mount_(lfs, cfg); + + LFS_TRACE("lfs_mount -> %d", err); + LFS_UNLOCK(cfg); + return err; +} + +int lfs_unmount(lfs_t *lfs) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_unmount(%p)", (void*)lfs); + + err = lfs_unmount_(lfs); + + LFS_TRACE("lfs_unmount -> %d", err); + LFS_UNLOCK(lfs->cfg); + return err; +} + +#ifndef LFS_READONLY +int lfs_remove(lfs_t *lfs, const char *path) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_remove(%p, \"%s\")", (void*)lfs, path); + + err = lfs_remove_(lfs, path); + + LFS_TRACE("lfs_remove -> %d", err); + LFS_UNLOCK(lfs->cfg); + return err; +} +#endif + +#ifndef LFS_READONLY +int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_rename(%p, \"%s\", \"%s\")", (void*)lfs, oldpath, newpath); + + err = lfs_rename_(lfs, oldpath, newpath); + + LFS_TRACE("lfs_rename -> %d", err); + LFS_UNLOCK(lfs->cfg); + return err; +} +#endif + +int lfs_stat(lfs_t *lfs, const char *path, struct lfs_info *info) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_stat(%p, \"%s\", %p)", (void*)lfs, path, (void*)info); + + err = lfs_stat_(lfs, path, info); + + LFS_TRACE("lfs_stat -> %d", err); + LFS_UNLOCK(lfs->cfg); + return err; +} + +lfs_ssize_t lfs_getattr(lfs_t *lfs, const char *path, + uint8_t type, void *buffer, lfs_size_t size) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_getattr(%p, \"%s\", %"PRIu8", %p, %"PRIu32")", + (void*)lfs, path, type, buffer, size); + + lfs_ssize_t res = lfs_getattr_(lfs, path, type, buffer, size); + + LFS_TRACE("lfs_getattr -> %"PRId32, res); + LFS_UNLOCK(lfs->cfg); + return res; +} + +#ifndef LFS_READONLY +int lfs_setattr(lfs_t *lfs, const char *path, + uint8_t type, const void *buffer, lfs_size_t size) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_setattr(%p, \"%s\", %"PRIu8", %p, %"PRIu32")", + (void*)lfs, path, type, buffer, size); + + err = lfs_setattr_(lfs, path, type, buffer, size); + + LFS_TRACE("lfs_setattr -> %d", err); + LFS_UNLOCK(lfs->cfg); + return err; +} +#endif + +#ifndef LFS_READONLY +int lfs_removeattr(lfs_t *lfs, const char *path, uint8_t type) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_removeattr(%p, \"%s\", %"PRIu8")", (void*)lfs, path, type); + + err = lfs_removeattr_(lfs, path, type); + + LFS_TRACE("lfs_removeattr -> %d", err); + LFS_UNLOCK(lfs->cfg); + return err; +} +#endif + +#ifndef LFS_NO_MALLOC +int lfs_file_open(lfs_t *lfs, lfs_file_t *file, const char *path, int flags) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_file_open(%p, %p, \"%s\", %x)", + (void*)lfs, (void*)file, path, flags); + LFS_ASSERT(!lfs_mlist_isopen(lfs->mlist, (struct lfs_mlist*)file)); + + err = lfs_file_open_(lfs, file, path, flags); + + LFS_TRACE("lfs_file_open -> %d", err); + LFS_UNLOCK(lfs->cfg); + return err; +} +#endif + +int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file, + const char *path, int flags, + const struct lfs_file_config *cfg) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_file_opencfg(%p, %p, \"%s\", %x, %p {" + ".buffer=%p, .attrs=%p, .attr_count=%"PRIu32"})", + (void*)lfs, (void*)file, path, flags, + (void*)cfg, cfg->buffer, (void*)cfg->attrs, cfg->attr_count); + LFS_ASSERT(!lfs_mlist_isopen(lfs->mlist, (struct lfs_mlist*)file)); + + err = lfs_file_opencfg_(lfs, file, path, flags, cfg); + + LFS_TRACE("lfs_file_opencfg -> %d", err); + LFS_UNLOCK(lfs->cfg); + return err; +} + +int lfs_file_close(lfs_t *lfs, lfs_file_t *file) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_file_close(%p, %p)", (void*)lfs, (void*)file); + LFS_ASSERT(lfs_mlist_isopen(lfs->mlist, (struct lfs_mlist*)file)); + + err = lfs_file_close_(lfs, file); + + LFS_TRACE("lfs_file_close -> %d", err); + LFS_UNLOCK(lfs->cfg); + return err; +} + +#ifndef LFS_READONLY +int lfs_file_sync(lfs_t *lfs, lfs_file_t *file) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_file_sync(%p, %p)", (void*)lfs, (void*)file); + LFS_ASSERT(lfs_mlist_isopen(lfs->mlist, (struct lfs_mlist*)file)); + + err = lfs_file_sync_(lfs, file); + + LFS_TRACE("lfs_file_sync -> %d", err); + LFS_UNLOCK(lfs->cfg); + return err; +} +#endif + +lfs_ssize_t lfs_file_read(lfs_t *lfs, lfs_file_t *file, + void *buffer, lfs_size_t size) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_file_read(%p, %p, %p, %"PRIu32")", + (void*)lfs, (void*)file, buffer, size); + LFS_ASSERT(lfs_mlist_isopen(lfs->mlist, (struct lfs_mlist*)file)); + + lfs_ssize_t res = lfs_file_read_(lfs, file, buffer, size); + + LFS_TRACE("lfs_file_read -> %"PRId32, res); + LFS_UNLOCK(lfs->cfg); + return res; +} + +#ifndef LFS_READONLY +lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file, + const void *buffer, lfs_size_t size) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_file_write(%p, %p, %p, %"PRIu32")", + (void*)lfs, (void*)file, buffer, size); + LFS_ASSERT(lfs_mlist_isopen(lfs->mlist, (struct lfs_mlist*)file)); + + lfs_ssize_t res = lfs_file_write_(lfs, file, buffer, size); + + LFS_TRACE("lfs_file_write -> %"PRId32, res); + LFS_UNLOCK(lfs->cfg); + return res; +} +#endif + +lfs_soff_t lfs_file_seek(lfs_t *lfs, lfs_file_t *file, + lfs_soff_t off, int whence) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_file_seek(%p, %p, %"PRId32", %d)", + (void*)lfs, (void*)file, off, whence); + LFS_ASSERT(lfs_mlist_isopen(lfs->mlist, (struct lfs_mlist*)file)); + + lfs_soff_t res = lfs_file_seek_(lfs, file, off, whence); + + LFS_TRACE("lfs_file_seek -> %"PRId32, res); + LFS_UNLOCK(lfs->cfg); + return res; +} + +#ifndef LFS_READONLY +int lfs_file_truncate(lfs_t *lfs, lfs_file_t *file, lfs_off_t size) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_file_truncate(%p, %p, %"PRIu32")", + (void*)lfs, (void*)file, size); + LFS_ASSERT(lfs_mlist_isopen(lfs->mlist, (struct lfs_mlist*)file)); + + err = lfs_file_truncate_(lfs, file, size); + + LFS_TRACE("lfs_file_truncate -> %d", err); + LFS_UNLOCK(lfs->cfg); + return err; +} +#endif + +lfs_soff_t lfs_file_tell(lfs_t *lfs, lfs_file_t *file) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_file_tell(%p, %p)", (void*)lfs, (void*)file); + LFS_ASSERT(lfs_mlist_isopen(lfs->mlist, (struct lfs_mlist*)file)); + + lfs_soff_t res = lfs_file_tell_(lfs, file); + + LFS_TRACE("lfs_file_tell -> %"PRId32, res); + LFS_UNLOCK(lfs->cfg); + return res; +} + +int lfs_file_rewind(lfs_t *lfs, lfs_file_t *file) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_file_rewind(%p, %p)", (void*)lfs, (void*)file); + + err = lfs_file_rewind_(lfs, file); + + LFS_TRACE("lfs_file_rewind -> %d", err); + LFS_UNLOCK(lfs->cfg); + return err; +} + +lfs_soff_t lfs_file_size(lfs_t *lfs, lfs_file_t *file) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_file_size(%p, %p)", (void*)lfs, (void*)file); + LFS_ASSERT(lfs_mlist_isopen(lfs->mlist, (struct lfs_mlist*)file)); + + lfs_soff_t res = lfs_file_size_(lfs, file); + + LFS_TRACE("lfs_file_size -> %"PRId32, res); + LFS_UNLOCK(lfs->cfg); + return res; +} + +#ifndef LFS_READONLY +int lfs_mkdir(lfs_t *lfs, const char *path) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_mkdir(%p, \"%s\")", (void*)lfs, path); + + err = lfs_mkdir_(lfs, path); + + LFS_TRACE("lfs_mkdir -> %d", err); + LFS_UNLOCK(lfs->cfg); + return err; +} +#endif + +int lfs_dir_open(lfs_t *lfs, lfs_dir_t *dir, const char *path) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_dir_open(%p, %p, \"%s\")", (void*)lfs, (void*)dir, path); + LFS_ASSERT(!lfs_mlist_isopen(lfs->mlist, (struct lfs_mlist*)dir)); + + err = lfs_dir_open_(lfs, dir, path); + + LFS_TRACE("lfs_dir_open -> %d", err); + LFS_UNLOCK(lfs->cfg); + return err; +} + +int lfs_dir_close(lfs_t *lfs, lfs_dir_t *dir) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_dir_close(%p, %p)", (void*)lfs, (void*)dir); + + err = lfs_dir_close_(lfs, dir); + + LFS_TRACE("lfs_dir_close -> %d", err); + LFS_UNLOCK(lfs->cfg); + return err; +} + +int lfs_dir_read(lfs_t *lfs, lfs_dir_t *dir, struct lfs_info *info) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_dir_read(%p, %p, %p)", + (void*)lfs, (void*)dir, (void*)info); + + err = lfs_dir_read_(lfs, dir, info); + + LFS_TRACE("lfs_dir_read -> %d", err); + LFS_UNLOCK(lfs->cfg); + return err; +} + +int lfs_dir_seek(lfs_t *lfs, lfs_dir_t *dir, lfs_off_t off) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_dir_seek(%p, %p, %"PRIu32")", + (void*)lfs, (void*)dir, off); + + err = lfs_dir_seek_(lfs, dir, off); + + LFS_TRACE("lfs_dir_seek -> %d", err); + LFS_UNLOCK(lfs->cfg); + return err; +} + +lfs_soff_t lfs_dir_tell(lfs_t *lfs, lfs_dir_t *dir) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_dir_tell(%p, %p)", (void*)lfs, (void*)dir); + + lfs_soff_t res = lfs_dir_tell_(lfs, dir); + + LFS_TRACE("lfs_dir_tell -> %"PRId32, res); + LFS_UNLOCK(lfs->cfg); + return res; +} + +int lfs_dir_rewind(lfs_t *lfs, lfs_dir_t *dir) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_dir_rewind(%p, %p)", (void*)lfs, (void*)dir); + + err = lfs_dir_rewind_(lfs, dir); + + LFS_TRACE("lfs_dir_rewind -> %d", err); + LFS_UNLOCK(lfs->cfg); + return err; +} + +int lfs_fs_stat(lfs_t *lfs, struct lfs_fsinfo *fsinfo) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_fs_stat(%p, %p)", (void*)lfs, (void*)fsinfo); + + err = lfs_fs_stat_(lfs, fsinfo); + + LFS_TRACE("lfs_fs_stat -> %d", err); + LFS_UNLOCK(lfs->cfg); + return err; +} + +lfs_ssize_t lfs_fs_size(lfs_t *lfs) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_fs_size(%p)", (void*)lfs); + + lfs_ssize_t res = lfs_fs_size_(lfs); + + LFS_TRACE("lfs_fs_size -> %"PRId32, res); + LFS_UNLOCK(lfs->cfg); + return res; +} + +int lfs_fs_traverse(lfs_t *lfs, int (*cb)(void *, lfs_block_t), void *data) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_fs_traverse(%p, %p, %p)", + (void*)lfs, (void*)(uintptr_t)cb, data); + + err = lfs_fs_traverse_(lfs, cb, data, true); + + LFS_TRACE("lfs_fs_traverse -> %d", err); + LFS_UNLOCK(lfs->cfg); + return err; +} + +#ifndef LFS_READONLY +int lfs_fs_mkconsistent(lfs_t *lfs) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_fs_mkconsistent(%p)", (void*)lfs); + + err = lfs_fs_mkconsistent_(lfs); + + LFS_TRACE("lfs_fs_mkconsistent -> %d", err); + LFS_UNLOCK(lfs->cfg); + return err; +} +#endif + +#ifndef LFS_READONLY +int lfs_fs_gc(lfs_t *lfs) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_fs_gc(%p)", (void*)lfs); + + err = lfs_fs_gc_(lfs); + + LFS_TRACE("lfs_fs_gc -> %d", err); + LFS_UNLOCK(lfs->cfg); + return err; +} +#endif + +#ifndef LFS_READONLY +int lfs_fs_grow(lfs_t *lfs, lfs_size_t block_count) { + int err = LFS_LOCK(lfs->cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_fs_grow(%p, %"PRIu32")", (void*)lfs, block_count); + + err = lfs_fs_grow_(lfs, block_count); + + LFS_TRACE("lfs_fs_grow -> %d", err); + LFS_UNLOCK(lfs->cfg); + return err; +} +#endif + +#ifdef LFS_MIGRATE +int lfs_migrate(lfs_t *lfs, const struct lfs_config *cfg) { + int err = LFS_LOCK(cfg); + if (err) { + return err; + } + LFS_TRACE("lfs_migrate(%p, %p {.context=%p, " + ".read=%p, .prog=%p, .erase=%p, .sync=%p, " + ".read_size=%"PRIu32", .prog_size=%"PRIu32", " + ".block_size=%"PRIu32", .block_count=%"PRIu32", " + ".block_cycles=%"PRIu32", .cache_size=%"PRIu32", " + ".lookahead_size=%"PRIu32", .read_buffer=%p, " + ".prog_buffer=%p, .lookahead_buffer=%p, " + ".name_max=%"PRIu32", .file_max=%"PRIu32", " + ".attr_max=%"PRIu32"})", + (void*)lfs, (void*)cfg, cfg->context, + (void*)(uintptr_t)cfg->read, (void*)(uintptr_t)cfg->prog, + (void*)(uintptr_t)cfg->erase, (void*)(uintptr_t)cfg->sync, + cfg->read_size, cfg->prog_size, cfg->block_size, cfg->block_count, + cfg->block_cycles, cfg->cache_size, cfg->lookahead_size, + cfg->read_buffer, cfg->prog_buffer, cfg->lookahead_buffer, + cfg->name_max, cfg->file_max, cfg->attr_max); + + err = lfs_migrate_(lfs, cfg); + + LFS_TRACE("lfs_migrate -> %d", err); + LFS_UNLOCK(cfg); + return err; +} +#endif + +#endif /* << EST LITTLEFS_CONFIG_ENABLED */ diff --git a/TSM_PicoW_Sensor/McuLib/littleFS/lfs.h b/TSM_PicoW_Sensor/McuLib/littleFS/lfs.h new file mode 100644 index 0000000..bf3fbbf --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/littleFS/lfs.h @@ -0,0 +1,799 @@ +/* + * The little filesystem + * + * Copyright (c) 2022, The littlefs authors. + * Copyright (c) 2017, Arm Limited. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef LFS_H +#define LFS_H + +#include +#include +#include "lfs_util.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/// Version info /// + +// Software library version +// Major (top-nibble), incremented on backwards incompatible changes +// Minor (bottom-nibble), incremented on feature additions +#define LFS_VERSION 0x00020009 +#define LFS_VERSION_MAJOR (0xffff & (LFS_VERSION >> 16)) +#define LFS_VERSION_MINOR (0xffff & (LFS_VERSION >> 0)) + +// Version of On-disk data structures +// Major (top-nibble), incremented on backwards incompatible changes +// Minor (bottom-nibble), incremented on feature additions +#define LFS_DISK_VERSION 0x00020001 +#define LFS_DISK_VERSION_MAJOR (0xffff & (LFS_DISK_VERSION >> 16)) +#define LFS_DISK_VERSION_MINOR (0xffff & (LFS_DISK_VERSION >> 0)) + + +/// Definitions /// + +// Type definitions +typedef uint32_t lfs_size_t; +typedef uint32_t lfs_off_t; + +typedef int32_t lfs_ssize_t; +typedef int32_t lfs_soff_t; + +typedef uint32_t lfs_block_t; + +// Maximum name size in bytes, may be redefined to reduce the size of the +// info struct. Limited to <= 1022. Stored in superblock and must be +// respected by other littlefs drivers. +#ifndef LFS_NAME_MAX +#define LFS_NAME_MAX 255 +#endif + +// Maximum size of a file in bytes, may be redefined to limit to support other +// drivers. Limited on disk to <= 2147483647. Stored in superblock and must be +// respected by other littlefs drivers. +#ifndef LFS_FILE_MAX +#define LFS_FILE_MAX 2147483647 +#endif + +// Maximum size of custom attributes in bytes, may be redefined, but there is +// no real benefit to using a smaller LFS_ATTR_MAX. Limited to <= 1022. Stored +// in superblock and must be respected by other littlefs drivers. +#ifndef LFS_ATTR_MAX +#define LFS_ATTR_MAX 1022 +#endif + +// Possible error codes, these are negative to allow +// valid positive return values +enum lfs_error { + LFS_ERR_OK = 0, // No error + LFS_ERR_IO = -5, // Error during device operation + LFS_ERR_CORRUPT = -84, // Corrupted + LFS_ERR_NOENT = -2, // No directory entry + LFS_ERR_EXIST = -17, // Entry already exists + LFS_ERR_NOTDIR = -20, // Entry is not a dir + LFS_ERR_ISDIR = -21, // Entry is a dir + LFS_ERR_NOTEMPTY = -39, // Dir is not empty + LFS_ERR_BADF = -9, // Bad file number + LFS_ERR_FBIG = -27, // File too large + LFS_ERR_INVAL = -22, // Invalid parameter + LFS_ERR_NOSPC = -28, // No space left on device + LFS_ERR_NOMEM = -12, // No more memory available + LFS_ERR_NOATTR = -61, // No data/attr available + LFS_ERR_NAMETOOLONG = -36, // File name too long +}; + +// File types +enum lfs_type { + // file types + LFS_TYPE_REG = 0x001, + LFS_TYPE_DIR = 0x002, + + // internally used types + LFS_TYPE_SPLICE = 0x400, + LFS_TYPE_NAME = 0x000, + LFS_TYPE_STRUCT = 0x200, + LFS_TYPE_USERATTR = 0x300, + LFS_TYPE_FROM = 0x100, + LFS_TYPE_TAIL = 0x600, + LFS_TYPE_GLOBALS = 0x700, + LFS_TYPE_CRC = 0x500, + + // internally used type specializations + LFS_TYPE_CREATE = 0x401, + LFS_TYPE_DELETE = 0x4ff, + LFS_TYPE_SUPERBLOCK = 0x0ff, + LFS_TYPE_DIRSTRUCT = 0x200, + LFS_TYPE_CTZSTRUCT = 0x202, + LFS_TYPE_INLINESTRUCT = 0x201, + LFS_TYPE_SOFTTAIL = 0x600, + LFS_TYPE_HARDTAIL = 0x601, + LFS_TYPE_MOVESTATE = 0x7ff, + LFS_TYPE_CCRC = 0x500, + LFS_TYPE_FCRC = 0x5ff, + + // internal chip sources + LFS_FROM_NOOP = 0x000, + LFS_FROM_MOVE = 0x101, + LFS_FROM_USERATTRS = 0x102, +}; + +// File open flags +enum lfs_open_flags { + // open flags + LFS_O_RDONLY = 1, // Open a file as read only +#ifndef LFS_READONLY + LFS_O_WRONLY = 2, // Open a file as write only + LFS_O_RDWR = 3, // Open a file as read and write + LFS_O_CREAT = 0x0100, // Create a file if it does not exist + LFS_O_EXCL = 0x0200, // Fail if a file already exists + LFS_O_TRUNC = 0x0400, // Truncate the existing file to zero size + LFS_O_APPEND = 0x0800, // Move to end of file on every write +#endif + + // internally used flags +#ifndef LFS_READONLY + LFS_F_DIRTY = 0x010000, // File does not match storage + LFS_F_WRITING = 0x020000, // File has been written since last flush +#endif + LFS_F_READING = 0x040000, // File has been read since last flush +#ifndef LFS_READONLY + LFS_F_ERRED = 0x080000, // An error occurred during write +#endif + LFS_F_INLINE = 0x100000, // Currently inlined in directory entry +}; + +// File seek flags +enum lfs_whence_flags { + LFS_SEEK_SET = 0, // Seek relative to an absolute position + LFS_SEEK_CUR = 1, // Seek relative to the current file position + LFS_SEEK_END = 2, // Seek relative to the end of the file +}; + + +// Configuration provided during initialization of the littlefs +struct lfs_config { + // Opaque user provided context that can be used to pass + // information to the block device operations + void *context; + + // Read a region in a block. Negative error codes are propagated + // to the user. + int (*read)(const struct lfs_config *c, lfs_block_t block, + lfs_off_t off, void *buffer, lfs_size_t size); + + // Program a region in a block. The block must have previously + // been erased. Negative error codes are propagated to the user. + // May return LFS_ERR_CORRUPT if the block should be considered bad. + int (*prog)(const struct lfs_config *c, lfs_block_t block, + lfs_off_t off, const void *buffer, lfs_size_t size); + + // Erase a block. A block must be erased before being programmed. + // The state of an erased block is undefined. Negative error codes + // are propagated to the user. + // May return LFS_ERR_CORRUPT if the block should be considered bad. + int (*erase)(const struct lfs_config *c, lfs_block_t block); + + // Sync the state of the underlying block device. Negative error codes + // are propagated to the user. + int (*sync)(const struct lfs_config *c); + +#ifdef LFS_THREADSAFE + // Lock the underlying block device. Negative error codes + // are propagated to the user. + int (*lock)(const struct lfs_config *c); + + // Unlock the underlying block device. Negative error codes + // are propagated to the user. + int (*unlock)(const struct lfs_config *c); +#endif + + // Minimum size of a block read in bytes. All read operations will be a + // multiple of this value. + lfs_size_t read_size; + + // Minimum size of a block program in bytes. All program operations will be + // a multiple of this value. + lfs_size_t prog_size; + + // Size of an erasable block in bytes. This does not impact ram consumption + // and may be larger than the physical erase size. However, non-inlined + // files take up at minimum one block. Must be a multiple of the read and + // program sizes. + lfs_size_t block_size; + + // Number of erasable blocks on the device. Defaults to block_count stored + // on disk when zero. + lfs_size_t block_count; + + // Number of erase cycles before littlefs evicts metadata logs and moves + // the metadata to another block. Suggested values are in the + // range 100-1000, with large values having better performance at the cost + // of less consistent wear distribution. + // + // Set to -1 to disable block-level wear-leveling. + int32_t block_cycles; + + // Size of block caches in bytes. Each cache buffers a portion of a block in + // RAM. The littlefs needs a read cache, a program cache, and one additional + // cache per file. Larger caches can improve performance by storing more + // data and reducing the number of disk accesses. Must be a multiple of the + // read and program sizes, and a factor of the block size. + lfs_size_t cache_size; + + // Size of the lookahead buffer in bytes. A larger lookahead buffer + // increases the number of blocks found during an allocation pass. The + // lookahead buffer is stored as a compact bitmap, so each byte of RAM + // can track 8 blocks. + lfs_size_t lookahead_size; + + // Threshold for metadata compaction during lfs_fs_gc in bytes. Metadata + // pairs that exceed this threshold will be compacted during lfs_fs_gc. + // Defaults to ~88% block_size when zero, though the default may change + // in the future. + // + // Note this only affects lfs_fs_gc. Normal compactions still only occur + // when full. + // + // Set to -1 to disable metadata compaction during lfs_fs_gc. + lfs_size_t compact_thresh; + + // Optional statically allocated read buffer. Must be cache_size. + // By default lfs_malloc is used to allocate this buffer. + void *read_buffer; + + // Optional statically allocated program buffer. Must be cache_size. + // By default lfs_malloc is used to allocate this buffer. + void *prog_buffer; + + // Optional statically allocated lookahead buffer. Must be lookahead_size. + // By default lfs_malloc is used to allocate this buffer. + void *lookahead_buffer; + + // Optional upper limit on length of file names in bytes. No downside for + // larger names except the size of the info struct which is controlled by + // the LFS_NAME_MAX define. Defaults to LFS_NAME_MAX or name_max stored on + // disk when zero. + lfs_size_t name_max; + + // Optional upper limit on files in bytes. No downside for larger files + // but must be <= LFS_FILE_MAX. Defaults to LFS_FILE_MAX or file_max stored + // on disk when zero. + lfs_size_t file_max; + + // Optional upper limit on custom attributes in bytes. No downside for + // larger attributes size but must be <= LFS_ATTR_MAX. Defaults to + // LFS_ATTR_MAX or attr_max stored on disk when zero. + lfs_size_t attr_max; + + // Optional upper limit on total space given to metadata pairs in bytes. On + // devices with large blocks (e.g. 128kB) setting this to a low size (2-8kB) + // can help bound the metadata compaction time. Must be <= block_size. + // Defaults to block_size when zero. + lfs_size_t metadata_max; + + // Optional upper limit on inlined files in bytes. Inlined files live in + // metadata and decrease storage requirements, but may be limited to + // improve metadata-related performance. Must be <= cache_size, <= + // attr_max, and <= block_size/8. Defaults to the largest possible + // inline_max when zero. + // + // Set to -1 to disable inlined files. + lfs_size_t inline_max; + +#ifdef LFS_MULTIVERSION + // On-disk version to use when writing in the form of 16-bit major version + // + 16-bit minor version. This limiting metadata to what is supported by + // older minor versions. Note that some features will be lost. Defaults to + // to the most recent minor version when zero. + uint32_t disk_version; +#endif +}; + +// File info structure +struct lfs_info { + // Type of the file, either LFS_TYPE_REG or LFS_TYPE_DIR + uint8_t type; + + // Size of the file, only valid for REG files. Limited to 32-bits. + lfs_size_t size; + + // Name of the file stored as a null-terminated string. Limited to + // LFS_NAME_MAX+1, which can be changed by redefining LFS_NAME_MAX to + // reduce RAM. LFS_NAME_MAX is stored in superblock and must be + // respected by other littlefs drivers. + char name[LFS_NAME_MAX+1]; +}; + +// Filesystem info structure +struct lfs_fsinfo { + // On-disk version. + uint32_t disk_version; + + // Size of a logical block in bytes. + lfs_size_t block_size; + + // Number of logical blocks in filesystem. + lfs_size_t block_count; + + // Upper limit on the length of file names in bytes. + lfs_size_t name_max; + + // Upper limit on the size of files in bytes. + lfs_size_t file_max; + + // Upper limit on the size of custom attributes in bytes. + lfs_size_t attr_max; +}; + +// Custom attribute structure, used to describe custom attributes +// committed atomically during file writes. +struct lfs_attr { + // 8-bit type of attribute, provided by user and used to + // identify the attribute + uint8_t type; + + // Pointer to buffer containing the attribute + void *buffer; + + // Size of attribute in bytes, limited to LFS_ATTR_MAX + lfs_size_t size; +}; + +// Optional configuration provided during lfs_file_opencfg +struct lfs_file_config { + // Optional statically allocated file buffer. Must be cache_size. + // By default lfs_malloc is used to allocate this buffer. + void *buffer; + + // Optional list of custom attributes related to the file. If the file + // is opened with read access, these attributes will be read from disk + // during the open call. If the file is opened with write access, the + // attributes will be written to disk every file sync or close. This + // write occurs atomically with update to the file's contents. + // + // Custom attributes are uniquely identified by an 8-bit type and limited + // to LFS_ATTR_MAX bytes. When read, if the stored attribute is smaller + // than the buffer, it will be padded with zeros. If the stored attribute + // is larger, then it will be silently truncated. If the attribute is not + // found, it will be created implicitly. + struct lfs_attr *attrs; + + // Number of custom attributes in the list + lfs_size_t attr_count; +}; + + +/// internal littlefs data structures /// +typedef struct lfs_cache { + lfs_block_t block; + lfs_off_t off; + lfs_size_t size; + uint8_t *buffer; +} lfs_cache_t; + +typedef struct lfs_mdir { + lfs_block_t pair[2]; + uint32_t rev; + lfs_off_t off; + uint32_t etag; + uint16_t count; + bool erased; + bool split; + lfs_block_t tail[2]; +} lfs_mdir_t; + +// littlefs directory type +typedef struct lfs_dir { + struct lfs_dir *next; + uint16_t id; + uint8_t type; + lfs_mdir_t m; + + lfs_off_t pos; + lfs_block_t head[2]; +} lfs_dir_t; + +// littlefs file type +typedef struct lfs_file { + struct lfs_file *next; + uint16_t id; + uint8_t type; + lfs_mdir_t m; + + struct lfs_ctz { + lfs_block_t head; + lfs_size_t size; + } ctz; + + uint32_t flags; + lfs_off_t pos; + lfs_block_t block; + lfs_off_t off; + lfs_cache_t cache; + + const struct lfs_file_config *cfg; +} lfs_file_t; + +typedef struct lfs_superblock { + uint32_t version; + lfs_size_t block_size; + lfs_size_t block_count; + lfs_size_t name_max; + lfs_size_t file_max; + lfs_size_t attr_max; +} lfs_superblock_t; + +typedef struct lfs_gstate { + uint32_t tag; + lfs_block_t pair[2]; +} lfs_gstate_t; + +// The littlefs filesystem type +typedef struct lfs { + lfs_cache_t rcache; + lfs_cache_t pcache; + + lfs_block_t root[2]; + struct lfs_mlist { + struct lfs_mlist *next; + uint16_t id; + uint8_t type; + lfs_mdir_t m; + } *mlist; + uint32_t seed; + + lfs_gstate_t gstate; + lfs_gstate_t gdisk; + lfs_gstate_t gdelta; + + struct lfs_lookahead { + lfs_block_t start; + lfs_block_t size; + lfs_block_t next; + lfs_block_t ckpoint; + uint8_t *buffer; + } lookahead; + + const struct lfs_config *cfg; + lfs_size_t block_count; + lfs_size_t name_max; + lfs_size_t file_max; + lfs_size_t attr_max; + lfs_size_t inline_max; + +#ifdef LFS_MIGRATE + struct lfs1 *lfs1; +#endif +} lfs_t; + + +/// Filesystem functions /// + +#ifndef LFS_READONLY +// Format a block device with the littlefs +// +// Requires a littlefs object and config struct. This clobbers the littlefs +// object, and does not leave the filesystem mounted. The config struct must +// be zeroed for defaults and backwards compatibility. +// +// Returns a negative error code on failure. +int lfs_format(lfs_t *lfs, const struct lfs_config *config); +#endif + +// Mounts a littlefs +// +// Requires a littlefs object and config struct. Multiple filesystems +// may be mounted simultaneously with multiple littlefs objects. Both +// lfs and config must be allocated while mounted. The config struct must +// be zeroed for defaults and backwards compatibility. +// +// Returns a negative error code on failure. +int lfs_mount(lfs_t *lfs, const struct lfs_config *config); + +// Unmounts a littlefs +// +// Does nothing besides releasing any allocated resources. +// Returns a negative error code on failure. +int lfs_unmount(lfs_t *lfs); + +/// General operations /// + +#ifndef LFS_READONLY +// Removes a file or directory +// +// If removing a directory, the directory must be empty. +// Returns a negative error code on failure. +int lfs_remove(lfs_t *lfs, const char *path); +#endif + +#ifndef LFS_READONLY +// Rename or move a file or directory +// +// If the destination exists, it must match the source in type. +// If the destination is a directory, the directory must be empty. +// +// Returns a negative error code on failure. +int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath); +#endif + +// Find info about a file or directory +// +// Fills out the info structure, based on the specified file or directory. +// Returns a negative error code on failure. +int lfs_stat(lfs_t *lfs, const char *path, struct lfs_info *info); + +// Get a custom attribute +// +// Custom attributes are uniquely identified by an 8-bit type and limited +// to LFS_ATTR_MAX bytes. When read, if the stored attribute is smaller than +// the buffer, it will be padded with zeros. If the stored attribute is larger, +// then it will be silently truncated. If no attribute is found, the error +// LFS_ERR_NOATTR is returned and the buffer is filled with zeros. +// +// Returns the size of the attribute, or a negative error code on failure. +// Note, the returned size is the size of the attribute on disk, irrespective +// of the size of the buffer. This can be used to dynamically allocate a buffer +// or check for existence. +lfs_ssize_t lfs_getattr(lfs_t *lfs, const char *path, + uint8_t type, void *buffer, lfs_size_t size); + +#ifndef LFS_READONLY +// Set custom attributes +// +// Custom attributes are uniquely identified by an 8-bit type and limited +// to LFS_ATTR_MAX bytes. If an attribute is not found, it will be +// implicitly created. +// +// Returns a negative error code on failure. +int lfs_setattr(lfs_t *lfs, const char *path, + uint8_t type, const void *buffer, lfs_size_t size); +#endif + +#ifndef LFS_READONLY +// Removes a custom attribute +// +// If an attribute is not found, nothing happens. +// +// Returns a negative error code on failure. +int lfs_removeattr(lfs_t *lfs, const char *path, uint8_t type); +#endif + + +/// File operations /// + +#ifndef LFS_NO_MALLOC +// Open a file +// +// The mode that the file is opened in is determined by the flags, which +// are values from the enum lfs_open_flags that are bitwise-ored together. +// +// Returns a negative error code on failure. +int lfs_file_open(lfs_t *lfs, lfs_file_t *file, + const char *path, int flags); + +// if LFS_NO_MALLOC is defined, lfs_file_open() will fail with LFS_ERR_NOMEM +// thus use lfs_file_opencfg() with config.buffer set. +#endif + +// Open a file with extra configuration +// +// The mode that the file is opened in is determined by the flags, which +// are values from the enum lfs_open_flags that are bitwise-ored together. +// +// The config struct provides additional config options per file as described +// above. The config struct must remain allocated while the file is open, and +// the config struct must be zeroed for defaults and backwards compatibility. +// +// Returns a negative error code on failure. +int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file, + const char *path, int flags, + const struct lfs_file_config *config); + +// Close a file +// +// Any pending writes are written out to storage as though +// sync had been called and releases any allocated resources. +// +// Returns a negative error code on failure. +int lfs_file_close(lfs_t *lfs, lfs_file_t *file); + +// Synchronize a file on storage +// +// Any pending writes are written out to storage. +// Returns a negative error code on failure. +int lfs_file_sync(lfs_t *lfs, lfs_file_t *file); + +// Read data from file +// +// Takes a buffer and size indicating where to store the read data. +// Returns the number of bytes read, or a negative error code on failure. +lfs_ssize_t lfs_file_read(lfs_t *lfs, lfs_file_t *file, + void *buffer, lfs_size_t size); + +#ifndef LFS_READONLY +// Write data to file +// +// Takes a buffer and size indicating the data to write. The file will not +// actually be updated on the storage until either sync or close is called. +// +// Returns the number of bytes written, or a negative error code on failure. +lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file, + const void *buffer, lfs_size_t size); +#endif + +// Change the position of the file +// +// The change in position is determined by the offset and whence flag. +// Returns the new position of the file, or a negative error code on failure. +lfs_soff_t lfs_file_seek(lfs_t *lfs, lfs_file_t *file, + lfs_soff_t off, int whence); + +#ifndef LFS_READONLY +// Truncates the size of the file to the specified size +// +// Returns a negative error code on failure. +int lfs_file_truncate(lfs_t *lfs, lfs_file_t *file, lfs_off_t size); +#endif + +// Return the position of the file +// +// Equivalent to lfs_file_seek(lfs, file, 0, LFS_SEEK_CUR) +// Returns the position of the file, or a negative error code on failure. +lfs_soff_t lfs_file_tell(lfs_t *lfs, lfs_file_t *file); + +// Change the position of the file to the beginning of the file +// +// Equivalent to lfs_file_seek(lfs, file, 0, LFS_SEEK_SET) +// Returns a negative error code on failure. +int lfs_file_rewind(lfs_t *lfs, lfs_file_t *file); + +// Return the size of the file +// +// Similar to lfs_file_seek(lfs, file, 0, LFS_SEEK_END) +// Returns the size of the file, or a negative error code on failure. +lfs_soff_t lfs_file_size(lfs_t *lfs, lfs_file_t *file); + + +/// Directory operations /// + +#ifndef LFS_READONLY +// Create a directory +// +// Returns a negative error code on failure. +int lfs_mkdir(lfs_t *lfs, const char *path); +#endif + +// Open a directory +// +// Once open a directory can be used with read to iterate over files. +// Returns a negative error code on failure. +int lfs_dir_open(lfs_t *lfs, lfs_dir_t *dir, const char *path); + +// Close a directory +// +// Releases any allocated resources. +// Returns a negative error code on failure. +int lfs_dir_close(lfs_t *lfs, lfs_dir_t *dir); + +// Read an entry in the directory +// +// Fills out the info structure, based on the specified file or directory. +// Returns a positive value on success, 0 at the end of directory, +// or a negative error code on failure. +int lfs_dir_read(lfs_t *lfs, lfs_dir_t *dir, struct lfs_info *info); + +// Change the position of the directory +// +// The new off must be a value previous returned from tell and specifies +// an absolute offset in the directory seek. +// +// Returns a negative error code on failure. +int lfs_dir_seek(lfs_t *lfs, lfs_dir_t *dir, lfs_off_t off); + +// Return the position of the directory +// +// The returned offset is only meant to be consumed by seek and may not make +// sense, but does indicate the current position in the directory iteration. +// +// Returns the position of the directory, or a negative error code on failure. +lfs_soff_t lfs_dir_tell(lfs_t *lfs, lfs_dir_t *dir); + +// Change the position of the directory to the beginning of the directory +// +// Returns a negative error code on failure. +int lfs_dir_rewind(lfs_t *lfs, lfs_dir_t *dir); + + +/// Filesystem-level filesystem operations + +// Find on-disk info about the filesystem +// +// Fills out the fsinfo structure based on the filesystem found on-disk. +// Returns a negative error code on failure. +int lfs_fs_stat(lfs_t *lfs, struct lfs_fsinfo *fsinfo); + +// Finds the current size of the filesystem +// +// Note: Result is best effort. If files share COW structures, the returned +// size may be larger than the filesystem actually is. +// +// Returns the number of allocated blocks, or a negative error code on failure. +lfs_ssize_t lfs_fs_size(lfs_t *lfs); + +// Traverse through all blocks in use by the filesystem +// +// The provided callback will be called with each block address that is +// currently in use by the filesystem. This can be used to determine which +// blocks are in use or how much of the storage is available. +// +// Returns a negative error code on failure. +int lfs_fs_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data); + +#ifndef LFS_READONLY +// Attempt to make the filesystem consistent and ready for writing +// +// Calling this function is not required, consistency will be implicitly +// enforced on the first operation that writes to the filesystem, but this +// function allows the work to be performed earlier and without other +// filesystem changes. +// +// Returns a negative error code on failure. +int lfs_fs_mkconsistent(lfs_t *lfs); +#endif + +#ifndef LFS_READONLY +// Attempt any janitorial work +// +// This currently: +// 1. Calls mkconsistent if not already consistent +// 2. Compacts metadata > compact_thresh +// 3. Populates the block allocator +// +// Though additional janitorial work may be added in the future. +// +// Calling this function is not required, but may allow the offloading of +// expensive janitorial work to a less time-critical code path. +// +// Returns a negative error code on failure. Accomplishing nothing is not +// an error. +int lfs_fs_gc(lfs_t *lfs); +#endif + +#ifndef LFS_READONLY +// Grows the filesystem to a new size, updating the superblock with the new +// block count. +// +// Note: This is irreversible. +// +// Returns a negative error code on failure. +int lfs_fs_grow(lfs_t *lfs, lfs_size_t block_count); +#endif + +#ifndef LFS_READONLY +#ifdef LFS_MIGRATE +// Attempts to migrate a previous version of littlefs +// +// Behaves similarly to the lfs_format function. Attempts to mount +// the previous version of littlefs and update the filesystem so it can be +// mounted with the current version of littlefs. +// +// Requires a littlefs object and config struct. This clobbers the littlefs +// object, and does not leave the filesystem mounted. The config struct must +// be zeroed for defaults and backwards compatibility. +// +// Returns a negative error code on failure. +int lfs_migrate(lfs_t *lfs, const struct lfs_config *cfg); +#endif +#endif + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/littleFS/lfs_config.h b/TSM_PicoW_Sensor/McuLib/littleFS/lfs_config.h new file mode 100644 index 0000000..0634271 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/littleFS/lfs_config.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2022, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef LITTLEFS_LFSCONFIG_H_ +#define LITTLEFS_LFSCONFIG_H_ + +#include "McuLibconfig.h" /* to know if RTOS is used */ +#include "McuRTOS.h" /* for RTOS malloc()/free() */ + +#ifndef LITTLEFS_CONFIG_ENABLED + #define LITTLEFS_CONFIG_ENABLED (0) + /*!< 1: if LittleFS module is enabled; 0: no littleFS support */ +#endif + +#ifndef LITTLEFS_CONFIG_THREAD_SAFE + #define LITTLEFS_CONFIG_THREAD_SAFE (1 && McuLib_CONFIG_SDK_USE_FREERTOS) + /*!< 1: make littleFS thread safe; 0: littleFS is not thread safe */ +#endif + +#if LITTLEFS_CONFIG_THREAD_SAFE + #define LFS_THREADSAFE + /* define macro to tell FS to be thread safe */ +#endif + +#ifndef LITTLEFS_CONFIG_USE_FREERTOS_HEAP + #define LITTLEFS_CONFIG_USE_FREERTOS_HEAP (McuLib_CONFIG_SDK_USE_FREERTOS) + /*!< 1: use FreeRTOS Heap (default), 0: use stdlib malloc() and free() */ +#endif + +#endif /* LITTLEFS_LFSCONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/littleFS/lfs_util.c b/TSM_PicoW_Sensor/McuLib/littleFS/lfs_util.c new file mode 100644 index 0000000..8bc5ea5 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/littleFS/lfs_util.c @@ -0,0 +1,42 @@ +/* + * lfs util functions + * + * Copyright (c) 2022, The littlefs authors. + * Copyright (c) 2017, Arm Limited. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + */ +#include "lfs_util.h" + +#include "lfs_config.h" /* << EST */ +#if LITTLEFS_CONFIG_ENABLED /* << EST */ + +// Only compile if user does not provide custom config +#ifndef LFS_CONFIG + + +// If user provides their own CRC impl we don't need this +#ifndef LFS_CRC +// Software CRC implementation with small lookup table +uint32_t lfs_crc(uint32_t crc, const void *buffer, size_t size) { + static const uint32_t rtable[16] = { + 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, + 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, + 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, + 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c, + }; + + const uint8_t *data = buffer; + + for (size_t i = 0; i < size; i++) { + crc = (crc >> 4) ^ rtable[(crc ^ (data[i] >> 0)) & 0xf]; + crc = (crc >> 4) ^ rtable[(crc ^ (data[i] >> 4)) & 0xf]; + } + + return crc; +} +#endif + +#endif + +#endif /* << EST LITTLEFS_CONFIG_ENABLED */ + diff --git a/TSM_PicoW_Sensor/McuLib/littleFS/lfs_util.h b/TSM_PicoW_Sensor/McuLib/littleFS/lfs_util.h new file mode 100644 index 0000000..3b7a3b2 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/littleFS/lfs_util.h @@ -0,0 +1,261 @@ +/* + * lfs utility functions + * + * Copyright (c) 2022, The littlefs authors. + * Copyright (c) 2017, Arm Limited. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef LFS_UTIL_H +#define LFS_UTIL_H + +#include "lfs_config.h" /* << EST */ +#if LITTLEFS_CONFIG_ENABLED /* << EST */ + +// Users can override lfs_util.h with their own configuration by defining +// LFS_CONFIG as a header file to include (-DLFS_CONFIG=lfs_config.h). +// +// If LFS_CONFIG is used, none of the default utils will be emitted and must be +// provided by the config file. To start, I would suggest copying lfs_util.h +// and modifying as needed. +#ifdef LFS_CONFIG +#define LFS_STRINGIZE(x) LFS_STRINGIZE2(x) +#define LFS_STRINGIZE2(x) #x +#include LFS_STRINGIZE(LFS_CONFIG) +#else + +// System includes +#include +#include +#include +#include /* < +#endif +#ifndef LFS_NO_ASSERT +#include +#endif +#if !defined(LFS_NO_DEBUG) || \ + !defined(LFS_NO_WARN) || \ + !defined(LFS_NO_ERROR) || \ + defined(LFS_YES_TRACE) +#include +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + + +// Macros, may be replaced by system specific wrappers. Arguments to these +// macros must not have side-effects as the macros can be removed for a smaller +// code footprint + +// Logging functions +#ifndef LFS_TRACE +#ifdef LFS_YES_TRACE +#define LFS_TRACE_(fmt, ...) \ + printf("%s:%d:trace: " fmt "%s\n", __FILE__, __LINE__, __VA_ARGS__) +#define LFS_TRACE(...) LFS_TRACE_(__VA_ARGS__, "") +#else +#define LFS_TRACE(...) +#endif +#endif + +#ifndef LFS_DEBUG +#ifndef LFS_NO_DEBUG +#define LFS_DEBUG_(fmt, ...) \ + printf("%s:%d:debug: " fmt "%s\n", __FILE__, __LINE__, __VA_ARGS__) +#define LFS_DEBUG(...) LFS_DEBUG_(__VA_ARGS__, "") +#else +#define LFS_DEBUG(...) +#endif +#endif + +#ifndef LFS_WARN +#ifndef LFS_NO_WARN +#define LFS_WARN_(fmt, ...) \ + printf("%s:%d:warn: " fmt "%s\n", __FILE__, __LINE__, __VA_ARGS__) +#define LFS_WARN(...) LFS_WARN_(__VA_ARGS__, "") +#else +#define LFS_WARN(...) +#endif +#endif + +#ifndef LFS_ERROR +#ifndef LFS_NO_ERROR +#define LFS_ERROR_(fmt, ...) \ + printf("%s:%d:error: " fmt "%s\n", __FILE__, __LINE__, __VA_ARGS__) +#define LFS_ERROR(...) LFS_ERROR_(__VA_ARGS__, "") +#else +#define LFS_ERROR(...) +#endif +#endif + +// Runtime assertions +#ifndef LFS_ASSERT +#ifndef LFS_NO_ASSERT +#define LFS_ASSERT(test) assert(test) +#else +#define LFS_ASSERT(test) +#endif +#endif + + +// Builtin functions, these may be replaced by more efficient +// toolchain-specific implementations. LFS_NO_INTRINSICS falls back to a more +// expensive basic C implementation for debugging purposes + +// Min/max functions for unsigned 32-bit numbers +static inline uint32_t lfs_max(uint32_t a, uint32_t b) { + return (a > b) ? a : b; +} + +static inline uint32_t lfs_min(uint32_t a, uint32_t b) { + return (a < b) ? a : b; +} + +// Align to nearest multiple of a size +static inline uint32_t lfs_aligndown(uint32_t a, uint32_t alignment) { + return a - (a % alignment); +} + +static inline uint32_t lfs_alignup(uint32_t a, uint32_t alignment) { + return lfs_aligndown(a + alignment-1, alignment); +} + +// Find the smallest power of 2 greater than or equal to a +static inline uint32_t lfs_npw2(uint32_t a) { +#if !defined(LFS_NO_INTRINSICS) && (defined(__GNUC__) || defined(__CC_ARM)) + return 32 - __builtin_clz(a-1); +#else + uint32_t r = 0; + uint32_t s; + a -= 1; + s = (a > 0xffff) << 4; a >>= s; r |= s; + s = (a > 0xff ) << 3; a >>= s; r |= s; + s = (a > 0xf ) << 2; a >>= s; r |= s; + s = (a > 0x3 ) << 1; a >>= s; r |= s; + return (r | (a >> 1)) + 1; +#endif +} + +// Count the number of trailing binary zeros in a +// lfs_ctz(0) may be undefined +static inline uint32_t lfs_ctz(uint32_t a) { +#if !defined(LFS_NO_INTRINSICS) && defined(__GNUC__) + return __builtin_ctz(a); +#else + return lfs_npw2((a & -a) + 1) - 1; +#endif +} + +// Count the number of binary ones in a +static inline uint32_t lfs_popc(uint32_t a) { +#if !defined(LFS_NO_INTRINSICS) && (defined(__GNUC__) || defined(__CC_ARM)) + return __builtin_popcount(a); +#else + a = a - ((a >> 1) & 0x55555555); + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); + return (((a + (a >> 4)) & 0xf0f0f0f) * 0x1010101) >> 24; +#endif +} + +// Find the sequence comparison of a and b, this is the distance +// between a and b ignoring overflow +static inline int lfs_scmp(uint32_t a, uint32_t b) { + return (int)(unsigned)(a - b); +} + +// Convert between 32-bit little-endian and native order +static inline uint32_t lfs_fromle32(uint32_t a) { +#if (defined( BYTE_ORDER ) && defined( ORDER_LITTLE_ENDIAN ) && BYTE_ORDER == ORDER_LITTLE_ENDIAN ) || \ + (defined(__BYTE_ORDER ) && defined(__ORDER_LITTLE_ENDIAN ) && __BYTE_ORDER == __ORDER_LITTLE_ENDIAN ) || \ + (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) + return a; +#elif !defined(LFS_NO_INTRINSICS) && ( \ + (defined( BYTE_ORDER ) && defined( ORDER_BIG_ENDIAN ) && BYTE_ORDER == ORDER_BIG_ENDIAN ) || \ + (defined(__BYTE_ORDER ) && defined(__ORDER_BIG_ENDIAN ) && __BYTE_ORDER == __ORDER_BIG_ENDIAN ) || \ + (defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) + return __builtin_bswap32(a); +#else + return (((uint8_t*)&a)[0] << 0) | + (((uint8_t*)&a)[1] << 8) | + (((uint8_t*)&a)[2] << 16) | + (((uint8_t*)&a)[3] << 24); +#endif +} + +static inline uint32_t lfs_tole32(uint32_t a) { + return lfs_fromle32(a); +} + +// Convert between 32-bit big-endian and native order +static inline uint32_t lfs_frombe32(uint32_t a) { +#if !defined(LFS_NO_INTRINSICS) && ( \ + (defined( BYTE_ORDER ) && defined( ORDER_LITTLE_ENDIAN ) && BYTE_ORDER == ORDER_LITTLE_ENDIAN ) || \ + (defined(__BYTE_ORDER ) && defined(__ORDER_LITTLE_ENDIAN ) && __BYTE_ORDER == __ORDER_LITTLE_ENDIAN ) || \ + (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) + return __builtin_bswap32(a); +#elif (defined( BYTE_ORDER ) && defined( ORDER_BIG_ENDIAN ) && BYTE_ORDER == ORDER_BIG_ENDIAN ) || \ + (defined(__BYTE_ORDER ) && defined(__ORDER_BIG_ENDIAN ) && __BYTE_ORDER == __ORDER_BIG_ENDIAN ) || \ + (defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) + return a; +#else + return (((uint8_t*)&a)[0] << 24) | + (((uint8_t*)&a)[1] << 16) | + (((uint8_t*)&a)[2] << 8) | + (((uint8_t*)&a)[3] << 0); +#endif +} + +static inline uint32_t lfs_tobe32(uint32_t a) { + return lfs_frombe32(a); +} + +// Calculate CRC-32 with polynomial = 0x04c11db7 +#ifdef LFS_CRC +uint32_t lfs_crc(uint32_t crc, const void *buffer, size_t size) { + return LFS_CRC(crc, buffer, size) +} +#else +uint32_t lfs_crc(uint32_t crc, const void *buffer, size_t size); +#endif + +// Allocate memory, only used if buffers are not provided to littlefs +// +// littlefs current has no alignment requirements, as it only allocates +// byte-level buffers. +static inline void *lfs_malloc(size_t size) { +#if defined(LFS_MALLOC) + return LFS_MALLOC(size); +#elif !defined(LFS_NO_MALLOC) + return malloc(size); +#else + (void)size; + return NULL; +#endif +} + +// Deallocate memory, only used if buffers are not provided to littlefs +static inline void lfs_free(void *p) { +#if defined(LFS_FREE) + LFS_FREE(p); +#elif !defined(LFS_NO_MALLOC) + free(p); +#else + (void)p; +#endif +} + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif + +#endif /* LITTLEFS_CONFIG_ENABLED */ /* << EST */ + +#endif diff --git a/TSM_PicoW_Sensor/McuLib/littleFS/readme.txt b/TSM_PicoW_Sensor/McuLib/littleFS/readme.txt new file mode 100644 index 0000000..4491962 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/littleFS/readme.txt @@ -0,0 +1,5 @@ +readme.txt +---------- + +Repository and more details: https://github.com/littlefs-project/littlefs + diff --git a/TSM_PicoW_Sensor/McuLib/minIni/McuMinINI.c b/TSM_PicoW_Sensor/McuLib/minIni/McuMinINI.c new file mode 100644 index 0000000..f41f77b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/minIni/McuMinINI.c @@ -0,0 +1,563 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuMinINI.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : minIni +** Version : Component 01.060, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2022-01-22, 12:01, # CodeGen: 775 +** Abstract : +** minIni is a programmer�s library to read and write ini files in embedded systems. +** Settings : +** Component name : McuMinINI +** minIni Version : 1.4 +** SDK : McuLib +** Portable strnicmp() : yes +** Use Real : no +** Read Only : no +** No Debug : yes +** FatFS : Disabled +** Source Folders : +** Source Folder : minIni +** Config Folder : minIni +** Contents : +** ini_getbool - int McuMinINI_ini_getbool(const mTCHAR *Section, const mTCHAR *Key, int... +** ini_gets - int McuMinINI_ini_gets(const mTCHAR *Section, const mTCHAR *Key, const mTCHAR... +** ini_puts - int McuMinINI_ini_puts(const mTCHAR *Section, const mTCHAR *Key, const mTCHAR... +** ini_getl - long McuMinINI_ini_getl(const mTCHAR *Section, const mTCHAR *Key, long... +** ini_putl - int McuMinINI_ini_putl(const mTCHAR *Section, const mTCHAR *Key, long Value,... +** ini_hassection - int McuMinINI_ini_hassection(const mTCHAR *Section, const mTCHAR *Filename); +** ini_getsection - int McuMinINI_ini_getsection(int idx, mTCHAR *Buffer, int BufferSize, const... +** ini_haskey - int McuMinINI_ini_haskey(const mTCHAR *Section, const mTCHAR *Key, const... +** ini_getkey - int McuMinINI_ini_getkey(const mTCHAR *Section, int idx, mTCHAR *Buffer, int... +** ini_browse - int McuMinINI_ini_browse(INI_CALLBACK Callback, const void *UserData, const... +** ParseCommand - uint8_t McuMinINI_ParseCommand(const unsigned char *cmd, bool *handled, const... +** Deinit - void McuMinINI_Deinit(void); +** Init - void McuMinINI_Init(void); +** +** (c) Copyright 2008-2021, CompuPhase; +** http : www.compuphase.com +** Processor Expert port: Erich Styger, 2014-2022, http://www.mcuoneclipse.com +** License: See miniIni_LICENSE.txt and minIni_NOTICE.txt +** Adaptions for Processor Expert: (c) Copyright 2012-2020, Erich Styger +** ###################################################################*/ +/*! +** @file McuMinINI.h +** @version 01.00 +** @brief +** minIni is a programmer�s library to read and write ini files in embedded systems. +*/ +/*! +** @addtogroup McuMinINI_module McuMinINI module documentation +** @{ +*/ + +/* MODULE McuMinINI. */ + +#include "McuMinINI.h" +#include "McuUtility.h" /* various utility functions */ + + +#if McuMinINI_CONFIG_PARSE_COMMAND_ENABLED +static uint8_t PrintStatus(const McuShell_StdIOType *io) { + uint8_t buf[16]; + + McuShell_SendStatusStr((unsigned char*)"McuMinINI", (unsigned char*)"MinINI status\r\n", io->stdOut); + McuUtility_Num32uToStr(buf, sizeof(buf), INI_BUFFERSIZE); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" bytes\r\n"); + McuShell_SendStatusStr((unsigned char*)" buffer", buf, io->stdOut); + +#if defined(INI_REAL) + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"supported\r\n"); +#else + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"not supported\r\n"); +#endif + McuShell_SendStatusStr((unsigned char*)" real", buf, io->stdOut); + +#if McuMinINI_CONFIG_READ_ONLY + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"read-only\r\n"); +#else + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"read-write\r\n"); +#endif + McuShell_SendStatusStr((unsigned char*)" mode", buf, io->stdOut); + + switch(McuMinINI_CONFIG_FS) { + case McuMinINI_CONFIG_FS_TYPE_GENERIC: + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"Generic\r\n"); break; + case McuMinINI_CONFIG_FS_TYPE_TINY_FS: + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"TinyFS\r\n"); break; + case McuMinINI_CONFIG_FS_TYPE_FAT_FS: + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"FatFS\r\n"); break; + case McuMinINI_CONFIG_FS_TYPE_FLASH_FS: + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"FLASH\r\n"); break; + case McuMinINI_CONFIG_FS_TYPE_LITTLE_FS: + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"littleFS\r\n"); break; + default: + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"unknown\r\n"); break; + } + McuShell_SendStatusStr((unsigned char*)" FS", buf, io->stdOut); + return ERR_OK; +} +#endif +/* +** =================================================================== +** Method : ini_getkey (component minIni) +** +** Description : +** Return the key inside a section +** Parameters : +** NAME - DESCRIPTION +** * Section - The name of the section to browse +** through, or NULL to browse through the keys +** outside any section +** idx - The zero-based sequence number of the key +** to return +** * Buffer - A pointer to the buffer to copy into +** BufferSize - The maximum number of +** characters to copy +** * Filename - The name and full path of the . +** ini file to read from +** Returns : +** --- - The number of characters copied into the +** supplied buffer +** =================================================================== +*/ +/** +int McuMinINI_ini_getkey(const mTCHAR *Section, int idx, mTCHAR *Buffer, int BufferSize, const mTCHAR *Filename) +{ + Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : ini_getbool (component minIni) +** +** Description : +** Return a boolean key. A true boolean is found if one of the +** following is matched: +** - A string starting with 'y' or 'Y' +** - A string starting with 't' or 'T' +** - A string starting with '1' +** A false boolean is found if one of the following is matched: +** - A string starting with 'n' or 'N' +** - A string starting with 'f' or 'F' +** - A string starting with '0' +** Parameters : +** NAME - DESCRIPTION +** * Section - The name of the section to search +** for +** * Key - The name of the entry to find the value of +** DefValue - Default value in the event of a +** failed read; it should be zero (0) or one +** (1). +** * Filename - The name and full path of the . +** ini file to read from +** Returns : +** --- - The true/false flag as interpreted at Key +** =================================================================== +*/ +/** +int McuMinINI_ini_getbool(const mTCHAR *Section, const mTCHAR *Key, int DefValue, const mTCHAR *Filename) +{ + Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : ini_gets (component minIni) +** +** Description : +** Return the string for a given section and key. +** Parameters : +** NAME - DESCRIPTION +** * Section - The name of the section to search +** for +** * Key - Pointer to the name of the entry to find +** the value of +** * DefValue - Pointer to the default value in +** the event of a failed read +** * Buffer - A pointer to the buffer to copy into +** BufferSize - The maximum number of +** characters to copy +** * Filename - The name and full path of the . +** ini file to read from +** Returns : +** --- - The number of characters copied into the +** supplied buffer +** =================================================================== +*/ +/** +int McuMinINI_ini_gets(const mTCHAR *Section, const mTCHAR *Key, const mTCHAR *DefValue, nTCHAR *Buffer, int BufferSize, const mTCHAR *Filename) +{ + Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : ini_getl (component minIni) +** +** Description : +** Return the long integral value for a given section and key. +** Parameters : +** NAME - DESCRIPTION +** * Section - The name of the section to search +** for +** * Key - Pointer to the name of the entry to find +** the value of +** DefValue - Default value in the event of a +** failed read +** * Filename - The name and full path of the . +** ini file to read from +** Returns : +** --- - The value located at Key +** =================================================================== +*/ +/** +long McuMinINI_ini_getl(const mTCHAR *Section, const mTCHAR *Key, long DefValue, const mTCHAR *Filename) +{ + Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : ini_getsection (component minIni) +** +** Description : +** Return the key inside a section +** Parameters : +** NAME - DESCRIPTION +** idx - The zero-based sequence number of the +** section to return +** * Buffer - A pointer to the buffer to copy into +** BufferSize - The maximum number of +** characters to copy +** * Filename - The name and full path of the . +** ini file to read from +** Returns : +** --- - The number of characters copied into the +** supplied buffer +** =================================================================== +*/ +/** +int McuMinINI_ini_getsection(int idx, mTCHAR *Buffer, int BufferSize, const mTCHAR *Filename) +{ + Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : ini_putl (component minIni) +** +** Description : +** Writes a long integral value for a given section and key. +** Method is only enabled if 'Read only' is set to 'no' in the +** properties. +** Parameters : +** NAME - DESCRIPTION +** * Section - The name of the section to write +** the value in +** * Key - The name of the entry to write +** Value - The value to write +** * Filename - The name and full path of the . +** ini file to write to +** Returns : +** --- - 1 if successful, otherwise 0 +** =================================================================== +*/ +/** +int McuMinINI_ini_putl(const mTCHAR *Section, const mTCHAR *Key, long Value, const mTCHAR *Filename) +{ + Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : ini_puts (component minIni) +** +** Description : +** Writes a string value for a given section and key. Method is +** only enabled if 'Read only' is set to 'no' in the +** properties. +** Parameters : +** NAME - DESCRIPTION +** * Section - The name of the section to write +** the string in +** * Key - The name of the entry to write +** * Value - Pointer to the buffer the string, or +** NULL to erase the key +** * Filename - The name and full path of the . +** ini file to write to +** Returns : +** --- - 1 if successful, otherwise 0 +** =================================================================== +*/ +/** +int McuMinINI_ini_puts(const mTCHAR *Section, const mTCHAR *Key, const mTCHAR *Value, const mTCHAR *Filename) +{ + Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : ini_browse (component minIni) +** +** Description : +** Function to browse the ini file. With this function the file +** is opened only once. +** Parameters : +** NAME - DESCRIPTION +** Callback - a pointer to a function that +** will be called for every setting in the INI +** file. +** UserData - arbitrary data, which the +** function passes on the the Callback function +** Filename - the name and full path of the . +** ini file to read from +** Returns : +** --- - 1 on success, 0 on failure (INI file not +** found) +** =================================================================== +*/ +/** +int McuMinINI_ini_browse(INI_CALLBACK Callback, const void *UserData, const TCHAR *Filename) +{ + Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : ParseCommand (component minIni) +** +** Description : +** Shell Command Line parser +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command line +** * handled - Pointer to variable which tells if +** the command has been handled or not +** * io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuMinINI_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) +{ + const unsigned char *p; + unsigned char section[48], key[48], value[96], fileName[64]; + size_t lenRead; + + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, "McuMinINI help")==0) { + McuShell_SendHelpStr((unsigned char*)"McuMinINI", (const unsigned char*)"Group of McuMinINI commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" read ", (const unsigned char*)"Read a key from a section in a file\r\n", io->stdOut); +#if !McuMinINI_CONFIG_READ_ONLY + McuShell_SendHelpStr((unsigned char*)" write ", (const unsigned char*)"Write a key with value to a section in a file\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" delkey ", (const unsigned char*)"Delete a key in a section of file\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" delsec ", (const unsigned char*)"Delete a section in a file\r\n", io->stdOut); +#endif + *handled = TRUE; + return ERR_OK; + } else if ((McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) || (McuUtility_strcmp((char*)cmd, "McuMinINI status")==0)) { + *handled = TRUE; + return PrintStatus(io); + } else if (McuUtility_strncmp((char*)cmd, "McuMinINI read ", sizeof("McuMinINI read ")-1)==0) { + *handled = TRUE; + p = cmd + sizeof("McuMinINI read ")-1; + if (McuUtility_ReadEscapedName(p, fileName, sizeof(fileName), &lenRead, NULL, NULL)!=ERR_OK || lenRead==0) { + return ERR_FAILED; + } + p += lenRead; + McuUtility_SkipSpaces(&p); + if (McuUtility_ReadEscapedName(p, section, sizeof(section), &lenRead, NULL, NULL)!=ERR_OK || lenRead==0) { + return ERR_FAILED; + } + p += lenRead; + McuUtility_SkipSpaces(&p); + if (McuUtility_ReadEscapedName(p, key, sizeof(key), &lenRead, NULL, NULL)!=ERR_OK || lenRead==0) { + return ERR_FAILED; + } + p += lenRead; + if (*p != '\0') { /* still some arguments? */ + return ERR_FAILED; + } + if (ini_gets((const TCHAR *)section, (const TCHAR *)key, (const TCHAR *)"", (TCHAR *)value, sizeof(value), (const TCHAR *)fileName) == 0) { + return ERR_FAILED; + } + McuShell_SendStr(key, io->stdOut); + McuShell_SendStr((unsigned char*)"=", io->stdOut); + McuShell_SendStr(value, io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + return ERR_OK; +#if !McuMinINI_CONFIG_READ_ONLY + } else if (McuUtility_strncmp((char*)cmd, "McuMinINI write ", sizeof("McuMinINI write ")-1)==0) { + *handled = TRUE; + p = cmd + sizeof("McuMinINI write ")-1; + if (McuUtility_ReadEscapedName(p, fileName, sizeof(fileName), &lenRead, NULL, NULL)!=ERR_OK || lenRead==0) { + return ERR_FAILED; + } + p += lenRead; + McuUtility_SkipSpaces(&p); + if (McuUtility_ReadEscapedName(p, section, sizeof(section), &lenRead, NULL, NULL)!=ERR_OK || lenRead==0) { + return ERR_FAILED; + } + p += lenRead; + McuUtility_SkipSpaces(&p); + if (McuUtility_ReadEscapedName(p, key, sizeof(key), &lenRead, NULL, NULL)!=ERR_OK || lenRead==0) { + return ERR_FAILED; + } + p += lenRead; + McuUtility_SkipSpaces(&p); + if (McuUtility_ReadEscapedName(p, value, sizeof(value), &lenRead, NULL, NULL)!=ERR_OK || lenRead==0) { + return ERR_FAILED; + } + p += lenRead; + if (*p != '\0') { /* still some arguments? */ + return ERR_FAILED; + } + if (ini_puts((const TCHAR *)section, (const TCHAR *)key, (const TCHAR *)value, (const TCHAR *)fileName) == 0) { + return ERR_FAILED; + } + return ERR_OK; +#endif +#if !McuMinINI_CONFIG_READ_ONLY + } else if (McuUtility_strncmp((char*)cmd, "McuMinINI delkey ", sizeof("McuMinINI delkey ")-1)==0) { + *handled = TRUE; + p = cmd + sizeof("McuMinINI delkey ")-1; + if (McuUtility_ReadEscapedName(p, fileName, sizeof(fileName), &lenRead, NULL, NULL)!=ERR_OK || lenRead==0) { + return ERR_FAILED; + } + p += lenRead; + McuUtility_SkipSpaces(&p); + if (McuUtility_ReadEscapedName(p, section, sizeof(section), &lenRead, NULL, NULL)!=ERR_OK || lenRead==0) { + return ERR_FAILED; + } + p += lenRead; + McuUtility_SkipSpaces(&p); + if (McuUtility_ReadEscapedName(p, key, sizeof(key), &lenRead, NULL, NULL)!=ERR_OK || lenRead==0) { + return ERR_FAILED; + } + p += lenRead; + if (*p != '\0') { /* still some arguments? */ + return ERR_FAILED; + } + if (ini_puts((const TCHAR *)section, (const TCHAR *)key, NULL, (const TCHAR *)fileName) == 0) { + return ERR_FAILED; + } + return ERR_OK; +#endif +#if !McuMinINI_CONFIG_READ_ONLY + } else if (McuUtility_strncmp((char*)cmd, "McuMinINI delsec ", sizeof("McuMinINI delsec ")-1)==0) { + *handled = TRUE; + p = cmd + sizeof("McuMinINI delsec ")-1; + if (McuUtility_ReadEscapedName(p, fileName, sizeof(fileName), &lenRead, NULL, NULL)!=ERR_OK || lenRead==0) { + return ERR_FAILED; + } + p += lenRead; + McuUtility_SkipSpaces(&p); + if (McuUtility_ReadEscapedName(p, section, sizeof(section), &lenRead, NULL, NULL)!=ERR_OK || lenRead==0) { + return ERR_FAILED; + } + p += lenRead; + if (*p != '\0') { /* still some arguments? */ + return ERR_FAILED; + } + if (ini_puts((const TCHAR *)section, NULL, NULL, (const TCHAR *)fileName) == 0) { + return ERR_FAILED; + } + return ERR_OK; +#endif + } + return ERR_OK; +} +/* +** =================================================================== +** Method : Deinit (component minIni) +** +** Description : +** Module de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuMinINI_Deinit(void) +{ + (void)ini_deinit(); /* call low level function */ +} + +/* +** =================================================================== +** Method : Init (component minIni) +** +** Description : +** Module initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuMinINI_Init(void) +{ + (void)ini_init(); /* call low level function */ +} + +/* +** =================================================================== +** Method : ini_hassection (component minIni) +** +** Description : +** Used to find out if section exists. Returns 1 if the section +** has been found, 0 otherwise. +** Parameters : +** NAME - DESCRIPTION +** * Section - The name of the section +** * Filename - The name and full path of the . +** ini file to read from +** Returns : +** --- - The number of characters copied into the +** supplied buffer +** =================================================================== +*/ +/** +int McuMinINI_ini_hassection(const mTCHAR *Section, const mTCHAR *Filename) +{ + Implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : ini_haskey (component minIni) +** +** Description : +** Used to find if a key exists. Returns 1 if key has been +** found, 0 otherwise. +** Parameters : +** NAME - DESCRIPTION +** * Section - The name of the section +** * Key - The name of the entry to find +** * Filename - The name and full path of the . +** ini file +** Returns : +** --- - 1 if successful, otherwise 0 +** =================================================================== +*/ +/** +int McuMinINI_ini_haskey(const mTCHAR *Section, const mTCHAR *Key, const mTCHAR *Filename) +{ + Implemented as macro in the header file +} +*/ + +/* END McuMinINI. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/minIni/McuMinINI.h b/TSM_PicoW_Sensor/McuLib/minIni/McuMinINI.h new file mode 100644 index 0000000..af10916 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/minIni/McuMinINI.h @@ -0,0 +1,362 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuMinINI.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : minIni +** Version : Component 01.060, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2022-01-22, 12:01, # CodeGen: 775 +** Abstract : +** minIni is a programmer�s library to read and write ini files in embedded systems. +** Settings : +** Component name : McuMinINI +** minIni Version : 1.4 +** SDK : McuLib +** Portable strnicmp() : yes +** Use Real : no +** Read Only : no +** No Debug : yes +** FatFS : Disabled +** Source Folders : +** Source Folder : minIni +** Config Folder : minIni +** Contents : +** ini_getbool - int McuMinINI_ini_getbool(const mTCHAR *Section, const mTCHAR *Key, int... +** ini_gets - int McuMinINI_ini_gets(const mTCHAR *Section, const mTCHAR *Key, const mTCHAR... +** ini_puts - int McuMinINI_ini_puts(const mTCHAR *Section, const mTCHAR *Key, const mTCHAR... +** ini_getl - long McuMinINI_ini_getl(const mTCHAR *Section, const mTCHAR *Key, long... +** ini_putl - int McuMinINI_ini_putl(const mTCHAR *Section, const mTCHAR *Key, long Value,... +** ini_hassection - int McuMinINI_ini_hassection(const mTCHAR *Section, const mTCHAR *Filename); +** ini_getsection - int McuMinINI_ini_getsection(int idx, mTCHAR *Buffer, int BufferSize, const... +** ini_haskey - int McuMinINI_ini_haskey(const mTCHAR *Section, const mTCHAR *Key, const... +** ini_getkey - int McuMinINI_ini_getkey(const mTCHAR *Section, int idx, mTCHAR *Buffer, int... +** ini_browse - int McuMinINI_ini_browse(INI_CALLBACK Callback, const void *UserData, const... +** ParseCommand - uint8_t McuMinINI_ParseCommand(const unsigned char *cmd, bool *handled, const... +** Deinit - void McuMinINI_Deinit(void); +** Init - void McuMinINI_Init(void); +** +** (c) Copyright 2008-2021, CompuPhase; +** http : www.compuphase.com +** Processor Expert port: Erich Styger, 2014-2022, http://www.mcuoneclipse.com +** License: See miniIni_LICENSE.txt and minIni_NOTICE.txt +** Adaptions for Processor Expert: (c) Copyright 2012-2020, Erich Styger +** ###################################################################*/ +/*! +** @file McuMinINI.h +** @version 01.00 +** @brief +** minIni is a programmer�s library to read and write ini files in embedded systems. +*/ +/*! +** @addtogroup McuMinINI_module McuMinINI module documentation +** @{ +*/ + +#ifndef __McuMinINI_H +#define __McuMinINI_H + +/* MODULE McuMinINI. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuMinINIconfig.h" /* configuration */ + +#if McuMinINI_CONFIG_PARSE_COMMAND_ENABLED + #include "McuShell.h" /* Command line shell */ +#endif +#include "minIni.h" /* minIni Header file */ + + + + +#define McuMinINI_ini_getkey(Section, idx, Buffer, BufferSize, Filename) \ + ini_getkey(Section, idx, Buffer, BufferSize, Filename) +/* +** =================================================================== +** Method : ini_getkey (component minIni) +** +** Description : +** Return the key inside a section +** Parameters : +** NAME - DESCRIPTION +** * Section - The name of the section to browse +** through, or NULL to browse through the keys +** outside any section +** idx - The zero-based sequence number of the key +** to return +** * Buffer - A pointer to the buffer to copy into +** BufferSize - The maximum number of +** characters to copy +** * Filename - The name and full path of the . +** ini file to read from +** Returns : +** --- - The number of characters copied into the +** supplied buffer +** =================================================================== +*/ + +#define McuMinINI_ini_getbool(Section, Key, DefValue, Filename) \ + ini_getbool(Section, Key, DefValue, Filename) +/* +** =================================================================== +** Method : ini_getbool (component minIni) +** +** Description : +** Return a boolean key. A true boolean is found if one of the +** following is matched: +** - A string starting with 'y' or 'Y' +** - A string starting with 't' or 'T' +** - A string starting with '1' +** A false boolean is found if one of the following is matched: +** - A string starting with 'n' or 'N' +** - A string starting with 'f' or 'F' +** - A string starting with '0' +** Parameters : +** NAME - DESCRIPTION +** * Section - The name of the section to search +** for +** * Key - The name of the entry to find the value of +** DefValue - Default value in the event of a +** failed read; it should be zero (0) or one +** (1). +** * Filename - The name and full path of the . +** ini file to read from +** Returns : +** --- - The true/false flag as interpreted at Key +** =================================================================== +*/ + +#define McuMinINI_ini_gets(Section, Key, DefValue, Buffer, BufferSize, Filename) \ + ini_gets(Section, Key, DefValue, Buffer, BufferSize, Filename) +/* +** =================================================================== +** Method : ini_gets (component minIni) +** +** Description : +** Return the string for a given section and key. +** Parameters : +** NAME - DESCRIPTION +** * Section - The name of the section to search +** for +** * Key - Pointer to the name of the entry to find +** the value of +** * DefValue - Pointer to the default value in +** the event of a failed read +** * Buffer - A pointer to the buffer to copy into +** BufferSize - The maximum number of +** characters to copy +** * Filename - The name and full path of the . +** ini file to read from +** Returns : +** --- - The number of characters copied into the +** supplied buffer +** =================================================================== +*/ + +#define McuMinINI_ini_getl(Section, Key, DefValue, Filename) \ + ini_getl(Section, Key, DefValue, Filename) +/* +** =================================================================== +** Method : ini_getl (component minIni) +** +** Description : +** Return the long integral value for a given section and key. +** Parameters : +** NAME - DESCRIPTION +** * Section - The name of the section to search +** for +** * Key - Pointer to the name of the entry to find +** the value of +** DefValue - Default value in the event of a +** failed read +** * Filename - The name and full path of the . +** ini file to read from +** Returns : +** --- - The value located at Key +** =================================================================== +*/ + +#define McuMinINI_ini_getsection(idx, Buffer, BufferSize, Filename) \ + ini_getsection(idx, Buffer, BufferSize, Filename) +/* +** =================================================================== +** Method : ini_getsection (component minIni) +** +** Description : +** Return the key inside a section +** Parameters : +** NAME - DESCRIPTION +** idx - The zero-based sequence number of the +** section to return +** * Buffer - A pointer to the buffer to copy into +** BufferSize - The maximum number of +** characters to copy +** * Filename - The name and full path of the . +** ini file to read from +** Returns : +** --- - The number of characters copied into the +** supplied buffer +** =================================================================== +*/ + +#define McuMinINI_ini_putl(Section, Key, Value, Filename) \ + ini_putl(Section, Key, Value, Filename) +/* +** =================================================================== +** Method : ini_putl (component minIni) +** +** Description : +** Writes a long integral value for a given section and key. +** Method is only enabled if 'Read only' is set to 'no' in the +** properties. +** Parameters : +** NAME - DESCRIPTION +** * Section - The name of the section to write +** the value in +** * Key - The name of the entry to write +** Value - The value to write +** * Filename - The name and full path of the . +** ini file to write to +** Returns : +** --- - 1 if successful, otherwise 0 +** =================================================================== +*/ + +#define McuMinINI_ini_puts(Section, Key, Value, Filename) \ + ini_puts(Section, Key, Value, Filename); +/* +** =================================================================== +** Method : ini_puts (component minIni) +** +** Description : +** Writes a string value for a given section and key. Method is +** only enabled if 'Read only' is set to 'no' in the +** properties. +** Parameters : +** NAME - DESCRIPTION +** * Section - The name of the section to write +** the string in +** * Key - The name of the entry to write +** * Value - Pointer to the buffer the string, or +** NULL to erase the key +** * Filename - The name and full path of the . +** ini file to write to +** Returns : +** --- - 1 if successful, otherwise 0 +** =================================================================== +*/ + +#define McuMinINI_ini_browse(Callback, UserData, Filename) \ + ini_browse(Callback, UserData, Filename) +/* +** =================================================================== +** Method : ini_browse (component minIni) +** +** Description : +** Function to browse the ini file. With this function the file +** is opened only once. +** Parameters : +** NAME - DESCRIPTION +** Callback - a pointer to a function that +** will be called for every setting in the INI +** file. +** UserData - arbitrary data, which the +** function passes on the the Callback function +** Filename - the name and full path of the . +** ini file to read from +** Returns : +** --- - 1 on success, 0 on failure (INI file not +** found) +** =================================================================== +*/ + +#if McuMinINI_CONFIG_PARSE_COMMAND_ENABLED +uint8_t McuMinINI_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : ParseCommand (component minIni) +** +** Description : +** Shell Command Line parser +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command line +** * handled - Pointer to variable which tells if +** the command has been handled or not +** * io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ + +#endif +void McuMinINI_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component minIni) +** +** Description : +** Module de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuMinINI_Init(void); +/* +** =================================================================== +** Method : Init (component minIni) +** +** Description : +** Module initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +#define McuMinINI_ini_hassection(Section, Filename) \ + ini_hassection(Section, Filename) +/* +** =================================================================== +** Method : ini_hassection (component minIni) +** +** Description : +** Used to find out if section exists. Returns 1 if the section +** has been found, 0 otherwise. +** Parameters : +** NAME - DESCRIPTION +** * Section - The name of the section +** * Filename - The name and full path of the . +** ini file to read from +** Returns : +** --- - The number of characters copied into the +** supplied buffer +** =================================================================== +*/ + +#define McuMinINI_ini_haskey(Section, Key, Filename) \ + ini_haskey(Section, Key, Filename) +/* +** =================================================================== +** Method : ini_haskey (component minIni) +** +** Description : +** Used to find if a key exists. Returns 1 if key has been +** found, 0 otherwise. +** Parameters : +** NAME - DESCRIPTION +** * Section - The name of the section +** * Key - The name of the entry to find +** * Filename - The name and full path of the . +** ini file +** Returns : +** --- - 1 if successful, otherwise 0 +** =================================================================== +*/ + +/* END McuMinINI. */ + +#endif +/* ifndef __McuMinINI_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/minIni/McuMinINIconfig.h b/TSM_PicoW_Sensor/McuLib/minIni/McuMinINIconfig.h new file mode 100644 index 0000000..0551e4c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/minIni/McuMinINIconfig.h @@ -0,0 +1,80 @@ +/** + * \file + * \brief Configuration header file for MinINI + * Copyright (c) 2020-2021, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + * + * This header file is used to configure settings of the MinINI module. + */ +#ifndef __McuMinINI_CONFIG_H +#define __McuMinINI_CONFIG_H + +#define McuMinINI_CONFIG_FS_TYPE_GENERIC (0) /* Generic File System */ +#define McuMinINI_CONFIG_FS_TYPE_FAT_FS (1) /* FatFS File System */ +#define McuMinINI_CONFIG_FS_TYPE_TINY_FS (2) /* TinyFS File System */ +#define McuMinINI_CONFIG_FS_TYPE_FLASH_FS (3) /* Flash Page System */ +#define McuMinINI_CONFIG_FS_TYPE_LITTLE_FS (4) /* LittleFS File System */ + +#ifndef McuMinINI_CONFIG_FS + #define McuMinINI_CONFIG_FS (McuMinINI_CONFIG_FS_TYPE_GENERIC) + /*!< File System integration used, one of McuMinINI_CONFIG_FS_TYPE_GENERIC, McuMinINI_CONFIG_FS_TYPE_FAT_FS, McuMinINI_CONFIG_FS_TYPE_TINY_FS */ +#endif + +#define PORTABLE_STRNICMP + +#ifndef McuMinINI_CONFIG_USE_REAL + #define McuMinINI_CONFIG_USE_REAL (0) + /*!< if ini file handling includes handling of floating point data types */ +#endif + +#if McuMinINI_CONFIG_USE_REAL + #define INI_REAL double +#else + //#define INI_REAL double +#endif + +#ifndef McuMinINI_CONFIG_READ_ONLY + #define McuMinINI_CONFIG_READ_ONLY (0) +#endif + /*!< if ini file handling is read-only */ + +#ifndef McuMinINI_CONFIG_BUFFER_SIZE + #define McuMinINI_CONFIG_BUFFER_SIZE (64) +#endif + /*!< maximum line length, maximum path length, buffer is allocated on the stack! */ + +#ifndef NDEBUG + #define NDEBUG + /*!< comment above define to turn on assertions */ +#endif + +#if McuMinINI_CONFIG_FS==McuMinINI_CONFIG_FS_TYPE_FLASH_FS + /* flash memory settings */ + #ifndef McuMinINI_CONFIG_FLASH_NVM_NOF_BLOCKS + #define McuMinINI_CONFIG_FLASH_NVM_NOF_BLOCKS (1) + /*!< number of flash blocks */ + #endif + + #ifndef McuMinINI_CONFIG_FLASH_NVM_BLOCK_SIZE + #define McuMinINI_CONFIG_FLASH_NVM_BLOCK_SIZE (0x800) + /*!< must match FLASH_GetProperty(&s_flashDriver, kFLASH_PropertyPflash0SectorSize, &pflashSectorSize). + For LPC55Sxx it is 0x200, for LPC845 it is 0x400, for K22FN/K02FN it is 0x800 */ + #endif + + #ifndef McuMinINI_CONFIG_FLASH_NVM_ADDR_START + #define McuMinINI_CONFIG_FLASH_NVM_ADDR_START ((0+512*1024)-(McuMinINI_CONFIG_FLASH_NVM_NOF_BLOCKS*McuMinINI_CONFIG_FLASH_NVM_BLOCK_SIZE)) + /*!< last block in FLASH, start address of data in flash */ + #endif + + #ifndef McuMinINI_CONFIG_FLASH_NVM_MAX_DATA_SIZE + #define McuMinINI_CONFIG_FLASH_NVM_MAX_DATA_SIZE (128) + /*!< size for the data, less than McuMinINI_CONFIG_FLASH_NVM_BLOCK_SIZE to save memory. For LPC55Sxx it must be multiple of 0x200! */ + #endif +#endif /* McuMinINI_CONFIG_FS_TYPE_FLASH_FS */ + +#if !defined(McuMinINI_CONFIG_PARSE_COMMAND_ENABLED) + #define McuMinINI_CONFIG_PARSE_COMMAND_ENABLED (1) + /*!< 1: shell support enabled, 0: otherwise */ +#endif + +#endif /* __McuMinINI_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/minIni/minGlue-FatFs.c b/TSM_PicoW_Sensor/McuLib/minIni/minGlue-FatFs.c new file mode 100644 index 0000000..e61fa64 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/minIni/minGlue-FatFs.c @@ -0,0 +1,37 @@ +/* Glue functions for the minIni library, based on the FatFs and Petit-FatFs + * libraries, see http://elm-chan.org/fsw/ff/00index_e.html + * + * By CompuPhase, 2008-2012 + * This "glue file" is in the public domain. It is distributed without + * warranties or conditions of any kind, either express or implied. + * + * (The FatFs and Petit-FatFs libraries are copyright by ChaN and licensed at + * its own terms.) + */ + +#include "McuMinINIconfig.h" /* MinIni config file */ + +#if McuMinINI_CONFIG_FS==McuMinINI_CONFIG_FS_TYPE_FAT_FS +#include "ff.h" /* include tff.h for Tiny-FatFs */ +#include "minGlue-FatFs.h" +#include +#include + +int ini_rename(TCHAR *source, const TCHAR *dest) +{ + /* Function f_rename() does not allow drive letters in the destination file */ + char *drive = strchr(dest, ':'); + drive = (drive == NULL) ? (char*)dest : drive + 1; + return (f_rename(source, drive) == FR_OK); +} + +int ini_deinit(void) { + return 1; /* ok */ +} + +int ini_init(void) { + return 1; /* ok */ +} + +#endif /* McuMinINI_CONFIG_FS==McuMinINI_CONFIG_FS_TYPE_FAT_FS */ + diff --git a/TSM_PicoW_Sensor/McuLib/minIni/minGlue-FatFs.h b/TSM_PicoW_Sensor/McuLib/minIni/minGlue-FatFs.h new file mode 100644 index 0000000..31a44ca --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/minIni/minGlue-FatFs.h @@ -0,0 +1,67 @@ +/* Glue functions for the minIni library, based on the FatFs and Petit-FatFs + * libraries, see http://elm-chan.org/fsw/ff/00index_e.html + * + * By CompuPhase, 2008-2019 + * This "glue file" is in the public domain. It is distributed without + * warranties or conditions of any kind, either express or implied. + * + * (The FatFs and Petit-FatFs libraries are copyright by ChaN and licensed at + * its own terms.) + */ + +#ifndef _MINGLUE_FATFS_H__ +#define _MINGLUE_FATFS_H__ + +#include "McuMinINIconfig.h" /* MinIni configuration file */ + +#if McuMinINI_CONFIG_FS==McuMinINI_CONFIG_FS_TYPE_FAT_FS + +#ifdef __HIWARE__ + /* switching off some warnings */ + #pragma MESSAGE DISABLE C1420 /* Result of function call is ignored */ + #pragma MESSAGE DISABLE C5909 /* Assignment in condition */ +#endif + +/* You must set FF_USE_STRFUNC to 1 or 2 in the include file ff.h (or tff.h) + * to enable the "string functions" fgets() and fputs(). + */ +#include "ff.h" /* include tff.h for Tiny-FatFs */ + +/* When setting FF_USE_STRFUNC to 2 (for LF to CR/LF translation), INI_LINETERM + * should be defined to "\n" (otherwise "\r\n" will be translated by FatFS to + * "\r\r\n"). +*/ +#if defined FF_USE_STRFUNC && FF_USE_STRFUNC == 2 && !defined INI_LINETERM + #define INI_LINETERM "\n" +#endif + +#define INI_FILETYPE FIL +#define ini_openread(filename,file) (f_open((file), (filename), FA_READ+FA_OPEN_EXISTING) == FR_OK) +#define ini_openwrite(filename,file) (f_open((file), (filename), FA_WRITE+FA_CREATE_ALWAYS) == FR_OK) +#define ini_close(file) (f_close(file) == FR_OK) +#define ini_read(buffer,size,file) f_gets((buffer), (size), (file)) +#define ini_write(buffer,file) f_puts((buffer), (file)) +#define ini_remove(filename) (f_unlink(filename) == FR_OK) + +#define INI_FILEPOS unsigned long//DWORD +#define ini_tell(file,pos) (*(pos) = f_tell((file))) +#define ini_seek(file,pos) (f_lseek((file), *(pos)) == FR_OK) + +#define ini_assert(condition) /* empty */ + +int ini_rename(TCHAR *source, const TCHAR *dest); + +#if defined(INI_REAL) + #include /* for sprintf() */ + + #define ini_ftoa(string,value) sprintf((string),"%f",(value)) + #define ini_atof(string) (INI_REAL)strtod((string),NULL) +#endif /* defined INI_REAL */ + +int ini_deinit(void); +int ini_init(void); + +#endif /* McuMinINI_CONFIG_FS==McuMinINI_CONFIG_FS_TYPE_FAT_FS */ + +#endif /* _MINGLUE-FATFS_H__ */ + diff --git a/TSM_PicoW_Sensor/McuLib/minIni/minGlue-Flash.c b/TSM_PicoW_Sensor/McuLib/minIni/minGlue-Flash.c new file mode 100644 index 0000000..035fc21 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/minIni/minGlue-Flash.c @@ -0,0 +1,318 @@ +/* Glue functions for a flash (page) based storage system, without a file system. + * + * By CompuPhase, 2008-2012 + * This "glue file" is in the public domain. It is distributed without + * warranties or conditions of any kind, either express or implied. + * + */ + +#include "McuMinINIconfig.h" /* MinIni config file */ + +#if McuMinINI_CONFIG_FS==McuMinINI_CONFIG_FS_TYPE_FLASH_FS +#include "minGlue-Flash.h" +#include +#include +#include "McuLib.h" +#include "McuLog.h" +#include "McuUtility.h" +#include "McuFlash.h" + +/* NOTE: we only support one 'file' in FLASH, and only one 'file' in RAM. The one in RAM is for the read-write and temporary one */ +/* read-only FLASH 'file' is at McuMinINI_CONFIG_FLASH_NVM_ADDR_START */ +#if !McuMinINI_CONFIG_READ_ONLY + static unsigned char dataBuf[McuMinINI_CONFIG_FLASH_NVM_MAX_DATA_SIZE]; /* ini file for read/write */ +#endif + +int ini_openread(const TCHAR *filename, INI_FILETYPE *file) { + /* open file in read-only mode. This will use directly the data in FLASH */ + memset(file, 0, sizeof(INI_FILETYPE)); + file->header = (MinIniFlashFileHeader*)(McuMinINI_CONFIG_FLASH_NVM_ADDR_START); + file->data = (unsigned char*)file->header + sizeof(MinIniFlashFileHeader); + if (file->header->magicNumber != MININI_FLASH_MAGIC_DATA_NUMBER_ID) { + return 0; /* failed, magic number does not match */ + } + if (McuUtility_strcmp((char*)file->header->dataName, (char*)filename)!=0) { + return 0; /* failed, not the file name of the storage */ + } + file->curr = file->data; + file->isOpen = true; + file->isReadOnly = true; + return 1; /* ok */ +} + +static bool isTempFile(const TCHAR *filename) { + size_t len; + + len = McuUtility_strlen(filename); + if (len==0) { + return false; /* illegal file name */ + } + if (filename[len-1]=='~') { /* temporary file name */ + return true; + } + return false; +} + +#if !McuMinINI_CONFIG_READ_ONLY +int ini_openwrite(const TCHAR *filename, INI_FILETYPE *file) { + /* create always a new file */ + memset(file, 0, sizeof(INI_FILETYPE)); /* initialize all fields in header */ + memset(dataBuf, 0, sizeof(dataBuf)); /* initialize all data */ + file->header = (MinIniFlashFileHeader*)dataBuf; + file->data = (unsigned char*)file->header + sizeof(MinIniFlashFileHeader); + file->header->magicNumber = MININI_FLASH_MAGIC_DATA_NUMBER_ID; + McuUtility_strcpy(file->header->dataName, sizeof(file->header->dataName), (unsigned char*)filename); + file->header->dataSize = 0; + file->curr = file->data; + file->isOpen = true; + file->isReadOnly = false; + return 1; /* ok */ +} +#endif + +int ini_close(INI_FILETYPE *file) { + file->isOpen = false; + if (!file->isReadOnly && !isTempFile((const char*)file->header->dataName)) { /* RAM data, and not temp file? */ + /* store data in FLASH */ + if (McuFlash_Program((void*)McuMinINI_CONFIG_FLASH_NVM_ADDR_START, file->header, McuMinINI_CONFIG_FLASH_NVM_MAX_DATA_SIZE)!=ERR_OK) { + return 0; /* failed */ + } + } + return 1; /* ok */ +} + +int ini_read(TCHAR *buffer, size_t size, INI_FILETYPE *file) { + /* read a string until EOF or '\n' */ + unsigned char ch; + + buffer[0] = '\0'; /* zero terminate */ + for(;;) { + if (file->curr >= file->data+file->header->dataSize) { /* beyond boundaries? */ + file->curr = file->data+file->header->dataSize; /* point to max position possible, one byte beyond */ + return 0; /* EOF */ + } + ch = *file->curr; /* read character */ + file->curr++; /* move pointer */ + McuUtility_chcat((unsigned char*)buffer, size, ch); /* add character to buffer */ + if (ch=='\n') { /* reached end of line */ + return 1; /* ok */ + } + } + return 1; /* ok */ +} + +#if !McuMinINI_CONFIG_READ_ONLY +int ini_write(TCHAR *buffer, INI_FILETYPE *file) { + size_t len, remaining; + + /* write zero terminated string to file */ + if (file->isReadOnly) { + return 1; /* error, file is read-only */ + } + /* data is in RAM buffer */ + len = McuUtility_strlen(buffer); + remaining = dataBuf+sizeof(dataBuf)-file->curr; + McuUtility_strcpy(file->curr, remaining, (const unsigned char*)buffer); + file->curr += len; + if (file->curr >= (unsigned char*)file->header+McuMinINI_CONFIG_FLASH_NVM_MAX_DATA_SIZE) { /* outside valid memory? */ + file->curr = (unsigned char*)file->header+McuMinINI_CONFIG_FLASH_NVM_MAX_DATA_SIZE; /* set to highest possible location */ + return 0; /* error */ + } + if (file->curr >= file->data+file->header->dataSize) { /* moved beyond current size? file is growing */ + file->header->dataSize = file->curr - file->data; /* update size */ + return 1; /* ok */ + } + return 1; /* ok */ +} +#endif + +#if !McuMinINI_CONFIG_READ_ONLY +int ini_remove(const TCHAR *filename) { + MinIniFlashFileHeader *hp; + + /* check first if we are removing the data in FLASH */ + hp = (MinIniFlashFileHeader*)McuMinINI_CONFIG_FLASH_NVM_ADDR_START; + if ( hp->magicNumber==MININI_FLASH_MAGIC_DATA_NUMBER_ID /* valid file */ + && McuUtility_strcmp((char*)hp->dataName, filename)==0 /* file name matches */ + ) + { + /* flash data file */ + if (McuFlash_Erase((void*)McuMinINI_CONFIG_FLASH_NVM_ADDR_START, McuMinINI_CONFIG_FLASH_NVM_NOF_BLOCKS*McuMinINI_CONFIG_FLASH_NVM_BLOCK_SIZE)==ERR_OK) { + return 1; /* ok */ + } else { + return 0; /* error */ + } + } + /* check if we are removing the temp file */ + hp = (MinIniFlashFileHeader*)dataBuf; + if ( hp->magicNumber==MININI_FLASH_MAGIC_DATA_NUMBER_ID /* valid file */ + && McuUtility_strcmp((char*)hp->dataName, filename)==0 /* it the data in RAM */ + ) + { + /* RAM data file */ + memset(dataBuf, 0, sizeof(dataBuf)); + return 1; /* ok */ + } + return 0; /* error */ +} +#endif + +int ini_tell(INI_FILETYPE *file, INI_FILEPOS *pos) { + /* return the current file pointer (offset into file) */ + *pos = file->curr - file->data; + return 1; /* ok */ +} + +int ini_seek(INI_FILETYPE *file, INI_FILEPOS *pos) { + /* move the file pointer to the given position */ + file->curr = file->data + *pos; /* move current data pointer */ + if (file->curr >= (unsigned char*)file->header+McuMinINI_CONFIG_FLASH_NVM_MAX_DATA_SIZE) { /* outside limits? */ + file->curr = (unsigned char*)file->header + McuMinINI_CONFIG_FLASH_NVM_MAX_DATA_SIZE; /* back to valid range, which can be one byte beyond buffer */ + return 0; /* error, EOF */ + } + return 1; /* ok */ +} + +#if !McuMinINI_CONFIG_READ_ONLY +int ini_rename(const TCHAR *source, const TCHAR *dest) { + /* e.g. test.in~ -> test.ini: this always will do a store from RAM to FLASH! */ + MinIniFlashFileHeader *hp; + + if (isTempFile(source)) { /* store temporary file into flash */ + hp = (MinIniFlashFileHeader*)dataBuf; + if (McuUtility_strcmp((char*)hp->dataName, source)!=0) { /* file name in RAM does not match? */ + return 0; /* error */ + } + McuUtility_strcpy(hp->dataName, sizeof(hp->dataName), (unsigned char*)dest); /* rename file */ + /* store in flash */ + if (McuFlash_Program((void*)McuMinINI_CONFIG_FLASH_NVM_ADDR_START, (unsigned char*)dataBuf, sizeof(dataBuf))!=ERR_OK) { + return 0; /* failed */ + } + memset(dataBuf, 0, sizeof(dataBuf)); /* erase RAM file content */ + } + return 1; /* ok */ +} +#endif + +int ini_deinit(void) { + /* nothing needed */ + return 0; /* ok */ +} + +int ini_init(void) { +#if McuLib_CONFIG_CPU_IS_LPC55xx + if((McuMinINI_CONFIG_FLASH_NVM_MAX_DATA_SIZE%McuFlash_CONFIG_FLASH_BLOCK_SIZE)!=0) { +#elif McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_RP2040 + if((McuMinINI_CONFIG_FLASH_NVM_MAX_DATA_SIZE%McuFlash_CONFIG_FLASH_BLOCK_SIZE)!=0) { +#else + if( ! (McuMinINI_CONFIG_FLASH_NVM_MAX_DATA_SIZE==64 + || McuMinINI_CONFIG_FLASH_NVM_MAX_DATA_SIZE==128 + || McuMinINI_CONFIG_FLASH_NVM_MAX_DATA_SIZE==256 + || McuMinINI_CONFIG_FLASH_NVM_MAX_DATA_SIZE==512 + || McuMinINI_CONFIG_FLASH_NVM_MAX_DATA_SIZE==1024 + || McuMinINI_CONFIG_FLASH_NVM_MAX_DATA_SIZE==2048 + || McuMinINI_CONFIG_FLASH_NVM_MAX_DATA_SIZE==4096 + || McuMinINI_CONFIG_FLASH_NVM_MAX_DATA_SIZE==8192) + ) + { +#endif + /* data size (number of bytes) needs to be 64, 128, 256, 512, 1024 bytes for the flash programming! */ + McuLog_fatal("wrong size of data!"); + for(;;) {} + } + return 0; /* ok */ +} + +static void PrintDataStatus(const McuShell_StdIOType *io, MinIniFlashFileHeader *hp, const unsigned char *dataName) { + uint8_t buf[48]; + + if (!McuFlash_IsAccessible(hp, sizeof(MinIniFlashFileHeader))) { /* accessing erased FLASH on LPC55Sxx will cause hard fault! */ + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ERASED, not accessible\r\n"); + McuShell_SendStatusStr(dataName, buf, io->stdOut); + return; + } + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"magic 0x"); + McuUtility_strcatNum32Hex(buf, sizeof(buf), hp->magicNumber); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)", "); + if (hp->magicNumber==MININI_FLASH_MAGIC_DATA_NUMBER_ID) { + McuUtility_strcat(buf, sizeof(buf), hp->dataName); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)", size "); + McuUtility_strcatNum32u(buf, sizeof(buf), hp->dataSize); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)""); + } + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr(dataName, buf, io->stdOut); +} + +static uint8_t PrintStatus(const McuShell_StdIOType *io) { + uint8_t buf[48]; + + McuShell_SendStatusStr((unsigned char*)"ini", (unsigned char*)"ini flash status\r\n", io->stdOut); + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"start 0x"); + McuUtility_strcatNum32Hex(buf, sizeof(buf), McuMinINI_CONFIG_FLASH_NVM_ADDR_START); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)", block 0x"); + McuUtility_strcatNum16Hex(buf, sizeof(buf), McuMinINI_CONFIG_FLASH_NVM_BLOCK_SIZE); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)", nof "); + McuUtility_strcatNum16u(buf, sizeof(buf), McuMinINI_CONFIG_FLASH_NVM_NOF_BLOCKS); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" flash", buf, io->stdOut); + + McuUtility_Num32uToStr(buf, sizeof(buf), McuMinINI_CONFIG_FLASH_NVM_MAX_DATA_SIZE); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" bytes\r\n"); + McuShell_SendStatusStr((unsigned char*)" max data", buf, io->stdOut); + + PrintDataStatus(io, (MinIniFlashFileHeader*)McuMinINI_CONFIG_FLASH_NVM_ADDR_START, (const unsigned char*)" data"); +#if !McuMinINI_CONFIG_READ_ONLY + PrintDataStatus(io, (MinIniFlashFileHeader*)dataBuf, (const unsigned char*)" ram"); +#endif + return ERR_OK; +} + +static uint8_t DumpData(const McuShell_StdIOType *io) { + MinIniFlashFileHeader *hp; + const unsigned char *p; + + hp = (MinIniFlashFileHeader*)McuMinINI_CONFIG_FLASH_NVM_ADDR_START; + PrintDataStatus(io, hp, (const unsigned char*)"data"); + if (hp->magicNumber==MININI_FLASH_MAGIC_DATA_NUMBER_ID) { + p = (const unsigned char*)hp + sizeof(MinIniFlashFileHeader); + for(unsigned int i=0; idataSize; i++) { + io->stdOut(*p); + p++; + } + } + hp = (MinIniFlashFileHeader*)dataBuf; + PrintDataStatus(io, hp, (const unsigned char*)"ram"); + if (hp->magicNumber==MININI_FLASH_MAGIC_DATA_NUMBER_ID) { + p = (const unsigned char*)hp + sizeof(MinIniFlashFileHeader); + for(unsigned int i=0; idataSize; i++) { + io->stdOut(*p); + p++; + } + } + return ERR_OK; +} + +uint8_t ini_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) { + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, "ini help")==0) { + McuShell_SendHelpStr((unsigned char*)"ini", (const unsigned char*)"Group of flash ini commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" dump", (unsigned char*)"Dump data information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" erase", (unsigned char*)"Erase data information\r\n", io->stdOut); + *handled = TRUE; + return ERR_OK; + } else if ((McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) || (McuUtility_strcmp((char*)cmd, "ini status")==0)) { + *handled = TRUE; + return PrintStatus(io); + } else if (McuUtility_strcmp((char*)cmd, "ini dump")==0) { + *handled = TRUE; + return DumpData(io); + } else if (McuUtility_strcmp((char*)cmd, "ini erase")==0) { + *handled = TRUE; + return McuFlash_Erase((void*)McuMinINI_CONFIG_FLASH_NVM_ADDR_START, McuMinINI_CONFIG_FLASH_NVM_NOF_BLOCKS*McuMinINI_CONFIG_FLASH_NVM_BLOCK_SIZE); + } + return ERR_OK; +} + +#endif /* McuMinINI_CONFIG_FS==McuMinINI_CONFIG_FS_TYPE_KINETIS_FLASH_FS */ diff --git a/TSM_PicoW_Sensor/McuLib/minIni/minGlue-Flash.h b/TSM_PicoW_Sensor/McuLib/minIni/minGlue-Flash.h new file mode 100644 index 0000000..e8252c5 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/minIni/minGlue-Flash.h @@ -0,0 +1,77 @@ +/* Glue functions for the minIni library, for a Kinetis flash page + * + * By CompuPhase, 2008-2012 + * This "glue file" is in the public domain. It is distributed without + * warranties or conditions of any kind, either express or implied. + * + */ + +#ifndef _MINGLUE_FLASH_H__ +#define _MINGLUE_FLASH_H__ + +#include "McuMinINIconfig.h" /* MinIni config file */ +#include +#include + +#if McuMinINI_CONFIG_FS==McuMinINI_CONFIG_FS_TYPE_FLASH_FS + +#define INI_BUFFERSIZE (McuMinINI_CONFIG_BUFFER_SIZE) /* maximum line length, maximum path length */ + +#define MININI_FLASH_MAGIC_DATA_NUMBER_ID (0xFEEDBABE) /* magic ID to mark valid memory */ +typedef struct MinIniFlashFileHeader { + unsigned int magicNumber; /* magic ID: MAGIC_DATA_NUMBER_ID */ + unsigned char dataName[16]; /* file/data name, limited to 16 bytes, zero terminated */ + size_t dataSize; /* size of data, without this header */ +} MinIniFlashFileHeader; + +typedef struct { + MinIniFlashFileHeader *header; /* pointer to header, is at the start of the data */ + unsigned char *data; /* start of data */ + unsigned char *curr; /* current data/file pointer */ + bool isReadOnly; /* if file is for read and write or read-only */ + bool isOpen; /* if file is open or not */ +} MinIniaFlashDataFile_t; + + +#define TCHAR char +#define INI_FILETYPE MinIniaFlashDataFile_t +#define INI_FILEPOS size_t + +#define ini_assert(condition) /* empty */ + +int ini_openread(const TCHAR *filename, INI_FILETYPE *file); +int ini_openwrite(const TCHAR *filename, INI_FILETYPE *file); +int ini_close(INI_FILETYPE *file); +int ini_read(TCHAR *buffer, size_t size, INI_FILETYPE *file); +int ini_write(TCHAR *buffer, INI_FILETYPE *file); +int ini_remove(const TCHAR *filename); +int ini_tell(INI_FILETYPE *file, INI_FILEPOS *pos); +int ini_seek(INI_FILETYPE *file, INI_FILEPOS *pos); +int ini_rename(const TCHAR *source, const TCHAR *dest); + +#if defined(INI_REAL) + #include /* for sprintf() */ + + #define ini_ftoa(string,value) sprintf((string),"%f",(value)) + #define ini_atof(string) (INI_REAL)strtod((string),NULL) +#endif /* defined INI_REAL */ + +#include "McuShell.h" +uint8_t ini_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); + +/*! + * \brief Module de-initialization + * \return error code, 0 for no error + */ +int ini_deinit(void); + +/*! + * \brief Module initialization + * \return error code, 0 for no error + */ +int ini_init(void); + +#endif /* McuMinINI_CONFIG_FS==McuMinINI_CONFIG_FS_TYPE_FLASH_FS */ + +#endif /* _MINGLUE_FLASH_H__ */ + diff --git a/TSM_PicoW_Sensor/McuLib/minIni/minGlue-LittleFS.c b/TSM_PicoW_Sensor/McuLib/minIni/minGlue-LittleFS.c new file mode 100644 index 0000000..2de1d16 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/minIni/minGlue-LittleFS.c @@ -0,0 +1,64 @@ +/* Glue functions for the minIni library, based on the FatFs and Petit-FatFs + * libraries, see http://elm-chan.org/fsw/ff/00index_e.html + * + * By CompuPhase, 2008-2012 + * This "glue file" is in the public domain. It is distributed without + * warranties or conditions of any kind, either express or implied. + * + * (The FatFs and Petit-FatFs libraries are copyright by ChaN and licensed at + * its own terms.) + */ + +#include "littleFS/lfs.h" +#include "minGlue-LittleFS.h" +#include +#include +#include "McuUtility.h" + +#if McuMinINI_CONFIG_FS==McuMinINI_CONFIG_FS_TYPE_LITTLE_FS + +int ini_rename(char *source, const char *dest) { + lfs_t *FS_lfs = McuLFS_GetFileSystem(); + /* Function f_rename() does not allow drive letters in the destination file */ + char *drive = strchr(dest, ':'); + drive = (drive == NULL) ? (char*)dest : drive + 1; + return (lfs_rename(FS_lfs, source, dest) == 0); +} + +int ini_fileReadOpen(lfs_file_t *file, const char *name) { + lfs_t *FS_lfs = McuLFS_GetFileSystem(); + return (lfs_file_open(FS_lfs, file, name, LFS_O_RDONLY)== 0); +} + +int ini_fileWriteOpen(lfs_file_t *file, const char *name) { + lfs_t *FS_lfs = McuLFS_GetFileSystem(); + return (lfs_file_open(FS_lfs, file, name, LFS_O_RDWR | LFS_O_CREAT)== 0); +} + +int ini_fileClose(lfs_file_t *file) { + lfs_t *FS_lfs = McuLFS_GetFileSystem(); + return (lfs_file_close(FS_lfs, file) == 0); +} + +int ini_fileRemove(const char *filename) { + lfs_t *FS_lfs = McuLFS_GetFileSystem(); + return (lfs_remove(FS_lfs, filename) == 0); +} + +int ini_fileTell(lfs_file_t *file ,unsigned long* pos) { + lfs_t *FS_lfs = McuLFS_GetFileSystem(); + *pos = lfs_file_tell(FS_lfs, file); + return TRUE; +} + +int ini_fileSeek(lfs_file_t *file ,unsigned long* pos) { + lfs_t *FS_lfs = McuLFS_GetFileSystem(); + lfs_file_seek(FS_lfs, file, *pos, LFS_SEEK_SET); + return TRUE; +} + +void ini_init(void) {} +void ini_deinit(void) {} + + +#endif /* McuMinINI_CONFIG_FS_TYPE_LITTLE_FS */ diff --git a/TSM_PicoW_Sensor/McuLib/minIni/minGlue-LittleFS.h b/TSM_PicoW_Sensor/McuLib/minIni/minGlue-LittleFS.h new file mode 100644 index 0000000..f1d5890 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/minIni/minGlue-LittleFS.h @@ -0,0 +1,72 @@ +/* Glue functions for the minIni library, based on the FatFs and Petit-FatFs + * libraries, see http://elm-chan.org/fsw/ff/00index_e.html + * + * By CompuPhase, 2008-2012 + * This "glue file" is in the public domain. It is distributed without + * warranties or conditions of any kind, either express or implied. + * + * (The FatFs and Petit-FatFs libraries are copyright by ChaN and licensed at + * its own terms.) + */ + +#ifndef _MINGLUE_FATFS_H__ +#define _MINGLUE_FATFS_H__ + +#include "McuMinINIconfig.h" + +#if McuMinINI_CONFIG_FS==McuMinINI_CONFIG_FS_TYPE_LITTLE_FS + +#ifdef __HIWARE__ + /* switching off some warnings */ + #pragma MESSAGE DISABLE C1420 /* Result of function call is ignored */ + #pragma MESSAGE DISABLE C5909 /* Assignment in condition */ +#endif + +#define INI_BUFFERSIZE (McuMinINI_CONFIG_BUFFER_SIZE) /* maximum line length, maximum path length */ + +/* You must set _USE_STRFUNC to 1 or 2 in the include file ff.h (or tff.h) + * to enable the "string functions" fgets() and fputs(). + */ +#include "littleFS/lfs.h" +#include "littleFS/McuLittleFS.h" + +#define TCHAR char + +int ini_fileReadOpen(lfs_file_t *file, const char *name); +int ini_fileWriteOpen(lfs_file_t *file, const char *name); +int ini_fileClose(lfs_file_t *file); +int ini_fileRead( void *buffer, lfs_size_t size, lfs_file_t *file); +int ini_fileWrite( void *buffer, lfs_file_t *file); +int ini_fileRemove(const char *filename); +int ini_fileTell(lfs_file_t *file ,unsigned long* pos); +int ini_fileSeek(lfs_file_t *file ,unsigned long* pos); + +#define INI_FILETYPE lfs_file_t +#define ini_openread(filename,file) (ini_fileReadOpen((file), (filename))) +#define ini_openwrite(filename,file) (ini_fileWriteOpen((file), (filename))) +#define ini_close(file) (ini_fileClose(file)) +#define ini_read(buffer,size,file) McuLFS_gets((buffer), (size),(file)) +#define ini_write(buffer,file) McuLFS_puts((buffer), (file)) +#define ini_remove(filename) (ini_fileRemove(filename)) + +#define INI_FILEPOS unsigned long//DWORD +#define ini_tell(file,pos) (ini_fileTell((file),(pos))) +#define ini_seek(file,pos) (ini_fileSeek((file),(pos))) + +#define ini_assert(condition) /* empty */ + +void ini_init(void); +void ini_deinit(void); + +int ini_rename(char *source, const char *dest); + +#if defined(INI_REAL) + #include /* for sprintf() */ + + #define ini_ftoa(string,value) sprintf((string),"%f",(value)) + #define ini_atof(string) (INI_REAL)strtod((string),NULL) +#endif /* defined INI_REAL */ + +#endif /* McuMinINI_CONFIG_FS_TYPE_LITTLE_FS */ + +#endif /* _MINGLUE-FATFS_H__ */ diff --git a/TSM_PicoW_Sensor/McuLib/minIni/minGlue.h b/TSM_PicoW_Sensor/McuLib/minIni/minGlue.h new file mode 100644 index 0000000..9463fa7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/minIni/minGlue.h @@ -0,0 +1,49 @@ +/* Glue functions for the minIni library, based on the C/C++ stdio library + * + * Or better said: this file contains macros that maps the function interface + * used by minIni to the standard C/C++ file I/O functions. + * + * By CompuPhase, 2008-2014 + * This "glue file" is in the public domain. It is distributed without + * warranties or conditions of any kind, either express or implied. + */ + +#include "McuLib.h" /* SDK and API used */ +#include "McuMinINIconfig.h" /* MinIni config file */ + +#if McuMinINI_CONFIG_FS==McuMinINI_CONFIG_FS_TYPE_GENERIC + /* map required file I/O types and functions to the standard C library */ + #include + + #define INI_FILETYPE FILE* + #define ini_openread(filename,file) ((*(file) = fopen((filename),"rb")) != NULL) + #define ini_openwrite(filename,file) ((*(file) = fopen((filename),"wb")) != NULL) + #define ini_close(file) (fclose(*(file)) == 0) + #define ini_read(buffer,size,file) (fgets((buffer),(size),*(file)) != NULL) + #define ini_write(buffer,file) (fputs((buffer),*(file)) >= 0) + #define ini_rename(source,dest) (rename((source), (dest)) == 0) + #define ini_remove(filename) (remove(filename) == 0) + + #define INI_FILEPOS fpos_t + #define ini_tell(file,pos) (fgetpos(*(file), (pos)) == 0) + #define ini_seek(file,pos) (fsetpos(*(file), (pos)) == 0) + + /* for floating-point support, define additional types and functions */ + #define ini_ftoa(string,value) sprintf((string),"%f",(value)) + #define ini_atof(string) (INI_REAL)strtod((string),NULL) + + typedef char TCHAR; + + int ini_init(void); + int ini_deinit(void); + +#elif McuMinINI_CONFIG_FS==McuMinINI_CONFIG_FS_TYPE_FAT_FS + #include "minGlue-FatFs.h" +#elif McuMinINI_CONFIG_FS==McuMinINI_CONFIG_FS_TYPE_FLASH_FS + #include "minGlue-Flash.h" +#elif McuMinINI_CONFIG_FS==McuMinINI_CONFIG_FS_TYPE_LITTLE_FS + #include "minGlue-LittleFS.h" +#else + #error "define the type of system" +#endif + diff --git a/TSM_PicoW_Sensor/McuLib/minIni/minIni.c b/TSM_PicoW_Sensor/McuLib/minIni/minIni.c new file mode 100644 index 0000000..54da2e8 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/minIni/minIni.c @@ -0,0 +1,956 @@ +/* minIni - Multi-Platform INI file parser, suitable for embedded systems + * + * These routines are in part based on the article "Multiplatform .INI Files" + * by Joseph J. Graf in the March 1994 issue of Dr. Dobb's Journal. + * + * Copyright (c) CompuPhase, 2008-2021 + * + * 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. + * + * Version: $Id: minIni.c 53 2015-01-18 13:35:11Z thiadmer.riemersma@gmail.com $ + */ + +#if (defined _UNICODE || defined __UNICODE__ || defined UNICODE) && !defined INI_ANSIONLY +# if !defined UNICODE /* for Windows */ +# define UNICODE +# endif +# if !defined _UNICODE /* for C library */ +# define _UNICODE +# endif +#endif + +#define MININI_IMPLEMENTATION +#include "minIni.h" +#if defined NDEBUG + #ifndef assert + #define assert(e) + #endif +#else + #include +#endif + +#if !defined __T || defined INI_ANSIONLY + #include + #include + #include + #define TCHAR char + #define __T(s) s + #define _tcscat strcat + #define _tcschr strchr + #define _tcscmp strcmp + #define _tcscpy strcpy + #define _tcsicmp stricmp + #define _tcslen strlen + #define _tcsncmp strncmp + #define _tcsnicmp strnicmp + #define _tcsrchr strrchr + #define _tcstol strtol + #define _tcstod strtod + #define _totupper toupper + #define _stprintf sprintf + #define _tfgets fgets + #define _tfputs fputs + #define _tfopen fopen + #define _tremove remove + #define _trename rename +#endif + +#if defined __linux || defined __linux__ + #define __LINUX__ +#elif defined FREEBSD && !defined __FreeBSD__ + #define __FreeBSD__ +#elif defined(_MSC_VER) + #pragma warning(disable: 4996) /* for Microsoft Visual C/C++ */ +#endif +#if !defined strnicmp && !defined PORTABLE_STRNICMP + #if defined __LINUX__ || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__ || defined __NetBSD__ || defined __DragonFly__ || defined __GNUC__ + #define strnicmp strncasecmp + #endif +#endif +#if !defined _totupper + #define _totupper toupper +#endif + +#if !defined INI_LINETERM + #if defined __LINUX__ || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__ || defined __NetBSD__ || defined __DragonFly__ + #define INI_LINETERM __T("\n") + #else + #define INI_LINETERM __T("\r\n") + #endif +#endif +#if !defined INI_FILETYPE + #error Missing definition for INI_FILETYPE. +#endif + +#if !defined sizearray + #define sizearray(a) (sizeof(a) / sizeof((a)[0])) +#endif + +enum quote_option { + QUOTE_NONE, + QUOTE_ENQUOTE, + QUOTE_DEQUOTE, +}; + +#if defined PORTABLE_STRNICMP +int strnicmp(const TCHAR *s1, const TCHAR *s2, size_t n) +{ + while (n-- != 0 && (*s1 || *s2)) { + register int c1, c2; + c1 = *s1++; + if ('a' <= c1 && c1 <= 'z') + c1 += ('A' - 'a'); + c2 = *s2++; + if ('a' <= c2 && c2 <= 'z') + c2 += ('A' - 'a'); + if (c1 != c2) + return c1 - c2; + } + return 0; +} +#endif /* PORTABLE_STRNICMP */ + +static TCHAR *skipleading(const TCHAR *str) +{ + assert(str != NULL); + while ('\0' < *str && *str <= ' ') + str++; + return (TCHAR *)str; +} + +static TCHAR *skiptrailing(const TCHAR *str, const TCHAR *base) +{ + assert(str != NULL); + assert(base != NULL); + while (str > base && '\0' < *(str-1) && *(str-1) <= ' ') + str--; + return (TCHAR *)str; +} + +static TCHAR *striptrailing(TCHAR *str) +{ + TCHAR *ptr = skiptrailing(_tcschr(str, '\0'), str); + assert(ptr != NULL); + *ptr = '\0'; + return str; +} + +static TCHAR *ini_strncpy(TCHAR *dest, const TCHAR *source, size_t maxlen, enum quote_option option) +{ + size_t d, s; + + assert(maxlen>0); + assert(source != NULL && dest != NULL); + assert((dest < source || (dest == source && option != QUOTE_ENQUOTE)) || dest > source + strlen(source)); + if (option == QUOTE_ENQUOTE && maxlen < 3) + option = QUOTE_NONE; /* cannot store two quotes and a terminating zero in less than 3 characters */ + + switch (option) { + case QUOTE_NONE: + for (d = 0; d < maxlen - 1 && source[d] != '\0'; d++) + dest[d] = source[d]; + assert(d < maxlen); + dest[d] = '\0'; + break; + case QUOTE_ENQUOTE: + d = 0; + dest[d++] = '"'; + for (s = 0; source[s] != '\0' && d < maxlen - 2; s++, d++) { + if (source[s] == '"') { + if (d >= maxlen - 3) + break; /* no space to store the escape character plus the one that follows it */ + dest[d++] = '\\'; + } + dest[d] = source[s]; + } + dest[d++] = '"'; + dest[d] = '\0'; + break; + case QUOTE_DEQUOTE: + for (d = s = 0; source[s] != '\0' && d < maxlen - 1; s++, d++) { + if ((source[s] == '"' || source[s] == '\\') && source[s + 1] == '"') + s++; + dest[d] = source[s]; + } + dest[d] = '\0'; + break; + default: + assert(0); + } + + return dest; +} + +static TCHAR *cleanstring(TCHAR *string, enum quote_option *quotes) +{ + int isstring; + TCHAR *ep; + + assert(string != NULL); + assert(quotes != NULL); + + /* Remove a trailing comment */ + isstring = 0; + for (ep = string; *ep != '\0' && ((*ep != ';' && *ep != '#') || isstring); ep++) { + if (*ep == '"') { + if (*(ep + 1) == '"') + ep++; /* skip "" (both quotes) */ + else + isstring = !isstring; /* single quote, toggle isstring */ + } else if (*ep == '\\' && *(ep + 1) == '"') { + ep++; /* skip \" (both quotes */ + } + } + assert(ep != NULL && (*ep == '\0' || *ep == ';' || *ep == '#')); + *ep = '\0'; /* terminate at a comment */ + striptrailing(string); + /* Remove double quotes surrounding a value */ + *quotes = QUOTE_NONE; + if (*string == '"' && (ep = _tcschr(string, '\0')) != NULL && *(ep - 1) == '"') { + string++; + *--ep = '\0'; + *quotes = QUOTE_DEQUOTE; /* this is a string, so remove escaped characters */ + } + return string; +} + +static int getkeystring(INI_FILETYPE *fp, const TCHAR *Section, const TCHAR *Key, + int idxSection, int idxKey, TCHAR *Buffer, int BufferSize, + INI_FILEPOS *mark) +{ + TCHAR *sp, *ep; + int len, idx; + enum quote_option quotes; + TCHAR LocalBuffer[INI_BUFFERSIZE]; + + assert(fp != NULL); + /* Move through file 1 line at a time until a section is matched or EOF. If + * parameter Section is NULL, only look at keys above the first section. If + * idxSection is positive, copy the relevant section name. + */ + len = (Section != NULL) ? (int)_tcslen(Section) : 0; + if (len > 0 || idxSection >= 0) { + assert(idxSection >= 0 || Section != NULL); + idx = -1; + do { + do { + if (!ini_read(LocalBuffer, INI_BUFFERSIZE, fp)) + return 0; + sp = skipleading(LocalBuffer); + ep = _tcsrchr(sp, ']'); + } while (*sp != '[' || ep == NULL); + /* When arrived here, a section was found; now optionally skip leading and + * trailing whitespace. + */ + assert(sp != NULL && *sp == '['); + sp = skipleading(sp + 1); + assert(ep != NULL && *ep == ']'); + ep = skiptrailing(ep, sp); + } while ((((int)(ep-sp) != len || Section == NULL || _tcsnicmp(sp, Section, len) != 0) && ++idx != idxSection)); + if (idxSection >= 0) { + if (idx == idxSection) { + assert(ep != NULL); + *ep = '\0'; /* the end of the section name was found earlier */ + ini_strncpy(Buffer, sp, BufferSize, QUOTE_NONE); + return 1; + } + return 0; /* no more section found */ + } + } + + /* Now that the section has been found, find the entry. + * Stop searching upon leaving the section's area. + */ + assert(Key != NULL || idxKey >= 0); + len = (Key != NULL) ? (int)_tcslen(Key) : 0; + idx = -1; + do { + if (mark != NULL) + (void)ini_tell(fp, mark); /* optionally keep the mark to the start of the line */ + if (!ini_read(LocalBuffer,INI_BUFFERSIZE,fp) || *(sp = skipleading(LocalBuffer)) == '[') + return 0; + sp = skipleading(LocalBuffer); + ep = _tcschr(sp, '='); /* Parse out the equal sign */ + if (ep == NULL) + ep = _tcschr(sp, ':'); + } while (*sp == ';' || *sp == '#' || ep == NULL + || ((len == 0 || (int)(skiptrailing(ep,sp)-sp) != len || _tcsnicmp(sp,Key,len) != 0) && ++idx != idxKey)); + if (idxKey >= 0) { + if (idx == idxKey) { + assert(ep != NULL); + assert(*ep == '=' || *ep == ':'); + *ep = '\0'; + striptrailing(sp); + ini_strncpy(Buffer, sp, BufferSize, QUOTE_NONE); + return 1; + } + return 0; /* no more key found (in this section) */ + } + + /* Copy up to BufferSize chars to buffer */ + assert(ep != NULL); + assert(*ep == '=' || *ep == ':'); + sp = skipleading(ep + 1); + sp = cleanstring(sp, "es); /* Remove a trailing comment */ + ini_strncpy(Buffer, sp, BufferSize, quotes); + return 1; +} + +/** ini_gets() + * \param Section the name of the section to search for + * \param Key the name of the entry to find the value of + * \param DefValue default string in the event of a failed read + * \param Buffer a pointer to the buffer to copy into + * \param BufferSize the maximum number of characters to copy + * \param Filename the name and full path of the .ini file to read from + * + * \return the number of characters copied into the supplied buffer + */ +int ini_gets(const TCHAR *Section, const TCHAR *Key, const TCHAR *DefValue, + TCHAR *Buffer, int BufferSize, const TCHAR *Filename) +{ + INI_FILETYPE fp; + int ok = 0; + + if (Buffer == NULL || BufferSize <= 0 || Key == NULL) + return 0; + if (ini_openread(Filename, &fp)) { + ok = getkeystring(&fp, Section, Key, -1, -1, Buffer, BufferSize, NULL); + (void)ini_close(&fp); + } + if (!ok) + ini_strncpy(Buffer, (DefValue != NULL) ? DefValue : __T(""), BufferSize, QUOTE_NONE); + return (int)_tcslen(Buffer); +} + +/** ini_getl() + * \param Section the name of the section to search for + * \param Key the name of the entry to find the value of + * \param DefValue the default value in the event of a failed read + * \param Filename the name of the .ini file to read from + * + * \return the value located at Key + */ +long ini_getl(const TCHAR *Section, const TCHAR *Key, long DefValue, const TCHAR *Filename) +{ + TCHAR LocalBuffer[64]; + int len = ini_gets(Section, Key, __T(""), LocalBuffer, sizearray(LocalBuffer), Filename); + return (len == 0) ? DefValue + : ((len >= 2 && _totupper((int)LocalBuffer[1]) == 'X') ? _tcstol(LocalBuffer, NULL, 16) + : _tcstol(LocalBuffer, NULL, 10)); +} + +#if defined INI_REAL +/** ini_getf() + * \param Section the name of the section to search for + * \param Key the name of the entry to find the value of + * \param DefValue the default value in the event of a failed read + * \param Filename the name of the .ini file to read from + * + * \return the value located at Key + */ +INI_REAL ini_getf(const TCHAR *Section, const TCHAR *Key, INI_REAL DefValue, const TCHAR *Filename) +{ + TCHAR LocalBuffer[64]; + int len = ini_gets(Section, Key, __T(""), LocalBuffer, sizearray(LocalBuffer), Filename); + return (len == 0) ? DefValue : ini_atof(LocalBuffer); +} +#endif + +/** ini_getbool() + * \param Section the name of the section to search for + * \param Key the name of the entry to find the value of + * \param DefValue default value in the event of a failed read; it should + * zero (0) or one (1). + * \param Filename the name and full path of the .ini file to read from + * + * A true boolean is found if one of the following is matched: + * - A string starting with 'y' or 'Y' + * - A string starting with 't' or 'T' + * - A string starting with '1' + * + * A false boolean is found if one of the following is matched: + * - A string starting with 'n' or 'N' + * - A string starting with 'f' or 'F' + * - A string starting with '0' + * + * \return the true/false flag as interpreted at Key + */ +int ini_getbool(const TCHAR *Section, const TCHAR *Key, int DefValue, const TCHAR *Filename) +{ + TCHAR LocalBuffer[2] = __T(""); + int ret; + + ini_gets(Section, Key, __T(""), LocalBuffer, sizearray(LocalBuffer), Filename); + LocalBuffer[0] = (TCHAR)_totupper((int)LocalBuffer[0]); + if (LocalBuffer[0] == 'Y' || LocalBuffer[0] == '1' || LocalBuffer[0] == 'T') + ret = 1; + else if (LocalBuffer[0] == 'N' || LocalBuffer[0] == '0' || LocalBuffer[0] == 'F') + ret = 0; + else + ret = DefValue; + + return(ret); +} + +/** ini_getsection() + * \param idx the zero-based sequence number of the section to return + * \param Buffer a pointer to the buffer to copy into + * \param BufferSize the maximum number of characters to copy + * \param Filename the name and full path of the .ini file to read from + * + * \return the number of characters copied into the supplied buffer + */ +int ini_getsection(int idx, TCHAR *Buffer, int BufferSize, const TCHAR *Filename) +{ + INI_FILETYPE fp; + int ok = 0; + + if (Buffer == NULL || BufferSize <= 0 || idx < 0) + return 0; + if (ini_openread(Filename, &fp)) { + ok = getkeystring(&fp, NULL, NULL, idx, -1, Buffer, BufferSize, NULL); + (void)ini_close(&fp); + } + if (!ok) + *Buffer = '\0'; + return (int)_tcslen(Buffer); +} + +/** ini_getkey() + * \param Section the name of the section to browse through, or NULL to + * browse through the keys outside any section + * \param idx the zero-based sequence number of the key to return + * \param Buffer a pointer to the buffer to copy into + * \param BufferSize the maximum number of characters to copy + * \param Filename the name and full path of the .ini file to read from + * + * \return the number of characters copied into the supplied buffer + */ +int ini_getkey(const TCHAR *Section, int idx, TCHAR *Buffer, int BufferSize, const TCHAR *Filename) +{ + INI_FILETYPE fp; + int ok = 0; + + if (Buffer == NULL || BufferSize <= 0 || idx < 0) + return 0; + if (ini_openread(Filename, &fp)) { + ok = getkeystring(&fp, Section, NULL, -1, idx, Buffer, BufferSize, NULL); + (void)ini_close(&fp); + } + if (!ok) + *Buffer = '\0'; + return (int)_tcslen(Buffer); +} + +/** ini_hassection() + * \param Section the name of the section to search for + * \param Filename the name of the .ini file to read from + * + * \return 1 if the section is found, 0 if not found + */ +int ini_hassection(const mTCHAR *Section, const mTCHAR *Filename) +{ + TCHAR LocalBuffer[32]; /* dummy buffer */ + INI_FILETYPE fp; + int ok = 0; + + if (ini_openread(Filename, &fp)) { + ok = getkeystring(&fp, Section, NULL, -1, 0, LocalBuffer, sizearray(LocalBuffer), NULL); + (void)ini_close(&fp); + } + return ok; +} + +/** ini_haskey() + * \param Section the name of the section to search for + * \param Key the name of the entry to find the value of + * \param Filename the name of the .ini file to read from + * + * \return 1 if the key is found, 0 if not found + */ +int ini_haskey(const mTCHAR *Section, const mTCHAR *Key, const mTCHAR *Filename) +{ + TCHAR LocalBuffer[32]; /* dummy buffer */ + INI_FILETYPE fp; + int ok = 0; + + if (ini_openread(Filename, &fp)) { + ok = getkeystring(&fp, Section, Key, -1, -1, LocalBuffer, sizearray(LocalBuffer), NULL); + (void)ini_close(&fp); + } + return ok; +} + + +#if !defined INI_NOBROWSE +/** ini_browse() + * \param Callback a pointer to a function that will be called for every + * setting in the INI file. + * \param UserData arbitrary data, which the function passes on the + * \c Callback function + * \param Filename the name and full path of the .ini file to read from + * + * \return 1 on success, 0 on failure (INI file not found) + * + * \note The \c Callback function must return 1 to continue + * browsing through the INI file, or 0 to stop. Even when the + * callback stops the browsing, this function will return 1 + * (for success). + */ +int ini_browse(INI_CALLBACK Callback, void *UserData, const TCHAR *Filename) +{ + TCHAR LocalBuffer[INI_BUFFERSIZE]; + int lenSec, lenKey; + enum quote_option quotes; + INI_FILETYPE fp; + + if (Callback == NULL) + return 0; + if (!ini_openread(Filename, &fp)) + return 0; + + LocalBuffer[0] = '\0'; /* copy an empty section in the buffer */ + lenSec = (int)_tcslen(LocalBuffer) + 1; + for ( ;; ) { + TCHAR *sp, *ep; + if (!ini_read(LocalBuffer + lenSec, INI_BUFFERSIZE - lenSec, &fp)) + break; + sp = skipleading(LocalBuffer + lenSec); + /* ignore empty strings and comments */ + if (*sp == '\0' || *sp == ';' || *sp == '#') + continue; + /* see whether we reached a new section */ + ep = _tcsrchr(sp, ']'); + if (*sp == '[' && ep != NULL) { + sp = skipleading(sp + 1); + ep = skiptrailing(ep, sp); + *ep = '\0'; + ini_strncpy(LocalBuffer, sp, INI_BUFFERSIZE, QUOTE_NONE); + lenSec = (int)_tcslen(LocalBuffer) + 1; + continue; + } + /* not a new section, test for a key/value pair */ + ep = _tcschr(sp, '='); /* test for the equal sign or colon */ + if (ep == NULL) + ep = _tcschr(sp, ':'); + if (ep == NULL) + continue; /* invalid line, ignore */ + *ep++ = '\0'; /* split the key from the value */ + striptrailing(sp); + ini_strncpy(LocalBuffer + lenSec, sp, INI_BUFFERSIZE - lenSec, QUOTE_NONE); + lenKey = (int)_tcslen(LocalBuffer + lenSec) + 1; + /* clean up the value */ + sp = skipleading(ep); + sp = cleanstring(sp, "es); /* Remove a trailing comment */ + ini_strncpy(LocalBuffer + lenSec + lenKey, sp, INI_BUFFERSIZE - lenSec - lenKey, quotes); + /* call the callback */ + if (!Callback(LocalBuffer, LocalBuffer + lenSec, LocalBuffer + lenSec + lenKey, UserData)) + break; + } + + (void)ini_close(&fp); + return 1; +} +#endif /* INI_NOBROWSE */ + +#if !McuMinINI_CONFIG_READ_ONLY +static void ini_tempname(TCHAR *dest, const TCHAR *source, int maxlength) +{ + TCHAR *p; + + ini_strncpy(dest, source, maxlength, QUOTE_NONE); + p = _tcschr(dest, '\0'); + assert(p != NULL); + *(p - 1) = '~'; +} + +static enum quote_option check_enquote(const TCHAR *Value) +{ + const TCHAR *p; + + /* run through the value, if it has trailing spaces, or '"', ';' or '#' + * characters, enquote it + */ + assert(Value != NULL); + for (p = Value; *p != '\0' && *p != '"' && *p != ';' && *p != '#'; p++) + /* nothing */; + return (*p != '\0' || (p > Value && *(p - 1) == ' ')) ? QUOTE_ENQUOTE : QUOTE_NONE; +} + +static void writesection(TCHAR *LocalBuffer, const TCHAR *Section, INI_FILETYPE *fp) +{ + if (Section != NULL && _tcslen(Section) > 0) { + TCHAR *p; + LocalBuffer[0] = '['; + ini_strncpy(LocalBuffer + 1, Section, INI_BUFFERSIZE - 4, QUOTE_NONE); /* -1 for '[', -1 for ']', -2 for '\r\n' */ + p = _tcschr(LocalBuffer, '\0'); + assert(p != NULL); + *p++ = ']'; + _tcscpy(p, INI_LINETERM); /* copy line terminator (typically "\n") */ + if (fp != NULL) + (void)ini_write(LocalBuffer, fp); + } +} + +static void writekey(TCHAR *LocalBuffer, const TCHAR *Key, const TCHAR *Value, INI_FILETYPE *fp) +{ + TCHAR *p; + enum quote_option option = check_enquote(Value); + ini_strncpy(LocalBuffer, Key, INI_BUFFERSIZE - 3, QUOTE_NONE); /* -1 for '=', -2 for '\r\n' */ + p = _tcschr(LocalBuffer, '\0'); + assert(p != NULL); + *p++ = '='; + ini_strncpy(p, Value, INI_BUFFERSIZE - (p - LocalBuffer) - 2, option); /* -2 for '\r\n' */ + p = _tcschr(LocalBuffer, '\0'); + assert(p != NULL); + _tcscpy(p, INI_LINETERM); /* copy line terminator (typically "\n") */ + if (fp != NULL) + (void)ini_write(LocalBuffer, fp); +} + +static int cache_accum(const TCHAR *string, int *size, int max) +{ + int len = (int)_tcslen(string); + if (*size + len >= max) + return 0; + *size += len; + return 1; +} + +static int cache_flush(TCHAR *buffer, int *size, + INI_FILETYPE *rfp, INI_FILETYPE *wfp, INI_FILEPOS *mark) +{ + int terminator_len = (int)_tcslen(INI_LINETERM); + int pos = 0, pos_prev = -1; + + (void)ini_seek(rfp, mark); + assert(buffer != NULL); + buffer[0] = '\0'; + assert(size != NULL); + assert(*size <= INI_BUFFERSIZE); + while (pos < *size && pos != pos_prev) { + pos_prev = pos; /* to guard against zero bytes in the INI file */ + (void)ini_read(buffer + pos, INI_BUFFERSIZE - pos, rfp); + while (pos < *size && buffer[pos] != '\0') + pos++; /* cannot use _tcslen() because buffer may not be zero-terminated */ + } + if (buffer[0] != '\0') { + assert(pos > 0 && pos <= INI_BUFFERSIZE); + if (pos == INI_BUFFERSIZE) + pos--; + buffer[pos] = '\0'; /* force zero-termination (may be left unterminated in the above while loop) */ + (void)ini_write(buffer, wfp); + } + (void)ini_tell(rfp, mark); /* update mark */ + *size = 0; + /* return whether the buffer ended with a line termination */ + return (pos > terminator_len) && (_tcscmp(buffer + pos - terminator_len, INI_LINETERM) == 0); +} + +static int close_rename(INI_FILETYPE *rfp, INI_FILETYPE *wfp, const TCHAR *filename, TCHAR *buffer) +{ + (void)ini_close(rfp); + (void)ini_close(wfp); + (void)ini_tempname(buffer, filename, INI_BUFFERSIZE); + #if defined ini_remove || defined INI_REMOVE + (void)ini_remove(filename); + #endif + (void)ini_rename(buffer, filename); + return 1; +} + +/** ini_puts() + * \param Section the name of the section to write the string in + * \param Key the name of the entry to write, or NULL to erase all keys in the section + * \param Value a pointer to the buffer the string, or NULL to erase the key + * \param Filename the name and full path of the .ini file to write to + * + * \return 1 if successful, otherwise 0 + */ +int ini_puts(const TCHAR *Section, const TCHAR *Key, const TCHAR *Value, const TCHAR *Filename) +{ + INI_FILETYPE rfp; + INI_FILETYPE wfp; + INI_FILEPOS mark; + INI_FILEPOS head; + TCHAR *sp, *ep; + TCHAR LocalBuffer[INI_BUFFERSIZE]; + int len, match, flag, cachelen; + + assert(Filename != NULL); + if (!ini_openread(Filename, &rfp)) { + /* If the .ini file doesn't exist, make a new file */ + if (Key != NULL && Value != NULL) { + if (!ini_openwrite(Filename, &wfp)) + return 0; + writesection(LocalBuffer, Section, &wfp); + writekey(LocalBuffer, Key, Value, &wfp); + (void)ini_close(&wfp); + } + return 1; + } + + /* If parameters Key and Value are valid (so this is not an "erase" request) + * and the setting already exists, there are two short-cuts to avoid rewriting + * the INI file. + */ + if (Key != NULL && Value != NULL) { + match = getkeystring(&rfp, Section, Key, -1, -1, LocalBuffer, sizearray(LocalBuffer), &head); + if (match) { + /* if the current setting is identical to the one to write, there is + * nothing to do. + */ + if (_tcscmp(LocalBuffer,Value) == 0) { + (void)ini_close(&rfp); + return 1; + } + /* if the new setting has the same length as the current setting, and the + * glue file permits file read/write access, we can modify in place. + */ + #if defined ini_openrewrite || defined INI_OPENREWRITE + INI_FILEPOS tail; + /* we already have the start of the (raw) line, get the end too */ + (void)ini_tell(&rfp, &tail); + /* create new buffer (without writing it to file) */ + writekey(LocalBuffer, Key, Value, NULL); + if (_tcslen(LocalBuffer) == (size_t)(tail - head)) { + /* length matches, close the file & re-open for read/write, then + * write at the correct position + */ + (void)ini_close(&rfp); + if (!ini_openrewrite(Filename, &wfp)) + return 0; + (void)ini_seek(&wfp, &head); + (void)ini_write(LocalBuffer, &wfp); + (void)ini_close(&wfp); + return 1; + } + #endif + } + /* key not found, or different value & length -> proceed */ + } else if (Key != NULL && Value == NULL) { + /* Conversely, for a request to delete a setting; if that setting isn't + present, just return */ + match = getkeystring(&rfp, Section, Key, -1, -1, LocalBuffer, sizearray(LocalBuffer), NULL); + if (!match) { + (void)ini_close(&rfp); + return 1; + } + /* key found -> proceed to delete it */ + } + + /* Get a temporary file name to copy to. Use the existing name, but with + * the last character set to a '~'. + */ + (void)ini_close(&rfp); + ini_tempname(LocalBuffer, Filename, INI_BUFFERSIZE); + if (!ini_openwrite(LocalBuffer, &wfp)) + return 0; + /* In the case of (advisory) file locks, ini_openwrite() may have been blocked + * on the open, and after the block is lifted, the original file may have been + * renamed, which is why the original file was closed and is now reopened */ + if (!ini_openread(Filename, &rfp)) { + /* If the .ini file doesn't exist any more, make a new file */ + assert(Key != NULL && Value != NULL); + writesection(LocalBuffer, Section, &wfp); + writekey(LocalBuffer, Key, Value, &wfp); + (void)ini_close(&wfp); + return 1; + } + + (void)ini_tell(&rfp, &mark); + cachelen = 0; + + /* Move through the file one line at a time until a section is + * matched or until EOF. Copy to temp file as it is read. + */ + len = (Section != NULL) ? (int)_tcslen(Section) : 0; + if (len > 0) { + do { + if (!ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp)) { + /* Failed to find section, so add one to the end */ + flag = cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); + if (Key!=NULL && Value!=NULL) { + if (!flag) + (void)ini_write(INI_LINETERM, &wfp); /* force a new line behind the last line of the INI file */ + writesection(LocalBuffer, Section, &wfp); + writekey(LocalBuffer, Key, Value, &wfp); + } + return close_rename(&rfp, &wfp, Filename, LocalBuffer); /* clean up and rename */ + } + /* Check whether this line is a section */ + sp = skipleading(LocalBuffer); + ep = _tcsrchr(sp, ']'); + match = (*sp == '[' && ep != NULL); + if (match) { + /* A section was found, skip leading and trailing whitespace */ + assert(sp != NULL && *sp == '['); + sp = skipleading(sp + 1); + assert(ep != NULL && *ep == ']'); + ep = skiptrailing(ep, sp); + match = ((int)(ep-sp) == len && _tcsnicmp(sp, Section, len) == 0); + } + /* Copy the line from source to dest, but not if this is the section that + * we are looking for and this section must be removed + */ + if (!match || Key != NULL) { + if (!cache_accum(LocalBuffer, &cachelen, INI_BUFFERSIZE)) { + cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); + (void)ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp); + cache_accum(LocalBuffer, &cachelen, INI_BUFFERSIZE); + } + } + } while (!match); + } + cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); + /* when deleting a section, the section head that was just found has not been + * copied to the output file, but because this line was not "accumulated" in + * the cache, the position in the input file was reset to the point just + * before the section; this must now be skipped (again) + */ + if (Key == NULL) { + (void)ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp); + (void)ini_tell(&rfp, &mark); + } + + /* Now that the section has been found, find the entry. Stop searching + * upon leaving the section's area. Copy the file as it is read + * and create an entry if one is not found. + */ + len = (Key != NULL) ? (int)_tcslen(Key) : 0; + for( ;; ) { + if (!ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp)) { + /* EOF without an entry so make one */ + flag = cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); + if (Key!=NULL && Value!=NULL) { + if (!flag) + (void)ini_write(INI_LINETERM, &wfp); /* force a new line behind the last line of the INI file */ + writekey(LocalBuffer, Key, Value, &wfp); + } + return close_rename(&rfp, &wfp, Filename, LocalBuffer); /* clean up and rename */ + } + sp = skipleading(LocalBuffer); + ep = _tcschr(sp, '='); /* Parse out the equal sign */ + if (ep == NULL) + ep = _tcschr(sp, ':'); + match = (ep != NULL && len > 0 && (int)(skiptrailing(ep,sp)-sp) == len && _tcsnicmp(sp,Key,len) == 0); + if ((Key != NULL && match) || *sp == '[') + break; /* found the key, or found a new section */ + /* copy other keys in the section */ + if (Key == NULL) { + (void)ini_tell(&rfp, &mark); /* we are deleting the entire section, so update the read position */ + } else { + if (!cache_accum(LocalBuffer, &cachelen, INI_BUFFERSIZE)) { + cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); + (void)ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp); + cache_accum(LocalBuffer, &cachelen, INI_BUFFERSIZE); + } + } + } + /* the key was found, or we just dropped on the next section (meaning that it + * wasn't found); in both cases we need to write the key, but in the latter + * case, we also need to write the line starting the new section after writing + * the key + */ + flag = (*sp == '['); + cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); + if (Key != NULL && Value != NULL) + writekey(LocalBuffer, Key, Value, &wfp); + /* cache_flush() reset the "read pointer" to the start of the line with the + * previous key or the new section; read it again (because writekey() destroyed + * the buffer) + */ + (void)ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp); + if (flag) { + /* the new section heading needs to be copied to the output file */ + cache_accum(LocalBuffer, &cachelen, INI_BUFFERSIZE); + } else { + /* forget the old key line */ + (void)ini_tell(&rfp, &mark); + } + /* Copy the rest of the INI file */ + while (ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp)) { + if (!cache_accum(LocalBuffer, &cachelen, INI_BUFFERSIZE)) { + cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); + (void)ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp); + cache_accum(LocalBuffer, &cachelen, INI_BUFFERSIZE); + } + } + cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); + return close_rename(&rfp, &wfp, Filename, LocalBuffer); /* clean up and rename */ +} + +/* Ansi C "itoa" based on Kernighan & Ritchie's "Ansi C" book. */ +#define ABS(v) ((v) < 0 ? -(v) : (v)) + +static void strreverse(TCHAR *str) +{ + int i, j; + for (i = 0, j = (int)_tcslen(str) - 1; i < j; i++, j--) { + TCHAR t = str[i]; + str[i] = str[j]; + str[j] = t; + } +} + +static void long2str(long value, TCHAR *str) +{ + int i = 0; + long sign = value; + + /* generate digits in reverse order */ + do { + int n = (int)(value % 10); /* get next lowest digit */ + str[i++] = (TCHAR)(ABS(n) + '0'); /* handle case of negative digit */ + } while (value /= 10); /* delete the lowest digit */ + if (sign < 0) + str[i++] = '-'; + str[i] = '\0'; + + strreverse(str); +} + +/** ini_putl() + * \param Section the name of the section to write the value in + * \param Key the name of the entry to write + * \param Value the value to write + * \param Filename the name and full path of the .ini file to write to + * + * \return 1 if successful, otherwise 0 + */ +int ini_putl(const TCHAR *Section, const TCHAR *Key, long Value, const TCHAR *Filename) +{ + TCHAR LocalBuffer[32]; + long2str(Value, LocalBuffer); + return ini_puts(Section, Key, LocalBuffer, Filename); +} + +#if defined INI_REAL +/** ini_putf() + * \param Section the name of the section to write the value in + * \param Key the name of the entry to write + * \param Value the value to write + * \param Filename the name and full path of the .ini file to write to + * + * \return 1 if successful, otherwise 0 + */ +int ini_putf(const TCHAR *Section, const TCHAR *Key, INI_REAL Value, const TCHAR *Filename) +{ + TCHAR LocalBuffer[64]; + ini_ftoa(LocalBuffer, Value); + return ini_puts(Section, Key, LocalBuffer, Filename); +} +#endif /* INI_REAL */ +#endif /* !INI_READONLY */ + diff --git a/TSM_PicoW_Sensor/McuLib/minIni/minIni.h b/TSM_PicoW_Sensor/McuLib/minIni/minIni.h new file mode 100644 index 0000000..0a6cd04 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/minIni/minIni.h @@ -0,0 +1,173 @@ +/* minIni - Multi-Platform INI file parser, suitable for embedded systems + * + * Copyright (c) CompuPhase, 2008-2021 + * + * 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. + * + * Version: $Id: minIni.h 53 2015-01-18 13:35:11Z thiadmer.riemersma@gmail.com $ + */ +#ifndef MININI_H +#define MININI_H + +#include "McuMinINIconfig.h" /* MinIni config file */ +#include "minGlue.h" +#include /* for size_t */ + +#if (defined _UNICODE || defined __UNICODE__ || defined UNICODE) && !defined INI_ANSIONLY + #include + #define mTCHAR TCHAR +#else + /* force TCHAR to be "char", but only for minIni */ + #define mTCHAR char +#endif + +#if !defined INI_BUFFERSIZE + #define INI_BUFFERSIZE McuMinINI_CONFIG_BUFFER_SIZE +#endif + +#if defined __cplusplus + extern "C" { +#endif + +int ini_getbool(const mTCHAR *Section, const mTCHAR *Key, int DefValue, const mTCHAR *Filename); +long ini_getl(const mTCHAR *Section, const mTCHAR *Key, long DefValue, const mTCHAR *Filename); +int ini_gets(const mTCHAR *Section, const mTCHAR *Key, const mTCHAR *DefValue, mTCHAR *Buffer, int BufferSize, const mTCHAR *Filename); +int ini_getsection(int idx, mTCHAR *Buffer, int BufferSize, const mTCHAR *Filename); +int ini_getkey(const mTCHAR *Section, int idx, mTCHAR *Buffer, int BufferSize, const mTCHAR *Filename); + +int ini_hassection(const mTCHAR *Section, const mTCHAR *Filename); +int ini_haskey(const mTCHAR *Section, const mTCHAR *Key, const mTCHAR *Filename); + +#if defined INI_REAL +INI_REAL ini_getf(const mTCHAR *Section, const mTCHAR *Key, INI_REAL DefValue, const mTCHAR *Filename); +#endif + +#if !McuMinINI_CONFIG_READ_ONLY +int ini_putl(const mTCHAR *Section, const mTCHAR *Key, long Value, const mTCHAR *Filename); +int ini_puts(const mTCHAR *Section, const mTCHAR *Key, const mTCHAR *Value, const mTCHAR *Filename); +#if defined INI_REAL +int ini_putf(const mTCHAR *Section, const mTCHAR *Key, INI_REAL Value, const mTCHAR *Filename); +#endif +#endif /* !McuMinINI_CONFIG_READ_ONLY */ + +#if !defined INI_NOBROWSE +typedef int (*INI_CALLBACK)(const mTCHAR *Section, const mTCHAR *Key, const mTCHAR *Value, void *UserData); +int ini_browse(INI_CALLBACK Callback, void *UserData, const mTCHAR *Filename); +#endif /* INI_NOBROWSE */ + +#if defined PORTABLE_STRNICMP +int strnicmp(const TCHAR *s1, const TCHAR *s2, size_t n); +#endif /* PORTABLE_STRNICMP */ + +#if defined __cplusplus + } +#endif + + +#if defined __cplusplus + +#if defined __WXWINDOWS__ + #include "wxMinIni.h" +#else + #include + + /* The C++ class in minIni.h was contributed by Steven Van Ingelgem. */ + class minIni + { + public: + minIni(const std::string& filename) : iniFilename(filename) + { } + + bool getbool(const std::string& Section, const std::string& Key, bool DefValue=false) const + { return ini_getbool(Section.c_str(), Key.c_str(), int(DefValue), iniFilename.c_str()) != 0; } + + long getl(const std::string& Section, const std::string& Key, long DefValue=0) const + { return ini_getl(Section.c_str(), Key.c_str(), DefValue, iniFilename.c_str()); } + + int geti(const std::string& Section, const std::string& Key, int DefValue=0) const + { return static_cast(this->getl(Section, Key, long(DefValue))); } + + std::string gets(const std::string& Section, const std::string& Key, const std::string& DefValue="") const + { + char buffer[INI_BUFFERSIZE]; + ini_gets(Section.c_str(), Key.c_str(), DefValue.c_str(), buffer, INI_BUFFERSIZE, iniFilename.c_str()); + return buffer; + } + + std::string getsection(int idx) const + { + char buffer[INI_BUFFERSIZE]; + ini_getsection(idx, buffer, INI_BUFFERSIZE, iniFilename.c_str()); + return buffer; + } + + std::string getkey(const std::string& Section, int idx) const + { + char buffer[INI_BUFFERSIZE]; + ini_getkey(Section.c_str(), idx, buffer, INI_BUFFERSIZE, iniFilename.c_str()); + return buffer; + } + + bool hassection(const std::string& Section) const + { return ini_hassection(Section.c_str(), iniFilename.c_str()) != 0; } + + bool haskey(const std::string& Section, const std::string& Key) const + { return ini_haskey(Section.c_str(), Key.c_str(), iniFilename.c_str()) != 0; } + +#if defined INI_REAL + INI_REAL getf(const std::string& Section, const std::string& Key, INI_REAL DefValue=0) const + { return ini_getf(Section.c_str(), Key.c_str(), DefValue, iniFilename.c_str()); } +#endif + +#if !McuMinINI_CONFIG_READ_ONLY + bool put(const std::string& Section, const std::string& Key, long Value) const + { return ini_putl(Section.c_str(), Key.c_str(), Value, iniFilename.c_str()) != 0; } + + bool put(const std::string& Section, const std::string& Key, int Value) + { return ini_putl(Section.c_str(), Key.c_str(), (long)Value, iniFilename.c_str()) != 0; } + + bool put(const std::string& Section, const std::string& Key, bool Value) + { return ini_putl(Section.c_str(), Key.c_str(), (long)Value, iniFilename.c_str()) != 0; } + + bool put(const std::string& Section, const std::string& Key, const std::string& Value) + { return ini_puts(Section.c_str(), Key.c_str(), Value.c_str(), iniFilename.c_str()) != 0; } + + bool put(const std::string& Section, const std::string& Key, const char* Value) + { return ini_puts(Section.c_str(), Key.c_str(), Value, iniFilename.c_str()) != 0; } + +#if defined INI_REAL + bool put(const std::string& Section, const std::string& Key, INI_REAL Value) + { return ini_putf(Section.c_str(), Key.c_str(), Value, iniFilename.c_str()) != 0; } +#endif + + bool del(const std::string& Section, const std::string& Key) + { return ini_puts(Section.c_str(), Key.c_str(), 0, iniFilename.c_str()) != 0; } + + bool del(const std::string& Section) + { return ini_puts(Section.c_str(), 0, 0, iniFilename.c_str()) != 0; } +#endif + +#if !defined INI_NOBROWSE + bool browse(INI_CALLBACK Callback, void *UserData) const + { return ini_browse(Callback, UserData, iniFilename.c_str()) != 0; } +#endif + + private: + std::string iniFilename; + }; + +#endif /* __WXWINDOWS__ */ +#endif /* __cplusplus */ + +#endif /* MININI_H */ + diff --git a/TSM_PicoW_Sensor/McuLib/minIni/minIni_LICENSE.txt b/TSM_PicoW_Sensor/McuLib/minIni/minIni_LICENSE.txt new file mode 100644 index 0000000..e8f9cf6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/minIni/minIni_LICENSE.txt @@ -0,0 +1,191 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + + EXCEPTION TO THE APACHE 2.0 LICENSE + + As a special exception to the Apache License 2.0 (and referring to the + definitions in Section 1 of this license), you may link, statically or + dynamically, the "Work" to other modules to produce an executable file + containing portions of the "Work", and distribute that executable file + in "Object" form under the terms of your choice, without any of the + additional requirements listed in Section 4 of the Apache License 2.0. + This exception applies only to redistributions in "Object" form (not + "Source" form) and only if no modifications have been made to the "Work". + + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + + diff --git a/TSM_PicoW_Sensor/McuLib/minIni/minIni_NOTICE.txt b/TSM_PicoW_Sensor/McuLib/minIni/minIni_NOTICE.txt new file mode 100644 index 0000000..076ee92 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/minIni/minIni_NOTICE.txt @@ -0,0 +1,13 @@ +minIni is a programmer's library to read and write "INI" files in embedded +systems. The library takes little resources and can be configured for various +kinds of file I/O libraries. + +The method for portable INI file management in minIni is, in part based, on the +article "Multiplatform .INI Files" by Joseph J. Graf in the March 1994 issue of +Dr. Dobb's Journal. + +The C++ class in minIni.h was contributed by Steven Van Ingelgem. + +The option to compile minIni as a read-only library was contributed by Luca +Bassanello. + diff --git a/TSM_PicoW_Sensor/McuLib/rdimon/CMakeLists.txt b/TSM_PicoW_Sensor/McuLib/rdimon/CMakeLists.txt new file mode 100644 index 0000000..526cd54 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/rdimon/CMakeLists.txt @@ -0,0 +1,33 @@ +# file: Collect all files that need to be compiled. +# You can use a GLOB function as shown here, or explicitly mention the specific files +#file(GLOB FILES *.c *.h) + +set(THIS_LIBRARY_NAME rdimonLib) + +file(GLOB FILES + *.c +) + +# add_library: With this declaration, you express the intent to build a library. +# The first argument is the name of the library, +# the second argument are the files that will be compiled to create your library. +add_library(${THIS_LIBRARY_NAME} ${FILES}) + +# target_link_libraries: If you link with other libraries, list them here +target_link_libraries( + ${THIS_LIBRARY_NAME} + PUBLIC McuLib +) + +target_compile_definitions(${THIS_LIBRARY_NAME} PUBLIC + PICO_CMSIS_RENAME_EXCEPTIONS=0 # RP2040: do not use CMSIS vector names: causing issues/bug with linking libraries +) + +# target_include_directories: Libraries need to publish their header files +# so that you can import them in source code. This statement expresses where to find the files +# - typically in an include directory of your projects. +target_include_directories( + ${THIS_LIBRARY_NAME} + PUBLIC + . +) diff --git a/TSM_PicoW_Sensor/McuLib/rdimon/COPYING.LIBGLOSS b/TSM_PicoW_Sensor/McuLib/rdimon/COPYING.LIBGLOSS new file mode 100644 index 0000000..7ae0cd9 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/rdimon/COPYING.LIBGLOSS @@ -0,0 +1,485 @@ +The libgloss subdirectory is a collection of software from several sources. + +Each file may have its own copyright/license that is embedded in the source +file. Unless otherwise noted in the body of the source file(s), the following copyright +notices will apply to the contents of the libgloss subdirectory: + +(1) Red Hat Incorporated + +Copyright (c) 1994-2009 Red Hat, Inc. All rights reserved. + +This copyrighted material is made available to anyone wishing to use, modify, +copy, or redistribute it subject to the terms and conditions of the BSD +License. This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY expressed or implied, including the implied warranties +of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. A copy of this license +is available at http://www.opensource.org/licenses. Any Red Hat trademarks that +are incorporated in the source code or documentation are not subject to the BSD +License and may only be used or replicated with the express permission of +Red Hat, Inc. + +(2) University of California, Berkeley + +Copyright (c) 1981-2000 The Regents of the University of California. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the University nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. + +(3) DJ Delorie + +Copyright (C) 1993 DJ Delorie +All rights reserved. + +Redistribution, modification, and use in source and binary forms is permitted +provided that the above copyright notice and following paragraph are +duplicated in all such forms. + +This file is distributed WITHOUT ANY WARRANTY; without even the implied +warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +(4) (formerly GPL for fr30) + +The GPL is no longer applicable to the fr30 platform. The piece of +code (syscalls.c) referencing the GPL has been officially relicensed. + +(5) Advanced Micro Devices + +Copyright 1989, 1990 Advanced Micro Devices, Inc. + +This software is the property of Advanced Micro Devices, Inc (AMD) which +specifically grants the user the right to modify, use and distribute this +software provided this notice is not removed or altered. All other rights +are reserved by AMD. + +AMD MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO THIS +SOFTWARE. IN NO EVENT SHALL AMD BE LIABLE FOR INCIDENTAL OR CONSEQUENTIAL +DAMAGES IN CONNECTION WITH OR ARISING FROM THE FURNISHING, PERFORMANCE, OR +USE OF THIS SOFTWARE. + +So that all may benefit from your experience, please report any problems +or suggestions about this software to the 29K Technical Support Center at +800-29-29-AMD (800-292-9263) in the USA, or 0800-89-1131 in the UK, or +0031-11-1129 in Japan, toll free. The direct dial number is 512-462-4118. + +Advanced Micro Devices, Inc. +29K Support Products +Mail Stop 573 +5900 E. Ben White Blvd. +Austin, TX 78741 +800-292-9263 + +(6) - Analog Devices, Inc. (bfin-* targets) + +Copyright (C) 2006, 2008, 2009, 2011, 2012 Analog Devices, Inc. + +The authors hereby grant permission to use, copy, modify, distribute, +and license this software and its documentation for any purpose, provided +that existing copyright notices are retained in all copies and that this +notice is included verbatim in any distributions. No written agreement, +license, or royalty fee is required for any of the authorized uses. +Modifications to this software may be copyrighted by their authors +and need not follow the licensing terms described here, provided that +the new terms are clearly indicated on the first page of each file where +they apply. + +(7) University of Utah and the Computer Systems Laboratory (CSL) + [applies only to hppa*-*-pro* targets] +Copyright (c) 1990,1994 The University of Utah and +the Computer Systems Laboratory (CSL). All rights reserved. + +Permission to use, copy, modify and distribute this software is hereby +granted provided that (1) source code retains these copyright, permission, +and disclaimer notices, and (2) redistributions including binaries +reproduce the notices in supporting documentation, and (3) all advertising +materials mentioning features or use of this software display the following +acknowledgement: ``This product includes software developed by the +Computer Systems Laboratory at the University of Utah.'' + +THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS +IS" CONDITION. THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF +ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + +CSL requests users of this software to return to csl-dist@cs.utah.edu any +improvements that they make and grant CSL redistribution rights. + +(8) Sun Microsystems + +Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + +Developed at SunPro, a Sun Microsystems, Inc. business. +Permission to use, copy, modify, and distribute this +software is freely granted, provided that this notice is preserved. + +(9) Hewlett Packard + +(c) Copyright 1986 HEWLETT-PACKARD COMPANY + +To anyone who acknowledges that this file is provided "AS IS" +without any express or implied warranty: + +permission to use, copy, modify, and distribute this file +for any purpose is hereby granted without fee, provided that +the above copyright notice and this notice appears in all +copies, and that the name of Hewlett-Packard Company not be +used in advertising or publicity pertaining to distribution +of the software without specific, written prior permission. +Hewlett-Packard Company makes no representations about the +suitability of this software for any purpose. + +(10) Hans-Peter Nilsson + +Copyright (C) 2001 Hans-Peter Nilsson + +Permission to use, copy, modify, and distribute this software is +freely granted, provided that the above copyright notice, this notice +and the following disclaimer are preserved with no changes. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. + +(11) IBM Corp. spu processor (only spu-* targets) + +(C) Copyright IBM Corp. 2005, 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +(12) Jon Beniston (only lm32-* targets) + + Contributed by Jon Beniston + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + +(13) - Xilinx, Inc. (microblaze-* and powerpc-* targets) + +Copyright (c) 2004, 2009 Xilinx, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +3. Neither the name of Xilinx nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +(14) - National Semiconductor Corporation + +Copyright (c) 2004 National Semiconductor Corporation + +The authors hereby grant permission to use, copy, modify, distribute, +and license this software and its documentation for any purpose, provided +that existing copyright notices are retained in all copies and that this +notice is included verbatim in any distributions. No written agreement, +license, or royalty fee is required for any of the authorized uses. +Modifications to this software may be copyrighted by their authors +and need not follow the licensing terms described here, provided that +the new terms are clearly indicated on the first page of each file where +they apply. + + +(15) - CodeSourcery, Inc. (tic6x-* targets) + +Copyright (c) 2010 CodeSourcery, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of CodeSourcery nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY CODESOURCERY, INC. ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL CODESOURCERY BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +(16) - GPL with exception (sparc-*leon*, crx-*, cr16-* targets only) + + Copyright (C) 1992 Free Software Foundation, Inc. + Written By David Vinayak Henkel-Wallace, June 1992 + +This file is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +In addition to the permissions in the GNU General Public License, the +Free Software Foundation gives you unlimited permission to link the +compiled version of this file with other programs, and to distribute +those programs without any restriction coming from the use of this +file. (The General Public License restrictions do apply in other +respects; for example, they cover modification of the file, and +distribution when not linked into another program.) + +This file is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. + + As a special exception, if you link this library with files + compiled with GCC to produce an executable, this does not cause + the resulting executable to be covered by the GNU General Public License. + This exception does not however invalidate any other reasons why + the executable file might be covered by the GNU General Public License. + + +(17) - Adapteva, Inc. (epiphany-* targets) + +Copyright (c) 2011, Adapteva, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of Adapteva nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +(18) - Rolls-Royce Controls and Data Services Limited (visium-* targets) + +Copyright (c) 2015 Rolls-Royce Controls and Data Services Limited. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Rolls-Royce Controls and Data Services Limited nor + the names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +(19) - FTDI (ft32-* targets) + +Copyright (C) 2014 FTDI (support@ftdichip.com) + +The authors hereby grant permission to use, copy, modify, distribute, +and license this software and its documentation for any purpose, provided +that existing copyright notices are retained in all copies and that this +notice is included verbatim in any distributions. No written agreement, +license, or royalty fee is required for any of the authorized uses. +Modifications to this software may be copyrighted by their authors +and need not follow the licensing terms described here, provided that +the new terms are clearly indicated on the first page of each file where +they apply. + +(20) - Synopsys Inc (arc-* targets) + +Copyright (c) 2015, Synopsys, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1) Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +2) Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +3) Neither the name of the Synopsys, Inc., nor the names of its contributors +may be used to endorse or promote products derived from this software +without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +(21) BSD-2-Clause-FreeBSD (pru-* targets) + +SPDX-License-Identifier: BSD-2-Clause-FreeBSD + +Copyright (c) 2018-2019 Dimitar Dimitrov +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +(22) CodeSourcery, Inc (csky-* targets) + +Copyright (c) 2006 CodeSourcery Inc + +The authors hereby grant permission to use, copy, modify, distribute, +and license this software and its documentation for any purpose, provided +that existing copyright notices are retained in all copies and that this +notice is included verbatim in any distributions. No written agreement, +license, or royalty fee is required for any of the authorized uses. +Modifications to this software may be copyrighted by their authors +and need not follow the licensing terms described here, provided that +the new terms are clearly indicated on the first page of each file where +they apply. + +(23) - C-SKY Microsystems (csky-* targets) + +Copyright (c) 2020 C-SKY Microsystems All rights reserved. + +This copyrighted material is made available to anyone wishing to use, +modify, copy, or redistribute it subject to the terms and conditions +of the FreeBSD License. This program is distributed in the hope that +it will be useful, but WITHOUT ANY WARRANTY expressed or implied, +including the implied warranties of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. A copy of this license is available at +http://www.opensource.org/licenses. + +(24) - RISC-V Semihosting (riscv-* targets) + +Copyright (C) 2020 Embecosm Limited +SPDX-License-Identifier: BSD-2-Clause + diff --git a/TSM_PicoW_Sensor/McuLib/rdimon/McuRdimon.c b/TSM_PicoW_Sensor/McuLib/rdimon/McuRdimon.c new file mode 100644 index 0000000..10b95cb --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/rdimon/McuRdimon.c @@ -0,0 +1,439 @@ +/*! +** \file McuRdimon.c +** \brief Implementation of the Remote Debugger Interface. +*/ + +/* Support files for GNU libc. + Implementation has been used from + gcc-arm-none-eabi-10.3-2021.10-src\gcc-arm-none-eabi-10.3-2021.10\src\newlib\libgloss\arm\syscalls.c + and adapted and simplifying using the McuSemihost library. + */ + +#include "McuRdimon.h" + +#if McuRdimon_CONFIG_IS_ENABLED +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "McuSemihost.h" + +int _stat (const char *, struct stat *); + +/* Struct used to keep track of the file position, just so we + can implement fseek(fh,x,SEEK_CUR). */ +struct fdent { + int handle; /* file handle */ + int pos; /* position in file */ +}; + +#define MAX_OPEN_FILES 20 + +/* User file descriptors (fd) are integer indexes into + the openfiles[] array. Error checking is done by using + findslot(). + + This openfiles array is manipulated directly by only + these 5 functions: + + findslot() - Translate entry. + newslot() - Find empty entry. + initialise_monitor_handles() - Initialize entries. + _swiopen() - Initialize entry. + _close() - Handle stdout == stderr case. + + Every other function must use findslot(). */ + +static struct fdent openfiles [MAX_OPEN_FILES]; + +static int monitor_stdin; +static int monitor_stdout; +static int monitor_stderr; + +/* Return a pointer to the structure associated with + the user file descriptor fd. */ +static struct fdent*findslot (int fd) { + /* User file descriptor is out of range. */ + if ((unsigned int)fd >= MAX_OPEN_FILES) { + return NULL; + } + /* User file descriptor is open? */ + if (openfiles[fd].handle == -1) { + return NULL; + } + /* Valid. */ + return &openfiles[fd]; +} + +/* Return the next lowest numbered free file + structure, or -1 if we can't find one. */ +static int newslot (void) { + int i; + + for (i = 0; i < MAX_OPEN_FILES; i++) { + if (openfiles[i].handle == -1) { + break; + } + } + if (i == MAX_OPEN_FILES) { + return -1; + } + return i; +} + +static int get_errno (void) { + return McuSemihost_SysErrNo(); +} + +/* Set errno and return result. */ +static int error (int result) { + errno = get_errno (); + return result; +} + +/* fh, is a valid internal file handle. + ptr, is a null terminated string. + len, is the length in bytes to read. + Returns the number of bytes *not* written. */ +int _swiread (int fh, void * ptr, size_t len) { + return McuSemihost_SysFileRead(fh, ptr, len); +} + +/* fd, is a valid user file handle. + Translates the return of _swiread into + bytes read. */ +int __attribute__((weak)) _read (int fd, void * ptr, size_t len) { + int res; + struct fdent *pfd; + + pfd = findslot (fd); + if (pfd == NULL) { + errno = EBADF; + return -1; + } + res = _swiread (pfd->handle, ptr, len); + if (res == -1) { + return res; + } + pfd->pos += len - res; + /* res == len is not an error, + at least if we want feof() to work. */ + return len - res; +} + +/* fd, is a user file descriptor. */ +off_t _swilseek (int fd, off_t ptr, int dir) { + off_t res; + struct fdent *pfd; + + /* Valid file descriptor? */ + pfd = findslot (fd); + if (pfd == NULL) { + errno = EBADF; + return -1; + } + /* Valid whence? */ + if ((dir != SEEK_CUR) + && (dir != SEEK_SET) + && (dir != SEEK_END)) + { + errno = EINVAL; + return -1; + } + /* Convert SEEK_CUR to SEEK_SET */ + if (dir == SEEK_CUR) { + ptr = pfd->pos + ptr; + /* The resulting file offset would be negative. */ + if (ptr < 0) { + errno = EINVAL; + if ((pfd->pos > 0) && (ptr > 0)) { + errno = EOVERFLOW; + } + return -1; + } + dir = SEEK_SET; + } + if (dir == SEEK_END) { + res = McuSemihost_SysFileLen(pfd->handle); + if (res == -1) { + return -1; + } + ptr += res; + } + /* This code only does absolute seeks. */ + res = McuSemihost_SysFileSeek(pfd->handle, (int)ptr); + /* At this point ptr is the current file position. */ + if (res >= 0) { + pfd->pos = ptr; + return ptr; + } else { + return -1; + } +} + +off_t _lseek (int fd, off_t ptr, int dir) { + return _swilseek (fd, ptr, dir); +} + +/* fh, is a valid internal file handle. + Returns the number of bytes *not* written. */ +int _swiwrite (int fh, const void * ptr, size_t len) { + return McuSemihost_SysFileWrite(fh, ptr, len); +} + +/* fd, is a user file descriptor. */ +int __attribute__((weak)) _write (int fd, const void * ptr, size_t len) { + int res; + struct fdent *pfd; + + pfd = findslot (fd); + if (pfd == NULL) { + errno = EBADF; + return -1; + } + res = _swiwrite (pfd->handle, ptr,len); + /* Clearly an error. */ + if (res < 0) { + return -1; + } + pfd->pos += len - res; + /* We wrote 0 bytes? + Retrieve errno just in case. */ + if ((len - res) == 0) { + return error (0); + } + return (len - res); +} + +int _swiopen (const char *path, int flags) { + int aflags = 0, fh; + + int fd = newslot (); + if (fd == -1) { + errno = EMFILE; + return -1; + } + /* It is an error to open a file that already exists. */ + if ((flags & O_CREAT) && (flags & O_EXCL)) { + struct stat st; + int res; + res = _stat(path, &st); + if (res != -1) { + errno = EEXIST; + return -1; + } + } + /* The flags are Unix-style, so we need to convert them. */ +#ifdef O_BINARY + if (flags & O_BINARY) + aflags |= SYS_FILE_MODE_READBINARY; +#endif + /* In O_RDONLY we expect aflags == 0. */ + if (flags & O_RDWR) { + aflags |= SYS_FILE_MODE_READWRITE; + } + if ((flags & O_CREAT) + || (flags & O_TRUNC) + || (flags & O_WRONLY)) + { + aflags |= SYS_FILE_MODE_WRITE; + } + if (flags & O_APPEND) { + aflags &= ~SYS_FILE_MODE_WRITE; /* Can't ask for w AND a; means just 'a'. */ + aflags |= SYS_FILE_MODE_APPEND; + } + fh = McuSemihost_SysFileOpen((const unsigned char*)path, aflags); + /* Return a user file descriptor or an error. */ + if (fh >= 0) { + openfiles[fd].handle = fh; + openfiles[fd].pos = 0; + return fd; + } else { + return error (fh); + } +} + +int _open (const char * path, int flags, ...) { + return _swiopen (path, flags); +} + +int _close (int fd) { + int res; + struct fdent *pfd; + + pfd = findslot (fd); + if (pfd == NULL) { + errno = EBADF; + return -1; + } + /* Handle stderr == stdout. */ + if ((fd == 1 || fd == 2) + && (openfiles[1].handle == openfiles[2].handle)) + { + pfd->handle = -1; + return 0; + } + + /* Attempt to close the handle. */ + res = McuSemihost_SysFileClose(pfd->handle); + /* Reclaim handle? */ + if (res == 0) { + pfd->handle = -1; + } + return res; +} + +int _swistat (int fd, struct stat * st) { + struct fdent *pfd; + int res; + + pfd = findslot (fd); + if (pfd == NULL) { + errno = EBADF; + return -1; + } + /* Always assume a character device, + with 1024 byte blocks. */ + st->st_mode |= S_IFCHR; + st->st_blksize = 1024; + res = McuSemihost_SysFileLen(pfd->handle); + if (res == -1) { + return -1; + } + st->st_size = res; /* set the file size. */ + return 0; +} + +int __attribute__((weak)) _fstat (int fd, struct stat * st) { + memset (st, 0, sizeof (*st)); + return _swistat (fd, st); +} + +int __attribute__((weak)) _stat (const char *fname, struct stat *st) { + int fd, res; + memset (st, 0, sizeof (* st)); + /* The best we can do is try to open the file readonly. If it exists, + then we can guess a few things about it. */ + if ((fd = _open (fname, O_RDONLY)) == -1) { + return -1; + } + #ifndef S_IREAD /* define locally, e.g. because __BSD_VISIBLE might not be set to 1 */ + #define S_IREAD 0000400 /* read permission, owner */ + #endif + st->st_mode |= S_IFREG | S_IREAD; + res = _swistat (fd, st); + /* Not interested in the error. */ + _close (fd); + return res; +} + +int _unlink (const char *path) { +#if McuSemihost_CONFIG_HAS_SYS_REMOVE + int res; + res = McuSemihost_SysFileRemove((const unsigned char*)path); + if (res == -1) { + return error (res); + } + return 0; +#else + return -1; +#endif +} + +int _gettimeofday (struct timeval * tp, void * tzvp) { + struct timezone *tzp = tzvp; + if (tp) { + /* Ask the host for the seconds since the Unix epoch. */ + tp->tv_sec = McuSemihost_SysHostTime(); + tp->tv_usec = 0; + } + /* Return fixed data for the timezone. */ + if (tzp) { + tzp->tz_minuteswest = 0; + tzp->tz_dsttime = 0; + } + return 0; +} + +/* Return a clock that ticks at 100Hz. */ +clock_t _clock (void) { + clock_t timeval; + + timeval = McuSemihost_SysHostClock(); + return timeval; +} + +/* Return a clock that ticks at 100Hz. */ +clock_t _times (struct tms * tp) { + clock_t timeval = _clock(); + if (tp) { + tp->tms_utime = timeval; /* user time */ + tp->tms_stime = 0; /* system time */ + tp->tms_cutime = 0; /* user time, children */ + tp->tms_cstime = 0; /* system time, children */ + } + return timeval; +}; + +int _isatty (int fd) { + struct fdent *pfd; + int tty; + + pfd = findslot (fd); + if (pfd == NULL) { + errno = EBADF; + return 0; + } + tty = McuSemihost_SysIsTTY(pfd->handle); + if (tty == 1) { + return 1; + } + errno = get_errno(); + return 0; +} + +int _rename (const char *oldpath, const char *newpath) { +#if McuSemihost_CONFIG_HAS_SYS_RENAME + return McuSemihost_SysFileRename((const unsigned char*)oldpath, (const unsigned char*)newpath); +#else + return -1; +#endif +} + +void McuRdimon_Init(void) { + /* Open the standard file descriptors by opening the special + * teletype device, ":tt", read-only to obtain a descriptor for + * standard input and write-only to obtain a descriptor for standard + * output. Finally, open ":tt" in append mode to obtain a descriptor + * for standard error. Since this is a write mode, most kernels will + * probably return the same value as for standard output, but the + * kernel can differentiate the two using the mode flag and return a + * different descriptor for standard error. + */ + monitor_stdin = McuSemihost_SysFileOpen((unsigned char*)":tt", SYS_FILE_MODE_READ); /* stdin */ + monitor_stdout = McuSemihost_SysFileOpen((unsigned char*)":tt", SYS_FILE_MODE_WRITE); /* stdout */ + monitor_stderr = McuSemihost_SysFileOpen((unsigned char*)":tt", SYS_FILE_MODE_APPEND); /* stderr */ + for (int i = 0; i < MAX_OPEN_FILES; i ++) { + openfiles[i].handle = -1; + } + + /* If we failed to open stderr, redirect to stdout. */ + if (monitor_stderr == -1) { + monitor_stderr = monitor_stdout; + } + openfiles[0].handle = monitor_stdin; + openfiles[0].pos = 0; + openfiles[1].handle = monitor_stdout; + openfiles[1].pos = 0; + openfiles[2].handle = monitor_stderr; + openfiles[2].pos = 0; +} + +#endif /* McuRdimon_CONFIG_IS_ENABLED */ diff --git a/TSM_PicoW_Sensor/McuLib/rdimon/McuRdimon.h b/TSM_PicoW_Sensor/McuLib/rdimon/McuRdimon.h new file mode 100644 index 0000000..671ae12 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/rdimon/McuRdimon.h @@ -0,0 +1,23 @@ +/*! +** \file McuRdimon.h +** \brief Interface for Remote Debugger Interface. +*/ + +#ifndef MCURDIMON_H +#define MCURDIMON_H + +#include "McuRdimon_config.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +/* initializes standard I/O handles */ +void McuRdimon_Init(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MCURDIMON_H */ diff --git a/TSM_PicoW_Sensor/McuLib/rdimon/McuRdimon_config.h b/TSM_PicoW_Sensor/McuLib/rdimon/McuRdimon_config.h new file mode 100644 index 0000000..ec6d0b8 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/rdimon/McuRdimon_config.h @@ -0,0 +1,17 @@ +/*! + * Copyright (c) 2023, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * \file + * \brief Configuration items for the Remote Debugger Interface. + */ + +#ifndef RDIMON_MCURDIMON_CONFIG_H_ +#define RDIMON_MCURDIMON_CONFIG_H_ + +#ifndef McuRdimon_CONFIG_IS_ENABLED + #define McuRdimon_CONFIG_IS_ENABLED (0) + /*!< 1: module is enabled; 0: module is disabled */ +#endif + +#endif /* RDIMON_MCURDIMON_CONFIG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/rdimon/readme.txt b/TSM_PicoW_Sensor/McuLib/rdimon/readme.txt new file mode 100644 index 0000000..5960d0f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/rdimon/readme.txt @@ -0,0 +1,6 @@ +This directory implements a 'remote dispatch interface monitor' using semihosting. + +The implementatation is based from the 'arm/syscall.c' implementation, see +gcc-arm-none-eabi-10.3-2021.10-src\gcc-arm-none-eabi-10.3-2021.10\src\newlib\libgloss\arm\syscalls.c + +For licensing, see the COPYING.LIBGLOSS information in this folder. diff --git a/TSM_PicoW_Sensor/McuLib/src/C11.c b/TSM_PicoW_Sensor/McuLib/src/C11.c new file mode 100644 index 0000000..0422f5c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/C11.c @@ -0,0 +1,537 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : C11.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : C11 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool C11_GetDir(void); +** SetDir - void C11_SetDir(bool Dir); +** SetInput - void C11_SetInput(void); +** SetOutput - void C11_SetOutput(void); +** GetVal - bool C11_GetVal(void); +** PutVal - void C11_PutVal(bool Val); +** ClrVal - void C11_ClrVal(void); +** SetVal - void C11_SetVal(void); +** NegVal - void C11_NegVal(void); +** Init - void C11_Init(void); +** Deinit - void C11_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file C11.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup C11_module C11 module documentation +** @{ +*/ + +/* MODULE C11. */ + +#include "C11.h" +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if C11_CONFIG_DO_PIN_MUXING + #if McuLib_CONFIG_CPU_IS_LPC + #include "fsl_iocon.h" /* include SDK header file for I/O connection muxing */ + #else /* Kinetis */ + #include "fsl_port.h" /* include SDK header file for port muxing */ + #endif + #endif + #include "fsl_gpio.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + #include "pins_gpio_hw_access.h" + #include "pins_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + #include "nrf_gpio.h" +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + #include "McuGPIO.h" +#else + #error "Unsupported SDK!" +#endif + +#if McuLib_CONFIG_NXP_SDK_2_0_USED + static const gpio_pin_config_t C11_configOutput = { + kGPIO_DigitalOutput, /* use as output pin */ + C11_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; + + static const gpio_pin_config_t C11_configInput = { + kGPIO_DigitalInput, /* use as input pin */ + C11_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + const gpio_output_pin_user_config_t C11_OutputConfig[] = { + { + .pinName = C11_CONFIG_PIN_SYMBOL, + .config.outputLogic = C11_CONFIG_INIT_PIN_VALUE, + #if FSL_FEATURE_PORT_HAS_SLEW_RATE + .config.slewRate = kPortSlowSlewRate, + #endif + #if FSL_FEATURE_PORT_HAS_OPEN_DRAIN + .config.isOpenDrainEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH + .config.driveStrength = kPortLowDriveStrength, + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; + + const gpio_input_pin_user_config_t C11_InputConfig[] = { + { + .pinName = C11_CONFIG_PIN_SYMBOL, + #if FSL_FEATURE_PORT_HAS_PULL_ENABLE + #if C11_CONFIG_PULL_RESISTOR==0 /* 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ + .config.isPullEnable = false, + #else + .config.isPullEnable = true, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PULL_SELECTION + #if C11_CONFIG_PULL_RESISTOR==1 + .config.pullSelect = kPortPullUp, + #else + .config.pullSelect = kPortPullDown, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER + .config.isPassiveFilterEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER + .config.isDigitalFilterEnabled = true, + #endif + #if FSL_FEATURE_GPIO_HAS_INTERRUPT_VECTOR + .config.interrupt = kPortIntDisabled + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + static McuGPIO_Handle_t pin; +#endif + +static bool C11_isOutput = false; +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void C11_ClrVal(void) +{ +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if McuLib_CONFIG_CPU_IS_LPC + GPIO_PortClear(C11_CONFIG_GPIO_NAME, C11_CONFIG_PORT_NAME, 1< input */ + PINS_DRV_SetPinsDirection(C11_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_input(C11_CONFIG_PIN_NUMBER, NRF_GPIO_PIN_NOPULL); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsInput(pin); +#endif + C11_isOutput = false; +} + +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void C11_SetOutput(void) +{ +#if McuLib_CONFIG_CPU_IS_LPC + GPIO_PinInit(C11_CONFIG_GPIO_NAME, C11_CONFIG_PORT_NAME, C11_CONFIG_PIN_NUMBER, &C11_configOutput); +#elif McuLib_CONFIG_NXP_SDK_2_0_USED + GPIO_PinInit(C11_CONFIG_GPIO_NAME, C11_CONFIG_PIN_NUMBER, &C11_configOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + GPIO_DRV_SetPinDir(C11_CONFIG_PIN_SYMBOL, kGpioDigitalOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + pins_channel_type_t val; + + val = PINS_GPIO_GetPinsDirection(C11_CONFIG_PORT_NAME); /* bit 0: pin is input; 1: pin is output */ + val |= (1< output */ + PINS_DRV_SetPinsDirection(C11_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_output(C11_CONFIG_PIN_NUMBER); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsOutput(pin, false /* don't care */); +#endif + C11_isOutput = true; +} + +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ +void C11_PutVal(bool Val) +{ +#if McuLib_CONFIG_CPU_IS_LPC + if (Val) { + GPIO_PortSet(C11_CONFIG_GPIO_NAME, C11_CONFIG_PORT_NAME, 1<_ */ + _IOCON_PIO_FUNC0 | + /* Selects pull-up function */ + _IOCON_PIO_MODE_PULLUP | + /* Standard mode, output slew rate control is enabled */ + _IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + _IOCON_PIO_INV_DI | + /* Enables digital function */ + _IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + _IOCON_PIO_OPENDRAIN_DI); + #if (McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0) + IOCON_PinMuxSet(C11_CONFIG_PORT_NAME, C11_CONFIG_PIN_NUMBER, port_pin_config); + #else + IOCON_PinMuxSet(IOCON, C11_CONFIG_PORT_NAME, C11_CONFIG_PIN_NUMBER, port_pin_config); + #endif + #else + PORT_SetPinMux(C11_CONFIG_PORT_NAME, C11_CONFIG_PIN_NUMBER, kPORT_MuxAsGpio); /* mux as GPIO */ + #endif + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + /*! Pin Muxing not implemented */ + GPIO_DRV_Init(C11_InputConfig, C11_OutputConfig); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + /* the following needs to be called in the application first: + PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); + */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + config.hw.pin = C11_CONFIG_PIN_NUMBER; + config.isInput = true; + pin = McuGPIO_InitGPIO(&config); +#endif +#if C11_CONFIG_INIT_PIN_DIRECTION == C11_CONFIG_INIT_PIN_DIRECTION_INPUT + C11_SetInput(); +#elif C11_CONFIG_INIT_PIN_DIRECTION == C11_CONFIG_INIT_PIN_DIRECTION_OUTPUT + C11_SetOutput(); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void C11_Deinit(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + pin = McuGPIO_DeinitGPIO(pin); +#endif +} + +/* END C11. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/C11.h b/TSM_PicoW_Sensor/McuLib/src/C11.h new file mode 100644 index 0000000..81fd048 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/C11.h @@ -0,0 +1,243 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : C11.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : C11 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool C11_GetDir(void); +** SetDir - void C11_SetDir(bool Dir); +** SetInput - void C11_SetInput(void); +** SetOutput - void C11_SetOutput(void); +** GetVal - bool C11_GetVal(void); +** PutVal - void C11_PutVal(bool Val); +** ClrVal - void C11_ClrVal(void); +** SetVal - void C11_SetVal(void); +** NegVal - void C11_NegVal(void); +** Init - void C11_Init(void); +** Deinit - void C11_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file C11.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup C11_module C11 module documentation +** @{ +*/ + +#ifndef __C11_H +#define __C11_H + +/* MODULE C11. */ +#include "McuLib.h" /* SDK and API used */ +#include "C11config.h" /* configuration */ + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" + + /* only GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF and GPIOG are currently supported */ + #define C11_GPIO_IDX GPIOA_IDX /* GPIOA */ + + enum C11_pinNames{ + C11_CONFIG_PIN_SYMBOL = GPIO_MAKE_PIN(C11_GPIO_IDX, C11_CONFIG_PIN_NUMBER), + }; + + extern const gpio_output_pin_user_config_t C11_OutputConfig[]; + extern const gpio_input_pin_user_config_t C11_InputConfig[]; +#endif + +void C11_Init(void); +/* +** =================================================================== +** Method : Init (component SDK_BitIO) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void C11_ClrVal(void); +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void C11_SetVal(void); +/* +** =================================================================== +** Method : SetVal (component SDK_BitIO) +** +** Description : +** Sets the pin value to a high value. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void C11_NegVal(void); +/* +** =================================================================== +** Method : NegVal (component SDK_BitIO) +** +** Description : +** Toggles/negates the pin value +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void C11_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +bool C11_GetVal(void); +/* +** =================================================================== +** Method : GetVal (component SDK_BitIO) +** +** Description : +** Returns the pin value +** Parameters : None +** Returns : +** --- - Returns the value of the pin: +** FALSE/logical level '0' or TRUE/logical +** level '1' +** =================================================================== +*/ + +bool C11_GetDir(void); +/* +** =================================================================== +** Method : GetDir (component SDK_BitIO) +** +** Description : +** Return the direction of the pin (input/output) +** Parameters : None +** Returns : +** --- - FALSE if port is input, TRUE if port is +** output +** =================================================================== +*/ + +void C11_SetDir(bool Dir); +/* +** =================================================================== +** Method : SetDir (component SDK_BitIO) +** +** Description : +** Sets the direction of the pin (input or output) +** Parameters : +** NAME - DESCRIPTION +** Dir - FALSE: input, TRUE: output +** Returns : Nothing +** =================================================================== +*/ + +void C11_SetInput(void); +/* +** =================================================================== +** Method : SetInput (component SDK_BitIO) +** +** Description : +** Sets the pin as input +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void C11_SetOutput(void); +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void C11_PutVal(bool Val); +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ + +/* END C11. */ + +#endif +/* ifndef __C11_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/C21.c b/TSM_PicoW_Sensor/McuLib/src/C21.c new file mode 100644 index 0000000..d495216 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/C21.c @@ -0,0 +1,537 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : C21.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : C21 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool C21_GetDir(void); +** SetDir - void C21_SetDir(bool Dir); +** SetInput - void C21_SetInput(void); +** SetOutput - void C21_SetOutput(void); +** GetVal - bool C21_GetVal(void); +** PutVal - void C21_PutVal(bool Val); +** ClrVal - void C21_ClrVal(void); +** SetVal - void C21_SetVal(void); +** NegVal - void C21_NegVal(void); +** Init - void C21_Init(void); +** Deinit - void C21_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file C21.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup C21_module C21 module documentation +** @{ +*/ + +/* MODULE C21. */ + +#include "C21.h" +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if C21_CONFIG_DO_PIN_MUXING + #if McuLib_CONFIG_CPU_IS_LPC + #include "fsl_iocon.h" /* include SDK header file for I/O connection muxing */ + #else /* Kinetis */ + #include "fsl_port.h" /* include SDK header file for port muxing */ + #endif + #endif + #include "fsl_gpio.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + #include "pins_gpio_hw_access.h" + #include "pins_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + #include "nrf_gpio.h" +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + #include "McuGPIO.h" +#else + #error "Unsupported SDK!" +#endif + +#if McuLib_CONFIG_NXP_SDK_2_0_USED + static const gpio_pin_config_t C21_configOutput = { + kGPIO_DigitalOutput, /* use as output pin */ + C21_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; + + static const gpio_pin_config_t C21_configInput = { + kGPIO_DigitalInput, /* use as input pin */ + C21_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + const gpio_output_pin_user_config_t C21_OutputConfig[] = { + { + .pinName = C21_CONFIG_PIN_SYMBOL, + .config.outputLogic = C21_CONFIG_INIT_PIN_VALUE, + #if FSL_FEATURE_PORT_HAS_SLEW_RATE + .config.slewRate = kPortSlowSlewRate, + #endif + #if FSL_FEATURE_PORT_HAS_OPEN_DRAIN + .config.isOpenDrainEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH + .config.driveStrength = kPortLowDriveStrength, + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; + + const gpio_input_pin_user_config_t C21_InputConfig[] = { + { + .pinName = C21_CONFIG_PIN_SYMBOL, + #if FSL_FEATURE_PORT_HAS_PULL_ENABLE + #if C21_CONFIG_PULL_RESISTOR==0 /* 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ + .config.isPullEnable = false, + #else + .config.isPullEnable = true, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PULL_SELECTION + #if C21_CONFIG_PULL_RESISTOR==1 + .config.pullSelect = kPortPullUp, + #else + .config.pullSelect = kPortPullDown, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER + .config.isPassiveFilterEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER + .config.isDigitalFilterEnabled = true, + #endif + #if FSL_FEATURE_GPIO_HAS_INTERRUPT_VECTOR + .config.interrupt = kPortIntDisabled + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + static McuGPIO_Handle_t pin; +#endif + +static bool C21_isOutput = false; +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void C21_ClrVal(void) +{ +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if McuLib_CONFIG_CPU_IS_LPC + GPIO_PortClear(C21_CONFIG_GPIO_NAME, C21_CONFIG_PORT_NAME, 1< input */ + PINS_DRV_SetPinsDirection(C21_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_input(C21_CONFIG_PIN_NUMBER, NRF_GPIO_PIN_NOPULL); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsInput(pin); +#endif + C21_isOutput = false; +} + +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void C21_SetOutput(void) +{ +#if McuLib_CONFIG_CPU_IS_LPC + GPIO_PinInit(C21_CONFIG_GPIO_NAME, C21_CONFIG_PORT_NAME, C21_CONFIG_PIN_NUMBER, &C21_configOutput); +#elif McuLib_CONFIG_NXP_SDK_2_0_USED + GPIO_PinInit(C21_CONFIG_GPIO_NAME, C21_CONFIG_PIN_NUMBER, &C21_configOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + GPIO_DRV_SetPinDir(C21_CONFIG_PIN_SYMBOL, kGpioDigitalOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + pins_channel_type_t val; + + val = PINS_GPIO_GetPinsDirection(C21_CONFIG_PORT_NAME); /* bit 0: pin is input; 1: pin is output */ + val |= (1< output */ + PINS_DRV_SetPinsDirection(C21_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_output(C21_CONFIG_PIN_NUMBER); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsOutput(pin, false /* don't care */); +#endif + C21_isOutput = true; +} + +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ +void C21_PutVal(bool Val) +{ +#if McuLib_CONFIG_CPU_IS_LPC + if (Val) { + GPIO_PortSet(C21_CONFIG_GPIO_NAME, C21_CONFIG_PORT_NAME, 1<_ */ + _IOCON_PIO_FUNC0 | + /* Selects pull-up function */ + _IOCON_PIO_MODE_PULLUP | + /* Standard mode, output slew rate control is enabled */ + _IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + _IOCON_PIO_INV_DI | + /* Enables digital function */ + _IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + _IOCON_PIO_OPENDRAIN_DI); + #if (McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0) + IOCON_PinMuxSet(C21_CONFIG_PORT_NAME, C21_CONFIG_PIN_NUMBER, port_pin_config); + #else + IOCON_PinMuxSet(IOCON, C21_CONFIG_PORT_NAME, C21_CONFIG_PIN_NUMBER, port_pin_config); + #endif + #else + PORT_SetPinMux(C21_CONFIG_PORT_NAME, C21_CONFIG_PIN_NUMBER, kPORT_MuxAsGpio); /* mux as GPIO */ + #endif + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + /*! Pin Muxing not implemented */ + GPIO_DRV_Init(C21_InputConfig, C21_OutputConfig); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + /* the following needs to be called in the application first: + PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); + */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + config.hw.pin = C21_CONFIG_PIN_NUMBER; + config.isInput = true; + pin = McuGPIO_InitGPIO(&config); +#endif +#if C21_CONFIG_INIT_PIN_DIRECTION == C21_CONFIG_INIT_PIN_DIRECTION_INPUT + C21_SetInput(); +#elif C21_CONFIG_INIT_PIN_DIRECTION == C21_CONFIG_INIT_PIN_DIRECTION_OUTPUT + C21_SetOutput(); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void C21_Deinit(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + pin = McuGPIO_DeinitGPIO(pin); +#endif +} + +/* END C21. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/C21.h b/TSM_PicoW_Sensor/McuLib/src/C21.h new file mode 100644 index 0000000..b041349 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/C21.h @@ -0,0 +1,243 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : C21.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : C21 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool C21_GetDir(void); +** SetDir - void C21_SetDir(bool Dir); +** SetInput - void C21_SetInput(void); +** SetOutput - void C21_SetOutput(void); +** GetVal - bool C21_GetVal(void); +** PutVal - void C21_PutVal(bool Val); +** ClrVal - void C21_ClrVal(void); +** SetVal - void C21_SetVal(void); +** NegVal - void C21_NegVal(void); +** Init - void C21_Init(void); +** Deinit - void C21_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file C21.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup C21_module C21 module documentation +** @{ +*/ + +#ifndef __C21_H +#define __C21_H + +/* MODULE C21. */ +#include "McuLib.h" /* SDK and API used */ +#include "C21config.h" /* configuration */ + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" + + /* only GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF and GPIOG are currently supported */ + #define C21_GPIO_IDX GPIOA_IDX /* GPIOA */ + + enum C21_pinNames{ + C21_CONFIG_PIN_SYMBOL = GPIO_MAKE_PIN(C21_GPIO_IDX, C21_CONFIG_PIN_NUMBER), + }; + + extern const gpio_output_pin_user_config_t C21_OutputConfig[]; + extern const gpio_input_pin_user_config_t C21_InputConfig[]; +#endif + +void C21_Init(void); +/* +** =================================================================== +** Method : Init (component SDK_BitIO) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void C21_ClrVal(void); +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void C21_SetVal(void); +/* +** =================================================================== +** Method : SetVal (component SDK_BitIO) +** +** Description : +** Sets the pin value to a high value. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void C21_NegVal(void); +/* +** =================================================================== +** Method : NegVal (component SDK_BitIO) +** +** Description : +** Toggles/negates the pin value +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void C21_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +bool C21_GetVal(void); +/* +** =================================================================== +** Method : GetVal (component SDK_BitIO) +** +** Description : +** Returns the pin value +** Parameters : None +** Returns : +** --- - Returns the value of the pin: +** FALSE/logical level '0' or TRUE/logical +** level '1' +** =================================================================== +*/ + +bool C21_GetDir(void); +/* +** =================================================================== +** Method : GetDir (component SDK_BitIO) +** +** Description : +** Return the direction of the pin (input/output) +** Parameters : None +** Returns : +** --- - FALSE if port is input, TRUE if port is +** output +** =================================================================== +*/ + +void C21_SetDir(bool Dir); +/* +** =================================================================== +** Method : SetDir (component SDK_BitIO) +** +** Description : +** Sets the direction of the pin (input or output) +** Parameters : +** NAME - DESCRIPTION +** Dir - FALSE: input, TRUE: output +** Returns : Nothing +** =================================================================== +*/ + +void C21_SetInput(void); +/* +** =================================================================== +** Method : SetInput (component SDK_BitIO) +** +** Description : +** Sets the pin as input +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void C21_SetOutput(void); +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void C21_PutVal(bool Val); +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ + +/* END C21. */ + +#endif +/* ifndef __C21_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/Clock1.c b/TSM_PicoW_Sensor/McuLib/src/Clock1.c new file mode 100644 index 0000000..9cdc550 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/Clock1.c @@ -0,0 +1,537 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : Clock1.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : Clock1 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool Clock1_GetDir(void); +** SetDir - void Clock1_SetDir(bool Dir); +** SetInput - void Clock1_SetInput(void); +** SetOutput - void Clock1_SetOutput(void); +** GetVal - bool Clock1_GetVal(void); +** PutVal - void Clock1_PutVal(bool Val); +** ClrVal - void Clock1_ClrVal(void); +** SetVal - void Clock1_SetVal(void); +** NegVal - void Clock1_NegVal(void); +** Init - void Clock1_Init(void); +** Deinit - void Clock1_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file Clock1.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup Clock1_module Clock1 module documentation +** @{ +*/ + +/* MODULE Clock1. */ + +#include "Clock1.h" +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if Clock1_CONFIG_DO_PIN_MUXING + #if McuLib_CONFIG_CPU_IS_LPC + #include "fsl_iocon.h" /* include SDK header file for I/O connection muxing */ + #else /* Kinetis */ + #include "fsl_port.h" /* include SDK header file for port muxing */ + #endif + #endif + #include "fsl_gpio.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + #include "pins_gpio_hw_access.h" + #include "pins_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + #include "nrf_gpio.h" +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + #include "McuGPIO.h" +#else + #error "Unsupported SDK!" +#endif + +#if McuLib_CONFIG_NXP_SDK_2_0_USED + static const gpio_pin_config_t Clock1_configOutput = { + kGPIO_DigitalOutput, /* use as output pin */ + Clock1_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; + + static const gpio_pin_config_t Clock1_configInput = { + kGPIO_DigitalInput, /* use as input pin */ + Clock1_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + const gpio_output_pin_user_config_t Clock1_OutputConfig[] = { + { + .pinName = Clock1_CONFIG_PIN_SYMBOL, + .config.outputLogic = Clock1_CONFIG_INIT_PIN_VALUE, + #if FSL_FEATURE_PORT_HAS_SLEW_RATE + .config.slewRate = kPortSlowSlewRate, + #endif + #if FSL_FEATURE_PORT_HAS_OPEN_DRAIN + .config.isOpenDrainEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH + .config.driveStrength = kPortLowDriveStrength, + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; + + const gpio_input_pin_user_config_t Clock1_InputConfig[] = { + { + .pinName = Clock1_CONFIG_PIN_SYMBOL, + #if FSL_FEATURE_PORT_HAS_PULL_ENABLE + #if Clock1_CONFIG_PULL_RESISTOR==0 /* 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ + .config.isPullEnable = false, + #else + .config.isPullEnable = true, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PULL_SELECTION + #if Clock1_CONFIG_PULL_RESISTOR==1 + .config.pullSelect = kPortPullUp, + #else + .config.pullSelect = kPortPullDown, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER + .config.isPassiveFilterEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER + .config.isDigitalFilterEnabled = true, + #endif + #if FSL_FEATURE_GPIO_HAS_INTERRUPT_VECTOR + .config.interrupt = kPortIntDisabled + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + static McuGPIO_Handle_t pin; +#endif + +static bool Clock1_isOutput = false; +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void Clock1_ClrVal(void) +{ +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if McuLib_CONFIG_CPU_IS_LPC + GPIO_PortClear(Clock1_CONFIG_GPIO_NAME, Clock1_CONFIG_PORT_NAME, 1< input */ + PINS_DRV_SetPinsDirection(Clock1_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_input(Clock1_CONFIG_PIN_NUMBER, NRF_GPIO_PIN_NOPULL); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsInput(pin); +#endif + Clock1_isOutput = false; +} + +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void Clock1_SetOutput(void) +{ +#if McuLib_CONFIG_CPU_IS_LPC + GPIO_PinInit(Clock1_CONFIG_GPIO_NAME, Clock1_CONFIG_PORT_NAME, Clock1_CONFIG_PIN_NUMBER, &Clock1_configOutput); +#elif McuLib_CONFIG_NXP_SDK_2_0_USED + GPIO_PinInit(Clock1_CONFIG_GPIO_NAME, Clock1_CONFIG_PIN_NUMBER, &Clock1_configOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + GPIO_DRV_SetPinDir(Clock1_CONFIG_PIN_SYMBOL, kGpioDigitalOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + pins_channel_type_t val; + + val = PINS_GPIO_GetPinsDirection(Clock1_CONFIG_PORT_NAME); /* bit 0: pin is input; 1: pin is output */ + val |= (1< output */ + PINS_DRV_SetPinsDirection(Clock1_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_output(Clock1_CONFIG_PIN_NUMBER); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsOutput(pin, false /* don't care */); +#endif + Clock1_isOutput = true; +} + +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ +void Clock1_PutVal(bool Val) +{ +#if McuLib_CONFIG_CPU_IS_LPC + if (Val) { + GPIO_PortSet(Clock1_CONFIG_GPIO_NAME, Clock1_CONFIG_PORT_NAME, 1<_ */ + _IOCON_PIO_FUNC0 | + /* Selects pull-up function */ + _IOCON_PIO_MODE_PULLUP | + /* Standard mode, output slew rate control is enabled */ + _IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + _IOCON_PIO_INV_DI | + /* Enables digital function */ + _IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + _IOCON_PIO_OPENDRAIN_DI); + #if (McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0) + IOCON_PinMuxSet(Clock1_CONFIG_PORT_NAME, Clock1_CONFIG_PIN_NUMBER, port_pin_config); + #else + IOCON_PinMuxSet(IOCON, Clock1_CONFIG_PORT_NAME, Clock1_CONFIG_PIN_NUMBER, port_pin_config); + #endif + #else + PORT_SetPinMux(Clock1_CONFIG_PORT_NAME, Clock1_CONFIG_PIN_NUMBER, kPORT_MuxAsGpio); /* mux as GPIO */ + #endif + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + /*! Pin Muxing not implemented */ + GPIO_DRV_Init(Clock1_InputConfig, Clock1_OutputConfig); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + /* the following needs to be called in the application first: + PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); + */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + config.hw.pin = Clock1_CONFIG_PIN_NUMBER; + config.isInput = true; + pin = McuGPIO_InitGPIO(&config); +#endif +#if Clock1_CONFIG_INIT_PIN_DIRECTION == Clock1_CONFIG_INIT_PIN_DIRECTION_INPUT + Clock1_SetInput(); +#elif Clock1_CONFIG_INIT_PIN_DIRECTION == Clock1_CONFIG_INIT_PIN_DIRECTION_OUTPUT + Clock1_SetOutput(); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void Clock1_Deinit(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + pin = McuGPIO_DeinitGPIO(pin); +#endif +} + +/* END Clock1. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/Clock1.h b/TSM_PicoW_Sensor/McuLib/src/Clock1.h new file mode 100644 index 0000000..df7c011 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/Clock1.h @@ -0,0 +1,243 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : Clock1.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : Clock1 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool Clock1_GetDir(void); +** SetDir - void Clock1_SetDir(bool Dir); +** SetInput - void Clock1_SetInput(void); +** SetOutput - void Clock1_SetOutput(void); +** GetVal - bool Clock1_GetVal(void); +** PutVal - void Clock1_PutVal(bool Val); +** ClrVal - void Clock1_ClrVal(void); +** SetVal - void Clock1_SetVal(void); +** NegVal - void Clock1_NegVal(void); +** Init - void Clock1_Init(void); +** Deinit - void Clock1_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file Clock1.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup Clock1_module Clock1 module documentation +** @{ +*/ + +#ifndef __Clock1_H +#define __Clock1_H + +/* MODULE Clock1. */ +#include "McuLib.h" /* SDK and API used */ +#include "Clock1config.h" /* configuration */ + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" + + /* only GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF and GPIOG are currently supported */ + #define Clock1_GPIO_IDX GPIOA_IDX /* GPIOA */ + + enum Clock1_pinNames{ + Clock1_CONFIG_PIN_SYMBOL = GPIO_MAKE_PIN(Clock1_GPIO_IDX, Clock1_CONFIG_PIN_NUMBER), + }; + + extern const gpio_output_pin_user_config_t Clock1_OutputConfig[]; + extern const gpio_input_pin_user_config_t Clock1_InputConfig[]; +#endif + +void Clock1_Init(void); +/* +** =================================================================== +** Method : Init (component SDK_BitIO) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void Clock1_ClrVal(void); +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void Clock1_SetVal(void); +/* +** =================================================================== +** Method : SetVal (component SDK_BitIO) +** +** Description : +** Sets the pin value to a high value. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void Clock1_NegVal(void); +/* +** =================================================================== +** Method : NegVal (component SDK_BitIO) +** +** Description : +** Toggles/negates the pin value +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void Clock1_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +bool Clock1_GetVal(void); +/* +** =================================================================== +** Method : GetVal (component SDK_BitIO) +** +** Description : +** Returns the pin value +** Parameters : None +** Returns : +** --- - Returns the value of the pin: +** FALSE/logical level '0' or TRUE/logical +** level '1' +** =================================================================== +*/ + +bool Clock1_GetDir(void); +/* +** =================================================================== +** Method : GetDir (component SDK_BitIO) +** +** Description : +** Return the direction of the pin (input/output) +** Parameters : None +** Returns : +** --- - FALSE if port is input, TRUE if port is +** output +** =================================================================== +*/ + +void Clock1_SetDir(bool Dir); +/* +** =================================================================== +** Method : SetDir (component SDK_BitIO) +** +** Description : +** Sets the direction of the pin (input or output) +** Parameters : +** NAME - DESCRIPTION +** Dir - FALSE: input, TRUE: output +** Returns : Nothing +** =================================================================== +*/ + +void Clock1_SetInput(void); +/* +** =================================================================== +** Method : SetInput (component SDK_BitIO) +** +** Description : +** Sets the pin as input +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void Clock1_SetOutput(void); +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void Clock1_PutVal(bool Val); +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ + +/* END Clock1. */ + +#endif +/* ifndef __Clock1_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/DQ1.c b/TSM_PicoW_Sensor/McuLib/src/DQ1.c new file mode 100644 index 0000000..0a80b2f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/DQ1.c @@ -0,0 +1,537 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : DQ1.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : DQ1 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : OneWireData +** Do Pin Muxing : no +** Init Direction : Input +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool DQ1_GetDir(void); +** SetDir - void DQ1_SetDir(bool Dir); +** SetInput - void DQ1_SetInput(void); +** SetOutput - void DQ1_SetOutput(void); +** GetVal - bool DQ1_GetVal(void); +** PutVal - void DQ1_PutVal(bool Val); +** ClrVal - void DQ1_ClrVal(void); +** SetVal - void DQ1_SetVal(void); +** NegVal - void DQ1_NegVal(void); +** Init - void DQ1_Init(void); +** Deinit - void DQ1_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file DQ1.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup DQ1_module DQ1 module documentation +** @{ +*/ + +/* MODULE DQ1. */ + +#include "DQ1.h" +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if DQ1_CONFIG_DO_PIN_MUXING + #if McuLib_CONFIG_CPU_IS_LPC + #include "fsl_iocon.h" /* include SDK header file for I/O connection muxing */ + #else /* Kinetis */ + #include "fsl_port.h" /* include SDK header file for port muxing */ + #endif + #endif + #include "fsl_gpio.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + #include "pins_gpio_hw_access.h" + #include "pins_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + #include "nrf_gpio.h" +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + #include "McuGPIO.h" +#else + #error "Unsupported SDK!" +#endif + +#if McuLib_CONFIG_NXP_SDK_2_0_USED + static const gpio_pin_config_t DQ1_configOutput = { + kGPIO_DigitalOutput, /* use as output pin */ + DQ1_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; + + static const gpio_pin_config_t DQ1_configInput = { + kGPIO_DigitalInput, /* use as input pin */ + DQ1_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + const gpio_output_pin_user_config_t DQ1_OutputConfig[] = { + { + .pinName = DQ1_CONFIG_PIN_SYMBOL, + .config.outputLogic = DQ1_CONFIG_INIT_PIN_VALUE, + #if FSL_FEATURE_PORT_HAS_SLEW_RATE + .config.slewRate = kPortSlowSlewRate, + #endif + #if FSL_FEATURE_PORT_HAS_OPEN_DRAIN + .config.isOpenDrainEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH + .config.driveStrength = kPortLowDriveStrength, + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; + + const gpio_input_pin_user_config_t DQ1_InputConfig[] = { + { + .pinName = DQ1_CONFIG_PIN_SYMBOL, + #if FSL_FEATURE_PORT_HAS_PULL_ENABLE + #if DQ1_CONFIG_PULL_RESISTOR==0 /* 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ + .config.isPullEnable = false, + #else + .config.isPullEnable = true, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PULL_SELECTION + #if DQ1_CONFIG_PULL_RESISTOR==1 + .config.pullSelect = kPortPullUp, + #else + .config.pullSelect = kPortPullDown, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER + .config.isPassiveFilterEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER + .config.isDigitalFilterEnabled = true, + #endif + #if FSL_FEATURE_GPIO_HAS_INTERRUPT_VECTOR + .config.interrupt = kPortIntDisabled + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + static McuGPIO_Handle_t pin; +#endif + +static bool DQ1_isOutput = false; +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DQ1_ClrVal(void) +{ +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if McuLib_CONFIG_CPU_IS_LPC + GPIO_PortClear(DQ1_CONFIG_GPIO_NAME, DQ1_CONFIG_PORT_NAME, 1< input */ + PINS_DRV_SetPinsDirection(DQ1_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_input(DQ1_CONFIG_PIN_NUMBER, NRF_GPIO_PIN_NOPULL); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsInput(pin); +#endif + DQ1_isOutput = false; +} + +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DQ1_SetOutput(void) +{ +#if McuLib_CONFIG_CPU_IS_LPC + GPIO_PinInit(DQ1_CONFIG_GPIO_NAME, DQ1_CONFIG_PORT_NAME, DQ1_CONFIG_PIN_NUMBER, &DQ1_configOutput); +#elif McuLib_CONFIG_NXP_SDK_2_0_USED + GPIO_PinInit(DQ1_CONFIG_GPIO_NAME, DQ1_CONFIG_PIN_NUMBER, &DQ1_configOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + GPIO_DRV_SetPinDir(DQ1_CONFIG_PIN_SYMBOL, kGpioDigitalOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + pins_channel_type_t val; + + val = PINS_GPIO_GetPinsDirection(DQ1_CONFIG_PORT_NAME); /* bit 0: pin is input; 1: pin is output */ + val |= (1< output */ + PINS_DRV_SetPinsDirection(DQ1_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_output(DQ1_CONFIG_PIN_NUMBER); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsOutput(pin, false /* don't care */); +#endif + DQ1_isOutput = true; +} + +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ +void DQ1_PutVal(bool Val) +{ +#if McuLib_CONFIG_CPU_IS_LPC + if (Val) { + GPIO_PortSet(DQ1_CONFIG_GPIO_NAME, DQ1_CONFIG_PORT_NAME, 1<_ */ + _IOCON_PIO_FUNC0 | + /* Selects pull-up function */ + _IOCON_PIO_MODE_PULLUP | + /* Standard mode, output slew rate control is enabled */ + _IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + _IOCON_PIO_INV_DI | + /* Enables digital function */ + _IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + _IOCON_PIO_OPENDRAIN_DI); + #if (McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0) + IOCON_PinMuxSet(DQ1_CONFIG_PORT_NAME, DQ1_CONFIG_PIN_NUMBER, port_pin_config); + #else + IOCON_PinMuxSet(IOCON, DQ1_CONFIG_PORT_NAME, DQ1_CONFIG_PIN_NUMBER, port_pin_config); + #endif + #else + PORT_SetPinMux(DQ1_CONFIG_PORT_NAME, DQ1_CONFIG_PIN_NUMBER, kPORT_MuxAsGpio); /* mux as GPIO */ + #endif + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + /*! Pin Muxing not implemented */ + GPIO_DRV_Init(DQ1_InputConfig, DQ1_OutputConfig); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + /* the following needs to be called in the application first: + PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); + */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + config.hw.pin = DQ1_CONFIG_PIN_NUMBER; + config.isInput = true; + pin = McuGPIO_InitGPIO(&config); +#endif +#if DQ1_CONFIG_INIT_PIN_DIRECTION == DQ1_CONFIG_INIT_PIN_DIRECTION_INPUT + DQ1_SetInput(); +#elif DQ1_CONFIG_INIT_PIN_DIRECTION == DQ1_CONFIG_INIT_PIN_DIRECTION_OUTPUT + DQ1_SetOutput(); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DQ1_Deinit(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + pin = McuGPIO_DeinitGPIO(pin); +#endif +} + +/* END DQ1. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/DQ1.h b/TSM_PicoW_Sensor/McuLib/src/DQ1.h new file mode 100644 index 0000000..9338229 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/DQ1.h @@ -0,0 +1,243 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : DQ1.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : DQ1 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : OneWireData +** Do Pin Muxing : no +** Init Direction : Input +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool DQ1_GetDir(void); +** SetDir - void DQ1_SetDir(bool Dir); +** SetInput - void DQ1_SetInput(void); +** SetOutput - void DQ1_SetOutput(void); +** GetVal - bool DQ1_GetVal(void); +** PutVal - void DQ1_PutVal(bool Val); +** ClrVal - void DQ1_ClrVal(void); +** SetVal - void DQ1_SetVal(void); +** NegVal - void DQ1_NegVal(void); +** Init - void DQ1_Init(void); +** Deinit - void DQ1_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file DQ1.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup DQ1_module DQ1 module documentation +** @{ +*/ + +#ifndef __DQ1_H +#define __DQ1_H + +/* MODULE DQ1. */ +#include "McuLib.h" /* SDK and API used */ +#include "DQ1config.h" /* configuration */ + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" + + /* only GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF and GPIOG are currently supported */ + #define DQ1_GPIO_IDX GPIOA_IDX /* GPIOA */ + + enum DQ1_pinNames{ + DQ1_CONFIG_PIN_SYMBOL = GPIO_MAKE_PIN(DQ1_GPIO_IDX, DQ1_CONFIG_PIN_NUMBER), + }; + + extern const gpio_output_pin_user_config_t DQ1_OutputConfig[]; + extern const gpio_input_pin_user_config_t DQ1_InputConfig[]; +#endif + +void DQ1_Init(void); +/* +** =================================================================== +** Method : Init (component SDK_BitIO) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DQ1_ClrVal(void); +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DQ1_SetVal(void); +/* +** =================================================================== +** Method : SetVal (component SDK_BitIO) +** +** Description : +** Sets the pin value to a high value. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DQ1_NegVal(void); +/* +** =================================================================== +** Method : NegVal (component SDK_BitIO) +** +** Description : +** Toggles/negates the pin value +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DQ1_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +bool DQ1_GetVal(void); +/* +** =================================================================== +** Method : GetVal (component SDK_BitIO) +** +** Description : +** Returns the pin value +** Parameters : None +** Returns : +** --- - Returns the value of the pin: +** FALSE/logical level '0' or TRUE/logical +** level '1' +** =================================================================== +*/ + +bool DQ1_GetDir(void); +/* +** =================================================================== +** Method : GetDir (component SDK_BitIO) +** +** Description : +** Return the direction of the pin (input/output) +** Parameters : None +** Returns : +** --- - FALSE if port is input, TRUE if port is +** output +** =================================================================== +*/ + +void DQ1_SetDir(bool Dir); +/* +** =================================================================== +** Method : SetDir (component SDK_BitIO) +** +** Description : +** Sets the direction of the pin (input or output) +** Parameters : +** NAME - DESCRIPTION +** Dir - FALSE: input, TRUE: output +** Returns : Nothing +** =================================================================== +*/ + +void DQ1_SetInput(void); +/* +** =================================================================== +** Method : SetInput (component SDK_BitIO) +** +** Description : +** Sets the pin as input +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DQ1_SetOutput(void); +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DQ1_PutVal(bool Val); +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ + +/* END DQ1. */ + +#endif +/* ifndef __DQ1_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/DbgRd1.c b/TSM_PicoW_Sensor/McuLib/src/DbgRd1.c new file mode 100644 index 0000000..c6b6b30 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/DbgRd1.c @@ -0,0 +1,537 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : DbgRd1.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : DbgRd1 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 1 +** Pin Symbol : OneWireDbgRead +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool DbgRd1_GetDir(void); +** SetDir - void DbgRd1_SetDir(bool Dir); +** SetInput - void DbgRd1_SetInput(void); +** SetOutput - void DbgRd1_SetOutput(void); +** GetVal - bool DbgRd1_GetVal(void); +** PutVal - void DbgRd1_PutVal(bool Val); +** ClrVal - void DbgRd1_ClrVal(void); +** SetVal - void DbgRd1_SetVal(void); +** NegVal - void DbgRd1_NegVal(void); +** Init - void DbgRd1_Init(void); +** Deinit - void DbgRd1_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file DbgRd1.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup DbgRd1_module DbgRd1 module documentation +** @{ +*/ + +/* MODULE DbgRd1. */ + +#include "DbgRd1.h" +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if DbgRd1_CONFIG_DO_PIN_MUXING + #if McuLib_CONFIG_CPU_IS_LPC + #include "fsl_iocon.h" /* include SDK header file for I/O connection muxing */ + #else /* Kinetis */ + #include "fsl_port.h" /* include SDK header file for port muxing */ + #endif + #endif + #include "fsl_gpio.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + #include "pins_gpio_hw_access.h" + #include "pins_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + #include "nrf_gpio.h" +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + #include "McuGPIO.h" +#else + #error "Unsupported SDK!" +#endif + +#if McuLib_CONFIG_NXP_SDK_2_0_USED + static const gpio_pin_config_t DbgRd1_configOutput = { + kGPIO_DigitalOutput, /* use as output pin */ + DbgRd1_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; + + static const gpio_pin_config_t DbgRd1_configInput = { + kGPIO_DigitalInput, /* use as input pin */ + DbgRd1_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + const gpio_output_pin_user_config_t DbgRd1_OutputConfig[] = { + { + .pinName = DbgRd1_CONFIG_PIN_SYMBOL, + .config.outputLogic = DbgRd1_CONFIG_INIT_PIN_VALUE, + #if FSL_FEATURE_PORT_HAS_SLEW_RATE + .config.slewRate = kPortSlowSlewRate, + #endif + #if FSL_FEATURE_PORT_HAS_OPEN_DRAIN + .config.isOpenDrainEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH + .config.driveStrength = kPortLowDriveStrength, + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; + + const gpio_input_pin_user_config_t DbgRd1_InputConfig[] = { + { + .pinName = DbgRd1_CONFIG_PIN_SYMBOL, + #if FSL_FEATURE_PORT_HAS_PULL_ENABLE + #if DbgRd1_CONFIG_PULL_RESISTOR==0 /* 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ + .config.isPullEnable = false, + #else + .config.isPullEnable = true, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PULL_SELECTION + #if DbgRd1_CONFIG_PULL_RESISTOR==1 + .config.pullSelect = kPortPullUp, + #else + .config.pullSelect = kPortPullDown, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER + .config.isPassiveFilterEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER + .config.isDigitalFilterEnabled = true, + #endif + #if FSL_FEATURE_GPIO_HAS_INTERRUPT_VECTOR + .config.interrupt = kPortIntDisabled + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + static McuGPIO_Handle_t pin; +#endif + +static bool DbgRd1_isOutput = false; +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DbgRd1_ClrVal(void) +{ +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if McuLib_CONFIG_CPU_IS_LPC + GPIO_PortClear(DbgRd1_CONFIG_GPIO_NAME, DbgRd1_CONFIG_PORT_NAME, 1< input */ + PINS_DRV_SetPinsDirection(DbgRd1_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_input(DbgRd1_CONFIG_PIN_NUMBER, NRF_GPIO_PIN_NOPULL); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsInput(pin); +#endif + DbgRd1_isOutput = false; +} + +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DbgRd1_SetOutput(void) +{ +#if McuLib_CONFIG_CPU_IS_LPC + GPIO_PinInit(DbgRd1_CONFIG_GPIO_NAME, DbgRd1_CONFIG_PORT_NAME, DbgRd1_CONFIG_PIN_NUMBER, &DbgRd1_configOutput); +#elif McuLib_CONFIG_NXP_SDK_2_0_USED + GPIO_PinInit(DbgRd1_CONFIG_GPIO_NAME, DbgRd1_CONFIG_PIN_NUMBER, &DbgRd1_configOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + GPIO_DRV_SetPinDir(DbgRd1_CONFIG_PIN_SYMBOL, kGpioDigitalOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + pins_channel_type_t val; + + val = PINS_GPIO_GetPinsDirection(DbgRd1_CONFIG_PORT_NAME); /* bit 0: pin is input; 1: pin is output */ + val |= (1< output */ + PINS_DRV_SetPinsDirection(DbgRd1_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_output(DbgRd1_CONFIG_PIN_NUMBER); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsOutput(pin, false /* don't care */); +#endif + DbgRd1_isOutput = true; +} + +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ +void DbgRd1_PutVal(bool Val) +{ +#if McuLib_CONFIG_CPU_IS_LPC + if (Val) { + GPIO_PortSet(DbgRd1_CONFIG_GPIO_NAME, DbgRd1_CONFIG_PORT_NAME, 1<_ */ + _IOCON_PIO_FUNC0 | + /* Selects pull-up function */ + _IOCON_PIO_MODE_PULLUP | + /* Standard mode, output slew rate control is enabled */ + _IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + _IOCON_PIO_INV_DI | + /* Enables digital function */ + _IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + _IOCON_PIO_OPENDRAIN_DI); + #if (McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0) + IOCON_PinMuxSet(DbgRd1_CONFIG_PORT_NAME, DbgRd1_CONFIG_PIN_NUMBER, port_pin_config); + #else + IOCON_PinMuxSet(IOCON, DbgRd1_CONFIG_PORT_NAME, DbgRd1_CONFIG_PIN_NUMBER, port_pin_config); + #endif + #else + PORT_SetPinMux(DbgRd1_CONFIG_PORT_NAME, DbgRd1_CONFIG_PIN_NUMBER, kPORT_MuxAsGpio); /* mux as GPIO */ + #endif + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + /*! Pin Muxing not implemented */ + GPIO_DRV_Init(DbgRd1_InputConfig, DbgRd1_OutputConfig); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + /* the following needs to be called in the application first: + PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); + */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + config.hw.pin = DbgRd1_CONFIG_PIN_NUMBER; + config.isInput = true; + pin = McuGPIO_InitGPIO(&config); +#endif +#if DbgRd1_CONFIG_INIT_PIN_DIRECTION == DbgRd1_CONFIG_INIT_PIN_DIRECTION_INPUT + DbgRd1_SetInput(); +#elif DbgRd1_CONFIG_INIT_PIN_DIRECTION == DbgRd1_CONFIG_INIT_PIN_DIRECTION_OUTPUT + DbgRd1_SetOutput(); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void DbgRd1_Deinit(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + pin = McuGPIO_DeinitGPIO(pin); +#endif +} + +/* END DbgRd1. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/DbgRd1.h b/TSM_PicoW_Sensor/McuLib/src/DbgRd1.h new file mode 100644 index 0000000..c715c77 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/DbgRd1.h @@ -0,0 +1,243 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : DbgRd1.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : DbgRd1 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 1 +** Pin Symbol : OneWireDbgRead +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool DbgRd1_GetDir(void); +** SetDir - void DbgRd1_SetDir(bool Dir); +** SetInput - void DbgRd1_SetInput(void); +** SetOutput - void DbgRd1_SetOutput(void); +** GetVal - bool DbgRd1_GetVal(void); +** PutVal - void DbgRd1_PutVal(bool Val); +** ClrVal - void DbgRd1_ClrVal(void); +** SetVal - void DbgRd1_SetVal(void); +** NegVal - void DbgRd1_NegVal(void); +** Init - void DbgRd1_Init(void); +** Deinit - void DbgRd1_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file DbgRd1.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup DbgRd1_module DbgRd1 module documentation +** @{ +*/ + +#ifndef __DbgRd1_H +#define __DbgRd1_H + +/* MODULE DbgRd1. */ +#include "McuLib.h" /* SDK and API used */ +#include "DbgRd1config.h" /* configuration */ + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" + + /* only GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF and GPIOG are currently supported */ + #define DbgRd1_GPIO_IDX GPIOA_IDX /* GPIOA */ + + enum DbgRd1_pinNames{ + DbgRd1_CONFIG_PIN_SYMBOL = GPIO_MAKE_PIN(DbgRd1_GPIO_IDX, DbgRd1_CONFIG_PIN_NUMBER), + }; + + extern const gpio_output_pin_user_config_t DbgRd1_OutputConfig[]; + extern const gpio_input_pin_user_config_t DbgRd1_InputConfig[]; +#endif + +void DbgRd1_Init(void); +/* +** =================================================================== +** Method : Init (component SDK_BitIO) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DbgRd1_ClrVal(void); +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DbgRd1_SetVal(void); +/* +** =================================================================== +** Method : SetVal (component SDK_BitIO) +** +** Description : +** Sets the pin value to a high value. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DbgRd1_NegVal(void); +/* +** =================================================================== +** Method : NegVal (component SDK_BitIO) +** +** Description : +** Toggles/negates the pin value +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DbgRd1_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +bool DbgRd1_GetVal(void); +/* +** =================================================================== +** Method : GetVal (component SDK_BitIO) +** +** Description : +** Returns the pin value +** Parameters : None +** Returns : +** --- - Returns the value of the pin: +** FALSE/logical level '0' or TRUE/logical +** level '1' +** =================================================================== +*/ + +bool DbgRd1_GetDir(void); +/* +** =================================================================== +** Method : GetDir (component SDK_BitIO) +** +** Description : +** Return the direction of the pin (input/output) +** Parameters : None +** Returns : +** --- - FALSE if port is input, TRUE if port is +** output +** =================================================================== +*/ + +void DbgRd1_SetDir(bool Dir); +/* +** =================================================================== +** Method : SetDir (component SDK_BitIO) +** +** Description : +** Sets the direction of the pin (input or output) +** Parameters : +** NAME - DESCRIPTION +** Dir - FALSE: input, TRUE: output +** Returns : Nothing +** =================================================================== +*/ + +void DbgRd1_SetInput(void); +/* +** =================================================================== +** Method : SetInput (component SDK_BitIO) +** +** Description : +** Sets the pin as input +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DbgRd1_SetOutput(void); +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void DbgRd1_PutVal(bool Val); +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ + +/* END DbgRd1. */ + +#endif +/* ifndef __DbgRd1_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/Input1.c b/TSM_PicoW_Sensor/McuLib/src/Input1.c new file mode 100644 index 0000000..301a412 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/Input1.c @@ -0,0 +1,537 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : Input1.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : Input1 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Input +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool Input1_GetDir(void); +** SetDir - void Input1_SetDir(bool Dir); +** SetInput - void Input1_SetInput(void); +** SetOutput - void Input1_SetOutput(void); +** GetVal - bool Input1_GetVal(void); +** PutVal - void Input1_PutVal(bool Val); +** ClrVal - void Input1_ClrVal(void); +** SetVal - void Input1_SetVal(void); +** NegVal - void Input1_NegVal(void); +** Init - void Input1_Init(void); +** Deinit - void Input1_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file Input1.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup Input1_module Input1 module documentation +** @{ +*/ + +/* MODULE Input1. */ + +#include "Input1.h" +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if Input1_CONFIG_DO_PIN_MUXING + #if McuLib_CONFIG_CPU_IS_LPC + #include "fsl_iocon.h" /* include SDK header file for I/O connection muxing */ + #else /* Kinetis */ + #include "fsl_port.h" /* include SDK header file for port muxing */ + #endif + #endif + #include "fsl_gpio.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + #include "pins_gpio_hw_access.h" + #include "pins_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + #include "nrf_gpio.h" +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + #include "McuGPIO.h" +#else + #error "Unsupported SDK!" +#endif + +#if McuLib_CONFIG_NXP_SDK_2_0_USED + static const gpio_pin_config_t Input1_configOutput = { + kGPIO_DigitalOutput, /* use as output pin */ + Input1_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; + + static const gpio_pin_config_t Input1_configInput = { + kGPIO_DigitalInput, /* use as input pin */ + Input1_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + const gpio_output_pin_user_config_t Input1_OutputConfig[] = { + { + .pinName = Input1_CONFIG_PIN_SYMBOL, + .config.outputLogic = Input1_CONFIG_INIT_PIN_VALUE, + #if FSL_FEATURE_PORT_HAS_SLEW_RATE + .config.slewRate = kPortSlowSlewRate, + #endif + #if FSL_FEATURE_PORT_HAS_OPEN_DRAIN + .config.isOpenDrainEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH + .config.driveStrength = kPortLowDriveStrength, + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; + + const gpio_input_pin_user_config_t Input1_InputConfig[] = { + { + .pinName = Input1_CONFIG_PIN_SYMBOL, + #if FSL_FEATURE_PORT_HAS_PULL_ENABLE + #if Input1_CONFIG_PULL_RESISTOR==0 /* 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ + .config.isPullEnable = false, + #else + .config.isPullEnable = true, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PULL_SELECTION + #if Input1_CONFIG_PULL_RESISTOR==1 + .config.pullSelect = kPortPullUp, + #else + .config.pullSelect = kPortPullDown, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER + .config.isPassiveFilterEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER + .config.isDigitalFilterEnabled = true, + #endif + #if FSL_FEATURE_GPIO_HAS_INTERRUPT_VECTOR + .config.interrupt = kPortIntDisabled + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + static McuGPIO_Handle_t pin; +#endif + +static bool Input1_isOutput = false; +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void Input1_ClrVal(void) +{ +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if McuLib_CONFIG_CPU_IS_LPC + GPIO_PortClear(Input1_CONFIG_GPIO_NAME, Input1_CONFIG_PORT_NAME, 1< input */ + PINS_DRV_SetPinsDirection(Input1_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_input(Input1_CONFIG_PIN_NUMBER, NRF_GPIO_PIN_NOPULL); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsInput(pin); +#endif + Input1_isOutput = false; +} + +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void Input1_SetOutput(void) +{ +#if McuLib_CONFIG_CPU_IS_LPC + GPIO_PinInit(Input1_CONFIG_GPIO_NAME, Input1_CONFIG_PORT_NAME, Input1_CONFIG_PIN_NUMBER, &Input1_configOutput); +#elif McuLib_CONFIG_NXP_SDK_2_0_USED + GPIO_PinInit(Input1_CONFIG_GPIO_NAME, Input1_CONFIG_PIN_NUMBER, &Input1_configOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + GPIO_DRV_SetPinDir(Input1_CONFIG_PIN_SYMBOL, kGpioDigitalOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + pins_channel_type_t val; + + val = PINS_GPIO_GetPinsDirection(Input1_CONFIG_PORT_NAME); /* bit 0: pin is input; 1: pin is output */ + val |= (1< output */ + PINS_DRV_SetPinsDirection(Input1_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_output(Input1_CONFIG_PIN_NUMBER); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsOutput(pin, false /* don't care */); +#endif + Input1_isOutput = true; +} + +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ +void Input1_PutVal(bool Val) +{ +#if McuLib_CONFIG_CPU_IS_LPC + if (Val) { + GPIO_PortSet(Input1_CONFIG_GPIO_NAME, Input1_CONFIG_PORT_NAME, 1<_ */ + _IOCON_PIO_FUNC0 | + /* Selects pull-up function */ + _IOCON_PIO_MODE_PULLUP | + /* Standard mode, output slew rate control is enabled */ + _IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + _IOCON_PIO_INV_DI | + /* Enables digital function */ + _IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + _IOCON_PIO_OPENDRAIN_DI); + #if (McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0) + IOCON_PinMuxSet(Input1_CONFIG_PORT_NAME, Input1_CONFIG_PIN_NUMBER, port_pin_config); + #else + IOCON_PinMuxSet(IOCON, Input1_CONFIG_PORT_NAME, Input1_CONFIG_PIN_NUMBER, port_pin_config); + #endif + #else + PORT_SetPinMux(Input1_CONFIG_PORT_NAME, Input1_CONFIG_PIN_NUMBER, kPORT_MuxAsGpio); /* mux as GPIO */ + #endif + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + /*! Pin Muxing not implemented */ + GPIO_DRV_Init(Input1_InputConfig, Input1_OutputConfig); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + /* the following needs to be called in the application first: + PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); + */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + config.hw.pin = Input1_CONFIG_PIN_NUMBER; + config.isInput = true; + pin = McuGPIO_InitGPIO(&config); +#endif +#if Input1_CONFIG_INIT_PIN_DIRECTION == Input1_CONFIG_INIT_PIN_DIRECTION_INPUT + Input1_SetInput(); +#elif Input1_CONFIG_INIT_PIN_DIRECTION == Input1_CONFIG_INIT_PIN_DIRECTION_OUTPUT + Input1_SetOutput(); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void Input1_Deinit(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + pin = McuGPIO_DeinitGPIO(pin); +#endif +} + +/* END Input1. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/Input1.h b/TSM_PicoW_Sensor/McuLib/src/Input1.h new file mode 100644 index 0000000..120064f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/Input1.h @@ -0,0 +1,243 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : Input1.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : Input1 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Input +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool Input1_GetDir(void); +** SetDir - void Input1_SetDir(bool Dir); +** SetInput - void Input1_SetInput(void); +** SetOutput - void Input1_SetOutput(void); +** GetVal - bool Input1_GetVal(void); +** PutVal - void Input1_PutVal(bool Val); +** ClrVal - void Input1_ClrVal(void); +** SetVal - void Input1_SetVal(void); +** NegVal - void Input1_NegVal(void); +** Init - void Input1_Init(void); +** Deinit - void Input1_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file Input1.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup Input1_module Input1 module documentation +** @{ +*/ + +#ifndef __Input1_H +#define __Input1_H + +/* MODULE Input1. */ +#include "McuLib.h" /* SDK and API used */ +#include "Input1config.h" /* configuration */ + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" + + /* only GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF and GPIOG are currently supported */ + #define Input1_GPIO_IDX GPIOA_IDX /* GPIOA */ + + enum Input1_pinNames{ + Input1_CONFIG_PIN_SYMBOL = GPIO_MAKE_PIN(Input1_GPIO_IDX, Input1_CONFIG_PIN_NUMBER), + }; + + extern const gpio_output_pin_user_config_t Input1_OutputConfig[]; + extern const gpio_input_pin_user_config_t Input1_InputConfig[]; +#endif + +void Input1_Init(void); +/* +** =================================================================== +** Method : Init (component SDK_BitIO) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void Input1_ClrVal(void); +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void Input1_SetVal(void); +/* +** =================================================================== +** Method : SetVal (component SDK_BitIO) +** +** Description : +** Sets the pin value to a high value. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void Input1_NegVal(void); +/* +** =================================================================== +** Method : NegVal (component SDK_BitIO) +** +** Description : +** Toggles/negates the pin value +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void Input1_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +bool Input1_GetVal(void); +/* +** =================================================================== +** Method : GetVal (component SDK_BitIO) +** +** Description : +** Returns the pin value +** Parameters : None +** Returns : +** --- - Returns the value of the pin: +** FALSE/logical level '0' or TRUE/logical +** level '1' +** =================================================================== +*/ + +bool Input1_GetDir(void); +/* +** =================================================================== +** Method : GetDir (component SDK_BitIO) +** +** Description : +** Return the direction of the pin (input/output) +** Parameters : None +** Returns : +** --- - FALSE if port is input, TRUE if port is +** output +** =================================================================== +*/ + +void Input1_SetDir(bool Dir); +/* +** =================================================================== +** Method : SetDir (component SDK_BitIO) +** +** Description : +** Sets the direction of the pin (input or output) +** Parameters : +** NAME - DESCRIPTION +** Dir - FALSE: input, TRUE: output +** Returns : Nothing +** =================================================================== +*/ + +void Input1_SetInput(void); +/* +** =================================================================== +** Method : SetInput (component SDK_BitIO) +** +** Description : +** Sets the pin as input +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void Input1_SetOutput(void); +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void Input1_PutVal(bool Val); +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ + +/* END Input1. */ + +#endif +/* ifndef __Input1_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/InputRB1.c b/TSM_PicoW_Sensor/McuLib/src/InputRB1.c new file mode 100644 index 0000000..2379a98 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/InputRB1.c @@ -0,0 +1,437 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : InputRB1.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : RingBuffer +** Version : Component 01.054, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-14, 06:24, # CodeGen: 679 +** Abstract : +** This component implements a ring buffer for different integer data type. +** Settings : +** Component name : InputRB1 +** Buffer Size : 10 +** Contents : +** Clear - void InputRB1_Clear(void); +** Put - uint8_t InputRB1_Put(InputRB1_ElementType elem); +** Get - uint8_t InputRB1_Get(InputRB1_ElementType *elemP); +** Peek - uint8_t InputRB1_Peek(InputRB1_BufSizeType index, InputRB1_ElementType *elemP); +** Update - uint8_t InputRB1_Update(InputRB1_BufSizeType index, InputRB1_ElementType... +** Putn - uint8_t InputRB1_Putn(InputRB1_ElementType *elem, InputRB1_BufSizeType nof); +** Getn - uint8_t InputRB1_Getn(InputRB1_ElementType *buf, InputRB1_BufSizeType nof); +** Compare - uint8_t InputRB1_Compare(InputRB1_BufSizeType index, InputRB1_ElementType... +** Delete - uint8_t InputRB1_Delete(void); +** NofElements - InputRB1_BufSizeType InputRB1_NofElements(void); +** NofFreeElements - InputRB1_BufSizeType InputRB1_NofFreeElements(void); +** Deinit - void InputRB1_Deinit(void); +** Init - void InputRB1_Init(void); +** +** * Copyright (c) 2014-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file InputRB1.h +** @version 01.00 +** @brief +** This component implements a ring buffer for different integer data type. +*/ +/*! +** @addtogroup InputRB1_module InputRB1 module documentation +** @{ +*/ + +/* MODULE InputRB1. */ + +#include "InputRB1.h" + +#if InputRB1_CONFIG_REENTRANT + #define InputRB1_DEFINE_CRITICAL() McuCriticalSection_CriticalVariable() + #define InputRB1_ENTER_CRITICAL() McuCriticalSection_EnterCritical() + #define InputRB1_EXIT_CRITICAL() McuCriticalSection_ExitCritical() +#else + #define InputRB1_DEFINE_CRITICAL() /* nothing */ + #define InputRB1_ENTER_CRITICAL() /* nothing */ + #define InputRB1_EXIT_CRITICAL() /* nothing */ +#endif +static InputRB1_ElementType InputRB1_buffer[InputRB1_CONFIG_BUF_SIZE]; /* ring buffer */ +static InputRB1_BufSizeType InputRB1_inIdx; /* input index */ +static InputRB1_BufSizeType InputRB1_outIdx; /* output index */ +static InputRB1_BufSizeType InputRB1_inSize; /* size data in buffer */ +/* +** =================================================================== +** Method : Put (component RingBuffer) +** +** Description : +** Puts a new element into the buffer +** Parameters : +** NAME - DESCRIPTION +** elem - New element to be put into the buffer +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t InputRB1_Put(InputRB1_ElementType elem) +{ + uint8_t res = ERR_OK; + InputRB1_DEFINE_CRITICAL(); + + InputRB1_ENTER_CRITICAL(); + if (InputRB1_inSize==InputRB1_CONFIG_BUF_SIZE) { + res = ERR_TXFULL; + } else { + InputRB1_buffer[InputRB1_inIdx] = elem; + InputRB1_inIdx++; + if (InputRB1_inIdx==InputRB1_CONFIG_BUF_SIZE) { + InputRB1_inIdx = 0; + } + InputRB1_inSize++; + } + InputRB1_EXIT_CRITICAL(); + return res; +} + +/* +** =================================================================== +** Method : Putn (component RingBuffer) +** +** Description : +** Put a number new element into the buffer. +** Parameters : +** NAME - DESCRIPTION +** * elem - Pointer to new elements to be put into +** the buffer +** nof - number of elements +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t InputRB1_Putn(InputRB1_ElementType *elem, InputRB1_BufSizeType nof) +{ + uint8_t res = ERR_OK; + + while(nof>0) { + res = InputRB1_Put(*elem); + if (res!=ERR_OK) { + break; + } + elem++; nof--; + } + return res; +} + +/* +** =================================================================== +** Method : Get (component RingBuffer) +** +** Description : +** Removes an element from the buffer +** Parameters : +** NAME - DESCRIPTION +** * elemP - Pointer to where to store the received +** element +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t InputRB1_Get(InputRB1_ElementType *elemP) +{ + uint8_t res = ERR_OK; + InputRB1_DEFINE_CRITICAL(); + + InputRB1_ENTER_CRITICAL(); + if (InputRB1_inSize==0) { + res = ERR_RXEMPTY; + } else { + *elemP = InputRB1_buffer[InputRB1_outIdx]; + InputRB1_inSize--; + InputRB1_outIdx++; + if (InputRB1_outIdx==InputRB1_CONFIG_BUF_SIZE) { + InputRB1_outIdx = 0; + } + } + InputRB1_EXIT_CRITICAL(); + return res; +} + +/* +** =================================================================== +** Method : Getn (component RingBuffer) +** +** Description : +** Get a number elements into a buffer. +** Parameters : +** NAME - DESCRIPTION +** * buf - Pointer to buffer where to store the +** elements +** nof - number of elements +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t InputRB1_Getn(InputRB1_ElementType *buf, InputRB1_BufSizeType nof) +{ + uint8_t res = ERR_OK; + + while(nof>0) { + res = InputRB1_Get(buf); + if (res!=ERR_OK) { + break; + } + buf++; nof--; + } + return res; +} + +/* +** =================================================================== +** Method : NofElements (component RingBuffer) +** +** Description : +** Returns the actual number of elements in the buffer. +** Parameters : None +** Returns : +** --- - Number of elements in the buffer. +** =================================================================== +*/ +InputRB1_BufSizeType InputRB1_NofElements(void) +{ + return InputRB1_inSize; +} + +/* +** =================================================================== +** Method : NofFreeElements (component RingBuffer) +** +** Description : +** Returns the actual number of free elements/space in the +** buffer. +** Parameters : None +** Returns : +** --- - Number of elements in the buffer. +** =================================================================== +*/ +InputRB1_BufSizeType InputRB1_NofFreeElements(void) +{ + return (InputRB1_BufSizeType)(InputRB1_CONFIG_BUF_SIZE-InputRB1_inSize); +} + +/* +** =================================================================== +** Method : Init (component RingBuffer) +** +** Description : +** Initializes the data structure +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void InputRB1_Init(void) +{ + InputRB1_inIdx = 0; + InputRB1_outIdx = 0; + InputRB1_inSize = 0; +} + +/* +** =================================================================== +** Method : Clear (component RingBuffer) +** +** Description : +** Clear (empty) the ring buffer. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void InputRB1_Clear(void) +{ + InputRB1_DEFINE_CRITICAL(); + + InputRB1_ENTER_CRITICAL(); + InputRB1_Init(); + InputRB1_EXIT_CRITICAL(); +} + +/* +** =================================================================== +** Method : Peek (component RingBuffer) +** +** Description : +** Returns an element of the buffer without removiing it. +** Parameters : +** NAME - DESCRIPTION +** index - Index of element. 0 peeks the top +** element, 1 the next, and so on. +** * elemP - Pointer to where to store the received +** element +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t InputRB1_Peek(InputRB1_BufSizeType index, InputRB1_ElementType *elemP) +{ + uint8_t res = ERR_OK; + int idx; /* index inside ring buffer */ + InputRB1_DEFINE_CRITICAL(); + + InputRB1_ENTER_CRITICAL(); + if (index>=InputRB1_CONFIG_BUF_SIZE) { + res = ERR_OVERFLOW; /* asking for an element outside of ring buffer size */ + } else if (index0) { + res = InputRB1_Peek(index, &val); + if (res!=ERR_OK) { /* general failure? */ + cmpResult = (uint8_t)-1; /* no match */ + break; + } + if (val!=*elemP) { /* mismatch */ + cmpResult = (uint8_t)-1; /* no match */ + break; + } + elemP++; index++; nof--; + } + + return cmpResult; +} + +/* +** =================================================================== +** Method : Deinit (component RingBuffer) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +/** +void InputRB1_Deinit(void) +{ + ** Function is implemented as macro in the header file +} +*/ +/* +** =================================================================== +** Method : Delete (component RingBuffer) +** +** Description : +** Removes an element from the buffer +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t InputRB1_Delete(void) +{ + uint8_t res = ERR_OK; + InputRB1_DEFINE_CRITICAL(); + + InputRB1_ENTER_CRITICAL(); + if (InputRB1_inSize==0) { + res = ERR_RXEMPTY; + } else { + InputRB1_inSize--; + InputRB1_outIdx++; + if (InputRB1_outIdx==InputRB1_CONFIG_BUF_SIZE) { + InputRB1_outIdx = 0; + } + } + InputRB1_EXIT_CRITICAL(); + return res; +} + +/* +** =================================================================== +** Method : Update (component RingBuffer) +** +** Description : +** Updates the data of an element. +** Parameters : +** NAME - DESCRIPTION +** index - Index of element. 0 peeks the top +** element, 1 the next, and so on. +** * elemP - Pointer to where to store the received +** element +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t InputRB1_Update(InputRB1_BufSizeType index, InputRB1_ElementType *elemP) +{ + uint8_t res = ERR_OK; + int idx; /* index inside ring buffer */ + InputRB1_DEFINE_CRITICAL(); + + InputRB1_ENTER_CRITICAL(); + if (index>=InputRB1_CONFIG_BUF_SIZE) { + res = ERR_OVERFLOW; /* asking for an element outside of ring buffer size */ + } else if (indexstdOut); +#if McuLib_CONFIG_CPU_IS_KINETIS || McuLib_CONFIG_CPU_IS_LPC || McuLib_CONFIG_CPU_IS_RPxxxx + res = McuArmTools_UIDGet(&uid); + if (res==ERR_OK) { + res = McuArmTools_UIDtoString(&uid, buf, sizeof(buf)); + } + if (res!=ERR_OK) { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ERROR"); + } + McuShell_SendStatusStr((unsigned char*)" UID", buf, io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); +#endif + +#if McuLib_CONFIG_CPU_IS_LPC && (McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC845 || McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC804) + uint32_t val; + + res = IAP_ReadPartID(&val); + if (res == kStatus_IAP_Success) { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum32Hex(buf, sizeof(buf), val); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ERROR\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" PartID", buf, io->stdOut); + + res = IAP_ReadBootCodeVersion(&val); + if (res == kStatus_IAP_Success) { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"Version 0x"); + McuUtility_strcatNum32Hex(buf, sizeof(buf), val); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ERROR\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" BootCode", buf, io->stdOut); +#endif + + McuShell_SendStatusStr((unsigned char*)" Family", (uint8_t*)McuArmTools_GetKinetisFamilyString(), io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + return ERR_OK; +} +#endif + +#if McuArmTools_CONFIG_PARSE_COMMAND_ENABLED +static uint8_t PrintHelp(const McuShell_StdIOType *io) +{ + McuShell_SendHelpStr((unsigned char*)"McuArmTools", (unsigned char*)"Group of McuArmTools commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" reset", (unsigned char*)"Performs a software reset\r\n", io->stdOut); +#if McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_RPI_PICO + McuShell_SendHelpStr((unsigned char*)" bootloader", (unsigned char*)"Enter bootloader mode\r\n", io->stdOut); +#endif + return ERR_OK; +} +#endif + +/* +** =================================================================== +** Method : SoftwareReset (component KinetisTools) +** +** Description : +** Performs a reset of the device +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuArmTools_SoftwareReset(void) +{ + /* Generic way to request a reset from software for ARM Cortex */ + /* See https://community.freescale.com/thread/99740 + To write to this register, you must write 0x5FA to the VECTKEY field, otherwise the processor ignores the write. + SYSRESETREQ will cause a system reset asynchronously, so need to wait afterwards. + */ +#if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M +#if McuLib_CONFIG_PEX_SDK_USED + SCB_AIRCR = SCB_AIRCR_VECTKEY(0x5FA) | SCB_AIRCR_SYSRESETREQ_MASK; +#elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_S32K + S32_SCB->AIRCR = S32_SCB_AIRCR_VECTKEY(0x5FA) | S32_SCB_AIRCR_SYSRESETREQ_MASK; +#elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_RPI_PICO + #define SCB_AIRCR (*((uint32_t*)(0xe0000000+0xed0c))) + #define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ + #define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ + #define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + + SCB_AIRCR = (0x5FA<AIRCR = (0x5FA<id[i] = 0; + } + if (sizeof(sim_uid_t)>sizeof(McuArmTools_UID)) { + return ERR_OVERFLOW; + } + /* copy into our own structure, data is right justified */ + for(i=0,j=sizeof(McuArmTools_UID)-sizeof(sim_uid_t);iid[j] = ((uint8_t*)&tmp)[i]; + } + #elif McuLib_CONFIG_IS_KINETIS_KE + /* some devices like the KE02Z only have 64bit UUID: only SIM_UUIDH and SIM_UUIDL */ + uid->id[0] = 0; + uid->id[1] = 0; + uid->id[2] = 0; + uid->id[3] = 0; + uid->id[4] = 0; + uid->id[5] = 0; + uid->id[6] = 0; + uid->id[7] = 0; + uid->id[8] = (SIM->UUIDH>>24)&0xff; + uid->id[9] = (SIM->UUIDH>>16)&0xff; + uid->id[10] = (SIM->UUIDH>>8)&0xff; + uid->id[11] = SIM->UUIDH&0xff; + + uid->id[12] = (SIM->UUIDL>>24)&0xff; + uid->id[13] = (SIM->UUIDL>>16)&0xff; + uid->id[14] = (SIM->UUIDL>>8)&0xff; + uid->id[15] = SIM->UUIDL&0xff; + #else /* not McuLib_CONFIG_NXP_SDK_2_0_USED */ + #ifdef SIM_UIDMH /* 80 or 128 bit UUID: SIM_UIDMH, SIM_UIDML and SIM_UIDL */ + #ifdef SIM_UIDH + uid->id[0] = (SIM_UIDH>>24)&0xff; + uid->id[1] = (SIM_UIDH>>16)&0xff; + uid->id[2] = (SIM_UIDH>>8)&0xff; + uid->id[3] = SIM_UIDH&0xff; + #else + uid->id[0] = 0; + uid->id[1] = 0; + uid->id[2] = 0; + uid->id[3] = 0; + #endif + uid->id[4] = (SIM_UIDMH>>24)&0xff; + uid->id[5] = (SIM_UIDMH>>16)&0xff; + uid->id[6] = (SIM_UIDMH>>8)&0xff; + uid->id[7] = SIM_UIDMH&0xff; + + uid->id[8] = (SIM_UIDML>>24)&0xff; + uid->id[9] = (SIM_UIDML>>16)&0xff; + uid->id[10] = (SIM_UIDML>>8)&0xff; + uid->id[11] = SIM_UIDML&0xff; + + uid->id[12] = (SIM_UIDL>>24)&0xff; + uid->id[13] = (SIM_UIDL>>16)&0xff; + uid->id[14] = (SIM_UIDL>>8)&0xff; + uid->id[15] = SIM_UIDL&0xff; + #elif defined(SIM_UUIDMH) /* KE06Z: SIM_UUIDMH, SIM_UUIDML and SIM_UUIDL */ + uid->id[0] = 0; + uid->id[1] = 0; + uid->id[2] = 0; + uid->id[3] = 0; + uid->id[4] = 0; + uid->id[5] = 0; + uid->id[6] = (SIM_UUIDMH>>8)&0xff; + uid->id[7] = SIM_UUIDMH&0xff; + + uid->id[8] = (SIM_UUIDML>>24)&0xff; + uid->id[9] = (SIM_UUIDML>>16)&0xff; + uid->id[10] = (SIM_UUIDML>>8)&0xff; + uid->id[11] = SIM_UUIDML&0xff; + + uid->id[12] = (SIM_UUIDL>>24)&0xff; + uid->id[13] = (SIM_UUIDL>>16)&0xff; + uid->id[14] = (SIM_UUIDL>>8)&0xff; + uid->id[15] = SIM_UUIDL&0xff; + #else /* some devices like the KE02Z only have 64bit UUID: only SIM_UUIDH and SIM_UUIDL */ + uid->id[0] = 0; + uid->id[1] = 0; + uid->id[2] = 0; + uid->id[3] = 0; + uid->id[4] = 0; + uid->id[5] = 0; + uid->id[6] = 0; + uid->id[7] = 0; + uid->id[8] = (SIM_UUIDH>>24)&0xff; + uid->id[9] = (SIM_UUIDH>>16)&0xff; + uid->id[10] = (SIM_UUIDH>>8)&0xff; + uid->id[11] = SIM_UUIDH&0xff; + + uid->id[12] = (SIM_UUIDL>>24)&0xff; + uid->id[13] = (SIM_UUIDL>>16)&0xff; + uid->id[14] = (SIM_UUIDL>>8)&0xff; + uid->id[15] = SIM_UUIDL&0xff; + #endif + #endif /* McuLib_CONFIG_NXP_SDK_2_0_USED */ + return ERR_OK; +#elif McuLib_CONFIG_CPU_IS_LPC && (McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC845 || McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC804) + status_t res; + + res = IAP_ReadUniqueID((uint32_t*)&uid->id[0]); + if (res != kStatus_IAP_Success) { + return ERR_FAILED; + } + return ERR_OK; +#elif McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC55S16 + int i; + uint8_t *p; + + /* init */ + for(i=0;iid[i] = 0; + } + p = (uint8_t*)&FLASH_NMPA->UUID_ARRAY[0]; + for(i=0;iUUID_ARRAY);i++) { + uid->id[i] = *p; + p++; + } + return ERR_OK; +#elif McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC55S69 + int i; + + /* init */ + for(i=0;iid[i] = 0; + } +#if 0 /* should work for LPC55x59, but fails? */ + status_t status; + flash_config_t flashConfig; + + status = FFR_Init(&flashConfig); + if (status!=kStatus_Success) { + return ERR_FAILED; + } + + assert(sizeof(uid->id)*8>=128); /* must be at least 128 bits */ + status = FFR_GetUUID(&flashConfig, &uid->id[0]); + if (status!=kStatus_Success) { + return ERR_FAILED; + } +#endif + return ERR_FAILED; /* not implemented yet */ +#elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_RPI_PICO + memset(uid, 0, sizeof(McuArmTools_UID)); + /* We do *not* use flash_get_unique_id() of the flash API, because this requires interrupts disabled for *both* cores. + * Instead, we use the one stored by the RP2040 boot code with pico_get_unique_board_id() */ + pico_unique_board_id_t id; + + pico_get_unique_board_id(&id); + for(int i=0; iid) && iid[i] = id.id[i]; + } + return ERR_OK; +#else + (void)uid; /* not used */ + return ERR_FAILED; +#endif +} + +/* +** =================================================================== +** Method : UIDSame (component KinetisTools) +** +** Description : +** Compares two UID +** Parameters : +** NAME - DESCRIPTION +** * src - Pointer to +** Variable_1 - +** Returns : +** --- - TRUE if the same, FALSE otherwise +** =================================================================== +*/ +/*! + * \brief Compares two UID + * \param src One UID + * \param dst The other UID + * \return TRUE if the two UID's are the same + */ +bool McuArmTools_UIDSame(const McuArmTools_UID *src, const McuArmTools_UID *dst) +{ + unsigned int i; + + for(i=0; iid[i]!=dst->id[i]) { + return FALSE; /* no match */ + } + } + return TRUE; +} + +/* +** =================================================================== +** Method : UIDtoString (component KinetisTools) +** +** Description : +** Returns the value of the UID as string +** Parameters : +** NAME - DESCRIPTION +** uid - +** * buf - Pointer to +** bufSize - +** Returns : +** --- - Error code +** =================================================================== +*/ +/*! + * \brief Transforms the 80bit UID into a string + * \param id Pointer to the buffer where to store the string + * \param bufSize Size of buffer in bytes + * \return Error code, ERR_OK if everything is ok. + */ +uint8_t McuArmTools_UIDtoString(const McuArmTools_UID *uid, uint8_t *buf, size_t bufSize) +{ + unsigned int i; + + McuUtility_strcpy(buf, bufSize, (unsigned char*)"{"); + for(i=0;iid[i]); + if (i>28)&0x3; /* bits 30..28 */ + if (val>=0 && val<=(int32_t)(sizeof(KinetisM0FamilyStrings)/sizeof(KinetisM0FamilyStrings[0]))) { + return KinetisM0FamilyStrings[val]; + } else { + return (McuArmTools_ConstCharPtr)"M0 Family ID out of bounds!"; + } + #elif defined(SIM_SRSID_FAMID) /* MKE02Z4 defines this, hopefully all other KE too... */ + return (McuArmTools_ConstCharPtr)"KE0x Family"; /* 0000 only KE0x supported */ + #elif defined(SIM_SDID_FAMID) || defined(SIM_SDID_FAMILYID) + int32_t val; + + val = ((SIM->SDID)>>28)&0xF; /* bits 31..28 */ + if (val>=0 && val<=(int32_t)(sizeof(KinetisM0FamilyStrings)/sizeof(KinetisM0FamilyStrings[0]))) { + return KinetisM0FamilyStrings[val]; + } else { + return (McuArmTools_ConstCharPtr)"M0 Family ID out of bounds!"; + } + #else + #error "Unknown architecture!" + return (McuArmTools_ConstCharPtr)"ERROR"; + #endif + #elif McuLib_CONFIG_CORTEX_M==4 + #ifdef SIM_SDID /* normal Kinetis define this */ + int32_t val; + + val = (SIM_SDID>>4)&0x3; /* bits 6..4 */ + if (val>=0 && val<=(int32_t)(sizeof(KinetisM4FamilyStrings)/sizeof(KinetisM4FamilyStrings[0]))) { + return KinetisM4FamilyStrings[val]; + } else { + return (McuArmTools_ConstCharPtr)"M4 Family ID out of bounds!"; + } + #elif defined(SIM_SDID_FAMID) || defined(SIM_SDID_FAMILYID) + int32_t val; + + val = ((SIM->SDID)>>4)&0x3; /* bits 6..4 */ + if (val>=0 && val<=(int32_t)(sizeof(KinetisM4FamilyStrings)/sizeof(KinetisM4FamilyStrings[0]))) { + return KinetisM4FamilyStrings[val]; + } else { + return (McuArmTools_ConstCharPtr)"M4 Family ID out of bounds!"; + } + #else + #error "Unknown architecture!" + return (McuArmTools_ConstCharPtr)"ERROR"; + #endif + #elif McuLib_CONFIG_CORTEX_M==7 + return (McuArmTools_ConstCharPtr)"Cortex-M7"; + #else + #error "Unknown architecture!" + return (McuArmTools_ConstCharPtr)"ERROR"; + #endif +#elif McuLib_CONFIG_CPU_IS_NORDIC_NRF + return (McuArmTools_ConstCharPtr)"Nordic nRF"; +#elif McuLib_CONFIG_CPU_IS_STM + return (McuArmTools_ConstCharPtr)"STM32"; +#elif McuLib_CONFIG_CPU_IS_IMXRT + return (McuArmTools_ConstCharPtr)"NXP i.MX RT"; +#elif McuLib_CONFIG_CPU_IS_S32K + return (McuArmTools_ConstCharPtr)"NXP S32K"; +#elif McuLib_CONFIG_CPU_IS_LPC + #if McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC845 + return (McuArmTools_ConstCharPtr)"NXP LPC845"; + #elif McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC804 + return (McuArmTools_ConstCharPtr)"NXP LPC804"; + #elif McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC55S16 + return (McuArmTools_ConstCharPtr)"NXP LPC55S16"; + #elif McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC55S59 + return (McuArmTools_ConstCharPtr)"NXP LPC55S69"; + #elif McuLib_CONFIG_CPU_IS_LPC55xx + return (McuArmTools_ConstCharPtr)"NXP LPC55xx"; + #else + return (McuArmTools_ConstCharPtr)"NXP LPC"; + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_RPI_PICO + #if McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_RP2040 + return (McuArmTools_ConstCharPtr)"Raspberry Pi Pico, RP2040"; + #else + return (McuArmTools_ConstCharPtr)"Raspberry Pi Pico"; + #endif +#else + return (McuArmTools_ConstCharPtr)"UNKNOWN"; +#endif +} + +/* +** =================================================================== +** Method : GetPC (component KinetisTools) +** +** Description : +** returns the program counter +** Parameters : None +** Returns : +** --- - program counter +** =================================================================== +*/ +void* McuArmTools_GetPC(void) +{ +#ifdef __GNUC__ + void *pc; + + __asm__ __volatile__ ("mov %0, pc" : "=r"(pc)); + return pc; +#else + #warning "only for GCC" + return NULL; +#endif +} + +/* +** =================================================================== +** Method : GetSP (component KinetisTools) +** +** Description : +** returns the stack pointer +** Parameters : None +** Returns : +** --- - stack pointer +** =================================================================== +*/ +void* McuArmTools_GetSP(void) +{ +#ifdef __GNUC__ + void *sp; + + __asm__ __volatile__ ("mrs %0, msp" : "=r"(sp)); + return sp; +#else + #warning "only for GCC" + return NULL; +#endif +} + +/* +** =================================================================== +** Method : SetPSP (component KinetisTools) +** +** Description : +** sets the process stack pointer +** Parameters : +** NAME - DESCRIPTION +** setval - new PSP value +** Returns : Nothing +** =================================================================== +*/ +void McuArmTools_SetPSP(void *setval) +{ +#ifdef __GNUC__ + __asm__ volatile ("msr psp, %[value]\n\t""dmb\n\t""dsb\n\t""isb\n\t"::[value]"r"(setval):); + __asm__ volatile ("" ::: "memory"); +#else + #warning "only for GCC implemented" +#endif +} + +/* +** =================================================================== +** Method : SetLR (component KinetisTools) +** +** Description : +** Sets the link register +** Parameters : +** NAME - DESCRIPTION +** setval - new LR value +** Returns : Nothing +** =================================================================== +*/ +void McuArmTools_SetLR(uint32_t setval) +{ +#ifdef __GNUC__ + __asm__ volatile ("mov lr, %[value]\n\t"::[value]"r"(setval):); + __asm__ volatile ("" ::: "memory"); +#else + #warning "only for GCC" +#endif +} + +/* +** =================================================================== +** Method : InitCycleCounter (component KinetisTools) +** +** Description : +** Initializes the cycle counter, available if the core has a +** DWT (Data Watchpoint and Trace) unit, usually present on +** M3/M4/M7 +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +/** +void McuArmTools_InitCycleCounter(void) +{ + ** Implemented as macro in header file +} +*/ + +/* +** =================================================================== +** Method : ResetCycleCounter (component KinetisTools) +** +** Description : +** Reset the cycle counter (set it to zero) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +/** +void McuArmTools_ResetCycleCounter(void) +{ + ** Implemented as macro in header file +} +*/ + +/* +** =================================================================== +** Method : EnableCycleCounter (component KinetisTools) +** +** Description : +** Enables counting the cycles. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +/** +void McuArmTools_EnableCycleCounter(void) +{ + ** Implemented as macro in header file +} +*/ + +/* +** =================================================================== +** Method : DisableCycleCounter (component KinetisTools) +** +** Description : +** Disables the cycle counter. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +/** +void McuArmTools_DisableCycleCounter(void) +{ + ** Implemented as macro in header file +} +*/ + +/* +** =================================================================== +** Method : GetCycleCounter (component KinetisTools) +** +** Description : +** Return the current cycle counter value +** Parameters : None +** Returns : +** --- - cycle counter +** =================================================================== +*/ +/** +uint32_t McuArmTools_GetCycleCounter(void) +{ + ** Implemented as macro in header file +} +*/ + +/* +** =================================================================== +** Method : Deinit (component KinetisTools) +** +** Description : +** Driver de-initialization routine +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuArmTools_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component KinetisTools) +** +** Description : +** Driver initialization routine +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuArmTools_Init(void) +{ + /* Nothing needed */ +} + +/* +** =================================================================== +** Method : GetUsedMainStackSpace (component KinetisTools) +** +** Description : +** Returns the used main stack space, based on the overwritten +** checking pattern. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/*! + * \brief Returns the used main stack space, based on the overwritten checking pattern. + * \return Number of used main stack bytes + */ +uint32_t McuArmTools_GetUsedMainStackSpace(void) +{ + return McuArmTools_GetLinkerMainStackSize()-McuArmTools_GetUnusedMainStackSpace(); +} + +/* +** =================================================================== +** Method : GetUnusedMainStackSpace (component KinetisTools) +** +** Description : +** Calculates the unused stack space, based on the checking +** pattern. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/*! + * \brief Calculates the unused stack space, based on the checking pattern. + * \return Number of unused main stack space. + */ +uint32_t McuArmTools_GetUnusedMainStackSpace(void) +{ + uint32_t unused = 0; /* number of unused bytes */ + uint32_t *p = (uint32_t*)&McuArmTools_CONFIG_LINKER_SYMBOL_STACK_BASE; + + /* check if the pattern stored on the stack has been changed */ + while (*p==McuArmTools_CONFIG_STACK_CHECK_PATTERN) { + unused += sizeof(uint32_t); /* count number of unused bytes */ + p++; + } + return unused; /* return the number of unused bytes */ +} + +/* +** =================================================================== +** Method : FillMainStackSpace (component KinetisTools) +** +** Description : +** Fill the stack space with the checking pattern, up to the +** current MSP. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +/*! + * \brief Fill the stack space with the checking pattern, up to the current MSP. + */ +void McuArmTools_FillMainStackSpace(void) +{ + uint32_t *base = (uint32_t*)&McuArmTools_CONFIG_LINKER_SYMBOL_STACK_BASE; + uint32_t *msp = McuArmTools_GetSP()-32; /* get current MSP stack pointer, with a safety margin of 32 */ + /* the current MSP is near the top */ + while(base /* for size_t */ +#if McuArmTools_CONFIG_PARSE_COMMAND_ENABLED + #include "McuShell.h" /* Command line shell */ +#endif + + +#ifndef __BWUserType_McuArmTools_ConstCharPtr +#define __BWUserType_McuArmTools_ConstCharPtr + typedef const uint8_t *McuArmTools_ConstCharPtr; /* Pointer to constant string */ +#endif +#ifndef __BWUserType_McuArmTools_uint32_t_Ptr +#define __BWUserType_McuArmTools_uint32_t_Ptr + typedef uint32_t *McuArmTools_uint32_t_Ptr; /* Pointer to uint32_t */ +#endif + + +#if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M && McuLib_CONFIG_CORTEX_M>=3 /* only for Cortex-M3 or higher */ + /* DWT (Data Watchpoint and Trace) registers, only exists on ARM Cortex with a DWT unit */ + #define McuArmTools_DWT_CONTROL (*((volatile uint32_t*)0xE0001000)) + /*!< DWT Control register */ + #define McuArmTools_DWT_CYCCNTENA_BIT (1UL<<0) + /*!< CYCCNTENA bit in DWT_CONTROL register */ + #define McuArmTools_DWT_CYCCNT (*((volatile uint32_t*)0xE0001004)) + /*!< DWT Cycle Counter register */ + #define McuArmTools_DEMCR (*((volatile uint32_t*)0xE000EDFC)) + /*!< DEMCR: Debug Exception and Monitor Control Register */ + #define McuArmTools_TRCENA_BIT (1UL<<24) + /*!< Trace enable bit in DEMCR register */ +#endif + +typedef struct { +#if McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_RPI_PICO + uint8_t id[sizeof(pico_unique_board_id_t)]; /* 8 bytes, 64 bits */ +#else + uint8_t id[16]; /* 128 bit ID */ +#endif +} McuArmTools_UID; + +typedef enum { + McuArmTools_FAMILY_K10_K12, /* K10 or K12 */ + McuArmTools_FAMILY_K20_K22, /* K10 or K12 */ + McuArmTools_FAMILY_K30_K11_K61, /* K30, K11 or K61 */ + McuArmTools_FAMILY_K40_K21, /* K40 or K21 */ + McuArmTools_FAMILY_K70, /* K70 */ + McuArmTools_FAMILY_UNKONWN, /* Unknown */ + McuArmTools_FAMILY_LAST /* Must be last one! */ +} McuArmTools_FAMILY; + +#define McuArmTools_PARSE_COMMAND_ENABLED McuArmTools_CONFIG_PARSE_COMMAND_ENABLED + /*!< set to 1 if method ParseCommand() is present, 0 otherwise */ + +#ifdef __cplusplus +extern "C" { +#endif + +#if McuArmTools_CONFIG_PARSE_COMMAND_ENABLED +uint8_t McuArmTools_ParseCommand(const unsigned char* cmd, bool *handled, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : ParseCommand (component KinetisTools) +** +** Description : +** Shell Command Line parser. Method is only available if Shell +** is enabled in the component properties. +** Parameters : +** NAME - DESCRIPTION +** cmd - Pointer to command string +** * handled - Pointer to variable which tells if +** the command has been handled or not +** * io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ +#endif + +void McuArmTools_SoftwareReset(void); +/* +** =================================================================== +** Method : SoftwareReset (component KinetisTools) +** +** Description : +** Performs a reset of the device +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuArmTools_UIDGet(McuArmTools_UID *uid); +/* +** =================================================================== +** Method : UIDGet (component KinetisTools) +** +** Description : +** Return the 128bit UID of the device +** Parameters : +** NAME - DESCRIPTION +** * uid - Pointer to +** Returns : +** --- - Error code +** =================================================================== +*/ + +bool McuArmTools_UIDSame(const McuArmTools_UID *src, const McuArmTools_UID *dst); +/* +** =================================================================== +** Method : UIDSame (component KinetisTools) +** +** Description : +** Compares two UID +** Parameters : +** NAME - DESCRIPTION +** * src - Pointer to +** Variable_1 - +** Returns : +** --- - TRUE if the same, FALSE otherwise +** =================================================================== +*/ + +uint8_t McuArmTools_UIDtoString(const McuArmTools_UID *uid, uint8_t *buf, size_t bufSize); +/* +** =================================================================== +** Method : UIDtoString (component KinetisTools) +** +** Description : +** Returns the value of the UID as string +** Parameters : +** NAME - DESCRIPTION +** uid - +** * buf - Pointer to +** bufSize - +** Returns : +** --- - Error code +** =================================================================== +*/ + +McuArmTools_ConstCharPtr McuArmTools_GetKinetisFamilyString(void); +/* +** =================================================================== +** Method : GetKinetisFamilyString (component KinetisTools) +** +** Description : +** Determines the Kinetis Familiy based on SIM_SDID register +** Parameters : None +** Returns : +** --- - String describing the Kinetis Family +** =================================================================== +*/ + +void* McuArmTools_GetPC(void); +/* +** =================================================================== +** Method : GetPC (component KinetisTools) +** +** Description : +** returns the program counter +** Parameters : None +** Returns : +** --- - program counter +** =================================================================== +*/ + +void* McuArmTools_GetSP(void); +/* +** =================================================================== +** Method : GetSP (component KinetisTools) +** +** Description : +** returns the stack pointer +** Parameters : None +** Returns : +** --- - stack pointer +** =================================================================== +*/ + +void McuArmTools_SetPSP(void *setval); +/* +** =================================================================== +** Method : SetPSP (component KinetisTools) +** +** Description : +** sets the process stack pointer +** Parameters : +** NAME - DESCRIPTION +** setval - new PSP value +** Returns : Nothing +** =================================================================== +*/ + +void McuArmTools_SetLR(uint32_t setval); +/* +** =================================================================== +** Method : SetLR (component KinetisTools) +** +** Description : +** Sets the link register +** Parameters : +** NAME - DESCRIPTION +** setval - new LR value +** Returns : Nothing +** =================================================================== +*/ + +#if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M && McuLib_CONFIG_CORTEX_M>=3 /* only for Cortex-M3 or higher */ +#define McuArmTools_InitCycleCounter() \ + McuArmTools_DEMCR |= McuArmTools_TRCENA_BIT + /*!< TRCENA: Enable trace and debug block DEMCR (Debug Exception and Monitor Control Register */ +/* +** =================================================================== +** Method : InitCycleCounter (component KinetisTools) +** +** Description : +** Initializes the cycle counter, available if the core has a +** DWT (Data Watchpoint and Trace) unit, usually present on +** M3/M4/M7 +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +#endif + +#if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M && McuLib_CONFIG_CORTEX_M>=3 /* only for Cortex-M3 or higher */ +#define McuArmTools_ResetCycleCounter() \ + McuArmTools_DWT_CYCCNT = 0 + /*!< Reset cycle counter */ +/* +** =================================================================== +** Method : ResetCycleCounter (component KinetisTools) +** +** Description : +** Reset the cycle counter (set it to zero) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +#endif + +#if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M && McuLib_CONFIG_CORTEX_M>=3 /* only for Cortex-M3 or higher */ +#define McuArmTools_EnableCycleCounter() \ + McuArmTools_DWT_CONTROL |= McuArmTools_DWT_CYCCNTENA_BIT + /*!< Enable cycle counter */ +/* +** =================================================================== +** Method : EnableCycleCounter (component KinetisTools) +** +** Description : +** Enables counting the cycles. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +#endif + +#if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M && McuLib_CONFIG_CORTEX_M>=3 /* only for Cortex-M3 or higher */ +#define McuArmTools_DisableCycleCounter() \ + McuArmTools_DWT_CONTROL &= ~McuArmTools_DWT_CYCCNTENA_BIT + /*!< Disable cycle counter */ +/* +** =================================================================== +** Method : DisableCycleCounter (component KinetisTools) +** +** Description : +** Disables the cycle counter. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +#endif + +#if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M && McuLib_CONFIG_CORTEX_M>=3 /* only for Cortex-M3 or higher */ +#define McuArmTools_GetCycleCounter() \ + McuArmTools_DWT_CYCCNT + /*!< Read cycle counter register */ +/* +** =================================================================== +** Method : GetCycleCounter (component KinetisTools) +** +** Description : +** Return the current cycle counter value +** Parameters : None +** Returns : +** --- - cycle counter +** =================================================================== +*/ +#endif + +void McuArmTools_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component KinetisTools) +** +** Description : +** Driver de-initialization routine +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuArmTools_Init(void); +/* +** =================================================================== +** Method : Init (component KinetisTools) +** +** Description : +** Driver initialization routine +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +uint32_t McuArmTools_GetUsedMainStackSpace(void); +/* +** =================================================================== +** Method : GetUsedMainStackSpace (component KinetisTools) +** +** Description : +** Returns the used main stack space, based on the overwritten +** checking pattern. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint32_t McuArmTools_GetUnusedMainStackSpace(void); +/* +** =================================================================== +** Method : GetUnusedMainStackSpace (component KinetisTools) +** +** Description : +** Calculates the unused stack space, based on the checking +** pattern. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuArmTools_FillMainStackSpace(void); +/* +** =================================================================== +** Method : FillMainStackSpace (component KinetisTools) +** +** Description : +** Fill the stack space with the checking pattern, up to the +** current MSP. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +uint32_t McuArmTools_GetLinkerMainStackSize(void); +/* +** =================================================================== +** Method : GetLinkerMainStackSize (component KinetisTools) +** +** Description : +** Returns the size of the main (MSP) stack size, using linker +** symbols for top (higher address) and base (lower address). +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +McuArmTools_uint32_t_Ptr McuArmTools_GetLinkerMainStackTop(void); +/* +** =================================================================== +** Method : GetLinkerMainStackTop (component KinetisTools) +** +** Description : +** Return the stack top, as set in the linker file. The stack +** grows from the top (higher address) to the base (lower +** address). +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +McuArmTools_uint32_t_Ptr McuArmTools_GetLinkerMainStackBase(void); +/* +** =================================================================== +** Method : GetLinkerMainStackBase (component KinetisTools) +** +** Description : +** Return the stack bottom, as configured in the linker file. +** The stack grows from the top (higher address) to the base +** (lower address). +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +/* END McuArmTools. */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif +/* ifndef __McuArmTools_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuButton.c b/TSM_PicoW_Sensor/McuLib/src/McuButton.c new file mode 100644 index 0000000..9ede1b4 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuButton.c @@ -0,0 +1,131 @@ +/* + * McuButton.c + * + * Copyright (c) 2019-2021, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuLibconfig.h" +#include "McuButton.h" +#include "McuUtility.h" +#include /* memcpy */ +#include /* memset */ +#include +#if MCUBUTTON_CONFIG_USE_FREERTOS_HEAP + #include "McuRTOS.h" +#endif + +/* default configuration, used for initializing the config */ +static const McuBtn_Config_t defaultConfig = +{ + .isLowActive = true, + .hw = { + #if McuLib_CONFIG_NXP_SDK_USED && !McuLib_CONFIG_IS_KINETIS_KE + .gpio = NULL, + #elif McuLib_CONFIG_CPU_IS_STM32 + .gpio = NULL, + #endif + #if McuLib_CONFIG_CPU_IS_KINETIS + .port = NULL, + #elif McuLib_CONFIG_CPU_IS_LPC + .port = 0, + #endif + #if McuLib_CONFIG_CPU_IS_ESP32 + .pin = GPIO_NUM_NC, + #else + .pin = 0, + #endif + } +}; + +typedef struct { + bool isLowActive; + McuGPIO_Handle_t gpio; +} McuBtn_t; + +void McuBtn_GetDefaultConfig(McuBtn_Config_t *config) { + assert(config!=NULL); + memcpy(config, &defaultConfig, sizeof(*config)); +} + +void McuBtn_DisablePullResistor(McuBtn_Handle_t btn) { + McuBtn_t *button; + + button = (McuBtn_t*)btn; + McuGPIO_SetPullResistor(button->gpio, McuGPIO_PULL_DISABLE); +} + +void McuBtn_EnablePullResistor(McuBtn_Handle_t btn) { + McuBtn_t *button; + + button = (McuBtn_t*)btn; + if (button->isLowActive) { + McuGPIO_SetPullResistor(button->gpio, McuGPIO_PULL_UP); + } else { + McuGPIO_SetPullResistor(button->gpio, McuGPIO_PULL_DOWN); + } +} + +bool McuBtn_IsOn(McuBtn_Handle_t btn) { + McuBtn_t *button; + + assert(btn!=NULL); + button = (McuBtn_t*)btn; + if (button->isLowActive) { + return McuGPIO_IsLow(button->gpio); + } else { + return McuGPIO_IsHigh(button->gpio); + } +} + +void McuBtn_GetPinStatusString(McuBtn_Handle_t btn, unsigned char *buf, size_t bufSize) { + McuBtn_t *button; + + button = (McuBtn_t*)btn; + buf[0] = '\0'; + McuGPIO_GetPinStatusString(button->gpio, buf, bufSize); + if (button->isLowActive) { + McuUtility_strcat(buf, bufSize, (unsigned char*)" active:L"); + } else { + McuUtility_strcat(buf, bufSize, (unsigned char*)" active:H"); + } +} + +McuBtn_Handle_t McuBtn_InitButton(McuBtn_Config_t *config) { + McuBtn_t *handle; + McuGPIO_Config_t gpioConfig; + assert(config!=NULL); + +#if MCUBUTTON_CONFIG_USE_FREERTOS_HEAP + handle = (McuBtn_t*)pvPortMalloc(sizeof(McuBtn_t)); /* get a new device descriptor */ +#else + handle = (McuBtn_t*)malloc(sizeof(McuBtn_t)); /* get a new device descriptor */ +#endif + assert(handle!=NULL); + if (handle!=NULL) { /* if malloc failed, will return NULL pointer */ + memset(handle, 0, sizeof(McuBtn_t)); /* init all fields */ + handle->isLowActive = config->isLowActive; + /* create GPIO pin */ + McuGPIO_GetDefaultConfig(&gpioConfig); + gpioConfig.isInput = true; + memcpy(&gpioConfig.hw, &config->hw, sizeof(gpioConfig.hw)); /* copy hardware information */ + handle->gpio = McuGPIO_InitGPIO(&gpioConfig); + } + return (McuBtn_Handle_t)handle; +} + +McuBtn_Handle_t McuBtn_DeinitButton(McuBtn_Handle_t button) { + assert(button!=NULL); +#if MCUBUTTON_CONFIG_USE_FREERTOS_HEAP + vPortFree(button); +#else + free(button); +#endif + return NULL; +} + +void McuBtn_Deinit(void) { +} + +void McuBtn_Init(void) { +} diff --git a/TSM_PicoW_Sensor/McuLib/src/McuButton.h b/TSM_PicoW_Sensor/McuLib/src/McuButton.h new file mode 100644 index 0000000..235f3ea --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuButton.h @@ -0,0 +1,51 @@ +/* + * McuButton.h + * + * Copyright (c) 2019-2021, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MCUBUTTON_H_ +#define MCUBUTTON_H_ + +#include "McuButtonconfig.h" +#include +#include +#include "McuLib.h" +#include "McuGPIO.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct McuButton_Dummy_s { int dummy; } McuButton_Dummy_s; /*!< using a pointer to a struct instead a pointer to void for handle, used for handle type 'safety' only */ + +typedef McuButton_Dummy_s *McuBtn_Handle_t; /*!< Button handle type */ + +typedef struct { + bool isLowActive; /* default: true */ + McuGPIO_HwPin_t hw; +} McuBtn_Config_t; + +void McuBtn_GetDefaultConfig(McuBtn_Config_t *config); + +McuBtn_Handle_t McuBtn_InitButton(McuBtn_Config_t *config); + +McuBtn_Handle_t McuBtn_DeinitButton(McuBtn_Handle_t button); + +void McuBtn_DisablePullResistor(McuBtn_Handle_t btn); +void McuBtn_EnablePullResistor(McuBtn_Handle_t btn); + +bool McuBtn_IsOn(McuBtn_Handle_t btn); + +void McuBtn_GetPinStatusString(McuBtn_Handle_t btn, unsigned char *buf, size_t bufSize); + +void McuBtn_Deinit(void); + +void McuBtn_Init(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MCUBUTTON_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuCRC_CreateTable.c b/TSM_PicoW_Sensor/McuLib/src/McuCRC_CreateTable.c new file mode 100644 index 0000000..a516328 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuCRC_CreateTable.c @@ -0,0 +1,177 @@ +/** +* Copyright Ivo Gärtner +* \file +* \author Ivo Gärtner +* \copyright Ivo Gärtner +* \date 9.11.2018 +* SPDX-License-Identifier: BSD-3-Clause +* See the header file for comments +*/ + +#include +#include +#include +#include + +#include "McuCRC_CreateTable.h" +#include "McuCRC_Generator.h" + +enum McuCRC_GenerateTableResult McuCRC_GenerateLookUpTable( McuCRC_Generator_t *crcGen ) +{ + char *formatString; + uint32_t valuesPerLine_u32, loopCounter_u32, tableEntry_u32; + FILE *outputFile; + + char formatString8[] = "0x%02X"; + char formatString16[] = "0x%04X"; + char formatString32[] = "0x%08X"; + + if ( (crcGen->McuCRC_Width != 8) && (crcGen->McuCRC_Width != 16) && (crcGen->McuCRC_Width != 32) ) + { + return McuCRC_TABLE_ERR_WIDTH; + } + + if ( ((crcGen->McuCRC_ReflectedInput == 0) && (crcGen->McuCRC_ReflectedOutput != 0)) || + ((crcGen->McuCRC_ReflectedInput != 0) && (crcGen->McuCRC_ReflectedOutput == 0)) ) + { + return McuCRC_TABLE_ERR_REFLECTED_INPUT_OUTPUT_NOT_IDENTICAL; + } + + if ( (crcGen->McuCRC_Width == 8) && ( (crcGen->McuCRC_Polynomial & 0xFFFFFF00) != 0) ) + { + return McuCRC_TABLE_ERR_POLYNOMIAL_TOO_LARGE_FOR_16BIT_TABLE; + } + if ( (crcGen->McuCRC_Width == 8) && ( (crcGen->McuCRC_XorOutput & 0xFFFFFF00) != 0) ) + { + return McuCRC_TABLE_ERR_XOR_OUT_TOO_LARGE_FOR_16BIT_TABLE; + } + + if ( (crcGen->McuCRC_Width == 16) && ( (crcGen->McuCRC_Polynomial & 0xFFFF0000) != 0) ) + { + return McuCRC_TABLE_ERR_POLYNOMIAL_TOO_LARGE_FOR_16BIT_TABLE; + } + if ( (crcGen->McuCRC_Width == 16) && ( (crcGen->McuCRC_XorOutput & 0xFFFF0000) != 0) ) + { + return McuCRC_TABLE_ERR_XOR_OUT_TOO_LARGE_FOR_16BIT_TABLE; + } + + outputFile = fopen( McuCRC_FILENAME, "w" ); + + if ( outputFile == NULL ) + { + return McuCRC_TABLE_ERR_FILE_OPEN; + } + + fprintf(outputFile, "/*****************************************************************/\n"); + fprintf(outputFile, "/* */\n"); + fprintf(outputFile, "/* CRC LOOKUP TABLE */\n"); + fprintf(outputFile, "/* ================ */\n"); + fprintf(outputFile, "/* The following CRC lookup table was generated using program */\n"); + fprintf(outputFile, "/* code which is inspired by Ross Williams' article */\n"); + fprintf(outputFile, "/* \"A Painless Guide to CRC Error Detection Algorithms\". */\n"); + fprintf(outputFile, "/* */\n"); + fprintf(outputFile, "/* The following parameters were used: */\n"); + fprintf(outputFile, "/* */\n"); + fprintf(outputFile, "/* Width : %u bits */\n", + crcGen->McuCRC_Width); + if ( crcGen->McuCRC_Width == 32 ){ + fprintf(outputFile, "/* Polynomial : 0x%08X */\n", + (unsigned int)crcGen->McuCRC_Polynomial);} + else if ( crcGen->McuCRC_Width == 16 ) { + fprintf(outputFile, "/* Polynomial : 0x%04X */\n", + (unsigned int)crcGen->McuCRC_Polynomial);} + else { + fprintf(outputFile, "/* Polynomial : 0x%02X */\n", + (unsigned int)crcGen->McuCRC_Polynomial); + } + if (crcGen->McuCRC_ReflectedInput == 1){ + fprintf(outputFile, "/* Reflected Input : TRUE */\n");} + else { + fprintf(outputFile, "/* Reflected Input : FALSE */\n");} + if (crcGen->McuCRC_ReflectedOutput == 1){ + fprintf(outputFile, "/* Reflected Output : TRUE */\n");} + else { + fprintf(outputFile, "/* Reflected Output : FALSE */\n");} + fprintf(outputFile, "/* */\n"); + fprintf(outputFile, "/*****************************************************************/\n"); + fprintf(outputFile, "\n"); + + if ( crcGen->McuCRC_Width == 32 ){ + fprintf(outputFile, "uint32_t McuCRC_Table[%d] = \n{\n", McuCRC_TABLE_SIZE); + formatString = formatString32; + valuesPerLine_u32 = 4; + } + else if ( crcGen->McuCRC_Width == 16 ){ + fprintf(outputFile, "uint16_t McuCRC_Table[%d] = \n{\n", McuCRC_TABLE_SIZE); + formatString = formatString16; + valuesPerLine_u32 = 8; + } + else { + fprintf(outputFile, "uint8_t McuCRC_Table[%d] = \n{\n", McuCRC_TABLE_SIZE); + formatString = formatString8; + valuesPerLine_u32 = 12; + } + + for ( loopCounter_u32 = 0 ; loopCounter_u32 < McuCRC_TABLE_SIZE ; loopCounter_u32++ ) + { + fprintf(outputFile, " "); + tableEntry_u32 = (uint32_t)McuCRC_CalculateTableEntry( crcGen, loopCounter_u32 ); + fprintf(outputFile, formatString, tableEntry_u32 ); + if ( loopCounter_u32 != (McuCRC_TABLE_SIZE - 1) ) + { + fprintf(outputFile, " , "); + } + if ( ((loopCounter_u32 + 1) % valuesPerLine_u32) == 0 ) + { + fprintf(outputFile, "\n"); + } + } + fprintf(outputFile, "};\n"); + + fprintf(outputFile, "\n"); + fprintf(outputFile, "/*****************************************************************/\n"); + fprintf(outputFile, "/* END OF THE CRC LOOKUP TABLE */\n"); + fprintf(outputFile, "/*****************************************************************/\n"); + + if ( fclose( outputFile ) != 0 ) + { + return McuCRC_TABLE_ERR_FILE_CLOSE; + } + + return McuCRC_TABLE_OK; +} + +uint32_t McuCRC_CalculateTableEntry ( McuCRC_Generator_t *crcGen, uint32_t index_u32 ) +{ + uint32_t loopCounter_u32; + uint32_t tableEntry_u32; + uint32_t topbit_u32 = ( 1 << (crcGen->McuCRC_Width - 1) ); + uint32_t inbyte_u32 = (uint32_t) index_u32; + + if ( crcGen->McuCRC_ReflectedInput ) + { + inbyte_u32 = McuCRC_Reflect( inbyte_u32, McuCRC_BIT_PER_BYTE ); + } + tableEntry_u32 = inbyte_u32 << ( crcGen->McuCRC_Width - McuCRC_BIT_PER_BYTE ); + + for ( loopCounter_u32 = 0; loopCounter_u32 < McuCRC_BIT_PER_BYTE ; loopCounter_u32++) + { + if ( tableEntry_u32 & topbit_u32 ) + { + tableEntry_u32 = (tableEntry_u32 << 1) ^ crcGen->McuCRC_Polynomial; + } + else + { + tableEntry_u32 = (tableEntry_u32 << 1); + } + } + + if ( crcGen->McuCRC_ReflectedOutput ) + { + tableEntry_u32 = McuCRC_Reflect( tableEntry_u32, crcGen->McuCRC_Width ); + } + + tableEntry_u32 &= crcGen->McuCRC_WidthMask; + + return tableEntry_u32; +} diff --git a/TSM_PicoW_Sensor/McuLib/src/McuCRC_CreateTable.h b/TSM_PicoW_Sensor/McuLib/src/McuCRC_CreateTable.h new file mode 100644 index 0000000..a54acfa --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuCRC_CreateTable.h @@ -0,0 +1,110 @@ +/** +* Copyright Ivo Gärtner +* \file +* \author Ivo Gärtner +* \copyright Ivo Gärtner +* \date 9.11.2018 +* SPDX-License-Identifier: BSD-3-Clause +* +* This program code does very closely rely on the example code +* of Ross Williams' article "A Painless Guide to CRC Error +* Detection Algorithms". +* +* How to use this code: +* +* These functions are only used to create a LUT for the CRC +* calculation. They are not meant to be executed on a MCU +* since they use stdlib.h and stdio.h +* +* First: Define the McuCRC_Generator_t structure, e.g. like this: +* +* McuCRC_Generator_t crcGen; +* crcGen.McuCRC_InitialValue = 0xFFFFFFFF; +* crcGen.McuCRC_Polynomial = 0x04C11DB7; +* crcGen.McuCRC_ReflectedInput = 0; +* crcGen.McuCRC_ReflectedOutput = 0; +* crcGen.McuCRC_Width = McuCRC_WIDTH_32_BIT; +* crcGen.McuCRC_XorOutput = 0xFFFFFFFF; +* crcGen.McuCRC_Table = NULL; +* +* Second: Run the McuCRC_Init function on the McuCRC_Generator_t structure: +* +* McuCRC_Init( &crcGen ); +* +* Third: Run the McuCRC_GenerateLookUpTable function on the McuCRC_Generator_t structure: +* +* McuCRC_GenerateLookUpTable( &crcGen ); +* +* This will create a file named as defined in McuCRC_FILENAME on your hard drive. +* +* Fourth: Copy the LUT declaration into your code and assign a pointer to the LUT +* to the McuCRC_Generator_t structure: +* +* crcGen.McuCRC_Table = (void*)McuCRC_Table; +* +* Now you can calculate crc's by using the function McuCRC_CalculateWithTableCRC32 or +* McuCRC_CalculateWithTableCRC16 if you calculated a 16 bit crc LUT, like this: +* +* uint8_t byteArray[] = {0x01, 0x01, 0x12, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5}; +* crc = McuCRC_CalculateWithTableCRC32( &crcGen, byteArray, 8 ); +* +* happy crc'ing +*/ + + +#ifndef McuCRC_CREATETABLE_H_INCLUDED +#define McuCRC_CREATETABLE_H_INCLUDED + +#include +#include +#include "McuCRC_Generator.h" + +#define McuCRC_TABLE_SIZE 256 + +#define McuCRC_FILENAME "CrcTable.txt" + + +enum McuCRC_GenerateTableResult +{ + McuCRC_TABLE_OK, + McuCRC_TABLE_ERR_WIDTH, + McuCRC_TABLE_ERR_REFLECTED_INPUT_OUTPUT_NOT_IDENTICAL, + McuCRC_TABLE_ERR_POLYNOMIAL_TOO_LARGE_FOR_8BIT_TABLE, + McuCRC_TABLE_ERR_XOR_OUT_TOO_LARGE_FOR_8BIT_TABLE, + McuCRC_TABLE_ERR_POLYNOMIAL_TOO_LARGE_FOR_16BIT_TABLE, + McuCRC_TABLE_ERR_XOR_OUT_TOO_LARGE_FOR_16BIT_TABLE, + McuCRC_TABLE_ERR_FILE_OPEN, + McuCRC_TABLE_ERR_FILE_CLOSE +}; + +/** +* \fn McuCRC_GenerateLookUpTable() +* +* \brief Calculates the LUT entries and writes it into a file +* +* This function needs the \a McuCRC_Generator_t structure to be fully defined. +* Be aware that input and output reflection MUST BE THE SAME to create a +* table (I've seen no standard CRC which has them mixed). +* If you want to have input and output reflection not identical, you should +* use the shift register implementation! +* +* The XorOut parameter does not have any impact, since the Xor'ing of the +* output is calculated within the +* +* \param McuCRC_Generator_t *crcGen Pointer to a \a McuCRC_Generator_t structure +* \return McuCRC_GenerateTableResult Result of the crc table generation as described in \a McuCRC_GenerateTableResult +*/ +enum McuCRC_GenerateTableResult McuCRC_GenerateLookUpTable( McuCRC_Generator_t *crcGen ); + +/** +* \fn McuCRC_CalculateTableEntry() +* +* \brief Calculates an entry for the LUT at a specific index +* +* \param McuCRC_Generator_t *crcGen Pointer to a \a McuCRC_Generator_t structure +* \param uint32_t index_u32 Index of the table entry +* \return Table entry as uint32_t +*/ +uint32_t McuCRC_CalculateTableEntry ( McuCRC_Generator_t *crcGen, uint32_t index_u32 ); + +#endif // McuCRC_CREATETABLE_H_INCLUDED diff --git a/TSM_PicoW_Sensor/McuLib/src/McuCRC_Generator.c b/TSM_PicoW_Sensor/McuLib/src/McuCRC_Generator.c new file mode 100644 index 0000000..fc1bf11 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuCRC_Generator.c @@ -0,0 +1,174 @@ +/** +* Copyright Ivo Gärtner +* \file +* \author Ivo Gärtner +* \copyright Ivo Gärtner +* \date 9.11.2018 +* SPDX-License-Identifier: BSD-3-Clause +* +* See the header file for comments +*/ + +#include +#include + +#include "McuCRC_Generator.h" + +void McuCRC_Init (McuCRC_Generator_t *crcGen) +{ + crcGen->McuCRC_Register = crcGen->McuCRC_InitialValue; + crcGen->McuCRC_WidthMask = ( ( (1 << ( crcGen->McuCRC_Width - 1 ) ) - 1 ) << 1) | 1; +} + +void McuCRC_CalculateBlock (McuCRC_Generator_t *crcGen, uint8_t *data_pu8, size_t length ) +{ + uint8_t inputData_u8; + while ( length-- ) + { + inputData_u8 = *data_pu8++; + McuCRC_CalculateNextValue( crcGen, inputData_u8 ); + } +} + +void McuCRC_CalculateNextValue ( McuCRC_Generator_t *crcGen, uint8_t data_u8 ) +{ + uint32_t loopCounter_u32; + uint32_t uData_u32; + uint32_t topbit_u32; + + uData_u32 = data_u8; + topbit_u32 = ( 1 << (crcGen->McuCRC_Width-1)); + + if ( crcGen->McuCRC_ReflectedInput ) + { + uData_u32 = McuCRC_Reflect( uData_u32, McuCRC_BIT_PER_BYTE ); + } + crcGen->McuCRC_Register ^= (uData_u32 << (crcGen->McuCRC_Width - McuCRC_BIT_PER_BYTE)); + + for ( loopCounter_u32 = 0; loopCounter_u32 < McuCRC_BIT_PER_BYTE; loopCounter_u32++) + { + if (crcGen->McuCRC_Register & topbit_u32) + { + crcGen->McuCRC_Register = (crcGen->McuCRC_Register << 1) ^ crcGen->McuCRC_Polynomial; + } + else + { + crcGen->McuCRC_Register = (crcGen->McuCRC_Register << 1); + } + crcGen->McuCRC_Register &= crcGen->McuCRC_WidthMask; + } +} + +uint32_t McuCRC_GetCrcValue ( McuCRC_Generator_t *crcGen ) +{ + if (crcGen->McuCRC_ReflectedOutput) + { + return crcGen->McuCRC_XorOutput ^ McuCRC_Reflect( crcGen->McuCRC_Register, crcGen->McuCRC_Width ); + } + else + { + return crcGen->McuCRC_XorOutput ^ crcGen->McuCRC_Register; + } +} + +uint8_t McuCRC_CalculateWithTableCRC8 ( McuCRC_Generator_t *crcGen, uint8_t *data_pu8, size_t length ) +{ + uint32_t loopCounter_u32; + uint8_t crcValue_u8; + uint8_t *crcTable_au8; + + crcTable_au8 = (uint8_t*)crcGen->McuCRC_Table; + + crcValue_u8 = crcGen->McuCRC_InitialValue; + + for ( loopCounter_u32 = 0 ; loopCounter_u32 < length ; loopCounter_u32++ ) + { + crcValue_u8 = crcTable_au8[( crcValue_u8 ^ (data_pu8[loopCounter_u32])) & 0xFF]; + } + + crcValue_u8 ^= crcGen->McuCRC_XorOutput; + + return crcValue_u8; +} + +uint16_t McuCRC_CalculateWithTableCRC16 ( McuCRC_Generator_t *crcGen, uint8_t *data_pu8, size_t length ) +{ + uint32_t loopCounter_u32; + uint16_t crcValue_u16; + uint16_t *crcTable_au16; + + crcTable_au16 = (uint16_t*)crcGen->McuCRC_Table; + + crcValue_u16 = crcGen->McuCRC_InitialValue; + + if ( (crcGen->McuCRC_ReflectedInput == 0) && (crcGen->McuCRC_ReflectedOutput == 0) ) + { + for ( loopCounter_u32 = 0 ; loopCounter_u32 < length ; loopCounter_u32++ ) + { + crcValue_u16 = crcTable_au16[((crcValue_u16 >> 8) ^ (data_pu8[loopCounter_u32])) & 0xFF] ^ (crcValue_u16 << McuCRC_BIT_PER_BYTE); + } + } + else if ( (crcGen->McuCRC_ReflectedInput == 1) && (crcGen->McuCRC_ReflectedOutput == 1) ) + { + for ( loopCounter_u32 = 0 ; loopCounter_u32 < length ; loopCounter_u32++ ) + { + crcValue_u16 = crcTable_au16[(crcValue_u16 ^ (data_pu8[loopCounter_u32])) & 0xFF] ^ (crcValue_u16 >> McuCRC_BIT_PER_BYTE); + } + } + + crcValue_u16 ^= crcGen->McuCRC_XorOutput; + + return crcValue_u16; +} + +uint32_t McuCRC_CalculateWithTableCRC32 ( McuCRC_Generator_t *crcGen, uint8_t *data_pu8, size_t length ) +{ + uint32_t loopCounter_u32; + uint32_t crcValue_u32; + uint32_t *crcTable_au32; + + crcTable_au32 = (uint32_t*)crcGen->McuCRC_Table; + + crcValue_u32 = crcGen->McuCRC_InitialValue; + + if ( (crcGen->McuCRC_ReflectedInput == 0) && (crcGen->McuCRC_ReflectedOutput == 0) ) + { + for ( loopCounter_u32 = 0 ; loopCounter_u32 < length ; loopCounter_u32++ ) + { + crcValue_u32 = crcTable_au32[((crcValue_u32 >> 24) ^ (data_pu8[loopCounter_u32])) & 0xFF] ^ (crcValue_u32 << McuCRC_BIT_PER_BYTE); + } + } + else if ( (crcGen->McuCRC_ReflectedInput == 1) && (crcGen->McuCRC_ReflectedOutput == 1) ) + { + for ( loopCounter_u32 = 0 ; loopCounter_u32 < length ; loopCounter_u32++ ) + { + crcValue_u32 = crcTable_au32[(crcValue_u32 ^ (data_pu8[loopCounter_u32])) & 0xFF] ^ (crcValue_u32 >> McuCRC_BIT_PER_BYTE); + } + } + + crcValue_u32 ^= crcGen->McuCRC_XorOutput; + + return crcValue_u32; +} + +uint32_t McuCRC_Reflect ( uint32_t value_u32, uint32_t noOfBits_u32) +{ + uint32_t loopCounter_u32, temp_u32; + + temp_u32 = value_u32; + for ( loopCounter_u32 = 0 ; loopCounter_u32 < noOfBits_u32 ; loopCounter_u32++ ) + { + if (temp_u32 & 1) + { + value_u32 |= ( 1 << ( (noOfBits_u32 - 1) - loopCounter_u32 ) ); + } + else + { + value_u32 &= ~( 1 << ( (noOfBits_u32 - 1) - loopCounter_u32 ) ); + } + temp_u32 = (temp_u32 >> 1); + } + return value_u32; +} + + diff --git a/TSM_PicoW_Sensor/McuLib/src/McuCRC_Generator.h b/TSM_PicoW_Sensor/McuLib/src/McuCRC_Generator.h new file mode 100644 index 0000000..a727e91 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuCRC_Generator.h @@ -0,0 +1,173 @@ +/** +* Copyright Ivo Gärtner +* \file +* \author Ivo Gärtner +* \copyright Ivo Gärtner +* \date 9.11.2018 +* SPDX-License-Identifier: BSD-3-Clause +* +* This program code does very closely rely on the example code +* of Ross Williams' article "A Painless Guide to CRC Error +* Detection Algorithms". +* +* +* How to use this code: +* +* First: Define the McuCRC_Generator_t structure, e.g. like this: +* +* McuCRC_Generator_t crcGen; +* crcGen.McuCRC_InitialValue = 0xFFFFFFFF; +* crcGen.McuCRC_Polynomial = 0x04C11DB7; +* crcGen.McuCRC_ReflectedInput = 0; +* crcGen.McuCRC_ReflectedOutput = 0; +* crcGen.McuCRC_Width = McuCRC_WIDTH_32_BIT; +* crcGen.McuCRC_XorOutput = 0xFFFFFFFF; +* crcGen.McuCRC_Table = NULL; +* +* Second: Run the McuCRC_Init function on the McuCRC_Generator_t structure: +* +* McuCRC_Init( &crcGen ); +* +* Third: For the shift register implementation call McuCRC_CalculateBlock() and then McuCRC_GetCrcValue(), e.g. like this: +* +* uint32_t crc; +* uint8_t byteArray[] = {0x01, 0x01, 0x12, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5}; +* +* McuCRC_CalculateBlock( &crcGen, byteArray, 8 ); +* crc = McuCRC_GetCrcValue( &crcGen ); +* +* Or for the LUT implementation call McuCRC_CalculateWithTableCRC32(), or the 8 / 16 bit versions of it, like this: +* +* crc = McuCRC_CalculateWithTableCRC8( &crcGen, byteArray, 8 ); +* +* +* happy crc'ing +*/ + +#ifndef McuCRC_GENERATOR_H_INCLUDED +#define McuCRC_GENERATOR_H_INCLUDED + +#include +#include + +#define McuCRC_BIT_PER_BYTE 8 + +enum McuCRC_WIDTH_BITS +{ + McuCRC_WIDTH_8_BIT = 8, + McuCRC_WIDTH_16_BIT = 16, + McuCRC_WIDTH_32_BIT = 32 +}; + +typedef struct + { + enum McuCRC_WIDTH_BITS McuCRC_Width; /**< PARAMETER: Width of the CRC in bits - 16 or 32 */ + uint32_t McuCRC_Polynomial; /**< PARAMETER: The CRC algorithm's polynomial */ + uint32_t McuCRC_InitialValue; /**< PARAMETER: Initial register value */ + uint32_t McuCRC_ReflectedInput; /**< PARAMETER: Reflect input - 0: no, >=1: yes */ + uint32_t McuCRC_ReflectedOutput; /**< PARAMETER: Reflect output - 0: no, >=1: yes */ + uint32_t McuCRC_XorOutput; /**< PARAMETER: XOR this to the output of the CRC calculation */ + uint32_t McuCRC_WidthMask; /**< CONTEXT: Mask for the crc width */ + uint32_t McuCRC_Register; /**< CONTEXT: Storage for the crc value */ + void *McuCRC_Table; /**< PARAMETER: Pointer to a LUT if no shift register implementation is used */ + } McuCRC_Generator_t; + +/** +* \fn McuCRC_Init() +* +* \brief Sets the initial value of the crc calculation and calculates the width mask +* +* \param McuCRC_Generator_t *crcGen Pointer to a \a McuCRC_Generator_t structure +*/ +void McuCRC_Init ( McuCRC_Generator_t *crcGen ); + +/** +* \fn McuCRC_CalculateBlock() +* +* \brief Calculates a crc from a block of data (uint8_t array) +* +* This function calculates the crc but does not Xor the output. To get the +* Xor'd output use the function \a McuCRC_GetCrcValue() which returns the Xor'd +* crc value. +* +* \param McuCRC_Generator_t *crcGen Pointer to a \a McuCRC_Generator_t structure +* \param uint8_t *data_pu8 Pointer to the data to be crc'd +* \param size_t length Number of bytes in the data array +*/ +void McuCRC_CalculateBlock (McuCRC_Generator_t *crcGen, uint8_t *data_pu8, size_t length ); + +/** +* \fn McuCRC_CalculateNextValue() +* +* \brief Calculates the crc of one byte in a data stream +* +* \param McuCRC_Generator_t *crcGen Pointer to a \a McuCRC_Generator_t structure +* \param uint8_t data_u8 Byte to be crc'd +* +*/ +void McuCRC_CalculateNextValue ( McuCRC_Generator_t *crcGen, uint8_t data_u8 ); + +/** +* \fn McuCRC_GetCrcValue() +* +* \brief Returns you the Xor'd crc +* +* When you ran the functions \a McuCRC_CalculateBlock or \a McuCRC_CalculateNextValue over +* the data which you want to CRC, this function Xor's the calculated crc and returns +* this Xor'd value. +* +* \param McuCRC_Generator_t *crcGen Pointer to a \a McuCRC_Generator_t structure +* \return The value in crcGen->McuCRC_Register XOR^d with the crcGen->McuCRC_XorOut parameter +*/ +uint32_t McuCRC_GetCrcValue ( McuCRC_Generator_t *crcGen ); + +/** +* \fn McuCRC_CalculateWithTableCRC32() +* +* \brief Calculates a 32 bit crc of a byte array using a LUT +* +* The LUT used for this function can be calculated using the function \a McuCRC_GenerateLookUpTable() +* The pointer the LUT has to be casted to (void*) +* +* \param McuCRC_Generator_t *crcGen Pointer to a \a McuCRC_Generator_t structure +* \return The calculated crc, XOR^d with the crcGen->McuCRC_XorOut parameter +*/ +uint32_t McuCRC_CalculateWithTableCRC32 ( McuCRC_Generator_t *crcGen, uint8_t *data_pu8, size_t length ); + +/** +* \fn McuCRC_CalculateWithTableCRC16() +* +* \brief Calculates a 16 bit crc of a byte array using a LUT +* +* The LUT used for this function can be calculated using the function \a McuCRC_GenerateLookUpTable() +* The pointer the LUT has to be casted to (void*) +* +* \param McuCRC_Generator_t *crcGen Pointer to a \a McuCRC_Generator_t structure +* \return The calculated crc, XOR^d with the crcGen->McuCRC_XorOut parameter +*/ +uint16_t McuCRC_CalculateWithTableCRC16 ( McuCRC_Generator_t *crcGen, uint8_t *data_pu8, size_t length ); + +/** +* \fn McuCRC_CalculateWithTableCRC8() +* +* \brief Calculates a 8 bit crc of a byte array using a LUT +* +* The LUT used for this function can be calculated using the function \a McuCRC_GenerateLookUpTable() +* The pointer the LUT has to be casted to (void*) +* +* \param McuCRC_Generator_t *crcGen Pointer to a \a McuCRC_Generator_t structure +* \return The calculated crc, XOR^d with the crcGen->McuCRC_XorOut parameter +*/ +uint8_t McuCRC_CalculateWithTableCRC8 ( McuCRC_Generator_t *crcGen, uint8_t *data_pu8, size_t length ); + +/** +* \fn McuCRC_Reflect() +* +* \brief Returns the bottom \a noOfBits_u32 bits of \a value_u32 in revered order +* +* \param uint32_t value_u32 Value on which to perform the bit reversal +* \param uint32_t noOfBits_u32 Number of bits to reverse +*/ +uint32_t McuCRC_Reflect ( uint32_t value_u32, uint32_t noOfBits_u32); + +#endif // McuCRC_GENERATOR_H_INCLUDED diff --git a/TSM_PicoW_Sensor/McuLib/src/McuCRC_readme.txt b/TSM_PicoW_Sensor/McuLib/src/McuCRC_readme.txt new file mode 100644 index 0000000..c241baf --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuCRC_readme.txt @@ -0,0 +1,59 @@ +SPDX-License-Identifier: BSD-3-Clause +This file contains common CRC algorithm configurations +The value "Check" is the reference output if the ASCII string "123456789" is CRC'd + +Common 8 bit CRC's + +Algorithm Check Poly Init RefIn RefOut XorOut +CRC-8 0xF4 0x07 0x00 false false 0x00 +CRC-8/CDMA2000 0xDA 0x9B 0xFF false false 0x00 +CRC-8/DARC 0x15 0x39 0x00 true true 0x00 +CRC-8/DVB-S2 0xBC 0xD5 0x00 false false 0x00 +CRC-8/EBU 0x97 0x1D 0xFF true true 0x00 +CRC-8/I-CODE 0x7E 0x1D 0xFD false false 0x00 +CRC-8/ITU 0xA1 0x07 0x00 false false 0x55 +CRC-8/MAXIM 0xA1 0x31 0x00 true true 0x00 +CRC-8/ROHC 0xD0 0x07 0xFF true true 0x00 +CRC-8/WCDMA 0x25 0x9B 0x00 true true 0x00 + + +Common 16 bit CRC's + +Algorithm Check Poly Init RefIn RefOut XorOut +CRC-16/CCITT-FALSE 0x29B1 0x1021 0xFFFF false false 0x0000 +CRC-16/ARC 0xBB3D 0x8005 0x0000 true true 0x0000 +CRC-16/AUG-CCITT 0xE5CC 0x1021 0x1D0F false false 0x0000 +CRC-16/BUYPASS 0xFEE8 0x8005 0x0000 false false 0x0000 +CRC-16/CDMA2000 0x4C06 0xC867 0xFFFF false false 0x0000 +CRC-16/DDS-110 0x9ECF 0x8005 0x800D false false 0x0000 +CRC-16/DECT-R 0x007E 0x0589 0x0000 false false 0x0001 +CRC-16/DECT-X 0x007F 0x0589 0x0000 false false 0x0000 +CRC-16/DNP 0xEA82 0x3D65 0x0000 true true 0xFFFF +CRC-16/EN-13757 0xC2B7 0x3D65 0x0000 false false 0xFFFF +CRC-16/GENIBUS 0xD64E 0x1021 0xFFFF false false 0xFFFF +CRC-16/MAXIM 0x44C2 0x8005 0x0000 true true 0xFFFF +CRC-16/MCRF4XX 0x6F91 0x1021 0xFFFF true true 0x0000 +CRC-16/RIELLO 0x63D0 0x1021 0xB2AA true true 0x0000 +CRC-16/T10-DIF 0xD0DB 0x8BB7 0x0000 false false 0x0000 +CRC-16/TELEDISK 0x0FB3 0xA097 0x0000 false false 0x0000 +CRC-16/TMS37157 0x26B1 0x1021 0x89EC true true 0x0000 +CRC-16/USB 0xB4C8 0x8005 0xFFFF true true 0xFFFF +CRC-A 0xBF05 0x1021 0xC6C6 true true 0x0000 +CRC-16/KERMIT 0x2189 0x1021 0x0000 true true 0x0000 +CRC-16/MODBUS 0x4B37 0x8005 0xFFFF true true 0x0000 +CRC-16/X-25 0x906E 0x1021 0xFFFF true true 0xFFFF +CRC-16/XMODEM 0x31C3 0x1021 0x0000 false false 0x0000 + + +Common 32 bit CRC's + +Algorithm Check Poly Init RefIn RefOut XorOut +CRC-32 0xCBF43926 0x04C11DB7 0xFFFFFFFF true true 0xFFFFFFFF +CRC-32/BZIP2 0xFC891918 0x04C11DB7 0xFFFFFFFF false false 0xFFFFFFFF +CRC-32C 0xE3069283 0x1EDC6F41 0xFFFFFFFF true true 0xFFFFFFFF +CRC-32D 0x87315576 0xA833982B 0xFFFFFFFF true true 0xFFFFFFFF +CRC-32/MPEG-2 0x0376E6E7 0x04C11DB7 0xFFFFFFFF false false 0x00000000 +CRC-32/POSIX 0x765E7680 0x04C11DB7 0x00000000 false false 0xFFFFFFFF +CRC-32Q 0x3010BF7F 0x814141AB 0x00000000 false false 0x00000000 +CRC-32/JAMCRC 0x340BC6D9 0x04C11DB7 0xFFFFFFFF true true 0x00000000 +CRC-32/XFER 0xBD0BE338 0x000000AF 0x00000000 false false 0x00000000 diff --git a/TSM_PicoW_Sensor/McuLib/src/McuCoverage.c b/TSM_PicoW_Sensor/McuLib/src/McuCoverage.c new file mode 100644 index 0000000..3489e47 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuCoverage.c @@ -0,0 +1,236 @@ +/*! + * Copyright (c) 2024, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * + * \brief Implementation of the McuCoverage module. + */ + +#include "McuCoverage.h" + +#if McuCoverage_CONFIG_IS_ENABLED +#include "McuLib.h" +#include +#include +#include "McuLog.h" +#if McuLib_CONFIG_SDK_USE_FREERTOS + #include "McuRTOS.h" +#endif +#include + +int McuCoverage_Check(void) { + FILE *file = NULL; + + /* + * Creating a file without absolute path. + * With J-Link and MCUXpresso IDE 11.4.1, this file gets created in the IDE installation directory (C:\NXP\MCUXpressoIDE_11.4.1_6260\ide). + * Where the file gets created (current directory of the semihosting process on the host) really depends on the probe firmware and is non-standard. + * See as well: + * https://developer.arm.com/documentation/dui0058/d/semihosting/semihosting-swis/sys-open--0x01-?lang=en + */ + file = fopen ("gcov_text.txt", "w"); /* on RP2040, file is present in project root folder. If using external gdb server: in the current directory of the GDB server */ + if (file!=NULL) { + fputs("hello world with file I/O\r\n", file); + fclose(file); + } else { + return 0; /* failed */ + } + + file = fopen ("c:\\tmp\\test.txt", "w"); + if (file!=NULL) { + fputs("hello world with file I/O\r\n", file); + (void)fwrite("hello\r\n", sizeof("hello\r\n")-1, 1, file); + fclose(file); + return 1; /* ok */ + } + return 0; /* failed */ +} + +void McuCoverage_Deinit(void) { + /* nothing needed */ +} + +/* call the coverage initializers if not done by startup code */ +void McuCoverage_Init(void) { +#if McuCoverage_CONFIG_USE_FREESTANDING + /* In a freestanding environment, we use custom hooks to write data. The constructors/destructors are *not* used, + * instead we rely on the .gcov_info in the binary. + */ +#else + #if McuLib_CONFIG_CPU_IS_RPxxxx + /* constructor calls for coverage already done in C:\Raspy\pico\pico-sdk\src\rp2_common\pico_runtime/runtime.c */ + #else + void (**p)(void); + extern uint32_t __init_array_start, __init_array_end; /* linker defined symbols, array of function pointers */ + uint32_t beg = (uint32_t)&__init_array_start; + uint32_t end = (uint32_t)&__init_array_end; + + while(beg FLASH + + Additionally, set the following compiler option: + -fprofile-info-section + + See https://github.com/gcc-mirror/gcc/blob/master/libgcc/gcov.h +*/ + +extern const struct gcov_info *const __gcov_info_start[]; +extern const struct gcov_info *const __gcov_info_end[]; + +static const unsigned char a = 'a'; + +/* each 8bit binary data value c gets encoded into two characters, each in rang 'a'-'p' (p is 'a'+16): + buf[0]: 'a' + LowNibble(c) + buf[1]: 'a' + HighNibble(c) +*/ +static inline unsigned char *encode(unsigned char c, unsigned char buf[2]) { + buf[0] = a + c % 16; + buf[1] = a + (c / 16) % 16; + return buf; +} + +#if 0 +/* The application reads a character stream encoded by encode() from stdin, + decodes it, and writes the decoded characters to stdout. Characters other + than the 16 characters 'a' to 'p' are ignored. */ +static int can_decode(unsigned char c) { + return (unsigned char)(c - a) < 16; +} + +/* application which reads from stdin a previously encoded data stream and decodes it to stdout. */ +void application_decode(void) { + int first = 1; + int i; + unsigned char c; + + while ((i = fgetc(stdin)) != EOF) { + unsigned char x = (unsigned char)i; + + if (can_decode (x)) { + if (first) { + c = x - a; + } else { + fputc (c + 16 * (x - a), stdout); + } + first = !first; + } else { + first = 1; + } + } +} +#endif + +/* This function shall produce a reliable in order byte stream to transfer the + gcov information from the target to the host system. */ +static void dump(const void *d, unsigned n, void *arg) { + (void)arg; + const unsigned char *c = d; + unsigned char buf[2]; + + for(unsigned int i = 0; i +#include "McuOneWire.h" /* interface to 1-Wire */ +#include "McuUtility.h" +#include "McuWait.h" + +/* Events */ +enum { + EV_NOTHING, + EV_INIT, + EV_NO_BUSY, + EV_READ_ROM, + EV_READ_TEMP, + EV_READ_TEMP_ALL +}; + +/* Rom commands */ +#define RC_READ_ROM 0x33 +#define RC_MATCH_ROM 0x55 +#define RC_SKIP_ROM 0xCC +#define RC_RELEASE 0xFF + +/* Function commands */ +#define FC_CONVERT_T 0x44 +#define FC_WRITE_SCRATCHPAD 0x4E +#define FC_READ_SCRATCHPAD 0xBE +#define FC_COPY_SCRATCHPAD 0x48 + +/* configuration byte */ +#define DS18B20_CONFIG_SHIFT_R0 (5) /* R0 in configuration byte starts at bit 0 */ +#define DS18B20_CONFIG_ONE_MASK (0x1F) /* bit 0 to bit 4 are one in configuration byte */ + +#define DS18B20_NOF_SCRATCHPAD_BYTES (9) /* number of bytes in scratchpad */ + +typedef struct { + int32_t Temperature; + uint8_t Rom[DS18B20_ROM_CODE_SIZE]; /* family code (0x28), ROM code (6 bytes), CRC (1 byte) */ + DS18B20_ResolutionBits resolution; /* DS18B20_ResolutionBits */ +} Sensor_t; + +struct { + int32 Value; + uint8 Data[10]; +#if McuDS18B20_CONFIG_MULTIPLE_BUS_DEVICES + uint8 WorkSensor; + unsigned MaxResolution:2; +#endif + unsigned Busy:1; +} Device; + +/* conversion time based on resolution */ +static const uint16 ConvTime[4] = { + 94, /* DS18B20_RESOLUTION_BITS_9: 93.75 ms */ + 188, /* DS18B20_RESOLUTION_BITS_10: 187.5 ms */ + 375, /* DS18B20_RESOLUTION_BITS_11: 375 ms */ + 750 /* DS18B20_RESOLUTION_BITS_12: 750 ms */ +}; + +static Sensor_t Sensor[McuDS18B20_CONFIG_NUMBER_OF_SENSORS]; + +static uint8_t McuDS18B20_ReadScratchpad(uint8_t sensor_index, uint8_t data[DS18B20_NOF_SCRATCHPAD_BYTES]) { + uint8_t res; + + if(Device.Busy) { + return ERR_BUSY; + } +#if McuDS18B20_CONFIG_NUMBER_OF_SENSORS>1 + if(sensor_index>=McuDS18B20_CONFIG_NUMBER_OF_SENSORS) { + return ERR_RANGE; /* error */ + } +#else + (void)sensor_index; /* not used */ +#endif + Device.Busy = TRUE; + McuOneWire_SendReset(); +#if McuDS18B20_CONFIG_MULTIPLE_BUS_DEVICES + McuOneWire_SendByte(RC_MATCH_ROM); + McuOneWire_SendBytes(Sensor[sensor_index].Rom, sizeof(Sensor[sensor_index].Rom)); +#else /* single device on the bus, can skip ROM code */ + McuOneWire_SendByte(RC_SKIP_ROM); +#endif + McuOneWire_SendByte(FC_READ_SCRATCHPAD); + McuOneWire_Receive(DS18B20_NOF_SCRATCHPAD_BYTES); + McuOneWire_SendByte(0xFF); + Device.Busy = FALSE; + + /* extract data */ + res = McuOneWire_GetBytes(&data[0], DS18B20_NOF_SCRATCHPAD_BYTES); /* scratchpad with 9 bytes */ + if (res!=ERR_OK) { + return res; /* failed getting data */ + } + /* check CRC */ + if (McuOneWire_CalcCRC(&data[0], 8)!=data[8]) { /* last byte is CRC */ + return ERR_CRC; /* CRC error */ + } + return ERR_OK; +} + +#if McuDS18B20_CONFIG_PARSE_COMMAND_ENABLED +static uint8_t PrintStatus(const McuShell_StdIOType *io) { + uint8_t buf[48]; + uint8_t res; + float temp; + int i; + + McuShell_SendStatusStr((unsigned char*)"McuDS18B20", (unsigned char*)"\r\n", io->stdOut); +#if McuDS18B20_CONFIG_READ_AUTO + McuShell_SendStatusStr((unsigned char*)" mode", (unsigned char*)"auto: conversion reads temperature\r\n", io->stdOut); +#else + McuShell_SendStatusStr((unsigned char*)" mode", (unsigned char*)"read: start conversion, then read temperature\r\n", io->stdOut); +#endif +#if McuDS18B20_CONFIG_MULTIPLE_BUS_DEVICES + McuShell_SendStatusStr((unsigned char*)" multiple", (unsigned char*)"yes\r\n", io->stdOut); +#else + McuShell_SendStatusStr((unsigned char*)" multiple", (unsigned char*)"no\r\n", io->stdOut); +#endif + McuUtility_Num8uToStr(buf, sizeof(buf), McuDS18B20_CONFIG_NUMBER_OF_SENSORS); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" sensors", buf, io->stdOut); + + for(i=0;istdOut); + + /* resolution */ + McuUtility_Num8uToStr(buf, sizeof(buf), i); /* sensor number */ + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)": "); + switch(Sensor[i].resolution) { + case DS18B20_RESOLUTION_BITS_9: McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"9 bits (93.75 ms conversion time)\r\n"); break; + case DS18B20_RESOLUTION_BITS_10: McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"10 bits (187.5 ms conversion time)\r\n"); break; + case DS18B20_RESOLUTION_BITS_11: McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"11 bits (375 ms conversion time)\r\n"); break; + case DS18B20_RESOLUTION_BITS_12: McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"12 bits (750 ms conversion time)\r\n"); break; + default: McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"UNKNOWN bits\r\n"); break; + } /* switch */ + McuShell_SendStatusStr((unsigned char*)" resolution", buf, io->stdOut); + + /* Temperature */ + res = McuDS18B20_StartConversion(i); + if (res==ERR_OK) { + McuUtility_Num8uToStr(buf, sizeof(buf), i); /* sensor number */ + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)": "); +#if McuDS18B20_CONFIG_READ_AUTO + res = ERR_OK; /* in auto mode, temperature already has been read from sensor during StartConversion() */ +#else + McuWait_WaitOSms(ConvTime[Sensor[i].resolution]); + res = McuDS18B20_ReadTemperature(i); +#endif + if (res==ERR_OK) { + res = McuDS18B20_GetTemperatureFloat(i, &temp); + if (res==ERR_OK) { + McuUtility_strcatNumFloat(buf, sizeof(buf), temp, 4); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"°C"); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"ERROR ("); + McuUtility_strcatNum8u(buf, sizeof(buf), res); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)")"); + } + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"ERROR ("); + McuUtility_strcatNum8u(buf, sizeof(buf), res); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)")"); + } + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ERROR ("); + McuUtility_strcatNum8u(buf, sizeof(buf), res); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)")"); + } + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" temperature", buf, io->stdOut); + } /* for */ + return ERR_OK; +} + +static uint8_t PrintHelp(const McuShell_StdIOType *io) { + McuShell_SendHelpStr((unsigned char*)"McuDS18B20", (unsigned char*)"Group of McuDS18B20 commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" search", (unsigned char*)"Search for DS18B20 devices on the bus and assign ROM code\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" set res ", (unsigned char*)"Set sensor resolution to (9, 10, 11, 12) bits\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" read res ", (unsigned char*)"Read sensor resolution\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" start conv ", (unsigned char*)"Start temperature conversion\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" read temp ", (unsigned char*)"Read sensor temperature\r\n", io->stdOut); + return ERR_OK; +} +#endif /* McuDS18B20_CONFIG_PARSE_COMMAND_ENABLED */ + +/* +** =================================================================== +** Method : ParseCommand (component DS18B20) +** +** Description : +** Shell Command Line parser. Method is only available if Shell +** is enabled in the component properties. +** Parameters : +** NAME - DESCRIPTION +** cmd - command string +** * handled - Pointer to variable which tells if +** the command has been handled or not +** io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuDS18B20_ParseCommand(const unsigned char* cmd, bool *handled, const McuShell_StdIOType *io) +{ +#if McuDS18B20_CONFIG_PARSE_COMMAND_ENABLED + uint8_t res = ERR_OK; + const unsigned char *p; + uint8_t sensorNr; + float temperature; + uint8_t buf[32]; + + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP) == 0 + || McuUtility_strcmp((char*)cmd, "McuDS18B20 help") == 0) + { + *handled = TRUE; + return PrintHelp(io); + } else if ( (McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) + || (McuUtility_strcmp((char*)cmd, "McuDS18B20 status") == 0) + ) + { + *handled = TRUE; + res = PrintStatus(io); + } else if (McuUtility_strncmp((char*)cmd, "McuDS18B20 start conv ", sizeof("McuDS18B20 start conv ")-1) == 0) { + *handled = TRUE; + p = cmd + sizeof("McuDS18B20 start conv ")-1; + if (McuUtility_ScanDecimal8uNumber(&p, &sensorNr)==ERR_OK) { + if (McuDS18B20_StartConversion(sensorNr)!=ERR_OK) { + McuShell_SendStr((unsigned char*)"Failed starting conversion!\r\n", io->stdErr); + res = ERR_FAILED; + } + } else { + McuShell_SendStr((unsigned char*)"Wrong sensor index\r\n", io->stdErr); + res = ERR_FAILED; + } + } else if (McuUtility_strncmp((char*)cmd, "McuDS18B20 set res ", sizeof("McuDS18B20 set res ")-1) == 0) { + DS18B20_ResolutionBits resolution; + uint8_t resol; + + *handled = TRUE; + p = cmd + sizeof("McuDS18B20 set res ")-1; + if ( McuUtility_ScanDecimal8uNumber(&p, &sensorNr)==ERR_OK + && McuUtility_ScanDecimal8uNumber(&p, &resol)==ERR_OK + && resol>=9 && resol<=12 + ) + { + switch(resol) { + case 9: resolution = DS18B20_RESOLUTION_BITS_9; break; + case 10: resolution = DS18B20_RESOLUTION_BITS_10; break; + case 11: resolution = DS18B20_RESOLUTION_BITS_11; break; + case 12: resolution = DS18B20_RESOLUTION_BITS_12; break; + default: resolution = DS18B20_RESOLUTION_BITS_12; break; + } + if (McuDS18B20_SetResolution(sensorNr, resolution)!=ERR_OK) { + McuShell_SendStr((unsigned char*)"Failed starting conversion!\r\n", io->stdErr); + res = ERR_FAILED; + } + } else { + McuShell_SendStr((unsigned char*)"Wrong sensor index or resolution!\r\n", io->stdErr); + res = ERR_FAILED; + } + } else if (McuUtility_strncmp((char*)cmd, "McuDS18B20 read res ", sizeof("McuDS18B20 read res ")-1) == 0) { + *handled = TRUE; + p = cmd + sizeof("McuDS18B20 read res ")-1; + if (McuUtility_ScanDecimal8uNumber(&p, &sensorNr)==ERR_OK) { + if (McuDS18B20_ReadResolution(sensorNr)!=ERR_OK) { + McuShell_SendStr((unsigned char*)"Failed reading resolution\r\n", io->stdErr); + res = ERR_FAILED; + } else { + switch(Sensor[sensorNr].resolution) { + case DS18B20_RESOLUTION_BITS_9: McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"9 bits\r\n"); break; + case DS18B20_RESOLUTION_BITS_10: McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"10 bits\r\n"); break; + case DS18B20_RESOLUTION_BITS_11: McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"11 bits\r\n"); break; + case DS18B20_RESOLUTION_BITS_12: McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"12 bits\r\n"); break; + default: McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"UNKNOWN bits\r\n"); break; + } /* switch */ + McuShell_SendStr(buf, io->stdOut); + res = ERR_OK; + } + } else { + McuShell_SendStr((unsigned char*)"Wrong sensor index\r\n", io->stdErr); + res = ERR_FAILED; + } + } else if (McuUtility_strncmp((char*)cmd, "McuDS18B20 read temp ", sizeof("McuDS18B20 read temp ")-1) == 0) { + *handled = TRUE; + p = cmd + sizeof("McuDS18B20 read temp ")-1; + if (McuUtility_ScanDecimal8uNumber(&p, &sensorNr)==ERR_OK) { + if (McuDS18B20_ReadTemperature(sensorNr)!=ERR_OK) { + McuShell_SendStr((unsigned char*)"Failed reading temperature!\r\n", io->stdErr); + res = ERR_FAILED; + } else { + if (McuDS18B20_GetTemperatureFloat(sensorNr, &temperature)!=ERR_OK) { + McuShell_SendStr((unsigned char*)"Failed getting temperature!\r\n", io->stdErr); + res = ERR_FAILED; + } else { + buf[0] = '\0'; + McuUtility_strcatNumFloat(buf, sizeof(buf), temperature, 4); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"°C\r\n"); + McuShell_SendStr(buf, io->stdOut); + res = ERR_OK; + } + } + } else { + McuShell_SendStr((unsigned char*)"Wrong sensor index\r\n", io->stdErr); + res = ERR_FAILED; + } + } else if (McuUtility_strcmp((char*)cmd, "McuDS18B20 search")==0) { + uint8_t rom[McuOneWire_ROM_CODE_SIZE]; + bool found; + int i, nofFound = 0; + + *handled = TRUE; + McuOneWire_ResetSearch(); /* reset search fields */ + McuOneWire_TargetSearch(DS18B20_FAMILY_CODE); /* only search for DS18B20 */ + do { + found = McuOneWire_Search(&rom[0], TRUE); + if (found) { + buf[0] = '\0'; + (void)McuOneWire_strcatRomCode(buf, sizeof(buf), &rom[0]); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStr(buf, io->stdOut); + /* store ROM code in device list */ + for(i=0;istdErr); + } + return ERR_OK; + } + return res; +#else + (void)cmd; + (void)handled; + (void)io; + return ERR_OK; +#endif +} + +/* +** =================================================================== +** Method : StartConversion (component DS18B20) +** +** Description : +** Starts the conversion of temperature in the sensor. +** Parameters : +** NAME - DESCRIPTION +** sensor_index - Sensor index, use zero +** if only using one sensor +** Returns : +** --- - error code +** =================================================================== +*/ +uint8_t McuDS18B20_StartConversion(uint8_t sensor_index) +{ +#if McuDS18B20_CONFIG_READ_AUTO + uint8_t res; +#endif + + if(Device.Busy) { + return ERR_BUSY; + } +#if McuDS18B20_CONFIG_NUMBER_OF_SENSORS>1 + if(sensor_index>=McuDS18B20_CONFIG_NUMBER_OF_SENSORS) { + return ERR_RANGE; /* error */ + } +#endif + Device.Busy = TRUE; + McuOneWire_SendReset(); +#if McuDS18B20_CONFIG_MULTIPLE_BUS_DEVICES + McuOneWire_SendByte(RC_MATCH_ROM); + McuOneWire_SendBytes(Sensor[sensor_index].Rom, DS18B20_ROM_CODE_SIZE); + McuOneWire_SendByte(FC_CONVERT_T); +#else /* only single device on the bus, can skip ROM code */ + McuOneWire_SendByte(RC_SKIP_ROM); + McuOneWire_SendByte(FC_CONVERT_T); +#endif + Device.Busy = FALSE; +#if McuDS18B20_CONFIG_READ_AUTO + McuWait_WaitOSms(ConvTime[Sensor[sensor_index].resolution]); + res = McuDS18B20_ReadTemperature(sensor_index); + if (res!=ERR_OK) { + return res; + } +#endif + return ERR_OK; +} + +/* +** =================================================================== +** Method : SetResolution (component DS18B20) +** +** Description : +** Sets the resolution +** Parameters : +** NAME - DESCRIPTION +** sensor_index - Index of the sensor to +** set the resolution. +** config_bits - Two bits resolution config +** value: +** [0b00] - 9 bits. +** [0b01] - 10 bits. +** [0b10] - 11 bits. +** [0b11] - 12 bits. +** Returns : +** --- - error code +** =================================================================== +*/ +uint8_t McuDS18B20_SetResolution(uint8_t sensor_index, DS18B20_ResolutionBits resolution) +{ + uint8_t config; + + if(Device.Busy) { + return ERR_BUSY; + } +#if McuDS18B20_CONFIG_NUMBER_OF_SENSORS>1 + if(sensor_index>=McuDS18B20_CONFIG_NUMBER_OF_SENSORS) { + return ERR_RANGE; /* error */ + } +#else + (void)sensor_index; /* not used */ +#endif + Sensor[sensor_index].resolution = resolution; + config = (((uint8_t)(resolution<1 + Sensor[sensor_index].Temperature = (data[1]<<8)+data[0]; +#else + Sensor[0].Temperature = (data[1]<<8)+data[0]; +#endif + return ERR_OK; +} + +/* +** =================================================================== +** Method : ReadResolution (component DS18B20) +** +** Description : +** Read the sensor resolution sensor and stores it in memory +** Parameters : +** NAME - DESCRIPTION +** sensor_index - Sensor index, use zero +** if only using one sensor +** Returns : +** --- - error code +** =================================================================== +*/ +uint8_t McuDS18B20_ReadResolution(uint8_t sensor_index) +{ + uint8_t data[DS18B20_NOF_SCRATCHPAD_BYTES]; /* scratchpad data */ + uint8_t res; + +#if McuDS18B20_CONFIG_NUMBER_OF_SENSORS>1 + if(sensor_index>=McuDS18B20_CONFIG_NUMBER_OF_SENSORS) { + return ERR_RANGE; /* error */ + } +#endif + res = McuDS18B20_ReadScratchpad(sensor_index, &data[0]); + if (res!=ERR_OK) { + return res; + } + /* configuration is in data[4] */ + Sensor[sensor_index].resolution = ((data[4])>>DS18B20_CONFIG_SHIFT_R0)&0x3; /* only two bits */ + return ERR_OK; +} + +/* +** =================================================================== +** Method : GetTemperature (component DS18B20) +** +** Description : +** Gets the temperature from memory. +** Parameters : +** NAME - DESCRIPTION +** * sensor_index - Index of the sensor to +** get the temperature value. +** Returns : +** --- - +** =================================================================== +*/ +uint8_t McuDS18B20_GetTemperatureRaw(uint16_t sensor_index, uint32_t *raw) +{ +#if McuDS18B20_CONFIG_NUMBER_OF_SENSORS>1 + if(sensor_index>=McuDS18B20_CONFIG_NUMBER_OF_SENSORS) { + return ERR_RANGE; /* error */ + } +#else + (void)sensor_index; /* not used */ +#endif +#if McuDS18B20_CONFIG_NUMBER_OF_SENSORS>1 + *raw = Sensor[sensor_index].Temperature; +#else + *raw = Sensor[0].Temperature; +#endif + return ERR_OK; +} + +/* +** =================================================================== +** Method : GetTemperatureFloat (component DS18B20) +** +** Description : +** Returns the temperature from memory in floating point format. +** Parameters : +** NAME - DESCRIPTION +** sensor_index - Sensor index, use zero +** if only using one sensor +** * temperature - Pointer to where to store +** the value +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuDS18B20_GetTemperatureFloat(uint8_t sensor_index, float *temperature) +{ + int16_t raw, intPart, fracPart; + +#if McuDS18B20_CONFIG_NUMBER_OF_SENSORS>1 + if(sensor_index>=McuDS18B20_CONFIG_NUMBER_OF_SENSORS) { + return ERR_RANGE; /* error */ + } +#else + (void)sensor_index; /* not used */ +#endif +#if McuDS18B20_CONFIG_NUMBER_OF_SENSORS>1 + raw = Sensor[sensor_index].Temperature; +#else + raw = Sensor[0].Temperature; +#endif + intPart = raw>>4; /* integral part */ + fracPart = raw&0xf; /* fractional part */ + *temperature = ((float)intPart) + (((float)fracPart)*0.0625); + return ERR_OK; +} + + +/* +** =================================================================== +** Method : isBusy (component DS18B20) +** +** Description : +** Returns TRUE if there are a operation in progress. +** Parameters : None +** Returns : +** --- - Returns TRUE if the device is busy, and +** FALSE if its ready to operate. +** =================================================================== +*/ +bool McuDS18B20_isBusy(void) +{ + return Device.Busy; +} + +/* +** =================================================================== +** Method : GetRomCode (component DS18B20) +** +** Description : +** Gets the rom code from the memory. +** Parameters : +** NAME - DESCRIPTION +** sensor_index - Sensor index, use zero +** if only using one sensor +** * romCodePtr - Pointer to a pointer for the +** return value +** Returns : +** --- - error code +** =================================================================== +*/ +uint8_t McuDS18B20_GetRomCode(uint8_t sensor_index, uint8_t **romCodePtr) +{ +#if McuDS18B20_CONFIG_NUMBER_OF_SENSORS>1 + if(sensor_index>=McuDS18B20_CONFIG_NUMBER_OF_SENSORS) { + return ERR_RANGE; /* error */ + } +#else + (void)sensor_index; /* not used */ +#endif +#if McuDS18B20_CONFIG_NUMBER_OF_SENSORS>1 + *romCodePtr = &Sensor[sensor_index].Rom[0]; +#else + *romCodePtr = &Sensor[0].Rom[0]; +#endif + return ERR_OK; /* ok */ +} + +/* +** =================================================================== +** Method : ReadRom (component DS18B20) +** +** Description : +** Starts to read the rom code and saves it in memory. +** Parameters : +** NAME - DESCRIPTION +** sensor_index - Sensor index, use zero +** if only using one sensor +** Returns : +** --- - error code +** =================================================================== +*/ +uint8_t McuDS18B20_ReadRom(uint8_t sensor_index) +{ + uint8_t res; + + if(Device.Busy) { + return ERR_BUSY; + } +#if McuDS18B20_CONFIG_NUMBER_OF_SENSORS>1 + if(sensor_index>=McuDS18B20_CONFIG_NUMBER_OF_SENSORS) { + return ERR_RANGE; /* error */ + } +#else + (void)sensor_index; /* not used */ +#endif + Device.Busy = TRUE; +#if McuDS18B20_CONFIG_NUMBER_OF_SENSORS>1 + Device.WorkSensor = sensor_index; +#endif +#if McuDS18B20_CONFIG_NUMBER_OF_SENSORS>1 + res = McuOneWire_ReadRomCode(Sensor[sensor_index].Rom); +#else + res = McuOneWire_ReadRomCode(Sensor[0].Rom); /* 8 bytes */ +#endif + Device.Busy = FALSE; + /* index 0 : family code + index 1-6: 48bit serial number + index 7 : CRC + */ + if (res!=ERR_OK) { + return res; /* error */ + } +#if McuDS18B20_CONFIG_NUMBER_OF_SENSORS>1 + if (Sensor[sensor_index].Rom[0]!=DS18B20_FAMILY_CODE) { +#else + if (Sensor[0].Rom[0]!=DS18B20_FAMILY_CODE) { +#endif + return ERR_FAILED; /* not a DS18B20? */ + } + return ERR_OK; /* ok */ +} + +/* +** =================================================================== +** Method : Deinit (component DS18B20) +** +** Description : +** Driver deinitialization routine +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuDS18B20_Deinit(void) +{ + /* nothing special needed here */ +} + + +/* +** =================================================================== +** Method : Init (component DS18B20) +** +** Description : +** Initializes the device. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuDS18B20_Init(void) +{ +#if McuDS18B20_CONFIG_MULTIPLE_BUS_DEVICES + int i; + + for(i=0;i +#if McuLib_CONFIG_SDK_USE_FREERTOS + +void McuDbnc_Process(McuDbnc_Desc_t *data) { + uint32_t buttons; + + for(;;) { + switch(data->state) { + case MCUDBMC_STATE_IDLE: /* not doing anything */ + return; + + case MCUDBMC_STATE_START: /* entering state machine. This might be done from an interrupt, so keep it simple */ + if (data->scanValue==0) { /* not assigned yet */ + data->scanValue = data->getButtons(); + } + data->countTimeMs = 0; /* initialize */ + data->lastEventTimeMs = 0; /* initialize */ + data->state = MCUDBMC_STATE_PRESS; + return; /* wait the timer period time for next iteration. Caller should enable timer to get to the next state */ + + case MCUDBMC_STATE_PRESS: + data->onDebounceEvent(MCUDBNC_EVENT_PRESSED, data->scanValue); /* we have a key press: call event handler */ + data->state = MCUDBMC_STATE_DEBOUNCE; /* advance to next state */ + return; /* wait the timer period time for next iteration */ + + case MCUDBMC_STATE_DEBOUNCE: /* debouncing */ + data->countTimeMs += data->timerPeriodMs; + if (data->countTimeMsdebounceTimeMs) { + return; /* continue waiting */ + } + data->state = MCUDBMC_STATE_PRESSED; + break; /* go to next state */ + + case MCUDBMC_STATE_PRESSED: /* button has been pressed, wait for release */ + data->countTimeMs += data->timerPeriodMs; + buttons = data->getButtons(); + if (buttons==0) { /* all buttons are released */ + data->state = MCUDBMC_STATE_RELEASED; /* advance to next state */ + break; /* advance to the next state */ + } else if (buttons==data->scanValue) { /* still pressing the same keys */ + if (data->countTimeMs>=data->longKeyTimeMs) { /* long key press detected */ + data->onDebounceEvent(MCUDBNC_EVENT_LONG_PRESSED, data->scanValue); + data->lastEventTimeMs = data->countTimeMs; + data->state = MCUDBMC_STATE_LONG_PRESSED; /* advance to next state */ + return; /* wait the timer period time for next iteration */ + } + if (data->countTimeMs-data->lastEventTimeMs > data->repeatTimeMs) { + data->onDebounceEvent(MCUDBNC_EVENT_PRESSED_REPEAT, data->scanValue); + data->lastEventTimeMs = data->countTimeMs; + } + return; /* wait the timer period time for next iteration */ + } else { /* we got another key set pressed */ + uint32_t changed; + + changed = buttons&(~data->scanValue); /* newly pressed buttons */ + if (changed!=0) { + data->onDebounceEvent(MCUDBNC_EVENT_PRESSED, changed); /* generate press event for the new keys pressed */ + data->lastEventTimeMs = data->countTimeMs; + } + changed = (data->scanValue)&(~buttons); /* newly released buttons */ + if (changed!=0) { + data->onDebounceEvent(MCUDBNC_EVENT_RELEASED, changed); /* generate release event for the old keys released */ + data->lastEventTimeMs = data->countTimeMs; + } + data->scanValue = buttons; /* store new set of buttons */ + return; /* wait the timer period time for next iteration */ + } + break; /* go to next state */ + + case MCUDBMC_STATE_LONG_PRESSED: /* we are in the long press range */ + data->countTimeMs += data->timerPeriodMs; + buttons = data->getButtons(); + if (buttons==0) { /* all buttons are released */ + data->state = MCUDBMC_STATE_RELEASED; /* advance to next state */ + break; /* advance to the next state */ + } else if (buttons==data->scanValue) { /* still pressing the same keys */ + if (data->countTimeMs-data->lastEventTimeMs > data->repeatTimeMs) { + data->onDebounceEvent(MCUDBNC_EVENT_LONG_PRESSED_REPEAT, data->scanValue); + data->lastEventTimeMs = data->countTimeMs; + } + return; /* wait the timer period time for next iteration */ + } else { /* we got another key set pressed */ + uint32_t changed; + + changed = buttons&(~data->scanValue); /* newly pressed buttons */ + if (changed!=0) { + data->onDebounceEvent(MCUDBNC_EVENT_PRESSED, changed); /* generate press event for the new keys pressed */ + data->lastEventTimeMs = data->countTimeMs; + } + changed = (data->scanValue)&(~buttons); /* newly released buttons */ + if (changed!=0) { + data->onDebounceEvent(MCUDBNC_EVENT_LONG_RELEASED, changed); /* generate release event for the old keys released */ + data->lastEventTimeMs = data->countTimeMs; + } + data->scanValue = buttons; /* store new set of buttons */ + return; /* wait the timer period time for next iteration */ + } + break; /* go to next state */ + + case MCUDBMC_STATE_RELEASED: + if (data->countTimeMs>=data->longKeyTimeMs) { + data->onDebounceEvent(MCUDBNC_EVENT_LONG_RELEASED, data->scanValue); /* throw long event */ + } else { + data->onDebounceEvent(MCUDBNC_EVENT_RELEASED, data->scanValue); /* throw short event */ + } + data->lastEventTimeMs = data->countTimeMs; + data->state = MCUDBMC_STATE_END; + break; + + case MCUDBMC_STATE_END: /* finish up */ + data->onDebounceEvent(MCUDBNC_EVENT_END, data->scanValue); /* callback at the end of debouncing. */ + data->scanValue = 0; /* reset */ + data->countTimeMs = 0; /* reset */ + data->state = MCUDBMC_STATE_IDLE; /* go back to idle */ + return; /* get out of state machine */ + + default: /* should not happen */ + break; + } /* switch */ + } /* for */ +} + +void McuDbnc_Deinit(void) {} +void McuDbnc_Init(void) {} + +#endif /* #if McuLib_CONFIG_SDK_USE_FREERTOS */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuDebounce.h b/TSM_PicoW_Sensor/McuLib/src/McuDebounce.h new file mode 100644 index 0000000..6439020 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuDebounce.h @@ -0,0 +1,68 @@ +/* + * McuDebounce.h + * + * Copyright (c) 2019, 2020, Erich Styger + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MCUDEBOUNCE_H_ +#define MCUDEBOUNCE_H_ + +#include "McuDebounceconfig.h" +#include +#include "McuRTOS.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if McuLib_CONFIG_SDK_USE_FREERTOS + +typedef enum { + MCUDBMC_STATE_IDLE = 0, /*!< initial state, not doing anything */ + MCUDBMC_STATE_START, /*!< starting debouncing, entered after a button press */ + MCUDBMC_STATE_PRESS, /*!< state after start to send a press notification */ + MCUDBMC_STATE_DEBOUNCE, /*!< debounce after press */ + MCUDBMC_STATE_PRESSED, /*!< while pressing */ + MCUDBMC_STATE_LONG_PRESSED, /*!< enters this state after pressing for the long press time */ + MCUDBMC_STATE_RELEASED, /*!< buttons have been released */ + MCUDBMC_STATE_END, /*!< final state used for cleanup */ +} McuDbnc_State_e; + +typedef enum { + MCUDBNC_EVENT_PRESSED, /*!< Event for key(s) pressed */ + MCUDBNC_EVENT_PRESSED_REPEAT, /*!< Event for key(s) while pressed */ + MCUDBNC_EVENT_LONG_PRESSED, /*!< Event for key(s) pressed for a long time */ + MCUDBNC_EVENT_LONG_PRESSED_REPEAT, /*!< Event for key(s) pressed for a long time and repeated */ + MCUDBNC_EVENT_RELEASED, /*!< Event for key(s) released */ + MCUDBNC_EVENT_LONG_RELEASED, /*!< Event for key(s) released after pressed a long time */ + MCUDBNC_EVENT_END /*!< Debouncing end event. This one is called when the FSM finishes. */ +} McuDbnc_EventKinds; + +typedef struct { + McuDbnc_State_e state; /* data */ + /* uint32_t flags; */ + uint32_t timerPeriodMs; /* config: period of timer in ms */ + TimerHandle_t timer; /* config: RTOS timer handle */ + uint32_t scanValue; /* data: value of buttons at debounce start */ + uint32_t countTimeMs; /* data: counting time in ms from the beginning */ + uint32_t lastEventTimeMs; /* data: time of last event, used for repeated messages */ + uint32_t debounceTimeMs; /* config: debounce time in ms */ + uint32_t repeatTimeMs; /* config: wait time for a button repeat message */ + uint32_t longKeyTimeMs; /* config: wait time for a long key press */ + uint32_t (*getButtons)(void); /* config: get the pressed buttons */ + void (*onDebounceEvent)(McuDbnc_EventKinds event, uint32_t buttons); /* config: event handler called */ +} McuDbnc_Desc_t; + +void McuDbnc_Process(McuDbnc_Desc_t *data); + +void McuDbnc_Deinit(void); +void McuDbnc_Init(void); + +#endif /* #if McuLib_CONFIG_SDK_USE_FREERTOS */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MCUDEBOUNCE_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuEE24.c b/TSM_PicoW_Sensor/McuLib/src/McuEE24.c new file mode 100644 index 0000000..2e22144 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuEE24.c @@ -0,0 +1,876 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuEE24.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : 24AA_EEPROM +** Version : Component 01.042, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2021-04-18, 20:37, # CodeGen: 733 +** Abstract : +** Driver for Microchip 24_AA/LC EEPROMs +** Settings : +** Component name : McuEE24 +** SDK : McuLib +** Device Type : 8 +** Initial I2C Device Address Bits : 0x0 +** Block buffer size : 32 +** Acknowledge Polling : Enabled +** Page Write Time (ms) : 5 +** Wait : McuWait +** ACK Polling Time (us) : 100 +** Connection : +** I2C : McuGenericI2C +** Write Protection Pin : Enabled +** WP : SDK_BitIO +** Timeout : Enabled +** Timeout : McuTimeout +** Timeout Byte (ms) : 10 +** Timeout Block (ms) : 60 +** Shell : Enabled +** Shell : McuShell +** Utility : McuUtility +** Contents : +** ReadByte - uint8_t McuEE24_ReadByte(McuEE24_Address addr, uint8_t *data); +** WriteByte - uint8_t McuEE24_WriteByte(McuEE24_Address addr, uint8_t data); +** ReadBlock - uint8_t McuEE24_ReadBlock(McuEE24_Address addr, uint8_t *data, uint16_t... +** WriteBlock - uint8_t McuEE24_WriteBlock(McuEE24_Address addr, uint8_t *data, uint16_t... +** WriteProtect - void McuEE24_WriteProtect(void); +** WriteUnprotect - void McuEE24_WriteUnprotect(void); +** SelectDevice - uint8_t McuEE24_SelectDevice(uint8_t addrI2C); +** GetSelectedDevice - uint8_t McuEE24_GetSelectedDevice(void); +** Test - uint8_t McuEE24_Test(void); +** ParseCommand - uint8_t McuEE24_ParseCommand(const unsigned char *cmd, bool *handled, const... +** Deinit - void McuEE24_Deinit(void); +** Init - void McuEE24_Init(void); +** +** * Copyright (c) 2013-2021, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuEE24.h +** @version 01.00 +** @brief +** Driver for Microchip 24_AA/LC EEPROMs +*/ +/*! +** @addtogroup McuEE24_module McuEE24 module documentation +** @{ +*/ + +/* MODULE McuEE24. */ + +#include "McuEE24.h" +#if McuEE24_CONFIG_HAS_WP_PIN + #include "WPpin1.h" +#endif +#include "McuWait.h" +#if McuEE24_CONFIG_USE_SHELL + #include "McuShell.h" +#endif +#if McuEE24_CONFIG_USE_UTILITY + #include "McuUtility.h" +#endif +#include "McuGenericI2C.h" +#if McuEE24_CONFIG_USE_TIMEOUT + #include "McuTimeout.h" +#endif + +#if McuEE24_CONFIG_USE_TIMEOUT + #define McuEE24_TIMEOUT_BYTE_TICKS (McuEE24_CONFIG_TIMEOUT_BYTE_MS/(McuTimeout_TICK_PERIOD_MS)) + #define McuEE24_TIMEOUT_BLOCK_TICKS (McuEE24_CONFIG_TIMEOUT_BLOCK_MS/(McuTimeout_TICK_PERIOD_MS)) +#endif + +static uint8_t McuEE24_I2CAddress = (McuEE24_CONFIG_DEVICE_I2C_ADDRESS_BITS&McuEE24_MAX_I2C_ADDR_MASK); /* current I2C address used */ + +/* macros for the control byte: */ +#define McuEE24_CTRL_NBL (0x0A<<3) /* control byte high nibble. Typically this is 1010 (shifted by one to the right) */ +#if (McuEE24_CONFIG_DEVICE_ID==8) || (McuEE24_CONFIG_DEVICE_ID==16) + #define McuEE24_CTRL_ADDR 0 /* no additional address bits */ + /* define control byte as 1010|Bx|B1|B0 */ + #define McuEE24_BANK_0 (0<<2) /* B0 bit (0) inside the CTRL_BYTE: 1010|B0|A1|A0 */ + #define McuEE24_BANK_1 (1<<2) /* B0 bit (1) inside the CTRL_BYTE: 1010|B0|A1|A0 */ + #define McuEE24_CTRL_BYTE (McuEE24_CTRL_NBL|McuEE24_CTRL_ADDR) /* 1010|B0|A1|A0 */ + #define McuEE24_DEVICE_ADDR(addr) \ + ( McuEE24_CTRL_BYTE|((addr>>8)&0x07) ) + #if 0 /* old style */ + (((addr)&0x400)? \ + (McuEE24_CTRL_BYTE|McuEE24_BANK_1) \ + : (McuEE24_CTRL_BYTE|McuEE24_BANK_0) ) /* 7bit address of device used to select device */ + #endif +#elif (McuEE24_CONFIG_DEVICE_ID==32) || (McuEE24_CONFIG_DEVICE_ID==256) || (McuEE24_CONFIG_DEVICE_ID==512) + #define McuEE24_CTRL_ADDR McuEE24_I2CAddress /* address inside control byte */ + /* define control byte as 1010|A2|A1|A0 */ + #define McuEE24_CTRL_BYTE (McuEE24_CTRL_NBL|McuEE24_CTRL_ADDR) /* 1010|A2|A1|A0 */ + #define McuEE24_DEVICE_ADDR(addr) McuEE24_CTRL_BYTE /* 7bit address of device used to select device */ +#elif McuEE24_CONFIG_DEVICE_ID==1025 + #define McuEE24_CTRL_ADDR McuEE24_I2CAddress /* address inside control byte */ + /* define control byte as 1010|Bx|A1|A0 */ + #define McuEE24_BANK_0 (0<<2) /* B0 bit (0) inside the CTRL_BYTE: 1010|B0|A1|A0 */ + #define McuEE24_BANK_1 (1<<2) /* B0 bit (1) inside the CTRL_BYTE: 1010|B0|A1|A0 */ + #define McuEE24_CTRL_BYTE (McuEE24_CTRL_NBL|McuEE24_CTRL_ADDR) /* 1010|B0|A1|A0 */ + #define McuEE24_DEVICE_ADDR(addr) \ + (((addr)&0x10000)? \ + (McuEE24_CTRL_BYTE|McuEE24_BANK_1) \ + : (McuEE24_CTRL_BYTE|McuEE24_BANK_0) ) /* 7bit address of device used to select device */ +#endif + +static uint8_t PrintStatus(const McuShell_StdIOType *io) { + unsigned char buf[32]; + + McuShell_SendStatusStr((unsigned char*)"McuEE24", (unsigned char*)"\r\n", io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), (uint8_t)McuEE24_DEVICE_ADDR(0)); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" (for memory @0x00)\r\n"); + McuShell_SendStatusStr((unsigned char*)" I2C Addr", buf, io->stdOut); + + McuUtility_Num16uToStr(buf, sizeof(buf), (uint16_t)McuEE24_CONFIG_DEVICE_ID); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" Type", buf, io->stdOut); + + return ERR_OK; +} + +static uint8_t PrintHelp(const McuShell_StdIOType *io) { + McuShell_SendHelpStr((unsigned char*)"McuEE24", (unsigned char*)"Group of McuEE24 commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" read 0x", (unsigned char*)"Read a byte from an address\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" write 0x 0x", (unsigned char*)"Write a byte to an address\r\n", io->stdOut); + return ERR_OK; +} + +/* +** =================================================================== +** Method : WriteByte (component 24AA_EEPROM) +** +** Description : +** Writes a single byte to specified address +** Parameters : +** NAME - DESCRIPTION +** addr - The address inside the EEPROM +** data - The data value to write +** Returns : +** --- - Error code, possible values +** ERR_OK - OK +** otherwise it can return an error code of +** the underlying communication protocol. +** =================================================================== +*/ +uint8_t McuEE24_WriteByte(McuEE24_Address addr, uint8_t data) +{ + uint8_t res, block[3]; +#if McuEE24_CONFIG_USE_TIMEOUT +#if McuEE24_DO_ACKNOWLEDGE_POLLING && McuEE24_TIMEOUT_BYTE_TICKS>0 + McuTimeout_CounterHandle timeout; + bool isTimeout; +#endif +#endif + + res = McuGenericI2C_SelectSlave(McuEE24_DEVICE_ADDR(addr)); + if (res != ERR_OK) { + (void)McuGenericI2C_UnselectSlave(); + return res; + } + #if (McuEE24_CONFIG_DEVICE_ID==8) || (McuEE24_CONFIG_DEVICE_ID==16) + block[0] = (uint8_t)(addr&0xff); /* low byte of address */ + block[1] = data; /* switch to read mode */ + res = McuGenericI2C_WriteBlock(block, 2, McuGenericI2C_SEND_STOP); /* send address and data */ + #else + block[0] = (uint8_t)(addr>>8); /* high byte of address */ + block[1] = (uint8_t)(addr&0xff); /* low byte of address */ + block[2] = data; /* switch to read mode */ + res = McuGenericI2C_WriteBlock(block, sizeof(block), McuGenericI2C_SEND_STOP); /* send address and data */ + #endif + if (res != ERR_OK) { + (void)McuGenericI2C_UnselectSlave(); + return res; + } +#if McuEE24_DO_ACKNOWLEDGE_POLLING + /* do acknowledge polling */ + block[0] = 0xff; /* dummy value */ +#if McuEE24_CONFIG_USE_TIMEOUT +#if McuEE24_TIMEOUT_BYTE_TICKS>0 + timeout = McuTimeout_GetCounter(McuEE24_TIMEOUT_BYTE_TICKS); /* set up timeout counter */ + if (timeout==McuTimeout_OUT_OF_HANDLE) { + (void)McuGenericI2C_UnselectSlave(); + return ERR_FAILED; + } +#endif +#endif + do { +#if McuEE24_CONFIG_USE_TIMEOUT +#if McuEE24_TIMEOUT_BYTE_TICKS>0 + isTimeout = McuTimeout_CounterExpired(timeout); + if (isTimeout) { + break; /* break while() */ + } +#endif +#endif + McuWait_WaitOSms(McuEE24_CONFIG_PAGE_WRITE_TIME_MS); + res = McuGenericI2C_ProbeACK(block, 1, McuGenericI2C_SEND_STOP, McuEE24_CONFIG_ACK_POLLING_TIME_US); /* send address and data */ + } while(res!=ERR_OK); /* wait until we get an ACK */ +#if McuEE24_CONFIG_USE_TIMEOUT +#if McuEE24_TIMEOUT_BYTE_TICKS>0 + McuTimeout_LeaveCounter(timeout); + if (isTimeout) { + res = ERR_FAILED; + } +#endif +#endif +#endif /* McuEE24_CONFIG_DO_ACKNOWLEDGE_POLLING */ + if (res != ERR_OK) { + (void)McuGenericI2C_UnselectSlave(); + return res; + } + return McuGenericI2C_UnselectSlave(); +} + +/* +** =================================================================== +** Method : ReadByte (component 24AA_EEPROM) +** +** Description : +** Reads a single byte from the given memory address +** Parameters : +** NAME - DESCRIPTION +** addr - The address where to read from memory. +** * data - Pointer to a location where to store the +** data +** Returns : +** --- - Error code, possible values +** ERR_OK - OK +** otherwise it can return an error code of +** the underlying communication protocol. +** =================================================================== +*/ +uint8_t McuEE24_ReadByte(McuEE24_Address addr, uint8_t *data) +{ + uint8_t res; + #if (McuEE24_CONFIG_DEVICE_ID==8) || (McuEE24_CONFIG_DEVICE_ID==16) + uint8_t addr8; + addr8 = (uint8_t)(addr&0xff); /* low address byte */ + #else + uint8_t addr16[2]; /* big endian address on I2C bus needs to be 16bit */ + + addr16[0] = (uint8_t)(addr>>8); /* 16 bit address must be in big endian format */ + addr16[1] = (uint8_t)(addr&0xff); + #endif + + res = McuGenericI2C_SelectSlave(McuEE24_DEVICE_ADDR(addr)); + if (res != ERR_OK) { + (void)McuGenericI2C_UnselectSlave(); + return res; + } + #if (McuEE24_CONFIG_DEVICE_ID==8) || (McuEE24_CONFIG_DEVICE_ID==16) + res = McuGenericI2C_WriteBlock(&addr8, 1, McuGenericI2C_DO_NOT_SEND_STOP); /* send 8bit address */ + #else /* use 16bit address */ + res = McuGenericI2C_WriteBlock(addr16, 2, McuGenericI2C_DO_NOT_SEND_STOP); /* send 16bit address */ + #endif + if (res != ERR_OK) { + (void)McuGenericI2C_UnselectSlave(); + return res; + } + res = McuGenericI2C_ReadBlock(data, 1, McuGenericI2C_SEND_STOP); /* read data byte from bus */ + if (res != ERR_OK) { + (void)McuGenericI2C_UnselectSlave(); + return res; + } + return McuGenericI2C_UnselectSlave(); +} + +/* +** =================================================================== +** Method : ReadBlock (component 24AA_EEPROM) +** +** Description : +** Read a block of memory. +** Parameters : +** NAME - DESCRIPTION +** addr - Address where to read the memory +** * data - Pointer to a buffer where to store the +** data +** dataSize - Size of buffer the data pointer +** is pointing to +** Returns : +** --- - Error code, possible values +** ERR_OK - OK +** otherwise it can return an error code of +** the underlying communication protocol. +** =================================================================== +*/ +uint8_t McuEE24_ReadBlock(McuEE24_Address addr, uint8_t *data, uint16_t dataSize) +{ + uint8_t res; + #if (McuEE24_CONFIG_DEVICE_ID==8) || (McuEE24_CONFIG_DEVICE_ID==16) + uint8_t addr8; + addr8 = (uint8_t)(addr&0xff); + #else + uint8_t addr16[2]; /* big endian address on I2C bus needs to be 16bit */ + addr16[0] = (uint8_t)(addr>>8); /* 16 bit address must be in big endian format */ + addr16[1] = (uint8_t)(addr&0xff); + #endif + + res = McuGenericI2C_SelectSlave(McuEE24_DEVICE_ADDR(addr)); + if (res != ERR_OK) { + (void)McuGenericI2C_UnselectSlave(); + return res; + } + #if (McuEE24_CONFIG_DEVICE_ID==8) || (McuEE24_CONFIG_DEVICE_ID==16) + res = McuGenericI2C_WriteBlock(&addr8, 1, McuGenericI2C_DO_NOT_SEND_STOP); /* send 8bit address */ + #else + res = McuGenericI2C_WriteBlock(addr16, 2, McuGenericI2C_DO_NOT_SEND_STOP); /* send 16bit address */ + #endif + if (res != ERR_OK) { + (void)McuGenericI2C_UnselectSlave(); + return res; + } + res = McuGenericI2C_ReadBlock(data, dataSize, McuGenericI2C_SEND_STOP); + if (res != ERR_OK) { + (void)McuGenericI2C_UnselectSlave(); + return res; + } + return McuGenericI2C_UnselectSlave(); +} + +/* +** =================================================================== +** Method : McuEE24_WriteBlockPage (component 24AA_EEPROM) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +#ifdef __HIWARE__ +#pragma MESSAGE DISABLE C1855 /* recursive function call */ +#endif +uint8_t McuEE24_WriteBlockPage(McuEE24_Address addr, uint8_t *data, uint16_t dataSize) +{ +#if McuEE24_CONFIG_USE_TIMEOUT +#if McuEE24_DO_ACKNOWLEDGE_POLLING && McuEE24_TIMEOUT_BLOCK_TICKS>0 + McuTimeout_CounterHandle timeout; + bool isTimeout; +#endif +#endif + uint8_t res, i, *p, block[McuEE24_CONFIG_BLOCK_BUF_SIZE+2]; /* additional 2 bytes for the address */ + uint16_t eepromPage = (uint16_t)(addr/McuEE24_PAGE_SIZE); + uint8_t offset = (uint8_t)(addr%McuEE24_PAGE_SIZE); + + if (dataSize==0 || dataSize>McuEE24_CONFIG_BLOCK_BUF_SIZE) { + return ERR_OVERFLOW; /* you may increase the buffer size in the properties? */ + } + if (dataSize>McuEE24_PAGE_SIZE) { + uint16_t size; + + size = (uint16_t)(McuEE24_PAGE_SIZE-offset); + if (size!=0) { + res = McuEE24_WriteBlock(addr, data, size); /* first page write */ + if (res != ERR_OK) { + return res; + } + data += size; /* increment data pointer */ + addr += size; /* increment address */ + dataSize -= size; /* reduce size */ + } + /* write multiple block of PAGE_SIZE */ + while (dataSize>McuEE24_PAGE_SIZE) { + res = McuEE24_WriteBlock(addr, data, McuEE24_PAGE_SIZE); + if (res != ERR_OK) { + return res; + } + data += McuEE24_PAGE_SIZE; /* increment data pointer */ + addr += McuEE24_PAGE_SIZE; /* increment address */ + dataSize -= McuEE24_PAGE_SIZE; /* reduce size */ + } + /* write remainder (if any) */ + if (dataSize>0) { + return McuEE24_WriteBlock(addr, data, dataSize); + } + return ERR_OK; + } + if (offset+dataSize <= McuEE24_PAGE_SIZE) { /* no page boundary crossing */ + res = McuGenericI2C_SelectSlave(McuEE24_DEVICE_ADDR(addr)); + if (res != ERR_OK) { + (void)McuGenericI2C_UnselectSlave(); + return res; + } + #if (McuEE24_CONFIG_DEVICE_ID==8) || (McuEE24_CONFIG_DEVICE_ID==16) + /* 8 bit address byte, high byte of address have been place in SelectSlave(addr) */ + block[0] = (uint8_t)(addr&0xff); /* low byte of address */ + p = &block[1]; i = (uint8_t)dataSize; + #else /* 16 bit address byte */ + block[0] = (uint8_t)(addr>>8); /* high byte of address */ + block[1] = (uint8_t)(addr&0xff); /* low byte of address */ + p = &block[2]; i = (uint8_t)dataSize; + #endif + + /* copy block */ + while(i>0) { + *p++ = *data++; + i--; + } + res = McuGenericI2C_WriteBlock(block, + dataSize+((McuEE24_CONFIG_DEVICE_ID==8)||(McuEE24_CONFIG_DEVICE_ID==16)? 1:2), McuGenericI2C_SEND_STOP); /* send address and data */ + if (res != ERR_OK) { + (void)McuGenericI2C_UnselectSlave(); + return res; + } +#if McuEE24_DO_ACKNOWLEDGE_POLLING + /* do acknowledge polling */ +#if McuEE24_CONFIG_USE_TIMEOUT +#if McuEE24_TIMEOUT_BLOCK_TICKS>0 + timeout = McuTimeout_GetCounter(McuEE24_TIMEOUT_BLOCK_TICKS); /* set up timeout counter */ + if (timeout==McuTimeout_OUT_OF_HANDLE) { + (void)McuGenericI2C_UnselectSlave(); + return ERR_OVERFLOW; + } +#endif +#endif + block[0] = 0xff; /* dummy value */ + do { + McuWait_WaitOSms(McuEE24_CONFIG_PAGE_WRITE_TIME_MS); + res = McuGenericI2C_ProbeACK(block, 1, McuGenericI2C_SEND_STOP, McuEE24_CONFIG_ACK_POLLING_TIME_US); /* send address and data */ +#if McuEE24_CONFIG_USE_TIMEOUT +#if McuEE24_TIMEOUT_BLOCK_TICKS>0 + isTimeout = McuTimeout_CounterExpired(timeout); + if (isTimeout) { + res = ERR_FAULT; + break; + } +#endif +#endif + } while(res!=ERR_OK); /* wait until we get an ACK */ +#if McuEE24_CONFIG_USE_TIMEOUT +#if McuEE24_TIMEOUT_BLOCK_TICKS>0 + McuTimeout_LeaveCounter(timeout); + if (isTimeout) { + res = ERR_FAILED; + } +#endif +#endif + if (res != ERR_OK) { + (void)McuGenericI2C_UnselectSlave(); + return res; + } +#endif /* McuEE24_CONFIg_DO_ACKNOWLEDGE_POLLING */ + return McuGenericI2C_UnselectSlave(); + } else { /* crossing page boundaries: make two page writes */ + res = McuEE24_WriteBlock(addr, data, (uint16_t)(McuEE24_PAGE_SIZE-offset)); /* first page write */ + if (res != ERR_OK) { + return res; + } + res = McuEE24_WriteBlock((McuEE24_Address)((eepromPage+1)*McuEE24_PAGE_SIZE), + data+(McuEE24_PAGE_SIZE-offset), + (uint16_t)(dataSize-(McuEE24_PAGE_SIZE-offset))); /* first page write */ + if (res != ERR_OK) { + return res; + } + } + return res; +} +#ifdef __HIWARE__ + #pragma MESSAGE DEFAULT C1855 /* recursive function call */ +#endif + +/* +** =================================================================== +** Method : WriteBlock (component 24AA_EEPROM) +** +** Description : +** Writes a block of data to the EEPROM +** Parameters : +** NAME - DESCRIPTION +** addr - Address of memory +** * data - Pointer to the data +** dataSize - Size of data +** Returns : +** --- - Error code, possible values +** ERR_OK - OK +** ERR_OVERFLOW - data block passed has either +** size of zero or exceeds internal buffer +** size +** otherwise it can return an error code of +** the underlying communication protocol. +** =================================================================== +*/ +uint8_t McuEE24_WriteBlock(McuEE24_Address addr, uint8_t *data, uint16_t dataSize) +{ + int32_t size; + + if (dataSize<=McuEE24_CONFIG_BLOCK_BUF_SIZE) { /* fits into internal buffer */ + return McuEE24_WriteBlockPage(addr, data, dataSize); + } + size = dataSize; + while(size>=McuEE24_CONFIG_BLOCK_BUF_SIZE) { /* write in chunks McuEE24_CONFIG_BLOCK_BUF_SIZE */ + if (McuEE24_WriteBlock(addr, data, McuEE24_CONFIG_BLOCK_BUF_SIZE)!=ERR_OK) { + return ERR_FAILED; + } + addr += McuEE24_CONFIG_BLOCK_BUF_SIZE; + data += McuEE24_CONFIG_BLOCK_BUF_SIZE; + size -= McuEE24_CONFIG_BLOCK_BUF_SIZE; + } + if (size>0) { /* write remainder which is < EE241_BLOCK_BUF_SIZE */ + if (McuEE24_WriteBlockPage(addr, data, size)!=ERR_OK) { + return ERR_FAILED; + } + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : Test (component 24AA_EEPROM) +** +** Description : +** Test routine to test the driver. Note that this routine +** writes to the EEPROM! +** Parameters : None +** Returns : +** --- - Error code, possible values +** ERR_OK - OK +** ERR_FAULT - Test failed +** =================================================================== +*/ +#include /* for strcmp() */ +static void Err(void) { + static uint8_t errCnt = 0; + + errCnt++; +} + +uint8_t McuEE24_Test(void) +{ + uint8_t res, val, data[16]; + + res = McuEE24_WriteByte(0x0000, 0); + if (res != ERR_OK) { + Err(); + return res; + } + res = McuEE24_WriteByte(0x0001, 1); + if (res != ERR_OK) { + Err(); + return res; + } + res = McuEE24_WriteByte(0x0002, 2); + if (res != ERR_OK) { + Err(); + return res; + } + res = McuEE24_WriteByte(0x0003, 3); + if (res != ERR_OK) { + Err(); + return res; + } + res = McuEE24_WriteByte(0x0004, 4); + if (res != ERR_OK) { + Err(); + return res; + } + res = McuEE24_WriteByte(0x0010, 5); + if (res != ERR_OK) { + Err(); + return res; + } + + res = McuEE24_ReadByte(0x0000, &val); + if (res != ERR_OK) { + Err(); + return res; + } + if (val != 0) { + Err(); + return ERR_FAULT; + } + res = McuEE24_ReadByte(0x0001, &val); + if (res != ERR_OK) { + Err(); + return res; + } + if (val != 1) { + Err(); + return ERR_FAULT; + } + res = McuEE24_ReadByte(0x0002, &val); + if (res != ERR_OK) { + Err(); + return res; + } + if (val != 2) { + Err(); + return ERR_FAULT; + } + res = McuEE24_ReadByte(0x0003, &val); + if (res != ERR_OK) { + Err(); + return res; + } + if (val != 3) { + Err(); + return ERR_FAULT; + } + res = McuEE24_ReadByte(0x0004, &val); + if (res != ERR_OK) { + Err(); + return res; + } + if (val != 4) { + Err(); + return ERR_FAULT; + } + res = McuEE24_ReadByte(0x0010, &val); + if (res != ERR_OK) { + Err(); + return res; + } + if (val != 5) { + Err(); + return ERR_FAULT; + } + res = McuEE24_WriteBlock(0x10, (uint8_t*)"Hello", sizeof("Hello")); + if (res != ERR_OK) { + Err(); + return res; + } + res = McuEE24_ReadBlock(0x10, data, sizeof(data)); + if (res != ERR_OK) { + Err(); + return res; + } + if (strcmp((char*)"Hello", (char*)data) != 0) { + Err(); + return ERR_FAULT; + } + /* testing crossing page boundary */ + res = McuEE24_WriteBlock(McuEE24_PAGE_SIZE-5, (uint8_t*)"Hello World!", sizeof("Hello World!")); + if (res != ERR_OK) { + Err(); + return res; + } + res = McuEE24_ReadBlock(McuEE24_PAGE_SIZE-5, data, sizeof(data)); + if (res != ERR_OK) { + Err(); + return res; + } + if (strcmp((char*)"Hello World!", (char*)data) != 0) return ERR_FAULT; +#if McuEE24_CONFIG_DEVICE_ID==1025 + /* testing writing to second bank */ + res = McuEE24_WriteBlock(0x10005, (uint8_t*)"Hello bank 1!", sizeof("Hello bank 1!")); + if (res != ERR_OK) { + Err(); + return res; + } + res = McuEE24_ReadBlock(0x10005, data,(uint8_t*) sizeof(data)); + if (res != ERR_OK) { + Err(); + return res; + } + if (strcmp((char*)"Hello bank 1!", (char*)data) != 0) { + Err(); + return ERR_FAULT; + } +#endif + return ERR_OK; +} + +/* +** =================================================================== +** Method : WriteProtect (component 24AA_EEPROM) +** +** Description : +** Prevents writing to the memory. Read operations are not +** affected. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuEE24_WriteProtect(void) +{ +#if McuEE24_CONFIG_HAS_WP_PIN + WPpin1_SetVal(); /* Tie pin to Vcc/High level to protect the memory */ +#endif +} + +/* +** =================================================================== +** Method : WriteUnprotect (component 24AA_EEPROM) +** +** Description : +** Allows writing to the memory +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuEE24_WriteUnprotect(void) +{ +#if McuEE24_CONFIG_HAS_WP_PIN + WPpin1_ClrVal(); /* Tie pin to Vss/Low level to allow writing to the memory */ +#endif +} + +/* +** =================================================================== +** Method : SelectDevice (component 24AA_EEPROM) +** +** Description : +** Configures the I2C address to be used for the memory. With +** this multiple devices attached to the bus can be addressed. +** Parameters : +** NAME - DESCRIPTION +** addrI2C - I2C Address of the memory device, +** formed by the address pins. +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_VALUE - address exceeds address pins of +** device type used +** =================================================================== +*/ +uint8_t McuEE24_SelectDevice(uint8_t addrI2C) +{ + if (addrI2C>McuEE24_MAX_I2C_ADDR_MASK) { + return ERR_VALUE; /* Device address too large for device address pins available. */ + } + McuEE24_I2CAddress = addrI2C; + return ERR_OK; +} + +/* +** =================================================================== +** Method : GetSelectedDevice (component 24AA_EEPROM) +** +** Description : +** Returns the currently used I2C address (e.g. set with +** SelectDevice()). +** Parameters : None +** Returns : +** --- - I2C device address +** =================================================================== +*/ +uint8_t McuEE24_GetSelectedDevice(void) +{ + return McuEE24_I2CAddress; +} + +/* +** =================================================================== +** Method : ParseCommand (component 24AA_EEPROM) +** +** Description : +** Shell Command Line parser. This method is enabled/disabled +** depending on if you have the Shell enabled/disabled in the +** properties. +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command string +** * handled - Pointer to variable which tells if +** the command has been handled or not +** * io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuEE24_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) +{ + const unsigned char *p; + uint16_t addr16; + uint8_t val8, buf[8]; + + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, "McuEE24 help")==0) { + *handled = TRUE; + return PrintHelp(io); + } else if ((McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) || (McuUtility_strcmp((char*)cmd, "McuEE24 status")==0)) { + *handled = TRUE; + return PrintStatus(io); + } else if (McuUtility_strncmp((char*)cmd, (char*)"McuEE24 read ", sizeof("McuEE24 read ")-1)==0) { + p = cmd+sizeof("McuEE24 read ")-1; + if (McuUtility_ScanHex16uNumber(&p, &addr16)==ERR_OK) { + if (McuEE24_ReadByte(addr16, &val8)==ERR_OK) { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), val8); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStr(buf, io->stdOut); + } else { + McuShell_SendStr((unsigned char*)"**** read failed!\r\n", io->stdErr); + } + } else { + McuShell_SendStr((unsigned char*)"**** wrong address\r\n", io->stdErr); + } + *handled = TRUE; + } else if (McuUtility_strncmp((char*)cmd, (char*)"McuEE24 write ", sizeof("McuEE24 write ")-1)==0) { + p = cmd+sizeof("McuEE24 write ")-1; + if (McuUtility_ScanHex16uNumber(&p, &addr16)==ERR_OK) { + if (McuUtility_ScanHex8uNumber(&p, &val8)==ERR_OK) { + if (McuEE24_WriteByte(addr16, val8)!=ERR_OK) { + McuShell_SendStr((unsigned char*)"**** write failed!\r\n", io->stdErr); + } + } else { + McuShell_SendStr((unsigned char*)"**** wrong value\r\n", io->stdErr); + } + } else { + McuShell_SendStr((unsigned char*)"**** wrong address\r\n", io->stdErr); + } + *handled = TRUE; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : Deinit (component 24AA_EEPROM) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuEE24_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component 24AA_EEPROM) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuEE24_Init(void) +{ + /* nothing needed */ +} + +/* END McuEE24. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuEE24.h b/TSM_PicoW_Sensor/McuLib/src/McuEE24.h new file mode 100644 index 0000000..c476973 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuEE24.h @@ -0,0 +1,357 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuEE24.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : 24AA_EEPROM +** Version : Component 01.042, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2021-04-18, 20:37, # CodeGen: 733 +** Abstract : +** Driver for Microchip 24_AA/LC EEPROMs +** Settings : +** Component name : McuEE24 +** SDK : McuLib +** Device Type : 8 +** Initial I2C Device Address Bits : 0x0 +** Block buffer size : 32 +** Acknowledge Polling : Enabled +** Page Write Time (ms) : 5 +** Wait : McuWait +** ACK Polling Time (us) : 100 +** Connection : +** I2C : McuGenericI2C +** Write Protection Pin : Enabled +** WP : SDK_BitIO +** Timeout : Enabled +** Timeout : McuTimeout +** Timeout Byte (ms) : 10 +** Timeout Block (ms) : 60 +** Shell : Enabled +** Shell : McuShell +** Utility : McuUtility +** Contents : +** ReadByte - uint8_t McuEE24_ReadByte(McuEE24_Address addr, uint8_t *data); +** WriteByte - uint8_t McuEE24_WriteByte(McuEE24_Address addr, uint8_t data); +** ReadBlock - uint8_t McuEE24_ReadBlock(McuEE24_Address addr, uint8_t *data, uint16_t... +** WriteBlock - uint8_t McuEE24_WriteBlock(McuEE24_Address addr, uint8_t *data, uint16_t... +** WriteProtect - void McuEE24_WriteProtect(void); +** WriteUnprotect - void McuEE24_WriteUnprotect(void); +** SelectDevice - uint8_t McuEE24_SelectDevice(uint8_t addrI2C); +** GetSelectedDevice - uint8_t McuEE24_GetSelectedDevice(void); +** Test - uint8_t McuEE24_Test(void); +** ParseCommand - uint8_t McuEE24_ParseCommand(const unsigned char *cmd, bool *handled, const... +** Deinit - void McuEE24_Deinit(void); +** Init - void McuEE24_Init(void); +** +** * Copyright (c) 2013-2021, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuEE24.h +** @version 01.00 +** @brief +** Driver for Microchip 24_AA/LC EEPROMs +*/ +/*! +** @addtogroup McuEE24_module McuEE24 module documentation +** @{ +*/ + +#ifndef __McuEE24_H +#define __McuEE24_H + +/* MODULE McuEE24. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuEE24config.h" /* configuration */ + +#if McuEE24_CONFIG_USE_SHELL + #include "McuShell.h" +#endif + + +#if McuEE24_CONFIG_DEVICE_ID==8 + #define McuEE24_MAX_I2C_ADDR_MASK 0 /* A2|A1|A0 are not used */ + #define McuEE24_MAX_ADDRESS 0x03FF /* 8 kBit is 1KByte */ + #define McuEE24_ADDRT uint16_t /* a word/16bit is enough to hold the address */ + #define McuEE24_PAGE_SIZE 16 /* maximum page size (for page/block operation) */ +#elif McuEE24_CONFIG_DEVICE_ID==16 + #define McuEE24_MAX_I2C_ADDR_MASK 0 /* A2|A1|A0 are not used */ + #define McuEE24_MAX_ADDRESS 0x07FF /* 16 kBit is 2KByte */ + #define McuEE24_ADDRT uint16_t /* a word/16bit is enough to hold the address */ + #define McuEE24_PAGE_SIZE 16 /* maximum page size (for page/block operation) */ +#elif McuEE24_CONFIG_DEVICE_ID==32 + #define McuEE24_MAX_I2C_ADDR_MASK 7 /* A2|A1|A0 form the I2C device address => address cannot be more than 7 (8 devices) */ + #define McuEE24_MAX_ADDRESS 0x0FFF /* 32 kBit are 4KByte */ + #define McuEE24_ADDRT uint16_t /* a word/16bit is enough to hold the address */ + #define McuEE24_PAGE_SIZE 8 /* maximum page size (for page/block operation) */ +#elif McuEE24_CONFIG_DEVICE_ID==256 + #define McuEE24_MAX_I2C_ADDR_MASK 7 /* A2|A1|A0 form the I2C device address => address cannot be more than 7 (8 devices) */ + #define McuEE24_MAX_ADDRESS 0x7FFF /* 256 kBit are 32KByte */ + #define McuEE24_ADDRT uint16_t /* a word/16bit is enough to hold the address */ + #define McuEE24_PAGE_SIZE 64 /* maximum page size (for page/block operation) */ +#elif McuEE24_CONFIG_DEVICE_ID==512 + #define McuEE24_MAX_I2C_ADDR_MASK 7 /* A2|A1|A0 form the I2C device address => address cannot be more than 7 (8 devices) */ + #define McuEE24_MAX_ADDRESS 0xFFFF /* 512 kBit are 64KByte */ + #define McuEE24_ADDRT uint16_t /* a word/16bit is enough to hold the address */ + #define McuEE24_PAGE_SIZE 128 /* maximum page size (for page/block operation) */ +#elif McuEE24_CONFIG_DEVICE_ID==1025 + #define McuEE24_MAX_I2C_ADDR_MASK 3 /* A1|A0 form the I2C device address => address cannot be more than 3 (4 devices) */ + #define McuEE24_MAX_ADDRESS 0x1FFFF /* 1024 kBit are 128KByte */ + #define McuEE24_ADDRT uint32_t /* a longword/32bit is needed to hold the address */ + #define McuEE24_PAGE_SIZE 128 /* maximum page size (for page/block operation) */ +#else + #error "unknown device?" +#endif + +#ifndef __BWUserType_McuEE24_Address +#define __BWUserType_McuEE24_Address + typedef McuEE24_ADDRT McuEE24_Address; /* A type large enought to hold the address, depending on the EEPROM used. */ +#endif + +#define McuEE24_PARSE_COMMAND_ENABLED 1 /* set to 1 if method ParseCommand() is present, 0 otherwise */ + +uint8_t McuEE24_WriteByte(McuEE24_Address addr, uint8_t data); +/* +** =================================================================== +** Method : WriteByte (component 24AA_EEPROM) +** +** Description : +** Writes a single byte to specified address +** Parameters : +** NAME - DESCRIPTION +** addr - The address inside the EEPROM +** data - The data value to write +** Returns : +** --- - Error code, possible values +** ERR_OK - OK +** otherwise it can return an error code of +** the underlying communication protocol. +** =================================================================== +*/ + +uint8_t McuEE24_ReadByte(McuEE24_Address addr, uint8_t *data); +/* +** =================================================================== +** Method : ReadByte (component 24AA_EEPROM) +** +** Description : +** Reads a single byte from the given memory address +** Parameters : +** NAME - DESCRIPTION +** addr - The address where to read from memory. +** * data - Pointer to a location where to store the +** data +** Returns : +** --- - Error code, possible values +** ERR_OK - OK +** otherwise it can return an error code of +** the underlying communication protocol. +** =================================================================== +*/ + +uint8_t McuEE24_ReadBlock(McuEE24_Address addr, uint8_t *data, uint16_t dataSize); +/* +** =================================================================== +** Method : ReadBlock (component 24AA_EEPROM) +** +** Description : +** Read a block of memory. +** Parameters : +** NAME - DESCRIPTION +** addr - Address where to read the memory +** * data - Pointer to a buffer where to store the +** data +** dataSize - Size of buffer the data pointer +** is pointing to +** Returns : +** --- - Error code, possible values +** ERR_OK - OK +** otherwise it can return an error code of +** the underlying communication protocol. +** =================================================================== +*/ + +uint8_t McuEE24_WriteBlock(McuEE24_Address addr, uint8_t *data, uint16_t dataSize); +/* +** =================================================================== +** Method : WriteBlock (component 24AA_EEPROM) +** +** Description : +** Writes a block of data to the EEPROM +** Parameters : +** NAME - DESCRIPTION +** addr - Address of memory +** * data - Pointer to the data +** dataSize - Size of data +** Returns : +** --- - Error code, possible values +** ERR_OK - OK +** ERR_OVERFLOW - data block passed has either +** size of zero or exceeds internal buffer +** size +** otherwise it can return an error code of +** the underlying communication protocol. +** =================================================================== +*/ + +uint8_t McuEE24_Test(void); +/* +** =================================================================== +** Method : Test (component 24AA_EEPROM) +** +** Description : +** Test routine to test the driver. Note that this routine +** writes to the EEPROM! +** Parameters : None +** Returns : +** --- - Error code, possible values +** ERR_OK - OK +** ERR_FAULT - Test failed +** =================================================================== +*/ + +void McuEE24_WriteProtect(void); +/* +** =================================================================== +** Method : WriteProtect (component 24AA_EEPROM) +** +** Description : +** Prevents writing to the memory. Read operations are not +** affected. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuEE24_WriteUnprotect(void); +/* +** =================================================================== +** Method : WriteUnprotect (component 24AA_EEPROM) +** +** Description : +** Allows writing to the memory +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuEE24_SelectDevice(uint8_t addrI2C); +/* +** =================================================================== +** Method : SelectDevice (component 24AA_EEPROM) +** +** Description : +** Configures the I2C address to be used for the memory. With +** this multiple devices attached to the bus can be addressed. +** Parameters : +** NAME - DESCRIPTION +** addrI2C - I2C Address of the memory device, +** formed by the address pins. +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_VALUE - address exceeds address pins of +** device type used +** =================================================================== +*/ + +uint8_t McuEE24_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : ParseCommand (component 24AA_EEPROM) +** +** Description : +** Shell Command Line parser. This method is enabled/disabled +** depending on if you have the Shell enabled/disabled in the +** properties. +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command string +** * handled - Pointer to variable which tells if +** the command has been handled or not +** * io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuEE24_GetSelectedDevice(void); +/* +** =================================================================== +** Method : GetSelectedDevice (component 24AA_EEPROM) +** +** Description : +** Returns the currently used I2C address (e.g. set with +** SelectDevice()). +** Parameters : None +** Returns : +** --- - I2C device address +** =================================================================== +*/ + +uint8_t McuEE24_WriteBlockPage(McuEE24_Address addr, uint8_t *data, uint16_t dataSize); +/* +** =================================================================== +** Method : McuEE24_WriteBlockPage (component 24AA_EEPROM) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ + +void McuEE24_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component 24AA_EEPROM) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuEE24_Init(void); +/* +** =================================================================== +** Method : Init (component 24AA_EEPROM) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuEE24. */ + +#endif +/* ifndef __McuEE24_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuESP32.c b/TSM_PicoW_Sensor/McuLib/src/McuESP32.c new file mode 100644 index 0000000..cae9cd7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuESP32.c @@ -0,0 +1,578 @@ +/* + * Copyright (c) 2019, Erich Styger + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuESP32config.h" +#if McuESP32_CONFIG_SHELL_UART!=McuShellUart_CONFIG_UART_NONE +#include "McuESP32.h" +#include "McuGPIO.h" +#include "McuRTOS.h" +#include "McuUtility.h" +#include "McuWait.h" +#include "McuLog.h" +#include "McuShellUart.h" +#if McuESP32_CONFIG_USE_USB_CDC + #include "virtual_com.h" +#endif + +#if McuESP32_CONFIG_USE_CTRL_PINS + static McuGPIO_Handle_t McuESP32_RF_EN_Pin; /* pin pulled LOW to reset the module */ + static McuGPIO_Handle_t McuESP32_RF_IO0_Pin; /* pin pulled LOW to enable programming mode */ +#endif +static QueueHandle_t uartRxQueue; /* Rx from ESP32 module */ +#define McuESP32_UART_RX_QUEUE_LENGTH (4096) +static QueueHandle_t uartTxQueue; /* Tx to ESP32 module */ +#define McuESP32_UART_TX_QUEUE_LENGTH (4096) + +#if McuESP32_CONFIG_USE_USB_CDC + typedef enum McuESP32_USB_PrgMode_e { + McuESP32_USB_PRG_MODE_AUTO, + McuESP32_USB_PRG_MODE_ON, + McuESP32_USB_PRG_MODE_OFF, + } McuESP32_USB_PrgMode_e; + static McuESP32_USB_PrgMode_e McuESP32_UsbPrgMode = McuESP32_USB_PRG_MODE_AUTO; + static bool McuESP32_IsProgramming = false; /* if we are currently programming the ESP32 */ + static bool McuESP32_ScheduleReset = true; /* do an initial reset at restart time */ +#endif +static bool McuESP32_CopyUartToShell = true; /* if we copy the ESP32 UART to the Shell */ + +/* Below is the I/O handler for the console: data from the ESP is sent to that stdout (e.g. shell console). + * Optionally with McuESP32_CONFIG_USE_USB_CDC enabled all CDC data is sent to the ESP32 as well. + */ +static McuShell_ConstStdIOType *McuESP32_RxFromESPStdIO = NULL; /* can be overwritten with McuESP32_SetRxFromESPStdio(); */ + +void McuESP32_SetRxFromESPStdio(McuShell_ConstStdIOTypePtr stdio) { + McuESP32_RxFromESPStdIO = stdio; +} + +McuShell_ConstStdIOTypePtr McuESP32_GetRxFromESPStdio(void) { + return McuESP32_RxFromESPStdIO; +} + +#if McuESP32_CONFIG_USE_CTRL_PINS +static void AssertReset(void) { + McuGPIO_SetAsOutput(McuESP32_RF_EN_Pin, false); /* output, LOW */ +} +#endif + +#if McuESP32_CONFIG_USE_CTRL_PINS +static void DeassertReset(void) { + McuGPIO_SetAsInput(McuESP32_RF_EN_Pin); +} +#endif + +#if McuESP32_CONFIG_USE_CTRL_PINS +static void DoReset(void) { + AssertReset(); + vTaskDelay(pdMS_TO_TICKS(1)); + DeassertReset(); +} +#endif + +#if McuESP32_CONFIG_USE_CTRL_PINS +static void AssertBootloaderMode(void) { + McuGPIO_SetAsOutput(McuESP32_RF_IO0_Pin, false); /* output, LOW */ +} +#endif + +#if McuESP32_CONFIG_USE_CTRL_PINS +static void DeassertBootloaderMode(void) { + McuGPIO_SetAsInput(McuESP32_RF_IO0_Pin); +} +#endif + +#if McuESP32_CONFIG_USE_USB_CDC +/* idf.py flash sequence: + * + * 00> State: 3, DtrRts: 3 + + * 00> State: 2, DtrRts: 1 + * 00> State: 3, DtrRts: 3 + * 00> State: 1, DtrRts: 2 + * 00> State: 0, DtrRts: 0 + + * 00> State: 2, DtrRts: 1 + * 00> State: 3, DtrRts: 3 + * 00> State: 1, DtrRts: 2 + * 00> State: 0, DtrRts: 0 + * + * reset at the end: + * 00> State: 2, DtrRts: 1 + * 00> State: 0, DtrRts: 0 + */ + +void McuESP32_UartState_Callback(uint8_t state) { /* callback for DTR and RTS lines */ + static uint8_t prevState = -1; + static uint8_t prevPrevState = -1; + uint8_t DtrRts; + +#if McuESP32_CONFIG_VERBOSE_CONTROL_SIGNALS + McuLog_trace("state: %d, prev: %d, prevprev: %d", state, prevState, prevPrevState); +#endif + if (state != prevState) { + if (McuESP32_UsbPrgMode==McuESP32_USB_PRG_MODE_AUTO || McuESP32_UsbPrgMode==McuESP32_USB_PRG_MODE_ON) { + /* + * DTR RTS EN GPIO0 + * 1 1 1 1 + * 0 0 1 1 + * 1 0 0 0 + * 0 1 1 0 + */ + DtrRts = 0; + if ((state&1)==1) { /* DTR */ + DtrRts |= 2; /* DTR set */ + } + if ((state&2)==2) { /* DTR */ + DtrRts |= 1; /* RTS set */ + } + #if McuESP32_CONFIG_VERBOSE_CONTROL_SIGNALS + McuLog_trace("State: %d, DtrRts: %d", state, DtrRts); + #endif + switch(DtrRts) { + default: + case 0: + DeassertReset(); + McuWait_Waitus(100); /* block for a short time (in the ISR!!!) ==> should have a 100 uF added to the reset line */ + DeassertBootloaderMode(); +#if McuESP32_CONFIG_VERBOSE_CONTROL_SIGNALS + McuLog_trace("Release both: %d", DtrRts); +#endif + break; + case 1: + AssertBootloaderMode(); +#if McuESP32_CONFIG_VERBOSE_CONTROL_SIGNALS + McuLog_trace("assert BL: %d", DtrRts); +#endif + break; + case 2: + if (McuGPIO_IsLow(McuESP32_RF_EN_Pin)) { + if (McuGPIO_IsLow(McuESP32_RF_IO0_Pin)) { + McuESP32_IsProgramming = true; /* the DeassertReset() below will enter bootloader mode */ +#if McuESP32_CONFIG_VERBOSE_CONTROL_SIGNALS + McuLog_trace("Enter Bootloader Mode"); +#endif + } else { + McuESP32_IsProgramming = false; /* the DeassertReset() below will do a reset without bootloader */ +#if McuESP32_CONFIG_VERBOSE_CONTROL_SIGNALS + McuLog_trace("Reset"); +#endif + } + } + DeassertReset(); + McuWait_Waitus(100); /* block for a short time (in the ISR!!!) ==> should have a 100 uF added to the reset line */ +#if McuESP32_CONFIG_VERBOSE_CONTROL_SIGNALS + McuLog_trace("release reset: %d", DtrRts); +#endif + break; + case 3: + AssertReset(); + //McuLog_trace("assert reset: %d", DtrRts); + break; + } /* switch */ + if (state==0 && prevState==2 && prevPrevState==0) { + // reset sequence with idf.py and Arduino IDE: + // State: 0 DtrRts: 0 Release both: 0 + // State: 2 DtrRts: 1 assert BL: 1 + // State: 0 DtrRts: 0 Release both: 0 +#if McuESP32_CONFIG_VERBOSE_CONTROL_SIGNALS + McuLog_info("Request Reset"); +#endif + McuESP32_ScheduleReset = true; /* cannot do reset sequence here, as called from an interrupt, so we cannot block */ + McuESP32_IsProgramming = false; + } + } + prevPrevState = prevState; + prevState = state; + } /* if state!=prevState */ +} +#endif + +/*********************************************************************************************************/ +/* Stdio Handler for sending text to the ESP32 */ +static void QueueTxChar(unsigned char ch) { + (void)xQueueSendToBack(uartTxQueue, &ch, 0); /* put it back in to the Tx queue */ +} + +static void Dummy_ReadChar(uint8_t *c) { + *c = '\0'; /* nothing received */ +} + +static bool Dummy_CharPresent(void) { + return false; +} + +/* for sending data to the ESP32 (tx only) */ +static const McuShell_ConstStdIOType McuESP32_Tx_stdio = { + .stdIn = (McuShell_StdIO_In_FctType)Dummy_ReadChar, + .stdOut = (McuShell_StdIO_OutErr_FctType)QueueTxChar, + .stdErr = (McuShell_StdIO_OutErr_FctType)QueueTxChar, + .keyPressed = Dummy_CharPresent, /* if input is not empty */ + #if McuShell_CONFIG_ECHO_ENABLED + .echoEnabled = false, + #endif + }; + +McuShell_ConstStdIOTypePtr McuESP32_GetTxToESPStdio(void) { + return &McuESP32_Tx_stdio; +} +/*********************************************************************************************************/ +void McuESP32_CONFIG_UART_IRQ_HANDLER(void) { + uint8_t data; + uint32_t flags=0; + BaseType_t xHigherPriorityTaskWoken; + + flags = McuESP32_CONFIG_UART_GET_FLAGS(McuESP32_CONFIG_UART_DEVICE); + /* If new data arrived. */ + if (flags&McuESP32_CONFIG_UART_HW_RX_READY_FLAGS) { + data = McuESP32_CONFIG_UART_READ_BYTE(McuESP32_CONFIG_UART_DEVICE); + (void)xQueueSendFromISR(uartRxQueue, &data, &xHigherPriorityTaskWoken); + if (xHigherPriorityTaskWoken != pdFALSE) { + __DSB(); + vPortYieldFromISR(); + } + } + __DSB(); +} + +static uint8_t McuESP32_PrintHelp(const McuShell_StdIOType *io) { + McuShell_SendHelpStr((unsigned char*)"esp32", (unsigned char*)"Group of ESP32 WiFi module commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Shows ESP32 help or status\r\n", io->stdOut); +#if McuESP32_CONFIG_USE_CTRL_PINS + McuShell_SendHelpStr((unsigned char*)" reset", (unsigned char*)"Perform reset sequence\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" assert|deassart reset", (unsigned char*)"Assert or deassert reset pin\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" assert|deassart bl", (unsigned char*)"Assert or deassert bootloader pin\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" prg start|stop", (unsigned char*)"Start and stop programming sequence\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" uarttoshell on|off", (unsigned char*)"Copy UART Rx to Shell\r\n", io->stdOut); +#if McuESP32_CONFIG_USE_USB_CDC + McuShell_SendHelpStr((unsigned char*)" usbprg auto|on|off", (unsigned char*)"Use USB CDC to UART for programming\r\n", io->stdOut); +#endif +#endif + McuShell_SendHelpStr((unsigned char*)" send ", (unsigned char*)"Send a command or string to the ESP32 (non-blocking), can be double quoted\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" sendwait ", (unsigned char*)"Send a command or string to the ESP32 and wait ms time for the response, cmd can be double quoted\r\n", io->stdOut); + return ERR_OK; +} + +static uint8_t McuESP32_PrintStatus(const McuShell_StdIOType *io) { +#if McuESP32_CONFIG_USE_CTRL_PINS || McuESP32_CONFIG_USE_USB_CDC + uint8_t buf[64]; +#endif + + McuShell_SendStatusStr((unsigned char*)"esp32", (unsigned char*)"ESP32 status\r\n", io->stdOut); +#if McuESP32_CONFIG_USE_CTRL_PINS + McuGPIO_GetPinStatusString(McuESP32_RF_EN_Pin, buf, sizeof(buf)); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" EN", buf, io->stdOut); + + McuGPIO_GetPinStatusString(McuESP32_RF_IO0_Pin, buf, sizeof(buf)); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" IO0", buf, io->stdOut); +#endif +#if McuESP32_CONFIG_USE_USB_CDC + if (McuESP32_UsbPrgMode==McuESP32_USB_PRG_MODE_ON) { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"on"); + if (McuESP32_CopyUartToShell) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)", nothing will be copied to shell.\r\n"); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + } + } else if (McuESP32_UsbPrgMode==McuESP32_USB_PRG_MODE_AUTO) { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"auto\r\n"); + } else if (McuESP32_UsbPrgMode==McuESP32_USB_PRG_MODE_OFF) { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"off\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ERROR\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" usbprg", buf, io->stdOut); + McuShell_SendStatusStr((unsigned char*)" programming", McuESP32_IsProgramming?(unsigned char*)"yes\r\n":(unsigned char*)"no\r\n", io->stdOut); +#endif + + McuShell_SendStatusStr((unsigned char*)" uarttoshell", McuESP32_CopyUartToShell?(unsigned char*)"on\r\n":(unsigned char*)"off\r\n", io->stdOut); + return ERR_OK; +} + +uint8_t McuESP32_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) { + unsigned char cmd_buffer[McuShell_CONFIG_DEFAULT_SHELL_BUFFER_SIZE]; + const unsigned char *p; + + if (McuUtility_strcmp((char*)cmd, (char*)McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, (char*)"esp32 help")==0) { + *handled = true; + return McuESP32_PrintHelp(io); + } else if (McuUtility_strcmp((char*)cmd, (char*)McuShell_CMD_STATUS)==0 || McuUtility_strcmp((char*)cmd, (char*)"esp32 status")==0) { + *handled = true; + return McuESP32_PrintStatus(io); +#if McuESP32_CONFIG_USE_CTRL_PINS + } else if (McuUtility_strcmp((char*)cmd, (char*)"esp32 reset")==0) { + *handled = true; + DoReset(); + return ERR_OK; + } else if (McuUtility_strcmp((char*)cmd, (char*)"esp32 prg start")==0) { + /* pulling prg pin low, followed by a reset */ + *handled = true; + AssertBootloaderMode(); /* pull prg pin low: during reset, device will enter serial programming mode */ + vTaskDelay(pdMS_TO_TICKS(1)); + DoReset(); + vTaskDelay(pdMS_TO_TICKS(1)); + DeassertBootloaderMode(); + return ERR_OK; + } else if (McuUtility_strcmp((char*)cmd, (char*)"esp32 prg stop")==0) { + /* release prg pin, followed by a reset */ + *handled = true; + DeassertBootloaderMode(); /* return prg pin to high (normal) again */ + vTaskDelay(pdMS_TO_TICKS(1)); + DoReset(); + return ERR_OK; + } else if (McuUtility_strcmp((char*)cmd, (char*)"esp32 assert bl")==0) { + *handled = true; + AssertBootloaderMode(); + return ERR_OK; + } else if (McuUtility_strcmp((char*)cmd, (char*)"esp32 deassert bl")==0) { + *handled = true; + DeassertBootloaderMode(); + return ERR_OK; + } else if (McuUtility_strcmp((char*)cmd, (char*)"esp32 assert reset")==0) { + *handled = true; + AssertReset(); + return ERR_OK; + } else if (McuUtility_strcmp((char*)cmd, (char*)"esp32 deassert reset")==0) { + *handled = true; + DeassertReset(); + return ERR_OK; +#endif + } else if (McuUtility_strcmp((char*)cmd, (char*)"esp32 uarttoshell on")==0) { + *handled = true; + McuESP32_CopyUartToShell = true; + return ERR_OK; + } else if (McuUtility_strcmp((char*)cmd, (char*)"esp32 uarttoshell off")==0) { + *handled = true; + McuESP32_CopyUartToShell = false; + return ERR_OK; +#if McuESP32_CONFIG_USE_USB_CDC + } else if (McuUtility_strcmp((char*)cmd, (char*)"esp32 usbprg auto")==0) { + *handled = true; + McuESP32_UsbPrgMode = McuESP32_USB_PRG_MODE_AUTO; + McuESP32_IsProgramming = false; + return ERR_OK; + } else if (McuUtility_strcmp((char*)cmd, (char*)"esp32 usbprg on")==0) { + *handled = true; + McuESP32_UsbPrgMode = McuESP32_USB_PRG_MODE_ON; + McuESP32_IsProgramming = true; + return ERR_OK; + } else if (McuUtility_strcmp((char*)cmd, (char*)"esp32 usbprg off")==0) { + *handled = true; + McuESP32_UsbPrgMode = McuESP32_USB_PRG_MODE_OFF; + McuESP32_IsProgramming = false; + return ERR_OK; +#endif + } else if (McuUtility_strncmp((char*)cmd, (char*)"esp32 send ", sizeof("esp32 send ")-1)==0) { + *handled = true; + p = cmd+sizeof("esp32 send ")-1; + if (*p=='"') { /* double-quoted command: it can contain multiple commands */ + if (McuUtility_ScanDoubleQuotedString(&p, cmd_buffer, sizeof(cmd_buffer))!=ERR_OK) { + return ERR_FAILED; + } + p = cmd_buffer; + } + McuShell_SendStr(p, McuESP32_GetTxToESPStdio()->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", McuESP32_GetTxToESPStdio()->stdOut); + return ERR_OK; + } else if (McuUtility_strncmp((char*)cmd, (char*)"esp32 sendwait ", sizeof("esp32 sendwait ")-1)==0) { + /* this sends a command, but captures output with a timeout so it can show it on the io used for the command, e.g. on RTT */ + uint32_t ms; + + *handled = true; + p = cmd+sizeof("esp32 sendwait ")-1; + if (McuUtility_ScanDecimal32uNumber(&p, &ms)!=ERR_OK) { + return ERR_FAILED; + } + while(*p==' ') { + p++; /* skip spaces */ + } + if (*p=='"') { /* double-quoted command: it can contain multiple commands */ + if (McuUtility_ScanDoubleQuotedString(&p, cmd_buffer, sizeof(cmd_buffer))!=ERR_OK) { + return ERR_FAILED; + } + p = cmd_buffer; + } + /* send command string: temporarily change where the response from the ESP32 goes to */ + McuShell_ConstStdIOType *prevIO; + + prevIO = McuESP32_GetRxFromESPStdio(); /* get current I/O */ + McuESP32_SetRxFromESPStdio(io); /* set current shell I/O as output channel for what's coming from the ESP */ + McuShell_SendStr(p, McuESP32_GetTxToESPStdio()->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", McuESP32_GetTxToESPStdio()->stdOut); + vTaskDelay(pdMS_TO_TICKS(ms)); /* wait for the ESP to send the response */ + McuESP32_SetRxFromESPStdio(prevIO); /* restore previous io */ + + return ERR_OK; + } + return ERR_OK; +} + +static void UartRxTask(void *pv) { /* task handling characters sent by the ESP32 module and coming from the UART of the ESP32 */ + unsigned char ch; + BaseType_t res; + McuShell_ConstStdIOType *io; + + (void)pv; /* not used */ + for(;;) { + res = xQueueReceive(uartRxQueue, &ch, portMAX_DELAY); + if (res==pdPASS) { + #if McuESP32_CONFIG_USE_USB_CDC + if (USB_CdcIsConnected()) { /* send directly to programmer attached on the USB or to the IDF monitor */ + USB_CdcStdio.stdOut(ch); /* forward to USB CDC and the programmer on the host */ + } + #endif + if ( McuESP32_CopyUartToShell + #if McuESP32_CONFIG_USE_USB_CDC + && !McuESP32_IsProgramming + #endif + ) + { /* only write to shell if not in programming mode. Programming mode might crash RTT */ + io = McuESP32_GetRxFromESPStdio(); + if (io!=NULL) { + McuShell_SendCh(ch, io->stdOut); /* forward character */ + } + } + } else { +#if McuESP32_CONFIG_VERBOSE_CONTROL_SIGNALS + McuLog_fatal("ESP32 UartRxTask queue failed"); +#endif + } + } +} + +static void UartTxTask(void *pv) { /* task handling sending data to the ESP32 module */ + unsigned char ch; + BaseType_t res; + bool workToDo; + + (void)pv; /* not used */ + for(;;) { +#if McuESP32_CONFIG_USE_USB_CDC + if (McuESP32_ScheduleReset) { + McuESP32_ScheduleReset = false; +#if McuESP32_CONFIG_VERBOSE_CONTROL_SIGNALS + McuLog_info("Performing reset"); +#endif + DoReset(); + } +#endif + workToDo = false; + do { + res = xQueueReceive(uartTxQueue, &ch, 0); /* poll queue */ + if (res==pdPASS) { /* write data to ESP over UART */ + workToDo = true; + McuESP32_CONFIG_UART_WRITE_BLOCKING(McuESP32_CONFIG_UART_DEVICE, &ch, 1); /* send to ESP */ + } + } while (res==pdPASS); +#if McuESP32_CONFIG_USE_USB_CDC + while (USB_CdcStdio.keyPressed()) { /* check USB CDC data stream */ + workToDo = true; + USB_CdcStdio.stdIn(&ch); /* read byte */ + McuESP32_CONFIG_UART_WRITE_BLOCKING(McuESP32_CONFIG_UART_DEVICE, &ch, 1); /* send to ESP */ + /* check if we can copy the USB CDC data to shell console too */ + if (McuESP32_CopyUartToShell && !McuESP32_IsProgramming) { + McuShell_ConstStdIOTypePtr io = McuESP32_GetRxFromESPStdio(); + if (io!=NULL) { + McuShell_SendCh(ch, io->stdOut); /* write to console */ + } + } + } +#endif + if (!workToDo) { /* only delay if we are not busy */ + vTaskDelay(pdMS_TO_TICKS(5)); + } + } +} + +static void InitUart(void) { + McuESP32_CONFIG_UART_CONFIG_STRUCT config; + + McuESP32_CONFIG_UART_SET_UART_CLOCK(); + McuESP32_CONFIG_UART_GET_DEFAULT_CONFIG(&config); + config.baudRate_Bps = McuESP32_CONFIG_UART_BAUDRATE; + config.enableRx = true; + config.enableTx = true; + + /* Initialize the USART with configuration. */ + McuESP32_CONFIG_UART_INIT(McuESP32_CONFIG_UART_DEVICE, &config, CLOCK_GetFreq(McuESP32_CONFIG_UART_GET_CLOCK_FREQ_SELECT)); + McuESP32_CONFIG_UART_ENABLE_INTERRUPTS(McuESP32_CONFIG_UART_DEVICE, McuESP32_CONFIG_UART_ENABLE_INTERRUPT_FLAGS); + EnableIRQ(McuESP32_CONFIG_UART_IRQ_NUMBER); + NVIC_SetPriority(McuESP32_CONFIG_UART_IRQ_NUMBER, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY); + + McuShellUart_MuxUartPins(McuESP32_CONFIG_SHELL_UART); /* mux the UART pins */ + + uartRxQueue = xQueueCreate(McuESP32_UART_RX_QUEUE_LENGTH, sizeof(uint8_t)); + if (uartRxQueue==NULL) { + McuLog_fatal("not able to create Rx queue"); + for(;;){} /* out of memory? */ + } + vQueueAddToRegistry(uartRxQueue, "ESP32UartRxQueue"); + + uartTxQueue = xQueueCreate(McuESP32_UART_TX_QUEUE_LENGTH, sizeof(uint8_t)); + if (uartTxQueue==NULL) { + McuLog_fatal("not able to create Tx queue"); + for(;;){} /* out of memory? */ + } + vQueueAddToRegistry(uartTxQueue, "ESP32UartTxQueue"); +} + +static void InitPins(void) { +#if McuESP32_CONFIG_USE_CTRL_PINS + McuGPIO_Config_t gpioConfig; + + McuGPIO_GetDefaultConfig(&gpioConfig); + gpioConfig.isInput = true; + gpioConfig.hw.gpio = McuESP32_CONFIG_EN_GPIO; + gpioConfig.hw.port = McuESP32_CONFIG_EN_PORT; + gpioConfig.hw.pin = McuESP32_CONFIG_EN_PIN; + McuESP32_RF_EN_Pin = McuGPIO_InitGPIO(&gpioConfig); + + gpioConfig.hw.gpio = McuESP32_CONFIG_RST_GPIO; + gpioConfig.hw.port = McuESP32_CONFIG_RST_PORT; + gpioConfig.hw.pin = McuESP32_CONFIG_RST_PIN; + McuESP32_RF_IO0_Pin = McuGPIO_InitGPIO(&gpioConfig); +#endif +} + +void McuESP32_Deinit(void) { +#if McuESP32_CONFIG_USE_CTRL_PINS + McuESP32_RF_EN_Pin = McuGPIO_DeinitGPIO(McuESP32_RF_EN_Pin); + McuESP32_RF_IO0_Pin = McuGPIO_DeinitGPIO(McuESP32_RF_IO0_Pin); +#endif + vQueueDelete(uartRxQueue); + uartRxQueue = NULL; +} + +void McuESP32_Init(void) { + InitPins(); + InitUart(); + if (xTaskCreate( + UartRxTask, /* pointer to the task */ + "ESP32UartRx", /* task name for kernel awareness debugging */ + 500/sizeof(StackType_t), /* task stack size */ + (void*)NULL, /* optional task startup argument */ + tskIDLE_PRIORITY+4, /* initial priority */ + (TaskHandle_t*)NULL /* optional task handle to create */ + ) != pdPASS) + { + McuLog_fatal("failed creating ESP32 Rx Task"); + for(;;){} /* error! probably out of memory */ + } + if (xTaskCreate( + UartTxTask, /* pointer to the task */ + "ESP32UartTx", /* task name for kernel awareness debugging */ + 500/sizeof(StackType_t), /* task stack size */ + (void*)NULL, /* optional task startup argument */ + tskIDLE_PRIORITY+4, /* initial priority */ + (TaskHandle_t*)NULL /* optional task handle to create */ + ) != pdPASS) + { + McuLog_fatal("failed creating ESP32 Tx Task"); + for(;;){} /* error! probably out of memory */ + } +} +#endif /* #if McuESP32_CONFIG_SHELL_UART */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuESP32.h b/TSM_PicoW_Sensor/McuLib/src/McuESP32.h new file mode 100644 index 0000000..3f35d7f --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuESP32.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2021, Erich Styger + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef McuESP32_H_ +#define McuESP32_H_ + +#include +#include "McuESP32config.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* used to deal with USB CDC flow control pins */ +void McuESP32_UartState_Callback(uint8_t state); + +#include "McuShell.h" +/*! + * \brief Shell parser routine. + * \param cmd Pointer to command line string. + * \param handled Pointer to status if command has been handled. Set to TRUE if command was understood. + * \param io Pointer to stdio handle + * \return Error code, ERR_OK if everything was ok. + */ +uint8_t McuESP32_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); + +/*! + * \brief Set a standard I/O receiving from ESP + * \param stdio Standard I/O to be used + */ +void McuESP32_SetRxFromESPStdio(McuShell_ConstStdIOTypePtr stdio); + +/*! + * \brief Return the current receiving from ESP standard I/O + * \return I/O handler + */ +McuShell_ConstStdIOTypePtr McuESP32_GetRxFromESPStdio(void); + +/*! + * \brief Returns the standard I/O handler for sending data (only sending) to the ESP32 + * \return standard I/O handler + */ +McuShell_ConstStdIOTypePtr McuESP32_GetTxToESPStdio(void); + +/*! + * \brief Module de-initialization + */ +void McuESP32_Deinit(void); + +/*! + * \brief Module initialization + */ +void McuESP32_Init(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* McuESP32_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuEvents.c b/TSM_PicoW_Sensor/McuLib/src/McuEvents.c new file mode 100644 index 0000000..9f6c91d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuEvents.c @@ -0,0 +1,263 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuEvents.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SimpleEvents +** Version : Component 01.059, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-14, 06:24, # CodeGen: 679 +** Abstract : +** +** Settings : +** Component name : McuEvents +** SDK : McuLib +** Critical Section : McuCriticalSection +** Initialize on Init : yes +** Event Name List : (string list) +** Contents : +** SetEvent - void McuEvents_SetEvent(uint8_t event); +** ClearEvent - void McuEvents_ClearEvent(uint8_t event); +** EventsPending - bool McuEvents_EventsPending(void); +** GetEvent - bool McuEvents_GetEvent(uint8_t event); +** GetClearEvent - bool McuEvents_GetClearEvent(uint8_t event); +** HandleEvent - void McuEvents_HandleEvent(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuEvents.h +** @version 01.00 +** @brief +** +*/ +/*! +** @addtogroup McuEvents_module McuEvents module documentation +** @{ +*/ + +/* MODULE McuEvents. */ +#include "McuEvents.h" + +#include "McuCriticalSection.h" + + +static uint8_t McuEvents_Events[((McuEvents_CONFIG_NOF_EVENTS-1)/8)+1]; /*!< Bit set of events */ +/* +** =================================================================== +** Method : SetEvent (component SimpleEvents) +** +** Description : +** Sets an event (number) be processed by the next HandleEvent() +** call +** Parameters : +** NAME - DESCRIPTION +** event - The event (number) to be set so it +** will be called by the HandleEvent() routine +** later on. Note that there cannot be +** multiple instances of an event, and the +** lower the event number, the higher the +** priority. +** Returns : Nothing +** =================================================================== +*/ +void McuEvents_SetEvent(uint8_t event) +{ + McuCriticalSection_CriticalVariable(); + + /* event is in the range of 0..255: find bit position in array */ + McuCriticalSection_EnterCritical(); + McuEvents_Events[event/8] |= 0x80>>(event%8); + McuCriticalSection_ExitCritical(); +} + +/* +** =================================================================== +** Method : ClearEvent (component SimpleEvents) +** +** Description : +** Clears one event (number). If the event is not set, then the +** function has no effect. +** Parameters : +** NAME - DESCRIPTION +** event - The event number to be cleared. +** Returns : Nothing +** =================================================================== +*/ +void McuEvents_ClearEvent(uint8_t event) +{ + McuCriticalSection_CriticalVariable(); + + /* event is in the range of 0..255: find bit position in array */ + McuCriticalSection_EnterCritical(); + McuEvents_Events[event/8] &= ~(0x80>>(event%8)); + McuCriticalSection_ExitCritical(); +} + +/* +** =================================================================== +** Method : GetEvent (component SimpleEvents) +** +** Description : +** Allows to check if an event is set or not. +** Parameters : +** NAME - DESCRIPTION +** event - The event number to check. If the +** event is set, the function returns TRUE. +** Returns : +** --- - none +** =================================================================== +*/ +bool McuEvents_GetEvent(uint8_t event) +{ + /* event is in the range of 0..255: find bit position in array */ + return (bool)((McuEvents_Events[event/8]&(0x80>>(event%8)))!=0); +} + +/* +** =================================================================== +** Method : GetClearEvent (component SimpleEvents) +** +** Description : +** Allows to check if an event is set or not. If set, it will +** be automatically cleared. +** Parameters : +** NAME - DESCRIPTION +** event - The event number to check. If the +** event is set, the function returns TRUE. +** Returns : +** --- - none +** =================================================================== +*/ +bool McuEvents_GetClearEvent(uint8_t event) +{ + bool isSet = FALSE; + McuCriticalSection_CriticalVariable(); + + McuCriticalSection_EnterCritical(); + if (McuEvents_GetEvent(event)) { /* event present */ + McuEvents_Events[event/8] &= ~(0x80>>(event%8)); /* clear event */ + isSet = TRUE; + } + McuCriticalSection_ExitCritical(); + return isSet; +} + +/* +** =================================================================== +** Method : EventsPending (component SimpleEvents) +** +** Description : +** Returns true if any events are pending, false otherwise +** Parameters : None +** Returns : +** --- - True in case any events are pending, false +** otherwise. +** =================================================================== +*/ +bool McuEvents_EventsPending(void) +{ +#if McuEvents_CONFIG_NOF_EVENTS<=8 + return (bool)(McuEvents_Events[0]!=0); +#elif McuEvents_CONFIG_NOF_EVENTS<=16 + return (bool)(McuEvents_Events[0]!=0 || McuEvents_Events[1]!=0); +#elif McuEvents_CONFIG_NOF_EVENTS<=24 + return (McuEvents_Events[0]!=0 || McuEvents_Events[1]!=0 || McuEvents_Events[2]!=0); +#elif McuEvents_CONFIG_NOF_EVENTS<=32 + return (bool)(McuEvents_Events[0]!=0 || McuEvents_Events[1]!=0 || McuEvents_Events[2]!=0 || McuEvents_Events[3]!=0); +#else /* iterate through the array */ + char i; /* local counter */ + + for(i=0; i<(McuEvents_CONFIG_NOF_EVENTS/8)+1; i++) { + if (McuEvents_Events[i] != 0) { /* there are events pending */ + return TRUE; + } + } + return FALSE; +#endif +} + +/* +** =================================================================== +** Method : HandleEvent (component SimpleEvents) +** +** Description : +** Event handler, to be called periodically. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuEvents_HandleEvent(void) +{ + /* Handle the one with the highest priority. */ + uint8_t event; + McuCriticalSection_CriticalVariable(); + + McuCriticalSection_EnterCritical(); + for (event=0; event>(event%8)); /* clear event */ + break; /* get out of loop */ + } + } + McuCriticalSection_ExitCritical(); +#if McuEvents_CONFIG_USE_EVENT_HANDLER + /*lint -save -e522 function lacks side effect */ + if (event != McuEvents_CONFIG_NOF_EVENTS) { + McuEvents_CONFIG_EVENT_HANDLER_NAME(event); + } + /*lint -restore */ +#endif +} + +/* +** =================================================================== +** Method : McuEvents_Init (component SimpleEvents) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +void McuEvents_Init(void) +{ +#if McuEvents_CONFIG_NOF_EVENTS<=8 + McuEvents_Events[0] = 0; /* initialize data structure */ +#else + uint8_t i; + + for(i=0;istdErr); + res = ERR_FAILED; + } else { + /* note: spending some time here, as the RTC is busy writing data, we will read data back below */ + McuShell_SendStr((unsigned char*)"Reading date from RTC: ", io->stdOut); + } + } else { + McuShell_SendStr((unsigned char*)"*** Error while reading command! ***", io->stdErr); + McuShell_SendStr((void *)cmd, io->stdErr); + McuShell_SendStr((unsigned char*)"\r\n", io->stdErr); + res = ERR_FAILED; + } + } /* has an argument */ + /* print now current date */ + if (res==ERR_OK) { + unsigned char buf[sizeof("Wednesday dd:mm:yyyy\\r\\n")]; + + buf[0]='\0'; + if (AddHWRTCDate(buf, sizeof(buf))!=ERR_OK) { + McuShell_SendStr((unsigned char*)"*** Failed to get RTC date\r\n", io->stdErr); + res = ERR_FAILED; + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStr(buf, io->stdOut); + } + } + return res; +} + +static uint8_t TimeCmd(const unsigned char *cmd, McuShell_ConstStdIOType *io) { + uint8_t hour, minute, second, hSecond; + const unsigned char *p; + uint8_t res = ERR_OK; + + p = cmd + sizeof("McuExtRTC time")-1; + if (*p==' ') { /* has an argument */ + if (McuUtility_ScanTime(&p, &hour, &minute, &second, &hSecond)==ERR_OK) { /* format fine */ + /* set RTC time */ + res = McuExtRTC_SetTime(hour, minute, second, hSecond); + if (res != ERR_OK) { + McuShell_SendStr((unsigned char*)"*** Failure setting RTC time\r\n", io->stdErr); + res = ERR_FAILED; + } else { + /* note: spending some time here, as the RTC is busy writing data, we will read data back below */ + McuShell_SendStr((unsigned char*)"Reading time from RTC: ", io->stdOut); + } + } else { + McuShell_SendStr((unsigned char*)"*** Error while reading command: ", io->stdErr); + McuShell_SendStr(cmd, io->stdErr); + McuShell_SendStr((unsigned char*)"\r\n", io->stdErr); + res = ERR_FAILED; + } + } + /* print now current time */ + if (res==ERR_OK) { + unsigned char buf[sizeof("hh:mm:ss.hh (24h)\\r\\n")]; + + buf[0] = '\0'; + if (AddHWRTCTime(buf, sizeof(buf))!=ERR_OK) { + McuShell_SendStr((unsigned char*)"*** Failed to get RTC time\r\n", io->stdErr); + res = ERR_FAILED; + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStr(buf, io->stdOut); + } + } + return res; +} + +static uint8_t PrintStatus(McuShell_ConstStdIOType *io) { + uint8_t buf[32]; + + McuShell_SendStatusStr((unsigned char*)"McuExtRTC", (const unsigned char*)"Hardware external time and date\r\n", io->stdOut); + buf[0] = '\0'; + if (AddHWRTCDate(buf, sizeof(buf))!=ERR_OK) { + McuShell_SendStr((unsigned char*)"*** Failed to get RTC date!\r\n", io->stdErr); + return ERR_FAILED; + } + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" date", buf, io->stdOut); + buf[0] = '\0'; + if (AddHWRTCTime(buf, sizeof(buf))!=ERR_OK) { + McuShell_SendStr((unsigned char*)"*** Failed to get RTC time!\r\n", io->stdErr); + return ERR_FAILED; + } + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" time", buf, io->stdOut); + + McuUtility_Num16uToStr(buf, sizeof(buf), McuExtRTC_CONFIG_DEVICE); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)", I2C Addr 0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), McuExtRTC_CONFIG_DEVICE_ADDRESS); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" device", buf, io->stdOut); + +#if McuExtRTC_MEM_SIZE==0 /* no RAM on device */ + /* there is no RAM for this device */ +#else + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), McuExtRTC_MEM_RAM_START_ADDR); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"..0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), McuExtRTC_MEM_RAM_END_ADDR); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" RAM", buf, io->stdOut); +#endif +#if McuExtRTC_CONFIG_DEVICE==3231 || McuExtRTC_CONFIG_DEVICE==3232 + float temperature; + + if (McuExtRTC_GetTemperature(&temperature)==ERR_OK) { + buf[0] = '\0'; + McuUtility_strcatNumFloat(buf, sizeof(buf), temperature, 2); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" degree C\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ERROR\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" Temperature", buf, io->stdOut); +#endif + return ERR_OK; +} + +/* +** =================================================================== +** Method : Read (component RTC_Maxim) +** +** Description : +** Read from the device +** Parameters : +** NAME - DESCRIPTION +** addr - device memory address +** * buf - Pointer to read buffer +** bufSize - Size of read buffer +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuExtRTC_Read(uint8_t addr, uint8_t *buf, uint8_t bufSize) +{ + return McuGenericI2C_ReadAddress(McuExtRTC_CONFIG_DEVICE_ADDRESS, &addr, 1, buf, bufSize); +} + +/* +** =================================================================== +** Method : Write (component RTC_Maxim) +** +** Description : +** Write from the device +** Parameters : +** NAME - DESCRIPTION +** addr - device memory address +** * buf - Pointer to read buffer +** bufSize - +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuExtRTC_Write(uint8_t addr, uint8_t *buf, uint8_t bufSize) +{ + return McuGenericI2C_WriteAddress(McuExtRTC_CONFIG_DEVICE_ADDRESS, &addr, 1, buf, bufSize); +} + +/* +** =================================================================== +** Method : ReadByte (component RTC_Maxim) +** +** Description : +** Read from the device RAM +** Parameters : +** NAME - DESCRIPTION +** addr - device memory address, with zero as the +** RAM start address +** * buf - Pointer to read buffer +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuExtRTC_ReadByte(uint8_t addr, uint8_t *buf) +{ +#if McuExtRTC_MEM_SIZE==0 /* no RAM on device */ + (void)addr; /* unused */ + (void)buf; /* unused */ + return ERR_FAILED; /* there is no RAM for this device */ +#else + if (addr>McuExtRTC_MAX_ADDRESS) { + return ERR_RANGE; /* memory address out of range */ + } + addr += McuExtRTC_MEM_RAM_START_ADDR; + return McuGenericI2C_ReadAddress(McuExtRTC_CONFIG_DEVICE_ADDRESS, &addr, 1, buf, 1); +#endif +} + +/* +** =================================================================== +** Method : WriteByte (component RTC_Maxim) +** +** Description : +** Read from the device RAM +** Parameters : +** NAME - DESCRIPTION +** addr - device memory address, with zero as the +** RAM memory start address +** buf - value to write +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuExtRTC_WriteByte(uint8_t addr, uint8_t buf) +{ +#if McuExtRTC_MEM_SIZE==0 /* no RAM on device */ + (void)addr; /* unused */ + (void)buf; /* unused */ + return ERR_FAILED; /* there is no RAM for this device */ +#else + if (addr>McuExtRTC_MAX_ADDRESS) { + return ERR_RANGE; /* memory address out of range */ + } + addr += McuExtRTC_MEM_RAM_START_ADDR; + return McuGenericI2C_WriteAddress(McuExtRTC_CONFIG_DEVICE_ADDRESS, &addr, 1, &buf, 1); +#endif +} + +/* +** =================================================================== +** Method : ReadBlock (component RTC_Maxim) +** +** Description : +** Read from the device RAM +** Parameters : +** NAME - DESCRIPTION +** addr - device memory address, with zero as the +** RAM start address +** * buf - Pointer to read buffer +** bufSize - Size of read buffer +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuExtRTC_ReadBlock(uint8_t addr, uint8_t *buf, uint8_t bufSize) +{ +#if McuExtRTC_MEM_SIZE==0 /* no RAM on device */ + (void)addr; /* unused */ + (void)buf; /* unused */ + (void)bufSize; /* unused */ + return ERR_FAILED; /* there is no RAM for this device */ +#else + if (addr>McuExtRTC_MAX_ADDRESS || (addr+bufSize)>McuExtRTC_MEM_SIZE) { + return ERR_RANGE; /* memory address out of range */ + } + addr += McuExtRTC_MEM_RAM_START_ADDR; + return McuGenericI2C_ReadAddress(McuExtRTC_CONFIG_DEVICE_ADDRESS, &addr, 1, buf, bufSize); +#endif +} + +/* +** =================================================================== +** Method : WriteBlock (component RTC_Maxim) +** +** Description : +** Read from the device RAM +** Parameters : +** NAME - DESCRIPTION +** addr - device memory address, with zero as the +** RAM memory start address +** * buf - Pointer to read buffer +** bufSize - +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuExtRTC_WriteBlock(uint8_t addr, uint8_t *buf, uint8_t bufSize) +{ +#if McuExtRTC_MEM_SIZE==0 /* no RAM on device */ + (void)addr; /* unused */ + (void)buf; /* unused */ + (void)bufSize; /* unused */ + return ERR_FAILED; /* there is no RAM for this device */ +#else + if (addr>McuExtRTC_MAX_ADDRESS || (addr+bufSize)>McuExtRTC_MEM_SIZE) { + return ERR_RANGE; /* memory address out of range */ + } + addr += McuExtRTC_MEM_RAM_START_ADDR; + return McuGenericI2C_WriteAddress(McuExtRTC_CONFIG_DEVICE_ADDRESS, &addr, 1, buf, bufSize); +#endif +} + +/* +** =================================================================== +** Method : GetRTCTimeDate (component RTC_Maxim) +** +** Description : +** Returns the time and date from the device. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to time +** * date - Pointer to date +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuExtRTC_GetRTCTimeDate(McuExtRTC_TTIME *time, McuExtRTC_TDATE *date) +{ + uint8_t buf[McuExtRTC_MEM_TIME_DATE_STRUCT_SIZE]; + + if (McuExtRTC_Read(McuExtRTC_MEM_TIME_DATE_STRUCT_ADDR, buf, sizeof(buf))!=ERR_OK) { + return ERR_FAILED; + } + time->sec = (uint8_t)(((buf[0]&0x70)>>4)*10 + (buf[0]&0x0F)); + time->min = (uint8_t)((buf[1]>>4)*10 + (buf[1]&0x0F)); + if (buf[2]&0x40) { + time->hour =(uint8_t)(buf[2]&0x1F); + time->mode = McuExtRTC_TTIME_MODE_12H; + time->am_pm =(uint8_t)((buf[2]&0x20)>>5); + } else { + time->hour = (uint8_t)(buf[2]&0x3F); + time->mode = McuExtRTC_TTIME_MODE_24H; + } + time->hour = (uint8_t)((time->hour>>4)*10 + (buf[2]&0x0F)); + date->dayOfWeek =(uint8_t)(buf[3]-1); + date->day = (uint8_t)((buf[4]>>4)*10 + (buf[4]&0x0F)); + date->month = (uint8_t)((buf[5]>>4)*10 + (buf[5]&0x0F)); + date->year = (uint8_t)((buf[6]>>4)*10 + (buf[6]&0x0F)); + return ERR_OK; +} + +/* +** =================================================================== +** Method : SetRTCTimeDate (component RTC_Maxim) +** +** Description : +** Sets the date and time. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to time to be set +** * date - Pointer to date to be set +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuExtRTC_SetRTCTimeDate(McuExtRTC_TTIME *time, McuExtRTC_TDATE *date) +{ + uint8_t buf[McuExtRTC_MEM_TIME_DATE_STRUCT_SIZE]; + + if ( ((time->mode==McuExtRTC_TTIME_MODE_12H)&&((time->hour>12)||(time->hour==0))) + || ((time->mode==McuExtRTC_TTIME_MODE_24H)&&(time->hour>23)) + || (time->min>59)||(time->sec>59) + || (date->year>99)||(date->month>12)||(date->month==0) + || (date->day>31)||(date->day==0) + || (date->dayOfWeek>6)) + { + return ERR_RANGE; + } + buf[0] = (uint8_t)(((time->sec/10)<<4) | (time->sec%10)); + buf[1] = (uint8_t)(((time->min/10)<<4) | (time->min%10)); + buf[2] = (uint8_t)(((time->hour/10)<<4) | (time->hour%10)); + if (time->mode==McuExtRTC_TTIME_MODE_12H) { + buf[2] |= (time->am_pm)?0x60:0x40; + } + buf[3] = (uint8_t)(date->dayOfWeek+1); + buf[4] = (uint8_t)(((date->day/10)<<4) | (date->day%10)); + buf[5] = (uint8_t)(((date->month/10)<<4) | (date->month%10)); + buf[6] = (uint8_t)(((date->year/10)<<4) | (date->year%10)); + if (McuExtRTC_Write(McuExtRTC_MEM_TIME_DATE_STRUCT_ADDR, buf, sizeof(buf))!=ERR_OK) { + return ERR_FAILED; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : SetRTCTime (component RTC_Maxim) +** +** Description : +** Sets the time using the RTC low level information. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to time to be set +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuExtRTC_SetRTCTime(McuExtRTC_TTIME *time) +{ + uint8_t buf[McuExtRTC_MEM_TIME_STRUCT_SIZE]; + + if ( ((time->mode==McuExtRTC_TTIME_MODE_12H)&&((time->hour>12)||(time->hour==0))) + || ((time->mode==McuExtRTC_TTIME_MODE_24H)&&(time->hour>23)) + || (time->min>59) || (time->sec>59) + ) + { + return ERR_RANGE; + } + buf[0] = (uint8_t)(((time->sec/10)<<4) | (time->sec%10)); + buf[1] = (uint8_t)(((time->min/10)<<4) | (time->min%10)); + buf[2] = (uint8_t)(((time->hour/10)<<4) | (time->hour%10)); + if (time->mode==McuExtRTC_TTIME_MODE_12H) { + buf[2] |= (time->am_pm)?0x60:0x40; + } + if (McuExtRTC_Write(McuExtRTC_MEM_TIME_STRUCT_ADDR, buf, sizeof(buf))!=ERR_OK) { + return ERR_FAILED; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : GetRTCTime (component RTC_Maxim) +** +** Description : +** Returns the time using the RTC low level information. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to time +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuExtRTC_GetRTCTime(McuExtRTC_TTIME *time) +{ + uint8_t buf[McuExtRTC_MEM_TIME_STRUCT_SIZE]; + + if (McuExtRTC_Read(McuExtRTC_MEM_TIME_STRUCT_ADDR, buf, sizeof(buf))!=ERR_OK) { + return ERR_FAILED; + } + time->sec = (uint8_t)(((buf[0]&0x70)>>4)*10 + (buf[0]&0x0F)); + time->min = (uint8_t)((buf[1]>>4)*10 + (buf[1]&0x0F)); + if (buf[2]&0x40) { + time->hour =(uint8_t)(buf[2]&0x1F); + time->mode = McuExtRTC_TTIME_MODE_12H; + time->am_pm = (uint8_t)((buf[2]&0x20)>>5); + } else { + time->hour = (uint8_t)(buf[2]&0x3F); + time->mode = McuExtRTC_TTIME_MODE_24H; + } + time->hour = (uint8_t)((time->hour>>4)*10 + (buf[2]&0x0F)); + return ERR_OK; +} + +/* +** =================================================================== +** Method : GetRTCDate (component RTC_Maxim) +** +** Description : +** Returns the date from the device using the RTC low level +** information. +** Parameters : +** NAME - DESCRIPTION +** * date - Pointer to date +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuExtRTC_GetRTCDate(McuExtRTC_TDATE *date) +{ + uint8_t buf[McuExtRTC_MEM_DATE_STRUCT_SIZE]; + + if (McuExtRTC_Read(McuExtRTC_MEM_DATE_STRUCT_ADDR, buf, sizeof(buf))!=ERR_OK) { + return ERR_FAILED; + } + date->dayOfWeek =(uint8_t)(buf[0]-1); + date->day = (uint8_t)((buf[1]>>4)*10 + (buf[1]&0x0F)); + date->month = (uint8_t)((buf[2]>>4)*10 + (buf[2]&0x0F)); + date->year = (uint8_t)((buf[3]>>4)*10 + (buf[3]&0x0F)); + return ERR_OK; +} + +/* +** =================================================================== +** Method : SetRTCDate (component RTC_Maxim) +** +** Description : +** Sets the date using the RTC low level information. +** Parameters : +** NAME - DESCRIPTION +** * date - Pointer to date to be set +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuExtRTC_SetRTCDate(McuExtRTC_TDATE *date) +{ + uint8_t buf[McuExtRTC_MEM_DATE_STRUCT_SIZE]; + + if ( (date->year>99) + || (date->month>12)||(date->month==0) + || (date->day>31)||(date->day==0) + || (date->dayOfWeek>6) + ) + { + return ERR_RANGE; + } + buf[0] = (uint8_t)(date->dayOfWeek + 1); + buf[1] = (uint8_t)(((date->day/10)<<4) | (date->day%10)); + buf[2] = (uint8_t)(((date->month/10)<<4) | (date->month%10)); + buf[3] = (uint8_t)(((date->year/10)<<4) | (date->year%10)); + if (McuExtRTC_Write(McuExtRTC_MEM_DATE_STRUCT_ADDR, buf, sizeof(buf))!=ERR_OK) { + return ERR_FAILED; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : Init (component RTC_Maxim) +** +** Description : +** Initializes the driver. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuExtRTC_Init(void) +{ + /* nothing to do */ +} + +/* +** =================================================================== +** Method : Deinit (component RTC_Maxim) +** +** Description : +** Deinitializes the driver. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuExtRTC_Deinit(void) +{ + /* nothing to do */ +} + +/* +** =================================================================== +** Method : ParseCommand (component RTC_Maxim) +** +** Description : +** Shell Command Line parser +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command line +** * handled - Pointer to variable which tells if +** the command has been handled or not +** * io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuExtRTC_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) +{ + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, "McuExtRTC help")==0) { + McuShell_SendHelpStr((unsigned char*)"McuExtRTC", (const unsigned char*)"Group of McuExtRTC commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (const unsigned char*)"Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" time [hh:mm:ss[,z]]", (const unsigned char*)"Set the current time. Prints the current time if no argument\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" date [dd.mm.yyyy]", (const unsigned char*)"Set the current date. Prints the current date if no argument\r\n", io->stdOut); + *handled = TRUE; + return ERR_OK; + } else if ((McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) || (McuUtility_strcmp((char*)cmd, "McuExtRTC status")==0)) { + *handled = TRUE; + return PrintStatus(io); + } else if (McuUtility_strncmp((char*)cmd, "McuExtRTC date", sizeof("McuExtRTC date")-1)==0) { + *handled = TRUE; + return DateCmd(cmd, io); + } else if (McuUtility_strncmp((char*)cmd, "McuExtRTC time", sizeof("McuExtRTC time")-1)==0) { + *handled = TRUE; + return TimeCmd(cmd, io); + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : GetTime (component RTC_Maxim) +** +** Description : +** Returns the time. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to time +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuExtRTC_GetTime(TIMEREC *time) +{ + McuExtRTC_TTIME ttime; + + if (McuExtRTC_GetRTCTime(&ttime)!=ERR_OK) { + return ERR_FAILED; + } + time->Hour = ttime.hour; + time->Min = ttime.min; + time->Sec = ttime.sec; + time->Sec100 = 0; + return ERR_OK; +} + +/* +** =================================================================== +** Method : SetTime (component RTC_Maxim) +** +** Description : +** Sets the time. +** Parameters : +** NAME - DESCRIPTION +** Hour - Hours (0 - 23) +** Min - Minutes (0 - 59) +** Sec - Seconds (0 - 59) +** Sec100 - Hundredths of seconds (0 - 99) +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuExtRTC_SetTime(uint8_t Hour, uint8_t Min, uint8_t Sec, uint8_t Sec100) +{ + McuExtRTC_TTIME ttime; + + ttime.hour = Hour; + ttime.min = Min; + ttime.sec = Sec; + (void)Sec100; /* ignored, as cannot be stored on device */ + ttime.mode = McuExtRTC_TTIME_MODE_24H; + ttime.am_pm = McuExtRTC_TTIME_AMPM_AM; + return McuExtRTC_SetRTCTime(&ttime); +} + +/* +** =================================================================== +** Method : GetDate (component RTC_Maxim) +** +** Description : +** Returns the time and date from the device. +** Parameters : +** NAME - DESCRIPTION +** * date - Pointer to date +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuExtRTC_GetDate(DATEREC *date) +{ + McuExtRTC_TDATE tdate; + + if (McuExtRTC_GetRTCDate(&tdate)!=ERR_OK) { + return ERR_FAILED; + } + date->Year = (uint16_t)(tdate.year+2000); + date->Month = tdate.month; + date->Day = tdate.day; + return ERR_OK; +} + +/* +** =================================================================== +** Method : SetDate (component RTC_Maxim) +** +** Description : +** Sets the date. +** Parameters : +** NAME - DESCRIPTION +** Year - Year in 2000 format +** Month - Month number (1..12) +** Day - Day number (1..31) +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuExtRTC_SetDate(uint16_t Year, uint8_t Month, uint8_t Day) +{ + McuExtRTC_TDATE tdate; + + tdate.year = (uint8_t)(Year-2000); + tdate.month = Month; + tdate.day = Day; + tdate.dayOfWeek = McuUtility_WeekDay(Year, Month, Day); + return McuExtRTC_SetRTCDate(&tdate); +} + +/* +** =================================================================== +** Method : GetTemperature (component RTC_Maxim) +** +** Description : +** Returns the temperature from the device internal temperature +** sensor. Only available on DS3231 and DS3232. +** Parameters : +** NAME - DESCRIPTION +** * temperature - Pointer to store the +** temperature +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuExtRTC_GetTemperature(float *temperature) +{ +#if McuExtRTC_CONFIG_DEVICE==3231 || McuExtRTC_CONFIG_DEVICE==3232 + int8_t high; + uint8_t low, res; + + res = McuExtRTC_Read(McuExtRTC_MEM_MSB_TEMP_ADDR, (uint8_t*)&high, 1); + if (res!=ERR_OK) { + return res; + } + res = McuExtRTC_Read(McuExtRTC_MEM_LSB_TEMP_ADDR, &low, 1); + if (res!=ERR_OK) { + return res; + } + /* high values is two's complement of integer part of temperature, the upper two bits of LSB are the number of 0.25 degrees. + For example 0b00011000 0b01xxxxxx gives 24.25 degree. */ + *temperature = (float)high + (((low&0xC0)>>6)*0.25f); + return ERR_OK; +#else /* not supported */ + *temperature = 0.0f; + return ERR_FAILED; +#endif +} + +/* END McuExtRTC. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuExtRTC.h b/TSM_PicoW_Sensor/McuLib/src/McuExtRTC.h new file mode 100644 index 0000000..095dcfd --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuExtRTC.h @@ -0,0 +1,529 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuExtRTC.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : RTC_Maxim +** Version : Component 01.026, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2022-07-05, 20:46, # CodeGen: 776 +** Abstract : +** Driver for external I2C based realtime clocks (RTC) +** Settings : +** Component name : McuExtRTC +** Device : DS3232 +** I2C : McuGenericI2C +** Utility : McuUtility +** SDK : McuLib +** Shell : Enabled +** Shell : McuShell +** Contents : +** GetRTCTimeDate - uint8_t McuExtRTC_GetRTCTimeDate(McuExtRTC_TTIME *time, McuExtRTC_TDATE *date); +** SetRTCTimeDate - uint8_t McuExtRTC_SetRTCTimeDate(McuExtRTC_TTIME *time, McuExtRTC_TDATE *date); +** GetRTCTime - uint8_t McuExtRTC_GetRTCTime(McuExtRTC_TTIME *time); +** SetRTCTime - uint8_t McuExtRTC_SetRTCTime(McuExtRTC_TTIME *time); +** GetRTCDate - uint8_t McuExtRTC_GetRTCDate(McuExtRTC_TDATE *date); +** SetRTCDate - uint8_t McuExtRTC_SetRTCDate(McuExtRTC_TDATE *date); +** GetTime - uint8_t McuExtRTC_GetTime(TIMEREC *time); +** SetTime - uint8_t McuExtRTC_SetTime(uint8_t Hour, uint8_t Min, uint8_t Sec, uint8_t... +** GetDate - uint8_t McuExtRTC_GetDate(DATEREC *date); +** SetDate - uint8_t McuExtRTC_SetDate(uint16_t Year, uint8_t Month, uint8_t Day); +** GetTemperature - uint8_t McuExtRTC_GetTemperature(float *temperature); +** Read - uint8_t McuExtRTC_Read(uint8_t addr, uint8_t *buf, uint8_t bufSize); +** Write - uint8_t McuExtRTC_Write(uint8_t addr, uint8_t *buf, uint8_t bufSize); +** ReadByte - uint8_t McuExtRTC_ReadByte(uint8_t addr, uint8_t *buf); +** WriteByte - uint8_t McuExtRTC_WriteByte(uint8_t addr, uint8_t buf); +** ReadBlock - uint8_t McuExtRTC_ReadBlock(uint8_t addr, uint8_t *buf, uint8_t bufSize); +** WriteBlock - uint8_t McuExtRTC_WriteBlock(uint8_t addr, uint8_t *buf, uint8_t bufSize); +** ParseCommand - uint8_t McuExtRTC_ParseCommand(const unsigned char *cmd, bool *handled, const... +** Init - void McuExtRTC_Init(void); +** Deinit - void McuExtRTC_Deinit(void); +** +** * Copyright (c) 2014-2022, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuExtRTC.h +** @version 01.00 +** @brief +** Driver for external I2C based realtime clocks (RTC) +*/ +/*! +** @addtogroup McuExtRTC_module McuExtRTC module documentation +** @{ +*/ + +#ifndef __McuExtRTC_H +#define __McuExtRTC_H + +/* MODULE McuExtRTC. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuExtRTCconfig.h" /* configuration */ + +/* Include inherited beans */ +#include "McuGenericI2C.h" +#include "McuUtility.h" +#include "McuLib.h" +#include "McuShell.h" + + +#ifndef __BWUserType_McuExtRTC_TTIME +#define __BWUserType_McuExtRTC_TTIME + typedef struct { /* Time in binary format */ + uint8_t hour; /* hours */ + uint8_t min; /* minutes */ + uint8_t sec; /* seconds */ + bool mode; /* clock mode, 0 for 12-hour mode, otherwise 0-24 hour mode */ + uint8_t am_pm; /* 0: AM, otherwise PM */ + } McuExtRTC_TTIME; +#endif +#ifndef __BWUserType_McuExtRTC_TDATE +#define __BWUserType_McuExtRTC_TDATE + typedef struct { /* Date in binary format */ + uint8_t year; /* year */ + uint8_t month; /* month */ + uint8_t day; /* day */ + uint8_t dayOfWeek; /* Day of week, where 0 is the first day. In the range of 0..6 */ + } McuExtRTC_TDATE; +#endif + + +#ifndef __BWUserType_TIMEREC +#define __BWUserType_TIMEREC + typedef struct { /* It contains actual number of hours, minutes, seconds and hundreth of seconds. */ + uint8_t Hour; /* hours (0 - 23) */ + uint8_t Min; /* minutes (0 - 59) */ + uint8_t Sec; /* seconds (0 - 59) */ + uint8_t Sec100; /* hundredth of seconds (0 - 99) */ + } TIMEREC; +#endif +#ifndef __BWUserType_DATEREC +#define __BWUserType_DATEREC + typedef struct { /* It contains actual year, month, and day description. */ + uint16_t Year; /* years (1998 - 2099) */ + uint8_t Month; /* months (1 - 12) */ + uint8_t Day; /* days (1 - 31) */ + } DATEREC; +#endif + +#define McuExtRTC_PARSE_COMMAND_ENABLED 1 /* set to 1 if method ParseCommand() is present, 0 otherwise */ + +/* device memory addresses */ +#if McuExtRTC_CONFIG_DEVICE==3231 || McuExtRTC_CONFIG_DEVICE==3232 + #define McuExtRTC_MEM_SECONDS_ADDR 0x00 /* Seconds */ + #define McuExtRTC_MEM_MINUTES_ADDR 0x01 /* Minutes */ + #define McuExtRTC_MEM_HOURS_ADDR 0x02 /* Hours */ + #define McuExtRTC_MEM_DAY_ADDR 0x03 /* Day */ + #define McuExtRTC_MEM_DATE_ADDR 0x04 /* Date */ + #define McuExtRTC_MEM_MONTH_ADDR 0x05 /* Month */ + #define McuExtRTC_MEM_YEAR_ADDR 0x06 /* Year */ + #define McuExtRTC_MEM_CTRL_ADDR 0x0E /* Control */ + #define McuExtRTC_MEM_CTRL_STATUS_ADDR 0x0F /* Control/Status */ + #define McuExtRTC_MEM_AGING_OFFSET_ADDR 0x10 /* Aging offset */ + #define McuExtRTC_MEM_MSB_TEMP_ADDR 0x11 /* MSB of Temp */ + #define McuExtRTC_MEM_LSB_TEMP_ADDR 0x12 /* LSB of Temp */ + /* Address 0x13 is reserved */ + #if McuExtRTC_CONFIG_DEVICE==3232 /* 3231 has no RAM */ + #define McuExtRTC_MEM_RAM_START_ADDR 0x14 /* device memory start address of non-volatile RAM */ + #define McuExtRTC_MEM_RAM_END_ADDR 0xFF /* device memory end address of non-volatile RAM */ + #endif +#elif McuExtRTC_CONFIG_DEVICE==1307 + #define McuExtRTC_MEM_SECONDS_ADDR 0x00 /* Seconds */ + #define McuExtRTC_MEM_MINUTES_ADDR 0x01 /* Minutes */ + #define McuExtRTC_MEM_HOURS_ADDR 0x02 /* Hours */ + #define McuExtRTC_MEM_DAY_ADDR 0x03 /* Day */ + #define McuExtRTC_MEM_DATE_ADDR 0x04 /* Date */ + #define McuExtRTC_MEM_MONTH_ADDR 0x05 /* Month */ + #define McuExtRTC_MEM_YEAR_ADDR 0x06 /* Year */ + #define McuExtRTC_MEM_CTRL_ADDR 0x07 /* Control */ + #define McuExtRTC_MEM_RAM_START_ADDR 0x08 /* device memory start address of non-volatile RAM */ + #define McuExtRTC_MEM_RAM_END_ADDR 0x3F /* device memory end address of non-volatile RAM */ +#elif McuExtRTC_CONFIG_DEVICE==1342 + #define McuExtRTC_MEM_SECONDS_ADDR 0x00 /* Seconds */ + #define McuExtRTC_MEM_MINUTES_ADDR 0x01 /* Minutes */ + #define McuExtRTC_MEM_HOURS_ADDR 0x02 /* Hours */ + #define McuExtRTC_MEM_DAY_ADDR 0x03 /* Day */ + #define McuExtRTC_MEM_DATE_ADDR 0x04 /* Date */ + #define McuExtRTC_MEM_MONTH_ADDR 0x05 /* Month */ + #define McuExtRTC_MEM_YEAR_ADDR 0x06 /* Year */ + #define McuExtRTC_MEM_CTRL_ADDR 0x0E /* Control */ +#else + #error "unknown device?" +#endif + +#if McuExtRTC_CONFIG_DEVICE==1342 + #define McuExtRTC_MEM_SIZE (0) /* no memory for DS1342 */ +#elif McuExtRTC_CONFIG_DEVICE==3231 + #define McuExtRTC_MEM_SIZE (0) /* no memory for DS3231*/ +#else + #define McuExtRTC_MEM_SIZE (McuExtRTC_MEM_RAM_END_ADDR-McuExtRTC_MEM_RAM_START_ADDR+1) /* device memory start address of non-volatile RAM, in bytes */ + #define McuExtRTC_MAX_ADDRESS (McuExtRTC_MEM_SIZE-1) /* maximum RAM address of device */ +#endif + +#define McuExtRTC_MEM_TIME_STRUCT_ADDR McuExtRTC_MEM_SECONDS_ADDR /* device memory start address for time */ +#define McuExtRTC_MEM_TIME_STRUCT_SIZE 0x03 /* device memory size for time */ + +#define McuExtRTC_MEM_DATE_STRUCT_ADDR McuExtRTC_MEM_DAY_ADDR /* device memory start address for date */ +#define McuExtRTC_MEM_DATE_STRUCT_SIZE 0x04 /* device memory size for date */ + +#define McuExtRTC_MEM_TIME_DATE_STRUCT_ADDR (McuExtRTC_MEM_TIME_STRUCT_ADDR) /* device memory start address for time and date */ +#define McuExtRTC_MEM_TIME_DATE_STRUCT_SIZE (McuExtRTC_MEM_TIME_STRUCT_SIZE+McuExtRTC_MEM_DATE_STRUCT_SIZE) /* device memory size for time and date */ + +#define McuExtRTC_TTIME_AMPM_AM 0 /* AM */ +#define McuExtRTC_TTIME_AMPM_PM 1 /* PM */ +#define McuExtRTC_TTIME_MODE_12H 0 /* 12 hour clock mode */ +#define McuExtRTC_TTIME_MODE_24H 1 /* 14 hour clock mode */ + + +uint8_t McuExtRTC_GetRTCTimeDate(McuExtRTC_TTIME *time, McuExtRTC_TDATE *date); +/* +** =================================================================== +** Method : GetRTCTimeDate (component RTC_Maxim) +** +** Description : +** Returns the time and date from the device. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to time +** * date - Pointer to date +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuExtRTC_SetRTCTimeDate(McuExtRTC_TTIME *time, McuExtRTC_TDATE *date); +/* +** =================================================================== +** Method : SetRTCTimeDate (component RTC_Maxim) +** +** Description : +** Sets the date and time. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to time to be set +** * date - Pointer to date to be set +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuExtRTC_SetRTCTime(McuExtRTC_TTIME *time); +/* +** =================================================================== +** Method : SetRTCTime (component RTC_Maxim) +** +** Description : +** Sets the time using the RTC low level information. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to time to be set +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuExtRTC_GetRTCTime(McuExtRTC_TTIME *time); +/* +** =================================================================== +** Method : GetRTCTime (component RTC_Maxim) +** +** Description : +** Returns the time using the RTC low level information. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to time +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuExtRTC_GetRTCDate(McuExtRTC_TDATE *date); +/* +** =================================================================== +** Method : GetRTCDate (component RTC_Maxim) +** +** Description : +** Returns the date from the device using the RTC low level +** information. +** Parameters : +** NAME - DESCRIPTION +** * date - Pointer to date +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuExtRTC_SetRTCDate(McuExtRTC_TDATE *date); +/* +** =================================================================== +** Method : SetRTCDate (component RTC_Maxim) +** +** Description : +** Sets the date using the RTC low level information. +** Parameters : +** NAME - DESCRIPTION +** * date - Pointer to date to be set +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuExtRTC_Init(void); +/* +** =================================================================== +** Method : Init (component RTC_Maxim) +** +** Description : +** Initializes the driver. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuExtRTC_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component RTC_Maxim) +** +** Description : +** Deinitializes the driver. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuExtRTC_Read(uint8_t addr, uint8_t *buf, uint8_t bufSize); +/* +** =================================================================== +** Method : Read (component RTC_Maxim) +** +** Description : +** Read from the device +** Parameters : +** NAME - DESCRIPTION +** addr - device memory address +** * buf - Pointer to read buffer +** bufSize - Size of read buffer +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuExtRTC_Write(uint8_t addr, uint8_t *buf, uint8_t bufSize); +/* +** =================================================================== +** Method : Write (component RTC_Maxim) +** +** Description : +** Write from the device +** Parameters : +** NAME - DESCRIPTION +** addr - device memory address +** * buf - Pointer to read buffer +** bufSize - +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuExtRTC_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : ParseCommand (component RTC_Maxim) +** +** Description : +** Shell Command Line parser +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command line +** * handled - Pointer to variable which tells if +** the command has been handled or not +** * io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuExtRTC_ReadByte(uint8_t addr, uint8_t *buf); +/* +** =================================================================== +** Method : ReadByte (component RTC_Maxim) +** +** Description : +** Read from the device RAM +** Parameters : +** NAME - DESCRIPTION +** addr - device memory address, with zero as the +** RAM start address +** * buf - Pointer to read buffer +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuExtRTC_WriteByte(uint8_t addr, uint8_t buf); +/* +** =================================================================== +** Method : WriteByte (component RTC_Maxim) +** +** Description : +** Read from the device RAM +** Parameters : +** NAME - DESCRIPTION +** addr - device memory address, with zero as the +** RAM memory start address +** buf - value to write +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuExtRTC_ReadBlock(uint8_t addr, uint8_t *buf, uint8_t bufSize); +/* +** =================================================================== +** Method : ReadBlock (component RTC_Maxim) +** +** Description : +** Read from the device RAM +** Parameters : +** NAME - DESCRIPTION +** addr - device memory address, with zero as the +** RAM start address +** * buf - Pointer to read buffer +** bufSize - Size of read buffer +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuExtRTC_WriteBlock(uint8_t addr, uint8_t *buf, uint8_t bufSize); +/* +** =================================================================== +** Method : WriteBlock (component RTC_Maxim) +** +** Description : +** Read from the device RAM +** Parameters : +** NAME - DESCRIPTION +** addr - device memory address, with zero as the +** RAM memory start address +** * buf - Pointer to read buffer +** bufSize - +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuExtRTC_GetTime(TIMEREC *time); +/* +** =================================================================== +** Method : GetTime (component RTC_Maxim) +** +** Description : +** Returns the time. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to time +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuExtRTC_SetTime(uint8_t Hour, uint8_t Min, uint8_t Sec, uint8_t Sec100); +/* +** =================================================================== +** Method : SetTime (component RTC_Maxim) +** +** Description : +** Sets the time. +** Parameters : +** NAME - DESCRIPTION +** Hour - Hours (0 - 23) +** Min - Minutes (0 - 59) +** Sec - Seconds (0 - 59) +** Sec100 - Hundredths of seconds (0 - 99) +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuExtRTC_GetDate(DATEREC *date); +/* +** =================================================================== +** Method : GetDate (component RTC_Maxim) +** +** Description : +** Returns the time and date from the device. +** Parameters : +** NAME - DESCRIPTION +** * date - Pointer to date +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuExtRTC_SetDate(uint16_t Year, uint8_t Month, uint8_t Day); +/* +** =================================================================== +** Method : SetDate (component RTC_Maxim) +** +** Description : +** Sets the date. +** Parameters : +** NAME - DESCRIPTION +** Year - Year in 2000 format +** Month - Month number (1..12) +** Day - Day number (1..31) +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuExtRTC_GetTemperature(float *temperature); +/* +** =================================================================== +** Method : GetTemperature (component RTC_Maxim) +** +** Description : +** Returns the temperature from the device internal temperature +** sensor. Only available on DS3231 and DS3232. +** Parameters : +** NAME - DESCRIPTION +** * temperature - Pointer to store the +** temperature +** Returns : +** --- - Error code +** =================================================================== +*/ + +/* END McuExtRTC. */ + +#endif +/* ifndef __McuExtRTC_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuFXOS8700.c b/TSM_PicoW_Sensor/McuLib/src/McuFXOS8700.c new file mode 100644 index 0000000..5511d66 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuFXOS8700.c @@ -0,0 +1,1198 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFXOS8700.h +** CDE edition : Standard +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : FXOS8700CQ +** Version : Component 01.036, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2021-12-26, 16:08, # CodeGen: 770 +** Abstract : +** Implements a Driver for the MMA8451 accelerometer from Freescale. +** Settings : +** Component Name : McuFXOS8700 +** Slave Address : 1E +** I2C Bus : McuGenericI2C +** Constant Offsets : Enabled +** X offset : 0 +** Y offset : 0 +** Z offset : 0 +** Shell : Enabled +** Shell : McuShell +** Utility : McuUtility +** Contents : +** Enable - uint8_t McuFXOS8700_Enable(void); +** Disable - uint8_t McuFXOS8700_Disable(void); +** MagEnable - uint8_t McuFXOS8700_MagEnable(void); +** MagDisable - uint8_t McuFXOS8700_MagDisable(void); +** isEnabled - uint8_t McuFXOS8700_isEnabled(bool *isEnabled); +** SwReset - uint8_t McuFXOS8700_SwReset(void); +** ReadReg8 - uint8_t McuFXOS8700_ReadReg8(uint8_t addr, uint8_t *val); +** WriteReg8 - uint8_t McuFXOS8700_WriteReg8(uint8_t addr, uint8_t val); +** GetX - int16_t McuFXOS8700_GetX(void); +** GetY - int16_t McuFXOS8700_GetY(void); +** GetZ - int16_t McuFXOS8700_GetZ(void); +** GetRaw8XYZ - uint8_t McuFXOS8700_GetRaw8XYZ(void* *xyz); +** CalibrateX1g - void McuFXOS8700_CalibrateX1g(void); +** CalibrateY1g - void McuFXOS8700_CalibrateY1g(void); +** CalibrateZ1g - void McuFXOS8700_CalibrateZ1g(void); +** GetXmg - int16_t McuFXOS8700_GetXmg(void); +** GetYmg - int16_t McuFXOS8700_GetYmg(void); +** GetZmg - int16_t McuFXOS8700_GetZmg(void); +** MeasureGetRawX - uint16_t McuFXOS8700_MeasureGetRawX(void); +** MeasureGetRawY - uint16_t McuFXOS8700_MeasureGetRawY(void); +** MeasureGetRawZ - uint16_t McuFXOS8700_MeasureGetRawZ(void); +** GetXOffset - int16_t McuFXOS8700_GetXOffset(void); +** GetYOffset - int16_t McuFXOS8700_GetYOffset(void); +** GetZOffset - int16_t McuFXOS8700_GetZOffset(void); +** GetX1gValue - int16_t McuFXOS8700_GetX1gValue(void); +** GetY1gValue - int16_t McuFXOS8700_GetY1gValue(void); +** GetZ1gValue - int16_t McuFXOS8700_GetZ1gValue(void); +** SetFastMode - uint8_t McuFXOS8700_SetFastMode(bool on); +** WhoAmI - uint8_t McuFXOS8700_WhoAmI(uint8_t *value); +** GetTemperature - uint8_t McuFXOS8700_GetTemperature(int8_t *temperature); +** GetMagX - uint8_t McuFXOS8700_GetMagX(int16_t *value); +** GetMagY - uint8_t McuFXOS8700_GetMagY(int16_t *value); +** GetMagZ - uint8_t McuFXOS8700_GetMagZ(int16_t *value); +** ParseCommand - uint8_t McuFXOS8700_ParseCommand(const unsigned char *cmd, bool *handled,... +** MagneticSensorReset - uint8_t McuFXOS8700_MagneticSensorReset(void); +** Init - uint8_t McuFXOS8700_Init(void); +** Deinit - uint8_t McuFXOS8700_Deinit(void); +** +** * Copyright (c) 2013-2021, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFXOS8700.h +** @version 01.00 +** @brief +** Implements a Driver for the MMA8451 accelerometer from Freescale. +*/ +/*! +** @addtogroup McuFXOS8700_module McuFXOS8700 module documentation +** @{ +*/ + +/* MODULE McuFXOS8700. */ + +#include "McuFXOS8700.h" + +#define McuFXOS8700_CPU_IS_LITTLE_ENDIAN 1 /* Cpu is little endian */ + +typedef struct { + int16_t NxOff; /* offset for X axis */ + int16_t NyOff; /* offset for Y axis */ + int16_t NzOff; /* offset for Z axis */ +} tAccelCal; + +/* default calibration values from component properties */ +static const tAccelCal InitialCalibration = { /* Initial default calibration values */ + 0, /* X offset */ + 0, /* Y offset */ + 0, /* Z offset */ +}; +static tAccelCal sCalValues; /* calibration values in RAM */ + +#define CalNxOff sCalValues.NxOff +#define CalNyOff sCalValues.NyOff +#define CalNzOff sCalValues.NzOff + +static uint8_t PrintStatus(const McuShell_StdIOType *io) { + unsigned char buf[42]; + int8_t temperature; + uint16_t val; + uint8_t val8; + bool isEnabled; + int16_t val16s; + + McuShell_SendStatusStr((unsigned char*)"McuFXOS8700", (unsigned char*)"FXOS8700 sensor status\r\n", io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), (uint8_t)McuFXOS8700_I2C_ADDR); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" I2C addr", buf, io->stdOut); + + if (McuFXOS8700_isEnabled(&isEnabled)!=ERR_OK) { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"FAIL!\r\n"); + } else { + if (isEnabled) { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"yes\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"no\r\n"); + } + } + McuShell_SendStatusStr((unsigned char*)" enabled", buf, io->stdOut); + + McuShell_SendStatusStr((unsigned char*)" raw", (unsigned char*)"0x", io->stdOut); + val = McuFXOS8700_MeasureGetRawX(); + buf[0] = '\0'; + McuUtility_strcatNum16Hex(buf, sizeof(buf), (uint16_t)val); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)" (", io->stdOut); + McuShell_SendNum16s((int16_t)val, io->stdOut); + McuShell_SendStr((unsigned char*)"), 0x", io->stdOut); + + val = McuFXOS8700_MeasureGetRawY(); + buf[0] = '\0'; + McuUtility_strcatNum16Hex(buf, sizeof(buf), (uint16_t)val); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)" (", io->stdOut); + McuShell_SendNum16s((int16_t)val, io->stdOut); + McuShell_SendStr((unsigned char*)"), 0x", io->stdOut); + + val = McuFXOS8700_MeasureGetRawZ(); + buf[0] = '\0'; + McuUtility_strcatNum16Hex(buf, sizeof(buf), (uint16_t)val); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)" (", io->stdOut); + McuShell_SendNum16s((int16_t)val, io->stdOut); + McuShell_SendStr((unsigned char*)")\r\n", io->stdOut); + + McuShell_SendStatusStr((unsigned char*)" calibOffset", (unsigned char*)"", io->stdOut); + McuShell_SendNum16s(McuFXOS8700_GetXOffset(), io->stdOut); + McuShell_SendStr((unsigned char*)" ", io->stdOut); + McuShell_SendNum16s(McuFXOS8700_GetYOffset(), io->stdOut); + McuShell_SendStr((unsigned char*)" ", io->stdOut); + McuShell_SendNum16s(McuFXOS8700_GetZOffset(), io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + + McuShell_SendStatusStr((unsigned char*)" calib 1g", (unsigned char*)"", io->stdOut); + McuShell_SendNum16s(McuFXOS8700_GetX1gValue(), io->stdOut); + McuShell_SendStr((unsigned char*)" ", io->stdOut); + McuShell_SendNum16s(McuFXOS8700_GetY1gValue(), io->stdOut); + McuShell_SendStr((unsigned char*)" ", io->stdOut); + McuShell_SendNum16s(McuFXOS8700_GetZ1gValue(), io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + + McuShell_SendStatusStr((unsigned char*)" GetX,Y,Z", (unsigned char*)"", io->stdOut); + McuShell_SendNum16s(McuFXOS8700_GetX(), io->stdOut); + McuShell_SendStr((unsigned char*)" ", io->stdOut); + McuShell_SendNum16s(McuFXOS8700_GetY(), io->stdOut); + McuShell_SendStr((unsigned char*)" ", io->stdOut); + McuShell_SendNum16s(McuFXOS8700_GetZ(), io->stdOut); + McuShell_SendStr((unsigned char*)" (raw+offset)\r\n", io->stdOut); + + McuShell_SendStatusStr((unsigned char*)" mg X,Y,Z", (unsigned char*)"", io->stdOut); + McuShell_SendNum16s(McuFXOS8700_GetXmg(), io->stdOut); + McuShell_SendStr((unsigned char*)" ", io->stdOut); + McuShell_SendNum16s(McuFXOS8700_GetYmg(), io->stdOut); + McuShell_SendStr((unsigned char*)" ", io->stdOut); + McuShell_SendNum16s(McuFXOS8700_GetZmg(), io->stdOut); + McuShell_SendStr((unsigned char*)" (milli-g)\r\n", io->stdOut); + + if (McuFXOS8700_GetTemperature(&temperature)==ERR_OK) { + McuUtility_Num8sToStr(buf, sizeof(buf), temperature); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" degree C (offset "); + McuUtility_strcatNum8s(buf, sizeof(buf), McuFXOS8700_DIE_TEMP_OFFSET); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" degree C)\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"FAILED\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" Temperature", buf, io->stdOut); + + if (McuFXOS8700_WhoAmI(&val8)==ERR_OK) { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), val8); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"FAILED\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" Who am I", buf, io->stdOut); + + McuShell_SendStatusStr((unsigned char*)" GetMagX,Y,Z", (unsigned char*)"", io->stdOut); + val16s = 0; + (void)McuFXOS8700_GetMagX(&val16s); + McuShell_SendNum16s(val16s, io->stdOut); + McuShell_SendStr((unsigned char*)" ", io->stdOut); + (void)McuFXOS8700_GetMagY(&val16s); + McuShell_SendNum16s(val16s, io->stdOut); + McuShell_SendStr((unsigned char*)" ", io->stdOut); + (void)McuFXOS8700_GetMagZ(&val16s); + McuShell_SendNum16s(val16s, io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + + return ERR_OK; +} + +static uint8_t PrintHelp(const McuShell_StdIOType *io) { + McuShell_SendHelpStr((unsigned char*)"McuFXOS8700", (unsigned char*)"Group of McuFXOS8700 commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" calibrate x|y|z", (unsigned char*)"Performs accelerometer calibration\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" swreset", (unsigned char*)"Performs a device software reset\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" magreset", (unsigned char*)"Performs a magenetometer sensor reset\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" enable|disable", (unsigned char*)"Enables or disables the accelerometer sensor\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" mag enable|disable", (unsigned char*)"Enables or disables the magnet sensor\r\n", io->stdOut); + return ERR_OK; +} + +/* +** =================================================================== +** Method : GetRaw8XYZ (component FXOS8700CQ) +** +** Description : +** Returns in an array the x, y and z accelerometer as 8bit +** values. +** Parameters : +** NAME - DESCRIPTION +** * xyz - Pointer to an array of three unsigned 8bit +** values which are used to return the +** accelerometer values. +** Returns : +** --- - Error code, ERR_OK for no error. +** =================================================================== +*/ +uint8_t McuFXOS8700_GetRaw8XYZ(uint8_t *xyz) +{ + static const uint8_t addr = McuFXOS8700_OUT_X_MSB; + + return McuGenericI2C_ReadAddress(McuFXOS8700_I2C_ADDR, (uint8_t*)&addr, sizeof(addr), &xyz[0], 3); +} + +/* +** =================================================================== +** Method : Deinit (component FXOS8700CQ) +** +** Description : +** Counterpart to Init() method. +** Parameters : None +** Returns : +** --- - Error code, ERR_OK if everything is ok. +** =================================================================== +*/ +uint8_t McuFXOS8700_Deinit(void) +{ + return ERR_OK; /* nothing to do */ +} + +/* +** =================================================================== +** Method : Init (component FXOS8700CQ) +** +** Description : +** Initializes the device driver +** Parameters : None +** Returns : +** --- - Error code, ERR_OK if everything is ok. +** =================================================================== +*/ +uint8_t McuFXOS8700_Init(void) +{ + sCalValues.NxOff = InitialCalibration.NxOff; + sCalValues.NyOff = InitialCalibration.NyOff; + sCalValues.NzOff = InitialCalibration.NzOff; + return McuGenericI2C_WriteByteAddress8(McuFXOS8700_I2C_ADDR, McuFXOS8700_CTRL_REG_1, McuFXOS8700_ACTIVE_BIT_MASK); /* enable device */ +} + +/* +** =================================================================== +** Method : CalibrateX1g (component FXOS8700CQ) +** +** Description : +** Performs a calibration of the sensor. It is assumed that the +** Y and Z sensors have 0 g, and the X sensor has 1 g. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFXOS8700_CalibrateX1g(void) +{ + /* assumption is that accelerometer is placed with 1g for X and 0g for Y and Z */ + int32_t X=0, Y=0, Z=0; + uint8_t i; + + /* Get the raw data and remove 2 bits (16bit to 14bit) */ + for (i=0; i<8; i++) { + X += ((int16_t)McuFXOS8700_MeasureGetRawX() >> 2); + Y += ((int16_t)McuFXOS8700_MeasureGetRawY() >> 2); + Z += ((int16_t)McuFXOS8700_MeasureGetRawZ() >> 2); + } + /* build average of 8 measured values */ + X >>= 3; + Y >>= 3; + Z >>= 3; + /* store the calibration values */ + /* offset: both Y and Z shall have zero g */ + sCalValues.NzOff = (X - (1000 << 2)); + sCalValues.NyOff = (int16_t)Y; + sCalValues.NzOff = (int16_t)Z; +} + +/* +** =================================================================== +** Method : CalibrateY1g (component FXOS8700CQ) +** +** Description : +** Performs a calibration of the sensor. It is assumed that the +** X and Z sensors have 0 g, and the Y sensor has 1 g. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFXOS8700_CalibrateY1g(void) +{ + /* assumption is that accelerometer is placed with 1g for Y and 0g for X and Z */ + int32_t X=0, Y=0, Z=0; + uint8_t i; + + /* Get the raw data and remove 2 bits (16bit to 14bit) */ + for (i=0; i<8; i++) { + X += ((int16_t)McuFXOS8700_MeasureGetRawX() >> 2); + Y += ((int16_t)McuFXOS8700_MeasureGetRawY() >> 2); + Z += ((int16_t)McuFXOS8700_MeasureGetRawZ() >> 2); + } + /* build average of 8 measured values */ + X >>= 3; + Y >>= 3; + Z >>= 3; + /* store the calibration values */ + /* offset: both X and Z shall have zero g */ + sCalValues.NxOff = X; + sCalValues.NzOff = (Y - (1000 << 2)); + sCalValues.NzOff = Z; +} + +/* +** =================================================================== +** Method : CalibrateZ1g (component FXOS8700CQ) +** +** Description : +** Performs a calibration of the sensor. It is assumed that the +** X and Y sensors have 0 g, and the Z sensor has 1 g. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFXOS8700_CalibrateZ1g(void) +{ + /* assumption is that accelerometer is placed with 1g for Z and 0g for X and Y */ + int32_t X=0, Y=0, Z=0; + uint8_t i; + + /* Get the raw data and remove 2 bits (16bit to 14bit) */ + for (i=0; i<8; i++) { + X += ((int16_t)McuFXOS8700_MeasureGetRawX() >> 2); + Y += ((int16_t)McuFXOS8700_MeasureGetRawY() >> 2); + Z += ((int16_t)McuFXOS8700_MeasureGetRawZ() >> 2); + } + /* build average of 8 measured values */ + X >>= 3; + Y >>= 3; + Z >>= 3; + /* store the calibration values */ + /* offset: both X and Y shall have zero g (midpoint) */ + sCalValues.NxOff = X; + sCalValues.NyOff = Y; + sCalValues.NzOff = (Z - (1000 << 2)); +} + +/* +** =================================================================== +** Method : GetXmg (component FXOS8700CQ) +** +** Description : +** Returns the X value in mg +** Parameters : None +** Returns : +** --- - The g value in 1/1000g units +** =================================================================== +*/ +int16_t McuFXOS8700_GetXmg(void) +{ + return McuFXOS8700_GetX() / 4; +} + +/* +** =================================================================== +** Method : GetYmg (component FXOS8700CQ) +** +** Description : +** Returns the Y value in mg +** Parameters : None +** Returns : +** --- - The g value in 1/1000g units +** =================================================================== +*/ +int16_t McuFXOS8700_GetYmg(void) +{ + return McuFXOS8700_GetY() / 4; +} + +/* +** =================================================================== +** Method : GetZmg (component FXOS8700CQ) +** +** Description : +** Returns the Z value in mg +** Parameters : None +** Returns : +** --- - The g value in 1/1000g units +** =================================================================== +*/ +int16_t McuFXOS8700_GetZmg(void) +{ + return McuFXOS8700_GetZ() / 4; +} + +/* +** =================================================================== +** Method : MeasureGetRawX (component FXOS8700CQ) +** +** Description : +** Performs a measurement on X channel and returns the raw +** value. +** Parameters : None +** Returns : +** --- - X sensor value +** =================================================================== +*/ +uint16_t McuFXOS8700_MeasureGetRawX(void) +{ + union { + uint8_t buf[2]; /* value from device is in big endian */ + uint16_t be; + } val; + static const uint8_t addr = McuFXOS8700_OUT_X_MSB; + + val.be = 0; /* init */ + if(McuGenericI2C_ReadAddress(McuFXOS8700_I2C_ADDR, (uint8_t*)&addr, sizeof(addr), &val.buf[0], sizeof(val.buf))!=ERR_OK) { + return 0; /* failure */ + } +#if McuFXOS8700_CPU_IS_LITTLE_ENDIAN + return (uint16_t)((val.buf[0]<<8)|val.buf[1]); /* transform into LE value */ +#else + return val.be; /* already in BE */ +#endif +} + +/* +** =================================================================== +** Method : MeasureGetRawY (component FXOS8700CQ) +** +** Description : +** Performs a measurement on Y channel and returns the raw +** value. +** Parameters : None +** Returns : +** --- - Y sensor value +** =================================================================== +*/ +uint16_t McuFXOS8700_MeasureGetRawY(void) +{ + union { + uint8_t buf[2]; /* value from device is in big endian */ + uint16_t be; + } val; + static const uint8_t addr = McuFXOS8700_OUT_Y_MSB; + + val.be = 0; /* init */ + if(McuGenericI2C_ReadAddress(McuFXOS8700_I2C_ADDR, (uint8_t*)&addr, sizeof(addr), &val.buf[0], sizeof(val.buf))!=ERR_OK) { + return 0; /* failure */ + } +#if McuFXOS8700_CPU_IS_LITTLE_ENDIAN + return (uint16_t)((val.buf[0]<<8)|val.buf[1]); /* transform into LE value */ +#else + return val.be; /* already in BE */ +#endif +} + +/* +** =================================================================== +** Method : MeasureGetRawZ (component FXOS8700CQ) +** +** Description : +** Performs a measurement on Z channel and returns the raw +** value. +** Parameters : None +** Returns : +** --- - Z sensor value +** =================================================================== +*/ +uint16_t McuFXOS8700_MeasureGetRawZ(void) +{ + union { + uint8_t buf[2]; /* value from device is in big endian */ + uint16_t be; + } val; + static const uint8_t addr = McuFXOS8700_OUT_Z_MSB; + + val.be = 0; /* init */ + if(McuGenericI2C_ReadAddress(McuFXOS8700_I2C_ADDR, (uint8_t*)&addr, sizeof(addr), &val.buf[0], sizeof(val.buf))!=ERR_OK) { + return 0; /* failure */ + } +#if McuFXOS8700_CPU_IS_LITTLE_ENDIAN + return (uint16_t)((val.buf[0]<<8)|val.buf[1]); /* transform into LE value */ +#else + return val.be; /* already in BE */ +#endif +} + +/* +** =================================================================== +** Method : GetXOffset (component FXOS8700CQ) +** +** Description : +** Returns the offset applied to the X value. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +int16_t McuFXOS8700_GetXOffset(void) +{ + return CalNxOff; +} + +/* +** =================================================================== +** Method : GetYOffset (component FXOS8700CQ) +** +** Description : +** Returns the offset applied to the Y value. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +int16_t McuFXOS8700_GetYOffset(void) +{ + return CalNyOff; +} + +/* +** =================================================================== +** Method : GetZOffset (component FXOS8700CQ) +** +** Description : +** Returns the offset applied to the Z value. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +int16_t McuFXOS8700_GetZOffset(void) +{ + return CalNzOff; +} + +/* +** =================================================================== +** Method : GetX1gValue (component FXOS8700CQ) +** +** Description : +** Returns the value for 1g for channel X. +** Parameters : None +** Returns : +** --- - 1g value for X +** =================================================================== +*/ +int16_t McuFXOS8700_GetX1gValue(void) +{ + return 4096; +} + +/* +** =================================================================== +** Method : GetY1gValue (component FXOS8700CQ) +** +** Description : +** Returns the value for 1g for channel Y. +** Parameters : None +** Returns : +** --- - 1g value for Y +** =================================================================== +*/ +int16_t McuFXOS8700_GetY1gValue(void) +{ + return 4096; +} + +/* +** =================================================================== +** Method : GetZ1gValue (component FXOS8700CQ) +** +** Description : +** Returns the value for 1g for channel Z. +** Parameters : None +** Returns : +** --- - 1g value for Z +** =================================================================== +*/ +int16_t McuFXOS8700_GetZ1gValue(void) +{ + return 4096; +} + +/* +** =================================================================== +** Method : GetX (component FXOS8700CQ) +** +** Description : +** Retrieves the value for the X axis. The value is adjusted +** with the zero calibration value (0 for 0 g, negative for +** negative acceleration and positive for positive acceleration). +** Parameters : None +** Returns : +** --- - Measured X value +** =================================================================== +*/ +int16_t McuFXOS8700_GetX(void) +{ + int16_t value; + + value = (int16_t)McuFXOS8700_MeasureGetRawX() >> 2; /* remove 2 bits (16bit to 14bit) */ + value -= CalNxOff; /* adjust with calibration offset */ + return value; +} + +/* +** =================================================================== +** Method : GetY (component FXOS8700CQ) +** +** Description : +** Retrieves the value for the Y axis. The value is adjusted +** with the zero calibration value (0 for 0 g, negative for +** negative acceleration and positive for positive acceleration). +** Parameters : None +** Returns : +** --- - Measured Y value +** =================================================================== +*/ +int16_t McuFXOS8700_GetY(void) +{ + int16_t value; + + value = (int16_t)McuFXOS8700_MeasureGetRawY() >> 2; /* remove 2 bits (16bit to 14bit) */ + value -= CalNyOff; /* adjust with calibration offset */ + return value; +} + +/* +** =================================================================== +** Method : GetZ (component FXOS8700CQ) +** +** Description : +** Retrieves the value for the Z axis. The value is adjusted +** with the zero calibration value (0 for 0 g, negative for +** negative acceleration and positive for positive acceleration). +** Parameters : None +** Returns : +** --- - Measured Z value +** =================================================================== +*/ +int16_t McuFXOS8700_GetZ(void) +{ + int16_t value; + + value = (int16_t)McuFXOS8700_MeasureGetRawZ() >> 2; /* remove 2 bits (16bit to 14bit) */ + value -= CalNzOff; /* adjust with calibration offset */ + return value; +} + +/* +** =================================================================== +** Method : ParseCommand (component FXOS8700CQ) +** +** Description : +** Shell Command Line parser. This method is enabled/disabled +** depending on if you have the Shell enabled/disabled in the +** properties. +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command string +** * handled - Pointer to variable which tells if +** the command has been handled or not +** * io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuFXOS8700_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) +{ + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, "McuFXOS8700 help")==0) { + *handled = TRUE; + return PrintHelp(io); + } else if ((McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) || (McuUtility_strcmp((char*)cmd, "McuFXOS8700 status")==0)) { + *handled = TRUE; + return PrintStatus(io); + } else if (McuUtility_strcmp((char*)cmd, (char*)"McuFXOS8700 calibrate x")==0) { + *handled = TRUE; + McuFXOS8700_CalibrateX1g(); + return ERR_OK; + } else if (McuUtility_strcmp((char*)cmd, (char*)"McuFXOS8700 calibrate y")==0) { + *handled = TRUE; + McuFXOS8700_CalibrateY1g(); + return ERR_OK; + } else if (McuUtility_strcmp((char*)cmd, (char*)"McuFXOS8700 calibrate z")==0) { + *handled = TRUE; + McuFXOS8700_CalibrateZ1g(); + return ERR_OK; + } else if (McuUtility_strcmp((char*)cmd, (char*)"McuFXOS8700 enable")==0) { + *handled = TRUE; + return McuFXOS8700_Enable(); + } else if (McuUtility_strcmp((char*)cmd, (char*)"McuFXOS8700 disable")==0) { + *handled = TRUE; + return McuFXOS8700_Disable(); + } else if (McuUtility_strcmp((char*)cmd, (char*)"McuFXOS8700 mag enable")==0) { + *handled = TRUE; + return McuFXOS8700_MagEnable(); + } else if (McuUtility_strcmp((char*)cmd, (char*)"McuFXOS8700 mag disable")==0) { + *handled = TRUE; + return McuFXOS8700_MagDisable(); + } else if (McuUtility_strcmp((char*)cmd, (char*)"McuFXOS8700 swreset")==0) { + *handled = TRUE; + if (McuFXOS8700_SwReset()!=ERR_OK) { + McuShell_SendStr((unsigned char*)"SW reset failed!\r\n", io->stdErr); + return ERR_FAILED; + } else { + return ERR_OK; + } + } else if (McuUtility_strcmp((char*)cmd, (char*)"McuFXOS8700 magreset")==0) { + *handled = TRUE; + if (McuFXOS8700_MagneticSensorReset()!=ERR_OK) { + McuShell_SendStr((unsigned char*)"Magnetometer sensor reset failed!\r\n", io->stdErr); + return ERR_FAILED; + } else { + return ERR_OK; + } + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : SetFastMode (component FXOS8700CQ) +** +** Description : +** Turns the F_READ (Fast Read Mode) on or off +** Parameters : +** NAME - DESCRIPTION +** on - if to turn the F_READ mode on or off +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuFXOS8700_SetFastMode(bool on) +{ + uint8_t val, res; + + res = McuGenericI2C_ReadByteAddress8(McuFXOS8700_I2C_ADDR, McuFXOS8700_CTRL_REG_1, &val); + if (res!=ERR_OK) { + return res; + } + if (on) { + val |= McuFXOS8700_F_READ_BIT_MASK; /* enable F_READ: Fast read mode, data format limited to single byte (auto increment counter will skip LSB) */ + } else { + val &= ~McuFXOS8700_F_READ_BIT_MASK; /* disable F_READ: Fast read mode, data format limited to single byte (auto increment counter will skip LSB) */ + } + return McuGenericI2C_WriteByteAddress8(McuFXOS8700_I2C_ADDR, McuFXOS8700_CTRL_REG_1, val); +} + +/* +** =================================================================== +** Method : MagEnable (component FXOS8700CQ) +** +** Description : +** Enables the magnetometer +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuFXOS8700_MagEnable(void) +{ + uint8_t val, res; + + // write 0001 1111 = 0x1F to magnetometer control register 1 + // [7]: m_acal=0: auto calibration disabled + // [6]: m_rst=0: no one-shot magnetic reset + // [5]: m_ost=0: no one-shot magnetic measurement + // [4-2]: m_os=111=7: 8x oversampling (for 200Hz) to reduce magnetometer noise + // [1-0]: m_hms=11=3: select hybrid mode with accel and magnetometer active + val = 0x1F; + res = McuGenericI2C_WriteByteAddress8(McuFXOS8700_I2C_ADDR, McuFXOS8700_M_CTRL_REG_1, val); + if (res!=ERR_OK) { + return res; + } + + // write 0010 0000 = 0x20 to magnetometer control register 2 + // [7]: reserved + // [6]: reserved + // [5]: hyb_autoinc_mode=1 to map the magnetometer registers to follow the + // accelerometer registers + // [4]: m_maxmin_dis=0 to retain default min/max latching even though not used + // [3]: m_maxmin_dis_ths=0 + // [2]: m_maxmin_rst=0 + // [1-0]: m_rst_cnt=00 to enable magnetic reset each cycle + val = 0x20; + res = McuGenericI2C_WriteByteAddress8(McuFXOS8700_I2C_ADDR, McuFXOS8700_M_CTRL_REG_2, val); + if (res!=ERR_OK) { + return res; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : MagDisable (component FXOS8700CQ) +** +** Description : +** Disables the magnetometer +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuFXOS8700_MagDisable(void) +{ + return ERR_OK; /* not doing anything */ +} + +/* +** =================================================================== +** Method : Enable (component FXOS8700CQ) +** +** Description : +** Enables the device with setting the ACTIVE bit in the CTRL +** register 1 +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuFXOS8700_Enable(void) +{ + uint8_t val, res; + + res = McuGenericI2C_ReadByteAddress8(McuFXOS8700_I2C_ADDR, McuFXOS8700_CTRL_REG_1, &val); + if (res!=ERR_OK) { + return res; + } + if (val&McuFXOS8700_ACTIVE_BIT_MASK) { + return ERR_OK; /* already enabled */ + } + McuWait_Waitms(1); /* for unknown reasons, need to wait for 1 ms after reading the register */ + val |= McuFXOS8700_ACTIVE_BIT_MASK; /* enable device */ + return McuGenericI2C_WriteByteAddress8(McuFXOS8700_I2C_ADDR, McuFXOS8700_CTRL_REG_1, val); +} + +/* +** =================================================================== +** Method : Disable (component FXOS8700CQ) +** +** Description : +** Disables the device with clearing the ACTIVE bit in the CTRL +** register 1 +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuFXOS8700_Disable(void) +{ + uint8_t val, res; + + res = McuGenericI2C_ReadByteAddress8(McuFXOS8700_I2C_ADDR, McuFXOS8700_CTRL_REG_1, &val); + if (res!=ERR_OK) { + return res; + } + if ((val&McuFXOS8700_ACTIVE_BIT_MASK)==0) { + return ERR_OK; /* already disabled */ + } + McuWait_Waitms(1); /* for unknown reasons, need to wait for 1 ms after reading the register */ + val &= ~McuFXOS8700_ACTIVE_BIT_MASK; /* disable device */ + return McuGenericI2C_WriteByteAddress8(McuFXOS8700_I2C_ADDR, McuFXOS8700_CTRL_REG_1, val); +} + +/* +** =================================================================== +** Method : isEnabled (component FXOS8700CQ) +** +** Description : +** Returns the status of the the ACTIVE bit in the CTRL +** register 1 +** Parameters : +** NAME - DESCRIPTION +** * isEnabled - Pointer to where to store the +** result, TRUE if ACTIVE bit is set, FALSE +** otherwise +** Returns : +** --- - error code +** =================================================================== +*/ +uint8_t McuFXOS8700_isEnabled(bool *isEnabled) +{ + uint8_t val, res; + + res = McuGenericI2C_ReadByteAddress8(McuFXOS8700_I2C_ADDR, McuFXOS8700_CTRL_REG_1, &val); + if (res!=ERR_OK) { + return ERR_FAILED; + } + *isEnabled = (val&McuFXOS8700_ACTIVE_BIT_MASK)!=0; /* TRUE if bit is set, FALSE otherwise */ + return ERR_OK; +} + +/* +** =================================================================== +** Method : WhoAmI (component FXOS8700CQ) +** +** Description : +** Returns the value of the WHO_AM_I (0x0D) register +** Parameters : +** NAME - DESCRIPTION +** * value - Pointer to value to store +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuFXOS8700_WhoAmI(uint8_t *value) +{ + return McuGenericI2C_ReadByteAddress8(McuFXOS8700_I2C_ADDR, McuFXOS8700_WHO_AM_I, value); +} + +/* +** =================================================================== +** Method : GetTemperature (component FXOS8700CQ) +** +** Description : +** Returns the temperature of the die as signed 8bit values in +** degree Celsius +** Parameters : +** NAME - DESCRIPTION +** * temperature - Pointer to variable where +** to store the temperature +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuFXOS8700_GetTemperature(int8_t *temperature) +{ + int8_t temp; + + if (McuGenericI2C_ReadByteAddress8(McuFXOS8700_I2C_ADDR, McuFXOS8700_DIE_TEMP, (uint8_t*)&temp) != ERR_OK) { + return ERR_FAILED; + } + *temperature = (int8_t)(temp+McuFXOS8700_DIE_TEMP_OFFSET); + return ERR_OK; +} + +/* +** =================================================================== +** Method : GetMagX (component FXOS8700CQ) +** +** Description : +** Returns the X magnetometer value. +** Parameters : +** NAME - DESCRIPTION +** * value - Pointer to where to store the value. +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuFXOS8700_GetMagX(int16_t *value) +{ + union { + uint8_t buf[2]; /* value from device is in big endian */ + int16_t be; + } val; + static const uint8_t addr = McuFXOS8700_M_OUT_X_MSB; + + if(McuGenericI2C_ReadAddress(McuFXOS8700_I2C_ADDR, (uint8_t*)&addr, sizeof(addr), &val.buf[0], sizeof(val.buf))!=ERR_OK) { + return ERR_FAILED; /* failure */ + } +#if McuFXOS8700_CPU_IS_LITTLE_ENDIAN + *value = (int16_t)((val.buf[0]<<8)|val.buf[1]); /* transform into LE value */ +#else + *value = val.be; /* already in BE */ +#endif + return ERR_OK; +} + +/* +** =================================================================== +** Method : GetMagY (component FXOS8700CQ) +** +** Description : +** Returns the Y magnetometer value. +** Parameters : +** NAME - DESCRIPTION +** * value - Pointer to where to store the value. +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuFXOS8700_GetMagY(int16_t *value) +{ + union { + uint8_t buf[2]; /* value from device is in big endian */ + int16_t be; + } val; + static const uint8_t addr = McuFXOS8700_M_OUT_Y_MSB; + + if(McuGenericI2C_ReadAddress(McuFXOS8700_I2C_ADDR, (uint8_t*)&addr, sizeof(addr), &val.buf[0], sizeof(val.buf))!=ERR_OK) { + return ERR_FAILED; /* failure */ + } +#if McuFXOS8700_CPU_IS_LITTLE_ENDIAN + *value = (int16_t)((val.buf[0]<<8)|val.buf[1]); /* transform into LE value */ +#else + *value = val.be; /* already in BE */ +#endif + return ERR_OK; +} + +/* +** =================================================================== +** Method : GetMagZ (component FXOS8700CQ) +** +** Description : +** Returns the Z magnetometer value. +** Parameters : +** NAME - DESCRIPTION +** * value - Pointer to where to store the value. +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuFXOS8700_GetMagZ(int16_t *value) +{ + union { + uint8_t buf[2]; /* value from device is in big endian */ + int16_t be; + } val; + static const uint8_t addr = McuFXOS8700_M_OUT_Z_MSB; + + if(McuGenericI2C_ReadAddress(McuFXOS8700_I2C_ADDR, (uint8_t*)&addr, sizeof(addr), &val.buf[0], sizeof(val.buf))!=ERR_OK) { + return ERR_FAILED; /* failure */ + } +#if McuFXOS8700_CPU_IS_LITTLE_ENDIAN + *value = (int16_t)((val.buf[0]<<8)|val.buf[1]); /* transform into LE value */ +#else + *value = val.be; /* already in BE */ +#endif + return ERR_OK; +} + +/* +** =================================================================== +** Method : MagneticSensorReset (component FXOS8700CQ) +** +** Description : +** Initiates a magnetic sensor reset cycle that will restore +** correct operation after exposure to an excessive magnetic +** field which exceeds the Full Scale Range but is less than +** the Maximum Applied Magnetic Field. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuFXOS8700_MagneticSensorReset(void) +{ + uint8_t val; + + if (McuGenericI2C_ReadByteAddress8(McuFXOS8700_I2C_ADDR, McuFXOS8700_CTRL_REG_2, &val)!=ERR_OK) { + return ERR_FAILED; + } + val |= McuFXOS8700_CTRL_REG_2_MASK_RST; /* set one shot reset bit */ + return McuGenericI2C_WriteByteAddress8(McuFXOS8700_I2C_ADDR, McuFXOS8700_CTRL_REG_2, val); +} + +/* +** =================================================================== +** Method : ReadReg8 (component FXOS8700CQ) +** +** Description : +** Reads an 8bit device register +** Parameters : +** NAME - DESCRIPTION +** addr - device memory map address +** * val - Pointer to value +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuFXOS8700_ReadReg8(uint8_t addr, uint8_t *val) +{ + if (McuGenericI2C_ReadByteAddress8(McuFXOS8700_I2C_ADDR, addr, val)!=ERR_OK) { + return ERR_FAILED; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : WriteReg8 (component FXOS8700CQ) +** +** Description : +** Write an 8bit device register +** Parameters : +** NAME - DESCRIPTION +** addr - device memory map address +** val - value to write +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuFXOS8700_WriteReg8(uint8_t addr, uint8_t val) +{ + return McuGenericI2C_WriteByteAddress8(McuFXOS8700_I2C_ADDR, addr, val); +} + +/* +** =================================================================== +** Method : SwReset (component FXOS8700CQ) +** +** Description : +** Perform a software reset using the rst bit in the CTRL +** register 2 +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuFXOS8700_SwReset(void) +{ + uint8_t val, res; + + res = McuGenericI2C_ReadByteAddress8(McuFXOS8700_I2C_ADDR, McuFXOS8700_CTRL_REG_2, &val); + if (res!=ERR_OK) { + return res; + } + val |= McuFXOS8700_CTRL_REG_2_MASK_RST; /* reset device */ + res = McuGenericI2C_WriteByteAddress8(McuFXOS8700_I2C_ADDR, McuFXOS8700_CTRL_REG_2, val); + if (res!=ERR_OK) { + return res; + } + McuWait_Waitms(1); /* wait for one ms after sending the software reset */ + return ERR_OK; +} + +/* END McuFXOS8700. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuFXOS8700.h b/TSM_PicoW_Sensor/McuLib/src/McuFXOS8700.h new file mode 100644 index 0000000..d7d1540 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuFXOS8700.h @@ -0,0 +1,707 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFXOS8700.h +** CDE edition : Standard +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : FXOS8700CQ +** Version : Component 01.036, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2021-12-26, 15:48, # CodeGen: 768 +** Abstract : +** Implements a Driver for the MMA8451 accelerometer from Freescale. +** Settings : +** Component Name : McuFXOS8700 +** Slave Address : 1E +** I2C Bus : McuGenericI2C +** Constant Offsets : Enabled +** X offset : 0 +** Y offset : 0 +** Z offset : 0 +** Shell : Enabled +** Shell : McuShell +** Utility : McuUtility +** Contents : +** Enable - uint8_t McuFXOS8700_Enable(void); +** Disable - uint8_t McuFXOS8700_Disable(void); +** MagEnable - uint8_t McuFXOS8700_MagEnable(void); +** MagDisable - uint8_t McuFXOS8700_MagDisable(void); +** isEnabled - uint8_t McuFXOS8700_isEnabled(bool *isEnabled); +** SwReset - uint8_t McuFXOS8700_SwReset(void); +** ReadReg8 - uint8_t McuFXOS8700_ReadReg8(uint8_t addr, uint8_t *val); +** WriteReg8 - uint8_t McuFXOS8700_WriteReg8(uint8_t addr, uint8_t val); +** GetX - int16_t McuFXOS8700_GetX(void); +** GetY - int16_t McuFXOS8700_GetY(void); +** GetZ - int16_t McuFXOS8700_GetZ(void); +** GetRaw8XYZ - uint8_t McuFXOS8700_GetRaw8XYZ(void* *xyz); +** CalibrateX1g - void McuFXOS8700_CalibrateX1g(void); +** CalibrateY1g - void McuFXOS8700_CalibrateY1g(void); +** CalibrateZ1g - void McuFXOS8700_CalibrateZ1g(void); +** GetXmg - int16_t McuFXOS8700_GetXmg(void); +** GetYmg - int16_t McuFXOS8700_GetYmg(void); +** GetZmg - int16_t McuFXOS8700_GetZmg(void); +** MeasureGetRawX - uint16_t McuFXOS8700_MeasureGetRawX(void); +** MeasureGetRawY - uint16_t McuFXOS8700_MeasureGetRawY(void); +** MeasureGetRawZ - uint16_t McuFXOS8700_MeasureGetRawZ(void); +** GetXOffset - int16_t McuFXOS8700_GetXOffset(void); +** GetYOffset - int16_t McuFXOS8700_GetYOffset(void); +** GetZOffset - int16_t McuFXOS8700_GetZOffset(void); +** GetX1gValue - int16_t McuFXOS8700_GetX1gValue(void); +** GetY1gValue - int16_t McuFXOS8700_GetY1gValue(void); +** GetZ1gValue - int16_t McuFXOS8700_GetZ1gValue(void); +** SetFastMode - uint8_t McuFXOS8700_SetFastMode(bool on); +** WhoAmI - uint8_t McuFXOS8700_WhoAmI(uint8_t *value); +** GetTemperature - uint8_t McuFXOS8700_GetTemperature(int8_t *temperature); +** GetMagX - uint8_t McuFXOS8700_GetMagX(int16_t *value); +** GetMagY - uint8_t McuFXOS8700_GetMagY(int16_t *value); +** GetMagZ - uint8_t McuFXOS8700_GetMagZ(int16_t *value); +** ParseCommand - uint8_t McuFXOS8700_ParseCommand(const unsigned char *cmd, bool *handled,... +** MagneticSensorReset - uint8_t McuFXOS8700_MagneticSensorReset(void); +** Init - uint8_t McuFXOS8700_Init(void); +** Deinit - uint8_t McuFXOS8700_Deinit(void); +** +** * Copyright (c) 2013-2021, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFXOS8700.h +** @version 01.00 +** @brief +** Implements a Driver for the MMA8451 accelerometer from Freescale. +*/ +/*! +** @addtogroup McuFXOS8700_module McuFXOS8700 module documentation +** @{ +*/ + +#ifndef __McuFXOS8700_H +#define __McuFXOS8700_H + +/* MODULE McuFXOS8700. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFXOS8700config.h" /* configuration */ + +/* Include inherited components */ +#include "McuGenericI2C.h" +#include "McuWait.h" +#include "McuLib.h" +#include "McuShell.h" +#include "McuUtility.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define McuFXOS8700_PARSE_COMMAND_ENABLED McuFXOS8700_CONFIG_PARSE_COMMAND_ENABLED /* set to 1 if method ParseCommand() is present, 0 otherwise */ + +/* 3-axis accelerometer control register addresses */ +#define McuFXOS8700_CTRL_REG_1 0x2A +/* 3-axis accelerometer control register bit masks */ +#define McuFXOS8700_ACTIVE_BIT_MASK 0x01 +#define McuFXOS8700_F_READ_BIT_MASK 0x02 + +#define McuFXOS8700_CTRL_REG_2 0x2B +#define McuFXOS8700_CTRL_REG_2_MASK_RST (1<<4) /* software reset */ + +/* External 3-axis accelerometer data register addresses */ +#define McuFXOS8700_OUT_X_MSB 0x01 +#define McuFXOS8700_OUT_X_LSB 0x02 +#define McuFXOS8700_OUT_Y_MSB 0x03 +#define McuFXOS8700_OUT_Y_LSB 0x04 +#define McuFXOS8700_OUT_Z_MSB 0x05 +#define McuFXOS8700_OUT_Z_LSB 0x06 + +#define McuFXOS8700_WHO_AM_I 0x0D /* Who am I register, should return 0xC4 for preproduction devices and 0xC7 for production devices */ +#define McuFXOS8700_WHO_AM_I_VAL 0xC7 /* production device value */ + +#define McuFXOS8700_XYZ_DATA_CFG 0x0E /* XYZ Data Configuration Register */ + +/* magnetometer control register */ +#define McuFXOS8700_M_CTRL_REG_1 0x5B +#define McuFXOS8700_M_CTRL_REG_2 0x5C +#define McuFXOS8700_M_CTRL_REG_3 0x5D + +/* Magnetometer data register addresses */ +#define McuFXOS8700_M_OUT_X_MSB 0x33 +#define McuFXOS8700_M_OUT_X_LSB 0x34 +#define McuFXOS8700_M_OUT_Y_MSB 0x35 +#define McuFXOS8700_M_OUT_Y_LSB 0x36 +#define McuFXOS8700_M_OUT_Z_MSB 0x37 +#define McuFXOS8700_M_OUT_Z_LSB 0x38 + +/* die temperature (needs to add an offset as not factory trimmed) */ +#define McuFXOS8700_DIE_TEMP 0x51 /* die temperature register, signed 8bit in C */ +#define McuFXOS8700_DIE_TEMP_OFFSET McuFXOS8700_CONFIG_TEMP_OFFSET /* offset to temperature reading as value on device is not calibrated */ + +#define McuFXOS8700_I2C_ADDR McuFXOS8700_CONFIG_I2C_DEVICE_ADDRESS /* I2C slave device address as set in the properties */ + + + +uint8_t McuFXOS8700_GetRaw8XYZ(uint8_t *xyz); +/* +** =================================================================== +** Method : GetRaw8XYZ (component FXOS8700CQ) +** +** Description : +** Returns in an array the x, y and z accelerometer as 8bit +** values. +** Parameters : +** NAME - DESCRIPTION +** * xyz - Pointer to an array of three unsigned 8bit +** values which are used to return the +** accelerometer values. +** Returns : +** --- - Error code, ERR_OK for no error. +** =================================================================== +*/ + +uint8_t McuFXOS8700_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component FXOS8700CQ) +** +** Description : +** Counterpart to Init() method. +** Parameters : None +** Returns : +** --- - Error code, ERR_OK if everything is ok. +** =================================================================== +*/ + +uint8_t McuFXOS8700_Init(void); +/* +** =================================================================== +** Method : Init (component FXOS8700CQ) +** +** Description : +** Initializes the device driver +** Parameters : None +** Returns : +** --- - Error code, ERR_OK if everything is ok. +** =================================================================== +*/ + +void McuFXOS8700_CalibrateX1g(void); +/* +** =================================================================== +** Method : CalibrateX1g (component FXOS8700CQ) +** +** Description : +** Performs a calibration of the sensor. It is assumed that the +** Y and Z sensors have 0 g, and the X sensor has 1 g. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFXOS8700_CalibrateY1g(void); +/* +** =================================================================== +** Method : CalibrateY1g (component FXOS8700CQ) +** +** Description : +** Performs a calibration of the sensor. It is assumed that the +** X and Z sensors have 0 g, and the Y sensor has 1 g. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFXOS8700_CalibrateZ1g(void); +/* +** =================================================================== +** Method : CalibrateZ1g (component FXOS8700CQ) +** +** Description : +** Performs a calibration of the sensor. It is assumed that the +** X and Y sensors have 0 g, and the Z sensor has 1 g. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +int16_t McuFXOS8700_GetXmg(void); +/* +** =================================================================== +** Method : GetXmg (component FXOS8700CQ) +** +** Description : +** Returns the X value in mg +** Parameters : None +** Returns : +** --- - The g value in 1/1000g units +** =================================================================== +*/ + +int16_t McuFXOS8700_GetYmg(void); +/* +** =================================================================== +** Method : GetYmg (component FXOS8700CQ) +** +** Description : +** Returns the Y value in mg +** Parameters : None +** Returns : +** --- - The g value in 1/1000g units +** =================================================================== +*/ + +int16_t McuFXOS8700_GetZmg(void); +/* +** =================================================================== +** Method : GetZmg (component FXOS8700CQ) +** +** Description : +** Returns the Z value in mg +** Parameters : None +** Returns : +** --- - The g value in 1/1000g units +** =================================================================== +*/ + +uint16_t McuFXOS8700_MeasureGetRawX(void); +/* +** =================================================================== +** Method : MeasureGetRawX (component FXOS8700CQ) +** +** Description : +** Performs a measurement on X channel and returns the raw +** value. +** Parameters : None +** Returns : +** --- - X sensor value +** =================================================================== +*/ + +uint16_t McuFXOS8700_MeasureGetRawY(void); +/* +** =================================================================== +** Method : MeasureGetRawY (component FXOS8700CQ) +** +** Description : +** Performs a measurement on Y channel and returns the raw +** value. +** Parameters : None +** Returns : +** --- - Y sensor value +** =================================================================== +*/ + +uint16_t McuFXOS8700_MeasureGetRawZ(void); +/* +** =================================================================== +** Method : MeasureGetRawZ (component FXOS8700CQ) +** +** Description : +** Performs a measurement on Z channel and returns the raw +** value. +** Parameters : None +** Returns : +** --- - Z sensor value +** =================================================================== +*/ + +int16_t McuFXOS8700_GetXOffset(void); +/* +** =================================================================== +** Method : GetXOffset (component FXOS8700CQ) +** +** Description : +** Returns the offset applied to the X value. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +int16_t McuFXOS8700_GetYOffset(void); +/* +** =================================================================== +** Method : GetYOffset (component FXOS8700CQ) +** +** Description : +** Returns the offset applied to the Y value. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +int16_t McuFXOS8700_GetZOffset(void); +/* +** =================================================================== +** Method : GetZOffset (component FXOS8700CQ) +** +** Description : +** Returns the offset applied to the Z value. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +int16_t McuFXOS8700_GetX1gValue(void); +/* +** =================================================================== +** Method : GetX1gValue (component FXOS8700CQ) +** +** Description : +** Returns the value for 1g for channel X. +** Parameters : None +** Returns : +** --- - 1g value for X +** =================================================================== +*/ + +int16_t McuFXOS8700_GetY1gValue(void); +/* +** =================================================================== +** Method : GetY1gValue (component FXOS8700CQ) +** +** Description : +** Returns the value for 1g for channel Y. +** Parameters : None +** Returns : +** --- - 1g value for Y +** =================================================================== +*/ + +int16_t McuFXOS8700_GetZ1gValue(void); +/* +** =================================================================== +** Method : GetZ1gValue (component FXOS8700CQ) +** +** Description : +** Returns the value for 1g for channel Z. +** Parameters : None +** Returns : +** --- - 1g value for Z +** =================================================================== +*/ + +int16_t McuFXOS8700_GetX(void); +/* +** =================================================================== +** Method : GetX (component FXOS8700CQ) +** +** Description : +** Retrieves the value for the X axis. The value is adjusted +** with the zero calibration value (0 for 0 g, negative for +** negative acceleration and positive for positive acceleration). +** Parameters : None +** Returns : +** --- - Measured X value +** =================================================================== +*/ + +int16_t McuFXOS8700_GetY(void); +/* +** =================================================================== +** Method : GetY (component FXOS8700CQ) +** +** Description : +** Retrieves the value for the Y axis. The value is adjusted +** with the zero calibration value (0 for 0 g, negative for +** negative acceleration and positive for positive acceleration). +** Parameters : None +** Returns : +** --- - Measured Y value +** =================================================================== +*/ + +int16_t McuFXOS8700_GetZ(void); +/* +** =================================================================== +** Method : GetZ (component FXOS8700CQ) +** +** Description : +** Retrieves the value for the Z axis. The value is adjusted +** with the zero calibration value (0 for 0 g, negative for +** negative acceleration and positive for positive acceleration). +** Parameters : None +** Returns : +** --- - Measured Z value +** =================================================================== +*/ + +uint8_t McuFXOS8700_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : ParseCommand (component FXOS8700CQ) +** +** Description : +** Shell Command Line parser. This method is enabled/disabled +** depending on if you have the Shell enabled/disabled in the +** properties. +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command string +** * handled - Pointer to variable which tells if +** the command has been handled or not +** * io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFXOS8700_SetFastMode(bool on); +/* +** =================================================================== +** Method : SetFastMode (component FXOS8700CQ) +** +** Description : +** Turns the F_READ (Fast Read Mode) on or off +** Parameters : +** NAME - DESCRIPTION +** on - if to turn the F_READ mode on or off +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFXOS8700_Enable(void); +/* +** =================================================================== +** Method : Enable (component FXOS8700CQ) +** +** Description : +** Enables the device with setting the ACTIVE bit in the CTRL +** register 1 +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFXOS8700_Disable(void); +/* +** =================================================================== +** Method : Disable (component FXOS8700CQ) +** +** Description : +** Disables the device with clearing the ACTIVE bit in the CTRL +** register 1 +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFXOS8700_isEnabled(bool *isEnabled); +/* +** =================================================================== +** Method : isEnabled (component FXOS8700CQ) +** +** Description : +** Returns the status of the the ACTIVE bit in the CTRL +** register 1 +** Parameters : +** NAME - DESCRIPTION +** * isEnabled - Pointer to where to store the +** result, TRUE if ACTIVE bit is set, FALSE +** otherwise +** Returns : +** --- - error code +** =================================================================== +*/ + +uint8_t McuFXOS8700_WhoAmI(uint8_t *value); +/* +** =================================================================== +** Method : WhoAmI (component FXOS8700CQ) +** +** Description : +** Returns the value of the WHO_AM_I (0x0D) register +** Parameters : +** NAME - DESCRIPTION +** * value - Pointer to value to store +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFXOS8700_GetTemperature(int8_t *temperature); +/* +** =================================================================== +** Method : GetTemperature (component FXOS8700CQ) +** +** Description : +** Returns the temperature of the die as signed 8bit values in +** degree Celsius +** Parameters : +** NAME - DESCRIPTION +** * temperature - Pointer to variable where +** to store the temperature +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFXOS8700_GetMagX(int16_t *value); +/* +** =================================================================== +** Method : GetMagX (component FXOS8700CQ) +** +** Description : +** Returns the X magnetometer value. +** Parameters : +** NAME - DESCRIPTION +** * value - Pointer to where to store the value. +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFXOS8700_GetMagY(int16_t *value); +/* +** =================================================================== +** Method : GetMagY (component FXOS8700CQ) +** +** Description : +** Returns the Y magnetometer value. +** Parameters : +** NAME - DESCRIPTION +** * value - Pointer to where to store the value. +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFXOS8700_GetMagZ(int16_t *value); +/* +** =================================================================== +** Method : GetMagZ (component FXOS8700CQ) +** +** Description : +** Returns the Z magnetometer value. +** Parameters : +** NAME - DESCRIPTION +** * value - Pointer to where to store the value. +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFXOS8700_MagneticSensorReset(void); +/* +** =================================================================== +** Method : MagneticSensorReset (component FXOS8700CQ) +** +** Description : +** Initiates a magnetic sensor reset cycle that will restore +** correct operation after exposure to an excessive magnetic +** field which exceeds the Full Scale Range but is less than +** the Maximum Applied Magnetic Field. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFXOS8700_ReadReg8(uint8_t addr, uint8_t *val); +/* +** =================================================================== +** Method : ReadReg8 (component FXOS8700CQ) +** +** Description : +** Reads an 8bit device register +** Parameters : +** NAME - DESCRIPTION +** addr - device memory map address +** * val - Pointer to value +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFXOS8700_WriteReg8(uint8_t addr, uint8_t val); +/* +** =================================================================== +** Method : WriteReg8 (component FXOS8700CQ) +** +** Description : +** Write an 8bit device register +** Parameters : +** NAME - DESCRIPTION +** addr - device memory map address +** val - value to write +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFXOS8700_SwReset(void); +/* +** =================================================================== +** Method : SwReset (component FXOS8700CQ) +** +** Description : +** Perform a software reset using the rst bit in the CTRL +** register 2 +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFXOS8700_MagEnable(void); +/* +** =================================================================== +** Method : MagEnable (component FXOS8700CQ) +** +** Description : +** Enables the magnetometer +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuFXOS8700_MagDisable(void); +/* +** =================================================================== +** Method : MagDisable (component FXOS8700CQ) +** +** Description : +** Disables the magnetometer +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +/* END McuFXOS8700. */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif +/* ifndef __McuFXOS8700_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuFlash.c b/TSM_PicoW_Sensor/McuLib/src/McuFlash.c new file mode 100644 index 0000000..2fcd9df --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuFlash.c @@ -0,0 +1,609 @@ +/* + * Copyright (c) 2021, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuFlash.h" +#if McuFlash_CONFIG_IS_ENABLED +#include "McuLib.h" +#if McuLib_CONFIG_CPU_IS_LPC || McuLib_CONFIG_CPU_IS_KINETIS || McuLib_CONFIG_CPU_IS_RPxxxx /* currently limited support, only for these CPUs */ + +#include "McuLog.h" +#include "McuUtility.h" +#include "McuCriticalSection.h" + +#if McuLib_CONFIG_CPU_IS_LPC + #include "fsl_iap.h" +#elif McuLib_CONFIG_CPU_IS_KINETIS + #include "fsl_flash.h" + #include "fsl_smc.h" + #include "McuWait.h" +#elif McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_RP2040 + #include "hardware/flash.h" + #include "hardware/sync.h" +#endif + +typedef struct { + uint32_t addr; + size_t size; +} McuFlash_Memory; + +static McuFlash_Memory McuFlash_RegisteredMemory; /* used in shell status, for information only */ + +#if McuLib_CONFIG_CPU_IS_LPC && (McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC845 || McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC804) + /* nothing needed */ +#elif McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_K22FN \ + || McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_K22FX \ + || McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_K02FN \ + || McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC55S16 + static flash_config_t s_flashDriver; +#elif McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_RP2040 + /* nothing needed */ +#else + #error "device not yet supported" +#endif + +void McuFlash_RegisterMemory(const void *addr, size_t nofBytes) { + McuFlash_RegisteredMemory.addr = (uint32_t)addr; + McuFlash_RegisteredMemory.size = nofBytes; +} + +bool McuFlash_IsAccessible(const void *addr, size_t nofBytes) { +#if McuLib_CONFIG_CPU_IS_LPC55xx + /* see https://community.nxp.com/t5/LPC-Microcontrollers-Knowledge/LPC55xx-Erased-Memory-State-0-or-1/ta-p/1135084 and + * https://www.nxp.com/docs/en/application-note/AN12949.pdf + * Accessing erased (and not written yet) memory causes a hard-fault. + */ + status_t status; + + status = FLASH_VerifyErase(&s_flashDriver, (uint32_t)addr, nofBytes); +#if McuFlash_CONFIG_LOGGING_TRACE + McuLog_trace("IsAccessible: 0x%x, size %u, %s", (uint32_t)addr, nofBytes, status==kStatus_Success?"no":"yes"); +#endif + if (status==kStatus_Success) { + return false; /* if it is an erased FLASH: accessing it will cause a hard fault! */ + } + return true; +#else + return true; +#endif +} + +bool McuFlash_IsErased(const void *addr, size_t nofBytes) { +#if McuLib_CONFIG_CPU_IS_LPC55xx + /* see https://community.nxp.com/t5/LPC-Microcontrollers-Knowledge/LPC55xx-Erased-Memory-State-0-or-1/ta-p/1135084 and + * https://www.nxp.com/docs/en/application-note/AN12949.pdf + * Accessing erased (and not written yet) memory causes a hard-fault. + */ + status_t status; + + status = FLASH_VerifyErase(&s_flashDriver, (uint32_t)addr, nofBytes); +#if McuFlash_CONFIG_LOGGING_TRACE + McuLog_trace("IsErased: 0x%x, size %u, %s", (uint32_t)addr, nofBytes, status==kStatus_Success?"yes":"no"); +#endif + return status==kStatus_Success; /* true if it is an erased FLASH: accessing it will cause a hard fault! */ +#else + uint8_t *ptr = (uint8_t*)addr; + while (nofBytes>0) { + if (*ptr!=0xFF) { + return false; /* byte not erased */ + } + ptr++; + nofBytes--; + } + return true; +#endif +} + +uint8_t McuFlash_Read(const void *addr, void *data, size_t dataSize) { +#if McuFlash_CONFIG_LOGGING_TRACE + McuLog_trace("Read: 0x%x, size %u", (uint32_t)addr, dataSize); +#endif + if (!McuFlash_IsAccessible(addr, dataSize)) { + memset(data, 0xff, dataSize); + return ERR_FAULT; + } +#if McuLib_CONFIG_CPU_IS_LPC55xx + status_t status; + + status = FLASH_Read(&s_flashDriver, (uint32_t)addr, data, (uint32_t)dataSize); + if(status != kStatus_Success){ + return ERR_FAULT; + } + return ERR_OK; +#else + memcpy(data, addr, dataSize); + return ERR_OK; +#endif +} + +static uint8_t McuFlash_ProgramPage(void *addr, const void *data, size_t dataSize) { +#if McuFlash_CONFIG_LOGGING_TRACE + McuLog_trace("ProgramPage: 0x%x, size %u", (uint32_t)addr, dataSize); +#endif +#if McuLib_CONFIG_CPU_IS_KINETIS + status_t status; + uint8_t res = ERR_OK; + + if (McuFlash_Erase(addr, dataSize)!=ERR_OK) { + return ERR_FAILED; + } +#if McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_K02FN || McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_K22FN + /* need to switch to normal RUN mode for flash programming, + * with Fcore=60MHz Fbus=Fflash=20MHz + * see https://community.nxp.com/thread/377633 + */ + status = SMC_SetPowerModeRun(SMC); + if (status!=kStatus_Success) { + return ERR_FAILED; + } + McuWait_Waitms(1); /* give time to switch clock, otherwise flash programming might fail below */ +#endif + /* program */ +#if McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_K02FN + uint32_t primask = DisableGlobalIRQ(); /* workaround: need to disable interrupts? */ +#endif + for(;;) { /* breaks, switch back to HSRUN if things fail */ + status = FLASH_Program(&s_flashDriver, (uint32_t)addr, (uint8_t*)data, dataSize); + if (status!=kStatus_FTFx_Success) { + res = ERR_FAILED; + break; + } + break; + } /* for */ +#if McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_K02FN + EnableGlobalIRQ(primask); /* workaround: need to disable interrupts? */ +#endif +#if McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_K02FN || McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_K22FN + status = SMC_SetPowerModeHsrun(SMC); + if (status!=kStatus_Success) { + res = ERR_FAILED; + } +#endif + return res; +#elif McuLib_CONFIG_CPU_IS_LPC55xx + status_t status; + uint32_t failedAddress, failedData; + + if (((uint32_t)addr%s_flashDriver.PFlashPageSize) != 0) { + McuLog_fatal("addr %08x must be aligned to flash page size %08x", (uint32_t)addr, s_flashDriver.PFlashPageSize); + return ERR_FAILED; + } + if (dataSize!=s_flashDriver.PFlashPageSize) { /* must match flash page size! */ + McuLog_fatal("data size %08x must match flash page size %08x", dataSize, s_flashDriver.PFlashPageSize); + return ERR_FAILED; + } + /* erase first */ + status = FLASH_Erase(&s_flashDriver, (uint32_t)addr, dataSize, kFLASH_ApiEraseKey); + if (status!=kStatus_Success ) { + McuLog_fatal("erasing failed with error code %d", status); + return ERR_FAILED; + } + /* check if it is erased */ + status = FLASH_VerifyErase(&s_flashDriver, (uint32_t)addr, dataSize); + if (status!=kStatus_Success) { + McuLog_fatal("erase check failed"); + return ERR_FAILED; + } + /* here the flash is erased, ready for getting programmed */ + status = FLASH_Program(&s_flashDriver, (uint32_t)addr, (uint8_t*)data, dataSize); + if (status!=kStatus_Success) { + McuLog_fatal("failed programming flash, error %d", status); + return ERR_FAILED; + } + status = FLASH_VerifyProgram(&s_flashDriver, (uint32_t)addr, dataSize, (const uint8_t *)data, &failedAddress, &failedData); + if (status!=kStatus_Success) { + McuLog_fatal("failed verify at address %08x, data %08x", failedAddress, failedData); + return ERR_FAILED; + } + return ERR_OK; +#elif McuLib_CONFIG_CPU_IS_LPC && (McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC845 || McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC804) + uint32_t startSector = (uint32_t)addr/McuFlash_CONFIG_FLASH_BLOCK_SIZE; /* sector is 1k in size */ + uint32_t endSector = ((uint32_t)addr+(McuFlash_CONFIG_FLASH_BLOCK_SIZE-1))/McuFlash_CONFIG_FLASH_BLOCK_SIZE; + uint8_t result = ERR_FAILED; /* default */ + status_t res; + + if (McuFlash_Erase(addr, dataSize)!=ERR_OK) { + return ERR_FAILED; + } + res = IAP_PrepareSectorForWrite(startSector, endSector); /* sector size is 1k */ + if (res!=kStatus_IAP_Success) { + result = ERR_FAILED; + } else { + /* destination address should be on a 64byte boundary. + * Source address should be word (4byte) boundary + * data size (number of bytes) shall be 64, 128, 256, 512, 1024 bytes */ + res = IAP_CopyRamToFlash((uint32_t)addr, (uint32_t*)data, dataSize, SystemCoreClock); + if (res!=kStatus_IAP_Success) { + result = ERR_FAILED; + } else { + res = IAP_Compare((uint32_t)addr, (uint32_t*)data, dataSize); + if (res!=kStatus_IAP_Success) { + result = ERR_FAILED; + } else { + result = ERR_OK; + } + } + } + return result; +#elif McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_RP2040 + uint32_t base, size; + + base = (uint32_t)addr-XIP_BASE; + if ((base%FLASH_PAGE_SIZE)!=0) { + return ERR_FAILED; /* address must be page size aligned! */ + } + size = dataSize; + if ((size%FLASH_PAGE_SIZE)!=0) { + return ERR_FAILED; /* size must multiple of a page! */ + } + + /* first, erase the flash */ + if (McuFlash_Erase(addr, dataSize)!=ERR_OK) { + return ERR_FAILED; + } + /* need to turn off interrupts. But: only for this core. If other core is running, problems might occur! */ + McuCriticalSection_CriticalVariable(); + + McuCriticalSection_EnterCritical(); + flash_range_program(base, (const uint8_t *)data, size); + McuCriticalSection_ExitCritical(); + return ERR_OK; +#else + #error "target not supported yet!" + return ERR_FAILED; +#endif /* McuLib_CONFIG_CPU_IS_KINETIS or McuLib_CONFIG_CPU_IS_LPC */ +} + +uint8_t McuFlash_Program(void *addr, const void *data, size_t dataSize) { +#if McuFlash_CONFIG_LOGGING_TRACE + McuLog_trace("Program: 0x%x, size %u", (uint32_t)addr, dataSize); +#endif +#if McuLib_CONFIG_CPU_IS_LPC55xx + if (((uint32_t)addr%McuFlash_CONFIG_FLASH_BLOCK_SIZE) != 0 || (dataSize!=McuFlash_CONFIG_FLASH_BLOCK_SIZE)) { + /* address and size not aligned to page boundaries: make backup into buffer */ + uint8_t buffer[McuFlash_CONFIG_FLASH_BLOCK_SIZE]; + uint8_t res; + size_t offset, remaining, size; + uint32_t pageAddr; /* address of page */ + + pageAddr = ((uint32_t)addr/McuFlash_CONFIG_FLASH_BLOCK_SIZE)*McuFlash_CONFIG_FLASH_BLOCK_SIZE; + offset = (uint32_t)addr%McuFlash_CONFIG_FLASH_BLOCK_SIZE; /* offset inside page */ + remaining = dataSize; + while (remaining>0) { + res = McuFlash_Read((void*)pageAddr, buffer, sizeof(buffer)); /* read current flash content */ + if (res!=ERR_OK) { + McuLog_fatal("failed reading from Flash at 0x%x", pageAddr); + return ERR_FAILED; + } + if (offset+remaining>McuFlash_CONFIG_FLASH_BLOCK_SIZE) { + size = McuFlash_CONFIG_FLASH_BLOCK_SIZE-offset; /* how much we can copy in this step */ + } else { + size = remaining; + } + memcpy(buffer+offset, data, size); /* merge original page with new data */ + /* program new data/page */ + res = McuFlash_ProgramPage((void*)pageAddr, buffer, sizeof(buffer)); + if (res!=ERR_OK) { + McuLog_fatal("failed making backup from Flash at 0x%x", pageAddr); + return ERR_FAILED; + } + pageAddr += McuFlash_CONFIG_FLASH_BLOCK_SIZE; + offset = 0; + data += size; + remaining -= size; + } /* while */ + return res; + } else { /* a full page to program */ + return McuFlash_ProgramPage(addr, data, dataSize); + } +#else + return McuFlash_ProgramPage(addr, data, dataSize); +#endif +} + +#if McuLib_CONFIG_CPU_IS_LPC55xx +uint8_t McuFlash_InitErase(void *addr, size_t nofBytes) { + /* LPC55Sxx specific: erases the memory, makes it inaccessible */ + status_t status; + +#if McuFlash_CONFIG_LOGGING_TRACE + McuLog_trace("InitErase: 0x%x, size %u", (uint32_t)addr, nofBytes); +#endif + if ((nofBytes%McuFlash_CONFIG_FLASH_BLOCK_SIZE)!=0) { /* check if size is multiple of page size */ + McuLog_fatal("wrong erase data size %d, expected multiple %d", nofBytes, McuFlash_CONFIG_FLASH_BLOCK_SIZE); + return ERR_FAILED; + } + for(int i=0; istdOut); + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"size 0x"); + McuUtility_strcatNum16Hex(buf, sizeof(buf), McuFlash_CONFIG_FLASH_BLOCK_SIZE); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" block", buf, io->stdOut); + +#if McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_RP2040 + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"page 0x"); + McuUtility_strcatNum16Hex(buf, sizeof(buf), FLASH_PAGE_SIZE); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)", sector 0x"); + McuUtility_strcatNum16Hex(buf, sizeof(buf), FLASH_SECTOR_SIZE); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)", block 0x"); + McuUtility_strcatNum32Hex(buf, sizeof(buf), FLASH_BLOCK_SIZE); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" Flash", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum32Hex(buf, sizeof(buf), PICO_FLASH_SIZE_BYTES); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)", "); + McuUtility_strcatNum32u(buf, sizeof(buf), PICO_FLASH_SIZE_BYTES/(1024*1024)); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" MBytes\r\n"); + McuShell_SendStatusStr((unsigned char*)" Size", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"base 0x"); + McuUtility_strcatNum32Hex(buf, sizeof(buf), XIP_BASE); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" XIP", buf, io->stdOut); +#endif + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"addr 0x"); + McuUtility_strcatNum32Hex(buf, sizeof(buf), McuFlash_RegisteredMemory.addr); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)", size 0x"); + McuUtility_strcatNum32Hex(buf, sizeof(buf), McuFlash_RegisteredMemory.size); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" registered", buf, io->stdOut); + return ERR_OK; +} + +static uint8_t ReadData(void *hndl, uint32_t addr, uint8_t *buf, size_t bufSize) { + (void)hndl; /* not used */ + if (!McuFlash_IsAccessible((void*)addr, bufSize)) { + memset(buf, 0xff, bufSize); + return ERR_FAILED; + } + memcpy(buf, (void*)addr, bufSize); + return ERR_OK; +} + +uint8_t McuFlash_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) { + const unsigned char *p; + uint32_t addr32; + int32_t size; + + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, "McuFlash help")==0) { + McuShell_SendHelpStr((unsigned char*)"McuFlash", (const unsigned char*)"Group of flash ini commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" dump ", (unsigned char*)"Dump memory data\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" erase ", (unsigned char*)"Erase memory at address\r\n", io->stdOut); +#if McuLib_CONFIG_CPU_IS_LPC55xx + McuShell_SendHelpStr((unsigned char*)" init ", (unsigned char*)"Initialize memory (erase only, no programming!)\r\n", io->stdOut); +#endif + *handled = TRUE; + return ERR_OK; + } else if ((McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) || (McuUtility_strcmp((char*)cmd, "McuFlash status")==0)) { + *handled = TRUE; + return PrintStatus(io); + } else if (McuUtility_strncmp((char*)cmd, "McuFlash dump ", sizeof("McuFlash dump ")-1)==0) { + *handled = TRUE; + p = cmd+sizeof("McuFlash dump ")-1; + if (McuUtility_xatoi(&p, (int32_t*)&addr32)==ERR_OK) { + if (McuUtility_xatoi(&p, &size)==ERR_OK && size>0) { + if (McuFlash_IsAccessible((void*)addr32, size)) { + (void)McuShell_PrintMemory(NULL, addr32, addr32+size-1, 4, 16, ReadData, io); + } else { + McuShell_SendStr((unsigned char*)"*** memory not accessible\r\n", io->stdErr); + return ERR_FAILED; + } + } else { + McuShell_SendStr((unsigned char*)"*** wrong end address\r\n", io->stdErr); + return ERR_FAILED; + } + } else { + McuShell_SendStr((unsigned char*)"*** wrong start address\r\n", io->stdErr); + return ERR_FAILED; + } + } else if (McuUtility_strncmp((char*)cmd, "McuFlash erase ", sizeof("McuFlash erase ")-1)==0) { + *handled = TRUE; + p = cmd+sizeof("McuFlash erase ")-1; + if (McuUtility_xatoi(&p, (int32_t*)&addr32)==ERR_OK) { + if ((addr32%McuFlash_CONFIG_FLASH_BLOCK_SIZE)!=0) { + McuShell_SendStr((unsigned char*)"*** address is not flash block aligned\r\n", io->stdErr); + return ERR_FAILED; + } + if (McuUtility_xatoi(&p, &size)==ERR_OK) { + return McuFlash_Erase((void*)addr32, size); + } else { + McuShell_SendStr((unsigned char*)"*** failed scanning size\r\n", io->stdErr); + return ERR_FAILED; + } + } +#if McuLib_CONFIG_CPU_IS_LPC55xx + } else if (McuUtility_strncmp((char*)cmd, "McuFlash init ", sizeof("McuFlash init ")-1)==0) { + *handled = TRUE; + p = cmd+sizeof("McuFlash init ")-1; + if (McuUtility_xatoi(&p, (int32_t*)&addr32)==ERR_OK) { + if ((addr32%McuFlash_CONFIG_FLASH_BLOCK_SIZE)!=0) { + McuShell_SendStr((unsigned char*)"*** address is not flash block aligned\r\n", io->stdErr); + return ERR_FAILED; + } + if (McuUtility_xatoi(&p, &size)==ERR_OK) { + return McuFlash_InitErase((void*)addr32, size); + } else { + McuShell_SendStr((unsigned char*)"*** failed scanning size\r\n", io->stdErr); + return ERR_FAILED; + } + } +#endif + } + return ERR_OK; +} + +void McuFlash_Deinit(void) { +} + +void McuFlash_Init(void) { +#if McuLib_CONFIG_CPU_IS_KINETIS || McuLib_CONFIG_CPU_IS_LPC55xx + status_t result; /* Return code from each flash driver function */ + + memset(&s_flashDriver, 0, sizeof(flash_config_t)); + /* Setup flash driver structure for device and initialize variables. */ + result = FLASH_Init(&s_flashDriver); +#if McuLib_CONFIG_CPU_IS_KINETIS + if (result!=kStatus_FTFx_Success) { + McuLog_fatal("McuFlash_Init() failed!"); + for(;;) { /* error */ } + } +#elif McuLib_CONFIG_CPU_IS_LPC55xx + if (result!=kStatus_Success) { + McuLog_fatal("McuFlash_Init() failed!"); + for(;;) { /* error */ } + } +#endif +#endif +} + +#endif + +#endif /* McuFlash_CONFIG_IS_ENABLED */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuFlash.h b/TSM_PicoW_Sensor/McuLib/src/McuFlash.h new file mode 100644 index 0000000..cc2cc00 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuFlash.h @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2021, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MININI_MCUFLASH_H_ +#define MININI_MCUFLASH_H_ + + +#include "McuFlashconfig.h" +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*! + * \brief Decides if memory is accessible. On some architectures it needs to be prepared first. + * \param addr Memory area to check + * \param nofBytes Number of bytes to check + * \return true if memory can be accessed, false otherwise + */ +bool McuFlash_IsAccessible(const void *addr, size_t nofBytes); + +/*! + * \brief Decides if memory is erased or not. + * \param addr Memory area to check + * \param nofBytes Number of bytes to check + * \return true if memory is erased, false otherwise + */ +bool McuFlash_IsErased(const void *addr, size_t nofBytes); + +/*! + * \brief Erases a memory area + * \param addr Memory area to erase + * \param nofBytes Number of bytes to erase + * \return Error code, ERR_OK if everything is fine + */ +uint8_t McuFlash_Erase(void *addr, size_t nofBytes); + +/*! + * \brief For LPC55Sxx only: initializes memory with an erase, making it inaccessible + * \param addr Start address of memory, must be 0x200 aligned + * \param nofBytes Number of bytes, must be multiple if 0x200 + * \return Error code, ERR_OK if everything is fine + */ +uint8_t McuFlash_InitErase(void *addr, size_t nofBytes); + +/*! + * \brief Program the flash memory with data + * \param addr Address where to store the data + * \param data Pointer to the data + * \param dataSize Number of data bytes + * \return Error code, ERR_OK if everything is fine + */ +uint8_t McuFlash_Program(void *addr, const void *data, size_t dataSize); + +/*! + * \brief Read the flash memory + * \param addr Address where to store the data + * \param data Pointer where to store the data + * \param dataSize Number of data bytes + * \return Error code, ERR_OK if everything is fine + */ +uint8_t McuFlash_Read(const void *addr, void *data, size_t dataSize); + +/*! + * \brief Register a memory area. This is for information only, to print the information with the Shell status command. + * \param addr Start address of memory area + * \param nofBytes Number of bytes + */ +void McuFlash_RegisterMemory(const void *addr, size_t nofBytes); + +#include "McuShell.h" +/*! + * \brief Shell command line parser + * \param cmd Pointer to the command string + * \param handled If command has been recognized and handled + * \param io I/O hander used for output + * \return Error code, ERR_OK if everything is fine + */ +uint8_t McuFlash_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); + +/*! + * \brief Module de-initialization + */ +void McuFlash_Deinit(void); + +/*! + * \brief Module initialization + */ +void McuFlash_Init(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MININI_MCUFLASH_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuFontDisplay.c b/TSM_PicoW_Sensor/McuLib/src/McuFontDisplay.c new file mode 100644 index 0000000..103d311 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuFontDisplay.c @@ -0,0 +1,434 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontDisplay.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : FontDisplay +** Version : Component 01.201, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2023-12-20, 18:09, # CodeGen: 825 +** Abstract : +** Driver to write fonts using GFont component +** Settings : +** Bean name : McuFontDisplay +** System : +** InhGDisplay : McuGDisplaySSD1306 +** Contents : +** GetFontHeight - void McuFontDisplay_GetFontHeight(McuFontDisplay_Font *font,... +** GetStringHeight - McuFontDisplay_PixelDim McuFontDisplay_GetStringHeight(uint8_t *str,... +** GetCharWidth - void McuFontDisplay_GetCharWidth(uint8_t ch, McuFontDisplay_PixelDim... +** GetStringWidth - McuFontDisplay_PixelDim McuFontDisplay_GetStringWidth(uint8_t *str,... +** WriteString - void McuFontDisplay_WriteString(uint8_t *str, McuFontDisplay_PixelColor... +** WriteStringWidth - void McuFontDisplay_WriteStringWidth(uint8_t *str, McuFontDisplay_PixelColor... +** WriteChar - void McuFontDisplay_WriteChar(uint8_t ch, McuFontDisplay_PixelColor color,... +** Deinit - void McuFontDisplay_Deinit(void); +** Init - void McuFontDisplay_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontDisplay.h +** @version 01.00 +** @brief +** Driver to write fonts using GFont component +*/ +/*! +** @addtogroup McuFontDisplay_module McuFontDisplay module documentation +** @{ +*/ + +/* MODULE McuFontDisplay. */ + +#include "McuFontDisplay.h" +#include /* for NULL */ + +/* +** =================================================================== +** Method : WriteChar (component FontDisplay) +** +** Description : +** Function to write a character at the start point. Set the +** start point with the function setCursor. +** Parameters : +** NAME - DESCRIPTION +** ch - the character to print +** color - Foreground color to be used (for the +** character pixels) +** * xCursor - Pointer to x position of character +** (upper left corner). On return this will +** contain the next x position. +** * yCursor - Pointer to y position of character +** (upper left corner). On return this will +** contain the next y position. +** * font - Pointer to font information +** Returns : Nothing +** =================================================================== +*/ +void McuFontDisplay_WriteChar(uint8_t ch, McuFontDisplay_PixelColor color, McuFontDisplay_PixelDim *xCursor, McuFontDisplay_PixelDim *yCursor, McuFontDisplay_Font *font) +{ + PGFONT_CharInfo charStruct; /* font information */ + uint8_t *data; /* actual character of string text[] */ + uint8_t w; /* counter variable row bits of character */ + uint8_t h; /* counter variable column bits of character */ + McuFontDisplay_PixelDim currY; + McuFontDisplay_PixelDim currX; + signed char b; /* bit position in byte stream */ + + if (ch=='\t') { /* tabulator */ + ch = ' '; /* use a space instead */ + } + charStruct = font->GetFontChar((uint8_t)ch); + if (ch=='\n') { /* move to a new line */ + *yCursor += font->boundingBoxHeight; /* set next cursor position */ + return; + } + if (ch=='\r') { /* move to beginning of line */ + return; /* do nothing. Only the caller may know what the beginning of line is */ + } + data = (uint8_t*)charStruct->CharBMP; /* get the pointer */ + if (data != NULL) { /* printable character. Only if we have a character info. This is not the case e.g. for \n */ + currY = (McuFontDisplay_PixelDim)(*yCursor + + font->boundingBoxHeight /* height of box. This includes the space between lines plus the space under the base line */ + - font->lineSpaceBoxHeight /* space between two lines */ + - font->underlineBoxHeight /* space below the base line */ + - charStruct->offsetY + - charStruct->height); + currX = (McuFontDisplay_PixelDim)(*xCursor + charStruct->offsetX); + h = 0; + for(;;) { /* breaks, process line by line */ + w = 0; /* width position */ + b = 7; /* bit position, MSB first */ + for(;;) { /* breaks, prints one pixel line */ + if ((((*data)&(1<>b)==1) { /* note that we do not change the background pixels */ + McuGDisplaySSD1306_PutPixel((McuFontDisplay_PixelDim)(currX+w), currY, color); + } + w++; /* width counter */ + b--; /* next pixel */ + if((b==-1)||(w==charStruct->width)) { /* last bit of byte reached or last bit of the width reached */ + if(w==charStruct->width) { /* last bit of the row from the current character */ + break; /* out of while loop */ + } else { + b = 7; + data++; /* next byte */ + } + } + } /* for */ + data++; /* next byte */ + h++; /* height counter increment */ + currY++; /* one row up */ + if(h==(charStruct->height)){ /* finished character */ + break; + } /* next row of character */ + } /* for */ + *xCursor += charStruct->dwidth; /* set next cursor position */ + } /* if printable character */ +} + +/* +** =================================================================== +** Method : WriteString (component FontDisplay) +** +** Description : +** Function to write a string or character at the startpoint. +** Set the startpoint with the function setCursor. +** Parameters : +** NAME - DESCRIPTION +** * str - Pointer to the character string +** color - Foreground color to be used (for the +** character pixels) +** * xCursor - Pointer to x position of first +** character (upper left corner). On return +** this will contain the next y position. +** * yCursor - Pointer to y position of character +** (upper left corner). On return this will +** contain the next y position. +** * font - Pointer to font information +** Returns : Nothing +** =================================================================== +*/ +void McuFontDisplay_WriteString(uint8_t *str, McuFontDisplay_PixelColor color, McuFontDisplay_PixelDim *xCursor, McuFontDisplay_PixelDim *yCursor, McuFontDisplay_Font *font) +{ + McuFontDisplay_PixelDim x = *xCursor; + + while(*str!='\0') { + if (*str=='\r') { + *xCursor = x; + } else if (*str=='\n') { + *xCursor = x; + *yCursor += font->boundingBoxHeight; + } else { + McuFontDisplay_WriteChar(*str, color, xCursor, yCursor, font); + } + str++; + } +} + +/* +** =================================================================== +** Method : WriteStringWidth (component FontDisplay) +** +** Description : +** Function to write a string or character at the startpoint. +** Set the startpoint with the function setCursor. If the +** string reaches the given width, the text gets wrapped to a +** new line. +** Parameters : +** NAME - DESCRIPTION +** * str - Pointer to the character string +** color - Foreground color to be used (for the +** character pixels) +** * xCursor - Pointer to x position of first +** character (upper left corner). On return +** this will contain the next y position. +** * yCursor - Pointer to y position of character +** (upper left corner). On return this will +** contain the next y position. +** * font - Pointer to font information +** width - Maximum of width of the text box. If +** text reaches the end of the box, the text +** gets wrapped to a new line. +** Returns : Nothing +** =================================================================== +*/ +void McuFontDisplay_WriteStringWidth(uint8_t *str, McuFontDisplay_PixelColor color, McuFontDisplay_PixelDim *xCursor, McuFontDisplay_PixelDim *yCursor, McuFontDisplay_Font *font, McuFontDisplay_PixelDim width) +{ + McuFontDisplay_PixelDim x = *xCursor; + + while(*str!='\0') { + if (*str=='\r') { + *xCursor = x; + } else if (*str=='\n') { + *xCursor = x; + *yCursor += font->boundingBoxHeight; + } else { + if ((McuFontDisplay_PixelDim)((*xCursor - x) + ((PGFONT_CharInfo)(font->GetFontChar((uint8_t)*str)))->dwidth) >= width) + { /* check if we would reach the end of the box: wrap to a new line */ + *xCursor = x; + *yCursor += font->boundingBoxHeight; + } + McuFontDisplay_WriteChar(*str, color, xCursor, yCursor, font); + } + str++; + } +} + +/* +** =================================================================== +** Method : GetCharWidth (component FontDisplay) +** +** Description : +** returns the width (in pixels) of a font character. +** Parameters : +** NAME - DESCRIPTION +** ch - character for which to calculate the width +** * charWidth - Pointer to width of the +** character in pixels (this is only for the +** character, without the space after the +** character) +** * totalWidth - Pointer to the total width +** of the character, including to the space +** after the character. +** * font - Pointer to font information +** Returns : Nothing +** =================================================================== +*/ +void McuFontDisplay_GetCharWidth(uint8_t ch, McuFontDisplay_PixelDim *charWidth, McuFontDisplay_PixelDim *totalWidth, McuFontDisplay_Font *font) +{ + PGFONT_CharInfo charStruct; + + charStruct = font->GetFontChar((uint8_t)ch); + if (charStruct != NULL) { + *charWidth = (McuFontDisplay_PixelDim)(charStruct->width+charStruct->offsetX); + *totalWidth = (McuFontDisplay_PixelDim)charStruct->dwidth; + } else { + *charWidth = 0; + *totalWidth = 0; + } +} + +/* +** =================================================================== +** Method : GetStringWidth (component FontDisplay) +** +** Description : +** returns the width (in pixels) of a font string. For multiple +** line strings (separated by \ +** ) or for strings with \r it returns the longest string +** length. +** Parameters : +** NAME - DESCRIPTION +** * str - Pointer to the string. +** * font - Pointer to font information +** * lastCharSpace - Pointer to the width +** of the last character space, useful if you +** combine multiple strings. The pointer may +** be NULL. +** Returns : +** --- - Error code +** =================================================================== +*/ +McuFontDisplay_PixelDim McuFontDisplay_GetStringWidth(uint8_t *str, McuFontDisplay_Font *font, McuFontDisplay_PixelDim *lastCharSpace) +{ + unsigned char *p; /* pointer to the actual character */ + McuFontDisplay_PixelDim currWidth; /* current width of string */ + McuFontDisplay_PixelDim maxWidth; /* maximum width of string */ + McuFontDisplay_PixelDim maxWidthSpace; /* last space of maximum string */ + McuFontDisplay_PixelDim charSpace; /* last character space */ + McuFontDisplay_PixelDim charWidth, totalWidth; /* character and total width of character */ + + currWidth = maxWidth = 0; + charWidth = totalWidth = 0; + charSpace = maxWidthSpace = 0; + p = str; + for (;;) { /* breaks */ + if (*p=='\n' || *p=='\r' || *p=='\0') { /* multi-line string */ + currWidth -= charSpace; /* subtract last space */ + if (currWidth > maxWidth) { /* remember maximum line */ + maxWidth = currWidth; + maxWidthSpace = charSpace; + } + currWidth = charSpace = 0; + if (*p == '\0') { + break; + } + } else { + McuFontDisplay_GetCharWidth(*p, &charWidth, &totalWidth, font); + currWidth += totalWidth; + charSpace = (McuFontDisplay_PixelDim)(totalWidth-charWidth); /* calculate space of last/current character */ + } + p++; /* next character */ + } /* for */ + if (lastCharSpace != NULL) { + *lastCharSpace = maxWidthSpace; + } + return maxWidth; /* return width */ +} + +/* +** =================================================================== +** Method : GetFontHeight (component FontDisplay) +** +** Description : +** returns the height (in pixels) of a font. +** Parameters : +** NAME - DESCRIPTION +** * font - Pointer to font information +** * charHeight - Pointer to height of the +** character in pixels. +** * totalHeight - Pointer to the total +** height of the character, including to the +** space below the character. +** Returns : Nothing +** =================================================================== +*/ +void McuFontDisplay_GetFontHeight(McuFontDisplay_Font *font, McuFontDisplay_PixelDim *charHeight, McuFontDisplay_PixelDim *totalHeight) +{ + *charHeight = (McuFontDisplay_PixelDim)(font->boundingBoxHeight-font->lineSpaceBoxHeight); + *totalHeight = font->boundingBoxHeight; +} + +/* +** =================================================================== +** Method : GetStringHeight (component FontDisplay) +** +** Description : +** returns the height (in pixels) of a font string. For +** multiple line strings (separated by newline) or for strings +** with \r it returns the longest list. +** Parameters : +** NAME - DESCRIPTION +** * str - Pointer to the string. +** * font - Pointer to font information +** * lastLineSpace - Pointer to the height +** of the last line space, useful if you +** combine multiple strings. The pointer may +** be NULL. +** Returns : +** --- - Error code +** =================================================================== +*/ +McuFontDisplay_PixelDim McuFontDisplay_GetStringHeight(uint8_t *str, McuFontDisplay_Font *font, McuFontDisplay_PixelDim *lastLineSpace) +{ + uint16_t nofLines; + McuFontDisplay_PixelDim charHeight, totalHeight; + + if (*str == '\0') { + if (lastLineSpace != NULL) { + *lastLineSpace = 0; + } + return 0; + } + nofLines = 1; + while (*str != '\0') { /* breaks */ + if (*str=='\n') { /* multi-line string */ + nofLines++; + } + str++; /* next character */ + } + McuFontDisplay_GetFontHeight(font, &charHeight, &totalHeight); + if (lastLineSpace != NULL) { + *lastLineSpace = (McuFontDisplay_PixelDim)(totalHeight-charHeight); + } + return (McuFontDisplay_PixelDim)((nofLines-1)*totalHeight + charHeight); /* return height */ +} + +/* +** =================================================================== +** Method : Deinit (component FontDisplay) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontDisplay_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component FontDisplay) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuFontDisplay_Init(void) +{ + /* nothing needed */ +} + +/* END McuFontDisplay. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuFontDisplay.h b/TSM_PicoW_Sensor/McuLib/src/McuFontDisplay.h new file mode 100644 index 0000000..5a140b8 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuFontDisplay.h @@ -0,0 +1,281 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuFontDisplay.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : FontDisplay +** Version : Component 01.201, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2023-12-20, 18:09, # CodeGen: 825 +** Abstract : +** Driver to write fonts using GFont component +** Settings : +** Bean name : McuFontDisplay +** System : +** InhGDisplay : McuGDisplaySSD1306 +** Contents : +** GetFontHeight - void McuFontDisplay_GetFontHeight(McuFontDisplay_Font *font,... +** GetStringHeight - McuFontDisplay_PixelDim McuFontDisplay_GetStringHeight(uint8_t *str,... +** GetCharWidth - void McuFontDisplay_GetCharWidth(uint8_t ch, McuFontDisplay_PixelDim... +** GetStringWidth - McuFontDisplay_PixelDim McuFontDisplay_GetStringWidth(uint8_t *str,... +** WriteString - void McuFontDisplay_WriteString(uint8_t *str, McuFontDisplay_PixelColor... +** WriteStringWidth - void McuFontDisplay_WriteStringWidth(uint8_t *str, McuFontDisplay_PixelColor... +** WriteChar - void McuFontDisplay_WriteChar(uint8_t ch, McuFontDisplay_PixelColor color,... +** Deinit - void McuFontDisplay_Deinit(void); +** Init - void McuFontDisplay_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuFontDisplay.h +** @version 01.00 +** @brief +** Driver to write fonts using GFont component +*/ +/*! +** @addtogroup McuFontDisplay_module McuFontDisplay module documentation +** @{ +*/ + +#ifndef __McuFontDisplay_H +#define __McuFontDisplay_H + +/* MODULE McuFontDisplay. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuFontDisplayconfig.h" /* configuration */ +#include "McuGDisplaySSD1306.h" /* Graphic display interface */ +#include "McuGFont.h" /* Font interface */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef McuGDisplaySSD1306_PixelDim McuFontDisplay_PixelDim; /* Type which can hold a integral type for the x/y pixel dimension. This is depending on the display used. */ +typedef McuGDisplaySSD1306_PixelColor McuFontDisplay_PixelColor; /* Type defining the color type (depends on display used). */ +typedef GFONT_Callbacks McuFontDisplay_Font; /* Pointer to GFONT_Callbacks */ + + + +void McuFontDisplay_WriteString(uint8_t *str, McuFontDisplay_PixelColor color, McuFontDisplay_PixelDim *xCursor, McuFontDisplay_PixelDim *yCursor, McuFontDisplay_Font *font); +/* +** =================================================================== +** Method : WriteString (component FontDisplay) +** +** Description : +** Function to write a string or character at the startpoint. +** Set the startpoint with the function setCursor. +** Parameters : +** NAME - DESCRIPTION +** * str - Pointer to the character string +** color - Foreground color to be used (for the +** character pixels) +** * xCursor - Pointer to x position of first +** character (upper left corner). On return +** this will contain the next y position. +** * yCursor - Pointer to y position of character +** (upper left corner). On return this will +** contain the next y position. +** * font - Pointer to font information +** Returns : Nothing +** =================================================================== +*/ + +void McuFontDisplay_WriteChar(uint8_t ch, McuFontDisplay_PixelColor color, McuFontDisplay_PixelDim *xCursor, McuFontDisplay_PixelDim *yCursor, McuFontDisplay_Font *font); +/* +** =================================================================== +** Method : WriteChar (component FontDisplay) +** +** Description : +** Function to write a character at the start point. Set the +** start point with the function setCursor. +** Parameters : +** NAME - DESCRIPTION +** ch - the character to print +** color - Foreground color to be used (for the +** character pixels) +** * xCursor - Pointer to x position of character +** (upper left corner). On return this will +** contain the next x position. +** * yCursor - Pointer to y position of character +** (upper left corner). On return this will +** contain the next y position. +** * font - Pointer to font information +** Returns : Nothing +** =================================================================== +*/ + +void McuFontDisplay_GetCharWidth(uint8_t ch, McuFontDisplay_PixelDim *charWidth, McuFontDisplay_PixelDim *totalWidth, McuFontDisplay_Font *font); +/* +** =================================================================== +** Method : GetCharWidth (component FontDisplay) +** +** Description : +** returns the width (in pixels) of a font character. +** Parameters : +** NAME - DESCRIPTION +** ch - character for which to calculate the width +** * charWidth - Pointer to width of the +** character in pixels (this is only for the +** character, without the space after the +** character) +** * totalWidth - Pointer to the total width +** of the character, including to the space +** after the character. +** * font - Pointer to font information +** Returns : Nothing +** =================================================================== +*/ + +McuFontDisplay_PixelDim McuFontDisplay_GetStringWidth(uint8_t *str, McuFontDisplay_Font *font, McuFontDisplay_PixelDim *lastCharSpace); +/* +** =================================================================== +** Method : GetStringWidth (component FontDisplay) +** +** Description : +** returns the width (in pixels) of a font string. For multiple +** line strings (separated by \ +** ) or for strings with \r it returns the longest string +** length. +** Parameters : +** NAME - DESCRIPTION +** * str - Pointer to the string. +** * font - Pointer to font information +** * lastCharSpace - Pointer to the width +** of the last character space, useful if you +** combine multiple strings. The pointer may +** be NULL. +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontDisplay_GetFontHeight(McuFontDisplay_Font *font, McuFontDisplay_PixelDim *charHeight, McuFontDisplay_PixelDim *totalHeight); +/* +** =================================================================== +** Method : GetFontHeight (component FontDisplay) +** +** Description : +** returns the height (in pixels) of a font. +** Parameters : +** NAME - DESCRIPTION +** * font - Pointer to font information +** * charHeight - Pointer to height of the +** character in pixels. +** * totalHeight - Pointer to the total +** height of the character, including to the +** space below the character. +** Returns : Nothing +** =================================================================== +*/ + +McuFontDisplay_PixelDim McuFontDisplay_GetStringHeight(uint8_t *str, McuFontDisplay_Font *font, McuFontDisplay_PixelDim *lastLineSpace); +/* +** =================================================================== +** Method : GetStringHeight (component FontDisplay) +** +** Description : +** returns the height (in pixels) of a font string. For +** multiple line strings (separated by newline) or for strings +** with \r it returns the longest list. +** Parameters : +** NAME - DESCRIPTION +** * str - Pointer to the string. +** * font - Pointer to font information +** * lastLineSpace - Pointer to the height +** of the last line space, useful if you +** combine multiple strings. The pointer may +** be NULL. +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuFontDisplay_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component FontDisplay) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontDisplay_Init(void); +/* +** =================================================================== +** Method : Init (component FontDisplay) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuFontDisplay_WriteStringWidth(uint8_t *str, McuFontDisplay_PixelColor color, McuFontDisplay_PixelDim *xCursor, McuFontDisplay_PixelDim *yCursor, McuFontDisplay_Font *font, McuFontDisplay_PixelDim width); +/* +** =================================================================== +** Method : WriteStringWidth (component FontDisplay) +** +** Description : +** Function to write a string or character at the startpoint. +** Set the startpoint with the function setCursor. If the +** string reaches the given width, the text gets wrapped to a +** new line. +** Parameters : +** NAME - DESCRIPTION +** * str - Pointer to the character string +** color - Foreground color to be used (for the +** character pixels) +** * xCursor - Pointer to x position of first +** character (upper left corner). On return +** this will contain the next y position. +** * yCursor - Pointer to y position of character +** (upper left corner). On return this will +** contain the next y position. +** * font - Pointer to font information +** width - Maximum of width of the text box. If +** text reaches the end of the box, the text +** gets wrapped to a new line. +** Returns : Nothing +** =================================================================== +*/ + +/* END McuFontDisplay. */ + +#ifdef __cplusplus +} +#endif + +#endif +/* ifndef __McuFontDisplay_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuGDisplaySSD1306.c b/TSM_PicoW_Sensor/McuLib/src/McuGDisplaySSD1306.c new file mode 100644 index 0000000..38378b8 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuGDisplaySSD1306.c @@ -0,0 +1,1243 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuGDisplaySSD1306.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GDisplay +** Version : Component 01.211, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-09, 10:10, # CodeGen: 829 +** Abstract : +** Graphical display driver for LCD or other displays +** Settings : +** Component name : McuGDisplaySSD1306 +** SDK : McuLib +** Inverted Pixels : no +** Memory Buffer : Enabled +** Orientation : Landscape +** Clear screen on Init : no +** Hardware : +** Display : McuSSD1306 +** Watchdog : Disabled +** RTOS : Disabled +** Contents : +** PutPixel - void McuGDisplaySSD1306_PutPixel(McuGDisplaySSD1306_PixelDim x,... +** SetPixel - void McuGDisplaySSD1306_SetPixel(McuGDisplaySSD1306_PixelDim x,... +** ClrPixel - void McuGDisplaySSD1306_ClrPixel(McuGDisplaySSD1306_PixelDim x,... +** Clear - void McuGDisplaySSD1306_Clear(void); +** DrawBox - void McuGDisplaySSD1306_DrawBox(McuGDisplaySSD1306_PixelDim x,... +** DrawFilledBox - void McuGDisplaySSD1306_DrawFilledBox(McuGDisplaySSD1306_PixelDim x,... +** DrawHLine - void McuGDisplaySSD1306_DrawHLine(McuGDisplaySSD1306_PixelDim x,... +** DrawVLine - void McuGDisplaySSD1306_DrawVLine(McuGDisplaySSD1306_PixelDim x,... +** DrawLine - void McuGDisplaySSD1306_DrawLine(McuGDisplaySSD1306_PixelDim xstart,... +** DrawCircle - void McuGDisplaySSD1306_DrawCircle(McuGDisplaySSD1306_PixelDim x0,... +** DrawFilledCircle - void McuGDisplaySSD1306_DrawFilledCircle(McuGDisplaySSD1306_PixelDim x0,... +** DrawBarChart - void McuGDisplaySSD1306_DrawBarChart(McuGDisplaySSD1306_PixelDim x,... +** DrawMonoBitmap - void McuGDisplaySSD1306_DrawMonoBitmap(int16_t x, int16_t y, PIMAGE image,... +** DrawMonoBitmapMask - void McuGDisplaySSD1306_DrawMonoBitmapMask(McuGDisplaySSD1306_PixelDim x,... +** DrawColorBitmap - void McuGDisplaySSD1306_DrawColorBitmap(McuGDisplaySSD1306_PixelDim x,... +** Draw65kBitmap - void McuGDisplaySSD1306_Draw65kBitmap(McuGDisplaySSD1306_PixelDim x1,... +** Draw256BitmapLow - void McuGDisplaySSD1306_Draw256BitmapLow(McuGDisplaySSD1306_PixelDim x1,... +** Draw256BitmapHigh - void McuGDisplaySSD1306_Draw256BitmapHigh(McuGDisplaySSD1306_PixelDim x1,... +** UpdateFull - void McuGDisplaySSD1306_UpdateFull(void); +** UpdateRegion - void McuGDisplaySSD1306_UpdateRegion(McuGDisplaySSD1306_PixelDim x,... +** GetDisplayOrientation - McuGDisplaySSD1306_DisplayOrientation M... +** SetDisplayOrientation - void McuGDisplaySSD1306_SetDisplayOrien... +** GetWidth - McuGDisplaySSD1306_PixelDim McuGDisplaySSD1306_GetWidth(void); +** GetHeight - McuGDisplaySSD1306_PixelDim McuGDisplaySSD1306_GetHeight(void); +** GetLongerSide - McuGDisplaySSD1306_PixelDim McuGDisplaySSD1306_GetLongerSide(void); +** GetShorterSide - McuGDisplaySSD1306_PixelDim McuGDisplaySSD1306_GetShorterSide(void); +** GetDisplay - void McuGDisplaySSD1306_GetDisplay(void); +** GiveDisplay - void McuGDisplaySSD1306_GiveDisplay(void); +** Deinit - void McuGDisplaySSD1306_Deinit(void); +** Init - void McuGDisplaySSD1306_Init(void); +** +** * Copyright (c) 2013-2023, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuGDisplaySSD1306.h +** @version 01.00 +** @brief +** Graphical display driver for LCD or other displays +*/ +/*! +** @addtogroup McuGDisplaySSD1306_module McuGDisplaySSD1306 module documentation +** @{ +*/ + +/* MODULE McuGDisplaySSD1306. */ + +#include "McuGDisplaySSD1306.h" + +#if McuGDisplaySSD1306_CONFIG_USE_MUTEX + #include "FreeRTOS.h" + #include "semphr.h" + + static SemaphoreHandle_t McuGDisplaySSD1306_displayMutex; +#endif +static const uint16_t c332to565[256] = { /* converts a 3-3-2 RBG value into a 5-6-5 RGB value */ + 0x0000, 0x000A, 0x0014, 0xF81E, 0x0120, 0x012A, 0x0134, 0xF93E, + 0x0240, 0x024A, 0x0254, 0xFA5E, 0x0360, 0x036A, 0x0374, 0xFB7E, + 0x0480, 0x048A, 0x0494, 0xFC9E, 0x05A0, 0x05AA, 0x05B4, 0xFDBE, + 0x06C0, 0x06CA, 0x06D4, 0xFEDE, 0x07E0, 0x07EA, 0x07F4, 0xFFFE, + 0x2000, 0x200A, 0x2014, 0xF81E, 0x2120, 0x212A, 0x2134, 0xF93E, + 0x2240, 0x224A, 0x2254, 0xFA5E, 0x2360, 0x236A, 0x2374, 0xFB7E, + 0x2480, 0x248A, 0x2494, 0xFC9E, 0x25A0, 0x25AA, 0x25B4, 0xFDBE, + 0x26C0, 0x26CA, 0x26D4, 0xFEDE, 0x27E0, 0x27EA, 0x27F4, 0xFFFE, + 0x4000, 0x400A, 0x4014, 0xF81E, 0x4120, 0x412A, 0x4134, 0xF93E, + 0x4240, 0x424A, 0x4254, 0xFA5E, 0x4360, 0x436A, 0x4374, 0xFB7E, + 0x4480, 0x448A, 0x4494, 0xFC9E, 0x45A0, 0x45AA, 0x45B4, 0xFDBE, + 0x46C0, 0x46CA, 0x46D4, 0xFEDE, 0x47E0, 0x47EA, 0x47F4, 0xFFFE, + 0x6000, 0x600A, 0x6014, 0xF81E, 0x6120, 0x612A, 0x6134, 0xF93E, + 0x6240, 0x624A, 0x6254, 0xFA5E, 0x6360, 0x636A, 0x6374, 0xFB7E, + 0x6480, 0x648A, 0x6494, 0xFC9E, 0x65A0, 0x65AA, 0x65B4, 0xFDBE, + 0x66C0, 0x66CA, 0x66D4, 0xFEDE, 0x67E0, 0x67EA, 0x67F4, 0xFFFE, + 0x8000, 0x800A, 0x8014, 0xF81E, 0x8120, 0x812A, 0x8134, 0xF93E, + 0x8240, 0x824A, 0x8254, 0xFA5E, 0x8360, 0x836A, 0x8374, 0xFB7E, + 0x8480, 0x848A, 0x8494, 0xFC9E, 0x85A0, 0x85AA, 0x85B4, 0xFDBE, + 0x86C0, 0x86CA, 0x86D4, 0xFEDE, 0x87E0, 0x87EA, 0x87F4, 0xFFFE, + 0xA000, 0xA00A, 0xA014, 0xF81E, 0xA120, 0xA12A, 0xA134, 0xF93E, + 0xA240, 0xA24A, 0xA254, 0xFA5E, 0xA360, 0xA36A, 0xA374, 0xFB7E, + 0xA480, 0xA48A, 0xA494, 0xFC9E, 0xA5A0, 0xA5AA, 0xA5B4, 0xFDBE, + 0xA6C0, 0xA6CA, 0xA6D4, 0xFEDE, 0xA7E0, 0xA7EA, 0xA7F4, 0xFFFE, + 0xC000, 0xC00A, 0xC014, 0xF81E, 0xC120, 0xC12A, 0xC134, 0xF93E, + 0xC240, 0xC24A, 0xC254, 0xFA5E, 0xC360, 0xC36A, 0xC374, 0xFB7E, + 0xC480, 0xC48A, 0xC494, 0xFC9E, 0xC5A0, 0xC5AA, 0xC5B4, 0xFDBE, + 0xC6C0, 0xC6CA, 0xC6D4, 0xFEDE, 0xC7E0, 0xC7EA, 0xC7F4, 0xFFFE, + 0xF800, 0xF80A, 0xF814, 0xF81E, 0xF920, 0xF92A, 0xF934, 0xF93E, + 0xFA40, 0xFA4A, 0xFA54, 0xFA5E, 0xFB60, 0xFB6A, 0xFB74, 0xFB7E, + 0xFC80, 0xFC8A, 0xFC94, 0xFC9E, 0xFDA0, 0xFDAA, 0xFDB4, 0xFDBE, + 0xFEC0, 0xFECA, 0xFED4, 0xFEDE, 0xFFE0, 0xFFEA, 0xFFF4, 0xFFFE, +}; +/* +** =================================================================== +** Method : Clear (component GDisplay) +** +** Description : +** Clears the display buffer. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuGDisplaySSD1306_Clear(void) +{ +#if McuGDisplaySSD1306_CONFIG_USE_DOUBLE_BUFFER + McuGDisplaySSD1306_CONFIG_FCT_NAME_CLEAR_BUFFER(McuGDisplaySSD1306_COLOR_PIXEL_CLR); +#else + McuGDisplaySSD1306_DrawFilledBox(0, 0, McuGDisplaySSD1306_GetWidth(), McuGDisplaySSD1306_GetHeight(), McuGDisplaySSD1306_COLOR_PIXEL_CLR); +#endif +} + +/* +** =================================================================== +** Method : SetPixel (component GDisplay) +** +** Description : +** Sets a pixel in the display buffer +** Parameters : +** NAME - DESCRIPTION +** x - Pixel x position +** y - Pixel y position +** Returns : Nothing +** =================================================================== +*/ +void McuGDisplaySSD1306_SetPixel(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y) +{ + if (x>=McuGDisplaySSD1306_GetWidth() || y>=McuGDisplaySSD1306_GetHeight()) { /* values out of range */ + return; + } +#if McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING + McuGDisplaySSD1306_GetDisplay(); +#endif +#if McuGDisplaySSD1306_CONFIG_USE_WINDOW_CAPABILITY + McuGDisplaySSD1306_CONFIG_FCT_NAME_OPENWINDOW(x, y, x, y); /* set up a one pixel window */ + McuGDisplaySSD1306_CONFIG_FCT_NAME_WRITEPIXEL(McuGDisplaySSD1306_COLOR_BLACK); /* store pixel with color information */ + McuGDisplaySSD1306_CONFIG_FCT_NAME_CLOSEWINDOW(); /* close and execute window */ +#else + McuGDisplaySSD1306_CONFIG_FCT_NAME_PUTPIXEL(x, y, McuGDisplaySSD1306_COLOR_PIXEL_SET); +#endif +#if McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING + McuGDisplaySSD1306_GiveDisplay(); +#endif +} + +/* +** =================================================================== +** Method : ClrPixel (component GDisplay) +** +** Description : +** Clears a single pixel in the display. +** Parameters : +** NAME - DESCRIPTION +** x - Pixel x position. +** y - Pixel y position. +** Returns : Nothing +** =================================================================== +*/ +void McuGDisplaySSD1306_ClrPixel(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y) +{ + if (x>=McuGDisplaySSD1306_GetWidth() || y>=McuGDisplaySSD1306_GetHeight()) { /* values out of range */ + return; + } +#if McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING + McuGDisplaySSD1306_GetDisplay(); +#endif +#if McuGDisplaySSD1306_CONFIG_USE_WINDOW_CAPABILITY + McuGDisplaySSD1306_CONFIG_FCT_NAME_OPENWINDOW(x, y, x, y); /* set up a one pixel window */ + McuGDisplaySSD1306_CONFIG_FCT_NAME_WRITEPIXEL(McuGDisplaySSD1306_COLOR_WHITE); /* store pixel with color information */ + McuGDisplaySSD1306_CONFIG_FCT_NAME_CLOSEWINDOW(); /* close and execute window */ +#else + McuGDisplaySSD1306_CONFIG_FCT_NAME_PUTPIXEL(x, y, McuGDisplaySSD1306_COLOR_PIXEL_CLR); +#endif +#if McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING + McuGDisplaySSD1306_GiveDisplay(); +#endif +} + +/* +** =================================================================== +** Method : UpdateFull (component GDisplay) +** +** Description : +** Updates the image on the display. This is needed in case the +** display requires a periodic refresh. For display using +** windowing, this function may be implemented as dummy stub, +** as the display content already is written. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +/* method is implemented as macro in header file +void McuGDisplaySSD1306_UpdateFull(void) +{ +} +*/ + +/* +** =================================================================== +** Method : PutPixel (component GDisplay) +** +** Description : +** +** Parameters : +** NAME - DESCRIPTION +** x - x coordinate +** y - y coordinate +** color - color to be used for the pixel +** Returns : Nothing +** =================================================================== +*/ +#ifdef __HC08__ + #pragma MESSAGE DISABLE C4001 /* condition always FALSE */ +#endif +void McuGDisplaySSD1306_PutPixel(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, McuGDisplaySSD1306_PixelColor color) +{ + if (x>=McuGDisplaySSD1306_GetWidth() || y>=McuGDisplaySSD1306_GetHeight()) { /* values out of range */ + return; + } +#if McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING + McuGDisplaySSD1306_GetDisplay(); +#endif +#if McuGDisplaySSD1306_CONFIG_USE_WINDOW_CAPABILITY + McuGDisplaySSD1306_CONFIG_FCT_NAME_OPENWINDOW(x, y, x, y); /* set up window as large as the box */ + McuGDisplaySSD1306_CONFIG_FCT_NAME_WRITEPIXEL(color); /* store pixel with color information */ + McuGDisplaySSD1306_CONFIG_FCT_NAME_CLOSEWINDOW(); /* close and execute window */ +#else + McuGDisplaySSD1306_CONFIG_FCT_NAME_PUTPIXEL(x, y, color); +#endif +#if McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING + McuGDisplaySSD1306_GiveDisplay(); +#endif +} +#ifdef __HC08__ + #pragma MESSAGE DEFAULT C4001 /* condition always FALSE */ +#endif + +/* +** =================================================================== +** Method : DrawFilledBox (component GDisplay) +** +** Description : +** Draws a rectangle box (filled) +** Parameters : +** NAME - DESCRIPTION +** x - x left upper coordinate +** y - y left upper coordinate +** width - Width in pixels +** height - Height in pixels +** color - color to be used to fill the box. +** Returns : Nothing +** =================================================================== +*/ +void McuGDisplaySSD1306_DrawFilledBox(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, McuGDisplaySSD1306_PixelDim width, McuGDisplaySSD1306_PixelDim height, McuGDisplaySSD1306_PixelColor color) +{ +#if McuGDisplaySSD1306_CONFIG_USE_WINDOW_CAPABILITY + McuGDisplaySSD1306_PixelCount pixCnt; + McuGDisplaySSD1306_PixelDim x1, y1; +#else + McuGDisplaySSD1306_PixelDim x0, xe, y0, ye; +#endif + McuGDisplaySSD1306_PixelDim d_width = McuGDisplaySSD1306_GetWidth(); + McuGDisplaySSD1306_PixelDim d_height = McuGDisplaySSD1306_GetHeight(); + + if ( width==0 || height==0 + || x>=d_width || y>=d_height + ) { + return; /* nothing to do */ + } + if (x+width>d_width) { /* value out of range */ + if (x>=d_width) { + return; /* completely outside of display */ + } else { + width = (McuGDisplaySSD1306_PixelDim)(d_width-x); + } + } + if (y+height>d_height) { /* value out of range */ + if (y>=d_height) { + return; /* completely outside of display */ + } else { + height = (McuGDisplaySSD1306_PixelDim)(d_height-y); + } + } +#if McuGDisplaySSD1306_CONFIG_USE_WINDOW_CAPABILITY + x1 = (McuGDisplaySSD1306_PixelDim)(x+width-1); /* set window lower right x coordinate */ + y1 = (McuGDisplaySSD1306_PixelDim)(y+height-1); /* set window lower right y coordinate */ + pixCnt = (McuGDisplaySSD1306_PixelCount)((x1-x+1)*(y1-y+1)); /* number of pixels to write */ + #if McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING + McuGDisplaySSD1306_GetDisplay(); + #endif + McuGDisplaySSD1306_CONFIG_FCT_NAME_OPENWINDOW(x, y, x1, y1); /* set up window as large as the box */ + while (pixCnt>0) { + McuGDisplaySSD1306_CONFIG_FCT_NAME_WRITEPIXEL(color); /* store pixel with color information */ + pixCnt--; + } /* while */ + McuGDisplaySSD1306_CONFIG_FCT_NAME_CLOSEWINDOW(); /* close and execute window */ + #if McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING + McuGDisplaySSD1306_GiveDisplay(); + #endif +#else + y0 = y; ye = (McuGDisplaySSD1306_PixelDim)(y0+height-1); + #if McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING + McuGDisplaySSD1306_GetDisplay(); + #endif + for(;;) { /* breaks */ + x0 = x; xe = (McuGDisplaySSD1306_PixelDim)(x0+width-1); + for(;;) { /* process line, breaks */ + McuGDisplaySSD1306_PutPixel(x0, y0, color); + if (x0==xe) { + break; /* reached end of line */ + } + x0++; + } /* for */ + if (y0==ye) { + break; /* reached end */ + } + y0++; + } /* for */ + #if McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING + McuGDisplaySSD1306_GiveDisplay(); + #endif +#endif +} + +/* +** =================================================================== +** Method : DrawBox (component GDisplay) +** +** Description : +** Draws a rectangle line box +** Parameters : +** NAME - DESCRIPTION +** x - x left upper coordinate +** y - y left upper coordinate +** width - width in pixels +** height - height in pixels +** lineWidth - width of the line +** color - color for the box +** Returns : Nothing +** =================================================================== +*/ +void McuGDisplaySSD1306_DrawBox(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, McuGDisplaySSD1306_PixelDim width, McuGDisplaySSD1306_PixelDim height, McuGDisplaySSD1306_PixelDim lineWidth, McuGDisplaySSD1306_PixelColor color) +{ + /* top line: */ + McuGDisplaySSD1306_DrawFilledBox(x, y, width, lineWidth, color); + /* left line: */ + McuGDisplaySSD1306_DrawFilledBox(x, (McuGDisplaySSD1306_PixelDim)(y+lineWidth), lineWidth, (McuGDisplaySSD1306_PixelDim)(height-(2*lineWidth)), color); + /* right line: */ + McuGDisplaySSD1306_DrawFilledBox((McuGDisplaySSD1306_PixelDim)(x+width-lineWidth), (McuGDisplaySSD1306_PixelDim)(y+lineWidth), lineWidth, (McuGDisplaySSD1306_PixelDim)(height-(2*lineWidth)), color); + /* bottom line: */ + McuGDisplaySSD1306_DrawFilledBox(x, (McuGDisplaySSD1306_PixelDim)(y+height-lineWidth), width, lineWidth, color); +} + +/* +** =================================================================== +** Method : DrawMonoBitmap (component GDisplay) +** +** Description : +** Draws a B/W bitmap. +** Parameters : +** NAME - DESCRIPTION +** x - x position of left upper corner +** y - y position of left upper corner +** image - Pointer to image structure and +** information. +** pixelColor - Color to be used for pixels +** (pixel set) +** backgroundColor - Color to be used +** for background (pixel not set) +** Returns : Nothing +** =================================================================== +*/ +void McuGDisplaySSD1306_DrawMonoBitmap(int16_t x, int16_t y, PIMAGE image, McuGDisplaySSD1306_PixelColor pixelColor, McuGDisplaySSD1306_PixelColor backgroundColor) +{ + int x0, y0, xe, ye; + McuGDisplaySSD1306_PixelColor pixel; + uint8_t i; + const uint8_t *data; + + data = image->pixmap; + y0 = y; + ye = (y+image->height-1); + xe = (x+image->width-1); + for(;;) { + i=7; + x0 = x; + for(;;) { + pixel = (McuGDisplaySSD1306_PixelColor)(((*data)&(1<>i); /* extract pixel out of bitstream */ + if (x0>=0 && y0>=0) { /* do not write pixel if outside of display */ + McuGDisplaySSD1306_PutPixel(x0, y0, (McuGDisplaySSD1306_PixelColor)(pixel==1?pixelColor:backgroundColor)); + } + if (i==0 && x0!=xe) { /* next byte inside the row */ + data++; + i = 7; + } else { + i--; + } + if (x0==xe) { /* reached end of line, next row */ + data++; /* next data byte */ + break; + } + x0++; + } /* for */ + if (y0==ye) break; /* reached end */ + y0++; + } /* for */ +} + +/* +** =================================================================== +** Method : DrawMonoBitmapMask (component GDisplay) +** +** Description : +** Draws a B/W bitmap, but only the pixels which are set +** Parameters : +** NAME - DESCRIPTION +** x - x position of left upper corner +** y - y position of left upper corner +** image - Pointer to image structure and +** information. +** pixelColor - Color to be used for pixels +** (pixel set) +** Returns : Nothing +** =================================================================== +*/ +void McuGDisplaySSD1306_DrawMonoBitmapMask(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, PIMAGE image, McuGDisplaySSD1306_PixelColor pixelColor) +{ + McuGDisplaySSD1306_PixelDim x0, y0, xe, ye; + McuGDisplaySSD1306_PixelColor pixel; + uint8_t i; + const uint8_t *data; + + data = image->pixmap; + y0 = y; + ye = (McuGDisplaySSD1306_PixelDim)(y+image->height-1); + xe = (McuGDisplaySSD1306_PixelDim)(x+image->width-1); + for(;;) { + i=7; + x0 = x; + for(;;) { + pixel = (McuGDisplaySSD1306_PixelColor)(((*data)&(1<>i); /* extract pixel out of bitstream */ + if (pixel) { /* only draw if pixel is set, everything else is transparent */ + McuGDisplaySSD1306_PutPixel(x0, y0, pixelColor); + } + if (i==0 && x0!=xe) { /* next byte inside the row */ + data++; + i = 7; + } else { + i--; + } + if (x0==xe) { /* reached end of line, next row */ + data++; /* next data byte */ + break; + } + x0++; + } /* for */ + if (y0==ye) break; /* reached end */ + y0++; + } /* for */ +} + +/* +** =================================================================== +** Method : DrawColorBitmap (component GDisplay) +** +** Description : +** Draws a color bitmap. Pixel data is in 3-3-2 RGB format. +** Parameters : +** NAME - DESCRIPTION +** x - x position of left upper corner +** y - y position of left upper corner +** image - Pointer to image structure and +** information. +** Returns : Nothing +** =================================================================== +*/ +void McuGDisplaySSD1306_DrawColorBitmap(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, PIMAGE image) +{ + McuGDisplaySSD1306_PixelDim x0, y0, xe, ye; + McuGDisplaySSD1306_PixelColor pixel; + const uint8_t *data; + + data = image->pixmap; + y0 = y; + ye = (McuGDisplaySSD1306_PixelDim)(y+image->height-1); + xe = (McuGDisplaySSD1306_PixelDim)(x+image->width-1); + for(;;) { + x0 = x; + for(;;) { + pixel = (McuGDisplaySSD1306_PixelColor)c332to565[*data]; /* extract pixel out of bitstream and convert it to our color mode*/ + McuGDisplaySSD1306_PutPixel(x0, y0, pixel); + data++; + if (x0==xe) { /* reached end of line, next row */ + break; + } + x0++; + } /* for */ + if (y0==ye) break; /* reached end */ + y0++; + } /* for */ +} + +/* +** =================================================================== +** Method : DrawHLine (component GDisplay) +** +** Description : +** Draws a horizontal line +** Parameters : +** NAME - DESCRIPTION +** x - x left upper coordinate +** y - y left upper coordinate +** length - Length of line in pixels +** color - color to be used to fill the box. +** Returns : Nothing +** =================================================================== +*/ +void McuGDisplaySSD1306_DrawHLine(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, McuGDisplaySSD1306_PixelDim length, McuGDisplaySSD1306_PixelColor color) +{ + McuGDisplaySSD1306_DrawFilledBox(x, y, length, 1, color); +} + +/* +** =================================================================== +** Method : DrawVLine (component GDisplay) +** +** Description : +** Draws a vertical line +** Parameters : +** NAME - DESCRIPTION +** x - x left upper coordinate +** y - y left upper coordinate +** length - Length of line in pixels +** color - color to be used to fill the box. +** Returns : Nothing +** =================================================================== +*/ +void McuGDisplaySSD1306_DrawVLine(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, McuGDisplaySSD1306_PixelDim length, McuGDisplaySSD1306_PixelColor color) +{ + McuGDisplaySSD1306_DrawFilledBox(x, y, 1, length, color); +} + +/* +** =================================================================== +** Method : DrawBarChart (component GDisplay) +** +** Description : +** Draws a series of bars for a chart +** Parameters : +** NAME - DESCRIPTION +** x - upper left corner x coordinate +** y - upper left corner y coordinate +** width - Chart box width +** height - Chart box height +** * data - Pointer to data (series of % values +** from 0...100%) +** nofData - number of data bytes +** barColor - Color to be used for the bars. +** borderWidth - width of a border to be +** draw. Pass zero if there shall be no border. +** borderColor - Color to be used for the +** border (if borderWidth is not zero) +** borderSpace - Space to be used in pixels +** between border and bars. +** Returns : Nothing +** =================================================================== +*/ +void McuGDisplaySSD1306_DrawBarChart(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, McuGDisplaySSD1306_PixelDim width, McuGDisplaySSD1306_PixelDim height, uint8_t *data, uint8_t nofData, McuGDisplaySSD1306_PixelColor barColor, uint8_t borderWidth, McuGDisplaySSD1306_PixelColor borderColor, uint8_t borderSpace) +{ + uint8_t i; + McuGDisplaySSD1306_PixelDim barHeight; /* for calculation of each bar height */ + McuGDisplaySSD1306_PixelDim barWidth; /* bar width, based on even distribution of the bars */ + + if (borderWidth > 0) { /* border */ + McuGDisplaySSD1306_DrawBox(x, y, width, height, borderWidth, borderColor); + } + /* reduce drawing area because of border */ + x += borderWidth+borderSpace; + y += borderWidth+borderSpace; + width -= 2*(borderWidth+borderSpace); + height -= 2*(borderWidth+borderSpace); + + /* calculat bar width based on number of bars so we fill out our drawing area */ + barWidth = (McuGDisplaySSD1306_PixelDim)((width-(nofData+1)*borderSpace)/nofData); + + /* draw some bars */ + for(i=0; i 0) { + McuGDisplaySSD1306_DrawFilledBox(x, (McuGDisplaySSD1306_PixelDim)(y+height-barHeight), barWidth, barHeight, barColor); + } + x += barWidth+borderSpace; + } +} + +/* +** =================================================================== +** Method : DrawLine (component GDisplay) +** +** Description : +** Draws a line using the Bresenham method +** Parameters : +** NAME - DESCRIPTION +** xstart - x start coordinate +** ystart - y start coordinate +** xend - x end coordinate +** yend - y end coordinate +** color - color to be used for the line +** Returns : Nothing +** =================================================================== +*/ +void McuGDisplaySSD1306_DrawLine(McuGDisplaySSD1306_PixelDim xstart, McuGDisplaySSD1306_PixelDim ystart, McuGDisplaySSD1306_PixelDim xend, McuGDisplaySSD1306_PixelDim yend, McuGDisplaySSD1306_PixelColor color) +{ + /* Based on Bresenham algorithm and http://de.wikipedia.org/wiki/Bresenham-Algorithmus */ + #define sgn(x) ((x) > 0) ? 1 : ((x) < 0) ? -1 : 0 + McuGDisplaySSD1306_PixelDim x, y; + int t, dx, dy, incx, incy, pdx, pdy, ddx, ddy, es, el, err; + + /* Calculate distance in both dimensions */ + dx = xend - xstart; + dy = yend - ystart; + /* Determin sign of increment */ + incx = sgn(dx); + incy = sgn(dy); + if(dx<0) dx = -dx; + if(dy<0) dy = -dy; + /* Check which distance is larger */ + if (dx>dy) { /* we are faster in x direction */ + pdx=incx; pdy=0; /* pd. is parallel step */ + ddx=incx; ddy=incy; /* dd. is diagonal step */ + es =dy; el =dx; /* error steps fast (es) and slow (el) */ + } else { /* faster in y direction */ + pdx=0; pdy=incy; /* pd. is parallel step */ + ddx=incx; ddy=incy; /* dd. is diagonal step */ + es =dx; el =dy; /* error step fast (es) and slow (el) */ + } + /* Do some initialization first... */ + x = xstart; y = ystart; err = el/2; + McuGDisplaySSD1306_PutPixel(x, y, color); /* put first pixel */ + /* calculate pixels */ + for(t=0; t= 0) { + y--; + ddF_y += 2; + f += ddF_y; + } + x++; + ddF_x += 2; + f += ddF_x + 1; + McuGDisplaySSD1306_PutPixel((McuGDisplaySSD1306_PixelDim)(x0 + x), (McuGDisplaySSD1306_PixelDim)(y0 + y), color); + McuGDisplaySSD1306_PutPixel((McuGDisplaySSD1306_PixelDim)(x0 - x), (McuGDisplaySSD1306_PixelDim)(y0 + y), color); + McuGDisplaySSD1306_PutPixel((McuGDisplaySSD1306_PixelDim)(x0 + x), (McuGDisplaySSD1306_PixelDim)(y0 - y), color); + McuGDisplaySSD1306_PutPixel((McuGDisplaySSD1306_PixelDim)(x0 - x), (McuGDisplaySSD1306_PixelDim)(y0 - y), color); + McuGDisplaySSD1306_PutPixel((McuGDisplaySSD1306_PixelDim)(x0 + y), (McuGDisplaySSD1306_PixelDim)(y0 + x), color); + McuGDisplaySSD1306_PutPixel((McuGDisplaySSD1306_PixelDim)(x0 - y), (McuGDisplaySSD1306_PixelDim)(y0 + x), color); + McuGDisplaySSD1306_PutPixel((McuGDisplaySSD1306_PixelDim)(x0 + y), (McuGDisplaySSD1306_PixelDim)(y0 - x), color); + McuGDisplaySSD1306_PutPixel((McuGDisplaySSD1306_PixelDim)(x0 - y), (McuGDisplaySSD1306_PixelDim)(y0 - x), color); + } +} + +/* +** =================================================================== +** Method : DrawFilledCircle (component GDisplay) +** +** Description : +** Draws a circle using the Bresenham method +** Parameters : +** NAME - DESCRIPTION +** x0 - x start coordinate +** y0 - y start coordinate +** radius - Radius of the circle +** color - fill color to be used +** Returns : Nothing +** =================================================================== +*/ +void McuGDisplaySSD1306_DrawFilledCircle(McuGDisplaySSD1306_PixelDim x0, McuGDisplaySSD1306_PixelDim y0, McuGDisplaySSD1306_PixelDim radius, McuGDisplaySSD1306_PixelColor color) +{ + /* draw a circle using the Bresenham method, see http://de.wikipedia.org/wiki/Bresenham-Algorithmus and + http://forums.tigsource.com/index.php?topic=17068.0;wap2 */ + McuGDisplaySSD1306_PixelDim xoff=0; + McuGDisplaySSD1306_PixelDim yoff=radius; + int balance=-((int)radius); + McuGDisplaySSD1306_PixelDim p0, p1, w0, w1; + + while (xoff <= yoff) { + p0 = (McuGDisplaySSD1306_PixelDim)(x0-xoff); + p1 = (McuGDisplaySSD1306_PixelDim)(x0-yoff); + w0 = (McuGDisplaySSD1306_PixelDim)(2*xoff); + w1 = (McuGDisplaySSD1306_PixelDim)(2*yoff); + McuGDisplaySSD1306_DrawHLine(p0, (McuGDisplaySSD1306_PixelDim)(y0+yoff), w0, color); + McuGDisplaySSD1306_DrawHLine(p0, (McuGDisplaySSD1306_PixelDim)(y0-yoff), w0, color); + McuGDisplaySSD1306_DrawHLine(p1, (McuGDisplaySSD1306_PixelDim)(y0+xoff), w1, color); + McuGDisplaySSD1306_DrawHLine(p1, (McuGDisplaySSD1306_PixelDim)(y0-xoff), w1, color); + balance += 2*xoff; + xoff++; + if (balance>=0) { + yoff--; + balance -= 2*yoff; + } + } /* while */ +} + +/* +** =================================================================== +** Method : Draw65kBitmap (component GDisplay) +** +** Description : +** Draws a 65k color bitmap (compressed or uncompressed) +** Parameters : +** NAME - DESCRIPTION +** x1 - left upper starting corner +** y1 - left upper starting corner +** x2 - right lower corner +** y2 - right lower corner +** * bmp - Pointer to bitmap +** compressed - +** Returns : Nothing +** =================================================================== +*/ +void McuGDisplaySSD1306_Draw65kBitmap(McuGDisplaySSD1306_PixelDim x1, McuGDisplaySSD1306_PixelDim y1, McuGDisplaySSD1306_PixelDim x2, McuGDisplaySSD1306_PixelDim y2, uint16_t *bmp, bool compressed) +{ +#if McuGDisplaySSD1306_CONFIG_USE_WINDOW_CAPABILITY + McuGDisplaySSD1306_PixelCount pixelCount = (McuGDisplaySSD1306_PixelCount)((x2-x1+1) * (y2-y1+1)); + +#endif +#if McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING + McuGDisplaySSD1306_GetDisplay(); +#endif +#if McuGDisplaySSD1306_CONFIG_USE_WINDOW_CAPABILITY + McuGDisplaySSD1306_CONFIG_FCT_NAME_OPENWINDOW(x1, y1, x2, y2); /* set up window as large as the box */ + if (compressed) { + McuGDisplaySSD1306_PixelColor PixelColor = 0; + uint16_t Pos = 0; + bool FirstRead = TRUE; + uint16_t i; + uint16_t Repeat; + + for (i=0; i>McuGDisplaySSD1306_BUF_BYTE_PIXEL_BIT_NO(x,y)) +#elif McuGDisplaySSD1306_CONFIG_NOF_BITS_PER_PIXEL==8 + #define McuGDisplaySSD1306_BUF_BYTE_PIXEL_MASK(x,y) /* pixel mask for an individual bit inside a display buffer byte */ \ + 0xff + #define McuGDisplaySSD1306_BUF_BYTE_GET_PIXEL(x,y) /* extract a pixel */ \ + McuGDisplaySSD1306_BUF_BYTE(x,y) +#elif McuGDisplaySSD1306_CONFIG_NOF_BITS_PER_PIXEL==16 + /* no byte access used */ +#elif McuGDisplaySSD1306_CONFIG_NOF_BITS_PER_PIXEL==24 + /* Neopixels, no byte access used */ +#else + #error "not supported" +#endif + +void McuGDisplaySSD1306_Clear(void); +/* +** =================================================================== +** Method : Clear (component GDisplay) +** +** Description : +** Clears the display buffer. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuGDisplaySSD1306_SetPixel(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y); +/* +** =================================================================== +** Method : SetPixel (component GDisplay) +** +** Description : +** Sets a pixel in the display buffer +** Parameters : +** NAME - DESCRIPTION +** x - Pixel x position +** y - Pixel y position +** Returns : Nothing +** =================================================================== +*/ + +void McuGDisplaySSD1306_ClrPixel(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y); +/* +** =================================================================== +** Method : ClrPixel (component GDisplay) +** +** Description : +** Clears a single pixel in the display. +** Parameters : +** NAME - DESCRIPTION +** x - Pixel x position. +** y - Pixel y position. +** Returns : Nothing +** =================================================================== +*/ + +#define McuGDisplaySSD1306_UpdateFull() McuSSD1306_UpdateFull() +/* +** =================================================================== +** Method : UpdateFull (component GDisplay) +** +** Description : +** Updates the image on the display. This is needed in case the +** display requires a periodic refresh. For display using +** windowing, this function may be implemented as dummy stub, +** as the display content already is written. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuGDisplaySSD1306_DrawFilledBox(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, McuGDisplaySSD1306_PixelDim width, McuGDisplaySSD1306_PixelDim height, McuGDisplaySSD1306_PixelColor color); +/* +** =================================================================== +** Method : DrawFilledBox (component GDisplay) +** +** Description : +** Draws a rectangle box (filled) +** Parameters : +** NAME - DESCRIPTION +** x - x left upper coordinate +** y - y left upper coordinate +** width - Width in pixels +** height - Height in pixels +** color - color to be used to fill the box. +** Returns : Nothing +** =================================================================== +*/ + +void McuGDisplaySSD1306_PutPixel(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, McuGDisplaySSD1306_PixelColor color); +/* +** =================================================================== +** Method : PutPixel (component GDisplay) +** +** Description : +** +** Parameters : +** NAME - DESCRIPTION +** x - x coordinate +** y - y coordinate +** color - color to be used for the pixel +** Returns : Nothing +** =================================================================== +*/ + +void McuGDisplaySSD1306_DrawBox(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, McuGDisplaySSD1306_PixelDim width, McuGDisplaySSD1306_PixelDim height, McuGDisplaySSD1306_PixelDim lineWidth, McuGDisplaySSD1306_PixelColor color); +/* +** =================================================================== +** Method : DrawBox (component GDisplay) +** +** Description : +** Draws a rectangle line box +** Parameters : +** NAME - DESCRIPTION +** x - x left upper coordinate +** y - y left upper coordinate +** width - width in pixels +** height - height in pixels +** lineWidth - width of the line +** color - color for the box +** Returns : Nothing +** =================================================================== +*/ + +void McuGDisplaySSD1306_DrawMonoBitmap(int16_t x, int16_t y, PIMAGE image, McuGDisplaySSD1306_PixelColor pixelColor, McuGDisplaySSD1306_PixelColor backgroundColor); +/* +** =================================================================== +** Method : DrawMonoBitmap (component GDisplay) +** +** Description : +** Draws a B/W bitmap. +** Parameters : +** NAME - DESCRIPTION +** x - x position of left upper corner +** y - y position of left upper corner +** image - Pointer to image structure and +** information. +** pixelColor - Color to be used for pixels +** (pixel set) +** backgroundColor - Color to be used +** for background (pixel not set) +** Returns : Nothing +** =================================================================== +*/ + +void McuGDisplaySSD1306_DrawHLine(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, McuGDisplaySSD1306_PixelDim length, McuGDisplaySSD1306_PixelColor color); +/* +** =================================================================== +** Method : DrawHLine (component GDisplay) +** +** Description : +** Draws a horizontal line +** Parameters : +** NAME - DESCRIPTION +** x - x left upper coordinate +** y - y left upper coordinate +** length - Length of line in pixels +** color - color to be used to fill the box. +** Returns : Nothing +** =================================================================== +*/ + +void McuGDisplaySSD1306_DrawVLine(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, McuGDisplaySSD1306_PixelDim length, McuGDisplaySSD1306_PixelColor color); +/* +** =================================================================== +** Method : DrawVLine (component GDisplay) +** +** Description : +** Draws a vertical line +** Parameters : +** NAME - DESCRIPTION +** x - x left upper coordinate +** y - y left upper coordinate +** length - Length of line in pixels +** color - color to be used to fill the box. +** Returns : Nothing +** =================================================================== +*/ + +void McuGDisplaySSD1306_DrawBarChart(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, McuGDisplaySSD1306_PixelDim width, McuGDisplaySSD1306_PixelDim height, uint8_t *data, uint8_t nofData, McuGDisplaySSD1306_PixelColor barColor, uint8_t borderWidth, McuGDisplaySSD1306_PixelColor borderColor, uint8_t borderSpace); +/* +** =================================================================== +** Method : DrawBarChart (component GDisplay) +** +** Description : +** Draws a series of bars for a chart +** Parameters : +** NAME - DESCRIPTION +** x - upper left corner x coordinate +** y - upper left corner y coordinate +** width - Chart box width +** height - Chart box height +** * data - Pointer to data (series of % values +** from 0...100%) +** nofData - number of data bytes +** barColor - Color to be used for the bars. +** borderWidth - width of a border to be +** draw. Pass zero if there shall be no border. +** borderColor - Color to be used for the +** border (if borderWidth is not zero) +** borderSpace - Space to be used in pixels +** between border and bars. +** Returns : Nothing +** =================================================================== +*/ + +void McuGDisplaySSD1306_DrawColorBitmap(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, PIMAGE image); +/* +** =================================================================== +** Method : DrawColorBitmap (component GDisplay) +** +** Description : +** Draws a color bitmap. Pixel data is in 3-3-2 RGB format. +** Parameters : +** NAME - DESCRIPTION +** x - x position of left upper corner +** y - y position of left upper corner +** image - Pointer to image structure and +** information. +** Returns : Nothing +** =================================================================== +*/ + +void McuGDisplaySSD1306_DrawLine(McuGDisplaySSD1306_PixelDim xstart, McuGDisplaySSD1306_PixelDim ystart, McuGDisplaySSD1306_PixelDim xend, McuGDisplaySSD1306_PixelDim yend, McuGDisplaySSD1306_PixelColor color); +/* +** =================================================================== +** Method : DrawLine (component GDisplay) +** +** Description : +** Draws a line using the Bresenham method +** Parameters : +** NAME - DESCRIPTION +** xstart - x start coordinate +** ystart - y start coordinate +** xend - x end coordinate +** yend - y end coordinate +** color - color to be used for the line +** Returns : Nothing +** =================================================================== +*/ + +void McuGDisplaySSD1306_DrawCircle(McuGDisplaySSD1306_PixelDim x0, McuGDisplaySSD1306_PixelDim y0, McuGDisplaySSD1306_PixelDim radius, McuGDisplaySSD1306_PixelColor color); +/* +** =================================================================== +** Method : DrawCircle (component GDisplay) +** +** Description : +** Draws a circle using the Bresenham method +** Parameters : +** NAME - DESCRIPTION +** x0 - x start coordinate +** y0 - y start coordinate +** radius - Radius of the circle +** color - color to be used for the line +** Returns : Nothing +** =================================================================== +*/ + +void McuGDisplaySSD1306_Draw65kBitmap(McuGDisplaySSD1306_PixelDim x1, McuGDisplaySSD1306_PixelDim y1, McuGDisplaySSD1306_PixelDim x2, McuGDisplaySSD1306_PixelDim y2, uint16_t *bmp, bool compressed); +/* +** =================================================================== +** Method : Draw65kBitmap (component GDisplay) +** +** Description : +** Draws a 65k color bitmap (compressed or uncompressed) +** Parameters : +** NAME - DESCRIPTION +** x1 - left upper starting corner +** y1 - left upper starting corner +** x2 - right lower corner +** y2 - right lower corner +** * bmp - Pointer to bitmap +** compressed - +** Returns : Nothing +** =================================================================== +*/ + +void McuGDisplaySSD1306_Draw256BitmapLow(McuGDisplaySSD1306_PixelDim x1, McuGDisplaySSD1306_PixelDim y1, McuGDisplaySSD1306_PixelDim x2, McuGDisplaySSD1306_PixelDim y2, uint8_t *bmp, bool compressed); +/* +** =================================================================== +** Method : Draw256BitmapLow (component GDisplay) +** +** Description : +** Draws a 256 color bitmap (compressed or uncompressed) +** Parameters : +** NAME - DESCRIPTION +** x1 - left upper starting corner +** y1 - left upper starting corner +** x2 - right lower corner +** y2 - right lower corner +** * bmp - Pointer to bitmap +** compressed - +** Returns : Nothing +** =================================================================== +*/ + +void McuGDisplaySSD1306_Draw256BitmapHigh(McuGDisplaySSD1306_PixelDim x1, McuGDisplaySSD1306_PixelDim y1, McuGDisplaySSD1306_PixelDim x2, McuGDisplaySSD1306_PixelDim y2, uint8_t *bmp, McuGDisplaySSD1306_PixelColor *ColorTable, bool compressed); +/* +** =================================================================== +** Method : Draw256BitmapHigh (component GDisplay) +** +** Description : +** Draws a 256 color bitmap (compressed or uncompressed) with a +** color table. +** Parameters : +** NAME - DESCRIPTION +** x1 - left upper starting corner +** y1 - left upper starting corner +** x2 - right lower corner +** y2 - right lower corner +** * bmp - Pointer to bitmap +** * ColorTable - Pointer to array of colors +** (color table) +** compressed - +** Returns : Nothing +** =================================================================== +*/ + +void McuGDisplaySSD1306_UpdateRegion(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, McuGDisplaySSD1306_PixelDim w, McuGDisplaySSD1306_PixelDim h); +/* +** =================================================================== +** Method : UpdateRegion (component GDisplay) +** +** Description : +** Update a region of the display. +** Parameters : +** NAME - DESCRIPTION +** x - x coordinate +** y - y coordinate +** w - Width of the update region +** h - height of the update region +** Returns : Nothing +** =================================================================== +*/ + +void McuGDisplaySSD1306_DrawFilledCircle(McuGDisplaySSD1306_PixelDim x0, McuGDisplaySSD1306_PixelDim y0, McuGDisplaySSD1306_PixelDim radius, McuGDisplaySSD1306_PixelColor color); +/* +** =================================================================== +** Method : DrawFilledCircle (component GDisplay) +** +** Description : +** Draws a circle using the Bresenham method +** Parameters : +** NAME - DESCRIPTION +** x0 - x start coordinate +** y0 - y start coordinate +** radius - Radius of the circle +** color - fill color to be used +** Returns : Nothing +** =================================================================== +*/ + +#define McuGDisplaySSD1306_GetDisplayOrientation McuSSD1306_GetDisplayOrientation +/* +** =================================================================== +** Method : GetDisplayOrientation (component GDisplay) +** +** Description : +** Returns the current display orientation +** Parameters : None +** Returns : +** --- - current display orientation +** =================================================================== +*/ + +#define McuGDisplaySSD1306_SetDisplayOrientation McuSSD1306_SetDisplayOrientation +/* +** =================================================================== +** Method : SetDisplayOrientation (component GDisplay) +** +** Description : +** Sets the display orientation. If you enable this method, +** then the orientation of the display can be changed at +** runtime. However, this requires additional resources. +** Parameters : +** NAME - DESCRIPTION +** newOrientation - new orientation to +** be used +** Returns : Nothing +** =================================================================== +*/ + +#define McuGDisplaySSD1306_GetWidth McuSSD1306_GetWidth +/* +** =================================================================== +** Method : GetWidth (component GDisplay) +** +** Description : +** Returns the width of the display in pixels (in x direction) +** Parameters : None +** Returns : +** --- - pixel count +** =================================================================== +*/ + +#define McuGDisplaySSD1306_GetHeight McuSSD1306_GetHeight +/* +** =================================================================== +** Method : GetHeight (component GDisplay) +** +** Description : +** Returns the height of the display in pixels (in y direction) +** Parameters : None +** Returns : +** --- - pixel count +** =================================================================== +*/ + +#define McuGDisplaySSD1306_GetLongerSide McuSSD1306_GetLongerSide +/* +** =================================================================== +** Method : GetLongerSide (component GDisplay) +** +** Description : +** Returns the size of the longer side of the display +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuGDisplaySSD1306_GetShorterSide McuSSD1306_GetShorterSide +/* +** =================================================================== +** Method : GetShorterSide (component GDisplay) +** +** Description : +** Returns the size of the shorter side of the display +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuGDisplaySSD1306_GetDisplay(void); +/* +** =================================================================== +** Method : GetDisplay (component GDisplay) +** +** Description : +** Method used to reserve the display (for mutual exclusive +** access) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuGDisplaySSD1306_GiveDisplay(void); +/* +** =================================================================== +** Method : GiveDisplay (component GDisplay) +** +** Description : +** Returns the display after having it reserved with +** GetDisplay() +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuGDisplaySSD1306_Init(void); +/* +** =================================================================== +** Method : Init (component GDisplay) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuGDisplaySSD1306_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GDisplay) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuGDisplaySSD1306_DrawMonoBitmapMask(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, PIMAGE image, McuGDisplaySSD1306_PixelColor pixelColor); +/* +** =================================================================== +** Method : DrawMonoBitmapMask (component GDisplay) +** +** Description : +** Draws a B/W bitmap, but only the pixels which are set +** Parameters : +** NAME - DESCRIPTION +** x - x position of left upper corner +** y - y position of left upper corner +** image - Pointer to image structure and +** information. +** pixelColor - Color to be used for pixels +** (pixel set) +** Returns : Nothing +** =================================================================== +*/ + +/* END McuGDisplaySSD1306. */ + +#ifdef __cplusplus +} +#endif + +#endif +/* ifndef __McuGDisplaySSD1306_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuGFont.c b/TSM_PicoW_Sensor/McuLib/src/McuGFont.c new file mode 100644 index 0000000..e2ce089 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuGFont.c @@ -0,0 +1,2585 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuGFont.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2023-08-01, 17:07, # CodeGen: 817 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuGFont +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 8 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuGFont_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuGFont_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuGFont_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuGFont_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuGFont_GetLineSpaceHeight(void); +** Deinit - void McuGFont_Deinit(void); +** Init - void McuGFont_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuGFont.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuGFont_module McuGFont module documentation +** @{ +*/ + +/* MODULE McuGFont. */ + +#include "McuGFont.h" + +/* +Copyright 1988 Bitstream, Inc., Cambridge, Massachusetts, USA +Bitstream and Charter are registered trademarks of Bitstream, Inc. +The names "Bitstream" and "Charter" are registered trademarks of +Bitstream, Inc. Permission to use these trademarks is hereby +granted only in association with the images described in this file. +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the name of +Bitstream not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Bitstream makes no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +BITSTREAM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN +NO EVENT SHALL BITSTREAM BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +******************************************************************* +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +******************************************************************* + +(c) Copyright 1989 Sun Microsystems, Inc. Sun design patents +pending in the U.S. and foreign countries. OPEN LOOK is a +trademark of AT&T. Used by written permission of the owners. +(c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +trademark of Bigelow & Holmes. Permission to use the Lucida +trademark is hereby granted only in association with the images +and fonts described in this file. +SUN MICROSYSTEMS, INC., AT&T, AND BIGELOW & HOLMES +MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY OF +THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" +WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. +SUN MICROSYSTEMS, INC., AT&T AND BIGELOW & HOLMES, +SEVERALLY AND INDIVIDUALLY, DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. IN NO EVENT SHALL SUN MICROSYSTEMS, +INC., AT&T OR BIGELOW & HOLMES BE LIABLE FOR ANY +SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. +******************************************************************* +Copyright (c) 1987, 1994 Digital Equipment Corporation +The name "Bitstream" is a registered trademark of Bitstream, Inc. +Permission to use this trademark is hereby granted only in association +with the images described in this file. +The X Consortium, and any party obtaining a copy of these files from +the X Consortium, directly or indirectly, is granted, free of charge, a +full and unrestricted irrevocable, world-wide, paid up, royalty-free, +nonexclusive right and license to deal in this software and +documentation files (the "Software"), including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons who receive +copies from any such party to do so. This license includes without +limitation a license to do the foregoing actions under any patents of +the party supplying this software to the X Consortium. +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. +*/ + + + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#define McuGFont_FBBy 12 + +static const uint8_t helvR08L1_0x00_BMP[] = { + 0xA8, + 0x00, + 0x88, + 0x00, + 0x88, + 0x00, + 0xA8 +}; + +static const uint8_t helvR08L1_0x20_BMP[] = { + 0x00 +}; + +static const uint8_t helvR08L1_0x21_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x00, + 0x80 +}; + +static const uint8_t helvR08L1_0x22_BMP[] = { + 0xA0, + 0xA0 +}; + +static const uint8_t helvR08L1_0x23_BMP[] = { + 0x28, + 0x28, + 0x7C, + 0x28, + 0xF8, + 0x50, + 0x50 +}; + +static const uint8_t helvR08L1_0x24_BMP[] = { + 0x20, + 0x70, + 0xA8, + 0xA0, + 0x70, + 0x28, + 0x28, + 0xA8, + 0x70, + 0x20 +}; + +static const uint8_t helvR08L1_0x25_BMP[] = { + 0x64, + 0x94, + 0x68, + 0x08, + 0x10, + 0x16, + 0x29, + 0x26 +}; + +static const uint8_t helvR08L1_0x26_BMP[] = { + 0x60, + 0x90, + 0x90, + 0x60, + 0x94, + 0x88, + 0x98, + 0x64 +}; + +static const uint8_t helvR08L1_0x27_BMP[] = { + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0x28_BMP[] = { + 0x20, + 0x40, + 0x40, + 0x80, + 0x80, + 0x80, + 0x80, + 0x40, + 0x40, + 0x20 +}; + +static const uint8_t helvR08L1_0x29_BMP[] = { + 0x80, + 0x40, + 0x40, + 0x20, + 0x20, + 0x20, + 0x20, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t helvR08L1_0x2A_BMP[] = { + 0xA0, + 0x40, + 0xA0 +}; + +static const uint8_t helvR08L1_0x2B_BMP[] = { + 0x20, + 0x20, + 0xF8, + 0x20, + 0x20 +}; + +static const uint8_t helvR08L1_0x2C_BMP[] = { + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t helvR08L1_0x2D_BMP[] = { + 0xE0 +}; + +static const uint8_t helvR08L1_0x2E_BMP[] = { + 0x80 +}; + +static const uint8_t helvR08L1_0x2F_BMP[] = { + 0x20, + 0x20, + 0x40, + 0x40, + 0x40, + 0x40, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0x30_BMP[] = { + 0x70, + 0x88, + 0x88, + 0x88, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0x31_BMP[] = { + 0x40, + 0xC0, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR08L1_0x32_BMP[] = { + 0x70, + 0x88, + 0x08, + 0x08, + 0x30, + 0x40, + 0x80, + 0xF8 +}; + +static const uint8_t helvR08L1_0x33_BMP[] = { + 0x70, + 0x88, + 0x08, + 0x30, + 0x08, + 0x08, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0x34_BMP[] = { + 0x10, + 0x30, + 0x50, + 0x50, + 0x90, + 0xF8, + 0x10, + 0x10 +}; + +static const uint8_t helvR08L1_0x35_BMP[] = { + 0x78, + 0x40, + 0x40, + 0x70, + 0x08, + 0x08, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0x36_BMP[] = { + 0x70, + 0x88, + 0x80, + 0xF0, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0x37_BMP[] = { + 0xF8, + 0x08, + 0x10, + 0x20, + 0x20, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR08L1_0x38_BMP[] = { + 0x70, + 0x88, + 0x88, + 0x70, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0x39_BMP[] = { + 0x70, + 0x88, + 0x88, + 0x88, + 0x78, + 0x08, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0x3A_BMP[] = { + 0x80, + 0x00, + 0x00, + 0x00, + 0x00, + 0x80 +}; + +static const uint8_t helvR08L1_0x3B_BMP[] = { + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t helvR08L1_0x3C_BMP[] = { + 0x20, + 0x40, + 0x80, + 0x40, + 0x20 +}; + +static const uint8_t helvR08L1_0x3D_BMP[] = { + 0xF0, + 0x00, + 0xF0 +}; + +static const uint8_t helvR08L1_0x3E_BMP[] = { + 0x80, + 0x40, + 0x20, + 0x40, + 0x80 +}; + +static const uint8_t helvR08L1_0x3F_BMP[] = { + 0x60, + 0x90, + 0x10, + 0x20, + 0x40, + 0x40, + 0x00, + 0x40 +}; + +static const uint8_t helvR08L1_0x40_BMP[] = { + 0x1F, 0x00, + 0x20, 0x80, + 0x4D, 0x40, + 0x92, 0x40, + 0xA2, 0x40, + 0xA4, 0x80, + 0x9B, 0x00, + 0x40, 0x00, + 0x3E, 0x00 +}; + +static const uint8_t helvR08L1_0x41_BMP[] = { + 0x10, + 0x10, + 0x28, + 0x28, + 0x44, + 0x7C, + 0x82, + 0x82 +}; + +static const uint8_t helvR08L1_0x42_BMP[] = { + 0xF0, + 0x88, + 0x88, + 0xF0, + 0x88, + 0x88, + 0x88, + 0xF0 +}; + +static const uint8_t helvR08L1_0x43_BMP[] = { + 0x78, + 0x84, + 0x80, + 0x80, + 0x80, + 0x80, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0x44_BMP[] = { + 0xF0, + 0x88, + 0x84, + 0x84, + 0x84, + 0x84, + 0x88, + 0xF0 +}; + +static const uint8_t helvR08L1_0x45_BMP[] = { + 0xF8, + 0x80, + 0x80, + 0xF8, + 0x80, + 0x80, + 0x80, + 0xF8 +}; + +static const uint8_t helvR08L1_0x46_BMP[] = { + 0xF8, + 0x80, + 0x80, + 0xF0, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0x47_BMP[] = { + 0x78, + 0x84, + 0x80, + 0x80, + 0x8C, + 0x84, + 0x84, + 0x7C +}; + +static const uint8_t helvR08L1_0x48_BMP[] = { + 0x84, + 0x84, + 0x84, + 0xFC, + 0x84, + 0x84, + 0x84, + 0x84 +}; + +static const uint8_t helvR08L1_0x49_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0x4A_BMP[] = { + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x10, + 0x90, + 0x60 +}; + +static const uint8_t helvR08L1_0x4B_BMP[] = { + 0x88, + 0x90, + 0xA0, + 0xE0, + 0x90, + 0x90, + 0x88, + 0x88 +}; + +static const uint8_t helvR08L1_0x4C_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0xF0 +}; + +static const uint8_t helvR08L1_0x4D_BMP[] = { + 0x82, + 0xC6, + 0xC6, + 0xAA, + 0xAA, + 0x92, + 0x92, + 0x92 +}; + +static const uint8_t helvR08L1_0x4E_BMP[] = { + 0xC4, + 0xC4, + 0xA4, + 0xA4, + 0x94, + 0x94, + 0x8C, + 0x8C +}; + +static const uint8_t helvR08L1_0x4F_BMP[] = { + 0x78, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0x50_BMP[] = { + 0xF0, + 0x88, + 0x88, + 0xF0, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0x51_BMP[] = { + 0x78, + 0x84, + 0x84, + 0x84, + 0x84, + 0x94, + 0x8C, + 0x7C, + 0x02 +}; + +static const uint8_t helvR08L1_0x52_BMP[] = { + 0xF0, + 0x88, + 0x88, + 0xF0, + 0x88, + 0x88, + 0x88, + 0x88 +}; + +static const uint8_t helvR08L1_0x53_BMP[] = { + 0x70, + 0x88, + 0x80, + 0x70, + 0x08, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0x54_BMP[] = { + 0xF8, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20, + 0x20 +}; + +static const uint8_t helvR08L1_0x55_BMP[] = { + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0x56_BMP[] = { + 0x82, + 0x82, + 0x44, + 0x44, + 0x44, + 0x28, + 0x28, + 0x10 +}; + +static const uint8_t helvR08L1_0x57_BMP[] = { + 0x88, 0x80, + 0x88, 0x80, + 0x49, 0x00, + 0x49, 0x00, + 0x55, 0x00, + 0x22, 0x00, + 0x22, 0x00, + 0x22, 0x00 +}; + +static const uint8_t helvR08L1_0x58_BMP[] = { + 0x88, + 0x88, + 0x50, + 0x20, + 0x50, + 0x50, + 0x88, + 0x88 +}; + +static const uint8_t helvR08L1_0x59_BMP[] = { + 0x82, + 0x44, + 0x44, + 0x28, + 0x28, + 0x10, + 0x10, + 0x10 +}; + +static const uint8_t helvR08L1_0x5A_BMP[] = { + 0xF8, + 0x08, + 0x10, + 0x20, + 0x20, + 0x40, + 0x80, + 0xF8 +}; + +static const uint8_t helvR08L1_0x5B_BMP[] = { + 0xC0, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0xC0 +}; + +static const uint8_t helvR08L1_0x5C_BMP[] = { + 0x80, + 0x80, + 0x40, + 0x40, + 0x40, + 0x40, + 0x20, + 0x20 +}; + +static const uint8_t helvR08L1_0x5D_BMP[] = { + 0xC0, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0xC0 +}; + +static const uint8_t helvR08L1_0x5E_BMP[] = { + 0x20, + 0x20, + 0x50, + 0x50, + 0x88 +}; + +static const uint8_t helvR08L1_0x5F_BMP[] = { + 0xFC +}; + +static const uint8_t helvR08L1_0x60_BMP[] = { + 0x80, + 0x40 +}; + +static const uint8_t helvR08L1_0x61_BMP[] = { + 0xE0, + 0x10, + 0x70, + 0x90, + 0x90, + 0x68 +}; + +static const uint8_t helvR08L1_0x62_BMP[] = { + 0x80, + 0x80, + 0xB0, + 0xC8, + 0x88, + 0x88, + 0xC8, + 0xB0 +}; + +static const uint8_t helvR08L1_0x63_BMP[] = { + 0x60, + 0x90, + 0x80, + 0x80, + 0x90, + 0x60 +}; + +static const uint8_t helvR08L1_0x64_BMP[] = { + 0x08, + 0x08, + 0x68, + 0x98, + 0x88, + 0x88, + 0x98, + 0x68 +}; + +static const uint8_t helvR08L1_0x65_BMP[] = { + 0x60, + 0x90, + 0xF0, + 0x80, + 0x90, + 0x60 +}; + +static const uint8_t helvR08L1_0x66_BMP[] = { + 0x30, + 0x40, + 0xE0, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR08L1_0x67_BMP[] = { + 0x68, + 0x98, + 0x88, + 0x88, + 0x98, + 0x68, + 0x08, + 0x70 +}; + +static const uint8_t helvR08L1_0x68_BMP[] = { + 0x80, + 0x80, + 0xB0, + 0xC8, + 0x88, + 0x88, + 0x88, + 0x88 +}; + +static const uint8_t helvR08L1_0x69_BMP[] = { + 0x80, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0x6A_BMP[] = { + 0x40, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t helvR08L1_0x6B_BMP[] = { + 0x80, + 0x80, + 0x90, + 0xA0, + 0xC0, + 0xA0, + 0x90, + 0x90 +}; + +static const uint8_t helvR08L1_0x6C_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0x6D_BMP[] = { + 0xEC, + 0x92, + 0x92, + 0x92, + 0x92, + 0x92 +}; + +static const uint8_t helvR08L1_0x6E_BMP[] = { + 0xB0, + 0xC8, + 0x88, + 0x88, + 0x88, + 0x88 +}; + +static const uint8_t helvR08L1_0x6F_BMP[] = { + 0x70, + 0x88, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0x70_BMP[] = { + 0xB0, + 0xC8, + 0x88, + 0x88, + 0xC8, + 0xB0, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0x71_BMP[] = { + 0x68, + 0x98, + 0x88, + 0x88, + 0x98, + 0x68, + 0x08, + 0x08 +}; + +static const uint8_t helvR08L1_0x72_BMP[] = { + 0xA0, + 0xC0, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0x73_BMP[] = { + 0x60, + 0x90, + 0x60, + 0x10, + 0x90, + 0x60 +}; + +static const uint8_t helvR08L1_0x74_BMP[] = { + 0x40, + 0x40, + 0xE0, + 0x40, + 0x40, + 0x40, + 0x40, + 0x60 +}; + +static const uint8_t helvR08L1_0x75_BMP[] = { + 0x90, + 0x90, + 0x90, + 0x90, + 0x90, + 0x70 +}; + +static const uint8_t helvR08L1_0x76_BMP[] = { + 0x88, + 0x88, + 0x50, + 0x50, + 0x20, + 0x20 +}; + +static const uint8_t helvR08L1_0x77_BMP[] = { + 0x92, + 0x92, + 0x54, + 0x54, + 0x28, + 0x28 +}; + +static const uint8_t helvR08L1_0x78_BMP[] = { + 0x88, + 0x50, + 0x20, + 0x50, + 0x88, + 0x88 +}; + +static const uint8_t helvR08L1_0x79_BMP[] = { + 0x48, + 0x48, + 0x50, + 0x50, + 0x30, + 0x20, + 0x20, + 0xC0 +}; + +static const uint8_t helvR08L1_0x7A_BMP[] = { + 0xF0, + 0x10, + 0x20, + 0x40, + 0x80, + 0xF0 +}; + +static const uint8_t helvR08L1_0x7B_BMP[] = { + 0x20, + 0x40, + 0x40, + 0x40, + 0x80, + 0x40, + 0x40, + 0x40, + 0x40, + 0x20 +}; + +static const uint8_t helvR08L1_0x7C_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0x7D_BMP[] = { + 0x80, + 0x40, + 0x40, + 0x40, + 0x20, + 0x40, + 0x40, + 0x40, + 0x40, + 0x80 +}; + +static const uint8_t helvR08L1_0x7E_BMP[] = { + 0x64, + 0x98 +}; + +static const uint8_t helvR08L1_0xA0_BMP[] = { + 0x00 +}; + +static const uint8_t helvR08L1_0xA1_BMP[] = { + 0x80, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0xA2_BMP[] = { + 0x10, + 0x70, + 0xA8, + 0xA0, + 0xA0, + 0xA8, + 0x70, + 0x40 +}; + +static const uint8_t helvR08L1_0xA3_BMP[] = { + 0x30, + 0x48, + 0x40, + 0xE0, + 0x40, + 0x40, + 0x48, + 0xB0 +}; + +static const uint8_t helvR08L1_0xA4_BMP[] = { + 0x90, + 0x60, + 0x90, + 0x90, + 0x60, + 0x90 +}; + +static const uint8_t helvR08L1_0xA5_BMP[] = { + 0x88, + 0x88, + 0x88, + 0x50, + 0xF8, + 0x20, + 0xF8, + 0x20 +}; + +static const uint8_t helvR08L1_0xA6_BMP[] = { + 0x80, + 0x80, + 0x80, + 0x80, + 0x00, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0xA7_BMP[] = { + 0x70, + 0x88, + 0xC0, + 0x70, + 0x98, + 0xC8, + 0x70, + 0x18, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0xA8_BMP[] = { + 0xA0 +}; + +static const uint8_t helvR08L1_0xA9_BMP[] = { + 0x38, + 0x44, + 0x9A, + 0xA2, + 0x9A, + 0x44, + 0x38 +}; + +static const uint8_t helvR08L1_0xAA_BMP[] = { + 0xE0, + 0x20, + 0xA0, + 0x00, + 0xE0 +}; + +static const uint8_t helvR08L1_0xAB_BMP[] = { + 0x28, + 0x50, + 0xA0, + 0x50, + 0x28 +}; + +static const uint8_t helvR08L1_0xAC_BMP[] = { + 0xF8, + 0x08, + 0x08 +}; + +static const uint8_t helvR08L1_0xAD_BMP[] = { + 0xE0 +}; + +static const uint8_t helvR08L1_0xAE_BMP[] = { + 0x38, + 0x44, + 0xBA, + 0xB2, + 0xAA, + 0x44, + 0x38 +}; + +static const uint8_t helvR08L1_0xAF_BMP[] = { + 0xE0 +}; + +static const uint8_t helvR08L1_0xB0_BMP[] = { + 0x60, + 0x90, + 0x90, + 0x60 +}; + +static const uint8_t helvR08L1_0xB1_BMP[] = { + 0x20, + 0x20, + 0xF8, + 0x20, + 0x20, + 0x00, + 0xF8 +}; + +static const uint8_t helvR08L1_0xB2_BMP[] = { + 0x60, + 0xA0, + 0x40, + 0xE0 +}; + +static const uint8_t helvR08L1_0xB3_BMP[] = { + 0xE0, + 0x40, + 0x20, + 0xC0 +}; + +static const uint8_t helvR08L1_0xB4_BMP[] = { + 0x40, + 0x80 +}; + +static const uint8_t helvR08L1_0xB5_BMP[] = { + 0x90, + 0x90, + 0x90, + 0x90, + 0x90, + 0xF0, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0xB6_BMP[] = { + 0x7C, + 0xE8, + 0xE8, + 0xE8, + 0x68, + 0x28, + 0x28, + 0x28, + 0x28, + 0x28 +}; + +static const uint8_t helvR08L1_0xB7_BMP[] = { + 0xC0 +}; + +static const uint8_t helvR08L1_0xB8_BMP[] = { + 0x40, + 0xC0 +}; + +static const uint8_t helvR08L1_0xB9_BMP[] = { + 0x40, + 0xC0, + 0x40, + 0x40 +}; + +static const uint8_t helvR08L1_0xBA_BMP[] = { + 0xE0, + 0xA0, + 0xE0, + 0x00, + 0xE0 +}; + +static const uint8_t helvR08L1_0xBB_BMP[] = { + 0xA0, + 0x50, + 0x28, + 0x50, + 0xA0 +}; + +static const uint8_t helvR08L1_0xBC_BMP[] = { + 0x44, 0x00, + 0xC4, 0x00, + 0x48, 0x00, + 0x48, 0x00, + 0x11, 0x00, + 0x13, 0x00, + 0x27, 0x80, + 0x21, 0x00 +}; + +static const uint8_t helvR08L1_0xBD_BMP[] = { + 0x44, + 0xC4, + 0x48, + 0x48, + 0x13, + 0x15, + 0x22, + 0x27 +}; + +static const uint8_t helvR08L1_0xBE_BMP[] = { + 0xE0, 0x00, + 0x44, 0x00, + 0x24, 0x00, + 0xC8, 0x00, + 0x09, 0x00, + 0x13, 0x00, + 0x17, 0x80, + 0x21, 0x00 +}; + +static const uint8_t helvR08L1_0xBF_BMP[] = { + 0x20, + 0x00, + 0x20, + 0x20, + 0x40, + 0x80, + 0x90, + 0x60 +}; + +static const uint8_t helvR08L1_0xC0_BMP[] = { + 0x20, + 0x10, + 0x00, + 0x10, + 0x10, + 0x28, + 0x28, + 0x44, + 0x7C, + 0x82, + 0x82 +}; + +static const uint8_t helvR08L1_0xC1_BMP[] = { + 0x08, + 0x10, + 0x00, + 0x10, + 0x10, + 0x28, + 0x28, + 0x44, + 0x7C, + 0x82, + 0x82 +}; + +static const uint8_t helvR08L1_0xC2_BMP[] = { + 0x10, + 0x28, + 0x00, + 0x10, + 0x10, + 0x28, + 0x28, + 0x44, + 0x7C, + 0x82, + 0x82 +}; + +static const uint8_t helvR08L1_0xC3_BMP[] = { + 0x14, + 0x28, + 0x00, + 0x10, + 0x10, + 0x28, + 0x28, + 0x44, + 0x7C, + 0x82, + 0x82 +}; + +static const uint8_t helvR08L1_0xC4_BMP[] = { + 0x28, + 0x00, + 0x10, + 0x10, + 0x28, + 0x28, + 0x44, + 0x7C, + 0x82, + 0x82 +}; + +static const uint8_t helvR08L1_0xC5_BMP[] = { + 0x10, + 0x28, + 0x10, + 0x10, + 0x10, + 0x28, + 0x28, + 0x44, + 0x7C, + 0x82, + 0x82 +}; + +static const uint8_t helvR08L1_0xC6_BMP[] = { + 0x1F, 0x80, + 0x18, 0x00, + 0x28, 0x00, + 0x2F, 0x80, + 0x48, 0x00, + 0x78, 0x00, + 0x88, 0x00, + 0x8F, 0x80 +}; + +static const uint8_t helvR08L1_0xC7_BMP[] = { + 0x78, + 0x84, + 0x80, + 0x80, + 0x80, + 0x80, + 0x84, + 0x78, + 0x10, + 0x30 +}; + +static const uint8_t helvR08L1_0xC8_BMP[] = { + 0x40, + 0x20, + 0x00, + 0xF8, + 0x80, + 0x80, + 0xF8, + 0x80, + 0x80, + 0x80, + 0xF8 +}; + +static const uint8_t helvR08L1_0xC9_BMP[] = { + 0x10, + 0x20, + 0x00, + 0xF8, + 0x80, + 0x80, + 0xF8, + 0x80, + 0x80, + 0x80, + 0xF8 +}; + +static const uint8_t helvR08L1_0xCA_BMP[] = { + 0x20, + 0x50, + 0x00, + 0xF8, + 0x80, + 0x80, + 0xF8, + 0x80, + 0x80, + 0x80, + 0xF8 +}; + +static const uint8_t helvR08L1_0xCB_BMP[] = { + 0x50, + 0x00, + 0xF8, + 0x80, + 0x80, + 0xF8, + 0x80, + 0x80, + 0x80, + 0xF8 +}; + +static const uint8_t helvR08L1_0xCC_BMP[] = { + 0x80, + 0x40, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR08L1_0xCD_BMP[] = { + 0x40, + 0x80, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0xCE_BMP[] = { + 0x40, + 0xA0, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR08L1_0xCF_BMP[] = { + 0xA0, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR08L1_0xD0_BMP[] = { + 0x78, + 0x44, + 0x42, + 0xF2, + 0x42, + 0x42, + 0x44, + 0x78 +}; + +static const uint8_t helvR08L1_0xD1_BMP[] = { + 0x28, + 0x50, + 0x00, + 0xC4, + 0xC4, + 0xA4, + 0xA4, + 0x94, + 0x94, + 0x8C, + 0x8C +}; + +static const uint8_t helvR08L1_0xD2_BMP[] = { + 0x20, + 0x10, + 0x00, + 0x78, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0xD3_BMP[] = { + 0x08, + 0x10, + 0x00, + 0x78, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0xD4_BMP[] = { + 0x20, + 0x50, + 0x00, + 0x78, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0xD5_BMP[] = { + 0x28, + 0x50, + 0x00, + 0x78, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0xD6_BMP[] = { + 0x48, + 0x00, + 0x78, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0xD7_BMP[] = { + 0x88, + 0x50, + 0x20, + 0x50, + 0x88 +}; + +static const uint8_t helvR08L1_0xD8_BMP[] = { + 0x04, + 0x78, + 0x8C, + 0x94, + 0x94, + 0xA4, + 0xA4, + 0xC4, + 0x78, + 0x80 +}; + +static const uint8_t helvR08L1_0xD9_BMP[] = { + 0x20, + 0x10, + 0x00, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0xDA_BMP[] = { + 0x08, + 0x10, + 0x00, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0xDB_BMP[] = { + 0x20, + 0x50, + 0x00, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0xDC_BMP[] = { + 0x48, + 0x00, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x84, + 0x78 +}; + +static const uint8_t helvR08L1_0xDD_BMP[] = { + 0x08, + 0x10, + 0x00, + 0x82, + 0x44, + 0x44, + 0x28, + 0x28, + 0x10, + 0x10, + 0x10 +}; + +static const uint8_t helvR08L1_0xDE_BMP[] = { + 0x80, + 0x80, + 0xF0, + 0x88, + 0x88, + 0xF0, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0xDF_BMP[] = { + 0x60, + 0x90, + 0x90, + 0xA0, + 0x90, + 0x90, + 0x90, + 0xA0 +}; + +static const uint8_t helvR08L1_0xE0_BMP[] = { + 0x40, + 0x20, + 0x00, + 0xE0, + 0x10, + 0x70, + 0x90, + 0x90, + 0x68 +}; + +static const uint8_t helvR08L1_0xE1_BMP[] = { + 0x20, + 0x40, + 0x00, + 0xE0, + 0x10, + 0x70, + 0x90, + 0x90, + 0x68 +}; + +static const uint8_t helvR08L1_0xE2_BMP[] = { + 0x20, + 0x50, + 0x00, + 0xE0, + 0x10, + 0x70, + 0x90, + 0x90, + 0x68 +}; + +static const uint8_t helvR08L1_0xE3_BMP[] = { + 0x50, + 0xA0, + 0x00, + 0xE0, + 0x10, + 0x70, + 0x90, + 0x90, + 0x68 +}; + +static const uint8_t helvR08L1_0xE4_BMP[] = { + 0x50, + 0x00, + 0xE0, + 0x10, + 0x70, + 0x90, + 0x90, + 0x68 +}; + +static const uint8_t helvR08L1_0xE5_BMP[] = { + 0x20, + 0x50, + 0x20, + 0xE0, + 0x10, + 0x70, + 0x90, + 0x90, + 0x68 +}; + +static const uint8_t helvR08L1_0xE6_BMP[] = { + 0xEC, + 0x12, + 0x7E, + 0x90, + 0x92, + 0x6C +}; + +static const uint8_t helvR08L1_0xE7_BMP[] = { + 0x60, + 0x90, + 0x80, + 0x80, + 0x90, + 0x60, + 0x20, + 0x60 +}; + +static const uint8_t helvR08L1_0xE8_BMP[] = { + 0x40, + 0x20, + 0x00, + 0x60, + 0x90, + 0xF0, + 0x80, + 0x90, + 0x60 +}; + +static const uint8_t helvR08L1_0xE9_BMP[] = { + 0x20, + 0x40, + 0x00, + 0x60, + 0x90, + 0xF0, + 0x80, + 0x90, + 0x60 +}; + +static const uint8_t helvR08L1_0xEA_BMP[] = { + 0x40, + 0xA0, + 0x00, + 0x60, + 0x90, + 0xF0, + 0x80, + 0x90, + 0x60 +}; + +static const uint8_t helvR08L1_0xEB_BMP[] = { + 0xA0, + 0x00, + 0x60, + 0x90, + 0xF0, + 0x80, + 0x90, + 0x60 +}; + +static const uint8_t helvR08L1_0xEC_BMP[] = { + 0x80, + 0x40, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR08L1_0xED_BMP[] = { + 0x40, + 0x80, + 0x00, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0xEE_BMP[] = { + 0x40, + 0xA0, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR08L1_0xEF_BMP[] = { + 0xA0, + 0x00, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40 +}; + +static const uint8_t helvR08L1_0xF0_BMP[] = { + 0x40, + 0x78, + 0x90, + 0x78, + 0x88, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0xF1_BMP[] = { + 0x50, + 0xA0, + 0x00, + 0xE0, + 0x90, + 0x90, + 0x90, + 0x90, + 0x90 +}; + +static const uint8_t helvR08L1_0xF2_BMP[] = { + 0x40, + 0x20, + 0x00, + 0x70, + 0x88, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0xF3_BMP[] = { + 0x10, + 0x20, + 0x00, + 0x70, + 0x88, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0xF4_BMP[] = { + 0x20, + 0x50, + 0x00, + 0x70, + 0x88, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0xF5_BMP[] = { + 0x28, + 0x50, + 0x00, + 0x70, + 0x88, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0xF6_BMP[] = { + 0x50, + 0x00, + 0x70, + 0x88, + 0x88, + 0x88, + 0x88, + 0x70 +}; + +static const uint8_t helvR08L1_0xF7_BMP[] = { + 0x20, + 0x00, + 0xF8, + 0x00, + 0x20 +}; + +static const uint8_t helvR08L1_0xF8_BMP[] = { + 0x3A, + 0x4C, + 0x54, + 0x64, + 0x44, + 0xB8 +}; + +static const uint8_t helvR08L1_0xF9_BMP[] = { + 0x40, + 0x20, + 0x00, + 0x90, + 0x90, + 0x90, + 0x90, + 0x90, + 0x70 +}; + +static const uint8_t helvR08L1_0xFA_BMP[] = { + 0x10, + 0x20, + 0x00, + 0x90, + 0x90, + 0x90, + 0x90, + 0x90, + 0x70 +}; + +static const uint8_t helvR08L1_0xFB_BMP[] = { + 0x40, + 0xA0, + 0x00, + 0x90, + 0x90, + 0x90, + 0x90, + 0x90, + 0x70 +}; + +static const uint8_t helvR08L1_0xFC_BMP[] = { + 0xA0, + 0x00, + 0x90, + 0x90, + 0x90, + 0x90, + 0x90, + 0x70 +}; + +static const uint8_t helvR08L1_0xFD_BMP[] = { + 0x08, + 0x10, + 0x00, + 0x48, + 0x48, + 0x50, + 0x50, + 0x30, + 0x20, + 0x20, + 0xC0 +}; + +static const uint8_t helvR08L1_0xFE_BMP[] = { + 0x80, + 0x80, + 0xB0, + 0xC8, + 0x88, + 0x88, + 0xC8, + 0xB0, + 0x80, + 0x80 +}; + +static const uint8_t helvR08L1_0xFF_BMP[] = { + 0x50, + 0x00, + 0x48, + 0x48, + 0x50, + 0x50, + 0x30, + 0x20, + 0x20, + 0xC0 +}; + +static const GFONT_CharInfo FontBMP[] = { + {8, 5, 7, 1, 0, helvR08L1_0x00_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {3, 1, 1, 0, 0, helvR08L1_0x20_BMP}, + {3, 1, 8, 1, 0, helvR08L1_0x21_BMP}, + {4, 3, 2, 1, 6, helvR08L1_0x22_BMP}, + {6, 6, 7, 0, 0, helvR08L1_0x23_BMP}, + {6, 5, 10, 0, -1, helvR08L1_0x24_BMP}, + {9, 8, 8, 0, 0, helvR08L1_0x25_BMP}, + {8, 6, 8, 1, 0, helvR08L1_0x26_BMP}, + {2, 1, 2, 0, 6, helvR08L1_0x27_BMP}, + {4, 3, 10, 0, -2, helvR08L1_0x28_BMP}, + {4, 3, 10, 1, -2, helvR08L1_0x29_BMP}, + {4, 3, 3, 0, 5, helvR08L1_0x2A_BMP}, + {6, 5, 5, 0, 1, helvR08L1_0x2B_BMP}, + {3, 2, 3, 0, -2, helvR08L1_0x2C_BMP}, + {4, 3, 1, 0, 3, helvR08L1_0x2D_BMP}, + {3, 1, 1, 1, 0, helvR08L1_0x2E_BMP}, + {3, 3, 8, 0, 0, helvR08L1_0x2F_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x30_BMP}, + {6, 2, 8, 1, 0, helvR08L1_0x31_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x32_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x33_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x34_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x35_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x36_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x37_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x38_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x39_BMP}, + {3, 1, 6, 1, 0, helvR08L1_0x3A_BMP}, + {3, 2, 8, 0, -2, helvR08L1_0x3B_BMP}, + {6, 3, 5, 1, 1, helvR08L1_0x3C_BMP}, + {5, 4, 3, 0, 2, helvR08L1_0x3D_BMP}, + {6, 3, 5, 1, 1, helvR08L1_0x3E_BMP}, + {6, 4, 8, 1, 0, helvR08L1_0x3F_BMP}, + {11, 10, 9, 0, -1, helvR08L1_0x40_BMP}, + {7, 7, 8, 0, 0, helvR08L1_0x41_BMP}, + {7, 5, 8, 1, 0, helvR08L1_0x42_BMP}, + {8, 6, 8, 1, 0, helvR08L1_0x43_BMP}, + {8, 6, 8, 1, 0, helvR08L1_0x44_BMP}, + {7, 5, 8, 1, 0, helvR08L1_0x45_BMP}, + {6, 5, 8, 1, 0, helvR08L1_0x46_BMP}, + {8, 6, 8, 1, 0, helvR08L1_0x47_BMP}, + {8, 6, 8, 1, 0, helvR08L1_0x48_BMP}, + {3, 1, 8, 1, 0, helvR08L1_0x49_BMP}, + {5, 4, 8, 0, 0, helvR08L1_0x4A_BMP}, + {7, 5, 8, 1, 0, helvR08L1_0x4B_BMP}, + {6, 4, 8, 1, 0, helvR08L1_0x4C_BMP}, + {9, 7, 8, 1, 0, helvR08L1_0x4D_BMP}, + {8, 6, 8, 1, 0, helvR08L1_0x4E_BMP}, + {8, 6, 8, 1, 0, helvR08L1_0x4F_BMP}, + {7, 5, 8, 1, 0, helvR08L1_0x50_BMP}, + {8, 7, 9, 1, -1, helvR08L1_0x51_BMP}, + {7, 5, 8, 1, 0, helvR08L1_0x52_BMP}, + {7, 5, 8, 1, 0, helvR08L1_0x53_BMP}, + {5, 5, 8, 0, 0, helvR08L1_0x54_BMP}, + {8, 6, 8, 1, 0, helvR08L1_0x55_BMP}, + {7, 7, 8, 0, 0, helvR08L1_0x56_BMP}, + {9, 9, 8, 0, 0, helvR08L1_0x57_BMP}, + {7, 5, 8, 1, 0, helvR08L1_0x58_BMP}, + {7, 7, 8, 0, 0, helvR08L1_0x59_BMP}, + {7, 5, 8, 1, 0, helvR08L1_0x5A_BMP}, + {3, 2, 10, 1, -2, helvR08L1_0x5B_BMP}, + {3, 3, 8, 0, 0, helvR08L1_0x5C_BMP}, + {3, 2, 10, 0, -2, helvR08L1_0x5D_BMP}, + {6, 5, 5, 0, 3, helvR08L1_0x5E_BMP}, + {6, 6, 1, 0, -2, helvR08L1_0x5F_BMP}, + {3, 2, 2, 0, 7, helvR08L1_0x60_BMP}, + {5, 5, 6, 0, 0, helvR08L1_0x61_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x62_BMP}, + {5, 4, 6, 0, 0, helvR08L1_0x63_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x64_BMP}, + {5, 4, 6, 0, 0, helvR08L1_0x65_BMP}, + {4, 4, 8, 0, 0, helvR08L1_0x66_BMP}, + {6, 5, 8, 0, -2, helvR08L1_0x67_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0x68_BMP}, + {2, 1, 8, 0, 0, helvR08L1_0x69_BMP}, + {2, 2, 10, -1, -2, helvR08L1_0x6A_BMP}, + {5, 4, 8, 0, 0, helvR08L1_0x6B_BMP}, + {2, 1, 8, 0, 0, helvR08L1_0x6C_BMP}, + {8, 7, 6, 0, 0, helvR08L1_0x6D_BMP}, + {6, 5, 6, 0, 0, helvR08L1_0x6E_BMP}, + {6, 5, 6, 0, 0, helvR08L1_0x6F_BMP}, + {6, 5, 8, 0, -2, helvR08L1_0x70_BMP}, + {6, 5, 8, 0, -2, helvR08L1_0x71_BMP}, + {4, 3, 6, 0, 0, helvR08L1_0x72_BMP}, + {5, 4, 6, 0, 0, helvR08L1_0x73_BMP}, + {4, 3, 8, 0, 0, helvR08L1_0x74_BMP}, + {5, 4, 6, 0, 0, helvR08L1_0x75_BMP}, + {6, 5, 6, 0, 0, helvR08L1_0x76_BMP}, + {8, 7, 6, 0, 0, helvR08L1_0x77_BMP}, + {6, 5, 6, 0, 0, helvR08L1_0x78_BMP}, + {5, 5, 8, -1, -2, helvR08L1_0x79_BMP}, + {5, 4, 6, 0, 0, helvR08L1_0x7A_BMP}, + {3, 3, 10, 0, -2, helvR08L1_0x7B_BMP}, + {3, 1, 10, 1, -2, helvR08L1_0x7C_BMP}, + {3, 3, 10, 0, -2, helvR08L1_0x7D_BMP}, + {7, 6, 2, 0, 3, helvR08L1_0x7E_BMP}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {0, 0, 0, 0, 0, (PConstByte)NULL}, + {3, 1, 1, 0, 0, helvR08L1_0xA0_BMP}, + {3, 1, 8, 1, -2, helvR08L1_0xA1_BMP}, + {6, 5, 8, 1, -1, helvR08L1_0xA2_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0xA3_BMP}, + {5, 4, 6, 0, 1, helvR08L1_0xA4_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0xA5_BMP}, + {3, 1, 10, 1, -2, helvR08L1_0xA6_BMP}, + {6, 5, 10, 0, -2, helvR08L1_0xA7_BMP}, + {3, 3, 1, 0, 7, helvR08L1_0xA8_BMP}, + {9, 7, 7, 1, 0, helvR08L1_0xA9_BMP}, + {4, 3, 5, 0, 3, helvR08L1_0xAA_BMP}, + {6, 5, 5, 0, 0, helvR08L1_0xAB_BMP}, + {7, 5, 3, 1, 2, helvR08L1_0xAC_BMP}, + {4, 3, 1, 0, 3, helvR08L1_0xAD_BMP}, + {9, 7, 7, 1, 0, helvR08L1_0xAE_BMP}, + {3, 3, 1, 0, 7, helvR08L1_0xAF_BMP}, + {4, 4, 4, 0, 4, helvR08L1_0xB0_BMP}, + {6, 5, 7, 0, 0, helvR08L1_0xB1_BMP}, + {3, 3, 4, 0, 4, helvR08L1_0xB2_BMP}, + {3, 3, 4, 0, 4, helvR08L1_0xB3_BMP}, + {3, 2, 2, 0, 7, helvR08L1_0xB4_BMP}, + {5, 4, 8, 0, -2, helvR08L1_0xB5_BMP}, + {6, 6, 10, 0, -2, helvR08L1_0xB6_BMP}, + {3, 2, 1, 0, 3, helvR08L1_0xB7_BMP}, + {3, 2, 2, 0, -2, helvR08L1_0xB8_BMP}, + {3, 2, 4, 0, 4, helvR08L1_0xB9_BMP}, + {4, 3, 5, 0, 3, helvR08L1_0xBA_BMP}, + {6, 5, 5, 0, 0, helvR08L1_0xBB_BMP}, + {9, 9, 8, 0, 0, helvR08L1_0xBC_BMP}, + {9, 8, 8, 0, 0, helvR08L1_0xBD_BMP}, + {9, 9, 8, 0, 0, helvR08L1_0xBE_BMP}, + {6, 4, 8, 1, -2, helvR08L1_0xBF_BMP}, + {7, 7, 11, 0, 0, helvR08L1_0xC0_BMP}, + {7, 7, 11, 0, 0, helvR08L1_0xC1_BMP}, + {7, 7, 11, 0, 0, helvR08L1_0xC2_BMP}, + {7, 7, 11, 0, 0, helvR08L1_0xC3_BMP}, + {7, 7, 10, 0, 0, helvR08L1_0xC4_BMP}, + {7, 7, 11, 0, 0, helvR08L1_0xC5_BMP}, + {10, 9, 8, 0, 0, helvR08L1_0xC6_BMP}, + {8, 6, 10, 1, -2, helvR08L1_0xC7_BMP}, + {7, 5, 11, 1, 0, helvR08L1_0xC8_BMP}, + {7, 5, 11, 1, 0, helvR08L1_0xC9_BMP}, + {7, 5, 11, 1, 0, helvR08L1_0xCA_BMP}, + {7, 5, 10, 1, 0, helvR08L1_0xCB_BMP}, + {3, 2, 11, 0, 0, helvR08L1_0xCC_BMP}, + {3, 2, 11, 1, 0, helvR08L1_0xCD_BMP}, + {3, 3, 11, 0, 0, helvR08L1_0xCE_BMP}, + {3, 3, 10, 0, 0, helvR08L1_0xCF_BMP}, + {8, 7, 8, 0, 0, helvR08L1_0xD0_BMP}, + {8, 6, 11, 1, 0, helvR08L1_0xD1_BMP}, + {8, 6, 11, 1, 0, helvR08L1_0xD2_BMP}, + {8, 6, 11, 1, 0, helvR08L1_0xD3_BMP}, + {8, 6, 11, 1, 0, helvR08L1_0xD4_BMP}, + {8, 6, 11, 1, 0, helvR08L1_0xD5_BMP}, + {8, 6, 10, 1, 0, helvR08L1_0xD6_BMP}, + {6, 5, 5, 0, 1, helvR08L1_0xD7_BMP}, + {8, 6, 10, 1, -1, helvR08L1_0xD8_BMP}, + {8, 6, 11, 1, 0, helvR08L1_0xD9_BMP}, + {8, 6, 11, 1, 0, helvR08L1_0xDA_BMP}, + {8, 6, 11, 1, 0, helvR08L1_0xDB_BMP}, + {8, 6, 10, 1, 0, helvR08L1_0xDC_BMP}, + {7, 7, 11, 0, 0, helvR08L1_0xDD_BMP}, + {7, 5, 8, 1, 0, helvR08L1_0xDE_BMP}, + {5, 4, 8, 0, 0, helvR08L1_0xDF_BMP}, + {5, 5, 9, 0, 0, helvR08L1_0xE0_BMP}, + {5, 5, 9, 0, 0, helvR08L1_0xE1_BMP}, + {5, 5, 9, 0, 0, helvR08L1_0xE2_BMP}, + {5, 5, 9, 0, 0, helvR08L1_0xE3_BMP}, + {5, 5, 8, 0, 0, helvR08L1_0xE4_BMP}, + {5, 5, 9, 0, 0, helvR08L1_0xE5_BMP}, + {8, 7, 6, 0, 0, helvR08L1_0xE6_BMP}, + {5, 4, 8, 0, -2, helvR08L1_0xE7_BMP}, + {5, 4, 9, 0, 0, helvR08L1_0xE8_BMP}, + {5, 4, 9, 0, 0, helvR08L1_0xE9_BMP}, + {5, 4, 9, 0, 0, helvR08L1_0xEA_BMP}, + {5, 4, 8, 0, 0, helvR08L1_0xEB_BMP}, + {2, 2, 9, -1, 0, helvR08L1_0xEC_BMP}, + {2, 2, 9, 0, 0, helvR08L1_0xED_BMP}, + {2, 3, 9, -1, 0, helvR08L1_0xEE_BMP}, + {2, 3, 8, -1, 0, helvR08L1_0xEF_BMP}, + {6, 5, 9, 0, 0, helvR08L1_0xF0_BMP}, + {5, 4, 9, 0, 0, helvR08L1_0xF1_BMP}, + {6, 5, 9, 0, 0, helvR08L1_0xF2_BMP}, + {6, 5, 9, 0, 0, helvR08L1_0xF3_BMP}, + {6, 5, 9, 0, 0, helvR08L1_0xF4_BMP}, + {6, 5, 9, 0, 0, helvR08L1_0xF5_BMP}, + {6, 5, 8, 0, 0, helvR08L1_0xF6_BMP}, + {6, 5, 5, 0, 1, helvR08L1_0xF7_BMP}, + {6, 7, 6, -1, 0, helvR08L1_0xF8_BMP}, + {5, 4, 9, 0, 0, helvR08L1_0xF9_BMP}, + {5, 4, 9, 0, 0, helvR08L1_0xFA_BMP}, + {5, 4, 9, 0, 0, helvR08L1_0xFB_BMP}, + {5, 4, 8, 0, 0, helvR08L1_0xFC_BMP}, + {5, 5, 11, -1, -2, helvR08L1_0xFD_BMP}, + {6, 5, 10, 0, -2, helvR08L1_0xFE_BMP}, + {5, 5, 10, -1, -2, helvR08L1_0xFF_BMP} +}; + + +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ +PGFONT_CharInfo McuGFont_GetFontChar(uint8_t ch) +{ + return (PGFONT_CharInfo)&FontBMP[ch]; +} + +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ +uint8_t McuGFont_GetBoxHeight(void) +{ + /* needs to be a function as this method is used as a callback (function pointer) */ + return McuGFont_FBBy; +} + +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ +PGFONT_Callbacks McuGFont_GetFont(void) +{ + static const GFONT_Callbacks callbacks = { + McuGFont_GetFontChar, + McuGFont_FBBy, + McuGFont_GetUnderlineBoxHeight(), + McuGFont_GetLineSpaceHeight() + }; + return (PGFONT_Callbacks)&callbacks; +} + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuGFont_GetUnderlineBoxHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +uint8_t McuGFont_GetLineSpaceHeight(void) +{ + *** function is implemented as a macro +} +*/ + +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuGFont_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuGFont_Init(void) +{ + /* nothing needed */ +} + +/* END McuGFont. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuGFont.h b/TSM_PicoW_Sensor/McuLib/src/McuGFont.h new file mode 100644 index 0000000..1cc4c01 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuGFont.h @@ -0,0 +1,218 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuGFont.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GFont +** Version : Component 01.131, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** Driver for graphical fonts +** Settings : +** Component name : McuGFont +** SDK : McuLib +** Overwrite Bounding Box Height : Disabled +** Name : Helv +** Size : 8 +** Style : normal +** Contents : +** GetFontChar - PGFONT_CharInfo McuGFont_GetFontChar(uint8_t ch); +** GetBoxHeight - uint8_t McuGFont_GetBoxHeight(void); +** GetFont - PGFONT_Callbacks McuGFont_GetFont(void); +** GetUnderlineBoxHeight - uint8_t McuGFont_GetUnderlineBoxHeight(void); +** GetLineSpaceHeight - uint8_t McuGFont_GetLineSpaceHeight(void); +** Deinit - void McuGFont_Deinit(void); +** Init - void McuGFont_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuGFont.h +** @version 01.00 +** @brief +** Driver for graphical fonts +*/ +/*! +** @addtogroup McuGFont_module McuGFont module documentation +** @{ +*/ + + +#ifndef __McuGFont_H +#define __McuGFont_H + +/* MODULE McuGFont. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuGFontconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + +#ifndef __BWUserType_PConstByte +#define __BWUserType_PConstByte + typedef const uint8_t *PConstByte; /* Pointer to a constant byte. */ +#endif +#ifndef __BWUserType_GFONT_CharInfo +#define __BWUserType_GFONT_CharInfo + typedef struct { /* A descriptor describing the font. */ + int8_t dwidth; /* position of next char. relative to the current */ + uint8_t width; /* width of character in pixels */ + uint8_t height; /* height of character in pixels */ + int8_t offsetX; /* horizontal offset to left edge of bounding box */ + int8_t offsetY; /* vertical offset to bottom edge of bounding box */ + PConstByte CharBMP; /* pointer to character bitmap defined above */ + } GFONT_CharInfo; +#endif +#ifndef __BWUserType_PGFONT_CharInfo +#define __BWUserType_PGFONT_CharInfo + typedef GFONT_CharInfo* PGFONT_CharInfo ; /* A pointer to GFONT_CharInfo */ +#endif +#ifndef __BWUserType_CallbackGetFontChar +#define __BWUserType_CallbackGetFontChar + typedef PGFONT_CharInfo (*CallbackGetFontChar)(uint8_t ch); /* Callback used to get the font information for a single character. */ +#endif +#ifndef __BWUserType_GFONT_Callbacks +#define __BWUserType_GFONT_Callbacks + typedef struct { /* Structure with font relevant callbacks. */ + CallbackGetFontChar GetFontChar; /* Callback for retrieving a font character. */ + uint8_t boundingBoxHeight; /* Height of the bounding box. This includes the height of the underline box height. */ + uint8_t underlineBoxHeight; /* Height of the underline box height. */ + uint8_t lineSpaceBoxHeight; /* Height of the space between lines */ + } GFONT_Callbacks; +#endif +#ifndef __BWUserType_PGFONT_Callbacks +#define __BWUserType_PGFONT_Callbacks + typedef GFONT_Callbacks* PGFONT_Callbacks ; /* Pointer to struct for font callbacks. */ +#endif + + + +PGFONT_CharInfo McuGFont_GetFontChar(uint8_t ch); +/* +** =================================================================== +** Method : GetFontChar (component GFont) +** +** Description : +** Returns for a given character the corresponding font bitmap. +** Parameters : +** NAME - DESCRIPTION +** ch - The character for that a bitmap is required. +** Returns : +** --- - Character font bitmap +** =================================================================== +*/ + +uint8_t McuGFont_GetBoxHeight(void); +/* +** =================================================================== +** Method : GetBoxHeight (component GFont) +** +** Description : +** Function to get the height of the bounding box. +** Parameters : None +** Returns : +** --- - Height of bounding box +** =================================================================== +*/ + +PGFONT_Callbacks McuGFont_GetFont(void); +/* +** =================================================================== +** Method : GetFont (component GFont) +** +** Description : +** Returns callbacks for fonts to be used by the font driver. +** Parameters : None +** Returns : +** --- - Font callbacks. +** =================================================================== +*/ + +#define McuGFont_GetLineSpaceHeight() \ + 2 + +/* +** =================================================================== +** Method : GetLineSpaceHeight (component GFont) +** +** Description : +** Returns the size of the line space height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuGFont_GetUnderlineBoxHeight() \ + 2 + +/* +** =================================================================== +** Method : GetUnderlineBoxHeight (component GFont) +** +** Description : +** Returns the size of the underline box height +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuGFont_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GFont) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuGFont_Init(void); +/* +** =================================================================== +** Method : Init (component GFont) +** +** Description : +** Driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuGFont. */ + +#endif +/* ifndef __McuGFont_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuGPIO.c b/TSM_PicoW_Sensor/McuLib/src/McuGPIO.c new file mode 100644 index 0000000..c348439 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuGPIO.c @@ -0,0 +1,783 @@ +/* + * Copyright (c) 2019-2021, Erich Styger + * + * Driver for GPIO pins + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuLibconfig.h" +#include "McuGPIO.h" +#include "McuUtility.h" +#include "McuLog.h" +#include +#include /* for memset */ +#include +#if MCUGPIO_CONFIG_USE_FREERTOS_HEAP + #include "McuRTOS.h" +#else + #include /* for malloc()/free() */ +#endif +#if McuLib_CONFIG_NXP_SDK_USED + #include "fsl_gpio.h" +#elif McuLib_CONFIG_CPU_IS_STM32 + /* nothing special needed */ +#endif +#if McuLib_CONFIG_CPU_IS_KINETIS + #include "fsl_port.h" +#elif McuLib_CONFIG_CPU_IS_LPC + #include "fsl_iocon.h" +#elif McuLib_CONFIG_CPU_IS_IMXRT + #include "fsl_iomuxc.h" +#elif McuLib_CONFIG_CPU_IS_STM32 + #include "stm32f3xx_hal.h" +#elif McuLib_CONFIG_CPU_IS_ESP32 + #include "driver/gpio.h" +#elif McuLib_CONFIG_CPU_IS_RPxxxx + #include "hardware/gpio.h" +#elif McuLib_CONFIG_CPU_IS_MCX + #include "fsl_port.h" +#endif + +#if McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0 /* LPC845 specific defines, not available in SDK */ + #define McuGPIO_IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ + #define McuGPIO_IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ + #define McuGPIO_IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ + + #define McuGPIO_IOCON_PIO_MODE_PULL_INACTIVE (0x0u<<3) /* Inactive (no pull-down/pull-up resistor enabled) */ + #define McuGPIO_IOCON_PIO_MODE_PULL_DOWN (0x1u<<3) /* Pull-down enabled */ + #define McuGPIO_IOCON_PIO_MODE_PULL_UP (0x2u<<3) /* Pull-up enabled */ + #define McuGPIO_IOCON_PIO_MODE_PULL_REPEATER (0x3u<<3) /* Repeater mode */ + + #define McuGPIO_IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ + #define McuGPIO_IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + + #define McuGPIO_IOCON_PIO_DEFAULTS \ + /* Enable hysteresis */ \ + McuGPIO_IOCON_PIO_HYS_EN | \ + /* Input not invert */ \ + McuGPIO_IOCON_PIO_INV_DI | \ + /* Disables Open-drain function */ \ + McuGPIO_IOCON_PIO_OD_DI | \ + /* Bypass input filter */ \ + McuGPIO_IOCON_PIO_SMODE_BYPASS | \ + /* IOCONCLKDIV0 */ \ + McuGPIO_IOCON_PIO_CLKDIV0 +#endif + +/* default configuration, used for initializing the config */ +static const McuGPIO_Config_t defaultConfig = +{ + .isInput = true, + .isHighOnInit = false, + .hw = { + #if McuLib_CONFIG_NXP_SDK_USED && !McuLib_CONFIG_IS_KINETIS_KE + .gpio = NULL, + #elif McuLib_CONFIG_CPU_IS_STM32 + .gpio = NULL, + #elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + .name = "", + #endif + #if McuLib_CONFIG_CPU_IS_KINETIS + .port = 0, + #if McuLib_CONFIG_IS_KINETIS_KE + .portType = 0, + .portNum = 0, + #endif + #elif McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0 + .port = 0, + .iocon = -1, + #elif McuLib_CONFIG_CPU_IS_LPC + .port = 0, + #elif McuLib_CONFIG_CPU_IS_MCX + .port = NULL, /* e.g. PORT0 */ + #endif + #if McuLib_CONFIG_CPU_IS_ESP32 + .pin = GPIO_NUM_NC, + #else + .pin = 0, + #endif + .pull = McuGPIO_PULL_DISABLE, + } +}; + +typedef struct McuGPIO_t { +#if McuLib_CONFIG_CPU_IS_ESP32 + bool isHigh; /* status of output pin, because we cannot toggle pin and we cannot read pin status if it is output pin */ +#endif +#if McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + struct gpiod_line *line; /* will be requested with gpiod_chip_get_line() */ + bool isHigh; /* status of output pin, because we cannot toggle pin and we cannot read pin status if it is output pin */ +#endif + bool isInput; + McuGPIO_HwPin_t hw; +} McuGPIO_t; + +void McuGPIO_GetDefaultConfig(McuGPIO_Config_t *config) { + assert(config!=NULL); + memcpy(config, &defaultConfig, sizeof(*config)); +} + +static void McuGPIO_ConfigurePin(McuGPIO_t *pin, bool isInput, bool isHighOnInit) { +#if McuLib_CONFIG_NXP_SDK_USED + gpio_pin_config_t pin_config; /* config for the SDK */ + + memset(&pin_config, 0, sizeof(pin_config)); /* init all fields */ + if (isInput) { + #if McuLib_CONFIG_CPU_IS_IMXRT + pin_config.direction = kGPIO_DigitalInput; + #else + pin_config.pinDirection = kGPIO_DigitalInput; + #endif + } else { + #if McuLib_CONFIG_CPU_IS_IMXRT + pin_config.direction = kGPIO_DigitalOutput; + #else + pin_config.pinDirection = kGPIO_DigitalOutput; + #endif + } + #if McuLib_CONFIG_CPU_IS_IMXRT + pin_config.interruptMode = kGPIO_NoIntmode; /* no interrupts */ + #endif + pin_config.outputLogic = isHighOnInit; + #if McuLib_CONFIG_IS_KINETIS_KE + GPIO_PinInit(pin->hw.portNum, pin->hw.pin, &pin_config); + #elif McuLib_CONFIG_CPU_IS_KINETIS + GPIO_PinInit(pin->hw.gpio, pin->hw.pin, &pin_config); + #elif McuLib_CONFIG_CPU_IS_LPC + GPIO_PinInit(pin->hw.gpio, pin->hw.port, pin->hw.pin, &pin_config); + #elif McuLib_CONFIG_CPU_IS_IMXRT + GPIO_PinInit(pin->hw.gpio, pin->hw.pin, &pin_config); + #elif McuLib_CONFIG_CPU_IS_MCX + GPIO_PinInit(pin->hw.gpio, pin->hw.pin, &pin_config); + #endif +#elif McuLib_CONFIG_CPU_IS_STM32 + GPIO_InitTypeDef config; + + /* setup initialization structure */ + config.Alternate = 0; /* init */ + if (isInput) { + config.Mode = GPIO_MODE_INPUT; /* configure as input pin */ + } else { + config.Mode = GPIO_MODE_OUTPUT_PP; /* configure as push/pull output pin */ + } + switch(pin->hw.pull) { + case McuGPIO_PULL_DISABLE: config.Pull = GPIO_NOPULL; break; + case McuGPIO_PULL_UP: config.Pull = GPIO_PULLUP; break; + case McuGPIO_PULL_DOWN: config.Pull = GPIO_PULLDOWN; break; + } + config.Speed = GPIO_SPEED_FREQ_LOW; + config.Pin = pin->hw.pin; + HAL_GPIO_Init(pin->hw.gpio, &config); + /* write default output level */ + if (!isInput) { + HAL_GPIO_WritePin(pin->hw.gpio, pin->hw.pin, isHighOnInit?GPIO_PIN_SET:GPIO_PIN_RESET); + } +#elif McuLib_CONFIG_CPU_IS_ESP32 + if (gpio_reset_pin(pin->hw.pin)!=ESP_OK) { + McuLog_fatal("failed resetting pin"); + } + if (isInput) { + gpio_set_direction(pin->hw.pin, GPIO_MODE_INPUT); + } else { + gpio_set_direction(pin->hw.pin, GPIO_MODE_OUTPUT); + } + switch(pin->hw.pull) { + case McuGPIO_PULL_DISABLE: gpio_set_pull_mode(pin->hw.pin, GPIO_FLOATING); break; + case McuGPIO_PULL_UP: gpio_set_pull_mode(pin->hw.pin, GPIO_PULLUP_ONLY); break; + case McuGPIO_PULL_DOWN: gpio_set_pull_mode(pin->hw.pin, GPIO_PULLDOWN_ONLY); break; + } + if (!isInput) { + gpio_set_level(pin->hw.pin, isHighOnInit?1:0); + pin->isHigh = isHighOnInit; + } +#elif McuLib_CONFIG_CPU_IS_RPxxxx + if (!isInput) { /* set output level first */ + gpio_put(pin->hw.pin, isHighOnInit); /* set initial logic level */ + } + if (isInput) { + gpio_set_dir(pin->hw.pin, GPIO_IN); + } else { + gpio_set_dir(pin->hw.pin, GPIO_OUT); + } +#elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + pin->line = gpiod_chip_get_line(pin->hw.chip, pin->hw.pin); + if (isInput) { + gpiod_line_request_input(pin->line, pin->hw.name); + } else { + gpiod_line_request_output(pin->line, pin->hw.name, isHighOnInit); + } + if (!isInput) { + gpiod_line_set_value(pin->line, isHighOnInit?1:0); + pin->isHigh = isHighOnInit; + } +#endif +} + +void McuGPIO_SetAsInput(McuGPIO_Handle_t gpio) { + McuGPIO_t *pin = (McuGPIO_t*)gpio; + + assert(gpio!=NULL); + McuGPIO_ConfigurePin(pin, true, false /* don't care */); + pin->isInput = true; +} + +void McuGPIO_SetAsOutput(McuGPIO_Handle_t gpio, bool setHigh) { + McuGPIO_t *pin = (McuGPIO_t*)gpio; + + assert(gpio!=NULL); + McuGPIO_ConfigurePin(pin, false, setHigh); + pin->isInput = false; +} + +bool McuGPIO_IsInput(McuGPIO_Handle_t gpio) { + McuGPIO_t *pin = (McuGPIO_t*)gpio; + return pin->isInput; +} + +bool McuGPIO_IsOutput(McuGPIO_Handle_t gpio) { + McuGPIO_t *pin = (McuGPIO_t*)gpio; + return !pin->isInput; +} + +#if McuLib_CONFIG_CPU_IS_IMXRT +void McuGPIO_SetMux(McuGPIO_HwPin_t *hw, uint32_t muxRegister, uint32_t muxMode, uint32_t inputRegister, uint32_t inputDaisy, uint32_t configRegister) { + hw->mux.muxRegister = muxRegister; + hw->mux.muxMode = muxMode; + hw->mux.inputRegister = inputRegister; + hw->mux.inputDaisy = inputDaisy; + hw->mux.configRegister = configRegister; +} +#endif + +McuGPIO_Handle_t McuGPIO_InitGPIO(McuGPIO_Config_t *config) { + McuGPIO_t *handle; + + assert(config!=NULL); + /* allocate memory for handle */ +#if MCUGPIO_CONFIG_USE_FREERTOS_HEAP + handle = (McuGPIO_t*)pvPortMalloc(sizeof(McuGPIO_t)); /* get a new device descriptor */ +#else + handle = (McuGPIO_t*)malloc(sizeof(McuGPIO_t)); /* get a new device descriptor */ +#endif + assert(handle!=NULL); + if (handle!=NULL) { /* if malloc failed, will return NULL pointer */ + memset(handle, 0, sizeof(McuGPIO_t)); /* init all fields */ + handle->isInput = config->isInput; + memcpy(&handle->hw, &config->hw, sizeof(handle->hw)); /* copy hardware information */ + } +#if McuLib_CONFIG_CPU_IS_RPxxxx + gpio_init(config->hw.pin); +#endif + McuGPIO_ConfigurePin(handle, config->isInput, config->isHighOnInit); + McuGPIO_SetPullResistor((McuGPIO_Handle_t)handle, config->hw.pull); /* GPIO muxing might be done with setting the pull registers, e.g. for LPC845 */ + + /* do the pin muxing */ +#if McuLib_CONFIG_IS_KINETIS_KE + /* no pin muxing needed */ +#elif McuLib_CONFIG_CPU_IS_KINETIS + PORT_SetPinMux(config->hw.port, config->hw.pin, kPORT_MuxAsGpio); +#elif McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0 /* e.g. LPC845 */ + /* nothing needed here, because IOCON_PinMuxSet() is already called with the McuGPIO_SetPullResistor() above. */ +#elif McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==33 /* LPC55S69 for LPC55S16 */ + #define _IOCON_PIO_DIGITAL_EN 0x0100u /*!<@brief Enables digital function */ + #define _IOCON_PIO_FUNC0 0x00u /*!<@brief Selects pin function 0 */ + #define _IOCON_PIO_INV_DI 0x00u /*!<@brief Input function is not inverted */ + #define _IOCON_PIO_MODE_PULLUP 0x20u /*!<@brief Selects pull-up function */ + #define _IOCON_PIO_OPENDRAIN_DI 0x00u /*!<@brief Open drain is disabled */ + #define _IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */ + + static const uint32_t port_pin_config = ( + _IOCON_PIO_FUNC0 | + /* Selects pull-up function */ + _IOCON_PIO_MODE_PULLUP | + /* Standard mode, output slew rate control is enabled */ + _IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + _IOCON_PIO_INV_DI | + /* Enables digital function */ + _IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + _IOCON_PIO_OPENDRAIN_DI); + IOCON_PinMuxSet(IOCON, config->hw.port, config->hw.pin, port_pin_config); +#elif McuLib_CONFIG_CPU_IS_IMXRT + IOMUXC_SetPinMux( handle->hw.mux.muxRegister, + handle->hw.mux.muxMode, + handle->hw.mux.inputRegister, + handle->hw.mux.inputDaisy, + handle->hw.mux.configRegister, + 0U); +#if McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_IMXRT1064 + /* GPIO1 and GPIO6 share same IO MUX function, configured in GPR26 */ + if (handle->hw.gpio==GPIO1) { + IOMUXC_GPR->GPR26 &= ~(1<hw.pin); /* 0: GPIO1, 1: GPIO6 */ + } else if (handle->hw.gpio==GPIO6) { + IOMUXC_GPR->GPR26 |= (1<hw.pin); /* 0: GPIO1, 1: GPIO6 */ + + /* GPIO2 and GPIO7 share same IO MUX function, configured in GPR27 */ + } else if (handle->hw.gpio==GPIO2) { + IOMUXC_GPR->GPR27 &= (1<hw.pin); /* 0: GPIO2, 1: GPIO7 */ + } else if (handle->hw.gpio==GPIO7) { + IOMUXC_GPR->GPR27 |= (1<hw.pin); /* 0: GPIO2, 1: GPIO7 */ + + /* GPIO3 and GPIO8 share same IO MUX function, configured in GPR28 */ + } else if (handle->hw.gpio==GPIO3) { + IOMUXC_GPR->GPR28 &= (1<hw.pin); /* 0: GPIO3, 1: GPIO8 */ + } else if (handle->hw.gpio==GPIO8) { + IOMUXC_GPR->GPR28 |= (1<hw.pin); /* 0: GPIO3, 1: GPIO8 */ + + /* GPIO4 and GPIO9 share same IO MUX function, configured in GPR29 */ + } else if (handle->hw.gpio==GPIO4) { + IOMUXC_GPR->GPR29 &= (1<hw.pin); /* 0: GPIO4, 1: GPIO9 */ + } else if (handle->hw.gpio==GPIO9) { + IOMUXC_GPR->GPR29 |= (1<hw.pin); /* 0: GPIO4, 1: GPIO9 */ + } +#endif /* McuLib_CONFIG_CPU_VARIANT_NXP_IMXRT1064 */ +#elif McuLib_CONFIG_CPU_IS_STM32 + /* no muxing */ +#elif McuLib_CONFIG_CPU_IS_ESP32 + /* no muxing needed */ +#elif McuLib_CONFIG_CPU_IS_RPxxxx + /* no muxing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + /* no muxing needed */ +#endif + return (McuGPIO_Handle_t)handle; +} + +McuGPIO_Handle_t McuGPIO_DeinitGPIO(McuGPIO_Handle_t gpio) { + assert(gpio!=NULL); +#if McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + McuGPIO_t *pin = (McuGPIO_t*)gpio; + gpiod_line_release(pin->line); +#elif McuLib_CONFIG_CPU_IS_RPxxxx + McuGPIO_t *pin = (McuGPIO_t*)gpio; + gpio_deinit(pin->hw.pin); +#endif +#if MCUGPIO_CONFIG_USE_FREERTOS_HEAP + vPortFree(gpio); +#else + free(gpio); +#endif + return NULL; +} + +void McuGPIO_SetLow(McuGPIO_Handle_t gpio) { + assert(gpio!=NULL); + McuGPIO_t *pin = (McuGPIO_t*)gpio; + +#if McuLib_CONFIG_CPU_IS_KINETIS + #if McuLib_CONFIG_SDK_VERSION < 250 + GPIO_ClearPinsOutput(pin->hw.gpio, (1<hw.pin)); + #elif McuLib_CONFIG_IS_KINETIS_KE + GPIO_PortClear(pin->hw.portNum, (1<hw.pin)); + #else + GPIO_PortClear(pin->hw.gpio, (1<hw.pin)); + #endif +#elif McuLib_CONFIG_CPU_IS_LPC + GPIO_PortClear(pin->hw.gpio, pin->hw.port, (1<hw.pin)); +#elif McuLib_CONFIG_CPU_IS_IMXRT + GPIO_PinWrite(pin->hw.gpio, pin->hw.pin, 0U); +#elif McuLib_CONFIG_CPU_IS_STM32 + HAL_GPIO_WritePin(pin->hw.gpio, pin->hw.pin, GPIO_PIN_RESET); +#elif McuLib_CONFIG_CPU_IS_ESP32 + gpio_set_level(pin->hw.pin, 0); /* low */ + pin->isHigh = false; +#elif McuLib_CONFIG_CPU_IS_RPxxxx + gpio_put(pin->hw.pin, 0); +#elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + gpiod_line_set_value(pin->line, 0); + pin->isHigh = false; +#elif McuLib_CONFIG_CPU_IS_MCX + GPIO_PinWrite(pin->hw.gpio, pin->hw.pin, 0); +#endif +} + +void McuGPIO_SetHigh(McuGPIO_Handle_t gpio) { + assert(gpio!=NULL); + McuGPIO_t *pin = (McuGPIO_t*)gpio; + +#if McuLib_CONFIG_CPU_IS_KINETIS + #if McuLib_CONFIG_SDK_VERSION < 250 + GPIO_SetPinsOutput(pin->hw.gpio, (1<hw.pin)); + #elif McuLib_CONFIG_IS_KINETIS_KE + GPIO_PortSet(pin->hw.portNum, (1<hw.pin)); + #else + GPIO_PortSet(pin->hw.gpio, (1<hw.pin)); + #endif +#elif McuLib_CONFIG_CPU_IS_LPC + GPIO_PortSet(pin->hw.gpio, pin->hw.port, (1<hw.pin)); +#elif McuLib_CONFIG_CPU_IS_IMXRT + GPIO_PinWrite(pin->hw.gpio, pin->hw.pin, 1U); +#elif McuLib_CONFIG_CPU_IS_STM32 + HAL_GPIO_WritePin(pin->hw.gpio, pin->hw.pin, GPIO_PIN_SET); +#elif McuLib_CONFIG_CPU_IS_ESP32 + gpio_set_level(pin->hw.pin, 1); /* high */ + pin->isHigh = true; +#elif McuLib_CONFIG_CPU_IS_RPxxxx + gpio_put(pin->hw.pin, 1); +#elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + gpiod_line_set_value(pin->line, 1); + pin->isHigh = true; +#elif McuLib_CONFIG_CPU_IS_MCX + GPIO_PinWrite(pin->hw.gpio, pin->hw.pin, 1); +#endif +} + +void McuGPIO_Toggle(McuGPIO_Handle_t gpio) { + assert(gpio!=NULL); + McuGPIO_t *pin = (McuGPIO_t*)gpio; + +#if McuLib_CONFIG_CPU_IS_KINETIS + #if McuLib_CONFIG_SDK_VERSION < 250 + GPIO_TogglePinsOutput(pin->hw.gpio, (1<hw.pin)); + #elif McuLib_CONFIG_IS_KINETIS_KE + GPIO_PortToggle(pin->hw.portNum, (1<hw.pin)); + #else + GPIO_PortToggle(pin->hw.gpio, (1<hw.pin)); + #endif +#elif McuLib_CONFIG_CPU_IS_LPC + GPIO_PortToggle(pin->hw.gpio, pin->hw.port, (1<hw.pin)); +#elif McuLib_CONFIG_CPU_IS_IMXRT + GPIO_PortToggle(pin->hw.gpio, (1<hw.pin)); +#elif McuLib_CONFIG_CPU_IS_STM32 + HAL_GPIO_TogglePin(pin->hw.gpio, pin->hw.pin); +#elif McuLib_CONFIG_CPU_IS_ESP32 + if (pin->isHigh) { + gpio_set_level(pin->hw.pin, 0); + pin->isHigh = false; + } else { + gpio_set_level(pin->hw.pin, 1); + pin->isHigh = true; + } +#elif McuLib_CONFIG_CPU_IS_RPxxxx + gpio_xor_mask(1<hw.pin); +#elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + if (pin->isHigh) { + gpiod_line_set_value(pin->line, 0); + pin->isHigh = false; + } else { + gpiod_line_set_value(pin->line, 1); + pin->isHigh = true; + } +#elif McuLib_CONFIG_CPU_IS_MCX + GPIO_PortToggle(pin->hw.gpio, 1<hw.pin); +#endif +} + +void McuGPIO_SetValue(McuGPIO_Handle_t gpio, bool val) { + assert(gpio!=NULL); + McuGPIO_t *pin = (McuGPIO_t*)gpio; + + if (val) { /* set to HIGH */ +#if McuLib_CONFIG_CPU_IS_KINETIS + #if McuLib_CONFIG_SDK_VERSION < 250 + GPIO_SetPinsOutput(pin->hw.gpio, (1<hw.pin)); + #elif McuLib_CONFIG_IS_KINETIS_KE + GPIO_PortSet(pin->hw.portNum, (1<hw.pin)); + #else + GPIO_PortSet(pin->hw.gpio, (1<hw.pin)); + #endif +#elif McuLib_CONFIG_CPU_IS_LPC + GPIO_PortSet(pin->hw.gpio, pin->hw.port, (1<hw.pin)); +#elif McuLib_CONFIG_CPU_IS_IMXRT + GPIO_PinWrite(pin->hw.gpio, pin->hw.pin, 1U); +#elif McuLib_CONFIG_CPU_IS_STM32 + HAL_GPIO_WritePin(pin->hw.gpio, pin->hw.pin, GPIO_PIN_RESET); +#elif McuLib_CONFIG_CPU_IS_ESP32 + gpio_set_level(pin->hw.pin, 1); /* high */ + pin->isHigh = true; +#elif McuLib_CONFIG_CPU_IS_RPxxxx + gpio_put(pin->hw.pin, 1); +#elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + gpiod_line_set_value(pin->line, 0); + pin->isHigh = false; +#elif McuLib_CONFIG_CPU_IS_MCX + GPIO_PinWrite(pin->hw.gpio, pin->hw.pin, 1); +#endif + } else { /* set to LOW */ +#if McuLib_CONFIG_CPU_IS_KINETIS + #if McuLib_CONFIG_SDK_VERSION < 250 + GPIO_ClearPinsOutput(pin->hw.gpio, (1<hw.pin)); + #elif McuLib_CONFIG_IS_KINETIS_KE + GPIO_PortClear(pin->hw.portNum, (1<hw.pin)); + #else + GPIO_PortClear(pin->hw.gpio, (1<hw.pin)); + #endif +#elif McuLib_CONFIG_CPU_IS_LPC + GPIO_PortClear(pin->hw.gpio, pin->hw.port, (1<hw.pin)); +#elif McuLib_CONFIG_CPU_IS_IMXRT + GPIO_PinWrite(pin->hw.gpio, pin->hw.pin, 1U); +#elif McuLib_CONFIG_CPU_IS_STM32 + HAL_GPIO_WritePin(pin->hw.gpio, pin->hw.pin, GPIO_PIN_SET); +#elif McuLib_CONFIG_CPU_IS_ESP32 + gpio_set_level(pin->hw.pin, 0); /* low */ + pin->isHigh = false; +#elif McuLib_CONFIG_CPU_IS_RPxxxx + gpio_put(pin->hw.pin, 0); +#elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + gpiod_line_set_value(pin->line, 1); + pin->isHigh = true; +#elif McuLib_CONFIG_CPU_IS_MCX + GPIO_PinWrite(pin->hw.gpio, pin->hw.pin, 0); +#endif + } +} + +bool McuGPIO_GetValue(McuGPIO_Handle_t gpio) { + return McuGPIO_IsHigh(gpio); +} + +bool McuGPIO_IsHigh(McuGPIO_Handle_t gpio) { + assert(gpio!=NULL); + McuGPIO_t *pin = (McuGPIO_t*)gpio; + +#if McuLib_CONFIG_CPU_IS_KINETIS + #if McuLib_CONFIG_SDK_VERSION < 250 + return GPIO_ReadPinInput(pin->hw.gpio, pin->hw.pin)!=0; + #elif McuLib_CONFIG_IS_KINETIS_KE + return GPIO_PinRead(pin->hw.portNum, pin->hw.pin)!=0; + #else + return GPIO_PinRead(pin->hw.gpio, pin->hw.pin)!=0; + #endif +#elif McuLib_CONFIG_CPU_IS_LPC + return GPIO_PinRead(pin->hw.gpio, pin->hw.port, pin->hw.pin)!=0; +#elif McuLib_CONFIG_CPU_IS_IMXRT + return GPIO_PinRead(pin->hw.gpio, pin->hw.pin)!=0; +#elif McuLib_CONFIG_CPU_IS_STM32 + return HAL_GPIO_ReadPin(pin->hw.gpio, pin->hw.pin); +#elif McuLib_CONFIG_CPU_IS_ESP32 + if (pin->isInput) { + return gpio_get_level(pin->hw.pin); + } else { /* on ESP32, if pin is configured as output, gpio_get_level() always returns 0 */ + return pin->isHigh; + } +#elif McuLib_CONFIG_CPU_IS_RPxxxx + return gpio_get(pin->hw.pin)!=0; +#elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + return gpiod_line_get_value(pin->line)!=0; +#elif McuLib_CONFIG_CPU_IS_MCX + return GPIO_PinRead(pin->hw.gpio, pin->hw.pin); +#endif + return false; +} + +bool McuGPIO_IsLow(McuGPIO_Handle_t gpio) { + return !McuGPIO_IsHigh(gpio); +} + +void McuGPIO_GetPinStatusString(McuGPIO_Handle_t gpio, unsigned char *buf, size_t bufSize) { + McuGPIO_t *pin = (McuGPIO_t*)gpio; + + *buf = '\0'; + if (McuGPIO_IsOutput(gpio)) { + McuUtility_strcat(buf, bufSize, (unsigned char*)"Out:"); + } else { + McuUtility_strcat(buf, bufSize, (unsigned char*)"Inp:"); + } + if (McuGPIO_IsHigh(gpio)) { + McuUtility_strcat(buf, bufSize, (unsigned char*)"H"); + } else { + McuUtility_strcat(buf, bufSize, (unsigned char*)"L"); + } +#if (McuLib_CONFIG_NXP_SDK_USED || McuLib_CONFIG_CPU_IS_STM32) && !McuLib_CONFIG_IS_KINETIS_KE + McuUtility_strcat(buf, bufSize, (unsigned char*)" gpio:0x"); + McuUtility_strcatNum32Hex(buf, bufSize, (uint32_t)pin->hw.gpio); /* write address */ +#endif +#if McuLib_CONFIG_CPU_IS_KINETIS + McuUtility_strcat(buf, bufSize, (unsigned char*)" port:0x"); + McuUtility_strcatNum32Hex(buf, bufSize, (uint32_t)pin->hw.port); /* write address */ +#elif McuLib_CONFIG_CPU_IS_LPC /* all LPC, including M33 and M0+ */ + McuUtility_strcat(buf, bufSize, (unsigned char*)" port:"); + McuUtility_strcatNum32u(buf, bufSize, (uint32_t)pin->hw.port); /* write port number */ +#endif + McuUtility_strcat(buf, bufSize, (unsigned char*)" pin:"); + McuUtility_strcatNum32u(buf, bufSize, (uint32_t)pin->hw.pin); /* write pin number */ +#if McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0 + McuUtility_strcat(buf, bufSize, (unsigned char*)" iocon:"); + McuUtility_strcatNum32u(buf, bufSize, (uint32_t)pin->hw.iocon); /* write IOCON number */ +#endif + McuUtility_strcat(buf, bufSize, (unsigned char*)" pull:"); + switch(pin->hw.pull) { + case McuGPIO_PULL_DISABLE: + McuUtility_strcat(buf, bufSize, (unsigned char*)"dis"); + break; + case McuGPIO_PULL_UP: + McuUtility_strcat(buf, bufSize, (unsigned char*)"up "); + break; + case McuGPIO_PULL_DOWN: + McuUtility_strcat(buf, bufSize, (unsigned char*)"dwn"); + break; + default: + McuUtility_strcat(buf, bufSize, (unsigned char*)"???"); + break; + } +} + +void McuGPIO_SetPullResistor(McuGPIO_Handle_t gpio, McuGPIO_PullType pull) { + McuGPIO_t *pin = (McuGPIO_t*)gpio; + + pin->hw.pull = pull; +#if McuLib_CONFIG_IS_KINETIS_KE + /* only pull-up */ + if (pull == McuGPIO_PULL_DISABLE) { + PORT_SetPinPullUpEnable(pin->hw.port, pin->hw.portType, pin->hw.pin, false); + } else if (pull == McuGPIO_PULL_UP) { + PORT_SetPinPullUpEnable(pin->hw.port, pin->hw.portType, pin->hw.pin, true); + } +#elif McuLib_CONFIG_CPU_IS_KINETIS + /* mask out bits for Pull-Select, Pull-Enable and Interrupt status flags, then OR-ing the new flags */ + if (pull == McuGPIO_PULL_DISABLE) { + pin->hw.port->PCR[pin->hw.pin] = ((pin->hw.port->PCR[pin->hw.pin] & + /* Mask bits to zero which are setting */ + (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ISF_MASK))) + | PORT_PCR_PE(0)); /* disable pull resistor */ + } else if (pull == McuGPIO_PULL_UP) { + pin->hw.port->PCR[pin->hw.pin] = ((pin->hw.port->PCR[pin->hw.pin] & + /* Mask bits to zero which are setting */ + (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ISF_MASK))) + /* | PORT_PCR_PFE(1) */ /* enable passive filter */ + | PORT_PCR_PS(1) /* pull select 1: pull-up */ + | PORT_PCR_PE(1)); /* enable pull resistor */ + } else if (pull == McuGPIO_PULL_DOWN) { + pin->hw.port->PCR[pin->hw.pin] = ((pin->hw.port->PCR[pin->hw.pin] & + /* Mask bits to zero which are setting */ + (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ISF_MASK))) + | PORT_PCR_PS(0) /* pull select 0: pull-down */ + | PORT_PCR_PE(1)); /* enable pull resistor */ + } +#elif McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0 /* e.g. LPC845 */ + uint32_t IOCON_config; + + if (pull == McuGPIO_PULL_DISABLE) { + IOCON_config = ( McuGPIO_IOCON_PIO_MODE_PULL_INACTIVE | McuGPIO_IOCON_PIO_DEFAULTS); + } else if (pull == McuGPIO_PULL_UP) { + IOCON_config = ( McuGPIO_IOCON_PIO_MODE_PULL_UP | McuGPIO_IOCON_PIO_DEFAULTS); + } else if (pull == McuGPIO_PULL_DOWN) { + IOCON_config = ( McuGPIO_IOCON_PIO_MODE_PULL_DOWN | McuGPIO_IOCON_PIO_DEFAULTS); + } else { + IOCON_config = ( McuGPIO_IOCON_PIO_MODE_PULL_INACTIVE | McuGPIO_IOCON_PIO_DEFAULTS); + } + IOCON_PinMuxSet(IOCON, pin->hw.iocon, IOCON_config); +#elif McuLib_CONFIG_CPU_IS_LPC + uint32_t config; + + /*! IOCON_PIO_MODE: + * MODE - Selects function mode (on-chip pull-up/pull-down resistor control). + * 0b00..Inactive. Inactive (no pull-down/pull-up resistor enabled). + * 0b01..Pull-down. Pull-down resistor enabled. + * 0b10..Pull-up. Pull-up resistor enabled. + * 0b11..Repeater. Repeater mode. + */ + if (pull == McuGPIO_PULL_DISABLE) { + config = IOCON_PIO_MODE(0b00); /* inactive */ + } else if (pull == McuGPIO_PULL_UP) { + config = IOCON_PIO_MODE(0b10); /* pull-up */ + } else if (pull == McuGPIO_PULL_DOWN) { + config = IOCON_PIO_MODE(0b01); /* pull-down */ + } else { /* default */ + config = IOCON_PIO_MODE(0b00); /* inactive */ + } + IOCON->PIO[pin->hw.port][pin->hw.pin] = ((IOCON->PIO[pin->hw.port][pin->hw.pin] & + (~(IOCON_PIO_MODE_MASK))) /* Mask bits to zero which are setting */ + | config); /* Select function mode (on-chip pull-up/pull-down resistor control) */ +#elif McuLib_CONFIG_CPU_IS_IMXRT + if (pin->hw.mux.configRegister!=0) { + uint32_t configValue; /* configuration of IOMUXC SW_PAD_CTL (hw.mux.configRegister) */ + + configValue = *((volatile uint32_t *)pin->hw.mux.configRegister); /* read current config */ + #if 0 + configValue = (0<<16) /* Hysteresis enable field: 0: hysteresis disabled */ + | (0b00<<14) /* pull-up/down: 00: 100k Ohm pull-down, 01: 47k pull-up, 10: 100k pull-up, 11: 22k pull-up */ + | (0<<13) /* pull/keep select: 0: keeper, 1: pull */ + | (0<<12) /* pull/keep enable: 0: disabled, 1: enabled */ + | (0<<11) /* open drain: 0: disabled, 1: enabled */ + | (0b00<<6) /* speed: 00: 50 MHz, 01: 100 MHz, 10: 100 MHz, 11: 200 MHz */ + | (0b000<<3) /* drive strength: 000: disabled */ + | (0<<0) /* slew rage: 0: slow slew rate, 1: fast slew rate */ + ; + #endif + /* masking out the bits we are going to set: */ + configValue &= ~((0b11<<14) /* pull-up/down */ + | (1<<13) /* pull/keep select: */ + | (1<<12)); /* pull/keep enable */ + if (pull == McuGPIO_PULL_DISABLE) { + configValue |= (0b00<<14) /* pull-up/down: 00: 100k Ohm pull-down, 01: 47k pull-up, 10: 100k pull-up, 11: 22k pull-up */ + | (0<<13) /* pull/keep select: 0: keeper, 1: pull */ + | (0<<12); /* pull/keep enable: 0: disabled, 1: enabled */ + } else if (pull == McuGPIO_PULL_UP) { /* 100k pull-up */ + configValue |= (0b10<<14) /* pull-up/down: 00: 100k Ohm pull-down, 01: 47k pull-up, 10: 100k pull-up, 11: 22k pull-up */ + | (1<<13) /* pull/keep select: 0: keeper, 1: pull */ + | (1<<12); /* pull/keep enable: 0: disabled, 1: enabled */ + } else if (pull == McuGPIO_PULL_DOWN) { /* 100k pull-down */ + configValue |= (0b00<<14) /* pull-up/down: 00: 100k Ohm pull-down, 01: 47k pull-up, 10: 100k pull-up, 11: 22k pull-up */ + | (1<<13) /* pull/keep select: 0: keeper, 1: pull */ + | (1<<12); /* pull/keep enable: 0: disabled, 1: enabled */ + } + IOMUXC_SetPinConfig(pin->hw.mux.muxRegister, + pin->hw.mux.muxMode, + pin->hw.mux.inputRegister, + pin->hw.mux.inputDaisy, + pin->hw.mux.configRegister, + configValue); + } +#elif McuLib_CONFIG_CPU_IS_STM32 + McuGPIO_ConfigurePin(pin, false /* don't care as only for output */, &pin->hw); +#elif McuLib_CONFIG_CPU_IS_ESP32 + if (pull == McuGPIO_PULL_DISABLE) { + gpio_set_pull_mode(pin->hw.pin, GPIO_FLOATING); + } else if (pull == McuGPIO_PULL_UP) { + gpio_set_pull_mode(pin->hw.pin, GPIO_PULLUP_ONLY); + } else if (pull == McuGPIO_PULL_DOWN) { + gpio_set_pull_mode(pin->hw.pin, GPIO_PULLDOWN_ONLY); + } +#elif McuLib_CONFIG_CPU_IS_RPxxxx + if (pull == McuGPIO_PULL_DISABLE) { + gpio_disable_pulls(pin->hw.pin); + } else if (pull == McuGPIO_PULL_UP) { + gpio_pull_up(pin->hw.pin); + } else if (pull == McuGPIO_PULL_DOWN) { + gpio_pull_down(pin->hw.pin); + } +#elif McuLib_CONFIG_CPU_IS_MCX + port_pin_config_t config = { + .pullSelect=kPORT_PullDisable, + /* Low internal pull resistor value is selected. */ + .pullValueSelect = kPORT_LowPullResistor, + /* Fast slew rate is configured */ + .slewRate=kPORT_FastSlewRate, + /* Passive input filter is disabled */ + .passiveFilterEnable=kPORT_PassiveFilterDisable, + /* Open drain output is disabled */ + .openDrainEnable=kPORT_OpenDrainDisable, + /* Low drive strength is configured */ + .driveStrength=kPORT_LowDriveStrength, + /* Pin is configured as PIO0_10 */ + .mux=kPORT_MuxAlt0, + /* Digital input enabled */ + .inputBuffer=kPORT_InputBufferEnable, + /* Digital input is not inverted */ + .invertInput=kPORT_InputNormal, + /* Pin Control Register fields [15:0] are not locked */ + .lockRegister=kPORT_UnlockRegister + }; + if (pull == McuGPIO_PULL_DISABLE) { + config.pullSelect = kPORT_PullDisable; /* inactive */ + } else if (pull == McuGPIO_PULL_UP) { + config.pullSelect = kPORT_PullUp; /* pull-up */ + } else if (pull == McuGPIO_PULL_DOWN) { + config.pullSelect = kPORT_PullDown; /* pull-down */ + } else { /* default */ + config.pullSelect = kPORT_PullDisable; /* inactive */ + } + PORT_SetPinConfig(pin->hw.port, pin->hw.pin, (const port_pin_config_t*)&config); +#endif +} + +void McuGPIO_Init(void) { + /* nothing to do */ +} + +void McuGPIO_Deinit(void) { + /* nothing to do */ +} diff --git a/TSM_PicoW_Sensor/McuLib/src/McuGPIO.h b/TSM_PicoW_Sensor/McuLib/src/McuGPIO.h new file mode 100644 index 0000000..f6d080b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuGPIO.h @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2019-2021, Erich Styger + * All rights reserved. + * + * Driver for GPIO pins + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef McuGPIO_H_ +#define McuGPIO_H_ + +#include +#include +#include "McuLib.h" +#if McuLib_CONFIG_NXP_SDK_USED + #include "fsl_gpio.h" + #if McuLib_CONFIG_IS_KINETIS_KE + #include "fsl_port.h" + #elif McuLib_CONFIG_CPU_IS_IMXRT + #include "fsl_iomuxc.h" + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + #include +#elif McuLib_CONFIG_CPU_IS_STM32 + #include "stm32f3xx_hal.h" +#elif McuLib_CONFIG_CPU_IS_ESP32 + #include "driver/gpio.h" +#elif McuLib_CONFIG_CPU_IS_RPxxxx + #include "hardware/gpio.h" +#endif +#include "McuLibconfig.h" +#include "McuGPIOconfig.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum McuGPIO_PullType { + McuGPIO_PULL_DISABLE, + McuGPIO_PULL_UP, + McuGPIO_PULL_DOWN, +} McuGPIO_PullType; + +typedef struct McuGPIO_Dummy_s { int dummy; } McuGPIO_Dummy_s; /*!< using a pointer to a struct instead a pointer to void for handle, used for handle type 'safety' only */ + +typedef McuGPIO_Dummy_s *McuGPIO_Handle_t; /*!< GPIO handle type */ + +typedef struct McuGPIO_HwPin_t { +#if McuLib_CONFIG_NXP_SDK_USED && !McuLib_CONFIG_IS_KINETIS_KE + GPIO_Type *gpio; /* pointer to GPIO */ +#elif McuLib_CONFIG_CPU_IS_STM32 + GPIO_TypeDef *gpio; +#elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + struct gpiod_chip *chip; /* must be retrieved once, e.g.e with gpiod_chip_open_by_name("gpiochip0") */ + const char *name; /* assigned name for the pin */ +#endif +#if McuLib_CONFIG_CPU_IS_KINETIS + PORT_Type *port; /* pointer to port, e.g. PORTA, for KE this is PORT */ + #if McuLib_CONFIG_IS_KINETIS_KE + port_type_t portType; /* e.g. kPORT_PTH */ + gpio_port_num_t portNum; /* e.g. kGPIO_PORTH */ + #endif +#elif McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0 + uint32_t port; /* port number */ + uint8_t iocon; /* I/O Connection index used for muxing, e.g. IOCON_INDEX_PIO0_0 */ +#elif McuLib_CONFIG_CPU_IS_LPC + uint32_t port; /* port number */ +#elif McuLib_CONFIG_CPU_IS_MCX + PORT_Type *port; /* e.g. PORT0 */ +#elif McuLib_CONFIG_CPU_IS_IMXRT + /* Information needed for IOMUXC_SetPinMux(), provided e.g. with IOMUXC_GPIO_AD_B0_09_GPIO1_IO09. + * Set it e.g. with + * McuGPIO_SetMux(&config.hw, IOMUXC_GPIO_AD_B0_09_GPIO1_IO09); + */ + struct { + uint32_t muxRegister; /* pin mux register */ + uint32_t muxMode; /* pin mux mode */ + uint32_t inputRegister; /* select input register */ + uint32_t inputDaisy; /* the input daisy */ + uint32_t configRegister; /* the configuration register */ + } mux; +#endif +#if McuLib_CONFIG_CPU_IS_ESP32 + gpio_num_t pin; /* pin number, e.g. GPIO_NUM_10 */ +#else + uint32_t pin; /* pin number */ +#endif + McuGPIO_PullType pull; /* pull resistor configuration */ +} McuGPIO_HwPin_t; + +typedef struct McuGPIO_Config_t { + bool isInput; + bool isHighOnInit; + McuGPIO_HwPin_t hw; +} McuGPIO_Config_t; + +#if McuLib_CONFIG_CPU_IS_IMXRT + /*! + * \brief Used to set the Muxing configuration. + * Usage: McuGPIO_SetMux(&config.hw, IOMUXC_GPIO_AD_B0_09_GPIO1_IO09); + * @param hw Pointer to hardware struct + * @param muxRegister The muxing register + * @param muxMode The muxing mode + * @param inputRegister The input register, 0 for not used + * @param inputDaisy The input daisy value + * @param configRegister The configuration register + */ + void McuGPIO_SetMux(McuGPIO_HwPin_t *hw, uint32_t muxRegister, uint32_t muxMode, uint32_t inputRegister, uint32_t inputDaisy, uint32_t configRegister); +#endif + +void McuGPIO_GetDefaultConfig(McuGPIO_Config_t *config); + +McuGPIO_Handle_t McuGPIO_InitGPIO(McuGPIO_Config_t *config); + +McuGPIO_Handle_t McuGPIO_DeinitGPIO(McuGPIO_Handle_t gpio); + +void McuGPIO_SetAsInput(McuGPIO_Handle_t gpio); +void McuGPIO_SetAsOutput(McuGPIO_Handle_t gpio, bool setHigh); +bool McuGPIO_IsInput(McuGPIO_Handle_t gpio); +bool McuGPIO_IsOutput(McuGPIO_Handle_t gpio); +void McuGPIO_SetLow(McuGPIO_Handle_t gpio); +void McuGPIO_SetHigh(McuGPIO_Handle_t gpio); +void McuGPIO_Toggle(McuGPIO_Handle_t gpio); +bool McuGPIO_IsLow(McuGPIO_Handle_t gpio); +bool McuGPIO_IsHigh(McuGPIO_Handle_t gpio); +void McuGPIO_SetValue(McuGPIO_Handle_t gpio, bool val); +bool McuGPIO_GetValue(McuGPIO_Handle_t gpio); + +void McuGPIO_GetPinStatusString(McuGPIO_Handle_t gpio, unsigned char *buf, size_t bufSize); + +void McuGPIO_SetPullResistor(McuGPIO_Handle_t gpio, McuGPIO_PullType pull); + +/* driver initialization */ +void McuGPIO_Init(void); + +/* driver de-initialization */ +void McuGPIO_Deinit(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* McuGPIO_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuGenericI2C.c b/TSM_PicoW_Sensor/McuLib/src/McuGenericI2C.c new file mode 100644 index 0000000..d89a749 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuGenericI2C.c @@ -0,0 +1,807 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuGenericI2C.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GenericI2C +** Version : Component 01.052, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-08-05, 17:56, # CodeGen: 845 +** Abstract : +** This component implements a generic I2C driver wrapper to work both with LDD and non-LDD I2C components. +** Settings : +** Component name : McuGenericI2C +** Wait : McuWait +** Support STOP_NOSTART : no +** Write Buffer Size : 32 +** non-LDD I2C : Enabled +** I2C : McuGenericSWI2C +** LDD I2C : Disabled +** RTOS : Enabled +** RTOS : McuRTOS +** Semaphore : no +** Init() on startup : yes +** Contents : +** SelectSlave - uint8_t McuGenericI2C_SelectSlave(uint8_t i2cAddr); +** UnselectSlave - uint8_t McuGenericI2C_UnselectSlave(void); +** RequestBus - void McuGenericI2C_RequestBus(void); +** ReleaseBus - void McuGenericI2C_ReleaseBus(void); +** WriteBlock - uint8_t McuGenericI2C_WriteBlock(void* data, uint16_t dataSize,... +** ReadBlock - uint8_t McuGenericI2C_ReadBlock(void* data, uint16_t dataSize,... +** ReadBlockGeneric - uint8_t McuGenericI2C_ReadBlockGeneric(void* data, uint16_t dataSize,... +** ReadAddressWait - uint8_t McuGenericI2C_ReadAddressWait(uint8_t i2cAddr, uint8_t *memAddr,... +** ReadAddress - uint8_t McuGenericI2C_ReadAddress(uint8_t i2cAddr, uint8_t *memAddr, uint8_t... +** WriteAddress - uint8_t McuGenericI2C_WriteAddress(uint8_t i2cAddr, uint8_t *memAddr, uint8_t... +** ReadByte - uint8_t McuGenericI2C_ReadByte(uint8_t i2cAddr, uint8_t *data); +** WriteByte - uint8_t McuGenericI2C_WriteByte(uint8_t i2cAddr, uint8_t data); +** ReadByteAddress8 - uint8_t McuGenericI2C_ReadByteAddress8(uint8_t i2cAddr, uint8_t memAddr,... +** WriteByteAddress8 - uint8_t McuGenericI2C_WriteByteAddress8(uint8_t i2cAddr, uint8_t memAddr,... +** ReadWordAddress8 - uint8_t McuGenericI2C_ReadWordAddress8(uint8_t i2cAddr, uint8_t memAddr,... +** WriteWordAddress8 - uint8_t McuGenericI2C_WriteWordAddress8(uint8_t i2cAddr, uint8_t memAddr,... +** ProbeACK - uint8_t McuGenericI2C_ProbeACK(void* data, uint16_t dataSize,... +** GetSemaphore - void* McuGenericI2C_GetSemaphore(void); +** ScanDevice - uint8_t McuGenericI2C_ScanDevice(uint8_t i2cAddr); +** Deinit - void McuGenericI2C_Deinit(void); +** Init - void McuGenericI2C_Init(void); +** +** * Copyright (c) 2013-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuGenericI2C.h +** @version 01.00 +** @brief +** This component implements a generic I2C driver wrapper to work both with LDD and non-LDD I2C components. +*/ +/*! +** @addtogroup McuGenericI2C_module McuGenericI2C module documentation +** @{ +*/ + +/* MODULE McuGenericI2C. */ + +#include "McuGenericI2C.h" +#include "McuWait.h" +#include "McuRTOS.h" +#include "McuGenericSWI2C.h" +#if McuGenericI2C_CONFIG_USE_TIMEOUT + #include "McuTimeout.h" +#endif + +#ifndef NULL + #define NULL 0L +#endif /* NULL */ + +#if McuGenericI2C_CONFIG_USE_TIMEOUT + #define TIMEOUT_COUNTER_HANDLE McuTimeout_CounterHandle + #define TIMEOUT_GET_COUNTER McuTimeout_GetCounter + #define TIMEOUT_LEAVE_COUNTER McuTimeout_LeaveCounter + #define TIMEOUT_COUNTER_EXPIRED McuTimeout_CounterExpired + #define TIMEOUT_OUT_OF_HANDLE McuTimeout_OUT_OF_HANDLE + #define McuGenericI2C_TIMEOUT_NOF_TICKS(factor) ((McuGenericI2C_CONFIG_TIMEOUT_US*(factor))/1000/McuTimeout_TICK_PERIOD_MS) + #define McuGenericI2C_TIMEOUT_TICKS(factor) (McuGenericI2C_TIMEOUT_NOF_TICKS(factor)>0?McuGenericI2C_TIMEOUT_NOF_TICKS(factor):1) /* at least one tick */ +#endif + + +#if McuGenericI2C_CONFIG_USE_MUTEX +static SemaphoreHandle_t McuGenericI2C_busSem = NULL; /* Semaphore to protect I2C bus access */ +#endif +/* +** =================================================================== +** Method : RequestBus (component GenericI2C) +** +** Description : +** Starts a critical section for accessing the bus. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuGenericI2C_RequestBus(void) +{ + /*lint -save -e522 function lacks side effect */ +#if McuGenericI2C_CONFIG_USE_ON_REQUEST_BUS_EVENT + McuGenericI2C_CONFIG_ON_REQUEST_BUS_EVENT(); +#endif + /*lint -restore */ +#if McuGenericI2C_CONFIG_USE_MUTEX + (void)xSemaphoreTakeRecursive(McuGenericI2C_busSem, portMAX_DELAY); +#endif +} + +/* +** =================================================================== +** Method : ReleaseBus (component GenericI2C) +** +** Description : +** Finishes a critical section for accessing the bus. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuGenericI2C_ReleaseBus(void) +{ +#if McuGenericI2C_CONFIG_USE_MUTEX + (void)xSemaphoreGiveRecursive(McuGenericI2C_busSem); +#endif + /*lint -save -e522 function lacks side effect */ +#if McuGenericI2C_CONFIG_USE_ON_RELEASE_BUS_EVENT + McuGenericI2C_CONFIG_ON_RELEASE_BUS_EVENT(); +#endif + /*lint -restore */ +} + +/* +** =================================================================== +** Method : SelectSlave (component GenericI2C) +** +** Description : +** Selects the slave device on the bus. Method might use a +** semaphore to protect bus access. +** Parameters : +** NAME - DESCRIPTION +** i2cAddr - I2C Address of device +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuGenericI2C_SelectSlave(uint8_t i2cAddr) +{ + McuGenericI2C_RequestBus(); + if (McuGenericI2C_CONFIG_SELECT_SLAVE(i2cAddr)!=ERR_OK) { + McuGenericI2C_ReleaseBus(); + #if McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT + McuGenericI2C_CONFIG_ON_ERROR_EVENT(); + #endif + return ERR_FAILED; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : UnselectSlave (component GenericI2C) +** +** Description : +** Unselects the device. Method will release a used a semaphore. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuGenericI2C_UnselectSlave(void) +{ + McuGenericI2C_ReleaseBus(); + return ERR_OK; +} + +/* +** =================================================================== +** Method : ReadBlockGeneric (component GenericI2C) +** +** Description : +** Read from the device a block with using additional control +** and flags. +** Parameters : +** NAME - DESCRIPTION +** * data - Read buffer +** dataSize - Size of read buffer +** flagsSend - flags for the send transaction +** flagsStart - Start flags +** flagsAck - Acknowledge flags +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuGenericI2C_ReadBlockGeneric(void* data, uint16_t dataSize, McuGenericI2C_EnumSendFlags flags, McuGenericI2C_EnumStartFlags flagsStart, McuGenericI2C_EnumAckFlags flagsAck) +{ + uint8_t res = ERR_OK; + +#if McuGenericI2C_CONFIG_RECV_BLOCK_CUSTOM_AVAILABLE + for(;;) { /* breaks */ + uint16_t nof; + + res = McuGenericI2C_CONFIG_RECV_BLOCK_CUSTOM(data, dataSize, &nof, flagsStart, flagsAck); + if (res!=ERR_OK) { + #if McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT + McuGenericI2C_CONFIG_ON_ERROR_EVENT(); + #endif + break; /* break for(;;) */ + } + if (flags==McuGenericI2C_SEND_STOP) { + res = McuGenericI2C_CONFIG_SEND_STOP(); + if (res!=ERR_OK) { + #if McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT + McuGenericI2C_CONFIG_ON_ERROR_EVENT(); + #endif + break; /* break for(;;) */ + } + } + break; /* break for(;;) */ + } /* for(;;) */ +#else + return ERR_FAILED; /* RecvBlockCustom() is not available (e.g. not available in the Hardware I2C component */ +#endif + return res; +} + +/* +** =================================================================== +** Method : ReadBlock (component GenericI2C) +** +** Description : +** Read from the device a block. +** Parameters : +** NAME - DESCRIPTION +** * data - Read buffer +** dataSize - Size of read buffer +** flags - flags for the transaction +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuGenericI2C_ReadBlock(void* data, uint16_t dataSize, McuGenericI2C_EnumSendFlags flags) +{ + uint8_t res = ERR_OK; + uint16_t nof; + + for(;;) { /* breaks */ + res = McuGenericI2C_CONFIG_RECV_BLOCK(data, dataSize, &nof); + if (res!=ERR_OK) { + #if McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT + McuGenericI2C_CONFIG_ON_ERROR_EVENT(); + #endif + break; /* break for(;;) */ + } + if (flags==McuGenericI2C_SEND_STOP) { + res = McuGenericI2C_CONFIG_SEND_STOP(); + if (res!=ERR_OK) { + #if McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT + McuGenericI2C_CONFIG_ON_ERROR_EVENT(); + #endif + break; /* break for(;;) */ + } + } + break; /* break for(;;) */ + } /* for(;;) */ + return res; +} + +/* +** =================================================================== +** Method : WriteBlock (component GenericI2C) +** +** Description : +** Write a block to the device. +** Parameters : +** NAME - DESCRIPTION +** * data - Data write buffer +** dataSize - +** flags - flags for the transaction +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuGenericI2C_WriteBlock(void* data, uint16_t dataSize, McuGenericI2C_EnumSendFlags flags) +{ + uint16_t nof; + uint8_t res = ERR_OK; + + for(;;) { /* breaks */ +#if McuGenericI2C_CONFIG_SUPPORT_STOP_NO_START + if (McuGenericI2C_STOP_NOSTART==flags) { + res = McuGenericI2C_CONFIG_SEND_BLOCK_CONTINUE(data, dataSize, &nof); + } else { + res = McuGenericI2C_CONFIG_SEND_BLOCK(data, dataSize, &nof); + } +#else + res = McuGenericI2C_CONFIG_SEND_BLOCK(data, dataSize, &nof); +#endif + if (res!=ERR_OK) { + (void)McuGenericI2C_CONFIG_SEND_STOP(); + #if McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT + McuGenericI2C_CONFIG_ON_ERROR_EVENT(); + #endif + break; /* break for(;;) */ + } + if (flags==McuGenericI2C_SEND_STOP || (flags==McuGenericI2C_STOP_NOSTART)) { + res = McuGenericI2C_CONFIG_SEND_STOP(); + if (res!=ERR_OK) { + #if McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT + McuGenericI2C_CONFIG_ON_ERROR_EVENT(); + #endif + break; /* break for(;;) */ + } + } + break; /* break for(;;) */ + } /* for(;;) */ + return res; +} + +/* +** =================================================================== +** Method : ReadAddressWait (component GenericI2C) +** +** Description : +** Same as ReadAddress, but with an optional wait between the +** address and read. Read from the device. This writes +** (S+i2cAddr+0), (memAddr), (Sr+i2cAddr+1), (data)...(data+P) +** Parameters : +** NAME - DESCRIPTION +** i2cAddr - I2C Address of device +** * memAddr - Pointer to device memory address +** memAddrSize - number of address bytes +** waitMs - Wait time between the address part +** and reading the data part. Wait time can be +** zero. +** * data - Pointer to read buffer +** dataSize - Size of read buffer +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuGenericI2C_ReadAddressWait(uint8_t i2cAddr, uint8_t *memAddr, uint8_t memAddrSize, uint16_t waitMs, uint8_t *data, uint16_t dataSize) +{ + uint8_t res = ERR_OK; + uint16_t nof; + + if (McuGenericI2C_SelectSlave(i2cAddr)!=ERR_OK) { + #if McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT + McuGenericI2C_CONFIG_ON_ERROR_EVENT(); + #endif + return ERR_FAILED; + } + for(;;) { /* breaks */ + if(memAddr!=NULL) { /* only if we want to send an address */ + res = McuGenericI2C_CONFIG_SEND_BLOCK((void*)memAddr, memAddrSize, &nof); + if (res!=ERR_OK) { + (void)McuGenericI2C_CONFIG_SEND_STOP(); + #if McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT + McuGenericI2C_CONFIG_ON_ERROR_EVENT(); + #endif + break; /* break for(;;) */ + } + } + /* optional wait time */ + if (waitMs!=0) { + McuWait_WaitOSms(waitMs); + } + if (data!=NULL) { + /* receive data */ + res = McuGenericI2C_CONFIG_RECV_BLOCK(data, dataSize, &nof); + if (res!=ERR_OK) { + (void)McuGenericI2C_CONFIG_SEND_STOP(); + #if McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT + McuGenericI2C_CONFIG_ON_ERROR_EVENT(); + #endif + break; /* break for(;;) */ + } + res = McuGenericI2C_CONFIG_SEND_STOP(); + if (res!=ERR_OK) { + #if McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT + McuGenericI2C_CONFIG_ON_ERROR_EVENT(); + #endif + break; /* break for(;;) */ + } + } /* if receive data */ + break; /* break for(;;) */ + } /* for(;;) */ + if (McuGenericI2C_UnselectSlave()!=ERR_OK) { + #if McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT + McuGenericI2C_CONFIG_ON_ERROR_EVENT(); + #endif + return ERR_FAILED; + } + return res; +} + +/* +** =================================================================== +** Method : ReadAddress (component GenericI2C) +** +** Description : +** Read from the device. This writes (S+i2cAddr+0), (memAddr), +** (Sr+i2cAddr+1), (data)...(data+P) +** Parameters : +** NAME - DESCRIPTION +** i2cAddr - I2C Address of device +** * memAddr - Pointer to device memory address +** memAddrSize - number of address bytes +** * data - Pointer to read buffer +** dataSize - Size of read buffer +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuGenericI2C_ReadAddress(uint8_t i2cAddr, uint8_t *memAddr, uint8_t memAddrSize, uint8_t *data, uint16_t dataSize) +{ + return McuGenericI2C_ReadAddressWait(i2cAddr, memAddr, memAddrSize, 0, data, dataSize); +} + +/* +** =================================================================== +** Method : WriteAddress (component GenericI2C) +** +** Description : +** Write to the device: (S+i2cAddr+0), (memAddr), (data)... +** (data+P) +** Parameters : +** NAME - DESCRIPTION +** i2cAddr - I2C address of device +** * memAddr - Pointer to device memory address +** memAddrSize - number of address bytes +** * data - Pointer to data write buffer +** dataSize - Size of data buffer in bytes +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuGenericI2C_WriteAddress(uint8_t i2cAddr, uint8_t *memAddr, uint8_t memAddrSize, uint8_t *data, uint16_t dataSize) +{ + static uint8_t writeBuf[McuGenericI2C_WRITE_BUFFER_SIZE]; + uint8_t *p; + uint16_t i; + uint16_t nof; + uint8_t res = ERR_OK; + + if (McuGenericI2C_SelectSlave(i2cAddr)!=ERR_OK) { + #if McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT + McuGenericI2C_CONFIG_ON_ERROR_EVENT(); + #endif + return ERR_FAILED; + } + if (memAddrSize+dataSize>McuGenericI2C_WRITE_BUFFER_SIZE) { + #if McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT + McuGenericI2C_CONFIG_ON_ERROR_EVENT(); + #endif + return ERR_FAILED; + } + i = 0; p = memAddr; + while(i0) { + writeBuf[i++] = *p++; + memAddrSize--; + } + p = data; + while(i0) { + writeBuf[i++] = *p++; + dataSize--; + } + for(;;) { /* breaks */ + res = McuGenericI2C_CONFIG_SEND_BLOCK((void*)writeBuf, i, &nof); + if (res!=ERR_OK) { + (void)McuGenericI2C_CONFIG_SEND_STOP(); + #if McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT + McuGenericI2C_CONFIG_ON_ERROR_EVENT(); + #endif + break; /* break for(;;) */ + } + res = McuGenericI2C_CONFIG_SEND_STOP(); + if (res!=ERR_OK) { + #if McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT + McuGenericI2C_CONFIG_ON_ERROR_EVENT(); + #endif + break; /* break for(;;) */ + } + break; /* break for(;;) */ + } /* for(;;) */ + if (McuGenericI2C_UnselectSlave()!=ERR_OK) { + #if McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT + McuGenericI2C_CONFIG_ON_ERROR_EVENT(); + #endif + return ERR_FAILED; + } + return res; +} + +/* +** =================================================================== +** Method : Init (component GenericI2C) +** +** Description : +** Initializes the driver. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuGenericI2C_Init(void) +{ +#if McuGenericI2C_CONFIG_USE_MUTEX + McuGenericI2C_busSem = xSemaphoreCreateRecursiveMutex(); + if (McuGenericI2C_busSem==NULL) { /* semaphore creation failed */ + #if McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT + McuGenericI2C_CONFIG_ON_ERROR_EVENT(); + #endif + for(;;) {} /* error, not enough memory? */ + } + vQueueAddToRegistry(McuGenericI2C_busSem, "McuGenericI2C_Mutex"); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component GenericI2C) +** +** Description : +** Deinitializes the driver. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuGenericI2C_Deinit(void) +{ +#if McuGenericI2C_CONFIG_USE_MUTEX + vQueueUnregisterQueue(McuGenericI2C_busSem); + vSemaphoreDelete(McuGenericI2C_busSem); + McuGenericI2C_busSem = NULL; +#endif +} + +/* +** =================================================================== +** Method : GetSemaphore (component GenericI2C) +** +** Description : +** Returns the currently allocated semaphore. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +void* McuGenericI2C_GetSemaphore(void) +{ +#if McuGenericI2C_CONFIG_USE_MUTEX + return McuGenericI2C_busSem; +#else + return NULL; /* RTOS and Semaphore enabled in properties */ +#endif +} + +/* +** =================================================================== +** Method : ReadByteAddress8 (component GenericI2C) +** +** Description : +** Read a byte from the device using an 8bit memory address. +** This writes (S+i2cAddr+0), (memAddr), (Sr+i2cAddr+1), (data).. +** .(data+P) +** Parameters : +** NAME - DESCRIPTION +** i2cAddr - I2C Address of device +** memAddr - Device memory address +** * data - Pointer to read buffer (single byte) +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuGenericI2C_ReadByteAddress8(uint8_t i2cAddr, uint8_t memAddr, uint8_t *data) +{ + return McuGenericI2C_ReadAddress(i2cAddr, &memAddr, sizeof(memAddr), data, 1); +} + +/* +** =================================================================== +** Method : WriteByteAddress8 (component GenericI2C) +** +** Description : +** Write a byte to the device using an 8bit memory address: +** (S+i2cAddr+0), (memAddr), (data)...(data+P) +** Parameters : +** NAME - DESCRIPTION +** i2cAddr - I2C address of device +** memAddr - Device memory address +** data - Data value +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuGenericI2C_WriteByteAddress8(uint8_t i2cAddr, uint8_t memAddr, uint8_t data) +{ + return McuGenericI2C_WriteAddress(i2cAddr, &memAddr, sizeof(memAddr), &data, sizeof(data)); +} + +/* +** =================================================================== +** Method : ReadWordAddress8 (component GenericI2C) +** +** Description : +** Read a word from the device using an 8bit memory address. +** This writes (S+i2cAddr+0), (memAddr), (Sr+i2cAddr+1), (data).. +** .(data+P) +** Parameters : +** NAME - DESCRIPTION +** i2cAddr - I2C Address of device +** memAddr - Device memory address +** * data - Pointer to read buffer (single byte) +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuGenericI2C_ReadWordAddress8(uint8_t i2cAddr, uint8_t memAddr, uint16_t *data) +{ + return McuGenericI2C_ReadAddress(i2cAddr, &memAddr, sizeof(memAddr), (uint8_t*)data, 2); +} + +/* +** =================================================================== +** Method : WriteWordAddress8 (component GenericI2C) +** +** Description : +** Write a word to the device using an 8bit memory address: +** (S+i2cAddr+0), (memAddr), (data)...(data+P) +** Parameters : +** NAME - DESCRIPTION +** i2cAddr - I2C address of device +** memAddr - Device memory address +** data - Data value +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuGenericI2C_WriteWordAddress8(uint8_t i2cAddr, uint8_t memAddr, uint16_t data) +{ + return McuGenericI2C_WriteAddress(i2cAddr, &memAddr, sizeof(memAddr), (uint8_t*)&data, sizeof(data)); +} + +/* +** =================================================================== +** Method : ScanDevice (component GenericI2C) +** +** Description : +** Checks if a device responds on the bus with an ACK. +** Parameters : +** NAME - DESCRIPTION +** i2cAddr - 7bit I2C device address +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuGenericI2C_ScanDevice(uint8_t i2cAddr) +{ + uint8_t res = ERR_OK; + uint16_t nof; + uint8_t dummy; + + if (McuGenericI2C_SelectSlave(i2cAddr)!=ERR_OK) { + return ERR_FAILED; + } + for(;;) { /* breaks */ + res = McuGenericI2C_CONFIG_RECV_BLOCK((void*)&dummy, 1, &nof); + if (res!=ERR_OK) { + (void)McuGenericI2C_CONFIG_SEND_STOP(); + #if McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT + McuGenericI2C_CONFIG_ON_ERROR_EVENT(); + #endif + break; /* break for(;;) */ + } + res = McuGenericI2C_CONFIG_SEND_STOP(); + if (res!=ERR_OK) { + #if McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT + McuGenericI2C_CONFIG_ON_ERROR_EVENT(); + #endif + break; /* break for(;;) */ + } + break; /* break for(;;) */ + } /* for(;;) */ + if (McuGenericI2C_UnselectSlave()!=ERR_OK) { + #if McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT + McuGenericI2C_CONFIG_ON_ERROR_EVENT(); + #endif + return ERR_FAILED; + } + return res; +} + +/* +** =================================================================== +** Method : ProbeACK (component GenericI2C) +** +** Description : +** Accesses the bus to check if the device responds with an ACK +** (ACK polling). +** Parameters : +** NAME - DESCRIPTION +** * data - Data write buffer +** dataSize - +** flags - flags for the transaction +** WaitTimeUS - Waiting time in microseconds +** to wait for the ACK on the bus. +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuGenericI2C_ProbeACK(void* data, uint16_t dataSize, McuGenericI2C_EnumSendFlags flags, uint16_t WaitTimeUS) +{ + uint16_t nof; + uint8_t res = ERR_OK; + + (void)WaitTimeUS; /* not used */ + for(;;) { /* breaks */ + res = McuGenericI2C_CONFIG_SEND_BLOCK(data, dataSize, &nof); + if (res!=ERR_OK) { + (void)McuGenericI2C_CONFIG_SEND_STOP(); + #if McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT + McuGenericI2C_CONFIG_ON_ERROR_EVENT(); + #endif + break; /* break for(;;) */ + } + if (flags==McuGenericI2C_SEND_STOP) { + res = McuGenericI2C_CONFIG_SEND_STOP(); + if (res!=ERR_OK) { + #if McuGenericI2C_CONFIG_USE_ON_ERROR_EVENT + McuGenericI2C_CONFIG_ON_ERROR_EVENT(); + #endif + break; /* break for(;;) */ + } + } + break; /* break for(;;) */ + } /* for(;;) */ + return res; +} + +/* +** =================================================================== +** Method : ReadByte (component GenericI2C) +** +** Description : +** Read a byte from the device. This writes (S+i2cAddr+0), +** (Sr+i2cAddr+1),(data+P) +** Parameters : +** NAME - DESCRIPTION +** i2cAddr - I2C Address of device +** * data - Pointer to read buffer (single byte) +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuGenericI2C_ReadByte(uint8_t i2cAddr, uint8_t *data) +{ + return McuGenericI2C_ReadAddress(i2cAddr, NULL, 0, data, 1); +} + +/* +** =================================================================== +** Method : WriteByte (component GenericI2C) +** +** Description : +** Write a byte to the device: (S+i2cAddr+0).(data+P) +** Parameters : +** NAME - DESCRIPTION +** i2cAddr - I2C address of device +** data - Data value +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuGenericI2C_WriteByte(uint8_t i2cAddr, uint8_t data) +{ + return McuGenericI2C_WriteAddress(i2cAddr, NULL, 0, &data, 1); +} + +/* END McuGenericI2C. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuGenericI2C.h b/TSM_PicoW_Sensor/McuLib/src/McuGenericI2C.h new file mode 100644 index 0000000..1bb63ce --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuGenericI2C.h @@ -0,0 +1,475 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuGenericI2C.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GenericI2C +** Version : Component 01.052, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-08-05, 17:56, # CodeGen: 845 +** Abstract : +** This component implements a generic I2C driver wrapper to work both with LDD and non-LDD I2C components. +** Settings : +** Component name : McuGenericI2C +** Wait : McuWait +** Support STOP_NOSTART : no +** Write Buffer Size : 32 +** non-LDD I2C : Enabled +** I2C : McuGenericSWI2C +** LDD I2C : Disabled +** RTOS : Enabled +** RTOS : McuRTOS +** Semaphore : no +** Init() on startup : yes +** Contents : +** SelectSlave - uint8_t McuGenericI2C_SelectSlave(uint8_t i2cAddr); +** UnselectSlave - uint8_t McuGenericI2C_UnselectSlave(void); +** RequestBus - void McuGenericI2C_RequestBus(void); +** ReleaseBus - void McuGenericI2C_ReleaseBus(void); +** WriteBlock - uint8_t McuGenericI2C_WriteBlock(void* data, uint16_t dataSize,... +** ReadBlock - uint8_t McuGenericI2C_ReadBlock(void* data, uint16_t dataSize,... +** ReadBlockGeneric - uint8_t McuGenericI2C_ReadBlockGeneric(void* data, uint16_t dataSize,... +** ReadAddressWait - uint8_t McuGenericI2C_ReadAddressWait(uint8_t i2cAddr, uint8_t *memAddr,... +** ReadAddress - uint8_t McuGenericI2C_ReadAddress(uint8_t i2cAddr, uint8_t *memAddr, uint8_t... +** WriteAddress - uint8_t McuGenericI2C_WriteAddress(uint8_t i2cAddr, uint8_t *memAddr, uint8_t... +** ReadByte - uint8_t McuGenericI2C_ReadByte(uint8_t i2cAddr, uint8_t *data); +** WriteByte - uint8_t McuGenericI2C_WriteByte(uint8_t i2cAddr, uint8_t data); +** ReadByteAddress8 - uint8_t McuGenericI2C_ReadByteAddress8(uint8_t i2cAddr, uint8_t memAddr,... +** WriteByteAddress8 - uint8_t McuGenericI2C_WriteByteAddress8(uint8_t i2cAddr, uint8_t memAddr,... +** ReadWordAddress8 - uint8_t McuGenericI2C_ReadWordAddress8(uint8_t i2cAddr, uint8_t memAddr,... +** WriteWordAddress8 - uint8_t McuGenericI2C_WriteWordAddress8(uint8_t i2cAddr, uint8_t memAddr,... +** ProbeACK - uint8_t McuGenericI2C_ProbeACK(void* data, uint16_t dataSize,... +** GetSemaphore - void* McuGenericI2C_GetSemaphore(void); +** ScanDevice - uint8_t McuGenericI2C_ScanDevice(uint8_t i2cAddr); +** Deinit - void McuGenericI2C_Deinit(void); +** Init - void McuGenericI2C_Init(void); +** +** * Copyright (c) 2013-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuGenericI2C.h +** @version 01.00 +** @brief +** This component implements a generic I2C driver wrapper to work both with LDD and non-LDD I2C components. +*/ +/*! +** @addtogroup McuGenericI2C_module McuGenericI2C module documentation +** @{ +*/ + +#ifndef __McuGenericI2C_H +#define __McuGenericI2C_H + +/* MODULE McuGenericI2C. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuGenericI2Cconfig.h" /* configuration */ + + +#ifdef __cplusplus +extern "C" { +#endif + +#define McuGenericI2C_WRITE_BUFFER_SIZE McuGenericI2C_CONFIG_WRITE_BUFFER_SIZE /* size of internal buffer used, set in the component properties */ + +typedef enum McuGenericI2C_EnumSendFlags_ { + McuGenericI2C_SEND_STOP, /* STOP is sent */ + McuGenericI2C_DO_NOT_SEND_STOP, /* STOP is not sent */ + McuGenericI2C_STOP_NOSTART /* send STOP without START condition */ +} McuGenericI2C_EnumSendFlags; + +typedef enum McuGenericI2C_EnumStartFlags_ { + McuGenericI2C_SEND_START, /* Start is sent */ + McuGenericI2C_DO_NOT_SEND_START /* Start is not sent */ +} McuGenericI2C_EnumStartFlags; + +typedef enum McuGenericI2C_EnumAckFlags_ { + McuGenericI2C_SEND_LAST_ACK, /* Nack after last received byte is sent */ + McuGenericI2C_DO_NOT_LAST_ACK /* Nack after last received byte is not sent */ +} McuGenericI2C_EnumAckFlags; + +void McuGenericI2C_Init(void); +/* +** =================================================================== +** Method : Init (component GenericI2C) +** +** Description : +** Initializes the driver. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuGenericI2C_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GenericI2C) +** +** Description : +** Deinitializes the driver. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuGenericI2C_ReadAddress(uint8_t i2cAddr, uint8_t *memAddr, uint8_t memAddrSize, uint8_t *data, uint16_t dataSize); +/* +** =================================================================== +** Method : ReadAddress (component GenericI2C) +** +** Description : +** Read from the device. This writes (S+i2cAddr+0), (memAddr), +** (Sr+i2cAddr+1), (data)...(data+P) +** Parameters : +** NAME - DESCRIPTION +** i2cAddr - I2C Address of device +** * memAddr - Pointer to device memory address +** memAddrSize - number of address bytes +** * data - Pointer to read buffer +** dataSize - Size of read buffer +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuGenericI2C_WriteAddress(uint8_t i2cAddr, uint8_t *memAddr, uint8_t memAddrSize, uint8_t *data, uint16_t dataSize); +/* +** =================================================================== +** Method : WriteAddress (component GenericI2C) +** +** Description : +** Write to the device: (S+i2cAddr+0), (memAddr), (data)... +** (data+P) +** Parameters : +** NAME - DESCRIPTION +** i2cAddr - I2C address of device +** * memAddr - Pointer to device memory address +** memAddrSize - number of address bytes +** * data - Pointer to data write buffer +** dataSize - Size of data buffer in bytes +** Returns : +** --- - Error code +** =================================================================== +*/ + +void* McuGenericI2C_GetSemaphore(void); +/* +** =================================================================== +** Method : GetSemaphore (component GenericI2C) +** +** Description : +** Returns the currently allocated semaphore. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuGenericI2C_ReadBlock(void* data, uint16_t dataSize, McuGenericI2C_EnumSendFlags flags); +/* +** =================================================================== +** Method : ReadBlock (component GenericI2C) +** +** Description : +** Read from the device a block. +** Parameters : +** NAME - DESCRIPTION +** * data - Read buffer +** dataSize - Size of read buffer +** flags - flags for the transaction +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuGenericI2C_WriteBlock(void* data, uint16_t dataSize, McuGenericI2C_EnumSendFlags flags); +/* +** =================================================================== +** Method : WriteBlock (component GenericI2C) +** +** Description : +** Write a block to the device. +** Parameters : +** NAME - DESCRIPTION +** * data - Data write buffer +** dataSize - +** flags - flags for the transaction +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuGenericI2C_RequestBus(void); +/* +** =================================================================== +** Method : RequestBus (component GenericI2C) +** +** Description : +** Starts a critical section for accessing the bus. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuGenericI2C_ReleaseBus(void); +/* +** =================================================================== +** Method : ReleaseBus (component GenericI2C) +** +** Description : +** Finishes a critical section for accessing the bus. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuGenericI2C_SelectSlave(uint8_t i2cAddr); +/* +** =================================================================== +** Method : SelectSlave (component GenericI2C) +** +** Description : +** Selects the slave device on the bus. Method might use a +** semaphore to protect bus access. +** Parameters : +** NAME - DESCRIPTION +** i2cAddr - I2C Address of device +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuGenericI2C_UnselectSlave(void); +/* +** =================================================================== +** Method : UnselectSlave (component GenericI2C) +** +** Description : +** Unselects the device. Method will release a used a semaphore. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuGenericI2C_ReadByteAddress8(uint8_t i2cAddr, uint8_t memAddr, uint8_t *data); +/* +** =================================================================== +** Method : ReadByteAddress8 (component GenericI2C) +** +** Description : +** Read a byte from the device using an 8bit memory address. +** This writes (S+i2cAddr+0), (memAddr), (Sr+i2cAddr+1), (data).. +** .(data+P) +** Parameters : +** NAME - DESCRIPTION +** i2cAddr - I2C Address of device +** memAddr - Device memory address +** * data - Pointer to read buffer (single byte) +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuGenericI2C_WriteByteAddress8(uint8_t i2cAddr, uint8_t memAddr, uint8_t data); +/* +** =================================================================== +** Method : WriteByteAddress8 (component GenericI2C) +** +** Description : +** Write a byte to the device using an 8bit memory address: +** (S+i2cAddr+0), (memAddr), (data)...(data+P) +** Parameters : +** NAME - DESCRIPTION +** i2cAddr - I2C address of device +** memAddr - Device memory address +** data - Data value +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuGenericI2C_ScanDevice(uint8_t i2cAddr); +/* +** =================================================================== +** Method : ScanDevice (component GenericI2C) +** +** Description : +** Checks if a device responds on the bus with an ACK. +** Parameters : +** NAME - DESCRIPTION +** i2cAddr - 7bit I2C device address +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuGenericI2C_ProbeACK(void* data, uint16_t dataSize, McuGenericI2C_EnumSendFlags flags, uint16_t WaitTimeUS); +/* +** =================================================================== +** Method : ProbeACK (component GenericI2C) +** +** Description : +** Accesses the bus to check if the device responds with an ACK +** (ACK polling). +** Parameters : +** NAME - DESCRIPTION +** * data - Data write buffer +** dataSize - +** flags - flags for the transaction +** WaitTimeUS - Waiting time in microseconds +** to wait for the ACK on the bus. +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuGenericI2C_ReadBlockGeneric(void* data, uint16_t dataSize, McuGenericI2C_EnumSendFlags flags, McuGenericI2C_EnumStartFlags flagsStart, McuGenericI2C_EnumAckFlags flagsAck); +/* +** =================================================================== +** Method : ReadBlockGeneric (component GenericI2C) +** +** Description : +** Read from the device a block with using additional control +** and flags. +** Parameters : +** NAME - DESCRIPTION +** * data - Read buffer +** dataSize - Size of read buffer +** flagsSend - flags for the send transaction +** flagsStart - Start flags +** flagsAck - Acknowledge flags +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuGenericI2C_ReadWordAddress8(uint8_t i2cAddr, uint8_t memAddr, uint16_t *data); +/* +** =================================================================== +** Method : ReadWordAddress8 (component GenericI2C) +** +** Description : +** Read a word from the device using an 8bit memory address. +** This writes (S+i2cAddr+0), (memAddr), (Sr+i2cAddr+1), (data).. +** .(data+P) +** Parameters : +** NAME - DESCRIPTION +** i2cAddr - I2C Address of device +** memAddr - Device memory address +** * data - Pointer to read buffer (single byte) +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuGenericI2C_WriteWordAddress8(uint8_t i2cAddr, uint8_t memAddr, uint16_t data); +/* +** =================================================================== +** Method : WriteWordAddress8 (component GenericI2C) +** +** Description : +** Write a word to the device using an 8bit memory address: +** (S+i2cAddr+0), (memAddr), (data)...(data+P) +** Parameters : +** NAME - DESCRIPTION +** i2cAddr - I2C address of device +** memAddr - Device memory address +** data - Data value +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuGenericI2C_ReadByte(uint8_t i2cAddr, uint8_t *data); +/* +** =================================================================== +** Method : ReadByte (component GenericI2C) +** +** Description : +** Read a byte from the device. This writes (S+i2cAddr+0), +** (Sr+i2cAddr+1),(data+P) +** Parameters : +** NAME - DESCRIPTION +** i2cAddr - I2C Address of device +** * data - Pointer to read buffer (single byte) +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuGenericI2C_WriteByte(uint8_t i2cAddr, uint8_t data); +/* +** =================================================================== +** Method : WriteByte (component GenericI2C) +** +** Description : +** Write a byte to the device: (S+i2cAddr+0).(data+P) +** Parameters : +** NAME - DESCRIPTION +** i2cAddr - I2C address of device +** data - Data value +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuGenericI2C_ReadAddressWait(uint8_t i2cAddr, uint8_t *memAddr, uint8_t memAddrSize, uint16_t waitMs, uint8_t *data, uint16_t dataSize); +/* +** =================================================================== +** Method : ReadAddressWait (component GenericI2C) +** +** Description : +** Same as ReadAddress, but with an optional wait between the +** address and read. Read from the device. This writes +** (S+i2cAddr+0), (memAddr), (Sr+i2cAddr+1), (data)...(data+P) +** Parameters : +** NAME - DESCRIPTION +** i2cAddr - I2C Address of device +** * memAddr - Pointer to device memory address +** memAddrSize - number of address bytes +** waitMs - Wait time between the address part +** and reading the data part. Wait time can be +** zero. +** * data - Pointer to read buffer +** dataSize - Size of read buffer +** Returns : +** --- - Error code +** =================================================================== +*/ + +/* END McuGenericI2C. */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif +/* ifndef __McuGenericI2C_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuGenericSWI2C.c b/TSM_PicoW_Sensor/McuLib/src/McuGenericSWI2C.c new file mode 100644 index 0000000..169375d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuGenericSWI2C.c @@ -0,0 +1,1044 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuGenericSWI2C.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GenericSWI2C +** Version : Component 01.028, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-09, 10:10, # CodeGen: 829 +** Abstract : +** +** Settings : +** Component name : McuGenericSWI2C +** Delay (ns) : 1250 +** Trials : 256 +** SDA : SDK_BitIO +** SCL : SDK_BitIO +** Wait : McuWait +** Yield : no +** Contents : +** ResetBus - bool McuGenericSWI2C_ResetBus(void); +** SendChar - uint8_t McuGenericSWI2C_SendChar(uint8_t Chr); +** RecvChar - uint8_t McuGenericSWI2C_RecvChar(uint8_t *Chr); +** SendBlock - uint8_t McuGenericSWI2C_SendBlock(void *Ptr, uint16_t Siz, uint16_t *Snt); +** SendBlockContinue - uint8_t McuGenericSWI2C_SendBlockContinue(void *Ptr, uint16_t Siz, uint16_t... +** RecvBlock - uint8_t McuGenericSWI2C_RecvBlock(void *Ptr, uint16_t Siz, uint16_t *Rcv); +** RecvBlockCustom - uint8_t McuGenericSWI2C_RecvBlockCustom(void *Ptr, uint16_t Siz, uint16_t... +** SendAck - void McuGenericSWI2C_SendAck(bool Ack); +** SendStop - uint8_t McuGenericSWI2C_SendStop(void); +** SelectSlave - uint8_t McuGenericSWI2C_SelectSlave(uint8_t Slv); +** GetSelected - uint8_t McuGenericSWI2C_GetSelected(uint8_t *Slv); +** Deinit - void McuGenericSWI2C_Deinit(void); +** Init - void McuGenericSWI2C_Init(void); +** +** * Copyright (c) 2014-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuGenericSWI2C.h +** @version 01.00 +** @brief +** +*/ +/*! +** @addtogroup McuGenericSWI2C_module McuGenericSWI2C module documentation +** @{ +*/ + +/* MODULE McuGenericSWI2C. */ + +#include "McuGenericSWI2C.h" +#include "McuWait.h" /* waiting routines */ +#include "McuLib.h" /* SDK defines */ +#include "SDA1.h" /* SDA pin */ +#include "SCL1.h" /* SCL pin */ + +/* Internal method prototypes */ +static void Delay(void); +static uint8_t Read(void); +static bool GetAck(void); +static void Write(uint8_t Data); +static void InternalStop(void); + + +#if McuLib_CONFIG_SDK_USE_FREERTOS + /* include RTOS header files */ + #include "FreeRTOS.h" /* for yielding */ + #include "task.h" +#endif + +#if McuLib_CONFIG_SDK_USE_FREERTOS && McuGenericSWI2C_CONFIG_DO_YIELD + #define McuGenericSWI2C_OSYIELD() taskYIELD() +#else + #define McuGenericSWI2C_OSYIELD() /* do nothing */ +#endif + +#define OUTPUT 1U +#define INPUT 0U +#define WRITE 0U +#define READ 1U + +static uint8_t SlaveAddr; /* destination slave address */ + +#define SCL_SetDir(dir) SCL1_SetDir(dir) +#define SCL_ClrVal() SCL1_ClrVal() +#define SCL_GetVal() SCL1_GetVal() + +#define SDA_SetDir(dir) SDA1_SetDir(dir) +#define SDA_ClrVal() SDA1_ClrVal() +#define SDA_GetVal() SDA1_GetVal() + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT + #define SCL_Init() /* Init does not exist with Processor Expert API */ + #define SCL_Deinit() /* Deinit does not exist with Processor Expert API */ + #define SDA_Init() /* Init does not exist with Processor Expert API */ + #define SDA_Deinit() /* Deinit does not exist with Processor Expert API */ +#else + #define SCL_Init() SCL1_Init() + #define SCL_Deinit() SCL1_Deinit() + #define SDA_Init() SDA1_Init() + #define SDA_Deinit() SDA1_Deinit() +#endif + +static uint8_t SendStart(void) { + uint16_t timeout; + + SDA_SetDir((bool)INPUT); /* SDA HIGH - START SETUP*/ + SCL_SetDir((bool)INPUT); /* CLOCK HIGH PULSE */ + Delay(); /* CLOCK HIGH PULSE & BUS FREE TIME */ + /* check that we have a valid start condition: SDA needs to be high */ + timeout = McuGenericSWI2C_CONFIG_TIMEOUT_COUNTER_VALUE; + while((SDA_GetVal()==0U)&&(timeout!=0U)) { /* WAIT FOR CLOCK HIGH PULSE */ + timeout--; + McuGenericSWI2C_OSYIELD(); + } + Delay(); + if (timeout==0) { + InternalStop(); + return ERR_BUSY; + } + SDA_SetDir((bool)OUTPUT); + SDA_ClrVal(); /* START CONDITION */ + Delay(); /* START HOLD TIME */ + SCL_SetDir((bool)OUTPUT); + SCL_ClrVal(); /* CLOCK LOW PULSE */ + Delay(); + return ERR_OK; +} + +uint8_t McuGenericSWI2C_GetDeviceID(uint8_t deviceAddr, uint32_t *pId) +{ + uint16_t Trial; + bool Acknowledge; + uint8_t id[3]; + const uint8_t reserved = 0b11111000; + + Trial = McuGenericSWI2C_CONFIG_NOF_TRIALS; + do { + if (SendStart()!=ERR_OK) { + return ERR_BUSY; + } + Write((uint8_t)(reserved + WRITE)); + Acknowledge = GetAck(); + Acknowledge = FALSE; + --Trial; + } while ((Trial != 0U) && Acknowledge); + if (Acknowledge) { /* WRONG ACKNOWLEDGE */ + SCL_SetDir((bool)OUTPUT); + SCL_ClrVal(); /* CLOCK LOW PULSE */ + InternalStop(); + return ERR_BUSY; + } else { + /* restart here: send a start */ + if (SendStart()!=ERR_OK) { + return ERR_BUSY; + } + SCL_SetDir((bool)OUTPUT); + SCL_ClrVal(); /* CLOCK LOW PULSE */ + Delay(); + } + Write((uint8_t)(reserved + READ)); + Delay(); + id[0] = Read(); + id[1] = Read(); + id[2] = Read(); + McuGenericSWI2C_SendAck((bool)McuGenericSWI2C_NOACK); + pId[0] = id[0]; + pId[1] = id[1]; + pId[2] = id[2]; + return ERR_OK; +} + +/* +** =================================================================== +** Method : Delay (component GenericSWI2C) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +static void Delay(void) +{ + McuGenericSWI2C_OSYIELD(); + McuWait_Waitns(McuGenericSWI2C_CONFIG_DELAY_NS); +} + +/* +** =================================================================== +** Method : Write (component GenericSWI2C) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +static void Write(uint8_t Data) +{ + uint8_t Shift; + uint8_t I; + uint16_t timeout; + + Shift = 0x80U; + for (I = 0x08U; I != 0U; I--) { + if (Data & Shift) { + SDA_SetDir((bool)INPUT); /* SDA HIGH */ + } else { + SDA_SetDir((bool)OUTPUT); + SDA_ClrVal(); /* SDA LOW */ + } + Delay(); + Shift = (uint8_t)(Shift >> 1); + SCL_SetDir((bool)INPUT); /* CLOCK HIGH PULSE */ + Delay(); + timeout = McuGenericSWI2C_CONFIG_TIMEOUT_COUNTER_VALUE; + while((SCL_GetVal()==0U)&&(timeout!=0U)) { /* WAIT FOR CLOCK HIGH PULSE */ + timeout--; + McuGenericSWI2C_OSYIELD(); + } + Delay(); + SCL_SetDir((bool)OUTPUT); + SCL_ClrVal(); /* CLOCK LOW PULSE */ + Delay(); + } +} + +/* +** =================================================================== +** Method : Read (component GenericSWI2C) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +static uint8_t Read(void) +{ + uint8_t Shift; + uint8_t I; + uint16_t timeout; + + Shift = 0U; + SDA_SetDir((bool)INPUT); /* SDA INPUT MODE */ + Delay(); /* give SDA setup time */ + for (I = 0x08U; I != 0U; I--) { + SCL_SetDir((bool)INPUT); /* CLOCK HIGH PULSE */ + Delay(); + timeout = McuGenericSWI2C_CONFIG_TIMEOUT_COUNTER_VALUE; + while((SCL_GetVal()==0U)&&(timeout!=0U)) { /* WAIT FOR CLOCK HIGH PULSE */ + timeout--; + McuGenericSWI2C_OSYIELD(); + } + Delay(); + Shift = (uint8_t)(Shift << 1); + if (SDA_GetVal()) { + Shift++; + } + SCL_SetDir((bool)OUTPUT); + SCL_ClrVal(); /* CLOCK LOW PULSE */ + Delay(); + } + return Shift; +} + +/* +** =================================================================== +** Method : GetAck (component GenericSWI2C) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +static bool GetAck(void) +{ + uint16_t timeout; + + SDA_SetDir((bool)INPUT); /* SDA HIGH */ + Delay(); + SCL_SetDir((bool)INPUT); /* CLOCK HIGH PULSE */ + Delay(); + timeout = McuGenericSWI2C_CONFIG_TIMEOUT_COUNTER_VALUE; + while((SCL_GetVal()==0U)&&(timeout!=0U)) { /* WAIT FOR CLOCK HIGH PULSE */ + timeout--; + McuGenericSWI2C_OSYIELD(); + } + return((bool)SDA_GetVal()); /* ACKNOWLEDGE VALUE */ +} + +/* +** =================================================================== +** Method : SendAck (component GenericSWI2C) +** +** Description : +** The method sends ACK to the bus. +** Parameters : +** NAME - DESCRIPTION +** Ack - If acknowledge is high or low +** Returns : Nothing +** =================================================================== +*/ +void McuGenericSWI2C_SendAck(bool Ack) +{ + uint16_t timeout; + + Delay(); + if (Ack) { + SDA_SetDir((bool)INPUT); /* MASTER NOACKNOWLEDGE - SDA HIGH */ + } else { + SDA_SetDir((bool)OUTPUT); + SDA_ClrVal(); /* MASTER ACKNOWLEDGE - SDA LOW */ + } + Delay(); + SCL_SetDir((bool)INPUT); /* HIGH CLOCK PULSE */ + Delay(); + timeout = McuGenericSWI2C_CONFIG_TIMEOUT_COUNTER_VALUE; + while((SCL_GetVal()==0U)&&(timeout!=0U)) { /* WAIT FOR CLOCK HIGH PULSE */ + timeout--; + McuGenericSWI2C_OSYIELD(); + } + Delay(); + SCL_SetDir((bool)OUTPUT); + SCL_ClrVal(); /* LOW CLOCK PULSE */ + Delay(); + SDA_SetDir((bool)INPUT); /* ACKNOWLEDGE END - SDA HIGH */ + Delay(); +} + +/* +** =================================================================== +** Method : InternalStop (component GenericSWI2C) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +static void InternalStop(void) +{ + Delay(); + SDA_SetDir((bool)OUTPUT); + SDA_ClrVal(); /* STOP SETUP */ + SCL_SetDir((bool)INPUT); /* CLOCK HIGH PULSE + STOP SETUP TIME */ + Delay(); + SDA_SetDir((bool)INPUT); /* STOP CONDITION */ + Delay(); /* stop setup time to SCL low (which might follow) */ +} + +/* +** =================================================================== +** Method : ResetBus (component GenericSWI2C) +** +** Description : +** Reset bus if needed. +** Parameters : None +** Returns : +** --- - TRUE if bus is idle, FALSE if bus is +** busy/hung +** =================================================================== +*/ +bool McuGenericSWI2C_ResetBus(void) +{ + char i; + + if(SDA_GetVal() && SCL_GetVal()) { + return TRUE; + } + SCL_SetDir((bool)INPUT); + SDA_SetDir((bool)INPUT); + Delay(); + if(!SCL_GetVal()) { + return FALSE; /* SCL held low externally, nothing we can do */ + } + for(i = 0; i<9; i++) { /* up to 9 clocks until SDA goes high */ + SCL_SetDir((bool)OUTPUT); + SCL_ClrVal(); + Delay(); + SCL_SetDir((bool)INPUT); + Delay(); + if( SDA_GetVal()) { + break; /* finally SDA high so we can generate a STOP */ + } + } /* for */ + if(!SDA_GetVal()) { + return FALSE; /* after 9 clocks still nothing */ + } + InternalStop(); + return(SDA_GetVal() && SCL_GetVal()); /* both high then we succeeded */ +} + +/* +** =================================================================== +** Method : SendChar (component GenericSWI2C) +** +** Description : +** When working as a MASTER, this method writes 7 bits of slave +** address plus R/W bit = 0 to the I2C bus and then writes one +** character (byte) to the bus. The slave address must be +** specified before by the "SelectSlave" method or in the +** component initialization section of 'Slave address init' +** property. When working as the SLAVE, this method writes one +** character (byte) to the bus. If the ERR_NOTAVAIL error code +** returned, the char is successfully sent to master but the +** master device responds by an acknowledgment instead of no +** acknowledgment at the end of transfer. 'OnError' event is +** called in this case. +** Parameters : +** NAME - DESCRIPTION +** Chr - Character to send +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_BUSY - The slave device is busy, it +** does not respond by the acknowledgment +** (MASTER mode only) +** ERR_NOTAVAIL - The master device sends +** acknowledgment instead of no acknowledgment +** after the last byte transfer (SLAVE mode +** only) +** ERR_DISABLED - Device is disabled +** ERR_BUSOFF - Clock timeout elapsed (SLAVE +** mode only) +** =================================================================== +*/ +uint8_t McuGenericSWI2C_SendChar(uint8_t Chr) +{ + uint16_t Trial; + bool Acknowledge; + uint16_t timeout; + + Trial = McuGenericSWI2C_CONFIG_NOF_TRIALS; + do { + SDA_SetDir((bool)INPUT); /* SDA HIGH - START SETUP*/ + SCL_SetDir((bool)INPUT); /* CLOCK HIGH PULSE */ + Delay(); /* CLOCK HIGH PULSE & BUS FREE TIME */ + /* check that we have a valid start condition: SDA needs to be high */ + timeout = McuGenericSWI2C_CONFIG_TIMEOUT_COUNTER_VALUE; + while((SDA_GetVal()==0U)&&(timeout!=0U)) { /* WAIT FOR CLOCK HIGH PULSE */ + timeout--; + McuGenericSWI2C_OSYIELD(); + } + Delay(); + if (timeout==0) { + InternalStop(); + return ERR_BUSY; + } + SDA_SetDir((bool)OUTPUT); + SDA_ClrVal(); /* START CONDITION */ + Delay(); /* START HOLD TIME */ + SCL_SetDir((bool)OUTPUT); + SCL_ClrVal(); /* CLOCK LOW PULSE */ + Delay(); + Write((uint8_t)(SlaveAddr + WRITE)); + Acknowledge = GetAck(); + --Trial; + } while ((Trial != 0U) && Acknowledge); + if (Acknowledge) { /* WRONG ACKNOWLEDGE */ + SCL_SetDir((bool)OUTPUT); + SCL_ClrVal(); /* CLOCK LOW PULSE */ + InternalStop(); + return ERR_BUSY; + } else { + SCL_SetDir((bool)OUTPUT); + SCL_ClrVal(); /* CLOCK LOW PULSE */ + Delay(); + } + Write(Chr); + if (GetAck()) { /* WRONG ACKNOWLEDGE */ + SCL_SetDir((bool)OUTPUT); + SCL_ClrVal(); /* CLOCK LOW PULSE */ + InternalStop(); + return ERR_BUSY; + } else { + SCL_SetDir((bool)OUTPUT); + SCL_ClrVal(); /* CLOCK LOW PULSE */ + Delay(); + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : RecvChar (component GenericSWI2C) +** +** Description : +** When working as a MASTER, this method writes 7 bits of slave +** address plus R/W bit = 1 to the I2C bus and then reads one +** character (byte) from the bus. The slave address must be +** specified before by the "SelectSlave" method or in the +** component initialization section of 'Slave address init' +** property. When working as a SLAVE, this method reads one +** character (byte) from the bus. +** Parameters : +** NAME - DESCRIPTION +** * Chr - Pointer to received character +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_BUSY - The slave device is busy, it +** does not respond by the acknowledgment +** (MASTER mode only) +** ERR_DISABLED - Device is disabled +** ERR_BUSOFF - Clock timeout elapsed (SLAVE +** mode only) +** =================================================================== +*/ +uint8_t McuGenericSWI2C_RecvChar(uint8_t *Chr) +{ + uint16_t Trial; + bool Acknowledge; + uint16_t timeout; + + Trial = McuGenericSWI2C_CONFIG_NOF_TRIALS; + do { + SDA_SetDir((bool)INPUT); /* SDA HIGH - START SETUP */ + SCL_SetDir((bool)INPUT); /* CLOCK HIGH PULSE */ + Delay(); /* CLOCK HIGH PULSE & BUS FREE TIME */ + /* check that we have a valid start condition: SDA needs to be high */ + timeout = McuGenericSWI2C_CONFIG_TIMEOUT_COUNTER_VALUE; + while((SDA_GetVal()==0U)&&(timeout!=0U)) { /* WAIT FOR CLOCK HIGH PULSE */ + timeout--; + McuGenericSWI2C_OSYIELD(); + } + Delay(); + if (timeout==0) { + InternalStop(); + return ERR_BUSY; + } + SDA_SetDir((bool)OUTPUT); + SDA_ClrVal(); /* START CONDITION */ + Delay(); /* START HOLD TIME */ + SCL_SetDir((bool)OUTPUT); + SCL_ClrVal(); /* CLOCK LOW PULSE */ + Delay(); + Write((uint8_t)(SlaveAddr + READ)); + Acknowledge = GetAck(); + --Trial; + } while ((Trial != 0U) && Acknowledge); + if (Acknowledge) { + SCL_SetDir((bool)OUTPUT); + SCL_ClrVal(); /* CLOCK LOW PULSE */ + InternalStop(); + return ERR_BUSY; + } else { + SCL_SetDir((bool)OUTPUT); + SCL_ClrVal(); /* CLOCK LOW PULSE */ + Delay(); + } + *Chr = Read(); + McuGenericSWI2C_SendAck((bool)McuGenericSWI2C_NOACK); + return ERR_OK; +} + +/* +** =================================================================== +** Method : SendBlock (component GenericSWI2C) +** +** Description : +** When working as a MASTER, this method writes 7 bits of slave +** address plus R/W bit = 0 to the I2C bus and then writes the +** block of characters to the bus. If the component is disabled +** (by the "Disable" method or initialization), the block is +** moved to the output buffer if the 'Output buffer size' +** property is different from zero. The content of the output +** buffer is sent immediately with the stop condition at the +** end when the component is enabled by the "Enable" method. +** After the output buffer transmission, the whole output +** buffer is cleared. The slave address must be specified +** before by the "SelectSlave" method or in component +** initialization section of 'Slave address init' property. +** When working as a SLAVE, this method writes block of +** characters to the bus. If the ERR_NOTAVAIL error code is +** returned, the whole block is successfully sent to a master +** but the master device responds by an acknowledgment instead +** of no acknowledgment sent at the end of the last block byte +** transfer. 'OnError' event is called in this case. +** Parameters : +** NAME - DESCRIPTION +** * Ptr - A pointer to the block of data to send +** Siz - The size of the block +** * Snt - A pointer to the number of data that are +** sent (copied to buffer) +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_BUSY - The slave device is busy, it +** does not respond by the acknowledgment +** (MASTER mode only) +** ERR_TXFULL - Output buffer is full (MASTER +** mode only) +** ERR_NOTAVAIL - The master device sends +** acknowledgment instead of no acknowledgment +** after the last byte transfer (SLAVE mode +** only) +** ERR_DISABLED - Device is disabled +** ERR_BUSOFF - Clock timeout elapsed (SLAVE +** mode only) +** =================================================================== +*/ +uint8_t McuGenericSWI2C_SendBlock(void *Ptr, uint16_t Siz, uint16_t *Snt) +{ + register uint16_t I; + bool Acknowledge; + uint16_t Trial; + uint16_t timeout; + + *Snt = 0U; + Trial = McuGenericSWI2C_CONFIG_NOF_TRIALS; + do { + SDA_SetDir((bool)INPUT); /* SDA HIGH - START SETUP */ + SCL_SetDir((bool)INPUT); /* CLOCK HIGH PULSE */ + Delay(); /* CLOCK HIGH PULSE + BUS FREE TIME */ + /* check that we have a valid start condition: SDA needs to be high */ + timeout = McuGenericSWI2C_CONFIG_TIMEOUT_COUNTER_VALUE; + while((SDA_GetVal()==0U)&&(timeout!=0U)) { /* WAIT FOR CLOCK HIGH PULSE */ + timeout--; + McuGenericSWI2C_OSYIELD(); + } + Delay(); + if (timeout==0) { + return ERR_BUSY; + } + SDA_SetDir((bool)OUTPUT); + SDA_ClrVal(); /* START CONDITION */ + Delay(); /* START HOLD TIME */ + SCL_SetDir((bool)OUTPUT); + SCL_ClrVal(); /* CLOCK LOW PULSE */ + Delay(); + Write((uint8_t)(SlaveAddr + WRITE)); + Acknowledge = GetAck(); + --Trial; + } while ((Trial != 0U) && Acknowledge); + if (Acknowledge) { + return ERR_BUSY; + } else { + SCL_SetDir((bool)OUTPUT); + SCL_ClrVal(); /* CLOCK LOW PULSE */ + Delay(); + } + for (I = 0U; I < Siz; I++) { + Write (*((const uint8_t*)Ptr + I) ); + if (GetAck()) { + SCL_SetDir((bool)OUTPUT); + SCL_ClrVal(); /* CLOCK LOW PULSE */ + InternalStop(); + return ERR_BUSY; + } else { + SCL_SetDir((bool)OUTPUT); + SCL_ClrVal(); /* CLOCK LOW PULSE */ + Delay(); + } + ++(*Snt); + } + Delay(); + timeout = McuGenericSWI2C_CONFIG_TIMEOUT_COUNTER_VALUE; + while((SDA_GetVal()==0U)&&(timeout!=0U)) { /* WAIT FOR CLOCK HIGH PULSE */ + timeout--; + McuGenericSWI2C_OSYIELD(); + } + if (timeout==0) { + return ERR_BUSY; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : SendBlockContinue (component GenericSWI2C) +** +** Description : +** Same is SendBlock() but does not send start condition. When +** working as a MASTER, this method writes 7 bits of slave +** address plus R/W bit = 0 to the I2C bus and then writes the +** block of characters to the bus. If the component is disabled +** (by the "Disable" method or initialization), the block is +** moved to the output buffer if the 'Output buffer size' +** property is different from zero. The content of the output +** buffer is sent immediately with the stop condition at the +** end when the component is enabled by the "Enable" method. +** After the output buffer transmission, the whole output +** buffer is cleared. The slave address must be specified +** before by the "SelectSlave" method or in component +** initialization section of 'Slave address init' property. +** When working as a SLAVE, this method writes block of +** characters to the bus. If the ERR_NOTAVAIL error code is +** returned, the whole block is successfully sent to a master +** but the master device responds by an acknowledgment instead +** of no acknowledgment sent at the end of the last block byte +** transfer. 'OnError' event is called in this case. +** Parameters : +** NAME - DESCRIPTION +** * Ptr - A pointer to the block of data to send +** Siz - The size of the block +** * Snt - A pointer to the number of data that are +** sent (copied to buffer) +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_BUSY - The slave device is busy, it +** does not respond by the acknowledgment +** (MASTER mode only) +** ERR_TXFULL - Output buffer is full (MASTER +** mode only) +** ERR_NOTAVAIL - The master device sends +** acknowledgment instead of no acknowledgment +** after the last byte transfer (SLAVE mode +** only) +** ERR_DISABLED - Device is disabled +** ERR_BUSOFF - Clock timeout elapsed (SLAVE +** mode only) +** =================================================================== +*/ +uint8_t McuGenericSWI2C_SendBlockContinue(void *Ptr, uint16_t Siz, uint16_t *Snt) +{ + register uint16_t I; + uint16_t timeout; + + *Snt = 0U; + for (I = 0U; I < Siz; I++) { + Write (*((const uint8_t*)Ptr + I) ); + if (GetAck()) { + SCL_SetDir((bool)OUTPUT); + SCL_ClrVal(); /* CLOCK LOW PULSE */ + InternalStop(); + return ERR_BUSY; + } else { + SCL_SetDir((bool)OUTPUT); + SCL_ClrVal(); /* CLOCK LOW PULSE */ + Delay(); + } + ++(*Snt); + } + Delay(); + timeout = McuGenericSWI2C_CONFIG_TIMEOUT_COUNTER_VALUE; + while((SDA_GetVal()==0U)&&(timeout!=0U)) { /* WAIT FOR CLOCK HIGH PULSE */ + timeout--; + McuGenericSWI2C_OSYIELD(); + } + if (timeout==0) { + return ERR_BUSY; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : RecvBlockCustom (component GenericSWI2C) +** +** Description : +** Same as RecvBlock(), but with additional flags to control +** the bus transfer. +** Parameters : +** NAME - DESCRIPTION +** * Ptr - A pointer to the block space for received +** data +** Siz - The size of the block +** * Rcv - A pointer to the number of actually +** received data +** flagsStart - Flags for start condition +** flagsAck - Flags for Ack after last byte +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_BUSY - The slave device is busy, it +** does not respond by the acknowledgment +** (MASTER mode only) +** ERR_DISABLED - Device is disabled +** ERR_BUSOFF - Clock timeout elapsed (SLAVE +** mode only) +** =================================================================== +*/ +uint8_t McuGenericSWI2C_RecvBlockCustom(void *Ptr, uint16_t Siz, uint16_t *Rcv, McuGenericSWI2C_EnumStartFlags flagsStart, McuGenericSWI2C_EnumAckFlags flagsAck) +{ + register uint16_t I; + bool Acknowledge; + uint16_t Trial; + uint16_t timeout; + + *Rcv = 0U; + Trial = McuGenericSWI2C_CONFIG_NOF_TRIALS; + if (flagsStart == McuGenericSWI2C_SEND_START) { + do { + SDA_SetDir((bool)INPUT); /* SDA HIGH - START SETUP */ + SCL_SetDir((bool)INPUT); /* CLOCK HIGH PULSE */ + Delay(); /* CLOCK HIGH PULSE + BUS FREE TIME */ + /* check that we have a valid start condition: SDA needs to be high */ + timeout = McuGenericSWI2C_CONFIG_TIMEOUT_COUNTER_VALUE; + while((SDA_GetVal()==0U) && (timeout!=0U)) { /* WAIT FOR CLOCK HIGH PULSE */ + timeout--; + McuGenericSWI2C_OSYIELD(); + } + Delay(); + if (timeout==0) { + /* InternalStop(); */ + return ERR_BUSY; + } + SDA_SetDir((bool)OUTPUT); + SDA_ClrVal(); /* START CONDITION */ + Delay(); /* START HOLD TIME */ + SCL_SetDir((bool)OUTPUT); + SCL_ClrVal(); /* CLOCK LOW PULSE */ + Delay(); + Write((uint8_t)(SlaveAddr + READ)); + Acknowledge = GetAck(); + --Trial; + } while ((Trial != 0U) && Acknowledge); + if (Acknowledge) { + /* SCL_SetDir((bool)OUTPUT); */ + /* SCL_ClrVal(); */ /* CLOCK LOW PULSE */ + /* InternalStop(); */ + return ERR_BUSY; + } else { + SCL_SetDir((bool)OUTPUT); + SCL_ClrVal(); /* CLOCK LOW PULSE */ + Delay(); + } + } /* McuGenericSWI2C_SEND_START */ + for (I = 0U; I < Siz; I++) { + *((uint8_t *)Ptr + I) = Read(); + timeout = McuGenericSWI2C_CONFIG_TIMEOUT_COUNTER_VALUE; + while((SDA_GetVal()==0U)&&(timeout!=0U)) { /* WAIT FOR CLOCK HIGH PULSE */ + timeout--; + McuGenericSWI2C_OSYIELD(); + } + if (timeout==0) { + /* InternalStop(); */ + return ERR_BUSY; + } + if (I == (Siz - 1U)) { + if(flagsAck == McuGenericSWI2C_SEND_LAST_ACK){ + McuGenericSWI2C_SendAck((bool)McuGenericSWI2C_NOACK); + } + } else { + McuGenericSWI2C_SendAck((bool)McuGenericSWI2C_ACK); + } + ++(*Rcv); + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : RecvBlock (component GenericSWI2C) +** +** Description : +** When working as a MASTER, this method writes 7 bits of slave +** address plus R/W bit = 1 to the I2C bus and then reads the +** block of characters from the bus. The slave address must be +** specified before by the "SelectSlave" method or in component +** initialization section of 'Slave address init' property. +** When working as a SLAVE, this method reads the block of +** characters from the bus. +** Parameters : +** NAME - DESCRIPTION +** * Ptr - A pointer to the block space for received +** data +** Siz - The size of the block +** * Rcv - A pointer to the number of actually +** received data +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_BUSY - The slave device is busy, it +** does not respond by the acknowledgment +** (MASTER mode only) +** ERR_DISABLED - Device is disabled +** ERR_BUSOFF - Clock timeout elapsed (SLAVE +** mode only) +** =================================================================== +*/ +uint8_t McuGenericSWI2C_RecvBlock(void *Ptr, uint16_t Siz, uint16_t *Rcv) +{ + return McuGenericSWI2C_RecvBlockCustom(Ptr, Siz, Rcv, McuGenericSWI2C_SEND_START, McuGenericSWI2C_SEND_LAST_ACK); +} + +/* +** =================================================================== +** Method : SendStop (component GenericSWI2C) +** +** Description : +** When working as a MASTER, if the 'Automatic stop condition' +** property value is 'no', this method sends a valid stop +** condition to the serial data line of the I2C bus to +** terminate the communication on the bus after using send +** methods. This method is enabled only if the component is in +** MASTER mode and 'Automatic stop condition' property value is +** 'no' +** Parameters : None +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_DISABLED - Device is disabled +** =================================================================== +*/ +uint8_t McuGenericSWI2C_SendStop(void) +{ + Delay(); + SDA_SetDir((bool)OUTPUT); + SDA_ClrVal(); /* STOP SETUP */ + Delay(); + SCL_SetDir((bool)INPUT); /* HIGH CLOCK PULSE + STOP SETUP TIME */ + Delay(); + SDA_SetDir((bool)INPUT); /* STOP CONDITION */ + Delay(); /* add stop time */ + return ERR_OK; +} + +/* +** =================================================================== +** Method : SelectSlave (component GenericSWI2C) +** +** Description : +** When working as a MASTER, this method selects a new slave +** for communication by its slave address value. Any send or +** receive method are directed to or from the selected device, +** until a new slave device is selected by this method. If the +** selected slave uses 10-bit slave addressing, as the +** parameter 7 bits must be passed, which involves 10-bit +** addressing (11110XX), including two MSBs of slave address +** (XX). The second byte of the 10-bit slave address must be +** sent to the slave as a general character of send methods. +** This method is available only if the component is in MASTER +** mode. +** Parameters : +** NAME - DESCRIPTION +** Slv - Slave address value +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_DISABLED - Device is disabled +** =================================================================== +*/ +uint8_t McuGenericSWI2C_SelectSlave(uint8_t Slv) +{ + SlaveAddr = (uint8_t)(Slv<<1); + return ERR_OK; +} + +/* +** =================================================================== +** Method : GetSelected (component GenericSWI2C) +** +** Description : +** When working as a MASTER, this method returns the +** identification address value of the slave, which is +** currently selected for communication with the master. If the +** current slave uses 10-bit slave addressing, the method +** returns the first 7 bits only, which involves 10-bit +** addressing (11110XX), including two MSBs of the slave +** address (XX). This method is not able to return the rest +** value of 10-bit slave address. This method is available only +** if the component is in MASTER mode. +** Parameters : +** NAME - DESCRIPTION +** * Slv - A pointer to the current selected slave +** address value +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** =================================================================== +*/ +uint8_t McuGenericSWI2C_GetSelected(uint8_t *Slv) +{ + *Slv = (uint8_t)(SlaveAddr>>1); + return ERR_OK; +} + +/* +** =================================================================== +** Method : Init (component GenericSWI2C) +** +** Description : +** Initializes the associated peripheral(s) and the components +** internal variables. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuGenericSWI2C_Init(void) +{ + SlaveAddr = 0; + SDA_Init(); + SCL_Init(); +} + +/* +** =================================================================== +** Method : Deinit (component GenericSWI2C) +** +** Description : +** Driver de-initialization method. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuGenericSWI2C_Deinit(void) +{ + SCL_Deinit(); + SDA_Deinit(); + SlaveAddr = 0; +} + +/* END McuGenericSWI2C. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuGenericSWI2C.h b/TSM_PicoW_Sensor/McuLib/src/McuGenericSWI2C.h new file mode 100644 index 0000000..d364f5c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuGenericSWI2C.h @@ -0,0 +1,470 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuGenericSWI2C.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GenericSWI2C +** Version : Component 01.028, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-09, 10:10, # CodeGen: 829 +** Abstract : +** +** Settings : +** Component name : McuGenericSWI2C +** Delay (ns) : 1250 +** Trials : 256 +** SDA : SDK_BitIO +** SCL : SDK_BitIO +** Wait : McuWait +** Yield : no +** Contents : +** ResetBus - bool McuGenericSWI2C_ResetBus(void); +** SendChar - uint8_t McuGenericSWI2C_SendChar(uint8_t Chr); +** RecvChar - uint8_t McuGenericSWI2C_RecvChar(uint8_t *Chr); +** SendBlock - uint8_t McuGenericSWI2C_SendBlock(void *Ptr, uint16_t Siz, uint16_t *Snt); +** SendBlockContinue - uint8_t McuGenericSWI2C_SendBlockContinue(void *Ptr, uint16_t Siz, uint16_t... +** RecvBlock - uint8_t McuGenericSWI2C_RecvBlock(void *Ptr, uint16_t Siz, uint16_t *Rcv); +** RecvBlockCustom - uint8_t McuGenericSWI2C_RecvBlockCustom(void *Ptr, uint16_t Siz, uint16_t... +** SendAck - void McuGenericSWI2C_SendAck(bool Ack); +** SendStop - uint8_t McuGenericSWI2C_SendStop(void); +** SelectSlave - uint8_t McuGenericSWI2C_SelectSlave(uint8_t Slv); +** GetSelected - uint8_t McuGenericSWI2C_GetSelected(uint8_t *Slv); +** Deinit - void McuGenericSWI2C_Deinit(void); +** Init - void McuGenericSWI2C_Init(void); +** +** * Copyright (c) 2014-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuGenericSWI2C.h +** @version 01.00 +** @brief +** +*/ +/*! +** @addtogroup McuGenericSWI2C_module McuGenericSWI2C module documentation +** @{ +*/ + +#ifndef __McuGenericSWI2C_H +#define __McuGenericSWI2C_H + +/* MODULE McuGenericSWI2C. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuGenericSWI2Cconfig.h" /* configuration */ + + +#define McuGenericSWI2C_RECVBLOCKCUSTOM_AVAILABLE (1) + /*!< Define which can be used to check if the function RecvBlockCustom() is available */ + +typedef enum McuGenericSWI2C_EnumStartFlags_ { + McuGenericSWI2C_SEND_START, /* Start is sent */ + McuGenericSWI2C_DO_NOT_SEND_START /* Start is not sent */ +} McuGenericSWI2C_EnumStartFlags; + +typedef enum McuGenericSWI2C_EnumAckFlags_ { + McuGenericSWI2C_SEND_LAST_ACK, /* Nack after last received byte is sent */ + McuGenericSWI2C_DO_NOT_LAST_ACK /* Nack after last received byte is not sent */ +} McuGenericSWI2C_EnumAckFlags; + +/* defines to be used for McuGenericSWI2C_SendAck(); */ +#define McuGenericSWI2C_ACK 0U +#define McuGenericSWI2C_NOACK 1U + +void McuGenericSWI2C_Init(void); +/* +** =================================================================== +** Method : Init (component GenericSWI2C) +** +** Description : +** Initializes the associated peripheral(s) and the components +** internal variables. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuGenericSWI2C_SendChar(uint8_t Chr); +/* +** =================================================================== +** Method : SendChar (component GenericSWI2C) +** +** Description : +** When working as a MASTER, this method writes 7 bits of slave +** address plus R/W bit = 0 to the I2C bus and then writes one +** character (byte) to the bus. The slave address must be +** specified before by the "SelectSlave" method or in the +** component initialization section of 'Slave address init' +** property. When working as the SLAVE, this method writes one +** character (byte) to the bus. If the ERR_NOTAVAIL error code +** returned, the char is successfully sent to master but the +** master device responds by an acknowledgment instead of no +** acknowledgment at the end of transfer. 'OnError' event is +** called in this case. +** Parameters : +** NAME - DESCRIPTION +** Chr - Character to send +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_BUSY - The slave device is busy, it +** does not respond by the acknowledgment +** (MASTER mode only) +** ERR_NOTAVAIL - The master device sends +** acknowledgment instead of no acknowledgment +** after the last byte transfer (SLAVE mode +** only) +** ERR_DISABLED - Device is disabled +** ERR_BUSOFF - Clock timeout elapsed (SLAVE +** mode only) +** =================================================================== +*/ + +uint8_t McuGenericSWI2C_RecvChar(uint8_t *Chr); +/* +** =================================================================== +** Method : RecvChar (component GenericSWI2C) +** +** Description : +** When working as a MASTER, this method writes 7 bits of slave +** address plus R/W bit = 1 to the I2C bus and then reads one +** character (byte) from the bus. The slave address must be +** specified before by the "SelectSlave" method or in the +** component initialization section of 'Slave address init' +** property. When working as a SLAVE, this method reads one +** character (byte) from the bus. +** Parameters : +** NAME - DESCRIPTION +** * Chr - Pointer to received character +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_BUSY - The slave device is busy, it +** does not respond by the acknowledgment +** (MASTER mode only) +** ERR_DISABLED - Device is disabled +** ERR_BUSOFF - Clock timeout elapsed (SLAVE +** mode only) +** =================================================================== +*/ + +uint8_t McuGenericSWI2C_SendBlock(void *Ptr, uint16_t Siz, uint16_t *Snt); +/* +** =================================================================== +** Method : SendBlock (component GenericSWI2C) +** +** Description : +** When working as a MASTER, this method writes 7 bits of slave +** address plus R/W bit = 0 to the I2C bus and then writes the +** block of characters to the bus. If the component is disabled +** (by the "Disable" method or initialization), the block is +** moved to the output buffer if the 'Output buffer size' +** property is different from zero. The content of the output +** buffer is sent immediately with the stop condition at the +** end when the component is enabled by the "Enable" method. +** After the output buffer transmission, the whole output +** buffer is cleared. The slave address must be specified +** before by the "SelectSlave" method or in component +** initialization section of 'Slave address init' property. +** When working as a SLAVE, this method writes block of +** characters to the bus. If the ERR_NOTAVAIL error code is +** returned, the whole block is successfully sent to a master +** but the master device responds by an acknowledgment instead +** of no acknowledgment sent at the end of the last block byte +** transfer. 'OnError' event is called in this case. +** Parameters : +** NAME - DESCRIPTION +** * Ptr - A pointer to the block of data to send +** Siz - The size of the block +** * Snt - A pointer to the number of data that are +** sent (copied to buffer) +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_BUSY - The slave device is busy, it +** does not respond by the acknowledgment +** (MASTER mode only) +** ERR_TXFULL - Output buffer is full (MASTER +** mode only) +** ERR_NOTAVAIL - The master device sends +** acknowledgment instead of no acknowledgment +** after the last byte transfer (SLAVE mode +** only) +** ERR_DISABLED - Device is disabled +** ERR_BUSOFF - Clock timeout elapsed (SLAVE +** mode only) +** =================================================================== +*/ + +uint8_t McuGenericSWI2C_RecvBlock(void *Ptr, uint16_t Siz, uint16_t *Rcv); +/* +** =================================================================== +** Method : RecvBlock (component GenericSWI2C) +** +** Description : +** When working as a MASTER, this method writes 7 bits of slave +** address plus R/W bit = 1 to the I2C bus and then reads the +** block of characters from the bus. The slave address must be +** specified before by the "SelectSlave" method or in component +** initialization section of 'Slave address init' property. +** When working as a SLAVE, this method reads the block of +** characters from the bus. +** Parameters : +** NAME - DESCRIPTION +** * Ptr - A pointer to the block space for received +** data +** Siz - The size of the block +** * Rcv - A pointer to the number of actually +** received data +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_BUSY - The slave device is busy, it +** does not respond by the acknowledgment +** (MASTER mode only) +** ERR_DISABLED - Device is disabled +** ERR_BUSOFF - Clock timeout elapsed (SLAVE +** mode only) +** =================================================================== +*/ + +uint8_t McuGenericSWI2C_SendStop(void); +/* +** =================================================================== +** Method : SendStop (component GenericSWI2C) +** +** Description : +** When working as a MASTER, if the 'Automatic stop condition' +** property value is 'no', this method sends a valid stop +** condition to the serial data line of the I2C bus to +** terminate the communication on the bus after using send +** methods. This method is enabled only if the component is in +** MASTER mode and 'Automatic stop condition' property value is +** 'no' +** Parameters : None +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_DISABLED - Device is disabled +** =================================================================== +*/ + +uint8_t McuGenericSWI2C_SelectSlave(uint8_t Slv); +/* +** =================================================================== +** Method : SelectSlave (component GenericSWI2C) +** +** Description : +** When working as a MASTER, this method selects a new slave +** for communication by its slave address value. Any send or +** receive method are directed to or from the selected device, +** until a new slave device is selected by this method. If the +** selected slave uses 10-bit slave addressing, as the +** parameter 7 bits must be passed, which involves 10-bit +** addressing (11110XX), including two MSBs of slave address +** (XX). The second byte of the 10-bit slave address must be +** sent to the slave as a general character of send methods. +** This method is available only if the component is in MASTER +** mode. +** Parameters : +** NAME - DESCRIPTION +** Slv - Slave address value +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_DISABLED - Device is disabled +** =================================================================== +*/ + +uint8_t McuGenericSWI2C_GetSelected(uint8_t *Slv); +/* +** =================================================================== +** Method : GetSelected (component GenericSWI2C) +** +** Description : +** When working as a MASTER, this method returns the +** identification address value of the slave, which is +** currently selected for communication with the master. If the +** current slave uses 10-bit slave addressing, the method +** returns the first 7 bits only, which involves 10-bit +** addressing (11110XX), including two MSBs of the slave +** address (XX). This method is not able to return the rest +** value of 10-bit slave address. This method is available only +** if the component is in MASTER mode. +** Parameters : +** NAME - DESCRIPTION +** * Slv - A pointer to the current selected slave +** address value +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** =================================================================== +*/ + +bool McuGenericSWI2C_ResetBus(void); +/* +** =================================================================== +** Method : ResetBus (component GenericSWI2C) +** +** Description : +** Reset bus if needed. +** Parameters : None +** Returns : +** --- - TRUE if bus is idle, FALSE if bus is +** busy/hung +** =================================================================== +*/ + +uint8_t McuGenericSWI2C_SendBlockContinue(void *Ptr, uint16_t Siz, uint16_t *Snt); +/* +** =================================================================== +** Method : SendBlockContinue (component GenericSWI2C) +** +** Description : +** Same is SendBlock() but does not send start condition. When +** working as a MASTER, this method writes 7 bits of slave +** address plus R/W bit = 0 to the I2C bus and then writes the +** block of characters to the bus. If the component is disabled +** (by the "Disable" method or initialization), the block is +** moved to the output buffer if the 'Output buffer size' +** property is different from zero. The content of the output +** buffer is sent immediately with the stop condition at the +** end when the component is enabled by the "Enable" method. +** After the output buffer transmission, the whole output +** buffer is cleared. The slave address must be specified +** before by the "SelectSlave" method or in component +** initialization section of 'Slave address init' property. +** When working as a SLAVE, this method writes block of +** characters to the bus. If the ERR_NOTAVAIL error code is +** returned, the whole block is successfully sent to a master +** but the master device responds by an acknowledgment instead +** of no acknowledgment sent at the end of the last block byte +** transfer. 'OnError' event is called in this case. +** Parameters : +** NAME - DESCRIPTION +** * Ptr - A pointer to the block of data to send +** Siz - The size of the block +** * Snt - A pointer to the number of data that are +** sent (copied to buffer) +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_BUSY - The slave device is busy, it +** does not respond by the acknowledgment +** (MASTER mode only) +** ERR_TXFULL - Output buffer is full (MASTER +** mode only) +** ERR_NOTAVAIL - The master device sends +** acknowledgment instead of no acknowledgment +** after the last byte transfer (SLAVE mode +** only) +** ERR_DISABLED - Device is disabled +** ERR_BUSOFF - Clock timeout elapsed (SLAVE +** mode only) +** =================================================================== +*/ + +uint8_t McuGenericSWI2C_RecvBlockCustom(void *Ptr, uint16_t Siz, uint16_t *Rcv, McuGenericSWI2C_EnumStartFlags flagsStart, McuGenericSWI2C_EnumAckFlags flagsAck); +/* +** =================================================================== +** Method : RecvBlockCustom (component GenericSWI2C) +** +** Description : +** Same as RecvBlock(), but with additional flags to control +** the bus transfer. +** Parameters : +** NAME - DESCRIPTION +** * Ptr - A pointer to the block space for received +** data +** Siz - The size of the block +** * Rcv - A pointer to the number of actually +** received data +** flagsStart - Flags for start condition +** flagsAck - Flags for Ack after last byte +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_BUSY - The slave device is busy, it +** does not respond by the acknowledgment +** (MASTER mode only) +** ERR_DISABLED - Device is disabled +** ERR_BUSOFF - Clock timeout elapsed (SLAVE +** mode only) +** =================================================================== +*/ + +void McuGenericSWI2C_SendAck(bool Ack); +/* +** =================================================================== +** Method : SendAck (component GenericSWI2C) +** +** Description : +** The method sends ACK to the bus. +** Parameters : +** NAME - DESCRIPTION +** Ack - If acknowledge is high or low +** Returns : Nothing +** =================================================================== +*/ + +void McuGenericSWI2C_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GenericSWI2C) +** +** Description : +** Driver de-initialization method. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuGenericSWI2C. */ + +#endif +/* ifndef __McuGenericSWI2C_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuGenericSWSPI.c b/TSM_PicoW_Sensor/McuLib/src/McuGenericSWSPI.c new file mode 100644 index 0000000..48ad8a0 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuGenericSWSPI.c @@ -0,0 +1,363 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuGenericSWSPI.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GenericSWSPI +** Version : Component 01.031, Driver 01.15, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** +** Settings : +** Contents : +** RecvChar - uint8_t McuGenericSWSPI_RecvChar(uint8_t *Chr); +** SendChar - uint8_t McuGenericSWSPI_SendChar(uint8_t val); +** CharsInRxBuf - uint8_t McuGenericSWSPI_CharsInRxBuf(void); +** CharsInTxBuf - uint8_t McuGenericSWSPI_CharsInTxBuf(void); +** SetShiftClockPolarity - uint8_t McuGenericSWSPI_SetShiftClockPolarity(uint8_t Edge); +** SetIdleClockPolarity - uint8_t McuGenericSWSPI_SetIdleClockPolarity(uint8_t Level); +** Write_ReadDummy - void McuGenericSWSPI_Write_ReadDummy(uint8_t val); +** SetSlowMode - void McuGenericSWSPI_SetSlowMode(void); +** SetFastMode - void McuGenericSWSPI_SetFastMode(void); +** Deinit - void McuGenericSWSPI_Deinit(void); +** Init - void McuGenericSWSPI_Init(void); +** +** * Copyright (c) 2013-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuGenericSWSPI.h +** @version 01.15 +** @brief +** +*/ +/*! +** @addtogroup McuGenericSWSPI_module McuGenericSWSPI module documentation +** @{ +*/ + + +/* MODULE McuGenericSWSPI. */ +#include "McuGenericSWSPI.h" + +/* Include inherited components */ +#include "Clock1.h" +#include "Input1.h" +#include "Output1.h" +#include "McuWait.h" +#include "McuLib.h" + + /* data-clock-clock */ + +#define OVERRUN_ERR 0x01 /* Overrun error flag bit */ +#define CHAR_IN_RX 0x08 /* Char is in RX buffer */ + +static uint8_t McuGenericSWSPI_FastMode; /* 0: slow, 1: fast */ +#define MOSI_IDLE_POLARITY 1 /* MOSI idle polarity is high */ +#define CLOCK_IDLE_POLARITY 0 /* Clock idle polarity is low */ + +static uint8_t CLKshift; +static uint8_t CLKsampl; +static uint8_t InputBuffer; +static uint8_t SerFlag; /* Flags for serial communication */ + /* Bits: 0 - OverRun error */ + /* 1 - Unused */ + /* 2 - Unused */ + /* 3 - Char in RX buffer */ + /* 4 - Unused */ + /* 5 - Unused */ + /* 6 - Unused */ + /* 7 - Unused */ +#define McuGenericSWSPI_DELAY() \ + if (McuGenericSWSPI_FastMode) { /* we can change the speed at runtime */ \ + McuWait_Waitus(0); /* delay for some cycles */ \ + } else { \ + McuWait_Waitus(0); /* delay for some cycles */ \ + } +/* +** =================================================================== +** Method : SetFastMode (component GenericSWSPI) +** +** Description : +** Sets the fast mode +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuGenericSWSPI_SetFastMode(void) +{ + McuGenericSWSPI_FastMode = 1; +} + +/* +** =================================================================== +** Method : SetSlowMode (component GenericSWSPI) +** +** Description : +** Changes to slow mode +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuGenericSWSPI_SetSlowMode(void) +{ + McuGenericSWSPI_FastMode = 0; +} + +/* +** =================================================================== +** Method : RecvChar (component GenericSWSPI) +** +** Description : +** If any data received, this method returns one character, +** otherwise it returns an error code (it does not wait for +** data). +** Parameters : +** NAME - DESCRIPTION +** * Chr - A pointer to the received character. +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_RXEMPTY - No data in receiver +** ERR_OVERRUN - Overrun error is detected +** =================================================================== +*/ +uint8_t McuGenericSWSPI_RecvChar(uint8_t *Chr) +{ + if(!(SerFlag & CHAR_IN_RX)) { /* Is char. received */ + return ERR_RXEMPTY; + } + *Chr = InputBuffer; /* Store the character */ + if(SerFlag&OVERRUN_ERR) { /* Is "overrun" occurred? */ + SerFlag &= ~(OVERRUN_ERR|CHAR_IN_RX); /* If yes, clear flags */ + return ERR_OVERRUN; /* ... and return error */ + } else { + SerFlag &= ~CHAR_IN_RX; /* If no, clear flag */ + return ERR_OK; /* ... and return */ + } +} + +/* +** =================================================================== +** Method : Write_ReadDummy (component GenericSWSPI) +** +** Description : +** Writes to the bus, but does not read. +** Parameters : +** NAME - DESCRIPTION +** val - value to put on the bus +** Returns : Nothing +** =================================================================== +*/ +void McuGenericSWSPI_Write_ReadDummy(uint8_t val) +{ + int i; + + for(i=0; i<8; i++) { + McuGenericSWSPI_DELAY(); + Output1_PutVal((bool)(val&128)); /* Set value on MOSI */ + InputBuffer <<= 1; + McuGenericSWSPI_DELAY(); + Clock1_PutVal(CLKsampl); /* Set CLK to sample value */ + val <<= 1; + Clock1_PutVal(CLKshift); /* Set CLK to shift value */ + } + Output1_PutVal((bool)MOSI_IDLE_POLARITY); /* Set value on MOSI */ +} + +/* +** =================================================================== +** Method : SendChar (component GenericSWSPI) +** +** Description : +** Sends one character to the channel. +** Parameters : +** NAME - DESCRIPTION +** val - Character to send. +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** =================================================================== +*/ +uint8_t McuGenericSWSPI_SendChar(uint8_t val) +{ + int i; + + for(i=0; i<8; i++) { + McuGenericSWSPI_DELAY(); + Output1_PutVal((bool)(val&128)); /* Set value on MOSI */ + InputBuffer <<= 1; + McuGenericSWSPI_DELAY(); + Clock1_PutVal(CLKsampl); /* Set CLK to sample value */ + InputBuffer |= Input1_GetVal()?1:0; /* Read value from MISO */ + val <<= 1; + Clock1_PutVal(CLKshift); /* Set CLK to shift value */ + } + Output1_PutVal((bool)MOSI_IDLE_POLARITY); /* Set value on MOSI */ + if(SerFlag&CHAR_IN_RX) { /* Is char. received? */ + SerFlag |= OVERRUN_ERR; /* If yes then set "overrun" flag */ + } else { + SerFlag |= CHAR_IN_RX; /* If no then set "char in Rx" flag */ + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : CharsInRxBuf (component GenericSWSPI) +** +** Description : +** Returns number of characters in the input buffer. +** Parameters : None +** Returns : +** --- - Returns number of characters in the input +** buffer. +** =================================================================== +*/ +uint8_t McuGenericSWSPI_CharsInRxBuf(void) +{ + return (uint8_t)((SerFlag & CHAR_IN_RX)?(uint8_t)1:(uint8_t)0); /* Return number of chars in receive buffer */ +} + +/* +** =================================================================== +** Method : CharsInTxBuf (component GenericSWSPI) +** +** Description : +** Returns number of characters in the output buffer. +** Parameters : None +** Returns : +** --- - Returns number of characters in the output +** buffer. +** =================================================================== +*/ +#if 0 /* implemented as macro in the header file */ +uint8_t McuGenericSWSPI_CharsInTxBuf(void) +{ + return 0; /* Return number of chars in transmit buffer */ +} +#endif +/* +** =================================================================== +** Method : SetShiftClockPolarity (component GenericSWSPI) +** +** Description : +** Sets the shift clock polarity at runtime. Output data will +** be shifted on the selected edge polarity. +** Parameters : +** NAME - DESCRIPTION +** Edge - Edge polarity, possible values: +** 0-falling edge, +** 1-rising edge. +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** =================================================================== +*/ +uint8_t McuGenericSWSPI_SetShiftClockPolarity(uint8_t Edge) +{ + CLKshift = (uint8_t)(Edge?(uint8_t)1:(uint8_t)0); /* Set shift value */ + CLKsampl = (uint8_t)(CLKshift^(uint8_t)0x01); /* Set sample value */ + return ERR_OK; +} + +/* +** =================================================================== +** Method : SetIdleClockPolarity (component GenericSWSPI) +** +** Description : +** Set the idle clock polarity at runtime. If communication +** does not run, the clock signal will be set to the required +** level. +** Parameters : +** NAME - DESCRIPTION +** Level - Idle clock polarity: +** 0-low +** 1-high +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** =================================================================== +*/ +uint8_t McuGenericSWSPI_SetIdleClockPolarity(uint8_t Level) +{ + Clock1_PutVal((uint8_t)Level); /* Set CLK to (new) idle value */ + return ERR_OK; +} + +/* +** =================================================================== +** Method : Init (component GenericSWSPI) +** +** Description : +** Driver Initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuGenericSWSPI_Init(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED != McuLib_CONFIG_SDK_PROCESSOR_EXPERT + Input1_Init(); + Output1_Init(); + Clock1_Init(); +#endif + McuGenericSWSPI_SetSlowMode(); /* slow mode is default */ + /* clock idle low, falling edge: Data - Sample - Shift */ + CLKsampl = 1; + CLKshift = 0; + Clock1_PutVal((bool)CLOCK_IDLE_POLARITY); /* Set CLK to idle value */ + Output1_PutVal((bool)MOSI_IDLE_POLARITY); /* Set value on MOSI */ + SerFlag = 0; /* Clear flags */ +} + +/* +** =================================================================== +** Method : Deinit (component GenericSWSPI) +** +** Description : +** Driver Deinitialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuGenericSWSPI_Deinit(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED != McuLib_CONFIG_SDK_PROCESSOR_EXPERT + Input1_Deinit(); + Output1_Deinit(); + Clock1_Deinit(); +#endif +} + + +/* END __McuGenericSWSPI_H */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuGenericSWSPI.h b/TSM_PicoW_Sensor/McuLib/src/McuGenericSWSPI.h new file mode 100644 index 0000000..4ac5386 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuGenericSWSPI.h @@ -0,0 +1,251 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuGenericSWSPI.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GenericSWSPI +** Version : Component 01.031, Driver 01.15, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** +** Settings : +** Contents : +** RecvChar - uint8_t McuGenericSWSPI_RecvChar(uint8_t *Chr); +** SendChar - uint8_t McuGenericSWSPI_SendChar(uint8_t val); +** CharsInRxBuf - uint8_t McuGenericSWSPI_CharsInRxBuf(void); +** CharsInTxBuf - uint8_t McuGenericSWSPI_CharsInTxBuf(void); +** SetShiftClockPolarity - uint8_t McuGenericSWSPI_SetShiftClockPolarity(uint8_t Edge); +** SetIdleClockPolarity - uint8_t McuGenericSWSPI_SetIdleClockPolarity(uint8_t Level); +** Write_ReadDummy - void McuGenericSWSPI_Write_ReadDummy(uint8_t val); +** SetSlowMode - void McuGenericSWSPI_SetSlowMode(void); +** SetFastMode - void McuGenericSWSPI_SetFastMode(void); +** Deinit - void McuGenericSWSPI_Deinit(void); +** Init - void McuGenericSWSPI_Init(void); +** +** * Copyright (c) 2013-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuGenericSWSPI.h +** @version 01.15 +** @brief +** +*/ +/*! +** @addtogroup McuGenericSWSPI_module McuGenericSWSPI module documentation +** @{ +*/ + +#ifndef __McuGenericSWSPI_H +#define __McuGenericSWSPI_H + +/* MODULE McuGenericSWSPI. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuGenericSWSPIconfig.h" /* configuration */ + + + + +#ifdef __cplusplus +extern "C" { +#endif + +void McuGenericSWSPI_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GenericSWSPI) +** +** Description : +** Driver Deinitialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuGenericSWSPI_SetFastMode(void); +/* +** =================================================================== +** Method : SetFastMode (component GenericSWSPI) +** +** Description : +** Sets the fast mode +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuGenericSWSPI_SetSlowMode(void); +/* +** =================================================================== +** Method : SetSlowMode (component GenericSWSPI) +** +** Description : +** Changes to slow mode +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuGenericSWSPI_Write_ReadDummy(uint8_t val); +/* +** =================================================================== +** Method : Write_ReadDummy (component GenericSWSPI) +** +** Description : +** Writes to the bus, but does not read. +** Parameters : +** NAME - DESCRIPTION +** val - value to put on the bus +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuGenericSWSPI_RecvChar(uint8_t *Chr); +/* +** =================================================================== +** Method : RecvChar (component GenericSWSPI) +** +** Description : +** If any data received, this method returns one character, +** otherwise it returns an error code (it does not wait for +** data). +** Parameters : +** NAME - DESCRIPTION +** * Chr - A pointer to the received character. +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_RXEMPTY - No data in receiver +** ERR_OVERRUN - Overrun error is detected +** =================================================================== +*/ + +uint8_t McuGenericSWSPI_SendChar(uint8_t val); +/* +** =================================================================== +** Method : SendChar (component GenericSWSPI) +** +** Description : +** Sends one character to the channel. +** Parameters : +** NAME - DESCRIPTION +** val - Character to send. +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** =================================================================== +*/ + +uint8_t McuGenericSWSPI_CharsInRxBuf(void); +/* +** =================================================================== +** Method : CharsInRxBuf (component GenericSWSPI) +** +** Description : +** Returns number of characters in the input buffer. +** Parameters : None +** Returns : +** --- - Returns number of characters in the input +** buffer. +** =================================================================== +*/ + +#define McuGenericSWSPI_CharsInTxBuf() 0 /* we always directly send the characters without buffering */ +/* +** =================================================================== +** Method : CharsInTxBuf (component GenericSWSPI) +** +** Description : +** Returns number of characters in the output buffer. +** Parameters : None +** Returns : +** --- - Returns number of characters in the output +** buffer. +** =================================================================== +*/ + +uint8_t McuGenericSWSPI_SetShiftClockPolarity(uint8_t Edge); +/* +** =================================================================== +** Method : SetShiftClockPolarity (component GenericSWSPI) +** +** Description : +** Sets the shift clock polarity at runtime. Output data will +** be shifted on the selected edge polarity. +** Parameters : +** NAME - DESCRIPTION +** Edge - Edge polarity, possible values: +** 0-falling edge, +** 1-rising edge. +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** =================================================================== +*/ + +uint8_t McuGenericSWSPI_SetIdleClockPolarity(uint8_t Level); +/* +** =================================================================== +** Method : SetIdleClockPolarity (component GenericSWSPI) +** +** Description : +** Set the idle clock polarity at runtime. If communication +** does not run, the clock signal will be set to the required +** level. +** Parameters : +** NAME - DESCRIPTION +** Level - Idle clock polarity: +** 0-low +** 1-high +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** =================================================================== +*/ + +void McuGenericSWSPI_Init(void); +/* +** =================================================================== +** Method : McuGenericSWSPI_Init (component GenericSWSPI) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ + + +/* END McuGenericSWSPI. */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ifndef __McuGenericSWSPI_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuHardFault.c b/TSM_PicoW_Sensor/McuLib/src/McuHardFault.c new file mode 100644 index 0000000..a614f4b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuHardFault.c @@ -0,0 +1,244 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuHardFault.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : HardFault +** Version : Component 01.024, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2022-07-19, 17:00, # CodeGen: 782 +** Abstract : +** Component to simplify hard faults for ARM (Kinetis, S32K). +** Settings : +** Component name : McuHardFault +** Contents : +** HardFaultHandler - void McuHardFault_HardFaultHandler(void); +** Deinit - void McuHardFault_Deinit(void); +** Init - void McuHardFault_Init(void); +** +** * Copyright (c) 2014-2022, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuHardFault.h +** @version 01.00 +** @brief +** Component to simplify hard faults for ARM (Kinetis, S32K). +*/ +/*! +** @addtogroup McuHardFault_module McuHardFault module documentation +** @{ +*/ + +/* MODULE McuHardFault. */ + +#include "McuHardFault.h" + +#if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M + +/* +** =================================================================== +** Method : McuHardFault_HandlerC (component HardFault) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +/** + * This is called from the HardFaultHandler with a pointer the Fault stack + * as the parameter. We can then read the values from the stack and place them + * into local variables for ease of reading. + * We then read the various Fault Status and Address Registers to help decode + * cause of the fault. + * The function ends with a BKPT instruction to force control back into the debugger + */ +#pragma GCC diagnostic ignored "-Wunused-but-set-variable" +void McuHardFault_HandlerC(uint32_t *hardfault_args) +{ + /*lint -save -e550 Symbol not accessed. */ + static volatile unsigned long stacked_r0; + static volatile unsigned long stacked_r1; + static volatile unsigned long stacked_r2; + static volatile unsigned long stacked_r3; + static volatile unsigned long stacked_r12; + static volatile unsigned long stacked_lr; + static volatile unsigned long stacked_pc; + static volatile unsigned long stacked_psr; + static volatile unsigned long _CFSR; + static volatile unsigned long _HFSR; + static volatile unsigned long _DFSR; + static volatile unsigned long _AFSR; + static volatile unsigned long _BFAR; + static volatile unsigned long _MMAR; + stacked_r0 = ((unsigned long)hardfault_args[0]); /* http://www.asciiworld.com/-Smiley,20-.html */ + stacked_r1 = ((unsigned long)hardfault_args[1]); /* oooo$$$$$$$$$$$$oooo */ + stacked_r2 = ((unsigned long)hardfault_args[2]); /* oo$$$$$$$$$$$$$$$$$$$$$$$$o */ + stacked_r3 = ((unsigned long)hardfault_args[3]); /* oo$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$o o$ $$ o$ */ + stacked_r12 = ((unsigned long)hardfault_args[4]); /* o $ oo o$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$o $$ $$ $$o$ */ + stacked_lr = ((unsigned long)hardfault_args[5]); /* oo $ $ "$ o$$$$$$$$$ $$$$$$$$$$$$$ $$$$$$$$$o $$$o$$o$ */ + stacked_pc = ((unsigned long)hardfault_args[6]); /* "$$$$$$o$ o$$$$$$$$$ $$$$$$$$$$$ $$$$$$$$$$o $$$$$$$$ */ + stacked_psr = ((unsigned long)hardfault_args[7]); /* $$$$$$$ $$$$$$$$$$$ $$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$ */ + /* $$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$ $$$$$$$$$$$$$$ """$$$ */ + /* Configurable Fault Status Register */ /* "$$$""""$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ "$$$ */ + /* Consists of MMSR, BFSR and UFSR */ /* $$$ o$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ "$$$o */ + _CFSR = (*((volatile unsigned long *)(0xE000ED28))); /* o$$" $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$o */ + /* $$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" "$$$$$$ooooo$$$$o */ + /* Hard Fault Status Register */ /* o$$$oooo$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ o$$$$$$$$$$$$$$$$$ */ + _HFSR = (*((volatile unsigned long *)(0xE000ED2C))); /* $$$$$$$$"$$$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$"""""""" */ + /* """" $$$$ "$$$$$$$$$$$$$$$$$$$$$$$$$$$$" o$$$ */ + /* Debug Fault Status Register */ /* "$$$o """$$$$$$$$$$$$$$$$$$"$$" $$$ */ + _DFSR = (*((volatile unsigned long *)(0xE000ED30))); /* $$$o "$$""$$$$$$"""" o$$$ */ + /* $$$$o o$$$" */ + /* Auxiliary Fault Status Register */ /* "$$$$o o$$$$$$o"$$$$o o$$$$ */ + _AFSR = (*((volatile unsigned long *)(0xE000ED3C))); /* "$$$$$oo ""$$$$o$$$$$o o$$$$"" */ + /* ""$$$$$oooo "$$$o$$$$$$$$$""" */ + /* ""$$$$$$$oo $$$$$$$$$$ */ + /* Read the Fault Address Registers. */ /* """"$$$$$$$$$$$ */ + /* These may not contain valid values. */ /* $$$$$$$$$$$$ */ + /* Check BFARVALID/MMARVALID to see */ /* $$$$$$$$$$" */ + /* if they are valid values */ /* "$$$"" */ + /* MemManage Fault Address Register */ + _MMAR = (*((volatile unsigned long *)(0xE000ED34))); + /* Bus Fault Address Register */ + _BFAR = (*((volatile unsigned long *)(0xE000ED38))); + +#if 0 /* experimental, seems not to work properly with GDB in KDS V3.2.0 */ +#ifdef __GNUC__ /* might improve stack, see https://www.element14.com/community/message/199113/l/gdb-assisted-debugging-of-hard-faults#199113 */ + __asm volatile ( + "tst lr,#4 \n" /* check which stack pointer we are using */ + "ite eq \n" + "mrseq r0, msp \n" /* use MSP */ + "mrsne r0, psp \n" /* use PSP */ + "mov sp, r0 \n" /* set stack pointer so GDB shows proper stack frame */ + ); +#endif +#endif + __asm("BKPT #0\n") ; /* cause the debugger to stop */ + /*lint -restore */ +} + +/* +** =================================================================== +** Method : HardFaultHandler (component HardFault) +** +** Description : +** Hard Fault Handler +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +#pragma GCC diagnostic ignored "-Wunused-but-set-variable" +__attribute__((naked)) +#if McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_RPI_PICO +void isr_hardfault(void) +#elif McuLib_CONFIG_SDK_VERSION_USED != McuLib_CONFIG_SDK_PROCESSOR_EXPERT +void HardFault_Handler(void) +#else +void McuHardFault_HardFaultHandler(void) +#endif +{ + __asm volatile ( + ".syntax unified \n" /* needed for the 'adds r1,#2' below */ + " movs r0,#4 \n" /* load bit mask into R0 */ + " mov r1, lr \n" /* load link register into R1 */ + " tst r0, r1 \n" /* compare with bitmask */ + " beq _MSP \n" /* if bitmask is set: stack pointer is in PSP. Otherwise in MSP */ + " mrs r0, psp \n" /* otherwise: stack pointer is in PSP */ + " b _GetPC \n" /* go to part which loads the PC */ + "_MSP: \n" /* stack pointer is in MSP register */ + " mrs r0, msp \n" /* load stack pointer into R0 */ + "_GetPC: \n" /* find out where the hard fault happened */ + " ldr r1,[r0,#24] \n" /* load program counter into R1. R1 contains address of the next instruction where the hard fault happened */ +#if McuHardFault_CONFIG_SETTING_SEMIHOSTING + /* The following code checks if the hard fault is caused by a semihosting BKPT instruction which is "BKPT 0xAB" (opcode: 0xBEAB) + The idea is taken from the MCUXpresso IDE/SDK code, so credits and kudos to the MCUXpresso IDE team! */ + " ldrh r2,[r1] \n" /* load opcode causing the fault */ + " ldr r3,=0xBEAB \n" /* load constant 0xBEAB (BKPT 0xAB) into R3" */ + " cmp r2,r3 \n" /* is it the BKPT 0xAB? */ + " beq _SemihostReturn \n" /* if yes, return from semihosting */ + " b McuHardFault_HandlerC \n" /* if no, dump the register values and halt the system */ + "_SemihostReturn: \n" /* returning from semihosting fault */ + " adds r1,#2 \n" /* r1 points to the semihosting BKPT instruction. Adjust the PC to skip it (2 bytes) */ + " str r1,[r0,#24] \n" /* store back the adjusted PC value to the interrupt stack frame */ + " movs r1,#32 \n" /* need to pass back a return value to emulate a successful semihosting operation. 32 is an arbitrary value */ + " str r1,[r0,#0] \n" /* store the return value on the stack frame */ + " bx lr \n" /* return from the exception handler back to the application */ +#else + " b McuHardFault_HandlerC \n" /* decode more information. R0 contains pointer to stack frame */ +#endif + ); +} + +/* +** =================================================================== +** Method : Deinit (component HardFault) +** +** Description : +** Deinitializes the driver +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuHardFault_Deinit(void) +{ +#if McuHardFault_CONFIG_SETTING_DISABLE_WRITE_BUFFER + #if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT + SCB_ACTLR &= ~(SCB_ACTLR_DISDEFWBUF_MASK); /* write buffer bit, see https://community.nxp.com/docs/DOC-103810 */ + #elif McuLib_CONFIG_NXP_SDK_USED && McuLib_McuLib_CONFIG_CORTEX_M!=7 /* not for M7? */ + SCnSCB->ACTLR &= ~SCnSCB_ACTLR_DISDEFWBUF_Msk; + #endif +#endif +} + +/* +** =================================================================== +** Method : Init (component HardFault) +** +** Description : +** Initializes the driver +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuHardFault_Init(void) +{ +#if McuHardFault_CONFIG_SETTING_DISABLE_WRITE_BUFFER + #if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT + SCB_ACTLR |= SCB_ACTLR_DISDEFWBUF_MASK; /* write buffer bit, see https://community.nxp.com/docs/DOC-103810 */ + #elif McuLib_CONFIG_NXP_SDK_USED && McuLib_McuLib_CONFIG_CORTEX_M!=7 /* not for M7? */ + SCnSCB->ACTLR |= SCnSCB_ACTLR_DISDEFWBUF_Msk; + #endif +#endif +} + + +#endif /* McuLib_CONFIG_CPU_IS_ARM_CORTEX_M */ +/* END McuHardFault. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuHardFault.h b/TSM_PicoW_Sensor/McuLib/src/McuHardFault.h new file mode 100644 index 0000000..6d715d7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuHardFault.h @@ -0,0 +1,123 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuHardFault.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : HardFault +** Version : Component 01.024, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2022-07-19, 17:00, # CodeGen: 782 +** Abstract : +** Component to simplify hard faults for ARM (Kinetis, S32K). +** Settings : +** Component name : McuHardFault +** Contents : +** HardFaultHandler - void McuHardFault_HardFaultHandler(void); +** Deinit - void McuHardFault_Deinit(void); +** Init - void McuHardFault_Init(void); +** +** * Copyright (c) 2014-2022, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuHardFault.h +** @version 01.00 +** @brief +** Component to simplify hard faults for ARM (Kinetis, S32K). +*/ +/*! +** @addtogroup McuHardFault_module McuHardFault module documentation +** @{ +*/ + +#ifndef __McuHardFault_H +#define __McuHardFault_H + +/* MODULE McuHardFault. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuHardFaultconfig.h" /* configuration */ + + + + +void McuHardFault_HardFaultHandler(void); +/* +** =================================================================== +** Method : HardFaultHandler (component HardFault) +** +** Description : +** Hard Fault Handler +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +#ifdef __GNUC__ /* 'used' attribute needed for GNU LTO (Link Time Optimization) */ +void McuHardFault_HandlerC(uint32_t *hardfault_args) __attribute__((used)); +#else +void McuHardFault_HandlerC(uint32_t *hardfault_args); +#endif +/* +** =================================================================== +** Method : McuHardFault_HandlerC (component HardFault) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ + +void McuHardFault_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component HardFault) +** +** Description : +** Deinitializes the driver +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuHardFault_Init(void); +/* +** =================================================================== +** Method : Init (component HardFault) +** +** Description : +** Initializes the driver +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuHardFault. */ + +#endif +/* ifndef __McuHardFault_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuI2CSpy.c b/TSM_PicoW_Sensor/McuLib/src/McuI2CSpy.c new file mode 100644 index 0000000..45528f8 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuI2CSpy.c @@ -0,0 +1,472 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuI2CSpy.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : I2CSpy +** Version : Component 01.017, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** This component implements a utility to inspect devices on the I2C bus. +** Settings : +** Component name : McuI2CSpy +** I2C : McuGenericI2C +** Default Address : 0x0 +** Default Address Size : 1 +** Default Bytes per Line : 8 +** Shell : Enabled +** Shell : McuShell +** Utility : McuUtility +** Contents : +** SetDeviceAddress - uint8_t McuI2CSpy_SetDeviceAddress(uint8_t addr); +** GetDeviceAddress - uint8_t McuI2CSpy_GetDeviceAddress(void); +** SetAddressSize - uint8_t McuI2CSpy_SetAddressSize(uint8_t size); +** SetBytesPerLine - uint8_t McuI2CSpy_SetBytesPerLine(uint8_t nofBytesPerLine); +** ReadRegData - uint8_t McuI2CSpy_ReadRegData(uint32_t addr, uint8_t *data, size_t dataSize); +** WriteRegData - uint8_t McuI2CSpy_WriteRegData(uint32_t addr, uint8_t *data, uint16_t dataSize); +** ParseCommand - uint8_t McuI2CSpy_ParseCommand(const unsigned char *cmd, bool *handled, const... +** Deinit - void McuI2CSpy_Deinit(void); +** Init - uint8_t McuI2CSpy_Init(void); +** +** * Copyright (c) 2013-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuI2CSpy.h +** @version 01.00 +** @brief +** This component implements a utility to inspect devices on the I2C bus. +*/ +/*! +** @addtogroup McuI2CSpy_module McuI2CSpy module documentation +** @{ +*/ + +/* MODULE McuI2CSpy. */ + +#include "McuI2CSpy.h" + +#define McuI2CSpy_DEFAULT_I2C_ADDR 0 +#define McuI2CSpy_DEFAULT_ADDR_SIZE 1 +#define McuI2CSpy_DEFAULT_BYTES_PER_LINE 8 + +typedef struct { + uint8_t deviceAddr; /* I2C 7bit device address */ + uint8_t addrSize; /* number of address bytes, e.g. 1, 2, 3 or 4 bytes */ + uint8_t bytesPerLine; /* number of bytes per line for dump */ +} McuI2CSpy_TDataState; + +static McuI2CSpy_TDataState McuI2CSpy_deviceData; + +#define MAX_NOF_BYTES_PER_LINE 32 /* maximum number of bytes per line */ + +static uint8_t Read(uint32_t addr, const McuShell_StdIOType *io) { + uint8_t val; + uint8_t hexBuf[3]; + + if (McuI2CSpy_ReadRegData(addr, &val, 1)!=ERR_OK) { + McuShell_SendStr((unsigned char*)"\r\n*** read failed!\r\n", io->stdErr); + return ERR_FAILED; + } + McuShell_SendStr((unsigned char*)"value: 0x", io->stdOut); + hexBuf[0] = '\0'; + McuUtility_strcatNum8Hex(hexBuf, sizeof(hexBuf), val); + McuShell_SendStr(hexBuf, io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + return ERR_OK; +} + +static uint8_t ReadData(void *hndl, uint32_t addr, uint8_t *buf, size_t bufSize) { + (void)hndl; /* not used */ + if (McuI2CSpy_ReadRegData(addr, buf, bufSize)!=ERR_OK) { + return ERR_FAILED; + } + return ERR_OK; +} + +static void ScanDevices(const McuShell_StdIOType *io) { + uint8_t addr, oldAddr; + uint8_t buf[3], res; + + oldAddr = McuI2CSpy_GetDeviceAddress(); + for (addr=0; addr<0x7f; addr++) { + McuShell_SendStr((unsigned char*)"scan of I2C device addr 0x", io->stdOut); + buf[0] = '\0'; + McuUtility_strcatNum8Hex(buf, sizeof(buf), addr); + McuShell_SendStr(buf, io->stdOut); + if (McuI2CSpy_SetDeviceAddress(addr)!=ERR_OK) { + McuShell_SendStr((unsigned char*)": failed selecting device\r\n", io->stdErr); + break; /* get out of for loop */ + } + res = McuGenericI2C_ScanDevice(addr); + if (res==ERR_NOTAVAIL) { + McuShell_SendStr((unsigned char*)": no ACK\r\n", io->stdErr); + } else if (res==ERR_OK) { + McuShell_SendStr((unsigned char*)": Device responded!\r\n", io->stdErr); + } else { + McuShell_SendStr((unsigned char*)": *** failed! ***\r\n", io->stdErr); + } + } /* for */ + (void)McuI2CSpy_SetDeviceAddress(oldAddr); /* restore old device address */ +} + +static uint8_t PrintStatus(const McuShell_StdIOType *io) { + unsigned char buf[3]; + + McuShell_SendStatusStr((unsigned char*)"McuI2CSpy", (unsigned char*)"\r\n", io->stdOut); + McuShell_SendStatusStr((unsigned char*)" deviceAddr", (unsigned char*)"0x", io->stdOut); + buf[0] = '\0'; + McuUtility_strcatNum8Hex(buf, sizeof(buf), McuI2CSpy_GetDeviceAddress()); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + McuShell_SendStatusStr((unsigned char*)" addrSize", (unsigned char*)"", io->stdOut); + McuShell_SendNum8u(McuI2CSpy_deviceData.addrSize, io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + McuShell_SendStatusStr((unsigned char*)" bytes/Line", (unsigned char*)"", io->stdOut); + McuShell_SendNum8u(McuI2CSpy_deviceData.bytesPerLine, io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + return ERR_OK; +} + +static uint8_t PrintHelp(const McuShell_StdIOType *io) { + McuShell_SendHelpStr((unsigned char*)"McuI2CSpy", (unsigned char*)"Group of McuI2CSpy commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" bytesPerLine ", (unsigned char*)"Number of bytes per line for dump command (1..32)\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" scan", (unsigned char*)"Scans device addresses\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" device 0x", (unsigned char*)"Set the I2C device address\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" addrSize ", (unsigned char*)"Address size used for device memory map (1, 2, 3 or 4)\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" read 0x", (unsigned char*)"Read a byte from an address\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" write 0x 0x", (unsigned char*)"Write a data to an address. 0x can be multiple items.\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" dump 0x..0x", (unsigned char*)"Read data from an address range\r\n", io->stdOut); + return ERR_OK; +} + +/* +** =================================================================== +** Method : ParseCommand (component I2CSpy) +** +** Description : +** Shell Command Line parser +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command string +** * handled - Pointer to variable which tells if +** the command has been handled or not +** io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuI2CSpy_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) +{ + uint8_t addr8, value8; + uint32_t addr32, end32; + const unsigned char *p; + uint8_t cnt; + uint8_t buf[16]; + + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, "McuI2CSpy help")==0) { + *handled = TRUE; + return PrintHelp(io); + } else if ((McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) || (McuUtility_strcmp((char*)cmd, "McuI2CSpy status")==0)) { + *handled = TRUE; + return PrintStatus(io); + } else if (McuUtility_strncmp((char*)cmd, "McuI2CSpy bytesPerLine ", sizeof("McuI2CSpy bytesPerLine ")-1)==0) { + p = cmd+sizeof("McuI2CSpy bytesPerLine ")-1; + if (McuUtility_ScanDecimal8uNumber(&p, &value8)==ERR_OK && value8>=1 && value8<=MAX_NOF_BYTES_PER_LINE) { + (void)McuI2CSpy_SetBytesPerLine(value8); + } else { + McuShell_SendStr((unsigned char*)"**** wrong bytes per line, must be 1..32\r\n", io->stdErr); + } + *handled = TRUE; + } else if (McuUtility_strncmp((char*)cmd, "McuI2CSpy device ", sizeof("McuI2CSpy device ")-1)==0) { + p = cmd+sizeof("McuI2CSpy device ")-1; + if (McuUtility_ScanHex8uNumber(&p, &addr8)==ERR_OK && addr8<=0x7F) { + (void)McuI2CSpy_SetDeviceAddress(addr8); + } else { + McuShell_SendStr((unsigned char*)"**** wrong device address\r\n", io->stdErr); + } + *handled = TRUE; + } else if (McuUtility_strncmp((char*)cmd, "McuI2CSpy read ", sizeof("McuI2CSpy read ")-1)==0) { + p = cmd+sizeof("McuI2CSpy read ")-1; + if (McuUtility_ScanHex32uNumber(&p, &addr32)==ERR_OK) { + (void)Read(addr32, io); + } else { + McuShell_SendStr((unsigned char*)"**** wrong address\r\n", io->stdErr); + } + *handled = TRUE; + } else if (McuUtility_strncmp((char*)cmd, "McuI2CSpy addrSize ", sizeof("McuI2CSpy addrSize ")-1)==0) { + p = cmd+sizeof("McuI2CSpy addrSize ")-1; + if (McuUtility_ScanDecimal8uNumber(&p, &value8)==ERR_OK && value8>=1 && value8<=4) { + (void)McuI2CSpy_SetAddressSize(value8); + } else { + McuShell_SendStr((unsigned char*)"**** addrSize of range (1-4)\r\n", io->stdErr); + } + *handled = TRUE; + } else if (McuUtility_strncmp((char*)cmd, "McuI2CSpy write ", sizeof("McuI2CSpy write ")-1)==0) { + p = cmd+sizeof("McuI2CSpy write ")-1; + if (McuUtility_ScanHex32uNumber(&p, &addr32)==ERR_OK) { + for(cnt=0; cntstdErr); + cnt = 0; + break; + } + } /* for */ + if (cnt>=1) { + (void)McuI2CSpy_WriteRegData(addr32, &buf[0], cnt); + } + } /* if */ + *handled = TRUE; + } else if (McuUtility_strncmp((char*)cmd, "McuI2CSpy dump ", sizeof("McuI2CSpy dump ")-1)==0) { + p = cmd+sizeof("McuI2CSpy dump ")-1; + if (McuUtility_ScanHex32uNumber(&p, &addr32)==ERR_OK) { + if (McuUtility_strncmp((char*)p, "..", sizeof("..")-1)==0) { + p = p+sizeof("..")-1; + if (McuUtility_ScanHex32uNumber(&p, &end32)==ERR_OK) { + (void)McuShell_PrintMemory(NULL, addr32, end32, McuI2CSpy_deviceData.addrSize, McuI2CSpy_deviceData.bytesPerLine, ReadData, io); + } else { + McuShell_SendStr((unsigned char*)"**** wrong end address\r\n", io->stdErr); + } + } else { + McuShell_SendStr((unsigned char*)"**** wrong format, '..' expected.\r\n", io->stdErr); + } + } else { + McuShell_SendStr((unsigned char*)"**** wrong start address\r\n", io->stdErr); + } + *handled = TRUE; + } else if (McuUtility_strcmp((char*)cmd, "McuI2CSpy scan")==0) { + ScanDevices(io); + *handled = TRUE; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : SetDeviceAddress (component I2CSpy) +** +** Description : +** Sets the I2C Device address to be used +** Parameters : +** NAME - DESCRIPTION +** addr - I2C 7bit address +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuI2CSpy_SetDeviceAddress(uint8_t addr) +{ + McuI2CSpy_deviceData.deviceAddr = addr; + return ERR_OK; +} + +/* +** =================================================================== +** Method : GetDeviceAddress (component I2CSpy) +** +** Description : +** Returns the current I2C Device address used +** Parameters : None +** Returns : +** --- - 7bit Device Address +** =================================================================== +*/ +uint8_t McuI2CSpy_GetDeviceAddress(void) +{ + return McuI2CSpy_deviceData.deviceAddr; +} + +/* +** =================================================================== +** Method : SetAddressSize (component I2CSpy) +** +** Description : +** Specifies the address size of the I2C device memory +** Parameters : +** NAME - DESCRIPTION +** size - Either 1 (8bit), 2 (16bit), 3 (24bit), +** or 4 (32bit) +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuI2CSpy_SetAddressSize(uint8_t size) +{ + McuI2CSpy_deviceData.addrSize = size; + return ERR_OK; +} + +/* +** =================================================================== +** Method : SetBytesPerLine (component I2CSpy) +** +** Description : +** Sets the number of bytes per line for the Dump shell command +** Parameters : +** NAME - DESCRIPTION +** nofBytesPerLine - Number of bytes +** per line +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuI2CSpy_SetBytesPerLine(uint8_t nofBytesPerLine) +{ + McuI2CSpy_deviceData.bytesPerLine = nofBytesPerLine; + return ERR_OK; +} + +/* +** =================================================================== +** Method : Init (component I2CSpy) +** +** Description : +** Initialization method +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuI2CSpy_Init(void) +{ + if (McuI2CSpy_SetDeviceAddress(McuI2CSpy_DEFAULT_I2C_ADDR)!=ERR_OK) { + return ERR_FAILED; + } + if (McuI2CSpy_SetBytesPerLine(McuI2CSpy_DEFAULT_BYTES_PER_LINE)!=ERR_OK) { + return ERR_FAILED; + } + if (McuI2CSpy_SetAddressSize(McuI2CSpy_DEFAULT_ADDR_SIZE)!=ERR_OK) { + return ERR_FAILED; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : Deinit (component I2CSpy) +** +** Description : +** Deinitialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuI2CSpy_Deinit(void) +{ + /* nothing to do */ +} + +/* +** =================================================================== +** Method : McuI2CSpy_OnRequestBus (component I2CSpy) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +void McuI2CSpy_OnRequestBus(void) +{ + /* Write your code here ... */ +} + +/* +** =================================================================== +** Method : McuI2CSpy_OnReleaseBus (component I2CSpy) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +void McuI2CSpy_OnReleaseBus(void) +{ + /* Write your code here ... */ +} + +/* +** =================================================================== +** Method : ReadRegData (component I2CSpy) +** +** Description : +** Reads data starting from a register address from the current +** device +** Parameters : +** NAME - DESCRIPTION +** addr - Device address +** * data - Pointer to data buffer where read data +** is stored +** dataSize - size of data buffer in bytes +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuI2CSpy_ReadRegData(uint32_t addr, uint8_t *data, size_t dataSize) +{ + uint8_t addrBuf[4]; + + addrBuf[3] = (uint8_t)(addr&0xff); + addrBuf[2] = (uint8_t)((addr&0xff00)>>8); + addrBuf[1] = (uint8_t)((addr&0xff0000)>>16); + addrBuf[0] = (uint8_t)((addr&0xff000000)>>24); + return McuGenericI2C_ReadAddress(McuI2CSpy_deviceData.deviceAddr, &addrBuf[4-McuI2CSpy_deviceData.addrSize], + McuI2CSpy_deviceData.addrSize, data, dataSize); +} + +/* +** =================================================================== +** Method : WriteRegData (component I2CSpy) +** +** Description : +** Writes data starting from a register address to the current +** device +** Parameters : +** NAME - DESCRIPTION +** addr - Address in device +** * data - Pointer to data to write +** dataSize - Size of data in bytes +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuI2CSpy_WriteRegData(uint32_t addr, uint8_t *data, uint16_t dataSize) +{ + uint8_t addrBuf[4]; + + addrBuf[3] = (uint8_t)(addr&0xff); + addrBuf[2] = (uint8_t)((addr&0xff00)>>8); + addrBuf[1] = (uint8_t)((addr&0xff0000)>>16); + addrBuf[0] = (uint8_t)((addr&0xff000000)>>24); + return McuGenericI2C_WriteAddress(McuI2CSpy_deviceData.deviceAddr, &addrBuf[4-McuI2CSpy_deviceData.addrSize], + McuI2CSpy_deviceData.addrSize, data, dataSize); +} + +/* END McuI2CSpy. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuI2CSpy.h b/TSM_PicoW_Sensor/McuLib/src/McuI2CSpy.h new file mode 100644 index 0000000..68a443e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuI2CSpy.h @@ -0,0 +1,237 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuI2CSpy.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : I2CSpy +** Version : Component 01.017, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** This component implements a utility to inspect devices on the I2C bus. +** Settings : +** Component name : McuI2CSpy +** I2C : McuGenericI2C +** Default Address : 0x0 +** Default Address Size : 1 +** Default Bytes per Line : 8 +** Shell : Enabled +** Shell : McuShell +** Utility : McuUtility +** Contents : +** SetDeviceAddress - uint8_t McuI2CSpy_SetDeviceAddress(uint8_t addr); +** GetDeviceAddress - uint8_t McuI2CSpy_GetDeviceAddress(void); +** SetAddressSize - uint8_t McuI2CSpy_SetAddressSize(uint8_t size); +** SetBytesPerLine - uint8_t McuI2CSpy_SetBytesPerLine(uint8_t nofBytesPerLine); +** ReadRegData - uint8_t McuI2CSpy_ReadRegData(uint32_t addr, uint8_t *data, size_t dataSize); +** WriteRegData - uint8_t McuI2CSpy_WriteRegData(uint32_t addr, uint8_t *data, uint16_t dataSize); +** ParseCommand - uint8_t McuI2CSpy_ParseCommand(const unsigned char *cmd, bool *handled, const... +** Deinit - void McuI2CSpy_Deinit(void); +** Init - uint8_t McuI2CSpy_Init(void); +** +** * Copyright (c) 2013-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuI2CSpy.h +** @version 01.00 +** @brief +** This component implements a utility to inspect devices on the I2C bus. +*/ +/*! +** @addtogroup McuI2CSpy_module McuI2CSpy module documentation +** @{ +*/ + +#ifndef __McuI2CSpy_H +#define __McuI2CSpy_H + +/* MODULE McuI2CSpy. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuI2CSpyconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuGenericI2C.h" +#include "McuLib.h" +#include "McuShell.h" +#include "McuUtility.h" + + +#define McuI2CSpy_PARSE_COMMAND_ENABLED 1 /* set to 1 if method ParseCommand() is present, 0 otherwise */ + + +uint8_t McuI2CSpy_Init(void); +/* +** =================================================================== +** Method : Init (component I2CSpy) +** +** Description : +** Initialization method +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuI2CSpy_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component I2CSpy) +** +** Description : +** Deinitialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuI2CSpy_SetDeviceAddress(uint8_t addr); +/* +** =================================================================== +** Method : SetDeviceAddress (component I2CSpy) +** +** Description : +** Sets the I2C Device address to be used +** Parameters : +** NAME - DESCRIPTION +** addr - I2C 7bit address +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuI2CSpy_SetAddressSize(uint8_t size); +/* +** =================================================================== +** Method : SetAddressSize (component I2CSpy) +** +** Description : +** Specifies the address size of the I2C device memory +** Parameters : +** NAME - DESCRIPTION +** size - Either 1 (8bit), 2 (16bit), 3 (24bit), +** or 4 (32bit) +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuI2CSpy_SetBytesPerLine(uint8_t nofBytesPerLine); +/* +** =================================================================== +** Method : SetBytesPerLine (component I2CSpy) +** +** Description : +** Sets the number of bytes per line for the Dump shell command +** Parameters : +** NAME - DESCRIPTION +** nofBytesPerLine - Number of bytes +** per line +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuI2CSpy_OnRequestBus(void); + +void McuI2CSpy_OnReleaseBus(void); + +uint8_t McuI2CSpy_ReadRegData(uint32_t addr, uint8_t *data, size_t dataSize); +/* +** =================================================================== +** Method : ReadRegData (component I2CSpy) +** +** Description : +** Reads data starting from a register address from the current +** device +** Parameters : +** NAME - DESCRIPTION +** addr - Device address +** * data - Pointer to data buffer where read data +** is stored +** dataSize - size of data buffer in bytes +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuI2CSpy_WriteRegData(uint32_t addr, uint8_t *data, uint16_t dataSize); +/* +** =================================================================== +** Method : WriteRegData (component I2CSpy) +** +** Description : +** Writes data starting from a register address to the current +** device +** Parameters : +** NAME - DESCRIPTION +** addr - Address in device +** * data - Pointer to data to write +** dataSize - Size of data in bytes +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuI2CSpy_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : ParseCommand (component I2CSpy) +** +** Description : +** Shell Command Line parser +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command string +** * handled - Pointer to variable which tells if +** the command has been handled or not +** io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuI2CSpy_GetDeviceAddress(void); +/* +** =================================================================== +** Method : GetDeviceAddress (component I2CSpy) +** +** Description : +** Returns the current I2C Device address used +** Parameters : None +** Returns : +** --- - 7bit Device Address +** =================================================================== +*/ + +/* END McuI2CSpy. */ + +#endif +/* ifndef __McuI2CSpy_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuI2cLib.c b/TSM_PicoW_Sensor/McuLib/src/McuI2cLib.c new file mode 100644 index 0000000..eb589aa --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuI2cLib.c @@ -0,0 +1,356 @@ +/* + * Copyright (c) 2019-2023, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuI2cLibconfig.h" + +#if McuLib_CONFIG_MCUI2CLIB_ENABLED +#include "McuLib.h" +#include "McuI2cLib.h" +#if MCUI2CLIB_CONFIG_I2C_RELEASE_BUS + #include "McuGPIO.h" +#endif +#include "McuWait.h" +#include "McuRTOS.h" +#include "McuLog.h" +#if McuLib_CONFIG_CPU_IS_KINETIS + #include "fsl_port.h" + #include "fsl_i2c.h" +#elif McuLib_CONFIG_CPU_IS_LPC + #include "pin_mux.h" + #include "fsl_iocon.h" + #include "fsl_i2c.h" +#elif McuLib_CONFIG_CPU_IS_RPxxxx + #include "hardware/i2c.h" +#elif McuLib_CONFIG_CPU_IS_ESP32 + #include "driver/i2c_master.h" +#endif +#if McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC845 + #include "fsl_swm.h" + #include "fsl_i2c.h" +#endif +#if McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + #include + #include + #include +#endif + +#if McuLib_CONFIG_SDK_VERSION_USED!=McuLib_CONFIG_SDK_LINUX + static uint8_t i2cSlaveDeviceAddr; /* used to store the current I2C device address used */ +#endif + +#if McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + static int i2cBusHandle; /* file handle of I2C bus */ +#endif + +#if McuLib_CONFIG_CPU_IS_ESP32 + static i2c_device_config_t dev_cfg = { + .dev_addr_length = I2C_ADDR_BIT_LEN_7, + .device_address = 0, /* dummy device number */ + .scl_speed_hz = MCUI2CLIB_CONFIG_I2C_BAUDRATE, + .scl_wait_us = 0, /* use default value */ + .flags.disable_ack_check = 0, /* ACK check enabled */ + }; + static i2c_master_dev_handle_t dev_handle = NULL; + static i2c_master_bus_handle_t bus_handle = NULL; + + static void Esp32_SelectDevice(uint8_t deviceAddr) { + /* for ESP32, we re-configure the dev_handle if we switch to a new device */ + esp_err_t err; + + if (deviceAddr!=dev_cfg.device_address) { /* new device to be used? */ + if (dev_handle!=NULL) { /* free previous device handle */ + err = i2c_master_bus_rm_device(dev_handle); + if (err!=ESP_OK) { + McuLog_fatal("failed adding bus device"); + } + } + dev_cfg.device_address = deviceAddr; + err = i2c_master_bus_add_device(bus_handle, &dev_cfg, &dev_handle); + if (err!=ESP_OK) { + McuLog_fatal("failed adding bus device"); + } + } + } +#endif /* McuLib_CONFIG_CPU_IS_ESP32 */ + +uint8_t McuI2cLib_SendBlock(void *Ptr, uint16_t Siz, uint16_t *Snt) { +#if McuLib_CONFIG_CPU_IS_KINETIS || McuLib_CONFIG_CPU_IS_LPC + status_t status; + +#if McuLib_CONFIG_CPU_IS_KINETIS + I2C_MasterClearStatusFlags(MCUI2CLIB_CONFIG_I2C_MASTER_BASEADDR, kI2C_ArbitrationLostFlag | kI2C_IntPendingFlag | kI2C_StartDetectFlag | kI2C_StopDetectFlag); +#elif McuLib_CONFIG_CPU_IS_LPC + I2C_MasterClearStatusFlags(MCUI2CLIB_CONFIG_I2C_MASTER_BASEADDR, kI2C_MasterPendingFlag | kI2C_MasterArbitrationLostFlag | kI2C_MasterStartStopErrorFlag); +#endif + status = I2C_MasterStart(MCUI2CLIB_CONFIG_I2C_MASTER_BASEADDR, i2cSlaveDeviceAddr, kI2C_Write); + if (status!=kStatus_Success) { + return ERR_FAILED; + } +#elif McuLib_CONFIG_CPU_IS_RPxxxx + /* nothing needed */ +#elif McuLib_CONFIG_CPU_IS_ESP32 + /* nothing needed */ +#endif + +#if MCUI2CLIB_CONFIG_ADD_DELAY + McuWait_Waitus(MCUI2CLIB_CONFIG_ADD_DELAY_US); +#endif +#if McuLib_CONFIG_CPU_IS_KINETIS || McuLib_CONFIG_CPU_IS_LPC + status = I2C_MasterWriteBlocking(MCUI2CLIB_CONFIG_I2C_MASTER_BASEADDR, Ptr, Siz, kI2C_TransferNoStartFlag|kI2C_TransferNoStopFlag); + if (status!=kStatus_Success) { + return ERR_FAILED; + } +#elif McuLib_CONFIG_CPU_IS_RPxxxx + int nofBytesWritten; + #if MCUI2CLIB_CONFIG_TIMEOUT_BYTE_US==0 + nofBytesWritten = i2c_write_blocking(MCUI2CLIB_CONFIG_I2C_DEVICE, i2cSlaveDeviceAddr, (uint8_t*)Ptr, Siz, false); + #else + nofBytesWritten = i2c_write_timeout_us(MCUI2CLIB_CONFIG_I2C_DEVICE, i2cSlaveDeviceAddr, (uint8_t*)Ptr, Siz, false, Siz*MCUI2CLIB_CONFIG_TIMEOUT_BYTE_US); + #endif + if (nofBytesWritten!=Siz) { + *Snt = nofBytesWritten; + return ERR_FAILED; + } +#elif McuLib_CONFIG_CPU_IS_ESP32 + esp_err_t ret; + + ret = i2c_master_transmit(dev_handle, Ptr, Siz, pdMS_TO_TICKS(MCUI2CLIB_I2C_MASTER_TIMEOUT_MS)); + if (ret!=ESP_OK) { + return ERR_FAILED; + } +#elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + if (write(i2cBusHandle, Ptr, Siz)<0) { + return ERR_FAILED; + } +#endif + *Snt = Siz; + return ERR_OK; +} + +uint8_t McuI2cLib_RecvBlock(void *Ptr, uint16_t Siz, uint16_t *Rcv) { +#if McuLib_CONFIG_CPU_IS_KINETIS || McuLib_CONFIG_CPU_IS_LPC + status_t status; + + status = I2C_MasterRepeatedStart(MCUI2CLIB_CONFIG_I2C_MASTER_BASEADDR, i2cSlaveDeviceAddr, kI2C_Read); + if (status!=kStatus_Success) { + return ERR_FAILED; + } +#if MCUI2CLIB_CONFIG_ADD_DELAY + McuWait_Waitus(MCUI2CLIB_CONFIG_ADD_DELAY_US); +#endif + status = I2C_MasterReadBlocking(MCUI2CLIB_CONFIG_I2C_MASTER_BASEADDR, Ptr, Siz, kI2C_TransferDefaultFlag); + if (status!=kStatus_Success) { + return ERR_FAILED; + } +#elif McuLib_CONFIG_CPU_IS_RPxxxx + int nofBytesRead; + + nofBytesRead = i2c_read_blocking(MCUI2CLIB_CONFIG_I2C_DEVICE, i2cSlaveDeviceAddr, (uint8_t*)Ptr, Siz, false); + if (nofBytesRead!=Siz) { + *Rcv = nofBytesRead; + return ERR_FAILED; + } +#elif McuLib_CONFIG_CPU_IS_ESP32 + esp_err_t ret; + + ret = i2c_master_receive(dev_handle, Ptr, Siz, pdMS_TO_TICKS(MCUI2CLIB_I2C_MASTER_TIMEOUT_MS)); + if (ret!=ESP_OK) { + return ERR_FAILED; + } +#elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + if (read(i2cBusHandle, Ptr, Siz)!=Siz) { + return ERR_FAILED; + } +#endif + *Rcv = Siz; + return ERR_OK; +} + +uint8_t McuI2cLib_SendStop(void) { +#if McuLib_CONFIG_CPU_IS_KINETIS || McuLib_CONFIG_CPU_IS_LPC + status_t status; + + status = I2C_MasterStop(MCUI2CLIB_CONFIG_I2C_MASTER_BASEADDR); + if (status!=kStatus_Success) { + return ERR_FAILED; + } + return ERR_OK; +#elif McuLib_CONFIG_CPU_IS_RPxxxx + return ERR_OK; /* not required for RP2040 */ +#elif McuLib_CONFIG_CPU_IS_ESP32 + return ERR_OK; /* not required for ESP32 */ +#elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + return ERR_OK; /* not required for Linux */ +#else + return ERR_FAILED; +#endif +} + +uint8_t McuI2cLib_SelectSlave(uint8_t Slv) { +#if McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + if (ioctl(i2cBusHandle, I2C_SLAVE, Slv)<0) { /* select the device */ + return ERR_FAILED; + } +#else + i2cSlaveDeviceAddr = Slv; + #if McuLib_CONFIG_CPU_IS_ESP32 + Esp32_SelectDevice(Slv); + #endif +#endif + return ERR_OK; +} + +#if MCUI2CLIB_CONFIG_I2C_RELEASE_BUS +static void McuI2cLib_ReleaseBus(void) { + McuGPIO_Handle_t sdaPin, sclPin; + McuGPIO_Config_t config; + uint8_t i = 0; + + McuGPIO_GetDefaultConfig(&config); + config.isInput = false; + config.isHighOnInit = true; +#if McuLib_CONFIG_CPU_IS_KINETIS || McuLib_CONFIG_CPU_IS_LPC + config.hw.gpio = MCUI2CLIB_CONFIG_SDA_GPIO; + config.hw.port = MCUI2CLIB_CONFIG_SDA_GPIO_PORT; +#endif + config.hw.pin = MCUI2CLIB_CONFIG_SDA_GPIO_PIN; + sdaPin = McuGPIO_InitGPIO(&config); + +#if McuLib_CONFIG_CPU_IS_KINETIS || McuLib_CONFIG_CPU_IS_LPC + config.hw.gpio = MCUI2CLIB_CONFIG_SCL_GPIO; + config.hw.port = MCUI2CLIB_CONFIG_SCL_GPIO_PORT; +#endif + config.hw.pin = MCUI2CLIB_CONFIG_SCL_GPIO_PIN; + sclPin = McuGPIO_InitGPIO(&config); + + /* Drive SDA low first to simulate a start */ + McuGPIO_SetLow(sdaPin); + McuWait_Waitus(10); + /* Send 9 pulses on SCL and keep SDA high */ + for (i = 0; i < 9; i++) { + McuGPIO_SetLow(sclPin); + McuWait_Waitus(10); + + McuGPIO_SetHigh(sdaPin); + McuWait_Waitus(10); + + McuGPIO_SetHigh(sclPin); + McuWait_Waitus(20); + } + /* Send stop */ + McuGPIO_SetLow(sclPin); + McuWait_Waitus(10); + + McuGPIO_SetLow(sdaPin); + McuWait_Waitus(10); + + McuGPIO_SetLow(sclPin); + McuWait_Waitus(10); + + McuGPIO_SetHigh(sdaPin); + McuWait_Waitus(10); + /* cleanup */ + sdaPin = McuGPIO_DeinitGPIO(sdaPin); + sclPin = McuGPIO_DeinitGPIO(sclPin); +} +#endif /* MCUI2CLIB_CONFIG_I2C_RELEASE_BUS */ + +/* mux as I2C pins */ +static void McuI2cLib_ConfigureI2cPins(void) { +#if McuLib_CONFIG_CPU_IS_KINETIS \ + || McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC55S16 \ + || McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC55S69 \ + || McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC845 + MCUI2CLIB_CONFIG_MUX_I2C_PINS(); +#elif McuLib_CONFIG_CPU_IS_RPxxxx + gpio_set_function(MCUI2CLIB_CONFIG_SDA_GPIO_PIN, GPIO_FUNC_I2C); + gpio_set_function(MCUI2CLIB_CONFIG_SCL_GPIO_PIN, GPIO_FUNC_I2C); + gpio_pull_up(MCUI2CLIB_CONFIG_SDA_GPIO_PIN); + gpio_pull_up(MCUI2CLIB_CONFIG_SCL_GPIO_PIN); +#elif McuLib_CONFIG_CPU_IS_ESP32 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + /* nothing needed */ +#else + #error "unknown configuration and MCU" +#endif +} + +void McuI2cLib_Deinit(void) { + /* nothing implemented */ +} + +#if McuLib_CONFIG_CPU_IS_ESP32 +static esp_err_t esp32_master_init(void) { + esp_err_t err; + + i2c_master_bus_config_t i2c_mst_config = { + .clk_source = I2C_CLK_SRC_DEFAULT, + .i2c_port = MCUI2CLIB_CONFIG_I2C_DEVICE, + .scl_io_num = MCUI2CLIB_CONFIG_SCL_GPIO_PIN, + .sda_io_num = MCUI2CLIB_CONFIG_SDA_GPIO_PIN, + .glitch_ignore_cnt = 7, + .intr_priority = 0, /* use default priority */ + .trans_queue_depth = 0, /* only valid/needed in asynchronous transaction */ + .flags.enable_internal_pullup = true, /* weak pull-ups anyway, use external pull-ups in addition! */ + }; + + err = i2c_new_master_bus(&i2c_mst_config, &bus_handle); + if (err!=ESP_OK) { + McuLog_fatal("failed creating new master bus"); + } + return err; +} +#endif /* McuLib_CONFIG_CPU_IS_ESP32 */ + +void McuI2cLib_Init(void) { +#if MCUI2CLIB_CONFIG_I2C_RELEASE_BUS + McuI2cLib_ReleaseBus(); +#endif +#if McuLib_CONFIG_CPU_IS_KINETIS \ + || McuLib_CONFIG_CPU_IS_LPC55xx && McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC55S16 \ + || McuLib_CONFIG_CPU_IS_LPC55xx && McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC55S69 \ + || McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC845 + MCUI2CLIB_CONFIG_CLOCK_SELECT(); +#elif McuLib_CONFIG_CPU_IS_RPxxxx + i2c_init(MCUI2CLIB_CONFIG_I2C_DEVICE, MCUI2CLIB_CONFIG_I2C_BAUDRATE); +#elif McuLib_CONFIG_CPU_IS_ESP32 + if (esp32_master_init()!=ESP_OK) { + McuLog_fatal("failed initializing I2C"); + } +#elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + i2cBusHandle = open(MCUI2CLIB_CONFIG_I2C_DEVICE, O_RDWR); /* device is something like "/dev/i2c-1" */ + if(i2cBusHandle<0) { /* open bus */ + McuLog_fatal("Failed to open I2C bus!\n"); + } +#else + #error "unknown configuration and MCU" +#endif + + McuI2cLib_ConfigureI2cPins(); + +#if McuLib_CONFIG_CPU_IS_KINETIS || McuLib_CONFIG_CPU_IS_LPC + i2c_master_config_t masterConfig; + uint32_t sourceClock; + /* + * masterConfig->baudRate_Bps = 100000U; + * masterConfig->enableStopHold = false; + * masterConfig->glitchFilterWidth = 0U; + * masterConfig->enableMaster = true; + */ + I2C_MasterGetDefaultConfig(&masterConfig); + masterConfig.baudRate_Bps = MCUI2CLIB_CONFIG_I2C_BAUDRATE; + sourceClock = MCUI2CLIB_CONFIG_I2C_MASTER_CLK_FREQ; + I2C_MasterInit(MCUI2CLIB_CONFIG_I2C_MASTER_BASEADDR, &masterConfig, sourceClock); +#elif McuLib_CONFIG_CPU_IS_RPxxxx + /* nothing needed */ +#elif McuLib_CONFIG_CPU_IS_ESP32 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + /* nothing needed */ +#endif +} +#endif /* McuLib_CONFIG_MCUI2CLIB_ENABLED */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuI2cLib.h b/TSM_PicoW_Sensor/McuLib/src/McuI2cLib.h new file mode 100644 index 0000000..59c32e8 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuI2cLib.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2019-2022, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MCUI2CLIB_H_ +#define MCUI2CLIB_H_ + +#include +#include "McuI2cLibconfig.h" + +typedef enum McuI2cLib_EnumStartFlags_ { + MCUI2CLIB_SEND_START, /* Start is sent */ + MCUI2CLIB_DO_NOT_SEND_START /* Start is not sent */ +} McuI2cLib_EnumStartFlags; + +typedef enum I2CLIB_EnumAckFlags_ { + MCUI2CLIB_SEND_LAST_ACK, /* Nack after last received byte is sent */ + MCUI2CLIB_DO_NOT_LAST_ACK /* Nack after last received byte is not sent */ +} McuI2cLib_EnumAckFlags; + +uint8_t McuI2cLib_RecvBlockCustom(void *Ptr, uint16_t Siz, uint16_t *Rcv, McuI2cLib_EnumStartFlags flagsStart, McuI2cLib_EnumAckFlags flagsAck); + +uint8_t McuI2cLib_RecvBlock(void *Ptr, uint16_t Siz, uint16_t *Rcv); +uint8_t McuI2cLib_SendBlock(void *Ptr, uint16_t Siz, uint16_t *Snt); +uint8_t McuI2cLib_SendBlockContinue(void *Ptr, uint16_t Siz, uint16_t *Snt); +uint8_t McuI2cLib_SendStop(void); +uint8_t McuI2cLib_SelectSlave(uint8_t Slv); + +uint8_t McuI2cLib_ReadAddress(uint8_t i2cAddr, uint8_t *memAddr, uint8_t memAddrSize, uint8_t *data, uint16_t dataSize); +uint8_t McuI2cLib_WriteAddress(uint8_t i2cAddr, uint8_t *memAddr, uint8_t memAddrSize, uint8_t *data, uint16_t dataSize); + +void McuI2cLib_Deinit(void); +void McuI2cLib_Init(void); + +#endif /* MCUI2CLIB_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuINA260.c b/TSM_PicoW_Sensor/McuLib/src/McuINA260.c new file mode 100644 index 0000000..38f214c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuINA260.c @@ -0,0 +1,312 @@ +/** + * Copyright (c) 2023, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * + * \brief Driver for the TI INA260 current/voltage sensor. + */ + +#include "McuINA260.h" +#include "McuUtility.h" +#include "McuGenericI2C.h" + +#define SwapBytes(u16) ((u16<<8)|(u16>>8)) + +/*! + * \brief Convert the 16bit current register value to micro amps + * \param value McuINA260_ADDR_CURRENT_REGISTER register value + * \return Current in micro amp + */ +static int32_t McuINA260_ConvertCurrentRegisterToMicroAmps(int16_t value) { + /* LSB == 1.25 mA == 1250 uA */ + return value*1250; +} + +/*! + * \brief Convert the voltage register value into miro volts + * \param value McuINA260_ADDR_BUS_VOLTAGE_REGISTER register value + * \return Voltage in micro volt + */ +static uint32_t McuINA260_ConvertBusVoltageRegisterToMicroVoltage(uint16_t value) { + /* LSB == 1.25 mV == 1250 uV */ + return (uint32_t)value*1250; +} + +/*! + * \brief Convert the power register value into miro volts + * \param value McuINA260_ADDR_POWER_REGISTER register value + * \return Voltage in milli watt + */ +static uint32_t McuINA260_ConvertPowerRegisterToMilliWatt(uint16_t value) { + /* LSB == 10 mW */ + return (uint32_t)value*10; +} + +uint8_t McuINA260_ReadRegister(INA260_REG_e reg, uint16_t *value) { + uint8_t res; + uint16_t data; + + res = McuGenericI2C_ReadWordAddress8(McuINA260_CONFIG_I2C_ADDRESS, reg, &data); + if (res!=ERR_OK) { + return res; + } + *value = SwapBytes(data); + return ERR_OK; +} + +uint8_t McuINA260_WriteRegister(INA260_REG_e reg, uint16_t value) { + uint8_t res; + uint16_t data; + + data = SwapBytes(value); + res = McuGenericI2C_WriteWordAddress8(McuINA260_CONFIG_I2C_ADDRESS, reg, data); + if (res!=ERR_OK) { + return res; + } + return ERR_OK; +} + +uint8_t McuINA260_ReadConfigRegister(uint16_t *value) { + return McuINA260_ReadRegister(McuINA260_ADDR_CONFIGURATION_REGISTER, value); +} + +uint8_t McuINA260_WriteConfigRegister(uint16_t value) { + return McuINA260_WriteRegister(McuINA260_ADDR_CONFIGURATION_REGISTER, value); +} + +uint8_t McuINA260_WriteResetBit(void) { + return McuINA260_WriteConfigRegister(1<<15); +} + +uint8_t McuINA260_ReadCurrentRegister(int16_t *value) { + return McuINA260_ReadRegister(McuINA260_ADDR_CURRENT_REGISTER, (uint16_t*)value); +} + +uint8_t McuINA260_ReadBusVoltageRegister(uint16_t *value) { + return McuINA260_ReadRegister(McuINA260_ADDR_BUS_VOLTAGE_REGISTER, value); +} + +uint8_t McuINA260_ReadPowerRegister(uint16_t *value) { + return McuINA260_ReadRegister(McuINA260_ADDR_POWER_REGISTER, value); +} + +uint8_t McuINA260_ReadMaskEnableRegister(uint16_t *value) { + return McuINA260_ReadRegister(McuINA260_ADDR_MASK_ENABLE_REGISTER, value); +} + +uint8_t McuINA260_ReadAlertLimitRegister(uint16_t *value) { + return McuINA260_ReadRegister(McuINA260_ADDR_ALERT_LIMIT_REGISTER, value); +} + +uint8_t McuINA260_ReadManufacturereIDRegister(uint16_t *value) { + return McuINA260_ReadRegister(McuINA260_ADDR_MANUFACTURER_ID_REGISTER, value); +} + +uint8_t McuINA260_ReadDieIDRegister(uint16_t *value) { + return McuINA260_ReadRegister(McuINA260_ADDR_DIE_ID_REGISTER, value); +} + +/*! + * \brief Read the bus voltage measurement value from the device. + * \return Power value, as mV (micro-Volt). + */ +uint32_t McuINA260_ReadVoltage(void) { + uint8_t res; + uint16_t val; + + res = McuINA260_ReadBusVoltageRegister(&val); + if (res==ERR_OK) { + return McuINA260_ConvertBusVoltageRegisterToMicroVoltage(val); + } else { + return 0; /* error case */ + } +} + +/*! + * \brief Read the power measurement value from the device. + * \return Power value, as mW (milli-Watt). + */ +uint32_t McuINA260_ReadPower(void) { + uint8_t res; + uint16_t val; + + res = McuINA260_ReadPowerRegister(&val); + if (res==ERR_OK) { + return McuINA260_ConvertPowerRegisterToMilliWatt(val); + } else { + return 0; /* error case */ + } +} + +/*! + * \brief Read the current measurement value from the device. + * \return Current value, as uA (micro-Amps). + */ +int32_t McuINA260_ReadCurrent(void) { + uint8_t res; + int16_t val; + + res = McuINA260_ReadCurrentRegister(&val); + if (res==ERR_OK) { + return McuINA260_ConvertCurrentRegisterToMicroAmps(val); + } else { + return 0; /* error case */ + } +} + +#if McuINA260_CONFIG_PARSE_COMMAND_ENABLED +static uint8_t PrintStatus(const McuShell_StdIOType *io) { + uint8_t buf[32]; + uint16_t value; + int16_t i16; + + McuShell_SendStatusStr((unsigned char*)"McuINA260", (unsigned char*)"INA260 sensor status\r\n", io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), McuINA260_CONFIG_I2C_ADDRESS); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" I2C addr", buf, io->stdOut); + + if (McuINA260_ReadConfigRegister(&value)==ERR_OK) { + buf[0] = '\0'; + McuUtility_strcatNum8Hex(buf, sizeof(buf), McuINA260_ADDR_CONFIGURATION_REGISTER); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"h: 0x"); + McuUtility_strcatNum16Hex(buf, sizeof(buf), value); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"FAILED\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" Config", buf, io->stdOut); + + if (McuINA260_ReadCurrentRegister(&i16)==ERR_OK) { + int32_t uA = McuINA260_ConvertCurrentRegisterToMicroAmps(i16); + + buf[0] = '\0'; + McuUtility_strcatNum8Hex(buf, sizeof(buf), McuINA260_ADDR_CURRENT_REGISTER); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"h: 0x"); + McuUtility_strcatNum16Hex(buf, sizeof(buf), i16); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)", "); + McuUtility_strcatNum32s(buf, sizeof(buf), uA/1000); + McuUtility_chcat(buf, sizeof(buf), '.'); + if (uA<0) { /* value can be negative */ + uA = -uA; /* make it positive for the modulo operation below */ + } + McuUtility_strcatNum32sFormatted(buf, sizeof(buf), uA%1000, '0', 3); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" mA\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"FAILED\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" Current", buf, io->stdOut); + + if (McuINA260_ReadBusVoltageRegister(&value)==ERR_OK) { + uint32_t uV = McuINA260_ConvertBusVoltageRegisterToMicroVoltage(value); + + buf[0] = '\0'; + McuUtility_strcatNum8Hex(buf, sizeof(buf), McuINA260_ADDR_BUS_VOLTAGE_REGISTER); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"h: 0x"); + McuUtility_strcatNum16Hex(buf, sizeof(buf), value); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)", "); + McuUtility_strcatNum32u(buf, sizeof(buf), uV/1000); + McuUtility_chcat(buf, sizeof(buf), '.'); + McuUtility_strcatNum32sFormatted(buf, sizeof(buf), uV%1000, '0', 3); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" mV\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"FAILED\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" Bus voltage", buf, io->stdOut); + + if (McuINA260_ReadPowerRegister(&value)==ERR_OK) { + buf[0] = '\0'; + McuUtility_strcatNum8Hex(buf, sizeof(buf), McuINA260_ADDR_POWER_REGISTER); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"h: 0x"); + McuUtility_strcatNum16Hex(buf, sizeof(buf), value); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)", "); + McuUtility_strcatNum32u(buf, sizeof(buf), McuINA260_ConvertPowerRegisterToMilliWatt(value)); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" mW\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"FAILED\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" Power", buf, io->stdOut); + + if (McuINA260_ReadAlertLimitRegister(&value)==ERR_OK) { + buf[0] = '\0'; + McuUtility_strcatNum8Hex(buf, sizeof(buf), McuINA260_ADDR_ALERT_LIMIT_REGISTER); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"h: 0x"); + McuUtility_strcatNum16Hex(buf, sizeof(buf), value); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"FAILED\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" Alert limit", buf, io->stdOut); + + if (McuINA260_ReadManufacturereIDRegister(&value)==ERR_OK) { + buf[0] = '\0'; + McuUtility_strcatNum8Hex(buf, sizeof(buf), McuINA260_ADDR_MANUFACTURER_ID_REGISTER); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"h: 0x"); + McuUtility_strcatNum16Hex(buf, sizeof(buf), value); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"FAILED\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" Manufac. ID", buf, io->stdOut); + + if (McuINA260_ReadDieIDRegister(&value)==ERR_OK) { + buf[0] = '\0'; + McuUtility_strcatNum8Hex(buf, sizeof(buf), McuINA260_ADDR_DIE_ID_REGISTER); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"h: 0x"); + McuUtility_strcatNum16Hex(buf, sizeof(buf), value); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"FAILED\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" Die ID", buf, io->stdOut); + + return ERR_OK; +} + +static uint8_t PrintHelp(const McuShell_StdIOType *io) { + McuShell_SendHelpStr((unsigned char*)"INA260", (unsigned char*)"Group of INA260 commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" reset", (unsigned char*)"Reset the device with the reset bit\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" config ", (unsigned char*)"Write a value to the configuration register\r\n", io->stdOut); + return ERR_OK; +} + +uint8_t McuINA260_ParseCommand(const unsigned char* cmd, bool *handled, const McuShell_StdIOType *io) { + uint8_t res = ERR_OK; + + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP) == 0 + || McuUtility_strcmp((char*)cmd, "INA260 help") == 0) + { + *handled = true; + return PrintHelp(io); + } else if ( (McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) + || (McuUtility_strcmp((char*)cmd, "INA260 status")==0) + ) + { + *handled = true; + res = PrintStatus(io); + } else if (McuUtility_strcmp((char*)cmd, "INA260 reset")==0) { + *handled = true; + return McuINA260_WriteResetBit(); + } else if (McuUtility_strncmp((char*)cmd, "INA260 config ", sizeof("INA260 config "-1))==0) { + const unsigned char *p; + int32_t val; + + *handled = true; + p = cmd + sizeof("INA260 config "-1); + if (McuUtility_xatoi(&p, &val)==ERR_OK && val>=0) { + return McuINA260_WriteConfigRegister(val); + } + } + return res; +} +#endif /* McuINA260_CONFIG_PARSE_COMMAND_ENABLED */ + +void McuINA260_Deinit(void) { + /* nothing needed */ +} + +void McuINA260_Init(void) { + /* nothing needed */ +} diff --git a/TSM_PicoW_Sensor/McuLib/src/McuINA260.h b/TSM_PicoW_Sensor/McuLib/src/McuINA260.h new file mode 100644 index 0000000..fa85745 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuINA260.h @@ -0,0 +1,89 @@ +/** + * Copyright (c) 2023, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * + * \brief Driver for the TI INA260 current/voltage sensor. + */ + +#ifndef McuINA260_H_ +#define McuINA260_H_ + +#include "McuINA260config.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* TI INA260 device registers: */ +typedef enum INA260_REG_e { + McuINA260_ADDR_CONFIGURATION_REGISTER = 0x00, + McuINA260_ADDR_CURRENT_REGISTER = 0x01, + McuINA260_ADDR_BUS_VOLTAGE_REGISTER = 0x02, + McuINA260_ADDR_POWER_REGISTER = 0x03, + McuINA260_ADDR_MASK_ENABLE_REGISTER = 0x06, + McuINA260_ADDR_ALERT_LIMIT_REGISTER = 0x07, + McuINA260_ADDR_MANUFACTURER_ID_REGISTER = 0xFE, + McuINA260_ADDR_DIE_ID_REGISTER = 0xFF, +} INA260_REG_e; + +/*! + * \brief Read a device register + * \param reg Device register + * \param value Pointer where to store the register value + * \return Error code, ERR_OK if everything is ok. + */ +uint8_t McuINA260_ReadRegister(INA260_REG_e reg, uint16_t *value); + +/*! + * \brief Write a device register + * \param reg Device register + * \param value Register value to write + * \return Error code, ERR_OK if everything is ok. + */ +uint8_t McuINA260_WriteRegister(INA260_REG_e reg, uint16_t value); + +/*! + * \brief Read the bus voltage measurement value from the device. + * \return Power value, as mV (micro-Volt). + */ +uint32_t McuINA260_ReadVoltage(void); + +/*! + * \brief Read the power measurement value from the device. + * \return Power value, as mW (milli-Watt). + */ +uint32_t McuINA260_ReadPower(void); + +/*! + * \brief Read the current measurement value from the device. + * \return Current value, as uA (micro-Amps). + */ +int32_t McuINA260_ReadCurrent(void); + + +#if McuINA260_CONFIG_PARSE_COMMAND_ENABLED + #include "McuShell.h" + +/*! + * \brief Shell command line handler + * \param cmd Pointer to the command string + * \param handled Return value to indicate if command has been recognized + * \param io I/O handler for input/output + * \return Error code, ERR_OK for no error + */ + uint8_t McuINA260_ParseCommand(const unsigned char* cmd, bool *handled, const McuShell_StdIOType *io); +#endif + +/*! \brief Module de-initialization */ +void McuINA260_Deinit(void); + +/*! \brief Module initialization */ +void McuINA260_Init(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* McuINA260_H_ */ \ No newline at end of file diff --git a/TSM_PicoW_Sensor/McuLib/src/McuIO.c b/TSM_PicoW_Sensor/McuLib/src/McuIO.c new file mode 100644 index 0000000..8af9eb1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuIO.c @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2024, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuLib.h" +#include "McuIO.h" +#include "McuRTOS.h" +#include "McuLog.h" +#include "McuRB.h" +#include +#include + +static int McuIO_Read(McuIO_Desc_t *io) { + char ch; +#if MCUIO_CONFIG_USE_FREERTOS_QUEUE + if (xQueueReceive((QueueHandle_t)io->buffer.buf, &ch, portMAX_DELAY)!= pdPASS) { + McuLog_fatal("failed receiving data"); + return EOF; + } +#else + McuRB_Get((McuRB_Handle_t)io->buffer.buf, &ch); +#endif + return ch; +} + +static int McuIO_Write(McuIO_Desc_t *io, char ch) { +#if MCUIO_CONFIG_USE_FREERTOS_QUEUE + if (xQueueSend((QueueHandle_t)io->buffer.buf, &ch, portMAX_DELAY)!= pdPASS) { + McuLog_fatal("failed sending"); + return 0; /* failed */ + } + return 1; /* success */ +#else + if (McuRB_Put((McuRB_Handle_t)io->buffer.buf, &ch)!=ERR_OK) { + return 0; /* failed */ + } + return 1; /* success */ +#endif +} + +static size_t McuIO_NofData(McuIO_Desc_t *io) { +#if MCUIO_CONFIG_USE_FREERTOS_QUEUE + return uxQueueMessagesWaiting((QueueHandle_t)io->buffer.buf); +#else + return McuRB_NofElements((McuRB_Handle_t)io->buffer.buf); +#endif +} + +static size_t McuIO_NofFree(McuIO_Desc_t *io) { +#if MCUIO_CONFIG_USE_FREERTOS_QUEUE + return uxQueueSpacesAvailable((QueueHandle_t)io->buffer.buf); +#else + return McuRB_NofFreeElements((McuRB_Handle_t)io->buffer.buf); +#endif +} + +static void McuIO_OutFlush(void) { + /* default dummy implemenation */ +} + +static void McuIO_OutWrite(char ch) { + (void)ch; + /* default dummy implemenation */ +} + +McuIO_Desc_t *McuIO_NewIO(size_t nofBufferElements) { + McuIO_Desc_t *io; +#if MCUIO_CONFIG_USE_FREERTOS_HEAP + io = (McuIO_Desc_t*)pvPortMalloc(sizeof(McuIO_Desc_t)); /* get a new device descriptor */ +#else + io = (McuIO_Desc_t*)malloc(sizeof(McuIO_Desc_t)); /* get a new device descriptor */ +#endif + if (io==NULL) { + McuLog_fatal("failed allocating memory"); + return NULL; + } +#if MCUIO_CONFIG_USE_FREERTOS_QUEUE + io->buffer.buf = xQueueCreate(nofBufferElements, sizeof(uint8_t)); + if (io->buffer.buf==NULL) { + McuLog_fatal("failed creating buffer"); + return NULL; + } + vQueueAddToRegistry(io->buffer.buf, "ioBuf"); +#else + McuRB_Config_t config; + + McuRB_GetDefaultconfig(&config); + config.elementSize = sizeof(uint8_t); + config.nofElements = nofBufferElements; + io->buffer.buf = McuRB_InitRB(&config); + if (io->buffer.buf==NULL) { + McuLog_fatal("failed creating buffer"); + return NULL; + } +#endif + io->buffer.read = McuIO_Read; + io->buffer.write = McuIO_Write; + io->buffer.nofData = McuIO_NofData; + io->buffer.nofFree = McuIO_NofFree; + io->out.flush = McuIO_OutFlush; + io->out.write = McuIO_OutWrite; + return io; +} + +McuIO_Desc_t *McuIO_FreeIO(McuIO_Desc_t *io) { +#if MCUIO_CONFIG_USE_FREERTOS_QUEUE + vQueueDelete(io->buffer.buf); + io->buffer.buf = NULL; +#else + io->buffer.buf = McuRB_DeinitRB(io->buffer.buf); +#endif +#if MCUIO_CONFIG_USE_FREERTOS_HEAP + vPortFree(io); +#else + free(io); +#endif + return NULL; +} diff --git a/TSM_PicoW_Sensor/McuLib/src/McuIO.h b/TSM_PicoW_Sensor/McuLib/src/McuIO.h new file mode 100644 index 0000000..21d6ba7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuIO.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2024, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * Devines the SDEP IDs. + */ + +#ifndef _MCU_IO_H__ +#define _MCU_IO_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "McuIOconfig.h" +#include + +typedef struct McuIO_Desc_t { + struct { + void *buf; /* handle to the buffer */ + int (*write)(struct McuIO_Desc_t *io, char ch); /* write a character, returns the number of bytes written */ + int (*read)(struct McuIO_Desc_t *io); /* read a character and return it, or return EOF */ + size_t (*nofData)(struct McuIO_Desc_t *io); /* return the number of data character in buffer */ + size_t (*nofFree)(struct McuIO_Desc_t *io); /* return the number of free character in buffer */ + } buffer; + struct { + void (*write)(char ch); + void (*flush)(void); /* optional flushing method, can be NULL */ + } out; +} McuIO_Desc_t; + +McuIO_Desc_t *McuIO_NewIO(size_t nofBufferElements); +McuIO_Desc_t *McuIO_FreeIO(McuIO_Desc_t *io); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* _MCU_IO_H__ */ \ No newline at end of file diff --git a/TSM_PicoW_Sensor/McuLib/src/McuLC709203F.c b/TSM_PicoW_Sensor/McuLib/src/McuLC709203F.c new file mode 100644 index 0000000..7b927f3 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuLC709203F.c @@ -0,0 +1,454 @@ +/* + * Copyright (c) 2019, Erich Styger, Sarah Gander + * All rights reserved. + * + * Driver for GPIO pins + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuLib.h" +#if McuLib_CONFIG_CPU_IS_STM + #include "libIIC.h" +#endif +#include "McuLC709203Fconfig.h" +#include "McuLC709203F.h" +#include "McuGenericI2C.h" +#include "McuUtility.h" +#include "McuWait.h" + +#define LC709203F_I2C_SLAVE_ADDR 0x0B + +#define LC709203F_REG_SET_BEFORE_RSOC 0x04 /* Before RSCOC */ +#define LC709203F_REG_SET_THERMB 0x06 /* Thermistor B */ +#define LC709203F_REG_INIT_RSOC 0x07 /* Initial RSOC */ +#define LC709203F_REG_CELL_TEMP 0x08 /* Cell temperature */ +#define LC709203F_REG_VOLTAGE 0x09 /* Cell voltage */ +#define LC709203F_REG_CURRENT_DIRECTION 0x0A /* Current direction */ +#define LC709203F_REG_ADJ_APPLI 0x0B /* APA, Adjustment Pack Application, sets Parasitic impedance */ +#define LC709203F_REG_APT 0x0C /* APT, Adjustment Pack Thermistor, adjust temperature measurement delay timing */ +#define LC709203F_REG_RSOC 0x0D /* RSOC, value based 0-100 scale */ +#define LC709203F_REG_ITE 0x0F /* ITE, Indicator to Empty */ +#define LC709203F_REG_IC_VER 0x11 /* IC version */ +#define LC709203F_REG_CHG_PARAM 0x12 /* change of parameter */ +#define LC709203F_REG_RSOC_ALM 0x13 /* Alarm low RSOC */ +#define LC709203F_REG_LOW_CELL_VOL_ALM 0x14 /* Alarm Low Cell Voltage */ +#define lC709203F_REG_PW_MODE 0x15 /* IC Power Mode */ +#define LC709203F_REG_EN_NTC 0x16 /* Status Bit, enable Thermistor mode */ +#define LC709203F_REG_NUM_PARAMS 0x1A /* Number of the parameter, display batter profile code */ + +#define MCULC_TEMP_ZERO_CELSIUS 0x0AAC /* From the data sheet command table: 0x0AAC is 0 degree Celsius */ + +static uint8_t i2cReadCmdData(uint8_t i2cAddr, uint8_t cmd, uint8_t *data, size_t length) { + return McuGenericI2C_ReadAddress(i2cAddr, &cmd, sizeof(cmd), data, length); +} + +static uint8_t i2cWriteCmdData(uint8_t i2cAddr, uint8_t cmd, uint8_t *data, size_t length) { + return McuGenericI2C_WriteAddress(i2cAddr, &cmd, sizeof(cmd), data, length); +} + +static uint8_t calcCrc8Atm(uint8_t a, uint8_t b) { + /* the sensor uses a CRC-8-ATM, + * Polynomial: x8 + x2 + x + 1 + * Corresponds to: 100000111 + */ + #define POLY_8 0x8380 + uint8_t i = 0; + uint16_t val = 0; + + val = (uint16_t)(a^b); + val <<= 8; + for(i=0; i<8; i++) { + if (val&0x8000 ){ + val ^= POLY_8; + } + val <<= 1; + } + return (uint8_t)(val >> 8); +} + +static uint8_t calcCRC_WriteAccess16(uint8_t i2cSlaveAddr, uint8_t cmd, uint8_t low, uint8_t high) { + uint8_t crc; + + crc = calcCrc8Atm(0x00, i2cSlaveAddr<<1); /* I2C slave address */ + crc = calcCrc8Atm(crc, cmd); /* command */ + crc = calcCrc8Atm(crc, low); /* data byte */ + return calcCrc8Atm(crc, high); /* data byte */ +} + +static uint8_t calcCRC_ReadAccess16(uint8_t i2cSlaveAddr, uint8_t cmd, uint8_t low, uint8_t high) { + uint8_t crc; + + crc = calcCrc8Atm(0x00, i2cSlaveAddr<<1); /* I2C slave address */ + crc = calcCrc8Atm(crc, cmd); /* command */ + crc = calcCrc8Atm(crc, (i2cSlaveAddr<<1)|1); /* I2C address with R bit set */ + crc = calcCrc8Atm(crc, low); /* data byte */ + return calcCrc8Atm(crc, high); /* data byte */ +} + +static uint8_t CheckCrc(uint8_t i2cSlaveAddr, uint8_t cmd, uint8_t low, uint8_t high, uint8_t crc) { + uint8_t val; + + val = calcCRC_ReadAccess16(i2cSlaveAddr, cmd, low, high); + if (val != crc) { + return ERR_FAILED; + } + return ERR_OK; +} + +static uint8_t CheckI2CErr(uint8_t res) { + if (res==ERR_OK) { + return ERR_OK; /* ok */ + } +#if MCULC_CONFIG_BLOCK_ON_I2C_ERROR + for(;;) { /* I2C Error? wait for the watchdog to kick in... */ + McuWait_WaitOSms(50); + } +#endif + return ERR_FAILED; +} + +static uint8_t WriteCmdWordChecked(uint8_t i2cSlaveAddr, uint8_t cmd, uint8_t low, uint8_t high) { + uint8_t data[3]; + + data[0] = low; + data[1] = high; + data[2] = calcCRC_WriteAccess16(i2cSlaveAddr, cmd, data[0], data[1]); + return CheckI2CErr(i2cWriteCmdData(i2cSlaveAddr, cmd, data, sizeof(data))); +} + +void McuLC_Wakeup(void) { + /* Generates wake up signal on SDA, according to the data sheet. + * This has to happen before any other I2C communication on the bus: + * Pull down SDA for 0.6us, then high again, + * wait for 400 us + * */ +#if McuLib_CONFIG_CPU_IS_STM + /* set SDA pin of I2C to GPIO Output mode. */ + HAL_I2C_MspDeInit(&hi2c3); + GPIO_InitTypeDef GPIO_InitStruct = {0}; + GPIO_InitStruct.Pin = I2C_SDA_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + HAL_GPIO_WritePin(I2C_SDA_GPIO_Port, I2C_SDA_Pin, GPIO_PIN_RESET); + McuWait_Waitus(1); /* SDA min 0.6us low */ + HAL_GPIO_WritePin(I2C_SDA_GPIO_Port, I2C_SDA_Pin, GPIO_PIN_SET); + McuWait_Waitus(400); /* wait 400us */ + /* set SDA pin of I2C to GPIO Ouput mode. */ + HAL_I2C_MspInit(&hi2c3); +#elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_PROCESSOR_EXPERT + PORT_PDD_SetPinMuxControl(PORTB_BASE_PTR, 3, PORT_PDD_MUX_CONTROL_ALT1); /* MUX SDA/PTB3 as GPIO */ + PORT_PDD_SetPinOpenDrain(PORTB_BASE_PTR, 3, PORT_PDD_OPEN_DRAIN_ENABLE); + GPIO_PDD_SetPortOutputDirectionMask(PTB_BASE_PTR, (1<<3)); /* SDA/PTB3 as output */ + GPIO_PDD_ClearPortDataOutputMask(PTB_BASE_PTR, 1<<3); /* SDA/PB3 low */ + McuWait_Waitus(1); /* SDA min 0.6us low */ + GPIO_PDD_SetPortDataOutputMask(PTB_BASE_PTR, 1<<3); /* SDA/PB3 high */ + McuWait_Waitus(400); /* wait 400us */ + /* mux back to normal I2C mode with interrupts enabled */ + PORTB_PCR3 = (uint32_t)((PORTB_PCR3 & (uint32_t)~(uint32_t)( + PORT_PCR_ISF_MASK | + PORT_PCR_MUX(0x05) + )) | (uint32_t)( + PORT_PCR_MUX(0x02) + )); + PORT_PDD_SetPinOpenDrain(PORTB_BASE_PTR, 0x03u, PORT_PDD_OPEN_DRAIN_ENABLE); /* Set SDA pin as open drain */ +#else + /* NYI for NXP SDK yet */ +#endif +} + +static uint8_t ReadCmdWordChecked(uint8_t i2cSlaveAddr, uint8_t cmd, uint16_t *val) { + uint8_t data[3]; + uint8_t res; + + res = CheckI2CErr(i2cReadCmdData(i2cSlaveAddr, cmd, data, sizeof(data))); + if (res!=ERR_OK) { + return res; + } + res = CheckI2CErr(CheckCrc(i2cSlaveAddr, cmd, data[0], data[1], data[2])); + if (res!=ERR_OK) { + return res; + } + *val = (data[1]<<8) | data[0]; + return ERR_OK; +} + +/* returns cell voltage in mV */ +uint8_t McuLC_GetVoltage(uint16_t *pVoltage) { + return ReadCmdWordChecked(LC709203F_I2C_SLAVE_ADDR, LC709203F_REG_VOLTAGE, pVoltage); +} + +/* returns cell temperature (10 = 1 degree C) */ +uint8_t McuLC_GetTemperature(int16_t *pTemperature) { + /* cell temperature is in 0.1C units, from 0x09E4 (-20C) up to 0x0D04 (60C) */ + uint8_t res; + + res = ReadCmdWordChecked(LC709203F_I2C_SLAVE_ADDR, LC709203F_REG_CELL_TEMP, (uint16_t*)pTemperature); + if (res!=ERR_OK) { + return res; + } + *pTemperature -= MCULC_TEMP_ZERO_CELSIUS; /* From the data sheet command table: 0x0AAC is 0 degree Celsius */ + return ERR_OK; +} + +uint8_t McuLC_SetTemperature(int16_t temperature) { + /* cell temperature is in 0.1C units, from 0x09E4 (-20C) up to 0x0D04 (60C) */ + temperature = ((uint16_t)temperature)+MCULC_TEMP_ZERO_CELSIUS; /* From the data sheet command table: 0x0AAC is 0 degree Celsius */ + return WriteCmdWordChecked(LC709203F_I2C_SLAVE_ADDR, LC709203F_REG_CELL_TEMP, ((uint16_t)temperature)&0xff, (((uint16_t)temperature)>>8)&0xff); +} + +/* returns battery Relative State of Charge in percent */ +uint8_t McuLC_GetRSOC(uint16_t *pRsoc) { + return ReadCmdWordChecked(LC709203F_I2C_SLAVE_ADDR, LC709203F_REG_RSOC, pRsoc); +} + +/* Indicator to empty, returns battery charge in thousandth */ +uint8_t McuLC_GetITE(uint16_t *pIte) { + return ReadCmdWordChecked(LC709203F_I2C_SLAVE_ADDR, LC709203F_REG_ITE, pIte); +} + +/* Indicator to empty, returns battery charge in thousandth */ +uint8_t McuLC_GetICversion(uint16_t *pVersion) { + return ReadCmdWordChecked(LC709203F_I2C_SLAVE_ADDR, LC709203F_REG_IC_VER, pVersion); +} + +#if MCULC709203F_CONFIG_PARSE_COMMAND_ENABLED +static const unsigned char *McuLC_CurrentDirectionToString(McuLC_CurrentDirection dir) { + switch(dir) { + case McuLC_CURRENT_DIR_AUTO: return (const unsigned char*)"auto"; + case McuLC_CURRENT_DIR_CHARGING: return (const unsigned char*)"charging"; + case McuLC_CURRENT_DIR_DISCHARING: return (const unsigned char*)"discharging"; + case McuLC_CURRENT_DIR_ERROR: + default: return (const unsigned char*)"ERROR"; + } +} +#endif + +uint8_t McuLC_GetCurrentDirection(McuLC_CurrentDirection *pDir) { + uint16_t val; + uint8_t res; + + res = ReadCmdWordChecked(LC709203F_I2C_SLAVE_ADDR, LC709203F_REG_CURRENT_DIRECTION, &val); + if (res!=ERR_OK) { + return res; + } + switch(val) { + case 0: *pDir = McuLC_CURRENT_DIR_AUTO; break; + case 1: return McuLC_CURRENT_DIR_CHARGING; break; + case 0xffff: return McuLC_CURRENT_DIR_DISCHARING; break; + default: return McuLC_CURRENT_DIR_ERROR; break; + } + return ERR_OK; +} + +uint8_t McuLC_SetCurrentDirection(McuLC_CurrentDirection direction) { + uint8_t low, high; + + switch(direction) { + case McuLC_CURRENT_DIR_AUTO: low = 0x00; high = 0x00; break; + case McuLC_CURRENT_DIR_CHARGING: low = 0x01; high = 0x00; break; + case McuLC_CURRENT_DIR_DISCHARING: low = 0xff; high = 0xff; break; + default: + CheckI2CErr(ERR_FAILED); + return ERR_FAILED; + } + return WriteCmdWordChecked(LC709203F_I2C_SLAVE_ADDR, LC709203F_REG_CURRENT_DIRECTION, low, high); +} + +#if MCULC709203F_CONFIG_PARSE_COMMAND_ENABLED +static uint8_t PrintStatus(McuShell_ConstStdIOType *io) { + uint8_t buf[32], res; + + McuShell_SendStatusStr((unsigned char*)"LC", (const unsigned char*)"\r\n", io->stdOut); + { + uint16_t version; + + res = McuLC_GetICversion(&version); /* battery charge in thousandth */ + if (res==ERR_OK) { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum16Hex(buf, sizeof(buf), version); + McuUtility_strcat(buf, sizeof(buf), (const unsigned char*)"\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ERROR\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" IC version", buf, io->stdOut); + } + { + uint16_t rsoc; + + res = McuLC_GetRSOC(&rsoc); /* battery charge in percent */ + if (res==ERR_OK) { + McuUtility_Num16uToStr(buf, sizeof(buf), rsoc); + McuUtility_strcat(buf, sizeof(buf), (const unsigned char*)"\% (0..100)\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ERROR\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" RSOC", buf, io->stdOut); + } + { + uint16_t ite; + + res = McuLC_GetITE(&ite); /* battery charge in thousandth */ + if (res==ERR_OK) { + McuUtility_Num16uToStr(buf, sizeof(buf), ite); + McuUtility_strcat(buf, sizeof(buf), (const unsigned char*)" (0..1000)\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ERROR\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" ITE", buf, io->stdOut); + } + { + int16_t temperature; + bool isI2Cmode; + + res = McuLC_GetTemperature(&temperature); /* cell temperature in 1/10-degree C */ + if (res==ERR_OK) { + McuUtility_Num16sToStr(buf, sizeof(buf), temperature/10); + McuUtility_chcat(buf, sizeof(buf), '.'); + if (temperature<0) { /* make it positive */ + temperature = -temperature; + } + McuUtility_strcatNum16s(buf, sizeof(buf), temperature%10); + McuUtility_strcat(buf, sizeof(buf), (const unsigned char*)" C"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ERROR"); + } + if (McuLC_GetTemperatureMeasurementMode(&isI2Cmode)==ERR_OK) { + if (isI2Cmode) { + McuUtility_strcat(buf, sizeof(buf), (const unsigned char*)" (I2C mode)"); + } else { + McuUtility_strcat(buf, sizeof(buf), (const unsigned char*)" (Thermistor mode)"); + } + } else { + McuUtility_strcat(buf, sizeof(buf), (const unsigned char*)" (ERROR!)"); + } + McuUtility_strcat(buf, sizeof(buf), (const unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" Temperature", buf, io->stdOut); + } + { + uint16_t mVolt; + + res = McuLC_GetVoltage(&mVolt); /* cell voltage in milli-volts */ + if (res==ERR_OK) { + McuUtility_Num16uToStr(buf, sizeof(buf), mVolt); + McuUtility_strcat(buf, sizeof(buf), (const unsigned char*)" mV\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ERROR\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" Voltage", buf, io->stdOut); + } + { + McuLC_CurrentDirection direction; + + res = McuLC_GetCurrentDirection(&direction); + if (res==ERR_OK) { + McuUtility_strcpy(buf, sizeof(buf), McuLC_CurrentDirectionToString(direction)); + McuUtility_strcat(buf, sizeof(buf), (const unsigned char*)"\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ERROR\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" Current dir", buf, io->stdOut); + } + return ERR_OK; +} +#endif /* MCULC709203F_CONFIG_PARSE_COMMAND_ENABLED */ + +#if MCULC709203F_CONFIG_PARSE_COMMAND_ENABLED +uint8_t McuLC_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) { + uint8_t res = ERR_OK; + const uint8_t *p; + + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, "LC help")==0) { + McuShell_SendHelpStr((unsigned char*)"LC", (const unsigned char*)"Group of LC709203F commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (const unsigned char*)"Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" settemp ", (const unsigned char*)"In I2C temperature mode, set the temperature in deci-Celsius\r\n", io->stdOut); + *handled = TRUE; + return ERR_OK; + } else if ((McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) || (McuUtility_strcmp((char*)cmd, "LC status")==0)) { + *handled = TRUE; + return PrintStatus(io); + } else if (McuUtility_strncmp((char*)cmd, (char*)"LC settemp ", sizeof("LC settemp ")-1)==0) { + int16_t val; + + *handled = TRUE; + p = cmd+sizeof("LC settemp ")-1; + if (McuUtility_ScanDecimal16sNumber(&p, &val)!=ERR_OK) { + return ERR_FAILED; + } + return McuLC_SetTemperature(val); + } + return res; +} +#endif /* MCULC709203F_CONFIG_PARSE_COMMAND_ENABLED */ + +uint8_t McuLC_GetTemperatureMeasurementMode(bool *isI2Cmode) { + uint16_t val=0; + uint8_t res; + + res = ReadCmdWordChecked(LC709203F_I2C_SLAVE_ADDR, LC709203F_REG_EN_NTC, &val); + if (res!=ERR_OK) { + return res; + } + *isI2Cmode = val==0; /* 0: i2c, 1: thermistor mode */ + return ERR_OK; +} + +uint8_t McuLC_SetTemperatureMeasurementMode(bool i2cMode) { + return WriteCmdWordChecked(LC709203F_I2C_SLAVE_ADDR, LC709203F_REG_EN_NTC, i2cMode?0x00:0x01, 0x0); +} + +uint8_t McuLC_SetPowerMode(bool sleepMode) { + return WriteCmdWordChecked(LC709203F_I2C_SLAVE_ADDR, lC709203F_REG_PW_MODE, sleepMode?0x02:0x01, 0x00); +} + +uint8_t McuLC_Init(void) { + /* initializes LC709203F for Renata ICP543759PMT battery */ + uint8_t res; + + /* operational mode (1: operational, 2: sleep), 0x0001 = operational mode */ + res = WriteCmdWordChecked(LC709203F_I2C_SLAVE_ADDR, lC709203F_REG_PW_MODE, 0x01, 0x00); + if (res!=ERR_OK) { return ERR_FAILED; } + + /* APA, set parasitic impedance (table 7 in data sheet): 0x000C, value for 280mA */ + res = WriteCmdWordChecked(LC709203F_I2C_SLAVE_ADDR, LC709203F_REG_ADJ_APPLI, 0x0C, 0x00); + if (res!=ERR_OK) { return ERR_FAILED; } + + /* Battery Profile (table 8 in data sheet): 0x0001 = Type 1 */ + res = WriteCmdWordChecked(LC709203F_I2C_SLAVE_ADDR, LC709203F_REG_CHG_PARAM, 0x01, 0x00); + if (res!=ERR_OK) { return ERR_FAILED; } + + /* write 0xAA55 to initialize RSOC */ + res = WriteCmdWordChecked(LC709203F_I2C_SLAVE_ADDR, LC709203F_REG_INIT_RSOC, 0x55, 0xAA); + if (res!=ERR_OK) { return ERR_FAILED; } + + /* Set battery measurement mode: 0x0001: thermistor mode. 0x0000: I2C mode */ +#if MCULC709203F_CONFIG_USE_THERMISTOR + res = WriteCmdWordChecked(LC709203F_I2C_SLAVE_ADDR, LC709203F_REG_EN_NTC, 0x01, 0x00); + if (res!=ERR_OK) { return ERR_FAILED; } +#else + res = WriteCmdWordChecked(LC709203F_I2C_SLAVE_ADDR, LC709203F_REG_EN_NTC, 0x00, 0x00); + if (res!=ERR_OK) { return ERR_FAILED; } +#endif + /* set the B-constant of the thermistor to be measured */ +#if MCULC709203F_CONFIG_USE_THERMISTOR + res = WriteCmdWordChecked(LC709203F_I2C_SLAVE_ADDR, LC709203F_REG_SET_THERMB, 0x6B, 0x0D); /* Thermistor B-Constant: 0x0D6B = B=3435 */ + if (res!=ERR_OK) { return ERR_FAILED; } +#endif + + /* Low voltage alarm setting: 0x0C1C = 3100mV = 3.1V, low byte first */ + res = WriteCmdWordChecked(LC709203F_I2C_SLAVE_ADDR, LC709203F_REG_LOW_CELL_VOL_ALM, 0x1C, 0x0C); + if (res!=ERR_OK) { return ERR_FAILED; } + + /* 0x0000 = alarm disable, low byte first */ + res = WriteCmdWordChecked(LC709203F_I2C_SLAVE_ADDR, LC709203F_REG_RSOC_ALM, 0x00, 0x00); + if (res!=ERR_OK) { return ERR_FAILED; } + + return ERR_OK; +} + +void McuLC_Deinit(void) { + /* nothing to do */ +} + diff --git a/TSM_PicoW_Sensor/McuLib/src/McuLC709203F.h b/TSM_PicoW_Sensor/McuLib/src/McuLC709203F.h new file mode 100644 index 0000000..0140191 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuLC709203F.h @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2019, Erich Styger + * All rights reserved. + * + * Interface for for the LC709203 battery gauge I2C sensor + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef SOURCES_MCULC709203F_H_ +#define SOURCES_MCULC709203F_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#if MCULC709203F_CONFIG_PARSE_COMMAND_ENABLED + #include "McuShell.h" +#endif + +/*! + * \brief Returns the current battery voltage + * \param pVoltage Pointer where to store the value (in mV) + * \return Error code, ERR_OK for no error + */ +uint8_t McuLC_GetVoltage(uint16_t *pVoltage); + +typedef enum { + McuLC_CURRENT_DIR_AUTO, /*!< automatic mode (default) */ + McuLC_CURRENT_DIR_CHARGING, /*!< charging mode */ + McuLC_CURRENT_DIR_DISCHARING, /*!< discharging mode */ + McuLC_CURRENT_DIR_ERROR /*!< error case */ +} McuLC_CurrentDirection; +/*!< Current direction used for McuLC_GetCurrentDirection() and McuLC_SetCurrentDirection() */ + +uint8_t McuLC_GetVoltage(uint16_t *pVoltage); +uint8_t McuLC_GetTemperature(int16_t *pTemperature); +uint8_t McuLC_GetRSOC(uint16_t *pRsoc); +uint8_t McuLC_GetITE(uint16_t *pIte); +uint8_t McuLC_GetICversion(uint16_t *pVersion); + +uint8_t McuLC_SetTemperatureMeasurementMode(bool i2cMode); + +/*! + * \brief Get the current temperature measurement mode + * \param pDir Pointer where to store the mode + * \return Error code, ERR_OK if everything is ok + */ +uint8_t McuLC_GetTemperatureMeasurementMode(bool *isI2Cmode); + + +/*! + * \brief Get the current direction mode + * \param pDir Pointer where to store the mode + * \return Error code, ERR_OK if everything is ok + */ +uint8_t McuLC_GetCurrentDirection(McuLC_CurrentDirection *pDir); + +/*! + * \brief Set the current direction mode + * \param dir Mode to set + * \return Error code, ERR_OK if everything is ok + */ +uint8_t McuLC_SetCurrentDirection(McuLC_CurrentDirection dir); + +/*! + * \brief Sets the device power mode (normal or sleep mode) + * \param sleepMode true to put device into sleep mode, false for normal operational mode + * \return Error code, ERR_OK if everything is ok + */ +uint8_t McuLC_SetPowerMode(bool sleepMode); + +/*! + * \brief Wake up the device from sleep mode. Uses bit-banging. If other devices are on the bus, this method has to be called before anything else! + */ +void McuLC_Wakeup(void); /* must be done before any other I2C communication on the bus! */ + +#if MCULC709203F_CONFIG_PARSE_COMMAND_ENABLED +/*! + * \brief Module command line parser + * \param cmd Pointer to string to be parsed + * \param handled set to true if command was recognized + * \param io standard I/O handler + * \return Error code, ERR_OK if everything is ok + */ +uint8_t McuLC_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); +#endif + +/*! + * \brief Driver initialization. I2C bus must be operational for this. + * \return Error code, ERR_OK if everything is ok + */ +uint8_t McuLC_Init(void); + +/*! + * \brief Driver de-initialisation + */ +void McuLC_Deinit(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* SOURCES_MCULC709203F_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuLED.c b/TSM_PicoW_Sensor/McuLib/src/McuLED.c new file mode 100644 index 0000000..353faab --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuLED.c @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2019-2021, Erich Styger + * All rights reserved. + * + * Driver for LEDs + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuLibconfig.h" +#include "McuLEDconfig.h" +#include "McuLED.h" +#include "McuGPIO.h" +#if McuLib_CONFIG_NXP_SDK_USED + #include "fsl_gpio.h" +#elif McuLib_CONFIG_CPU_IS_STM32 + #include "stm32f3xx_hal.h" +#endif +#if McuLib_CONFIG_CPU_IS_KINETIS + #include "fsl_port.h" +#elif McuLib_CONFIG_CPU_IS_ESP32 + #include "driver/gpio.h" +#endif +#include +#include /* for memset */ +#include /* for malloc() and free() */ +#include +#if MCULED_CONFIG_USE_FREERTOS_HEAP + #include "McuRTOS.h" +#endif + +/* default configuration, used for initializing the config */ +static const McuLED_Config_t defaultConfig = +{ + .isLowActive = false, + .isOnInit = false, + .hw = { + #if McuLib_CONFIG_NXP_SDK_USED && !McuLib_CONFIG_IS_KINETIS_KE + .gpio = NULL, + #elif McuLib_CONFIG_CPU_IS_STM32 + .gpio = NULL, + #endif + #if McuLib_CONFIG_CPU_IS_KINETIS + .port = NULL, + #elif McuLib_CONFIG_CPU_IS_LPC + .port = 0, + #endif + #if McuLib_CONFIG_CPU_IS_ESP32 + .pin = GPIO_NUM_NC, + #else + .pin = 0, + #endif + } +}; + +typedef struct { + McuGPIO_Handle_t gpio; + bool isLowActive; +} McuLED_t; + +void McuLED_GetDefaultConfig(McuLED_Config_t *config) { + assert(config!=NULL); + memcpy(config, &defaultConfig, sizeof(*config)); +} + +McuLED_Handle_t McuLED_InitLed(McuLED_Config_t *config) { + McuGPIO_Config_t gpio_config; /* config for the SDK */ + McuGPIO_Handle_t gpio; + McuLED_t *handle; + + assert(config!=NULL); + McuGPIO_GetDefaultConfig(&gpio_config); + gpio_config.isInput = false; /* LED is output only */ + memcpy(&gpio_config.hw, &config->hw, sizeof(gpio_config.hw)); /* copy hardware information */ + if (config->isLowActive) { + gpio_config.isHighOnInit = !config->isOnInit; + } else { + gpio_config.isHighOnInit = config->isOnInit; + } + gpio = McuGPIO_InitGPIO(&gpio_config); /* create gpio handle */ +#if MCULED_CONFIG_USE_FREERTOS_HEAP + handle = (McuLED_t*)pvPortMalloc(sizeof(McuLED_t)); /* get a new device descriptor */ +#else + handle = (McuLED_t*)malloc(sizeof(McuLED_t)); /* get a new device descriptor */ +#endif + assert(handle!=NULL); + if (handle!=NULL) { /* if malloc failed, will return NULL pointer */ + memset(handle, 0, sizeof(McuLED_t)); /* init all fields */ + handle->gpio = gpio; + handle->isLowActive = config->isLowActive; + } + return (McuLED_Handle_t)handle; +} + +McuLED_Handle_t McuLED_DeinitLed(McuLED_Handle_t led) { + assert(led!=NULL); + McuGPIO_DeinitGPIO(((McuLED_t*)led)->gpio); +#if MCULED_CONFIG_USE_FREERTOS_HEAP + vPortFree(led); +#else + free(led); +#endif + return NULL; +} + +void McuLED_On(McuLED_Handle_t led) { + assert(led!=NULL); + McuLED_t *desc = (McuLED_t*)led; + + if (desc->isLowActive) { + McuGPIO_SetLow(desc->gpio); + } else { + McuGPIO_SetHigh(desc->gpio); + } +} + +void McuLED_Off(McuLED_Handle_t led) { + assert(led!=NULL); + McuLED_t *desc = (McuLED_t*)led; + + if (desc->isLowActive) { + McuGPIO_SetHigh(desc->gpio); + } else { + McuGPIO_SetLow(desc->gpio); + } +} + +void McuLED_Toggle(McuLED_Handle_t led) { + assert(led!=NULL); + McuLED_t *desc = (McuLED_t*)led; + + McuGPIO_Toggle(desc->gpio); +} + +bool McuLED_Get(McuLED_Handle_t led) { + assert(led!=NULL); + McuLED_t *desc = (McuLED_t*)led; + + if (desc->isLowActive) { + return !McuGPIO_IsHigh(desc->gpio); + } else { + return McuGPIO_IsHigh(desc->gpio); + } +} + +void McuLED_Set(McuLED_Handle_t led, bool isOn) { + if (isOn) { + McuLED_On(led); + } else { + McuLED_Off(led); + } +} + +void McuLED_Init(void) { + /* nothing to do */ +} + +void McuLED_Deinit(void) { + /* nothing to do */ +} diff --git a/TSM_PicoW_Sensor/McuLib/src/McuLED.h b/TSM_PicoW_Sensor/McuLib/src/McuLED.h new file mode 100644 index 0000000..6cd214d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuLED.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2019-2021, Erich Styger + * All rights reserved. + * + * Driver for LEDs + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef McuLED_H_ +#define McuLED_H_ + +#include +#include "McuLibconfig.h" +#include "McuLEDconfig.h" +#include "McuGPIO.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct McuLED_Dummy_s { int dummy; } McuLED_Dummy_s; /*!< using a pointer to a struct instead a pointer to void for handle, used for handle type 'safety' only */ + +typedef McuLED_Dummy_s *McuLED_Handle_t; /*!< LED handle type */ + +typedef struct { + bool isLowActive; + bool isOnInit; + McuGPIO_HwPin_t hw; +} McuLED_Config_t; + +void McuLED_GetDefaultConfig(McuLED_Config_t *config); + +McuLED_Handle_t McuLED_InitLed(McuLED_Config_t *config); + +McuLED_Handle_t McuLED_DeinitLed(McuLED_Handle_t led); + +void McuLED_On(McuLED_Handle_t led); +void McuLED_Off(McuLED_Handle_t led); +void McuLED_Toggle(McuLED_Handle_t led); +bool McuLED_Get(McuLED_Handle_t led); +void McuLED_Set(McuLED_Handle_t led, bool isOn); + +/* driver initialization */ +void McuLED_Init(void); + +/* driver deinitialization */ +void McuLED_Deinit(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* McuLED_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuLib.c b/TSM_PicoW_Sensor/McuLib/src/McuLib.c new file mode 100644 index 0000000..87f6913 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuLib.c @@ -0,0 +1,95 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuLib.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : McuLibConfig +** Version : Component 01.019, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:44, # CodeGen: 835 +** Abstract : +** Configures the drivers for various SDKs and APIs used. +** Settings : +** Component name : McuLib +** SDK : Processor Expert +** Contents : +** Init - void McuLib_Init(void); +** Deinit - void McuLib_Deinit(void); +** +** * Copyright (c) 2016-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuLib.h +** @version 01.00 +** @brief +** Configures the drivers for various SDKs and APIs used. +*/ +/*! +** @addtogroup McuLib_module McuLib module documentation +** @{ +*/ + +/* MODULE McuLib. */ + +#include "McuLib.h" + +/* +** =================================================================== +** Method : Init (component McuLibConfig) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuLib_Init(void) +{ + /* nothing to implement */ +} + +/* +** =================================================================== +** Method : Deinit (component McuLibConfig) +** +** Description : +** Driver deinitialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuLib_Deinit(void) +{ + /* nothing to implement */ +} + +/* END McuLib. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuLib.h b/TSM_PicoW_Sensor/McuLib/src/McuLib.h new file mode 100644 index 0000000..a421b52 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuLib.h @@ -0,0 +1,195 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuLib.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : McuLibConfig +** Version : Component 01.019, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:44, # CodeGen: 835 +** Abstract : +** Configures the drivers for various SDKs and APIs used. +** Settings : +** Component name : McuLib +** SDK : Processor Expert +** Contents : +** Init - void McuLib_Init(void); +** Deinit - void McuLib_Deinit(void); +** +** * Copyright (c) 2016-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuLib.h +** @version 01.00 +** @brief +** Configures the drivers for various SDKs and APIs used. +*/ +/*! +** @addtogroup McuLib_module McuLib module documentation +** @{ +*/ + +#ifndef __McuLib_H +#define __McuLib_H + +/* MODULE McuLib. */ +#include "McuLibconfig.h" /* include configuration header file */ + +#ifdef __cplusplus +extern "C" { +#endif + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT + #ifndef __IASMARM__ /* not including standard header files if using IAR assembler */ + /* Include shared modules, which are used for whole project */ + #include "PE_Types.h" + #include "PE_Error.h" + #include "PE_Const.h" + #include "IO_Map.h" + #include "Cpu.h" /* include CPU related interfaces and defines */ + #endif +#else /* use non-Processor Expert SDK: generic or silicon vendor SDK */ + /* defines of common types used by Processor Expert, which might not be provided by the SDK */ + #if !(defined(__ICCARM__) || defined(__HIWARE__)) /* Hiware compiler (S08, S12) only supports C89 */ + #include /* uint8_t, int16_t, ... */ + #include /* bool, true, false, ... */ + #endif + + /* boolean values */ + #ifndef FALSE + #define FALSE 0x00u + #endif + #ifndef TRUE + #define TRUE 0x01u + #endif + + /* error codes */ + #define ERR_OK 0x00U /*!< OK */ + #define ERR_SPEED 0x01U /*!< This device does not work in the active speed mode. */ + #define ERR_RANGE 0x02U /*!< Parameter out of range. */ + #define ERR_VALUE 0x03U /*!< Parameter of incorrect value. */ + #define ERR_OVERFLOW 0x04U /*!< Timer overflow. */ + #define ERR_MATH 0x05U /*!< Overflow during evaluation. */ + #define ERR_ENABLED 0x06U /*!< Device is enabled. */ + #define ERR_DISABLED 0x07U /*!< Device is disabled. */ + #define ERR_BUSY 0x08U /*!< Device is busy. */ + #define ERR_NOTAVAIL 0x09U /*!< Requested value or method not available. */ + #define ERR_RXEMPTY 0x0AU /*!< No data in receiver. */ + #define ERR_TXFULL 0x0BU /*!< Transmitter is full. */ + #define ERR_BUSOFF 0x0CU /*!< Bus not available. */ + #define ERR_OVERRUN 0x0DU /*!< Overrun error is detected. */ + #define ERR_FRAMING 0x0EU /*!< Framing error is detected. */ + #define ERR_PARITY 0x0FU /*!< Parity error is detected. */ + #define ERR_NOISE 0x10U /*!< Noise error is detected. */ + #define ERR_IDLE 0x11U /*!< Idle error is detected. */ + #define ERR_FAULT 0x12U /*!< Fault error is detected. */ + #define ERR_BREAK 0x13U /*!< Break char is received during communication. */ + #define ERR_CRC 0x14U /*!< CRC error is detected. */ + #define ERR_ARBITR 0x15U /*!< A node losts arbitration. This error occurs if two nodes start transmission at the same time. */ + #define ERR_PROTECT 0x16U /*!< Protection error is detected. */ + #define ERR_UNDERFLOW 0x17U /*!< Underflow error is detected. */ + #define ERR_UNDERRUN 0x18U /*!< Underrun error is detected. */ + #define ERR_COMMON 0x19U /*!< Common error of a device. */ + #define ERR_LINSYNC 0x1AU /*!< LIN synchronization error is detected. */ + #define ERR_FAILED 0x1BU /*!< Requested functionality or process failed. */ + #define ERR_QFULL 0x1CU /*!< Queue is full. */ + #define ERR_PARAM_MASK 0x80U /*!< Invalid mask. */ + #define ERR_PARAM_MODE 0x81U /*!< Invalid mode. */ + #define ERR_PARAM_INDEX 0x82U /*!< Invalid index. */ + #define ERR_PARAM_DATA 0x83U /*!< Invalid data. */ + #define ERR_PARAM_SIZE 0x84U /*!< Invalid size. */ + #define ERR_PARAM_VALUE 0x85U /*!< Invalid value. */ + #define ERR_PARAM_RANGE 0x86U /*!< Invalid parameter's range or parameters' combination. */ + #define ERR_PARAM_LOW_VALUE 0x87U /*!< Invalid value (LOW part). */ + #define ERR_PARAM_HIGH_VALUE 0x88U /*!< Invalid value (HIGH part). */ + #define ERR_PARAM_ADDRESS 0x89U /*!< Invalid address. */ + #define ERR_PARAM_PARITY 0x8AU /*!< Invalid parity. */ + #define ERR_PARAM_WIDTH 0x8BU /*!< Invalid width. */ + #define ERR_PARAM_LENGTH 0x8CU /*!< Invalid length. */ + #define ERR_PARAM_ADDRESS_TYPE 0x8DU /*!< Invalid address type. */ + #define ERR_PARAM_COMMAND_TYPE 0x8EU /*!< Invalid command type. */ + #define ERR_PARAM_COMMAND 0x8FU /*!< Invalid command. */ + #define ERR_PARAM_RECIPIENT 0x90U /*!< Invalid recipient. */ + #define ERR_PARAM_BUFFER_COUNT 0x91U /*!< Invalid buffer count. */ + #define ERR_PARAM_ID 0x92U /*!< Invalid ID. */ + #define ERR_PARAM_GROUP 0x93U /*!< Invalid group. */ + #define ERR_PARAM_CHIP_SELECT 0x94U /*!< Invalid chip select. */ + #define ERR_PARAM_ATTRIBUTE_SET 0x95U /*!< Invalid set of attributes. */ + #define ERR_PARAM_SAMPLE_COUNT 0x96U /*!< Invalid sample count. */ + #define ERR_PARAM_CONDITION 0x97U /*!< Invalid condition. */ + #define ERR_PARAM_TICKS 0x98U /*!< Invalid ticks parameter. */ + + /* Other basic data types */ + typedef signed char int8; + typedef signed short int int16; + typedef signed long int int32; + + typedef unsigned char uint8; + typedef unsigned short int uint16; + typedef unsigned long int uint32; +#endif + + + + + +void McuLib_Init(void); +/* +** =================================================================== +** Method : Init (component McuLibConfig) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuLib_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component McuLibConfig) +** +** Description : +** Driver deinitialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuLib. */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif +/* ifndef __McuLib_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuLog.c b/TSM_PicoW_Sensor/McuLib/src/McuLog.c new file mode 100644 index 0000000..6d4ac67 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuLog.c @@ -0,0 +1,583 @@ +/* + * Copyright (c) 2017 rxi + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/* Original source is from https://github.com/rxi/log.c + * McuLib integration and extensions: Copyright (c) 2020 Erich Styger + */ + +#include "McuLog.h" +#if McuLog_CONFIG_IS_ENABLED + +#include +#include +#include +#include +#include +#include + +#include "McuTimeDate.h" +#include "McuUtility.h" +#include "McuXFormat.h" +#include "McuShell.h" +#if McuLog_CONFIG_USE_MUTEX + #include "McuRTOS.h" +#endif +#if McuLog_CONFIG_USE_FILE + #include "McuFatFS.h" +#endif +#if McuLog_CONFIG_USE_RTT_DATA_LOGGER || McuLog_CONFIG_USE_RTT_CONSOLE + #include "McuRTT.h" +#endif + +static struct { + McuLog_Levels_e level; /* 0 (TRACE) to 5 (FATAL) */ +#if McuLog_CONFIG_USE_MUTEX + SemaphoreHandle_t McuLog_Mutex; /* built-in FreeRTOS mutex used for lock below */ +#endif +#if McuLog_CONFIG_USE_MUTEX + log_LockFn lock; /* user mutex for synchronization */ + void *udata; /* optional data for lock */ +#endif + McuShell_ConstStdIOType *consoleIo[McuLog_CONFIG_NOF_CONSOLE_LOGGER]; /* I/O for console logging */ + bool quiet; /* if console logging is silent/quiet */ +#if McuLog_CONFIG_USE_COLOR + bool color; /* if using color for terminal */ +#endif +#if McuLog_CONFIG_USE_FILE + McuFatFS_FIL *fp; /* file handle */ + McuFatFS_FIL logFile; /* FatFS log file descriptor */ +#endif +#if McuLog_CONFIG_USE_RTT_DATA_LOGGER + bool rttDataLogger; +#endif +} McuLog_ConfigData; + +static const char *const level_names[] = { + "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL" +}; + +#if McuLog_CONFIG_USE_COLOR +static const char *const level_colors[] = { /* color codes for messages */ + McuShell_ANSI_COLOR_TEXT_BRIGHT_BLUE, /* trace */ + McuShell_ANSI_COLOR_TEXT_BRIGHT_GREEN, /* debug */ + McuShell_ANSI_COLOR_TEXT_BRIGHT_CYAN, /* info */ + McuShell_ANSI_COLOR_TEXT_BRIGHT_YELLOW, /* warn */ + McuShell_ANSI_COLOR_TEXT_BRIGHT_RED, /* error */ + McuShell_ANSI_COLOR_TEXT_BRIGHT_MAGENTA /* fatal */ +}; +#endif + +#if McuLog_CONFIG_USE_MUTEX +static void lock(void) { + if (McuLog_ConfigData.lock!=NULL) { + McuLog_ConfigData.lock(McuLog_ConfigData.udata, true); + } +} +#endif + +#if McuLog_CONFIG_USE_MUTEX +static void unlock(void) { + if (McuLog_ConfigData.lock!=NULL) { + McuLog_ConfigData.lock(McuLog_ConfigData.udata, false); + } +} +#endif + +void McuLog_set_console(McuShell_ConstStdIOType *io, uint8_t index) { + assert(index1 && !(file[pos-1]=='/' || file[pos-1]=='\\')) { /* scan back to find the last separator */ + pos--; + } + if (pos==1 && !(file[pos-1]=='/' || file[pos-1]=='\\')) { /* no separator at all? */ + pos = 0; /* no separator, start from the beginning */ + } + p = (const unsigned char*)&file[pos]; + } + OutString(p, outchar, param); +#else + OutString((unsigned char*)file, outchar, param); +#endif + + /* line number */ + buf[0] = '\0'; + McuUtility_chcat(buf, sizeof(buf), ':'); + McuUtility_strcatNum32u(buf, sizeof(buf), line); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)": "); + OutString(buf, outchar, param); +} + +#if McuLog_CONFIG_USE_PRINTF_STYLE +void McuLog_ChannelLog(uint8_t channel, McuLog_Levels_e level, const char *file, int line, const char *fmt, ...) { +#if McuLog_CONFIG_LOG_TIMESTAMP_DATE + DATEREC date; + #define DATE_PTR &date +#else + #define DATE_PTR NULL +#endif +#if McuLog_CONFIG_LOG_TIMESTAMP_TIME + TIMEREC time; + #define TIME_PTR &time +#else + #define TIME_PTR NULL +#endif + va_list list; + + if (level < McuLog_ConfigData.level) { + return; + } + if (channel>=McuLog_CONFIG_NOF_CONSOLE_LOGGER) { + return; /* wrong channel number? */ + } +#if McuLog_CONFIG_USE_MUTEX + lock(); /* Acquire lock */ +#endif +#if McuLog_CONFIG_LOG_TIMESTAMP_DATE || McuLog_CONFIG_LOG_TIMESTAMP_TIME + (void)McuTimeDate_GetTimeDate(TIME_PTR, DATE_PTR); /* Get current date and time */ +#endif + if (!McuLog_ConfigData.quiet) { + if(McuLog_ConfigData.consoleIo[channel]!=NULL) { /* log to console */ + LogHeader(DATE_PTR, TIME_PTR, level, true, file, line, OutputCharFctConsole, McuLog_ConfigData.consoleIo[channel]->stdErr); + /* open argument list */ + va_start(list, fmt); + McuXFormat_xvformat(OutputCharFctConsole, McuLog_ConfigData.consoleIo[channel]->stdErr, fmt, list); + va_end(list); + OutString((unsigned char *)"\n", OutputCharFctConsole, McuLog_ConfigData.consoleIo[channel]->stdErr); + } + } +#if McuLog_CONFIG_USE_MUTEX + unlock(); /* Release lock */ +#endif +} +#endif + +#if McuLog_CONFIG_USE_PRINTF_STYLE +void McuLog_log(McuLog_Levels_e level, const char *file, int line, const char *fmt, ...) { +#if McuLog_CONFIG_LOG_TIMESTAMP_DATE + DATEREC date; + #define DATE_PTR &date +#else + #define DATE_PTR NULL +#endif +#if McuLog_CONFIG_LOG_TIMESTAMP_TIME + TIMEREC time; + #define TIME_PTR &time +#else + #define TIME_PTR NULL +#endif + va_list list; + + if (level < McuLog_ConfigData.level) { + return; + } +#if McuLog_CONFIG_USE_MUTEX + lock(); /* Acquire lock */ +#endif +#if McuLog_CONFIG_LOG_TIMESTAMP_DATE || McuLog_CONFIG_LOG_TIMESTAMP_TIME + (void)McuTimeDate_GetTimeDate(TIME_PTR, DATE_PTR); /* Get current date and time */ +#endif + if (!McuLog_ConfigData.quiet) { + for(int i=0; istdErr); + /* open argument list */ + va_start(list, fmt); + McuXFormat_xvformat(OutputCharFctConsole, McuLog_ConfigData.consoleIo[i]->stdErr, fmt, list); + va_end(list); + OutString((unsigned char *)"\n", OutputCharFctConsole, McuLog_ConfigData.consoleIo[i]->stdErr); + } + } /* for */ + } + +#if McuLog_CONFIG_USE_RTT_DATA_LOGGER + /* log to RTT Data Logger */ + if (McuLog_ConfigData.rttDataLogger) { + LogHeader(DATE_PTR, TIME_PTR, level, false, file, line, OutputCharRttLoggerFct, NULL); + /* open argument list */ + va_start(list, fmt); + McuXFormat_xvformat(OutputCharRttLoggerFct, NULL, fmt, list); + va_end(list); + OutString((unsigned char *)"\n", OutputCharRttLoggerFct, NULL); + } +#endif + +#if McuLog_CONFIG_USE_FILE + /* Log to file */ + if (McuLog_ConfigData.fp) { + LogHeader(DATE_PTR, &time, level, false, file, line, OutputCharFctFile, McuLog_ConfigData.fp); + /* open argument list */ + va_start(list, fmt); + McuXFormat_xvformat(OutputCharFctFile, McuLog_ConfigData.fp, fmt, list); + va_end(list); + OutString((unsigned char *)"\n", OutputCharFctFile, McuLog_ConfigData.fp); + f_sync(McuLog_ConfigData.fp); + } +#endif +#if McuLog_CONFIG_USE_MUTEX + unlock(); /* Release lock */ +#endif +} +#endif + +void McuLog_logString(McuLog_Levels_e level, const char *file, int line, const char *str) { +#if McuLog_CONFIG_LOG_TIMESTAMP_DATE + DATEREC date; + #define DATE_PTR &date +#else + #define DATE_PTR NULL +#endif +#if McuLog_CONFIG_LOG_TIMESTAMP_TIME + TIMEREC time; + #define TIME_PTR &time +#else + #define TIME_PTR NULL +#endif + + if (level < McuLog_ConfigData.level) { + return; + } +#if McuLog_CONFIG_USE_MUTEX + lock(); /* Acquire lock */ +#endif +#if McuLog_CONFIG_LOG_TIMESTAMP_DATE || McuLog_CONFIG_LOG_TIMESTAMP_TIME + (void)McuTimeDate_GetTimeDate(TIME_PTR, DATE_PTR); /* Get current date and time */ +#endif + if (!McuLog_ConfigData.quiet) { + for(int i=0; istdErr); + OutString((unsigned char *)str, OutputCharFctConsole, McuLog_ConfigData.consoleIo[i]->stdErr); + OutString((unsigned char *)"\n", OutputCharFctConsole, McuLog_ConfigData.consoleIo[i]->stdErr); + } + } /* for */ + } + +#if McuLog_CONFIG_USE_RTT_DATA_LOGGER + /* log to RTT Data Logger */ + if (McuLog_ConfigData.rttDataLogger) { + LogHeader(DATE_PTR, TIME_PTR, level, false, file, line, OutputCharRttLoggerFct, NULL); + OutString((unsigned char *)str, OutputCharRttLoggerFct, NULL); + OutString((unsigned char *)"\n", OutputCharRttLoggerFct, NULL); + } +#endif + +#if McuLog_CONFIG_USE_FILE + /* Log to file */ + if (McuLog_ConfigData.fp) { + LogHeader(DATE_PTR, &time, level, false, file, line, OutputCharFctFile, McuLog_ConfigData.fp); + OutString((unsigned char *)str, OutputCharFctFile, McuLog_ConfigData.fp); + OutString((unsigned char *)"\n", OutputCharFctFile, McuLog_ConfigData.fp); + f_sync(McuLog_ConfigData.fp); + } +#endif +#if McuLog_CONFIG_USE_MUTEX + unlock(); /* Release lock */ +#endif +} + +#if McuLog_CONFIG_USE_MUTEX +static void LockUnlockCallback(void *data, bool lock) { + (void)data; /* unused */ + if (lock) { + (void)xSemaphoreTakeRecursive(McuLog_ConfigData.McuLog_Mutex, portMAX_DELAY); + } else { + (void)xSemaphoreGiveRecursive(McuLog_ConfigData.McuLog_Mutex); + } +} +#endif + +#if McuLog_CONFIG_PARSE_COMMAND_ENABLED +static uint8_t PrintStatus(const McuShell_StdIOType *io) { + uint8_t buf[16]; + + McuShell_SendStatusStr((unsigned char*)"McuLog", (unsigned char*)"Log status\r\n", io->stdOut); + McuUtility_Num8uToStr(buf, sizeof(buf), McuLog_CONFIG_NOF_CONSOLE_LOGGER); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" channel\r\n"); + McuShell_SendStatusStr((unsigned char*)" console", buf, io->stdOut); +#if McuLog_CONFIG_USE_FILE + McuShell_SendStatusStr((unsigned char*)" file", McuLog_ConfigData.fp!=NULL?(unsigned char*)"yes\r\n":(unsigned char*)"no\r\n", io->stdOut); +#endif +#if McuLog_CONFIG_USE_RTT_DATA_LOGGER + McuShell_SendStatusStr((unsigned char*)" rttlogger", McuLog_ConfigData.rttDataLogger?(unsigned char*)"on\r\n":(unsigned char*)"off\r\n", io->stdOut); +#endif +#if McuLog_CONFIG_USE_MUTEX + McuShell_SendStatusStr((unsigned char*)" lock", McuLog_ConfigData.lock!=NULL?(unsigned char*)"yes\r\n":(unsigned char*)"no\r\n", io->stdOut); +#endif + McuShell_SendStatusStr((unsigned char*)" level", (unsigned char*)level_names[McuLog_ConfigData.level], io->stdOut); + McuShell_SendStr((unsigned char*)" (", io->stdOut); + McuShell_SendNum8u(McuLog_ConfigData.level, io->stdOut); + McuShell_SendStr((unsigned char*)"), logging for this level and higher\r\n", io->stdOut); +#if McuLog_CONFIG_USE_COLOR + McuShell_SendStatusStr((unsigned char*)" color", McuLog_ConfigData.color?(unsigned char*)"on\r\n":(unsigned char*)"off\r\n", io->stdOut); +#endif + return ERR_OK; +} +#endif /* McuLog_CONFIG_PARSE_COMMAND_ENABLED */ + +#if McuLog_CONFIG_PARSE_COMMAND_ENABLED +static uint8_t PrintHelp(const McuShell_StdIOType *io) { + McuShell_SendHelpStr((unsigned char*)"McuLog", (unsigned char*)"Group of McuLog commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" level ", (unsigned char*)"Set log level, 0 (TRACE), 1 (DEBUG), 2 (INFO), 3 (WARN), 4 (ERROR), 5 (FATAL)\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" quiet ", (unsigned char*)"Set quiet mode for console\r\n", io->stdOut); +#if McuLog_CONFIG_USE_COLOR + McuShell_SendHelpStr((unsigned char*)" color ", (unsigned char*)"Set color mode\r\n", io->stdOut); +#endif +#if McuLog_CONFIG_USE_RTT_DATA_LOGGER + McuShell_SendHelpStr((unsigned char*)" rttlogger ", (unsigned char*)"Set rtt data logger mode\r\n", io->stdOut); +#endif + return ERR_OK; +} +#endif /* McuLog_CONFIG_PARSE_COMMAND_ENABLED */ + +#if McuLog_CONFIG_PARSE_COMMAND_ENABLED +uint8_t McuLog_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) { + uint8_t res = ERR_OK; + const unsigned char *p; + + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP) == 0 + || McuUtility_strcmp((char*)cmd, "McuLog help") == 0) + { + *handled = TRUE; + return PrintHelp(io); + } else if ( (McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) + || (McuUtility_strcmp((char*)cmd, "McuLog status")==0) + ) + { + *handled = TRUE; + res = PrintStatus(io); + } else if (McuUtility_strcmp((char*)cmd, "McuLog quiet on")==0) { + *handled = TRUE; + McuLog_set_quiet(true); + } else if (McuUtility_strcmp((char*)cmd, "McuLog quiet off")==0) { + *handled = TRUE; + McuLog_set_quiet(false); +#if McuLog_CONFIG_USE_COLOR + } else if (McuUtility_strcmp((char*)cmd, "McuLog color on")==0) { + *handled = TRUE; + McuLog_set_color(true); + } else if (McuUtility_strcmp((char*)cmd, "McuLog color off")==0) { + *handled = TRUE; + McuLog_set_color(false); +#endif + } else if (McuUtility_strncmp((char*)cmd, "McuLog level ", sizeof("McuLog level ")-1)==0) { + uint8_t level; + + *handled = TRUE; + p = cmd+sizeof("McuLog level ")-1; + if (McuUtility_ScanDecimal8uNumber(&p, &level)==ERR_OK && level<=McuLog_FATAL) { + McuLog_set_level(level); + } + } + return res; +} +#endif /* McuLog_CONFIG_PARSE_COMMAND_ENABLED */ + + +#if McuLog_CONFIG_USE_RTT_DATA_LOGGER +static char McuLog_RttUpBuffer[McuLog_CONFIG_RTT_DATA_LOGGER_BUFFER_SIZE]; +#endif + +void McuLog_Init(void) { +#if McuLog_CONFIG_USE_MUTEX + McuLog_ConfigData.McuLog_Mutex = xSemaphoreCreateRecursiveMutex(); + if (McuLog_ConfigData.McuLog_Mutex==NULL) { /* semaphore creation failed */ + for(;;) {} /* error, not enough memory? */ + } + vQueueAddToRegistry(McuLog_ConfigData.McuLog_Mutex, "McuLog_Mutex"); + McuLog_set_lock(LockUnlockCallback); +#endif +#if McuLog_CONFIG_USE_COLOR + McuLog_set_color(true); +#endif +#if McuLog_CONFIG_USE_RTT_DATA_LOGGER + McuLog_set_rtt_logger(true); +#endif + McuLog_ConfigData.consoleIo[0] = McuShell_GetStdio(); /* default */ + McuLog_set_level(McuLog_CONFIG_DEFAULT_LEVEL); /* default level */ +#if McuLog_CONFIG_USE_RTT_DATA_LOGGER + #if McuLib_CONFIG_SDK_USE_FREERTOS && configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && McuSystemView_CONFIG_RTT_CHANNEL==McuLog_RTT_DATA_LOGGER_CHANNEL + #error "Both RTT Logger and SystemViewer are using the same channel! Change McuSystemView_CONFIG_RTT_CHANNEL to a different value." + #endif + SEGGER_RTT_ConfigUpBuffer(McuLog_RTT_DATA_LOGGER_CHANNEL, "Logger", &McuLog_RttUpBuffer[0], sizeof(McuLog_RttUpBuffer), McuLog_CONFIG_RTT_DATA_LOGGER_CHANNEL_MODE); +#endif + for(int i=0; i +#include +#include +#include "McuShell.h" +#if McuLog_CONFIG_USE_FILE + #include "McuFatFS.h" +#endif + +#define McuLog_VERSION "0.1.2" + +#define McuLog_RTT_DATA_LOGGER_CHANNEL (1) /* channel used for the RTT data logger */ + +typedef enum { McuLog_TRACE, McuLog_DEBUG, McuLog_INFO, McuLog_WARN, McuLog_ERROR, McuLog_FATAL } McuLog_Levels_e; + +/* note: gcc supports __BASE_FILE__ instead of __FILE__ */ +#ifndef __BASE_FILE__ + #define __BASE_FILE__ __FILE__ +#endif +#define McuLog_trace(...) McuLog_log(McuLog_TRACE, __BASE_FILE__, __LINE__, __VA_ARGS__) +#define McuLog_debug(...) McuLog_log(McuLog_DEBUG, __BASE_FILE__, __LINE__, __VA_ARGS__) +#define McuLog_info(...) McuLog_log(McuLog_INFO, __BASE_FILE__, __LINE__, __VA_ARGS__) +#define McuLog_warn(...) McuLog_log(McuLog_WARN, __BASE_FILE__, __LINE__, __VA_ARGS__) +#define McuLog_error(...) McuLog_log(McuLog_ERROR, __BASE_FILE__, __LINE__, __VA_ARGS__) +#define McuLog_fatal(...) McuLog_log(McuLog_FATAL, __BASE_FILE__, __LINE__, __VA_ARGS__) + +#define McuLog_traceString(str) McuLog_logString(McuLog_TRACE, __BASE_FILE__, __LINE__, str) +#define McuLog_debugString(str) McuLog_logString(McuLog_DEBUG, __BASE_FILE__, __LINE__, str) +#define McuLog_infoString(str) McuLog_logString(McuLog_INFO, __BASE_FILE__, __LINE__, str) +#define McuLog_warnString(str) McuLog_logString(McuLog_WARN, __BASE_FILE__, __LINE__, str) +#define McuLog_errorString(str) McuLog_logString(McuLog_ERROR, __BASE_FILE__, __LINE__, str) +#define McuLog_fatalString(str) McuLog_logString(McuLog_FATAL, __BASE_FILE__, __LINE__, str) + +void McuLog_set_console(McuShell_ConstStdIOType *io, uint8_t index); + +#if McuLog_CONFIG_USE_MUTEX + typedef void (*log_LockFn)(void *udata, bool lock); + void McuLog_set_lock(log_LockFn fn); + void McuLog_set_udata(void *udata); +#endif + + #if McuLog_CONFIG_USE_FILE + void McuLog_set_fp(McuFatFS_FIL *fp); + int McuLog_open_logfile(const unsigned char *logFileName); /* returns 0 on success */ + int McuLog_close_logfile(void); /* returns 0 on success */ +#endif +void McuLog_set_level(McuLog_Levels_e level); +void McuLog_set_quiet(bool enable); + +#if McuLog_CONFIG_USE_COLOR +void McuLog_set_color(bool enable); +#endif + +#if McuLog_CONFIG_USE_PRINTF_STYLE + void McuLog_log(McuLog_Levels_e level, const char *file, int line, const char *fmt, ...); + void McuLog_ChannelLog(uint8_t channel, McuLog_Levels_e level, const char *file, int line, const char *fmt, ...); +#endif + +void McuLog_logString(McuLog_Levels_e level, const char *file, int line, const char *str); + +#if McuLog_CONFIG_PARSE_COMMAND_ENABLED +uint8_t McuLog_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); +#endif + +void McuLog_Init(void); +void McuLog_Deinit(void); + +#else /* not enabled: do not add anything to the code */ + /* dummy implementation to 'nothing' */ + #define McuLog_traceString(str) do{}while(0) + #define McuLog_debugString(str) do{}while(0) + #define McuLog_infoString(str) do{}while(0) + #define McuLog_warnString(str) do{}while(0) + #define McuLog_errorString(str) do{}while(0) + #define McuLog_fatalString(str) do{}while(0) + + #define McuLog_trace(...) do{}while(0) + #define McuLog_debug(...) do{}while(0) + #define McuLog_info(...) do{}while(0) + #define McuLog_warn(...) do{}while(0) + #define McuLog_error(...) do{}while(0) + #define McuLog_fatal(...) do{}while(0) + + #define McuLog_set_console(io,ch) do{}while(0) + #define McuLog_set_udata(udata) do{}while(0) + #define McuLog_set_lock(fn) do{}while(0) + #define McuLog_set_fp(fp) do{}while(0) + #define McuLog_set_level(level) do{}while(0) + #define McuLog_set_quiet(enable) do{}while(0) + #define McuLog_set_color(enable) do{}while(0) + #define McuLog_log(level, file, line, fmt, ...) do{}while(0) + + #define McuLog_Init() do{}while(0) + #define McuLog_Deinit() do{}while(0) +#endif /* McuLog_CONFIG_IS_ENABLED */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MCULOG_H */ + + diff --git a/TSM_PicoW_Sensor/McuLib/src/McuOneWire.c b/TSM_PicoW_Sensor/McuLib/src/McuOneWire.c new file mode 100644 index 0000000..417b5ad --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuOneWire.c @@ -0,0 +1,810 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuOneWire.h +** CDE edition : Community +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : OneWire +** Version : Component 01.154, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-10-13, 06:28, # CodeGen: 701 +** Abstract : +** This is a component implementing the 1-Wire protocol. +** Settings : +** Component Name : McuOneWire +** Data Pin I/O : SDK_BitIO +** Write Pin : Disabled +** Timing : +** A: Write 1 Low time (us) : 6 +** B: Write 1 High time (us) : 64 +** C: Write 0 Low time (us) : 60 +** D: Write 0 High time (us) : 10 +** E: Read delay time (us) : 3 +** A: Read Low time (us) : 6 +** F: Read delay time : 55 +** H: Reset low time (us) : 480 +** I: Reset response time (us) : 70 +** J: Reset wait time after reading device presence (us) : 410 +** Total slot time (us) : 100 +** Buffers : +** Input : RBInput +** Debug : Enabled +** Debug Read Pin : SDK_BitIO +** CriticalSection : McuCriticalSection +** Utility : McuUtility +** Wait : McuWait +** SDK : McuLib +** RTOS : Enabled +** RTOS : McuRTOS +** Shell : Enabled +** Shell : McuShell +** Contents : +** CalcCRC - uint8_t McuOneWire_CalcCRC(uint8_t *data, uint8_t dataSize); +** SendByte - uint8_t McuOneWire_SendByte(uint8_t data); +** SendBytes - uint8_t McuOneWire_SendBytes(uint8_t *data, uint8_t count); +** Receive - uint8_t McuOneWire_Receive(uint8_t counter); +** SendReset - uint8_t McuOneWire_SendReset(void); +** Count - uint8_t McuOneWire_Count(void); +** GetBytes - uint8_t McuOneWire_GetBytes(uint8_t *data, uint8_t count); +** GetByte - uint8_t McuOneWire_GetByte(uint8_t *data); +** strcatRomCode - uint8_t McuOneWire_strcatRomCode(uint8_t *buf, size_t bufSize, uint8_t... +** ReadRomCode - uint8_t McuOneWire_ReadRomCode(uint8_t *romCodeBuffer); +** ResetSearch - void McuOneWire_ResetSearch(void); +** TargetSearch - void McuOneWire_TargetSearch(uint8_t familyCode); +** Search - bool McuOneWire_Search(uint8_t *newAddr, bool search_mode); +** ParseCommand - uint8_t McuOneWire_ParseCommand(const unsigned char* cmd, bool *handled,... +** Deinit - void McuOneWire%.Init(void) McuOneWire_Deinit(void); +** Init - void McuOneWire%.Init(void) McuOneWire_Init(void); +** +** * Copyright (c) Original implementation: Omar Isaí Pinales Ayala, 2014, all rights reserved. +** * Updated and maintained by Erich Styger, 2014-2020 +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuOneWire.h +** @version 01.00 +** @brief +** This is a component implementing the 1-Wire protocol. +*/ +/*! +** @addtogroup McuOneWire_module McuOneWire module documentation +** @{ +*/ + +/* MODULE McuOneWire. */ + +#include "McuOneWire.h" +#include "DQ1.h" /* data pin */ +#include "InputRB1.h" /* input ring buffer */ +#include "McuUtility.h" /* Utility */ +#include "McuWait.h" /* Waiting */ + +/* global search state and information */ +static unsigned char ROM_NO[8]; +static uint8_t LastDiscrepancy; +static uint8_t LastFamilyDiscrepancy; +static uint8_t LastDeviceFlag; + +/* Rom commands */ +#define RC_READ_ROM 0x33 +#define RC_MATCH_ROM 0x55 +#define RC_SKIP_ROM 0xCC +#define RC_SEARCH_COND 0xEC +#define RC_SEARCH 0xF0 +#define RC_RELEASE 0xFF + +#if McuOneWire_CONFIG_WRITE_PIN /* extra pin only for write bit */ + #define DQ_Init DQ1_Init(); McuOneWire_CONFIG_WRITE_PIN_INIT + #define DQ_Deinit DQ1_Deinit(); McuOneWire_CONFIG_WRITE_PIN_DEINIT +#else + #define DQ_Init DQ1_Init() + #define DQ_Deinit DQ1_Deinit() +#endif +#if McuOneWire_CONFIG_WRITE_PIN /* using dedicated circuit with separate pin to control the 1-wire write */ + #define DQ_SetLow McuOneWire_CONFIG_WRITE_PIN_SET_OUTPUT + #define DQ_Low McuOneWire_CONFIG_WRITE_PIN_HIGH + #define DQ_Floating McuOneWire_CONFIG_WRITE_PIN_LOW +#else + #define DQ_SetLow DQ1_ClrVal() + #define DQ_Low DQ1_SetOutput() + #define DQ_Floating DQ1_SetInput() +#endif +#if McuOneWire_CONFIG_DEBUG_READ_PIN_ENABLED + #define DBG_Init McuOneWire_CONFIG_DEBUG_READ_PIN_INIT + #define DBG_Deinit McuOneWire_CONFIG_DEBUG_READ_PIN_DEINIT + #define DQ_Read (McuOneWire_CONFIG_DEBUG_READ_PIN_TOGGLE, DQ1_GetVal()!=0) +#else + #define DBG_Init /* empty */ + #define DBG_Deinit /* empty */ + #define DQ_Read (DQ1_GetVal()!=0) +#endif + +static uint8_t read_bit(void) { + uint8_t bit; + McuCriticalSection_CriticalVariable(); + + McuCriticalSection_EnterCritical(); + DQ_Low; + McuWait_Waitus(McuOneWire_CONFIG_A_READ_LOW_TIME); + DQ_Floating; + McuWait_Waitus(McuOneWire_CONFIG_E_BEFORE_READ_DELAY_TIME); + bit = DQ_Read; + McuCriticalSection_ExitCritical(); + McuWait_Waitus(McuOneWire_CONFIG_F_AFTER_READ_DELAY_TIME); + return bit; +} + +static void write_bit(uint8_t bit) { + McuCriticalSection_CriticalVariable(); + + if (bit&1) { + McuCriticalSection_EnterCritical(); + DQ_Low; + McuWait_Waitus(McuOneWire_CONFIG_A_WRITE_1_LOW_TIME); + DQ_Floating; + McuWait_Waitus(McuOneWire_CONFIG_B_WRITE_1_HIGH_TIME); + McuCriticalSection_ExitCritical(); + } else { /* zero bit */ + McuCriticalSection_EnterCritical(); + DQ_Low; + McuWait_Waitus(McuOneWire_CONFIG_C_WRITE_0_LOW_TIME); + DQ_Floating; + McuWait_Waitus(McuOneWire_CONFIG_D_WRITE_0_HIGH_TIME); + McuCriticalSection_ExitCritical(); + } +} + +#if McuOneWire_CONFIG_PARSE_COMMAND_ENABLED +static uint8_t PrintStatus(const McuShell_StdIOType *io) { + McuShell_SendStatusStr((unsigned char*)"McuOneWire", (unsigned char*)"\r\n", io->stdOut); +#if McuOneWire_CONFIG_DEBUG_READ_PIN_ENABLED + McuShell_SendStatusStr((unsigned char*)" debug pin", (unsigned char*)"yes\r\n", io->stdOut); +#else + McuShell_SendStatusStr((unsigned char*)" debug pin", (unsigned char*)"no\r\n", io->stdOut); +#endif + return ERR_OK; +} + +static uint8_t PrintHelp(const McuShell_StdIOType *io) { + McuShell_SendHelpStr((unsigned char*)"McuOneWire", (unsigned char*)"Group of McuOneWire commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" reset", (unsigned char*)"Send a RESET sequence to the bus\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" read rom", (unsigned char*)"Send a READ ROM (0x33) to the bus\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" search", (unsigned char*)"Search for devices on the bus\r\n", io->stdOut); + return ERR_OK; +} +#endif /* McuOneWire_CONFIG_PARSE_COMMAND_ENABLED */ + + +/* +** =================================================================== +** Method : SendReset (component OneWire) +** +** Description : +** Sends a reset to the bus +** Parameters : None +** Returns : +** --- - error code +** =================================================================== +*/ +uint8_t McuOneWire_SendReset(void) +{ + uint8_t bit; + McuCriticalSection_CriticalVariable(); + + McuCriticalSection_EnterCritical(); + DQ_Low; + McuWait_Waitus(McuOneWire_CONFIG_H_RESET_TIME); + DQ_Floating; + McuWait_Waitus(McuOneWire_CONFIG_I_RESET_RESPONSE_TIME); + bit = DQ_Read; + McuCriticalSection_ExitCritical(); + McuWait_Waitus(McuOneWire_CONFIG_J_RESET_WAIT_TIME); + if (!bit) { /* a device pulled the data line low: at least one device is present */ + return ERR_OK; + } else { + return ERR_BUSOFF; /* no device on the bus? */ + } +} + +/* +** =================================================================== +** Method : SendByte (component OneWire) +** +** Description : +** Sends a single byte +** Parameters : +** NAME - DESCRIPTION +** data - the data byte to be sent +** Returns : +** --- - error code +** =================================================================== +*/ +uint8_t McuOneWire_SendByte(uint8_t data) +{ + int i; + + for(i=0;i<8;i++) { + write_bit(data&1); /* send LSB first */ + data >>= 1; /* next bit */ + } /* for */ + return ERR_OK; +} + +/* +** =================================================================== +** Method : SendBytes (component OneWire) +** +** Description : +** Sends multiple bytes +** Parameters : +** NAME - DESCRIPTION +** * data - Pointer to the array of bytes +** count - Number of bytes to be sent +** Returns : +** --- - error code +** =================================================================== +*/ +uint8_t McuOneWire_SendBytes(uint8_t *data, uint8_t count) +{ + uint8_t res; + + while(count>0) { + res = McuOneWire_SendByte(*data); + if (res!=ERR_OK) { + return res; /* failed */ + } + data++; + count--; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : Receive (component OneWire) +** +** Description : +** Programs a read operation after the master send all in +** output buffer. Don't use a SendReset while the data is +** coming. +** Parameters : +** NAME - DESCRIPTION +** counter - Number of bytes to receive from +** slave +** Returns : +** --- - error code +** =================================================================== +*/ +uint8_t McuOneWire_Receive(uint8_t counter) +{ + int i; + uint8_t val, mask; + + while(counter>0) { + val = 0; mask = 1; + for(i=0;i<8;i++) { + if (read_bit()) { /* read bits (LSB first) */ + val |= mask; + } + mask <<= 1; /* next bit */ + } /* for */ + (void)InputRB1_Put(val); /* put it into the queue so it can be retrieved by GetBytes() */ + counter--; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : Count (component OneWire) +** +** Description : +** Returns the number of elements stored on input buffer that +** are ready to read. +** Parameters : None +** Returns : +** --- - number of elements +** =================================================================== +*/ +uint8_t McuOneWire_Count(void) +{ + return InputRB1_NofElements(); +} + +/* +** =================================================================== +** Method : GetByte (component OneWire) +** +** Description : +** Get a single byte from the bus +** Parameters : +** NAME - DESCRIPTION +** * data - Pointer to were to store the data +** Returns : +** --- - error code +** =================================================================== +*/ +uint8_t McuOneWire_GetByte(uint8_t *data) +{ + if (InputRB1_NofElements()==0) { + return ERR_FAILED; + } + (void)InputRB1_Get(data); + return ERR_OK; +} + +/* +** =================================================================== +** Method : GetBytes (component OneWire) +** +** Description : +** Gets multiple bytes from the bus +** Parameters : +** NAME - DESCRIPTION +** * data - Pointer to where to store the data +** count - Number of bytes +** Returns : +** --- - error code +** =================================================================== +*/ +uint8_t McuOneWire_GetBytes(uint8_t *data, uint8_t count) +{ + if(count > InputRB1_NofElements()) { + return ERR_FAILED; + } + for(;count>0;count--) { + (void)InputRB1_Get(data); + data++; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : CalcCRC (component OneWire) +** +** Description : +** Calculates the CRC over a number of bytes +** Parameters : +** NAME - DESCRIPTION +** * data - Pointer to data +** dataSize - number of data bytes +** Returns : +** --- - calculated CRC +** =================================================================== +*/ +uint8_t McuOneWire_CalcCRC(uint8_t *data, uint8_t dataSize) +{ + uint8_t crc, i, x, y; + + crc = 0; + for(x=0;x>= 1; + crc ^= 0x8c; + } else { + crc >>= 1; + } + y >>= 1; + } + } + return crc; +} + +/* +** =================================================================== +** Method : Init (component OneWire) +** +** Description : +** Initializes this device. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuOneWire_Init(void) +{ +#if McuLib_CONFIG_NXP_SDK_USED + /* using SDK, need to initialize inherited components */ + DQ_Init; /* data pin */ + DBG_Init; /* optional debug pin */ + InputRB1_Init(); /* input ring buffer */ +#endif + DQ_Floating; /* input mode, let the pull-up take the signal high */ + /* load LOW to output register. We won't change that value afterwards, we only switch between output and input/float mode */ + DQ_SetLow; +} + +/* +** =================================================================== +** Method : Deinit (component OneWire) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuOneWire_Deinit(void) +{ + DQ_Deinit; /* data pin */ + DQ_Floating; /* input mode, tristate pin */ + DBG_Deinit; /* optional debug pin */ + InputRB1_Deinit(); /* input ring buffer */ +} + + +/* +** =================================================================== +** Method : ParseCommand (component OneWire) +** +** Description : +** Shell Command Line parser. Method is only available if Shell +** is enabled in the component properties. +** Parameters : +** NAME - DESCRIPTION +** cmd - command string +** * handled - Pointer to variable which tells if +** the command has been handled or not +** io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuOneWire_ParseCommand(const unsigned char* cmd, bool *handled, const McuShell_StdIOType *io) +{ +#if McuOneWire_CONFIG_PARSE_COMMAND_ENABLED + uint8_t res = ERR_OK; + uint8_t buf[32]; + + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP) == 0 + || McuUtility_strcmp((char*)cmd, "McuOneWire help") == 0) + { + *handled = TRUE; + return PrintHelp(io); + } else if ( (McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) + || (McuUtility_strcmp((char*)cmd, "McuOneWire status")==0) + ) + { + *handled = TRUE; + res = PrintStatus(io); + } else if (McuUtility_strcmp((char*)cmd, "McuOneWire read rom")==0) { + uint8_t rom[McuOneWire_ROM_CODE_SIZE]; + + *handled = TRUE; + res = McuOneWire_ReadRomCode(&rom[0]); + if (res!=ERR_OK) { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ReadRomCode() ERROR ("); + McuUtility_strcatNum8u(buf, sizeof(buf), res); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)")\r\n"); + McuShell_SendStr(buf, io->stdErr); + } else { + buf[0] = '\0'; + (void)McuOneWire_strcatRomCode(buf, sizeof(buf), &rom[0]); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStr(buf, io->stdOut); + } + } else if (McuUtility_strcmp((char*)cmd, "McuOneWire reset")==0) { + *handled = TRUE; + res = McuOneWire_SendReset(); + if (res==ERR_OK) { + McuShell_SendStr((unsigned char*)"Device present\r\n", io->stdOut); + } else { + McuShell_SendStr((unsigned char*)"No device present?\r\n", io->stdErr); + } + } else if (McuUtility_strcmp((char*)cmd, "McuOneWire search")==0) { + uint8_t rom[McuOneWire_ROM_CODE_SIZE]; + bool found; + int nofFound = 0; + + *handled = TRUE; + McuOneWire_ResetSearch(); + do { + found = McuOneWire_Search(&rom[0], TRUE); + if (found) { + nofFound++; + buf[0] = '\0'; + (void)McuOneWire_strcatRomCode(buf, sizeof(buf), &rom[0]); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStr(buf, io->stdOut); + } + } while(found); + if (nofFound==0) { + McuShell_SendStr((unsigned char*)"No device found!\r\n", io->stdErr); + } + return ERR_OK; + } + return res; +#else + (void)cmd; + (void)handled; + (void)io; + return ERR_OK; +#endif +} + +/* +** =================================================================== +** Method : ReadRomCode (component OneWire) +** +** Description : +** Read the ROM code. Only works with one device on the bus. +** Parameters : +** NAME - DESCRIPTION +** * romCodeBuffer - Pointer to a buffer +** with 8 bytes where the ROM code gets stored +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuOneWire_ReadRomCode(uint8_t *romCodeBuffer) +{ + uint8_t res; + + McuOneWire_SendReset(); + McuOneWire_SendByte(RC_READ_ROM); + McuOneWire_Receive(McuOneWire_ROM_CODE_SIZE); /* 8 bytes for the ROM code */ + McuOneWire_SendByte(RC_RELEASE); + /* copy ROM code */ + res = McuOneWire_GetBytes(romCodeBuffer, McuOneWire_ROM_CODE_SIZE); /* 8 bytes */ + if (res!=ERR_OK) { + return res; /* error */ + } + /* index 0 : family code + index 1-6: 48bit serial number + index 7 : CRC + */ + if (McuOneWire_CalcCRC(&romCodeBuffer[0], McuOneWire_ROM_CODE_SIZE-1)!=romCodeBuffer[McuOneWire_ROM_CODE_SIZE-1]) { + return ERR_CRC; /* wrong CRC? */ + } + return ERR_OK; /* ok */ +} + +/* +** =================================================================== +** Method : strcatRomCode (component OneWire) +** +** Description : +** Appends the ROM code to a string. +** Parameters : +** NAME - DESCRIPTION +** * buf - Pointer to zero terminated buffer +** bufSize - size of buffer +** * romCode - Pointer to 8 bytes of ROM Code +** Returns : +** --- - error code +** =================================================================== +*/ +uint8_t McuOneWire_strcatRomCode(uint8_t *buf, size_t bufSize, uint8_t *romCode) +{ + int j; + + for(j=0;j 0); + } else { + /* if equal to last pick 1, if not then pick 0 */ + search_direction = (id_bit_number == LastDiscrepancy); + } + /* if 0 was picked then record its position in LastZero */ + if (search_direction == 0) { + last_zero = id_bit_number; + /* check for Last discrepancy in family */ + if (last_zero < 9) + LastFamilyDiscrepancy = last_zero; + } + } + + /* set or clear the bit in the ROM byte rom_byte_number */ + /* with mask rom_byte_mask */ + if (search_direction == 1) { + ROM_NO[rom_byte_number] |= rom_byte_mask; + } else { + ROM_NO[rom_byte_number] &= ~rom_byte_mask; + } + /* serial number search direction write bit */ + write_bit(search_direction); + + /* increment the byte counter id_bit_number */ + /* and shift the mask rom_byte_mask */ + id_bit_number++; + rom_byte_mask <<= 1; + + /* if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask */ + if (rom_byte_mask == 0) { + rom_byte_number++; + rom_byte_mask = 1; + } + } + } + while(rom_byte_number < 8); /* loop until through all ROM bytes 0-7 */ + /* if the search was successful then */ + if (!(id_bit_number < 65)) { + /* search successful so set LastDiscrepancy,LastDeviceFlag,search_result */ + LastDiscrepancy = last_zero; + + /* check for last device */ + if (LastDiscrepancy == 0) { + LastDeviceFlag = TRUE; + } + search_result = TRUE; + } + } + /* if no device found then reset counters so next 'search' will be like a first */ + if (!search_result || !ROM_NO[0]) { + LastDiscrepancy = 0; + LastDeviceFlag = FALSE; + LastFamilyDiscrepancy = 0; + search_result = FALSE; + } else { + int i; + + for (i = 0; i < 8; i++) { + newAddr[i] = ROM_NO[i]; + } + } + return search_result; +} + +/* END McuOneWire. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuOneWire.h b/TSM_PicoW_Sensor/McuLib/src/McuOneWire.h new file mode 100644 index 0000000..b5859c0 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuOneWire.h @@ -0,0 +1,364 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuOneWire.h +** CDE edition : Community +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : OneWire +** Version : Component 01.154, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-01-29, 06:51, # CodeGen: 595 +** Abstract : +** This is a component implementing the 1-Wire protocol. +** Settings : +** Component Name : McuOneWire +** Data Pin I/O : SDK_BitIO +** Write Pin : Disabled +** Timing : +** A: Write 1 Low time (us) : 6 +** B: Write 1 High time (us) : 64 +** C: Write 0 Low time (us) : 60 +** D: Write 0 High time (us) : 10 +** E: Read delay time (us) : 3 +** A: Read Low time (us) : 6 +** F: Read delay time : 55 +** H: Reset low time (us) : 480 +** I: Reset response time (us) : 70 +** J: Reset wait time after reading device presence (us) : 410 +** Total slot time (us) : 100 +** Buffers : +** Input : RBInput +** Debug : Enabled +** Debug Read Pin : SDK_BitIO +** CriticalSection : McuCriticalSection +** Utility : McuUtility +** Wait : McuWait +** SDK : McuLib +** RTOS : Enabled +** RTOS : McuRTOS +** Shell : Enabled +** Shell : McuShell +** Contents : +** CalcCRC - uint8_t McuOneWire_CalcCRC(uint8_t *data, uint8_t dataSize); +** SendByte - uint8_t McuOneWire_SendByte(uint8_t data); +** SendBytes - uint8_t McuOneWire_SendBytes(uint8_t *data, uint8_t count); +** Receive - uint8_t McuOneWire_Receive(uint8_t counter); +** SendReset - uint8_t McuOneWire_SendReset(void); +** Count - uint8_t McuOneWire_Count(void); +** GetBytes - uint8_t McuOneWire_GetBytes(uint8_t *data, uint8_t count); +** GetByte - uint8_t McuOneWire_GetByte(uint8_t *data); +** strcatRomCode - uint8_t McuOneWire_strcatRomCode(uint8_t *buf, size_t bufSize, uint8_t... +** ReadRomCode - uint8_t McuOneWire_ReadRomCode(uint8_t *romCodeBuffer); +** ResetSearch - void McuOneWire_ResetSearch(void); +** TargetSearch - void McuOneWire_TargetSearch(uint8_t familyCode); +** Search - bool McuOneWire_Search(uint8_t *newAddr, bool search_mode); +** ParseCommand - uint8_t McuOneWire_ParseCommand(const unsigned char* cmd, bool *handled,... +** Deinit - void McuOneWire%.Init(void) McuOneWire_Deinit(void); +** Init - void McuOneWire%.Init(void) McuOneWire_Init(void); +** +** * Copyright (c) Original implementation: Omar Isaí Pinales Ayala, 2014, all rights reserved. +** * Updated and maintained by Erich Styger, 2014-2020 +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuOneWire.h +** @version 01.00 +** @brief +** This is a component implementing the 1-Wire protocol. +*/ +/*! +** @addtogroup McuOneWire_module McuOneWire module documentation +** @{ +*/ + +#ifndef __McuOneWire_H +#define __McuOneWire_H + +/* MODULE McuOneWire. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuOneWireconfig.h" /* configuration */ +#include "McuShell.h" /* Shell */ +#include /* for size_t */ + +#ifdef __cplusplus +extern "C" { +#endif + +#define McuOneWire_ROM_CODE_SIZE (8) + /*!< Number of bytes for ROM code */ + +#define McuOneWire_PARSE_COMMAND_ENABLED McuOneWire_CONFIG_PARSE_COMMAND_ENABLED + /*!< set to 1 if method ParseCommand() is present, 0 otherwise */ + +/* +** =================================================================== +** Method : Count (component OneWire) +** +** Description : +** Returns the number of elements stored on input buffer that +** are ready to read. +** Parameters : None +** Returns : +** --- - number of elements +** =================================================================== +*/ +uint8_t McuOneWire_Count(void); +/* +** =================================================================== +** Method : Receive (component OneWire) +** +** Description : +** Programs a read operation after the master send all in +** output buffer. Don't use a SendReset while the data is +** coming. +** Parameters : +** NAME - DESCRIPTION +** counter - Number of bytes to receive from +** slave +** Returns : +** --- - error code +** =================================================================== +*/ +uint8_t McuOneWire_Receive(uint8_t counter); +/* +** =================================================================== +** Method : SendByte (component OneWire) +** +** Description : +** Sends a single byte +** Parameters : +** NAME - DESCRIPTION +** data - the data byte to be sent +** Returns : +** --- - error code +** =================================================================== +*/ +uint8_t McuOneWire_SendByte(uint8_t data); +/* +** =================================================================== +** Method : SendBytes (component OneWire) +** +** Description : +** Sends multiple bytes +** Parameters : +** NAME - DESCRIPTION +** * data - Pointer to the array of bytes +** count - Number of bytes to be sent +** Returns : +** --- - error code +** =================================================================== +*/ +uint8_t McuOneWire_SendBytes(uint8_t *data, uint8_t count); +/* +** =================================================================== +** Method : SendReset (component OneWire) +** +** Description : +** Sends a reset to the bus +** Parameters : None +** Returns : +** --- - error code +** =================================================================== +*/ +uint8_t McuOneWire_SendReset(void); +/* +** =================================================================== +** Method : GetByte (component OneWire) +** +** Description : +** Get a single byte from the bus +** Parameters : +** NAME - DESCRIPTION +** * data - Pointer to were to store the data +** Returns : +** --- - error code +** =================================================================== +*/ +uint8_t McuOneWire_GetByte(uint8_t *data); +/* +** =================================================================== +** Method : GetBytes (component OneWire) +** +** Description : +** Gets multiple bytes from the bus +** Parameters : +** NAME - DESCRIPTION +** * data - Pointer to where to store the data +** count - Number of bytes +** Returns : +** --- - error code +** =================================================================== +*/ +uint8_t McuOneWire_GetBytes(uint8_t *data, uint8_t count); +/* +** =================================================================== +** Method : Init (component OneWire) +** +** Description : +** Initializes this device. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuOneWire_Init(void); +void McuOneWire_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component OneWire) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuOneWire_CalcCRC(uint8_t *data, uint8_t dataSize); +/* +** =================================================================== +** Method : CalcCRC (component OneWire) +** +** Description : +** Calculates the CRC over a number of bytes +** Parameters : +** NAME - DESCRIPTION +** * data - Pointer to data +** dataSize - number of data bytes +** Returns : +** --- - calculated CRC +** =================================================================== +*/ + +uint8_t McuOneWire_ParseCommand(const unsigned char* cmd, bool *handled, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : ParseCommand (component OneWire) +** +** Description : +** Shell Command Line parser. Method is only available if Shell +** is enabled in the component properties. +** Parameters : +** NAME - DESCRIPTION +** cmd - command string +** * handled - Pointer to variable which tells if +** the command has been handled or not +** io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuOneWire_ReadRomCode(uint8_t *romCodeBuffer); +/* +** =================================================================== +** Method : ReadRomCode (component OneWire) +** +** Description : +** Read the ROM code. Only works with one device on the bus. +** Parameters : +** NAME - DESCRIPTION +** * romCodeBuffer - Pointer to a buffer +** with 8 bytes where the ROM code gets stored +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuOneWire_strcatRomCode(uint8_t *buf, size_t bufSize, uint8_t *romCode); +/* +** =================================================================== +** Method : strcatRomCode (component OneWire) +** +** Description : +** Appends the ROM code to a string. +** Parameters : +** NAME - DESCRIPTION +** * buf - Pointer to zero terminated buffer +** bufSize - size of buffer +** * romCode - Pointer to 8 bytes of ROM Code +** Returns : +** --- - error code +** =================================================================== +*/ + +void McuOneWire_ResetSearch(void); +/* +** =================================================================== +** Method : ResetSearch (component OneWire) +** +** Description : +** Reset the search state +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuOneWire_TargetSearch(uint8_t familyCode); +/* +** =================================================================== +** Method : TargetSearch (component OneWire) +** +** Description : +** +** Parameters : +** NAME - DESCRIPTION +** familyCode - family code to restrict +** search for +** Returns : Nothing +** =================================================================== +*/ + +bool McuOneWire_Search(uint8_t *newAddr, bool search_mode); +/* +** =================================================================== +** Method : Search (component OneWire) +** +** Description : +** +** Parameters : +** NAME - DESCRIPTION +** * newAddr - Pointer to 8 bytes of data where +** to store the new address +** search_mode - +** Returns : +** --- - TRUE if new device has been found, FALSE +** otherwise. +** =================================================================== +*/ + +/* END McuOneWire. */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif +/* ifndef __McuOneWire_H */ +/*! +** @} +*/ + diff --git a/TSM_PicoW_Sensor/McuLib/src/McuPCF85063A.c b/TSM_PicoW_Sensor/McuLib/src/McuPCF85063A.c new file mode 100644 index 0000000..0c6208b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuPCF85063A.c @@ -0,0 +1,912 @@ +/* + * Copyright (c) 2023-2024, Erich Styger + * + * * Driver for the NXP PCF85063A I2C RTC. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuPCF85063A.h" +#include "McuShell.h" +#include "McuUtility.h" +#include "McuGenericI2C.h" +#include "McuXFormat.h" + +#define McuPCF85063A_I2C_DEVICE_ADDRESS (0x51) /* 7bit I2C address, not-shifted value */ + +/* register memory map */ +#define McuPCF85063A_ADDRESS_CONTROL_1 0x00 +#define McuPCF85063A_ADDRESS_CONTROL_2 0x01 +#define McuPCF85063A_ADDRESS_OFFSET 0x02 +#define McuPCF85063A_ADDRESS_RAM_BYTE 0x03 +#define McuPCF85063A_ADDRESS_TIME_DATE_START_ADDR 0x04 /* start address of time and date registers */ +#define McuPCF85063A_ADDRESS_TIME_START_ADDR 0x04 /* start address of time registers */ +#define McuPCF85063A_ADDRESS_DATE_START_ADDR 0x07 /* start address of time registers */ +#define McuPCF85063A_ADDRESS_ALARM_START_ADDR 0x0B /* start address of alarm registers */ +#define McuPCF85063A_ADDRESS_ALARM_SECOND 0x0B /* Second_alarm */ +#define McuPCF85063A_ADDRESS_ALARM_MINUTE 0x0C /* Minute_alarm */ +#define McuPCF85063A_ADDRESS_ALARM_HOUR 0x0D /* Hour_alarm */ +#define McuPCF85063A_ADDRESS_ALARM_DAY 0x0E /* Hour_alarm */ +#define McuPCF85063A_ADDRESS_ALARM_WEEKDAY 0x0F /* Weekday_alarm */ + +#define McuPCF85063A_TTIME_AMPM_AM 0 /* AM */ +#define McuPCF85063A_TTIME_AMPM_PM 1 /* PM */ +/* hour mode is set in 12_24 bit in Control_1 */ +#define McuPCF85063A_TTIME_MODE_12H 0 /* 12 hour clock mode */ +#define McuPCF85063A_TTIME_MODE_24H 1 /* 14 hour clock mode */ + +#define McuPCF85063A_MEMORY_TIME_SIZE (3) /* 0x4-0x6, number of bytes for time information on device */ +#define McuPCF85063A_MEMORY_DATE_SIZE (4) /* 0x7-0xA, number of bytes for date information on device */ +#define McuPCF85063A_MEMORY_TIME_DATE_SIZE (7) /* 0x4-0xA, number of bytes for data and time information on device */ + +typedef struct McuPCF85063A_TTIME { /* Time in binary format */ + uint8_t hour; /* hours */ + uint8_t min; /* minutes */ + uint8_t sec; /* seconds */ + uint8_t am_pm; /* 0: AM, 1: PM */ + uint8_t mode; /* hour mode is set in 12_24 bit in Control_1 */ +} McuPCF85063A_TTIME; + +typedef struct McuPCF85063A_TDATE { /* Date in binary format */ + uint8_t year; /* year */ + uint8_t month; /* month */ + uint8_t day; /* day */ + uint8_t dayOfWeek; /* Day of week, where 0 is the first day. In the range of 0..6 */ +} McuPCF85063A_TDATE; + +uint8_t McuPCF85063A_ReadBlock(uint8_t addr, uint8_t *buf, size_t bufSize) { + return McuGenericI2C_ReadAddress(McuPCF85063A_I2C_DEVICE_ADDRESS, &addr, sizeof(addr), buf, bufSize); +} + +uint8_t McuPCF85063A_WriteBlock(uint8_t addr, uint8_t *buf, size_t bufSize) { + return McuGenericI2C_WriteAddress(McuPCF85063A_I2C_DEVICE_ADDRESS, &addr, sizeof(addr), buf, bufSize); +} + +uint8_t McuPCF85063A_ReadByte(uint8_t addr, uint8_t *data) { + return McuGenericI2C_ReadAddress(McuPCF85063A_I2C_DEVICE_ADDRESS, &addr, sizeof(addr), data, sizeof(*data)); +} + +uint8_t McuPCF85063A_WriteByte(uint8_t addr, uint8_t data) { + return McuGenericI2C_WriteAddress(McuPCF85063A_I2C_DEVICE_ADDRESS, &addr, sizeof(addr), &data, sizeof(data)); +} + +uint8_t McuPCF85063A_ReadControl1(uint8_t *data) { + return McuPCF85063A_ReadByte(McuPCF85063A_ADDRESS_CONTROL_1, data); +} + +uint8_t McuPCF85063A_WriteControl1(uint8_t data) { + return McuPCF85063A_WriteByte(McuPCF85063A_ADDRESS_CONTROL_1, data); +} + +uint8_t McuPCF85063A_WriteSoftwareReset(void) { + return McuPCF85063A_WriteByte(McuPCF85063A_ADDRESS_CONTROL_1, 0x58); +} + +uint8_t McuPCF85063A_ReadControl2(uint8_t *data) { + return McuPCF85063A_ReadByte(McuPCF85063A_ADDRESS_CONTROL_2, data); +} + +uint8_t McuPCF85063A_WriteControl2(uint8_t data) { + return McuPCF85063A_WriteByte(McuPCF85063A_ADDRESS_CONTROL_2, data); +} + +uint8_t McuPCF85063A_WriteAlarmInterrupt(bool enable) { + uint8_t data; + + if (McuPCF85063A_ReadControl2(&data)!=ERR_OK) { /* read current value */ + return ERR_FAILED; + } + /* AIE 0: disabled; 1: enabled */ + if (enable) { + data |= (1<<7); /* set AIE (Alarm Interrupt Enable) bit */ + } else { + data &= (1<<7); /* clear AIE (Alarm Interrupt Enable) bit */ + } + return McuPCF85063A_WriteByte(McuPCF85063A_ADDRESS_CONTROL_2, data); +} + +uint8_t McuPCF85063A_WriteClockOutputFrequency(McuPCF85063A_COF_Frequency_e frequency) { + uint8_t data; + + if (McuPCF85063A_ReadControl2(&data)!=ERR_OK) { /* read current value */ + return ERR_FAILED; + } + /* Clock Output Frequency: + * 000: 32768 + * 001: 16387 + * 010: 8196 + * 011: 4096 + * 100: 2048 + * 101: 1024 + * 110: 1 + * 111: CLKOUT=LOW */ + if (frequency>7) { + return ERR_RANGE; + } + data |= (frequency&7); /* set COF bits [2:0] */ + return McuPCF85063A_WriteByte(McuPCF85063A_ADDRESS_CONTROL_2, data); +} + + +uint8_t McuPCF85063A_WriteResetAlarmInterrupt(void) { + uint8_t data; + + if (McuPCF85063A_ReadControl2(&data)!=ERR_OK) { /* read current value */ + return ERR_FAILED; + } + /* AF: reset alarm flag with writing a 0 to it */ + data &= ~(1<<6); /* clear AF (Alarm Flag) bit */ + return McuPCF85063A_WriteByte(McuPCF85063A_ADDRESS_CONTROL_2, data); +} + +uint8_t McuPCF85063A_ReadOffset(uint8_t *data) { + return McuPCF85063A_ReadByte(McuPCF85063A_ADDRESS_OFFSET, data); +} + +uint8_t McuPCF85063A_WriteOffset(uint8_t data) { + return McuPCF85063A_WriteByte(McuPCF85063A_ADDRESS_OFFSET, data); +} + +bool McuPCF85063A_Is24hMode(void) { + uint8_t res, ctrl; + + res = McuPCF85063A_ReadControl1(&ctrl); + if (res!=ERR_OK) { + return true; /* default is 24h mode */ + } + return (ctrl&(1<<1))==0; /* 0: 12-hour mode, 1: 24-hour mode */ +} + +uint8_t McuPCF85063A_ReadAlarmSecond(uint8_t *second, bool *enabled) { + uint8_t data, res; + + res = McuPCF85063A_ReadByte(McuPCF85063A_ADDRESS_ALARM_SECOND, &data); + if (res!=ERR_OK) { + return ERR_FAILED; + } + *enabled = (data&(1<<7))==0; /* 1: disabled (default), 0: enabled */ + *second = ((data&0x70)>>4)*10 + (data&0x0F); /* BCD encoded */ + return ERR_OK; +} + +uint8_t McuPCF85063A_WriteAlarmSecond(uint8_t second, bool enable) { + uint8_t data; + + if (second>59) { + return ERR_RANGE; + } + data = ((second/10)<<4)|(second%10); /* encoded in BCD */ + if (!enable) { + data |= (1<<7); /* 1: disabled (default), 0: enabled */ + } + return McuPCF85063A_WriteByte(McuPCF85063A_ADDRESS_ALARM_SECOND, data); +} + +uint8_t McuPCF85063A_ReadAlarmMinute(uint8_t *minute, bool *enabled) { + uint8_t data, res; + + res = McuPCF85063A_ReadByte(McuPCF85063A_ADDRESS_ALARM_MINUTE, &data); + if (res!=ERR_OK) { + return ERR_FAILED; + } + *enabled = (data&(1<<7))==0; /* 1: disabled (default), 0: enabled */ + *minute = ((data&0x70)>>4)*10 + (data&0x0F); /* BCD encoded */ + return ERR_OK; +} + +uint8_t McuPCF85063A_WriteAlarmMinute(uint8_t minute, bool enable) { + uint8_t data; + + if (minute>59) { + return ERR_RANGE; + } + data = ((minute/10)<<4)|(minute%10); /* BCD encoded */ + if (!enable) { + data |= (1<<7); /* 1: disabled (default), 0: enabled */ + } + return McuPCF85063A_WriteByte(McuPCF85063A_ADDRESS_ALARM_MINUTE, data); +} + +uint8_t McuPCF85063A_ReadAlarmHour(uint8_t *hour, bool *enabled, bool *is24h, bool *isAM) { + uint8_t data, res; + + *is24h = McuPCF85063A_Is24hMode(); + res = McuPCF85063A_ReadByte(McuPCF85063A_ADDRESS_ALARM_HOUR, &data); + if (res!=ERR_OK) { + return ERR_FAILED; + } + *enabled = (data&(1<<7))==0; /* 1: disabled (default), 0: enabled */ + if (*is24h) { + *hour = ((data&0x30)>>4)*10 + (data&0x0F); /* BCD encoded */ + *isAM = false; + } else { + *hour = ((data&0x70)>>4)*10 + (data&0x0F); /* BCD encoded */ + *isAM = (data&(1<<5))==0; + } + return ERR_OK; +} + +/* Note: expects 24h hour format! */ +uint8_t McuPCF85063A_WriteAlarmHour(uint8_t hour, bool enable, bool is24h, bool isAM) { + uint8_t data; + + if (is24h && hour>23) { + return ERR_RANGE; + } else if (!is24h && hour>12) { + return ERR_RANGE; + } + data = 0; + if (!enable) { + data |= (1<<7); /* 1: disabled (default), 0: enabled */ + } + if (is24h) { + data |= ((hour/10)<<4)|(hour%10); /* BCD encoded */ + } else { + if (hour>12) { /* PM */ + hour -= 12; + data |= (1<<5); /* set PM bit */ + } + data |= (hour<<4)|(hour%10); + } + return McuPCF85063A_WriteByte(McuPCF85063A_ADDRESS_ALARM_HOUR, data); +} + +uint8_t McuPCF85063A_ReadAlarmDay(uint8_t *day, bool *enabled) { + uint8_t res, data; + + res = McuPCF85063A_ReadByte(McuPCF85063A_ADDRESS_ALARM_DAY, &data); + if (res != ERR_OK) { + return ERR_FAILED; + } + *enabled = (data&(1<<7))==0; /* 1: disabled (default), 0: enabled */ + *day = ((data&0x70)>>4)*10 + (data&0x0F); /* BCD encoded */ + return ERR_OK; +} + +uint8_t McuPCF85063A_WriteAlarmDay(uint8_t day, bool enable) { + uint8_t data; + + data = 0; + if (!enable) { + data |= (1<<7); /* 1: disabled (default), 0: enabled */ + } + data |= ((day/10)<<4)|(day%10); /* BCD encoded */ + return McuPCF85063A_WriteByte(McuPCF85063A_ADDRESS_ALARM_DAY, data); +} + +uint8_t McuPCF85063A_ReadAlarmWeekDay(uint8_t *weekDay, bool *enabled) { + uint8_t res, data; + + res = McuPCF85063A_ReadByte(McuPCF85063A_ADDRESS_ALARM_WEEKDAY, &data); + if (res != ERR_OK) { + return ERR_FAILED; + } + *enabled = (data&(1<<7))==0; /* 1: disabled (default), 0: enabled */ + *weekDay = ((data&0x70)>>4)*10 + (data&0x0F); /* BCD encoded */ + return ERR_OK; +} + +uint8_t McuPCF85063A_WriteAlarmWeekDay(uint8_t weekDay, bool enable) { + uint8_t data; + + if (weekDay>6) { + return ERR_RANGE; + } + data = 0; + if (!enable) { + data |= (1<<7); /* 1: disabled (default), 0: enabled */ + } + data |= ((weekDay/10)<<4)|(weekDay%10); /* BCD encoded */ + return McuPCF85063A_WriteByte(McuPCF85063A_ADDRESS_ALARM_WEEKDAY, data); +} + +uint8_t McuPCF85063A_ReadTimeDate(McuPCF85063A_TTIME *time, McuPCF85063A_TDATE *date) { + uint8_t buf[McuPCF85063A_MEMORY_TIME_DATE_SIZE]; + bool is24hMode; + + if (McuPCF85063A_ReadBlock(McuPCF85063A_ADDRESS_TIME_DATE_START_ADDR, buf, sizeof(buf))!=ERR_OK) { + return ERR_FAILED; + } + is24hMode = McuPCF85063A_Is24hMode(); + time->sec = (uint8_t)(((buf[0]&0x70)>>4)*10 + (buf[0]&0x0F)); /* seconds in BCD format */ + time->min = (uint8_t)((buf[1]>>4)*10 + (buf[1]&0x0F)); /* minutes in BCD format */ + if (is24hMode) { + time->hour = (uint8_t)(((buf[2]&0x30)>>4)*10 + (buf[2]&0x0F)); /* hour in BCD format */ + time->mode = McuPCF85063A_TTIME_MODE_24H; + } else { + time->hour = (uint8_t)(((buf[2]&0x10)>>4)*10 + (buf[2]&0x0F)); /* hour in BCD format */ + time->am_pm = (uint8_t)((buf[2]&(1<<5))>>5); /* bit 5: AM/PM indicator. 0: AM, 1: PM */ + time->mode = McuPCF85063A_TTIME_MODE_12H; + } + date->day = (uint8_t)((buf[3]>>4)*10 + (buf[3]&0x0F)); /* BCD format */ + date->dayOfWeek =(uint8_t)(buf[4]); /* 0: Sunday, 1: Monday, ... 6: Saturday */ + date->month = (uint8_t)((buf[5]>>4)*10 + (buf[5]&0x0F)); /* 1: January */ + date->year = (uint8_t)((buf[6]>>4)*10 + (buf[6]&0x0F)); + return ERR_OK; +} + +uint8_t McuPCF85063A_WriteTimeDate(McuPCF85063A_TTIME *time, McuPCF85063A_TDATE *date) { + uint8_t buf[McuPCF85063A_MEMORY_TIME_DATE_SIZE]; + if ( ((time->mode==McuPCF85063A_TTIME_MODE_12H)&&((time->hour>12)||(time->hour==0))) + || ((time->mode==McuPCF85063A_TTIME_MODE_24H)&&(time->hour>23)) + || (time->min>59)||(time->sec>59) + || (date->year>99)||(date->month>12)||(date->month==0) + || (date->day>31)||(date->day==0) + || (date->dayOfWeek>6)) + { + return ERR_RANGE; + } + buf[0] = (uint8_t)(((time->sec/10)<<4) | (time->sec%10)); + buf[1] = (uint8_t)(((time->min/10)<<4) | (time->min%10)); + buf[2] = (uint8_t)(((time->hour/10)<<4) | (time->hour%10)); + if (time->mode==McuPCF85063A_TTIME_MODE_12H) { + buf[2] |= (time->am_pm)?(1<<5):0; + } + buf[3] = (uint8_t)(((date->day/10)<<4) | (date->day%10)); + buf[4] = (uint8_t)(date->dayOfWeek); + buf[5] = (uint8_t)(((date->month/10)<<4) | (date->month%10)); + buf[6] = (uint8_t)(((date->year/10)<<4) | (date->year%10)); + if (McuPCF85063A_WriteBlock(McuPCF85063A_ADDRESS_TIME_DATE_START_ADDR, buf, sizeof(buf))!=ERR_OK) { + return ERR_FAILED; + } + return ERR_OK; +} + +uint8_t McuPCF85063A_WriteDate(McuPCF85063A_TDATE *date) { + uint8_t buf[McuPCF85063A_MEMORY_DATE_SIZE]; + + if ( (date->year>99) + || (date->month>12)||(date->month==0) + || (date->day>31)||(date->day==0) + || (date->dayOfWeek>6) + ) + { + return ERR_RANGE; + } + buf[0] = (uint8_t)(((date->day/10)<<4) | (date->day%10)); + buf[1] = (uint8_t)(date->dayOfWeek); + buf[2] = (uint8_t)(((date->month/10)<<4) | (date->month%10)); + buf[3] = (uint8_t)(((date->year/10)<<4) | (date->year%10)); + if (McuPCF85063A_WriteBlock(McuPCF85063A_ADDRESS_DATE_START_ADDR, buf, sizeof(buf))!=ERR_OK) { + return ERR_FAILED; + } + return ERR_OK; +} + +uint8_t McuPCF85063A_WriteTime(McuPCF85063A_TTIME *time) { + uint8_t buf[McuPCF85063A_MEMORY_TIME_SIZE]; + + if ( ((time->mode==McuPCF85063A_TTIME_MODE_12H)&&((time->hour>12)||(time->hour==0))) + || ((time->mode==McuPCF85063A_TTIME_MODE_24H)&&(time->hour>23)) + || (time->min>59) || (time->sec>59) + ) + { + return ERR_RANGE; + } + buf[0] = (uint8_t)(((time->sec/10)<<4) | (time->sec%10)); + buf[1] = (uint8_t)(((time->min/10)<<4) | (time->min%10)); + buf[2] = (uint8_t)(((time->hour/10)<<4) | (time->hour%10)); + if (time->mode==McuPCF85063A_TTIME_MODE_12H) { + buf[2] |= (time->am_pm)?(1<<5):0; + } + if (McuPCF85063A_WriteBlock(McuPCF85063A_ADDRESS_TIME_START_ADDR, buf, sizeof(buf))!=ERR_OK) { + return ERR_FAILED; + } + return ERR_OK; +} + +uint8_t McuPCF85063A_GetTime(TIMEREC *time) { + McuPCF85063A_TTIME ttime; + McuPCF85063A_TDATE tdate; + + if (McuPCF85063A_ReadTimeDate(&ttime, &tdate)!=ERR_OK) { + return ERR_FAILED; + } + time->Hour = ttime.hour; + time->Min = ttime.min; + time->Sec = ttime.sec; + time->Sec100 = 0; + return ERR_OK; +} + +uint8_t McuPCF85063A_SetTimeInfo(uint8_t Hour, uint8_t Min, uint8_t Sec, uint8_t Sec100) { + McuPCF85063A_TTIME ttime; + + ttime.hour = Hour; + ttime.min = Min; + ttime.sec = Sec; + (void)Sec100; /* ignored, as cannot be stored on device */ + ttime.mode = McuPCF85063A_TTIME_MODE_24H; + ttime.am_pm = McuPCF85063A_TTIME_AMPM_AM; + return McuPCF85063A_WriteTime(&ttime); +} + +uint8_t McuPCF85063A_SetTime(TIMEREC *time) { + return McuPCF85063A_SetTimeInfo(time->Hour, time->Min, time->Sec, time->Sec100); +} + +uint8_t McuPCF85063A_GetDate(DATEREC *date) { + McuPCF85063A_TTIME ttime; + McuPCF85063A_TDATE tdate; + + if (McuPCF85063A_ReadTimeDate(&ttime, &tdate)!=ERR_OK) { + return ERR_FAILED; + } + date->Year = (uint16_t)(tdate.year+2000); /* assume we are after the year 2000 */ + date->Month = tdate.month; + date->Day = tdate.day; + return ERR_OK; +} + +uint8_t McuPCF85063A_SetDateInfo(uint16_t Year, uint8_t Month, uint8_t Day) { + McuPCF85063A_TDATE tdate; + + if (Year>=2000) { + tdate.year = (uint8_t)(Year-2000); + } else if (Year>=1900) { + tdate.year = (uint8_t)(Year-1900); + } else { + tdate.year = Year%100; + } + tdate.month = Month; + tdate.day = Day; + tdate.dayOfWeek = McuUtility_WeekDay(Year, Month, Day); + return McuPCF85063A_WriteDate(&tdate); +} + +uint8_t McuPCF85063A_SetDate(DATEREC *date) { + return McuPCF85063A_SetDateInfo(date->Year, date->Month, date->Day); +} + +uint8_t McuPCF85063A_GetTimeDate(TIMEREC *time, DATEREC *date) { + McuPCF85063A_TTIME ttime; + McuPCF85063A_TDATE tdate; + + if (McuPCF85063A_ReadTimeDate(&ttime, &tdate)!=ERR_OK) { + return ERR_FAILED; + } + time->Hour = ttime.hour; + time->Min = ttime.min; + time->Sec = ttime.sec; + time->Sec100 = 0; + date->Year = (uint16_t)(tdate.year+2000); + date->Month = tdate.month; + date->Day = tdate.day; + return ERR_OK; +} + +uint8_t McuPCF85063A_ReadRamByte(uint8_t *data) { + return McuPCF85063A_ReadByte(McuPCF85063A_ADDRESS_RAM_BYTE, data); +} + +uint8_t McuPCF85063A_WriteRamByte(uint8_t data) { + return McuPCF85063A_WriteByte(McuPCF85063A_ADDRESS_RAM_BYTE, data); +} + +static const char *GetWeekDayString(uint8_t weekday) { + static const char *const weekDays[]={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; + if (weekday<=sizeof(weekDays)/sizeof(weekDays[0])) { + return weekDays[weekday]; + } else { + return "error"; + } +} + +static uint8_t StrCatHWTimeDate(uint8_t *buf, size_t bufSize) { + McuPCF85063A_TDATE tdate; + McuPCF85063A_TTIME ttime; + + if (McuPCF85063A_ReadTimeDate(&ttime, &tdate)!=ERR_OK) { + return ERR_FAILED; + } + if (tdate.dayOfWeek<=6) { + McuUtility_strcat(buf, bufSize, (unsigned char*)GetWeekDayString(tdate.dayOfWeek)); + } + McuUtility_chcat(buf, bufSize, ' '); + McuUtility_strcatNum16uFormatted(buf, bufSize, tdate.day, '0', 2); + McuUtility_chcat(buf, bufSize, '.'); + McuUtility_strcatNum16uFormatted(buf, bufSize, tdate.month, '0', 2); + McuUtility_chcat(buf, bufSize, '.'); + McuUtility_strcatNum16u(buf, bufSize, (uint16_t)tdate.year); + McuUtility_strcat(buf, bufSize, (unsigned char*)", "); + McuUtility_strcatNum16sFormatted(buf, bufSize, ttime.hour, '0', 2); + McuUtility_chcat(buf, bufSize, ':'); + McuUtility_strcatNum16sFormatted(buf, bufSize, ttime.min, '0', 2); + McuUtility_chcat(buf, bufSize, ':'); + McuUtility_strcatNum16sFormatted(buf, bufSize, ttime.sec, '0', 2); + if (ttime.mode==McuPCF85063A_TTIME_MODE_24H) { + McuUtility_strcat(buf, bufSize, (unsigned char*)" (24h)"); + } else { + if (ttime.am_pm==McuPCF85063A_TTIME_AMPM_AM) { + McuUtility_strcat(buf, bufSize, (unsigned char*)"am"); + } else { + McuUtility_strcat(buf, bufSize, (unsigned char*)"pm"); + } + } + return ERR_OK; +} + +static uint8_t StrCatHWAlarm(unsigned char *buf, size_t bufSize) { + uint8_t res, data; + bool enabled; + bool is24h, isAM; + + McuUtility_strcat(buf, bufSize, (unsigned char*)"h:"); + res = McuPCF85063A_ReadAlarmHour(&data, &enabled, &is24h, &isAM); + if (res==ERR_OK) { + McuUtility_strcatNum8u(buf, bufSize, data); + if (!is24h) { + if (isAM) { + McuUtility_strcat(buf, bufSize, (unsigned char*)"AM"); + } else { + McuUtility_strcat(buf, bufSize, (unsigned char*)"PM"); + } + } + McuUtility_strcat(buf, bufSize, (unsigned char*)" ("); + if (enabled) { + McuUtility_strcat(buf, bufSize, (unsigned char*)"on); "); + } else { + McuUtility_strcat(buf, bufSize, (unsigned char*)"off); "); + } + } else { + McuUtility_strcat(buf, bufSize, (unsigned char*)"ERR"); + } + McuUtility_strcat(buf, bufSize, (unsigned char*)"m:"); + res = McuPCF85063A_ReadAlarmMinute(&data, &enabled); + if (res==ERR_OK) { + McuUtility_strcatNum8u(buf, bufSize, data); + McuUtility_strcat(buf, bufSize, (unsigned char*)" ("); + if (enabled) { + McuUtility_strcat(buf, bufSize, (unsigned char*)"on); "); + } else { + McuUtility_strcat(buf, bufSize, (unsigned char*)"off); "); + } + } else { + McuUtility_strcat(buf, bufSize, (unsigned char*)"ERR"); + } + McuUtility_strcat(buf, bufSize, (unsigned char*)"s:"); + res = McuPCF85063A_ReadAlarmSecond(&data, &enabled); + if (res==ERR_OK) { + McuUtility_strcatNum8u(buf, bufSize, data); + McuUtility_strcat(buf, bufSize, (unsigned char*)" ("); + if (enabled) { + McuUtility_strcat(buf, bufSize, (unsigned char*)"on); "); + } else { + McuUtility_strcat(buf, bufSize, (unsigned char*)"off); "); + } + } else { + McuUtility_strcat(buf, bufSize, (unsigned char*)"ERR"); + } + McuUtility_strcat(buf, bufSize, (unsigned char*)"w:"); + res = McuPCF85063A_ReadAlarmWeekDay(&data, &enabled); + if (res==ERR_OK) { + McuUtility_strcatNum8u(buf, bufSize, data); + McuUtility_strcat(buf, bufSize, (unsigned char*)", "); + McuUtility_strcat(buf, bufSize, (unsigned char*)GetWeekDayString(data)); + McuUtility_strcat(buf, bufSize, (unsigned char*)" ("); + if (enabled) { + McuUtility_strcat(buf, bufSize, (unsigned char*)"on); "); + } else { + McuUtility_strcat(buf, bufSize, (unsigned char*)"off); "); + } + } else { + McuUtility_strcat(buf, bufSize, (unsigned char*)"ERR"); + } + return ERR_OK; +} + +static uint8_t DateCmd(const unsigned char *cmd, McuShell_ConstStdIOType *io) { + uint8_t day, month; + uint16_t year; + uint8_t res = ERR_OK; + + if (McuUtility_ScanDate(&cmd, &day, &month, &year) == ERR_OK) { /* ok, format fine */ + /* update real time clock */ + res = McuPCF85063A_SetDateInfo(year, month, day); + if (res!=ERR_OK) { + McuShell_SendStr((unsigned char*)"*** Failure setting RTC\r\n", io->stdErr); + res = ERR_FAILED; + } + } else { + McuShell_SendStr((unsigned char*)"*** Error while reading command! ***", io->stdErr); + McuShell_SendStr((void *)cmd, io->stdErr); + McuShell_SendStr((unsigned char*)"\r\n", io->stdErr); + res = ERR_FAILED; + } + return res; +} + +static uint8_t TimeCmd(const unsigned char *cmd, McuShell_ConstStdIOType *io) { + uint8_t hour, minute, second, hSecond; + uint8_t res = ERR_OK; + + if (McuUtility_ScanTime(&cmd, &hour, &minute, &second, &hSecond)==ERR_OK) { /* format fine */ + /* set RTC time */ + res = McuPCF85063A_SetTimeInfo(hour, minute, second, hSecond); + if (res != ERR_OK) { + McuShell_SendStr((unsigned char*)"*** Failure setting RTC time\r\n", io->stdErr); + res = ERR_FAILED; + } + } else { + McuShell_SendStr((unsigned char*)"*** Error while reading command: ", io->stdErr); + McuShell_SendStr(cmd, io->stdErr); + McuShell_SendStr((unsigned char*)"\r\n", io->stdErr); + res = ERR_FAILED; + } + return res; +} + +static uint8_t CmdAlarmEnable(const unsigned char *p, bool enable) { + uint8_t val; + bool dummy; + bool is24h, isAM; + + if (*p=='s') { + if (McuPCF85063A_ReadAlarmSecond(&val, &dummy)!=ERR_OK) { + return ERR_FAILED; + } + return McuPCF85063A_WriteAlarmSecond(val, enable); + } else if (*p=='m') { + if (McuPCF85063A_ReadAlarmMinute(&val, &dummy)!=ERR_OK) { + return ERR_FAILED; + } + return McuPCF85063A_WriteAlarmMinute(val, enable); + } else if (*p=='h') { + if (McuPCF85063A_ReadAlarmHour(&val, &dummy, &is24h, &isAM)!=ERR_OK) { + return ERR_FAILED; + } + return McuPCF85063A_WriteAlarmHour(val, enable, is24h, isAM); + } else if (*p=='w') { + if (McuPCF85063A_ReadAlarmWeekDay(&val, &dummy)!=ERR_OK) { + return ERR_FAILED; + } + return McuPCF85063A_WriteAlarmWeekDay(val, enable); + } + return ERR_FAILED; +} + +static uint8_t PrintStatus(McuShell_ConstStdIOType *io) { + unsigned char buf[96]; + uint8_t res, data; + + McuShell_SendStatusStr((unsigned char*)"rtc", (const unsigned char*)"Status of PCF85063A RTC\r\n", io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), McuPCF85063A_I2C_DEVICE_ADDRESS); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" address", buf, io->stdOut); + + res = McuPCF85063A_ReadControl1(&data); + if (res==ERR_OK) { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), data); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)": "); + if (data&(1<<7)) { /* EXT_TEST */ + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"7:test(1), "); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"7:normal(0), "); + } + if (data&(1<<5)) { /* STOP*/ + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"5:RCTstopped(1), "); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"5:RTCruns(0), "); + } + if (data&(1<<3)) { /* CIE: correction interrupt enable */ + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"3:CIEoff(1), "); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"3:CIEon(0), "); + } + if (data&(1<<1)) { /* 12_24 */ + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"1:12h(1), "); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"1:24h(0), "); + } + if (data&(1<<0)) { /* CAP_SEL */ + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"0:12.5pF(1)"); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"0:7pF(0)"); + } + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ERROR\r\n"); + } + McuShell_SendStatusStr((uint8_t*)" Control_1", (unsigned char*)buf, io->stdOut); + + res = McuPCF85063A_ReadControl2(&data); + if (res==ERR_OK) { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), data); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)": "); + if (data&(1<<7)) { /* AIE */ + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"7:AIEon(1), "); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"7:AIEoff(0), "); + } + if (data&(1<<6)) { /* AF */ + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"6:AFon(1), "); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"6:AFoff(0), "); + } + if (data&(1<<5)) { /* MI */ + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"5:MIon(1), "); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"5:MIoff(0), "); + } + if (data&(1<<4)) { /* HMI */ + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"4:HMIon(1), "); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"4:HMIoff(0), "); + } + if (data&(1<<3)) { /* TF */ + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"3:TFon(1), "); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"3:TFoff(0), "); + } + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"2..0:COF("); + McuUtility_strcatNum8u(buf, sizeof(buf), data&0x0); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)")\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ERROR\r\n"); + } + McuShell_SendStatusStr((uint8_t*)" Control_2", (unsigned char*)buf, io->stdOut); + + res = McuPCF85063A_ReadOffset(&data); + if (res==ERR_OK) { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), data); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ERROR\r\n"); + } + McuShell_SendStatusStr((uint8_t*)" Offset", (unsigned char*)buf, io->stdOut); + + res = McuPCF85063A_ReadRamByte(&data); + if (res==ERR_OK) { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), data); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ERROR\r\n"); + } + McuShell_SendStatusStr((uint8_t*)" RAM byte", (unsigned char*)buf, io->stdOut); + + buf[0] = '\0'; + if (StrCatHWAlarm(buf, sizeof(buf))) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"ERROR\r\n"); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" alarm", buf, io->stdOut); + + buf[0] = '\0'; + if (StrCatHWTimeDate(buf, sizeof(buf))!=ERR_OK) { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"ERROR\r\n"); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" time/date", buf, io->stdOut); + return ERR_OK; +} + +uint8_t McuPCF85063A_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) { + int32_t val; + const unsigned char *p; + bool enabled; + uint8_t dummy; + + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, "rtc help")==0) { + *handled = true; + McuShell_SendHelpStr((unsigned char*)"rtc", (const unsigned char*)"Group of PCF85063 RTC commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (const unsigned char*)"Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" reset", (const unsigned char*)"Send software reset command to device\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" write ram ", (const unsigned char*)"Write a byte value to the RAM\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" write ctrl1 ", (const unsigned char*)"Write a byte to the Control_1 (00h) register\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" write ctrl2 ", (const unsigned char*)"Write a byte to the Control_2 (01h) register\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" write offset ", (const unsigned char*)"Write a byte to the Offset (02h) register\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" time [hh:mm:ss[,z]]", (const unsigned char*)"Set the current time\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" date [dd.mm.yyyy]", (const unsigned char*)"Set the current date\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" alarm s|m|h|w ", (const unsigned char*)"Set alarm value for second, minute, hour or weekday\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" alarm on|off s|m|h|w", (const unsigned char*)"Enable alarm for second, minute, hour or weekday\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" alarm AIE on|off", (const unsigned char*)"Enable alarm interrupt for second, minute or hour\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" alarm reset AF", (const unsigned char*)"Reset alarm interrupt flag\r\n", io->stdOut); + return ERR_OK; + } else if ((McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) || (McuUtility_strcmp((char*)cmd, "rtc status")==0)) { + *handled = true; + return PrintStatus(io); + } else if (McuUtility_strncmp((char*)cmd, "rtc write ram ", sizeof("rtc write ram ")-1)==0) { + *handled = true; + p = cmd + sizeof("rtc write ram ")-1; + if (McuUtility_xatoi(&p, &val)==ERR_OK && val>=0 && val<=0xff) { + return McuPCF85063A_WriteRamByte(val); + } + } else if (McuUtility_strncmp((char*)cmd, "rtc write ctrl1 ", sizeof("rtc write ctrl1 ")-1)==0) { + *handled = true; + p = cmd + sizeof("rtc write ctrl1 ")-1; + if (McuUtility_xatoi(&p, &val)==ERR_OK && val>=0 && val<=0xff) { + return McuPCF85063A_WriteControl1(val); + } + } else if (McuUtility_strncmp((char*)cmd, "rtc write ctrl2 ", sizeof("rtc write ctrl2 ")-1)==0) { + *handled = true; + p = cmd + sizeof("rtc write ctrl2 ")-1; + if (McuUtility_xatoi(&p, &val)==ERR_OK && val>=0 && val<=0xff) { + return McuPCF85063A_WriteControl2(val); + } + } else if (McuUtility_strncmp((char*)cmd, "rtc write offset ", sizeof("rtc write offset ")-1)==0) { + *handled = true; + p = cmd + sizeof("rtc write offset ")-1; + if (McuUtility_xatoi(&p, &val)==ERR_OK && val>=0 && val<=0xff) { + return McuPCF85063A_WriteOffset(val); + } + } else if (McuUtility_strncmp((char*)cmd, "rtc date ", sizeof("rtc date ")-1)==0) { + *handled = TRUE; + p = cmd + sizeof("rtc date ")-1; + return DateCmd(p, io); + } else if (McuUtility_strncmp((char*)cmd, "rtc time ", sizeof("rtc time ")-1)==0) { + *handled = TRUE; + p = cmd + sizeof("rtc time ")-1; + return TimeCmd(p, io); + } else if (McuUtility_strncmp((char*)cmd, "rtc alarm s ", sizeof("rtc alarm s ")-1)==0) { + *handled = TRUE; + p = cmd + sizeof("rtc alarm s ")-1; + if (McuPCF85063A_ReadAlarmSecond(&dummy, &enabled)!=ERR_OK) { /* get enabled state */ + return ERR_FAILED; + } + if (McuUtility_xatoi(&p, &val)==ERR_OK && val>=0 && val<=59) { + return McuPCF85063A_WriteAlarmSecond(val, enabled); + } + return ERR_FAILED; + } else if (McuUtility_strncmp((char*)cmd, "rtc alarm m ", sizeof("rtc alarm m ")-1)==0) { + *handled = TRUE; + p = cmd + sizeof("rtc alarm m")-1; + if (McuPCF85063A_ReadAlarmMinute(&dummy, &enabled)!=ERR_OK) { /* get enabled state */ + return ERR_FAILED; + } + if (McuUtility_xatoi(&p, &val)==ERR_OK && val>=0 && val<=59) { + return McuPCF85063A_WriteAlarmMinute(val, enabled); + } + return ERR_FAILED; + } else if (McuUtility_strncmp((char*)cmd, "rtc alarm h ", sizeof("rtc alarm h ")-1)==0) { + bool is24h, isAM; + *handled = TRUE; + p = cmd + sizeof("rtc alarm h")-1; + if (McuPCF85063A_ReadAlarmHour(&dummy, &enabled, &is24h, &isAM)!=ERR_OK) { /* get enabled state */ + return ERR_FAILED; + } + if (McuUtility_xatoi(&p, &val)==ERR_OK && val>=0 && val<=23) { + return McuPCF85063A_WriteAlarmHour(val, enabled, true, false); /* only supporting 24h format */ + } + return ERR_FAILED; + } else if (McuUtility_strncmp((char*)cmd, "rtc alarm w ", sizeof("rtc alarm w ")-1)==0) { + *handled = TRUE; + p = cmd + sizeof("rtc alarm w")-1; + if (McuPCF85063A_ReadAlarmWeekDay(&dummy, &enabled)!=ERR_OK) { /* get enabled state */ + return ERR_FAILED; + } + if (McuUtility_xatoi(&p, &val)==ERR_OK && val>=0 && val<=6) { + return McuPCF85063A_WriteAlarmWeekDay(val, enabled); + } + return ERR_FAILED; + } else if (McuUtility_strcmp((char*)cmd, "rtc reset")==0) { + *handled = true; + return McuPCF85063A_WriteSoftwareReset(); + } else if (McuUtility_strcmp((char*)cmd, "rtc alarm AIE on")==0) { + *handled = true; + return McuPCF85063A_WriteAlarmInterrupt(true); + } else if (McuUtility_strcmp((char*)cmd, "rtc alarm AIE off")==0) { + *handled = true; + return McuPCF85063A_WriteAlarmInterrupt(false); + } else if (McuUtility_strcmp((char*)cmd, "rtc alarm reset AF")==0) { + *handled = true; + return McuPCF85063A_WriteResetAlarmInterrupt(); + } else if (McuUtility_strncmp((char*)cmd, "rtc alarm on ", sizeof("rtc alarm on ")-1)==0) { + *handled = true; + return CmdAlarmEnable(cmd+sizeof("rtc alarm on ")-1, true); + } else if (McuUtility_strncmp((char*)cmd, "rtc alarm off ", sizeof("rtc alarm off ")-1)==0) { + *handled = true; + return CmdAlarmEnable(cmd+sizeof("rtc alarm off ")-1, false); + } + return ERR_OK; +} + +void McuPCF85063A_Init(void) { +} diff --git a/TSM_PicoW_Sensor/McuLib/src/McuPCF85063A.h b/TSM_PicoW_Sensor/McuLib/src/McuPCF85063A.h new file mode 100644 index 0000000..586fbc2 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuPCF85063A.h @@ -0,0 +1,221 @@ +/* + * Copyright (c) 2023-2024, Erich Styger + * + * Driver for the NXP PCF85063A I2C RTC. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MCUPCF85063A_H_ +#define MCUPCF85063A_H_ + +#include "McuPCF85063A_config.h" +#include "McuShell.h" +#include "McuTimeDate.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*! + * \brief Shell command line parser. + * \param cmd Shell command string + * \param handled Set to true if command was handled, untouched otherwise + * \param io Standard I/O handler to be used + * \return Error code, ERR_OK if no failure + */ +uint8_t McuPCF85063A_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); + +/*! + * \brief Get the RTC time. + * \param time Pointer store the time information + * \return Error code, ERR_OK if no failure + */ +uint8_t McuPCF85063A_GetTime(TIMEREC *time); + +/*! + * \brief Get the RTC date. + * \param date Pointer to store the date information + * \return Error code, ERR_OK if no failure + */ +uint8_t McuPCF85063A_GetDate(DATEREC *date); + +/*! + * \brief Set the RTC time. + * \param time Pointer to time information + * \return Error code, ERR_OK if no failure + */ +uint8_t McuPCF85063A_SetTime(TIMEREC *time); + +/*! + * \brief Set the RTC date. + * \param date Pointer to date information + * \return Error code, ERR_OK if no failure + */ +uint8_t McuPCF85063A_SetDate(DATEREC *date); + +/*! + * \brief Get the current time and date from the RTC + * \param time Pointer where to store the time + * \param date Pointer where to store the date + * \return Error code, ERR_OK if no failure. + */ +uint8_t McuPCF85063A_GetTimeDate(TIMEREC *time, DATEREC *date); + +/*! + * \brief Set the RTC time information + * \param Hour The hour, in the range of 0-23 + * \param Min The minute, in the range of 0-59 + * \param Sec The second, in the range of 0-59 + * \praam Sec100 The 0.01 sec part, in the range of 0-99 + * \return Error code, ERR_OK if no failure. + */ +uint8_t McuPCF85063A_SetTimeInfo(uint8_t Hour, uint8_t Min, uint8_t Sec, uint8_t Sec100); + +/*! + * \brief set the RTC date information + * \param Year The year, for example 2024 + * \param Month The month, for example 11 + * \param Day The day of the month, in the range of 0-31, depending of the month + * \return Error code, ERR_OK if no failure. + */ +uint8_t McuPCF85063A_SetDateInfo(uint16_t Year, uint8_t Month, uint8_t Day); + +/*! \brief different RTC clock output frequencies */ +typedef enum McuPCF85063A_COF_Frequency_e { + McuPCF85063A_COF_FREQ_32768 = 0, + McuPCF85063A_COF_FREQ_16384 = 1, + McuPCF85063A_COF_FREQ_8192 = 2, + McuPCF85063A_COF_FREQ_4096 = 3, + McuPCF85063A_COF_FREQ_2048 = 4, + McuPCF85063A_COF_FREQ_1024 = 5, + McuPCF85063A_COF_FREQ_1 = 6, + McuPCF85063A_COF_FREQ_OFF = 7 +} McuPCF85063A_COF_Frequency_e; + +/*! + * \brief Configure a new clock output frequency + * \param Frequency Frequency to use + * \return Error code, ERR_OK if no failure. + */ +uint8_t McuPCF85063A_WriteClockOutputFrequency(McuPCF85063A_COF_Frequency_e frequency); + +/*! + * \brief Read the alarm second time value + * \param second Pointer to store the value + * \param enabled Returns if the alarm is enabled or not. + * \return Error code, ERR_OK if no failure. + */ +uint8_t McuPCF85063A_ReadAlarmSecond(uint8_t *second, bool *enabled); + +/*! + * \brief Write the Alarm second time value + * \param second Second time alarm value + * \param enabled true to enable the alarm, false otherwise + * \return Error code, ERR_OK if no failure. + */ +uint8_t McuPCF85063A_WriteAlarmSecond(uint8_t second, bool enable); + +/*! + * \brief Read the alarm minute value + * \param minute Where to store the minute value + * \param enabled Returns if the alarm is enabled or not. + * \return Error code, ERR_OK if no failure. + */ +uint8_t McuPCF85063A_ReadAlarmMinute(uint8_t *minute, bool *enabled); + +/*! + * \brief Write the alarm minute value + * \param minute Minute value to write + * \param enable If the alarm has to be enabled or not + * \return Error code, ERR_OK if no failure. + */ +uint8_t McuPCF85063A_WriteAlarmMinute(uint8_t minute, bool enable); + +/*! + * \brief Read the alarm hour value + * \param hour Where to store the alarm hour value + * \param enabled Returns if the alarm is enabled or not. + * \param is24h Returns true if the hour format is 24 hours, false otherwise + * \param isAM Returns true if the hour is an AM value, false otherwise + * \return Error code, ERR_OK if no failure. + */ +uint8_t McuPCF85063A_ReadAlarmHour(uint8_t *hour, bool *enabled, bool *is24h, bool *isAM); + +/*! + * \brief Write the alarm hour value + * \param hour Hour value + * \param enable If the alarm has to be enabled or not + * \param is24h true if hour value is for 24h format, false otherwise + * \param isAM true if hour value is AM, false otherwise + * \return Error code, ERR_OK if no failure. + */ +uint8_t McuPCF85063A_WriteAlarmHour(uint8_t hour, bool enable, bool is24h, bool isAM); + +/*! + * \brief Read the alarm day + * \param day Used to store the alarm day value + * \param enabled Returns if the alarm is enabled or not. + * \return Error code, ERR_OK if no failure. + */ +uint8_t McuPCF85063A_ReadAlarmDay(uint8_t *day, bool *enabled); + +/*! + * \brief Write the alarm day value + * \param day Day value for the alarm + * \param enable If the alarm has to be enabled or not + * \return Error code, ERR_OK if no failure. + */ +uint8_t McuPCF85063A_WriteAlarmDay(uint8_t day, bool enable); + +/*! + * \brief Read the alarm week day + * \param weekDay Used to store the day + * \param enabled Returns if the alarm is enabled or not. + * \return Error code, ERR_OK if no failure. + */ +uint8_t McuPCF85063A_ReadAlarmWeekDay(uint8_t *weekDay, bool *enabled); + +/*! + * \brief Write the alarm week day + * \param weekDay The day of week (0-6) + * \param enable If alarm is enabled + * \return Error code, ERR_OK if no failure. + */ +uint8_t McuPCF85063A_WriteAlarmWeekDay(uint8_t weekDay, bool enable); + +/*! + * \brief Perform a software reset + * \return Error code, ERR_OK if no failure. + */ +uint8_t McuPCF85063A_WriteSoftwareReset(void); + +/*! + * \brief Write the alarm interrupt flag setting + * \param enable Use true to enable it, false otherwise + * \return Error code, ERR_OK if no failure. + */ +uint8_t McuPCF85063A_WriteAlarmInterrupt(bool enable); + +/*! + * \brief Reset the alarm interrupt flag + * \return Error code, ERR_OK if no failure. + */ +uint8_t McuPCF85063A_WriteResetAlarmInterrupt(void); + + +/*! + * \brief Driver de-initialization. + */ +void McuPCF85063A_Deinit(void); + +/*! + * \brief Driver initialization. + */ +void McuPCF85063A_Init(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MCUPCF85063A_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuPidFloat.c b/TSM_PicoW_Sensor/McuLib/src/McuPidFloat.c new file mode 100644 index 0000000..2d2f008 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuPidFloat.c @@ -0,0 +1,186 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuPidFloat.h +** CDE edition : Community +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : PID_Float +** Version : Component 01.007, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-14, 06:24, # CodeGen: 679 +** Abstract : +** +** Settings : +** Contents : +** Control - void McuPidFloat_Control(float error, void* *u); +** Reset - void McuPidFloat_Reset(void); +** Set_K - void McuPidFloat_Set_K(float k); +** Set_Ti - void McuPidFloat_Set_Ti(float t); +** Set_Td - void McuPidFloat_Set_Td(float t); +** +** * (c) Copyright Carlos Alvarez, 2013-2020 +** * For non-commercial use only. +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** ###################################################################*/ +/*! +** @file McuPidFloat.h +** @version 01.00 +** @brief +** +*/ +/*! +** @addtogroup McuPidFloat_module McuPidFloat module documentation +** @{ +*/ + +/* MODULE McuPidFloat. */ + +#include "McuPidFloat.h" +#define K_VAL 0.1 /* Constante proporcional */ +#define TI_VAL 100 /* Tiempo integrativo */ +#define TD_VAL 0 /* Tiempo derivativo */ +#define T_VAL 0.01 /* Período de control */ +#define U_MIN 0 /* Valor de salida mínimo */ +#define U_MAX 65000 /* Valor de salida máximo */ +#define U_CHG_MAX 0 /* Cambio máximo en cada ciclo de control */ +/* Coeficientes del control PID */ +#define K1 (McuPidFloat_K*(1+(McuPidFloat_Td/T_VAL))) +#define K2 (-McuPidFloat_K*(1+((2*McuPidFloat_Td)/T_VAL)-(T_VAL/McuPidFloat_Ti))) +#define K3 (McuPidFloat_K*(McuPidFloat_Td/T_VAL)) + +/* Variable para la constante proporcional */ +static float McuPidFloat_K = K_VAL; +/* Variable para el tiempo integrativo */ +static float McuPidFloat_Ti = TI_VAL; +/* Variable para el tiempo derivativo */ +static float McuPidFloat_Td = TD_VAL; +/* Variable que almacena los errores */ +float McuPidFloat_error[2] = {0.0, 0.0}; + +/* +** =================================================================== +** Method : Set_Td (component PID_Float) +** +** Description : +** Change the Td parameter. +** Parameters : +** NAME - DESCRIPTION +** t - New Td value. +** Returns : Nothing +** =================================================================== +*/ +void McuPidFloat_Set_Td(float t) +{ + if(t < 0) { + return; + } + McuPidFloat_Td = t; +} + +/* +** =================================================================== +** Method : Set_Ti (component PID_Float) +** +** Description : +** Change the Ti parameter. +** Parameters : +** NAME - DESCRIPTION +** t - New Ti value. +** Returns : Nothing +** =================================================================== +*/ +void McuPidFloat_Set_Ti(float t) +{ + if (t <= 0) { + return; + } + McuPidFloat_Ti = t; +} + +/* +** =================================================================== +** Method : Set_K (component PID_Float) +** +** Description : +** Change the K parameter. +** Parameters : +** NAME - DESCRIPTION +** k - New K value. +** Returns : Nothing +** =================================================================== +*/ +void McuPidFloat_Set_K(float k) +{ + if(k < 0) { + return; + } + McuPidFloat_K = k; +} + +/* +** =================================================================== +** Method : Reset (component PID_Float) +** +** Description : +** Reset the PID. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuPidFloat_Reset(void) +{ + McuPidFloat_error[0] = 0.0; + McuPidFloat_error[1] = 0.0; +} + +/* +** =================================================================== +** Method : Control (component PID_Float) +** +** Description : +** Control function. Must be called every T time. +** Parameters : +** NAME - DESCRIPTION +** error - Error signal. (Reference - +** SystemOutput). +** * u - Pointer to the control variable. +** Returns : Nothing +** =================================================================== +*/ +#ifdef __HIWARE__ + #pragma MESSAGE DISABLE C5900 + #pragma MESSAGE DISABLE C5917 +#endif + +void McuPidFloat_Control(float error, uint16_t *u) +{ + float ut = 0.0; + + ut = (float) *u; + ut += K1 * error; + ut += K2 * McuPidFloat_error[0]; + ut += K3 * McuPidFloat_error[1]; + + McuPidFloat_error[1] = McuPidFloat_error[0]; + McuPidFloat_error[0] = error; + + if (ut > U_MAX) { + *u = (uint16_t) U_MAX; + } else if (ut < U_MIN) { + *u = (uint16_t) U_MIN; + } else { + *u = (uint16_t) ut; + } +} +#ifdef __HIWARE__ + #pragma MESSAGE DISABLE C5919 +#endif + +/* END McuPidFloat. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuPidFloat.h b/TSM_PicoW_Sensor/McuLib/src/McuPidFloat.h new file mode 100644 index 0000000..380d001 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuPidFloat.h @@ -0,0 +1,128 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuPidFloat.h +** CDE edition : Community +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : PID_Float +** Version : Component 01.007, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-14, 06:24, # CodeGen: 679 +** Abstract : +** +** Settings : +** Contents : +** Control - void McuPidFloat_Control(float error, void* *u); +** Reset - void McuPidFloat_Reset(void); +** Set_K - void McuPidFloat_Set_K(float k); +** Set_Ti - void McuPidFloat_Set_Ti(float t); +** Set_Td - void McuPidFloat_Set_Td(float t); +** +** * (c) Copyright Carlos Alvarez, 2013-2020 +** * For non-commercial use only. +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** ###################################################################*/ +/*! +** @file McuPidFloat.h +** @version 01.00 +** @brief +** +*/ +/*! +** @addtogroup McuPidFloat_module McuPidFloat module documentation +** @{ +*/ + +#ifndef __McuPidFloat_H +#define __McuPidFloat_H + +/* MODULE McuPidFloat. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuPidFloatconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + + + +void McuPidFloat_Set_Td(float t); +/* +** =================================================================== +** Method : Set_Td (component PID_Float) +** +** Description : +** Change the Td parameter. +** Parameters : +** NAME - DESCRIPTION +** t - New Td value. +** Returns : Nothing +** =================================================================== +*/ + +void McuPidFloat_Set_Ti(float t); +/* +** =================================================================== +** Method : Set_Ti (component PID_Float) +** +** Description : +** Change the Ti parameter. +** Parameters : +** NAME - DESCRIPTION +** t - New Ti value. +** Returns : Nothing +** =================================================================== +*/ + +void McuPidFloat_Set_K(float k); +/* +** =================================================================== +** Method : Set_K (component PID_Float) +** +** Description : +** Change the K parameter. +** Parameters : +** NAME - DESCRIPTION +** k - New K value. +** Returns : Nothing +** =================================================================== +*/ + +void McuPidFloat_Reset(void); +/* +** =================================================================== +** Method : Reset (component PID_Float) +** +** Description : +** Reset the PID. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuPidFloat_Control(float error, uint16_t *u); +/* +** =================================================================== +** Method : Control (component PID_Float) +** +** Description : +** Control function. Must be called every T time. +** Parameters : +** NAME - DESCRIPTION +** error - Error signal. (Reference - +** SystemOutput). +** * u - Pointer to the control variable. +** Returns : Nothing +** =================================================================== +*/ + +/* END McuPidFloat. */ + +#endif +/* ifndef __McuPidFloat_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuPidInt.c b/TSM_PicoW_Sensor/McuLib/src/McuPidInt.c new file mode 100644 index 0000000..b0ffbaf --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuPidInt.c @@ -0,0 +1,184 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuPidInt.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : PID_Int +** Version : Component 01.010, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-14, 06:24, # CodeGen: 679 +** Abstract : +** +** Settings : +** Component name : McuPidInt +** Variable for controller set point : no +** P - Proportional : Enabled +** constant : yes +** Kp Factor : 1 +** Kp Divisor : 8 +** I - Integral : Enabled +** constant : yes +** Ki Factor : 1 +** Ki Divisor : 512 +** Anti Wind-Up : Enabled +** constant : yes +** Value : 1024 +** D - Differential : Enabled +** constant : yes +** Kd Factor : 4 +** Kd Divisor : 1 +** Hardware : Disabled +** System : +** SDK : McuLib +** Contents : +** PID - int32_t McuPidInt_PID(int32_t setPoint, int32_t currValue); +** Control - void McuPidInt_Control(void); +** SetPoint - void McuPidInt_SetPoint(int32_t value); +** GetPoint - int32_t McuPidInt_GetPoint(void); +** +** * Copyright (c) 2012-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuPidInt.h +** @version 01.00 +** @brief +** +*/ +/*! +** @addtogroup McuPidInt_module McuPidInt module documentation +** @{ +*/ + +/* MODULE McuPidInt. */ + +#include "McuPidInt.h" + +static int McuPidInt_setPoint; /* the value to be reached by the PID algorithm */ +static const int32_t McuPidInt_KpMul = 1, McuPidInt_KpDiv = 8; /* the Kp adjustment values */ +static const int32_t McuPidInt_KiMul = 1, McuPidInt_KiDiv = 512; /* the Ki adjustment values */ +static const int32_t McuPidInt_KdMul = 4, McuPidInt_KdDiv = 1; /* the Kd adjustment values */ + +/* +** =================================================================== +** Method : PID (component PID_Int) +** +** Description : +** Performs PID calculation +** Parameters : +** NAME - DESCRIPTION +** setPoint - current setpoint (desired value) +** currValue - current sensor value +** Returns : +** --- - output of PID calculation +** =================================================================== +*/ +#ifdef __HIWARE__ + #pragma MESSAGE DISABLE C5904 /* Division by one */ + #pragma MESSAGE DISABLE C5905 /* Multiplication with one */ +#endif +int32_t McuPidInt_PID(int32_t setPoint, int32_t currValue) +{ + /* Performs a PID calculation */ + int32_t regDifferential; /* temporary variable for the D part */ + static int32_t oldDiff = 0; /*!< Remember error for next round (for D part) */ + static int32_t regIntegral = 0; /*!< Remember integral part for next iteration */ + int32_t diff; /* actual error */ + int32_t pid; /* pid calculation value */ + + pid = 0; /* initialize */ + diff = setPoint-currValue; + /* P-Part */ + pid += (McuPidInt_KpMul*diff)/McuPidInt_KpDiv; + /* I-Part */ + regIntegral += diff; /* integrate error */ + if (regIntegral > 1024) { /* anti wind-up */ + regIntegral = 1024; + } else if (regIntegral < -1024) { + regIntegral = -1024; + } + pid += (McuPidInt_KiMul*regIntegral)/McuPidInt_KiDiv; + /* D-Part */ + regDifferential = diff-oldDiff; + oldDiff = diff; /* remember for next iteration */ + pid += (McuPidInt_KdMul*regDifferential)/McuPidInt_KdDiv; /* add D part */ + return pid; +} + +/* +** =================================================================== +** Method : Control (component PID_Int) +** +** Description : +** Performs the PID control calculation. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuPidInt_Control(void) +{ + return; /* hardware for sensor and actuator not enabled: enable them in the properties or use the PID() function instead */ +} + +/* +** =================================================================== +** Method : SetPoint (component PID_Int) +** +** Description : +** Specifies the value to be reached by the PID controller. +** Parameters : +** NAME - DESCRIPTION +** value - The value to be reached. +** Returns : Nothing +** =================================================================== +*/ +void McuPidInt_SetPoint(int32_t value) +{ + McuPidInt_setPoint = value; +} + +/* +** =================================================================== +** Method : GetPoint (component PID_Int) +** +** Description : +** Returns the current set point value +** Parameters : None +** Returns : +** --- - The current set point +** =================================================================== +*/ +int32_t McuPidInt_GetPoint(void) +{ + return McuPidInt_setPoint; +} + +/* END McuPidInt. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuPidInt.h b/TSM_PicoW_Sensor/McuLib/src/McuPidInt.h new file mode 100644 index 0000000..7cf03dd --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuPidInt.h @@ -0,0 +1,151 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuPidInt.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : PID_Int +** Version : Component 01.010, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-14, 06:24, # CodeGen: 679 +** Abstract : +** +** Settings : +** Component name : McuPidInt +** Variable for controller set point : no +** P - Proportional : Enabled +** constant : yes +** Kp Factor : 1 +** Kp Divisor : 8 +** I - Integral : Enabled +** constant : yes +** Ki Factor : 1 +** Ki Divisor : 512 +** Anti Wind-Up : Enabled +** constant : yes +** Value : 1024 +** D - Differential : Enabled +** constant : yes +** Kd Factor : 4 +** Kd Divisor : 1 +** Hardware : Disabled +** System : +** SDK : McuLib +** Contents : +** PID - int32_t McuPidInt_PID(int32_t setPoint, int32_t currValue); +** Control - void McuPidInt_Control(void); +** SetPoint - void McuPidInt_SetPoint(int32_t value); +** GetPoint - int32_t McuPidInt_GetPoint(void); +** +** * Copyright (c) 2012-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuPidInt.h +** @version 01.00 +** @brief +** +*/ +/*! +** @addtogroup McuPidInt_module McuPidInt module documentation +** @{ +*/ + +#ifndef __McuPidInt_H +#define __McuPidInt_H + +/* MODULE McuPidInt. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuPidIntconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" + + + + +void McuPidInt_Control(void); +/* +** =================================================================== +** Method : Control (component PID_Int) +** +** Description : +** Performs the PID control calculation. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuPidInt_SetPoint(int32_t value); +/* +** =================================================================== +** Method : SetPoint (component PID_Int) +** +** Description : +** Specifies the value to be reached by the PID controller. +** Parameters : +** NAME - DESCRIPTION +** value - The value to be reached. +** Returns : Nothing +** =================================================================== +*/ + +int32_t McuPidInt_GetPoint(void); +/* +** =================================================================== +** Method : GetPoint (component PID_Int) +** +** Description : +** Returns the current set point value +** Parameters : None +** Returns : +** --- - The current set point +** =================================================================== +*/ + +int32_t McuPidInt_PID(int32_t setPoint, int32_t currValue); +/* +** =================================================================== +** Method : PID (component PID_Int) +** +** Description : +** Performs PID calculation +** Parameters : +** NAME - DESCRIPTION +** setPoint - current setpoint (desired value) +** currValue - current sensor value +** Returns : +** --- - output of PID calculation +** =================================================================== +*/ + +/* END McuPidInt. */ + +#endif +/* ifndef __McuPidInt_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuQuadCounter.c b/TSM_PicoW_Sensor/McuLib/src/McuQuadCounter.c new file mode 100644 index 0000000..69964e7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuQuadCounter.c @@ -0,0 +1,487 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuQuadCounter.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : QuadCounter +** Version : Component 01.034, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-12-02, 11:59, # CodeGen: 723 +** Abstract : +** +This driver implements a quadrature encoder using two signals (C1 and C2) to generate position information. +** Settings : +** Component name : McuQuadCounter +** C1 and C2 swapped : no +** Counter Type : 32bit +** Method : +** Sampling : Enabled +** Error Correction : no +** C1 : SDK_BitIO +** C2 : SDK_BitIO +** Input Capture : Disabled +** Shell : Enabled +** Shell : McuShell +** Utility : McuUtility +** Contents : +** GetPos - McuQuadCounter_QuadCntrType McuQuadCounter_GetPos(void); +** SetPos - void McuQuadCounter_SetPos(McuQuadCounter_QuadCntrType pos); +** GetVal - uint8_t McuQuadCounter_GetVal(void); +** Sample - void McuQuadCounter_Sample(void); +** NofErrors - uint16_t McuQuadCounter_NofErrors(void); +** SwapPins - uint8_t McuQuadCounter_SwapPins(bool swap); +** Deinit - void McuQuadCounter_Deinit(void); +** Init - void McuQuadCounter_Init(void); +** ParseCommand - uint8_t McuQuadCounter_ParseCommand(const unsigned char *cmd, bool *handled,... +** +** * Copyright (c) 2014-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuQuadCounter.h +** @version 01.00 +** @brief +** +This driver implements a quadrature encoder using two signals (C1 and C2) to generate position information. +*/ +/*! +** @addtogroup McuQuadCounter_module McuQuadCounter module documentation +** @{ +*/ + +/* MODULE McuQuadCounter. */ + +#include "McuQuadCounter.h" + +#if McuQuadCounter_SWAP_PINS_AT_RUNTIME + static bool McuQuadCounter_swappedPins = FALSE; +#endif + +/* The decoder has 4 different states, together with the previous state the table has 16 entries. + The value in the table (0,1,-1) indicates the steps taken since previous sample. */ +#define QUAD_ERROR 3 /*!< Value to indicate an error in impulse detection. Has to be different from 0,1,-1 */ + +#if McuQuadCounter_CONFIG_USE_ERROR_CORRECTION +static uint8_t McuQuadCounter_prevlast_quadrature_value; /*! Value of C1&C2 before last_quadrature_value. */ + +static const signed char McuQuadCounter_Quad_Table[4][4][4] = + { /* pprev prev new */ + { /* c12 c12 c12, c1 leading is backward, c2 leading is forward */ + { + 0, /* 00 00 00 no change or missed a step? */ + 1, /* 00 00 01 */ + -1, /* 00 00 10 */ + QUAD_ERROR, /* 00 00 11 error, lost impulse */ + }, + { + -1, /* 00 01 00 */ + 0, /* 00 01 01 */ + 2, /* 00 01 10 lost impulse, correct error */ + 1, /* 00 01 11 */ + }, + { + 1, /* 00 10 00 */ + -2, /* 00 10 01 lost impulse, correct error */ + 0, /* 00 10 10 */ + -1, /* 00 10 11 */ + }, + { + QUAD_ERROR, /* 00 11 00 error */ + -1, /* 00 11 01 lost impulse, correct error */ + 1, /* 00 11 10 */ + 0, /* 00 11 11 */ + } + }, + { /* c12 c12 c12 */ + { + 0, /* 01 00 00 */ + 1, /* 01 00 01 */ + -1, /* 01 00 10 */ + -2, /* 01 00 11 lost impulse, correct error */ + }, + { + -1, /* 01 01 00 */ + 0, /* 01 01 01 */ + QUAD_ERROR, /* 01 01 10 error */ + 1, /* 01 01 11 */ + }, + { + 1, /* 01 10 00 */ + QUAD_ERROR, /* 01 10 01 error */ + 0, /* 01 10 10 */ + -1, /* 01 10 11 */ + }, + { + 2, /* 01 11 00 lost impulse, correct error */ + -1, /* 01 11 01 */ + 1, /* 01 11 10 */ + 0, /* 01 11 11 */ + } + }, + { /* c12 c12 c12 */ + { + 0, /* 10 00 00 */ + 1, /* 10 00 01 */ + -1, /* 10 00 10 */ + 2, /* 10 00 11 lost impulse, correct error */ + }, + { + -1, /* 10 01 00 */ + 0, /* 10 01 01 */ + QUAD_ERROR, /* 10 01 10 error */ + 1, /* 10 01 11 */ + }, + { + 1, /* 10 10 00 */ + QUAD_ERROR, /* 10 10 01 error */ + 0, /* 10 10 10 */ + -1, /* 10 10 11 */ + }, + { + -2, /* 10 11 00 lost impulse, correct error */ + -1, /* 10 11 01 */ + 1, /* 10 11 10 */ + 0, /* 10 11 11 */ + } + }, + { /* c12 c12 c12 */ + { + 0, /* 11 00 00 */ + 1, /* 11 00 01 */ + -1, /* 11 00 10 */ + QUAD_ERROR, /* 11 00 11 error */ + }, + { + -1, /* 11 01 00 */ + 0, /* 11 01 01 */ + -2, /* 11 01 10 lost impulse, correct error */ + 1, /* 11 01 11 */ + }, + { + 1, /* 11 10 00 */ + 2, /* 11 10 01 lost impulse, correct error */ + 0, /* 11 10 10 */ + -1, /* 11 10 11 */ + }, + { + QUAD_ERROR, /* 11 11 00 error */ + -1, /* 11 11 01 */ + 1, /* 11 11 10 */ + 0, /* 11 11 11 */ + } + } + }; +#else +static const signed char McuQuadCounter_Quad_Table[4][4] = + { /* prev new */ + { /* c1 c2 c1 c2 */ + 0, /* 0 0 0 0 no change or missed a step? */ + 1, /* 0 0 0 1 */ + -1, /* 0 0 1 0 */ + QUAD_ERROR /* 0 0 1 1 error, lost impulse */ + }, + { /* c1 c2 c1 c2 */ + -1, /* 0 1 0 0 */ + 0, /* 0 1 0 1 no change or missed a step? */ + QUAD_ERROR, /* 0 1 1 0 error, lost impulse */ + 1 /* 0 1 1 1 */ + }, + { /* c1 c2 c1 c2 */ + 1, /* 1 0 0 0 */ + QUAD_ERROR, /* 1 0 0 1 error, lost impulse */ + 0, /* 1 0 1 0 no change or missed a step? */ + -1 /* 1 0 1 1 */ + }, + { /* c1 c2 c1 c2 */ + QUAD_ERROR, /* 1 1 0 0 error, lost impulse */ + -1, /* 1 1 0 1 */ + 1, /* 1 1 1 0 */ + 0 /* 1 1 1 1 no change or missed a step? */ + } + }; +#endif /* McuQuadCounter_CONFIG_USE_ERROR_CORRECTION */ + +static uint8_t McuQuadCounter_last_quadrature_value; /*! Value of C1&C2 during last round. */ + +static McuQuadCounter_QuadCntrType McuQuadCounter_currPos = 0; /*!< Current position */ +#if McuQuadCounter_CONFIG_COUNT_ERRORS + static uint16_t McuQuadCounter_nofErrors = 0; +#endif + +/* +** =================================================================== +** Method : SetPos (component QuadCounter) +** +** Description : +** Sets the position information. Can be used as well to reset +** the position information. +** Parameters : +** NAME - DESCRIPTION +** pos - Position value to be set. +** Returns : Nothing +** =================================================================== +*/ +void McuQuadCounter_SetPos(McuQuadCounter_QuadCntrType pos) +{ + McuQuadCounter_currPos = pos; +} + +/* +** =================================================================== +** Method : GetPos (component QuadCounter) +** +** Description : +** Returns the current position based on the encoder tracking. +** Parameters : None +** Returns : +** --- - position +** =================================================================== +*/ +McuQuadCounter_QuadCntrType McuQuadCounter_GetPos(void) +{ + return McuQuadCounter_currPos; +} + +/* +** =================================================================== +** Method : GetVal (component QuadCounter) +** +** Description : +** Returns the quadrature value (0, 1, 2 or 3) +** Parameters : None +** Returns : +** --- - Quadrature value (0-3) +** =================================================================== +*/ +uint8_t McuQuadCounter_GetVal(void) +{ +#if McuQuadCounter_SWAP_PINS_AT_RUNTIME + if (McuQuadCounter_swappedPins) { + return McuQuadCounter_GET_C1_C2_PINS_SWAPPED(); + } else { + return McuQuadCounter_GET_C1_C2_PINS(); + } +#else + return McuQuadCounter_GET_C1_C2_PINS(); +#endif +} + +/* +** =================================================================== +** Method : Sample (component QuadCounter) +** +** Description : +** Call this method to periodically sample the signals. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuQuadCounter_Sample(void) +{ + signed char new_step; + uint8_t c12; /* value of the two sensor input */ + + c12 = McuQuadCounter_GetVal(); +#if McuQuadCounter_CONFIG_USE_ERROR_CORRECTION + new_step = McuQuadCounter_Quad_Table[McuQuadCounter_prevlast_quadrature_value][McuQuadCounter_last_quadrature_value][c12]; + McuQuadCounter_prevlast_quadrature_value = McuQuadCounter_last_quadrature_value; +#else + new_step = McuQuadCounter_Quad_Table[McuQuadCounter_last_quadrature_value][c12]; +#endif + McuQuadCounter_last_quadrature_value = c12; + if (new_step == QUAD_ERROR) { +#if McuQuadCounter_CONFIG_COUNT_ERRORS + McuQuadCounter_nofErrors++; +#endif + } else if (new_step != 0) { + McuQuadCounter_currPos += new_step; + } +} + +/* +** =================================================================== +** Method : NofErrors (component QuadCounter) +** +** Description : +** Returns the number of decoding errors +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +uint16_t McuQuadCounter_NofErrors(void) +{ +#if McuQuadCounter_CONFIG_COUNT_ERRORS + return McuQuadCounter_nofErrors; +#else + return 0; +#endif +} + +/* +** =================================================================== +** Method : Deinit (component QuadCounter) +** +** Description : +** Module de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuQuadCounter_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component QuadCounter) +** +** Description : +** Module initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuQuadCounter_Init(void) +{ + McuQuadCounter_currPos = 0; + McuQuadCounter_last_quadrature_value = McuQuadCounter_GET_C1_C2_PINS(); +#if McuQuadCounter_CONFIG_USE_ERROR_CORRECTION + McuQuadCounter_prevlast_quadrature_value = McuQuadCounter_last_quadrature_value; +#endif +#if McuQuadCounter_CONFIG_COUNT_ERRORS + McuQuadCounter_nofErrors = 0; +#endif +#if McuQuadCounter_SWAP_PINS_AT_RUNTIME + McuQuadCounter_swappedPins = FALSE; +#endif +} + +/* +** =================================================================== +** Method : ParseCommand (component QuadCounter) +** +** Description : +** Handler to process shell commands +** Parameters : +** NAME - DESCRIPTION +** cmd - Command string to be parsed +** * handled - Pointer to boolean. The handler +** sets this variable to TRUE if command was +** handled, otherwise let it untouched. +** io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ +/*! + * \brief Parses a command + * \param cmd Command string to be parsed + * \param handled Sets this variable to TRUE if command was handled + * \param io I/O stream to be used for input/output + * \return Error code, ERR_OK if everything was fine + */ +uint8_t McuQuadCounter_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) +{ + uint8_t res=ERR_OK; + + if (McuUtility_strcmp((const char*)cmd, McuShell_CMD_HELP)==0 || McuUtility_strcmp((const char *)cmd, "McuQuadCounter help")==0) { + McuShell_SendHelpStr((const unsigned char*)"McuQuadCounter", (const unsigned char*)"McuQuadCounter command group\r\n", io->stdOut); + McuShell_SendHelpStr((const unsigned char*)" help|status", (const unsigned char*)"Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((const unsigned char*)" reset", (const unsigned char*)"Reset the current position counter\r\n", io->stdOut); + *handled = TRUE; + } else if (McuUtility_strcmp((const char*)cmd, McuShell_CMD_STATUS)==0 || McuUtility_strcmp((const char*)cmd, "McuQuadCounter status")==0) { + McuShell_SendStr((const unsigned char*)"McuQuadCounter:\r\n", io->stdOut); + McuShell_SendStatusStr((const unsigned char*)" pos", (const unsigned char*)"", io->stdOut); + #if McuQuadCounter_CNTR_BITS==16 + McuShell_SendNum16u(McuQuadCounter_currPos, io->stdOut); + #elif McuQuadCounter_CNTR_BITS==32 + McuShell_SendNum32u(McuQuadCounter_currPos, io->stdOut); + #else + #error "unknown counter size!" + #endif + McuShell_SendStr((const unsigned char*)", ", io->stdOut); + #if McuQuadCounter_CNTR_BITS==16 + McuShell_SendNum16s((int16_t)McuQuadCounter_currPos, io->stdOut); + #elif McuQuadCounter_CNTR_BITS==32 + McuShell_SendNum32s((int32_t)McuQuadCounter_currPos, io->stdOut); + #else + #error "unknown counter size!" + #endif + McuShell_SendStr((const unsigned char*)"\r\n", io->stdOut); + McuShell_SendStatusStr((const unsigned char*)" C1 C2", (const unsigned char*)"", io->stdOut); + if (McuQuadCounter_GET_C1_PIN()!=0) { + McuShell_SendStr((const unsigned char*)"1 ", io->stdOut); + } else { + McuShell_SendStr((const unsigned char*)"0 ", io->stdOut); + } + if (McuQuadCounter_GET_C2_PIN()!=0) { + McuShell_SendStr((const unsigned char*)"1\r\n", io->stdOut); + } else { + McuShell_SendStr((const unsigned char*)"0\r\n", io->stdOut); + } + #if McuQuadCounter_CONFIG_COUNT_ERRORS + McuShell_SendStatusStr((const unsigned char*)" errors", (const unsigned char*)"", io->stdOut); + McuShell_SendNum16u(McuQuadCounter_nofErrors, io->stdOut); + McuShell_SendStr((const unsigned char*)"\r\n", io->stdOut); + #endif + *handled = TRUE; + } else if (McuUtility_strcmp((const char*)cmd, "McuQuadCounter reset")==0) { + McuQuadCounter_SetPos(0); + #if McuQuadCounter_CONFIG_COUNT_ERRORS + McuQuadCounter_nofErrors = 0; + #endif + *handled = TRUE; + } + return res; +} + +/* +** =================================================================== +** Method : SwapPins (component QuadCounter) +** +** Description : +** Swap the two pins +** Parameters : +** NAME - DESCRIPTION +** swap - if C1 and C2 pins shall be swapped. +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuQuadCounter_SwapPins(bool swap) +{ + McuQuadCounter_swappedPins = swap; + return ERR_OK; +} + +/* END McuQuadCounter. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuQuadCounter.h b/TSM_PicoW_Sensor/McuLib/src/McuQuadCounter.h new file mode 100644 index 0000000..5ab5d3a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuQuadCounter.h @@ -0,0 +1,240 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuQuadCounter.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : QuadCounter +** Version : Component 01.034, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-12-02, 10:47, # CodeGen: 721 +** Abstract : +** +This driver implements a quadrature encoder using two signals (C1 and C2) to generate position information. +** Settings : +** Component name : McuQuadCounter +** C1 and C2 swapped : no +** Counter Type : 32bit +** Method : +** Sampling : Enabled +** Error Correction : no +** C1 : SDK_BitIO +** C2 : SDK_BitIO +** Input Capture : Disabled +** Shell : Enabled +** Shell : McuShell +** Utility : McuUtility +** Contents : +** GetPos - McuQuadCounter_QuadCntrType McuQuadCounter_GetPos(void); +** SetPos - void McuQuadCounter_SetPos(McuQuadCounter_QuadCntrType pos); +** GetVal - uint8_t McuQuadCounter_GetVal(void); +** Sample - void McuQuadCounter_Sample(void); +** NofErrors - uint16_t McuQuadCounter_NofErrors(void); +** SwapPins - uint8_t McuQuadCounter_SwapPins(bool swap); +** Deinit - void McuQuadCounter_Deinit(void); +** Init - void McuQuadCounter_Init(void); +** ParseCommand - uint8_t McuQuadCounter_ParseCommand(const unsigned char *cmd, bool *handled,... +** +** * Copyright (c) 2014-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuQuadCounter.h +** @version 01.00 +** @brief +** +This driver implements a quadrature encoder using two signals (C1 and C2) to generate position information. +*/ +/*! +** @addtogroup McuQuadCounter_module McuQuadCounter module documentation +** @{ +*/ + +#ifndef __McuQuadCounter_H +#define __McuQuadCounter_H + +/* MODULE McuQuadCounter. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuQuadCounterconfig.h" /* configuration */ + +/* Include inherited components */ +#include "C11.h" +#include "C21.h" +#include "McuShell.h" +#include "McuUtility.h" +#include "McuLib.h" + + +#define McuQuadCounter_SWAP_PINS 0 /* 1: C1 and C2 are swapped */ +#define McuQuadCounter_SWAP_PINS_AT_RUNTIME 1 /* 1: C1 and C2 are swapped at runtime, if SwapPins() method is available */ +#define McuQuadCounter_GET_C1_PIN() (C11_GetVal()) +#define McuQuadCounter_GET_C2_PIN() (C21_GetVal()) +#if McuQuadCounter_SWAP_PINS + #define McuQuadCounter_GET_C1_C2_PINS() ((McuQuadCounter_GET_C2_PIN()!=0?2:0)|(McuQuadCounter_GET_C1_PIN()!=0?1:0)) + #define McuQuadCounter_GET_C1_C2_PINS_SWAPPED() ((McuQuadCounter_GET_C1_PIN()!=0?2:0)|(McuQuadCounter_GET_C2_PIN()!=0?1:0)) +#else + #define McuQuadCounter_GET_C1_C2_PINS() ((McuQuadCounter_GET_C1_PIN()!=0?2:0)|(McuQuadCounter_GET_C2_PIN()!=0?1:0)) + #define McuQuadCounter_GET_C1_C2_PINS_SWAPPED() ((McuQuadCounter_GET_C2_PIN()!=0?2:0)|(McuQuadCounter_GET_C1_PIN()!=0?1:0)) +#endif + +typedef uint32_t McuQuadCounter_QuadCntrType; +#define McuQuadCounter_CNTR_BITS 32 + /*!< Number of bits in counter */ + +#define McuQuadCounter_PARSE_COMMAND_ENABLED 1 /* set to 1 if method ParseCommand() is present, 0 otherwise */ + + +void McuQuadCounter_SetPos(McuQuadCounter_QuadCntrType pos); +/* +** =================================================================== +** Method : SetPos (component QuadCounter) +** +** Description : +** Sets the position information. Can be used as well to reset +** the position information. +** Parameters : +** NAME - DESCRIPTION +** pos - Position value to be set. +** Returns : Nothing +** =================================================================== +*/ + +McuQuadCounter_QuadCntrType McuQuadCounter_GetPos(void); +/* +** =================================================================== +** Method : GetPos (component QuadCounter) +** +** Description : +** Returns the current position based on the encoder tracking. +** Parameters : None +** Returns : +** --- - position +** =================================================================== +*/ + +void McuQuadCounter_Sample(void); +/* +** =================================================================== +** Method : Sample (component QuadCounter) +** +** Description : +** Call this method to periodically sample the signals. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +uint16_t McuQuadCounter_NofErrors(void); +/* +** =================================================================== +** Method : NofErrors (component QuadCounter) +** +** Description : +** Returns the number of decoding errors +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuQuadCounter_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component QuadCounter) +** +** Description : +** Module de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuQuadCounter_Init(void); +/* +** =================================================================== +** Method : Init (component QuadCounter) +** +** Description : +** Module initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuQuadCounter_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : ParseCommand (component QuadCounter) +** +** Description : +** Handler to process shell commands +** Parameters : +** NAME - DESCRIPTION +** cmd - Command string to be parsed +** * handled - Pointer to boolean. The handler +** sets this variable to TRUE if command was +** handled, otherwise let it untouched. +** io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuQuadCounter_GetVal(void); +/* +** =================================================================== +** Method : GetVal (component QuadCounter) +** +** Description : +** Returns the quadrature value (0, 1, 2 or 3) +** Parameters : None +** Returns : +** --- - Quadrature value (0-3) +** =================================================================== +*/ + +uint8_t McuQuadCounter_SwapPins(bool swap); +/* +** =================================================================== +** Method : SwapPins (component QuadCounter) +** +** Description : +** Swap the two pins +** Parameters : +** NAME - DESCRIPTION +** swap - if C1 and C2 pins shall be swapped. +** Returns : +** --- - Error code +** =================================================================== +*/ + +/* END McuQuadCounter. */ + +#endif +/* ifndef __McuQuadCounter_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuRB.c b/TSM_PicoW_Sensor/McuLib/src/McuRB.c new file mode 100644 index 0000000..1339676 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuRB.c @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2019, Erich Styger + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuRBconfig.h" +#include "McuRB.h" +#include /* for memcpy() */ +#include /* for malloc() */ +#include +#include "McuCriticalSection.h" +#if MCURB_CONFIG_USE_FREERTOS_HEAP + #include "McuRTOS.h" +#endif + +/* default configuration, used for initializing the config */ +static const McuRB_Config_t defaultConfig = +{ + .nofElements = 32, + .elementSize = 1, +}; + +typedef struct { + size_t maxElements; + size_t elementSize; + size_t inSize; + size_t inIdx; + size_t outIdx; + void *data; +} McuRB_t; + +void McuRB_GetDefaultconfig(McuRB_Config_t *config) { + assert(config!=NULL); + McuCriticalSection_CriticalVariable() + + McuCriticalSection_EnterCritical(); + memcpy(config, &defaultConfig, sizeof(*config)); + McuCriticalSection_ExitCritical(); +} + +McuRB_Handle_t McuRB_InitRB(McuRB_Config_t *config) { + McuRB_t *handle; + + assert(config!=NULL); +#if MCURB_CONFIG_USE_FREERTOS_HEAP + handle = (McuRB_t*)pvPortMalloc(sizeof(McuRB_t)); /* get a new device descriptor */ +#else + handle = malloc(sizeof(McuRB_t)); /* get a new descriptor */ +#endif + assert(handle!=NULL); + if (handle!=NULL) { /* if malloc failed, will return NULL pointer */ + memset(handle, 0, sizeof(McuRB_t)); /* init all fields */ + handle->elementSize = config->elementSize; + handle->maxElements = config->nofElements; +#if MCURB_CONFIG_USE_FREERTOS_HEAP + handle->data = pvPortMalloc(handle->maxElements*handle->elementSize); +#else + handle->data = malloc(handle->maxElements*handle->elementSize); +#endif + assert(handle->data!=NULL); + } + return handle; +} + +McuRB_Handle_t McuRB_DeinitRB(McuRB_Handle_t rb) { + assert(rb!=NULL); + McuRB_t *handle = (McuRB_t*)rb; + assert(handle->data!=NULL); +#if MCURB_CONFIG_USE_FREERTOS_HEAP + vPortFree(handle->data); +#else + free(handle->data); +#endif + handle->data = NULL; +#if MCURB_CONFIG_USE_FREERTOS_HEAP + vPortFree(rb); +#else + free(rb); +#endif + return NULL; +} + +size_t McuRB_NofElements(McuRB_Handle_t rb) { + McuRB_t *handle = (McuRB_t*)rb; + + assert(rb!=NULL); + return handle->inSize; +} + +size_t McuRB_NofFreeElements(McuRB_Handle_t rb) { + McuRB_t *handle = (McuRB_t*)rb; + + assert(rb!=NULL); + return handle->maxElements-handle->inSize; +} + +void McuRB_Clear(McuRB_Handle_t rb) { + McuCriticalSection_CriticalVariable() + McuRB_t *handle = (McuRB_t*)rb; + + assert(rb!=NULL); + McuCriticalSection_EnterCritical(); + handle->inIdx = 0; + handle->outIdx = 0; + handle->inSize = 0; + McuCriticalSection_ExitCritical(); +} + +uint8_t McuRB_Put(McuRB_Handle_t rb, void *data) { + McuRB_t *handle = (McuRB_t*)rb; + int res = ERR_OK; + McuCriticalSection_CriticalVariable() + + assert(rb!=NULL && data!=NULL); + McuCriticalSection_EnterCritical(); + if (handle->inSize==handle->maxElements) { + res = ERR_OVERFLOW; /* full */ + } else { + memcpy(((uint8_t*)handle->data) + handle->inIdx*handle->elementSize, data, handle->elementSize); + handle->inIdx++; + if (handle->inIdx==handle->maxElements) { + handle->inIdx = 0; + } + handle->inSize++; + } + McuCriticalSection_ExitCritical(); + return res; +} + +uint8_t McuRB_Putn(McuRB_Handle_t rb, void *data, size_t nof) { + McuRB_t *handle = (McuRB_t*)rb; + uint8_t res = ERR_OK; + uint8_t *p = (uint8_t*)data; + + while(nof>0) { + res = McuRB_Put(rb, p); + if (res!=ERR_OK) { + break; + } + p += handle->elementSize; + nof--; + } + return res; +} + +uint8_t McuRB_Get(McuRB_Handle_t rb, void *data) { + McuCriticalSection_CriticalVariable() + McuRB_t *handle = (McuRB_t*)rb; + int res = ERR_OK; + + assert(rb!=NULL && data!=NULL); + if (handle->inSize==0) { + res = ERR_NOTAVAIL; /* empty */ + } else { + memcpy(data, ((uint8_t*)handle->data) + handle->outIdx*handle->elementSize, handle->elementSize); + McuCriticalSection_EnterCritical(); + handle->inSize--; + handle->outIdx++; + if (handle->outIdx==handle->maxElements) { + handle->outIdx = 0; + } + McuCriticalSection_ExitCritical(); + } + return res; +} + +uint8_t McuRB_Peek(McuRB_Handle_t rb, size_t index, void *data) { + uint8_t res = ERR_OK; + int idx; /* index inside ring buffer */ + McuRB_t *handle = (McuRB_t*)rb; + unsigned char *p; + McuCriticalSection_CriticalVariable() + + McuCriticalSection_EnterCritical(); + if (index>=handle->maxElements) { + res = ERR_OVERFLOW; /* asking for an element outside of ring buffer size */ + } else if (indexinSize) { + idx = (handle->outIdx+index)%handle->maxElements; + p = (unsigned char*)handle->data + idx*handle->elementSize; + memcpy(data, p, handle->elementSize); + } else { /* asking for an element which does not exist */ + res = ERR_RXEMPTY; + } + McuCriticalSection_ExitCritical(); + return res; +} + +uint8_t McuRB_Compare(McuRB_Handle_t rb, size_t index, void *data, size_t nof) { + McuRB_t *handle = (McuRB_t*)rb; + uint8_t cmpResult = 0; + uint8_t res; + uint8_t val[handle->elementSize]; /* caution: dynamic array! */ + unsigned char *p = data; + + while(nof>0) { + res = McuRB_Peek(rb, index, &val); + if (res!=ERR_OK) { /* general failure? */ + cmpResult = (uint8_t)-1; /* no match */ + break; + } + if (memcmp(&val[0], p, handle->elementSize)!=0) { /* mismatch */ + cmpResult = (uint8_t)-1; /* no match */ + break; + } + p += handle->elementSize; + index++; + nof--; + } + return cmpResult; +} + +void McuRB_Deinit(void) { + /* nothing to do */ +} + +void McuRB_Init(void) { + /* nothing to do */ +} diff --git a/TSM_PicoW_Sensor/McuLib/src/McuRB.h b/TSM_PicoW_Sensor/McuLib/src/McuRB.h new file mode 100644 index 0000000..a7e25f3 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuRB.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2019, Erich Styger + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MCURINGBUFFER_H_ +#define MCURINGBUFFER_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include "McuRBconfig.h" + +typedef void *McuRB_Handle_t; /* handle to be used in API */ + +typedef struct { + size_t nofElements; /* max number of elements in buffer */ + size_t elementSize; /* size of element in bytes */ +} McuRB_Config_t; + +/* return number of elements in ring buffer */ +size_t McuRB_NofElements(McuRB_Handle_t rb); + +/* return number of free elements in ring buffer */ +size_t McuRB_NofFreeElements(McuRB_Handle_t rb); + +/* put an element into the ring buffer. Returns ERR_OK if OK. */ +uint8_t McuRB_Put(McuRB_Handle_t rb, void *data); + +/* put a number of elements into the buffer */ +uint8_t McuRB_Putn(McuRB_Handle_t rb, void *data, size_t nof); + +/* clear the ring buffer */ +void McuRB_Clear(McuRB_Handle_t rb); + +/* get an element from the ring buffer. Returns ERR_OK if OKy. */ +uint8_t McuRB_Get(McuRB_Handle_t rb, void *data); + +/* peek an element of the ring buffer without removing it */ +uint8_t McuRB_Peek(McuRB_Handle_t rb, size_t index, void *data); + +/* compare elements in the ring buffer with data. Returns 0 if the data is the same, -1 otherwise */ +uint8_t McuRB_Compare(McuRB_Handle_t rb, size_t index, void *data, size_t nof); + +/* return a default ring buffer configuration */ +void McuRB_GetDefaultconfig(McuRB_Config_t *config); + +/* initialize a new ring buffer and return a handle for it */ +McuRB_Handle_t McuRB_InitRB(McuRB_Config_t *config); + +/* de-initialize a ring buffer */ +McuRB_Handle_t McuRB_DeinitRB(McuRB_Handle_t rb); + +/* de-initialize the module */ +void McuRB_Deinit(void); + +/* initialize the module */ +void McuRB_Init(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MCURINGBUFFER_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuRTOS.c b/TSM_PicoW_Sensor/McuLib/src/McuRTOS.c new file mode 100644 index 0000000..c23c83a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuRTOS.c @@ -0,0 +1,5482 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuRTOS.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : FreeRTOS +** Version : Component 01.586, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 14:57, # CodeGen: 841 +** Abstract : +** This component implements the FreeRTOS Realtime Operating System +** Settings : +** Component name : McuRTOS +** RTOS Version : V11.0.0 +** SDK : McuLib +** Kinetis SDK : Disabled +** Custom Port : Custom port settings +** Compiler : automatic +** Source Folders : Enabled +** Source Folder : FreeRTOS/Source +** Header Folder : FreeRTOS/Source/include +** Port Folder : FreeRTOS/Source/portable/GCC/ARM_CM4F +** MemMang Folder : FreeRTOS/Source/portable/MemMang +** Common Folder : FreeRTOS/Source/portable/Common +** Config Folder : config +** Manual Clock Values : Enabled +** configCPU_CLOCK_HZ : CPU_CORE_CLK_HZ +** configBUS_CLOCK_HZ : CPU_BUS_CLK_HZ +** Custom portBASE_TYPE : Disabled +** Classic CodeWarrior : no +** Disabled Interrupts in Startup : yes +** configASSERT : yes +** Application Task Tags : no +** Thread Local Storage Pointers : 0 +** Use Trace Facility : yes +** Debug Helpers : +** Enable GDB Debug Helper : no +** uxTopUsedPriority : yes +** Heap Indication Constant : yes +** Segger System Viewer Trace : Disabled +** Percepio Trace : Disabled +** Generate Runtime Statistics : Enabled +** Use Tick Counter : yes +** LDD : Disabled +** non-LDD : Disabled +** Scheduler : Settings for the scheduler +** ColdFire V1 : Disabled +** ColdFire V2 : Disabled +** ARM (Kinetis) : Enabled +** ARM Family : Cortex-M4F +** Max SysCall Interrupt Priority : 5 +** RTOS Interrupt Priority : 15 +** Lowest Interrupt Priority : 15 +** Compiler Optimization Level : 0 +** MPU : no +** SysTick : Enabled +** Core Clock : yes +** Low Power Timer : Disabled +** non-LDD SWI : Disabled +** Preemptive : yes +** Optimized Task Selection : no +** Time Slicing : yes +** Use Co-Routines : no +** Idle should yield : yes +** Task Name Length : 12 +** Minimal Stack Size : 200 +** Record Stack High Address : yes +** Maximum Priorities : 6 +** Maximum Coroutine Priorities : 2 +** Stackoverflow checking method : Method 1 +** Cleanup Resources : yes +** TaskExitError Handler : no +** Ticks : Settings for the periodic tick timer +** Tickless Idle Mode : Disabled +** Tick Rate (Hz) : 1000 +** Use 16bit ticks : no +** non-LDD Tick : Disabled +** LDD Tick : Disabled +** Queues : Settings for Queues +** Queue Registry Size : 5 +** Queue Sets : yes +** Semaphores and Mutexes : Settings for Mutex and Semaphore +** Use Mutexes : yes +** Use Recursive Mutexes : yes +** Timers : Enabled +** Priority : (configMAX_PRIORITIES-1U) +** Queue Length : 10 +** Stack Depth : (configMINIMAL_STACK_SIZE) +** Use Daemon Task Startup Hook : no +** Memory : Settings for the memory and heap allocation +** Dynamic Allocation : Enabled +** Heap Size : 8192 +** Application allocated Heap : no +** Memory Allocation Scheme : Scheme 4: merge free blocks +** Static Allocation : Disabled +** User Memory Section : Disabled +** RTOS Adaptor : Configures the RTOS adapter settings +** Memory allocation : Configures how memory is allocated and deallocated. +** User function for memory allocation : no +** User function for memory deallocation : no +** Critical section : Configures how critical sections are handled. +** User function for entering critical section : no +** User function for exiting critical section : no +** Shell : Enabled +** Max number of tasks : 16 +** Shell : McuShell +** Utility : McuUtility +** Contents : +** xTaskCreate - portBASE_TYPE McuRTOS_xTaskCreate(pdTASK_CODE pvTaskCode, const portCHAR *... +** xTaskCreateStatic - TaskHandle_t McuRTOS_xTaskCreateStatic(pdTASK_CODE pvTaskCode, const portCHAR... +** vTaskDelete - void McuRTOS_vTaskDelete(xTaskHandle pxTask); +** vTaskStartScheduler - void McuRTOS_vTaskStartScheduler(void); +** vTaskSuspend - void McuRTOS_vTaskSuspend(xTaskHandle pxTaskToSuspend); +** vTaskSuspendAll - void McuRTOS_vTaskSuspendAll(void); +** vTaskResume - void McuRTOS_vTaskResume(xTaskHandle pxTaskToResume); +** xTaskResumeAll - portBASE_TYPE McuRTOS_xTaskResumeAll(void); +** xTaskResumeFromISR - portBASE_TYPE McuRTOS_xTaskResumeFromISR(xTaskHandle pxTaskToResume); +** vTaskStepTick - void McuRTOS_vTaskStepTick(portTickType xTicksToJump); +** xTaskAbortDelay - BaseType_t McuRTOS_xTaskAbortDelay(TaskHandle_t xTask); +** taskYIELD - void McuRTOS_taskYIELD(void); +** taskENTER_CRITICAL - void McuRTOS_taskENTER_CRITICAL(void); +** taskEXIT_CRITICAL - void McuRTOS_taskEXIT_CRITICAL(void); +** taskDISABLE_INTERRUPTS - void McuRTOS_taskDISABLE_INTERRUPTS(void); +** taskENABLE_INTERRUPTS - void McuRTOS_taskENABLE_INTERRUPTS(void); +** vTaskDelay - void McuRTOS_vTaskDelay(portTickType xTicksToDelay); +** vTaskDelayUntil - void McuRTOS_vTaskDelayUntil(portTickType *pxPreviousWakeTime, portTickType... +** uxTaskPriorityGet - unsigned_portBASE_TYPE McuRTOS_uxTaskPriorityGet(xTaskHandle pxTask); +** xTaskGetTickCount - portTickType McuRTOS_xTaskGetTickCount(void); +** xTaskGetTickCountFromISR - portTickType McuRTOS_xTaskGetTickCountFromISR(void); +** vTaskPrioritySet - void McuRTOS_vTaskPrioritySet(xTaskHandle pxTask, unsigned_portBASE_TYPE... +** vSemaphoreCreateBinary - void McuRTOS_vSemaphoreCreateBinary(xSemaphoreHandle xSemaphore); +** xSemaphoreCreateBinary - SemaphoreHandle_t McuRTOS_xSemaphoreCreateBinary(void); +** xSemaphoreCreateBinaryStatic - SemaphoreHandle_t McuRTOS_xSemaphoreCreateBinaryStatic(StaticSemaphore_t... +** xSemaphoreCreateCounting - xSemaphoreHandle McuRTOS_xSemaphoreCreateCounting(unsigned_portBASE_TYPE... +** xSemaphoreCreateCountingStatic - xSemaphoreHandle McuRTOS_xSemaphoreCrea... +** xSemaphoreGive - bool McuRTOS_xSemaphoreGive(xSemaphoreHandle xMutex); +** xSemaphoreTake - bool McuRTOS_xSemaphoreTake(xSemaphoreHandle xMutex, portTickType xBlockTime); +** uxSemaphoreGetCount - UBaseType_t McuRTOS_uxSemaphoreGetCount(SemaphoreHandle_t xSemaphore); +** xSemaphoreGiveFromISR - bool McuRTOS_xSemaphoreGiveFromISR(xSemaphoreHandle xSemaphore,... +** xSemaphoreTakeFromISR - bool McuRTOS_xSemaphoreTakeFromISR(xSemaphoreHandle xSemaphore,... +** xSemaphoreGetMutexHolder - void* McuRTOS_xSemaphoreGetMutexHolder(xSemaphoreHandle xSemaphore); +** xSemaphoreCreateMutex - xSemaphoreHandle McuRTOS_xSemaphoreCreateMutex(void); +** xSemaphoreCreateMutexStatic - xSemaphoreHandle McuRTOS_xSemaphoreCreateMutexStatic(StaticSemaphore_t... +** xSemaphoreCreateRecursiveMutex - xSemaphoreHandle McuRTOS_xSemaphoreCreateRecursiveMutex(void); +** xSemaphoreCreateRecursiveMutexStatic - xSemaphoreHandle McuRTOS_xSemaphoreCrea... +** xSemaphoreTakeRecursive - bool McuRTOS_xSemaphoreTakeRecursive(xSemaphoreHandle xMutex, portTickType... +** xSemaphoreGiveRecursive - bool McuRTOS_xSemaphoreGiveRecursive(xSemaphoreHandle xMutex); +** vSemaphoreDelete - void McuRTOS_vSemaphoreDelete(xSemaphoreHandle xSemaphore); +** pvPortMalloc - pVoid McuRTOS_pvPortMalloc(size_t xWantedSize); +** vPortFree - void McuRTOS_vPortFree(void *pv); +** xPortGetFreeHeapSize - Tsize_t McuRTOS_xPortGetFreeHeapSize(void); +** xTaskGetCurrentTaskHandle - xTaskHandle McuRTOS_xTaskGetCurrentTaskHandle(void); +** xTaskGetIdleTaskHandle - xTaskHandle McuRTOS_xTaskGetIdleTaskHandle(void); +** xTaskGetHandle - TaskHandle_t McuRTOS_xTaskGetHandle(const char *pcNameToQuery ); +** pcTaskGetTaskName - signed char McuRTOS_pcTaskGetTaskName(xTaskHandle xTaskToQuery); +** eTaskGetState - eTaskState McuRTOS_eTaskGetState(xTaskHandle xTask); +** xTaskGetSchedulerState - portBASE_TYPE McuRTOS_xTaskGetSchedulerState(void); +** vTaskList - void McuRTOS_vTaskList(signed portCHAR *pcWriteBuffer, size_t bufSize); +** uxTaskGetStackHighWaterMark - unsigned_portBASE_TYPE McuRTOS_uxTaskGetStackHighWaterMark(xTaskHandle xTask); +** uxTaskGetNumberOfTasks - unsigned_portBASE_TYPE McuRTOS_uxTaskGetNumberOfTasks(void); +** vTaskGetRunTimeStats - void McuRTOS_vTaskGetRunTimeStats(portCHAR *pcWriteBuffer, size_t bufSize); +** uxQueueMessagesWaiting - unsigned_portBASE_TYPE McuRTOS_uxQueueMessagesWaiting(xQueueHandle xQueue); +** uxQueueMessagesWaitingfromISR - unsigned_portBASE_TYPE McuRTOS_uxQueueMessagesWaitingfromISR(xQueueHandle... +** xQueueCreate - xQueueHandle McuRTOS_xQueueCreate(unsigned_portBASE_TYPE uxQueueLength,... +** xQueueCreateStatic - xQueueHandle McuRTOS_xQueueCreateStatic(unsigned_portBASE_TYPE uxQueueLength,... +** vQueueDelete - void McuRTOS_vQueueDelete(xQueueHandle pxQueueToDelete); +** xQueueReset - portBASE_TYPE McuRTOS_xQueueReset(xQueueHandle xQueue); +** xQueueSendToBack - portBASE_TYPE McuRTOS_xQueueSendToBack(xQueueHandle xQueue, const void... +** xQueueSendToFront - portBASE_TYPE McuRTOS_xQueueSendToFront(xQueueHandle xQueue, const void... +** xQueueReceive - portBASE_TYPE McuRTOS_xQueueReceive(xQueueHandle xQueue, void *pvBuffer,... +** xQueueOverwrite - portBASE_TYPE McuRTOS_xQueueOverwrite(xQueueHandle xQueue, const void... +** xQueueOverwriteFromISR - portBASE_TYPE McuRTOS_xQueueOverwriteFromISR(xQueueHandle xQueue, const void... +** xQueuePeek - portBASE_TYPE McuRTOS_xQueuePeek(xQueueHandle xQueue, void *pvBuffer,... +** xQueuePeekFromISR - portBASE_TYPE McuRTOS_xQueuePeekFromISR(xQueueHandle xQueue, void *pvBuffer,... +** xQueueSendToBackFromISR - portBASE_TYPE McuRTOS_xQueueSendToBackFromISR(xQueueHandle xQueue, const void... +** xQueueSendToFrontFromISR - portBASE_TYPE McuRTOS_xQueueSendToFrontFromISR(xQueueHandle xQueue, const... +** xQueueReceiveFromISR - portBASE_TYPE McuRTOS_xQueueReceiveFromISR(xQueueHandle xQueue, void... +** vQueueAddToRegistry - void McuRTOS_vQueueAddToRegistry(xQueueHandle xQueue, char *pcQueueName); +** vQueueUnregisterQueue - void McuRTOS_vQueueUnregisterQueue(xQueueHandle xQueue); +** xQueueIsQueueFullFromISR - portBASE_TYPE McuRTOS_xQueueIsQueueFullFromISR(xQueueHandle xQueue); +** xQueueIsQueueEmptyFromISR - portBASE_TYPE McuRTOS_xQueueIsQueueEmptyFromISR(xQueueHandle xQueue); +** xQueueCreateSet - xQueueSetHandle McuRTOS_xQueueCreateSet(unsigned portBASE_TYPE... +** xQueueAddToSet - portBASE_TYPE McuRTOS_xQueueAddToSet(xQueueSetMemberHandle xQueueOrSemaphore,... +** xQueueRemoveFromSet - portBASE_TYPE McuRTOS_xQueueRemoveFromSet(xQueueSetMemberHandle... +** xQueueSelectFromSet - xQueueSetMemberHandle McuRTOS_xQueueSelectFromSet(xQueueSetHandle xQueueSet,... +** xQueueSelectFromSetFromISR - xQueueSetMemberHandle McuRTOS_xQueueSelectFromSetFromISR(xQueueSetHandle... +** xEventGroupCreate - EventGroupHandle_t McuRTOS_xEventGroupCreate(void); +** xEventGroupCreateStatic - EventGroupHandle_t McuRTOS_xEventGroupCreateStatic(StaticEventGroup_t... +** xEventGroupWaitBits - byte McuRTOS_xEventGroupWaitBits(const EventGroupHandle_t xEventGroup, const... +** xEventGroupSetBits - EventBits_t McuRTOS_xEventGroupSetBits(EventGroupHandle_t xEventGroup, const... +** xEventGroupSetBitsFromISR - EventBits_t McuRTOS_xEventGroupSetBitsFromISR(EventGroupHandle_t xEventGroup,... +** xEventGroupClearBits - EventBits_t McuRTOS_xEventGroupClearBits(EventGroupHandle_t xEventGroup,... +** xEventGroupClearBitsFromISR - EventBits_t McuRTOS_xEventGroupClearBitsFromISR(EventGroupHandle_t... +** xEventGroupGetBits - EventBits_t McuRTOS_xEventGroupGetBits(EventGroupHandle_t xEventGroup); +** xEventGroupGetBitsFromISR - EventBits_t McuRTOS_xEventGroupGetBitsFromISR(EventGroupHandle_t xEventGroup); +** xEventGroupSync - EventBits_t McuRTOS_xEventGroupSync(EventGroupHandle_t xEventGroup, const... +** xTimerCreate - TimerHandle_t McuRTOS_xTimerCreate(const char * const pcTimerName, const... +** xTimerCreateStatic - TimerHandle_t McuRTOS_xTimerCreateStatic(const char * const pcTimerName,... +** xTimerIsTimerActive - BaseType_t McuRTOS_xTimerIsTimerActive(TimerHandle_t xTimer); +** xTimerStart - BaseType_t McuRTOS_xTimerStart(TimerHandle_t xTimer, TickType_t xBlockTime); +** xTimerStop - BaseType_t McuRTOS_xTimerStop(TimerHandle_t xTimer, TickType_t xBlockTime); +** xTimerChangePeriod - BaseType_t McuRTOS_xTimerChangePeriod(TimerHandle_t xTimer, TickType_t... +** xTimerDelete - BaseType_t McuRTOS_xTimerDelete(TickType_t xTimer, TickType_t xBlockTime); +** xTimerReset - BaseType_t McuRTOS_xTimerReset(TimerHandle_t xTimer, TickType_t xBlockTime); +** xTimerStartFromISR - BaseType_t McuRTOS_xTimerStartFromISR(TimerHandle_t xTimer, BaseType_t... +** xTimerStopFromISR - BaseType_t McuRTOS_xTimerStopFromISR(TimerHandle_t xTimer, BaseType_t... +** xTimerChangePeriodFromISR - BaseType_t McuRTOS_xTimerChangePeriodFromISR(TimerHandle_t xTimer, TickType_t... +** xTimerResetFromISR - BaseType_t McuRTOS_xTimerResetFromISR(TimerHandle_t xTimer, BaseType_t... +** pvTimerGetTimerID - void* McuRTOS_pvTimerGetTimerID(TimerHandle_t xTimer); +** xTimerGetTimerDaemonTaskHandle - TaskHandle_t McuRTOS_xTimerGetTimerDaemonTaskHandle(void); +** pcTimerGetTimerName - char* McuRTOS_pcTimerGetTimerName(TimerHandle_t xTimer); +** xTimerPendFunctionCall - BaseType_t McuRTOS_xTimerPendFunctionCall(PendedFunction_t xFunctionToPend,... +** xTimerPendFunctionCallFromISR - BaseType_t McuRTOS_xTimerPendFunctionCallFromISR(PendedFunction_t... +** xTaskNotifyGive - BaseType_t McuRTOS_xTaskNotifyGive(TaskHandle_t xTaskToNotify); +** vTaskNotifyGiveFromISR - void McuRTOS_vTaskNotifyGiveFromISR(TaskHandle_t xTaskToNotify, BaseType_t... +** ulTaskNotifyTake - uint32_t McuRTOS_ulTaskNotifyTake(BaseType_t xClearCountOnExit, TickType_t... +** xTaskNotify - BaseType_t McuRTOS_xTaskNotify(TaskHandle_t xTaskToNotify, uint32_t ulValue,... +** xTaskNotifyFromISR - BaseType_t McuRTOS_xTaskNotifyFromISR(TaskHandle_t xTaskToNotify, uint32_t... +** xTaskNotifyAndQuery - BaseType_t McuRTOS_xTaskNotifyAndQuery(TaskHandle_t xTaskToNotify, uint32_t... +** xTaskNotifyAndQueryFromISR - BaseType_t McuRTOS_xTaskNotifyAndQueryFromISR(TaskHandle_t xTaskToNotify,... +** xTaskNotifyWait - BaseType_t McuRTOS_xTaskNotifyWait(uint32_t ulBitsToClearOnEntry, uint32_t... +** xTaskNotifyStateClear - BaseType_t McuRTOS_xTaskNotifyStateClear(TaskHandle_t xTask); +** vTaskSetThreadLocalStoragePointer - void McuRTOS_vTaskSetThreadLocalStoragePointer(TaskHandle_t xTaskToSet,... +** pvTaskGetThreadLocalStoragePointer - void* McuRTOS_pvTaskGetThreadLocalStoragePointer(TaskHandle_t xTaskToQuery,... +** pcTaskGetName - char* McuRTOS_pcTaskGetName(TaskHandle_t xTaskToQuery); +** vTaskGetInfo - void McuRTOS_vTaskGetInfo(TaskHandle_t xTask, TaskStatus_t *pxTaskStatus,... +** ParseCommand - uint8_t McuRTOS_ParseCommand(const unsigned char *cmd, bool *handled, const... +** AppConfigureTimerForRuntimeStats - void McuRTOS_AppConfigureTimerForRuntimeStats(void); +** AppGetRuntimeCounterValueFromISR - uint32_t McuRTOS_AppGetRuntimeCounterValueFromISR(void); +** Deinit - void McuRTOS_Deinit(void); +** Init - void McuRTOS_Init(void); +** +** * FreeRTOS (c) Copyright 2003-2023 Richard Barry/Amazon, http: www.FreeRTOS.org +** * See separate FreeRTOS licensing terms. +** * +** * FreeRTOS Processor Expert Component: (c) Copyright Erich Styger, 2013-2023 +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuRTOS.h +** @version 01.00 +** @brief +** This component implements the FreeRTOS Realtime Operating System +*/ +/*! +** @addtogroup McuRTOS_module McuRTOS module documentation +** @{ +*/ + +/* MODULE McuRTOS. */ +#include "McuRTOS.h" +#if McuLib_CONFIG_SDK_USE_FREERTOS + +#if !McuLib_CONFIG_CPU_IS_ESP32 + #include "portTicks.h" /* interface to tick counter */ +#endif +#if configSYSTICK_USE_LOW_POWER_TIMER && McuLib_CONFIG_NXP_SDK_USED + #if McuLib_CONFIG_CPU_IS_KINETIS + #include "fsl_clock.h" + #elif McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC804 + #include "fsl_wkt.h" + #endif +#endif +#include "McuUtility.h" +#if configHEAP_SCHEME_IDENTIFICATION + /* special variable identifying the used heap scheme */ + const uint8_t freeRTOSMemoryScheme = configUSE_HEAP_SCHEME; +#endif + + +#if (configUSE_TOP_USED_PRIORITY || configLTO_HELPER) && !McuLib_CONFIG_CPU_IS_ESP32 + /* This is only really needed for debugging with openOCD: + * Since at least FreeRTOS V7.5.3 uxTopUsedPriority is no longer + * present in the kernel, so it has to be supplied by other means for + * OpenOCD's threads awareness. + * + * Add this file to your project, and, if you're using --gc-sections, + * ``--undefined=uxTopUsedPriority'' (or + * ``-Wl,--undefined=uxTopUsedPriority'' when using gcc for final + * linking) to your LDFLAGS; same with all the other symbols you need. + */ +#if 0 /* FreeRTOS V10.5.1 has it re-added to the kernel */ + const int + #ifdef __GNUC__ + __attribute__((used)) + #endif + uxTopUsedPriority = configMAX_PRIORITIES-1; +#endif +#endif + +#if configUSE_SHELL +static uint8_t PrintTaskList(const McuShell_StdIOType *io) { +#if tskKERNEL_VERSION_MAJOR>=10 && !McuLib_CONFIG_CPU_IS_ESP32 + #define SHELL_MAX_NOF_TASKS 16 /* maximum number of tasks, as specified in the properties */ + UBaseType_t nofTasks, i; + TaskHandle_t taskHandles[SHELL_MAX_NOF_TASKS]; + StackType_t *stackBeg, *stackEnd, *topOfStack; + uint8_t staticallyAllocated; + uint8_t tmpBuf[32]; + uint16_t stackSize; +#endif +#if configUSE_TRACE_FACILITY && !((tskKERNEL_VERSION_MAJOR<10) || McuLib_CONFIG_CPU_IS_ESP32) + TaskStatus_t taskStatus; +#endif + uint8_t buf[32]; + uint8_t res; +#if configGENERATE_RUN_TIME_STATS + uint32_t ulTotalTime; +#endif +#if configUSE_TRACE_FACILITY + #define PAD_STAT_TASK_TCB (sizeof("TCB ")-1) +#endif + #define PAD_STAT_TASK_STATIC (sizeof("yes(2) ")-1) + #define PAD_STAT_TASK_HANDLE (sizeof("0x20000398 ")-1) + #define PAD_STAT_TASK_NAME (configMAX_TASK_NAME_LEN+1) +#if configUSE_TRACE_FACILITY + #define PAD_STAT_TASK_STATE (sizeof("Suspended")-1) +#endif +#if configUSE_TRACE_FACILITY + #define PAD_STAT_TASK_PRIO (sizeof("(10,12) ")-1) +#else + #define PAD_STAT_TASK_PRIO (sizeof("Prio ")-1) +#endif + #define PAD_STAT_TASK_STACK_BEG (sizeof("0x20000398 ")-1) + #define PAD_STAT_TASK_STACK_END (sizeof("0x20000398 ")-1) + #define PAD_STAT_TASK_STACK_SIZE (sizeof("12000 B ")-1) + #define PAD_STAT_TASK_STACK_TOP (sizeof("0x200006FC ( 132 B) ")-1) +#if configUSE_TRACE_FACILITY + #define PAD_STAT_TASK_STACK_MARK (sizeof("12345 B ")-1) +#endif +#if configGENERATE_RUN_TIME_STATS + #define PAD_STAT_TASK_RUNTIME (sizeof("0x20000398 (100%)")-1) +#endif + + res = ERR_OK; +#if !configUSE_TRACE_FACILITY + McuShell_SendStr((uint8_t*)"Info: Enable configUSE_TRACE_FACILITY for additional task information.\r\n", io->stdOut); +#endif +#if !configGENERATE_RUN_TIME_STATS + McuShell_SendStr((uint8_t*)"Info: Enable configGENERATE_RUN_TIME_STATS for runtime statistics.\r\n", io->stdOut); +#endif + /* header */ +#if configUSE_TRACE_FACILITY + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), (const unsigned char*)"TCB", ' ', PAD_STAT_TASK_TCB); + McuShell_SendStr(buf, io->stdOut); +#endif + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), (const unsigned char*)"Static", ' ', PAD_STAT_TASK_STATIC); + McuShell_SendStr(buf, io->stdOut); + + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), (const unsigned char*)"Handle", ' ', PAD_STAT_TASK_HANDLE); + McuShell_SendStr(buf, io->stdOut); + + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), (const unsigned char*)"Name", ' ', PAD_STAT_TASK_NAME); + McuShell_SendStr(buf, io->stdOut); + +#if configUSE_TRACE_FACILITY + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), (const unsigned char*)"State", ' ', PAD_STAT_TASK_STATE); + McuShell_SendStr(buf, io->stdOut); +#endif + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), (const unsigned char*)"Prio", ' ', PAD_STAT_TASK_PRIO); + McuShell_SendStr(buf, io->stdOut); + + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), (const unsigned char*)"Stack Beg", ' ', PAD_STAT_TASK_STACK_BEG); + McuShell_SendStr(buf, io->stdOut); + + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), (const unsigned char*)"Stack End", ' ', PAD_STAT_TASK_STACK_END); + McuShell_SendStr(buf, io->stdOut); + + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), (const unsigned char*)"Size", ' ', PAD_STAT_TASK_STACK_SIZE); + McuShell_SendStr(buf, io->stdOut); + + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), (const unsigned char*)"Stack Top", ' ', PAD_STAT_TASK_STACK_TOP); + McuShell_SendStr(buf, io->stdOut); +#if configUSE_TRACE_FACILITY + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), (const unsigned char*)"Unused", ' ', PAD_STAT_TASK_STACK_MARK); + McuShell_SendStr(buf, io->stdOut); +#endif +#if configGENERATE_RUN_TIME_STATS + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), (const unsigned char*)"Runtime", ' ', PAD_STAT_TASK_RUNTIME); + McuShell_SendStr(buf, io->stdOut); +#endif + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + +#if configGENERATE_RUN_TIME_STATS + ulTotalTime = portGET_RUN_TIME_COUNTER_VALUE(); /* get total time passed in system */ + ulTotalTime /= 100UL; /* For percentage calculations. */ +#endif + +#if (tskKERNEL_VERSION_MAJOR<10) || McuLib_CONFIG_CPU_IS_ESP32 /* otherwise xGetTaskHandles(), vTaskGetStackInfo(), pcTaskGetName() not available */ + McuShell_SendStr((unsigned char*)"FreeRTOS version must be at least 10.0.0 and not for ESP32\r\n", io->stdOut); +#else + nofTasks = uxTaskGetNumberOfTasks(); + if (nofTasks>SHELL_MAX_NOF_TASKS) { + McuUtility_strcpy(buf, sizeof(buf), (const unsigned char*)"WARNING: more tasks than Shell maximum number of tasks.\r\n"); + McuShell_SendStr(buf, io->stdErr); + nofTasks = SHELL_MAX_NOF_TASKS; + } + /* get task handles of all tasks. */ + nofTasks = xGetTaskHandles(&taskHandles[0], SHELL_MAX_NOF_TASKS); + for(i=0;istdOut); +#endif + /* Static */ + tmpBuf[0] = '\0'; + if (staticallyAllocated==0) { + McuUtility_strcpy(tmpBuf, sizeof(tmpBuf), (unsigned char*)"no (0)"); + } else { + McuUtility_strcpy(tmpBuf, sizeof(tmpBuf), (unsigned char*)"yes("); + McuUtility_strcatNum8u(tmpBuf, sizeof(tmpBuf), staticallyAllocated); + McuUtility_strcat(tmpBuf, sizeof(tmpBuf), (unsigned char*)")"); + } + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), tmpBuf, ' ', PAD_STAT_TASK_STATIC); + McuShell_SendStr(buf, io->stdOut); + + /* task handle */ + McuUtility_strcpy(tmpBuf, sizeof(tmpBuf), (unsigned char*)"0x"); + McuUtility_strcatNum32Hex(tmpBuf, sizeof(tmpBuf), (uint32_t)taskHandles[i]); + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), tmpBuf, ' ', PAD_STAT_TASK_HANDLE); + McuShell_SendStr(buf, io->stdOut); + + /* task name */ + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), (unsigned char*)pcTaskGetName(taskHandles[i]), ' ', PAD_STAT_TASK_NAME); + McuShell_SendStr(buf, io->stdOut); + +#if configUSE_TRACE_FACILITY + /* state */ + switch(taskStatus.eCurrentState) { + case eRunning: McuUtility_strcpy(tmpBuf, sizeof(tmpBuf), (unsigned char*)"Running"); break; + case eReady: McuUtility_strcpy(tmpBuf, sizeof(tmpBuf), (unsigned char*)"Ready"); break; + case eSuspended: McuUtility_strcpy(tmpBuf, sizeof(tmpBuf), (unsigned char*)"Suspended"); break; + case eBlocked: McuUtility_strcpy(tmpBuf, sizeof(tmpBuf), (unsigned char*)"Blocked"); break; + case eDeleted: McuUtility_strcpy(tmpBuf, sizeof(tmpBuf), (unsigned char*)"Deleted"); break; + case eInvalid: McuUtility_strcpy(tmpBuf, sizeof(tmpBuf), (unsigned char*)"Invalid"); break; + default: McuUtility_strcpy(tmpBuf, sizeof(tmpBuf), (unsigned char*)"UNKNOWN!"); break; + } + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), tmpBuf, ' ', PAD_STAT_TASK_STATE); + McuShell_SendStr(buf, io->stdOut); +#endif +#if configUSE_TRACE_FACILITY + /* (baseprio,currprio) */ + tmpBuf[0] = '\0'; + McuUtility_chcat(tmpBuf, sizeof(tmpBuf), '('); + McuUtility_strcatNum32u(tmpBuf, sizeof(tmpBuf), taskStatus.uxBasePriority); + McuUtility_chcat(tmpBuf, sizeof(tmpBuf), ','); + McuUtility_strcatNum32u(tmpBuf, sizeof(tmpBuf), taskStatus.uxCurrentPriority); + McuUtility_chcat(tmpBuf, sizeof(tmpBuf), ')'); + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), tmpBuf, ' ', PAD_STAT_TASK_PRIO); + McuShell_SendStr(buf, io->stdOut); +#else + /* prio */ + tmpBuf[0] = '\0'; + McuUtility_strcatNum32s(tmpBuf, sizeof(tmpBuf), uxTaskPriorityGet(taskHandles[i])); + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), tmpBuf, ' ', PAD_STAT_TASK_PRIO); + McuShell_SendStr(buf, io->stdOut); +#endif + /* stack begin */ + McuUtility_strcpy(tmpBuf, sizeof(tmpBuf), (unsigned char*)"0x"); + McuUtility_strcatNum32Hex(tmpBuf, sizeof(tmpBuf), (uint32_t)stackBeg); + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), tmpBuf, ' ', PAD_STAT_TASK_STACK_BEG); + McuShell_SendStr(buf, io->stdOut); + + /* stack end */ + McuUtility_strcpy(tmpBuf, sizeof(tmpBuf), (unsigned char*)"0x"); + McuUtility_strcatNum32Hex(tmpBuf, sizeof(tmpBuf), (uint32_t)stackEnd); + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), tmpBuf, ' ', PAD_STAT_TASK_STACK_END); + McuShell_SendStr(buf, io->stdOut); + + /* stack size */ +#if (portSTACK_GROWTH>0) + stackSize = (uint16_t)(((uint32_t)stackEnd - (uint32_t)stackBeg)+sizeof(StackType_t)); +#else + stackSize = (uint16_t)(((uint32_t)stackBeg - (uint32_t)stackEnd)+ 2*sizeof(StackType_t)); +#endif + tmpBuf[0] = '\0'; + McuUtility_strcatNum16uFormatted(tmpBuf, sizeof(tmpBuf), stackSize, ' ', 5); + McuUtility_strcat(tmpBuf, sizeof(tmpBuf), (unsigned char*)" B"); + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), tmpBuf, ' ', PAD_STAT_TASK_STACK_SIZE); + McuShell_SendStr(buf, io->stdOut); + + /* stack top */ + McuUtility_strcpy(tmpBuf, sizeof(tmpBuf), (unsigned char*)"0x"); + McuUtility_strcatNum32Hex(tmpBuf, sizeof(tmpBuf), (uint32_t)topOfStack); + McuUtility_strcat(tmpBuf, sizeof(tmpBuf), (unsigned char*)" ("); +#if (portSTACK_GROWTH>0) + McuUtility_strcatNum16uFormatted(tmpBuf, sizeof(tmpBuf), (uint16_t)(((uint32_t)topOfStack - (uint32_t)stackBeg))+sizeof(StackType_t), ' ', 5); +#else + McuUtility_strcatNum16uFormatted(tmpBuf, sizeof(tmpBuf), (uint16_t)(((uint32_t)stackBeg - (uint32_t)topOfStack))+sizeof(StackType_t), ' ', 5); +#endif + McuUtility_strcat(tmpBuf, sizeof(tmpBuf), (unsigned char*)" B)"); + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), tmpBuf, ' ', PAD_STAT_TASK_STACK_TOP); + McuShell_SendStr(buf, io->stdOut); + +#if configUSE_TRACE_FACILITY + /* stack high water mark (the lower the number, the less stack available */ + tmpBuf[0] = '\0'; + McuUtility_strcatNum16uFormatted(tmpBuf, sizeof(tmpBuf), taskStatus.usStackHighWaterMark*sizeof(portSTACK_TYPE), ' ', 5); + McuUtility_strcat(tmpBuf, sizeof(tmpBuf), (unsigned char*)" B"); + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), tmpBuf, ' ', PAD_STAT_TASK_STACK_MARK); + McuShell_SendStr(buf, io->stdOut); +#endif +#if configGENERATE_RUN_TIME_STATS && configUSE_TRACE_FACILITY + /* runtime */ + McuUtility_strcpy(tmpBuf, sizeof(tmpBuf), (unsigned char*)"0x"); + McuUtility_strcatNum32Hex(tmpBuf, sizeof(tmpBuf), taskStatus.ulRunTimeCounter); + if (ulTotalTime>0) { /* to avoid division by zero */ + uint32_t ulStatsAsPercentage; + + /* What percentage of the total run time has the task used? + This will always be rounded down to the nearest integer. + ulTotalRunTime has already been divided by 100. */ + ulStatsAsPercentage = taskStatus.ulRunTimeCounter/ulTotalTime; + if (ulStatsAsPercentage>0) { + McuUtility_strcat(tmpBuf, sizeof(tmpBuf), (unsigned char*)" ("); + McuUtility_strcatNum16uFormatted(tmpBuf, sizeof(tmpBuf), ulStatsAsPercentage, ' ', 3); + McuUtility_strcat(tmpBuf, sizeof(tmpBuf), (unsigned char*)"%)"); + } else { + /* If the percentage is zero here then the task has consumed less than 1% of the total run time. */ + McuUtility_strcat(tmpBuf, sizeof(tmpBuf), (unsigned char*)" ( <1%)"); + } + } + buf[0] = '\0'; + McuUtility_strcatPad(buf, sizeof(buf), tmpBuf, ' ', PAD_STAT_TASK_RUNTIME); + McuShell_SendStr(buf, io->stdOut); +#endif + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + } /* if */ + } /* for */ +#endif /* tskKERNEL_VERSION_MAJOR */ + return res; +} +#endif + +#if configUSE_SHELL +static uint8_t PrintStatus(const McuShell_StdIOType *io) { + uint8_t buf[16]; + + McuShell_SendStatusStr((unsigned char*)"McuRTOS", (unsigned char*)"FreeRTOS status information\r\n", io->stdOut); + McuShell_SendStatusStr((unsigned char*)" Version", (const unsigned char*)tskKERNEL_VERSION_NUMBER, io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + McuShell_SendStatusStr((unsigned char*)" RTOS ticks", (const unsigned char*)"", io->stdOut); + McuUtility_Num16sToStr(buf, sizeof(buf), configTICK_RATE_HZ); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)" Hz, ", io->stdOut); + McuUtility_Num16sToStr(buf, sizeof(buf), 1000/configTICK_RATE_HZ); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)" ms\r\n", io->stdOut); +#if configSUPPORT_DYNAMIC_ALLOCATION && configUSE_HEAP_SCHEME!=3 /* wrapper to malloc() does not have xPortGetFreeHeapSize() */ + McuShell_SendStatusStr((unsigned char*)" Free heap", (const unsigned char*)"", io->stdOut); + McuUtility_Num32uToStr(buf, sizeof(buf), McuRTOS_xPortGetFreeHeapSize()); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((unsigned char*)" bytes\r\n", io->stdOut); +#endif + return ERR_OK; +} +#endif + +#if configUSE_SHELL +static uint8_t PrintHelp(const McuShell_StdIOType *io) { + McuShell_SendHelpStr((unsigned char*)"McuRTOS", (unsigned char*)"Group of McuRTOS commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" tasklist", (unsigned char*)"Print tasklist\r\n", io->stdOut); + return ERR_OK; +} +#endif + +/* +** =================================================================== +** Method : xTaskCreate (component FreeRTOS) +** +** Description : +** Create a new task and add it to the list of tasks that are +** ready to run. +** Parameters : +** NAME - DESCRIPTION +** pvTaskCode - Pointer to the task entry +** function. Tasks must be implemented to +** never return (i.e. continuous loop). +** pcName - A descriptive name for the task. +** This is mainly used to facilitate debugging. +** Max length defined by +** configMAX_TASK_NAME_LEN. +** usStackDepth - The size of the task +** stack specified as the number of variables +** the stack can hold - not the number of +** bytes. For example, if the stack is 16 bits +** wide and usStackDepth is defined as 100, +** 200 bytes will be allocated for stack +** storage. The stack depth multiplied by the +** stack width must not exceed the maximum +** value that can be contained in a variable +** of type size_t. +** pvParameters - Pointer that will be +** used as the parameter for the task being +** created. +** uxPriority - The priority at which the +** task should run. +** pvCreatedTask - Used to pass back a +** handle by which the created task can be +** referenced. +** Returns : +** --- - pdPASS if the task was successfully +** created and added to a ready list, +** otherwise an error code defined in the file +** projdefs.h +** =================================================================== +*/ +/* +portBASE_TYPE McuRTOS_xTaskCreate(pdTASK_CODE pvTaskCode, const portCHAR * const pcName, unsigned portSHORT usStackDepth, void *pvParameters, unsigned portBASE_TYPE uxPriority, xTaskHandle *pvCreatedTask) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : vTaskDelete (component FreeRTOS) +** +** Description : +** Remove a task from the RTOS real time kernels management. +** The task being deleted will be removed from all ready, +** blocked, suspended and event lists. +** NOTE: The idle task is responsible for freeing the kernel +** allocated memory from tasks that have been deleted. It is +** therefore important that the idle task is not starved of +** microcontroller processing time if your application makes +** any calls to vTaskDelete (). Memory allocated by the task +** code is not automatically freed, and should be freed before +** the task is deleted. +** Parameters : +** NAME - DESCRIPTION +** pxTask - The handle of the task to be deleted. +** Passing NULL will cause the calling task to +** be deleted. +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_vTaskDelete(xTaskHandle pxTask) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : vTaskStartScheduler (component FreeRTOS) +** +** Description : +** Starts the real time kernel tick processing. After calling +** the kernel has control over which tasks are executed and +** when. +** The idle task is created automatically when +** vTaskStartScheduler() is called. +** If vTaskStartScheduler() is successful the function will not +** return until an executing task calls vTaskEndScheduler(). +** The function might fail and return immediately if there is +** insufficient RAM available for the idle task to be created. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_vTaskStartScheduler(void) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : taskYIELD (component FreeRTOS) +** +** Description : +** Macro for forcing a context switch. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_taskYIELD(void) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : taskENTER_CRITICAL (component FreeRTOS) +** +** Description : +** Macro to mark the start of a critical code region. +** Preemptive context switches cannot occur when in a critical +** region. +** NOTE: This may alter the stack (depending on the portable +** implementation) so must be used with care! +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_taskENTER_CRITICAL(void) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : taskEXIT_CRITICAL (component FreeRTOS) +** +** Description : +** Macro to mark the end of a critical code region. Preemptive +** context switches cannot occur when in a critical region. +** NOTE: This may alter the stack (depending on the portable +** implementation) so must be used with care! +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_taskEXIT_CRITICAL(void) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : taskDISABLE_INTERRUPTS (component FreeRTOS) +** +** Description : +** Macro to disable all maskable interrupts. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_taskDISABLE_INTERRUPTS(void) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : taskENABLE_INTERRUPTS (component FreeRTOS) +** +** Description : +** Macro to enable microcontroller interrupts. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_taskENABLE_INTERRUPTS(void) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : vTaskSuspendAll (component FreeRTOS) +** +** Description : +** Suspends all real time kernel activity while keeping +** interrupts (including the kernel tick) enabled. +** After calling vTaskSuspendAll () the calling task will +** continue to execute without risk of being swapped out until +** a call to xTaskResumeAll () has been made. +** API functions that have the potential to cause a context +** switch (for example, vTaskDelayUntil(), xQueueSend(), etc.) +** must not be called while the scheduler is suspended. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_vTaskSuspendAll(void) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTaskResumeAll (component FreeRTOS) +** +** Description : +** Resumes real time kernel activity following a call to +** vTaskSuspendAll (). After a call to xTaskSuspendAll () the +** kernel will take control of which task is executing at any +** time. +** Parameters : None +** Returns : +** --- - If resuming the scheduler caused a context +** switch then pdTRUE is returned, otherwise +** pdFALSE is returned. +** =================================================================== +*/ +/* +portBASE_TYPE McuRTOS_xTaskResumeAll(void) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTaskResumeFromISR (component FreeRTOS) +** +** Description : +** An implementation of vTaskResume() that can be called from +** within an ISR. A task that has been suspended by one of more +** calls to vTaskSuspend() will be made available for running +** again by a single call to xTaskResumeFromISR(). +** Parameters : +** NAME - DESCRIPTION +** pxTaskToResume - Handle to the task +** being readied. +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +portBASE_TYPE McuRTOS_xTaskResumeFromISR(xTaskHandle pxTaskToResume) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : vTaskDelay (component FreeRTOS) +** +** Description : +** Delay a task for a given number of ticks. The actual time +** that the task remains blocked depends on the tick rate. The +** macro pdMS_TO_TICKS() can be used to calculate real time +** from the tick rate - with the resolution of one tick period. +** vTaskDelay() specifies a time at which the task wishes to +** unblock relative to the time at which vTaskDelay() is called. +** For example, specifying a block period of 100 ticks will +** cause the task to unblock 100 ticks after vTaskDelay() is +** called. vTaskDelay() does not therefore provide a good +** method of controlling the frequency of a cyclical task as +** the path taken through the code, as well as other task and +** interrupt activity, will effect the frequency at which +** vTaskDelay() gets called and therefore the time at which the +** task next executes. See vTaskDelayUntil() for an alternative +** API function designed to facilitate fixed frequency +** execution. It does this by specifying an absolute time +** (rather than a relative time) at which the calling task +** should unblock. +** Parameters : +** NAME - DESCRIPTION +** xTicksToDelay - The amount of time, in +** tick periods, that the calling task should +** block. +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_vTaskDelay(portTickType xTicksToDelay) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : vTaskDelayUntil (component FreeRTOS) +** +** Description : +** Delay a task until a specified time. This function can be +** used by cyclical tasks to ensure a constant execution +** frequency. +** This function differs from vTaskDelay() in one important +** aspect: vTaskDelay() specifies a time at which the task +** wishes to unblock relative to the time at which vTaskDelay() +** is called, whereas vTaskDelayUntil() specifies an absolute +** time at which the task wishes to unblock. +** vTaskDelay() will cause a task to block for the specified +** number of ticks from the time vTaskDelay() is called. It is +** therefore difficult to use vTaskDelay() by itself to +** generate a fixed execution frequency as the time between a +** task unblocking following a call to vTaskDelay() and that +** task next calling vTaskDelay() may not be fixed [the task +** may take a different path though the code between calls, or +** may get interrupted or preempted a different number of times +** each time it executes]. +** Whereas vTaskDelay() specifies a wake time relative to the +** time at which the function is called, vTaskDelayUntil() +** specifies the absolute (exact) time at which it wishes to +** unblock. +** It should be noted that vTaskDelayUntil() will return +** immediately (without blocking) if it is used to specify a +** wake time that is already in the past. Therefore a task +** using vTaskDelayUntil() to execute periodically will have to +** re-calculate its required wake time if the periodic +** execution is halted for any reason (for example, the task is +** temporarily placed into the Suspended state) causing the +** task to miss one or more periodic executions. This can be +** detected by checking the variable passed by reference as the +** pxPreviousWakeTime parameter against the current tick count. +** This is however not necessary under most usage scenarios. +** The constant portTICK_RATE_MS can be used to calculate real +** time from the tick rate - with the resolution of one tick +** period. +** This function must not be called while the scheduler has +** been suspended by a call to vTaskSuspendAll(). +** Parameters : +** NAME - DESCRIPTION +** pxPreviousWakeTime - Pointer to a +** variable that holds the time at which the +** task was last unblocked. The variable must +** be initialised with the current time prior +** to its first use (see the example below). +** Following this the variable is +** automatically updated within +** vTaskDelayUntil(). +** xTimeIncrement - The cycle time +** period. The task will be unblocked at time +** (*pxPreviousWakeTime + xTimeIncrement). +** Calling vTaskDelayUntil with the same +** xTimeIncrement parameter value will cause +** the task to execute with a fixed interval +** period. +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_vTaskDelayUntil(portTickType *pxPreviousWakeTime, portTickType xTimeIncrement) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : uxTaskPriorityGet (component FreeRTOS) +** +** Description : +** Obtain the priority of any task. +** Parameters : +** NAME - DESCRIPTION +** pxTask - Handle of the task to be queried. +** Passing a NULL handle results in the +** priority of the calling task being returned. +** Returns : +** --- - The priority of pxTask. +** =================================================================== +*/ +/* +unsigned_portBASE_TYPE McuRTOS_uxTaskPriorityGet(xTaskHandle pxTask) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : vTaskPrioritySet (component FreeRTOS) +** +** Description : +** Set the priority of any task. +** Parameters : +** NAME - DESCRIPTION +** pxTask - Handle to the task for which the +** priority is being set. Passing a NULL +** handle results in the priority of the +** calling task being set. +** uxNewPriority - The priority to which +** the task will be set. +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_vTaskPrioritySet(xTaskHandle pxTask, unsigned_portBASE_TYPE uxNewPriority) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xSemaphoreTakeRecursive (component FreeRTOS) +** +** Description : +** Macro to recursively obtain, or 'take', a mutex type +** semaphore. The mutex must have previously been created using +** a call to xSemaphoreCreateRecursiveMutex(); +** This macro must not be used on mutexes created using +** xSemaphoreCreateMutex(). A mutex used recursively can be +** 'taken' repeatedly by the owner. The mutex doesn't become +** available again until the owner has called +** xSemaphoreGiveRecursive() for each successful 'take' request. +** For example, if a task successfully 'takes' the same mutex 5 +** times then the mutex will not be available to any other task +** until it has also 'given' the mutex back exactly five times. +** Parameters : +** NAME - DESCRIPTION +** xMutex - A handle to the mutex being obtained. +** This is the handle returned by +** xSemaphoreCreateRecursiveMutex(); +** xBlockTime - The time in ticks to wait +** for the semaphore to become available. The +** macro portTICK_RATE_MS can be used to +** convert this to a real time. A block time +** of zero can be used to poll the semaphore. +** If the task already owns the semaphore then +** xSemaphoreTakeRecursive() will return +** immediately no matter what the value of +** xBlockTime. +** Returns : +** --- - Returns pdTRUE if the semaphore was +** obtained. pdFALSE if xBlockTime expired +** without the semaphore becoming available. +** =================================================================== +*/ +/* +bool McuRTOS_xSemaphoreTakeRecursive(xSemaphoreHandle xMutex, portTickType xBlockTime) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xSemaphoreGiveRecursive (component FreeRTOS) +** +** Description : +** Macro to recursively release, or 'give', a mutex type +** semaphore. The mutex must have previously been created using +** a call to xSemaphoreCreateRecursiveMutex(); +** This macro must not be used on mutexes created using +** xSemaphoreCreateMutex(). A mutex used recursively can be +** 'taken' repeatedly by the owner. The mutex doesn't become +** available again until the owner has called +** xSemaphoreGiveRecursive() for each successful 'take' request. +** For example, if a task successfully 'takes' the same mutex 5 +** times then the mutex will not be available to any other task +** until it has also 'given' the mutex back exactly five times. +** Parameters : +** NAME - DESCRIPTION +** xMutex - A handle to the mutex being released, +** or 'given'. This is the handle returned by +** xSemaphoreCreateMutex(); +** Returns : +** --- - Returns pdTRUE if the semaphore was given. +** =================================================================== +*/ +/* +bool McuRTOS_xSemaphoreGiveRecursive(xSemaphoreHandle xMutex) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xSemaphoreCreateRecursiveMutex (component FreeRTOS) +** +** Description : +** Macro that implements a recursive mutex by using the +** existing queue mechanism. +** Mutexes created using this macro can be accessed using the +** xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() +** macros. The xSemaphoreTake() and xSemaphoreGive() macros +** should not be used. +** A mutex used recursively can be 'taken' repeatedly by the +** owner. The mutex doesn't become available again until the +** owner has called xSemaphoreGiveRecursive() for each +** successful 'take' request. For example, if a task +** successfully 'takes' the same mutex 5 times then the mutex +** will not be available to any other task until it has also +** 'given' the mutex back exactly five times. +** This type of semaphore uses a priority inheritance mechanism +** so a task 'taking' a semaphore MUST ALWAYS 'give' the +** semaphore back once the semaphore it is no longer required. +** Mutex type semaphores cannot be used from within interrupt +** service routines. +** See vSemaphoreCreateBinary() for an alternative +** implementation that can be used for pure synchronisation +** (where one task or interrupt always 'gives' the semaphore +** and another always 'takes' the semaphore) and from within +** interrupt service routines. +** Parameters : None +** Returns : +** --- - Handle to the created mutex semaphore. +** Should be of type xSemaphoreHandle. +** =================================================================== +*/ +/* +xSemaphoreHandle McuRTOS_xSemaphoreCreateRecursiveMutex(void) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : vSemaphoreDelete (component FreeRTOS) +** +** Description : +** Delete a semaphore. This function must be used with care. +** For example, do not delete a mutex type semaphore if the +** mutex is held by a task. +** Parameters : +** NAME - DESCRIPTION +** xSemaphore - A handle to the semaphore to +** be deleted. +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_vSemaphoreDelete(xSemaphoreHandle xSemaphore) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : vTaskSuspend (component FreeRTOS) +** +** Description : +** Suspend any task. When suspended a task will never get any +** microcontroller processing time, no matter what its priority. +** Calls to vTaskSuspend are not accumulative - i.e. calling +** vTaskSuspend() twice on the same task still only requires +** one call to vTaskResume() to ready the suspended task. +** Parameters : +** NAME - DESCRIPTION +** pxTaskToSuspend - Handle to the task +** being suspended. Passing a NULL handle will +** cause the calling task to be suspended. +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_vTaskSuspend(xTaskHandle pxTaskToSuspend) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : vTaskResume (component FreeRTOS) +** +** Description : +** Resumes a suspended task. A task that has been suspended by +** one of more calls to vTaskSuspend() will be made available +** for running again by a single call to vTaskResume(). +** Parameters : +** NAME - DESCRIPTION +** pxTaskToResume - Handle to the task +** being readied. +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_vTaskResume(xTaskHandle pxTaskToResume) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xSemaphoreCreateMutex (component FreeRTOS) +** +** Description : +** Macro that creates a mutex semaphore by using the existing +** queue mechanism. +** Mutexes created using this macro can be accessed using the +** xSemaphoreTake() and xSemaphoreGive() macros. The +** xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() +** macros should not be used. +** Mutexes and binary semaphores are very similar but have some +** subtle differences: Mutexes include a priority inheritance +** mechanism, binary semaphores do not. This makes binary +** semaphores the better choice for implementing +** synchronisation (between tasks or between tasks and an +** interrupt), and mutexes the better choice for implementing +** simple mutual exclusion. +** The priority of a task that 'takes' a mutex can potentially +** be raised if another task of higher priority attempts to +** obtain the same mutex. The task that owns the mutex +** 'inherits' the priority of the task attempting to 'take' the +** same mutex. This means the mutex must always be 'given' back +** - otherwise the higher priority task will never be able to +** obtain the mutex, and the lower priority task will never +** 'disinherit' the priority. An example of a mutex being used +** to implement mutual exclusion is provided on the +** xSemaphoreTake() documentation page. +** A binary semaphore need not be given back once obtained, so +** task synchronisation can be implemented by one +** task/interrupt continuously 'giving' the semaphore while +** another continuously 'takes' the semaphore. This is +** demonstrated by the sample code on the +** xSemaphoreGiveFromISR() documentation page. +** Both mutex and binary semaphores are assigned to variables +** of type xSemaphoreHandle and can be used in any API function +** that takes a parameter of this type. +** Parameters : None +** Returns : +** --- - Handle to the created mutex semaphore. +** Should be of type xSemaphoreHandle. +** =================================================================== +*/ +/* +xSemaphoreHandle McuRTOS_xSemaphoreCreateMutex(void) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xSemaphoreTake (component FreeRTOS) +** +** Description : +** Macro to obtain a semaphore. The semaphore must have +** previously been created with a call to +** vSemaphoreCreateBinary(), xSemaphoreCreateMutex() or +** xSemaphoreCreateCounting(). +** This macro must not be called from an ISR. +** xQueueReceiveFromISR() can be used to take a semaphore from +** within an interrupt if required, although this would not be +** a normal operation. Semaphores use queues as their +** underlying mechanism, so functions are to some extent +** interoperable. +** xSemaphoreTake() is part of the fully featured intertask +** communications API. xSemaphoreAltTake() is the alternative +** API equivalent. Both versions require the same parameters +** and return the same values. +** Parameters : +** NAME - DESCRIPTION +** xMutex - A handle to the mutex being obtained. +** This is the handle returned by +** xSemaphoreCreateMutex(); +** xBlockTime - The time in ticks to wait +** for the semaphore to become available. The +** macro portTICK_RATE_MS can be used to +** convert this to a real time. A block time +** of zero can be used to poll the semaphore. +** If the task already owns the semaphore then +** xSemaphoreTakeRecursive() will return +** immediately no matter what the value of +** xBlockTime. Specifying the block time as +** portMAX_DELAY will cause the task to block +** indefinitely (without a timeout). +** Returns : +** --- - Returns pdTRUE if the semaphore was +** obtained. pdFALSE if xBlockTime expired +** without the semaphore becoming available. +** =================================================================== +*/ +/* +bool McuRTOS_xSemaphoreTake(xSemaphoreHandle xMutex, portTickType xBlockTime) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xSemaphoreGive (component FreeRTOS) +** +** Description : +** Macro to release a semaphore. The semaphore must have +** previously been created with a call to +** vSemaphoreCreateBinary(), xSemaphoreCreateMutex() or +** xSemaphoreCreateCounting(), and obtained using +** sSemaphoreTake(). +** This must not be used from an ISR. See +** xSemaphoreGiveFromISR() for an alternative which can be used +** from an ISR. +** This macro must also not be used on semaphores created using +** xSemaphoreCreateRecursiveMutex(). +** xSemaphoreGive() is part of the fully featured intertask +** communications API. xSemaphoreAltGive() is the alternative +** API equivalent. Both versions require the same parameters +** and return the same values. +** Parameters : +** NAME - DESCRIPTION +** xMutex - A handle to the mutex being released, +** or 'given'. This is the handle returned by +** xSemaphoreCreateMutex(); +** Returns : +** --- - Returns pdTRUE if the semaphore was given. +** =================================================================== +*/ +/* +bool McuRTOS_xSemaphoreGive(xSemaphoreHandle xMutex) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : vSemaphoreCreateBinary (component FreeRTOS) +** +** Description : +** Macro that creates a semaphore by using the existing queue +** mechanism. The queue length is 1 as this is a binary +** semaphore. The data size is 0 as we don't want to actually +** store any data - we just want to know if the queue is empty +** or full. +** Binary semaphores and mutexes are very similar but have some +** subtle differences: Mutexes include a priority inheritance +** mechanism, binary semaphores do not. This makes binary +** semaphores the better choice for implementing +** synchronisation (between tasks or between tasks and an +** interrupt), and mutexes the better choice for implementing +** simple mutual exclusion. +** This old vSemaphoreCreateBinary() macro is now deprecated in +** favour of the xSemaphoreCreateBinary() function. Note that +** binary semaphores created using the vSemaphoreCreateBinary() +** macro are created in a state such that the first call to +** 'take' the semaphore would pass, whereas binary semaphores +** created using xSemaphoreCreateBinary() are created in a +** state such that the the semaphore must first be 'given' +** before it can be 'taken'. +** A binary semaphore need not be given back once obtained, so +** task synchronisation can be implemented by one +** task/interrupt continuously 'giving' the semaphore while +** another continuously 'takes' the semaphore. This is +** demonstrated by the sample code on the +** xSemaphoreGiveFromISR() documentation page. +** The priority of a task that 'takes' a mutex can potentially +** be raised if another task of higher priority attempts to +** obtain the same mutex. The task that owns the mutex +** 'inherits' the priority of the task attempting to 'take' the +** same mutex. This means the mutex must always be 'given' back +** - otherwise the higher priority task will never be able to +** obtain the mutex, and the lower priority task will never +** 'disinherit' the priority. An example of a mutex being used +** to implement mutual exclusion is provided on the +** xSemaphoreTake() documentation page. +** Both mutex and binary semaphores are assigned to variables +** of type xSemaphoreHandle and can be used in any API function +** that takes a parameter of this type. +** Parameters : +** NAME - DESCRIPTION +** xSemaphore - Handle to the created +** semaphore. Should be of type +** xSemaphoreHandle. +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_vSemaphoreCreateBinary(xSemaphoreHandle xSemaphore) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xSemaphoreCreateCounting (component FreeRTOS) +** +** Description : +** Macro that creates a counting semaphore by using the +** existing queue mechanism. +** Counting semaphores are typically used for two things: +** 1. Counting events. +** In this usage scenario an event handler will 'give' a +** semaphore each time an event occurs (incrementing the +** semaphore count value), and a handler task will 'take' a +** semaphore each time it processes an event (decrementing the +** semaphore count value). The count value is therefore the +** difference between the number of events that have occurred +** and the number that have been processed. In this case it is +** desirable for the initial count value to be zero. +** 2. Resource management. +** In this usage scenario the count value indicates the number +** of resources available. To obtain control of a resource a +** task must first obtain a semaphore - decrementing the +** semaphore count value. When the count value reaches zero +** there are no free resources. When a task finishes with the +** resource it 'gives' the semaphore back - incrementing the +** semaphore count value. In this case it is desirable for the +** initial count value to be equal to the maximum count value, +** indicating that all resources are free. +** Parameters : +** NAME - DESCRIPTION +** uxMaxCount - The maximum count value that +** can be reached. When the semaphore reaches +** this value it can no longer be 'given'. +** uxInitialCount - The count value +** assigned to the semaphore when it is +** created. +** Returns : +** --- - xSemaphoreHandle handle +** =================================================================== +*/ +/* +xSemaphoreHandle McuRTOS_xSemaphoreCreateCounting(unsigned_portBASE_TYPE uxMaxCount, unsigned_portBASE_TYPE uxInitialCount) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xSemaphoreGiveFromISR (component FreeRTOS) +** +** Description : +** Macro to release a semaphore. The semaphore must have +** previously been created with a call to +** vSemaphoreCreateBinary() or xSemaphoreCreateCounting(). +** Mutex type semaphores (those created using a call to +** xSemaphoreCreateMutex()) must not be used with this macro. +** This macro can be used from an ISR. +** Parameters : +** NAME - DESCRIPTION +** xSemaphore - A handle to the semaphore +** being released. This is the handle returned +** when the semaphore was created. +** * pxHigherPriorityTaskWoken +** - xSemaphoreGiveFromISR() will set +** *pxHigherPriorityTaskWoken to pdTRUE if +** giving the semaphoree caused a task to +** unblock, and the unblocked task has a +** priority higher than the currently running +** task. If xSemaphoreGiveFromISR() sets this +** value to pdTRUE then a context switch +** should be requested before the interrupt is +** exited. +** Returns : +** --- - Returns pdTRUE if the semaphore was given. +** =================================================================== +*/ +/* +bool McuRTOS_xSemaphoreGiveFromISR(xSemaphoreHandle xSemaphore, signed_portBASE_TYPE *pxHigherPriorityTaskWoken) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : vTaskList (component FreeRTOS) +** +** Description : +** configUSE_TRACE_FACILITY, INCLUDE_vTaskDelete and +** INCLUDE_vTaskSuspend must all be defined as 1 for this +** function to be available. See the configuration section for +** more information. +** NOTE: This function will disable interrupts for its duration. +** It is not intended for normal application runtime use but as +** a debug aid. Lists all the current tasks, along with their +** current state and stack usage high water mark. +** Tasks are reported as blocked ('B'), ready ('R'), deleted +** ('D') or suspended ('S'). +** Parameters : +** NAME - DESCRIPTION +** * pcWriteBuffer - Pointer to buffer. A +** buffer into which the above mentioned +** details will be written, in ascii form. +** This buffer is assumed to be large enough +** to contain the generated report. +** Approximately 40 bytes per task should be +** sufficient. +** bufSize - size of buffer +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_vTaskList(signed portCHAR *pcWriteBuffer, size_t bufSize) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : pvPortMalloc (component FreeRTOS) +** +** Description : +** Allocates a memory block using the port pvPortMalloc() +** function +** Parameters : +** NAME - DESCRIPTION +** xWantedSize - size of memory block +** requested +** Returns : +** --- - memory block or NULL if failed +** =================================================================== +*/ +/* +pVoid McuRTOS_pvPortMalloc(size_t xWantedSize) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : vPortFree (component FreeRTOS) +** +** Description : +** Frees a memory block previously allocated with pvPortMalloc() +** Parameters : +** NAME - DESCRIPTION +** * pv - Pointer to data +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_vPortFree(void *pv) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTaskGetTickCount (component FreeRTOS) +** +** Description : +** Return the count of ticks since vTaskStartScheduler was +** called. +** Parameters : None +** Returns : +** --- - tick count +** =================================================================== +*/ +/* +portTickType McuRTOS_xTaskGetTickCount(void) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTaskGetSchedulerState (component FreeRTOS) +** +** Description : +** Returns the state of the scheduler +** Parameters : None +** Returns : +** --- - One of the following constants (defined +** within task.h): taskSCHEDULER_NOT_STARTED, +** taskSCHEDULER_RUNNING, +** taskSCHEDULER_SUSPENDED. +** =================================================================== +*/ +/* +portBASE_TYPE McuRTOS_xTaskGetSchedulerState(void) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : uxTaskGetStackHighWaterMark (component FreeRTOS) +** +** Description : +** The stack used by a task will grow and shrink as the task +** executes and interrupts are processed. +** uxTaskGetStackHighWaterMark() returns the minimum amount of +** remaining stack space that was available to the task since +** the task started executing - that is the amount of stack +** that remained unused when the task stack was at its greatest +** (deepest) value. This is what is referred to as the stack +** 'high water mark'. +** Parameters : +** NAME - DESCRIPTION +** xTask - The handle of the task being queried. +** A task may query its own high water mark by +** passing NULL as the xTask parameter. +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +unsigned_portBASE_TYPE McuRTOS_uxTaskGetStackHighWaterMark(xTaskHandle xTask) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : uxTaskGetNumberOfTasks (component FreeRTOS) +** +** Description : +** Returns the number of tasks +** Parameters : None +** Returns : +** --- - number of tasks +** =================================================================== +*/ +/* +unsigned_portBASE_TYPE McuRTOS_uxTaskGetNumberOfTasks(void) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : vTaskGetRunTimeStats (component FreeRTOS) +** +** Description : +** configGENERATE_RUN_TIME_STATS must be defined as 1 for this +** function to be available. The application must also then +** provide definitions for +** portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and +** portGET_RUN_TIME_COUNTER_VALUE to configure a peripheral +** timer/counter and return the timers current count value +** respectively. The counter should be at least 10 times the +** frequency of the tick count. +** NOTE: This function will disable interrupts for its duration. +** It is not intended for normal application runtime use but as +** a debug aid. +** Setting configGENERATE_RUN_TIME_STATS to 1 will result in a +** total accumulated execution time being stored for each task. +** The resolution of the accumulated time value depends on the +** frequency of the timer configured by the +** portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro. Calling +** vTaskGetRunTimeStats() writes the total execution time of +** each task into a buffer, both as an absolute count value and +** as a percentage of the total system execution time. +** Parameters : +** NAME - DESCRIPTION +** pcWriteBuffer - A buffer into which +** the execution times will be written, in +** ascii form. This buffer is assumed to be +** large enough to contain the generated +** report. Approximately 40 bytes per task +** should be sufficient. +** bufSize - size of buffer +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_vTaskGetRunTimeStats(portCHAR *pcWriteBuffer, size_t bufSize) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xPortGetFreeHeapSize (component FreeRTOS) +** +** Description : +** Returns the actual free size of the heap +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +Tsize_t McuRTOS_xPortGetFreeHeapSize(void) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xQueueCreate (component FreeRTOS) +** +** Description : +** Creates a queue. +** Parameters : +** NAME - DESCRIPTION +** uxQueueLength - The maximum number of +** items the queue can hold at any time. +** uxItemSize - The size in bytes of each +** item the queue will hold. +** Returns : +** --- - A handle to the created queue is returned +** provided the queue was created successfully. +** NULL is returned if the queue cannot be +** created because there is too little heap +** RAM available. +** =================================================================== +*/ +/* +xQueueHandle McuRTOS_xQueueCreate(unsigned_portBASE_TYPE uxQueueLength, unsigned_portBASE_TYPE uxItemSize) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xQueueSendToFront (component FreeRTOS) +** +** Description : +** Sends an item to the front of a queue. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue to which the +** data is to be sent. +** pvItemToQueue - A pointer to the data +** to be sent to the queue. The size of the +** data that can be sent to a queue was +** defined when the queue was created. +** xTicksToWait - The number of ticks for +** which the calling task should be held in +** the Blocked state to wait for space to +** become available on the queue should the +** queue already be full. +** A value of zero will prevent the calling +** task from entering the Blocked state. +** If INCLUDE_vTaskSuspend is set to 1 then a +** value of portMAX_DELAY will hold the task +** in the Blocked state indefinitely to wait +** for space to become available on the queue. +** Returns : +** --- - pdPASS: Data was successfully sent to the +** queue. If a block time was specified then +** the calling task may have been temporarily +** placed into the Blocked state to wait for +** space to become available and space did +** become available before the block time +** expired. +** errQUEUE_FULL: The queue is already full so +** no data could be sent to the queue. If a +** block time was specified then the calling +** task may have been temporarily placed into +** the Blocked state to wait for space to +** become available, but no space became +** available before the block time expired. +** =================================================================== +*/ +/* +portBASE_TYPE McuRTOS_xQueueSendToFront(xQueueHandle xQueue, const void *pvItemToQueue, portTickType xTicksToWait) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xQueueSendToBack (component FreeRTOS) +** +** Description : +** Sends an item to the back of a queue. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue to which the +** data is to be sent. +** pvItemToQueue - A pointer to the data +** to be sent to the queue. The size of the +** data that can be sent to a queue was +** defined when the queue was created. +** xTicksToWait - The number of ticks for +** which the calling task should be held in +** the Blocked state to wait for space to +** become available on the queue should the +** queue already be full. +** A value of zero will prevent the calling +** task from entering the Blocked state. +** If INCLUDE_vTaskSuspend is set to 1 then a +** value of portMAX_DELAY will hold the task +** in the Blocked state indefinitely to wait +** for space to become available on the queue. +** Returns : +** --- - pdPASS: Data was successfully sent to the +** queue. If a block time was specified then +** the calling task may have been temporarily +** placed into the Blocked state to wait for +** space to become available and space did +** become available before the block time +** expired. +** errQUEUE_FULL: The queue is already full so +** no data could be sent to the queue. If a +** block time was specified then the calling +** task may have been temporarily placed into +** the Blocked state to wait for space to +** become available, but no space became +** available before the block time expired. +** =================================================================== +*/ +/* +portBASE_TYPE McuRTOS_xQueueSendToBack(xQueueHandle xQueue, const void *pvItemToQueue, portTickType xTicksToWait) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xQueueReceive (component FreeRTOS) +** +** Description : +** Receives an item from a queue. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue from which +** the data is to be received. +** pvBuffer - A pointer to the memory into +** which the data received from the queue will +** be copied. +** The length of the buffer must be at least +** equal to the queue item size (set when the +** queue was created). +** xTicksToWait - The number of ticks for +** which the calling task should be held in +** the Blocked state to wait for data to +** become available from the queue should the +** queue already be empty. +** A value of zero will prevent the calling +** task from entering the Blocked state. +** If INCLUDE_vTaskSuspend is set to 1 then a +** value of portMAX_DELAY will hold the task +** in the Blocked state indefinitely to wait +** for data. +** Returns : +** --- - pdPASS: Data was successfully read from +** the queue. If a block time was specified +** then the calling task may have been +** temporarily placed into the Blocked state +** to wait for data to become available and +** data did become available before the block +** time expired. +** errQUEUE_EMPTY: The queue was empty so no +** date could be read form the queue. If a +** block time was specified then the calling +** task may have been temporarily placed into +** the Blocked state to wait for data to +** become available, but no data became +** available before the block time expired. +** =================================================================== +*/ +/* +portBASE_TYPE McuRTOS_xQueueReceive(xQueueHandle xQueue, void *pvBuffer, portTickType xTicksToWait) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xQueuePeek (component FreeRTOS) +** +** Description : +** Reads an item from a queue, but does not remove the item +** from the queue. Therefore the same item would be returned +** the next time xQueueReceive() or xQueuePeek() was called on +** the same queue. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue from which +** the data is to be read. +** pvBuffer - A pointer to the memory into +** which the data read from the queue will be +** copied. The length of the buffer must be at +** least equal to the queue item size (set +** when the queue was created). +** xTicksToWait - The number of ticks for +** which the calling task should be held in +** the Blocked state to wait for data to +** become available from the queue should the +** queue already be empty. +** A value of zero will prevent the calling +** task from entering the Blocked state. +** If INCLUDE_vTaskSuspend is set to 1 then a +** value of portMAX_DELAY will hold the task +** in the Blocked state indefinitely to wait +** for data. +** Returns : +** --- - pdPASS: Data was successfully read from +** the queue. If a block time was specified +** then the calling task may have been +** temporarily placed into the Blocked state +** to wait for data to become available and +** data did become available before the block +** time expired. +** errQUEUE_EMPTY: The queue was empty so no +** date could be read form the queue. If a +** block time was specified then the calling +** task may have been temporarily placed into +** the Blocked state to wait for data to +** become available, but no data became +** available before the block time expired. +** =================================================================== +*/ +/* +portBASE_TYPE McuRTOS_xQueuePeek(xQueueHandle xQueue, void *pvBuffer, portTickType xTicksToWait) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : vQueueDelete (component FreeRTOS) +** +** Description : +** Deletes a queue that was previously created using a call to +** xQueueCreate(). vQueueDelete() can also be used to delete a +** semaphore. +** Parameters : +** NAME - DESCRIPTION +** pxQueueToDelete - The handle of the +** queue being deleted. Semaphore handles can +** also be used. Queues are used to pass data +** between tasks and between tasks and +** interrupts. A queue/semaphore must not be +** deleted if there are any tasks that are +** blocked on the queue/semaphore waiting for +** events (sends or receives). +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_vQueueDelete(xQueueHandle pxQueueToDelete) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : uxQueueMessagesWaiting (component FreeRTOS) +** +** Description : +** Queries the number of items that are currently held within a +** queue. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue being +** queried. +** Returns : +** --- - The number of items that are held within +** the queue being queried. +** =================================================================== +*/ +/* +unsigned_portBASE_TYPE McuRTOS_uxQueueMessagesWaiting(xQueueHandle xQueue) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : uxQueueMessagesWaitingfromISR (component FreeRTOS) +** +** Description : +** A version of uxQueueMessagesWaiting() that can be used from +** inside an interrupt service routine. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue being +** queried. +** Returns : +** --- - The number of items that are held within +** the queue being queried. +** =================================================================== +*/ +/* +unsigned_portBASE_TYPE McuRTOS_uxQueueMessagesWaitingfromISR(xQueueHandle xQueue) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xQueueReceiveFromISR (component FreeRTOS) +** +** Description : +** A version of xQueueReceive() that can be called from an ISR. +** Unlike xQueueReceive(), xQueueReceiveFromISR() does not +** permit a block time to be specified. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue from which +** the data is to be received. +** pvBuffer - A pointer to the memory into +** which the data received from the queue will +** be copied.The length of the buffer must be +** at least equal to the queue item size (set +** when the queue was created). +** * pxHigherPriorityTaskWoken +** - Pointer to A task may be blocked waiting +** for space to become available on the queue. +** If xQueueReceiveFromISR() causes such a +** task to unblock then +** *pxHigherPriorityTaskWoken will get set to +** pdTRUE, otherwise +** *pxHigherPriorityTaskWoken will remain +** unchanged. +** Returns : +** --- - pdPASS: Data was successfully read from +** the queue. If a block time was specified +** then the calling task may have been +** temporarily placed into the Blocked state +** to wait for data to become available and +** data did become available before the block +** time expired. +** errQUEUE_EMPTY: The queue was empty so no +** date could be read form the queue. If a +** block time was specified then the calling +** task may have been temporarily placed into +** the Blocked state to wait for data to +** become available, but no data became +** available before the block time expired. +** =================================================================== +*/ +/* +portBASE_TYPE McuRTOS_xQueueReceiveFromISR(xQueueHandle xQueue, void *pvBuffer, portBASE_TYPE *pxHigherPriorityTaskWoken) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xQueueSendToFrontFromISR (component FreeRTOS) +** +** Description : +** Versions of xQueueSendToFront() API functions that can be +** called from an ISR. Unlike xQueueSendToFront() these +** functions do not permit a block time to be specified. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue to which the +** data is to be sent. +** pvItemToQueue - A pointer to the data +** to be sent to the queue. The size of the +** data that can be sent to a queue was +** defined when the queue was created. +** * pxHigherPriorityTaskWoken +** - xQueueSendFromISR() will set +** *pxHigherPriorityTaskWoken to pdTRUE if +** sending to the queue caused a task to +** unblock, and the unblocked task has a +** priority higher than the currently running +** task. If xQueueSendFromISR() sets this +** value to pdTRUE then a context switch +** should be performed before the interrupt is +** exited. +** Returns : +** --- - pdTRUE Data was successfully sent to the +** queue. +** errQUEUE_FULL Data could not be sent to the +** queue because the queue was already full. +** =================================================================== +*/ +/* +portBASE_TYPE McuRTOS_xQueueSendToFrontFromISR(xQueueHandle xQueue, const void *pvItemToQueue, portBASE_TYPE *pxHigherPriorityTaskWoken) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xQueueSendToBackFromISR (component FreeRTOS) +** +** Description : +** Versions of xQueueSendToBack() API functions that can be +** called from an ISR. Unlike xQueueSendToBack() these +** functions do not permit a block time to be specified. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue to which the +** data is to be sent. +** pvItemToQueue - A pointer to the data +** to be sent to the queue. The size of the +** data that can be sent to a queue was +** defined when the queue was created. +** * pxHigherPriorityTaskWoken +** - xQueueSendFromISR() will set +** *pxHigherPriorityTaskWoken to pdTRUE if +** sending to the queue caused a task to +** unblock, and the unblocked task has a +** priority higher than the currently running +** task. If xQueueSendFromISR() sets this +** value to pdTRUE then a context switch +** should be performed before the interrupt is +** exited. +** Returns : +** --- - pdTRUE Data was successfully sent to the +** queue. +** errQUEUE_FULL Data could not be sent to the +** queue because the queue was already full. +** =================================================================== +*/ +/* +portBASE_TYPE McuRTOS_xQueueSendToBackFromISR(xQueueHandle xQueue, const void *pvItemToQueue, portBASE_TYPE *pxHigherPriorityTaskWoken) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ +/* +** =================================================================== +** Method : xQueueReset (component FreeRTOS) +** +** Description : +** Reset a queue back to its original empty state. pdPASS is +** returned if the queue is successfully reset. pdFAIL is +** returned if the queue could not be reset because there are +** tasks blocked on the queue waiting to either receive from +** the queue or send to the queue. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue to reset. +** Returns : +** --- - pdPASS is returned if the queue is +** successfully reset. pdFAIL is returned if +** the queue could not be reset because there +** are tasks blocked on the queue waiting to +** either receive from the queue or send to +** the queue. +** =================================================================== +*/ +/* +portBASE_TYPE McuRTOS_xQueueReset(xQueueHandle xQueue) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xSemaphoreGetMutexHolder (component FreeRTOS) +** +** Description : +** Returns the holder of a mutex or semaphore. If xMutex is +** indeed a mutex type semaphore, return the current mutex +** holder. If xMutex is not a mutex type semaphore, or the +** mutex is available (not held by a task), return NULL. Note: +** This Is is a good way of determining if the calling task is +** the mutex holder, but not a good way of determining the +** identity of the mutex holder as the holder may change +** between the function exiting and the returned value being +** tested. +** Parameters : +** NAME - DESCRIPTION +** xSemaphore - A handle to the semaphore. +** Returns : +** --- - Not NULL if the calling task is the holder +** of the mutex, NULL otherwise. +** =================================================================== +*/ +/* +void* McuRTOS_xSemaphoreGetMutexHolder(xSemaphoreHandle xSemaphore) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xSemaphoreTakeFromISR (component FreeRTOS) +** +** Description : +** Macro to take a semaphore from an ISR. The semaphore must +** have previously been created with a call to +** vSemaphoreCreateBinary() or xSemaphoreCreateCounting(). +** Mutex type semaphores (those created using a call to +** xSemaphoreCreateMutex()) must not be used with this macro. +** This macro can be used from an ISR, however taking a +** semaphore from an ISR is not a common operation. It is +** likely to only be useful when taking a counting semaphore +** when an interrupt is obtaining an object from a resource +** pool (when the semaphore count indicates the number of +** resources available). +** Parameters : +** NAME - DESCRIPTION +** xSemaphore - A handle to the semaphore +** being taken. This is the handle returned +** when the semaphore was created. +** * pxHigherPriorityTaskWoken +** - xSemaphoreTakeFromISR() will set +** *pxHigherPriorityTaskWoken to pdTRUE if +** taking the semaphore caused a task to +** unblock, and the unblocked task has a +** priority higher than the currently running +** task. If xSemaphoreTakeFromISR() sets this +** value to pdTRUE then a context switch +** should be requested before the interrupt is +** exited. +** Returns : +** --- - Returns pdTRUE if the semaphore was given. +** =================================================================== +*/ +/* +bool McuRTOS_xSemaphoreTakeFromISR(xSemaphoreHandle xSemaphore, signed_portBASE_TYPE *pxHigherPriorityTaskWoken) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : ParseCommand (component FreeRTOS) +** +** Description : +** Shell Command Line Parser +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command string +** * handled - Pointer to variable which tells if +** the command has been handled or not +** * io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ +#if configUSE_SHELL +uint8_t McuRTOS_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) +{ + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, "McuRTOS help")==0) { + *handled = TRUE; + return PrintHelp(io); + } else if ((McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) || (McuUtility_strcmp((char*)cmd, "McuRTOS status")==0)) { + *handled = TRUE; + return PrintStatus(io); + } else if (McuUtility_strcmp((char*)cmd, "McuRTOS tasklist")==0) { + *handled = TRUE; + return PrintTaskList(io); + } + return ERR_OK; +} +#endif + +/* +** =================================================================== +** Method : Init (component FreeRTOS) +** +** Description : +** Low level initialization routine called from startup code. +** This method ensures that the tick timer is not enabled. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuRTOS_Init(void) +{ +#if !McuLib_CONFIG_CPU_IS_ESP32 + portDISABLE_ALL_INTERRUPTS(); /* disable all interrupts, they get enabled in vStartScheduler() */ +#endif +#if configSYSTICK_USE_LOW_POWER_TIMER && McuLib_CONFIG_CPU_IS_KINETIS + /* enable clocking for low power timer, otherwise vPortStopTickTimer() will crash. + Additionally, Percepio trace needs access to the timer early on. */ + #if McuLib_CONFIG_NXP_SDK_USED + CLOCK_EnableClock(kCLOCK_Lptmr0); + #else /* Processor Expert */ + SIM_PDD_SetClockGate(SIM_BASE_PTR, SIM_PDD_CLOCK_GATE_LPTMR0, PDD_ENABLE); + #endif +#endif +#if !McuLib_CONFIG_CPU_IS_ESP32 + vPortStopTickTimer(); /* tick timer shall not run until the RTOS scheduler is started */ +#endif +#if configUSE_PERCEPIO_TRACE_HOOKS + McuPercepio_Startup(); /* Startup Percepio Trace. Need to do this before calling any RTOS functions. */ +#endif +} + +/* +** =================================================================== +** Method : xTaskGetCurrentTaskHandle (component FreeRTOS) +** +** Description : +** The handle of the currently running (calling) task. +** Parameters : None +** Returns : +** --- - The handle of the currently running +** (calling) task. +** =================================================================== +*/ +/* +xTaskHandle McuRTOS_xTaskGetCurrentTaskHandle(void) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTaskGetIdleTaskHandle (component FreeRTOS) +** +** Description : +** The task handle associated with the Idle task. The Idle task +** is created automatically when the RTOS scheduler is started. +** Parameters : None +** Returns : +** --- - The task handle associated with the Idle +** task. The Idle task is created +** automatically when the RTOS scheduler is +** started. +** =================================================================== +*/ +/* +xTaskHandle McuRTOS_xTaskGetIdleTaskHandle(void) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : eTaskGetState (component FreeRTOS) +** +** Description : +** Returns as an enumerated type the state in which a task +** existed at the time eTaskGetState() was executed. +** Parameters : +** NAME - DESCRIPTION +** xTask - The handle of the subject task (the +** task being queried). +** Returns : +** --- - task state (eReady, eRunning, eBlocked, +** eSuspended, eDeleted) +** =================================================================== +*/ +/* +eTaskState McuRTOS_eTaskGetState(xTaskHandle xTask) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : pcTaskGetTaskName (component FreeRTOS) +** +** Description : +** Returns the name of the task. +** Parameters : +** NAME - DESCRIPTION +** xTaskToQuery - The handle of the task +** being queried. xTaskToQuery can be set to +** NULL to query the name of the calling task. +** Returns : +** --- - A pointer to the subject tasks name, which +** is a standard NULL terminated C string +** =================================================================== +*/ +/* +signed char McuRTOS_pcTaskGetTaskName(xTaskHandle xTaskToQuery) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTaskGetTickCountFromISR (component FreeRTOS) +** +** Description : +** A version of xTaskGetTickCount() that can be called from an +** ISR. +** Parameters : None +** Returns : +** --- - The count of ticks since +** vTaskStartScheduler was called. +** =================================================================== +*/ +/* +portTickType McuRTOS_xTaskGetTickCountFromISR(void) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : vTaskStepTick (component FreeRTOS) +** +** Description : +** If the RTOS is configured to use tickless idle +** functionality then the tick interrupt will be stopped, and +** the microcontroller placed into a low power state, whenever +** the Idle task is the only task able to execute. Upon exiting +** the low power state the tick count value must be corrected +** to account for the time that passed while it was stopped. +** If a FreeRTOS port includes a default +** portSUPPRESS_TICKS_AND_SLEEP() implementation, then +** vTaskStepTick() is used internally to ensure the correct +** tick count value is maintained. vTaskStepTick() is a public +** API function to allow the default +** portSUPPRESS_TICKS_AND_SLEEP() implementation to be +** overridden, and for a portSUPPRESS_TICKS_AND_SLEEP() to be +** provided if the port being used does not provide a default. +** Parameters : +** NAME - DESCRIPTION +** xTicksToJump - The number of RTOS ticks +** that have passed since the tick interrupt +** was stopped. For correct operation the +** parameter must be less than or equal to the +** portSUPPRESS_TICKS_AND_SLEEP() parameter. +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_vTaskStepTick(portTickType xTicksToJump) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xQueuePeekFromISR (component FreeRTOS) +** +** Description : +** A version of xQueuePeek() that can be used from an interrupt +** service routine (ISR). Reads an item from a queue, but does +** not remove the item from the queue. Therefore the same item +** would be returned the next time xQueueReceive() or +** xQueuePeek() was called on the same queue. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue from which +** the data is to be read. +** pvBuffer - A pointer to the memory into +** which the data read from the queue will be +** copied. The length of the buffer must be at +** least equal to the queue item size (set +** when the queue was created). +** xTicksToWait - The number of ticks for +** which the calling task should be held in +** the Blocked state to wait for data to +** become available from the queue should the +** queue already be empty. +** A value of zero will prevent the calling +** task from entering the Blocked state. +** If INCLUDE_vTaskSuspend is set to 1 then a +** value of portMAX_DELAY will hold the task +** in the Blocked state indefinitely to wait +** for data. +** Returns : +** --- - pdPASS: Data was successfully read from +** the queue. If a block time was specified +** then the calling task may have been +** temporarily placed into the Blocked state +** to wait for data to become available and +** data did become available before the block +** time expired. +** errQUEUE_EMPTY: The queue was empty so no +** date could be read form the queue. If a +** block time was specified then the calling +** task may have been temporarily placed into +** the Blocked state to wait for data to +** become available, but no data became +** available before the block time expired. +** =================================================================== +*/ +/* +portBASE_TYPE McuRTOS_xQueuePeekFromISR(xQueueHandle xQueue, void *pvBuffer, portTickType xTicksToWait) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xQueueOverwrite (component FreeRTOS) +** +** Description : +** This is a macro that calls the xQueueGenericSend() function. +** A version of xQueueSendToBack() that will write to the queue +** even if the queue is full, overwriting data that is already +** held in the queue. xQueueOverwrite() is intended for use +** with queues that have a length of one, meaning the queue is +** either empty or full. This function must not be called from +** an interrupt service routine (ISR). See +** xQueueOverwriteFromISR() for an alternative which may be +** used in an ISR. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue to which the +** data is to be sent. +** pvItemToQueue - A pointer to the data +** to be sent to the queue. The size of the +** data that can be sent to a queue was +** defined when the queue was created. +** Returns : +** --- - pdPASS: Data was successfully sent to the +** queue. If a block time was specified then +** the calling task may have been temporarily +** placed into the Blocked state to wait for +** space to become available and space did +** become available before the block time +** expired. +** errQUEUE_FULL: The queue is already full so +** no data could be sent to the queue. If a +** block time was specified then the calling +** task may have been temporarily placed into +** the Blocked state to wait for space to +** become available, but no space became +** available before the block time expired. +** =================================================================== +*/ +/* +portBASE_TYPE McuRTOS_xQueueOverwrite(xQueueHandle xQueue, const void *pvItemToQueue) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xQueueOverwriteFromISR (component FreeRTOS) +** +** Description : +** This is a macro that calls the xQueueGenericSendFromISR() +** function. A version of xQueueOverwrite() that can be used in +** an ISR. xQueueOverwriteFromISR() is similar to +** xQueueSendToBackFromISR(), but will write to the queue even +** if the queue is full, overwriting data that is already held +** in the queue. xQueueOverwriteFromISR() is intended for use +** with queues that have a length of one, meaning the queue is +** either empty or full. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue to which the +** data is to be sent. +** pvItemToQueue - A pointer to the data +** to be sent to the queue. The size of the +** data that can be sent to a queue was +** defined when the queue was created. +** * pxHigherPriorityTaskWoken +** - xQueueSendFromISR() will set +** *pxHigherPriorityTaskWoken to pdTRUE if +** sending to the queue caused a task to +** unblock, and the unblocked task has a +** priority higher than the currently running +** task. If xQueueSendFromISR() sets this +** value to pdTRUE then a context switch +** should be performed before the interrupt is +** exited. +** Returns : +** --- - pdTRUE Data was successfully sent to the +** queue. +** errQUEUE_FULL Data could not be sent to the +** queue because the queue was already full. +** =================================================================== +*/ +/* +portBASE_TYPE McuRTOS_xQueueOverwriteFromISR(xQueueHandle xQueue, const void *pvItemToQueue, portBASE_TYPE *pxHigherPriorityTaskWoken) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : vQueueAddToRegistry (component FreeRTOS) +** +** Description : +** Assigns a name to a queue and adds the queue to the registry. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue being added +** to the registry. +** * pcQueueName - Pointer to the name to be +** assigned to the queue. This is just a text +** string used to facilitate debugging. +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_vQueueAddToRegistry(xQueueHandle xQueue, char *pcQueueName) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : vQueueUnregisterQueue (component FreeRTOS) +** +** Description : +** Removes a queue from the queue registry. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue being +** removed from the registry. +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_vQueueUnregisterQueue(xQueueHandle xQueue) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xQueueIsQueueFullFromISR (component FreeRTOS) +** +** Description : +** Queries a queue to determine if the queue is full. This +** function should only be used in an ISR. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue being +** queried. +** Returns : +** --- - pdFALSE if the queue is not full, or any +** other value if the queue is full. +** =================================================================== +*/ +/* +portBASE_TYPE McuRTOS_xQueueIsQueueFullFromISR(xQueueHandle xQueue) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xQueueIsQueueEmptyFromISR (component FreeRTOS) +** +** Description : +** Queries a queue to determine if the queue is empty. This +** function should only be used in an ISR. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue being +** queried. +** Returns : +** --- - pdFALSE if the queue is not empty, or any +** other value if the queue is empty. +** =================================================================== +*/ +/* +portBASE_TYPE McuRTOS_xQueueIsQueueEmptyFromISR(xQueueHandle xQueue) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xQueueAddToSet (component FreeRTOS) +** +** Description : +** Adds an RTOS queue or semaphore to a queue set that was +** previously created by a call to xQueueCreateSet(). +** Parameters : +** NAME - DESCRIPTION +** xQueueOrSemaphore - The handle of +** the queue or semaphore being added to the +** queue set (cast to an xQueueSetMemberHandle +** type). +** xQueueSet - The handle of the queue set to +** which the queue or semaphore is being added. +** Returns : +** --- - If the queue or semaphore was successfully +** added to the queue set then pdPASS is +** returned. If the queue could not be +** successfully added to the queue set because +** it is already a member of a different queue +** set then pdFAIL is returned. +** =================================================================== +*/ +/* +portBASE_TYPE McuRTOS_xQueueAddToSet(xQueueSetMemberHandle xQueueOrSemaphore, xQueueSetHandle xQueueSet) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xQueueCreateSet (component FreeRTOS) +** +** Description : +** Queue sets provide a mechanism to allow an RTOS task to +** block (pend) on a read operation from multiple RTOS queues +** or semaphores simultaneously. Note that there are simpler +** alternatives to using queue sets. See the Blocking on +** Multiple Objects page for more information. +** Parameters : +** NAME - DESCRIPTION +** uxEventQueueLength - +** Returns : +** --- - If the queue set is created successfully +** then a handle to the created queue set is +** returned. Otherwise NULL is returned. +** =================================================================== +*/ +/* +xQueueSetHandle McuRTOS_xQueueCreateSet(unsigned portBASE_TYPE uxEventQueueLength) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xQueueRemoveFromSet (component FreeRTOS) +** +** Description : +** Remove an RTOS queue or semaphore from a queue set. An RTOS +** queue or semaphore can only be removed from a queue set if +** the queue or semaphore is empty. +** Parameters : +** NAME - DESCRIPTION +** xQueueOrSemaphore - The handle of +** the queue or semaphore being removed from +** the queue set (cast to an +** xQueueSetMemberHandle type). +** xQueueSet - The handle of the queue set in +** which the queue or semaphore is included. +** Returns : +** --- - If the queue or semaphore was successfully +** added to the queue set then pdPASS is +** returned. If the queue could not be +** successfully added to the queue set because +** it is already a member of a different queue +** set then pdFAIL is returned. +** =================================================================== +*/ +/* +portBASE_TYPE McuRTOS_xQueueRemoveFromSet(xQueueSetMemberHandle xQueueOrSemaphore, xQueueSetHandle xQueueSet) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xQueueSelectFromSet (component FreeRTOS) +** +** Description : +** xQueueSelectFromSet() selects from the members of a queue +** set a queue or semaphore that either contains data (in the +** case of a queue) or is available to take (in the case of a +** semaphore). xQueueSelectFromSet() effectively allows a task +** to block (pend) on a read operation on all the queues and +** semaphores in a queue set simultaneously. +** Parameters : +** NAME - DESCRIPTION +** xQueueSet - The queue set on which the +** task will (potentially) block. +** xBlockTimeTicks - The maximum time, +** in ticks, that the calling task will remain +** in the Blocked state (with other tasks +** executing) to wait for a member of the +** queue set to be ready for a successful +** queue read or semaphore take operation. +** Returns : +** --- - xQueueSelectFromSet() will return the +** handle of a queue (cast to a +** xQueueSetMemberHandle type) contained in +** the queue set that contains data, or the +** handle of a semaphore (cast to a +** xQueueSetMemberHandle type) contained in +** the queue set that is available, or NULL if +** no such queue or semaphore exists before +** before the specified block time expires. +** =================================================================== +*/ +/* +xQueueSetMemberHandle McuRTOS_xQueueSelectFromSet(xQueueSetHandle xQueueSet, portTickType xBlockTimeTicks) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xQueueSelectFromSetFromISR (component FreeRTOS) +** +** Description : +** A version of xQueueSelectFromSet() that can be used from an +** interrupt service routine (ISR). +** Parameters : +** NAME - DESCRIPTION +** xQueueSet - The queue set being queried. +** It is not possible to block on a read as +** this function is designed to be used from +** an interrupt. +** Returns : +** --- - xQueueSelectFromSet() will return the +** handle of a queue (cast to a +** xQueueSetMemberHandle type) contained in +** the queue set that contains data, or the +** handle of a semaphore (cast to a +** xQueueSetMemberHandle type) contained in +** the queue set that is available, or NULL if +** no such queue or semaphore exists before +** before the specified block time expires. +** =================================================================== +*/ +/* +xQueueSetMemberHandle McuRTOS_xQueueSelectFromSetFromISR(xQueueSetHandle xQueueSet) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xEventGroupCreate (component FreeRTOS) +** +** Description : +** Create a new RTOS event group. This function cannot be +** called from an interrupt. +** Event groups are stored in variables of type +** EventGroupHandle_t. The number of bits (or flags) +** implemented within an event group is 8 if +** configUSE_16_BIT_TICKS is set to 1, or 24 if +** configUSE_16_BIT_TICKS is set to 0. The dependency on +** configUSE_16_BIT_TICKS results from the data type used for +** thread local storage in the internal implementation of RTOS +** tasks. +** Parameters : None +** Returns : +** --- - Event Group Handle. If the event group was +** created then a handle to the event group is +** returned. If there was insufficient +** FreeRTOS heap available to create the event +** group then NULL is returned. +** =================================================================== +*/ +/* +EventGroupHandle_t McuRTOS_xEventGroupCreate(void) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xEventGroupWaitBits (component FreeRTOS) +** +** Description : +** Read bits within an RTOS event group, optionally entering +** the Blocked state (with a timeout) to wait for a bit or +** group of bits to become set. This function cannot be called +** from an interrupt. +** Parameters : +** NAME - DESCRIPTION +** xEventGroup - The event group in which +** the bits are being tested. The event group +** must have previously been created using a +** call to xEventGroupCreate(). +** uxBitsToWaitFor - A bitwise value +** that indicates the bit or bits to test +** inside the event group. For example, to +** wait for bit 0 and/or bit 2 set +** uxBitsToWaitFor to 0x05. To wait for bits 0 +** and/or bit 1 and/or bit 2 set +** uxBitsToWaitFor to 0x07. Etc. +** uxBitsToWaitFor must not be set to 0. +** xClearOnExit - If xClearOnExit is set +** to pdTRUE then any bits set in the value +** passed as the uxBitsToWaitFor parameter +** will be cleared in the event group before +** xEventGroupWaitBits() returns if +** xEventGroupWaitBits() returns for any +** reason other than a timeout. The timeout +** value is set by the xTicksToWait parameter. +** If xClearOnExit is set to pdFALSE then the +** bits set in the event group are not altered +** when the call to xEventGroupWaitBits() +** returns. +** xWaitForAllBits - xWaitForAllBits is +** used to create either a logical AND test +** (where all bits must be set) or a logical +** OR test (where one or more bits must be set) +** as follows: +** If xWaitForAllBits is set to pdTRUE then +** xEventGroupWaitBits() will return when +** either all the bits set in the value passed +** as the uxBitsToWaitFor parameter are set in +** the event group or the specified block time +** expires. +** If xWaitForAllBits is set to pdFALSE then +** xEventGroupWaitBits() will return when any +** of the bits set in the value passed as the +** uxBitsToWaitFor parameter are set in the +** event group or the specified block time +** expires. +** xTicksToWait - The maximum amount of +** time (specified in 'ticks') to wait for +** one/all (depending on the xWaitForAllBits +** value) of the bits specified by +** uxBitsToWaitFor to become set. +** Returns : +** --- - EventBits_t: The value of the event group +** at the time either the event bits being +** waited for became set, or the block time +** expired. The current value of the event +** bits in an event group will be different to +** the returned value if a higher priority +** task or interrupt changed the value of an +** event bit between the calling task leaving +** the Blocked state and exiting the +** xEventGroupWaitBits() function. +** Test the return value to know which bits +** were set. If xEventGroupWaitBits() returned +** because its timeout expired then not all +** the bits being waited for will be set. If +** xEventGroupWaitBits() returned because the +** bits it was waiting for were set then the +** returned value is the event group value +** before any bits were automatically cleared +** because the xClearOnExit parameter was set +** to pdTRUE. +** =================================================================== +*/ +/* +byte McuRTOS_xEventGroupWaitBits(const EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xEventGroupSetBits (component FreeRTOS) +** +** Description : +** Set bits (flags) within an RTOS event group. This function +** cannot be called from an interrupt. +** xEventGroupSetBitsFromISR() is a version that can be called +** from an interrupt. +** Setting bits in an event group will automatically unblock +** tasks that are blocked waiting for the bits. +** Parameters : +** NAME - DESCRIPTION +** xEventGroup - The event group in which +** the bits are to be set. The event group +** must have previously been created using a +** call to xEventGroupCreate(). +** uxBitsToSet - A bitwise value that +** indicates the bit or bits to set in the +** event group. For example, set uxBitsToSet +** to 0x08 to set only bit 3. Set uxBitsToSet +** to 0x09 to set bit 3 and bit 0. +** Returns : +** --- - The value of the event group at the time +** the call to xEventGroupSetBits() returns. +** There are two reasons why the returned +** value might have the bits specified by the +** uxBitsToSet parameter cleared: +** If setting a bit results in a task that was +** waiting for the bit leaving the blocked +** state then it is possible the bit will have +** been cleared automatically (see the +** xClearBitOnExit parameter of +** xEventGroupWaitBits()). +** Any unblocked (or otherwise Ready state) +** task that has a priority above that of the +** task that called xEventGroupSetBits() will +** execute and may change the event group +** value before the call to +** xEventGroupSetBits() returns. +** =================================================================== +*/ +/* +EventBits_t McuRTOS_xEventGroupSetBits(EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xEventGroupSetBitsFromISR (component FreeRTOS) +** +** Description : +** Set bits (flags) within an RTOS event group. A version of +** xEventGroupSetBits() that can be called from an interrupt +** service routine (ISR). +** Setting bits in an event group will automatically unblock +** tasks that are blocked waiting for the bits. +** Setting bits in an event group is not a deterministic +** operation because there are an unknown number of tasks that +** may be waiting for the bit or bits being set. FreeRTOS does +** not allow non-deterministic operations to be performed in +** interrupts or from critical sections. Therefore +** xEventGroupSetBitFromISR() sends a message to the RTOS +** daemon task to have the set operation performed in the +** context of the daemon task - where a scheduler lock is used +** in place of a critical section. +** INCLUDE_xEventGroupSetBitFromISR, configUSE_TIMERS and +** INCLUDE_xTimerPendFunctionCall must all be set to 1 in +** FreeRTOSConfig.h for the xEventGroupSetBitsFromISR() +** function to be available. +** Parameters : +** NAME - DESCRIPTION +** xEventGroup - The event group in which +** the bits are to be set. The event group +** must have previously been created using a +** call to xEventGroupCreate(). +** uxBitsToSet - A bitwise value that +** indicates the bit or bits to set in the +** event group. For example, set uxBitsToSet +** to 0x08 to set only bit 3. Set uxBitsToSet +** to 0x09 to set bit 3 and bit 0. +** pxHigherPriorityTaskWoken +** - Calling this function will result in a +** message being sent to the RTOS daemon task. +** If the priority of the daemon task is +** higher than the priority of the currently +** running task (the task the interrupt +** interrupted) then +** *pxHigherPriorityTaskWoken will be set to +** pdTRUE by xEventGroupSetBitsFromISR(), +** indicating that a context switch should be +** requested before the interrupt exits. For +** that reason *pxHigherPriorityTaskWoken must +** be initialised to pdFALSE. See the example +** code below. +** Returns : +** --- - The value of the event group at the time +** the call to xEventGroupSetBits() returns. +** There are two reasons why the returned +** value might have the bits specified by the +** uxBitsToSet parameter cleared: +** If setting a bit results in a task that was +** waiting for the bit leaving the blocked +** state then it is possible the bit will have +** been cleared automatically (see the +** xClearBitOnExit parameter of +** xEventGroupWaitBits()). +** Any unblocked (or otherwise Ready state) +** task that has a priority above that of the +** task that called xEventGroupSetBits() will +** execute and may change the event group +** value before the call to +** xEventGroupSetBits() returns. +** =================================================================== +*/ +/* +EventBits_t McuRTOS_xEventGroupSetBitsFromISR(EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet , BaseType_t *pxHigherPriorityTaskWoken) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xEventGroupClearBits (component FreeRTOS) +** +** Description : +** Clear bits (flags) within an RTOS event group. This function +** cannot be called from an interrupt. See +** xEventGroupClearBitsFromISR() for a version that can be +** called from an interrupt. +** Parameters : +** NAME - DESCRIPTION +** xEventGroup - The event group in which +** the bits are to be cleared. The event group +** must have previously been created using a +** call to xEventGroupCreate(). +** uxBitsToSet - A bitwise value that +** indicates the bit or bits to clear in the +** event group. For example set uxBitsToClear +** to 0x08 to clear just bit 3. Set +** uxBitsToClear to 0x09 to clear bit 3 and +** bit 0. +** Returns : +** --- - The value of the event group at the time +** the call to xEventGroupSetBits() returns. +** There are two reasons why the returned +** value might have the bits specified by the +** uxBitsToSet parameter cleared: +** If setting a bit results in a task that was +** waiting for the bit leaving the blocked +** state then it is possible the bit will have +** been cleared automatically (see the +** xClearBitOnExit parameter of +** xEventGroupWaitBits()). +** Any unblocked (or otherwise Ready state) +** task that has a priority above that of the +** task that called xEventGroupSetBits() will +** execute and may change the event group +** value before the call to +** xEventGroupSetBits() returns. +** =================================================================== +*/ +/* +EventBits_t McuRTOS_xEventGroupClearBits(EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xEventGroupClearBitsFromISR (component FreeRTOS) +** +** Description : +** A version of xEventGroupClearBits() that can be called from +** an interrupt. +** Parameters : +** NAME - DESCRIPTION +** xEventGroup - The event group in which +** the bits are to be set. The event group +** must have previously been created using a +** call to xEventGroupCreate(). +** uxBitsToSet - A bitwise value that +** indicates the bit or bits to set in the +** event group. For example, set uxBitsToSet +** to 0x08 to set only bit 3. Set uxBitsToSet +** to 0x09 to set bit 3 and bit 0. +** Returns : +** --- - The value of the event group at the time +** the call to xEventGroupSetBits() returns. +** There are two reasons why the returned +** value might have the bits specified by the +** uxBitsToSet parameter cleared: +** If setting a bit results in a task that was +** waiting for the bit leaving the blocked +** state then it is possible the bit will have +** been cleared automatically (see the +** xClearBitOnExit parameter of +** xEventGroupWaitBits()). +** Any unblocked (or otherwise Ready state) +** task that has a priority above that of the +** task that called xEventGroupSetBits() will +** execute and may change the event group +** value before the call to +** xEventGroupSetBits() returns. +** =================================================================== +*/ +/* +EventBits_t McuRTOS_xEventGroupClearBitsFromISR(EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xEventGroupGetBits (component FreeRTOS) +** +** Description : +** Returns the current value of the event bits (event flags) in +** an RTOS event group. This function cannot be used from an +** interrupt. See xEventGroupsGetBitsFromISR() for a version +** that can be used in an interrupt. +** Parameters : +** NAME - DESCRIPTION +** xEventGroup - The event group being +** queried. The event group must have +** previously been created using a call to +** xEventGroupCreate(). +** Returns : +** --- - The value of the event bits in the event +** group at the time xEventGroupGetBits() was +** called. +** =================================================================== +*/ +/* +EventBits_t McuRTOS_xEventGroupGetBits(EventGroupHandle_t xEventGroup) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xEventGroupGetBitsFromISR (component FreeRTOS) +** +** Description : +** A version of xEventGroupGetBits() that can be called from an +** interrupt. +** Parameters : +** NAME - DESCRIPTION +** xEventGroup - The event group being +** queried. The event group must have +** previously been created using a call to +** xEventGroupCreate(). +** Returns : +** --- - The value of the event bits in the event +** group at the time xEventGroupGetBits() was +** called. +** =================================================================== +*/ +/* +EventBits_t McuRTOS_xEventGroupGetBitsFromISR(EventGroupHandle_t xEventGroup) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xEventGroupSync (component FreeRTOS) +** +** Description : +** Atomically set bits (flags) within an RTOS event group, +** then wait for a combination of bits to be set within the +** same event group. This functionality is typically used to +** synchronise multiple tasks (often called a task rendezvous), +** where each task has to wait for the other tasks to reach a +** synchronisation point before proceeding. +** This function cannot be used from an interrupt. +** The function will return before its block time expires if +** the bits specified by the uxBitsToWait parameter are set, or +** become set within that time. In this case all the bits +** specified by uxBitsToWait will be automatically cleared +** before the function returns. +** Parameters : +** NAME - DESCRIPTION +** xEventGroup - The event group in which +** the bits are being set and tested. The +** event group must have previously been +** created using a call to xEventGroupCreate(). +** uxBitsToSet - The bit or bits to set in +** the event group before determining if (and +** possibly waiting for), all the bits +** specified by the uxBitsToWait parameter are +** set. For example, set uxBitsToSet to 0x04 +** to set bit 2 within the event group. +** uxBitsToWaitFor - A bitwise value +** that indicates the bit or bits to test +** inside the event group. For example, set +** uxBitsToWaitFor to 0x05 to wait for bits 0 +** and bit 2. Set uxBitsToWaitFor to 0x07 to +** wait for bit 0 and bit 1 and bit 2. Etc. +** xTicksToWait - The maximum amount of +** time (specified in 'ticks') to wait for all +** the bits specified by the uxBitsToWaitFor +** parameter value to become set. +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +EventBits_t McuRTOS_xEventGroupSync(EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTimerCreate (component FreeRTOS) +** +** Description : +** Creates a new software timer instance. This allocates the +** storage required by the new timer, initialises the new +** timers internal state, and returns a handle by which the new +** timer can be referenced. +** Parameters : +** NAME - DESCRIPTION +** pcTimerName - +** Atextnamethatisassignedtothetimer_Thisisdone +** purelytoassistdebugging_TheRTOSkernelitselfo +** nlyeverreferencesatimerbyitshandle_andneverb +** yitsname_ +** xTimerPeriod - The timer period. The +** time is defined in tick periods so the +** constant portTICK_PERIOD_MS can be used to +** convert a time that has been specified in +** milliseconds. For example, if the timer +** must expire after 100 ticks, then +** xTimerPeriod should be set to 100. +** Alternatively, if the timer must expire +** after 500ms, then xPeriod can be set to ( +** 500 / portTICK_PERIOD_MS ) provided +** configTICK_RATE_HZ is less than or equal to +** 1000. +** uxAutoReload - If uxAutoReload is set +** to pdTRUE, then the timer will expire +** repeatedly with a frequency set by the +** xTimerPeriod parameter. If uxAutoReload is +** set to pdFALSE, then the timer will be a +** one-shot and enter the dormant state after +** it expires. +** pvTimerID - An identifier that is assigned +** to the timer being created. Typically this +** would be used in the timer callback +** function to identify which timer expired +** when the same callback function is assigned +** to more than one timer. +** pxCallbackFunction - The function +** to call when the timer expires. Callback +** functions must have the prototype defined +** by TimerCallbackFunction_t, which is "void +** vCallbackFunction( TimerHandle_t xTimer );". +** Returns : +** --- - Timer handle. If the timer is successfully +** created then a handle to the newly created +** timer is returned. If the timer cannot be +** created (because either there is +** insufficient FreeRTOS heap remaining to +** allocate the timer structures, or the timer +** period was set to 0) then NULL is returned. +** =================================================================== +*/ +/* +TimerHandle_t McuRTOS_xTimerCreate(const char * const pcTimerName, const TickType_t xTimerPeriod, const UBaseType_t uxAutoReload, void *const pvTimerID, TimerCallbackFunction_t pxCallbackFunction) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTimerIsTimerActive (component FreeRTOS) +** +** Description : +** Queries a timer to see if it is active or dormant. +** A timer will be dormant if: +** It has been created but not started, or +** It is an expired one-shot timer that has not been restarted. +** Timers are created in the dormant state. The xTimerStart(), +** xTimerReset(), xTimerStartFromISR(), xTimerResetFromISR(), +** xTimerChangePeriod() and xTimerChangePeriodFromISR() API +** functions can all be used to transition a timer into the +** active state. +** Parameters : +** NAME - DESCRIPTION +** xTimer - The timer being queried. +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +BaseType_t McuRTOS_xTimerIsTimerActive(TimerHandle_t xTimer) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTimerStart (component FreeRTOS) +** +** Description : +** Timer functionality is provided by a timer service/daemon +** task. Many of the public FreeRTOS timer API functions send +** commands to the timer service task through a queue called +** the timer command queue. The timer command queue is private +** to the RTOS kernel itself and is not directly accessible to +** application code. The length of the timer command queue is +** set by the configTIMER_QUEUE_LENGTH configuration constant. +** xTimerStart() starts a timer that was previously created +** using the xTimerCreate() API function. If the timer had +** already been started and was already in the active state, +** then xTimerStart() has equivalent functionality to the +** xTimerReset() API function. +** Starting a timer ensures the timer is in the active state. +** If the timer is not stopped, deleted, or reset in the mean +** time, the callback function associated with the timer will +** get called 'n 'ticks after xTimerStart() was called, where +** 'n' is the timers defined period. +** It is valid to call xTimerStart() before the RTOS scheduler +** has been started, but when this is done the timer will not +** actually start until the RTOS scheduler is started, and the +** timers expiry time will be relative to when the RTOS +** scheduler is started, not relative to when xTimerStart() was +** called. +** The configUSE_TIMERS configuration constant must be set to 1 +** for xTimerStart() to be available. +** Parameters : +** NAME - DESCRIPTION +** xTimer - The handle of the timer being +** started/restarted. +** xBlockTime - Specifies the time, in ticks, +** that the calling task should be held in the +** Blocked state to wait for the start command +** to be successfully sent to the timer +** command queue, should the queue already be +** full when xTimerStart() was called. +** xBlockTime is ignored if xTimerStart() is +** called before the RTOS scheduler is started. +** Returns : +** --- - pdFAIL will be returned if the start +** command could not be sent to the timer +** command queue even after xBlockTime ticks +** had passed. pdPASS will be returned if the +** command was successfully sent to the timer +** command queue. When the command is actually +** processed will depend on the priority of +** the timer service/daemon task relative to +** other tasks in the system, although the +** timers expiry time is relative to when +** xTimerStart() is actually called. The timer +** service/daemon task priority is set by the +** configTIMER_TASK_PRIORITY configuration +** constant. +** =================================================================== +*/ +/* +BaseType_t McuRTOS_xTimerStart(TimerHandle_t xTimer, TickType_t xBlockTime) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTimerStop (component FreeRTOS) +** +** Description : +** Timer functionality is provided by a timer service/daemon +** task. Many of the public FreeRTOS timer API functions send +** commands to the timer service task through a queue called +** the timer command queue. The timer command queue is private +** to the RTOS kernel itself and is not directly accessible to +** application code. The length of the timer command queue is +** set by the configTIMER_QUEUE_LENGTH configuration constant. +** xTimerStop() stops a timer that was previously started using +** either of the xTimerStart(), xTimerReset(), +** xTimerStartFromISR(), xTimerResetFromISR(), +** xTimerChangePeriod() and xTimerChangePeriodFromISR() API +** functions. +** Stopping a timer ensures the timer is not in the active +** state. +** The configUSE_TIMERS configuration constant must be set to 1 +** for xTimerStop() to be available. +** Parameters : +** NAME - DESCRIPTION +** xTimer - The handle of the timer being +** stopped. +** xBlockTime - Specifies the time, in ticks, +** that the calling task should be held in the +** Blocked state to wait for the stop command +** to be successfully sent to the timer +** command queue, should the queue already be +** full when xTimerStop() was called. +** xBlockTime is ignored if xTimerStop() is +** called before the RTOS scheduler is started. +** Returns : +** --- - pdFAIL will be returned if the stop +** command could not be sent to the timer +** command queue even after xBlockTime ticks +** had passed. pdPASS will be returned if the +** command was successfully sent to the timer +** command queue. When the command is actually +** processed will depend on the priority of +** the timer service/daemon task relative to +** other tasks in the system. The timer +** service/daemon task priority is set by the +** configTIMER_TASK_PRIORITY configuration +** constant. +** =================================================================== +*/ +/* +BaseType_t McuRTOS_xTimerStop(TimerHandle_t xTimer, TickType_t xBlockTime) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTimerChangePeriod (component FreeRTOS) +** +** Description : +** Timer functionality is provided by a timer service/daemon +** task. Many of the public FreeRTOS timer API functions send +** commands to the timer service task through a queue called +** the timer command queue. The timer command queue is private +** to the RTOS kernel itself and is not directly accessible to +** application code. The length of the timer command queue is +** set by the configTIMER_QUEUE_LENGTH configuration constant. +** xTimerChangePeriod() changes the period of a timer that was +** previously created using the xTimerCreate() API function. +** xTimerChangePeriod() can be called to change the period of +** an active or dormant state timer. +** The configUSE_TIMERS configuration constant must be set to 1 +** for xTimerChangePeriod() to be available. +** Parameters : +** NAME - DESCRIPTION +** xTimer - The handle of the timer that is +** having its period changed. +** xNewPeriod - The new period for xTimer. +** Timer periods are specified in tick periods, +** so the constant portTICK_PERIOD_MS can be +** used to convert a time that has been +** specified in milliseconds. For example, if +** the timer must expire after 100 ticks, then +** xNewPeriod should be set to 100. +** Alternatively, if the timer must expire +** after 500ms, then xNewPeriod can be set to +** ( 500 / portTICK_PERIOD_MS ) provided +** configTICK_RATE_HZ is less than or equal to +** 1000. +** xBlockTime - Specifies the time, in ticks, +** that the calling task should be held in the +** Blocked state to wait for the change period +** command to be successfully sent to the +** timer command queue, should the queue +** already be full when xTimerChangePeriod() +** was called. xBlockTime is ignored if +** xTimerChangePeriod() is called before the +** RTOS scheduler is started. +** Returns : +** --- - pdFAIL will be returned if the change +** period command could not be sent to the +** timer command queue even after xBlockTime +** ticks had passed. pdPASS will be returned +** if the command was successfully sent to the +** timer command queue. When the command is +** actually processed will depend on the +** priority of the timer service/daemon task +** relative to other tasks in the system. The +** timer service/daemon task priority is set +** by the configTIMER_TASK_PRIORITY +** configuration constant. +** =================================================================== +*/ +/* +BaseType_t McuRTOS_xTimerChangePeriod(TimerHandle_t xTimer, TickType_t xNewPeriod, TickType_t xBlockTime) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTimerDelete (component FreeRTOS) +** +** Description : +** Timer functionality is provided by a timer service/daemon +** task. Many of the public FreeRTOS timer API functions send +** commands to the timer service task through a queue called +** the timer command queue. The timer command queue is private +** to the RTOS kernel itself and is not directly accessible to +** application code. The length of the timer command queue is +** set by the configTIMER_QUEUE_LENGTH configuration constant. +** xTimerDelete() deletes a timer that was previously created +** using the xTimerCreate() API function. +** The configUSE_TIMERS configuration constant must be set to 1 +** for xTimerDelete() to be available. +** Parameters : +** NAME - DESCRIPTION +** xTimer - The handle of the timer being +** deleted. +** xBlockTime - Specifies the time, in ticks, +** that the calling task should be held in the +** Blocked state to wait for the delete +** command to be successfully sent to the +** timer command queue, should the queue +** already be full when xTimerDelete() was +** called. xBlockTime is ignored if +** xTimerDelete() is called before the RTOS +** scheduler is started. +** Returns : +** --- - pdFAIL will be returned if the delete +** command could not be sent to the timer +** command queue even after xBlockTime ticks +** had passed. pdPASS will be returned if the +** command was successfully sent to the timer +** command queue. When the command is actually +** processed will depend on the priority of +** the timer service/daemon task relative to +** other tasks in the system. The timer +** service/daemon task priority is set by the +** configTIMER_TASK_PRIORITY configuration +** constant. +** =================================================================== +*/ +/* +BaseType_t McuRTOS_xTimerDelete(TickType_t xTimer, TickType_t xBlockTime) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTimerReset (component FreeRTOS) +** +** Description : +** Timer functionality is provided by a timer service/daemon +** task. Many of the public FreeRTOS timer API functions send +** commands to the timer service task through a queue called +** the timer command queue. The timer command queue is private +** to the RTOS kernel itself and is not directly accessible to +** application code. The length of the timer command queue is +** set by the configTIMER_QUEUE_LENGTH configuration constant. +** xTimerReset() re-starts a timer that was previously created +** using the xTimerCreate() API function. If the timer had +** already been started and was already in the active state, +** then xTimerReset() will cause the timer to re-evaluate its +** expiry time so that it is relative to when xTimerReset() was +** called. If the timer was in the dormant state then +** xTimerReset() has equivalent functionality to the +** xTimerStart() API function. +** Resetting a timer ensures the timer is in the active state. +** If the timer is not stopped, deleted, or reset in the mean +** time, the callback function associated with the timer will +** get called 'n' ticks after xTimerReset() was called, where +** 'n' is the timers defined period. +** It is valid to call xTimerReset() before the RTOS scheduler +** has been started, but when this is done the timer will not +** actually start until the RTOS scheduler is started, and the +** timers expiry time will be relative to when the RTOS +** scheduler is started, not relative to when xTimerReset() was +** called. +** The configUSE_TIMERS configuration constant must be set to 1 +** for xTimerReset() to be available. +** Parameters : +** NAME - DESCRIPTION +** xTimer - The handle of the timer being +** reset/started/restarted. +** xBlockTime - Specifies the time, in ticks, +** that the calling task should be held in the +** Blocked state to wait for the reset command +** to be successfully sent to the timer +** command queue, should the queue already be +** full when xTimerReset() was called. +** xBlockTime is ignored if xTimerReset() is +** called before the RTOS scheduler is started. +** Returns : +** --- - pdFAIL will be returned if the reset +** command could not be sent to the timer +** command queue even after xBlockTime ticks +** had passed. pdPASS will be returned if the +** command was successfully sent to the timer +** command queue. When the command is actually +** processed will depend on the priority of +** the timer service/daemon task relative to +** other tasks in the system, although the +** timers expiry time is relative to when +** xTimerReset() is actually called. The timer +** service/daemon task priority is set by the +** configTIMER_TASK_PRIORITY configuration +** constant. +** =================================================================== +*/ +/* +BaseType_t McuRTOS_xTimerReset(TimerHandle_t xTimer, TickType_t xBlockTime) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTimerStartFromISR (component FreeRTOS) +** +** Description : +** A version of xTimerStart() that can be called from an +** interrupt service routine. +** Parameters : +** NAME - DESCRIPTION +** xTimer - The handle of the timer being +** started/restarted. +** * pxHigherPriorityTaskWoken +** - The timer service/daemon task spends most +** of its time in the Blocked state, waiting +** for messages to arrive on the timer command +** queue. Calling xTimerStartFromISR() writes +** a message to the timer command queue, so +** has the potential to transition the timer +** service/daemon task out of the Blocked +** state. If calling xTimerStartFromISR() +** causes the timer service/daemon task to +** leave the Blocked state, and the timer +** service/ daemon task has a priority equal +** to or greater than the currently executing +** task (the task that was interrupted), then +** *pxHigherPriorityTaskWoken will get set to +** pdTRUE internally within the +** xTimerStartFromISR() function. If +** xTimerStartFromISR() sets this value to +** pdTRUE, then a context switch should be +** performed before the interrupt exits. +** Returns : +** --- - pdFAIL will be returned if the start +** command could not be sent to the timer +** command queue. pdPASS will be returned if +** the command was successfully sent to the +** timer command queue. When the command is +** actually processed will depend on the +** priority of the timer service/daemon task +** relative to other tasks in the system, +** although the timers expiry time is relative +** to when xTimerStartFromISR() is actually +** called. The timer service/daemon task +** priority is set by the +** configTIMER_TASK_PRIORITY configuration +** constant. +** =================================================================== +*/ +/* +BaseType_t McuRTOS_xTimerStartFromISR(TimerHandle_t xTimer, BaseType_t *pxHigherPriorityTaskWoken) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTimerStopFromISR (component FreeRTOS) +** +** Description : +** A version of xTimerStop() that can be called from an +** interrupt service routine. +** Parameters : +** NAME - DESCRIPTION +** xTimer - The handle of the timer being +** stopped. +** * pxHigherPriorityTaskWoken +** - The timer service/daemon task spends most +** of its time in the Blocked state, waiting +** for messages to arrive on the timer command +** queue. Calling xTimerStopFromISR() writes a +** message to the timer command queue, so has +** the potential to transition the timer +** service/daemon task out of the Blocked +** state. If calling xTimerStopFromISR() +** causes the timer service/daemon task to +** leave the Blocked state, and the timer +** service/ daemon task has a priority equal +** to or greater than the currently executing +** task (the task that was interrupted), then +** *pxHigherPriorityTaskWoken will get set to +** pdTRUE internally within the +** xTimerStopFromISR() function. If +** xTimerStopFromISR() sets this value to +** pdTRUE, then a context switch should be +** performed before the interrupt exits. +** Returns : +** --- - pdFAIL will be returned if the stop +** command could not be sent to the timer +** command queue. pdPASS will be returned if +** the command was successfully sent to the +** timer command queue. When the command is +** actually processed will depend on the +** priority of the timer service/daemon task +** relative to other tasks in the system. The +** timer service/daemon task priority is set +** by the configTIMER_TASK_PRIORITY +** configuration constant. +** =================================================================== +*/ +/* +BaseType_t McuRTOS_xTimerStopFromISR(TimerHandle_t xTimer, BaseType_t *pxHigherPriorityTaskWoken) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTimerChangePeriodFromISR (component FreeRTOS) +** +** Description : +** A version of xTimerChangePeriod() that can be called from an +** interrupt service routine. +** Parameters : +** NAME - DESCRIPTION +** xTimer - The handle of the timer that is +** having its period changed. +** xNewPeriod - The new period for xTimer. +** Timer periods are specified in tick periods, +** so the constant portTICK_PERIOD_MS can be +** used to convert a time that has been +** specified in milliseconds. For example, if +** the timer must expire after 100 ticks, then +** xNewPeriod should be set to 100. +** Alternatively, if the timer must expire +** after 500ms, then xNewPeriod can be set to +** ( 500 / portTICK_PERIOD_MS ) provided +** configTICK_RATE_HZ is less than or equal to +** 1000. +** * pxHigherPriorityTaskWoken +** - The timer service/daemon task spends most +** of its time in the Blocked state, waiting +** for messages to arrive on the timer command +** queue. Calling xTimerChangePeriodFromISR() +** writes a message to the timer command queue, +** so has the potential to transition the +** timer service/ daemon task out of the +** Blocked state. If calling +** xTimerChangePeriodFromISR() causes the +** timer service/daemon task to leave the +** Blocked state, and the timer service/daemon +** task has a priority equal to or greater +** than the currently executing task (the task +** that was interrupted), then +** *pxHigherPriorityTaskWoken will get set to +** pdTRUE internally within the +** xTimerChangePeriodFromISR() function. If +** xTimerChangePeriodFromISR() sets this value +** to pdTRUE, then a context switch should be +** performed before the interrupt exits. +** Returns : +** --- - pdFAIL will be returned if the command to +** change the timers period could not be sent +** to the timer command queue. pdPASS will be +** returned if the command was successfully +** sent to the timer command queue. When the +** command is actually processed will depend +** on the priority of the timer service/daemon +** task relative to other tasks in the system. +** The timer service/daemon task priority is +** set by the configTIMER_TASK_PRIORITY +** configuration constant. +** =================================================================== +*/ +/* +BaseType_t McuRTOS_xTimerChangePeriodFromISR(TimerHandle_t xTimer, TickType_t xNewPeriod, BaseType_t *pxHigherPriorityTaskWoken) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTimerResetFromISR (component FreeRTOS) +** +** Description : +** A version of xTimerReset() that can be called from an +** interrupt service routine. +** Parameters : +** NAME - DESCRIPTION +** xTimer - The handle of the timer that is to +** be started, reset, or restarted. +** * pxHigherPriorityTaskWoken +** - The timer service/daemon task spends most +** of its time in the Blocked state, waiting +** for messages to arrive on the timer command +** queue. Calling xTimerResetFromISR() writes +** a message to the timer command queue, so +** has the potential to transition the timer +** service/daemon task out of the Blocked +** state. If calling xTimerResetFromISR() +** causes the timer service/daemon task to +** leave the Blocked state, and the timer +** service/ daemon task has a priority equal +** to or greater than the currently executing +** task (the task that was interrupted), then +** *pxHigherPriorityTaskWoken will get set to +** pdTRUE internally within the +** xTimerResetFromISR() function. If +** xTimerResetFromISR() sets this value to +** pdTRUE then a context switch should be +** performed before the interrupt exits. +** Returns : +** --- - pdFAIL will be returned if the reset +** command could not be sent to the timer +** command queue. pdPASS will be returned if +** the command was successfully sent to the +** timer command queue. When the command is +** actually processed will depend on the +** priority of the timer service/daemon task +** relative to other tasks in the system, +** although the timers expiry time is relative +** to when xTimerResetFromISR() is actually +** called. The timer service/daemon task +** priority is set by the +** configTIMER_TASK_PRIORITY configuration +** constant. +** =================================================================== +*/ +/* +BaseType_t McuRTOS_xTimerResetFromISR(TimerHandle_t xTimer, BaseType_t *pxHigherPriorityTaskWoken) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : pvTimerGetTimerID (component FreeRTOS) +** +** Description : +** Returns the ID assigned to the timer. +** IDs are assigned to timers using the pvTimerID parameter of +** the call to xTimerCreate() that was used to create the timer. +** If the same callback function is assigned to multiple timers +** then the timer ID can be used within the callback function +** to identify which timer actually expired. +** Parameters : +** NAME - DESCRIPTION +** xTimer - The timer being queried. +** Returns : +** --- - The ID assigned to the timer being queried. +** =================================================================== +*/ +/* +void* McuRTOS_pvTimerGetTimerID(TimerHandle_t xTimer) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTimerGetTimerDaemonTaskHandle (component FreeRTOS) +** +** Description : +** INCLUDE_xTimerGetTimerDaemonTaskHandle and configUSE_TIMERS +** must both be set to 1 in FreeRTOSConfig.h for +** xTimerGetTimerDaemonTaskHandle() to be available. +** Parameters : None +** Returns : +** --- - Returns the task handle associated with +** the software timer daemon (or service) task. +** If configUSE_TIMERS is set to 1 in +** FreeRTOSConfig.h, then the timer daemon +** task is created automatically when the RTOS +** scheduler is started. +** =================================================================== +*/ +/* +TaskHandle_t McuRTOS_xTimerGetTimerDaemonTaskHandle(void) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : pcTimerGetTimerName (component FreeRTOS) +** +** Description : +** +** Parameters : +** NAME - DESCRIPTION +** xTimer - The handle of the timer being +** queried. +** Returns : +** --- - A pointer to the timer's name, which is a +** standard NULL terminated C string. +** =================================================================== +*/ +/* +char* McuRTOS_pcTimerGetTimerName(TimerHandle_t xTimer) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTimerPendFunctionCall (component FreeRTOS) +** +** Description : +** Used to pend the execution of a function to the RTOS daemon +** task (the timer service task, hence this function is +** pre-fixed with 'Timer'). +** Functions that can be deferred to the RTOS daemon task must +** have the following prototype: +** void vPendableFunction( void * pvParameter1, uint32_t +** ulParameter2 ); +** The pvParameter1 and ulParameter2 are provided for use by +** the application code. +** INCLUDE_xTimerPendFunctionCall() and configUSE_TIMERS must +** both be set to 1 for xTimerPendFunctionCall() to be +** available. +** Parameters : +** NAME - DESCRIPTION +** xFunctionToPend - The function to +** execute from the timer service/ daemon task. +** The function must conform to the +** PendedFunction_t prototype as shown above. +** * pvParameter1 - The value of the +** callback function's first parameter. The +** parameter has a void * type to allow it to +** be used to pass any type. For example, +** integer types can be cast to a void *, or +** the void * can be used to point to a +** structure. +** ulParameter2 - The value of the +** callback function's second parameter. +** xTicksToWait - Calling this function +** will result in a message being sent to the +** timer daemon task on a queue. xTicksToWait +** is the amount of time the calling task +** should remain in the Blocked state (so not +** using any processing time) for space to +** become available on the timer queue if the +** queue is found to be full. The length of +** the queue is set by the value of +** configTIMER_QUEUE_LENGTH in FreeRTOSConfig. +** h. +** Returns : +** --- - pdPASS is returned if the message was +** successfully sent to the RTOS timer daemon +** task, otherwise pdFALSE is returned. +** =================================================================== +*/ +/* +BaseType_t McuRTOS_xTimerPendFunctionCall(PendedFunction_t xFunctionToPend, void* pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTimerPendFunctionCallFromISR (component FreeRTOS) +** +** Description : +** Used from application interrupt service routines to defer +** the execution of a function to the RTOS daemon task (the +** timer service task, hence this function is implemented in +** timers.c and is prefixed with 'Timer'). +** Ideally an interrupt service routine (ISR) is kept as short +** as possible, but sometimes an ISR either has a lot of +** processing to do, or needs to perform processing that is not +** deterministic. In these cases xTimerPendFunctionCallFromISR() +** can be used to defer processing of a function to the RTOS +** daemon task. +** A mechanism is provided that allows the interrupt to return +** directly to the task that will subsequently execute the +** pended function. This allows the callback function to +** execute contiguously in time with the interrupt - just as if +** the callback had executed in the interrupt itself. +** Functions that can be deferred to the RTOS daemon task must +** have the following prototype: +** void vPendableFunction( void * pvParameter1, uint32_t +** ulParameter2 ); +** The pvParameter1 and ulParameter2 are provided for use by +** the application code. +** INCLUDE_xTimerPendFunctionCall() and configUSE_TIMERS must +** both be set to 1 for xTimerPendFunctionCallFromISR() to be +** available. +** Parameters : +** NAME - DESCRIPTION +** xFunctionToPend - The function to +** execute from the timer service/ daemon task. +** The function must conform to the +** PendedFunction_t prototype as shown above. +** * pvParameter1 - The value of the +** callback function's first parameter. The +** parameter has a void * type to allow it to +** be used to pass any type. For example, +** integer types can be cast to a void *, or +** the void * can be used to point to a +** structure. +** ulParameter2 - The value of the +** callback function's second parameter. +** * pxHigherPriorityTaskWoken +** - As mentioned above, calling +** xTimerPendFunctionCallFromISR() will result +** in a message being sent to the RTOS timer +** daemon task. If the priority of the daemon +** task (which is set using +** configTIMER_TASK_PRIORITY in FreeRTOSConfig. +** h) is higher than the priority of the +** currently running task (the task the +** interrupt interrupted) then +** *pxHigherPriorityTaskWoken will be set to +** pdTRUE within +** xTimerPendFunctionCallFromISR(), indicating +** that a context switch should be requested +** before the interrupt exits. For that reason +** *pxHigherPriorityTaskWoken must be +** initialised to pdFALSE. See the example +** code below. +** Returns : +** --- - pdPASS is returned if the message was +** successfully sent to the RTOS timer daemon +** task, otherwise pdFALSE is returned. +** =================================================================== +*/ +/* +BaseType_t McuRTOS_xTimerPendFunctionCallFromISR(PendedFunction_t xFunctionToPend, void* pvParameter1, uint32_t ulParameter2, BaseType_t *pxHigherPriorityTaskWoken) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTaskNotifyGive (component FreeRTOS) +** +** Description : +** Each RTOS task has a 32-bit notification value which is +** initialised to zero when the RTOS task is created. An RTOS +** task notification is an event sent directly to a task that +** can unblock the receiving task, and optionally update the +** receiving task's notification value. +** xTaskNotifyGive() is a macro intended for use when an RTOS +** task notification value is being used as a light weight and +** faster binary or counting semaphore alternative. FreeRTOS +** semaphores are given using the xSemaphoreGive() API function, +** xTaskNotifyGive() is the equivalent that instead uses the +** receiving RTOS task's notification value. +** When a task notification value is being used as a binary or +** counting semaphore equivalent then the task being notified +** should wait for the notification using the ulTaskNotifyTake() +** API function rather than the xTaskNotifyWait() API function. +** xTaskNotifyGive() must not be called from an interrupt +** service routine. Use vTaskNotifyGiveFromISR() instead. +** Parameters : +** NAME - DESCRIPTION +** xTaskToNotify - The handle of the RTOS +** task being notified, and having its +** notification value incremented. +** RTOS task handles are obtained using the +** pvCreatedTask parameter of the xTaskCreate() +** call used to create the task. +** The handle of the currently executing RTOS +** task is returned by the +** xTaskGetCurrentTaskHandle() API function. +** Returns : +** --- - xTaskNotifyGive() is a macro that calls +** xTaskNotify() with the eAction parameter +** set to eIncrement resulting in all calls +** returning pdPASS. +** =================================================================== +*/ +/* +BaseType_t McuRTOS_xTaskNotifyGive(TaskHandle_t xTaskToNotify) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : ulTaskNotifyTake (component FreeRTOS) +** +** Description : +** Each RTOS task has a 32-bit notification value which is +** initialised to zero when the RTOS task is created. An RTOS +** task notification is an event sent directly to a task that +** can unblock the receiving task, and optionally update the +** receiving task's notification value. +** ulTaskNotifyTake() is intended for use when a task +** notification is used as a faster and lighter weight binary +** or counting semaphore alternative. FreeRTOS semaphores are +** taken using the xSemaphoreTake() API function, +** ulTaskNotifyTake() is the equivalent that instead uses a +** task notification. +** When a task is using its notification value as a binary or +** counting semaphore other tasks and interrupts should send +** notifications to it using either the xTaskNotifyGive() macro, +** or the xTaskNotify() function with the function's eAction +** parameter set to eIncrement (the two are equivalent). +** ulTaskNotifyTake() can either clear the task's notification +** value to zero on exit, in which case the notification value +** acts like a binary semaphore, or decrement the task's +** notification value on exit, in which case the notification +** value acts more like a counting semaphore. +** An RTOS task can use ulTaskNotifyTake() to [optionally] +** block to wait for a the task's notification value to be +** non-zero. The task does not consume any CPU time while it is +** in the Blocked state. +** Where as xTaskNotifyWait() will return when a notification +** is pending, ulTaskNotifyTake() will return when the task's +** notification value is not zero, decrementing the task's +** notification value before it returns. +** Parameters : +** NAME - DESCRIPTION +** xClearCountOnExit - If an RTOS +** task notification is received and +** xClearCountOnExit is set to pdFALSE then +** the RTOS task's notification value is +** decremented before ulTaskNotifyTake() exits. +** This is equivalent to the value of a +** counting semaphore being decremented by a +** successful call to xSemaphoreTake(). +** If an RTOS task notification is received +** and xClearCountOnExit is set to pdTRUE then +** the RTOS task's notification value is reset +** to 0 before ulTaskNotifyTake() exits. This +** is equivalent to the value of a binary +** semaphore being left at zero (or empty, or +** 'not available') after a successful call to +** xSemaphoreTake(). +** xTicksToWait - The maximum time to wait +** in the Blocked state for a notification to +** be received if a notification is not +** already pending when ulTaskNotifyTake() is +** called. +** The RTOS task does not consume any CPU time +** when it is in the Blocked state. +** The time is specified in RTOS tick periods. +** The pdMS_TO_TICKS() macro can be used to +** convert a time specified in milliseconds +** into a time specified in ticks. +** Returns : +** --- - The value of the task's notification value +** before it is decremented or cleared (see +** the description of xClearCountOnExit). +** =================================================================== +*/ +/* +uint32_t McuRTOS_ulTaskNotifyTake(BaseType_t xClearCountOnExit, TickType_t xTicksToWait) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : vTaskNotifyGiveFromISR (component FreeRTOS) +** +** Description : +** A version of xTaskNotifyGive() that can be called from an +** interrupt service routine (ISR). +** Each RTOS task has a 32-bit notification value which is +** initialised to zero when the RTOS task is created. An RTOS +** task notification is an event sent directly to a task that +** can unblock the receiving task, and optionally update the +** receiving task's notification value. +** vTaskNotifyGiveFromISR() is a function intended for use when +** an RTOS task notification value is being used as a light +** weight and faster binary or counting semaphore alternative. +** FreeRTOS semaphores are given from an interrupt using the +** xSemaphoreGiveFromISR() API function, +** vTaskNotifyGiveFromISR() is the equivalent that instead uses +** the receiving RTOS task's notification value. +** When a task notification value is being used as a binary or +** counting semaphore equivalent then the task being notified +** should wait for the notification using the ulTaskNotifyTake() +** API function rather than the xTaskNotifyWait() API function. +** Parameters : +** NAME - DESCRIPTION +** xTaskToNotify - The handle of the RTOS +** task being notified, and having its +** notification value incremented. +** RTOS task handles are obtained using the +** pvCreatedTask parameter of the xTaskCreate() +** call used to create the task. +** The handle of the currently executing RTOS +** task is returned by the +** xTaskGetCurrentTaskHandle() API function. +** * pxHigherPriorityTaskWoken +** - *pxHigherPriorityTaskWoken must be +** initialised to 0. +** vTaskNotifyGiveFromISR() will set +** *pxHigherPriorityTaskWoken to pdTRUE if +** sending the notification caused a task to +** unblock, and the unblocked task has a +** priority higher than the currently running +** task. +** If vTaskNotifyGiveFromISR() sets this value +** to pdTRUE then a context switch should be +** requested before the interrupt is exited. +** See the example below. +** pxHigherPriorityTaskWoken is an optional +** parameter and can be set to NULL. +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_vTaskNotifyGiveFromISR(TaskHandle_t xTaskToNotify, BaseType_t *pxHigherPriorityTaskWoken) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTaskNotify (component FreeRTOS) +** +** Description : +** [If you are using RTOS task notifications to implement +** binary or counting semaphore type behaviour then use the +** simpler xTaskNotifyGive() API function instead of +** xTaskNotify()] +** Each RTOS task has a 32-bit notification value which is +** initialised to zero when the RTOS task is created. +** xTaskNotify() is used to send an event directly to and +** potentially unblock an RTOS task, and optionally update the +** receiving task's notification value in one of the following +** ways: +** - Write a 32-bit number to the notification value +** - Add one (increment) the notification value +** - Set one or more bits in the notification value +** - Leave the notification value unchanged +** This function must not be called from an interrupt service +** routine (ISR). Use xTaskNotifyFromISR() instead. +** Parameters : +** NAME - DESCRIPTION +** xTaskToNotify - The handle of the RTOS +** task being notified. This is the subject +** task. +** RTOS task handles are obtained using the +** pvCreatedTask parameter of the xTaskCreate() +** call used to create the task. +** The handle of the currently executing RTOS +** task is returned by the +** xTaskGetCurrentTaskHandle() API function. +** ulValue - Used to update the notification +** value of the subject task. See the +** description of the eAction parameter below. +** eAction - An enumerated type that can take +** one of the values documented in the table +** below in order to perform the associated +** action. +** - eNoAction: The subject task receives the +** event, but its notification value is not +** updated. In this case ulValue is not used. +** - eSetBits: The notification value of the +** subject task will be bitwise ORed with +** ulValue. For example, if ulValue is set to +** 0x01, then bit 0 will get set within the +** subject task's notification value. Likewise +** if ulValue is 0x04 then bit 2 will get set +** in the subject task's notification value. +** In this way the RTOS task notification +** mechanism can be used as a light weight +** alternative to an event group. +** - eIncrement: The notification value of +** the subject task will be incremented by one, +** making the call to xTaskNotify() equivalent +** to a call to xTaskNotifyGive(). In this +** case ulValue is not used. +** - eSetValueWithOverwrite: The notification +** value of the subject task is +** unconditionally set to ulValue. In this way +** the RTOS task notification mechanism is +** being used as a light weight alternative to +** xQueueOverwrite(). +** - eSetValueWithoutOverwrite: If the +** subject task does not already have a +** notification pending then its notification +** value will be set to ulValue. If the +** subject task already has a notification +** pending then its notification value is not +** updated as to do so would overwrite the +** previous value before it was used. In this +** case the call to xTaskNotify() fails and +** pdFALSE is returned. In this way the RTOS +** task notification mechanism is being used +** as a light weight alternative to +** xQueueSend() on a queue of length 1. +** Returns : +** --- - pdPASS is returned in all cases other than +** when eAction is set to +** eSetValueWithoutOverwrite and the subject +** task's notification value cannot be updated +** because the subject task already had a +** notification pending. +** =================================================================== +*/ +/* +BaseType_t McuRTOS_xTaskNotify(TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTaskNotifyFromISR (component FreeRTOS) +** +** Description : +** [If you are using RTOS task notifications to implement +** binary or counting semaphore type behaviour then use the +** simpler xTaskNotifyGive() API function instead of +** xTaskNotify()] +** A version of xTaskNotify() that can be called from an ISR. +** Each RTOS task has a 32-bit notification value which is +** initialised to zero when the RTOS task is created. +** xTaskNotify() is used to send an event directly to and +** potentially unblock an RTOS task, and optionally update the +** receiving task's notification value in one of the following +** ways: +** - Write a 32-bit number to the notification value +** - Add one (increment) the notification value +** - Set one or more bits in the notification value +** - Leave the notification value unchanged +** This function must not be called from an interrupt service +** routine (ISR). Use xTaskNotifyFromISR() instead. +** Parameters : +** NAME - DESCRIPTION +** xTaskToNotify - The handle of the RTOS +** task being notified. This is the subject +** task. +** RTOS task handles are obtained using the +** pvCreatedTask parameter of the xTaskCreate() +** call used to create the task. +** The handle of the currently executing RTOS +** task is returned by the +** xTaskGetCurrentTaskHandle() API function. +** ulValue - Used to update the notification +** value of the subject task. See the +** description of the eAction parameter below. +** eAction - An enumerated type that can take +** one of the values documented in the table +** below in order to perform the associated +** action. +** - eNoAction: The subject task receives the +** event, but its notification value is not +** updated. In this case ulValue is not used. +** - eSetBits: The notification value of the +** subject task will be bitwise ORed with +** ulValue. For example, if ulValue is set to +** 0x01, then bit 0 will get set within the +** subject task's notification value. Likewise +** if ulValue is 0x04 then bit 2 will get set +** in the subject task's notification value. +** In this way the RTOS task notification +** mechanism can be used as a light weight +** alternative to an event group. +** - eIncrement: The notification value of +** the subject task will be incremented by one, +** making the call to xTaskNotify() equivalent +** to a call to xTaskNotifyGive(). In this +** case ulValue is not used. +** - eSetValueWithOverwrite: The notification +** value of the subject task is +** unconditionally set to ulValue. In this way +** the RTOS task notification mechanism is +** being used as a light weight alternative to +** xQueueOverwrite(). +** - eSetValueWithoutOverwrite: If the +** subject task does not already have a +** notification pending then its notification +** value will be set to ulValue. If the +** subject task already has a notification +** pending then its notification value is not +** updated as to do so would overwrite the +** previous value before it was used. In this +** case the call to xTaskNotify() fails and +** pdFALSE is returned. In this way the RTOS +** task notification mechanism is being used +** as a light weight alternative to +** xQueueSend() on a queue of length 1. +** * pxHigherPriorityTaskWoken +** - *pxHigherPriorityTaskWoken must be +** initialised to 0. +** xTaskNotifyFromISR() will set +** *pxHigherPriorityTaskWoken to pdTRUE if +** sending the notification caused a task to +** unblock, and the unblocked task has a +** priority higher than the currently running +** task. +** If xTaskNotifyFromISR() sets this value to +** pdTRUE then a context switch should be +** requested before the interrupt is exited. +** See the example below. +** pxHigherPriorityTaskWoken is an optional +** parameter and can be set to NULL. +** Returns : +** --- - pdPASS is returned in all cases other than +** when eAction is set to +** eSetValueWithoutOverwrite and the subject +** task's notification value cannot be updated +** because the subject task already had a +** notification pending. +** =================================================================== +*/ +/* +BaseType_t McuRTOS_xTaskNotifyFromISR(TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, BaseType_t *pxHigherPriorityTaskWoken) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTaskNotifyWait (component FreeRTOS) +** +** Description : +** [If you are using RTOS task notifications to implement +** binary or counting semaphore type behaviour then use the +** simpler ulTaskNotifyTake() API function instead of +** xTaskNotifyWait()] +** Each RTOS task has a 32-bit notification value which is +** initialised to zero when the RTOS task is created. An RTOS +** task notification is an event sent directly to a task that +** can unblock the receiving task, and optionally update the +** receiving task's notification value in a number of different +** ways. For example, a notification may overwrite the +** receiving task's notification value, or just set one or more +** bits in the receiving task's notification value. See the +** RTOS task notifications use case documentation for examples. +** xTaskNotifyWait() waits, with an optional timeout, for the +** calling task to receive a notification. +** If the receiving RTOS task was already Blocked waiting for a +** notification when one arrives the receiving RTOS task will +** be removed from the Blocked state and the notification +** cleared. +** Parameters : +** NAME - DESCRIPTION +** ulBitsToClearOnEntry - Any bits +** set in ulBitsToClearOnEntry will be cleared +** in the calling RTOS task's notification +** value on entry to the xTaskNotifyWait() +** function (before the task waits for a new +** notification) provided a notification is +** not already pending when xTaskNotifyWait() +** is called. +** For example, if ulBitsToClearOnEntry is +** 0x01, then bit 0 of the task's notification +** value will be cleared on entry to the +** function. +** Setting ulBitsToClearOnEntry to 0xffffffff +** (ULONG_MAX) will clear all the bits in the +** task's notification value, effectively +** clearing the value to 0. +** ulBitsToClearOnExit - Any bits +** set in ulBitsToClearOnExit will be cleared +** in the calling RTOS task's notification +** value before xTaskNotifyWait() function +** exits if a notification was received. +** The bits are cleared after the RTOS task's +** notification value has been saved in +** *pulNotificationValue (see the description +** of pulNotificationValue below). +** For example, if ulBitsToClearOnExit is 0x03, +** then bit 0 and bit 1 of the task's +** notification value will be cleared before +** the function exits. +** Setting ulBitsToClearOnExit to 0xffffffff +** (ULONG_MAX) will clear all the bits in the +** task's notification value, effectively +** clearing the value to 0. +** * pulNotificationValue - Used to +** pass out the RTOS task's notification value. +** The value copied to *pulNotificationValue +** is the RTOS task's notification value as it +** was before any bits were cleared due to the +** ulBitsToClearOnExit setting. +** If the notification value is not required +** then set pulNotificationValue to NULL. +** xTicksToWait - The maximum time to wait +** in the Blocked state for a notification to +** be received if a notification is not +** already pending when xTaskNotifyWait() is +** called. +** The RTOS task does not consume any CPU time +** when it is in the Blocked state. +** The time is specified in RTOS tick periods. +** The pdMS_TO_TICKS() macro can be used to +** convert a time specified in milliseconds +** into a time specified in ticks. +** Returns : +** --- - pdTRUE if a notification was received, or +** a notification was already pending when +** xTaskNotifyWait() was called. +** pdFALSE if the call to xTaskNotifyWait() +** timed out before a notification was +** received. +** =================================================================== +*/ +/* +BaseType_t McuRTOS_xTaskNotifyWait(uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : vTaskSetThreadLocalStoragePointer (component FreeRTOS) +** +** Description : +** Only enabled if configNUM_THREAD_LOCAL_STORAGE_POINTERS is > +** 0. +** Parameters : +** NAME - DESCRIPTION +** xTaskToSet - Task handle +** xIndex - Index of thread local storage item +** pvValue - +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_vTaskSetThreadLocalStoragePointer(TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : pvTaskGetThreadLocalStoragePointer (component FreeRTOS) +** +** Description : +** Sets the thread local storage. Only enabled if +** configNUM_THREAD_LOCAL_STORAGE_POINTERS is >0 +** Parameters : +** NAME - DESCRIPTION +** xTaskToQuery - Task handle from which +** to get the local thread storage. +** xIndex - Index of thread storage +** Returns : +** --- - Error code +** =================================================================== +*/ +/* +void* McuRTOS_pvTaskGetThreadLocalStoragePointer(TaskHandle_t xTaskToQuery, BaseType_t xIndex) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xSemaphoreCreateBinary (component FreeRTOS) +** +** Description : +** The old vSemaphoreCreateBinary() macro is now deprecated in +** favour of this xSemaphoreCreateBinary() function. Note that +** binary semaphores created using the vSemaphoreCreateBinary() +** macro are created in a state such that the first call to +** 'take' the semaphore would pass, whereas binary semaphores +** created using xSemaphoreCreateBinary() are created in a +** state such that the the semaphore must first be 'given' +** before it can be 'taken'. +** Function that creates a semaphore by using the existing +** queue mechanism. The queue length is 1 as this is a binary +** semaphore. The data size is 0 as nothing is actually stored +** - all that is important is whether the queue is empty or +** full (the binary semaphore is available or not). +** This type of semaphore can be used for pure synchronisation +** between tasks or between an interrupt and a task. The +** semaphore need not be given back once obtained, so one +** task/interrupt can continuously 'give' the semaphore while +** another continuously 'takes' the semaphore. For this reason +** this type of semaphore does not use a priority inheritance +** mechanism. For an alternative that does use priority +** inheritance see xSemaphoreCreateMutex(). +** Parameters : None +** Returns : +** --- - Handle to the created semaphore. +** =================================================================== +*/ +/* +SemaphoreHandle_t McuRTOS_xSemaphoreCreateBinary(void) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTaskNotifyAndQuery (component FreeRTOS) +** +** Description : +** [If you are using RTOS task notifications to implement +** binary or counting semaphore type behaviour then use the +** simpler xTaskNotifyGive() API function instead of +** xTaskNotify()] +** Each RTOS task has a 32-bit notification value which is +** initialised to zero when the RTOS task is created. +** xTaskNotify() is used to send an event directly to and +** potentially unblock an RTOS task, and optionally update the +** receiving task's notification value in one of the following +** ways: +** - Write a 32-bit number to the notification value +** - Add one (increment) the notification value +** - Set one or more bits in the notification value +** - Leave the notification value unchanged +** This function must not be called from an interrupt service +** routine (ISR). Use xTaskNotifyFromISR() instead. +** Parameters : +** NAME - DESCRIPTION +** xTaskToNotify - The handle of the RTOS +** task being notified. This is the subject +** task. +** RTOS task handles are obtained using the +** pvCreatedTask parameter of the xTaskCreate() +** call used to create the task. +** The handle of the currently executing RTOS +** task is returned by the +** xTaskGetCurrentTaskHandle() API function. +** ulValue - Used to update the notification +** value of the subject task. See the +** description of the eAction parameter below. +** eAction - An enumerated type that can take +** one of the values documented in the table +** below in order to perform the associated +** action. +** * pulPreviousNotifyValue - Can +** be used to pass out the subject task's +** notification value before any bits are +** modified by the action of +** xTaskNotifyAndQuery(). +** pulPreviousNotifyValue is an optional +** parameter, and can be set to NULL if it is +** not required. If pulPreviousNotifyValue is +** not used then consider using xTaskNotify() +** in place of xTaskNotifyAndQuery(). +** Returns : +** --- - pdPASS is returned in all cases other than +** when eAction is set to +** eSetValueWithoutOverwrite and the subject +** task's notification value cannot be updated +** because the subject task already had a +** notification pending. +** =================================================================== +*/ +/* +BaseType_t McuRTOS_xTaskNotifyAndQuery(TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotifyValue) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTaskNotifyAndQueryFromISR (component FreeRTOS) +** +** Description : +** [If you are using RTOS task notifications to implement +** binary or counting semaphore type behaviour then use the +** simpler xTaskNotifyGive() API function instead of +** xTaskNotify()] +** Each RTOS task has a 32-bit notification value which is +** initialised to zero when the RTOS task is created. +** xTaskNotify() is used to send an event directly to and +** potentially unblock an RTOS task, and optionally update the +** receiving task's notification value in one of the following +** ways: +** - Write a 32-bit number to the notification value +** - Add one (increment) the notification value +** - Set one or more bits in the notification value +** - Leave the notification value unchanged +** This function must not be called from an interrupt service +** routine (ISR). Use xTaskNotifyFromISR() instead. +** Parameters : +** NAME - DESCRIPTION +** xTaskToNotify - The handle of the RTOS +** task being notified. This is the subject +** task. +** RTOS task handles are obtained using the +** pvCreatedTask parameter of the xTaskCreate() +** call used to create the task. +** The handle of the currently executing RTOS +** task is returned by the +** xTaskGetCurrentTaskHandle() API function. +** ulValue - Used to update the notification +** value of the subject task. See the +** description of the eAction parameter below. +** eAction - An enumerated type that can take +** one of the values documented in the table +** below in order to perform the associated +** action. +** * pulPreviousNotifyValue - Can +** be used to pass out the subject task's +** notification value before any bits are +** modified by the action of +** xTaskNotifyAndQuery(). +** pulPreviousNotifyValue is an optional +** parameter, and can be set to NULL if it is +** not required. If pulPreviousNotifyValue is +** not used then consider using xTaskNotify() +** in place of xTaskNotifyAndQuery(). +** * pxHigherPriorityTaskWoken +** - *pxHigherPriorityTaskWoken must be +** initialised to 0. +** xTaskNotifyFromISR() will set +** *pxHigherPriorityTaskWoken to pdTRUE if +** sending the notification caused a task to +** unblock, and the unblocked task has a +** priority higher than the currently running +** task. +** If xTaskNotifyFromISR() sets this value to +** pdTRUE then a context switch should be +** requested before the interrupt is exited. +** See the example below. +** pxHigherPriorityTaskWoken is an optional +** parameter and can be set to NULL. +** Returns : +** --- - pdPASS is returned in all cases other than +** when eAction is set to +** eSetValueWithoutOverwrite and the subject +** task's notification value cannot be updated +** because the subject task already had a +** notification pending. +** =================================================================== +*/ +/* +BaseType_t McuRTOS_xTaskNotifyAndQueryFromISR(TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotifyValue, BaseType_t *pxHigherPriorityTaskWoken) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTaskNotifyStateClear (component FreeRTOS) +** +** Description : +** [If you are using RTOS task notifications to implement +** binary or counting semaphore type behaviour then use the +** simpler xTaskNotifyGive() API function instead of +** xTaskNotify()] +** If the notification state of the task referenced by the +** handle xTask is eNotified, then set the task's notification +** state to eNotWaitingNotification. The task's notification +** value is not altered. Set xTask to NULL to clear the +** notification state of the calling task. +** Parameters : +** NAME - DESCRIPTION +** xTask - The handle of the RTOS task. Use NULL +** for using the calling task. +** Returns : +** --- - pdPASS is returned in all cases other than +** when eAction is set to +** eSetValueWithoutOverwrite and the subject +** task's notification value cannot be updated +** because the subject task already had a +** notification pending. +** =================================================================== +*/ +/* +BaseType_t McuRTOS_xTaskNotifyStateClear(TaskHandle_t xTask) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : Deinit (component FreeRTOS) +** +** Description : +** Module deinitialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuRTOS_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : xTaskGetHandle (component FreeRTOS) +** +** Description : +** Looks up the handle of a task from the task's name. +** Parameters : +** NAME - DESCRIPTION +** * pcNameToQuery - The text name (as a +** standard C NULL terminated string) of the +** task for which the handle will be returned. +** Returns : +** --- - If a task that has the name passed in +** pcNameToQuery can be located then the +** handle of the task is returned, otherwise +** NULL is returned. +** =================================================================== +*/ +/* +TaskHandle_t McuRTOS_xTaskGetHandle(const char *pcNameToQuery ) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : pcTaskGetName (component FreeRTOS) +** +** Description : +** Looks up the name of a task from the task's handle. +** Parameters : +** NAME - DESCRIPTION +** xTaskToQuery - The handle of the task +** being queried. xTaskToQuery can be set to +** NULL to query the name of the calling task. +** Returns : +** --- - A pointer to the subject task's name, +** which is a standard NULL terminated C +** string. +** =================================================================== +*/ +/* +char* McuRTOS_pcTaskGetName(TaskHandle_t xTaskToQuery) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTaskCreateStatic (component FreeRTOS) +** +** Description : +** Create a new task and add it to the list of tasks that are +** ready to run. +** Parameters : +** NAME - DESCRIPTION +** pvTaskCode - Pointer to the task entry +** function. Tasks must be implemented to +** never return (i.e. continuous loop). +** pcName - A descriptive name for the task. +** This is mainly used to facilitate debugging. +** Max length defined by +** configMAX_TASK_NAME_LEN. +** usStackDepth - The size of the task +** stack specified as the number of variables +** the stack can hold - not the number of +** bytes. For example, if the stack is 16 bits +** wide and usStackDepth is defined as 100, +** 200 bytes will be allocated for stack +** storage. The stack depth multiplied by the +** stack width must not exceed the maximum +** value that can be contained in a variable +** of type size_t. +** pvParameters - Pointer that will be +** used as the parameter for the task being +** created. +** uxPriority - The priority at which the +** task should run. +** puxStackBuffer - Must point to a +** StackType_t array that has at least +** ulStackDepth indexes (see the ulStackDepth +** parameter above) - the array will be used +** as the task's stack, so must be persistent +** (not declared on the stack of a function) +** pxTaskBuffer - Must point to a variable +** of type StaticTask_t. The variable will be +** used to hold the new task's data structures +** (TCB), so it must be persistent (not +** declared on the stack of a function). +** Returns : +** --- - Task handle if the task was successfully +** created and added to a ready list, +** otherwise Null. +** =================================================================== +*/ +/* +TaskHandle_t McuRTOS_xTaskCreateStatic(pdTASK_CODE pvTaskCode, const portCHAR * const pcName, unsigned portSHORT usStackDepth, void *pvParameters, unsigned portBASE_TYPE uxPriority, StackType_t * const puxStackBuffer, StaticTask_t * const pxTaskBuffer) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xQueueCreateStatic (component FreeRTOS) +** +** Description : +** Creates a queue. +** Parameters : +** NAME - DESCRIPTION +** uxQueueLength - The maximum number of +** items the queue can hold at any time. +** uxItemSize - The size in bytes of each +** item the queue will hold. +** pucQueueStorageBuffer - If +** uxItemSize is not zero then +** pucQueueStorageBuffer must point to a +** uint8_t array that is at least large enough +** to hold the maximum number of items that +** can be in the queue at any one time - which +** is ( uxQueueLength * uxItemSize ) bytes. If +** uxItemSize is zero then +** pucQueueStorageBuffer can be NULL. +** pxQueueBuffer - Must point to a +** variable of type StaticQueue_t, which will +** be used to hold the queue's data structure. +** Returns : +** --- - A handle to the created queue is returned +** provided the queue was created successfully. +** NULL is returned if the queue cannot be +** created because there is too little heap +** RAM available. +** =================================================================== +*/ +/* +xQueueHandle McuRTOS_xQueueCreateStatic(unsigned_portBASE_TYPE uxQueueLength, unsigned_portBASE_TYPE uxItemSize, uint8_t *pucQueueStorageBuffer, StaticQueue_t *pxQueueBuffer) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xEventGroupCreateStatic (component FreeRTOS) +** +** Description : +** Create a new RTOS event group. This function cannot be +** called from an interrupt. +** Event groups are stored in variables of type +** EventGroupHandle_t. The number of bits (or flags) +** implemented within an event group is 8 if +** configUSE_16_BIT_TICKS is set to 1, or 24 if +** configUSE_16_BIT_TICKS is set to 0. The dependency on +** configUSE_16_BIT_TICKS results from the data type used for +** thread local storage in the internal implementation of RTOS +** tasks. +** Parameters : +** NAME - DESCRIPTION +** pxEventGroupBuffer - Must point +** to a variable of type StaticEventGroup_t, +** in which the event group data structure +** will be stored. +** Returns : +** --- - Event Group Handle. If the event group was +** created then a handle to the event group is +** returned. If there was insufficient +** FreeRTOS heap available to create the event +** group then NULL is returned. +** =================================================================== +*/ +/* +EventGroupHandle_t McuRTOS_xEventGroupCreateStatic(StaticEventGroup_t *pxEventGroupBuffer) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTimerCreateStatic (component FreeRTOS) +** +** Description : +** Creates a new software timer instance. This allocates the +** storage required by the new timer, initialises the new +** timers internal state, and returns a handle by which the new +** timer can be referenced. +** Parameters : +** NAME - DESCRIPTION +** pcTimerName - +** Atextnamethatisassignedtothetimer_Thisisdone +** purelytoassistdebugging_TheRTOSkernelitselfo +** nlyeverreferencesatimerbyitshandle_andneverb +** yitsname_ +** xTimerPeriod - The timer period. The +** time is defined in tick periods so the +** constant portTICK_PERIOD_MS can be used to +** convert a time that has been specified in +** milliseconds. For example, if the timer +** must expire after 100 ticks, then +** xTimerPeriod should be set to 100. +** Alternatively, if the timer must expire +** after 500ms, then xPeriod can be set to ( +** 500 / portTICK_PERIOD_MS ) provided +** configTICK_RATE_HZ is less than or equal to +** 1000. +** uxAutoReload - If uxAutoReload is set +** to pdTRUE, then the timer will expire +** repeatedly with a frequency set by the +** xTimerPeriod parameter. If uxAutoReload is +** set to pdFALSE, then the timer will be a +** one-shot and enter the dormant state after +** it expires. +** pvTimerID - An identifier that is assigned +** to the timer being created. Typically this +** would be used in the timer callback +** function to identify which timer expired +** when the same callback function is assigned +** to more than one timer. +** pxCallbackFunction - The function +** to call when the timer expires. Callback +** functions must have the prototype defined +** by TimerCallbackFunction_t, which is "void +** vCallbackFunction( TimerHandle_t xTimer );". +** pxTimerBuffer - Must point to a +** variable of type StaticTimer_t, which is +** then used to hold the timer's state. +** Returns : +** --- - Timer handle. If the timer is successfully +** created then a handle to the newly created +** timer is returned. If the timer cannot be +** created (because either there is +** insufficient FreeRTOS heap remaining to +** allocate the timer structures, or the timer +** period was set to 0) then NULL is returned. +** =================================================================== +*/ +/* +TimerHandle_t McuRTOS_xTimerCreateStatic(const char * const pcTimerName, const TickType_t xTimerPeriod, const UBaseType_t uxAutoReload, void *const pvTimerID, TimerCallbackFunction_t pxCallbackFunction, StaticTimer_t *pxTimerBuffer) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xSemaphoreCreateBinaryStatic (component FreeRTOS) +** +** Description : +** The old vSemaphoreCreateBinary() macro is now deprecated in +** favour of this xSemaphoreCreateBinary() function. Note that +** binary semaphores created using the vSemaphoreCreateBinary() +** macro are created in a state such that the first call to +** 'take' the semaphore would pass, whereas binary semaphores +** created using xSemaphoreCreateBinary() are created in a +** state such that the the semaphore must first be 'given' +** before it can be 'taken'. +** Function that creates a semaphore by using the existing +** queue mechanism. The queue length is 1 as this is a binary +** semaphore. The data size is 0 as nothing is actually stored +** - all that is important is whether the queue is empty or +** full (the binary semaphore is available or not). +** This type of semaphore can be used for pure synchronisation +** between tasks or between an interrupt and a task. The +** semaphore need not be given back once obtained, so one +** task/interrupt can continuously 'give' the semaphore while +** another continuously 'takes' the semaphore. For this reason +** this type of semaphore does not use a priority inheritance +** mechanism. For an alternative that does use priority +** inheritance see xSemaphoreCreateMutex(). +** Parameters : +** NAME - DESCRIPTION +** pxSemaphoreBuffer - Must point to +** a variable of type StaticSemaphore_t, which +** will be used to hold the semaphore's state. +** Returns : +** --- - Handle to the created semaphore. +** =================================================================== +*/ +/* +SemaphoreHandle_t McuRTOS_xSemaphoreCreateBinaryStatic(StaticSemaphore_t *pxSemaphoreBuffer) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xSemaphoreCreateCountingStatic (component FreeRTOS) +** +** Description : +** Macro that creates a counting semaphore by using the +** existing queue mechanism. +** Counting semaphores are typically used for two things: +** 1. Counting events. +** In this usage scenario an event handler will 'give' a +** semaphore each time an event occurs (incrementing the +** semaphore count value), and a handler task will 'take' a +** semaphore each time it processes an event (decrementing the +** semaphore count value). The count value is therefore the +** difference between the number of events that have occurred +** and the number that have been processed. In this case it is +** desirable for the initial count value to be zero. +** 2. Resource management. +** In this usage scenario the count value indicates the number +** of resources available. To obtain control of a resource a +** task must first obtain a semaphore - decrementing the +** semaphore count value. When the count value reaches zero +** there are no free resources. When a task finishes with the +** resource it 'gives' the semaphore back - incrementing the +** semaphore count value. In this case it is desirable for the +** initial count value to be equal to the maximum count value, +** indicating that all resources are free. +** Parameters : +** NAME - DESCRIPTION +** uxMaxCount - The maximum count value that +** can be reached. When the semaphore reaches +** this value it can no longer be 'given'. +** uxInitialCount - The count value +** assigned to the semaphore when it is +** created. +** pxSempahoreBuffer - Must point to +** a variable of type StaticSemaphore_t, which +** is then used to hold the semaphore's data +** structures. +** Returns : +** --- - xSemaphoreHandle handle +** =================================================================== +*/ +/* +xSemaphoreHandle McuRTOS_xSemaphoreCreateCountingStatic(unsigned_portBASE_TYPE uxMaxCount, unsigned_portBASE_TYPE uxInitialCount, StaticSemaphore_t pxSempahoreBuffer) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xSemaphoreCreateMutexStatic (component FreeRTOS) +** +** Description : +** Macro that creates a mutex semaphore by using the existing +** queue mechanism. +** Mutexes created using this macro can be accessed using the +** xSemaphoreTake() and xSemaphoreGive() macros. The +** xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() +** macros should not be used. +** Mutexes and binary semaphores are very similar but have some +** subtle differences: Mutexes include a priority inheritance +** mechanism, binary semaphores do not. This makes binary +** semaphores the better choice for implementing +** synchronisation (between tasks or between tasks and an +** interrupt), and mutexes the better choice for implementing +** simple mutual exclusion. +** The priority of a task that 'takes' a mutex can potentially +** be raised if another task of higher priority attempts to +** obtain the same mutex. The task that owns the mutex +** 'inherits' the priority of the task attempting to 'take' the +** same mutex. This means the mutex must always be 'given' back +** - otherwise the higher priority task will never be able to +** obtain the mutex, and the lower priority task will never +** 'disinherit' the priority. An example of a mutex being used +** to implement mutual exclusion is provided on the +** xSemaphoreTake() documentation page. +** A binary semaphore need not be given back once obtained, so +** task synchronisation can be implemented by one +** task/interrupt continuously 'giving' the semaphore while +** another continuously 'takes' the semaphore. This is +** demonstrated by the sample code on the +** xSemaphoreGiveFromISR() documentation page. +** Both mutex and binary semaphores are assigned to variables +** of type xSemaphoreHandle and can be used in any API function +** that takes a parameter of this type. +** Parameters : +** NAME - DESCRIPTION +** Variable_1 - Must point to a variable of +** type StaticSemaphore_t, which will be used +** to hold the mutex type semaphore's state. +** Returns : +** --- - Handle to the created mutex semaphore. +** Should be of type xSemaphoreHandle. +** =================================================================== +*/ +/* +xSemaphoreHandle McuRTOS_xSemaphoreCreateMutexStatic(StaticSemaphore_t *pxMutexBuffer) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xTaskAbortDelay (component FreeRTOS) +** +** Description : +** Forces a task to leave the Blocked state, and enter the +** Ready state, even if the event the task was in the Blocked +** state to wait for has not occurred, and any specified +** timeout has not expired. +** Parameters : +** NAME - DESCRIPTION +** xTask - The handle of the task that will be +** forced out of the Blocked state. +** Returns : +** --- - If the task referenced by xTask was not in +** the Blocked state then pdFAIL is returned. +** Otherwise pdPASS is returned. +** =================================================================== +*/ +/* +BaseType_t McuRTOS_xTaskAbortDelay(TaskHandle_t xTask) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : vTaskGetInfo (component FreeRTOS) +** +** Description : +** Whereas uxTaskGetSystemState() populates a TaskStatus_t +** structure for each task in the system, vTaskGetInfo() +** populates a TaskStatus_t structures for just a single task. +** The TaskStatus_t structure contains, among other things, +** members for the task handle, task name, task priority, task +** state, and total amount of run time consumed by the task. +** Parameters : +** NAME - DESCRIPTION +** xTask - The handle of the task being queried. +** Setting xTask to NULL will return +** information on the calling task. +** pxTaskStatus - The TaskStatus_t +** structure pointed to by pxTaskStatus will +** be filled with information about the task +** referenced by the handle passed in the +** xTask parameter. +** xGetFreeStackSpace - The +** TaskStatus_t structure contains a member to +** report the stack high water mark of the +** task being queried. The stack high water +** mark is the minimum amount of stack space +** that has ever existed, so the closer the +** number is to zero the closer the task has +** come to overflowing its stack.Calculating +** the stack high water mark takes a +** relatively long time, and can make the +** system temporarily unresponsive - so the +** xGetFreeStackSpace parameter is provided to +** allow the high water mark checking to be +** skipped. The high watermark value will only +** be written to the TaskStatus_t structure if +** xGetFreeStackSpace is not set to pdFALSE. +** eState - The TaskStatus_t structure contains +** a member to report the state of the task +** being queried. Obtaining the task state is +** not as fast as a simple assignment - so the +** eState parameter is provided to allow the +** state information to be omitted from the +** TaskStatus_t structure. To obtain state +** information then set eState to eInvalid - +** otherwise the value passed in eState will +** be reported as the task state in the +** TaskStatus_t structure. +** Returns : Nothing +** =================================================================== +*/ +/* +void McuRTOS_vTaskGetInfo(TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : uxSemaphoreGetCount (component FreeRTOS) +** +** Description : +** +** Parameters : +** NAME - DESCRIPTION +** xSemaphore - The handle of the semaphore +** being queried. +** Returns : +** --- - If the semaphore is a counting semaphore +** then the semaphores current count value is +** returned. If the semaphore is a binary +** semaphore then 1 is returned if the +** semaphore is available, and 0 is returned +** if the semaphore is not available. +** =================================================================== +*/ +/* +UBaseType_t McuRTOS_uxSemaphoreGetCount(SemaphoreHandle_t xSemaphore) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : xSemaphoreCreateRecursiveMutexStatic (component FreeRTOS) +** +** Description : +** Macro that implements a recursive mutex by using the +** existing queue mechanism. +** Mutexes created using this macro can be accessed using the +** xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() +** macros. The xSemaphoreTake() and xSemaphoreGive() macros +** should not be used. +** A mutex used recursively can be 'taken' repeatedly by the +** owner. The mutex doesn't become available again until the +** owner has called xSemaphoreGiveRecursive() for each +** successful 'take' request. For example, if a task +** successfully 'takes' the same mutex 5 times then the mutex +** will not be available to any other task until it has also +** 'given' the mutex back exactly five times. +** This type of semaphore uses a priority inheritance mechanism +** so a task 'taking' a semaphore MUST ALWAYS 'give' the +** semaphore back once the semaphore it is no longer required. +** Mutex type semaphores cannot be used from within interrupt +** service routines. +** See vSemaphoreCreateBinary() for an alternative +** implementation that can be used for pure synchronisation +** (where one task or interrupt always 'gives' the semaphore +** and another always 'takes' the semaphore) and from within +** interrupt service routines. +** Parameters : +** NAME - DESCRIPTION +** Variable_1 - Must point to a variable of +** type StaticSemaphore_t, which will be used +** to hold the mutex type semaphore's state. +** Returns : +** --- - Handle to the created mutex semaphore. +** Should be of type xSemaphoreHandle. +** =================================================================== +*/ +/* +xSemaphoreHandle McuRTOS_xSemaphoreCreateRecursiveMutexStatic(StaticSemaphore_t *pxMutexBuffer) +{ + *** Implemented as macro in the header file McuRTOS.h +} +*/ + +/* +** =================================================================== +** Method : AppConfigureTimerForRuntimeStats (component FreeRTOS) +** +** Description : +** Configures the timer for generating runtime statistics +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +#if configGENERATE_RUN_TIME_STATS +void McuRTOS_AppConfigureTimerForRuntimeStats(void) +{ +#if configGENERATE_RUN_TIME_STATS_USE_TICKS + /* nothing needed, the RTOS will initialize the tick counter */ +#else + extern uint32_t McuRTOS_RunTimeCounter; /* runtime counter, used for configGENERATE_RUNTIME_STATS */ + McuRTOS_RunTimeCounter = 0; +#endif +} + +#endif /* configGENERATE_RUN_TIME_STATS */ +/* +** =================================================================== +** Method : AppGetRuntimeCounterValueFromISR (component FreeRTOS) +** +** Description : +** returns the current runtime counter. Function can be called +** from an interrupt service routine. +** Parameters : None +** Returns : +** --- - runtime counter value +** =================================================================== +*/ +uint32_t McuRTOS_AppGetRuntimeCounterValueFromISR(void) +{ +#if configGENERATE_RUN_TIME_STATS + #if configGENERATE_RUN_TIME_STATS_USE_TICKS + return xTaskGetTickCountFromISR(); /* using RTOS tick counter */ + #else /* using timer counter */ + extern uint32_t McuRTOS_RunTimeCounter; /* runtime counter, used for configGENERATE_RUNTIME_STATS */ + return McuRTOS_RunTimeCounter; + #endif +#else + return 0; /* dummy value */ +#endif +} + +#endif /* McuLib_CONFIG_SDK_USE_FREERTOS */ +/* END McuRTOS. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuRTOS.h b/TSM_PicoW_Sensor/McuLib/src/McuRTOS.h new file mode 100644 index 0000000..de4cad8 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuRTOS.h @@ -0,0 +1,4717 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuRTOS.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : FreeRTOS +** Version : Component 01.586, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2023-12-20, 18:09, # CodeGen: 825 +** Abstract : +** This component implements the FreeRTOS Realtime Operating System +** Settings : +** Component name : McuRTOS +** RTOS Version : V11.0.0 +** SDK : McuLib +** Kinetis SDK : Disabled +** Custom Port : Custom port settings +** Compiler : automatic +** Source Folders : Enabled +** Source Folder : FreeRTOS/Source +** Header Folder : FreeRTOS/Source/include +** Port Folder : FreeRTOS/Source/portable/GCC/ARM_CM4F +** MemMang Folder : FreeRTOS/Source/portable/MemMang +** Common Folder : FreeRTOS/Source/portable/Common +** Config Folder : config +** Manual Clock Values : Enabled +** configCPU_CLOCK_HZ : CPU_CORE_CLK_HZ +** configBUS_CLOCK_HZ : CPU_BUS_CLK_HZ +** Custom portBASE_TYPE : Disabled +** Classic CodeWarrior : no +** Disabled Interrupts in Startup : yes +** configASSERT : yes +** Application Task Tags : no +** Thread Local Storage Pointers : 0 +** Use Trace Facility : yes +** Debug Helpers : +** Enable GDB Debug Helper : no +** uxTopUsedPriority : yes +** Heap Indication Constant : yes +** Segger System Viewer Trace : Disabled +** Percepio Trace : Disabled +** Generate Runtime Statistics : Enabled +** Use Tick Counter : yes +** LDD : Disabled +** non-LDD : Disabled +** Scheduler : Settings for the scheduler +** ColdFire V1 : Disabled +** ColdFire V2 : Disabled +** ARM (Kinetis) : Enabled +** ARM Family : Cortex-M4F +** Max SysCall Interrupt Priority : 5 +** RTOS Interrupt Priority : 15 +** Lowest Interrupt Priority : 15 +** Compiler Optimization Level : 0 +** MPU : no +** SysTick : Enabled +** Core Clock : yes +** Low Power Timer : Disabled +** non-LDD SWI : Disabled +** Preemptive : yes +** Optimized Task Selection : no +** Time Slicing : yes +** Use Co-Routines : no +** Idle should yield : yes +** Task Name Length : 12 +** Minimal Stack Size : 200 +** Record Stack High Address : yes +** Maximum Priorities : 6 +** Maximum Coroutine Priorities : 2 +** Stackoverflow checking method : Method 1 +** Cleanup Resources : yes +** TaskExitError Handler : no +** Ticks : Settings for the periodic tick timer +** Tickless Idle Mode : Disabled +** Tick Rate (Hz) : 1000 +** Use 16bit ticks : no +** non-LDD Tick : Disabled +** LDD Tick : Disabled +** Queues : Settings for Queues +** Queue Registry Size : 5 +** Queue Sets : yes +** Semaphores and Mutexes : Settings for Mutex and Semaphore +** Use Mutexes : yes +** Use Recursive Mutexes : yes +** Timers : Enabled +** Priority : (configMAX_PRIORITIES-1U) +** Queue Length : 10 +** Stack Depth : (configMINIMAL_STACK_SIZE) +** Use Daemon Task Startup Hook : no +** Memory : Settings for the memory and heap allocation +** Dynamic Allocation : Enabled +** Heap Size : 8192 +** Application allocated Heap : no +** Memory Allocation Scheme : Scheme 4: merge free blocks +** Static Allocation : Disabled +** User Memory Section : Disabled +** RTOS Adaptor : Configures the RTOS adapter settings +** Memory allocation : Configures how memory is allocated and deallocated. +** User function for memory allocation : no +** User function for memory deallocation : no +** Critical section : Configures how critical sections are handled. +** User function for entering critical section : no +** User function for exiting critical section : no +** Shell : Enabled +** Max number of tasks : 16 +** Shell : McuShell +** Utility : McuUtility +** Contents : +** xTaskCreate - portBASE_TYPE McuRTOS_xTaskCreate(pdTASK_CODE pvTaskCode, const portCHAR *... +** xTaskCreateStatic - TaskHandle_t McuRTOS_xTaskCreateStatic(pdTASK_CODE pvTaskCode, const portCHAR... +** vTaskDelete - void McuRTOS_vTaskDelete(xTaskHandle pxTask); +** vTaskStartScheduler - void McuRTOS_vTaskStartScheduler(void); +** vTaskSuspend - void McuRTOS_vTaskSuspend(xTaskHandle pxTaskToSuspend); +** vTaskSuspendAll - void McuRTOS_vTaskSuspendAll(void); +** vTaskResume - void McuRTOS_vTaskResume(xTaskHandle pxTaskToResume); +** xTaskResumeAll - portBASE_TYPE McuRTOS_xTaskResumeAll(void); +** xTaskResumeFromISR - portBASE_TYPE McuRTOS_xTaskResumeFromISR(xTaskHandle pxTaskToResume); +** vTaskStepTick - void McuRTOS_vTaskStepTick(portTickType xTicksToJump); +** xTaskAbortDelay - BaseType_t McuRTOS_xTaskAbortDelay(TaskHandle_t xTask); +** taskYIELD - void McuRTOS_taskYIELD(void); +** taskENTER_CRITICAL - void McuRTOS_taskENTER_CRITICAL(void); +** taskEXIT_CRITICAL - void McuRTOS_taskEXIT_CRITICAL(void); +** taskDISABLE_INTERRUPTS - void McuRTOS_taskDISABLE_INTERRUPTS(void); +** taskENABLE_INTERRUPTS - void McuRTOS_taskENABLE_INTERRUPTS(void); +** vTaskDelay - void McuRTOS_vTaskDelay(portTickType xTicksToDelay); +** vTaskDelayUntil - void McuRTOS_vTaskDelayUntil(portTickType *pxPreviousWakeTime, portTickType... +** uxTaskPriorityGet - unsigned_portBASE_TYPE McuRTOS_uxTaskPriorityGet(xTaskHandle pxTask); +** xTaskGetTickCount - portTickType McuRTOS_xTaskGetTickCount(void); +** xTaskGetTickCountFromISR - portTickType McuRTOS_xTaskGetTickCountFromISR(void); +** vTaskPrioritySet - void McuRTOS_vTaskPrioritySet(xTaskHandle pxTask, unsigned_portBASE_TYPE... +** vSemaphoreCreateBinary - void McuRTOS_vSemaphoreCreateBinary(xSemaphoreHandle xSemaphore); +** xSemaphoreCreateBinary - SemaphoreHandle_t McuRTOS_xSemaphoreCreateBinary(void); +** xSemaphoreCreateBinaryStatic - SemaphoreHandle_t McuRTOS_xSemaphoreCreateBinaryStatic(StaticSemaphore_t... +** xSemaphoreCreateCounting - xSemaphoreHandle McuRTOS_xSemaphoreCreateCounting(unsigned_portBASE_TYPE... +** xSemaphoreCreateCountingStatic - xSemaphoreHandle McuRTOS_xSemaphoreCrea... +** xSemaphoreGive - bool McuRTOS_xSemaphoreGive(xSemaphoreHandle xMutex); +** xSemaphoreTake - bool McuRTOS_xSemaphoreTake(xSemaphoreHandle xMutex, portTickType xBlockTime); +** uxSemaphoreGetCount - UBaseType_t McuRTOS_uxSemaphoreGetCount(SemaphoreHandle_t xSemaphore); +** xSemaphoreGiveFromISR - bool McuRTOS_xSemaphoreGiveFromISR(xSemaphoreHandle xSemaphore,... +** xSemaphoreTakeFromISR - bool McuRTOS_xSemaphoreTakeFromISR(xSemaphoreHandle xSemaphore,... +** xSemaphoreGetMutexHolder - void* McuRTOS_xSemaphoreGetMutexHolder(xSemaphoreHandle xSemaphore); +** xSemaphoreCreateMutex - xSemaphoreHandle McuRTOS_xSemaphoreCreateMutex(void); +** xSemaphoreCreateMutexStatic - xSemaphoreHandle McuRTOS_xSemaphoreCreateMutexStatic(StaticSemaphore_t... +** xSemaphoreCreateRecursiveMutex - xSemaphoreHandle McuRTOS_xSemaphoreCreateRecursiveMutex(void); +** xSemaphoreCreateRecursiveMutexStatic - xSemaphoreHandle McuRTOS_xSemaphoreCrea... +** xSemaphoreTakeRecursive - bool McuRTOS_xSemaphoreTakeRecursive(xSemaphoreHandle xMutex, portTickType... +** xSemaphoreGiveRecursive - bool McuRTOS_xSemaphoreGiveRecursive(xSemaphoreHandle xMutex); +** vSemaphoreDelete - void McuRTOS_vSemaphoreDelete(xSemaphoreHandle xSemaphore); +** pvPortMalloc - pVoid McuRTOS_pvPortMalloc(size_t xWantedSize); +** vPortFree - void McuRTOS_vPortFree(void *pv); +** xPortGetFreeHeapSize - Tsize_t McuRTOS_xPortGetFreeHeapSize(void); +** xTaskGetCurrentTaskHandle - xTaskHandle McuRTOS_xTaskGetCurrentTaskHandle(void); +** xTaskGetIdleTaskHandle - xTaskHandle McuRTOS_xTaskGetIdleTaskHandle(void); +** xTaskGetHandle - TaskHandle_t McuRTOS_xTaskGetHandle(const char *pcNameToQuery ); +** pcTaskGetTaskName - signed char McuRTOS_pcTaskGetTaskName(xTaskHandle xTaskToQuery); +** eTaskGetState - eTaskState McuRTOS_eTaskGetState(xTaskHandle xTask); +** xTaskGetSchedulerState - portBASE_TYPE McuRTOS_xTaskGetSchedulerState(void); +** vTaskList - void McuRTOS_vTaskList(signed portCHAR *pcWriteBuffer, size_t bufSize); +** uxTaskGetStackHighWaterMark - unsigned_portBASE_TYPE McuRTOS_uxTaskGetStackHighWaterMark(xTaskHandle xTask); +** uxTaskGetNumberOfTasks - unsigned_portBASE_TYPE McuRTOS_uxTaskGetNumberOfTasks(void); +** vTaskGetRunTimeStats - void McuRTOS_vTaskGetRunTimeStats(portCHAR *pcWriteBuffer, size_t bufSize); +** uxQueueMessagesWaiting - unsigned_portBASE_TYPE McuRTOS_uxQueueMessagesWaiting(xQueueHandle xQueue); +** uxQueueMessagesWaitingfromISR - unsigned_portBASE_TYPE McuRTOS_uxQueueMessagesWaitingfromISR(xQueueHandle... +** xQueueCreate - xQueueHandle McuRTOS_xQueueCreate(unsigned_portBASE_TYPE uxQueueLength,... +** xQueueCreateStatic - xQueueHandle McuRTOS_xQueueCreateStatic(unsigned_portBASE_TYPE uxQueueLength,... +** vQueueDelete - void McuRTOS_vQueueDelete(xQueueHandle pxQueueToDelete); +** xQueueReset - portBASE_TYPE McuRTOS_xQueueReset(xQueueHandle xQueue); +** xQueueSendToBack - portBASE_TYPE McuRTOS_xQueueSendToBack(xQueueHandle xQueue, const void... +** xQueueSendToFront - portBASE_TYPE McuRTOS_xQueueSendToFront(xQueueHandle xQueue, const void... +** xQueueReceive - portBASE_TYPE McuRTOS_xQueueReceive(xQueueHandle xQueue, void *pvBuffer,... +** xQueueOverwrite - portBASE_TYPE McuRTOS_xQueueOverwrite(xQueueHandle xQueue, const void... +** xQueueOverwriteFromISR - portBASE_TYPE McuRTOS_xQueueOverwriteFromISR(xQueueHandle xQueue, const void... +** xQueuePeek - portBASE_TYPE McuRTOS_xQueuePeek(xQueueHandle xQueue, void *pvBuffer,... +** xQueuePeekFromISR - portBASE_TYPE McuRTOS_xQueuePeekFromISR(xQueueHandle xQueue, void *pvBuffer,... +** xQueueSendToBackFromISR - portBASE_TYPE McuRTOS_xQueueSendToBackFromISR(xQueueHandle xQueue, const void... +** xQueueSendToFrontFromISR - portBASE_TYPE McuRTOS_xQueueSendToFrontFromISR(xQueueHandle xQueue, const... +** xQueueReceiveFromISR - portBASE_TYPE McuRTOS_xQueueReceiveFromISR(xQueueHandle xQueue, void... +** vQueueAddToRegistry - void McuRTOS_vQueueAddToRegistry(xQueueHandle xQueue, char *pcQueueName); +** vQueueUnregisterQueue - void McuRTOS_vQueueUnregisterQueue(xQueueHandle xQueue); +** xQueueIsQueueFullFromISR - portBASE_TYPE McuRTOS_xQueueIsQueueFullFromISR(xQueueHandle xQueue); +** xQueueIsQueueEmptyFromISR - portBASE_TYPE McuRTOS_xQueueIsQueueEmptyFromISR(xQueueHandle xQueue); +** xQueueCreateSet - xQueueSetHandle McuRTOS_xQueueCreateSet(unsigned portBASE_TYPE... +** xQueueAddToSet - portBASE_TYPE McuRTOS_xQueueAddToSet(xQueueSetMemberHandle xQueueOrSemaphore,... +** xQueueRemoveFromSet - portBASE_TYPE McuRTOS_xQueueRemoveFromSet(xQueueSetMemberHandle... +** xQueueSelectFromSet - xQueueSetMemberHandle McuRTOS_xQueueSelectFromSet(xQueueSetHandle xQueueSet,... +** xQueueSelectFromSetFromISR - xQueueSetMemberHandle McuRTOS_xQueueSelectFromSetFromISR(xQueueSetHandle... +** xEventGroupCreate - EventGroupHandle_t McuRTOS_xEventGroupCreate(void); +** xEventGroupCreateStatic - EventGroupHandle_t McuRTOS_xEventGroupCreateStatic(StaticEventGroup_t... +** xEventGroupWaitBits - byte McuRTOS_xEventGroupWaitBits(const EventGroupHandle_t xEventGroup, const... +** xEventGroupSetBits - EventBits_t McuRTOS_xEventGroupSetBits(EventGroupHandle_t xEventGroup, const... +** xEventGroupSetBitsFromISR - EventBits_t McuRTOS_xEventGroupSetBitsFromISR(EventGroupHandle_t xEventGroup,... +** xEventGroupClearBits - EventBits_t McuRTOS_xEventGroupClearBits(EventGroupHandle_t xEventGroup,... +** xEventGroupClearBitsFromISR - EventBits_t McuRTOS_xEventGroupClearBitsFromISR(EventGroupHandle_t... +** xEventGroupGetBits - EventBits_t McuRTOS_xEventGroupGetBits(EventGroupHandle_t xEventGroup); +** xEventGroupGetBitsFromISR - EventBits_t McuRTOS_xEventGroupGetBitsFromISR(EventGroupHandle_t xEventGroup); +** xEventGroupSync - EventBits_t McuRTOS_xEventGroupSync(EventGroupHandle_t xEventGroup, const... +** xTimerCreate - TimerHandle_t McuRTOS_xTimerCreate(const char * const pcTimerName, const... +** xTimerCreateStatic - TimerHandle_t McuRTOS_xTimerCreateStatic(const char * const pcTimerName,... +** xTimerIsTimerActive - BaseType_t McuRTOS_xTimerIsTimerActive(TimerHandle_t xTimer); +** xTimerStart - BaseType_t McuRTOS_xTimerStart(TimerHandle_t xTimer, TickType_t xBlockTime); +** xTimerStop - BaseType_t McuRTOS_xTimerStop(TimerHandle_t xTimer, TickType_t xBlockTime); +** xTimerChangePeriod - BaseType_t McuRTOS_xTimerChangePeriod(TimerHandle_t xTimer, TickType_t... +** xTimerDelete - BaseType_t McuRTOS_xTimerDelete(TickType_t xTimer, TickType_t xBlockTime); +** xTimerReset - BaseType_t McuRTOS_xTimerReset(TimerHandle_t xTimer, TickType_t xBlockTime); +** xTimerStartFromISR - BaseType_t McuRTOS_xTimerStartFromISR(TimerHandle_t xTimer, BaseType_t... +** xTimerStopFromISR - BaseType_t McuRTOS_xTimerStopFromISR(TimerHandle_t xTimer, BaseType_t... +** xTimerChangePeriodFromISR - BaseType_t McuRTOS_xTimerChangePeriodFromISR(TimerHandle_t xTimer, TickType_t... +** xTimerResetFromISR - BaseType_t McuRTOS_xTimerResetFromISR(TimerHandle_t xTimer, BaseType_t... +** pvTimerGetTimerID - void* McuRTOS_pvTimerGetTimerID(TimerHandle_t xTimer); +** xTimerGetTimerDaemonTaskHandle - TaskHandle_t McuRTOS_xTimerGetTimerDaemonTaskHandle(void); +** pcTimerGetTimerName - char* McuRTOS_pcTimerGetTimerName(TimerHandle_t xTimer); +** xTimerPendFunctionCall - BaseType_t McuRTOS_xTimerPendFunctionCall(PendedFunction_t xFunctionToPend,... +** xTimerPendFunctionCallFromISR - BaseType_t McuRTOS_xTimerPendFunctionCallFromISR(PendedFunction_t... +** xTaskNotifyGive - BaseType_t McuRTOS_xTaskNotifyGive(TaskHandle_t xTaskToNotify); +** vTaskNotifyGiveFromISR - void McuRTOS_vTaskNotifyGiveFromISR(TaskHandle_t xTaskToNotify, BaseType_t... +** ulTaskNotifyTake - uint32_t McuRTOS_ulTaskNotifyTake(BaseType_t xClearCountOnExit, TickType_t... +** xTaskNotify - BaseType_t McuRTOS_xTaskNotify(TaskHandle_t xTaskToNotify, uint32_t ulValue,... +** xTaskNotifyFromISR - BaseType_t McuRTOS_xTaskNotifyFromISR(TaskHandle_t xTaskToNotify, uint32_t... +** xTaskNotifyAndQuery - BaseType_t McuRTOS_xTaskNotifyAndQuery(TaskHandle_t xTaskToNotify, uint32_t... +** xTaskNotifyAndQueryFromISR - BaseType_t McuRTOS_xTaskNotifyAndQueryFromISR(TaskHandle_t xTaskToNotify,... +** xTaskNotifyWait - BaseType_t McuRTOS_xTaskNotifyWait(uint32_t ulBitsToClearOnEntry, uint32_t... +** xTaskNotifyStateClear - BaseType_t McuRTOS_xTaskNotifyStateClear(TaskHandle_t xTask); +** vTaskSetThreadLocalStoragePointer - void McuRTOS_vTaskSetThreadLocalStoragePointer(TaskHandle_t xTaskToSet,... +** pvTaskGetThreadLocalStoragePointer - void* McuRTOS_pvTaskGetThreadLocalStoragePointer(TaskHandle_t xTaskToQuery,... +** pcTaskGetName - char* McuRTOS_pcTaskGetName(TaskHandle_t xTaskToQuery); +** vTaskGetInfo - void McuRTOS_vTaskGetInfo(TaskHandle_t xTask, TaskStatus_t *pxTaskStatus,... +** ParseCommand - uint8_t McuRTOS_ParseCommand(const unsigned char *cmd, bool *handled, const... +** AppConfigureTimerForRuntimeStats - void McuRTOS_AppConfigureTimerForRuntimeStats(void); +** AppGetRuntimeCounterValueFromISR - uint32_t McuRTOS_AppGetRuntimeCounterValueFromISR(void); +** Deinit - void McuRTOS_Deinit(void); +** Init - void McuRTOS_Init(void); +** +** * FreeRTOS (c) Copyright 2003-2023 Richard Barry/Amazon, http: www.FreeRTOS.org +** * See separate FreeRTOS licensing terms. +** * +** * FreeRTOS Processor Expert Component: (c) Copyright Erich Styger, 2013-2023 +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuRTOS.h +** @version 01.00 +** @brief +** This component implements the FreeRTOS Realtime Operating System +*/ +/*! +** @addtogroup McuRTOS_module McuRTOS module documentation +** @{ +*/ + + +#ifndef __McuRTOS_H +#define __McuRTOS_H + +/* MODULE McuRTOS. */ +#include "McuLib.h" /* SDK and API used */ +#if McuLib_CONFIG_SDK_USE_FREERTOS + +#if McuLib_CONFIG_CPU_IS_ESP32 + #include "freertos/FreeRTOSConfig.h" +#else + #include "FreeRTOSConfig.h" +#endif +#include "McuRTOSconfig.h" /* configuration file for component */ + +#if configUSE_SHELL + #include "McuShell.h" +#endif + +/* other includes needed */ +#if McuLib_CONFIG_CPU_IS_ESP32 + #include "freertos/FreeRTOS.h" + #include "freertos/task.h" /* task API */ + #include "freertos/semphr.h" /* semaphore API */ + #include "freertos/event_groups.h" /* event group API */ + #include "freertos/timers.h" /* timer module API */ + #include "freertos/stream_buffer.h" /* stream buffer module API */ + #include "freertos/message_buffer.h" /* message buffer module API */ +#else + #include "FreeRTOS.h" + #include "task.h" /* task API */ + #include "semphr.h" /* semaphore API */ + #include "event_groups.h" /* event group API */ + #include "timers.h" /* timer module API */ + #include "stream_buffer.h" /* stream buffer module API */ + #include "message_buffer.h" /* message buffer API */ +#endif +#include /* for size_t type */ + +#if configUSE_PERCEPIO_TRACE_HOOKS + #include "McuPercepio.h" /* Interface to Percepio Trace */ +#endif + +/* Macro for shell support */ +#define McuRTOS_PARSE_COMMAND_ENABLED (configUSE_SHELL) /* set to 1 if method ParseCommand() is present, 0 otherwise */ +#define McuRTOS_GENERATE_PEX_RTOS_MACROS 1 /* set to 1 to generate the RTOS macros PEX_RTOS_INIT() and PEX_RTOS_START() */ + +/* Macros used by Processor Expert */ +#if McuRTOS_GENERATE_PEX_RTOS_MACROS + #define PEX_RTOS_INIT() /* macro called from PE_low_level_init() */ \ + McuRTOS_Init(); + + #define PEX_RTOS_START() McuRTOS_vTaskStartScheduler() +#endif +/* macro to identify CPU: 0 for M0+ and 4 for M4 */ +#if configCPU_FAMILY_IS_ARM_M0(configCPU_FAMILY) + #define FREERTOS_CPU_CORTEX_M 0 /* Cortex M0+ core */ +#elif configCPU_FAMILY_IS_ARM_M4(configCPU_FAMILY) + #define FREERTOS_CPU_CORTEX_M 4 /* Cortex M4 core */ +#elif configCPU_FAMILY_IS_ARM_M7(configCPU_FAMILY) + #define FREERTOS_CPU_CORTEX_M 7 /* Cortex M7 core */ +#endif + +/* Prototypes for interrupt service handlers */ +void vPortSVCHandler(void); +void vPortPendSVHandler(void); +void vPortTickHandler(void); + +/* Version of Processor Expert (variable VersionOfPEx): 1313 */ + +#ifndef __BWUserType_Tsize_t +#define __BWUserType_Tsize_t + typedef size_t Tsize_t; /* Alias to size_t standard type */ +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + + +#define McuRTOS_xTaskCreate(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pvCreatedTask) \ + xTaskCreate(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pvCreatedTask) +/* +** =================================================================== +** Method : xTaskCreate (component FreeRTOS) +** +** Description : +** Create a new task and add it to the list of tasks that are +** ready to run. +** Parameters : +** NAME - DESCRIPTION +** pvTaskCode - Pointer to the task entry +** function. Tasks must be implemented to +** never return (i.e. continuous loop). +** pcName - A descriptive name for the task. +** This is mainly used to facilitate debugging. +** Max length defined by +** configMAX_TASK_NAME_LEN. +** usStackDepth - The size of the task +** stack specified as the number of variables +** the stack can hold - not the number of +** bytes. For example, if the stack is 16 bits +** wide and usStackDepth is defined as 100, +** 200 bytes will be allocated for stack +** storage. The stack depth multiplied by the +** stack width must not exceed the maximum +** value that can be contained in a variable +** of type size_t. +** pvParameters - Pointer that will be +** used as the parameter for the task being +** created. +** uxPriority - The priority at which the +** task should run. +** pvCreatedTask - Used to pass back a +** handle by which the created task can be +** referenced. +** Returns : +** --- - pdPASS if the task was successfully +** created and added to a ready list, +** otherwise an error code defined in the file +** projdefs.h +** =================================================================== +*/ + +#define McuRTOS_vTaskDelete(pxTask) \ + vTaskDelete(pxTask) +/* +** =================================================================== +** Method : vTaskDelete (component FreeRTOS) +** +** Description : +** Remove a task from the RTOS real time kernels management. +** The task being deleted will be removed from all ready, +** blocked, suspended and event lists. +** NOTE: The idle task is responsible for freeing the kernel +** allocated memory from tasks that have been deleted. It is +** therefore important that the idle task is not starved of +** microcontroller processing time if your application makes +** any calls to vTaskDelete (). Memory allocated by the task +** code is not automatically freed, and should be freed before +** the task is deleted. +** Parameters : +** NAME - DESCRIPTION +** pxTask - The handle of the task to be deleted. +** Passing NULL will cause the calling task to +** be deleted. +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_vTaskStartScheduler() \ + vTaskStartScheduler() +/* +** =================================================================== +** Method : vTaskStartScheduler (component FreeRTOS) +** +** Description : +** Starts the real time kernel tick processing. After calling +** the kernel has control over which tasks are executed and +** when. +** The idle task is created automatically when +** vTaskStartScheduler() is called. +** If vTaskStartScheduler() is successful the function will not +** return until an executing task calls vTaskEndScheduler(). +** The function might fail and return immediately if there is +** insufficient RAM available for the idle task to be created. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_taskYIELD() \ + taskYIELD() +/* +** =================================================================== +** Method : taskYIELD (component FreeRTOS) +** +** Description : +** Macro for forcing a context switch. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_taskENTER_CRITICAL() \ + taskENTER_CRITICAL() +/* +** =================================================================== +** Method : taskENTER_CRITICAL (component FreeRTOS) +** +** Description : +** Macro to mark the start of a critical code region. +** Preemptive context switches cannot occur when in a critical +** region. +** NOTE: This may alter the stack (depending on the portable +** implementation) so must be used with care! +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_taskEXIT_CRITICAL() \ + taskEXIT_CRITICAL() +/* +** =================================================================== +** Method : taskEXIT_CRITICAL (component FreeRTOS) +** +** Description : +** Macro to mark the end of a critical code region. Preemptive +** context switches cannot occur when in a critical region. +** NOTE: This may alter the stack (depending on the portable +** implementation) so must be used with care! +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_taskDISABLE_INTERRUPTS() \ + taskDISABLE_INTERRUPTS() +/* +** =================================================================== +** Method : taskDISABLE_INTERRUPTS (component FreeRTOS) +** +** Description : +** Macro to disable all maskable interrupts. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_taskENABLE_INTERRUPTS() \ + taskENABLE_INTERRUPTS() +/* +** =================================================================== +** Method : taskENABLE_INTERRUPTS (component FreeRTOS) +** +** Description : +** Macro to enable microcontroller interrupts. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_vTaskSuspendAll() \ + vTaskSuspendAll() +/* +** =================================================================== +** Method : vTaskSuspendAll (component FreeRTOS) +** +** Description : +** Suspends all real time kernel activity while keeping +** interrupts (including the kernel tick) enabled. +** After calling vTaskSuspendAll () the calling task will +** continue to execute without risk of being swapped out until +** a call to xTaskResumeAll () has been made. +** API functions that have the potential to cause a context +** switch (for example, vTaskDelayUntil(), xQueueSend(), etc.) +** must not be called while the scheduler is suspended. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_xTaskResumeAll() \ + xTaskResumeAll() +/* +** =================================================================== +** Method : xTaskResumeAll (component FreeRTOS) +** +** Description : +** Resumes real time kernel activity following a call to +** vTaskSuspendAll (). After a call to xTaskSuspendAll () the +** kernel will take control of which task is executing at any +** time. +** Parameters : None +** Returns : +** --- - If resuming the scheduler caused a context +** switch then pdTRUE is returned, otherwise +** pdFALSE is returned. +** =================================================================== +*/ + +#define McuRTOS_vTaskDelay(xTicksToDelay) \ + vTaskDelay(xTicksToDelay) +/* +** =================================================================== +** Method : vTaskDelay (component FreeRTOS) +** +** Description : +** Delay a task for a given number of ticks. The actual time +** that the task remains blocked depends on the tick rate. The +** macro pdMS_TO_TICKS() can be used to calculate real time +** from the tick rate - with the resolution of one tick period. +** vTaskDelay() specifies a time at which the task wishes to +** unblock relative to the time at which vTaskDelay() is called. +** For example, specifying a block period of 100 ticks will +** cause the task to unblock 100 ticks after vTaskDelay() is +** called. vTaskDelay() does not therefore provide a good +** method of controlling the frequency of a cyclical task as +** the path taken through the code, as well as other task and +** interrupt activity, will effect the frequency at which +** vTaskDelay() gets called and therefore the time at which the +** task next executes. See vTaskDelayUntil() for an alternative +** API function designed to facilitate fixed frequency +** execution. It does this by specifying an absolute time +** (rather than a relative time) at which the calling task +** should unblock. +** Parameters : +** NAME - DESCRIPTION +** xTicksToDelay - The amount of time, in +** tick periods, that the calling task should +** block. +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_vTaskDelayUntil(pxPreviousWakeTime, xTimeIncrement) \ + vTaskDelayUntil(pxPreviousWakeTime, xTimeIncrement) +/* +** =================================================================== +** Method : vTaskDelayUntil (component FreeRTOS) +** +** Description : +** Delay a task until a specified time. This function can be +** used by cyclical tasks to ensure a constant execution +** frequency. +** This function differs from vTaskDelay() in one important +** aspect: vTaskDelay() specifies a time at which the task +** wishes to unblock relative to the time at which vTaskDelay() +** is called, whereas vTaskDelayUntil() specifies an absolute +** time at which the task wishes to unblock. +** vTaskDelay() will cause a task to block for the specified +** number of ticks from the time vTaskDelay() is called. It is +** therefore difficult to use vTaskDelay() by itself to +** generate a fixed execution frequency as the time between a +** task unblocking following a call to vTaskDelay() and that +** task next calling vTaskDelay() may not be fixed [the task +** may take a different path though the code between calls, or +** may get interrupted or preempted a different number of times +** each time it executes]. +** Whereas vTaskDelay() specifies a wake time relative to the +** time at which the function is called, vTaskDelayUntil() +** specifies the absolute (exact) time at which it wishes to +** unblock. +** It should be noted that vTaskDelayUntil() will return +** immediately (without blocking) if it is used to specify a +** wake time that is already in the past. Therefore a task +** using vTaskDelayUntil() to execute periodically will have to +** re-calculate its required wake time if the periodic +** execution is halted for any reason (for example, the task is +** temporarily placed into the Suspended state) causing the +** task to miss one or more periodic executions. This can be +** detected by checking the variable passed by reference as the +** pxPreviousWakeTime parameter against the current tick count. +** This is however not necessary under most usage scenarios. +** The constant portTICK_RATE_MS can be used to calculate real +** time from the tick rate - with the resolution of one tick +** period. +** This function must not be called while the scheduler has +** been suspended by a call to vTaskSuspendAll(). +** Parameters : +** NAME - DESCRIPTION +** pxPreviousWakeTime - Pointer to a +** variable that holds the time at which the +** task was last unblocked. The variable must +** be initialised with the current time prior +** to its first use (see the example below). +** Following this the variable is +** automatically updated within +** vTaskDelayUntil(). +** xTimeIncrement - The cycle time +** period. The task will be unblocked at time +** (*pxPreviousWakeTime + xTimeIncrement). +** Calling vTaskDelayUntil with the same +** xTimeIncrement parameter value will cause +** the task to execute with a fixed interval +** period. +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_uxTaskPriorityGet(pxTask) \ + uxTaskPriorityGet(pxTask) +/* +** =================================================================== +** Method : uxTaskPriorityGet (component FreeRTOS) +** +** Description : +** Obtain the priority of any task. +** Parameters : +** NAME - DESCRIPTION +** pxTask - Handle of the task to be queried. +** Passing a NULL handle results in the +** priority of the calling task being returned. +** Returns : +** --- - The priority of pxTask. +** =================================================================== +*/ + +#define McuRTOS_vTaskPrioritySet(pxTask, uxNewPriority) \ + vTaskPrioritySet(pxTask, uxNewPriority) +/* +** =================================================================== +** Method : vTaskPrioritySet (component FreeRTOS) +** +** Description : +** Set the priority of any task. +** Parameters : +** NAME - DESCRIPTION +** pxTask - Handle to the task for which the +** priority is being set. Passing a NULL +** handle results in the priority of the +** calling task being set. +** uxNewPriority - The priority to which +** the task will be set. +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_xSemaphoreTakeRecursive(xMutex, xBlockTime) \ + xSemaphoreTakeRecursive(xMutex, xBlockTime) + +/* +** =================================================================== +** Method : xSemaphoreTakeRecursive (component FreeRTOS) +** +** Description : +** Macro to recursively obtain, or 'take', a mutex type +** semaphore. The mutex must have previously been created using +** a call to xSemaphoreCreateRecursiveMutex(); +** This macro must not be used on mutexes created using +** xSemaphoreCreateMutex(). A mutex used recursively can be +** 'taken' repeatedly by the owner. The mutex doesn't become +** available again until the owner has called +** xSemaphoreGiveRecursive() for each successful 'take' request. +** For example, if a task successfully 'takes' the same mutex 5 +** times then the mutex will not be available to any other task +** until it has also 'given' the mutex back exactly five times. +** Parameters : +** NAME - DESCRIPTION +** xMutex - A handle to the mutex being obtained. +** This is the handle returned by +** xSemaphoreCreateRecursiveMutex(); +** xBlockTime - The time in ticks to wait +** for the semaphore to become available. The +** macro portTICK_RATE_MS can be used to +** convert this to a real time. A block time +** of zero can be used to poll the semaphore. +** If the task already owns the semaphore then +** xSemaphoreTakeRecursive() will return +** immediately no matter what the value of +** xBlockTime. +** Returns : +** --- - Returns pdTRUE if the semaphore was +** obtained. pdFALSE if xBlockTime expired +** without the semaphore becoming available. +** =================================================================== +*/ + +#define McuRTOS_xSemaphoreGiveRecursive(xMutex) \ + xSemaphoreGiveRecursive(xMutex) + +/* +** =================================================================== +** Method : xSemaphoreGiveRecursive (component FreeRTOS) +** +** Description : +** Macro to recursively release, or 'give', a mutex type +** semaphore. The mutex must have previously been created using +** a call to xSemaphoreCreateRecursiveMutex(); +** This macro must not be used on mutexes created using +** xSemaphoreCreateMutex(). A mutex used recursively can be +** 'taken' repeatedly by the owner. The mutex doesn't become +** available again until the owner has called +** xSemaphoreGiveRecursive() for each successful 'take' request. +** For example, if a task successfully 'takes' the same mutex 5 +** times then the mutex will not be available to any other task +** until it has also 'given' the mutex back exactly five times. +** Parameters : +** NAME - DESCRIPTION +** xMutex - A handle to the mutex being released, +** or 'given'. This is the handle returned by +** xSemaphoreCreateMutex(); +** Returns : +** --- - Returns pdTRUE if the semaphore was given. +** =================================================================== +*/ + +#define McuRTOS_xSemaphoreCreateRecursiveMutex() \ + xSemaphoreCreateRecursiveMutex() + +/* +** =================================================================== +** Method : xSemaphoreCreateRecursiveMutex (component FreeRTOS) +** +** Description : +** Macro that implements a recursive mutex by using the +** existing queue mechanism. +** Mutexes created using this macro can be accessed using the +** xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() +** macros. The xSemaphoreTake() and xSemaphoreGive() macros +** should not be used. +** A mutex used recursively can be 'taken' repeatedly by the +** owner. The mutex doesn't become available again until the +** owner has called xSemaphoreGiveRecursive() for each +** successful 'take' request. For example, if a task +** successfully 'takes' the same mutex 5 times then the mutex +** will not be available to any other task until it has also +** 'given' the mutex back exactly five times. +** This type of semaphore uses a priority inheritance mechanism +** so a task 'taking' a semaphore MUST ALWAYS 'give' the +** semaphore back once the semaphore it is no longer required. +** Mutex type semaphores cannot be used from within interrupt +** service routines. +** See vSemaphoreCreateBinary() for an alternative +** implementation that can be used for pure synchronisation +** (where one task or interrupt always 'gives' the semaphore +** and another always 'takes' the semaphore) and from within +** interrupt service routines. +** Parameters : None +** Returns : +** --- - Handle to the created mutex semaphore. +** Should be of type xSemaphoreHandle. +** =================================================================== +*/ + +#define McuRTOS_vTaskSuspend(pxTaskToSuspend) \ + vTaskSuspend(pxTaskToSuspend) + +/* +** =================================================================== +** Method : vTaskSuspend (component FreeRTOS) +** +** Description : +** Suspend any task. When suspended a task will never get any +** microcontroller processing time, no matter what its priority. +** Calls to vTaskSuspend are not accumulative - i.e. calling +** vTaskSuspend() twice on the same task still only requires +** one call to vTaskResume() to ready the suspended task. +** Parameters : +** NAME - DESCRIPTION +** pxTaskToSuspend - Handle to the task +** being suspended. Passing a NULL handle will +** cause the calling task to be suspended. +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_vTaskResume(pxTaskToResume) \ + vTaskResume(pxTaskToResume) + +/* +** =================================================================== +** Method : vTaskResume (component FreeRTOS) +** +** Description : +** Resumes a suspended task. A task that has been suspended by +** one of more calls to vTaskSuspend() will be made available +** for running again by a single call to vTaskResume(). +** Parameters : +** NAME - DESCRIPTION +** pxTaskToResume - Handle to the task +** being readied. +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_xSemaphoreCreateMutex() \ + xSemaphoreCreateMutex() + +/* +** =================================================================== +** Method : xSemaphoreCreateMutex (component FreeRTOS) +** +** Description : +** Macro that creates a mutex semaphore by using the existing +** queue mechanism. +** Mutexes created using this macro can be accessed using the +** xSemaphoreTake() and xSemaphoreGive() macros. The +** xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() +** macros should not be used. +** Mutexes and binary semaphores are very similar but have some +** subtle differences: Mutexes include a priority inheritance +** mechanism, binary semaphores do not. This makes binary +** semaphores the better choice for implementing +** synchronisation (between tasks or between tasks and an +** interrupt), and mutexes the better choice for implementing +** simple mutual exclusion. +** The priority of a task that 'takes' a mutex can potentially +** be raised if another task of higher priority attempts to +** obtain the same mutex. The task that owns the mutex +** 'inherits' the priority of the task attempting to 'take' the +** same mutex. This means the mutex must always be 'given' back +** - otherwise the higher priority task will never be able to +** obtain the mutex, and the lower priority task will never +** 'disinherit' the priority. An example of a mutex being used +** to implement mutual exclusion is provided on the +** xSemaphoreTake() documentation page. +** A binary semaphore need not be given back once obtained, so +** task synchronisation can be implemented by one +** task/interrupt continuously 'giving' the semaphore while +** another continuously 'takes' the semaphore. This is +** demonstrated by the sample code on the +** xSemaphoreGiveFromISR() documentation page. +** Both mutex and binary semaphores are assigned to variables +** of type xSemaphoreHandle and can be used in any API function +** that takes a parameter of this type. +** Parameters : None +** Returns : +** --- - Handle to the created mutex semaphore. +** Should be of type xSemaphoreHandle. +** =================================================================== +*/ + +#define McuRTOS_xSemaphoreTake(xMutex, xBlockTime) \ + xSemaphoreTake(xMutex, xBlockTime) + +/* +** =================================================================== +** Method : xSemaphoreTake (component FreeRTOS) +** +** Description : +** Macro to obtain a semaphore. The semaphore must have +** previously been created with a call to +** vSemaphoreCreateBinary(), xSemaphoreCreateMutex() or +** xSemaphoreCreateCounting(). +** This macro must not be called from an ISR. +** xQueueReceiveFromISR() can be used to take a semaphore from +** within an interrupt if required, although this would not be +** a normal operation. Semaphores use queues as their +** underlying mechanism, so functions are to some extent +** interoperable. +** xSemaphoreTake() is part of the fully featured intertask +** communications API. xSemaphoreAltTake() is the alternative +** API equivalent. Both versions require the same parameters +** and return the same values. +** Parameters : +** NAME - DESCRIPTION +** xMutex - A handle to the mutex being obtained. +** This is the handle returned by +** xSemaphoreCreateMutex(); +** xBlockTime - The time in ticks to wait +** for the semaphore to become available. The +** macro portTICK_RATE_MS can be used to +** convert this to a real time. A block time +** of zero can be used to poll the semaphore. +** If the task already owns the semaphore then +** xSemaphoreTakeRecursive() will return +** immediately no matter what the value of +** xBlockTime. Specifying the block time as +** portMAX_DELAY will cause the task to block +** indefinitely (without a timeout). +** Returns : +** --- - Returns pdTRUE if the semaphore was +** obtained. pdFALSE if xBlockTime expired +** without the semaphore becoming available. +** =================================================================== +*/ + +#define McuRTOS_xSemaphoreGive(xMutex) \ + xSemaphoreGive(xMutex) + +/* +** =================================================================== +** Method : xSemaphoreGive (component FreeRTOS) +** +** Description : +** Macro to release a semaphore. The semaphore must have +** previously been created with a call to +** vSemaphoreCreateBinary(), xSemaphoreCreateMutex() or +** xSemaphoreCreateCounting(), and obtained using +** sSemaphoreTake(). +** This must not be used from an ISR. See +** xSemaphoreGiveFromISR() for an alternative which can be used +** from an ISR. +** This macro must also not be used on semaphores created using +** xSemaphoreCreateRecursiveMutex(). +** xSemaphoreGive() is part of the fully featured intertask +** communications API. xSemaphoreAltGive() is the alternative +** API equivalent. Both versions require the same parameters +** and return the same values. +** Parameters : +** NAME - DESCRIPTION +** xMutex - A handle to the mutex being released, +** or 'given'. This is the handle returned by +** xSemaphoreCreateMutex(); +** Returns : +** --- - Returns pdTRUE if the semaphore was given. +** =================================================================== +*/ + +#define McuRTOS_vSemaphoreCreateBinary(xSemaphore) \ + vSemaphoreCreateBinary(xSemaphore) + +/* +** =================================================================== +** Method : vSemaphoreCreateBinary (component FreeRTOS) +** +** Description : +** Macro that creates a semaphore by using the existing queue +** mechanism. The queue length is 1 as this is a binary +** semaphore. The data size is 0 as we don't want to actually +** store any data - we just want to know if the queue is empty +** or full. +** Binary semaphores and mutexes are very similar but have some +** subtle differences: Mutexes include a priority inheritance +** mechanism, binary semaphores do not. This makes binary +** semaphores the better choice for implementing +** synchronisation (between tasks or between tasks and an +** interrupt), and mutexes the better choice for implementing +** simple mutual exclusion. +** This old vSemaphoreCreateBinary() macro is now deprecated in +** favour of the xSemaphoreCreateBinary() function. Note that +** binary semaphores created using the vSemaphoreCreateBinary() +** macro are created in a state such that the first call to +** 'take' the semaphore would pass, whereas binary semaphores +** created using xSemaphoreCreateBinary() are created in a +** state such that the the semaphore must first be 'given' +** before it can be 'taken'. +** A binary semaphore need not be given back once obtained, so +** task synchronisation can be implemented by one +** task/interrupt continuously 'giving' the semaphore while +** another continuously 'takes' the semaphore. This is +** demonstrated by the sample code on the +** xSemaphoreGiveFromISR() documentation page. +** The priority of a task that 'takes' a mutex can potentially +** be raised if another task of higher priority attempts to +** obtain the same mutex. The task that owns the mutex +** 'inherits' the priority of the task attempting to 'take' the +** same mutex. This means the mutex must always be 'given' back +** - otherwise the higher priority task will never be able to +** obtain the mutex, and the lower priority task will never +** 'disinherit' the priority. An example of a mutex being used +** to implement mutual exclusion is provided on the +** xSemaphoreTake() documentation page. +** Both mutex and binary semaphores are assigned to variables +** of type xSemaphoreHandle and can be used in any API function +** that takes a parameter of this type. +** Parameters : +** NAME - DESCRIPTION +** xSemaphore - Handle to the created +** semaphore. Should be of type +** xSemaphoreHandle. +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_xSemaphoreCreateCounting(uxMaxCount, uxInitialCount) \ + xSemaphoreCreateCounting(uxMaxCount, uxInitialCount) + +/* +** =================================================================== +** Method : xSemaphoreCreateCounting (component FreeRTOS) +** +** Description : +** Macro that creates a counting semaphore by using the +** existing queue mechanism. +** Counting semaphores are typically used for two things: +** 1. Counting events. +** In this usage scenario an event handler will 'give' a +** semaphore each time an event occurs (incrementing the +** semaphore count value), and a handler task will 'take' a +** semaphore each time it processes an event (decrementing the +** semaphore count value). The count value is therefore the +** difference between the number of events that have occurred +** and the number that have been processed. In this case it is +** desirable for the initial count value to be zero. +** 2. Resource management. +** In this usage scenario the count value indicates the number +** of resources available. To obtain control of a resource a +** task must first obtain a semaphore - decrementing the +** semaphore count value. When the count value reaches zero +** there are no free resources. When a task finishes with the +** resource it 'gives' the semaphore back - incrementing the +** semaphore count value. In this case it is desirable for the +** initial count value to be equal to the maximum count value, +** indicating that all resources are free. +** Parameters : +** NAME - DESCRIPTION +** uxMaxCount - The maximum count value that +** can be reached. When the semaphore reaches +** this value it can no longer be 'given'. +** uxInitialCount - The count value +** assigned to the semaphore when it is +** created. +** Returns : +** --- - xSemaphoreHandle handle +** =================================================================== +*/ + +#define McuRTOS_xSemaphoreGiveFromISR(xSemaphore, pxHigherPriorityTaskWoken) \ + xSemaphoreGiveFromISR(xSemaphore, pxHigherPriorityTaskWoken) + +/* +** =================================================================== +** Method : xSemaphoreGiveFromISR (component FreeRTOS) +** +** Description : +** Macro to release a semaphore. The semaphore must have +** previously been created with a call to +** vSemaphoreCreateBinary() or xSemaphoreCreateCounting(). +** Mutex type semaphores (those created using a call to +** xSemaphoreCreateMutex()) must not be used with this macro. +** This macro can be used from an ISR. +** Parameters : +** NAME - DESCRIPTION +** xSemaphore - A handle to the semaphore +** being released. This is the handle returned +** when the semaphore was created. +** * pxHigherPriorityTaskWoken +** - xSemaphoreGiveFromISR() will set +** *pxHigherPriorityTaskWoken to pdTRUE if +** giving the semaphoree caused a task to +** unblock, and the unblocked task has a +** priority higher than the currently running +** task. If xSemaphoreGiveFromISR() sets this +** value to pdTRUE then a context switch +** should be requested before the interrupt is +** exited. +** Returns : +** --- - Returns pdTRUE if the semaphore was given. +** =================================================================== +*/ + +#define McuRTOS_vSemaphoreDelete(xSemaphore) \ + vSemaphoreDelete(xSemaphore) +/* +** =================================================================== +** Method : vSemaphoreDelete (component FreeRTOS) +** +** Description : +** Delete a semaphore. This function must be used with care. +** For example, do not delete a mutex type semaphore if the +** mutex is held by a task. +** Parameters : +** NAME - DESCRIPTION +** xSemaphore - A handle to the semaphore to +** be deleted. +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_vTaskList(pcWriteBuffer, bufSize) \ + vTaskList(pcWriteBuffer, bufSize) + +/* +** =================================================================== +** Method : vTaskList (component FreeRTOS) +** +** Description : +** configUSE_TRACE_FACILITY, INCLUDE_vTaskDelete and +** INCLUDE_vTaskSuspend must all be defined as 1 for this +** function to be available. See the configuration section for +** more information. +** NOTE: This function will disable interrupts for its duration. +** It is not intended for normal application runtime use but as +** a debug aid. Lists all the current tasks, along with their +** current state and stack usage high water mark. +** Tasks are reported as blocked ('B'), ready ('R'), deleted +** ('D') or suspended ('S'). +** Parameters : +** NAME - DESCRIPTION +** * pcWriteBuffer - Pointer to buffer. A +** buffer into which the above mentioned +** details will be written, in ascii form. +** This buffer is assumed to be large enough +** to contain the generated report. +** Approximately 40 bytes per task should be +** sufficient. +** bufSize - size of buffer +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_pvPortMalloc(xWantedSize) \ + pvPortMalloc(xWantedSize) +/* +** =================================================================== +** Method : pvPortMalloc (component FreeRTOS) +** +** Description : +** Allocates a memory block using the port pvPortMalloc() +** function +** Parameters : +** NAME - DESCRIPTION +** xWantedSize - size of memory block +** requested +** Returns : +** --- - memory block or NULL if failed +** =================================================================== +*/ + +#define McuRTOS_vPortFree(pv) \ + vPortFree(pv) +/* +** =================================================================== +** Method : vPortFree (component FreeRTOS) +** +** Description : +** Frees a memory block previously allocated with pvPortMalloc() +** Parameters : +** NAME - DESCRIPTION +** * pv - Pointer to data +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_xTaskGetTickCount() \ + xTaskGetTickCount() +/* +** =================================================================== +** Method : xTaskGetTickCount (component FreeRTOS) +** +** Description : +** Return the count of ticks since vTaskStartScheduler was +** called. +** Parameters : None +** Returns : +** --- - tick count +** =================================================================== +*/ + +#define McuRTOS_xTaskGetSchedulerState() \ + xTaskGetSchedulerState() +/* +** =================================================================== +** Method : xTaskGetSchedulerState (component FreeRTOS) +** +** Description : +** Returns the state of the scheduler +** Parameters : None +** Returns : +** --- - One of the following constants (defined +** within task.h): taskSCHEDULER_NOT_STARTED, +** taskSCHEDULER_RUNNING, +** taskSCHEDULER_SUSPENDED. +** =================================================================== +*/ + +#define McuRTOS_uxTaskGetStackHighWaterMark(xTask) \ + uxTaskGetStackHighWaterMark(xTask) +/* +** =================================================================== +** Method : uxTaskGetStackHighWaterMark (component FreeRTOS) +** +** Description : +** The stack used by a task will grow and shrink as the task +** executes and interrupts are processed. +** uxTaskGetStackHighWaterMark() returns the minimum amount of +** remaining stack space that was available to the task since +** the task started executing - that is the amount of stack +** that remained unused when the task stack was at its greatest +** (deepest) value. This is what is referred to as the stack +** 'high water mark'. +** Parameters : +** NAME - DESCRIPTION +** xTask - The handle of the task being queried. +** A task may query its own high water mark by +** passing NULL as the xTask parameter. +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuRTOS_uxTaskGetNumberOfTasks() \ + uxTaskGetNumberOfTasks() +/* +** =================================================================== +** Method : uxTaskGetNumberOfTasks (component FreeRTOS) +** +** Description : +** Returns the number of tasks +** Parameters : None +** Returns : +** --- - number of tasks +** =================================================================== +*/ + +#define McuRTOS_vTaskGetRunTimeStats(pcWriteBuffer, bufSize) \ + vTaskGetRunTimeStats(pcWriteBuffer, bufSize) + +/* +** =================================================================== +** Method : vTaskGetRunTimeStats (component FreeRTOS) +** +** Description : +** configGENERATE_RUN_TIME_STATS must be defined as 1 for this +** function to be available. The application must also then +** provide definitions for +** portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and +** portGET_RUN_TIME_COUNTER_VALUE to configure a peripheral +** timer/counter and return the timers current count value +** respectively. The counter should be at least 10 times the +** frequency of the tick count. +** NOTE: This function will disable interrupts for its duration. +** It is not intended for normal application runtime use but as +** a debug aid. +** Setting configGENERATE_RUN_TIME_STATS to 1 will result in a +** total accumulated execution time being stored for each task. +** The resolution of the accumulated time value depends on the +** frequency of the timer configured by the +** portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro. Calling +** vTaskGetRunTimeStats() writes the total execution time of +** each task into a buffer, both as an absolute count value and +** as a percentage of the total system execution time. +** Parameters : +** NAME - DESCRIPTION +** pcWriteBuffer - A buffer into which +** the execution times will be written, in +** ascii form. This buffer is assumed to be +** large enough to contain the generated +** report. Approximately 40 bytes per task +** should be sufficient. +** bufSize - size of buffer +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_xPortGetFreeHeapSize() \ + xPortGetFreeHeapSize() + +/* +** =================================================================== +** Method : xPortGetFreeHeapSize (component FreeRTOS) +** +** Description : +** Returns the actual free size of the heap +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuRTOS_xQueueCreate(uxQueueLength, uxItemSize) \ + xQueueCreate(uxQueueLength, uxItemSize) +/* +** =================================================================== +** Method : xQueueCreate (component FreeRTOS) +** +** Description : +** Creates a queue. +** Parameters : +** NAME - DESCRIPTION +** uxQueueLength - The maximum number of +** items the queue can hold at any time. +** uxItemSize - The size in bytes of each +** item the queue will hold. +** Returns : +** --- - A handle to the created queue is returned +** provided the queue was created successfully. +** NULL is returned if the queue cannot be +** created because there is too little heap +** RAM available. +** =================================================================== +*/ + +#define McuRTOS_xQueueSendToFront(xQueue, pvItemToQueue, xTicksToWait) \ + xQueueSendToFront(xQueue, pvItemToQueue, xTicksToWait) +/* +** =================================================================== +** Method : xQueueSendToFront (component FreeRTOS) +** +** Description : +** Sends an item to the front of a queue. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue to which the +** data is to be sent. +** pvItemToQueue - A pointer to the data +** to be sent to the queue. The size of the +** data that can be sent to a queue was +** defined when the queue was created. +** xTicksToWait - The number of ticks for +** which the calling task should be held in +** the Blocked state to wait for space to +** become available on the queue should the +** queue already be full. +** A value of zero will prevent the calling +** task from entering the Blocked state. +** If INCLUDE_vTaskSuspend is set to 1 then a +** value of portMAX_DELAY will hold the task +** in the Blocked state indefinitely to wait +** for space to become available on the queue. +** Returns : +** --- - pdPASS: Data was successfully sent to the +** queue. If a block time was specified then +** the calling task may have been temporarily +** placed into the Blocked state to wait for +** space to become available and space did +** become available before the block time +** expired. +** errQUEUE_FULL: The queue is already full so +** no data could be sent to the queue. If a +** block time was specified then the calling +** task may have been temporarily placed into +** the Blocked state to wait for space to +** become available, but no space became +** available before the block time expired. +** =================================================================== +*/ + +#define McuRTOS_xQueueSendToBack(xQueue, pvItemToQueue, xTicksToWait) \ + xQueueSendToBack(xQueue, pvItemToQueue, xTicksToWait) +/* +** =================================================================== +** Method : xQueueSendToBack (component FreeRTOS) +** +** Description : +** Sends an item to the back of a queue. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue to which the +** data is to be sent. +** pvItemToQueue - A pointer to the data +** to be sent to the queue. The size of the +** data that can be sent to a queue was +** defined when the queue was created. +** xTicksToWait - The number of ticks for +** which the calling task should be held in +** the Blocked state to wait for space to +** become available on the queue should the +** queue already be full. +** A value of zero will prevent the calling +** task from entering the Blocked state. +** If INCLUDE_vTaskSuspend is set to 1 then a +** value of portMAX_DELAY will hold the task +** in the Blocked state indefinitely to wait +** for space to become available on the queue. +** Returns : +** --- - pdPASS: Data was successfully sent to the +** queue. If a block time was specified then +** the calling task may have been temporarily +** placed into the Blocked state to wait for +** space to become available and space did +** become available before the block time +** expired. +** errQUEUE_FULL: The queue is already full so +** no data could be sent to the queue. If a +** block time was specified then the calling +** task may have been temporarily placed into +** the Blocked state to wait for space to +** become available, but no space became +** available before the block time expired. +** =================================================================== +*/ + +#define McuRTOS_xQueueReceive(xQueue, pvBuffer, xTicksToWait) \ + xQueueReceive(xQueue, pvBuffer, xTicksToWait) +/* +** =================================================================== +** Method : xQueueReceive (component FreeRTOS) +** +** Description : +** Receives an item from a queue. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue from which +** the data is to be received. +** pvBuffer - A pointer to the memory into +** which the data received from the queue will +** be copied. +** The length of the buffer must be at least +** equal to the queue item size (set when the +** queue was created). +** xTicksToWait - The number of ticks for +** which the calling task should be held in +** the Blocked state to wait for data to +** become available from the queue should the +** queue already be empty. +** A value of zero will prevent the calling +** task from entering the Blocked state. +** If INCLUDE_vTaskSuspend is set to 1 then a +** value of portMAX_DELAY will hold the task +** in the Blocked state indefinitely to wait +** for data. +** Returns : +** --- - pdPASS: Data was successfully read from +** the queue. If a block time was specified +** then the calling task may have been +** temporarily placed into the Blocked state +** to wait for data to become available and +** data did become available before the block +** time expired. +** errQUEUE_EMPTY: The queue was empty so no +** date could be read form the queue. If a +** block time was specified then the calling +** task may have been temporarily placed into +** the Blocked state to wait for data to +** become available, but no data became +** available before the block time expired. +** =================================================================== +*/ + +#define McuRTOS_xQueuePeek(xQueue, pvBuffer, xTicksToWait) \ + xQueuePeek(xQueue, pvBuffer, xTicksToWait) +/* +** =================================================================== +** Method : xQueuePeek (component FreeRTOS) +** +** Description : +** Reads an item from a queue, but does not remove the item +** from the queue. Therefore the same item would be returned +** the next time xQueueReceive() or xQueuePeek() was called on +** the same queue. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue from which +** the data is to be read. +** pvBuffer - A pointer to the memory into +** which the data read from the queue will be +** copied. The length of the buffer must be at +** least equal to the queue item size (set +** when the queue was created). +** xTicksToWait - The number of ticks for +** which the calling task should be held in +** the Blocked state to wait for data to +** become available from the queue should the +** queue already be empty. +** A value of zero will prevent the calling +** task from entering the Blocked state. +** If INCLUDE_vTaskSuspend is set to 1 then a +** value of portMAX_DELAY will hold the task +** in the Blocked state indefinitely to wait +** for data. +** Returns : +** --- - pdPASS: Data was successfully read from +** the queue. If a block time was specified +** then the calling task may have been +** temporarily placed into the Blocked state +** to wait for data to become available and +** data did become available before the block +** time expired. +** errQUEUE_EMPTY: The queue was empty so no +** date could be read form the queue. If a +** block time was specified then the calling +** task may have been temporarily placed into +** the Blocked state to wait for data to +** become available, but no data became +** available before the block time expired. +** =================================================================== +*/ + +#define McuRTOS_vQueueDelete(pxQueueToDelete) \ + vQueueDelete(pxQueueToDelete) +/* +** =================================================================== +** Method : vQueueDelete (component FreeRTOS) +** +** Description : +** Deletes a queue that was previously created using a call to +** xQueueCreate(). vQueueDelete() can also be used to delete a +** semaphore. +** Parameters : +** NAME - DESCRIPTION +** pxQueueToDelete - The handle of the +** queue being deleted. Semaphore handles can +** also be used. Queues are used to pass data +** between tasks and between tasks and +** interrupts. A queue/semaphore must not be +** deleted if there are any tasks that are +** blocked on the queue/semaphore waiting for +** events (sends or receives). +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_uxQueueMessagesWaiting(xQueue) \ + uxQueueMessagesWaiting(xQueue) +/* +** =================================================================== +** Method : uxQueueMessagesWaiting (component FreeRTOS) +** +** Description : +** Queries the number of items that are currently held within a +** queue. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue being +** queried. +** Returns : +** --- - The number of items that are held within +** the queue being queried. +** =================================================================== +*/ + +#define McuRTOS_uxQueueMessagesWaitingfromISR(xQueue) \ + uxQueueMessagesWaitingfromISR(xQueue) +/* +** =================================================================== +** Method : uxQueueMessagesWaitingfromISR (component FreeRTOS) +** +** Description : +** A version of uxQueueMessagesWaiting() that can be used from +** inside an interrupt service routine. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue being +** queried. +** Returns : +** --- - The number of items that are held within +** the queue being queried. +** =================================================================== +*/ + +#define McuRTOS_xQueueReceiveFromISR(xQueue, pvBuffer, pxHigherPriorityTaskWoken) \ + xQueueReceiveFromISR(xQueue, pvBuffer, pxHigherPriorityTaskWoken) +/* +** =================================================================== +** Method : xQueueReceiveFromISR (component FreeRTOS) +** +** Description : +** A version of xQueueReceive() that can be called from an ISR. +** Unlike xQueueReceive(), xQueueReceiveFromISR() does not +** permit a block time to be specified. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue from which +** the data is to be received. +** pvBuffer - A pointer to the memory into +** which the data received from the queue will +** be copied.The length of the buffer must be +** at least equal to the queue item size (set +** when the queue was created). +** * pxHigherPriorityTaskWoken +** - Pointer to A task may be blocked waiting +** for space to become available on the queue. +** If xQueueReceiveFromISR() causes such a +** task to unblock then +** *pxHigherPriorityTaskWoken will get set to +** pdTRUE, otherwise +** *pxHigherPriorityTaskWoken will remain +** unchanged. +** Returns : +** --- - pdPASS: Data was successfully read from +** the queue. If a block time was specified +** then the calling task may have been +** temporarily placed into the Blocked state +** to wait for data to become available and +** data did become available before the block +** time expired. +** errQUEUE_EMPTY: The queue was empty so no +** date could be read form the queue. If a +** block time was specified then the calling +** task may have been temporarily placed into +** the Blocked state to wait for data to +** become available, but no data became +** available before the block time expired. +** =================================================================== +*/ + +#define McuRTOS_xQueueSendToFrontFromISR(xQueue, pvItemToQueue, pxHigherPriorityTaskWoken) \ + xQueueSendToFrontFromISR(xQueue, pvItemToQueue, pxHigherPriorityTaskWoken) +/* +** =================================================================== +** Method : xQueueSendToFrontFromISR (component FreeRTOS) +** +** Description : +** Versions of xQueueSendToFront() API functions that can be +** called from an ISR. Unlike xQueueSendToFront() these +** functions do not permit a block time to be specified. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue to which the +** data is to be sent. +** pvItemToQueue - A pointer to the data +** to be sent to the queue. The size of the +** data that can be sent to a queue was +** defined when the queue was created. +** * pxHigherPriorityTaskWoken +** - xQueueSendFromISR() will set +** *pxHigherPriorityTaskWoken to pdTRUE if +** sending to the queue caused a task to +** unblock, and the unblocked task has a +** priority higher than the currently running +** task. If xQueueSendFromISR() sets this +** value to pdTRUE then a context switch +** should be performed before the interrupt is +** exited. +** Returns : +** --- - pdTRUE Data was successfully sent to the +** queue. +** errQUEUE_FULL Data could not be sent to the +** queue because the queue was already full. +** =================================================================== +*/ + +#define McuRTOS_xQueueSendToBackFromISR(xQueue, pvItemToQueue,pxHigherPriorityTaskWoken) \ + xQueueSendToBackFromISR(xQueue, pvItemToQueue,pxHigherPriorityTaskWoken) +/* +** =================================================================== +** Method : xQueueSendToBackFromISR (component FreeRTOS) +** +** Description : +** Versions of xQueueSendToBack() API functions that can be +** called from an ISR. Unlike xQueueSendToBack() these +** functions do not permit a block time to be specified. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue to which the +** data is to be sent. +** pvItemToQueue - A pointer to the data +** to be sent to the queue. The size of the +** data that can be sent to a queue was +** defined when the queue was created. +** * pxHigherPriorityTaskWoken +** - xQueueSendFromISR() will set +** *pxHigherPriorityTaskWoken to pdTRUE if +** sending to the queue caused a task to +** unblock, and the unblocked task has a +** priority higher than the currently running +** task. If xQueueSendFromISR() sets this +** value to pdTRUE then a context switch +** should be performed before the interrupt is +** exited. +** Returns : +** --- - pdTRUE Data was successfully sent to the +** queue. +** errQUEUE_FULL Data could not be sent to the +** queue because the queue was already full. +** =================================================================== +*/ + +#define McuRTOS_xTaskResumeFromISR(pxTaskToResume) \ + xTaskResumeFromISR(pxTaskToResume) + +/* +** =================================================================== +** Method : xTaskResumeFromISR (component FreeRTOS) +** +** Description : +** An implementation of vTaskResume() that can be called from +** within an ISR. A task that has been suspended by one of more +** calls to vTaskSuspend() will be made available for running +** again by a single call to xTaskResumeFromISR(). +** Parameters : +** NAME - DESCRIPTION +** pxTaskToResume - Handle to the task +** being readied. +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuRTOS_xQueueReset(xQueue) \ + xQueueReset(xQueue) + +/* +** =================================================================== +** Method : xQueueReset (component FreeRTOS) +** +** Description : +** Reset a queue back to its original empty state. pdPASS is +** returned if the queue is successfully reset. pdFAIL is +** returned if the queue could not be reset because there are +** tasks blocked on the queue waiting to either receive from +** the queue or send to the queue. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue to reset. +** Returns : +** --- - pdPASS is returned if the queue is +** successfully reset. pdFAIL is returned if +** the queue could not be reset because there +** are tasks blocked on the queue waiting to +** either receive from the queue or send to +** the queue. +** =================================================================== +*/ + +#define McuRTOS_xSemaphoreGetMutexHolder(xSemaphore) \ + xSemaphoreGetMutexHolder(xSemaphore) + +/* +** =================================================================== +** Method : xSemaphoreGetMutexHolder (component FreeRTOS) +** +** Description : +** Returns the holder of a mutex or semaphore. If xMutex is +** indeed a mutex type semaphore, return the current mutex +** holder. If xMutex is not a mutex type semaphore, or the +** mutex is available (not held by a task), return NULL. Note: +** This Is is a good way of determining if the calling task is +** the mutex holder, but not a good way of determining the +** identity of the mutex holder as the holder may change +** between the function exiting and the returned value being +** tested. +** Parameters : +** NAME - DESCRIPTION +** xSemaphore - A handle to the semaphore. +** Returns : +** --- - Not NULL if the calling task is the holder +** of the mutex, NULL otherwise. +** =================================================================== +*/ + +#define McuRTOS_xSemaphoreTakeFromISR(xSemaphore, pxHigherPriorityTaskWoken) \ + xSemaphoreTakeFromISR(xSemaphore, pxHigherPriorityTaskWoken) + +/* +** =================================================================== +** Method : xSemaphoreTakeFromISR (component FreeRTOS) +** +** Description : +** Macro to take a semaphore from an ISR. The semaphore must +** have previously been created with a call to +** vSemaphoreCreateBinary() or xSemaphoreCreateCounting(). +** Mutex type semaphores (those created using a call to +** xSemaphoreCreateMutex()) must not be used with this macro. +** This macro can be used from an ISR, however taking a +** semaphore from an ISR is not a common operation. It is +** likely to only be useful when taking a counting semaphore +** when an interrupt is obtaining an object from a resource +** pool (when the semaphore count indicates the number of +** resources available). +** Parameters : +** NAME - DESCRIPTION +** xSemaphore - A handle to the semaphore +** being taken. This is the handle returned +** when the semaphore was created. +** * pxHigherPriorityTaskWoken +** - xSemaphoreTakeFromISR() will set +** *pxHigherPriorityTaskWoken to pdTRUE if +** taking the semaphore caused a task to +** unblock, and the unblocked task has a +** priority higher than the currently running +** task. If xSemaphoreTakeFromISR() sets this +** value to pdTRUE then a context switch +** should be requested before the interrupt is +** exited. +** Returns : +** --- - Returns pdTRUE if the semaphore was given. +** =================================================================== +*/ + +#if configUSE_SHELL +uint8_t McuRTOS_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : ParseCommand (component FreeRTOS) +** +** Description : +** Shell Command Line Parser +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command string +** * handled - Pointer to variable which tells if +** the command has been handled or not +** * io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ +#endif + +void McuRTOS_Init(void); +/* +** =================================================================== +** Method : Init (component FreeRTOS) +** +** Description : +** Low level initialization routine called from startup code. +** This method ensures that the tick timer is not enabled. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_xTaskGetCurrentTaskHandle() \ + xTaskGetCurrentTaskHandle() +/* +** =================================================================== +** Method : xTaskGetCurrentTaskHandle (component FreeRTOS) +** +** Description : +** The handle of the currently running (calling) task. +** Parameters : None +** Returns : +** --- - The handle of the currently running +** (calling) task. +** =================================================================== +*/ + +#define McuRTOS_xTaskGetIdleTaskHandle() \ + xTaskGetIdleTaskHandle() +/* +** =================================================================== +** Method : xTaskGetIdleTaskHandle (component FreeRTOS) +** +** Description : +** The task handle associated with the Idle task. The Idle task +** is created automatically when the RTOS scheduler is started. +** Parameters : None +** Returns : +** --- - The task handle associated with the Idle +** task. The Idle task is created +** automatically when the RTOS scheduler is +** started. +** =================================================================== +*/ + +#define McuRTOS_eTaskGetState(xTask) \ + eTaskGetState(xTask) +/* +** =================================================================== +** Method : eTaskGetState (component FreeRTOS) +** +** Description : +** Returns as an enumerated type the state in which a task +** existed at the time eTaskGetState() was executed. +** Parameters : +** NAME - DESCRIPTION +** xTask - The handle of the subject task (the +** task being queried). +** Returns : +** --- - task state (eReady, eRunning, eBlocked, +** eSuspended, eDeleted) +** =================================================================== +*/ + +#define McuRTOS_pcTaskGetTaskName(xTaskToQuery) \ + pcTaskGetTaskName(xTaskToQuery) +/* +** =================================================================== +** Method : pcTaskGetTaskName (component FreeRTOS) +** +** Description : +** Returns the name of the task. +** Parameters : +** NAME - DESCRIPTION +** xTaskToQuery - The handle of the task +** being queried. xTaskToQuery can be set to +** NULL to query the name of the calling task. +** Returns : +** --- - A pointer to the subject tasks name, which +** is a standard NULL terminated C string +** =================================================================== +*/ + +#define McuRTOS_xTaskGetTickCountFromISR() \ + xTaskGetTickCountFromISR() +/* +** =================================================================== +** Method : xTaskGetTickCountFromISR (component FreeRTOS) +** +** Description : +** A version of xTaskGetTickCount() that can be called from an +** ISR. +** Parameters : None +** Returns : +** --- - The count of ticks since +** vTaskStartScheduler was called. +** =================================================================== +*/ + +#define McuRTOS_vTaskStepTick(xTicksToJump) \ + vTaskStepTick(xTicksToJump) +/* +** =================================================================== +** Method : vTaskStepTick (component FreeRTOS) +** +** Description : +** If the RTOS is configured to use tickless idle +** functionality then the tick interrupt will be stopped, and +** the microcontroller placed into a low power state, whenever +** the Idle task is the only task able to execute. Upon exiting +** the low power state the tick count value must be corrected +** to account for the time that passed while it was stopped. +** If a FreeRTOS port includes a default +** portSUPPRESS_TICKS_AND_SLEEP() implementation, then +** vTaskStepTick() is used internally to ensure the correct +** tick count value is maintained. vTaskStepTick() is a public +** API function to allow the default +** portSUPPRESS_TICKS_AND_SLEEP() implementation to be +** overridden, and for a portSUPPRESS_TICKS_AND_SLEEP() to be +** provided if the port being used does not provide a default. +** Parameters : +** NAME - DESCRIPTION +** xTicksToJump - The number of RTOS ticks +** that have passed since the tick interrupt +** was stopped. For correct operation the +** parameter must be less than or equal to the +** portSUPPRESS_TICKS_AND_SLEEP() parameter. +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_xQueuePeekFromISR(xQueue, pvBuffer, xTicksToWait) \ + xQueuePeekFromISR(xQueue, pvBuffer, xTicksToWait) +/* +** =================================================================== +** Method : xQueuePeekFromISR (component FreeRTOS) +** +** Description : +** A version of xQueuePeek() that can be used from an interrupt +** service routine (ISR). Reads an item from a queue, but does +** not remove the item from the queue. Therefore the same item +** would be returned the next time xQueueReceive() or +** xQueuePeek() was called on the same queue. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue from which +** the data is to be read. +** pvBuffer - A pointer to the memory into +** which the data read from the queue will be +** copied. The length of the buffer must be at +** least equal to the queue item size (set +** when the queue was created). +** xTicksToWait - The number of ticks for +** which the calling task should be held in +** the Blocked state to wait for data to +** become available from the queue should the +** queue already be empty. +** A value of zero will prevent the calling +** task from entering the Blocked state. +** If INCLUDE_vTaskSuspend is set to 1 then a +** value of portMAX_DELAY will hold the task +** in the Blocked state indefinitely to wait +** for data. +** Returns : +** --- - pdPASS: Data was successfully read from +** the queue. If a block time was specified +** then the calling task may have been +** temporarily placed into the Blocked state +** to wait for data to become available and +** data did become available before the block +** time expired. +** errQUEUE_EMPTY: The queue was empty so no +** date could be read form the queue. If a +** block time was specified then the calling +** task may have been temporarily placed into +** the Blocked state to wait for data to +** become available, but no data became +** available before the block time expired. +** =================================================================== +*/ + +#define McuRTOS_xQueueOverwrite(xQueue, pvItemToQueue) \ + xQueueOverwrite(xQueue, pvItemToQueue) +/* +** =================================================================== +** Method : xQueueOverwrite (component FreeRTOS) +** +** Description : +** This is a macro that calls the xQueueGenericSend() function. +** A version of xQueueSendToBack() that will write to the queue +** even if the queue is full, overwriting data that is already +** held in the queue. xQueueOverwrite() is intended for use +** with queues that have a length of one, meaning the queue is +** either empty or full. This function must not be called from +** an interrupt service routine (ISR). See +** xQueueOverwriteFromISR() for an alternative which may be +** used in an ISR. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue to which the +** data is to be sent. +** pvItemToQueue - A pointer to the data +** to be sent to the queue. The size of the +** data that can be sent to a queue was +** defined when the queue was created. +** Returns : +** --- - pdPASS: Data was successfully sent to the +** queue. If a block time was specified then +** the calling task may have been temporarily +** placed into the Blocked state to wait for +** space to become available and space did +** become available before the block time +** expired. +** errQUEUE_FULL: The queue is already full so +** no data could be sent to the queue. If a +** block time was specified then the calling +** task may have been temporarily placed into +** the Blocked state to wait for space to +** become available, but no space became +** available before the block time expired. +** =================================================================== +*/ + +#define McuRTOS_xQueueOverwriteFromISR(xQueue, pvItemToQueue, pxHigherPriorityTaskWoken) \ + xQueueOverwriteFromISR(xQueue, pvItemToQueue, pxHigherPriorityTaskWoken) +/* +** =================================================================== +** Method : xQueueOverwriteFromISR (component FreeRTOS) +** +** Description : +** This is a macro that calls the xQueueGenericSendFromISR() +** function. A version of xQueueOverwrite() that can be used in +** an ISR. xQueueOverwriteFromISR() is similar to +** xQueueSendToBackFromISR(), but will write to the queue even +** if the queue is full, overwriting data that is already held +** in the queue. xQueueOverwriteFromISR() is intended for use +** with queues that have a length of one, meaning the queue is +** either empty or full. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue to which the +** data is to be sent. +** pvItemToQueue - A pointer to the data +** to be sent to the queue. The size of the +** data that can be sent to a queue was +** defined when the queue was created. +** * pxHigherPriorityTaskWoken +** - xQueueSendFromISR() will set +** *pxHigherPriorityTaskWoken to pdTRUE if +** sending to the queue caused a task to +** unblock, and the unblocked task has a +** priority higher than the currently running +** task. If xQueueSendFromISR() sets this +** value to pdTRUE then a context switch +** should be performed before the interrupt is +** exited. +** Returns : +** --- - pdTRUE Data was successfully sent to the +** queue. +** errQUEUE_FULL Data could not be sent to the +** queue because the queue was already full. +** =================================================================== +*/ + +#define McuRTOS_vQueueAddToRegistry(xQueue, pcQueueName) \ + vQueueAddToRegistry(xQueue, pcQueueName) +/* +** =================================================================== +** Method : vQueueAddToRegistry (component FreeRTOS) +** +** Description : +** Assigns a name to a queue and adds the queue to the registry. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue being added +** to the registry. +** * pcQueueName - Pointer to the name to be +** assigned to the queue. This is just a text +** string used to facilitate debugging. +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_vQueueUnregisterQueue(xQueue) \ + vQueueUnregisterQueue(xQueue) +/* +** =================================================================== +** Method : vQueueUnregisterQueue (component FreeRTOS) +** +** Description : +** Removes a queue from the queue registry. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue being +** removed from the registry. +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_xQueueIsQueueFullFromISR(xQueue) \ + xQueueIsQueueFullFromISR(xQueue) +/* +** =================================================================== +** Method : xQueueIsQueueFullFromISR (component FreeRTOS) +** +** Description : +** Queries a queue to determine if the queue is full. This +** function should only be used in an ISR. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue being +** queried. +** Returns : +** --- - pdFALSE if the queue is not full, or any +** other value if the queue is full. +** =================================================================== +*/ + +#define McuRTOS_xQueueIsQueueEmptyFromISR(xQueue) \ + xQueueIsQueueEmptyFromISR(xQueue) +/* +** =================================================================== +** Method : xQueueIsQueueEmptyFromISR (component FreeRTOS) +** +** Description : +** Queries a queue to determine if the queue is empty. This +** function should only be used in an ISR. +** Parameters : +** NAME - DESCRIPTION +** xQueue - The handle of the queue being +** queried. +** Returns : +** --- - pdFALSE if the queue is not empty, or any +** other value if the queue is empty. +** =================================================================== +*/ + +#define McuRTOS_xQueueAddToSet(xQueueOrSemaphore, xQueueSet) \ + xQueueAddToSet(xQueueOrSemaphore, xQueueSet) +/* +** =================================================================== +** Method : xQueueAddToSet (component FreeRTOS) +** +** Description : +** Adds an RTOS queue or semaphore to a queue set that was +** previously created by a call to xQueueCreateSet(). +** Parameters : +** NAME - DESCRIPTION +** xQueueOrSemaphore - The handle of +** the queue or semaphore being added to the +** queue set (cast to an xQueueSetMemberHandle +** type). +** xQueueSet - The handle of the queue set to +** which the queue or semaphore is being added. +** Returns : +** --- - If the queue or semaphore was successfully +** added to the queue set then pdPASS is +** returned. If the queue could not be +** successfully added to the queue set because +** it is already a member of a different queue +** set then pdFAIL is returned. +** =================================================================== +*/ + +#define McuRTOS_xQueueCreateSet(uxEventQueueLength) \ + xQueueCreateSet(uxEventQueueLength) +/* +** =================================================================== +** Method : xQueueCreateSet (component FreeRTOS) +** +** Description : +** Queue sets provide a mechanism to allow an RTOS task to +** block (pend) on a read operation from multiple RTOS queues +** or semaphores simultaneously. Note that there are simpler +** alternatives to using queue sets. See the Blocking on +** Multiple Objects page for more information. +** Parameters : +** NAME - DESCRIPTION +** uxEventQueueLength - +** Returns : +** --- - If the queue set is created successfully +** then a handle to the created queue set is +** returned. Otherwise NULL is returned. +** =================================================================== +*/ + +#define McuRTOS_xQueueRemoveFromSet(xQueueOrSemaphore, xQueueSet) \ + xQueueRemoveFromSet(xQueueOrSemaphore, xQueueSet) +/* +** =================================================================== +** Method : xQueueRemoveFromSet (component FreeRTOS) +** +** Description : +** Remove an RTOS queue or semaphore from a queue set. An RTOS +** queue or semaphore can only be removed from a queue set if +** the queue or semaphore is empty. +** Parameters : +** NAME - DESCRIPTION +** xQueueOrSemaphore - The handle of +** the queue or semaphore being removed from +** the queue set (cast to an +** xQueueSetMemberHandle type). +** xQueueSet - The handle of the queue set in +** which the queue or semaphore is included. +** Returns : +** --- - If the queue or semaphore was successfully +** added to the queue set then pdPASS is +** returned. If the queue could not be +** successfully added to the queue set because +** it is already a member of a different queue +** set then pdFAIL is returned. +** =================================================================== +*/ + +#define McuRTOS_xQueueSelectFromSet(xQueueSet, xBlockTimeTicks) \ + xQueueSelectFromSet(xQueueSet, xBlockTimeTicks) +/* +** =================================================================== +** Method : xQueueSelectFromSet (component FreeRTOS) +** +** Description : +** xQueueSelectFromSet() selects from the members of a queue +** set a queue or semaphore that either contains data (in the +** case of a queue) or is available to take (in the case of a +** semaphore). xQueueSelectFromSet() effectively allows a task +** to block (pend) on a read operation on all the queues and +** semaphores in a queue set simultaneously. +** Parameters : +** NAME - DESCRIPTION +** xQueueSet - The queue set on which the +** task will (potentially) block. +** xBlockTimeTicks - The maximum time, +** in ticks, that the calling task will remain +** in the Blocked state (with other tasks +** executing) to wait for a member of the +** queue set to be ready for a successful +** queue read or semaphore take operation. +** Returns : +** --- - xQueueSelectFromSet() will return the +** handle of a queue (cast to a +** xQueueSetMemberHandle type) contained in +** the queue set that contains data, or the +** handle of a semaphore (cast to a +** xQueueSetMemberHandle type) contained in +** the queue set that is available, or NULL if +** no such queue or semaphore exists before +** before the specified block time expires. +** =================================================================== +*/ + +#define McuRTOS_xQueueSelectFromSetFromISR(xQueueSet) \ + xQueueSelectFromSetFromISR(xQueueSet) +/* +** =================================================================== +** Method : xQueueSelectFromSetFromISR (component FreeRTOS) +** +** Description : +** A version of xQueueSelectFromSet() that can be used from an +** interrupt service routine (ISR). +** Parameters : +** NAME - DESCRIPTION +** xQueueSet - The queue set being queried. +** It is not possible to block on a read as +** this function is designed to be used from +** an interrupt. +** Returns : +** --- - xQueueSelectFromSet() will return the +** handle of a queue (cast to a +** xQueueSetMemberHandle type) contained in +** the queue set that contains data, or the +** handle of a semaphore (cast to a +** xQueueSetMemberHandle type) contained in +** the queue set that is available, or NULL if +** no such queue or semaphore exists before +** before the specified block time expires. +** =================================================================== +*/ + +#define McuRTOS_xEventGroupCreate() \ + xEventGroupCreate() +/* +** =================================================================== +** Method : xEventGroupCreate (component FreeRTOS) +** +** Description : +** Create a new RTOS event group. This function cannot be +** called from an interrupt. +** Event groups are stored in variables of type +** EventGroupHandle_t. The number of bits (or flags) +** implemented within an event group is 8 if +** configUSE_16_BIT_TICKS is set to 1, or 24 if +** configUSE_16_BIT_TICKS is set to 0. The dependency on +** configUSE_16_BIT_TICKS results from the data type used for +** thread local storage in the internal implementation of RTOS +** tasks. +** Parameters : None +** Returns : +** --- - Event Group Handle. If the event group was +** created then a handle to the event group is +** returned. If there was insufficient +** FreeRTOS heap available to create the event +** group then NULL is returned. +** =================================================================== +*/ + +#define McuRTOS_xEventGroupWaitBits(xEventGroup, uxBitsToWaitFor, xClearOnExit, xWaitForAllBits, xTicksToWait) \ + xEventGroupWaitBits(xEventGroup, uxBitsToWaitFor, xClearOnExit, xWaitForAllBits, xTicksToWait) +/* +** =================================================================== +** Method : xEventGroupWaitBits (component FreeRTOS) +** +** Description : +** Read bits within an RTOS event group, optionally entering +** the Blocked state (with a timeout) to wait for a bit or +** group of bits to become set. This function cannot be called +** from an interrupt. +** Parameters : +** NAME - DESCRIPTION +** xEventGroup - The event group in which +** the bits are being tested. The event group +** must have previously been created using a +** call to xEventGroupCreate(). +** uxBitsToWaitFor - A bitwise value +** that indicates the bit or bits to test +** inside the event group. For example, to +** wait for bit 0 and/or bit 2 set +** uxBitsToWaitFor to 0x05. To wait for bits 0 +** and/or bit 1 and/or bit 2 set +** uxBitsToWaitFor to 0x07. Etc. +** uxBitsToWaitFor must not be set to 0. +** xClearOnExit - If xClearOnExit is set +** to pdTRUE then any bits set in the value +** passed as the uxBitsToWaitFor parameter +** will be cleared in the event group before +** xEventGroupWaitBits() returns if +** xEventGroupWaitBits() returns for any +** reason other than a timeout. The timeout +** value is set by the xTicksToWait parameter. +** If xClearOnExit is set to pdFALSE then the +** bits set in the event group are not altered +** when the call to xEventGroupWaitBits() +** returns. +** xWaitForAllBits - xWaitForAllBits is +** used to create either a logical AND test +** (where all bits must be set) or a logical +** OR test (where one or more bits must be set) +** as follows: +** If xWaitForAllBits is set to pdTRUE then +** xEventGroupWaitBits() will return when +** either all the bits set in the value passed +** as the uxBitsToWaitFor parameter are set in +** the event group or the specified block time +** expires. +** If xWaitForAllBits is set to pdFALSE then +** xEventGroupWaitBits() will return when any +** of the bits set in the value passed as the +** uxBitsToWaitFor parameter are set in the +** event group or the specified block time +** expires. +** xTicksToWait - The maximum amount of +** time (specified in 'ticks') to wait for +** one/all (depending on the xWaitForAllBits +** value) of the bits specified by +** uxBitsToWaitFor to become set. +** Returns : +** --- - EventBits_t: The value of the event group +** at the time either the event bits being +** waited for became set, or the block time +** expired. The current value of the event +** bits in an event group will be different to +** the returned value if a higher priority +** task or interrupt changed the value of an +** event bit between the calling task leaving +** the Blocked state and exiting the +** xEventGroupWaitBits() function. +** Test the return value to know which bits +** were set. If xEventGroupWaitBits() returned +** because its timeout expired then not all +** the bits being waited for will be set. If +** xEventGroupWaitBits() returned because the +** bits it was waiting for were set then the +** returned value is the event group value +** before any bits were automatically cleared +** because the xClearOnExit parameter was set +** to pdTRUE. +** =================================================================== +*/ + +#define McuRTOS_xEventGroupSetBits(xEventGroup, uxBitsToSet) \ + xEventGroupSetBits(xEventGroup, uxBitsToSet) +/* +** =================================================================== +** Method : xEventGroupSetBits (component FreeRTOS) +** +** Description : +** Set bits (flags) within an RTOS event group. This function +** cannot be called from an interrupt. +** xEventGroupSetBitsFromISR() is a version that can be called +** from an interrupt. +** Setting bits in an event group will automatically unblock +** tasks that are blocked waiting for the bits. +** Parameters : +** NAME - DESCRIPTION +** xEventGroup - The event group in which +** the bits are to be set. The event group +** must have previously been created using a +** call to xEventGroupCreate(). +** uxBitsToSet - A bitwise value that +** indicates the bit or bits to set in the +** event group. For example, set uxBitsToSet +** to 0x08 to set only bit 3. Set uxBitsToSet +** to 0x09 to set bit 3 and bit 0. +** Returns : +** --- - The value of the event group at the time +** the call to xEventGroupSetBits() returns. +** There are two reasons why the returned +** value might have the bits specified by the +** uxBitsToSet parameter cleared: +** If setting a bit results in a task that was +** waiting for the bit leaving the blocked +** state then it is possible the bit will have +** been cleared automatically (see the +** xClearBitOnExit parameter of +** xEventGroupWaitBits()). +** Any unblocked (or otherwise Ready state) +** task that has a priority above that of the +** task that called xEventGroupSetBits() will +** execute and may change the event group +** value before the call to +** xEventGroupSetBits() returns. +** =================================================================== +*/ + +#define McuRTOS_xEventGroupSetBitsFromISR(xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken) \ + xEventGroupSetBitsFromISR(xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken) +/* +** =================================================================== +** Method : xEventGroupSetBitsFromISR (component FreeRTOS) +** +** Description : +** Set bits (flags) within an RTOS event group. A version of +** xEventGroupSetBits() that can be called from an interrupt +** service routine (ISR). +** Setting bits in an event group will automatically unblock +** tasks that are blocked waiting for the bits. +** Setting bits in an event group is not a deterministic +** operation because there are an unknown number of tasks that +** may be waiting for the bit or bits being set. FreeRTOS does +** not allow non-deterministic operations to be performed in +** interrupts or from critical sections. Therefore +** xEventGroupSetBitFromISR() sends a message to the RTOS +** daemon task to have the set operation performed in the +** context of the daemon task - where a scheduler lock is used +** in place of a critical section. +** INCLUDE_xEventGroupSetBitFromISR, configUSE_TIMERS and +** INCLUDE_xTimerPendFunctionCall must all be set to 1 in +** FreeRTOSConfig.h for the xEventGroupSetBitsFromISR() +** function to be available. +** Parameters : +** NAME - DESCRIPTION +** xEventGroup - The event group in which +** the bits are to be set. The event group +** must have previously been created using a +** call to xEventGroupCreate(). +** uxBitsToSet - A bitwise value that +** indicates the bit or bits to set in the +** event group. For example, set uxBitsToSet +** to 0x08 to set only bit 3. Set uxBitsToSet +** to 0x09 to set bit 3 and bit 0. +** pxHigherPriorityTaskWoken +** - Calling this function will result in a +** message being sent to the RTOS daemon task. +** If the priority of the daemon task is +** higher than the priority of the currently +** running task (the task the interrupt +** interrupted) then +** *pxHigherPriorityTaskWoken will be set to +** pdTRUE by xEventGroupSetBitsFromISR(), +** indicating that a context switch should be +** requested before the interrupt exits. For +** that reason *pxHigherPriorityTaskWoken must +** be initialised to pdFALSE. See the example +** code below. +** Returns : +** --- - The value of the event group at the time +** the call to xEventGroupSetBits() returns. +** There are two reasons why the returned +** value might have the bits specified by the +** uxBitsToSet parameter cleared: +** If setting a bit results in a task that was +** waiting for the bit leaving the blocked +** state then it is possible the bit will have +** been cleared automatically (see the +** xClearBitOnExit parameter of +** xEventGroupWaitBits()). +** Any unblocked (or otherwise Ready state) +** task that has a priority above that of the +** task that called xEventGroupSetBits() will +** execute and may change the event group +** value before the call to +** xEventGroupSetBits() returns. +** =================================================================== +*/ + +#define McuRTOS_xEventGroupClearBits(xEventGroup, uxBitsToSet) \ + xEventGroupClearBits(xEventGroup, uxBitsToSet) +/* +** =================================================================== +** Method : xEventGroupClearBits (component FreeRTOS) +** +** Description : +** Clear bits (flags) within an RTOS event group. This function +** cannot be called from an interrupt. See +** xEventGroupClearBitsFromISR() for a version that can be +** called from an interrupt. +** Parameters : +** NAME - DESCRIPTION +** xEventGroup - The event group in which +** the bits are to be cleared. The event group +** must have previously been created using a +** call to xEventGroupCreate(). +** uxBitsToSet - A bitwise value that +** indicates the bit or bits to clear in the +** event group. For example set uxBitsToClear +** to 0x08 to clear just bit 3. Set +** uxBitsToClear to 0x09 to clear bit 3 and +** bit 0. +** Returns : +** --- - The value of the event group at the time +** the call to xEventGroupSetBits() returns. +** There are two reasons why the returned +** value might have the bits specified by the +** uxBitsToSet parameter cleared: +** If setting a bit results in a task that was +** waiting for the bit leaving the blocked +** state then it is possible the bit will have +** been cleared automatically (see the +** xClearBitOnExit parameter of +** xEventGroupWaitBits()). +** Any unblocked (or otherwise Ready state) +** task that has a priority above that of the +** task that called xEventGroupSetBits() will +** execute and may change the event group +** value before the call to +** xEventGroupSetBits() returns. +** =================================================================== +*/ + +#define McuRTOS_xEventGroupClearBitsFromISR(xEventGroup, uxBitsToSet) \ + xEventGroupClearBitsFromISR(xEventGroup, uxBitsToSet) +/* +** =================================================================== +** Method : xEventGroupClearBitsFromISR (component FreeRTOS) +** +** Description : +** A version of xEventGroupClearBits() that can be called from +** an interrupt. +** Parameters : +** NAME - DESCRIPTION +** xEventGroup - The event group in which +** the bits are to be set. The event group +** must have previously been created using a +** call to xEventGroupCreate(). +** uxBitsToSet - A bitwise value that +** indicates the bit or bits to set in the +** event group. For example, set uxBitsToSet +** to 0x08 to set only bit 3. Set uxBitsToSet +** to 0x09 to set bit 3 and bit 0. +** Returns : +** --- - The value of the event group at the time +** the call to xEventGroupSetBits() returns. +** There are two reasons why the returned +** value might have the bits specified by the +** uxBitsToSet parameter cleared: +** If setting a bit results in a task that was +** waiting for the bit leaving the blocked +** state then it is possible the bit will have +** been cleared automatically (see the +** xClearBitOnExit parameter of +** xEventGroupWaitBits()). +** Any unblocked (or otherwise Ready state) +** task that has a priority above that of the +** task that called xEventGroupSetBits() will +** execute and may change the event group +** value before the call to +** xEventGroupSetBits() returns. +** =================================================================== +*/ + +#define McuRTOS_xEventGroupGetBits(xEventGroup) \ + xEventGroupGetBits(xEventGroup) +/* +** =================================================================== +** Method : xEventGroupGetBits (component FreeRTOS) +** +** Description : +** Returns the current value of the event bits (event flags) in +** an RTOS event group. This function cannot be used from an +** interrupt. See xEventGroupsGetBitsFromISR() for a version +** that can be used in an interrupt. +** Parameters : +** NAME - DESCRIPTION +** xEventGroup - The event group being +** queried. The event group must have +** previously been created using a call to +** xEventGroupCreate(). +** Returns : +** --- - The value of the event bits in the event +** group at the time xEventGroupGetBits() was +** called. +** =================================================================== +*/ + +#define McuRTOS_xEventGroupGetBitsFromISR(xEventGroup) \ + xEventGroupGetBitsFromISR(xEventGroup) +/* +** =================================================================== +** Method : xEventGroupGetBitsFromISR (component FreeRTOS) +** +** Description : +** A version of xEventGroupGetBits() that can be called from an +** interrupt. +** Parameters : +** NAME - DESCRIPTION +** xEventGroup - The event group being +** queried. The event group must have +** previously been created using a call to +** xEventGroupCreate(). +** Returns : +** --- - The value of the event bits in the event +** group at the time xEventGroupGetBits() was +** called. +** =================================================================== +*/ + +#define McuRTOS_xEventGroupSync(xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTicksToWait) \ + xEventGroupSync(xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTicksToWait) +/* +** =================================================================== +** Method : xEventGroupSync (component FreeRTOS) +** +** Description : +** Atomically set bits (flags) within an RTOS event group, +** then wait for a combination of bits to be set within the +** same event group. This functionality is typically used to +** synchronise multiple tasks (often called a task rendezvous), +** where each task has to wait for the other tasks to reach a +** synchronisation point before proceeding. +** This function cannot be used from an interrupt. +** The function will return before its block time expires if +** the bits specified by the uxBitsToWait parameter are set, or +** become set within that time. In this case all the bits +** specified by uxBitsToWait will be automatically cleared +** before the function returns. +** Parameters : +** NAME - DESCRIPTION +** xEventGroup - The event group in which +** the bits are being set and tested. The +** event group must have previously been +** created using a call to xEventGroupCreate(). +** uxBitsToSet - The bit or bits to set in +** the event group before determining if (and +** possibly waiting for), all the bits +** specified by the uxBitsToWait parameter are +** set. For example, set uxBitsToSet to 0x04 +** to set bit 2 within the event group. +** uxBitsToWaitFor - A bitwise value +** that indicates the bit or bits to test +** inside the event group. For example, set +** uxBitsToWaitFor to 0x05 to wait for bits 0 +** and bit 2. Set uxBitsToWaitFor to 0x07 to +** wait for bit 0 and bit 1 and bit 2. Etc. +** xTicksToWait - The maximum amount of +** time (specified in 'ticks') to wait for all +** the bits specified by the uxBitsToWaitFor +** parameter value to become set. +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuRTOS_xTimerCreate(pcTimerName, xTimerPeriod, uxAutoReload, pvTimerID, pxCallbackFunction) \ + xTimerCreate(pcTimerName, xTimerPeriod, uxAutoReload, pvTimerID, pxCallbackFunction) +/* +** =================================================================== +** Method : xTimerCreate (component FreeRTOS) +** +** Description : +** Creates a new software timer instance. This allocates the +** storage required by the new timer, initialises the new +** timers internal state, and returns a handle by which the new +** timer can be referenced. +** Parameters : +** NAME - DESCRIPTION +** pcTimerName - +** Atextnamethatisassignedtothetimer_Thisisdone +** purelytoassistdebugging_TheRTOSkernelitselfo +** nlyeverreferencesatimerbyitshandle_andneverb +** yitsname_ +** xTimerPeriod - The timer period. The +** time is defined in tick periods so the +** constant portTICK_PERIOD_MS can be used to +** convert a time that has been specified in +** milliseconds. For example, if the timer +** must expire after 100 ticks, then +** xTimerPeriod should be set to 100. +** Alternatively, if the timer must expire +** after 500ms, then xPeriod can be set to ( +** 500 / portTICK_PERIOD_MS ) provided +** configTICK_RATE_HZ is less than or equal to +** 1000. +** uxAutoReload - If uxAutoReload is set +** to pdTRUE, then the timer will expire +** repeatedly with a frequency set by the +** xTimerPeriod parameter. If uxAutoReload is +** set to pdFALSE, then the timer will be a +** one-shot and enter the dormant state after +** it expires. +** pvTimerID - An identifier that is assigned +** to the timer being created. Typically this +** would be used in the timer callback +** function to identify which timer expired +** when the same callback function is assigned +** to more than one timer. +** pxCallbackFunction - The function +** to call when the timer expires. Callback +** functions must have the prototype defined +** by TimerCallbackFunction_t, which is "void +** vCallbackFunction( TimerHandle_t xTimer );". +** Returns : +** --- - Timer handle. If the timer is successfully +** created then a handle to the newly created +** timer is returned. If the timer cannot be +** created (because either there is +** insufficient FreeRTOS heap remaining to +** allocate the timer structures, or the timer +** period was set to 0) then NULL is returned. +** =================================================================== +*/ + +#define McuRTOS_xTimerIsTimerActive(xTimer) \ + xTimerIsTimerActive(xTimer) +/* +** =================================================================== +** Method : xTimerIsTimerActive (component FreeRTOS) +** +** Description : +** Queries a timer to see if it is active or dormant. +** A timer will be dormant if: +** It has been created but not started, or +** It is an expired one-shot timer that has not been restarted. +** Timers are created in the dormant state. The xTimerStart(), +** xTimerReset(), xTimerStartFromISR(), xTimerResetFromISR(), +** xTimerChangePeriod() and xTimerChangePeriodFromISR() API +** functions can all be used to transition a timer into the +** active state. +** Parameters : +** NAME - DESCRIPTION +** xTimer - The timer being queried. +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuRTOS_xTimerStart(xTimer, xBlockTime) \ + xTimerStart(xTimer, xBlockTime) +/* +** =================================================================== +** Method : xTimerStart (component FreeRTOS) +** +** Description : +** Timer functionality is provided by a timer service/daemon +** task. Many of the public FreeRTOS timer API functions send +** commands to the timer service task through a queue called +** the timer command queue. The timer command queue is private +** to the RTOS kernel itself and is not directly accessible to +** application code. The length of the timer command queue is +** set by the configTIMER_QUEUE_LENGTH configuration constant. +** xTimerStart() starts a timer that was previously created +** using the xTimerCreate() API function. If the timer had +** already been started and was already in the active state, +** then xTimerStart() has equivalent functionality to the +** xTimerReset() API function. +** Starting a timer ensures the timer is in the active state. +** If the timer is not stopped, deleted, or reset in the mean +** time, the callback function associated with the timer will +** get called 'n 'ticks after xTimerStart() was called, where +** 'n' is the timers defined period. +** It is valid to call xTimerStart() before the RTOS scheduler +** has been started, but when this is done the timer will not +** actually start until the RTOS scheduler is started, and the +** timers expiry time will be relative to when the RTOS +** scheduler is started, not relative to when xTimerStart() was +** called. +** The configUSE_TIMERS configuration constant must be set to 1 +** for xTimerStart() to be available. +** Parameters : +** NAME - DESCRIPTION +** xTimer - The handle of the timer being +** started/restarted. +** xBlockTime - Specifies the time, in ticks, +** that the calling task should be held in the +** Blocked state to wait for the start command +** to be successfully sent to the timer +** command queue, should the queue already be +** full when xTimerStart() was called. +** xBlockTime is ignored if xTimerStart() is +** called before the RTOS scheduler is started. +** Returns : +** --- - pdFAIL will be returned if the start +** command could not be sent to the timer +** command queue even after xBlockTime ticks +** had passed. pdPASS will be returned if the +** command was successfully sent to the timer +** command queue. When the command is actually +** processed will depend on the priority of +** the timer service/daemon task relative to +** other tasks in the system, although the +** timers expiry time is relative to when +** xTimerStart() is actually called. The timer +** service/daemon task priority is set by the +** configTIMER_TASK_PRIORITY configuration +** constant. +** =================================================================== +*/ + +#define McuRTOS_xTimerStop(xTimer, xBlockTime) \ + xTimerStop(xTimer, xBlockTime) +/* +** =================================================================== +** Method : xTimerStop (component FreeRTOS) +** +** Description : +** Timer functionality is provided by a timer service/daemon +** task. Many of the public FreeRTOS timer API functions send +** commands to the timer service task through a queue called +** the timer command queue. The timer command queue is private +** to the RTOS kernel itself and is not directly accessible to +** application code. The length of the timer command queue is +** set by the configTIMER_QUEUE_LENGTH configuration constant. +** xTimerStop() stops a timer that was previously started using +** either of the xTimerStart(), xTimerReset(), +** xTimerStartFromISR(), xTimerResetFromISR(), +** xTimerChangePeriod() and xTimerChangePeriodFromISR() API +** functions. +** Stopping a timer ensures the timer is not in the active +** state. +** The configUSE_TIMERS configuration constant must be set to 1 +** for xTimerStop() to be available. +** Parameters : +** NAME - DESCRIPTION +** xTimer - The handle of the timer being +** stopped. +** xBlockTime - Specifies the time, in ticks, +** that the calling task should be held in the +** Blocked state to wait for the stop command +** to be successfully sent to the timer +** command queue, should the queue already be +** full when xTimerStop() was called. +** xBlockTime is ignored if xTimerStop() is +** called before the RTOS scheduler is started. +** Returns : +** --- - pdFAIL will be returned if the stop +** command could not be sent to the timer +** command queue even after xBlockTime ticks +** had passed. pdPASS will be returned if the +** command was successfully sent to the timer +** command queue. When the command is actually +** processed will depend on the priority of +** the timer service/daemon task relative to +** other tasks in the system. The timer +** service/daemon task priority is set by the +** configTIMER_TASK_PRIORITY configuration +** constant. +** =================================================================== +*/ + +#define McuRTOS_xTimerChangePeriod(xTimer, xNewPeriod, xBlockTime) \ + xTimerChangePeriod(xTimer, xNewPeriod, xBlockTime) +/* +** =================================================================== +** Method : xTimerChangePeriod (component FreeRTOS) +** +** Description : +** Timer functionality is provided by a timer service/daemon +** task. Many of the public FreeRTOS timer API functions send +** commands to the timer service task through a queue called +** the timer command queue. The timer command queue is private +** to the RTOS kernel itself and is not directly accessible to +** application code. The length of the timer command queue is +** set by the configTIMER_QUEUE_LENGTH configuration constant. +** xTimerChangePeriod() changes the period of a timer that was +** previously created using the xTimerCreate() API function. +** xTimerChangePeriod() can be called to change the period of +** an active or dormant state timer. +** The configUSE_TIMERS configuration constant must be set to 1 +** for xTimerChangePeriod() to be available. +** Parameters : +** NAME - DESCRIPTION +** xTimer - The handle of the timer that is +** having its period changed. +** xNewPeriod - The new period for xTimer. +** Timer periods are specified in tick periods, +** so the constant portTICK_PERIOD_MS can be +** used to convert a time that has been +** specified in milliseconds. For example, if +** the timer must expire after 100 ticks, then +** xNewPeriod should be set to 100. +** Alternatively, if the timer must expire +** after 500ms, then xNewPeriod can be set to +** ( 500 / portTICK_PERIOD_MS ) provided +** configTICK_RATE_HZ is less than or equal to +** 1000. +** xBlockTime - Specifies the time, in ticks, +** that the calling task should be held in the +** Blocked state to wait for the change period +** command to be successfully sent to the +** timer command queue, should the queue +** already be full when xTimerChangePeriod() +** was called. xBlockTime is ignored if +** xTimerChangePeriod() is called before the +** RTOS scheduler is started. +** Returns : +** --- - pdFAIL will be returned if the change +** period command could not be sent to the +** timer command queue even after xBlockTime +** ticks had passed. pdPASS will be returned +** if the command was successfully sent to the +** timer command queue. When the command is +** actually processed will depend on the +** priority of the timer service/daemon task +** relative to other tasks in the system. The +** timer service/daemon task priority is set +** by the configTIMER_TASK_PRIORITY +** configuration constant. +** =================================================================== +*/ + +#define McuRTOS_xTimerDelete(xTimer, xBlockTime) \ + xTimerDelete(xTimer, xBlockTime) +/* +** =================================================================== +** Method : xTimerDelete (component FreeRTOS) +** +** Description : +** Timer functionality is provided by a timer service/daemon +** task. Many of the public FreeRTOS timer API functions send +** commands to the timer service task through a queue called +** the timer command queue. The timer command queue is private +** to the RTOS kernel itself and is not directly accessible to +** application code. The length of the timer command queue is +** set by the configTIMER_QUEUE_LENGTH configuration constant. +** xTimerDelete() deletes a timer that was previously created +** using the xTimerCreate() API function. +** The configUSE_TIMERS configuration constant must be set to 1 +** for xTimerDelete() to be available. +** Parameters : +** NAME - DESCRIPTION +** xTimer - The handle of the timer being +** deleted. +** xBlockTime - Specifies the time, in ticks, +** that the calling task should be held in the +** Blocked state to wait for the delete +** command to be successfully sent to the +** timer command queue, should the queue +** already be full when xTimerDelete() was +** called. xBlockTime is ignored if +** xTimerDelete() is called before the RTOS +** scheduler is started. +** Returns : +** --- - pdFAIL will be returned if the delete +** command could not be sent to the timer +** command queue even after xBlockTime ticks +** had passed. pdPASS will be returned if the +** command was successfully sent to the timer +** command queue. When the command is actually +** processed will depend on the priority of +** the timer service/daemon task relative to +** other tasks in the system. The timer +** service/daemon task priority is set by the +** configTIMER_TASK_PRIORITY configuration +** constant. +** =================================================================== +*/ + +#define McuRTOS_xTimerReset(xTimer, xBlockTime) \ + xTimerReset(xTimer, xBlockTime) +/* +** =================================================================== +** Method : xTimerReset (component FreeRTOS) +** +** Description : +** Timer functionality is provided by a timer service/daemon +** task. Many of the public FreeRTOS timer API functions send +** commands to the timer service task through a queue called +** the timer command queue. The timer command queue is private +** to the RTOS kernel itself and is not directly accessible to +** application code. The length of the timer command queue is +** set by the configTIMER_QUEUE_LENGTH configuration constant. +** xTimerReset() re-starts a timer that was previously created +** using the xTimerCreate() API function. If the timer had +** already been started and was already in the active state, +** then xTimerReset() will cause the timer to re-evaluate its +** expiry time so that it is relative to when xTimerReset() was +** called. If the timer was in the dormant state then +** xTimerReset() has equivalent functionality to the +** xTimerStart() API function. +** Resetting a timer ensures the timer is in the active state. +** If the timer is not stopped, deleted, or reset in the mean +** time, the callback function associated with the timer will +** get called 'n' ticks after xTimerReset() was called, where +** 'n' is the timers defined period. +** It is valid to call xTimerReset() before the RTOS scheduler +** has been started, but when this is done the timer will not +** actually start until the RTOS scheduler is started, and the +** timers expiry time will be relative to when the RTOS +** scheduler is started, not relative to when xTimerReset() was +** called. +** The configUSE_TIMERS configuration constant must be set to 1 +** for xTimerReset() to be available. +** Parameters : +** NAME - DESCRIPTION +** xTimer - The handle of the timer being +** reset/started/restarted. +** xBlockTime - Specifies the time, in ticks, +** that the calling task should be held in the +** Blocked state to wait for the reset command +** to be successfully sent to the timer +** command queue, should the queue already be +** full when xTimerReset() was called. +** xBlockTime is ignored if xTimerReset() is +** called before the RTOS scheduler is started. +** Returns : +** --- - pdFAIL will be returned if the reset +** command could not be sent to the timer +** command queue even after xBlockTime ticks +** had passed. pdPASS will be returned if the +** command was successfully sent to the timer +** command queue. When the command is actually +** processed will depend on the priority of +** the timer service/daemon task relative to +** other tasks in the system, although the +** timers expiry time is relative to when +** xTimerReset() is actually called. The timer +** service/daemon task priority is set by the +** configTIMER_TASK_PRIORITY configuration +** constant. +** =================================================================== +*/ + +#define McuRTOS_xTimerStartFromISR(xTimer, pxHigherPriorityTaskWoken) \ + xTimerStartFromISR(xTimer, pxHigherPriorityTaskWoken) +/* +** =================================================================== +** Method : xTimerStartFromISR (component FreeRTOS) +** +** Description : +** A version of xTimerStart() that can be called from an +** interrupt service routine. +** Parameters : +** NAME - DESCRIPTION +** xTimer - The handle of the timer being +** started/restarted. +** * pxHigherPriorityTaskWoken +** - The timer service/daemon task spends most +** of its time in the Blocked state, waiting +** for messages to arrive on the timer command +** queue. Calling xTimerStartFromISR() writes +** a message to the timer command queue, so +** has the potential to transition the timer +** service/daemon task out of the Blocked +** state. If calling xTimerStartFromISR() +** causes the timer service/daemon task to +** leave the Blocked state, and the timer +** service/ daemon task has a priority equal +** to or greater than the currently executing +** task (the task that was interrupted), then +** *pxHigherPriorityTaskWoken will get set to +** pdTRUE internally within the +** xTimerStartFromISR() function. If +** xTimerStartFromISR() sets this value to +** pdTRUE, then a context switch should be +** performed before the interrupt exits. +** Returns : +** --- - pdFAIL will be returned if the start +** command could not be sent to the timer +** command queue. pdPASS will be returned if +** the command was successfully sent to the +** timer command queue. When the command is +** actually processed will depend on the +** priority of the timer service/daemon task +** relative to other tasks in the system, +** although the timers expiry time is relative +** to when xTimerStartFromISR() is actually +** called. The timer service/daemon task +** priority is set by the +** configTIMER_TASK_PRIORITY configuration +** constant. +** =================================================================== +*/ + +#define McuRTOS_xTimerStopFromISR(xTimer, pxHigherPriorityTaskWoken) \ + xTimerStopFromISR(xTimer, pxHigherPriorityTaskWoken) +/* +** =================================================================== +** Method : xTimerStopFromISR (component FreeRTOS) +** +** Description : +** A version of xTimerStop() that can be called from an +** interrupt service routine. +** Parameters : +** NAME - DESCRIPTION +** xTimer - The handle of the timer being +** stopped. +** * pxHigherPriorityTaskWoken +** - The timer service/daemon task spends most +** of its time in the Blocked state, waiting +** for messages to arrive on the timer command +** queue. Calling xTimerStopFromISR() writes a +** message to the timer command queue, so has +** the potential to transition the timer +** service/daemon task out of the Blocked +** state. If calling xTimerStopFromISR() +** causes the timer service/daemon task to +** leave the Blocked state, and the timer +** service/ daemon task has a priority equal +** to or greater than the currently executing +** task (the task that was interrupted), then +** *pxHigherPriorityTaskWoken will get set to +** pdTRUE internally within the +** xTimerStopFromISR() function. If +** xTimerStopFromISR() sets this value to +** pdTRUE, then a context switch should be +** performed before the interrupt exits. +** Returns : +** --- - pdFAIL will be returned if the stop +** command could not be sent to the timer +** command queue. pdPASS will be returned if +** the command was successfully sent to the +** timer command queue. When the command is +** actually processed will depend on the +** priority of the timer service/daemon task +** relative to other tasks in the system. The +** timer service/daemon task priority is set +** by the configTIMER_TASK_PRIORITY +** configuration constant. +** =================================================================== +*/ + +#define McuRTOS_xTimerChangePeriodFromISR(xTimer, xNewPeriod, pxHigherPriorityTaskWoken) \ + xTimerChangePeriodFromISR(xTimer, xNewPeriod, pxHigherPriorityTaskWoken) +/* +** =================================================================== +** Method : xTimerChangePeriodFromISR (component FreeRTOS) +** +** Description : +** A version of xTimerChangePeriod() that can be called from an +** interrupt service routine. +** Parameters : +** NAME - DESCRIPTION +** xTimer - The handle of the timer that is +** having its period changed. +** xNewPeriod - The new period for xTimer. +** Timer periods are specified in tick periods, +** so the constant portTICK_PERIOD_MS can be +** used to convert a time that has been +** specified in milliseconds. For example, if +** the timer must expire after 100 ticks, then +** xNewPeriod should be set to 100. +** Alternatively, if the timer must expire +** after 500ms, then xNewPeriod can be set to +** ( 500 / portTICK_PERIOD_MS ) provided +** configTICK_RATE_HZ is less than or equal to +** 1000. +** * pxHigherPriorityTaskWoken +** - The timer service/daemon task spends most +** of its time in the Blocked state, waiting +** for messages to arrive on the timer command +** queue. Calling xTimerChangePeriodFromISR() +** writes a message to the timer command queue, +** so has the potential to transition the +** timer service/ daemon task out of the +** Blocked state. If calling +** xTimerChangePeriodFromISR() causes the +** timer service/daemon task to leave the +** Blocked state, and the timer service/daemon +** task has a priority equal to or greater +** than the currently executing task (the task +** that was interrupted), then +** *pxHigherPriorityTaskWoken will get set to +** pdTRUE internally within the +** xTimerChangePeriodFromISR() function. If +** xTimerChangePeriodFromISR() sets this value +** to pdTRUE, then a context switch should be +** performed before the interrupt exits. +** Returns : +** --- - pdFAIL will be returned if the command to +** change the timers period could not be sent +** to the timer command queue. pdPASS will be +** returned if the command was successfully +** sent to the timer command queue. When the +** command is actually processed will depend +** on the priority of the timer service/daemon +** task relative to other tasks in the system. +** The timer service/daemon task priority is +** set by the configTIMER_TASK_PRIORITY +** configuration constant. +** =================================================================== +*/ + +#define McuRTOS_xTimerResetFromISR(xTimer, pxHigherPriorityTaskWoken) \ + xTimerResetFromISR(xTimer, pxHigherPriorityTaskWoken) +/* +** =================================================================== +** Method : xTimerResetFromISR (component FreeRTOS) +** +** Description : +** A version of xTimerReset() that can be called from an +** interrupt service routine. +** Parameters : +** NAME - DESCRIPTION +** xTimer - The handle of the timer that is to +** be started, reset, or restarted. +** * pxHigherPriorityTaskWoken +** - The timer service/daemon task spends most +** of its time in the Blocked state, waiting +** for messages to arrive on the timer command +** queue. Calling xTimerResetFromISR() writes +** a message to the timer command queue, so +** has the potential to transition the timer +** service/daemon task out of the Blocked +** state. If calling xTimerResetFromISR() +** causes the timer service/daemon task to +** leave the Blocked state, and the timer +** service/ daemon task has a priority equal +** to or greater than the currently executing +** task (the task that was interrupted), then +** *pxHigherPriorityTaskWoken will get set to +** pdTRUE internally within the +** xTimerResetFromISR() function. If +** xTimerResetFromISR() sets this value to +** pdTRUE then a context switch should be +** performed before the interrupt exits. +** Returns : +** --- - pdFAIL will be returned if the reset +** command could not be sent to the timer +** command queue. pdPASS will be returned if +** the command was successfully sent to the +** timer command queue. When the command is +** actually processed will depend on the +** priority of the timer service/daemon task +** relative to other tasks in the system, +** although the timers expiry time is relative +** to when xTimerResetFromISR() is actually +** called. The timer service/daemon task +** priority is set by the +** configTIMER_TASK_PRIORITY configuration +** constant. +** =================================================================== +*/ + +#define McuRTOS_pvTimerGetTimerID(xTimer) \ + pvTimerGetTimerID(xTimer) +/* +** =================================================================== +** Method : pvTimerGetTimerID (component FreeRTOS) +** +** Description : +** Returns the ID assigned to the timer. +** IDs are assigned to timers using the pvTimerID parameter of +** the call to xTimerCreate() that was used to create the timer. +** If the same callback function is assigned to multiple timers +** then the timer ID can be used within the callback function +** to identify which timer actually expired. +** Parameters : +** NAME - DESCRIPTION +** xTimer - The timer being queried. +** Returns : +** --- - The ID assigned to the timer being queried. +** =================================================================== +*/ + +#define McuRTOS_xTimerGetTimerDaemonTaskHandle() \ + xTimerGetTimerDaemonTaskHandle() +/* +** =================================================================== +** Method : xTimerGetTimerDaemonTaskHandle (component FreeRTOS) +** +** Description : +** INCLUDE_xTimerGetTimerDaemonTaskHandle and configUSE_TIMERS +** must both be set to 1 in FreeRTOSConfig.h for +** xTimerGetTimerDaemonTaskHandle() to be available. +** Parameters : None +** Returns : +** --- - Returns the task handle associated with +** the software timer daemon (or service) task. +** If configUSE_TIMERS is set to 1 in +** FreeRTOSConfig.h, then the timer daemon +** task is created automatically when the RTOS +** scheduler is started. +** =================================================================== +*/ + +#define McuRTOS_pcTimerGetTimerName(xTimer) \ + pcTimerGetTimerName(xTimer) +/* +** =================================================================== +** Method : pcTimerGetTimerName (component FreeRTOS) +** +** Description : +** +** Parameters : +** NAME - DESCRIPTION +** xTimer - The handle of the timer being +** queried. +** Returns : +** --- - A pointer to the timer's name, which is a +** standard NULL terminated C string. +** =================================================================== +*/ + +#define McuRTOS_xTimerPendFunctionCall(xFunctionToPend, pvParameter1, ulParameter2, xTicksToWait) \ + xTimerPendFunctionCall(xFunctionToPend, pvParameter1, ulParameter2, xTicksToWait) +/* +** =================================================================== +** Method : xTimerPendFunctionCall (component FreeRTOS) +** +** Description : +** Used to pend the execution of a function to the RTOS daemon +** task (the timer service task, hence this function is +** pre-fixed with 'Timer'). +** Functions that can be deferred to the RTOS daemon task must +** have the following prototype: +** void vPendableFunction( void * pvParameter1, uint32_t +** ulParameter2 ); +** The pvParameter1 and ulParameter2 are provided for use by +** the application code. +** INCLUDE_xTimerPendFunctionCall() and configUSE_TIMERS must +** both be set to 1 for xTimerPendFunctionCall() to be +** available. +** Parameters : +** NAME - DESCRIPTION +** xFunctionToPend - The function to +** execute from the timer service/ daemon task. +** The function must conform to the +** PendedFunction_t prototype as shown above. +** * pvParameter1 - The value of the +** callback function's first parameter. The +** parameter has a void * type to allow it to +** be used to pass any type. For example, +** integer types can be cast to a void *, or +** the void * can be used to point to a +** structure. +** ulParameter2 - The value of the +** callback function's second parameter. +** xTicksToWait - Calling this function +** will result in a message being sent to the +** timer daemon task on a queue. xTicksToWait +** is the amount of time the calling task +** should remain in the Blocked state (so not +** using any processing time) for space to +** become available on the timer queue if the +** queue is found to be full. The length of +** the queue is set by the value of +** configTIMER_QUEUE_LENGTH in FreeRTOSConfig. +** h. +** Returns : +** --- - pdPASS is returned if the message was +** successfully sent to the RTOS timer daemon +** task, otherwise pdFALSE is returned. +** =================================================================== +*/ + +#define McuRTOS_xTimerPendFunctionCallFromISR(xFunctionToPend, pvParameter1, ulParameter2, pxHigherPriorityTaskWoken) \ + xTimerPendFunctionCallFromISR(xFunctionToPend, pvParameter1, ulParameter2, pxHigherPriorityTaskWoken) +/* +** =================================================================== +** Method : xTimerPendFunctionCallFromISR (component FreeRTOS) +** +** Description : +** Used from application interrupt service routines to defer +** the execution of a function to the RTOS daemon task (the +** timer service task, hence this function is implemented in +** timers.c and is prefixed with 'Timer'). +** Ideally an interrupt service routine (ISR) is kept as short +** as possible, but sometimes an ISR either has a lot of +** processing to do, or needs to perform processing that is not +** deterministic. In these cases xTimerPendFunctionCallFromISR() +** can be used to defer processing of a function to the RTOS +** daemon task. +** A mechanism is provided that allows the interrupt to return +** directly to the task that will subsequently execute the +** pended function. This allows the callback function to +** execute contiguously in time with the interrupt - just as if +** the callback had executed in the interrupt itself. +** Functions that can be deferred to the RTOS daemon task must +** have the following prototype: +** void vPendableFunction( void * pvParameter1, uint32_t +** ulParameter2 ); +** The pvParameter1 and ulParameter2 are provided for use by +** the application code. +** INCLUDE_xTimerPendFunctionCall() and configUSE_TIMERS must +** both be set to 1 for xTimerPendFunctionCallFromISR() to be +** available. +** Parameters : +** NAME - DESCRIPTION +** xFunctionToPend - The function to +** execute from the timer service/ daemon task. +** The function must conform to the +** PendedFunction_t prototype as shown above. +** * pvParameter1 - The value of the +** callback function's first parameter. The +** parameter has a void * type to allow it to +** be used to pass any type. For example, +** integer types can be cast to a void *, or +** the void * can be used to point to a +** structure. +** ulParameter2 - The value of the +** callback function's second parameter. +** * pxHigherPriorityTaskWoken +** - As mentioned above, calling +** xTimerPendFunctionCallFromISR() will result +** in a message being sent to the RTOS timer +** daemon task. If the priority of the daemon +** task (which is set using +** configTIMER_TASK_PRIORITY in FreeRTOSConfig. +** h) is higher than the priority of the +** currently running task (the task the +** interrupt interrupted) then +** *pxHigherPriorityTaskWoken will be set to +** pdTRUE within +** xTimerPendFunctionCallFromISR(), indicating +** that a context switch should be requested +** before the interrupt exits. For that reason +** *pxHigherPriorityTaskWoken must be +** initialised to pdFALSE. See the example +** code below. +** Returns : +** --- - pdPASS is returned if the message was +** successfully sent to the RTOS timer daemon +** task, otherwise pdFALSE is returned. +** =================================================================== +*/ + +#define McuRTOS_xTaskNotifyGive(xTaskToNotify) \ + xTaskNotifyGive(xTaskToNotify) \ +/* +** =================================================================== +** Method : xTaskNotifyGive (component FreeRTOS) +** +** Description : +** Each RTOS task has a 32-bit notification value which is +** initialised to zero when the RTOS task is created. An RTOS +** task notification is an event sent directly to a task that +** can unblock the receiving task, and optionally update the +** receiving task's notification value. +** xTaskNotifyGive() is a macro intended for use when an RTOS +** task notification value is being used as a light weight and +** faster binary or counting semaphore alternative. FreeRTOS +** semaphores are given using the xSemaphoreGive() API function, +** xTaskNotifyGive() is the equivalent that instead uses the +** receiving RTOS task's notification value. +** When a task notification value is being used as a binary or +** counting semaphore equivalent then the task being notified +** should wait for the notification using the ulTaskNotifyTake() +** API function rather than the xTaskNotifyWait() API function. +** xTaskNotifyGive() must not be called from an interrupt +** service routine. Use vTaskNotifyGiveFromISR() instead. +** Parameters : +** NAME - DESCRIPTION +** xTaskToNotify - The handle of the RTOS +** task being notified, and having its +** notification value incremented. +** RTOS task handles are obtained using the +** pvCreatedTask parameter of the xTaskCreate() +** call used to create the task. +** The handle of the currently executing RTOS +** task is returned by the +** xTaskGetCurrentTaskHandle() API function. +** Returns : +** --- - xTaskNotifyGive() is a macro that calls +** xTaskNotify() with the eAction parameter +** set to eIncrement resulting in all calls +** returning pdPASS. +** =================================================================== +*/ + +#define McuRTOS_ulTaskNotifyTake(xClearCountOnExit, xTicksToWait) \ + ulTaskNotifyTake(xClearCountOnExit, xTicksToWait) +/* +** =================================================================== +** Method : ulTaskNotifyTake (component FreeRTOS) +** +** Description : +** Each RTOS task has a 32-bit notification value which is +** initialised to zero when the RTOS task is created. An RTOS +** task notification is an event sent directly to a task that +** can unblock the receiving task, and optionally update the +** receiving task's notification value. +** ulTaskNotifyTake() is intended for use when a task +** notification is used as a faster and lighter weight binary +** or counting semaphore alternative. FreeRTOS semaphores are +** taken using the xSemaphoreTake() API function, +** ulTaskNotifyTake() is the equivalent that instead uses a +** task notification. +** When a task is using its notification value as a binary or +** counting semaphore other tasks and interrupts should send +** notifications to it using either the xTaskNotifyGive() macro, +** or the xTaskNotify() function with the function's eAction +** parameter set to eIncrement (the two are equivalent). +** ulTaskNotifyTake() can either clear the task's notification +** value to zero on exit, in which case the notification value +** acts like a binary semaphore, or decrement the task's +** notification value on exit, in which case the notification +** value acts more like a counting semaphore. +** An RTOS task can use ulTaskNotifyTake() to [optionally] +** block to wait for a the task's notification value to be +** non-zero. The task does not consume any CPU time while it is +** in the Blocked state. +** Where as xTaskNotifyWait() will return when a notification +** is pending, ulTaskNotifyTake() will return when the task's +** notification value is not zero, decrementing the task's +** notification value before it returns. +** Parameters : +** NAME - DESCRIPTION +** xClearCountOnExit - If an RTOS +** task notification is received and +** xClearCountOnExit is set to pdFALSE then +** the RTOS task's notification value is +** decremented before ulTaskNotifyTake() exits. +** This is equivalent to the value of a +** counting semaphore being decremented by a +** successful call to xSemaphoreTake(). +** If an RTOS task notification is received +** and xClearCountOnExit is set to pdTRUE then +** the RTOS task's notification value is reset +** to 0 before ulTaskNotifyTake() exits. This +** is equivalent to the value of a binary +** semaphore being left at zero (or empty, or +** 'not available') after a successful call to +** xSemaphoreTake(). +** xTicksToWait - The maximum time to wait +** in the Blocked state for a notification to +** be received if a notification is not +** already pending when ulTaskNotifyTake() is +** called. +** The RTOS task does not consume any CPU time +** when it is in the Blocked state. +** The time is specified in RTOS tick periods. +** The pdMS_TO_TICKS() macro can be used to +** convert a time specified in milliseconds +** into a time specified in ticks. +** Returns : +** --- - The value of the task's notification value +** before it is decremented or cleared (see +** the description of xClearCountOnExit). +** =================================================================== +*/ + +#define McuRTOS_vTaskNotifyGiveFromISR(xTaskToNotify, pxHigherPriorityTaskWoken) \ + vTaskNotifyGiveFromISR(xTaskToNotify, pxHigherPriorityTaskWoken) +/* +** =================================================================== +** Method : vTaskNotifyGiveFromISR (component FreeRTOS) +** +** Description : +** A version of xTaskNotifyGive() that can be called from an +** interrupt service routine (ISR). +** Each RTOS task has a 32-bit notification value which is +** initialised to zero when the RTOS task is created. An RTOS +** task notification is an event sent directly to a task that +** can unblock the receiving task, and optionally update the +** receiving task's notification value. +** vTaskNotifyGiveFromISR() is a function intended for use when +** an RTOS task notification value is being used as a light +** weight and faster binary or counting semaphore alternative. +** FreeRTOS semaphores are given from an interrupt using the +** xSemaphoreGiveFromISR() API function, +** vTaskNotifyGiveFromISR() is the equivalent that instead uses +** the receiving RTOS task's notification value. +** When a task notification value is being used as a binary or +** counting semaphore equivalent then the task being notified +** should wait for the notification using the ulTaskNotifyTake() +** API function rather than the xTaskNotifyWait() API function. +** Parameters : +** NAME - DESCRIPTION +** xTaskToNotify - The handle of the RTOS +** task being notified, and having its +** notification value incremented. +** RTOS task handles are obtained using the +** pvCreatedTask parameter of the xTaskCreate() +** call used to create the task. +** The handle of the currently executing RTOS +** task is returned by the +** xTaskGetCurrentTaskHandle() API function. +** * pxHigherPriorityTaskWoken +** - *pxHigherPriorityTaskWoken must be +** initialised to 0. +** vTaskNotifyGiveFromISR() will set +** *pxHigherPriorityTaskWoken to pdTRUE if +** sending the notification caused a task to +** unblock, and the unblocked task has a +** priority higher than the currently running +** task. +** If vTaskNotifyGiveFromISR() sets this value +** to pdTRUE then a context switch should be +** requested before the interrupt is exited. +** See the example below. +** pxHigherPriorityTaskWoken is an optional +** parameter and can be set to NULL. +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_xTaskNotify(xTaskToNotify, ulValue, eAction) \ + xTaskNotify(xTaskToNotify, ulValue, eAction) +/* +** =================================================================== +** Method : xTaskNotify (component FreeRTOS) +** +** Description : +** [If you are using RTOS task notifications to implement +** binary or counting semaphore type behaviour then use the +** simpler xTaskNotifyGive() API function instead of +** xTaskNotify()] +** Each RTOS task has a 32-bit notification value which is +** initialised to zero when the RTOS task is created. +** xTaskNotify() is used to send an event directly to and +** potentially unblock an RTOS task, and optionally update the +** receiving task's notification value in one of the following +** ways: +** - Write a 32-bit number to the notification value +** - Add one (increment) the notification value +** - Set one or more bits in the notification value +** - Leave the notification value unchanged +** This function must not be called from an interrupt service +** routine (ISR). Use xTaskNotifyFromISR() instead. +** Parameters : +** NAME - DESCRIPTION +** xTaskToNotify - The handle of the RTOS +** task being notified. This is the subject +** task. +** RTOS task handles are obtained using the +** pvCreatedTask parameter of the xTaskCreate() +** call used to create the task. +** The handle of the currently executing RTOS +** task is returned by the +** xTaskGetCurrentTaskHandle() API function. +** ulValue - Used to update the notification +** value of the subject task. See the +** description of the eAction parameter below. +** eAction - An enumerated type that can take +** one of the values documented in the table +** below in order to perform the associated +** action. +** - eNoAction: The subject task receives the +** event, but its notification value is not +** updated. In this case ulValue is not used. +** - eSetBits: The notification value of the +** subject task will be bitwise ORed with +** ulValue. For example, if ulValue is set to +** 0x01, then bit 0 will get set within the +** subject task's notification value. Likewise +** if ulValue is 0x04 then bit 2 will get set +** in the subject task's notification value. +** In this way the RTOS task notification +** mechanism can be used as a light weight +** alternative to an event group. +** - eIncrement: The notification value of +** the subject task will be incremented by one, +** making the call to xTaskNotify() equivalent +** to a call to xTaskNotifyGive(). In this +** case ulValue is not used. +** - eSetValueWithOverwrite: The notification +** value of the subject task is +** unconditionally set to ulValue. In this way +** the RTOS task notification mechanism is +** being used as a light weight alternative to +** xQueueOverwrite(). +** - eSetValueWithoutOverwrite: If the +** subject task does not already have a +** notification pending then its notification +** value will be set to ulValue. If the +** subject task already has a notification +** pending then its notification value is not +** updated as to do so would overwrite the +** previous value before it was used. In this +** case the call to xTaskNotify() fails and +** pdFALSE is returned. In this way the RTOS +** task notification mechanism is being used +** as a light weight alternative to +** xQueueSend() on a queue of length 1. +** Returns : +** --- - pdPASS is returned in all cases other than +** when eAction is set to +** eSetValueWithoutOverwrite and the subject +** task's notification value cannot be updated +** because the subject task already had a +** notification pending. +** =================================================================== +*/ + +#define McuRTOS_xTaskNotifyFromISR(xTaskToNotify, ulValue, eAction, pxHigherPriorityTaskWoken) \ + xTaskNotifyFromISR(xTaskToNotify, ulValue, eAction, pxHigherPriorityTaskWoken) +/* +** =================================================================== +** Method : xTaskNotifyFromISR (component FreeRTOS) +** +** Description : +** [If you are using RTOS task notifications to implement +** binary or counting semaphore type behaviour then use the +** simpler xTaskNotifyGive() API function instead of +** xTaskNotify()] +** A version of xTaskNotify() that can be called from an ISR. +** Each RTOS task has a 32-bit notification value which is +** initialised to zero when the RTOS task is created. +** xTaskNotify() is used to send an event directly to and +** potentially unblock an RTOS task, and optionally update the +** receiving task's notification value in one of the following +** ways: +** - Write a 32-bit number to the notification value +** - Add one (increment) the notification value +** - Set one or more bits in the notification value +** - Leave the notification value unchanged +** This function must not be called from an interrupt service +** routine (ISR). Use xTaskNotifyFromISR() instead. +** Parameters : +** NAME - DESCRIPTION +** xTaskToNotify - The handle of the RTOS +** task being notified. This is the subject +** task. +** RTOS task handles are obtained using the +** pvCreatedTask parameter of the xTaskCreate() +** call used to create the task. +** The handle of the currently executing RTOS +** task is returned by the +** xTaskGetCurrentTaskHandle() API function. +** ulValue - Used to update the notification +** value of the subject task. See the +** description of the eAction parameter below. +** eAction - An enumerated type that can take +** one of the values documented in the table +** below in order to perform the associated +** action. +** - eNoAction: The subject task receives the +** event, but its notification value is not +** updated. In this case ulValue is not used. +** - eSetBits: The notification value of the +** subject task will be bitwise ORed with +** ulValue. For example, if ulValue is set to +** 0x01, then bit 0 will get set within the +** subject task's notification value. Likewise +** if ulValue is 0x04 then bit 2 will get set +** in the subject task's notification value. +** In this way the RTOS task notification +** mechanism can be used as a light weight +** alternative to an event group. +** - eIncrement: The notification value of +** the subject task will be incremented by one, +** making the call to xTaskNotify() equivalent +** to a call to xTaskNotifyGive(). In this +** case ulValue is not used. +** - eSetValueWithOverwrite: The notification +** value of the subject task is +** unconditionally set to ulValue. In this way +** the RTOS task notification mechanism is +** being used as a light weight alternative to +** xQueueOverwrite(). +** - eSetValueWithoutOverwrite: If the +** subject task does not already have a +** notification pending then its notification +** value will be set to ulValue. If the +** subject task already has a notification +** pending then its notification value is not +** updated as to do so would overwrite the +** previous value before it was used. In this +** case the call to xTaskNotify() fails and +** pdFALSE is returned. In this way the RTOS +** task notification mechanism is being used +** as a light weight alternative to +** xQueueSend() on a queue of length 1. +** * pxHigherPriorityTaskWoken +** - *pxHigherPriorityTaskWoken must be +** initialised to 0. +** xTaskNotifyFromISR() will set +** *pxHigherPriorityTaskWoken to pdTRUE if +** sending the notification caused a task to +** unblock, and the unblocked task has a +** priority higher than the currently running +** task. +** If xTaskNotifyFromISR() sets this value to +** pdTRUE then a context switch should be +** requested before the interrupt is exited. +** See the example below. +** pxHigherPriorityTaskWoken is an optional +** parameter and can be set to NULL. +** Returns : +** --- - pdPASS is returned in all cases other than +** when eAction is set to +** eSetValueWithoutOverwrite and the subject +** task's notification value cannot be updated +** because the subject task already had a +** notification pending. +** =================================================================== +*/ + +#define McuRTOS_xTaskNotifyWait(ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait) \ + xTaskNotifyWait(ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait) +/* +** =================================================================== +** Method : xTaskNotifyWait (component FreeRTOS) +** +** Description : +** [If you are using RTOS task notifications to implement +** binary or counting semaphore type behaviour then use the +** simpler ulTaskNotifyTake() API function instead of +** xTaskNotifyWait()] +** Each RTOS task has a 32-bit notification value which is +** initialised to zero when the RTOS task is created. An RTOS +** task notification is an event sent directly to a task that +** can unblock the receiving task, and optionally update the +** receiving task's notification value in a number of different +** ways. For example, a notification may overwrite the +** receiving task's notification value, or just set one or more +** bits in the receiving task's notification value. See the +** RTOS task notifications use case documentation for examples. +** xTaskNotifyWait() waits, with an optional timeout, for the +** calling task to receive a notification. +** If the receiving RTOS task was already Blocked waiting for a +** notification when one arrives the receiving RTOS task will +** be removed from the Blocked state and the notification +** cleared. +** Parameters : +** NAME - DESCRIPTION +** ulBitsToClearOnEntry - Any bits +** set in ulBitsToClearOnEntry will be cleared +** in the calling RTOS task's notification +** value on entry to the xTaskNotifyWait() +** function (before the task waits for a new +** notification) provided a notification is +** not already pending when xTaskNotifyWait() +** is called. +** For example, if ulBitsToClearOnEntry is +** 0x01, then bit 0 of the task's notification +** value will be cleared on entry to the +** function. +** Setting ulBitsToClearOnEntry to 0xffffffff +** (ULONG_MAX) will clear all the bits in the +** task's notification value, effectively +** clearing the value to 0. +** ulBitsToClearOnExit - Any bits +** set in ulBitsToClearOnExit will be cleared +** in the calling RTOS task's notification +** value before xTaskNotifyWait() function +** exits if a notification was received. +** The bits are cleared after the RTOS task's +** notification value has been saved in +** *pulNotificationValue (see the description +** of pulNotificationValue below). +** For example, if ulBitsToClearOnExit is 0x03, +** then bit 0 and bit 1 of the task's +** notification value will be cleared before +** the function exits. +** Setting ulBitsToClearOnExit to 0xffffffff +** (ULONG_MAX) will clear all the bits in the +** task's notification value, effectively +** clearing the value to 0. +** * pulNotificationValue - Used to +** pass out the RTOS task's notification value. +** The value copied to *pulNotificationValue +** is the RTOS task's notification value as it +** was before any bits were cleared due to the +** ulBitsToClearOnExit setting. +** If the notification value is not required +** then set pulNotificationValue to NULL. +** xTicksToWait - The maximum time to wait +** in the Blocked state for a notification to +** be received if a notification is not +** already pending when xTaskNotifyWait() is +** called. +** The RTOS task does not consume any CPU time +** when it is in the Blocked state. +** The time is specified in RTOS tick periods. +** The pdMS_TO_TICKS() macro can be used to +** convert a time specified in milliseconds +** into a time specified in ticks. +** Returns : +** --- - pdTRUE if a notification was received, or +** a notification was already pending when +** xTaskNotifyWait() was called. +** pdFALSE if the call to xTaskNotifyWait() +** timed out before a notification was +** received. +** =================================================================== +*/ + +#define McuRTOS_vTaskSetThreadLocalStoragePointer(xTaskToSet, xIndex, pvValue) \ + vTaskSetThreadLocalStoragePointer(xTaskToSet, xIndex, pvValue) +/* +** =================================================================== +** Method : vTaskSetThreadLocalStoragePointer (component FreeRTOS) +** +** Description : +** Only enabled if configNUM_THREAD_LOCAL_STORAGE_POINTERS is > +** 0. +** Parameters : +** NAME - DESCRIPTION +** xTaskToSet - Task handle +** xIndex - Index of thread local storage item +** pvValue - +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_pvTaskGetThreadLocalStoragePointer(xTaskToQuery, xIndex) \ + pvTaskGetThreadLocalStoragePointer(xTaskToQuery, xIndex) +/* +** =================================================================== +** Method : pvTaskGetThreadLocalStoragePointer (component FreeRTOS) +** +** Description : +** Sets the thread local storage. Only enabled if +** configNUM_THREAD_LOCAL_STORAGE_POINTERS is >0 +** Parameters : +** NAME - DESCRIPTION +** xTaskToQuery - Task handle from which +** to get the local thread storage. +** xIndex - Index of thread storage +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuRTOS_xSemaphoreCreateBinary() \ + xSemaphoreCreateBinary() +/* +** =================================================================== +** Method : xSemaphoreCreateBinary (component FreeRTOS) +** +** Description : +** The old vSemaphoreCreateBinary() macro is now deprecated in +** favour of this xSemaphoreCreateBinary() function. Note that +** binary semaphores created using the vSemaphoreCreateBinary() +** macro are created in a state such that the first call to +** 'take' the semaphore would pass, whereas binary semaphores +** created using xSemaphoreCreateBinary() are created in a +** state such that the the semaphore must first be 'given' +** before it can be 'taken'. +** Function that creates a semaphore by using the existing +** queue mechanism. The queue length is 1 as this is a binary +** semaphore. The data size is 0 as nothing is actually stored +** - all that is important is whether the queue is empty or +** full (the binary semaphore is available or not). +** This type of semaphore can be used for pure synchronisation +** between tasks or between an interrupt and a task. The +** semaphore need not be given back once obtained, so one +** task/interrupt can continuously 'give' the semaphore while +** another continuously 'takes' the semaphore. For this reason +** this type of semaphore does not use a priority inheritance +** mechanism. For an alternative that does use priority +** inheritance see xSemaphoreCreateMutex(). +** Parameters : None +** Returns : +** --- - Handle to the created semaphore. +** =================================================================== +*/ + +#define McuRTOS_xTaskNotifyAndQuery(xTaskToNotify, ulValue, eAction, pulPreviousNotifyValue) \ + xTaskNotifyAndQuery(xTaskToNotify, ulValue, eAction, pulPreviousNotifyValue) +/* +** =================================================================== +** Method : xTaskNotifyAndQuery (component FreeRTOS) +** +** Description : +** [If you are using RTOS task notifications to implement +** binary or counting semaphore type behaviour then use the +** simpler xTaskNotifyGive() API function instead of +** xTaskNotify()] +** Each RTOS task has a 32-bit notification value which is +** initialised to zero when the RTOS task is created. +** xTaskNotify() is used to send an event directly to and +** potentially unblock an RTOS task, and optionally update the +** receiving task's notification value in one of the following +** ways: +** - Write a 32-bit number to the notification value +** - Add one (increment) the notification value +** - Set one or more bits in the notification value +** - Leave the notification value unchanged +** This function must not be called from an interrupt service +** routine (ISR). Use xTaskNotifyFromISR() instead. +** Parameters : +** NAME - DESCRIPTION +** xTaskToNotify - The handle of the RTOS +** task being notified. This is the subject +** task. +** RTOS task handles are obtained using the +** pvCreatedTask parameter of the xTaskCreate() +** call used to create the task. +** The handle of the currently executing RTOS +** task is returned by the +** xTaskGetCurrentTaskHandle() API function. +** ulValue - Used to update the notification +** value of the subject task. See the +** description of the eAction parameter below. +** eAction - An enumerated type that can take +** one of the values documented in the table +** below in order to perform the associated +** action. +** * pulPreviousNotifyValue - Can +** be used to pass out the subject task's +** notification value before any bits are +** modified by the action of +** xTaskNotifyAndQuery(). +** pulPreviousNotifyValue is an optional +** parameter, and can be set to NULL if it is +** not required. If pulPreviousNotifyValue is +** not used then consider using xTaskNotify() +** in place of xTaskNotifyAndQuery(). +** Returns : +** --- - pdPASS is returned in all cases other than +** when eAction is set to +** eSetValueWithoutOverwrite and the subject +** task's notification value cannot be updated +** because the subject task already had a +** notification pending. +** =================================================================== +*/ + +#define McuRTOS_xTaskNotifyAndQueryFromISR(xTaskToNotify, ulValue, eAction, pulPreviousNotifyValue, pxHigherPriorityTaskWoken) \ + xTaskNotifyAndQueryFromISR(xTaskToNotify, ulValue, eAction, pulPreviousNotifyValue, pxHigherPriorityTaskWoken) +/* +** =================================================================== +** Method : xTaskNotifyAndQueryFromISR (component FreeRTOS) +** +** Description : +** [If you are using RTOS task notifications to implement +** binary or counting semaphore type behaviour then use the +** simpler xTaskNotifyGive() API function instead of +** xTaskNotify()] +** Each RTOS task has a 32-bit notification value which is +** initialised to zero when the RTOS task is created. +** xTaskNotify() is used to send an event directly to and +** potentially unblock an RTOS task, and optionally update the +** receiving task's notification value in one of the following +** ways: +** - Write a 32-bit number to the notification value +** - Add one (increment) the notification value +** - Set one or more bits in the notification value +** - Leave the notification value unchanged +** This function must not be called from an interrupt service +** routine (ISR). Use xTaskNotifyFromISR() instead. +** Parameters : +** NAME - DESCRIPTION +** xTaskToNotify - The handle of the RTOS +** task being notified. This is the subject +** task. +** RTOS task handles are obtained using the +** pvCreatedTask parameter of the xTaskCreate() +** call used to create the task. +** The handle of the currently executing RTOS +** task is returned by the +** xTaskGetCurrentTaskHandle() API function. +** ulValue - Used to update the notification +** value of the subject task. See the +** description of the eAction parameter below. +** eAction - An enumerated type that can take +** one of the values documented in the table +** below in order to perform the associated +** action. +** * pulPreviousNotifyValue - Can +** be used to pass out the subject task's +** notification value before any bits are +** modified by the action of +** xTaskNotifyAndQuery(). +** pulPreviousNotifyValue is an optional +** parameter, and can be set to NULL if it is +** not required. If pulPreviousNotifyValue is +** not used then consider using xTaskNotify() +** in place of xTaskNotifyAndQuery(). +** * pxHigherPriorityTaskWoken +** - *pxHigherPriorityTaskWoken must be +** initialised to 0. +** xTaskNotifyFromISR() will set +** *pxHigherPriorityTaskWoken to pdTRUE if +** sending the notification caused a task to +** unblock, and the unblocked task has a +** priority higher than the currently running +** task. +** If xTaskNotifyFromISR() sets this value to +** pdTRUE then a context switch should be +** requested before the interrupt is exited. +** See the example below. +** pxHigherPriorityTaskWoken is an optional +** parameter and can be set to NULL. +** Returns : +** --- - pdPASS is returned in all cases other than +** when eAction is set to +** eSetValueWithoutOverwrite and the subject +** task's notification value cannot be updated +** because the subject task already had a +** notification pending. +** =================================================================== +*/ + +#define McuRTOS_xTaskNotifyStateClear(xTask) \ + xTaskNotifyStateClear(xTask) +/* +** =================================================================== +** Method : xTaskNotifyStateClear (component FreeRTOS) +** +** Description : +** [If you are using RTOS task notifications to implement +** binary or counting semaphore type behaviour then use the +** simpler xTaskNotifyGive() API function instead of +** xTaskNotify()] +** If the notification state of the task referenced by the +** handle xTask is eNotified, then set the task's notification +** state to eNotWaitingNotification. The task's notification +** value is not altered. Set xTask to NULL to clear the +** notification state of the calling task. +** Parameters : +** NAME - DESCRIPTION +** xTask - The handle of the RTOS task. Use NULL +** for using the calling task. +** Returns : +** --- - pdPASS is returned in all cases other than +** when eAction is set to +** eSetValueWithoutOverwrite and the subject +** task's notification value cannot be updated +** because the subject task already had a +** notification pending. +** =================================================================== +*/ + +void McuRTOS_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component FreeRTOS) +** +** Description : +** Module deinitialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_xTaskGetHandle(pcNameToQuery) \ + xTaskGetHandle(pcNameToQuery) + +/* +** =================================================================== +** Method : xTaskGetHandle (component FreeRTOS) +** +** Description : +** Looks up the handle of a task from the task's name. +** Parameters : +** NAME - DESCRIPTION +** * pcNameToQuery - The text name (as a +** standard C NULL terminated string) of the +** task for which the handle will be returned. +** Returns : +** --- - If a task that has the name passed in +** pcNameToQuery can be located then the +** handle of the task is returned, otherwise +** NULL is returned. +** =================================================================== +*/ + +#define McuRTOS_pcTaskGetName(xTaskToQuery) \ + pcTaskGetName(xTaskToQuery) + +/* +** =================================================================== +** Method : pcTaskGetName (component FreeRTOS) +** +** Description : +** Looks up the name of a task from the task's handle. +** Parameters : +** NAME - DESCRIPTION +** xTaskToQuery - The handle of the task +** being queried. xTaskToQuery can be set to +** NULL to query the name of the calling task. +** Returns : +** --- - A pointer to the subject task's name, +** which is a standard NULL terminated C +** string. +** =================================================================== +*/ + +#define McuRTOS_xTaskCreateStatic(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer) \ + xTaskCreateStatic(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer) + +/* +** =================================================================== +** Method : xTaskCreateStatic (component FreeRTOS) +** +** Description : +** Create a new task and add it to the list of tasks that are +** ready to run. +** Parameters : +** NAME - DESCRIPTION +** pvTaskCode - Pointer to the task entry +** function. Tasks must be implemented to +** never return (i.e. continuous loop). +** pcName - A descriptive name for the task. +** This is mainly used to facilitate debugging. +** Max length defined by +** configMAX_TASK_NAME_LEN. +** usStackDepth - The size of the task +** stack specified as the number of variables +** the stack can hold - not the number of +** bytes. For example, if the stack is 16 bits +** wide and usStackDepth is defined as 100, +** 200 bytes will be allocated for stack +** storage. The stack depth multiplied by the +** stack width must not exceed the maximum +** value that can be contained in a variable +** of type size_t. +** pvParameters - Pointer that will be +** used as the parameter for the task being +** created. +** uxPriority - The priority at which the +** task should run. +** puxStackBuffer - Must point to a +** StackType_t array that has at least +** ulStackDepth indexes (see the ulStackDepth +** parameter above) - the array will be used +** as the task's stack, so must be persistent +** (not declared on the stack of a function) +** pxTaskBuffer - Must point to a variable +** of type StaticTask_t. The variable will be +** used to hold the new task's data structures +** (TCB), so it must be persistent (not +** declared on the stack of a function). +** Returns : +** --- - Task handle if the task was successfully +** created and added to a ready list, +** otherwise Null. +** =================================================================== +*/ + +#define McuRTOS_xQueueCreateStatic(uxQueueLength, uxItemSize, pucQueueStorageBuffer, pxQueueBuffer) \ + xQueueCreateStatic(uxQueueLength, uxItemSize, pucQueueStorageBuffer, pxQueueBuffer) + +/* +** =================================================================== +** Method : xQueueCreateStatic (component FreeRTOS) +** +** Description : +** Creates a queue. +** Parameters : +** NAME - DESCRIPTION +** uxQueueLength - The maximum number of +** items the queue can hold at any time. +** uxItemSize - The size in bytes of each +** item the queue will hold. +** pucQueueStorageBuffer - If +** uxItemSize is not zero then +** pucQueueStorageBuffer must point to a +** uint8_t array that is at least large enough +** to hold the maximum number of items that +** can be in the queue at any one time - which +** is ( uxQueueLength * uxItemSize ) bytes. If +** uxItemSize is zero then +** pucQueueStorageBuffer can be NULL. +** pxQueueBuffer - Must point to a +** variable of type StaticQueue_t, which will +** be used to hold the queue's data structure. +** Returns : +** --- - A handle to the created queue is returned +** provided the queue was created successfully. +** NULL is returned if the queue cannot be +** created because there is too little heap +** RAM available. +** =================================================================== +*/ + +#define McuRTOS_xEventGroupCreateStatic(pxEventGroupBuffer) \ + xEventGroupCreateStatic(pxEventGroupBuffer) + +/* +** =================================================================== +** Method : xEventGroupCreateStatic (component FreeRTOS) +** +** Description : +** Create a new RTOS event group. This function cannot be +** called from an interrupt. +** Event groups are stored in variables of type +** EventGroupHandle_t. The number of bits (or flags) +** implemented within an event group is 8 if +** configUSE_16_BIT_TICKS is set to 1, or 24 if +** configUSE_16_BIT_TICKS is set to 0. The dependency on +** configUSE_16_BIT_TICKS results from the data type used for +** thread local storage in the internal implementation of RTOS +** tasks. +** Parameters : +** NAME - DESCRIPTION +** pxEventGroupBuffer - Must point +** to a variable of type StaticEventGroup_t, +** in which the event group data structure +** will be stored. +** Returns : +** --- - Event Group Handle. If the event group was +** created then a handle to the event group is +** returned. If there was insufficient +** FreeRTOS heap available to create the event +** group then NULL is returned. +** =================================================================== +*/ + +#define McuRTOS_xTimerCreateStatic(pcTimerName, xTimerPeriod, uxAutoReload, pvTimerID, pxCallbackFunction, pxTimerBuffer) \ + xTimerCreateStatic(pcTimerName, xTimerPeriod, uxAutoReload, pvTimerID, pxCallbackFunction, pxTimerBuffer) + +/* +** =================================================================== +** Method : xTimerCreateStatic (component FreeRTOS) +** +** Description : +** Creates a new software timer instance. This allocates the +** storage required by the new timer, initialises the new +** timers internal state, and returns a handle by which the new +** timer can be referenced. +** Parameters : +** NAME - DESCRIPTION +** pcTimerName - +** Atextnamethatisassignedtothetimer_Thisisdone +** purelytoassistdebugging_TheRTOSkernelitselfo +** nlyeverreferencesatimerbyitshandle_andneverb +** yitsname_ +** xTimerPeriod - The timer period. The +** time is defined in tick periods so the +** constant portTICK_PERIOD_MS can be used to +** convert a time that has been specified in +** milliseconds. For example, if the timer +** must expire after 100 ticks, then +** xTimerPeriod should be set to 100. +** Alternatively, if the timer must expire +** after 500ms, then xPeriod can be set to ( +** 500 / portTICK_PERIOD_MS ) provided +** configTICK_RATE_HZ is less than or equal to +** 1000. +** uxAutoReload - If uxAutoReload is set +** to pdTRUE, then the timer will expire +** repeatedly with a frequency set by the +** xTimerPeriod parameter. If uxAutoReload is +** set to pdFALSE, then the timer will be a +** one-shot and enter the dormant state after +** it expires. +** pvTimerID - An identifier that is assigned +** to the timer being created. Typically this +** would be used in the timer callback +** function to identify which timer expired +** when the same callback function is assigned +** to more than one timer. +** pxCallbackFunction - The function +** to call when the timer expires. Callback +** functions must have the prototype defined +** by TimerCallbackFunction_t, which is "void +** vCallbackFunction( TimerHandle_t xTimer );". +** pxTimerBuffer - Must point to a +** variable of type StaticTimer_t, which is +** then used to hold the timer's state. +** Returns : +** --- - Timer handle. If the timer is successfully +** created then a handle to the newly created +** timer is returned. If the timer cannot be +** created (because either there is +** insufficient FreeRTOS heap remaining to +** allocate the timer structures, or the timer +** period was set to 0) then NULL is returned. +** =================================================================== +*/ + +#define McuRTOS_xSemaphoreCreateBinaryStatic(pxSemaphoreBuffer) \ + xSemaphoreCreateBinaryStatic(pxSemaphoreBuffer) + +/* +** =================================================================== +** Method : xSemaphoreCreateBinaryStatic (component FreeRTOS) +** +** Description : +** The old vSemaphoreCreateBinary() macro is now deprecated in +** favour of this xSemaphoreCreateBinary() function. Note that +** binary semaphores created using the vSemaphoreCreateBinary() +** macro are created in a state such that the first call to +** 'take' the semaphore would pass, whereas binary semaphores +** created using xSemaphoreCreateBinary() are created in a +** state such that the the semaphore must first be 'given' +** before it can be 'taken'. +** Function that creates a semaphore by using the existing +** queue mechanism. The queue length is 1 as this is a binary +** semaphore. The data size is 0 as nothing is actually stored +** - all that is important is whether the queue is empty or +** full (the binary semaphore is available or not). +** This type of semaphore can be used for pure synchronisation +** between tasks or between an interrupt and a task. The +** semaphore need not be given back once obtained, so one +** task/interrupt can continuously 'give' the semaphore while +** another continuously 'takes' the semaphore. For this reason +** this type of semaphore does not use a priority inheritance +** mechanism. For an alternative that does use priority +** inheritance see xSemaphoreCreateMutex(). +** Parameters : +** NAME - DESCRIPTION +** pxSemaphoreBuffer - Must point to +** a variable of type StaticSemaphore_t, which +** will be used to hold the semaphore's state. +** Returns : +** --- - Handle to the created semaphore. +** =================================================================== +*/ + +#define McuRTOS_xSemaphoreCreateCountingStatic(uxMaxCount, uxInitialCount, pxSempahoreBuffer) \ + xSemaphoreCreateCountingStatic(uxMaxCount, uxInitialCount, pxSempahoreBuffer) +/* +** =================================================================== +** Method : xSemaphoreCreateCountingStatic (component FreeRTOS) +** +** Description : +** Macro that creates a counting semaphore by using the +** existing queue mechanism. +** Counting semaphores are typically used for two things: +** 1. Counting events. +** In this usage scenario an event handler will 'give' a +** semaphore each time an event occurs (incrementing the +** semaphore count value), and a handler task will 'take' a +** semaphore each time it processes an event (decrementing the +** semaphore count value). The count value is therefore the +** difference between the number of events that have occurred +** and the number that have been processed. In this case it is +** desirable for the initial count value to be zero. +** 2. Resource management. +** In this usage scenario the count value indicates the number +** of resources available. To obtain control of a resource a +** task must first obtain a semaphore - decrementing the +** semaphore count value. When the count value reaches zero +** there are no free resources. When a task finishes with the +** resource it 'gives' the semaphore back - incrementing the +** semaphore count value. In this case it is desirable for the +** initial count value to be equal to the maximum count value, +** indicating that all resources are free. +** Parameters : +** NAME - DESCRIPTION +** uxMaxCount - The maximum count value that +** can be reached. When the semaphore reaches +** this value it can no longer be 'given'. +** uxInitialCount - The count value +** assigned to the semaphore when it is +** created. +** pxSempahoreBuffer - Must point to +** a variable of type StaticSemaphore_t, which +** is then used to hold the semaphore's data +** structures. +** Returns : +** --- - xSemaphoreHandle handle +** =================================================================== +*/ + +#define McuRTOS_xSemaphoreCreateMutexStatic(pxMutexBuffer) \ + xSemaphoreCreateMutexStatic(pxMutexBuffer) + +/* +** =================================================================== +** Method : xSemaphoreCreateMutexStatic (component FreeRTOS) +** +** Description : +** Macro that creates a mutex semaphore by using the existing +** queue mechanism. +** Mutexes created using this macro can be accessed using the +** xSemaphoreTake() and xSemaphoreGive() macros. The +** xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() +** macros should not be used. +** Mutexes and binary semaphores are very similar but have some +** subtle differences: Mutexes include a priority inheritance +** mechanism, binary semaphores do not. This makes binary +** semaphores the better choice for implementing +** synchronisation (between tasks or between tasks and an +** interrupt), and mutexes the better choice for implementing +** simple mutual exclusion. +** The priority of a task that 'takes' a mutex can potentially +** be raised if another task of higher priority attempts to +** obtain the same mutex. The task that owns the mutex +** 'inherits' the priority of the task attempting to 'take' the +** same mutex. This means the mutex must always be 'given' back +** - otherwise the higher priority task will never be able to +** obtain the mutex, and the lower priority task will never +** 'disinherit' the priority. An example of a mutex being used +** to implement mutual exclusion is provided on the +** xSemaphoreTake() documentation page. +** A binary semaphore need not be given back once obtained, so +** task synchronisation can be implemented by one +** task/interrupt continuously 'giving' the semaphore while +** another continuously 'takes' the semaphore. This is +** demonstrated by the sample code on the +** xSemaphoreGiveFromISR() documentation page. +** Both mutex and binary semaphores are assigned to variables +** of type xSemaphoreHandle and can be used in any API function +** that takes a parameter of this type. +** Parameters : +** NAME - DESCRIPTION +** Variable_1 - Must point to a variable of +** type StaticSemaphore_t, which will be used +** to hold the mutex type semaphore's state. +** Returns : +** --- - Handle to the created mutex semaphore. +** Should be of type xSemaphoreHandle. +** =================================================================== +*/ + +#define McuRTOS_xTaskAbortDelay(xTask) \ + xTaskAbortDelay(xTask) + +/* +** =================================================================== +** Method : xTaskAbortDelay (component FreeRTOS) +** +** Description : +** Forces a task to leave the Blocked state, and enter the +** Ready state, even if the event the task was in the Blocked +** state to wait for has not occurred, and any specified +** timeout has not expired. +** Parameters : +** NAME - DESCRIPTION +** xTask - The handle of the task that will be +** forced out of the Blocked state. +** Returns : +** --- - If the task referenced by xTask was not in +** the Blocked state then pdFAIL is returned. +** Otherwise pdPASS is returned. +** =================================================================== +*/ + +#define McuRTOS_vTaskGetInfo(xTask, pxTaskStatus, xGetFreeStackSpace, eState) \ + vTaskGetInfo(xTask, pxTaskStatus, xGetFreeStackSpace, eState) +/* +** =================================================================== +** Method : vTaskGetInfo (component FreeRTOS) +** +** Description : +** Whereas uxTaskGetSystemState() populates a TaskStatus_t +** structure for each task in the system, vTaskGetInfo() +** populates a TaskStatus_t structures for just a single task. +** The TaskStatus_t structure contains, among other things, +** members for the task handle, task name, task priority, task +** state, and total amount of run time consumed by the task. +** Parameters : +** NAME - DESCRIPTION +** xTask - The handle of the task being queried. +** Setting xTask to NULL will return +** information on the calling task. +** pxTaskStatus - The TaskStatus_t +** structure pointed to by pxTaskStatus will +** be filled with information about the task +** referenced by the handle passed in the +** xTask parameter. +** xGetFreeStackSpace - The +** TaskStatus_t structure contains a member to +** report the stack high water mark of the +** task being queried. The stack high water +** mark is the minimum amount of stack space +** that has ever existed, so the closer the +** number is to zero the closer the task has +** come to overflowing its stack.Calculating +** the stack high water mark takes a +** relatively long time, and can make the +** system temporarily unresponsive - so the +** xGetFreeStackSpace parameter is provided to +** allow the high water mark checking to be +** skipped. The high watermark value will only +** be written to the TaskStatus_t structure if +** xGetFreeStackSpace is not set to pdFALSE. +** eState - The TaskStatus_t structure contains +** a member to report the state of the task +** being queried. Obtaining the task state is +** not as fast as a simple assignment - so the +** eState parameter is provided to allow the +** state information to be omitted from the +** TaskStatus_t structure. To obtain state +** information then set eState to eInvalid - +** otherwise the value passed in eState will +** be reported as the task state in the +** TaskStatus_t structure. +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTOS_uxSemaphoreGetCount(xSemaphore) \ + uxSemaphoreGetCount(xSemaphore) +/* +** =================================================================== +** Method : uxSemaphoreGetCount (component FreeRTOS) +** +** Description : +** +** Parameters : +** NAME - DESCRIPTION +** xSemaphore - The handle of the semaphore +** being queried. +** Returns : +** --- - If the semaphore is a counting semaphore +** then the semaphores current count value is +** returned. If the semaphore is a binary +** semaphore then 1 is returned if the +** semaphore is available, and 0 is returned +** if the semaphore is not available. +** =================================================================== +*/ + +#define McuRTOS_xSemaphoreCreateRecursiveMutexStatic(pxMutexBuffer) \ + xSemaphoreCreateRecursiveMutexStatic(pxMutexBuffer) +/* +** =================================================================== +** Method : xSemaphoreCreateRecursiveMutexStatic (component FreeRTOS) +** +** Description : +** Macro that implements a recursive mutex by using the +** existing queue mechanism. +** Mutexes created using this macro can be accessed using the +** xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() +** macros. The xSemaphoreTake() and xSemaphoreGive() macros +** should not be used. +** A mutex used recursively can be 'taken' repeatedly by the +** owner. The mutex doesn't become available again until the +** owner has called xSemaphoreGiveRecursive() for each +** successful 'take' request. For example, if a task +** successfully 'takes' the same mutex 5 times then the mutex +** will not be available to any other task until it has also +** 'given' the mutex back exactly five times. +** This type of semaphore uses a priority inheritance mechanism +** so a task 'taking' a semaphore MUST ALWAYS 'give' the +** semaphore back once the semaphore it is no longer required. +** Mutex type semaphores cannot be used from within interrupt +** service routines. +** See vSemaphoreCreateBinary() for an alternative +** implementation that can be used for pure synchronisation +** (where one task or interrupt always 'gives' the semaphore +** and another always 'takes' the semaphore) and from within +** interrupt service routines. +** Parameters : +** NAME - DESCRIPTION +** Variable_1 - Must point to a variable of +** type StaticSemaphore_t, which will be used +** to hold the mutex type semaphore's state. +** Returns : +** --- - Handle to the created mutex semaphore. +** Should be of type xSemaphoreHandle. +** =================================================================== +*/ + +void McuRTOS_AppConfigureTimerForRuntimeStats(void); +/* +** =================================================================== +** Method : AppConfigureTimerForRuntimeStats (component FreeRTOS) +** +** Description : +** Configures the timer for generating runtime statistics +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +uint32_t McuRTOS_AppGetRuntimeCounterValueFromISR(void); +/* +** =================================================================== +** Method : AppGetRuntimeCounterValueFromISR (component FreeRTOS) +** +** Description : +** returns the current runtime counter. Function can be called +** from an interrupt service routine. +** Parameters : None +** Returns : +** --- - runtime counter value +** =================================================================== +*/ + +/* END McuRTOS. */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* McuLib_CONFIG_SDK_USE_FREERTOS */ + +#endif +/* ifndef __McuRTOS_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuRTT.c b/TSM_PicoW_Sensor/McuLib/src/McuRTT.c new file mode 100644 index 0000000..c300d21 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuRTT.c @@ -0,0 +1,579 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuRTT.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SeggerRTT +** Version : Component 01.092, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2021-12-17, 13:26, # CodeGen: 759 +** Abstract : +** +** Settings : +** Component name : McuRTT +** Version : V6.86e +** Number of Up Channels : 3 +** Number of Down Channels : 3 +** Max Blocked Interrupt Level : 3 +** Syscalls : no +** Channel 0 : Enabled +** Name : "Terminal" +** Up Buffer Size (Tx) : 512 +** Down Buffer Size (Rx) : 64 +** Up Buffer Mode : Skip (Default) +** Down Buffer Mode : Skip (Default) +** Blocking Send : Disabled +** Printf Buffer Size : 64 +** SDK : McuLib +** Shell : McuShell +** Source Folders : +** Source Folder : SEGGER_RTT +** Config Folder : SEGGER_RTT +** Contents : +** Read - int McuRTT_Read(unsigned BufferIndex, const char* pBuffer, unsigned NumBytes); +** Write - int McuRTT_Write(unsigned BufferIndex, char* pBuffer, unsigned BufferSize); +** WriteString - unsigned McuRTT_WriteString(unsigned BufferIndex, const char* s); +** printf - int McuRTT_printf(unsigned BufferIndex, const char* sFormat, ...); +** GetKey - dword McuRTT_GetKey(void); +** WaitKey - long McuRTT_WaitKey(void); +** HasKey - long McuRTT_HasKey(void); +** SetTerminal - int McuRTT_SetTerminal(char TerminalId); +** TerminalOut - int McuRTT_TerminalOut(char TerminalId, const char* s); +** ConfigUpBuffer - int McuRTT_ConfigUpBuffer(unsigned BufferIndex, const char* sName, char*... +** ConfigDownBuffer - int McuRTT_ConfigDownBuffer(unsigned BufferIndex, const char* sName, char*... +** RecvChar - uint8_t McuRTT_RecvChar(uint8_t *c); +** SendChar - uint8_t McuRTT_SendChar(uint8_t ch); +** GetCharsInRxBuf - uint16_t McuRTT_GetCharsInRxBuf(void); +** StdIOKeyPressed - bool McuRTT_StdIOKeyPressed(void); +** StdIOReadChar - void McuRTT_StdIOReadChar(uint8_t *c); +** StdIOSendChar - void McuRTT_StdIOSendChar(uint8_t ch); +** GetStdio - %@Shell@'ModuleName'%.ConstStdIOTypePtr McuRTT_GetStdio(void); +** Deinit - void McuRTT_Deinit(void); +** Init - void McuRTT_Init(void); +** +** * (c) Copyright Segger, 2020-2021 +** * http : www.segger.com +** * See separate Segger licensing terms. +** * +** * Processor Expert port: Copyright (c) 2016-2021 Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuRTT.h +** @version 01.00 +** @brief +** +*/ +/*! +** @addtogroup McuRTT_module McuRTT module documentation +** @{ +*/ + +/* MODULE McuRTT. */ + +#include "McuRTT.h" +#if McuRTT_CONFIG_BLOCKING_SEND + #include "McuWait.h" +#endif + +/* default standard I/O struct */ +McuShell_ConstStdIOType McuRTT_stdio = { + .stdIn = (McuShell_StdIO_In_FctType)McuRTT_StdIOReadChar, + .stdOut = (McuShell_StdIO_OutErr_FctType)McuRTT_StdIOSendChar, + .stdErr = (McuShell_StdIO_OutErr_FctType)McuRTT_StdIOSendChar, + .keyPressed = McuRTT_StdIOKeyPressed, /* if input is not empty */ + #if McuShell_CONFIG_ECHO_ENABLED + .echoEnabled = false, + #endif + }; +uint8_t McuRTT_DefaultShellBuffer[McuShell_DEFAULT_SHELL_BUFFER_SIZE]; /* default buffer which can be used by the application */ + +/* +** =================================================================== +** Method : Read (component SeggerRTT) +** +** Description : +** Read from buffer +** Parameters : +** NAME - DESCRIPTION +** BufferIndex - Buffer/channel to be used. +** 0 for terminal. +** * pBuffer - Pointer to buffer +** BufferSize - Number of bytes to write +** Returns : +** --- - Number of bytes that have been read +** =================================================================== +*/ +/** +int McuRTT_Read(unsigned BufferIndex, const char* pBuffer, unsigned NumBytes) +{ + Implemented as macro in the header file. +} +*/ + +/* +** =================================================================== +** Method : Write (component SeggerRTT) +** +** Description : +** Write to buffer +** Parameters : +** NAME - DESCRIPTION +** BufferIndex - Buffer/channel to be used. +** 0 for terminal. +** * pBuffer - Pointer to buffer +** BufferSize - Size of buffer +** Returns : +** --- - Number of bytes which have been written to +** the up buffer +** =================================================================== +*/ +/** +int McuRTT_Write(unsigned BufferIndex, char* pBuffer, unsigned BufferSize) +{ + Implemented as macro in the header file. +} +*/ + +/* +** =================================================================== +** Method : WriteString (component SeggerRTT) +** +** Description : +** Write to buffer +** Parameters : +** NAME - DESCRIPTION +** BufferIndex - Buffer/channel to be used. +** 0 for terminal. +** * s - Pointer to +** Returns : +** --- - Number of bytes which have been stored in +** the "Up"-buffer. +** =================================================================== +*/ +/** +unsigned McuRTT_WriteString(unsigned BufferIndex, const char* s) +{ + Implemented as macro in the header file. +} +*/ + +/* +** =================================================================== +** Method : GetKey (component SeggerRTT) +** +** Description : +** Returns a character/key +** Parameters : None +** Returns : +** --- - character code +** =================================================================== +*/ +/** +dword McuRTT_GetKey(void) +{ + Implemented as macro in the header file. +} +*/ + +/* +** =================================================================== +** Method : WaitKey (component SeggerRTT) +** +** Description : +** Waits for a key and returns it. +** Parameters : None +** Returns : +** --- - >=0 Character which has been read. +** =================================================================== +*/ +/** +long McuRTT_WaitKey(void) +{ + Implemented as macro in the header file. +} +*/ + +/* +** =================================================================== +** Method : HasKey (component SeggerRTT) +** +** Description : +** Checks if at least one character for reading is available in +** the SEGGER RTT buffer +** Parameters : None +** Returns : +** --- - 0: No characters are available to read; 1: +** At least one character is available. +** =================================================================== +*/ +/** +long McuRTT_HasKey(void) +{ + Implemented as macro in the header file. +} +*/ + +/* +** =================================================================== +** Method : StdIOKeyPressed (component SeggerRTT) +** +** Description : +** StdIO handler for Shell +** Parameters : None +** Returns : +** --- - True if there are characters in teh input +** buffer +** =================================================================== +*/ +bool McuRTT_StdIOKeyPressed(void) +{ + return McuRTT_HasKey()!=0; +} + +/* +** =================================================================== +** Method : StdIOReadChar (component SeggerRTT) +** +** Description : +** StdIO Handler for reading a character. It returns a zero +** byte if there is no character in input buffer. +** Parameters : +** NAME - DESCRIPTION +** * c - Pointer to where to store the received +** character +** Returns : Nothing +** =================================================================== +*/ +void McuRTT_StdIOReadChar(uint8_t *c) +{ + int res; + + res = McuRTT_GetKey(); + if (res==-1) { /* no character present */ + *c = '\0'; + } else { + *c = (uint8_t)res; /* return character */ + } +} + +/* +** =================================================================== +** Method : StdIOSendChar (component SeggerRTT) +** +** Description : +** StdIO handler to sends a character. +** Parameters : +** NAME - DESCRIPTION +** ch - Character to send +** Returns : Nothing +** =================================================================== +*/ +void McuRTT_StdIOSendChar(uint8_t ch) +{ +#if McuRTT_CONFIG_BLOCKING_SEND + #if McuRTT_CONFIG_BLOCKING_SEND_WAIT_MS>0 + #define RTT_STDIO_CNTR (100) + static uint8_t cntr = 0; /* counter to avoid blocking too long if there is no RTT client on the host */ + #endif + #if McuRTT_CONFIG_BLOCKING_SEND_TIMEOUT_MS>0 && McuRTT_CONFIG_BLOCKING_SEND_WAIT_MS>0 + int timeoutMs = McuRTT_CONFIG_BLOCKING_SEND_TIMEOUT_MS; + #endif + + for(;;) { /* will break */ + if (McuRTT_Write(0, (const char*)&ch, 1)==1) { /* non blocking send, check that we were able to send */ + #if McuRTT_CONFIG_BLOCKING_SEND_WAIT_MS>0 + if (cntr>0) { + cntr--; + } + #endif + break; /* was able to send character, get out of waiting loop */ + } + #if McuRTT_CONFIG_BLOCKING_SEND_WAIT_MS>0 + cntr++; + if (cntr>=RTT_STDIO_CNTR) { /* waiting for too long, give up */ + cntr = RTT_STDIO_CNTR; + return; + } + McuWait_WaitOSms(McuRTT_CONFIG_BLOCKING_SEND_WAIT_MS); + #if McuRTT_CONFIG_BLOCKING_SEND_TIMEOUT_MS>0 + if(timeoutMs<=0) { + break; /* timeout */ + } + timeoutMs -= McuRTT_CONFIG_BLOCKING_SEND_WAIT_MS; + #endif + #endif + } /* for */ +#else + (void)McuRTT_Write(0, &ch, 1); /* non blocking send, might loose characters */ +#endif +} + +/* +** =================================================================== +** Method : RecvChar (component SeggerRTT) +** +** Description : +** Receives a character from channel 0. Returns ERR_RXEMPTY if +** no character available +** Parameters : +** NAME - DESCRIPTION +** * c - Pointer to where to store the received +** character +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuRTT_RecvChar(uint8_t *c) +{ + int res; + + res = McuRTT_GetKey(); + if (res==-1) { /* no character present */ + return ERR_RXEMPTY; + } + *c = (uint8_t)res; /* return character */ + return ERR_OK; +} + +/* +** =================================================================== +** Method : SendChar (component SeggerRTT) +** +** Description : +** Sends a character to channel 0. +** Parameters : +** NAME - DESCRIPTION +** ch - Character to send +** Returns : +** --- - Error code. ERR_OK if character has been +** sent, ERR_TXFULL otherwise. +** =================================================================== +*/ +uint8_t McuRTT_SendChar(uint8_t ch) +{ + int res; + + res = SEGGER_RTT_Write(0, (const char*)&ch, 1); + if (res!=1) { + return ERR_TXFULL; /* character not sent? */ + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : GetCharsInRxBuf (component SeggerRTT) +** +** Description : +** Returns the number of characters in the receive buffer. +** Parameters : None +** Returns : +** --- - Number of characters in the input buffer, +** zero for none available. +** =================================================================== +*/ +/** +uint16_t McuRTT_GetCharsInRxBuf(void) +{ + // Function is implemented as macro in the header file + if (SEGGER_RTT_HasKey()) { + return 1; // at least one available + } + return 0; // none available +} +*/ + +/* +** =================================================================== +** Method : TerminalOut (component SeggerRTT) +** +** Description : +** Writes a string to the given terminal without changing the +** terminal for channel 0. +** Parameters : +** NAME - DESCRIPTION +** TerminalId - TerminalId, 0..15 +** * s - Pointer to string +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +int McuRTT_TerminalOut(char TerminalId, const char* s) +{ + Function is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : SetTerminal (component SeggerRTT) +** +** Description : +** Sets the terminal to be used for output on channel 0. +** Parameters : +** NAME - DESCRIPTION +** TerminalId - Terminal ID, 0..15 +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +int McuRTT_SetTerminal(char TerminalId) +{ + Function is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : ConfigUpBuffer (component SeggerRTT) +** +** Description : +** Configures the Up (device to host) buffer +** Parameters : +** NAME - DESCRIPTION +** BufferIndex - Buffer index +** sName - Buffer name +** * pBuffer - Pointer to buffer +** intBufferSize - Size of buffer in bytes +** Flags - SEGGER_RTT_MODE_NO_BLOCK_SKIP, +** SEGGER_RTT_MODE_NO_BLOCK_TRIM or +** SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL +** Returns : +** --- - Error code, >=0 OK, <0 Error +** =================================================================== +*/ +/** +int McuRTT_ConfigUpBuffer(unsigned BufferIndex, const char* sName, char* pBuffer, int BufferSize, int Flags) +{ + Function is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : ConfigDownBuffer (component SeggerRTT) +** +** Description : +** Configures the Down (host to device) buffer +** Parameters : +** NAME - DESCRIPTION +** BufferIndex - Buffer index +** sName - Buffer name +** * pBuffer - Pointer to buffer +** intBufferSize - Size of buffer in bytes +** Flags - SEGGER_RTT_MODE_NO_BLOCK_SKIP, +** SEGGER_RTT_MODE_NO_BLOCK_TRIM or +** SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL +** Returns : +** --- - Error code, >=0 OK, <0 Error +** =================================================================== +*/ +/** +int McuRTT_ConfigDownBuffer(unsigned BufferIndex, const char* sName, char* pBuffer, int BufferSize, int Flags) +{ + Function is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : printf (component SeggerRTT) +** +** Description : +** Stores a formatted string in SEGGER RTT control block. This +** data is sent to the host. +** Parameters : +** NAME - DESCRIPTION +** BufferIndex - Index of "Up"-buffer to be +** used. (e.g. 0 for "Terminal") +** sFormat - Pointer to format string, followed +** by the arguments for conversion +** Returns : +** --- - Error code +** =================================================================== +*/ +/** +int McuRTT_printf(unsigned BufferIndex, const char* sFormat, ...) +{ + Function is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : Deinit (component SeggerRTT) +** +** Description : +** Driver deinitialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuRTT_Deinit(void) +{ + /* noting to de-initialize */ +} + +/* +** =================================================================== +** Method : Init (component SeggerRTT) +** +** Description : +** Initializes the RTT Control Block. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuRTT_Init(void) +{ + SEGGER_RTT_Init(); +} + +/* +** =================================================================== +** Method : GetStdio (component SeggerRTT) +** +** Description : +** Returns a pointer to the standard I/O +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +McuShell_ConstStdIOTypePtr McuRTT_GetStdio(void) +{ + return &McuRTT_stdio; +} + +/* END McuRTT. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuRTT.h b/TSM_PicoW_Sensor/McuLib/src/McuRTT.h new file mode 100644 index 0000000..d8923cb --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuRTT.h @@ -0,0 +1,472 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuRTT.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SeggerRTT +** Version : Component 01.092, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2021-12-17, 13:26, # CodeGen: 759 +** Abstract : +** +** Settings : +** Component name : McuRTT +** Version : V6.86e +** Number of Up Channels : 3 +** Number of Down Channels : 3 +** Max Blocked Interrupt Level : 3 +** Syscalls : no +** Channel 0 : Enabled +** Name : "Terminal" +** Up Buffer Size (Tx) : 512 +** Down Buffer Size (Rx) : 64 +** Up Buffer Mode : Skip (Default) +** Down Buffer Mode : Skip (Default) +** Blocking Send : Disabled +** Printf Buffer Size : 64 +** SDK : McuLib +** Shell : McuShell +** Source Folders : +** Source Folder : SEGGER_RTT +** Config Folder : SEGGER_RTT +** Contents : +** Read - int McuRTT_Read(unsigned BufferIndex, const char* pBuffer, unsigned NumBytes); +** Write - int McuRTT_Write(unsigned BufferIndex, char* pBuffer, unsigned BufferSize); +** WriteString - unsigned McuRTT_WriteString(unsigned BufferIndex, const char* s); +** printf - int McuRTT_printf(unsigned BufferIndex, const char* sFormat, ...); +** GetKey - dword McuRTT_GetKey(void); +** WaitKey - long McuRTT_WaitKey(void); +** HasKey - long McuRTT_HasKey(void); +** SetTerminal - int McuRTT_SetTerminal(char TerminalId); +** TerminalOut - int McuRTT_TerminalOut(char TerminalId, const char* s); +** ConfigUpBuffer - int McuRTT_ConfigUpBuffer(unsigned BufferIndex, const char* sName, char*... +** ConfigDownBuffer - int McuRTT_ConfigDownBuffer(unsigned BufferIndex, const char* sName, char*... +** RecvChar - uint8_t McuRTT_RecvChar(uint8_t *c); +** SendChar - uint8_t McuRTT_SendChar(uint8_t ch); +** GetCharsInRxBuf - uint16_t McuRTT_GetCharsInRxBuf(void); +** StdIOKeyPressed - bool McuRTT_StdIOKeyPressed(void); +** StdIOReadChar - void McuRTT_StdIOReadChar(uint8_t *c); +** StdIOSendChar - void McuRTT_StdIOSendChar(uint8_t ch); +** GetStdio - %@Shell@'ModuleName'%.ConstStdIOTypePtr McuRTT_GetStdio(void); +** Deinit - void McuRTT_Deinit(void); +** Init - void McuRTT_Init(void); +** +** * (c) Copyright Segger, 2020-2021 +** * http : www.segger.com +** * See separate Segger licensing terms. +** * +** * Processor Expert port: Copyright (c) 2016-2021 Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuRTT.h +** @version 01.00 +** @brief +** +*/ +/*! +** @addtogroup McuRTT_module McuRTT module documentation +** @{ +*/ + +#ifndef __McuRTT_H +#define __McuRTT_H + +/* MODULE McuRTT. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuRTTconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuLib.h" +#include "McuShell.h" + + +#include "SEGGER_RTT.h" + + +#define McuRTT_RTT_CHANNEL_0_ENABLED 1 /* 0: channel disabled, 1: channel enabled */ + +extern uint8_t McuRTT_DefaultShellBuffer[McuShell_DEFAULT_SHELL_BUFFER_SIZE]; /* default buffer which can be used by the application */ +extern McuShell_ConstStdIOType McuRTT_stdio; /* default standard I/O */ + +#ifdef __cplusplus +extern "C" { +#endif + +#define McuRTT_Read(BufferIndex, pBuffer, NumBytes) \ + SEGGER_RTT_Read(BufferIndex, pBuffer, NumBytes) + +/* +** =================================================================== +** Method : Read (component SeggerRTT) +** +** Description : +** Read from buffer +** Parameters : +** NAME - DESCRIPTION +** BufferIndex - Buffer/channel to be used. +** 0 for terminal. +** * pBuffer - Pointer to buffer +** BufferSize - Number of bytes to write +** Returns : +** --- - Number of bytes that have been read +** =================================================================== +*/ + +#define McuRTT_Write(BufferIndex, pBuffer, BufferSize) \ + SEGGER_RTT_Write(BufferIndex, pBuffer, BufferSize) + +/* +** =================================================================== +** Method : Write (component SeggerRTT) +** +** Description : +** Write to buffer +** Parameters : +** NAME - DESCRIPTION +** BufferIndex - Buffer/channel to be used. +** 0 for terminal. +** * pBuffer - Pointer to buffer +** BufferSize - Size of buffer +** Returns : +** --- - Number of bytes which have been written to +** the up buffer +** =================================================================== +*/ + +#define McuRTT_WriteString(BufferIndex, s) \ + SEGGER_RTT_WriteString(BufferIndex, s) + +/* +** =================================================================== +** Method : WriteString (component SeggerRTT) +** +** Description : +** Write to buffer +** Parameters : +** NAME - DESCRIPTION +** BufferIndex - Buffer/channel to be used. +** 0 for terminal. +** * s - Pointer to +** Returns : +** --- - Number of bytes which have been stored in +** the "Up"-buffer. +** =================================================================== +*/ + +#define McuRTT_GetKey() \ + SEGGER_RTT_GetKey() + +/* +** =================================================================== +** Method : GetKey (component SeggerRTT) +** +** Description : +** Returns a character/key +** Parameters : None +** Returns : +** --- - character code +** =================================================================== +*/ + +#define McuRTT_WaitKey() \ + SEGGER_RTT_WaitKey() + +/* +** =================================================================== +** Method : WaitKey (component SeggerRTT) +** +** Description : +** Waits for a key and returns it. +** Parameters : None +** Returns : +** --- - >=0 Character which has been read. +** =================================================================== +*/ + +#define McuRTT_HasKey() \ + SEGGER_RTT_HasKey() + +/* +** =================================================================== +** Method : HasKey (component SeggerRTT) +** +** Description : +** Checks if at least one character for reading is available in +** the SEGGER RTT buffer +** Parameters : None +** Returns : +** --- - 0: No characters are available to read; 1: +** At least one character is available. +** =================================================================== +*/ + +bool McuRTT_StdIOKeyPressed(void); +/* +** =================================================================== +** Method : StdIOKeyPressed (component SeggerRTT) +** +** Description : +** StdIO handler for Shell +** Parameters : None +** Returns : +** --- - True if there are characters in teh input +** buffer +** =================================================================== +*/ + +void McuRTT_StdIOReadChar(uint8_t *c); +/* +** =================================================================== +** Method : StdIOReadChar (component SeggerRTT) +** +** Description : +** StdIO Handler for reading a character. It returns a zero +** byte if there is no character in input buffer. +** Parameters : +** NAME - DESCRIPTION +** * c - Pointer to where to store the received +** character +** Returns : Nothing +** =================================================================== +*/ + +void McuRTT_StdIOSendChar(uint8_t ch); +/* +** =================================================================== +** Method : StdIOSendChar (component SeggerRTT) +** +** Description : +** StdIO handler to sends a character. +** Parameters : +** NAME - DESCRIPTION +** ch - Character to send +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuRTT_RecvChar(uint8_t *c); +/* +** =================================================================== +** Method : RecvChar (component SeggerRTT) +** +** Description : +** Receives a character from channel 0. Returns ERR_RXEMPTY if +** no character available +** Parameters : +** NAME - DESCRIPTION +** * c - Pointer to where to store the received +** character +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuRTT_SendChar(uint8_t ch); +/* +** =================================================================== +** Method : SendChar (component SeggerRTT) +** +** Description : +** Sends a character to channel 0. +** Parameters : +** NAME - DESCRIPTION +** ch - Character to send +** Returns : +** --- - Error code. ERR_OK if character has been +** sent, ERR_TXFULL otherwise. +** =================================================================== +*/ + +#define McuRTT_GetCharsInRxBuf() \ + SEGGER_RTT_HasKey() + +/* +** =================================================================== +** Method : GetCharsInRxBuf (component SeggerRTT) +** +** Description : +** Returns the number of characters in the receive buffer. +** Parameters : None +** Returns : +** --- - Number of characters in the input buffer, +** zero for none available. +** =================================================================== +*/ + +void McuRTT_Init(void); + +/* +** =================================================================== +** Method : Init (component SeggerRTT) +** +** Description : +** Initializes the RTT Control Block. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +#define McuRTT_TerminalOut(TerminalId, s) \ + SEGGER_RTT_TerminalOut(TerminalId, s) + +/* +** =================================================================== +** Method : TerminalOut (component SeggerRTT) +** +** Description : +** Writes a string to the given terminal without changing the +** terminal for channel 0. +** Parameters : +** NAME - DESCRIPTION +** TerminalId - TerminalId, 0..15 +** * s - Pointer to string +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuRTT_SetTerminal(TerminalId) \ + SEGGER_RTT_SetTerminal(TerminalId) + +/* +** =================================================================== +** Method : SetTerminal (component SeggerRTT) +** +** Description : +** Sets the terminal to be used for output on channel 0. +** Parameters : +** NAME - DESCRIPTION +** TerminalId - Terminal ID, 0..15 +** Returns : +** --- - Error code +** =================================================================== +*/ + +#define McuRTT_ConfigUpBuffer(BufferIndex, sName, pBuffer, BufferSize, Flags) \ + SEGGER_RTT_ConfigUpBuffer(BufferIndex, sName, pBuffer, BufferSize, Flags) + +/* +** =================================================================== +** Method : ConfigUpBuffer (component SeggerRTT) +** +** Description : +** Configures the Up (device to host) buffer +** Parameters : +** NAME - DESCRIPTION +** BufferIndex - Buffer index +** sName - Buffer name +** * pBuffer - Pointer to buffer +** intBufferSize - Size of buffer in bytes +** Flags - SEGGER_RTT_MODE_NO_BLOCK_SKIP, +** SEGGER_RTT_MODE_NO_BLOCK_TRIM or +** SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL +** Returns : +** --- - Error code, >=0 OK, <0 Error +** =================================================================== +*/ + +#define McuRTT_ConfigDownBuffer(BufferIndex, sName, pBuffer, BufferSize, Flags) \ + SEGGER_RTT_ConfigDownBuffer(BufferIndex, sName, pBuffer, BufferSize, Flags) + +/* +** =================================================================== +** Method : ConfigDownBuffer (component SeggerRTT) +** +** Description : +** Configures the Down (host to device) buffer +** Parameters : +** NAME - DESCRIPTION +** BufferIndex - Buffer index +** sName - Buffer name +** * pBuffer - Pointer to buffer +** intBufferSize - Size of buffer in bytes +** Flags - SEGGER_RTT_MODE_NO_BLOCK_SKIP, +** SEGGER_RTT_MODE_NO_BLOCK_TRIM or +** SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL +** Returns : +** --- - Error code, >=0 OK, <0 Error +** =================================================================== +*/ + +#define McuRTT_printf \ + SEGGER_RTT_printf + +/* +** =================================================================== +** Method : printf (component SeggerRTT) +** +** Description : +** Stores a formatted string in SEGGER RTT control block. This +** data is sent to the host. +** Parameters : +** NAME - DESCRIPTION +** BufferIndex - Index of "Up"-buffer to be +** used. (e.g. 0 for "Terminal") +** sFormat - Pointer to format string, followed +** by the arguments for conversion +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuRTT_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SeggerRTT) +** +** Description : +** Driver deinitialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +McuShell_ConstStdIOTypePtr McuRTT_GetStdio(void); +/* +** =================================================================== +** Method : GetStdio (component SeggerRTT) +** +** Description : +** Returns a pointer to the standard I/O +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +/* END McuRTT. */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif +/* ifndef __McuRTT_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuRingbuffer.c b/TSM_PicoW_Sensor/McuLib/src/McuRingbuffer.c new file mode 100644 index 0000000..38cbb13 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuRingbuffer.c @@ -0,0 +1,437 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuRingbuffer.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : RingBuffer +** Version : Component 01.054, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-14, 06:24, # CodeGen: 679 +** Abstract : +** This component implements a ring buffer for different integer data type. +** Settings : +** Component name : McuRingbuffer +** Buffer Size : 64 +** Contents : +** Clear - void McuRingbuffer_Clear(void); +** Put - uint8_t McuRingbuffer_Put(McuRingbuffer_ElementType elem); +** Get - uint8_t McuRingbuffer_Get(McuRingbuffer_ElementType *elemP); +** Peek - uint8_t McuRingbuffer_Peek(McuRingbuffer_BufSizeType index,... +** Update - uint8_t McuRingbuffer_Update(McuRingbuffer_BufSizeType index,... +** Putn - uint8_t McuRingbuffer_Putn(McuRingbuffer_ElementType *elem,... +** Getn - uint8_t McuRingbuffer_Getn(McuRingbuffer_ElementType *buf,... +** Compare - uint8_t McuRingbuffer_Compare(McuRingbuffer_BufSizeType index,... +** Delete - uint8_t McuRingbuffer_Delete(void); +** NofElements - McuRingbuffer_BufSizeType McuRingbuffer_NofElements(void); +** NofFreeElements - McuRingbuffer_BufSizeType McuRingbuffer_NofFreeElements(void); +** Deinit - void McuRingbuffer_Deinit(void); +** Init - void McuRingbuffer_Init(void); +** +** * Copyright (c) 2014-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuRingbuffer.h +** @version 01.00 +** @brief +** This component implements a ring buffer for different integer data type. +*/ +/*! +** @addtogroup McuRingbuffer_module McuRingbuffer module documentation +** @{ +*/ + +/* MODULE McuRingbuffer. */ + +#include "McuRingbuffer.h" + +#if McuRingbuffer_CONFIG_REENTRANT + #define McuRingbuffer_DEFINE_CRITICAL() McuCriticalSection_CriticalVariable() + #define McuRingbuffer_ENTER_CRITICAL() McuCriticalSection_EnterCritical() + #define McuRingbuffer_EXIT_CRITICAL() McuCriticalSection_ExitCritical() +#else + #define McuRingbuffer_DEFINE_CRITICAL() /* nothing */ + #define McuRingbuffer_ENTER_CRITICAL() /* nothing */ + #define McuRingbuffer_EXIT_CRITICAL() /* nothing */ +#endif +static McuRingbuffer_ElementType McuRingbuffer_buffer[McuRingbuffer_CONFIG_BUF_SIZE]; /* ring buffer */ +static McuRingbuffer_BufSizeType McuRingbuffer_inIdx; /* input index */ +static McuRingbuffer_BufSizeType McuRingbuffer_outIdx; /* output index */ +static McuRingbuffer_BufSizeType McuRingbuffer_inSize; /* size data in buffer */ +/* +** =================================================================== +** Method : Put (component RingBuffer) +** +** Description : +** Puts a new element into the buffer +** Parameters : +** NAME - DESCRIPTION +** elem - New element to be put into the buffer +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuRingbuffer_Put(McuRingbuffer_ElementType elem) +{ + uint8_t res = ERR_OK; + McuRingbuffer_DEFINE_CRITICAL(); + + McuRingbuffer_ENTER_CRITICAL(); + if (McuRingbuffer_inSize==McuRingbuffer_CONFIG_BUF_SIZE) { + res = ERR_TXFULL; + } else { + McuRingbuffer_buffer[McuRingbuffer_inIdx] = elem; + McuRingbuffer_inIdx++; + if (McuRingbuffer_inIdx==McuRingbuffer_CONFIG_BUF_SIZE) { + McuRingbuffer_inIdx = 0; + } + McuRingbuffer_inSize++; + } + McuRingbuffer_EXIT_CRITICAL(); + return res; +} + +/* +** =================================================================== +** Method : Putn (component RingBuffer) +** +** Description : +** Put a number new element into the buffer. +** Parameters : +** NAME - DESCRIPTION +** * elem - Pointer to new elements to be put into +** the buffer +** nof - number of elements +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuRingbuffer_Putn(McuRingbuffer_ElementType *elem, McuRingbuffer_BufSizeType nof) +{ + uint8_t res = ERR_OK; + + while(nof>0) { + res = McuRingbuffer_Put(*elem); + if (res!=ERR_OK) { + break; + } + elem++; nof--; + } + return res; +} + +/* +** =================================================================== +** Method : Get (component RingBuffer) +** +** Description : +** Removes an element from the buffer +** Parameters : +** NAME - DESCRIPTION +** * elemP - Pointer to where to store the received +** element +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuRingbuffer_Get(McuRingbuffer_ElementType *elemP) +{ + uint8_t res = ERR_OK; + McuRingbuffer_DEFINE_CRITICAL(); + + McuRingbuffer_ENTER_CRITICAL(); + if (McuRingbuffer_inSize==0) { + res = ERR_RXEMPTY; + } else { + *elemP = McuRingbuffer_buffer[McuRingbuffer_outIdx]; + McuRingbuffer_inSize--; + McuRingbuffer_outIdx++; + if (McuRingbuffer_outIdx==McuRingbuffer_CONFIG_BUF_SIZE) { + McuRingbuffer_outIdx = 0; + } + } + McuRingbuffer_EXIT_CRITICAL(); + return res; +} + +/* +** =================================================================== +** Method : Getn (component RingBuffer) +** +** Description : +** Get a number elements into a buffer. +** Parameters : +** NAME - DESCRIPTION +** * buf - Pointer to buffer where to store the +** elements +** nof - number of elements +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuRingbuffer_Getn(McuRingbuffer_ElementType *buf, McuRingbuffer_BufSizeType nof) +{ + uint8_t res = ERR_OK; + + while(nof>0) { + res = McuRingbuffer_Get(buf); + if (res!=ERR_OK) { + break; + } + buf++; nof--; + } + return res; +} + +/* +** =================================================================== +** Method : NofElements (component RingBuffer) +** +** Description : +** Returns the actual number of elements in the buffer. +** Parameters : None +** Returns : +** --- - Number of elements in the buffer. +** =================================================================== +*/ +McuRingbuffer_BufSizeType McuRingbuffer_NofElements(void) +{ + return McuRingbuffer_inSize; +} + +/* +** =================================================================== +** Method : NofFreeElements (component RingBuffer) +** +** Description : +** Returns the actual number of free elements/space in the +** buffer. +** Parameters : None +** Returns : +** --- - Number of elements in the buffer. +** =================================================================== +*/ +McuRingbuffer_BufSizeType McuRingbuffer_NofFreeElements(void) +{ + return (McuRingbuffer_BufSizeType)(McuRingbuffer_CONFIG_BUF_SIZE-McuRingbuffer_inSize); +} + +/* +** =================================================================== +** Method : Init (component RingBuffer) +** +** Description : +** Initializes the data structure +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuRingbuffer_Init(void) +{ + McuRingbuffer_inIdx = 0; + McuRingbuffer_outIdx = 0; + McuRingbuffer_inSize = 0; +} + +/* +** =================================================================== +** Method : Clear (component RingBuffer) +** +** Description : +** Clear (empty) the ring buffer. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuRingbuffer_Clear(void) +{ + McuRingbuffer_DEFINE_CRITICAL(); + + McuRingbuffer_ENTER_CRITICAL(); + McuRingbuffer_Init(); + McuRingbuffer_EXIT_CRITICAL(); +} + +/* +** =================================================================== +** Method : Peek (component RingBuffer) +** +** Description : +** Returns an element of the buffer without removiing it. +** Parameters : +** NAME - DESCRIPTION +** index - Index of element. 0 peeks the top +** element, 1 the next, and so on. +** * elemP - Pointer to where to store the received +** element +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuRingbuffer_Peek(McuRingbuffer_BufSizeType index, McuRingbuffer_ElementType *elemP) +{ + uint8_t res = ERR_OK; + int idx; /* index inside ring buffer */ + McuRingbuffer_DEFINE_CRITICAL(); + + McuRingbuffer_ENTER_CRITICAL(); + if (index>=McuRingbuffer_CONFIG_BUF_SIZE) { + res = ERR_OVERFLOW; /* asking for an element outside of ring buffer size */ + } else if (index0) { + res = McuRingbuffer_Peek(index, &val); + if (res!=ERR_OK) { /* general failure? */ + cmpResult = (uint8_t)-1; /* no match */ + break; + } + if (val!=*elemP) { /* mismatch */ + cmpResult = (uint8_t)-1; /* no match */ + break; + } + elemP++; index++; nof--; + } + + return cmpResult; +} + +/* +** =================================================================== +** Method : Deinit (component RingBuffer) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +/** +void McuRingbuffer_Deinit(void) +{ + ** Function is implemented as macro in the header file +} +*/ +/* +** =================================================================== +** Method : Delete (component RingBuffer) +** +** Description : +** Removes an element from the buffer +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuRingbuffer_Delete(void) +{ + uint8_t res = ERR_OK; + McuRingbuffer_DEFINE_CRITICAL(); + + McuRingbuffer_ENTER_CRITICAL(); + if (McuRingbuffer_inSize==0) { + res = ERR_RXEMPTY; + } else { + McuRingbuffer_inSize--; + McuRingbuffer_outIdx++; + if (McuRingbuffer_outIdx==McuRingbuffer_CONFIG_BUF_SIZE) { + McuRingbuffer_outIdx = 0; + } + } + McuRingbuffer_EXIT_CRITICAL(); + return res; +} + +/* +** =================================================================== +** Method : Update (component RingBuffer) +** +** Description : +** Updates the data of an element. +** Parameters : +** NAME - DESCRIPTION +** index - Index of element. 0 peeks the top +** element, 1 the next, and so on. +** * elemP - Pointer to where to store the received +** element +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuRingbuffer_Update(McuRingbuffer_BufSizeType index, McuRingbuffer_ElementType *elemP) +{ + uint8_t res = ERR_OK; + int idx; /* index inside ring buffer */ + McuRingbuffer_DEFINE_CRITICAL(); + + McuRingbuffer_ENTER_CRITICAL(); + if (index>=McuRingbuffer_CONFIG_BUF_SIZE) { + res = ERR_OVERFLOW; /* asking for an element outside of ring buffer size */ + } else if (index McuSDEP_callbacks.receive_char() -> sdepTask() + * SDEP / \ + * Output <- McuSDEP_callbacks.send_char() <-/ \-> McuSDEP_callbacks.forward_char() (e.g. to shell) + */ + +#include "McuSDEP.h" +#if McuSDEP_CONFIG_IS_ENABLED +#include "McuLib.h" +#include "McuRTOS.h" +#include "McuLog.h" +#include "McuArmTools.h" +#include "McuRB.h" +#include "McuUtility.h" +#include "McuIO.h" +#if McuLib_CONFIG_CPU_IS_RPxxxx + #include "pico/util/queue.h" +#endif + +/* --------------------------------------------------------------------------------- */ +/* Logging channel configuration */ +/* --------------------------------------------------------------------------------- */ +static uint8_t logChannel = 0; + +void McuSDEP_SetLogChannel(uint8_t channel) { + logChannel = channel; +} + +uint8_t McuSDEP_GetLogChannel(void) { + return logChannel; +} +/* --------------------------------------------------------------------------------- */ +/* Buffers and IO for incoming rx data for SDEP */ +/* --------------------------------------------------------------------------------- */ +#if McuSDEP_CONFIG_USE_FREERTOS + static QueueHandle_t rxDataBuffer; /* using FreeRTOS queue */ +#else + static McuRB_Handle_t rxDataBuffer; /* using bare metal ring buffer */ +#endif + +static McuIO_Desc_t *McuSDEP_SdepIO = NULL; /* I/O buffer for incoming data: SDEP and non-SDEP shell data */ +static void (*McuSDEP_txToShell_cb)(char) = NULL; /* callback to write non-SDEP messages to the console */ +static int (*McuSDEP_rxToBuffer_cb)(void) = NULL; /* callback to get data from the rx buffer (e.g. queue from USB Host CDC) */ + +void McuSDEP_SetForwardCharCallback(void (*forward_char_cb)(char)) { + McuSDEP_txToShell_cb = forward_char_cb; +} + +void McuSDEP_SetRxToBufferCallback(int (*rx_cb)(void)) { + McuSDEP_rxToBuffer_cb = rx_cb; +} + +void McuSDEP_SetSdepIO(McuIO_Desc_t *io) { + McuSDEP_SdepIO = io; +} + +McuIO_Desc_t *McuSDEP_GetSdepIO(void) { + return McuSDEP_SdepIO; +} + +void McuSDEP_StoreCharInSdepBuffer(char ch) { /* callback set with McuShellCdcDevice_SetBufferRxCharCallback(): needs void(*cp)(char) */ + McuIO_Desc_t *io = McuSDEP_GetSdepIO(); + (void)io->buffer.write(io, ch); +} +/* --------------------------------------------------------------------------------- */ +static uint8_t crc8_bytecalc(unsigned char byte, uint8_t* seed) { + #define CRC8_POLYNOM (0x07) + uint8_t i; + uint8_t flag; + uint8_t polynom = CRC8_POLYNOM; + + for (i = 0; i < 8; i++) { + if (*seed & 0x80) { + flag = 1; + } else { + flag = 0; + } + *seed <<= 1; + if (byte & 0x80) { + *seed |= 1; + } + byte <<= 1; + if (flag) { + *seed ^= polynom; + } + } + return *seed; +} + +static uint8_t crc8_messagecalc(unsigned char *msg, uint8_t len, uint8_t* seed) { + for (int i = 0; i < len; i++) { + crc8_bytecalc(msg[i], seed); + } + uint8_t crc = crc8_bytecalc(0, seed); + return crc; +} + +static uint8_t McuSDEP_Crc8(McuSDEPmessage_t *message) { + uint8_t crc, seed = 0; + + crc = crc8_bytecalc(message->type, &seed); + crc = crc8_bytecalc((uint8_t) message->cmdId, &seed); + crc = crc8_bytecalc((uint8_t) (message->cmdId >> 8), &seed); + crc = crc8_bytecalc(message->payloadSize, &seed); + crc = crc8_messagecalc((unsigned char*) message->payload, message->payloadSize & ~McuSDEP_PAYLOADBYTE_MORE_DATA_BIT, &seed); + return crc; +} + +static void DecodeMessage(McuSDEPmessage_t *msg, unsigned char *buf, size_t bufSize) { + McuUtility_strcpy(buf, bufSize, "type:"); + switch(msg->type) { + case McuSDEP_MSG_TYPE_COMMAND: + McuUtility_strcat(buf, bufSize, "CMD"); + break; + case McuSDEP_MSG_TYPE_RESPONSE: + McuUtility_strcat(buf, bufSize, "RSP"); + break; + case McuSDEP_MSG_TYPE_ALERT: + McuUtility_strcat(buf, bufSize, "ALE"); + break; + case McuSDEP_MSG_TYPE_ERROR: + McuUtility_strcat(buf, bufSize, "ERR"); + break; + default: break; + } + McuUtility_strcat(buf, bufSize, " cmd:"); + McuUtility_strcatNum16Hex(buf, bufSize, msg->cmdId); + McuUtility_strcat(buf, bufSize, " size:"); + McuUtility_strcatNum8Hex(buf, bufSize, msg->payloadSize); + if (msg->payloadSize>0) { + McuUtility_strcat(buf, bufSize, " data:"); + for(int i=0; ipayloadSize; i++) { + McuUtility_strcatNum8Hex(buf, bufSize, msg->payload[i]); + if (ipayloadSize-1) { /* not for the last byte */ + McuUtility_chcat(buf, bufSize, ' '); + } + } + } + McuUtility_strcat(buf, bufSize, " crc:"); + McuUtility_strcatNum8Hex(buf, bufSize, msg->crc); +} + +static void sendBlock(McuIO_Desc_t *io, char *data, size_t count) { + for(int i=0; iout.write(data[i]); + } +} + +uint8_t McuSDEP_SendMessage(McuIO_Desc_t *io, McuSDEPmessage_t *msg) { + msg->crc = McuSDEP_Crc8(msg); + #if McuSDEP_CONFIG_USE_FRAMING + McuSDEP_SendByte(McuSDEP_CONFIG_MSG_FRAMING_START); + #endif + io->out.write(msg->type); + io->out.write(msg->cmdId); /* send little endian first */ + io->out.write((msg->cmdId >> 8)); + io->out.write(msg->payloadSize); + sendBlock(io, msg->payload, msg->payloadSize & ~McuSDEP_PAYLOADBYTE_MORE_DATA_BIT); + io->out.write(msg->crc); + #if McuSDEP_CONFIG_USE_FRAMING + McuSDEP_SendByte(McuSDEP_CONFIG_MSG_FRAMING_END); + #endif + io->out.flush(); + unsigned char buf[96]; + DecodeMessage(msg, buf, sizeof(buf)); + McuSDEP_Log("Tx: %s", buf); + return ERR_OK; +} + +static uint8_t McuSDEP_SendResponseForCmd(McuIO_Desc_t *io, uint16_t cmdId) { + McuSDEPmessage_t msg; + + msg.type = McuSDEP_MSG_TYPE_COMMAND; + msg.cmdId = cmdId; + msg.payload = NULL; + msg.payloadSize = 0; + msg.crc = McuSDEP_Crc8(&msg); + McuSDEP_ID_HandleIncommingMessage(&msg); + return ERR_OK; +} + +static uint8_t McuSDEP_SendCommand(McuIO_Desc_t *io, uint16_t cmdId) { + McuSDEPmessage_t msg; + + msg.type = McuSDEP_MSG_TYPE_COMMAND; + msg.cmdId = cmdId; + msg.payload = NULL; + msg.payloadSize = 0; + msg.crc = McuSDEP_Crc8(&msg); + McuSDEP_SendMessage(io, &msg); + return ERR_OK; +} + +static uint8_t McuSDEP_SendError(McuIO_Desc_t *io, uint16_t cmdErrorId) { + McuSDEPmessage_t msg; + + msg.type = McuSDEP_MSG_TYPE_ERROR; + msg.cmdId = cmdErrorId; + msg.payload = NULL; + msg.payloadSize = 0; + msg.crc = McuSDEP_Crc8(&msg); + McuSDEP_SendMessage(io, &msg); + return ERR_OK; +} + +static inline bool isValidSDEPType(unsigned char ch) { + return ch == McuSDEP_MSG_TYPE_COMMAND + || ch == McuSDEP_MSG_TYPE_RESPONSE + || ch == McuSDEP_MSG_TYPE_ERROR + || ch == McuSDEP_MSG_TYPE_ALERT; +} + +static uint8_t readByte(unsigned char *buf, size_t bufSize, size_t *currBufIdx, McuIO_Desc_t *io) { + int ch; + + if (*currBufIdx>=bufSize) { + return ERR_OVERFLOW; + } + if (io->buffer.nofData(io)==0) { + return ERR_NOTAVAIL; + } + ch = io->buffer.read(io); + if (ch==EOF) { /* no data available */ + return ERR_NOTAVAIL; + } + buf[(*currBufIdx)++] = ch; + return ERR_OK; +} + +static uint8_t McuSDEP_ParseSDEPMessage(McuIO_Desc_t *io, unsigned char *buf, size_t bufSize, size_t *currBufIdx, McuSDEPmessage_t *msg) { + uint8_t res; + + /* 0: message type: 8 bits */ + if (*currBufIdx==0) { /* at the start */ + res = readByte(buf, bufSize, currBufIdx, io); + if (res!=ERR_OK) { + return res; + } + if (!isValidSDEPType(buf[(*currBufIdx)-1])) { + return ERR_FAILED; /* not valid message type */ + } + msg->type = buf[(*currBufIdx)-1]; + /* initialize other fields */ + msg->cmdId = 0; + msg->payloadSize = 0; + msg->payload = 0; + msg->crc = 0; + memset(buf+1, 0, bufSize-1); /* initialize buffer, except the first byte */ + } + /* 1: message command ID: low byte*/ + if (*currBufIdx==1) { /* first byte of cmd */ + res = readByte(buf, bufSize, currBufIdx, io); + if (res!=ERR_OK) { + return res; + } + msg->cmdId = buf[(*currBufIdx)-1]; /* low byte */ + } + /* 2: message command ID: high byte*/ + if (*currBufIdx==2) { /* second byte of cmd */ + res = readByte(buf, bufSize, currBufIdx, io); + if (res!=ERR_OK) { + return res; + } + msg->cmdId |= buf[(*currBufIdx)-1]<<8; /* high byte */ + if (!McuSDEP_ID_isValidSDEPCommand(msg->cmdId)) { + return ERR_FAILED; /* not valid message type */ + } + } + /* 3: message payload size: 8 bits */ + if (*currBufIdx==3) { + res = readByte(buf, bufSize, currBufIdx, io); + if (res!=ERR_OK) { + return res; + } + msg->payloadSize = buf[(*currBufIdx)-1]; + } + /* 4: payload, if any, followed by CRC */ + if (*currBufIdx>=4 && msg->payloadSize!=0 && *currBufIdx<3+msg->payloadSize+1) { /* with payload: read data first */ + do { /* read payload */ + res = readByte(buf, bufSize, currBufIdx, io); + if (res!=ERR_OK) { + return res; + } + } while(*currBufIdx<3+msg->payloadSize+1); + /* finished reading payload: point to beginning of data: */ + msg->payload = &buf[*currBufIdx - msg->payloadSize]; + } + /* last item: CRC */ + res = readByte(buf, bufSize, currBufIdx, io); + if (res!=ERR_OK) { + return res; + } + msg->crc = buf[(*currBufIdx)-1]; + if (McuSDEP_Crc8(msg) != msg->crc) { + return ERR_CRC; /* crc does not match */ + } + return ERR_OK; /* valid message */ +} + +static uint8_t PrintHelp(McuShell_ConstStdIOType *io) { + McuShell_SendHelpStr((unsigned char*)"McuSDEP", (const unsigned char*)"Group of McuSDEP commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (const unsigned char*)"Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" cmd ", (const unsigned char*)"Send command\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" resp ", (const unsigned char*)"Send response for command\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" text ", (const unsigned char*)"Send text\r\n", io->stdOut); + return ERR_OK; +} + +static uint8_t PrintStatus(McuShell_ConstStdIOType *io) { + unsigned char buf[16]; + + McuShell_SendStatusStr((const unsigned char*)"McuSDEP", (const unsigned char*)"McuSDEP module status\r\n", io->stdOut); + McuUtility_strcpy(buf, sizeof(buf), "channel: "); + McuUtility_strcatNum8u(buf, sizeof(buf), logChannel); + McuUtility_strcat(buf, sizeof(buf), "\r\n"); + McuShell_SendStatusStr((const unsigned char*)" log", buf, io->stdOut); + return ERR_OK; +} + +uint8_t McuSDEP_ParseCommand(const uint8_t *cmd, bool *handled, McuShell_ConstStdIOType *io) { + const unsigned char *p; + uint32_t val; + + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, "McuSDEP help")==0) { + *handled = TRUE; + return PrintHelp(io); + } else if ((McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) || (McuUtility_strcmp((char*)cmd, "McuSDEP status")==0)) { + *handled = TRUE; + return PrintStatus(io); + } else if (McuUtility_strncmp((char*)cmd, "McuSDEP cmd ", sizeof("McuSDEP cmd ")-1)==0) { + *handled = TRUE; + p = cmd + sizeof("McuSDEP cmd ")-1; + if (McuUtility_xatoi(&p, &val)!=ERR_OK) { + return ERR_FAILED; + } + return McuSDEP_SendCommand(McuSDEP_GetSdepIO(), val); + } else if (McuUtility_strncmp((char*)cmd, "McuSDEP resp ", sizeof("McuSDEP resp ")-1)==0) { + *handled = TRUE; + p = cmd + sizeof("McuSDEP resp ")-1; + if (McuUtility_xatoi(&p, &val)!=ERR_OK) { + return ERR_FAILED; + } + return McuSDEP_SendResponseForCmd(McuSDEP_GetSdepIO(), val); + } else if (McuUtility_strncmp((char*)cmd, "McuSDEP text ", sizeof("McuSDEP text ")-1)==0) { + *handled = TRUE; + p = cmd + sizeof("McuSDEP text ")-1; + McuIO_Desc_t *io = McuSDEP_GetSdepIO(); + while(*p!='\0') { + io->out.write(*p); + p++; + } + io->out.write('\n'); + io->out.flush(); + return ERR_OK; + } + return ERR_OK; +} + +static void sdepTask(void *pv) { + uint8_t res; + uint8_t buf[McuSDEP_MESSAGE_MAX_NOF_BYTES + 1]; + uint8_t debugBuf[64]; + size_t bufIdx = 0; + McuSDEPmessage_t msg; + bool checkingSDEP = false; + int timeoutMs; + McuIO_Desc_t *io = McuSDEP_GetSdepIO(); + + for(;;) { + if (McuSDEP_rxToBuffer_cb!=NULL) { /* have valid callback? Read data from Rx buffer */ + /* try to transfer data from Rx buffer quickly to the SDEP buffer */ + while(io->buffer.nofFree(io)>0) { + int ch = McuSDEP_rxToBuffer_cb(); /* check if we have data */ + if (ch==EOF) { /* no data from available: get out of loop */ + break; + } + io->buffer.write(io, ch); /* store in our own buffer */ + } /* while */ + } + if (io->buffer.nofData(io)>0) { /* have data to handle in SDEP buffer */ + timeoutMs = 0; + res = McuSDEP_ParseSDEPMessage(io, buf, sizeof(buf), &bufIdx, &msg); + if (res==ERR_OK) { /* parsed a valid SDEP message */ + bufIdx = 0; /* start for new iteration */ + DecodeMessage(&msg, debugBuf, sizeof(debugBuf)); + McuSDEP_Log("Rx: %s", debugBuf); + McuSDEP_ID_HandleIncommingMessage(&msg); + } else if (res==ERR_NOTAVAIL) { /* need to read more data */ + vTaskDelay(pdMS_TO_TICKS(5)); + } else if (res==ERR_FAILED) { /* not SDEP, forward to shell */ + if (McuSDEP_txToShell_cb!=NULL) { + for(int i=0; i0 && timeoutMs>500) { /* we have data in the buffer and expect it an SDEP, but takes too long? */ + /* abort and forward it */ + if (McuSDEP_txToShell_cb!=NULL) { + for(int i=0; i +#include +#include "McuShell.h" +#include "McuIO.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct McuSDEPmessage_t { + uint8_t type; /* message type, e.g. McuSDEP_MSG_TYPE_COMMAND */ + uint16_t cmdId; /* command ID, e.g. McuSDEP_CMD_TYPE_PING */ + uint8_t payloadSize; /* number of payload bytes */ + uint8_t *payload; /* payload of data */ + uint8_t crc; /* CRC8 of the message */ +} McuSDEPmessage_t; + +#define McuSDEP_MESSAGE_MAX_NOF_BYTES 131 +#define McuSDEP_MESSAGE_MAX_PAYLOAD_BYTES 127 +#define McuSDEP_PAYLOADBYTE_MORE_DATA_BIT 0x80 + +/* message types (U8) */ +#define McuSDEP_MSG_TYPE_COMMAND 0x10 +#define McuSDEP_MSG_TYPE_RESPONSE 0x20 +#define McuSDEP_MSG_TYPE_ALERT 0x40 +#define McuSDEP_MSG_TYPE_ERROR 0x80 + +#include "McuSDEP_IDs.h" /* application specific SDEP IDs */ + +/* --------------------------------------------------------------------------------- */ +/* optional buffer incoming rx data for SDEP */ +/* --------------------------------------------------------------------------------- */ +void McuSDEP_SetSdepIO(McuIO_Desc_t *io); +McuIO_Desc_t *McuSDEP_GetSdepIO(void); + +void McuSDEP_StoreCharInSdepBuffer(char ch); +/* --------------------------------------------------------------------------------- */ +/*! + * \brief Set a callback to forward non-SDEP characters. + * \param forward_char_cb Callback to be called for forwarding. Can be NULL. + */ +void McuSDEP_SetForwardCharCallback(void (*forward_char_cb)(char)); + +/*! + * \brief Set a callback to get data into SDEP buffer. + * \param rx_cb Callback to be called for getting data. Can be NULL. + */ +void McuSDEP_SetRxToBufferCallback(int (*rx_cb)(void)); + +/*! + * \brief Send an SDEP message. + * \param io I/O to be used. + * \param msg Message to be sent. + * \return ERR_OK for success. + */ +uint8_t McuSDEP_SendMessage(McuIO_Desc_t *io, McuSDEPmessage_t *msg); + +/*! +* \brief Shell command line handler +* \param cmd String to command to be parsed +* \param handled Returns if command has been handled +* \param io I/O channel +* \return Error code, ERR_OK if everything is ok +*/ +uint8_t McuSDEP_ParseCommand(const uint8_t *cmd, bool *handled, McuShell_ConstStdIOType *io); + +/*! + * \brief Set the current McuLog channel. Preferred to use RTT or a non-SDEP channel. +*/ +void McuSDEP_SetLogChannel(uint8_t channel); + +/*! + * \brief Get the current McuLog channel. + * \return The current log channel number. +*/ +uint8_t McuSDEP_GetLogChannel(void); + +/*! + * \brief Define which can be used to log an SDEP related message. That way does not interfer with SDEP communication channel. + */ +#define McuSDEP_Log(...) McuLog_ChannelLog(McuSDEP_GetLogChannel(), McuLog_TRACE, __BASE_FILE__, __LINE__, __VA_ARGS__) + +/*! + * \brief Driver de-initialization. + */ +void McuSDEP_Deinit(void); + +/*! + * \brief Driver initialization. + */ +void McuSDEP_Init(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* McuSDEP_CONFIG_IS_ENABLED */ + +#endif /* _MCUSDEP_H_ */ \ No newline at end of file diff --git a/TSM_PicoW_Sensor/McuLib/src/McuSHT31.c b/TSM_PicoW_Sensor/McuLib/src/McuSHT31.c new file mode 100644 index 0000000..1f0a587 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuSHT31.c @@ -0,0 +1,195 @@ +/* + * Copyright (c) 2019, Erich Styger + * All rights reserved. + * + * Driver for the SHT31 Temperature/Humidity sensor + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuSHT31config.h" +#include "McuSHT31.h" +#include "McuGenericI2C.h" +#include "McuUtility.h" +#include /* for NULL */ + +#define SHT31_MEAS_HIGHREP_STRETCH 0x2C06 +#define SHT31_MEAS_MEDREP_STRETCH 0x2C0D +#define SHT31_MEAS_LOWREP_STRETCH 0x2C10 +#define SHT31_MEAS_HIGHREP 0x2400 +#define SHT31_MEAS_MEDREP 0x240B +#define SHT31_MEAS_LOWREP 0x2416 +#define SHT31_READSTATUS 0xF32D +#define SHT31_CLEARSTATUS 0x3041 +#define SHT31_SOFTRESET 0x30A2 +#define SHT31_HEATEREN 0x306D +#define SHT31_HEATERDIS 0x3066 + +/* status bits of the Status register (0xF32D) */ +#define SHT31_STATUS_ALERT_PENDING (1<<15) /* 0: no pending alert, 1: at least one pending alert */ +#define SHT31_STATUS_HEATER_ON (1<<13) /* 0: heater OFF, 1: heater ON */ +#define SHT31_STATUS_RH_TRACKING_ALERT (1<<11) /* 0: no RH tracking alert, 1: alert */ +#define SHT31_STATUS_T_TRACKING_ALERT (1<<10) /* 0: no T tracking alert, 1: alert */ +#define SHT31_STATUS_SYSTEM_RESET (1<<4) /* 0: no reset detected since last clear status register command, 1: reset detected (hard reset, soft reset or supply fail */ +#define SHT31_STATUS_CMD_STATUS (1<<1) /* 0: last command executed successfully; 1: last command not processed, it was either invalid, failed the internal command checksum */ +#define SHT31_STATUS_WRITE_CRC_STATUS (1<<0) /* 0: checksum of last write transfer was correct, 1: checksum of last write transfer failed */ + +#define SHT31_CRC8_POLYNOMIAL 0x31 /* Seed for CRC polynomial */ +#define SHT31_CRC8_INIT 0xFF /* Init value for CRC */ + +static uint8_t SHT31_GenerateCRC(uint8_t *data, uint8_t datalen) { + /* calculates 8-Bit checksum with given polynomial */ + uint8_t crc = SHT31_CRC8_INIT; + uint8_t b; + uint8_t i; + + for (i=0; i>8; + buf[1] = cmd&0xff; + return McuGenericI2C_WriteAddress(McuSHT31_CONFIG_I2C_ADDR, buf, sizeof(buf), NULL, 0); +} + +uint8_t SHT31_ReadStatus(uint16_t *status) { + uint8_t res; + uint8_t cmd[2]; + uint8_t stat[3]; + uint8_t crc; + + cmd[0] = SHT31_READSTATUS>>8; + cmd[1] = SHT31_READSTATUS&0xff; + res = McuGenericI2C_ReadAddress(McuSHT31_CONFIG_I2C_ADDR, cmd, sizeof(cmd), stat, sizeof(stat)); + if (res!=ERR_OK) { + *status = 0; + return res; + } + crc = SHT31_GenerateCRC(stat, 2); + if (crc!=stat[2]) { + return ERR_CRC; /* wrong CRC */ + } + *status = (stat[0]<<8)+stat[1]; /* ignore CRC */ + return res; +} + +uint8_t McuSHT31_Heater(bool on) { + return SHT31_WriteCommand(on?SHT31_HEATEREN:SHT31_HEATERDIS); +} + +uint8_t McuSHT31_Reset(void) { + return SHT31_WriteCommand(SHT31_SOFTRESET); +} + +uint8_t McuSHT31_ReadTempHum(float *temperature, float *humidity) { + uint16_t ST, SRH; + uint8_t readbuffer[6]; + uint8_t res; + uint8_t cmd[2]; + + cmd[0] = SHT31_MEAS_HIGHREP>>8; + cmd[1] = SHT31_MEAS_HIGHREP&0xff; + res = McuGenericI2C_ReadAddressWait(McuSHT31_CONFIG_I2C_ADDR, cmd, sizeof(cmd), McuSHT31_CONFIG_READ_WAIT_MS, readbuffer, sizeof(readbuffer)); + if (res!=ERR_OK) { + return res; + } + ST = (readbuffer[0]<<8)|readbuffer[1]; + if (readbuffer[2] != SHT31_GenerateCRC(readbuffer, 2)) { + return ERR_CRC; + } + + SRH = (readbuffer[3]<<8)|readbuffer[4]; + if (readbuffer[5] != SHT31_GenerateCRC(readbuffer+3, 2)) { + return ERR_CRC; + } + /* source: https://github.com/adafruit/Adafruit_SHT31/blob/master/Adafruit_SHT31.cpp */ + int32_t stemp = (int32)ST; + /* simplified (65536 instead of 65535) integer version of: + * temp = (stemp * 175.0f) / 65535.0f - 45.0f; + */ + stemp = ((4375 * stemp) >> 14) - 4500; + *temperature = (float)stemp / 100.0f; + + /* source: https://github.com/adafruit/Adafruit_SHT31/blob/master/Adafruit_SHT31.cpp */ + uint32_t shum = (uint32_t)SRH; + /* simplified (65536 instead of 65535) integer version of: + * humidity = (shum * 100.0f) / 65535.0f; + */ + shum = (625 * shum) >> 12; + *humidity = (float)shum / 100.0f; + return ERR_OK; +} + +#if MCUSHT31_CONFIG_PARSE_COMMAND_ENABLED +static uint8_t PrintStatus(const McuShell_StdIOType *io) { + uint8_t buf[32]; + float temperature, humidity; + + McuShell_SendStatusStr((unsigned char*)"SHT31", (unsigned char*)"Sensirion SHT31 sensor status\r\n", io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), McuSHT31_CONFIG_I2C_ADDR); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" addr", buf, io->stdOut); + + if(McuSHT31_ReadTempHum(&temperature, &humidity)==ERR_OK) { + McuUtility_NumFloatToStr(buf, sizeof(buf), temperature, 2); + McuUtility_chcat(buf, sizeof(buf), '\xB0'); /* add '°' (ASCII 0xB0) it as single char, as with UTF-8 it might end up in two bytes inside a string */ + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"C\r\n"); + McuShell_SendStatusStr((unsigned char*)" temp", buf, io->stdOut); + + McuUtility_NumFloatToStr(buf, sizeof(buf), humidity, 2); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" RH\r\n"); + McuShell_SendStatusStr((unsigned char*)" humidity", buf, io->stdOut); + } else { + McuShell_SendStatusStr((unsigned char*)" ERROR:", (unsigned char*)" *** ERROR reading sensor values\r\n", io->stdOut); + } + return ERR_OK; +} + +static uint8_t PrintHelp(const McuShell_StdIOType *io) { + McuShell_SendHelpStr((unsigned char*)"SHT31", (unsigned char*)"Group of SHT31 commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Print help or status information\r\n", io->stdOut); + return ERR_OK; +} +#endif /* MCUSHT31_CONFIG_PARSE_COMMAND_ENABLED */ + +#if MCUSHT31_CONFIG_PARSE_COMMAND_ENABLED +uint8_t McuSHT31_ParseCommand(const unsigned char* cmd, bool *handled, const McuShell_StdIOType *io) { + uint8_t res = ERR_OK; + + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP) == 0 + || McuUtility_strcmp((char*)cmd, "SHT31 help") == 0) + { + *handled = TRUE; + return PrintHelp(io); + } else if ( (McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) + || (McuUtility_strcmp((char*)cmd, "SHT31 status")==0) + ) + { + *handled = TRUE; + res = PrintStatus(io); + } + return res; +} +#endif /* SHT31_CONFIG_PARSE_COMMAND_ENABLED */ + +void McuSHT31_Init(void) { + /* noting to do */ +} + +void McuSHT31_Deinit(void) { + /* nothing to do */ +} diff --git a/TSM_PicoW_Sensor/McuLib/src/McuSHT31.h b/TSM_PicoW_Sensor/McuLib/src/McuSHT31.h new file mode 100644 index 0000000..968166d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuSHT31.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2019, Erich Styger + * All rights reserved. + * + * Driver for the Sensirion SHT31 Temperature/Humidity sensor + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef SOURCES_MCUSHT31_H_ +#define SOURCES_MCUSHT31_H_ + +#include "McuSHT31config.h" +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if MCUSHT31_CONFIG_PARSE_COMMAND_ENABLED + #include "McuShell.h" + +/*! + * \brief Shell command line handler + * \param cmd Pointer to the command string + * \param handled Return value to indicate if command has been recognized + * \param io I/O handler for input/output + * \return Error code, ERR_OK for no error + */ + uint8_t McuSHT31_ParseCommand(const unsigned char* cmd, bool *handled, const McuShell_StdIOType *io); +#endif + + /*! + * \brief Perform a soft reset + * \return Error code, ERR_OK for no error + */ +uint8_t McuSHT31_Reset(void); + +/*! + * \brief Turn the heater on or off + * \param on If heater has to be turned on or off + * \return Error code, ERR_OK for no error + */ +uint8_t McuSHT31_Heater(bool on); + +/*! + * \brief Reads the device status register + * \param status Where to store the status + * \return Error code, ERR_OK for no error + */ +uint8_t SHT31_ReadStatus(uint16_t *status); + +/*! + * \brief Read temperature and relative humidity + * \param temperature Pointer to where to store the value + * \param humidity Pointer to where to store the value + * \return Error code, ERR_OK for no error + */ +uint8_t McuSHT31_ReadTempHum(float *temperature, float *humidity); + +/*! + * \brief Module de-initialization + */ +void McuSHT31_Deinit(void); + +/*! + * \brief Module initialization + */ +void McuSHT31_Init(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* SOURCES_MCUSHT31_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuSHT40.c b/TSM_PicoW_Sensor/McuLib/src/McuSHT40.c new file mode 100644 index 0000000..008ed0b --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuSHT40.c @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2019, 2022 Erich Styger + * All rights reserved. + * + * Driver for the Sensirion SHT40 Temperature/Humidity sensor + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuSHT40config.h" +#include "McuSHT40.h" +#include "McuGenericI2C.h" +#include "McuUtility.h" +#include /* for NULL */ + +#define SHT40_MEAS_HIGHREP 0xFD +#define SHT40_MEAS_MEDREP 0xF6 +#define SHT40_MEAS_LOWREP 0xE0 + +#define SHT40_READSERIALNUM 0x89 + +#define SHT40_SOFTRESET 0x94 + +#define SHT40_HEATER_200MW_1000MS_PRECISION_HIGH 0x39 /* activate heater with 200mW for 1s, including a high precision measurement just before deactivation */ +#define SHT40_HEATER_200MW_100MS_PRECISION_HIGH 0x32 /* activate heater with 200mW for 0.1s, including a high precision measurement just before deactivation */ +#define SHT40_HEATER_110MW_1000MS_PRECISION_HIGH 0x2F /* activate heater with 110mW for 1s, including a high precision measurement just before deactivation */ +#define SHT40_HEATER_110MW_100MS_PRECISION_HIGH 0x24 /* activate heater with 110mW for 0.1s, including a high precision measurement just before deactivation */ +#define SHT40_HEATER_20MW_1000MS_PRECISION_HIGH 0x1E /* activate heater with 20mW for 1s, including a high precision measurement just before deactivation */ +#define SHT40_HEATER_20MW_100MS_PRECISION_HIGH 0x15 /* activate heater with 20mW for 0.1s, including a high precision measurement just before deactivation */ + + +/* status bits of the Status register (0xF32D) */ +#define SHT40_STATUS_ALERT_PENDING (1<<15) /* 0: no pending alert, 1: at least one pending alert */ +#define SHT40_STATUS_HEATER_ON (1<<13) /* 0: heater OFF, 1: heater ON */ +#define SHT40_STATUS_RH_TRACKING_ALERT (1<<11) /* 0: no RH tracking alert, 1: alert */ +#define SHT40_STATUS_T_TRACKING_ALERT (1<<10) /* 0: no T tracking alert, 1: alert */ +#define SHT40_STATUS_SYSTEM_RESET (1<<4) /* 0: no reset detected since last clear status register command, 1: reset detected (hard reset, soft reset or supply fail */ +#define SHT40_STATUS_CMD_STATUS (1<<1) /* 0: last command executed successfully; 1: last command not processed, it was either invalid, failed the internal command checksum */ +#define SHT40_STATUS_WRITE_CRC_STATUS (1<<0) /* 0: checksum of last write transfer was correct, 1: checksum of last write transfer failed */ + +#define SHT40_CRC8_POLYNOMIAL 0x31 /* Seed for CRC polynomial */ +#define SHT40_CRC8_INIT 0xFF /* Init value for CRC */ + +static uint8_t SHT40_GenerateCRC(uint8_t *data, uint8_t datalen) { + /* calculates 8-Bit checksum with given polynomial */ + uint8_t crc = SHT40_CRC8_INIT; + uint8_t b; + uint8_t i; + + for (i=0; i>8; + buf[1] = cmd&0xff; + return McuGenericI2C_WriteAddress(McuSHT40_CONFIG_I2C_ADDR, buf, sizeof(buf), NULL, 0); +} + +uint8_t SHT40_ReadSerialNumber(uint32_t *serial) { + uint8_t res; + uint8_t cmd[1]; + uint8_t readbuffer[6]; + + cmd[0] = SHT40_READSERIALNUM; + res = McuGenericI2C_ReadAddressWait(McuSHT40_CONFIG_I2C_ADDR, cmd, sizeof(cmd), 20, readbuffer, sizeof(readbuffer)); + if (res!=ERR_OK) { + *serial = 0; + return res; + } + *serial = (readbuffer[0]<<24)|(readbuffer[1]<<16); + if (readbuffer[2] != SHT40_GenerateCRC(readbuffer, 2)) { + return ERR_CRC; + } + + *serial |= (readbuffer[3]<<8)|readbuffer[4]; + if (readbuffer[5] != SHT40_GenerateCRC(readbuffer+3, 2)) { + return ERR_CRC; + } + return res; +} + +uint8_t McuSHT40_Reset(void) { + return SHT40_WriteCommand(SHT40_SOFTRESET); +} + +uint8_t McuSHT40_ReadTempHum(float *temperature, float *humidity) { + float stemp, shum; + uint16_t ST, SRH; + uint8_t readbuffer[6]; + uint8_t res; + uint8_t cmd[1]; + + cmd[0] = SHT40_MEAS_HIGHREP; + res = McuGenericI2C_ReadAddressWait(McuSHT40_CONFIG_I2C_ADDR, cmd, sizeof(cmd), 20, readbuffer, sizeof(readbuffer)); + if (res!=ERR_OK) { + return res; + } + ST = (readbuffer[0]<<8)|readbuffer[1]; + if (readbuffer[2] != SHT40_GenerateCRC(readbuffer, 2)) { + return ERR_CRC; + } + + SRH = (readbuffer[3]<<8)|readbuffer[4]; + if (readbuffer[5] != SHT40_GenerateCRC(readbuffer+3, 2)) { + return ERR_CRC; + } + + stemp = ST; + stemp *= 175; + stemp /= 0xffff; + stemp = -45 + stemp; + *temperature = stemp; + + shum = SRH; + shum *= 125; + shum /= 0xFFFF; + shum = -6 + shum; + if (shum>100.0f) { + shum = 100.0f; + } else if (shum<0.0f) { + shum = 0.0f; + } + *humidity = shum; + + return ERR_OK; +} + +#if MCUSHT40_CONFIG_PARSE_COMMAND_ENABLED +static uint8_t PrintStatus(const McuShell_StdIOType *io) { + uint8_t buf[32]; + uint32_t serial; + float temperature, humidity; + uint8_t res; + + McuShell_SendStatusStr((unsigned char*)"SHT40", (unsigned char*)"Sensirion SHT40 sensor status\r\n", io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), McuSHT40_CONFIG_I2C_ADDR); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" addr", buf, io->stdOut); + + res = SHT40_ReadSerialNumber(&serial); + if (res==ERR_OK) { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum32Hex(buf, sizeof(buf), serial); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ERROR\r\n"); + } + McuShell_SendStatusStr((unsigned char*)" serial", buf, io->stdOut); + + if(McuSHT40_ReadTempHum(&temperature, &humidity)==ERR_OK) { + McuUtility_NumFloatToStr(buf, sizeof(buf), temperature, 2); + McuUtility_chcat(buf, sizeof(buf), '\xB0'); /* add '°' (ASCII 0xB0) it as single char, as with UTF-8 it might end up in two bytes inside a string */ + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"C\r\n"); + McuShell_SendStatusStr((unsigned char*)" temp", buf, io->stdOut); + + McuUtility_NumFloatToStr(buf, sizeof(buf), humidity, 2); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" RH\r\n"); + McuShell_SendStatusStr((unsigned char*)" humidity", buf, io->stdOut); + } else { + McuShell_SendStatusStr((unsigned char*)" ERROR:", (unsigned char*)" *** ERROR reading sensor values\r\n", io->stdOut); + } + return ERR_OK; +} + +static uint8_t PrintHelp(const McuShell_StdIOType *io) { + McuShell_SendHelpStr((unsigned char*)"SHT40", (unsigned char*)"Group of SHT40 commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Print help or status information\r\n", io->stdOut); + return ERR_OK; +} +#endif /* MCUSHT40_CONFIG_PARSE_COMMAND_ENABLED */ + +#if MCUSHT40_CONFIG_PARSE_COMMAND_ENABLED +uint8_t McuSHT40_ParseCommand(const unsigned char* cmd, bool *handled, const McuShell_StdIOType *io) { + uint8_t res = ERR_OK; + + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP) == 0 + || McuUtility_strcmp((char*)cmd, "SHT40 help") == 0) + { + *handled = TRUE; + return PrintHelp(io); + } else if ( (McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) + || (McuUtility_strcmp((char*)cmd, "SHT40 status")==0) + ) + { + *handled = TRUE; + res = PrintStatus(io); + } + return res; +} +#endif /* SHT40_CONFIG_PARSE_COMMAND_ENABLED */ + +void McuSHT40_Init(void) { + /* noting to do */ +} + +void McuSHT40_Deinit(void) { + /* nothing to do */ +} diff --git a/TSM_PicoW_Sensor/McuLib/src/McuSHT40.h b/TSM_PicoW_Sensor/McuLib/src/McuSHT40.h new file mode 100644 index 0000000..cc3177a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuSHT40.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2019, 2022 Erich Styger + * All rights reserved. + * + * Driver for the Sensirion SHT40 Temperature/Humidity sensor + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef SOURCES_MCUSHT40_H_ +#define SOURCES_MCUSHT40_H_ + +#include "McuSHT40config.h" +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if MCUSHT40_CONFIG_PARSE_COMMAND_ENABLED + #include "McuShell.h" + +/*! + * \brief Shell command line handler + * \param cmd Pointer to the command string + * \param handled Return value to indicate if command has been recognized + * \param io I/O handler for input/output + * \return Error code, ERR_OK for no error + */ + uint8_t McuSHT40_ParseCommand(const unsigned char* cmd, bool *handled, const McuShell_StdIOType *io); +#endif + +/*! + * \brief Perform a soft reset + * \return Error code, ERR_OK for no error + */ +uint8_t McuSHT40_Reset(void); + +/*! + * \brief Read temperature and relative humidity + * \param temperature Pointer to where to store the value + * \param humidity Pointer to where to store the value + * \return Error code, ERR_OK for no error + */ +uint8_t McuSHT40_ReadTempHum(float *temperature, float *humidity); + +/*! + * \brief Module de-initialization + */ +void McuSHT40_Deinit(void); + +/*! + * \brief Module initialization + */ +void McuSHT40_Init(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* SOURCES_MCUSHT40_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuSPI.c b/TSM_PicoW_Sensor/McuLib/src/McuSPI.c new file mode 100644 index 0000000..9fd3b6e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuSPI.c @@ -0,0 +1,266 @@ +/* + * Copyright (c) 2022, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuSPI.h" +#if MCUSPI_CONFIG_HW_TEMPLATE!=MCUSPI_CONFIG_HW_TEMPLATE_NONE +#include "McuLib.h" +#include "McuLog.h" +#if McuLib_CONFIG_CPU_IS_KINETIS + #include "fsl_dspi.h" +#elif McuLib_CONFIG_CPU_IS_LPC55xx + #include "fsl_spi.h" +#elif McuLib_CONFIG_CPU_IS_RPxxxx + #include "hardware/spi.h" +#elif McuLib_CONFIG_CPU_IS_ESP32 + #include "driver/spi_master.h" +#endif +#include "McuGPIO.h" +#include /* Required for memset */ + +#if MCUSPI_CONFIG_USE_CS + static McuGPIO_Handle_t McuSPI_CSpin; +#endif +#if McuLib_CONFIG_CPU_IS_RPxxxx + static spi_inst_t *spiHandle; +#endif +#if McuLib_CONFIG_CPU_IS_ESP32 + static spi_device_handle_t handle; +#endif + +int McuSPI_SendReceiveBlock(const uint8_t *txDataBuf, uint8_t *rxDataBuf, size_t dataSize) { +#if (MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_KINETIS_K22_SPI0) || (MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_KINETIS_K22_SPI1) + dspi_transfer_t masterXfer; + status_t status; + + /* Start master transfer, send data to slave */ + masterXfer.txData = (uint8_t*)txDataBuf; + masterXfer.rxData = rxDataBuf; + masterXfer.dataSize = dataSize; + masterXfer.configFlags = kDSPI_MasterCtar0 | MCUSPI_CONFIG_HW_SPI_MASTER_PCS_FOR_TRANSFER | kDSPI_MasterPcsContinuous; + status = DSPI_MasterTransferBlocking(MCUSPI_CONFIG_HW_SPI_MASTER, &masterXfer); + if (status==kStatus_Success) { + return 0; /* ok */ + } + return -1; /* error */ +#elif MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_LPC55S16_FC3 + status_t status; + spi_transfer_t xfer; + + /*Start Transfer*/ + xfer.txData = (uint8_t*)txDataBuf;; + xfer.rxData = rxDataBuf; + xfer.dataSize = dataSize; + xfer.configFlags = kSPI_FrameAssert; + status = SPI_MasterTransferBlocking(MCUSPI_CONFIG_HW_SPI_MASTER, &xfer); + if (status==kStatus_Success) { + return 0; /* ok */ + } + return -1; /* error */ +#elif (MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_RP2040_SPI0) || (MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_RP2040_SPI1) + int res; + + res = spi_write_read_blocking(spiHandle, txDataBuf, rxDataBuf, dataSize); + if (res==dataSize) { /* res is number of bytes written/read */ + return 0; /* ok */ + } + return -1; /* failed */ +#elif MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_ESP32_SPI3 + esp_err_t ret; + spi_transaction_t t; + memset(&t, 0, sizeof(t)); + + t.length = dataSize*8; /* number of bits */ + t.tx_buffer = txDataBuf; + t.rx_buffer = rxDataBuf; + ret = spi_device_transmit(handle, &t); + if (ret==ESP_OK) { + return 0; /* ok */ + } + return -1; /* failed */ +#else + #error "not implemented?" + return -1; /* error */ +#endif +} + +int McuSPI_SendByte(unsigned char ch) { + return McuSPI_SendReceiveBlock(&ch, NULL, sizeof(ch)); +} + +int McuSPI_SendReceiveByte(unsigned char ch, unsigned char *chp) { + return McuSPI_SendReceiveBlock(&ch, chp, sizeof(ch)); +} + +int McuSPI_ReceiveByte(unsigned char *chp) { + return McuSPI_SendReceiveBlock(NULL, chp, sizeof(char)); +} + +int McuSPI_SetBaudRate(uint32_t baud) { +#if (MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_KINETIS_K22_SPI0) || (MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_KINETIS_K22_SPI1) + uint32_t bestBaud; + + bestBaud = DSPI_MasterSetBaudRate(MCUSPI_CONFIG_HW_SPI_MASTER, kDSPI_Ctar0, baud, MCUSPI_CONFIG_HW_SPI_MASTER_CLK_FREQ); + return bestBaud!=0; +#elif MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_ESP32_SPI3 + return -1; /* error */ +#else + return ERR_FAILED; +#endif +} + +#if 0 /* for testing only */ +static void McuSPI_Test(void) { + uint8_t tx = 'A'; + uint8_t rx; + int res; + +#if MCUSPI_CONFIG_USE_CS + /* testing CS toggling */ + McuGPIO_SetLow(McuSPI_CSpin); + McuGPIO_SetHigh(McuSPI_CSpin); +#endif + /* testing a transfer */ + res = McuSPI_SendReceiveBlock(&tx, &rx, sizeof(tx)); + if (res!=0) { + for(;;) { /* error */ } + } +} +#endif + +#if MCUSPI_CONFIG_USE_CS +void McuSPI_SetCS_Low(void) { + McuGPIO_SetLow(McuSPI_CSpin); +} +#endif + +#if MCUSPI_CONFIG_USE_CS +void McuSPI_SetCS_High(void) { + McuGPIO_SetHigh(McuSPI_CSpin); +} +#endif + +#if MCUSPI_CONFIG_USE_CS +static void McuSPI_InitCS(void) { + McuGPIO_Config_t config; + + MCUSPI_CONFIG_HW_CS_INIT(); + McuGPIO_GetDefaultConfig(&config); +#if !McuLib_CONFIG_CPU_IS_RPxxxx /* Raspberry Pi Pico only has pin number */ + config.hw.gpio = MCUSPI_CONFIG_HW_CS_GPIO; + config.hw.port = MCUSPI_CONFIG_HW_CS_PORT; +#endif + config.hw.pin = MCUSPI_CONFIG_HW_CS_PIN; + config.isInput = false; + config.isHighOnInit = true; /* CS is LOW active */ + + McuSPI_CSpin = McuGPIO_InitGPIO(&config); + if (McuSPI_CSpin==NULL) { + McuLog_fatal("failed initializing SPI CS pin"); + for(;;) {} /* error */ + } +} +#endif /* MCUSPI_CONFIG_USE_CS */ + +void McuSPI_Init(void) { +#if MCUSPI_CONFIG_USE_CS + McuSPI_InitCS(); +#endif +#if (MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_KINETIS_K22_SPI0) || (MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_KINETIS_K22_SPI1) + dspi_master_config_t masterConfig; + uint32_t srcClock_Hz; + + /* Master config */ + masterConfig.whichCtar = kDSPI_Ctar0; + masterConfig.ctarConfig.baudRate = MCUSPI_CONFIG_TRANSFER_BAUDRATE; + masterConfig.ctarConfig.bitsPerFrame = 8U; + masterConfig.ctarConfig.cpol = kDSPI_ClockPolarityActiveHigh; + masterConfig.ctarConfig.cpha = kDSPI_ClockPhaseFirstEdge; + masterConfig.ctarConfig.direction = kDSPI_MsbFirst; + masterConfig.ctarConfig.pcsToSckDelayInNanoSec = 1000000000U / MCUSPI_CONFIG_TRANSFER_BAUDRATE; + masterConfig.ctarConfig.lastSckToPcsDelayInNanoSec = 1000000000U / MCUSPI_CONFIG_TRANSFER_BAUDRATE; + masterConfig.ctarConfig.betweenTransferDelayInNanoSec = 1000000000U / MCUSPI_CONFIG_TRANSFER_BAUDRATE; + + masterConfig.whichPcs = MCUSPI_CONFIG_HW_SPI_MASTER_PCS_FOR_INIT; + masterConfig.pcsActiveHighOrLow = kDSPI_PcsActiveLow; + + masterConfig.enableContinuousSCK = false; + masterConfig.enableRxFifoOverWrite = false; + masterConfig.enableModifiedTimingFormat = false; + masterConfig.samplePoint = kDSPI_SckToSin0Clock; + + srcClock_Hz = MCUSPI_CONFIG_HW_SPI_MASTER_CLK_FREQ; + DSPI_MasterInit(MCUSPI_CONFIG_HW_SPI_MASTER, &masterConfig, srcClock_Hz); +#elif MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_LPC55S16_FC3 + spi_master_config_t userConfig = {0}; + uint32_t srcFreq = 0; + status_t status; + + MCUSPI_CONFIG_HW_SPI_INIT(); + SPI_MasterGetDefaultConfig(&userConfig); + srcFreq = MCUSPI_CONFIG_HW_SPI_MASTER_CLK_FREQ; + userConfig.sselNum = (spi_ssel_t)MCUSPI_CONFIG_HW_SPI_SSEL; + userConfig.sselPol = (spi_spol_t)MCUSPI_CONFIG_HW_SPI_SPOL; + userConfig.baudRate_Bps = MCUSPI_CONFIG_TRANSFER_BAUDRATE; + status = SPI_MasterInit(MCUSPI_CONFIG_HW_SPI_MASTER, &userConfig, srcFreq); + if (status!=kStatus_Success) { + for(;;) { /* error */ } + } +#elif (MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_RP2040_SPI0) || (MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_RP2040_SPI1) + #if MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_RP2040_SPI0 + spiHandle = spi0; + #elif MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_RP2040_SPI1 + spiHandle = spi1; + #endif + spi_init(spiHandle, MCUSPI_CONFIG_TRANSFER_BAUDRATE); + gpio_set_function(MCUSPI_CONFIG_HW_MISO_PIN, GPIO_FUNC_SPI); + gpio_set_function(MCUSPI_CONFIG_HW_MOSI_PIN, GPIO_FUNC_SPI); + gpio_set_function(MCUSPI_CONFIG_HW_SCLK_PIN, GPIO_FUNC_SPI); +#elif MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_ESP32_SPI3 + esp_err_t ret; + + /* Configuration for the SPI bus */ + spi_bus_config_t buscfg = { + .mosi_io_num=MCUSPI_CONFIG_HW_MOSI_PIN, + .miso_io_num=MCUSPI_CONFIG_HW_MISO_PIN, + .sclk_io_num=MCUSPI_CONFIG_HW_SCLK_PIN, + .quadwp_io_num=-1, + .quadhd_io_num=-1 + }; + spi_device_interface_config_t devcfg = { + .command_bits=0, + .address_bits=0, + .dummy_bits=0, + .clock_speed_hz=MCUSPI_CONFIG_TRANSFER_BAUDRATE, + .duty_cycle_pos=128, /* 50% duty cycle */ + .mode=0, +#if MCUSPI_CONFIG_HW_CS_INIT + .spics_io_num=MCUSPI_CONFIG_HW_CS_PIN, +#else + .spics_io_num=GPIO_NUM_NC, /* not using CS pin, setting it to 'not connected' */ +#endif + .cs_ena_posttrans=3, /* Keep the CS low 3 cycles after transaction, to stop slave from missing the last bit when CS has less propagation delay than CLK */ + .queue_size=3 + }; + + /* Initialize the SPI bus and add the device we want to send stuff to */ + ret = spi_bus_initialize(SPI3_HOST, &buscfg, SPI_DMA_CH_AUTO); + if (ret!=ESP_OK) { + McuLog_fatal("failed initialize SPI bus"); + } + + ret = spi_bus_add_device(SPI3_HOST, &devcfg, &handle); + if (ret!=ESP_OK) { + McuLog_fatal("failed initialize SPI bus"); + } +#else + #error "SPI target not supported" +#endif +#if 0 /* for testing only */ + McuSPI_Test(); +#endif +} + +#endif /* #if MCUSPI_CONFIG_HW_TEMPLATE */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuSPI.h b/TSM_PicoW_Sensor/McuLib/src/McuSPI.h new file mode 100644 index 0000000..9c9d007 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuSPI.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2022, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MCUSPI_H_ +#define MCUSPI_H_ + +#include "McuSPIconfig.h" +#include +#include + +void McuSPI_SetCS_Low(void); + +void McuSPI_SetCS_High(void); + +int McuSPI_SendReceiveBlock(const uint8_t *txDataBuf, uint8_t *rxDataBuf, size_t dataSize); + +int McuSPI_SendByte(unsigned char ch); + +int McuSPI_SendReceiveByte(unsigned char ch, unsigned char *chp); + +int McuSPI_ReceiveByte(unsigned char *chp); + +int McuSPI_SetBaudRate(uint32_t baud); + +void McuSPI_Init(void); + +#endif /* MCUSPI_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuSSD1306.c b/TSM_PicoW_Sensor/McuLib/src/McuSSD1306.c new file mode 100644 index 0000000..054437c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuSSD1306.c @@ -0,0 +1,1054 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuSSD1306.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SSD1306 +** Version : Component 01.051, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 16:23, # CodeGen: 844 +** Abstract : +** Display driver for the SSD1306 OLED module +** Settings : +** Component name : McuSSD1306 +** Type : 128x64 +** Driver : SSD1306 +** Orientation : landscape +** Width : 128 +** Height : 64 +** Bytes in rows : no +** Bytes in x direction : yes +** MSB first : no +** Bits per pixel : 1 +** Window capability : no +** Display Memory Write : no +** Display Memory Read : no +** Use RAM Buffer : yes +** Clear display in init : no +** Initialize on Init : yes +** Init Delay (ms) : 100 +** HW : +** I2C Device Address : 0x3C +** I2C Transaction Delay (us) : 0 +** Bock Transfer : yes +** I2C : McuGenericI2C +** Reset : Disabled +** System : +** Wait : McuWait +** SDK : McuLib +** Contents : +** GetWidth - McuSSD1306_PixelDim McuSSD1306_GetWidth(void); +** GetHeight - McuSSD1306_PixelDim McuSSD1306_GetHeight(void); +** GetLongerSide - McuSSD1306_PixelDim McuSSD1306_GetLongerSide(void); +** GetShorterSide - McuSSD1306_PixelDim McuSSD1306_GetShorterSide(void); +** SetDisplayOrientation - void McuSSD1306_SetDisplayOrientation(McuSSD1306_DisplayOrientation... +** GetDisplayOrientation - McuSSD1306_DisplayOrientation McuSSD1306_GetDisplayOrientation(void); +** ClearBuffer - void McuSSD1306_ClearBuffer(McuSSD1306_PixelColor color); +** PutPixel - void McuSSD1306_PutPixel(McuSSD1306_PixelDim x, McuSSD1306_PixelDim y,... +** Clear - void McuSSD1306_Clear(void); +** UpdateFull - void McuSSD1306_UpdateFull(void); +** UpdateRegion - void McuSSD1306_UpdateRegion(McuSSD1306_PixelDim x, McuSSD1306_PixelDim y,... +** InitCommChannel - void McuSSD1306_InitCommChannel(void); +** SetContrast - uint8_t McuSSD1306_SetContrast(uint8_t contrast); +** SetDisplayClockDiv - uint8_t McuSSD1306_SetDisplayClockDiv(uint8_t clockDiv); +** DisplayOn - uint8_t McuSSD1306_DisplayOn(bool on); +** DisplayInvert - uint8_t McuSSD1306_DisplayInvert(bool invert); +** GetLCD - void McuSSD1306_GetLCD(void); +** GiveLCD - void McuSSD1306_GiveLCD(void); +** SetRowCol - uint8_t McuSSD1306_SetRowCol(uint8_t row, uint8_t col); +** PrintString - void McuSSD1306_PrintString(uint8_t line, uint8_t col, uint8_t *str); +** ClearLine - void McuSSD1306_ClearLine(uint8_t line); +** Deinit - void McuSSD1306_Deinit(void); +** Init - void McuSSD1306_Init(void); +** +** * Copyright (c) 2017-2022, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuSSD1306.h +** @version 01.00 +** @brief +** Display driver for the SSD1306 OLED module +*/ +/*! +** @addtogroup McuSSD1306_module McuSSD1306 module documentation +** @{ +*/ + +/* MODULE McuSSD1306. */ + +#include "McuSSD1306.h" +#include "McuWait.h" /* Waiting routines */ +#include /* for memset() */ +#include McuSSD1306_CONFIG_I2C_HEADER_FILE /* I2C driver */ + +uint8_t McuSSD1306_DisplayBuf[((McuSSD1306_DISPLAY_HW_NOF_ROWS-1)/8)+1][McuSSD1306_DISPLAY_HW_NOF_COLUMNS]; /* buffer for the display */ + +#if McuSSD1306_CONFIG_DYNAMIC_DISPLAY_ORIENTATION + static McuSSD1306_DisplayOrientation currentOrientation; +#endif + +/** tiny 5x8 font. */ +static unsigned char font[] = { + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* [0x20] ' ' */ + 0x0, 0x0, 0x2F, 0x0, 0x0, 0x0, /* [0x21] '!' */ + 0x0, 0x3, 0x0, 0x3, 0x0, 0x0, /* [0x22] '"' */ + 0x14, 0x3E, 0x14, 0x3E, 0x14, 0x0, /* [0x23] '#' */ + 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x0, /* [0x24] '$' */ + 0x22, 0x10, 0x8, 0x4, 0x22, 0x0, /* [0x25] '%' */ + 0x18, 0x24, 0x24, 0x1E, 0x4, 0x0, /* [0x26] '&' */ + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, /* [0x27] ''' */ + 0x0, 0x1C, 0x22, 0x41, 0x0, 0x0, /* [0x28] '(' */ + 0x0, 0x41, 0x22, 0x1C, 0x0, 0x0, /* [0x29] ')' */ + 0x2A, 0x1C, 0x3E, 0x1C, 0x2A, 0x0, /* [0x2A] '*' */ + 0x8, 0x8, 0x3E, 0x8, 0x8, 0x0, /* [0x2B] '+' */ + 0x0, 0x40, 0x20, 0x0, 0x0, 0x0, /* [0x2C] ',' */ + 0x8, 0x8, 0x8, 0x8, 0x8, 0x0, /* [0x2D] '-' */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, /* [0x2E] '.' */ + 0x0, 0xC0, 0x30, 0xC, 0x3, 0x0, /* [0x2F] '/' */ + 0x1E, 0x29, 0x2D, 0x25, 0x1E, 0x0, /* [0x30] '0' */ + 0x0, 0x22, 0x3F, 0x20, 0x0, 0x0, /* [0x31] '1' */ + 0x32, 0x29, 0x29, 0x29, 0x26, 0x0, /* [0x32] '2' */ + 0x12, 0x21, 0x29, 0x29, 0x16, 0x0, /* [0x33] '3' */ + 0x7, 0x8, 0x8, 0x8, 0x3E, 0x0, /* [0x34] '4' */ + 0x17, 0x25, 0x25, 0x25, 0x18, 0x0, /* [0x35] '5' */ + 0x1E, 0x25, 0x25, 0x25, 0x18, 0x0, /* [0x36] '6' */ + 0x1, 0x1, 0x9, 0x9, 0x3E, 0x0, /* [0x37] '7' */ + 0x1A, 0x25, 0x25, 0x25, 0x1A, 0x0, /* [0x38] '8' */ + 0x6, 0x9, 0x9, 0x9, 0x3E, 0x0, /* [0x39] '9' */ + 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, /* [0x3A] ':' */ + 0x0, 0x40, 0x22, 0x0, 0x0, 0x0, /* [0x3B] ';' */ + 0x0, 0x8, 0x14, 0x22, 0x41, 0x0, /* [0x3C] '<' */ + 0x14, 0x14, 0x14, 0x14, 0x14, 0x0, /* [0x3D] '=' */ + 0x0, 0x41, 0x22, 0x14, 0x8, 0x0, /* [0x3E] '>' */ + 0x2, 0x1, 0x29, 0x9, 0x6, 0x0, /* [0x3F] '?' */ + 0x1E, 0x21, 0x2D, 0x2D, 0x6, 0x0, /* [0x40] '@' */ + 0x3E, 0x11, 0x11, 0x11, 0x3E, 0x0, /* [0x41] 'A' */ + 0x3E, 0x25, 0x25, 0x25, 0x1A, 0x0, /* [0x42] 'B' */ + 0x1E, 0x21, 0x21, 0x21, 0x12, 0x0, /* [0x43] 'C' */ + 0x3E, 0x21, 0x21, 0x22, 0x1C, 0x0, /* [0x44] 'D' */ + 0x3F, 0x29, 0x29, 0x21, 0x21, 0x0, /* [0x45] 'E' */ + 0x3F, 0x9, 0x9, 0x1, 0x1, 0x0, /* [0x46] 'F' */ + 0x1E, 0x21, 0x29, 0x29, 0x1A, 0x0, /* [0x47] 'G' */ + 0x3F, 0x8, 0x8, 0x8, 0x3F, 0x0, /* [0x48] 'H' */ + 0x0, 0x21, 0x3F, 0x21, 0x0, 0x0, /* [0x49] 'I' */ + 0x10, 0x20, 0x21, 0x21, 0x1F, 0x0, /* [0x4A] 'J' */ + 0x3F, 0x8, 0xC, 0x12, 0x21, 0x0, /* [0x4B] 'K' */ + 0x1F, 0x20, 0x20, 0x20, 0x20, 0x0, /* [0x4C] 'L' */ + 0x3E, 0x1, 0x6, 0x1, 0x3E, 0x0, /* [0x4D] 'M' */ + 0x3E, 0x1, 0x1, 0x2, 0x3C, 0x0, /* [0x4E] 'N' */ + 0x1E, 0x21, 0x21, 0x21, 0x1E, 0x0, /* [0x4F] 'O' */ + 0x3E, 0x11, 0x11, 0x11, 0xE, 0x0, /* [0x50] 'P' */ + 0x1E, 0x21, 0x29, 0x71, 0x5E, 0x0, /* [0x51] 'Q' */ + 0x3E, 0x9, 0x9, 0x9, 0x36, 0x0, /* [0x52] 'R' */ + 0x12, 0x25, 0x25, 0x25, 0x18, 0x0, /* [0x53] 'S' */ + 0x1, 0x1, 0x3F, 0x1, 0x1, 0x0, /* [0x54] 'T' */ + 0x1F, 0x20, 0x20, 0x20, 0x1F, 0x0, /* [0x55] 'U' */ + 0xF, 0x10, 0x20, 0x10, 0xF, 0x0, /* [0x56] 'V' */ + 0x1F, 0x20, 0x18, 0x20, 0x1F, 0x0, /* [0x57] 'W' */ + 0x31, 0xA, 0x4, 0xA, 0x31, 0x0, /* [0x58] 'X' */ + 0x7, 0x28, 0x28, 0x28, 0x1F, 0x0, /* [0x59] 'Y' */ + 0x31, 0x29, 0x25, 0x23, 0x21, 0x0, /* [0x5A] 'Z' */ + 0x0, 0x7F, 0x41, 0x41, 0x0, 0x0, /* [0x5B] '[' */ + 0x0, 0x3, 0xC, 0x30, 0xC0, 0x0, /* [0x5C] '\\' */ + 0x0, 0x41, 0x41, 0x7F, 0x0, 0x0, /* [0x5D] ']' */ + 0x0, 0x2, 0x1, 0x2, 0x0, 0x0, /* [0x5E] '^' */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x0, /* [0x5F] '_' */ + 0x1, 0x2, 0x0, 0x0, 0x0, 0x0, /* [0x60] '`' */ + 0x1C, 0x22, 0x22, 0x22, 0x3C, 0x0, /* [0x61] 'a' */ + 0x1F, 0x22, 0x22, 0x22, 0x1C, 0x0, /* [0x62] 'b' */ + 0x1C, 0x22, 0x22, 0x22, 0x20, 0x0, /* [0x63] 'c' */ + 0x1C, 0x22, 0x22, 0x22, 0x1F, 0x0, /* [0x64] 'd' */ + 0x1C, 0x2A, 0x2A, 0x2A, 0x4, 0x0, /* [0x65] 'e' */ + 0x8, 0x7E, 0x9, 0x1, 0x1, 0x0, /* [0x66] 'f' */ + 0xC, 0x52, 0x52, 0x52, 0x3C, 0x0, /* [0x67] 'g' */ + 0x3F, 0x2, 0x2, 0x2, 0x3C, 0x0, /* [0x68] 'h' */ + 0x0, 0x0, 0x3D, 0x0, 0x0, 0x0, /* [0x69] 'i' */ + 0x20, 0x40, 0x40, 0x40, 0x3D, 0x0, /* [0x6A] 'j' */ + 0x3F, 0x8, 0x8, 0x14, 0x22, 0x0, /* [0x6B] 'k' */ + 0x0, 0x1F, 0x20, 0x20, 0x0, 0x0, /* [0x6C] 'l' */ + 0x3C, 0x2, 0x4, 0x2, 0x3C, 0x0, /* [0x6D] 'm' */ + 0x3C, 0x2, 0x2, 0x2, 0x3C, 0x0, /* [0x6E] 'n' */ + 0x1C, 0x22, 0x22, 0x22, 0x1C, 0x0, /* [0x6F] 'o' */ + 0x7C, 0x12, 0x12, 0x12, 0xC, 0x0, /* [0x70] 'p' */ + 0xC, 0x12, 0x12, 0x12, 0x7E, 0x0, /* [0x71] 'q' */ + 0x3C, 0x2, 0x2, 0x2, 0x4, 0x0, /* [0x72] 'r' */ + 0x24, 0x2A, 0x2A, 0x2A, 0x10, 0x0, /* [0x73] 's' */ + 0x1F, 0x22, 0x22, 0x20, 0x10, 0x0, /* [0x74] 't' */ + 0x1E, 0x20, 0x20, 0x20, 0x1E, 0x0, /* [0x75] 'u' */ + 0xE, 0x10, 0x20, 0x10, 0xE, 0x0, /* [0x76] 'v' */ + 0x1E, 0x20, 0x10, 0x20, 0x1E, 0x0, /* [0x77] 'w' */ + 0x22, 0x14, 0x8, 0x14, 0x22, 0x0, /* [0x78] 'x' */ + 0xE, 0x50, 0x50, 0x50, 0x3E, 0x0, /* [0x79] 'y' */ + 0x22, 0x32, 0x2A, 0x26, 0x22, 0x0, /* [0x7A] 'z' */ + 0x0, 0x8, 0x36, 0x41, 0x0, 0x0, /* [0x7B] '{' */ + 0x0, 0x0, 0x7F, 0x0, 0x0, 0x0, /* [0x7C] '|' */ + 0x0, 0x41, 0x36, 0x8, 0x0, 0x0, /* [0x7D] '}' */ + 0x0, 0x2, 0x1, 0x2, 0x1, 0x0, /* [0x7E] '~' */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* [0x7F] '' */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* [0x80] '' */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* [0x81] '' */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* [0x82] '' */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* [0x83] '' */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* [0x84] '' */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* [0x85] '' */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* [0x86] '' */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* [0x87] '' */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* [0x88] '' */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* [0x89] '' */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* [0x8A] '' */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* [0x8B] '' */ +}; + +#define SSD1306_CMD_REG 0x00 +#define SSD1306_DATA_REG 0x40 + +#define SSD1306_SET_CONTRAST 0x81 +#define SSD1306_DISPLAY_ALL_ON_RESUME 0xA4 +#define SSD1306_DISPLAY_ALL_ON 0xA5 +#define SSD1306_NORMAL_DISPLAY 0xA6 +#define SSD1306_INVERT_DISPLAY 0xA7 +#define SSD1306_DISPLAY_OFF 0xAE +#define SSD1306_DISPLAY_ON 0xAF + +#define SSD1306_SET_DISPLAY_OFFSET 0xD3 +#define SSD1306_SET_COM_PINS 0xDA + +#define SSD1306_SET_VCOM_DETECT 0xDB + +#define SSD1306_SET_DISPLAY_CLOCK_DIV 0xD5 +#define SSD1306_SET_PRECHARGE 0xD9 + +#define SSD1306_SET_MULTIPLEX 0xA8 + +#define SSD1306_SET_LOW_COLUMN 0x00 +#define SSD1306_SET_HIGH_COLUMN 0x10 + +#define SSD1306_SET_START_LINE 0x40 + +#define SSD1306_MEMORY_MODE 0x20 +#define SSD1306_COLUMN_ADDR 0x21 +#define SSD1306_PAGE_ADDR 0x22 + +#define SSD1306_COM_SCAN_INC 0xC0 +#define SSD1306_COM_SCAN_DEC 0xC8 + +#define SSD1306_SEG_REMAP 0xA0 + +#define SSD1306_CHARGE_PUMP 0x8D + +#define SSD1306_EXTERNAL_VCC 0x1 +#define SSD1306_SWITCH_CAP_VCC 0x2 + +/* Scrolling #defines */ +#define SSD1306_ACTIVATE_SCROLL 0x2F +#define SSD1306_DEACTIVATE_SCROLL 0x2E +#define SSD1306_SET_VERTICAL_SCROLL_AREA 0xA3 +#define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26 +#define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27 +#define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29 +#define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A + +static void SSD1306_WriteCommand(uint8_t cmd) { + McuGenericI2C_WriteByteAddress8(McuSSD1306_CONFIG_SSD1306_I2C_ADDR, SSD1306_CMD_REG, cmd); +#if McuSSD1306_CONFIG_SSD1306_I2C_DELAY_US>0 + McuWait_Waitus(McuSSD1306_CONFIG_SSD1306_I2C_DELAY_US); +#endif +} + +static void SSD1306_WriteData(uint8_t data) { + McuGenericI2C_WriteByteAddress8(McuSSD1306_CONFIG_SSD1306_I2C_ADDR, SSD1306_DATA_REG, data); +#if McuSSD1306_CONFIG_SSD1306_I2C_DELAY_US>0 + McuWait_Waitus(McuSSD1306_CONFIG_SSD1306_I2C_DELAY_US); +#endif +} + +static void SSD1306_WriteDataBlock(uint8_t *data, size_t size) { +#if McuSSD1306_CONFIG_USE_I2C_BLOCK_TRANSFER + #define SSD1306_I2C_BLOCK_SIZE McuGenericI2C_WRITE_BUFFER_SIZE + uint8_t memAddr = SSD1306_DATA_REG; + uint16_t txSize; + + while(size>0) { + if (size>SSD1306_I2C_BLOCK_SIZE-1) { + txSize = SSD1306_I2C_BLOCK_SIZE-1; /* -1 because of memAddr */ + } else { + txSize = size; + } + McuGenericI2C_WriteAddress(McuSSD1306_CONFIG_SSD1306_I2C_ADDR, &memAddr, sizeof(memAddr), data, txSize); + data += txSize; + size -= txSize; + } +#if McuSSD1306_CONFIG_SSD1306_I2C_DELAY_US>0 + McuWait_Waitus(McuSSD1306_CONFIG_SSD1306_I2C_DELAY_US); +#endif +#else /* byte transfer only, in case there are issues with display */ + while (size>0) { + SSD1306_WriteData(*data); + data++; + size--; + } +#endif +} + +static uint8_t actCol = 0; +static uint8_t actPage = 0; + +static uint8_t SSD1306_SetPageStartAddr(uint8_t page) { + actPage = page; + if(actPage>=McuSSD1306_DISPLAY_HW_NOF_PAGES) { + return ERR_RANGE; + } + SSD1306_WriteCommand(0xB0 | actPage); + return ERR_OK; +} + +static uint8_t SSD1306_SetColStartAddr(uint8_t col){ + actCol = col; + if(actCol>=McuSSD1306_DISPLAY_HW_NOF_COLUMNS) { + return ERR_RANGE; + } + SSD1306_WriteCommand(0x10 | ((actCol+McuSSD1306_CONFIG_SSD1306_START_COLUMN_OFFSET)>>4)); + SSD1306_WriteCommand((actCol+McuSSD1306_CONFIG_SSD1306_START_COLUMN_OFFSET) & 0x0F); + return ERR_OK; +} + +static void SSD1306_PrintChar(uint8_t ch) { + uint8_t i; + + for(i = 0; i<5; i++) { + SSD1306_WriteData(font[((ch-0x20)*6)+i]); + } +} +/* +** =================================================================== +** Method : McuSSD1306_ReadDataWord (component SSD1306) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +uint16_t McuSSD1306_ReadDataWord(void) +{ + /* sorry, with the serial interface it is NOT possible to read from display memory */ + return 0; +} + +/* +** =================================================================== +** Method : McuSSD1306_WriteData (component SSD1306) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +void McuSSD1306_WriteData(uint8_t data) +{ + SSD1306_WriteData(data); +} + +/* +** =================================================================== +** Method : McuSSD1306_OpenWindow (component SSD1306) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +void McuSSD1306_OpenWindow(McuSSD1306_PixelDim x0, McuSSD1306_PixelDim y0, McuSSD1306_PixelDim x1, McuSSD1306_PixelDim y1) +{ + /* no windowing capabilities */ + (void)x0; /* parameter not used */ + (void)y0; /* parameter not used */ + (void)x1; /* parameter not used */ + (void)y1; /* parameter not used */ +} + +/* +** =================================================================== +** Method : McuSSD1306_CloseWindow (component SSD1306) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +void McuSSD1306_CloseWindow(void) +{ + /* no windowing capabilities */ +} + +/* +** =================================================================== +** Method : Clear (component SSD1306) +** +** Description : +** Clears the whole display memory. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuSSD1306_Clear(void) +{ + unsigned int i; + uint8_t *p = &McuSSD1306_DisplayBuf[0][0]; + + for(i=0; i=d_width) { + x = d_width-1; + } + if (y>=d_height) { + y = d_height-1; + } + if (x+w>=d_width) { + w = d_width-x; + } + if (y+h>=d_height) { + h = d_height-y; + } + pageBeg = (y/8); + pageEnd = (y+h-1)/8; + colStart = x; + for(page = pageBeg; page<=pageEnd; page++) { + (void)SSD1306_SetPageStartAddr(page); + (void)SSD1306_SetColStartAddr(colStart); + SSD1306_WriteDataBlock(&McuSSD1306_DisplayBuf[0][0]+(page*McuSSD1306_DISPLAY_HW_NOF_COLUMNS+colStart), w); + } +} + +/* +** =================================================================== +** Method : UpdateFull (component SSD1306) +** +** Description : +** Updates the whole display from the microcontroller RAM +** display buffer. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuSSD1306_UpdateFull(void) +{ +#if McuSSD1306_CONFIG_SSD1306_DRIVER_TYPE==1306 /* SSD1306 */ + (void)SSD1306_SetPageStartAddr(0); + (void)SSD1306_SetColStartAddr(0); + SSD1306_WriteDataBlock(&McuSSD1306_DisplayBuf[0][0], sizeof(McuSSD1306_DisplayBuf)); +#elif McuSSD1306_CONFIG_SSD1306_DRIVER_TYPE==1106 /* SH1106 */ + /* the SSH1306 has a 132x64 memory organization (compared to the 128x64 of the SSD1306) */ + unsigned int page; + + for(page=0; page= McuSSD1306_DISPLAY_HW_NOF_PAGES) { + actPage=0; + } + SSD1306_SetPageStartAddr(actPage); + SSD1306_SetColStartAddr(0); + str++; + } else { + SSD1306_PrintChar(*str); + str++; + } + } +} + +/* +** =================================================================== +** Method : ClearLine (component SSD1306) +** +** Description : +** Clear a text line on the display +** Parameters : +** NAME - DESCRIPTION +** line - Line number, starting with zero +** Returns : Nothing +** =================================================================== +*/ +void McuSSD1306_ClearLine(uint8_t line) +{ + uint8_t i; + + if (McuSSD1306_SetRowCol(line, 0)!=ERR_OK) { + return; /* error! */ + } + for(i=0; i0 + McuWait_Waitms(McuSSD1306_CONFIG_INIT_DELAY_MS); /* give hardware time to power up*/ +#endif +#if McuSSD1306_CONFIG_SSD1306_HAS_RST + McuSSD1306_CONFIG_SSD1306_RESET_LOW(); + McuWait_Waitms(1); /* wait for 1 ms */ + McuSSD1306_CONFIG_SSD1306_RESET_HIGH(); +#endif + SSD1306_WriteCommand(SSD1306_DISPLAY_OFF); /* turn off display */ + SSD1306_WriteCommand(SSD1306_SET_DISPLAY_CLOCK_DIV); /* set display clock divide ratio/oscillator frequency */ + SSD1306_WriteCommand(0x80); /* the suggested ratio 0x80 */ + + SSD1306_WriteCommand(SSD1306_SET_MULTIPLEX); /* set multiplex ratio(1 to 64) */ + SSD1306_WriteCommand(McuSSD1306_DISPLAY_HW_NOF_ROWS-1); /* multiplex depending on number of rows */ + + SSD1306_WriteCommand(SSD1306_SET_DISPLAY_OFFSET); /* set display offset */ + SSD1306_WriteCommand(0x00); /* no offset */ + SSD1306_WriteCommand(SSD1306_SET_START_LINE | 0x00); /* set start line address */ + + SSD1306_WriteCommand(SSD1306_COLUMN_ADDR); /* set start and end address of the columns */ + SSD1306_WriteCommand(0); + SSD1306_WriteCommand(McuSSD1306_DISPLAY_HW_NOF_COLUMNS-1); + + SSD1306_WriteCommand(SSD1306_PAGE_ADDR); /* set start and end address of the pages */ + SSD1306_WriteCommand(0); + SSD1306_WriteCommand(McuSSD1306_DISPLAY_HW_NOF_PAGES-1); + + SSD1306_WriteCommand(SSD1306_CHARGE_PUMP); /* set charge pump enable/disable */ +#if McuSSD1306_CONFIG_SSD1306_EXTERNAL == 1 + SSD1306_WriteCommand(0x10); /* set to disabled */ +#else + SSD1306_WriteCommand(0x14); /* set to enabled */ +#endif +#if McuSSD1306_CONFIG_SSD1306_SIZE_TYPE==12832 + SSD1306_WriteCommand(SSD1306_SET_COM_PINS); /* set COM pins hardware configuration */ + SSD1306_WriteCommand(0x02); + SSD1306_WriteCommand(SSD1306_SET_CONTRAST); /* set contrast control register */ + SSD1306_WriteCommand(0x8F); +#elif McuSSD1306_CONFIG_SSD1306_SIZE_TYPE==12864 + SSD1306_WriteCommand(SSD1306_SET_COM_PINS); /* set COM pins hardware configuration */ + SSD1306_WriteCommand(0x12); + SSD1306_WriteCommand(SSD1306_SET_CONTRAST); /* set contrast control register */ + #if McuSSD1306_CONFIG_SSD1306_EXTERNAL == 1 + SSD1306_WriteCommand(0x9F); + #else + SSD1306_WriteCommand(0xCF); + #endif +#else + #error "unknown display type" +#endif + + SSD1306_WriteCommand(SSD1306_SET_PRECHARGE); /* set pre-charge period */ +#if McuSSD1306_CONFIG_SSD1306_EXTERNAL == 1 + SSD1306_WriteCommand(0x22); +#else + SSD1306_WriteCommand(0xF1); +#endif + SSD1306_WriteCommand(SSD1306_SET_VCOM_DETECT); /* set vcomh */ + SSD1306_WriteCommand(0x40); + + SSD1306_WriteCommand(SSD1306_DISPLAY_ALL_ON_RESUME); /* disable entire display on */ + SSD1306_WriteCommand(SSD1306_NORMAL_DISPLAY); /* set normal display */ + SSD1306_WriteCommand(SSD1306_DEACTIVATE_SCROLL); /* Deactivate scrolling */ + SSD1306_WriteCommand(SSD1306_DISPLAY_ON); /* turn on oled panel */ + +#if McuSSD1306_CONFIG_FIXED_DISPLAY_ORIENTATION==McuSSD1306_CONFIG_ORIENTATION_PORTRAIT + McuSSD1306_SetDisplayOrientation(McuSSD1306_ORIENTATION_PORTRAIT); /* Portrait mode */ +#elif McuSSD1306_CONFIG_FIXED_DISPLAY_ORIENTATION==McuSSD1306_CONFIG_ORIENTATION_PORTRAIT180 + McuSSD1306_SetDisplayOrientation(McuSSD1306_ORIENTATION_PORTRAIT180); /* Portrait mode, rotated 180 degree */ +#elif McuSSD1306_CONFIG_FIXED_DISPLAY_ORIENTATION==McuSSD1306_CONFIG_ORIENTATION_LANDSCAPE + McuSSD1306_SetDisplayOrientation(McuSSD1306_ORIENTATION_LANDSCAPE); /* Landscape mode, rotated right 90 degree */ +#elif McuSSD1306_CONFIG_FIXED_DISPLAY_ORIENTATION==McuSSD1306_CONFIG_ORIENTATION_LANDSCAPE180 + McuSSD1306_SetDisplayOrientation(McuSSD1306_ORIENTATION_LANDSCAPE180); /* Landscape mode, rotated left 90 degree */ +#endif +#if McuSSD1306_CONFIG_CLEAR_DISPLAY_IN_INIT + McuSSD1306_Clear(); +#endif +} + +/* +** =================================================================== +** Method : PutPixel (component SSD1306) +** +** Description : +** Draws a pixel into the display buffer (not on the display). +** Parameters : +** NAME - DESCRIPTION +** x - x position of the pixel +** y - y position of the pixel +** color - color value of the pixel +** Returns : Nothing +** =================================================================== +*/ +void McuSSD1306_PutPixel(McuSSD1306_PixelDim x, McuSSD1306_PixelDim y, McuSSD1306_PixelColor color) +{ + uint8_t val; + +#if 0 /* done at the the higher level */ + if (x>=McuSSD1306_GetWidth() || y>=McuSSD1306_GetHeight()) { + return; /* error case */ + } +#endif + val = McuSSD1306_DisplayBuf[y/8][x]; /* get current value */ + if (color!=0) { + val |= (1<<(y%8)); /* set pixel */ + } else { + val &= ~(1<<(y%8)); /* clear pixel */ + } + McuSSD1306_DisplayBuf[y/8][x] = val; /* store value */ +} + +/* +** =================================================================== +** Method : Deinit (component SSD1306) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuSSD1306_Deinit(void) +{ + /* nothing to do */ +} + +/* +** =================================================================== +** Method : ClearBuffer (component SSD1306) +** +** Description : +** Writes a color to the full display buffer and clears it. +** Parameters : +** NAME - DESCRIPTION +** color - color value of the pixel +** Returns : Nothing +** =================================================================== +*/ +void McuSSD1306_ClearBuffer(McuSSD1306_PixelColor color) +{ + memset(McuSSD1306_DisplayBuf, color, sizeof(McuSSD1306_DisplayBuf)); +} + +/* END McuSSD1306. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuSSD1306.h b/TSM_PicoW_Sensor/McuLib/src/McuSSD1306.h new file mode 100644 index 0000000..2b1c1fb --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuSSD1306.h @@ -0,0 +1,571 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuSSD1306.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SSD1306 +** Version : Component 01.051, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 14:57, # CodeGen: 841 +** Abstract : +** Display driver for the SSD1306 OLED module +** Settings : +** Component name : McuSSD1306 +** Type : 128x64 +** Driver : SSD1306 +** Orientation : landscape +** Width : 128 +** Height : 64 +** Bytes in rows : no +** Bytes in x direction : yes +** MSB first : no +** Bits per pixel : 1 +** Window capability : no +** Display Memory Write : no +** Display Memory Read : no +** Use RAM Buffer : yes +** Clear display in init : no +** Initialize on Init : yes +** Init Delay (ms) : 100 +** HW : +** I2C Device Address : 0x3C +** I2C Transaction Delay (us) : 0 +** Bock Transfer : yes +** I2C : McuGenericI2C +** Reset : Disabled +** System : +** Wait : McuWait +** SDK : McuLib +** Contents : +** GetWidth - McuSSD1306_PixelDim McuSSD1306_GetWidth(void); +** GetHeight - McuSSD1306_PixelDim McuSSD1306_GetHeight(void); +** GetLongerSide - McuSSD1306_PixelDim McuSSD1306_GetLongerSide(void); +** GetShorterSide - McuSSD1306_PixelDim McuSSD1306_GetShorterSide(void); +** SetDisplayOrientation - void McuSSD1306_SetDisplayOrientation(McuSSD1306_DisplayOrientation... +** GetDisplayOrientation - McuSSD1306_DisplayOrientation McuSSD1306_GetDisplayOrientation(void); +** ClearBuffer - void McuSSD1306_ClearBuffer(McuSSD1306_PixelColor color); +** PutPixel - void McuSSD1306_PutPixel(McuSSD1306_PixelDim x, McuSSD1306_PixelDim y,... +** Clear - void McuSSD1306_Clear(void); +** UpdateFull - void McuSSD1306_UpdateFull(void); +** UpdateRegion - void McuSSD1306_UpdateRegion(McuSSD1306_PixelDim x, McuSSD1306_PixelDim y,... +** InitCommChannel - void McuSSD1306_InitCommChannel(void); +** SetContrast - uint8_t McuSSD1306_SetContrast(uint8_t contrast); +** SetDisplayClockDiv - uint8_t McuSSD1306_SetDisplayClockDiv(uint8_t clockDiv); +** DisplayOn - uint8_t McuSSD1306_DisplayOn(bool on); +** DisplayInvert - uint8_t McuSSD1306_DisplayInvert(bool invert); +** GetLCD - void McuSSD1306_GetLCD(void); +** GiveLCD - void McuSSD1306_GiveLCD(void); +** SetRowCol - uint8_t McuSSD1306_SetRowCol(uint8_t row, uint8_t col); +** PrintString - void McuSSD1306_PrintString(uint8_t line, uint8_t col, uint8_t *str); +** ClearLine - void McuSSD1306_ClearLine(uint8_t line); +** Deinit - void McuSSD1306_Deinit(void); +** Init - void McuSSD1306_Init(void); +** +** * Copyright (c) 2017-2022, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuSSD1306.h +** @version 01.00 +** @brief +** Display driver for the SSD1306 OLED module +*/ +/*! +** @addtogroup McuSSD1306_module McuSSD1306 module documentation +** @{ +*/ + +#ifndef __McuSSD1306_H +#define __McuSSD1306_H + +/* MODULE McuSSD1306. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuSSD1306config.h" /* configuration */ +#include /* for size_t */ + + +#if McuSSD1306_CONFIG_SSD1306_SIZE_TYPE==12864 + #define McuSSD1306_DISPLAY_HW_NOF_COLUMNS 128u /* number of columns in hardware */ + #define McuSSD1306_DISPLAY_HW_NOF_ROWS 64u /* number of rows in hardware */ + #define McuSSD1306_DISPLAY_HW_NOF_PAGES 8u /* number of pages in hardware */ +#elif McuSSD1306_CONFIG_SSD1306_SIZE_TYPE==12832 + #define McuSSD1306_DISPLAY_HW_NOF_COLUMNS 128u /* number of columns in hardware */ + #define McuSSD1306_DISPLAY_HW_NOF_ROWS 32u /* number of rows in hardware */ + #define McuSSD1306_DISPLAY_HW_NOF_PAGES 4u /* number of pages in hardware */ +#else + #error "unknown display type, must be 128x64 or 128x32" +#endif + +typedef bool McuSSD1306_PixelColor; /* type to hold color information */ +typedef uint8_t McuSSD1306_PixelDim; /* one byte is enough to describe the x/y position */ +typedef uint16_t McuSSD1306_PixelCount; /* needed type to hold the number of pixels on the display. */ + +extern uint8_t McuSSD1306_DisplayBuf[((McuSSD1306_DISPLAY_HW_NOF_ROWS-1)/8)+1][McuSSD1306_DISPLAY_HW_NOF_COLUMNS]; /* buffer for the display */ + +#define McuSSD1306_PIXEL_BLACK 0 /* 0 is a black pixel */ +#define McuSSD1306_PIXEL_WHITE 1 /* 1 is a color/white pixel */ +#define McuSSD1306_COLOR_PIXEL_SET McuSSD1306_PIXEL_WHITE /* color for a pixel set */ +#define McuSSD1306_COLOR_PIXEL_CLR McuSSD1306_PIXEL_BLACK /* color for a pixel cleared */ + +#define McuSSD1306_COLOR_BLACK McuSSD1306_PIXEL_BLACK +#define McuSSD1306_COLOR_WHITE McuSSD1306_PIXEL_WHITE +#define McuSSD1306_COLOR_RED McuSSD1306_PIXEL_WHITE +#define McuSSD1306_COLOR_BRIGHT_RED McuSSD1306_COLOR_WHITE +#define McuSSD1306_COLOR_DARK_RED McuSSD1306_PIXEL_WHITE +#define McuSSD1306_COLOR_GREEN McuSSD1306_PIXEL_WHITE +#define McuSSD1306_COLOR_BRIGHT_GREEN McuSSD1306_PIXEL_WHITE +#define McuSSD1306_COLOR_DARK_GREEN McuSSD1306_PIXEL_WHITE +#define McuSSD1306_COLOR_BLUE McuSSD1306_PIXEL_WHITE +#define McuSSD1306_COLOR_BRIGHT_BLUE McuSSD1306_PIXEL_WHITE +#define McuSSD1306_COLOR_DARK_BLUE McuSSD1306_PIXEL_WHITE +#define McuSSD1306_COLOR_YELLOW McuSSD1306_PIXEL_WHITE +#define McuSSD1306_COLOR_BRIGHT_YELLOW McuSSD1306_PIXEL_WHITE +#define McuSSD1306_COLOR_ORANGE McuSSD1306_PIXEL_WHITE +#define McuSSD1306_COLOR_GREY McuSSD1306_PIXEL_WHITE +#define McuSSD1306_COLOR_BRIGHT_GREY McuSSD1306_PIXEL_WHITE + +#define McuSSD1306_PIXEL_ON McuSSD1306_COLOR_WHITE /* value of a pixel if it is 'on' */ +#define McuSSD1306_PIXEL_OFF McuSSD1306_COLOR_BLACK /* value of a pixel if it is 'off' */ + +#define McuSSD1306_HW_LONGER_SIDE McuSSD1306_DISPLAY_HW_NOF_COLUMNS /* Hardware display longer side in pixels */ +#define McuSSD1306_HW_SHORTER_SIDE McuSSD1306_DISPLAY_HW_NOF_ROWS /* Hardware display shorter side in pixels */ + +typedef enum { + McuSSD1306_ORIENTATION_PORTRAIT = 0, + McuSSD1306_ORIENTATION_PORTRAIT180 = 1, + McuSSD1306_ORIENTATION_LANDSCAPE = 2, + McuSSD1306_ORIENTATION_LANDSCAPE180= 3 +} McuSSD1306_DisplayOrientation; + +#define McuSSD1306_WritePixel(data) \ + McuSSD1306_WriteDataWord(data) + +#define McuSSD1306_ReadPixel(data) \ + 0 /* with the I2C interface it is NOT possible to read from display memory */ + + + +void McuSSD1306_Clear(void); +/* +** =================================================================== +** Method : Clear (component SSD1306) +** +** Description : +** Clears the whole display memory. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuSSD1306_Init(void); +/* +** =================================================================== +** Method : Init (component SSD1306) +** +** Description : +** Display driver initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuSSD1306_UpdateFull(void); +/* +** =================================================================== +** Method : UpdateFull (component SSD1306) +** +** Description : +** Updates the whole display from the microcontroller RAM +** display buffer. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuSSD1306_UpdateRegion(McuSSD1306_PixelDim x, McuSSD1306_PixelDim y, McuSSD1306_PixelDim w, McuSSD1306_PixelDim h); +/* +** =================================================================== +** Method : UpdateRegion (component SSD1306) +** +** Description : +** Updates a region of the display. This is only a stub for +** this display as we are using windowing. +** Parameters : +** NAME - DESCRIPTION +** x - x coordinate +** y - y coordinate +** w - width of the region +** h - Height of the region +** Returns : Nothing +** =================================================================== +*/ + +void McuSSD1306_OpenWindow(McuSSD1306_PixelDim x0, McuSSD1306_PixelDim y0, McuSSD1306_PixelDim x1, McuSSD1306_PixelDim y1); +/* +** =================================================================== +** Method : McuSSD1306_OpenWindow (component SSD1306) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ + +void McuSSD1306_CloseWindow(void); + +/* +** =================================================================== +** Method : McuSSD1306_CloseWindow (component SSD1306) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ + +void McuSSD1306_WriteData(uint8_t data); +/* +** =================================================================== +** Method : McuSSD1306_WriteData (component SSD1306) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ + +McuSSD1306_DisplayOrientation McuSSD1306_GetDisplayOrientation(void); +/* +** =================================================================== +** Method : GetDisplayOrientation (component SSD1306) +** +** Description : +** Returns the current display orientation +** Parameters : None +** Returns : +** --- - current display orientation +** =================================================================== +*/ + +void McuSSD1306_SetDisplayOrientation(McuSSD1306_DisplayOrientation newOrientation); +/* +** =================================================================== +** Method : SetDisplayOrientation (component SSD1306) +** +** Description : +** Sets the display orientation. If you enable this method, +** then the orientation of the display can be changed at +** runtime. However, this requires additional resources. +** Parameters : +** NAME - DESCRIPTION +** newOrientation - new orientation to +** be used +** Returns : Nothing +** =================================================================== +*/ + +#if McuSSD1306_CONFIG_DYNAMIC_DISPLAY_ORIENTATION + McuSSD1306_PixelDim McuSSD1306_GetWidth(void); +#elif McuSSD1306_CONFIG_FIXED_DISPLAY_ORIENTATION==McuSSD1306_CONFIG_ORIENTATION_PORTRAIT + #define McuSSD1306_GetWidth() McuSSD1306_HW_SHORTER_SIDE +#elif McuSSD1306_CONFIG_FIXED_DISPLAY_ORIENTATION==McuSSD1306_CONFIG_ORIENTATION_PORTRAIT180 + #define McuSSD1306_GetWidth() McuSSD1306_HW_SHORTER_SIDE +#elif McuSSD1306_CONFIG_FIXED_DISPLAY_ORIENTATION==McuSSD1306_CONFIG_ORIENTATION_LANDSCAPE + #define McuSSD1306_GetWidth() McuSSD1306_HW_LONGER_SIDE +#elif McuSSD1306_CONFIG_FIXED_DISPLAY_ORIENTATION==McuSSD1306_CONFIG_ORIENTATION_LANDSCAPE180 + #define McuSSD1306_GetWidth() McuSSD1306_HW_LONGER_SIDE +#endif +/* +** =================================================================== +** Method : GetWidth (component SSD1306) +** +** Description : +** Returns the width of the display in pixels (in x direction) +** Parameters : None +** Returns : +** --- - Width of display +** =================================================================== +*/ + +#if McuSSD1306_CONFIG_DYNAMIC_DISPLAY_ORIENTATION + McuSSD1306_PixelDim McuSSD1306_GetHeight(void); +#elif McuSSD1306_CONFIG_FIXED_DISPLAY_ORIENTATION==McuSSD1306_CONFIG_ORIENTATION_PORTRAIT + #define McuSSD1306_GetHeight() McuSSD1306_HW_LONGER_SIDE +#elif McuSSD1306_CONFIG_FIXED_DISPLAY_ORIENTATION==McuSSD1306_CONFIG_ORIENTATION_PORTRAIT180 + #define McuSSD1306_GetHeight() McuSSD1306_HW_LONGER_SIDE +#elif McuSSD1306_CONFIG_FIXED_DISPLAY_ORIENTATION==McuSSD1306_CONFIG_ORIENTATION_LANDSCAPE + #define McuSSD1306_GetHeight() McuSSD1306_HW_SHORTER_SIDE +#elif McuSSD1306_CONFIG_FIXED_DISPLAY_ORIENTATION==McuSSD1306_CONFIG_ORIENTATION_LANDSCAPE180 + #define McuSSD1306_GetHeight() McuSSD1306_HW_SHORTER_SIDE +#endif +/* +** =================================================================== +** Method : GetHeight (component SSD1306) +** +** Description : +** Returns the height of the display in pixels (in y direction) +** Parameters : None +** Returns : +** --- - Height of display +** =================================================================== +*/ + +#define McuSSD1306_GetLongerSide() \ + McuSSD1306_HW_LONGER_SIDE +/* +** =================================================================== +** Method : GetLongerSide (component SSD1306) +** +** Description : +** Returns the size of the longer side of the display +** Parameters : None +** Returns : +** --- - number of pixels +** =================================================================== +*/ + +#define McuSSD1306_GetShorterSide() \ + McuSSD1306_HW_SHORTER_SIDE +/* +** =================================================================== +** Method : GetShorterSide (component SSD1306) +** +** Description : +** Returns the size of the shorter side of the display +** Parameters : None +** Returns : +** --- - number of pixels +** =================================================================== +*/ + +uint16_t McuSSD1306_ReadDataWord(void); +/* +** =================================================================== +** Method : McuSSD1306_ReadDataWord (component SSD1306) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ + +void McuSSD1306_GetLCD(void); +/* +** =================================================================== +** Method : GetLCD (component SSD1306) +** +** Description : +** Method to be called for mutual exclusive access to the LCD +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuSSD1306_GiveLCD(void); +/* +** =================================================================== +** Method : GiveLCD (component SSD1306) +** +** Description : +** Method to be called for mutual exclusive access to the LCD +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuSSD1306_InitCommChannel(void); +/* +** =================================================================== +** Method : InitCommChannel (component SSD1306) +** +** Description : +** Method to initialize communication to the LCD. Needed if the +** bus to the LCD is shared with other components and settings +** are different. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuSSD1306_SetContrast(uint8_t contrast); +/* +** =================================================================== +** Method : SetContrast (component SSD1306) +** +** Description : +** Sets the display contrast level (default:0x7F) +** Parameters : +** NAME - DESCRIPTION +** contrast - Contrast level (default 0x7F). +** Contrast increases as the value increases. +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuSSD1306_DisplayOn(bool on); +/* +** =================================================================== +** Method : DisplayOn (component SSD1306) +** +** Description : +** Turns the display on or off (sleep) +** Parameters : +** NAME - DESCRIPTION +** on - turns the display on or off +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuSSD1306_DisplayInvert(bool invert); +/* +** =================================================================== +** Method : DisplayInvert (component SSD1306) +** +** Description : +** Used to inverse the display. In normal mode, 1 one in the +** display RAM is a pixel set and a 0 means pixel clear. +** Parameters : +** NAME - DESCRIPTION +** invert - if TRUE, a 1 is pixel clear and a 0 +** is a pixel set. +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuSSD1306_PrintString(uint8_t line, uint8_t col, uint8_t *str); +/* +** =================================================================== +** Method : PrintString (component SSD1306) +** +** Description : +** Simple low level method printing text to the display. +** Newline is supported. +** Parameters : +** NAME - DESCRIPTION +** line - line number, starting with 0 +** col - column number, starting with 0 +** * str - Pointer to string to be printed on display +** Returns : Nothing +** =================================================================== +*/ + +void McuSSD1306_PutPixel(McuSSD1306_PixelDim x, McuSSD1306_PixelDim y, McuSSD1306_PixelColor color); +/* +** =================================================================== +** Method : PutPixel (component SSD1306) +** +** Description : +** Draws a pixel into the display buffer (not on the display). +** Parameters : +** NAME - DESCRIPTION +** x - x position of the pixel +** y - y position of the pixel +** color - color value of the pixel +** Returns : Nothing +** =================================================================== +*/ + +void McuSSD1306_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SSD1306) +** +** Description : +** Driver de-initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuSSD1306_SetRowCol(uint8_t row, uint8_t col); +/* +** =================================================================== +** Method : SetRowCol (component SSD1306) +** +** Description : +** Sets the column and row position, useful for start writing +** text with PrintString() +** Parameters : +** NAME - DESCRIPTION +** row - row (or line) number, starting with 0 +** col - column number, starting with 0 +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuSSD1306_ClearLine(uint8_t line); +/* +** =================================================================== +** Method : ClearLine (component SSD1306) +** +** Description : +** Clear a text line on the display +** Parameters : +** NAME - DESCRIPTION +** line - Line number, starting with zero +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuSSD1306_SetDisplayClockDiv(uint8_t clockDiv); +/* +** =================================================================== +** Method : SetDisplayClockDiv (component SSD1306) +** +** Description : +** Sets the display clock divider (default 0x80). This can be +** used to affect display refresh rate or to reduce audible +** noise. +** Parameters : +** NAME - DESCRIPTION +** clockDiv - Clock Divider (default 0x80). +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuSSD1306_ClearBuffer(McuSSD1306_PixelColor color); +/* +** =================================================================== +** Method : ClearBuffer (component SSD1306) +** +** Description : +** Writes a color to the full display buffer and clears it. +** Parameters : +** NAME - DESCRIPTION +** color - color value of the pixel +** Returns : Nothing +** =================================================================== +*/ + +/* END McuSSD1306. */ + +#endif +/* ifndef __McuSSD1306_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuST7735.c b/TSM_PicoW_Sensor/McuLib/src/McuST7735.c new file mode 100644 index 0000000..a676138 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuST7735.c @@ -0,0 +1,427 @@ +/* + * Copyright (c) 2023, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * Register values and driver IC initialization: https://github.com/afiskon/stm32-st7735 + */ + +#include "McuST7735.h" + +#if McuST7735_CONFIG_IS_ENABLED +#include "McuSPI.h" +#include "McuGPIO.h" +#include "McuLog.h" +#include "McuWait.h" +#include + +#define McuST7735_DELAY 0x80 + +#define McuST7735_MADCTL_MY 0x80 +#define McuST7735_MADCTL_MX 0x40 +#define McuST7735_MADCTL_MV 0x20 +#define McuST7735_MADCTL_ML 0x10 +#define McuST7735_MADCTL_RGB 0x00 +#define McuST7735_MADCTL_BGR 0x08 +#define McuST7735_MADCTL_MH 0x04 + +#define McuST7735_NOP 0x00 +#define McuST7735_SWRESET 0x01 +#define McuST7735_RDDID 0x04 +#define McuST7735_RDDST 0x09 + +#define McuST7735_SLPIN 0x10 +#define McuST7735_SLPOUT 0x11 +#define McuST7735_PTLON 0x12 +#define McuST7735_NORON 0x13 + +#define McuST7735_INVOFF 0x20 +#define McuST7735_INVON 0x21 +#define McuST7735_DISPOFF 0x28 +#define McuST7735_DISPON 0x29 +#define McuST7735_CASET 0x2A +#define McuST7735_RASET 0x2B +#define McuST7735_RAMWR 0x2C +#define McuST7735_RAMRD 0x2E + +#define McuST7735_PTLAR 0x30 +#define McuST7735_COLMOD 0x3A +#define McuST7735_MADCTL 0x36 + +#define McuST7735_FRMCTR1 0xB1 +#define McuST7735_FRMCTR2 0xB2 +#define McuST7735_FRMCTR3 0xB3 +#define McuST7735_INVCTR 0xB4 +#define McuST7735_DISSET5 0xB6 + +#define McuST7735_PWCTR1 0xC0 +#define McuST7735_PWCTR2 0xC1 +#define McuST7735_PWCTR3 0xC2 +#define McuST7735_PWCTR4 0xC3 +#define McuST7735_PWCTR5 0xC4 +#define McuST7735_VMCTR1 0xC5 + +#define McuST7735_RDID1 0xDA +#define McuST7735_RDID2 0xDB +#define McuST7735_RDID3 0xDC +#define McuST7735_RDID4 0xDD + +#define McuST7735_PWCTR6 0xFC + +#define McuST7735_GMCTRP1 0xE0 +#define McuST7735_GMCTRN1 0xE1 + +static int16_t curr_width; /*!< current display with, based on rotation */ +static int16_t curr_height; /*!< current display height, based on rotation */ +static uint8_t curr_rotation; /*!< current display rotation: 0, 1, 2 or 4 */ +static uint8_t curr_xstart; /*!< current x starting position, based on rotation */ +static uint8_t curr_ystart; /*!< current y starting position, based on rotation */ + +/* different displays have different column and row start values */ +#if McuST7735_CONFIG_DISPLAY_TYPE==MCUST7735_TYPE_160X80 + #define McuST7735_HW_COL_START 24 + #define McuST7735_HW_ROW_START 0 +#elif McuST7735_CONFIG_DISPLAY_TYPE==MCUST7735_TYPE_128X128 + #define McuST7735_HW_COL_START 2 + #define McuST7735_HW_ROW_START 3 +#elif McuST7735_CONFIG_DISPLAY_TYPE==MCUST7735_TYPE_160x128 + #define McuST7735_HW_COL_START 0 + #define McuST7735_HW_ROW_START 0 +#endif + + +static McuGPIO_Handle_t csPin; /* CS pin, LOW active, used to select device (chip select) */ +static McuGPIO_Handle_t resetPin; /* RESET pin, LOW active, used to reset device */ +static McuGPIO_Handle_t dcPin; /* DC pin (data or command), LOW active, used to send commands (low) and data (high) */ + +#define McuST7735_Select() McuGPIO_SetLow(csPin) +#define McuST7735_Unselect() McuGPIO_SetHigh(csPin) +#define McuST7735_SetDataMode() McuGPIO_SetHigh(dcPin) +#define McuST7735_SetCmdMode() McuGPIO_SetLow(dcPin) + +uint16_t McuST7735_GetWidth(void) { + return curr_width; +} + +uint16_t McuST7735_GetHeight(void) { + return curr_height; +} + +static uint8_t McuST7735_WriteSPI(unsigned char *data, size_t dataSize) { + McuSPI_SendReceiveBlock(data, NULL, dataSize); + return ERR_OK; +} + +static void McuST7735_WriteCommand(uint8_t cmd) { + uint8_t error = 0; + + McuST7735_SetCmdMode(); + error = McuST7735_WriteSPI(&cmd, sizeof(cmd)); +} + +static void McuST7735_WriteData(uint8_t* data, size_t dataSize) { + McuST7735_SetDataMode(); + McuST7735_WriteSPI(data, dataSize); +} + +void McuST7735_SetAddressWindow(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1) { + McuST7735_WriteCommand(McuST7735_CASET); /* column address set */ + uint8_t data[] = { 0x00, x0 + curr_xstart, 0x00, x1 + curr_xstart }; + McuST7735_WriteData(data, sizeof(data)); + + McuST7735_WriteCommand(McuST7735_RASET); /* row address set */ + data[1] = y0 + curr_ystart; + data[3] = y1 + curr_ystart; + McuST7735_WriteData(data, sizeof(data)); + + McuST7735_WriteCommand(McuST7735_RAMWR); /* write to RAM */ +} + +void McuST7735_SetRotation(uint8_t m) { + uint8_t madctl = 0; + + curr_rotation = m%4; /* can only 0-3 */ + switch (curr_rotation) { + case 0: +#if McuST7735_CONFIG_DISPLAY_TYPE==MCUST7735_TYPE_160X80 + madctl = McuST7735_MADCTL_MX | McuST7735_MADCTL_MY | McuST7735_MADCTL_BGR; +#else + madctl = McuST7735_MADCTL_MX | McuST7735_MADCTL_MY | McuST7735_MADCTL_RGB; + curr_height = McuST7735_GetHwHeight(); + curr_width = McuST7735_GetHwWidth(); + curr_xstart = McuST7735_HW_COL_START; + curr_ystart = McuST7735_HW_ROW_START; +#endif + break; + case 1: +#if McuST7735_CONFIG_DISPLAY_TYPE==MCUST7735_TYPE_160X80 + madctl = McuST7735_MADCTL_MY | McuST7735_MADCTL_MV | McuST7735_MADCTL_BGR; +#else + madctl = McuST7735_MADCTL_MY | McuST7735_MADCTL_MV | McuST7735_MADCTL_RGB; + curr_width = McuST7735_GetHwHeight(); + curr_height = McuST7735_GetHwWidth(); + curr_ystart = McuST7735_HW_COL_START; + curr_xstart = McuST7735_HW_ROW_START; +#endif + break; + case 2: +#if McuST7735_CONFIG_DISPLAY_TYPE==MCUST7735_TYPE_160X80 + madctl = McuST7735_MADCTL_BGR; +#else + madctl = McuST7735_MADCTL_RGB; + curr_height = McuST7735_GetHwHeight(); + curr_width = McuST7735_GetHwWidth(); + curr_xstart = McuST7735_HW_COL_START; + curr_ystart = McuST7735_HW_ROW_START; +#endif + break; + case 3: +#if McuST7735_CONFIG_DISPLAY_TYPE==MCUST7735_TYPE_160X80 + madctl = McuST7735_MADCTL_MX | McuST7735_MADCTL_MV | McuST7735_MADCTL_BGR; +#else + madctl = McuST7735_MADCTL_MX | McuST7735_MADCTL_MV | McuST7735_MADCTL_RGB; + curr_width = McuST7735_GetHwHeight(); + curr_height = McuST7735_GetHwWidth(); + curr_ystart = McuST7735_HW_COL_START; + curr_xstart = McuST7735_HW_ROW_START; +#endif + break; + } /* switch */ + McuST7735_Select(); + McuST7735_WriteCommand(McuST7735_MADCTL); + McuST7735_WriteData(&madctl,1); + McuST7735_Unselect(); +} + +void McuST7735_DrawPixel(uint16_t x, uint16_t y, uint16_t color) { + if((x >= curr_width) || (y >= curr_height)) { + return; + } + McuST7735_Select(); + + McuST7735_SetAddressWindow(x, y, x+1, y+1); + uint8_t data[] = { color>>8, color&0xFF }; + McuST7735_WriteData(data, sizeof(data)); + + McuST7735_Unselect(); +} + +void McuST7735_FillRectangle(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color) { + if((x >= curr_width) || (y >= curr_height)) { + return; + } + if((x + w - 1) >= curr_width) { + w = curr_width - x; + } + if((y + h - 1) >= curr_height) { + h = curr_height - y; + } + + McuST7735_Select(); + McuST7735_SetAddressWindow(x, y, x+w-1, y+h-1); + + uint8_t data[] = { color >> 8, color & 0xFF }; + McuST7735_SetDataMode(); + for(y = h; y > 0; y--) { + for(x = w; x > 0; x--) { + McuST7735_WriteSPI(data, sizeof(data)); + } + } + McuST7735_Unselect(); +} + +void McuST7735_InvertColors(bool invert) { + McuST7735_Select(); + McuST7735_WriteCommand(invert ? McuST7735_INVON : McuST7735_INVOFF); + McuST7735_Unselect(); +} + +void McuST7735_Reset(void) { + McuGPIO_SetLow(resetPin); + McuWait_Waitms(5); + McuGPIO_SetHigh(resetPin); +} + +static void SendDisplayInitCommands(const uint8_t *addr) { + uint8_t numCommands, numArgs; + uint16_t ms; + + numCommands = *addr++; + while(numCommands--) { + uint8_t cmd = *addr++; + McuST7735_WriteCommand(cmd); + + numArgs = *addr++; + /* If high bit set, delay follows args */ + ms = numArgs & McuST7735_DELAY; + numArgs &= ~McuST7735_DELAY; + if(numArgs) { + McuST7735_WriteData((uint8_t*)addr, numArgs); + addr += numArgs; + } + if(ms) { + ms = *addr++; + if(ms == 255) { + ms = 500; + } + McuWait_Waitms(ms); + } + } +} + +static const uint8_t + init_cmds1[] = { // Init for 7735R, part 1 (red or green tab) + 15, // 15 commands in list: + McuST7735_SWRESET, McuST7735_DELAY, // 1: Software reset, 0 args, w/delay + 150, // 150 ms delay + McuST7735_SLPOUT , McuST7735_DELAY, // 2: Out of sleep mode, 0 args, w/delay + 255, // 500 ms delay + McuST7735_FRMCTR1, 3 , // 3: Frame rate ctrl - normal mode, 3 args: + 0x01, 0x2C, 0x2D, // Rate = fosc/(1x2+40) * (LINE+2C+2D) + McuST7735_FRMCTR2, 3 , // 4: Frame rate control - idle mode, 3 args: + 0x01, 0x2C, 0x2D, // Rate = fosc/(1x2+40) * (LINE+2C+2D) + McuST7735_FRMCTR3, 6 , // 5: Frame rate ctrl - partial mode, 6 args: + 0x01, 0x2C, 0x2D, // Dot inversion mode + 0x01, 0x2C, 0x2D, // Line inversion mode + McuST7735_INVCTR , 1 , // 6: Display inversion ctrl, 1 arg, no delay: + 0x07, // No inversion + McuST7735_PWCTR1 , 3 , // 7: Power control, 3 args, no delay: + 0xA2, + 0x02, // -4.6V + 0x84, // AUTO mode + McuST7735_PWCTR2 , 1 , // 8: Power control, 1 arg, no delay: + 0xC5, // VGH25 = 2.4C VGSEL = -10 VGH = 3 * AVDD + McuST7735_PWCTR3 , 2 , // 9: Power control, 2 args, no delay: + 0x0A, // Opamp current small + 0x00, // Boost frequency + McuST7735_PWCTR4 , 2 , // 10: Power control, 2 args, no delay: + 0x8A, // BCLK/2, Opamp current small & Medium low + 0x2A, + McuST7735_PWCTR5 , 2 , // 11: Power control, 2 args, no delay: + 0x8A, 0xEE, + McuST7735_VMCTR1 , 1 , // 12: Power control, 1 arg, no delay: + 0x0E, + McuST7735_INVOFF , 0 , // 13: Don't invert display, no args, no delay + McuST7735_COLMOD , 1 , // 15: set color mode, 1 arg, no delay: + 0x05 }, // 16-bit color +#if McuST7735_CONFIG_DISPLAY_TYPE==MCUST7735_TYPE_128X128 || McuST7735_CONFIG_DISPLAY_TYPE==MCUST7735_TYPE_160X128 + init_cmds2[] = { // Init for 7735R, part 2 (1.44" display) + 2, // 2 commands in list: + McuST7735_CASET , 4 , // 1: Column addr set, 4 args, no delay: + 0x00, 0x00, // XSTART = 0 + 0x00, 0x7F, // XEND = 127 + McuST7735_RASET , 4 , // 2: Row addr set, 4 args, no delay: + 0x00, 0x00, // XSTART = 0 + 0x00, 0x7F }, // XEND = 127 +#endif +#if McuST7735_CONFIG_DISPLAY_TYPE==MCUST7735_TYPE_160X80 + init_cmds2[] = { // Init for 7735S, part 2 (160x80 display) + 3, // 3 commands in list: + McuST7735_CASET , 4 , // 1: Column addr set, 4 args, no delay: + 0x00, 0x00, // XSTART = 0 + 0x00, 0x4F, // XEND = 79 + McuST7735_RASET , 4 , // 2: Row addr set, 4 args, no delay: + 0x00, 0x00, // XSTART = 0 + 0x00, 0x9F , // XEND = 159 + McuST7735_INVON, 0 }, // 3: Invert colors +#endif + init_cmds3[] = { // Init for 7735R, part 3 (red or green tab) + 4, // 4 commands in list: + McuST7735_GMCTRP1, 16 , // 1: Magical unicorn dust, 16 args, no delay: + 0x02, 0x1c, 0x07, 0x12, + 0x37, 0x32, 0x29, 0x2d, + 0x29, 0x25, 0x2B, 0x39, + 0x00, 0x01, 0x03, 0x10, + McuST7735_GMCTRN1, 16 , // 2: Sparkles and rainbows, 16 args, no delay: + 0x03, 0x1d, 0x07, 0x06, + 0x2E, 0x2C, 0x29, 0x2D, + 0x2E, 0x2E, 0x37, 0x3F, + 0x00, 0x00, 0x02, 0x10, + McuST7735_NORON , McuST7735_DELAY, // 3: Normal display on, no args, w/delay + 10, // 10 ms delay + McuST7735_DISPON , McuST7735_DELAY, // 4: Main screen turn on, no args w/delay + 100 }; // 100 ms delay + +static void InitDisplay(uint8_t rotation) { + McuST7735_Select(); + McuST7735_Reset(); + SendDisplayInitCommands(init_cmds1); + SendDisplayInitCommands(init_cmds2); + SendDisplayInitCommands(init_cmds3); +#if McuST7735_CONFIG_DISPLAY_TYPE==MCUST7735_TYPE_160X80 + /* not tested yet, might not work! */ + uint8_t data = 0xC0; + ST7735_Select(); + ST7735_WriteCommand(ST7735_MADCTL); + ST7735_WriteData(&data,1); + ST7735_Unselect(); +#endif + McuST7735_SetRotation (rotation); + McuST7735_Unselect(); +} + +static void InitPins(void) { + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + +#if McuLib_CONFIG_CPU_IS_ESP32 + config.hw.pin = McuST7735_CONFIG_CS_PIN_NUMBER; +#elif McuLib_CONFIG_CPU_IS_RPxxxx + config.hw.pin = McuST7735_CONFIG_CS_PIN_NUMBER; +#else + config.hw.gpio = McuST7735_CONFIG_CS_PIN_GPIO; + config.hw.port = McuST7735_CONFIG_CS_PIN_PORT; + config.hw.pin = McuST7735_CONFIG_CS_PIN_NUMBER; +#endif + config.isInput = false; + config.isHighOnInit = true; /* CS is Low active, set it to high (deactivated) */ + + csPin = McuGPIO_InitGPIO(&config); + if (csPin==NULL) { + McuLog_fatal("failed initializing display CS pin"); + for(;;) {} /* error */ + } + +#if McuLib_CONFIG_CPU_IS_ESP32 + config.hw.pin = McuST7735_CONFIG_DC_PIN_NUMBER; +#elif McuLib_CONFIG_CPU_IS_RPxxxx + config.hw.pin = McuST7735_CONFIG_DC_PIN_NUMBER; +#else + config.hw.gpio = McuST7735_CONFIG_DC_PIN_GPIO; + config.hw.port = McuST7735_CONFIG_DC_PIN_PORT; + config.hw.pin = McuST7735_CONFIG_DC_PIN_NUMBER; +#endif + config.isInput = false; + config.isHighOnInit = false; /* DC initially low, command mode */ + + dcPin = McuGPIO_InitGPIO(&config); + if (dcPin==NULL) { + McuLog_fatal("failed initializing display DC pin"); + for(;;) {} /* error */ + } + +#if McuLib_CONFIG_CPU_IS_ESP32 + config.hw.pin = McuST7735_CONFIG_RESET_PIN_NUMBER; +#elif McuLib_CONFIG_CPU_IS_RPxxxx + config.hw.pin = McuST7735_CONFIG_RESET_PIN_NUMBER; +#else + config.hw.gpio = McuST7735_CONFIG_RESET_PIN_GPIO; + config.hw.port = McuST7735_CONFIG_RESET_PIN_PORT; + config.hw.pin = McuST7735_CONFIG_RESET_PIN_NUMBER; +#endif + config.isInput = false; + config.isHighOnInit = true; /* RESET is LOW active */ + + resetPin = McuGPIO_InitGPIO(&config); + if (resetPin==NULL) { + McuLog_fatal("failed initializing display RESET pin"); + for(;;) {} /* error */ + } +} + +void McuST7735_Init(void) { + InitPins(); + InitDisplay(0); +} + +#endif /* McuST7735_CONFIG_IS_ENABLED */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuST7735.h b/TSM_PicoW_Sensor/McuLib/src/McuST7735.h new file mode 100644 index 0000000..ece67f3 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuST7735.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2023, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MCUST7735_H_ +#define MCUST7735_H_ + +#include "McuST7735_config.h" +#include + +/* some predefined colors: */ +#define McuST7735_COLOR_BLACK 0x0000 +#define McuST7735_COLOR_RED 0x001F +#define McuST7735_COLOR_GREEN 0x07E0 +#define McuST7735_COLOR_BLUE 0xF800 +#define McuST7735_COLOR_WHITE 0xFFFF +#define McuST7735_COLOR_color565(r, g, b) ((((b)&0xF8)<<8) | (((g)&0xFC)<<3) | (((r)&0xF8)>>3)) + +/* width and height based on orientation of display: */ +uint16_t McuST7735_GetWidth(void); +uint16_t McuST7735_GetHeight(void); + +/* width and height based on hardware pixels */ +#if McuST7735_CONFIG_DISPLAY_TYPE==MCUST7735_TYPE_128X128 + #define McuST7735_GetHwWidth() 128 + #define McuST7735_GetHwHeight() 128 +#elif McuST7735_CONFIG_DISPLAY_TYPE==MCUST7735_TYPE_160X80 + #define McuST7735_GetHwWidth() 160 + #define McuST7735_GetHwHeight() 80 +#elif McuST7735_CONFIG_DISPLAY_TYPE==MCUST7735_TYPE_160X128 + #define McuST7735_GetHwWidth() 160 + #define McuST7735_GetHwHeight() 128 +#endif + +void McuST7735_DrawPixel(uint16_t x, uint16_t y, uint16_t color); + +void McuST7735_FillRectangle(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color); + +void McuST7735_Init(void); + +#endif /* MCUST7735_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuSTM32HALI2C.c b/TSM_PicoW_Sensor/McuLib/src/McuSTM32HALI2C.c new file mode 100644 index 0000000..94b8bd9 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuSTM32HALI2C.c @@ -0,0 +1,474 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuSTM32HALI2C.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : STM32CubeI2C +** Version : Component 01.004, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2018-08-27, 17:24, # CodeGen: 349 +** Abstract : +** Driver for STM32CubMX HAL I2C library +** Settings : +** Component name : McuSTM32HALI2C +** SDK : McuLib +** Wait : McuWait +** Contents : +** SendChar - uint8_t McuSTM32HALI2C_SendChar(uint8_t Chr); +** RecvChar - uint8_t McuSTM32HALI2C_RecvChar(uint8_t *Chr); +** SendBlock - uint8_t McuSTM32HALI2C_SendBlock(void *Ptr, uint16_t Siz, uint16_t *Snt); +** SendBlockContinue - uint8_t McuSTM32HALI2C_SendBlockContinue(void *Ptr, uint16_t Siz, uint16_t... +** RecvBlock - uint8_t McuSTM32HALI2C_RecvBlock(void *Ptr, uint16_t Siz, uint16_t *Rcv); +** SendAck - void McuSTM32HALI2C_SendAck(bool Ack); +** SendStop - uint8_t McuSTM32HALI2C_SendStop(void); +** SelectSlave - uint8_t McuSTM32HALI2C_SelectSlave(uint8_t Slv); +** GetSelected - uint8_t McuSTM32HALI2C_GetSelected(uint8_t *Slv); +** SetDeviceHandle - uint8_t McuSTM32HALI2C_SetDeviceHandle(I2C_HandleTypeDef *handle); +** Deinit - void McuSTM32HALI2C_Deinit(void); +** Init - void McuSTM32HALI2C_Init(void); +** +** * Copyright (c) 2018, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuSTM32HALI2C.h +** @version 01.00 +** @brief +** Driver for STM32CubMX HAL I2C library +*/ +/*! +** @addtogroup McuSTM32HALI2C_module McuSTM32HALI2C module documentation +** @{ +*/ + +/* MODULE McuSTM32HALI2C. */ +#include "McuSTM32HALI2C.h" +#include "McuWait.h" /* waiting routines */ + +#include "McuLib.h" /* SDK and API used */ +#if McuLib_CONFIG_CPU_IS_STM32 /* only for STM32 */ + +static uint8_t McuSTM32HALI2C_slaveAddr; /* destination slave address, this is the shifted (8bit) address */ +static I2C_HandleTypeDef *McuSTM32HALI2C_device; /* device handle */ + +/* +** =================================================================== +** Method : SendAck (component STM32CubeI2C) +** +** Description : +** The method sends ACK to the bus. +** Parameters : +** NAME - DESCRIPTION +** Ack - If acknowledge is high or low +** Returns : Nothing +** =================================================================== +*/ +void McuSTM32HALI2C_SendAck(bool Ack) +{ +} + +/* +** =================================================================== +** Method : SendChar (component STM32CubeI2C) +** +** Description : +** When working as a MASTER, this method writes 7 bits of slave +** address plus R/W bit = 0 to the I2C bus and then writes one +** character (byte) to the bus. The slave address must be +** specified before by the "SelectSlave" method or in the +** component initialization section of 'Slave address init' +** property. When working as the SLAVE, this method writes one +** character (byte) to the bus. If the ERR_NOTAVAIL error code +** returned, the char is successfully sent to master but the +** master device responds by an acknowledgment instead of no +** acknowledgment at the end of transfer. 'OnError' event is +** called in this case. +** Parameters : +** NAME - DESCRIPTION +** Chr - Character to send +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_BUSY - The slave device is busy, it +** does not respond by the acknowledgment +** (MASTER mode only) +** ERR_NOTAVAIL - The master device sends +** acknowledgment instead of no acknowledgment +** after the last byte transfer (SLAVE mode +** only) +** ERR_DISABLED - Device is disabled +** ERR_BUSOFF - Clock timeout elapsed (SLAVE +** mode only) +** =================================================================== +*/ +uint8_t McuSTM32HALI2C_SendChar(uint8_t Chr) +{ + HAL_StatusTypeDef res; + + res = HAL_I2C_Master_Transmit(McuSTM32HALI2C_device, McuSTM32HALI2C_slaveAddr, &Chr, 1, HAL_MAX_DELAY); + if (res!=HAL_OK) { + return ERR_FAILED; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : RecvChar (component STM32CubeI2C) +** +** Description : +** When working as a MASTER, this method writes 7 bits of slave +** address plus R/W bit = 1 to the I2C bus and then reads one +** character (byte) from the bus. The slave address must be +** specified before by the "SelectSlave" method or in the +** component initialization section of 'Slave address init' +** property. When working as a SLAVE, this method reads one +** character (byte) from the bus. +** Parameters : +** NAME - DESCRIPTION +** * Chr - Pointer to received character +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_BUSY - The slave device is busy, it +** does not respond by the acknowledgment +** (MASTER mode only) +** ERR_DISABLED - Device is disabled +** ERR_BUSOFF - Clock timeout elapsed (SLAVE +** mode only) +** =================================================================== +*/ +uint8_t McuSTM32HALI2C_RecvChar(uint8_t *Chr) +{ + return ERR_OK; +} + +/* +** =================================================================== +** Method : SendBlock (component STM32CubeI2C) +** +** Description : +** When working as a MASTER, this method writes 7 bits of slave +** address plus R/W bit = 0 to the I2C bus and then writes the +** block of characters to the bus. If the component is disabled +** (by the "Disable" method or initialization), the block is +** moved to the output buffer if the 'Output buffer size' +** property is different from zero. The content of the output +** buffer is sent immediately with the stop condition at the +** end when the component is enabled by the "Enable" method. +** After the output buffer transmission, the whole output +** buffer is cleared. The slave address must be specified +** before by the "SelectSlave" method or in component +** initialization section of 'Slave address init' property. +** When working as a SLAVE, this method writes block of +** characters to the bus. If the ERR_NOTAVAIL error code is +** returned, the whole block is successfully sent to a master +** but the master device responds by an acknowledgment instead +** of no acknowledgment sent at the end of the last block byte +** transfer. 'OnError' event is called in this case. +** Parameters : +** NAME - DESCRIPTION +** * Ptr - A pointer to the block of data to send +** Siz - The size of the block +** * Snt - A pointer to the number of data that are +** sent (copied to buffer) +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_BUSY - The slave device is busy, it +** does not respond by the acknowledgment +** (MASTER mode only) +** ERR_TXFULL - Output buffer is full (MASTER +** mode only) +** ERR_NOTAVAIL - The master device sends +** acknowledgment instead of no acknowledgment +** after the last byte transfer (SLAVE mode +** only) +** ERR_DISABLED - Device is disabled +** ERR_BUSOFF - Clock timeout elapsed (SLAVE +** mode only) +** =================================================================== +*/ +uint8_t McuSTM32HALI2C_SendBlock(void *Ptr, uint16_t Siz, uint16_t *Snt) +{ + HAL_StatusTypeDef res; + + res = HAL_I2C_Master_Transmit(McuSTM32HALI2C_device, McuSTM32HALI2C_slaveAddr, Ptr, Siz, HAL_MAX_DELAY); + if (res!=HAL_OK) { + return ERR_FAILED; + } + if (Snt!=NULL) { + *Snt = Siz; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : SendBlockContinue (component STM32CubeI2C) +** +** Description : +** Same is SendBlock() but does not send start condition. When +** working as a MASTER, this method writes 7 bits of slave +** address plus R/W bit = 0 to the I2C bus and then writes the +** block of characters to the bus. If the component is disabled +** (by the "Disable" method or initialization), the block is +** moved to the output buffer if the 'Output buffer size' +** property is different from zero. The content of the output +** buffer is sent immediately with the stop condition at the +** end when the component is enabled by the "Enable" method. +** After the output buffer transmission, the whole output +** buffer is cleared. The slave address must be specified +** before by the "SelectSlave" method or in component +** initialization section of 'Slave address init' property. +** When working as a SLAVE, this method writes block of +** characters to the bus. If the ERR_NOTAVAIL error code is +** returned, the whole block is successfully sent to a master +** but the master device responds by an acknowledgment instead +** of no acknowledgment sent at the end of the last block byte +** transfer. 'OnError' event is called in this case. +** Parameters : +** NAME - DESCRIPTION +** * Ptr - A pointer to the block of data to send +** Siz - The size of the block +** * Snt - A pointer to the number of data that are +** sent (copied to buffer) +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_BUSY - The slave device is busy, it +** does not respond by the acknowledgment +** (MASTER mode only) +** ERR_TXFULL - Output buffer is full (MASTER +** mode only) +** ERR_NOTAVAIL - The master device sends +** acknowledgment instead of no acknowledgment +** after the last byte transfer (SLAVE mode +** only) +** ERR_DISABLED - Device is disabled +** ERR_BUSOFF - Clock timeout elapsed (SLAVE +** mode only) +** =================================================================== +*/ +uint8_t McuSTM32HALI2C_SendBlockContinue(void *Ptr, uint16_t Siz, uint16_t *Snt) +{ + return ERR_OK; +} + +/* +** =================================================================== +** Method : RecvBlock (component STM32CubeI2C) +** +** Description : +** When working as a MASTER, this method writes 7 bits of slave +** address plus R/W bit = 1 to the I2C bus and then reads the +** block of characters from the bus. The slave address must be +** specified before by the "SelectSlave" method or in component +** initialization section of 'Slave address init' property. +** When working as a SLAVE, this method reads the block of +** characters from the bus. +** Parameters : +** NAME - DESCRIPTION +** * Ptr - A pointer to the block space for received +** data +** Siz - The size of the block +** * Rcv - A pointer to the number of actually +** received data +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_BUSY - The slave device is busy, it +** does not respond by the acknowledgment +** (MASTER mode only) +** ERR_DISABLED - Device is disabled +** ERR_BUSOFF - Clock timeout elapsed (SLAVE +** mode only) +** =================================================================== +*/ +uint8_t McuSTM32HALI2C_RecvBlock(void *Ptr, uint16_t Siz, uint16_t *Rcv) +{ + return ERR_OK; +} + +/* +** =================================================================== +** Method : SendStop (component STM32CubeI2C) +** +** Description : +** When working as a MASTER, if the 'Automatic stop condition' +** property value is 'no', this method sends a valid stop +** condition to the serial data line of the I2C bus to +** terminate the communication on the bus after using send +** methods. This method is enabled only if the component is in +** MASTER mode and 'Automatic stop condition' property value is +** 'no' +** Parameters : None +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_DISABLED - Device is disabled +** =================================================================== +*/ +uint8_t McuSTM32HALI2C_SendStop(void) +{ + return ERR_OK; +} + +/* +** =================================================================== +** Method : SelectSlave (component STM32CubeI2C) +** +** Description : +** When working as a MASTER, this method selects a new slave +** for communication by its slave address value. Any send or +** receive method are directed to or from the selected device, +** until a new slave device is selected by this method. If the +** selected slave uses 10-bit slave addressing, as the +** parameter 7 bits must be passed, which involves 10-bit +** addressing (11110XX), including two MSBs of slave address +** (XX). The second byte of the 10-bit slave address must be +** sent to the slave as a general character of send methods. +** This method is available only if the component is in MASTER +** mode. +** Parameters : +** NAME - DESCRIPTION +** Slv - Slave address value +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_DISABLED - Device is disabled +** =================================================================== +*/ +uint8_t McuSTM32HALI2C_SelectSlave(uint8_t Slv) +{ + McuSTM32HALI2C_slaveAddr = (uint8_t)(Slv<<1); + return ERR_OK; +} + +/* +** =================================================================== +** Method : GetSelected (component STM32CubeI2C) +** +** Description : +** When working as a MASTER, this method returns the +** identification address value of the slave, which is +** currently selected for communication with the master. If the +** current slave uses 10-bit slave addressing, the method +** returns the first 7 bits only, which involves 10-bit +** addressing (11110XX), including two MSBs of the slave +** address (XX). This method is not able to return the rest +** value of 10-bit slave address. This method is available only +** if the component is in MASTER mode. +** Parameters : +** NAME - DESCRIPTION +** * Slv - A pointer to the current selected slave +** address value +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** =================================================================== +*/ +uint8_t McuSTM32HALI2C_GetSelected(uint8_t *Slv) +{ + *Slv = (uint8_t)(McuSTM32HALI2C_slaveAddr>>1); + return ERR_OK; +} + +/* +** =================================================================== +** Method : Init (component STM32CubeI2C) +** +** Description : +** Initializes the associated peripheral(s) and the components +** internal variables. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuSTM32HALI2C_Init(void) +{ + McuSTM32HALI2C_slaveAddr = 0; + McuSTM32HALI2C_device = NULL; +} + +/* +** =================================================================== +** Method : Deinit (component STM32CubeI2C) +** +** Description : +** Driver de-initialization method. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuSTM32HALI2C_Deinit(void) +{ + McuSTM32HALI2C_slaveAddr = 0; + McuSTM32HALI2C_device = NULL; +} + +/* +** =================================================================== +** Method : SetDeviceHandle (component STM32CubeI2C) +** +** Description : +** Sets the HAL device handle. +** Parameters : +** NAME - DESCRIPTION +** handle - Pointer to I2C_HandleTypeDef +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuSTM32HALI2C_SetDeviceHandle(I2C_HandleTypeDef *handle) +{ + McuSTM32HALI2C_device = handle; + return ERR_OK; +} + +/* END McuSTM32HALI2C. */ +#endif /* McuLib_CONFIG_CPU_IS_STM32 */ /* only for STM32 */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuSTM32HALI2C.h b/TSM_PicoW_Sensor/McuLib/src/McuSTM32HALI2C.h new file mode 100644 index 0000000..ed924ce --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuSTM32HALI2C.h @@ -0,0 +1,438 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuSTM32HALI2C.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : STM32CubeI2C +** Version : Component 01.004, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2018-08-27, 17:24, # CodeGen: 349 +** Abstract : +** Driver for STM32CubMX HAL I2C library +** Settings : +** Component name : McuSTM32HALI2C +** SDK : McuLib +** Wait : McuWait +** Contents : +** SendChar - uint8_t McuSTM32HALI2C_SendChar(uint8_t Chr); +** RecvChar - uint8_t McuSTM32HALI2C_RecvChar(uint8_t *Chr); +** SendBlock - uint8_t McuSTM32HALI2C_SendBlock(void *Ptr, uint16_t Siz, uint16_t *Snt); +** SendBlockContinue - uint8_t McuSTM32HALI2C_SendBlockContinue(void *Ptr, uint16_t Siz, uint16_t... +** RecvBlock - uint8_t McuSTM32HALI2C_RecvBlock(void *Ptr, uint16_t Siz, uint16_t *Rcv); +** SendAck - void McuSTM32HALI2C_SendAck(bool Ack); +** SendStop - uint8_t McuSTM32HALI2C_SendStop(void); +** SelectSlave - uint8_t McuSTM32HALI2C_SelectSlave(uint8_t Slv); +** GetSelected - uint8_t McuSTM32HALI2C_GetSelected(uint8_t *Slv); +** SetDeviceHandle - uint8_t McuSTM32HALI2C_SetDeviceHandle(I2C_HandleTypeDef *handle); +** Deinit - void McuSTM32HALI2C_Deinit(void); +** Init - void McuSTM32HALI2C_Init(void); +** +** * Copyright (c) 2018, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuSTM32HALI2C.h +** @version 01.00 +** @brief +** Driver for STM32CubMX HAL I2C library +*/ +/*! +** @addtogroup McuSTM32HALI2C_module McuSTM32HALI2C module documentation +** @{ +*/ + +#ifndef __McuSTM32HALI2C_H +#define __McuSTM32HALI2C_H + +/* MODULE McuSTM32HALI2C. */ +#include "McuLib.h" /* SDK and API used */ +#if McuLib_CONFIG_CPU_IS_STM32 /* only for STM32 */ + +#include "McuSTM32HALI2Cconfig.h" /* configuration */ + + +#define McuSTM32HALI2C_RECVBLOCKCUSTOM_AVAILABLE (0) + /*!< Define which can be used to check if the function RecvBlockCustom() is available */ + +typedef enum McuSTM32HALI2C_EnumStartFlags_ { + McuSTM32HALI2C_SEND_START, /* Start is sent */ + McuSTM32HALI2C_DO_NOT_SEND_START /* Start is not sent */ +} McuSTM32HALI2C_EnumStartFlags; + +typedef enum McuSTM32HALI2C_EnumAckFlags_ { + McuSTM32HALI2C_SEND_LAST_ACK, /* Nack after last received byte is sent */ + McuSTM32HALI2C_DO_NOT_LAST_ACK /* Nack after last received byte is not sent */ +} McuSTM32HALI2C_EnumAckFlags; + +/* defines to be used for McuSTM32HALI2C_SendAck(); */ +#define McuSTM32HALI2C_ACK 0U +#define McuSTM32HALI2C_NOACK 1U + +void McuSTM32HALI2C_Init(void); +/* +** =================================================================== +** Method : Init (component STM32CubeI2C) +** +** Description : +** Initializes the associated peripheral(s) and the components +** internal variables. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuSTM32HALI2C_SendChar(uint8_t Chr); +/* +** =================================================================== +** Method : SendChar (component STM32CubeI2C) +** +** Description : +** When working as a MASTER, this method writes 7 bits of slave +** address plus R/W bit = 0 to the I2C bus and then writes one +** character (byte) to the bus. The slave address must be +** specified before by the "SelectSlave" method or in the +** component initialization section of 'Slave address init' +** property. When working as the SLAVE, this method writes one +** character (byte) to the bus. If the ERR_NOTAVAIL error code +** returned, the char is successfully sent to master but the +** master device responds by an acknowledgment instead of no +** acknowledgment at the end of transfer. 'OnError' event is +** called in this case. +** Parameters : +** NAME - DESCRIPTION +** Chr - Character to send +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_BUSY - The slave device is busy, it +** does not respond by the acknowledgment +** (MASTER mode only) +** ERR_NOTAVAIL - The master device sends +** acknowledgment instead of no acknowledgment +** after the last byte transfer (SLAVE mode +** only) +** ERR_DISABLED - Device is disabled +** ERR_BUSOFF - Clock timeout elapsed (SLAVE +** mode only) +** =================================================================== +*/ + +uint8_t McuSTM32HALI2C_RecvChar(uint8_t *Chr); +/* +** =================================================================== +** Method : RecvChar (component STM32CubeI2C) +** +** Description : +** When working as a MASTER, this method writes 7 bits of slave +** address plus R/W bit = 1 to the I2C bus and then reads one +** character (byte) from the bus. The slave address must be +** specified before by the "SelectSlave" method or in the +** component initialization section of 'Slave address init' +** property. When working as a SLAVE, this method reads one +** character (byte) from the bus. +** Parameters : +** NAME - DESCRIPTION +** * Chr - Pointer to received character +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_BUSY - The slave device is busy, it +** does not respond by the acknowledgment +** (MASTER mode only) +** ERR_DISABLED - Device is disabled +** ERR_BUSOFF - Clock timeout elapsed (SLAVE +** mode only) +** =================================================================== +*/ + +uint8_t McuSTM32HALI2C_SendBlock(void *Ptr, uint16_t Siz, uint16_t *Snt); +/* +** =================================================================== +** Method : SendBlock (component STM32CubeI2C) +** +** Description : +** When working as a MASTER, this method writes 7 bits of slave +** address plus R/W bit = 0 to the I2C bus and then writes the +** block of characters to the bus. If the component is disabled +** (by the "Disable" method or initialization), the block is +** moved to the output buffer if the 'Output buffer size' +** property is different from zero. The content of the output +** buffer is sent immediately with the stop condition at the +** end when the component is enabled by the "Enable" method. +** After the output buffer transmission, the whole output +** buffer is cleared. The slave address must be specified +** before by the "SelectSlave" method or in component +** initialization section of 'Slave address init' property. +** When working as a SLAVE, this method writes block of +** characters to the bus. If the ERR_NOTAVAIL error code is +** returned, the whole block is successfully sent to a master +** but the master device responds by an acknowledgment instead +** of no acknowledgment sent at the end of the last block byte +** transfer. 'OnError' event is called in this case. +** Parameters : +** NAME - DESCRIPTION +** * Ptr - A pointer to the block of data to send +** Siz - The size of the block +** * Snt - A pointer to the number of data that are +** sent (copied to buffer) +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_BUSY - The slave device is busy, it +** does not respond by the acknowledgment +** (MASTER mode only) +** ERR_TXFULL - Output buffer is full (MASTER +** mode only) +** ERR_NOTAVAIL - The master device sends +** acknowledgment instead of no acknowledgment +** after the last byte transfer (SLAVE mode +** only) +** ERR_DISABLED - Device is disabled +** ERR_BUSOFF - Clock timeout elapsed (SLAVE +** mode only) +** =================================================================== +*/ + +uint8_t McuSTM32HALI2C_RecvBlock(void *Ptr, uint16_t Siz, uint16_t *Rcv); +/* +** =================================================================== +** Method : RecvBlock (component STM32CubeI2C) +** +** Description : +** When working as a MASTER, this method writes 7 bits of slave +** address plus R/W bit = 1 to the I2C bus and then reads the +** block of characters from the bus. The slave address must be +** specified before by the "SelectSlave" method or in component +** initialization section of 'Slave address init' property. +** When working as a SLAVE, this method reads the block of +** characters from the bus. +** Parameters : +** NAME - DESCRIPTION +** * Ptr - A pointer to the block space for received +** data +** Siz - The size of the block +** * Rcv - A pointer to the number of actually +** received data +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_BUSY - The slave device is busy, it +** does not respond by the acknowledgment +** (MASTER mode only) +** ERR_DISABLED - Device is disabled +** ERR_BUSOFF - Clock timeout elapsed (SLAVE +** mode only) +** =================================================================== +*/ + +uint8_t McuSTM32HALI2C_SendStop(void); +/* +** =================================================================== +** Method : SendStop (component STM32CubeI2C) +** +** Description : +** When working as a MASTER, if the 'Automatic stop condition' +** property value is 'no', this method sends a valid stop +** condition to the serial data line of the I2C bus to +** terminate the communication on the bus after using send +** methods. This method is enabled only if the component is in +** MASTER mode and 'Automatic stop condition' property value is +** 'no' +** Parameters : None +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_DISABLED - Device is disabled +** =================================================================== +*/ + +uint8_t McuSTM32HALI2C_SelectSlave(uint8_t Slv); +/* +** =================================================================== +** Method : SelectSlave (component STM32CubeI2C) +** +** Description : +** When working as a MASTER, this method selects a new slave +** for communication by its slave address value. Any send or +** receive method are directed to or from the selected device, +** until a new slave device is selected by this method. If the +** selected slave uses 10-bit slave addressing, as the +** parameter 7 bits must be passed, which involves 10-bit +** addressing (11110XX), including two MSBs of slave address +** (XX). The second byte of the 10-bit slave address must be +** sent to the slave as a general character of send methods. +** This method is available only if the component is in MASTER +** mode. +** Parameters : +** NAME - DESCRIPTION +** Slv - Slave address value +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_DISABLED - Device is disabled +** =================================================================== +*/ + +uint8_t McuSTM32HALI2C_GetSelected(uint8_t *Slv); +/* +** =================================================================== +** Method : GetSelected (component STM32CubeI2C) +** +** Description : +** When working as a MASTER, this method returns the +** identification address value of the slave, which is +** currently selected for communication with the master. If the +** current slave uses 10-bit slave addressing, the method +** returns the first 7 bits only, which involves 10-bit +** addressing (11110XX), including two MSBs of the slave +** address (XX). This method is not able to return the rest +** value of 10-bit slave address. This method is available only +** if the component is in MASTER mode. +** Parameters : +** NAME - DESCRIPTION +** * Slv - A pointer to the current selected slave +** address value +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** =================================================================== +*/ + +uint8_t McuSTM32HALI2C_SendBlockContinue(void *Ptr, uint16_t Siz, uint16_t *Snt); +/* +** =================================================================== +** Method : SendBlockContinue (component STM32CubeI2C) +** +** Description : +** Same is SendBlock() but does not send start condition. When +** working as a MASTER, this method writes 7 bits of slave +** address plus R/W bit = 0 to the I2C bus and then writes the +** block of characters to the bus. If the component is disabled +** (by the "Disable" method or initialization), the block is +** moved to the output buffer if the 'Output buffer size' +** property is different from zero. The content of the output +** buffer is sent immediately with the stop condition at the +** end when the component is enabled by the "Enable" method. +** After the output buffer transmission, the whole output +** buffer is cleared. The slave address must be specified +** before by the "SelectSlave" method or in component +** initialization section of 'Slave address init' property. +** When working as a SLAVE, this method writes block of +** characters to the bus. If the ERR_NOTAVAIL error code is +** returned, the whole block is successfully sent to a master +** but the master device responds by an acknowledgment instead +** of no acknowledgment sent at the end of the last block byte +** transfer. 'OnError' event is called in this case. +** Parameters : +** NAME - DESCRIPTION +** * Ptr - A pointer to the block of data to send +** Siz - The size of the block +** * Snt - A pointer to the number of data that are +** sent (copied to buffer) +** Returns : +** --- - Error code, possible codes: +** ERR_OK - OK +** ERR_SPEED - This device does not work in +** the active speed mode +** ERR_BUSY - The slave device is busy, it +** does not respond by the acknowledgment +** (MASTER mode only) +** ERR_TXFULL - Output buffer is full (MASTER +** mode only) +** ERR_NOTAVAIL - The master device sends +** acknowledgment instead of no acknowledgment +** after the last byte transfer (SLAVE mode +** only) +** ERR_DISABLED - Device is disabled +** ERR_BUSOFF - Clock timeout elapsed (SLAVE +** mode only) +** =================================================================== +*/ + +void McuSTM32HALI2C_SendAck(bool Ack); +/* +** =================================================================== +** Method : SendAck (component STM32CubeI2C) +** +** Description : +** The method sends ACK to the bus. +** Parameters : +** NAME - DESCRIPTION +** Ack - If acknowledge is high or low +** Returns : Nothing +** =================================================================== +*/ + +void McuSTM32HALI2C_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component STM32CubeI2C) +** +** Description : +** Driver de-initialization method. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuSTM32HALI2C_SetDeviceHandle(I2C_HandleTypeDef *handle); +/* +** =================================================================== +** Method : SetDeviceHandle (component STM32CubeI2C) +** +** Description : +** Sets the HAL device handle. +** Parameters : +** NAME - DESCRIPTION +** handle - Pointer to I2C_HandleTypeDef +** Returns : +** --- - Error code +** =================================================================== +*/ + +/* END McuSTM32HALI2C. */ +#endif /* McuLib_CONFIG_CPU_IS_STM32 */ /* only for STM32 */ + +#endif +/* ifndef __McuSTM32HALI2C_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuSWO.c b/TSM_PicoW_Sensor/McuLib/src/McuSWO.c new file mode 100644 index 0000000..758de01 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuSWO.c @@ -0,0 +1,700 @@ +/* + * Copyright (c) 2021-2023, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuSWO.h" +#if McuSWO_CONFIG_HAS_SWO +#include "McuLib.h" +#include "McuUtility.h" +#include "McuShell.h" +#include "McuXFormat.h" +#include "board.h" +#include "pin_mux.h" +#include +#include +#if defined (__NEWLIB__) + #include +#endif +#if McuLib_CONFIG_CPU_IS_KINETIS + #include "fsl_clock.h" + #include "fsl_port.h" +#endif + +#if defined (__REDLIB__) && McuSWO_CONFIG_RETARGET_STDIO + #error "SWO standard I/O redirection does not work with RedLib: use newlib (none) or newlib-nano (none) instead" +#endif + +/* standard I/O handles */ +#define McuSWO_StdIn (0) +#define McuSWO_StdOut (1) +#define McuSWO_StdErr (2) + +static uint32_t SWO_traceClock; /* clock feed into the ARM CoreSight */ + +#define McuSWO_ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5) /* special pattern to indicate empty buffer */ + +volatile int32_t ITM_RxBuffer = McuSWO_ITM_RXBUFFER_EMPTY; /* implementation of buffer for Rx, must use this variable name as checked by the debugger */ + +static inline int32_t SWO_ReceiveChar(void) { + int32_t ch = EOF; /* EOF, no character available */ + + if (ITM_RxBuffer != McuSWO_ITM_RXBUFFER_EMPTY) { + ch = ITM_RxBuffer; + ITM_RxBuffer = McuSWO_ITM_RXBUFFER_EMPTY; /* mark it ready for next character */ + } + return ch; +} + +static inline bool SWO_WriteChar(char c, uint8_t portNo) { + volatile int timeout = 5000; /* arbitrary timeout value */ + while (ITM->PORT[portNo].u32 == 0) { + /* Wait until STIMx is ready, then send data */ + timeout--; + if (timeout==0) { + return false; /* not able to send */ + } + } + ITM->PORT[portNo].u8 = c; + return true; +} + +#if McuSWO_CONFIG_RETARGET_STDIO +static void SWO_WriteBuf(char *buf, size_t count, uint8_t portNo) { + while(count>0) { + SWO_WriteChar(*buf, portNo); + buf++; + count--; + } +} +#endif + +static inline bool SWO_Enabled(uint8_t portNo) { + /* Check if Trace Control Register (ITM->TCR at 0xE0000E80) is set */ + if ((ITM->TCR&ITM_TCR_ITMENA_Msk) == 0) { /* check Trace Control Register if ITM trace is enabled*/ + return false; /* not enabled? */ + } + /* Check if the requested channel stimulus port (ITM->TER at 0xE0000E00) is enabled */ + if ((ITM->TER & (1ul<stdOut, fmt, args); + va_end(args); + return count; +} + +bool McuSWO_StdIOKeyPressed(void) { + if (ITM_RxBuffer != McuSWO_ITM_RXBUFFER_EMPTY) { + return true; + } + return false; +} + +void McuSWO_StdIOReadChar(uint8_t *ch) { + int res; + + res = SWO_ReceiveChar(); + if (res==-1) { /* no character present */ + *ch = '\0'; + } else { + *ch = (uint8_t)res; /* return character */ + } +} + +uint8_t McuSWO_ReadAppendLine(unsigned char *buf, size_t bufSize) { + unsigned char ch; + + if (McuSWO_StdIOKeyPressed()) { /* character present? */ + McuSWO_stdio.stdIn(&ch); /* read character */ + if (ch!='\0') { /* still available? */ + McuUtility_chcat(buf, bufSize, ch); + if (ch=='\n') { + return ERR_OK; + } + } /* if */ + } /* if */ + return ERR_BUSY; /* not reached the end of line yet */ +} + +void McuSWO_ReadLineBlocking(unsigned char *buf, size_t bufSize) { + buf[0] = '\0'; /* init buffer */ + for(;;) { /* breaks */ + if (McuSWO_ReadAppendLine(buf, bufSize)==ERR_OK) { /* '\n' received */ + return; + } + } /* for */ +} + +#if McuSWO_CONFIG_RETARGET_STDIO +#if defined (__NEWLIB__) + int _close_r(struct _reent *p, int fd) { + return -1; /* 0: ok, -1 error. Because no file should have been opened, we return an error */ + } + + /* return the status of an open file */ + int _fstat_r(struct _reent *p, int fd, struct stat *stp) { + stp->st_mode = S_IFCHR; /* identify as character special device. This forces it as a one-byte-read device */ + return 0; /* ok */ + } + + /* checks if a descriptor is a file or a terminal (tty) */ + int _isatty_r(struct _reent *p, int fd) { + return 1; /* return 1 if fd is a terminal file descriptor, otherwise return 0 */ + } + + /* position the offset within file */ + int _lseek_r(struct _reent *p, int fd, int offset, int whence) { + return 0; /* return new position. Simply return 0 which implies the file is empty */ + } +#endif /* __NEWLIB__ */ + + void _kill(int pid, int sig) { + return; /* do nothing */ + } + + int _getpid(void) { + return -1; /* no process */ + } + +#if defined (__REDLIB__) + void __sys_appexit(void) { + for(;;) {} + } + + int __sys_seek(int fd, int pos) { + return 0; + } + + int __sys_flen(int fd) { + return 0; + } + + int __sys_istty(int fd) { + return 1; /* return 1 if fd is a terminal file descriptor, otherwise return 0 */ + } + + int __sys_readc(void) { + int32_t c = -1; + + if (!SWO_Enabled(McuSWO_CONFIG_TERMINAL_CHANNEL)) { + return -1; /* eof */ + } + return SWO_ReceiveChar(); + } + + int __sys_read(int file, char *buf, int len) { + *buf = __sys_readc(); + return 1; + } +#elif defined (__NEWLIB__) + int _read(int fd, char *buffer, int size) { + if(fd!=McuSWO_StdIn) { /* 0 is stdin */ + return EOF; /* failed */ + } + if (!SWO_Enabled(McuSWO_CONFIG_TERMINAL_CHANNEL)) { + return EOF; /* failed */ + } + /* only read a single byte */ + int32_t c; + do { + c = SWO_ReceiveChar(); + } while (c==EOF); /* blocking */ + *buffer = c; + return 1; /* number of bytes read */ + } +#endif /* newlib or redlib */ + +#endif /* McuSWO_CONFIG_RETARGET_STDIO */ + +#if McuSWO_CONFIG_RETARGET_STDIO + static void ReadLine_McuLib(unsigned char *buf, size_t bufSize) { + /* McuLib way: */ + McuSWO_SendStr((unsigned char*)"Enter some text and press ENTER:\n"); + McuSWO_ReadLineBlocking(buf, bufSize); + McuSWO_printf("Received:"); + McuSWO_SendStr(buf); + } + + static void ReadLine_getc(unsigned char *buf, size_t bufSize) { + int c; + size_t i = 0; + + /* C standard library way with getc() */ + memset(buf, 0, bufSize); /* initialize buffer */ + printf("getc: Enter some text and press ENTER:\n"); + do { + do { + c = getc(stdin); + } while(c==EOF); /* poll for input */ + if (i=20); + res = scanf("%20s%c", buf, &ch); /* note: ch for the newline */ + printf("scanf: %s, res: %d, ch:%d\n", buf, res, ch); + } + + static void TestStdOut(void) { + printf("Using printf(), putc and putchar with SWO\n"); + putc('*', stdout); + putc('#', stderr); + putchar('!'); + putchar('\n'); + } + + void McuSWO_TestStdio(void) { + unsigned char buf[64]; + + McuSWO_SendStr((unsigned char*)"Starting testing SWO ITM stdout redirection\n"); + TestStdOut(); + /* test varioud methods using stdin */ + ReadLine_McuLib(buf, sizeof(buf)); + ReadLine_getc(buf, sizeof(buf)); + ReadLine_getchar(buf, sizeof(buf)); + ReadLine_fgets(buf, sizeof(buf)); + ReadLine_scanf(buf, sizeof(buf)); + McuSWO_SendStr((unsigned char*)"Finished testing SWO ITM stdout redirection\n"); + } +#endif + +void McuSWO_StdIOSendChar(uint8_t ch) { + (void)SWO_WriteChar(ch, 0); +} + +/* default standard I/O struct */ +McuShell_ConstStdIOType McuSWO_stdio = { + (McuShell_StdIO_In_FctType)McuSWO_StdIOReadChar, /* stdin */ + (McuShell_StdIO_OutErr_FctType)McuSWO_StdIOSendChar, /* stdout */ + (McuShell_StdIO_OutErr_FctType)McuSWO_StdIOSendChar, /* stderr */ + McuSWO_StdIOKeyPressed /* if input is not empty */ + }; +uint8_t McuSWO_DefaultShellBuffer[McuShell_DEFAULT_SHELL_BUFFER_SIZE]; /* default buffer which can be used by the application */ + +McuShell_ConstStdIOTypePtr McuSWO_GetStdio(void) { + return &McuSWO_stdio; +} + +#if McuSWO_CONFIG_DO_MUXING +static void MuxSWOPin(void) { +#if McuLib_CONFIG_CPU_IS_LPC + CLOCK_EnableClock(kCLOCK_Iocon); + #if McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC55S16 + /* local settings copied from pin_mux.h: have them local here in case muxing is not done in Pins Tool */ + #define IOCON_PIO_ASW_DI_SWO 0x00u /*!<@brief Analog switch is open (disabled) */ + #define IOCON_PIO_DIGITAL_EN_SWO 0x0100u /*!<@brief Enables digital function */ + #define IOCON_PIO_FUNC6_SWO 0x06u /*!<@brief Selects pin function 6 */ + #define IOCON_PIO_INV_DI_SWO 0x00u /*!<@brief Input function is not inverted */ + #define IOCON_PIO_MODE_INACT_SWO 0x00u /*!<@brief No addition pin function */ + #define IOCON_PIO_OPENDRAIN_DI_SWO 0x00u /*!<@brief Open drain is disabled */ + #define IOCON_PIO_SLEW_STANDARD_SWO 0x00u /*!<@brief Standard mode, output slew rate control is enabled */ + + const uint32_t port0_pin10_config = (/* Pin is configured as SWO */ + IOCON_PIO_FUNC6_SWO | + /* No addition pin function */ + IOCON_PIO_MODE_INACT_SWO | + /* Standard mode, output slew rate control is enabled */ + IOCON_PIO_SLEW_STANDARD_SWO | + /* Input function is not inverted */ + IOCON_PIO_INV_DI_SWO | + /* Enables digital function */ + IOCON_PIO_DIGITAL_EN_SWO | + /* Open drain is disabled */ + IOCON_PIO_OPENDRAIN_DI_SWO | + /* Analog switch is open (disabled) */ + IOCON_PIO_ASW_DI_SWO); + /* PORT0 PIN10 (coords: 21) is configured as SWO */ + IOCON_PinMuxSet(IOCON, 0U, 10U, port0_pin10_config); + + #elif McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC55S69 + /* local settings copied from pin_mux.h: have them local here in case muxing is not done in Pins Tool */ + #define PIO0_10_FUNC_ALT6_SWO 0x06u + #define PIO0_10_DIGIMODE_DIGITAL_SWO 0x01u + + IOCON->PIO[0][10] = ((IOCON->PIO[0][10] & + /* Mask bits to zero which are setting */ + (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) + + /* Selects pin function. + * : PORT010 (pin 21) is configured as SWO. */ + | IOCON_PIO_FUNC(PIO0_10_FUNC_ALT6_SWO) + + /* Select Digital mode. + * : Enable Digital mode. + * Digital input is enabled. */ + | IOCON_PIO_DIGIMODE(PIO0_10_DIGIMODE_DIGITAL_SWO)); + #else + #error "NYI" + #endif +#elif McuLib_CONFIG_CPU_IS_KINETIS && McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_K64FN + /* Port A Clock Gate Control: Clock enabled */ + CLOCK_EnableClock(kCLOCK_PortA); + + /* PORTA2 (pin 36) is configured as TRACE_SWO */ + PORT_SetPinMux(PORTA, 2U, kPORT_MuxAlt7); + + PORTA->PCR[2] = ((PORTA->PCR[2] & + /* Mask bits to zero which are setting */ + (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_DSE_MASK | PORT_PCR_ISF_MASK))) + + /* Pull Select: Internal pulldown resistor is enabled on the corresponding pin, if the + * corresponding PE field is set. */ + | PORT_PCR_PS(kPORT_PullDown) + + /* Pull Enable: Internal pullup or pulldown resistor is not enabled on the corresponding pin. */ + | PORT_PCR_PE(kPORT_PullDisable) + + /* Drive Strength Enable: Low drive strength is configured on the corresponding pin, if pin + * is configured as a digital output. */ + | PORT_PCR_DSE(kPORT_LowDriveStrength)); +#else + #error "NYI" +#endif +} +#endif /* #if McuSWO_CONFIG_DO_MUXING */ + +static void SetSWOSpeed(uint32_t traceClockHz, uint32_t SWOSpeed) { + uint32_t SWOPrescaler = (traceClockHz / SWOSpeed) - 1; /* SWOSpeed in Hz, note that traceClockHz is expected to be match the CPU core clock */ + + TPI->ACPR = SWOPrescaler; /* "Async Clock Prescaler Register". Scale the baud rate of the asynchronous output */ +} + +#if McuSWO_CONFIG_SHELL_ENABLED +static void PrintRegHex(McuShell_ConstStdIOType *io, uint32_t regVal, const char *statusStr, const char *desc) { + uint8_t buf[48]; + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum32Hex(buf, sizeof(buf), regVal); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)desc); + McuShell_SendStatusStr((unsigned char*)statusStr, buf, io->stdOut); +} + +static uint8_t PrintStatus(McuShell_ConstStdIOType *io) { + uint8_t buf[72]; + + McuShell_SendStatusStr((const unsigned char*)"McuSWO", (const unsigned char*)"McuSWO module status\r\n", io->stdOut); + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"traceClock: "); + McuUtility_strcatNum32u(buf, sizeof(buf), SWO_traceClock); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" Hz, Baud: "); + McuUtility_strcatNum32u(buf, sizeof(buf), SWO_traceClock/(TPI->ACPR+1)); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((const unsigned char*)" Clocking", buf, io->stdOut); + + /* Core Debug */ + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum32Hex(buf, sizeof(buf), CoreDebug->DEMCR); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" (DEMCR)\r\n"); + McuShell_SendStatusStr((const unsigned char*)" CoreDebug", buf, io->stdOut); + + McuShell_SendStatusStr((const unsigned char*)" DWT", (const unsigned char*)"Data Watchpoint and Trace\r\n", io->stdOut); + /* DWT Trace Control register */ + PrintRegHex(io, DWT->CTRL, " CTRL", " (Control)\r\n"); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), (DWT->CTRL&DWT_CTRL_NUMCOMP_Msk)>>DWT_CTRL_NUMCOMP_Pos); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" NUMCOMP\r\n"); + McuShell_SendStatusStr((const unsigned char*)"", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), (DWT->CTRL&DWT_CTRL_PCSAMPLENA_Msk)>>DWT_CTRL_PCSAMPLENA_Pos); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" PCSAMPLENA\r\n"); + McuShell_SendStatusStr((const unsigned char*)"", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), (DWT->CTRL&DWT_CTRL_SYNCTAP_Msk)>>DWT_CTRL_SYNCTAP_Pos); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" SYNCTAP\r\n"); + McuShell_SendStatusStr((const unsigned char*)"", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), (DWT->CTRL&DWT_CTRL_CYCTAP_Msk)>>DWT_CTRL_CYCTAP_Pos); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" CYCTAP\r\n"); + McuShell_SendStatusStr((const unsigned char*)"", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), (DWT->CTRL&DWT_CTRL_POSTINIT_Msk)>>DWT_CTRL_POSTINIT_Pos); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" POSTINIT\r\n"); + McuShell_SendStatusStr((const unsigned char*)"", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), (DWT->CTRL&DWT_CTRL_POSTPRESET_Msk)>>DWT_CTRL_POSTPRESET_Pos); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" POSTPRESET\r\n"); + McuShell_SendStatusStr((const unsigned char*)"", buf, io->stdOut); + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), (DWT->CTRL&DWT_CTRL_CYCCNTENA_Msk)>>DWT_CTRL_CYCCNTENA_Pos); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" CYCCNTENA\r\n"); + McuShell_SendStatusStr((const unsigned char*)"", buf, io->stdOut); + + /* ITM registers */ + McuShell_SendStatusStr((const unsigned char*)" ITM", (const unsigned char*)"Instrumentation Trace Macrocell\r\n", io->stdOut); + PrintRegHex(io, ITM->TER, " TER", " (trace enable stimulus ports)\r\n"); + PrintRegHex(io, ITM->TPR, " TPR", " (trace privilege)\r\n"); + PrintRegHex(io, ITM->TCR, " TCR", " (trace control)\r\n"); + PrintRegHex(io, ITM->LSR, " LSR", " (lock status)\r\n"); +#if McuLib_CONFIG_CORTEX_M==33 + PrintRegHex(io, ITM->DEVARCH, " DEVARCH", " (device architecture, M33 only)\r\n"); +#endif + PrintRegHex(io, ITM->PID0, " PID0", " (peripheral identification 0)\r\n"); + PrintRegHex(io, ITM->PID1, " PID1", " (peripheral identification 1)\r\n"); + PrintRegHex(io, ITM->PID2, " PID2", " (peripheral identification 2)\r\n"); + PrintRegHex(io, ITM->PID3, " PID3", " (peripheral identification 3)\r\n"); + PrintRegHex(io, ITM->PID4, " PID4", " (peripheral identification 4)\r\n"); + PrintRegHex(io, ITM->PID5, " PID5", " (peripheral identification 5)\r\n"); + PrintRegHex(io, ITM->PID6, " PID6", " (peripheral identification 6)\r\n"); + PrintRegHex(io, ITM->PID7, " PID8", " (peripheral identification 7)\r\n"); + PrintRegHex(io, ITM->CID0, " CID0", " (component identification 0)\r\n"); + PrintRegHex(io, ITM->CID1, " CID1", " (component identification 1)\r\n"); + PrintRegHex(io, ITM->CID2, " CID2", " (component identification 2)\r\n"); + PrintRegHex(io, ITM->CID3, " CID3", " (component identification 3)\r\n"); + + /* TPI: Trace Port Interface */ + McuShell_SendStatusStr((const unsigned char*)" TPI", (const unsigned char*)"Trace Port Interface\r\n", io->stdOut); + PrintRegHex(io, TPI->SSPSR, " SSPSR", " (Supported Parallel Port Size)\r\n"); + PrintRegHex(io, TPI->CSPSR, " CSPSR", " (Current Parallel Port Size)\r\n"); + PrintRegHex(io, TPI->ACPR, " ACPR", " (Asynchronous Clock Prescaler)\r\n"); + PrintRegHex(io, TPI->SPPR, " SPPR", " (Selected Pin Protocol)\r\n"); + PrintRegHex(io, TPI->FFSR, " FFSR", " (Formatter and Flush Status)\r\n"); + PrintRegHex(io, TPI->FFCR, " FFSR", " (Formatter and Flush Control)\r\n"); +#if McuLib_CONFIG_CORTEX_M==33 + PrintRegHex(io, TPI->PSCR, " PSCR", " (Periodic Synchronization Control)\r\n"); +#endif + PrintRegHex(io, TPI->TRIGGER, " TRIGGER", " (Trigger)\r\n"); +#if McuLib_CONFIG_CORTEX_M==33 + PrintRegHex(io, TPI->ITFTTD0, " ITFTTD0", " (Integration Test FIFO Test Data 0)\r\n"); +#endif + PrintRegHex(io, TPI->ITATBCTR2, " ITATBCTR2", " (Integration Test ATB Control 2)\r\n"); + PrintRegHex(io, TPI->ITATBCTR0, " ITATBCTR0", " (Integration Test ATB Control 0)\r\n"); +#if McuLib_CONFIG_CORTEX_M==33 + PrintRegHex(io, TPI->ITFTTD1, " ITFTTD1", " (Integration Test FIFO Test Data 1)\r\n"); +#endif + PrintRegHex(io, TPI->ITCTRL, " ITCTRL", " (Integration Mode Control)\r\n"); + PrintRegHex(io, TPI->CLAIMSET, " CLAIMSET", " (Claim tag set)\r\n"); + PrintRegHex(io, TPI->CLAIMCLR, " CLAIMCLR", " (Claim tag clear)\r\n"); + PrintRegHex(io, TPI->DEVID, " DEVID", " (Device Configuration)\r\n"); + PrintRegHex(io, TPI->DEVTYPE, " DEVTYPE", " (Device Type Identifier)\r\n"); + return ERR_OK; +} + +static uint8_t PrintHelp(McuShell_ConstStdIOType *io) { + McuShell_SendHelpStr((unsigned char*)"McuSWO", (const unsigned char*)"Group of McuSWO commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (const unsigned char*)"Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" baud [clockHz]", (const unsigned char*)"Set baud based on optional clock speed\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" send ", (const unsigned char*)"Send string\r\n", io->stdOut); + return ERR_OK; +} + +uint8_t McuSWO_ParseCommand(const uint8_t *cmd, bool *handled, McuShell_ConstStdIOType *io) { + const unsigned char *p; + + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, "McuSWO help")==0) { + *handled = TRUE; + return PrintHelp(io); + } else if ((McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) || (McuUtility_strcmp((char*)cmd, "McuSWO status")==0)) { + *handled = TRUE; + return PrintStatus(io); + } else if (McuUtility_strncmp((char*)cmd, "McuSWO baud ", sizeof("McuSWO baud ")-1)==0) { + int32_t val = 0; + uint32_t clock = 0, baud = 0; + + *handled = TRUE; + p = cmd + sizeof("McuSWO baud ")-1; + if (McuUtility_xatoi(&p, &val)!=ERR_OK || val<0) { + return ERR_FAILED; + } + baud = val; + if (*p!='\0') { /* clock? */ + if (McuUtility_xatoi(&p, &val)!=ERR_OK || val<0) { + return ERR_FAILED; + } + clock = val; + } else { /* take default */ + clock = SWO_traceClock; + } + SetSWOSpeed(clock, baud); + } else if (McuUtility_strncmp((char*)cmd, "McuSWO send ", sizeof("McuSWO send ")-1)==0) { + *handled = TRUE; + p = cmd + sizeof("McuSWO send ")-1; + PrintString(p, McuSWO_CONFIG_TERMINAL_CHANNEL); + PrintString((unsigned char*)"\r\n", McuSWO_CONFIG_TERMINAL_CHANNEL); + } + return ERR_OK; /* no error */ +} +#endif /* McuSWO_CONFIG_SHELL_ENABLED */ + +/*! + * \brief Initialize the SWO trace port for debug message printing + * \param portBits Port bit mask to be configured + * \param cpuCoreFreqHz CPU core clock frequency in Hz + */ +static void Init(uint32_t traceClockHz, uint32_t SWOSpeed, uint32_t port) { +#if McuSWO_CONFIG_DO_MUXING + /* Enables the clock for the I/O controller: Enable Clock. */ + MuxSWOPin(); +#endif +#if McuSWO_CONFIG_DO_CLOCKING + #if McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CPU_IS_LPC55xx + /*!< Set up dividers */ + CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false); /*!< Set AHBCLKDIV divider to value 1 */ + CLOCK_SetClkDiv(kCLOCK_DivArmTrClkDiv, 0U, true); /*!< Reset TRACECLKDIV divider counter and halt it */ + CLOCK_SetClkDiv(kCLOCK_DivArmTrClkDiv, 1U, false); /*!< Set TRACECLKDIV divider to value 1 */ + + /*!< Switch TRACE to TRACE_DIV */ + CLOCK_AttachClk(kTRACE_DIV_to_TRACE); + #endif +#endif +#if McuSWO_CONFIG_DO_SWO_INIT +#if 1 /* new initialization */ + CoreDebug->DEMCR = CoreDebug_DEMCR_TRCENA_Msk; + if ((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk) == 0U) { + assert(false); + } + ITM->LAR = 0xC5ACCE55U; /* ITM Lock Access Register, C5ACCE55 enables more write access to Control Register 0xE00 :: 0xFFC */ + ITM->TER &= ~(1UL << port); /* ITM Trace Enable Register. Enabled tracing on stimulus ports. One bit per stimulus port. Disable it */ + ITM->TCR = 0U; /* ITM Trace Control Register */ + TPI->SPPR = 0x2; /* "Selected PIN Protocol Register": Select which protocol to use for trace output (2: SWO NRZ (UART), 1: SWO Manchester encoding) */ + SetSWOSpeed(traceClockHz, SWOSpeed); /* set baud rate with prescaler */ + ITM->TPR = 0U; /* allow unprivileged access */ + ITM->TCR = ITM_TCR_ITMENA_Msk | ITM_TCR_SYNCENA_Msk /* enable ITM */ + #ifdef ITM_TCR_TraceBusID_Msk + | ITM_TCR_TraceBusID_Msk + #elif defined(ITM_TCR_TRACEBUSID_Msk) + | ITM_TCR_TRACEBUSID_Msk + #endif + | ITM_TCR_SWOENA_Msk | ITM_TCR_DWTENA_Msk; + ITM->TER = 1UL << port; /* enable the port bits */ +#else /* old */ + CoreDebug->DEMCR = CoreDebug_DEMCR_TRCENA_Msk; /* enable trace in core debug */ + TPI->SPPR = 0x2; /* "Selected PIN Protocol Register": Select which protocol to use for trace output (2: SWO NRZ (UART), 1: SWO Manchester encoding) */ + SetSWOSpeed(traceClockHz, SWOSpeed); /* set baud rate */ + ITM->LAR = 0xC5ACCE55; /* ITM Lock Access Register, C5ACCE55 enables more write access to Control Register 0xE00 :: 0xFFC */ + /* enable trace with the TCR: this includes DWT and ITM packets to be sent */ + ITM->TCR = ITM_TCR_DWTENA_Msk | ITM_TCR_ITMENA_Msk | ITM_TCR_TRACEBUSID_Msk | ITM_TCR_SWOENA_Msk | ITM_TCR_SYNCENA_Msk; /* ITM Trace Control Register */ + ITM->TPR = ITM_TPR_PRIVMASK_Msk; /* ITM Trace Privilege Register */ + ITM->TER = portBits; /* ITM Trace Enable Register. Enabled tracing on stimulus ports. One bit per stimulus port. */ + DWT->CTRL = /* see https://interrupt.memfault.com/blog/profiling-firmware-on-cortex-m#enabling-pc-sampling-with-itm-and-openocd */ + ( 4<FFCR = (1< +#if McuSemihost_CONFIG_LOG_ENABLED + #include "McuLog.h" +#endif + +#if McuSemihost_CONFIG_IS_ENABLED +/* + * ARM Semihosting operations, see https://developer.arm.com/documentation/dui0471/g/Semihosting + * See https://github.com/cnoviello/mastering-stm32/blob/master/nucleo-f411RE/system/include/arm/semihosting.h + * See https://wiki.segger.com/Semihosting + * "SEGGER J-Link GDB Server V7.86c" has been used. + */ +typedef enum McuSemihost_Op_e { + McuSemihost_Op_SYS_OPEN = 0x01, /* open a file */ + McuSemihost_Op_SYS_CLOSE = 0x02, /* close a file */ + McuSemihost_Op_SYS_WRITEC = 0x03, /* write a character byte, pointed to by R1: not implemented by PEMICRO */ + McuSemihost_Op_SYS_WRITE0 = 0x04, /* writes a null terminated string. R1 points to the first byte, not supported by PEMICRO */ + McuSemihost_Op_SYS_WRITE = 0x05, /* write data to a file */ + McuSemihost_Op_SYS_READ = 0x06, /* read data from a file: not implemented reading from stdin by PEMICRO */ + McuSemihost_Op_SYS_READC = 0x07, /* read a character from stdin: not implemented by PEMICRO */ + McuSemihost_Op_SYS_ISERROR = 0x08, /* Determines whether the return code from another semihosting call is an error status or not. */ + McuSemihost_Op_SYS_ISTTY = 0x09, /* check if it is a TTY */ + McuSemihost_Op_SYS_SEEK = 0x0A, /* move current file position */ + + McuSemihost_Op_SYS_FLEN = 0x0C, /* tell the file length */ +#if McuSemihost_CONFIG_HAS_SYS_TMPNAME + McuSemihost_Op_SYS_TMPNAME = 0x0D, /* get a temporary file handle. Not implemented by SEGGER for security reasons. */ +#endif +#if McuSemihost_CONFIG_HAS_SYS_REMOVE + McuSemihost_Op_SYS_REMOVE = 0x0E, /* remove a file. Not implemented by SEGGER for security reasons. */ +#endif +#if McuSemihost_CONFIG_HAS_SYS_RENAME + McuSemihost_Op_SYS_RENAME = 0x0F, /* rename a file. Not implemented by SEGGER for security reasons. */ +#endif + McuSemihost_Op_SYS_CLOCK = 0x10, /* returns the number of centi-seconds since execution started */ + McuSemihost_Op_SYS_TIME = 0x11, /* time in seconds since Jan 1st 1970 */ +#if !(McuSemihost_CONFIG_DEBUG_CONNECTION==McuSemihost_DEBUG_CONNECTION_SEGGER) + McuSemihost_Op_SYS_SYSTEM = 0x12, /* Passes a command to the host command-line interpreter. Not implemented by SEGGER for security reasons. */ +#endif + McuSemihost_Op_SYS_ERRNO = 0x13, /* get the current error number*/ + + McuSemihost_Op_SYS_GET_CMDLINE = 0x15, /* Returns the command line used for the call to the executable */ + McuSemihost_Op_SYS_HEAPINFO = 0x16, /* Returns the system stack and heap parameters. */ + McuSemihost_Op_SYS_ENTER_SVC = 0x17, /* Sets the processor to Supervisor mode and disables all interrupts */ + McuSemihost_Op_SYS_EXCEPTION = 0x18, /* Exit application */ + + McuSemihost_Op_SYS_ELLAPSED = 0x30, /* Returns the number of elapsed target ticks since execution started. */ + McuSemihost_Op_SYS_TICKFREQ = 0x31, /* Returns the tick frequency. */ + +#if McuSemihost_CONFIG_DEBUG_CONNECTION==McuSemihost_DEBUG_CONNECTION_SEGGER + McuSemihost_Op_SYS_IS_CONNECTED = 0x00, /* check if debugger is connected: note that this is not implemented with GDB server */ +#endif +#if 0 && McuSemihost_CONFIG_DEBUG_CONNECTION==McuSemihost_DEBUG_CONNECTION_SEGGER /* documented by SEGGER, but not implemented? */ + McuSemihost_Op_SYS_WRITEF = 0x40, /* write a printf-style string, but formatting is on the host: seems not be implemented with GDB server */ +#endif +} McuSemihost_Op_e; + +#if McuSemihost_CONFIG_INIT_STDIO_HANDLES + static int McuSemihost_tty_handles[3]; /* stdin, stdout and stderr */ +#endif + +#if McuSemihost_CONFIG_LOG_ENABLED + #define McuSemihost_log(...) McuLog_log(McuLog_TRACE, __BASE_FILE__, __LINE__, __VA_ARGS__) +#else + #define McuSemihost_log(...) do{}while(0) +#endif + +int McuSemihost_Read(int handle, unsigned char *data, size_t nofBytes) { + #if McuSemihost_CONFIG_INIT_STDIO_HANDLES + if (handleMcuSemihost_STDERR) { + return EOF; + } + return McuSemihost_SysFileRead(McuSemihost_tty_handles[handle], data, nofBytes); /* blocking! */ + #else + return EOF; + #endif +} + +bool McuSemihost_StdIOKeyPressed(void) { + return false; /* \todo */ +} + +void McuSemihost_StdIOReadChar(uint8_t *ch) { + int res; + + res = McuSemihost_SysReadC(); + if (res==-1) { /* no character present */ + *ch = '\0'; + } else { + *ch = (uint8_t)res; /* return character */ + } +} + +#if McuSemihost_CONFIG_USE_BUFFERED_IO + static unsigned char io_buf[McuSemihost_CONFIG_BUFFER_IO_SIZE] = ""; + static size_t io_bufIdx = 0; /* index into io_buf */ +#endif +uint8_t McuSemihost_DefaultShellBuffer[McuShell_DEFAULT_SHELL_BUFFER_SIZE]; /* default buffer which can be used by the application */ + +/* default standard I/O struct */ +McuShell_ConstStdIOType McuSemihost_stdio = { + (McuShell_StdIO_In_FctType)McuSemihost_StdIOReadChar, /* stdin */ + (McuShell_StdIO_OutErr_FctType)McuSemihost_StdIOSendChar, /* stdout */ + (McuShell_StdIO_OutErr_FctType)McuSemihost_StdIOSendChar, /* stderr */ + McuSemihost_StdIOKeyPressed /* if input is not empty */ + }; + +void McuSemihost_StdIOFlush(void) { + io_buf[io_bufIdx] = '\0'; +#if McuSemihost_CONFIG_DEBUG_CONNECTION==McuSemihost_DEBUG_CONNECTION_PYOCD + McuSemihost_SysFileWrite(McuSemihost_STDOUT+1, io_buf, io_bufIdx); /* for pyOCD, need to write to handle 2???? */ +#else + McuSemihost_WriteString0(io_buf); +#endif + io_bufIdx = 0; +} + +void McuSemihost_StdIOSendChar(uint8_t ch) { +#if McuSemihost_CONFIG_USE_BUFFERED_IO + + io_buf[io_bufIdx++] = ch; + if ( io_bufIdx==sizeof(io_buf)-1 /* buffer full */ + #if !McuSemihost_CONFIG_BUFFER_IO_FLUSH + || ch=='\n' /* newline: flush buffer */ + #endif + ) + { + McuSemihost_StdIOFlush(); + } +#else + (void)McuSemihost_WriteChar(ch); +#endif +} + +McuShell_ConstStdIOTypePtr McuSemihost_GetStdio(void) { + return &McuSemihost_stdio; +} + +int McuSemihost_WriteChar(char ch) { + McuSemihost_StdIOSendChar(ch); + return 0; /* success */ +} + +static inline int __attribute__ ((always_inline)) McuSemihost_HostRequest(int reason, void *arg) { + int value; + __asm volatile ( + "mov r0, %[rsn] \n" /* place semihost operation code into R0 */ + "mov r1, %[arg] \n" /* R1 points to the argument array */ + #if 0 && McuSemihost_CONFIG_DEBUG_CONNECTION==McuSemihost_DEBUG_CONNECTION_SEGGER + "mov r2, #0 \n" /* J-Link needs R2 initialized too? */ + #endif + "bkpt 0xAB \n" /* call debugger */ + "mov %[val], r0 \n" /* debugger has stored result code in R0 */ + + : [val] "=r" (value) /* outputs */ + : [rsn] "r" (reason), [arg] "r" (arg) /* inputs */ + : "r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc" /* clobber */ + ); + return value; /* return result code, stored in R0 */ +} + +#if McuSemihost_CONFIG_DEBUG_CONNECTION == McuSemihost_DEBUG_CONNECTION_SEGGER +/*! + * \brief Checks if the debugger is connected. Only supported for SEGGER + * \return true if a J-Link is connected + */ +int McuSemihost_SeggerIsConnected(void) { + /* note: SEGGER documents the op code 0x0 (SysIsConnected), but with V7.68 it reports that it is not supported? + * WARNING: Unsupported semihosting functionality (R0 = 0x00). + */ + return McuSemihost_HostRequest(McuSemihost_Op_SYS_IS_CONNECTED, NULL)==1; /* result is 1 if connected */ +} +#endif + +int McuSemihost_SysHostTime(void) { + int res; + res = McuSemihost_HostRequest(McuSemihost_Op_SYS_TIME, NULL); + McuSemihost_log("SYS_TIME: %d", res); + return res; +} + +int McuSemihost_SysHostClock(void) { + int res; + res = McuSemihost_HostRequest(McuSemihost_Op_SYS_CLOCK, NULL); + McuSemihost_log("SYS_CLOCK: %d", res); + return res; +} + +#if McuSemihost_CONFIG_CUT_FILENAME_PREFIX +static const unsigned char *cutOffPrefix(const unsigned char *filename, const unsigned char *prefix) { + size_t prefixLen = McuUtility_strlen((char*)prefix); + if (McuUtility_strncmp(filename, prefix, prefixLen)==0) { + return filename+prefixLen; /* skip prefix */ + } + return filename; +} +#endif + +int McuSemihost_SysFileOpen(const unsigned char *filename, int mode) { + int32_t param[3]; + int res; + +#if McuSemihost_CONFIG_CUT_FILENAME_PREFIX + filename = cutOffPrefix(filename, McuSemihost_CONFIG_CUT_FILENAME_PREFIX_STR); +#endif + param[0] = (int32_t)filename; + param[1] = mode; + param[2] = McuUtility_strlen((char*)filename); + res = McuSemihost_HostRequest(McuSemihost_Op_SYS_OPEN, ¶m[0]); + McuSemihost_log("SYS_OPEN '%s', mode:%d: %d", filename, mode, res); + return res; +} + +int McuSemihost_SysFileClose(int fh) { + int32_t param; + int res; + + param = fh; + res = McuSemihost_HostRequest(McuSemihost_Op_SYS_CLOSE, ¶m); + McuSemihost_log("SYS_CLOSE fh:%d: %d", fh, res); + return res; +} + +int McuSemihost_SysFileRead(int fh, unsigned char *data, size_t nofBytes) { + int32_t param[3]; + int res; + + param[0] = fh; + param[1] = (int32_t)data; + param[2] = nofBytes; + res = McuSemihost_HostRequest(McuSemihost_Op_SYS_READ, ¶m[0]); + McuSemihost_log("SYS_READ fh:%d nof:%d: %d", fh, nofBytes, res); + return res; +} + +int McuSemihost_SysFileWrite(int fh, const unsigned char *data, size_t nofBytes) { + int32_t param[3]; + int res; + + param[0] = fh; + param[1] = (int32_t)data; + param[2] = nofBytes; + res = McuSemihost_HostRequest(McuSemihost_Op_SYS_WRITE, ¶m[0]); + McuSemihost_log("SYS_WRITE fh:%d nof:%d: %d", fh, nofBytes, res); + return res; +} + +#if McuSemihost_CONFIG_HAS_SYS_REMOVE +/* J-Link denies this with + * ERROR: Semi hosting error: SYS_REMOVE: Target tries to remove file. Declined for security reasons. + * PyOCD reports: + * 0039753 W Semihost: unimplemented request pc=3120 r0=e r1=2000fef4 [semihost] + */ +int McuSemihost_SysFileRemove(const unsigned char *filePath) { + int32_t param[2]; + int res; + + param[0] = (int32_t)filePath; + param[1] = McuUtility_strlen((char*)filePath); + res = McuSemihost_HostRequest(McuSemihost_Op_SYS_REMOVE, ¶m[0]); + McuSemihost_log("SYS_REMOVE '%s': %d", filePath, res); + return res; +} +#endif + +#if McuSemihost_CONFIG_HAS_SYS_RENAME +/* J-Link denies this with + * ERROR: Semi hosting error: SYS_RENAME: Target tries to rename file. Declined for security reasons. + * PyOCD reports: + * 0039579 W Semihost: unimplemented request pc=316a r0=f r1=2000feec [semihost] + */ +int McuSemihost_SysFileRename(const unsigned char *filePath, const unsigned char *fileNewPath) { + int32_t param[4]; + int res; + + param[0] = (int32_t)filePath; + param[1] = McuUtility_strlen((char*)filePath); + param[2] = (int32_t)fileNewPath; + param[3] = McuUtility_strlen((char*)fileNewPath); + res = McuSemihost_HostRequest(McuSemihost_Op_SYS_RENAME, ¶m[0]); + McuSemihost_log("SYS_RENAME '%s'->'%s': %d", filePath, fileNewPath, res); + return res; +} +#endif + +int McuSemihost_SysFileLen(int fh) { + int32_t param; + int res; + + param = fh; + res = McuSemihost_HostRequest(McuSemihost_Op_SYS_FLEN, ¶m); + McuSemihost_log("SYS_FLEN fh:%d: %d", fh, res); + return res; +} + +int McuSemihost_SysFileSeek(int fh, int pos) { + int32_t param[2]; + int res; + + param[0] = fh; + param[1] = pos; + res = McuSemihost_HostRequest(McuSemihost_Op_SYS_SEEK, ¶m[0]); + McuSemihost_log("SYS_SEEK fh:%d pos:%d: %d", fh, pos, res); + return res; +} + +#if McuSemihost_CONFIG_HAS_SYS_TMPNAME +int McuSemihost_SysTmpName(uint8_t fileID, unsigned char *buffer, size_t bufSize) { + int32_t param[3]; + int res; + + param[0] = (int32_t)buffer; + param[1] = fileID; + param[2] = bufSize; + res = McuSemihost_HostRequest(McuSemihost_Op_SYS_TMPNAME, ¶m[0]); + McuSemihost_log("SYS_TMPNAME f:%d, size:%d: %d", fileID, bufSize, res); + return res; +} +#endif + +int McuSemihost_ReadLine(unsigned char *buf, size_t bufSize, bool echo) { + int c; /* character from semihosting */ + int i = 0; /* cursor position in string */ + + if (bufSize<2) { + return 0; /* buffer size needs room for at least two bytes: '\n' and '\0' */ + } + do { + c = McuSemihost_SysReadC(); /* first call is blocking until user presses enter. Then it returns each character on each iteration, until '\n' */ + if (echo) { + McuSemihost_SysWriteC(c); /* echo the character */ + } + if (i=0), negative for error + */ +int McuSemihost_WriteF(const unsigned char *format, va_list *arg) { + int32_t param[2]; + + param[0] = (int32_t)format; + param[1] = (int32_t)arg; + return McuSemihost_HostRequest(McuSemihost_Op_SYS_WRITEF, ¶m[0]); +} +#endif +#endif + +#if 0 && McuSemihost_CONFIG_DEBUG_CONNECTION==McuSemihost_DEBUG_CONNECTION_SEGGER /* SEGGER has not implemented this */ +int McuSemihost_WriteFormatted(const unsigned char *format, ...) { + va_list va; + int res; + + va_start(va, format); + res = McuSemihost_WriteF(format, &va); + va_end(va); + return res; +} +#endif + +unsigned McuSemihost_printf(const char *fmt, ...) { + va_list args; + unsigned int count = 0; + + va_start(args,fmt); + count = McuXFormat_xvformat(McuShell_printfPutChar, (void*)McuSemihost_GetStdio()->stdOut, fmt, args); + va_end(args); + return count; +} + +uint8_t McuSemihost_GetTimeDateFromHost(TIMEREC *time, DATEREC *date, int offsetHour) { + int secs = McuSemihost_SysHostTime(); /* using SYS_TIME */ + if (secs<=0) { + return ERR_FAILED; + } + McuTimeDate_UnixSecondsToTimeDateCustom(secs, offsetHour, time, date, 1970); + return ERR_OK; +} + +/*------------------------------------------------------------------------------*/ +static int TestFileOperations(void) { + int fh; + char buf[24]; + unsigned char data[32]; + const unsigned char *testFileName = (const unsigned char*)"c:\\tmp\\semihosting.txt"; + int res = 0; /* 0: ok, -1: failed */ + + McuSemihost_WriteString((unsigned char*)"SYS_OPEN: Open and create file "); + McuSemihost_WriteString((unsigned char*)testFileName); + McuSemihost_WriteString((unsigned char*)"\n"); + fh = McuSemihost_SysFileOpen(testFileName, SYS_FILE_MODE_WRITEREADBINARY); + if (fh == -1) { + McuSemihost_WriteString((unsigned char*)"SYS_OPEN: failed\n"); + res = -1; /* failed */ + } else { + if (McuSemihost_SysErrNo()) { /* SYS_OPEN was successful, so should not report an error here */ + McuSemihost_WriteString((unsigned char*)"Failed SYS_ERRNO after file operation\n"); + res = -1; /* failed */ + } + if (McuSemihost_SysIsTTY(fh)) { + McuSemihost_WriteString((unsigned char*)"Failed SYS_ISTTY for a file\n"); + res = -1; /* failed */ + } + McuSemihost_WriteString((unsigned char*)"SYS_OPEN: OK\n"); + if (McuSemihost_SysIsTTY(fh)==0) { + McuSemihost_WriteString((unsigned char*)"SYS_ISTTY: OK\n"); + } else { + McuSemihost_WriteString((unsigned char*)"SYS_ISTTY: failed\n"); + res = -1; /* failed */ + } + if (McuSemihost_SysFileClose(fh)==0) { + McuSemihost_WriteString((unsigned char*)"SYS_CLOSE: OK\n"); + } else { + McuSemihost_WriteString((unsigned char*)"SYS_CLOSE: Failed\n"); + res = -1; /* failed */ + } + } + + /* writing to file */ + McuSemihost_WriteString((unsigned char*)"SYS_WRITE: Write to file "); + McuSemihost_WriteString((unsigned char*)testFileName); + McuSemihost_WriteString((unsigned char*)"\n"); + fh = McuSemihost_SysFileOpen(testFileName, SYS_FILE_MODE_WRITEREADBINARY); + if (fh == -1) { + McuSemihost_WriteString((unsigned char*)"SYS_OPEN: failed\n"); + } else { + const unsigned char *msg = (const unsigned char*)"test file write 0123456789ABCDEF Hello World!"; + if (McuSemihost_SysFileWrite(fh, msg, strlen((char*)msg)) != 0) { + McuSemihost_WriteString((unsigned char*)"SYS_WRITE: failed\n"); + res = -1; /* failed */ + } else { + McuSemihost_WriteString((unsigned char*)"SYS_WRITE OK\n"); + } + McuSemihost_SysFileClose(fh); + } + + /* read from file */ + McuSemihost_WriteString((unsigned char*)"SYS_READ: Read from file "); + McuSemihost_WriteString((unsigned char*)testFileName); + McuSemihost_WriteString((unsigned char*)"\n"); + fh = McuSemihost_SysFileOpen(testFileName, SYS_FILE_MODE_READ); + if (fh == -1) { + McuSemihost_WriteString((unsigned char*)"SYS_OPEN failed\n"); + res = -1; /* failed */ + } else { + int r; + + memset(data, 0, sizeof(data)); /* initialize data */ + r = McuSemihost_SysFileRead(fh, data, sizeof(data)); + if (r==0) { /* success */ + unsigned char b[8]; + McuSemihost_WriteString((unsigned char*)"SYS_READ: OK, data:\n"); + for(int i=0; i= 0) { + McuSemihost_printf("SYS_FLEN: file size: %d\n", r); + } else { + McuSemihost_WriteString((unsigned char*)"SYS_FLEN failed\n"); + res = -1; /* failed */ + } + McuSemihost_SysFileClose(fh); + } + +#if McuSemihost_CONFIG_HAS_SYS_RENAME + { + const unsigned char *newFileName = (const unsigned char*)"c:\\tmp\\copy.txt"; + /* renaming a file */ + McuSemihost_WriteString((unsigned char*)"SYS_RENAME: rename file "); + McuSemihost_WriteString((unsigned char*)testFileName); + McuSemihost_WriteString((unsigned char*)" to "); + McuSemihost_WriteString((unsigned char*)newFileName); + McuSemihost_WriteString((unsigned char*)"\n"); + if (McuSemihost_SysFileRename(testFileName, newFileName) != 0) { + McuSemihost_WriteString((unsigned char*)"SYS_RENAME failed\n"); + } else { + McuSemihost_WriteString((unsigned char*)"SYS_RENAME OK\n"); + } + } +#endif + +#if McuSemihost_CONFIG_HAS_SYS_REMOVE + { + const unsigned char *newFileName = (const unsigned char*)"c:\\tmp\\testremove.txt"; + /* removing a file */ + McuSemihost_WriteString((unsigned char*)"SYS_REMOVE: remove file "); + McuSemihost_WriteString((unsigned char*)newFileName); + McuSemihost_WriteString((unsigned char*)"\n"); + fh = McuSemihost_SysFileOpen(newFileName, SYS_FILE_MODE_WRITEREADBINARY); /* create file, if it does not exist */ + if (fh == -1) { + McuSemihost_WriteString((unsigned char*)"SYS_OPEN: failed\n"); + res = -1; /* failed */ + } else { + if (McuSemihost_SysFileClose(fh)!=0) { /* close the file we have open above */ + McuSemihost_WriteString((unsigned char*)"failed closing file\n"); + res = -1; /* failed */ + } + if (McuSemihost_SysFileRemove(newFileName) != 0) { + McuSemihost_WriteString((unsigned char*)"SYS_REMOVE failed\n"); + } else { + McuSemihost_WriteString((unsigned char*)"SYS_REMOVE OK\n"); + } + } + } +#endif + +#if McuSemihost_CONFIG_INIT_STDIO_HANDLES + /* writing to stdout */ + McuSemihost_WriteString((unsigned char*)"Writing to stdout:\n"); + const unsigned char *testString = (const unsigned char*)"this is a test\n"; + if (McuSemihost_SysFileWrite(McuSemihost_tty_handles[McuSemihost_STDOUT], testString, McuUtility_strlen((char*)testString))!=0) { + McuSemihost_WriteString((unsigned char*)"Failed writing to stdout!\n"); + res = -1; + } + + /* writing to stderr */ + McuSemihost_WriteString((unsigned char*)"Writing to stderr:\n"); + if (McuSemihost_SysFileWrite(McuSemihost_tty_handles[McuSemihost_STDERR], testString, McuUtility_strlen((char*)testString))!=0) { + McuSemihost_WriteString((unsigned char*)"Failed writing to stderr!\n"); + res = -1; + } + /* reading from stdin */ +#if McuSemihost_CONFIG_DEBUG_CONNECTION!=McuSemihost_DEBUG_CONNECTION_PEMICRO + McuSemihost_WriteString((unsigned char*)"Reading from stdin: enter 3 character\n"); + if (McuSemihost_SysFileRead(McuSemihost_tty_handles[McuSemihost_STDIN], data, 3)!=0) { + McuSemihost_WriteString((unsigned char*)"Failed reading from stdin!\n"); + res = -1; + } else { + McuSemihost_WriteString((unsigned char*)"you entered: "); + McuSemihost_WriteChar(data[0]); + McuSemihost_WriteChar(data[1]); + McuSemihost_WriteChar(data[2]); + McuSemihost_WriteChar('\n'); + } +#else + McuSemihost_WriteString((unsigned char*)"Reading from stdin: not implemented by PEMICRO\n"); +#endif + +#endif + +#if McuSemihost_CONFIG_HAS_SYS_TMPNAME + { + unsigned char buffer[64]; + + res = McuSemihost_SysTmpName(0, buffer, sizeof(buffer)); /* note: Ozone declines this operation for security reasons */ + } +#endif + return res; +} + +static int ConsoleInputOutput(void) { + /* test of console input and output */ + int res = 0; + +#if McuSemihost_CONFIG_INIT_STDIO_HANDLES + /* Note: + * J-Link returns -256 for all handles, but 0, 1 and 2 are used + * Linkserver returns 0, 1 and 2 + * PyPCD returns 1, 2, and 3 and expects them + */ + const int expectedHandles[3] = { + #if McuSemihost_CONFIG_DEBUG_CONNECTION==McuSemihost_DEBUG_CONNECTION_PYOCD + 1, 2, 3 + #else + 0, 1, 2 + #endif + }; + if (McuSemihost_tty_handles[McuSemihost_STDIN]!=expectedHandles[McuSemihost_STDIN]) { + McuSemihost_printf("Expecting %d for stdin handle, but is %d?\n", McuSemihost_STDIN, McuSemihost_tty_handles[McuSemihost_STDIN]); + res = -1; /* failed */ + } + if (McuSemihost_tty_handles[McuSemihost_STDOUT]!=expectedHandles[McuSemihost_STDOUT]) { + McuSemihost_printf("Expecting %d for stdout handle, but is %d?\n", McuSemihost_STDOUT, McuSemihost_tty_handles[McuSemihost_STDOUT]); + res = -1; /* failed */ + } + if (McuSemihost_tty_handles[McuSemihost_STDERR]!=expectedHandles[McuSemihost_STDERR]) { + McuSemihost_printf("Expecting %d for stderr handle, but is %d?\n", McuSemihost_STDERR, McuSemihost_tty_handles[McuSemihost_STDERR]); + res = -1; /* failed */ + } + for(int i=0; i:\n"); /* writing zero terminated string */ + do { + c = McuSemihost_SysReadC(); + } while(c<0); + McuSemihost_WriteString((unsigned char*)"You typed: "); + McuSemihost_WriteChar(c); + McuSemihost_WriteChar('\n'); +#if McuSemihost_CONFIG_INIT_STDIO_HANDLES + unsigned char dummy[16]; /* the input is buffered and delivered only if the user presses enter. So there might be more characters in the stream: read them */ + (void)McuSemihost_SysFileRead(McuSemihost_tty_handles[McuSemihost_STDIN], dummy, sizeof(dummy)); +#endif + +#endif + return res; +} + +int McuSemiHost_Test(void) { + unsigned char buf[64]; + TIMEREC time; + DATEREC date; + int value; + int result = 0; + +#if McuSemihost_CONFIG_DEBUG_CONNECTION==McuSemihost_DEBUG_CONNECTION_GENERIC + McuSemihost_WriteString((unsigned char*)"Connection: Generic\n"); +#elif McuSemihost_CONFIG_DEBUG_CONNECTION==McuSemihost_DEBUG_CONNECTION_SEGGER + McuSemihost_WriteString((unsigned char*)"Connection: SEGGER J-Link\n"); +#elif McuSemihost_CONFIG_DEBUG_CONNECTION==McuSemihost_DEBUG_CONNECTION_LINKSERVER + McuSemihost_WriteString((unsigned char*)"Connection: NXP Linkserver\n"); +#elif McuSemihost_CONFIG_DEBUG_CONNECTION==McuSemihost_DEBUG_CONNECTION_PEMICRO + McuSemihost_WriteString((unsigned char*)"Connection: PEMICRO\n"); +#elif McuSemihost_CONFIG_DEBUG_CONNECTION==McuSemihost_DEBUG_CONNECTION_PYOCD + McuSemihost_WriteString((unsigned char*)"Connection: PyOCD\n"); +#else + #error "unknown connection" +#endif +#if McuSemihost_CONFIG_DEBUG_CONNECTION==McuSemihost_DEBUG_CONNECTION_SEGGER + if (McuSemihost_SeggerIsConnected()) { /* SEGGER specific extension */ + McuSemihost_WriteString((unsigned char*)"SYS_IS_CONNECTED: J-Link connected\n"); + } else { + McuSemihost_WriteString((unsigned char*)"SYS_IS_CONNECTED: J-Link NOT connected, failed\n"); + result = -1; /* failed */ + } +#endif + + McuSemihost_WriteString((unsigned char*)"SYS_WRITE0 with strings:\n"); + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"hello world with SYS_WRITE0\n"); + McuSemihost_WriteString0(buf); + /* empty string */ + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)" deadbeef\n"); + buf[0] = '\0'; + McuSemihost_WriteString0(buf); /* SYS_WRITE0 with a empty string fails for J-LINK */ + + + const unsigned char *txt = (unsigned char*)"SYS_WRITEC test\n"; + + while(*txt!='\0') { + McuSemihost_SysWriteC(*txt); /* using SYS_WRITEC */ + txt++; + } + + int secs = McuSemihost_SysHostTime(); /* using SYS_TIME */ + McuTimeDate_UnixSecondsToTimeDateCustom(secs, -1 /* winter time */, &time, &date, 1970); + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"SYS_TIME: time: "); + McuTimeDate_AddTimeString(buf, sizeof(buf), &time, (unsigned char*)McuTimeDate_CONFIG_DEFAULT_TIME_FORMAT_STR); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" "); + McuTimeDate_AddDateString(buf, sizeof(buf), &date, (unsigned char*)McuTimeDate_CONFIG_DEFAULT_DATE_FORMAT_STR); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\n"); + McuSemihost_WriteString(buf); + + value = McuSemihost_SysHostClock(); /* using SYS_CLOCK */ + if (value>=0) { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char *)"SYS_CLOCK: Execution time: "); + McuUtility_strcatNum32s(buf, sizeof(buf), value); + McuUtility_strcat(buf, sizeof(buf), (unsigned char *)" centi-seconds\n"); + McuSemihost_WriteString(buf); + } else { + McuSemihost_WriteString((unsigned char*)"SYS_CLOCK: failed\n"); + result = -1; /* failed */ + } + if (ConsoleInputOutput()!=0) { + McuSemihost_WriteString((unsigned char*)"McuSemihost console I/O operations: FAILED!\n"); + result = -1; /* failed */ + } + if (TestFileOperations()!=0) { + McuSemihost_WriteString((unsigned char*)"McuSemihost file operations: FAILED!\n"); + result = -1; /* failed */ + } + + if (McuSemihost_SysIsError(0)!=0) { /* returns 0 for 'no error' */ + McuSemihost_WriteString((unsigned char*)"SYS_ERRNO: 0 should not be error!\n"); + result = -1; /* failed */ + } + if (!McuSemihost_SysIsError(1)) { /* returns 0 for 'no error' */ + McuSemihost_WriteString((unsigned char*)"SYS_ERRNO: 1 should be error!\n"); + result = -1; /* failed */ + } + if (!McuSemihost_SysIsError(-1)) { /* returns 0 for 'no error' */ + McuSemihost_WriteString((unsigned char*)"SYS_ERRNO: -1 should be error!\n"); + result = -1; /* failed */ + } + + memset(buf, 0, sizeof(buf)); /* init buffer */ + if (McuSemihost_SysGetCmdLine(buf, sizeof(buf))==0) { + McuSemihost_WriteString((unsigned char*)"arg: "); + McuSemihost_WriteString(buf); + McuSemihost_WriteString((unsigned char*)"\n"); + } else { + McuSemihost_WriteString((unsigned char*)"SYS_GET_CMDLINE FAILED!\n"); + } + + { + McuSemihost_HeapInfo_t heapInfo; + + if (McuSemihost_SysHeapInfo(&heapInfo)!=0) { + McuSemihost_WriteString((unsigned char*)"SYS_HEAPINFO FAILED\n"); + } else { + McuSemihost_WriteString((unsigned char*)"SYS_HEAPINFO success!\n"); + } + } +#if McuSemihost_CONFIG_DEBUG_CONNECTION!=McuSemihost_DEBUG_CONNECTION_SEGGER + { + int freq = McuSemihost_SysTickFreq(); + if (freq==-1) { + McuSemihost_WriteString((unsigned char*)"McuSemihost SYS_TICKFREQ: debugger does not know it.\n"); + } else { + McuSemihost_printf("McuSemihost SYS_TICKFREQ: %d\n", freq); + } + } +#endif +#if McuSemihost_CONFIG_DEBUG_CONNECTION!=McuSemihost_DEBUG_CONNECTION_SEGGER && McuSemihost_CONFIG_DEBUG_CONNECTION!=McuSemihost_DEBUG_CONNECTION_LINKSERVER + /* not supported by SEGGER and LinkServer */ + { + int32_t val = McuSemihost_SysEnterSVC(); + if (val!=0) { + McuSemihost_WriteString((unsigned char*)"McuSemihost ENTER_SVC failed?!\n"); + } + } +#else + McuSemihost_WriteString((unsigned char*)"McuSemihost: ENTER_SVC not supported!\n"); +#endif + +#if McuSemihost_CONFIG_DEBUG_CONNECTION==McuSemihost_DEBUG_CONNECTION_LINKSERVER /* fails in MCUXpresso 11.7.0, check with later versions */ + McuSemihost_WriteString((unsigned char*)"McuSemihost: SYS_EXCEPTION does not work with LinkServer\n"); +#else + McuSemihost_WriteString((unsigned char*)"McuSemihost: SYS_EXCEPTION, going to exit debugger!\n"); + McuSemihost_SysException(McuSemihost_ADP_Stopped_ApplicationExit); /* note: will exit application! */ +#endif + + if (result!=0) { + McuSemihost_WriteString((unsigned char*)"McuSemihost: some tests FAILED!\n"); + } else { + McuSemihost_WriteString((unsigned char*)"McuSemihost: all tests OK!\n"); + } + McuSemihost_WriteString((unsigned char*)"McuSemihost: Finished test!\n"); + return result; +} +/*--------------------------------------------------------------------------------------*/ +#if McuSemihost_CONFIG_RETARGET_STDLIB +void _kill(int pid, int sig) { + return; /* do nothing */ +} + +int _getpid(void) { + return -1; /* no process */ +} + +void _exit(const int status) { + /* do nothing */ + McuSemihost_SysException(McuSemihost_ADP_Stopped_ApplicationExit); /* exit application */ + for(;;){} /* _exit is market with 'no-return' */ +} + +#include // ENOMEM +#include "McuRTOSconfig.h" // configLINKER_HEAP_LIMIT_SYMBOL +#include "McuRTOS.h" + +/* sbrk implementation from FreeRTOS heap_6 */ +#ifndef NDEBUG + static int totalBytesProvidedBySBRK = 0; +#endif +extern char configLINKER_HEAP_BASE_SYMBOL, configLINKER_HEAP_LIMIT_SYMBOL, configLINKER_HEAP_SIZE_SYMBOL; // make sure to define these symbols in linker command file +static int heapBytesRemaining = (int)&configLINKER_HEAP_SIZE_SYMBOL; // that's (&__HeapLimit)-(&__HeapBase) + +//! sbrk/_sbrk version supporting reentrant newlib (depends upon above symbols defined by linker control file). +char *sbrk(int incr) { + static char *currentHeapEnd = &configLINKER_HEAP_BASE_SYMBOL; +#if McuLib_CONFIG_SDK_USE_FREERTOS + vTaskSuspendAll(); // Note: safe to use before FreeRTOS scheduler started +#endif +#if configUSE_SEGGER_SYSTEM_VIEWER_HOOKS && configUSE_SEGGER_SYSTEM_VIEWER_HEAP_EVENTS /* << EST */ + if (currentHeapEnd == &configLINKER_HEAP_BASE_SYMBOL && incr!=0) { + /* first call */ + SEGGER_SYSVIEW_HeapDefine(&configLINKER_HEAP_BASE_SYMBOL, &configLINKER_HEAP_BASE_SYMBOL, (int)&configLINKER_HEAP_SIZE_SYMBOL, 0); + SEGGER_SYSVIEW_NameResource(&configLINKER_HEAP_BASE_SYMBOL, "heapNewLib"); + } +#endif + char *previousHeapEnd = currentHeapEnd; + if (currentHeapEnd + incr > &configLINKER_HEAP_LIMIT_SYMBOL) { + #if(McuLib_CONFIG_SDK_USE_FREERTOS && configUSE_MALLOC_FAILED_HOOK == 1 ) + { + extern void configUSE_MALLOC_FAILED_HOOK_NAME( void ); + configUSE_MALLOC_FAILED_HOOK_NAME(); + } + #elif 0 + // If you want to alert debugger or halt... + while(1) { __asm("bkpt #0"); }; // Stop in GUI as if at a breakpoint (if debugging, otherwise loop forever) + #else + // If you prefer to believe your application will gracefully trap out-of-memory... + _impure_ptr->_errno = ENOMEM; // newlib's thread-specific errno + #if McuLib_CONFIG_SDK_USE_FREERTOS + xTaskResumeAll(); + #endif + #endif + return (char *)-1; // the malloc-family routine that called sbrk will return 0 + } + currentHeapEnd += incr; + heapBytesRemaining -= incr; + #ifndef NDEBUG + totalBytesProvidedBySBRK += incr; + #endif + #if McuLib_CONFIG_SDK_USE_FREERTOS + xTaskResumeAll(); + #endif + return (char *) previousHeapEnd; +} + +char *_sbrk(int incr) { + return sbrk(incr); +} +#endif + +void McuSemiHost_Deinit(void) { +#if McuSemihost_CONFIG_INIT_STDIO_HANDLES +#if McuSemihost_CONFIG_DEBUG_CONNECTION!=McuSemihost_DEBUG_CONNECTION_SEGGER /* SEGGER does not really allocate those handles? So cannot close them. */ + for(int i=0; i +#include +#include "McuTimeDate.h" +#include "McuShell.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define McuSemihost_STDIN 0 /*!< handle for standard input */ +#define McuSemihost_STDOUT 1 /*!< handle for standard output */ +#define McuSemihost_STDERR 2 /*!< handle for standard error */ + +extern int McuSemihost_Read(int handle, unsigned char *data, size_t nofBytes); + +extern uint8_t McuSemihost_DefaultShellBuffer[McuShell_DEFAULT_SHELL_BUFFER_SIZE]; + /*!< default buffer which can be used by the application or shell */ + +extern McuShell_ConstStdIOType McuSemihost_stdio; + /*!< Default standard I/O handler, can be used for a shell intergration */ + +/*! + * \brief Return the SWO stdio handle + * \return Standard I/O handle + */ +McuShell_ConstStdIOTypePtr McuSemihost_GetStdio(void); + +/*! + * \brief Flush the standard I/O output. Needed if using McuSemihost_CONFIG_BUFFER_IO_FLUSH. + */ +void McuSemihost_StdIOFlush(void); + +/*! + * \brief Write a character to the stdout console. + * \param ch Character to write + * \return always zero for success + */ +int McuSemihost_WriteChar(char ch); + +/*! + * \brief Return the current system time + * \return System time in seconds since 1970 + */ +int McuSemihost_SysHostTime(void); + +/*! + * \brief Return the number of centi-seconds the executable is running + * \return -1 for error, otherwise the number of centi-seconds of the execution + */ +int McuSemihost_SysHostClock(void); + +/* File modes for McuSemihost_FileOpen() */ +#define SYS_FILE_MODE_READ 0 /* Open the file for reading "r" */ +#define SYS_FILE_MODE_READBINARY 1 /* Open the file for reading "rb" */ +#define SYS_FILE_MODE_READWRITE 2 /* Open the file for reading and writing "r+" */ +#define SYS_FILE_MODE_READWRITEBINARY 3 /* Open the file for reading and writing "r+b" */ +#define SYS_FILE_MODE_WRITE 4 /* Open and truncate or create the file for writing "w" */ +#define SYS_FILE_MODE_WRITEBINARY 5 /* Open and truncate or create the file for writing "wb" */ +#define SYS_FILE_MODE_WRITEREAD 6 /* Open and truncate or create the file for writing and reading "w+" */ +#define SYS_FILE_MODE_WRITEREADBINARY 7 /* Open and truncate or create the file for writing and reading "w+b" */ +#define SYS_FILE_MODE_APPEND 8 /* Open or create the file for writing "a" */ +#define SYS_FILE_MODE_APPENDBINARY 9 /* Open or create the file for writing "ab" */ +#define SYS_FILE_MODE_APPENDREAD 10 /* Open or create the file for writing and reading "a+" */ +#define SYS_FILE_MODE_APPENDREADBINARY 11 /* Open or create the file for writing and reading "a+b" */ + +/*! + * \brief Open a file on the host + * \param filename + * \param mode + * \return -1 if failed, otherwise file handle + */ +int McuSemihost_SysFileOpen(const unsigned char *filename, int mode); + +/*! + * \brief Closes a file handle + * \param fh File handle previously opened + * \return 0: ok, otherwise -1 if failed + */ +int McuSemihost_SysFileClose(int fh); + +/*! + * \brief Read from a file + * \param fh File handle + * \param data Pointer where to store the data + * \param nofBytes Number of bytes to read + * \return 0: success. If it is nofBytes, then the call has failed and the end of the file has been reached. If smaller than nofBytes, then the buffer has not been filled. + */ +int McuSemihost_SysFileRead(int fh, unsigned char *data, size_t nofBytes); + +/*! + * \brief Write data to a file + * \param fh File handle + * \param data Pointer to data + * \param nofBytes Number of data bytes to write + * \return 0 for success, in error case the number of bytes not written + */ +int McuSemihost_SysFileWrite(int fh, const unsigned char *data, size_t nofBytes); + +#if McuSemihost_CONFIG_HAS_SYS_REMOVE +/*! + * \brief Remove a file on the host + * \param filePath Name and path of the file to remove + */ +int McuSemihost_SysFileRemove(const unsigned char *filePath); +#endif + +#if McuSemihost_CONFIG_HAS_SYS_RENAME +/*! + * \brief Rename a file on the host + * \param filePath Name and path of the source file + * \param fileNewPath Name and path of new file + */ +int McuSemihost_SysFileRename(const unsigned char *filePath, const unsigned char *fileNewPath); +#endif + +/*! + * \brief Return the length of a file + * \param fh File handle + * \return Current length of the file, -1 for an error + */ +int McuSemihost_SysFileLen(int fh); + +/*! + * \brief Seeks for a specified position in a file + * \param fh File handle + * \param pos Target position. Seeking outside of the size of the file is undefined + * \return 0 for success, negative for an error. McuSemihost_Op_SYS_ERRNO can be used to read the error value. + */ +int McuSemihost_SysFileSeek(int fh, int pos); + +#if McuSemihost_CONFIG_HAS_SYS_TMPNAME +/*! + * \brief Returns a temporary name for a file identified by a system file identifier. + * \param fileID target identifier for the file name. Must be in the range 0..255 + * \param buffer Pointer where to store the file name + * \param bufSize Buffer size in bytes + * \return 0 for success, -1 for an error + */ +int McuSemihost_SysTmpName(uint8_t fileID, unsigned char *buffer, size_t bufSize); +#endif + +/*! + * \brief Read a character using SYS_READC + * \return The character read + */ +int McuSemihost_SysReadC(void); + +/*! + * \brief Write a character using the SYS_WRITEC call. + * \param ch Character to write + * \return zero for success + */ +int McuSemihost_SysWriteC(char ch); + + +/*! + * \brief Decides if a file handle is a standard io handle or not. + * \param fg File handle + * \return 1 if it a interactive device, 0 if not, any other value is an error + */ +int McuSemihost_SysIsTTY(int fh); + +/*! + * \brief Determines whether the return code from another semihosting call is an error status or not. + * \param errorCode Return code from a previous semihosting call + * \return 0 if it is not an error, non-zero if it is an error + */ +int McuSemihost_SysIsError(int32_t errorCode); + +/*! + * \brief Returns the value of the C library errno variable associated with the host implementation of the semihosting. + * The errno variable gets set by calls file operations, but others too. + * \return The value of the host errno variable. + */ +int McuSemihost_SysErrNo(void); + +/*! + * \brief Returns the command line used for the call to the executable, that is, argc and argv. + * \return 0 for success, -1 for error + */ +int McuSemihost_SysGetCmdLine(unsigned char *cmd, size_t cmdSize); + +typedef struct McuSemihost_HeapInfo_t { + uint32_t heap_base; + uint32_t heap_limit; + uint32_t stack_base; + uint32_t stack_limit; +} McuSemihost_HeapInfo_t; + +/*! + * \brief Returns the system stack and heap parameters. + * \param heapInfo Pointer to heap info to be filled in + * \return 0 for success, non-zero otherwise + */ +int McuSemihost_SysHeapInfo(McuSemihost_HeapInfo_t *heapInfo); + +/*! + * \brief Sets the processor to supervisor mode and disables all interrupts + * \return address to be called to return to user mode. + */ +int McuSemihost_SysEnterSVC(void); + +typedef enum McuSemihost_Exception_e { + McuSemihost_ADP_Stopped_ApplicationExit = 0x20026, /* exit target application */ +} McuSemihost_Exception_e; + +/*! + * \brief Raises one of predefined excetptions to the debugger + * \param exception Exception to be raised + * \return 0 for success, non-zero otherwise + */ +int McuSemihost_SysException(McuSemihost_Exception_e exception); + +/*! + * \brief Return the tick frequency + * \return Tick frequency, -1 if debugger does not know the value of one tick + */ +int McuSemihost_SysTickFreq(void); + +/*! + * \brief Reads a line from user input. Call is blocking, and user has to press enter. + * Buffer will be always zero terminated. A '\r' at the end will be converted to '\n'. + * Backspace ('\b') in the input will be converted and handled. + * Buffer will have a '\n' at the end with a zero byte, so buffer needs to have at least a size of 2. + * \param buf Buffer to store the user input. If buffer is too small, excess characters are not stored in it and discarded. + * \param bufSize Size of the buffer + * \param echo If characters shall be printed as echo + * \return Number of characters stored in the buffer. + */ +int McuSemihost_ReadLine(unsigned char *buf, size_t bufSize, bool echo); + +/*! + * \brief Write a zero byte terminated character array (string) to stdout, using buffering. + * \param str String, zero byte terminated + * \return 0: ok, -1 error + */ +int McuSemihost_WriteString(const unsigned char *str); + +/*! + * \brief Write a zero byte terminated character array without buffering directly to the debugger. + * \param str String, zero byte terminated + * \return 0: ok, -1 error + */ +int McuSemihost_WriteString0(const unsigned char *str); + +/*! + * \brief Sending a character to the SWO/ITM console + * \param ch Character to send + */ +void McuSemihost_StdIOSendChar(uint8_t ch); + +/*! + * \brief Reads a character from the standard input + * \param ch Pointer where to store the character, stores '\0' if no character was received + */ +void McuSemihost_StdIOReadChar(uint8_t *ch); + +/*! + * \brief Checks if there is input from SWO/ITM console + * \return true if there is input, false otherwise + */ +bool McuSemihost_StdIOKeyPressed(void); + +/*! + * \brief 'printf'-style writing with semihosting + * \param fmt Format string + * \return Number of characters written + */ +unsigned McuSemihost_printf(const char *fmt, ...); + +/*! + * \brief Get the date and time from the host + * \param time Pointer to where to store the time information + * \param date Pointer to where to store the date information + * \param offsetHour Pass -1 if during wintertime + * \return ERR_OK if ok, error code otherwise + */ +uint8_t McuSemihost_GetTimeDateFromHost(TIMEREC *time, DATEREC *date, int offsetHour); + +/*! + * \brief Testing the semihost functionality and API + * \return 0 for success, -1 for error + */ +int McuSemiHost_Test(void); + +/*! + * \brief Module de-initialization + */ +void McuSemiHost_Deinit(void); + +/*! + * \brief Module initialization + */ +void McuSemiHost_Init(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MCUSEMIHOST_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuShell.c b/TSM_PicoW_Sensor/McuLib/src/McuShell.c new file mode 100644 index 0000000..1e55798 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuShell.c @@ -0,0 +1,1630 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuShell.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : Shell +** Version : Component 01.115, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2025-01-16, 10:11, # CodeGen: 850 +** Abstract : +** Module implementing a command line shell. +** Settings : +** Component name : McuShell +** Echo : no +** Prompt : "CMD> " +** Project Name : My Project Name +** Silent Mode Prefix : # +** Buffer Size : 48 +** Blocking Send : Enabled +** Wait : McuWait +** Timeout (ms) : 20 +** Wait Time (ms) : 5 +** RTOS Wait : yes +** Status Colon Pos : 13 +** Help Semicolon Pos : 26 +** Multi Command : Disabled +** Utility : McuUtility +** Default Serial : Disabled +** Semaphore : no +** Critical Section : McuCriticalSection +** History : no +** Kinetis SDK : McuLib +** Contents : +** PrintPrompt - void McuShell_PrintPrompt(McuShell_ConstStdIOType *io); +** SendNum8u - void McuShell_SendNum8u(uint8_t val, McuShell_StdIO_OutErr_FctType io); +** SendNum8s - void McuShell_SendNum8s(int8_t val, McuShell_StdIO_OutErr_FctType io); +** SendNum16u - void McuShell_SendNum16u(uint16_t val, McuShell_StdIO_OutErr_FctType io); +** SendNum16s - void McuShell_SendNum16s(int16_t val, McuShell_StdIO_OutErr_FctType io); +** SendNum32u - void McuShell_SendNum32u(uint32_t val, McuShell_StdIO_OutErr_FctType io); +** SendNum32s - void McuShell_SendNum32s(int32_t val, McuShell_StdIO_OutErr_FctType io); +** SendCh - void McuShell_SendCh(uint8_t ch, McuShell_StdIO_OutErr_FctType io); +** SendStr - void McuShell_SendStr(const uint8_t *str, McuShell_StdIO_OutErr_FctType io); +** PrintMemory - uint8_t McuShell_PrintMemory(void *hndl, uint32_t startAddr, uint32_t... +** printfIO - unsigned McuShell_printfIO(McuShell_ConstStdIOType *io, const char *fmt, ...); +** printf - unsigned McuShell_printf(const char *fmt, ...); +** SendData - void McuShell_SendData(const uint8_t *data, uint16_t dataSize,... +** PrintStatus - uint8_t McuShell_PrintStatus(McuShell_ConstStdIOType *io); +** ParseCommand - uint8_t McuShell_ParseCommand(const uint8_t *cmd, bool *handled,... +** IsHistoryCharacter - bool McuShell_IsHistoryCharacter(uint8_t ch, uint8_t *cmdBuf, size_t... +** ProcessConsoleInput - int McuShell_ProcessConsoleInput(char *buf, size_t bufSize); +** ReadLine - bool McuShell_ReadLine(uint8_t *bufStart, uint8_t *buf, size_t bufSize,... +** PrintCommandFailed - void McuShell_PrintCommandFailed(const uint8_t *cmd, McuShell_ConstStdIOType... +** IterateTable - uint8_t McuShell_IterateTable(const uint8_t *cmd, bool *handled,... +** SetStdio - uint8_t McuShell_SetStdio(McuShell_ConstStdIOTypePtr stdio); +** GetStdio - McuShell_ConstStdIOTypePtr McuShell_GetStdio(void); +** RequestSerial - void McuShell_RequestSerial(void); +** ReleaseSerial - void McuShell_ReleaseSerial(void); +** ReadAndParseWithCommandTableExt - uint8_t McuShell_ReadAndParseWithCommandTableExt(uint8_t *cmdBuf, size_t... +** ReadCommandLine - uint8_t McuShell_ReadCommandLine(uint8_t *cmdBuf, size_t cmdBufSize,... +** ReadAndParseWithCommandTable - uint8_t McuShell_ReadAndParseWithCommandTable(uint8_t *cmdBuf, size_t... +** ParseWithCommandTableExt - uint8_t McuShell_ParseWithCommandTableExt(const uint8_t *cmd,... +** ParseWithCommandTable - uint8_t McuShell_ParseWithCommandTable(const uint8_t *cmd,... +** GetSemaphore - void* McuShell_GetSemaphore(void); +** SendStatusStr - void McuShell_SendStatusStr(const uint8_t *strItem, const uint8_t *strStatus,... +** SendHelpStr - void McuShell_SendHelpStr(const uint8_t *strCmd, const uint8_t *strHelp,... +** ReadChar - void McuShell_ReadChar(uint8_t *c); +** SendChar - void McuShell_SendChar(uint8_t ch); +** KeyPressed - bool McuShell_KeyPressed(void); +** SendCharFct - void McuShell_SendCharFct(uint8_t ch, uint8_t (*fct)(uint8_t ch)); +** Init - void McuShell_Init(void); +** Deinit - void McuShell_Deinit(void); +** +** * Copyright (c) 2014-2025, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuShell.h +** @version 01.00 +** @brief +** Module implementing a command line shell. +*/ +/*! +** @addtogroup McuShell_module McuShell module documentation +** @{ +*/ + +/* MODULE McuShell. */ +#include /* for isalnum*/ + +#include "McuShell.h" +#include "McuXFormat.h" +#include "McuUtility.h" +#include "McuCriticalSection.h" +#include "McuWait.h" + +#if McuShell_DEFAULT_SERIAL + #include McuShell_CONFIG_DEFAULT_SERIAL_INCLUDE +#endif + + +uint8_t McuShell_DefaultShellBuffer[McuShell_DEFAULT_SHELL_BUFFER_SIZE]; /* default buffer which can be used by the application */ +#if McuShell_CONFIG_HISTORY_ENABLED + static uint8_t McuShell_history[McuShell_CONFIG_HISTORY_NOF_ITEMS][McuShell_CONFIG_HISTORY_ITEM_LENGTH]; /* History buffers */ + static uint8_t McuShell_history_index = 0; /* Selected command */ +#endif +#if McuShell_CONFIG_ECHO_ENABLED + static bool McuShell_EchoEnabled = TRUE; +#endif + +#if McuShell_CONFIG_USE_MUTEX + #include "FreeRTOS.h" + #include "task.h" + #include "semphr.h" +#endif + +#ifdef __HC08__ + #pragma MESSAGE DISABLE C3303 /* implicit concatenation of strings */ +#endif +#if McuShell_CONFIG_USE_MUTEX + static SemaphoreHandle_t ShellSem = NULL; /* Semaphore to protect shell SCI access */ +#endif + +#if McuShell_DEFAULT_SERIAL + McuShell_ConstStdIOType McuShell_stdio = + { + (McuShell_StdIO_In_FctType)McuShell_ReadChar, /* stdin */ + (McuShell_StdIO_OutErr_FctType)McuShell_SendChar, /* stdout */ + (McuShell_StdIO_OutErr_FctType)McuShell_SendChar, /* stderr */ + McuShell_KeyPressed /* if input is not empty */ + }; + static McuShell_ConstStdIOType *McuShell_currStdIO = &McuShell_stdio; +#else + static McuShell_ConstStdIOType *McuShell_currStdIO = NULL; /* needs to be set through McuShell_SetStdio(); */ +#endif +/* Internal method prototypes */ +static void SendSeparatedStrings(const uint8_t *strA, const uint8_t *strB, uint8_t tabChar, uint8_t tabPos, McuShell_StdIO_OutErr_FctType io); + +/* +** =================================================================== +** Method : SendCh (component Shell) +** +** Description : +** Prints a character using an I/O function +** Parameters : +** NAME - DESCRIPTION +** ch - Character to send +** io - I/O callbacks to be used for printing. +** Returns : Nothing +** =================================================================== +*/ +void McuShell_SendCh(uint8_t ch, McuShell_StdIO_OutErr_FctType io) +{ + if (io==NULL) { + return; + } + io(ch); +} + +/* +** =================================================================== +** Method : SendStr (component Shell) +** +** Description : +** Prints a string using an I/O function +** Parameters : +** NAME - DESCRIPTION +** * str - Pointer to string (zero terminated) to be +** printed. +** io - I/O callbacks to be used for printing. +** Returns : Nothing +** =================================================================== +*/ +/*! + * \brief Prints a string using I/O callbacks + * \param[in] str String (zero terminated) to be printed + * \param[in] io I/O function to be used for printing + */ +void McuShell_SendStr(const uint8_t *str, McuShell_StdIO_OutErr_FctType io) +{ + if (io==NULL) { + return; + } + while(*str!='\0') { + io(*str++); + } +} + +/* +** =================================================================== +** Method : SendNum32s (component Shell) +** +** Description : +** Sends a 32bit signed number to the given I/O +** Parameters : +** NAME - DESCRIPTION +** val - number to print +** io - I/O callbacks to be used for printing. +** Returns : Nothing +** =================================================================== +*/ +void McuShell_SendNum32s(int32_t val, McuShell_StdIO_OutErr_FctType io) +{ + unsigned char buf[sizeof("-1234567890")]; + + McuUtility_Num32sToStr(buf, sizeof(buf), val); + McuShell_SendStr(buf, io); +} + +/* +** =================================================================== +** Method : SendNum32u (component Shell) +** +** Description : +** Sends a 32bit unsigned number to the given I/O +** Parameters : +** NAME - DESCRIPTION +** val - number to print +** io - I/O callbacks to be used for printing. +** Returns : Nothing +** =================================================================== +*/ +void McuShell_SendNum32u(uint32_t val, McuShell_StdIO_OutErr_FctType io) +{ + unsigned char buf[sizeof("1234567890")]; + + McuUtility_Num32uToStr(buf, sizeof(buf), val); + McuShell_SendStr(buf, io); +} + +/* +** =================================================================== +** Method : SendNum16s (component Shell) +** +** Description : +** Sends a 16bit signed number to the given I/O +** Parameters : +** NAME - DESCRIPTION +** val - number to print +** io - I/O callbacks to be used for printing. +** Returns : Nothing +** =================================================================== +*/ +void McuShell_SendNum16s(int16_t val, McuShell_StdIO_OutErr_FctType io) +{ + unsigned char buf[sizeof("-12345")]; + + McuUtility_Num16sToStr(buf, sizeof(buf), val); + McuShell_SendStr(buf, io); +} + +/* +** =================================================================== +** Method : SendNum16u (component Shell) +** +** Description : +** Sends a 16bit unsigned number to the given I/O +** Parameters : +** NAME - DESCRIPTION +** val - number to print +** io - I/O callbacks to be used for printing. +** Returns : Nothing +** =================================================================== +*/ +void McuShell_SendNum16u(uint16_t val, McuShell_StdIO_OutErr_FctType io) +{ + unsigned char buf[sizeof("12345")]; + + McuUtility_Num16uToStr(buf, sizeof(buf), val); + McuShell_SendStr(buf, io); +} + +/* +** =================================================================== +** Method : SendNum8u (component Shell) +** +** Description : +** Sends an 8bit unsigned number to the given I/O +** Parameters : +** NAME - DESCRIPTION +** val - number to print +** io - I/O callbacks to be used for printing. +** Returns : Nothing +** =================================================================== +*/ +void McuShell_SendNum8u(uint8_t val, McuShell_StdIO_OutErr_FctType io) +{ + unsigned char buf[sizeof("123")]; + + McuUtility_Num8uToStr(buf, sizeof(buf), val); + McuShell_SendStr(buf, io); +} + +/* +** =================================================================== +** Method : SendNum8s (component Shell) +** +** Description : +** Sends an 8bit signed number to the given I/O +** Parameters : +** NAME - DESCRIPTION +** val - number to print +** io - I/O callbacks to be used for printing. +** Returns : Nothing +** =================================================================== +*/ +void McuShell_SendNum8s(int8_t val, McuShell_StdIO_OutErr_FctType io) +{ + unsigned char buf[sizeof("-123")]; + + McuUtility_Num8sToStr(buf, sizeof(buf), val); + McuShell_SendStr(buf, io); +} + +/* +** =================================================================== +** Method : ParseCommand (component Shell) +** +** Description : +** Parses a shell command. Use 'help' to get a list of +** supported commands. +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command string +** * handled - Pointer to variable to indicate if +** the command has been handled. The caller +** passes this variable to the command scanner +** to find out if the passed command has been +** handled. The variable is initialized by the +** caller. +** * io - Pointer to I/O callbacks +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuShell_ParseCommand(const uint8_t *cmd, bool *handled, McuShell_ConstStdIOType *io) +{ + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, "McuShell help")==0) { + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + McuShell_SendStr((unsigned char*)McuShell_DASH_LINE, io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + McuShell_SendStr((unsigned char*)McuShell_CONFIG_PROJECT_NAME_STRING, io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + McuShell_SendStr((unsigned char*)McuShell_DASH_LINE, io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)"McuShell", (const unsigned char*)"Group of McuShell commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (const unsigned char*)"Print help or status information\r\n", io->stdOut); +#if McuShell_CONFIG_ECHO_ENABLED + McuShell_SendHelpStr((unsigned char*)" echo (on|off)", (const unsigned char*)"Turn echo on or off\r\n", io->stdOut); +#endif + *handled = TRUE; + return ERR_OK; +#if McuShell_CONFIG_ECHO_ENABLED + } else if ((McuUtility_strcmp((char*)cmd, "McuShell echo on")==0)) { + *handled = TRUE; + McuShell_EchoEnabled = TRUE; + return ERR_OK; + } else if ((McuUtility_strcmp((char*)cmd, "McuShell echo off")==0)) { + *handled = TRUE; + McuShell_EchoEnabled = FALSE; + return ERR_OK; +#endif + } else if ((McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) || (McuUtility_strcmp((char*)cmd, "McuShell status")==0)) { + *handled = TRUE; + return McuShell_PrintStatus(io); + } + return ERR_OK; /* no error */ +} + +/* +** =================================================================== +** Method : PrintPrompt (component Shell) +** +** Description : +** Prints the prompt to the stdOut channel +** Parameters : +** NAME - DESCRIPTION +** * io - Pointer to IO to be used +** Returns : Nothing +** =================================================================== +*/ +void McuShell_PrintPrompt(McuShell_ConstStdIOType *io) +{ + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); /* ensure that there is a new line */ + McuShell_SendStr((unsigned char*)McuShell_CONFIG_PROMPT_STRING, io->stdOut); +} + +/* +** =================================================================== +** Method : IsHistoryCharacter (component Shell) +** +** Description : +** Returns TRUE if character is a history character +** Parameters : +** NAME - DESCRIPTION +** ch - current command character +** * cmdBuf - Pointer to command line buffer read +** so far +** cmdBufIdx - Index of character into cmdBuf +** * isPrev - Pointer to return value, if it is +** 'previous' history or not +** Returns : +** --- - TRUE if it is an accepted history character +** =================================================================== +*/ +bool McuShell_IsHistoryCharacter(uint8_t ch, uint8_t *cmdBuf, size_t cmdBufIdx, bool *isPrev) +{ + *isPrev = FALSE; +#if McuShell_CONFIG_HISTORY_ENABLED + if ( cmdBufIdx==0 /* first character on command line */ + || (McuUtility_strcmp((const char*)cmdBuf, (const char*)McuShell_history[McuShell_history_index])==0) /* pressing prev/next character on previous history element */ + ) + { + if (ch==McuShell_CONFIG_HISTORY_CHAR_PREV) { + *isPrev = TRUE; + return TRUE; + } else if (ch==McuShell_CONFIG_HISTORY_CHAR_NEXT) { + *isPrev = FALSE; + return TRUE; + } + } +#if 0 + if (cmdBufIdx==0 || cmdBufIdx==2) { /* accept only first character or sequence as history sequence */ + if (cmdBufIdx==2 && cmdBuf[0]==0x1b && cmdBuf[1]==0x5b) { + /* up: 0x27 0x5b 0x41 + * down: 0x27 0x5b 0x42 + * right: 0x27 0x5b 0x43 + * left: 0x27 0x5b 0x44 + */ + if (cmdBuf[2]==0x41 /* up */ || cmdBuf[2]==0x44 /* left */) { + *isPrev = TRUE; + return TRUE; + } else if (cmdBuf[2]==0x42 /* down */ || cmdBuf[2]==0x43 /* right */) { + *isPrev = FALSE; + return TRUE; + } + } + /* NYI: handle TAB and SHIFT-TAB */ + } +#endif +#else + (void)ch; /* not used */ + (void)cmdBuf; /* not used */ + (void)cmdBufIdx; /* not used */ +#endif + return FALSE; +} + +/* +** =================================================================== +** Method : ReadLine (component Shell) +** +** Description : +** Reads a line from stdIn and returns TRUE if we have a line, +** FALSE otherwise. +** Parameters : +** NAME - DESCRIPTION +** * bufStart - Pointer to start of buffer +** * buf - Pointer to buffer where to read in the +** information +** bufSize - size of buffer +** * io - Pointer to I/O callbacks +** Returns : +** --- - TRUE if something has been read, FALSE +** otherwise +** =================================================================== +*/ +bool McuShell_ReadLine(uint8_t *bufStart, uint8_t *buf, size_t bufSize, McuShell_ConstStdIOType *io) +{ + uint8_t c; + bool isBackwardHistory; + + if (io->keyPressed()) { + for(;;) { /* while not '\r' or '\n' */ + c = '\0'; /* initialize character */ + io->stdIn(&c); /* read character */ + if (c=='\0') { /* nothing in rx buffer? Something is wrong... */ + break; /* get out of loop */ + } + if (c=='\b' || c=='\177') { /* check for backspace */ + if (buf > bufStart) { /* Avoid buffer underflow */ +#if McuShell_CONFIG_ECHO_ENABLED + if (McuShell_EchoEnabled && io->echoEnabled) { + io->stdOut('\b'); /* delete character on terminal */ + io->stdOut(' '); + io->stdOut('\b'); + } +#endif + buf--; /* delete last character in buffer */ + *buf = '\0'; + bufSize++; + } + } else if (McuShell_IsHistoryCharacter(c, bufStart, (size_t)(buf-bufStart), &isBackwardHistory)) { +#if McuShell_CONFIG_HISTORY_ENABLED + uint8_t cBuf[3]={'\0','\0','\0'}, cBufIdx = 0; + bool prevInHistory; +#endif + + while (c!='\0') { /* empty the rx buffer (escape sequence) */ +#if McuShell_CONFIG_HISTORY_ENABLED + cBuf[cBufIdx] = c; + cBufIdx++; + if (cBufIdx==sizeof(cBuf)) { + cBufIdx = 0; /* ring buffer */ + } +#endif + c = '\0'; /* initialize character */ + io->stdIn(&c); /* read character */ + } +#if McuShell_CONFIG_HISTORY_ENABLED + /* if not an alphanumeric switch to history */ + prevInHistory = cBufIdx==0 && cBuf[0]==0x1b && cBuf[1]==0x5b && (cBuf[2]==0x41 /*up*/ || cBuf[2]==0x44 /*left*/); + /* up: 0x27 0x5b 0x41 + * down: 0x27 0x5b 0x42 + * right: 0x27 0x5b 0x43 + * left: 0x27 0x5b 0x44 + */ + if (prevInHistory) { + McuUtility_strcpy(bufStart, McuShell_CONFIG_HISTORY_ITEM_LENGTH, McuShell_history[McuShell_history_index]); + McuShell_history_index++; /* update the index */ + if (McuShell_history_index==McuShell_CONFIG_HISTORY_NOF_ITEMS) { + McuShell_history_index = 0; + } + } else { + if (McuShell_history_index==0) { + McuShell_history_index = (McuShell_CONFIG_HISTORY_NOF_ITEMS-1); + } else { + McuShell_history_index--; + } + McuUtility_strcpy(bufStart, McuShell_CONFIG_HISTORY_ITEM_LENGTH, McuShell_history[McuShell_history_index]); + } + bufSize = bufSize + buf - bufStart - McuUtility_strlen((const char*)bufStart); /* update the buffer */ + buf = bufStart + McuUtility_strlen((const char*)bufStart); +#endif +#if McuShell_CONFIG_ECHO_ENABLED + if (McuShell_EchoEnabled && io->echoEnabled) { + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + McuShell_PrintPrompt(io); + McuShell_SendStr(bufStart, io->stdOut); + } +#endif + } else { +#if McuShell_CONFIG_ECHO_ENABLED + if (McuShell_EchoEnabled && io->echoEnabled) { + #if McuLib_CONFIG_CPU_IS_ESP32 + if (c=='\r') { /* idf.py monitor uses '\r' for '\n'? */ + c = '\n'; + } + #endif + io->stdOut(c); /* echo character */ + } +#endif + *buf = (uint8_t)c; /* append character to the string */ + buf++; + bufSize--; + if ((c=='\r') || (c=='\n')) { +#if McuShell_CONFIG_ECHO_ENABLED + if (McuShell_EchoEnabled && io->echoEnabled) { + #if McuLib_CONFIG_CPU_IS_ESP32 + McuShell_SendStr((unsigned char*)" \n", io->stdOut); /* for ESP32 idf.py monitor it uses '\r' at the end, plus we need a space */ + #else + McuShell_SendStr((unsigned char*)"\n", io->stdOut); + #endif + } +#endif +#if McuShell_CONFIG_HISTORY_ENABLED + if ((bufStart[0] != '\0') && (bufStart[0] != '\r') && (bufStart[0] != '\n')) { + int i; + + for(i=McuShell_CONFIG_HISTORY_NOF_ITEMS-1; i>0;i--) { + McuUtility_strcpy(McuShell_history[i], McuShell_CONFIG_HISTORY_ITEM_LENGTH, McuShell_history[i-1]); /* move previous commands */ + } + McuShell_history_index = 0; /* update the history with the current command */ + McuUtility_strcpy(McuShell_history[0], McuShell_CONFIG_HISTORY_ITEM_LENGTH, bufStart); /* add the current command to the history */ + if (buf-bufStart <= McuShell_CONFIG_HISTORY_ITEM_LENGTH) { /* size check */ + McuShell_history[0][buf-bufStart-1] = '\0'; + } else { + McuShell_history[0][McuShell_CONFIG_HISTORY_ITEM_LENGTH-1] = '\0'; + } + } +#endif + break; + } + if (bufSize <= 1) { /* buffer full */ + break; + } + } + } /* for */ + *buf = '\0'; /* zero terminate string */ + return TRUE; + } else { + return FALSE; + } +} + +/* +** =================================================================== +** Method : PrintStatus (component Shell) +** +** Description : +** Prints various available system status information +** Parameters : +** NAME - DESCRIPTION +** * io - Pointer to I/O callbacks +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuShell_PrintStatus(McuShell_ConstStdIOType *io) +{ + unsigned char buf[32]; + + McuShell_SendStatusStr((const unsigned char*)"McuShell", (const unsigned char*)"Commandline shell status\r\n", io->stdOut); + McuShell_SendStatusStr((const unsigned char*)" Build", (const unsigned char*)__DATE__, io->stdOut); + McuShell_SendStr((unsigned char*)" ", io->stdOut); + McuShell_SendStr((unsigned char*)__TIME__, io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); +#if McuShell_CONFIG_ECHO_ENABLED + McuShell_SendStatusStr((const unsigned char*)" echo", McuShell_EchoEnabled?(const unsigned char*)"On\r\n":(const unsigned char*)"Off\r\n", io->stdOut); +#endif + + buf[0] = '\0'; + if (McuShell_CONFIG_SILENT_PREFIX_CHAR!=McuShell_NO_SILENT_PREFIX_CHAR) { + McuUtility_chcat(buf, sizeof(buf), McuShell_CONFIG_SILENT_PREFIX_CHAR); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"none\r\n"); + } + McuShell_SendStatusStr((const unsigned char*)" silent", buf, io->stdOut); +#if McuShell_CONFIG_MULTI_CMD_ENABLED + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"yes: '"); + McuUtility_chcat(buf, sizeof(buf), McuShell_CONFIG_MULTI_CMD_CHAR); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"', size: "); + McuUtility_strcatNum32u(buf, sizeof(buf), McuShell_CONFIG_MULTI_CMD_SIZE); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((const unsigned char*)" multiCmd", buf, io->stdOut); +#else + McuShell_SendStatusStr((const unsigned char*)" multiCmd", (unsigned char*)"no\r\n", io->stdOut); +#endif + + McuUtility_Num32uToStr(buf, sizeof(buf), McuShell_CONFIG_DEFAULT_SHELL_BUFFER_SIZE); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" bytes default size\r\n"); + McuShell_SendStatusStr((const unsigned char*)" size", buf, io->stdOut); + + return ERR_OK; +} + +/* +** =================================================================== +** Method : PrintCommandFailed (component Shell) +** +** Description : +** Prints a standard message for failed or unknown commands +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command which was failing +** * io - Pointer to I/O callbacks +** Returns : Nothing +** =================================================================== +*/ +void McuShell_PrintCommandFailed(const uint8_t *cmd, McuShell_ConstStdIOType *io) +{ + McuShell_SendStr((unsigned char*)"*** Failed or unknown command: ", io->stdErr); + McuShell_SendStr(cmd, io->stdErr); + McuShell_SendStr((unsigned char*)"\r\n", io->stdErr); + McuShell_SendStr((unsigned char*)"*** Type ", io->stdErr); + McuShell_SendStr((unsigned char*)McuShell_CMD_HELP, io->stdErr); + McuShell_SendStr((unsigned char*)" to get a list of available commands\r\n", io->stdErr); +} + +/* +** =================================================================== +** Method : IterateTable (component Shell) +** +** Description : +** Parses a shell command. It handles first the internal +** commands and will call the provided callback. +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command string +** * handled - Pointer to boolean which is set to +** TRUE if a command parser has handled the +** command. +** * io - Pointer to I/O callbacks +** * parserTable - Pointer to callback which +** will be called to parse commands in the +** user application, or NULL if not used. +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuShell_IterateTable(const uint8_t *cmd, bool *handled, McuShell_ConstStdIOType *io, McuShell_ConstParseCommandCallback *parserTable) +{ + uint8_t res = ERR_OK; + + if (parserTable==NULL) { /* no table??? */ + return ERR_FAILED; + } + if (io==NULL) { /* no IO handler??? */ + return ERR_FAILED; + } + /* iterate through all parser functions in table */ + while(*parserTable!=NULL) { + if ((*parserTable)(cmd, handled, io)!=ERR_OK) { + res = ERR_FAILED; + } + parserTable++; + } + return res; +} + +/* +** =================================================================== +** Method : ParseWithCommandTableExt (component Shell) +** +** Description : +** Parses a shell command. It handles first the internal +** commands and will call the provided callback. +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command string +** * io - Pointer to I/O callbacks +** * parseCallback - Pointer to callback +** which will be called to parse commands in +** the user application, or NULL if not used. +** silent - If handling shall be silent, i.e. no +** command prompt printed +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuShell_ParseWithCommandTableExt(const uint8_t *cmd, McuShell_ConstStdIOType *io, McuShell_ConstParseCommandCallback *parseCallback, bool silent) +{ + uint8_t res = ERR_OK; + bool handled; +#if McuShell_SILENT_PREFIX_CHAR_ENABLED + bool silentPrefix = FALSE; +#endif +#if McuShell_CONFIG_MULTI_CMD_ENABLED + uint8_t buf[McuShell_CONFIG_MULTI_CMD_SIZE]; + size_t i; + bool parseBuffer, finished; + bool insideDoubleQuotes = FALSE; /* with multi-commands: allow the McuShell_CONFIG_MULTI_CMD_CHAR inside double quoted strings */ +#endif + + if (io==NULL) { /* no I/O handler? */ + return ERR_FAILED; + } + if (*cmd=='\0') { /* empty command */ + return ERR_OK; + } +#if McuShell_CONFIG_MULTI_CMD_ENABLED + parseBuffer = FALSE; + finished = FALSE; + i = 0; + for(;;) { /* breaks */ + if (i>sizeof(buf)-2) { + res = ERR_FAILED; + McuShell_PrintCommandFailed(buf, io); + break; /* buffer overflow */ + } + buf[i] = *cmd; + if (buf[i]=='"') { + if (insideDoubleQuotes) { /* already had a double quote? */ + insideDoubleQuotes = FALSE; /* note: we do not support nested double quotes */ + } else { + insideDoubleQuotes = TRUE; /* mark that we are inside double quotes */ + } + } + cmd++; i++; + #if McuShell_SILENT_PREFIX_CHAR_ENABLED + if (i==1 && buf[0]==McuShell_CONFIG_SILENT_PREFIX_CHAR) { /* first character is silent character */ + silentPrefix |= (bool)(buf[0]==McuShell_CONFIG_SILENT_PREFIX_CHAR); + buf[0] = *cmd; /* skip silent character */ + cmd++; + } + #endif + if (!insideDoubleQuotes && buf[i-1] == McuShell_CONFIG_MULTI_CMD_CHAR) { /* found separator, but not inside double quoted string */ + buf[i-1] = '\0'; + parseBuffer = TRUE; + } else if (buf[i-1]=='\0') { + parseBuffer = TRUE; + finished = TRUE; + } + if (parseBuffer) { + handled = FALSE; + res = McuShell_IterateTable(buf, &handled, io, parseCallback); /* iterate through all parser functions in table */ + if (!handled || res!=ERR_OK) { /* no handler has handled the command, or error? */ + McuShell_PrintCommandFailed(buf, io); + res = ERR_FAILED; + } + parseBuffer = FALSE; + i = 0; /* restart */ + } + if (finished) { + break; /* get out of loop */ + } + } /* for */ +#else + #if McuShell_SILENT_PREFIX_CHAR_ENABLED + silentPrefix = (bool)(*cmd==McuShell_CONFIG_SILENT_PREFIX_CHAR); + if (silentPrefix) { + cmd++; /* skip silent character */ + } + #endif + handled = FALSE; + res = McuShell_IterateTable(cmd, &handled, io, parseCallback); /* iterate through all parser functions in table */ + if (!handled || res!=ERR_OK) { /* no handler has handled the command? */ + McuShell_PrintCommandFailed(cmd, io); + res = ERR_FAILED; + } +#endif +#if McuShell_SILENT_PREFIX_CHAR_ENABLED + if (!silentPrefix && !silent) { + McuShell_PrintPrompt(io); + } +#else + if (!silent) { + McuShell_PrintPrompt(io); + } +#endif + return res; +} + +/* +** =================================================================== +** Method : ParseWithCommandTable (component Shell) +** +** Description : +** Parses a shell command. It handles first the internal +** commands and will call the provided callback. +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command string +** * io - Pointer to I/O callbacks +** * parseCallback - Pointer to callback +** which will be called to parse commands in +** the user application, or NULL if not used. +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuShell_ParseWithCommandTable(const uint8_t *cmd, McuShell_ConstStdIOType *io, McuShell_ConstParseCommandCallback *parseCallback) +{ + return McuShell_ParseWithCommandTableExt(cmd, io, parseCallback, FALSE); +} + +/* +** =================================================================== +** Method : SetStdio (component Shell) +** +** Description : +** Sets an StdIO structure which is returned by GetStdio() +** Parameters : +** NAME - DESCRIPTION +** stdio - New stdio structure to be used. +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuShell_SetStdio(McuShell_ConstStdIOTypePtr stdio) +{ + McuShell_currStdIO = stdio; + return ERR_OK; +} + +/* +** =================================================================== +** Method : GetStdio (component Shell) +** +** Description : +** Returns the default stdio channel. This method is only +** available if a shell is enabled in the component properties. +** Parameters : None +** Returns : +** --- - Pointer to the stdio descriptor +** =================================================================== +*/ +McuShell_ConstStdIOTypePtr McuShell_GetStdio(void) +{ + return McuShell_currStdIO; +} + +/* +** =================================================================== +** Method : ReadAndParseWithCommandTableExt (component Shell) +** +** Description : +** Reads characters from the default input channel and appends +** it to the buffer. Once a new line has been detected, the +** line will be parsed using the handlers in the table. +** Parameters : +** NAME - DESCRIPTION +** * cmdBuf - Pointer to buffer provided by the +** caller where to store the command to read +** in. Characters will be appended, so make +** sure string buffer is initialized with a +** zero byte at the beginning. +** cmdBufSize - Size of buffer +** * io - Pointer to I/O channels to be used +** * parseCallback - Pointer to callback +** table provided by the user application to +** parse commands. The table has a NULL +** sentinel. +** silent - If handling shall be silent, i.e. no +** command prompt printed +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuShell_ReadAndParseWithCommandTableExt(uint8_t *cmdBuf, size_t cmdBufSize, McuShell_ConstStdIOType *io, McuShell_ConstParseCommandCallback *parseCallback, bool silent) +{ + /* IMPORTANT NOTE: this function *appends* to the buffer, so the buffer needs to be initialized first! */ + uint8_t res = ERR_OK; + size_t len; + + if (io==NULL) { /* no I/O handler? */ + return ERR_FAILED; + } + len = McuUtility_strlen((const char*)cmdBuf); + if (McuShell_ReadLine(cmdBuf, cmdBuf+len, cmdBufSize-len, io)) { + len = McuUtility_strlen((const char*)cmdBuf); /* length of buffer string */ + if (len==0) { /* error case */ + return ERR_FAILED; + } else if (len==1 && (cmdBuf[0]=='\n' || cmdBuf[0]=='\r')) { /* eat preceding newline characters */ + cmdBuf[0] = '\0'; + } + if (len>=cmdBufSize-1) { /* buffer overflow? Parse what we have, will be likely return an error */ + (void)McuShell_ParseWithCommandTableExt(cmdBuf, io, parseCallback, silent); + cmdBuf[0] = '\0'; /* start again */ + res = ERR_OVERFLOW; + } else if (cmdBuf[len-1]=='\n' || cmdBuf[len-1]=='\r') { /* line end: parse command */ + cmdBuf[len-1] = '\0'; /* remove line end character for parser */ + res = McuShell_ParseWithCommandTableExt(cmdBuf, io, parseCallback, silent); + cmdBuf[0] = '\0'; /* start again */ + } else { + /* continue to append to buffer */ + } + } + return res; +} + +/* +** =================================================================== +** Method : ReadCommandLine (component Shell) +** +** Description : +** Similar to ReadAndParseWithCommandTableExt, but does not +** call the parser. Reads characters from the default input +** channel and appends it to the buffer. Once a new line has +** been detected, it removes it and returns ERR_OK +** Parameters : +** NAME - DESCRIPTION +** * cmdBuf - Pointer to buffer provided by the +** caller where to store the command to read +** in. Characters will be appended, so make +** sure string buffer is initialized with a +** zero byte at the beginning. +** cmdBufSize - Size of buffer +** * io - Pointer to I/O channels to be used +** Returns : +** --- - Error code, ERR_OK if a complete line has +** been detected +** =================================================================== +*/ +uint8_t McuShell_ReadCommandLine(uint8_t *cmdBuf, size_t cmdBufSize, McuShell_ConstStdIOType *io) +{ + /* IMPORTANT NOTE: this function *appends* to the buffer, so the buffer needs to be initialized first! */ + size_t len; + + if (io==NULL) { /* no I/O handler? */ + return ERR_FAILED; + } + len = McuUtility_strlen((const char*)cmdBuf); + if (McuShell_ReadLine(cmdBuf, cmdBuf+len, cmdBufSize-len, io)) { + len = McuUtility_strlen((const char*)cmdBuf); /* length of buffer string */ + if (len==0) { /* error case */ + return ERR_FAILED; + } else if (len==1 && (cmdBuf[0]=='\n' || cmdBuf[0]=='\r')) { /* eat preceding newline characters */ + cmdBuf[0] = '\0'; + } + if (len>=cmdBufSize-1) { /* buffer overflow? Parse what we have, will be likely return an error */ + cmdBuf[0] = '\0'; /* start again */ + return ERR_OVERFLOW; + } else if (cmdBuf[len-1]=='\n' || cmdBuf[len-1]=='\r') { /* line end: parse command */ + cmdBuf[len-1] = '\0'; /* remove line end character for parser */ + return ERR_OK; + } else { + /* continue to append to buffer */ + } + } + return ERR_BUSY; +} + +/* +** =================================================================== +** Method : ReadAndParseWithCommandTable (component Shell) +** +** Description : +** Reads characters from the default input channel and appends +** it to the buffer. Once a new line has been detected, the +** line will be parsed using the handlers in the table. +** Parameters : +** NAME - DESCRIPTION +** * cmdBuf - Pointer to buffer provided by the +** caller where to store the command to read +** in. Characters will be appended, so make +** sure string buffer is initialized with a +** zero byte at the beginning. +** cmdBufSize - Size of buffer +** * io - Pointer to I/O channels to be used +** * parseCallback - Pointer to callback +** table provided by the user application to +** parse commands. The table has a NULL +** sentinel. +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuShell_ReadAndParseWithCommandTable(uint8_t *cmdBuf, size_t cmdBufSize, McuShell_ConstStdIOType *io, McuShell_ConstParseCommandCallback *parseCallback) +{ + return McuShell_ReadAndParseWithCommandTableExt(cmdBuf, cmdBufSize, io, parseCallback, FALSE); +} + +/* +** =================================================================== +** Method : RequestSerial (component Shell) +** +** Description : +** Used to get mutual access to the shell console. Only has an +** effect if using an RTOS with semaphore for the console +** access. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuShell_RequestSerial(void) +{ +#if McuShell_CONFIG_USE_MUTEX + (void)xSemaphoreTakeRecursive(ShellSem, portMAX_DELAY); +#endif +} + +/* +** =================================================================== +** Method : ReleaseSerial (component Shell) +** +** Description : +** Used to release mutual access to the shell console. Only has +** an effect if using an RTOS with semaphore for the console +** access. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuShell_ReleaseSerial(void) +{ +#if McuShell_CONFIG_USE_MUTEX + (void)xSemaphoreGiveRecursive(ShellSem); +#endif +} + +/* +** =================================================================== +** Method : GetSemaphore (component Shell) +** +** Description : +** Return the semaphore of the shell. +** Parameters : None +** Returns : +** --- - semaphore, or NULL if not used or not +** allocated. +** =================================================================== +*/ +void* McuShell_GetSemaphore(void) +{ +#if McuShell_CONFIG_USE_MUTEX + return ShellSem; +#else + return NULL; +#endif +} + +/* +** =================================================================== +** Method : SendSeparatedStrings (component Shell) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +static void SendSeparatedStrings(const uint8_t *strA, const uint8_t *strB, uint8_t tabChar, uint8_t tabPos, McuShell_StdIO_OutErr_FctType io) +{ + /* write command part */ + if (strA!=NULL) { + while(*strA!='\0' && tabPos>0) { + io(*strA++); + tabPos--; + } + } + /* fill up until ';' */ + while(tabPos>0) { + io(' '); + tabPos--; + } + /* write separator */ + io(tabChar); + io(' '); + if (strB!=NULL) { + /* write help text */ + McuShell_SendStr(strB, io); + } +} + +/* +** =================================================================== +** Method : SendHelpStr (component Shell) +** +** Description : +** Prints a string using an I/O function, formated for the +** 'help' command +** Parameters : +** NAME - DESCRIPTION +** * strCmd - Pointer to string of the command +** * strHelp - Pointer to help text string +** io - I/O callbacks to be used for printing. +** Returns : Nothing +** =================================================================== +*/ +void McuShell_SendHelpStr(const uint8_t *strCmd, const uint8_t *strHelp, McuShell_StdIO_OutErr_FctType io) +{ + SendSeparatedStrings(strCmd, strHelp, ';', McuShell_CONFIG_HELP_SEMICOLON_POS, io); +} + +/* +** =================================================================== +** Method : SendStatusStr (component Shell) +** +** Description : +** Prints a status string using an I/O function, formated for +** the 'status' command +** Parameters : +** NAME - DESCRIPTION +** * strItem - Pointer to string of the command +** * strStatus - Pointer to help text string +** io - I/O callbacks to be used for printing. +** Returns : Nothing +** =================================================================== +*/ +void McuShell_SendStatusStr(const uint8_t *strItem, const uint8_t *strStatus, McuShell_StdIO_OutErr_FctType io) +{ + SendSeparatedStrings(strItem, strStatus, ':', McuShell_CONFIG_STATUS_COLON_POS, io); +} + +/* +** =================================================================== +** Method : ReadChar (component Shell) +** +** Description : +** Reads a character (blocking) +** Parameters : +** NAME - DESCRIPTION +** * c - Pointer to character to be used to store the +** result +** Returns : Nothing +** =================================================================== +*/ +void McuShell_ReadChar(uint8_t *c) +{ +#if McuShell_CONFIG_DEFAULT_SERIAL + uint8_t res; + +#if McuShell_CONFIG_USE_MUTEX + (void)xSemaphoreTakeRecursive(ShellSem, portMAX_DELAY); +#endif + res = McuShell_CONFIG_DEFAULT_SERIAL_RECEIVE_FCT_NAME((uint8_t*)c); + if (res==ERR_RXEMPTY) { + /* no character in buffer */ + *c = '\0'; + } +#if McuShell_CONFIG_USE_MUTEX + (void)xSemaphoreGiveRecursive(ShellSem); +#endif +#else + *c = '\0'; + return; /* no serial component set up in properties */ +#endif +} + +/* +** =================================================================== +** Method : SendChar (component Shell) +** +** Description : +** Sends a character (blocking) +** Parameters : +** NAME - DESCRIPTION +** ch - character to be sent +** Returns : Nothing +** =================================================================== +*/ +void McuShell_SendChar(uint8_t ch) +{ +#if McuShell_CONFIG_DEFAULT_SERIAL + McuShell_SendCharFct(ch, McuShell_CONFIG_DEFAULT_SERIAL_SEND_FCT_NAME); +#else + (void)ch; /* avoid compiler warning about unused argument */ +#endif +} + +/* +** =================================================================== +** Method : KeyPressed (component Shell) +** +** Description : +** Checks if a key has been pressed (a character is present in +** the input buffer) +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +bool McuShell_KeyPressed(void) +{ +#if McuShell_CONFIG_DEFAULT_SERIAL + bool res; + +#if McuShell_CONFIG_USE_MUTEX + (void)xSemaphoreTakeRecursive(ShellSem, portMAX_DELAY); +#endif +#if McuShell_CONFIG_DEFAULT_SERIAL + res = (bool)((McuShell_CONFIG_DEFAULT_SERIAL_RXAVAIL_FCT_NAME()==0U) ? FALSE : TRUE); /* true if there are characters in receive buffer */ +#endif +#if McuShell_CONFIG_USE_MUTEX + (void)xSemaphoreGiveRecursive(ShellSem); +#endif + return res; +#else + return FALSE; /* no serial component set up in properties */ +#endif +} + +/* +** =================================================================== +** Method : Init (component Shell) +** +** Description : +** Initializes the module, especially creates the mutex +** semaphore if an RTOS is used. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuShell_Init(void) +{ +#if McuShell_CONFIG_USE_MUTEX +#if configSUPPORT_STATIC_ALLOCATION + static StaticSemaphore_t xMutexBuffer; +#endif + bool schedulerStarted; + McuCriticalSection_CriticalVariable(); + + schedulerStarted = (bool)(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED); + if (!schedulerStarted) { /* FreeRTOS not started yet. We are called in PE_low_level_init(), and interrupts are disabled */ + McuCriticalSection_EnterCritical(); + } +#if configSUPPORT_STATIC_ALLOCATION + ShellSem = xSemaphoreCreateRecursiveMutexStatic(&xMutexBuffer); +#else + ShellSem = xSemaphoreCreateRecursiveMutex(); +#endif + if (!schedulerStarted) { /* above RTOS call might have enabled interrupts! Make sure we restore the state */ + McuCriticalSection_ExitCritical(); + } + if (ShellSem==NULL) { /* semaphore creation failed */ + for(;;) {} /* error, not enough memory? */ + } + vQueueAddToRegistry(ShellSem, "McuShell_Sem"); +#endif +#if McuShell_CONFIG_HISTORY_ENABLED + { + int i; + + McuShell_history_index = 0; + for(i=0; i0) { + io(*data++); + dataSize--; + } +} + +/* +** =================================================================== +** Method : McuShell_printfPutChar (component Shell) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +void McuShell_printfPutChar(void *arg, char c) +{ + McuShell_StdIO_OutErr_FctType fct = (McuShell_StdIO_OutErr_FctType)arg; + + fct(c); /* print character */ +} + +/* +** =================================================================== +** Method : printfIO (component Shell) +** +** Description : +** Printf() style function using XFormat component, using a +** custom I/O handler. +** Parameters : +** NAME - DESCRIPTION +** * io - Pointer to +** fmt - printf style format string +** Returns : +** --- - number of characters written +** =================================================================== +*/ +unsigned McuShell_printfIO(McuShell_ConstStdIOType *io, const char *fmt, ...) +{ + va_list args; + unsigned int count = 0; + + va_start(args,fmt); + count = McuXFormat_xvformat(McuShell_printfPutChar, (void*)io->stdOut, fmt, args); + va_end(args); + return count; +} + +/* +** =================================================================== +** Method : printf (component Shell) +** +** Description : +** Printf() style function using XFormat component, using the +** shell default I/O handler. +** Parameters : +** NAME - DESCRIPTION +** fmt - printf style format string +** Returns : +** --- - number of characters written +** =================================================================== +*/ +unsigned McuShell_printf(const char *fmt, ...) +{ + va_list args; + unsigned int count = 0; + + va_start(args,fmt); + count = McuXFormat_xvformat(McuShell_printfPutChar, (void*)McuShell_GetStdio()->stdOut, fmt, args); + va_end(args); + return count; +} + +/* +** =================================================================== +** Method : SendCharFct (component Shell) +** +** Description : +** Method to send a character using a standard I/O handle. +** Parameters : +** NAME - DESCRIPTION +** ch - character to be sent +** * fct - Function pointer to output function: takes +** a byte to write and returns error code. +** Returns : Nothing +** =================================================================== +*/ +void McuShell_SendCharFct(uint8_t ch, uint8_t (*fct)(uint8_t ch)) +{ +#if McuShell_CONFIG_BLOCKING_SEND_ENABLED + uint8_t res; + #if McuShell_CONFIG_BLOCKING_SEND_TIMEOUT_MS>0 + int timeoutMs = McuShell_CONFIG_BLOCKING_SEND_TIMEOUT_MS; + #endif +#endif + +#if McuShell_CONFIG_USE_MUTEX + (void)xSemaphoreTakeRecursive(ShellSem, portMAX_DELAY); +#endif +#if McuShell_CONFIG_BLOCKING_SEND_ENABLED + do { + res = fct((uint8_t)ch); /* Send char, returns error code */ + #if McuShell_CONFIG_BLOCKING_SEND_TIMEOUT_MS>0 + if (res==ERR_TXFULL) { + #if McuShell_CONFIG_BLOCKING_SEND_RTOS_WAIT + McuWait_WaitOSms(McuShell_CONFIG_BLOCKING_SEND_TIMEOUT_WAIT_MS); + #else + McuWait_Waitms(McuShell_CONFIG_BLOCKING_SEND_TIMEOUT_WAIT_MS); + #endif + } + #endif + #if McuShell_CONFIG_BLOCKING_SEND_TIMEOUT_MS>0 + if(timeoutMs<=0) { + break; /* timeout */ + } + timeoutMs -= McuShell_CONFIG_BLOCKING_SEND_TIMEOUT_WAIT_MS; + #endif + } while(res==ERR_TXFULL); +#else + (void)fct((uint8_t)ch); /* non blocking send */ +#endif +#if McuShell_CONFIG_USE_MUTEX + (void)xSemaphoreGiveRecursive(ShellSem); +#endif +} + +/* +** =================================================================== +** Method : PrintMemory (component Shell) +** +** Description : +** Prints a chunk of memory bytes in a formatted way. +** Parameters : +** NAME - DESCRIPTION +** * hndl - Pointer to +** startAddr - Memory start address +** endAddr - Memory end address +** addrSize - Number of bytes for the address +** (1, 2, 3 or 4) +** bytesPerLine - Number of bytes per line +** readfp - Function pointer to read the memory. +** Returns error code, uses a device handle, +** 32bit address with a pointer to a buffer +** and a buffer size. +** * io - Pointer to I/O to be used +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuShell_PrintMemory(void *hndl, uint32_t startAddr, uint32_t endAddr, uint8_t addrSize, uint8_t bytesPerLine, uint8_t (*readfp)(void *, uint32_t, uint8_t*, size_t), McuShell_ConstStdIOType *io) +{ + #define NOF_BYTES_PER_LINE 32 /* how many bytes are shown on a line. This defines as well the chunk size we read from memory */ + #define MAX_NOF_BYTES_PER_LINE 32 + uint8_t buf[MAX_NOF_BYTES_PER_LINE]; /* this is the chunk of data we get (per line in output) */ + uint8_t str[3*MAX_NOF_BYTES_PER_LINE+((MAX_NOF_BYTES_PER_LINE+1)/8)+1]; /* maximum string for output: + - '3*' because each byte is 2 hex digits plus a space + - '(NOF_BYTES_PER_LINE+1)/8' because we add a space between every 8 byte block + - '+1' for the final zero byte */ + uint32_t addr; + uint8_t res=0, j, bufSize; + uint8_t ch; + + if (endAddrstdErr); + return ERR_RANGE; + } + for(addr=startAddr; addr<=endAddr; /* nothing */ ) { + if (endAddr-addr+1 >= bytesPerLine) { /* read only part of buffer */ + bufSize = bytesPerLine; /* read full buffer */ + } else { + bufSize = (uint8_t)(endAddr-addr+1); + } + if (readfp(hndl, addr, buf, bufSize)!=ERR_OK) { + McuShell_SendStr((unsigned char*)"\r\n*** Read failed!\r\n", io->stdErr); + return ERR_FAILED; + } + if (res != ERR_OK) { + McuShell_SendStr((unsigned char*)"\r\n*** Failure reading memory block!\r\n", io->stdErr); + return ERR_FAULT; + } + /* write address */ + McuUtility_strcpy(str, sizeof(str), (unsigned char*)"0x"); + McuUtility_strcatNumHex(str, sizeof(str), addr, addrSize); + McuUtility_chcat(str, sizeof(str), ':'); + McuShell_SendStr((unsigned char*)str, io->stdOut); + /* write data in hex */ + str[0] = '\0'; + for (j=0; jstdOut); + /* write in ASCII */ + io->stdOut(' '); + for (j=0; j= ' ' && ch <= 0x7f) { + io->stdOut(ch); + } else { + io->stdOut('.'); /* place holder */ + } + } + for (/*empty*/; jstdOut); + addr += bytesPerLine; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : ProcessConsoleInput (component Shell) +** +** Description : +** Processes a string received from a console which can include +** backspace characters. +** Parameters : +** NAME - DESCRIPTION +** * buf - Pointer to character buffer +** bufSize - Size of buffer +** Returns : +** --- - Number of characters in the buffer +** =================================================================== +*/ +int McuShell_ProcessConsoleInput(char *buf, size_t bufSize) +{ + /* - convert '\r' at the end to '\n' + * - handle '\b' backspace in input + */ + char *src, *dst; /* dst is the current cursor in the string, changed as well by '\b' */ + size_t len; + + if (bufSize<2) { + return 0; /* buffer size needs room for at least two bytes: '\n' and '\0' */ + } + src = (char*)buf; + dst = (char*)buf; + while(*src!='\0') { + if (*src=='\r' && *(src+1)=='\0') { + *src = '\n'; /* convert '\r' at the end to '\n' */ + } + if (*src=='\b') { /* backspace */ + if (dst!=buf) { /* go back only if not at start */ + dst--; /* move cursor backward */ + } + src++; + continue; /* jump to while condition */ + } + *dst++ = *src++; /* copy char */ + } + *dst = '\0'; /* terminate resulting string */ + len = McuUtility_strlen(buf); + if (buf[len-1]!='\n') { /* no line ending? */ + McuUtility_chcat((unsigned char*)buf, bufSize, '\n'); + } + return McuUtility_strlen(buf); +} + +/* END McuShell. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuShell.h b/TSM_PicoW_Sensor/McuLib/src/McuShell.h new file mode 100644 index 0000000..b7484dc --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuShell.h @@ -0,0 +1,909 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuShell.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : Shell +** Version : Component 01.115, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2025-01-16, 10:11, # CodeGen: 850 +** Abstract : +** Module implementing a command line shell. +** Settings : +** Component name : McuShell +** Echo : no +** Prompt : "CMD> " +** Project Name : My Project Name +** Silent Mode Prefix : # +** Buffer Size : 48 +** Blocking Send : Enabled +** Wait : McuWait +** Timeout (ms) : 20 +** Wait Time (ms) : 5 +** RTOS Wait : yes +** Status Colon Pos : 13 +** Help Semicolon Pos : 26 +** Multi Command : Disabled +** Utility : McuUtility +** Default Serial : Disabled +** Semaphore : no +** Critical Section : McuCriticalSection +** History : no +** Kinetis SDK : McuLib +** Contents : +** PrintPrompt - void McuShell_PrintPrompt(McuShell_ConstStdIOType *io); +** SendNum8u - void McuShell_SendNum8u(uint8_t val, McuShell_StdIO_OutErr_FctType io); +** SendNum8s - void McuShell_SendNum8s(int8_t val, McuShell_StdIO_OutErr_FctType io); +** SendNum16u - void McuShell_SendNum16u(uint16_t val, McuShell_StdIO_OutErr_FctType io); +** SendNum16s - void McuShell_SendNum16s(int16_t val, McuShell_StdIO_OutErr_FctType io); +** SendNum32u - void McuShell_SendNum32u(uint32_t val, McuShell_StdIO_OutErr_FctType io); +** SendNum32s - void McuShell_SendNum32s(int32_t val, McuShell_StdIO_OutErr_FctType io); +** SendCh - void McuShell_SendCh(uint8_t ch, McuShell_StdIO_OutErr_FctType io); +** SendStr - void McuShell_SendStr(const uint8_t *str, McuShell_StdIO_OutErr_FctType io); +** PrintMemory - uint8_t McuShell_PrintMemory(void *hndl, uint32_t startAddr, uint32_t... +** printfIO - unsigned McuShell_printfIO(McuShell_ConstStdIOType *io, const char *fmt, ...); +** printf - unsigned McuShell_printf(const char *fmt, ...); +** SendData - void McuShell_SendData(const uint8_t *data, uint16_t dataSize,... +** PrintStatus - uint8_t McuShell_PrintStatus(McuShell_ConstStdIOType *io); +** ParseCommand - uint8_t McuShell_ParseCommand(const uint8_t *cmd, bool *handled,... +** IsHistoryCharacter - bool McuShell_IsHistoryCharacter(uint8_t ch, uint8_t *cmdBuf, size_t... +** ProcessConsoleInput - int McuShell_ProcessConsoleInput(char *buf, size_t bufSize); +** ReadLine - bool McuShell_ReadLine(uint8_t *bufStart, uint8_t *buf, size_t bufSize,... +** PrintCommandFailed - void McuShell_PrintCommandFailed(const uint8_t *cmd, McuShell_ConstStdIOType... +** IterateTable - uint8_t McuShell_IterateTable(const uint8_t *cmd, bool *handled,... +** SetStdio - uint8_t McuShell_SetStdio(McuShell_ConstStdIOTypePtr stdio); +** GetStdio - McuShell_ConstStdIOTypePtr McuShell_GetStdio(void); +** RequestSerial - void McuShell_RequestSerial(void); +** ReleaseSerial - void McuShell_ReleaseSerial(void); +** ReadAndParseWithCommandTableExt - uint8_t McuShell_ReadAndParseWithCommandTableExt(uint8_t *cmdBuf, size_t... +** ReadCommandLine - uint8_t McuShell_ReadCommandLine(uint8_t *cmdBuf, size_t cmdBufSize,... +** ReadAndParseWithCommandTable - uint8_t McuShell_ReadAndParseWithCommandTable(uint8_t *cmdBuf, size_t... +** ParseWithCommandTableExt - uint8_t McuShell_ParseWithCommandTableExt(const uint8_t *cmd,... +** ParseWithCommandTable - uint8_t McuShell_ParseWithCommandTable(const uint8_t *cmd,... +** GetSemaphore - void* McuShell_GetSemaphore(void); +** SendStatusStr - void McuShell_SendStatusStr(const uint8_t *strItem, const uint8_t *strStatus,... +** SendHelpStr - void McuShell_SendHelpStr(const uint8_t *strCmd, const uint8_t *strHelp,... +** ReadChar - void McuShell_ReadChar(uint8_t *c); +** SendChar - void McuShell_SendChar(uint8_t ch); +** KeyPressed - bool McuShell_KeyPressed(void); +** SendCharFct - void McuShell_SendCharFct(uint8_t ch, uint8_t (*fct)(uint8_t ch)); +** Init - void McuShell_Init(void); +** Deinit - void McuShell_Deinit(void); +** +** * Copyright (c) 2014-2025, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuShell.h +** @version 01.00 +** @brief +** Module implementing a command line shell. +*/ +/*! +** @addtogroup McuShell_module McuShell module documentation +** @{ +*/ + + +#ifndef __McuShell_H +#define __McuShell_H + +/* MODULE McuShell. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuShellconfig.h" /* configuration */ +#include +#include + + +#ifndef __BWUserType_McuShell_StdIO_OutErr_FctType +#define __BWUserType_McuShell_StdIO_OutErr_FctType + typedef void (*McuShell_StdIO_OutErr_FctType)(uint8_t); /* Callback for an output or error I/O function */ +#endif +#ifndef __BWUserType_McuShell_StdIO_In_FctType +#define __BWUserType_McuShell_StdIO_In_FctType + typedef void (*McuShell_StdIO_In_FctType)(uint8_t *); /* Callback for an I/O input function. */ +#endif +#ifndef __BWUserType_McuShell_StdIO_KeyPressed_FctType +#define __BWUserType_McuShell_StdIO_KeyPressed_FctType + typedef bool (*McuShell_StdIO_KeyPressed_FctType)(void); /* Callback which returns true if a key has been pressed */ +#endif +#ifndef __BWUserType_McuShell_StdIOType +#define __BWUserType_McuShell_StdIOType + typedef struct { /* Record containing input, output and error callback (stdin, stdout, stderr). */ + McuShell_StdIO_In_FctType stdIn; /* standard input */ + McuShell_StdIO_OutErr_FctType stdOut; /* standard output */ + McuShell_StdIO_OutErr_FctType stdErr; /* standard error */ + McuShell_StdIO_KeyPressed_FctType keyPressed; /* key pressed callback */ + #if McuShell_CONFIG_ECHO_ENABLED + bool echoEnabled; /* true if I/O shall echo characters */ + #endif + } McuShell_StdIOType; +#endif +#ifndef __BWUserType_McuShell_ConstStdIOType +#define __BWUserType_McuShell_ConstStdIOType + typedef const McuShell_StdIOType McuShell_ConstStdIOType; /* constant StdIOType */ +#endif +#ifndef __BWUserType_McuShell_ParseCommandCallback +#define __BWUserType_McuShell_ParseCommandCallback + typedef uint8_t (*McuShell_ParseCommandCallback)(const uint8_t *cmd, bool *handled, const McuShell_StdIOType *io); /* Callback for parsing a shell command */ +#endif +#ifndef __BWUserType_McuShell_ConstStdIOTypePtr +#define __BWUserType_McuShell_ConstStdIOTypePtr + typedef const McuShell_ConstStdIOType *McuShell_ConstStdIOTypePtr; /* Pointer to constant standard I/O descriptor */ +#endif +#ifndef __BWUserType_McuShell_ConstParseCommandCallback +#define __BWUserType_McuShell_ConstParseCommandCallback + typedef const McuShell_ParseCommandCallback McuShell_ConstParseCommandCallback; /* Callback for parsing a shell command */ +#endif + +#define McuShell_DEFAULT_SHELL_BUFFER_SIZE McuShell_CONFIG_DEFAULT_SHELL_BUFFER_SIZE /* default buffer size for shell command parsing */ + +/* Include inherited components */ + +/* other includes needed */ +#include /* for size_t */ + + +/* VTxxx control and color codes which can be used in terminals supporting color. See https://en.wikipedia.org/wiki/ANSI_escape_code */ +/* general control */ +#define McuShell_ANSI_CONTROL_RESET "\033[0m" /* reset to defaults */ +#define McuShell_ANSI_CONTROL_CLEAR "\033[2J" /* clear terminal */ +/* text colors: */ +#define McuShell_ANSI_COLOR_TEXT_BLACK "\033[2;30m" +#define McuShell_ANSI_COLOR_TEXT_RED "\033[2;31m" +#define McuShell_ANSI_COLOR_TEXT_GREEN "\033[2;32m" +#define McuShell_ANSI_COLOR_TEXT_YELLOW "\033[2;33m" +#define McuShell_ANSI_COLOR_TEXT_BLUE "\033[2;34m" +#define McuShell_ANSI_COLOR_TEXT_MAGENTA "\033[2;35m" +#define McuShell_ANSI_COLOR_TEXT_CYAN "\033[2;36m" +#define McuShell_ANSI_COLOR_TEXT_WHITE "\033[2;37m" +#define McuShell_ANSI_COLOR_TEXT_BRIGHT_BLACK "\033[1;30m" +#define McuShell_ANSI_COLOR_TEXT_BRIGHT_RED "\033[1;31m" +#define McuShell_ANSI_COLOR_TEXT_BRIGHT_GREEN "\033[1;32m" +#define McuShell_ANSI_COLOR_TEXT_BRIGHT_YELLOW "\033[1;33m" +#define McuShell_ANSI_COLOR_TEXT_BRIGHT_BLUE "\033[1;34m" +#define McuShell_ANSI_COLOR_TEXT_BRIGHT_MAGENTA "\033[1;35m" +#define McuShell_ANSI_COLOR_TEXT_BRIGHT_CYAN "\033[1;36m" +#define McuShell_ANSI_COLOR_TEXT_BRIGHT_WHITE "\033[1;37m" +/* text background colors */ +#define McuShell_ANSI_COLOR_BG_BLACK "\033[24;40m" +#define McuShell_ANSI_COLOR_BG_RED "\033[24;41m" +#define McuShell_ANSI_COLOR_BG_GREEN "\033[24;42m" +#define McuShell_ANSI_COLOR_BG_YELLOW "\033[24;43m" +#define McuShell_ANSI_COLOR_BG_BLUE "\033[24;44m" +#define McuShell_ANSI_COLOR_BG_MAGENTA "\033[24;45m" +#define McuShell_ANSI_COLOR_BG_CYAN "\033[24;46m" +#define McuShell_ANSI_COLOR_BG_WHITE "\033[24;47m" +#define McuShell_ANSI_COLOR_BG_BRIGHT_BLACK "\033[4;40m" +#define McuShell_ANSI_COLOR_BG_BRIGHT_RED "\033[4;41m" +#define McuShell_ANSI_COLOR_BG_BRIGHT_GREEN "\033[4;42m" +#define McuShell_ANSI_COLOR_BG_BRIGHT_YELLOW "\033[4;43m" +#define McuShell_ANSI_COLOR_BRIGHT_BLUE "\033[4;44m" +#define McuShell_ANSI_COLOR_BRIGHT_MAGENTA "\033[4;45m" +#define McuShell_ANSI_COLOR_BRIGHT_CYAN "\033[4;46m" +#define McuShell_ANSI_COLOR_BRIGHT_WHITE "\033[4;47m" + +/* settings for silent prefix char */ +#define McuShell_NO_SILENT_PREFIX_CHAR ' ' /* used for no silent prefix char */ +#define McuShell_SILENT_PREFIX_CHAR_ENABLED (McuShell_CONFIG_SILENT_PREFIX_CHAR != McuShell_NO_SILENT_PREFIX_CHAR) + +#define McuShell_DEFAULT_SERIAL McuShell_CONFIG_DEFAULT_SERIAL /* If set to 1, then the shell implements its own StdIO which is returned by McuShell_GetStdio(); */ + +extern uint8_t McuShell_DefaultShellBuffer[McuShell_DEFAULT_SHELL_BUFFER_SIZE]; /* default buffer which can be used by the application */ + +#if McuShell_DEFAULT_SERIAL + extern McuShell_ConstStdIOType McuShell_stdio; /* default standard I/O */ +#endif + +#define McuShell_DASH_LINE "--------------------------------------------------------------" +/* predefined commands */ +#define McuShell_CMD_HELP "help" +#define McuShell_CMD_STATUS "status" + +#ifdef __cplusplus +extern "C" { +#endif + +void McuShell_SendStr(const uint8_t *str, McuShell_StdIO_OutErr_FctType io); +/* +** =================================================================== +** Method : SendStr (component Shell) +** +** Description : +** Prints a string using an I/O function +** Parameters : +** NAME - DESCRIPTION +** * str - Pointer to string (zero terminated) to be +** printed. +** io - I/O callbacks to be used for printing. +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuShell_ParseCommand(const uint8_t *cmd, bool *handled, McuShell_ConstStdIOType *io); +/* +** =================================================================== +** Method : ParseCommand (component Shell) +** +** Description : +** Parses a shell command. Use 'help' to get a list of +** supported commands. +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command string +** * handled - Pointer to variable to indicate if +** the command has been handled. The caller +** passes this variable to the command scanner +** to find out if the passed command has been +** handled. The variable is initialized by the +** caller. +** * io - Pointer to I/O callbacks +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuShell_SendNum32s(int32_t val, McuShell_StdIO_OutErr_FctType io); +/* +** =================================================================== +** Method : SendNum32s (component Shell) +** +** Description : +** Sends a 32bit signed number to the given I/O +** Parameters : +** NAME - DESCRIPTION +** val - number to print +** io - I/O callbacks to be used for printing. +** Returns : Nothing +** =================================================================== +*/ + +void McuShell_SendNum16s(int16_t val, McuShell_StdIO_OutErr_FctType io); +/* +** =================================================================== +** Method : SendNum16s (component Shell) +** +** Description : +** Sends a 16bit signed number to the given I/O +** Parameters : +** NAME - DESCRIPTION +** val - number to print +** io - I/O callbacks to be used for printing. +** Returns : Nothing +** =================================================================== +*/ + +void McuShell_PrintPrompt(McuShell_ConstStdIOType *io); +/* +** =================================================================== +** Method : PrintPrompt (component Shell) +** +** Description : +** Prints the prompt to the stdOut channel +** Parameters : +** NAME - DESCRIPTION +** * io - Pointer to IO to be used +** Returns : Nothing +** =================================================================== +*/ + +bool McuShell_ReadLine(uint8_t *bufStart, uint8_t *buf, size_t bufSize, McuShell_ConstStdIOType *io); +/* +** =================================================================== +** Method : ReadLine (component Shell) +** +** Description : +** Reads a line from stdIn and returns TRUE if we have a line, +** FALSE otherwise. +** Parameters : +** NAME - DESCRIPTION +** * bufStart - Pointer to start of buffer +** * buf - Pointer to buffer where to read in the +** information +** bufSize - size of buffer +** * io - Pointer to I/O callbacks +** Returns : +** --- - TRUE if something has been read, FALSE +** otherwise +** =================================================================== +*/ + +uint8_t McuShell_PrintStatus(McuShell_ConstStdIOType *io); +/* +** =================================================================== +** Method : PrintStatus (component Shell) +** +** Description : +** Prints various available system status information +** Parameters : +** NAME - DESCRIPTION +** * io - Pointer to I/O callbacks +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuShell_PrintCommandFailed(const uint8_t *cmd, McuShell_ConstStdIOType *io); +/* +** =================================================================== +** Method : PrintCommandFailed (component Shell) +** +** Description : +** Prints a standard message for failed or unknown commands +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command which was failing +** * io - Pointer to I/O callbacks +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuShell_ParseWithCommandTable(const uint8_t *cmd, McuShell_ConstStdIOType *io, McuShell_ConstParseCommandCallback *parseCallback); +/* +** =================================================================== +** Method : ParseWithCommandTable (component Shell) +** +** Description : +** Parses a shell command. It handles first the internal +** commands and will call the provided callback. +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command string +** * io - Pointer to I/O callbacks +** * parseCallback - Pointer to callback +** which will be called to parse commands in +** the user application, or NULL if not used. +** Returns : +** --- - Error code +** =================================================================== +*/ + +McuShell_ConstStdIOTypePtr McuShell_GetStdio(void); +/* +** =================================================================== +** Method : GetStdio (component Shell) +** +** Description : +** Returns the default stdio channel. This method is only +** available if a shell is enabled in the component properties. +** Parameters : None +** Returns : +** --- - Pointer to the stdio descriptor +** =================================================================== +*/ + +void McuShell_SendNum32u(uint32_t val, McuShell_StdIO_OutErr_FctType io); +/* +** =================================================================== +** Method : SendNum32u (component Shell) +** +** Description : +** Sends a 32bit unsigned number to the given I/O +** Parameters : +** NAME - DESCRIPTION +** val - number to print +** io - I/O callbacks to be used for printing. +** Returns : Nothing +** =================================================================== +*/ + +void McuShell_SendNum16u(uint16_t val, McuShell_StdIO_OutErr_FctType io); +/* +** =================================================================== +** Method : SendNum16u (component Shell) +** +** Description : +** Sends a 16bit unsigned number to the given I/O +** Parameters : +** NAME - DESCRIPTION +** val - number to print +** io - I/O callbacks to be used for printing. +** Returns : Nothing +** =================================================================== +*/ + +void McuShell_SendNum8u(uint8_t val, McuShell_StdIO_OutErr_FctType io); +/* +** =================================================================== +** Method : SendNum8u (component Shell) +** +** Description : +** Sends an 8bit unsigned number to the given I/O +** Parameters : +** NAME - DESCRIPTION +** val - number to print +** io - I/O callbacks to be used for printing. +** Returns : Nothing +** =================================================================== +*/ + +void McuShell_SendNum8s(int8_t val, McuShell_StdIO_OutErr_FctType io); +/* +** =================================================================== +** Method : SendNum8s (component Shell) +** +** Description : +** Sends an 8bit signed number to the given I/O +** Parameters : +** NAME - DESCRIPTION +** val - number to print +** io - I/O callbacks to be used for printing. +** Returns : Nothing +** =================================================================== +*/ + +void McuShell_Init(void); +/* +** =================================================================== +** Method : Init (component Shell) +** +** Description : +** Initializes the module, especially creates the mutex +** semaphore if an RTOS is used. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuShell_RequestSerial(void); +/* +** =================================================================== +** Method : RequestSerial (component Shell) +** +** Description : +** Used to get mutual access to the shell console. Only has an +** effect if using an RTOS with semaphore for the console +** access. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuShell_ReleaseSerial(void); +/* +** =================================================================== +** Method : ReleaseSerial (component Shell) +** +** Description : +** Used to release mutual access to the shell console. Only has +** an effect if using an RTOS with semaphore for the console +** access. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuShell_SendHelpStr(const uint8_t *strCmd, const uint8_t *strHelp, McuShell_StdIO_OutErr_FctType io); +/* +** =================================================================== +** Method : SendHelpStr (component Shell) +** +** Description : +** Prints a string using an I/O function, formated for the +** 'help' command +** Parameters : +** NAME - DESCRIPTION +** * strCmd - Pointer to string of the command +** * strHelp - Pointer to help text string +** io - I/O callbacks to be used for printing. +** Returns : Nothing +** =================================================================== +*/ + +void McuShell_SendStatusStr(const uint8_t *strItem, const uint8_t *strStatus, McuShell_StdIO_OutErr_FctType io); +/* +** =================================================================== +** Method : SendStatusStr (component Shell) +** +** Description : +** Prints a status string using an I/O function, formated for +** the 'status' command +** Parameters : +** NAME - DESCRIPTION +** * strItem - Pointer to string of the command +** * strStatus - Pointer to help text string +** io - I/O callbacks to be used for printing. +** Returns : Nothing +** =================================================================== +*/ + +void McuShell_ReadChar(uint8_t *c); +/* +** =================================================================== +** Method : ReadChar (component Shell) +** +** Description : +** Reads a character (blocking) +** Parameters : +** NAME - DESCRIPTION +** * c - Pointer to character to be used to store the +** result +** Returns : Nothing +** =================================================================== +*/ + +void McuShell_SendChar(uint8_t ch); +/* +** =================================================================== +** Method : SendChar (component Shell) +** +** Description : +** Sends a character (blocking) +** Parameters : +** NAME - DESCRIPTION +** ch - character to be sent +** Returns : Nothing +** =================================================================== +*/ + +bool McuShell_KeyPressed(void); +/* +** =================================================================== +** Method : KeyPressed (component Shell) +** +** Description : +** Checks if a key has been pressed (a character is present in +** the input buffer) +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuShell_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component Shell) +** +** Description : +** De-Initializes the module, especially frees the mutex +** semaphore if an RTOS is used. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void* McuShell_GetSemaphore(void); +/* +** =================================================================== +** Method : GetSemaphore (component Shell) +** +** Description : +** Return the semaphore of the shell. +** Parameters : None +** Returns : +** --- - semaphore, or NULL if not used or not +** allocated. +** =================================================================== +*/ + +uint8_t McuShell_ReadAndParseWithCommandTable(uint8_t *cmdBuf, size_t cmdBufSize, McuShell_ConstStdIOType *io, McuShell_ConstParseCommandCallback *parseCallback); +/* +** =================================================================== +** Method : ReadAndParseWithCommandTable (component Shell) +** +** Description : +** Reads characters from the default input channel and appends +** it to the buffer. Once a new line has been detected, the +** line will be parsed using the handlers in the table. +** Parameters : +** NAME - DESCRIPTION +** * cmdBuf - Pointer to buffer provided by the +** caller where to store the command to read +** in. Characters will be appended, so make +** sure string buffer is initialized with a +** zero byte at the beginning. +** cmdBufSize - Size of buffer +** * io - Pointer to I/O channels to be used +** * parseCallback - Pointer to callback +** table provided by the user application to +** parse commands. The table has a NULL +** sentinel. +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuShell_IterateTable(const uint8_t *cmd, bool *handled, McuShell_ConstStdIOType *io, McuShell_ConstParseCommandCallback *parserTable); +/* +** =================================================================== +** Method : IterateTable (component Shell) +** +** Description : +** Parses a shell command. It handles first the internal +** commands and will call the provided callback. +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command string +** * handled - Pointer to boolean which is set to +** TRUE if a command parser has handled the +** command. +** * io - Pointer to I/O callbacks +** * parserTable - Pointer to callback which +** will be called to parse commands in the +** user application, or NULL if not used. +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuShell_SetStdio(McuShell_ConstStdIOTypePtr stdio); +/* +** =================================================================== +** Method : SetStdio (component Shell) +** +** Description : +** Sets an StdIO structure which is returned by GetStdio() +** Parameters : +** NAME - DESCRIPTION +** stdio - New stdio structure to be used. +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuShell_SendData(const uint8_t *data, uint16_t dataSize, McuShell_StdIO_OutErr_FctType io); +/* +** =================================================================== +** Method : SendData (component Shell) +** +** Description : +** Sends data using an I/O function. Unlike SendStr(), with +** this method it is possible to send binary data, including +** zero bytes. +** Parameters : +** NAME - DESCRIPTION +** * data - Pointer to data to be sent +** dataSize - Number of bytes to be sent. +** io - I/O callbacks to be used for printing. +** Returns : Nothing +** =================================================================== +*/ + +bool McuShell_IsHistoryCharacter(uint8_t ch, uint8_t *cmdBuf, size_t cmdBufIdx, bool *isPrev); +/* +** =================================================================== +** Method : IsHistoryCharacter (component Shell) +** +** Description : +** Returns TRUE if character is a history character +** Parameters : +** NAME - DESCRIPTION +** ch - current command character +** * cmdBuf - Pointer to command line buffer read +** so far +** cmdBufIdx - Index of character into cmdBuf +** * isPrev - Pointer to return value, if it is +** 'previous' history or not +** Returns : +** --- - TRUE if it is an accepted history character +** =================================================================== +*/ + +void McuShell_SendCh(uint8_t ch, McuShell_StdIO_OutErr_FctType io); +/* +** =================================================================== +** Method : SendCh (component Shell) +** +** Description : +** Prints a character using an I/O function +** Parameters : +** NAME - DESCRIPTION +** ch - Character to send +** io - I/O callbacks to be used for printing. +** Returns : Nothing +** =================================================================== +*/ + +unsigned McuShell_printf(const char *fmt, ...); +/* +** =================================================================== +** Method : printf (component Shell) +** +** Description : +** Printf() style function using XFormat component, using the +** shell default I/O handler. +** Parameters : +** NAME - DESCRIPTION +** fmt - printf style format string +** Returns : +** --- - number of characters written +** =================================================================== +*/ + +void McuShell_printfPutChar(void *arg, char c); +/* +** =================================================================== +** Method : McuShell_printfPutChar (component Shell) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ + +unsigned McuShell_printfIO(McuShell_ConstStdIOType *io, const char *fmt, ...); +/* +** =================================================================== +** Method : printfIO (component Shell) +** +** Description : +** Printf() style function using XFormat component, using a +** custom I/O handler. +** Parameters : +** NAME - DESCRIPTION +** * io - Pointer to +** fmt - printf style format string +** Returns : +** --- - number of characters written +** =================================================================== +*/ + +void McuShell_SendCharFct(uint8_t ch, uint8_t (*fct)(uint8_t ch)); +/* +** =================================================================== +** Method : SendCharFct (component Shell) +** +** Description : +** Method to send a character using a standard I/O handle. +** Parameters : +** NAME - DESCRIPTION +** ch - character to be sent +** * fct - Function pointer to output function: takes +** a byte to write and returns error code. +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuShell_PrintMemory(void *hndl, uint32_t startAddr, uint32_t endAddr, uint8_t addrSize, uint8_t bytesPerLine, uint8_t (*readfp)(void *, uint32_t, uint8_t*, size_t), McuShell_ConstStdIOType *io); +/* +** =================================================================== +** Method : PrintMemory (component Shell) +** +** Description : +** Prints a chunk of memory bytes in a formatted way. +** Parameters : +** NAME - DESCRIPTION +** * hndl - Pointer to +** startAddr - Memory start address +** endAddr - Memory end address +** addrSize - Number of bytes for the address +** (1, 2, 3 or 4) +** bytesPerLine - Number of bytes per line +** readfp - Function pointer to read the memory. +** Returns error code, uses a device handle, +** 32bit address with a pointer to a buffer +** and a buffer size. +** * io - Pointer to I/O to be used +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuShell_ReadAndParseWithCommandTableExt(uint8_t *cmdBuf, size_t cmdBufSize, McuShell_ConstStdIOType *io, McuShell_ConstParseCommandCallback *parseCallback, bool silent); +/* +** =================================================================== +** Method : ReadAndParseWithCommandTableExt (component Shell) +** +** Description : +** Reads characters from the default input channel and appends +** it to the buffer. Once a new line has been detected, the +** line will be parsed using the handlers in the table. +** Parameters : +** NAME - DESCRIPTION +** * cmdBuf - Pointer to buffer provided by the +** caller where to store the command to read +** in. Characters will be appended, so make +** sure string buffer is initialized with a +** zero byte at the beginning. +** cmdBufSize - Size of buffer +** * io - Pointer to I/O channels to be used +** * parseCallback - Pointer to callback +** table provided by the user application to +** parse commands. The table has a NULL +** sentinel. +** silent - If handling shall be silent, i.e. no +** command prompt printed +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuShell_ParseWithCommandTableExt(const uint8_t *cmd, McuShell_ConstStdIOType *io, McuShell_ConstParseCommandCallback *parseCallback, bool silent); +/* +** =================================================================== +** Method : ParseWithCommandTableExt (component Shell) +** +** Description : +** Parses a shell command. It handles first the internal +** commands and will call the provided callback. +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command string +** * io - Pointer to I/O callbacks +** * parseCallback - Pointer to callback +** which will be called to parse commands in +** the user application, or NULL if not used. +** silent - If handling shall be silent, i.e. no +** command prompt printed +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuShell_ReadCommandLine(uint8_t *cmdBuf, size_t cmdBufSize, McuShell_ConstStdIOType *io); +/* +** =================================================================== +** Method : ReadCommandLine (component Shell) +** +** Description : +** Similar to ReadAndParseWithCommandTableExt, but does not +** call the parser. Reads characters from the default input +** channel and appends it to the buffer. Once a new line has +** been detected, it removes it and returns ERR_OK +** Parameters : +** NAME - DESCRIPTION +** * cmdBuf - Pointer to buffer provided by the +** caller where to store the command to read +** in. Characters will be appended, so make +** sure string buffer is initialized with a +** zero byte at the beginning. +** cmdBufSize - Size of buffer +** * io - Pointer to I/O channels to be used +** Returns : +** --- - Error code, ERR_OK if a complete line has +** been detected +** =================================================================== +*/ + +int McuShell_ProcessConsoleInput(char *buf, size_t bufSize); +/* +** =================================================================== +** Method : ProcessConsoleInput (component Shell) +** +** Description : +** Processes a string received from a console which can include +** backspace characters. +** Parameters : +** NAME - DESCRIPTION +** * buf - Pointer to character buffer +** bufSize - Size of buffer +** Returns : +** --- - Number of characters in the buffer +** =================================================================== +*/ + +/* END McuShell. */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif +/* ifndef __McuShell_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuShellCdcDevice.c b/TSM_PicoW_Sensor/McuLib/src/McuShellCdcDevice.c new file mode 100644 index 0000000..8d661db --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuShellCdcDevice.c @@ -0,0 +1,300 @@ +/* + * Copyright (c) 2024, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * + * cdcTask() -> device USB process -> tud_cdc_rx_cb() -> McuShellCdcDevice_callbacks.buffer_rx_char() + * + */ + +#include "McuLib.h" +#if McuShellCdcDevice_CONFIG_IS_ENABLED +#include "McuShellCdcDevice.h" +#include +#include "McuShell.h" +#include "McuLog.h" +#include "McuRTOS.h" +#include "McuUtility.h" +#include "McuRB.h" +#if McuLib_CONFIG_CPU_IS_RPxxxx + #include "tusb.h" +#endif + +#if McuShellCdcDevice_CONFIG_USE_FREERTOS + static QueueHandle_t rxQueue; +#else + static McuRB_Handle_t rxRingBuffer; +#endif + +/* callbacks to deal with the CDC communication channel */ +static struct McuShellCdcDevice_s { + void (*buffer_rx_char)(char ch); /* called for incoming characters from CDC device */ +} McuShellCdcDevice_callbacks; + +void McuShellCdcDevice_SetBufferRxCharCallback(void (*buffer_rx_char_cb)(char ch)) { + McuShellCdcDevice_callbacks.buffer_rx_char = buffer_rx_char_cb; +} + +/*********************************************************************************************************/ +/* Shell interface */ +/*********************************************************************************************************/ +static void McuShellCdcDevice_SendChar(unsigned char ch) { + if (McuShellCdcDevice_IsReady()) { + for(int i=0; i<10; i++) { /* timeout of 10 ms */ + if (tud_cdc_n_write_available(0)>=1) { + (void)tud_cdc_write_char(ch); + break; + } else { + vTaskDelay(pdMS_TO_TICKS(1)); + } + } /* for */ + McuShellCdcDevice_Flush(); + } /* if */ +} + +static void McuShellCdcDevice_ReceiveChar(uint8_t *c) { + uint8_t ch; + +#if McuShellCdcDevice_CONFIG_USE_FREERTOS + if (xQueueReceive(rxQueue, &ch, 0)==pdPASS ) { + *c = ch; /* return received character */ + } else { + *c = '\0'; /* nothing received */ + } +#else + if (McuRB_Get(rxRingBuffer, &ch)!=ERR_OK) { + *c = '\0'; /* nothing received */ + } else { + *c = ch; /* return received character */ + } +#endif +} + +int McuShellCdcDevice_ReadByte(void) { + uint8_t ch; + +#if McuShellCdcDevice_CONFIG_USE_FREERTOS + if (xQueueReceive(rxQueue, &ch, 0)==pdPASS ) { + return ch; /* return received character */ + } else { + return EOF; /* nothing received */ + } +#else + if (McuRB_Get(rxRingBuffer, &ch)==ERR_OK) { + return = ch; /* return received character */ + } else { + return EOF; /* nothing received */ + } +#endif +} + +static bool McuShellCdcDevice_CharPresent(void) { +#if McuShellCdcDevice_CONFIG_USE_FREERTOS + return uxQueueMessagesWaiting(rxQueue)!=0; +#else + return McuRB_NofElements(rxRingBuffer)!=0; +#endif +} + +void McuShellCdcDevice_QueueChar(char ch) { + if (xQueueSend(rxQueue, &ch, portMAX_DELAY)!=pdPASS) { + McuLog_fatal("failed adding to queue"); + } +} + +McuShell_ConstStdIOType McuShellCdcDevice_stdio = { + .stdIn = (McuShell_StdIO_In_FctType)McuShellCdcDevice_ReceiveChar, + .stdOut = (McuShell_StdIO_OutErr_FctType)McuShellCdcDevice_SendChar, + .stdErr = (McuShell_StdIO_OutErr_FctType)McuShellCdcDevice_SendChar, + .keyPressed = McuShellCdcDevice_CharPresent, /* if input is not empty */ + #if McuShell_CONFIG_ECHO_ENABLED + .echoEnabled = false, + #endif +}; + +McuShell_ConstStdIOTypePtr McuShellCdcDevice_GetStdio(void) { + return &McuShellCdcDevice_stdio; +} + +uint8_t McuShellCdcDevice_DefaultShellBuffer[McuShell_DEFAULT_SHELL_BUFFER_SIZE]; /* default buffer which can be used by the application */ +/*********************************************************************************************************/ + +void McuShellCdcDevice_Flush(void) { + (void)tud_cdc_write_flush(); +} + +void McuShellCdcDevice_WriteChar(char ch) { + McuShellCdcDevice_SendChar(ch); +} + +void McuShellCdcDevice_ReadChar(char *ch) { + McuShellCdcDevice_ReceiveChar(ch); +} + +bool McuShellCdcDevice_IsDataPresent(void) { + return McuShellCdcDevice_CharPresent(); +} + +void McuShellCdcDevice_WriteAndFlush(const char *buf, size_t count) { + tud_cdc_n_write(0, buf, count); + (void)tud_cdc_write_flush(); +} + +void McuShellCdcDevice_WriteStr(const char *str) { + tud_cdc_write_str(str); +} + +bool McuShellCdcDevice_IsConnected(void) { + return tud_cdc_connected(); /* note: 'connected' seems to be not accurate: one can be 'not connected' but 'ready' to send/receive data? */ +} + +bool McuShellCdcDevice_IsReady(void) { /* device is ready to transfer */ + return tud_cdc_ready(); +} + +uint8_t McuShellCdcDevice_GetLineState(void) { + return tud_cdc_get_line_state(); +} + +static void McuShellCdcDevice_GetLineCodingStr(unsigned char *buf, size_t bufSize) { + cdc_line_coding_t info; + + tud_cdc_get_line_coding(&info); + buf[0] = '\0'; + McuUtility_strcatNum32u(buf, bufSize, info.bit_rate); + McuUtility_strcat(buf, bufSize, ", data: "); + McuUtility_strcatNum8u(buf, bufSize, info.data_bits); + switch(info.parity) { + case 0: McuUtility_strcat(buf, bufSize, ", parity: None"); break; + case 1: McuUtility_strcat(buf, bufSize, ", parity: Odd"); break; + case 2: McuUtility_strcat(buf, bufSize, ", parity: Even"); break; + case 3: McuUtility_strcat(buf, bufSize, ", parity: Mark"); break; + case 4: McuUtility_strcat(buf, bufSize, ", parity: Space"); break; + default: McuUtility_strcat(buf, bufSize, ", parity: ???"); break; + } + switch(info.stop_bits) { + case 0: McuUtility_strcat(buf, bufSize, ", stop: 1"); break; + case 1: McuUtility_strcat(buf, bufSize, ", stop: 1.5"); break; + case 2: McuUtility_strcat(buf, bufSize, ", stop: 2"); break; + default: McuUtility_strcat(buf, bufSize, ", stop: ???"); break; + } + McuUtility_strcat(buf, bufSize, "\r\n"); +} + +/* Invoked when CDC interface received data from host */ +void tud_cdc_rx_cb(uint8_t itf) { + (void)itf; /*not uesed */ + static bool prevNewline = true; + char buf[64]; + uint32_t count = tud_cdc_read(buf, sizeof(buf)); + if (count>0) { + if (McuShellCdcDevice_callbacks.buffer_rx_char!=NULL) { + #if McuShellCdcDevice_CONFIG_USE_FREERTOS + for(int i=0; istdOut); +#if 0 /* not reliable, disabled for now */ + McuShell_SendStatusStr((const unsigned char*)" connected", McuShellCdcDevice_IsConnected()?(const unsigned char*)"yes\r\n":(const unsigned char*)"no\r\n", io->stdOut); +#endif + McuShell_SendStatusStr((const unsigned char*)" ready", McuShellCdcDevice_IsReady()?(const unsigned char*)"yes\r\n":(const unsigned char*)"no\r\n", io->stdOut); + + val = McuShellCdcDevice_GetLineState(); + McuUtility_strcpy(buf, sizeof(buf), "0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), val); + McuUtility_strcat(buf, sizeof(buf), "\r\n"); + McuShell_SendStatusStr((const unsigned char*)" line state", buf, io->stdOut); + + McuShellCdcDevice_GetLineCodingStr(buf, sizeof(buf)); + McuShell_SendStatusStr((const unsigned char*)" line coding", buf, io->stdOut); + return ERR_OK; +} + +static uint8_t PrintHelp(McuShell_ConstStdIOType *io) { + McuShell_SendHelpStr((unsigned char*)"McuShellCdc", (const unsigned char*)"Group of McuShellCdc commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (const unsigned char*)"Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" restart", (const unsigned char*)"Restart USB stack\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" text ", (const unsigned char*)"Send text\r\n", io->stdOut); + return ERR_OK; +} + +uint8_t McuShellCdcDevice_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) { + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, "McuShellCdc help")==0) { + *handled = true; + return PrintHelp(io); + } else if ((McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) || (McuUtility_strcmp((char*)cmd, "McuShellCdc status")==0)) { + *handled = true; + return PrintStatus(io); + } else if (McuUtility_strcmp((char*)cmd, "McuShellCdc restart")==0) { + *handled = true; + UsbDeviceRestart(); + return ERR_OK; + } else if (McuUtility_strncmp((char*)cmd, "McuShellCdc text ", sizeof("McuShellCdc text ")-1)==0) { + *handled = true; + McuShellCdcDevice_WriteStr(cmd + sizeof("McuShellCdc text ")-1); + McuShellCdcDevice_WriteStr("\r\n"); + McuShellCdcDevice_Flush(); + return ERR_OK; + } + return ERR_OK; +} + +void McuShellCdcDevice_Deinit(void) { + /* \todo */ +} + +void McuShellCdcDevice_Init(void) { + BaseType_t res = xTaskCreate(cdcTask, "cdcTask", 4*1024/sizeof(StackType_t), NULL, McuShellCdcDevice_CONFIG_PROCESS_PRIORITY, NULL); + if (res!=pdPASS) { + McuLog_fatal("creating ShellTask task failed!"); + for(;;) {} + } +#if McuShellCdcDevice_CONFIG_USE_FREERTOS + rxQueue = xQueueCreate(McuShellCdcDevice_CONFIG_RX_BUFFER_SIZE, sizeof(uint8_t)); + if (rxQueue==NULL) { + for(;;){} /* out of memory? */ + } + vQueueAddToRegistry(rxQueue, "rxQueue"); +#else + McuRB_Config_t config; + + McuRB_GetDefaultconfig(&config); + config.elementSize = sizeof(uint8_t); + config.nofElements = McuShellCdcDevice_CONFIG_RX_BUFFER_SIZE; + rxRingBuffer = McuRB_InitRB(&config); + if (rxRingBuffer==NULL) { + for(;;) {/* error */} + } +#endif +} + +#endif /* McuShellCdcDevice_CONFIG_IS_ENABLED */ \ No newline at end of file diff --git a/TSM_PicoW_Sensor/McuLib/src/McuShellCdcDevice.h b/TSM_PicoW_Sensor/McuLib/src/McuShellCdcDevice.h new file mode 100644 index 0000000..5a0bfca --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuShellCdcDevice.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2024, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef McuShellCdcDevice_H_ +#define McuShellCdcDevice_H_ + +#include "McuShellCdcDeviceconfig.h" +#include "McuShell.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*! Default McuShell buffer */ +extern uint8_t McuShellCdcDevice_DefaultShellBuffer[McuShell_DEFAULT_SHELL_BUFFER_SIZE]; /* default buffer which can be used by the application */ + +/*! Standard I/O for input/output */ +extern McuShell_ConstStdIOType McuShellCdcDevice_stdio; + +McuShell_ConstStdIOTypePtr McuShellCdcDevice_GetStdio(void); + +void McuShellCdcDevice_Flush(void); +void McuShellCdcDevice_WriteAndFlush(const char *buf, size_t count); +void McuShellCdcDevice_WriteStr(const char *str); + +void McuShellCdcDevice_WriteChar(char ch); +void McuShellCdcDevice_ReadChar(char *ch); +bool McuShellCdcDevice_IsDataPresent(void); +void McuShellCdcDevice_QueueChar(char ch); + +/*! + * \brief Return a received byte. + * \return The byte, or EOF + */ +int McuShellCdcDevice_ReadByte(void); + +bool McuShellCdcDevice_IsReady(void); /* device is ready to transfer */ +bool McuShellCdcDevice_IsConnected(void); /* note: connection status might not be accurate */ + +/*! + * \brief Set the callback for a character is received from the USB CDC channel. + * \param buffer_rx_char_cb Callback to be used to store the character. Can be NULL. + */ +void McuShellCdcDevice_SetBufferRxCharCallback(void (*buffer_rx_char_cb)(char ch)); + +uint8_t McuShellCdcDevice_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); + +/*! + * \brief Module de-initialization + */ +void McuShellCdcDevice_Deinit(void); + +/*! + * \brief Module initialization + */ +void McuShellCdcDevice_Init(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* McuShellCdcDevice_H_ */ \ No newline at end of file diff --git a/TSM_PicoW_Sensor/McuLib/src/McuShellUart.c b/TSM_PicoW_Sensor/McuLib/src/McuShellUart.c new file mode 100644 index 0000000..b54eefc --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuShellUart.c @@ -0,0 +1,500 @@ +/*! + * Copyright (c) 2020-2024, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * \file + * \brief \brief Implementation of the McuShellUart module. + */ + +#include "McuShellUartconfig.h" +#if McuShellUart_CONFIG_UART!=McuShellUart_CONFIG_UART_NONE +#include "McuShellUart.h" +#include "McuShell.h" +#if McuShellUart_CONFIG_USE_FREERTOS + #include "McuRTOS.h" +#else + #include "McuRB.h" +#endif +#if McuLib_CONFIG_CPU_IS_RPxxxx + #include "hardware/uart.h" + #include "hardware/irq.h" + #include "hardware/gpio.h" +#endif +#include "McuLog.h" + +#if McuShellUart_CONFIG_USE_FREERTOS + static QueueHandle_t uartRxQueue; +#else + static McuRB_Handle_t rxRingBuffer; +#endif + +/*********************************************************************************************************/ +/* Shell interface */ +/*********************************************************************************************************/ +static void McuShellUart_SendChar(unsigned char ch) { + McuShellUart_CONFIG_UART_WRITE_BLOCKING(McuShellUart_CONFIG_UART_DEVICE, &ch, 1); +} + +static void McuShellUart_ReadChar(uint8_t *c) { + uint8_t ch; + +#if McuShellUart_CONFIG_USE_FREERTOS + if (xQueueReceive(uartRxQueue, &ch, 0)==pdPASS ) { + *c = ch; /* return received character */ + } else { + *c = '\0'; /* nothing received */ + } +#else + if (McuRB_Get(rxRingBuffer, &ch)!=ERR_OK) { + *c = '\0'; /* nothing received */ + } else { + *c = ch; /* return received character */ + } +#endif +} + +static bool McuShellUart_CharPresent(void) { +#if McuShellUart_CONFIG_USE_FREERTOS + return uxQueueMessagesWaiting(uartRxQueue)!=0; +#else + return McuRB_NofElements(rxRingBuffer)!=0; +#endif +} + +McuShell_ConstStdIOType McuShellUart_stdio = { + .stdIn = (McuShell_StdIO_In_FctType)McuShellUart_ReadChar, + .stdOut = (McuShell_StdIO_OutErr_FctType)McuShellUart_SendChar, + .stdErr = (McuShell_StdIO_OutErr_FctType)McuShellUart_SendChar, + .keyPressed = McuShellUart_CharPresent, /* if input is not empty */ + #if McuShell_CONFIG_ECHO_ENABLED + .echoEnabled = false, + #endif +}; + +McuShell_ConstStdIOTypePtr McuShellUart_GetStdio(void) { + return &McuShellUart_stdio; +} + +uint8_t McuShellUart_DefaultShellBuffer[McuShell_DEFAULT_SHELL_BUFFER_SIZE]; /* default buffer which can be used by the application */ +/*********************************************************************************************************/ + +#if McuLib_CONFIG_CPU_IS_RPxxxx + /* nothing needed */ +#else +void McuShellUart_CONFIG_UART_IRQ_HANDLER(void) { + uint8_t data; + uint32_t flags; +#if McuShellUart_CONFIG_USE_FREERTOS + BaseType_t xHigherPriorityTaskWoken = pdFALSE; +#endif + uint8_t count; + + flags = McuShellUart_CONFIG_UART_GET_FLAGS(McuShellUart_CONFIG_UART_DEVICE); +#if McuShellUart_CONFIG_HAS_FIFO + if (flags&kUART_RxFifoOverflowFlag) { + count = 0; /* statement to allow debugger to set a breakpoint here */ + } +#endif + /* If new data arrived. */ + if (flags&McuShellUart_CONFIG_UART_HW_RX_READY_FLAGS) { + #if McuShellUart_CONFIG_HAS_FIFO + count = McuShellUart_CONFIG_UART_DEVICE->RCFIFO; + #else + count = 1; + #endif + while(count!=0) { + data = McuShellUart_CONFIG_UART_READ_BYTE(McuShellUart_CONFIG_UART_DEVICE); + #if McuShellUart_CONFIG_USE_FREERTOS + (void)xQueueSendFromISR(uartRxQueue, &data, &xHigherPriorityTaskWoken); + #else + McuRB_Put(rxRingBuffer, &data); + #endif + count--; + } + } + McuShellUART_CONFIG_CLEAR_STATUS_FLAGS(McuShellUart_CONFIG_UART_DEVICE, flags|McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS); +#if McuShellUart_CONFIG_USE_FREERTOS + if (xHigherPriorityTaskWoken != pdFALSE) { + vPortYieldFromISR(); + } +#endif +#if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M && ((McuLib_CONFIG_CORTEX_M==4) || (McuLib_CONFIG_CORTEX_M==7)) + /* ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping exception return operation might vector to incorrect interrupt. + * For Cortex-M7, if core speed much faster than peripheral register write speed, the peripheral interrupt flags may be still set after exiting ISR, this results to + * the same error similar with errata 83869. */ + __DSB(); +#endif +} +#endif + +void McuShellUart_MuxUartPins(int uart) { + switch(uart) { +#if McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_K22FN + case McuShellUart_CONFIG_UART_K22FN512_LPUART0_C3_C4: /* PTC3, PTC4 */ + CLOCK_EnableClock(kCLOCK_PortC); + + /* PORTC3 (pin 46) is configured as LPUART0_RX */ + PORT_SetPinMux(PORTC, 3U, kPORT_MuxAlt7); + PORTC->PCR[3] = ((PORTC->PCR[3] & + /* Mask bits to zero which are setting */ + (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ISF_MASK))) + /* Pull Select: Internal pullup resistor is enabled on the corresponding pin, if the + * corresponding PE field is set. */ + | (uint32_t)(kPORT_PullUp)); + + /* PORTC4 (pin 49) is configured as LPUART0_TX */ + PORT_SetPinMux(PORTC, 4U, kPORT_MuxAlt7); + PORTC->PCR[4] = ((PORTC->PCR[4] & + /* Mask bits to zero which are setting */ + (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ISF_MASK))) + /* Pull Select: Internal pullup resistor is enabled on the corresponding pin, if the + * corresponding PE field is set. */ + | (uint32_t)(kPORT_PullUp)); + break; + + case McuShellUart_CONFIG_UART_K22FN512_UART0_B16_B17: /* PTB16, PTB17 */ + CLOCK_EnableClock(kCLOCK_PortB); + + /* PORTB16 (pin 39) is configured as UART0_RX */ + PORT_SetPinMux(PORTB, 16, kPORT_MuxAlt3); + PORTB->PCR[16] = ((PORTB->PCR[16] & + /* Mask bits to zero which are setting */ + (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ISF_MASK))) + /* Pull Select: Internal pullup resistor is enabled on the corresponding pin, if the + * corresponding PE field is set. */ + | (uint32_t)(kPORT_PullUp)); + + + /* PORTB17 (pin 40) is configured as UART0_TX */ + PORT_SetPinMux(PORTB, 17, kPORT_MuxAlt3); + PORTB->PCR[17] = ((PORTB->PCR[17] & + /* Mask bits to zero which are setting */ + (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ISF_MASK))) + /* Pull Select: Internal pullup resistor is enabled on the corresponding pin, if the + * corresponding PE field is set. */ + | (uint32_t)(kPORT_PullUp)); + + #define SOPT5_UART0TXSRC_UART_TX 0x00u /*!<@brief UART 0 transmit data source select: UART0_TX pin */ + + SIM->SOPT5 = ((SIM->SOPT5 & + /* Mask bits to zero which are setting */ + (~(SIM_SOPT5_UART0TXSRC_MASK))) + /* UART 0 transmit data source select: UART0_TX pin. */ + | SIM_SOPT5_UART0TXSRC(SOPT5_UART0TXSRC_UART_TX)); + break; + + case McuShellUart_CONFIG_UART_K22FN512_UART1_E1_E0: + CLOCK_EnableClock(kCLOCK_PortE); + + /* PORTE0 (pin 1) is configured as UART1_TX */ + PORT_SetPinMux(PORTE, 0U, kPORT_MuxAlt3); + PORTE->PCR[0] = ((PORTE->PCR[0] & + /* Mask bits to zero which are setting */ + (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ISF_MASK))) + /* Pull Select: Internal pullup resistor is enabled on the corresponding pin, if the + * corresponding PE field is set. */ + | (uint32_t)(kPORT_PullUp)); + + /* PORTE1 (pin 2) is configured as UART1_RX */ + PORT_SetPinMux(PORTE, 1U, kPORT_MuxAlt3); + PORTE->PCR[1] = ((PORTE->PCR[1] & + /* Mask bits to zero which are setting */ + (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ISF_MASK))) + /* Pull Select: Internal pullup resistor is enabled on the corresponding pin, if the + * corresponding PE field is set. */ + | (uint32_t)(kPORT_PullUp)); + + #define SOPT5_UART1TXSRC_UART_TX 0x00u /*!<@brief UART 1 transmit data source select: UART1_TX pin */ + SIM->SOPT5 = ((SIM->SOPT5 & + /* Mask bits to zero which are setting */ + (~(SIM_SOPT5_UART0TXSRC_MASK | SIM_SOPT5_UART1TXSRC_MASK))) + /* UART 1 transmit data source select: UART1_TX pin. */ + | SIM_SOPT5_UART1TXSRC(SOPT5_UART1TXSRC_UART_TX)); + break; +#elif McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_K22FX + + #define SOPT5_UART0TXSRC_UART_TX 0x00u /*!<@brief UART 0 transmit data source select: UART0_TX pin */ + #define SOPT5_UART1TXSRC_UART_TX 0x00u /*!<@brief UART 1 transmit data source select: UART1_TX pin */ + + case McuShellUart_CONFIG_UART_K22FX512_UART0_A1_A2: + /* PORTA1 (pin 27) is configured as UART0_RX */ + PORT_SetPinMux(PORTA, 1U, kPORT_MuxAlt2); + + /* PORTA2 (pin 28) is configured as UART0_TX */ + PORT_SetPinMux(PORTA, 2U, kPORT_MuxAlt2); + + SIM->SOPT5 = ((SIM->SOPT5 & + /* Mask bits to zero which are setting */ + (~(SIM_SOPT5_UART0TXSRC_MASK | SIM_SOPT5_UART1TXSRC_MASK))) + /* UART 0 transmit data source select: UART0_TX pin. */ + | SIM_SOPT5_UART0TXSRC(SOPT5_UART0TXSRC_UART_TX)); + break; + + case McuShellUart_CONFIG_UART_K22FX512_UART1_E1_E0: + CLOCK_EnableClock(kCLOCK_PortE); + /* PORTE0 (pin 1) is configured as UART1_TX */ + PORT_SetPinMux(PORTE, 0U, kPORT_MuxAlt3); + PORTE->PCR[0] = ((PORTE->PCR[0] & + /* Mask bits to zero which are setting */ + (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ISF_MASK))) + + /* Pull Select: Internal pullup resistor is enabled on the corresponding pin, if the + * corresponding Port Pull Enable field is set. */ + | (uint32_t)(kPORT_PullUp)); + + /* PORTE1 (pin 2) is configured as UART1_RX */ + PORT_SetPinMux(PORTE, 1U, kPORT_MuxAlt3); + PORTE->PCR[1] = ((PORTE->PCR[1] & + /* Mask bits to zero which are setting */ + (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ISF_MASK))) + + /* Pull Select: Internal pullup resistor is enabled on the corresponding pin, if the + * corresponding Port Pull Enable field is set. */ + | (uint32_t)(kPORT_PullUp)); + SIM->SOPT5 = ((SIM->SOPT5 & + /* Mask bits to zero which are setting */ + (~(SIM_SOPT5_UART0TXSRC_MASK | SIM_SOPT5_UART1TXSRC_MASK))) + /* UART 1 transmit data source select: UART1_TX pin. */ + | SIM_SOPT5_UART1TXSRC(SOPT5_UART1TXSRC_UART_TX)); + break; +#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K64FN1M_UART0_B16_B17 + case McuShellUart_CONFIG_UART_K64FN1M_UART0_B16_B17: + /* UART0 Rx and Tx */ + /* PORTB16 (pin 62) is configured as UART0_RX */ + PORT_SetPinMux(PORTB, 16U, kPORT_MuxAlt3); + + #define SOPT5_UART0TXSRC_UART_TX 0x00u /*!<@brief UART 0 transmit data source select: UART0_TX pin */ + + /* PORTB17 (pin 63) is configured as UART0_TX */ + PORT_SetPinMux(PORTB, 1U, kPORT_MuxAlt3); + SIM->SOPT5 = ((SIM->SOPT5 & + /* Mask bits to zero which are setting */ + (~(SIM_SOPT5_UART0TXSRC_MASK))) + + /* UART 0 transmit data source select: UART0_TX pin. */ + | SIM_SOPT5_UART0TXSRC(SOPT5_UART0TXSRC_UART_TX)); + break; +#elif McuLib_CONFIG_CPU_IS_RPxxxx + case McuShellUart_CONFIG_UART_RP2040_UART1_GPIO4_GPIO5: + gpio_set_function(McuShellUart_CONFIG_UART_TX_PIN, GPIO_FUNC_UART); + gpio_set_function(McuShellUart_CONFIG_UART_RX_PIN, GPIO_FUNC_UART); + break; +#endif /* McuLib_CONFIG_CPU_VARIANT_NXP_K22FN */ + default: + for(;;) { /* error */ } + } /* switch */ +} + +#if McuShellUart_CONFIG_DO_PIN_MUXING +static void InitUartMuxing(void) { +#if McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_LPC845_USART0 + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + /* USART0_TXD connect to P0_25 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P0_25); + /* USART0_RXD connect to P0_24 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P0_24); + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K22FX512_UART0 + #define SOPT5_UART0TXSRC_UART_TX 0x00u /*!<@brief UART 0 transmit data source select: UART0_TX pin */ + #define SOPT5_UART1TXSRC_UART_TX 0x00u /*!<@brief UART 1 transmit data source select: UART1_TX pin */ + + /* PORTA1 (pin 27) is configured as UART0_RX */ + PORT_SetPinMux(PORTA, 1U, kPORT_MuxAlt2); + /* PORTA2 (pin 28) is configured as UART0_TX */ + PORT_SetPinMux(PORTA, 2U, kPORT_MuxAlt2); + + /* PORTE0 (pin 1) is configured as UART1_TX */ + PORT_SetPinMux(PORTE, 0U, kPORT_MuxAlt3); + + PORTE->PCR[0] = ((PORTE->PCR[0] & + /* Mask bits to zero which are setting */ + (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ISF_MASK))) + + /* Pull Select: Internal pullup resistor is enabled on the corresponding pin, if the + * corresponding Port Pull Enable field is set. */ + | (uint32_t)(kPORT_PullUp)); + + /* PORTE1 (pin 2) is configured as UART1_RX */ + PORT_SetPinMux(PORTE, 1U, kPORT_MuxAlt3); + + PORTE->PCR[1] = ((PORTE->PCR[1] & + /* Mask bits to zero which are setting */ + (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ISF_MASK))) + + /* Pull Select: Internal pullup resistor is enabled on the corresponding pin, if the + * corresponding Port Pull Enable field is set. */ + | (uint32_t)(kPORT_PullUp)); + + SIM->SOPT5 = ((SIM->SOPT5 & + /* Mask bits to zero which are setting */ + (~(SIM_SOPT5_UART0TXSRC_MASK | SIM_SOPT5_UART1TXSRC_MASK))) + + /* UART 0 transmit data source select: UART0_TX pin. */ + | SIM_SOPT5_UART0TXSRC(SOPT5_UART0TXSRC_UART_TX) + + /* UART 1 transmit data source select: UART1_TX pin. */ + | SIM_SOPT5_UART1TXSRC(SOPT5_UART1TXSRC_UART_TX)); +#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K22FN512_LPUART0_C3_C4 + McuShellUart_MuxUartPins(McuShellUart_CONFIG_UART_K22FN512_LPUART0_C3_C4); +#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K22FN512_UART0_B16_B17 + McuShellUart_MuxUartPins(McuShellUart_CONFIG_UART_K22FN512_UART0_B16_B17); +#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K22FN512_UART1_E1_E0 + McuShellUart_MuxUartPins(McuShellUart_CONFIG_UART_K22FN512_UART1_E1_E0); +#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K64FN1M_UART0_B16_B17 + McuShellUart_MuxUartPins(McuShellUart_CONFIG_UART_K64FN1M_UART0_B16_B17); +#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_LPC55S16_USART0 + #define IOCON_PIO_FUNC1 0x01u + #define IOCON_PIO_INV_DI 0x00u + #define IOCON_PIO_MODE_INACT 0x00u + #define IOCON_PIO_SLEW_STANDARD 0x00u + #define IOCON_PIO_OPENDRAIN_DI 0x00u + #define IOCON_PIO_DIGITAL_EN 0x0100u + #define PIO0_3_FUNC_ALT1 0x01u + #define PIO0_3_DIGIMODE_DIGITAL 0x01u + + const uint32_t port0_pin29_config = (/* Pin is configured as FC0_RXD_SDA_MOSI_DATA */ + IOCON_PIO_FUNC1 | + /* No addition pin function */ + IOCON_PIO_MODE_INACT | + /* Standard mode, output slew rate control is enabled */ + IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + IOCON_PIO_INV_DI | + /* Enables digital function */ + IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + IOCON_PIO_OPENDRAIN_DI); + /* PORT0 PIN29 (coords: 92) is configured as FC0_RXD_SDA_MOSI_DATA */ + IOCON_PinMuxSet(IOCON, 0U, 29U, port0_pin29_config); + + IOCON->PIO[0][3] = ((IOCON->PIO[0][3] & + /* Mask bits to zero which are setting */ + (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) + + /* Selects pin function. + * : PORT03 (pin 83) is configured as FC3_RXD_SDA_MOSI_DATA. */ + | IOCON_PIO_FUNC(PIO0_3_FUNC_ALT1) + + /* Select Digital mode. + * : Enable Digital mode. + * Digital input is enabled. */ + | IOCON_PIO_DIGIMODE(PIO0_3_DIGIMODE_DIGITAL)); + + const uint32_t port0_pin30_config = (/* Pin is configured as FC0_TXD_SCL_MISO_WS */ + IOCON_PIO_FUNC1 | + /* No addition pin function */ + IOCON_PIO_MODE_INACT | + /* Standard mode, output slew rate control is enabled */ + IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + IOCON_PIO_INV_DI | + /* Enables digital function */ + IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + IOCON_PIO_OPENDRAIN_DI); + /* PORT0 PIN30 (coords: 94) is configured as FC0_TXD_SCL_MISO_WS */ + IOCON_PinMuxSet(IOCON, 0U, 30U, port0_pin30_config); +#elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_LPC55S16_USART2 + #define PIO0_27_FUNC_ALT1 0x01u + #define PIO1_24_FUNC_ALT1 0x01u + #define PIO0_27_DIGIMODE_DIGITAL 0x01u + #define PIO1_24_DIGIMODE_DIGITAL 0x01u + + IOCON->PIO[0][27] = ((IOCON->PIO[0][27] & + /* Mask bits to zero which are setting */ + (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) + + /* Selects pin function. + * : PORT027 (pin 27) is configured as FC2_TXD_SCL_MISO_WS. */ + | IOCON_PIO_FUNC(PIO0_27_FUNC_ALT1) + + /* Select Digital mode. + * : Enable Digital mode. + * Digital input is enabled. */ + | IOCON_PIO_DIGIMODE(PIO0_27_DIGIMODE_DIGITAL)); + + IOCON->PIO[1][24] = ((IOCON->PIO[1][24] & + /* Mask bits to zero which are setting */ + (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) + + /* Selects pin function. + * : PORT124 (pin 3) is configured as FC2_RXD_SDA_MOSI_DATA. */ + | IOCON_PIO_FUNC(PIO1_24_FUNC_ALT1) + + /* Select Digital mode. + * : Enable Digital mode. + * Digital input is enabled. */ + | IOCON_PIO_DIGIMODE(PIO1_24_DIGIMODE_DIGITAL)); +#endif +} +#endif /* McuShellUart_CONFIG_DO_PIN_MUXING */ + +static void InitUart(void) { +#if McuLib_CONFIG_CPU_IS_RPxxxx + /* nothing needed */ +#else + McuShellUart_CONFIG_UART_CONFIG_STRUCT config; + status_t status; + +#if McuShellUart_CONFIG_DO_PIN_MUXING + InitUartMuxing(); /* NOTE: Clocking of the UART needs still to be done in the clocks tool for the MCUXpresso SDK! */ +#endif + McuShellUart_CONFIG_UART_SET_UART_CLOCK(); + McuShellUart_CONFIG_UART_GET_DEFAULT_CONFIG(&config); + config.baudRate_Bps = McuShellUart_CONFIG_UART_BAUDRATE; + config.enableRx = true; + config.enableTx = true; + + /* Initialize the USART with configuration. */ + status = McuShellUart_CONFIG_UART_INIT(McuShellUart_CONFIG_UART_DEVICE, &config, CLOCK_GetFreq(McuShellUart_CONFIG_UART_GET_CLOCK_FREQ_SELECT)); + if (status!=kStatus_Success) { + McuLog_error("failed initializing UART"); + for(;;) {/* error */} + } + McuShellUart_CONFIG_UART_ENABLE_INTERRUPTS(McuShellUart_CONFIG_UART_DEVICE, McuShellUart_CONFIG_UART_ENABLE_INTERRUPT_FLAGS); +#if McuShellUart_CONFIG_USE_FREERTOS + NVIC_SetPriority(McuShellUart_CONFIG_UART_IRQ_NUMBER, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY); +#endif + EnableIRQ(McuShellUart_CONFIG_UART_IRQ_NUMBER); +#endif +} + +int McuShellUart_PollChar(void) { + uint8_t ch = McuShellUart_CONFIG_UART_READ_BYTE(McuShellUart_CONFIG_UART_DEVICE); + return ch; +} + +void McuShellUart_Deinit(void) { +#if McuShellUart_CONFIG_USE_FREERTOS + vQueueDelete(uartRxQueue); + uartRxQueue = NULL; +#else + McuRB_DeinitRB(rxRingBuffer); + rxRingBuffer = NULL; +#endif +} + +void McuShellUart_Init(void) { +#if McuShellUart_CONFIG_USE_FREERTOS + uartRxQueue = xQueueCreate(McuShellUart_CONFIG_UART_RX_QUEUE_LENGTH, sizeof(uint8_t)); + if (uartRxQueue==NULL) { + for(;;){} /* out of memory? */ + } + vQueueAddToRegistry(uartRxQueue, "UartRxQueue"); +#else + McuRB_Config_t config; + + McuRB_GetDefaultconfig(&config); + config.elementSize = sizeof(uint8_t); + config.nofElements = McuShellUart_CONFIG_UART_RX_QUEUE_LENGTH; + rxRingBuffer = McuRB_InitRB(&config); + if (rxRingBuffer==NULL) { + for(;;) {/* error */} + } +#endif + InitUart(); +} + +#endif /* McuShellUart_CONFIG_UART!=McuShellUart_CONFIG_UART_NONE*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuShellUart.h b/TSM_PicoW_Sensor/McuLib/src/McuShellUart.h new file mode 100644 index 0000000..03c97d1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuShellUart.h @@ -0,0 +1,53 @@ +/*! + * Copyright (c) 2020-2024, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * \file + * \brief \brief Interface for the McuShellUart module. + */ + +#ifndef MCUSHELLUART_H_ +#define MCUSHELLUART_H_ + +#include "McuShellUartconfig.h" +#include "McuShell.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*! Default McuShell buffer */ +extern uint8_t McuShellUart_DefaultShellBuffer[McuShell_DEFAULT_SHELL_BUFFER_SIZE]; /* default buffer which can be used by the application */ + +/*! Standard I/O for input/output */ +extern McuShell_ConstStdIOType McuShellUart_stdio; + +McuShell_ConstStdIOTypePtr McuShellUart_GetStdio(void); + +/*! + * \brief Polls for an UART character, might be blocking + * \return The character or EOF + */ +int McuShellUart_PollChar(void); + +/*! + * \brief perform muxing of the UART pins + * \param uart One of the preconfigured and supported UART types, e.g. McuShellUart_CONFIG_UART_K22FN512_LPUART0_C3_C4 + */ +void McuShellUart_MuxUartPins(int uart); + +/*! + * \brief Module de-initialization + */ +void McuShellUart_Deinit(void); + +/*! + * \brief Module initialization + */ +void McuShellUart_Init(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MCUSHELLUART_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuTimeDate.c b/TSM_PicoW_Sensor/McuLib/src/McuTimeDate.c new file mode 100644 index 0000000..d5bf2af --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuTimeDate.c @@ -0,0 +1,1667 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuTimeDate.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GenericTimeDate +** Version : Component 01.068, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-08-05, 17:56, # CodeGen: 845 +** Abstract : +** Software date/time module. +** Settings : +** Component name : McuTimeDate +** Software RTC : Enabled +** Tick Time (ms) : 10 +** RTOS : Enabled +** RTOS : McuRTOS +** Hardware RTC : Enabled +** Internal : Disabled +** External RTC : Disabled +** Set Time and Date : +** Software RTC : yes +** Internal RTC : no +** External RTC : yes +** Get Time and Date : Software RTC +** Init() : +** Defaults : +** Time : 17:51:31 +** Date : 2019-08-01 +** Call Init() in startup : yes +** Software RTC Initialization : Init from Defaults +** System : +** Critical Section : McuCriticalSection +** SDK : McuLib +** Shell : Enabled +** Utility : McuUtility +** Shell : McuShell +** Contents : +** AddTick - void McuTimeDate_AddTick(void); +** AddTicks - void McuTimeDate_AddTicks(uint16_t nofTicks); +** TicksToTime - uint8_t McuTimeDate_TicksToTime(uint32_t ticks, TIMEREC *time); +** TimeToTicks - uint8_t McuTimeDate_TimeToTicks(TIMEREC *time, uint32_t *ticks); +** CalculateDayOfWeek - uint8_t McuTimeDate_CalculateDayOfWeek(uint16_t Year, uint8_t Month, uint8_t... +** SetTime - uint8_t McuTimeDate_SetTime(uint8_t Hour, uint8_t Min, uint8_t Sec, uint8_t... +** GetTime - uint8_t McuTimeDate_GetTime(TIMEREC *time); +** SetDate - uint8_t McuTimeDate_SetDate(uint16_t Year, uint8_t Month, uint8_t Day); +** GetDate - uint8_t McuTimeDate_GetDate(DATEREC *date); +** SetTimeDate - uint8_t McuTimeDate_SetTimeDate(TIMEREC *time, DATEREC *date); +** GetTimeDate - uint8_t McuTimeDate_GetTimeDate(TIMEREC *time, DATEREC *date); +** SetSWTimeDate - uint8_t McuTimeDate_SetSWTimeDate(TIMEREC *time, DATEREC *date); +** GetSWTimeDate - uint8_t McuTimeDate_GetSWTimeDate(TIMEREC *time, DATEREC *date); +** SetInternalRTCTimeDate - uint8_t McuTimeDate_SetInternalRTCTimeDate(TIMEREC *time, DATEREC *date); +** GetInternalRTCTimeDate - uint8_t McuTimeDate_GetInternalRTCTimeDate(TIMEREC *time, DATEREC *date); +** SyncWithInternalRTC - uint8_t McuTimeDate_SyncWithInternalRTC(void); +** SyncSWtimeToInternalRTCsec - uint8_t McuTimeDate_SyncSWtimeToInternalRTCsec(void); +** SetExternalRTCTimeDate - uint8_t McuTimeDate_SetExternalRTCTimeDate(TIMEREC *time, DATEREC *date); +** GetExternalRTCTimeDate - uint8_t McuTimeDate_GetExternalRTCTimeDate(TIMEREC *time, DATEREC *date); +** SyncWithExternalRTC - uint8_t McuTimeDate_SyncWithExternalRTC(void); +** UnixSecondsToTimeDateCustom - void McuTimeDate_UnixSecondsToTimeDateCustom(int32_t seconds, int8_t... +** UnixSecondsToTimeDate - void McuTimeDate_UnixSecondsToTimeDate(int32_t seconds, int8_t offset_hours,... +** TimeDateToUnixSecondsCustom - int32_t McuTimeDate_TimeDateToUnixSecondsCustom(TIMEREC *time, DATEREC *date,... +** TimeDateToUnixSeconds - int32_t McuTimeDate_TimeDateToUnixSeconds(TIMEREC *time, DATEREC *date,... +** AddDateString - uint8_t McuTimeDate_AddDateString(uint8_t *buf, size_t bufSize, DATEREC... +** AddTimeString - uint8_t McuTimeDate_AddTimeString(uint8_t *buf, size_t bufSize, TIMEREC... +** ParseCommand - uint8_t McuTimeDate_ParseCommand(const unsigned char *cmd, bool *handled,... +** Deinit - void McuTimeDate_Deinit(void); +** Init - uint8_t McuTimeDate_Init(void); +** +** * Copyright (c) 2011-2023, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuTimeDate.h +** @version 01.00 +** @brief +** Software date/time module. +*/ +/*! +** @addtogroup McuTimeDate_module McuTimeDate module documentation +** @{ +*/ + +/* MODULE McuTimeDate. */ + +#include "McuTimeDate.h" +#include /* for NULL */ +#if McuTimeDate_CONFIG_USE_EXTERNAL_HW_RTC + #include McuTimeDate_CONFIG_EXT_RTC_HEADER_FILE_NAME /* header file for the external RTC */ +#endif + +#if McuLib_CONFIG_NXP_SDK_USED && McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC + #include "fsl_rtc.h" +#endif + + +#if McuTimeDate_TICK_TIME_MS==0 + #error "Tick period cannot be zero!" +#endif +#define McuTimeDate_TICKS_PER_S (1000/McuTimeDate_TICK_TIME_MS) /* number of timer ticks per second */ + +#if McuTimeDate_CONFIG_USE_SOFTWARE_RTC + /* counters used by software RTC */ + static uint8_t CntDay; /* Day counter */ + static uint8_t CntMonth; /* Month counter */ + static uint16_t CntYear; /* Year Counter */ + static uint32_t tickCntr; /* Software tick counter (1 tick = McuTimeDate_TICK_TIME_MS ms) */ +#endif + +/* Table of month length (in days) */ +static const uint8_t ULY[12] = {31U,28U,31U,30U,31U,30U,31U,31U,30U,31U,30U,31U}; /* Un-leap-year */ +static const uint8_t LY[12] = {31U,29U,31U,30U,31U,30U,31U,31U,30U,31U,30U,31U}; /* Leap-year */ + +static uint8_t AddDateToBuf(uint8_t *buf, uint16_t bufSize, DATEREC *tdate) { + McuUtility_strcatNum16uFormatted(buf, bufSize, tdate->Day, '0', 2); + McuUtility_chcat(buf, bufSize, '.'); + McuUtility_strcatNum16uFormatted(buf, bufSize, tdate->Month, '0', 2); + McuUtility_chcat(buf, bufSize, '.'); + McuUtility_strcatNum16uFormatted(buf, bufSize, (uint16_t)tdate->Year, '0', 2); + return ERR_OK; +} + +static uint8_t AddTimeToBuf(uint8_t *buf, uint16_t bufSize, TIMEREC *ttime) { + McuUtility_strcatNum16sFormatted(buf, bufSize, ttime->Hour, '0', 2); + McuUtility_chcat(buf, bufSize, ':'); + McuUtility_strcatNum16sFormatted(buf, bufSize, ttime->Min, '0', 2); + McuUtility_chcat(buf, bufSize, ':'); + McuUtility_strcatNum16sFormatted(buf, bufSize, ttime->Sec, '0', 2); + McuUtility_chcat(buf, bufSize, ','); +#if McuTimeDate_HAS_SEC100_IN_TIMEREC + McuUtility_strcatNum16sFormatted(buf, bufSize, ttime->Sec100, '0', 2); +#else + McuUtility_strcatNum16sFormatted(buf, bufSize, 0, '0', 2); +#endif + return ERR_OK; +} + +static uint8_t AddDate(uint8_t *buf, uint16_t bufSize, uint8_t (*GetTimeDateFn)(TIMEREC*, DATEREC*)) { + DATEREC tdate; + + if (GetTimeDateFn(NULL, &tdate)!=ERR_OK) { + return ERR_FAILED; + } + return AddDateToBuf(buf, bufSize, &tdate); +} + +static uint8_t AddTime(uint8_t *buf, uint16_t bufSize, uint8_t (*GetTimeDateFn)(TIMEREC*, DATEREC*)) { + TIMEREC ttime; + + if (GetTimeDateFn(&ttime, NULL)!=ERR_OK) { + return ERR_FAILED; + } + return AddTimeToBuf(buf, bufSize, &ttime); +} + +static uint8_t DateCmd(const unsigned char *cmd, McuShell_ConstStdIOType *io) { + /* precondition: cmd points to "McuTimeDate date" */ + uint8_t day, month; + uint16_t year; + const unsigned char *p; + uint8_t res = ERR_OK; + + p = cmd + sizeof("McuTimeDate date")-1; + if (*p==' ') { /* ok, have an argument */ + if (McuUtility_ScanDate(&p, &day, &month, &year) == ERR_OK) { /* ok, format fine */ + /* update software real time clock */ + res = McuTimeDate_SetDate(year, month, day); + if (res != ERR_OK) { + McuShell_SendStr((unsigned char*)"*** Failure setting date\r\n", io->stdErr); + res = ERR_FAILED; + } + } else { + McuShell_SendStr((unsigned char*)"*** error while reading command! ***", io->stdErr); + McuShell_SendStr((void *)cmd, io->stdErr); + McuShell_SendStr((unsigned char*)"\r\n", io->stdErr); + res = ERR_FAILED; + } + } /* has an argument */ + /* print now current date */ + if (res==ERR_OK) { + unsigned char buf[sizeof("RTC: Wednesday dd:mm:yyyy\\r\\n")]; + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"RTC: "); + if (AddDate(buf, sizeof(buf), McuTimeDate_GetTimeDate)!=ERR_OK) { + McuShell_SendStr((unsigned char*)"***Failed to get date\r\n", io->stdErr); + res = ERR_FAILED; + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStr(buf, io->stdOut); + } + } + return res; +} + +static uint8_t TimeCmd(const unsigned char *cmd, McuShell_ConstStdIOType *io) { + uint8_t hour, minute, second, hSecond; + const unsigned char *p; + uint8_t res = ERR_OK; + + p = cmd + sizeof("McuTimeDate time")-1; + if (*p==' ') { /* has an argument */ + if (McuUtility_ScanTime(&p, &hour, &minute, &second, &hSecond)==ERR_OK) { /* format fine */ + /* set SW RTC time */ + res = McuTimeDate_SetTime(hour, minute, second, hSecond); + if (res != ERR_OK) { + McuShell_SendStr((unsigned char*)"*** Failure setting time\r\n", io->stdErr); + res = ERR_FAILED; + } + } else { + McuShell_SendStr((unsigned char*)"*** Error while reading command: ", io->stdErr); + McuShell_SendStr(cmd, io->stdErr); + McuShell_SendStr((unsigned char*)"\r\n", io->stdErr); + res = ERR_FAILED; + } + } + /* print now current time */ + if (res==ERR_OK) { + unsigned char buf[sizeof("RTC: hh:mm:ss.hh\\r\\n")+5]; + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"RTC: "); + if (AddTime(buf, sizeof(buf), McuTimeDate_GetTimeDate)!=ERR_OK) { + McuShell_SendStr((unsigned char*)"***Failed to get time\r\n", io->stdErr); + res = ERR_FAILED; + } else { + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStr(buf, io->stdOut); + } + } + return res; +} + +static uint8_t PrintStatus(McuShell_ConstStdIOType *io) { + uint8_t buf[24]; + + McuShell_SendStatusStr((unsigned char*)"McuTimeDate", (const unsigned char*)"Date and time information\r\n", io->stdOut); +#if McuTimeDate_CONFIG_USE_SOFTWARE_RTC + McuShell_SendStatusStr((unsigned char*)" SW RTC", (const unsigned char*)"", io->stdOut); + buf[0] = '\0'; + if (AddDate(buf, sizeof(buf), McuTimeDate_GetSWTimeDate)!=ERR_OK) { + McuShell_SendStr((unsigned char*)"***Failed to get date!\r\n", io->stdErr); + return ERR_FAILED; + } + McuShell_SendStr(buf, io->stdOut); + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)", "); + if (AddTime(buf, sizeof(buf), McuTimeDate_GetSWTimeDate)!=ERR_OK) { + McuShell_SendStr((unsigned char*)"***Failed to get time!\r\n", io->stdErr); + return ERR_FAILED; + } else { + McuShell_SendStr(buf, io->stdOut); + } + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); +#endif +#if McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC_LDD || McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC_BEAN + McuShell_SendStatusStr((unsigned char*)" HW RTC", (const unsigned char*)"", io->stdOut); + buf[0] = '\0'; + if (AddDate(buf, sizeof(buf), McuTimeDate_GetInternalRTCTimeDate)!=ERR_OK) { + McuShell_SendStr((unsigned char*)"***Failed to get internal RTC date!\r\n", io->stdErr); + return ERR_FAILED; + } + McuShell_SendStr(buf, io->stdOut); + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)", "); + if (AddTime(buf, sizeof(buf), McuTimeDate_GetInternalRTCTimeDate)!=ERR_OK) { + McuShell_SendStr((unsigned char*)"***Failed to get internal RTC time!\r\n", io->stdErr); + return ERR_FAILED; + } else { + McuShell_SendStr(buf, io->stdOut); + } + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); +#endif +#if McuTimeDate_CONFIG_USE_EXTERNAL_HW_RTC + McuShell_SendStatusStr((unsigned char*)" Ext. RTC", (const unsigned char*)"", io->stdOut); + buf[0] = '\0'; + if (AddDate(buf, sizeof(buf), McuTimeDate_GetExternalRTCTimeDate)!=ERR_OK) { + McuShell_SendStr((unsigned char*)"***Failed to get external RTC date!\r\n", io->stdErr); + return ERR_FAILED; + } + McuShell_SendStr(buf, io->stdOut); + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)", "); + if (AddTime(buf, sizeof(buf), McuTimeDate_GetExternalRTCTimeDate)!=ERR_OK) { + McuShell_SendStr((unsigned char*)"***Failed to get external RTC time!\r\n", io->stdErr); + return ERR_FAILED; + } else { + McuShell_SendStr(buf, io->stdOut); + } + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); +#endif + return ERR_OK; +} + +/* +** =================================================================== +** Method : AddTick (component GenericTimeDate) +** +** Description : +** Increments the tick counter of the software RTC. Needs to be +** called periodically by the application to increase the time +** tick count. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuTimeDate_AddTick(void) +{ +#if McuTimeDate_CONFIG_USE_SOFTWARE_RTC + const uint8_t *ptr; /* Pointer to ULY/LY table */ + McuCriticalSection_CriticalVariable() + + McuCriticalSection_EnterCritical(); /* need exclusive access to tick counter */ + tickCntr++; /* Software timer counter increment by timer period */ + McuCriticalSection_ExitCritical(); /* end of critical section */ + if (tickCntr >= 24*3600UL*McuTimeDate_TICKS_PER_S) { /* Does the counter reach 24 hours? */ + tickCntr -= 24*3600UL*McuTimeDate_TICKS_PER_S; /* If yes then reset it by subtracting exactly 24 hours */ + McuCriticalSection_EnterCritical(); + CntDay++; /* Increment day counter */ + McuCriticalSection_ExitCritical(); + if (CntYear & 0x03U) { /* Is this year un-leap-one? */ + ptr = ULY; /* Set pointer to un-leap-year day table */ + } else { /* Is this year leap-one? */ + ptr = LY; /* Set pointer to leap-year day table */ + } + ptr--; /* Decrement the pointer */ + if (CntDay > ptr[CntMonth]) { /* Day counter overflow? */ + CntDay = 1U; /* Set day counter on 1 */ + McuCriticalSection_EnterCritical(); + CntMonth++; /* Increment month counter */ + McuCriticalSection_ExitCritical(); + if (CntMonth > 12U) { /* Month counter overflow? */ + CntMonth = 1U; /* Set month counter on 1 */ + McuCriticalSection_EnterCritical(); + CntYear++; /* Increment year counter */ + McuCriticalSection_ExitCritical(); + } + } + } +#endif +} + +/* +** =================================================================== +** Method : AddTicks (component GenericTimeDate) +** +** Description : +** Same as AddTick(), but multiple ticks can be added in one +** step. +** Parameters : +** NAME - DESCRIPTION +** nofTicks - Number of ticks to be added +** Returns : Nothing +** =================================================================== +*/ +void McuTimeDate_AddTicks(uint16_t nofTicks) +{ +#if McuTimeDate_CONFIG_USE_SOFTWARE_RTC + while(nofTicks>0) { + McuTimeDate_AddTick(); + nofTicks--; + } +#else + (void)nofTicks; /* not used */ +#endif +} + +/* +** =================================================================== +** Method : SetSWTimeDate (component GenericTimeDate) +** +** Description : +** This method sets a new actual time and date of the software +** RTC. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to struct which contains the +** time to be set. Can be NULL if time shall +** not be set. +** * date - Pointer to struct which contains the +** date information to be set. Can be NULL if +** date shall not be set. +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuTimeDate_SetSWTimeDate(TIMEREC *time, DATEREC *date) +{ +#if McuTimeDate_CONFIG_USE_SOFTWARE_RTC + uint8_t res; + uint32_t nofTicks; + bool failed = FALSE; + McuCriticalSection_CriticalVariable() + + if (time!=NULL) { + res = McuTimeDate_TimeToTicks(time, &nofTicks); + if (res!=ERR_OK) { + failed = TRUE; + } + if (res==ERR_OK) { + McuCriticalSection_EnterCritical(); + tickCntr = nofTicks; + McuCriticalSection_ExitCritical(); + } + } + if (date!=NULL) { + McuCriticalSection_EnterCritical(); + CntDay = date->Day; + CntMonth = date->Month; + CntYear = date->Year; + McuCriticalSection_ExitCritical(); + } + if (failed) { + return ERR_FAILED; + } + return ERR_OK; +#else + return ERR_FAILED; +#endif +} + +/* +** =================================================================== +** Method : GetSWTimeDate (component GenericTimeDate) +** +** Description : +** This method returns current time and date from the software +** RTC. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to the structure to return the +** time. Can be NULL. +** * date - Pointer to structure which returns the +** date information. Can be NULL +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuTimeDate_GetSWTimeDate(TIMEREC *time, DATEREC *date) +{ +#if McuTimeDate_CONFIG_USE_SOFTWARE_RTC + uint8_t res; + uint32_t ticks; + bool failed = FALSE; + McuCriticalSection_CriticalVariable() + + if (time!=NULL) { + McuCriticalSection_EnterCritical(); + ticks = tickCntr; + McuCriticalSection_ExitCritical(); + res = McuTimeDate_TicksToTime(ticks, time); + if (res!=ERR_OK) { + failed = TRUE; + } + } + if (date!=NULL) { + McuCriticalSection_EnterCritical(); + date->Year = CntYear; + date->Month = CntMonth; + date->Day = CntDay; + McuCriticalSection_ExitCritical(); + } + if (failed) { + return ERR_FAILED; + } + return ERR_OK; +#else + return ERR_FAILED; +#endif +} + +/* +** =================================================================== +** Method : SetTime (component GenericTimeDate) +** +** Description : +** This method sets a new actual time of the software RTC. +** Parameters : +** NAME - DESCRIPTION +** Hour - Hours (0 - 23) +** Min - Minutes (0 - 59) +** Sec - Seconds (0 - 59) +** Sec100 - Hundredth of seconds (0 - 99) +** Returns : +** --- - Error code +** =================================================================== +*/ +#ifdef __HIWARE__ + #pragma MESSAGE DISABLE C5905 /* multiplication with one (happens if McuTimeDate_TICKS_PER_S is 100) */ +#endif +uint8_t McuTimeDate_SetTime(uint8_t Hour, uint8_t Min, uint8_t Sec, uint8_t Sec100) +{ + uint8_t res = ERR_FAILED; + TIMEREC time; + bool failed = FALSE; + + if ((Sec100>99U) || (Sec>59U) || (Min>59U) || (Hour>23U)) { + return ERR_RANGE; + } + time.Hour = Hour; + time.Min = Min; + time.Sec = Sec; +#if McuTimeDate_HAS_SEC100_IN_TIMEREC + time.Sec100 = Sec100; +#endif +#if McuTimeDate_CONFIG_USE_SOFTWARE_RTC && McuTimeDate_CONFIG_SET_TIME_DATE_METHOD_USES_SOFTWARE_RTC + res = McuTimeDate_SetSWTimeDate(&time, NULL); + if (res!=ERR_OK) { + failed = TRUE; + } +#endif +#if McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC && McuTimeDate_CONFIG_SET_TIME_DATE_METHOD_USES_INTERNAL_RTC + res = McuTimeDate_SetInternalRTCTimeDate(&time, NULL); + if (res!=ERR_OK) { + failed = TRUE; + } +#endif +#if McuTimeDate_CONFIG_USE_EXTERNAL_HW_RTC && McuTimeDate_CONFIG_SET_TIME_DATE_METHOD_USES_EXTERNAL_RTC + res = McuTimeDate_SetExternalRTCTimeDate(&time, NULL); + if (res!=ERR_OK) { + failed = TRUE; + } +#endif +#if McuTimeDate_ON_TIME_SET_EVENT + McuTimeDate_ON_TIME_SET_EVENT_NAME(Hour, Min, Sec, Sec100); /* call user event */ +#endif + if (failed) { + res = ERR_FAILED; + } + return res; +} +#ifdef __HIWARE__ + #pragma MESSAGE DEFAULT C5905 /* multiplication with one */ +#endif + +/* +** =================================================================== +** Method : GetTime (component GenericTimeDate) +** +** Description : +** This method returns current time from the software RTC. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to the structure TIMEREC. It +** contains actual number of hours, minutes, +** seconds and hundredth of seconds. +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuTimeDate_GetTime(TIMEREC *time) +{ + uint8_t res; + +#if McuTimeDate_CONFIG_USE_SOFTWARE_RTC && McuTimeDate_CONFIG_USE_GET_TIME_DATE_METHOD==McuTimeDate_GET_TIME_DATE_METHOD_SOFTWARE_RTC + res = McuTimeDate_GetSWTimeDate(time, NULL); +#elif McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC && McuTimeDate_CONFIG_USE_GET_TIME_DATE_METHOD==McuTimeDate_GET_TIME_DATE_METHOD_INTERNAL_RTC + res = McuTimeDate_GetInternalRTCTimeDate(time, NULL); +#elif McuTimeDate_CONFIG_USE_EXTERNAL_HW_RTC && McuTimeDate_CONFIG_USE_GET_TIME_DATE_METHOD==McuTimeDate_GET_TIME_DATE_METHOD_EXTERNAL_RTC + res = McuTimeDate_GetExternalRTCTimeDate(time, NULL); +#else + #error "invalid configuration!" + res = ERR_FAILED; +#endif + /* call user event */ +#if McuTimeDate_ON_TIME_GET_EVENT + #if McuTimeDate_HAS_SEC100_IN_TIMEREC + McuTimeDate_ON_TIME_GET_EVENT_NAME(&time->Hour, &time->Min, &time->Sec, &time->Sec100); + #else + McuTimeDate_ON_TIME_GET_EVENT_NAME(&time->Hour, &time->Min, &time->Sec, 0); + #endif +#endif + return res; +} + +/* +** =================================================================== +** Method : SetDate (component GenericTimeDate) +** +** Description : +** This method sets a new actual date of the software RTC. +** Parameters : +** NAME - DESCRIPTION +** Year - Years (16-bit unsigned integer) +** Month - Months (8-bit unsigned integer) +** Day - Days (8-bit unsigned integer) +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuTimeDate_SetDate(uint16_t Year, uint8_t Month, uint8_t Day) +{ + const uint8_t* ptr; /* Pointer to ULY/LY table */ + uint8_t res = ERR_FAILED; + bool failed = FALSE; + DATEREC date; + + if ((Year < 1998U) || (Year > 2099U) || (Month > 12U) || (Month == 0U) || (Day > 31U) || (Day == 0U)) { + return ERR_RANGE; + } + ptr = (((Year&0x03U)!=0U)?ULY:LY); /* Set pointer to leap-year or un-leap-year day table */ + if (ptr[Month - 1U] < Day) { /* Does the obtained number of days exceed number of days in the appropriate month & year? */ + return ERR_RANGE; + } + date.Year = Year; + date.Month = Month; + date.Day = Day; +#if McuTimeDate_CONFIG_USE_SOFTWARE_RTC && McuTimeDate_CONFIG_SET_TIME_DATE_METHOD_USES_SOFTWARE_RTC + res = McuTimeDate_SetSWTimeDate(NULL, &date); + if (res!=ERR_OK) { + failed = TRUE; + } +#endif +#if McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC && McuTimeDate_CONFIG_SET_TIME_DATE_METHOD_USES_INTERNAL_RTC + res = McuTimeDate_SetInternalRTCTimeDate(NULL, &date); + if (res!=ERR_OK) { + failed = TRUE; + } +#endif +#if McuTimeDate_CONFIG_USE_EXTERNAL_HW_RTC && McuTimeDate_CONFIG_SET_TIME_DATE_METHOD_USES_EXTERNAL_RTC + res = McuTimeDate_SetExternalRTCTimeDate(NULL, &date); + if (res!=ERR_OK) { + failed = TRUE; + } +#endif +#if McuTimeDate_ON_DATE_SET_EVENT + McuTimeDate_ON_DATE_SET_EVENT_NAME(Day, Month, Year); /* call user event */ +#endif + if (failed) { + res = ERR_FAILED; + } + return res; +} + +/* +** =================================================================== +** Method : GetDate (component GenericTimeDate) +** +** Description : +** This method returns current date from the software RTC. +** Parameters : +** NAME - DESCRIPTION +** * date - Pointer to DATEREC +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuTimeDate_GetDate(DATEREC *date) +{ + uint8_t res; + +#if McuTimeDate_CONFIG_USE_SOFTWARE_RTC && McuTimeDate_CONFIG_USE_GET_TIME_DATE_METHOD==McuTimeDate_GET_TIME_DATE_METHOD_SOFTWARE_RTC + res = McuTimeDate_GetSWTimeDate(NULL, date); +#elif McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC && McuTimeDate_CONFIG_USE_GET_TIME_DATE_METHOD==McuTimeDate_GET_TIME_DATE_METHOD_INTERNAL_RTC + res = McuTimeDate_GetInternalRTCTimeDate(NULL, date); +#elif McuTimeDate_CONFIG_USE_EXTERNAL_HW_RTC && McuTimeDate_CONFIG_USE_GET_TIME_DATE_METHOD==McuTimeDate_GET_TIME_DATE_METHOD_EXTERNAL_RTC + res = McuTimeDate_GetExternalRTCTimeDate(NULL, date); +#else + #error "invalid configuration!" + res = ERR_FAILED; +#endif +#if McuTimeDate_ON_DATE_GET_EVENT && McuTimeDate_CONFIG_USE_SOFTWARE_RTC + McuTimeDate_ON_DATE_GET_EVENT_NAME(&CntDay, &CntMonth, &CntYear); /* call user event */ +#endif + return res; +} + +/* +** =================================================================== +** Method : Init (component GenericTimeDate) +** +** Description : +** Initialization method +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuTimeDate_Init(void) +{ + /* initialize software RTC time and date */ +#if McuTimeDate_CONFIG_INIT_SOFTWARE_RTC_METHOD==McuTimeDate_INIT_SOFTWARE_RTC_FROM_DEFAULTS +/* default time/date values */ + TIMEREC McuTimeDate_DefaultTime = { + McuTimeDate_CONFIG_DEFAULT_INITIAL_TIME_HOUR, /* hour */ + McuTimeDate_CONFIG_DEFAULT_INITIAL_TIME_MIN, /* minute */ + McuTimeDate_CONFIG_DEFAULT_INITIAL_TIME_SEC, /* second */ + #if McuTimeDate_HAS_SEC100_IN_TIMEREC + 0 /* h-second */ + #endif + }; + DATEREC McuTimeDate_DefaultDate = { + McuTimeDate_CONFIG_DEFAULT_INITIAL_DATE_YEAR, /* year */ + McuTimeDate_CONFIG_DEFAULT_INITIAL_DATE_MONTH, /* month */ + McuTimeDate_CONFIG_DEFAULT_INITIAL_DATE_DAY /* day */ + }; + return McuTimeDate_SetSWTimeDate((TIMEREC*)&McuTimeDate_DefaultTime, (DATEREC*)&McuTimeDate_DefaultDate); +#elif McuTimeDate_CONFIG_INIT_SOFTWARE_RTC_METHOD==McuTimeDate_INIT_SOFTWARE_RTC_FROM_INTERNAL_RTC + return McuTimeDate_SyncWithInternalRTC(); +#elif McuTimeDate_CONFIG_INIT_SOFTWARE_RTC_METHOD==McuTimeDate_INIT_SOFTWARE_RTC_FROM_EXTERNAL_RTC + return McuTimeDate_SyncWithExternalRTC(); +#else + return ERR_FAILED; /* wrong or no init specified? */ +#endif +} + +/* +** =================================================================== +** Method : ParseCommand (component GenericTimeDate) +** +** Description : +** Shell Command Line parser +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command line +** * handled - Pointer to variable which tells if +** the command has been handled or not +** * io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuTimeDate_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) +{ + const uint8_t *p; + uint8_t hour, minute, second, hsec; + uint8_t month, day; + uint16_t year; + TIMEREC time; + DATEREC date; + int32_t unixSecs; + uint8_t buf[16]; + + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, "McuTimeDate help")==0) { + McuShell_SendHelpStr((unsigned char*)"McuTimeDate", (const unsigned char*)"Group of McuTimeDate commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (const unsigned char*)"Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" time [hh:mm:ss[,z]]", (const unsigned char*)"Set the current time. Prints the current time if no argument\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" date [dd.mm.yyyy]", (const unsigned char*)"Set the current date. Prints the current date if no argument\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" dateToSec ", (const unsigned char*)"Convert date/time int UNIX timestamp (seconds after 1970)\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" secToDate ", (const unsigned char*)"Convert UNIX timestamp to date/time\r\n", io->stdOut); + *handled = TRUE; + return ERR_OK; + } else if ((McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) || (McuUtility_strcmp((char*)cmd, "McuTimeDate status")==0)) { + *handled = TRUE; + return PrintStatus(io); + } else if (McuUtility_strncmp((char*)cmd, "McuTimeDate secToDate ", sizeof("McuTimeDate secToDate ")-1)==0) { + *handled = TRUE; + p = cmd+sizeof("McuTimeDate secToDate ")-1; + if (McuUtility_ScanDecimal32sNumber(&p, &unixSecs)==ERR_OK) { + McuTimeDate_UnixSecondsToTimeDate(unixSecs, 0, &time, &date); + buf[0] = '\0'; + AddDateToBuf(buf, sizeof(buf), &date); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((uint8_t*)" ", io->stdOut); + buf[0] = '\0'; + AddTimeToBuf(buf, sizeof(buf), &time); + McuShell_SendStr(buf, io->stdOut); + McuShell_SendStr((uint8_t*)"\r\n", io->stdOut); + } else { + McuShell_SendStr((uint8_t*)"Wrong second format.\r\n", io->stdErr); + } + } else if (McuUtility_strncmp((char*)cmd, "McuTimeDate dateToSec ", sizeof("McuTimeDate dateToSec ")-1)==0) { + *handled = TRUE; + p = cmd+sizeof("McuTimeDate dateToSec ")-1; + if (McuUtility_ScanDate(&p, &day, &month, &year)==ERR_OK) { /* format fine */ + if (McuUtility_ScanTime(&p, &hour, &minute, &second, &hsec)==ERR_OK) { /* format fine */ + time.Hour = hour; + time.Min = minute; + time.Sec = second; +#if McuTimeDate_HAS_SEC100_IN_TIMEREC + time.Sec100 = 0; +#endif + date.Day = day; + date.Month = month; + date.Year = year; + unixSecs = McuTimeDate_TimeDateToUnixSeconds(&time, &date, 0); + McuShell_SendNum32s(unixSecs, io->stdOut); + McuShell_SendStr((uint8_t*)" sec\r\n", io->stdOut); + } else { + McuShell_SendStr((uint8_t*)"Wrong time format.\r\n", io->stdErr); + return ERR_FAILED; + } + } else { + McuShell_SendStr((uint8_t*)"Wrong date format.\r\n", io->stdErr); + return ERR_FAILED; + } + } else if (McuUtility_strncmp((char*)cmd, "McuTimeDate date", sizeof("McuTimeDate date")-1)==0) { + *handled = TRUE; + return DateCmd(cmd, io); + } else if (McuUtility_strncmp((char*)cmd, "McuTimeDate time", sizeof("McuTimeDate time")-1)==0) { + *handled = TRUE; + return TimeCmd(cmd, io); + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : Deinit (component GenericTimeDate) +** +** Description : +** Deinitializes the driver. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuTimeDate_Deinit(void) +{ + /* Nothing to do */ +} + +/* +** =================================================================== +** Method : TicksToTime (component GenericTimeDate) +** +** Description : +** Transforms ticks into time information +** Parameters : +** NAME - DESCRIPTION +** ticks - +** * time - Pointer where to store the time +** information +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuTimeDate_TicksToTime(uint32_t ticks, TIMEREC *time) +{ + time->Hour = (uint8_t)(ticks/(3600*McuTimeDate_TICKS_PER_S)); /* number of hours */ + ticks %= (3600*McuTimeDate_TICKS_PER_S); /* remainder of ticks inside hour */ + time->Min = (uint8_t)(ticks/(60*McuTimeDate_TICKS_PER_S)); /* number of minutes */ + ticks %= (60*McuTimeDate_TICKS_PER_S); /* remainder of ticks inside minute */ + time->Sec = (uint8_t)(ticks/McuTimeDate_TICKS_PER_S); /* number of seconds */ + ticks %= McuTimeDate_TICKS_PER_S; +#if McuTimeDate_HAS_SEC100_IN_TIMEREC + time->Sec100 = (uint8_t)((ticks*(1000/McuTimeDate_TICKS_PER_S))/10); /* number of 1/100 seconds */ +#endif + return ERR_OK; +} + +/* +** =================================================================== +** Method : TimeToTicks (component GenericTimeDate) +** +** Description : +** Transforms time information into ticks +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer where to time information +** * ticks - Pointer to where to store the ticks +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuTimeDate_TimeToTicks(TIMEREC *time, uint32_t *ticks) +{ + uint32_t cntr; + + /* Load given time re-calculated to McuTimeDate_TICK_TIME_MS ms ticks into software tick counter */ + cntr = (3600UL*McuTimeDate_TICKS_PER_S*(uint32_t)time->Hour) + + (60UL*McuTimeDate_TICKS_PER_S*(uint32_t)time->Min) + + (McuTimeDate_TICKS_PER_S*(uint32_t)time->Sec) +#if McuTimeDate_HAS_SEC100_IN_TIMEREC + + ((McuTimeDate_TICKS_PER_S/100)*(uint32_t)time->Sec100) +#endif + ; + *ticks = cntr; + return ERR_OK; +} + +/* +** =================================================================== +** Method : SetInternalRTCTimeDate (component GenericTimeDate) +** +** Description : +** This method sets a new actual time and date of the internal +** hardware RTC. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to struct which contains the +** time to be set. Can be NULL if time shall +** not be set. +** * date - Pointer to struct which contains the +** date information to be set. Can be NULL if +** date shall not be set. +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuTimeDate_SetInternalRTCTimeDate(TIMEREC *time, DATEREC *date) +{ +#if McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC_LDD + LDD_RTC_TTime timeDate; + + /* get current time/date */ + RTC1_GetTime(RTC1_DeviceData, &timeDate); /* get information from HW RTC */ + if (time!=NULL) { + timeDate.Hour = time->Hour; + timeDate.Minute = time->Min; + timeDate.Second = time->Sec; + } + if (date!=NULL) { + timeDate.Year = date->Year; + timeDate.Month = date->Month; + timeDate.Day = date->Day; + timeDate.DayOfWeek = McuTimeDate_CalculateDayOfWeek(date->Year, date->Month, date->Day); + } + return RTC1_SetTime(RTC1_DeviceData, &timeDate); /* get information from HW RTC */ +#elif McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC_BEAN + uint8_t res; + + if (time!=NULL) { + res = RTC1_SetTime(time->Hour, time->Min, time->Sec); /* set information in HW RTC */ + if (res!=ERR_OK) { + return res; + } + } + if (date!=NULL) { + res = RTC1_SetDate(date); /* set information in HW RTC */ + if (res!=ERR_OK) { + return res; + } + } + return ERR_OK; +#elif McuLib_CONFIG_NXP_SDK_USED && McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC + uint8_t res; + rtc_datetime_t datetime; + + datetime.year = date->Year; + datetime.month = date->Month; + datetime.day = date->Day; + + datetime.hour = time->Hour; + datetime.minute = time->Min; + datetime.second = time->Sec; + + RTC_StopTimer(McuTimeDate_CONFIG_RTC_PERIPHERAL); + res = RTC_SetDatetime(McuTimeDate_CONFIG_RTC_PERIPHERAL, &datetime); + RTC_StartTimer(McuTimeDate_CONFIG_RTC_PERIPHERAL); + + if (res!=ERR_OK) { + return res; + } + return ERR_OK; +#else + (void)time; + (void)date; + return ERR_FAILED; /* no HW RTC configured */ +#endif +} + +/* +** =================================================================== +** Method : GetInternalRTCTimeDate (component GenericTimeDate) +** +** Description : +** This method returns current time and date from the hardware +** RTC. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to the structure to return the +** time. Can be NULL. +** * date - Pointer to structure which returns the +** date information. Can be NULL +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuTimeDate_GetInternalRTCTimeDate(TIMEREC *time, DATEREC *date) +{ +#if McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC_LDD + LDD_RTC_TTime timeDate; + + RTC1_GetTime(RTC1_DeviceData, &timeDate); /* get information from HW RTC */ + if (time!=NULL) { + time->Hour = timeDate.Hour; + time->Min = timeDate.Minute; + time->Sec = timeDate.Second; +#if McuTimeDate_HAS_SEC100_IN_TIMEREC + time->Sec100 = 0; +#endif + } + if (date!=NULL) { + date->Year = timeDate.Year; + date->Month = timeDate.Month; + date->Day = timeDate.Day; + } + return ERR_OK; +#elif McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC_BEAN + TIMEREC t; + DATEREC d; + uint8_t res; + + if (time!=NULL) { + res = RTC1_GetTime(&t); /* get information from HW RTC */ + if (res!=ERR_OK) { + return res; + } + *time = t; /* struct copy */ + } + if (date!=NULL) { + res = RTC1_GetDate(&d); /* get information from HW RTC */ + if (res!=ERR_OK) { + return res; + } + *date = d; /* struct copy */ + } + return ERR_OK; +#elif McuLib_CONFIG_NXP_SDK_USED && McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC + rtc_datetime_t datetime; + RTC_GetDatetime(McuTimeDate_CONFIG_RTC_PERIPHERAL, &datetime); + + if (time!=NULL) { + time->Hour = datetime.hour; + time->Min = datetime.minute; + time->Sec = datetime.second; + time->Sec100 = 0; + } + + if (date!=NULL) { + date->Year = datetime.year; + date->Month = datetime.month; + date->Day = datetime.day; + } + + return ERR_OK; +#else + (void)time; + (void)date; + return ERR_FAILED; /* no HW RTC configured */ +#endif +} + +/* +** =================================================================== +** Method : CalculateDayOfWeek (component GenericTimeDate) +** +** Description : +** Returns the day of the week, Sunday starting as zero. Monday +** is 1, ... +** Parameters : +** NAME - DESCRIPTION +** Year - Years (16-bit unsigned integer) +** Month - Months (8-bit unsigned integer) +** Day - Days (8-bit unsigned integer) +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuTimeDate_CalculateDayOfWeek(uint16_t Year, uint8_t Month, uint8_t Day) +{ + /* see http://stackoverflow.com/questions/478694/what-is-the-easiest-algorithm-to-find-the-day-of-week-of-day-zero-of-a-given-yea */ + int32_t c, y, cc, yy, m, d; + uint8_t dayOfWeek; + + cc = Year/100; + yy = Year-((Year/100)*100); + c = (cc/4) - 2*cc-1; + y = 5*yy/4; + m = 26*(Month+1)/10; + d = Day; + + dayOfWeek = (uint8_t)(c+y+m+d)%7; + return dayOfWeek; /* 0: Sunday, 1: Monday, ... 6: Saturday */ +} + +/* +** =================================================================== +** Method : SyncSWtimeToInternalRTCsec (component GenericTimeDate) +** +** Description : +** This method synchronizes the software RTC with the internal +** HW RTC. Because the internal RTC only counts seconds, we +** sync on a second change. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuTimeDate_SyncSWtimeToInternalRTCsec(void) +{ + /* This method synchronizes the software RTC with the internal HW RTC. + * Because the internal RTC only counts seconds, we sync on a second change. + */ + TIMEREC time; + uint8_t secs; + + if (McuTimeDate_GetInternalRTCTimeDate(&time, NULL)!=ERR_OK) { + return ERR_FAILED; + } + secs = time.Sec; /* remember current second counter */ + do { + if (McuTimeDate_GetInternalRTCTimeDate(&time, NULL)!=ERR_OK) { + return ERR_FAILED; + } + } while(secs==time.Sec); + /* internal RTC has switched to the new second: sync internal RTC with it */ + if (McuTimeDate_SetSWTimeDate(&time, NULL)!=ERR_OK) { /* sync software RTC from HW RTC */ + return ERR_FAILED; + } + return ERR_OK; +} + +/* +** =================================================================== +** Method : SyncWithInternalRTC (component GenericTimeDate) +** +** Description : +** Synchronizes the software RTC with date and time from the +** internal hardware RTC +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuTimeDate_SyncWithInternalRTC(void) +{ +#if McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC || McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC_LDD || McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC_BEAN + TIMEREC time; + DATEREC date; + uint8_t res; + + /* get current internal RTC time/date */ +#if McuLib_CONFIG_NXP_SDK_USED + rtc_datetime_t datetime; + RTC_GetDatetime(McuTimeDate_CONFIG_RTC_PERIPHERAL, &datetime); + + time.Hour = datetime.hour; + time.Min = datetime.minute; + time.Sec = datetime.second; + time.Sec100 = 0; /* rtc_datetime_t does not support ms */ + + date.Year = datetime.year; + date.Month = datetime.month; + date.Day = datetime.day; +#else /* McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC_LDD || McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC_BEAN */ + res = McuTimeDate_GetInternalRTCTimeDate(&time, &date); + if (res!=ERR_OK) { + return res; + } +#endif + + /* update software time from hardware information */ +#if McuTimeDate_HAS_SEC100_IN_TIMEREC + res = McuTimeDate_SetTime(time.Hour, time.Min, time.Sec, time.Sec100); +#else + res = McuTimeDate_SetTime(time.Hour, time.Min, time.Sec, 0); +#endif + if (res!=ERR_OK) { + return res; + } + res = McuTimeDate_SetDate(date.Year, date.Month, date.Day); + if (res!=ERR_OK) { + return res; + } + /* now sync to the second of the internal RTC */ + res = McuTimeDate_SyncSWtimeToInternalRTCsec(); + if (res!=ERR_OK) { + return res; + } + return ERR_OK; +#else + return ERR_FAILED; /* no hardware RTC available */ +#endif +} + +/* +** =================================================================== +** Method : SyncWithExternalRTC (component GenericTimeDate) +** +** Description : +** Synchronizes the software RTC with date and time from the +** hardware RTC. Note that if that RTC interface requires +** interrupts, this function should be called only when +** interrupts are enabled. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuTimeDate_SyncWithExternalRTC(void) +{ +#if McuTimeDate_CONFIG_USE_EXTERNAL_HW_RTC + TIMEREC time; + DATEREC date; + uint8_t res; + + res = McuTimeDate_GetExternalRTCTimeDate(&time, &date); + if (res!=ERR_OK) { + return res; + } + /* update software time from hardware information */ +#if McuTimeDate_HAS_SEC100_IN_TIMEREC + res = McuTimeDate_SetTime(time.Hour, time.Min, time.Sec, time.Sec100); +#else + res = McuTimeDate_SetTime(time.Hour, time.Min, time.Sec, 0); +#endif + if (res!=ERR_OK) { + return res; + } + return McuTimeDate_SetDate(date.Year, date.Month, date.Day); +#else + return ERR_FAILED; /* no external RTC available */ +#endif +} + +/* +** =================================================================== +** Method : SetExternalRTCTimeDate (component GenericTimeDate) +** +** Description : +** This method sets a new actual time and date of the external +** hardware RTC. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to struct which contains the +** time to be set. Can be NULL if time shall +** not be set. +** * date - Pointer to struct which contains the +** date information to be set. Can be NULL if +** date shall not be set. +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuTimeDate_SetExternalRTCTimeDate(TIMEREC *time, DATEREC *date) +{ +#if McuTimeDate_CONFIG_USE_EXTERNAL_HW_RTC + uint8_t res; + + if (time!=NULL) { + res = McuTimeDate_CONFIG_EXT_RTC_SET_TIME_FCT(time->Hour, time->Min, time->Sec, +#if McuTimeDate_HAS_SEC100_IN_TIMEREC + time->Sec100 +#else + 0 +#endif + ); + if (res!=ERR_OK) { + return res; + } + } + if (date!=NULL) { + res = McuTimeDate_CONFIG_EXT_RTC_SET_DATE_FCT(date->Year, date->Month, date->Day); + if (res!=ERR_OK) { + return res; + } + } + return ERR_OK; +#else + (void)time; + (void)date; + return ERR_FAILED; /* no external RTC available */ +#endif +} + +/* +** =================================================================== +** Method : GetExternalRTCTimeDate (component GenericTimeDate) +** +** Description : +** This method returns current time and date from the external +** hardware RTC. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to the structure to return the +** time. Can be NULL. +** * date - Pointer to structure which returns the +** date information. Can be NULL +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuTimeDate_GetExternalRTCTimeDate(TIMEREC *time, DATEREC *date) +{ +#if McuTimeDate_CONFIG_USE_EXTERNAL_HW_RTC + uint8_t res; + + if (time!=NULL) { + res = McuTimeDate_CONFIG_EXT_RTC_GET_TIME_FCT(time); + if (res!=ERR_OK) { + return res; + } + } + if (date!=NULL) { + res = McuTimeDate_CONFIG_EXT_RTC_GET_DATE_FCT(date); + if (res!=ERR_OK) { + return res; + } + } + return ERR_OK; +#else + (void)time; + (void)date; + return ERR_FAILED; /* no external RTC available */ +#endif +} + +/* +** =================================================================== +** Method : SetTimeDate (component GenericTimeDate) +** +** Description : +** This method sets a new actual time and date of the RTC. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to struct which contains the +** time to be set. Can be NULL if time shall +** not be set. +** * date - Pointer to struct which contains the +** date information to be set. Can be NULL if +** date shall not be set. +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuTimeDate_SetTimeDate(TIMEREC *time, DATEREC *date) +{ + uint8_t res = ERR_OK; + bool failed = FALSE; + +#if McuTimeDate_CONFIG_USE_SOFTWARE_RTC && McuTimeDate_CONFIG_SET_TIME_DATE_METHOD_USES_SOFTWARE_RTC + res = McuTimeDate_SetSWTimeDate(time, date); + if (res!=ERR_OK) { + failed = TRUE; + } +#endif +#if McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC && McuTimeDate_CONFIG_SET_TIME_DATE_METHOD_USES_INTERNAL_RTC + res = McuTimeDate_SetInternalRTCTimeDate(time, date); + if (res!=ERR_OK) { + failed = TRUE; + } +#endif +#if McuTimeDate_CONFIG_USE_EXTERNAL_HW_RTC && McuTimeDate_CONFIG_SET_TIME_DATE_METHOD_USES_EXTERNAL_RTC + res = McuTimeDate_SetExternalRTCTimeDate(time, date); + if (res!=ERR_OK) { + failed = TRUE; + } +#endif + if (failed) { + res = ERR_FAILED; + } + return res; +} + +/* +** =================================================================== +** Method : GetTimeDate (component GenericTimeDate) +** +** Description : +** This method returns current time and date from the RTC. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to the structure to return the +** time. Can be NULL. +** * date - Pointer to structure which returns the +** date information. Can be NULL +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuTimeDate_GetTimeDate(TIMEREC *time, DATEREC *date) +{ + uint8_t res; + +#if McuTimeDate_CONFIG_USE_SOFTWARE_RTC && McuTimeDate_CONFIG_USE_GET_TIME_DATE_METHOD==McuTimeDate_GET_TIME_DATE_METHOD_SOFTWARE_RTC + res = McuTimeDate_GetSWTimeDate(time, date); +#elif McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC && McuTimeDate_CONFIG_USE_GET_TIME_DATE_METHOD==McuTimeDate_GET_TIME_DATE_METHOD_INTERNAL_RTC + res = McuTimeDate_GetInternalRTCTimeDate(time, date); +#elif McuTimeDate_CONFIG_USE_EXTERNAL_HW_RTC && McuTimeDate_CONFIG_USE_GET_TIME_DATE_METHOD==McuTimeDate_GET_TIME_DATE_METHOD_EXTERNAL_RTC + res = McuTimeDate_GetExternalRTCTimeDate(time, date); +#else + #error "invalid configuration!" + res = ERR_FAILED; +#endif + return res; +} + +/* +** =================================================================== +** Method : UnixSecondsToTimeDateCustom (component GenericTimeDate) +** +** Description : +** Transforms a given time/date into the Unix time stamp, with +** the number of seconds from a starting date +** Parameters : +** NAME - DESCRIPTION +** seconds - Unix time stamp in seconds after +** the given base year and base month +** offset_hours - Optional time zone +** offset, use 0 for no offset +** * time - Pointer to TIMEREC struct where the +** result is stored. Can be NULL. +** * date - Pointer to DATEREC struct where the +** result is stored. Can be NULL. +** baseYear - Base year from which is used as +** base to count the seconds, in YYYY format. +** Returns : Nothing +** =================================================================== +*/ +void McuTimeDate_UnixSecondsToTimeDateCustom(int32_t seconds, int8_t offset_hours, TIMEREC *time, DATEREC *date, uint16_t baseYear) +{ + /* Implementation based on https://www.experts-exchange.com/questions/26868405/convert-unix-time-stamp-for-8-bit-C-compiler.html */ + uint8_t daysmonth[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + int32_t secs_per_year; + int32_t secs_per_month; + uint16_t year; + uint8_t month; + uint8_t day; + uint8_t hours; + uint8_t minutes; + + /* adjust seconds to localtime */ + seconds -= (int32_t)offset_hours*3600; + /* year */ + year = baseYear; + if (McuUtility_IsLeapYear(year)) { + secs_per_year = (365+1)*24*3600; + } else { + secs_per_year = 365*24*3600; + } + while (seconds>=secs_per_year) { + seconds -= secs_per_year; + year++; + if (McuUtility_IsLeapYear(year)) { + secs_per_year = (365+1)*24*3600; + } else { + secs_per_year = 365*24*3600; + } + } + /* month update based on leap year */ + if (McuUtility_IsLeapYear(year)) { /* adjust leap year month days */ + daysmonth[2] = 29; + } else { + daysmonth[2] = 28; + } + /* month */ + month = 1; + secs_per_month = (int32_t)daysmonth[1]*24*3600; + while (seconds >= secs_per_month) { + seconds -= secs_per_month; + month++; + secs_per_month = (int32_t)daysmonth[month]*24*3600; + } + /* day */ + day = (uint8_t)(seconds/(24*3600))+1; + seconds = seconds%(24*3600); + + hours = (uint8_t)(seconds/3600); + seconds = seconds%3600; + + minutes = (uint8_t)(seconds/60); + seconds = seconds%60; + + if (date!=NULL) { + date->Day = day; + date->Month = month; + date->Year = year; + } + if (time!=NULL) { + time->Hour = hours; + time->Min = minutes; + time->Sec = (uint8_t)seconds; +#if McuTimeDate_HAS_SEC100_IN_TIMEREC + time->Sec100 = 0; +#endif + } +} + +/* +** =================================================================== +** Method : TimeDateToUnixSecondsCustom (component GenericTimeDate) +** +** Description : +** Returns for a given time/date the corresponding UNIX time +** stamp with a custom base date. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to TIMEREC which holds the time +** to convert +** * date - Pointer to DATEREC with the date to +** convert +** offset_hours - Optional number of +** offset hours to adjust for the time zone. +** Use 0 for no adjustment. +** baseYear - Base year from which is used as +** base to count the seconds, in YYYY format +** Returns : +** --- - number of seconds after given base +** month/year +** =================================================================== +*/ +int32_t McuTimeDate_TimeDateToUnixSecondsCustom(TIMEREC *time, DATEREC *date, int8_t offset_hours, uint16_t baseYear) +{ + /* implementation based on https://www.experts-exchange.com/questions/26868405/convert-unix-time-stamp-for-8-bit-C-compiler.html */ + uint8_t daysmonth[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + int32_t nofSecs; + uint16_t year; + uint8_t month; + + /* calculate the seconds for the given day */ + nofSecs = (int32_t)time->Sec; + nofSecs += ((int32_t)time->Min)*60; + nofSecs += (int32_t)time->Hour*3600; + nofSecs += (int32_t)offset_hours*3600; + nofSecs += (int32_t)(date->Day-1)*24*3600; + /* month update based on leap year */ + if (McuUtility_IsLeapYear(date->Year)) { /* adjust leap year month days */ + daysmonth[2] = 29; + } else { + daysmonth[2] = 28; + } + /* calculate the seconds for the months in the given date */ + for (month = date->Month-1; month>0; month--) { + nofSecs += (int32_t)daysmonth[month]*24*3600; + } + /* count the years back to the base year */ + for (year=date->Year-1; year>=baseYear; year--) { + if (McuUtility_IsLeapYear(year)) { + nofSecs += (365+1)*24*3600; + } else { + nofSecs += 365*24*3600; + } + } + return nofSecs; +} + +/* +** =================================================================== +** Method : UnixSecondsToTimeDate (component GenericTimeDate) +** +** Description : +** Transforms a given time/date into the Unix time stamp, with +** the number of seconds after 1-Jan-1970 +** Parameters : +** NAME - DESCRIPTION +** seconds - Unix time stamp in seconds after +** the given base year and base month +** offset_hours - Optional time zone +** offset, use 0 for no offset +** * time - Pointer to TIMEREC struct where the +** result is stored. Can be NULL. +** * date - Pointer to DATEREC struct where the +** result is stored. Can be NULL. +** Returns : Nothing +** =================================================================== +*/ +void McuTimeDate_UnixSecondsToTimeDate(int32_t seconds, int8_t offset_hours, TIMEREC *time, DATEREC *date) +{ + McuTimeDate_UnixSecondsToTimeDateCustom(seconds, offset_hours, time, date, 1970); +} + +/* +** =================================================================== +** Method : TimeDateToUnixSeconds (component GenericTimeDate) +** +** Description : +** Returns for a given time/date the corresponding UNIX time +** stamp, starting at 1-Jan-1970. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to TIMEREC which holds the time +** to convert +** * date - Pointer to DATEREC with the date to +** convert +** offset_hours - Optional number of +** offset hours to adjust for the time zone. +** Use 0 for no adjustment. +** Returns : +** --- - number of seconds after given base +** month/year +** =================================================================== +*/ +int32_t McuTimeDate_TimeDateToUnixSeconds(TIMEREC *time, DATEREC *date, int8_t offset_hours) +{ + return McuTimeDate_TimeDateToUnixSecondsCustom(time, date, offset_hours, 1970); +} + +/* +** =================================================================== +** Method : AddDateString (component GenericTimeDate) +** +** Description : +** Adds a formatted date string to a buffer +** Parameters : +** NAME - DESCRIPTION +** * buf - Pointer to zero terminated buffer where to +** append the string +** bufSize - Size of the buffer in bytes +** * date - Pointer to date information +** * format - Pointer to the format string. +** Supported formats: "dd.mm.yyyy" +** Returns : +** --- - Error code, ERR_OK for no error +** =================================================================== +*/ +uint8_t McuTimeDate_AddDateString(uint8_t *buf, size_t bufSize, DATEREC *date, uint8_t *format) +{ + /* currently only the following format is supported: "dd.mm.yyyy" */ + (void)format; /* not supported yet */ + McuUtility_strcatNum16uFormatted(buf, bufSize, date->Day, '0', 2); + McuUtility_chcat(buf, bufSize, '.'); + McuUtility_strcatNum16uFormatted(buf, bufSize, date->Month, '0', 2); + McuUtility_chcat(buf, bufSize, '.'); + McuUtility_strcatNum16u(buf, bufSize, (uint16_t)date->Year); + return ERR_OK; +} + +/* +** =================================================================== +** Method : AddTimeString (component GenericTimeDate) +** +** Description : +** Adds a formatted time string to a buffer +** Parameters : +** NAME - DESCRIPTION +** * buf - Pointer to zero terminated buffer where to +** append the string +** bufSize - Size of the buffer in bytes +** * time - Pointer to time information +** * format - Pointer to the format string. +** Supported formats: "hh:mm.ss,cc" +** Returns : +** --- - Error code, ERR_OK for no error +** =================================================================== +*/ +uint8_t McuTimeDate_AddTimeString(uint8_t *buf, size_t bufSize, TIMEREC *time, uint8_t *format) +{ + /* currently only the following format is supported: hh:mm:ss,cc" */ + (void)format; /* not supported yet */ + McuUtility_strcatNum16sFormatted(buf, bufSize, time->Hour, '0', 2); + McuUtility_chcat(buf, bufSize, ':'); + McuUtility_strcatNum16sFormatted(buf, bufSize, time->Min, '0', 2); + McuUtility_chcat(buf, bufSize, ':'); + McuUtility_strcatNum16sFormatted(buf, bufSize, time->Sec, '0', 2); + McuUtility_chcat(buf, bufSize, ','); +#if McuTimeDate_HAS_SEC100_IN_TIMEREC + McuUtility_strcatNum16sFormatted(buf, bufSize, time->Sec100, '0', 2); +#else + McuUtility_strcatNum16sFormatted(buf, bufSize, 0, '0', 2); +#endif + return ERR_OK; +} + +/* END McuTimeDate. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuTimeDate.h b/TSM_PicoW_Sensor/McuLib/src/McuTimeDate.h new file mode 100644 index 0000000..9c61846 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuTimeDate.h @@ -0,0 +1,703 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuTimeDate.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : GenericTimeDate +** Version : Component 01.068, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2023-02-28, 09:38, # CodeGen: 794 +** Abstract : +** Software date/time module. +** Settings : +** Component name : McuTimeDate +** Software RTC : Enabled +** Tick Time (ms) : 10 +** RTOS : Enabled +** RTOS : McuRTOS +** Hardware RTC : Enabled +** Internal : Disabled +** External RTC : Disabled +** Set Time and Date : +** Software RTC : yes +** Internal RTC : no +** External RTC : yes +** Get Time and Date : Software RTC +** Init() : +** Defaults : +** Time : 17:51:31 +** Date : 2019-08-01 +** Call Init() in startup : yes +** Software RTC Initialization : Init from Defaults +** System : +** Critical Section : McuCriticalSection +** SDK : McuLib +** Shell : Enabled +** Utility : McuUtility +** Shell : McuShell +** Contents : +** AddTick - void McuTimeDate_AddTick(void); +** AddTicks - void McuTimeDate_AddTicks(uint16_t nofTicks); +** TicksToTime - uint8_t McuTimeDate_TicksToTime(uint32_t ticks, TIMEREC *time); +** TimeToTicks - uint8_t McuTimeDate_TimeToTicks(TIMEREC *time, uint32_t *ticks); +** CalculateDayOfWeek - uint8_t McuTimeDate_CalculateDayOfWeek(uint16_t Year, uint8_t Month, uint8_t... +** SetTime - uint8_t McuTimeDate_SetTime(uint8_t Hour, uint8_t Min, uint8_t Sec, uint8_t... +** GetTime - uint8_t McuTimeDate_GetTime(TIMEREC *time); +** SetDate - uint8_t McuTimeDate_SetDate(uint16_t Year, uint8_t Month, uint8_t Day); +** GetDate - uint8_t McuTimeDate_GetDate(DATEREC *date); +** SetTimeDate - uint8_t McuTimeDate_SetTimeDate(TIMEREC *time, DATEREC *date); +** GetTimeDate - uint8_t McuTimeDate_GetTimeDate(TIMEREC *time, DATEREC *date); +** SetSWTimeDate - uint8_t McuTimeDate_SetSWTimeDate(TIMEREC *time, DATEREC *date); +** GetSWTimeDate - uint8_t McuTimeDate_GetSWTimeDate(TIMEREC *time, DATEREC *date); +** SetInternalRTCTimeDate - uint8_t McuTimeDate_SetInternalRTCTimeDate(TIMEREC *time, DATEREC *date); +** GetInternalRTCTimeDate - uint8_t McuTimeDate_GetInternalRTCTimeDate(TIMEREC *time, DATEREC *date); +** SyncWithInternalRTC - uint8_t McuTimeDate_SyncWithInternalRTC(void); +** SyncSWtimeToInternalRTCsec - uint8_t McuTimeDate_SyncSWtimeToInternalRTCsec(void); +** SetExternalRTCTimeDate - uint8_t McuTimeDate_SetExternalRTCTimeDate(TIMEREC *time, DATEREC *date); +** GetExternalRTCTimeDate - uint8_t McuTimeDate_GetExternalRTCTimeDate(TIMEREC *time, DATEREC *date); +** SyncWithExternalRTC - uint8_t McuTimeDate_SyncWithExternalRTC(void); +** UnixSecondsToTimeDateCustom - void McuTimeDate_UnixSecondsToTimeDateCustom(int32_t seconds, int8_t... +** UnixSecondsToTimeDate - void McuTimeDate_UnixSecondsToTimeDate(int32_t seconds, int8_t offset_hours,... +** TimeDateToUnixSecondsCustom - int32_t McuTimeDate_TimeDateToUnixSecondsCustom(TIMEREC *time, DATEREC *date,... +** TimeDateToUnixSeconds - int32_t McuTimeDate_TimeDateToUnixSeconds(TIMEREC *time, DATEREC *date,... +** AddDateString - uint8_t McuTimeDate_AddDateString(uint8_t *buf, size_t bufSize, DATEREC... +** AddTimeString - uint8_t McuTimeDate_AddTimeString(uint8_t *buf, size_t bufSize, TIMEREC... +** ParseCommand - uint8_t McuTimeDate_ParseCommand(const unsigned char *cmd, bool *handled,... +** Deinit - void McuTimeDate_Deinit(void); +** Init - uint8_t McuTimeDate_Init(void); +** +** * Copyright (c) 2011-2023, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuTimeDate.h +** @version 01.00 +** @brief +** Software date/time module. +*/ +/*! +** @addtogroup McuTimeDate_module McuTimeDate module documentation +** @{ +*/ + +#ifndef __McuTimeDate_H +#define __McuTimeDate_H + +/* MODULE McuTimeDate. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuTimeDateconfig.h" /* configuration */ + +/* Include inherited components */ +#include "McuRTOS.h" +#include "McuCriticalSection.h" +#include "McuUtility.h" +#include "McuLib.h" +#include "McuShell.h" + +#if McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC_BEAN + #define McuTimeDate_HAS_SEC100_IN_TIMEREC (0) /* Bean version have no Sec100! */ +#else + #define McuTimeDate_HAS_SEC100_IN_TIMEREC (1) /* non-Bean version have Sec100 */ +#endif +/* internal configuration for the API used: */ +#define McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC_LDD (0) /* set to 1 if using HW RTC using LDD driver, 0 otherwise */ +#define McuTimeDate_CONFIG_USE_INTERNAL_HW_RTC_BEAN (0) /* set to 1 if using HW RTC using normal bean driver, 0 otherwise */ + + +#define McuTimeDate_PARSE_COMMAND_ENABLED McuTimeDate_CONFIG_PARSE_COMMAND_ENABLED + +/* user events */ +#define McuTimeDate_ON_DATE_GET_EVENT 0 /* 1: enabled user event */ +#define McuTimeDate_ON_DATE_GET_EVENT_NAME McuTimeDate_OnDateGet /* name of user event*/ +#define McuTimeDate_ON_TIME_GET_EVENT 0 /* 1: enabled user event */ +#define McuTimeDate_ON_TIME_GET_EVENT_NAME McuTimeDate_OnTimeGet /* name of user event*/ +#define McuTimeDate_ON_DATE_SET_EVENT 0 /* 1: enabled user event */ +#define McuTimeDate_ON_DATE_SET_EVENT_NAME McuTimeDate_OnDateSet /* name of user event*/ +#define McuTimeDate_ON_TIME_SET_EVENT 0 /* 1: enabled user event */ +#define McuTimeDate_ON_TIME_SET_EVENT_NAME McuTimeDate_OnTimeSet /* name of user event*/ + + +#ifndef __BWUserType_TIMEREC +#define __BWUserType_TIMEREC + typedef struct { /* It contains actual number of hours, minutes, seconds and hundreth of seconds. */ + uint8_t Hour; /* hours (0 - 23) */ + uint8_t Min; /* minutes (0 - 59) */ + uint8_t Sec; /* seconds (0 - 59) */ + #if McuTimeDate_HAS_SEC100_IN_TIMEREC /* does not exist for Bean version */ + uint8_t Sec100; /* hundredth of seconds (0 - 99) */ + #endif + } TIMEREC; +#endif +#ifndef __BWUserType_DATEREC +#define __BWUserType_DATEREC + typedef struct { /* It contains actual year, month, and day description. */ + uint16_t Year; /* years (1998 - 2099) */ + uint8_t Month; /* months (1 - 12) */ + uint8_t Day; /* days (1 - 31) */ + } DATEREC; +#endif + +#define McuTimeDate_TICK_TIME_MS McuTimeDate_CONFIG_TICK_TIME_MS /* period of AddTick() */ + + + + + +uint8_t McuTimeDate_SetTime(uint8_t Hour, uint8_t Min, uint8_t Sec, uint8_t Sec100); +/* +** =================================================================== +** Method : SetTime (component GenericTimeDate) +** +** Description : +** This method sets a new actual time of the software RTC. +** Parameters : +** NAME - DESCRIPTION +** Hour - Hours (0 - 23) +** Min - Minutes (0 - 59) +** Sec - Seconds (0 - 59) +** Sec100 - Hundredth of seconds (0 - 99) +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuTimeDate_AddTick(void); +/* +** =================================================================== +** Method : AddTick (component GenericTimeDate) +** +** Description : +** Increments the tick counter of the software RTC. Needs to be +** called periodically by the application to increase the time +** tick count. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuTimeDate_GetTime(TIMEREC *time); +/* +** =================================================================== +** Method : GetTime (component GenericTimeDate) +** +** Description : +** This method returns current time from the software RTC. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to the structure TIMEREC. It +** contains actual number of hours, minutes, +** seconds and hundredth of seconds. +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuTimeDate_SetDate(uint16_t Year, uint8_t Month, uint8_t Day); +/* +** =================================================================== +** Method : SetDate (component GenericTimeDate) +** +** Description : +** This method sets a new actual date of the software RTC. +** Parameters : +** NAME - DESCRIPTION +** Year - Years (16-bit unsigned integer) +** Month - Months (8-bit unsigned integer) +** Day - Days (8-bit unsigned integer) +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuTimeDate_GetDate(DATEREC *date); +/* +** =================================================================== +** Method : GetDate (component GenericTimeDate) +** +** Description : +** This method returns current date from the software RTC. +** Parameters : +** NAME - DESCRIPTION +** * date - Pointer to DATEREC +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuTimeDate_Init(void); +/* +** =================================================================== +** Method : Init (component GenericTimeDate) +** +** Description : +** Initialization method +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuTimeDate_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); +/* +** =================================================================== +** Method : ParseCommand (component GenericTimeDate) +** +** Description : +** Shell Command Line parser +** Parameters : +** NAME - DESCRIPTION +** * cmd - Pointer to command line +** * handled - Pointer to variable which tells if +** the command has been handled or not +** * io - Pointer to I/O structure +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuTimeDate_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component GenericTimeDate) +** +** Description : +** Deinitializes the driver. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuTimeDate_AddTicks(uint16_t nofTicks); +/* +** =================================================================== +** Method : AddTicks (component GenericTimeDate) +** +** Description : +** Same as AddTick(), but multiple ticks can be added in one +** step. +** Parameters : +** NAME - DESCRIPTION +** nofTicks - Number of ticks to be added +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuTimeDate_TicksToTime(uint32_t ticks, TIMEREC *time); +/* +** =================================================================== +** Method : TicksToTime (component GenericTimeDate) +** +** Description : +** Transforms ticks into time information +** Parameters : +** NAME - DESCRIPTION +** ticks - +** * time - Pointer where to store the time +** information +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuTimeDate_TimeToTicks(TIMEREC *time, uint32_t *ticks); +/* +** =================================================================== +** Method : TimeToTicks (component GenericTimeDate) +** +** Description : +** Transforms time information into ticks +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer where to time information +** * ticks - Pointer to where to store the ticks +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuTimeDate_SetInternalRTCTimeDate(TIMEREC *time, DATEREC *date); +/* +** =================================================================== +** Method : SetInternalRTCTimeDate (component GenericTimeDate) +** +** Description : +** This method sets a new actual time and date of the internal +** hardware RTC. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to struct which contains the +** time to be set. Can be NULL if time shall +** not be set. +** * date - Pointer to struct which contains the +** date information to be set. Can be NULL if +** date shall not be set. +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuTimeDate_GetInternalRTCTimeDate(TIMEREC *time, DATEREC *date); +/* +** =================================================================== +** Method : GetInternalRTCTimeDate (component GenericTimeDate) +** +** Description : +** This method returns current time and date from the hardware +** RTC. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to the structure to return the +** time. Can be NULL. +** * date - Pointer to structure which returns the +** date information. Can be NULL +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuTimeDate_CalculateDayOfWeek(uint16_t Year, uint8_t Month, uint8_t Day); +/* +** =================================================================== +** Method : CalculateDayOfWeek (component GenericTimeDate) +** +** Description : +** Returns the day of the week, Sunday starting as zero. Monday +** is 1, ... +** Parameters : +** NAME - DESCRIPTION +** Year - Years (16-bit unsigned integer) +** Month - Months (8-bit unsigned integer) +** Day - Days (8-bit unsigned integer) +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuTimeDate_SetSWTimeDate(TIMEREC *time, DATEREC *date); +/* +** =================================================================== +** Method : SetSWTimeDate (component GenericTimeDate) +** +** Description : +** This method sets a new actual time and date of the software +** RTC. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to struct which contains the +** time to be set. Can be NULL if time shall +** not be set. +** * date - Pointer to struct which contains the +** date information to be set. Can be NULL if +** date shall not be set. +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuTimeDate_GetSWTimeDate(TIMEREC *time, DATEREC *date); +/* +** =================================================================== +** Method : GetSWTimeDate (component GenericTimeDate) +** +** Description : +** This method returns current time and date from the software +** RTC. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to the structure to return the +** time. Can be NULL. +** * date - Pointer to structure which returns the +** date information. Can be NULL +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuTimeDate_SyncWithInternalRTC(void); +/* +** =================================================================== +** Method : SyncWithInternalRTC (component GenericTimeDate) +** +** Description : +** Synchronizes the software RTC with date and time from the +** internal hardware RTC +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuTimeDate_SyncWithExternalRTC(void); +/* +** =================================================================== +** Method : SyncWithExternalRTC (component GenericTimeDate) +** +** Description : +** Synchronizes the software RTC with date and time from the +** hardware RTC. Note that if that RTC interface requires +** interrupts, this function should be called only when +** interrupts are enabled. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuTimeDate_SetExternalRTCTimeDate(TIMEREC *time, DATEREC *date); +/* +** =================================================================== +** Method : SetExternalRTCTimeDate (component GenericTimeDate) +** +** Description : +** This method sets a new actual time and date of the external +** hardware RTC. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to struct which contains the +** time to be set. Can be NULL if time shall +** not be set. +** * date - Pointer to struct which contains the +** date information to be set. Can be NULL if +** date shall not be set. +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuTimeDate_GetExternalRTCTimeDate(TIMEREC *time, DATEREC *date); +/* +** =================================================================== +** Method : GetExternalRTCTimeDate (component GenericTimeDate) +** +** Description : +** This method returns current time and date from the external +** hardware RTC. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to the structure to return the +** time. Can be NULL. +** * date - Pointer to structure which returns the +** date information. Can be NULL +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuTimeDate_SetTimeDate(TIMEREC *time, DATEREC *date); +/* +** =================================================================== +** Method : SetTimeDate (component GenericTimeDate) +** +** Description : +** This method sets a new actual time and date of the RTC. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to struct which contains the +** time to be set. Can be NULL if time shall +** not be set. +** * date - Pointer to struct which contains the +** date information to be set. Can be NULL if +** date shall not be set. +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuTimeDate_GetTimeDate(TIMEREC *time, DATEREC *date); +/* +** =================================================================== +** Method : GetTimeDate (component GenericTimeDate) +** +** Description : +** This method returns current time and date from the RTC. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to the structure to return the +** time. Can be NULL. +** * date - Pointer to structure which returns the +** date information. Can be NULL +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuTimeDate_UnixSecondsToTimeDateCustom(int32_t seconds, int8_t offset_hours, TIMEREC *time, DATEREC *date, uint16_t baseYear); +/* +** =================================================================== +** Method : UnixSecondsToTimeDateCustom (component GenericTimeDate) +** +** Description : +** Transforms a given time/date into the Unix time stamp, with +** the number of seconds from a starting date +** Parameters : +** NAME - DESCRIPTION +** seconds - Unix time stamp in seconds after +** the given base year and base month +** offset_hours - Optional time zone +** offset, use 0 for no offset +** * time - Pointer to TIMEREC struct where the +** result is stored. Can be NULL. +** * date - Pointer to DATEREC struct where the +** result is stored. Can be NULL. +** baseYear - Base year from which is used as +** base to count the seconds, in YYYY format. +** Returns : Nothing +** =================================================================== +*/ + +int32_t McuTimeDate_TimeDateToUnixSecondsCustom(TIMEREC *time, DATEREC *date, int8_t offset_hours, uint16_t baseYear); +/* +** =================================================================== +** Method : TimeDateToUnixSecondsCustom (component GenericTimeDate) +** +** Description : +** Returns for a given time/date the corresponding UNIX time +** stamp with a custom base date. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to TIMEREC which holds the time +** to convert +** * date - Pointer to DATEREC with the date to +** convert +** offset_hours - Optional number of +** offset hours to adjust for the time zone. +** Use 0 for no adjustment. +** baseYear - Base year from which is used as +** base to count the seconds, in YYYY format +** Returns : +** --- - number of seconds after given base +** month/year +** =================================================================== +*/ + +void McuTimeDate_UnixSecondsToTimeDate(int32_t seconds, int8_t offset_hours, TIMEREC *time, DATEREC *date); +/* +** =================================================================== +** Method : UnixSecondsToTimeDate (component GenericTimeDate) +** +** Description : +** Transforms a given time/date into the Unix time stamp, with +** the number of seconds after 1-Jan-1970 +** Parameters : +** NAME - DESCRIPTION +** seconds - Unix time stamp in seconds after +** the given base year and base month +** offset_hours - Optional time zone +** offset, use 0 for no offset +** * time - Pointer to TIMEREC struct where the +** result is stored. Can be NULL. +** * date - Pointer to DATEREC struct where the +** result is stored. Can be NULL. +** Returns : Nothing +** =================================================================== +*/ + +int32_t McuTimeDate_TimeDateToUnixSeconds(TIMEREC *time, DATEREC *date, int8_t offset_hours); +/* +** =================================================================== +** Method : TimeDateToUnixSeconds (component GenericTimeDate) +** +** Description : +** Returns for a given time/date the corresponding UNIX time +** stamp, starting at 1-Jan-1970. +** Parameters : +** NAME - DESCRIPTION +** * time - Pointer to TIMEREC which holds the time +** to convert +** * date - Pointer to DATEREC with the date to +** convert +** offset_hours - Optional number of +** offset hours to adjust for the time zone. +** Use 0 for no adjustment. +** Returns : +** --- - number of seconds after given base +** month/year +** =================================================================== +*/ + +uint8_t McuTimeDate_AddDateString(uint8_t *buf, size_t bufSize, DATEREC *date, uint8_t *format); +/* +** =================================================================== +** Method : AddDateString (component GenericTimeDate) +** +** Description : +** Adds a formatted date string to a buffer +** Parameters : +** NAME - DESCRIPTION +** * buf - Pointer to zero terminated buffer where to +** append the string +** bufSize - Size of the buffer in bytes +** * date - Pointer to date information +** * format - Pointer to the format string. +** Supported formats: "dd.mm.yyyy" +** Returns : +** --- - Error code, ERR_OK for no error +** =================================================================== +*/ + +uint8_t McuTimeDate_AddTimeString(uint8_t *buf, size_t bufSize, TIMEREC *time, uint8_t *format); +/* +** =================================================================== +** Method : AddTimeString (component GenericTimeDate) +** +** Description : +** Adds a formatted time string to a buffer +** Parameters : +** NAME - DESCRIPTION +** * buf - Pointer to zero terminated buffer where to +** append the string +** bufSize - Size of the buffer in bytes +** * time - Pointer to time information +** * format - Pointer to the format string. +** Supported formats: "hh:mm.ss,cc" +** Returns : +** --- - Error code, ERR_OK for no error +** =================================================================== +*/ + +uint8_t McuTimeDate_SyncSWtimeToInternalRTCsec(void); +/* +** =================================================================== +** Method : SyncSWtimeToInternalRTCsec (component GenericTimeDate) +** +** Description : +** This method synchronizes the software RTC with the internal +** HW RTC. Because the internal RTC only counts seconds, we +** sync on a second change. +** Parameters : None +** Returns : +** --- - Error code +** =================================================================== +*/ + +/* END McuTimeDate. */ + +#endif +/* ifndef __McuTimeDate_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuTimeout.c b/TSM_PicoW_Sensor/McuLib/src/McuTimeout.c new file mode 100644 index 0000000..9c71bc6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuTimeout.c @@ -0,0 +1,283 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuTimeout.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : Timeout +** Version : Component 01.038, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-14, 06:24, # CodeGen: 679 +** Abstract : +** +The module implements timeout functionality. With this implementation, +it is possible to wait for a given time, and the time is counted by +a periodic interrupt. +** Settings : +** Component name : McuTimeout +** Maximum counters : 1 +** Counter tick period (ms) : 10 +** RTOS : Disabled +** Contents : +** GetCounter - McuTimeout_CounterHandle McuTimeout_GetCounter(McuTimeout_CounterType nofTicks); +** LeaveCounter - void McuTimeout_LeaveCounter(McuTimeout_CounterHandle handle); +** Value - McuTimeout_CounterType McuTimeout_Value(McuTimeout_CounterHandle handle); +** SetCounter - McuTimeout_CounterType McuTimeout_SetCounter(McuTimeout_CounterHandle handle,... +** CounterExpired - bool McuTimeout_CounterExpired(McuTimeout_CounterHandle handle); +** AddTick - void McuTimeout_AddTick(void); +** Init - void McuTimeout_Init(void); +** +** * Copyright (c) 2011-2020, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuTimeout.h +** @version 01.00 +** @brief +** +The module implements timeout functionality. With this implementation, +it is possible to wait for a given time, and the time is counted by +a periodic interrupt. +*/ +/*! +** @addtogroup McuTimeout_module McuTimeout module documentation +** @{ +*/ + +/* MODULE McuTimeout. */ + +#include "McuTimeout.h" + +#define McuTimeout_NOF_COUNTERS 1 /* number of timeout counters available */ + +static McuTimeout_CounterType McuTimeout_Counters[McuTimeout_NOF_COUNTERS]; /* array of timeout counters */ +static bool McuTimeout_FreeCounters[McuTimeout_NOF_COUNTERS]; /* array to indicate which counters are free */ + +/* +** =================================================================== +** Method : GetCounter (component Timeout) +** +** Description : +** Initializes a new timeout counter and returns the handle to +** it. At the end, use LeaveCounter() to free up the resource. +** Parameters : +** NAME - DESCRIPTION +** nofTicks - Number of ticks for the counter +** until it expires. +** Returns : +** --- - Handle to the counter, to be used for +** further API calls. +** =================================================================== +*/ +McuTimeout_CounterHandle McuTimeout_GetCounter(McuTimeout_CounterType nofTicks) +{ + McuTimeout_CounterHandle handle; + McuCriticalSection_CriticalVariable(); + + handle = 0; + if (nofTicks==0) { + nofTicks = 1; /* wait at least for one tick, otherwise will timeout immediately */ + } + McuCriticalSection_EnterCritical(); + while (handle0) { + McuTimeout_Counters[i]--; + } + } + McuCriticalSection_ExitCritical(); +} + +/* +** =================================================================== +** Method : Init (component Timeout) +** +** Description : +** Initialization of the driver +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuTimeout_Init(void) +{ + uint8_t i; + + for(i=0;i /* for NULL */ + #if McuLib_CONFIG_CPU_IS_ESP32 + #include "freertos/FreeRTOS.h" /* for vTaskDelay() */ + #include "freertos/task.h" + #else + #include "FreeRTOS.h" + #include "task.h" + #endif + +/*! + \brief Descriptor defining a trigger. Triggers are used set as 'reminders' for the future. +*/ +typedef struct TriggerDesc { + uint16_t triggerTime; /*!< trigger 'time' in ticks */ + void (*callback)(void); /*!< callback function */ +} TriggerDesc; + +static TriggerDesc TriggerList[2]; /*!< Array of triggers */ + +#ifndef TRUE + #define TRUE 1 +#endif +#ifndef FALSE + #define FALSE 0 +#endif +/* Internal method prototypes */ +static bool CheckCallbacks(void); + +/* +** =================================================================== +** Method : AddTrigger (component Trigger) +** +** Description : +** Adds a trigger +** Parameters : +** NAME - DESCRIPTION +** trigger - The trigger to be added +** incTicks - Trigger time, in trigger ticks. +** The time will is relative to the current +** tick time +** callback - Callback to be called when the +** trigger fires +** Returns : Nothing +** =================================================================== +*/ +void McuTrigger_AddTrigger(uint8_t trigger, uint16_t incTicks, void (*callback)(void)) +{ + McuCriticalSection_CriticalVariable(); + + /* method can be called from an interrupt service routine! */ + McuCriticalSection_EnterCritical(); + TriggerList[trigger].triggerTime = incTicks; + TriggerList[trigger].callback = callback; + McuCriticalSection_ExitCritical(); +} + +/* +** =================================================================== +** Method : CheckCallbacks (component Trigger) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +static bool CheckCallbacks(void) +{ + /* This method is called from McuTrigger_AddTick() which is called from a timer interrupt! */ + uint8_t i; /* counter through all triggers */ + void (*callback)(void); /* variable to temporarily store the callback pointer */ + bool calledCallBack = FALSE; /* flag to indicate if the callback has been called */ + McuCriticalSection_CriticalVariable(); + + for(i=0;i /* for memcpy() */ +#if McuLib_CONFIG_CPU_IS_KINETIS + #include "fsl_port.h" +#endif +#if MCUULN2003_CONFIG_USE_FREERTOS_HEAP + #include "McuRTOS.h" +#else + #include /* for malloc()/free() */ +#endif + +#if McuULN2003_CONFIG_USE_ACCELERATION +static const uint8_t default_accel_delays[] = {2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 8, 8, 10, 10, 10}; +static const McuULN2003_Accel_t McuULN2003_DefaultAccelTable = +{ /* list of delay values: the larger the value, the more delays between the step sequences. */ + .nofEntries = sizeof(default_accel_delays), + .delays = default_accel_delays, +}; +#endif + +typedef struct McuULN2003_Motor_t { + int32_t pos; /* actual stepper motor position counter */ + McuULN2003_StepMode stepMode; /* full or half stepping mode */ + bool inverted; /* if motor direction is inverted */ + uint8_t tablePos; /* current pos in the stepper logic table */ + uint32_t id; /* optional ID */ + bool noGPIO; /* if no GPIO handles shall be allocated */ +#if McuULN2003_CONFIG_USE_ACCELERATION + struct { + const McuULN2003_Accel_t *table; + uint8_t accelIdx; /* current index into acceleration delay table, starting from the end of the table to index zero */ + uint8_t subAccelCnt; /* sub-position acceleration counter, used to count down the delay */ + } accel; +#endif + void (*stepCallback)(McuULN2003_Handle_t motor, const bool w[McuULN2003_NOF_MOTOR_GPIO_PINS]); + McuGPIO_Handle_t pin[McuULN2003_NOF_MOTOR_GPIO_PINS]; /* the 4 winding of the motor */ +} McuULN2003_Motor_t; + +#define McuULN2003_DELAY_HALF_STEP_MODE() McuWait_WaitOSms(2) +#define McuULN2003_DELAY_FULL_STEP_MODE() McuWait_WaitOSms(4) + +typedef bool McuULN2003_PinStatus[McuULN2003_NOF_MOTOR_GPIO_PINS]; + +static const bool disableTable[McuULN2003_NOF_MOTOR_GPIO_PINS] = {false, false, false, false}; + +/* half stepping mode with 8 steps + * For the wire colors and stepper table, see https://leap.tardate.com/kinetics/steppermotors/28byj48/ + */ +const bool McuULN2003_stepTableHalfStepsFw[McuULN2003_NOF_STEPS_HALF_STEP_MODE][McuULN2003_NOF_MOTOR_GPIO_PINS] = { + /* blue pink yellow orange */ + {true, true, false, false}, + {false, true, false, false}, + {false, true, true, false}, + {false, false, true, false}, + {false, false, true, true }, + {false, false, false, true }, + {true, false, false, true }, + {true, false, false, false}, +}; + +const bool McuULN2003_stepTableHalfStepsBw[McuULN2003_NOF_STEPS_HALF_STEP_MODE][McuULN2003_NOF_MOTOR_GPIO_PINS] = { + /* blue pink yellow orange */ + {true, false, false, false}, + {true, false, false, true }, + {false, false, false, true }, + {false, false, true, true }, + {false, false, true, false}, + {false, true, true, false}, + {false, true, false, false}, + {true, true, false, false}, +}; + +/* full stepping mode with 4 steps */ +const bool McuULN2003_stepTableFullStepsFw[McuULN2003_NOF_STEPS_FULL_STEP_MODE][McuULN2003_NOF_MOTOR_GPIO_PINS] = { + /* blue pink yellow orange */ + /* https://leap.tardate.com/kinetics/steppermotors/28byj48/ */ + {true, true, false, false}, + {false, true, true, false}, + {false, false, true, true}, + {true, false, false, true }, +}; + +const bool McuULN2003_stepTableFullStepsBw[McuULN2003_NOF_STEPS_FULL_STEP_MODE][McuULN2003_NOF_MOTOR_GPIO_PINS] = { + /* blue pink yellow orange */ + {true, false, false, true }, + {false, false, true, true }, + {false, true, true, false}, + {true, true, false, false}, +}; + +/* default configuration, used for initializing the config */ +static const McuULN2003_Config_t defaultConfig = +{ + .stepMode = McuULN2003_STEP_MODE_HALF, + .inverted = false, + .id = 0, + .stepCallback = NULL, + .noGPIO = false, + .hw[0] = { + #if McuLib_CONFIG_NXP_SDK_USED && !McuLib_CONFIG_IS_KINETIS_KE + .gpio = NULL, + #elif McuLib_CONFIG_CPU_IS_STM32 + .gpio = NULL, + #endif + #if McuLib_CONFIG_CPU_IS_KINETIS + .port = NULL, + #elif McuLib_CONFIG_CPU_IS_LPC + .port = 0, + #endif + .pin = 0, + }, + .hw[1] = { + #if McuLib_CONFIG_NXP_SDK_USED && !McuLib_CONFIG_IS_KINETIS_KE + .gpio = NULL, + #elif McuLib_CONFIG_CPU_IS_STM32 + .gpio = NULL, + #endif + #if McuLib_CONFIG_CPU_IS_KINETIS + .port = NULL, + #elif McuLib_CONFIG_CPU_IS_LPC + .port = 0, + #endif + .pin = 0, + }, + .hw[2] = { + #if McuLib_CONFIG_NXP_SDK_USED && !McuLib_CONFIG_IS_KINETIS_KE + .gpio = NULL, + #elif McuLib_CONFIG_CPU_IS_STM32 + .gpio = NULL, + #endif + #if McuLib_CONFIG_CPU_IS_KINETIS + .port = NULL, + #elif McuLib_CONFIG_CPU_IS_LPC + .port = 0, + #endif + .pin = 0, + }, + .hw[3] = { + #if McuLib_CONFIG_NXP_SDK_USED && !McuLib_CONFIG_IS_KINETIS_KE + .gpio = NULL, + #elif McuLib_CONFIG_CPU_IS_STM32 + .gpio = NULL, + #endif + #if McuLib_CONFIG_CPU_IS_KINETIS + .port = NULL, + #elif McuLib_CONFIG_CPU_IS_LPC + .port = 0, + #endif + .pin = 0, + } +}; + +void McuULN2003_GetDefaultConfig(McuULN2003_Config_t *config) { + assert(config!=NULL); + memcpy(config, &defaultConfig, sizeof(*config)); +} + +uint32_t McuULN2003_GetID(McuULN2003_Handle_t motor) { + return ((McuULN2003_Motor_t *)motor)->id; +} + +#if McuULN2003_CONFIG_USE_ACCELERATION +void McuULN2003_SetAccelerationTable(McuULN2003_Handle_t motor, const McuULN2003_Accel_t *table) { + McuULN2003_Motor_t *handle; + + handle = (McuULN2003_Motor_t*)motor; + handle->accel.table = table; + handle->accel.accelIdx = 0; + handle->accel.subAccelCnt = 0; +} +#endif + +static void SetStep(McuULN2003_Handle_t motor, const bool w[McuULN2003_NOF_MOTOR_GPIO_PINS]) { + for(int i=0; ipin[i], w[i]); /* change GPIO pins */ + } +} + +McuULN2003_Handle_t McuULN2003_InitMotor(McuULN2003_Config_t *config) { + McuGPIO_Config_t gpio_config; /* config for the SDK */ + McuULN2003_Motor_t *handle; + + assert(config!=NULL); +#if MCUULN2003_CONFIG_USE_FREERTOS_HEAP + handle = (McuULN2003_Motor_t*)pvPortMalloc(sizeof(McuULN2003_Motor_t)); /* get a new device descriptor */ +#else + handle = (McuULN2003_Motor_t*)malloc(sizeof(McuULN2003_Motor_t)); /* get a new device descriptor */ +#endif + assert(handle!=NULL); + if (handle!=NULL) { /* if malloc failed, will return NULL pointer */ + memset(handle, 0, sizeof(McuULN2003_Motor_t)); /* init all fields */ +#if McuULN2003_CONFIG_USE_ACCELERATION + McuULN2003_SetAccelerationTable((McuULN2003_Handle_t*)handle, &McuULN2003_DefaultAccelTable); +#endif + handle->id = config->id; + handle->pos = 0; + handle->stepMode = config->stepMode; + handle->inverted = config->inverted; + handle->tablePos = 0; + handle->noGPIO = config->noGPIO; + handle->stepCallback = config->stepCallback; + if (handle->stepCallback==NULL) { + handle->stepCallback = SetStep; /* assign default GPIO callback */ + } + if (!config->noGPIO) { + McuGPIO_GetDefaultConfig(&gpio_config); + for(int i=0; ihw[i], sizeof(gpio_config.hw)); /* copy hardware info */ + gpio_config.isHighOnInit = false; + handle->pin[i] = McuGPIO_InitGPIO(&gpio_config); /* create gpio handle */ + } + } + } + return handle; +} + +McuULN2003_Handle_t McuULN2003_DeinitMotor(McuULN2003_Handle_t motor) { + McuULN2003_Motor_t *m = (McuULN2003_Motor_t*)motor; + assert(m!=NULL); + + for(int i=0; ipin[i]); + } +#if MCUULN2003_CONFIG_USE_FREERTOS_HEAP + vPortFree(m); +#else + free(m); +#endif + return NULL; +} + +void McuULN2003_SetStepMode(McuULN2003_Handle_t motor, McuULN2003_StepMode mode) { + ((McuULN2003_Motor_t*)motor)->stepMode = mode; +} + +McuULN2003_StepMode McuULN2003_GetStepMode(McuULN2003_Handle_t motor) { + return ((McuULN2003_Motor_t*)motor)->stepMode; +} + +void McuULN2003_PowerOff(McuULN2003_Handle_t motor) { + McuULN2003_Motor_t *m = (McuULN2003_Motor_t*)motor; + + m->stepCallback(motor, disableTable); + m->tablePos = 0; +} + +static void McuULN2003_TableMakeStep(McuULN2003_Handle_t motor, bool forward) { + McuULN2003_Motor_t *m = (McuULN2003_Motor_t*)motor; + const McuULN2003_PinStatus *table; + size_t maxTableIndex; + + if (m->stepMode==McuULN2003_STEP_MODE_HALF) { + if ((forward && !m->inverted) || (!forward && m->inverted)) { + table = McuULN2003_stepTableHalfStepsFw; + } else { + table = McuULN2003_stepTableHalfStepsBw; + } + maxTableIndex = McuULN2003_NOF_STEPS_HALF_STEP_MODE; + } else { /* McuULN2003_STEP_MODE_FULL */ + if ((forward && !m->inverted) || (!forward && m->inverted)) { + table = McuULN2003_stepTableFullStepsFw; + } else { + table = McuULN2003_stepTableFullStepsBw; + } + maxTableIndex = McuULN2003_NOF_STEPS_FULL_STEP_MODE; + } + m->stepCallback(m, table[m->tablePos]); + m->tablePos++; + if (m->tablePos>=maxTableIndex) { /* full sequence reached */ + m->tablePos = 0; + if (forward) { + m->pos++; + } else { + m->pos--; + } + } +} + +bool McuULN2003_StepCallback(McuULN2003_Handle_t motor, bool forward) { + McuULN2003_Motor_t *m = (McuULN2003_Motor_t*)motor; + +#if McuULN2003_CONFIG_USE_ACCELERATION + if (m->accel.accelIdx>0) { /* only do it if not during acceleration */ + if (m->accel.subAccelCnt>0) { /* sub-delay still going on? */ + m->accel.subAccelCnt--; /* delay */ + return false; /* not reached end of delay sequence */ + } else { /* subAccelCnt reached zero: get to next table index value */ + m->accel.accelIdx--; + m->accel.subAccelCnt = m->accel.table->delays[m->accel.accelIdx]; + } + } +#endif + if (forward) { + McuULN2003_TableMakeStep(motor, true); /* forward */ + } else { + McuULN2003_TableMakeStep(motor, false); /* backward */ + } + return m->tablePos==0; /* reached position */ +} + +#if McuULN2003_CONFIG_USE_ACCELERATION +void McuULN2003_AccelerationStart(McuULN2003_Handle_t motor) { + McuULN2003_Motor_t *m = (McuULN2003_Motor_t*)motor; + m->accel.accelIdx = m->accel.table->nofEntries-1; + m->accel.subAccelCnt = m->accel.table->delays[m->accel.table->nofEntries-1]; +} +#endif + +#if McuULN2003_CONFIG_USE_ACCELERATION +void McuULN2003_AccelerationEnd(McuULN2003_Handle_t motor) { + McuULN2003_Motor_t *m = (McuULN2003_Motor_t*)motor; + m->accel.accelIdx = 0; + m->accel.subAccelCnt = 0; +} +#endif + +bool McuULN2003_MoveCallback(McuULN2003_Handle_t motor, int32_t targetPos) { + McuULN2003_Motor_t *m = (McuULN2003_Motor_t*)motor; + + if (m->pos < targetPos) { + McuULN2003_TableMakeStep(motor, true); /* forward */ + return false; + } else if (m->pos > targetPos) { + McuULN2003_TableMakeStep(motor, false); /* backward */ + return false; + } + McuULN2003_PowerOff(motor); + return true; /* reached position */ +} + +void McuULN2003_IncStep(McuULN2003_Handle_t motor) { + McuULN2003_Motor_t *m = (McuULN2003_Motor_t*)motor; + int32_t pos = m->pos+1; + + do { + McuULN2003_TableMakeStep(motor, true); + if (m->stepMode==McuULN2003_STEP_MODE_HALF) { + McuULN2003_DELAY_HALF_STEP_MODE(); + } else { /* McuULN2003_STEP_MODE_FULL */ + McuULN2003_DELAY_FULL_STEP_MODE(); + } + } while(m->pos!=pos); +} + +void McuULN2003_DecStep(McuULN2003_Handle_t motor) { + McuULN2003_Motor_t *m = (McuULN2003_Motor_t*)motor; + int32_t pos = m->pos-1; + + do { + McuULN2003_TableMakeStep(motor, false); + if (m->stepMode==McuULN2003_STEP_MODE_HALF) { + McuULN2003_DELAY_HALF_STEP_MODE(); + } else { /* McuULN2003_STEP_MODE_FULL */ + McuULN2003_DELAY_FULL_STEP_MODE(); + } + } while(m->pos!=pos); +} + +void McuULN2003_SetPos(McuULN2003_Handle_t motor, int32_t pos) { + McuULN2003_Motor_t *m = (McuULN2003_Motor_t*)motor; + m->pos = pos; +} + +int32_t McuULN2003_GetPos(McuULN2003_Handle_t motor) { + return ((McuULN2003_Motor_t*)motor)->pos; +} + +void McuULN2003_Step(McuULN2003_Handle_t motor, int32_t steps) { + if (steps>0) { + while(steps>0) { + McuULN2003_IncStep(motor); + steps--; + } + } else { + while(steps<0) { + McuULN2003_DecStep(motor); + steps++; + } + } +} + +void McuULN2003_Deinit(void) { + /* nothing needed */ +} + +void McuULN2003_Init(void) { + /* nothing needed */ +} diff --git a/TSM_PicoW_Sensor/McuLib/src/McuULN2003.h b/TSM_PicoW_Sensor/McuLib/src/McuULN2003.h new file mode 100644 index 0000000..bfc96f1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuULN2003.h @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2019, Erich Styger + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MCUULN2003_H_ +#define MCUULN2003_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "McuULN2003config.h" +#include "McuGPIO.h" + +#define McuLUN2003_28BYJ_48_ 4076 /* 64:1 gear (actually more 63.68395:1 (4076 steps/ref), Adafruit has a 1/16 reduction (513 steps/rev) */ + +typedef enum { + McuULN2003_STEP_MODE_FULL = 1, + McuULN2003_STEP_MODE_HALF = 2, +} McuULN2003_StepMode; + +typedef void *McuULN2003_Handle_t; + +#define McuULN2003_NOF_MOTOR_GPIO_PINS (4) /* number of GPIO pins for a motor */ +#define McuULN2003_NOF_MOTOR_BITS (McuULN2003_NOF_MOTOR_GPIO_PINS) /* number of bits needed if using a shift register */ + +#define McuULN2003_NOF_STEPS_HALF_STEP_MODE (8) +#define McuULN2003_NOF_STEPS_FULL_STEP_MODE (4) + +/* half step logic tables: */ +extern const bool McuULN2003_stepTableHalfStepsFw[McuULN2003_NOF_STEPS_HALF_STEP_MODE][McuULN2003_NOF_MOTOR_GPIO_PINS]; +extern const bool McuULN2003_stepTableHalfStepsBw[McuULN2003_NOF_STEPS_HALF_STEP_MODE][McuULN2003_NOF_MOTOR_GPIO_PINS]; + +/* full step logic tables: */ +extern const bool McuULN2003_stepTableFullStepsFw[McuULN2003_NOF_STEPS_FULL_STEP_MODE][McuULN2003_NOF_MOTOR_GPIO_PINS]; +extern const bool McuULN2003_stepTableFullStepsBw[McuULN2003_NOF_STEPS_FULL_STEP_MODE][McuULN2003_NOF_MOTOR_GPIO_PINS]; + +typedef struct { + McuULN2003_StepMode stepMode; /* half or full steps, default McuULN2003_STEP_MODE_HALF */ + bool inverted; /* if direction is inverted, default false */ + bool isShiftReg; /* if using a shift register, default false */ + uint32_t id; /* optional ID or index, default 0 */ + bool noGPIO; /* if not using gpio, then no hardware gets allocated, useful for custom HW (e.g. shift register), default false */ + void (*stepCallback)(McuULN2003_Handle_t motor, const bool w[McuULN2003_NOF_MOTOR_GPIO_PINS]); /* optional custom call back to set motor signals. If NULL, it uses the internal GPIO HW one. Default: NULL */ + McuGPIO_HwPin_t hw[McuULN2003_NOF_MOTOR_GPIO_PINS]; /* hardware GPIO pins, default NULL */ +} McuULN2003_Config_t; + +void McuULN2003_GetDefaultConfig(McuULN2003_Config_t *config); +McuULN2003_Handle_t McuULN2003_InitMotor(McuULN2003_Config_t *config); +McuULN2003_Handle_t McuULN2003_DeinitMotor(McuULN2003_Handle_t motor); + +void McuULN2003_PowerOff(McuULN2003_Handle_t motor); + +void McuULN2003_SetStepMode(McuULN2003_Handle_t motor, McuULN2003_StepMode mode); +McuULN2003_StepMode McuULN2003_GetStepMode(McuULN2003_Handle_t motor); + +bool McuULN2003_StepCallback(McuULN2003_Handle_t motor, bool forward); +bool McuULN2003_MoveCallback(McuULN2003_Handle_t motor, int32_t targetPos); + +void McuULN2003_IncStep(McuULN2003_Handle_t motor); +void McuULN2003_DecStep(McuULN2003_Handle_t motor); +void McuULN2003_Step(McuULN2003_Handle_t motor, int32_t steps); + +int32_t McuULN2003_GetPos(McuULN2003_Handle_t motor); +void McuULN2003_SetPos(McuULN2003_Handle_t motor, int32_t pos); + +/*! + * \brief returns the ID of the motor. + * \param motor Motor handle + * \return ID of the motor which has been set at creation time + */ +uint32_t McuULN2003_GetID(McuULN2003_Handle_t motor); + +#if McuULN2003_CONFIG_USE_ACCELERATION + +/* stepper motor acceleration table */ +typedef struct McuULN2003_Accel_t { + uint8_t nofEntries; /* number of entries in delay table */ + const uint8_t *delays; /* table of delays, with nofEntires entries */ +} McuULN2003_Accel_t; + +void McuULN2003_AccelerationStart(McuULN2003_Handle_t motor); +void McuULN2003_AccelerationEnd(McuULN2003_Handle_t motor); +void McuULN2003_SetAccelerationTable(McuULN2003_Handle_t motor, const McuULN2003_Accel_t *table); +#endif + +void McuULN2003_Deinit(void); +void McuULN2003_Init(void); + +#ifdef __cplusplus +} +#endif + +#endif /* MCUULN2003_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuUart485.c b/TSM_PicoW_Sensor/McuLib/src/McuUart485.c new file mode 100644 index 0000000..32ff8f6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuUart485.c @@ -0,0 +1,679 @@ +/* + * Copyright (c) 2020-2023, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuUart485.h" +#if McuUart485_CONFIG_USE_RS_485 +#include "McuShell.h" +#include "McuRTOS.h" +#include "McuUtility.h" +#include "McuLog.h" +#include "McuGPIO.h" +#include /* for isprint() */ + +#if McuLib_CONFIG_CPU_IS_ESP32 + #include "esp_system.h" + #include "driver/uart.h" +#endif + +#if !McuUart485_CONFIG_USE_HW_OE_RTS + +static McuGPIO_Handle_t RS485_TxEn; /* LOW: Rx, HIGH: Tx */ + +void McuUart485_GPIO_RxEnable(void) { + McuGPIO_SetLow(RS485_TxEn); +#if McuLib_CONFIG_CPU_IS_RPxxxx + uart_get_hw(McuUart485_CONFIG_UART_DEVICE)->cr |= UART_UARTCR_RXE_BITS; /* enable receiver for half duplex communication */ +#endif +} + +void McuUart485_GPIO_TxEnable(void) { +#if McuLib_CONFIG_CPU_IS_RPxxxx + uart_get_hw(McuUart485_CONFIG_UART_DEVICE)->cr &= ~UART_UARTCR_RXE_BITS; /* disable receiver for half duplex communication */ +#endif + McuGPIO_SetHigh(RS485_TxEn); +} + +static void McuUart485_GPIO_Deinit(void) { + RS485_TxEn = McuGPIO_DeinitGPIO(RS485_TxEn); +} + +static void McuUart485_GPIO_Init(void) { + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); +#if McuLib_CONFIG_CPU_IS_ESP32 + config.hw.pin = McuUart485_CONFIG_TX_EN_GPIO; +#elif McuLib_CONFIG_CPU_IS_RPxxxx + config.hw.pin = McuUart485_CONFIG_TX_EN_PIN; +#else + config.hw.gpio = McuUart485_CONFIG_TX_EN_GPIO; + config.hw.port = McuUart485_CONFIG_TX_EN_PORT; + config.hw.pin = McuUart485_CONFIG_TX_EN_PIN; +#endif + config.isInput = false; + config.isHighOnInit = false; /* Tx disabled */ + RS485_TxEn = McuGPIO_InitGPIO(&config); + + McuUart485_GPIO_RxEnable(); +} +#endif /* McuUart485_CONFIG_USE_HW_OE_RTS */ +/* -------------------------------------------------------------------------------------- */ +static QueueHandle_t RS485UartRxQueue; /* queue of the received bytes */ +#if !McuUart485_CONFIG_USE_MODBUS /* shell response queue only used in non-Modbus mode */ + static QueueHandle_t RS485UartResponseQueue; /* queue for the OK or NOK response */ +#endif +#if McuUart485_CONFIG_USE_LOGGER + static bool McuUart485_doLogging = false; /* if logging is turned on or off */ +#endif + +void McuUart485_ClearRxQueue(void) { + xQueueReset(RS485UartRxQueue); +} + +#if !McuUart485_CONFIG_USE_MODBUS +void McuUart485_ClearResponseQueue(void) { + xQueueReset(RS485UartResponseQueue); +} +#endif + +uint8_t McuUart485_GetRxQueueByte(unsigned char *data, TickType_t ticksToWait) { + if (xQueueReceive(RS485UartRxQueue, data, ticksToWait)==pdPASS ) { + return ERR_OK; + } else { + return ERR_FAILED; + } +} + +uint8_t McuUart485_GetRxQueueChar(void) { + uint8_t ch; + + if (xQueueReceive(RS485UartRxQueue, &ch, 0)==pdPASS ) { + /* return received character */ + } else { + ch = '\0'; /* nothing received */ + } + return ch; +} + +#if !McuUart485_CONFIG_USE_MODBUS +uint8_t McuUart485_GetResponseQueueChar(void) { + uint8_t ch; + + if (xQueueReceive(RS485UartResponseQueue, &ch, 0)==pdPASS ) { + /* return received character */ + } else { + ch = '\0'; /* nothing received */ + } + return ch; +} +#endif +/* -------------------------------------------------------------------------------------- */ + +#if McuLib_CONFIG_CPU_IS_ESP32 + +#define RS485_ESP_BUF_SIZE (4*1024) /* buffer for the UART task. The UART driver uses twice of this */ + +#if 0 /* not used */ +void RS485_SendStr(char *str) { + size_t len = strlen(str); + + uart_write_bytes(McuUart485_CONFIG_UART_DEVICE, str, len); +} + +void RS485_SendChar(char ch) { + uart_write_bytes(McuUart485_CONFIG_UART_DEVICE, &ch, 1); +} +#endif + +/* On the ESP32 we are using a task. On other architectures this would be handled by an interrupt */ +static void rs485uart_task(void *arg) { + static unsigned char data[RS485_ESP_BUF_SIZE]; /* Rx buffer for UART */ + unsigned char prevChar = '\n'; + bool responseLine = false; + BaseType_t res; + + McuLog_trace("UART start receive loop.\r\n"); + for(;;) { + /* Read data from UART */ + int len = uart_read_bytes(McuUart485_CONFIG_UART_DEVICE, data, sizeof(data)-1, pdMS_TO_TICKS(100)); + #if 0 /* for debugging only */ + if (len>0) { + data[len] = '\0'; + McuLog_trace("rx: %d", len); + } + #endif + /* send to Rx Queue */ + for(int i=0; iRCFIFO; +#else + count = 1; +#endif + while(count!=0) { + data = McuUart485_CONFIG_UART_READ_BYTE(McuUart485_CONFIG_UART_DEVICE); + #if !McuUart485_CONFIG_USE_MODBUS + if (data!=0) { /* data==0 could happen especially after power-up, ignore it if we are in shell/non-Modbus mode */ + #endif + #if !McuUart485_CONFIG_USE_MODBUS + /* only store into RS485UartResponseQueue if we have a line starting with '@' */ + if (prevChar=='\n' && data=='@') { + responseLine = true; + } + if (responseLine) { + (void)xQueueSendFromISR(RS485UartResponseQueue, &data, &xHigherPriorityTaskWoken1); + } + prevChar = data; + if (responseLine && data=='\n') { /* end of line while on response line */ + responseLine = false; + } + #endif + (void)xQueueSendFromISR(RS485UartRxQueue, &data, &xHigherPriorityTaskWoken2); + #if McuUart485_CONFIG_USE_LOGGER + if (McuUart485_doLogging) { + extern uint8_t McuRTT_SendChar(uint8_t ch); + unsigned char buf[3]; + buf[0] = '\0'; + McuUtility_strcatNum8Hex(buf, sizeof(buf), data); + (void)McuUart485_CONFIG_LOGGER_CALLBACK_NAME(buf[0]); + (void)McuUart485_CONFIG_LOGGER_CALLBACK_NAME(buf[1]); + if (isprint(data)) { + (void)McuUart485_CONFIG_LOGGER_CALLBACK_NAME((unsigned char)' '); + (void)McuUart485_CONFIG_LOGGER_CALLBACK_NAME(data); + } + (void)McuUart485_CONFIG_LOGGER_CALLBACK_NAME((unsigned char)'\n'); + } + #endif + #if !McuUart485_CONFIG_USE_MODBUS + } /* if data != 0 */ + #endif + count--; + } /* while count != 0 */ + } +#if McuLib_CONFIG_CPU_IS_KINETIS + flags |= kUART_RxOverrunFlag|kUART_RxFifoOverflowFlag; /* always clear these flags, as they might been set? Not clearing them will not generate future interrupts */ +#endif +#if McuLib_CONFIG_CPU_IS_KINETIS || McuLib_CONFIG_CPU_IS_LPC /* no clearing needed for RPxxxx */ + McuUart485_CONFIG_CLEAR_STATUS_FLAGS(McuUart485_CONFIG_UART_DEVICE, flags); +#endif + if (xHigherPriorityTaskWoken1 != pdFALSE || xHigherPriorityTaskWoken2 != pdFALSE) { + vPortYieldFromISR(); + } + #if McuLib_CONFIG_CORTEX_M==4 + __DSB(); /* ARM Cortex-M4 errata Notice 838869: dsb required because "Store immediate overlapping exception return operation might vector to incorrect interrupt" */ + #endif +} +#endif + +static void InitUart(void) { +#if !McuUart485_CONFIG_USE_HW_OE_RTS + McuUart485_GPIO_Init(); +#endif +#if McuLib_CONFIG_CPU_IS_KINETIS || McuLib_CONFIG_CPU_IS_LPC + /* NOTE: Muxing of the UART pins needs to be done in the Pins tool! */ + McuUart485_CONFIG_UART_CONFIG_STRUCT config; + status_t res; + + McuUart485_CONFIG_UART_SET_UART_CLOCK(); + McuUart485_CONFIG_UART_GET_DEFAULT_CONFIG(&config); + config.baudRate_Bps = McuUart485_CONFIG_UART_BAUDRATE; + config.parityMode = McuUart485_CONFIG_UART_PARITY; + config.enableRx = true; + config.enableTx = true; +#if McuLib_CONFIG_CPU_IS_KINETIS + config.enableRxRTS = true; /* using RTS pin to control the transceiver */ + config.enableTxCTS = false; +#endif + /* Initialize the USART with configuration. */ + res = McuUart485_CONFIG_UART_INIT(McuUart485_CONFIG_UART_DEVICE, &config, CLOCK_GetFreq(McuUart485_CONFIG_UART_GET_CLOCK_FREQ_SELECT)); + if (res!=kStatus_Success) { + McuLog_fatal("failed initializing UART"); + for(;;) {} + } + #if McuUart485_CONFIG_USE_HW_OE_RTS + #if McuLib_CONFIG_CPU_IS_KINETIS /* Kinetis K22FN512 */ + McuUart485_CONFIG_UART_DEVICE->MODEM |= UART_MODEM_TXRTSPOL(1); /* TXRTSPOL: 1: transmitter RTS polarity is active high */ + McuUart485_CONFIG_UART_DEVICE->MODEM |= UART_MODEM_TXRTSE(1); /* TXRTSE: Transmitter request-to-send enable, 1: RTS asserted before start bit is transmitted and deasserted after stop bit */ + #elif McuLib_CONFIG_CPU_IS_LPC /* LPC845 or LPC55S69 */ + McuUart485_CONFIG_UART_DEVICE->CFG |= USART_CFG_OESEL(1); /* if enabled, use RTS signal for RS-485 transceiver */ + McuUart485_CONFIG_UART_DEVICE->CFG |= USART_CFG_OEPOL(1); /* 1: the output enable signal is high active */ + McuUart485_CONFIG_UART_DEVICE->CFG |= USART_CFG_OETA(1); /* output enable turnaround time: if set, the output enable signal remains asserted for 1 char time after the end of the last bit */ + #endif +#endif +#if McuUart485_CONFIG_HAS_FIFO + UART_EnableRxFIFO(McuUart485_CONFIG_UART_DEVICE, true); /* enable UART Rx FIFO */ +#endif + McuUart485_CONFIG_UART_ENABLE_INTERRUPTS(McuUart485_CONFIG_UART_DEVICE, + McuUart485_CONFIG_UART_ENABLE_INTERRUPT_FLAGS + ); + NVIC_SetPriority(McuUart485_CONFIG_UART_IRQ_NUMBER, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY); /* required as we are using FreeRTOS API calls */ + EnableIRQ(McuUart485_CONFIG_UART_IRQ_NUMBER); +#elif McuLib_CONFIG_CPU_IS_ESP32 + // Timeout threshold for UART = number of symbols (~10 tics) with unchanged state on receive pin + #define UART_CONFIG_READ_TOUT (3) // 3.5T * 8 = 28 ticks, TOUT=3 -> ~24..33 ticks + + uart_config_t uart_config = { + .baud_rate = McuUart485_CONFIG_UART_BAUDRATE, + .data_bits = UART_DATA_8_BITS, + .parity = UART_PARITY_DISABLE, + .stop_bits = UART_STOP_BITS_1, + .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, /* UART_HW_FLOWCTRL_CTS */ /*UART_HW_FLOWCTRL_RTS,*/ /* UART_HW_FLOWCTRL_CTS_RTS, */ + .rx_flow_ctrl_thresh = 122, + .source_clk = UART_SCLK_APB, + }; + + McuLog_trace("UART set pins, mode and install driver."); + + /* Install UART driver (we don't need an event queue here) */ + ESP_ERROR_CHECK(uart_driver_install( + McuUart485_CONFIG_UART_DEVICE, /* usart device */ + RS485_ESP_BUF_SIZE*2, /* RX Buffer */ + RS485_ESP_BUF_SIZE*2, /* TX Buffer */ + 0, /* event queue size */ + NULL, /* event queue handle */ + 0 /* interrupt alloc flags */ + ) + ); + + /* Configure UART parameters */ + ESP_ERROR_CHECK(uart_param_config(McuUart485_CONFIG_UART_DEVICE, &uart_config)); + + /* RE (Receiver Enable, IO23) shall be HIGH during Tx, RE (Low Active, IO26) shall be LOW during Tx */ + ESP_ERROR_CHECK(uart_set_pin(McuUart485_CONFIG_UART_DEVICE, + McuUart485_CONFIG_TXD_PIN, /* TX pin */ + McuUart485_CONFIG_RXD_PIN, /* RX pin */ + McuUart485_CONFIG_RTS_PIN, /* RTS pin */ + UART_PIN_NO_CHANGE /* CTS pin */ + )); + + /* Set RS485 half duplex mode */ + ESP_ERROR_CHECK(uart_set_mode(McuUart485_CONFIG_UART_DEVICE, UART_MODE_RS485_HALF_DUPLEX)); + + // Set read timeout of UART TOUT feature + ESP_ERROR_CHECK(uart_set_rx_timeout(McuUart485_CONFIG_UART_DEVICE, UART_CONFIG_READ_TOUT)); +#elif McuLib_CONFIG_CPU_IS_RPxxxx + uart_init(McuUart485_CONFIG_UART_DEVICE, McuUart485_CONFIG_UART_BAUDRATE); + gpio_set_function(McuUart485_CONFIG_TXD_PIN, GPIO_FUNC_UART); + gpio_set_function(McuUart485_CONFIG_RXD_PIN, GPIO_FUNC_UART); + uart_set_fifo_enabled(McuUart485_CONFIG_UART_DEVICE, false); + uart_set_format(McuUart485_CONFIG_UART_DEVICE, 8, 1, McuUart485_CONFIG_UART_PARITY); + uart_set_hw_flow(McuUart485_CONFIG_UART_DEVICE, false, false); /* disable flow control, cannot use CTS/RTS */ + uart_set_translate_crlf(McuUart485_CONFIG_UART_DEVICE, false); /* do not translate */ + /* setup interrupt */ + int UART_IRQ = McuUart485_CONFIG_UART_DEVICE == uart0 ? UART0_IRQ : UART1_IRQ; /* find out which UART is used */ + irq_set_exclusive_handler(UART_IRQ, McuUart485_CONFIG_UART_IRQ_HANDLER /* on_uart_rx*/); /* setup IRQ handler */ + irq_set_enabled(UART_IRQ, true); /* enable interrupt */ + irq_set_priority(UART_IRQ, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY); /* required as we are using FreeRTOS API calls */ + uart_set_irq_enables(McuUart485_CONFIG_UART_DEVICE, true, false); /* enable UART interrupt output, Rx only */ +#else + #error "need to initialize UART!" +#endif +} + +#if McuLib_CONFIG_CPU_IS_KINETIS || McuLib_CONFIG_CPU_IS_LPC +static void DecodeUARTFlags(uint32_t flags, const McuShell_StdIOType *io) { +#if McuLib_CONFIG_CPU_IS_KINETIS + if (flags&kUART_TxDataRegEmptyFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUART_TxDataRegEmptyFlag\r\n", io->stdOut); + } + if (flags&kUART_TransmissionCompleteFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUART_TransmissionCompleteFlag\r\n", io->stdOut); + } + if (flags&kUART_RxDataRegFullFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUART_RxDataRegFullFlag\r\n", io->stdOut); + } + if (flags&kUART_IdleLineFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUART_IdleLineFlag\r\n", io->stdOut); + } + if (flags&kUART_RxOverrunFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUART_RxOverrunFlag\r\n", io->stdOut); + } + if (flags&kUART_NoiseErrorFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUART_NoiseErrorFlag\r\n", io->stdOut); + } + if (flags&kUART_FramingErrorFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUART_FramingErrorFlag\r\n", io->stdOut); + } + if (flags&kUART_ParityErrorFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUART_ParityErrorFlag\r\n", io->stdOut); + } +#if defined(FSL_FEATURE_UART_HAS_LIN_BREAK_DETECT) && FSL_FEATURE_UART_HAS_LIN_BREAK_DETECT + if (flags&kUART_LinBreakFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUART_LinBreakFlag\r\n", io->stdOut); + } +#endif + if (flags&kUART_RxActiveEdgeFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUART_RxActiveEdgeFlag\r\n", io->stdOut); + } + if (flags&kUART_RxActiveFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUART_RxActiveFlag\r\n", io->stdOut); + } +#if defined(FSL_FEATURE_UART_HAS_EXTENDED_DATA_REGISTER_FLAGS) && FSL_FEATURE_UART_HAS_EXTENDED_DATA_REGISTER_FLAGS + if (flags&kUART_NoiseErrorInRxDataRegFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUART_NoiseErrorInRxDataRegFlag\r\n", io->stdOut); + } + if (flags&kUART_ParityErrorInRxDataRegFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUART_ParityErrorInRxDataRegFlag\r\n", io->stdOut); + } +#endif +#if defined(FSL_FEATURE_UART_HAS_FIFO) && FSL_FEATURE_UART_HAS_FIFO + if (flags&kUART_TxFifoEmptyFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUART_TxFifoEmptyFlag\r\n", io->stdOut); + } + if (flags&kUART_RxFifoEmptyFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUART_RxFifoEmptyFlag\r\n", io->stdOut); + } + if (flags&kUART_TxFifoOverflowFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUART_TxFifoOverflowFlag\r\n", io->stdOut); + } + if (flags&kUART_RxFifoOverflowFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUART_RxFifoOverflowFlag\r\n", io->stdOut); + } + if (flags&kUART_RxFifoOverflowFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUART_RxFifoOverflowFlag\r\n", io->stdOut); + } +#endif +#elif McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_LPC845 + if (flags&kUSART_RxReady) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUSART_RxReady\r\n", io->stdOut); + } + if (flags&kUSART_RxIdleFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUSART_RxIdleFlag\r\n", io->stdOut); + } + if (flags&kUSART_TxReady) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUSART_TxReady\r\n", io->stdOut); + } + if (flags&kUSART_TxIdleFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUSART_TxIdleFlag\r\n", io->stdOut); + } + if (flags&kUSART_CtsState) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUSART_CtsState\r\n", io->stdOut); + } + if (flags&kUSART_DeltaCtsFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUSART_DeltaCtsFlag\r\n", io->stdOut); + } + if (flags&kUSART_TxDisableFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUSART_TxDisableFlag\r\n", io->stdOut); + } + if (flags&kUSART_HardwareOverrunFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUSART_HardwareOverrunFlag\r\n", io->stdOut); + } + if (flags&kUSART_RxBreakFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUSART_RxBreakFlag\r\n", io->stdOut); + } + if (flags&kUSART_RxStartFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUSART_RxStartFlag\r\n", io->stdOut); + } + if (flags&kUSART_FramErrorFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUSART_FramErrorFlag\r\n", io->stdOut); + } + if (flags&kUSART_ParityErrorFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUSART_ParityErrorFlag\r\n", io->stdOut); + } + if (flags&kUSART_RxNoiseFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUSART_RxNoiseFlag\r\n", io->stdOut); + } + #if defined(FSL_FEATURE_USART_HAS_ABERR_CHECK) && FSL_FEATURE_USART_HAS_ABERR_CHECK + if (flags&kUSART_AutoBaudErrorFlag) { + McuShell_SendStatusStr((unsigned char*)"", (unsigned char*)"kUSART_AutoBaudErrorFlag\r\n", io->stdOut); + } + #endif +#endif +} +#endif + +static uint8_t PrintStatus(const McuShell_StdIOType *io) { + uint8_t buf[96]; + + McuShell_SendStatusStr((unsigned char*)"McuUart485", (unsigned char*)"RS-485 UART settings\r\n", io->stdOut); +#if McuUart485_CONFIG_USE_LOGGER + McuShell_SendStatusStr((unsigned char*)" logging", McuUart485_doLogging?(unsigned char*)"on\r\n":(unsigned char*)"off\r\n", io->stdOut); +#endif + McuShell_SendStatusStr((unsigned char*)" HW TxEn", McuUart485_CONFIG_USE_HW_OE_RTS?(unsigned char*)"yes\r\n":(unsigned char*)"no\r\n", io->stdOut); +#if McuLib_CONFIG_CPU_IS_KINETIS || McuLib_CONFIG_CPU_IS_LPC + uint32_t flags; + +#if !McuUart485_CONFIG_USE_HW_OE_RTS + McuGPIO_GetPinStatusString(RS485_TxEn, buf, sizeof(buf)); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" TxEn", buf, io->stdOut); +#endif + flags = McuUart485_CONFIG_UART_GET_FLAGS(McuUart485_CONFIG_UART_DEVICE); + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum32Hex(buf, sizeof(buf), flags); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" flags", buf, io->stdOut); + DecodeUARTFlags(flags, io) ; +#endif + + McuUtility_Num32uToStr(buf, sizeof(buf), McuUart485_CONFIG_UART_BAUDRATE); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" baud", buf, io->stdOut); + +#if McuLib_CONFIG_CPU_IS_ESP32 + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"buffer: "); + McuUtility_strcatNum32u(buf, sizeof(buf), RS485_ESP_BUF_SIZE); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" bytes\r\n"); + McuShell_SendStatusStr((unsigned char*)" uart", buf, io->stdOut); +#endif + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"Rx: "); + McuUtility_strcatNum32u(buf, sizeof(buf), McuUart485_CONFIG_UART_RX_QUEUE_LENGTH); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)", Response: "); + McuUtility_strcatNum32u(buf, sizeof(buf), McuUart485_CONFIG_UART_RESPONSE_QUEUE_LENGTH); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuShell_SendStatusStr((unsigned char*)" queues", buf, io->stdOut); + return ERR_OK; +} + +static uint8_t PrintHelp(const McuShell_StdIOType *io) { + McuShell_SendHelpStr((unsigned char*)"McuUart485", (unsigned char*)"Group of RS-485 commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Print help or status information\r\n", io->stdOut); +#if McuLib_CONFIG_CPU_IS_KINETIS || McuLib_CONFIG_CPU_IS_LPC + McuShell_SendHelpStr((unsigned char*)" clear ", (unsigned char*)"Clear UART ISR flags\r\n", io->stdOut); +#endif + McuShell_SendHelpStr((unsigned char*)" log on|off", (unsigned char*)"Turn logging on or off\r\n", io->stdOut); + return ERR_OK; +} + +uint8_t McuUart485_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) { + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, "McuUart485 help")==0) { + *handled = true; + return PrintHelp(io); + } else if ((McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) || (McuUtility_strcmp((char*)cmd, "McuUart485 status")==0)) { + *handled = true; + return PrintStatus(io); +#if McuLib_CONFIG_CPU_IS_KINETIS || McuLib_CONFIG_CPU_IS_LPC + } else if (McuUtility_strncmp((char*)cmd, "McuUart485 clear ", sizeof("McuUart485 clear ")-1)==0) { + int32_t flags; + #if McuLib_CONFIG_CPU_IS_KINETIS + status_t status; + #endif + const unsigned char *p; + + *handled = true; + p = cmd + sizeof("McuUart485 clear ")-1; + if (McuUtility_xatoi(&p, &flags)==ERR_OK) { + #if McuLib_CONFIG_CPU_IS_KINETIS + status = McuUart485_CONFIG_CLEAR_STATUS_FLAGS(McuUart485_CONFIG_UART_DEVICE, flags); + McuShell_SendStr((unsigned char*)"status: ", io->stdOut); + McuShell_SendNum32u(status, io->stdOut); + McuShell_SendStr((unsigned char*)"\r\n", io->stdOut); + #elif McuLib_CONFIG_CPU_IS_LPC + McuUart485_CONFIG_CLEAR_STATUS_FLAGS(McuUart485_CONFIG_UART_DEVICE, flags); + #endif + return ERR_OK; + } + return ERR_FAILED; +#endif +#if McuUart485_CONFIG_USE_LOGGER + } else if (McuUtility_strcmp((char*)cmd, "McuUart485 log on")==0) { + *handled = TRUE; + McuUart485_doLogging = true; + return ERR_OK; + } else if (McuUtility_strcmp((char*)cmd, "McuUart485 log off")==0) { + *handled = TRUE; + McuUart485_doLogging = false; + return ERR_OK; +#endif + } + return ERR_OK; +} + +void McuUart485_Deinit(void) { + vQueueDelete(RS485UartRxQueue); + RS485UartRxQueue = NULL; +#if !McuUart485_CONFIG_USE_MODBUS + vQueueDelete(RS485UartResponseQueue); + RS485UartResponseQueue = NULL; +#endif +#if !McuUart485_CONFIG_USE_HW_OE_RTS + McuUart485_GPIO_Deinit(); +#endif +} + +void McuUart485_Init(void) { + InitUart(); + RS485UartRxQueue = xQueueCreate(McuUart485_CONFIG_UART_RX_QUEUE_LENGTH, sizeof(uint8_t)); + if (RS485UartRxQueue==NULL) { + McuLog_fatal("failed creating RS-485 Rx queue"); + for(;;){} /* out of memory? */ + } + vQueueAddToRegistry(RS485UartRxQueue, "RS485UartRxQueue"); +#if !McuUart485_CONFIG_USE_MODBUS + RS485UartResponseQueue = xQueueCreate(McuUart485_CONFIG_UART_RESPONSE_QUEUE_LENGTH, sizeof(uint8_t)); + if (RS485UartResponseQueue==NULL) { + McuLog_fatal("failed creating RS-485 response queue"); + for(;;){} /* out of memory? */ + } + vQueueAddToRegistry(RS485UartResponseQueue, "RS485UartResponseQueue"); +#endif +#if McuLib_CONFIG_CPU_IS_ESP32 + BaseType_t res; + + res = xTaskCreate(rs485uart_task, "rs485uart", (4*1024)/sizeof(StackType_t), NULL, tskIDLE_PRIORITY+3, NULL); + if (res==pdPASS) { + McuLog_trace("created rs485-uart task"); + } else { + McuLog_fatal("failed creating res485-uart task!"); + } +#endif +} + +#endif /* #ifdef McuUart485_CONFIG_UART_DEVICE */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuUart485.h b/TSM_PicoW_Sensor/McuLib/src/McuUart485.h new file mode 100644 index 0000000..fa2b5d0 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuUart485.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2020-2022, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MCUUART485_H_ +#define MCUUART485_H_ + +#include "McuUart485config.h" +#include "McuShell.h" +#include "McuRTOS.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if McuUart485_CONFIG_USE_RS_485 + +/*! buffers for the RS-485 shell parser */ +extern uint8_t McuUart485_DefaultShellBuffer[McuShell_DEFAULT_SHELL_BUFFER_SIZE]; /* default buffer which can be used by the application */ + +/*! The shell standard I/O handler to send/receive shell commands over the bus*/ +extern McuShell_ConstStdIOType McuUart485_stdio; + +/*! + * \brief Sending a string to the bus + * \param data string to be sent + */ +void McuUart485_SendString(unsigned char *data); + +/*! + * \brief Send a binary data block to the bus + * \param data Data to be sent + * \param dataSize Size of data in bytes + */ +void McuUart485_SendBlock(unsigned char *data, size_t dataSize); + +/*! + * \brief Clear the response queue. + */ +void McuUart485_ClearResponseQueue(void); + +/*! + * \brief Clear the Rx queue. + */ +void McuUart485_ClearRxQueue(void); + + +/*! + * \brief Return a byte from the response queue + * \param data Pointer to where to store the queue element + * \param ticksToWait Number of RTOS ticks to wait for a queue element + * \return ERR_OK if element received, ERR_FAILED otherwise + */ +uint8_t McuUart485_GetRxQueueByte(unsigned char *data, TickType_t ticksToWait); + +/*! + * \brief Pull (dequeue) a character from the response queue + * \return Error code, or ERR_OK + */ +uint8_t McuUart485_GetResponseQueueChar(void); + +/*! + * \brief Pull (dequeue) a character from the rx queue + * \return Error code, or ERR_OK + */ +uint8_t McuUart485_GetRxQueueChar(void); + +/*! + * \brief Shell command line parser + * \param cmd command to be parsed + * \param handled if command was recognized + * \param io I/O handler + * \return Error code, or ERR_OK + */ +uint8_t McuUart485_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); + +/*! \brief Module de-initialization */ +void McuUart485_Deinit(void); + +/*! \brief Module initialization */ +void McuUart485_Init(void); + +#endif /* #if McuUart485_CONFIG_USE_RS_485 */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MCUUART485_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuUnity.c b/TSM_PicoW_Sensor/McuLib/src/McuUnity.c new file mode 100644 index 0000000..750c4c1 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuUnity.c @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2023-2024, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuUnity.h" +#include "McuLib.h" +#include "McuRTT.h" +#include "McuLog.h" +#include "McuSemihost.h" +#include "McuShellUart.h" +#if McuLib_CONFIG_CPU_IS_RPxxxx + #include "pico.h" +#endif +#include /* for EOF */ + +/* The variable below is not initialized during statup, and set by JRun using a test JLinkScript, + * writing the variable during HandleAfterFlashProg(). + */ +#if McuLib_CONFIG_CPU_IS_RPxxxx + static uint32_t __uninitialized_ram(program_arg); +#else /* put variable into a no-init section */ + uint32_t program_arg __attribute__((section (".uninit_RESERVED"))); +#endif + +uint32_t McuUnity_GetArgument(void) { + McuLog_info("program_arg: value 0x%x @0x%x", program_arg, &program_arg); + return program_arg; +} + +int McuUnity_UART_GetArgs(unsigned char *buffer, size_t bufSize, McuUnity_ReadCharFct readFct) { + int nof = 0; + unsigned char ch; + + McuLog_info("getting UART arguments..."); + buffer[0] = '\0'; + for(;;) { /* breaks */ + readFct(&ch); + if (ch!='\0' && ch!='\n' && nof +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +void McuUnity_putc(int c); +void McuUnity_flush(void); +void McuUnity_start(void); +void McuUnity_complete(void); + +/*! + \brief Get memory mapped argument number. +*/ +uint32_t McuUnity_GetArgument(void); + + +/*! + * \brief Callback of function pointer to read a terminal character. + * \return The character or EOF. + */ +typedef int (*McuUnity_GetArgsCharFct)(void); + +/*! + \brief Get arguments passed from the test runner + \param buffer Pointer to memory where to store the argument string + \param bufSize Size of buffer in bytes + \param readFct Callback to read from the input + \return Number of bytes in buffer +*/ +int McuUnity_GetArgs(unsigned char *buffer, size_t bufSize, McuUnity_GetArgsCharFct readFct); + +/*! + \brief Callback of function pointer to read a terminal character. Returns '\0' for now character present. + */ +typedef void (*McuUnity_ReadCharFct)(uint8_t *); /* Callback for an I/O input function. */ + +/*! + \brief Get UART arguments passed + \param buffer Pointer to memory where to store the argument string + \param bufSize Size of buffer in bytes + \param io Standard I/O descriptor + \return Number of bytes in buffer +*/ +int McuUnity_UART_GetArgs(unsigned char *buffer, size_t bufSize, McuUnity_ReadCharFct readFct); + +/*! + \brief Get J-Run arguments passed with RTT and --args + \param buffer Pointer to memory where to store the argument string + \param bufSize Size of buffer in bytes + \return Number of bytes in buffer +*/ +int McuUnity_RTT_GetArgs(unsigned char *buffer, size_t bufSize); + +/*! + \brief Report status and exit JRun runner with RTT message + \param success If tests are a success or failure + */ +void McuUnity_Exit_JRun_RTT(bool success); + +/*! + \brief Report status and exit LinkServer runner with McuLog message + \param success If tests are a success or failure + */ +void McuUnity_Exit_LinkServer_Log(bool success); + +/*! + \brief Get Semihosting arguments passed to application + \param buffer Pointer to memory where to store the argument string + \param bufSize Size of buffer in bytes + \return Number of bytes in buffer +*/ +int McuUnity_Semihost_GetArgs(unsigned char *buffer, size_t bufSize); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MCU_UNITY_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuUtility.c b/TSM_PicoW_Sensor/McuLib/src/McuUtility.c new file mode 100644 index 0000000..38d0937 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuUtility.c @@ -0,0 +1,2950 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuUtility.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : Utility +** Version : Component 01.172, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 14:57, # CodeGen: 841 +** Abstract : +** Contains various utility functions. +** Settings : +** Component name : McuUtility +** Contents : +** SkipSpaces - void McuUtility_SkipSpaces(const unsigned char **str); +** strcpy - void McuUtility_strcpy(uint8_t *dst, size_t dstSize, const unsigned char *src); +** strcat - void McuUtility_strcat(uint8_t *dst, size_t dstSize, const unsigned char *src); +** strcatPad - void McuUtility_strcatPad(uint8_t *dst, size_t dstSize, const unsigned char... +** chcat - void McuUtility_chcat(uint8_t *dst, size_t dstSize, uint8_t ch); +** Num8sToStr - void McuUtility_Num8sToStr(uint8_t *dst, size_t dstSize, signed char val); +** Num8uToStr - void McuUtility_Num8uToStr(uint8_t *dst, size_t dstSize, uint8_t val); +** Num16sToStr - void McuUtility_Num16sToStr(uint8_t *dst, size_t dstSize, int16_t val); +** Num16uToStr - void McuUtility_Num16uToStr(uint8_t *dst, size_t dstSize, uint16_t val); +** Num32uToStr - void McuUtility_Num32uToStr(uint8_t *dst, size_t dstSize, uint32_t val); +** Num32sToStr - void McuUtility_Num32sToStr(uint8_t *dst, size_t dstSize, int32_t val); +** NumFloatToStr - void McuUtility_NumFloatToStr(uint8_t *dst, size_t dstSize, float val,... +** Num16sToStrFormatted - void McuUtility_Num16sToStrFormatted(uint8_t *dst, size_t dstSize, int16_t... +** Num16uToStrFormatted - void McuUtility_Num16uToStrFormatted(uint8_t *dst, size_t dstSize, uint16_t... +** Num32uToStrFormatted - void McuUtility_Num32uToStrFormatted(uint8_t *dst, size_t dstSize, uint32_t... +** Num32sToStrFormatted - void McuUtility_Num32sToStrFormatted(uint8_t *dst, size_t dstSize, int32_t... +** strcatNum8u - void McuUtility_strcatNum8u(uint8_t *dst, size_t dstSize, uint8_t val); +** strcatNum8s - void McuUtility_strcatNum8s(uint8_t *dst, size_t dstSize, signed char val); +** strcatNum16u - void McuUtility_strcatNum16u(uint8_t *dst, size_t dstSize, uint16_t val); +** strcatNum16s - void McuUtility_strcatNum16s(uint8_t *dst, size_t dstSize, int16_t val); +** strcatNum32u - void McuUtility_strcatNum32u(uint8_t *dst, size_t dstSize, uint32_t val); +** strcatNum32s - void McuUtility_strcatNum32s(uint8_t *dst, size_t dstSize, int32_t val); +** strcatNum16uFormatted - void McuUtility_strcatNum16uFormatted(uint8_t *dst, size_t dstSize, uint16_t... +** strcatNum16sFormatted - void McuUtility_strcatNum16sFormatted(uint8_t *dst, size_t dstSize, int16_t... +** strcatNum32uFormatted - void McuUtility_strcatNum32uFormatted(uint8_t *dst, size_t dstSize, uint32_t... +** strcatNum32sFormatted - void McuUtility_strcatNum32sFormatted(uint8_t *dst, size_t dstSize, int32_t... +** strcatNumHex - void McuUtility_strcatNumHex(uint8_t *dst, size_t dstSize, uint32_t num,... +** strcatNum8Hex - void McuUtility_strcatNum8Hex(uint8_t *dst, size_t dstSize, uint8_t num); +** strcatNum16Hex - void McuUtility_strcatNum16Hex(uint8_t *dst, size_t dstSize, uint16_t num); +** strcatNum24Hex - void McuUtility_strcatNum24Hex(uint8_t *dst, size_t dstSize, uint32_t num); +** strcatNum32Hex - void McuUtility_strcatNum32Hex(uint8_t *dst, size_t dstSize, uint32_t num); +** strcatNum32sDotValue100 - void McuUtility_strcatNum32sDotValue100(uint8_t *dst, size_t dstSize, int32_t... +** strcatNumFloat - void McuUtility_strcatNumFloat(uint8_t *dst, size_t dstSize, float val,... +** IsLeapYear - bool McuUtility_IsLeapYear(uint16_t year); +** WeekDay - uint8_t McuUtility_WeekDay(uint16_t year, uint8_t month, uint8_t day); +** ReadEscapedName - uint8_t McuUtility_ReadEscapedName(const unsigned char *filename, uint8_t... +** xatoi - uint8_t McuUtility_xatoi(const unsigned char **str, int32_t *res); +** ScanDate - uint8_t McuUtility_ScanDate(const unsigned char **str, uint8_t *day, uint8_t... +** ScanTime - uint8_t McuUtility_ScanTime(const unsigned char **str, uint8_t *hour, uint8_t... +** ScanDecimal8uNumber - uint8_t McuUtility_ScanDecimal8uNumber(const unsigned char **str, uint8_t *val); +** ScanDecimal8sNumber - uint8_t McuUtility_ScanDecimal8sNumber(const unsigned char **str, signed char... +** ScanDecimal16uNumber - uint8_t McuUtility_ScanDecimal16uNumber(const unsigned char **str, uint16_t... +** ScanDecimal16sNumber - uint8_t McuUtility_ScanDecimal16sNumber(const unsigned char **str, int16_t... +** ScanDecimal32uNumber - uint8_t McuUtility_ScanDecimal32uNumber(const unsigned char **str, uint32_t... +** ScanDecimal32sNumber - uint8_t McuUtility_ScanDecimal32sNumber(const unsigned char **str, int32_t... +** ScanDecimal32sDotNumber - uint8_t McuUtility_ScanDecimal32sDotNumber(const unsigned char **str, int32_t... +** ScanHex8uNumber - uint8_t McuUtility_ScanHex8uNumber(const unsigned char **str, uint8_t *val); +** ScanHex8uNumberNoPrefix - uint8_t McuUtility_ScanHex8uNumberNoPrefix(const unsigned char **str, uint8_t... +** ScanHex16uNumber - uint8_t McuUtility_ScanHex16uNumber(const unsigned char **str, uint16_t *val); +** ScanHex32uNumber - uint8_t McuUtility_ScanHex32uNumber(const unsigned char **str, uint32_t *val); +** ScanSeparatedNumbers - uint8_t McuUtility_ScanSeparatedNumbers(const unsigned char **str, uint8_t... +** ScanDoubleQuotedString - uint8_t McuUtility_ScanDoubleQuotedString(const uint8_t **cmd, uint8_t *buf,... +** ScanRGB - uint8_t McuUtility_ScanRGB(const unsigned char **str, uint8_t *r, uint8_t *g,... +** ScanWRGB - uint8_t McuUtility_ScanWRGB(const unsigned char **str, uint8_t *w, uint8_t... +** ScanRGB32 - uint8_t McuUtility_ScanRGB32(const unsigned char **str, uint32_t *rgb); +** ScanWRGB32 - uint8_t McuUtility_ScanWRGB32(const unsigned char **str, uint32_t *rgbw); +** strcmp - int16_t McuUtility_strcmp(const char *, const char *); +** strncmp - int16_t McuUtility_strncmp(const char *, const char *, size_t size); +** strFind - int16_t McuUtility_strFind(uint8_t *str, uint8_t *subStr); +** strtailcmp - uint8_t McuUtility_strtailcmp(const uint8_t *str, const uint8_t *tail); +** strlen - uint16_t McuUtility_strlen(const char *); +** strCutTail - uint8_t McuUtility_strCutTail(uint8_t *str, uint8_t *tail); +** GetValue16LE - uint16_t McuUtility_GetValue16LE(uint8_t *dataP); +** GetValue24LE - uint32_t McuUtility_GetValue24LE(uint8_t *dataP); +** GetValue32LE - uint32_t McuUtility_GetValue32LE(uint8_t *dataP); +** SetValue16LE - void McuUtility_SetValue16LE(uint16_t data, uint8_t *dataP); +** SetValue24LE - void McuUtility_SetValue24LE(uint32_t data, uint8_t *dataP); +** SetValue32LE - void McuUtility_SetValue32LE(uint32_t data, uint8_t *dataP); +** map - int32_t McuUtility_map(int32_t x, int32_t in_min, int32_t in_max, int32_t... +** map64 - int64_t McuUtility_map64(int64_t x, int64_t in_min, int64_t in_max, int64_t... +** constrain - int32_t McuUtility_constrain(int32_t val, int32_t min, int32_t max); +** random - int32_t McuUtility_random(int32_t min, int32_t max); +** randomSetSeed - void McuUtility_randomSetSeed(unsigned int seed); +** Deinit - void McuUtility_Deinit(void); +** Init - void McuUtility_Init(void); +** +** * Copyright (c) 2014-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuUtility.h +** @version 01.00 +** @brief +** Contains various utility functions. +*/ +/*! +** @addtogroup McuUtility_module McuUtility module documentation +** @{ +*/ + +/* MODULE McuUtility. */ + +#include "McuUtility.h" +#include /* for rand() */ + +/* Internal method prototypes */ +static void ShiftRightAndFill(uint8_t *dst, uint8_t fill, uint8_t nofFill); + +/* +** =================================================================== +** Method : strcpy (component Utility) +** +** Description : +** Same as normal strcpy, but safe as it does not write beyond +** the buffer. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** * src - Pointer to source string. +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief copy the string src into dst. It performs the same task as strncpy, except + - always terminates the result string. + - does not zero out the remaining part in dst. + Note: dstSize is the size of dst INCLUDING zero byte. + Precondition: src, dst != NULL + \param[in,out] dst Start of string buffer, where to append the number string + \param[in] dstSize The size of the buffer, including the zero byte + \param[in] src The source string to copy +*/ +void McuUtility_strcpy(uint8_t *dst, size_t dstSize, const unsigned char *src) +{ + dstSize--; /* for zero byte */ + while (dstSize > 0 && *src != '\0') { + *dst++ = *src++; + dstSize--; + } + *dst = '\0'; +} + +/* +** =================================================================== +** Method : strcat (component Utility) +** +** Description : +** Same as normal strcat, but safe as it does not write beyond +** the buffer. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** * src - Pointer to source string. +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief Concat the string src into dst. Always terminates the result string. + Note: count is the size of dst INCLUDING zero byte. + Precondition: src, dst != NULL + \param[in,out] dst Start of string buffer, where to append the number string + \param[in] dstSize The size of the buffer, including the zero byte + \param[in] src The source string to add + */ +void McuUtility_strcat(uint8_t *dst, size_t dstSize, const unsigned char *src) +{ + dstSize--; /* for zero byte */ + /* point to the end of the source */ + while (dstSize > 0 && *dst != '\0') { + dst++; + dstSize--; + } + /* copy the src in the destination */ + while (dstSize > 0 && *src != '\0') { + *dst++ = *src++; + dstSize--; + } + /* terminate the string */ + *dst = '\0'; +} + +/* +** =================================================================== +** Method : chcat (component Utility) +** +** Description : +** Adds a single character to a zero byte terminated string +** buffer. It cares about buffer overflow. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** ch - character to append +** Returns : Nothing +** =================================================================== +*/ +void McuUtility_chcat(uint8_t *dst, size_t dstSize, uint8_t ch) +{ + dstSize--; /* for zero byte */ + /* point to the end of the source */ + while (dstSize > 0 && *dst != '\0') { + dst++; + dstSize--; + } + /* copy the ch in the destination */ + if (dstSize > 0) { + *dst++ = ch; + } + /* terminate the string */ + *dst = '\0'; +} + +/* +** =================================================================== +** Method : Num8uToStr (component Utility) +** +** Description : +** Converts an unsigned 8bit value into a string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to be converted. +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief Converts an 8bit unsigned number into a string. + \param[in,out] dst String buffer to store the number. + \param[in] dstSize Size of the destination buffer in uint8_ts. + \param[in] val 8bit unsigned number to convert. + */ +void McuUtility_Num8uToStr(uint8_t *dst, size_t dstSize, uint8_t val) +{ + McuUtility_Num16uToStr(dst, dstSize, (uint16_t)val); +} + +/* +** =================================================================== +** Method : Num8sToStr (component Utility) +** +** Description : +** Converts a signed 8bit value into a string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to be converted. +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief Converts an 8bit signed number into a string. + \param[in,out] dst String buffer to store the number. + \param[in] dstSize Size of the destination buffer in uint8_ts. + \param[in] val 8bit signed number to convert. + */ +void McuUtility_Num8sToStr(uint8_t *dst, size_t dstSize, signed char val) +{ + McuUtility_Num16sToStr(dst, dstSize, (int16_t)val); +} + +/* +** =================================================================== +** Method : Num16uToStr (component Utility) +** +** Description : +** Converts a signed 16bit value into a string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to be converted. +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief Converts a 16bit unsigned number into a string. + \param[in,out] dst String buffer to store the number. + \param[in] dstSize Size of the destination buffer in uint8_ts. + \param[in] val 16bit unsigned number to convert. + */ +void McuUtility_Num16uToStr(uint8_t *dst, size_t dstSize, uint16_t val) +{ + unsigned char *ptr = ((unsigned char *)dst); + unsigned char i=0, j; + unsigned char tmp; + + dstSize--; /* for zero byte */ + if (val == 0 && dstSize > 0){ + ptr[i++] = '0'; + dstSize--; + } + while (val > 0 && dstSize > 0) { + ptr[i++] = (unsigned char)((val % 10) + '0'); + dstSize--; + val /= 10; + } + for(j=0; j<(i/2); j++) { /* swap buffer */ + tmp = ptr[j]; + ptr[j] = ptr[(i-j)-1]; + ptr[(i-j)-1] = tmp; + } + ptr[i] = '\0'; +} + +/* +** =================================================================== +** Method : Num16sToStr (component Utility) +** +** Description : +** Converts a signed 16bit value into a string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to be converted. +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief Converts a 16bit signed number into a string. + \param[in,out] dst String buffer to store the number. + \param[in] dstSize Size of the destination buffer in uint8_ts. + \param[in] val 16bit signed number to convert. + */ +void McuUtility_Num16sToStr(uint8_t *dst, size_t dstSize, int16_t val) +{ + unsigned char *ptr = ((unsigned char *)dst); + unsigned char i=0, j; + unsigned char tmp; + unsigned char sign = (unsigned char)(val < 0); + + if (val==(int16_t)(0x8000)) { /* special case 0x8000/-32768: prevent overflow below. */ + McuUtility_strcpy(dst, dstSize, (unsigned char*)"-32768"); + return; + } + dstSize--; /* for zero byte */ + if (sign) { + val = (int16_t)(-val); + } + if (val == 0 && dstSize > 0){ + ptr[i++] = '0'; + dstSize--; + } + while (val > 0 && dstSize > 0) { + ptr[i++] = (unsigned char)((val % 10) + '0'); + dstSize--; + val /= 10; + } + if (sign && dstSize > 0){ + ptr[i++] = '-'; + } + for(j=0; j<(i/2); j++) { /* swap buffer */ + tmp = ptr[j]; + ptr[j] = ptr[(i-j)-1]; + ptr[(i-j)-1] = tmp; + } + ptr[i] = '\0'; +} + +/* +** =================================================================== +** Method : ShiftRightAndFill (component Utility) +** +** Description : +** This method is internal. It is used by Processor Expert only. +** =================================================================== +*/ +static void ShiftRightAndFill(uint8_t *dst, uint8_t fill, uint8_t nofFill) +{ + signed char i, j; + + j = 0; + while(dst[j] != '\0') { + j++; + } + i = (signed char)nofFill; + if (i==j) { + /* nothing to do, we are done */ + } else if (i>j) { + while (j>=0) { + dst[i] = dst[j]; + i--; j--; + } + while(i>=0) { + dst[i] = fill; + i--; + } + } else { + /* hmmm, not enough space, return what we have, do nothing */ + } +} + +/* +** =================================================================== +** Method : Num16sToStrFormatted (component Utility) +** +** Description : +** Converts a 16bit signed value to string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** fill - Fill character +** nofFill - Number of fill characters +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief Converts a 16bit signed number to a string, in a formatted way (like printf with "%0d"). + Always terminates the result string. + Note: count is the size of dst INCLUDING zero byte. + Precondition: src, dst != NULL + \param[in,out] dst Start of string buffer, where to append the number string + \param[in] dstSize Size of the destination buffer, in uint8_ts. + \param[in] val The 16bit signed number to add + \param[in] fill Fill character, typically ' ' (like for "%2d" or '0' (for "%02d") + \param[in] nofFill Size for the format (right aligned) string, e.g. '2' for "%2d" +*/ +void McuUtility_Num16sToStrFormatted(uint8_t *dst, size_t dstSize, int16_t val, char fill, uint8_t nofFill) +{ + McuUtility_Num16sToStr(dst, dstSize, val); + ShiftRightAndFill(dst, fill, nofFill); +} + +/* +** =================================================================== +** Method : Num16uToStrFormatted (component Utility) +** +** Description : +** Converts a 16bit unsigned value to string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** fill - Fill character +** nofFill - Number of fill characters +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief Converts a 16bit unsigned number to a string, in a formatted way (like printf with "%0d"). + Always terminates the result string. + Note: count is the size of dst INCLUDING zero byte. + Precondition: src, dst != NULL + \param[in,out] dst Start of string buffer, where to append the number string + \param[in] dstSize Size of the destination buffer, in uint8_ts. + \param[in] val The 16bit unsigned number to add + \param[in] fill Fill character, typically ' ' (like for "%2d" or '0' (for "%02d") + \param[in] nofFill Size for the format (right aligned) string, e.g. '2' for "%2d" +*/ +void McuUtility_Num16uToStrFormatted(uint8_t *dst, size_t dstSize, uint16_t val, char fill, uint8_t nofFill) +{ + McuUtility_Num16uToStr(dst, dstSize, val); + ShiftRightAndFill(dst, fill, nofFill); +} + +/* +** =================================================================== +** Method : Num32uToStrFormatted (component Utility) +** +** Description : +** Converts a 32bit unsigned value to string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** fill - Fill character +** nofFill - Number of fill characters +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief Converts a 32bit unsigned number to a string, in a formatted way (like printf with "%0d"). + Always terminates the result string. + Note: count is the size of dst INCLUDING zero byte. + Precondition: src, dst != NULL + \param[in,out] dst Start of string buffer, where to append the number string + \param[in] dstSize Size of the destination buffer, in uint8_ts. + \param[in] val The 32bit unsigned number to add + \param[in] fill Fill character, typically ' ' (like for "%2d" or '0' (for "%02d") + \param[in] nofFill Size for the format (right aligned) string, e.g. '2' for "%2d" +*/ +void McuUtility_Num32uToStrFormatted(uint8_t *dst, size_t dstSize, uint32_t val, char fill, uint8_t nofFill) +{ + McuUtility_Num32uToStr(dst, dstSize, val); + ShiftRightAndFill(dst, fill, nofFill); +} + +/* +** =================================================================== +** Method : Num32sToStrFormatted (component Utility) +** +** Description : +** Converts a 32bit signed value to string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** fill - Fill character +** nofFill - Number of fill characters +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief Converts a 32bit signed number to a string, in a formatted way (like printf with "%0d"). + Always terminates the result string. + Note: count is the size of dst INCLUDING zero byte. + Precondition: src, dst != NULL + \param[in,out] dst Start of string buffer, where to append the number string + \param[in] dstSize Size of the destination buffer, in uint8_ts. + \param[in] val The 32bit signed number to add + \param[in] fill Fill character, typically ' ' (like for "%2d" or '0' (for "%02d") + \param[in] nofFill Size for the format (right aligned) string, e.g. '2' for "%2d" +*/ +void McuUtility_Num32sToStrFormatted(uint8_t *dst, size_t dstSize, int32_t val, char fill, uint8_t nofFill) +{ + McuUtility_Num32sToStr(dst, dstSize, val); + ShiftRightAndFill(dst, fill, nofFill); +} + +/* +** =================================================================== +** Method : strcatNum8u (component Utility) +** +** Description : +** Appends a 8bit unsigned value to a string buffer. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief appends a 8bit unsigned number to a string. Always terminates the result string. + Note: count is the size of dst INCLUDING zero byte. + Precondition: src, dst != NULL + \param[in,out] dst Start of string buffer, where to append the number string + \param[in] dstSize The size of the buffer, including the zero byte + \param[in] val The 8bit unsigned number to add + */ +void McuUtility_strcatNum8u(uint8_t *dst, size_t dstSize, uint8_t val) +{ + unsigned char buf[sizeof("-128")]; /* maximum buffer size we need */ + + McuUtility_Num8uToStr(buf, sizeof(buf), val); + McuUtility_strcat(dst, dstSize, buf); +} + +/* +** =================================================================== +** Method : strcatNum8s (component Utility) +** +** Description : +** Appends a 8bit signed value to a string buffer. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief appends a 8bit signed number to a string. Always terminates the result string. + Note: count is the size of dst INCLUDING zero byte. + Precondition: src, dst != NULL + \param[in,out] dst Start of string buffer, where to append the number string + \param[in] dstSize The size of the buffer, including the zero byte + \param[in] val The 8bit signed number to add + */ +void McuUtility_strcatNum8s(uint8_t *dst, size_t dstSize, signed char val) +{ + unsigned char buf[sizeof("-128")]; /* maximum buffer size we need */ + + McuUtility_Num8sToStr(buf, sizeof(buf), val); + McuUtility_strcat(dst, dstSize, buf); +} + +/* +** =================================================================== +** Method : strcatNum16u (component Utility) +** +** Description : +** Appends a 16bit unsigned value to a string buffer. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief appends a 16bit unsigned number to a string. Always terminates the result string. + Note: count is the size of dst INCLUDING zero byte. + Precondition: src, dst != NULL + \param[in,out] dst Start of string buffer, where to append the number string + \param[in] dstSize The size of the buffer, including the zero byte + \param[in] val The 16bit unsigned number to add + */ +void McuUtility_strcatNum16u(uint8_t *dst, size_t dstSize, uint16_t val) +{ + unsigned char buf[sizeof("-32768")]; /* maximum buffer size we need */ + + McuUtility_Num16uToStr(buf, sizeof(buf), val); + McuUtility_strcat(dst, dstSize, buf); +} + +/* +** =================================================================== +** Method : strcatNum16s (component Utility) +** +** Description : +** Appends a 16bit signed value to a string buffer. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief appends a 16bit signed number to a string. Always terminates the result string. + Note: count is the size of dst INCLUDING zero byte. + Precondition: src, dst != NULL + \param[in,out] dst Start of string buffer, where to append the number string + \param[in] dstSize The size of the buffer, including the zero byte + \param[in] val The 16bit signed number to add + */ +void McuUtility_strcatNum16s(uint8_t *dst, size_t dstSize, int16_t val) +{ + unsigned char buf[sizeof("-32768")]; /* maximum buffer size we need */ + + McuUtility_Num16sToStr(buf, sizeof(buf), val); + McuUtility_strcat(dst, dstSize, buf); +} + +/* +** =================================================================== +** Method : strcatNum16uFormatted (component Utility) +** +** Description : +** Appends a 16bit unsigned value to a string buffer in a +** formatted way. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** fill - Fill character +** nofFill - Number of fill characters +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief appends a 16bit unsigned number to a string, in a formatted way (like printf with "%0d". + Always terminates the result string. + Note: count is the size of dst INCLUDING zero byte. + Precondition: src, dst != NULL + \param[in,out] dst Start of string buffer, where to append the number string + \param[in] dstSize The size of the buffer, including the zero byte + \param[in] val The 16bit unsigned number to add + \param[in] fill Fill character + \param[in] nofFill Number of fill characters + */ +void McuUtility_strcatNum16uFormatted(uint8_t *dst, size_t dstSize, uint16_t val, char fill, uint8_t nofFill) +{ + unsigned char buf[sizeof("-32768")]; /* maximum buffer size we need */ + + McuUtility_Num16uToStrFormatted(buf, sizeof(buf), val, fill, nofFill); + McuUtility_strcat(dst, dstSize, buf); +} + +/* +** =================================================================== +** Method : strcatNum16sFormatted (component Utility) +** +** Description : +** Appends a 16bit signed value to a string buffer in a +** formatted way. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** fill - Fill character +** nofFill - Number of fill characters +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief appends a 16bit signed number to a string, in a formatted way (like printf with "%0d". + Always terminates the result string. + Note: count is the size of dst INCLUDING zero byte. + Precondition: src, dst != NULL + \param[in,out] dst Start of string buffer, where to append the number string + \param[in] dstSize The size of the buffer, including the zero byte + \param[in] val The 16bit signed number to add + \param[in] fill Fill character + \param[in] nofFill Number of fill characters + */ +void McuUtility_strcatNum16sFormatted(uint8_t *dst, size_t dstSize, int16_t val, char fill, uint8_t nofFill) +{ + unsigned char buf[sizeof("-32768")]; /* maximum buffer size we need */ + + McuUtility_Num16sToStrFormatted(buf, sizeof(buf), val, fill, nofFill); + McuUtility_strcat(dst, dstSize, buf); +} + +/* +** =================================================================== +** Method : strcatNum32uFormatted (component Utility) +** +** Description : +** Appends a 32bit unsigned value to a string buffer in a +** formatted way. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** fill - Fill character +** nofFill - Number of fill characters +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief appends a 32bit unsigned number to a string, in a formatted way (like printf with "%0d". + Always terminates the result string. + Note: count is the size of dst INCLUDING zero byte. + Precondition: src, dst != NULL + \param[in,out] dst Start of string buffer, where to append the number string + \param[in] dstSize The size of the buffer, including the zero byte + \param[in] val The 32bit unsigned number to add + \param[in] fill Fill character + \param[in] nofFill Number of fill characters + */ +void McuUtility_strcatNum32uFormatted(uint8_t *dst, size_t dstSize, uint32_t val, char fill, uint8_t nofFill) +{ + unsigned char buf[sizeof("-4294967295")]; /* maximum buffer size we need */ + + McuUtility_Num32uToStrFormatted(buf, sizeof(buf), val, fill, nofFill); + McuUtility_strcat(dst, dstSize, buf); +} + +/* +** =================================================================== +** Method : strcatNum32sFormatted (component Utility) +** +** Description : +** Appends a 32bit signed value to a string buffer in a +** formatted way. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** fill - Fill character +** nofFill - Number of fill characters +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief appends a 32bit signed number to a string, in a formatted way (like printf with "%0d". + Always terminates the result string. + Note: count is the size of dst INCLUDING zero byte. + Precondition: src, dst != NULL + \param[in,out] dst Start of string buffer, where to append the number string + \param[in] dstSize The size of the buffer, including the zero byte + \param[in] val The 32bit signed number to add + \param[in] fill Fill character + \param[in] nofFill Number of fill characters + */ +void McuUtility_strcatNum32sFormatted(uint8_t *dst, size_t dstSize, int32_t val, char fill, uint8_t nofFill) +{ + unsigned char buf[sizeof("-4294967295")]; /* maximum buffer size we need */ + + McuUtility_Num32sToStrFormatted(buf, sizeof(buf), val, fill, nofFill); + McuUtility_strcat(dst, dstSize, buf); +} + +/* +** =================================================================== +** Method : strcatNum8Hex (component Utility) +** +** Description : +** Appends a 8bit unsigned value to a string buffer as hex +** number (without a 0x prefix). +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** num - Value to convert. +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief Adds a 8bit number as hex value to a string. + \param[in,out] dst Start of string buffer, where to append the number string + \param[in] dstSize The size of the buffer, including the zero byte + \param[in] num The 8bit number to add + */ +void McuUtility_strcatNum8Hex(uint8_t *dst, size_t dstSize, uint8_t num) +{ + unsigned char buf[sizeof("FF")]; /* maximum buffer size we need */ + unsigned char hex; + + buf[2] = '\0'; + hex = (char)(num & 0x0F); + buf[1] = (char)(hex + ((hex <= 9) ? '0' : ('A'-10))); + hex = (char)((num>>4) & 0x0F); + buf[0] = (char)(hex + ((hex <= 9) ? '0' : ('A'-10))); + McuUtility_strcat(dst, dstSize, buf); +} + +/* +** =================================================================== +** Method : strcatNum16Hex (component Utility) +** +** Description : +** Appends a 16bit unsigned value to a string buffer as hex +** number (without a 0x prefix). +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** num - Value to convert. +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief Adds a 16bit number as hex value to a string. + \param[in,out] dst Start of string buffer, where to append the number string + \param[in] dstSize The size of the buffer, including the zero byte + \param[in] num The 16bit number to add + */ +void McuUtility_strcatNum16Hex(uint8_t *dst, size_t dstSize, uint16_t num) +{ + unsigned char buf[sizeof("FFFF")]; /* maximum buffer size we need */ + unsigned char hex; + int8_t i; + + buf[4] = '\0'; + i = 3; + do { + hex = (char)(num & 0x0F); + buf[i] = (char)(hex + ((hex <= 9) ? '0' : ('A'-10))); + num >>= 4; /* next nibble */ + i--; + } while (i>=0); + McuUtility_strcat(dst, dstSize, buf); +} + +/* +** =================================================================== +** Method : strcatNum24Hex (component Utility) +** +** Description : +** Appends a 32bit unsigned value to a string buffer as hex +** number (without a 0x prefix). Only 24bits are used. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** num - Value to convert. +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief Adds a 24bit number as hex value to a string. + \param[in,out] dst Start of string buffer, where to append the number string + \param[in] dstSize The size of the buffer, including the zero byte + \param[in] num The 24bit number to add + */ +void McuUtility_strcatNum24Hex(uint8_t *dst, size_t dstSize, uint32_t num) +{ + unsigned char buf[sizeof("FFFFFF")]; /* maximum buffer size we need */ + unsigned char hex; + int8_t i; + + buf[6] = '\0'; + i = 5; + do { + hex = (char)(num & 0x0F); + buf[i] = (char)(hex + ((hex <= 9) ? '0' : ('A'-10))); + num >>= 4; /* next nibble */ + i--; + } while (i>=0); + McuUtility_strcat(dst, dstSize, buf); +} + +/* +** =================================================================== +** Method : strcatNum32Hex (component Utility) +** +** Description : +** Appends a 32bit unsigned value to a string buffer as hex +** number (without a 0x prefix). +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** num - Value to convert. +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief Adds a 32bit number as hex value to a string. + \param[in,out] dst Start of string buffer, where to append the number string + \param[in] dstSize The size of the buffer, including the zero byte + \param[in] num The 32bit number to add + */ +void McuUtility_strcatNum32Hex(uint8_t *dst, size_t dstSize, uint32_t num) +{ + unsigned char buf[sizeof("FFFFFFFF")]; /* maximum buffer size we need */ + unsigned char hex; + int8_t i; + + buf[8] = '\0'; + i = 7; + do { + hex = (char)(num & 0x0F); + buf[i] = (char)(hex + ((hex <= 9) ? '0' : ('A'-10))); + num >>= 4; /* next nibble */ + i--; + } while (i>=0); + McuUtility_strcat(dst, dstSize, buf); +} + +/* +** =================================================================== +** Method : strcatNum32s (component Utility) +** +** Description : +** Appends a 32bit signed value to a string buffer. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief appends a 32bit (long) number to a string. Always terminates the result string. + Note: count is the size of dst INCLUDING zero byte. + Precondition: src, dst != NULL + \param[in,out] dst Start of string buffer, where to append the number string + \param[in] dstSize The size of the buffer, including the zero byte + \param[in] val The 32bit number to add + */ +void McuUtility_strcatNum32s(uint8_t *dst, size_t dstSize, int32_t val) +{ + unsigned char buf[sizeof("-4294967295")]; /* maximum buffer size we need */ + + McuUtility_Num32sToStr(buf, sizeof(buf), val); + McuUtility_strcat(dst, dstSize, buf); +} + +/* +** =================================================================== +** Method : strcatNum32u (component Utility) +** +** Description : +** Appends a 32bit signed value to a string buffer. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief appends a 32bit (unsigned long) number to a string. Always terminates the result string. + Note: count is the size of dst INCLUDING zero byte. + Precondition: src, dst != NULL + \param[in,out] dst Start of string buffer, where to append the number string + \param[in] dstSize The size of the buffer, including the zero byte + \param[in] val The 32bit unsigned number to add + */ +void McuUtility_strcatNum32u(uint8_t *dst, size_t dstSize, uint32_t val) +{ + unsigned char buf[sizeof("4294967295")]; /* maximum buffer size we need */ + + McuUtility_Num32uToStr(buf, sizeof(buf), val); + McuUtility_strcat(dst, dstSize, buf); +} + +/* +** =================================================================== +** Method : Num32sToStr (component Utility) +** +** Description : +** Converts a signed 32bit value into a string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to be converted. +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief Converts a 32bit number to a string. + \param[in,out] dst String buffer to store the number. + \param[in] dstSize Size of the destination buffer in uint8_ts. + \param[in] val 32bit signed number to convert. + */ +void McuUtility_Num32sToStr(uint8_t *dst, size_t dstSize, int32_t val) +{ + unsigned char *ptr = ((unsigned char *)dst); + unsigned char i=0, j; + unsigned char tmp; + unsigned char sign = (unsigned char)(val < 0); + + if (val==(int32_t)(0x80000000)) { /* special case 0x80000000/-2147483648: prevent overflow below. */ + McuUtility_strcpy(dst, dstSize, (unsigned char*)"-2147483648"); + return; + } + dstSize--; /* for zero byte */ + if (sign) { + val = -val; + } + if (val == 0 && dstSize > 0){ + ptr[i++] = '0'; + dstSize--; + } + while (val > 0 && dstSize > 0) { + ptr[i++] = (unsigned char)((val % 10) + '0'); + dstSize--; + val /= 10; + } + if (sign && dstSize > 0){ + ptr[i++] = '-'; + } + for(j=0; j<(i/2); j++) { /* swap buffer */ + tmp = ptr[j]; + ptr[j] = ptr[(i-j)-1]; + ptr[(i-j)-1] = tmp; + } + ptr[i] = '\0'; +} + +/* +** =================================================================== +** Method : Num32uToStr (component Utility) +** +** Description : +** Converts an unsigned 32bit value into a string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to be converted. +** Returns : Nothing +** =================================================================== +*/ +/*! + \brief Converts a 32bit signed number to a string. + \param[in,out] dst String buffer to store the number. + \param[in] dstSize Size of the destination buffer in uint8_ts. + \param[in] val 32bit unsigned number to convert. + */ +void McuUtility_Num32uToStr(uint8_t *dst, size_t dstSize, uint32_t val) +{ + unsigned char *ptr = ((unsigned char *)dst); + unsigned char i=0, j; + unsigned char tmp; + + dstSize--; /* for zero byte */ + if (val == 0 && dstSize > 0){ + ptr[i++] = '0'; + dstSize--; + } + while (val > 0 && dstSize > 0) { + ptr[i++] = (unsigned char)((val % 10) + '0'); + dstSize--; + val /= 10; + } + for(j=0; j<(i/2); j++) { /* swap buffer */ + tmp = ptr[j]; + ptr[j] = ptr[(i-j)-1]; + ptr[(i-j)-1] = tmp; + } + ptr[i] = '\0'; +} + +/* +** =================================================================== +** Method : IsLeapYear (component Utility) +** +** Description : +** Returns true if a given year is a leap year +** Parameters : +** NAME - DESCRIPTION +** year - Year, in the YYYY format. +** Returns : +** --- - If the year is a leap year or not. +** =================================================================== +*/ +bool McuUtility_IsLeapYear(uint16_t year) +{ + return ((((year%4)==0) && (year%100)!=0) || (year%400)==0); +} + +/* +** =================================================================== +** Method : WeekDay (component Utility) +** +** Description : +** Returns the weekday for a given date >= 1.Jan.1900 +** Parameters : +** NAME - DESCRIPTION +** year - year in YYYY format +** month - month of the year (1: January, 2: +** February, etc) +** day - day of the moth (starting with 1) +** Returns : +** --- - Returns the weekday, 0 for Sunday, 1 for +** Monday, 2 for Tuesday, etc. +** =================================================================== +*/ +uint8_t McuUtility_WeekDay(uint16_t year, uint8_t month, uint8_t day) +{ + /* see http://klausler.com/new-dayofweek.html */ + static const uint8_t skew[12] = {0,3,3,6,1,4,6,2,5,0,3,5}; + uint16_t sum; + + sum = (uint16_t)(year-1900); + sum += sum/4; + sum %= 7; + if (McuUtility_IsLeapYear(year) && (month==1 || month==2)) { + sum--; + } + sum += day; + sum %= 7; + sum += skew[month-1]; + sum %= 7; + return (uint8_t)sum; /* 0: Sunday, 1: Monday, 2: Tuesday, 3: Wednesday, ... */ +} + +/* +** =================================================================== +** Method : ReadEscapedName (component Utility) +** +** Description : +** Scans an escaped name from a string. This is useful e.g. for +** double quoted file names. +** Parameters : +** NAME - DESCRIPTION +** * filename - the name to be copied. Names may +** be in quoted format +** * destname - the destination of the copy. +** Names are not in quoted format. destname +** may be NULL to get the other return values +** only +** maxlen - length allocated for destname +** * lenRead - length read in filename to copy +** the whole name. Note that filenames maybe +** space terminated, so *lenRead < +** strlen(filename) +** lenWritten - the size written in destname. +** In case of overflows in destname, +** lenWritten is still increased but destname +** no longer written. The have the string +** length in these cases use strlen(destname) +** terminators - additional characters +** where a name should terminate. May be NULL +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuUtility_ReadEscapedName(const unsigned char *filename, uint8_t *destname, size_t maxlen, size_t *lenRead, size_t *lenWritten, const char *terminators) +{ + size_t lenCopied = 0, lenOverread = 0; + bool quoteMode = FALSE; /* quoteMode means the name is surrounded by ". In this mode, only a second single quote " + terminates the string. In !quoteMode a space or a '\0' may also terminate it correctly */ + bool res = ERR_OK; + #define IS_SPACE(ch) ((ch)==' '||(ch)=='\t'||(ch)=='\n'||(ch)=='\v'||(ch)=='\f'||(ch)=='\r') + + if (filename==NULL || (destname!=NULL && maxlen==0)) { + return ERR_FAILED; + } + if (filename[0] == '"') { /* translated mode */ + filename++; /* overread '"' */ + lenOverread++; + quoteMode=TRUE; + } + if (terminators == NULL) { + terminators = ""; + } + for (;;) { + if (quoteMode) { + if (filename[0] == '"') { + filename++; /* overread '"' */ + lenOverread++; + if (filename[0] != '"') { /* quoteMode is terminated by a single quote. A double quote is treated like a single quote and does not terminate it ! */ + break; /* successfully finished with this name */ + } /* else we copy the second quote " */ + } + if (filename[0] == '\0') { /* unexpected 0. stop */ + res = ERR_FAILED; + break; /* error case: no terminating double quote (") was found */ + } + } else { /* copy mode */ + if (IS_SPACE(filename[0]) || filename[0] == '\0' || strchr(terminators, filename[0]) != NULL) { /* !quoteMode is terminated by space, '\0' or by any char in terminators */ + break; + } + } + if (destname != NULL) { + if (lenCopied + 1 < maxlen) { + destname[0] = filename[0]; + destname++; + } else { + destname[0] = '\0'; /* terminate string */ + destname = NULL; /* avoid it to overwrite not allocated space */ + } + } + lenCopied++; + filename++; + } + if (destname != NULL) { + destname[0] = '\0'; + } + if (lenRead != NULL) { + *lenRead = lenCopied+lenOverread; + } + if (lenWritten != NULL) { + *lenWritten = lenCopied + 1; /* additionally a zero byte written */ + } + return res; +} + +/* +** =================================================================== +** Method : xatoi (component Utility) +** +** Description : +** Custom atoi() (ascii to int) implementation by Elm Chan +** Parameters : +** NAME - DESCRIPTION +** * str - Pointer to string to scan. Returns until +** where it has scanned. +** * res - Pointer to where to store the result +** Returns : +** --- - Error code +** =================================================================== +*/ +/*------------------------------------------------------------------------/ +/ Universal string handler for user console interface +/-------------------------------------------------------------------------/ +/ +/ Copyright (C) 2010, ChaN, all right reserved. +/ +/ * This software is a free software and there is NO WARRANTY. +/ * No restriction on use. You can use, modify and redistribute it for +/ personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. +/ * Redistributions of source code must retain the above copyright notice. +/ +/-------------------------------------------------------------------------*/ +#ifdef __HC12__ + #pragma MESSAGE DISABLE C12056 /* message about SP debug info */ +#endif +uint8_t McuUtility_xatoi(const unsigned char **str, int32_t *res) +{ +/* 123 -5 0x3ff 0b1111 0377 3.25 w " + ^ 1st call returns 123 and next ptr + ^ 2nd call returns -5 and next ptr + ^ 3rd call returns 1023 and next ptr + ^ 4th call returns 15 and next ptr + ^ 5th call returns 255 and next ptr + ^ 6th call returns 3 and next ptr, caller needs to read '.' + ^ 7th call returns 25 and next ptr + ^ 8th call fails and returns ERR_FAILED +*/ + uint32_t val; + uint8_t c, r, s = 0; + + *res = 0; + while (**str==' ') { + (*str)++; /* Skip leading spaces */ + } + c = **str; + if (c == '-') { /* negative? */ + s = 1; + c = *(++(*str)); + } + if (c == '0') { + c = *(++(*str)); + switch (c) { + case 'x': /* hexadecimal */ + r = 16; c = *(++(*str)); + break; + case 'b': /* binary */ + r = 2; c = *(++(*str)); + break; + default: + if (c <= ' ' || c == '.') { + return ERR_OK; /* single zero */ + } + if (c < '0' || c > '9') { + return ERR_FAILED; /* invalid char */ + } + r = 8; /* octal */ + break; + } /* switch */ + } else { + if (c < '0' || c > '9') { + return ERR_FAILED; /* EOL or invalid char */ + } + r = 10; /* decimal */ + } + val = 0; + while (c > ' ' && c != '.') { + if (c >= 'a') c -= 0x20; + c -= '0'; + if (c >= 17) { + c -= 7; + if (c <= 9) return ERR_FAILED; /* invalid char */ + } + if (c >= r) return ERR_FAILED; /* invalid char for current radix */ + val = val * r + c; + c = *(++(*str)); + } /* while */ + if (s) val = 0 - val; /* apply sign if needed */ + *res = (long)val; + return ERR_OK; +} +#ifdef __HC12__ + #pragma MESSAGE DEFAULT C12056 /* message about SP debug info */ +#endif + +/* +** =================================================================== +** Method : ScanDate (component Utility) +** +** Description : +** Scans a date in the format "dd.mm.yyyy" or "dd-mm-yyyy". For +** yy it will expand it to 20yy. +** Parameters : +** NAME - DESCRIPTION +** * str - Pointer to the string to be scanned. The +** function advances the pointer. +** * day - Pointer to where to store the day value +** * month - Pointer to where to store the month +** value +** * year - Pointer to where to store the year value +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuUtility_ScanDate(const unsigned char **str, uint8_t *day, uint8_t *month, uint16_t *year) +{ + /* precondition: string points to starting of date, e.g. "01.01.10" or "12.5.2010", and date is in format dd.mm.yy or dd.mm.yyyy */ + const unsigned char *p; + + p = *str; + while(*p==' ') { + p++; /* skip leading spaces */ + } + if ( McuUtility_ScanDecimal8uNumber(&p, day)==ERR_OK + && *day > 0 && *day <= 31 + && (*p=='.' || *p=='-') + ) + { + p++; + if ( McuUtility_ScanDecimal8uNumber(&p, month)==ERR_OK + && *month > 0 && *month <= 12 + && (*p=='.' || *p=='-') + ) + { + p++; + if ( McuUtility_ScanDecimal16uNumber(&p, year)==ERR_OK + && *year > 0 && *year <= 3000 /* hopefully this is enough :-) */ + ) + { + if (*year < 100) { + *year += 2000; /* transform '10' into '2010' */ + } + *str = p; /* advance pointer for caller */ + return ERR_OK; + } + } + } + *day = 0; + *month = 0; + *year = 0; + return ERR_FAILED; /* wrong format */ +} + +/* +** =================================================================== +** Method : ScanTime (component Utility) +** +** Description : +** Scans a time string in the format "hh:mm:ss,hh" with the +** part for the ",hh" is optional. +** Parameters : +** NAME - DESCRIPTION +** str - Pointer to the string to be scanned. The +** function advances the pointer. +** * hour - Pointer to where to store the hour value +** * minute - Pointer to where to store the minute +** value +** * second - Pointer to where to store the second +** value +** * hSecond - Pointer to scans the hundreds of +** second part. If not present in string, zero +** is stored +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuUtility_ScanTime(const unsigned char **str, uint8_t *hour, uint8_t *minute, uint8_t *second, uint8_t *hSecond) +{ + /* precondition: string points to starting of time string, e.g. "03:15:05" or "03:15:05,3" or "03:15:05,17", and time is in format hh:mm:ss[,hh] */ + const unsigned char *p; + #define SCAN_IS_DIGIT(ch) ((ch)>='0'&&(ch)<='9') + + *hour = 0; + *minute = 0; + *second = 0; + *hSecond = 0; + p = *str; + while(*p==' ') { + p++; /* skip leading spaces */ + } + if ( McuUtility_ScanDecimal8uNumber(&p, hour)==ERR_OK + && *hour <= 24 + && *p==':' + ) + { + p++; /* skip ':' */ + if ( McuUtility_ScanDecimal8uNumber(&p, minute)==ERR_OK + && *minute <= 60 + ) + { + if (*p==':') { /* there is more after the minute */ + p++; /* skip ':' */ + if ( McuUtility_ScanDecimal8uNumber(&p, second)==ERR_OK + && *second <= 60 + ) + { + if (*p==',') { /* we do have either ",z" or ",hh" */ + p++; /* skip ',' */ + if (SCAN_IS_DIGIT(*p)) { + if (SCAN_IS_DIGIT(*(p+1))) { /* ,hh format */ + *hSecond = (uint8_t)((*p-'0')*10 + *(p+1)-'0'); + return ERR_OK; + } else { /* ,z format */ + *hSecond = (uint8_t)((*p-'0')*10); + p++; + *str = p; /* advance pointer for caller */ + return ERR_OK; + } + } else { + return ERR_FAILED; /* illegal format, not a number, e.g. ",x" */ + } + } + *str = p; /* advance pointer for caller */ + return ERR_OK; + } + } else if (*p==' ' || *p=='\0') { /* nothing more after the minute? Assume zero seconds */ + *str = p; /* advance pointer for caller */ + return ERR_OK; + } + } + } + return ERR_FAILED; /* wrong format */ +} + +/* +** =================================================================== +** Method : ScanDecimal8uNumber (component Utility) +** +** Description : +** Scans a decimal 8bit unsigned number +** Parameters : +** NAME - DESCRIPTION +** str - String to scan. It returns as well until +** where it has scanned +** * val - Pointer to value +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuUtility_ScanDecimal8uNumber(const unsigned char **str, uint8_t *val) +{ + /* scans a decimal number, and stops at any non-number. Number can have any preceding zeros or spaces. */ + #define _8_NOF_DIGITS (3+1) + uint8_t nofDigits = _8_NOF_DIGITS; /* maximum number of digits to avoid overflow */ + const unsigned char *p = *str; + + while(*p==' ') { /* skip leading spaces */ + p++; + } + *val = 0; + while(*p>='0' && *p<='9' && nofDigits > 0) { + *val = (uint8_t)((*val)*10 + *p-'0'); + nofDigits--; + p++; + } /* while */ + if (nofDigits==0) { + return ERR_OVERFLOW; + } + if (nofDigits==_8_NOF_DIGITS) { /* no digits at all? */ + return ERR_FAILED; + } + *str = p; + return ERR_OK; +} + +/* +** =================================================================== +** Method : ScanDecimal8sNumber (component Utility) +** +** Description : +** Scans a decimal 8bit signed number +** Parameters : +** NAME - DESCRIPTION +** str - String to scan. It returns as well until +** where it has scanned +** * val - Pointer to value +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuUtility_ScanDecimal8sNumber(const unsigned char **str, signed char *val) +{ + /* Scans a decimal number, and stops at any non-number. Number can have any preceding spaces. */ + const unsigned char *p = *str; + bool isNeg; + uint8_t val8u; + uint8_t res; + + while(*p==' ') { /* skip leading spaces */ + p++; + } + *val = 0; + if (*p=='-') { + isNeg = TRUE; + p++; /* skip minus */ + } else { + isNeg = FALSE; + } + res = McuUtility_ScanDecimal8uNumber(&p, &val8u); + if (res != ERR_OK) { + return res; + } + if (isNeg) { + *val = (int8_t)(-(int8_t)val8u); + } else { + *val = (int8_t)val8u; + } + *str = p; + return ERR_OK; +} + +/* +** =================================================================== +** Method : ScanDecimal16uNumber (component Utility) +** +** Description : +** Scans a decimal 16bit unsigned number +** Parameters : +** NAME - DESCRIPTION +** str - String to scan. It returns as well until +** where it has scanned +** * val - Pointer to value +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuUtility_ScanDecimal16uNumber(const unsigned char **str, uint16_t *val) +{ + /* scans a decimal number, and stops at any non-number. Number can have any preceding zeros or spaces. */ + #define _16_NOF_DIGITS (5+1) + uint8_t nofDigits = _16_NOF_DIGITS; /* maximum number of digits to avoid overflow */ + const unsigned char *p = *str; + + while(*p==' ') { /* skip leading spaces */ + p++; + } + *val = 0; + while(*p>='0' && *p<='9' && nofDigits > 0) { + *val = (uint16_t)((*val)*10 + *p-'0'); + nofDigits--; + p++; + } /* while */ + if (nofDigits==0) { + return ERR_OVERFLOW; + } + if (nofDigits==_16_NOF_DIGITS) { /* no digits at all? */ + return ERR_FAILED; + } + *str = p; + return ERR_OK; +} + +/* +** =================================================================== +** Method : ScanDecimal16sNumber (component Utility) +** +** Description : +** Scans a decimal 16bit signed number +** Parameters : +** NAME - DESCRIPTION +** str - String to scan. It returns as well until +** where it has scanned +** * val - Pointer to value +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuUtility_ScanDecimal16sNumber(const unsigned char **str, int16_t *val) +{ + /* Scans a decimal number, and stops at any non-number. Number can have any preceding spaces. */ + const unsigned char *p = *str; + bool isNeg; + uint16_t val16u; + uint8_t res; + + while(*p==' ') { /* skip leading spaces */ + p++; + } + *val = 0; + if (*p=='-') { + isNeg = TRUE; + p++; /* skip minus */ + } else { + isNeg = FALSE; + } + res = McuUtility_ScanDecimal16uNumber(&p, (uint16_t*)&val16u); + if (res != ERR_OK) { + return res; + } + if (isNeg) { + *val = (int16_t)(-(int16_t)val16u); + } else { + *val = (int16_t)val16u; + } + *str = p; + return ERR_OK; +} + +/* +** =================================================================== +** Method : ScanDecimal32uNumber (component Utility) +** +** Description : +** Scans a decimal 32bit unsigned number +** Parameters : +** NAME - DESCRIPTION +** str - string to scan. It returns as well until +** where it has scanned +** * val - Pointer to value +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuUtility_ScanDecimal32uNumber(const unsigned char **str, uint32_t *val) +{ + /* scans a decimal number, and stops at any non-number. Number can have any preceding zeros or spaces. */ + #define _32_NOF_DIGITS (10+1) + uint8_t nofDigits = _32_NOF_DIGITS; /* maximum number of digits to avoid overflow */ + const unsigned char *p = *str; + + while(*p==' ') { /* skip leading spaces */ + p++; + } + *val = 0; + while(*p>='0' && *p<='9' && nofDigits > 0) { + *val = (uint32_t)((*val)*10 + *p-'0'); + nofDigits--; + p++; + } /* while */ + if (nofDigits==0) { + return ERR_OVERFLOW; + } + if (nofDigits==_32_NOF_DIGITS) { /* no digits at all? */ + return ERR_FAILED; + } + *str = p; + return ERR_OK; +} + +/* +** =================================================================== +** Method : ScanDecimal32sNumber (component Utility) +** +** Description : +** Scans a decimal 32bit signed number +** Parameters : +** NAME - DESCRIPTION +** str - string to scan. It returns as well until +** where it has scanned +** * val - Pointer to value +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuUtility_ScanDecimal32sNumber(const unsigned char **str, int32_t *val) +{ + /* Scans a decimal number, and stops at any non-number. Number can have any preceding spaces. */ + const unsigned char *p = *str; + bool isNeg; + uint32_t val32u; + uint8_t res; + + while(*p==' ') { /* skip leading spaces */ + p++; + } + *val = 0; + if (*p=='-') { + isNeg = TRUE; + p++; /* skip minus */ + } else { + isNeg = FALSE; + } + res = McuUtility_ScanDecimal32uNumber(&p, &val32u); + if (res != ERR_OK) { + return res; + } + if (isNeg) { + *val = (int32_t)(-(int32_t)val32u); + } else { + *val = (int32_t)val32u; + } + *str = p; + return ERR_OK; +} + +/* +** =================================================================== +** Method : ScanDecimal32sDotNumber (component Utility) +** +** Description : +** Scans a decimal 32bit signed number with a following dot +** (fractional part), e.g. "-34587.0248", it will return the +** (signed) integral and fractional part with number of +** fractional zeros. The function accepts as well numbers like +** "17" (no fractional part" or "17.0" +** Parameters : +** NAME - DESCRIPTION +** str - string to scan. It returns as well until +** where it has scanned +** * integral - Pointer to value before the dot +** * fractional - Pointer to value after the +** dot, e.g. 32 for "-134.0032" +** nofFractionalZeros - Number of +** fractional leading zeros, e.g. 2 for "-134. +** 0032" +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuUtility_ScanDecimal32sDotNumber(const unsigned char **str, int32_t *integral, uint32_t *fractional, uint8_t *nofFractionalZeros) +{ + /* scans e.g. "-3445.071" and returns -3445 in integral part, and 71 in fractional part */ + uint8_t res; + const unsigned char *p = *str; + + *integral = 0; + *fractional = 0; + *nofFractionalZeros = 0; + res = McuUtility_ScanDecimal32sNumber(&p, integral); + if (res != ERR_OK) { + return res; + } + if (*p=='.') { + p++; /* skip '.' */ + while (*p=='0') { /* count leading zeros */ + (*nofFractionalZeros)++; + p++; /* skip leading zero */ + } + if (*p>='0' && *p<='9') { /* number */ + res = McuUtility_ScanDecimal32uNumber(&p, fractional); + if (res != ERR_OK) { + return res; + } + } + } + *str = p; /* store parsing pointer */ + return ERR_OK; +} + +/* +** =================================================================== +** Method : strcmp (component Utility) +** +** Description : +** Wrapper to the standard strcmp() routine +** Parameters : +** NAME - DESCRIPTION +** * str1 - Pointer to string +** * str2 - Pointer to string +** Returns : +** --- - Returns zero if the two strings are the +** same +** =================================================================== +*/ +/*** +int16_t McuUtility_strcmp(const char *, const char *) +{ + Method is implemented as macro in the header file as wrapper to the standard strcmp() function +} +*/ + +/* +** =================================================================== +** Method : strncmp (component Utility) +** +** Description : +** Wrapper to the standard strncmp() routine +** Parameters : +** NAME - DESCRIPTION +** * str1 - Pointer to string +** * str2 - Pointer to string +** size - +** Returns : +** --- - Returns zero if the two strings are the +** same +** =================================================================== +*/ +/*** +int16_t McuUtility_strncmp(const char *, const char *, size_t size) +{ + /Method is implemented as macro in the header file as wrapper to the standard strncmp() function +} +*/ + +/* +** =================================================================== +** Method : strlen (component Utility) +** +** Description : +** Wrapper to the standard strlen() function. +** Parameters : +** NAME - DESCRIPTION +** str - +** Returns : +** --- - size of strinig +** =================================================================== +*/ +/*** +uint16_t McuUtility_strlen(const char *) +{ + Method is implemented as macro in the header file as wrapper to the standard strlen() function +} +*/ + +static bool isHexCharacter(unsigned char ch) { + /* returns TRUE if character is a hexadecimal character */ + return (ch>='0' && ch<='9') || (ch>='a' && ch<='f') || (ch>='A' && ch<='F'); +} + +static uint8_t PreScanHexNumber(const unsigned char **str) { + const unsigned char *p = *str; + + while(*p==' ') { /* skip leading spaces */ + p++; /* skip space */ + } + if (*p!='0') { /* must start with 0x */ + return ERR_FAILED; + } + p++; /* skip '0' */ + if (*p!='x') { /* must start with 0x */ + return ERR_FAILED; + } + p++; /* skip 'x' */ + *str = p; + return ERR_OK; +} + +static uint8_t HexToDec(const unsigned char **p, unsigned char *val) { + /* convert a hexadecimal character into a decimal value */ + unsigned char ch = **p; + + if (ch>='0' && ch<='9') { + *val = (unsigned char)(ch-'0'); + (*p)++; + return ERR_OK; + } else if (ch>='a' && ch<='f') { + *val = (unsigned char)(ch-'a'+10); + (*p)++; + return ERR_OK; + } else if (ch>='A' && ch<='F') { + *val = (unsigned char)(ch-'A'+10); + (*p)++; + return ERR_OK; + } + return ERR_FAILED; +} + +/* +** =================================================================== +** Method : ScanHex32uNumber (component Utility) +** +** Description : +** Scans a hexadecimal 32bit number, starting with 0x +** Parameters : +** NAME - DESCRIPTION +** str - String to scan, starting with 0x. It +** returns as well until where it has scanned +** * val - Pointer to value +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuUtility_ScanHex32uNumber(const unsigned char **str, uint32_t *val) +{ + /* scans a decimal number, and stops at any non-number. Number can have any preceding zeros or spaces. */ + uint8_t nofDigits = 8; /* maximum number of digits to avoid overflow */ + const unsigned char *p = *str; + uint8_t v; + + *val = 0; + if (PreScanHexNumber(&p)!=ERR_OK) { /* skip leading spaces, and scan '0x' */ + return ERR_FAILED; + } + if (!isHexCharacter(*p)) { /* not a valid hex number sequence */ + return ERR_FAILED; + } + while (nofDigits>0 && HexToDec(&p, &v)==ERR_OK) { + *val = (uint32_t)((*val)*16 + v); + nofDigits--; + } /* while */ + *str = p; + return ERR_OK; +} + +/* +** =================================================================== +** Method : ScanHex16uNumber (component Utility) +** +** Description : +** Scans a hexadecimal 16bit number, starting with 0x +** Parameters : +** NAME - DESCRIPTION +** str - String to scan, starting with 0x.. It +** returns as well until where it has scanned +** * val - Pointer to value +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuUtility_ScanHex16uNumber(const unsigned char **str, uint16_t *val) +{ + /* scans a decimal number, and stops at any non-number. Number can have any preceding zeros or spaces. */ + uint8_t nofDigits = 4; /* maximum number of digits to read */ + const unsigned char *p = *str; + uint8_t v; + + *val = 0; + if (PreScanHexNumber(&p)!=ERR_OK) { /* skip leading spaces, and scan '0x' */ + return ERR_FAILED; + } + if (!isHexCharacter(*p)) { /* not a valid hex number sequence */ + return ERR_FAILED; + } + while (nofDigits>0 && HexToDec(&p, &v)==ERR_OK) { + *val = (uint16_t)((*val)*16 + v); + nofDigits--; + } /* while */ + *str = p; + return ERR_OK; +} + +/* +** =================================================================== +** Method : ScanHex8uNumber (component Utility) +** +** Description : +** Scans a hexadecimal 8bit number, starting with 0x +** Parameters : +** NAME - DESCRIPTION +** str - String to scan, starting with 0x. It +** returns as well until where it has scanned +** * val - Pointer to value +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuUtility_ScanHex8uNumber(const unsigned char **str, uint8_t *val) +{ + /* scans a hex number with 0x, and stops at any non-number. Number can have any preceding zeros or spaces. */ + uint8_t nofDigits = 2; /* maximum number of digits to read */ + const unsigned char *p = *str; + uint8_t v; + + *val = 0; + if (PreScanHexNumber(&p)!=ERR_OK) { /* skip leading spaces, and scan '0x' */ + return ERR_FAILED; + } + if (!isHexCharacter(*p)) { /* not a valid hex number sequence */ + return ERR_FAILED; + } + while (nofDigits>0 && HexToDec(&p, &v)==ERR_OK) { + *val = (uint8_t)((*val)*16 + v); + nofDigits--; + } /* while */ + *str = p; + return ERR_OK; +} + +/* +** =================================================================== +** Method : ScanHex8uNumberNoPrefix (component Utility) +** +** Description : +** Scans a hexadecimal 8bit number, without 0x +** Parameters : +** NAME - DESCRIPTION +** str - String to scan, starting with 0x. It +** returns as well until where it has scanned +** * val - Pointer to value +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuUtility_ScanHex8uNumberNoPrefix(const unsigned char **str, uint8_t *val) +{ + /* scans a hex number without 0x, and stops at any non-number. Number can have any preceding zeros or spaces. */ + uint8_t nofDigits = 2; /* maximum number of digits to read */ + const unsigned char *p = *str; + uint8_t v; + + *val = 0; + while(*p==' ') { /* skip leading spaces */ + p++; /* skip space */ + } + if (!isHexCharacter(*p)) { /* not a valid hex number sequence */ + return ERR_FAILED; + } + while (nofDigits>0 && HexToDec(&p, &v)==ERR_OK) { + *val = (uint8_t)((*val)*16 + v); + nofDigits--; + } /* while */ + *str = p; + return ERR_OK; +} + +/* +** =================================================================== +** Method : strtailcmp (component Utility) +** +** Description : +** Compares the tail of a string and returns 0 if it matches, 1 +** otherwise +** Parameters : +** NAME - DESCRIPTION +** * str - Pointer to string. This string is compared +** if it contains the tail. +** * tail - Pointer to tail string. +** Returns : +** --- - returns 0 if tail matches, -1 otherwise +** =================================================================== +*/ +uint8_t McuUtility_strtailcmp(const uint8_t *str, const uint8_t *tail) +{ + int i, j; + + i = (int)McuUtility_strlen((char*)str); + j = (int)McuUtility_strlen((char*)tail); + if (j>i) { /* str is smaller than tail */ + return 1; /* cannot match */ + } + /* compare strings */ + while(str[i]==tail[j]) { + i--; + j--; + if (j<0) { + return 0; /* match */ + } + } + return 1; /* !=0 means no match */ +} + +/* +** =================================================================== +** Method : strCutTail (component Utility) +** +** Description : +** Removes a tailing substring from a string. The string passed +** will be modified (the tail is cut by writing a zero byte to +** the string!) +** Parameters : +** NAME - DESCRIPTION +** * str - Pointer to string where to remove the tail +** * tail - Pointer to substring to remove +** Returns : +** --- - Error code, ERR_OK if no error, otherwise +** ERR_FAIL if tail is not found +** =================================================================== +*/ +uint8_t McuUtility_strCutTail(uint8_t *str, uint8_t *tail) +{ + /* cut the tail from the string */ + size_t strLen, tailLen; + + if (McuUtility_strtailcmp(str, tail)!=0) { /* check if tail is present */ + return ERR_FAILED; /* tail not found */ + } + tailLen = McuUtility_strlen((char*)tail); + strLen = McuUtility_strlen((char*)str); + /* write \0 to cut the tail */ + str[strLen-tailLen] = '\0'; + return ERR_OK; +} + +/* +** =================================================================== +** Method : strcatNum32sDotValue100 (component Utility) +** +** Description : +** Appends a 32bit signed value to a string buffer. The value +** is in 1/100 units. For example for the value -13456 it will +** append the string "-134.56" +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** num - Value to convert. +** Returns : Nothing +** =================================================================== +*/ +void McuUtility_strcatNum32sDotValue100(uint8_t *dst, size_t dstSize, int32_t num) +{ + if (num<0 && (num/100)==0) { /* e.g. -53 ==> write sign, as strcatNum32() below will not know that it is negative */ + McuUtility_chcat(dst, dstSize, '-'); + } + McuUtility_strcatNum32s(dst, dstSize, num/100); + McuUtility_chcat(dst, dstSize, '.'); + if (num<0) { + num = -num; + } + McuUtility_strcatNum16uFormatted(dst, dstSize, (uint16_t)((unsigned)num%100U), '0', 2); +} + +/* +** =================================================================== +** Method : strFind (component Utility) +** +** Description : +** Searches a substring inside a string and returns the +** position. +** Parameters : +** NAME - DESCRIPTION +** * str - Pointer to string which will be searched +** * subStr - Pointer to substring to search +** inside str +** Returns : +** --- - -1 if not found, otherwise the character +** index. +** =================================================================== +*/ +int16_t McuUtility_strFind(uint8_t *str, uint8_t *subStr) +{ + int16_t i, len; + + len = (int16_t)McuUtility_strlen((char*)subStr); + for (i=0; *str!='\0'; i++, str++) { + if (McuUtility_strncmp((char*)str, (char*)subStr, len)==0) { + return i; /* found */ + } + } + return -1; /* not found */ +} + +/* +** =================================================================== +** Method : ScanSeparatedNumbers (component Utility) +** +** Description : +** Scans multiple numbers separated by character, e.g. "123.68. +** 5.3" +** Parameters : +** NAME - DESCRIPTION +** str - String to scan. It returns as well until +** where it has scanned +** * values - Pointer to array where to store the +** values +** nofValues - Number of values in the array +** separator - Character separator, e.g. '.' +** numberType - type of number to scan +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuUtility_ScanSeparatedNumbers(const unsigned char **str, uint8_t *values, uint8_t nofValues, char separator, McuUtility_SeparatedNumberType numberType) +{ + int i; + uint8_t res; + const unsigned char *p; + + if (nofValues<=1) { + return ERR_FAILED; /* need at least two values */ + } + p = *str; + for(i=0;i0) { + *buf++ = *p++; + bufSize--; + } + if (*p!='\"') { + return ERR_FAILED; /* no terminating double quote */ + } else { + p++; /* skip double quote */ + *buf = '\0'; /* terminate buffer */ + } + *cmd = p; /* advance pointer */ + return ERR_OK; +} + +/* +** =================================================================== +** Method : strcatPad (component Utility) +** +** Description : +** Same as normal strcat, but safe as it does not write beyond +** the buffer. The buffer will be filled with a pad character +** for a given length. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** * src - Pointer to source string. +** padChar - Character to be used for padding +** srcPadSize - To which size the src string +** has to be padded. +** Returns : Nothing +** =================================================================== +*/ +void McuUtility_strcatPad(uint8_t *dst, size_t dstSize, const unsigned char *src, char padChar, uint8_t srcPadSize) +{ + uint8_t *p; + size_t nof = 0; + + if (dstSize<2) { + return; /* hmm, really to small for anything than the zero byte? */ + } + p = dst; + while(*p != '\0') { /* find end of string */ + p++; + nof++; + } + McuUtility_strcat(dst+nof, dstSize-nof, src); /* add string */ + dstSize -= nof; + while(*p != '\0' && srcPadSize>0 && dstSize>1) { + p++; + srcPadSize--; + dstSize--; + } + while(srcPadSize>0 && dstSize>1) { + *p++ = padChar; /* add padding char */ + srcPadSize--; + dstSize--; + } + *p = '\0'; /* terminate string */ +} + +/* +** =================================================================== +** Method : NumFloatToStr (component Utility) +** +** Description : +** Converts a float value into a string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to be converted. +** nofFracDigits - Number of fractional +** digits to print +** Returns : Nothing +** =================================================================== +*/ +void McuUtility_NumFloatToStr(uint8_t *dst, size_t dstSize, float val, uint8_t nofFracDigits) +{ + uint32_t integral; + uint32_t fractional, shift; + int i; + bool isNeg; + + isNeg = (bool)(val<0); + if (isNeg) { + val = -val; /* make it positive */ + } + integral = (uint32_t)(int32_t)val; + val = val-(float)integral; /* get rid of integral part */ + shift = 1; + for(i=0;i0) { + McuUtility_chcat(dst, dstSize, '.'); + McuUtility_strcatNum32uFormatted(dst, dstSize, fractional, '0', nofFracDigits); + } +} + +/* +** =================================================================== +** Method : strcatNumFloat (component Utility) +** +** Description : +** Converts a float value into a string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to be converted. +** nofFracDigits - Number of factional +** digits to print +** Returns : Nothing +** =================================================================== +*/ +void McuUtility_strcatNumFloat(uint8_t *dst, size_t dstSize, float val, uint8_t nofFracDigits) +{ + uint8_t buf[32]; + + McuUtility_NumFloatToStr(buf, sizeof(buf), val, nofFracDigits); + McuUtility_strcat(dst, dstSize, buf); +} + +/* +** =================================================================== +** Method : GetValue16LE (component Utility) +** +** Description : +** Returns a 16bit Little Endian value from memory +** Parameters : +** NAME - DESCRIPTION +** * dataP - Pointer to memory +** Returns : +** --- - Error code +** =================================================================== +*/ +uint16_t McuUtility_GetValue16LE(uint8_t *dataP) +{ + return (uint16_t)((dataP[1]<<8)+(dataP[0])); +} + +/* +** =================================================================== +** Method : GetValue24LE (component Utility) +** +** Description : +** Returns a 24bit Little Endian value from memory +** Parameters : +** NAME - DESCRIPTION +** * dataP - Pointer to memory +** Returns : +** --- - Error code +** =================================================================== +*/ +uint32_t McuUtility_GetValue24LE(uint8_t *dataP) +{ + return (uint32_t)(((uint32_t)dataP[2])<<16)+(dataP[1]<<8)+(dataP[0]); +} + +/* +** =================================================================== +** Method : GetValue32LE (component Utility) +** +** Description : +** Returns a 32bit Little Endian value from memory +** Parameters : +** NAME - DESCRIPTION +** * dataP - Pointer to memory +** Returns : +** --- - Error code +** =================================================================== +*/ +uint32_t McuUtility_GetValue32LE(uint8_t *dataP) +{ + return (uint32_t)(((uint32_t)dataP[3])<<24)+(((uint32_t)dataP[2])<<16)+(dataP[1]<<8)+(dataP[0]); +} + +/* +** =================================================================== +** Method : SetValue16LE (component Utility) +** +** Description : +** Stores a 16bit value in memory as Little Endian +** Parameters : +** NAME - DESCRIPTION +** data - Value to store +** * dataP - Pointer to memory +** Returns : Nothing +** =================================================================== +*/ +void McuUtility_SetValue16LE(uint16_t data, uint8_t *dataP) +{ + dataP[0] = (uint8_t)(data&0xff); /* LSB */ + dataP[1] = (uint8_t)((data>>8)&0xff); /* MSB */ +} + +/* +** =================================================================== +** Method : SetValue24LE (component Utility) +** +** Description : +** Stores a 24bit value in memory as Little Endian +** Parameters : +** NAME - DESCRIPTION +** data - Value to store +** * dataP - Pointer to memory +** Returns : Nothing +** =================================================================== +*/ +void McuUtility_SetValue24LE(uint32_t data, uint8_t *dataP) +{ + dataP[0] = (uint8_t)(data&0xff); /* LSB */ + dataP[1] = (uint8_t)((data>>8)&0xff); + dataP[2] = (uint8_t)((data>>16)&0xff); +} + +/* +** =================================================================== +** Method : SetValue32LE (component Utility) +** +** Description : +** Stores a 32bit value in memory as Little Endian +** Parameters : +** NAME - DESCRIPTION +** data - Value to store +** * dataP - Pointer to memory +** Returns : Nothing +** =================================================================== +*/ +void McuUtility_SetValue32LE(uint32_t data, uint8_t *dataP) +{ + dataP[0] = (uint8_t)(data&0xff); /* LSB */ + dataP[1] = (uint8_t)((data>>8)&0xff); + dataP[2] = (uint8_t)((data>>16)&0xff); + dataP[3] = (uint8_t)((data>>24)&0xff); +} + +/* +** =================================================================== +** Method : Deinit (component Utility) +** +** Description : +** Driver De-Initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuUtility_Deinit(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Init (component Utility) +** +** Description : +** Driver Initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuUtility_Init(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : map (component Utility) +** +** Description : +** Maps a value from one range to another +** Parameters : +** NAME - DESCRIPTION +** x - value to be mapped +** in_min - input range minimum value +** in_max - input range maximum value +** out_min - output range minimum value +** out_max - output range maximum value +** Returns : +** --- - remapped value +** =================================================================== +*/ +int32_t McuUtility_map(int32_t x, int32_t in_min, int32_t in_max, int32_t out_min, int32_t out_max) +{ +#if 0 /* original Arduino implementation */ + return (x-in_min)*(out_max-out_min)/(in_max-in_min)+out_min; +#else /* improved version, see https://github.com/arduino/Arduino/issues/2466 */ + if ((in_max - in_min) > (out_max - out_min)) { + return (x - in_min) * (out_max - out_min+1) / (in_max - in_min+1) + out_min; + } else { + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; + } +#endif +} + +/* +** =================================================================== +** Method : constrain (component Utility) +** +** Description : +** Makes sure that a given input value is inside a given range. +** Parameters : +** NAME - DESCRIPTION +** val - input value +** min - range minimum value +** max - range maximum value +** Returns : +** --- - the constrained value +** =================================================================== +*/ +int32_t McuUtility_constrain(int32_t val, int32_t min, int32_t max) +{ + if (valmax) { + return max; + } + return val; +} + +/* +** =================================================================== +** Method : random (component Utility) +** +** Description : +** Provides a random value. You have to call intialize the +** random number generator with randomSetSeed() first! +** Parameters : +** NAME - DESCRIPTION +** min - range minimum value +** max - range maximum value +** Returns : +** --- - random value between min and max +** =================================================================== +*/ +int32_t McuUtility_random(int32_t min, int32_t max) +{ + int32_t val; + + val = rand()%(max-min+1)+min; + return McuUtility_constrain(val, min, max); +} + +/* +** =================================================================== +** Method : randomSetSeed (component Utility) +** +** Description : +** Sets a seed for the random number generator +** Parameters : +** NAME - DESCRIPTION +** seed - seed to be used for random number +** generator +** Returns : Nothing +** =================================================================== +*/ +void McuUtility_randomSetSeed(unsigned int seed) +{ + srand(seed); /* set random number generator seed */ +} + +/* +** =================================================================== +** Method : map64 (component Utility) +** +** Description : +** Maps a value from one range to another, using 64bit math +** Parameters : +** NAME - DESCRIPTION +** x - value to be mapped +** in_min - input range minimum value +** in_max - input range maximum value +** out_min - output range maximum value +** out_max - +** Returns : +** --- - remapped value +** =================================================================== +*/ +#ifdef __GNUC__ /* HIWARE compiler does not support 64bit data types */ +int64_t McuUtility_map64(int64_t x, int64_t in_min, int64_t in_max, int64_t out_min, int64_t out_max) +{ + if ((in_max - in_min) > (out_max - out_min)) { + return (x - in_min) * (out_max - out_min+1) / (in_max - in_min+1) + out_min; + } else { + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; + } +} +#endif + +/* +** =================================================================== +** Method : strcatNumHex (component Utility) +** +** Description : +** Appends a value as hex valalue to a string buffer as hex +** number (without a 0x prefix), with variable number of digits +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** num - Value to convert. +** nofBytes - Number of bytes to write +** Returns : Nothing +** =================================================================== +*/ +void McuUtility_strcatNumHex(uint8_t *dst, size_t dstSize, uint32_t num, uint8_t nofBytes) +{ + if (nofBytes==1) { + McuUtility_strcatNum8Hex(dst, dstSize, (uint8_t)num); + } else if (nofBytes==2) { + McuUtility_strcatNum16Hex(dst, dstSize, (uint16_t)num); + } else if (nofBytes==3) { + McuUtility_strcatNum24Hex(dst, dstSize, num); + } else { /* nofBytes==4 */ + McuUtility_strcatNum32Hex(dst, dstSize, num); + } +} + +/* +** =================================================================== +** Method : ScanRGB (component Utility) +** +** Description : +** Scans a RGB value and stores it in r, g and b. String can be +** a single hex number (0x120506) or three decimal values (18 5 +** 6) +** Parameters : +** NAME - DESCRIPTION +** str - String to scan +** * r - Pointer to red value +** * g - Pointer to green value +** * b - Pointer to blue value +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuUtility_ScanRGB(const unsigned char **str, uint8_t *r, uint8_t *g, uint8_t *b) +{ + const unsigned char *p; + int32_t val32; + int32_t rv, gv, bv; + + p = *str; + while(*p==' ') { + p++; /* skip leading spaces */ + } + if ( *p=='0' && *(p+1)=='x' /* hexadecimal, read single number */ + && McuUtility_xatoi(&p, &val32)==ERR_OK + && val32 <= 0xffffff + ) + { + *r = (uint8_t)((val32>>16)&0xff); + *g = (uint8_t)((val32>>8)&0xff); + *b = (uint8_t)(val32&0xff); + *str = p; + return ERR_OK; + } else { /* not starting with 0x (hex): read three values */ + if ( McuUtility_xatoi(&p, &rv)==ERR_OK && rv>=0 && rv<=0xff + && McuUtility_xatoi(&p, &gv)==ERR_OK && gv>=0 && gv<=0xff + && McuUtility_xatoi(&p, &bv)==ERR_OK && bv>=0 && bv<=0xff + ) + { + *r = (uint8_t)rv; + *g = (uint8_t)gv; + *b = (uint8_t)bv; + *str = p; + return ERR_OK; + } + } + return ERR_FAILED; +} + +/* +** =================================================================== +** Method : ScanWRGB (component Utility) +** +** Description : +** Scans a WRGB value and stores it in r, g, b and w. String +** can be a single hex number (0x12050608) or three decimal +** values (18 5 6 8) +** Parameters : +** NAME - DESCRIPTION +** str - String to scan +** * w - Pointer to white value +** * r - Pointer to red value +** * g - Pointer to green value +** * b - Pointer to blue value +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuUtility_ScanWRGB(const unsigned char **str, uint8_t *w, uint8_t *r, uint8_t *g, uint8_t *b) +{ + const unsigned char *p; + int32_t val32; + int32_t rv, gv, bv, wv; + + p = *str; + while(*p==' ') { + p++; /* skip leading spaces */ + } + if ( *p=='0' && *(p+1)=='x' /* hexadecimal, read single number */ + && McuUtility_xatoi(&p, &val32)==ERR_OK + ) + { + *w = (uint8_t)((val32>>24)&0xff); + *r = (uint8_t)((val32>>16)&0xff); + *g = (uint8_t)((val32>>8)&0xff); + *b = (uint8_t)(val32&0xff); + *str = p; + return ERR_OK; + } else { /* not starting with 0x (hex): read three values */ + if ( McuUtility_xatoi(&p, &rv)==ERR_OK && rv>=0 && rv<=0xff + && McuUtility_xatoi(&p, &gv)==ERR_OK && gv>=0 && gv<=0xff + && McuUtility_xatoi(&p, &bv)==ERR_OK && bv>=0 && bv<=0xff + && McuUtility_xatoi(&p, &wv)==ERR_OK && wv>=0 && wv<=0xff + ) + { + *w = (uint8_t)wv; + *r = (uint8_t)rv; + *g = (uint8_t)gv; + *b = (uint8_t)bv; + *str = p; + return ERR_OK; + } + } + return ERR_FAILED; +} + +/* +** =================================================================== +** Method : ScanRGB32 (component Utility) +** +** Description : +** Scans a RGB value and stores it in a single 32bit value. +** String can be a single hex number (0x120506) or three +** decimal values (18 5 6) +** Parameters : +** NAME - DESCRIPTION +** str - String to scan +** * rgb - Pointer to rgb value +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuUtility_ScanRGB32(const unsigned char **str, uint32_t *rgb) +{ + uint8_t res, r, g, b; + + res = McuUtility_ScanRGB(str, &r, &g, &b); + if (res==ERR_OK) { + *rgb = ((uint32_t)r<<16)|((uint32_t)g<<8)|b; + return ERR_OK; + } + return ERR_FAILED; +} + +/* +** =================================================================== +** Method : ScanWRGB32 (component Utility) +** +** Description : +** Scans a WRGB value and stores it in a single 32bit value. +** String can be a single hex number (0x12050608) or three +** decimal values (18 5 6 8) +** Parameters : +** NAME - DESCRIPTION +** str - String to scan +** * rgbw - Pointer to wrgb value +** Returns : +** --- - Error code +** =================================================================== +*/ +uint8_t McuUtility_ScanWRGB32(const unsigned char **str, uint32_t *rgbw) +{ + uint8_t res, r, g, b, w; + + res = McuUtility_ScanWRGB(str, &w, &r, &g, &b); + if (res==ERR_OK) { + *rgbw = ((uint32_t)w<<24)|((uint32_t)r<<16)|((uint32_t)g<<8)|b; + return ERR_OK; + } + return ERR_FAILED; +} + +/* +** =================================================================== +** Method : SkipSpaces (component Utility) +** +** Description : +** Skips spaces +** Parameters : +** NAME - DESCRIPTION +** * str - Pointer to string to scan. Returns until +** where it has scanned. +** Returns : Nothing +** =================================================================== +*/ +void McuUtility_SkipSpaces(const unsigned char **str) +{ + while(**str == ' ') { + (*str)++; /* skip space */ + } +} + +/* END McuUtility. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuUtility.h b/TSM_PicoW_Sensor/McuLib/src/McuUtility.h new file mode 100644 index 0000000..df6f62c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuUtility.h @@ -0,0 +1,1519 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuUtility.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : Utility +** Version : Component 01.172, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-09, 10:10, # CodeGen: 829 +** Abstract : +** Contains various utility functions. +** Settings : +** Component name : McuUtility +** Contents : +** SkipSpaces - void McuUtility_SkipSpaces(const unsigned char **str); +** strcpy - void McuUtility_strcpy(uint8_t *dst, size_t dstSize, const unsigned char *src); +** strcat - void McuUtility_strcat(uint8_t *dst, size_t dstSize, const unsigned char *src); +** strcatPad - void McuUtility_strcatPad(uint8_t *dst, size_t dstSize, const unsigned char... +** chcat - void McuUtility_chcat(uint8_t *dst, size_t dstSize, uint8_t ch); +** Num8sToStr - void McuUtility_Num8sToStr(uint8_t *dst, size_t dstSize, signed char val); +** Num8uToStr - void McuUtility_Num8uToStr(uint8_t *dst, size_t dstSize, uint8_t val); +** Num16sToStr - void McuUtility_Num16sToStr(uint8_t *dst, size_t dstSize, int16_t val); +** Num16uToStr - void McuUtility_Num16uToStr(uint8_t *dst, size_t dstSize, uint16_t val); +** Num32uToStr - void McuUtility_Num32uToStr(uint8_t *dst, size_t dstSize, uint32_t val); +** Num32sToStr - void McuUtility_Num32sToStr(uint8_t *dst, size_t dstSize, int32_t val); +** NumFloatToStr - void McuUtility_NumFloatToStr(uint8_t *dst, size_t dstSize, float val,... +** Num16sToStrFormatted - void McuUtility_Num16sToStrFormatted(uint8_t *dst, size_t dstSize, int16_t... +** Num16uToStrFormatted - void McuUtility_Num16uToStrFormatted(uint8_t *dst, size_t dstSize, uint16_t... +** Num32uToStrFormatted - void McuUtility_Num32uToStrFormatted(uint8_t *dst, size_t dstSize, uint32_t... +** Num32sToStrFormatted - void McuUtility_Num32sToStrFormatted(uint8_t *dst, size_t dstSize, int32_t... +** strcatNum8u - void McuUtility_strcatNum8u(uint8_t *dst, size_t dstSize, uint8_t val); +** strcatNum8s - void McuUtility_strcatNum8s(uint8_t *dst, size_t dstSize, signed char val); +** strcatNum16u - void McuUtility_strcatNum16u(uint8_t *dst, size_t dstSize, uint16_t val); +** strcatNum16s - void McuUtility_strcatNum16s(uint8_t *dst, size_t dstSize, int16_t val); +** strcatNum32u - void McuUtility_strcatNum32u(uint8_t *dst, size_t dstSize, uint32_t val); +** strcatNum32s - void McuUtility_strcatNum32s(uint8_t *dst, size_t dstSize, int32_t val); +** strcatNum16uFormatted - void McuUtility_strcatNum16uFormatted(uint8_t *dst, size_t dstSize, uint16_t... +** strcatNum16sFormatted - void McuUtility_strcatNum16sFormatted(uint8_t *dst, size_t dstSize, int16_t... +** strcatNum32uFormatted - void McuUtility_strcatNum32uFormatted(uint8_t *dst, size_t dstSize, uint32_t... +** strcatNum32sFormatted - void McuUtility_strcatNum32sFormatted(uint8_t *dst, size_t dstSize, int32_t... +** strcatNumHex - void McuUtility_strcatNumHex(uint8_t *dst, size_t dstSize, uint32_t num,... +** strcatNum8Hex - void McuUtility_strcatNum8Hex(uint8_t *dst, size_t dstSize, uint8_t num); +** strcatNum16Hex - void McuUtility_strcatNum16Hex(uint8_t *dst, size_t dstSize, uint16_t num); +** strcatNum24Hex - void McuUtility_strcatNum24Hex(uint8_t *dst, size_t dstSize, uint32_t num); +** strcatNum32Hex - void McuUtility_strcatNum32Hex(uint8_t *dst, size_t dstSize, uint32_t num); +** strcatNum32sDotValue100 - void McuUtility_strcatNum32sDotValue100(uint8_t *dst, size_t dstSize, int32_t... +** strcatNumFloat - void McuUtility_strcatNumFloat(uint8_t *dst, size_t dstSize, float val,... +** IsLeapYear - bool McuUtility_IsLeapYear(uint16_t year); +** WeekDay - uint8_t McuUtility_WeekDay(uint16_t year, uint8_t month, uint8_t day); +** ReadEscapedName - uint8_t McuUtility_ReadEscapedName(const unsigned char *filename, uint8_t... +** xatoi - uint8_t McuUtility_xatoi(const unsigned char **str, int32_t *res); +** ScanDate - uint8_t McuUtility_ScanDate(const unsigned char **str, uint8_t *day, uint8_t... +** ScanTime - uint8_t McuUtility_ScanTime(const unsigned char **str, uint8_t *hour, uint8_t... +** ScanDecimal8uNumber - uint8_t McuUtility_ScanDecimal8uNumber(const unsigned char **str, uint8_t *val); +** ScanDecimal8sNumber - uint8_t McuUtility_ScanDecimal8sNumber(const unsigned char **str, signed char... +** ScanDecimal16uNumber - uint8_t McuUtility_ScanDecimal16uNumber(const unsigned char **str, uint16_t... +** ScanDecimal16sNumber - uint8_t McuUtility_ScanDecimal16sNumber(const unsigned char **str, int16_t... +** ScanDecimal32uNumber - uint8_t McuUtility_ScanDecimal32uNumber(const unsigned char **str, uint32_t... +** ScanDecimal32sNumber - uint8_t McuUtility_ScanDecimal32sNumber(const unsigned char **str, int32_t... +** ScanDecimal32sDotNumber - uint8_t McuUtility_ScanDecimal32sDotNumber(const unsigned char **str, int32_t... +** ScanHex8uNumber - uint8_t McuUtility_ScanHex8uNumber(const unsigned char **str, uint8_t *val); +** ScanHex8uNumberNoPrefix - uint8_t McuUtility_ScanHex8uNumberNoPrefix(const unsigned char **str, uint8_t... +** ScanHex16uNumber - uint8_t McuUtility_ScanHex16uNumber(const unsigned char **str, uint16_t *val); +** ScanHex32uNumber - uint8_t McuUtility_ScanHex32uNumber(const unsigned char **str, uint32_t *val); +** ScanSeparatedNumbers - uint8_t McuUtility_ScanSeparatedNumbers(const unsigned char **str, uint8_t... +** ScanDoubleQuotedString - uint8_t McuUtility_ScanDoubleQuotedString(const uint8_t **cmd, uint8_t *buf,... +** ScanRGB - uint8_t McuUtility_ScanRGB(const unsigned char **str, uint8_t *r, uint8_t *g,... +** ScanWRGB - uint8_t McuUtility_ScanWRGB(const unsigned char **str, uint8_t *w, uint8_t... +** ScanRGB32 - uint8_t McuUtility_ScanRGB32(const unsigned char **str, uint32_t *rgb); +** ScanWRGB32 - uint8_t McuUtility_ScanWRGB32(const unsigned char **str, uint32_t *rgbw); +** strcmp - int16_t McuUtility_strcmp(const char *, const char *); +** strncmp - int16_t McuUtility_strncmp(const char *, const char *, size_t size); +** strFind - int16_t McuUtility_strFind(uint8_t *str, uint8_t *subStr); +** strtailcmp - uint8_t McuUtility_strtailcmp(const uint8_t *str, const uint8_t *tail); +** strlen - uint16_t McuUtility_strlen(const char *); +** strCutTail - uint8_t McuUtility_strCutTail(uint8_t *str, uint8_t *tail); +** GetValue16LE - uint16_t McuUtility_GetValue16LE(uint8_t *dataP); +** GetValue24LE - uint32_t McuUtility_GetValue24LE(uint8_t *dataP); +** GetValue32LE - uint32_t McuUtility_GetValue32LE(uint8_t *dataP); +** SetValue16LE - void McuUtility_SetValue16LE(uint16_t data, uint8_t *dataP); +** SetValue24LE - void McuUtility_SetValue24LE(uint32_t data, uint8_t *dataP); +** SetValue32LE - void McuUtility_SetValue32LE(uint32_t data, uint8_t *dataP); +** map - int32_t McuUtility_map(int32_t x, int32_t in_min, int32_t in_max, int32_t... +** map64 - int64_t McuUtility_map64(int64_t x, int64_t in_min, int64_t in_max, int64_t... +** constrain - int32_t McuUtility_constrain(int32_t val, int32_t min, int32_t max); +** random - int32_t McuUtility_random(int32_t min, int32_t max); +** randomSetSeed - void McuUtility_randomSetSeed(unsigned int seed); +** Deinit - void McuUtility_Deinit(void); +** Init - void McuUtility_Init(void); +** +** * Copyright (c) 2014-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuUtility.h +** @version 01.00 +** @brief +** Contains various utility functions. +*/ +/*! +** @addtogroup McuUtility_module McuUtility module documentation +** @{ +*/ + +#ifndef __McuUtility_H +#define __McuUtility_H + +/* MODULE McuUtility. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuUtilityconfig.h" /* configuration */ + +/* other includes needed */ +#include +#include /* for size_t */ +/* special version */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + McuUtility_SEP_NUM_TYPE_UINT8, /* uint8_t number type */ + McuUtility_SEP_NUM_TYPE_UINT8_HEX_NO_PREFIX /* uint8_t hex number type, no 0x prefix */ +} McuUtility_SeparatedNumberType; + +void McuUtility_strcpy(uint8_t *dst, size_t dstSize, const unsigned char *src); +/* +** =================================================================== +** Method : strcpy (component Utility) +** +** Description : +** Same as normal strcpy, but safe as it does not write beyond +** the buffer. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** * src - Pointer to source string. +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_strcat(uint8_t *dst, size_t dstSize, const unsigned char *src); +/* +** =================================================================== +** Method : strcat (component Utility) +** +** Description : +** Same as normal strcat, but safe as it does not write beyond +** the buffer. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** * src - Pointer to source string. +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_Num16sToStr(uint8_t *dst, size_t dstSize, int16_t val); +/* +** =================================================================== +** Method : Num16sToStr (component Utility) +** +** Description : +** Converts a signed 16bit value into a string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to be converted. +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_Num16sToStrFormatted(uint8_t *dst, size_t dstSize, int16_t val, char fill, uint8_t nofFill); +/* +** =================================================================== +** Method : Num16sToStrFormatted (component Utility) +** +** Description : +** Converts a 16bit signed value to string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** fill - Fill character +** nofFill - Number of fill characters +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_strcatNum16s(uint8_t *dst, size_t dstSize, int16_t val); +/* +** =================================================================== +** Method : strcatNum16s (component Utility) +** +** Description : +** Appends a 16bit signed value to a string buffer. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_strcatNum16sFormatted(uint8_t *dst, size_t dstSize, int16_t val, char fill, uint8_t nofFill); +/* +** =================================================================== +** Method : strcatNum16sFormatted (component Utility) +** +** Description : +** Appends a 16bit signed value to a string buffer in a +** formatted way. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** fill - Fill character +** nofFill - Number of fill characters +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_strcatNum8Hex(uint8_t *dst, size_t dstSize, uint8_t num); +/* +** =================================================================== +** Method : strcatNum8Hex (component Utility) +** +** Description : +** Appends a 8bit unsigned value to a string buffer as hex +** number (without a 0x prefix). +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** num - Value to convert. +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_strcatNum16Hex(uint8_t *dst, size_t dstSize, uint16_t num); +/* +** =================================================================== +** Method : strcatNum16Hex (component Utility) +** +** Description : +** Appends a 16bit unsigned value to a string buffer as hex +** number (without a 0x prefix). +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** num - Value to convert. +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_strcatNum32s(uint8_t *dst, size_t dstSize, int32_t val); +/* +** =================================================================== +** Method : strcatNum32s (component Utility) +** +** Description : +** Appends a 32bit signed value to a string buffer. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_Num32sToStr(uint8_t *dst, size_t dstSize, int32_t val); +/* +** =================================================================== +** Method : Num32sToStr (component Utility) +** +** Description : +** Converts a signed 32bit value into a string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to be converted. +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_strcatNum32Hex(uint8_t *dst, size_t dstSize, uint32_t num); +/* +** =================================================================== +** Method : strcatNum32Hex (component Utility) +** +** Description : +** Appends a 32bit unsigned value to a string buffer as hex +** number (without a 0x prefix). +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** num - Value to convert. +** Returns : Nothing +** =================================================================== +*/ + +bool McuUtility_IsLeapYear(uint16_t year); +/* +** =================================================================== +** Method : IsLeapYear (component Utility) +** +** Description : +** Returns true if a given year is a leap year +** Parameters : +** NAME - DESCRIPTION +** year - Year, in the YYYY format. +** Returns : +** --- - If the year is a leap year or not. +** =================================================================== +*/ + +uint8_t McuUtility_WeekDay(uint16_t year, uint8_t month, uint8_t day); +/* +** =================================================================== +** Method : WeekDay (component Utility) +** +** Description : +** Returns the weekday for a given date >= 1.Jan.1900 +** Parameters : +** NAME - DESCRIPTION +** year - year in YYYY format +** month - month of the year (1: January, 2: +** February, etc) +** day - day of the moth (starting with 1) +** Returns : +** --- - Returns the weekday, 0 for Sunday, 1 for +** Monday, 2 for Tuesday, etc. +** =================================================================== +*/ + +void McuUtility_chcat(uint8_t *dst, size_t dstSize, uint8_t ch); +/* +** =================================================================== +** Method : chcat (component Utility) +** +** Description : +** Adds a single character to a zero byte terminated string +** buffer. It cares about buffer overflow. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** ch - character to append +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_strcatNum32u(uint8_t *dst, size_t dstSize, uint32_t val); +/* +** =================================================================== +** Method : strcatNum32u (component Utility) +** +** Description : +** Appends a 32bit signed value to a string buffer. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_Num32uToStr(uint8_t *dst, size_t dstSize, uint32_t val); +/* +** =================================================================== +** Method : Num32uToStr (component Utility) +** +** Description : +** Converts an unsigned 32bit value into a string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to be converted. +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_strcatNum32uFormatted(uint8_t *dst, size_t dstSize, uint32_t val, char fill, uint8_t nofFill); +/* +** =================================================================== +** Method : strcatNum32uFormatted (component Utility) +** +** Description : +** Appends a 32bit unsigned value to a string buffer in a +** formatted way. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** fill - Fill character +** nofFill - Number of fill characters +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_Num32uToStrFormatted(uint8_t *dst, size_t dstSize, uint32_t val, char fill, uint8_t nofFill); +/* +** =================================================================== +** Method : Num32uToStrFormatted (component Utility) +** +** Description : +** Converts a 32bit unsigned value to string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** fill - Fill character +** nofFill - Number of fill characters +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_strcatNum24Hex(uint8_t *dst, size_t dstSize, uint32_t num); +/* +** =================================================================== +** Method : strcatNum24Hex (component Utility) +** +** Description : +** Appends a 32bit unsigned value to a string buffer as hex +** number (without a 0x prefix). Only 24bits are used. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** num - Value to convert. +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuUtility_ReadEscapedName(const unsigned char *filename, uint8_t *destname, size_t maxlen, size_t *lenRead, size_t *lenWritten, const char *terminators); +/* +** =================================================================== +** Method : ReadEscapedName (component Utility) +** +** Description : +** Scans an escaped name from a string. This is useful e.g. for +** double quoted file names. +** Parameters : +** NAME - DESCRIPTION +** * filename - the name to be copied. Names may +** be in quoted format +** * destname - the destination of the copy. +** Names are not in quoted format. destname +** may be NULL to get the other return values +** only +** maxlen - length allocated for destname +** * lenRead - length read in filename to copy +** the whole name. Note that filenames maybe +** space terminated, so *lenRead < +** strlen(filename) +** lenWritten - the size written in destname. +** In case of overflows in destname, +** lenWritten is still increased but destname +** no longer written. The have the string +** length in these cases use strlen(destname) +** terminators - additional characters +** where a name should terminate. May be NULL +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuUtility_xatoi(const unsigned char **str, int32_t *res); +/* +** =================================================================== +** Method : xatoi (component Utility) +** +** Description : +** Custom atoi() (ascii to int) implementation by Elm Chan +** Parameters : +** NAME - DESCRIPTION +** * str - Pointer to string to scan. Returns until +** where it has scanned. +** * res - Pointer to where to store the result +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuUtility_ScanDate(const unsigned char **str, uint8_t *day, uint8_t *month, uint16_t *year); +/* +** =================================================================== +** Method : ScanDate (component Utility) +** +** Description : +** Scans a date in the format "dd.mm.yyyy" or "dd-mm-yyyy". For +** yy it will expand it to 20yy. +** Parameters : +** NAME - DESCRIPTION +** * str - Pointer to the string to be scanned. The +** function advances the pointer. +** * day - Pointer to where to store the day value +** * month - Pointer to where to store the month +** value +** * year - Pointer to where to store the year value +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuUtility_ScanTime(const unsigned char **str, uint8_t *hour, uint8_t *minute, uint8_t *second, uint8_t *hSecond); +/* +** =================================================================== +** Method : ScanTime (component Utility) +** +** Description : +** Scans a time string in the format "hh:mm:ss,hh" with the +** part for the ",hh" is optional. +** Parameters : +** NAME - DESCRIPTION +** str - Pointer to the string to be scanned. The +** function advances the pointer. +** * hour - Pointer to where to store the hour value +** * minute - Pointer to where to store the minute +** value +** * second - Pointer to where to store the second +** value +** * hSecond - Pointer to scans the hundreds of +** second part. If not present in string, zero +** is stored +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuUtility_ScanDecimal16uNumber(const unsigned char **str, uint16_t *val); +/* +** =================================================================== +** Method : ScanDecimal16uNumber (component Utility) +** +** Description : +** Scans a decimal 16bit unsigned number +** Parameters : +** NAME - DESCRIPTION +** str - String to scan. It returns as well until +** where it has scanned +** * val - Pointer to value +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuUtility_ScanDecimal8uNumber(const unsigned char **str, uint8_t *val); +/* +** =================================================================== +** Method : ScanDecimal8uNumber (component Utility) +** +** Description : +** Scans a decimal 8bit unsigned number +** Parameters : +** NAME - DESCRIPTION +** str - String to scan. It returns as well until +** where it has scanned +** * val - Pointer to value +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuUtility_Num16uToStr(uint8_t *dst, size_t dstSize, uint16_t val); +/* +** =================================================================== +** Method : Num16uToStr (component Utility) +** +** Description : +** Converts a signed 16bit value into a string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to be converted. +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_Num8sToStr(uint8_t *dst, size_t dstSize, signed char val); +/* +** =================================================================== +** Method : Num8sToStr (component Utility) +** +** Description : +** Converts a signed 8bit value into a string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to be converted. +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_Num8uToStr(uint8_t *dst, size_t dstSize, uint8_t val); +/* +** =================================================================== +** Method : Num8uToStr (component Utility) +** +** Description : +** Converts an unsigned 8bit value into a string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to be converted. +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_Num16uToStrFormatted(uint8_t *dst, size_t dstSize, uint16_t val, char fill, uint8_t nofFill); +/* +** =================================================================== +** Method : Num16uToStrFormatted (component Utility) +** +** Description : +** Converts a 16bit unsigned value to string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** fill - Fill character +** nofFill - Number of fill characters +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_Num32sToStrFormatted(uint8_t *dst, size_t dstSize, int32_t val, char fill, uint8_t nofFill); +/* +** =================================================================== +** Method : Num32sToStrFormatted (component Utility) +** +** Description : +** Converts a 32bit signed value to string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** fill - Fill character +** nofFill - Number of fill characters +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_strcatNum16u(uint8_t *dst, size_t dstSize, uint16_t val); +/* +** =================================================================== +** Method : strcatNum16u (component Utility) +** +** Description : +** Appends a 16bit unsigned value to a string buffer. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_strcatNum16uFormatted(uint8_t *dst, size_t dstSize, uint16_t val, char fill, uint8_t nofFill); +/* +** =================================================================== +** Method : strcatNum16uFormatted (component Utility) +** +** Description : +** Appends a 16bit unsigned value to a string buffer in a +** formatted way. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** fill - Fill character +** nofFill - Number of fill characters +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_strcatNum32sFormatted(uint8_t *dst, size_t dstSize, int32_t val, char fill, uint8_t nofFill); +/* +** =================================================================== +** Method : strcatNum32sFormatted (component Utility) +** +** Description : +** Appends a 32bit signed value to a string buffer in a +** formatted way. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** fill - Fill character +** nofFill - Number of fill characters +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuUtility_ScanDecimal32uNumber(const unsigned char **str, uint32_t *val); +/* +** =================================================================== +** Method : ScanDecimal32uNumber (component Utility) +** +** Description : +** Scans a decimal 32bit unsigned number +** Parameters : +** NAME - DESCRIPTION +** str - string to scan. It returns as well until +** where it has scanned +** * val - Pointer to value +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuUtility_strcatNum8u(uint8_t *dst, size_t dstSize, uint8_t val); +/* +** =================================================================== +** Method : strcatNum8u (component Utility) +** +** Description : +** Appends a 8bit unsigned value to a string buffer. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_strcatNum8s(uint8_t *dst, size_t dstSize, signed char val); +/* +** =================================================================== +** Method : strcatNum8s (component Utility) +** +** Description : +** Appends a 8bit signed value to a string buffer. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to convert. +** Returns : Nothing +** =================================================================== +*/ + +#define McuUtility_strcmp(str1, str2) \ + strcmp(str1, str2) + +/* +** =================================================================== +** Method : strcmp (component Utility) +** +** Description : +** Wrapper to the standard strcmp() routine +** Parameters : +** NAME - DESCRIPTION +** * str1 - Pointer to string +** * str2 - Pointer to string +** Returns : +** --- - Returns zero if the two strings are the +** same +** =================================================================== +*/ + +#define McuUtility_strncmp(str1, str2, size) \ + strncmp(str1, str2, size) + +/* +** =================================================================== +** Method : strncmp (component Utility) +** +** Description : +** Wrapper to the standard strncmp() routine +** Parameters : +** NAME - DESCRIPTION +** * str1 - Pointer to string +** * str2 - Pointer to string +** size - +** Returns : +** --- - Returns zero if the two strings are the +** same +** =================================================================== +*/ + +#define McuUtility_strlen(str) \ + strlen(str) + +/* +** =================================================================== +** Method : strlen (component Utility) +** +** Description : +** Wrapper to the standard strlen() function. +** Parameters : +** NAME - DESCRIPTION +** str - +** Returns : +** --- - size of strinig +** =================================================================== +*/ + +uint8_t McuUtility_ScanHex32uNumber(const unsigned char **str, uint32_t *val); +/* +** =================================================================== +** Method : ScanHex32uNumber (component Utility) +** +** Description : +** Scans a hexadecimal 32bit number, starting with 0x +** Parameters : +** NAME - DESCRIPTION +** str - String to scan, starting with 0x. It +** returns as well until where it has scanned +** * val - Pointer to value +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuUtility_ScanHex16uNumber(const unsigned char **str, uint16_t *val); +/* +** =================================================================== +** Method : ScanHex16uNumber (component Utility) +** +** Description : +** Scans a hexadecimal 16bit number, starting with 0x +** Parameters : +** NAME - DESCRIPTION +** str - String to scan, starting with 0x.. It +** returns as well until where it has scanned +** * val - Pointer to value +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuUtility_ScanHex8uNumber(const unsigned char **str, uint8_t *val); +/* +** =================================================================== +** Method : ScanHex8uNumber (component Utility) +** +** Description : +** Scans a hexadecimal 8bit number, starting with 0x +** Parameters : +** NAME - DESCRIPTION +** str - String to scan, starting with 0x. It +** returns as well until where it has scanned +** * val - Pointer to value +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuUtility_strtailcmp(const uint8_t *str, const uint8_t *tail); +/* +** =================================================================== +** Method : strtailcmp (component Utility) +** +** Description : +** Compares the tail of a string and returns 0 if it matches, 1 +** otherwise +** Parameters : +** NAME - DESCRIPTION +** * str - Pointer to string. This string is compared +** if it contains the tail. +** * tail - Pointer to tail string. +** Returns : +** --- - returns 0 if tail matches, -1 otherwise +** =================================================================== +*/ + +uint8_t McuUtility_strCutTail(uint8_t *str, uint8_t *tail); +/* +** =================================================================== +** Method : strCutTail (component Utility) +** +** Description : +** Removes a tailing substring from a string. The string passed +** will be modified (the tail is cut by writing a zero byte to +** the string!) +** Parameters : +** NAME - DESCRIPTION +** * str - Pointer to string where to remove the tail +** * tail - Pointer to substring to remove +** Returns : +** --- - Error code, ERR_OK if no error, otherwise +** ERR_FAIL if tail is not found +** =================================================================== +*/ + +uint8_t McuUtility_ScanHex8uNumberNoPrefix(const unsigned char **str, uint8_t *val); +/* +** =================================================================== +** Method : ScanHex8uNumberNoPrefix (component Utility) +** +** Description : +** Scans a hexadecimal 8bit number, without 0x +** Parameters : +** NAME - DESCRIPTION +** str - String to scan, starting with 0x. It +** returns as well until where it has scanned +** * val - Pointer to value +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuUtility_strcatNum32sDotValue100(uint8_t *dst, size_t dstSize, int32_t num); +/* +** =================================================================== +** Method : strcatNum32sDotValue100 (component Utility) +** +** Description : +** Appends a 32bit signed value to a string buffer. The value +** is in 1/100 units. For example for the value -13456 it will +** append the string "-134.56" +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** num - Value to convert. +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuUtility_ScanDecimal8sNumber(const unsigned char **str, signed char *val); +/* +** =================================================================== +** Method : ScanDecimal8sNumber (component Utility) +** +** Description : +** Scans a decimal 8bit signed number +** Parameters : +** NAME - DESCRIPTION +** str - String to scan. It returns as well until +** where it has scanned +** * val - Pointer to value +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuUtility_ScanDecimal16sNumber(const unsigned char **str, int16_t *val); +/* +** =================================================================== +** Method : ScanDecimal16sNumber (component Utility) +** +** Description : +** Scans a decimal 16bit signed number +** Parameters : +** NAME - DESCRIPTION +** str - String to scan. It returns as well until +** where it has scanned +** * val - Pointer to value +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuUtility_ScanDecimal32sNumber(const unsigned char **str, int32_t *val); +/* +** =================================================================== +** Method : ScanDecimal32sNumber (component Utility) +** +** Description : +** Scans a decimal 32bit signed number +** Parameters : +** NAME - DESCRIPTION +** str - string to scan. It returns as well until +** where it has scanned +** * val - Pointer to value +** Returns : +** --- - Error code +** =================================================================== +*/ + +int16_t McuUtility_strFind(uint8_t *str, uint8_t *subStr); +/* +** =================================================================== +** Method : strFind (component Utility) +** +** Description : +** Searches a substring inside a string and returns the +** position. +** Parameters : +** NAME - DESCRIPTION +** * str - Pointer to string which will be searched +** * subStr - Pointer to substring to search +** inside str +** Returns : +** --- - -1 if not found, otherwise the character +** index. +** =================================================================== +*/ + +uint8_t McuUtility_ScanSeparatedNumbers(const unsigned char **str, uint8_t *values, uint8_t nofValues, char separator, McuUtility_SeparatedNumberType numberType); +/* +** =================================================================== +** Method : ScanSeparatedNumbers (component Utility) +** +** Description : +** Scans multiple numbers separated by character, e.g. "123.68. +** 5.3" +** Parameters : +** NAME - DESCRIPTION +** str - String to scan. It returns as well until +** where it has scanned +** * values - Pointer to array where to store the +** values +** nofValues - Number of values in the array +** separator - Character separator, e.g. '.' +** numberType - type of number to scan +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuUtility_ScanDoubleQuotedString(const uint8_t **cmd, uint8_t *buf, size_t bufSize); +/* +** =================================================================== +** Method : ScanDoubleQuotedString (component Utility) +** +** Description : +** Scans a string inside double quotes and returns it without +** the double quotes. +** Parameters : +** NAME - DESCRIPTION +** cmd - Pointer to pointer to string to parse. +** This pointer will be advanced as much as +** parsing is done. +** * buf - Pointer to buffer where to store the string +** bufSize - Size of buffer in bytes +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuUtility_ScanDecimal32sDotNumber(const unsigned char **str, int32_t *integral, uint32_t *fractional, uint8_t *nofFractionalZeros); +/* +** =================================================================== +** Method : ScanDecimal32sDotNumber (component Utility) +** +** Description : +** Scans a decimal 32bit signed number with a following dot +** (fractional part), e.g. "-34587.0248", it will return the +** (signed) integral and fractional part with number of +** fractional zeros. The function accepts as well numbers like +** "17" (no fractional part" or "17.0" +** Parameters : +** NAME - DESCRIPTION +** str - string to scan. It returns as well until +** where it has scanned +** * integral - Pointer to value before the dot +** * fractional - Pointer to value after the +** dot, e.g. 32 for "-134.0032" +** nofFractionalZeros - Number of +** fractional leading zeros, e.g. 2 for "-134. +** 0032" +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuUtility_strcatPad(uint8_t *dst, size_t dstSize, const unsigned char *src, char padChar, uint8_t srcPadSize); +/* +** =================================================================== +** Method : strcatPad (component Utility) +** +** Description : +** Same as normal strcat, but safe as it does not write beyond +** the buffer. The buffer will be filled with a pad character +** for a given length. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** * src - Pointer to source string. +** padChar - Character to be used for padding +** srcPadSize - To which size the src string +** has to be padded. +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_NumFloatToStr(uint8_t *dst, size_t dstSize, float val, uint8_t nofFracDigits); +/* +** =================================================================== +** Method : NumFloatToStr (component Utility) +** +** Description : +** Converts a float value into a string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to be converted. +** nofFracDigits - Number of fractional +** digits to print +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_strcatNumFloat(uint8_t *dst, size_t dstSize, float val, uint8_t nofFracDigits); +/* +** =================================================================== +** Method : strcatNumFloat (component Utility) +** +** Description : +** Converts a float value into a string. +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** val - Value to be converted. +** nofFracDigits - Number of factional +** digits to print +** Returns : Nothing +** =================================================================== +*/ + +uint16_t McuUtility_GetValue16LE(uint8_t *dataP); +/* +** =================================================================== +** Method : GetValue16LE (component Utility) +** +** Description : +** Returns a 16bit Little Endian value from memory +** Parameters : +** NAME - DESCRIPTION +** * dataP - Pointer to memory +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint32_t McuUtility_GetValue24LE(uint8_t *dataP); +/* +** =================================================================== +** Method : GetValue24LE (component Utility) +** +** Description : +** Returns a 24bit Little Endian value from memory +** Parameters : +** NAME - DESCRIPTION +** * dataP - Pointer to memory +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint32_t McuUtility_GetValue32LE(uint8_t *dataP); +/* +** =================================================================== +** Method : GetValue32LE (component Utility) +** +** Description : +** Returns a 32bit Little Endian value from memory +** Parameters : +** NAME - DESCRIPTION +** * dataP - Pointer to memory +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuUtility_SetValue16LE(uint16_t data, uint8_t *dataP); +/* +** =================================================================== +** Method : SetValue16LE (component Utility) +** +** Description : +** Stores a 16bit value in memory as Little Endian +** Parameters : +** NAME - DESCRIPTION +** data - Value to store +** * dataP - Pointer to memory +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_SetValue24LE(uint32_t data, uint8_t *dataP); +/* +** =================================================================== +** Method : SetValue24LE (component Utility) +** +** Description : +** Stores a 24bit value in memory as Little Endian +** Parameters : +** NAME - DESCRIPTION +** data - Value to store +** * dataP - Pointer to memory +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_SetValue32LE(uint32_t data, uint8_t *dataP); +/* +** =================================================================== +** Method : SetValue32LE (component Utility) +** +** Description : +** Stores a 32bit value in memory as Little Endian +** Parameters : +** NAME - DESCRIPTION +** data - Value to store +** * dataP - Pointer to memory +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component Utility) +** +** Description : +** Driver De-Initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuUtility_Init(void); +/* +** =================================================================== +** Method : Init (component Utility) +** +** Description : +** Driver Initialization +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +int32_t McuUtility_map(int32_t x, int32_t in_min, int32_t in_max, int32_t out_min, int32_t out_max); +/* +** =================================================================== +** Method : map (component Utility) +** +** Description : +** Maps a value from one range to another +** Parameters : +** NAME - DESCRIPTION +** x - value to be mapped +** in_min - input range minimum value +** in_max - input range maximum value +** out_min - output range minimum value +** out_max - output range maximum value +** Returns : +** --- - remapped value +** =================================================================== +*/ + +int32_t McuUtility_constrain(int32_t val, int32_t min, int32_t max); +/* +** =================================================================== +** Method : constrain (component Utility) +** +** Description : +** Makes sure that a given input value is inside a given range. +** Parameters : +** NAME - DESCRIPTION +** val - input value +** min - range minimum value +** max - range maximum value +** Returns : +** --- - the constrained value +** =================================================================== +*/ + +int32_t McuUtility_random(int32_t min, int32_t max); +/* +** =================================================================== +** Method : random (component Utility) +** +** Description : +** Provides a random value. You have to call intialize the +** random number generator with randomSetSeed() first! +** Parameters : +** NAME - DESCRIPTION +** min - range minimum value +** max - range maximum value +** Returns : +** --- - random value between min and max +** =================================================================== +*/ + +void McuUtility_randomSetSeed(unsigned int seed); +/* +** =================================================================== +** Method : randomSetSeed (component Utility) +** +** Description : +** Sets a seed for the random number generator +** Parameters : +** NAME - DESCRIPTION +** seed - seed to be used for random number +** generator +** Returns : Nothing +** =================================================================== +*/ + +#ifdef __GNUC__ /* HIWARE compiler does not support 64bit data types */ +int64_t McuUtility_map64(int64_t x, int64_t in_min, int64_t in_max, int64_t out_min, int64_t out_max); +#endif +/* +** =================================================================== +** Method : map64 (component Utility) +** +** Description : +** Maps a value from one range to another, using 64bit math +** Parameters : +** NAME - DESCRIPTION +** x - value to be mapped +** in_min - input range minimum value +** in_max - input range maximum value +** out_min - output range maximum value +** out_max - +** Returns : +** --- - remapped value +** =================================================================== +*/ + +void McuUtility_strcatNumHex(uint8_t *dst, size_t dstSize, uint32_t num, uint8_t nofBytes); +/* +** =================================================================== +** Method : strcatNumHex (component Utility) +** +** Description : +** Appends a value as hex valalue to a string buffer as hex +** number (without a 0x prefix), with variable number of digits +** Parameters : +** NAME - DESCRIPTION +** * dst - Pointer to destination string +** dstSize - Size of the destination buffer (in +** bytes). +** num - Value to convert. +** nofBytes - Number of bytes to write +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuUtility_ScanRGB(const unsigned char **str, uint8_t *r, uint8_t *g, uint8_t *b); +/* +** =================================================================== +** Method : ScanRGB (component Utility) +** +** Description : +** Scans a RGB value and stores it in r, g and b. String can be +** a single hex number (0x120506) or three decimal values (18 5 +** 6) +** Parameters : +** NAME - DESCRIPTION +** str - String to scan +** * r - Pointer to red value +** * g - Pointer to green value +** * b - Pointer to blue value +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuUtility_ScanRGB32(const unsigned char **str, uint32_t *rgb); +/* +** =================================================================== +** Method : ScanRGB32 (component Utility) +** +** Description : +** Scans a RGB value and stores it in a single 32bit value. +** String can be a single hex number (0x120506) or three +** decimal values (18 5 6) +** Parameters : +** NAME - DESCRIPTION +** str - String to scan +** * rgb - Pointer to rgb value +** Returns : +** --- - Error code +** =================================================================== +*/ + +void McuUtility_SkipSpaces(const unsigned char **str); +/* +** =================================================================== +** Method : SkipSpaces (component Utility) +** +** Description : +** Skips spaces +** Parameters : +** NAME - DESCRIPTION +** * str - Pointer to string to scan. Returns until +** where it has scanned. +** Returns : Nothing +** =================================================================== +*/ + +uint8_t McuUtility_ScanWRGB32(const unsigned char **str, uint32_t *rgbw); +/* +** =================================================================== +** Method : ScanWRGB32 (component Utility) +** +** Description : +** Scans a WRGB value and stores it in a single 32bit value. +** String can be a single hex number (0x12050608) or three +** decimal values (18 5 6 8) +** Parameters : +** NAME - DESCRIPTION +** str - String to scan +** * rgbw - Pointer to wrgb value +** Returns : +** --- - Error code +** =================================================================== +*/ + +uint8_t McuUtility_ScanWRGB(const unsigned char **str, uint8_t *w, uint8_t *r, uint8_t *g, uint8_t *b); +/* +** =================================================================== +** Method : ScanWRGB (component Utility) +** +** Description : +** Scans a WRGB value and stores it in r, g, b and w. String +** can be a single hex number (0x12050608) or three decimal +** values (18 5 6 8) +** Parameters : +** NAME - DESCRIPTION +** str - String to scan +** * w - Pointer to white value +** * r - Pointer to red value +** * g - Pointer to green value +** * b - Pointer to blue value +** Returns : +** --- - Error code +** =================================================================== +*/ + +/* END McuUtility. */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif +/* ifndef __McuUtility_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuW25Q128.c b/TSM_PicoW_Sensor/McuLib/src/McuW25Q128.c new file mode 100644 index 0000000..0b3e2b6 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuW25Q128.c @@ -0,0 +1,481 @@ +/* + * Copyright (c) 2022, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuW25Q128.h" +#if MCUW25Q128_CONFIG_ENABLED +#include "McuUtility.h" +#include "McuGPIO.h" +#include "McuWait.h" +#include "McuShell.h" +#include "McuLog.h" +#include "McuSPI.h" + +#define McuW25_CMD_PAGE_PROGRAM 0x02 +#define McuW25_CMD_DATA_READ 0x03 + +#define McuW25_CMD_READ_STATUS1 0x05 + +#define McuW25_CMD_WRITE_ENABLE 0x06 +#define McuW25_CMD_WRITE_DISABLE 0x04 + +#define McuW25_CMD_GET_ID 0x9F +#define McuW25_ID0_WINBOND 0xEF /* first byte of ID for Winbond */ +#define McuW25_ID1_WINBOND_xQ 0x40 /* second byte for W25Q128JV-IQ-JQ */ +#define McuW25_ID2_WINBOND_xQ 0x18 /* third byte for W25Q128JV-IQ-JQ */ +#define McuW25_ID1_WINBOND_xM 0x70 /* second byte for W25Q128JV-IM-JM */ +#define McuW25_ID2_WINBOND_xM 0x18 /* third byte for W25Q128JV-IM-JM */ + +#define McuW25_CMD_GET_SERIAL 0x4B + +#define McuW25_CMD_SECTOR_ERASE_4K 0x20 +#define McuW25_CMD_BLOCK_ERASE_32K 0x52 +#define McuW25_CMD_BLOCK_ERASE_64K 0xD8 +#define McuW25_CMD_CHIP_ERASE 0xC7 + +#define SPI_WRITE(write) \ + { \ + while(McuSPI_SendByte(write)!=0) {} \ + } +#define SPI_WRITE_READ(write, readP) \ + { \ + while(McuSPI_SendReceiveByte(write, readP)!=0) {} \ + } + +#define SPI_WRITE_READ_BLOCK(write, read, size) \ + { \ + while(McuSPI_SendReceiveBlock(write, read, size)!=0) {} \ + } + +uint8_t McuW25_ReadStatus1(uint8_t *status) { + McuW25_CONFIG_CS_ENABLE(); + SPI_WRITE(McuW25_CMD_READ_STATUS1); + SPI_WRITE_READ(0, status); + McuW25_CONFIG_CS_DISABLE(); + return ERR_OK; +} + +bool McuW25_isBusy(void) { + uint8_t status; + + McuW25_ReadStatus1(&status); + return (status&1); +} + +void McuW25_WaitIfBusy(void) { + while(McuW25_isBusy()) { + McuWait_Waitms(1); + } +} + +uint8_t McuW25_Read(uint32_t address, uint8_t *buf, size_t bufSize) { + McuW25_WaitIfBusy(); + + McuW25_CONFIG_CS_ENABLE(); + SPI_WRITE(McuW25_CMD_DATA_READ); + SPI_WRITE(address>>16); + SPI_WRITE(address>>8); + SPI_WRITE(address); + SPI_WRITE_READ_BLOCK(NULL, buf, bufSize); + McuW25_CONFIG_CS_DISABLE(); + return ERR_OK; +} + +uint8_t McuW25_EraseAll(void) { + McuW25_WaitIfBusy(); + + McuW25_CONFIG_CS_ENABLE(); + SPI_WRITE(McuW25_CMD_WRITE_ENABLE); + McuW25_CONFIG_CS_DISABLE(); + McuWait_Waitus(1); + + McuW25_CONFIG_CS_ENABLE(); + SPI_WRITE(McuW25_CMD_CHIP_ERASE); + McuW25_CONFIG_CS_DISABLE(); + + return ERR_OK; +} + + +uint8_t McuW25_EraseSector4K(uint32_t address) { + McuW25_WaitIfBusy(); + + McuW25_CONFIG_CS_ENABLE(); + SPI_WRITE(McuW25_CMD_WRITE_ENABLE); + McuW25_CONFIG_CS_DISABLE(); + McuWait_Waitus(1); + + McuW25_CONFIG_CS_ENABLE(); + SPI_WRITE(McuW25_CMD_SECTOR_ERASE_4K); + SPI_WRITE(address>>16); + SPI_WRITE(address>>8); + SPI_WRITE(address); + McuW25_CONFIG_CS_DISABLE(); + + return ERR_OK; +} + +uint8_t McuW25_EraseBlock32K(uint32_t address) { + McuW25_WaitIfBusy(); + + McuW25_CONFIG_CS_ENABLE(); + SPI_WRITE(McuW25_CMD_WRITE_ENABLE); + McuW25_CONFIG_CS_DISABLE(); + McuWait_Waitus(1); + + McuW25_CONFIG_CS_ENABLE(); + SPI_WRITE(McuW25_CMD_BLOCK_ERASE_32K); + SPI_WRITE(address>>16); + SPI_WRITE(address>>8); + SPI_WRITE(address); + McuW25_CONFIG_CS_DISABLE(); + + return ERR_OK; +} + +uint8_t McuW25_EraseBlock64K(uint32_t address) { + McuW25_WaitIfBusy(); + + McuW25_CONFIG_CS_ENABLE(); + SPI_WRITE(McuW25_CMD_WRITE_ENABLE); + McuW25_CONFIG_CS_DISABLE(); + McuWait_Waitus(1); + + McuW25_CONFIG_CS_ENABLE(); + SPI_WRITE(McuW25_CMD_BLOCK_ERASE_64K); + SPI_WRITE(address>>16); + SPI_WRITE(address>>8); + SPI_WRITE(address); + McuW25_CONFIG_CS_DISABLE(); + + return ERR_OK; +} + +/*! + * Program a page with data + * \param address, should be aligned on page (256 bytes) if programming 256 bytes + * \param data pointer to data + * \param dataSize size of data in bytes, max 256 + * \return error code, ERR_OK for no error + */ +uint8_t McuW25_ProgramPage(uint32_t address, const uint8_t *data, size_t dataSize) { + McuW25_WaitIfBusy(); + + McuW25_CONFIG_CS_ENABLE(); + SPI_WRITE(McuW25_CMD_WRITE_ENABLE); + McuW25_CONFIG_CS_DISABLE(); + McuWait_Waitus(1); + + McuW25_CONFIG_CS_ENABLE(); + SPI_WRITE(McuW25_CMD_PAGE_PROGRAM); + SPI_WRITE(address>>16); + SPI_WRITE(address>>8); + SPI_WRITE(address); +#if 0 + while(dataSize>0) { + SPI_WRITE(*data); + dataSize--; + data++; + } +#else + SPI_WRITE_READ_BLOCK(data, NULL, dataSize); +#endif + McuW25_CONFIG_CS_DISABLE(); + + return ERR_OK; +} + +uint8_t McuW25_GetCapacity(uint32_t *capacity) { + uint32_t n = 0x100000; /* unknown chips, default to 1 MByte */ + uint8_t id[McuW25_ID_BUF_SIZE] = {0,0,0}; + uint8_t res; + + res = McuW25_ReadID(id, sizeof(id)); + if (res!=ERR_OK) { + return ERR_FAILED; + } + if (id[2] >= 16 && id[2] <= 31) { + n = 1ul << id[2]; + } else if (id[2] >= 32 && id[2] <= 37) { + n = 1ul << (id[2] - 6); + } else if ((id[0]==0 && id[1]==0 && id[2]==0) || (id[0]==255 && id[1]==255 && id[2]==255)) { + *capacity = 0; + return ERR_FAILED; + } + *capacity = n; + return ERR_OK; +} + +uint8_t McuW25_ReadSerialNumber(uint8_t *buf, size_t bufSize) { + int i; + + if (bufSizestdOut); + + res = McuW25_ReadID(id, sizeof(id)); + buf[0] = '\0'; + if (res==ERR_OK) { + for(int i=0; istdOut); + + res = McuW25_GetCapacity(&capacity); + if (res==ERR_OK) { + buf[0] = '\0'; + McuUtility_strcatNum32u(buf, sizeof(buf), capacity); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" bytes\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ERROR\r\n"); + } + McuShell_SendStatusStr((const unsigned char*)" Capacity", buf, io->stdOut); + + McuUtility_Num32uToStr(buf, sizeof(buf), MCUW25Q128_CONFIG_SIZE_KBYTES); + McuUtility_strcat(buf, sizeof(buf), (const uint8_t *)"\r\n"); + McuShell_SendStatusStr((const unsigned char*)" kBytes", buf, io->stdOut); + + res = McuW25_ReadSerialNumber(serial, sizeof(serial)); /* check serial number */ + if(res==ERR_OK) { + buf[0] = '\0'; + for(i=0; istdOut); + + res = McuW25_ReadStatus1(&status); + if(res==ERR_OK) { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); + McuUtility_strcatNum8Hex(buf, sizeof(buf), status); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" SEC:"); McuUtility_strcat(buf, sizeof(buf), status&(1<<6)?(unsigned char*)"1": (unsigned char*)"0"); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" TB:"); McuUtility_strcat(buf, sizeof(buf), status&(1<<5)?(unsigned char*)"1": (unsigned char*)"0"); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" BP2:"); McuUtility_strcat(buf, sizeof(buf), status&(1<<4)?(unsigned char*)"1": (unsigned char*)"0"); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" BP1:"); McuUtility_strcat(buf, sizeof(buf), status&(1<<3)?(unsigned char*)"1": (unsigned char*)"0"); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" BP0:"); McuUtility_strcat(buf, sizeof(buf), status&(1<<2)?(unsigned char*)"1": (unsigned char*)"0"); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" WEL:"); McuUtility_strcat(buf, sizeof(buf), status&(1<<1)?(unsigned char*)"1": (unsigned char*)"0"); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" BUSY:"); McuUtility_strcat(buf, sizeof(buf), status&(1<<0)?(unsigned char*)"1": (unsigned char*)"0"); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + } else { + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ERROR\r\n"); + } + McuShell_SendStatusStr((const unsigned char*)" Status", buf, io->stdOut); + return ERR_OK; +} + +static uint8_t ReadBytes(void *hndl, uint32_t address, uint8_t *buf, size_t bufSize) { + (void)hndl; /* not used */ + return McuW25_Read(address, buf, bufSize); +} + +uint8_t McuW25_ParseCommand(const unsigned char* cmd, bool *handled, const McuShell_StdIOType *io) { + const unsigned char *p; + int32_t val, end; + uint32_t res; + uint8_t data[32]; + int i; + + if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, "McuW25 help")==0) { + McuShell_SendHelpStr((unsigned char*)"McuW25", (const unsigned char*)"Group of Winbond W25Q128 Flash commands\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" help|status", (const unsigned char*)"Print help or status information\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" read ", (const unsigned char*)"Read memory from to address\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" erase all", (const unsigned char*)"Erase all data on device\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" erase 4k ", (const unsigned char*)"Erase a 4K sector\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" erase 32k ", (const unsigned char*)"Erase a 32K block\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" erase 64k ", (const unsigned char*)"Erase a 64K block\r\n", io->stdOut); + McuShell_SendHelpStr((unsigned char*)" write ", (const unsigned char*)"Write to page (max 32 bytes data, separated by spaces)\r\n", io->stdOut); + *handled = TRUE; + return ERR_OK; + } else if (McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0 || McuUtility_strcmp((char*)cmd, "McuW25 status")==0) { + *handled = TRUE; + return McuW25_PrintStatus(io); + } else if (McuUtility_strncmp((char*)cmd, "McuW25 read ", sizeof("McuW25 read ")-1)==0) { + *handled = TRUE; + p = cmd+sizeof("McuW25 read ")-1; + res = McuUtility_xatoi(&p, &val); + if (res!=ERR_OK) { + McuShell_SendStr((unsigned char*)"wrong start address\r\n", io->stdErr); + return ERR_FAILED; + } else { + res = McuUtility_xatoi(&p, &end); + if (res!=ERR_OK) { + McuShell_SendStr((unsigned char*)"wrong end address\r\n", io->stdErr); + return ERR_FAILED; + } + res = McuShell_PrintMemory(NULL, val, end, 3, 16, ReadBytes, io); + if (res!=ERR_OK) { + McuShell_SendStr((unsigned char*)"memory read failed\r\n", io->stdErr); + return ERR_FAILED; + } + return ERR_OK; + } + } else if (McuUtility_strncmp((char*)cmd, "McuW25 write ", sizeof("McuW25 write ")-1)==0) { + *handled = TRUE; + p = cmd+sizeof("McuW25 write ")-1; + res = McuUtility_xatoi(&p, &val); + if (res!=ERR_OK) { + McuShell_SendStr((unsigned char*)"wrong address\r\n", io->stdErr); + return ERR_FAILED; + } else { + for(i=0; i0) { + res = McuW25_ProgramPage(val, data, i); + if (res!=ERR_OK) { + McuShell_SendStr((unsigned char*)"failed programming page\r\n", io->stdErr); + return ERR_FAILED; + } + } + } + return ERR_OK; + } else if (McuUtility_strcmp((char*)cmd, "McuW25 erase all")==0) { + *handled = TRUE; + res = McuW25_EraseAll(); + if (res!=ERR_OK) { + McuShell_SendStr((unsigned char*)"failed erasing all memory\r\n", io->stdErr); + return ERR_FAILED; + } + return ERR_OK; + } else if (McuUtility_strncmp((char*)cmd, "McuW25 erase 4k ", sizeof("McuW25 erase 4k ")-1)==0) { + *handled = TRUE; + p = cmd+sizeof("McuW25 erase 4k ")-1; + res = McuUtility_xatoi(&p, &val); + if (res!=ERR_OK) { + McuShell_SendStr((unsigned char*)"wrong address\r\n", io->stdErr); + return ERR_FAILED; + } else { + res = McuW25_EraseSector4K(val); + if (res!=ERR_OK) { + McuShell_SendStr((unsigned char*)"failed erasing 4k sector\r\n", io->stdErr); + return ERR_FAILED; + } + } + return ERR_OK; + } else if (McuUtility_strncmp((char*)cmd, "McuW25 erase 32k ", sizeof("McuW25 erase 32k ")-1)==0) { + *handled = TRUE; + p = cmd+sizeof("McuW25 erase 32k ")-1; + res = McuUtility_xatoi(&p, &val); + if (res!=ERR_OK) { + McuShell_SendStr((unsigned char*)"wrong address\r\n", io->stdErr); + return ERR_FAILED; + } else { + res = McuW25_EraseBlock32K(val); + if (res!=ERR_OK) { + McuShell_SendStr((unsigned char*)"failed erasing 32k block\r\n", io->stdErr); + return ERR_FAILED; + } + } + return ERR_OK; + } else if (McuUtility_strncmp((char*)cmd, "McuW25 erase 64k ", sizeof("McuW25 erase 64k ")-1)==0) { + *handled = TRUE; + p = cmd+sizeof("McuW25 erase 64k ")-1; + res = McuUtility_xatoi(&p, &val); + if (res!=ERR_OK) { + McuShell_SendStr((unsigned char*)"wrong address\r\n", io->stdErr); + return ERR_FAILED; + } else { + res = McuW25_EraseBlock64K(val); + if (res!=ERR_OK) { + McuShell_SendStr((unsigned char*)"failed erasing 32k block\r\n", io->stdErr); + return ERR_FAILED; + } + } + return ERR_OK; + } + return ERR_OK; +} + +void McuW25_Deinit(void) { + McuW25_CONFIG_CS_DISABLE(); /* disable chip select by default */ +} + +void McuW25_Init(void) { + McuW25_CONFIG_CS_DISABLE(); /* disable chip select by default */ +} + +#endif /* MCUW25Q128_CONFIG_ENABLED */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuW25Q128.h b/TSM_PicoW_Sensor/McuLib/src/McuW25Q128.h new file mode 100644 index 0000000..557b05c --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuW25Q128.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2022, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MCU_W25Q128_H_ +#define MCU_W25Q128_H_ + +#include "McuW25Q128config.h" +#include +#include +#include "McuShell.h" + +/* supported devices */ +typedef enum { + McuW25_DEVICE_UNKNOWN, + McuW25_DEVICE_W25Q128JV_IQ_JQ, + McuW25_DEVICE_W25Q128JV_IM_JM, +} McuW25_Device_e; + +McuW25_Device_e McuW25_GetDeviceType(void); + +uint8_t McuW25_ParseCommand(const unsigned char* cmd, bool *handled, const McuShell_StdIOType *io); + +#define McuW25_SERIAL_BUF_SIZE (8) +uint8_t McuW25_ReadSerialNumber(uint8_t *buf, size_t bufSize); + +#define McuW25_ID_BUF_SIZE (3) +uint8_t McuW25_ReadID(uint8_t *buf, size_t bufSize); + +uint8_t McuW25_ReadStatus1(uint8_t *status); + +bool McuW25_isBusy(void); + +void McuW25_WaitIfBusy(void); + +uint8_t McuW25_Read(uint32_t address, uint8_t *buf, size_t bufSize); + +uint8_t McuW25_EraseAll(void); + +uint8_t McuW25_EraseSector4K(uint32_t address); + +uint8_t McuW25_EraseBlock32K(uint32_t address); + +uint8_t McuW25_EraseBlock64K(uint32_t address); + +/*! + * Program a page with data + * \param address, should be aligned on page (256 bytes) if programming 256 bytes + * \param data pointer to data + * \param dataSize size of data in bytes, max 256 + * \return error code, ERR_OK for no error + */ +uint8_t McuW25_ProgramPage(uint32_t address, const uint8_t *data, size_t dataSize); + +uint8_t McuW25_GetCapacity(uint32_t *capacity); + +/*!* \brief Module de-initialization */ +void McuW25_Deinit(void); + +/*!* \brief Module initialization */ +void McuW25_Init(void); + +#endif /* MCU_W25Q128_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuWait.c b/TSM_PicoW_Sensor/McuLib/src/McuWait.c new file mode 100644 index 0000000..ee1b86e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuWait.c @@ -0,0 +1,441 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuWait.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : Wait +** Version : Component 01.093, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-09, 11:02, # CodeGen: 834 +** Abstract : +** Implements busy waiting routines. +** Settings : +** Component name : McuWait +** Manual Clock Values : Disabled +** Delay100usFunction : Delay100US +** RTOS : Enabled +** RTOS : McuRTOS +** Watchdog : Disabled +** Contents : +** Wait10Cycles - void McuWait_Wait10Cycles(void); +** Wait100Cycles - void McuWait_Wait100Cycles(void); +** WaitCycles - void McuWait_WaitCycles(uint32_t cycles); +** WaitLongCycles - void McuWait_WaitLongCycles(uint32_t cycles); +** Waitms - void McuWait_Waitms(uint32_t ms); +** Waitus - void McuWait_Waitus(uint32_t us); +** Waitns - void McuWait_Waitns(uint32_t ns); +** WaitOSms - void McuWait_WaitOSms(void); +** Init - void McuWait_Init(void); +** Deinit - void McuWait_Deinit(void); +** +** * Copyright (c) 2013-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuWait.h +** @version 01.00 +** @brief +** Implements busy waiting routines. +*/ +/*! +** @addtogroup McuWait_module McuWait module documentation +** @{ +*/ + +/* MODULE McuWait. */ + +#include "McuWait.h" +#if McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + #include /* for sleep() */ +#endif + + +/* +** =================================================================== +** Method : Wait10Cycles (component Wait) +** +** Description : +** Wait for 10 CPU cycles. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +#if McuLib_CONFIG_SDK_VERSION_USED!=McuLib_CONFIG_SDK_LINUX +#ifdef __GNUC__ +#if McuLib_CONFIG_CPU_IS_RISC_V || McuLib_CONFIG_CPU_IS_ESP32 /* naked is ignored for RISC-V or ESP32 gcc */ + #ifdef __cplusplus /* gcc 4.7.3 in C++ mode does not like no_instrument_function: error: can't set 'no_instrument_function' attribute after definition */ + #else + __attribute__((no_instrument_function)) + #endif +#else + #ifdef __cplusplus /* gcc 4.7.3 in C++ mode does not like no_instrument_function: error: can't set 'no_instrument_function' attribute after definition */ + __attribute__((naked)) + #else + __attribute__((naked, no_instrument_function)) + #endif +#endif +#endif +void McuWait_Wait10Cycles(void) +{ + /* This function will wait 10 CPU cycles (including call overhead). */ + /*lint -save -e522 function lacks side effect. */ + +#if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M + /* NOTE: Cortex-M0 and M4 have 1 cycle for a NOP */ +#if McuLib_CONFIG_COMPILER==McuLib_CONFIG_COMPILER_GNU + __asm ( + /* bl Wait10Cycles() to here: [4] */ + "nop \n\t" /* [1] */ + "nop \n\t" /* [1] */ + "nop \n\t" /* [1] */ + "bx lr \n\t" /* [3] */ + ); +#elif McuLib_CONFIG_COMPILER==McuLib_CONFIG_COMPILER_IAR + /* bl Wai10Cycles() to here: [4] */ + __asm("nop"); /* [1] */ + __asm("nop"); /* [1] */ + __asm("nop"); /* [1] */ + __asm("bx lr"); /* [3] */ +#elif McuLib_CONFIG_COMPILER==McuLib_CONFIG_COMPILER_KEIL + __asm { + nop /* [1] */ + nop /* [1] */ + nop /* [1] */ + /*bx lr*/ /* [3] */ + } +#else + __asm { + nop /* [1] */ + nop /* [1] */ + nop /* [1] */ + bx lr /* [3] */ + } +#endif +#elif McuLib_CONFIG_CPU_IS_RISC_V + __asm ( /* assuming [4] for overhead */ + "nop \n\t" /* [1] */ + "nop \n\t" /* [1] */ + "nop \n\t" /* [1] */ + "nop \n\t" /* [1] */ + ); +#endif + /*lint -restore */ +} +#endif /* McuLib_CONFIG_SDK_VERSION_USED!=McuLib_CONFIG_SDK_LINUX */ + +/* +** =================================================================== +** Method : Wait100Cycles (component Wait) +** +** Description : +** Wait for 100 CPU cycles. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +#if McuLib_CONFIG_SDK_VERSION_USED!=McuLib_CONFIG_SDK_LINUX +#if McuLib_CONFIG_COMPILER==McuLib_CONFIG_COMPILER_IAR + /* Implemented in assembly file, as IAR does not support labels in HLI */ +#else +#ifdef __GNUC__ + #if McuLib_CONFIG_CPU_IS_RISC_V || McuLib_CONFIG_CPU_IS_ESP32 /* naked is ignored for RISC-V or ESP32 gcc */ + #ifdef __cplusplus /* gcc 4.7.3 in C++ mode does not like no_instrument_function: error: can't set 'no_instrument_function' attribute after definition */ + #else + __attribute__((no_instrument_function)) + #endif + #else + #ifdef __cplusplus /* gcc 4.7.3 in C++ mode does not like no_instrument_function: error: can't set 'no_instrument_function' attribute after definition */ + __attribute__((naked)) + #else + __attribute__((naked, no_instrument_function)) + #endif + #endif +#endif +void McuWait_Wait100Cycles(void) +{ + /* This function will spend 100 CPU cycles (including call overhead). */ + /*lint -save -e522 function lacks side effect. */ +#if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M +#if McuLib_CONFIG_COMPILER==McuLib_CONFIG_COMPILER_GNU + __asm ( + /* bl to here: [4] */ + "push {r0} \n\t" /* [2] */ + "movs r0, #0 \n\t" /* [1] */ + "loopWait100Cycles: \n\t" + "nop \n\t" /* [1] */ + "nop \n\t" /* [1] */ + "nop \n\t" /* [1] */ + "nop \n\t" /* [1] */ + "add r0,#1 \n\t" /* [1] */ + "cmp r0,#9 \n\t" /* [1] */ + "bls loopWait100Cycles \n\t" /* [3] taken, [1] not taken */ + "nop \n\t" /* [1] */ + "nop \n\t" /* [1] */ + "nop \n\t" /* [1] */ + "nop \n\t" /* [1] */ + "nop \n\t" /* [1] */ + "nop \n\t" /* [1] */ + "nop \n\t" /* [1] */ + "pop {r0} \n\t" /* [2] */ + "bx lr \n\t" /* [3] */ + ); +#elif McuLib_CONFIG_COMPILER==McuLib_CONFIG_COMPILER_IAR + /* need to implement in assembly, as IAR does not support labels in HLI */ +#elif McuLib_CONFIG_COMPILER==McuLib_CONFIG_COMPILER_KEIL + /* bl to here: [4] */ + movs r0, #0 /* [1] */ +loop + nop /* [1] */ + nop /* [1] */ + nop /* [1] */ + nop /* [1] */ + nop /* [1] */ + adds r0,r0,#1 /* [1] */ + cmp r0,#9 /* [1] */ + bls loop /* [3] taken, [1] not taken */ + nop /* [1] */ + bx lr /* [3] */ +#else + __asm { + /* bl Wai10Cycles() to here: [4] */ + movs r0, #0 /* [1] */ + loop: + nop /* [1] */ + nop /* [1] */ + nop /* [1] */ + nop /* [1] */ + nop /* [1] */ + add r0,#1 /* [1] */ + cmp r0,#9 /* [1] */ + bls loop /* [3] taken, [1] not taken */ + nop /* [1] */ + bx lr /* [3] */ + } +#endif +#elif McuLib_CONFIG_CPU_IS_RISC_V + __asm ( /* assuming [10] for overhead */ + " li a5,20 \n\t" + "LoopWait100Cycles: \n\t" + " addi a5,a5,-1 \n\t" + " bgtz a5, LoopWait100Cycles \n\t" + ); +#endif + /*lint -restore */ +} +#endif /* McuLib_CONFIG_COMPILER==McuLib_CONFIG_COMPILER_IAR */ +#endif /* McuLib_CONFIG_SDK_VERSION_USED!=McuLib_CONFIG_SDK_LINUX */ + +/* +** =================================================================== +** Method : WaitCycles (component Wait) +** +** Description : +** Wait for a specified number of CPU cycles. +** Parameters : +** NAME - DESCRIPTION +** cycles - The number of cycles to wait. +** Returns : Nothing +** =================================================================== +*/ +#if McuLib_CONFIG_SDK_VERSION_USED!=McuLib_CONFIG_SDK_LINUX +void McuWait_WaitCycles(uint32_t cycles) +{ + /*lint -save -e522 function lacks side effect. */ +#if McuWait_CONFIG_USE_CYCLE_COUNTER + uint32_t counter = cycles; + + counter += McuArmTools_GetCycleCounter(); + while(McuArmTools_GetCycleCounter()= 100u) { + McuWait_Wait100Cycles(); + c -= 100u; + } + while(c >= 10u) { + McuWait_Wait10Cycles(); + c -= 10u; + } +#endif + /*lint -restore */ +} +#endif /* McuLib_CONFIG_SDK_VERSION_USED!=McuLib_CONFIG_SDK_LINUX */ + +/* +** =================================================================== +** Method : WaitLongCycles (component Wait) +** +** Description : +** Wait for a specified number of CPU cycles (32bit data type). +** Parameters : +** NAME - DESCRIPTION +** cycles - The number of cycles to wait. +** Returns : Nothing +** =================================================================== +*/ +#if McuLib_CONFIG_SDK_VERSION_USED!=McuLib_CONFIG_SDK_LINUX +void McuWait_WaitLongCycles(uint32_t cycles) +{ +#if McuWait_CONFIG_USE_CYCLE_COUNTER + uint32_t counter = cycles; + + counter += McuArmTools_GetCycleCounter(); + while(McuArmTools_GetCycleCounter()60000) { + McuWait_WaitCycles(60000); + cycles -= 60000; + } + McuWait_WaitCycles(cycles); + /*lint -restore */ +#endif +} +#endif /* McuLib_CONFIG_SDK_VERSION_USED!=McuLib_CONFIG_SDK_LINUX */ + +/* +** =================================================================== +** Method : Waitms (component Wait) +** +** Description : +** Wait for a specified time in milliseconds. +** Parameters : +** NAME - DESCRIPTION +** ms - How many milliseconds the function has to +** wait +** Returns : Nothing +** =================================================================== +*/ +void McuWait_Waitms(uint32_t ms) +{ +#if McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + usleep(ms*1000); +#else + /*lint -save -e522 function lacks side effect. */ + uint32_t msCycles; /* cycles for 1 ms */ + + /* static clock/speed configuration */ + msCycles = McuWait_NofCyclesMs(1, McuWait_INSTR_CLOCK_HZ); + while(ms>0) { + McuWait_WaitLongCycles(msCycles); + ms--; + } + /*lint -restore */ +#endif +} +/* +** =================================================================== +** Method : Waitus (component Wait) +** +** Description : +** Wait for a specified time in microseconds. +** Parameters : +** NAME - DESCRIPTION +** us - How many microseconds the function has to +** wait +** Returns : Nothing +** =================================================================== +*/ +/* implemented as macro version. See header file. */ +/* +** =================================================================== +** Method : Waitns (component Wait) +** +** Description : +** Wait for a specified time in nano seconds. +** Parameters : +** NAME - DESCRIPTION +** ns - How many ns the function has to wait +** Returns : Nothing +** =================================================================== +*/ +/* implemented as macro version. See header file. */ +/* +** =================================================================== +** Method : WaitOSms (component Wait) +** +** Description : +** If an RTOS is enabled, this routine will use a non-blocking +** wait method. Otherwise it will do a busy/blocking wait. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +/* +void McuWait_WaitOSms(void) +{ + Method is implemented as macro in the header file +} +*/ + +/* +** =================================================================== +** Method : Init (component Wait) +** +** Description : +** Driver initialization routine. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuWait_Init(void) +{ +#if McuWait_CONFIG_USE_CYCLE_COUNTER + /* init cycle counter */ + McuArmTools_InitCycleCounter(); + McuArmTools_ResetCycleCounter(); + McuArmTools_EnableCycleCounter(); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component Wait) +** +** Description : +** Driver de-initialization routine +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuWait_Deinit(void) +{ +#if McuWait_CONFIG_USE_CYCLE_COUNTER + /* disable hardware cycle counter */ + McuArmTools_DisableCycleCounter(); +#endif +} + +/* END McuWait. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuWait.h b/TSM_PicoW_Sensor/McuLib/src/McuWait.h new file mode 100644 index 0000000..cd5a7b3 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuWait.h @@ -0,0 +1,288 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuWait.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : Wait +** Version : Component 01.093, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-09, 10:50, # CodeGen: 833 +** Abstract : +** Implements busy waiting routines. +** Settings : +** Component name : McuWait +** Manual Clock Values : Disabled +** Delay100usFunction : Delay100US +** RTOS : Enabled +** RTOS : McuRTOS +** Watchdog : Disabled +** Contents : +** Wait10Cycles - void McuWait_Wait10Cycles(void); +** Wait100Cycles - void McuWait_Wait100Cycles(void); +** WaitCycles - void McuWait_WaitCycles(uint32_t cycles); +** WaitLongCycles - void McuWait_WaitLongCycles(uint32_t cycles); +** Waitms - void McuWait_Waitms(uint32_t ms); +** Waitus - void McuWait_Waitus(uint32_t us); +** Waitns - void McuWait_Waitns(uint32_t ns); +** WaitOSms - void McuWait_WaitOSms(void); +** Init - void McuWait_Init(void); +** Deinit - void McuWait_Deinit(void); +** +** * Copyright (c) 2013-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuWait.h +** @version 01.00 +** @brief +** Implements busy waiting routines. +*/ +/*! +** @addtogroup McuWait_module McuWait module documentation +** @{ +*/ + +#ifndef __McuWait_H +#define __McuWait_H + +/* MODULE McuWait. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuWaitconfig.h" /* configuration */ +#if McuLib_CONFIG_CPU_IS_ESP32 + #include "rom/ets_sys.h" /* delay routines in ROM */ +#endif +#if McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX + #include /* for sleep */ +#endif + +/* other includes needed */ +#if McuWait_CONFIG_USE_RTOS_WAIT + /* include RTOS header files */ + #include "McuRTOS.h" + #if McuLib_CONFIG_CPU_IS_ESP32 + #include "freertos/FreeRTOS.h" /* for vTaskDelay() */ + #include "freertos/task.h" + #else + #include "FreeRTOS.h" /* for vTaskDelay() */ + #include "task.h" + #endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_PROCESSOR_EXPERT + #define McuWait_INSTR_CLOCK_HZ CPU_CORE_CLK_HZ /* for Kinetis, use core clock as base for instruction execution */ +#else + extern uint32_t SystemCoreClock; /* clock frequency variable defined system_.h of the SDK */ + #define McuWait_INSTR_CLOCK_HZ SystemCoreClock /* core clock frequency in Hz */ +#endif +#define McuWait_NofCyclesMs(ms, hz) (((McuWait_CONFIG_NOF_CYCLES_FOR_NOP_MUL)*(ms)*(hz))/(1000U*(McuWait_CONFIG_NOF_CYCLES_FOR_NOP_DIV))) /* calculates the needed cycles based on bus clock frequency */ +#define McuWait_NofCyclesUs(us, hz) (((McuWait_CONFIG_NOF_CYCLES_FOR_NOP_MUL)*(us)*(hz))/(1000U*1000U*(McuWait_CONFIG_NOF_CYCLES_FOR_NOP_DIV))) /* calculates the needed cycles based on bus clock frequency */ +#define McuWait_NofCyclesNs(ns, hz) (((McuWait_CONFIG_NOF_CYCLES_FOR_NOP_MUL)*(ns)*(hz))/(1000U*1000U*1000U*(McuWait_CONFIG_NOF_CYCLES_FOR_NOP_DIV))) /* calculates the needed cycles based on bus clock frequency */ + +#define McuWait_WAIT_C(cycles) \ + ( (cycles)<=10 ? \ + McuWait_Wait10Cycles() \ + : McuWait_WaitCycles(cycles) \ + ) /*!< wait for some cycles */ + + +void McuWait_Wait10Cycles(void); +/* +** =================================================================== +** Method : Wait10Cycles (component Wait) +** +** Description : +** Wait for 10 CPU cycles. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuWait_Wait100Cycles(void); +/* +** =================================================================== +** Method : Wait100Cycles (component Wait) +** +** Description : +** Wait for 100 CPU cycles. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuWait_WaitCycles(uint32_t cycles); +/* +** =================================================================== +** Method : WaitCycles (component Wait) +** +** Description : +** Wait for a specified number of CPU cycles. +** Parameters : +** NAME - DESCRIPTION +** cycles - The number of cycles to wait. +** Returns : Nothing +** =================================================================== +*/ + +void McuWait_Waitms(uint32_t ms); +/* +** =================================================================== +** Method : Waitms (component Wait) +** +** Description : +** Wait for a specified time in milliseconds. +** Parameters : +** NAME - DESCRIPTION +** ms - How many milliseconds the function has to +** wait +** Returns : Nothing +** =================================================================== +*/ + +/* we are having a static clock configuration: implement as macro/inlined version */ +#if McuLib_CONFIG_CPU_IS_ESP32 + #define McuWait_Waitus(us) esp_rom_delay_us(us) +#else + #define McuWait_Waitus(us) \ + /*lint -save -e(505,506,522) Constant value Boolean, Redundant left argument to comma. */\ + ( ((McuWait_NofCyclesUs((us),McuWait_INSTR_CLOCK_HZ)==0)||(us)==0) ? \ + (void)0 : \ + ( ((us)/1000)==0 ? (void)0 : McuWait_Waitms(((us)/1000))) \ + , (McuWait_NofCyclesUs(((us)%1000), McuWait_INSTR_CLOCK_HZ)==0) ? (void)0 : \ + McuWait_WAIT_C(McuWait_NofCyclesUs(((us)%1000), McuWait_INSTR_CLOCK_HZ)) \ + /*lint -restore */\ + ) +#endif +/* +** =================================================================== +** Method : Waitus (component Wait) +** +** Description : +** Wait for a specified time in microseconds. +** Parameters : +** NAME - DESCRIPTION +** us - How many microseconds the function has to +** wait +** Returns : Nothing +** =================================================================== +*/ + +/* we are having a static clock configuration: implement as macro/inlined version */ +#define McuWait_Waitns(ns) \ + /*lint -save -e(505,506,522) Constant value Boolean, Redundant left argument to comma. */\ + ( ((McuWait_NofCyclesNs((ns), McuWait_INSTR_CLOCK_HZ)==0)||(ns)==0) ? \ + (void)0 : \ + McuWait_Waitus((ns)/1000) \ + , (McuWait_NofCyclesNs((ns)%1000, McuWait_INSTR_CLOCK_HZ)==0) ? \ + (void)0 : \ + McuWait_WAIT_C(McuWait_NofCyclesNs(((ns)%1000), McuWait_INSTR_CLOCK_HZ)) \ + /*lint -restore */\ + ) +/* +** =================================================================== +** Method : Waitns (component Wait) +** +** Description : +** Wait for a specified time in nano seconds. +** Parameters : +** NAME - DESCRIPTION +** ns - How many ns the function has to wait +** Returns : Nothing +** =================================================================== +*/ + +#if McuWait_CONFIG_USE_RTOS_WAIT + /* use FreeRTOS API, but only if scheduler is running */ + #define McuWait_WaitOSms(ms) xTaskGetSchedulerState()==taskSCHEDULER_RUNNING ? vTaskDelay(pdMS_TO_TICKS(ms)) : McuWait_Waitms(ms) +#else + #define McuWait_WaitOSms(ms) McuWait_Waitms(ms) /* use normal wait */ +#endif +/* +** =================================================================== +** Method : WaitOSms (component Wait) +** +** Description : +** If an RTOS is enabled, this routine will use a non-blocking +** wait method. Otherwise it will do a busy/blocking wait. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuWait_WaitLongCycles(uint32_t cycles); +/* +** =================================================================== +** Method : WaitLongCycles (component Wait) +** +** Description : +** Wait for a specified number of CPU cycles (32bit data type). +** Parameters : +** NAME - DESCRIPTION +** cycles - The number of cycles to wait. +** Returns : Nothing +** =================================================================== +*/ + +void McuWait_Init(void); +/* +** =================================================================== +** Method : Init (component Wait) +** +** Description : +** Driver initialization routine. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuWait_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component Wait) +** +** Description : +** Driver de-initialization routine +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuWait. */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif +/* ifndef __McuWait_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuWaitIAR.s.txt b/TSM_PicoW_Sensor/McuLib/src/McuWaitIAR.s.txt new file mode 100644 index 0000000..9b7ca02 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuWaitIAR.s.txt @@ -0,0 +1,29 @@ +/* NOTE: because the IAR compiler cannot handle inline assembly with labels, + * this assembly file has to be included for IAR projects. + * If this file is provided with .s.txt extension: + * Remove the .txt extension and build it with the IAR project. + */ +/* use code segment, and we are generating ARM thumb code: */ + RSEG CODE:CODE(2) + thumb + +/* external interface declaration; */ + PUBLIC McuWait_Wait100Cycles + +/*-----------------------------------------------------------*/ +McuWait_Wait100Cycles: + /* bl to here: [4] */ + movs r0,#0 /* [1] load loop counter */ + loop: /* 9*[10] */ + nop /* [1] */ + nop /* [1] */ + nop /* [1] */ + nop /* [1] */ + nop /* [1] */ + adds r0,#1 /* [1] increment loop counter */ + cmp r0,#9 /* [1] 9*10 cycles */ + bls loop /* [3] for taken, [1] for not taken */ + nop /* additional nop to fill up to 100 cycles */ + bx lr /* return to caller */ +/*-----------------------------------------------------------*/ + END diff --git a/TSM_PicoW_Sensor/McuLib/src/McuWatchdog.c b/TSM_PicoW_Sensor/McuLib/src/McuWatchdog.c new file mode 100644 index 0000000..4689cb7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuWatchdog.c @@ -0,0 +1,246 @@ +/* + * Copyright (c) 2023, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "McuWatchdog.h" +#if McuWatchdog_CONFIG_USE_WATCHDOG +#include "McuRTOS.h" +#include "McuLog.h" +#include "hardware/watchdog.h" +#include "McuWait.h" +#include "McuUtility.h" +#include "McuArmTools.h" + +static uint16_t McuWatchdog_State = 0; /* additional watchdog protection with state variable */ + +typedef struct McuWatchdog_Reports { + McuWatchdog_ReportID_e id; /* task reporter ID */ + bool isSuspended; /* if suspended or not */ + const unsigned char *name; /* reporter or task name */ + uint32_t reportMsPerSec; /* average number of ms reported for one second */ + uint8_t minPercent, maxPercent; /* percentage range */ +} McuWatchdog_Reports; + +static McuWatchdog_Reports reports[McuWatchdog_REPORT_ID_NOF]; + +void McuWatchdog_InitReportEntry(McuWatchdog_ReportID_e id, const unsigned char *name, uint32_t msForOneSec, uint8_t minPercent, uint8_t maxPercent) { + if (id=min && McuWatchdog_Recordings[i].ms<=max) { + McuWatchdog_Recordings[i].ms = 0; /* within boundaries, reset counter */ + } else if (reports[i].isSuspended) { + McuLog_warn("%s is suspended", reports[i].name); + McuWatchdog_Recordings[i].ms = 0; /* reset counter */ + } else { + uint8_t buf[48]; + + McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"WDT FAILURE: "); + McuUtility_strcat(buf, sizeof(buf), reports[i].name); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" ms:"); + McuUtility_strcatNum32u(buf, sizeof(buf), McuWatchdog_Recordings[i].ms); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" min:"); + McuUtility_strcatNum32u(buf, sizeof(buf), min); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" max:"); + McuUtility_strcatNum32u(buf, sizeof(buf), max); + McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); + McuLog_fatal(buf); + for(;;) { + __asm("nop"); /* wait for WDT to time out */ + } + } + taskEXIT_CRITICAL(); + } +} + +/* extra safety checks, idea by Jack Ganssle, see "Great Watchdog Timers for Embedded Systems" */ +static void McuWatchdog_a(void) { + if (McuWatchdog_State!=0x5555) { + McuLog_fatal("something wrong"); + for(;;) { + __asm("nop"); + } + } + McuWatchdog_State += 0x1111; +} + +static void McuWatchdog_b(void) { + if (McuWatchdog_State!=0x8888) { + McuLog_fatal("something wrong"); + for(;;) { /* getting here in case of run-away code?!? */ + __asm("nop"); + } + } +#if McuWatchdog_DISABLED_FOR_DEBUG + #warning "Watchdog is disabled!" +#else + watchdog_update(); +#endif + if (McuWatchdog_State!=0x8888) { + McuLog_fatal("something wrong"); + for(;;) { /* getting here in case of run-away code?!? */ + __asm("nop"); + } + } + McuWatchdog_State = 0; /* reset state */ +} + +static void McuWatchdog_StateA(void) { + McuWatchdog_State = 0x5555; + McuWatchdog_a(); +} + +static void McuWatchdog_StateB(void) { + McuWatchdog_State += 0x2222; + McuWatchdog_b(); /* here we kick the dog */ +} + +static void WatchdogTask(void *pv) { + uint32_t ms = 0; + + McuLog_trace("started watchdog task"); + for(;;) { + McuWatchdog_StateA(); + vTaskDelay(pdMS_TO_TICKS(McuWatchdog_CONFIG_TIMEOUT_MS/4)); /* give back some CPU time. We are doing this here at a higher rate then the HW watchdog timer timeout */ + ms += McuWatchdog_CONFIG_TIMEOUT_MS/4; + McuWatchdog_StateB(); + if (ms>=McuWatchdog_CONFIG_HEALT_CHECK_TIME_SEC*1000) { + McuWatchdog_CheckHealth(); /* if not healthy, we will block here */ + ms = 0; + } + } +} + +void McuWatchdog_EnableTimer(void) { +#if McuWatchdog_DISABLED_FOR_DEBUG + #warning "Watchdog is disabled" +#else + /* Enable the watchdog, requiring the watchdog to be updated or the chip will reboot + second arg is pause on debug which means the watchdog will pause when stepping through code */ + watchdog_enable(McuWatchdog_CONFIG_TIMEOUT_MS, true); /* enable watchdog timer */ +#endif +} + +void McuWatchdog_Deinit(void) { + /* nothing needed */ +} + +void McuWatchdog_Init(void) { + if (watchdog_caused_reboot()) { + McuLog_fatal("Rebooted by Watchdog"); + } else { + McuLog_info("Clean boot"); + } + for(int i=0; i + +#include McuWatchdog_CONFIG_REPORT_ID_INCLUDE_HEADER_FILE + +/* list of IDs to identify items monitored by the watchdog task */ +typedef enum McuWatchdog_ReportID_e { + #include McuWatchdog_CONFIG_REPORT_ID_INCLUDE_FILE + McuWatchdog_REPORT_ID_NOF /* sentinel, must be last! */ +} McuWatchdog_ReportID_e; + +#define McuWatchdog_REPORT_ID_CURR_TASK (McuWatchdog_REPORT_ID_NOF) /* special id to report time for the current task, which has been registered earlier with McuWatchdog_SetTaskHandle() */ + +/*! + * \brief Initialize the report structure + * @param id ID of the entry + * @param name Name for the entry + * @param msForOneSec Number of average milliseconds reporting time per second, usually 1000 + * @param minPercent Minimum percentage of time reporting needed + * @param maxPercent Maximum percentage of allowed time reporting + */ +void McuWatchdog_InitReportEntry(McuWatchdog_ReportID_e id, const unsigned char *name, uint32_t msForOneSec, uint8_t minPercent, uint8_t maxPercent); + +/*! + * \brief Used to start measuring a time for later reporting + * \return Number of RTOS ticks at the start, at the time of call. + */ +TickType_t McuWatchdog_ReportTimeStart(void); + +/*! + * \brief Report the time spent, which has been recorded with McuWatchdog_ReportTimeStart() + * \param id Task ID + * \param startTickCount Tick count previously recorded with McuWatchdog_ReportTimeStart() + */ +void McuWatchdog_ReportTimeEnd(McuWatchdog_ReportID_e id, TickType_t startTickCount) ; + +/*! + * \brief Delay a task with vTaskDelay for a given number of times, each time for ms, and report the delay. + * \param id Task ID + * \param ms Iteration delay time in milliseconds + * \param nof Number of delays + */ +void McuWatchdog_DelayAndReport(McuWatchdog_ReportID_e id, uint32_t nof, uint32_t ms); + +/*! + * \brief Set the task handle for an id. With this we can report time using McuWatchdog_REPORT_ID_CURR_TASK + * \param id ID of item + * \param task FreeRTOS task handle + */ +void McuWatchdog_SetTaskHandle(McuWatchdog_ReportID_e id, TaskHandle_t task); + +/*! + * \brief Suspend checking for a given id + * \param id ID of item to be suspended + */ +void McuWatchdog_SuspendCheck(McuWatchdog_ReportID_e id); + +/*! + * \brief Resume checking for a given id + * \param id ID of item to be suspended + */ +void McuWatchdog_ResumeCheck(McuWatchdog_ReportID_e id); + + +/*! + * \brief Report the time spent for an item (id) + * \param id ID of item + * \param ms Time in milliseconds + */ +void McuWatchdog_Report(McuWatchdog_ReportID_e id, uint32_t ms); + +/*! + * \brief Enable the watchdog timer. Do this early in the application. + */ +void McuWatchdog_EnableTimer(void); + +/*! + * \brief Module de-initialization. + */ +void McuWatchdog_Deinit(void); + +/*! + * \brief Module initialization. This creates the monitoring watchdog task. + */ +void McuWatchdog_Init(void); + +#endif /* McuWatchdog_CONFIG_USE_WATCHDOG */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* SRC_MCUWATCHDOG_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuX12_017.c b/TSM_PicoW_Sensor/McuLib/src/McuX12_017.c new file mode 100644 index 0000000..aaba1a4 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuX12_017.c @@ -0,0 +1,298 @@ +/* + * Copyright (c) 2019, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * + * Driver for the X12.017 Quad-Stepper motor driver + */ + +#include "McuX12_017config.h" +#include "McuX12_017.h" +#include "McuLib.h" +#include "McuGPIO.h" +#include "McuWait.h" +#include "McuUtility.h" +#if MCUULN2003_CONFIG_USE_FREERTOS_HEAP + #include "McuRTOS.h" +#else + #include /* for malloc()/free() */ +#endif + +typedef struct { + int32_t pos; /* current position */ + bool isForward; /* if current direction is forward */ + bool isInverted; /* if motor direction is inverted */ + McuGPIO_Handle_t dir; /* direction pin, shall be LOW if not used */ + McuGPIO_Handle_t step; /* step pin, shall be LOW if not used */ +} X12_Motor_t; + +typedef struct { /* descriptor for X12.017 stepper motor driver */ + bool hasReset; + McuGPIO_Handle_t reset; /* LOW active, shall be low at power-on */ + X12_Motor_t m[X12_017_NOF_M]; /* each X12.017 can have up to 4 stepper motors */ +} McuX12_Device_t; + +/* default configuration, used for initializing the config */ +static const McuX12_017_Config_t defaultConfig = +{ + .hasReset = false, + /* reset pin */ + .hw_reset = { + #if McuLib_CONFIG_NXP_SDK_USED && !McuLib_CONFIG_IS_KINETIS_KE + .gpio = NULL, + #elif McuLib_CONFIG_CPU_IS_STM32 + .gpio = NULL, + #endif + #if McuLib_CONFIG_CPU_IS_KINETIS + .port = NULL, + #elif McuLib_CONFIG_CPU_IS_LPC + .port = 0, + #endif + .pin = 0, + }, + + .motor[X12_017_M0] = { + .isInverted = false, + }, + + .motor[X12_017_M1] = { + .isInverted = false, + }, + +#if McuX12_017_CONFIG_QUAD_DRIVER + .motor[X12_017_M2] = { + .isInverted = false, + }, + + .motor[X12_017_M3] = { + .isInverted = false, + }, +#endif +}; + +void McuX12_017_GetDefaultConfig(McuX12_017_Config_t *config) { + memcpy(config, &defaultConfig, sizeof(*config)); +} + +McuX12_017_Handle_t McuX12_017_DeinitDevice(McuX12_017_Handle_t device) { + McuX12_Device_t *dev = (McuX12_Device_t*)device; + + if (dev->hasReset) { + McuGPIO_DeinitGPIO(dev->reset); + } + for(int i=0; i<4; i++) { + McuGPIO_DeinitGPIO(dev->m[i].dir); + McuGPIO_DeinitGPIO(dev->m[i].step); + } +#if McuX12_017_CONFIG_USE_FREERTOS_HEAP + vPortFree(dev); +#else + free(dev); +#endif + return NULL; +} + +McuX12_017_Handle_t McuX12_017_InitDevice(McuX12_017_Config_t *config) { + McuGPIO_Config_t gpio_config; /* config for the SDK */ + McuX12_Device_t *handle; + +#if McuX12_017_CONFIG_USE_FREERTOS_HEAP + handle = (McuX12_Device_t*)pvPortMalloc(sizeof(McuX12_Device_t)); /* get a new device descriptor */ +#else + handle = (McuX12_Device_t*)malloc(sizeof(McuX12_Device_t)); /* get a new device descriptor */ +#endif + assert(handle!=NULL); + if (handle!=NULL) { /* if malloc failed, will return NULL pointer */ + memset(handle, 0, sizeof(McuX12_Device_t)); /* init all fields */ + handle->hasReset = config->hasReset; + McuGPIO_GetDefaultConfig(&gpio_config); + if (config->hasReset) { /* reset pin */ + gpio_config.isInput = false; /* reset pin is output only */ + memcpy(&gpio_config.hw, &config->hw_reset, sizeof(gpio_config.hw)); /* copy hardware info */ + gpio_config.isHighOnInit = false; /* driver reset pin is LOW by default */ + handle->reset = McuGPIO_InitGPIO(&gpio_config); /* create gpio handle */ + } + for(McuX12_017_Motor_e i=0; imotor[i].hw_step, sizeof(gpio_config.hw)); /* copy hardware info */ + gpio_config.isHighOnInit = false; + handle->m[i].step = McuGPIO_InitGPIO(&gpio_config); /* create gpio handle */ + + /* direction pin */ + handle->m[i].isInverted = config->motor[i].isInverted; + handle->m[i].isForward = true; + handle->m[i].pos = 0; + /* direction pin */ + gpio_config.isInput = false; /* direction pin is output only */ + memcpy(&gpio_config.hw, &config->motor[i].hw_dir, sizeof(gpio_config.hw)); /* copy hardware info */ + gpio_config.isHighOnInit = false; + handle->m[i].dir = McuGPIO_InitGPIO(&gpio_config); /* create gpio handle */ + McuX12_017_SetForward(handle, i); /* make sure that motor is initialized with direction */ + } + } + return handle; +} + +void McuX12_017_ResetDriver(McuX12_017_Handle_t device) { + /* RESET line shall be low during power-on (e.g. with pull-down resistor), then can be released after 1ms after power-on */ + McuX12_Device_t *dev = (McuX12_Device_t*)device; + + if (dev->hasReset) { + McuGPIO_SetLow(dev->reset); + McuWait_Waitms(1); + McuGPIO_SetHigh(dev->reset); /* reset is low active */ + McuWait_Waitus(10); + } +} + +void McuX12_017_SetResetLine(McuX12_017_Handle_t device, bool setHigh) { + /* RESET is low-active */ + McuX12_Device_t *dev = (McuX12_Device_t*)device; + + if (dev!=NULL && dev->hasReset) { + McuGPIO_SetValue(dev->reset, setHigh); + } +} + +void McuX12_017_SetForward(McuX12_017_Handle_t device, McuX12_017_Motor_e motor) { + McuX12_Device_t *dev = (McuX12_Device_t*)device; + + McuGPIO_SetValue(dev->m[motor].dir, !dev->m[motor].isInverted); + dev->m[motor].isForward = true; + McuWait_Waitus(10); +} + +void McuX12_017_SetBackward(McuX12_017_Handle_t device, McuX12_017_Motor_e motor) { + McuX12_Device_t *dev = (McuX12_Device_t*)device; + + McuGPIO_SetValue(dev->m[motor].dir, dev->m[motor].isInverted); + dev->m[motor].isForward = false; + McuWait_Waitus(10); +} + +void McuX12_017_Step(McuX12_017_Handle_t device, McuX12_017_Motor_e motor) { + McuX12_Device_t *dev = (McuX12_Device_t*)device; + + McuGPIO_SetHigh(dev->m[motor].step); + McuWait_Waitus(10); + McuGPIO_SetLow(dev->m[motor].step); + McuWait_Waitus(100); + if (dev->m[motor].isForward) { + dev->m[motor].pos++; + } else { + dev->m[motor].pos--; + } +} + +void McuX12_017_DoSteps(McuX12_017_Handle_t device, McuX12_017_Motor_e motor, int32_t steps) { + McuX12_Device_t *dev = (McuX12_Device_t*)device; + + if (steps>=0 && !dev->m[motor].isForward) { + McuX12_017_SetForward(device, motor); + } else if (steps<0 && dev->m[motor].isForward) { + McuX12_017_SetBackward(device, motor); + } + if (steps<0) { + steps = -steps; + } + while(steps>0) { + McuX12_017_Step(device, motor); + steps--; + } +} + +void McuX12_017_SingleStep(McuX12_017_Handle_t device, McuX12_017_Motor_e motor, int step) { + McuX12_Device_t *dev = (McuX12_Device_t*)device; + + if (step<=0 && dev->m[motor].isForward) { /* change direction */ + McuX12_017_SetBackward(dev, motor); + } else if (step>0 && !dev->m[motor].isForward) { /* change direction */ + McuX12_017_SetForward(dev, motor); + } + McuGPIO_SetHigh(dev->m[motor].step); /* do step, next statements will do an implicit delay */ + /* change position information */ + if (dev->m[motor].isForward) { + dev->m[motor].pos++; + } else { + dev->m[motor].pos--; + } + McuGPIO_SetLow(dev->m[motor].step); +} + +int32_t X12_017_GetPos(McuX12_017_Handle_t device, McuX12_017_Motor_e motor) { + McuX12_Device_t *dev = (McuX12_Device_t*)device; + return dev->m[motor].pos; +} + +void X12_017_SetPos(McuX12_017_Handle_t device, McuX12_017_Motor_e motor, int32_t pos) { + McuX12_Device_t *dev = (McuX12_Device_t*)device; + dev->m[motor].pos = pos; +} + +void McuX12_017_GetDeviceStatusString(McuX12_017_Handle_t device, unsigned char *buf, size_t bufSize) { + McuX12_Device_t *dev = (McuX12_Device_t*)device; + + *buf = '\0'; + McuUtility_strcat(buf, bufSize, (unsigned char*)"reset:"); + if (dev->hasReset) { + McuUtility_strcat(buf, bufSize, (unsigned char*)"y, "); + } else { + McuUtility_strcat(buf, bufSize, (unsigned char*)"n, "); + } + for(McuX12_017_Motor_e m=X12_017_M0; mm[m].pos); + McuUtility_strcat(buf, bufSize, (unsigned char*)" fw:"); + if (dev->m[m].isForward) { + McuUtility_strcat(buf, bufSize, (unsigned char*)"y "); + } else { + McuUtility_strcat(buf, bufSize, (unsigned char*)"n "); + } + McuUtility_strcat(buf, bufSize, (unsigned char*)"inv:"); + if (dev->m[m].isInverted) { + McuUtility_strcat(buf, bufSize, (unsigned char*)"y "); + } else { + McuUtility_strcat(buf, bufSize, (unsigned char*)"n "); + } + } +} + +void McuX12_017_DisableDevice(McuX12_017_Handle_t device) { + McuX12_Device_t *x12 = (McuX12_Device_t*)device; + + if (x12->hasReset) { + McuGPIO_SetAsInput(x12->reset); + } + for(int i=0; im[i].dir); + McuGPIO_SetAsInput(x12->m[i].step); + } +} + +void McuX12_017_EnableDevice(McuX12_017_Handle_t device) { + McuX12_Device_t *x12 = (McuX12_Device_t*)device; + + if (x12->hasReset) { + McuGPIO_SetAsOutput(x12->reset, true); + } + for(int i=0; im[i].isForward) { /* set pin according to current direction state */ + McuGPIO_SetAsOutput(x12->m[i].dir, !x12->m[i].isInverted); + } else { + McuGPIO_SetAsOutput(x12->m[i].dir, x12->m[i].isInverted); + } + McuGPIO_SetAsOutput(x12->m[i].step, false); + } +} + +void McuX12_017_Deinit(void) { + /* nothing needed */ +} + +void McuX12_017_Init(void) { + /* nothing needed */ +} + diff --git a/TSM_PicoW_Sensor/McuLib/src/McuX12_017.h b/TSM_PicoW_Sensor/McuLib/src/McuX12_017.h new file mode 100644 index 0000000..941c4ef --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuX12_017.h @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2019, Erich Styger + * + * SPDX-License-Identifier: BSD-3-Clause + * + * Driver for the X12.017 Quad-Stepper motor driver + */ + +#ifndef MCU_X12_017_H_ +#define MCU_X12_017_H_ + +#include +#include +#include "McuGPIO.h" +#include "McuX12_017config.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void *McuX12_017_Handle_t; + +typedef enum { + X12_017_M0 = 0, + X12_017_M1 = 1, +#if McuX12_017_CONFIG_QUAD_DRIVER + X12_017_M2 = 2, + X12_017_M3 = 3, +#endif + X12_017_NOF_M /* number of stepper motors the X12.017 can drive */ +} McuX12_017_Motor_e; + +typedef struct { + bool isInverted; /* if direction is inverted */ + McuGPIO_HwPin_t hw_dir; /* direction pin */ + McuGPIO_HwPin_t hw_step; /* step pin */ +} McuX12_017_Motor_t; + +typedef struct { + bool hasReset; /* if using reset pin on driver */ + McuGPIO_HwPin_t hw_reset; /* reset pin */ + McuX12_017_Motor_t motor[X12_017_NOF_M]; /* motors */ +} McuX12_017_Config_t; + +void McuX12_017_GetDefaultConfig(McuX12_017_Config_t *config); + +McuX12_017_Handle_t McuX12_017_InitDevice(McuX12_017_Config_t *config); +McuX12_017_Handle_t McuX12_017_DeinitDevice(McuX12_017_Handle_t device); + +void McuX12_017_ResetDriver(McuX12_017_Handle_t device); +void McuX12_017_SetResetLine(McuX12_017_Handle_t device, bool setHigh); + +void McuX12_017_SetForward(McuX12_017_Handle_t device, McuX12_017_Motor_e motor); +void McuX12_017_SetBackward(McuX12_017_Handle_t device, McuX12_017_Motor_e motor); + +void McuX12_017_Step(McuX12_017_Handle_t device, McuX12_017_Motor_e motor); +void McuX12_017_DoSteps(McuX12_017_Handle_t device, McuX12_017_Motor_e motor, int32_t steps); + +void McuX12_017_SingleStep(McuX12_017_Handle_t device, McuX12_017_Motor_e motor, int step); + +int32_t X12_017_GetPos(McuX12_017_Handle_t device, McuX12_017_Motor_e motor); +void X12_017_SetPos(McuX12_017_Handle_t device, McuX12_017_Motor_e motor, int32_t pos); + +void McuX12_017_GetDeviceStatusString(McuX12_017_Handle_t device, unsigned char *buf, size_t bufSize); + +void McuX12_017_DisableDevice(McuX12_017_Handle_t device); +void McuX12_017_EnableDevice(McuX12_017_Handle_t device); + +void McuX12_017_Deinit(void); +void McuX12_017_Init(void); + +#ifdef __cplusplus +} +#endif + +#endif /* MCU_X12_017_H_ */ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuXFormat.c b/TSM_PicoW_Sensor/McuLib/src/McuXFormat.c new file mode 100644 index 0000000..5caa1a3 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuXFormat.c @@ -0,0 +1,1216 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuXFormat.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : XFormat +** Version : Component 01.026, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-11-23, 10:16, # CodeGen: 715 +** Abstract : +** +** Settings : +** +** Contents : +** xvformat - unsigned McuXFormat_xvformat(void (*outchar)(void *,char), void *arg, const... +** xformat - unsigned McuXFormat_xformat(void (*outchar)(void *,char), void *arg, const... +** xsprintf - int McuXFormat_xsprintf(char *buf, const char *fmt, ...); +** xsnprintf - int McuXFormat_xsnprintf(char *buf, size_t max_len, const char *fmt, ...); +** Deinit - void McuXFormat_Deinit(void); +** Init - void McuXFormat_Init(void); +** +** * Copyright : (c) Copyright Mario Viara, 2014-2020, https://github.com/MarioViara/xprintfc +** * Adopted for Processor Expert: Erich Styger +** * xsnprintf() contributed by Engin Lee +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuXFormat.h +** @version 01.00 +** @brief +** +*/ +/*! +** @addtogroup McuXFormat_module McuXFormat module documentation +** @{ +*/ + +/* MODULE McuXFormat. */ +/** + * @file xformatc.c + * + * @brief Printf C implementation. + * + * Tested wuth the following operating systems / compilers : + * + * - Visual studio 6 + * - Visual studio 2008 / Windows CE + * - MinGw 32 + * - Linux i686 + * - Linux x86_64 + * - GCC wiith embedded ARM. + * - Linux armel + * - HCS08 with Freescale compiler. + * - SDCC (Z80 and 8051) + * + * @author Mario Viara + * + * + * @copyright Copyright Mario Viara 2014 - License Open Source (LGPL) + * This is a free software and is opened for education, research and commercial + * developments under license policy of following terms: + * + * - This is a free software and there is NO WARRANTY. + * - No restriction on use. You can use, modify and redistribute it for personal, + * non-profit or commercial product UNDER YOUR RESPONSIBILITY. + * - Redistributions of source code must retain the above copyright notice. + * + * To contact the author send an email to mario_at_viara.eu + * + */ +#include "McuXFormat.h" + +/** + * Default largest int is long + */ +#ifndef LONG +#define LONG long +#endif + +/** + * Define the double type if not defined + */ +#ifndef DOUBLE +#define DOUBLE double +#endif + + +/** + * Default long long type + */ +#ifndef LONGLONG +#define LONGLONG long long +#endif + + +/** + * Definition to convert integer part of floating point + * number if supported we use the long long type + */ +#if XCFG_FORMAT_LONGLONG +#define FLOAT_LONG LONGLONG +#define FLOAT_VALUE llvalue +#define FLOAT_TYPE FLAG_TYPE_LONGLONG +#else +#define FLOAT_LONG LONG +#define FLOAT_VALUE lvalue +#define FLOAT_TYPE FLAG_TYPE_LONG +#endif + +/** + * Structure with all parameter used + */ +struct param_s +{ + /** + * Buffer for current integer value and for temporary + * double value defined as union to save stack. + */ + union + { + unsigned LONG lvalue; +#if XCFG_FORMAT_LONGLONG + unsigned LONGLONG llvalue; +#endif +#if XCFG_FORMAT_FLOAT + DOUBLE dvalue; +#endif + } values; + + /** + * Pointer to the output buffer + */ + char* out; + +#if XCFG_FORMAT_FLOAT + /** + * Floating point argument + */ + DOUBLE dbl; + + /** + * Integer part of floating point + */ + unsigned FLOAT_LONG iPart; + +#endif + + + /** + * Current length of the output buffer + */ + int length; + + /** + * Field precision + */ + int prec; + + /** + * Field width + */ + int width; + + + /** + * Count the number of char emitted + */ + unsigned count; + + + /** + * Parser flags + */ + unsigned flags; + +#define FLAG_TYPE_INT 0x0000 /* Argument is integer */ +#define FLAG_TYPE_LONG 0x0001 /* Argument is long */ +#define FLAG_TYPE_SIZEOF 0x0002 /* Argument is size_t */ +#define FLAG_TYPE_LONGLONG 0x0003 /* Argument is long long */ +#define FLAG_TYPE_MASK 0x0003 /* Mask for field type */ +#define FLAG_PREC 0x0004 /* Precision set */ +#define FLAG_LEFT 0x0008 /* Left alignment */ +#define FLAG_BLANK 0x0010 /* Blank before positive integer number */ +#define FLAG_PREFIX 0x0020 /* Prefix required */ +#define FLAG_PLUS 0x0040 /* Force a + before positive number */ +#define FLAG_UPPER 0x0080 /* Output in upper case letter */ +#define FLAG_DECIMAL 0x0100 /* Decimal field */ +#define FLAG_INTEGER 0x0200 /* Integer field */ +#define FLAG_MINUS 0x0400 /* Field is negative */ +#define FLAG_VALUE 0x0800 /* Value set */ +#define FLAG_BUFFER 0x1000 /* Buffer set */ + + /** + * Length of the prefix + */ + int prefixlen; + + /* Buffer to store the field prefix */ + char prefix[2]; + + + /** Buffer to store the biggest integer number in binary */ +#if XCFG_FORMAT_LONGLONG + char buffer[sizeof(LONGLONG)*8+1]; +#else + char buffer[sizeof(LONG)*8+1]; +#endif + + /* Radix for ASCII integer conversion */ + unsigned char radix; + + /* char used for padding */ + char pad; + + + /** + * Current state + */ + char state; + +}; + + +/** + * Enum for the internal state machine + */ +enum State +{ + /* Normal state outputting literal */ + ST_NORMAL = 0, + /* Just read % */ + ST_PERCENT = 1, + + /* Just read flag */ + ST_FLAG = 2, + + /* Just read the width */ + ST_WIDTH = 3, + + /* Just read '.' */ + ST_DOT= 4, + + /* Just read the precision */ + ST_PRECIS = 5, + + /* Just read the size */ + ST_SIZE = 6, + + /* Just read the type specifier */ + ST_TYPE = 7 +}; + +/** + * Enum for char class + */ +enum CharClass +{ + /* Other char */ + CH_OTHER = 0, + /* The % char */ + CH_PERCENT = 1, + /* The . char */ + CH_DOT = 2, + /* The * char */ + CH_STAR = 3, + /* The 0 char */ + CH_ZERO = 4, + /* Digit 0-9 */ + CH_DIGIT = 5, + /* Flag chars */ + CH_FLAG = 6, + /* Size chars */ + CH_SIZE = 7, + /* Type chars */ + CH_TYPE = 8 +}; + + + +/** + * String used when %s is a null parameter + */ +static const char ms_null[] = "(null)"; +/* + * String for true value + */ +static const char ms_true[] = "True"; + +/** + * String for false value + */ +static const char ms_false[]= "False"; + + +/* + * Digit values + */ +static const char ms_digits[] = "0123456789abcdef"; + + +/* + * This table contains the next state for all char and it will be + * generate using xformattable.c + */ + +static const unsigned char formatStates[] = +{ + 0x06,0x00,0x00,0x06,0x00,0x01,0x00,0x00, + 0x10,0x00,0x03,0x06,0x00,0x06,0x02,0x10, + 0x04,0x45,0x45,0x45,0x45,0x05,0x05,0x05, + 0x05,0x35,0x30,0x00,0x50,0x60,0x00,0x00, + 0x00,0x20,0x28,0x38,0x50,0x50,0x00,0x00, + 0x00,0x30,0x30,0x30,0x50,0x50,0x00,0x00, + 0x08,0x20,0x20,0x28,0x20,0x20,0x20,0x00, + 0x08,0x60,0x60,0x60,0x60,0x60,0x60,0x00, + 0x00,0x70,0x78,0x78,0x78,0x70,0x78,0x00, + 0x07,0x08,0x00,0x00,0x07,0x00,0x28,0x08, + 0x08,0x00,0x00,0x08,0x00,0x08,0x00,0x00, + 0x08,0x00,0x07 +}; + + + + +/** + * Convert an unsigned value in one string + * + * All parameter are in the passed structure + * + * @param prec - Minimum precision + * @param lvalue - Unsigned value + * @param radix - Radix (Supported values 2/8/10/16) + * + * @param out - Buffer with the converted value. + */ +static void ulong2a(struct param_s * param) +{ + unsigned char digit; + + while (param->prec -- > 0 || param->values.lvalue) + { + switch (param->radix) + { + case 2: + digit = (unsigned char)(param->values.lvalue & 0x01); + param->values.lvalue >>= 1; + break; + + case 8: + digit = (unsigned char)(param->values.lvalue & 0x07); + param->values.lvalue >>= 3; + break; + + case 16: + digit = (unsigned char)(param->values.lvalue & 0x0F); + param->values.lvalue >>= 4; + break; + + default: + case 10: + digit = (unsigned char)(param->values.lvalue % 10); + param->values.lvalue /= 10; + break; + } + *param->out -- = ms_digits[digit]; + param->length ++; + } +} + + +#if XCFG_FORMAT_LONGLONG +#ifdef XCFG_FORMAT_LONG_ARE_LONGLONG +#define ullong2a ulong2a +#else +static void ullong2a(struct param_s * param) +{ + unsigned char digit; + + while (param->prec -- > 0 || param->values.llvalue) + { + switch (param->radix) + { + case 2: + digit = param->values.llvalue & 0x01; + param->values.llvalue >>= 1; + break; + + case 8: + digit = param->values.llvalue & 0x07; + param->values.llvalue >>= 3; + break; + + case 16: + digit = param->values.llvalue & 0x0F; + param->values.llvalue >>= 4; + break; + + default: + case 10: + digit = param->values.llvalue % 10; + param->values.llvalue /= 10; + + break; + } + + + *param->out -- = ms_digits[digit]; + param->length ++; + + } + +} +#endif +#endif + +#if 1 /* << EST */ +typedef struct { + char *s; + size_t space; +} StrOutBuffer; + +static void putCharIntoBufMaxLen(void *arg, char c) { + StrOutBuffer *buff = (StrOutBuffer*)arg; + if (buff->space > 0) { + buff->space--; + *(buff->s)++ = c; + } +} + +int xsnprintf(char *buf, size_t max_len, const char *fmt, va_list args) { + int res = -1; + StrOutBuffer out; + + out.space = max_len; + out.s = buf; + if (max_len <= 1) { + *buf = 0; + return 0; + } else { + out.space--; /* teminal zero*/ + } + res = (int)McuXFormat_xvformat(putCharIntoBufMaxLen, (void *)&out, fmt, args); + *(out.s) = 0; + if (res > 0) { + res = out.s - buf; + } + return res; +} +#endif + +/* +** =================================================================== +** Method : xformat (component XFormat) +** +** Description : +** Printf() like function using variable arguments +** Parameters : +** NAME - DESCRIPTION +** outchar - Function pointer to output one new +** character +** arg - Argument for the output function +** fmt - Format options for the list of parameters +** openArgList - Open argument list +** Returns : +** --- - Error code +** =================================================================== +*/ +/** + * Printf like using variable arguments. + * + * @param outchar - Pointer to the function to output one new char. + * @param arg - Argument for the output function. + * @param fmt - Format options for the list of parameters. + * @param ... - Arguments + * + * @return The number of char emitted. + * + * @see xvformat + */ +unsigned McuXFormat_xformat(void (*outchar)(void *,char), void *arg, const char * fmt, ...) +{ + va_list list; + unsigned count; + + va_start(list,fmt); + count = McuXFormat_xvformat(outchar,arg,fmt,list); + va_end(list); + return count; +} + +/* +** =================================================================== +** Method : xvformat (component XFormat) +** +** Description : +** Printf() like format function +** Parameters : +** NAME - DESCRIPTION +** outchar - Function pointer to the function +** to output one char. +** * arg - Argument for the output function. +** fmt - Format options for the list of parameters. +** args - List of parameters +** Returns : +** --- - Error code +** =================================================================== +*/ + +/** + * We do not want use any library function. + * + * @param s - C string + * @return The length of the string + */ +static unsigned xstrlen(const char *s) +{ + const char *i; + + for (i = s ; *i ; i++) + { + } + return (unsigned)(i - s); +} + +static unsigned outBuffer(void (*myoutchar)(void *arg,char),void *arg,const char *buffer,int len,unsigned toupper) +{ + unsigned count = 0; + int i; + char c; + + for (i = 0; i < len ; i++) + { + c = buffer[i]; + + if (toupper && (c >= 'a' && c <= 'z')) + { + c -= 'a' - 'A'; + } + + (*myoutchar)(arg,c); + count++; + } + + return count; +} + +static unsigned outChars(void (*myoutchar)(void *arg,char),void *arg,char ch,int len) +{ + unsigned count= 0; + + while (len-- > 0) + { + (*myoutchar)(arg,ch); + count++; + } + + return count; +} + +#if 1 /* << EST added xsprintf() */ +static void putCharIntoBuf(void *arg, char c) { + char **s = (char **)arg; + *(*s)++ = c; +} + +int xsprintf(char *buf, const char *fmt, va_list args) { + int res; + + res = (int)McuXFormat_xvformat(putCharIntoBuf, (void *)&buf, fmt, args); + *buf = 0; + return res; +} +#endif + +/* + * Lint want declare list as const but list is an obscured pointer so + * the warning is disabled. + */ +/*lint -save -e818 */ + + +/** + * Printf like format function. + * + * General format : + * + * %[width][.precision][flags]type + * + * - width Is the minimum size of the field. + * + * - precision Is the maximum size of the field. + * + * Supported flags : + * + * - l With integer number the argument will be of type long. + * - ll With integer number the argument will be of type long long. + * - Space for positive integer a space will be added before. + * - z Compatible with C99 the argument is size_t (aka sizeof(void *)) + * - + A + sign prefix positive number. + * - # A prefix will be printed (o for octal,0x for hex,0b for binary) + * - 0 Value will be padded with zero (default is spacwe) + * - - Left justify as default filed have rigth justification. + * + * Supported type : + * + * - s Null terminated string of char. + * - S Null terminated string of char in upper case. + * - i Integer number. + * - d Integer number. + * - u Unsigned number. + * - x Unsigned number in hex. + * - X Unsigned number in hex upper case. + * - b Binary number + * - o Octal number + * - p Pointer will be emitted with the prefix -> + * - P Pointer in upper case letter. + * - f Floating point number. + * - B Boolean value printed as True / False. + * + * @param outchar - Pointer to the function to output one char. + * @param arg - Argument for the output function. + * @param fmt - Format options for the list of parameters. + * @param args - List parameters. + * + * @return The number of char emitted. + */ +unsigned McuXFormat_xvformat(void (*outchar)(void *,char), void *arg, const char * fmt, va_list _args) +{ + XCFG_FORMAT_STATIC struct param_s param; + int i; + char c; + +#if XCFG_FORMAT_VA_COPY + va_list args; + + va_copy(args,_args); +#else +#define args _args +#endif + + param.count = 0; + param.state = ST_NORMAL; + + while (*fmt) + { + c = *fmt++; + + if (c < ' ' || c > 'z') + i = (int)CH_OTHER; + else + i = formatStates[c - ' '] & 0x0F; + + param.state = (char)(formatStates[(i << 3) + param.state] >> 4); + + switch (param.state) + { + default: + case ST_NORMAL: + (*outchar)(arg,c); + param.count++; + break; + + case ST_PERCENT: + param.flags = (unsigned)(param.length = param.prefixlen = param.width = param.prec = 0); + param.pad = ' '; + break; + + case ST_WIDTH: + if (c == '*') { + param.width = (int)va_arg(args,int); + } else { + param.width = param.width * 10 + (c - '0'); + } + break; + + case ST_DOT: + break; + + case ST_PRECIS: + param.flags |= FLAG_PREC; + if (c == '*') { + param.prec = (int)va_arg(args,int); + } else { + param.prec = param.prec * 10 + (c - '0'); + } + break; + + case ST_SIZE: + switch (c) + { + default: + break; + case 'z': + param.flags &= ~FLAG_TYPE_MASK; + param.flags |= FLAG_TYPE_SIZEOF; + break; + + case 'l': +#if XCFG_FORMAT_LONGLONG + if ((param.flags & FLAG_TYPE_MASK) == FLAG_TYPE_LONG) + { + param.flags &= ~FLAG_TYPE_MASK; + param.flags |= FLAG_TYPE_LONGLONG; + } + else + { + param.flags &= ~FLAG_TYPE_MASK; + param.flags |= FLAG_TYPE_LONG; + + } +#else + param.flags &= ~FLAG_TYPE_MASK; + param.flags |= FLAG_TYPE_LONG; +#endif + break; + + + } + break; + + case ST_FLAG: + switch (c) + { + default: + break; + case '-': + param.flags |= FLAG_LEFT; + break; + case '0': + param.pad = '0'; + break; + case ' ': + param.flags |= FLAG_BLANK; + break; + case '#': + param.flags |= FLAG_PREFIX; + break; + case '+': + param.flags |= FLAG_PLUS; + break; + } + break; + + case ST_TYPE: + switch (c) + { + default: + param.length = 0; + break; + + /* + * Pointer upper case + */ + case 'P': + param.flags |= FLAG_UPPER; + /* fall through */ + /*lint -fallthrough */ + + /* + * Pointer + */ + /* no break */ + case 'p': + param.flags &= ~FLAG_TYPE_MASK; + param.flags |= FLAG_INTEGER | FLAG_TYPE_SIZEOF; + param.radix = 16; + param.prec = sizeof(void *) * 2; + param.prefix[0] = '-'; + param.prefix[1] = '>'; + param.prefixlen = 2; + break; + + /* + * Binary number + */ + case 'b': + param.flags |= FLAG_INTEGER; + param.radix = 2; + if (param.flags & FLAG_PREFIX) + { + param.prefix[0] = '0'; + param.prefix[1] = 'b'; + param.prefixlen = 2; + } + break; + + /* + * Octal number + */ + case 'o': + param.flags |= FLAG_INTEGER; + param.radix = 8; + if (param.flags & FLAG_PREFIX) + { + param.prefix[0] = '0'; + param.prefixlen = 1; + } + break; + + /* + * Hex number upper case letter. + */ + case 'X': + param.flags |= FLAG_UPPER; + /* fall through */ + /* lint -fallthrough */ + + /* + * Hex number lower case + */ + /* no break */ + case 'x': + param.flags |= FLAG_INTEGER; + param.radix = 16; + if (param.flags & FLAG_PREFIX) + { + param.prefix[0] = '0'; + param.prefix[1] = 'x'; + param.prefixlen = 2; + } + break; + + /* + * Integer number radix 10 + */ + case 'd': + case 'i': + param.flags |= FLAG_DECIMAL|FLAG_INTEGER; + param.radix = 10; + break; + + /* + * Unsigned number + */ + case 'u': + param.flags |= FLAG_INTEGER; + param.radix = 10; + break; + + /* + * Upper case string + */ + case 'S': + param.flags |= FLAG_UPPER; + /* fall through */ + /*lint -fallthrough */ + + /* + * Normal string + */ + /* no break */ + case 's': + param.out = va_arg(args,char *); + if (param.out == 0) + param.out = (char *)ms_null; + param.length = (int)xstrlen(param.out); + break; + + case 'n': /* write number of characters to the argument pointer location */ + param.out = (char*)va_arg(args,int *); + if (param.out != 0) { + *(int*)param.out = param.count; + } + break; + + /* + * Upper case char + */ + case 'C': + param.flags |= FLAG_UPPER; + /* fall through */ + /* lint -fallthrough */ + + /* + * Char + */ + /* no break */ + case 'c': + param.out = param.buffer; + param.buffer[0] = (char)va_arg(args,int); + param.length = 1; + break; + +#if XCFG_FORMAT_FLOAT + /** + * Floating point number + */ + case 'f': + if (!(param.flags & FLAG_PREC)) + { + param.prec = 6; + } + + param.dbl = va_arg(args,DOUBLE); + param.values.dvalue = 0.50; + for (i = 0 ; i < param.prec ; i++) + param.values.dvalue /= 10.0; + + if (param.dbl < 0) + { + param.flags |= FLAG_MINUS; + param.dbl -= param.values.dvalue; + param.iPart = (FLOAT_LONG)param.dbl; + param.dbl -= (FLOAT_LONG)param.iPart; + param.dbl = - param.dbl; + } + else + { + param.dbl += param.values.dvalue; + param.iPart = (FLOAT_LONG)param.dbl; + param.dbl -= param.iPart; + } + + + for (i = 0 ;i < param.prec ;i++) + param.dbl *= 10.0; + + param.values.lvalue = (unsigned LONG)param.dbl; + + param.out = param.buffer + sizeof(param.buffer) - 1; + param.radix = 10; + if (param.prec) + { + ulong2a(¶m); + *param.out -- = '.'; + param.length ++; + } + param.flags |= FLAG_INTEGER | FLAG_BUFFER | + FLAG_DECIMAL | FLAG_VALUE | FLOAT_TYPE; + + param.prec = 0; + param.values.FLOAT_VALUE = (unsigned FLOAT_LONG)param.iPart; + break; +#endif + + /** + * Boolean value + */ + case 'B': + if (va_arg(args,int) != 0) + param.out = (char*)ms_true; + else + param.out = (char*)ms_false; + + param.length = (int)xstrlen(param.out); + break; + + + } + + /* + * Process integer number + */ + if (param.flags & FLAG_INTEGER) + { + if (param.prec == 0) + param.prec = 1; + + if (!(param.flags & FLAG_VALUE)) + { + switch (param.flags & FLAG_TYPE_MASK) + { + case FLAG_TYPE_SIZEOF: + param.values.lvalue = (unsigned LONG)va_arg(args,void *); + break; + case FLAG_TYPE_LONG: + if (param.flags & FLAG_DECIMAL) { + param.values.lvalue = (unsigned LONG)va_arg(args,long); + } else { + param.values.lvalue = (unsigned LONG)va_arg(args,unsigned long); + } + break; + + case FLAG_TYPE_INT: + if (param.flags & FLAG_DECIMAL) { + param.values.lvalue = (unsigned LONG)va_arg(args,int); + } else { + param.values.lvalue = (unsigned LONG)va_arg(args,unsigned int); + } + break; +#if XCFG_FORMAT_LONGLONG + case FLAG_TYPE_LONGLONG: + param.values.llvalue = (LONGLONG)va_arg(args,long long); + break; +#endif + default: + break; + } + + } + + if ((param.flags & FLAG_PREFIX) && param.values.lvalue == 0) + { + param.prefixlen = 0; + } + + + /* + * Manage signed integer + */ + if (param.flags & FLAG_DECIMAL) + { +#if XCFG_FORMAT_LONGLONG + if ((param.flags & FLAG_TYPE_MASK) == FLAG_TYPE_LONGLONG) + { + if ((LONGLONG)param.values.llvalue < 0) + { + param.values.llvalue = ~param.values.llvalue + 1; + param.flags |= FLAG_MINUS; + } + } + else + { +#endif + if ((LONG)param.values.lvalue < 0) + { + param.values.lvalue = ~param.values.lvalue + 1; + param.flags |= FLAG_MINUS; + + } +#if XCFG_FORMAT_LONGLONG + } +#endif + if (!(param.flags & FLAG_MINUS) && (param.flags & FLAG_BLANK)) + { + param.prefix[0] = ' '; + param.prefixlen = 1; + } + } + + if ((param.flags & FLAG_BUFFER) == 0) + { + param.out = param.buffer + sizeof(param.buffer) - 1; + } + + +#if XCFG_FORMAT_LONGLONG + if ((param.flags & FLAG_TYPE_MASK) == FLAG_TYPE_LONGLONG) + ullong2a(¶m); + else + ulong2a(¶m); +#else + + ulong2a(¶m); +#endif + param.out++; + + /* + * Check if a sign is required + */ + if (param.flags & (FLAG_MINUS|FLAG_PLUS)) + { + c = param.flags & FLAG_MINUS ? '-' : '+'; + + if (param.pad == '0') + { + param.prefixlen = 1; + param.prefix[0] = c; + } + else + { + *--param.out = c; + param.length++; + } + } + + + } + else + { + if (param.width && param.length > param.width) + { + param.length = param.width; + } + + } + + /* + * Now width contain the size of the pad + */ + param.width -= (param.length + param.prefixlen); + + param.count += outBuffer(outchar,arg,param.prefix,param.prefixlen,param.flags & FLAG_UPPER); + if (!(param.flags & FLAG_LEFT)) + param.count += outChars(outchar,arg,param.pad,param.width); + param.count += outBuffer(outchar,arg,param.out,param.length,param.flags & FLAG_UPPER); + if (param.flags & FLAG_LEFT) + param.count += outChars(outchar,arg,param.pad,param.width); + + } + } + +#if XCFG_FORMAT_VA_COPY + va_end(args); +#endif + + return param.count; +} +/*lint -restore */ + +/* +** =================================================================== +** Method : xsprintf (component XFormat) +** +** Description : +** sprintf() like function +** Parameters : +** NAME - DESCRIPTION +** * buf - Pointer to buffer to be written +** * fmt - Pointer to formatting string +** argList - Open Argument List +** Returns : +** --- - number of characters written, negative for +** error case +** =================================================================== +*/ +int McuXFormat_xsprintf(char *buf, const char *fmt, ...) +{ + va_list args; + int res; + + va_start(args,fmt); + res = xsprintf(buf, fmt, args); + va_end(args); + return res; +} + + +/* +** =================================================================== +** Method : xsnprintf (component XFormat) +** +** Description : +** snprintf() like function, returns the number of characters +** written, negative in case of error. +** Parameters : +** NAME - DESCRIPTION +** * buf - Pointer to buffer to be written +** max_len - size of output buffer (in size) +** * fmt - Pointer to formatting string +** argList - Open Argument List +** Returns : +** --- - number of characters written, negative for +** error case +** =================================================================== +*/ +int McuXFormat_xsnprintf(char *buf, size_t max_len, const char *fmt, ...) +{ + va_list args; + int res; + + va_start(args,fmt); + res = xsnprintf(buf, max_len, fmt, args); + va_end(args); + return res; +} + +/* +** =================================================================== +** Method : Init (component XFormat) +** +** Description : +** Driver initialization routine +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuXFormat_Init(void) +{ + /* nothing needed */ +} + +/* +** =================================================================== +** Method : Deinit (component XFormat) +** +** Description : +** Driver de-initialization routine +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void McuXFormat_Deinit(void) +{ + /* nothing needed */ +} + +/* END McuXFormat. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/McuXFormat.h b/TSM_PicoW_Sensor/McuLib/src/McuXFormat.h new file mode 100644 index 0000000..df353a8 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/McuXFormat.h @@ -0,0 +1,191 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : McuXFormat.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : XFormat +** Version : Component 01.026, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2020-08-13, 18:42, # CodeGen: 675 +** Abstract : +** +** Settings : +** +** Contents : +** xvformat - unsigned McuXFormat_xvformat(void (*outchar)(void *,char), void *arg, const... +** xformat - unsigned McuXFormat_xformat(void (*outchar)(void *,char), void *arg, const... +** xsprintf - int McuXFormat_xsprintf(char *buf, const char *fmt, ...); +** xsnprintf - int McuXFormat_xsnprintf(char *buf, size_t max_len, const char *fmt, ...); +** Deinit - void McuXFormat_Deinit(void); +** Init - void McuXFormat_Init(void); +** +** * Copyright : (c) Copyright Mario Viara, 2014-2020, https://github.com/MarioViara/xprintfc +** * Adopted for Processor Expert: Erich Styger +** * xsnprintf() contributed by Engin Lee +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file McuXFormat.h +** @version 01.00 +** @brief +** +*/ +/*! +** @addtogroup McuXFormat_module McuXFormat module documentation +** @{ +*/ + +#ifndef __McuXFormat_H +#define __McuXFormat_H + +/* MODULE McuXFormat. */ +#include "McuLib.h" /* SDK and API used */ +#include "McuXFormatconfig.h" /* configuration */ + +/* other includes needed */ +#include /* open argument list support */ +#include /* for size_t */ + +/* GCC have printf type attribute check. */ +#ifdef __GNUC__ + /* inform the GNU compiler about printf() style functions, so the compiler can check the arguments */ + #define McuXFormat_PRINTF_ATTRIBUTE(a,b) __attribute__ ((__format__ (__printf__, a, b))) +#else + #define McuXFormat_PRINTF_ATTRIBUTE(a,b) +#endif /* __GNUC__ */ + +/* low level functions */ +int xsnprintf(char *buf, size_t max_len, const char *fmt, va_list args); +int xsprintf(char *buf, const char *fmt, va_list args); + +unsigned McuXFormat_xformat(void (*outchar)(void *,char), void *arg, const char * fmt, ...) McuXFormat_PRINTF_ATTRIBUTE(3,4); +/* +** =================================================================== +** Method : xformat (component XFormat) +** +** Description : +** Printf() like function using variable arguments +** Parameters : +** NAME - DESCRIPTION +** outchar - Function pointer to output one new +** character +** arg - Argument for the output function +** fmt - Format options for the list of parameters +** openArgList - Open argument list +** Returns : +** --- - Error code +** =================================================================== +*/ + +unsigned McuXFormat_xvformat(void (*outchar)(void *,char), void *arg, const char * fmt, va_list args); +/* +** =================================================================== +** Method : xvformat (component XFormat) +** +** Description : +** Printf() like format function +** Parameters : +** NAME - DESCRIPTION +** outchar - Function pointer to the function +** to output one char. +** * arg - Argument for the output function. +** fmt - Format options for the list of parameters. +** args - List of parameters +** Returns : +** --- - Error code +** =================================================================== +*/ + +int McuXFormat_xsprintf(char *buf, const char *fmt, ...) McuXFormat_PRINTF_ATTRIBUTE(2,3); +/* +** =================================================================== +** Method : xsprintf (component XFormat) +** +** Description : +** sprintf() like function +** Parameters : +** NAME - DESCRIPTION +** * buf - Pointer to buffer to be written +** * fmt - Pointer to formatting string +** argList - Open Argument List +** Returns : +** --- - number of characters written, negative for +** error case +** =================================================================== +*/ + +int McuXFormat_xsnprintf(char *buf, size_t max_len, const char *fmt, ...) McuXFormat_PRINTF_ATTRIBUTE(3,4); +/* +** =================================================================== +** Method : xsnprintf (component XFormat) +** +** Description : +** snprintf() like function, returns the number of characters +** written, negative in case of error. +** Parameters : +** NAME - DESCRIPTION +** * buf - Pointer to buffer to be written +** max_len - size of output buffer (in size) +** * fmt - Pointer to formatting string +** argList - Open Argument List +** Returns : +** --- - number of characters written, negative for +** error case +** =================================================================== +*/ + +void McuXFormat_Init(void); +/* +** =================================================================== +** Method : Init (component XFormat) +** +** Description : +** Driver initialization routine +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void McuXFormat_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component XFormat) +** +** Description : +** Driver de-initialization routine +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +/* END McuXFormat. */ + +#endif +/* ifndef __McuXFormat_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/Output1.c b/TSM_PicoW_Sensor/McuLib/src/Output1.c new file mode 100644 index 0000000..f3d255d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/Output1.c @@ -0,0 +1,537 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : Output1.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : Output1 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Input +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool Output1_GetDir(void); +** SetDir - void Output1_SetDir(bool Dir); +** SetInput - void Output1_SetInput(void); +** SetOutput - void Output1_SetOutput(void); +** GetVal - bool Output1_GetVal(void); +** PutVal - void Output1_PutVal(bool Val); +** ClrVal - void Output1_ClrVal(void); +** SetVal - void Output1_SetVal(void); +** NegVal - void Output1_NegVal(void); +** Init - void Output1_Init(void); +** Deinit - void Output1_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file Output1.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup Output1_module Output1 module documentation +** @{ +*/ + +/* MODULE Output1. */ + +#include "Output1.h" +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if Output1_CONFIG_DO_PIN_MUXING + #if McuLib_CONFIG_CPU_IS_LPC + #include "fsl_iocon.h" /* include SDK header file for I/O connection muxing */ + #else /* Kinetis */ + #include "fsl_port.h" /* include SDK header file for port muxing */ + #endif + #endif + #include "fsl_gpio.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + #include "pins_gpio_hw_access.h" + #include "pins_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + #include "nrf_gpio.h" +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + #include "McuGPIO.h" +#else + #error "Unsupported SDK!" +#endif + +#if McuLib_CONFIG_NXP_SDK_2_0_USED + static const gpio_pin_config_t Output1_configOutput = { + kGPIO_DigitalOutput, /* use as output pin */ + Output1_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; + + static const gpio_pin_config_t Output1_configInput = { + kGPIO_DigitalInput, /* use as input pin */ + Output1_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + const gpio_output_pin_user_config_t Output1_OutputConfig[] = { + { + .pinName = Output1_CONFIG_PIN_SYMBOL, + .config.outputLogic = Output1_CONFIG_INIT_PIN_VALUE, + #if FSL_FEATURE_PORT_HAS_SLEW_RATE + .config.slewRate = kPortSlowSlewRate, + #endif + #if FSL_FEATURE_PORT_HAS_OPEN_DRAIN + .config.isOpenDrainEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH + .config.driveStrength = kPortLowDriveStrength, + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; + + const gpio_input_pin_user_config_t Output1_InputConfig[] = { + { + .pinName = Output1_CONFIG_PIN_SYMBOL, + #if FSL_FEATURE_PORT_HAS_PULL_ENABLE + #if Output1_CONFIG_PULL_RESISTOR==0 /* 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ + .config.isPullEnable = false, + #else + .config.isPullEnable = true, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PULL_SELECTION + #if Output1_CONFIG_PULL_RESISTOR==1 + .config.pullSelect = kPortPullUp, + #else + .config.pullSelect = kPortPullDown, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER + .config.isPassiveFilterEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER + .config.isDigitalFilterEnabled = true, + #endif + #if FSL_FEATURE_GPIO_HAS_INTERRUPT_VECTOR + .config.interrupt = kPortIntDisabled + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + static McuGPIO_Handle_t pin; +#endif + +static bool Output1_isOutput = false; +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void Output1_ClrVal(void) +{ +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if McuLib_CONFIG_CPU_IS_LPC + GPIO_PortClear(Output1_CONFIG_GPIO_NAME, Output1_CONFIG_PORT_NAME, 1< input */ + PINS_DRV_SetPinsDirection(Output1_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_input(Output1_CONFIG_PIN_NUMBER, NRF_GPIO_PIN_NOPULL); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsInput(pin); +#endif + Output1_isOutput = false; +} + +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void Output1_SetOutput(void) +{ +#if McuLib_CONFIG_CPU_IS_LPC + GPIO_PinInit(Output1_CONFIG_GPIO_NAME, Output1_CONFIG_PORT_NAME, Output1_CONFIG_PIN_NUMBER, &Output1_configOutput); +#elif McuLib_CONFIG_NXP_SDK_2_0_USED + GPIO_PinInit(Output1_CONFIG_GPIO_NAME, Output1_CONFIG_PIN_NUMBER, &Output1_configOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + GPIO_DRV_SetPinDir(Output1_CONFIG_PIN_SYMBOL, kGpioDigitalOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + pins_channel_type_t val; + + val = PINS_GPIO_GetPinsDirection(Output1_CONFIG_PORT_NAME); /* bit 0: pin is input; 1: pin is output */ + val |= (1< output */ + PINS_DRV_SetPinsDirection(Output1_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_output(Output1_CONFIG_PIN_NUMBER); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsOutput(pin, false /* don't care */); +#endif + Output1_isOutput = true; +} + +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ +void Output1_PutVal(bool Val) +{ +#if McuLib_CONFIG_CPU_IS_LPC + if (Val) { + GPIO_PortSet(Output1_CONFIG_GPIO_NAME, Output1_CONFIG_PORT_NAME, 1<_ */ + _IOCON_PIO_FUNC0 | + /* Selects pull-up function */ + _IOCON_PIO_MODE_PULLUP | + /* Standard mode, output slew rate control is enabled */ + _IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + _IOCON_PIO_INV_DI | + /* Enables digital function */ + _IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + _IOCON_PIO_OPENDRAIN_DI); + #if (McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0) + IOCON_PinMuxSet(Output1_CONFIG_PORT_NAME, Output1_CONFIG_PIN_NUMBER, port_pin_config); + #else + IOCON_PinMuxSet(IOCON, Output1_CONFIG_PORT_NAME, Output1_CONFIG_PIN_NUMBER, port_pin_config); + #endif + #else + PORT_SetPinMux(Output1_CONFIG_PORT_NAME, Output1_CONFIG_PIN_NUMBER, kPORT_MuxAsGpio); /* mux as GPIO */ + #endif + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + /*! Pin Muxing not implemented */ + GPIO_DRV_Init(Output1_InputConfig, Output1_OutputConfig); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + /* the following needs to be called in the application first: + PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); + */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + config.hw.pin = Output1_CONFIG_PIN_NUMBER; + config.isInput = true; + pin = McuGPIO_InitGPIO(&config); +#endif +#if Output1_CONFIG_INIT_PIN_DIRECTION == Output1_CONFIG_INIT_PIN_DIRECTION_INPUT + Output1_SetInput(); +#elif Output1_CONFIG_INIT_PIN_DIRECTION == Output1_CONFIG_INIT_PIN_DIRECTION_OUTPUT + Output1_SetOutput(); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void Output1_Deinit(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + pin = McuGPIO_DeinitGPIO(pin); +#endif +} + +/* END Output1. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/Output1.h b/TSM_PicoW_Sensor/McuLib/src/Output1.h new file mode 100644 index 0000000..b7fbe70 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/Output1.h @@ -0,0 +1,243 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : Output1.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : Output1 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : LED_RED +** Do Pin Muxing : no +** Init Direction : Input +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool Output1_GetDir(void); +** SetDir - void Output1_SetDir(bool Dir); +** SetInput - void Output1_SetInput(void); +** SetOutput - void Output1_SetOutput(void); +** GetVal - bool Output1_GetVal(void); +** PutVal - void Output1_PutVal(bool Val); +** ClrVal - void Output1_ClrVal(void); +** SetVal - void Output1_SetVal(void); +** NegVal - void Output1_NegVal(void); +** Init - void Output1_Init(void); +** Deinit - void Output1_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file Output1.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup Output1_module Output1 module documentation +** @{ +*/ + +#ifndef __Output1_H +#define __Output1_H + +/* MODULE Output1. */ +#include "McuLib.h" /* SDK and API used */ +#include "Output1config.h" /* configuration */ + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" + + /* only GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF and GPIOG are currently supported */ + #define Output1_GPIO_IDX GPIOA_IDX /* GPIOA */ + + enum Output1_pinNames{ + Output1_CONFIG_PIN_SYMBOL = GPIO_MAKE_PIN(Output1_GPIO_IDX, Output1_CONFIG_PIN_NUMBER), + }; + + extern const gpio_output_pin_user_config_t Output1_OutputConfig[]; + extern const gpio_input_pin_user_config_t Output1_InputConfig[]; +#endif + +void Output1_Init(void); +/* +** =================================================================== +** Method : Init (component SDK_BitIO) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void Output1_ClrVal(void); +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void Output1_SetVal(void); +/* +** =================================================================== +** Method : SetVal (component SDK_BitIO) +** +** Description : +** Sets the pin value to a high value. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void Output1_NegVal(void); +/* +** =================================================================== +** Method : NegVal (component SDK_BitIO) +** +** Description : +** Toggles/negates the pin value +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void Output1_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +bool Output1_GetVal(void); +/* +** =================================================================== +** Method : GetVal (component SDK_BitIO) +** +** Description : +** Returns the pin value +** Parameters : None +** Returns : +** --- - Returns the value of the pin: +** FALSE/logical level '0' or TRUE/logical +** level '1' +** =================================================================== +*/ + +bool Output1_GetDir(void); +/* +** =================================================================== +** Method : GetDir (component SDK_BitIO) +** +** Description : +** Return the direction of the pin (input/output) +** Parameters : None +** Returns : +** --- - FALSE if port is input, TRUE if port is +** output +** =================================================================== +*/ + +void Output1_SetDir(bool Dir); +/* +** =================================================================== +** Method : SetDir (component SDK_BitIO) +** +** Description : +** Sets the direction of the pin (input or output) +** Parameters : +** NAME - DESCRIPTION +** Dir - FALSE: input, TRUE: output +** Returns : Nothing +** =================================================================== +*/ + +void Output1_SetInput(void); +/* +** =================================================================== +** Method : SetInput (component SDK_BitIO) +** +** Description : +** Sets the pin as input +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void Output1_SetOutput(void); +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void Output1_PutVal(bool Val); +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ + +/* END Output1. */ + +#endif +/* ifndef __Output1_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/SCL1.c b/TSM_PicoW_Sensor/McuLib/src/SCL1.c new file mode 100644 index 0000000..28cc20a --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/SCL1.c @@ -0,0 +1,537 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : SCL1.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : SCL1 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : I2C_SCL +** Do Pin Muxing : no +** Init Direction : Input +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool SCL1_GetDir(void); +** SetDir - void SCL1_SetDir(bool Dir); +** SetInput - void SCL1_SetInput(void); +** SetOutput - void SCL1_SetOutput(void); +** GetVal - bool SCL1_GetVal(void); +** PutVal - void SCL1_PutVal(bool Val); +** ClrVal - void SCL1_ClrVal(void); +** SetVal - void SCL1_SetVal(void); +** NegVal - void SCL1_NegVal(void); +** Init - void SCL1_Init(void); +** Deinit - void SCL1_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file SCL1.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup SCL1_module SCL1 module documentation +** @{ +*/ + +/* MODULE SCL1. */ + +#include "SCL1.h" +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if SCL1_CONFIG_DO_PIN_MUXING + #if McuLib_CONFIG_CPU_IS_LPC + #include "fsl_iocon.h" /* include SDK header file for I/O connection muxing */ + #else /* Kinetis */ + #include "fsl_port.h" /* include SDK header file for port muxing */ + #endif + #endif + #include "fsl_gpio.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + #include "pins_gpio_hw_access.h" + #include "pins_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + #include "nrf_gpio.h" +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + #include "McuGPIO.h" +#else + #error "Unsupported SDK!" +#endif + +#if McuLib_CONFIG_NXP_SDK_2_0_USED + static const gpio_pin_config_t SCL1_configOutput = { + kGPIO_DigitalOutput, /* use as output pin */ + SCL1_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; + + static const gpio_pin_config_t SCL1_configInput = { + kGPIO_DigitalInput, /* use as input pin */ + SCL1_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + const gpio_output_pin_user_config_t SCL1_OutputConfig[] = { + { + .pinName = SCL1_CONFIG_PIN_SYMBOL, + .config.outputLogic = SCL1_CONFIG_INIT_PIN_VALUE, + #if FSL_FEATURE_PORT_HAS_SLEW_RATE + .config.slewRate = kPortSlowSlewRate, + #endif + #if FSL_FEATURE_PORT_HAS_OPEN_DRAIN + .config.isOpenDrainEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH + .config.driveStrength = kPortLowDriveStrength, + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; + + const gpio_input_pin_user_config_t SCL1_InputConfig[] = { + { + .pinName = SCL1_CONFIG_PIN_SYMBOL, + #if FSL_FEATURE_PORT_HAS_PULL_ENABLE + #if SCL1_CONFIG_PULL_RESISTOR==0 /* 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ + .config.isPullEnable = false, + #else + .config.isPullEnable = true, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PULL_SELECTION + #if SCL1_CONFIG_PULL_RESISTOR==1 + .config.pullSelect = kPortPullUp, + #else + .config.pullSelect = kPortPullDown, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER + .config.isPassiveFilterEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER + .config.isDigitalFilterEnabled = true, + #endif + #if FSL_FEATURE_GPIO_HAS_INTERRUPT_VECTOR + .config.interrupt = kPortIntDisabled + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + static McuGPIO_Handle_t pin; +#endif + +static bool SCL1_isOutput = false; +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void SCL1_ClrVal(void) +{ +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if McuLib_CONFIG_CPU_IS_LPC + GPIO_PortClear(SCL1_CONFIG_GPIO_NAME, SCL1_CONFIG_PORT_NAME, 1< input */ + PINS_DRV_SetPinsDirection(SCL1_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_input(SCL1_CONFIG_PIN_NUMBER, NRF_GPIO_PIN_NOPULL); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsInput(pin); +#endif + SCL1_isOutput = false; +} + +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void SCL1_SetOutput(void) +{ +#if McuLib_CONFIG_CPU_IS_LPC + GPIO_PinInit(SCL1_CONFIG_GPIO_NAME, SCL1_CONFIG_PORT_NAME, SCL1_CONFIG_PIN_NUMBER, &SCL1_configOutput); +#elif McuLib_CONFIG_NXP_SDK_2_0_USED + GPIO_PinInit(SCL1_CONFIG_GPIO_NAME, SCL1_CONFIG_PIN_NUMBER, &SCL1_configOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + GPIO_DRV_SetPinDir(SCL1_CONFIG_PIN_SYMBOL, kGpioDigitalOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + pins_channel_type_t val; + + val = PINS_GPIO_GetPinsDirection(SCL1_CONFIG_PORT_NAME); /* bit 0: pin is input; 1: pin is output */ + val |= (1< output */ + PINS_DRV_SetPinsDirection(SCL1_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_output(SCL1_CONFIG_PIN_NUMBER); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsOutput(pin, false /* don't care */); +#endif + SCL1_isOutput = true; +} + +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ +void SCL1_PutVal(bool Val) +{ +#if McuLib_CONFIG_CPU_IS_LPC + if (Val) { + GPIO_PortSet(SCL1_CONFIG_GPIO_NAME, SCL1_CONFIG_PORT_NAME, 1<_ */ + _IOCON_PIO_FUNC0 | + /* Selects pull-up function */ + _IOCON_PIO_MODE_PULLUP | + /* Standard mode, output slew rate control is enabled */ + _IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + _IOCON_PIO_INV_DI | + /* Enables digital function */ + _IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + _IOCON_PIO_OPENDRAIN_DI); + #if (McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0) + IOCON_PinMuxSet(SCL1_CONFIG_PORT_NAME, SCL1_CONFIG_PIN_NUMBER, port_pin_config); + #else + IOCON_PinMuxSet(IOCON, SCL1_CONFIG_PORT_NAME, SCL1_CONFIG_PIN_NUMBER, port_pin_config); + #endif + #else + PORT_SetPinMux(SCL1_CONFIG_PORT_NAME, SCL1_CONFIG_PIN_NUMBER, kPORT_MuxAsGpio); /* mux as GPIO */ + #endif + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + /*! Pin Muxing not implemented */ + GPIO_DRV_Init(SCL1_InputConfig, SCL1_OutputConfig); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + /* the following needs to be called in the application first: + PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); + */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + config.hw.pin = SCL1_CONFIG_PIN_NUMBER; + config.isInput = true; + pin = McuGPIO_InitGPIO(&config); +#endif +#if SCL1_CONFIG_INIT_PIN_DIRECTION == SCL1_CONFIG_INIT_PIN_DIRECTION_INPUT + SCL1_SetInput(); +#elif SCL1_CONFIG_INIT_PIN_DIRECTION == SCL1_CONFIG_INIT_PIN_DIRECTION_OUTPUT + SCL1_SetOutput(); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void SCL1_Deinit(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + pin = McuGPIO_DeinitGPIO(pin); +#endif +} + +/* END SCL1. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/SCL1.h b/TSM_PicoW_Sensor/McuLib/src/SCL1.h new file mode 100644 index 0000000..a7a9ca9 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/SCL1.h @@ -0,0 +1,243 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : SCL1.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : SCL1 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : I2C_SCL +** Do Pin Muxing : no +** Init Direction : Input +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool SCL1_GetDir(void); +** SetDir - void SCL1_SetDir(bool Dir); +** SetInput - void SCL1_SetInput(void); +** SetOutput - void SCL1_SetOutput(void); +** GetVal - bool SCL1_GetVal(void); +** PutVal - void SCL1_PutVal(bool Val); +** ClrVal - void SCL1_ClrVal(void); +** SetVal - void SCL1_SetVal(void); +** NegVal - void SCL1_NegVal(void); +** Init - void SCL1_Init(void); +** Deinit - void SCL1_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file SCL1.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup SCL1_module SCL1 module documentation +** @{ +*/ + +#ifndef __SCL1_H +#define __SCL1_H + +/* MODULE SCL1. */ +#include "McuLib.h" /* SDK and API used */ +#include "SCL1config.h" /* configuration */ + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" + + /* only GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF and GPIOG are currently supported */ + #define SCL1_GPIO_IDX GPIOA_IDX /* GPIOA */ + + enum SCL1_pinNames{ + SCL1_CONFIG_PIN_SYMBOL = GPIO_MAKE_PIN(SCL1_GPIO_IDX, SCL1_CONFIG_PIN_NUMBER), + }; + + extern const gpio_output_pin_user_config_t SCL1_OutputConfig[]; + extern const gpio_input_pin_user_config_t SCL1_InputConfig[]; +#endif + +void SCL1_Init(void); +/* +** =================================================================== +** Method : Init (component SDK_BitIO) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void SCL1_ClrVal(void); +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void SCL1_SetVal(void); +/* +** =================================================================== +** Method : SetVal (component SDK_BitIO) +** +** Description : +** Sets the pin value to a high value. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void SCL1_NegVal(void); +/* +** =================================================================== +** Method : NegVal (component SDK_BitIO) +** +** Description : +** Toggles/negates the pin value +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void SCL1_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +bool SCL1_GetVal(void); +/* +** =================================================================== +** Method : GetVal (component SDK_BitIO) +** +** Description : +** Returns the pin value +** Parameters : None +** Returns : +** --- - Returns the value of the pin: +** FALSE/logical level '0' or TRUE/logical +** level '1' +** =================================================================== +*/ + +bool SCL1_GetDir(void); +/* +** =================================================================== +** Method : GetDir (component SDK_BitIO) +** +** Description : +** Return the direction of the pin (input/output) +** Parameters : None +** Returns : +** --- - FALSE if port is input, TRUE if port is +** output +** =================================================================== +*/ + +void SCL1_SetDir(bool Dir); +/* +** =================================================================== +** Method : SetDir (component SDK_BitIO) +** +** Description : +** Sets the direction of the pin (input or output) +** Parameters : +** NAME - DESCRIPTION +** Dir - FALSE: input, TRUE: output +** Returns : Nothing +** =================================================================== +*/ + +void SCL1_SetInput(void); +/* +** =================================================================== +** Method : SetInput (component SDK_BitIO) +** +** Description : +** Sets the pin as input +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void SCL1_SetOutput(void); +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void SCL1_PutVal(bool Val); +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ + +/* END SCL1. */ + +#endif +/* ifndef __SCL1_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/SDA1.c b/TSM_PicoW_Sensor/McuLib/src/SDA1.c new file mode 100644 index 0000000..d5437f3 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/SDA1.c @@ -0,0 +1,537 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : SDA1.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : SDA1 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : I2C_SDA +** Do Pin Muxing : no +** Init Direction : Input +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool SDA1_GetDir(void); +** SetDir - void SDA1_SetDir(bool Dir); +** SetInput - void SDA1_SetInput(void); +** SetOutput - void SDA1_SetOutput(void); +** GetVal - bool SDA1_GetVal(void); +** PutVal - void SDA1_PutVal(bool Val); +** ClrVal - void SDA1_ClrVal(void); +** SetVal - void SDA1_SetVal(void); +** NegVal - void SDA1_NegVal(void); +** Init - void SDA1_Init(void); +** Deinit - void SDA1_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file SDA1.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup SDA1_module SDA1 module documentation +** @{ +*/ + +/* MODULE SDA1. */ + +#include "SDA1.h" +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if SDA1_CONFIG_DO_PIN_MUXING + #if McuLib_CONFIG_CPU_IS_LPC + #include "fsl_iocon.h" /* include SDK header file for I/O connection muxing */ + #else /* Kinetis */ + #include "fsl_port.h" /* include SDK header file for port muxing */ + #endif + #endif + #include "fsl_gpio.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + #include "pins_gpio_hw_access.h" + #include "pins_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + #include "nrf_gpio.h" +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + #include "McuGPIO.h" +#else + #error "Unsupported SDK!" +#endif + +#if McuLib_CONFIG_NXP_SDK_2_0_USED + static const gpio_pin_config_t SDA1_configOutput = { + kGPIO_DigitalOutput, /* use as output pin */ + SDA1_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; + + static const gpio_pin_config_t SDA1_configInput = { + kGPIO_DigitalInput, /* use as input pin */ + SDA1_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + const gpio_output_pin_user_config_t SDA1_OutputConfig[] = { + { + .pinName = SDA1_CONFIG_PIN_SYMBOL, + .config.outputLogic = SDA1_CONFIG_INIT_PIN_VALUE, + #if FSL_FEATURE_PORT_HAS_SLEW_RATE + .config.slewRate = kPortSlowSlewRate, + #endif + #if FSL_FEATURE_PORT_HAS_OPEN_DRAIN + .config.isOpenDrainEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH + .config.driveStrength = kPortLowDriveStrength, + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; + + const gpio_input_pin_user_config_t SDA1_InputConfig[] = { + { + .pinName = SDA1_CONFIG_PIN_SYMBOL, + #if FSL_FEATURE_PORT_HAS_PULL_ENABLE + #if SDA1_CONFIG_PULL_RESISTOR==0 /* 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ + .config.isPullEnable = false, + #else + .config.isPullEnable = true, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PULL_SELECTION + #if SDA1_CONFIG_PULL_RESISTOR==1 + .config.pullSelect = kPortPullUp, + #else + .config.pullSelect = kPortPullDown, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER + .config.isPassiveFilterEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER + .config.isDigitalFilterEnabled = true, + #endif + #if FSL_FEATURE_GPIO_HAS_INTERRUPT_VECTOR + .config.interrupt = kPortIntDisabled + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + static McuGPIO_Handle_t pin; +#endif + +static bool SDA1_isOutput = false; +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void SDA1_ClrVal(void) +{ +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if McuLib_CONFIG_CPU_IS_LPC + GPIO_PortClear(SDA1_CONFIG_GPIO_NAME, SDA1_CONFIG_PORT_NAME, 1< input */ + PINS_DRV_SetPinsDirection(SDA1_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_input(SDA1_CONFIG_PIN_NUMBER, NRF_GPIO_PIN_NOPULL); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsInput(pin); +#endif + SDA1_isOutput = false; +} + +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void SDA1_SetOutput(void) +{ +#if McuLib_CONFIG_CPU_IS_LPC + GPIO_PinInit(SDA1_CONFIG_GPIO_NAME, SDA1_CONFIG_PORT_NAME, SDA1_CONFIG_PIN_NUMBER, &SDA1_configOutput); +#elif McuLib_CONFIG_NXP_SDK_2_0_USED + GPIO_PinInit(SDA1_CONFIG_GPIO_NAME, SDA1_CONFIG_PIN_NUMBER, &SDA1_configOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + GPIO_DRV_SetPinDir(SDA1_CONFIG_PIN_SYMBOL, kGpioDigitalOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + pins_channel_type_t val; + + val = PINS_GPIO_GetPinsDirection(SDA1_CONFIG_PORT_NAME); /* bit 0: pin is input; 1: pin is output */ + val |= (1< output */ + PINS_DRV_SetPinsDirection(SDA1_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_output(SDA1_CONFIG_PIN_NUMBER); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsOutput(pin, false /* don't care */); +#endif + SDA1_isOutput = true; +} + +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ +void SDA1_PutVal(bool Val) +{ +#if McuLib_CONFIG_CPU_IS_LPC + if (Val) { + GPIO_PortSet(SDA1_CONFIG_GPIO_NAME, SDA1_CONFIG_PORT_NAME, 1<_ */ + _IOCON_PIO_FUNC0 | + /* Selects pull-up function */ + _IOCON_PIO_MODE_PULLUP | + /* Standard mode, output slew rate control is enabled */ + _IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + _IOCON_PIO_INV_DI | + /* Enables digital function */ + _IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + _IOCON_PIO_OPENDRAIN_DI); + #if (McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0) + IOCON_PinMuxSet(SDA1_CONFIG_PORT_NAME, SDA1_CONFIG_PIN_NUMBER, port_pin_config); + #else + IOCON_PinMuxSet(IOCON, SDA1_CONFIG_PORT_NAME, SDA1_CONFIG_PIN_NUMBER, port_pin_config); + #endif + #else + PORT_SetPinMux(SDA1_CONFIG_PORT_NAME, SDA1_CONFIG_PIN_NUMBER, kPORT_MuxAsGpio); /* mux as GPIO */ + #endif + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + /*! Pin Muxing not implemented */ + GPIO_DRV_Init(SDA1_InputConfig, SDA1_OutputConfig); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + /* the following needs to be called in the application first: + PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); + */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + config.hw.pin = SDA1_CONFIG_PIN_NUMBER; + config.isInput = true; + pin = McuGPIO_InitGPIO(&config); +#endif +#if SDA1_CONFIG_INIT_PIN_DIRECTION == SDA1_CONFIG_INIT_PIN_DIRECTION_INPUT + SDA1_SetInput(); +#elif SDA1_CONFIG_INIT_PIN_DIRECTION == SDA1_CONFIG_INIT_PIN_DIRECTION_OUTPUT + SDA1_SetOutput(); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void SDA1_Deinit(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + pin = McuGPIO_DeinitGPIO(pin); +#endif +} + +/* END SDA1. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/SDA1.h b/TSM_PicoW_Sensor/McuLib/src/SDA1.h new file mode 100644 index 0000000..07d1ce4 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/SDA1.h @@ -0,0 +1,243 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : SDA1.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : SDA1 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : I2C_SDA +** Do Pin Muxing : no +** Init Direction : Input +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool SDA1_GetDir(void); +** SetDir - void SDA1_SetDir(bool Dir); +** SetInput - void SDA1_SetInput(void); +** SetOutput - void SDA1_SetOutput(void); +** GetVal - bool SDA1_GetVal(void); +** PutVal - void SDA1_PutVal(bool Val); +** ClrVal - void SDA1_ClrVal(void); +** SetVal - void SDA1_SetVal(void); +** NegVal - void SDA1_NegVal(void); +** Init - void SDA1_Init(void); +** Deinit - void SDA1_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file SDA1.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup SDA1_module SDA1 module documentation +** @{ +*/ + +#ifndef __SDA1_H +#define __SDA1_H + +/* MODULE SDA1. */ +#include "McuLib.h" /* SDK and API used */ +#include "SDA1config.h" /* configuration */ + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" + + /* only GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF and GPIOG are currently supported */ + #define SDA1_GPIO_IDX GPIOA_IDX /* GPIOA */ + + enum SDA1_pinNames{ + SDA1_CONFIG_PIN_SYMBOL = GPIO_MAKE_PIN(SDA1_GPIO_IDX, SDA1_CONFIG_PIN_NUMBER), + }; + + extern const gpio_output_pin_user_config_t SDA1_OutputConfig[]; + extern const gpio_input_pin_user_config_t SDA1_InputConfig[]; +#endif + +void SDA1_Init(void); +/* +** =================================================================== +** Method : Init (component SDK_BitIO) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void SDA1_ClrVal(void); +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void SDA1_SetVal(void); +/* +** =================================================================== +** Method : SetVal (component SDK_BitIO) +** +** Description : +** Sets the pin value to a high value. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void SDA1_NegVal(void); +/* +** =================================================================== +** Method : NegVal (component SDK_BitIO) +** +** Description : +** Toggles/negates the pin value +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void SDA1_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +bool SDA1_GetVal(void); +/* +** =================================================================== +** Method : GetVal (component SDK_BitIO) +** +** Description : +** Returns the pin value +** Parameters : None +** Returns : +** --- - Returns the value of the pin: +** FALSE/logical level '0' or TRUE/logical +** level '1' +** =================================================================== +*/ + +bool SDA1_GetDir(void); +/* +** =================================================================== +** Method : GetDir (component SDK_BitIO) +** +** Description : +** Return the direction of the pin (input/output) +** Parameters : None +** Returns : +** --- - FALSE if port is input, TRUE if port is +** output +** =================================================================== +*/ + +void SDA1_SetDir(bool Dir); +/* +** =================================================================== +** Method : SetDir (component SDK_BitIO) +** +** Description : +** Sets the direction of the pin (input or output) +** Parameters : +** NAME - DESCRIPTION +** Dir - FALSE: input, TRUE: output +** Returns : Nothing +** =================================================================== +*/ + +void SDA1_SetInput(void); +/* +** =================================================================== +** Method : SetInput (component SDK_BitIO) +** +** Description : +** Sets the pin as input +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void SDA1_SetOutput(void); +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void SDA1_PutVal(bool Val); +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ + +/* END SDA1. */ + +#endif +/* ifndef __SDA1_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/WPpin1.c b/TSM_PicoW_Sensor/McuLib/src/WPpin1.c new file mode 100644 index 0000000..95f3d61 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/WPpin1.c @@ -0,0 +1,537 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : WPpin1.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : WPpin1 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : WP_24AA +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool WPpin1_GetDir(void); +** SetDir - void WPpin1_SetDir(bool Dir); +** SetInput - void WPpin1_SetInput(void); +** SetOutput - void WPpin1_SetOutput(void); +** GetVal - bool WPpin1_GetVal(void); +** PutVal - void WPpin1_PutVal(bool Val); +** ClrVal - void WPpin1_ClrVal(void); +** SetVal - void WPpin1_SetVal(void); +** NegVal - void WPpin1_NegVal(void); +** Init - void WPpin1_Init(void); +** Deinit - void WPpin1_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file WPpin1.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup WPpin1_module WPpin1 module documentation +** @{ +*/ + +/* MODULE WPpin1. */ + +#include "WPpin1.h" +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if WPpin1_CONFIG_DO_PIN_MUXING + #if McuLib_CONFIG_CPU_IS_LPC + #include "fsl_iocon.h" /* include SDK header file for I/O connection muxing */ + #else /* Kinetis */ + #include "fsl_port.h" /* include SDK header file for port muxing */ + #endif + #endif + #include "fsl_gpio.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + #include "pins_gpio_hw_access.h" + #include "pins_driver.h" /* include SDK header file for GPIO */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + #include "nrf_gpio.h" +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + #include "McuGPIO.h" +#else + #error "Unsupported SDK!" +#endif + +#if McuLib_CONFIG_NXP_SDK_2_0_USED + static const gpio_pin_config_t WPpin1_configOutput = { + kGPIO_DigitalOutput, /* use as output pin */ + WPpin1_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; + + static const gpio_pin_config_t WPpin1_configInput = { + kGPIO_DigitalInput, /* use as input pin */ + WPpin1_CONFIG_INIT_PIN_VALUE, /* initial value */ + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + const gpio_output_pin_user_config_t WPpin1_OutputConfig[] = { + { + .pinName = WPpin1_CONFIG_PIN_SYMBOL, + .config.outputLogic = WPpin1_CONFIG_INIT_PIN_VALUE, + #if FSL_FEATURE_PORT_HAS_SLEW_RATE + .config.slewRate = kPortSlowSlewRate, + #endif + #if FSL_FEATURE_PORT_HAS_OPEN_DRAIN + .config.isOpenDrainEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH + .config.driveStrength = kPortLowDriveStrength, + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; + + const gpio_input_pin_user_config_t WPpin1_InputConfig[] = { + { + .pinName = WPpin1_CONFIG_PIN_SYMBOL, + #if FSL_FEATURE_PORT_HAS_PULL_ENABLE + #if WPpin1_CONFIG_PULL_RESISTOR==0 /* 0: no pull resistor, 1: pull-up, 2: pull-down, 3: pull-up or no pull, 4: pull-down or no pull: 4: autoselect-pull */ + .config.isPullEnable = false, + #else + .config.isPullEnable = true, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PULL_SELECTION + #if WPpin1_CONFIG_PULL_RESISTOR==1 + .config.pullSelect = kPortPullUp, + #else + .config.pullSelect = kPortPullDown, + #endif + #endif + #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER + .config.isPassiveFilterEnabled = true, + #endif + #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER + .config.isDigitalFilterEnabled = true, + #endif + #if FSL_FEATURE_GPIO_HAS_INTERRUPT_VECTOR + .config.interrupt = kPortIntDisabled + #endif + }, + { + .pinName = GPIO_PINS_OUT_OF_RANGE, + } + }; +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + static McuGPIO_Handle_t pin; +#endif + +static bool WPpin1_isOutput = false; +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void WPpin1_ClrVal(void) +{ +#if McuLib_CONFIG_NXP_SDK_2_0_USED + #if McuLib_CONFIG_CPU_IS_LPC + GPIO_PortClear(WPpin1_CONFIG_GPIO_NAME, WPpin1_CONFIG_PORT_NAME, 1< input */ + PINS_DRV_SetPinsDirection(WPpin1_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_input(WPpin1_CONFIG_PIN_NUMBER, NRF_GPIO_PIN_NOPULL); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsInput(pin); +#endif + WPpin1_isOutput = false; +} + +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void WPpin1_SetOutput(void) +{ +#if McuLib_CONFIG_CPU_IS_LPC + GPIO_PinInit(WPpin1_CONFIG_GPIO_NAME, WPpin1_CONFIG_PORT_NAME, WPpin1_CONFIG_PIN_NUMBER, &WPpin1_configOutput); +#elif McuLib_CONFIG_NXP_SDK_2_0_USED + GPIO_PinInit(WPpin1_CONFIG_GPIO_NAME, WPpin1_CONFIG_PIN_NUMBER, &WPpin1_configOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + GPIO_DRV_SetPinDir(WPpin1_CONFIG_PIN_SYMBOL, kGpioDigitalOutput); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + pins_channel_type_t val; + + val = PINS_GPIO_GetPinsDirection(WPpin1_CONFIG_PORT_NAME); /* bit 0: pin is input; 1: pin is output */ + val |= (1< output */ + PINS_DRV_SetPinsDirection(WPpin1_CONFIG_PORT_NAME, val); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + nrf_gpio_cfg_output(WPpin1_CONFIG_PIN_NUMBER); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_SetAsOutput(pin, false /* don't care */); +#endif + WPpin1_isOutput = true; +} + +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ +void WPpin1_PutVal(bool Val) +{ +#if McuLib_CONFIG_CPU_IS_LPC + if (Val) { + GPIO_PortSet(WPpin1_CONFIG_GPIO_NAME, WPpin1_CONFIG_PORT_NAME, 1<_ */ + _IOCON_PIO_FUNC0 | + /* Selects pull-up function */ + _IOCON_PIO_MODE_PULLUP | + /* Standard mode, output slew rate control is enabled */ + _IOCON_PIO_SLEW_STANDARD | + /* Input function is not inverted */ + _IOCON_PIO_INV_DI | + /* Enables digital function */ + _IOCON_PIO_DIGITAL_EN | + /* Open drain is disabled */ + _IOCON_PIO_OPENDRAIN_DI); + #if (McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0) + IOCON_PinMuxSet(WPpin1_CONFIG_PORT_NAME, WPpin1_CONFIG_PIN_NUMBER, port_pin_config); + #else + IOCON_PinMuxSet(IOCON, WPpin1_CONFIG_PORT_NAME, WPpin1_CONFIG_PIN_NUMBER, port_pin_config); + #endif + #else + PORT_SetPinMux(WPpin1_CONFIG_PORT_NAME, WPpin1_CONFIG_PIN_NUMBER, kPORT_MuxAsGpio); /* mux as GPIO */ + #endif + #endif +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + /*! Pin Muxing not implemented */ + GPIO_DRV_Init(WPpin1_InputConfig, WPpin1_OutputConfig); +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_S32K + /* the following needs to be called in the application first: + PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); + */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_NORDIC_NRF5 + /* nothing needed */ +#elif McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + McuGPIO_Config_t config; + + McuGPIO_GetDefaultConfig(&config); + config.hw.pin = WPpin1_CONFIG_PIN_NUMBER; + config.isInput = true; + pin = McuGPIO_InitGPIO(&config); +#endif +#if WPpin1_CONFIG_INIT_PIN_DIRECTION == WPpin1_CONFIG_INIT_PIN_DIRECTION_INPUT + WPpin1_SetInput(); +#elif WPpin1_CONFIG_INIT_PIN_DIRECTION == WPpin1_CONFIG_INIT_PIN_DIRECTION_OUTPUT + WPpin1_SetOutput(); +#endif +} + +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ +void WPpin1_Deinit(void) +{ +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_RPI_PICO + pin = McuGPIO_DeinitGPIO(pin); +#endif +} + +/* END WPpin1. */ + +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/src/WPpin1.h b/TSM_PicoW_Sensor/McuLib/src/WPpin1.h new file mode 100644 index 0000000..f240567 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/src/WPpin1.h @@ -0,0 +1,243 @@ +/* ################################################################### +** This component module is generated by Processor Expert. Do not modify it. +** Filename : WPpin1.h +** Project : FRDM-K64F_Generator +** Processor : MK64FN1M0VLL12 +** Component : SDK_BitIO +** Version : Component 01.030, Driver 01.00, CPU db: 3.00.000 +** Compiler : GNU C Compiler +** Date/Time : 2024-07-29, 05:47, # CodeGen: 836 +** Abstract : +** GPIO component usable with NXP SDK +** Settings : +** Component name : WPpin1 +** SDK : McuLib +** GPIO Name : GPIOA +** PORT Name : PORTA +** Pin Number : 0 +** Pin Symbol : WP_24AA +** Do Pin Muxing : no +** Init Direction : Output +** Pull Resistor : no pull resistor +** Init Value : 0 +** Contents : +** GetDir - bool WPpin1_GetDir(void); +** SetDir - void WPpin1_SetDir(bool Dir); +** SetInput - void WPpin1_SetInput(void); +** SetOutput - void WPpin1_SetOutput(void); +** GetVal - bool WPpin1_GetVal(void); +** PutVal - void WPpin1_PutVal(bool Val); +** ClrVal - void WPpin1_ClrVal(void); +** SetVal - void WPpin1_SetVal(void); +** NegVal - void WPpin1_NegVal(void); +** Init - void WPpin1_Init(void); +** Deinit - void WPpin1_Deinit(void); +** +** * Copyright (c) 2015-2024, Erich Styger +** * Web: https://mcuoneclipse.com +** * SourceForge: https://sourceforge.net/projects/mcuoneclipse +** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx +** * All rights reserved. +** * +** * Redistribution and use in source and binary forms, with or without modification, +** * are permitted provided that the following conditions are met: +** * +** * - Redistributions of source code must retain the above copyright notice, this list +** * of conditions and the following disclaimer. +** * +** * - Redistributions in binary form must reproduce the above copyright notice, this +** * list of conditions and the following disclaimer in the documentation and/or +** * other materials provided with the distribution. +** * +** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** ###################################################################*/ +/*! +** @file WPpin1.h +** @version 01.00 +** @brief +** GPIO component usable with NXP SDK +*/ +/*! +** @addtogroup WPpin1_module WPpin1 module documentation +** @{ +*/ + +#ifndef __WPpin1_H +#define __WPpin1_H + +/* MODULE WPpin1. */ +#include "McuLib.h" /* SDK and API used */ +#include "WPpin1config.h" /* configuration */ + +#if McuLib_CONFIG_SDK_VERSION_USED == McuLib_CONFIG_SDK_KINETIS_1_3 + #include "fsl_gpio_driver.h" + + /* only GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF and GPIOG are currently supported */ + #define WPpin1_GPIO_IDX GPIOA_IDX /* GPIOA */ + + enum WPpin1_pinNames{ + WPpin1_CONFIG_PIN_SYMBOL = GPIO_MAKE_PIN(WPpin1_GPIO_IDX, WPpin1_CONFIG_PIN_NUMBER), + }; + + extern const gpio_output_pin_user_config_t WPpin1_OutputConfig[]; + extern const gpio_input_pin_user_config_t WPpin1_InputConfig[]; +#endif + +void WPpin1_Init(void); +/* +** =================================================================== +** Method : Init (component SDK_BitIO) +** +** Description : +** Driver initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void WPpin1_ClrVal(void); +/* +** =================================================================== +** Method : ClrVal (component SDK_BitIO) +** +** Description : +** Clears the pin value (sets it to a low level) +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void WPpin1_SetVal(void); +/* +** =================================================================== +** Method : SetVal (component SDK_BitIO) +** +** Description : +** Sets the pin value to a high value. +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void WPpin1_NegVal(void); +/* +** =================================================================== +** Method : NegVal (component SDK_BitIO) +** +** Description : +** Toggles/negates the pin value +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void WPpin1_Deinit(void); +/* +** =================================================================== +** Method : Deinit (component SDK_BitIO) +** +** Description : +** Driver de-initialization method +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +bool WPpin1_GetVal(void); +/* +** =================================================================== +** Method : GetVal (component SDK_BitIO) +** +** Description : +** Returns the pin value +** Parameters : None +** Returns : +** --- - Returns the value of the pin: +** FALSE/logical level '0' or TRUE/logical +** level '1' +** =================================================================== +*/ + +bool WPpin1_GetDir(void); +/* +** =================================================================== +** Method : GetDir (component SDK_BitIO) +** +** Description : +** Return the direction of the pin (input/output) +** Parameters : None +** Returns : +** --- - FALSE if port is input, TRUE if port is +** output +** =================================================================== +*/ + +void WPpin1_SetDir(bool Dir); +/* +** =================================================================== +** Method : SetDir (component SDK_BitIO) +** +** Description : +** Sets the direction of the pin (input or output) +** Parameters : +** NAME - DESCRIPTION +** Dir - FALSE: input, TRUE: output +** Returns : Nothing +** =================================================================== +*/ + +void WPpin1_SetInput(void); +/* +** =================================================================== +** Method : SetInput (component SDK_BitIO) +** +** Description : +** Sets the pin as input +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void WPpin1_SetOutput(void); +/* +** =================================================================== +** Method : SetOutput (component SDK_BitIO) +** +** Description : +** Sets the pin as output +** Parameters : None +** Returns : Nothing +** =================================================================== +*/ + +void WPpin1_PutVal(bool Val); +/* +** =================================================================== +** Method : PutVal (component SDK_BitIO) +** +** Description : +** Sets the pin value +** Parameters : +** NAME - DESCRIPTION +** Val - Value to set. FALSE/logical '0' or +** TRUE/logical '1' +** Returns : Nothing +** =================================================================== +*/ + +/* END WPpin1. */ + +#endif +/* ifndef __WPpin1_H */ +/*! +** @} +*/ diff --git a/TSM_PicoW_Sensor/McuLib/unity/CMakeLists.txt b/TSM_PicoW_Sensor/McuLib/unity/CMakeLists.txt new file mode 100644 index 0000000..ca31856 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/unity/CMakeLists.txt @@ -0,0 +1,29 @@ +# file: Collect all files that need to be compiled. +# You can use a GLOB function as shown here, or explicitly mention the specific files +#file(GLOB FILES *.c *.h) + +set(THIS_LIBRARY_NAME unityLib) + +file(GLOB SRC_FILES + *.c + ) + +# add_library: With this declaration, you express the intent to build a library. +# The first argument, here its pico-shift-register, is the name of the library, +# the second argument are the files that will be compiled to create your library. +add_library(${THIS_LIBRARY_NAME} OBJECT ${SRC_FILES}) + +# target_link_libraries: If you link with other libraries, list them here +target_link_libraries( + ${THIS_LIBRARY_NAME} + McuLib +) + +# target_include_directories: Libraries need to publish their header files +# so that you can import them in source code. This statement expresses where to find the files +# - typically in an include directory of your projects. +target_include_directories( + ${THIS_LIBRARY_NAME} + PUBLIC + . +) diff --git a/TSM_PicoW_Sensor/McuLib/unity/LICENSE.txt b/TSM_PicoW_Sensor/McuLib/unity/LICENSE.txt new file mode 100644 index 0000000..b9a329d --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/unity/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2007-21 Mike Karlesky, Mark VanderVoord, Greg Williams + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/TSM_PicoW_Sensor/McuLib/unity/link.md b/TSM_PicoW_Sensor/McuLib/unity/link.md new file mode 100644 index 0000000..74bee9e --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/unity/link.md @@ -0,0 +1,3 @@ +See +https://github.com/ThrowTheSwitch/Unity/tree/master +about the Unity framework. diff --git a/TSM_PicoW_Sensor/McuLib/unity/unity.c b/TSM_PicoW_Sensor/McuLib/unity/unity.c new file mode 100644 index 0000000..b6c08b7 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/unity/unity.c @@ -0,0 +1,2482 @@ +/* ========================================================================= + Unity Project - A Test Framework for C + Copyright (c) 2007-21 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +============================================================================ */ + +#include "unity.h" + +#ifndef UNITY_PROGMEM +#define UNITY_PROGMEM +#endif + +/* If omitted from header, declare overrideable prototypes here so they're ready for use */ +#ifdef UNITY_OMIT_OUTPUT_CHAR_HEADER_DECLARATION +void UNITY_OUTPUT_CHAR(int); +#endif + +/* Helpful macros for us to use here in Assert functions */ +#define UNITY_FAIL_AND_BAIL do { Unity.CurrentTestFailed = 1; UNITY_OUTPUT_FLUSH(); TEST_ABORT(); } while (0) +#define UNITY_IGNORE_AND_BAIL do { Unity.CurrentTestIgnored = 1; UNITY_OUTPUT_FLUSH(); TEST_ABORT(); } while (0) +#define RETURN_IF_FAIL_OR_IGNORE do { if (Unity.CurrentTestFailed || Unity.CurrentTestIgnored) { TEST_ABORT(); } } while (0) + +struct UNITY_STORAGE_T Unity; + +#ifdef UNITY_OUTPUT_COLOR +const char UNITY_PROGMEM UnityStrOk[] = "\033[42mOK\033[0m"; +const char UNITY_PROGMEM UnityStrPass[] = "\033[42mPASS\033[0m"; +const char UNITY_PROGMEM UnityStrFail[] = "\033[41mFAIL\033[0m"; +const char UNITY_PROGMEM UnityStrIgnore[] = "\033[43mIGNORE\033[0m"; +#else +const char UNITY_PROGMEM UnityStrOk[] = "OK"; +const char UNITY_PROGMEM UnityStrPass[] = "PASS"; +const char UNITY_PROGMEM UnityStrFail[] = "FAIL"; +const char UNITY_PROGMEM UnityStrIgnore[] = "IGNORE"; +#endif +static const char UNITY_PROGMEM UnityStrNull[] = "NULL"; +static const char UNITY_PROGMEM UnityStrSpacer[] = ". "; +static const char UNITY_PROGMEM UnityStrExpected[] = " Expected "; +static const char UNITY_PROGMEM UnityStrWas[] = " Was "; +static const char UNITY_PROGMEM UnityStrGt[] = " to be greater than "; +static const char UNITY_PROGMEM UnityStrLt[] = " to be less than "; +static const char UNITY_PROGMEM UnityStrOrEqual[] = "or equal to "; +static const char UNITY_PROGMEM UnityStrNotEqual[] = " to be not equal to "; +static const char UNITY_PROGMEM UnityStrElement[] = " Element "; +static const char UNITY_PROGMEM UnityStrByte[] = " Byte "; +static const char UNITY_PROGMEM UnityStrMemory[] = " Memory Mismatch."; +static const char UNITY_PROGMEM UnityStrDelta[] = " Values Not Within Delta "; +static const char UNITY_PROGMEM UnityStrPointless[] = " You Asked Me To Compare Nothing, Which Was Pointless."; +static const char UNITY_PROGMEM UnityStrNullPointerForExpected[] = " Expected pointer to be NULL"; +static const char UNITY_PROGMEM UnityStrNullPointerForActual[] = " Actual pointer was NULL"; +#ifndef UNITY_EXCLUDE_FLOAT +static const char UNITY_PROGMEM UnityStrNot[] = "Not "; +static const char UNITY_PROGMEM UnityStrInf[] = "Infinity"; +static const char UNITY_PROGMEM UnityStrNegInf[] = "Negative Infinity"; +static const char UNITY_PROGMEM UnityStrNaN[] = "NaN"; +static const char UNITY_PROGMEM UnityStrDet[] = "Determinate"; +static const char UNITY_PROGMEM UnityStrInvalidFloatTrait[] = "Invalid Float Trait"; +#endif +const char UNITY_PROGMEM UnityStrErrShorthand[] = "Unity Shorthand Support Disabled"; +const char UNITY_PROGMEM UnityStrErrFloat[] = "Unity Floating Point Disabled"; +const char UNITY_PROGMEM UnityStrErrDouble[] = "Unity Double Precision Disabled"; +const char UNITY_PROGMEM UnityStrErr64[] = "Unity 64-bit Support Disabled"; +static const char UNITY_PROGMEM UnityStrBreaker[] = "-----------------------"; +static const char UNITY_PROGMEM UnityStrResultsTests[] = " Tests "; +static const char UNITY_PROGMEM UnityStrResultsFailures[] = " Failures "; +static const char UNITY_PROGMEM UnityStrResultsIgnored[] = " Ignored "; +#ifndef UNITY_EXCLUDE_DETAILS +static const char UNITY_PROGMEM UnityStrDetail1Name[] = UNITY_DETAIL1_NAME " "; +static const char UNITY_PROGMEM UnityStrDetail2Name[] = " " UNITY_DETAIL2_NAME " "; +#endif +/*----------------------------------------------- + * Pretty Printers & Test Result Output Handlers + *-----------------------------------------------*/ + +/*-----------------------------------------------*/ +/* Local helper function to print characters. */ +static void UnityPrintChar(const char* pch) +{ + /* printable characters plus CR & LF are printed */ + if ((*pch <= 126) && (*pch >= 32)) + { + UNITY_OUTPUT_CHAR(*pch); + } + /* write escaped carriage returns */ + else if (*pch == 13) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('r'); + } + /* write escaped line feeds */ + else if (*pch == 10) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('n'); + } + /* unprintable characters are shown as codes */ + else + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('x'); + UnityPrintNumberHex((UNITY_UINT)*pch, 2); + } +} + +/*-----------------------------------------------*/ +/* Local helper function to print ANSI escape strings e.g. "\033[42m". */ +#ifdef UNITY_OUTPUT_COLOR +static UNITY_UINT UnityPrintAnsiEscapeString(const char* string) +{ + const char* pch = string; + UNITY_UINT count = 0; + + while (*pch && (*pch != 'm')) + { + UNITY_OUTPUT_CHAR(*pch); + pch++; + count++; + } + UNITY_OUTPUT_CHAR('m'); + count++; + + return count; +} +#endif + +/*-----------------------------------------------*/ +void UnityPrint(const char* string) +{ + const char* pch = string; + + if (pch != NULL) + { + while (*pch) + { +#ifdef UNITY_OUTPUT_COLOR + /* print ANSI escape code */ + if ((*pch == 27) && (*(pch + 1) == '[')) + { + pch += UnityPrintAnsiEscapeString(pch); + continue; + } +#endif + UnityPrintChar(pch); + pch++; + } + } +} +/*-----------------------------------------------*/ +void UnityPrintLen(const char* string, const UNITY_UINT32 length) +{ + const char* pch = string; + + if (pch != NULL) + { + while (*pch && ((UNITY_UINT32)(pch - string) < length)) + { + /* printable characters plus CR & LF are printed */ + if ((*pch <= 126) && (*pch >= 32)) + { + UNITY_OUTPUT_CHAR(*pch); + } + /* write escaped carriage returns */ + else if (*pch == 13) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('r'); + } + /* write escaped line feeds */ + else if (*pch == 10) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('n'); + } + /* unprintable characters are shown as codes */ + else + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('x'); + UnityPrintNumberHex((UNITY_UINT)*pch, 2); + } + pch++; + } + } +} + +/*-----------------------------------------------*/ +void UnityPrintNumberByStyle(const UNITY_INT number, const UNITY_DISPLAY_STYLE_T style) +{ + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + if (style == UNITY_DISPLAY_STYLE_CHAR) + { + /* printable characters plus CR & LF are printed */ + UNITY_OUTPUT_CHAR('\''); + if ((number <= 126) && (number >= 32)) + { + UNITY_OUTPUT_CHAR((int)number); + } + /* write escaped carriage returns */ + else if (number == 13) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('r'); + } + /* write escaped line feeds */ + else if (number == 10) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('n'); + } + /* unprintable characters are shown as codes */ + else + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('x'); + UnityPrintNumberHex((UNITY_UINT)number, 2); + } + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrintNumber(number); + } + } + else if ((style & UNITY_DISPLAY_RANGE_UINT) == UNITY_DISPLAY_RANGE_UINT) + { + UnityPrintNumberUnsigned((UNITY_UINT)number); + } + else + { + UNITY_OUTPUT_CHAR('0'); + UNITY_OUTPUT_CHAR('x'); + UnityPrintNumberHex((UNITY_UINT)number, (char)((style & 0xF) * 2)); + } +} + +/*-----------------------------------------------*/ +void UnityPrintNumber(const UNITY_INT number_to_print) +{ + UNITY_UINT number = (UNITY_UINT)number_to_print; + + if (number_to_print < 0) + { + /* A negative number, including MIN negative */ + UNITY_OUTPUT_CHAR('-'); + number = (~number) + 1; + } + UnityPrintNumberUnsigned(number); +} + +/*----------------------------------------------- + * basically do an itoa using as little ram as possible */ +void UnityPrintNumberUnsigned(const UNITY_UINT number) +{ + UNITY_UINT divisor = 1; + + /* figure out initial divisor */ + while (number / divisor > 9) + { + divisor *= 10; + } + + /* now mod and print, then divide divisor */ + do + { + UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10))); + divisor /= 10; + } while (divisor > 0); +} + +/*-----------------------------------------------*/ +void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles_to_print) +{ + int nibble; + char nibbles = nibbles_to_print; + + if ((unsigned)nibbles > UNITY_MAX_NIBBLES) + { + nibbles = UNITY_MAX_NIBBLES; + } + + while (nibbles > 0) + { + nibbles--; + nibble = (int)(number >> (nibbles * 4)) & 0x0F; + if (nibble <= 9) + { + UNITY_OUTPUT_CHAR((char)('0' + nibble)); + } + else + { + UNITY_OUTPUT_CHAR((char)('A' - 10 + nibble)); + } + } +} + +/*-----------------------------------------------*/ +void UnityPrintMask(const UNITY_UINT mask, const UNITY_UINT number) +{ + UNITY_UINT current_bit = (UNITY_UINT)1 << (UNITY_INT_WIDTH - 1); + UNITY_INT32 i; + + for (i = 0; i < UNITY_INT_WIDTH; i++) + { + if (current_bit & mask) + { + if (current_bit & number) + { + UNITY_OUTPUT_CHAR('1'); + } + else + { + UNITY_OUTPUT_CHAR('0'); + } + } + else + { + UNITY_OUTPUT_CHAR('X'); + } + current_bit = current_bit >> 1; + } +} + +/*-----------------------------------------------*/ +#ifndef UNITY_EXCLUDE_FLOAT_PRINT +/* + * This function prints a floating-point value in a format similar to + * printf("%.7g") on a single-precision machine or printf("%.9g") on a + * double-precision machine. The 7th digit won't always be totally correct + * in single-precision operation (for that level of accuracy, a more + * complicated algorithm would be needed). + */ +void UnityPrintFloat(const UNITY_DOUBLE input_number) +{ +#ifdef UNITY_INCLUDE_DOUBLE + static const int sig_digits = 9; + static const UNITY_INT32 min_scaled = 100000000; + static const UNITY_INT32 max_scaled = 1000000000; +#else + static const int sig_digits = 7; + static const UNITY_INT32 min_scaled = 1000000; + static const UNITY_INT32 max_scaled = 10000000; +#endif + + UNITY_DOUBLE number = input_number; + + /* print minus sign (does not handle negative zero) */ + if (number < 0.0f) + { + UNITY_OUTPUT_CHAR('-'); + number = -number; + } + + /* handle zero, NaN, and +/- infinity */ + if (number == 0.0f) + { + UnityPrint("0"); + } + else if (isnan(number)) + { + UnityPrint("nan"); + } + else if (isinf(number)) + { + UnityPrint("inf"); + } + else + { + UNITY_INT32 n_int = 0; + UNITY_INT32 n; + int exponent = 0; + int decimals; + int digits; + char buf[16] = {0}; + + /* + * Scale up or down by powers of 10. To minimize rounding error, + * start with a factor/divisor of 10^10, which is the largest + * power of 10 that can be represented exactly. Finally, compute + * (exactly) the remaining power of 10 and perform one more + * multiplication or division. + */ + if (number < 1.0f) + { + UNITY_DOUBLE factor = 1.0f; + + while (number < (UNITY_DOUBLE)max_scaled / 1e10f) { number *= 1e10f; exponent -= 10; } + while (number * factor < (UNITY_DOUBLE)min_scaled) { factor *= 10.0f; exponent--; } + + number *= factor; + } + else if (number > (UNITY_DOUBLE)max_scaled) + { + UNITY_DOUBLE divisor = 1.0f; + + while (number > (UNITY_DOUBLE)min_scaled * 1e10f) { number /= 1e10f; exponent += 10; } + while (number / divisor > (UNITY_DOUBLE)max_scaled) { divisor *= 10.0f; exponent++; } + + number /= divisor; + } + else + { + /* + * In this range, we can split off the integer part before + * doing any multiplications. This reduces rounding error by + * freeing up significant bits in the fractional part. + */ + UNITY_DOUBLE factor = 1.0f; + n_int = (UNITY_INT32)number; + number -= (UNITY_DOUBLE)n_int; + + while (n_int < min_scaled) { n_int *= 10; factor *= 10.0f; exponent--; } + + number *= factor; + } + + /* round to nearest integer */ + n = ((UNITY_INT32)(number + number) + 1) / 2; + +#ifndef UNITY_ROUND_TIES_AWAY_FROM_ZERO + /* round to even if exactly between two integers */ + if ((n & 1) && (((UNITY_DOUBLE)n - number) == 0.5f)) + n--; +#endif + + n += n_int; + + if (n >= max_scaled) + { + n = min_scaled; + exponent++; + } + + /* determine where to place decimal point */ + decimals = ((exponent <= 0) && (exponent >= -(sig_digits + 3))) ? (-exponent) : (sig_digits - 1); + exponent += decimals; + + /* truncate trailing zeroes after decimal point */ + while ((decimals > 0) && ((n % 10) == 0)) + { + n /= 10; + decimals--; + } + + /* build up buffer in reverse order */ + digits = 0; + while ((n != 0) || (digits <= decimals)) + { + buf[digits++] = (char)('0' + n % 10); + n /= 10; + } + + /* print out buffer (backwards) */ + while (digits > 0) + { + if (digits == decimals) + { + UNITY_OUTPUT_CHAR('.'); + } + UNITY_OUTPUT_CHAR(buf[--digits]); + } + + /* print exponent if needed */ + if (exponent != 0) + { + UNITY_OUTPUT_CHAR('e'); + + if (exponent < 0) + { + UNITY_OUTPUT_CHAR('-'); + exponent = -exponent; + } + else + { + UNITY_OUTPUT_CHAR('+'); + } + + digits = 0; + while ((exponent != 0) || (digits < 2)) + { + buf[digits++] = (char)('0' + exponent % 10); + exponent /= 10; + } + while (digits > 0) + { + UNITY_OUTPUT_CHAR(buf[--digits]); + } + } + } +} +#endif /* ! UNITY_EXCLUDE_FLOAT_PRINT */ + +/*-----------------------------------------------*/ +static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line) +{ +#ifdef UNITY_OUTPUT_FOR_ECLIPSE + UNITY_OUTPUT_CHAR('('); + UnityPrint(file); + UNITY_OUTPUT_CHAR(':'); + UnityPrintNumber((UNITY_INT)line); + UNITY_OUTPUT_CHAR(')'); + UNITY_OUTPUT_CHAR(' '); + UnityPrint(Unity.CurrentTestName); + UNITY_OUTPUT_CHAR(':'); +#else +#ifdef UNITY_OUTPUT_FOR_IAR_WORKBENCH + UnityPrint("'); + UnityPrint(Unity.CurrentTestName); + UnityPrint(" "); +#else +#ifdef UNITY_OUTPUT_FOR_QT_CREATOR + UnityPrint("file://"); + UnityPrint(file); + UNITY_OUTPUT_CHAR(':'); + UnityPrintNumber((UNITY_INT)line); + UNITY_OUTPUT_CHAR(' '); + UnityPrint(Unity.CurrentTestName); + UNITY_OUTPUT_CHAR(':'); +#else + UnityPrint(file); + UNITY_OUTPUT_CHAR(':'); + UnityPrintNumber((UNITY_INT)line); + UNITY_OUTPUT_CHAR(':'); + UnityPrint(Unity.CurrentTestName); + UNITY_OUTPUT_CHAR(':'); +#endif +#endif +#endif +} + +/*-----------------------------------------------*/ +static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line) +{ + UnityTestResultsBegin(Unity.TestFile, line); + UnityPrint(UnityStrFail); + UNITY_OUTPUT_CHAR(':'); +} + +/*-----------------------------------------------*/ +void UnityConcludeTest(void) +{ + if (Unity.CurrentTestIgnored) + { + Unity.TestIgnores++; + } + else if (!Unity.CurrentTestFailed) + { + UnityTestResultsBegin(Unity.TestFile, Unity.CurrentTestLineNumber); + UnityPrint(UnityStrPass); + } + else + { + Unity.TestFailures++; + } + + Unity.CurrentTestFailed = 0; + Unity.CurrentTestIgnored = 0; + UNITY_PRINT_EXEC_TIME(); + UNITY_PRINT_EOL(); + UNITY_FLUSH_CALL(); +} + +/*-----------------------------------------------*/ +static void UnityAddMsgIfSpecified(const char* msg) +{ +#ifdef UNITY_PRINT_TEST_CONTEXT + UnityPrint(UnityStrSpacer); + UNITY_PRINT_TEST_CONTEXT(); +#endif +#ifndef UNITY_EXCLUDE_DETAILS + if (Unity.CurrentDetail1) + { + UnityPrint(UnityStrSpacer); + UnityPrint(UnityStrDetail1Name); + UnityPrint(Unity.CurrentDetail1); + if (Unity.CurrentDetail2) + { + UnityPrint(UnityStrDetail2Name); + UnityPrint(Unity.CurrentDetail2); + } + } +#endif + if (msg) + { + UnityPrint(UnityStrSpacer); + UnityPrint(msg); + } +} + +/*-----------------------------------------------*/ +static void UnityPrintExpectedAndActualStrings(const char* expected, const char* actual) +{ + UnityPrint(UnityStrExpected); + if (expected != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrint(expected); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } + UnityPrint(UnityStrWas); + if (actual != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrint(actual); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } +} + +/*-----------------------------------------------*/ +static void UnityPrintExpectedAndActualStringsLen(const char* expected, + const char* actual, + const UNITY_UINT32 length) +{ + UnityPrint(UnityStrExpected); + if (expected != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrintLen(expected, length); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } + UnityPrint(UnityStrWas); + if (actual != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrintLen(actual, length); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } +} + +/*----------------------------------------------- + * Assertion & Control Helpers + *-----------------------------------------------*/ + +/*-----------------------------------------------*/ +static int UnityIsOneArrayNull(UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const UNITY_LINE_TYPE lineNumber, + const char* msg) +{ + /* Both are NULL or same pointer */ + if (expected == actual) { return 0; } + + /* print and return true if just expected is NULL */ + if (expected == NULL) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrNullPointerForExpected); + UnityAddMsgIfSpecified(msg); + return 1; + } + + /* print and return true if just actual is NULL */ + if (actual == NULL) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrNullPointerForActual); + UnityAddMsgIfSpecified(msg); + return 1; + } + + return 0; /* return false if neither is NULL */ +} + +/*----------------------------------------------- + * Assertion Functions + *-----------------------------------------------*/ + +/*-----------------------------------------------*/ +void UnityAssertBits(const UNITY_INT mask, + const UNITY_INT expected, + const UNITY_INT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + RETURN_IF_FAIL_OR_IGNORE; + + if ((mask & expected) != (mask & actual)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintMask((UNITY_UINT)mask, (UNITY_UINT)expected); + UnityPrint(UnityStrWas); + UnityPrintMask((UNITY_UINT)mask, (UNITY_UINT)actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertEqualNumber(const UNITY_INT expected, + const UNITY_INT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style) +{ + RETURN_IF_FAIL_OR_IGNORE; + + if (expected != actual) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(expected, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(actual, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertGreaterOrLessOrEqualNumber(const UNITY_INT threshold, + const UNITY_INT actual, + const UNITY_COMPARISON_T compare, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style) +{ + int failed = 0; + RETURN_IF_FAIL_OR_IGNORE; + + if ((threshold == actual) && (compare & UNITY_EQUAL_TO)) { return; } + if ((threshold == actual)) { failed = 1; } + + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + if ((actual > threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; } + if ((actual < threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; } + } + else /* UINT or HEX */ + { + if (((UNITY_UINT)actual > (UNITY_UINT)threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; } + if (((UNITY_UINT)actual < (UNITY_UINT)threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; } + } + + if (failed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(actual, style); + if (compare & UNITY_GREATER_THAN) { UnityPrint(UnityStrGt); } + if (compare & UNITY_SMALLER_THAN) { UnityPrint(UnityStrLt); } + if (compare & UNITY_EQUAL_TO) { UnityPrint(UnityStrOrEqual); } + if (compare == UNITY_NOT_EQUAL) { UnityPrint(UnityStrNotEqual); } + UnityPrintNumberByStyle(threshold, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +#define UnityPrintPointlessAndBail() \ +do { \ + UnityTestResultsFailBegin(lineNumber); \ + UnityPrint(UnityStrPointless); \ + UnityAddMsgIfSpecified(msg); \ + UNITY_FAIL_AND_BAIL; \ +} while (0) + +/*-----------------------------------------------*/ +void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style, + const UNITY_FLAGS_T flags) +{ + UNITY_UINT32 elements = num_elements; + unsigned int length = style & 0xF; + unsigned int increment = 0; + + RETURN_IF_FAIL_OR_IGNORE; + + if (num_elements == 0) + { +#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY + UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); +#else + UnityPrintPointlessAndBail(); +#endif + } + + if (expected == actual) + { + return; /* Both are NULL or same pointer */ + } + + if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) + { + UNITY_FAIL_AND_BAIL; + } + + while ((elements > 0) && (elements--)) + { + UNITY_INT expect_val; + UNITY_INT actual_val; + + switch (length) + { + case 1: + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)actual; + if (style & (UNITY_DISPLAY_RANGE_UINT | UNITY_DISPLAY_RANGE_HEX)) + { + expect_val &= 0x000000FF; + actual_val &= 0x000000FF; + } + increment = sizeof(UNITY_INT8); + break; + + case 2: + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)actual; + if (style & (UNITY_DISPLAY_RANGE_UINT | UNITY_DISPLAY_RANGE_HEX)) + { + expect_val &= 0x0000FFFF; + actual_val &= 0x0000FFFF; + } + increment = sizeof(UNITY_INT16); + break; + +#ifdef UNITY_SUPPORT_64 + case 8: + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)actual; + increment = sizeof(UNITY_INT64); + break; +#endif + + default: /* default is length 4 bytes */ + case 4: + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)actual; +#ifdef UNITY_SUPPORT_64 + if (style & (UNITY_DISPLAY_RANGE_UINT | UNITY_DISPLAY_RANGE_HEX)) + { + expect_val &= 0x00000000FFFFFFFF; + actual_val &= 0x00000000FFFFFFFF; + } +#endif + increment = sizeof(UNITY_INT32); + length = 4; + break; + } + + if (expect_val != actual_val) + { + if ((style & UNITY_DISPLAY_RANGE_UINT) && (length < (UNITY_INT_WIDTH / 8))) + { /* For UINT, remove sign extension (padding 1's) from signed type casts above */ + UNITY_INT mask = 1; + mask = (mask << 8 * length) - 1; + expect_val &= mask; + actual_val &= mask; + } + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(expect_val, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(actual_val, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + /* Walk through array by incrementing the pointers */ + if (flags == UNITY_ARRAY_TO_ARRAY) + { + expected = (UNITY_INTERNAL_PTR)((const char*)expected + increment); + } + actual = (UNITY_INTERNAL_PTR)((const char*)actual + increment); + } +} + +/*-----------------------------------------------*/ +#ifndef UNITY_EXCLUDE_FLOAT +/* Wrap this define in a function with variable types as float or double */ +#define UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff) \ + if (isinf(expected) && isinf(actual) && (((expected) < 0) == ((actual) < 0))) return 1; \ + if (UNITY_NAN_CHECK) return 1; \ + (diff) = (actual) - (expected); \ + if ((diff) < 0) (diff) = -(diff); \ + if ((delta) < 0) (delta) = -(delta); \ + return !(isnan(diff) || isinf(diff) || ((diff) > (delta))) + /* This first part of this condition will catch any NaN or Infinite values */ +#ifndef UNITY_NAN_NOT_EQUAL_NAN + #define UNITY_NAN_CHECK isnan(expected) && isnan(actual) +#else + #define UNITY_NAN_CHECK 0 +#endif + +#ifndef UNITY_EXCLUDE_FLOAT_PRINT + #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \ + do { \ + UnityPrint(UnityStrExpected); \ + UnityPrintFloat(expected); \ + UnityPrint(UnityStrWas); \ + UnityPrintFloat(actual); \ + } while (0) +#else + #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \ + UnityPrint(UnityStrDelta) +#endif /* UNITY_EXCLUDE_FLOAT_PRINT */ + +/*-----------------------------------------------*/ +static int UnityFloatsWithin(UNITY_FLOAT delta, UNITY_FLOAT expected, UNITY_FLOAT actual) +{ + UNITY_FLOAT diff; + UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff); +} + +/*-----------------------------------------------*/ +void UnityAssertWithinFloatArray(const UNITY_FLOAT delta, + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected, + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* actual, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags) +{ + UNITY_UINT32 elements = num_elements; + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_expected = expected; + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_actual = actual; + UNITY_FLOAT in_delta = delta; + UNITY_FLOAT current_element_delta = delta; + + RETURN_IF_FAIL_OR_IGNORE; + + if (elements == 0) + { +#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY + UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); +#else + UnityPrintPointlessAndBail(); +#endif + } + + if (isinf(in_delta)) + { + return; /* Arrays will be force equal with infinite delta */ + } + + if (isnan(in_delta)) + { + /* Delta must be correct number */ + UnityPrintPointlessAndBail(); + } + + if (expected == actual) + { + return; /* Both are NULL or same pointer */ + } + + if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) + { + UNITY_FAIL_AND_BAIL; + } + + /* fix delta sign if need */ + if (in_delta < 0) + { + in_delta = -in_delta; + } + + while (elements--) + { + current_element_delta = *ptr_expected * UNITY_FLOAT_PRECISION; + + if (current_element_delta < 0) + { + /* fix delta sign for correct calculations */ + current_element_delta = -current_element_delta; + } + + if (!UnityFloatsWithin(in_delta + current_element_delta, *ptr_expected, *ptr_actual)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)*ptr_expected, (UNITY_DOUBLE)*ptr_actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + if (flags == UNITY_ARRAY_TO_ARRAY) + { + ptr_expected++; + } + ptr_actual++; + } +} + +/*-----------------------------------------------*/ +void UnityAssertFloatsWithin(const UNITY_FLOAT delta, + const UNITY_FLOAT expected, + const UNITY_FLOAT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + RETURN_IF_FAIL_OR_IGNORE; + + + if (!UnityFloatsWithin(delta, expected, actual)) + { + UnityTestResultsFailBegin(lineNumber); + UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)expected, (UNITY_DOUBLE)actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertFloatsNotWithin(const UNITY_FLOAT delta, + const UNITY_FLOAT expected, + const UNITY_FLOAT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + RETURN_IF_FAIL_OR_IGNORE; + + if (UnityFloatsWithin(delta, expected, actual)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintFloat((UNITY_DOUBLE)expected); + UnityPrint(UnityStrNotEqual); + UnityPrintFloat((UNITY_DOUBLE)actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertGreaterOrLessFloat(const UNITY_FLOAT threshold, + const UNITY_FLOAT actual, + const UNITY_COMPARISON_T compare, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + int failed; + + RETURN_IF_FAIL_OR_IGNORE; + + failed = 0; + + /* Checking for "not success" rather than failure to get the right result for NaN */ + if (!(actual < threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; } + if (!(actual > threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; } + + if ((compare & UNITY_EQUAL_TO) && UnityFloatsWithin(threshold * UNITY_FLOAT_PRECISION, threshold, actual)) { failed = 0; } + + if (failed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintFloat(actual); + if (compare & UNITY_GREATER_THAN) { UnityPrint(UnityStrGt); } + if (compare & UNITY_SMALLER_THAN) { UnityPrint(UnityStrLt); } + if (compare & UNITY_EQUAL_TO) { UnityPrint(UnityStrOrEqual); } + UnityPrintFloat(threshold); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertFloatSpecial(const UNITY_FLOAT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLOAT_TRAIT_T style) +{ + const char* trait_names[] = {UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet}; + UNITY_INT should_be_trait = ((UNITY_INT)style & 1); + UNITY_INT is_trait = !should_be_trait; + UNITY_INT trait_index = (UNITY_INT)(style >> 1); + + RETURN_IF_FAIL_OR_IGNORE; + + switch (style) + { + case UNITY_FLOAT_IS_INF: + case UNITY_FLOAT_IS_NOT_INF: + is_trait = isinf(actual) && (actual > 0); + break; + case UNITY_FLOAT_IS_NEG_INF: + case UNITY_FLOAT_IS_NOT_NEG_INF: + is_trait = isinf(actual) && (actual < 0); + break; + + case UNITY_FLOAT_IS_NAN: + case UNITY_FLOAT_IS_NOT_NAN: + is_trait = isnan(actual) ? 1 : 0; + break; + + case UNITY_FLOAT_IS_DET: /* A determinate number is non infinite and not NaN. */ + case UNITY_FLOAT_IS_NOT_DET: + is_trait = !isinf(actual) && !isnan(actual); + break; + + case UNITY_FLOAT_INVALID_TRAIT: /* Supress warning */ + default: /* including UNITY_FLOAT_INVALID_TRAIT */ + trait_index = 0; + trait_names[0] = UnityStrInvalidFloatTrait; + break; + } + + if (is_trait != should_be_trait) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + if (!should_be_trait) + { + UnityPrint(UnityStrNot); + } + UnityPrint(trait_names[trait_index]); + UnityPrint(UnityStrWas); +#ifndef UNITY_EXCLUDE_FLOAT_PRINT + UnityPrintFloat((UNITY_DOUBLE)actual); +#else + if (should_be_trait) + { + UnityPrint(UnityStrNot); + } + UnityPrint(trait_names[trait_index]); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +#endif /* not UNITY_EXCLUDE_FLOAT */ + +/*-----------------------------------------------*/ +#ifndef UNITY_EXCLUDE_DOUBLE +static int UnityDoublesWithin(UNITY_DOUBLE delta, UNITY_DOUBLE expected, UNITY_DOUBLE actual) +{ + UNITY_DOUBLE diff; + UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff); +} + +/*-----------------------------------------------*/ +void UnityAssertWithinDoubleArray(const UNITY_DOUBLE delta, + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expected, + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* actual, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags) +{ + UNITY_UINT32 elements = num_elements; + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_expected = expected; + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_actual = actual; + UNITY_DOUBLE in_delta = delta; + UNITY_DOUBLE current_element_delta = delta; + + RETURN_IF_FAIL_OR_IGNORE; + + if (elements == 0) + { +#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY + UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); +#else + UnityPrintPointlessAndBail(); +#endif + } + + if (isinf(in_delta)) + { + return; /* Arrays will be force equal with infinite delta */ + } + + if (isnan(in_delta)) + { + /* Delta must be correct number */ + UnityPrintPointlessAndBail(); + } + + if (expected == actual) + { + return; /* Both are NULL or same pointer */ + } + + if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) + { + UNITY_FAIL_AND_BAIL; + } + + /* fix delta sign if need */ + if (in_delta < 0) + { + in_delta = -in_delta; + } + + while (elements--) + { + current_element_delta = *ptr_expected * UNITY_DOUBLE_PRECISION; + + if (current_element_delta < 0) + { + /* fix delta sign for correct calculations */ + current_element_delta = -current_element_delta; + } + + if (!UnityDoublesWithin(in_delta + current_element_delta, *ptr_expected, *ptr_actual)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(*ptr_expected, *ptr_actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + if (flags == UNITY_ARRAY_TO_ARRAY) + { + ptr_expected++; + } + ptr_actual++; + } +} + +/*-----------------------------------------------*/ +void UnityAssertDoublesWithin(const UNITY_DOUBLE delta, + const UNITY_DOUBLE expected, + const UNITY_DOUBLE actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + RETURN_IF_FAIL_OR_IGNORE; + + if (!UnityDoublesWithin(delta, expected, actual)) + { + UnityTestResultsFailBegin(lineNumber); + UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertDoublesNotWithin(const UNITY_DOUBLE delta, + const UNITY_DOUBLE expected, + const UNITY_DOUBLE actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + RETURN_IF_FAIL_OR_IGNORE; + + if (UnityDoublesWithin(delta, expected, actual)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintFloat((UNITY_DOUBLE)expected); + UnityPrint(UnityStrNotEqual); + UnityPrintFloat((UNITY_DOUBLE)actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertGreaterOrLessDouble(const UNITY_DOUBLE threshold, + const UNITY_DOUBLE actual, + const UNITY_COMPARISON_T compare, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + int failed; + + RETURN_IF_FAIL_OR_IGNORE; + + failed = 0; + + /* Checking for "not success" rather than failure to get the right result for NaN */ + if (!(actual < threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; } + if (!(actual > threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; } + + if ((compare & UNITY_EQUAL_TO) && UnityDoublesWithin(threshold * UNITY_DOUBLE_PRECISION, threshold, actual)) { failed = 0; } + + if (failed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintFloat(actual); + if (compare & UNITY_GREATER_THAN) { UnityPrint(UnityStrGt); } + if (compare & UNITY_SMALLER_THAN) { UnityPrint(UnityStrLt); } + if (compare & UNITY_EQUAL_TO) { UnityPrint(UnityStrOrEqual); } + UnityPrintFloat(threshold); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLOAT_TRAIT_T style) +{ + const char* trait_names[] = {UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet}; + UNITY_INT should_be_trait = ((UNITY_INT)style & 1); + UNITY_INT is_trait = !should_be_trait; + UNITY_INT trait_index = (UNITY_INT)(style >> 1); + + RETURN_IF_FAIL_OR_IGNORE; + + switch (style) + { + case UNITY_FLOAT_IS_INF: + case UNITY_FLOAT_IS_NOT_INF: + is_trait = isinf(actual) && (actual > 0); + break; + case UNITY_FLOAT_IS_NEG_INF: + case UNITY_FLOAT_IS_NOT_NEG_INF: + is_trait = isinf(actual) && (actual < 0); + break; + + case UNITY_FLOAT_IS_NAN: + case UNITY_FLOAT_IS_NOT_NAN: + is_trait = isnan(actual) ? 1 : 0; + break; + + case UNITY_FLOAT_IS_DET: /* A determinate number is non infinite and not NaN. */ + case UNITY_FLOAT_IS_NOT_DET: + is_trait = !isinf(actual) && !isnan(actual); + break; + + case UNITY_FLOAT_INVALID_TRAIT: /* Supress warning */ + default: /* including UNITY_FLOAT_INVALID_TRAIT */ + trait_index = 0; + trait_names[0] = UnityStrInvalidFloatTrait; + break; + } + + if (is_trait != should_be_trait) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + if (!should_be_trait) + { + UnityPrint(UnityStrNot); + } + UnityPrint(trait_names[trait_index]); + UnityPrint(UnityStrWas); +#ifndef UNITY_EXCLUDE_FLOAT_PRINT + UnityPrintFloat(actual); +#else + if (should_be_trait) + { + UnityPrint(UnityStrNot); + } + UnityPrint(trait_names[trait_index]); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +#endif /* not UNITY_EXCLUDE_DOUBLE */ + +/*-----------------------------------------------*/ +void UnityAssertNumbersWithin(const UNITY_UINT delta, + const UNITY_INT expected, + const UNITY_INT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style) +{ + RETURN_IF_FAIL_OR_IGNORE; + + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + if (actual > expected) + { + Unity.CurrentTestFailed = (((UNITY_UINT)actual - (UNITY_UINT)expected) > delta); + } + else + { + Unity.CurrentTestFailed = (((UNITY_UINT)expected - (UNITY_UINT)actual) > delta); + } + } + else + { + if ((UNITY_UINT)actual > (UNITY_UINT)expected) + { + Unity.CurrentTestFailed = (((UNITY_UINT)actual - (UNITY_UINT)expected) > delta); + } + else + { + Unity.CurrentTestFailed = (((UNITY_UINT)expected - (UNITY_UINT)actual) > delta); + } + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrDelta); + UnityPrintNumberByStyle((UNITY_INT)delta, style); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(expected, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(actual, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertNumbersArrayWithin(const UNITY_UINT delta, + UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style, + const UNITY_FLAGS_T flags) +{ + UNITY_UINT32 elements = num_elements; + unsigned int length = style & 0xF; + unsigned int increment = 0; + + RETURN_IF_FAIL_OR_IGNORE; + + if (num_elements == 0) + { +#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY + UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); +#else + UnityPrintPointlessAndBail(); +#endif + } + + if (expected == actual) + { + return; /* Both are NULL or same pointer */ + } + + if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) + { + UNITY_FAIL_AND_BAIL; + } + + while ((elements > 0) && (elements--)) + { + UNITY_INT expect_val; + UNITY_INT actual_val; + + switch (length) + { + case 1: + /* fixing problems with signed overflow on unsigned numbers */ + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)actual; + increment = sizeof(UNITY_INT8); + } + else + { + expect_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT8*)expected; + actual_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT8*)actual; + increment = sizeof(UNITY_UINT8); + } + break; + + case 2: + /* fixing problems with signed overflow on unsigned numbers */ + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)actual; + increment = sizeof(UNITY_INT16); + } + else + { + expect_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT16*)expected; + actual_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT16*)actual; + increment = sizeof(UNITY_UINT16); + } + break; + +#ifdef UNITY_SUPPORT_64 + case 8: + /* fixing problems with signed overflow on unsigned numbers */ + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)actual; + increment = sizeof(UNITY_INT64); + } + else + { + expect_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT64*)expected; + actual_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT64*)actual; + increment = sizeof(UNITY_UINT64); + } + break; +#endif + + default: /* default is length 4 bytes */ + case 4: + /* fixing problems with signed overflow on unsigned numbers */ + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)expected; + actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)actual; + increment = sizeof(UNITY_INT32); + } + else + { + expect_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT32*)expected; + actual_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT32*)actual; + increment = sizeof(UNITY_UINT32); + } + length = 4; + break; + } + + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + if (actual_val > expect_val) + { + Unity.CurrentTestFailed = (((UNITY_UINT)actual_val - (UNITY_UINT)expect_val) > delta); + } + else + { + Unity.CurrentTestFailed = (((UNITY_UINT)expect_val - (UNITY_UINT)actual_val) > delta); + } + } + else + { + if ((UNITY_UINT)actual_val > (UNITY_UINT)expect_val) + { + Unity.CurrentTestFailed = (((UNITY_UINT)actual_val - (UNITY_UINT)expect_val) > delta); + } + else + { + Unity.CurrentTestFailed = (((UNITY_UINT)expect_val - (UNITY_UINT)actual_val) > delta); + } + } + + if (Unity.CurrentTestFailed) + { + if ((style & UNITY_DISPLAY_RANGE_UINT) && (length < (UNITY_INT_WIDTH / 8))) + { /* For UINT, remove sign extension (padding 1's) from signed type casts above */ + UNITY_INT mask = 1; + mask = (mask << 8 * length) - 1; + expect_val &= mask; + actual_val &= mask; + } + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrDelta); + UnityPrintNumberByStyle((UNITY_INT)delta, style); + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(expect_val, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(actual_val, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + /* Walk through array by incrementing the pointers */ + if (flags == UNITY_ARRAY_TO_ARRAY) + { + expected = (UNITY_INTERNAL_PTR)((const char*)expected + increment); + } + actual = (UNITY_INTERNAL_PTR)((const char*)actual + increment); + } +} + +/*-----------------------------------------------*/ +void UnityAssertEqualString(const char* expected, + const char* actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + UNITY_UINT32 i; + + RETURN_IF_FAIL_OR_IGNORE; + + /* if both pointers not null compare the strings */ + if (expected && actual) + { + for (i = 0; expected[i] || actual[i]; i++) + { + if (expected[i] != actual[i]) + { + Unity.CurrentTestFailed = 1; + break; + } + } + } + else + { /* handle case of one pointers being null (if both null, test should pass) */ + if (expected != actual) + { + Unity.CurrentTestFailed = 1; + } + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrintExpectedAndActualStrings(expected, actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertEqualStringLen(const char* expected, + const char* actual, + const UNITY_UINT32 length, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + UNITY_UINT32 i; + + RETURN_IF_FAIL_OR_IGNORE; + + /* if both pointers not null compare the strings */ + if (expected && actual) + { + for (i = 0; (i < length) && (expected[i] || actual[i]); i++) + { + if (expected[i] != actual[i]) + { + Unity.CurrentTestFailed = 1; + break; + } + } + } + else + { /* handle case of one pointers being null (if both null, test should pass) */ + if (expected != actual) + { + Unity.CurrentTestFailed = 1; + } + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrintExpectedAndActualStringsLen(expected, actual, length); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +/*-----------------------------------------------*/ +void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected, + const char** actual, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags) +{ + UNITY_UINT32 i = 0; + UNITY_UINT32 j = 0; + const char* expd = NULL; + const char* act = NULL; + + RETURN_IF_FAIL_OR_IGNORE; + + /* if no elements, it's an error */ + if (num_elements == 0) + { +#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY + UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); +#else + UnityPrintPointlessAndBail(); +#endif + } + + if ((const void*)expected == (const void*)actual) + { + return; /* Both are NULL or same pointer */ + } + + if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) + { + UNITY_FAIL_AND_BAIL; + } + + if (flags != UNITY_ARRAY_TO_ARRAY) + { + expd = (const char*)expected; + } + + do + { + act = actual[j]; + if (flags == UNITY_ARRAY_TO_ARRAY) + { + expd = ((const char* const*)expected)[j]; + } + + /* if both pointers not null compare the strings */ + if (expd && act) + { + for (i = 0; expd[i] || act[i]; i++) + { + if (expd[i] != act[i]) + { + Unity.CurrentTestFailed = 1; + break; + } + } + } + else + { /* handle case of one pointers being null (if both null, test should pass) */ + if (expd != act) + { + Unity.CurrentTestFailed = 1; + } + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + if (num_elements > 1) + { + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(j); + } + UnityPrintExpectedAndActualStrings(expd, act); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + } while (++j < num_elements); +} + +/*-----------------------------------------------*/ +void UnityAssertEqualMemory(UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const UNITY_UINT32 length, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags) +{ + UNITY_PTR_ATTRIBUTE const unsigned char* ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected; + UNITY_PTR_ATTRIBUTE const unsigned char* ptr_act = (UNITY_PTR_ATTRIBUTE const unsigned char*)actual; + UNITY_UINT32 elements = num_elements; + UNITY_UINT32 bytes; + + RETURN_IF_FAIL_OR_IGNORE; + + if (elements == 0) + { +#ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY + UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); +#else + UnityPrintPointlessAndBail(); +#endif + } + if (length == 0) + { + UnityPrintPointlessAndBail(); + } + + if (expected == actual) + { + return; /* Both are NULL or same pointer */ + } + + if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) + { + UNITY_FAIL_AND_BAIL; + } + + while (elements--) + { + bytes = length; + while (bytes--) + { + if (*ptr_exp != *ptr_act) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrMemory); + if (num_elements > 1) + { + UnityPrint(UnityStrElement); + UnityPrintNumberUnsigned(num_elements - elements - 1); + } + UnityPrint(UnityStrByte); + UnityPrintNumberUnsigned(length - bytes - 1); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(*ptr_exp, UNITY_DISPLAY_STYLE_HEX8); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(*ptr_act, UNITY_DISPLAY_STYLE_HEX8); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_exp++; + ptr_act++; + } + if (flags == UNITY_ARRAY_TO_VAL) + { + ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected; + } + } +} + +/*-----------------------------------------------*/ + +static union +{ + UNITY_INT8 i8; + UNITY_INT16 i16; + UNITY_INT32 i32; +#ifdef UNITY_SUPPORT_64 + UNITY_INT64 i64; +#endif +#ifndef UNITY_EXCLUDE_FLOAT + float f; +#endif +#ifndef UNITY_EXCLUDE_DOUBLE + double d; +#endif +} UnityQuickCompare; + +UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size) +{ + switch(size) + { + case 1: + UnityQuickCompare.i8 = (UNITY_INT8)num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i8); + + case 2: + UnityQuickCompare.i16 = (UNITY_INT16)num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i16); + +#ifdef UNITY_SUPPORT_64 + case 8: + UnityQuickCompare.i64 = (UNITY_INT64)num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i64); +#endif + + default: /* 4 bytes */ + UnityQuickCompare.i32 = (UNITY_INT32)num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i32); + } +} + +#ifndef UNITY_EXCLUDE_FLOAT +/*-----------------------------------------------*/ +UNITY_INTERNAL_PTR UnityFloatToPtr(const float num) +{ + UnityQuickCompare.f = num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.f); +} +#endif + +#ifndef UNITY_EXCLUDE_DOUBLE +/*-----------------------------------------------*/ +UNITY_INTERNAL_PTR UnityDoubleToPtr(const double num) +{ + UnityQuickCompare.d = num; + return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.d); +} +#endif + +#ifdef UNITY_INCLUDE_PRINT_FORMATTED + +/*----------------------------------------------- + * printf length modifier helpers + *-----------------------------------------------*/ + +enum UnityLengthModifier { + UNITY_LENGTH_MODIFIER_NONE, + UNITY_LENGTH_MODIFIER_LONG_LONG, + UNITY_LENGTH_MODIFIER_LONG, +}; + +#define UNITY_EXTRACT_ARG(NUMBER_T, NUMBER, LENGTH_MOD, VA, ARG_T) \ +do { \ + switch (LENGTH_MOD) \ + { \ + case UNITY_LENGTH_MODIFIER_LONG_LONG: \ + { \ + NUMBER = (NUMBER_T)va_arg(VA, long long ARG_T); \ + break; \ + } \ + case UNITY_LENGTH_MODIFIER_LONG: \ + { \ + NUMBER = (NUMBER_T)va_arg(VA, long ARG_T); \ + break; \ + } \ + case UNITY_LENGTH_MODIFIER_NONE: \ + default: \ + { \ + NUMBER = (NUMBER_T)va_arg(VA, ARG_T); \ + break; \ + } \ + } \ +} while (0) + +static enum UnityLengthModifier UnityLengthModifierGet(const char *pch, int *length) +{ + enum UnityLengthModifier length_mod; + switch (pch[0]) + { + case 'l': + { + if (pch[1] == 'l') + { + *length = 2; + length_mod = UNITY_LENGTH_MODIFIER_LONG_LONG; + } + else + { + *length = 1; + length_mod = UNITY_LENGTH_MODIFIER_LONG; + } + break; + } + case 'h': + { + // short and char are converted to int + length_mod = UNITY_LENGTH_MODIFIER_NONE; + if (pch[1] == 'h') + { + *length = 2; + } + else + { + *length = 1; + } + break; + } + case 'j': + case 'z': + case 't': + case 'L': + { + // Not supported, but should gobble up the length specifier anyway + length_mod = UNITY_LENGTH_MODIFIER_NONE; + *length = 1; + break; + } + default: + { + length_mod = UNITY_LENGTH_MODIFIER_NONE; + *length = 0; + } + } + return length_mod; +} + +/*----------------------------------------------- + * printf helper function + *-----------------------------------------------*/ +static void UnityPrintFVA(const char* format, va_list va) +{ + const char* pch = format; + if (pch != NULL) + { + while (*pch) + { + /* format identification character */ + if (*pch == '%') + { + pch++; + + if (pch != NULL) + { + int length_mod_size; + enum UnityLengthModifier length_mod = UnityLengthModifierGet(pch, &length_mod_size); + pch += length_mod_size; + + switch (*pch) + { + case 'd': + case 'i': + { + UNITY_INT number; + UNITY_EXTRACT_ARG(UNITY_INT, number, length_mod, va, int); + UnityPrintNumber((UNITY_INT)number); + break; + } +#ifndef UNITY_EXCLUDE_FLOAT_PRINT + case 'f': + case 'g': + { + const double number = va_arg(va, double); + UnityPrintFloat((UNITY_DOUBLE)number); + break; + } +#endif + case 'u': + { + UNITY_UINT number; + UNITY_EXTRACT_ARG(UNITY_UINT, number, length_mod, va, unsigned int); + UnityPrintNumberUnsigned(number); + break; + } + case 'b': + { + UNITY_UINT number; + UNITY_EXTRACT_ARG(UNITY_UINT, number, length_mod, va, unsigned int); + const UNITY_UINT mask = (UNITY_UINT)0 - (UNITY_UINT)1; + UNITY_OUTPUT_CHAR('0'); + UNITY_OUTPUT_CHAR('b'); + UnityPrintMask(mask, number); + break; + } + case 'x': + case 'X': + { + UNITY_UINT number; + UNITY_EXTRACT_ARG(UNITY_UINT, number, length_mod, va, unsigned int); + UNITY_OUTPUT_CHAR('0'); + UNITY_OUTPUT_CHAR('x'); + if (length_mod == UNITY_LENGTH_MODIFIER_LONG_LONG) + { + UnityPrintNumberHex(number, 16); + } + else + { + UnityPrintNumberHex(number, 8); + } + break; + } + case 'p': + { + UNITY_UINT number; + char nibbles_to_print = 8; + if (UNITY_POINTER_WIDTH == 64) + { + length_mod = UNITY_LENGTH_MODIFIER_LONG_LONG; + nibbles_to_print = 16; + } + UNITY_EXTRACT_ARG(UNITY_UINT, number, length_mod, va, unsigned int); + UNITY_OUTPUT_CHAR('0'); + UNITY_OUTPUT_CHAR('x'); + UnityPrintNumberHex((UNITY_UINT)number, nibbles_to_print); + break; + } + case 'c': + { + const int ch = va_arg(va, int); + UnityPrintChar((const char *)&ch); + break; + } + case 's': + { + const char * string = va_arg(va, const char *); + UnityPrint(string); + break; + } + case '%': + { + UnityPrintChar(pch); + break; + } + default: + { + /* print the unknown format character */ + UNITY_OUTPUT_CHAR('%'); + UnityPrintChar(pch); + break; + } + } + } + } +#ifdef UNITY_OUTPUT_COLOR + /* print ANSI escape code */ + else if ((*pch == 27) && (*(pch + 1) == '[')) + { + pch += UnityPrintAnsiEscapeString(pch); + continue; + } +#endif + else if (*pch == '\n') + { + UNITY_PRINT_EOL(); + } + else + { + UnityPrintChar(pch); + } + + pch++; + } + } +} + +void UnityPrintF(const UNITY_LINE_TYPE line, const char* format, ...) +{ + UnityTestResultsBegin(Unity.TestFile, line); + UnityPrint("INFO"); + if(format != NULL) + { + UnityPrint(": "); + va_list va; + va_start(va, format); + UnityPrintFVA(format, va); + va_end(va); + } + UNITY_PRINT_EOL(); +} +#endif /* ! UNITY_INCLUDE_PRINT_FORMATTED */ + + +/*----------------------------------------------- + * Control Functions + *-----------------------------------------------*/ + +/*-----------------------------------------------*/ +void UnityFail(const char* msg, const UNITY_LINE_TYPE line) +{ + RETURN_IF_FAIL_OR_IGNORE; + + UnityTestResultsBegin(Unity.TestFile, line); + UnityPrint(UnityStrFail); + if (msg != NULL) + { + UNITY_OUTPUT_CHAR(':'); + +#ifdef UNITY_PRINT_TEST_CONTEXT + UNITY_PRINT_TEST_CONTEXT(); +#endif +#ifndef UNITY_EXCLUDE_DETAILS + if (Unity.CurrentDetail1) + { + UnityPrint(UnityStrDetail1Name); + UnityPrint(Unity.CurrentDetail1); + if (Unity.CurrentDetail2) + { + UnityPrint(UnityStrDetail2Name); + UnityPrint(Unity.CurrentDetail2); + } + UnityPrint(UnityStrSpacer); + } +#endif + if (msg[0] != ' ') + { + UNITY_OUTPUT_CHAR(' '); + } + UnityPrint(msg); + } + + UNITY_FAIL_AND_BAIL; +} + +/*-----------------------------------------------*/ +void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line) +{ + RETURN_IF_FAIL_OR_IGNORE; + + UnityTestResultsBegin(Unity.TestFile, line); + UnityPrint(UnityStrIgnore); + if (msg != NULL) + { + UNITY_OUTPUT_CHAR(':'); + UNITY_OUTPUT_CHAR(' '); + UnityPrint(msg); + } + UNITY_IGNORE_AND_BAIL; +} + +/*-----------------------------------------------*/ +void UnityMessage(const char* msg, const UNITY_LINE_TYPE line) +{ + UnityTestResultsBegin(Unity.TestFile, line); + UnityPrint("INFO"); + if (msg != NULL) + { + UNITY_OUTPUT_CHAR(':'); + UNITY_OUTPUT_CHAR(' '); + UnityPrint(msg); + } + UNITY_PRINT_EOL(); +} + +/*-----------------------------------------------*/ +/* If we have not defined our own test runner, then include our default test runner to make life easier */ +#ifndef UNITY_SKIP_DEFAULT_RUNNER +void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum) +{ + Unity.CurrentTestName = FuncName; + Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)FuncLineNum; + Unity.NumberOfTests++; + UNITY_CLR_DETAILS(); + UNITY_EXEC_TIME_START(); + if (TEST_PROTECT()) + { + setUp(); + Func(); + } + if (TEST_PROTECT()) + { + tearDown(); + } + UNITY_EXEC_TIME_STOP(); + UnityConcludeTest(); +} +#endif + +/*-----------------------------------------------*/ +void UnitySetTestFile(const char* filename) +{ + Unity.TestFile = filename; +} + +/*-----------------------------------------------*/ +void UnityBegin(const char* filename) +{ + Unity.TestFile = filename; + Unity.CurrentTestName = NULL; + Unity.CurrentTestLineNumber = 0; + Unity.NumberOfTests = 0; + Unity.TestFailures = 0; + Unity.TestIgnores = 0; + Unity.CurrentTestFailed = 0; + Unity.CurrentTestIgnored = 0; + + UNITY_CLR_DETAILS(); + UNITY_OUTPUT_START(); +} + +/*-----------------------------------------------*/ +int UnityEnd(void) +{ + UNITY_PRINT_EOL(); + UnityPrint(UnityStrBreaker); + UNITY_PRINT_EOL(); + UnityPrintNumber((UNITY_INT)(Unity.NumberOfTests)); + UnityPrint(UnityStrResultsTests); + UnityPrintNumber((UNITY_INT)(Unity.TestFailures)); + UnityPrint(UnityStrResultsFailures); + UnityPrintNumber((UNITY_INT)(Unity.TestIgnores)); + UnityPrint(UnityStrResultsIgnored); + UNITY_PRINT_EOL(); + if (Unity.TestFailures == 0U) + { + UnityPrint(UnityStrOk); + } + else + { + UnityPrint(UnityStrFail); +#ifdef UNITY_DIFFERENTIATE_FINAL_FAIL + UNITY_OUTPUT_CHAR('E'); UNITY_OUTPUT_CHAR('D'); +#endif + } + UNITY_PRINT_EOL(); + UNITY_FLUSH_CALL(); + UNITY_OUTPUT_COMPLETE(); + return (int)(Unity.TestFailures); +} + +/*----------------------------------------------- + * Command Line Argument Support + *-----------------------------------------------*/ +#ifdef UNITY_USE_COMMAND_LINE_ARGS + +char* UnityOptionIncludeNamed = NULL; +char* UnityOptionExcludeNamed = NULL; +int UnityVerbosity = 1; + +/*-----------------------------------------------*/ +int UnityParseOptions(int argc, char** argv) +{ + int i; + UnityOptionIncludeNamed = NULL; + UnityOptionExcludeNamed = NULL; + + for (i = 1; i < argc; i++) + { + if (argv[i][0] == '-') + { + switch (argv[i][1]) + { + case 'l': /* list tests */ + return -1; + case 'n': /* include tests with name including this string */ + case 'f': /* an alias for -n */ + if (argv[i][2] == '=') + { + UnityOptionIncludeNamed = &argv[i][3]; + } + else if (++i < argc) + { + UnityOptionIncludeNamed = argv[i]; + } + else + { + UnityPrint("ERROR: No Test String to Include Matches For"); + UNITY_PRINT_EOL(); + return 1; + } + break; + case 'q': /* quiet */ + UnityVerbosity = 0; + break; + case 'v': /* verbose */ + UnityVerbosity = 2; + break; + case 'x': /* exclude tests with name including this string */ + if (argv[i][2] == '=') + { + UnityOptionExcludeNamed = &argv[i][3]; + } + else if (++i < argc) + { + UnityOptionExcludeNamed = argv[i]; + } + else + { + UnityPrint("ERROR: No Test String to Exclude Matches For"); + UNITY_PRINT_EOL(); + return 1; + } + break; + default: + UnityPrint("ERROR: Unknown Option "); + UNITY_OUTPUT_CHAR(argv[i][1]); + UNITY_PRINT_EOL(); + return 1; + } + } + } + + return 0; +} + +/*-----------------------------------------------*/ +int IsStringInBiggerString(const char* longstring, const char* shortstring) +{ + const char* lptr = longstring; + const char* sptr = shortstring; + const char* lnext = lptr; + + if (*sptr == '*') + { + return 1; + } + + while (*lptr) + { + lnext = lptr + 1; + + /* If they current bytes match, go on to the next bytes */ + while (*lptr && *sptr && (*lptr == *sptr)) + { + lptr++; + sptr++; + + /* We're done if we match the entire string or up to a wildcard */ + if (*sptr == '*') + return 1; + if (*sptr == ',') + return 1; + if (*sptr == '"') + return 1; + if (*sptr == '\'') + return 1; + if (*sptr == ':') + return 2; + if (*sptr == 0) + return 1; + } + + /* Otherwise we start in the long pointer 1 character further and try again */ + lptr = lnext; + sptr = shortstring; + } + + return 0; +} + +/*-----------------------------------------------*/ +int UnityStringArgumentMatches(const char* str) +{ + int retval; + const char* ptr1; + const char* ptr2; + const char* ptrf; + + /* Go through the options and get the substrings for matching one at a time */ + ptr1 = str; + while (ptr1[0] != 0) + { + if ((ptr1[0] == '"') || (ptr1[0] == '\'')) + { + ptr1++; + } + + /* look for the start of the next partial */ + ptr2 = ptr1; + ptrf = 0; + do + { + ptr2++; + if ((ptr2[0] == ':') && (ptr2[1] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ',')) + { + ptrf = &ptr2[1]; + } + } while ((ptr2[0] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ',')); + + while ((ptr2[0] != 0) && ((ptr2[0] == ':') || (ptr2[0] == '\'') || (ptr2[0] == '"') || (ptr2[0] == ','))) + { + ptr2++; + } + + /* done if complete filename match */ + retval = IsStringInBiggerString(Unity.TestFile, ptr1); + if (retval == 1) + { + return retval; + } + + /* done if testname match after filename partial match */ + if ((retval == 2) && (ptrf != 0)) + { + if (IsStringInBiggerString(Unity.CurrentTestName, ptrf)) + { + return 1; + } + } + + /* done if complete testname match */ + if (IsStringInBiggerString(Unity.CurrentTestName, ptr1) == 1) + { + return 1; + } + + ptr1 = ptr2; + } + + /* we couldn't find a match for any substrings */ + return 0; +} + +/*-----------------------------------------------*/ +int UnityTestMatches(void) +{ + /* Check if this test name matches the included test pattern */ + int retval; + if (UnityOptionIncludeNamed) + { + retval = UnityStringArgumentMatches(UnityOptionIncludeNamed); + } + else + { + retval = 1; + } + + /* Check if this test name matches the excluded test pattern */ + if (UnityOptionExcludeNamed) + { + if (UnityStringArgumentMatches(UnityOptionExcludeNamed)) + { + retval = 0; + } + } + + return retval; +} + +#endif /* UNITY_USE_COMMAND_LINE_ARGS */ +/*-----------------------------------------------*/ diff --git a/TSM_PicoW_Sensor/McuLib/unity/unity.h b/TSM_PicoW_Sensor/McuLib/unity/unity.h new file mode 100644 index 0000000..2785c72 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/unity/unity.h @@ -0,0 +1,697 @@ +/* ========================================== + Unity Project - A Test Framework for C + Copyright (c) 2007-21 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +========================================== */ + +#ifndef UNITY_FRAMEWORK_H +#define UNITY_FRAMEWORK_H +#define UNITY + +#define UNITY_VERSION_MAJOR 2 +#define UNITY_VERSION_MINOR 5 +#define UNITY_VERSION_BUILD 4 +#define UNITY_VERSION ((UNITY_VERSION_MAJOR << 16) | (UNITY_VERSION_MINOR << 8) | UNITY_VERSION_BUILD) + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "unity_internals.h" + +/*------------------------------------------------------- + * Test Setup / Teardown + *-------------------------------------------------------*/ + +/* These functions are intended to be called before and after each test. + * If using unity directly, these will need to be provided for each test + * executable built. If you are using the test runner generator and/or + * Ceedling, these are optional. */ +void setUp(void); +void tearDown(void); + +/* These functions are intended to be called at the beginning and end of an + * entire test suite. suiteTearDown() is passed the number of tests that + * failed, and its return value becomes the exit code of main(). If using + * Unity directly, you're in charge of calling these if they are desired. + * If using Ceedling or the test runner generator, these will be called + * automatically if they exist. */ +void suiteSetUp(void); +int suiteTearDown(int num_failures); + +/*------------------------------------------------------- + * Test Reset and Verify + *-------------------------------------------------------*/ + +/* These functions are intended to be called before during tests in order + * to support complex test loops, etc. Both are NOT built into Unity. Instead + * the test runner generator will create them. resetTest will run teardown and + * setup again, verifying any end-of-test needs between. verifyTest will only + * run the verification. */ +void resetTest(void); +void verifyTest(void); + +/*------------------------------------------------------- + * Configuration Options + *------------------------------------------------------- + * All options described below should be passed as a compiler flag to all files using Unity. If you must add #defines, place them BEFORE the #include above. + + * Integers/longs/pointers + * - Unity attempts to automatically discover your integer sizes + * - define UNITY_EXCLUDE_STDINT_H to stop attempting to look in + * - define UNITY_EXCLUDE_LIMITS_H to stop attempting to look in + * - If you cannot use the automatic methods above, you can force Unity by using these options: + * - define UNITY_SUPPORT_64 + * - set UNITY_INT_WIDTH + * - set UNITY_LONG_WIDTH + * - set UNITY_POINTER_WIDTH + + * Floats + * - define UNITY_EXCLUDE_FLOAT to disallow floating point comparisons + * - define UNITY_FLOAT_PRECISION to specify the precision to use when doing TEST_ASSERT_EQUAL_FLOAT + * - define UNITY_FLOAT_TYPE to specify doubles instead of single precision floats + * - define UNITY_INCLUDE_DOUBLE to allow double floating point comparisons + * - define UNITY_EXCLUDE_DOUBLE to disallow double floating point comparisons (default) + * - define UNITY_DOUBLE_PRECISION to specify the precision to use when doing TEST_ASSERT_EQUAL_DOUBLE + * - define UNITY_DOUBLE_TYPE to specify something other than double + * - define UNITY_EXCLUDE_FLOAT_PRINT to trim binary size, won't print floating point values in errors + + * Output + * - by default, Unity prints to standard out with putchar. define UNITY_OUTPUT_CHAR(a) with a different function if desired + * - define UNITY_DIFFERENTIATE_FINAL_FAIL to print FAILED (vs. FAIL) at test end summary - for automated search for failure + + * Optimization + * - by default, line numbers are stored in unsigned shorts. Define UNITY_LINE_TYPE with a different type if your files are huge + * - by default, test and failure counters are unsigned shorts. Define UNITY_COUNTER_TYPE with a different type if you want to save space or have more than 65535 Tests. + + * Test Cases + * - define UNITY_SUPPORT_TEST_CASES to include the TEST_CASE macro, though really it's mostly about the runner generator script + + * Parameterized Tests + * - you'll want to create a define of TEST_CASE(...), TEST_RANGE(...) and/or TEST_MATRIX(...) which basically evaluates to nothing + + * Tests with Arguments + * - you'll want to define UNITY_USE_COMMAND_LINE_ARGS if you have the test runner passing arguments to Unity + + *------------------------------------------------------- + * Basic Fail and Ignore + *-------------------------------------------------------*/ + +#define TEST_FAIL_MESSAGE(message) UNITY_TEST_FAIL(__LINE__, (message)) +#define TEST_FAIL() UNITY_TEST_FAIL(__LINE__, NULL) +#define TEST_IGNORE_MESSAGE(message) UNITY_TEST_IGNORE(__LINE__, (message)) +#define TEST_IGNORE() UNITY_TEST_IGNORE(__LINE__, NULL) +#define TEST_MESSAGE(message) UnityMessage((message), __LINE__) +#define TEST_ONLY() +#ifdef UNITY_INCLUDE_PRINT_FORMATTED +#define TEST_PRINTF(message, ...) UnityPrintF(__LINE__, (message), ##__VA_ARGS__) +#endif + +/* It is not necessary for you to call PASS. A PASS condition is assumed if nothing fails. + * This method allows you to abort a test immediately with a PASS state, ignoring the remainder of the test. */ +#define TEST_PASS() TEST_ABORT() +#define TEST_PASS_MESSAGE(message) do { UnityMessage((message), __LINE__); TEST_ABORT(); } while (0) + +/*------------------------------------------------------- + * Build Directives + *------------------------------------------------------- + + * These macros do nothing, but they are useful for additional build context. + * Tools (like Ceedling) can scan for these directives and make use of them for + * per-test-executable #include search paths and linking. */ + +/* Add source files to a test executable's compilation and linking. Ex: TEST_SOURCE_FILE("sandwiches.c") */ +#define TEST_SOURCE_FILE(a) + +/* Customize #include search paths for a test executable's compilation. Ex: TEST_INCLUDE_PATH("src/module_a/inc") */ +#define TEST_INCLUDE_PATH(a) + +/*------------------------------------------------------- + * Test Asserts (simple) + *-------------------------------------------------------*/ + +/* Boolean */ +#define TEST_ASSERT(condition) UNITY_TEST_ASSERT( (condition), __LINE__, " Expression Evaluated To FALSE") +#define TEST_ASSERT_TRUE(condition) UNITY_TEST_ASSERT( (condition), __LINE__, " Expected TRUE Was FALSE") +#define TEST_ASSERT_UNLESS(condition) UNITY_TEST_ASSERT( !(condition), __LINE__, " Expression Evaluated To TRUE") +#define TEST_ASSERT_FALSE(condition) UNITY_TEST_ASSERT( !(condition), __LINE__, " Expected FALSE Was TRUE") +#define TEST_ASSERT_NULL(pointer) UNITY_TEST_ASSERT_NULL( (pointer), __LINE__, " Expected NULL") +#define TEST_ASSERT_NOT_NULL(pointer) UNITY_TEST_ASSERT_NOT_NULL((pointer), __LINE__, " Expected Non-NULL") +#define TEST_ASSERT_EMPTY(pointer) UNITY_TEST_ASSERT_EMPTY( (pointer), __LINE__, " Expected Empty") +#define TEST_ASSERT_NOT_EMPTY(pointer) UNITY_TEST_ASSERT_NOT_EMPTY((pointer), __LINE__, " Expected Non-Empty") + +/* Integers (of all sizes) */ +#define TEST_ASSERT_EQUAL_INT(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT8(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT8((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT16(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT16((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT32(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT32((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT64(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT64((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT8(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT8( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT16(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT16( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT32(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT32( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT64(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT64( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_size_t(expected, actual) UNITY_TEST_ASSERT_EQUAL_UINT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX8(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX8( (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX16(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX16((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX32(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX64(expected, actual) UNITY_TEST_ASSERT_EQUAL_HEX64((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_CHAR(expected, actual) UNITY_TEST_ASSERT_EQUAL_CHAR((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_BITS(mask, expected, actual) UNITY_TEST_ASSERT_BITS((mask), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_BITS_HIGH(mask, actual) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT)(-1), (actual), __LINE__, NULL) +#define TEST_ASSERT_BITS_LOW(mask, actual) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT)(0), (actual), __LINE__, NULL) +#define TEST_ASSERT_BIT_HIGH(bit, actual) UNITY_TEST_ASSERT_BITS(((UNITY_UINT)1 << (bit)), (UNITY_UINT)(-1), (actual), __LINE__, NULL) +#define TEST_ASSERT_BIT_LOW(bit, actual) UNITY_TEST_ASSERT_BITS(((UNITY_UINT)1 << (bit)), (UNITY_UINT)(0), (actual), __LINE__, NULL) + +/* Integer Not Equal To (of all sizes) */ +#define TEST_ASSERT_NOT_EQUAL_INT(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_INT8(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_INT16(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_INT32(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_INT64(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_INT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_UINT(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_UINT8(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_UINT16(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_UINT32(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_UINT64(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_size_t(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_HEX8(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_HEX8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_HEX16(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_HEX16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_HEX32(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_HEX32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_HEX64(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_HEX64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_CHAR(threshold, actual) UNITY_TEST_ASSERT_NOT_EQUAL_CHAR((threshold), (actual), __LINE__, NULL) + +/* Integer Greater Than/ Less Than (of all sizes) */ +#define TEST_ASSERT_GREATER_THAN(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_INT(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_INT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_INT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_INT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_INT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_INT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_UINT(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_UINT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_UINT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_UINT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_UINT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_size_t(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_HEX8(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_HEX16(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_HEX32(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_HEX64(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_HEX64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_CHAR(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_CHAR((threshold), (actual), __LINE__, NULL) + +#define TEST_ASSERT_LESS_THAN(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_INT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_INT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_INT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_INT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_INT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_INT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_UINT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_UINT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_UINT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_UINT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_UINT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_size_t(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_HEX8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_HEX16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_HEX32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_HEX64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_CHAR(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_CHAR((threshold), (actual), __LINE__, NULL) + +#define TEST_ASSERT_GREATER_OR_EQUAL(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT8(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT16(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT32(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT64(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_size_t(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX8(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX16(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX32(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX64(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_CHAR(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_CHAR((threshold), (actual), __LINE__, NULL) + +#define TEST_ASSERT_LESS_OR_EQUAL(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_INT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_INT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_INT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_INT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_INT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_size_t(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX16(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX32(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_CHAR(threshold, actual) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_CHAR((threshold), (actual), __LINE__, NULL) + +/* Integer Ranges (of all sizes) */ +#define TEST_ASSERT_INT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_INT8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT8_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_INT16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT16_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_INT32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT32_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_INT64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_INT64_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT8_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT16_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT32_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_UINT64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT64_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_size_t_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX8_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX8_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX16_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX16_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX32_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_HEX64_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_HEX64_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_CHAR_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_CHAR_WITHIN((delta), (expected), (actual), __LINE__, NULL) + +/* Integer Array Ranges (of all sizes) */ +#define TEST_ASSERT_INT_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_INT8_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_INT16_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_INT32_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_INT64_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_INT64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_UINT_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_UINT8_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_UINT16_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_UINT32_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_UINT64_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_size_t_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_HEX_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_HEX8_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_HEX16_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_HEX32_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_HEX64_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_HEX64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) +#define TEST_ASSERT_CHAR_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_CHAR_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, NULL) + + +/* Structs and Strings */ +#define TEST_ASSERT_EQUAL_PTR(expected, actual) UNITY_TEST_ASSERT_EQUAL_PTR((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_STRING(expected, actual) UNITY_TEST_ASSERT_EQUAL_STRING((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len) UNITY_TEST_ASSERT_EQUAL_STRING_LEN((expected), (actual), (len), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_MEMORY(expected, actual, len) UNITY_TEST_ASSERT_EQUAL_MEMORY((expected), (actual), (len), __LINE__, NULL) + +/* Arrays */ +#define TEST_ASSERT_EQUAL_INT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_size_t_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX16_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX32_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_PTR_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements) UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((expected), (actual), (len), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_CHAR_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_CHAR_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) + +/* Arrays Compared To Single Value */ +#define TEST_ASSERT_EACH_EQUAL_INT(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_INT8(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT8((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_INT16(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT16((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_INT32(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT32((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_INT64(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_INT64((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT8(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT8((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT16(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT16((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT32(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT32((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_UINT64(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT64((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_size_t(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX8(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX8((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX16(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX16((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX32(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_HEX64(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_HEX64((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_PTR((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_STRING(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_STRING((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY((expected), (actual), (len), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_CHAR(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_CHAR((expected), (actual), (num_elements), __LINE__, NULL) + +/* Floating Point (If Enabled) */ +#define TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_NOT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_FLOAT_NOT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_FLOAT(expected, actual) UNITY_TEST_ASSERT_EQUAL_FLOAT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_FLOAT(expected, actual) UNITY_TEST_ASSERT_NOT_EQUAL_FLOAT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_FLOAT_ARRAY_WITHIN((delta), (expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_FLOAT(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_FLOAT(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_FLOAT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_FLOAT(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_FLOAT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_FLOAT(threshold, actual) UNITY_TEST_ASSERT_LESS_THAN_FLOAT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_FLOAT(threshold, actual) UNITY_TEST_ASSERT_LESS_OR_EQUAL_FLOAT((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NEG_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NAN(actual) UNITY_TEST_ASSERT_FLOAT_IS_NAN((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_DETERMINATE(actual) UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NOT_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NOT_NAN(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN((actual), __LINE__, NULL) +#define TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual) UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE((actual), __LINE__, NULL) + +/* Double (If Enabled) */ +#define TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_DOUBLE_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_NOT_WITHIN(delta, expected, actual) UNITY_TEST_ASSERT_DOUBLE_NOT_WITHIN((delta), (expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_DOUBLE(expected, actual) UNITY_TEST_ASSERT_EQUAL_DOUBLE((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL_DOUBLE(expected, actual) UNITY_TEST_ASSERT_NOT_EQUAL_DOUBLE((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_ARRAY_WITHIN(delta, expected, actual, num_elements) UNITY_TEST_ASSERT_DOUBLE_ARRAY_WITHIN((delta), (expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements) UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_EACH_EQUAL_DOUBLE(expected, actual, num_elements) UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE((expected), (actual), (num_elements), __LINE__, NULL) +#define TEST_ASSERT_GREATER_THAN_DOUBLE(threshold, actual) UNITY_TEST_ASSERT_GREATER_THAN_DOUBLE((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE(threshold, actual) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_THAN_DOUBLE(threshold, actual) UNITY_TEST_ASSERT_LESS_THAN_DOUBLE((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_LESS_OR_EQUAL_DOUBLE(threshold, actual) UNITY_TEST_ASSERT_LESS_OR_EQUAL_DOUBLE((threshold), (actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NEG_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NAN(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NAN((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual) UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NOT_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN((actual), __LINE__, NULL) +#define TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE((actual), __LINE__, NULL) + +/* Shorthand */ +#ifdef UNITY_SHORTHAND_AS_OLD +#define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, " Expected Not-Equal") +#endif +#ifdef UNITY_SHORTHAND_AS_INT +#define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#endif +#ifdef UNITY_SHORTHAND_AS_MEM +#define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_ASSERT_EQUAL_MEMORY((&expected), (&actual), sizeof(expected), __LINE__, NULL) +#define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#endif +#ifdef UNITY_SHORTHAND_AS_RAW +#define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_ASSERT(((expected) == (actual)), __LINE__, " Expected Equal") +#define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, " Expected Not-Equal") +#endif +#ifdef UNITY_SHORTHAND_AS_NONE +#define TEST_ASSERT_EQUAL(expected, actual) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#define TEST_ASSERT_NOT_EQUAL(expected, actual) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#endif + +/*------------------------------------------------------- + * Test Asserts (with additional messages) + *-------------------------------------------------------*/ + +/* Boolean */ +#define TEST_ASSERT_MESSAGE(condition, message) UNITY_TEST_ASSERT( (condition), __LINE__, (message)) +#define TEST_ASSERT_TRUE_MESSAGE(condition, message) UNITY_TEST_ASSERT( (condition), __LINE__, (message)) +#define TEST_ASSERT_UNLESS_MESSAGE(condition, message) UNITY_TEST_ASSERT( !(condition), __LINE__, (message)) +#define TEST_ASSERT_FALSE_MESSAGE(condition, message) UNITY_TEST_ASSERT( !(condition), __LINE__, (message)) +#define TEST_ASSERT_NULL_MESSAGE(pointer, message) UNITY_TEST_ASSERT_NULL( (pointer), __LINE__, (message)) +#define TEST_ASSERT_NOT_NULL_MESSAGE(pointer, message) UNITY_TEST_ASSERT_NOT_NULL((pointer), __LINE__, (message)) +#define TEST_ASSERT_EMPTY_MESSAGE(pointer, message) UNITY_TEST_ASSERT_EMPTY( (pointer), __LINE__, (message)) +#define TEST_ASSERT_NOT_EMPTY_MESSAGE(pointer, message) UNITY_TEST_ASSERT_NOT_EMPTY((pointer), __LINE__, (message)) + +/* Integers (of all sizes) */ +#define TEST_ASSERT_EQUAL_INT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT8((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT16((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT32((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT64((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT8( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT16( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT32( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT64( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_size_t_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_UINT( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX8_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX8( (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX16_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX16((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX32_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX32((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX64_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_HEX64((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_BITS_MESSAGE(mask, expected, actual, message) UNITY_TEST_ASSERT_BITS((mask), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_BITS_HIGH_MESSAGE(mask, actual, message) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT32)(-1), (actual), __LINE__, (message)) +#define TEST_ASSERT_BITS_LOW_MESSAGE(mask, actual, message) UNITY_TEST_ASSERT_BITS((mask), (UNITY_UINT32)(0), (actual), __LINE__, (message)) +#define TEST_ASSERT_BIT_HIGH_MESSAGE(bit, actual, message) UNITY_TEST_ASSERT_BITS(((UNITY_UINT32)1 << (bit)), (UNITY_UINT32)(-1), (actual), __LINE__, (message)) +#define TEST_ASSERT_BIT_LOW_MESSAGE(bit, actual, message) UNITY_TEST_ASSERT_BITS(((UNITY_UINT32)1 << (bit)), (UNITY_UINT32)(0), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_CHAR_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_CHAR((expected), (actual), __LINE__, (message)) + +/* Integer Not Equal To (of all sizes) */ +#define TEST_ASSERT_NOT_EQUAL_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_INT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_HEX8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_HEX16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_HEX32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_HEX64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_CHAR((threshold), (actual), __LINE__, (message)) + + +/* Integer Greater Than/ Less Than (of all sizes) */ +#define TEST_ASSERT_GREATER_THAN_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_INT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_HEX64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_CHAR((threshold), (actual), __LINE__, (message)) + +#define TEST_ASSERT_LESS_THAN_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_INT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_HEX64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_THAN_CHAR((threshold), (actual), __LINE__, (message)) + +#define TEST_ASSERT_GREATER_OR_EQUAL_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_CHAR((threshold), (actual), __LINE__, (message)) + +#define TEST_ASSERT_LESS_OR_EQUAL_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_INT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_INT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_INT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_INT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_INT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_UINT64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_size_t_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX8_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX8((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX16_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX16((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX32_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX32((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_HEX64_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_CHAR_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_CHAR((threshold), (actual), __LINE__, (message)) + +/* Integer Ranges (of all sizes) */ +#define TEST_ASSERT_INT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_INT8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT8_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_INT16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT16_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_INT32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT32_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_INT64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_INT64_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT8_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT16_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT32_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_UINT64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT64_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_size_t_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_UINT_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX8_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX8_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX16_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX16_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX32_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX32_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_HEX64_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_HEX64_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_CHAR_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_CHAR_WITHIN((delta), (expected), (actual), __LINE__, (message)) + +/* Integer Array Ranges (of all sizes) */ +#define TEST_ASSERT_INT_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_INT8_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_INT16_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_INT32_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_INT64_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_INT64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_UINT_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_UINT8_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_UINT16_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_UINT32_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_UINT64_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_size_t_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_HEX_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_HEX8_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX8_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_HEX16_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX16_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_HEX32_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_HEX64_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_HEX64_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) +#define TEST_ASSERT_CHAR_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_CHAR_ARRAY_WITHIN((delta), (expected), (actual), num_elements, __LINE__, (message)) + + +/* Structs and Strings */ +#define TEST_ASSERT_EQUAL_PTR_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_PTR((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_STRING((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_STRING_LEN_MESSAGE(expected, actual, len, message) UNITY_TEST_ASSERT_EQUAL_STRING_LEN((expected), (actual), (len), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_MEMORY_MESSAGE(expected, actual, len, message) UNITY_TEST_ASSERT_EQUAL_MEMORY((expected), (actual), (len), __LINE__, (message)) + +/* Arrays */ +#define TEST_ASSERT_EQUAL_INT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_INT64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_UINT64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_size_t_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX8_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX16_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX32_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_HEX64_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_PTR_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_STRING_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_MEMORY_ARRAY_MESSAGE(expected, actual, len, num_elements, message) UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY((expected), (actual), (len), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_CHAR_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_CHAR_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) + +/* Arrays Compared To Single Value*/ +#define TEST_ASSERT_EACH_EQUAL_INT_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_INT8_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT8((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_INT16_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT16((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_INT32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT32((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_INT64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_INT64((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT8_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT8((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT16_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT16((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT32((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_UINT64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT64((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_size_t_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_UINT((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX8_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX8((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX16_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX16((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX32_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX32((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_HEX64_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_HEX64((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_PTR_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_PTR((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_STRING_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_STRING((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_MEMORY_MESSAGE(expected, actual, len, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY((expected), (actual), (len), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_CHAR_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_CHAR((expected), (actual), (num_elements), __LINE__, (message)) + +/* Floating Point (If Enabled) */ +#define TEST_ASSERT_FLOAT_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_FLOAT_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_FLOAT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_FLOAT((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_FLOAT_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_FLOAT((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_FLOAT_ARRAY_WITHIN((delta), (expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_FLOAT_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_FLOAT_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_FLOAT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_FLOAT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_FLOAT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_FLOAT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_FLOAT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_LESS_THAN_FLOAT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_FLOAT_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_LESS_OR_EQUAL_FLOAT((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NAN((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NOT_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NOT_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NOT_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN((actual), __LINE__, (message)) +#define TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE((actual), __LINE__, (message)) + +/* Double (If Enabled) */ +#define TEST_ASSERT_DOUBLE_WITHIN_MESSAGE(delta, expected, actual, message) UNITY_TEST_ASSERT_DOUBLE_WITHIN((delta), (expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_DOUBLE_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_DOUBLE((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_DOUBLE_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_NOT_EQUAL_DOUBLE((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_ARRAY_WITHIN_MESSAGE(delta, expected, actual, num_elements, message) UNITY_TEST_ASSERT_DOUBLE_ARRAY_WITHIN((delta), (expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EQUAL_DOUBLE_ARRAY_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_EACH_EQUAL_DOUBLE_MESSAGE(expected, actual, num_elements, message) UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE((expected), (actual), (num_elements), __LINE__, (message)) +#define TEST_ASSERT_GREATER_THAN_DOUBLE_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_THAN_DOUBLE((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_THAN_DOUBLE_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_LESS_THAN_DOUBLE((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_LESS_OR_EQUAL_DOUBLE_MESSAGE(threshold, actual, message) UNITY_TEST_ASSERT_LESS_OR_EQUAL_DOUBLE((threshold), (actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NAN((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NOT_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NOT_NAN_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN((actual), __LINE__, (message)) +#define TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE_MESSAGE(actual, message) UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE((actual), __LINE__, (message)) + +/* Shorthand */ +#ifdef UNITY_SHORTHAND_AS_OLD +#define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, (message)) +#define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, (message)) +#endif +#ifdef UNITY_SHORTHAND_AS_INT +#define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_INT((expected), (actual), __LINE__, message) +#define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#endif +#ifdef UNITY_SHORTHAND_AS_MEM +#define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT_EQUAL_MEMORY((&expected), (&actual), sizeof(expected), __LINE__, message) +#define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#endif +#ifdef UNITY_SHORTHAND_AS_RAW +#define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT(((expected) == (actual)), __LINE__, message) +#define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_ASSERT(((expected) != (actual)), __LINE__, message) +#endif +#ifdef UNITY_SHORTHAND_AS_NONE +#define TEST_ASSERT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#define TEST_ASSERT_NOT_EQUAL_MESSAGE(expected, actual, message) UNITY_TEST_FAIL(__LINE__, UnityStrErrShorthand) +#endif + +/* end of UNITY_FRAMEWORK_H */ +#ifdef __cplusplus +} +#endif +#endif diff --git a/TSM_PicoW_Sensor/McuLib/unity/unity_config.h b/TSM_PicoW_Sensor/McuLib/unity/unity_config.h new file mode 100644 index 0000000..fc6cdb0 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/unity/unity_config.h @@ -0,0 +1,244 @@ +/* Unity Configuration + * As of May 11th, 2016 at ThrowTheSwitch/Unity commit 837c529 + * Update: December 29th, 2016 + * See Also: Unity/docs/UnityConfigurationGuide.pdf + * + * Unity is designed to run on almost anything that is targeted by a C compiler. + * It would be awesome if this could be done with zero configuration. While + * there are some targets that come close to this dream, it is sadly not + * universal. It is likely that you are going to need at least a couple of the + * configuration options described in this document. + * + * All of Unity's configuration options are `#defines`. Most of these are simple + * definitions. A couple are macros with arguments. They live inside the + * unity_internals.h header file. We don't necessarily recommend opening that + * file unless you really need to. That file is proof that a cross-platform + * library is challenging to build. From a more positive perspective, it is also + * proof that a great deal of complexity can be centralized primarily to one + * place in order to provide a more consistent and simple experience elsewhere. + * + * Using These Options + * It doesn't matter if you're using a target-specific compiler and a simulator + * or a native compiler. In either case, you've got a couple choices for + * configuring these options: + * + * 1. Because these options are specified via C defines, you can pass most of + * these options to your compiler through command line compiler flags. Even + * if you're using an embedded target that forces you to use their + * overbearing IDE for all configuration, there will be a place somewhere in + * your project to configure defines for your compiler. + * 2. You can create a custom `unity_config.h` configuration file (present in + * your toolchain's search paths). In this file, you will list definitions + * and macros specific to your target. All you must do is define + * `UNITY_INCLUDE_CONFIG_H` and Unity will rely on `unity_config.h` for any + * further definitions it may need. + */ + +#ifndef UNITY_CONFIG_H +#define UNITY_CONFIG_H + +/* ************************* AUTOMATIC INTEGER TYPES *************************** + * C's concept of an integer varies from target to target. The C Standard has + * rules about the `int` matching the register size of the target + * microprocessor. It has rules about the `int` and how its size relates to + * other integer types. An `int` on one target might be 16 bits while on another + * target it might be 64. There are more specific types in compilers compliant + * with C99 or later, but that's certainly not every compiler you are likely to + * encounter. Therefore, Unity has a number of features for helping to adjust + * itself to match your required integer sizes. It starts off by trying to do it + * automatically. + **************************************************************************** */ + +/* The first attempt to guess your types is to check `limits.h`. Some compilers + * that don't support `stdint.h` could include `limits.h`. If you don't + * want Unity to check this file, define this to make it skip the inclusion. + * Unity looks at UINT_MAX & ULONG_MAX, which were available since C89. + */ +/* #define UNITY_EXCLUDE_LIMITS_H */ + +/* The second thing that Unity does to guess your types is check `stdint.h`. + * This file defines `UINTPTR_MAX`, since C99, that Unity can make use of to + * learn about your system. It's possible you don't want it to do this or it's + * possible that your system doesn't support `stdint.h`. If that's the case, + * you're going to want to define this. That way, Unity will know to skip the + * inclusion of this file and you won't be left with a compiler error. + */ +/* #define UNITY_EXCLUDE_STDINT_H */ + +/* ********************** MANUAL INTEGER TYPE DEFINITION *********************** + * If you've disabled all of the automatic options above, you're going to have + * to do the configuration yourself. There are just a handful of defines that + * you are going to specify if you don't like the defaults. + **************************************************************************** */ + + /* Define this to be the number of bits an `int` takes up on your system. The + * default, if not auto-detected, is 32 bits. + * + * Example: + */ +/* #define UNITY_INT_WIDTH 16 */ + +/* Define this to be the number of bits a `long` takes up on your system. The + * default, if not autodetected, is 32 bits. This is used to figure out what + * kind of 64-bit support your system can handle. Does it need to specify a + * `long` or a `long long` to get a 64-bit value. On 16-bit systems, this option + * is going to be ignored. + * + * Example: + */ +/* #define UNITY_LONG_WIDTH 16 */ + +/* Define this to be the number of bits a pointer takes up on your system. The + * default, if not autodetected, is 32-bits. If you're getting ugly compiler + * warnings about casting from pointers, this is the one to look at. + * + * Example: + */ +/* #define UNITY_POINTER_WIDTH 64 */ + +/* Unity will automatically include 64-bit support if it auto-detects it, or if + * your `int`, `long`, or pointer widths are greater than 32-bits. Define this + * to enable 64-bit support if none of the other options already did it for you. + * There can be a significant size and speed impact to enabling 64-bit support + * on small targets, so don't define it if you don't need it. + */ +/* #define UNITY_INCLUDE_64 */ + + +/* *************************** FLOATING POINT TYPES **************************** + * In the embedded world, it's not uncommon for targets to have no support for + * floating point operations at all or to have support that is limited to only + * single precision. We are able to guess integer sizes on the fly because + * integers are always available in at least one size. Floating point, on the + * other hand, is sometimes not available at all. Trying to include `float.h` on + * these platforms would result in an error. This leaves manual configuration as + * the only option. + **************************************************************************** */ + + /* By default, Unity guesses that you will want single precision floating point + * support, but not double precision. It's easy to change either of these using + * the include and exclude options here. You may include neither, just float, + * or both, as suits your needs. + */ +/* #define UNITY_EXCLUDE_FLOAT */ +/* #define UNITY_INCLUDE_DOUBLE */ +/* #define UNITY_EXCLUDE_DOUBLE */ + +/* For features that are enabled, the following floating point options also + * become available. + */ + +/* Unity aims for as small of a footprint as possible and avoids most standard + * library calls (some embedded platforms don't have a standard library!). + * Because of this, its routines for printing integer values are minimalist and + * hand-coded. To keep Unity universal, though, we eventually chose to develop + * our own floating point print routines. Still, the display of floating point + * values during a failure are optional. By default, Unity will print the + * actual results of floating point assertion failures. So a failed assertion + * will produce a message like "Expected 4.0 Was 4.25". If you would like less + * verbose failure messages for floating point assertions, use this option to + * give a failure message `"Values Not Within Delta"` and trim the binary size. + */ +/* #define UNITY_EXCLUDE_FLOAT_PRINT */ + +/* If enabled, Unity assumes you want your `FLOAT` asserts to compare standard C + * floats. If your compiler supports a specialty floating point type, you can + * always override this behavior by using this definition. + * + * Example: + */ +/* #define UNITY_FLOAT_TYPE float16_t */ + +/* If enabled, Unity assumes you want your `DOUBLE` asserts to compare standard + * C doubles. If you would like to change this, you can specify something else + * by using this option. For example, defining `UNITY_DOUBLE_TYPE` to `long + * double` could enable gargantuan floating point types on your 64-bit processor + * instead of the standard `double`. + * + * Example: + */ +/* #define UNITY_DOUBLE_TYPE long double */ + +/* If you look up `UNITY_ASSERT_EQUAL_FLOAT` and `UNITY_ASSERT_EQUAL_DOUBLE` as + * documented in the Unity Assertion Guide, you will learn that they are not + * really asserting that two values are equal but rather that two values are + * "close enough" to equal. "Close enough" is controlled by these precision + * configuration options. If you are working with 32-bit floats and/or 64-bit + * doubles (the normal on most processors), you should have no need to change + * these options. They are both set to give you approximately 1 significant bit + * in either direction. The float precision is 0.00001 while the double is + * 10^-12. For further details on how this works, see the appendix of the Unity + * Assertion Guide. + * + * Example: + */ +/* #define UNITY_FLOAT_PRECISION 0.001f */ +/* #define UNITY_DOUBLE_PRECISION 0.001f */ + + +/* *************************** MISCELLANEOUS *********************************** + * Miscellaneous configuration options for Unity + **************************************************************************** */ + +/* Unity uses the stddef.h header included in the C standard library for the + * "NULL" macro. Define this in order to disable the include of stddef.h. If you + * do this, you have to make sure to provide your own "NULL" definition. + */ +/* #define UNITY_EXCLUDE_STDDEF_H */ + +/* Define this to enable the unity formatted print macro: + * "TEST_PRINTF" + */ +/* #define UNITY_INCLUDE_PRINT_FORMATTED */ + + +/* *************************** TOOLSET CUSTOMIZATION *************************** + * In addition to the options listed above, there are a number of other options + * which will come in handy to customize Unity's behavior for your specific + * toolchain. It is possible that you may not need to touch any of these but + * certain platforms, particularly those running in simulators, may need to jump + * through extra hoops to operate properly. These macros will help in those + * situations. + **************************************************************************** */ + +/* By default, Unity prints its results to `stdout` as it runs. This works + * perfectly fine in most situations where you are using a native compiler for + * testing. It works on some simulators as well so long as they have `stdout` + * routed back to the command line. There are times, however, where the + * simulator will lack support for dumping results or you will want to route + * results elsewhere for other reasons. In these cases, you should define the + * `UNITY_OUTPUT_CHAR` macro. This macro accepts a single character at a time + * (as an `int`, since this is the parameter type of the standard C `putchar` + * function most commonly used). You may replace this with whatever function + * call you like. + * + * Example: + * Say you are forced to run your test suite on an embedded processor with no + * `stdout` option. You decide to route your test result output to a custom + * serial `RS232_putc()` function you wrote like thus: + */ +/* #define UNITY_OUTPUT_CHAR(a) RS232_putc(a) */ +/* #define UNITY_OUTPUT_CHAR_HEADER_DECLARATION RS232_putc(int) */ +/* #define UNITY_OUTPUT_FLUSH() RS232_flush() */ +/* #define UNITY_OUTPUT_FLUSH_HEADER_DECLARATION RS232_flush(void) */ +/* #define UNITY_OUTPUT_START() RS232_config(115200,1,8,0) */ +/* #define UNITY_OUTPUT_COMPLETE() RS232_close() */ + +/* Some compilers require a custom attribute to be assigned to pointers, like + * `near` or `far`. In these cases, you can give Unity a safe default for these + * by defining this option with the attribute you would like. + * + * Example: + */ +/* #define UNITY_PTR_ATTRIBUTE __attribute__((far)) */ +/* #define UNITY_PTR_ATTRIBUTE near */ + +/* Print execution time of each test when executed in verbose mode + * + * Example: + * + * TEST - PASS (10 ms) + */ +/* #define UNITY_INCLUDE_EXEC_TIME */ + +#endif /* UNITY_CONFIG_H */ diff --git a/TSM_PicoW_Sensor/McuLib/unity/unity_internals.h b/TSM_PicoW_Sensor/McuLib/unity/unity_internals.h new file mode 100644 index 0000000..4a720d9 --- /dev/null +++ b/TSM_PicoW_Sensor/McuLib/unity/unity_internals.h @@ -0,0 +1,1160 @@ +/* ========================================== + Unity Project - A Test Framework for C + Copyright (c) 2007-21 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +========================================== */ + +#ifndef UNITY_INTERNALS_H +#define UNITY_INTERNALS_H + +#ifdef UNITY_INCLUDE_CONFIG_H +#include "unity_config.h" +#endif + +#ifndef UNITY_EXCLUDE_SETJMP_H +#include +#endif + +#ifndef UNITY_EXCLUDE_MATH_H +#include +#endif + +#ifndef UNITY_EXCLUDE_STDDEF_H +#include +#endif + +#ifdef UNITY_INCLUDE_PRINT_FORMATTED +#include +#endif + +/* Unity Attempts to Auto-Detect Integer Types + * Attempt 1: UINT_MAX, ULONG_MAX in , or default to 32 bits + * Attempt 2: UINTPTR_MAX in , or default to same size as long + * The user may override any of these derived constants: + * UNITY_INT_WIDTH, UNITY_LONG_WIDTH, UNITY_POINTER_WIDTH */ +#ifndef UNITY_EXCLUDE_STDINT_H +#include +#endif + +#ifndef UNITY_EXCLUDE_LIMITS_H +#include +#endif + +#if defined(__GNUC__) || defined(__clang__) + #define UNITY_FUNCTION_ATTR(a) __attribute__((a)) +#else + #define UNITY_FUNCTION_ATTR(a) /* ignore */ +#endif + +#ifndef UNITY_NORETURN + #if defined(__cplusplus) + #if __cplusplus >= 201103L + #define UNITY_NORETURN [[ noreturn ]] + #endif + #elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L + #if defined(_WIN32) && defined(_MSC_VER) + /* We are using MSVC compiler on Windows platform. */ + /* Not all Windows SDKs supports , but compiler can support C11: */ + /* https://devblogs.microsoft.com/cppblog/c11-and-c17-standard-support-arriving-in-msvc/ */ + /* Not sure, that Mingw compilers has Windows SDK headers at all. */ + #include + #endif + + /* Using Windows SDK predefined macro for detecting supported SDK with MSVC compiler. */ + /* Mingw GCC should work without that fixes. */ + /* Based on: */ + /* https://docs.microsoft.com/en-us/cpp/porting/modifying-winver-and-win32-winnt?view=msvc-170 */ + /* NTDDI_WIN10_FE is equal to Windows 10 SDK 2104 */ + #if defined(_MSC_VER) && ((!defined(NTDDI_WIN10_FE)) || WDK_NTDDI_VERSION < NTDDI_WIN10_FE) + /* Based on tests and: */ + /* https://docs.microsoft.com/en-us/cpp/c-language/noreturn?view=msvc-170 */ + /* https://en.cppreference.com/w/c/language/_Noreturn */ + #define UNITY_NORETURN _Noreturn + #else /* Using newer Windows SDK or not MSVC compiler */ + #include /* note: header file not present in RedLib: use newlib or newlib nano instead */ + #define UNITY_NORETURN noreturn + #endif + #endif +#endif +#ifndef UNITY_NORETURN + #define UNITY_NORETURN UNITY_FUNCTION_ATTR(__noreturn__) +#endif + +/*------------------------------------------------------- + * Guess Widths If Not Specified + *-------------------------------------------------------*/ + +/* Determine the size of an int, if not already specified. + * We cannot use sizeof(int), because it is not yet defined + * at this stage in the translation of the C program. + * Also sizeof(int) does return the size in addressable units on all platforms, + * which may not necessarily be the size in bytes. + * Therefore, infer it from UINT_MAX if possible. */ +#ifndef UNITY_INT_WIDTH + #ifdef UINT_MAX + #if (UINT_MAX == 0xFFFF) + #define UNITY_INT_WIDTH (16) + #elif (UINT_MAX == 0xFFFFFFFF) + #define UNITY_INT_WIDTH (32) + #elif (UINT_MAX == 0xFFFFFFFFFFFFFFFF) + #define UNITY_INT_WIDTH (64) + #endif + #else /* Set to default */ + #define UNITY_INT_WIDTH (32) + #endif /* UINT_MAX */ +#endif + +/* Determine the size of a long, if not already specified. */ +#ifndef UNITY_LONG_WIDTH + #ifdef ULONG_MAX + #if (ULONG_MAX == 0xFFFF) + #define UNITY_LONG_WIDTH (16) + #elif (ULONG_MAX == 0xFFFFFFFF) + #define UNITY_LONG_WIDTH (32) + #elif (ULONG_MAX == 0xFFFFFFFFFFFFFFFF) + #define UNITY_LONG_WIDTH (64) + #endif + #else /* Set to default */ + #define UNITY_LONG_WIDTH (32) + #endif /* ULONG_MAX */ +#endif + +/* Determine the size of a pointer, if not already specified. */ +#ifndef UNITY_POINTER_WIDTH + #ifdef UINTPTR_MAX + #if (UINTPTR_MAX <= 0xFFFF) + #define UNITY_POINTER_WIDTH (16) + #elif (UINTPTR_MAX <= 0xFFFFFFFF) + #define UNITY_POINTER_WIDTH (32) + #elif (UINTPTR_MAX <= 0xFFFFFFFFFFFFFFFF) + #define UNITY_POINTER_WIDTH (64) + #endif + #else /* Set to default */ + #define UNITY_POINTER_WIDTH UNITY_LONG_WIDTH + #endif /* UINTPTR_MAX */ +#endif + +/*------------------------------------------------------- + * Int Support (Define types based on detected sizes) + *-------------------------------------------------------*/ + +#if (UNITY_INT_WIDTH == 32) + typedef unsigned char UNITY_UINT8; + typedef unsigned short UNITY_UINT16; + typedef unsigned int UNITY_UINT32; + typedef signed char UNITY_INT8; + typedef signed short UNITY_INT16; + typedef signed int UNITY_INT32; +#elif (UNITY_INT_WIDTH == 16) + typedef unsigned char UNITY_UINT8; + typedef unsigned int UNITY_UINT16; + typedef unsigned long UNITY_UINT32; + typedef signed char UNITY_INT8; + typedef signed int UNITY_INT16; + typedef signed long UNITY_INT32; +#else + #error Invalid UNITY_INT_WIDTH specified! (16 or 32 are supported) +#endif + +/*------------------------------------------------------- + * 64-bit Support + *-------------------------------------------------------*/ + +/* Auto-detect 64 Bit Support */ +#ifndef UNITY_SUPPORT_64 + #if UNITY_LONG_WIDTH == 64 || UNITY_POINTER_WIDTH == 64 + #define UNITY_SUPPORT_64 + #endif +#endif + +/* 64-Bit Support Dependent Configuration */ +#ifndef UNITY_SUPPORT_64 + /* No 64-bit Support */ + typedef UNITY_UINT32 UNITY_UINT; + typedef UNITY_INT32 UNITY_INT; + #define UNITY_MAX_NIBBLES (8) /* Maximum number of nibbles in a UNITY_(U)INT */ +#else + /* 64-bit Support */ + #if (UNITY_LONG_WIDTH == 32) + typedef unsigned long long UNITY_UINT64; + typedef signed long long UNITY_INT64; + #elif (UNITY_LONG_WIDTH == 64) + typedef unsigned long UNITY_UINT64; + typedef signed long UNITY_INT64; + #else + #error Invalid UNITY_LONG_WIDTH specified! (32 or 64 are supported) + #endif + typedef UNITY_UINT64 UNITY_UINT; + typedef UNITY_INT64 UNITY_INT; + #define UNITY_MAX_NIBBLES (16) /* Maximum number of nibbles in a UNITY_(U)INT */ +#endif + +/*------------------------------------------------------- + * Pointer Support + *-------------------------------------------------------*/ + +#if (UNITY_POINTER_WIDTH == 32) + #define UNITY_PTR_TO_INT UNITY_INT32 + #define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX32 +#elif (UNITY_POINTER_WIDTH == 64) + #define UNITY_PTR_TO_INT UNITY_INT64 + #define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX64 +#elif (UNITY_POINTER_WIDTH == 16) + #define UNITY_PTR_TO_INT UNITY_INT16 + #define UNITY_DISPLAY_STYLE_POINTER UNITY_DISPLAY_STYLE_HEX16 +#else + #error Invalid UNITY_POINTER_WIDTH specified! (16, 32 or 64 are supported) +#endif + +#ifndef UNITY_PTR_ATTRIBUTE + #define UNITY_PTR_ATTRIBUTE +#endif + +#ifndef UNITY_INTERNAL_PTR + #define UNITY_INTERNAL_PTR UNITY_PTR_ATTRIBUTE const void* +#endif + +/* optionally define UNITY_COMPARE_PTRS_ON_ZERO_ARRAY */ + +/*------------------------------------------------------- + * Float Support + *-------------------------------------------------------*/ + +#ifdef UNITY_EXCLUDE_FLOAT + +/* No Floating Point Support */ +#ifndef UNITY_EXCLUDE_DOUBLE +#define UNITY_EXCLUDE_DOUBLE /* Remove double when excluding float support */ +#endif +#ifndef UNITY_EXCLUDE_FLOAT_PRINT +#define UNITY_EXCLUDE_FLOAT_PRINT +#endif + +#else + +/* Floating Point Support */ +#ifndef UNITY_FLOAT_PRECISION +#define UNITY_FLOAT_PRECISION (0.00001f) +#endif +#ifndef UNITY_FLOAT_TYPE +#define UNITY_FLOAT_TYPE float +#endif +typedef UNITY_FLOAT_TYPE UNITY_FLOAT; + +/* isinf & isnan macros should be provided by math.h */ +#ifndef isinf +/* The value of Inf - Inf is NaN */ +#define isinf(n) (isnan((n) - (n)) && !isnan(n)) +#endif + +#ifndef isnan +/* NaN is the only floating point value that does NOT equal itself. + * Therefore if n != n, then it is NaN. */ +#define isnan(n) ((n != n) ? 1 : 0) +#endif + +#endif + +/*------------------------------------------------------- + * Double Float Support + *-------------------------------------------------------*/ + +/* unlike float, we DON'T include by default */ +#if defined(UNITY_EXCLUDE_DOUBLE) || !defined(UNITY_INCLUDE_DOUBLE) + + /* No Floating Point Support */ + #ifndef UNITY_EXCLUDE_DOUBLE + #define UNITY_EXCLUDE_DOUBLE + #else + #undef UNITY_INCLUDE_DOUBLE + #endif + + #ifndef UNITY_EXCLUDE_FLOAT + #ifndef UNITY_DOUBLE_TYPE + #define UNITY_DOUBLE_TYPE double + #endif + typedef UNITY_FLOAT UNITY_DOUBLE; + /* For parameter in UnityPrintFloat(UNITY_DOUBLE), which aliases to double or float */ + #endif + +#else + + /* Double Floating Point Support */ + #ifndef UNITY_DOUBLE_PRECISION + #define UNITY_DOUBLE_PRECISION (1e-12) + #endif + + #ifndef UNITY_DOUBLE_TYPE + #define UNITY_DOUBLE_TYPE double + #endif + typedef UNITY_DOUBLE_TYPE UNITY_DOUBLE; + +#endif + +/*------------------------------------------------------- + * Output Method: stdout (DEFAULT) + *-------------------------------------------------------*/ +#ifndef UNITY_OUTPUT_CHAR + /* Default to using putchar, which is defined in stdio.h */ + #include + #define UNITY_OUTPUT_CHAR(a) (void)putchar(a) +#else + /* If defined as something else, make sure we declare it here so it's ready for use */ + #ifdef UNITY_OUTPUT_CHAR_HEADER_DECLARATION + extern void UNITY_OUTPUT_CHAR_HEADER_DECLARATION; + #endif +#endif + +#ifndef UNITY_OUTPUT_FLUSH + #ifdef UNITY_USE_FLUSH_STDOUT + /* We want to use the stdout flush utility */ + #include + #define UNITY_OUTPUT_FLUSH() (void)fflush(stdout) + #else + /* We've specified nothing, therefore flush should just be ignored */ + #define UNITY_OUTPUT_FLUSH() (void)0 + #endif +#else + /* If defined as something else, make sure we declare it here so it's ready for use */ + #ifdef UNITY_OUTPUT_FLUSH_HEADER_DECLARATION + extern void UNITY_OUTPUT_FLUSH_HEADER_DECLARATION; + #endif +#endif + +#ifndef UNITY_OUTPUT_FLUSH +#define UNITY_FLUSH_CALL() +#else +#define UNITY_FLUSH_CALL() UNITY_OUTPUT_FLUSH() +#endif + +#ifndef UNITY_PRINT_EOL +#define UNITY_PRINT_EOL() UNITY_OUTPUT_CHAR('\n') +#endif + +#ifndef UNITY_OUTPUT_START +#define UNITY_OUTPUT_START() +#endif + +#ifndef UNITY_OUTPUT_COMPLETE +#define UNITY_OUTPUT_COMPLETE() +#endif + +#ifdef UNITY_INCLUDE_EXEC_TIME + #if !defined(UNITY_EXEC_TIME_START) && \ + !defined(UNITY_EXEC_TIME_STOP) && \ + !defined(UNITY_PRINT_EXEC_TIME) && \ + !defined(UNITY_TIME_TYPE) + /* If none any of these macros are defined then try to provide a default implementation */ + + #if defined(UNITY_CLOCK_MS) + /* This is a simple way to get a default implementation on platforms that support getting a millisecond counter */ + #define UNITY_TIME_TYPE UNITY_UINT + #define UNITY_EXEC_TIME_START() Unity.CurrentTestStartTime = UNITY_CLOCK_MS() + #define UNITY_EXEC_TIME_STOP() Unity.CurrentTestStopTime = UNITY_CLOCK_MS() + #define UNITY_PRINT_EXEC_TIME() { \ + UNITY_UINT execTimeMs = (Unity.CurrentTestStopTime - Unity.CurrentTestStartTime); \ + UnityPrint(" ("); \ + UnityPrintNumberUnsigned(execTimeMs); \ + UnityPrint(" ms)"); \ + } + #elif defined(_WIN32) + #include + #define UNITY_TIME_TYPE clock_t + #define UNITY_GET_TIME(t) t = (clock_t)((clock() * 1000) / CLOCKS_PER_SEC) + #define UNITY_EXEC_TIME_START() UNITY_GET_TIME(Unity.CurrentTestStartTime) + #define UNITY_EXEC_TIME_STOP() UNITY_GET_TIME(Unity.CurrentTestStopTime) + #define UNITY_PRINT_EXEC_TIME() { \ + UNITY_UINT execTimeMs = (Unity.CurrentTestStopTime - Unity.CurrentTestStartTime); \ + UnityPrint(" ("); \ + UnityPrintNumberUnsigned(execTimeMs); \ + UnityPrint(" ms)"); \ + } + #elif defined(__unix__) || defined(__APPLE__) + #include + #define UNITY_TIME_TYPE struct timespec + #define UNITY_GET_TIME(t) clock_gettime(CLOCK_MONOTONIC, &t) + #define UNITY_EXEC_TIME_START() UNITY_GET_TIME(Unity.CurrentTestStartTime) + #define UNITY_EXEC_TIME_STOP() UNITY_GET_TIME(Unity.CurrentTestStopTime) + #define UNITY_PRINT_EXEC_TIME() { \ + UNITY_UINT execTimeMs = ((Unity.CurrentTestStopTime.tv_sec - Unity.CurrentTestStartTime.tv_sec) * 1000L); \ + execTimeMs += ((Unity.CurrentTestStopTime.tv_nsec - Unity.CurrentTestStartTime.tv_nsec) / 1000000L); \ + UnityPrint(" ("); \ + UnityPrintNumberUnsigned(execTimeMs); \ + UnityPrint(" ms)"); \ + } + #endif + #endif +#endif + +#ifndef UNITY_EXEC_TIME_START +#define UNITY_EXEC_TIME_START() do { /* nothing*/ } while (0) +#endif + +#ifndef UNITY_EXEC_TIME_STOP +#define UNITY_EXEC_TIME_STOP() do { /* nothing*/ } while (0) +#endif + +#ifndef UNITY_TIME_TYPE +#define UNITY_TIME_TYPE UNITY_UINT +#endif + +#ifndef UNITY_PRINT_EXEC_TIME +#define UNITY_PRINT_EXEC_TIME() do { /* nothing*/ } while (0) +#endif + +/*------------------------------------------------------- + * Footprint + *-------------------------------------------------------*/ + +#ifndef UNITY_LINE_TYPE +#define UNITY_LINE_TYPE UNITY_UINT +#endif + +#ifndef UNITY_COUNTER_TYPE +#define UNITY_COUNTER_TYPE UNITY_UINT +#endif + +/*------------------------------------------------------- + * Internal Structs Needed + *-------------------------------------------------------*/ + +typedef void (*UnityTestFunction)(void); + +#define UNITY_DISPLAY_RANGE_INT (0x10) +#define UNITY_DISPLAY_RANGE_UINT (0x20) +#define UNITY_DISPLAY_RANGE_HEX (0x40) +#define UNITY_DISPLAY_RANGE_CHAR (0x80) + +typedef enum +{ + UNITY_DISPLAY_STYLE_INT = (UNITY_INT_WIDTH / 8) + UNITY_DISPLAY_RANGE_INT, + UNITY_DISPLAY_STYLE_INT8 = 1 + UNITY_DISPLAY_RANGE_INT, + UNITY_DISPLAY_STYLE_INT16 = 2 + UNITY_DISPLAY_RANGE_INT, + UNITY_DISPLAY_STYLE_INT32 = 4 + UNITY_DISPLAY_RANGE_INT, +#ifdef UNITY_SUPPORT_64 + UNITY_DISPLAY_STYLE_INT64 = 8 + UNITY_DISPLAY_RANGE_INT, +#endif + + UNITY_DISPLAY_STYLE_UINT = (UNITY_INT_WIDTH / 8) + UNITY_DISPLAY_RANGE_UINT, + UNITY_DISPLAY_STYLE_UINT8 = 1 + UNITY_DISPLAY_RANGE_UINT, + UNITY_DISPLAY_STYLE_UINT16 = 2 + UNITY_DISPLAY_RANGE_UINT, + UNITY_DISPLAY_STYLE_UINT32 = 4 + UNITY_DISPLAY_RANGE_UINT, +#ifdef UNITY_SUPPORT_64 + UNITY_DISPLAY_STYLE_UINT64 = 8 + UNITY_DISPLAY_RANGE_UINT, +#endif + + UNITY_DISPLAY_STYLE_HEX8 = 1 + UNITY_DISPLAY_RANGE_HEX, + UNITY_DISPLAY_STYLE_HEX16 = 2 + UNITY_DISPLAY_RANGE_HEX, + UNITY_DISPLAY_STYLE_HEX32 = 4 + UNITY_DISPLAY_RANGE_HEX, +#ifdef UNITY_SUPPORT_64 + UNITY_DISPLAY_STYLE_HEX64 = 8 + UNITY_DISPLAY_RANGE_HEX, +#endif + + UNITY_DISPLAY_STYLE_CHAR = 1 + UNITY_DISPLAY_RANGE_CHAR + UNITY_DISPLAY_RANGE_INT, + + UNITY_DISPLAY_STYLE_UNKNOWN +} UNITY_DISPLAY_STYLE_T; + +typedef enum +{ + UNITY_WITHIN = 0x0, + UNITY_EQUAL_TO = 0x1, + UNITY_GREATER_THAN = 0x2, + UNITY_GREATER_OR_EQUAL = 0x2 + UNITY_EQUAL_TO, + UNITY_SMALLER_THAN = 0x4, + UNITY_SMALLER_OR_EQUAL = 0x4 + UNITY_EQUAL_TO, + UNITY_NOT_EQUAL = 0x0, + UNITY_UNKNOWN +} UNITY_COMPARISON_T; + +#ifndef UNITY_EXCLUDE_FLOAT +typedef enum UNITY_FLOAT_TRAIT +{ + UNITY_FLOAT_IS_NOT_INF = 0, + UNITY_FLOAT_IS_INF, + UNITY_FLOAT_IS_NOT_NEG_INF, + UNITY_FLOAT_IS_NEG_INF, + UNITY_FLOAT_IS_NOT_NAN, + UNITY_FLOAT_IS_NAN, + UNITY_FLOAT_IS_NOT_DET, + UNITY_FLOAT_IS_DET, + UNITY_FLOAT_INVALID_TRAIT +} UNITY_FLOAT_TRAIT_T; +#endif + +typedef enum +{ + UNITY_ARRAY_TO_VAL = 0, + UNITY_ARRAY_TO_ARRAY, + UNITY_ARRAY_UNKNOWN +} UNITY_FLAGS_T; + +struct UNITY_STORAGE_T +{ + const char* TestFile; + const char* CurrentTestName; +#ifndef UNITY_EXCLUDE_DETAILS + const char* CurrentDetail1; + const char* CurrentDetail2; +#endif + UNITY_LINE_TYPE CurrentTestLineNumber; + UNITY_COUNTER_TYPE NumberOfTests; + UNITY_COUNTER_TYPE TestFailures; + UNITY_COUNTER_TYPE TestIgnores; + UNITY_COUNTER_TYPE CurrentTestFailed; + UNITY_COUNTER_TYPE CurrentTestIgnored; +#ifdef UNITY_INCLUDE_EXEC_TIME + UNITY_TIME_TYPE CurrentTestStartTime; + UNITY_TIME_TYPE CurrentTestStopTime; +#endif +#ifndef UNITY_EXCLUDE_SETJMP_H + jmp_buf AbortFrame; +#endif +}; + +extern struct UNITY_STORAGE_T Unity; + +/*------------------------------------------------------- + * Test Suite Management + *-------------------------------------------------------*/ + +void UnityBegin(const char* filename); +int UnityEnd(void); +void UnitySetTestFile(const char* filename); +void UnityConcludeTest(void); + +#ifndef RUN_TEST +void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum); +#else +#define UNITY_SKIP_DEFAULT_RUNNER +#endif + +/*------------------------------------------------------- + * Details Support + *-------------------------------------------------------*/ + +#ifdef UNITY_EXCLUDE_DETAILS +#define UNITY_CLR_DETAILS() +#define UNITY_SET_DETAIL(d1) +#define UNITY_SET_DETAILS(d1,d2) +#else +#define UNITY_CLR_DETAILS() do { Unity.CurrentDetail1 = 0; Unity.CurrentDetail2 = 0; } while (0) +#define UNITY_SET_DETAIL(d1) do { Unity.CurrentDetail1 = (d1); Unity.CurrentDetail2 = 0; } while (0) +#define UNITY_SET_DETAILS(d1,d2) do { Unity.CurrentDetail1 = (d1); Unity.CurrentDetail2 = (d2); } while (0) + +#ifndef UNITY_DETAIL1_NAME +#define UNITY_DETAIL1_NAME "Function" +#endif + +#ifndef UNITY_DETAIL2_NAME +#define UNITY_DETAIL2_NAME "Argument" +#endif +#endif + +#ifdef UNITY_PRINT_TEST_CONTEXT +void UNITY_PRINT_TEST_CONTEXT(void); +#endif + +/*------------------------------------------------------- + * Test Output + *-------------------------------------------------------*/ + +void UnityPrint(const char* string); + +#ifdef UNITY_INCLUDE_PRINT_FORMATTED +void UnityPrintF(const UNITY_LINE_TYPE line, const char* format, ...); +#endif + +void UnityPrintLen(const char* string, const UNITY_UINT32 length); +void UnityPrintMask(const UNITY_UINT mask, const UNITY_UINT number); +void UnityPrintNumberByStyle(const UNITY_INT number, const UNITY_DISPLAY_STYLE_T style); +void UnityPrintNumber(const UNITY_INT number_to_print); +void UnityPrintNumberUnsigned(const UNITY_UINT number); +void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles_to_print); + +#ifndef UNITY_EXCLUDE_FLOAT_PRINT +void UnityPrintFloat(const UNITY_DOUBLE input_number); +#endif + +/*------------------------------------------------------- + * Test Assertion Functions + *------------------------------------------------------- + * Use the macros below this section instead of calling + * these directly. The macros have a consistent naming + * convention and will pull in file and line information + * for you. */ + +void UnityAssertEqualNumber(const UNITY_INT expected, + const UNITY_INT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style); + +void UnityAssertGreaterOrLessOrEqualNumber(const UNITY_INT threshold, + const UNITY_INT actual, + const UNITY_COMPARISON_T compare, + const char *msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style); + +void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style, + const UNITY_FLAGS_T flags); + +void UnityAssertBits(const UNITY_INT mask, + const UNITY_INT expected, + const UNITY_INT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertEqualString(const char* expected, + const char* actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertEqualStringLen(const char* expected, + const char* actual, + const UNITY_UINT32 length, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertEqualStringArray( UNITY_INTERNAL_PTR expected, + const char** actual, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags); + +void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const UNITY_UINT32 length, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags); + +void UnityAssertNumbersWithin(const UNITY_UINT delta, + const UNITY_INT expected, + const UNITY_INT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style); + +void UnityAssertNumbersArrayWithin(const UNITY_UINT delta, + UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style, + const UNITY_FLAGS_T flags); + +#ifndef UNITY_EXCLUDE_SETJMP_H +UNITY_NORETURN void UnityFail(const char* message, const UNITY_LINE_TYPE line); +UNITY_NORETURN void UnityIgnore(const char* message, const UNITY_LINE_TYPE line); +#else +void UnityFail(const char* message, const UNITY_LINE_TYPE line); +void UnityIgnore(const char* message, const UNITY_LINE_TYPE line); +#endif + +void UnityMessage(const char* message, const UNITY_LINE_TYPE line); + +#ifndef UNITY_EXCLUDE_FLOAT +void UnityAssertFloatsWithin(const UNITY_FLOAT delta, + const UNITY_FLOAT expected, + const UNITY_FLOAT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertFloatsNotWithin(const UNITY_FLOAT delta, + const UNITY_FLOAT expected, + const UNITY_FLOAT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertGreaterOrLessFloat(const UNITY_FLOAT threshold, + const UNITY_FLOAT actual, + const UNITY_COMPARISON_T compare, + const char* msg, + const UNITY_LINE_TYPE linenumber); + +void UnityAssertWithinFloatArray(const UNITY_FLOAT delta, + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected, + UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* actual, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags); + +void UnityAssertFloatSpecial(const UNITY_FLOAT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLOAT_TRAIT_T style); +#endif + +#ifndef UNITY_EXCLUDE_DOUBLE +void UnityAssertDoublesWithin(const UNITY_DOUBLE delta, + const UNITY_DOUBLE expected, + const UNITY_DOUBLE actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertDoublesNotWithin(const UNITY_DOUBLE delta, + const UNITY_DOUBLE expected, + const UNITY_DOUBLE actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber); + +void UnityAssertGreaterOrLessDouble(const UNITY_DOUBLE threshold, + const UNITY_DOUBLE actual, + const UNITY_COMPARISON_T compare, + const char* msg, + const UNITY_LINE_TYPE linenumber); + +void UnityAssertWithinDoubleArray(const UNITY_DOUBLE delta, + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expected, + UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* actual, + const UNITY_UINT32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLAGS_T flags); + +void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLOAT_TRAIT_T style); +#endif + +/*------------------------------------------------------- + * Helpers + *-------------------------------------------------------*/ + +UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size); +#ifndef UNITY_EXCLUDE_FLOAT +UNITY_INTERNAL_PTR UnityFloatToPtr(const float num); +#endif +#ifndef UNITY_EXCLUDE_DOUBLE +UNITY_INTERNAL_PTR UnityDoubleToPtr(const double num); +#endif + +/*------------------------------------------------------- + * Error Strings We Might Need + *-------------------------------------------------------*/ + +extern const char UnityStrOk[]; +extern const char UnityStrPass[]; +extern const char UnityStrFail[]; +extern const char UnityStrIgnore[]; + +extern const char UnityStrErrFloat[]; +extern const char UnityStrErrDouble[]; +extern const char UnityStrErr64[]; +extern const char UnityStrErrShorthand[]; + +/*------------------------------------------------------- + * Test Running Macros + *-------------------------------------------------------*/ + +#ifdef UNITY_TEST_PROTECT +#define TEST_PROTECT() UNITY_TEST_PROTECT() +#else +#ifndef UNITY_EXCLUDE_SETJMP_H +#define TEST_PROTECT() (setjmp(Unity.AbortFrame) == 0) +#else +#define TEST_PROTECT() 1 +#endif +#endif + +#ifdef UNITY_TEST_ABORT +#define TEST_ABORT() UNITY_TEST_ABORT() +#else +#ifndef UNITY_EXCLUDE_SETJMP_H +#define TEST_ABORT() longjmp(Unity.AbortFrame, 1) +#else +#define TEST_ABORT() return +#endif +#endif + +/* Automatically enable variadic macros support, if it not enabled before */ +#ifndef UNITY_SUPPORT_VARIADIC_MACROS + #ifdef __STDC_VERSION__ + #if __STDC_VERSION__ >= 199901L + #define UNITY_SUPPORT_VARIADIC_MACROS + #endif + #endif +#endif + +/* This tricky series of macros gives us an optional line argument to treat it as RUN_TEST(func, num=__LINE__) */ +#ifndef RUN_TEST +#ifdef UNITY_SUPPORT_VARIADIC_MACROS +#define RUN_TEST(...) RUN_TEST_AT_LINE(__VA_ARGS__, __LINE__, throwaway) +#define RUN_TEST_AT_LINE(func, line, ...) UnityDefaultTestRun(func, #func, line) +#endif +#endif + +/* Enable default macros for masking param tests test cases */ +#ifdef UNITY_SUPPORT_TEST_CASES + #ifdef UNITY_SUPPORT_VARIADIC_MACROS + #if !defined(TEST_CASE) && !defined(UNITY_EXCLUDE_TEST_CASE) + #define TEST_CASE(...) + #endif + #if !defined(TEST_RANGE) && !defined(UNITY_EXCLUDE_TEST_RANGE) + #define TEST_RANGE(...) + #endif + #if !defined(TEST_MATRIX) && !defined(UNITY_EXCLUDE_TEST_MATRIX) + #define TEST_MATRIX(...) + #endif + #endif +#endif + +/* If we can't do the tricky version, we'll just have to require them to always include the line number */ +#ifndef RUN_TEST +#ifdef CMOCK +#define RUN_TEST(func, num) UnityDefaultTestRun(func, #func, num) +#else +#define RUN_TEST(func) UnityDefaultTestRun(func, #func, __LINE__) +#endif +#endif + +#define TEST_LINE_NUM (Unity.CurrentTestLineNumber) +#define TEST_IS_IGNORED (Unity.CurrentTestIgnored) +#define UNITY_NEW_TEST(a) \ + Unity.CurrentTestName = (a); \ + Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)(__LINE__); \ + Unity.NumberOfTests++; + +#ifndef UNITY_BEGIN +#define UNITY_BEGIN() UnityBegin(__FILE__) +#endif + +#ifndef UNITY_END +#define UNITY_END() UnityEnd() +#endif + +#ifndef UNITY_SHORTHAND_AS_INT +#ifndef UNITY_SHORTHAND_AS_MEM +#ifndef UNITY_SHORTHAND_AS_NONE +#ifndef UNITY_SHORTHAND_AS_RAW +#define UNITY_SHORTHAND_AS_OLD +#endif +#endif +#endif +#endif + +/*----------------------------------------------- + * Command Line Argument Support + *-----------------------------------------------*/ + +#ifdef UNITY_USE_COMMAND_LINE_ARGS +int UnityParseOptions(int argc, char** argv); +int UnityTestMatches(void); +#endif + +/*------------------------------------------------------- + * Basic Fail and Ignore + *-------------------------------------------------------*/ + +#define UNITY_TEST_FAIL(line, message) UnityFail( (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_IGNORE(line, message) UnityIgnore( (message), (UNITY_LINE_TYPE)(line)) + +/*------------------------------------------------------- + * Test Asserts + *-------------------------------------------------------*/ + +#define UNITY_TEST_ASSERT(condition, line, message) do { if (condition) { /* nothing*/ } else { UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), (message)); } } while (0) +#define UNITY_TEST_ASSERT_NULL(pointer, line, message) UNITY_TEST_ASSERT(((pointer) == NULL), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_NOT_NULL(pointer, line, message) UNITY_TEST_ASSERT(((pointer) != NULL), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_EMPTY(pointer, line, message) UNITY_TEST_ASSERT(((pointer[0]) == 0), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_NOT_EMPTY(pointer, line, message) UNITY_TEST_ASSERT(((pointer[0]) != 0), (UNITY_LINE_TYPE)(line), (message)) + +#define UNITY_TEST_ASSERT_EQUAL_INT(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_EQUAL_INT8(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )(expected), (UNITY_INT)(UNITY_INT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_EQUAL_INT16(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT16)(expected), (UNITY_INT)(UNITY_INT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_EQUAL_INT32(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT32)(expected), (UNITY_INT)(UNITY_INT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_EQUAL_UINT(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_EQUAL_UINT8(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_UINT8 )(expected), (UNITY_INT)(UNITY_UINT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_EQUAL_UINT16(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_UINT16)(expected), (UNITY_INT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_EQUAL_UINT32(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_UINT32)(expected), (UNITY_INT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_EQUAL_HEX8(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )(expected), (UNITY_INT)(UNITY_INT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_EQUAL_HEX16(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT16)(expected), (UNITY_INT)(UNITY_INT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_EQUAL_HEX32(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT32)(expected), (UNITY_INT)(UNITY_INT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_EQUAL_CHAR(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )(expected), (UNITY_INT)(UNITY_INT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) +#define UNITY_TEST_ASSERT_BITS(mask, expected, actual, line, message) UnityAssertBits((UNITY_INT)(mask), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line)) + +#define UNITY_TEST_ASSERT_NOT_EQUAL_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_NOT_EQUAL_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_NOT_EQUAL_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_NOT_EQUAL_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_NOT_EQUAL_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_NOT_EQUAL_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_NOT_EQUAL_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_NOT_EQUAL_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_NOT_EQUAL_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_NOT_EQUAL_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_NOT_EQUAL_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_NOT_EQUAL_CHAR(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) + +#define UNITY_TEST_ASSERT_GREATER_THAN_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_GREATER_THAN_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_GREATER_THAN_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_GREATER_THAN_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_GREATER_THAN_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_GREATER_THAN_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_GREATER_THAN_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_GREATER_THAN_CHAR(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) + +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_SMALLER_THAN_CHAR(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 )(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) + +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT) (threshold), (UNITY_INT) (actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 ) (threshold), (UNITY_INT)(UNITY_INT8 ) (actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16) (threshold), (UNITY_INT)(UNITY_INT16) (actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32) (threshold), (UNITY_INT)(UNITY_INT32) (actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT) (threshold), (UNITY_INT) (actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_CHAR(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 ) (threshold), (UNITY_INT)(UNITY_INT8 ) (actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) + +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT) (threshold), (UNITY_INT) (actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 ) (actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT16)(threshold), (UNITY_INT)(UNITY_INT16) (actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT32)(threshold), (UNITY_INT)(UNITY_INT32) (actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT) (threshold), (UNITY_INT) (actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX8(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT8 )(threshold), (UNITY_INT)(UNITY_UINT8 )(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX16(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT16)(threshold), (UNITY_INT)(UNITY_UINT16)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX32(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_UINT32)(threshold), (UNITY_INT)(UNITY_UINT32)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_CHAR(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(UNITY_INT8 )(threshold), (UNITY_INT)(UNITY_INT8 ) (actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) + +#define UNITY_TEST_ASSERT_INT_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin( (delta), (UNITY_INT) (expected), (UNITY_INT) (actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT) +#define UNITY_TEST_ASSERT_INT8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT8 )(delta), (UNITY_INT)(UNITY_INT8 ) (expected), (UNITY_INT)(UNITY_INT8 ) (actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8) +#define UNITY_TEST_ASSERT_INT16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT16)(delta), (UNITY_INT)(UNITY_INT16) (expected), (UNITY_INT)(UNITY_INT16) (actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16) +#define UNITY_TEST_ASSERT_INT32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT32)(delta), (UNITY_INT)(UNITY_INT32) (expected), (UNITY_INT)(UNITY_INT32) (actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32) +#define UNITY_TEST_ASSERT_UINT_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin( (delta), (UNITY_INT) (expected), (UNITY_INT) (actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT) +#define UNITY_TEST_ASSERT_UINT8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT8 )(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8 )(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8) +#define UNITY_TEST_ASSERT_UINT16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT16)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16) +#define UNITY_TEST_ASSERT_UINT32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT32)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32) +#define UNITY_TEST_ASSERT_HEX8_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT8 )(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8 )(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT8 )(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8) +#define UNITY_TEST_ASSERT_HEX16_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT16)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT16)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16) +#define UNITY_TEST_ASSERT_HEX32_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT32)(delta), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(expected), (UNITY_INT)(UNITY_UINT)(UNITY_UINT32)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32) +#define UNITY_TEST_ASSERT_CHAR_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((UNITY_UINT8 )(delta), (UNITY_INT)(UNITY_INT8 ) (expected), (UNITY_INT)(UNITY_INT8 ) (actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR) + +#define UNITY_TEST_ASSERT_INT_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin( (delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_INT8_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT8 )(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_INT16_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT16)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_INT32_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT32)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_UINT_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin( (delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_UINT8_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT8 )(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_UINT16_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT16)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_UINT32_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT32)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_HEX8_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT8 )(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_HEX16_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT16)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_HEX32_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT32)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_CHAR_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT8 )(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), ((UNITY_UINT32)(num_elements)), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR, UNITY_ARRAY_TO_ARRAY) + + +#define UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, line, message) UnityAssertEqualNumber((UNITY_PTR_TO_INT)(expected), (UNITY_PTR_TO_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER) +#define UNITY_TEST_ASSERT_EQUAL_STRING(expected, actual, line, message) UnityAssertEqualString((const char*)(expected), (const char*)(actual), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len, line, message) UnityAssertEqualStringLen((const char*)(expected), (const char*)(actual), (UNITY_UINT32)(len), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_MEMORY(expected, actual, len, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), 1, (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) + +#define UNITY_TEST_ASSERT_EQUAL_INT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_INT8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_INT16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_INT32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_UINT_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_UINT8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_UINT16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_UINT32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_HEX8_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_HEX16_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_HEX32_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_PTR_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_STRING_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((UNITY_INTERNAL_PTR)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_MEMORY_ARRAY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_CHAR_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR, UNITY_ARRAY_TO_ARRAY) + +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) (expected), (UNITY_INT_WIDTH / 8)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )(expected), 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT8, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16 )(expected), 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT16, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )(expected), 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT32, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT) (expected), (UNITY_INT_WIDTH / 8)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT8 )(expected), 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT8, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT16)(expected), 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT16, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT32)(expected), 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT32, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX8(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )(expected), 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX8, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX16(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT16 )(expected), 2), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX16, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX32(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT32 )(expected), 4), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX32, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_PTR(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_PTR_TO_INT) (expected), (UNITY_POINTER_WIDTH / 8)), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_POINTER, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_STRING(expected, actual, num_elements, line, message) UnityAssertEqualStringArray((UNITY_INTERNAL_PTR)(expected), (const char**)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_MEMORY(expected, actual, len, num_elements, line, message) UnityAssertEqualMemory((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(len), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_CHAR(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT8 )(expected), 1), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_CHAR, UNITY_ARRAY_TO_VAL) + +#ifdef UNITY_SUPPORT_64 +#define UNITY_TEST_ASSERT_EQUAL_INT64(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_EQUAL_UINT64(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_EQUAL_HEX64(expected, actual, line, message) UnityAssertEqualNumber((UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UnityAssertEqualIntArray((UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EACH_EQUAL_INT64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)(expected), 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_UINT64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_UINT64)(expected), 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_EACH_EQUAL_HEX64(expected, actual, num_elements, line, message) UnityAssertEqualIntArray(UnityNumToPtr((UNITY_INT)(UNITY_INT64)(expected), 8), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_INT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_UINT64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_HEX64_WITHIN(delta, expected, actual, line, message) UnityAssertNumbersWithin((delta), (UNITY_INT)(expected), (UNITY_INT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_NOT_EQUAL_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_NOT_EQUAL_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_NOT_EQUAL_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_NOT_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_GREATER_THAN_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_GREATER_THAN_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64(threshold, actual, line, message) UnityAssertGreaterOrLessOrEqualNumber((UNITY_INT)(threshold), (UNITY_INT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64) +#define UNITY_TEST_ASSERT_INT64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT64)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_INT64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_UINT64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT64)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_UINT64, UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_HEX64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertNumbersArrayWithin((UNITY_UINT64)(delta), (UNITY_INTERNAL_PTR)(expected), (UNITY_INTERNAL_PTR)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_DISPLAY_STYLE_HEX64, UNITY_ARRAY_TO_ARRAY) +#else +#define UNITY_TEST_ASSERT_EQUAL_INT64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_UINT64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_HEX64(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_INT64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_UINT64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_EQUAL_HEX64_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_INT64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_UINT64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_HEX64_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_THAN_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_THAN_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_THAN_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_THAN_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_INT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_UINT64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_SMALLER_OR_EQUAL_HEX64(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_INT64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_UINT64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#define UNITY_TEST_ASSERT_HEX64_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErr64) +#endif + +#ifdef UNITY_EXCLUDE_FLOAT +#define UNITY_TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_NOT_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_NOT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_GREATER_THAN_FLOAT(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_FLOAT(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_LESS_THAN_FLOAT(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_LESS_OR_EQUAL_FLOAT(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrFloat) +#else +#define UNITY_TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual, line, message) UnityAssertFloatsWithin((UNITY_FLOAT)(delta), (UNITY_FLOAT)(expected), (UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_FLOAT_NOT_WITHIN(delta, expected, actual, line, message) UnityAssertFloatsNotWithin((UNITY_FLOAT)(delta), (UNITY_FLOAT)(expected), (UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_ASSERT_FLOAT_WITHIN((UNITY_FLOAT)(expected) * (UNITY_FLOAT)UNITY_FLOAT_PRECISION, (UNITY_FLOAT)(expected), (UNITY_FLOAT)(actual), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_NOT_EQUAL_FLOAT(expected, actual, line, message) UNITY_TEST_ASSERT_FLOAT_NOT_WITHIN((UNITY_FLOAT)(expected) * (UNITY_FLOAT)UNITY_FLOAT_PRECISION, (UNITY_FLOAT)(expected), (UNITY_FLOAT)(actual), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_FLOAT_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertWithinFloatArray((UNITY_FLOAT)(delta), (const UNITY_FLOAT*)(expected), (const UNITY_FLOAT*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_FLOAT_ARRAY(expected, actual, num_elements, line, message) UnityAssertWithinFloatArray((UNITY_FLOAT)0, (const UNITY_FLOAT*)(expected), (const UNITY_FLOAT*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EACH_EQUAL_FLOAT(expected, actual, num_elements, line, message) UnityAssertWithinFloatArray((UNITY_FLOAT)0, UnityFloatToPtr(expected), (const UNITY_FLOAT*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_GREATER_THAN_FLOAT(threshold, actual, line, message) UnityAssertGreaterOrLessFloat((UNITY_FLOAT)(threshold), (UNITY_FLOAT)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_FLOAT(threshold, actual, line, message) UnityAssertGreaterOrLessFloat((UNITY_FLOAT)(threshold), (UNITY_FLOAT)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_LESS_THAN_FLOAT(threshold, actual, line, message) UnityAssertGreaterOrLessFloat((UNITY_FLOAT)(threshold), (UNITY_FLOAT)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_LESS_OR_EQUAL_FLOAT(threshold, actual, line, message) UnityAssertGreaterOrLessFloat((UNITY_FLOAT)(threshold), (UNITY_FLOAT)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_FLOAT_IS_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NEG_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NEG_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NAN(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN) +#define UNITY_TEST_ASSERT_FLOAT_IS_DETERMINATE(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_DET) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NEG_INF) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_NAN(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NAN) +#define UNITY_TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(actual, line, message) UnityAssertFloatSpecial((UNITY_FLOAT)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_DET) +#endif + +#ifdef UNITY_EXCLUDE_DOUBLE +#define UNITY_TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_NOT_WITHIN(delta, expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_NOT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE(expected, actual, num_elements, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_GREATER_THAN_DOUBLE(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_LESS_THAN_DOUBLE(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_LESS_OR_EQUAL_DOUBLE(threshold, actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual, line, message) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDouble) +#else +#define UNITY_TEST_ASSERT_DOUBLE_WITHIN(delta, expected, actual, line, message) UnityAssertDoublesWithin((UNITY_DOUBLE)(delta), (UNITY_DOUBLE)(expected), (UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_DOUBLE_NOT_WITHIN(delta, expected, actual, line, message) UnityAssertDoublesNotWithin((UNITY_DOUBLE)(delta), (UNITY_DOUBLE)(expected), (UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_ASSERT_DOUBLE_WITHIN((UNITY_DOUBLE)(expected) * (UNITY_DOUBLE)UNITY_DOUBLE_PRECISION, (UNITY_DOUBLE)(expected), (UNITY_DOUBLE)(actual), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_NOT_EQUAL_DOUBLE(expected, actual, line, message) UNITY_TEST_ASSERT_DOUBLE_NOT_WITHIN((UNITY_DOUBLE)(expected) * (UNITY_DOUBLE)UNITY_DOUBLE_PRECISION, (UNITY_DOUBLE)(expected), (UNITY_DOUBLE)(actual), (UNITY_LINE_TYPE)(line), (message)) +#define UNITY_TEST_ASSERT_DOUBLE_ARRAY_WITHIN(delta, expected, actual, num_elements, line, message) UnityAssertWithinDoubleArray((UNITY_DOUBLE)(delta), (const UNITY_DOUBLE*)(expected), (const UNITY_DOUBLE*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EQUAL_DOUBLE_ARRAY(expected, actual, num_elements, line, message) UnityAssertWithinDoubleArray((UNITY_DOUBLE)0, (const UNITY_DOUBLE*)(expected), (const UNITY_DOUBLE*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_ARRAY) +#define UNITY_TEST_ASSERT_EACH_EQUAL_DOUBLE(expected, actual, num_elements, line, message) UnityAssertWithinDoubleArray((UNITY_DOUBLE)0, UnityDoubleToPtr(expected), (const UNITY_DOUBLE*)(actual), (UNITY_UINT32)(num_elements), (message), (UNITY_LINE_TYPE)(line), UNITY_ARRAY_TO_VAL) +#define UNITY_TEST_ASSERT_GREATER_THAN_DOUBLE(threshold, actual, line, message) UnityAssertGreaterOrLessDouble((UNITY_DOUBLE)(threshold), (UNITY_DOUBLE)(actual), UNITY_GREATER_THAN, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_GREATER_OR_EQUAL_DOUBLE(threshold, actual, line, message) UnityAssertGreaterOrLessDouble((UNITY_DOUBLE)(threshold), (UNITY_DOUBLE)(actual), UNITY_GREATER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_LESS_THAN_DOUBLE(threshold, actual, line, message) UnityAssertGreaterOrLessDouble((UNITY_DOUBLE)(threshold), (UNITY_DOUBLE)(actual), UNITY_SMALLER_THAN, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_LESS_OR_EQUAL_DOUBLE(threshold, actual, line, message) UnityAssertGreaterOrLessDouble((UNITY_DOUBLE)(threshold), (UNITY_DOUBLE)(actual), UNITY_SMALLER_OR_EQUAL, (message), (UNITY_LINE_TYPE)(line)) +#define UNITY_TEST_ASSERT_DOUBLE_IS_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_INF) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NEG_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NEG_INF) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NAN(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NAN) +#define UNITY_TEST_ASSERT_DOUBLE_IS_DETERMINATE(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_DET) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_INF) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NEG_INF) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_NAN(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_NAN) +#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_DET) +#endif + +/* End of UNITY_INTERNALS_H */ +#endif diff --git a/TSM_PicoW_Sensor/README.md b/TSM_PicoW_Sensor/README.md new file mode 100644 index 0000000..5e85a69 --- /dev/null +++ b/TSM_PicoW_Sensor/README.md @@ -0,0 +1,32 @@ +# TSM_PicoW_Sensor +Project using the PicoW board with VS Code, implementing a sensor application. + +## Build +Project has `Debug`, `Release` and `Test` targets, using CMake Presets. + +Configure: +``` +cmake --list-presets +cmake --preset Debug +cmake --preset Release +cmake --preset Test +``` + +Build: +``` +cmake --build --list-presets +cmake --build --preset app-debug +cmake --build --preset app-release +cmake --build --preset app-test +``` + +Test: +``` +ctest --list-presets +ctest --test-dir build/Test -R Led_1 +``` + +Worflow: +``` +cmake --workflow --list-presets +``` diff --git a/TSM_PicoW_Sensor/doxy/.gitignore b/TSM_PicoW_Sensor/doxy/.gitignore new file mode 100644 index 0000000..0a15127 --- /dev/null +++ b/TSM_PicoW_Sensor/doxy/.gitignore @@ -0,0 +1,3 @@ +/html/ + + diff --git a/TSM_PicoW_Sensor/doxy/Doxyfile b/TSM_PicoW_Sensor/doxy/Doxyfile new file mode 100644 index 0000000..dd97812 --- /dev/null +++ b/TSM_PicoW_Sensor/doxy/Doxyfile @@ -0,0 +1,2892 @@ +# Doxyfile 1.9.8 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). +# +# Note: +# +# Use doxygen to compare the used configuration file with the template +# configuration file: +# doxygen -x [configFile] +# Use doxygen to compare the used configuration file with the template +# configuration file without replacing the environment variables or CMake type +# replacement variables: +# doxygen -x_noenv [configFile] + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the configuration +# file that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# https://www.gnu.org/software/libiconv/ for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "TSM PicoW Blinky" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = 1.0.0 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "Blinky project for the RP2040" + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = mse.png + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = ./ + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 +# sub-directories (in 2 levels) under the output directory of each output format +# and will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to +# control the number of sub-directories. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# Controls the number of sub-directories that will be created when +# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every +# level increment doubles the number of directories, resulting in 4096 +# directories at level 8 which is the default and also the maximum value. The +# sub-directories are organized in 2 levels, the first level always has a fixed +# number of 16 directories. +# Minimum value: 0, maximum value: 8, default value: 8. +# This tag requires that the tag CREATE_SUBDIRS is set to YES. + +CREATE_SUBDIRS_LEVEL = 8 + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, +# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English +# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, +# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with +# English messages), Korean, Korean-en (Korean with English messages), Latvian, +# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, +# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, +# Swedish, Turkish, Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = NO + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# By default Python docstrings are displayed as preformatted text and doxygen's +# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the +# doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as doxygen documentation. +# The default value is: YES. + +PYTHON_DOCSTRING = YES + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:^^" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice +# sources only. Doxygen will then generate output that is more tailored for that +# language. For instance, namespaces will be presented as modules, types will be +# separated into more groups, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_SLICE = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser +# tries to guess whether the code is fixed or free formatted code, this is the +# default for Fortran type files). For instance to make doxygen treat .inc files +# as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. When specifying no_extension you should add +# * to the FILE_PATTERNS. +# +# Note see also the list of default file extension mappings. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See https://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 5. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 5 + +# The MARKDOWN_ID_STYLE tag can be used to specify the algorithm used to +# generate identifiers for the Markdown headings. Note: Every identifier is +# unique. +# Possible values are: DOXYGEN use a fixed 'autotoc_md' string followed by a +# sequence number starting at 0 and GITHUB use the lower case version of title +# with any whitespace replaced by '-' and punctuation characters removed. +# The default value is: DOXYGEN. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +MARKDOWN_ID_STYLE = DOXYGEN + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use +# during processing. When set to 0 doxygen will based this on the number of +# cores available in the system. You can set it explicitly to a value larger +# than 0 to get more control over the balance between CPU load and processing +# speed. At this moment only the input processing can be done using multiple +# threads. Since this is still an experimental feature the default is set to 1, +# which effectively disables parallel processing. Please report any issues you +# encounter. Generating dot graphs in parallel is controlled by the +# DOT_NUM_THREADS setting. +# Minimum value: 0, maximum value: 32, default value: 1. + +NUM_PROC_THREADS = 1 + +# If the TIMESTAMP tag is set different from NO then each generated page will +# contain the date or date and time when the page was generated. Setting this to +# NO can help when comparing the output of multiple runs. +# Possible values are: YES, NO, DATETIME and DATE. +# The default value is: NO. + +TIMESTAMP = NO + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If this flag is set to YES, the name of an unnamed parameter in a declaration +# will be determined by the corresponding definition. By default unnamed +# parameters remain unnamed in the output. +# The default value is: YES. + +RESOLVE_UNNAMED_PARAMS = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# will also hide undocumented C++ concepts if enabled. This option has no effect +# if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# declarations. If set to NO, these declarations will be included in the +# documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# able to match the capabilities of the underlying filesystem. In case the +# filesystem is case sensitive (i.e. it supports files in the same directory +# whose names only differ in casing), the option must be set to YES to properly +# deal with such files in case they appear in the input. For filesystems that +# are not case sensitive the option should be set to NO to properly deal with +# output files written for symbols that only differ in casing, such as for two +# classes, one named CLASS and the other named Class, and to also support +# references to files without having to specify the exact matching casing. On +# Windows (including Cygwin) and MacOS, users should typically set this option +# to NO, whereas on Linux or other Unix flavors it should typically be set to +# YES. +# Possible values are: SYSTEM, NO and YES. +# The default value is: SYSTEM. + +CASE_SENSE_NAMES = SYSTEM + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = YES + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class +# will show which file needs to be included to use the class. +# The default value is: YES. + +SHOW_HEADERFILE = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. See also section "Changing the +# layout of pages" for information. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as documenting some parameters in +# a documented function twice, or documenting parameters that don't exist or +# using markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete +# function parameter documentation. If set to NO, doxygen will accept that some +# parameters have no documentation without warning. +# The default value is: YES. + +WARN_IF_INCOMPLETE_DOC = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong parameter +# documentation, but not about the absence of documentation. If EXTRACT_ALL is +# set to YES then this flag will automatically be disabled. See also +# WARN_IF_INCOMPLETE_DOC +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about +# undocumented enumeration values. If set to NO, doxygen will accept +# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: NO. + +WARN_IF_UNDOC_ENUM_VAL = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS +# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the doxygen process doxygen will return with a non-zero status. +# If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS_PRINT then doxygen behaves +# like FAIL_ON_WARNINGS but in case no WARN_LOGFILE is defined doxygen will not +# write the warning messages in between other messages but write them at the end +# of a run, in case a WARN_LOGFILE is defined the warning messages will be +# besides being in the defined file also be shown at the end of a run, unless +# the WARN_LOGFILE is defined as - i.e. standard output (stdout) in that case +# the behavior will remain as with the setting FAIL_ON_WARNINGS. +# Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# See also: WARN_LINE_FORMAT +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# In the $text part of the WARN_FORMAT command it is possible that a reference +# to a more specific place is given. To make it easier to jump to this place +# (outside of doxygen) the user can define a custom "cut" / "paste" string. +# Example: +# WARN_LINE_FORMAT = "'vi $file +$line'" +# See also: WARN_FORMAT +# The default value is: at line $line of file $file. + +WARN_LINE_FORMAT = "at line $line of file $file" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). In case the file specified cannot be opened for writing the +# warning and error messages are written to standard error. When as file - is +# specified the warning and error messages are written to standard output +# (stdout). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = .. \ + ../src \ + ../McuLib/src \ + ../McuLib/config \ + ../McuLib/fonts \ + ../McuLib/rdimon \ + ../McuLib/FreeRTOS \ + ../McuLib/FreeRTOS/Source \ + ../McuLib/FreeRTOS/Source/include \ + ../McuLib/FreeRTOS/Source/portable/MemMang \ + ../McuLib/FreeRTOS/Source/portable/GCC/ARM_CM4F \ + ../McuLib/SEGGER_RTT \ + ../McuLib/SEGGER_SysView \ + ../McuLib/minIni \ + ../McuLib/RNet \ + ../McuLib/TraceRecorder \ + ../McuLib/Modbus \ + ../McuLib/littleFS \ + ../McuLib/FatFS \ + ../McuLib/FatFS/source \ + ../McuLib/HDD44780 \ + ../McuLib/LittlevGL/lvgl \ + ../McuLib/LittlevGL/lvgl/src/core \ + ../McuLib/LittlevGL/lvgl/src/draw \ + ../McuLib/LittlevGL/lvgl/src/draw/sdl \ + ../McuLib/LittlevGL/lvgl/src/draw/sw \ + ../McuLib/LittlevGL/lvgl/src/extra \ + ../McuLib/LittlevGL/lvgl/src/font \ + ../McuLib/LittlevGL/lvgl/src/hal \ + ../McuLib/LittlevGL/lvgl/src/misc \ + ../McuLib/LittlevGL/lvgl/src/widgets + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: +# https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# See also: INPUT_FILE_ENCODING +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify +# character encoding on a per file pattern basis. Doxygen will compare the file +# name with each pattern and apply the encoding instead of the default +# INPUT_ENCODING) if there is a match. The character encodings are a list of the +# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding +# "INPUT_ENCODING" for further information on supported encodings. + +INPUT_FILE_ENCODING = + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# Note the list of default checked file patterns might differ from the list of +# default file extension mappings. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm, +# *.cpp, *.cppm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, +# *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.ixx, *.l, *.cs, *.d, *.php, +# *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be +# provided as doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cxxm \ + *.cpp \ + *.cppm \ + *.c++ \ + *.c++m \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.idl \ + *.ddl \ + *.odl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.ixx \ + *.l \ + *.cs \ + *.d \ + *.php \ + *.php4 \ + *.php5 \ + *.phtml \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.pyw \ + *.f90 \ + *.f95 \ + *.f03 \ + *.f08 \ + *.f18 \ + *.f \ + *.for \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf \ + *.ice + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# ANamespace::AClass, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that doxygen will use the data processed and written to standard output +# for further processing, therefore nothing else, like debug statements or used +# commands (so in case of a Windows batch file always use @echo OFF), should be +# written to standard output. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = README.md + +# The Fortran standard specifies that for fixed formatted Fortran code all +# characters from position 72 are to be considered as comment. A common +# extension is to allow longer lines before the automatic comment starts. The +# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can +# be processed before the automatic comment starts. +# Minimum value: 7, maximum value: 10000, default value: 72. + +FORTRAN_COMMENT_AFTER = 72 + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# entity all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see https://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: +# http://clang.llvm.org/) for more accurate parsing at the cost of reduced +# performance. This can be particularly helpful with template rich C++ code for +# which doxygen's built-in parser lacks the necessary type information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS +# tag is set to YES then doxygen will add the directory of each input to the +# include path. +# The default value is: YES. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_ADD_INC_PATHS = YES + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +# If clang assisted parsing is enabled you can provide the clang parser with the +# path to the directory containing a file called compile_commands.json. This +# file is the compilation database (see: +# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the +# options used when the source files were built. This is equivalent to +# specifying the -p option to a clang tool, such as clang-check. These options +# will then be passed to the parser. Any options specified with CLANG_OPTIONS +# will be added as well. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. + +CLANG_DATABASE_PATH = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) +# that should be ignored while generating the index headers. The IGNORE_PREFIX +# tag works for classes, function and member names. The entity will be placed in +# the alphabetical list under the first letter of the entity name that remains +# after removing the prefix. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). +# Note: Since the styling of scrollbars can currently not be overruled in +# Webkit/Chromium, the styling will be left out of the default doxygen.css if +# one or more extra stylesheets have been specified. So if scrollbar +# customization is desired it has to be added explicitly. For an example see the +# documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output +# should be rendered with a dark or light theme. +# Possible values are: LIGHT always generate light mode output, DARK always +# generate dark mode output, AUTO_LIGHT automatically set the mode according to +# the user preference, use light mode if no preference is set (the default), +# AUTO_DARK automatically set the mode according to the user preference, use +# dark mode if no preference is set and TOGGLE allow to user to switch between +# light and dark mode via a button. +# The default value is: AUTO_LIGHT. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE = AUTO_LIGHT + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a color-wheel, see +# https://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use gray-scales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via JavaScript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have JavaScript, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# If the HTML_CODE_FOLDING tag is set to YES then classes and functions can be +# dynamically folded and expanded in the generated HTML source code. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_CODE_FOLDING = YES + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: +# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To +# create a documentation set, doxygen will generate a Makefile in the HTML +# output directory. Running make will produce the docset in that directory and +# running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy +# genXcode/_index.html for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag determines the URL of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDURL = + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# on Windows. In the beginning of 2021 Microsoft took the original page, with +# a.o. the download links, offline the HTML help workshop was already many years +# in maintenance mode). You can download the HTML help workshop from the web +# archives at Installation executable (see: +# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo +# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the main .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# The SITEMAP_URL tag is used to specify the full URL of the place where the +# generated documentation will be placed on the server by the user during the +# deployment of the documentation. The generated sitemap is called sitemap.xml +# and placed on the directory specified by HTML_OUTPUT. In case no SITEMAP_URL +# is specified no sitemap is generated. For information about the sitemap +# protocol see https://www.sitemaps.org +# This tag requires that the tag GENERATE_HTML is set to YES. + +SITEMAP_URL = + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location (absolute path +# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# run qhelpgenerator on the generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine tune the look of the index (see "Fine-tuning the output"). As an +# example, the default style sheet generated by doxygen has an example that +# shows how to put an image at the root of the tree instead of the PROJECT_NAME. +# Since the tree basically has the same information as the tab index, you could +# consider setting DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the +# FULL_SIDEBAR option determines if the side bar is limited to only the treeview +# area (value NO) or if it should extend to the full height of the window (value +# YES). Setting this to YES gives a layout similar to +# https://docs.readthedocs.io with more room for contents, but less room for the +# project logo, title, and description. If either GENERATE_TREEVIEW or +# DISABLE_INDEX is set to NO, this option has no effect. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FULL_SIDEBAR = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email +# addresses. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +OBFUSCATE_EMAILS = YES + +# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png (the default) and svg (looks nicer but requires the +# pdf2svg or inkscape tool). +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = png + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. + +FORMULA_MACROFILE = + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# https://www.mathjax.org) which uses client side JavaScript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. +# Note that the different versions of MathJax have different requirements with +# regards to the different settings, so it is possible that also other MathJax +# settings have to be changed when switching between the different MathJax +# versions. +# Possible values are: MathJax_2 and MathJax_3. +# The default value is: MathJax_2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_VERSION = MathJax_2 + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. For more details about the output format see MathJax +# version 2 (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 +# (see: +# http://docs.mathjax.org/en/latest/web/components/output.html). +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility. This is the name for Mathjax version 2, for MathJax version 3 +# this will be translated into chtml), NativeMML (i.e. MathML. Only supported +# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This +# is the name for Mathjax version 3, for MathJax version 2 this will be +# translated into HTML-CSS) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from https://www.mathjax.org before deployment. The default value is: +# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 +# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# for MathJax version 2 (see +# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# For example for MathJax version 3 (see +# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): +# MATHJAX_EXTENSIONS = ams +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /